ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDdlOTkzMmUuLjQyZmEwZDUgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtOTIsMyArOTIsNiBAQAogc2lnbmluZ19rZXkucHJpdgogc2lnbmluZ19rZXkueDUwOQogeDUwOS5nZW5rZXkKKworIyBLY29uZmlnIHByZXNldHMKK2FsbC5jb25maWcKZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDRjNzczOGYuLmUzNzFjNTUgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtODIzLDggKzgyMyw4IEBACiBTOiBHZXJtYW55CiAKIE46IEplYW4gRGVsdmFyZQotRToga2hhbGlAbGludXgtZnIub3JnCi1XOiBodHRwOi8va2hhbGkubGludXgtZnIub3JnLworRTogamRlbHZhcmVAc3VzZS5kZQorVzogaHR0cDovL2pkZWx2YXJlLm5lcmltLm5ldC8KIEQ6IFNldmVyYWwgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXJzCiBTOiBGcmFuY2UKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggMzhmODQ0NC4uMDdkZTdlMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0yOSw2ICsyOSw4IEBACiAJLSBIb3cgdG8gZG8gRE1BIHdpdGggSVNBIChhbmQgTFBDKSBkZXZpY2VzLgogRE1BLWF0dHJpYnV0ZXMudHh0CiAJLSBsaXN0aW5nIG9mIHRoZSB2YXJpb3VzIHBvc3NpYmxlIGF0dHJpYnV0ZXMgYSBETUEgcmVnaW9uIGNhbiBoYXZlCitkbWF0ZXN0LnR4dAorCS0gaG93IHRvIGNvbXBpbGUsIGNvbmZpZ3VyZSBhbmQgdXNlIHRoZSBkbWF0ZXN0IHN5c3RlbS4KIERvY0Jvb2svCiAJLSBkaXJlY3Rvcnkgd2l0aCBEb2NCb29rIHRlbXBsYXRlcyBldGMuIGZvciBrZXJuZWwgZG9jdW1lbnRhdGlvbi4KIEVESUQvCkBAIC03Nyw2ICs3OSw4IEBACiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIHRoZSBBUk0gYXJjaGl0ZWN0dXJlLgogYXJtNjQvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIHRoZSA2NCBiaXQgQVJNIGFyY2hpdGVjdHVyZS4KK2Fzc29jX2FycmF5LnR4dAorCS0gZ2VuZXJpYyBhc3NvY2lhdGl2ZSBhcnJheSBpbnRyby4KIGF0b21pY19vcHMudHh0CiAJLSBzZW1hbnRpY3MgYW5kIGJlaGF2aW9yIG9mIGF0b21pYyBhbmQgYml0bWFzayBvcGVyYXRpb25zLgogYXV4ZGlzcGxheS8KQEAgLTg3LDYgKzkxLDggQEAKIAktIGhvdyB0byB1c2Uga2VybmVsIHBhcmFtZXRlcnMgdG8gZXhjbHVkZSBiYWQgUkFNIHJlZ2lvbnMuCiBiYXNpY19wcm9maWxpbmcudHh0CiAJLSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIHdobyB3YW50cyB0byBwcm9maWxlIExpbnV4IGtlcm5lbC4KK2JjYWNoZS50eHQKKwktIEJsb2NrLWxheWVyIGNhY2hlIG9uIGZhc3QgU1NEcyB0byBpbXByb3ZlIHNsb3cgKHJhaWQpIEkvTyBwZXJmb3JtYW5jZS4KIGJpbmZtdF9taXNjLnR4dAogCS0gaW5mbyBvbiB0aGUga2VybmVsIHN1cHBvcnQgZm9yIGV4dHJhIGJpbmFyeSBmb3JtYXRzLgogYmxhY2tmaW4vCkBAIC0xNzEsNiArMTc3LDggQEAKIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KIGVkYWMudHh0CiAJLSBpbmZvcm1hdGlvbiBvbiBFREFDIC0gRXJyb3IgRGV0ZWN0aW9uIEFuZCBDb3JyZWN0aW9uCitlZmktc3R1Yi50eHQKKwktIEhvdyB0byB1c2UgdGhlIEVGSSBib290IHN0dWIgdG8gYnlwYXNzIEdSVUIgb3IgZWxpbG8gb24gRUZJIHN5c3RlbXMuCiBlaXNhLnR4dAogCS0gaW5mbyBvbiBFSVNBIGJ1cyBzdXBwb3J0LgogZW1haWwtY2xpZW50cy50eHQKQEAgLTE5NSw4ICsyMDMsOCBAQAogCS0gaW5mbyBvbiByZXF1ZXVlaW5nIG9mIHRhc2tzIGZyb20gYSBub24tUEkgZnV0ZXggdG8gYSBQSSBmdXRleAogZ2Nvdi50eHQKIAktIHVzZSBvZiBHQ0MncyBjb3ZlcmFnZSB0ZXN0aW5nIHRvb2wgImdjb3YiIHdpdGggdGhlIExpbnV4IGtlcm5lbAotZ3Bpby50eHQKLQktIG92ZXJ2aWV3IG9mIEdQSU8gKEdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQpIGFjY2VzcyBjb252ZW50aW9ucy4KK2dwaW8vCisJLSBncGlvIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbgogaGlkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mb3JtYXRpb24gb24gaHVtYW4gaW50ZXJmYWNlIGRldmljZXMKIGhpZ2h1aWQudHh0CkBAIC0yNTUsNiArMjYzLDggQEAKIAktIGxpc3Rpbmcgb2YgdmFyaW91cyBXV1cgKyBib29rcyB0aGF0IGRvY3VtZW50IGtlcm5lbCBpbnRlcm5hbHMuCiBrZXJuZWwtcGFyYW1ldGVycy50eHQKIAktIHN1bW1hcnkgbGlzdGluZyBvZiBjb21tYW5kIGxpbmUgLyBib290IHByb21wdCBhcmdzIGZvciB0aGUga2VybmVsLgora2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CisJLSBMaXN0IG9mIGFsbCBwZXItQ1BVIGt0aHJlYWRzIGFuZCBob3cgdGhleSBpbnRyb2R1Y2Ugaml0dGVyLgoga21lbWNoZWNrLnR4dAogCS0gaW5mbyBvbiBkeW5hbWljIGNoZWNrZXIgdGhhdCBkZXRlY3RzIHVzZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuCiBrbWVtbGVhay50eHQKQEAgLTI5OSw4ICszMDksNiBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBwYXJ0cyBsaWtlIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBFTUlGIGRyaXZlcgogbWVtb3J5LWhvdHBsdWcudHh0CiAJLSBIb3RwbHVnZ2FibGUgbWVtb3J5IHN1cHBvcnQsIGhvdyB0byB1c2UgYW5kIGN1cnJlbnQgc3RhdHVzLgotbWVtb3J5LnR4dAotCS0gaW5mbyBvbiB0eXBpY2FsIExpbnV4IG1lbW9yeSBwcm9ibGVtcy4KIG1ldGFnLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBNZXRhIGFyY2hpdGVjdHVyZS4KIG1pcHMvCkBAIC0zMTEsNiArMzE5LDggQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gYWJvdXQgdGhlIE1NQyBzdWJzeXN0ZW0KIG1uMTAzMDAvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IHRoZSBtbjEwMzAwIGFyY2hpdGVjdHVyZSBwb3J0Cittb2R1bGUtc2lnbmluZy50eHQKKwktIEtlcm5lbCBtb2R1bGUgc2lnbmluZyBmb3IgaW5jcmVhc2VkIHNlY3VyaXR5IHdoZW4gbG9hZGluZyBtb2R1bGVzLgogbXRkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBtZW1vcnkgdGVjaG5vbG9neSBkZXZpY2VzIChmbGFzaCkKIG1vbm8udHh0CkBAIC0zNDMsNiArMzUzLDggQEAKIAktIGluZm8gb24gdGhlIExpbnV4IFBDTUNJQSBkcml2ZXIuCiBwZXJjcHUtcnctc2VtYXBob3JlLnR4dAogCS0gUkNVIGJhc2VkIHJlYWQtd3JpdGUgc2VtYXBob3JlIG9wdGltaXplZCBmb3IgbG9ja2luZyBmb3IgcmVhZGluZworcGh5LnR4dAorCS0gRGVzY3JpcHRpb24gb2YgdGhlIGdlbmVyaWMgUEhZIGZyYW1ld29yay4KIHBpLWZ1dGV4LnR4dAogCS0gZG9jdW1lbnRhdGlvbiBvbiBsaWdodHdlaWdodCBwcmlvcml0eSBpbmhlcml0YW5jZSBmdXRleGVzLgogcGluY3RybC50eHQKQEAgLTQzMSw2ICs0NDMsOCBAQAogCS0gaW5mbyBvbiB0aGUgbWFnaWMgU3lzUnEga2V5LgogdGFyZ2V0LwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBnZW5lcmF0aW5nIFRDTSB2NCBmYWJyaWMgLmtvIG1vZHVsZXMKK3RoaXNfY3B1X29wcy50eHQKKwktIExpc3QgcmF0aW9uYWxlIGJlaGluZCBhbmQgdGhlIHdheSB0byB1c2UgdGhpc19jcHUgb3BlcmF0aW9ucy4KIHRoZXJtYWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvcm1hdGlvbiBvbiBtYW5hZ2luZyB0aGVybWFsIGlzc3VlcyAoQ1BVL3RlbXApCiB0cmFjZS8KQEAgLTQ2OSw2ICs0ODMsOCBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBJbnRlbCBXaXJlbGVzcyBXaW1heCBDb25uZWN0aW9ucwogd29ya3F1ZXVlLnR4dAogCS0gaW5mb3JtYXRpb24gb24gdGhlIENvbmN1cnJlbmN5IE1hbmFnZWQgV29ya3F1ZXVlIGltcGxlbWVudGF0aW9uCit3dy1tdXRleC1kZXNpZ24udHh0CisJLSBJbnRybyB0byBNdXRleCB3YWl0L3dvdWxkIGRlYWRsb2NrIGhhbmRsaW5nLnMKIHg4Ni94ODZfNjQvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIExpbnV4IHN1cHBvcnQgZm9yIEFNRCB4ODYtNjQgKEhhbW1lcikgbWFjaGluZXMuCiB4dGVuc2EvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQKaW5kZXggMDFlNzY5ZC4uMzc1NTlhMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldApAQCAtMSwxMyArMSwxMyBAQAogV2hhdDoJCS9jb25maWcvdXNiLWdhZGdldAogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCQlUaGlzIGdyb3VwIGNvbnRhaW5zIHN1Yi1ncm91cHMgY29ycmVzcG9uZGluZyB0byBjcmVhdGVkCiAJCVVTQiBnYWRnZXRzLgogCiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldAogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCiAJCVRoZSBhdHRyaWJ1dGVzIG9mIGEgZ2FkZ2V0OgpAQCAtMjcsNyArMjcsNyBAQAogCiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9jb25maWdzCiBEYXRlOgkJSnVuIDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMQorS2VybmVsVmVyc2lvbjoJMy4xMQogRGVzY3JpcHRpb246CiAJCVRoaXMgZ3JvdXAgY29udGFpbnMgYSBVU0IgZ2FkZ2V0J3MgY29uZmlndXJhdGlvbnMKIApAQCAtNTgsMjAgKzU4LDIwIEBACiAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucwogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCQlUaGlzIGdyb3VwIGNvbnRhaW5zIGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gdGhpcyBVU0IgZ2FkZ2V0LgogCiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9zdHJpbmdzCiBEYXRlOgkJSnVuIDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMQorS2VybmVsVmVyc2lvbjoJMy4xMQogRGVzY3JpcHRpb246CiAJCVRoaXMgZ3JvdXAgY29udGFpbnMgc3ViZGlyZWN0b3JpZXMgZm9yIGxhbmd1YWdlLXNwZWNpZmljCiAJCXN0cmluZ3MgZm9yIHRoaXMgZ2FkZ2V0LgogCiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9zdHJpbmdzL2xhbmd1YWdlCiBEYXRlOgkJSnVuIDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMQorS2VybmVsVmVyc2lvbjoJMy4xMQogRGVzY3JpcHRpb246CiAJCVRoZSBhdHRyaWJ1dGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtYWNtIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWFjbQppbmRleCA1NzA4YTU2Li5kMjEwOTJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtYWNtCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1hY20KQEAgLTEsNiArMSw2IEBACiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9mdW5jdGlvbnMvYWNtLm5hbWUKIERhdGU6CQlKdW4gMjAxMwotS2VuZWxWZXJzaW9uOgkzLjExCitLZXJuZWxWZXJzaW9uOgkzLjExCiBEZXNjcmlwdGlvbjoKIAogCQlUaGlzIGl0ZW0gY29udGFpbnMganVzdCBvbmUgcmVhZG9ubHkgYXR0cmlidXRlOiBwb3J0X251bS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1lY20gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtZWNtCmluZGV4IDZiOWE1ODIuLjBhZGRmNzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1lY20KKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWVjbQpAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9lY20ubmFtZQogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCQlUaGUgYXR0cmlidXRlczoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWVlbSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1lZW0KaW5kZXggZGJkZGYzNi4uYTRjNTcxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWVlbQorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtZWVtCkBAIC0xLDYgKzEsNiBAQAogV2hhdDoJCS9jb25maWcvdXNiLWdhZGdldC9nYWRnZXQvZnVuY3Rpb25zL2VlbS5uYW1lCiBEYXRlOgkJSnVuIDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMQorS2VybmVsVmVyc2lvbjoJMy4xMQogRGVzY3JpcHRpb246CiAJCVRoZSBhdHRyaWJ1dGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtZmZzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWZmcwppbmRleCAxNDM0M2UyLi5lMzliMjc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtZmZzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1mZnMKQEAgLTEsNiArMSw2IEBACiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9mdW5jdGlvbnMvZmZzLm5hbWUKIERhdGU6CQlOb3YgMjAxMwotS2VuZWxWZXJzaW9uOgkzLjEzCitLZXJuZWxWZXJzaW9uOgkzLjEzCiBEZXNjcmlwdGlvbjoJVGhlIHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RvcnkgaXMgdG8gY3JlYXRlIGFuZCByZW1vdmUgaXQuCiAKIAkJQSBjb3JyZXNwb25kaW5nIFVTQiBmdW5jdGlvbiBpbnN0YW5jZSBpcyBjcmVhdGVkL3JlbW92ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtbG9vcGJhY2sgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtbG9vcGJhY2sKaW5kZXggODUyYjIzNi4uOWFhZTViZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LWxvb3BiYWNrCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1sb29wYmFjawpAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9Mb29wYmFjay5uYW1lCiBEYXRlOgkJTm92IDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMworS2VybmVsVmVyc2lvbjoJMy4xMwogRGVzY3JpcHRpb246CiAJCVRoZSBhdHRyaWJ1dGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtbWFzcy1zdG9yYWdlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LW1hc3Mtc3RvcmFnZQppbmRleCBhZDcyYTM3Li45OTMxZmIwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtbWFzcy1zdG9yYWdlCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1tYXNzLXN0b3JhZ2UKQEAgLTEsNiArMSw2IEBACiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9mdW5jdGlvbnMvbWFzc19zdG9yYWdlLm5hbWUKIERhdGU6CQlPY3QgMjAxMwotS2VuZWxWZXJzaW9uOgkzLjEzCitLZXJuZWxWZXJzaW9uOgkzLjEzCiBEZXNjcmlwdGlvbjoKIAkJVGhlIGF0dHJpYnV0ZXM6CiAKQEAgLTEzLDcgKzEzLDcgQEAKIAogV2hhdDoJCS9jb25maWcvdXNiLWdhZGdldC9nYWRnZXQvZnVuY3Rpb25zL21hc3Nfc3RvcmFnZS5uYW1lL2x1bi5uYW1lCiBEYXRlOgkJT2N0IDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMworS2VybmVsVmVyc2lvbjoJMy4xMwogRGVzY3JpcHRpb246CiAJCVRoZSBhdHRyaWJ1dGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtbmNtIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LW5jbQppbmRleCBiYzMwOWY0MjMuLjZmZTcyM2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1uY20KKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LW5jbQpAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9uY20ubmFtZQogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCQlUaGUgYXR0cmlidXRlczoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LW9iZXggYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtb2JleAppbmRleCBhYWE1Yzk2Li5hNmE5MzI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtb2JleAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtb2JleApAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9vYmV4Lm5hbWUKIERhdGU6CQlKdW4gMjAxMwotS2VuZWxWZXJzaW9uOgkzLjExCitLZXJuZWxWZXJzaW9uOgkzLjExCiBEZXNjcmlwdGlvbjoKIAogCQlUaGlzIGl0ZW0gY29udGFpbnMganVzdCBvbmUgcmVhZG9ubHkgYXR0cmlidXRlOiBwb3J0X251bS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1waG9uZXQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtcGhvbmV0CmluZGV4IDNlM2I3NDIuLjcwMzdhMzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1waG9uZXQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXBob25ldApAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9waG9uZXQubmFtZQogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCiAJCVRoaXMgaXRlbSBjb250YWlucyBqdXN0IG9uZSByZWFkb25seSBhdHRyaWJ1dGU6IGlmbmFtZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1ybmRpcyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1ybmRpcwppbmRleCA4MjJlNmRhLi5lMzI4NzliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtcm5kaXMKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXJuZGlzCkBAIC0xLDYgKzEsNiBAQAogV2hhdDoJCS9jb25maWcvdXNiLWdhZGdldC9nYWRnZXQvZnVuY3Rpb25zL3JuZGlzLm5hbWUKIERhdGU6CQlKdW4gMjAxMwotS2VuZWxWZXJzaW9uOgkzLjExCitLZXJuZWxWZXJzaW9uOgkzLjExCiBEZXNjcmlwdGlvbjoKIAkJVGhlIGF0dHJpYnV0ZXM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1zZXJpYWwgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtc2VyaWFsCmluZGV4IDE2ZjEzMGMuLjQ3NGQyNDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1zZXJpYWwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXNlcmlhbApAQCAtMSw2ICsxLDYgQEAKIFdoYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9nc2VyLm5hbWUKIERhdGU6CQlKdW4gMjAxMwotS2VuZWxWZXJzaW9uOgkzLjExCitLZXJuZWxWZXJzaW9uOgkzLjExCiBEZXNjcmlwdGlvbjoKIAogCQlUaGlzIGl0ZW0gY29udGFpbnMganVzdCBvbmUgcmVhZG9ubHkgYXR0cmlidXRlOiBwb3J0X251bS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1zb3VyY2VzaW5rIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXNvdXJjZXNpbmsKaW5kZXggYTMwZjMwOS4uMjk0NzdjMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXNvdXJjZXNpbmsKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXNvdXJjZXNpbmsKQEAgLTEsNiArMSw2IEBACiBXaGF0OgkJL2NvbmZpZy91c2ItZ2FkZ2V0L2dhZGdldC9mdW5jdGlvbnMvU291cmNlU2luay5uYW1lCiBEYXRlOgkJTm92IDIwMTMKLUtlbmVsVmVyc2lvbjoJMy4xMworS2VybmVsVmVyc2lvbjoJMy4xMwogRGVzY3JpcHRpb246CiAJCVRoZSBhdHRyaWJ1dGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtc3Vic2V0IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXN1YnNldAppbmRleCAxNTRhZTU5Li45MzczZTJjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9jb25maWdmcy11c2ItZ2FkZ2V0LXN1YnNldAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtc3Vic2V0CkBAIC0xLDYgKzEsNiBAQAogV2hhdDoJCS9jb25maWcvdXNiLWdhZGdldC9nYWRnZXQvZnVuY3Rpb25zL2dldGgubmFtZQogRGF0ZToJCUp1biAyMDEzCi1LZW5lbFZlcnNpb246CTMuMTEKK0tlcm5lbFZlcnNpb246CTMuMTEKIERlc2NyaXB0aW9uOgogCQlUaGUgYXR0cmlidXRlczoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCmluZGV4IDBjNzE5NWUuLmM0Y2FjNmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbXBhdC54bWwKQEAgLTI1MjMsNiArMjUyMywxOCBAQAogICAgICAgPC9vcmRlcmVkbGlzdD4KICAgICA8L3NlY3Rpb24+CiAKKyAgICA8c2VjdGlvbj4KKyAgICAgIDx0aXRsZT5WNEwyIGluIExpbnV4IDMuMTQ8L3RpdGxlPgorICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPiBJbiBzdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9yZWN0PC9zdHJ1Y3RuYW1lPiwgdGhlIHR5cGUKK29mIDxzdHJ1Y3RmaWVsZD53aWR0aDwvc3RydWN0ZmllbGQ+IGFuZCA8c3RydWN0ZmllbGQ+aGVpZ2h0PC9zdHJ1Y3RmaWVsZD4KK2ZpZWxkcyBjaGFuZ2VkIGZyb20gX3MzMiB0byBfdTMyLgorCSAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICA8L3NlY3Rpb24+CisKICAgICA8c2VjdGlvbiBpZD0ib3RoZXIiPgogICAgICAgPHRpdGxlPlJlbGF0aW9uIG9mIFY0TDIgdG8gb3RoZXIgTGludXggbXVsdGltZWRpYSBBUElzPC90aXRsZT4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb250cm9scy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbnRyb2xzLnhtbAppbmRleCA3YTNiNDliLi5hNWEzMTg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbnRyb2xzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbnRyb2xzLnhtbApAQCAtMzE2MSw2ICszMTYxLDQ3IEBACiAJCTwvZW50cnl0Ymw+CiAJICAgICAgPC9yb3c+CiAKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9NSU5fUVA8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1pbmltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgVlA4LjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9NQVhfUVA8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1heGltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgVlA4LjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9JX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBJIGZyYW1lIGZvciBWUDguPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGEgUCBmcmFtZSBmb3IgVlA4LjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9QUk9GSUxFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5TZWxlY3QgdGhlIGRlc2lyZWQgcHJvZmlsZSBmb3IgVlB4IGVuY29kZXIuCitBY2NlcHRhYmxlIHZhbHVlcyBhcmUgMCwgMSwgMiBhbmQgMyBjb3JyZXNwb25kaW5nIHRvIGVuY29kZXIgcHJvZmlsZXMgMCwgMSwgMiBhbmQgMy48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCiAgICAgICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KICAgICAgICAgPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3ZlcmxheS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1vdmVybGF5LnhtbAppbmRleCA0MGQxZDc2Li5jYzZlMGM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1vdmVybGF5LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1vdmVybGF5LnhtbApAQCAtMzQ2LDE3ICszNDYsMTQgQEAKIHJlY3RhbmdsZSwgaW4gcGl4ZWxzLiBPZmZzZXRzIGluY3JlYXNlIHRvIHRoZSByaWdodCBhbmQgZG93bi48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgogCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPndpZHRoPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgogCSAgICA8ZW50cnk+V2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gcGl4ZWxzLjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CiAJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+aGVpZ2h0PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+SGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy4gV2lkdGggYW5kCi1oZWlnaHQgY2Fubm90IGJlIG5lZ2F0aXZlLCB0aGUgZmllbGRzIGFyZSBzaWduZWQgZm9yIGh5c3RlcmljYWwKLXJlYXNvbnMuIDwhLS0gdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tIG9uIDIyIE9jdCAyMDAyIHN1YmplY3QKLSJSZTpbVjRMXVtwYXRjaGVzIV0gUmU6djRsMi9rZXJuZWwtMi41IiAtLT48L2VudHJ5PgorCSAgICA8ZW50cnk+SGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy48L2VudHJ5PgogCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbAppbmRleCAzNTVkZjQzLi5jZjg1NDg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbApAQCAtMTM0LDYgKzEzNCwxNSBAQAogCSAgICA8ZW50cnk+T3V0cHV0IHBhZCwgcmVsYXRpdmUgdG8gdGhlIGVudGl0eS4gT3V0cHV0IHBhZHMgc291cmNlIGRhdGEKIAkgICAgYW5kIGFyZSBvcmlnaW5zIG9mIGxpbmtzLjwvZW50cnk+CiAJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+TUVESUFfUEFEX0ZMX01VU1RfQ09OTkVDVDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PklmIHRoaXMgZmxhZyBpcyBzZXQgYW5kIHRoZSBwYWQgaXMgbGlua2VkIHRvIGFueSBvdGhlcgorCSAgICBwYWQsIHRoZW4gYXQgbGVhc3Qgb25lIG9mIHRob3NlIGxpbmtzIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhlCisJICAgIGVudGl0eSB0byBiZSBhYmxlIHRvIHN0cmVhbS4gVGhlcmUgY291bGQgYmUgdGVtcG9yYXJ5IHJlYXNvbnMKKwkgICAgKGUuZy4gZGV2aWNlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW50KSBmb3IgdGhlIHBhZCB0byBuZWVkCisJICAgIGVuYWJsZWQgbGlua3MgZXZlbiB3aGVuIHRoaXMgZmxhZyBpc24ndCBzZXQ7IHRoZSBhYnNlbmNlIG9mIHRoZQorCSAgICBmbGFnIGRvZXNuJ3QgaW1wbHkgdGhlcmUgaXMgbm9uZS48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3N1YmRldi1mb3JtYXRzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvc3ViZGV2LWZvcm1hdHMueG1sCmluZGV4IGY3MmMxY2MuLjczMzFjZTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvc3ViZGV2LWZvcm1hdHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvc3ViZGV2LWZvcm1hdHMueG1sCkBAIC04OSw3ICs4OSw3IEBACiAgICAgICA8Y29uc3RhbnQ+VjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0JFPC9jb25zdGFudD4uCiAgICAgICA8L3BhcmE+CiAKLSAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgdGFibGVzIGxpc3QgZXhpc3RpbmcgcGFja2V0IFJHQiBmb3JtYXRzLjwvcGFyYT4KKyAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgdGFibGVzIGxpc3QgZXhpc3RpbmcgcGFja2VkIFJHQiBmb3JtYXRzLjwvcGFyYT4KIAogICAgICAgPHRhYmxlIHBnd2lkZT0iMCIgZnJhbWU9Im5vbmUiIGlkPSJ2NGwyLW1idXMtcGl4ZWxjb2RlLXJnYiI+CiAJPHRpdGxlPlJHQiBmb3JtYXRzPC90aXRsZT4KQEAgLTYxNSw3ICs2MTUsNyBAQAogCTwvbWVkaWFvYmplY3Q+CiAgICAgICA8L2ZpZ3VyZT4KIAotICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBleGlzdGluZyBwYWNrZXQgQmF5ZXIgZm9ybWF0cy4gVGhlIGRhdGEKKyAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgZXhpc3RpbmcgcGFja2VkIEJheWVyIGZvcm1hdHMuIFRoZSBkYXRhCiAgICAgICBvcmdhbml6YXRpb24gaXMgZ2l2ZW4gYXMgYW4gZXhhbXBsZSBmb3IgdGhlIGZpcnN0IHBpeGVsIG9ubHkuPC9wYXJhPgogCiAgICAgICA8dGFibGUgcGd3aWRlPSIwIiBmcmFtZT0ibm9uZSIgaWQ9InY0bDItbWJ1cy1waXhlbGNvZGUtYmF5ZXIiPgpAQCAtMTE3OCw3ICsxMTc4LDcgQEAKICAgICAgIFUsIFksIFYsIFkgb3JkZXIgd2lsbCBiZSBuYW1lZCA8Y29uc3RhbnQ+VjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg8L2NvbnN0YW50Pi4KICAgICAgIDwvcGFyYT4KIAotCTxwYXJhPjx4cmVmIGxpbmtlbmQ9InY0bDItbWJ1cy1waXhlbGNvZGUteXV2OCIvPiBsaXN0IGV4aXN0aW5nIHBhY2tldCBZVVYKKwk8cGFyYT48eHJlZiBsaW5rZW5kPSJ2NGwyLW1idXMtcGl4ZWxjb2RlLXl1djgiLz4gbGlzdHMgZXhpc3RpbmcgcGFja2VkIFlVVgogCWZvcm1hdHMgYW5kIGRlc2NyaWJlcyB0aGUgb3JnYW5pemF0aW9uIG9mIGVhY2ggcGl4ZWwgZGF0YSBpbiBlYWNoIHNhbXBsZS4KIAlXaGVuIGEgZm9ybWF0IHBhdHRlcm4gaXMgc3BsaXQgYWNyb3NzIG11bHRpcGxlIHNhbXBsZXMgZWFjaCBvZiB0aGUgc2FtcGxlcwogCWluIHRoZSBwYXR0ZXJuIGlzIGRlc2NyaWJlZC48L3BhcmE+CkBAIC0yNDkyLDYgKzI0OTIsMTYzIEBACiAgICAgPC9zZWN0aW9uPgogCiAgICAgPHNlY3Rpb24+CisgICAgICA8dGl0bGU+SFNWL0hTTCBGb3JtYXRzPC90aXRsZT4KKworICAgICAgPHBhcmE+VGhvc2UgZm9ybWF0cyB0cmFuc2ZlciBwaXhlbCBkYXRhIGFzIFJHQiB2YWx1ZXMgaW4gYSBjeWxpbmRyaWNhbC1jb29yZGluYXRlCisgICAgICBzeXN0ZW0gdXNpbmcgSHVlLVNhdHVyYXRpb24tVmFsdWUgb3IgSHVlLVNhdHVyYXRpb24tTGlnaHRuZXNzIGNvbXBvbmVudHMuIFRoZQorICAgICAgZm9ybWF0IGNvZGUgaXMgbWFkZSBvZiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLgorICAgICAgPGl0ZW1pemVkbGlzdD4KKwk8bGlzdGl0ZW0+PHBhcmE+VGhlIGh1ZSwgc2F0dXJhdGlvbiwgdmFsdWUgb3IgbGlnaHRuZXNzIGFuZCBvcHRpb25hbCBhbHBoYQorCWNvbXBvbmVudHMgb3JkZXIgY29kZSwgYXMgZW5jb2RlZCBpbiBhIHBpeGVsIHNhbXBsZS4gVGhlIG9ubHkgY3VycmVudGx5CisJc3VwcG9ydGVkIHZhbHVlIGlzIEFIU1YuCisJPC9wYXJhPjwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPjxwYXJhPlRoZSBudW1iZXIgb2YgYml0cyBwZXIgY29tcG9uZW50LCBmb3IgZWFjaCBjb21wb25lbnQuIFRoZSB2YWx1ZXMKKwljYW4gYmUgZGlmZmVyZW50IGZvciBhbGwgY29tcG9uZW50cy4gVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZSBpcyA4ODg4LgorCTwvcGFyYT48L2xpc3RpdGVtPgorCTxsaXN0aXRlbT48cGFyYT5UaGUgbnVtYmVyIG9mIGJ1cyBzYW1wbGVzIHBlciBwaXhlbC4gUGl4ZWxzIHRoYXQgYXJlIHdpZGVyIHRoYW4KKwl0aGUgYnVzIHdpZHRoIG11c3QgYmUgdHJhbnNmZXJyZWQgaW4gbXVsdGlwbGUgc2FtcGxlcy4gVGhlIG9ubHkgY3VycmVudGx5CisJc3VwcG9ydGVkIHZhbHVlIGlzIDEuPC9wYXJhPjwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPjxwYXJhPlRoZSBidXMgd2lkdGguPC9wYXJhPjwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPjxwYXJhPkZvciBmb3JtYXRzIHdoZXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgaXMgc21hbGxlcgorCXRoYW4gdGhlIG51bWJlciBvZiBidXMgc2FtcGxlcyBwZXIgcGl4ZWwgdGltZXMgdGhlIGJ1cyB3aWR0aCwgYSBwYWRkaW5nCisJdmFsdWUgc3RhdGluZyBpZiB0aGUgYnl0ZXMgYXJlIHBhZGRlZCBpbiB0aGVpciBtb3N0IGhpZ2ggb3JkZXIgYml0cworCShQQURISSkgb3IgbG93IG9yZGVyIGJpdHMgKFBBRExPKS48L3BhcmE+PC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+PHBhcmE+Rm9yIGZvcm1hdHMgd2hlcmUgdGhlIG51bWJlciBvZiBidXMgc2FtcGxlcyBwZXIgcGl4ZWwgaXMgbGFyZ2VyCisJdGhhbiAxLCBhbiBlbmRpYW5uZXNzIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHBpeGVsIGlzIHRyYW5zZmVycmVkIE1TQiBmaXJzdAorCShCRSkgb3IgTFNCIGZpcnN0IChMRSkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBleGlzdGluZyBIU1YvSFNMIGZvcm1hdHMuPC9wYXJhPgorCisgICAgICA8dGFibGUgcGd3aWRlPSIwIiBmcmFtZT0ibm9uZSIgaWQ9InY0bDItbWJ1cy1waXhlbGNvZGUtaHN2Ij4KKwk8dGl0bGU+SFNWL0hTTCBmb3JtYXRzPC90aXRsZT4KKwk8dGdyb3VwIGNvbHM9IjI3Ij4KKwkgIDxjb2xzcGVjIGNvbG5hbWU9ImlkIiBhbGlnbj0ibGVmdCIgLz4KKwkgIDxjb2xzcGVjIGNvbG5hbWU9ImNvZGUiIGFsaWduPSJjZW50ZXIiLz4KKwkgIDxjb2xzcGVjIGNvbG5hbWU9ImJpdCIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iNCIgY29sbmFtZT0iYjMxIiBhbGlnbj0iY2VudGVyIiAvPgorCSAgPGNvbHNwZWMgY29sbnVtPSI1IiBjb2xuYW1lPSJiMjAiIGFsaWduPSJjZW50ZXIiIC8+CisJICA8Y29sc3BlYyBjb2xudW09IjYiIGNvbG5hbWU9ImIyOSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iNyIgY29sbmFtZT0iYjI4IiBhbGlnbj0iY2VudGVyIiAvPgorCSAgPGNvbHNwZWMgY29sbnVtPSI4IiBjb2xuYW1lPSJiMjciIGFsaWduPSJjZW50ZXIiIC8+CisJICA8Y29sc3BlYyBjb2xudW09IjkiIGNvbG5hbWU9ImIyNiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTAiIGNvbG5hbWU9ImIyNSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTEiIGNvbG5hbWU9ImIyNCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTIiIGNvbG5hbWU9ImIyMyIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTMiIGNvbG5hbWU9ImIyMiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTQiIGNvbG5hbWU9ImIyMSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTUiIGNvbG5hbWU9ImIyMCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTYiIGNvbG5hbWU9ImIxOSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTciIGNvbG5hbWU9ImIxOCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTgiIGNvbG5hbWU9ImIxNyIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMTkiIGNvbG5hbWU9ImIxNiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjAiIGNvbG5hbWU9ImIxNSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjEiIGNvbG5hbWU9ImIxNCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjIiIGNvbG5hbWU9ImIxMyIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjMiIGNvbG5hbWU9ImIxMiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjQiIGNvbG5hbWU9ImIxMSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjUiIGNvbG5hbWU9ImIxMCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjYiIGNvbG5hbWU9ImIwOSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjciIGNvbG5hbWU9ImIwOCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjgiIGNvbG5hbWU9ImIwNyIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMjkiIGNvbG5hbWU9ImIwNiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzAiIGNvbG5hbWU9ImIwNSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzEiIGNvbG5hbWU9ImIwNCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzIiIGNvbG5hbWU9ImIwMyIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzMiIGNvbG5hbWU9ImIwMiIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzQiIGNvbG5hbWU9ImIwMSIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxjb2xzcGVjIGNvbG51bT0iMzUiIGNvbG5hbWU9ImIwMCIgYWxpZ249ImNlbnRlciIgLz4KKwkgIDxzcGFuc3BlYyBuYW1lc3Q9ImIzMSIgbmFtZWVuZD0iYjAwIiBzcGFubmFtZT0iYjAiIC8+CisJICA8dGhlYWQ+CisJICAgIDxyb3c+CisJICAgICAgPGVudHJ5PklkZW50aWZpZXI8L2VudHJ5PgorCSAgICAgIDxlbnRyeT5Db2RlPC9lbnRyeT4KKwkgICAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8ZW50cnkgc3Bhbm5hbWU9ImIwIj5EYXRhIG9yZ2FuaXphdGlvbjwvZW50cnk+CisJICAgIDwvcm93PgorCSAgICA8cm93PgorCSAgICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5CaXQ8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4zMTwvZW50cnk+CisJICAgICAgPGVudHJ5PjMwPC9lbnRyeT4KKwkgICAgICA8ZW50cnk+Mjk8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4yODwvZW50cnk+CisJICAgICAgPGVudHJ5PjI3PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MjY8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4yNTwvZW50cnk+CisJICAgICAgPGVudHJ5PjI0PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MjM8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4yMjwvZW50cnk+CisJICAgICAgPGVudHJ5PjIxPC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MjA8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4xOTwvZW50cnk+CisJICAgICAgPGVudHJ5PjE4PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MTc8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4xNjwvZW50cnk+CisJICAgICAgPGVudHJ5PjE1PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MTQ8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4xMzwvZW50cnk+CisJICAgICAgPGVudHJ5PjEyPC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MTE8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4xMDwvZW50cnk+CisJICAgICAgPGVudHJ5Pjk8L2VudHJ5PgorCSAgICAgIDxlbnRyeT44PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+NzwvZW50cnk+CisJICAgICAgPGVudHJ5PjY8L2VudHJ5PgorCSAgICAgIDxlbnRyeT41PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+NDwvZW50cnk+CisJICAgICAgPGVudHJ5PjM8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKwkgICAgICA8ZW50cnk+MTwvZW50cnk+CisJICAgICAgPGVudHJ5PjA8L2VudHJ5PgorCSAgICA8L3Jvdz4KKwkgIDwvdGhlYWQ+CisJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgICA8cm93IGlkPSJWNEwyLU1CVVMtRk1ULUFIU1Y4ODg4LTFYMzIiPgorCSAgICAgIDxlbnRyeT5WNEwyX01CVVNfRk1UX0FIU1Y4ODg4XzFYMzI8L2VudHJ5PgorCSAgICAgIDxlbnRyeT4weDYwMDE8L2VudHJ5PgorCSAgICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5hPHN1YnNjcmlwdD43PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+YTxzdWJzY3JpcHQ+Njwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PmE8c3Vic2NyaXB0PjU8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5hPHN1YnNjcmlwdD40PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+YTxzdWJzY3JpcHQ+Mzwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PmE8c3Vic2NyaXB0PjI8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5hPHN1YnNjcmlwdD4xPC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+YTxzdWJzY3JpcHQ+MDwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5Pmg8c3Vic2NyaXB0Pjc8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5oPHN1YnNjcmlwdD42PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+aDxzdWJzY3JpcHQ+NTwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5Pmg8c3Vic2NyaXB0PjQ8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5oPHN1YnNjcmlwdD4zPC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+aDxzdWJzY3JpcHQ+Mjwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5Pmg8c3Vic2NyaXB0PjE8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5oPHN1YnNjcmlwdD4wPC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+czxzdWJzY3JpcHQ+Nzwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PnM8c3Vic2NyaXB0PjY8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5zPHN1YnNjcmlwdD41PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+czxzdWJzY3JpcHQ+NDwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PnM8c3Vic2NyaXB0PjM8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT5zPHN1YnNjcmlwdD4yPC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+czxzdWJzY3JpcHQ+MTwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PnM8c3Vic2NyaXB0PjA8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT52PHN1YnNjcmlwdD43PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+djxzdWJzY3JpcHQ+Njwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PnY8c3Vic2NyaXB0PjU8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT52PHN1YnNjcmlwdD40PC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+djxzdWJzY3JpcHQ+Mzwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgICAgPGVudHJ5PnY8c3Vic2NyaXB0PjI8L3N1YnNjcmlwdD48L2VudHJ5PgorCSAgICAgIDxlbnRyeT52PHN1YnNjcmlwdD4xPC9zdWJzY3JpcHQ+PC9lbnRyeT4KKwkgICAgICA8ZW50cnk+djxzdWJzY3JpcHQ+MDwvc3Vic2NyaXB0PjwvZW50cnk+CisJICAgIDwvcm93PgorCSAgPC90Ym9keT4KKwk8L3Rncm91cD4KKyAgICAgIDwvdGFibGU+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CiAgICAgICA8dGl0bGU+SlBFRyBDb21wcmVzc2VkIEZvcm1hdHM8L3RpdGxlPgogCiAgICAgICA8cGFyYT5UaG9zZSBkYXRhIGZvcm1hdHMgY29uc2lzdCBvZiBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIDgtYml0IGJ5dGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbAppbmRleCA4NDY5ZmUxLi43NGI3ZjI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdjRsMi54bWwKQEAgLTE0MSw2ICsxNDEsMTQgQEAKIGFwcGxpY2F0aW9ucy4gLS0+CiAKICAgICAgIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjMuMTQ8L3Jldm51bWJlcj4KKwk8ZGF0ZT4yMDEzLTExLTI1PC9kYXRlPgorCTxhdXRob3Jpbml0aWFscz5ycjwvYXV0aG9yaW5pdGlhbHM+CisJPHJldnJlbWFyaz5TZXQgd2lkdGggYW5kIGhlaWdodCBhcyB1bnNpZ25lZCBvbiB2NGwyX3JlY3QuCisJPC9yZXZyZW1hcms+CisgICAgICA8L3JldmlzaW9uPgorCisgICAgICA8cmV2aXNpb24+CiAJPHJldm51bWJlcj4zLjExPC9yZXZudW1iZXI+CiAJPGRhdGU+MjAxMy0wNS0yNjwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+aHY8L2F1dGhvcmluaXRpYWxzPgpAQCAtNTAxLDcgKzUwOSw3IEBACiA8L3BhcnRpbmZvPgogCiA8dGl0bGU+VmlkZW8gZm9yIExpbnV4IFR3byBBUEkgU3BlY2lmaWNhdGlvbjwvdGl0bGU+Ci0gPHN1YnRpdGxlPlJldmlzaW9uIDMuMTE8L3N1YnRpdGxlPgorIDxzdWJ0aXRsZT5SZXZpc2lvbiAzLjE0PC9zdWJ0aXRsZT4KIAogICA8Y2hhcHRlciBpZD0iY29tbW9uIj4KICAgICAmc3ViLWNvbW1vbjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyb3BjYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKaW5kZXggYmY3Y2M5Ny4uMWY1ZWQ2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKQEAgLTEzMywxOCArMTMzLDE0IEBACiByZWN0YW5nbGUsIGluIHBpeGVscy48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgogCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPndpZHRoPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgogCSAgICA8ZW50cnk+V2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gcGl4ZWxzLjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CiAJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+aGVpZ2h0PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+SGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy4gV2lkdGgKLWFuZCBoZWlnaHQgY2Fubm90IGJlIG5lZ2F0aXZlLCB0aGUgZmllbGRzIGFyZSBzaWduZWQgZm9yCi1oeXN0ZXJpY2FsIHJlYXNvbnMuIDwhLS0gdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCi1vbiAyMiBPY3QgMjAwMiBzdWJqZWN0ICJSZTpbVjRMXVtwYXRjaGVzIV0gUmU6djRsMi9rZXJuZWwtMi41IiAtLT4KLTwvZW50cnk+CisJICAgIDxlbnRyeT5IZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gcGl4ZWxzLjwvZW50cnk+CiAJICA8L3Jvdz4KIAk8L3Rib2R5PgogICAgICAgPC90Z3JvdXA+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwKaW5kZXggNzE2ZWExNS4uNjVkZmY1NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN0cmVhbW9uLnhtbApAQCAtNTksNyArNTksNyBAQAogcXVldWUpIHVudGlsIDxjb25zdGFudD5WSURJT0NfU1RSRUFNT048L2NvbnN0YW50PiBoYXMgYmVlbiBjYWxsZWQuCiBBY2NvcmRpbmdseSB0aGUgb3V0cHV0IGhhcmR3YXJlIGlzIGRpc2FibGVkLCBubyB2aWRlbyBzaWduYWwgaXMKIHByb2R1Y2VkIHVudGlsIDxjb25zdGFudD5WSURJT0NfU1RSRUFNT048L2NvbnN0YW50PiBoYXMgYmVlbiBjYWxsZWQuCi1UaGUgaW9jdGwgd2lsbCBzdWNjZWVkIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ1ZmZlciBpcyBpbiB0aGUKK1RoZSBpb2N0bCB3aWxsIHN1Y2NlZWQgd2hlbiBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ1ZmZlciBpcyBpbiB0aGUKIGluY29taW5nIHF1ZXVlLjwvcGFyYT4KIAogICAgIDxwYXJhPlRoZSA8Y29uc3RhbnQ+VklESU9DX1NUUkVBTU9GRjwvY29uc3RhbnQ+IGlvY3RsLCBhcGFydCBvZgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWAppbmRleCAxZDdhODg1Li5mYTU3MTM5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWApAQCAtOCw2ICs4LDggQEAKIAktIFVzaW5nIFJDVSB0byBQcm90ZWN0IFJlYWQtTW9zdGx5IExpbmtlZCBMaXN0cwogbG9ja2RlcC50eHQKIAktIFJDVSBhbmQgbG9ja2RlcCBjaGVja2luZworbG9ja2RlcC1zcGxhdC50eHQKKwktIFJDVSBMb2NrZGVwIHNwbGF0cyBleHBsYWluZWQuCiBOTUktUkNVLnR4dAogCS0gVXNpbmcgUkNVIHRvIFByb3RlY3QgRHluYW1pYyBOTUkgSGFuZGxlcnMKIHJjdWJhcnJpZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vYXJtLzAwLUlOREVYCmluZGV4IDM2NDIwZTEuLmE5NDA5MGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vYXJtLzAwLUlOREVYCkBAIC00LDYgKzQsOCBAQAogCS0gcmVxdWlyZW1lbnRzIGZvciBib290aW5nCiBJbnRlcnJ1cHRzCiAJLSBBUk0gSW50ZXJydXB0IHN1YnN5c3RlbSBkb2N1bWVudGF0aW9uCitJWFA0eHgKKwktIEludGVsIElYUDR4eCBOZXR3b3JrIHByb2Nlc3Nvci4KIG1zbQogCS0gTVNNIHNwZWNpZmljIGRvY3VtZW50YXRpb24KIE5ldHdpbmRlcgpAQCAtMjQsOCArMjYsMTYgQEAKIAktIFNUIFNQRUFyIHBsYXRmb3JtIExpbnV4IE92ZXJ2aWV3CiBWRlAvCiAJLSBSZWxlYXNlIG5vdGVzIGZvciBMaW51eCBLZXJuZWwgVmVjdG9yIEZsb2F0aW5nIFBvaW50IHN1cHBvcnQgY29kZQorY2x1c3Rlci1wbS1yYWNlLWF2b2lkYW5jZS50eHQKKwktIEFsZ29yaXRobSBmb3IgQ1BVIGFuZCBDbHVzdGVyIHNldHVwL3RlYXJkb3duCiBlbXBlZy8KIAktIEx0ZCdzIEVtcGVnIE1QMyBDYXIgQXVkaW8gUGxheWVyCitmaXJtd2FyZS50eHQKKwktIFNlY3VyZSBmaXJtd2FyZSByZWdpc3RyYXRpb24gYW5kIGNhbGxpbmcuCitrZXJuZWxfbW9kZV9uZW9uLnR4dAorCS0gSG93IHRvIHVzZSBORU9OIGluc3RydWN0aW9ucyBpbiBrZXJuZWwgbW9kZQora2VybmVsX3VzZXJfaGVscGVycy50eHQKKwktIEhlbHBlciBmdW5jdGlvbnMgaW4ga2VybmVsIHNwYWNlIG1hZGUgYXZhaWxhYmxlIGZvciB1c2Vyc3BhY2UuCiBtZW1fYWxpZ25tZW50CiAJLSBhbGlnbm1lbnQgYWJvcnQgaGFuZGxlciBkb2N1bWVudGF0aW9uCiBtZW1vcnkudHh0CkBAIC0zNCwzICs0NCw3IEBACiAJLSBOV0ZQRSBmbG9hdGluZyBwb2ludCBlbXVsYXRvciBkb2N1bWVudGF0aW9uCiBzd3BfZW11bGF0aW9uCiAJLSBTV1AvU1dQQiBlbXVsYXRpb24gaGFuZGxlci9sb2dnaW5nIGRlc2NyaXB0aW9uCit0Y20udHh0CisJLSBBUk0gVGlnaHRseSBDb3VwbGVkIE1lbW9yeQordmxvY2tzLnR4dAorCS0gVm90aW5nIGxvY2tzLCBsb3ctbGV2ZWwgbWVjaGFuaXNtIHJlbHlpbmcgb24gbWVtb3J5IHN5c3RlbSBhdG9taWMgd3JpdGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVgKaW5kZXggMmRmMDM2NS4uYzU0ZmNkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluLzAwLUlOREVYCkBAIC0xLDggKzEsMTAgQEAKIDAwLUlOREVYCiAJLSBUaGlzIGZpbGUKLQorTWFrZWZpbGUKKwktIE1ha2VmaWxlIGZvciBncHRpbWVycyBleGFtcGxlIGZpbGUuCiBiZmluLWdwaW8tbm90ZXMudHh0CiAJLSBOb3RlcyBpbiBkZXZlbG9waW5nL3VzaW5nIGJmaW4tZ3BpbyBkcml2ZXIuCi0KIGJmaW4tc3BpLW5vdGVzLnR4dAogCS0gTm90ZXMgZm9yIHVzaW5nIGJmaW4gc3BpIGJ1cyBkcml2ZXIuCitncHRpbWVycy1leGFtcGxlLmMKKwktIGdwdGltZXJzIGV4YW1wbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2Jsb2NrLzAwLUlOREVYCmluZGV4IDkyOWQ5OTAuLmU4NDBiNDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay8wMC1JTkRFWApAQCAtMTQsNiArMTQsOCBAQAogCS0gRGVhZGxpbmUgSU8gc2NoZWR1bGVyIHR1bmFibGVzCiBpb3ByaW8udHh0CiAJLSBCbG9jayBpbyBwcmlvcml0aWVzIChpbiBDRlEgc2NoZWR1bGVyKQorbnVsbF9ibGsudHh0CisJLSBOdWxsIGJsb2NrIGZvciBibG9jay1sYXllciBiZW5jaG1hcmtpbmcuCiBxdWV1ZS1zeXNmcy50eHQKIAktIFF1ZXVlJ3Mgc3lzZnMgZW50cmllcwogcmVxdWVzdC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAppbmRleCA4ZGY1ZThlLi4yMTAxZTcxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CkBAIC00NDcsMTQgKzQ0NywxMyBAQAogICogbWFpbiB1bml0IG9mIEkvTyBmb3IgdGhlIGJsb2NrIGxheWVyIGFuZCBsb3dlciBsYXllcnMgKGllIGRyaXZlcnMpCiAgKi8KIHN0cnVjdCBiaW8gewotICAgICAgIHNlY3Rvcl90ICAgICAgICAgICAgYmlfc2VjdG9yOwogICAgICAgIHN0cnVjdCBiaW8gICAgICAgICAgKmJpX25leHQ7ICAgIC8qIHJlcXVlc3QgcXVldWUgbGluayAqLwogICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJpX2JkZXY7CS8qIHRhcmdldCBkZXZpY2UgKi8KICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIGJpX2ZsYWdzOyAgICAvKiBzdGF0dXMsIGNvbW1hbmQsIGV0YyAqLwogICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgYmlfcnc7ICAgICAgIC8qIGxvdyBiaXRzOiByL3csIGhpZ2g6IHByaW9yaXR5ICovCiAKICAgICAgICB1bnNpZ25lZCBpbnQJYmlfdmNudDsgICAgIC8qIGhvdyBtYXkgYmlvX3ZlYydzICovCi0gICAgICAgdW5zaWduZWQgaW50CWJpX2lkeDsJCS8qIGN1cnJlbnQgaW5kZXggaW50byBiaW9fdmVjIGFycmF5ICovCisgICAgICAgc3RydWN0IGJ2ZWNfaXRlcgliaV9pdGVyOwkvKiBjdXJyZW50IGluZGV4IGludG8gYmlvX3ZlYyBhcnJheSAqLwogCiAgICAgICAgdW5zaWduZWQgaW50CWJpX3NpemU7ICAgICAvKiB0b3RhbCBzaXplIGluIGJ5dGVzICovCiAgICAgICAgdW5zaWduZWQgc2hvcnQgCWJpX3BoeXNfc2VnbWVudHM7IC8qIHNlZ21lbnRzIGFmdGVyIHBoeXNhZGRyIGNvYWxlc2NlKi8KQEAgLTQ4MCw3ICs0NzksNyBAQAogLSBDb2RlIHRoYXQgdHJhdmVyc2VzIHRoZSByZXEgbGlzdCBjYW4gZmluZCBhbGwgdGhlIHNlZ21lbnRzIG9mIGEgYmlvCiAgIGJ5IHVzaW5nIHJxX2Zvcl9lYWNoX3NlZ21lbnQuICBUaGlzIGhhbmRsZXMgdGhlIGZhY3QgdGhhdCBhIHJlcXVlc3QKICAgaGFzIG11bHRpcGxlIGJpb3MsIGVhY2ggb2Ygd2hpY2ggY2FuIGhhdmUgbXVsdGlwbGUgc2VnbWVudHMuCi0tIERyaXZlcnMgd2hpY2ggY2FuJ3QgcHJvY2VzcyBhIGxhcmdlIGJpbyBpbiBvbmUgc2hvdCBjYW4gdXNlIHRoZSBiaV9pZHgKKy0gRHJpdmVycyB3aGljaCBjYW4ndCBwcm9jZXNzIGEgbGFyZ2UgYmlvIGluIG9uZSBzaG90IGNhbiB1c2UgdGhlIGJpX2l0ZXIKICAgZmllbGQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbmV4dCBiaW9fdmVjIGVudHJ5IHRvIHByb2Nlc3MuCiAgIChlLmcgYSAxTUIgYmlvX3ZlYyBuZWVkcyB0byBiZSBoYW5kbGVkIGluIG1heCAxMjhrQiBjaHVua3MgZm9yIElERSkKICAgW1RCRDogU2hvdWxkIHByZWZlcmFibHkgYWxzbyBoYXZlIGEgYmlfdm9mZnNldCBhbmQgYmlfdmxlbiB0byBhdm9pZCBtb2RpZnlpbmcKQEAgLTU4OSw3ICs1ODgsNyBAQAogbnJfc2VjdG9ycyBhbmQgY3VycmVudF9ucl9zZWN0b3JzIGZpZWxkcyAoYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcKIGhhcmRfeHh4IHZhbHVlcyBhbmQgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCkgYW5kIHVwZGF0ZXMgaXQgb24KIGV2ZXJ5IHRyYW5zZmVyIHRoYXQgaW52b2tlcyBlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0LiBJdCBkb2VzIHRoZSBzYW1lIGZvciB0aGUKLWJ1ZmZlciwgYmlvLCBiaW8tPmJpX2lkeCBmaWVsZHMgdG9vLgorYnVmZmVyLCBiaW8sIGJpby0+YmlfaXRlciBmaWVsZHMgdG9vLgogCiBUaGUgYnVmZmVyIGZpZWxkIGlzIGp1c3QgYSB2aXJ0dWFsIGFkZHJlc3MgbWFwcGluZyBvZiB0aGUgY3VycmVudCBzZWdtZW50CiBvZiB0aGUgaS9vIGJ1ZmZlciBpbiBjYXNlcyB3aGVyZSB0aGUgYnVmZmVyIHJlc2lkZXMgaW4gbG93LW1lbW9yeS4gRm9yIGhpZ2gKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvdmVjcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb3ZlY3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTMyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb3ZlY3MudHh0CkBAIC0wLDAgKzEsMTExIEBACisKK0ltbXV0YWJsZSBiaW92ZWNzIGFuZCBiaW92ZWMgaXRlcmF0b3JzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0tlbnQgT3ZlcnN0cmVldCA8a21vQGRhdGVyYWluYy5jb20+CisKK0FzIG9mIDMuMTMsIGJpb3ZlY3Mgc2hvdWxkIG5ldmVyIGJlIG1vZGlmaWVkIGFmdGVyIGEgYmlvIGhhcyBiZWVuIHN1Ym1pdHRlZC4KK0luc3RlYWQsIHdlIGhhdmUgYSBuZXcgc3RydWN0IGJ2ZWNfaXRlciB3aGljaCByZXByZXNlbnRzIGEgcmFuZ2Ugb2YgYSBiaW92ZWMgLQordGhlIGl0ZXJhdG9yIHdpbGwgYmUgbW9kaWZpZWQgYXMgdGhlIGJpbyBpcyBjb21wbGV0ZWQsIG5vdCB0aGUgYmlvdmVjLgorCitNb3JlIHNwZWNpZmljYWxseSwgb2xkIGNvZGUgdGhhdCBuZWVkZWQgdG8gcGFydGlhbGx5IGNvbXBsZXRlIGEgYmlvIHdvdWxkCit1cGRhdGUgYmlfc2VjdG9yIGFuZCBiaV9zaXplLCBhbmQgYWR2YW5jZSBiaV9pZHggdG8gdGhlIG5leHQgYmlvdmVjLiBJZiBpdAorZW5kZWQgdXAgcGFydHdheSB0aHJvdWdoIGEgYmlvdmVjLCBpdCB3b3VsZCBpbmNyZW1lbnQgYnZfb2Zmc2V0IGFuZCBkZWNyZW1lbnQKK2J2X2xlbiBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbXBsZXRlZCBpbiB0aGF0IGJpb3ZlYy4KKworSW4gdGhlIG5ldyBzY2hlbWUgb2YgdGhpbmdzLCBldmVyeXRoaW5nIHRoYXQgbXVzdCBiZSBtdXRhdGVkIGluIG9yZGVyIHRvCitwYXJ0aWFsbHkgY29tcGxldGUgYSBiaW8gaXMgc2VncmVnYXRlZCBpbnRvIHN0cnVjdCBidmVjX2l0ZXI6IGJpX3NlY3RvciwKK2JpX3NpemUgYW5kIGJpX2lkeCBoYXZlIGJlZW4gbW92ZWQgdGhlcmU7IGFuZCBpbnN0ZWFkIG9mIG1vZGlmeWluZyBidl9vZmZzZXQKK2FuZCBidl9sZW4sIHN0cnVjdCBidmVjX2l0ZXIgaGFzIGJpX2J2ZWNfZG9uZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mCitieXRlcyBjb21wbGV0ZWQgaW4gdGhlIGN1cnJlbnQgYnZlYy4KKworVGhlcmUgYXJlIGEgYnVuY2ggb2YgbmV3IGhlbHBlciBtYWNyb3MgZm9yIGhpZGluZyB0aGUgZ29yeSBkZXRhaWxzIC0gaW4KK3BhcnRpY3VsYXIsIHByZXNlbnRpbmcgdGhlIGlsbHVzaW9uIG9mIHBhcnRpYWxseSBjb21wbGV0ZWQgYmlvdmVjcyBzbyB0aGF0Citub3JtYWwgY29kZSBkb2Vzbid0IGhhdmUgdG8gZGVhbCB3aXRoIGJpX2J2ZWNfZG9uZS4KKworICogRHJpdmVyIGNvZGUgc2hvdWxkIG5vIGxvbmdlciByZWZlciB0byBiaW92ZWNzIGRpcmVjdGx5OyB3ZSBub3cgaGF2ZQorICAgYmlvX2lvdmVjKCkgYW5kIGJpb19pb3ZlY19pdGVyKCkgbWFjcm9zIHRoYXQgcmV0dXJuIGxpdGVyYWwgc3RydWN0IGJpb3ZlY3MsCisgICBjb25zdHJ1Y3RlZCBmcm9tIHRoZSByYXcgYmlvdmVjcyBidXQgdGFraW5nIGludG8gYWNjb3VudCBiaV9idmVjX2RvbmUgYW5kCisgICBiaV9zaXplLgorCisgICBiaW9fZm9yX2VhY2hfc2VnbWVudCgpIGhhcyBiZWVuIHVwZGF0ZWQgdG8gdGFrZSBhIGJ2ZWNfaXRlciBhcmd1bWVudAorICAgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyICh0aGF0IGNvcnJlc3BvbmRlZCB0byBiaV9pZHgpOyBmb3IgYSBsb3Qgb2YgY29kZSB0aGUKKyAgIGNvbnZlcnNpb24ganVzdCByZXF1aXJlZCBjaGFuZ2luZyB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0bworICAgYmlvX2Zvcl9lYWNoX3NlZ21lbnQoKS4KKworICogQWR2YW5jaW5nIGEgYnZlY19pdGVyIGlzIGRvbmUgd2l0aCBiaW9fYWR2YW5jZV9pdGVyKCk7IGJpb19hZHZhbmNlKCkgaXMgYQorICAgd3JhcHBlciBhcm91bmQgYmlvX2FkdmFuY2VfaXRlcigpIHRoYXQgb3BlcmF0ZXMgb24gYmlvLT5iaV9pdGVyLCBhbmQgYWxzbworICAgYWR2YW5jZXMgdGhlIGJpbyBpbnRlZ3JpdHkncyBpdGVyIGlmIHByZXNlbnQuCisKKyAgIFRoZXJlIGlzIGEgbG93ZXIgbGV2ZWwgYWR2YW5jZSBmdW5jdGlvbiAtIGJ2ZWNfaXRlcl9hZHZhbmNlKCkgLSB3aGljaCB0YWtlcworICAgYSBwb2ludGVyIHRvIGEgYmlvdmVjLCBub3QgYSBiaW87IHRoaXMgaXMgdXNlZCBieSB0aGUgYmlvIGludGVncml0eSBjb2RlLgorCitXaGF0J3MgYWxsIHRoaXMgZ2V0IHVzPworPT09PT09PT09PT09PT09PT09PT09PT0KKworSGF2aW5nIGEgcmVhbCBpdGVyYXRvciwgYW5kIG1ha2luZyBiaW92ZWNzIGltbXV0YWJsZSwgaGFzIGEgbnVtYmVyIG9mCithZHZhbnRhZ2VzOgorCisgKiBCZWZvcmUsIGl0ZXJhdGluZyBvdmVyIGJpb3Mgd2FzIHZlcnkgYXdrd2FyZCB3aGVuIHlvdSB3ZXJlbid0IHByb2Nlc3NpbmcKKyAgIGV4YWN0bHkgb25lIGJ2ZWMgYXQgYSB0aW1lIC0gZm9yIGV4YW1wbGUsIGJpb19jb3B5X2RhdGEoKSBpbiBmcy9iaW8uYywKKyAgIHdoaWNoIGNvcGllcyB0aGUgY29udGVudHMgb2Ygb25lIGJpbyBpbnRvIGFub3RoZXIuIEJlY2F1c2UgdGhlIGJpb3ZlY3MKKyAgIHdvdWxkbid0IG5lY2Vzc2FyaWx5IGJlIHRoZSBzYW1lIHNpemUsIHRoZSBvbGQgY29kZSB3YXMgdHJpY2t5IGNvbnZvbHV0ZWQgLQorICAgaXQgaGFkIHRvIHdhbGsgdHdvIGRpZmZlcmVudCBiaW9zIGF0IHRoZSBzYW1lIHRpbWUsIGtlZXBpbmcgYm90aCBiaV9pZHggYW5kCisgICBhbmQgb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgYmlvdmVjIGZvciBlYWNoLgorCisgICBUaGUgbmV3IGNvZGUgaXMgbXVjaCBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCAtIGhhdmUgYSBsb29rLiBUaGlzIHNvcnQgb2YKKyAgIHBhdHRlcm4gY29tZXMgdXAgaW4gYSBsb3Qgb2YgcGxhY2VzOyBhIGxvdCBvZiBkcml2ZXJzIHdlcmUgZXNzZW50aWFsbHkgb3BlbgorICAgY29kaW5nIGJ2ZWMgaXRlcmF0b3JzIGJlZm9yZSwgYW5kIGhhdmluZyBjb21tb24gaW1wbGVtZW50YXRpb24gY29uc2lkZXJhYmx5CisgICBzaW1wbGlmaWVzIGEgbG90IG9mIGNvZGUuCisKKyAqIEJlZm9yZSwgYW55IGNvZGUgdGhhdCBtaWdodCBuZWVkIHRvIHVzZSB0aGUgYmlvdmVjIGFmdGVyIHRoZSBiaW8gaGFkIGJlZW4KKyAgIGNvbXBsZXRlZCAocGVyaGFwcyB0byBjb3B5IHRoZSBkYXRhIHNvbWV3aGVyZSBlbHNlLCBvciBwZXJoYXBzIHRvIHJlc3VibWl0CisgICBpdCBzb21ld2hlcmUgZWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IpIGhhZCB0byBzYXZlIHRoZSBlbnRpcmUgYnZlYyBhcnJheQorICAgLSBhZ2FpbiwgdGhpcyB3YXMgYmVpbmcgZG9uZSBpbiBhIGZhaXIgbnVtYmVyIG9mIHBsYWNlcy4KKworICogQmlvdmVjcyBjYW4gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgYmlvcyAtIGEgYnZlYyBpdGVyIGNhbiByZXByZXNlbnQgYW4KKyAgIGFyYml0cmFyeSByYW5nZSBvZiBhbiBleGlzdGluZyBiaW92ZWMsIGJvdGggc3RhcnRpbmcgYW5kIGVuZGluZyBtaWR3YXkKKyAgIHRocm91Z2ggYmlvdmVjcy4gVGhpcyBpcyB3aGF0IGVuYWJsZXMgZWZmaWNpZW50IHNwbGl0dGluZyBvZiBhcmJpdHJhcnkKKyAgIGJpb3MuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHdlIF9vbmx5XyB1c2UgYmlfc2l6ZSB0byBkZXRlcm1pbmUgd2hlbiB3ZSd2ZQorICAgcmVhY2hlZCB0aGUgZW5kIG9mIGEgYmlvLCBub3QgYmlfdmNudCAtIGFuZCB0aGUgYmlvX2lvdmVjKCkgbWFjcm8gdGFrZXMKKyAgIGJpX3NpemUgaW50byBhY2NvdW50IHdoZW4gY29uc3RydWN0aW5nIGJpb3ZlY3MuCisKKyAqIFNwbGl0dGluZyBiaW9zIGlzIG5vdyBtdWNoIHNpbXBsZXIuIFRoZSBvbGQgYmlvX3NwbGl0KCkgZGlkbid0IGV2ZW4gd29yayBvbgorICAgYmlvcyB3aXRoIG1vcmUgdGhhbiBhIHNpbmdsZSBidmVjISBOb3csIHdlIGNhbiBlZmZpY2llbnRseSBzcGxpdCBhcmJpdHJhcnkKKyAgIHNpemUgYmlvcyAtIGJlY2F1c2UgdGhlIG5ldyBiaW8gY2FuIHNoYXJlIHRoZSBvbGQgYmlvJ3MgYmlvdmVjLgorCisgICBDYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZSBiaW92ZWMgaXNuJ3QgZnJlZWQgd2hpbGUgdGhlIHNwbGl0IGJpbyBpcworICAgc3RpbGwgdXNpbmcgaXQsIGluIGNhc2UgdGhlIG9yaWdpbmFsIGJpbyBjb21wbGV0ZXMgZmlyc3QsIHRob3VnaC4gVXNpbmcKKyAgIGJpb19jaGFpbigpIHdoZW4gc3BsaXR0aW5nIGJpb3MgaGVscHMgd2l0aCB0aGlzLgorCisgKiBTdWJtaXR0aW5nIHBhcnRpYWxseSBjb21wbGV0ZWQgYmlvcyBpcyBub3cgcGVyZmVjdGx5IGZpbmUgLSB0aGlzIGNvbWVzIHVwCisgICBvY2Nhc2lvbmFsbHkgaW4gc3RhY2tpbmcgYmxvY2sgZHJpdmVycyBhbmQgdmFyaW91cyBjb2RlIChlLmcuIG1kIGFuZAorICAgYmNhY2hlKSBoYWQgc29tZSB1Z2x5IHdvcmthcm91bmRzIGZvciB0aGlzLgorCisgICBJdCB1c2VkIHRvIGJlIHRoZSBjYXNlIHRoYXQgc3VibWl0dGluZyBhIHBhcnRpYWxseSBjb21wbGV0ZWQgYmlvIHdvdWxkIHdvcmsKKyAgIGZpbmUgdG8gX21vc3RfIGRldmljZXMsIGJ1dCBzaW5jZSBhY2Nlc3NpbmcgdGhlIHJhdyBidmVjIGFycmF5IHdhcyB0aGUKKyAgIG5vcm0sIG5vdCBhbGwgZHJpdmVycyB3b3VsZCByZXNwZWN0IGJpX2lkeCBhbmQgdGhvc2Ugd291bGQgYnJlYWsuIE5vdywKKyAgIHNpbmNlIGFsbCBkcml2ZXJzIF9tdXN0XyBnbyB0aHJvdWdoIHRoZSBidmVjIGl0ZXJhdG9yIC0gYW5kIGhhdmUgYmVlbgorICAgYXVkaXRlZCB0byBtYWtlIHN1cmUgdGhleSBhcmUgLSBzdWJtaXR0aW5nIHBhcnRpYWxseSBjb21wbGV0ZWQgYmlvcyBpcworICAgcGVyZmVjdGx5IGZpbmUuCisKK090aGVyIGltcGxpY2F0aW9uczoKKz09PT09PT09PT09PT09PT09PT0KKworICogQWxtb3N0IGFsbCB1c2FnZSBvZiBiaV9pZHggaXMgbm93IGluY29ycmVjdCBhbmQgaGFzIGJlZW4gcmVtb3ZlZDsgaW5zdGVhZCwKKyAgIHdoZXJlIHByZXZpb3VzbHkgeW91IHdvdWxkIGhhdmUgdXNlZCBiaV9pZHggeW91J2Qgbm93IHVzZSBhIGJ2ZWNfaXRlciwKKyAgIHByb2JhYmx5IHBhc3NpbmcgaXQgdG8gb25lIG9mIHRoZSBoZWxwZXIgbWFjcm9zLgorCisgICBJLmUuIGluc3RlYWQgb2YgdXNpbmcgYmlvX2lvdmVjX2lkeCgpIChvciBiaW8tPmJpX2lvdmVjW2Jpby0+YmlfaWR4XSksIHlvdQorICAgbm93IHVzZSBiaW9faXRlcl9pb3ZlYygpLCB3aGljaCB0YWtlcyBhIGJ2ZWNfaXRlciBhbmQgcmV0dXJucyBhCisgICBsaXRlcmFsIHN0cnVjdCBiaW9fdmVjIC0gY29uc3RydWN0ZWQgb24gdGhlIGZseSBmcm9tIHRoZSByYXcgYmlvdmVjIGJ1dAorICAgdGFraW5nIGludG8gYWNjb3VudCBiaV9idmVjX2RvbmUgKGFuZCBiaV9zaXplKS4KKworICogYmlfdmNudCBjYW4ndCBiZSB0cnVzdGVkIG9yIHJlbGllZCB1cG9uIGJ5IGRyaXZlciBjb2RlIC0gaS5lLiBhbnl0aGluZyB0aGF0CisgICBkb2Vzbid0IGFjdHVhbGx5IG93biB0aGUgYmlvLiBUaGUgcmVhc29uIGlzIHR3b2ZvbGQ6IGZpcnN0bHksIGl0J3Mgbm90CisgICBhY3R1YWxseSBuZWVkZWQgZm9yIGl0ZXJhdGluZyBvdmVyIHRoZSBiaW8gYW55bW9yZSAtIHdlIG9ubHkgdXNlIGJpX3NpemUuCisgICBTZWNvbmRseSwgd2hlbiBjbG9uaW5nIGEgYmlvIGFuZCByZXVzaW5nIChhIHBvcnRpb24gb2YpIHRoZSBvcmlnaW5hbCBiaW8ncworICAgYmlvdmVjLCBpbiBvcmRlciB0byBjYWxjdWxhdGUgYmlfdmNudCBmb3IgdGhlIG5ldyBiaW8gd2UnZCBoYXZlIHRvIGl0ZXJhdGUKKyAgIG92ZXIgYWxsIHRoZSBiaW92ZWNzIGluIHRoZSBuZXcgYmlvIC0gd2hpY2ggaXMgc2lsbHkgYXMgaXQncyBub3QgbmVlZGVkLgorCisgICBTbywgZG9uJ3QgdXNlIGJpX3ZjbnQgYW55bW9yZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi96cmFtLnR4dApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi96cmFtLnR4dAppbmRleCA3NjVkNzkwLi4yZWNjZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3pyYW0udHh0CkBAIC0xLDggKzEsNiBAQAogenJhbTogQ29tcHJlc3NlZCBSQU0gYmFzZWQgYmxvY2sgZGV2aWNlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Qcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20vCi0KICogSW50cm9kdWN0aW9uCiAKIFRoZSB6cmFtIG1vZHVsZSBjcmVhdGVzIFJBTSBiYXNlZCBibG9jayBkZXZpY2VzIG5hbWVkIC9kZXYvenJhbTxpZD4KQEAgLTY5LDkgKzY3LDUgQEAKIAlyZXNldHMgdGhlIGRpc2tzaXplIHRvIHplcm8uIFlvdSBtdXN0IHNldCB0aGUgZGlza3NpemUgYWdhaW4KIAliZWZvcmUgcmV1c2luZyB0aGUgZGV2aWNlLgogCi1QbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBhdDoKLSAtIE1haWxpbmcgbGlzdDogbGludXgtbW0tY2MgYXQgbGFwdG9wIGRvdCBvcmcKLSAtIElzc3VlIHRyYWNrZXI6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb21wY2FjaGUvaXNzdWVzL2xpc3QKLQogTml0aW4gR3VwdGEKIG5ndXB0YUB2ZmxhcmUub3JnCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvcmVzb3VyY2VfY291bnRlci50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvcmVzb3VyY2VfY291bnRlci50eHQKaW5kZXggNTJlMWRhMS4uNTEwOGFmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL3Jlc291cmNlX2NvdW50ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9yZXNvdXJjZV9jb3VudGVyLnR4dApAQCAtOTUsNyArOTUsNyBAQAogCiAgZi4gdTY0IHJlc19jb3VudGVyX3VuY2hhcmdlX3VudGlsCiAJCShzdHJ1Y3QgcmVzX2NvdW50ZXIgKnJjLCBzdHJ1Y3QgcmVzX2NvdW50ZXIgKnRvcCwKLQkJIHVuc2luZ2VkIGxvbmcgdmFsKQorCQkgdW5zaWduZWQgbG9uZyB2YWwpCiAKIAlBbG1vc3Qgc2FtZSBhcyByZXNfY291bnRlcl91bmNoYXJnZSgpIGJ1dCBwcm9wYWdhdGlvbiBvZiB1bmNoYXJnZQogCXN0b3BzIHdoZW4gcmMgPT0gdG9wLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGtpbGwgYSByZXNfY291bnRlciBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlLzAwLUlOREVYCmluZGV4IGI3OGY2OTEuLjhjNDEwMmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvMDAtSU5ERVgKQEAgLTgsMyArOCw1IEBACiAJLSB0aGlzIGZpbGUKIGJvb3Rpbmctd2l0aG91dC1vZi50eHQKIAktIEJvb3RpbmcgTGludXggd2l0aG91dCBPcGVuIEZpcm13YXJlLCBkZXNjcmliZXMgaGlzdG9yeSBhbmQgZm9ybWF0IG9mIGRldmljZSB0cmVlcy4KK3VzYWdlLW1vZGVsLnR4dAorCS0gSG93IExpbnV4IHVzZXMgRFQgYW5kIHdoYXQgRFQgYWltcyB0byBzb2x2ZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2JjbS9rb25hLXRpbWVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYmNtL2tvbmEtdGltZXIudHh0CmluZGV4IDE3ZDg4YjIuLjM5YWRmNTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYmNtL2tvbmEtdGltZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYmNtL2tvbmEtdGltZXIudHh0CkBAIC04LDEzICs4LDE4IEBACiAtIERFUFJFQ0FURUQ6IGNvbXBhdGlibGUgOiAiYmNtLGtvbmEtdGltZXIiCiAtIHJlZyA6IFJlZ2lzdGVyIHJhbmdlIGZvciB0aGUgdGltZXIKIC0gaW50ZXJydXB0cyA6IGludGVycnVwdCBmb3IgdGhlIHRpbWVyCistIGNsb2NrczogcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlyIG9mIHRoZSBleHRlcm5hbCBjbG9jawogLSBjbG9jay1mcmVxdWVuY3k6IGZyZXF1ZW5jeSB0aGF0IHRoZSBjbG9jayBvcGVyYXRlcwogCitPbmx5IG9uZSBvZiBjbG9ja3Mgb3IgY2xvY2stZnJlcXVlbmN5IHNob3VsZCBiZSBzcGVjaWZpZWQuCisKK1JlZmVyIHRvIGNsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGdlbmVyaWMgY2xvY2sgY29uc3VtZXIgcHJvcGVydGllcy4KKwogRXhhbXBsZToKIAl0aW1lckAzNTAwNjAwMCB7CiAJCWNvbXBhdGlibGUgPSAiYnJjbSxrb25hLXRpbWVyIjsKIAkJcmVnID0gPDB4MzUwMDYwMDAgMHgxMDAwPjsKIAkJaW50ZXJydXB0cyA9IDwweDAgNyAweDQ+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzI3Njg+OworCQljbG9ja3MgPSA8Jmh1Yl90aW1lcl9jbGs+OwogCX07CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9iY20ta29uYS1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYmNtLWtvbmEtY2xvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDFmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYmNtLWtvbmEtY2xvY2sudHh0CkBAIC0wLDAgKzEsOTMgQEAKK0Jyb2FkY29tIEtvbmEgRmFtaWx5IENsb2NrcworCitUaGlzIGJpbmRpbmcgaXMgYXNzb2NpYXRlZCB3aXRoIEJyb2FkY29tIFNvQ3MgaGF2aW5nICJLb25hIiBzdHlsZQorY2xvY2sgY29udHJvbCB1bml0cyAoQ0NVcykuICBBIENDVSBpcyBhIGNsb2NrIHByb3ZpZGVyIHRoYXQgbWFuYWdlcworYSBzZXQgb2YgY2xvY2sgc2lnbmFscy4gIEVhY2ggQ0NVIGlzIHJlcHJlc2VudGVkIGJ5IGEgbm9kZSBpbiB0aGUKK2RldmljZSB0cmVlLgorCitUaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmc6CisgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCisJU2hhbGwgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisJLSAiYnJjbSxiY20xMTM1MS1yb290LWNjdSIKKwktICJicmNtLGJjbTExMzUxLWFvbi1jY3UiCisJLSAiYnJjbSxiY20xMTM1MS1odWItY2N1IgorCS0gImJyY20sYmNtMTEzNTEtbWFzdGVyLWNjdSIKKwktICJicmNtLGJjbTExMzUxLXNsYXZlLWNjdSIKKy0gcmVnCisJU2hhbGwgZGVmaW5lIHRoZSBiYXNlIGFuZCByYW5nZSBvZiB0aGUgYWRkcmVzcyBzcGFjZQorCWNvbnRhaW5pbmcgY2xvY2sgY29udHJvbCByZWdpc3RlcnMKKy0gI2Nsb2NrLWNlbGxzCisJU2hhbGwgaGF2ZSB2YWx1ZSA8MT4uICBUaGUgcGVybWl0dGVkIGNsb2NrLXNwZWNpZmllciB2YWx1ZXMKKwlhcmUgZGVmaW5lZCBiZWxvdy4KKy0gY2xvY2stb3V0cHV0LW5hbWVzCisJU2hhbGwgYmUgYW4gb3JkZXJlZCBsaXN0IG9mIHN0cmluZ3MgZGVmaW5pbmcgdGhlIG5hbWVzIG9mCisJdGhlIGNsb2NrcyBwcm92aWRlZCBieSB0aGUgQ0NVLgorCisKK0JDTTI4MVhYIGZhbWlseSBTb0NzIHVzZSBLb25hIENDVXMuICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlZmluZXMKK3RoZSBzZXQgb2YgQ0NVcyBhbmQgY2xvY2sgc3BlY2lmaWVycyBmb3IgQkNNMjgxWFggY2xvY2tzLiAgV2hlbgorYSBjbG9jayBjb25zdW1lciByZWZlcmVuY2VzIGEgY2xvY2tzLCBpdHMgc3ltYm9saWMgc3BlY2lmaWVyCisocmF0aGVyIHRoYW4gaXRzIG51bWVyaWMgaW5kZXggdmFsdWUpIHNob3VsZCBiZSB1c2VkLiAgVGhlc2UKK3NwZWNpZmllcnMgYXJlIGRlZmluZWQgaW4gImluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svYmNtMjgxeHguaCIuCisKKyAgICBDQ1UgICAgIENsb2NrICAgICAgICAgICBUeXBlICAgIEluZGV4ICAgU3BlY2lmaWVyCisgICAgLS0tICAgICAtLS0tLSAgICAgICAgICAgLS0tLSAgICAtLS0tLSAgIC0tLS0tLS0tLQorICAgIHJvb3QgICAgZnJhY18xbSAgICAgICAgIHBlcmkgICAgICAwICAgICBCQ00yODFYWF9ST09UX0NDVV9GUkFDXzFNCisKKyAgICBhb24gICAgIGh1Yl90aW1lciAgICAgICBwZXJpICAgICAgMCAgICAgQkNNMjgxWFhfQU9OX0NDVV9IVUJfVElNRVIKKyAgICBhb24gICAgIHBtdV9ic2MgICAgICAgICBwZXJpICAgICAgMSAgICAgQkNNMjgxWFhfQU9OX0NDVV9QTVVfQlNDCisgICAgYW9uICAgICBwbXVfYnNjX3ZhciAgICAgcGVyaSAgICAgIDIgICAgIEJDTTI4MVhYX0FPTl9DQ1VfUE1VX0JTQ19WQVIKKworICAgIGh1YiAgICAgdG1vbl8xbSAgICAgICAgIHBlcmkgICAgICAwICAgICBCQ00yODFYWF9IVUJfQ0NVX1RNT05fMU0KKworICAgIG1hc3RlciAgc2RpbzEgICAgICAgICAgIHBlcmkgICAgICAwICAgICBCQ00yODFYWF9NQVNURVJfQ0NVX1NESU8xCisgICAgbWFzdGVyICBzZGlvMiAgICAgICAgICAgcGVyaSAgICAgIDEgICAgIEJDTTI4MVhYX01BU1RFUl9DQ1VfU0RJTzIKKyAgICBtYXN0ZXIgIHNkaW8zICAgICAgICAgICBwZXJpICAgICAgMiAgICAgQkNNMjgxWFhfTUFTVEVSX0NDVV9TRElPMworICAgIG1hc3RlciAgc2RpbzQgICAgICAgICAgIHBlcmkgICAgICAzICAgICBCQ00yODFYWF9NQVNURVJfQ0NVX1NESU80CisgICAgbWFzdGVyICBkbWFjICAgICAgICAgICAgcGVyaSAgICAgIDQgICAgIEJDTTI4MVhYX01BU1RFUl9DQ1VfRE1BQworICAgIG1hc3RlciAgdXNiX2ljICAgICAgICAgIHBlcmkgICAgICA1ICAgICBCQ00yODFYWF9NQVNURVJfQ0NVX1VTQl9JQworICAgIG1hc3RlciAgaHNpYzJfNDhtICAgICAgIHBlcmkgICAgICA2ICAgICBCQ00yODFYWF9NQVNURVJfQ0NVX0hTSUNfNDhNCisgICAgbWFzdGVyICBoc2ljMl8xMm0gICAgICAgcGVyaSAgICAgIDcgICAgIEJDTTI4MVhYX01BU1RFUl9DQ1VfSFNJQ18xMk0KKworICAgIHNsYXZlICAgdWFydGIgICAgICAgICAgIHBlcmkgICAgICAwICAgICBCQ00yODFYWF9TTEFWRV9DQ1VfVUFSVEIKKyAgICBzbGF2ZSAgIHVhcnRiMiAgICAgICAgICBwZXJpICAgICAgMSAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX1VBUlRCMgorICAgIHNsYXZlICAgdWFydGIzICAgICAgICAgIHBlcmkgICAgICAyICAgICBCQ00yODFYWF9TTEFWRV9DQ1VfVUFSVEIzCisgICAgc2xhdmUgICB1YXJ0YjQgICAgICAgICAgcGVyaSAgICAgIDMgICAgIEJDTTI4MVhYX1NMQVZFX0NDVV9VQVJUQjQKKyAgICBzbGF2ZSAgIHNzcDAgICAgICAgICAgICBwZXJpICAgICAgNCAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX1NTUDAKKyAgICBzbGF2ZSAgIHNzcDIgICAgICAgICAgICBwZXJpICAgICAgNSAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX1NTUDIKKyAgICBzbGF2ZSAgIGJzYzEgICAgICAgICAgICBwZXJpICAgICAgNiAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX0JTQzEKKyAgICBzbGF2ZSAgIGJzYzIgICAgICAgICAgICBwZXJpICAgICAgNyAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX0JTQzIKKyAgICBzbGF2ZSAgIGJzYzMgICAgICAgICAgICBwZXJpICAgICAgOCAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX0JTQzMKKyAgICBzbGF2ZSAgIHB3bSAgICAgICAgICAgICBwZXJpICAgICAgOSAgICAgQkNNMjgxWFhfU0xBVkVfQ0NVX1BXTQorCisKK0RldmljZSB0cmVlIGV4YW1wbGU6CisKKwlzbGF2ZV9jY3U6IHNsYXZlX2NjdSB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY20xMTM1MS1zbGF2ZS1jY3UiOworCQlyZWcgPSA8MHgzZTAxMTAwMCAweDBmMDA+OworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJ1YXJ0YiIsCisJCQkJICAgICAidWFydGIyIiwKKwkJCQkgICAgICJ1YXJ0YjMiLAorCQkJCSAgICAgInVhcnRiNCI7CisJfTsKKworCXJlZl9jcnlzdGFsX2NsazogcmVmX2NyeXN0YWwgeworCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQljbG9jay1mcmVxdWVuY3kgPSA8MjYwMDAwMDA+OworCX07CisKKwl1YXJ0QDNlMDAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTExMzUxLWR3LWFwYi11YXJ0IiwgInNucHMsZHctYXBiLXVhcnQiOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlyZWcgPSA8MHgzZTAwMjAwMCAweDEwMDA+OworCQljbG9ja3MgPSA8JnNsYXZlX2NjdSBCQ00yODFYWF9TTEFWRV9DQ1VfVUFSVEIzPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY1IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlyZWctc2hpZnQgPSA8Mj47CisJCXJlZy1pby13aWR0aCA9IDw0PjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2NvcmVuZXQtY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2NvcmVuZXQtY2xvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzExYWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY29yZW5ldC1jbG9jay50eHQKQEAgLTAsMCArMSwxMzQgQEAKKyogQ2xvY2sgQmxvY2sgb24gRnJlZXNjYWxlIENvcmVOZXQgUGxhdGZvcm1zCisKK0ZyZWVzY2FsZSBDb3JlTmV0IGNoaXBzIHRha2UgcHJpbWFyeSBjbG9ja2luZyBpbnB1dCBmcm9tIHRoZSBleHRlcm5hbAorU1lTQ0xLIHNpZ25hbC4gVGhlIFNZU0NMSyBpbnB1dCAoZnJlcXVlbmN5KSBpcyBtdWx0aXBsaWVkIHVzaW5nCittdWx0aXBsZSBwaGFzZSBsb2NrZWQgbG9vcHMgKFBMTCkgdG8gY3JlYXRlIGEgdmFyaWV0eSBvZiBmcmVxdWVuY2llcword2hpY2ggY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGEgdmFyaWV0eSBvZiBpbnRlcm5hbCBsb2dpYywgaW5jbHVkaW5nCitjb3JlcyBhbmQgcGVyaXBoZXJhbCBJUCBibG9ja3MuCitQbGVhc2UgcmVmZXIgdG8gdGhlIFJlZmVyZW5jZSBNYW51YWwgZm9yIGRldGFpbHMuCisKKzEuIENsb2NrIEJsb2NrIEJpbmRpbmcKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGNvbnRhaW4gYSBzcGVjaWZpYyBjbG9jayBibG9jayBjb21wYXRpYmxlIHN0cmluZworCWFuZCBhIHNpbmdsZSBjaGFzc2lzIGNsb2NrIGNvbXBhdGlibGUgc3RyaW5nLgorCUNsb2NrIGJsb2NrIHN0cmluZ3MgaW5jbHVkZSwgYnV0IG5vdCBsaW1pdGVkIHRvLCBvbmUgb2YgdGhlOgorCSogImZzbCxwMjA0MS1jbG9ja2dlbiIKKwkqICJmc2wscDMwNDEtY2xvY2tnZW4iCisJKiAiZnNsLHA0MDgwLWNsb2NrZ2VuIgorCSogImZzbCxwNTAyMC1jbG9ja2dlbiIKKwkqICJmc2wscDUwNDAtY2xvY2tnZW4iCisJKiAiZnNsLHQ0MjQwLWNsb2NrZ2VuIgorCSogImZzbCxiNDQyMC1jbG9ja2dlbiIKKwkqICJmc2wsYjQ4NjAtY2xvY2tnZW4iCisJQ2hhc3NpcyBjbG9jayBzdHJpbmdzIGluY2x1ZGU6CisJKiAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI6IGZvciBjaGFzc2lzIDEuMCBjbG9ja3MKKwkqICJmc2wscW9yaXEtY2xvY2tnZW4tMi4wIjogZm9yIGNoYXNzaXMgMi4wIGNsb2NrcworLSByZWc6IERlc2NyaWJlcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlJ3MgcmVzb3VyY2VzIHdpdGhpbiB0aGUKKwlhZGRyZXNzIHNwYWNlIGRlZmluZWQgYnkgaXRzIHBhcmVudCBidXMsIGFuZCByZXNvdXJjZSB6ZXJvCisJcmVwcmVzZW50cyB0aGUgY2xvY2sgcmVnaXN0ZXIgc2V0CistIGNsb2NrLWZyZXF1ZW5jeTogSW5wdXQgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeQorCitSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzOgorLSByYW5nZXM6IEFsbG93cyB2YWxpZCB0cmFuc2xhdGlvbiBiZXR3ZWVuIGNoaWxkJ3MgYWRkcmVzcyBzcGFjZSBhbmQKKwlwYXJlbnQncy4gTXVzdCBiZSBwcmVzZW50IGlmIHRoZSBkZXZpY2UgaGFzIHN1Yi1ub2Rlcy4KKy0gI2FkZHJlc3MtY2VsbHM6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIHVzZWQgdG8gcmVwcmVzZW50CisJcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMuICBNdXN0IGJlIHByZXNlbnQgaWYgdGhlIGRldmljZSBoYXMKKwlzdWItbm9kZXMgYW5kIHNldCB0byAxIGlmIHByZXNlbnQKKy0gI3NpemUtY2VsbHM6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIHVzZWQgdG8gcmVwcmVzZW50CisJdGhlIHNpemUgb2YgYW4gYWRkcmVzcy4gTXVzdCBiZSBwcmVzZW50IGlmIHRoZSBkZXZpY2UgaGFzCisJc3ViLW5vZGVzIGFuZCBzZXQgdG8gMSBpZiBwcmVzZW50CisKKzIuIENsb2NrIFByb3ZpZGVyL0NvbnN1bWVyIEJpbmRpbmcKKworTW9zdCBvZiB0aGUgYmluZGluZ3MgYXJlIGZyb20gdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgorIFsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgaW5jbHVkZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkqICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIiBmb3IgY29yZSBQTEwgY2xvY2tzICh2MS4wKQorCSogImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiIGZvciBjb3JlIFBMTCBjbG9ja3MgKHYyLjApCisJKiAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCIgZm9yIGNvcmUgbXV4IGNsb2NrcyAodjEuMCkKKwkqICJmc2wscW9yaXEtY29yZS1tdXgtMi4wIiBmb3IgY29yZSBtdXggY2xvY2tzICh2Mi4wKQorCSogImZzbCxxb3JpcS1zeXNjbGstMS4wIjogZm9yIGlucHV0IHN5c3RlbSBjbG9jayAodjEuMCkuCisJCUl0IHRha2VzIHBhcmVudCdzIGNsb2NrLWZyZXF1ZW5jeSBhcyBpdHMgY2xvY2suCisJKiAiZnNsLHFvcmlxLXN5c2Nsay0yLjAiOiBmb3IgaW5wdXQgc3lzdGVtIGNsb2NrICh2Mi4wKS4KKwkJSXQgdGFrZXMgcGFyZW50J3MgY2xvY2stZnJlcXVlbmN5IGFzIGl0cyBjbG9jay4KKy0gI2Nsb2NrLWNlbGxzOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLiBUaGUgbnVtYmVyIG9mIGNlbGxzIGluIGEKKwljbG9jay1zcGVjaWZpZXIuIFNob3VsZCBiZSA8MD4gZm9yICJmc2wscW9yaXEtc3lzY2xrLVsxLDJdLjAiCisJY2xvY2tzLCBvciA8MT4gZm9yICJmc2wscW9yaXEtY29yZS1wbGwtWzEsMl0uMCIgY2xvY2tzLgorCUZvciAiZnNsLHFvcmlxLWNvcmUtcGxsLVsxLDJdLjAiIGNsb2NrcywgdGhlIHNpbmdsZQorCWNsb2NrLXNwZWNpZmllciBjZWxsIG1heSB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCSogMCAtIGVxdWFsIHRvIHRoZSBQTEwgZnJlcXVlbmN5CisJKiAxIC0gZXF1YWwgdG8gdGhlIFBMTCBmcmVxdWVuY3kgZGl2aWRlZCBieSAyCisJKiAyIC0gZXF1YWwgdG8gdGhlIFBMTCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0CisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXM6CistIGNsb2NrczogU2hvdWxkIGJlIHRoZSBwaGFuZGxlIG9mIGlucHV0IHBhcmVudCBjbG9jaworLSBjbG9jay1uYW1lczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZywgaW5kaWNhdGVzIHRoZSBjbG9jayBuYW1lCistIGNsb2NrLW91dHB1dC1uYW1lczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZywgaW5kaWNhdGVzIHRoZSBuYW1lcyBvZgorCW91dHB1dCBjbG9ja3MKKy0gcmVnOiBTaG91bGQgYmUgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIG9mIGNsb2NrIGJsb2NrIGJhc2UgYWRkcmVzcy4KKwlUaGUgbGVuZ3RoIHNob3VsZCBiZSA0LgorCitFeGFtcGxlIGZvciBjbG9jayBibG9jayBhbmQgY2xvY2sgcHJvdmlkZXI6CisvIHsKKwljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMzMzMzMzMz47CisJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMS4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIjsKKwkJfTsKKworCQlwbGwxOiBwbGwxQDgyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMSIsICJwbGwxLWRpdjIiOworCQl9OworCisJCW11eDA6IG11eDBAMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgwIjsKKwkJfTsKKworCQltdXgxOiBtdXgxQDIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgxIjsKKwkJfTsKKwl9OworICB9CisKK0V4YW1wbGUgZm9yIGNsb2NrIGNvbnN1bWVyOgorCisvIHsKKwljcHUwOiBQb3dlclBDLGU1NTAwQDAgeworCQkuLi4KKwkJY2xvY2tzID0gPCZtdXgwPjsKKwkJLi4uCisJfTsKKyAgfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9iY20yODM1LWRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2JjbTI4MzUtZG1hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk2MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9iY20yODM1LWRtYS50eHQKQEAgLTAsMCArMSw1NyBAQAorKiBCQ00yODM1IERNQSBjb250cm9sbGVyCisKK1RoZSBCQ00yODM1IERNQSBjb250cm9sbGVyIGhhcyAxNiBjaGFubmVscyBpbiB0b3RhbC4KK09ubHkgdGhlIGxvd2VyIDEzIGNoYW5uZWxzIGhhdmUgYW4gYXNzb2NpYXRlZCBJUlEuCitTb21lIGFyYml0cmFyeSBjaGFubmVscyBhcmUgdXNlZCBieSB0aGUgZmlybXdhcmUKKygxLDMsNiw3IGluIHRoZSBjdXJyZW50IGZpcm13YXJlIHZlcnNpb24pLgorVGhlIGNoYW5uZWxzIDAsMiBhbmQgMyBoYXZlIHNwZWNpYWwgZnVuY3Rpb25hbGl0eQorYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSB0aGUgZHJpdmVyLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImJyY20sYmNtMjgzNS1kbWEiLgorLSByZWc6IFNob3VsZCBjb250YWluIERNQSByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aC4KKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gdGhlIERNQSBpbnRlcnJ1cHRzIGFzc29jaWF0ZWQKKwkJdG8gdGhlIERNQSBjaGFubmVscyBpbiBhc2NlbmRpbmcgb3JkZXIuCistICNkbWEtY2VsbHM6IE11c3QgYmUgPDE+LCB0aGUgY2VsbCBpbiB0aGUgZG1hcyBwcm9wZXJ0eSBvZiB0aGUKKwkJY2xpZW50IGRldmljZSByZXByZXNlbnRzIHRoZSBEUkVRIG51bWJlci4KKy0gYnJjbSxkbWEtY2hhbm5lbC1tYXNrOiBCaXQgbWFzayByZXByZXNlbnRpbmcgdGhlIGNoYW5uZWxzCisJCQkgbm90IHVzZWQgYnkgdGhlIGZpcm13YXJlIGluIGFzY2VuZGluZyBvcmRlciwKKwkJCSBpLmUuIGZpcnN0IGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gTFNCLgorCitFeGFtcGxlOgorCitkbWE6IGRtYUA3ZTAwNzAwMCB7CisJY29tcGF0aWJsZSA9ICJicmNtLGJjbTI4MzUtZG1hIjsKKwlyZWcgPSA8MHg3ZTAwNzAwMCAweGYwMD47CisJaW50ZXJydXB0cyA9IDwxIDE2PiwKKwkJICAgICA8MSAxNz4sCisJCSAgICAgPDEgMTg+LAorCQkgICAgIDwxIDE5PiwKKwkJICAgICA8MSAyMD4sCisJCSAgICAgPDEgMjE+LAorCQkgICAgIDwxIDIyPiwKKwkJICAgICA8MSAyMz4sCisJCSAgICAgPDEgMjQ+LAorCQkgICAgIDwxIDI1PiwKKwkJICAgICA8MSAyNj4sCisJCSAgICAgPDEgMjc+LAorCQkgICAgIDwxIDI4PjsKKworCSNkbWEtY2VsbHMgPSA8MT47CisJYnJjbSxkbWEtY2hhbm5lbC1tYXNrID0gPDB4N2YzNT47Cit9OworCitETUEgY2xpZW50cyBjb25uZWN0ZWQgdG8gdGhlIEJDTTI4MzUgRE1BIGNvbnRyb2xsZXIgbXVzdCB1c2UgdGhlIGZvcm1hdAorZGVzY3JpYmVkIGluIHRoZSBkbWEudHh0IGZpbGUsIHVzaW5nIGEgdHdvLWNlbGwgc3BlY2lmaWVyIGZvciBlYWNoIGNoYW5uZWwuCisKK0V4YW1wbGU6CisKK2JjbTI4MzVfaTJzOiBpMnNAN2UyMDMwMDAgeworCWNvbXBhdGlibGUgPSAiYnJjbSxiY20yODM1LWkycyI7CisJcmVnID0gPAkweDdlMjAzMDAwIDB4MjA+LAorCSAgICAgIDwgMHg3ZTEwMTA5OCAweDAyPjsKKworCWRtYXMgPSA8JmRtYSAyPiwKKwkgICAgICAgPCZkbWEgMz47CisJZG1hLW5hbWVzID0gInR4IiwgInJ4IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQKaW5kZXggNGZhODE0ZC4uNjhiODNlYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZnNsLWlteC1zZG1hLnR4dApAQCAtNDIsNiArNDIsNyBAQAogCTE5CUlQVSBNZW1vcnkKIAkyMAlBU1JDCiAJMjEJRVNBSQorCTIyCVNTSSBEdWFsIEZJRk8JKG5lZWRzIGZpcm13YXJlIHZlciA+PSAyKQogCiBUaGUgdGhpcmQgY2VsbCBzcGVjaWZpZXMgdGhlIHRyYW5zZmVyIHByaW9yaXR5IGFzIGJlbG93LgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL21veGEsbW94YXJ0LWRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL21veGEsbW94YXJ0LWRtYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5ZjM1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvbW94YSxtb3hhcnQtZG1hLnR4dApAQCAtMCwwICsxLDQ1IEBACitNT1hBIEFSVCBETUEgQ29udHJvbGxlcgorCitTZWUgZG1hLnR4dCBmaXJzdAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOglNdXN0IGJlICJtb3hhLG1veGFydC1kbWEiCistIHJlZyA6CQlTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzIDoJU2hvdWxkIGNvbnRhaW4gYW4gaW50ZXJydXB0LXNwZWNpZmllciBmb3IgdGhlIHNvbGUKKwkJaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCistICNkbWEtY2VsbHMgOglTaG91bGQgYmUgMSwgYSBzaW5nbGUgY2VsbCBob2xkaW5nIGEgbGluZSByZXF1ZXN0IG51bWJlcgorCitFeGFtcGxlOgorCisJZG1hOiBkbWFAOTA1MDAwMDAgeworCQljb21wYXRpYmxlID0gIm1veGEsbW94YXJ0LWRtYSI7CisJCXJlZyA9IDwweDkwNTAwMDgwIDB4NDA+OworCQlpbnRlcnJ1cHRzID0gPDI0IDA+OworCQkjZG1hLWNlbGxzID0gPDE+OworCX07CisKKworQ2xpZW50czoKKworRE1BIGNsaWVudHMgY29ubmVjdGVkIHRvIHRoZSBNT1hBIEFSVCBETUEgY29udHJvbGxlciBtdXN0IHVzZSB0aGUgZm9ybWF0CitkZXNjcmliZWQgaW4gdGhlIGRtYS50eHQgZmlsZSwgdXNpbmcgYSB0d28tY2VsbCBzcGVjaWZpZXIgZm9yIGVhY2ggY2hhbm5lbDoKK2EgcGhhbmRsZSBwbHVzIG9uZSBpbnRlZ2VyIGNlbGxzLgorVGhlIHR3byBjZWxscyBpbiBvcmRlciBhcmU6CisKKzEuIEEgcGhhbmRsZSBwb2ludGluZyB0byB0aGUgRE1BIGNvbnRyb2xsZXIuCisyLiBQZXJpcGhlcmFsIGlkZW50aWZpZXIgZm9yIHRoZSBoYXJkd2FyZSBoYW5kc2hha2luZyBpbnRlcmZhY2UuCisKK0V4YW1wbGU6CitVc2Ugc3BlY2lmaWMgcmVxdWVzdCBsaW5lIHBhc3NpbmcgZnJvbSBkbWEKK0ZvciBleGFtcGxlLCBNTUMgcmVxdWVzdCBsaW5lIGlzIDUKKworCXNkaGNpOiBzZGhjaUA5OGUwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAibW94YSxtb3hhcnQtc2RoY2kiOworCQlyZWcgPSA8MHg5OGUwMDAwMCAweDVDPjsKKwkJaW50ZXJydXB0cyA9IDw1IDA+OworCQljbG9ja3MgPSA8JmNsa19hcGI+OworCQlkbWFzID0gIDwmZG1hIDU+LAorCQkJPCZkbWEgNT47CisJCWRtYS1uYW1lcyA9ICJ0eCIsICJyeCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncHUvbnZpZGlhLHRlZ3JhMjAtaG9zdDF4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncHUvbnZpZGlhLHRlZ3JhMjAtaG9zdDF4LnR4dAppbmRleCBhYjQ1YzAyLi5lZmFlZWM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3B1L252aWRpYSx0ZWdyYTIwLWhvc3QxeC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwdS9udmlkaWEsdGVncmEyMC1ob3N0MXgudHh0CkBAIC0xMTgsNiArMTE4LDkgQEAKICAgICBTZWUgLi4vcmVzZXQvcmVzZXQudHh0IGZvciBkZXRhaWxzLgogICAtIHJlc2V0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgogICAgIC0gZGMKKyAgLSBudmlkaWEsaGVhZDogVGhlIG51bWJlciBvZiB0aGUgZGlzcGxheSBjb250cm9sbGVyIGhlYWQuIFRoaXMgaXMgdXNlZCB0bworICAgIHNldHVwIHRoZSB2YXJpb3VzIHR5cGVzIG9mIG91dHB1dCB0byByZWNlaXZlIHZpZGVvIGRhdGEgZnJvbSB0aGUgZ2l2ZW4KKyAgICBoZWFkLgogCiAgIEVhY2ggZGlzcGxheSBjb250cm9sbGVyIG5vZGUgaGFzIGEgY2hpbGQgbm9kZSwgbmFtZWQgInJnYiIsIHRoYXQgcmVwcmVzZW50cwogICB0aGUgUkdCIG91dHB1dCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2xsZXIuIEl0IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKQEAgLTEyNSw2ICsxMjgsNyBAQAogICAtIG52aWRpYSxkZGMtaTJjLWJ1czogcGhhbmRsZSBvZiBhbiBJMkMgY29udHJvbGxlciB1c2VkIGZvciBEREMgRURJRCBwcm9iaW5nCiAgIC0gbnZpZGlhLGhwZC1ncGlvOiBzcGVjaWZpZXMgYSBHUElPIHVzZWQgZm9yIGhvdHBsdWcgZGV0ZWN0aW9uCiAgIC0gbnZpZGlhLGVkaWQ6IHN1cHBsaWVzIGEgYmluYXJ5IEVESUQgYmxvYgorICAtIG52aWRpYSxwYW5lbDogcGhhbmRsZSBvZiBhIGRpc3BsYXkgcGFuZWwKIAogLSBoZG1pOiBIaWdoIERlZmluaXRpb24gTXVsdGltZWRpYSBJbnRlcmZhY2UKIApAQCAtMTQ5LDYgKzE1Myw3IEBACiAgIC0gbnZpZGlhLGRkYy1pMmMtYnVzOiBwaGFuZGxlIG9mIGFuIEkyQyBjb250cm9sbGVyIHVzZWQgZm9yIEREQyBFRElEIHByb2JpbmcKICAgLSBudmlkaWEsaHBkLWdwaW86IHNwZWNpZmllcyBhIEdQSU8gdXNlZCBmb3IgaG90cGx1ZyBkZXRlY3Rpb24KICAgLSBudmlkaWEsZWRpZDogc3VwcGxpZXMgYSBiaW5hcnkgRURJRCBibG9iCisgIC0gbnZpZGlhLHBhbmVsOiBwaGFuZGxlIG9mIGEgZGlzcGxheSBwYW5lbAogCiAtIHR2bzogVFYgZW5jb2RlciBvdXRwdXQKIApAQCAtMTY5LDExICsxNzQsMjEgQEAKICAgLSBjbG9jay1uYW1lczogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZW50cmllczoKICAgICAtIGRzaQogICAgICAgVGhpcyBNVVNUIGJlIHRoZSBmaXJzdCBlbnRyeS4KKyAgICAtIGxwCiAgICAgLSBwYXJlbnQKICAgLSByZXNldHM6IE11c3QgY29udGFpbiBhbiBlbnRyeSBmb3IgZWFjaCBlbnRyeSBpbiByZXNldC1uYW1lcy4KICAgICBTZWUgLi4vcmVzZXQvcmVzZXQudHh0IGZvciBkZXRhaWxzLgogICAtIHJlc2V0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgogICAgIC0gZHNpCisgIC0gbnZpZGlhLG1pcGktY2FsaWJyYXRlOiBTaG91bGQgY29udGFpbiBhIHBoYW5kbGUgYW5kIGEgc3BlY2lmaWVyIHNwZWNpZnlpbmcKKyAgICB3aGljaCBwYWRzIGFyZSB1c2VkIGJ5IHRoaXMgRFNJIG91dHB1dCBhbmQgbmVlZCB0byBiZSBjYWxpYnJhdGVkLiBTZWUgYWxzbworICAgIC4uL21pcGkvbnZpZGlhLHRlZ3JhMTE0LW1pcGkudHh0LgorCisgIE9wdGlvbmFsIHByb3BlcnRpZXM6CisgIC0gbnZpZGlhLGRkYy1pMmMtYnVzOiBwaGFuZGxlIG9mIGFuIEkyQyBjb250cm9sbGVyIHVzZWQgZm9yIEREQyBFRElEIHByb2JpbmcKKyAgLSBudmlkaWEsaHBkLWdwaW86IHNwZWNpZmllcyBhIEdQSU8gdXNlZCBmb3IgaG90cGx1ZyBkZXRlY3Rpb24KKyAgLSBudmlkaWEsZWRpZDogc3VwcGxpZXMgYSBiaW5hcnkgRURJRCBibG9iCisgIC0gbnZpZGlhLHBhbmVsOiBwaGFuZGxlIG9mIGEgZGlzcGxheSBwYW5lbAogCiBFeGFtcGxlOgogCkBAIC0yNTMsNyArMjY4LDcgQEAKIAkJCWludGVycnVwdHMgPSA8MCA3MyAweDA0PjsKIAkJCWNsb2NrcyA9IDwmdGVncmFfY2FyIFRFR1JBMjBfQ0xLX0RJU1AxPiwKIAkJCQkgPCZ0ZWdyYV9jYXIgVEVHUkEyMF9DTEtfUExMX1A+OwotCQkJY2xvY2stbmFtZXMgPSAiZGlzcDEiLCAicGFyZW50IjsKKwkJCWNsb2NrLW5hbWVzID0gImRjIiwgInBhcmVudCI7CiAJCQlyZXNldHMgPSA8JnRlZ3JhX2NhciAyNz47CiAJCQlyZXNldC1uYW1lcyA9ICJkYyI7CiAKQEAgLTI2OCw3ICsyODMsNyBAQAogCQkJaW50ZXJydXB0cyA9IDwwIDc0IDB4MDQ+OwogCQkJY2xvY2tzID0gPCZ0ZWdyYV9jYXIgVEVHUkEyMF9DTEtfRElTUDI+LAogCQkJCSA8JnRlZ3JhX2NhciBURUdSQTIwX0NMS19QTExfUD47Ci0JCQljbG9jay1uYW1lcyA9ICJkaXNwMiIsICJwYXJlbnQiOworCQkJY2xvY2stbmFtZXMgPSAiZGMiLCAicGFyZW50IjsKIAkJCXJlc2V0cyA9IDwmdGVncmFfY2FyIDI2PjsKIAkJCXJlc2V0LW5hbWVzID0gImRjIjsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2xzaSx6ZXZpby1pbnRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9sc2ksemV2aW8taW50Yy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlMzhlNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9sc2ksemV2aW8taW50Yy50eHQKQEAgLTAsMCArMSwxOCBAQAorVEktTlNQSVJFIGludGVycnVwdCBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IENvbXBhdGlibGUgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlICJsc2ksemV2aW8taW50YyIuCisKKy0gcmVnOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisJcmVnaW9uLgorCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorCitFeGFtcGxlOgorCitpbnRlcnJ1cHQtY29udHJvbGxlciB7CisJY29tcGF0aWJsZSA9ICJsc2ksemV2aW8taW50YyI7CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJcmVnID0gPDB4REMwMDAwMDAgMHgxMDAwPjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS9leHlub3MtanBlZy1jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvZXh5bm9zLWpwZWctY29kZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2I3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvZXh5bm9zLWpwZWctY29kZWMudHh0CkBAIC0wLDAgKzEsMTEgQEAKK1NhbXN1bmcgUzVQL0VYWU5PUyBTb0Mgc2VyaWVzIEpQRUcgY29kZWMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlCTogc2hvdWxkIGJlIG9uZSBvZjoKKwkJICAic2Ftc3VuZyxzNXB2MjEwLWpwZWciLCAic2Ftc3VuZyxleHlub3M0MjEwLWpwZWciOworLSByZWcJCTogYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBKUEVHIGNvZGVjIElQIHJlZ2lzdGVyIHNldDsKKy0gaW50ZXJydXB0cwk6IHNwZWNpZmllcyB0aGUgSlBFRyBjb2RlYyBJUCBpbnRlcnJ1cHQ7CistIGNsb2Nrcwk6IHNob3VsZCBjb250YWluIHRoZSBKUEVHIGNvZGVjIElQIGdhdGUgY2xvY2sgc3BlY2lmaWVyLCBmcm9tIHRoZQorCQkgIGNvbW1vbiBjbG9jayBiaW5kaW5nczsKKy0gY2xvY2stbmFtZXMJOiBzaG91bGQgY29udGFpbiAianBlZyIgZW50cnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvc2Ftc3VuZy1zNWs1YmFmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS9zYW1zdW5nLXM1azViYWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTFlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvc2Ftc3VuZy1zNWs1YmFmLnR4dApAQCAtMCwwICsxLDU4IEBACitTYW1zdW5nIFM1SzVCQUYgVVhHQSAxLzUiIDJNIENNT1MgSW1hZ2UgU2Vuc29yIHdpdGggZW1iZWRkZWQgU29DIElTUAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlCSAgOiAic2Ftc3VuZyxzNWs1YmFmIjsKKy0gcmVnCQkgIDogSTJDIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcjsKKy0gdmRkYS1zdXBwbHkJICA6IGFuYWxvZyBwb3dlciBzdXBwbHkgMi44ViAoMi42ViB0byAzLjBWKTsKKy0gdmRkcmVnLXN1cHBseQkgIDogcmVndWxhdG9yIGlucHV0IHBvd2VyIHN1cHBseSAxLjhWICgxLjdWIHRvIDEuOVYpCisJCSAgICBvciAyLjhWICgyLjZWIHRvIDMuMCk7CistIHZkZGlvLXN1cHBseQkgIDogSS9PIHBvd2VyIHN1cHBseSAxLjhWICgxLjY1ViB0byAxLjk1VikKKwkJICAgIG9yIDIuOFYgKDIuNVYgdG8gMy4xVik7CistIHN0YnluLWdwaW9zCSAgOiBHUElPIGNvbm5lY3RlZCB0byBTVERCWU4gcGluOworLSByc3RuLWdwaW9zCSAgOiBHUElPIGNvbm5lY3RlZCB0byBSU1ROIHBpbjsKKy0gY2xvY2tzCSAgOiBsaXN0IG9mIHBoYW5kbGUgYW5kIGNsb2NrIHNwZWNpZmllciBwYWlycworCQkgICAgYWNjb3JkaW5nIHRvIGNvbW1vbiBjbG9jayBiaW5kaW5ncyBmb3IgdGhlCisJCSAgICBjbG9ja3MgZGVzY3JpYmVkIGluIGNsb2NrLW5hbWVzOworLSBjbG9jay1uYW1lcwkgIDogc2hvdWxkIGluY2x1ZGUgIm1jbGsiIGZvciB0aGUgc2Vuc29yJ3MgbWFzdGVyIGNsb2NrOworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGNsb2NrLWZyZXF1ZW5jeSA6IHRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlICJtY2xrIiBjbG9jayBzaG91bGQgYmUKKwkJICAgIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSwgaW4gSHo7IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90CisJCSAgICBzcGVjaWZpZWQgZGVmYXVsdCAyNCBNSHogdmFsdWUgd2lsbCBiZSB1c2VkLgorCitUaGUgZGV2aWNlIG5vZGUgc2hvdWxkIGNvbnRhaW4gb25lICdwb3J0JyBjaGlsZCBub2RlIHdpdGggb25lIGNoaWxkICdlbmRwb2ludCcKK25vZGUsIGFjY29yZGluZyB0byB0aGUgYmluZGluZ3MgZGVmaW5lZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvCittZWRpYS92aWRlby1pbnRlcmZhY2VzLnR4dC4gVGhlIGZvbGxvd2luZyBhcmUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aG9zZQorbm9kZXMuCisKK2VuZHBvaW50IG5vZGUKKy0tLS0tLS0tLS0tLS0KKworLSBkYXRhLWxhbmVzIDogKG9wdGlvbmFsKSBzcGVjaWZpZXMgTUlQSSBDU0ktMiBkYXRhIGxhbmVzIGFzIGNvdmVyZWQgaW4KKwkgICAgICAgdmlkZW8taW50ZXJmYWNlcy50eHQuIElmIHByZXNlbnQgaXQgc2hvdWxkIGJlIDwxPiAtIHRoZSBkZXZpY2UKKwkgICAgICAgc3VwcG9ydHMgb25seSBvbmUgZGF0YSBsYW5lIHdpdGhvdXQgcmUtbWFwcGluZy4KKworRXhhbXBsZToKKworczVrNWJhZnhAMmQgeworCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNWs1YmFmIjsKKwlyZWcgPSA8MHgyZD47CisJdmRkYS1zdXBwbHkgPSA8JmNhbV9pb19lbl9yZWc+OworCXZkZHJlZy1zdXBwbHkgPSA8JnZ0X2NvcmVfMTV2X3JlZz47CisJdmRkaW8tc3VwcGx5ID0gPCZ2dGNhbV9yZWc+OworCXN0YnluLWdwaW9zID0gPCZncGwyIDAgMT47CisJcnN0bi1ncGlvcyA9IDwmZ3BsMiAxIDE+OworCWNsb2NrLW5hbWVzID0gIm1jbGsiOworCWNsb2NrcyA9IDwmY2xvY2tfY2FtIDA+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisKKwlwb3J0IHsKKwkJczVrNWJhZnhfZXA6IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmY3NpczFfZXA+OworCQkJZGF0YS1sYW5lcyA9IDwxPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXBpL2RzaS9taXBpLWRzaS1idXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pcGkvZHNpL21pcGktZHNpLWJ1cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczYzI3MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXBpL2RzaS9taXBpLWRzaS1idXMudHh0CkBAIC0wLDAgKzEsOTggQEAKK01JUEkgRFNJIChEaXNwbGF5IFNlcmlhbCBJbnRlcmZhY2UpIGJ1c3NlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNSVBJIERpc3BsYXkgU2VyaWFsIEludGVyZmFjZSBzcGVjaWZpZXMgYSBzZXJpYWwgYnVzIGFuZCBhIHByb3RvY29sIGZvcgorY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGEgaG9zdCBhbmQgdXAgdG8gZm91ciBwZXJpcGhlcmFscy4gVGhpcyBkb2N1bWVudCB3aWxsCitkZWZpbmUgdGhlIHN5bnRheCB1c2VkIHRvIHJlcHJlc2VudCBhIERTSSBidXMgaW4gYSBkZXZpY2UgdHJlZS4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgRFNJIGJ1cy1zcGVjaWZpYyBwcm9wZXJ0aWVzIG9ubHkgb3IgZGVmaW5lcyBleGlzdGluZworc3RhbmRhcmQgcHJvcGVydGllcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgRFNJIGJ1cy4KKworRWFjaCBEU0kgaG9zdCBwcm92aWRlcyBhIERTSSBidXMuIFRoZSBEU0kgaG9zdCBjb250cm9sbGVyJ3Mgbm9kZSBjb250YWlucyBhCitzZXQgb2YgcHJvcGVydGllcyB0aGF0IGNoYXJhY3Rlcml6ZSB0aGUgYnVzLiBDaGlsZCBub2RlcyBkZXNjcmliZSBpbmRpdmlkdWFsCitwZXJpcGhlcmFscyBvbiB0aGF0IGJ1cy4KKworVGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoYXQgb25seSBhIHNpbmdsZSBwZXJpcGhlcmFsIGlzIGNvbm5lY3RlZCB0byBhIERTSQoraG9zdC4gRXhwZXJpZW5jZSBzaG93cyB0aGF0IHRoaXMgaXMgdHJ1ZSBmb3IgdGhlIGxhcmdlIG1ham9yaXR5IG9mIHNldHVwcy4KKworRFNJIGhvc3QKKy0tLS0tLS0tCisKK0luIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGFuZCB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgYnVzIG9mCithIERTSSBob3N0LCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXBwbHkgdG8gYSBub2RlIHJlcHJlc2VudGluZyBhIERTSSBob3N0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSAjYWRkcmVzcy1jZWxsczogVGhlIG51bWJlciBvZiBjZWxscyByZXF1aXJlZCB0byByZXByZXNlbnQgYW4gYWRkcmVzcyBvbiB0aGUKKyAgYnVzLiBEU0kgcGVyaXBoZXJhbHMgYXJlIGFkZHJlc3NlZCB1c2luZyBhIDItYml0IHZpcnR1YWwgY2hhbm5lbCBudW1iZXIsIHNvCisgIGEgbWF4aW11bSBvZiA0IGRldmljZXMgY2FuIGJlIGFkZHJlc3NlZCBvbiBhIHNpbmdsZSBidXMuIEhlbmNlIHRoZSB2YWx1ZSBvZgorICB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSAxLgorLSAjc2l6ZS1jZWxsczogU2hvdWxkIGJlIDAuIFRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCBtYWtlcyBzZW5zZSB0byB1c2UgYQorICBkaWZmZXJlbnQgdmFsdWUgaGVyZS4gU2VlIGJlbG93LgorCitEU0kgcGVyaXBoZXJhbAorLS0tLS0tLS0tLS0tLS0KKworUGVyaXBoZXJhbHMgYXJlIHJlcHJlc2VudGVkIGFzIGNoaWxkIG5vZGVzIG9mIHRoZSBEU0kgaG9zdCdzIG5vZGUuIFByb3BlcnRpZXMKK2Rlc2NyaWJlZCBoZXJlIGFwcGx5IHRvIGFsbCBEU0kgcGVyaXBoZXJhbHMsIGJ1dCBpbmRpdmlkdWFsIGJpbmRpbmdzIG1heSB3YW50Cit0byBkZWZpbmUgYWRkaXRpb25hbCwgZGV2aWNlLXNwZWNpZmljIHByb3BlcnRpZXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIHJlZzogVGhlIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgb2YgYSBEU0kgcGVyaXBoZXJhbC4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UKKyAgZnJvbSAwIHRvIDMuCisKK1NvbWUgRFNJIHBlcmlwaGVyYWxzIHJlc3BvbmQgdG8gbW9yZSB0aGFuIGEgc2luZ2xlIHZpcnR1YWwgY2hhbm5lbC4gSW4gdGhhdAorY2FzZSB0d28gYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGNhbiBiZSBjaG9zZW46CistIFRoZSByZWcgcHJvcGVydHkgY2FuIHRha2UgbXVsdGlwbGUgZW50cmllcywgb25lIGZvciBlYWNoIHZpcnR1YWwgY2hhbm5lbAorICB0aGF0IHRoZSBwZXJpcGhlcmFsIHJlc3BvbmRzIHRvLgorLSBJZiB0aGUgdmlydHVhbCBjaGFubmVscyB0aGF0IGEgcGVyaXBoZXJhbCByZXNwb25kcyB0byBhcmUgY29uc2VjdXRpdmUsIHRoZQorICAjc2l6ZS1jZWxscyBjYW4gYmUgc2V0IHRvIDEuIFRoZSBmaXJzdCBjZWxsIG9mIGVhY2ggZW50cnkgaW4gdGhlIHJlZworICBwcm9wZXJ0eSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCB2aXJ0dWFsIGNoYW5uZWwgYW5kIHRoZSBzZWNvbmQgY2VsbCBpcworICB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZpcnR1YWwgY2hhbm5lbHMuCisKK0V4YW1wbGUKKy0tLS0tLS0KKworCWRzaS1ob3N0IHsKKwkJLi4uCisKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCS8qIHBlcmlwaGVyYWwgcmVzcG9uZHMgdG8gdmlydHVhbCBjaGFubmVsIDAgKi8KKwkJcGVyaXBoZXJhbEAwIHsKKwkJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJCXJlZyA9IDwwPjsKKwkJfTsKKworCQkuLi4KKwl9OworCisJZHNpLWhvc3QgeworCQkuLi4KKworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJLyogcGVyaXBoZXJhbCByZXNwb25kcyB0byB2aXJ0dWFsIGNoYW5uZWxzIDAgYW5kIDIgKi8KKwkJcGVyaXBoZXJhbEAwIHsKKwkJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJCXJlZyA9IDwwLCAyPjsKKwkJfTsKKworCQkuLi4KKwl9OworCisJZHNpLWhvc3QgeworCQkuLi4KKworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJLyogcGVyaXBoZXJhbCByZXNwb25kcyB0byB2aXJ0dWFsIGNoYW5uZWxzIDEsIDIgYW5kIDMgKi8KKwkJcGVyaXBoZXJhbEAxIHsKKwkJCWNvbXBhdGlibGUgPSAiLi4uIjsKKwkJCXJlZyA9IDwxIDM+OworCQl9OworCisJCS4uLgorCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlwaS9udmlkaWEsdGVncmExMTQtbWlwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlwaS9udmlkaWEsdGVncmExMTQtbWlwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhMjVjZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXBpL252aWRpYSx0ZWdyYTExNC1taXBpLnR4dApAQCAtMCwwICsxLDQxIEBACitOVklESUEgVGVncmEgTUlQSSBwYWQgY2FsaWJyYXRpb24gY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibnZpZGlhLHRlZ3JhPGNoaXA+LW1pcGkiCistIHJlZzogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGNvbnRyb2xsZXIncyByZWdpc3RlcnMuCistIGNsb2NrczogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorICBTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKy0gY2xvY2stbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisgIC0gbWlwaS1jYWwKKy0gI252aWRpYSxtaXBpLWNhbGlicmF0ZS1jZWxsczogU2hvdWxkIGJlIDEuIFRoZSBjZWxsIGlzIGEgYml0bWFzayBvZiB0aGUgcGFkcworICB0aGF0IG5lZWQgdG8gYmUgY2FsaWJyYXRlZCBmb3IgYSBnaXZlbiBkZXZpY2UuCisKK1VzZXIgbm9kZXMgbmVlZCB0byBjb250YWluIGFuIG52aWRpYSxtaXBpLWNhbGlicmF0ZSBwcm9wZXJ0eSB0aGF0IGhhcyBhCitwaGFuZGxlIHRvIHJlZmVyIHRvIHRoZSBjYWxpYnJhdGlvbiBjb250cm9sbGVyIG5vZGUgYW5kIGEgYml0bWFzayBvZiB0aGUgcGFkcwordGhhdCBuZWVkIHRvIGJlIGNhbGlicmF0ZWQuCisKK0V4YW1wbGU6CisKKwltaXBpOiBtaXBpQDcwMGUzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMTQtbWlwaSI7CisJCXJlZyA9IDwweDcwMGUzMDAwIDB4MTAwPjsKKwkJY2xvY2tzID0gPCZ0ZWdyYV9jYXIgVEVHUkExMTRfQ0xLX01JUElfQ0FMPjsKKwkJY2xvY2stbmFtZXMgPSAibWlwaS1jYWwiOworCQkjbnZpZGlhLG1pcGktY2FsaWJyYXRlLWNlbGxzID0gPDE+OworCX07CisKKwkuLi4KKworCWhvc3QxeEA1MDAwMDAwMCB7CisJCS4uLgorCisJCWRzaUA1NDMwMDAwMCB7CisJCQkuLi4KKworCQkJbnZpZGlhLG1pcGktY2FsaWJyYXRlID0gPCZtaXBpIDB4MDYwPjsKKworCQkJLi4uCisJCX07CisKKwkJLi4uCisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMva29uYS1zZGhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2tvbmEtc2RoY2kudHh0CmluZGV4IDc4OWZiMDcuLmFhYmEyNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMva29uYS1zZGhjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9rb25hLXNkaGNpLnR4dApAQCAtNiwxMiArNiwxNiBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiYnJjbSxrb25hLXNkaGNpIgogLSBERVBSRUNBVEVEOiBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJiY20sa29uYS1zZGhjaSIKKy0gY2xvY2tzOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIHBhaXIgb2YgdGhlIGV4dGVybmFsIGNsb2NrCisKK1JlZmVyIHRvIGNsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGdlbmVyaWMgY2xvY2sgY29uc3VtZXIgcHJvcGVydGllcy4KIAogRXhhbXBsZToKIAogc2RpbzI6IHNkaW9AMHgzZjFhMDAwMCB7CiAJY29tcGF0aWJsZSA9ICJicmNtLGtvbmEtc2RoY2kiOwogCXJlZyA9IDwweDNmMWEwMDAwIDB4MTAwMDA+OworCWNsb2NrcyA9IDwmc2RpbzNfY2xrPjsKIAlpbnRlcnJ1cHRzID0gPDB4MCA3NCAweDQ+OwogfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbGx3aW5uZXIsc3VuNGktZW1hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FsbHdpbm5lcixzdW40aS1lbWFjLnR4dAppbmRleCBiOTBiZmNkLi44NjNkNWI4MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbGx3aW5uZXIsc3VuNGktZW1hYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbGx3aW5uZXIsc3VuNGktZW1hYy50eHQKQEAgLTEsNyArMSw4IEBACiAqIEFsbHdpbm5lciBFTUFDIGV0aGVybmV0IGNvbnRyb2xsZXIKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNGktZW1hYyIuCistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLWExMC1lbWFjIiAoRGVwcmVjYXRlZDoKKyAgICAgICAgICAgICAgImFsbHdpbm5lcixzdW40aS1lbWFjIikKIC0gcmVnOiBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KIC0gaW50ZXJydXB0czogaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlCiAtIHBoeTogQSBwaGFuZGxlIHRvIGEgcGh5IG5vZGUgZGVmaW5pbmcgdGhlIFBIWSBhZGRyZXNzIChhcyB0aGUgcmVnCkBAIC0xNCw3ICsxNSw3IEBACiBFeGFtcGxlOgogCiBlbWFjOiBldGhlcm5ldEAwMWMwYjAwMCB7Ci0gICAgICAgY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktZW1hYyI7CisgICAgICAgY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWVtYWMiOwogICAgICAgIHJlZyA9IDwweDAxYzBiMDAwIDB4MTAwMD47CiAgICAgICAgaW50ZXJydXB0cyA9IDw1NT47CiAgICAgICAgY2xvY2tzID0gPCZhaGJfZ2F0ZXMgMTc+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbGx3aW5uZXIsc3VuNGktbWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FsbHdpbm5lcixzdW40aS1tZGlvLnR4dAppbmRleCAwMGI5ZjlhLi40ZWM1NjQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FsbHdpbm5lcixzdW40aS1tZGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FsbHdpbm5lcixzdW40aS1tZGlvLnR4dApAQCAtMSw3ICsxLDggQEAKICogQWxsd2lubmVyIEExMCBNRElPIEV0aGVybmV0IENvbnRyb2xsZXIgaW50ZXJmYWNlCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLW1kaW8iLgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImFsbHdpbm5lcixzdW40aS1hMTAtbWRpbyIKKyAgICAgICAgICAgICAgKERlcHJlY2F0ZWQ6ICJhbGx3aW5uZXIsc3VuNGktbWRpbyIpLgogLSByZWc6IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgpAQCAtOSw3ICsxMCw3IEBACiAKIEV4YW1wbGUgYXQgdGhlIFNvQyBsZXZlbDoKIG1kaW9AMDFjMGIwODAgewotCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLW1kaW8iOworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1tZGlvIjsKIAlyZWcgPSA8MHgwMWMwYjA4MCAweDE0PjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwwPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZGF2aW5jaV9lbWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZGF2aW5jaV9lbWFjLnR4dAppbmRleCBjYTA5MTFhLi42ZTM1NmQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RhdmluY2lfZW1hYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kYXZpbmNpX2VtYWMudHh0CkBAIC0xMCw4ICsxMCw2IEBACiAtIHRpLGRhdmluY2ktY3RybC1tb2QtcmVnLW9mZnNldDogb2Zmc2V0IHRvIGNvbnRyb2wgbW9kdWxlIHJlZ2lzdGVyCiAtIHRpLGRhdmluY2ktY3RybC1yYW0tb2Zmc2V0OiBvZmZzZXQgdG8gY29udHJvbCBtb2R1bGUgcmFtCiAtIHRpLGRhdmluY2ktY3RybC1yYW0tc2l6ZTogc2l6ZSBvZiBjb250cm9sIG1vZHVsZSByYW0KLS0gdGksZGF2aW5jaS1ybWlpLWVuOiB1c2UgUk1JSQotLSB0aSxkYXZpbmNpLW5vLWJkLXJhbTogaGFzIHRoZSBlbWFjIGNvbnRyb2xsZXIgQkQgUkFNCiAtIGludGVycnVwdHM6IGludGVycnVwdCBtYXBwaW5nIGZvciB0aGUgZGF2aW5jaSBlbWFjIGludGVycnVwdHMgc291cmNlczoKICAgICAgICAgICAgICAgNCBzb3VyY2VzOiA8UmVjZWl2ZSBUaHJlc2hvbGQgSW50ZXJydXB0CiAJCQkgIFJlY2VpdmUgSW50ZXJydXB0CkBAIC0yMiw2ICsyMCw4IEBACiAtIHBoeS1oYW5kbGU6IENvbnRhaW5zIGEgcGhhbmRsZSB0byBhbiBFdGhlcm5ldCBQSFkuCiAgICAgICAgICAgICAgIElmIGFic2VudCwgZGF2aW5jaV9lbWFjIGRyaXZlciBkZWZhdWx0cyB0byAxMDAvRlVMTC4KIC0gbG9jYWwtbWFjLWFkZHJlc3MgOiA2IGJ5dGVzLCBtYWMgYWRkcmVzcworLSB0aSxkYXZpbmNpLXJtaWktZW46IDEgYnl0ZSwgMSBtZWFucyB1c2UgUk1JSQorLSB0aSxkYXZpbmNpLW5vLWJkLXJhbTogYm9vbGVhbiwgZG9lcyBFTUFDIGhhdmUgQkQgUkFNPwogCiBFeGFtcGxlIChlbmJ3X2NtYyBib2FyZCk6CiAJZXRoMDogZW1hY0AxZTIwMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9hdW8sYjEwMWF3MDMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2F1byxiMTAxYXcwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlMDg4YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9hdW8sYjEwMWF3MDMudHh0CkBAIC0wLDAgKzEsNyBAQAorQVUgT3B0cm9uaWNzIENvcnBvcmF0aW9uIDEwLjEiIFdTVkdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhdW8sYjEwMWF3MDMiCisKK1RoaXMgYmluZGluZyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNpbXBsZS1wYW5lbCBiaW5kaW5nLCB3aGljaCBpcyBzcGVjaWZpZWQKK2luIHNpbXBsZS1wYW5lbC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvY2h1bmdod2EsY2xhYTEwMXdhMDFhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9jaHVuZ2h3YSxjbGFhMTAxd2EwMWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDYxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvY2h1bmdod2EsY2xhYTEwMXdhMDFhLnR4dApAQCAtMCwwICsxLDcgQEAKK0NodW5naHdhIFBpY3R1cmUgVHViZXMgTHRkLiAxMC4xIiBXWEdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJjaHVuZ2h3YSxjbGFhMTAxd2EwMWEiCisKK1RoaXMgYmluZGluZyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNpbXBsZS1wYW5lbCBiaW5kaW5nLCB3aGljaCBpcyBzcGVjaWZpZWQKK2luIHNpbXBsZS1wYW5lbC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvY2h1bmdod2EsY2xhYTEwMXdiMDMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2NodW5naHdhLGNsYWExMDF3YjAzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIyYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2NodW5naHdhLGNsYWExMDF3YjAzLnR4dApAQCAtMCwwICsxLDcgQEAKK0NodW5naHdhIFBpY3R1cmUgVHViZXMgTHRkLiAxMC4xIiBXWEdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJjaHVuZ2h3YSxjbGFhMTAxd2IwMyIKKworVGhpcyBiaW5kaW5nIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2ltcGxlLXBhbmVsIGJpbmRpbmcsIHdoaWNoIGlzIHNwZWNpZmllZAoraW4gc2ltcGxlLXBhbmVsLnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9wYW5hc29uaWMsdnZ4MTBmMDA0YjAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9wYW5hc29uaWMsdnZ4MTBmMDA0YjAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzI4YjAzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL3BhbmFzb25pYyx2dngxMGYwMDRiMDAudHh0CkBAIC0wLDAgKzEsNyBAQAorUGFuYXNvbmljIENvcnBvcmF0aW9uIDEwLjEiIFdVWEdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJwYW5hc29uaWMsdnZ4MTBmMDA0YjAwIgorCitUaGlzIGJpbmRpbmcgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW1wbGUtcGFuZWwgYmluZGluZywgd2hpY2ggaXMgc3BlY2lmaWVkCitpbiBzaW1wbGUtcGFuZWwudHh0IGluIHRoaXMgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL3NhbXN1bmcsbHRuMTAxbnQwNS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvc2Ftc3VuZyxsdG4xMDFudDA1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUyMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL3NhbXN1bmcsbHRuMTAxbnQwNS50eHQKQEAgLTAsMCArMSw3IEBACitTYW1zdW5nIEVsZWN0cm9uaWNzIDEwLjEiIFdTVkdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJzYW1zdW5nLGx0bjEwMW50MDUiCisKK1RoaXMgYmluZGluZyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNpbXBsZS1wYW5lbCBiaW5kaW5nLCB3aGljaCBpcyBzcGVjaWZpZWQKK2luIHNpbXBsZS1wYW5lbC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvc2ltcGxlLXBhbmVsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9zaW1wbGUtcGFuZWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDFiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvc2ltcGxlLXBhbmVsLnR4dApAQCAtMCwwICsxLDIxIEBACitTaW1wbGUgZGlzcGxheSBwYW5lbAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBwb3dlci1zdXBwbHk6IHJlZ3VsYXRvciB0byBwcm92aWRlIHRoZSBzdXBwbHkgdm9sdGFnZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBkZGMtaTJjLWJ1czogcGhhbmRsZSBvZiBhbiBJMkMgY29udHJvbGxlciB1c2VkIGZvciBEREMgRURJRCBwcm9iaW5nCistIGVuYWJsZS1ncGlvczogR1BJTyBwaW4gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHBhbmVsCistIGJhY2tsaWdodDogcGhhbmRsZSBvZiB0aGUgYmFja2xpZ2h0IGRldmljZSBhdHRhY2hlZCB0byB0aGUgcGFuZWwKKworRXhhbXBsZToKKworCXBhbmVsOiBwYW5lbCB7CisJCWNvbXBhdGlibGUgPSAiY3B0dCxjbGFhMTAxd2IwMSI7CisJCWRkYy1pMmMtYnVzID0gPCZwYW5lbGRkYz47CisKKwkJcG93ZXItc3VwcGx5ID0gPCZ2ZGRfcG5sX3JlZz47CisJCWVuYWJsZS1ncGlvcyA9IDwmZ3BpbyA5MCAwPjsKKworCQliYWNrbGlnaHQgPSA8JmJhY2tsaWdodD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CmluZGV4IGU5ZTIwZWMuLjE5Yzg0ZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dApAQCAtNDMsNyArNDMsNyBAQAogc291bmQgewogCWNvbXBhdGlibGUgPSAic2ltcGxlLWF1ZGlvLWNhcmQiOwogCXNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCA9ICJsZWZ0X2oiOwotCXNpbXBsZS1hdWRpby1yb3V0aW5nID0KKwlzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nID0KIAkJIk1JQ19JTiIsICJNaWMgSmFjayIsCiAJCSJIZWFkcGhvbmUgSmFjayIsICJIUF9PVVQiLAogCQkiRXh0IFNwayIsICJMSU5FX09VVCI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvYXRtZWwtd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9hdG1lbC13ZHQudHh0CmluZGV4IGZjZGQ0OGYuLmY5MGUyOTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9hdG1lbC13ZHQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9hdG1lbC13ZHQudHh0CkBAIC05LDExICs5LDM3IEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIHRpbWVvdXQtc2VjOiBjb250YWlucyB0aGUgd2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLgorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gV0RUIGludGVycnVwdC4KKy0gYXRtZWwsbWF4LWhlYXJ0YmVhdC1zZWMgOiBTaG91bGQgY29udGFpbiB0aGUgbWF4aW11bSBoZWFydGJlYXQgdmFsdWUgaW4KKwlzZWNvbmRzLiBUaGlzIHZhbHVlIHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIDE2LiBJdCBpcyB1c2VkIHRvCisJY29tcHV0ZSB0aGUgV0RWIGZpZWxkLgorLSBhdG1lbCxtaW4taGVhcnRiZWF0LXNlYyA6IFNob3VsZCBjb250YWluIHRoZSBtaW5pbXVtIGhlYXJ0YmVhdCB2YWx1ZSBpbgorCXNlY29uZHMuIFRoaXMgdmFsdWUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIG1heC1oZWFydGJlYXQtc2VjIHZhbHVlLgorCUl0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgV0REIGZpZWxkLgorLSBhdG1lbCx3YXRjaGRvZy10eXBlIDogU2hvdWxkIGJlICJoYXJkd2FyZSIgb3IgInNvZnR3YXJlIi4gSGFyZHdhcmUgd2F0Y2hkb2cKKwl1c2UgdGhlIGF0OTEgd2F0Y2hkb2cgcmVzZXQuIFNvZnR3YXJlIHdhdGNoZG9nIHVzZSB0aGUgd2F0Y2hkb2cKKwlpbnRlcnJ1cHQgdG8gdHJpZ2dlciBhIHNvZnR3YXJlIHJlc2V0LgorLSBhdG1lbCxyZXNldC10eXBlIDogU2hvdWxkIGJlICJwcm9jIiBvciAiYWxsIi4KKwkiYWxsIiA6IGFzc2VydCBwZXJpcGhlcmFscyBhbmQgcHJvY2Vzc29yIHJlc2V0IHNpZ25hbHMKKwkicHJvYyIgOiBhc3NlcnQgdGhlIHByb2Nlc3NvciByZXNldCBzaWduYWwKKwlUaGlzIGlzIHZhbGlkIG9ubHkgd2hlbiB1c2luZyAiaGFyZHdhcmUiIHdhdGNoZG9nLgorLSBhdG1lbCxkaXNhYmxlIDogU2hvdWxkIGJlIHByZXNlbnQgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgd2F0Y2hkb2cuCistIGF0bWVsLGlkbGUtaGFsdCA6IFNob3VsZCBiZSBwcmVzZW50IGlmIHlvdSB3YW50IHRvIHN0b3AgdGhlIHdhdGNoZG9nIHdoZW4KKwllbnRlcmluZyBpZGxlIHN0YXRlLgorLSBhdG1lbCxkYmctaGFsdCA6IFNob3VsZCBiZSBwcmVzZW50IGlmIHlvdSB3YW50IHRvIHN0b3AgdGhlIHdhdGNoZG9nIHdoZW4KKwllbnRlcmluZyBkZWJ1ZyBzdGF0ZS4KIAogRXhhbXBsZToKLQogCXdhdGNoZG9nQGZmZmZmZDQwIHsKIAkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC13ZHQiOwogCQlyZWcgPSA8MHhmZmZmZmQ0MCAweDEwPjsKLQkJdGltZW91dC1zZWMgPSA8MTA+OworCQlpbnRlcnJ1cHRzID0gPDEgSVJRX1RZUEVfTEVWRUxfSElHSCA3PjsKKwkJdGltZW91dC1zZWMgPSA8MTU+OworCQlhdG1lbCx3YXRjaGRvZy10eXBlID0gImhhcmR3YXJlIjsKKwkJYXRtZWwscmVzZXQtdHlwZSA9ICJhbGwiOworCQlhdG1lbCxkYmctaGFsdDsKKwkJYXRtZWwsaWRsZS1oYWx0OworCQlhdG1lbCxtYXgtaGVhcnRiZWF0LXNlYyA9IDwxNj47CisJCWF0bWVsLG1pbi1oZWFydGJlYXQtc2VjID0gPDA+OworCQlzdGF0dXMgPSAib2theSI7CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9kYXZpbmNpLXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvZGF2aW5jaS13ZHQudHh0CmluZGV4IDc1NTU4Y2MuLmU2MGI5YTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9kYXZpbmNpLXdkdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL2RhdmluY2ktd2R0LnR4dApAQCAtMSwxMiArMSwyNCBAQAotRGFWaW5jaSBXYXRjaGRvZyBUaW1lciAoV0RUKSBDb250cm9sbGVyCitUZXhhcyBJbnN0cnVtZW50cyBEYVZpbmNpL0tleXN0b25lIFdhdGNoZG9nIFRpbWVyIChXRFQpIENvbnRyb2xsZXIKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAidGksZGF2aW5jaS13ZHQiCistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLGRhdmluY2ktd2R0IiwgInRpLGtleXN0b25lLXdkdCIKIC0gcmVnIDogU2hvdWxkIGNvbnRhaW4gV0RUIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHRpbWVvdXQtc2VjIDogQ29udGFpbnMgdGhlIHdhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcworLSBjbG9ja3MgOiB0aGUgY2xvY2sgZmVlZGluZyB0aGUgd2F0Y2hkb2cgdGltZXIuCisJICAgTmVlZGVkIGlmIHBsYXRmb3JtIHVzZXMgY2xvY2tzLgorCSAgIFNlZSBjbG9jay1iaW5kaW5ncy50eHQKKworRG9jdW1lbnRhdGlvbjoKK0RhdmluY2kgRE02NDZ4IC0gaHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVlcjViL3NwcnVlcjViLnBkZgorS2V5c3RvbmUgLSBodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWd2NWEvc3BydWd2NWEucGRmCisKIEV4YW1wbGVzOgogCiB3ZHQ6IHdkdEAyMzIwMDAwIHsKIAljb21wYXRpYmxlID0gInRpLGRhdmluY2ktd2R0IjsKIAlyZWcgPSA8MHgwMjMyMDAwMCAweDgwPjsKKwl0aW1lb3V0LXNlYyA9IDwzMD47CisJY2xvY2tzID0gPCZjbGt3ZHRpbWVyMD47CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL2dwaW8td2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9ncGlvLXdkdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhZmVjMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9ncGlvLXdkdC50eHQKQEAgLTAsMCArMSwyMyBAQAorKiBHUElPLWNvbnRyb2xsZWQgV2F0Y2hkb2cKKworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGNvbnRhaW4gImxpbnV4LHdkdC1ncGlvIi4KKy0gZ3Bpb3M6IEZyb20gY29tbW9uIGdwaW8gYmluZGluZzsgZ3BpbyBjb25uZWN0aW9uIHRvIFdEVCByZXNldCBwaW4uCistIGh3X2FsZ286IFRoZSBhbGdvcml0aG0gdXNlZCBieSB0aGUgZHJpdmVyLiBTaG91bGQgYmUgb25lIG9mIHRoZQorICBmb2xsb3dpbmcgdmFsdWVzOgorICAtIHRvZ2dsZTogRWl0aGVyIGEgaGlnaC10by1sb3cgb3IgYSBsb3ctdG8taGlnaCB0cmFuc2l0aW9uIGNsZWFycworICAgIHRoZSBXRFQgY291bnRlci4gVGhlIHdhdGNoZG9nIHRpbWVyIGlzIGRpc2FibGVkIHdoZW4gR1BJTyBpcworICAgIGxlZnQgZmxvYXRpbmcgb3IgY29ubmVjdGVkIHRvIGEgdGhyZWUtc3RhdGUgYnVmZmVyLgorICAtIGxldmVsOiBMb3cgb3IgaGlnaCBsZXZlbCBzdGFydHMgY291bnRpbmcgV0RUIHRpbWVvdXQsCisgICAgdGhlIG9wcG9zaXRlIGxldmVsIGRpc2FibGVzIHRoZSBXRFQuIEFjdGl2ZSBsZXZlbCBpcyBkZXRlcm1pbmVkCisgICAgYnkgdGhlIEdQSU8gZmxhZ3MuCistIGh3X21hcmdpbl9tczogTWF4aW11bSB0aW1lIHRvIHJlc2V0IHdhdGNoZG9nIGNpcmN1aXQgKG1pbGxpc2Vjb25kcykuCisKK0V4YW1wbGU6CisJd2F0Y2hkb2c6IHdhdGNoZG9nIHsKKwkJLyogQURNNzA2ICovCisJCWNvbXBhdGlibGUgPSAibGludXgsd2R0LWdwaW8iOworCQlncGlvcyA9IDwmZ3BpbzMgOSBHUElPX0FDVElWRV9MT1c+OworCQlod19hbGdvID0gInRvZ2dsZSI7CisJCWh3X21hcmdpbl9tcyA9IDwxNjAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3NhbXN1bmctd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zYW1zdW5nLXdkdC50eHQKaW5kZXggMmFhNDg2Yy4uY2ZmZjM3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3NhbXN1bmctd2R0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc2Ftc3VuZy13ZHQudHh0CkBAIC01LDEwICs1LDI5IEBACiBvY2N1cnJlZC4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAic2Ftc3VuZyxzM2MyNDEwLXdkdCIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgYW1vbmcgdGhlIGZvbGxvd2luZworCShhKSAic2Ftc3VuZyxzM2MyNDEwLXdkdCIgZm9yIEV4eW5vczQgYW5kIHByZXZpb3VzIFNvQ3MKKwkoYikgInNhbXN1bmcsZXh5bm9zNTI1MC13ZHQiIGZvciBFeHlub3M1MjUwCisJKGMpICJzYW1zdW5nLGV4eW5vczU0MjAtd2R0IiBmb3IgRXh5bm9zNTQyMAorCiAtIHJlZyA6IGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeSBtYXBwZWQKIAlyZWdpb24uCiAtIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgbnVtYmVyIHRvIHRoZSBjcHUuCistIHNhbXN1bmcsc3lzY29uLXBoYW5kbGUgOiByZWZlcmVuY2UgdG8gc3lzY29uIG5vZGUgKFRoaXMgcHJvcGVydHkgcmVxdWlyZWQgb25seQorCWluIGNhc2Ugb2YgY29tcGF0aWJsZSBiZWluZyAic2Ftc3VuZyxleHlub3M1MjUwLXdkdCIgb3IgInNhbXN1bmcsZXh5bm9zNTQyMC13ZHQiLgorCUluIGNhc2Ugb2YgRXh5bm9zNTI1MCBhbmQgNTQyMCB0aGlzIHByb3BlcnR5IHBvaW50cyB0byBzeXNjb24gbm9kZSBob2xkaW5nIHRoZSBQTVUKKwliYXNlIGFkZHJlc3MpCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIHRpbWVvdXQtc2VjIDogY29udGFpbnMgdGhlIHdhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4KKworRXhhbXBsZToKKword2F0Y2hkb2dAMTAxRDAwMDAgeworCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwLXdkdCI7CisJcmVnID0gPDB4MTAxRDAwMDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8MCA0MiAwPjsKKwljbG9ja3MgPSA8JmNsb2NrIDMzNj47CisJY2xvY2stbmFtZXMgPSAid2F0Y2hkb2ciOworCXNhbXN1bmcsc3lzY29uLXBoYW5kbGUgPSA8JnBtdV9zeXNjb24+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2NvbnRyaWJ1dG9ycy50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jb250cmlidXRvcnMudHh0CmluZGV4IDQ3YzMwMDkuLjczMWEwMDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL2NvbnRyaWJ1dG9ycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvY29udHJpYnV0b3JzLnR4dApAQCAtNzgsNyArNzgsNyBAQAogV2lsc29uIE1pY2hhZWxzIDx3aWxzb25taWNoYWVsc0BlYXJ0aGxpbmsubmV0PgogICBmb3IgdGhlIGxnZHQzMzB4IGZyb250ZW5kIGRyaXZlciwgYW5kIHZhcmlvdXMgYnVnZml4ZXMKIAotTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4KK01pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgogICBmb3IgbWFpbnRhaW5pbmcgdjRsL2R2YiBpbnRlci10cmVlIGRlcGVuZGVuY2llcwogCiBUYXlsb3IgSmFjb2IgPHJ0amFjb2JAZWFydGhsaW5rLm5ldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2ZiLzAwLUlOREVYCmluZGV4IDMwYTcwNTQuLmZlODVlN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmIvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi8wMC1JTkRFWApAQCAtNSw2ICs1LDggQEAKIAogMDAtSU5ERVgKIAktIHRoaXMgZmlsZS4KK2FwaS50eHQKKwktIFRoZSBmcmFtZSBidWZmZXIgQVBJIGJldHdlZW4gYXBwbGljYXRpb25zIGFuZCBidWZmZXIgZGV2aWNlcy4KIGFya2ZiLnR4dAogCS0gaW5mbyBvbiB0aGUgZmJkZXYgZHJpdmVyIGZvciBBUksgTG9naWMgY2hpcHMuCiBhdHkxMjhmYi50eHQKQEAgLTUxLDEyICs1MywxNiBAQAogCS0gaW5mbyBvbiB0aGUgU0g3NzYwL1NINzc2MyBpbnRlZ3JhdGVkIExDREMgRnJhbWVidWZmZXIgZHJpdmVyLgogc2lzZmIudHh0CiAJLSBpbmZvIG9uIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIGZvciB2YXJpb3VzIFNpUyBjaGlwcy4KK3NtNTAxLnR4dAorCS0gaW5mbyBvbiB0aGUgZnJhbWVidWZmZXIgZGV2aWNlIGRyaXZlciBmb3Igc201MDEgdmlkZW9mcmFtZWJ1ZmZlci4KIHNzdGZiLnR4dAogCS0gaW5mbyBvbiB0aGUgZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgM2RmeCcgVm9vZG9vIEdyYXBoaWNzIGJvYXJkcy4KIHRnYWZiLnR4dAogCS0gaW5mbyBvbiB0aGUgVEdBIChERUNDaGlwIDIxMDMwKSBmcmFtZSBidWZmZXIgZHJpdmVyLgogdHJpZGVudGZiLnR4dAogCWluZm8gb24gdGhlIGZyYW1lYnVmZmVyIGRyaXZlciBmb3Igc29tZSBUcmlkZW50IGNoaXAgYmFzZWQgY2FyZHMuCit1ZGxmYi50eHQKKwktIERyaXZlciBmb3IgRGlzcGxheUxpbmsgVVNCIDIuMCBjaGlwcy4KIHV2ZXNhZmIudHh0CiAJLSBpbmZvIG9uIHRoZSB1c2Vyc3BhY2UgVkVTQSAoVkJFMisgY29tcGxpYW50KSBmcmFtZSBidWZmZXIgZGV2aWNlLgogdmVzYWZiLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5ERVgKaW5kZXggNjMyMjExYy4uYWMyODE0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVYCkBAIC0yLDYgKzIsOCBAQAogCS0gdGhpcyBmaWxlIChpbmZvIG9uIHNvbWUgb2YgdGhlIGZpbGVzeXN0ZW1zIHN1cHBvcnRlZCBieSBsaW51eCkuCiBMb2NraW5nCiAJLSBpbmZvIG9uIGxvY2tpbmcgcnVsZXMgYXMgdGhleSBwZXJ0YWluIHRvIExpbnV4IFZGUy4KK01ha2VmaWxlCisJLSBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgdGhlIGZpbHN5c3RlbXMtcGFydCBvZiBEb2NCb29rLgogOXAudHh0CiAJLSA5cCAodjlmcykgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFBsYW4gOSByZW1vdGUgZnMgcHJvdG9jb2wuCiBhZGZzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9idHJmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2J0cmZzLnR4dAppbmRleCA1ZGQyODJkLi5kMTFjYzJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2J0cmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2J0cmZzLnR4dApAQCAtMzgsNyArMzgsNyBAQAogPT09PT09PT09PT09PQogCiBXaGVuIG1vdW50aW5nIGEgYnRyZnMgZmlsZXN5c3RlbSwgdGhlIGZvbGxvd2luZyBvcHRpb24gYXJlIGFjY2VwdGVkLgotVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGFsbCBvcHRpb25zIGRlZmF1bHQgdG8gb2ZmLgorT3B0aW9ucyB3aXRoICgqKSBhcmUgZGVmYXVsdCBvcHRpb25zIGFuZCB3aWxsIG5vdCBzaG93IGluIHRoZSBtb3VudCBvcHRpb25zLgogCiAgIGFsbG9jX3N0YXJ0PTxieXRlcz4KIAlEZWJ1Z2dpbmcgb3B0aW9uIHRvIGZvcmNlIGFsbCBibG9jayBhbGxvY2F0aW9ucyBhYm92ZSBhIGNlcnRhaW4KQEAgLTQ2LDEwICs0NiwxMiBAQAogCWJ5dGVzLCBvcHRpb25hbGx5IHdpdGggYSBLLCBNLCBvciBHIHN1ZmZpeCwgY2FzZSBpbnNlbnNpdGl2ZS4KIAlEZWZhdWx0IGlzIDFNQi4KIAorICBub2F1dG9kZWZyYWcoKikKICAgYXV0b2RlZnJhZwotCURldGVjdCBzbWFsbCByYW5kb20gd3JpdGVzIGludG8gZmlsZXMgYW5kIHF1ZXVlIHRoZW0gdXAgZm9yIHRoZQotCWRlZnJhZyBwcm9jZXNzLiAgV29ya3MgYmVzdCBmb3Igc21hbGwgZmlsZXM7IE5vdCB3ZWxsIHN1aXRlZCBmb3IKLQlsYXJnZSBkYXRhYmFzZSB3b3JrbG9hZHMuCisJRGlzYWJsZS9lbmFibGUgYXV0byBkZWZyYWdtZW50YXRpb24uCisJQXV0byBkZWZyYWdtZW50YXRpb24gZGV0ZWN0cyBzbWFsbCByYW5kb20gd3JpdGVzIGludG8gZmlsZXMgYW5kIHF1ZXVlCisJdGhlbSB1cCBmb3IgdGhlIGRlZnJhZyBwcm9jZXNzLiAgV29ya3MgYmVzdCBmb3Igc21hbGwgZmlsZXM7CisJTm90IHdlbGwgc3VpdGVkIGZvciBsYXJnZSBkYXRhYmFzZSB3b3JrbG9hZHMuCiAKICAgY2hlY2tfaW50CiAgIGNoZWNrX2ludF9kYXRhCkBAIC05NiwyMSArOTgsMjYgQEAKIAljYW4gYmUgYXZvaWRlZC4gIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvIG1vdW50IGEgbXVsdGktZGV2aWNlCiAJc2V0dXAgYXMgcm9vdC4gIE1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMgZm9yIG11bHRpcGxlIGRldmljZXMuCiAKKyAgbm9kaXNjYXJkKCopCiAgIGRpc2NhcmQKLQlJc3N1ZSBmcmVxdWVudCBjb21tYW5kcyB0byBsZXQgdGhlIGJsb2NrIGRldmljZSByZWNsYWltIHNwYWNlIGZyZWVkIGJ5Ci0JdGhlIGZpbGVzeXN0ZW0uICBUaGlzIGlzIHVzZWZ1bCBmb3IgU1NEIGRldmljZXMsIHRoaW5seSBwcm92aXNpb25lZAorCURpc2FibGUvZW5hYmxlIGRpc2NhcmQgbW91bnQgb3B0aW9uLgorCURpc2NhcmQgaXNzdWVzIGZyZXF1ZW50IGNvbW1hbmRzIHRvIGxldCB0aGUgYmxvY2sgZGV2aWNlIHJlY2xhaW0gc3BhY2UKKwlmcmVlZCBieSB0aGUgZmlsZXN5c3RlbS4KKwlUaGlzIGlzIHVzZWZ1bCBmb3IgU1NEIGRldmljZXMsIHRoaW5seSBwcm92aXNpb25lZAogCUxVTnMgYW5kIHZpcnR1YWwgbWFjaGluZSBpbWFnZXMsIGJ1dCBtYXkgaGF2ZSBhIHNpZ25pZmljYW50CiAJcGVyZm9ybWFuY2UgaW1wYWN0LiAgKFRoZSBmc3RyaW0gY29tbWFuZCBpcyBhbHNvIGF2YWlsYWJsZSB0bwogCWluaXRpYXRlIGJhdGNoIHRyaW1zIGZyb20gdXNlcnNwYWNlKS4KIAorICBub2Vub3NwY19kZWJ1ZygqKQogICBlbm9zcGNfZGVidWcKLQlEZWJ1Z2dpbmcgb3B0aW9uIHRvIGJlIG1vcmUgdmVyYm9zZSBpbiBzb21lIEVOT1NQQyBjb25kaXRpb25zLgorCURpc2FibGUvZW5hYmxlIGRlYnVnZ2luZyBvcHRpb24gdG8gYmUgbW9yZSB2ZXJib3NlIGluIHNvbWUgRU5PU1BDIGNvbmRpdGlvbnMuCiAKICAgZmF0YWxfZXJyb3JzPTxhY3Rpb24+CiAJQWN0aW9uIHRvIHRha2Ugd2hlbiBlbmNvdW50ZXJpbmcgYSBmYXRhbCBlcnJvcjogCiAJICAiYnVnIiAtIEJVRygpIG9uIGEgZmF0YWwgZXJyb3IuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgogCSAgInBhbmljIiAtIHBhbmljKCkgb24gYSBmYXRhbCBlcnJvci4KIAorICBub2ZsdXNob25jb21taXQoKikKICAgZmx1c2hvbmNvbW1pdAogCVRoZSAnZmx1c2hvbmNvbW1pdCcgbW91bnQgb3B0aW9uIGZvcmNlcyBhbnkgZGF0YSBkaXJ0aWVkIGJ5IGEgd3JpdGUgaW4gYQogCXByaW9yIHRyYW5zYWN0aW9uIHRvIGNvbW1pdCBhcyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbW1pdC4gIFRoaXMgbWFrZXMKQEAgLTEzNCwyNiArMTQxLDMyIEBACiAJU3BlY2lmeSB0aGF0IDEgbWV0YWRhdGEgY2h1bmsgc2hvdWxkIGJlIGFsbG9jYXRlZCBhZnRlciBldmVyeSA8dmFsdWU+CiAJZGF0YSBjaHVua3MuICBPZmYgYnkgZGVmYXVsdC4KIAorICBhY2woKikKICAgbm9hY2wKLQlEaXNhYmxlIHN1cHBvcnQgZm9yIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKS4gIFNlZSB0aGUKKwlFbmFibGUvZGlzYWJsZSBzdXBwb3J0IGZvciBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykuICBTZWUgdGhlCiAJYWNsKDUpIG1hbnVhbCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEFDTHMuCiAKKyAgYmFycmllcigqKQogICBub2JhcnJpZXIKLSAgICAgICAgRGlzYWJsZXMgdGhlIHVzZSBvZiBibG9jayBsYXllciB3cml0ZSBiYXJyaWVycy4gIFdyaXRlIGJhcnJpZXJzIGVuc3VyZQotCXRoYXQgY2VydGFpbiBJT3MgbWFrZSBpdCB0aHJvdWdoIHRoZSBkZXZpY2UgY2FjaGUgYW5kIGFyZSBvbiBwZXJzaXN0ZW50Ci0Jc3RvcmFnZS4gIElmIHVzZWQgb24gYSBkZXZpY2Ugd2l0aCBhIHZvbGF0aWxlIChub24tYmF0dGVyeS1iYWNrZWQpCi0Jd3JpdGUtYmFjayBjYWNoZSwgdGhpcyBvcHRpb24gd2lsbCBsZWFkIHRvIGZpbGVzeXN0ZW0gY29ycnVwdGlvbiBvbiBhCi0Jc3lzdGVtIGNyYXNoIG9yIHBvd2VyIGxvc3MuCisgICAgICAgIEVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2YgYmxvY2sgbGF5ZXIgd3JpdGUgYmFycmllcnMuICBXcml0ZSBiYXJyaWVycworCWVuc3VyZSB0aGF0IGNlcnRhaW4gSU9zIG1ha2UgaXQgdGhyb3VnaCB0aGUgZGV2aWNlIGNhY2hlIGFuZCBhcmUgb24KKwlwZXJzaXN0ZW50IHN0b3JhZ2UuIElmIGRpc2FibGVkIG9uIGEgZGV2aWNlIHdpdGggYSB2b2xhdGlsZQorCShub24tYmF0dGVyeS1iYWNrZWQpIHdyaXRlLWJhY2sgY2FjaGUsIG5vYmFycmllciBvcHRpb24gd2lsbCBsZWFkIHRvCisJZmlsZXN5c3RlbSBjb3JydXB0aW9uIG9uIGEgc3lzdGVtIGNyYXNoIG9yIHBvd2VyIGxvc3MuCiAKKyAgZGF0YWNvdygqKQogICBub2RhdGFjb3cKLQlEaXNhYmxlIGRhdGEgY29weS1vbi13cml0ZSBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlcy4gIEltcGxpZXMgbm9kYXRhc3VtLAotCWFuZCBkaXNhYmxlcyBhbGwgY29tcHJlc3Npb24uCisJRW5hYmxlL2Rpc2FibGUgZGF0YSBjb3B5LW9uLXdyaXRlIGZvciBuZXdseSBjcmVhdGVkIGZpbGVzLgorCU5vZGF0YWNvdyBpbXBsaWVzIG5vZGF0YXN1bSwgYW5kIGRpc2FibGVzIGFsbCBjb21wcmVzc2lvbi4KIAorICBkYXRhc3VtKCopCiAgIG5vZGF0YXN1bQotCURpc2FibGUgZGF0YSBjaGVja3N1bW1pbmcgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZXMuCisJRW5hYmxlL2Rpc2FibGUgZGF0YSBjaGVja3N1bW1pbmcgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZXMuCisJRGF0YXN1bSBpbXBsaWVzIGRhdGFjb3cuCiAKKyAgdHJlZWxvZygqKQogICBub3RyZWVsb2cKLQlEaXNhYmxlIHRoZSB0cmVlIGxvZ2dpbmcgdXNlZCBmb3IgZnN5bmMgYW5kIE9fU1lOQyB3cml0ZXMuCisJRW5hYmxlL2Rpc2FibGUgdGhlIHRyZWUgbG9nZ2luZyB1c2VkIGZvciBmc3luYyBhbmQgT19TWU5DIHdyaXRlcy4KIAogICByZWNvdmVyeQogCUVuYWJsZSBhdXRvcmVjb3ZlcnkgYXR0ZW1wdHMgaWYgYSBiYWQgdHJlZSByb290IGlzIGZvdW5kIGF0IG1vdW50IHRpbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzLzAwLUlOREVYCmluZGV4IDY2ZWI2YzguLjUzZjNiNTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzLzAwLUlOREVYCkBAIC0xMiw2ICsxMiw4IEBACiAJLSBpbmZvIG9uIHRoZSBMaW51eCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gb2YgTkZTdjQgbWlub3IgdmVyc2lvbiAxLgogbmZzLXJkbWEudHh0CiAJLSBob3cgdG8gaW5zdGFsbCBhbmQgc2V0dXAgdGhlIExpbnV4IE5GUy9SRE1BIGNsaWVudCBhbmQgc2VydmVyIHNvZnR3YXJlCituZnNkLWFkbWluLWludGVyZmFjZXMudHh0CisJLSBBZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2VzIGZvciBuZnNkLgogbmZzcm9vdC50eHQKIAktIHNob3J0IGd1aWRlIG9uIHNldHRpbmcgdXAgYSBkaXNrbGVzcyBib3ggd2l0aCBORlMgcm9vdCBmaWxlc3lzdGVtLgogcG5mcy50eHQKQEAgLTIwLDUgKzIyLDUgQEAKIAktIGludHJvZHVjdGlvbiB0byB0aGUgY2FjaGluZyBtZWNoYW5pc21zIGluIHRoZSBzdW5ycGMgbGF5ZXIuCiBpZG1hcHBlci50eHQKIAktIGluZm9ybWF0aW9uIGZvciBjb25maWd1cmluZyByZXF1ZXN0LWtleXMgdG8gYmUgdXNlZCBieSBpZG1hcHBlcgota25mc2QtcnBjZ3NzLnR4dAorcnBjLXNlcnZlci1nc3MudHh0CiAJLSBJbmZvcm1hdGlvbiBvbiBHU1MgYXV0aGVudGljYXRpb24gc3VwcG9ydCBpbiB0aGUgTkZTIFNlcnZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzNDEtc2VydmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzL25mczQxLXNlcnZlci50eHQKaW5kZXggMDFjMmRiNy4uYjkzMGFkMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzNDEtc2VydmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy9uZnM0MS1zZXJ2ZXIudHh0CkBAIC01LDExICs1LDExIEBACiBieSByZWFkaW5nIHRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gZWl0aGVyICIrNC4xIiBvciAiLTQuMSIKIGNvcnJlc3BvbmRpbmdseS4KIAotQ3VycmVudGx5LCBzZXJ2ZXIgc3VwcG9ydCBmb3IgbWlub3J2ZXJzaW9uIDEgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLUl0IGNhbiBiZSBlbmFibGVkIGF0IHJ1biB0aW1lIGJ5IHdyaXRpbmcgdGhlIHN0cmluZyAiKzQuMSIgdG8KK0N1cnJlbnRseSwgc2VydmVyIHN1cHBvcnQgZm9yIG1pbm9ydmVyc2lvbiAxIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KK0l0IGNhbiBiZSBkaXNhYmxlZCBhdCBydW4gdGltZSBieSB3cml0aW5nIHRoZSBzdHJpbmcgIi00LjEiIHRvCiB0aGUgL3Byb2MvZnMvbmZzZC92ZXJzaW9ucyBjb250cm9sIGZpbGUuICBOb3RlIHRoYXQgdG8gd3JpdGUgdGhpcwotY29udHJvbCBmaWxlLCB0aGUgbmZzZCBzZXJ2aWNlIG11c3QgYmUgdGFrZW4gZG93bi4gIFVzZSB5b3VyIHVzZXItbW9kZQotbmZzLXV0aWxzIHRvIHNldCB0aGlzIHVwOyBzZWUgcnBjLm5mc2QoOCkKK2NvbnRyb2wgZmlsZSwgdGhlIG5mc2Qgc2VydmljZSBtdXN0IGJlIHRha2VuIGRvd24uICBZb3UgY2FuIHVzZSBycGMubmZzZAorZm9yIHRoaXM7IHNlZSBycGMubmZzZCg4KS4KIAogKFdhcm5pbmc6IG9sZGVyIHNlcnZlcnMgd2lsbCBpbnRlcnByZXQgIis0LjEiIGFuZCAiLTQuMSIgYXMgIis0IiBhbmQKICItNCIsIHJlc3BlY3RpdmVseS4gIFRoZXJlZm9yZSwgY29kZSBtZWFudCB0byB3b3JrIG9uIGJvdGggbmV3IGFuZCBvbGQKQEAgLTI5LDI5ICsyOSw2IEBACiBTZWUgaHR0cDovL3dpa2kubGludXgtbmZzLm9yZy93aWtpL2luZGV4LnBocC9QTkZTX3Byb3RvdHlwZV9kZXNpZ24KIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1UaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVycyBvbmx5OiB3aGlsZSBpdAotZG9lcyBzdXBwb3J0IG9yZGluYXJ5IGZpbGUgb3BlcmF0aW9ucyBvbiBjbGllbnRzIHdlIGhhdmUgdGVzdGVkIGFnYWluc3QKLShpbmNsdWRpbmcgdGhlIGxpbnV4IGNsaWVudCksIGl0IGlzIGluY29tcGxldGUgaW4gd2F5cyB3aGljaCBtYXkgbGltaXQKLWZlYXR1cmVzIHVuZXhwZWN0ZWRseSwgY2F1c2Uga25vd24gYnVncyBpbiByYXJlIGNhc2VzLCBvciBjYXVzZQotaW50ZXJvcGVyYWJpbGl0eSBwcm9ibGVtcyB3aXRoIGZ1dHVyZSBjbGllbnRzLiAgS25vd24gaXNzdWVzOgotCi0JLSBnc3Mgc3VwcG9ydCBpcyBxdWVzdGlvbmFibGU6IGN1cnJlbnRseSBtb3VudHMgd2l0aCBrZXJiZXJvcwotCSAgZnJvbSBhIGxpbnV4IGNsaWVudCBhcmUgcG9zc2libGUsIGJ1dCB3ZSBhcmVuJ3QgcmVhbGx5Ci0JICBjb25mb3JtYW50IHdpdGggdGhlIHNwZWMgKGZvciBleGFtcGxlLCB3ZSBkb24ndCB1c2Uga2VyYmVyb3MKLQkgIG9uIHRoZSBiYWNrY2hhbm5lbCBjb3JyZWN0bHkpLgotCS0gV2UgZG8gbm90IHN1cHBvcnQgU1NWLCB3aGljaCBwcm92aWRlcyBzZWN1cml0eSBmb3Igc2hhcmVkCi0JICBjbGllbnQtc2VydmVyIHN0YXRlICh0aHVzIHByZXZlbnRpbmcgdW5hdXRob3JpemVkIHRhbXBlcmluZwotCSAgd2l0aCBsb2NrcyBhbmQgb3BlbnMsIGZvciBleGFtcGxlKS4gIEl0IGlzIG1hbmRhdG9yeSBmb3IKLQkgIHNlcnZlcnMgdG8gc3VwcG9ydCB0aGlzLCB0aG91Z2ggbm8gY2xpZW50cyB1c2UgaXQgeWV0LgotCi1JbiBhZGRpdGlvbiwgc29tZSBsaW1pdGF0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGN1cnJlbnQgTkZTdjQKLWltcGxlbWVudGF0aW9uOgotCi0JLSBJbmNvbXBsZXRlIGRlbGVnYXRpb24gZW5mb3JjZW1lbnQ6IGlmIGEgZmlsZSBpcyByZW5hbWVkIG9yCi0JICB1bmxpbmtlZCBieSBhIGxvY2FsIHByb2Nlc3MsIGEgY2xpZW50IGhvbGRpbmcgYSBkZWxlZ2F0aW9uIG1heQotCSAgY29udGludWUgdG8gaW5kZWZpbml0ZWx5IGFsbG93IG9wZW5zIG9mIHRoZSBmaWxlIHVuZGVyIHRoZSBvbGQKLQkgIG5hbWUuCi0KIFRoZSB0YWJsZSBiZWxvdywgdGFrZW4gZnJvbSB0aGUgTkZTdjQuMSBkb2N1bWVudCwgbGlzdHMKIHRoZSBvcGVyYXRpb25zIHRoYXQgYXJlIG1hbmRhdG9yeSB0byBpbXBsZW1lbnQgKFJFUSksIG9wdGlvbmFsCiAoT1BUKSwgYW5kIE5GU3Y0LjAgb3BlcmF0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCBub3QgdG8gaW1wbGVtZW50IChNTkkpCkBAIC0xNjksNiArMTQ2LDE2IEBACiAKIEltcGxlbWVudGF0aW9uIG5vdGVzOgogCitTU1Y6CisqIFRoZSBzcGVjIGNsYWltcyB0aGlzIGlzIG1hbmRhdG9yeSwgYnV0IHdlIGRvbid0IGFjdHVhbGx5IGtub3cgb2YgYW55CisgIGltcGxlbWVudGF0aW9ucywgc28gd2UncmUgaWdub3JpbmcgaXQgZm9yIG5vdy4gIFRoZSBzZXJ2ZXIgcmV0dXJucworICBORlM0RVJSX0VOQ1JfQUxHX1VOU1VQUCBvbiBFWENIQU5HRV9JRCwgd2hpY2ggc2hvdWxkIGJlIGZ1dHVyZS1wcm9vZi4KKworR1NTIG9uIHRoZSBiYWNrY2hhbm5lbDoKKyogQWdhaW4sIHRoZW9yZXRpY2FsbHkgcmVxdWlyZWQgYnV0IG5vdCB3aWRlbHkgaW1wbGVtZW50ZWQgKGluCisgIHBhcnRpY3VsYXIsIHRoZSBjdXJyZW50IExpbnV4IGNsaWVudCBkb2Vzbid0IHJlcXVlc3QgaXQpLiAgV2UgcmV0dXJuCisgIE5GUzRFUlJfRU5DUl9BTEdfVU5TVVBQIG9uIENSRUFURV9TRVNTSU9OLgorCiBERUxFR1BVUkdFOgogKiBtYW5kYXRvcnkgb25seSBmb3Igc2VydmVycyB0aGF0IHN1cHBvcnQgQ0xBSU1fREVMRUdBVEVfUFJFViBhbmQvb3IKICAgQ0xBSU1fREVMRUdfUFJFVl9GSCAod2hpY2ggYWxsb3dzIGNsaWVudHMgdG8ga2VlcCBkZWxlZ2F0aW9ucyB0aGF0CkBAIC0xNzYsNyArMTYzLDYgQEAKICAgbm93LgogCiBFWENIQU5HRV9JRDoKLSogb25seSBTUDRfTk9ORSBzdGF0ZSBwcm90ZWN0aW9uIHN1cHBvcnRlZAogKiBpbXBsZW1lbnRhdGlvbiBpZHMgYXJlIGlnbm9yZWQKIAogQ1JFQVRFX1NFU1NJT046CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCAzMWY3NjE3Li5mMDBiZWUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTEzODYsOCArMTM4Niw4IEBACiBGb3IgZXhhbXBsZSwgaWYgYSB0YXNrIGlzIHVzaW5nIGFsbCBhbGxvd2VkIG1lbW9yeSwgaXRzIGJhZG5lc3Mgc2NvcmUgd2lsbCBiZQogMTAwMC4gIElmIGl0IGlzIHVzaW5nIGhhbGYgb2YgaXRzIGFsbG93ZWQgbWVtb3J5LCBpdHMgc2NvcmUgd2lsbCBiZSA1MDAuCiAKLVRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgZmFjdG9yIGluY2x1ZGVkIGluIHRoZSBiYWRuZXNzIHNjb3JlOiByb290Ci1wcm9jZXNzZXMgYXJlIGdpdmVuIDMlIGV4dHJhIG1lbW9yeSBvdmVyIG90aGVyIHRhc2tzLgorVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBmYWN0b3IgaW5jbHVkZWQgaW4gdGhlIGJhZG5lc3Mgc2NvcmU6IHRoZSBjdXJyZW50IG1lbW9yeQorYW5kIHN3YXAgdXNhZ2UgaXMgZGlzY291bnRlZCBieSAzJSBmb3Igcm9vdCBwcm9jZXNzZXMuCiAKIFRoZSBhbW91bnQgb2YgImFsbG93ZWQiIG1lbW9yeSBkZXBlbmRzIG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBvb20ga2lsbGVyCiB3YXMgY2FsbGVkLiAgSWYgaXQgaXMgZHVlIHRvIHRoZSBtZW1vcnkgYXNzaWduZWQgdG8gdGhlIGFsbG9jYXRpbmcgdGFzaydzIGNwdXNldApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CmluZGV4IGRlYjQ4YjUuLmM1Mzc4NGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKQEAgLTc4Miw3ICs3ODIsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSBhbiBvcGVuIGZpbGUuIEFzIG9mIGtlcm5lbAotMy41LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiszLjEyLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgewogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwpAQCAtODAzLDkgKzgwMyw2IEBACiAJaW50ICgqYWlvX2ZzeW5jKSAoc3RydWN0IGtpb2NiICosIGludCBkYXRhc3luYyk7CiAJaW50ICgqZmFzeW5jKSAoaW50LCBzdHJ1Y3QgZmlsZSAqLCBpbnQpOwogCWludCAoKmxvY2spIChzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7Ci0Jc3NpemVfdCAoKnJlYWR2KSAoc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCAqKTsKLQlzc2l6ZV90ICgqd3JpdGV2KSAoc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCAqKTsKLQlzc2l6ZV90ICgqc2VuZGZpbGUpIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCByZWFkX2FjdG9yX3QsIHZvaWQgKik7CiAJc3NpemVfdCAoKnNlbmRwYWdlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgaW50LCBzaXplX3QsIGxvZmZfdCAqLCBpbnQpOwogCXVuc2lnbmVkIGxvbmcgKCpnZXRfdW5tYXBwZWRfYXJlYSkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAJaW50ICgqY2hlY2tfZmxhZ3MpKGludCk7CkBAIC04MTQsNiArODExLDcgQEAKIAlzc2l6ZV90ICgqc3BsaWNlX3JlYWQpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogCWludCAoKnNldGxlYXNlKShzdHJ1Y3QgZmlsZSAqLCBsb25nIGFyZywgc3RydWN0IGZpbGVfbG9jayAqKik7CiAJbG9uZyAoKmZhbGxvY2F0ZSkoc3RydWN0IGZpbGUgKiwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pOworCWludCAoKnNob3dfZmRpbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBmaWxlICpmKTsKIH07CiAKIEFnYWluLCBhbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcwpAQCAtODY0LDEyICs4NjIsNiBAQAogICBsb2NrOiBjYWxsZWQgYnkgdGhlIGZjbnRsKDIpIHN5c3RlbSBjYWxsIGZvciBGX0dFVExLLCBGX1NFVExLLCBhbmQgRl9TRVRMS1cKICAgCWNvbW1hbmRzCiAKLSAgcmVhZHY6IGNhbGxlZCBieSB0aGUgcmVhZHYoMikgc3lzdGVtIGNhbGwKLQotICB3cml0ZXY6IGNhbGxlZCBieSB0aGUgd3JpdGV2KDIpIHN5c3RlbSBjYWxsCi0KLSAgc2VuZGZpbGU6IGNhbGxlZCBieSB0aGUgc2VuZGZpbGUoMikgc3lzdGVtIGNhbGwKLQogICBnZXRfdW5tYXBwZWRfYXJlYTogY2FsbGVkIGJ5IHRoZSBtbWFwKDIpIHN5c3RlbSBjYWxsCiAKICAgY2hlY2tfZmxhZ3M6IGNhbGxlZCBieSB0aGUgZmNudGwoMikgc3lzdGVtIGNhbGwgZm9yIEZfU0VURkwgY29tbWFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI1CmluZGV4IDM5ZDJiNzguLjk5ZjA1MDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjUKQEAgLTE4LDcgKzE4LDcgQEAKIAogQXV0aG9yczoKICAgICAgICAgQ2hlbi1ZdWFuIFd1IDxnd3VAZXNvZnQuY29tPiwKLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMzEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMzEKaW5kZXggYmU5MmE3Ny4uYTE0MzExNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDMxCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAzMQpAQCAtMTYsNyArMTYsNyBAQAogCiBBdXRob3JzOgogICAgICAgICBBbGV4YW5kcmUgZCdBbHRvbiA8YWxleEBhbGV4ZGFsdG9uLm9yZz4KLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKaW5kZXggMzZlOGVjNi4uOWIxNzRmYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MApAQCAtMjUsNyArMjUsNyBAQAogICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCiAgICAgTWljaGllbCBSb29rIDxtaWNoaWVsQGdyZW5kZWxwcm9qZWN0Lm5sPiwKICAgICBHcmFudCBDb2FkeSA8Z2NvYWR5LmxrQGdtYWlsLmNvbT4gd2l0aCBndWlkYW5jZQotICAgICAgICBmcm9tIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgICAgICBmcm9tIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogSW50ZXJmYWNlCiAtLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZHMxNjIxIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczE2MjEKaW5kZXggODk2Y2RjOS4uZjc3NWU2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9kczE2MjEKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczE2MjEKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgICAgQ2hyaXN0aWFuIFcuIFp1Y2tzY2h3ZXJkdCA8emFueUB0cmlxLm5ldD4KICAgICAgICAgdmFsdWFibGUgY29udHJpYnV0aW9ucyBieSBKYW4gTS4gU2VuZGxlciA8c2VuZGxlckBzZW5kbGVyLmRlPgogICAgICAgICBwb3J0ZWQgdG8gMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4KLSAgICAgICAgd2l0aCB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICAgICAgd2l0aCB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIE1vZHVsZSBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZW1jNncyMDEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2VtYzZ3MjAxCmluZGV4IDMyZjM1NWEuLjc1NzYyOWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZW1jNncyMDEKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9lbWM2dzIwMQpAQCAtNyw3ICs3LDcgQEAKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMsIDB4MmQsIDB4MmUKICAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWMKIAotQXV0aG9yOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK0F1dGhvcjogSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiAKIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTgwNWYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTgwNWYKaW5kZXggZjBkNTU5Ny4uNDhhMzU2MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4MDVmCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODA1ZgpAQCAtMTUsNyArMTUsNyBAQAogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCiAgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKIAotQXV0aG9yOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK0F1dGhvcjogSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiBUaGFua3MgdG8gRGVuaXMgS2llZnQgZnJvbSBCYXJyYWN1ZGEgTmV0d29ya3MgZm9yIHRoZSBkb25hdGlvbiBvZiBhCiB0ZXN0IHN5c3RlbSAoY3VzdG9tIEpldHdheSBLOE04TVMgbW90aGVyYm9hcmQsIHdpdGggQ1BVIGFuZCBSQU0pIGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9nbDUxOHNtIGIvRG9jdW1lbnRhdGlvbi9od21vbi9nbDUxOHNtCmluZGV4IDI2ZjlmM2MuLjQ5NGJiNTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZ2w1MThzbQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2dsNTE4c20KQEAgLTE0LDcgKzE0LDcgQEAKICAgICAgICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKICAgICAgICAgS3nDtnN0aSBNw6Rsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4KICAgICAgICAgSG9uZy1HdW5uIENoZXcgPGhnbGludXhAZ3VubmV0Lm9yZz4KLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKaW5kZXggYzI2Mzc0MC4uMGMxNjM1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpAQCAtMiw2ICsyLDEwIEBACiA9PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgorICAqIElUODYwM0UKKyAgICBQcmVmaXg6ICdpdDg2MDMnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljbHkgYXZhaWxhYmxlCiAgICogSVQ4NzA1RgogICAgIFByZWZpeDogJ2l0ODcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCkBAIC01Myw3ICs1Nyw3IEBACiAKIEF1dGhvcnM6CiAgICAgQ2hyaXN0b3BoZSBHYXV0aHJvbgotICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogCiBNb2R1bGUgUGFyYW1ldGVycwpAQCAtOTAsNyArOTQsNyBAQAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKLVRoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIElUODcwNUYsIElUODcxMkYsIElUODcxNkYsCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBJVDg2MDNFLCBJVDg3MDVGLCBJVDg3MTJGLCBJVDg3MTZGLAogSVQ4NzE4RiwgSVQ4NzIwRiwgSVQ4NzIxRiwgSVQ4NzI2RiwgSVQ4NzI4RiwgSVQ4NzU4RSwgSVQ4NzcxRSwgSVQ4NzcyRSwKIElUODc4MkYsIElUODc4M0UvRiwgYW5kIFNpUzk1MCBjaGlwcy4KIApAQCAtMTI5LDYgKzEzMywxMCBAQAogVGhlIElUODcyOEYsIElUODc3MUUsIGFuZCBJVDg3NzJFIGFyZSBjb25zaWRlcmVkIGNvbXBhdGlibGUgd2l0aCB0aGUgSVQ4NzIxRiwKIHVudGlsIGEgZGF0YXNoZWV0IGJlY29tZXMgYXZhaWxhYmxlIChob3BlZnVsbHkuKQogCitUaGUgSVQ4NjAzRSBpcyBhIGN1c3RvbSBkZXNpZ24sIGhhcmR3YXJlIG1vbml0b3JpbmcgcGFydCBpcyBzaW1pbGFyIHRvCitJVDg3MjhGLiBJdCBvbmx5IHN1cHBvcnRzIDE2LWJpdCBmYW4gbW9kZSwgdGhlIGZ1bGwgc3BlZWQgbW9kZSBvZiB0aGUKK2ZhbiBpcyBub3Qgc3VwcG9ydGVkICh2YWx1ZSAwIG9mIHB3bVhfZW5hYmxlKS4KKwogVGVtcGVyYXR1cmVzIGFyZSBtZWFzdXJlZCBpbiBkZWdyZWVzIENlbHNpdXMuIEFuIGFsYXJtIGlzIHRyaWdnZXJlZCBvbmNlCiB3aGVuIHRoZSBPdmVydGVtcGVyYXR1cmUgU2h1dGRvd24gbGltaXQgaXMgY3Jvc3NlZC4KIApAQCAtMTQ1LDEzICsxNTMsMTYgQEAKIG1heGltdW0gbGltaXQuIE5vdGUgdGhhdCBtaW5pbXVtIGluIHRoaXMgY2FzZSBhbHdheXMgbWVhbnMgJ2Nsb3Nlc3QgdG8KIHplcm8nOyB0aGlzIGlzIGltcG9ydGFudCBmb3IgbmVnYXRpdmUgdm9sdGFnZSBtZWFzdXJlbWVudHMuIEFsbCB2b2x0YWdlCiBpbnB1dHMgY2FuIG1lYXN1cmUgdm9sdGFnZXMgYmV0d2VlbiAwIGFuZCA0LjA4IHZvbHRzLCB3aXRoIGEgcmVzb2x1dGlvbiBvZgotMC4wMTYgdm9sdCAoZXhjZXB0IElUODcyMUYvSVQ4NzU4RSBhbmQgSVQ4NzI4RjogMC4wMTIgdm9sdC4pIFRoZSBiYXR0ZXJ5Ci12b2x0YWdlIGluOCBkb2VzIG5vdCBoYXZlIGxpbWl0IHJlZ2lzdGVycy4KKzAuMDE2IHZvbHQgKGV4Y2VwdCBJVDg2MDNFLCBJVDg3MjFGL0lUODc1OEUgYW5kIElUODcyOEY6IDAuMDEyIHZvbHQuKSBUaGUKK2JhdHRlcnkgdm9sdGFnZSBpbjggZG9lcyBub3QgaGF2ZSBsaW1pdCByZWdpc3RlcnMuCiAKLU9uIHRoZSBJVDg3MjFGL0lUODc1OEUsIElUODc4MkYsIGFuZCBJVDg3ODNFL0YsIHNvbWUgdm9sdGFnZSBpbnB1dHMgYXJlCi1pbnRlcm5hbCBhbmQgc2NhbGVkIGluc2lkZSB0aGUgY2hpcCAoaW43IChvcHRpb25hbCBmb3IgSVQ4NzgyRiBhbmQgSVQ4NzgzRS9GKSwKLWluOCBhbmQgb3B0aW9uYWxseSBpbjMpLiBUaGUgZHJpdmVyIGhhbmRsZXMgdGhpcyB0cmFuc3BhcmVudGx5IHNvIHVzZXItc3BhY2UKLWRvZXNuJ3QgaGF2ZSB0byBjYXJlLgorT24gdGhlIElUODYwM0UsIElUODcyMUYvSVQ4NzU4RSwgSVQ4NzgyRiwgYW5kIElUODc4M0UvRiwgc29tZSB2b2x0YWdlIGlucHV0cworYXJlIGludGVybmFsIGFuZCBzY2FsZWQgaW5zaWRlIHRoZSBjaGlwOgorKiBpbjMgKG9wdGlvbmFsKQorKiBpbjcgKG9wdGlvbmFsIGZvciBJVDg3ODJGIGFuZCBJVDg3ODNFL0YpCisqIGluOCAoYWx3YXlzKQorKiBpbjkgKHJlbGV2YW50IGZvciBJVDg2MDNFIG9ubHkpCitUaGUgZHJpdmVyIGhhbmRsZXMgdGhpcyB0cmFuc3BhcmVudGx5IHNvIHVzZXItc3BhY2UgZG9lc24ndCBoYXZlIHRvIGNhcmUuCiAKIFRoZSBWSUQgbGluZXMgKElUODcxMkYvSVQ4NzE2Ri9JVDg3MThGL0lUODcyMEYpIGVuY29kZSB0aGUgY29yZSB2b2x0YWdlIHZhbHVlOgogdGhlIHZvbHRhZ2UgbGV2ZWwgeW91ciBwcm9jZXNzb3Igc2hvdWxkIHdvcmsgd2l0aC4gVGhpcyBpcyBoYXJkY29kZWQgYnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG02MyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG02MwppbmRleCA0ZDMwZDIwLi40YTAwNDYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNjMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTYzCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3Igd2Vic2l0ZQogICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE05NjE2My5odG1sCiAKLUF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitBdXRob3I6IEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogVGhhbmtzIGdvIHRvIFR5YW4gYW5kIGVzcGVjaWFsbHkgQWxleCBCdWNraW5naGFtIGZvciBzZXR0aW5nIHVwIGEgcmVtb3RlCiBhY2Nlc3MgdG8gdGhlaXIgUzQ4ODIgdGVzdCBwbGF0Zm9ybSBmb3IgdGhpcyBkcml2ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzAKaW5kZXggODZkMTgyOS4uMWJiMmRiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03MApAQCAtNDMsNSArNDMsNSBAQAogCiBUaGFua3MgdG8KIC0tLS0tLS0tLQotSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+IGZvciBtZW50b3JpbmcgdGhlIGh3bW9uLXNpZGUgZHJpdmVyCitKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+IGZvciBtZW50b3JpbmcgdGhlIGh3bW9uLXNpZGUgZHJpdmVyCiBkZXZlbG9wbWVudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03OCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03OAppbmRleCAyYmRjODgxLi40ZGQ0NzczIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CkBAIC0xNCw3ICsxNCw3IEBACiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS8KIAogQXV0aG9yczogRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgotICAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzCmluZGV4IGEwNGQxZmUuLjUwYmU1Y2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG04MworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODMKQEAgLTEzLDcgKzEzLDcgQEAKICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODIuaHRtbAogCiAKLUF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitBdXRob3I6IEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODcKaW5kZXggNmI0N2I2Ny4uYTIzMzlmZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04NwpAQCAtMTcsNyArMTcsNyBAQAogICAgICAgICBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+LAogICAgICAgICBTdGVwaGVuIFJvdXNzZXQgPHN0ZXBoZW4ucm91c3NldEByb2NrZXRsb2dpeC5jb20+LAogICAgICAgICBEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+LAotICAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4sCisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4sCiAgICAgICAgIE9yaWdpbmFsIDIuNiBwb3J0IEplZmYgT2xpdmVyCiAKIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTAKaW5kZXggYWI4MTAxMy4uODEyMjY3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MApAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnRpLmNvbS9saXR2L3BkZi9zYm9zNjg2CiAKIAotQXV0aG9yOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK0F1dGhvcjogSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiAKIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTIgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTIKaW5kZXggNzcwNWJmYS4uMjJmNjhhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkyCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MgpAQCAtMTksNyArMTksNyBAQAogCiBBdXRob3JzOgogICAgICAgICBBYnJhaGFtIHZhbiBkZXIgTWVyd2UgPGFicmFoYW1AMmQzZC5jby56YT4KLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogCiBEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjE5IGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjE5CmluZGV4IGU2ZDg3MzkuLjUxOGJhZTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MTYxOQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MTkKQEAgLTEwLDcgKzEwLDcgQEAKIAogQXV0aG9yczoKICAgICAgICAgT2xla3NpaiBSZW1wZWwgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4sCi0gICAgICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgICAgICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3MzYwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3MzYwCmluZGV4IGNiYWMzMmIuLmQ1ZjVjZjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzM2MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3BjODczNjAKQEAgLTcsNyArNyw3IEBACiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKICAgICBEYXRhc2hlZXRzOiBObyBsb25nZXIgYXZhaWxhYmxlCiAKLUF1dGhvcnM6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorQXV0aG9yczogSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiBUaGFua3MgdG8gU2FuZGVlcCBNZWh0YSwgVG9ua28gZGUgUm9veSBhbmQgRGFuaWVsIENlcmVnYXR0aSBmb3IgdGVzdGluZy4KIFRoYW5rcyB0byBSdWRvbGYgTWFyZWsgZm9yIGhlbHBpbmcgbWUgaW52ZXN0aWdhdGUgY29udmVyc2lvbiBpc3N1ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3BjODc0MjcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3BjODc0MjcKaW5kZXggOGZkZDA4Yy4uYzMxM2ViNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3NDI3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzQyNwpAQCAtNyw3ICs3LDcgQEAKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQogICAgIERhdGFzaGVldDogTm8gbG9uZ2VyIGF2YWlsYWJsZQogCi1BdXRob3I6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorQXV0aG9yOiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIFRoYW5rcyB0byBBbWlyIEhhYmliaSBhdCBDYW5kZWxpcyBmb3Igc2V0dGluZyB1cCBhIHRlc3Qgc3lzdGVtLCBhbmQgdG8KIE1pY2hhZWwgS3Jlc3MgZm9yIHRlc3Rpbmcgc2V2ZXJhbCBpdGVyYXRpb25zIG9mIHRoaXMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9wY2Y4NTkxIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wY2Y4NTkxCmluZGV4IGFjMDIwYjMuLjQ0N2MwNzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vcGNmODU5MQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3BjZjg1OTEKQEAgLTExLDcgKzExLDcgQEAKIEF1dGhvcnM6CiAgICAgICAgIEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4KICAgICAgICAgdmFsdWFibGUgY29udHJpYnV0aW9ucyBieSBKYW4gTS4gU2VuZGxlciA8c2VuZGxlckBzZW5kbGVyLmRlPiwKLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogCiBEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMSBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEKaW5kZXggMmExMzM3OC4uMTBhMjRiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIFdpdGggYXNzaXN0YW5jZSBmcm9tIEJydWNlIEFsbGVuIDxiYWxsZW5AdXdtLmVkdT4sIGFuZCBoaXMKICAgICAgICAgZmFuLmMgcHJvZ3JhbTogaHR0cDovL3d3dy5sc2MtZ3JvdXAucGh5cy51d20uZWR1LyU3RWJhbGxlbi9kcml2ZXIvCiAgICAgICAgIEdhYnJpZWxlIEdvcmxhIDxnb3JsaWtAeWFob28uY29tPiwKLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZiBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCmluZGV4IGNlYWY2ZjYuLjczNWM0MmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCkBAIC0zNiw3ICszNiw3IEBACiAgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSBOdXZvdG9uIHVwb24gcmVxdWVzdAogCiBBdXRob3JzOgotICAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICAgICAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICAgICAgICBZdWFuIE11IChXaW5ib25kKQogICAgICAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgogICAgICAgICBEYXZpZCBIdWJiYXJkIDxkYXZpZC5jLmh1YmJhcmRAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5NQppbmRleCA5ZjE2MDM3Li5kM2U2NzgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5NQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5NQpAQCAtMTMsNyArMTMsNyBAQAogCiBBdXRob3JzOgogICAgIFdlaSBTb25nIChOdXZvdG9uKQotICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogCiBQaW4gbWFwcGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg1dHMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4M2w3ODV0cwppbmRleCBiZDFmYTlkLi5jODk3ODQ3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4M2w3ODV0cworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4M2w3ODV0cwpAQCAtOSw3ICs5LDcgQEAKICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cud2luYm9uZC11c2EuY29tL3Byb2R1Y3RzL3dpbmJvbmRfcHJvZHVjdHMvcGRmcy9QQ0lDL1c4M0w3ODVUUy1TLnBkZgogCiBBdXRob3JzOgotICAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICAgICAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiBEZXNjcmlwdGlvbgogLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMSBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMQppbmRleCA3YjBkY2RiLi5hYWFmMDY5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1pODAxCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMQpAQCAtMzMsNyArMzMsNyBAQAogCiBBdXRob3JzOiAKIAlNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+Ci0JSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiAKIE1vZHVsZSBQYXJhbWV0ZXJzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQKaW5kZXggMjQ2MWM3Yi4uMGUyZDE3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGFycG9ydApAQCAtMSw2ICsxLDYgQEAKIEtlcm5lbCBkcml2ZXIgaTJjLXBhcnBvcnQKIAotQXV0aG9yOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gCitBdXRob3I6IEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogVGhpcyBpcyBhIHVuaWZpZWQgZHJpdmVyIGZvciBzZXZlcmFsIGkyYy1vdmVyLXBhcmFsbGVsLXBvcnQgYWRhcHRlcnMsCiBzdWNoIGFzIHRoZSBvbmVzIG1hZGUgYnkgUGhpbGlwcywgVmVsbGVtYW4gb3IgRUxWLiBUaGlzIGRyaXZlciBpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0IGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0CmluZGV4IGMyMmVlMDYuLjcwNzFiOGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQKQEAgLTEsNiArMSw2IEBACiBLZXJuZWwgZHJpdmVyIGkyYy1wYXJwb3J0LWxpZ2h0CiAKLUF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+IAorQXV0aG9yOiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIFRoaXMgZHJpdmVyIGlzIGEgbGlnaHQgdmVyc2lvbiBvZiBpMmMtcGFycG9ydC4gSXQgZG9lc24ndCBkZXBlbmQgICAgICAgIAogb24gdGhlIHBhcnBvcnQgZHJpdmVyLCBhbmQgdXNlcyBkaXJlY3QgSS9PIGFjY2VzcyBpbnN0ZWFkLiBUaGlzIG1pZ2h0IGJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBpaXg0IGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NAppbmRleCBjMDk3ZTBmLi5hYTk1OWZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBpaXg0CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGlpeDQKQEAgLTEzLDcgKzEzLDcgQEAKICAgKiBBTUQgU1A1MTAwIChTQjcwMCBkZXJpdmF0aXZlIGZvdW5kIG9uIHNvbWUgc2VydmVyIG1haW5ib2FyZHMpCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIEFNRCB3ZWJzaXRlCiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9FbWJlZGRlZF9UZWNoRG9jcy80NDQxMy5wZGYKLSAgKiBBTUQgSHVkc29uLTIsIENaCisgICogQU1EIEh1ZHNvbi0yLCBNTCwgQ1oKICAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUKICAgKiBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgKFNNU0MpIFNMQzkwRTY2IChWaWN0b3J5NjYpIHNvdXRoYnJpZGdlCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFNNU0Mgd2Vic2l0ZSBodHRwOi8vd3d3LnNtc2MuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bQppbmRleCA2M2Y2MmJjLi42MDI5OTU1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdGFvcy1ldm0KQEAgLTEsNiArMSw2IEBACiBLZXJuZWwgZHJpdmVyIGkyYy10YW9zLWV2bQogCi1BdXRob3I6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorQXV0aG9yOiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBldmFsdWF0aW9uIG1vZHVsZXMgZm9yIFRBT1MgSTJDL1NNQnVzIGNoaXBzLgogVGhlIG1vZHVsZXMgaW5jbHVkZSBhbiBTTUJ1cyBtYXN0ZXIgd2l0aCBsaW1pdGVkIGNhcGFiaWxpdGllcywgd2hpY2ggY2FuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXZpYXBybyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCmluZGV4IGI4OGY5MWEuLmFiNjRjZTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCkBAIC0yOCw3ICsyOCw3IEBACiBBdXRob3JzOgogCUt5w7ZzdGkgTcOkbGtraSA8a21hbGtraUBjYy5odXQuZmk+LAogCU1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCi0JSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiBNb2R1bGUgUGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaWRlLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9pZGUvMDAtSU5ERVgKaW5kZXggZDZiNzc4OC4uMjJmOThjYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pZGUvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9pZGUvMDAtSU5ERVgKQEAgLTEwLDMgKzEwLDUgQEAKIAktIGluZm8gb24gdGhlIElERSBBVEFQSSBzdHJlYW1pbmcgdGFwZSBkcml2ZXIKIGlkZS50eHQKIAktIGltcG9ydGFudCBpbmZvIGZvciB1c2VycyBvZiBBVEEgZGV2aWNlcyAoSURFL0VJREUgZGlza3MgYW5kIENELVJPTVMpLgord2FybS1wbHVnLWhvd3RvLnR4dAorCS0gdXNpbmcgc3lzZnMgdG8gcmVtb3ZlIGFuZCBhZGQgSURFIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA4ZjQ0MWRhLi43MTE2ZmRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMTcyNiwxNiArMTcyNiwxNiBAQAogCQkJb3B0aW9uIGRlc2NyaXB0aW9uLgogCiAJbWVtbWFwPW5uW0tNR11Ac3NbS01HXQotCQkJW0tOTF0gRm9yY2UgdXNhZ2Ugb2YgYSBzcGVjaWZpYyByZWdpb24gb2YgbWVtb3J5Ci0JCQlSZWdpb24gb2YgbWVtb3J5IHRvIGJlIHVzZWQsIGZyb20gc3MgdG8gc3Mrbm4uCisJCQlbS05MXSBGb3JjZSB1c2FnZSBvZiBhIHNwZWNpZmljIHJlZ2lvbiBvZiBtZW1vcnkuCisJCQlSZWdpb24gb2YgbWVtb3J5IHRvIGJlIHVzZWQgaXMgZnJvbSBzcyB0byBzcytubi4KIAogCW1lbW1hcD1ubltLTUddI3NzW0tNR10KIAkJCVtLTkwsQUNQSV0gTWFyayBzcGVjaWZpYyBtZW1vcnkgYXMgQUNQSSBkYXRhLgotCQkJUmVnaW9uIG9mIG1lbW9yeSB0byBiZSB1c2VkLCBmcm9tIHNzIHRvIHNzK25uLgorCQkJUmVnaW9uIG9mIG1lbW9yeSB0byBiZSBtYXJrZWQgaXMgZnJvbSBzcyB0byBzcytubi4KIAogCW1lbW1hcD1ubltLTUddJHNzW0tNR10KIAkJCVtLTkwsQUNQSV0gTWFyayBzcGVjaWZpYyBtZW1vcnkgYXMgcmVzZXJ2ZWQuCi0JCQlSZWdpb24gb2YgbWVtb3J5IHRvIGJlIHVzZWQsIGZyb20gc3MgdG8gc3Mrbm4uCisJCQlSZWdpb24gb2YgbWVtb3J5IHRvIGJlIHJlc2VydmVkIGlzIGZyb20gc3MgdG8gc3Mrbm4uCiAJCQlFeGFtcGxlOiBFeGNsdWRlIG1lbW9yeSBmcm9tIDB4MTg2OTAwMDAtMHgxODY5ZmZmZgogCQkJICAgICAgICAgbWVtbWFwPTY0SyQweDE4NjkwMDAwCiAJCQkgICAgICAgICBvcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzLzAwLUlOREVYCmluZGV4IGZhNjg4NTMuLmQxM2I5YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvMDAtSU5ERVgKQEAgLTEsMTMgKzEsMTUgQEAKIDAwLUlOREVYCiAJLSBUaGlzIGZpbGUKLWFjZXItd21pLnR4dAotCS0gaW5mb3JtYXRpb24gb24gdGhlIEFjZXIgTGFwdG9wIFdNSSBFeHRyYXMgZHJpdmVyLgorTWFrZWZpbGUKKwktIE1ha2VmaWxlIGZvciBidWlsZGluZyBkc2xtIGV4YW1wbGUgcHJvZ3JhbS4KIGFzdXMtbGFwdG9wLnR4dAogCS0gaW5mb3JtYXRpb24gb24gdGhlIEFzdXMgTGFwdG9wIEV4dHJhcyBkcml2ZXIuCiBkaXNrLXNob2NrLXByb3RlY3Rpb24udHh0CiAJLSBpbmZvcm1hdGlvbiBvbiBoYXJkIGRpc2sgc2hvY2sgcHJvdGVjdGlvbi4KIGRzbG0uYwogCS0gU2ltcGxlIERpc2sgU2xlZXAgTW9uaXRvciBwcm9ncmFtCitocGZhbGwuYworCS0gKEhQKSBsYXB0b3AgYWNjZWxlcm9tZXRlciBwcm9ncmFtIGZvciBkaXNrIHByb3RlY3Rpb24uCiBsYXB0b3AtbW9kZS50eHQKIAktIGhvdyB0byBjb25zZXJ2ZSBiYXR0ZXJ5IHBvd2VyIHVzaW5nIGxhcHRvcC1tb2RlLgogc29ueS1sYXB0b3AudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2xlZHMvMDAtSU5ERVgKaW5kZXggMWVjZDE1OS4uYjRlZjFmMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZWRzLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy8wMC1JTkRFWApAQCAtMSwzICsxLDcgQEAKKzAwLUlOREVYCisJLSBUaGlzIGZpbGUKK2xlZHMtYmxpbmttLnR4dAorCS0gRHJpdmVyIGZvciBCbGlua00gTEVELWRldmljZXMuCiBsZWRzLWNsYXNzLnR4dAogCS0gZG9jdW1lbnRzIExFRCBoYW5kbGluZyB1bmRlciBMaW51eC4KIGxlZHMtbHAzOTQ0LnR4dApAQCAtMTIsMyArMTYsNyBAQAogCS0gZGVzY3JpcHRpb24gYWJvdXQgbHA1NXh4IGNvbW1vbiBkcml2ZXIuCiBsZWRzLWxtMzU1Ni50eHQKIAktIG5vdGVzIG9uIGhvdyB0byB1c2UgdGhlIGxlZHMtbG0zNTU2IGRyaXZlci4KK2xlZHRyaWctb25lc2hvdC50eHQKKwktIE9uZS1zaG90IExFRCB0cmlnZ2VyIGZvciBib3RoIHNwb3JhZGljIGFuZCBkZW5zZSBldmVudHMuCitsZWR0cmlnLXRyYW5zaWVudC50eHQKKwktIExFRCBUcmFuc2llbnQgVHJpZ2dlciwgb25lIHNob3QgdGltZXIgYWN0aXZhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbTY4ay8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbTY4ay8wMC1JTkRFWAppbmRleCBhMDE0ZTlmLi4yYmU4YzZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL202OGsvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9tNjhrLzAwLUlOREVYCkBAIC0xLDUgKzEsNyBAQAogMDAtSU5ERVgKIAktIHRoaXMgZmlsZQorUkVBRE1FLmJ1ZGRoYQorCS0gQW1pZ2EgQnVkZGhhIGFuZCBDYXR3ZWFzZWwgSURFIERyaXZlcgoga2VybmVsLW9wdGlvbnMudHh0CiAJLSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgTGludXgvbTY4awogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9lZXByb20gYi9Eb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9lZXByb20KaW5kZXggZjdlODEwNC4uYmE2OTIwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvZWVwcm9tCisrKyBiL0RvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2VlcHJvbQpAQCAtMzgsNyArMzgsNyBAQAogQXV0aG9yczoKICAgICAgICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwKLSAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+LAorICAgICAgICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+LAogICAgICAgICBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiwKICAgICAgICAgSUJNIENvcnAuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAppbmRleCBmMTE1ODBmLi41NTdiNmVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCkBAIC02LDggKzYsMTQgQEAKIAktIGluZm9ybWF0aW9uIG9uIHRoZSAzQ29tIEV0aGVybGluayBJSUkgU2VyaWVzIEV0aGVybmV0IGNhcmRzLgogNnBhY2sudHh0CiAJLSBpbmZvIG9uIHRoZSA2cGFjayBwcm90b2NvbCwgYW4gYWx0ZXJuYXRpdmUgdG8gS0lTUyBmb3IgQVguMjUKLURMSU5LLnR4dAotCS0gaW5mbyBvbiB0aGUgRC1MaW5rIERFLTYwMC9ERS02MjAgcGFyYWxsZWwgcG9ydCBwb2NrZXQgYWRhcHRlcnMKK0xJQ0VOU0UucWxhM3h4eAorCS0gR1BMdjIgZm9yIFFMb2dpYyBMaW51eCBOZXR3b3JraW5nIEhCQSBEcml2ZXIKK0xJQ0VOU0UucWxnZQorCS0gR1BMdjIgZm9yIFFMb2dpYyBMaW51eCBxbGdlIE5JQyBEcml2ZXIKK0xJQ0VOU0UucWxjbmljCisJLSBHUEx2MiBmb3IgUUxvZ2ljIExpbnV4IHFsY25pYyBOSUMgRHJpdmVyCitNYWtlZmlsZQorCS0gTWFrZWZpbGUgZm9yIGRvY3NyYy4KIFBMSVAudHh0CiAJLSBQTElQOiBUaGUgUGFyYWxsZWwgTGluZSBJbnRlcm5ldCBQcm90b2NvbCBkZXZpY2UgZHJpdmVyCiBSRUFETUUuaXB3MjEwMApAQCAtMTcsNyArMjMsNyBAQAogUkVBRE1FLnNiMTAwMAogCS0gaW5mbyBvbiBHZW5lcmFsIEluc3RydW1lbnQvTmV4dExldmVsIFNVUkZib2FyZDEwMDAgY2FibGUgbW9kZW0uCiBhbGlhcy50eHQKLQktIGluZm8gb24gdXNpbmcgYWxpYXMgbmV0d29yayBkZXZpY2VzIAorCS0gaW5mbyBvbiB1c2luZyBhbGlhcyBuZXR3b3JrIGRldmljZXMuCiBhcmNuZXQtaGFyZHdhcmUudHh0CiAJLSB0b25zIG9mIGluZm8gb24gQVJDbmV0LCBodWJzLCBqdW1wZXIgc2V0dGluZ3MgZm9yIEFSQ25ldCBjYXJkcywgZXRjLgogYXJjbmV0LnR4dApAQCAtODAsNyArODYsNyBAQAogCS0gaW5mbyBvbiB1c2luZyBGcmFtZSBSZWxheS9EYXRhIExpbmsgQ29ubmVjdGlvbiBJZGVudGlmaWVyIChETENJKS4KIGdlbl9zdGF0cy50eHQKIAktIEdlbmVyaWMgbmV0d29ya2luZyBzdGF0aXN0aWNzIGZvciBuZXRsaW5rIHVzZXJzLgotZ2VuZXJpY19oZGxjLnR4dAorZ2VuZXJpYy1oZGxjLnR4dAogCS0gVGhlIGdlbmVyaWMgSGlnaCBMZXZlbCBEYXRhIExpbmsgQ29udHJvbCAoSERMQykgbGF5ZXIuCiBnZW5lcmljX25ldGxpbmsudHh0CiAJLSBpbmZvIG9uIEdlbmVyaWMgTmV0bGluawpAQCAtODgsNiArOTQsOCBAQAogCS0gR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIuCiBpNDBlLnR4dAogCS0gUkVBRE1FIGZvciB0aGUgSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBEcml2ZXIgKGk0MGUpLgoraTQwZXZmLnR4dAorCS0gU2hvcnQgbm90ZSBvbiB0aGUgRHJpdmVyIGZvciB0aGUgSW50ZWwoUikgWEw3MTAgWDcxMCBWaXJ0dWFsIEZ1bmN0aW9uCiBpZWVlODAyMTU0LnR4dAogCS0gTGludXggSUVFRSA4MDIuMTUuNCBpbXBsZW1lbnRhdGlvbiwgQVBJIGFuZCBkcml2ZXJzCiBpZ2IudHh0CkBAIC0xMDIsNiArMTEwLDggQEAKIAktIEFwcGxlVGFsay1JUCBEZWNhcHN1bGF0aW9uIGFuZCBBcHBsZVRhbGstSVAgRW5jYXBzdWxhdGlvbgogaXBoYXNlLnR4dAogCS0gSW50ZXJwaGFzZSBQQ0kgQVRNIChpKUNoaXAgSUEgTGludXggZHJpdmVyIGluZm8uCitpcHNlYy50eHQKKwktIE5vdGUgb24gbm90IGNvbXByZXNzaW5nIElQU2VjIHBheWxvYWQgYW5kIHJlc3VsdGluZyBmYWlsZWQgcG9saWN5IGNoZWNrLgogaXB2Ni50eHQKIAktIE9wdGlvbnMgdG8gdGhlIGlwdjYga2VybmVsIG1vZHVsZS4KIGlwdnMtc3lzY3RsLnR4dApAQCAtMTIwLDYgKzEzMCw4IEBACiAJLSBwcm9ncmFtbWluZyBpbmZvcm1hdGlvbiBvZiB0aGUgTEFQQiBtb2R1bGUuCiBsdHBjLnR4dAogCS0gdGhlIEFwcGxlIG9yIEZhcmFsbG9uIExvY2FsVGFsayBQQyBjYXJkIGRyaXZlcgorbWFjODAyMTEtYXV0aC1hc3NvYy1kZWF1dGgudHh0CisJLSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gLyBkZWF1dGgtZGlzYXNzb2Mgd2l0aCBtYXg4MDIxMQogbWFjODAyMTEtaW5qZWN0aW9uLnR4dAogCS0gSE9XVE8gdXNlIHBhY2tldCBpbmplY3Rpb24gd2l0aCBtYWM4MDIxMQogbXVsdGlxdWV1ZS50eHQKQEAgLTEzNCw2ICsxNDYsMTAgQEAKIAktIGluZm8gb24gbmV0d29yayBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9ucyBleHBvcnRlZCB0byB0aGUga2VybmVsLgogbmV0aWYtbXNnLnR4dAogCS0gRGVzaWduIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBtZXNzYWdlIGxldmVsIHNldHRpbmcgKE5FVElGX01TR18qKS4KK25ldGxpbmtfbW1hcC50eHQKKwktIG1lbW9yeSBtYXBwZWQgSS9PIHdpdGggbmV0bGluaworbmZfY29ubnRyYWNrLXN5c2N0bC50eHQKKwktIGxpc3Qgb2YgbmV0ZmlsdGVyLXN5c2N0bCBrbm9icy4KIG5mYy50eHQKIAktIFRoZSBMaW51eCBOZWFyIEZpZWxkIENvbW11bmljYXRpb24gKE5GUykgc3Vic3lzdGVtLgogb3BlbnZzd2l0Y2gudHh0CkBAIC0xNzYsNyArMTkyLDcgQEAKIAktIFN5c0tvbm5lY3QgRkRESSAoU0stNXh4eCwgQ29tcGFxIE5ldGVsbGlnZW50KSBkcml2ZXIgaW5mby4KIHNtYzkudHh0CiAJLSB0aGUgZHJpdmVyIGZvciBTTUMncyA5MDAwIHNlcmllcyBvZiBFdGhlcm5ldCBjYXJkcwotc3BpZGVyLW5ldC50eHQKK3NwaWRlcl9uZXQudHh0CiAJLSBSRUFETUUgZm9yIHRoZSBTcGlkZXJuZXQgRHJpdmVyIChhcyBmb3VuZCBpbiBQUzMgLyBDZWxsIEJFKS4KIHN0bW1hYy50eHQKIAktIFJFQURNRSBmb3IgdGhlIFNUTWljcm8gU3lub3BzeXMgRXRoZXJuZXQgZHJpdmVyLgpAQCAtMTg4LDYgKzIwNCw4IEBACiAJLSBzaG9ydCBibHVyYiBvbiBob3cgVENQIG91dHB1dCB0YWtlcyBwbGFjZS4KIHRjcC10aGluLnR4dAogCS0ga2VybmVsIHR1bmluZyBvcHRpb25zIGZvciBsb3cgcmF0ZSAndGhpbicgVENQIHN0cmVhbXMuCit0ZWFtLnR4dAorCS0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBmb3IgZXRoZXJuZXQgdGVhbWluZyBkZXZpY2VzLgogdGxhbi50eHQKIAktIFRodW5kZXJMQU4gKENvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAsIE9saWNvbSBPQy0yeHh4KSBkcml2ZXIgaW5mby4KIHRwcm94eS50eHQKQEAgLTIwMCw2ICsyMTgsOCBAQAogCS0gaW5mbyBvbiB1c2luZyAzQ29tIFZvcnRleCAoM2M1OTAsIDNjNTkyLCAzYzU5NSwgM2M1OTcpIEV0aGVybmV0IGNhcmRzLgogdnhnZS50eHQKIAktIFJFQURNRSBmb3IgdGhlIE5ldGVyaW9uIFgzMTAwIFBDSWUgU2VydmVyIEFkYXB0ZXIuCit2eGxhbi50eHQKKwktIFZpcnR1YWwgZXh0ZW5zaWJsZSBMQU4gb3ZlcnZpZXcKIHgyNS50eHQKIAktIGdlbmVyYWwgaW5mbyBvbiBYLjI1IGRldmVsb3BtZW50LgogeDI1LWlmYWNlLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCA1ZGUwMzc0Li5hYjQyYzk1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMTA4OCw2ICsxMDg4LDEyIEBACiAJSUdNUHYzIHJlcG9ydCByZXRyYW5zbWl0IHdpbGwgdGFrZSBwbGFjZS4KIAlEZWZhdWx0OiAxMDAwICgxIHNlY29uZHMpCiAKK3Byb21vdGVfc2Vjb25kYXJpZXMgLSBCT09MRUFOCisJV2hlbiBhIHByaW1hcnkgSVAgYWRkcmVzcyBpcyByZW1vdmVkIGZyb20gdGhpcyBpbnRlcmZhY2UKKwlwcm9tb3RlIGEgY29ycmVzcG9uZGluZyBzZWNvbmRhcnkgSVAgYWRkcmVzcyBpbnN0ZWFkIG9mCisJcmVtb3ZpbmcgYWxsIHRoZSBjb3JyZXNwb25kaW5nIHNlY29uZGFyeSBJUCBhZGRyZXNzZXMuCisKKwogdGFnIC0gSU5URUdFUgogCUFsbG93cyB5b3UgdG8gd3JpdGUgYSBudW1iZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIHJlcXVpcmVkLgogCURlZmF1bHQgdmFsdWUgaXMgMC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CmluZGV4IDkxZmZlMWQuLjE0MDQ2NzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dApAQCAtNTgzLDYgKzU4Myw3IEBACiAgIC0gUEFDS0VUX0ZBTk9VVF9DUFU6IHNjaGVkdWxlIHRvIHNvY2tldCBieSBDUFUgcGFja2V0IGFycml2ZXMgb24KICAgLSBQQUNLRVRfRkFOT1VUX1JORDogc2NoZWR1bGUgdG8gc29ja2V0IGJ5IHJhbmRvbSBzZWxlY3Rpb24KICAgLSBQQUNLRVRfRkFOT1VUX1JPTExPVkVSOiBpZiBvbmUgc29ja2V0IGlzIGZ1bGwsIHJvbGxvdmVyIHRvIGFub3RoZXIKKyAgLSBQQUNLRVRfRkFOT1VUX1FNOiBzY2hlZHVsZSB0byBzb2NrZXQgYnkgc2ticyByZWNvcmRlZCBxdWV1ZV9tYXBwaW5nCiAKIE1pbmltYWwgZXhhbXBsZSBjb2RlIGJ5IERhdmlkIFMuIE1pbGxlciAodHJ5IHRoaW5ncyBsaWtlICIuL3Rlc3QgZXRoMCBoYXNoIiwKICIuL3Rlc3QgZXRoMCBsYiIsIGV0Yy4pOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vcG93ZXIvMDAtSU5ERVgKaW5kZXggYTRkNjgyZi4uYWQwNGNjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyLzAwLUlOREVYCkBAIC00LDYgKzQsOCBAQAogCS0gYmFzaWMgaW5mbyBhYm91dCB0aGUgQVBNIGFuZCBBQ1BJIHN1cHBvcnQuCiBiYXNpYy1wbS1kZWJ1Z2dpbmcudHh0CiAJLSBEZWJ1Z2dpbmcgc3VzcGVuZCBhbmQgcmVzdW1lCitjaGFyZ2VyLW1hbmFnZXIudHh0CisJLSBCYXR0ZXJ5IGNoYXJnZXIgbWFuYWdlbWVudC4KIGRldmljZXMudHh0CiAJLSBIb3cgZHJpdmVycyBpbnRlcmFjdCB3aXRoIHN5c3RlbS13aWRlIHBvd2VyIG1hbmFnZW1lbnQKIGRyaXZlcnMtdGVzdGluZy50eHQKQEAgLTIyLDYgKzI0LDggQEAKIAktIGluZm8gb24gTGludXggUE0gUXVhbGl0eSBvZiBTZXJ2aWNlIGludGVyZmFjZQogcG93ZXJfc3VwcGx5X2NsYXNzLnR4dAogCS0gVGVsbHMgdXNlcnNwYWNlIGFib3V0IGJhdHRlcnksIFVQUywgQUMgb3IgREMgcG93ZXIgc3VwcGx5IHByb3BlcnRpZXMKK3J1bnRpbWVfcG0udHh0CisJLSBQb3dlciBtYW5hZ2VtZW50IGZyYW1ld29yayBmb3IgSS9PIGRldmljZXMuCiBzMnJhbS50eHQKIAktIEhvdyB0byBnZXQgc3VzcGVuZCB0byByYW0gd29ya2luZyAoYW5kIGRlYnVnIGl0IHdoZW4gaXQgaXNuJ3QpCiBzdGF0ZXMudHh0CkBAIC0zOCw3ICs0Miw1IEBACiAJLSBIb3cgdG8gdHJpY2sgc29mdHdhcmUgc3VzcGVuZCAodG8gZGlzaykgaW50byB3b3JraW5nIHdoZW4gaXQgaXNuJ3QKIHVzZXJsYW5kLXN3c3VzcC50eHQKIAktIEV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiBvZiBzb2Z0d2FyZSBzdXNwZW5kIGluIHVzZXJzcGFjZQotdmlkZW9fZXh0ZW5zaW9uLnR4dAotCS0gQUNQSSB2aWRlbyBleHRlbnNpb25zCiB2aWRlby50eHQKIAktIFZpZGVvIGlzc3VlcyBkdXJpbmcgcmVzdW1lIGZyb20gc3VzcGVuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wdHAvdGVzdHB0cC5jIGIvRG9jdW1lbnRhdGlvbi9wdHAvdGVzdHB0cC5jCmluZGV4IGE3NGQwYTguLjRhYmEwNDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcHRwL3Rlc3RwdHAuYworKysgYi9Eb2N1bWVudGF0aW9uL3B0cC90ZXN0cHRwLmMKQEAgLTExNyw2ICsxMTcsNyBAQAogCQkiIC1mIHZhbCAgICAgYWRqdXN0IHRoZSBwdHAgY2xvY2sgZnJlcXVlbmN5IGJ5ICd2YWwnIHBwYlxuIgogCQkiIC1nICAgICAgICAgZ2V0IHRoZSBwdHAgY2xvY2sgdGltZVxuIgogCQkiIC1oICAgICAgICAgcHJpbnRzIHRoaXMgbWVzc2FnZVxuIgorCQkiIC1pIHZhbCAgICAgaW5kZXggZm9yIGV2ZW50L3RyaWdnZXJcbiIKIAkJIiAtayB2YWwgICAgIG1lYXN1cmUgdGhlIHRpbWUgb2Zmc2V0IGJldHdlZW4gc3lzdGVtIGFuZCBwaGMgY2xvY2tcbiIKIAkJIiAgICAgICAgICAgIGZvciAndmFsJyB0aW1lcyAoTWF4aW11bSAyNSlcbiIKIAkJIiAtcCB2YWwgICAgIGVuYWJsZSBvdXRwdXQgd2l0aCBhIHBlcmlvZCBvZiAndmFsJyBuYW5vc2Vjb25kc1xuIgpAQCAtMTU0LDYgKzE1NSw3IEBACiAJaW50IGNhcGFiaWxpdGllcyA9IDA7CiAJaW50IGV4dHRzID0gMDsKIAlpbnQgZ2V0dGltZSA9IDA7CisJaW50IGluZGV4ID0gMDsKIAlpbnQgb25lc2hvdCA9IDA7CiAJaW50IHBjdF9vZmZzZXQgPSAwOwogCWludCBuX3NhbXBsZXMgPSAwOwpAQCAtMTY3LDcgKzE2OSw3IEBACiAKIAlwcm9nbmFtZSA9IHN0cnJjaHIoYXJndlswXSwgJy8nKTsKIAlwcm9nbmFtZSA9IHByb2duYW1lID8gMStwcm9nbmFtZSA6IGFyZ3ZbMF07Ci0Jd2hpbGUgKEVPRiAhPSAoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYTpBOmNkOmU6ZjpnaGs6cDpQOnNTdDp2IikpKSB7CisJd2hpbGUgKEVPRiAhPSAoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYTpBOmNkOmU6ZjpnaGk6azpwOlA6c1N0OnYiKSkpIHsKIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJ2EnOgogCQkJb25lc2hvdCA9IGF0b2kob3B0YXJnKTsKQEAgLTE5MCw2ICsxOTIsOSBAQAogCQljYXNlICdnJzoKIAkJCWdldHRpbWUgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJaW5kZXggPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKIAkJY2FzZSAnayc6CiAJCQlwY3Rfb2Zmc2V0ID0gMTsKIAkJCW5fc2FtcGxlcyA9IGF0b2kob3B0YXJnKTsKQEAgLTMwMSw3ICszMDYsNyBAQAogCiAJaWYgKGV4dHRzKSB7CiAJCW1lbXNldCgmZXh0dHNfcmVxdWVzdCwgMCwgc2l6ZW9mKGV4dHRzX3JlcXVlc3QpKTsKLQkJZXh0dHNfcmVxdWVzdC5pbmRleCA9IDA7CisJCWV4dHRzX3JlcXVlc3QuaW5kZXggPSBpbmRleDsKIAkJZXh0dHNfcmVxdWVzdC5mbGFncyA9IFBUUF9FTkFCTEVfRkVBVFVSRTsKIAkJaWYgKGlvY3RsKGZkLCBQVFBfRVhUVFNfUkVRVUVTVCwgJmV4dHRzX3JlcXVlc3QpKSB7CiAJCQlwZXJyb3IoIlBUUF9FWFRUU19SRVFVRVNUIik7CkBAIC0zNzUsNyArMzgwLDcgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCQltZW1zZXQoJnBlcm91dF9yZXF1ZXN0LCAwLCBzaXplb2YocGVyb3V0X3JlcXVlc3QpKTsKLQkJcGVyb3V0X3JlcXVlc3QuaW5kZXggPSAwOworCQlwZXJvdXRfcmVxdWVzdC5pbmRleCA9IGluZGV4OwogCQlwZXJvdXRfcmVxdWVzdC5zdGFydC5zZWMgPSB0cy50dl9zZWMgKyAyOwogCQlwZXJvdXRfcmVxdWVzdC5zdGFydC5uc2VjID0gMDsKIAkJcGVyb3V0X3JlcXVlc3QucGVyaW9kLnNlYyA9IDA7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3MzOTAvMDAtSU5ERVgKaW5kZXggM2EyYjk2My4uMTBjODc0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vczM5MC8wMC1JTkRFWApAQCAtMTYsMTEgKzE2LDEzIEBACiAJLSBoaW50cyBmb3IgZGVidWdnaW5nIG9uIHMzOTAgc3lzdGVtcy4KIGRyaXZlci1tb2RlbC50eHQKIAktIGluZm9ybWF0aW9uIG9uIHMzOTAgZGV2aWNlcyBhbmQgdGhlIGRyaXZlciBtb2RlbC4KK2t2bS50eHQKKwktIGlvY3RsIGNhbGxzIHRvIC9kZXYva3ZtIG9uIHMzOTAuCiBtb25yZWFkZXIudHh0CiAJLSBpbmZvcm1hdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIHovVk0gbW9uaXRvciBzdHJlYW0gZnJvbSBMaW51eC4KK3FldGgudHh0CisJLSBIaXBlclNvY2tldHMgQnJpZGdlIFBvcnQgU3VwcG9ydC4KIHMzOTBkYmYudHh0CiAJLSBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgczM5MCBkZWJ1ZyBmZWF0dXJlLgotVEFQRQotCS0gaW5mb3JtYXRpb24gb24gdGhlIGRyaXZlciBmb3IgY2hhbm5lbC1hdHRhY2hlZCB0YXBlcy4KLXpmY3BkdW1wCit6ZmNwZHVtcC50eHQKIAktIGluZm9ybWF0aW9uIG9uIHRoZSBzMzkwIFNDU0kgZHVtcCB0b29sLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWAppbmRleCBkMjY1MWM0Li5lY2NmN2FkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWApAQCAtMiw2ICsyLDggQEAKIAktIHRoaXMgZmlsZS4KIHNjaGVkLWFyY2gudHh0CiAJLSBDUFUgU2NoZWR1bGVyIGltcGxlbWVudGF0aW9uIGhpbnRzIGZvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZS4KK3NjaGVkLWJ3Yy50eHQKKwktIENGUyBiYW5kd2lkdGggY29udHJvbCBvdmVydmlldy4KIHNjaGVkLWRlc2lnbi1DRlMudHh0CiAJLSBnb2FscywgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGxldGVseSBGYWlyIFNjaGVkdWxlci4KIHNjaGVkLWRvbWFpbnMudHh0CkBAIC0xMCw1ICsxMiw3IEBACiAJLSBIb3cgYW5kIHdoeSB0aGUgc2NoZWR1bGVyJ3MgbmljZSBsZXZlbHMgYXJlIGltcGxlbWVudGVkLgogc2NoZWQtcnQtZ3JvdXAudHh0CiAJLSByZWFsLXRpbWUgZ3JvdXAgc2NoZWR1bGluZy4KK3NjaGVkLWRlYWRsaW5lLnR4dAorCS0gZGVhZGxpbmUgc2NoZWR1bGluZy4KIHNjaGVkLXN0YXRzLnR4dAogCS0gaW5mb3JtYXRpb24gb24gc2NoZWRzdGF0cyAoTGludXggU2NoZWR1bGVyIFN0YXRpc3RpY3MpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWRjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQKQEAgLTAsMCArMSwyODEgQEAKKwkJCSAgRGVhZGxpbmUgVGFzayBTY2hlZHVsaW5nCisJCQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDT05URU5UUworPT09PT09PT0KKworIDAuIFdBUk5JTkcKKyAxLiBPdmVydmlldworIDIuIFNjaGVkdWxpbmcgYWxnb3JpdGhtCisgMy4gU2NoZWR1bGluZyBSZWFsLVRpbWUgVGFza3MKKyA0LiBCYW5kd2lkdGggbWFuYWdlbWVudAorICAgNC4xIFN5c3RlbS13aWRlIHNldHRpbmdzCisgICA0LjIgVGFzayBpbnRlcmZhY2UKKyAgIDQuMyBEZWZhdWx0IGJlaGF2aW9yCisgNS4gVGFza3MgQ1BVIGFmZmluaXR5CisgICA1LjEgU0NIRURfREVBRExJTkUgYW5kIGNwdXNldHMgSE9XVE8KKyA2LiBGdXR1cmUgcGxhbnMKKworCiswLiBXQVJOSU5HCis9PT09PT09PT09CisKKyBGaWRkbGluZyB3aXRoIHRoZXNlIHNldHRpbmdzIGNhbiByZXN1bHQgaW4gYW4gdW5wcmVkaWN0YWJsZSBvciBldmVuIHVuc3RhYmxlCisgc3lzdGVtIGJlaGF2aW9yLiBBcyBmb3IgLXJ0IChncm91cCkgc2NoZWR1bGluZywgaXQgaXMgYXNzdW1lZCB0aGF0IHJvb3QgdXNlcnMKKyBrbm93IHdoYXQgdGhleSdyZSBkb2luZy4KKworCisxLiBPdmVydmlldworPT09PT09PT09PT0KKworIFRoZSBTQ0hFRF9ERUFETElORSBwb2xpY3kgY29udGFpbmVkIGluc2lkZSB0aGUgc2NoZWRfZGwgc2NoZWR1bGluZyBjbGFzcyBpcworIGJhc2ljYWxseSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWFybGllc3QgRGVhZGxpbmUgRmlyc3QgKEVERikgc2NoZWR1bGluZworIGFsZ29yaXRobSwgYXVnbWVudGVkIHdpdGggYSBtZWNoYW5pc20gKGNhbGxlZCBDb25zdGFudCBCYW5kd2lkdGggU2VydmVyLCBDQlMpCisgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBpc29sYXRlIHRoZSBiZWhhdmlvciBvZiB0YXNrcyBiZXR3ZWVuIGVhY2ggb3RoZXIuCisKKworMi4gU2NoZWR1bGluZyBhbGdvcml0aG0KKz09PT09PT09PT09PT09PT09PQorCisgU0NIRURfREVBRExJTkUgdXNlcyB0aHJlZSBwYXJhbWV0ZXJzLCBuYW1lZCAicnVudGltZSIsICJwZXJpb2QiLCBhbmQKKyAiZGVhZGxpbmUiIHRvIHNjaGVkdWxlIHRhc2tzLiBBIFNDSEVEX0RFQURMSU5FIHRhc2sgaXMgZ3VhcmFudGVlZCB0byByZWNlaXZlCisgInJ1bnRpbWUiIG1pY3Jvc2Vjb25kcyBvZiBleGVjdXRpb24gdGltZSBldmVyeSAicGVyaW9kIiBtaWNyb3NlY29uZHMsIGFuZAorIHRoZXNlICJydW50aW1lIiBtaWNyb3NlY29uZHMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gImRlYWRsaW5lIiBtaWNyb3NlY29uZHMKKyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBlcmlvZC4gIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGlzIGJlaGF2aW91ciwKKyBldmVyeSB0aW1lIHRoZSB0YXNrIHdha2VzIHVwLCB0aGUgc2NoZWR1bGVyIGNvbXB1dGVzIGEgInNjaGVkdWxpbmcgZGVhZGxpbmUiCisgY29uc2lzdGVudCB3aXRoIHRoZSBndWFyYW50ZWUgKHVzaW5nIHRoZSBDQlNbMiwzXSBhbGdvcml0aG0pLiBUYXNrcyBhcmUgdGhlbgorIHNjaGVkdWxlZCB1c2luZyBFREZbMV0gb24gdGhlc2Ugc2NoZWR1bGluZyBkZWFkbGluZXMgKHRoZSB0YXNrIHdpdGggdGhlCisgc21hbGxlc3Qgc2NoZWR1bGluZyBkZWFkbGluZSBpcyBzZWxlY3RlZCBmb3IgZXhlY3V0aW9uKS4gTm90aWNlIHRoYXQgdGhpcworIGd1YXJhbnRlZWQgaXMgcmVzcGVjdGVkIGlmIGEgcHJvcGVyICJhZG1pc3Npb24gY29udHJvbCIgc3RyYXRlZ3kgKHNlZSBTZWN0aW9uCisgIjQuIEJhbmR3aWR0aCBtYW5hZ2VtZW50IikgaXMgdXNlZC4KKworIFN1bW1pbmcgdXAsIHRoZSBDQlNbMiwzXSBhbGdvcml0aG1zIGFzc2lnbnMgc2NoZWR1bGluZyBkZWFkbGluZXMgdG8gdGFza3Mgc28KKyB0aGF0IGVhY2ggdGFzayBydW5zIGZvciBhdCBtb3N0IGl0cyBydW50aW1lIGV2ZXJ5IHBlcmlvZCwgYXZvaWRpbmcgYW55CisgaW50ZXJmZXJlbmNlIGJldHdlZW4gZGlmZmVyZW50IHRhc2tzIChiYW5kd2lkdGggaXNvbGF0aW9uKSwgd2hpbGUgdGhlIEVERlsxXQorIGFsZ29yaXRobSBzZWxlY3RzIHRoZSB0YXNrIHdpdGggdGhlIHNtYWxsZXN0IHNjaGVkdWxpbmcgZGVhZGxpbmUgYXMgdGhlIG9uZQorIHRvIGJlIGV4ZWN1dGVkIGZpcnN0LiAgVGhhbmtzIHRvIHRoaXMgZmVhdHVyZSwgYWxzbyB0YXNrcyB0aGF0IGRvIG5vdAorIHN0cmljdGx5IGNvbXBseSB3aXRoIHRoZSAidHJhZGl0aW9uYWwiIHJlYWwtdGltZSB0YXNrIG1vZGVsIChzZWUgU2VjdGlvbiAzKQorIGNhbiBlZmZlY3RpdmVseSB1c2UgdGhlIG5ldyBwb2xpY3kuCisKKyBJbiBtb3JlIGRldGFpbHMsIHRoZSBDQlMgYWxnb3JpdGhtIGFzc2lnbnMgc2NoZWR1bGluZyBkZWFkbGluZXMgdG8KKyB0YXNrcyBpbiB0aGUgZm9sbG93aW5nIHdheToKKworICAtIEVhY2ggU0NIRURfREVBRExJTkUgdGFzayBpcyBjaGFyYWN0ZXJpc2VkIGJ5IHRoZSAicnVudGltZSIsCisgICAgImRlYWRsaW5lIiwgYW5kICJwZXJpb2QiIHBhcmFtZXRlcnM7CisKKyAgLSBUaGUgc3RhdGUgb2YgdGhlIHRhc2sgaXMgZGVzY3JpYmVkIGJ5IGEgInNjaGVkdWxpbmcgZGVhZGxpbmUiLCBhbmQKKyAgICBhICJjdXJyZW50IHJ1bnRpbWUiLiBUaGVzZSB0d28gcGFyYW1ldGVycyBhcmUgaW5pdGlhbGx5IHNldCB0byAwOworCisgIC0gV2hlbiBhIFNDSEVEX0RFQURMSU5FIHRhc2sgd2FrZXMgdXAgKGJlY29tZXMgcmVhZHkgZm9yIGV4ZWN1dGlvbiksCisgICAgdGhlIHNjaGVkdWxlciBjaGVja3MgaWYKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHJ1bnRpbWUgICAgICAgICAgICAgICAgcnVudGltZQorICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+IC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIHNjaGVkdWxpbmcgZGVhZGxpbmUgLSBjdXJyZW50IHRpbWUgICAgICAgICBwZXJpb2QKKworICAgIHRoZW4sIGlmIHRoZSBzY2hlZHVsaW5nIGRlYWRsaW5lIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLCBvcgorICAgIHRoaXMgY29uZGl0aW9uIGlzIHZlcmlmaWVkLCB0aGUgc2NoZWR1bGluZyBkZWFkbGluZSBhbmQgdGhlCisgICAgY3VycmVudCBidWRnZXQgYXJlIHJlLWluaXRpYWxpc2VkIGFzCisKKyAgICAgICAgIHNjaGVkdWxpbmcgZGVhZGxpbmUgPSBjdXJyZW50IHRpbWUgKyBkZWFkbGluZQorICAgICAgICAgY3VycmVudCBydW50aW1lID0gcnVudGltZQorCisgICAgb3RoZXJ3aXNlLCB0aGUgc2NoZWR1bGluZyBkZWFkbGluZSBhbmQgdGhlIGN1cnJlbnQgcnVudGltZSBhcmUKKyAgICBsZWZ0IHVuY2hhbmdlZDsKKworICAtIFdoZW4gYSBTQ0hFRF9ERUFETElORSB0YXNrIGV4ZWN1dGVzIGZvciBhbiBhbW91bnQgb2YgdGltZSB0LCBpdHMKKyAgICBjdXJyZW50IHJ1bnRpbWUgaXMgZGVjcmVhc2VkIGFzCisKKyAgICAgICAgIGN1cnJlbnQgcnVudGltZSA9IGN1cnJlbnQgcnVudGltZSAtIHQKKworICAgICh0ZWNobmljYWxseSwgdGhlIHJ1bnRpbWUgaXMgZGVjcmVhc2VkIGF0IGV2ZXJ5IHRpY2ssIG9yIHdoZW4gdGhlCisgICAgdGFzayBpcyBkZXNjaGVkdWxlZCAvIHByZWVtcHRlZCk7CisKKyAgLSBXaGVuIHRoZSBjdXJyZW50IHJ1bnRpbWUgYmVjb21lcyBsZXNzIG9yIGVxdWFsIHRoYW4gMCwgdGhlIHRhc2sgaXMKKyAgICBzYWlkIHRvIGJlICJ0aHJvdHRsZWQiIChhbHNvIGtub3duIGFzICJkZXBsZXRlZCIgaW4gcmVhbC10aW1lIGxpdGVyYXR1cmUpCisgICAgYW5kIGNhbm5vdCBiZSBzY2hlZHVsZWQgdW50aWwgaXRzIHNjaGVkdWxpbmcgZGVhZGxpbmUuIFRoZSAicmVwbGVuaXNobWVudAorICAgIHRpbWUiIGZvciB0aGlzIHRhc2sgKHNlZSBuZXh0IGl0ZW0pIGlzIHNldCB0byBiZSBlcXVhbCB0byB0aGUgY3VycmVudAorICAgIHZhbHVlIG9mIHRoZSBzY2hlZHVsaW5nIGRlYWRsaW5lOworCisgIC0gV2hlbiB0aGUgY3VycmVudCB0aW1lIGlzIGVxdWFsIHRvIHRoZSByZXBsZW5pc2htZW50IHRpbWUgb2YgYQorICAgIHRocm90dGxlZCB0YXNrLCB0aGUgc2NoZWR1bGluZyBkZWFkbGluZSBhbmQgdGhlIGN1cnJlbnQgcnVudGltZSBhcmUKKyAgICB1cGRhdGVkIGFzCisKKyAgICAgICAgIHNjaGVkdWxpbmcgZGVhZGxpbmUgPSBzY2hlZHVsaW5nIGRlYWRsaW5lICsgcGVyaW9kCisgICAgICAgICBjdXJyZW50IHJ1bnRpbWUgPSBjdXJyZW50IHJ1bnRpbWUgKyBydW50aW1lCisKKworMy4gU2NoZWR1bGluZyBSZWFsLVRpbWUgVGFza3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAqIEJJRyBGQVQgV0FSTklORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSAobm90LXRob3JvdWdoKSBzdW1tYXJ5IG9uIGNsYXNzaWNhbCBkZWFkbGluZQorICogc2NoZWR1bGluZyB0aGVvcnksIGFuZCBob3cgaXQgYXBwbGllcyB0byBTQ0hFRF9ERUFETElORS4KKyAqIFRoZSByZWFkZXIgY2FuICJzYWZlbHkiIHNraXAgdG8gU2VjdGlvbiA0IGlmIG9ubHkgaW50ZXJlc3RlZCBpbiBzZWVpbmcKKyAqIGhvdyB0aGUgc2NoZWR1bGluZyBwb2xpY3kgY2FuIGJlIHVzZWQuIEFueXdheSwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kCisgKiB0byBjb21lIGJhY2sgaGVyZSBhbmQgY29udGludWUgcmVhZGluZyAob25jZSB0aGUgdXJnZSBmb3IgdGVzdGluZyBpcworICogc2F0aXNmaWVkIDpQKSB0byBiZSBzdXJlIG9mIGZ1bGx5IHVuZGVyc3RhbmRpbmcgYWxsIHRlY2huaWNhbCBkZXRhaWxzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgVGhlcmUgYXJlIG5vIGxpbWl0YXRpb25zIG9uIHdoYXQga2luZCBvZiB0YXNrIGNhbiBleHBsb2l0IHRoaXMgbmV3Cisgc2NoZWR1bGluZyBkaXNjaXBsaW5lLCBldmVuIGlmIGl0IG11c3QgYmUgc2FpZCB0aGF0IGl0IGlzIHBhcnRpY3VsYXJseQorIHN1aXRlZCBmb3IgcGVyaW9kaWMgb3Igc3BvcmFkaWMgcmVhbC10aW1lIHRhc2tzIHRoYXQgbmVlZCBndWFyYW50ZWVzIG9uIHRoZWlyCisgdGltaW5nIGJlaGF2aW9yLCBlLmcuLCBtdWx0aW1lZGlhLCBzdHJlYW1pbmcsIGNvbnRyb2wgYXBwbGljYXRpb25zLCBldGMuCisKKyBBIHR5cGljYWwgcmVhbC10aW1lIHRhc2sgaXMgY29tcG9zZWQgb2YgYSByZXBldGl0aW9uIG9mIGNvbXB1dGF0aW9uIHBoYXNlcworICh0YXNrIGluc3RhbmNlcywgb3Igam9icykgd2hpY2ggYXJlIGFjdGl2YXRlZCBvbiBhIHBlcmlvZGljIG9yIHNwb3JhZGljCisgZmFzaGlvbi4KKyBFYWNoIGpvYiBKX2ogKHdoZXJlIEpfaiBpcyB0aGUgal50aCBqb2Igb2YgdGhlIHRhc2spIGlzIGNoYXJhY3RlcmlzZWQgYnkgYW4KKyBhcnJpdmFsIHRpbWUgcl9qICh0aGUgdGltZSB3aGVuIHRoZSBqb2Igc3RhcnRzKSwgYW4gYW1vdW50IG9mIGNvbXB1dGF0aW9uCisgdGltZSBjX2ogbmVlZGVkIHRvIGZpbmlzaCB0aGUgam9iLCBhbmQgYSBqb2IgYWJzb2x1dGUgZGVhZGxpbmUgZF9qLCB3aGljaAorIGlzIHRoZSB0aW1lIHdpdGhpbiB3aGljaCB0aGUgam9iIHNob3VsZCBiZSBmaW5pc2hlZC4gVGhlIG1heGltdW0gZXhlY3V0aW9uCisgdGltZSBtYXhfantjX2p9IGlzIGNhbGxlZCAiV29yc3QgQ2FzZSBFeGVjdXRpb24gVGltZSIgKFdDRVQpIGZvciB0aGUgdGFzay4KKyBBIHJlYWwtdGltZSB0YXNrIGNhbiBiZSBwZXJpb2RpYyB3aXRoIHBlcmlvZCBQIGlmIHJfe2orMX0gPSByX2ogKyBQLCBvcgorIHNwb3JhZGljIHdpdGggbWluaW11bSBpbnRlci1hcnJpdmFsIHRpbWUgUCBpcyByX3tqKzF9ID49IHJfaiArIFAuIEZpbmFsbHksCisgZF9qID0gcl9qICsgRCwgd2hlcmUgRCBpcyB0aGUgdGFzaydzIHJlbGF0aXZlIGRlYWRsaW5lLgorCisgU0NIRURfREVBRExJTkUgY2FuIGJlIHVzZWQgdG8gc2NoZWR1bGUgcmVhbC10aW1lIHRhc2tzIGd1YXJhbnRlZWluZyB0aGF0CisgdGhlIGpvYnMnIGRlYWRsaW5lcyBvZiBhIHRhc2sgYXJlIHJlc3BlY3RlZC4gSW4gb3JkZXIgdG8gZG8gdGhpcywgYSB0YXNrCisgbXVzdCBiZSBzY2hlZHVsZWQgYnkgc2V0dGluZzoKKworICAtIHJ1bnRpbWUgPj0gV0NFVAorICAtIGRlYWRsaW5lID0gRAorICAtIHBlcmlvZCA8PSBQCisKKyBJT1csIGlmIHJ1bnRpbWUgPj0gV0NFVCBhbmQgaWYgcGVyaW9kIGlzID49IFAsIHRoZW4gdGhlIHNjaGVkdWxpbmcgZGVhZGxpbmVzCisgYW5kIHRoZSBhYnNvbHV0ZSBkZWFkbGluZXMgKGRfaikgY29pbmNpZGUsIHNvIGEgcHJvcGVyIGFkbWlzc2lvbiBjb250cm9sCisgYWxsb3dzIHRvIHJlc3BlY3QgdGhlIGpvYnMnIGFic29sdXRlIGRlYWRsaW5lcyBmb3IgdGhpcyB0YXNrICh0aGlzIGlzIHdoYXQgaXMKKyBjYWxsZWQgImhhcmQgc2NoZWR1bGFiaWxpdHkgcHJvcGVydHkiIGFuZCBpcyBhbiBleHRlbnNpb24gb2YgTGVtbWEgMSBvZiBbMl0pLgorCisgUmVmZXJlbmNlczoKKyAgMSAtIEMuIEwuIExpdSBhbmQgSi4gVy4gTGF5bGFuZC4gU2NoZWR1bGluZyBhbGdvcml0aG1zIGZvciBtdWx0aXByb2dyYW0tCisgICAgICBtaW5nIGluIGEgaGFyZC1yZWFsLXRpbWUgZW52aXJvbm1lbnQuIEpvdXJuYWwgb2YgdGhlIEFzc29jaWF0aW9uIGZvcgorICAgICAgQ29tcHV0aW5nIE1hY2hpbmVyeSwgMjAoMSksIDE5NzMuCisgIDIgLSBMLiBBYmVuaSAsIEcuIEJ1dHRhenpvLiBJbnRlZ3JhdGluZyBNdWx0aW1lZGlhIEFwcGxpY2F0aW9ucyBpbiBIYXJkCisgICAgICBSZWFsLVRpbWUgU3lzdGVtcy4gUHJvY2VlZGluZ3Mgb2YgdGhlIDE5dGggSUVFRSBSZWFsLXRpbWUgU3lzdGVtcworICAgICAgU3ltcG9zaXVtLCAxOTk4LiBodHRwOi8vcmV0aXMuc3NzdXAuaXQvfmdpb3JnaW8vcGFwcy8xOTk4L3J0c3M5OC1jYnMucGRmCisgIDMgLSBMLiBBYmVuaS4gU2VydmVyIE1lY2hhbmlzbXMgZm9yIE11bHRpbWVkaWEgQXBwbGljYXRpb25zLiBSZVRpUyBMYWIKKyAgICAgIFRlY2huaWNhbCBSZXBvcnQuIGh0dHA6Ly94b29tZXIudmlyZ2lsaW8uaXQvbHVjYWJlNzIvcHVicy90ci05OC0wMS5wcworCis0LiBCYW5kd2lkdGggbWFuYWdlbWVudAorPT09PT09PT09PT09PT09PT09PT09PT0KKworIEluIG9yZGVyIGZvciB0aGUgLWRlYWRsaW5lIHNjaGVkdWxpbmcgdG8gYmUgZWZmZWN0aXZlIGFuZCB1c2VmdWwsIGl0IGlzCisgaW1wb3J0YW50IHRvIGhhdmUgc29tZSBtZXRob2QgdG8ga2VlcCB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIENQVQorIGJhbmR3aWR0aCB0byB0aGUgdGFza3MgdW5kZXIgY29udHJvbC4KKyBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkICJhZG1pc3Npb24gY29udHJvbCIgYW5kIGlmIGl0IGlzIG5vdCBwZXJmb3JtZWQgYXQgYWxsLAorIG5vIGd1YXJhbnRlZSBjYW4gYmUgZ2l2ZW4gb24gdGhlIGFjdHVhbCBzY2hlZHVsaW5nIG9mIHRoZSAtZGVhZGxpbmUgdGFza3MuCisKKyBTaW5jZSB3aGVuIFJULXRocm90dGxpbmcgaGFzIGJlZW4gaW50cm9kdWNlZCBlYWNoIHRhc2sgZ3JvdXAgaGFzIGEgYmFuZHdpZHRoCisgYXNzb2NpYXRlZCwgY2FsY3VsYXRlZCBhcyBhIGNlcnRhaW4gYW1vdW50IG9mIHJ1bnRpbWUgb3ZlciBhIHBlcmlvZC4KKyBNb3Jlb3ZlciwgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBtYW5pcHVsYXRlIHN1Y2ggYmFuZHdpZHRoLCByZWFkYWJsZS93cml0YWJsZQorIGNvbnRyb2xzIGhhdmUgYmVlbiBhZGRlZCB0byBib3RoIHByb2NmcyAoZm9yIHN5c3RlbSB3aWRlIHNldHRpbmdzKSBhbmQgY2dyb3VwZnMKKyAoZm9yIHBlci1ncm91cCBzZXR0aW5ncykuCisgVGhlcmVmb3JlLCB0aGUgc2FtZSBpbnRlcmZhY2UgaXMgYmVpbmcgdXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIGJhbmR3aWR0aAorIGRpc3RydWJ1dGlvbiB0byAtZGVhZGxpbmUgdGFza3MuCisKKyBIb3dldmVyLCBtb3JlIGRpc2N1c3Npb24gaXMgbmVlZGVkIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHdlIHdhbnQgdG8gbWFuYWdlCisgU0NIRURfREVBRExJTkUgYmFuZHdpZHRoIGF0IHRoZSB0YXNrIGdyb3VwIGxldmVsLiBUaGVyZWZvcmUsIFNDSEVEX0RFQURMSU5FCisgdXNlcyAoZm9yIG5vdykgYSBsZXNzIHNvcGhpc3RpY2F0ZWQsIGJ1dCBhY3R1YWxseSB2ZXJ5IHNlbnNpYmxlLCBtZWNoYW5pc20gdG8KKyBlbnN1cmUgdGhhdCBhIGNlcnRhaW4gdXRpbGl6YXRpb24gY2FwIGlzIG5vdCBvdmVyY29tZSBwZXIgZWFjaCByb290X2RvbWFpbi4KKworIEFub3RoZXIgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gZGVhZGxpbmUgYmFuZHdpZHRoIG1hbmFnZW1lbnQgYW5kIFJULXRocm90dGxpbmcKKyBpcyB0aGF0IC1kZWFkbGluZSB0YXNrcyBoYXZlIGJhbmR3aWR0aCBvbiB0aGVpciBvd24gKHdoaWxlIC1ydCBvbmVzIGRvbid0ISksCisgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCBhbiBoaWdoZXIgbGV2ZWwgdGhyb3R0bGluZyBtZWNoYW5pc20gdG8gZW5mb3JjZSB0aGUKKyBkZXNpcmVkIGJhbmR3aWR0aC4KKworNC4xIFN5c3RlbSB3aWRlIHNldHRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIFRoZSBzeXN0ZW0gd2lkZSBzZXR0aW5ncyBhcmUgY29uZmlndXJlZCB1bmRlciB0aGUgL3Byb2MgdmlydHVhbCBmaWxlIHN5c3RlbS4KKworIEZvciBub3cgdGhlIC1ydCBrbm9icyBhcmUgdXNlZCBmb3IgZGwgYWRtaXNzaW9uIGNvbnRyb2wgYW5kIHRoZSAtZGVhZGxpbmUKKyBydW50aW1lIGlzIGFjY291bnRlZCBhZ2FpbnN0IHRoZSAtcnQgcnVudGltZS4gV2UgcmVhbGlzZSB0aGF0IHRoaXMgaXNuJ3QKKyBlbnRpcmVseSBkZXNpcmFibGU7IGhvd2V2ZXIsIGl0IGlzIGJldHRlciB0byBoYXZlIGEgc21hbGwgaW50ZXJmYWNlIGZvciBub3csCisgYW5kIGJlIGFibGUgdG8gY2hhbmdlIGl0IGVhc2lseSBsYXRlci4gVGhlIGlkZWFsIHNpdHVhdGlvbiAoc2VlIDUuKSBpcyB0byBydW4KKyAtcnQgdGFza3MgZnJvbSBhIC1kZWFkbGluZSBzZXJ2ZXI7IGluIHdoaWNoIGNhc2UgdGhlIC1ydCBiYW5kd2lkdGggaXMgYSBkaXJlY3QKKyBzdWJzZXQgb2YgZGxfYncuCisKKyBUaGlzIG1lYW5zIHRoYXQsIGZvciBhIHJvb3RfZG9tYWluIGNvbXByaXNpbmcgTSBDUFVzLCAtZGVhZGxpbmUgdGFza3MKKyBjYW4gYmUgY3JlYXRlZCB3aGlsZSB0aGUgc3VtIG9mIHRoZWlyIGJhbmR3aWR0aHMgc3RheXMgYmVsb3c6CisKKyAgIE0gKiAoc2NoZWRfcnRfcnVudGltZV91cyAvIHNjaGVkX3J0X3BlcmlvZF91cykKKworIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSB0aGlzIGJhbmR3aWR0aCBtYW5hZ2VtZW50IGxvZ2ljLCBhbmQKKyBiZSB0aHVzIGZyZWUgb2Ygb3ZlcnN1YnNjcmliaW5nIHRoZSBzeXN0ZW0gdXAgdG8gYW55IGFyYml0cmFyeSBsZXZlbC4KKyBUaGlzIGlzIGRvbmUgYnkgd3JpdGluZyAtMSBpbiAvcHJvYy9zeXMva2VybmVsL3NjaGVkX3J0X3J1bnRpbWVfdXMuCisKKworNC4yIFRhc2sgaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tLS0KKworIFNwZWNpZnlpbmcgYSBwZXJpb2RpYy9zcG9yYWRpYyB0YXNrIHRoYXQgZXhlY3V0ZXMgZm9yIGEgZ2l2ZW4gYW1vdW50IG9mCisgcnVudGltZSBhdCBlYWNoIGluc3RhbmNlLCBhbmQgdGhhdCBpcyBzY2hlZHVsZWQgYWNjb3JkaW5nIHRvIHRoZSB1cmdlbmN5IG9mCisgaXRzIG93biB0aW1pbmcgY29uc3RyYWludHMgbmVlZHMsIGluIGdlbmVyYWwsIGEgd2F5IG9mIGRlY2xhcmluZzoKKyAgLSBhIChtYXhpbXVtL3R5cGljYWwpIGluc3RhbmNlIGV4ZWN1dGlvbiB0aW1lLAorICAtIGEgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGluc3RhbmNlcywKKyAgLSBhIHRpbWUgY29uc3RyYWludCBieSB3aGljaCBlYWNoIGluc3RhbmNlIG11c3QgYmUgY29tcGxldGVkLgorCisgVGhlcmVmb3JlOgorICAqIGEgbmV3IHN0cnVjdCBzY2hlZF9hdHRyLCBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBpcworICAgIHByb3ZpZGVkOworICAqIHRoZSBuZXcgc2NoZWR1bGluZyByZWxhdGVkIHN5c2NhbGxzIHRoYXQgbWFuaXB1bGF0ZSBpdCwgaS5lLiwKKyAgICBzY2hlZF9zZXRhdHRyKCkgYW5kIHNjaGVkX2dldGF0dHIoKSBhcmUgaW1wbGVtZW50ZWQuCisKKworNC4zIERlZmF1bHQgYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFNDSEVEX0RFQURMSU5FIGJhbmR3aWR0aCBpcyB0byBoYXZlIHJ0X3J1bnRpbWUgZXF1YWwgdG8KKyA5NTAwMDAuIFdpdGggcnRfcGVyaW9kIGVxdWFsIHRvIDEwMDAwMDAsIGJ5IGRlZmF1bHQsIGl0IG1lYW5zIHRoYXQgLWRlYWRsaW5lCisgdGFza3MgY2FuIHVzZSBhdCBtb3N0IDk1JSwgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIENQVXMgdGhhdCBjb21wb3NlIHRoZQorIHJvb3RfZG9tYWluLCBmb3IgZWFjaCByb290X2RvbWFpbi4KKworIEEgLWRlYWRsaW5lIHRhc2sgY2Fubm90IGZvcmsuCisKKzUuIFRhc2tzIENQVSBhZmZpbml0eQorPT09PT09PT09PT09PT09PT09PT09CisKKyAtZGVhZGxpbmUgdGFza3MgY2Fubm90IGhhdmUgYW4gYWZmaW5pdHkgbWFzayBzbWFsbGVyIHRoYXQgdGhlIGVudGlyZQorIHJvb3RfZG9tYWluIHRoZXkgYXJlIGNyZWF0ZWQgb24uIEhvd2V2ZXIsIGFmZmluaXRpZXMgY2FuIGJlIHNwZWNpZmllZAorIHRocm91Z2ggdGhlIGNwdXNldCBmYWNpbGl0eSAoRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0KS4KKworNS4xIFNDSEVEX0RFQURMSU5FIGFuZCBjcHVzZXRzIEhPV1RPCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIEFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgY29uZmlndXJhdGlvbiAocGluIGEgLWRlYWRsaW5lIHRhc2sgdG8gQ1BVMCkKKyBmb2xsb3dzIChydC1hcHAgaXMgdXNlZCB0byBjcmVhdGUgYSAtZGVhZGxpbmUgdGFzaykuCisKKyBta2RpciAvZGV2L2NwdXNldAorIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQgY3B1c2V0IC9kZXYvY3B1c2V0CisgY2QgL2Rldi9jcHVzZXQKKyBta2RpciBjcHUwCisgZWNobyAwID4gY3B1MC9jcHVzZXQuY3B1cworIGVjaG8gMCA+IGNwdTAvY3B1c2V0Lm1lbXMKKyBlY2hvIDEgPiBjcHVzZXQuY3B1X2V4Y2x1c2l2ZQorIGVjaG8gMCA+IGNwdXNldC5zY2hlZF9sb2FkX2JhbGFuY2UKKyBlY2hvIDEgPiBjcHUwL2NwdXNldC5jcHVfZXhjbHVzaXZlCisgZWNobyAxID4gY3B1MC9jcHVzZXQubWVtX2V4Y2x1c2l2ZQorIGVjaG8gJCQgPiBjcHUwL3Rhc2tzCisgcnQtYXBwIC10IDEwMDAwMDoxMDAwMDpkOjAgLUQ1IChpdCBpcyBub3cgYWN0dWFsbHkgc3VwZXJmbHVvdXMgdG8gc3BlY2lmeQorIHRhc2sgYWZmaW5pdHkpCisKKzYuIEZ1dHVyZSBwbGFucworPT09PT09PT09PT09PT09CisKKyBTdGlsbCBtaXNzaW5nOgorCisgIC0gcmVmaW5lbWVudHMgdG8gZGVhZGxpbmUgaW5oZXJpdGFuY2UsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIHRoZSBwb3NzaWJpbGl0eQorICAgIG9mIHJldGFpbmluZyBiYW5kd2lkdGggaXNvbGF0aW9uIGFtb25nIG5vbi1pbnRlcmFjdGluZyB0YXNrcy4gVGhpcyBpcworICAgIGJlaW5nIHN0dWRpZWQgZnJvbSBib3RoIHRoZW9yZXRpY2FsIGFuZCBwcmFjdGljYWwgcG9pbnRzIG9mIHZpZXcsIGFuZAorICAgIGhvcGVmdWxseSB3ZSBzaG91bGQgYmUgYWJsZSB0byBwcm9kdWNlIHNvbWUgZGVtb25zdHJhdGl2ZSBjb2RlIHNvb247CisgIC0gKGMpZ3JvdXAgYmFzZWQgYmFuZHdpZHRoIG1hbmFnZW1lbnQsIGFuZCBtYXliZSBzY2hlZHVsaW5nOworICAtIGFjY2VzcyBjb250cm9sIGZvciBub24tcm9vdCB1c2VycyAoYW5kIHJlbGF0ZWQgc2VjdXJpdHkgY29uY2VybnMgdG8KKyAgICBhZGRyZXNzKSwgd2hpY2ggaXMgdGhlIGJlc3Qgd2F5IHRvIGFsbG93IHVucHJpdmlsZWdlZCB1c2Ugb2YgdGhlIG1lY2hhbmlzbXMKKyAgICBhbmQgaG93IHRvIHByZXZlbnQgbm9uLXJvb3QgdXNlcnMgImNoZWF0IiB0aGUgc3lzdGVtPworCisgQXMgYWxyZWFkeSBkaXNjdXNzZWQsIHdlIGFyZSBwbGFubmluZyBhbHNvIHRvIG1lcmdlIHRoaXMgd29yayB3aXRoIHRoZSBFREYKKyB0aHJvdHRsaW5nIHBhdGNoZXMgW2h0dHBzOi8vbGttbC5vcmcvbGttbC8yMDEwLzIvMjMvMjM5XSBidXQgd2Ugc3RpbGwgYXJlIGluCisgdGhlIHByZWxpbWluYXJ5IHBoYXNlcyBvZiB0aGUgbWVyZ2UgYW5kIHdlIHJlYWxseSBzZWVrIGZlZWRiYWNrIHRoYXQgd291bGQKKyBoZWxwIHVzIGRlY2lkZSBvbiB0aGUgZGlyZWN0aW9uIGl0IHNob3VsZCB0YWtlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYCmluZGV4IDIwNDRiZTUuLmM0Yjk3OGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvMDAtSU5ERVgKQEAgLTM2LDYgKzM2LDggQEAKIAktIGluZm8gb24gV29ya0JpVCBOaW5qYVNDU0ktMzIvMzJCaSBkcml2ZXIKIGFhY3JhaWQudHh0CiAJLSBEcml2ZXIgc3VwcG9ydGluZyBBZGFwdGVjIFJBSUQgY29udHJvbGxlcnMKK2FkdmFuc3lzLnR4dAorCS0gTGlzdCBvZiBBZHZhbnN5cyBIb3N0IEFkYXB0ZXJzCiBhaGExNTJ4LnR4dAogCS0gaW5mbyBvbiBkcml2ZXIgZm9yIEFkYXB0ZWMgQUhBMTUyeCBiYXNlZCBhZGFwdGVycwogYWljNzl4eC50eHQKQEAgLTQ0LDYgKzQ2LDEyIEBACiAJLSBpbmZvIG9uIGRyaXZlciBmb3IgQWRhcHRlYyBjb250cm9sbGVycwogYXJjbXNyX3NwZWMudHh0CiAJLSBBUkVDQSBGSVJNV0FSRSBTUEVDIChmb3IgSU9QMzMxIGFkYXB0ZXIpCitiZmEudHh0CisJLSBCcm9jYWRlIEZDL0ZDT0UgYWRhcHRlciBkcml2ZXIuCitibngyZmMudHh0CisJLSBGQ29FIGhhcmR3YXJlIG9mZmxvYWQgZm9yIEJyb2FkY29tIG5ldHdvcmsgaW50ZXJmYWNlcy4KK2N4Z2IzaS50eHQKKwktIENoZWxzaW8gaVNDU0kgTGludXggRHJpdmVyCiBkYzM5NXgudHh0CiAJLSBSRUFETUUgZmlsZSBmb3IgdGhlIGRjMzk1eCBTQ1NJIGRyaXZlcgogZHB0aS50eHQKQEAgLTUyLDE4ICs2MCwyNCBAQAogCS0gaW5mbyBvbiBkcml2ZXIgZm9yIERUQyAyeDgwIGJhc2VkIGFkYXB0ZXJzCiBnX05DUjUzODAudHh0CiAJLSBpbmZvIG9uIGRyaXZlciBmb3IgTkNSNTM4MCBhbmQgTkNSNTNjNDAwIGJhc2VkIGFkYXB0ZXJzCitocHNhLnR4dAorCS0gSFAgU21hcnQgQXJyYXkgQ29udHJvbGxlciBTQ1NJIGRyaXZlci4KIGhwdGlvcC50eHQKIAktIEhJR0hQT0lOVCBST0NLRVRSQUlEIDN4eHggUkFJRCBEUklWRVIKIGluMjAwMC50eHQKIAktIGluZm8gb24gaW4yMDAwIGRyaXZlcgogbGlic2FzLnR4dAogCS0gU2VyaWFsIEF0dGFjaGVkIFNDU0kgbWFuYWdlbWVudCBsYXllci4KK2xpbmtfcG93ZXJfbWFuYWdlbWVudF9wb2xpY3kudHh0CisJLSBMaW5rIHBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucy4KIGxwZmMudHh0CiAJLSBMUEZDIGRyaXZlciByZWxlYXNlIG5vdGVzCiBtZWdhcmFpZC50eHQKIAktIENvbW1vbiBNYW5hZ2VtZW50IE1vZHVsZSwgc2hhcmVkIGNvZGUgaGFuZGxpbmcgaW9jdGxzIGZvciBMU0kgZHJpdmVycwogbmNyNTNjOHh4LnR4dAogCS0gaW5mbyBvbiBkcml2ZXIgZm9yIE5DUjUzYzh4eCBiYXNlZCBhZGFwdGVycworb3NkLnR4dAorCU9iamVjdC1CYXNlZCBTdG9yYWdlIERldmljZSwgY29tbWFuZCBzZXQgaW50cm9kdWN0aW9uLgogb3NzdC50eHQKIAktIGluZm8gb24gZHJpdmVyIGZvciBPblN0cmVhbSBTQy14MCBTQ1NJIHRhcGUKIHBwYS50eHQKQEAgLTc0LDYgKzg4LDggQEAKIAktIFJFQURNRSBmb3IgdGhlIFNDU0kgbWVkaWEgY2hhbmdlciBkcml2ZXIKIHNjc2ktZ2VuZXJpYy50eHQKIAktIGluZm8gb24gdGhlIHNnIGRyaXZlciBmb3IgZ2VuZXJpYyAobm9uLWRpc2svQ0QvdGFwZSkgU0NTSSBkZXZpY2VzLgorc2NzaS1wYXJhbWV0ZXJzLnR4dAorCS0gTGlzdCBvZiBTQ1NJLXBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUga2VybmVsIGF0IG1vZHVsZSBsb2FkLXRpbWUuCiBzY3NpLnR4dAogCS0gc2hvcnQgYmx1cmIgb24gdXNpbmcgU0NTSSBzdXBwb3J0IGFzIGEgbW9kdWxlLgogc2NzaV9taWRfbG93X2FwaS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvMDAtSU5ERVgKaW5kZXggMWYxYjIyZi4uZjljNmI1ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvMDAtSU5ERVgKQEAgLTQsMTAgKzQsMTIgQEAKIAktIGluZm8gb24gQ3ljbGFkZXMtWiBmaXJtd2FyZSBsb2FkaW5nLgogZGlnaWVwY2EudHh0CiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgotaGF5ZXMtZXNwLnR4dAotCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCitkcml2ZXIKKwktIGludHJvIHRvIHRoZSBsb3cgbGV2ZWwgc2VyaWFsIGRyaXZlci4KIG1veGEtc21hcnRpbwogCS0gZmlsZSB3aXRoIGluZm8gb24gaW5zdGFsbGluZy91c2luZyBNb3hhIG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorbl9nc20udHh0CisJLSBHU00gMDcxMCB0dHkgbXVsdGlwbGV4ZXIgaG93dG8uCiByaXNjb204LnR4dAogCS0gbm90ZXMgb24gdXNpbmcgdGhlIFJJU0NvbS84IG11bHRpLXBvcnQgc2VyaWFsIGRyaXZlci4KIHJvY2tldC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9zcGkvMDAtSU5ERVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyOGZhOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BpLzAwLUlOREVYCkBAIC0wLDAgKzEsMjIgQEAKKzAwLUlOREVYCisJLSB0aGlzIGZpbGUuCitNYWtlZmlsZQorCS0gTWFrZWZpbGUgZm9yIHRoZSBleGFtcGxlIHNvdXJjZWZpbGVzLgorYnV0dGVyZmx5CisJLSBBVlIgQnV0dGVyZmx5IFNQSSBkcml2ZXIgb3ZlcnZpZXcgYW5kIHBpbiBjb25maWd1cmF0aW9uLgorZXA5M3h4X3NwaQorCS0gQmFzaWMgRVA5M3h4IFNQSSBkcml2ZXIgY29uZmlndXJhdGlvbi4KK3B4YTJ4eAorCS0gUFhBMnh4IFNQSSBtYXN0ZXIgY29udHJvbGxlciBidWlsZCBieSBzcGlfbWVzc2FnZSBmaWZvIHdxCitzcGlkZXYKKwktIEludHJvIHRvIHRoZSB1c2Vyc3BhY2UgQVBJIGZvciBzcGkgZGV2aWNlcworc3BpZGV2X2ZkeC5jCisJLSBzcGlkZXYgZXhhbXBsZSBmaWxlCitzcGktbG03MGxscAorCS0gQ29ubmVjdGluZyBhbiBMTTcwLUxMUCBzZW5zb3IgdG8gdGhlIGtlcm5lbCB2aWEgdGhlIFNQSSBzdWJzeXMuCitzcGktc2MxOGlzNjAyCisJLSBOWFAgU0MxOElTNjAyLzYwMyBJMkMtYnVzIHRvIFNQSSBicmlkZ2UKK3NwaS1zdW1tYXJ5CisJLSAoTGludXgpIFNQSSBvdmVydmlldy4gSWYgdW5zdXJlIGFib3V0IFNQSSBvciBTUEkgaW4gTGludXgsIHN0YXJ0IGhlcmUuCitzcGlkZXZfdGVzdC5jCisJLSBTUEkgdGVzdGluZyB1dGlsaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKaW5kZXggZWU5YTJmOS4uZTU1MTI0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CkBAIC0zMyw2ICszMywxMCBAQAogLSBkb21haW5uYW1lCiAtIGhvc3RuYW1lCiAtIGhvdHBsdWcKKy0gaHVuZ190YXNrX3BhbmljCistIGh1bmdfdGFza19jaGVja19jb3VudAorLSBodW5nX3Rhc2tfdGltZW91dF9zZWNzCistIGh1bmdfdGFza193YXJuaW5ncwogLSBrZXhlY19sb2FkX2Rpc2FibGVkCiAtIGtwdHJfcmVzdHJpY3QKIC0ga3N0YWNrX2RlcHRoX3RvX3ByaW50ICAgICAgIFsgWDg2IG9ubHkgXQpAQCAtMjg4LDYgKzI5Miw0NCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitodW5nX3Rhc2tfcGFuaWM6CisKK0NvbnRyb2xzIHRoZSBrZXJuZWwncyBiZWhhdmlvciB3aGVuIGEgaHVuZyB0YXNrIGlzIGRldGVjdGVkLgorVGhpcyBmaWxlIHNob3dzIHVwIGlmIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIGVuYWJsZWQuCisKKzA6IGNvbnRpbnVlIG9wZXJhdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKworMTogcGFuaWMgaW1tZWRpYXRlbHkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2h1bmdfdGFza19jaGVja19jb3VudDoKKworVGhlIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGFza3MgdGhhdCBhcmUgY2hlY2tlZC4KK1RoaXMgZmlsZSBzaG93cyB1cCBpZiBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBlbmFibGVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitodW5nX3Rhc2tfdGltZW91dF9zZWNzOgorCitDaGVjayBpbnRlcnZhbC4gV2hlbiBhIHRhc2sgaW4gRCBzdGF0ZSBkaWQgbm90IGdldCBzY2hlZHVsZWQKK2ZvciBtb3JlIHRoYW4gdGhpcyB2YWx1ZSByZXBvcnQgYSB3YXJuaW5nLgorVGhpcyBmaWxlIHNob3dzIHVwIGlmIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIGVuYWJsZWQuCisKKzA6IG1lYW5zIGluZmluaXRlIHRpbWVvdXQgLSBubyBjaGVja2luZyBkb25lLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitodW5nX3Rhc2tfd2FybmluZzoKKworVGhlIG1heGltdW0gbnVtYmVyIG9mIHdhcm5pbmdzIHRvIHJlcG9ydC4gRHVyaW5nIGEgY2hlY2sgaW50ZXJ2YWwKK1doZW4gdGhpcyB2YWx1ZSBpcyByZWFjaGVkLCBubyBtb3JlIHRoZSB3YXJuaW5ncyB3aWxsIGJlIHJlcG9ydGVkLgorVGhpcyBmaWxlIHNob3dzIHVwIGlmIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIGVuYWJsZWQuCisKKy0xOiByZXBvcnQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHdhcm5pbmdzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiBrZXhlY19sb2FkX2Rpc2FibGVkOgogCiBBIHRvZ2dsZSBpbmRpY2F0aW5nIGlmIHRoZSBrZXhlY19sb2FkIHN5c2NhbGwgaGFzIGJlZW4gZGlzYWJsZWQuIFRoaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCA5ZjU0ODFiLi5kNjE0YTliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC02OTYsNyArNjk2LDkgQEAKIAogVGhpcyBjb250cm9sIGlzIHVzZWQgdG8gZGVmaW5lIGhvdyBhZ2dyZXNzaXZlIHRoZSBrZXJuZWwgd2lsbCBzd2FwCiBtZW1vcnkgcGFnZXMuICBIaWdoZXIgdmFsdWVzIHdpbGwgaW5jcmVhc2UgYWdyZXNzaXZlbmVzcywgbG93ZXIgdmFsdWVzCi1kZWNyZWFzZSB0aGUgYW1vdW50IG9mIHN3YXAuCitkZWNyZWFzZSB0aGUgYW1vdW50IG9mIHN3YXAuICBBIHZhbHVlIG9mIDAgaW5zdHJ1Y3RzIHRoZSBrZXJuZWwgbm90IHRvCitpbml0aWF0ZSBzd2FwIHVudGlsIHRoZSBhbW91bnQgb2YgZnJlZSBhbmQgZmlsZS1iYWNrZWQgcGFnZXMgaXMgbGVzcwordGhhbiB0aGUgaGlnaCB3YXRlciBtYXJrIGluIGEgem9uZS4KIAogVGhlIGRlZmF1bHQgdmFsdWUgaXMgNjAuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGltZXJzLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvMDAtSU5ERVgKaW5kZXggZWYyY2NiZi4uNmQwNDJkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90aW1lcnMvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvMDAtSU5ERVgKQEAgLTgsNiArOCw4IEBACiAJLSBzYW1wbGUgaHBldCB0aW1lciB0ZXN0IHByb2dyYW0KIGhydGltZXJzLnR4dAogCS0gc3Vic3lzdGVtIGZvciBoaWdoLXJlc29sdXRpb24ga2VybmVsIHRpbWVycworTWFrZWZpbGUKKwktIEJ1aWxkIGFuZCBsaW5rIGhwZXRfZXhhbXBsZQogTk9fSFoudHh0CiAJLSBTdW1tYXJ5IG9mIHRoZSBkaWZmZXJlbnQgbWV0aG9kcyBmb3IgdGhlIHNjaGVkdWxlciBjbG9jay1pbnRlcnJ1cHRzIG1hbmFnZW1lbnQuCiB0aW1lcnMtaG93dG8udHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L29tYXA0X2NhbWVyYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L29tYXA0X2NhbWVyYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkOWI0MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDRfY2FtZXJhLnR4dApAQCAtMCwwICsxLDYwIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFQNCBJU1MgRHJpdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBPTUFQNDRYWCBmYW1pbHkgb2YgY2hpcHMgY29udGFpbnMgdGhlIEltYWdpbmcgU3ViU3lzdGVtIChhLmsuYS4gSVNTKSwKK1doaWNoIGNvbnRhaW5zIHNldmVyYWwgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjYXRlZ29yaXplZCBpbiAzIGJpZyBncm91cHM6CisKKy0gSW50ZXJmYWNlcyAoMiBJbnRlcmZhY2VzOiBDU0kyLUEgJiBDU0kyLUIvQ0NQMikKKy0gSVNQIChJbWFnZSBTaWduYWwgUHJvY2Vzc29yKQorLSBTSU1DT1AgKFN0aWxsIEltYWdlIENvcHJvY2Vzc29yKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGxvb2sgaW4gWzFdIGZvciBsYXRlc3QgdmVyc2lvbiBvZjoKKwkiT01BUDQ0MzAgTXVsdGltZWRpYSBEZXZpY2UgU2lsaWNvbiBSZXZpc2lvbiAyLngiCisKK0FzIG9mIFJldmlzaW9uIEFCLCB0aGUgSVNTIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gc2VjdGlvbiA4LgorCitUaGlzIGRyaXZlciBpcyBzdXBwb3J0aW5nIF9vbmx5XyB0aGUgQ1NJMi1BL0IgaW50ZXJmYWNlcyBmb3Igbm93LgorCitJdCBtYWtlcyB1c2Ugb2YgdGhlIE1lZGlhIENvbnRyb2xsZXIgZnJhbWV3b3JrIFsyXSwgYW5kIGluaGVyaXRlZCBtb3N0IG9mIHRoZQorY29kZSBmcm9tIE9NQVAzIElTUCBkcml2ZXIgKGZvdW5kIHVuZGVyIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvKiksCitleGNlcHQgdGhhdCBpdCBkb2Vzbid0IG5lZWQgYW4gSU9NTVUgbm93IGZvciBJU1MgYnVmZmVycyBtZW1vcnkgbWFwcGluZy4KKworU3VwcG9ydHMgdXNhZ2Ugb2YgTU1BUCBidWZmZXJzIG9ubHkgKGZvciBub3cpLgorCitUZXN0ZWQgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tCisKKy0gT01BUDQ0MzBTRFAsIHcvIEVTMi4xIEdQICYgU0VWTTQ0MzAtQ0FNLVYxLTAgKENvbnRhaW5zIElNWDA2MCAmIE9WNTY0MCwgaW4KKyAgd2hpY2ggb25seSB0aGUgbGFzdCBvbmUgaXMgc3VwcG9ydGVkLCBvdXRwdXR0aW5nIFlVVjQyMiBmcmFtZXMpLgorCistIFRJIEJsYXplIE1EUCwgdy8gT01BUDQ0MzAgRVMyLjIgRU1VIChDb250YWlucyAxIElNWDA2MCAmIDIgT1Y1NjUwIHNlbnNvcnMsIGluCisgIHdoaWNoIG9ubHkgdGhlIE9WNTY1MCBhcmUgc3VwcG9ydGVkLCBvdXRwdXR0aW5nIFJBVzEwIGZyYW1lcykuCisKKy0gUGFuZGFCb2FyZCwgUmV2LiBBMiwgdy8gT01BUDQ0MzAgRVMyLjEgR1AgJiBPViBhZGFwdGVyIGJvYXJkLCB0ZXN0ZWQgd2l0aAorICBmb2xsb3dpbmcgc2Vuc29yczoKKyAgKiBPVjU2NDAKKyAgKiBPVjU2NTAKKworLSBUZXN0ZWQgb24gbWFpbmxpbmUga2VybmVsOgorCisJaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXgtMi42LmdpdDthPXN1bW1hcnkKKworICBUYWc6IHYzLjMgKGNvbW1pdCBjMTZmYTRmMmFkMTk5MDhhNDdjNjNkOGZhNDM2YTExNzg0MzhjN2U3KQorCitGaWxlIGxpc3QKKy0tLS0tLS0tLQorZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzLworaW5jbHVkZS9tZWRpYS9vbWFwNGlzcy5oCisKK1JlZmVyZW5jZXMKKy0tLS0tLS0tLS0KKworWzFdIGh0dHA6Ly9mb2N1cy50aS5jb20vZ2VuZXJhbC9kb2NzL3d0YnUvd3RidWRvY3VtZW50Y2VudGVyLnRzcD9uYXZpZ2F0aW9uSWQ9MTIwMzcmdGVtcGxhdGVJZD02MTIzIzYyCitbMl0gaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNDIwNDg1LworWzNdIGh0dHA6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvbGludXgtbWVkaWEvbXNnNDQzNzAuaHRtbAorLS0KK0F1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorQ29weXJpZ2h0IChDKSAyMDEyLCBUZXhhcyBJbnN0cnVtZW50cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zaTQ3NngudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zaTQ3NngudHh0CmluZGV4IDJmOWI0ODcuLjYxNjYwNzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc2k0NzZ4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NpNDc2eC50eHQKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAweDEyCQl8IHJlYWRmcmVxCXwgQ3VycmVudCB0dW5lZCBmcmVxdWVuY3kKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgMHgxNAkJfCBmcmVxb2ZmCXwgU2luZ2VkIGZyZXF1ZW5jeSBvZmZzZXQgaW4gdW5pdHMgb2YKKyAgMHgxNAkJfCBmcmVxb2ZmCXwgU2lnbmVkIGZyZXF1ZW5jeSBvZmZzZXQgaW4gdW5pdHMgb2YKICAgCQl8IAkJfCAycHBtCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIDB4MTUJCXwgcnNzaQkJfCBTaWduZWQgdmFsdWUgb2YgUlNTSSBpbiBkQnVWCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS8wMC1JTkRFWAppbmRleCA2NDFlYzkyLi5mZWU5ZjJiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vMDAtSU5ERVgKQEAgLTIwLDUgKzIwLDcgQEAKIAktIHRoZSBwYXJhdmlydHVhbGl6YXRpb24gaW50ZXJmYWNlIG9uIFBvd2VyUEMuCiByZXZpZXctY2hlY2tsaXN0LnR4dAogCS0gcmV2aWV3IGNoZWNrbGlzdCBmb3IgS1ZNIHBhdGNoZXMuCitzMzkwLWRpYWcudHh0CisJLSBEaWFnbm9zZSBoeXBlcmNhbGwgZGVzY3JpcHRpb24gKGZvciBJQk0gUy8zOTApCiB0aW1la2VlcGluZy50eHQKIAktIHRpbWVrZWVwaW5nIHZpcnR1YWxpemF0aW9uIGZvciB4ODYtYmFzZWQgYXJjaGl0ZWN0dXJlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAppbmRleCAzNjZiZjRiLi42Y2Q2M2E5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CkBAIC0xODM4LDYgKzE4MzgsNyBAQAogICBQUEMgICB8IEtWTV9SRUdfUFBDX0xQQ1IJfCA2NAogICBQUEMgICB8IEtWTV9SRUdfUFBDX1BQUgl8IDY0CiAgIFBQQyAgIHwgS1ZNX1JFR19QUENfQVJDSF9DT01QQVQgMzIKKyAgUFBDICAgfCBLVk1fUkVHX1BQQ19EQUJSWCAgICAgfCAzMgogICBQUEMgICB8IEtWTV9SRUdfUFBDX1RNX0dQUjAJfCA2NAogICAgICAgICAgIC4uLgogICBQUEMgICB8IEtWTV9SRUdfUFBDX1RNX0dQUjMxCXwgNjQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3ZtLzAwLUlOREVYCmluZGV4IGEzOWQwNjYuLjA4MWM0OTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi92bS8wMC1JTkRFWApAQCAtMTYsOCArMTYsNiBAQAogCS0gZXhwbGFpbnMgd2hhdCBod3BvaXNvbiBpcwoga3NtLnR4dAogCS0gaG93IHRvIHVzZSB0aGUgS2VybmVsIFNhbWVwYWdlIE1lcmdpbmcgZmVhdHVyZS4KLWxvY2tpbmcKLQktIGluZm8gb24gaG93IGxvY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbiBpcyBkb25lIGluIHRoZSBMaW51eCB2bSBjb2RlLgogbnVtYQogCS0gaW5mb3JtYXRpb24gYWJvdXQgTlVNQSBzcGVjaWZpYyBjb2RlIGluIHRoZSBMaW51eCB2bS4KIG51bWFfbWVtb3J5X3BvbGljeS50eHQKQEAgLTMyLDYgKzMwLDggQEAKIAktIGEgc2hvcnQgdXNlcnMgZ3VpZGUgZm9yIFNMVUIuCiBzb2Z0LWRpcnR5LnR4dAogCS0gc2hvcnQgZXhwbGFuYXRpb24gZm9yIHNvZnQtZGlydHkgUFRFcworc3BsaXRfcGFnZV90YWJsZV9sb2NrCisJLSBTZXBhcmF0ZSBwZXItdGFibGUgbG9jayB0byBpbXByb3ZlIHNjYWxhYmlsaXR5IG9mIHRoZSBvbGQgcGFnZV90YWJsZV9sb2NrLgogdHJhbnNodWdlLnR4dAogCS0gVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCwgYWx0ZXJuYXRpdmUgd2F5IG9mIHVzaW5nIGh1Z2VwYWdlcy4KIHVuZXZpY3RhYmxlLWxydS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy8wMC1JTkRFWAppbmRleCBkNjNmYTAyLi44MzMwY2Y5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYCkBAIC00LDcgKzQsOSBAQAogCS0gVGhlIE1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIERTMjQ4MiBwcm92aWRlcyAxLXdpcmUgYnVzc2VzLgogZHMyNDkwCiAJLSBUaGUgTWF4aW0vRGFsbGFzIFNlbWljb25kdWN0b3IgRFMyNDkwIGJ1aWxkcyBVU0IgPC0+IFcxIGJyaWRnZXMuCi1teGNfdzEKK214Yy13MQogCS0gVzEgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIGZvdW5kIG9uIEZyZWVzY2FsZSBNWDIvTVgzIFNvQ3MKK29tYXAtaGRxCisJLSBIRFEvMS13aXJlIG1vZHVsZSBvZiBUSSBPTUFQIDI0MzAvMzQzMC4KIHcxLWdwaW8KIAktIEdQSU8gMS13aXJlIGJ1cyBtYXN0ZXIgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy8wMC1JTkRFWAppbmRleCA3NTYxM2M5Li42ZTE4YzcwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy8wMC1JTkRFWApAQCAtNCwzICs0LDUgQEAKIAktIFRoZSBNYXhpbS9EYWxsYXMgU2VtaWNvbmR1Y3RvciBkczE4KjIwIHRlbXBlcmF0dXJlIHNlbnNvci4KIHcxX2RzMjQyMwogCS0gVGhlIE1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIGRzMjQyMyBjb3VudGVyIGRldmljZS4KK3cxX2RzMjhlMDQKKwktIFRoZSBNYXhpbS9EYWxsYXMgU2VtaWNvbmR1Y3RvciBkczI4ZTA0IGVlcHJvbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2LzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi94ODYvMDAtSU5ERVgKaW5kZXggZjM3YjQ2ZC4uNjkyMjY0NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvMDAtSU5ERVgKQEAgLTEsNiArMSwyMCBAQAogMDAtSU5ERVgKIAktIHRoaXMgZmlsZQotbXRyci50eHQKLQktIGhvdyB0byB1c2UgeDg2IE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZQorYm9vdC50eHQKKwktIExpc3Qgb2YgYm9vdCBwcm90b2NvbCB2ZXJzaW9ucworZWFybHktbWljcm9jb2RlLnR4dAorCS0gSG93IHRvIGxvYWQgbWljcm9jb2RlIGZyb20gYW4gaW5pdHJkLUNQSU8gYXJjaGl2ZSBlYXJseSB0byBmaXggQ1BVIGlzc3Vlcy4KK2Vhcmx5cHJpbnRrLnR4dAorCS0gVXNpbmcgZWFybHlwcmludGsgd2l0aCBhIFVTQjIgZGVidWcgcG9ydCBrZXkuCitlbnRyeV82NC50eHQKKwktIERlc2NyaWJlIChzb21lIG9mIHRoZSkga2VybmVsIGVudHJ5IHBvaW50cyBmb3IgeDg2LgogZXhjZXB0aW9uLXRhYmxlcy50eHQKIAktIHdoeSBhbmQgaG93IExpbnV4IGtlcm5lbCB1c2VzIGV4Y2VwdGlvbiB0YWJsZXMgb24geDg2CittdHJyLnR4dAorCS0gaG93IHRvIHVzZSB4ODYgTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXJzIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlCitwYXQudHh0CisJLSBQYWdlIEF0dHJpYnV0ZSBUYWJsZSBpbnRybyBhbmQgQVBJCit1c2ItbGVnYWN5LXN1cHBvcnQudHh0CisJLSBob3cgdG8gZml4L2F2b2lkIHF1aXJrcyB3aGVuIHVzaW5nIGVtdWxhdGVkIFBTLzIgbW91c2Uva2V5Ym9hcmQuCit6ZXJvLXBhZ2UudHh0CisJLSBsYXlvdXQgb2YgdGhlIGZpcnN0IHBhZ2Ugb2YgbWVtb3J5LgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA2ZDczODMxYy4uMDkxYjUwZSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMwOSwzNiArMzA5LDM2IEBACiAKIEFENTI1WCBBTkFMT0cgREVWSUNFUyBESUdJVEFMIFBPVEVOVElPTUVURVJTIERSSVZFUgogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRDUyNTQKK1c6CWh0dHA6Ly9lei5hbmFsb2cuY29tL2NvbW11bml0eS9saW51eC1kZXZpY2UtZHJpdmVycwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QuYwogCiBBRDUzOTggQ1VSUkVOVCBSRUdVTEFUT1IgRFJJVkVSIChBRDUzOTgvQUQ1ODIxKQogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRDUzOTgKK1c6CWh0dHA6Ly9lei5hbmFsb2cuY29tL2NvbW11bml0eS9saW51eC1kZXZpY2UtZHJpdmVycwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3JlZ3VsYXRvci9hZDUzOTguYwogCiBBRDcxNFggQ0FQQUNJVEFOQ0UgVE9VQ0ggU0VOU09SIERSSVZFUiAoQUQ3MTQyLzMvNy84LzdBKQogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRDcxNDIKK1c6CWh0dHA6Ly9lei5hbmFsb2cuY29tL2NvbW11bml0eS9saW51eC1kZXZpY2UtZHJpdmVycwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMKIAogQUQ3ODc3IFRPVUNIU0NSRUVOIERSSVZFUgogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRDc4NzcKK1c6CWh0dHA6Ly9lei5hbmFsb2cuY29tL2NvbW11bml0eS9saW51eC1kZXZpY2UtZHJpdmVycwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3Ny5jCiAKIEFENzg3OSBUT1VDSFNDUkVFTiBEUklWRVIgKEFENzg3OS9BRDc4ODkpCiBNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KLUw6CWRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCiBXOglodHRwOi8vd2lraS5hbmFsb2cuY29tL0FENzg3OQorVzoJaHR0cDovL2V6LmFuYWxvZy5jb20vY29tbXVuaXR5L2xpbnV4LWRldmljZS1kcml2ZXJzCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKIApAQCAtMzQ3LDcgKzM0Nyw3IEBACiBTOglNYWludGFpbmVkCiAKIEFETTEwMjUgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKLU06CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorTToJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI1CkBAIC0zNzQsOCArMzc0LDggQEAKIAogQURQNTUyMCBCQUNLTElHSFQgRFJJVkVSIFdJVEggSU8gRVhQQU5ERVIgKEFEUDU1MjAvQURQNTUwMSkKIE06CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgotTDoJZGV2aWNlLWRyaXZlcnMtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKIFc6CWh0dHA6Ly93aWtpLmFuYWxvZy5jb20vQURQNTUyMAorVzoJaHR0cDovL2V6LmFuYWxvZy5jb20vY29tbXVuaXR5L2xpbnV4LWRldmljZS1kcml2ZXJzCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbWZkL2FkcDU1MjAuYwogRjoJZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jCkBAIC0zODUsMTYgKzM4NSwxNiBAQAogCiBBRFA1NTg4IFFXRVJUWSBLRVlQQUQgQU5EIElPIEVYUEFOREVSIERSSVZFUiAoQURQNTU4OC9BRFA1NTg3KQogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRFA1NTg4CitXOglodHRwOi8vZXouYW5hbG9nLmNvbS9jb21tdW5pdHkvbGludXgtZGV2aWNlLWRyaXZlcnMKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwogRjoJZHJpdmVycy9ncGlvL2dwaW8tYWRwNTU4OC5jCiAKIEFEUDg4NjAgQkFDS0xJR0hUIERSSVZFUiAoQURQODg2MC9BRFA4ODYxL0FEUDg4NjMpCiBNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KLUw6CWRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCiBXOglodHRwOi8vd2lraS5hbmFsb2cuY29tL0FEUDg4NjAKK1c6CWh0dHA6Ly9lei5hbmFsb2cuY29tL2NvbW11bml0eS9saW51eC1kZXZpY2UtZHJpdmVycwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKIApAQCAtNDEyLDcgKzQxMiw3IEBACiBGOglkcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKIAogQURUNzQ3NSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzUKQEAgLTQyMCw4ICs0MjAsOCBAQAogCiBBRFhMMzRYIFRIUkVFLUFYSVMgRElHSVRBTCBBQ0NFTEVST01FVEVSIERSSVZFUiAoQURYTDM0NS9BRFhMMzQ2KQogTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3dpa2kuYW5hbG9nLmNvbS9BRFhMMzQ1CitXOglodHRwOi8vZXouYW5hbG9nLmNvbS9jb21tdW5pdHkvbGludXgtZGV2aWNlLWRyaXZlcnMKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYwogCkBAIC02MjcsOSArNjI3LDkgQEAKIAogQU5BTE9HIERFVklDRVMgSU5DIEFTT0MgQ09ERUMgRFJJVkVSUwogTToJTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Ci1MOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93aWtpLmFuYWxvZy5jb20vCitXOglodHRwOi8vZXouYW5hbG9nLmNvbS9jb21tdW5pdHkvbGludXgtZGV2aWNlLWRyaXZlcnMKIFM6CVN1cHBvcnRlZAogRjoJc291bmQvc29jL2NvZGVjcy9hZGF1KgogRjoJc291bmQvc29jL2NvZGVjcy9hZGF2KgpAQCAtNjM5LDcgKzYzOSw3IEBACiBGOglzb3VuZC9zb2MvY29kZWNzL3NpZ21hZHNwLioKIAogQU5BTE9HIERFVklDRVMgSU5DIEFTT0MgRFJJVkVSUwotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KIFM6CVN1cHBvcnRlZApAQCAtODY4LDE0ICs4NjgsNyBAQAogRjoJZHJpdmVycy9jbGsvY2xrLXByaW1hMi5jCiBGOglkcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXByaW1hMi5jCiBGOglkcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLW1hcmNvLmMKLUY6CWRyaXZlcnMvZG1hL3NpcmYtZG1hLmMKLUY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lyZi5jCi1GOglkcml2ZXJzL2lucHV0L21pc2Mvc2lyZnNvYy1vbmtleS5jCi1GOglkcml2ZXJzL2lycWNoaXAvaXJxLXNpcmZzb2MuYwotRjoJZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zaXJmLmMKLUY6CWRyaXZlcnMvcGluY3RybC9zaXJmLwotRjoJZHJpdmVycy9ydGMvcnRjLXNpcmZzb2MuYwotRjoJZHJpdmVycy9zcGkvc3BpLXNpcmYuYworTjoJW15hLXpdc2lyZgogCiBBUk0vRUJTQTExMCBNQUNISU5FIFNVUFBPUlQKIE06CVJ1c3NlbGwgS2luZyA8bGludXhAYXJtLmxpbnV4Lm9yZy51az4KQEAgLTE3NDIsNTYgKzE3MzUsNTQgQEAKIEY6CWluY2x1ZGUvdWFwaS9saW51eC9iZnNfZnMuaAogCiBCTEFDS0ZJTiBBUkNISVRFQ1RVUkUKLU06CU1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KLUw6CXVjbGludXgtZGlzdC1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworTToJU3RldmVuIE1pYW8gPHJlYWxtejZAZ21haWwuY29tPgorTDoJYWRpLWJ1aWxkcm9vdC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZwogUzoJU3VwcG9ydGVkCiBGOglhcmNoL2JsYWNrZmluLwogCiBCTEFDS0ZJTiBFTUFDIERSSVZFUgotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS8KIAogQkxBQ0tGSU4gUlRDIERSSVZFUgotTToJTWlrZSBGcnlzaW5nZXIgPHZhcGllci5hZGlAZ21haWwuY29tPgotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvcnRjL3J0Yy1iZmluLmMKIAogQkxBQ0tGSU4gU0RIIERSSVZFUgogTToJU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Ci1MOgl1Y2xpbnV4LWRpc3QtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK0w6CWFkaS1idWlsZHJvb3QtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBXOglodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9tbWMvaG9zdC9iZmluX3NkaC5jCiAKIEJMQUNLRklOIFNFUklBTCBEUklWRVIKIE06CVNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPgotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvdHR5L3NlcmlhbC9iZmluX3VhcnQuYwogCiBCTEFDS0ZJTiBXQVRDSERPRyBEUklWRVIKLU06CU1pa2UgRnJ5c2luZ2VyIDx2YXBpZXIuYWRpQGdtYWlsLmNvbT4KLUw6CXVjbGludXgtZGlzdC1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworTDoJYWRpLWJ1aWxkcm9vdC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3dhdGNoZG9nL2JmaW5fd2R0LmMKIAogQkxBQ0tGSU4gSTJDIFRXSSBEUklWRVIKIE06CVNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPgotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKIAogQkxBQ0tGSU4gTUVESUEgRFJJVkVSCiBNOglTY290dCBKaWFuZyA8c2NvdHQuamlhbmcubGludXhAZ21haWwuY29tPgotTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhZGktYnVpbGRyb290LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL21lZGlhL3BsYXRmb3JtL2JsYWNrZmluLwpAQCAtMjIyNCw2ICsyMjE1LDcgQEAKIENMT0NLU09VUkNFLCBDTE9DS0VWRU5UIERSSVZFUlMKIE06CURhbmllbCBMZXpjYW5vIDxkYW5pZWwubGV6Y2Fub0BsaW5hcm8ub3JnPgogTToJVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IHRpbWVycy9jb3JlCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvY2xvY2tzb3VyY2UKQEAgLTMzODksNyArMzM4MSw3IEBACiBGOglpbmNsdWRlL3ZpZGVvL2V4eW5vc19taXBpKgogCiBGNzE4MDVGIEhBUkRXQVJFIE1PTklUT1JJTkcgRFJJVkVSCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vaHdtb24vZjcxODA1ZgpAQCAtMzkxNiw3ICszOTA4LDcgQEAKIEY6CWRyaXZlcnMvdHR5L2h2Yy8KIAogSEFSRFdBUkUgTU9OSVRPUklORwotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBNOglHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBXOglodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnLwpAQCAtNDAyNSw2ICs0MDE3LDcgQEAKIAogSElHSC1SRVNPTFVUSU9OIFRJTUVSUywgQ0xPQ0tFVkVOVFMsIERZTlRJQ0tTCiBNOglUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGlwL3RpcC5naXQgdGltZXJzL2NvcmUKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vdGltZXJzLwpAQCAtNDE0NCw3ICs0MTM3LDcgQEAKIEY6CXRvb2xzL2h2LwogCiBJMkMgT1ZFUiBQQVJBTExFTCBQT1JUCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxpbnV4LWkyY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGFycG9ydApAQCAtNDE1Myw3ICs0MTQ2LDcgQEAKIEY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCiAKIEkyQy9TTUJVUyBDT05UUk9MTEVSIERSSVZFUlMgRk9SIFBDCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxpbnV4LWkyY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNQpAQCAtNDE5NCw3ICs0MTg3LDcgQEAKIEY6CURvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaXNtdAogCiBJMkMvU01CVVMgU1RVQiBEUklWRVIKLU06CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorTToJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogTDoJbGludXgtaTJjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9pMmMvaTJjLXN0dWIuYwpAQCAtNDIxMyw3ICs0MjA2LDcgQEAKIEY6CWluY2x1ZGUvdWFwaS9saW51eC9pMmMtKi5oCiAKIEkyQy1UQU9TLUVWTSBEUklWRVIKLU06CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorTToJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogTDoJbGludXgtaTJjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bQpAQCAtNDY5Niw2ICs0Njg5LDcgQEAKIAogSVJRIFNVQlNZU1RFTQogTToJVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IGlycS9jb3JlCiBGOglrZXJuZWwvaXJxLwpAQCAtNDc3MCw3ICs0NzY0LDcgQEAKIEY6CWRyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi8KIAogSVQ4NyBIQVJEV0FSRSBNT05JVE9SSU5HIERSSVZFUgotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKQEAgLTUxNDAsNyArNTEzNCw3IEBACiBGOglpbmNsdWRlL2xpbnV4L2xlZHMuaAogCiBMRUdBQ1kgRUVQUk9NIERSSVZFUgotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9lZXByb20KIEY6CWRyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKQEAgLTUyODgsMjEgKzUyODIsMjEgQEAKIEY6CWRyaXZlcnMvaHdtb24vbG03My5jCiAKIExNNzggSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKLU06CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorTToJSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CiBGOglkcml2ZXJzL2h3bW9uL2xtNzguYwogCiBMTTgzIEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vaHdtb24vbG04MwogRjoJZHJpdmVycy9od21vbi9sbTgzLmMKIAogTE05MCBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2h3bW9uL2xtOTAKQEAgLTUzMjcsNiArNTMyMSw3IEBACiBMT0NLREVQIEFORCBMT0NLU1RBVAogTToJUGV0ZXIgWmlqbHN0cmEgPHBldGVyekBpbmZyYWRlYWQub3JnPgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IGNvcmUvbG9ja2luZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9sb2NrZGVwKi50eHQKQEAgLTU0MjMsNiArNTQxOCwxNiBAQAogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9tNjhrL2hwMzAwLwogCitNODhEUzMxMDMgTUVESUEgRFJJVkVSCitNOglBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2xpbnV4dHYub3JnLworVzoJaHR0cDovL3BhbG9zYWFyaS5maS9saW51eC8KK1E6CWh0dHA6Ly9wYXRjaHdvcmsubGludXh0di5vcmcvcHJvamVjdC9saW51eC1tZWRpYS9saXN0LworVDoJZ2l0IGdpdDovL2xpbnV4dHYub3JnL2FudHRpcC9tZWRpYV90cmVlLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OGRzMzEwMyoKKwogTTg4UlMyMDAwIE1FRElBIERSSVZFUgogTToJTWFsY29sbSBQcmllc3RsZXkgPHR2Ym94c3B5QGdtYWlsLmNvbT4KIEw6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwpAQCAtNTQzMSw2ICs1NDM2LDE2IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4cnMyMDAwKgogCitNODhUUzIwMjIgTUVESUEgRFJJVkVSCitNOglBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2xpbnV4dHYub3JnLworVzoJaHR0cDovL3BhbG9zYWFyaS5maS9saW51eC8KK1E6CWh0dHA6Ly9wYXRjaHdvcmsubGludXh0di5vcmcvcHJvamVjdC9saW51eC1tZWRpYS9saXN0LworVDoJZ2l0IGdpdDovL2xpbnV4dHYub3JnL2FudHRpcC9tZWRpYV90cmVlLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9tZWRpYS90dW5lcnMvbTg4dHMyMDIyKgorCiBNQTkwMSBNQVNURVJLSVQgVVNCIEZNIFJBRElPIERSSVZFUgogTTogICAgICBBbGV4ZXkgS2xpbW92IDxrbGltb3YubGludXhAZ21haWwuY29tPgogTDogICAgICBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTY0OTUsNyArNjUxMCw3IEBACiBGOglkcml2ZXJzL2NoYXIvcGM4NzM2eF9ncGlvLmMKIAogUEM4NzQyNyBIQVJEV0FSRSBNT05JVE9SSU5HIERSSVZFUgotTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2h3bW9uL3BjODc0MjcKQEAgLTY2MjQsNiArNjYzOSw3IEBACiBNOglQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4KIE06CUluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgogTToJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGlwL3RpcC5naXQgcGVyZi9jb3JlCiBTOglTdXBwb3J0ZWQKIEY6CWtlcm5lbC9ldmVudHMvKgpAQCAtNjc0Nyw2ICs2NzYzLDcgQEAKIAogUE9TSVggQ0xPQ0tTIGFuZCBUSU1FUlMKIE06CVRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCB0aW1lcnMvY29yZQogUzoJU3VwcG9ydGVkCiBGOglmcy90aW1lcmZkLmMKQEAgLTcxNTUsNiArNzE3Miw3IEBACiBSQ1VUT1JUVVJFIE1PRFVMRQogTToJSm9zaCBUcmlwbGV0dCA8am9zaEBmcmVlZGVza3RvcC5vcmc+CiBNOgkiUGF1bCBFLiBNY0tlbm5leSIgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3BhdWxtY2svbGludXgtcmN1LmdpdAogRjoJRG9jdW1lbnRhdGlvbi9SQ1UvdG9ydHVyZS50eHQKQEAgLTcxNjIsNiArNzE4MCw3IEBACiAKIFJDVVRPUlRVUkUgVEVTVCBGUkFNRVdPUksKIE06CSJQYXVsIEUuIE1jS2VubmV5IiA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvcGF1bG1jay9saW51eC1yY3UuZ2l0CiBGOgl0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlCkBAIC03MTc3LDcgKzcxOTYsNyBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKIAogUkRTIC0gUkVMSUFCTEUgREFUQUdSQU0gU09DS0VUUwotTToJVmVua2F0IFZlbmthdHN1YnJhIDx2ZW5rYXQueC52ZW5rYXRzdWJyYUBvcmFjbGUuY29tPgorTToJQ2hpZW4gWWVuIDxjaGllbi55ZW5Ab3JhY2xlLmNvbT4KIEw6CXJkcy1kZXZlbEBvc3Mub3JhY2xlLmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglTdXBwb3J0ZWQKIEY6CW5ldC9yZHMvCkBAIC03MTg1LDYgKzcyMDQsNyBAQAogUkVBRC1DT1BZIFVQREFURSAoUkNVKQogTToJRGlwYW5rYXIgU2FybWEgPGRpcGFua2FyQGluLmlibS5jb20+CiBNOgkiUGF1bCBFLiBNY0tlbm5leSIgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5yZHJvcC5jb20vdXNlcnMvcGF1bG1jay9SQ1UvCiBTOglTdXBwb3J0ZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvcGF1bG1jay9saW51eC1yY3UuZ2l0CkBAIC03NDY0LDYgKzc0ODQsMTMgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9tZWRpYS9pMmMvczVjNzNtMy8qCiAKK1NBTVNVTkcgUzVLNUJBRiBDQU1FUkEgRFJJVkVSCitNOglLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorTToJQW5kcnplaiBIYWpkYSA8YS5oYWpkYUBzYW1zdW5nLmNvbT4KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMKKwogU0FNU1VORyBTT0MgQ0xPQ0sgRFJJVkVSUwogTToJVG9tYXN6IEZpZ2EgPHQuZmlnYUBzYW1zdW5nLmNvbT4KIFM6CVN1cHBvcnRlZApAQCAtNzQ5NCw2ICs3NTIxLDcgQEAKIFRJTUVLRUVQSU5HLCBDTE9DS1NPVVJDRSBDT1JFLCBOVFAKIE06CUpvaG4gU3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8ub3JnPgogTToJVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IHRpbWVycy9jb3JlCiBTOglTdXBwb3J0ZWQKIEY6CWluY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaApAQCAtNzUxOSw2ICs3NTQ3LDcgQEAKIFNDSEVEVUxFUgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CiBNOglQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVhZC5vcmc+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IHNjaGVkL2NvcmUKIFM6CU1haW50YWluZWQKIEY6CWtlcm5lbC9zY2hlZC8KQEAgLTc3NjUsNyArNzc5NCw3IEBACiBUOglnaXQgZ2l0Oi8vbGludXh0di5vcmcvbWVkaWFfdHJlZS5naXQKIFc6CWh0dHA6Ly9saW51eHR2Lm9yZwogUzoJT2RkIEZpeGVzCi1GOglkcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuPworRjoJZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvc2k0NzEzLj8KIAogU0k0NzEzIEZNIFJBRElPIFRSQU5TTUlUVEVSIFBMQVRGT1JNIERSSVZFUgogTToJRWR1YXJkbyBWYWxlbnRpbiA8ZWR1YmV6dmFsQGdtYWlsLmNvbT4KQEAgLTc3NzMsNyArNzgwMiwxNSBAQAogVDoJZ2l0IGdpdDovL2xpbnV4dHYub3JnL21lZGlhX3RyZWUuZ2l0CiBXOglodHRwOi8vbGludXh0di5vcmcKIFM6CU9kZCBGaXhlcwotRjoJZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MTMuYworRjoJZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvcmFkaW8tcGxhdGZvcm0tc2k0NzEzLmMKKworU0k0NzEzIEZNIFJBRElPIFRSQU5TTUlUVEVSIFVTQiBEUklWRVIKK006CUhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQgZ2l0Oi8vbGludXh0di5vcmcvbWVkaWFfdHJlZS5naXQKK1c6CWh0dHA6Ly9saW51eHR2Lm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvcmFkaW8tdXNiLXNpNDcxMy5jCiAKIFNJQU5PIERWQiBEUklWRVIKIE06CU1hdXJvIENhcnZhbGhvIENoZWhhYiA8bS5jaGVoYWJAc2Ftc3VuZy5jb20+CkBAIC03ODg2LDYgKzc5MjMsNyBAQAogU0xFRVBBQkxFIFJFQUQtQ09QWSBVUERBVEUgKFNSQ1UpCiBNOglMYWkgSmlhbmdzaGFuIDxsYWlqc0Bjbi5mdWppdHN1LmNvbT4KIE06CSJQYXVsIEUuIE1jS2VubmV5IiA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LnJkcm9wLmNvbS91c2Vycy9wYXVsbWNrL1JDVS8KIFM6CVN1cHBvcnRlZAogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9wYXVsbWNrL2xpbnV4LXJjdS5naXQKQEAgLTc5NDUsNyArNzk4Myw3IEBACiBGOglkcml2ZXJzL2h3bW9uL3NjaDU2MjcuYwogCiBTTVNDNDdCMzk3IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3YjM5NwpAQCAtODYyNCw2ICs4NjYyLDE0IEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoL3h0ZW5zYS8KIAorVEhBTktPJ1MgUkFSRU1PTk8gQU0vRk0vU1cgUkFESU8gUkVDRUlWRVIgVVNCIERSSVZFUgorTToJSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBnaXQ6Ly9saW51eHR2Lm9yZy9tZWRpYV90cmVlLmdpdAorVzoJaHR0cDovL2xpbnV4dHYub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJhcmVtb25vLmMKKwogVEhFUk1BTAogTTogICAgICBaaGFuZyBSdWkgPHJ1aS56aGFuZ0BpbnRlbC5jb20+CiBNOiAgICAgIEVkdWFyZG8gVmFsZW50aW4gPGVkdWFyZG8udmFsZW50aW5AdGkuY29tPgpAQCAtODk2Miw3ICs5MDA4LDcgQEAKIE06CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kMUBnbWFpbC5jb20+CiBXOglodHRwOi8vd3d3LmxpbnV4LW10ZC5pbmZyYWRlYWQub3JnLwogTDoJbGludXgtbXRkQGxpc3RzLmluZnJhZGVhZC5vcmcKLVQ6CWdpdCBnaXQ6Ly9naXQuaW5mcmFkZWFkLm9yZy91YmktMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL3ViaWZzLTIuNi5naXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbXRkL3ViaS8KIEY6CWluY2x1ZGUvbGludXgvbXRkL3ViaS5oCkBAIC05MTU2LDggKzkyMDIsNyBAQAogVDoJZ2l0IGdpdDovL2xpbnV4dHYub3JnL21lZGlhX3RyZWUuZ2l0CiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dAotRjoJZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi8KK0Y6CWRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyLwogCiBVU0IgU1VCU1lTVEVNCiBNOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgpAQCAtOTQ2Myw3ICs5NTA4LDcgQEAKIEY6CWRyaXZlcnMvaHdtb24vdzgzNzkzLmMKIAogVzgzNzk1IEhBUkRXQVJFIE1PTklUT1JJTkcgRFJJVkVSCi1NOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK006CUplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvaHdtb24vdzgzNzk1LmMKQEAgLTk1ODksNiArOTYzNCw3IEBACiBNOglJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KIE06CSJILiBQZXRlciBBbnZpbiIgPGhwYUB6eXRvci5jb20+CiBNOgl4ODZAa2VybmVsLm9yZworTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCB4ODYvY29yZQogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi94ODYvCkBAIC05NzQyLDExICs5Nzg4LDI3IEBACiBTOglPZGQgRml4ZXMKIEY6CWRyaXZlcnMvbWVkaWEvcGNpL3pvcmFuLwogCitaUkFNIENPTVBSRVNTRUQgUkFNIEJMT0NLIERFVklDRSBEUlZJRVIKK006CU1pbmNoYW4gS2ltIDxtaW5jaGFuQGtlcm5lbC5vcmc+CitNOglOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2Jsb2NrL3pyYW0vCitGOglEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3pyYW0udHh0CisKIFpTIERFQ1NUQVRJT04gWjg1QzMwIFNFUklBTCBEUklWRVIKIE06CSJNYWNpZWogVy4gUm96eWNraSIgPG1hY3JvQGxpbnV4LW1pcHMub3JnPgogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy90dHkvc2VyaWFsL3pzLioKIAorWlNNQUxMT0MgQ09NUFJFU1NFRCBTTEFCIE1FTU9SWSBBTExPQ0FUT1IKK006CU1pbmNoYW4gS2ltIDxtaW5jaGFuQGtlcm5lbC5vcmc+CitNOglOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+CitMOglsaW51eC1tbUBrdmFjay5vcmcKK1M6CU1haW50YWluZWQKK0Y6CW1tL3pzbWFsbG9jLmMKK0Y6CWluY2x1ZGUvbGludXgvenNtYWxsb2MuaAorCiBaU1dBUCBDT01QUkVTU0VEIFNXQVAgQ0FDSElORwogTToJU2V0aCBKZW5uaW5ncyA8c2plbm5pbmdAbGludXgudm5ldC5pYm0uY29tPgogTDoJbGludXgtbW1Aa3ZhY2sub3JnCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDQ1NWZkNDguLjkzM2UxZGUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDggKzEsOCBAQAogVkVSU0lPTiA9IDMKLVBBVENITEVWRUwgPSAxMworUEFUQ0hMRVZFTCA9IDE0CiBTVUJMRVZFTCA9IDAKLUVYVFJBVkVSU0lPTiA9Ci1OQU1FID0gT25lIEdpYW50IExlYXAgZm9yIEZyb2draW5kCitFWFRSQVZFUlNJT04gPSAtcmMyCitOQU1FID0gU2h1ZmZsaW5nIFpvbWJpZSBKdXJvcgogCiAjICpET0NVTUVOVEFUSU9OKgogIyBUbyBzZWUgYSBsaXN0IG9mIHR5cGljYWwgdGFyZ2V0cyBleGVjdXRlICJtYWtlIGhlbHAiCkBAIC0zMTEsOSArMzExLDE1IEBACiAjIElmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgbWFrZSAtcyAoc2lsZW50IG1vZGUpLCBzdXBwcmVzcyBlY2hvaW5nIG9mCiAjIGNvbW1hbmRzCiAKK2lmbmVxICgkKGZpbHRlciA0LiUsJChNQUtFX1ZFUlNJT04pKSwpCSMgbWFrZS00CitpZm5lcSAoJChmaWx0ZXIgJXMgLCQoZmlyc3R3b3JkIHgkKE1BS0VGTEFHUykpKSwpCisgIHF1aWV0PXNpbGVudF8KK2VuZGlmCitlbHNlCQkJCQkjIG1ha2UtMy44eAogaWZuZXEgKCQoZmlsdGVyIHMlIC1zJSwkKE1BS0VGTEFHUykpLCkKICAgcXVpZXQ9c2lsZW50XwogZW5kaWYKK2VuZGlmCiAKIGV4cG9ydCBxdWlldCBRIEtCVUlMRF9WRVJCT1NFCiAKQEAgLTYzMyw3ICs2MzksNyBAQAogCiBpZmRlZiBDT05GSUdfREVCVUdfSU5GTwogS0JVSUxEX0NGTEFHUwkrPSAtZwotS0JVSUxEX0FGTEFHUwkrPSAtZ2R3YXJmLTIKK0tCVUlMRF9BRkxBR1MJKz0gLVdhLC0tZ2R3YXJmLTIKIGVuZGlmCiAKIGlmZGVmIENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQKQEAgLTY4Miw2ICs2ODgsOSBAQAogIyByZXF1aXJlIGZ1bmN0aW9ucyB0byBoYXZlIGFyZ3VtZW50cyBpbiBwcm90b3R5cGVzLCBub3QgZW1wdHkgJ2ludCBmb28oKScKIEtCVUlMRF9DRkxBR1MgICArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XZXJyb3I9c3RyaWN0LXByb3RvdHlwZXMpCiAKKyMgUHJvaGliaXQgZGF0ZS90aW1lIG1hY3Jvcywgd2hpY2ggd291bGQgbWFrZSB0aGUgYnVpbGQgbm9uLWRldGVybWluaXN0aWMKK0tCVUlMRF9DRkxBR1MgICArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XZXJyb3I9ZGF0ZS10aW1lKQorCiAjIHVzZSB0aGUgZGV0ZXJtaW5pc3RpYyBtb2RlIG9mIEFSIGlmIGF2YWlsYWJsZQogS0JVSUxEX0FSRkxBR1MgOj0gJChjYWxsIGFyLW9wdGlvbixEKQogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL0tjb25maWcgYi9hcmNoL2FscGhhL0tjb25maWcKaW5kZXggOTdhMmQ5YS4uZjZjNmIzNCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9LY29uZmlnCisrKyBiL2FyY2gvYWxwaGEvS2NvbmZpZwpAQCAtMTcsNiArMTcsNyBAQAogCXNlbGVjdCBBUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCisJc2VsZWN0IEFVRElUX0FSQ0gKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBHRU5FUklDX1NNUF9JRExFX1RIUkVBRAogCXNlbGVjdCBHRU5FUklDX1NUUk5DUFlfRlJPTV9VU0VSCkBAIC03Nyw2ICs3OCw4IEBACiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKIAorY29uZmlnIEFVRElUX0FSQ0gKKwlib29sCiAKIG1lbnUgIlN5c3RlbSBzZXR1cCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggMjExMjg1MC4uOTA0N2MyZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0xOSw0ICsxOSw5IEBACiAKICNkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpIChjdXJyZW50X3B0X3JlZ3MoKS0+cjAgPSAwKQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVnc19yZXR1cm5fdmFsdWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPnIwOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA0NTM1OTdiLi4zZDZjZTZkIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC03MCw2ICs3MCw3IEBACiAjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogY2FsbGJhY2sgYmVmb3JlIHJldHVybmluZyB0byB1c2VyICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTQJLyogc3lzY2FsbCBhdWRpdCBhY3RpdmUgKi8KICNkZWZpbmUgVElGX0RJRV9JRl9LRVJORUwJOQkvKiBkaWsgcmVjdXJzaW9uIGxvY2sgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTMJLyogaXMgdGVybWluYXRpbmcgZHVlIHRvIE9PTSBraWxsZXIgKi8KIApAQCAtNzcsNiArNzgsNyBAQAogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxPDxUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCisjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAKIC8qIFdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4uICAqLwogI2RlZmluZSBfVElGX1dPUktfTUFTSwkJKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FscGhhL2tlcm5lbC9NYWtlZmlsZQppbmRleCAwZDU0NjUwLi4zZWNhYzAxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FscGhhL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX01PRFVMRVMpCSs9IG1vZHVsZS5vCiBvYmotJChDT05GSUdfUEVSRl9FVkVOVFMpICs9IHBlcmZfZXZlbnQubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQUxQSEEpICs9IHJ0Yy5vCitvYmotJChDT05GSUdfQVVESVQpCSs9IGF1ZGl0Lm8KIAogaWZkZWYgQ09ORklHX0FMUEhBX0dFTkVSSUMKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvYXVkaXQuYyBiL2FyY2gvYWxwaGEva2VybmVsL2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhOWQxOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2F1ZGl0LmMKQEAgLTAsMCArMSw2MCBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitzdGF0aWMgdW5zaWduZWQgZGlyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfZGlyX3dyaXRlLmg+Cit+MFUKK307CisKK3N0YXRpYyB1bnNpZ25lZCByZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhdHRyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfY2hhbmdlX2F0dHIuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIHNpZ25hbF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3NpZ25hbC5oPgorfjBVCit9OworCitpbnQgYXVkaXRfY2xhc3NpZnlfYXJjaChpbnQgYXJjaCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKK3sKKwlzd2l0Y2goc3lzY2FsbCkgeworCWNhc2UgX19OUl9vcGVuOgorCQlyZXR1cm4gMjsKKwljYXNlIF9fTlJfb3BlbmF0OgorCQlyZXR1cm4gMzsKKwljYXNlIF9fTlJfZXhlY3ZlOgorCQlyZXR1cm4gNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGl0X2NsYXNzZXNfaW5pdCh2b2lkKQoreworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFLCB3cml0ZV9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUwsIHNpZ25hbF9jbGFzcyk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoYXVkaXRfY2xhc3Nlc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2VudHJ5LlMgYi9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TCmluZGV4IGE5NjliOTUuLjk4NzAzZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvZW50cnkuUwpAQCAtNDY1LDcgKzQ2NSwxMSBAQAogCS5jZmlfcmVsX29mZnNldAkkMTYsIFNQX09GRisyNAogCS5jZmlfcmVsX29mZnNldAkkMTcsIFNQX09GRiszMgogCS5jZmlfcmVsX29mZnNldAkkMTgsIFNQX09GRis0MAotCWJsYnMJJDMsIHN0cmFjZQorI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKKwlsZGEgICAgICQ2LCBfVElGX1NZU0NBTExfVFJBQ0UgfCBfVElGX1NZU0NBTExfQVVESVQKKwlhbmQgICAgICQzLCAkNiwgJDMKKyNlbmRpZgorCWJuZSAgICAgJDMsIHN0cmFjZQogCWJlcQkkNCwgMWYKIAlsZHEJJDI3LCAwKCQ1KQogMToJanNyCSQyNiwgKCQyNyksIGFscGhhX25pX3N5c2NhbGwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmE0YTgwZi4uODZkODM1MSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0zMTYsMTUgKzMxNywxOCBAQAogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c2NhbGxfdHJhY2VfZW50ZXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJldCA9IDA7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjdXJyZW50X3B0X3JlZ3MoKTsKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkgJiYKIAkgICAgdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KGN1cnJlbnRfcHRfcmVncygpKSkKIAkJcmV0ID0gLTFVTDsKKwlhdWRpdF9zeXNjYWxsX2VudHJ5KEFVRElUX0FSQ0hfQUxQSEEsIHJlZ3MtPnIwLCByZWdzLT5yMTYsIHJlZ3MtPnIxNywgcmVncy0+cjE4LCByZWdzLT5yMTkpOwogCXJldHVybiByZXQgPzogY3VycmVudF9wdF9yZWdzKCktPnIwOwogfQogCiBhc21saW5rYWdlIHZvaWQKIHN5c2NhbGxfdHJhY2VfbGVhdmUodm9pZCkKIHsKKwlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudF9wdF9yZWdzKCkpOwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKIAkJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQoY3VycmVudF9wdF9yZWdzKCksIDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvYWxwaGEvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKaW5kZXggZmYzYzEwNy4uNTY3NWRjYSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYworKysgYi9hcmNoL2FscGhhL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC0zNzgsNiArMzc4LDExIEBACiBfX3dzdW0KIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSBjb25zdCB2b2lkIF9fdXNlciAqKXNyYywKLQkJCWRzdCwgbGVuLCBzdW0sIE5VTEwpOworCV9fd3N1bSBjaGVja3N1bTsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwljaGVja3N1bSA9IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSBjb25zdCB2b2lkIF9fdXNlciAqKXNyYywKKwkJCQkJCWRzdCwgbGVuLCBzdW0sIE5VTEwpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIGNoZWNrc3VtOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oCmluZGV4IDAyODNlOWUuLjY2ZWU1NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKQEAgLTExLDYgKzExLDggQEAKIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogCisjZGVmaW5lIEFTTV9OTAkJIGAJLyogdXNlICdgJyB0byBtYXJrIG5ldyBsaW5lIGluIG1hY3JvICovCisKIC8qIENhbid0IHVzZSB0aGUgRU5UUlkgbWFjcm8gaW4gbGludXgvbGlua2FnZS5oCiAgKiBnYXMgY29uc2lkZXJzICc7JyBhcyBjb21tZW50IHZzLiBuZXdsaW5lCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IGRjNmVmOWEuLmUyNTQxOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTkwNSw2ICsxOTA1LDcgQEAKIAlkZXBlbmRzIG9uICFHRU5FUklDX0FUT01JQzY0CiAJc2VsZWN0IEFSTV9QU0NJCiAJc2VsZWN0IFNXSU9UTEJfWEVOCisJc2VsZWN0IEFSQ0hfRE1BX0FERFJfVF82NEJJVAogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHJ1biBMaW51eCBpbiBhIFZpcnR1YWwgTWFjaGluZSBvbiBYZW4gb24gQVJNLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDIzZDVlMzkuLjA4YTllZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC05Niw3ICs5Niw3IEBACiB0dW5lLXkgOj0gJCh0dW5lLXkpCiAKIGlmZXEgKCQoQ09ORklHX0FFQUJJKSx5KQotQ0ZMQUdTX0FCSQk6PS1tYWJpPWFhcGNzLWxpbnV4IC1tbm8tdGh1bWItaW50ZXJ3b3JrCitDRkxBR1NfQUJJCTo9LW1hYmk9YWFwY3MtbGludXggLW1uby10aHVtYi1pbnRlcndvcmsgLW1mcHU9dmZwCiBlbHNlCiBDRkxBR1NfQUJJCTo9JChjYWxsIGNjLW9wdGlvbiwtbWFwY3MtMzIsLW1hYmk9YXBjcy1nbnUpICQoY2FsbCBjYy1vcHRpb24sLW1uby10aHVtYi1pbnRlcndvcmssKQogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9kdHMvTWFrZWZpbGUKaW5kZXggZWRlMjFjMS4uYjlkNmE4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvTWFrZWZpbGUKQEAgLTE1MiwxMCArMTUyLDEzIEBACiAJaW14NTMtbWJhNTMuZHRiIFwKIAlpbXg1My1xc2IuZHRiIFwKIAlpbXg1My1zbWQuZHRiIFwKKwlpbXg2ZGwtY3Vib3gtaS5kdGIgXAorCWlteDZkbC1odW1taW5nYm9hcmQuZHRiIFwKIAlpbXg2ZGwtc2FicmVhdXRvLmR0YiBcCiAJaW14NmRsLXNhYnJlc2QuZHRiIFwKIAlpbXg2ZGwtd2FuZGJvYXJkLmR0YiBcCiAJaW14NnEtYXJtMi5kdGIgXAorCWlteDZxLWN1Ym94LWkuZHRiIFwKIAlpbXg2cS1waHl0ZWMtcGJhYjAxLmR0YiBcCiAJaW14NnEtc2FicmVhdXRvLmR0YiBcCiAJaW14NnEtc2FicmVsaXRlLmR0YiBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOTI2MC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTkyNjAuZHRzaQppbmRleCA1NmVlODI4Li45OTc5MDFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOTI2MC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYwLmR0c2kKQEAgLTY0OCw2ICs2NDgsMTEgQEAKIAkJCXdhdGNoZG9nQGZmZmZmZDQwIHsKIAkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXdkdCI7CiAJCQkJcmVnID0gPDB4ZmZmZmZkNDAgMHgxMD47CisJCQkJaW50ZXJydXB0cyA9IDwxIElSUV9UWVBFX0xFVkVMX0hJR0ggNz47CisJCQkJYXRtZWwsd2F0Y2hkb2ctdHlwZSA9ICJoYXJkd2FyZSI7CisJCQkJYXRtZWwscmVzZXQtdHlwZSA9ICJhbGwiOworCQkJCWF0bWVsLGRiZy1oYWx0OworCQkJCWF0bWVsLGlkbGUtaGFsdDsKIAkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkJfTsKIAkJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOTI2My5kdHNpCmluZGV4IGM4ZmE5YjkuLjAwNDJmNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTkyNjMuZHRzaQpAQCAtNTUyLDYgKzU1MiwxMSBAQAogCQkJd2F0Y2hkb2dAZmZmZmZkNDAgewogCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtd2R0IjsKIAkJCQlyZWcgPSA8MHhmZmZmZmQ0MCAweDEwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgSVJRX1RZUEVfTEVWRUxfSElHSCA3PjsKKwkJCQlhdG1lbCx3YXRjaGRvZy10eXBlID0gImhhcmR3YXJlIjsKKwkJCQlhdG1lbCxyZXNldC10eXBlID0gImFsbCI7CisJCQkJYXRtZWwsZGJnLWhhbHQ7CisJCQkJYXRtZWwsaWRsZS1oYWx0OwogCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWc0NS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTlnNDUuZHRzaQppbmRleCBlZjA4NTdjLi5jYmNjMDU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWc0NS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKQEAgLTcwNiw2ICs3MDYsMTEgQEAKIAkJCXdhdGNoZG9nQGZmZmZmZDQwIHsKIAkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXdkdCI7CiAJCQkJcmVnID0gPDB4ZmZmZmZkNDAgMHgxMD47CisJCQkJaW50ZXJydXB0cyA9IDwxIElSUV9UWVBFX0xFVkVMX0hJR0ggNz47CisJCQkJYXRtZWwsd2F0Y2hkb2ctdHlwZSA9ICJoYXJkd2FyZSI7CisJCQkJYXRtZWwscmVzZXQtdHlwZSA9ICJhbGwiOworCQkJCWF0bWVsLGRiZy1oYWx0OworCQkJCWF0bWVsLGlkbGUtaGFsdDsKIAkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTluMTIuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05bjEyLmR0c2kKaW5kZXggNzI0ODI3MC4uMzk0ZTZjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTluMTIuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOW4xMi5kdHNpCkBAIC01NDEsNiArNTQxLDExIEBACiAJCQl3YXRjaGRvZ0BmZmZmZmU0MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC13ZHQiOwogCQkJCXJlZyA9IDwweGZmZmZmZTQwIDB4MTA+OworCQkJCWludGVycnVwdHMgPSA8MSBJUlFfVFlQRV9MRVZFTF9ISUdIIDc+OworCQkJCWF0bWVsLHdhdGNoZG9nLXR5cGUgPSAiaGFyZHdhcmUiOworCQkJCWF0bWVsLHJlc2V0LXR5cGUgPSAiYWxsIjsKKwkJCQlhdG1lbCxkYmctaGFsdDsKKwkJCQlhdG1lbCxpZGxlLWhhbHQ7CiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDUuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDUuZHRzaQppbmRleCA2ZTVlOWNmLi4xNzQyMTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOXg1LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTl4NS5kdHNpCkBAIC03NTQsNiArNzU0LDExIEBACiAJCQl3YXRjaGRvZ0BmZmZmZmU0MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC13ZHQiOwogCQkJCXJlZyA9IDwweGZmZmZmZTQwIDB4MTA+OworCQkJCWludGVycnVwdHMgPSA8MSBJUlFfVFlQRV9MRVZFTF9ISUdIIDc+OworCQkJCWF0bWVsLHdhdGNoZG9nLXR5cGUgPSAiaGFyZHdhcmUiOworCQkJCWF0bWVsLHJlc2V0LXR5cGUgPSAiYWxsIjsKKwkJCQlhdG1lbCxkYmctaGFsdDsKKwkJCQlhdG1lbCxpZGxlLWhhbHQ7CiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTExMzUxLWJydC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9iY20xMTM1MS1icnQuZHRzCmluZGV4IDIzY2QxNmQuLjM5NmI3MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTExMzUxLWJydC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMTEzNTEtYnJ0LmR0cwpAQCAtNDQsNSArNDQsMTEgQEAKIAkJc3RhdHVzID0gIm9rYXkiOwogCX07CiAKKwl1c2JvdGc6IHVzYkAzZjEyMDAwMCB7CisJCXN0YXR1cyA9ICJva2F5IjsKKwl9OwogCisJdXNicGh5OiB1c2ItcGh5QDNmMTMwMDAwIHsKKwkJc3RhdHVzID0gIm9rYXkiOworCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMTEzNTEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTExMzUxLmR0c2kKaW5kZXggZGQ4ZTg3OC4uZTQ5MWI4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMTEzNTEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9iY20xMTM1MS5kdHNpCkBAIC00Myw3ICs0Myw3IEBACiAJCWNvbXBhdGlibGUgPSAiYnJjbSxiY20xMTM1MS1kdy1hcGItdWFydCIsICJzbnBzLGR3LWFwYi11YXJ0IjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJcmVnID0gPDB4M2UwMDAwMDAgMHgxMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDAwMDAwPjsKKwkJY2xvY2tzID0gPCZ1YXJ0Yl9jbGs+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjcgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCXJlZy1zaGlmdCA9IDwyPjsKIAkJcmVnLWlvLXdpZHRoID0gPDQ+OwpAQCAtNTMsNyArNTMsNyBAQAogCQljb21wYXRpYmxlID0gImJyY20sYmNtMTEzNTEtZHctYXBiLXVhcnQiLCAic25wcyxkdy1hcGItdWFydCI7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCXJlZyA9IDwweDNlMDAxMDAwIDB4MTAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzAwMDAwMD47CisJCWNsb2NrcyA9IDwmdWFydGIyX2Nsaz47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA2NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJcmVnLXNoaWZ0ID0gPDI+OwogCQlyZWctaW8td2lkdGggPSA8ND47CkBAIC02Myw3ICs2Myw3IEBACiAJCWNvbXBhdGlibGUgPSAiYnJjbSxiY20xMTM1MS1kdy1hcGItdWFydCIsICJzbnBzLGR3LWFwYi11YXJ0IjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJcmVnID0gPDB4M2UwMDIwMDAgMHgxMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDAwMDAwPjsKKwkJY2xvY2tzID0gPCZ1YXJ0YjNfY2xrPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY1IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQlyZWctc2hpZnQgPSA8Mj47CiAJCXJlZy1pby13aWR0aCA9IDw0PjsKQEAgLTczLDcgKzczLDcgQEAKIAkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTExMzUxLWR3LWFwYi11YXJ0IiwgInNucHMsZHctYXBiLXVhcnQiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQlyZWcgPSA8MHgzZTAwMzAwMCAweDEwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MTMwMDAwMDA+OworCQljbG9ja3MgPSA8JnVhcnRiNF9jbGs+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjQgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCXJlZy1zaGlmdCA9IDwyPjsKIAkJcmVnLWlvLXdpZHRoID0gPDQ+OwpAQCAtOTUsNyArOTUsNyBAQAogCQljb21wYXRpYmxlID0gImJyY20sa29uYS10aW1lciI7CiAJCXJlZyA9IDwweDM1MDA2MDAwIDB4MTAwMD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3IElSUV9UWVBFX0xFVkVMX0hJR0g+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzI3Njg+OworCQljbG9ja3MgPSA8Jmh1Yl90aW1lcl9jbGs+OwogCX07CiAKIAlncGlvOiBncGlvQDM1MDAzMDAwIHsKQEAgLTExOCw2ICsxMTgsNyBAQAogCQljb21wYXRpYmxlID0gImJyY20sa29uYS1zZGhjaSI7CiAJCXJlZyA9IDwweDNmMTgwMDAwIDB4MTAwMDA+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNzcgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmc2RpbzFfY2xrPjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCkBAIC0xMjUsNiArMTI2LDcgQEAKIAkJY29tcGF0aWJsZSA9ICJicmNtLGtvbmEtc2RoY2kiOwogCQlyZWcgPSA8MHgzZjE5MDAwMCAweDEwMDAwPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDc2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQljbG9ja3MgPSA8JnNkaW8yX2Nsaz47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApAQCAtMTMyLDYgKzEzNCw3IEBACiAJCWNvbXBhdGlibGUgPSAiYnJjbSxrb25hLXNkaGNpIjsKIAkJcmVnID0gPDB4M2YxYTAwMDAgMHgxMDAwMD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJY2xvY2tzID0gPCZzZGlvM19jbGs+OwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTEzOSw2ICsxNDIsNyBAQAogCQljb21wYXRpYmxlID0gImJyY20sa29uYS1zZGhjaSI7CiAJCXJlZyA9IDwweDNmMWIwMDAwIDB4MTAwMDA+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNzMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmc2RpbzRfY2xrPjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCkBAIC0xNDYsNCArMTUwLDE2MCBAQAogCQljb21wYXRpYmxlID0gImJyY20sY2FwcmktcGluY3RybCI7CiAJCXJlZyA9IDwweDM1MDA0ODAwIDB4NDMwPjsKIAl9OworCisJaTJjQDNlMDE2MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTExMzUxLWkyYyIsICJicmNtLGtvbmEtaTJjIjsKKwkJcmVnID0gPDB4M2UwMTYwMDAgMHg4MD47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMDMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY2xvY2tzID0gPCZic2MxX2Nsaz47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKworCWkyY0AzZTAxNzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY20xMTM1MS1pMmMiLCAiYnJjbSxrb25hLWkyYyI7CisJCXJlZyA9IDwweDNlMDE3MDAwIDB4ODA+OworCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTAyIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNsb2NrcyA9IDwmYnNjMl9jbGs+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKKwlpMmNAM2UwMTgwMDAgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtMTEzNTEtaTJjIiwgImJyY20sa29uYS1pMmMiOworCQlyZWcgPSA8MHgzZTAxODAwMCAweDgwPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE2OSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljbG9ja3MgPSA8JmJzYzNfY2xrPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJaTJjQDM1MDBkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTExMzUxLWkyYyIsICJicmNtLGtvbmEtaTJjIjsKKwkJcmVnID0gPDB4MzUwMGQwMDAgMHg4MD47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxNCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljbG9ja3MgPSA8JnBtdV9ic2NfY2xrPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJY2xvY2tzIHsKKwkJYnNjMV9jbGs6IGJzYzEgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMwMDAwMDA+OworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQl9OworCisJCWJzYzJfY2xrOiBic2MyIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQlic2MzX2NsazogYnNjMyB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzAwMDAwMD47CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCX07CisKKwkJcG11X2JzY19jbGs6IHBtdV9ic2MgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMwMDAwMDA+OworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQl9OworCisJCWh1Yl90aW1lcl9jbGs6IGh1Yl90aW1lciB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMjc2OD47CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCX07CisKKwkJcHdtX2NsazogcHdtIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDI2MDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQlzZGlvMV9jbGs6IHNkaW8xIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQlzZGlvMl9jbGs6IHNkaW8yIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQlzZGlvM19jbGs6IHNkaW8zIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQlzZGlvNF9jbGs6IHNkaW80IHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl0bW9uXzFtX2NsazogdG1vbl8xbSB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl1YXJ0Yl9jbGs6IHVhcnRiIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl1YXJ0YjJfY2xrOiB1YXJ0YjIgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMwMDAwMDA+OworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQl9OworCisJCXVhcnRiM19jbGs6IHVhcnRiMyB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzAwMDAwMD47CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCX07CisKKwkJdWFydGI0X2NsazogdWFydGI0IHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl1c2Jfb3RnX2FoYl9jbGs6IHVzYl9vdGdfYWhiIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUyMDAwMDAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJfTsKKwl9OworCisJdXNib3RnOiB1c2JAM2YxMjAwMDAgeworCQljb21wYXRpYmxlID0gInNucHMsZHdjMiI7CisJCXJlZyA9IDwweDNmMTIwMDAwIDB4MTAwMDA+OworCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNDcgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmdXNiX290Z19haGJfY2xrPjsKKwkJY2xvY2stbmFtZXMgPSAib3RnIjsKKwkJcGh5cyA9IDwmdXNicGh5PjsKKwkJcGh5LW5hbWVzID0gInVzYjItcGh5IjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJdXNicGh5OiB1c2ItcGh5QDNmMTMwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGtvbmEtdXNiMi1waHkiOworCQlyZWcgPSA8MHgzZjEzMDAwMCAweDI4PjsKKwkJI3BoeS1jZWxscyA9IDwwPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4MTU1LWFwLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4MTU1LWFwLmR0cwppbmRleCAwOGU0N2MyLi41ZmYyMzgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9iY20yODE1NS1hcC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgxNTUtYXAuZHRzCkBAIC0xMyw2ICsxMyw4IEBACiAKIC9kdHMtdjEvOwogCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvZ3Bpby9ncGlvLmg+CisKICNpbmNsdWRlICJiY20xMTM1MS5kdHNpIgogCiAvIHsKQEAgLTI3LDYgKzI5LDI2IEBACiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwogCisJaTJjQDNlMDE2MDAwIHsKKwkJc3RhdHVzPSJva2F5IjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJfTsKKworCWkyY0AzZTAxNzAwMCB7CisJCXN0YXR1cz0ib2theSI7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworCX07CisKKwlpMmNAM2UwMTgwMDAgeworCQlzdGF0dXM9Im9rYXkiOworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKwl9OworCisJaTJjQDM1MDBkMDAwIHsKKwkJc3RhdHVzPSJva2F5IjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJfTsKKwogCXNkaW8xOiBzZGlvQDNmMTgwMDAwIHsKIAkJbWF4LWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCXN0YXR1cyA9ICJva2F5IjsKQEAgLTQwLDcgKzYyLDE1IEBACiAKIAlzZGlvNDogc2Rpb0AzZjFiMDAwMCB7CiAJCW1heC1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwotCQljZC1ncGlvcyA9IDwmZ3BpbyAxNCAwPjsKKwkJY2QtZ3Bpb3MgPSA8JmdwaW8gMTQgR1BJT19BQ1RJVkVfTE9XPjsKKwkJc3RhdHVzID0gIm9rYXkiOworCX07CisKKwl1c2JvdGc6IHVzYkAzZjEyMDAwMCB7CisJCXN0YXR1cyA9ICJva2F5IjsKKwl9OworCisJdXNicGh5OiB1c2ItcGh5QDNmMTMwMDAwIHsKIAkJc3RhdHVzID0gIm9rYXkiOwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLWN1Ym94LWkuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLWN1Ym94LWkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2ZGwtY3Vib3gtaS5kdHMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSdXNzZWxsIEtpbmcKKyAqLworL2R0cy12MS87CisKKyNpbmNsdWRlICJpbXg2ZGwuZHRzaSIKKyNpbmNsdWRlICJpbXg2cWRsLWN1Ym94LWkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiU29saWRSdW4gQ3Vib3gtaSBTb2xvL0R1YWxMaXRlIjsKKwljb21wYXRpYmxlID0gInNvbGlkcnVuLGN1Ym94LWkvZGwiLCAiZnNsLGlteDZkbCI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLWh1bW1pbmdib2FyZC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2ZGwtaHVtbWluZ2JvYXJkLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhmYzdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLWh1bW1pbmdib2FyZC5kdHMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsMjAxNCBSdXNzZWxsIEtpbmcKKyAqLworL2R0cy12MS87CisKKyNpbmNsdWRlICJpbXg2ZGwuZHRzaSIKKyNpbmNsdWRlICJpbXg2cWRsLW1pY3Jvc29tLmR0c2kiCisjaW5jbHVkZSAiaW14NnFkbC1taWNyb3NvbS1hcjgwMzUuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiU29saWRSdW4gSHVtbWluZ0JvYXJkIERML1NvbG8iOworCWNvbXBhdGlibGUgPSAic29saWRydW4saHVtbWluZ2JvYXJkIiwgImZzbCxpbXg2ZGwiOworCisJaXJfcmVjdjogaXItcmVjZWl2ZXIgeworCQljb21wYXRpYmxlID0gImdwaW8taXItcmVjZWl2ZXIiOworCQlncGlvcyA9IDwmZ3BpbzEgMiAxPjsKKwkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwkJcGluY3RybC0wID0gPCZwaW5jdHJsX2h1bW1pbmdib2FyZF9ncGlvMV8yPjsKKwl9OworCisJcmVndWxhdG9ycyB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisKKwkJcmVnXzNwM3Y6IDNwM3YgeworCQkJY29tcGF0aWJsZSA9ICJyZWd1bGF0b3ItZml4ZWQiOworCQkJcmVndWxhdG9yLW5hbWUgPSAiM1AzViI7CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMzMDAwMDA+OworCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJfTsKKworCQlyZWdfdXNiaDFfdmJ1czogdXNiLWgxLXZidXMgeworCQkJY29tcGF0aWJsZSA9ICJyZWd1bGF0b3ItZml4ZWQiOworCQkJZW5hYmxlLWFjdGl2ZS1oaWdoOworCQkJZ3BpbyA9IDwmZ3BpbzEgMCAwPjsKKwkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaHVtbWluZ2JvYXJkX3VzYmgxX3ZidXM+OworCQkJcmVndWxhdG9yLW5hbWUgPSAidXNiX2gxX3ZidXMiOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw1MDAwMDAwPjsKKwkJfTsKKworCQlyZWdfdXNib3RnX3ZidXM6IHVzYi1vdGctdmJ1cyB7CisJCQljb21wYXRpYmxlID0gInJlZ3VsYXRvci1maXhlZCI7CisJCQllbmFibGUtYWN0aXZlLWhpZ2g7CisJCQlncGlvID0gPCZncGlvMyAyMiAwPjsKKwkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaHVtbWluZ2JvYXJkX3VzYm90Z192YnVzPjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gInVzYl9vdGdfdmJ1cyI7CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw1MDAwMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDUwMDAwMDA+OworCQl9OworCX07CisKKwljb2RlYzogc3BkaWYtdHJhbnNtaXR0ZXIgeworCQljb21wYXRpYmxlID0gImxpbnV4LHNwZGlmLWRpdCI7CisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9odW1taW5nYm9hcmRfc3BkaWY+OworCX07CisKKwlzb3VuZC1zcGRpZiB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1hdWRpby1zcGRpZiI7CisJCW1vZGVsID0gImlteC1zcGRpZiI7CisJCS8qIElNWDYgZG9lc24ndCBpbXBsZW1lbnQgdGhpcyB5ZXQgKi8KKwkJc3BkaWYtY29udHJvbGxlciA9IDwmc3BkaWY+OworCQlzcGRpZi1vdXQ7CisJfTsKK307CisKKyZjYW4xIHsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGluY3RybF9odW1taW5nYm9hcmRfZmxleGNhbjE+OworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZpMmMxIHsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGluY3RybF9odW1taW5nYm9hcmRfaTJjMT47CisKKwkvKgorCSAqIE5vdCBmaXR0ZWQgb24gQ2Fycmllci0xIGJvYXJkLi4uIHlldAorCXN0YXR1cyA9ICJva2F5IjsKKworCXJ0YzogcGNmODUyM0A2OCB7CisJCWNvbXBhdGlibGUgPSAibnhwLHBjZjg1MjMiOworCQlyZWcgPSA8MHg2OD47CisJfTsKKwkgKi8KK307CisKKyZpb211eGMgeworCWh1bW1pbmdib2FyZCB7CisJCXBpbmN0cmxfaHVtbWluZ2JvYXJkX2ZsZXhjYW4xOiBodW1taW5nYm9hcmQtZmxleGNhbjEgeworCQkJZnNsLHBpbnMgPSA8CisJCQkJTVg2UURMX1BBRF9TRDNfQ0xLX19GTEVYQ0FOMV9SWCAweDgwMDAwMDAwCisJCQkJTVg2UURMX1BBRF9TRDNfQ01EX19GTEVYQ0FOMV9UWCAweDgwMDAwMDAwCisJCQk+OworCQl9OworCisJCXBpbmN0cmxfaHVtbWluZ2JvYXJkX2dwaW8xXzI6IGh1bW1pbmdib2FyZC1ncGlvMV8yIHsKKwkJCWZzbCxwaW5zID0gPAorCQkJCU1YNlFETF9QQURfR1BJT18yX19HUElPMV9JTzAyIDB4ODAwMDAwMDAKKwkJCT47CisJCX07CisKKwkJcGluY3RybF9odW1taW5nYm9hcmRfaTJjMTogaHVtbWluZ2JvYXJkLWkyYzEgeworCQkJZnNsLHBpbnMgPSA8CisJCQkJTVg2UURMX1BBRF9FSU1fRDIxX19JMkMxX1NDTCAweDQwMDFiOGIxCisJCQkJTVg2UURMX1BBRF9FSU1fRDI4X19JMkMxX1NEQSAweDQwMDFiOGIxCisJCQk+OworCQl9OworCisJCXBpbmN0cmxfaHVtbWluZ2JvYXJkX3NwZGlmOiBodW1taW5nYm9hcmQtc3BkaWYgeworCQkJZnNsLHBpbnMgPSA8TVg2UURMX1BBRF9HUElPXzE3X19TUERJRl9PVVQgMHgxYjBiMD47CisJCX07CisKKwkJcGluY3RybF9odW1taW5nYm9hcmRfdXNiaDFfdmJ1czogaHVtbWluZ2JvYXJkLXVzYmgxLXZidXMgeworCQkJZnNsLHBpbnMgPSA8TVg2UURMX1BBRF9HUElPXzBfX0dQSU8xX0lPMDAgMHgxYjBiMD47CisJCX07CisKKwkJcGluY3RybF9odW1taW5nYm9hcmRfdXNib3RnX3ZidXM6IGh1bW1pbmdib2FyZC11c2JvdGctdmJ1cyB7CisJCQlmc2wscGlucyA9IDxNWDZRRExfUEFEX0VJTV9EMjJfX0dQSU8zX0lPMjIgMHgxYjBiMD47CisJCX07CisKKwkJcGluY3RybF9odW1taW5nYm9hcmRfdXNkaGMyX2F1eDogaHVtbWluZ2JvYXJkLXVzZGhjMi1hdXggeworCQkJZnNsLHBpbnMgPSA8CisJCQkJTVg2UURMX1BBRF9HUElPXzRfX0dQSU8xX0lPMDQgICAgMHgxZjA3MQorCQkJPjsKKwkJfTsKKworCQlwaW5jdHJsX2h1bW1pbmdib2FyZF91c2RoYzI6IGh1bW1pbmdib2FyZC11c2RoYzIgeworCQkJZnNsLHBpbnMgPSA8CisJCQkJTVg2UURMX1BBRF9TRDJfQ01EX19TRDJfQ01EICAgIDB4MTcwNTkKKwkJCQlNWDZRRExfUEFEX1NEMl9DTEtfX1NEMl9DTEsgICAgMHgxMDA1OQorCQkJCU1YNlFETF9QQURfU0QyX0RBVDBfX1NEMl9EQVRBMCAweDE3MDU5CisJCQkJTVg2UURMX1BBRF9TRDJfREFUMV9fU0QyX0RBVEExIDB4MTcwNTkKKwkJCQlNWDZRRExfUEFEX1NEMl9EQVQyX19TRDJfREFUQTIgMHgxNzA1OQorCQkJCU1YNlFETF9QQURfU0QyX0RBVDNfX1NEMl9EQVRBMyAweDEzMDU5CisJCQk+OworCQl9OworCX07Cit9OworCismc3BkaWYgeworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ1c2JoMSB7CisJdmJ1cy1zdXBwbHkgPSA8JnJlZ191c2JoMV92YnVzPjsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismdXNib3RnIHsKKwl2YnVzLXN1cHBseSA9IDwmcmVnX3VzYm90Z192YnVzPjsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismdXNkaGMyIHsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwKKwkJJnBpbmN0cmxfaHVtbWluZ2JvYXJkX3VzZGhjMl9hdXgKKwkJJnBpbmN0cmxfaHVtbWluZ2JvYXJkX3VzZGhjMgorCT47CisJdm1tYy1zdXBwbHkgPSA8JnJlZ18zcDN2PjsKKwljZC1ncGlvcyA9IDwmZ3BpbzEgNCAwPjsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEtY3Vib3gtaS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS1jdWJveC1pLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzVmMzFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEtY3Vib3gtaS5kdHMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSdXNzZWxsIEtpbmcKKyAqLworL2R0cy12MS87CisKKyNpbmNsdWRlICJpbXg2cS5kdHNpIgorI2luY2x1ZGUgImlteDZxZGwtY3Vib3gtaS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJTb2xpZFJ1biBDdWJveC1pIER1YWwvUXVhZCI7CisJY29tcGF0aWJsZSA9ICJzb2xpZHJ1bixjdWJveC1pL3EiLCAiZnNsLGlteDZxIjsKK307CisKKyZzYXRhIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1jdWJveC1pLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLWN1Ym94LWkuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRhYTNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1jdWJveC1pLmR0c2kKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgUnVzc2VsbCBLaW5nCisgKi8KKyNpbmNsdWRlICJpbXg2cWRsLW1pY3Jvc29tLmR0c2kiCisjaW5jbHVkZSAiaW14NnFkbC1taWNyb3NvbS1hcjgwMzUuZHRzaSIKKworLyB7CisJaXJfcmVjdjogaXItcmVjZWl2ZXIgeworCQljb21wYXRpYmxlID0gImdwaW8taXItcmVjZWl2ZXIiOworCQlncGlvcyA9IDwmZ3BpbzMgOSAxPjsKKwkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwkJcGluY3RybC0wID0gPCZwaW5jdHJsX2N1Ym94X2lfaXI+OworCX07CisKKwlyZWd1bGF0b3JzIHsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKworCQlyZWdfM3AzdjogM3AzdiB7CisJCQljb21wYXRpYmxlID0gInJlZ3VsYXRvci1maXhlZCI7CisJCQlyZWd1bGF0b3ItbmFtZSA9ICIzUDNWIjsKKwkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDMzMDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQl9OworCisJCXJlZ191c2JoMV92YnVzOiB1c2ItaDEtdmJ1cyB7CisJCQljb21wYXRpYmxlID0gInJlZ3VsYXRvci1maXhlZCI7CisJCQllbmFibGUtYWN0aXZlLWhpZ2g7CisJCQlncGlvID0gPCZncGlvMSAwIDA+OworCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwkJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9jdWJveF9pX3VzYmgxX3ZidXM+OworCQkJcmVndWxhdG9yLW5hbWUgPSAidXNiX2gxX3ZidXMiOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw1MDAwMDAwPjsKKwkJfTsKKworCQlyZWdfdXNib3RnX3ZidXM6IHVzYi1vdGctdmJ1cyB7CisJCQljb21wYXRpYmxlID0gInJlZ3VsYXRvci1maXhlZCI7CisJCQllbmFibGUtYWN0aXZlLWhpZ2g7CisJCQlncGlvID0gPCZncGlvMyAyMiAwPjsKKwkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfY3Vib3hfaV91c2JvdGdfdmJ1cz47CisJCQlyZWd1bGF0b3ItbmFtZSA9ICJ1c2Jfb3RnX3ZidXMiOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw1MDAwMDAwPjsKKwkJfTsKKwl9OworCisJY29kZWM6IHNwZGlmLXRyYW5zbWl0dGVyIHsKKwkJY29tcGF0aWJsZSA9ICJsaW51eCxzcGRpZi1kaXQiOworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfY3Vib3hfaV9zcGRpZj47CisJfTsKKworCXNvdW5kLXNwZGlmIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWF1ZGlvLXNwZGlmIjsKKwkJbW9kZWwgPSAiaW14LXNwZGlmIjsKKwkJLyogSU1YNiBkb2Vzbid0IGltcGxlbWVudCB0aGlzIHlldCAqLworCQlzcGRpZi1jb250cm9sbGVyID0gPCZzcGRpZj47CisJCXNwZGlmLW91dDsKKwl9OworfTsKKworJmkyYzMgeworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZwaW5jdHJsX2N1Ym94X2lfaTJjMz47CisKKwlzdGF0dXMgPSAib2theSI7CisKKwlydGM6IHBjZjg1MjNANjggeworCQljb21wYXRpYmxlID0gIm54cCxwY2Y4NTIzIjsKKwkJcmVnID0gPDB4Njg+OworCX07Cit9OworCismaW9tdXhjIHsKKwljdWJveF9pIHsKKwkJcGluY3RybF9jdWJveF9pX2kyYzM6IGN1Ym94LWktaTJjMyB7CisJCQlmc2wscGlucyA9IDwKKwkJCQlNWDZRRExfUEFEX0VJTV9EMTdfX0kyQzNfU0NMIDB4NDAwMWI4YjEKKwkJCQlNWDZRRExfUEFEX0VJTV9EMThfX0kyQzNfU0RBIDB4NDAwMWI4YjEKKwkJCT47CisJCX07CisKKwkJcGluY3RybF9jdWJveF9pX2lyOiBjdWJveC1pLWlyIHsKKwkJCWZzbCxwaW5zID0gPAorCQkJCU1YNlFETF9QQURfRUlNX0RBOV9fR1BJTzNfSU8wOSAweDgwMDAwMDAwCisJCQk+OworCQl9OworCisJCXBpbmN0cmxfY3Vib3hfaV9zcGRpZjogY3Vib3gtaS1zcGRpZiB7CisJCQlmc2wscGlucyA9IDxNWDZRRExfUEFEX0dQSU9fMTdfX1NQRElGX09VVCAweDFiMGIwPjsKKwkJfTsKKworCQlwaW5jdHJsX2N1Ym94X2lfdXNiaDFfdmJ1czogY3Vib3gtaS11c2JoMS12YnVzIHsKKwkJCWZzbCxwaW5zID0gPE1YNlFETF9QQURfR1BJT18wX19HUElPMV9JTzAwIDB4NDAwMWIwYjA+OworCQl9OworCisJCXBpbmN0cmxfY3Vib3hfaV91c2JvdGdfdmJ1czogY3Vib3gtaS11c2JvdGctdmJ1cyB7CisJCQlmc2wscGlucyA9IDxNWDZRRExfUEFEX0VJTV9EMjJfX0dQSU8zX0lPMjIgMHg0MDAxYjBiMD47CisJCX07CisKKwkJcGluY3RybF9jdWJveF9pX3VzZGhjMl9hdXg6IGN1Ym94LWktdXNkaGMyLWF1eCB7CisJCQlmc2wscGlucyA9IDwKKwkJCQlNWDZRRExfUEFEX0dQSU9fNF9fR1BJTzFfSU8wNCAgICAweDFmMDcxCisJCQkJTVg2UURMX1BBRF9LRVlfUk9XMV9fU0QyX1ZTRUxFQ1QgMHgxYjA3MQorCQkJPjsKKwkJfTsKKworCQlwaW5jdHJsX2N1Ym94X2lfdXNkaGMyOiBjdWJveC1pLXVzZGhjMiB7CisJCQlmc2wscGlucyA9IDwKKwkJCQlNWDZRRExfUEFEX1NEMl9DTURfX1NEMl9DTUQgICAgMHgxNzA1OQorCQkJCU1YNlFETF9QQURfU0QyX0NMS19fU0QyX0NMSyAgICAweDEwMDU5CisJCQkJTVg2UURMX1BBRF9TRDJfREFUMF9fU0QyX0RBVEEwIDB4MTcwNTkKKwkJCQlNWDZRRExfUEFEX1NEMl9EQVQxX19TRDJfREFUQTEgMHgxNzA1OQorCQkJCU1YNlFETF9QQURfU0QyX0RBVDJfX1NEMl9EQVRBMiAweDE3MDU5CisJCQkJTVg2UURMX1BBRF9TRDJfREFUM19fU0QyX0RBVEEzIDB4MTMwNTkKKwkJCT47CisJCX07CisJfTsKK307CisKKyZzcGRpZiB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKworJnVzYmgxIHsKKwl2YnVzLXN1cHBseSA9IDwmcmVnX3VzYmgxX3ZidXM+OworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ1c2JvdGcgeworCXZidXMtc3VwcGx5ID0gPCZyZWdfdXNib3RnX3ZidXM+OworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ1c2RoYzIgeworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZwaW5jdHJsX2N1Ym94X2lfdXNkaGMyX2F1eCAmcGluY3RybF9jdWJveF9pX3VzZGhjMj47CisJdm1tYy1zdXBwbHkgPSA8JnJlZ18zcDN2PjsKKwljZC1ncGlvcyA9IDwmZ3BpbzEgNCAwPjsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1taWNyb3NvbS1hcjgwMzUuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwtbWljcm9zb20tYXI4MDM1LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjYjJmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwtbWljcm9zb20tYXI4MDM1LmR0c2kKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgZGVzY3JpYmVzIHRoZSBob29rdXAgZm9yIGFuIEFSODAzNSB0byB0aGUgaU1YNiBvbiB0aGUgU29saWRSdW4KKyAqIE1pY3JvU09NLgorICovCismZmVjIHsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGluY3RybF9taWNyb3NvbV9lbmV0X2FyODAzNT47CisJcGh5LW1vZGUgPSAicmdtaWkiOworCXBoeS1yZXNldC1kdXJhdGlvbiA9IDwyPjsKKwlwaHktcmVzZXQtZ3Bpb3MgPSA8JmdwaW80IDE1IDA+OworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZpb211eGMgeworCWVuZXQgeworCQlwaW5jdHJsX21pY3Jvc29tX2VuZXRfYXI4MDM1OiBtaWNyb3NvbS1lbmV0LWFyODAzNSB7CisJCQlmc2wscGlucyA9IDwKKwkJCQlNWDZRRExfUEFEX0VORVRfTURJT19fRU5FVF9NRElPCQkweDFiMGIwCisJCQkJTVg2UURMX1BBRF9FTkVUX01EQ19fRU5FVF9NREMJCTB4MWIwYjAKKwkJCQkvKiBBUjgwMzUgcmVzZXQgKi8KKwkJCQlNWDZRRExfUEFEX0tFWV9ST1c0X19HUElPNF9JTzE1CQkweDEzMGIwCisJCQkJLyogQVI4MDM1IGludGVycnVwdCAqLworCQkJCU1YNlFETF9QQURfREkwX1BJTjJfX0dQSU80X0lPMTgJCTB4ODAwMDAwMDAKKwkJCQkvKiBHUElPMTYgLT4gQVI4MDM1IDI1TUh6ICovCisJCQkJTVg2UURMX1BBRF9HUElPXzE2X19FTkVUX1JFRl9DTEsJMHhjMDAwMDAwMAorCQkJCU1YNlFETF9QQURfUkdNSUlfVFhDX19SR01JSV9UWEMJCTB4ODAwMDAwMDAKKwkJCQlNWDZRRExfUEFEX1JHTUlJX1REMF9fUkdNSUlfVEQwCQkweDFiMGIwCisJCQkJTVg2UURMX1BBRF9SR01JSV9URDFfX1JHTUlJX1REMQkJMHgxYjBiMAorCQkJCU1YNlFETF9QQURfUkdNSUlfVEQyX19SR01JSV9URDIJCTB4MWIwYjAKKwkJCQlNWDZRRExfUEFEX1JHTUlJX1REM19fUkdNSUlfVEQzCQkweDFiMGIwCisJCQkJTVg2UURMX1BBRF9SR01JSV9UWF9DVExfX1JHTUlJX1RYX0NUTAkweDFiMGIwCisJCQkJLyogQVI4MDM1IENMS18yNU0gLS0+IEVORVRfUkVGX0NMSyAoVjIyKSAqLworCQkJCU1YNlFETF9QQURfRU5FVF9SRUZfQ0xLX19FTkVUX1RYX0NMSwkweDBhMGIxCisJCQkJLyogQVI4MDM1IHBpbiBzdHJhcHBpbmc6IElPIHZvbHRhZ2U6IHB1bGwgdXAgKi8KKwkJCQlNWDZRRExfUEFEX1JHTUlJX1JYQ19fUkdNSUlfUlhDCQkweDFiMGIwCisJCQkJLyogQVI4MDM1IHBpbiBzdHJhcHBpbmc6IFBIWUFERFIjMDogcHVsbCBkb3duICovCisJCQkJTVg2UURMX1BBRF9SR01JSV9SRDBfX1JHTUlJX1JEMAkJMHgxMzBiMAorCQkJCS8qIEFSODAzNSBwaW4gc3RyYXBwaW5nOiBQSFlBRERSIzE6IHB1bGwgZG93biAqLworCQkJCU1YNlFETF9QQURfUkdNSUlfUkQxX19SR01JSV9SRDEJCTB4MTMwYjAKKwkJCQkvKiBBUjgwMzUgcGluIHN0cmFwcGluZzogTU9ERSMxOiBwdWxsIHVwICovCisJCQkJTVg2UURMX1BBRF9SR01JSV9SRDJfX1JHTUlJX1JEMgkJMHgxYjBiMAorCQkJCS8qIEFSODAzNSBwaW4gc3RyYXBwaW5nOiBNT0RFIzM6IHB1bGwgdXAgKi8KKwkJCQlNWDZRRExfUEFEX1JHTUlJX1JEM19fUkdNSUlfUkQzCQkweDFiMGIwCisJCQkJLyogQVI4MDM1IHBpbiBzdHJhcHBpbmc6IE1PREUjMDogcHVsbCBkb3duICovCisJCQkJTVg2UURMX1BBRF9SR01JSV9SWF9DVExfX1JHTUlJX1JYX0NUTAkweDEzMGIwCisKKwkJCQkvKgorCQkJCSAqIEFzIHRoZSBSTUlJIHBpbnMgYXJlIGFsc28gY29ubmVjdGVkIHRvIFJHTUlJCisJCQkJICogc28gdGhhdCBhbiBBUjgwMzAgY2FuIGJlIHBsYWNlZCwgc2V0IHRoZXNlCisJCQkJICogdG8gaGlnaC16IHdpdGggdGhlIHNhbWUgcHVsbHMgYXMgYWJvdmUuCisJCQkJICogVXNlIHRoZSBHUElPIHNldHRpbmdzIHRvIGF2b2lkIGNoYW5naW5nIHRoZQorCQkJCSAqIGlucHV0IHNlbGVjdCByZWdpc3RlcnMuCisJCQkJICovCisJCQkJTVg2UURMX1BBRF9FTkVUX0NSU19EVl9fR1BJTzFfSU8yNQkweDAzMDAwCisJCQkJTVg2UURMX1BBRF9FTkVUX1JYRDBfX0dQSU8xX0lPMjcJMHgwMzAwMAorCQkJCU1YNlFETF9QQURfRU5FVF9SWEQxX19HUElPMV9JTzI2CTB4MDMwMDAKKwkJCT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLW1pY3Jvc29tLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLW1pY3Jvc29tLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyOWQwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwtbWljcm9zb20uZHRzaQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzLDIwMTQgUnVzc2VsbCBLaW5nCisgKi8KKworJmlvbXV4YyB7CisJbWljcm9zb20geworCQlwaW5jdHJsX21pY3Jvc29tX3VhcnQxOiBtaWNyb3NvbS11YXJ0MSB7CisJCQlmc2wscGlucyA9IDwKKwkJCQlNWDZRRExfUEFEX0NTSTBfREFUMTBfX1VBUlQxX1RYX0RBVEEJMHgxYjBiMQorCQkJCU1YNlFETF9QQURfQ1NJMF9EQVQxMV9fVUFSVDFfUlhfREFUQQkweDFiMGIxCisJCQk+OworCQl9OworCisJCXBpbmN0cmxfbWljcm9zb21fdXNib3RnOiBtaWNyb3NvbS11c2JvdGcgeworCQkJLyoKKwkJCSAqIFNpbWlsYXIgdG8gcGluY3RybF91c2JvdGdfMiwgYnV0IHdlIHdhbnQgaXQKKwkJCSAqIHB1bGxlZCBkb3duIGZvciBhIGZpeGVkIGhvc3QgY29ubmVjdGlvbi4KKwkJCSAqLworCQkJZnNsLHBpbnMgPSA8TVg2UURMX1BBRF9HUElPXzFfX1VTQl9PVEdfSUQgMHgxMzA1OT47CisJCX07CisJfTsKK307CisKKyZ1YXJ0MSB7CisJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfbWljcm9zb21fdWFydDE+OworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ1c2JvdGcgeworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZwaW5jdHJsX21pY3Jvc29tX3VzYm90Zz47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMva2l6Ym94LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2tpemJveC5kdHMKaW5kZXggMDJkZjE5MS4uOTI4ZjZlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMva2l6Ym94LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9raXpib3guZHRzCkBAIC01Myw2ICs1MywxMiBAQAogCQkJCXN0YXR1cyA9ICJva2F5IjsKIAkJCX07CiAKKwkJCXdhdGNoZG9nQGZmZmZmZDQwIHsKKwkJCQl0aW1lb3V0LXNlYyA9IDwxNT47CisJCQkJYXRtZWwsbWF4LWhlYXJ0YmVhdC1zZWMgPSA8MTY+OworCQkJCWF0bWVsLG1pbi1oZWFydGJlYXQtc2VjID0gPDA+OworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CiAJCX07CiAKIAkJbmFuZDA6IG5hbmRANDAwMDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbW94YXJ0LXVjNzExMmx4LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21veGFydC11YzcxMTJseC5kdHMKaW5kZXggOTA3NDlkNS4uMTBkMDg4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbW94YXJ0LXVjNzExMmx4LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9tb3hhcnQtdWM3MTEybHguZHRzCkBAIC0xNyw2ICsxNywxNCBAQAogCQlyZWcgPSA8MHgwIDB4MjAwMDAwMD47CiAJfTsKIAorCWNsb2NrcyB7CisJCXJlZjEyOiByZWYxMk0geworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTIwMDAwMDA+OworCQl9OworCX07CisKIAlmbGFzaEA4MDAwMDAwMCwwIHsKIAkJY29tcGF0aWJsZSA9ICJudW1vbnl4LGpzMjhmMTI4IiwgImNmaS1mbGFzaCI7CiAJCXJlZyA9IDwweDgwMDAwMDAwIDB4MTAwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tb3hhcnQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21veGFydC5kdHNpCmluZGV4IGRhMWQ4ZWYuLjFmZDI3ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21veGFydC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21veGFydC5kdHNpCkBAIC0yNiwxMiArMjYsNiBAQAogCWNsb2NrcyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlyZWYxMjogcmVmMTJNIHsKLQkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOwotCQkJI2Nsb2NrLWNlbGxzID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEyMDAwMDAwPjsKLQkJfTsKIAl9OwogCiAJc29jIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20tbXNtODY2MC1zdXJmLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20tbXNtODY2MC1zdXJmLmR0cwppbmRleCAxMTg3MTg1Li42OGE3MmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9xY29tLW1zbTg2NjAtc3VyZi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS1tc204NjYwLXN1cmYuZHRzCkBAIC0yLDYgKzIsOCBAQAogCiAvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCiAKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204NjYwLmg+CisKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIE1TTTg2NjAgU1VSRiI7CiAJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg2NjAtc3VyZiIsICJxY29tLG1zbTg2NjAiOwpAQCAtMzcsMTEgKzM5LDIwIEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJfTsKIAorCWdjYzogY2xvY2stY29udHJvbGxlckA5MDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZ2NjLW1zbTg2NjAiOworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCSNyZXNldC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4OTAwMDAwIDB4NDAwMD47CisJfTsKKwogCXNlcmlhbEAxOWM0MDAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjMiLCAicWNvbSxtc20tdWFydGRtIjsKIAkJcmVnID0gPDB4MTljNDAwMDAgMHgxMDAwPiwKIAkJICAgICAgPDB4MTljMDAwMDAgMHgxMDAwPjsKIAkJaW50ZXJydXB0cyA9IDwwIDE5NSAweDA+OworCQljbG9ja3MgPSA8JmdjYyBHU0JJMTJfVUFSVF9DTEs+LCA8JmdjYyBHU0JJMTJfSF9DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlIiwgImlmYWNlIjsKIAl9OwogCiAJcWNvbSxzc2JpQDUwMDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9xY29tLW1zbTg5NjAtY2RwLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20tbXNtODk2MC1jZHAuZHRzCmluZGV4IDZjY2JhYzcuLjdjMzBkZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20tbXNtODk2MC1jZHAuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20tbXNtODk2MC1jZHAuZHRzCkBAIC0yLDYgKzIsOCBAQAogCiAvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCiAKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTYwLmg+CisKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIE1TTTg5NjAgQ0RQIjsKIAljb21wYXRpYmxlID0gInFjb20sbXNtODk2MC1jZHAiLCAicWNvbSxtc204OTYwIjsKQEAgLTM3LDExICszOSwyNyBAQAogCQlyZWcgPSA8MHg4MDAwMDAgMHg0MDAwPjsKIAl9OwogCisJZ2NjOiBjbG9jay1jb250cm9sbGVyQDkwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxnY2MtbXNtODk2MCI7CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJI3Jlc2V0LWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHg5MDAwMDAgMHg0MDAwPjsKKwl9OworCisJY2xvY2stY29udHJvbGxlckA0MDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1tY2MtbXNtODk2MCI7CisJCXJlZyA9IDwweDQwMDAwMDAgMHgxMDAwPjsKKwkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkjcmVzZXQtY2VsbHMgPSA8MT47CisJfTsKKwogCXNlcmlhbEAxNjQ0MDAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjMiLCAicWNvbSxtc20tdWFydGRtIjsKIAkJcmVnID0gPDB4MTY0NDAwMDAgMHgxMDAwPiwKIAkJICAgICAgPDB4MTY0MDAwMDAgMHgxMDAwPjsKIAkJaW50ZXJydXB0cyA9IDwwIDE1NCAweDA+OworCQljbG9ja3MgPSA8JmdjYyBHU0JJNV9VQVJUX0NMSz4sIDwmZ2NjIEdTQkk1X0hfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZSIsICJpZmFjZSI7CiAJfTsKIAogCXFjb20sc3NiaUA1MDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS1tc204OTc0LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9xY29tLW1zbTg5NzQuZHRzaQppbmRleCA2YWM5NDk2Li45ZTVkYWRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9xY29tLW1zbTg5NzQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9xY29tLW1zbTg5NzQuZHRzaQpAQCAtMiw2ICsyLDggQEAKIAogI2luY2x1ZGUgInNrZWxldG9uLmR0c2kiCiAKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTc0Lmg+CisKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIE1TTTg5NzQiOwogCWNvbXBhdGlibGUgPSAicWNvbSxtc204OTc0IjsKQEAgLTkzLDUgKzk1LDI3IEBACiAJCQljb21wYXRpYmxlID0gInFjb20scHNob2xkIjsKIAkJCXJlZyA9IDwweGZjNGFiMDAwIDB4ND47CiAJCX07CisKKwkJZ2NjOiBjbG9jay1jb250cm9sbGVyQGZjNDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxnY2MtbXNtODk3NCI7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkjcmVzZXQtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHhmYzQwMDAwMCAweDQwMDA+OworCQl9OworCisJCW1tY2M6IGNsb2NrLWNvbnRyb2xsZXJAZmQ4YzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1tY2MtbXNtODk3NCI7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkjcmVzZXQtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHhmZDhjMDAwMCAweDYwMDA+OworCQl9OworCisJCXNlcmlhbEBmOTkxZTAwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS40IiwgInFjb20sbXNtLXVhcnRkbSI7CisJCQlyZWcgPSA8MHhmOTkxZTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDEwOCAweDA+OworCQkJY2xvY2tzID0gPCZnY2MgR0NDX0JMU1AxX1VBUlQyX0FQUFNfQ0xLPiwgPCZnY2MgR0NDX0JMU1AxX0FIQl9DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiY29yZSIsICJpZmFjZSI7CisJCX07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkwLmR0c2kKaW5kZXggZjQ4NDg3Yy4uNzFiMTI1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcjhhNzc5MC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3I4YTc3OTAuZHRzaQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCXJlZyA9IDwwIDB4ZTY1MDgwMDAgMCAweDQwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDI4NyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwM19jbGtzIFI4QTc3OTBfQ0xLX0kyQzA+OworCQljbG9ja3MgPSA8Jm1zdHA5X2Nsa3MgUjhBNzc5MF9DTEtfSTJDMD47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAJCXJlZyA9IDwwIDB4ZTY1MTgwMDAgMCAweDQwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDI4OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwM19jbGtzIFI4QTc3OTBfQ0xLX0kyQzE+OworCQljbG9ja3MgPSA8Jm1zdHA5X2Nsa3MgUjhBNzc5MF9DTEtfSTJDMT47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJCXJlZyA9IDwwIDB4ZTY1MzAwMDAgMCAweDQwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDI4NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwM19jbGtzIFI4QTc3OTBfQ0xLX0kyQzI+OworCQljbG9ja3MgPSA8Jm1zdHA5X2Nsa3MgUjhBNzc5MF9DTEtfSTJDMj47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJCXJlZyA9IDwwIDB4ZTY1NDAwMDAgMCAweDQwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDI5MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwM19jbGtzIFI4QTc3OTBfQ0xLX0kyQzM+OworCQljbG9ja3MgPSA8Jm1zdHA5X2Nsa3MgUjhBNzc5MF9DTEtfSTJDMz47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc2FtYTVkMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc2FtYTVkMy5kdHNpCmluZGV4IDExMDU1NTguLjUyNDQ3YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3NhbWE1ZDMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzLmR0c2kKQEAgLTEwOTIsNiArMTA5MiwxMSBAQAogCQkJd2F0Y2hkb2dAZmZmZmZlNDAgewogCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtd2R0IjsKIAkJCQlyZWcgPSA8MHhmZmZmZmU0MCAweDEwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQgSVJRX1RZUEVfTEVWRUxfSElHSCA3PjsKKwkJCQlhdG1lbCx3YXRjaGRvZy10eXBlID0gImhhcmR3YXJlIjsKKwkJCQlhdG1lbCxyZXNldC10eXBlID0gImFsbCI7CisJCQkJYXRtZWwsZGJnLWhhbHQ7CisJCQkJYXRtZWwsaWRsZS1oYWx0OwogCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCmluZGV4IDA0MGJiMGUuLjEwNjY2Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJcmFuZ2VzOwogCiAJCWVtYWM6IGV0aGVybmV0QDAxYzBiMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWVtYWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWVtYWMiOwogCQkJcmVnID0gPDB4MDFjMGIwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8NTU+OwogCQkJY2xvY2tzID0gPCZhaGJfZ2F0ZXMgMTc+OwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJCX07CiAKIAkJbWRpb0AwMWMwYjA4MCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1tZGlvIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1tZGlvIjsKIAkJCXJlZyA9IDwweDAxYzBiMDgwIDB4MTQ+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpCmluZGV4IGVhMTYwNTQuLjY0OTYxNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMHMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTBzLmR0c2kKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQlyYW5nZXM7CiAKIAkJZW1hYzogZXRoZXJuZXRAMDFjMGIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktZW1hYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtZW1hYyI7CiAJCQlyZWcgPSA8MHgwMWMwYjAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw1NT47CiAJCQljbG9ja3MgPSA8JmFoYl9nYXRlcyAxNz47CkBAIC0yODYsNyArMjg2LDcgQEAKIAkJfTsKIAogCQltZGlvQDAxYzBiMDgwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLW1kaW8iOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLW1kaW8iOwogCQkJcmVnID0gPDB4MDFjMGIwODAgMHgxND47CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCmluZGV4IDExOWYwNjYuLjlmZjA5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJcmFuZ2VzOwogCiAJCWVtYWM6IGV0aGVybmV0QDAxYzBiMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWVtYWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWVtYWMiOwogCQkJcmVnID0gPDB4MDFjMGIwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MCA1NSA0PjsKIAkJCWNsb2NrcyA9IDwmYWhiX2dhdGVzIDE3PjsKQEAgLTM0OCw3ICszNDgsNyBAQAogCQl9OwogCiAJCW1kaW9AMDFjMGIwODAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktbWRpbyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtbWRpbyI7CiAJCQlyZWcgPSA8MHgwMWMwYjA4MCAweDE0PjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtNzAwMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKaW5kZXggNWQ3NjgxYi4uOGI2N2IxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kKQEAgLTEwMiw2ICsxMDIsMjYgQEAKIAkJCWNsb2NrLW5hbWVzID0gInBjbGsiLCAiaGNsayIsICJ0eF9jbGsiOwogCQl9OwogCisJCXNkaGNpMDogcHM3LXNkaGNpQGUwMTAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJhc2FuLHNkaGNpLTguOWEiOworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCWNsb2NrLW5hbWVzID0gImNsa194aW4iLCAiY2xrX2FoYiI7CisJCQljbG9ja3MgPSA8JmNsa2MgMjE+LCA8JmNsa2MgMzI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJCQlpbnRlcnJ1cHRzID0gPDAgMjQgND47CisJCQlyZWcgPSA8MHhlMDEwMDAwMCAweDEwMDA+OworCQl9IDsKKworCQlzZGhjaTE6IHBzNy1zZGhjaUBlMDEwMTAwMCB7CisJCQljb21wYXRpYmxlID0gImFyYXNhbixzZGhjaS04LjlhIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQljbG9jay1uYW1lcyA9ICJjbGtfeGluIiwgImNsa19haGIiOworCQkJY2xvY2tzID0gPCZjbGtjIDIyPiwgPCZjbGtjIDMzPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCQkJaW50ZXJydXB0cyA9IDwwIDQ3IDQ+OworCQkJcmVnID0gPDB4ZTAxMDEwMDAgMHgxMDAwPjsKKwkJfSA7CisKIAkJc2xjcjogc2xjckBmODAwMDAwMCB7CiAJCQljb21wYXRpYmxlID0gInhsbngsenlucS1zbGNyIjsKIAkJCXJlZyA9IDwweEY4MDAwMDAwIDB4MTAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy96eW5xLXpjNzAyLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtemM3MDIuZHRzCmluZGV4IDM0ZDY4MGEuLmM5MTNmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtemM3MDIuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtemM3MDIuZHRzCkBAIC0zNCw2ICszNCwxMCBAQAogCXBoeS1tb2RlID0gInJnbWlpIjsKIH07CiAKKyZzZGhjaTAgeworCXN0YXR1cyA9ICJva2F5IjsKK307CisKICZ1YXJ0MSB7CiAJc3RhdHVzID0gIm9rYXkiOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtemM3MDYuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS16YzcwNi5kdHMKaW5kZXggYjI4MzVkNS4uODhmNjJjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvenlucS16YzcwNi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS16YzcwNi5kdHMKQEAgLTM1LDYgKzM1LDEwIEBACiAJcGh5LW1vZGUgPSAicmdtaWkiOwogfTsKIAorJnNkaGNpMCB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKwogJnVhcnQxIHsKIAlzdGF0dXMgPSAib2theSI7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvenlucS16ZWQuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvenlucS16ZWQuZHRzCmluZGV4IDJlZGEwNjguLjgyZDdlZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3p5bnEtemVkLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy96eW5xLXplZC5kdHMKQEAgLTM1LDYgKzM1LDEwIEBACiAJcGh5LW1vZGUgPSAicmdtaWkiOwogfTsKIAorJnNkaGNpMCB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKwogJnVhcnQxIHsKIAlzdGF0dXMgPSAib2theSI7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9iY21fZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9iY21fZGVmY29uZmlnCmluZGV4IDJjMzhmZGYuLjI1MTlkNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvYmNtX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2JjbV9kZWZjb25maWcKQEAgLTEyNiwzICsxMjYsNiBAQAogQ09ORklHX1haX0RFQz15CiBDT05GSUdfQVZFUkFHRT15CiBDT05GSUdfUElOQ1RSTF9DQVBSST15CitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX0JDTV9LT05BX1dEVD15CitDT05GSUdfQkNNX0tPTkFfV0RUX0RFQlVHPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9rZXlzdG9uZV9kZWZjb25maWcKaW5kZXggYTAxODI0NC4uNDU4MmUxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9rZXlzdG9uZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9rZXlzdG9uZV9kZWZjb25maWcKQEAgLTE0Miw2ICsxNDIsNyBAQAogQ09ORklHX1VTQl9EV0MzX1ZFUkJPU0U9eQogQ09ORklHX0tFWVNUT05FX1VTQl9QSFk9eQogQ09ORklHX0RNQURFVklDRVM9eQorQ09ORklHX1RJX0VETUE9eQogQ09ORklHX0NPTU1PTl9DTEtfREVCVUc9eQogQ09ORklHX01FTU9SWT15CiBDT05GSUdfRVhUNF9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL21zbV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21zbV9kZWZjb25maWcKaW5kZXggMDIxOWM2NS4uYzU4NThiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9tc21fZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXNtX2RlZmNvbmZpZwpAQCAtMTE0LDYgKzExNCwxMCBAQAogQ09ORklHX05FV19MRURTPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1NUQUdJTkc9eQorQ09ORklHX0NPTU1PTl9DTEtfUUNPTT15CitDT05GSUdfTVNNX0dDQ184NjYwPXkKK0NPTkZJR19NU01fTU1DQ184OTYwPXkKK0NPTkZJR19NU01fTU1DQ184OTc0PXkKIENPTkZJR19NU01fSU9NTVU9eQogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDJfRlNfWEFUVFI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92N19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwppbmRleCA2ODdlNGU4Li44NDViYzc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDEyIEBACitDT05GSUdfU1lTVklQQz15CiBDT05GSUdfSVJRX0RPTUFJTl9ERUJVRz15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQogQ09ORklHX0FSQ0hfTVZFQlU9eQogQ09ORklHX01BQ0hfQVJNQURBXzM3MD15CiBDT05GSUdfTUFDSF9BUk1BREFfWFA9eQpAQCAtMzgsNyArNDMsNyBAQAogQ09ORklHX0FSQ0hfVEVHUkFfMnhfU09DPXkKIENPTkZJR19BUkNIX1RFR1JBXzN4X1NPQz15CiBDT05GSUdfQVJDSF9URUdSQV8xMTRfU09DPXkKLUNPTkZJR19URUdSQV9QQ0k9eQorQ09ORklHX0FSQ0hfVEVHUkFfMTI0X1NPQz15CiBDT05GSUdfVEVHUkFfRU1DX1NDQUxJTkdfRU5BQkxFPXkKIENPTkZJR19BUkNIX1U4NTAwPXkKIENPTkZJR19NQUNIX0hSRUZWNjA9eQpAQCAtNDksMTkgKzU0LDU1IEBACiBDT05GSUdfQVJDSF9WSVJUPXkKIENPTkZJR19BUkNIX1dNODg1MD15CiBDT05GSUdfQVJDSF9aWU5RPXkKK0NPTkZJR19UUlVTVEVEX0ZPVU5EQVRJT05TPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9NU0k9eQorQ09ORklHX1BDSV9NVkVCVT15CitDT05GSUdfUENJX1RFR1JBPXkKIENPTkZJR19TTVA9eQogQ09ORklHX0hJR0hQVEU9eQorQ09ORklHX0NNQT15CiBDT05GSUdfQVJNX0FQUEVOREVEX0RUQj15CiBDT05GSUdfQVJNX0FUQUdfRFRCX0NPTVBBVD15CitDT05GSUdfS0VYRUM9eQorQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFM9eQorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5EPXkKK0NPTkZJR19DUFVfSURMRT15CiBDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQogQ09ORklHX0lORVQ9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQorQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQorQ09ORklHX0lORVQ2X0FIPW0KK0NPTkZJR19JTkVUNl9FU1A9bQorQ09ORklHX0lORVQ2X0lQQ09NUD1tCitDT05GSUdfSVBWNl9NSVA2PW0KK0NPTkZJR19JUFY2X1RVTk5FTD1tCitDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0NGRzgwMjExPW0KK0NPTkZJR19NQUM4MDIxMT1tCitDT05GSUdfUkZLSUxMPXkKK0NPTkZJR19SRktJTExfSU5QVVQ9eQorQ09ORklHX1JGS0lMTF9HUElPPXkKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorQ09ORklHX0RNQV9DTUE9eQogQ09ORklHX09NQVBfT0NQMlNDUD15CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfTTI1UDgwPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0lDUzkzMlM0MDE9eQorQ09ORklHX0FQRFM5ODAyQUxTPXkKK0NPTkZJR19JU0wyOTAwMz15CiBDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQkxLX0RFVl9TUj15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQogQ09ORklHX0FUQT15CiBDT05GSUdfU0FUQV9BSENJX1BMQVRGT1JNPXkKIENPTkZJR19TQVRBX0hJR0hCQU5LPXkKQEAgLTY5LDEzICsxMTAsMzAgQEAKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19TVU40SV9FTUFDPXkKIENPTkZJR19ORVRfQ0FMWEVEQV9YR01BQz15CitDT05GSUdfTVZORVRBPXkKIENPTkZJR19LUzg4NTE9eQorQ09ORklHX1I4MTY5PXkKIENPTkZJR19TTVNDOTExWD15CiBDT05GSUdfU1RNTUFDX0VUSD15Ci1DT05GSUdfSUNQTFVTX1BIWT15Ci1DT05GSUdfTURJT19TVU40ST15CiBDT05GSUdfVElfQ1BTVz15CitDT05GSUdfQVQ4MDNYX1BIWT15CitDT05GSUdfTUFSVkVMTF9QSFk9eQorQ09ORklHX0lDUExVU19QSFk9eQorQ09ORklHX1VTQl9QRUdBU1VTPXkKK0NPTkZJR19VU0JfVVNCTkVUPXkKK0NPTkZJR19VU0JfTkVUX1NNU0M3NVhYPXkKK0NPTkZJR19VU0JfTkVUX1NNU0M5NVhYPXkKK0NPTkZJR19CUkNNRk1BQz1tCitDT05GSUdfUlQyWDAwPW0KK0NPTkZJR19SVDI4MDBVU0I9bQorQ09ORklHX0lOUFVUX0VWREVWPXkKK0NPTkZJR19LRVlCT0FSRF9HUElPPXkKK0NPTkZJR19LRVlCT0FSRF9URUdSQT15CiBDT05GSUdfS0VZQk9BUkRfU1BFQVI9eQorQ09ORklHX0tFWUJPQVJEX0NST1NfRUM9eQorQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSD15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfTVBVMzA1MD15CiBDT05GSUdfU0VSSU9fQU1CQUtNST15CiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQpAQCAtOTgsMzAgKzE1Niw4MSBAQAogQ09ORklHX1NFUklBTF9GU0xfTFBVQVJUX0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF9TVF9BU0M9eQogQ09ORklHX1NFUklBTF9TVF9BU0NfQ09OU09MRT15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19NVVg9eQorQ09ORklHX0kyQ19NVVhfUElOQ1RSTD15CiBDT05GSUdfSTJDX0RFU0lHTldBUkVfUExBVEZPUk09eQorQ09ORklHX0kyQ19NVjY0WFhYPXkKIENPTkZJR19JMkNfU0lSRj15CiBDT05GSUdfSTJDX1RFR1JBPXkKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9PTUFQMjRYWD15CitDT05GSUdfU1BJX09SSU9OPXkKIENPTkZJR19TUElfUEwwMjI9eQogQ09ORklHX1NQSV9TSVJGPXkKIENPTkZJR19TUElfVEVHUkExMTQ9eQorQ09ORklHX1NQSV9URUdSQTIwX1NGTEFTSD15CiBDT05GSUdfU1BJX1RFR1JBMjBfU0xJTks9eQotQ09ORklHX1BJTkNUUkxfU0lOR0xFPXkKK0NPTkZJR19QSU5DVFJMX0FTMzcyMj15CitDT05GSUdfUElOQ1RSTF9QQUxNQVM9eQorQ09ORklHX0dQSU9fU1lTRlM9eQogQ09ORklHX0dQSU9fR0VORVJJQ19QTEFURk9STT15CitDT05GSUdfR1BJT19QQ0E5NTNYX0lSUT15CiBDT05GSUdfR1BJT19UV0w0MDMwPXkKLUNPTkZJR19SRUdVTEFUT1JfR1BJTz15CitDT05GSUdfR1BJT19QQUxNQVM9eQorQ09ORklHX0dQSU9fVFBTNjU4Nlg9eQorQ09ORklHX0dQSU9fVFBTNjU5MTA9eQorQ09ORklHX0JBVFRFUllfU0JTPXkKK0NPTkZJR19DSEFSR0VSX1RQUzY1MDkwPXkKK0NPTkZJR19QT1dFUl9SRVNFVF9BUzM3MjI9eQorQ09ORklHX1BPV0VSX1JFU0VUX0dQSU89eQorQ09ORklHX1NFTlNPUlNfTE05MD15CitDT05GSUdfVEhFUk1BTD15CitDT05GSUdfQVJNQURBX1RIRVJNQUw9eQorQ09ORklHX01GRF9BUzM3MjI9eQorQ09ORklHX01GRF9DUk9TX0VDPXkKK0NPTkZJR19NRkRfQ1JPU19FQ19TUEk9eQorQ09ORklHX01GRF9NQVg4OTA3PXkKK0NPTkZJR19NRkRfUEFMTUFTPXkKK0NPTkZJR19NRkRfVFBTNjUwOTA9eQorQ09ORklHX01GRF9UUFM2NTg2WD15CitDT05GSUdfTUZEX1RQUzY1OTEwPXkKK0NPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUj15CiBDT05GSUdfUkVHVUxBVE9SX0FCODUwMD15CitDT05GSUdfUkVHVUxBVE9SX0FTMzcyMj15CitDT05GSUdfUkVHVUxBVE9SX0dQSU89eQorQ09ORklHX1JFR1VMQVRPUl9NQVg4OTA3PXkKK0NPTkZJR19SRUdVTEFUT1JfUEFMTUFTPXkKIENPTkZJR19SRUdVTEFUT1JfVFBTNTE2MzI9eQogQ09ORklHX1JFR1VMQVRPUl9UUFM2MjM2MD15CitDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDkwPXkKK0NPTkZJR19SRUdVTEFUT1JfVFBTNjU4Nlg9eQorQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMD15CiBDT05GSUdfUkVHVUxBVE9SX1RXTDQwMzA9eQogQ09ORklHX1JFR1VMQVRPUl9WRVhQUkVTUz15CitDT05GSUdfTUVESUFfU1VQUE9SVD15CitDT05GSUdfTUVESUFfQ0FNRVJBX1NVUFBPUlQ9eQorQ09ORklHX01FRElBX1VTQl9TVVBQT1JUPXkKIENPTkZJR19EUk09eQotQ09ORklHX1RFR1JBX0hPU1QxWD15CiBDT05GSUdfRFJNX1RFR1JBPXkKK0NPTkZJR19EUk1fUEFORUxfU0lNUExFPXkKIENPTkZJR19GQl9BUk1DTENEPXkKIENPTkZJR19GQl9XTTg1MDU9eQogQ09ORklHX0ZCX1NJTVBMRT15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfUFdNPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfU09DX1RFR1JBPXkKK0NPTkZJR19TTkRfU09DX1RFR1JBX1JUNTY0MD15CitDT05GSUdfU05EX1NPQ19URUdSQV9XTTg3NTM9eQorQ09ORklHX1NORF9TT0NfVEVHUkFfV004OTAzPXkKK0NPTkZJR19TTkRfU09DX1RFR1JBX1RSSU1TTElDRT15CitDT05GSUdfU05EX1NPQ19URUdSQV9BTEM1NjMyPXkKK0NPTkZJR19TTkRfU09DX1RFR1JBX01BWDk4MDkwPXkKIENPTkZJR19VU0I9eQogQ09ORklHX1VTQl9YSENJX0hDRD15CiBDT05GSUdfVVNCX0VIQ0lfSENEPXkKQEAgLTEzMiw4ICsyNDEsNiBAQAogQ09ORklHX1VTQl9DSElQSURFQT15CiBDT05GSUdfVVNCX0NISVBJREVBX0hPU1Q9eQogQ09ORklHX0FCODUwMF9VU0I9eQotQ09ORklHX05PUF9VU0JfWENFSVY9eQotQ09ORklHX09NQVBfVVNCMj15CiBDT05GSUdfT01BUF9VU0IzPXkKIENPTkZJR19TQU1TVU5HX1VTQjJQSFk9eQogQ09ORklHX1NBTVNVTkdfVVNCM1BIWT15CkBAIC0xNDQsMjQgKzI1MSwzMiBAQAogQ09ORklHX01NQ19CTE9DS19NSU5PUlM9MTYKIENPTkZJR19NTUNfQVJNTU1DST15CiBDT05GSUdfTU1DX1NESENJPXkKLUNPTkZJR19NTUNfU0RIQ0lfUExURk09eQogQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVg9eQogQ09ORklHX01NQ19TREhDSV9URUdSQT15CiBDT05GSUdfTU1DX1NESENJX1NQRUFSPXkKIENPTkZJR19NTUNfU0RIQ0lfQkNNX0tPTkE9eQogQ09ORklHX01NQ19PTUFQPXkKIENPTkZJR19NTUNfT01BUF9IUz15CitDT05GSUdfTU1DX01WU0RJTz15CiBDT05GSUdfRURBQz15CiBDT05GSUdfRURBQ19NTV9FREFDPXkKIENPTkZJR19FREFDX0hJR0hCQU5LX01DPXkKIENPTkZJR19FREFDX0hJR0hCQU5LX0wyPXkKIENPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQVMzNzIyPXkKK0NPTkZJR19SVENfRFJWX01BWDg5MDc9eQorQ09ORklHX1JUQ19EUlZfUEFMTUFTPXkKIENPTkZJR19SVENfRFJWX1RXTDQwMzA9eQorQ09ORklHX1JUQ19EUlZfVFBTNjU4Nlg9eQorQ09ORklHX1JUQ19EUlZfVFBTNjU5MTA9eQorQ09ORklHX1JUQ19EUlZfRU0zMDI3PXkKIENPTkZJR19SVENfRFJWX1BMMDMxPXkKIENPTkZJR19SVENfRFJWX1ZUODUwMD15CitDT05GSUdfUlRDX0RSVl9NVj15CiBDT05GSUdfUlRDX0RSVl9URUdSQT15CiBDT05GSUdfRE1BREVWSUNFUz15CiBDT05GSUdfRFdfRE1BQz15CitDT05GSUdfTVZfWE9SPXkKIENPTkZJR19URUdSQTIwX0FQQl9ETUE9eQogQ09ORklHX1NURV9ETUE0MD15CiBDT05GSUdfU0lSRl9ETUE9eQpAQCAtMTcxLDE1ICsyODYsMzQgQEAKIENPTkZJR19JTVhfRE1BPXkKIENPTkZJR19NWFNfRE1BPXkKIENPTkZJR19ETUFfT01BUD15CitDT05GSUdfU1RBR0lORz15CitDT05GSUdfU0VOU09SU19JU0wyOTAxOD15CitDT05GSUdfU0VOU09SU19JU0wyOTAyOD15CitDT05GSUdfTUZEX05WRUM9eQorQ09ORklHX0tFWUJPQVJEX05WRUM9eQorQ09ORklHX1NFUklPX05WRUNfUFMyPXkKK0NPTkZJR19OVkVDX1BPV0VSPXkKK0NPTkZJR19URUdSQV9JT01NVV9HQVJUPXkKK0NPTkZJR19URUdSQV9JT01NVV9TTU1VPXkKK0NPTkZJR19NRU1PUlk9eQorQ09ORklHX0lJTz15CitDT05GSUdfQUs4OTc1PXkKIENPTkZJR19QV009eQorQ09ORklHX1BXTV9URUdSQT15CiBDT05GSUdfUFdNX1ZUODUwMD15CitDT05GSUdfT01BUF9VU0IyPXkKIENPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKIENPTkZJR19UTVBGUz15CitDT05GSUdfU1FVQVNIRlM9eQorQ09ORklHX1NRVUFTSEZTX0xaTz15CitDT05GSUdfU1FVQVNIRlNfWFo9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzX0FDTD15CiBDT05GSUdfTkZTX1Y0PXkKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfUFJJTlRLX1RJTUU9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19MT0NLVVBfREVURUNUT1I9eQorQ09ORklHX0NSWVBUT19ERVZfVEVHUkFfQUVTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdGVncmFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKaW5kZXggNWZkYzlhMC4uMDBmZTllOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKQEAgLTI5LDExICsyOSwxMSBAQAogQ09ORklHX0FSQ0hfVEVHUkFfMTE0X1NPQz15CiBDT05GSUdfQVJDSF9URUdSQV8xMjRfU09DPXkKIENPTkZJR19URUdSQV9FTUNfU0NBTElOR19FTkFCTEU9eQorQ09ORklHX1RSVVNURURfRk9VTkRBVElPTlM9eQogQ09ORklHX1BDST15CiBDT05GSUdfUENJX01TST15CiBDT05GSUdfUENJX1RFR1JBPXkKIENPTkZJR19QQ0lFUE9SVEJVUz15Ci1DT05GSUdfVFJVU1RFRF9GT1VOREFUSU9OUz15CiBDT05GSUdfU01QPXkKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19BRUFCST15CkBAIC0xMjUsNyArMTI1LDYgQEAKIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19DT01QQVQgaXMgbm90IHNldAotQ09ORklHX0kyQ19NVVg9eQogQ09ORklHX0kyQ19NVVhfUElOQ1RSTD15CiBDT05GSUdfSTJDX1RFR1JBPXkKIENPTkZJR19TUEk9eQpAQCAtMTY5LDkgKzE2OCw4IEBACiBDT05GSUdfTUVESUFfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9WSURFT19DTEFTUz1tCiBDT05GSUdfRFJNPXkKLUNPTkZJR19EUk1fUEFORUw9eQotQ09ORklHX0RSTV9QQU5FTF9TSU1QTEU9eQogQ09ORklHX0RSTV9URUdSQT15CitDT05GSUdfRFJNX1BBTkVMX1NJTVBMRT15CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKICMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQpAQCAtMjA2LDEwICsyMDQsNyBAQAogQ09ORklHX01NQ19TREhDST15CiBDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKIENPTkZJR19NTUNfU0RIQ0lfVEVHUkE9eQotQ09ORklHX05FV19MRURTPXkKLUNPTkZJR19MRURTX0NMQVNTPXkKIENPTkZJR19MRURTX0dQSU89eQotQ09ORklHX0xFRFNfVFJJR0dFUlM9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CiBDT05GSUdfTEVEU19UUklHR0VSX09ORVNIT1Q9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQpAQCAtMjM1LDcgKzIzMCw2IEBACiBDT05GSUdfU0VSSU9fTlZFQ19QUzI9eQogQ09ORklHX05WRUNfUE9XRVI9eQogQ09ORklHX05WRUNfUEFaMDA9eQotQ09ORklHX0NPTU1PTl9DTEtfREVCVUc9eQogQ09ORklHX1RFR1JBX0lPTU1VX0dBUlQ9eQogQ09ORklHX1RFR1JBX0lPTU1VX1NNTVU9eQogQ09ORklHX01FTU9SWT15CkBAIC0yNjUsNiArMjU5LDcgQEAKIENPTkZJR19OTFNfSVNPODg1OV8xPXkKIENPTkZJR19QUklOVEtfVElNRT15CiBDT05GSUdfREVCVUdfSU5GTz15CitDT05GSUdfREVCVUdfRlM9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19ERUJVR19TTEFCPXkKIENPTkZJR19ERUJVR19WTT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaAppbmRleCBmYmViMzljLi44YWE0Y2NhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTM4LDYgKzM4LDEyIEBACiAjZGVmaW5lIGlzYV9idXNfdG9fdmlydCBwaHlzX3RvX3ZpcnQKIAogLyoKKyAqIEF0b21pYyBNTUlPLXdpZGUgSU8gbW9kaWZ5CisgKi8KK2V4dGVybiB2b2lkIGF0b21pY19pb19tb2RpZnkodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgc2V0KTsKK2V4dGVybiB2b2lkIGF0b21pY19pb19tb2RpZnlfcmVsYXhlZCh2b2lkIF9faW9tZW0gKnJlZywgdTMyIG1hc2ssIHUzMiBzZXQpOworCisvKgogICogR2VuZXJpYyBJTyByZWFkL3dyaXRlLiAgVGhlc2UgcGVyZm9ybSBuYXRpdmUtZW5kaWFuIGFjY2Vzc2VzLiAgTm90ZQogICogdGhhdCBzb21lIGFyY2hpdGVjdHVyZXMgd2lsbCB3YW50IHRvIHJlLWRlZmluZSBfX3Jhd197cmVhZCx3cml0ZX13LgogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBiM2ZiOGM5Li4xODc5ZThkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTQ1MSw5ICs0NTEsMTEgQEAKIAkuYXJjaAlhcm12NnQyCiAjZW5kaWYKIDI6CWxkcmh0CXI1LCBbcjRdCitBUk1fQkU4KHJldjE2CXI1LCByNSkJCQkJQCBsaXR0bGUgZW5kaWFuIGluc3RydWN0aW9uCiAJY21wCXI1LCAjMHhlODAwCQkJQCAzMmJpdCBpbnN0cnVjdGlvbiBpZiB4eCAhPSAwCiAJYmxvCV9fdW5kX3Vzcl9mYXVsdF8xNgkJQCAxNmJpdCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24KIDM6CWxkcmh0CXIwLCBbcjJdCitBUk1fQkU4KHJldjE2CXIwLCByMCkJCQkJQCBsaXR0bGUgZW5kaWFuIGluc3RydWN0aW9uCiAJYWRkCXIyLCByMiwgIzIJCQlAIHIyIGlzIFBDICsgMiwgbWFrZSBpdCBQQyArIDQKIAlzdHIJcjIsIFtzcCwgI1NfUENdCQkJQCBpdCdzIGEgMngxNmJpdCBpbnN0ciwgdXBkYXRlCiAJb3JyCXIwLCByMCwgcjUsIGxzbCAjMTYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCmluZGV4IDMyZjMxN2UuLjkxNDYxNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtNTIsNyArNTIsOCBAQAogCS5lcXUJc3dhcHBlcl9wZ19kaXIsIEtFUk5FTF9SQU1fVkFERFIgLSBQR19ESVJfU0laRQogCiAJLm1hY3JvCXBndGJsLCByZCwgcGh5cwotCWFkZAlccmQsIFxwaHlzLCAjVEVYVF9PRkZTRVQgLSBQR19ESVJfU0laRQorCWFkZAlccmQsIFxwaHlzLCAjVEVYVF9PRkZTRVQKKwlzdWIJXHJkLCBccmQsICNQR19ESVJfU0laRQogCS5lbmRtCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaW8uYyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCmluZGV4IGRjZDViNGQuLjkyMDNjZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pby5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCkBAIC0xLDYgKzEsNDEgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soX19pb19sb2NrKTsKKworLyoKKyAqIEdlbmVyaWMgYXRvbWljIE1NSU8gbW9kaWZ5LgorICoKKyAqIEFsbG93cyB0aHJlYWQtc2FmZSBhY2Nlc3MgdG8gcmVnaXN0ZXJzIHNoYXJlZCBieSB1bnJlbGF0ZWQgc3Vic3lzdGVtcy4KKyAqIFRoZSBhY2Nlc3MgaXMgcHJvdGVjdGVkIGJ5IGEgc2luZ2xlIE1NSU8td2lkZSBsb2NrLgorICovCit2b2lkIGF0b21pY19pb19tb2RpZnlfcmVsYXhlZCh2b2lkIF9faW9tZW0gKnJlZywgdTMyIG1hc2ssIHUzMiBzZXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsdWU7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJl9faW9fbG9jaywgZmxhZ3MpOworCXZhbHVlID0gcmVhZGxfcmVsYXhlZChyZWcpICYgfm1hc2s7CisJdmFsdWUgfD0gKHNldCAmIG1hc2spOworCXdyaXRlbF9yZWxheGVkKHZhbHVlLCByZWcpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2lvX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYXRvbWljX2lvX21vZGlmeV9yZWxheGVkKTsKKwordm9pZCBhdG9taWNfaW9fbW9kaWZ5KHZvaWQgX19pb21lbSAqcmVnLCB1MzIgbWFzaywgdTMyIHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWx1ZTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmX19pb19sb2NrLCBmbGFncyk7CisJdmFsdWUgPSByZWFkbF9yZWxheGVkKHJlZykgJiB+bWFzazsKKwl2YWx1ZSB8PSAoc2V0ICYgbWFzayk7CisJd3JpdGVsKHZhbHVlLCByZWcpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2lvX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYXRvbWljX2lvX21vZGlmeSk7CiAKIC8qCiAgKiBDb3B5IGRhdGEgZnJvbSBJTyBtZW1vcnkgc3BhY2UgdG8gInJlYWwiIG1lbW9yeSBzcGFjZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlzaS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1oaXNpL0tjb25maWcKaW5kZXggMDE4YWQ2Ny4uOGY0NjQ5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oaXNpL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1oaXNpL0tjb25maWcKQEAgLTEyLDYgKzEyLDUgQEAKIAlzZWxlY3QgSEFWRV9TTVAKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBQSU5DVFJMX1NJTkdMRQotCXNlbGVjdCBTTVAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBIaXNpbGljb24gSGkzNnh4L0hpMzd4eCBwcm9jZXNzb3IgZmFtaWx5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMKaW5kZXggZDJlYTZlNi4uNzZlNWRiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2cS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnEuYwpAQCAtMTMzLDYgKzEzMywzOSBAQAogCiAjZGVmaW5lIFBIWV9JRF9BUjgwMzEJMHgwMDRkZDA3NAogCitzdGF0aWMgaW50IGFyODAzNV9waHlfZml4dXAoc3RydWN0IHBoeV9kZXZpY2UgKmRldikKK3sKKwl1MTYgdmFsOworCisJLyogQXI4MDN4IHBoeSBTbWFydEVFRSBmZWF0dXJlIGNhdXNlIGxpbmsgc3RhdHVzIGdlbmVyYXRlcyBnbGl0Y2gsCisJICogd2hpY2ggY2F1c2UgZXRoZXJuZXQgbGluayBkb3duL3VwIGlzc3VlLCBzbyBkaXNhYmxlIFNtYXJ0RUVFCisJICovCisJcGh5X3dyaXRlKGRldiwgMHhkLCAweDMpOworCXBoeV93cml0ZShkZXYsIDB4ZSwgMHg4MDVkKTsKKwlwaHlfd3JpdGUoZGV2LCAweGQsIDB4NDAwMyk7CisKKwl2YWwgPSBwaHlfcmVhZChkZXYsIDB4ZSk7CisJcGh5X3dyaXRlKGRldiwgMHhlLCB2YWwgJiB+KDEgPDwgOCkpOworCisJLyoKKwkgKiBFbmFibGUgMTI1TUh6IGNsb2NrIGZyb20gQ0xLXzI1TSBvbiB0aGUgQVI4MDMxLiAgVGhpcworCSAqIGlzIGZlZCBpbiB0byB0aGUgSU1YNiBvbiB0aGUgRU5FVF9SRUZfQ0xLIChWMjIpIHBhZC4KKwkgKiBBbHNvLCBpbnRyb2R1Y2UgYSB0eCBjbG9jayBkZWxheS4KKwkgKgorCSAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgaXMgdGhlIEFSODAzMSBmaXh1cC4KKwkgKi8KKwlhcjgwMzFfcGh5X2ZpeHVwKGRldik7CisKKwkvKmNoZWNrIHBoeSBwb3dlciovCisJdmFsID0gcGh5X3JlYWQoZGV2LCAweDApOworCWlmICh2YWwgJiBCTUNSX1BET1dOKQorCQlwaHlfd3JpdGUoZGV2LCAweDAsIHZhbCAmIH5CTUNSX1BET1dOKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBIWV9JRF9BUjgwMzUgMHgwMDRkZDA3MgorCiBzdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfZW5ldF9waHlfaW5pdCh2b2lkKQogewogCWlmIChJU19CVUlMVElOKENPTkZJR19QSFlMSUIpKSB7CkBAIC0xNDIsNiArMTc1LDggQEAKIAkJCQlrc3o5MDMxcm5fcGh5X2ZpeHVwKTsKIAkJcGh5X3JlZ2lzdGVyX2ZpeHVwX2Zvcl91aWQoUEhZX0lEX0FSODAzMSwgMHhmZmZmZmZmZiwKIAkJCQlhcjgwMzFfcGh5X2ZpeHVwKTsKKwkJcGh5X3JlZ2lzdGVyX2ZpeHVwX2Zvcl91aWQoUEhZX0lEX0FSODAzNSwgMHhmZmZmZmZlZiwKKwkJCQlhcjgwMzVfcGh5X2ZpeHVwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDVlODQxNDkuLmEzZWY5NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNjQsNiArNjQsNyBAQAogCiAvKgogICogTG9naWNhbCAgICAgIFBoeXNpY2FsCisgKiBmMTAwMDAwMAkxMDAwMDAwMAlDb3JlIG1vZHVsZSByZWdpc3RlcnMKICAqIGYxMzAwMDAwCTEzMDAwMDAwCUNvdW50ZXIvVGltZXIKICAqIGYxNDAwMDAwCTE0MDAwMDAwCUludGVycnVwdCBjb250cm9sbGVyCiAgKiBmMTYwMDAwMAkxNjAwMDAwMAlVQVJUIDAKQEAgLTc1LDYgKzc2LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW50Y3BfaW9fZGVzY1tdIF9faW5pdGRhdGEgX19tYXliZV91bnVzZWQgPSB7CiAJeworCQkudmlydHVhbAk9IElPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJTlRFR1JBVE9SX0hEUl9CQVNFKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwgewogCQkudmlydHVhbAk9IElPX0FERFJFU1MoSU5URUdSQVRPUl9DVF9CQVNFKSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElOVEVHUkFUT1JfQ1RfQkFTRSksCiAJCS5sZW5ndGgJCT0gU1pfNEssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCmluZGV4IDE3N2NkMDcuLjc3ZTFmZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC0xNzYsMTIgKzE3NywzNiBAQAogCS5yZXNvdXJjZQk9ICZlbTcyMTBfdWFydF9yZXNvdXJjZSwKIH07CiAKKyNkZWZpbmUgRU03MjEwX0hBUkRXQVJFX1BPV0VSIDAKKwogdm9pZCBlbTcyMTBfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JKklPUDNYWF9HUE9FICY9IDB4ZmU7Ci0JKklPUDNYWF9HUE9EIHw9IDB4MDE7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChFTTcyMTBfSEFSRFdBUkVfUE9XRVIsIDEpOworCWlmIChyZXQpCisJCXByX2NyaXQoImNvdWxkIG5vdCBkcml2ZSBwb3dlciBvZmYgR1BJTyBoaWdoXG4iKTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgZW03MjEwX3JlcXVlc3RfZ3Bpb3Modm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtYWNoaW5lX2lzX2VtNzIxMCgpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChFTTcyMTBfSEFSRFdBUkVfUE9XRVIsICJwb3dlciIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJjb3VsZCBub3QgcmVxdWVzdCBwb3dlciBvZmYgR1BJT1xuIik7CisJCXJldHVybiAwOworCX0KKworCXBtX3Bvd2VyX29mZiA9IGVtNzIxMF9wb3dlcl9vZmY7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChlbTcyMTBfcmVxdWVzdF9ncGlvcyk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBlbTcyMTBfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJcmVnaXN0ZXJfaW9wMzJ4X2dwaW8oKTsKQEAgLTE5NCw5ICsyMTksNiBAQAogCiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgZW03MjEwX2kyY19kZXZpY2VzLAogCQlBUlJBWV9TSVpFKGVtNzIxMF9pMmNfZGV2aWNlcykpOwotCi0KLQlwbV9wb3dlcl9vZmYgPSBlbTcyMTBfcG93ZXJfb2ZmOwogfQogCiBNQUNISU5FX1NUQVJUKEVNNzIxMCwgIkxhbm5lciBFTTcyMTAiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnCmluZGV4IGRhYmM1ZWUuLjkwYTcwOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2V5c3RvbmUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWtleXN0b25lL0tjb25maWcKQEAgLTEwLDcgKzEwLDYgQEAKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgQVJNX0VSUkFUQV83OTgxODEgaWYgU01QCiAJc2VsZWN0IENPTU1PTl9DTEtfS0VZU1RPTkUKLQlzZWxlY3QgVElfRURNQQogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgWk9ORV9ETUEgaWYgQVJNX0xQQUUKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BtLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BtLmMKaW5kZXggODc4M2E3MS4uYzZhYjhkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcG0uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvYnJpZGdlLXJlZ3MuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKIAogc3RhdGljIHZvaWQgX19pb21lbSAqZGRyX29wZXJhdGlvbl9iYXNlOwogCkBAIC02NSw5ICs2Niw4IEBACiAJLnZhbGlkID0ga2lya3dvb2RfcG1fdmFsaWRfc3RhbmRieSwKIH07CiAKLWludCBfX2luaXQga2lya3dvb2RfcG1faW5pdCh2b2lkKQordm9pZCBfX2luaXQga2lya3dvb2RfcG1faW5pdCh2b2lkKQogewogCWRkcl9vcGVyYXRpb25fYmFzZSA9IGlvcmVtYXAoRERSX09QRVJBVElPTl9CQVNFLCA0KTsKIAlzdXNwZW5kX3NldF9vcHMoJmtpcmt3b29kX3N1c3BlbmRfb3BzKTsKLQlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXZlYnUvbXZlYnUtc29jLWlkLmMgYi9hcmNoL2FybS9tYWNoLW12ZWJ1L212ZWJ1LXNvYy1pZC5jCmluZGV4IGZlNGZjMWMuLmYzYjMyNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXZlYnUvbXZlYnUtc29jLWlkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdmVidS9tdmVidS1zb2MtaWQuYwpAQCAtODgsNyArODgsNyBAQAogCX0KIAogCXBjaV9iYXNlID0gb2ZfaW9tYXAoY2hpbGQsIDApOwotCWlmIChJU19FUlIocGNpX2Jhc2UpKSB7CisJaWYgKHBjaV9iYXNlID09IE5VTEwpIHsKIAkJcHJfZXJyKCJjYW5ub3QgbWFwIHJlZ2lzdGVyc1xuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gcmVzX2lvcmVtYXA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IGYwOTNhZjEuLjg3NjBiYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC03NjAsNyArNzYwLDE0IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2k0NzEzX3N1cHBseV9uYW1lc1tdID0geworCSJ2aW8iLAorCSJ2ZGQiLAorfTsKKwogc3RhdGljIHN0cnVjdCBzaTQ3MTNfcGxhdGZvcm1fZGF0YSByeDUxX3NpNDcxM19pMmNfZGF0YSBfX2luaXRkYXRhX29yX21vZHVsZSA9IHsKKwkuc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHNpNDcxM19zdXBwbHlfbmFtZXMpLAorCS5zdXBwbHlfbmFtZXMJPSBzaTQ3MTNfc3VwcGx5X25hbWVzLAogCS5ncGlvX3Jlc2V0CT0gUlg1MV9GTVRYX1JFU0VUX0dQSU8sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24uaAppbmRleCBlNTE1Mjc4Li5hNmFhZTMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLmgKQEAgLTYyLDExICs2MiwxNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDQpCiBpbnQgb21hcDRfcG1faW5pdCh2b2lkKTsKK2ludCBvbWFwNF9wbV9pbml0X2Vhcmx5KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IG9tYXA0X3BtX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgb21hcDRfcG1faW5pdF9lYXJseSh2b2lkKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfT01BUF9NVVgKQEAgLTIzNiw2ICsyNDIsNyBAQAogCiBleHRlcm4gdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2ljX2Rpc3RfZGlzYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGdpY19kaXN0X2VuYWJsZSh2b2lkKTsKIGV4dGVybiBib29sIGdpY19kaXN0X2Rpc2FibGVkKHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2ljX3RpbWVyX3JldHJpZ2dlcih2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXBfc21jMSh1MzIgZm4sIHUzMiBhcmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlNDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlNDR4eC5jCmluZGV4IDRjODk4MmEuLjRjMTU4YzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY3B1aWRsZTQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGU0NHh4LmMKQEAgLTgwLDYgKzgwLDcgQEAKIAkJCWludCBpbmRleCkKIHsKIAlzdHJ1Y3QgaWRsZV9zdGF0ZWRhdGEgKmN4ID0gc3RhdGVfcHRyICsgaW5kZXg7CisJdTMyIG1wdXNzX2Nhbl9sb3NlX2NvbnRleHQgPSAwOwogCiAJLyoKIAkgKiBDUFUwIGhhcyB0byB3YWl0IGFuZCBzdGF5IE9OIHVudGlsIENQVTEgaXMgT0ZGIHN0YXRlLgpAQCAtMTA0LDYgKzEwNSw5IEBACiAJCX0KIAl9CiAKKwltcHVzc19jYW5fbG9zZV9jb250ZXh0ID0gKGN4LT5tcHVfc3RhdGUgPT0gUFdSRE1fUE9XRVJfUkVUKSAmJgorCQkJCSAoY3gtPm1wdV9sb2dpY19zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpOworCiAJLyoKIAkgKiBDYWxsIGlkbGUgQ1BVIFBNIGVudGVyIG5vdGlmaWVyIGNoYWluIHNvIHRoYXQKIAkgKiBWRlAgYW5kIHBlciBDUFUgaW50ZXJydXB0IGNvbnRleHQgaXMgc2F2ZWQuCkBAIC0xMTgsOSArMTIyLDggQEAKIAkJICogQ2FsbCBpZGxlIENQVSBjbHVzdGVyIFBNIGVudGVyIG5vdGlmaWVyIGNoYWluCiAJCSAqIHRvIHNhdmUgR0lDIGFuZCB3YWtldXBnZW4gY29udGV4dC4KIAkJICovCi0JCWlmICgoY3gtPm1wdV9zdGF0ZSA9PSBQV1JETV9QT1dFUl9SRVQpICYmCi0JCQkoY3gtPm1wdV9sb2dpY19zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpKQotCQkJCWNwdV9jbHVzdGVyX3BtX2VudGVyKCk7CisJCWlmIChtcHVzc19jYW5fbG9zZV9jb250ZXh0KQorCQkJY3B1X2NsdXN0ZXJfcG1fZW50ZXIoKTsKIAl9CiAKIAlvbWFwNF9lbnRlcl9sb3dwb3dlcihkZXYtPmNwdSwgY3gtPmNwdV9zdGF0ZSk7CkBAIC0xMjgsOSArMTMxLDIzIEBACiAKIAkvKiBXYWtldXAgQ1BVMSBvbmx5IGlmIGl0IGlzIG5vdCBvZmZsaW5lZCAqLwogCWlmIChkZXYtPmNwdSA9PSAwICYmIGNwdW1hc2tfdGVzdF9jcHUoMSwgY3B1X29ubGluZV9tYXNrKSkgeworCisJCWlmIChJU19QTTQ0WFhfRVJSQVRVTShQTV9PTUFQNF9ST01fU01QX0JPT1RfRVJSQVRVTV9HSUNEKSAmJgorCQkgICAgbXB1c3NfY2FuX2xvc2VfY29udGV4dCkKKwkJCWdpY19kaXN0X2Rpc2FibGUoKTsKKwogCQljbGtkbV93YWtldXAoY3B1X2Nsa2RtWzFdKTsKIAkJb21hcF9zZXRfcHdyZG1fc3RhdGUoY3B1X3BkWzFdLCBQV1JETV9QT1dFUl9PTik7CiAJCWNsa2RtX2FsbG93X2lkbGUoY3B1X2Nsa2RtWzFdKTsKKworCQlpZiAoSVNfUE00NFhYX0VSUkFUVU0oUE1fT01BUDRfUk9NX1NNUF9CT09UX0VSUkFUVU1fR0lDRCkgJiYKKwkJICAgIG1wdXNzX2Nhbl9sb3NlX2NvbnRleHQpIHsKKwkJCXdoaWxlIChnaWNfZGlzdF9kaXNhYmxlZCgpKSB7CisJCQkJdWRlbGF5KDEpOworCQkJCWNwdV9yZWxheCgpOworCQkJfQorCQkJZ2ljX3RpbWVyX3JldHJpZ2dlcigpOworCQl9CiAJfQogCiAJLyoKQEAgLTE0Myw4ICsxNjAsNyBAQAogCSAqIENhbGwgaWRsZSBDUFUgY2x1c3RlciBQTSBleGl0IG5vdGlmaWVyIGNoYWluCiAJICogdG8gcmVzdG9yZSBHSUMgYW5kIHdha2V1cGdlbiBjb250ZXh0LgogCSAqLwotCWlmIChkZXYtPmNwdSA9PSAwICYmIChjeC0+bXB1X3N0YXRlID09IFBXUkRNX1BPV0VSX1JFVCkgJiYKLQkJKGN4LT5tcHVfbG9naWNfc3RhdGUgPT0gUFdSRE1fUE9XRVJfT0ZGKSkKKwlpZiAoZGV2LT5jcHUgPT0gMCAmJiBtcHVzc19jYW5fbG9zZV9jb250ZXh0KQogCQljcHVfY2x1c3Rlcl9wbV9leGl0KCk7CiAKIGZhaWw6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKaW5kZXggNDczODFmZC4uZDQwOGIxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYwpAQCAtNjQxLDYgKzY0MSw3IEBACiAJb21hcF9jbV9iYXNlX2luaXQoKTsKIAlvbWFwNHh4eF9jaGVja19yZXZpc2lvbigpOwogCW9tYXA0eHh4X2NoZWNrX2ZlYXR1cmVzKCk7CisJb21hcDRfcG1faW5pdF9lYXJseSgpOwogCW9tYXA0NHh4X3BybV9pbml0KCk7CiAJb21hcDQ0eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCgpOwogCW9tYXA0NHh4X3Bvd2VyZG9tYWluc19pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtbXB1c3MtbG93cG93ZXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1tcHVzcy1sb3dwb3dlci5jCmluZGV4IGY5OTEwMTYuLjY2NzkxNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1tcHVzcy1sb3dwb3dlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1tcHVzcy1sb3dwb3dlci5jCkBAIC0yNzEsNiArMjcxLDkgQEAKIAllbHNlCiAJCW9tYXBfcG1fb3BzLmZpbmlzaF9zdXNwZW5kKHNhdmVfc3RhdGUpOwogCisJaWYgKElTX1BNNDRYWF9FUlJBVFVNKFBNX09NQVA0X1JPTV9TTVBfQk9PVF9FUlJBVFVNX0dJQ0QpICYmIGNwdSkKKwkJZ2ljX2Rpc3RfZW5hYmxlKCk7CisKIAkvKgogCSAqIFJlc3RvcmUgdGhlIENQVXggcG93ZXIgc3RhdGUgdG8gT04gb3RoZXJ3aXNlIENQVXgKIAkgKiBwb3dlciBkb21haW4gY2FuIHRyYW5zaXRpb25zIHRvIHByb2dyYW1tZWQgbG93IHBvd2VyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMKaW5kZXggNzVlOTVkNC4uMTc1NTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYwpAQCAtMzksOCArMzksNiBAQAogCiAjZGVmaW5lIE9NQVA1X0NPUkVfQ09VTlQJMHgyCiAKLXUxNiBwbTQ0eHhfZXJyYXRhOwotCiAvKiBTQ1UgYmFzZSBhZGRyZXNzICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpzY3VfYmFzZTsKIApAQCAtMjE3LDEwICsyMTUsOCBAQAogCWlmIChzY3VfYmFzZSkKIAkJc2N1X2VuYWJsZShzY3VfYmFzZSk7CiAKLQlpZiAoY3B1X2lzX29tYXA0NDZ4KCkpIHsKKwlpZiAoY3B1X2lzX29tYXA0NDZ4KCkpCiAJCXN0YXJ0dXBfYWRkciA9IG9tYXA0NDYwX3NlY29uZGFyeV9zdGFydHVwOwotCQlwbTQ0eHhfZXJyYXRhIHw9IFBNX09NQVA0X1JPTV9TTVBfQk9PVF9FUlJBVFVNX0dJQ0Q7Ci0JfQogCiAJLyoKIAkgKiBXcml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCByb3V0aW5lIGludG8gdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXA0LWNvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwNC1jb21tb24uYwppbmRleCBkZDg5M2VjLi42Y2QzZjM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXA0LWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcDQtY29tbW9uLmMKQEAgLTEyNyw2ICsxMjcsMTIgQEAKIAkJX19yYXdfd3JpdGVsKDB4MCwgZ2ljX2Rpc3RfYmFzZV9hZGRyICsgR0lDX0RJU1RfQ1RSTCk7CiB9CiAKK3ZvaWQgZ2ljX2Rpc3RfZW5hYmxlKHZvaWQpCit7CisJaWYgKGdpY19kaXN0X2Jhc2VfYWRkcikKKwkJX19yYXdfd3JpdGVsKDB4MSwgZ2ljX2Rpc3RfYmFzZV9hZGRyICsgR0lDX0RJU1RfQ1RSTCk7Cit9CisKIGJvb2wgZ2ljX2Rpc3RfZGlzYWJsZWQodm9pZCkKIHsKIAlyZXR1cm4gIShfX3Jhd19yZWFkbChnaWNfZGlzdF9iYXNlX2FkZHIgKyBHSUNfRElTVF9DVFJMKSAmIDB4MSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTQ0eHguYwppbmRleCA4MmYwNjk4OS4uZWVmYjMwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSAicG93ZXJkb21haW4uaCIKICNpbmNsdWRlICJwbS5oIgogCit1MTYgcG00NHh4X2VycmF0YTsKKwogc3RydWN0IHBvd2VyX3N0YXRlIHsKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtOwogCXUzMiBuZXh0X3N0YXRlOwpAQCAtMTk5LDYgKzIwMSwxOSBAQAogfQogCiAvKioKKyAqIG9tYXA0X3BtX2luaXRfZWFybHkgLSBEb2VzIGVhcmx5IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3IgT01BUDQrIGRldmljZXMKKyAqCisgKiBJbml0aWFsaXplcyBiYXNpYyBzdHVmZiBmb3IgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5LgorICovCitpbnQgX19pbml0IG9tYXA0X3BtX2luaXRfZWFybHkodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXA0NDZ4KCkpCisJCXBtNDR4eF9lcnJhdGEgfD0gUE1fT01BUDRfUk9NX1NNUF9CT09UX0VSUkFUVU1fR0lDRDsKKworCXJldHVybiAwOworfQorCisvKioKICAqIG9tYXA0X3BtX2luaXQgLSBJbml0IHJvdXRpbmUgZm9yIE9NQVA0KyBkZXZpY2VzCiAgKgogICogSW5pdGlhbGl6ZXMgYWxsIHBvd2VyZG9tYWluIGFuZCBjbG9ja2RvbWFpbiB0YXJnZXQgc3RhdGVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pbml0LmMgYi9hcmNoL2FybS9tbS9pbml0LmMKaW5kZXggZjU3ZmIzMy4uODA0ZDYxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtL21tL2luaXQuYwpAQCAtMjkwLDEwICsyOTAsMTEgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCS8qIEZEVCBzY2FuIHdpbGwgcG9wdWxhdGUgaW5pdHJkX3N0YXJ0ICovCi0JaWYgKGluaXRyZF9zdGFydCkgeworCWlmIChpbml0cmRfc3RhcnQgJiYgIXBoeXNfaW5pdHJkX3NpemUpIHsKIAkJcGh5c19pbml0cmRfc3RhcnQgPSBfX3ZpcnRfdG9fcGh5cyhpbml0cmRfc3RhcnQpOwogCQlwaHlzX2luaXRyZF9zaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKIAl9CisJaW5pdHJkX3N0YXJ0ID0gaW5pdHJkX2VuZCA9IDA7CiAJaWYgKHBoeXNfaW5pdHJkX3NpemUgJiYKIAkgICAgIW1lbWJsb2NrX2lzX3JlZ2lvbl9tZW1vcnkocGh5c19pbml0cmRfc3RhcnQsIHBoeXNfaW5pdHJkX3NpemUpKSB7CiAJCXByX2VycigiSU5JVFJEOiAweCUwOGxseCsweCUwOGx4IGlzIG5vdCBhIG1lbW9yeSByZWdpb24gLSBkaXNhYmxpbmcgaW5pdHJkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vaXJxLmMKaW5kZXggYzQ5MmUxYi4uODA3ZGYxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9pcnEuYworKysgYi9hcmNoL2FybS9wbGF0LW9yaW9uL2lycS5jCkBAIC0xNSw4ICsxNSw1MSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KICNpbmNsdWRlIDxwbGF0L2lycS5oPgogI2luY2x1ZGUgPHBsYXQvb3Jpb24tZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvYnJpZGdlLXJlZ3MuaD4KKworI2lmZGVmIENPTkZJR19NVUxUSV9JUlFfSEFORExFUgorLyoKKyAqIENvbXBpbGluZyB3aXRoIGJvdGggbm9uLURUIGFuZCBEVCBzdXBwb3J0IGVuYWJsZWQsIHdpbGwKKyAqIGJyZWFrIGFzbSBpcnEgaGFuZGxlciB1c2VkIGJ5IG5vbi1EVCBib2FyZHMuIFRoZXJlZm9yZSwKKyAqIHdlIHByb3ZpZGUgYSBDLXN0eWxlIGlycSBoYW5kbGVyIGV2ZW4gZm9yIG5vbi1EVCBib2FyZHMsCisgKiBpZiBNVUxUSV9JUlFfSEFORExFUiBpcyBzZXQuCisgKgorICogTm90ZXM6CisgKiAtIHRoaXMgaXMgcHJlcGFyZWQgZm9yIEtpcmt3b29kIGFuZCBEb3ZlIG9ubHksIHVwZGF0ZQorICogICBhY2NvcmRpbmdseSBpZiB5b3UgYWRkIE9yaW9uNXggb3IgTVY3OHgwMC4KKyAqIC0gT3Jpb241eCB1c2VzIGRpZmZlcmVudCBtYWNybyBuYW1lcyBhbmQgaGFzIG9ubHkgb25lCisgKiAgIHNldCBvZiBDQVVTRS9NQVNLIHJlZ2lzdGVycy4KKyAqIC0gTVY3OHgwMCB1c2VzIHRoZSBzYW1lIG1hY3JvIG5hbWVzIGJ1dCBoYXMgYSB0aGlyZAorICogICBzZXQgb2YgQ0FVU0UvTUFTSyByZWdpc3RlcnMuCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm9yaW9uX2lycV9iYXNlID0gSVJRX1ZJUlRfQkFTRTsKKworYXNtbGlua2FnZSB2b2lkCitfX2V4Y2VwdGlvbl9pcnFfZW50cnkgb3Jpb25fbGVnYWN5X2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHN0YXQ7CisKKwlzdGF0ID0gcmVhZGxfcmVsYXhlZChvcmlvbl9pcnFfYmFzZSArIElSUV9DQVVTRV9MT1dfT0ZGKTsKKwlzdGF0ICY9IHJlYWRsX3JlbGF4ZWQob3Jpb25faXJxX2Jhc2UgKyBJUlFfTUFTS19MT1dfT0ZGKTsKKwlpZiAoc3RhdCkgeworCQl1bnNpZ25lZCBpbnQgaHdpcnEgPSBfX2ZscyhzdGF0KTsKKwkJaGFuZGxlX0lSUShod2lycSwgcmVncyk7CisJCXJldHVybjsKKwl9CisJc3RhdCA9IHJlYWRsX3JlbGF4ZWQob3Jpb25faXJxX2Jhc2UgKyBJUlFfQ0FVU0VfSElHSF9PRkYpOworCXN0YXQgJj0gcmVhZGxfcmVsYXhlZChvcmlvbl9pcnFfYmFzZSArIElSUV9NQVNLX0hJR0hfT0ZGKTsKKwlpZiAoc3RhdCkgeworCQl1bnNpZ25lZCBpbnQgaHdpcnEgPSAzMiArIF9fZmxzKHN0YXQpOworCQloYW5kbGVfSVJRKGh3aXJxLCByZWdzKTsKKwkJcmV0dXJuOworCX0KK30KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBvcmlvbl9pcnFfaW5pdCh1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0LCB2b2lkIF9faW9tZW0gKm1hc2thZGRyKQogewpAQCAtMzUsNiArNzgsMTAgQEAKIAljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaXJxX2djX21hc2tfc2V0X2JpdDsKIAlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKDMyKSwgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSwKIAkJCSAgICAgICBJUlFfTk9SRVFVRVNULCBJUlFfTEVWRUwgfCBJUlFfTk9QUk9CRSk7CisKKyNpZmRlZiBDT05GSUdfTVVMVElfSVJRX0hBTkRMRVIKKwlzZXRfaGFuZGxlX2lycShvcmlvbl9sZWdhY3lfaGFuZGxlX2lycSk7CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19PRgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jIGIvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jCmluZGV4IDIxNjIxNzIuLmI5NjcyM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL2FybS94ZW4vZW5saWdodGVuLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKQEAgLTE1NCw3ICsxNTUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3VubWFwX2RvbWFpbl9tZm5fcmFuZ2UpOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3BlcmNwdV9pbml0KHZvaWQgKnVudXNlZCkKK3N0YXRpYyB2b2lkIHhlbl9wZXJjcHVfaW5pdCh2b2lkKQogewogCXN0cnVjdCB2Y3B1X3JlZ2lzdGVyX3ZjcHVfaW5mbyBpbmZvOwogCXN0cnVjdCB2Y3B1X2luZm8gKnZjcHVwOwpAQCAtMTkzLDYgKzE5NCwzMSBAQAogCQlCVUcoKTsKIH0KIAorc3RhdGljIGludCB4ZW5fY3B1X25vdGlmaWNhdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkJdm9pZCAqaGNwdSkKK3sKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX1NUQVJUSU5HOgorCQl4ZW5fcGVyY3B1X2luaXQoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5fY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0geGVuX2NwdV9ub3RpZmljYXRpb24sCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2FybV9jYWxsYmFjayhpbnQgaXJxLCB2b2lkICphcmcpCit7CisJeGVuX2h2bV9ldnRjaG5fZG9fdXBjYWxsKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiAvKgogICogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0veGVuLnR4dCBmb3IgdGhlCiAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBYZW4gRGV2aWNlIFRyZWUgZm9ybWF0LgpAQCAtMjA4LDcgKzIzNCw3IEBACiAJY29uc3QgY2hhciAqdmVyc2lvbiA9IE5VTEw7CiAJY29uc3QgY2hhciAqeGVuX3ByZWZpeCA9ICJ4ZW4seGVuLSI7CiAJc3RydWN0IHJlc291cmNlIHJlczsKLQl1bnNpZ25lZCBsb25nIGdyYW50X2ZyYW1lczsKKwlwaHlzX2FkZHJfdCBncmFudF9mcmFtZXM7CiAKIAlub2RlID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInhlbix4ZW4iKTsKIAlpZiAoIW5vZGUpIHsKQEAgLTIyNyw4ICsyNTMsMTIgQEAKIAkJcmV0dXJuIDA7CiAJZ3JhbnRfZnJhbWVzID0gcmVzLnN0YXJ0OwogCXhlbl9ldmVudHNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7Ci0JcHJfaW5mbygiWGVuICVzIHN1cHBvcnQgZm91bmQsIGV2ZW50c19pcnE9JWQgZ250dGFiX2ZyYW1lX3Bmbj0lbHhcbiIsCi0JCQl2ZXJzaW9uLCB4ZW5fZXZlbnRzX2lycSwgKGdyYW50X2ZyYW1lcyA+PiBQQUdFX1NISUZUKSk7CisJcHJfaW5mbygiWGVuICVzIHN1cHBvcnQgZm91bmQsIGV2ZW50c19pcnE9JWQgZ250dGFiX2ZyYW1lPSVwYVxuIiwKKwkJCXZlcnNpb24sIHhlbl9ldmVudHNfaXJxLCAmZ3JhbnRfZnJhbWVzKTsKKworCWlmICh4ZW5fZXZlbnRzX2lycSA8IDApCisJCXJldHVybiAtRU5PREVWOworCiAJeGVuX2RvbWFpbl90eXBlID0gWEVOX0hWTV9ET01BSU47CiAKIAl4ZW5fc2V0dXBfZmVhdHVyZXMoKTsKQEAgLTI4MSw5ICszMTEsMjEgQEAKIAlkaXNhYmxlX2NwdWlkbGUoKTsKIAlkaXNhYmxlX2NwdWZyZXEoKTsKIAorCXhlbl9pbml0X0lSUSgpOworCisJaWYgKHJlcXVlc3RfcGVyY3B1X2lycSh4ZW5fZXZlbnRzX2lycSwgeGVuX2FybV9jYWxsYmFjaywKKwkJCSAgICAgICAiZXZlbnRzIiwgJnhlbl92Y3B1KSkgeworCQlwcl9lcnIoIkVycm9yIHJlcXVlc3QgSVJRICVkXG4iLCB4ZW5fZXZlbnRzX2lycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXhlbl9wZXJjcHVfaW5pdCgpOworCisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ4ZW5fY3B1X25vdGlmaWVyKTsKKwogCXJldHVybiAwOwogfQotY29yZV9pbml0Y2FsbCh4ZW5fZ3Vlc3RfaW5pdCk7CitlYXJseV9pbml0Y2FsbCh4ZW5fZ3Vlc3RfaW5pdCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHhlbl9wbV9pbml0KHZvaWQpCiB7CkBAIC0yOTcsMzEgKzMzOSw2IEBACiB9CiBsYXRlX2luaXRjYWxsKHhlbl9wbV9pbml0KTsKIAotc3RhdGljIGlycXJldHVybl90IHhlbl9hcm1fY2FsbGJhY2soaW50IGlycSwgdm9pZCAqYXJnKQotewotCXhlbl9odm1fZXZ0Y2huX2RvX3VwY2FsbCgpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgeGVuX2luaXRfZXZlbnRzKHZvaWQpCi17Ci0JaWYgKCF4ZW5fZG9tYWluKCkgfHwgeGVuX2V2ZW50c19pcnEgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXhlbl9pbml0X0lSUSgpOwotCi0JaWYgKHJlcXVlc3RfcGVyY3B1X2lycSh4ZW5fZXZlbnRzX2lycSwgeGVuX2FybV9jYWxsYmFjaywKLQkJCSJldmVudHMiLCAmeGVuX3ZjcHUpKSB7Ci0JCXByX2VycigiRXJyb3IgcmVxdWVzdGluZyBJUlEgJWRcbiIsIHhlbl9ldmVudHNfaXJxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jb25fZWFjaF9jcHUoeGVuX3BlcmNwdV9pbml0LCBOVUxMLCAwKTsKLQotCXJldHVybiAwOwotfQotcG9zdGNvcmVfaW5pdGNhbGwoeGVuX2luaXRfZXZlbnRzKTsKLQogLyogSW4gdGhlIGh5cGVydmlzb3IuUyBmaWxlLiAqLwogRVhQT1JUX1NZTUJPTF9HUEwoSFlQRVJWSVNPUl9ldmVudF9jaGFubmVsX29wKTsKIEVYUE9SVF9TWU1CT0xfR1BMKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3ApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGRkNDMyN2YuLjI3YmJjZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZworKysgYi9hcmNoL2FybTY0L0tjb25maWcKQEAgLTM2LDYgKzM2LDcgQEAKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVAogCXNlbGVjdCBIQVZFX0hXX0JSRUFLUE9JTlQgaWYgUEVSRl9FVkVOVFMKIAlzZWxlY3QgSEFWRV9NRU1CTE9DSworCXNlbGVjdCBIQVZFX1BBVEFfUExBVEZPUk0KIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBJUlFfRE9NQUlOCiAJc2VsZWN0IE1PRFVMRVNfVVNFX0VMRl9SRUxBCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NvbmZpZ3MvZGVmY29uZmlnIGIvYXJjaC9hcm02NC9jb25maWdzL2RlZmNvbmZpZwppbmRleCA4NDEzOWJlLi43OTU5ZGQwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2NvbmZpZ3MvZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvY29uZmlncy9kZWZjb25maWcKQEAgLTEsNCArMSwzIEBACi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQpAQCAtMTksNiArMTgsNyBAQAogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX0pVTVBfTEFCRUw9eQogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldApAQCAtMjcsNiArMjcsNyBAQAogQ09ORklHX0FSQ0hfWEdFTkU9eQogQ09ORklHX1NNUD15CiBDT05GSUdfUFJFRU1QVD15CitDT05GSUdfQ01BPXkKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eUFNQTAiCiAjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUPXkKQEAgLTQyLDE0ICs0MywxNyBAQAogIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19ERVZUTVBGUz15Ci1DT05GSUdfQkxLX0RFVj15CitDT05GSUdfRE1BX0NNQT15CiBDT05GSUdfU0NTST15CiAjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfU0Q9eQogIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKK0NPTkZJR19QQVRBX1BMQVRGT1JNPXkKK0NPTkZJR19QQVRBX09GX1BMQVRGT1JNPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19NSUk9eQogQ09ORklHX1NNQzkxWD15CitDT05GSUdfU01TQzkxMVg9eQogIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfRVZERVY9eQogIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldApAQCAtNjIsMTMgKzY2LDE5IEBACiBDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTFfQ09OU09MRT15CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUj15CitDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0U9eQogQ09ORklHX0ZCPXkKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKIENPTkZJR19MT0dPPXkKICMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9JU1AxNzYwX0hDRD15CitDT05GSUdfVVNCX1NUT1JBR0U9eQorQ09ORklHX01NQz15CitDT05GSUdfTU1DX0FSTU1NQ0k9eQogIyBDT05GSUdfSU9NTVVfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAwMWRlNWFhLi4wMjM3ZjA4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTU0LDggKzU0LDcgQEAKICIJc3R4cgkldzEsICV3MCwgJTJcbiIKICIJY2JuegkldzEsIDFiIgogCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0bXApLCAiK1EiICh2LT5jb3VudGVyKQotCTogIklyIiAoaSkKLQk6ICJjYyIpOworCTogIklyIiAoaSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCkBAIC02NCwxNCArNjMsMTUgQEAKIAlpbnQgcmVzdWx0OwogCiAJYXNtIHZvbGF0aWxlKCIvLyBhdG9taWNfYWRkX3JldHVyblxuIgotIjE6CWxkYXhyCSV3MCwgJTJcbiIKKyIxOglsZHhyCSV3MCwgJTJcbiIKICIJYWRkCSV3MCwgJXcwLCAldzNcbiIKICIJc3RseHIJJXcxLCAldzAsICUyXG4iCiAiCWNibnoJJXcxLCAxYiIKIAk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodG1wKSwgIitRIiAodi0+Y291bnRlcikKIAk6ICJJciIgKGkpCi0JOiAiY2MiLCAibWVtb3J5Iik7CisJOiAibWVtb3J5Iik7CiAKKwlzbXBfbWIoKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC04Niw4ICs4Niw3IEBACiAiCXN0eHIJJXcxLCAldzAsICUyXG4iCiAiCWNibnoJJXcxLCAxYiIKIAk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodG1wKSwgIitRIiAodi0+Y291bnRlcikKLQk6ICJJciIgKGkpCi0JOiAiY2MiKTsKKwk6ICJJciIgKGkpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQpAQCAtOTYsMTQgKzk1LDE1IEBACiAJaW50IHJlc3VsdDsKIAogCWFzbSB2b2xhdGlsZSgiLy8gYXRvbWljX3N1Yl9yZXR1cm5cbiIKLSIxOglsZGF4cgkldzAsICUyXG4iCisiMToJbGR4cgkldzAsICUyXG4iCiAiCXN1YgkldzAsICV3MCwgJXczXG4iCiAiCXN0bHhyCSV3MSwgJXcwLCAlMlxuIgogIgljYm56CSV3MSwgMWIiCiAJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRtcCksICIrUSIgKHYtPmNvdW50ZXIpCiAJOiAiSXIiIChpKQotCTogImNjIiwgIm1lbW9yeSIpOworCTogIm1lbW9yeSIpOwogCisJc21wX21iKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEyLDE3ICsxMTIsMjAgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgb2xkdmFsOwogCisJc21wX21iKCk7CisKIAlhc20gdm9sYXRpbGUoIi8vIGF0b21pY19jbXB4Y2hnXG4iCi0iMToJbGRheHIJJXcxLCAlMlxuIgorIjE6CWxkeHIJJXcxLCAlMlxuIgogIgljbXAJJXcxLCAldzNcbiIKICIJYi5uZQkyZlxuIgotIglzdGx4cgkldzAsICV3NCwgJTJcbiIKKyIJc3R4cgkldzAsICV3NCwgJTJcbiIKICIJY2JuegkldzAsIDFiXG4iCiAiMjoiCiAJOiAiPSZyIiAodG1wKSwgIj0mciIgKG9sZHZhbCksICIrUSIgKHB0ci0+Y291bnRlcikKIAk6ICJJciIgKG9sZCksICJyIiAobmV3KQotCTogImNjIiwgIm1lbW9yeSIpOworCTogImNjIik7CiAKKwlzbXBfbWIoKTsKIAlyZXR1cm4gb2xkdmFsOwogfQogCkBAIC0xNzMsOCArMTc2LDcgQEAKICIJc3R4cgkldzEsICUwLCAlMlxuIgogIgljYm56CSV3MSwgMWIiCiAJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRtcCksICIrUSIgKHYtPmNvdW50ZXIpCi0JOiAiSXIiIChpKQotCTogImNjIik7CisJOiAiSXIiIChpKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9hZGRfcmV0dXJuKGxvbmcgaSwgYXRvbWljNjRfdCAqdikKQEAgLTE4MywxNCArMTg1LDE1IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKIAlhc20gdm9sYXRpbGUoIi8vIGF0b21pYzY0X2FkZF9yZXR1cm5cbiIKLSIxOglsZGF4cgklMCwgJTJcbiIKKyIxOglsZHhyCSUwLCAlMlxuIgogIglhZGQJJTAsICUwLCAlM1xuIgogIglzdGx4cgkldzEsICUwLCAlMlxuIgogIgljYm56CSV3MSwgMWIiCiAJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRtcCksICIrUSIgKHYtPmNvdW50ZXIpCiAJOiAiSXIiIChpKQotCTogImNjIiwgIm1lbW9yeSIpOworCTogIm1lbW9yeSIpOwogCisJc21wX21iKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjA1LDggKzIwOCw3IEBACiAiCXN0eHIJJXcxLCAlMCwgJTJcbiIKICIJY2JuegkldzEsIDFiIgogCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0bXApLCAiK1EiICh2LT5jb3VudGVyKQotCTogIklyIiAoaSkKLQk6ICJjYyIpOworCTogIklyIiAoaSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgYXRvbWljNjRfc3ViX3JldHVybihsb25nIGksIGF0b21pYzY0X3QgKnYpCkBAIC0yMTUsMTQgKzIxNywxNSBAQAogCXVuc2lnbmVkIGxvbmcgdG1wOwogCiAJYXNtIHZvbGF0aWxlKCIvLyBhdG9taWM2NF9zdWJfcmV0dXJuXG4iCi0iMToJbGRheHIJJTAsICUyXG4iCisiMToJbGR4cgklMCwgJTJcbiIKICIJc3ViCSUwLCAlMCwgJTNcbiIKICIJc3RseHIJJXcxLCAlMCwgJTJcbiIKICIJY2JuegkldzEsIDFiIgogCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0bXApLCAiK1EiICh2LT5jb3VudGVyKQogCTogIklyIiAoaSkKLQk6ICJjYyIsICJtZW1vcnkiKTsKKwk6ICJtZW1vcnkiKTsKIAorCXNtcF9tYigpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzMSwxNyArMjM0LDIwIEBACiAJbG9uZyBvbGR2YWw7CiAJdW5zaWduZWQgbG9uZyByZXM7CiAKKwlzbXBfbWIoKTsKKwogCWFzbSB2b2xhdGlsZSgiLy8gYXRvbWljNjRfY21weGNoZ1xuIgotIjE6CWxkYXhyCSUxLCAlMlxuIgorIjE6CWxkeHIJJTEsICUyXG4iCiAiCWNtcAklMSwgJTNcbiIKICIJYi5uZQkyZlxuIgotIglzdGx4cgkldzAsICU0LCAlMlxuIgorIglzdHhyCSV3MCwgJTQsICUyXG4iCiAiCWNibnoJJXcwLCAxYlxuIgogIjI6IgogCTogIj0mciIgKHJlcyksICI9JnIiIChvbGR2YWwpLCAiK1EiIChwdHItPmNvdW50ZXIpCiAJOiAiSXIiIChvbGQpLCAiciIgKG5ldykKLQk6ICJjYyIsICJtZW1vcnkiKTsKKwk6ICJjYyIpOwogCisJc21wX21iKCk7CiAJcmV0dXJuIG9sZHZhbDsKIH0KIApAQCAtMjUzLDExICsyNTksMTIgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAogCWFzbSB2b2xhdGlsZSgiLy8gYXRvbWljNjRfZGVjX2lmX3Bvc2l0aXZlXG4iCi0iMToJbGRheHIJJTAsICUyXG4iCisiMToJbGR4cgklMCwgJTJcbiIKICIJc3VicwklMCwgJTAsICMxXG4iCiAiCWIubWkJMmZcbiIKICIJc3RseHIJJXcxLCAlMCwgJTJcbiIKICIJY2JuegkldzEsIDFiXG4iCisiCWRtYglpc2hcbiIKICIyOiIKIAk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodG1wKSwgIitRIiAodi0+Y291bnRlcikKIAk6CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCmluZGV4IDc4ZTIwYmEuLjQwOWNhMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIHdmaSgpCQlhc20gdm9sYXRpbGUoIndmaSIgOiA6IDogIm1lbW9yeSIpCiAKICNkZWZpbmUgaXNiKCkJCWFzbSB2b2xhdGlsZSgiaXNiIiA6IDogOiAibWVtb3J5IikKLSNkZWZpbmUgZHNiKCkJCWFzbSB2b2xhdGlsZSgiZHNiIHN5IiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgZHNiKG9wdCkJYXNtIHZvbGF0aWxlKCJkc2Igc3kiIDogOiA6ICJtZW1vcnkiKQogCiAjZGVmaW5lIG1iKCkJCWRzYigpCiAjZGVmaW5lIHJtYigpCQlhc20gdm9sYXRpbGUoImRzYiBsZCIgOiA6IDogIm1lbW9yeSIpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IGZlYTllZTMuLjg4OTMyNDk4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTE2LDYgKzExNiw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF9pY2FjaGVfYWxsKHZvaWQpCiB7CiAJYXNtKCJpYwlpYWxsdWlzIik7CisJZHNiKCk7CiB9CiAKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKSBcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCmluZGV4IDU2MTY2ZDcuLjU3YzBmYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCkBAIC0yOSw0NCArMjksNDUgQEAKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CiAJCWFzbSB2b2xhdGlsZSgiLy8JX194Y2hnMVxuIgotCQkiMToJbGRheHJiCSV3MCwgJTJcbiIKKwkJIjE6CWxkeHJiCSV3MCwgJTJcbiIKIAkJIglzdGx4cmIJJXcxLCAldzMsICUyXG4iCiAJCSIJY2JuegkldzEsIDFiXG4iCiAJCQk6ICI9JnIiIChyZXQpLCAiPSZyIiAodG1wKSwgIitRIiAoKih1OCAqKXB0cikKIAkJCTogInIiICh4KQotCQkJOiAiY2MiLCAibWVtb3J5Iik7CisJCQk6ICJtZW1vcnkiKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlhc20gdm9sYXRpbGUoIi8vCV9feGNoZzJcbiIKLQkJIjE6CWxkYXhyaAkldzAsICUyXG4iCisJCSIxOglsZHhyaAkldzAsICUyXG4iCiAJCSIJc3RseHJoCSV3MSwgJXczLCAlMlxuIgogCQkiCWNibnoJJXcxLCAxYlxuIgogCQkJOiAiPSZyIiAocmV0KSwgIj0mciIgKHRtcCksICIrUSIgKCoodTE2ICopcHRyKQogCQkJOiAiciIgKHgpCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsKKwkJCTogIm1lbW9yeSIpOwogCQlicmVhazsKIAljYXNlIDQ6CiAJCWFzbSB2b2xhdGlsZSgiLy8JX194Y2hnNFxuIgotCQkiMToJbGRheHIJJXcwLCAlMlxuIgorCQkiMToJbGR4cgkldzAsICUyXG4iCiAJCSIJc3RseHIJJXcxLCAldzMsICUyXG4iCiAJCSIJY2JuegkldzEsIDFiXG4iCiAJCQk6ICI9JnIiIChyZXQpLCAiPSZyIiAodG1wKSwgIitRIiAoKih1MzIgKilwdHIpCiAJCQk6ICJyIiAoeCkKLQkJCTogImNjIiwgIm1lbW9yeSIpOworCQkJOiAibWVtb3J5Iik7CiAJCWJyZWFrOwogCWNhc2UgODoKIAkJYXNtIHZvbGF0aWxlKCIvLwlfX3hjaGc4XG4iCi0JCSIxOglsZGF4cgklMCwgJTJcbiIKKwkJIjE6CWxkeHIJJTAsICUyXG4iCiAJCSIJc3RseHIJJXcxLCAlMywgJTJcbiIKIAkJIgljYm56CSV3MSwgMWJcbiIKIAkJCTogIj0mciIgKHJldCksICI9JnIiICh0bXApLCAiK1EiICgqKHU2NCAqKXB0cikKIAkJCTogInIiICh4KQotCQkJOiAiY2MiLCAibWVtb3J5Iik7CisJCQk6ICJtZW1vcnkiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVJTERfQlVHKCk7CiAJfQogCisJc21wX21iKCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kbWEtY29udGlndW91cy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kbWEtY29udGlndW91cy5oCmluZGV4IGQ2YWFjYjYuLjE0YzRjMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLWNvbnRpZ3VvdXMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RtYS1jb250aWd1b3VzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZmRlZiBDT05GSUdfRE1BX0NNQQogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtY29udGlndW91cy5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGRtYV9jb250aWd1b3VzX2Vhcmx5X2ZpeHVwKHBoeXNfYWRkcl90IGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgeyB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaAppbmRleCA3ODgzNDEyLi5jNGE3Zjk0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKQEAgLTQyLDcgKzQyLDcgQEAKICNkZWZpbmUgRVNSX0VMMV9FQ19TUF9BTElHTgkoMHgyNikKICNkZWZpbmUgRVNSX0VMMV9FQ19GUF9FWEMzMgkoMHgyOCkKICNkZWZpbmUgRVNSX0VMMV9FQ19GUF9FWEM2NAkoMHgyQykKLSNkZWZpbmUgRVNSX0VMMV9FQ19TRVJSUk9SCSgweDJGKQorI2RlZmluZSBFU1JfRUwxX0VDX1NFUlJPUgkoMHgyRikKICNkZWZpbmUgRVNSX0VMMV9FQ19CUkVBS1BUX0VMMAkoMHgzMCkKICNkZWZpbmUgRVNSX0VMMV9FQ19CUkVBS1BUX0VMMQkoMHgzMSkKICNkZWZpbmUgRVNSX0VMMV9FQ19TT0ZUU1RQX0VMMAkoMHgzMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZnV0ZXguaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZnV0ZXguaAppbmRleCA3OGNjM2FiLi41Zjc1MGRjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9mdXRleC5oCkBAIC0yNCwxMCArMjQsMTEgQEAKIAogI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcChpbnNuLCByZXQsIG9sZHZhbCwgdWFkZHIsIHRtcCwgb3BhcmcpCQlcCiAJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCi0iMToJbGRheHIJJXcxLCAlMlxuIgkJCQkJCVwKKyIxOglsZHhyCSV3MSwgJTJcbiIJCQkJCQlcCiAJaW5zbiAiXG4iCQkJCQkJCVwKICIyOglzdGx4cgkldzMsICV3MCwgJTJcbiIJCQkJCQlcCiAiCWNibnoJJXczLCAxYlxuIgkJCQkJCVwKKyIJZG1iCWlzaFxuIgkJCQkJCQlcCiAiMzpcbiIJCQkJCQkJCQlcCiAiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCQlcCiAiCS5hbGlnbgkyXG4iCQkJCQkJCVwKQEAgLTQwLDcgKzQxLDcgQEAKICIJLnBvcHNlY3Rpb25cbiIJCQkJCQkJXAogCTogIj0mciIgKHJldCksICI9JnIiIChvbGR2YWwpLCAiK1EiICgqdWFkZHIpLCAiPSZyIiAodG1wKQlcCiAJOiAiciIgKG9wYXJnKSwgIklyIiAoLUVGQVVMVCkJCQkJCVwKLQk6ICJjYyIsICJtZW1vcnkiKQorCTogIm1lbW9yeSIpCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgdTMyIF9fdXNlciAqdWFkZHIpCkBAIC0xMTEsMTEgKzExMiwxMiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWFzbSB2b2xhdGlsZSgiLy8gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWNcbiIKLSIxOglsZGF4cgkldzEsICUyXG4iCisiMToJbGR4cgkldzEsICUyXG4iCiAiCXN1YgkldzMsICV3MSwgJXc0XG4iCiAiCWNibnoJJXczLCAzZlxuIgogIjI6CXN0bHhyCSV3MywgJXc1LCAlMlxuIgogIgljYm56CSV3MywgMWJcbiIKKyIJZG1iCWlzaFxuIgogIjM6XG4iCiAiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCiAiNDoJbW92CSV3MCwgJXc2XG4iCkBAIC0xMjcsNyArMTI5LDcgQEAKICIJLnBvcHNlY3Rpb25cbiIKIAk6ICIrciIgKHJldCksICI9JnIiICh2YWwpLCAiK1EiICgqdWFkZHIpLCAiPSZyIiAodG1wKQogCTogInIiIChvbGR2YWwpLCAiciIgKG5ld3ZhbCksICJJciIgKC1FRkFVTFQpCi0JOiAiY2MiLCAibWVtb3J5Iik7CisJOiAibWVtb3J5Iik7CiAKIAkqdXZhbCA9IHZhbDsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAppbmRleCBjOThlZjQ3Li4wZWIzOTg2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaApAQCAtMjMxLDcgKzIzMSw3IEBACiAjZGVmaW5lIEVTUl9FTDJfRUNfU1BfQUxJR04JKDB4MjYpCiAjZGVmaW5lIEVTUl9FTDJfRUNfRlBfRVhDMzIJKDB4MjgpCiAjZGVmaW5lIEVTUl9FTDJfRUNfRlBfRVhDNjQJKDB4MkMpCi0jZGVmaW5lIEVTUl9FTDJfRUNfU0VSUlJPUgkoMHgyRikKKyNkZWZpbmUgRVNSX0VMMl9FQ19TRVJST1IJKDB4MkYpCiAjZGVmaW5lIEVTUl9FTDJfRUNfQlJFQUtQVAkoMHgzMCkKICNkZWZpbmUgRVNSX0VMMl9FQ19CUkVBS1BUX0hZUAkoMHgzMSkKICNkZWZpbmUgRVNSX0VMMl9FQ19TT0ZUU1RQCSgweDMyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA3ZjJiNjBhLi5iNTI0ZGNkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBQVEVfRklMRQkJKF9BVChwdGV2YWxfdCwgMSkgPDwgMikJLyogb25seSB3aGVuICFwdGVfcHJlc2VudCgpICovCiAjZGVmaW5lIFBURV9ESVJUWQkJKF9BVChwdGV2YWxfdCwgMSkgPDwgNTUpCiAjZGVmaW5lIFBURV9TUEVDSUFMCQkoX0FUKHB0ZXZhbF90LCAxKSA8PCA1NikKLQkJCQkvKiBiaXQgNTcgZm9yIFBNRF9TRUNUX1NQTElUVElORyAqLworI2RlZmluZSBQVEVfV1JJVEUJCShfQVQocHRldmFsX3QsIDEpIDw8IDU3KQogI2RlZmluZSBQVEVfUFJPVF9OT05FCQkoX0FUKHB0ZXZhbF90LCAxKSA8PCA1OCkgLyogb25seSB3aGVuICFQVEVfVkFMSUQgKi8KIAogLyoKQEAgLTY3LDE1ICs2NywxNSBAQAogCiAjZGVmaW5lIF9NT0RfUFJPVChwLCBiKQkJX19wZ3Byb3RfbW9kaWZ5KHAsIDAsIGIpCiAKLSNkZWZpbmUgUEFHRV9OT05FCQlfX3BncHJvdF9tb2RpZnkocGdwcm90X2RlZmF1bHQsIFBURV9UWVBFX01BU0ssIFBURV9QUk9UX05PTkUgfCBQVEVfUkRPTkxZIHwgUFRFX1BYTiB8IFBURV9VWE4pCi0jZGVmaW5lIFBBR0VfU0hBUkVECQlfTU9EX1BST1QocGdwcm90X2RlZmF1bHQsIFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4pCi0jZGVmaW5lIFBBR0VfU0hBUkVEX0VYRUMJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4pCi0jZGVmaW5lIFBBR0VfQ09QWQkJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgUEFHRV9DT1BZX0VYRUMJCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgUEFHRV9SRUFET05MWQkJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgUEFHRV9SRUFET05MWV9FWEVDCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgUEFHRV9LRVJORUwJCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1BYTiB8IFBURV9VWE4gfCBQVEVfRElSVFkpCi0jZGVmaW5lIFBBR0VfS0VSTkVMX0VYRUMJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVhOIHwgUFRFX0RJUlRZKQorI2RlZmluZSBQQUdFX05PTkUJCV9fcGdwcm90X21vZGlmeShwZ3Byb3RfZGVmYXVsdCwgUFRFX1RZUEVfTUFTSywgUFRFX1BST1RfTk9ORSB8IFBURV9QWE4gfCBQVEVfVVhOKQorI2RlZmluZSBQQUdFX1NIQVJFRAkJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOIHwgUFRFX1dSSVRFKQorI2RlZmluZSBQQUdFX1NIQVJFRF9FWEVDCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1dSSVRFKQorI2RlZmluZSBQQUdFX0NPUFkJCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1VYTikKKyNkZWZpbmUgUEFHRV9DT1BZX0VYRUMJCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOKQorI2RlZmluZSBQQUdFX1JFQURPTkxZCQlfTU9EX1BST1QocGdwcm90X2RlZmF1bHQsIFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4pCisjZGVmaW5lIFBBR0VfUkVBRE9OTFlfRVhFQwlfTU9EX1BST1QocGdwcm90X2RlZmF1bHQsIFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKKyNkZWZpbmUgUEFHRV9LRVJORUwJCV9NT0RfUFJPVChwZ3Byb3RfZGVmYXVsdCwgUFRFX1BYTiB8IFBURV9VWE4gfCBQVEVfRElSVFkgfCBQVEVfV1JJVEUpCisjZGVmaW5lIFBBR0VfS0VSTkVMX0VYRUMJX01PRF9QUk9UKHBncHJvdF9kZWZhdWx0LCBQVEVfVVhOIHwgUFRFX0RJUlRZIHwgUFRFX1dSSVRFKQogCiAjZGVmaW5lIFBBR0VfSFlQCQlfTU9EX1BST1QocGdwcm90X2RlZmF1bHQsIFBURV9IWVApCiAjZGVmaW5lIFBBR0VfSFlQX0RFVklDRQkJX19wZ3Byb3QoUFJPVF9ERVZJQ0VfbkduUkUgfCBQVEVfSFlQKQpAQCAtODMsMTMgKzgzLDEzIEBACiAjZGVmaW5lIFBBR0VfUzIJCQlfX3BncHJvdF9tb2RpZnkocGdwcm90X2RlZmF1bHQsIFBURV9TMl9NRU1BVFRSX01BU0ssIFBURV9TMl9NRU1BVFRSKE1UX1MyX05PUk1BTCkgfCBQVEVfUzJfUkRPTkxZKQogI2RlZmluZSBQQUdFX1MyX0RFVklDRQkJX19wZ3Byb3QoUFJPVF9ERUZBVUxUIHwgUFRFX1MyX01FTUFUVFIoTVRfUzJfREVWSUNFX25HblJFKSB8IFBURV9TMl9SRFdSIHwgUFRFX1VYTikKIAotI2RlZmluZSBfX1BBR0VfTk9ORQkJX19wZ3Byb3QoKChfUEFHRV9ERUZBVUxUKSAmIH5QVEVfVFlQRV9NQVNLKSB8IFBURV9QUk9UX05PTkUgfCBQVEVfUkRPTkxZIHwgUFRFX1BYTiB8IFBURV9VWE4pCi0jZGVmaW5lIF9fUEFHRV9TSEFSRUQJCV9fcGdwcm90KF9QQUdFX0RFRkFVTFQgfCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOKQotI2RlZmluZSBfX1BBR0VfU0hBUkVEX0VYRUMJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKLSNkZWZpbmUgX19QQUdFX0NPUFkJCV9fcGdwcm90KF9QQUdFX0RFRkFVTFQgfCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgX19QQUdFX0NPUFlfRVhFQwlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1JET05MWSkKLSNkZWZpbmUgX19QQUdFX1JFQURPTkxZCQlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1VYTiB8IFBURV9SRE9OTFkpCi0jZGVmaW5lIF9fUEFHRV9SRUFET05MWV9FWEVDCV9fcGdwcm90KF9QQUdFX0RFRkFVTFQgfCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfUkRPTkxZKQorI2RlZmluZSBfX1BBR0VfTk9ORQkJX19wZ3Byb3QoKChfUEFHRV9ERUZBVUxUKSAmIH5QVEVfVFlQRV9NQVNLKSB8IFBURV9QUk9UX05PTkUgfCBQVEVfUFhOIHwgUFRFX1VYTikKKyNkZWZpbmUgX19QQUdFX1NIQVJFRAkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4gfCBQVEVfV1JJVEUpCisjZGVmaW5lIF9fUEFHRV9TSEFSRURfRVhFQwlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1dSSVRFKQorI2RlZmluZSBfX1BBR0VfQ09QWQkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4pCisjZGVmaW5lIF9fUEFHRV9DT1BZX0VYRUMJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKKyNkZWZpbmUgX19QQUdFX1JFQURPTkxZCQlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOIHwgUFRFX1VYTikKKyNkZWZpbmUgX19QQUdFX1JFQURPTkxZX0VYRUMJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCkBAIC0xNDAsMjIgKzE0MCw1MyBAQAogI2RlZmluZSBwdGVfZGlydHkocHRlKQkJKHB0ZV92YWwocHRlKSAmIFBURV9ESVJUWSkKICNkZWZpbmUgcHRlX3lvdW5nKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBQVEVfQUYpCiAjZGVmaW5lIHB0ZV9zcGVjaWFsKHB0ZSkJKHB0ZV92YWwocHRlKSAmIFBURV9TUEVDSUFMKQotI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKCEocHRlX3ZhbChwdGUpICYgUFRFX1JET05MWSkpCisjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkocHRlX3ZhbChwdGUpICYgUFRFX1dSSVRFKQogI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkoIShwdGVfdmFsKHB0ZSkgJiBQVEVfVVhOKSkKIAogI2RlZmluZSBwdGVfdmFsaWRfdXNlcihwdGUpIFwKIAkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfVVNFUikpID09IChQVEVfVkFMSUQgfCBQVEVfVVNFUikpCiAKLSNkZWZpbmUgUFRFX0JJVF9GVU5DKGZuLG9wKSBcCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV8jI2ZuKHB0ZV90IHB0ZSkgeyBwdGVfdmFsKHB0ZSkgb3A7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpICY9IH5QVEVfV1JJVEU7CisJcmV0dXJuIHB0ZTsKK30KIAotUFRFX0JJVF9GVU5DKHdycHJvdGVjdCwgfD0gUFRFX1JET05MWSk7Ci1QVEVfQklUX0ZVTkMobWt3cml0ZSwgICAmPSB+UFRFX1JET05MWSk7Ci1QVEVfQklUX0ZVTkMobWtjbGVhbiwgICAmPSB+UFRFX0RJUlRZKTsKLVBURV9CSVRfRlVOQyhta2RpcnR5LCAgIHw9IFBURV9ESVJUWSk7Ci1QVEVfQklUX0ZVTkMobWtvbGQsICAgICAmPSB+UFRFX0FGKTsKLVBURV9CSVRfRlVOQyhta3lvdW5nLCAgIHw9IFBURV9BRik7Ci1QVEVfQklUX0ZVTkMobWtzcGVjaWFsLCB8PSBQVEVfU1BFQ0lBTCk7CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gUFRFX1dSSVRFOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+UFRFX0RJUlRZOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBQVEVfRElSVFk7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+UFRFX0FGOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBQVEVfQUY7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtzcGVjaWFsKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gUFRFX1NQRUNJQUw7CisJcmV0dXJuIHB0ZTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKQEAgLTE3MCw4ICsyMDEsMTAgQEAKIAlpZiAocHRlX3ZhbGlkX3VzZXIocHRlKSkgewogCQlpZiAocHRlX2V4ZWMocHRlKSkKIAkJCV9fc3luY19pY2FjaGVfZGNhY2hlKHB0ZSwgYWRkcik7Ci0JCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCQlwdGUgPSBwdGVfd3Jwcm90ZWN0KHB0ZSk7CisJCWlmIChwdGVfZGlydHkocHRlKSAmJiBwdGVfd3JpdGUocHRlKSkKKwkJCXB0ZV92YWwocHRlKSAmPSB+UFRFX1JET05MWTsKKwkJZWxzZQorCQkJcHRlX3ZhbChwdGUpIHw9IFBURV9SRE9OTFk7CiAJfQogCiAJc2V0X3B0ZShwdGVwLCBwdGUpOwpAQCAtMzQ1LDcgKzM3OCw3IEBACiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBuZXdwcm90KQogewogCWNvbnN0IHB0ZXZhbF90IG1hc2sgPSBQVEVfVVNFUiB8IFBURV9QWE4gfCBQVEVfVVhOIHwgUFRFX1JET05MWSB8Ci0JCQkgICAgICBQVEVfUFJPVF9OT05FIHwgUFRFX1ZBTElEOworCQkJICAgICAgUFRFX1BST1RfTk9ORSB8IFBURV9WQUxJRCB8IFBURV9XUklURTsKIAlwdGVfdmFsKHB0ZSkgPSAocHRlX3ZhbChwdGUpICYgfm1hc2spIHwgKHBncHJvdF92YWwobmV3cHJvdCkgJiBtYXNrKTsKIAlyZXR1cm4gcHRlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IDNkNWNmMDYuLmM0NWI3YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTEzMiw3ICsxMzIsNyBAQAogCSIJY2JuegkldzAsIDJiXG4iCiAJOiAiPSZyIiAodG1wKSwgIitRIiAocnctPmxvY2spCiAJOiAiciIgKDB4ODAwMDAwMDApCi0JOiAiY2MiLCAibWVtb3J5Iik7CisJOiAibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfd3JpdGVfdHJ5bG9jayhhcmNoX3J3bG9ja190ICpydykKQEAgLTE0Niw3ICsxNDYsNyBAQAogCSIxOlxuIgogCTogIj0mciIgKHRtcCksICIrUSIgKHJ3LT5sb2NrKQogCTogInIiICgweDgwMDAwMDAwKQotCTogImNjIiwgIm1lbW9yeSIpOworCTogIm1lbW9yeSIpOwogCiAJcmV0dXJuICF0bXA7CiB9CkBAIC0xODcsNyArMTg3LDcgQEAKIAkiCWNibnoJJXcxLCAyYlxuIgogCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSwgIitRIiAocnctPmxvY2spCiAJOgotCTogImNjIiwgIm1lbW9yeSIpOworCTogIm1lbW9yeSIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX3VubG9jayhhcmNoX3J3bG9ja190ICpydykKQEAgLTIwMSw3ICsyMDEsNyBAQAogCSIJY2JuegkldzEsIDFiXG4iCiAJOiAiPSZyIiAodG1wKSwgIj0mciIgKHRtcDIpLCAiK1EiIChydy0+bG9jaykKIAk6Ci0JOiAiY2MiLCAibWVtb3J5Iik7CisJOiAibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfcmVhZF90cnlsb2NrKGFyY2hfcndsb2NrX3QgKnJ3KQpAQCAtMjE2LDcgKzIxNiw3IEBACiAJIjE6XG4iCiAJOiAiPSZyIiAodG1wKSwgIityIiAodG1wMiksICIrUSIgKHJ3LT5sb2NrKQogCToKLQk6ICJjYyIsICJtZW1vcnkiKTsKKwk6ICJtZW1vcnkiKTsKIAogCXJldHVybiAhdG1wMjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdW5pc3RkMzIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdW5pc3RkMzIuaAppbmRleCA1ODEyNWJmLi5iYjhlYjhhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3VuaXN0ZDMyLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91bmlzdGQzMi5oCkBAIC0zOTksNyArMzk5LDEwIEBACiBfX1NZU0NBTEwoMzc1LCBzeXNfc2V0bnMpCiBfX1NZU0NBTEwoMzc2LCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpCiBfX1NZU0NBTEwoMzc3LCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KQotX19TWVNDQUxMKDM3OCwgc3lzX25pX3N5c2NhbGwpCQkJLyogMzc4IGZvciBrY21wICovCitfX1NZU0NBTEwoMzc4LCBzeXNfa2NtcCkKK19fU1lTQ0FMTCgzNzksIHN5c19maW5pdF9tb2R1bGUpCitfX1NZU0NBTEwoMzgwLCBzeXNfc2NoZWRfc2V0YXR0cikKK19fU1lTQ0FMTCgzODEsIHN5c19zY2hlZF9nZXRhdHRyKQogCiAjZGVmaW5lIF9fTlJfY29tcGF0X3N5c2NhbGxzCQkzNzkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwva3VzZXIzMi5TIGIvYXJjaC9hcm02NC9rZXJuZWwva3VzZXIzMi5TCmluZGV4IDYzYzQ4ZmYuLjc3ODcyMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2t1c2VyMzIuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9rdXNlcjMyLlMKQEAgLTM4LDEyICszOCwxMyBAQAogCS5pbnN0CTB4ZTkyZDAwZjAJCS8vCXB1c2gJCXtyNCwgcjUsIHI2LCByN30KIAkuaW5zdAkweGUxYzA0MGQwCQkvLwlsZHJkCQlyNCwgcjUsIFtyMF0KIAkuaW5zdAkweGUxYzE2MGQwCQkvLwlsZHJkCQlyNiwgcjcsIFtyMV0KLQkuaW5zdAkweGUxYjIwZTlmCQkvLyAxOglsZGFleGQJCXIwLCByMSwgW3IyXQorCS5pbnN0CTB4ZTFiMjBmOWYJCS8vIDE6CWxkcmV4ZAkJcjAsIHIxLCBbcjJdCiAJLmluc3QJMHhlMDMwMzAwNAkJLy8JZW9ycwkJcjMsIHIwLCByNAogCS5pbnN0CTB4MDAzMTMwMDUJCS8vCWVvcmVxcwkJcjMsIHIxLCByNQogCS5pbnN0CTB4MDFhMjNlOTYJCS8vCXN0bGV4ZGVxCXIzLCByNiwgW3IyXQogCS5pbnN0CTB4MDMzMzAwMDEJCS8vCXRlcWVxCQlyMywgIzEKIAkuaW5zdAkweDBhZmZmZmY5CQkvLwliZXEJCTFiCisJLmluc3QJMHhmNTdmZjA1YgkJLy8JZG1iCQlpc2gKIAkuaW5zdAkweGUyNzMwMDAwCQkvLwlyc2JzCQlyMCwgcjMsICMwCiAJLmluc3QJMHhlOGJkMDBmMAkJLy8JcG9wCQl7cjQsIHI1LCByNiwgcjd9CiAJLmluc3QJMHhlMTJmZmYxZQkJLy8JYngJCWxyCkBAIC01NSwxMSArNTYsMTIgQEAKIAogCS5hbGlnbgk1CiBfX2t1c2VyX2NtcHhjaGc6CQkJLy8gMHhmZmZmMGZjMAotCS5pbnN0CTB4ZTE5MjNlOWYJCS8vIDE6CWxkYWV4CQlyMywgW3IyXQorCS5pbnN0CTB4ZTE5MjNmOWYJCS8vIDE6CWxkcmV4CQlyMywgW3IyXQogCS5pbnN0CTB4ZTA1MzMwMDAJCS8vCXN1YnMJCXIzLCByMywgcjAKIAkuaW5zdAkweDAxODIzZTkxCQkvLwlzdGxleGVxCQlyMywgcjEsIFtyMl0KIAkuaW5zdAkweDAzMzMwMDAxCQkvLwl0ZXFlcQkJcjMsICMxCiAJLmluc3QJMHgwYWZmZmZmYQkJLy8JYmVxCQkxYgorCS5pbnN0CTB4ZjU3ZmYwNWIJCS8vCWRtYgkJaXNoCiAJLmluc3QJMHhlMjczMDAwMAkJLy8JcnNicwkJcjAsIHIzLCAjMAogCS5pbnN0CTB4ZTEyZmZmMWUJCS8vCWJ4CQlscgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMjQ4YTE1ZC4uMWMwYTliZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtODUsMTEgKzg1LDYgQEAKIHZvaWQgKCphcm1fcG1fcmVzdGFydCkoZW51bSByZWJvb3RfbW9kZSByZWJvb3RfbW9kZSwgY29uc3QgY2hhciAqY21kKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFybV9wbV9yZXN0YXJ0KTsKIAotdm9pZCBhcmNoX2NwdV9pZGxlX3ByZXBhcmUodm9pZCkKLXsKLQlsb2NhbF9maXFfZW5hYmxlKCk7Ci19Ci0KIC8qCiAgKiBUaGlzIGlzIG91ciBkZWZhdWx0IGlkbGUgaGFuZGxlci4KICAqLwpAQCAtMTM4LDcgKzEzMyw2IEBACiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgZmlyc3QgKi8KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWxvY2FsX2ZpcV9kaXNhYmxlKCk7CiAKIAkvKiBOb3cgY2FsbCB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHJlYm9vdCBjb2RlLiAqLwogCWlmIChhcm1fcG1fcmVzdGFydCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKaW5kZXggMWI3NjE3YS4uN2NmYjkyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKQEAgLTE2MSw3ICsxNjEsNiBAQAogCWNvbXBsZXRlKCZjcHVfcnVubmluZyk7CiAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JbG9jYWxfZmlxX2VuYWJsZSgpOwogCWxvY2FsX2FzeW5jX2VuYWJsZSgpOwogCiAJLyoKQEAgLTQ5NSw3ICs0OTQsNiBAQAogCiAJc2V0X2NwdV9vbmxpbmUoY3B1LCBmYWxzZSk7CiAKLQlsb2NhbF9maXFfZGlzYWJsZSgpOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAl3aGlsZSAoMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3N1c3BlbmQuYyBiL2FyY2gvYXJtNjQva2VybmVsL3N1c3BlbmQuYwppbmRleCA0MzAzNDRlLi4xZmE5Y2U0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zdXNwZW5kLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jcHVfb3BzLmg+CkBAIC04OSw2ICs5MCwxMyBAQAogCWlmIChyZXQgPT0gMCkgewogCQljcHVfc3dpdGNoX21tKG1tLT5wZ2QsIG1tKTsKIAkJZmx1c2hfdGxiX2FsbCgpOworCisJCS8qCisJCSAqIFJlc3RvcmUgcGVyLWNwdSBvZmZzZXQgYmVmb3JlIGFueSBrZXJuZWwKKwkJICogc3Vic3lzdGVtIHJlbHlpbmcgb24gaXQgaGFzIGEgY2hhbmNlIHRvIHJ1bi4KKwkJICovCisJCXNldF9teV9jcHVfb2Zmc2V0KHBlcl9jcHVfb2Zmc2V0KGNwdSkpOworCiAJCS8qCiAJCSAqIFJlc3RvcmUgSFcgYnJlYWtwb2ludCByZWdpc3RlcnMgdG8gc2FuZSB2YWx1ZXMKIAkJICogYmVmb3JlIGRlYnVnIGV4Y2VwdGlvbnMgYXJlIHBvc3NpYmx5IHJlZW5hYmxlZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCmluZGV4IDY1ZDQwY2YuLmE3MTQ5Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKQEAgLTIzOCw2ICsyMzgsOCBAQAogCXZkc29fZGF0YS0+dXNlX3N5c2NhbGwJCQk9IHVzZV9zeXNjYWxsOwogCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX3NlYwkJPSB4dGltZV9jb2Fyc2UudHZfc2VjOwogCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX25zZWMJCT0geHRpbWVfY29hcnNlLnR2X25zZWM7CisJdmRzb19kYXRhLT53dG1fY2xvY2tfc2VjCQk9IHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7CisJdmRzb19kYXRhLT53dG1fY2xvY2tfbnNlYwkJPSB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYzsKIAogCWlmICghdXNlX3N5c2NhbGwpIHsKIAkJdmRzb19kYXRhLT5jc19jeWNsZV9sYXN0CT0gdGstPmNsb2NrLT5jeWNsZV9sYXN0OwpAQCAtMjQ1LDggKzI0Nyw2IEBACiAJCXZkc29fZGF0YS0+eHRpbWVfY2xvY2tfbnNlYwk9IHRrLT54dGltZV9uc2VjOwogCQl2ZHNvX2RhdGEtPmNzX211bHQJCT0gdGstPm11bHQ7CiAJCXZkc29fZGF0YS0+Y3Nfc2hpZnQJCT0gdGstPnNoaWZ0OwotCQl2ZHNvX2RhdGEtPnd0bV9jbG9ja19zZWMJPSB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCQl2ZHNvX2RhdGEtPnd0bV9jbG9ja19uc2VjCT0gdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWM7CiAJfQogCiAJc21wX3dtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28vTWFrZWZpbGUKaW5kZXggZDgwNjRhZi4uNmQyMGI3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2tlcm5lbC92ZHNvL01ha2VmaWxlCkBAIC00OCw3ICs0OCw3IEBACiAKICMgQWN0dWFsIGJ1aWxkIGNvbW1hbmRzCiBxdWlldF9jbWRfdmRzb2xkID0gVkRTT0wgJEAKLSAgICAgIGNtZF92ZHNvbGQgPSAkKENDKSAkKGNfZmxhZ3MpIC1XbCwtVCAkXiAtbyAkQAorICAgICAgY21kX3Zkc29sZCA9ICQoQ0MpICQoY19mbGFncykgLVdsLC1uIC1XbCwtVCAkXiAtbyAkQAogcXVpZXRfY21kX3Zkc29hcyA9IFZEU09BICRACiAgICAgICBjbWRfdmRzb2FzID0gJChDQykgJChhX2ZsYWdzKSAtYyAtbyAkQCAkPAogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvL2dldHRpbWVvZmRheS5TIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby9nZXR0aW1lb2ZkYXkuUwppbmRleCBmMGE2ZDEwLi5mZTY1MmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvL2dldHRpbWVvZmRheS5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28vZ2V0dGltZW9mZGF5LlMKQEAgLTEwMyw2ICsxMDMsOCBAQAogCWJsCV9fZG9fZ2V0X3RzcGVjCiAJc2VxY250X2NoZWNrIHc5LCAxYgogCisJbW92CXgzMCwgeDIKKwogCWNtcAl3MCwgI0NMT0NLX01PTk9UT05JQwogCWIubmUJNmYKIApAQCAtMTE4LDYgKzEyMCw5IEBACiAJY2NtcAl3MCwgI0NMT0NLX01PTk9UT05JQ19DT0FSU0UsICMweDQsIG5lCiAJYi5uZQk4ZgogCisJLyogeHRpbWVfY29hcnNlX25zZWMgaXMgYWxyZWFkeSByaWdodC1zaGlmdGVkICovCisJbW92CXgxMiwgIzAKKwogCS8qIEdldCBjb2Fyc2UgdGltZXNwZWMuICovCiAJYWRyCXZkc29fZGF0YSwgX3Zkc29fZGF0YQogMzoJc2VxY250X2FjcXVpcmUKQEAgLTE1Niw3ICsxNjEsNyBAQAogCWxzcgl4MTEsIHgxMSwgeDEyCiAJc3RwCXgxMCwgeDExLCBbeDEsICNUU1BFQ19UVl9TRUNdCiAJbW92CXgwLCB4enIKLQlyZXQJeDIKKwlyZXQKIDc6CiAJbW92CXgzMCwgeDIKIDg6CS8qIFN5c2NhbGwgZmFsbGJhY2suICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2xpYi9iaXRvcHMuUyBiL2FyY2gvYXJtNjQvbGliL2JpdG9wcy5TCmluZGV4IGU1ZGI3OTcuLjdkYWMzNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbGliL2JpdG9wcy5TCisrKyBiL2FyY2gvYXJtNjQvbGliL2JpdG9wcy5TCkBAIC00NiwxMSArNDYsMTIgQEAKIAltb3YJeDIsICMxCiAJYWRkCXgxLCB4MSwgeDAsIGxzciAjMwkvLyBHZXQgd29yZCBvZmZzZXQKIAlsc2wJeDQsIHgyLCB4MwkJLy8gQ3JlYXRlIG1hc2sKLTE6CWxkYXhyCXgyLCBbeDFdCisxOglsZHhyCXgyLCBbeDFdCiAJbHNyCXgwLCB4MiwgeDMJCS8vIFNhdmUgb2xkIHZhbHVlIG9mIGJpdAogCVxpbnN0cgl4MiwgeDIsIHg0CQkvLyB0b2dnbGUgYml0CiAJc3RseHIJdzUsIHgyLCBbeDFdCiAJY2Juegl3NSwgMWIKKwlkbWIJaXNoCiAJYW5kCXgwLCB4MCwgIzEKIDM6CXJldAogRU5EUFJPQyhcbmFtZQkpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2NhY2hlLlMgYi9hcmNoL2FybTY0L21tL2NhY2hlLlMKaW5kZXggNDhhMzg2MC4uMWVhOWYyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9jYWNoZS5TCisrKyBiL2FyY2gvYXJtNjQvbW0vY2FjaGUuUwpAQCAtMTQ2LDcgKzE0Niw3IEBACiBFTkRQUk9DKF9fZmx1c2hfY2FjaGVfdXNlcl9yYW5nZSkKIAogLyoKLSAqCV9fZmx1c2hfa2Vybl9kY2FjaGVfcGFnZShrYWRkcikKKyAqCV9fZmx1c2hfZGNhY2hlX2FyZWEoa2FkZHIsIHNpemUpCiAgKgogICoJRW5zdXJlIHRoYXQgdGhlIGRhdGEgaGVsZCBpbiB0aGUgcGFnZSBrYWRkciBpcyB3cml0dGVuIGJhY2sgdG8gdGhlCiAgKglwYWdlIGluIHF1ZXN0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCmluZGV4IDQ1YjVhYjUuLmZiZDc2NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfRE1BX0NNQSkpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKKwkJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CiAJCXBhZ2UgPSBkbWFfYWxsb2NfZnJvbV9jb250aWd1b3VzKGRldiwgc2l6ZSA+PiBQQUdFX1NISUZULAogCQkJCQkJCWdldF9vcmRlcihzaXplKSk7CiAJCWlmICghcGFnZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbW11LmMgYi9hcmNoL2FybTY0L21tL21tdS5jCmluZGV4IGY1NTdlYmIuLmY4ZGM3ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vbW11LmMKKysrIGIvYXJjaC9hcm02NC9tbS9tbXUuYwpAQCAtMjAzLDEwICsyMDMsMTggQEAKIAlkbyB7CiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKIAkJLyogdHJ5IHNlY3Rpb24gbWFwcGluZyBmaXJzdCAqLwotCQlpZiAoKChhZGRyIHwgbmV4dCB8IHBoeXMpICYgflNFQ1RJT05fTUFTSykgPT0gMCkKKwkJaWYgKCgoYWRkciB8IG5leHQgfCBwaHlzKSAmIH5TRUNUSU9OX01BU0spID09IDApIHsKKwkJCXBtZF90IG9sZF9wbWQgPSpwbWQ7CiAJCQlzZXRfcG1kKHBtZCwgX19wbWQocGh5cyB8IHByb3Rfc2VjdF9rZXJuZWwpKTsKLQkJZWxzZQorCQkJLyoKKwkJCSAqIENoZWNrIGZvciBwcmV2aW91cyB0YWJsZSBlbnRyaWVzIGNyZWF0ZWQgZHVyaW5nCisJCQkgKiBib290IChfX2NyZWF0ZV9wYWdlX3RhYmxlcykgYW5kIGZsdXNoIHRoZW0uCisJCQkgKi8KKwkJCWlmICghcG1kX25vbmUob2xkX3BtZCkpCisJCQkJZmx1c2hfdGxiX2FsbCgpOworCQl9IGVsc2UgewogCQkJYWxsb2NfaW5pdF9wdGUocG1kLCBhZGRyLCBuZXh0LCBfX3BoeXNfdG9fcGZuKHBoeXMpKTsKKwkJfQogCQlwaHlzICs9IG5leHQgLSBhZGRyOwogCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9wZ2QuYyBiL2FyY2gvYXJtNjQvbW0vcGdkLmMKaW5kZXggNzA4M2NkYS4uNjJjNjEwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wZ2QuYworKysgYi9hcmNoL2FybTY0L21tL3BnZC5jCkBAIC0zMiwxNyArMzIsMTAgQEAKIAogcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlwZ2RfdCAqbmV3X3BnZDsKLQogCWlmIChQR0RfU0laRSA9PSBQQUdFX1NJWkUpCi0JCW5ld19wZ2QgPSAocGdkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCXJldHVybiAocGdkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJZWxzZQotCQluZXdfcGdkID0ga3phbGxvYyhQR0RfU0laRSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW5ld19wZ2QpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG5ld19wZ2Q7CisJCXJldHVybiBremFsbG9jKFBHRF9TSVpFLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcHJvYy1tYWNyb3MuUyBiL2FyY2gvYXJtNjQvbW0vcHJvYy1tYWNyb3MuUwppbmRleCA4OTU3YjgyLi4wMDVkMjllIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3Byb2MtbWFjcm9zLlMKKysrIGIvYXJjaC9hcm02NC9tbS9wcm9jLW1hY3Jvcy5TCkBAIC0zOCw4ICszOCw3IEBACiAgKi8KIAkubWFjcm8JZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKIAltcnMJXHRtcCwgY3RyX2VsMAkJCS8vIHJlYWQgQ1RSCi0JbHNyCVx0bXAsIFx0bXAsICMxNgotCWFuZAlcdG1wLCBcdG1wLCAjMHhmCQkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKKwl1YmZtCVx0bXAsIFx0bXAsICMxNiwgIzE5CQkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKIAltb3YJXHJlZywgIzQJCQkvLyBieXRlcyBwZXIgd29yZAogCWxzbAlccmVnLCBccmVnLCBcdG1wCQkvLyBhY3R1YWwgY2FjaGUgbGluZSBzaXplCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcHJvYy5TIGIvYXJjaC9hcm02NC9tbS9wcm9jLlMKaW5kZXggYmVkMWYxZC4uMTMzM2U2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wcm9jLlMKKysrIGIvYXJjaC9hcm02NC9tbS9wcm9jLlMKQEAgLTE1MCw3ICsxNTAsNyBAQAogI2VuZGlmCiAKIC8qCi0gKgljcHVfc3dpdGNoX21tKHBnZF9waHlzLCB0c2spCisgKgljcHVfZG9fc3dpdGNoX21tKHBnZF9waHlzLCB0c2spCiAgKgogICoJU2V0IHRoZSB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIHBvaW50ZXIgdG8gYmUgcGdkX3BoeXMuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKaW5kZXggOTBiMTc1My4uYWYyNzM4YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCkBAIC0xNDYsNiArMTQ2LDcgQEAKIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUI9eQogQ09ORklHX1VTQl9NT049eQogQ09ORklHX1VTQl9NVVNCX0hEUkM9eQorQ09ORklHX01VU0JfUElPX09OTFk9eQogQ09ORklHX1VTQl9NVVNCX0JMQUNLRklOPXkKIENPTkZJR19NVVNCX1BJT19PTkxZPXkKIENPTkZJR19VU0JfU1RPUkFHRT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM4LUVaS0lUX2RlZmNvbmZpZwppbmRleCA5NzJhYTYyLi5iZTAzYmU2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzOC1FWktJVF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj1tCiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1BQ1ZJTE9OX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1BQ1ZJTE9OX2RlZmNvbmZpZwppbmRleCA5MTk4ODM3Li44MDJmOWM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtQUNWSUxPTl9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUFDVklMT05fZGVmY29uZmlnCkBAIC00OSw3ICs0OSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcKaW5kZXggN2I5ODJkMC4uMzg1M2M0NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZwpAQCAtNDQsNyArNDQsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPW0KIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcKaW5kZXggYzk0MGExZS4uNWUwZGI4MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzNfZGVmY29uZmlnCkBAIC0zNiw3ICszNiw2IEBACiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCmluZGV4IGU5NjE0ODMuLmI5YWY0ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwpAQCAtNTMsNyArNTMsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcKaW5kZXggMjQ5MzZiOS4uZDZkZDk4ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NjFfZGVmY29uZmlnCkBAIC01MSw3ICs1MSw2IEBACiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9ETlA1MzcwX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9ETlA1MzcwX2RlZmNvbmZpZwppbmRleCA4OTE2MmQwLi4yYjU4Y2IyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvRE5QNTM3MF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0ROUDUzNzBfZGVmY29uZmlnCkBAIC0zNiw3ICszNiw2IEBACiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfREVCVUc9eQogQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTEKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTkZUTD15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwppbmRleCBhMjY0MzZiLi5mNzU0ZTQ5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKQEAgLTM2LDcgKzM2LDYgQEAKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX1JBTT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSVAwWF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSVAwWF9kZWZjb25maWcKaW5kZXggNjQ3OTkxNS4uNjI5NTE2NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0lQMFhfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZwpAQCAtNDMsNyArNDMsNiBAQAogQ09ORklHX0lQX05GX01BTkdMRT15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0NGST15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcKaW5kZXggOGZkOWI0NC4uYTZhNzI5OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9QTkFWLTEwX2RlZmNvbmZpZwpAQCAtNDYsNyArNDYsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9bQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX1JBTT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvU1JWMV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvU1JWMV9kZWZjb25maWcKaW5kZXggMDUyMGMxNi4uYmMyMTY2NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1NSVjFfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZwpAQCAtMzgsNyArMzgsNiBAQAogIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj1tCiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfSkVERUNQUk9CRT1tCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvVENNLUJGNTE4X2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9UQ00tQkY1MThfZGVmY29uZmlnCmluZGV4IGU0ZWQ4NjUuLmVhODgxNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9UQ00tQkY1MThfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9UQ00tQkY1MThfZGVmY29uZmlnCkBAIC01NCw3ICs1NCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RlZl9MUEJsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RlZl9MUEJsYWNrZmluLmgKaW5kZXggY2E2NzE0NS4uYzVjOGQ4YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kZWZfTFBCbGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZGVmX0xQQmxhY2tmaW4uaApAQCAtNTQ0LDYgKzU0NCw3IEBACiAjZGVmaW5lIERDQlNfUAkJCTB4MDQJLyogTDEgRGF0YSBDYWNoZSBCYW5rIFNlbGVjdCAqLwogI2RlZmluZSBQT1JUX1BSRUYwX1AJCTB4MTIJLyogREFHMCBQb3J0IFByZWZlcmVuY2UgKi8KICNkZWZpbmUgUE9SVF9QUkVGMV9QCQkweDEzCS8qIERBRzEgUG9ydCBQcmVmZXJlbmNlICovCisjZGVmaW5lIFJEQ0hLCQkJMHg5CS8qIEVuYWJsZSBMMSBQYXJpdHkgQ2hlY2sgKi8KIAogLyogTWFza3MgKi8KICNkZWZpbmUgRU5ETSAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogKGRvZXNuJ3QgcmVhbGx5IGV4aXN0KSBFbmFibGUKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9ieXRlb3JkZXIuaAppbmRleCA5NTU4NDE2Li4zYjEyNWRhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL2J5dGVvcmRlci5oCkBAIC0xICsxLDYgQEAKKyNpZm5kZWYgX1VBUElfX0JGSU5fQVNNX0JZVEVPUkRFUl9ICisjZGVmaW5lIF9VQVBJX19CRklOX0FTTV9CWVRFT1JERVJfSAorCiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKworI2VuZGlmIC8qIF9VQVBJX19CRklOX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL2NhY2hlY3RsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vY2FjaGVjdGwuaAppbmRleCAwMzI1NWRmLi40ZmRhYjc1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vY2FjaGVjdGwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vY2FjaGVjdGwuaApAQCAtNyw4ICs3LDggQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaWZuZGVmCV9BU01fQ0FDSEVDVEwKLSNkZWZpbmUJX0FTTV9DQUNIRUNUTAorI2lmbmRlZiBfVUFQSV9BU01fQ0FDSEVDVEwKKyNkZWZpbmUgX1VBUElfQVNNX0NBQ0hFQ1RMCiAKIC8qCiAgKiBPcHRpb25zIGZvciBjYWNoZWZsdXNoIHN5c3RlbSBjYWxsCkBAIC0xNyw0ICsxNyw0IEBACiAjZGVmaW5lCURDQUNIRQkoMTw8MSkJCS8qIHdyaXRlYmFjayBhbmQgZmx1c2ggZGF0YSBjYWNoZSAqLwogI2RlZmluZQlCQ0FDSEUJKElDQUNIRXxEQ0FDSEUpCS8qIGZsdXNoIGJvdGggY2FjaGVzICAgICAgICAgICAgICAqLwogCi0jZW5kaWYJLyogX0FTTV9DQUNIRUNUTCAqLworI2VuZGlmIC8qIF9VQVBJX0FTTV9DQUNIRUNUTCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL2ZjbnRsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vZmNudGwuaAppbmRleCAyNTFjOTExLi5mNTFhZDlhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vZmNudGwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vZmNudGwuaApAQCAtNCw4ICs0LDggQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaWZuZGVmIF9CRklOX0ZDTlRMX0gKLSNkZWZpbmUgX0JGSU5fRkNOVExfSAorI2lmbmRlZiBfVUFQSV9CRklOX0ZDTlRMX0gKKyNkZWZpbmUgX1VBUElfQkZJTl9GQ05UTF9ICiAKICNkZWZpbmUgT19ESVJFQ1RPUlkJIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KQEAgLTE0LDQgKzE0LDQgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNlbmRpZgorI2VuZGlmIC8qIF9VQVBJX0JGSU5fRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL2lvY3Rscy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL2lvY3Rscy5oCmluZGV4IGVjYThkNzUuLjlhNDFjMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9pb2N0bHMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vaW9jdGxzLmgKQEAgLTEsNyArMSw3IEBACi0jaWZuZGVmIF9fQVJDSF9CRklOX0lPQ1RMU19IX18KLSNkZWZpbmUgX19BUkNIX0JGSU5fSU9DVExTX0hfXworI2lmbmRlZiBfVUFQSV9fQVJDSF9CRklOX0lPQ1RMU19IX18KKyNkZWZpbmUgX1VBUElfX0FSQ0hfQkZJTl9JT0NUTFNfSF9fCiAKICNkZWZpbmUgRklPUVNJWkUJMHg1NDVFCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGxzLmg+CiAKLSNlbmRpZgorI2VuZGlmIC8qIF9VQVBJX19BUkNIX0JGSU5fSU9DVExTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3BvbGwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9wb2xsLmgKaW5kZXggMDcyZDg5Ni4uOTljN2Q2OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3BvbGwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vcG9sbC5oCkBAIC01LDEyICs1LDEyIEBACiAgKgogICovCiAKLSNpZm5kZWYgX19CRklOX1BPTExfSAotI2RlZmluZSBfX0JGSU5fUE9MTF9ICisjaWZuZGVmIF9VQVBJX19CRklOX1BPTExfSAorI2RlZmluZSBfVUFQSV9fQkZJTl9QT0xMX0gKIAogI2RlZmluZSBQT0xMV1JOT1JNCTQgLyogUE9MTE9VVCAqLwogI2RlZmluZSBQT0xMV1JCQU5ECTI1NgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgogCi0jZW5kaWYKKyNlbmRpZiAvKiBfVUFQSV9fQkZJTl9QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9wb3NpeF90eXBlcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3Bvc2l4X3R5cGVzLmgKaW5kZXggMWJkMzQzNi4uOTYwOGVmNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3Bvc2l4X3R5cGVzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTQsOCArNCw4IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAotI2lmbmRlZiBfX0FSQ0hfQkZJTl9QT1NJWF9UWVBFU19ICi0jZGVmaW5lIF9fQVJDSF9CRklOX1BPU0lYX1RZUEVTX0gKKyNpZm5kZWYgX1VBUElfX0FSQ0hfQkZJTl9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9VQVBJX19BUkNIX0JGSU5fUE9TSVhfVFlQRVNfSAogCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fa2VybmVsX21vZGVfdDsKICNkZWZpbmUgX19rZXJuZWxfbW9kZV90IF9fa2VybmVsX21vZGVfdApAQCAtMjcsNCArMjcsNCBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9zaXhfdHlwZXMuaD4KIAotI2VuZGlmCisjZW5kaWYgLyogX1VBUElfX0FSQ0hfQkZJTl9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3NpZ2NvbnRleHQuaAppbmRleCA5MDZiZGMxLi5iNThmMTJkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9zaWdjb250ZXh0LmgKQEAgLTQsOCArNCw4IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAotI2lmbmRlZiBfQVNNX0JMQUNLRklOX1NJR0NPTlRFWFRfSAotI2RlZmluZSBfQVNNX0JMQUNLRklOX1NJR0NPTlRFWFRfSAorI2lmbmRlZiBfVUFQSV9BU01fQkxBQ0tGSU5fU0lHQ09OVEVYVF9ICisjZGVmaW5lIF9VQVBJX0FTTV9CTEFDS0ZJTl9TSUdDT05URVhUX0gKIAogLyogQWRkIG5ldyBlbnRyaWVzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBvbmx5LiAgKi8KIHN0cnVjdCBzaWdjb250ZXh0IHsKQEAgLTU4LDQgKzU4LDQgQEAKIAl1bnNpZ25lZCBsb25nIHNjX3NlcXN0YXQ7CiB9OwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfVUFQSV9BU01fQkxBQ0tGSU5fU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc2lnaW5mby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3NpZ2luZm8uaAppbmRleCAzZTgxMzA2Li5jNzJmNGU2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc2lnaW5mby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9zaWdpbmZvLmgKQEAgLTQsOCArNCw4IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAotI2lmbmRlZiBfQkZJTl9TSUdJTkZPX0gKLSNkZWZpbmUgX0JGSU5fU0lHSU5GT19ICisjaWZuZGVmIF9VQVBJX0JGSU5fU0lHSU5GT19ICisjZGVmaW5lIF9VQVBJX0JGSU5fU0lHSU5GT19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KQEAgLTM4LDQgKzM4LDQgQEAKICAqLwogI2RlZmluZSBTRUdWX1NUQUNLRkxPVwkoX19TSV9GQVVMVHwzKQkvKiBzdGFjayBvdmVyZmxvdyAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfVUFQSV9CRklOX1NJR0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3NpZ25hbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3NpZ25hbC5oCmluZGV4IDc3YTNiZjMuLmYwYTBkOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9zaWduYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc2lnbmFsLmgKQEAgLTEsNyArMSw3IEBACi0jaWZuZGVmIF9CTEFDS0ZJTl9TSUdOQUxfSAotI2RlZmluZSBfQkxBQ0tGSU5fU0lHTkFMX0gKKyNpZm5kZWYgX1VBUElfQkxBQ0tGSU5fU0lHTkFMX0gKKyNkZWZpbmUgX1VBUElfQkxBQ0tGSU5fU0lHTkFMX0gKIAogI2RlZmluZSBTQV9SRVNUT1JFUiAweDA0MDAwMDAwCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CiAKLSNlbmRpZgorI2VuZGlmIC8qIF9VQVBJX0JMQUNLRklOX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc3RhdC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3N0YXQuaAppbmRleCAyZTI3NjY1Li5kMzA2OGE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc3RhdC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9zdGF0LmgKQEAgLTQsOCArNCw4IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCiAgKi8KIAotI2lmbmRlZiBfQkZJTl9TVEFUX0gKLSNkZWZpbmUgX0JGSU5fU1RBVF9ICisjaWZuZGVmIF9VQVBJX0JGSU5fU1RBVF9ICisjZGVmaW5lIF9VQVBJX0JGSU5fU1RBVF9ICiAKIHN0cnVjdCBzdGF0IHsKIAl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7CkBAIC02Niw0ICs2Niw0IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHN0X2lubzsKIH07CiAKLSNlbmRpZgkJCQkvKiBfQkZJTl9TVEFUX0ggKi8KKyNlbmRpZiAvKiBfVUFQSV9CRklOX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3N3YWIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS91YXBpL2FzbS9zd2FiLmgKaW5kZXggODlkZTY1MC4uZjU2MjZiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL3VhcGkvYXNtL3N3YWIuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvdWFwaS9hc20vc3dhYi5oCkBAIC00LDggKzQsOCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpZm5kZWYgX0JMQUNLRklOX1NXQUJfSAotI2RlZmluZSBfQkxBQ0tGSU5fU1dBQl9ICisjaWZuZGVmIF9VQVBJX0JMQUNLRklOX1NXQUJfSAorI2RlZmluZSBfVUFQSV9CTEFDS0ZJTl9TV0FCX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3dhYi5oPgpAQCAtNDcsNCArNDcsNCBAQAogCiAjZW5kaWYgLyogX19HTlVDX18gKi8KIAotI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9TV0FCX0ggKi8KKyNlbmRpZiAvKiBfVUFQSV9CTEFDS0ZJTl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCA0YThjMmUzLi40ZGE3MGM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC0zNzAsNyArMzcwLDggQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBcCisJZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVDBfVUFSVAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Nwb3J0MF91YXJ0X3Jlc291cmNlc1tdID0gewogCXsKQEAgLTQ0MSw2ICs0NDIsNTAgQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQT1JUX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcG9ydDBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBTUE9SVDBfVENSMSwKKwkJLmVuZCA9IFNQT1JUMF9NUkNTMys0LAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1NQT1JUMF9UWCwKKwkJLmVuZCA9IElSUV9TUE9SVDBfVFgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9TUE9SVDBfUlgsCisJCS5lbmQgPSBJUlFfU1BPUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfU1BPUlQwX0VSUk9SLAorCQkuZW5kID0gSVJRX1NQT1JUMF9FUlJPUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1NQT1JUMF9UWCwKKwkJLmVuZCA9IENIX1NQT1JUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1NQT1JUMF9SWCwKKwkJLmVuZCA9IENIX1NQT1JUMF9SWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zcG9ydF9yYXciLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BvcnQwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zcG9ydDBfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzLAorCX0sCit9OworI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNjA5L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvS2NvbmZpZwppbmRleCBiMGZjYTQ0Li42NTg0MTkwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvS2NvbmZpZwpAQCAtMTcsNiArMTcsMTIgQEAKIAkgIERpdmlkZSB0aGUgdG90YWwgbnVtYmVyIG9mIGludGVycnVwdCBwcmlvcml0eSBsZXZlbHMgaW50byBzdWItbGV2ZWxzLgogCSAgVGhlcmUgaXMgMiBeIChTRUNfSVJRX1BSSU9SSVRZX0xFVkVMUyArIDEpIGRpZmZlcmVudCBsZXZlbHMuCiAKK2NvbmZpZyBMMV9QQVJJVFlfQ0hFQ0sKKwlib29sICJFbmFibGUgTDEgcGFyaXR5IGNoZWNrIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSB0aGUgTDEgcGFyaXR5IGNoZWNrIGluIEwxIHNyYW0uIEEgZmF1bHQgZXZlbnQgaXMgcmFpc2VkCisJICB3aGVuIEwxIHBhcml0eSBlcnJvciBpcyBmb3VuZC4KIAogY29tbWVudCAiU3lzdGVtIENyb3NzIEJhciBQcmlvcml0eSBBc3NpZ25tZW50IgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvYm9hcmRzL2V6a2l0LmMKaW5kZXggMDUxOTRlOS4uOGRlOGJjNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNjA5L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjYwOS9ib2FyZHMvZXpraXQuYwpAQCAtMTAyNSw3ICsxMDI1LDkgQEAKIAkuYWluX3NlbCA9IEFEVjc4NDJfQUlOMTBfMTFfMTJfTkNfU1lOQ180XzEsCiAJLnByaW1fbW9kZSA9IEFEVjc4NDJfUFJJTV9NT0RFX1NEUCwKIAkudmlkX3N0ZF9zZWxlY3QgPSBBRFY3ODQyX1NEUF9WSURfU1REX0NWQlNfU0RfNHgxLAotCS5pbnBfY29sb3Jfc3BhY2UgPSBBRFY3ODQyX0lOUF9DT0xPUl9TUEFDRV9BVVRPLAorCS5oZG1pX2ZyZWVfcnVuX2VuYWJsZSA9IDEsCisJLnNkcF9mcmVlX3J1bl9hdXRvID0gMSwKKwkubGxjX2RsbF9waGFzZSA9IDB4MTAsCiAJLmkyY19zZHBfaW8gPSAweDQwLAogCS5pMmNfc2RwID0gMHg0MSwKIAkuaTJjX2NwID0gMHg0MiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjYwOS9jbG9jay5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNjA5L2Nsb2NrLmMKaW5kZXggZGFiODg0OS4uMTM2NDRlZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNjA5L2Nsb2NrLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNjA5L2Nsb2NrLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CiAKKwogdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKQEAgLTEzMSw3ICsxMzIsNyBAQAogCiBsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewotCWxvbmcgcmV0ID0gLUVJTzsKKwlsb25nIHJldCA9IDA7CiAJaWYgKGNsay0+b3BzICYmIGNsay0+b3BzLT5yb3VuZF9yYXRlKQogCQlyZXQgPSBjbGstPm9wcy0+cm91bmRfcmF0ZShjbGssIHJhdGUpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY2MDkvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjYwOS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDdhMDczNzQuLjY5Njc4NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjYwOS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjYwOS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0yMywxMSArMjMsMTEgQEAKIC8qIFRSVV9TVEFULkFERFJFUlIgYW5kIFRSVV9FUlJBRERSLkFERFIgTWF5IE5vdCBSZWZsZWN0IHRoZSBDb3JyZWN0IFN0YXR1cyAqLwogI2RlZmluZSBBTk9NQUxZXzE2MDAwMDAzICgxKQogLyogVGhlIEVQUEkgRGF0YSBFbmFibGUgKERFTikgU2lnbmFsIGlzIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMTYwMDAwMDQgKDEpCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIFVzaW5nIEwxIEluc3RydWN0aW9uIENhY2hlIHdpdGggUGFyaXR5IEVuYWJsZWQgaXMgVW5yZWxpYWJsZSAqLwotI2RlZmluZSBBTk9NQUxZXzE2MDAwMDA1ICgxKQorI2RlZmluZSBBTk9NQUxZXzE2MDAwMDA1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBTRVFTVEFULlNZU05NSSBDbGVhcnMgVXBvbiBFbnRlcmluZyB0aGUgTk1JIElTUiAqLwotI2RlZmluZSBBTk9NQUxZXzE2MDAwMDA2ICgxKQorI2RlZmluZSBBTk9NQUxZXzE2MDAwMDA2IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBERFIyIE1lbW9yeSBSZWFkcyBNYXkgRmFpbCBJbnRlcm1pdHRlbnRseSAqLwogI2RlZmluZSBBTk9NQUxZXzE2MDAwMDA3ICgxKQogLyogSW5zdHJ1Y3Rpb24gTWVtb3J5IFN0YWxscyBDYW4gQ2F1c2UgSUZMVVNIIHRvIEZhaWwgKi8KQEAgLTQ5LDE5ICs0OSw1MyBAQAogLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLwogI2RlZmluZSBBTk9NQUxZXzE2MDAwMDE3ICgxKQogLyogUlNJIEJvb3QgQ2xlYW51cCBSb3V0aW5lIERvZXMgTm90IENsZWFyIFJlZ2lzdGVycyAqLwotI2RlZmluZSBBTk9NQUxZXzE2MDAwMDE4ICgxKQorI2RlZmluZSBBTk9NQUxZXzE2MDAwMDE4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBTUEkgTWFzdGVyIEJvb3QgRGV2aWNlIEF1dG8tZGV0ZWN0aW9uIEZyZXF1ZW5jeSBpcyBTZXQgSW5jb3JyZWN0bHkgKi8KLSNkZWZpbmUgQU5PTUFMWV8xNjAwMDAxOSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAxOSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogcm9tX1N5c0NvbnRyb2woKSBGYWlscyB0byBTZXQgRERSMF9DVEwuSU5JVCBmb3IgV2FrZXVwIEZyb20gSGliZXJuYXRlICovCi0jZGVmaW5lIEFOT01BTFlfMTYwMDAwMjAgKDEpCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMjAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIHJvbV9TeXNDb250cm9sKCkgRmFpbHMgdG8gU2F2ZSBhbmQgUmVzdG9yZSBERFIwX1BIWUNUTDMgZm9yIEhpYmVybmF0ZS9XYWtldXAgU2VxdWVuY2UgKi8KLSNkZWZpbmUgQU5PTUFMWV8xNjAwMDAyMSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAyMSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogQm9vdCBDb2RlIEZhaWxzIHRvIEVuYWJsZSBQYXJpdHkgRmF1bHQgRGV0ZWN0aW9uICovCi0jZGVmaW5lIEFOT01BTFlfMTYwMDAwMjIgKDEpCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMjIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIFJvbV9TeXNDb250cm9sIERvZXMgbm90IFVwZGF0ZSBDR1UwX0NMS09VVFNFTCAqLworI2RlZmluZSBBTk9NQUxZXzE2MDAwMDIzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBTcHVyaW91cyBGYXVsdCBTaWduYWxlZCBBZnRlciBDbGVhcmluZyBhbiBFeHRlcm5hbGx5IEdlbmVyYXRlZCBGYXVsdCAqLworI2RlZmluZSBBTk9NQUxZXzE2MDAwMDI0ICgxKQorLyogU1BPUlQgTWF5IERyaXZlIERhdGEgUGlucyBEdXJpbmcgSW5hY3RpdmUgQ2hhbm5lbHMgaW4gTXVsdGljaGFubmVsIE1vZGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAyNSAoMSkKIC8qIFVTQiBETUEgaW50ZXJydXB0IHN0YXR1cyBkbyBub3Qgc2hvdyB0aGUgRE1BIGNoYW5uZWwgaW50ZXJydXB0IGluIHRoZSBETUEgSVNSICovCi0jZGVmaW5lIEFOT01BTFlfMTYwMDAwMjcgKDEpCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMjcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIERlZmF1bHQgU1BJIE1hc3RlciBCb290IE1vZGUgU2V0dGluZyBpcyBJbmNvcnJlY3QgKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAyOCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogUFBJIHRERlNQSSBUaW1pbmcgRG9lcyBOb3QgTWVldCBEYXRhIFNoZWV0IFNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAyNyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogSW50ZXJydXB0ZWQgQ29yZSBSZWFkcyBvZiBNTVJzIE1heSBDYXVzZSBEYXRhIExvc3MgKi8KLSNkZWZpbmUgQU5PTUFMWV8xNjAwMDAzMCAoMSkKKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAzMCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogSW5jb3JyZWN0IERlZmF1bHQgVVNCX1BMTF9PU0MuUExMTSBWYWx1ZSAqLworI2RlZmluZSBBTk9NQUxZXzE2MDAwMDMxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBDb3JlIFJlYWRzIG9mIFN5c3RlbSBNTVJzIE1heSBDYXVzZSB0aGUgQ29yZSB0byBIYW5nICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIFBQSSBEYXRhIFVuZGVyZmxvdyBvbiBGaXJzdCBXb3JkIE5vdCBSZXBvcnRlZCBpbiBDZXJ0YWluIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzMgKDEpCisvKiBDTlYxIFJlZCBQaXhlbCBTdWJzdGl0dXRpb24gZmVhdHVyZSBub3QgZnVuY3Rpb25hbCBpbiB0aGUgUFZQICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIElQRjAgT3V0cHV0IFBvcnQgQ29sb3IgU2VwYXJhdGlvbiBmZWF0dXJlIG5vdCBmdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIFNwdXJpb3VzIFVTQiBXYWtlIEZyb20gSGliZXJuYXRlIE1heSBPY2N1ciBXaGVuIFVTQl9WQlVTIGlzIExvdyAqLworI2RlZmluZSBBTk9NQUxZXzE2MDAwMDM2IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBDb3JlIFJBSVNFIDIgSW5zdHJ1Y3Rpb24gTm90IExhdGNoZWQgV2hlbiBFeGVjdXRlZCBhdCBQcmlvcml0eSBMZXZlbCAwLCAxLCBvciAyICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIFNwdXJpb3VzIFVuaGFuZGxlZCBOTUkgb3IgTDEgTWVtb3J5IFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgTWF5IE9jY3VyIFVwb24gRW50ZXJpbmcgdGhlIE5NSSBJU1IgKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDAzOCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogQ0dVX1NUQVQuUExPQ0tFUlIgQml0IE1heSBiZSBVbnJlbGlhYmxlICovCisjZGVmaW5lIEFOT01BTFlfMTYwMDAwMzkgKDEpCisvKiBKVEFHIEVtdWxhdG9yIFJlYWRzIG9mIFNEVV9JRENPREUgQWx0ZXIgUmVnaXN0ZXIgQ29udGVudHMgKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDA0MCAoMSkKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBDYXVzZXMgUGFyaXR5IEVycm9yIFdoZW4gUGFyaXR5IElzIEVuYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8xNjAwMDA0MSAoMSkKKy8qIEluc3RydWN0aW9uIENhY2hlIEZhaWx1cmUgV2hlbiBQYXJpdHkgSXMgRW5hYmxlZCAqLworI2RlZmluZSBBTk9NQUxZXzE2MDAwMDQyIChfX1NJTElDT05fUkVWSVNJT05fXyA9PSAxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1OCAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUtYy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKaW5kZXggMGUxZTQ1MS4uZjRhZGVkYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKQEAgLTYsNyArNiw2IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KIApAQCAtNDIsNiArNDEsMTYgQEAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1lbV9tYXNrKQogewogCWludCBpOworI2lmZGVmIENPTkZJR19MMV9QQVJJVFlfQ0hFQ0sKKwl1MzIgY3RybDsKKworCWlmIChjcGxiX2FkZHIgPT0gRENQTEJfQUREUjApIHsKKwkJY3RybCA9IGJmaW5fcmVhZDMyKG1lbV9jb250cm9sKSB8ICgxIDw8IFJEQ0hLKTsKKwkJQ1NZTkMoKTsKKwkJYmZpbl93cml0ZTMyKG1lbV9jb250cm9sLCBjdHJsKTsKKwkJU1NZTkMoKTsKKwl9CisjZW5kaWYKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewogCQliZmluX3dyaXRlMzIoY3BsYl9hZGRyICsgaSAqIDQsIGNwbGJfdGJsW2ldLmFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jCmluZGV4IDIzMDhjZTUuLmQ0MzZiZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2Nsb2Nrcy1pbml0LmMKQEAgLTcsNyArNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCmluZGV4IGNhNzU2MTMuLjg2N2I3Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCkBAIC00NzEsMTMgKzQ3MSw4IEBACiAKIH0KIAotdm9pZCBoYW5kbGVfc2VjX2ZhdWx0KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3ZvaWQgaGFuZGxlX3NlY19mYXVsdCh1aW50MzJfdCBzZWNfZ3N0YXQpCiB7Ci0JdWludDMyX3Qgc2VjX2dzdGF0OwotCi0JcmF3X3NwaW5fbG9jaygmZGVzYy0+bG9jayk7Ci0KLQlzZWNfZ3N0YXQgPSBiZmluX3JlYWQzMihTRUNfR1NUQVQpOwogCWlmIChzZWNfZ3N0YXQgJiBTRUNfR1NUQVRfRVJSKSB7CiAKIAkJc3dpdGNoIChzZWNfZ3N0YXQgJiBTRUNfR1NUQVRfRVJSQykgewpAQCAtNDk0LDE4ICs0ODksMTYgQEAKIAogCiAJfQotCi0JcmF3X3NwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKLQotCWhhbmRsZV9mYXN0ZW9pX2lycShpcnEsIGRlc2MpOwogfQogCi12b2lkIGhhbmRsZV9jb3JlX2ZhdWx0KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGJmaW5fZmF1bHRfaXJxID0geworCS5uYW1lID0gIkJsYWNrZmluIGZhdWx0IiwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiZmluX2ZhdWx0X3JvdXRpbmUoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqZnAgPSBnZXRfaXJxX3JlZ3MoKTsKIAotCXJhd19zcGluX2xvY2soJmRlc2MtPmxvY2spOwotCiAJc3dpdGNoIChpcnEpIHsKIAljYXNlIElSUV9DMF9EQkxfRkFVTFQ6CiAJCWRvdWJsZV9mYXVsdF9jKGZwKTsKQEAgLTUyMiwxMSArNTE1LDE1IEBACiAJY2FzZSBJUlFfQzBfTk1JX0wxX1BBUklUWV9FUlI6CiAJCXBhbmljKCJDb3JlIDAgTk1JIEwxIHBhcml0eSBlcnJvciIpOwogCQlicmVhazsKKwljYXNlIElSUV9TRUNfRVJSOgorCQlwcl9lcnIoIlNFQyBlcnJvclxuIik7CisJCWhhbmRsZV9zZWNfZmF1bHQoYmZpbl9yZWFkMzIoU0VDX0dTVEFUKSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXBhbmljKCJDb3JlIDEgZmF1bHQgJWQgb2NjdXJzIHVuZXhwZWN0ZWRseSIsIGlycSk7CisJCXBhbmljKCJVbmtub3duIGZhdWx0ICVkIiwgaXJxKTsKIAl9CiAKLQlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KICNlbmRpZiAvKiBTRUNfR0NUTCAqLwogCkBAIC0xMTk1LDEyICsxMTkyLDcgQEAKIAkJCQloYW5kbGVfcGVyY3B1X2lycSk7CiAJCX0gZWxzZSB7CiAJCQlpcnFfc2V0X2NoaXAoaXJxLCAmYmZpbl9zZWNfaXJxY2hpcCk7Ci0JCQlpZiAoaXJxID09IElSUV9TRUNfRVJSKQotCQkJCWlycV9zZXRfaGFuZGxlcihpcnEsIGhhbmRsZV9zZWNfZmF1bHQpOwotCQkJZWxzZSBpZiAoaXJxID49IElSUV9DMF9EQkxfRkFVTFQgJiYgaXJxIDwgQ09SRV9JUlFTKQotCQkJCWlycV9zZXRfaGFuZGxlcihpcnEsIGhhbmRsZV9jb3JlX2ZhdWx0KTsKLQkJCWVsc2UKLQkJCQlpcnFfc2V0X2hhbmRsZXIoaXJxLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCQkJaXJxX3NldF9oYW5kbGVyKGlycSwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAkJCV9faXJxX3NldF9wcmVmbG93X2hhbmRsZXIoaXJxLCBiZmluX3NlY19wcmVmbG93X2hhbmRsZXIpOwogCQl9CiAJfQpAQCAtMTIzOSw2ICsxMjMxLDEzIEBACiAJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnNlY19wbV9zeXNjb3JlX29wcyk7CiAjZW5kaWYKIAorCWJmaW5fZmF1bHRfaXJxLmhhbmRsZXIgPSBiZmluX2ZhdWx0X3JvdXRpbmU7CisjaWZkZWYgQ09ORklHX0wxX1BBUklUWV9DSEVDSworCXNldHVwX2lycShJUlFfQzBfTk1JX0wxX1BBUklUWV9FUlIsICZiZmluX2ZhdWx0X2lycSk7CisjZW5kaWYKKwlzZXR1cF9pcnEoSVJRX0MwX0RCTF9GQVVMVCwgJmJmaW5fZmF1bHRfaXJxKTsKKwlzZXR1cF9pcnEoSVJRX1NFQ19FUlIsICZiZmluX2ZhdWx0X2lycSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zY2ItaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zY2ItaW5pdC5jCmluZGV4IDJjYmZiMGIuLjg5MjMzOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc2NiLWluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NjYi1pbml0LmMKQEAgLTYsNyArNiw2IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9zY2IuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCmluZGV4IDJiYmFlMDcuLmJhNmMzMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwpAQCAtNTMsNyArNTMsNiBAQAogCUJGSU5fSVBJX1RJTUVSLAogCUJGSU5fSVBJX1JFU0NIRURVTEUsCiAJQkZJTl9JUElfQ0FMTF9GVU5DLAotCUJGSU5fSVBJX0NBTExfRlVOQ19TSU5HTEUsCiAJQkZJTl9JUElfQ1BVX1NUT1AsCiB9OwogCkBAIC0xNjIsOSArMTYxLDYgQEAKIAkJCWNhc2UgQkZJTl9JUElfQ0FMTF9GVU5DOgogCQkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJGSU5fSVBJX0NBTExfRlVOQ19TSU5HTEU6Ci0JCQkJZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0KCk7Ci0JCQkJYnJlYWs7CiAJCQljYXNlIEJGSU5fSVBJX0NQVV9TVE9QOgogCQkJCWlwaV9jcHVfc3RvcChjcHUpOwogCQkJCWJyZWFrOwpAQCAtMjEwLDcgKzIwNiw3IEBACiAKIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KQogewotCXNlbmRfaXBpKGNwdW1hc2tfb2YoY3B1KSwgQkZJTl9JUElfQ0FMTF9GVU5DX1NJTkdMRSk7CisJc2VuZF9pcGkoY3B1bWFza19vZihjcHUpLCBCRklOX0lQSV9DQUxMX0ZVTkMpOwogfQogCiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvTWFrZWZpbGUgYi9hcmNoL2Zydi9NYWtlZmlsZQppbmRleCA0ZDFiMWU5Li4yYThmYjczIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9NYWtlZmlsZQorKysgYi9hcmNoL2Zydi9NYWtlZmlsZQpAQCAtNzQsMTMgKzc0LDYgQEAKIEtCVUlMRF9DRkxBR1MJKz0gLWZmaXhlZC1mY2MzIC1mZml4ZWQtY2MzIC1mZml4ZWQtZ3IxNSAtZmZpeGVkLWljYzIKIEtCVUlMRF9BRkxBR1MJKz0gLW1uby1mZHBpYwogCi0jIG1ha2Ugc3VyZSB0aGUgLlMgZmlsZXMgZ2V0IGNvbXBpbGVkIHdpdGggZGVidWcgaW5mbwotIyBhbmQgZGlzYWJsZSBvcHRpbWlzYXRpb25zIHRoYXQgYXJlIHVuaGVscGZ1bCB3aGlsc3QgZGVidWdnaW5nCi1pZmRlZiBDT05GSUdfREVCVUdfSU5GTwotI0tCVUlMRF9DRkxBR1MJKz0gLU8xCi1LQlVJTERfQUZMQUdTCSs9IC1XYSwtLWdkd2FyZjIKLWVuZGlmCi0KIGhlYWQteQkJOj0gYXJjaC9mcnYva2VybmVsL2hlYWQubwogCiBjb3JlLXkJCSs9IGFyY2gvZnJ2L2tlcm5lbC8gYXJjaC9mcnYvbW0vCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggYWZkNDVlMC4uYWU3NjNkOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMTEsNyArMTEsNyBAQAogCiAKIAotI2RlZmluZSBOUl9zeXNjYWxscwkJCTMxMiAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLworI2RlZmluZSBOUl9zeXNjYWxscwkJCTMxNCAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLwogCiAvKgogICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0b3Agc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoIGZyb20gY29tcGxhaW5pbmcgYWJvdXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKaW5kZXggMzRmZDZmZS4uNzE1ZTg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKQEAgLTMyNSw1ICszMjUsNyBAQAogI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CQkxMzMzCiAjZGVmaW5lIF9fTlJfYWNjZXB0NAkJCTEzMzQKICNkZWZpbmUgX19OUl9maW5pdF9tb2R1bGUJCTEzMzUKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhdHRyCQkxMzM2CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YXR0cgkJMTMzNwogCiAjZW5kaWYgLyogX1VBUElfQVNNX0lBNjRfVU5JU1REX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCBkZGVhNjA3Zi4uZmE4ZDYxYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwpAQCAtMTc3Myw2ICsxNzczLDggQEAKIAlkYXRhOCBzeXNfcHJvY2Vzc192bV93cml0ZXYKIAlkYXRhOCBzeXNfYWNjZXB0NAogCWRhdGE4IHN5c19maW5pdF9tb2R1bGUJCQkvLyAxMzM1CisJZGF0YTggc3lzX3NjaGVkX3NldGF0dHIKKwlkYXRhOCBzeXNfc2NoZWRfZ2V0YXR0cgogCiAJLm9yZyBzeXNfY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwogI2VuZGlmIC8qIF9fSUE2NF9BU01fUEFSQVZJUlRVQUxJWkVEX05BVElWRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmMgYi9hcmNoL202OGsvZW11L25mYmxvY2suYwppbmRleCAwNzIxODU4Li4yZDc1YWUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvZW11L25mYmxvY2suYworKysgYi9hcmNoL202OGsvZW11L25mYmxvY2suYwpAQCAtNjIsMTcgKzYyLDE4IEBACiBzdGF0aWMgdm9pZCBuZmhkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgbmZoZF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5xdWV1ZWRhdGE7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWM7Ci0JaW50IGksIGRpciwgbGVuLCBzaGlmdDsKLQlzZWN0b3JfdCBzZWMgPSBiaW8tPmJpX3NlY3RvcjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKKwlpbnQgZGlyLCBsZW4sIHNoaWZ0OworCXNlY3Rvcl90IHNlYyA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAlkaXIgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAlzaGlmdCA9IGRldi0+YnNoaWZ0OwotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewotCQlsZW4gPSBidmVjLT5idl9sZW47CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CisJCWxlbiA9IGJ2ZWMuYnZfbGVuOwogCQlsZW4gPj49IDk7CiAJCW5maGRfcmVhZF93cml0ZShkZXYtPmlkLCAwLCBkaXIsIHNlYyA+PiBzaGlmdCwgbGVuID4+IHNoaWZ0LAotCQkJCWJ2ZWNfdG9fcGh5cyhidmVjKSk7CisJCQkJYnZlY190b19waHlzKCZidmVjKSk7CiAJCXNlYyArPSBsZW47CiAJfQogCWJpb19lbmRpbyhiaW8sIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBjMDJmMWMwLi5kY2FlM2E3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTE2LDcgKzExNiw2IEBACiAJc2VsZWN0IENFVlRfUjRLCiAJc2VsZWN0IENTUkNfUjRLCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBGV19DRkUKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQpAQCAtMTI0LDYgKzEyMyw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKKwlzZWxlY3QgRUFSTFlfUFJJTlRLXzgyNTAgaWYgRUFSTFlfUFJJTlRLCiAJaGVscAogCSBTdXBwb3J0IGZvciBCQ000N1hYIGJhc2VkIGJvYXJkcwogCkBAIC0xMzQsMTQgKzEzNCwxMyBAQAogCXNlbGVjdCBDU1JDX1I0SwogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFM0MzUwIGlmICFCQ002M1hYX0NQVV82MzM4ICYmICFCQ002M1hYX0NQVV82MzQ1ICYmICFCQ002M1hYX0NQVV82MzQ4CiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzQKIAloZWxwCiAJIFN1cHBvcnQgZm9yIEJDTTYzWFggYmFzZWQgYm9hcmRzCiAKQEAgLTE4Niw2ICsxODUsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMTI4SFoKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzI1NkhaCiAJc2VsZWN0IFNZU19TVVBQT1JUU18xMDI0SFoKKwlzZWxlY3QgTUlQU19MMV9DQUNIRV9TSElGVF80CiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIERFQydzIE1JUFMgYmFzZWQgd29ya3N0YXRpb25zLiAgRm9yIGRldGFpbHMKIAkgIHNlZSB0aGUgTGludXgvTUlQUyBGQVEgb24gPGh0dHA6Ly93d3cubGludXgtbWlwcy5vcmcvPiBhbmQgdGhlCkBAIC0zMDUsNyArMzA1LDcgQEAKIAlzZWxlY3QgQ0VWVF9SNEsKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgQ1NSQ19HSUMKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJc2VsZWN0IERNQV9NQVlCRV9DT0hFUkVOVAogCXNlbGVjdCBHRU5FUklDX0lTQV9ETUEKIAlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAlzZWxlY3QgSVJRX0NQVQpAQCAtMzI0LDcgKzMyNCw2IEBACiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFM2NF9SMgogCXNlbGVjdCBTWVNfSEFTX0NQVV9ORVZBREEKIAlzZWxlY3QgU1lTX0hBU19DUFVfUk03MDAwCi0Jc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgpAQCAtMzQ5LDYgKzM0OCw3IEBACiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IElSUV9HSUMKKwlzZWxlY3QgTElCRkRUCiAJc2VsZWN0IE1JUFNfTVNDCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjIKQEAgLTQ3MSw2ICs0NzEsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KKwlzZWxlY3QgTUlQU19MMV9DQUNIRV9TSElGVF83CiAJaGVscAogCSAgVGhpcyBhcmUgdGhlIFNHSSBJbmR5LCBDaGFsbGVuZ2UgUyBhbmQgSW5kaWdvMiwgYXMgd2VsbCBhcyBjZXJ0YWluCiAJICBPRU0gdmFyaWFudHMgbGlrZSB0aGUgVGFuZGVtIENNTiBCMDA2Uy4gVG8gY29tcGlsZSBhIExpbnV4IGtlcm5lbApAQCAtNDkxLDYgKzQ5Miw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCiAJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgTUlQU19MMV9DQUNIRV9TSElGVF83CiAJaGVscAogCSAgVGhpcyBhcmUgdGhlIFNHSSBPcmlnaW4gMjAwLCBPcmlnaW4gMjAwMCBhbmQgT255eCAyIEdyYXBoaWNzCiAJICB3b3Jrc3RhdGlvbnMuICBUbyBjb21waWxlIGEgTGludXgga2VybmVsIHRoYXQgcnVucyBvbiB0aGVzZSwgc2F5IFkKQEAgLTY5Nyw2ICs2OTksNyBAQAogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IEJPT1RfUkFXCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IE1JUFNfTDFfQ0FDSEVfU0hJRlRfNAogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIE1pa3JvdGlrKHRtKSBSb3V0ZXJCb2FyZCA1MzIgc2VyaWVzLAogCSAgYmFzZWQgb24gdGhlIElEVCBSQzMyNDM0IFNvQy4KQEAgLTc3OSw2ICs3ODIsNyBAQAogCXNlbGVjdCBDRVZUX1I0SwogCXNlbGVjdCBDU1JDX1I0SwogCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJc2VsZWN0IFpPTkVfRE1BMzIgaWYgNjRCSVQKIAlzZWxlY3QgU1lOQ19SNEsKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKQEAgLTg5Nyw2ICs5MDEsMTAgQEAKIGNvbmZpZyBBUkNIX0RNQV9BRERSX1RfNjRCSVQKIAlkZWZfYm9vbCAoSElHSE1FTSAmJiA2NEJJVF9QSFlTX0FERFIpIHx8IDY0QklUCiAKK2NvbmZpZyBETUFfTUFZQkVfQ09IRVJFTlQKKwlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJYm9vbAorCiBjb25maWcgRE1BX0NPSEVSRU5UCiAJYm9vbAogCkBAIC0xMDkxLDExICsxMDk5LDI0IEBACiBjb25maWcgQk9PVF9FTEYzMgogCWJvb2wKIAorY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlRfNAorCWJvb2wKKworY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlRfNQorCWJvb2wKKworY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlRfNgorCWJvb2wKKworY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlRfNworCWJvb2wKKwogY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlQKIAlpbnQKLQlkZWZhdWx0ICI0IiBpZiBNQUNIX0RFQ1NUQVRJT04gfHwgTUlLUk9USUtfUkI1MzIgfHwgUE1DX01TUDQyMDBfRVZBTCB8fCBTT0NfUlQyODhYCi0JZGVmYXVsdCAiNiIgaWYgTUlQU19DUFVfU0NBQ0hFCi0JZGVmYXVsdCAiNyIgaWYgU0dJX0lQMjIgfHwgU0dJX0lQMjcgfHwgU0dJX0lQMjggfHwgU05JX1JNIHx8IENQVV9DQVZJVU1fT0NURU9OCisJZGVmYXVsdCAiNCIgaWYgTUlQU19MMV9DQUNIRV9TSElGVF80CisJZGVmYXVsdCAiNSIgaWYgTUlQU19MMV9DQUNIRV9TSElGVF81CisJZGVmYXVsdCAiNiIgaWYgTUlQU19MMV9DQUNIRV9TSElGVF82CisJZGVmYXVsdCAiNyIgaWYgTUlQU19MMV9DQUNIRV9TSElGVF83CiAJZGVmYXVsdCAiNSIKIAogY29uZmlnIEhBVkVfU1REX1BDX1NFUklBTF9QT1JUCkBAIC0xMzc1LDQ3ICsxMzk2LDMxIEBACiAJc2VsZWN0IExJQkZEVAogCXNlbGVjdCBVU0VfT0YKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCisJc2VsZWN0IFNZU19IQVNfRE1BX09QUworCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzcKIAloZWxwCiAJICBUaGUgQ2F2aXVtIE9jdGVvbiBwcm9jZXNzb3IgaXMgYSBoaWdobHkgaW50ZWdyYXRlZCBjaGlwIGNvbnRhaW5pbmcKIAkgIG1hbnkgZXRoZXJuZXQgaGFyZHdhcmUgd2lkZ2V0cyBmb3IgbmV0d29ya2luZyB0YXNrcy4gVGhlIHByb2Nlc3NvcgogCSAgY2FuIGhhdmUgdXAgdG8gMTYgTWlwczY0djIgY29yZXMgYW5kIDggaW50ZWdyYXRlZCBnaWdhYml0IGV0aGVybmV0cy4KIAkgIEZ1bGwgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5jYXZpdW1uZXR3b3Jrcy5jb20uCiAKLWNvbmZpZyBDUFVfQk1JUFMzMzAwCi0JYm9vbCAiQk1JUFMzMzAwIgotCWRlcGVuZHMgb24gU1lTX0hBU19DUFVfQk1JUFMzMzAwCi0Jc2VsZWN0IENQVV9CTUlQUwotCWhlbHAKLQkgIEJyb2FkY29tIEJNSVBTMzMwMCBwcm9jZXNzb3JzLgotCi1jb25maWcgQ1BVX0JNSVBTNDM1MAotCWJvb2wgIkJNSVBTNDM1MCIKLQlkZXBlbmRzIG9uIFNZU19IQVNfQ1BVX0JNSVBTNDM1MAotCXNlbGVjdCBDUFVfQk1JUFMKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfSE9UUExVR19DUFUKLQloZWxwCi0JICBCcm9hZGNvbSBCTUlQUzQzNTAgKCJWSVBFUiIpIHByb2Nlc3NvcnMuCi0KLWNvbmZpZyBDUFVfQk1JUFM0MzgwCi0JYm9vbCAiQk1JUFM0MzgwIgotCWRlcGVuZHMgb24gU1lTX0hBU19DUFVfQk1JUFM0MzgwCi0Jc2VsZWN0IENQVV9CTUlQUwotCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19IT1RQTFVHX0NQVQotCWhlbHAKLQkgIEJyb2FkY29tIEJNSVBTNDM4MCBwcm9jZXNzb3JzLgotCi1jb25maWcgQ1BVX0JNSVBTNTAwMAotCWJvb2wgIkJNSVBTNTAwMCIKLQlkZXBlbmRzIG9uIFNZU19IQVNfQ1BVX0JNSVBTNTAwMAotCXNlbGVjdCBDUFVfQk1JUFMKK2NvbmZpZyBDUFVfQk1JUFMKKwlib29sICJCcm9hZGNvbSBCTUlQUyIKKwlkZXBlbmRzIG9uIFNZU19IQVNfQ1BVX0JNSVBTCisJc2VsZWN0IENQVV9NSVBTMzIKKwlzZWxlY3QgQ1BVX0JNSVBTMzJfMzMwMCBpZiBTWVNfSEFTX0NQVV9CTUlQUzMyXzMzMDAKKwlzZWxlY3QgQ1BVX0JNSVBTNDM1MCBpZiBTWVNfSEFTX0NQVV9CTUlQUzQzNTAKKwlzZWxlY3QgQ1BVX0JNSVBTNDM4MCBpZiBTWVNfSEFTX0NQVV9CTUlQUzQzODAKKwlzZWxlY3QgQ1BVX0JNSVBTNTAwMCBpZiBTWVNfSEFTX0NQVV9CTUlQUzUwMDAKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IFdFQUtfT1JERVJJTkcKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KLQlzZWxlY3QgTUlQU19DUFVfU0NBQ0hFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0hPVFBMVUdfQ1BVCisJc2VsZWN0IENQVV9IQVNfUFJFRkVUQ0gKIAloZWxwCi0JICBCcm9hZGNvbSBCTUlQUzUwMDAgcHJvY2Vzc29ycy4KKwkgIFN1cHBvcnQgZm9yIEJNSVBTMzIvMzMwMC80MzUwLzQzODAgYW5kIEJNSVBTNTAwMCBwcm9jZXNzb3JzLgogCiBjb25maWcgQ1BVX1hMUgogCWJvb2wgIk5ldGxvZ2ljIFhMUiBTb0MiCkBAIC0xNDk4LDE0ICsxNTAzLDI1IEBACiAJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KIAotY29uZmlnIENQVV9CTUlQUworY29uZmlnIENQVV9CTUlQUzMyXzMzMDAKKwlzZWxlY3QgU01QX1VQIGlmIFNNUAogCWJvb2wKLQlzZWxlY3QgQ1BVX01JUFMzMgotCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBJUlFfQ1BVCi0Jc2VsZWN0IFNXQVBfSU9fU1BBQ0UKLQlzZWxlY3QgV0VBS19PUkRFUklORworCitjb25maWcgQ1BVX0JNSVBTNDM1MAorCWJvb2wKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSE9UUExVR19DUFUKKworY29uZmlnIENQVV9CTUlQUzQzODAKKwlib29sCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0hPVFBMVUdfQ1BVCisKK2NvbmZpZyBDUFVfQk1JUFM1MDAwCisJYm9vbAorCXNlbGVjdCBNSVBTX0NQVV9TQ0FDSEUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSE9UUExVR19DUFUKIAogY29uZmlnIFNZU19IQVNfQ1BVX0xPT05HU09OMkUKIAlib29sCkBAIC0xNTc5LDE3ICsxNTk1LDI0IEBACiBjb25maWcgU1lTX0hBU19DUFVfQ0FWSVVNX09DVEVPTgogCWJvb2wKIAotY29uZmlnIFNZU19IQVNfQ1BVX0JNSVBTMzMwMAorY29uZmlnIFNZU19IQVNfQ1BVX0JNSVBTCiAJYm9vbAogCitjb25maWcgU1lTX0hBU19DUFVfQk1JUFMzMl8zMzAwCisJYm9vbAorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUworCiBjb25maWcgU1lTX0hBU19DUFVfQk1JUFM0MzUwCiAJYm9vbAorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUwogCiBjb25maWcgU1lTX0hBU19DUFVfQk1JUFM0MzgwCiAJYm9vbAorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUwogCiBjb25maWcgU1lTX0hBU19DUFVfQk1JUFM1MDAwCiAJYm9vbAorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUwogCiBjb25maWcgU1lTX0hBU19DUFVfWExSCiAJYm9vbApAQCAtMTc5Nyw2ICsxODIwLDcgQEAKIGNvbmZpZyBNSVBTX0NQVV9TQ0FDSEUKIAlib29sCiAJc2VsZWN0IEJPQVJEX1NDQUNIRQorCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzYKIAogY29uZmlnIFI1MDAwX0NQVV9TQ0FDSEUKIAlib29sCkBAIC0xODMzLDU5ICsxODU3LDQ4IEBACiAJcHJvbXB0ICJNSVBTIE1UIG9wdGlvbnMiCiAKIGNvbmZpZyBNSVBTX01UX0RJU0FCTEVECi0JYm9vbCAiRGlzYWJsZSBtdWx0aXRocmVhZGluZyBzdXBwb3J0LiIKKwlib29sICJEaXNhYmxlIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQiCiAJaGVscAotCSAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdXIgd29ya2xvYWQgY2FuJ3QgdGFrZSBhZHZhbnRhZ2Ugb2YKLQkgIE1JUFMgaGFyZHdhcmUgbXVsdGl0aHJlYWRpbmcgc3VwcG9ydC4gIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlCi0JICB0aGUgb3B0aW9uIG9mIGFuIE1ULWVuYWJsZWQgcHJvY2Vzc29yIHRoaXMgb3B0aW9uIHdpbGwgYmUgdGhlIG9ubHkKLQkgIG9wdGlvbiBpbiB0aGlzIG1lbnUuCisJICBVc2UgdGhpcyBvcHRpb24gaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNVCBBU0UKKwkgIHdoaWNoIGlzIGhhcmR3YXJlIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQuIE9uIHN5c3RlbXMgd2l0aG91dAorCSAgYW4gTVQtZW5hYmxlZCBwcm9jZXNzb3IsIHRoaXMgd2lsbCBiZSB0aGUgb25seSBvcHRpb24gdGhhdCBpcworCSAgYXZhaWxhYmxlIGluIHRoaXMgbWVudS4KIAogY29uZmlnIE1JUFNfTVRfU01QCiAJYm9vbCAiVXNlIDEgVEMgb24gZWFjaCBhdmFpbGFibGUgVlBFIGZvciBTTVAiCiAJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKKwlzZWxlY3QgU1lOQ19SNEsKIAlzZWxlY3QgTUlQU19NVAogCXNlbGVjdCBTTVAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1NDSEVEX1NNVCBpZiBTTVAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAogCXNlbGVjdCBTTVBfVVAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0NIRURfU01UCiAJc2VsZWN0IE1JUFNfUEVSRl9TSEFSRURfVENfQ09VTlRFUlMKIAloZWxwCi0JICBUaGlzIGlzIGEga2VybmVsIG1vZGVsIHdoaWNoIGlzIGtub3duIGEgVlNNUCBidXQgbGF0ZWx5IGhhcyBiZWVuCi0JICBtYXJrZXRlc2VkIGludG8gU01WUC4KLQkgIFZpcnR1YWwgU01QIHVzZXMgdGhlIHByb2Nlc3NvcidzIFZQRXMgIHRvIGltcGxlbWVudCB2aXJ0dWFsCi0JICBwcm9jZXNzb3JzLiBJbiBjdXJyZW50bHkgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIDM0SyBwcm9jZXNzb3IKLQkgIHRoaXMgYWxsb3dzIGZvciBhIGR1YWwgcHJvY2Vzc29yLiBCb3RoIHByb2Nlc3NvcnMgd2lsbCBzaGFyZSB0aGUgc2FtZQotCSAgcHJpbWFyeSBjYWNoZXM7IGVhY2ggd2lsbCBvYnRhaW4gdGhlIGhhbGYgb2YgdGhlIFRMQiBmb3IgaXQncyBvd24KLQkgIGV4Y2x1c2l2ZSB1c2UuIEZvciBhIGxheW1hbiB0aGlzIG1vZGVsIGNhbiBiZSBkZXNjcmliZWQgYXMgc2ltaWxhciB0bwotCSAgd2hhdCBJbnRlbCBjYWxscyBIeXBlcnRocmVhZGluZy4KLQotCSAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly93d3cubGludXgtbWlwcy5vcmcvd2lraS8zNEsjVlNNUAorCSAgVGhpcyBpcyBhIGtlcm5lbCBtb2RlbCB3aGljaCBpcyBrbm93biBhcyBTTVZQLiBUaGlzIGlzIHN1cHBvcnRlZAorCSAgb24gY29yZXMgd2l0aCB0aGUgTVQgQVNFIGFuZCB1c2VzIHRoZSBhdmFpbGFibGUgVlBFcyB0byBpbXBsZW1lbnQKKwkgIHZpcnR1YWwgcHJvY2Vzc29ycyB3aGljaCBzdXBwb3J0cyBTTVAuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKwkgIEludGVsIEh5cGVydGhyZWFkaW5nIGZlYXR1cmUuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGdvIHRvCisJICA8aHR0cDovL3d3dy5pbWd0ZWMuY29tL21pcHMvbWlwcy1tdWx0aXRocmVhZGluZy5hc3A+LgogCiBjb25maWcgTUlQU19NVF9TTVRDCi0JYm9vbCAiU01UQzogVXNlIGFsbCBUQ3Mgb24gYWxsIFZQRXMgZm9yIFNNUCIKKwlib29sICJVc2UgYWxsIFRDcyBvbiBhbGwgVlBFcyBmb3IgU01QIChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIENQVV9NSVBTMzJfUjIKLQkjZGVwZW5kcyBvbiBDUFVfTUlQUzY0X1IyCQkjIG9uY2UgdGhlcmUgaXMgaGFyZHdhcmUgLi4uCiAJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKIAlzZWxlY3QgTUlQU19NVAotCXNlbGVjdCBOUl9DUFVTX0RFRkFVTFRfOAogCXNlbGVjdCBTTVAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAogCXNlbGVjdCBTTVBfVVAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBOUl9DUFVTX0RFRkFVTFRfOAogCWhlbHAKLQkgIFRoaXMgaXMgYSBrZXJuZWwgbW9kZWwgd2hpY2ggaXMga25vd24gYSBTTVRDIG9yIGxhdGVseSBoYXMgYmVlbgotCSAgbWFya2V0ZXNlZCBpbnRvIFNNVlAuCi0JICBpcyBwcmVzZW50aW5nIHRoZSBhdmFpbGFibGUgVEMncyBvZiB0aGUgY29yZSBhcyBwcm9jZXNzb3JzIHRvIExpbnV4LgotCSAgT24gY3VycmVudGx5IGF2YWlsYWJsZSAzNEsgcHJvY2Vzc29ycyB0aGlzIG1lYW5zIGEgTGludXggc3lzdGVtIHdpbGwKLQkgIHNlZSB1cCB0byA1IHByb2Nlc3NvcnMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU01UQyBrZXJuZWwgZGlmZmVycwotCSAgc2lnbmlmaWNhbnRseSBmcm9tIFZTTVAgYW5kIGNhbm5vdCBlZmZpY2llbnRseSBjb2V4aXN0IGluIHRoZSBzYW1lCi0JICBrZXJuZWwgYmluYXJ5IHNvIHRoZSBjaG9pY2UgYmV0d2VlbiBWU01QIGFuZCBTTVRDIGlzIGEgY29tcGlsZSB0aW1lCi0JICBkZWNpc2lvbi4KLQotCSAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly93d3cubGludXgtbWlwcy5vcmcvd2lraS8zNEsjU01UQworCSAgVGhpcyBpcyBhIGtlcm5lbCBtb2RlbCB3aGljaCBpcyBrbm93biBhcyBTTVRDLiBUaGlzIGlzCisJICBzdXBwb3J0ZWQgb24gY29yZXMgd2l0aCB0aGUgTVQgQVNFIGFuZCBwcmVzZW50cyBhbGwgVENzCisJICBhdmFpbGFibGUgb24gYWxsIFZQRXMgdG8gc3VwcG9ydCBTTVAuIEZvciBmdXJ0aGVyCisJICBpbmZvcm1hdGlvbiBzZWUgPGh0dHA6Ly93d3cubGludXgtbWlwcy5vcmcvd2lraS8zNEsjU01UQz4uCiAKIGVuZGNob2ljZQogCkBAIC0xOTIyLDYgKzE5MzUsMTYgQEAKIAkgIEluY2x1ZGVzIGEgbG9hZGVyIGZvciBsb2FkaW5nIGFuIGVsZiByZWxvY2F0YWJsZSBvYmplY3QKIAkgIG9udG8gYW5vdGhlciBWUEUgYW5kIHJ1bm5pbmcgaXQuCiAKK2NvbmZpZyBNSVBTX1ZQRV9MT0FERVJfQ01QCisJYm9vbAorCWRlZmF1bHQgInkiCisJZGVwZW5kcyBvbiBNSVBTX1ZQRV9MT0FERVIgJiYgTUlQU19DTVAKKworY29uZmlnIE1JUFNfVlBFX0xPQURFUl9NVAorCWJvb2wKKwlkZWZhdWx0ICJ5IgorCWRlcGVuZHMgb24gTUlQU19WUEVfTE9BREVSICYmICFNSVBTX0NNUAorCiBjb25maWcgTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QCiAJYm9vbCAiVXNlIHBlci1UQyByZWdpc3RlciBiaXRzIGFzIGJhY2tzdG9wIGZvciBpbmhpYml0ZWQgSU0gYml0cyIKIAlkZXBlbmRzIG9uIE1JUFNfTVRfU01UQwpAQCAtMTk1NSwyNCArMTk3OCwyOSBAQAogCSAgeW91IHRvIGVuc3VyZSB0aGUgYW1vdW50IHlvdSBwdXQgaW4gdGhlIG9wdGlvbiBhbmQgdGhlIHNwYWNlIHlvdXIKIAkgIHByb2dyYW0gcmVxdWlyZXMgaXMgbGVzcyBvciBlcXVhbCB0byB0aGUgYW1vdW50IHBoeXNpY2FsbHkgcHJlc2VudC4KIAotIyB0aGlzIHNob3VsZCBwb3NzaWJseSBiZSBpbiBkcml2ZXJzL2NoYXIsIGJ1dCBpdCBpcyByYXRoZXIgY3B1IHJlbGF0ZWQuIEhtbW0KIGNvbmZpZyBNSVBTX1ZQRV9BUFNQX0FQSQogCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBBUC9TUCBBUEkgKFJUTFgpIgogCWRlcGVuZHMgb24gTUlQU19WUEVfTE9BREVSCiAJaGVscAogCitjb25maWcgTUlQU19WUEVfQVBTUF9BUElfQ01QCisJYm9vbAorCWRlZmF1bHQgInkiCisJZGVwZW5kcyBvbiBNSVBTX1ZQRV9BUFNQX0FQSSAmJiBNSVBTX0NNUAorCitjb25maWcgTUlQU19WUEVfQVBTUF9BUElfTVQKKwlib29sCisJZGVmYXVsdCAieSIKKwlkZXBlbmRzIG9uIE1JUFNfVlBFX0FQU1BfQVBJICYmICFNSVBTX0NNUAorCiBjb25maWcgTUlQU19DTVAKLQlib29sICJNSVBTIENNUCBmcmFtZXdvcmsgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NSVBTX0NNUAotCXNlbGVjdCBTTVAKKwlib29sICJNSVBTIENNUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01JUFNfQ01QICYmIE1JUFNfTVRfU01QCiAJc2VsZWN0IFNZTkNfUjRLCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX1NDSEVEX1NNVCBpZiBTTVAKIAlzZWxlY3QgV0VBS19PUkRFUklORwogCWRlZmF1bHQgbgogCWhlbHAKLQkgIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBvcHRpb24gZm9yIHRoZSBHQ01QIHdvcmsuIEl0IHdpbGwgbmVlZCB0bwotCSAgYmUgaGFuZGxlZCBkaWZmZXJlbnRseS4uLgorCSAgRW5hYmxlIENvaGVyZW5jeSBNYW5hZ2VyIHByb2Nlc3NvciAoQ01QKSBzdXBwb3J0LgogCiBjb25maWcgU0IxX1BBU1NfMV9XT1JLQVJPVU5EUwogCWJvb2wKQEAgLTIzMjQsNiArMjM1MiwyMyBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgogCitjb25maWcgTUlQU19PMzJfRlA2NF9TVVBQT1JUCisJYm9vbCAiU3VwcG9ydCBmb3IgTzMyIGJpbmFyaWVzIHVzaW5nIDY0LWJpdCBGUCIKKwlkZXBlbmRzIG9uIDMyQklUIHx8IE1JUFMzMl9PMzIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaGVuIHRoaXMgaXMgZW5hYmxlZCwgdGhlIGtlcm5lbCB3aWxsIHN1cHBvcnQgdXNlIG9mIDY0LWJpdCBmbG9hdGluZworCSAgcG9pbnQgcmVnaXN0ZXJzIHdpdGggYmluYXJpZXMgdXNpbmcgdGhlIE8zMiBBQkkgYWxvbmcgd2l0aCB0aGUKKwkgIEVGX01JUFNfRlA2NCBFTEYgaGVhZGVyIGZsYWcgKHR5cGljYWxseSBidWlsdCB3aXRoIC1tZnA2NCkuIE9uCisJICAzMi1iaXQgTUlQUyBzeXN0ZW1zIHRoaXMgc3VwcG9ydCBpcyBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZQorCSAgc2l6ZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgY29tcGlsZWQgRlBVIGVtdWxhdG9yLiBUaHVzIGlmIHlvdSBhcmUKKwkgIHJ1bm5pbmcgYSBNSVBTMzIgc3lzdGVtIGFuZCBrbm93IHRoYXQgbm9uZSBvZiB5b3VyIHVzZXJsYW5kIGJpbmFyaWVzCisJICB3aWxsIHJlcXVpcmUgNjQtYml0IGZsb2F0aW5nIHBvaW50LCB5b3UgbWF5IHdpc2ggdG8gcmVkdWNlIHRoZSBzaXplCisJICBvZiB5b3VyIGtlcm5lbCAmIHBvdGVudGlhbGx5IGltcHJvdmUgRlAgZW11bGF0aW9uIHBlcmZvcm1hbmNlIGJ5CisJICBzYXlpbmcgTiBoZXJlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgVVNFX09GCiAJYm9vbAogCXNlbGVjdCBPRgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IGVmZTUwNzg3Li45Yjg1NTZkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0xMTQsNyArMTE0LDcgQEAKIGNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gJChzaGVsbCAkKENDKSAtZHVtcG1hY2hpbmUgfGdyZXAgLXEgJ21pcHMuKmVsLS4qJyB8fCBlY2hvIC1FTCAkKHVuZGVmLWFsbCkgJChwcmVkZWYtbGUpKQogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0hBU19TTUFSVE1JUFMpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1zbWFydG1pcHMpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX01JQ1JPTUlQUykgKz0gJChjYWxsIGNjLW9wdGlvbiwtbW1pY3JvbWlwcyAtbW5vLWphbHMpCitjZmxhZ3MtJChDT05GSUdfQ1BVX01JQ1JPTUlQUykgKz0gJChjYWxsIGNjLW9wdGlvbiwtbW1pY3JvbWlwcykKIAogY2ZsYWdzLSQoQ09ORklHX1NCMVhYWF9DT1JFTElTKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tc2NoZWQtcHJvbG9nKSBcCiAJCQkJICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMKaW5kZXggMGM3ZmNlMi4uYmRiMjhkZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCkBAIC0yOSw3ICsyOSw2IEBACiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEwMDAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEwMDAuYwppbmRleCAxMWYzYWQyLi41NDgzOTA2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMDAwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTAwMC5jCkBAIC01MzQsMTMgKzUzNCwxMCBAQAogCQlzMCA9IEFVMTEwMF9HUElPMV9JTlQ7CiAJCXMxID0gQVUxMTAwX0dQSU80X0lOVDsKIAorCQlncGlvX3JlcXVlc3QoMTksICJzZDBfY2QiKTsKKwkJZ3Bpb19yZXF1ZXN0KDIwLCAic2QxX2NkIik7CiAJCWdwaW9fZGlyZWN0aW9uX2lucHV0KDE5KTsJLyogc2QwIGNkIyAqLwogCQlncGlvX2RpcmVjdGlvbl9pbnB1dCgyMCk7CS8qIHNkMSBjZCMgKi8KLQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoMjEpOwkvKiB0b3VjaCBwZW5kb3duIyAqLwotCQlncGlvX2RpcmVjdGlvbl9pbnB1dCgyMDcpOwkvKiBTUEkgTUlTTyAqLwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMjA4LCAwKTsJLyogU1BJIE1PU0kgKi8KLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIwOSwgMSk7CS8qIFNQSSBTQ0sgKi8KLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIxMCwgMSk7CS8qIFNQSSBDUyMgKi8KIAogCQkvKiBzcGlfZ3BpbyBvbiBTU0kwIHBpbnMgKi8KIAkJcGZjID0gX19yYXdfcmVhZGwoKHZvaWQgX19pb21lbSAqKVNZU19QSU5GVU5DKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hcjcvdGltZS5jIGIvYXJjaC9taXBzL2FyNy90aW1lLmMKaW5kZXggMjJjOTMyMS4uMWRjNmMzYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FyNy90aW1lLmMKKysrIGIvYXJjaC9taXBzL2FyNy90aW1lLmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqIFNldHRpbmcgdXAgdGhlIGNsb2NrIG9uIHRoZSBNSVBTIGJvYXJkcy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdGg3OS9jb21tb24uaCBiL2FyY2gvbWlwcy9hdGg3OS9jb21tb24uaAppbmRleCA2NDhkMmRhLi5hMzEyMDcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXRoNzkvY29tbW9uLmgKKysrIGIvYXJjaC9taXBzL2F0aDc5L2NvbW1vbi5oCkBAIC0xNSw3ICsxNSw2IEBACiAjZGVmaW5lIF9fQVRINzlfQ09NTU9OX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjZGVmaW5lIEFUSDc5X01FTV9TSVpFX01JTgkoMiAqIDEwMjQgKiAxMDI0KQogI2RlZmluZSBBVEg3OV9NRU1fU0laRV9NQVgJKDEyOCAqIDEwMjQgKiAxMDI0KQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvS2NvbmZpZyBiL2FyY2gvbWlwcy9iY200N3h4L0tjb25maWcKaW5kZXggMmI4YjExOC4uMDljYjZmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCiBjb25maWcgQkNNNDdYWF9TU0IKIAlib29sICJTU0IgU3VwcG9ydCBmb3IgQnJvYWRjb20gQkNNNDdYWCIKKwlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFMzMl8zMzAwCiAJc2VsZWN0IFNTQgogCXNlbGVjdCBTU0JfRFJJVkVSX01JUFMKIAlzZWxlY3QgU1NCX0RSSVZFUl9FWFRJRgpAQCAtMTEsNiArMTIsNyBAQAogCXNlbGVjdCBTU0JfUENJQ09SRV9IT1NUTU9ERSBpZiBQQ0kKIAlzZWxlY3QgU1NCX0RSSVZFUl9HUElPCiAJc2VsZWN0IEdQSU9MSUIKKwlzZWxlY3QgTEVEU19HUElPX1JFR0lTVEVSCiAJZGVmYXVsdCB5CiAJaGVscAogCSBBZGQgc3VwcG9ydCBmb3Igb2xkIEJyb2FkY29tIEJDTTQ3eHggYm9hcmRzIHdpdGggU29uaWNzIFNpbGljb24gQmFja3BsYW5lIHN1cHBvcnQuCkBAIC0yMCw2ICsyMiw3IEBACiBjb25maWcgQkNNNDdYWF9CQ01BCiAJYm9vbCAiQkNNQSBTdXBwb3J0IGZvciBCcm9hZGNvbSBCQ000N1hYIgogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjIKKwlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKIAlzZWxlY3QgQkNNQQogCXNlbGVjdCBCQ01BX0hPU1RfU09DCiAJc2VsZWN0IEJDTUFfRFJJVkVSX01JUFMKQEAgLTI3LDYgKzMwLDcgQEAKIAlzZWxlY3QgQkNNQV9EUklWRVJfUENJX0hPU1RNT0RFIGlmIFBDSQogCXNlbGVjdCBCQ01BX0RSSVZFUl9HUElPCiAJc2VsZWN0IEdQSU9MSUIKKwlzZWxlY3QgTEVEU19HUElPX1JFR0lTVEVSCiAJZGVmYXVsdCB5CiAJaGVscAogCSBBZGQgc3VwcG9ydCBmb3IgbmV3IEJyb2FkY29tIEJDTTQ3eHggYm9hcmRzIHdpdGggQnJvYWRjb20gc3BlY2lmaWMgQWR2YW5jZWQgTWljcm9jb250cm9sbGVyIEJ1cy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L01ha2VmaWxlIGIvYXJjaC9taXBzL2JjbTQ3eHgvTWFrZWZpbGUKaW5kZXggYzUyZGFmOS4uNDY4OGI2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvTWFrZWZpbGUKQEAgLTQsNSArNCw0IEBACiAjCiAKIG9iai15CQkJCSs9IGlycS5vIG52cmFtLm8gcHJvbS5vIHNlcmlhbC5vIHNldHVwLm8gdGltZS5vIHNwcm9tLm8KLW9iai15CQkJCSs9IGJvYXJkLm8KLW9iai0kKENPTkZJR19CQ000N1hYX1NTQikJKz0gd2d0NjM0dS5vCitvYmoteQkJCQkrPSBib2FyZC5vIGJ1dHRvbnMubyBsZWRzLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2JjbTQ3eHhfcHJpdmF0ZS5oIGIvYXJjaC9taXBzL2JjbTQ3eHgvYmNtNDd4eF9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5NGFjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L2JjbTQ3eHhfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgTElOVVhfQkNNNDdYWF9QUklWQVRFX0hfCisjZGVmaW5lIExJTlVYX0JDTTQ3WFhfUFJJVkFURV9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKy8qIGJ1dHRvbnMuYyAqLworaW50IF9faW5pdCBiY200N3h4X2J1dHRvbnNfcmVnaXN0ZXIodm9pZCk7CisKKy8qIGxlZHMuYyAqLwordm9pZCBfX2luaXQgYmNtNDd4eF9sZWRzX3JlZ2lzdGVyKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2JvYXJkLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9ib2FyZC5jCmluZGV4IGYzZjZiZmUuLjZkNjEyZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2JvYXJkLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvYm9hcmQuYwpAQCAtMzYsMjYgKzM2LDMyIEBACiBzdHJ1Y3QgYmNtNDd4eF9ib2FyZF90eXBlX2xpc3QxIGJjbTQ3eHhfYm9hcmRfbGlzdF9tb2RlbF9uYW1lW10gX19pbml0Y29uc3QgPSB7CiAJe3tCQ000N1hYX0JPQVJEX0RMSU5LX0RJUjEzMCwgIkQtTGluayBESVItMTMwIn0sICJESVItMTMwIn0sCiAJe3tCQ000N1hYX0JPQVJEX0RMSU5LX0RJUjMzMCwgIkQtTGluayBESVItMzMwIn0sICJESVItMzMwIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIG1vZGVsX25vICovCiBzdGF0aWMgY29uc3QKIHN0cnVjdCBiY200N3h4X2JvYXJkX3R5cGVfbGlzdDEgYmNtNDd4eF9ib2FyZF9saXN0X21vZGVsX25vW10gX19pbml0Y29uc3QgPSB7CiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0w3MDBHRSwgIkFzdXMgV0w3MDAifSwgIldMNzAwIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIG1hY2hpbmVfbmFtZSAqLwogc3RhdGljIGNvbnN0CiBzdHJ1Y3QgYmNtNDd4eF9ib2FyZF90eXBlX2xpc3QxIGJjbTQ3eHhfYm9hcmRfbGlzdF9tYWNoaW5lX25hbWVbXSBfX2luaXRjb25zdCA9IHsKIAl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlRTTDU0R1MsICJMaW5rc3lzIFdSVFNMNTRHUyJ9LCAiV1JUU0w1NEdTIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIGhhcmR3YXJlX3ZlcnNpb24gKi8KIHN0YXRpYyBjb25zdAogc3RydWN0IGJjbTQ3eHhfYm9hcmRfdHlwZV9saXN0MSBiY200N3h4X2JvYXJkX2xpc3RfaGFyZHdhcmVfdmVyc2lvbltdIF9faW5pdGNvbnN0ID0geworCXt7QkNNNDdYWF9CT0FSRF9BU1VTX1JUTjEwVSwgIkFzdXMgUlQtTjEwVSJ9LCAiUlROMTBVIn0sCisJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTIsICJBc3VzIFJULU4xMiJ9LCAiUlQtTjEyIn0sCisJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJCMSwgIkFzdXMgUlQtTjEyQjEifSwgIlJUTjEyQjEifSwKKwl7e0JDTTQ3WFhfQk9BUkRfQVNVU19SVE4xMkMxLCAiQXN1cyBSVC1OMTJDMSJ9LCAiUlROMTJDMSJ9LAorCXt7QkNNNDdYWF9CT0FSRF9BU1VTX1JUTjEyRDEsICJBc3VzIFJULU4xMkQxIn0sICJSVE4xMkQxIn0sCisJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJIUCwgIkFzdXMgUlQtTjEySFAifSwgIlJUTjEySFAifSwKIAl7e0JDTTQ3WFhfQk9BUkRfQVNVU19SVE4xNiwgIkFzdXMgUlQtTjE2In0sICJSVC1OMTYtIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0wzMjBHRSwgIkFzdXMgV0wzMjBHRSJ9LCAiV0wzMjBHLSJ9LAogCXt7QkNNNDdYWF9CT0FSRF9BU1VTX1dMMzMwR0UsICJBc3VzIFdMMzMwR0UifSwgIldMMzMwR0UtIn0sCkBAIC02Niw3ICs3Miw3IEBACiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0w1MjBHQywgIkFzdXMgV0w1MjBHQyJ9LCAiV0w1MjBHQy0ifSwKIAl7e0JDTTQ3WFhfQk9BUkRfQVNVU19XTDUyMEdVLCAiQXN1cyBXTDUyMEdVIn0sICJXTDUyMEdVLSJ9LAogCXt7QkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMSwgIkJlbGtpbiBGN0Q0MzAxIn0sICJGN0Q0MzAxIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIHByb2R1Y3RpZCAqLwpAQCAtNzUsMTkgKzgxLDEzIEBACiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlRBQzY2VSwgIkFzdXMgUlQtQUM2NlUifSwgIlJULUFDNjZVIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTAsICJBc3VzIFJULU4xMCJ9LCAiUlQtTjEwIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTBELCAiQXN1cyBSVC1OMTBEIn0sICJSVC1OMTBEIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTBVLCAiQXN1cyBSVC1OMTBVIn0sICJSVC1OMTBVIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTIsICJBc3VzIFJULU4xMiJ9LCAiUlQtTjEyIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJCMSwgIkFzdXMgUlQtTjEyQjEifSwgIlJULU4xMkIxIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJDMSwgIkFzdXMgUlQtTjEyQzEifSwgIlJULU4xMkMxIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJEMSwgIkFzdXMgUlQtTjEyRDEifSwgIlJULU4xMkQxIn0sCi0Je3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTJIUCwgIkFzdXMgUlQtTjEySFAifSwgIlJULU4xMkhQIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTVVLCAiQXN1cyBSVC1OMTVVIn0sICJSVC1OMTVVIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlROMTYsICJBc3VzIFJULU4xNiJ9LCAiUlQtTjE2In0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlRONTMsICJBc3VzIFJULU41MyJ9LCAiUlQtTjUzIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfUlRONjZVLCAiQXN1cyBSVC1ONjZVIn0sICJSVC1ONjZVIn0sCiAJe3tCQ000N1hYX0JPQVJEX0FTVVNfV0wzMDBHLCAiQXN1cyBXTDMwMEcifSwgIldMMzAwZyJ9LAogCXt7QkNNNDdYWF9CT0FSRF9BU1VTX1dMSERELCAiQXN1cyBXTEhERCJ9LCAiV0xIREQifSwKLQl7IHswfSwgMH0sCisJeyB7MH0sIE5VTEx9LAogfTsKIAogLyogTW9kZWxJZCAqLwpAQCAtOTcsNyArOTcsNyBAQAogCXt7QkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XRTgwMEcsICJNb3Rvcm9sYSBXRTgwMEcifSwgIldFODAwRyJ9LAogCXt7QkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XUjg1MEdQLCAiTW90b3JvbGEgV1I4NTBHUCJ9LCAiV1I4NTBHUCJ9LAogCXt7QkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XUjg1MEdWMlYzLCAiTW90b3JvbGEgV1I4NTBHIn0sICJXUjg1MEcifSwKLQl7IHswfSwgMH0sCisJeyB7MH0sIE5VTEx9LAogfTsKIAogLyogbWVsY29faWQgb3IgYnVmMWZhbG9faWQgKi8KQEAgLTExMiw3ICsxMTIsNyBAQAogCXt7QkNNNDdYWF9CT0FSRF9CVUZGQUxPX1daUl9HMzAwTiwgIkJ1ZmZhbG8gV1pSLUczMDBOIn0sICIzMTEyMCJ9LAogCXt7QkNNNDdYWF9CT0FSRF9CVUZGQUxPX1daUl9SU19HNTQsICJCdWZmYWxvIFdaUi1SUy1HNTQifSwgIjMwMDgzIn0sCiAJe3tCQ000N1hYX0JPQVJEX0JVRkZBTE9fV1pSX1JTX0c1NEhQLCAiQnVmZmFsbyBXWlItUlMtRzU0SFAifSwgIjMwMTAzIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIGJvb3RfaHdfbW9kZWwsIGJvb3RfaHdfdmVyICovCkBAIC0xNDMsNyArMTQzLDcgQEAKIAl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEczR1YyLCAiTGlua3N5cyBXUlQ1NEczR1YyLVZGIn0sICJXUlQ1NEczR1YyLVZGIiwgIjEuMCJ9LAogCXt7QkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMSwgIkxpbmtzeXMgV1JUNjEwTiBWMSJ9LCAiV1JUNjEwTiIsICIxLjAifSwKIAl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjIsICJMaW5rc3lzIFdSVDYxME4gVjIifSwgIldSVDYxME4iLCAiMi4wIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIGJvYXJkX2lkICovCkBAIC0xNjUsNyArMTY1LDcgQEAKIAl7e0JDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTlIzNTAwVjIsICJOZXRnZWFyIFdOUjM1MDAgVjIifSwgIlUxMkgxMjdUMDBfTkVUR0VBUiJ9LAogCXt7QkNNNDdYWF9CT0FSRF9ORVRHRUFSX1dOUjM1MDBWMlZDLCAiTmV0Z2VhciBXTlIzNTAwIFYydmMifSwgIlUxMkgxMjdUNzBfTkVUR0VBUiJ9LAogCXt7QkNNNDdYWF9CT0FSRF9ORVRHRUFSX1dOUjgzNEJWMiwgIk5ldGdlYXIgV05SODM0QiBWMiJ9LCAiVTEySDA4MVQwMF9ORVRHRUFSIn0sCi0JeyB7MH0sIDB9LAorCXsgezB9LCBOVUxMfSwKIH07CiAKIC8qIGJvYXJkdHlwZSwgYm9hcmRudW0sIGJvYXJkcmV2ICovCkBAIC0xNzQsNyArMTc0LDkgQEAKIAl7e0JDTTQ3WFhfQk9BUkRfSFVBV0VJX0U5NzAsICJIdWF3ZWkgRTk3MCJ9LCAiMHgwNDhlIiwgIjB4NTM0NyIsICIweDExIn0sCiAJe3tCQ000N1hYX0JPQVJEX1BISUNPTU1fTTEsICJQaGljb21tIE0xIn0sICIweDA1OTAiLCAiODAiLCAiMHgxMTA0In0sCiAJe3tCQ000N1hYX0JPQVJEX1pURV9IMjE4TiwgIlpURSBIMjE4TiJ9LCAiMHgwNTNkIiwgIjEyMzQiLCAiMHgxMzA1In0sCi0JeyB7MH0sIDB9LAorCXt7QkNNNDdYWF9CT0FSRF9ORVRHRUFSX1dOUjM1MDBMLCAiTmV0Z2VhciBXTlIzNTAwTCJ9LCAiMHgwNENGIiwgIjM1MDAiLCAiMDIifSwKKwl7e0JDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEdTVjEsICJMaW5rc3lzIFdSVDU0R1MgVjEifSwgIjB4MDEwMSIsICI0MiIsICIweDEwIn0sCisJeyB7MH0sIE5VTEx9LAogfTsKIAogc3RhdGljIGNvbnN0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9idXR0b25zLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9idXR0b25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyYzYyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L2J1dHRvbnMuYwpAQCAtMCwwICsxLDUzMSBAQAorI2luY2x1ZGUgImJjbTQ3eHhfcHJpdmF0ZS5oIgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxiY200N3h4X2JvYXJkLmg+CisjaW5jbHVkZSA8YmNtNDd4eC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERhdGFiYXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQkNNNDdYWF9HUElPX0tFWShfZ3BpbywgX2NvZGUpCQkJCQlcCisJewkJCQkJCQkJXAorCQkuY29kZQkJPSBfY29kZSwJCQkJXAorCQkuZ3BpbwkJPSBfZ3BpbywJCQkJXAorCQkuYWN0aXZlX2xvdwk9IDEsCQkJCQlcCisJfQorCisvKiBBc3VzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2FzdXNfcnRuMTJbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDAsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDEsIEtFWV9SRVNUQVJUKSwKKwlCQ000N1hYX0dQSU9fS0VZKDQsIEJUTl8wKSwgLyogUm91dGVyIG1vZGUgKi8KKwlCQ000N1hYX0dQSU9fS0VZKDUsIEJUTl8xKSwgLyogUmVwZWF0ZXIgbW9kZSAqLworCUJDTTQ3WFhfR1BJT19LRVkoNiwgQlROXzIpLCAvKiBBUCBtb2RlICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3J0bjE2W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg4LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3J0bjY2dVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoOSwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfYXN1c193bDMwMGdbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2FzdXNfd2wzMjBnZVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfYXN1c193bDMzMGdlW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgyLCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3dsNTAwZ2RbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MDBncHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3dsNTAwZ3B2MltdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoMiwgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoMywgS0VZX1dQU19CVVRUT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfYXN1c193bDUwMHdbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKKwlCQ000N1hYX0dQSU9fS0VZKDcsIEtFWV9XUFNfQlVUVE9OKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MjBnY1tdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoMiwgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoMywgS0VZX1dQU19CVVRUT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfYXN1c193bDUyMGd1W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgyLCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSgzLCBLRVlfV1BTX0JVVFRPTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3dsNzAwZ2VbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDAsIEtFWV9QT1dFUiksIC8qIEhhcmQgZGlzayBwb3dlciBzd2l0Y2ggKi8KKwlCQ000N1hYX0dQSU9fS0VZKDQsIEtFWV9XUFNfQlVUVE9OKSwgLyogRVpTZXR1cCAqLworCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX0NPUFkpLCAvKiBDb3B5IGRhdGEgZnJvbSBVU0IgdG8gaW50ZXJuYWwgZGlzayAqLworCUJDTTQ3WFhfR1BJT19LRVkoNywgS0VZX1JFU1RBUlQpLCAvKiBIYXJkIHJlc2V0ICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19hc3VzX3dsaGRkW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCisvKiBIdWF3ZWkgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfaHVhd2VpX2U5NzBbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKKy8qIEJlbGtpbiAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19iZWxraW5fZjdkNDMwMVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoOCwgS0VZX1dQU19CVVRUT04pLAorfTsKKworLyogQnVmZmFsbyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3docjJfYTU0ZzU0W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3docl9nMTI1W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSg1LCBCVE5fMCksIC8qIFJvdXRlciAvIEFQIG1vZGUgc3d0aWNoICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3docl9nNTRzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSg1LCBCVE5fMCksIC8qIFJvdXRlciAvIEFQIG1vZGUgc3d0aWNoICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3docl9ocF9nNTRbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDAsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDQsIEtFWV9SRVNUQVJUKSwKKwlCQ000N1hYX0dQSU9fS0VZKDUsIEJUTl8wKSwgLyogUm91dGVyIC8gQVAgbW9kZSBzd3RpY2ggKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2J1ZmZhbG9fd3pyX2czMDBuW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3d6cl9yc19nNTRbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDAsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDQsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2J1ZmZhbG9fd3pyX3JzX2c1NGhwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfUkVTVEFSVCksCit9OworCisvKiBEZWxsICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2RlbGxfdG0yMzAwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfUkVTVEFSVCksCit9OworCisvKiBELUxpbmsgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfZGxpbmtfZGlyMTMwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgzLCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSg3LCBLRVlfVU5LTk9XTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19kbGlua19kaXIzMzBbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDMsIEtFWV9SRVNUQVJUKSwKKwlCQ000N1hYX0dQSU9fS0VZKDcsIEtFWV9VTktOT1dOKSwKK307CisKKy8qIExpbmtzeXMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c19lMTAwMHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg1LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2UxMDAwdjIxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg5LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSgxMCwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c19lMjAwMHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg1LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg4LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2UzMDAwdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDQsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfZTMyMDB2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNSwgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoOCwgS0VZX1dQU19CVVRUT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c19lNDIwMHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDE1MG52MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQxNTBudjExW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDE2MG52MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQxNjBudjNbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDUsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0MzAwbnYxMVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1VOS05PV04pLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQzMTBudjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKKwlCQ000N1hYX0dQSU9fS0VZKDgsIEtFWV9VTktOT1dOKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NjEwbnYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCisJQkNNNDdYWF9HUElPX0tFWSg4LCBLRVlfV1BTX0JVVFRPTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDYxMG52MltdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAorfTsKKworLyogTW90b3JvbGEgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbW90b3JvbGFfd2U4MDBnW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSgwLCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19tb3Rvcm9sYV93cjg1MGdwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg1LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19tb3Rvcm9sYV93cjg1MGd2MnYzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg1LCBLRVlfUkVTVEFSVCksCit9OworCisvKiBOZXRnZWFyICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX25ldGdlYXJfd25kcjM0MDB2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1dQU19CVVRUT04pLAorCUJDTTQ3WFhfR1BJT19LRVkoOCwgS0VZX1JGS0lMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KK2JjbTQ3eHhfYnV0dG9uc19uZXRnZWFyX3duZHIzNzAwdjNbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDIsIEtFWV9SRktJTEwpLAorCUJDTTQ3WFhfR1BJT19LRVkoMywgS0VZX1JFU1RBUlQpLAorCUJDTTQ3WFhfR1BJT19LRVkoNCwgS0VZX1dQU19CVVRUT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbmV0Z2Vhcl93bmRyNDUwMHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg1LCBLRVlfUkZLSUxMKSwKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX25ldGdlYXJfd25yODM0YnYyW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCisvKiBTaW1wbGVUZWNoICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX3NpbXBsZXRlY2hfc2ltcGxlc2hhcmVbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDAsIEtFWV9SRVNUQVJUKSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJjbTQ3eHhfYnV0dG9uX3BkYXRhOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiY200N3h4X2J1dHRvbnNfZ3Bpb19rZXlzID0geworCS5uYW1lID0gImdwaW8ta2V5cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmNtNDd4eF9idXR0b25fcGRhdGEsCisJfQorfTsKKworLyogQ29weSBkYXRhIGZyb20gX19pbml0Y29uc3QgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJjbTQ3eHhfYnV0dG9uc19jb3B5KGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b25zLAorCQkJCSAgICAgICBzaXplX3QgbmJ1dHRvbnMpCit7CisJc2l6ZV90IHNpemUgPSBuYnV0dG9ucyAqIHNpemVvZigqYnV0dG9ucyk7CisKKwliY200N3h4X2J1dHRvbl9wZGF0YS5idXR0b25zID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJjbTQ3eHhfYnV0dG9uX3BkYXRhLmJ1dHRvbnMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShiY200N3h4X2J1dHRvbl9wZGF0YS5idXR0b25zLCBidXR0b25zLCBzaXplKTsKKwliY200N3h4X2J1dHRvbl9wZGF0YS5uYnV0dG9ucyA9IG5idXR0b25zOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgYmNtNDd4eF9jb3B5X2JkYXRhKGRldl9idXR0b25zKQkJCQkJXAorCWJjbTQ3eHhfYnV0dG9uc19jb3B5KGRldl9idXR0b25zLCBBUlJBWV9TSVpFKGRldl9idXR0b25zKSk7CisKK2ludCBfX2luaXQgYmNtNDd4eF9idXR0b25zX3JlZ2lzdGVyKHZvaWQpCit7CisJZW51bSBiY200N3h4X2JvYXJkIGJvYXJkID0gYmNtNDd4eF9ib2FyZF9nZXQoKTsKKwlpbnQgZXJyOworCisJc3dpdGNoIChib2FyZCkgeworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1JUTjEyOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfcnRuMTIpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19SVE4xNjoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19hc3VzX3J0bjE2KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfUlRONjZVOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfcnRuNjZ1KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0wzMDBHOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2wzMDBnKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0wzMjBHRToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19hc3VzX3dsMzIwZ2UpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDMzMEdFOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2wzMzBnZSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMNTAwR0Q6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYXN1c193bDUwMGdkKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBHUFYxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MDBncHYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBHUFYyOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MDBncHYyKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBXOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MDB3KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MjBHQzoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19hc3VzX3dsNTIwZ2MpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDUyMEdVOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2w1MjBndSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMNzAwR0U6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYXN1c193bDcwMGdlKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0xIREQ6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYXN1c193bGhkZCk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2JlbGtpbl9mN2Q0MzAxKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XSFIyX0E1NEc1NDoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3docjJfYTU0ZzU0KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0JVRkZBTE9fV0hSX0cxMjU6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYnVmZmFsb193aHJfZzEyNSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dIUl9HNTRTOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2J1ZmZhbG9fd2hyX2c1NHMpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XSFJfSFBfRzU0OgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2J1ZmZhbG9fd2hyX2hwX2c1NCk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1daUl9HMzAwTjoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19idWZmYWxvX3d6cl9nMzAwbik7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1daUl9SU19HNTQ6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYnVmZmFsb193enJfcnNfZzU0KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0JVRkZBTE9fV1pSX1JTX0c1NEhQOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2J1ZmZhbG9fd3pyX3JzX2c1NGhwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTQ3WFhfQk9BUkRfREVMTF9UTTIzMDA6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfZGVsbF90bTIzMDApOworCQlicmVhazsKKworCWNhc2UgQkNNNDdYWF9CT0FSRF9ETElOS19ESVIxMzA6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfZGxpbmtfZGlyMTMwKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0RMSU5LX0RJUjMzMDoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19kbGlua19kaXIzMzApOworCQlicmVhazsKKworCWNhc2UgQkNNNDdYWF9CT0FSRF9IVUFXRUlfRTk3MDoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19odWF3ZWlfZTk3MCk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfRTEwMDBWMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2UxMDAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19FMTAwMFYyMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2UxMDAwdjIxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfRTIwMDBWMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2UyMDAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19FMzAwMFYxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfZTMwMDB2MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX0UzMjAwVjE6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c19lMzIwMHYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfRTQyMDBWMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX2U0MjAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQxNTBOVjE6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQxNTBudjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQxNTBOVjExOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0MTUwbnYxMSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDE2ME5WMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDE2MG52MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDE2ME5WMzoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDE2MG52Myk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDMwME5WMTE6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQzMDBudjExKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUMzEwTlYxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0MzEwbnYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NjEwbnYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYyOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NjEwbnYyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTU9UT1JPTEFfV0U4MDBHOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX21vdG9yb2xhX3dlODAwZyk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XUjg1MEdQOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX21vdG9yb2xhX3dyODUwZ3ApOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTU9UT1JPTEFfV1I4NTBHVjJWMzoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19tb3Rvcm9sYV93cjg1MGd2MnYzKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTkRSMzQwMFYxOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX25ldGdlYXJfd25kcjM0MDB2MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9ORVRHRUFSX1dORFIzNzAwVjM6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbmV0Z2Vhcl93bmRyMzcwMHYzKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX05FVEdFQVJfV05EUjQ1MDBWMToKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19uZXRnZWFyX3duZHI0NTAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTlI4MzRCVjI6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbmV0Z2Vhcl93bnI4MzRidjIpOworCQlicmVhazsKKworCWNhc2UgQkNNNDdYWF9CT0FSRF9TSU1QTEVURUNIX1NJTVBMRVNIQVJFOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX3NpbXBsZXRlY2hfc2ltcGxlc2hhcmUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJObyBidXR0b25zIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yIHRoaXMgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYmNtNDd4eF9idXR0b25zX2dwaW9fa2V5cyk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2U6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvaXJxLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9pcnEuYwppbmRleCA4Y2YzODMzLi5lMDU4NWI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9pcnEuYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9pcnEuYwpAQCAtMjUsMTAgKzI1LDExIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgogI2luY2x1ZGUgPGJjbTQ3eHguaD4KIAotdm9pZCBwbGF0X2lycV9kaXNwYXRjaCh2b2lkKQorYXNtbGlua2FnZSB2b2lkIHBsYXRfaXJxX2Rpc3BhdGNoKHZvaWQpCiB7CiAJdTMyIGNhdXNlOwogCkBAIC01MCw2ICs1MSwxOCBAQAogCQlkb19JUlEoNik7CiB9CiAKKyNkZWZpbmUgREVGSU5FX0hXeF9JUlFESVNQQVRDSCh4KQkJCQkJXAorCXN0YXRpYyB2b2lkIGJjbTQ3eHhfaHcgIyMgeCAjIyBfaXJxZGlzcGF0Y2godm9pZCkJCVwKKwl7CQkJCQkJCQlcCisJCWRvX0lSUSh4KTsJCQkJCQlcCisJfQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCgyKQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCgzKQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCg0KQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCg1KQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCg2KQorREVGSU5FX0hXeF9JUlFESVNQQVRDSCg3KQorCiB2b2lkIF9faW5pdCBhcmNoX2luaXRfaXJxKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0JDTTQ3WFhfQkNNQQpAQCAtNjQsNCArNzcsMTQgQEAKIAl9CiAjZW5kaWYKIAltaXBzX2NwdV9pcnFfaW5pdCgpOworCisJaWYgKGNwdV9oYXNfdmludCkgeworCQlwcl9pbmZvKCJTZXR0aW5nIHVwIHZlY3RvcmVkIGludGVycnVwdHNcbiIpOworCQlzZXRfdmlfaGFuZGxlcigyLCBiY200N3h4X2h3Ml9pcnFkaXNwYXRjaCk7CisJCXNldF92aV9oYW5kbGVyKDMsIGJjbTQ3eHhfaHczX2lycWRpc3BhdGNoKTsKKwkJc2V0X3ZpX2hhbmRsZXIoNCwgYmNtNDd4eF9odzRfaXJxZGlzcGF0Y2gpOworCQlzZXRfdmlfaGFuZGxlcig1LCBiY200N3h4X2h3NV9pcnFkaXNwYXRjaCk7CisJCXNldF92aV9oYW5kbGVyKDYsIGJjbTQ3eHhfaHc2X2lycWRpc3BhdGNoKTsKKwkJc2V0X3ZpX2hhbmRsZXIoNywgYmNtNDd4eF9odzdfaXJxZGlzcGF0Y2gpOworCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L2xlZHMuYyBiL2FyY2gvbWlwcy9iY200N3h4L2xlZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDdkMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvbGVkcy5jCkBAIC0wLDAgKzEsNTQyIEBACisjaW5jbHVkZSAiYmNtNDd4eF9wcml2YXRlLmgiCisKKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8YmNtNDd4eF9ib2FyZC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERhdGFiYXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQkNNNDdYWF9HUElPX0xFRChfZ3BpbywgX2NvbG9yLCBfZnVuY3Rpb24sIF9hY3RpdmVfbG93LAkJXAorCQkJIF9kZWZhdWx0X3N0YXRlKQkJCQlcCisJewkJCQkJCQkJXAorCQkubmFtZQkJPSAiYmNtNDd4eDoiIF9jb2xvciAiOiIgX2Z1bmN0aW9uLAlcCisJCS5ncGlvCQk9IF9ncGlvLAkJCQlcCisJCS5hY3RpdmVfbG93CT0gX2FjdGl2ZV9sb3csCQkJCVwKKwkJLmRlZmF1bHRfc3RhdGUJPSBfZGVmYXVsdF9zdGF0ZSwJCQlcCisJfQorCisjZGVmaW5lIEJDTTQ3WFhfR1BJT19MRURfVFJJR0dFUihfZ3BpbywgX2NvbG9yLCBfZnVuY3Rpb24sIF9hY3RpdmVfbG93LAlcCisJCQkJIF9kZWZhdWx0X3RyaWdnZXIpCQkJXAorCXsJCQkJCQkJCVwKKwkJLm5hbWUJCT0gImJjbTQ3eHg6IiBfY29sb3IgIjoiIF9mdW5jdGlvbiwJXAorCQkuZ3BpbwkJPSBfZ3BpbywJCQkJXAorCQkuYWN0aXZlX2xvdwk9IF9hY3RpdmVfbG93LAkJCQlcCisJCS5kZWZhdWx0X3N0YXRlCT0gTEVEU19HUElPX0RFRlNUQVRFX09GRiwJCVwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9IF9kZWZhdWx0X3RyaWdnZXIsCQlcCisJfQorCisvKiBBc3VzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19hc3VzX3J0bjEyW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgyLCAidW5rIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAid2xhbiIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfcnRuMTZbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJibHVlIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJibHVlIiwgIndsYW4iLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19hc3VzX3J0bjY2dVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMTIsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoMTUsICJ1bmsiLCAidXNiIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYXN1c193bDMwMGdbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfd2wzMjBnZVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJ3bGFuIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgyLCAidW5rIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDExLCAidW5rIiwgImxpbmsiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19hc3VzX3dsMzMwZ2VbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfd2w1MDBnZFtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYXN1c193bDUwMGdwdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfd2w1MDBncHYyW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAid2xhbiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfd2w1MDB3W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCg1LCAidW5rIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19hc3VzX3dsNTIwZ2NbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJ3bGFuIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYXN1c193bDUyMGd1W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAid2xhbiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2FzdXNfd2w3MDBnZVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksIC8qIExhYmVsZWQgIlJFQURZIiAodGhlcmUgaXMgbm8gInBvd2VyIiBMRUQpLiBPcmlnaW5hbGx5IE9OLCBmbGFzaGluZyBvbiBVU0IgYWN0aXZpdHkuICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYXN1c193bGhkZFtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCgyLCAidW5rIiwgInVzYiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworLyogQmVsa2luICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19iZWxraW5fZjdkNDMwMVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMTAsICJncmVlbiIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCgxMSwgImFtYmVyIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgxMiwgInVuayIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEzLCAidW5rIiwgIndsYW4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDE0LCAidW5rIiwgInVzYjAiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDE1LCAidW5rIiwgInVzYjEiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKKy8qIEJ1ZmZhbG8gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2J1ZmZhbG9fd2hyMl9hNTRnNTRbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiZGlhZyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2J1ZmZhbG9fd2hyX2cxMjVbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAiYnJpZGdlIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgyLCAidW5rIiwgIndsYW4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJ1bmsiLCAiaW50ZXJuYWwiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDYsICJ1bmsiLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgImRpYWciLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19idWZmYWxvX3docl9nNTRzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgImJyaWRnZSIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMiwgInVuayIsICJ3bGFuIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAidW5rIiwgImludGVybmFsIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg2LCAidW5rIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJkaWFnIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYnVmZmFsb193aHJfaHBfZzU0W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgImJyaWRnZSIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMiwgInVuayIsICJ3bGFuIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAidW5rIiwgImludGVybmFsIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg2LCAidW5rIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJkaWFnIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYnVmZmFsb193enJfZzMwMG5bXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAiYnJpZGdlIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg2LCAidW5rIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJkaWFnIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfYnVmZmFsb193enJfcnNfZzU0W10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCg2LCAidW5rIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJ2cG4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiZGlhZyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2J1ZmZhbG9fd3pyX3JzX2c1NGhwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCg2LCAidW5rIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJ2cG4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiZGlhZyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworLyogRGVsbCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfZGVsbF90bTIzMDBbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDYsICJ1bmsiLCAid2xhbiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCit9OworCisvKiBELUxpbmsgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2RsaW5rX2RpcjEzMFtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRURfVFJJR0dFUigwLCAiZ3JlZW4iLCAic3RhdHVzIiwgMSwgInRpbWVyIiksIC8qIE9yaWdpbmFsbHkgYmxpbmtpbmcgd2hlbiBkZXZpY2UgaXMgcmVhZHksIHNlcGFyYXRlZCBmcm9tICJwb3dlciIgTEVEICovCisJQkNNNDdYWF9HUElPX0xFRCg2LCAiYmx1ZSIsICJ1bmsiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19kbGlua19kaXIzMzBbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEX1RSSUdHRVIoMCwgImdyZWVuIiwgInN0YXR1cyIsIDEsICJ0aW1lciIpLCAvKiBPcmlnaW5hbGx5IGJsaW5raW5nIHdoZW4gZGV2aWNlIGlzIHJlYWR5LCBzZXBhcmF0ZWQgZnJvbSAicG93ZXIiIExFRCAqLworCUJDTTQ3WFhfR1BJT19MRUQoNCwgInVuayIsICJ1c2IiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDYsICJibHVlIiwgInVuayIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworLyogSHVhd2VpICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19odWF3ZWlfZTk3MFtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJ3bGFuIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCisvKiBMaW5rc3lzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX2UxMDAwdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJibHVlIiwgIndsYW4iLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJibHVlIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJhbWJlciIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDQsICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfZTEwMDB2MjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJ1bmsiLCAid2xhbiIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNiwgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCg3LCAiYW1iZXIiLCAid3BzIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg4LCAiYmx1ZSIsICJ3cHMiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX2UyMDAwdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJibHVlIiwgIndsYW4iLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJibHVlIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNCwgImFtYmVyIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfZTMwMDB2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgImFtYmVyIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJ3bGFuIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAiYmx1ZSIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgInVuayIsICJ1c2IiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX2UzMjAwdjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJncmVlbiIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfbGlua3N5c19lNDIwMHYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCg1LCAid2hpdGUiLCAicG93ZXIiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MTUwbnYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJhbWJlciIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJncmVlbiIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX3dydDE1MG52MTFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoMywgImFtYmVyIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNSwgImdyZWVuIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MTYwbnYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJhbWJlciIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDUsICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MTYwbnYzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJhbWJlciIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDQsICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MzAwbnYxMVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJwb3dlciIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAiYW1iZXIiLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCg1LCAiZ3JlZW4iLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfbGlua3N5c193cnQzMTBudjFbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJibHVlIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJhbWJlciIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDksICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NjEwbnYxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgInVzYiIsICAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAiYW1iZXIiLCAid3BzIiwgIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoOSwgImJsdWUiLCAid3BzIiwgIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NjEwbnYyW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAiYW1iZXIiLCAid3BzIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgIndsYW4iLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJibHVlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNSwgInVuayIsICJwb3dlciIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgInVzYiIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworLyogTW90b3JvbGEgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX21vdG9yb2xhX3dlODAwZ1tdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMSwgImFtYmVyIiwgIndsYW4iLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJ1bmsiLCAidW5rIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksIC8qIFRoZXJlIGFyZSBvbmx5IDMgTEVEczogUG93ZXIsIFdpcmVsZXNzIGFuZCBEZXZpY2UgKGV0aGVybmV0KSAqLworCUJDTTQ3WFhfR1BJT19MRUQoNCwgImdyZWVuIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19tb3Rvcm9sYV93cjg1MGdwW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgIndsYW4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoNiwgInVuayIsICJkbXoiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiZGlhZyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX21vdG9yb2xhX3dyODUwZ3YydjNbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDAsICJ1bmsiLCAid2xhbiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMSwgInVuayIsICJwb3dlciIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgImRpYWciLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKKy8qIE5ldGdlYXIgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX25ldGdlYXJfd25kcjM0MDB2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMiwgImdyZWVuIiwgInVzYiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMywgImdyZWVuIiwgInBvd2VyIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJhbWJlciIsICJwb3dlciIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX25ldGdlYXJfd25kcjQ1MDB2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMSwgImdyZWVuIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMiwgImdyZWVuIiwgInBvd2VyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09OKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJhbWJlciIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoOCwgImdyZWVuIiwgInVzYjEiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDksICJncmVlbiIsICIyZ2h6IiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgxMSwgImJsdWUiLCAiNWdoeiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMTQsICJncmVlbiIsICJ1c2IyIiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCitiY200N3h4X2xlZHNfbmV0Z2Vhcl93bnI4MzRidjJbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDIsICJncmVlbiIsICJwb3dlciIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAiYW1iZXIiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiY29ubmVjdGVkIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCisvKiBTaW1wbGVUZWNoICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19zaW1wbGV0ZWNoX3NpbXBsZXNoYXJlW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgxLCAidW5rIiwgInN0YXR1cyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLCAvKiAiUmVhZHkiIExFRCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBiY200N3h4X2xlZHNfcGRhdGE7CisKKyNkZWZpbmUgYmNtNDd4eF9zZXRfcGRhdGEoZGV2X2xlZHMpIGRvIHsJCQkJXAorCWJjbTQ3eHhfbGVkc19wZGF0YS5sZWRzID0gZGV2X2xlZHM7CQkJCVwKKwliY200N3h4X2xlZHNfcGRhdGEubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGRldl9sZWRzKTsJCVwKK30gd2hpbGUgKDApCisKK3ZvaWQgX19pbml0IGJjbTQ3eHhfbGVkc19yZWdpc3Rlcih2b2lkKQoreworCWVudW0gYmNtNDd4eF9ib2FyZCBib2FyZCA9IGJjbTQ3eHhfYm9hcmRfZ2V0KCk7CisKKwlzd2l0Y2ggKGJvYXJkKSB7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfUlROMTI6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3J0bjEyKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfUlROMTY6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3J0bjE2KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfUlRONjZVOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYXN1c19ydG42NnUpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDMwMEc6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3dsMzAwZyk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMMzIwR0U6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3dsMzIwZ2UpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDMzMEdFOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYXN1c193bDMzMGdlKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBHRDoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2FzdXNfd2w1MDBnZCk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMNTAwR1BWMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2FzdXNfd2w1MDBncHYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w1MDBHUFYyOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYXN1c193bDUwMGdwdjIpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDUwMFc6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3dsNTAwdyk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMNTIwR0M6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19hc3VzX3dsNTIwZ2MpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQVNVU19XTDUyMEdVOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYXN1c193bDUyMGd1KTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0FTVVNfV0w3MDBHRToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2FzdXNfd2w3MDBnZSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9BU1VTX1dMSEREOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYXN1c193bGhkZCk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAxOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYmVsa2luX2Y3ZDQzMDEpOworCQlicmVhazsKKworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dIUjJfQTU0RzU0OgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYnVmZmFsb193aHIyX2E1NGc1NCk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dIUl9HMTI1OgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYnVmZmFsb193aHJfZzEyNSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dIUl9HNTRTOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfYnVmZmFsb193aHJfZzU0cyk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dIUl9IUF9HNTQ6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19idWZmYWxvX3docl9ocF9nNTQpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XWlJfRzMwME46CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19idWZmYWxvX3d6cl9nMzAwbik7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1daUl9SU19HNTQ6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19idWZmYWxvX3d6cl9yc19nNTQpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XWlJfUlNfRzU0SFA6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19idWZmYWxvX3d6cl9yc19nNTRocCk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX0RFTExfVE0yMzAwOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfZGVsbF90bTIzMDApOworCQlicmVhazsKKworCWNhc2UgQkNNNDdYWF9CT0FSRF9ETElOS19ESVIxMzA6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19kbGlua19kaXIxMzApOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfRExJTktfRElSMzMwOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfZGxpbmtfZGlyMzMwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTQ3WFhfQk9BUkRfSFVBV0VJX0U5NzA6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19odWF3ZWlfZTk3MCk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfRTEwMDBWMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfZTEwMDB2MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX0UxMDAwVjIxOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c19lMTAwMHYyMSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX0UyMDAwVjE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX2UyMDAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19FMzAwMFYxOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c19lMzAwMHYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfRTMyMDBWMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfZTMyMDB2MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX0U0MjAwVjE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX2U0MjAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQxNTBOVjE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDE1MG52MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDE1ME5WMTE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDE1MG52MTEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQxNjBOVjE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDE2MG52MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDE2ME5WMzoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MTYwbnYzKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUMzAwTlYxMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MzAwbnYxMSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDMxME5WMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MzEwbnYxKTsKKwkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYxOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c193cnQ2MTBudjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjI6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDYxMG52Mik7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX01PVE9ST0xBX1dFODAwRzoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX21vdG9yb2xhX3dlODAwZyk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XUjg1MEdQOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbW90b3JvbGFfd3I4NTBncCk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9NT1RPUk9MQV9XUjg1MEdWMlYzOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbW90b3JvbGFfd3I4NTBndjJ2Myk7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX05FVEdFQVJfV05EUjM0MDBWMToKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX25ldGdlYXJfd25kcjM0MDB2MSk7CisJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9ORVRHRUFSX1dORFI0NTAwVjE6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19uZXRnZWFyX3duZHI0NTAwdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTlI4MzRCVjI6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19uZXRnZWFyX3ducjgzNGJ2Mik7CisJCWJyZWFrOworCisJY2FzZSBCQ000N1hYX0JPQVJEX1NJTVBMRVRFQ0hfU0lNUExFU0hBUkU6CisJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19zaW1wbGV0ZWNoX3NpbXBsZXNoYXJlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiTm8gTEVEcyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciB0aGlzIGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZiY200N3h4X2xlZHNfcGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYyBiL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMKaW5kZXggYjRjNTg1Yi4uNmRlY2IyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CkBAIC0yMiwxMSArMjEsMTEgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1iY200N3h4L2JjbTQ3eHguaD4KIAogc3RhdGljIGNoYXIgbnZyYW1fYnVmW05WUkFNX1NQQUNFXTsKK3N0YXRpYyBjb25zdCB1MzIgbnZyYW1fc2l6ZXNbXSA9IHsweDgwMDAsIDB4RjAwMCwgMHgxMDAwMH07CiAKIHN0YXRpYyB1MzIgZmluZF9udnJhbV9zaXplKHUzMiBlbmQpCiB7CiAJc3RydWN0IG52cmFtX2hlYWRlciAqaGVhZGVyOwotCXUzMiBudnJhbV9zaXplc1tdID0gezB4ODAwMCwgMHhGMDAwLCAweDEwMDAwfTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52cmFtX3NpemVzKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9wcm9tLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9wcm9tLmMKaW5kZXggNWNiYTMxOC4uMGFmODA4ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3Byb20uYwpAQCAtMjgsMTI2ICsyOCwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9yZWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2Z3L2NmZS9jZmVfYXBpLmg+Ci0jaW5jbHVkZSA8YXNtL2Z3L2NmZS9jZmVfZXJyb3IuaD4KICNpbmNsdWRlIDxiY200N3h4Lmg+CiAjaW5jbHVkZSA8YmNtNDd4eF9ib2FyZC5oPgogCi1zdGF0aWMgaW50IGNmZV9jb25zX2hhbmRsZTsKIAotc3RhdGljIHUxNiBnZXRfY2hpcF9pZCh2b2lkKQotewotCXN3aXRjaCAoYmNtNDd4eF9idXNfdHlwZSkgewotI2lmZGVmIENPTkZJR19CQ000N1hYX1NTQgotCWNhc2UgQkNNNDdYWF9CVVNfVFlQRV9TU0I6Ci0JCXJldHVybiBiY200N3h4X2J1cy5zc2IuY2hpcF9pZDsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19CQ000N1hYX0JDTUEKLQljYXNlIEJDTTQ3WFhfQlVTX1RZUEVfQkNNQToKLQkJcmV0dXJuIGJjbTQ3eHhfYnVzLmJjbWEuYnVzLmNoaXBpbmZvLmlkOwotI2VuZGlmCi0JfQotCXJldHVybiAwOwotfQorc3RhdGljIGNoYXIgYmNtNDd4eF9zeXN0ZW1fdHlwZVsyMF0gPSAiQnJvYWRjb20gQkNNNDdYWCI7CiAKIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewotCXN0YXRpYyBjaGFyIGJ1Zls1MF07Ci0JdTE2IGNoaXBfaWQgPSBnZXRfY2hpcF9pZCgpOwotCi0Jc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJIChjaGlwX2lkID4gMHg5OTk5KSA/ICJCcm9hZGNvbSBCQ00lZCAoJXMpIiA6Ci0JCQkJICAgICAgIkJyb2FkY29tIEJDTSUwNFggKCVzKSIsCi0JCSBjaGlwX2lkLCBiY200N3h4X2JvYXJkX2dldF9uYW1lKCkpOwotCi0JcmV0dXJuIGJ1ZjsKKwlyZXR1cm4gYmNtNDd4eF9zeXN0ZW1fdHlwZTsKIH0KIAotdm9pZCBwcm9tX3B1dGNoYXIoY2hhciBjKQorX19pbml0IHZvaWQgYmNtNDd4eF9zZXRfc3lzdGVtX3R5cGUodTE2IGNoaXBfaWQpCiB7Ci0Jd2hpbGUgKGNmZV93cml0ZShjZmVfY29uc19oYW5kbGUsICZjLCAxKSA9PSAwKQotCQk7Ci19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBwcm9tX2luaXRfY2ZlKHZvaWQpCi17Ci0JdWludDMyX3QgY2ZlX2VwdDsKLQl1aW50MzJfdCBjZmVfaGFuZGxlOwotCXVpbnQzMl90IGNmZV9lcHRzZWFsOwotCWludCBhcmdjID0gZndfYXJnMDsKLQljaGFyICoqZW52cCA9IChjaGFyICoqKSBmd19hcmcyOwotCWludCAqcHJvbV92ZWMgPSAoaW50ICopIGZ3X2FyZzM7Ci0KLQkvKgotCSAqIENoZWNrIGlmIGEgbG9hZGVyIHdhcyB1c2VkOyBpZiBOT1QsIHRoZSA0IGFyZ3VtZW50cyBhcmUKLQkgKiB3aGF0IENGRSBnaXZlcyB1cyAoaGFuZGxlLCAwLCBFUFQgYW5kIEVQVFNFQUwpCi0JICovCi0JaWYgKGFyZ2MgPCAwKSB7Ci0JCWNmZV9oYW5kbGUgPSAodWludDMyX3QpYXJnYzsKLQkJY2ZlX2VwdCA9ICh1aW50MzJfdCllbnZwOwotCQljZmVfZXB0c2VhbCA9ICh1aW50MzJfdClwcm9tX3ZlYzsKLQl9IGVsc2UgewotCQlpZiAoKGludClwcm9tX3ZlYyA8IDApIHsKLQkJCS8qCi0JCQkgKiBPbGQgbG9hZGVyOyBhbGwgaXQgZ2l2ZXMgdXMgaXMgdGhlIGhhbmRsZSwKLQkJCSAqIHNvIHVzZSB0aGUgImtub3duIiBlbnRyeXBvaW50IGFuZCBhc3N1bWUKLQkJCSAqIHRoZSBzZWFsLgotCQkJICovCi0JCQljZmVfaGFuZGxlID0gKHVpbnQzMl90KXByb21fdmVjOwotCQkJY2ZlX2VwdCA9IDB4QkZDMDA1MDA7Ci0JCQljZmVfZXB0c2VhbCA9IENGRV9FUFRTRUFMOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIE5ld2VyIGxvYWRlcnMgYnVuZGxlIHRoZSBoYW5kbGUvZXB0L2VwdHNlYWwKLQkJCSAqIE5vdGU6IHByb21fdmVjIGlzIGluIHRoZSBsb2FkZXIncyB1c2VnCi0JCQkgKiB3aGljaCBpcyBzdGlsbCBhbGl2ZSBpbiB0aGUgVExCLgotCQkJICovCi0JCQljZmVfaGFuZGxlID0gcHJvbV92ZWNbMF07Ci0JCQljZmVfZXB0ID0gcHJvbV92ZWNbMl07Ci0JCQljZmVfZXB0c2VhbCA9IHByb21fdmVjWzNdOwotCQl9Ci0JfQotCi0JaWYgKGNmZV9lcHRzZWFsICE9IENGRV9FUFRTRUFMKSB7Ci0JCS8qIHRvbyBlYXJseSBmb3IgcGFuaWMgdG8gZG8gYW55IGdvb2QgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJDRkUncyBlbnRyeXBvaW50IHNlYWwgZG9lc24ndCBtYXRjaC4iKTsKLQkJd2hpbGUgKDEpIDsKLQl9Ci0KLQljZmVfaW5pdChjZmVfaGFuZGxlLCBjZmVfZXB0KTsKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHByb21faW5pdF9jb25zb2xlKHZvaWQpCi17Ci0JLyogSW5pdGlhbGl6ZSBDRkUgY29uc29sZSAqLwotCWNmZV9jb25zX2hhbmRsZSA9IGNmZV9nZXRzdGRoYW5kbGUoQ0ZFX1NUREhBTkRMRV9DT05TT0xFKTsKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHByb21faW5pdF9jbWRsaW5lKHZvaWQpCi17Ci0Jc3RhdGljIGNoYXIgYnVmW0NPTU1BTkRfTElORV9TSVpFXSBfX2luaXRkYXRhOwotCi0JLyogR2V0IHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGZyb20gQ0ZFICovCi0JaWYgKGNmZV9nZXRlbnYoIkxJTlVYX0NNRExJTkUiLCBidWYsIENPTU1BTkRfTElORV9TSVpFKSA+PSAwKSB7Ci0JCWJ1ZltDT01NQU5EX0xJTkVfU0laRSAtIDFdID0gMDsKLQkJc3RyY3B5KGFyY3NfY21kbGluZSwgYnVmKTsKLQl9Ci0KLQkvKiBGb3JjZSBhIGNvbnNvbGUgaGFuZG92ZXIgYnkgYWRkaW5nIGEgY29uc29sZT0gYXJndW1lbnQgaWYgbmVlZGVkLAotCSAqIGFzIENGRSBpcyBub3QgYXZhaWxhYmxlIGFueW1vcmUgbGF0ZXIgaW4gdGhlIGJvb3QgcHJvY2Vzcy4gKi8KLQlpZiAoKHN0cnN0cihhcmNzX2NtZGxpbmUsICJjb25zb2xlPSIpKSA9PSBOVUxMKSB7Ci0JCS8qIFRyeSB0byByZWFkIHRoZSBkZWZhdWx0IHNlcmlhbCBwb3J0IHVzZWQgYnkgQ0ZFICovCi0JCWlmICgoY2ZlX2dldGVudigiQk9PVF9DT05TT0xFIiwgYnVmLCBDT01NQU5EX0xJTkVfU0laRSkgPCAwKQotCQkgICAgfHwgKHN0cm5jbXAoInVhcnQiLCBidWYsIDQpKSkKLQkJCS8qIERlZmF1bHQgdG8gdWFydDAgKi8KLQkJCXN0cmNweShidWYsICJ1YXJ0MCIpOwotCi0JCS8qIENvbXB1dGUgdGhlIG5ldyBjb21tYW5kIGxpbmUgKi8KLQkJc25wcmludGYoYXJjc19jbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRSwgIiVzIGNvbnNvbGU9dHR5UyVjLDExNTIwMCIsCi0JCQkgYXJjc19jbWRsaW5lLCBidWZbNF0pOwotCX0KKwlzbnByaW50ZihiY200N3h4X3N5c3RlbV90eXBlLCBzaXplb2YoYmNtNDd4eF9zeXN0ZW1fdHlwZSksCisJCSAoY2hpcF9pZCA+IDB4OTk5OSkgPyAiQnJvYWRjb20gQkNNJWQiIDoKKwkJCQkgICAgICAiQnJvYWRjb20gQkNNJTA0WCIsCisJCSBjaGlwX2lkKTsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIHByb21faW5pdF9tZW0odm9pZCkKQEAgLTE5NSwxMiArOTYsMTYgQEAKIAlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW0sIEJPT1RfTUVNX1JBTSk7CiB9CiAKKy8qCisgKiBUaGlzIGlzIHRoZSBmaXJzdCBzZXJpYWwgb24gdGhlIGNoaXAgY29tbW9uIGNvcmUsIGl0IGlzIGF0IHRoaXMgcG9zaXRpb24KKyAqIGZvciBzYiAoc3NiKSBhbmQgYWkgKGJjbWEpIGJ1cy4KKyAqLworI2RlZmluZSBCQ000N1hYX1NFUklBTF9BRERSIChTU0JfRU5VTV9CQVNFICsgU1NCX0NISVBDT19VQVJUMF9EQVRBKQorCiB2b2lkIF9faW5pdCBwcm9tX2luaXQodm9pZCkKIHsKLQlwcm9tX2luaXRfY2ZlKCk7Ci0JcHJvbV9pbml0X2NvbnNvbGUoKTsKLQlwcm9tX2luaXRfY21kbGluZSgpOwogCXByb21faW5pdF9tZW0oKTsKKwlzZXR1cF84MjUwX2Vhcmx5X3ByaW50a19wb3J0KENLU0VHMUFERFIoQkNNNDdYWF9TRVJJQUxfQUREUiksIDAsIDApOwogfQogCiB2b2lkIF9faW5pdCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3NlcmlhbC5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2VyaWFsLmMKaW5kZXggYjhlZjk2NS4uMmY1YmJkNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvc2VyaWFsLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2VyaWFsLmMKQEAgLTMxLDcgKzMxLDggQEAKIAogCW1lbXNldCgmdWFydDgyNTBfZGF0YSwgMCwgIHNpemVvZih1YXJ0ODI1MF9kYXRhKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWNvcmUtPm5yX3NlcmlhbF9wb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1jb3JlLT5ucl9zZXJpYWxfcG9ydHMgJiYKKwkJICAgIGkgPCBBUlJBWV9TSVpFKHVhcnQ4MjUwX2RhdGEpIC0gMTsgaSsrKSB7CiAJCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCA9ICYodWFydDgyNTBfZGF0YVtpXSk7CiAJCXN0cnVjdCBzc2Jfc2VyaWFsX3BvcnQgKnNzYl9wb3J0ID0gJihtY29yZS0+c2VyaWFsX3BvcnRzW2ldKTsKIApAQCAtNTUsNyArNTYsOCBAQAogCiAJbWVtc2V0KCZ1YXJ0ODI1MF9kYXRhLCAwLCAgc2l6ZW9mKHVhcnQ4MjUwX2RhdGEpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjYy0+bnJfc2VyaWFsX3BvcnRzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgY2MtPm5yX3NlcmlhbF9wb3J0cyAmJgorCQkgICAgaSA8IEFSUkFZX1NJWkUodWFydDgyNTBfZGF0YSkgLSAxOyBpKyspIHsKIAkJc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwID0gJih1YXJ0ODI1MF9kYXRhW2ldKTsKIAkJc3RydWN0IGJjbWFfc2VyaWFsX3BvcnQgKmJjbWFfcG9ydDsKIAkJYmNtYV9wb3J0ID0gJihjYy0+c2VyaWFsX3BvcnRzW2ldKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCmluZGV4IDkwNTc3MjguLjAyNWJlMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwpAQCAtMjYsNiArMjYsOCBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlICJiY200N3h4X3ByaXZhdGUuaCIKKwogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgpAQCAtMzUsNiArMzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZW1iZWRkZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWFfc29jLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2lkbGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGJjbTQ3eHguaD4KQEAgLTIxMywxMiArMjE3LDE0IEBACiAjaWZkZWYgQ09ORklHX0JDTTQ3WFhfQkNNQQogCQliY200N3h4X2J1c190eXBlID0gQkNNNDdYWF9CVVNfVFlQRV9CQ01BOwogCQliY200N3h4X3JlZ2lzdGVyX2JjbWEoKTsKKwkJYmNtNDd4eF9zZXRfc3lzdGVtX3R5cGUoYmNtNDd4eF9idXMuYmNtYS5idXMuY2hpcGluZm8uaWQpOwogI2VuZGlmCiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiYmNtNDd4eDogdXNpbmcgc3NiIGJ1c1xuIik7CiAjaWZkZWYgQ09ORklHX0JDTTQ3WFhfU1NCCiAJCWJjbTQ3eHhfYnVzX3R5cGUgPSBCQ000N1hYX0JVU19UWVBFX1NTQjsKIAkJYmNtNDd4eF9yZWdpc3Rlcl9zc2IoKTsKKwkJYmNtNDd4eF9zZXRfc3lzdGVtX3R5cGUoYmNtNDd4eF9idXMuc3NiLmNoaXBfaWQpOwogI2VuZGlmCiAJfQogCkBAIC0yMjYsOCArMjMyLDM0IEBACiAJX21hY2hpbmVfaGFsdCA9IGJjbTQ3eHhfbWFjaGluZV9oYWx0OwogCXBtX3Bvd2VyX29mZiA9IGJjbTQ3eHhfbWFjaGluZV9oYWx0OwogCWJjbTQ3eHhfYm9hcmRfZGV0ZWN0KCk7CisJbWlwc19zZXRfbWFjaGluZV9uYW1lKGJjbTQ3eHhfYm9hcmRfZ2V0X25hbWUoKSk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGJjbTQ3eHhfY3B1X2ZpeGVzKHZvaWQpCit7CisJc3dpdGNoIChiY200N3h4X2J1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0JDTTQ3WFhfU1NCCisJY2FzZSBCQ000N1hYX0JVU19UWVBFX1NTQjoKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CQ000N1hYX0JDTUEKKwljYXNlIEJDTTQ3WFhfQlVTX1RZUEVfQkNNQToKKwkJLyogVGhlIEJDTTQ3MDYgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSBDUFUgd2FpdCBpbnN0cnVjdGlvbi4KKwkJICogV2hlbiByNGtfd2FpdCBvciByNGtfd2FpdF9pcnFvZmYgaXMgdXNlZCB3aWxsIGp1c3QgaGFuZyBhbmQKKwkJICogbm90IHJldHVybiBmcm9tIGEgbXNsZWVwKCkuIFJlbW92aW5nIHRoZSBjcHVfd2FpdAorCQkgKiBmdW5jdGlvbmFsaXR5IGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtLiBUaGUgQkNNNDcxNgorCQkgKiBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbS4KKwkJICovCisJCWlmIChiY200N3h4X2J1cy5iY21hLmJ1cy5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNDcwNikKKwkJCWNwdV93YWl0ID0gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGJjbTQ3eHhfY3B1X2ZpeGVzKTsKKwogc3RhdGljIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzIGJjbTQ3eHhfZml4ZWRfcGh5X3N0YXR1cyBfX2luaXRkYXRhID0gewogCS5saW5rCT0gMSwKIAkuc3BlZWQJPSBTUEVFRF8xMDAsCkBAIC0yNDgsNiArMjgwLDkgQEAKIAkJYnJlYWs7CiAjZW5kaWYKIAl9CisJYmNtNDd4eF9idXR0b25zX3JlZ2lzdGVyKCk7CisJYmNtNDd4eF9sZWRzX3JlZ2lzdGVyKCk7CisKIAlmaXhlZF9waHlfYWRkKFBIWV9QT0xMLCAwLCAmYmNtNDd4eF9maXhlZF9waHlfc3RhdHVzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3Nwcm9tLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9zcHJvbS5jCmluZGV4IGFkMDNjOTMuLmE4YjU0MDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L3Nwcm9tLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc3Byb20uYwpAQCAtMTM1LDcgKzEzNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIG52cmFtX3JlYWRfbWFjYWRkcihjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICAgdTggKCp2YWwpWzZdLCBib29sIGZhbGxiYWNrKQorCQkJICAgICAgIHU4IHZhbFs2XSwgYm9vbCBmYWxsYmFjaykKIHsKIAljaGFyIGJ1ZlsxMDBdOwogCWludCBlcnI7CkBAIC0xNDQsMTEgKzE0NCwxMSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm47CiAKLQliY200N3h4X252cmFtX3BhcnNlX21hY2FkZHIoYnVmLCAqdmFsKTsKKwliY200N3h4X252cmFtX3BhcnNlX21hY2FkZHIoYnVmLCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBudnJhbV9yZWFkX2FscGhhMihjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIGNoYXIgKCp2YWwpWzJdLCBib29sIGZhbGxiYWNrKQorCQkJICAgICBjaGFyIHZhbFsyXSwgYm9vbCBmYWxsYmFjaykKIHsKIAljaGFyIGJ1ZlsxMF07CiAJaW50IGVycjsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQlwcl93YXJuKCJhbHBoYTIgaXMgdG9vIGxvbmcgJXNcbiIsIGJ1Zik7CiAJCXJldHVybjsKIAl9Ci0JbWVtY3B5KHZhbCwgYnVmLCBzaXplb2YodmFsKSk7CisJbWVtY3B5KHZhbCwgYnVmLCAyKTsKIH0KIAogc3RhdGljIHZvaWQgYmNtNDd4eF9maWxsX3Nwcm9tX3IxMjM0NTg5KHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tLApAQCAtMTgwLDcgKzE4MCw3IEBACiAJCSAgICAgIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3M4KHByZWZpeCwgTlVMTCwgImFnMSIsICZzcHJvbS0+YW50ZW5uYV9nYWluLmExLCAwLAogCQkgICAgICBmYWxsYmFjayk7Ci0JbnZyYW1fcmVhZF9hbHBoYTIocHJlZml4LCAiY2NvZGUiLCAmc3Byb20tPmFscGhhMiwgZmFsbGJhY2spOworCW52cmFtX3JlYWRfYWxwaGEyKHByZWZpeCwgImNjb2RlIiwgc3Byb20tPmFscGhhMiwgZmFsbGJhY2spOwogfQogCiBzdGF0aWMgdm9pZCBiY200N3h4X2ZpbGxfc3Byb21fcjEyMzg5KHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tLApAQCAtNjMzLDIwICs2MzMsMjAgQEAKIHN0YXRpYyB2b2lkIGJjbTQ3eHhfZmlsbF9zcHJvbV9ldGhlcm5ldChzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSwKIAkJCQkJY29uc3QgY2hhciAqcHJlZml4LCBib29sIGZhbGxiYWNrKQogewotCW52cmFtX3JlYWRfbWFjYWRkcihwcmVmaXgsICJldDBtYWNhZGRyIiwgJnNwcm9tLT5ldDBtYWMsIGZhbGxiYWNrKTsKKwludnJhbV9yZWFkX21hY2FkZHIocHJlZml4LCAiZXQwbWFjYWRkciIsIHNwcm9tLT5ldDBtYWMsIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImV0MG1kY3BvcnQiLCAmc3Byb20tPmV0MG1kY3BvcnQsIDAsCiAJCSAgICAgIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImV0MHBoeWFkZHIiLCAmc3Byb20tPmV0MHBoeWFkZHIsIDAsCiAJCSAgICAgIGZhbGxiYWNrKTsKIAotCW52cmFtX3JlYWRfbWFjYWRkcihwcmVmaXgsICJldDFtYWNhZGRyIiwgJnNwcm9tLT5ldDFtYWMsIGZhbGxiYWNrKTsKKwludnJhbV9yZWFkX21hY2FkZHIocHJlZml4LCAiZXQxbWFjYWRkciIsIHNwcm9tLT5ldDFtYWMsIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImV0MW1kY3BvcnQiLCAmc3Byb20tPmV0MW1kY3BvcnQsIDAsCiAJCSAgICAgIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImV0MXBoeWFkZHIiLCAmc3Byb20tPmV0MXBoeWFkZHIsIDAsCiAJCSAgICAgIGZhbGxiYWNrKTsKIAotCW52cmFtX3JlYWRfbWFjYWRkcihwcmVmaXgsICJtYWNhZGRyIiwgJnNwcm9tLT5pbDBtYWMsIGZhbGxiYWNrKTsKLQludnJhbV9yZWFkX21hY2FkZHIocHJlZml4LCAiaWwwbWFjYWRkciIsICZzcHJvbS0+aWwwbWFjLCBmYWxsYmFjayk7CisJbnZyYW1fcmVhZF9tYWNhZGRyKHByZWZpeCwgIm1hY2FkZHIiLCBzcHJvbS0+aWwwbWFjLCBmYWxsYmFjayk7CisJbnZyYW1fcmVhZF9tYWNhZGRyKHByZWZpeCwgImlsMG1hY2FkZHIiLCBzcHJvbS0+aWwwbWFjLCBmYWxsYmFjayk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbTQ3eHhfZmlsbF9ib2FyZF9kYXRhKHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tLCBjb25zdCBjaGFyICpwcmVmaXgsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC93Z3Q2MzR1LmMgYi9hcmNoL21pcHMvYmNtNDd4eC93Z3Q2MzR1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2E0YzIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvd2d0NjM0dS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3NiL3NzYl9lbWJlZGRlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1iY200N3h4L2JjbTQ3eHguaD4KLQotLyogR1BJTyBkZWZpbml0aW9ucyBmb3IgdGhlIFdHVDYzNFUgKi8KLSNkZWZpbmUgV0dUNjM0VV9HUElPX0xFRAkzCi0jZGVmaW5lIFdHVDYzNFVfR1BJT19SRVNFVAkyCi0jZGVmaW5lIFdHVDYzNFVfR1BJT19UUDEJNwotI2RlZmluZSBXR1Q2MzRVX0dQSU9fVFAyCTYKLSNkZWZpbmUgV0dUNjM0VV9HUElPX1RQMwk1Ci0jZGVmaW5lIFdHVDYzNFVfR1BJT19UUDQJNAotI2RlZmluZSBXR1Q2MzRVX0dQSU9fVFA1CTEKLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZCB3Z3Q2MzR1X2xlZHNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInBvd2VyIiwKLQkJLmdwaW8gPSBXR1Q2MzRVX0dQSU9fTEVELAotCQkuYWN0aXZlX2xvdyA9IDEsCi0JCS5kZWZhdWx0X3RyaWdnZXIgPSAiaGVhcnRiZWF0IiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIHdndDYzNHVfbGVkX2RhdGEgPSB7Ci0JLm51bV9sZWRzID0JQVJSQVlfU0laRSh3Z3Q2MzR1X2xlZHMpLAotCS5sZWRzID0JCXdndDYzNHVfbGVkcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHdndDYzNHVfZ3Bpb19sZWRzID0gewotCS5uYW1lID0JCSJsZWRzLWdwaW8iLAotCS5pZCA9CQktMSwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZ3Z3Q2MzR1X2xlZF9kYXRhLAotCX0KLX07Ci0KLQotLyogOE1pQiBmbGFzaC4gVGhlIHN0cnVjdCBtdGRfcGFydGl0aW9uIG1hdGNoZXMgb3JpZ2luYWwgTmV0Z2VhciBXR1Q2MzRVCi0gICBmaXJtd2FyZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiB3Z3Q2MzR1X3BhcnRpdGlvbnNbXSA9IHsKLQl7Ci0JCS5uYW1lCSAgICA9ICJjZmUiLAotCQkub2Zmc2V0CSAgICA9IDAsCi0JCS5zaXplCSAgICA9IDB4NjAwMDAsCQkvKiAzODRrICovCi0JCS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQkvKiBmb3JjZSByZWFkLW9ubHkgKi8KLQl9LAotCXsKLQkJLm5hbWUJPSAiY29uZmlnIiwKLQkJLm9mZnNldCA9IDB4NjAwMDAsCi0JCS5zaXplCT0gMHgyMDAwMAkJLyogMTI4ayAqLwotCX0sCi0JewotCQkubmFtZQk9ICJsaW51eCIsCi0JCS5vZmZzZXQgPSAweDgwMDAwLAotCQkuc2l6ZQk9IDB4MTQwMDAwCQkvKiAxMjgwayAqLwotCX0sCi0JewotCQkubmFtZQk9ICJqZmZzIiwKLQkJLm9mZnNldCA9IDB4MWMwMDAwLAotCQkuc2l6ZQk9IDB4NjIwMDAwCQkvKiA2MjcyayAqLwotCX0sCi0JewotCQkubmFtZQk9ICJudnJhbSIsCi0JCS5vZmZzZXQgPSAweDdlMDAwMCwKLQkJLnNpemUJPSAweDIwMDAwCQkvKiAxMjhrICovCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHdndDYzNHVfZmxhc2hfZGF0YSA9IHsKLQkucGFydHMJICA9IHdndDYzNHVfcGFydGl0aW9ucywKLQkubnJfcGFydHMgPSBBUlJBWV9TSVpFKHdndDYzNHVfcGFydGl0aW9ucykKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd2d0NjM0dV9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHdndDYzNHVfZmxhc2ggPSB7Ci0JLm5hbWUJICAgICAgID0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkgICAgICAgPSAwLAotCS5kZXYJICAgICAgID0geyAucGxhdGZvcm1fZGF0YSA9ICZ3Z3Q2MzR1X2ZsYXNoX2RhdGEsIH0sCi0JLnJlc291cmNlICAgICAgPSAmd2d0NjM0dV9mbGFzaF9yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi19OwotCi0vKiBQbGF0Zm9ybSBkZXZpY2VzICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqd2d0NjM0dV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmd2d0NjM0dV9mbGFzaCwKLQkmd2d0NjM0dV9ncGlvX2xlZHMsCi19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZ3Bpb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaWdub3JlZCkKLXsKLQlpbnQgc3RhdGU7Ci0KLQkvKiBJbnRlcnJ1cHRzIGFyZSBzaGFyZWQsIGNoZWNrIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSAgIGEgR1BJTyBpbnRlcnJ1cHQuICovCi0JaWYgKCFzc2JfY2hpcGNvX2lycV9zdGF0dXMoJmJjbTQ3eHhfYnVzLnNzYi5jaGlwY28sCi0JCQkJICAgU1NCX0NISVBDT19JUlFfR1BJTykpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXN0YXRlID0gZ3Bpb19nZXRfdmFsdWUoV0dUNjM0VV9HUElPX1JFU0VUKTsKLQotCS8qIEludGVycnVwdCBhcmUgbGV2ZWwgdHJpZ2dlcmVkLCByZXZlcnQgdGhlIGludGVycnVwdCBwb2xhcml0eQotCSAgIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQuICovCi0Jc3NiX2dwaW9fcG9sYXJpdHkoJmJjbTQ3eHhfYnVzLnNzYiwgMSA8PCBXR1Q2MzRVX0dQSU9fUkVTRVQsCi0JCQkgIHN0YXRlID8gMSA8PCBXR1Q2MzRVX0dQSU9fUkVTRVQgOiAwKTsKLQotCWlmICghc3RhdGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXQgYnV0dG9uIHByZXNzZWQiKTsKLQkJY3RybF9hbHRfZGVsKCk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB3Z3Q2MzR1X2luaXQodm9pZCkKLXsKLQkvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBkZXRlY3QgdGhhdCB3ZSBhcmUgcnVubmluZyBvbiBhIFdHVDYzNFUKLQkgKiBtYWNoaW5lLiBVc2UgdGhlIE1BQyBhZGRyZXNzIGFzIGFuIGhldXJpc3RpYy4gTmV0Z2VhciBJbmMuIGhhcwotCSAqIGJlZW4gYWxsb2NhdGVkIHJhbmdlcyAwMDowOTo1Yjp4eDp4eDp4eCBhbmQgMDA6MGY6YjU6eHg6eHg6eHguCi0JICovCi0JdTggKmV0MG1hYzsKLQotCWlmIChiY200N3h4X2J1c190eXBlICE9IEJDTTQ3WFhfQlVTX1RZUEVfU1NCKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWV0MG1hYyA9IGJjbTQ3eHhfYnVzLnNzYi5zcHJvbS5ldDBtYWM7Ci0KLQlpZiAoZXQwbWFjWzBdID09IDB4MDAgJiYKLQkgICAgKChldDBtYWNbMV0gPT0gMHgwOSAmJiBldDBtYWNbMl0gPT0gMHg1YikgfHwKLQkgICAgIChldDBtYWNbMV0gPT0gMHgwZiAmJiBldDBtYWNbMl0gPT0gMHhiNSkpKSB7Ci0JCXN0cnVjdCBzc2JfbWlwc2NvcmUgKm1jb3JlID0gJmJjbTQ3eHhfYnVzLnNzYi5taXBzY29yZTsKLQotCQlwcmludGsoS0VSTl9JTkZPICJXR1Q2MzRVIG1hY2hpbmUgZGV0ZWN0ZWQuXG4iKTsKLQotCQlpZiAoIXJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKFdHVDYzNFVfR1BJT19SRVNFVCksCi0JCQkJIGdwaW9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCQkgIldHVDYzNFUgR1BJTyIsICZiY200N3h4X2J1cy5zc2IuY2hpcGNvKSkgewotCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoV0dUNjM0VV9HUElPX1JFU0VUKTsKLQkJCXNzYl9ncGlvX2ludG1hc2soJmJjbTQ3eHhfYnVzLnNzYiwKLQkJCQkJIDEgPDwgV0dUNjM0VV9HUElPX1JFU0VULAotCQkJCQkgMSA8PCBXR1Q2MzRVX0dQSU9fUkVTRVQpOwotCQkJc3NiX2NoaXBjb19pcnFfbWFzaygmYmNtNDd4eF9idXMuc3NiLmNoaXBjbywKLQkJCQkJICAgIFNTQl9DSElQQ09fSVJRX0dQSU8sCi0JCQkJCSAgICBTU0JfQ0hJUENPX0lSUV9HUElPKTsKLQkJfQotCi0JCXdndDYzNHVfZmxhc2hfZGF0YS53aWR0aCA9IG1jb3JlLT5wZmxhc2guYnVzd2lkdGg7Ci0JCXdndDYzNHVfZmxhc2hfcmVzb3VyY2Uuc3RhcnQgPSBtY29yZS0+cGZsYXNoLndpbmRvdzsKLQkJd2d0NjM0dV9mbGFzaF9yZXNvdXJjZS5lbmQgPSBtY29yZS0+cGZsYXNoLndpbmRvdwotCQkJCQkgICArIG1jb3JlLT5wZmxhc2gud2luZG93X3NpemUKLQkJCQkJICAgLSAxOwotCQlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMod2d0NjM0dV9kZXZpY2VzLAotCQkJCQkgICAgQVJSQVlfU0laRSh3Z3Q2MzR1X2RldmljZXMpKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLW1vZHVsZV9pbml0KHdndDYzNHVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNjN4eC9LY29uZmlnIGIvYXJjaC9taXBzL2JjbTYzeHgvS2NvbmZpZwppbmRleCBiNzgzMDZjLi5hMDU3ZmRmMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTYzeHgvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9LY29uZmlnCkBAIC0zLDMzICszLDQxIEBACiAKIGNvbmZpZyBCQ002M1hYX0NQVV8zMzY4CiAJYm9vbCAic3VwcG9ydCAzMzY4IENQVSIKKwlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFM0MzUwCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAogY29uZmlnIEJDTTYzWFhfQ1BVXzYzMjgKIAlib29sICJzdXBwb3J0IDYzMjggQ1BVIgorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUzQzNTAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCiBjb25maWcgQkNNNjNYWF9DUFVfNjMzOAogCWJvb2wgInN1cHBvcnQgNjMzOCBDUFUiCisJc2VsZWN0IFNZU19IQVNfQ1BVX0JNSVBTMzJfMzMwMAogCXNlbGVjdCBIV19IQVNfUENJCiAKIGNvbmZpZyBCQ002M1hYX0NQVV82MzQ1CiAJYm9vbCAic3VwcG9ydCA2MzQ1IENQVSIKKwlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFMzMl8zMzAwCiAKIGNvbmZpZyBCQ002M1hYX0NQVV82MzQ4CiAJYm9vbCAic3VwcG9ydCA2MzQ4IENQVSIKKwlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFMzMl8zMzAwCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAogY29uZmlnIEJDTTYzWFhfQ1BVXzYzNTgKIAlib29sICJzdXBwb3J0IDYzNTggQ1BVIgorCXNlbGVjdCBTWVNfSEFTX0NQVV9CTUlQUzQzNTAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCiBjb25maWcgQkNNNjNYWF9DUFVfNjM2MgogCWJvb2wgInN1cHBvcnQgNjM2MiBDUFUiCisJc2VsZWN0IFNZU19IQVNfQ1BVX0JNSVBTNDM1MAogCXNlbGVjdCBIV19IQVNfUENJCiAKIGNvbmZpZyBCQ002M1hYX0NQVV82MzY4CiAJYm9vbCAic3VwcG9ydCA2MzY4IENQVSIKKwlzZWxlY3QgU1lTX0hBU19DUFVfQk1JUFM0MzUwCiAJc2VsZWN0IEhXX0hBU19QQ0kKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvTWFrZWZpbGUgYi9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQppbmRleCBhYzI4MDczLi45MDE5ZjU0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIG9iai15CQkrPSBjbGsubyBjcHUubyBjcy5vIGdwaW8ubyBpcnEubyBudnJhbS5vIHByb20ubyByZXNldC5vIFwKIAkJICAgc2V0dXAubyB0aW1lci5vIGRldi1kc3AubyBkZXYtZW5ldC5vIGRldi1mbGFzaC5vIFwKLQkJICAgZGV2LXBjbWNpYS5vIGRldi1ybmcubyBkZXYtc3BpLm8gZGV2LXVhcnQubyBkZXYtd2R0Lm8gXAotCQkgICBkZXYtdXNiLXVzYmQubworCQkgICBkZXYtcGNtY2lhLm8gZGV2LXJuZy5vIGRldi1zcGkubyBkZXYtaHNzcGkubyBkZXYtdWFydC5vIFwKKwkJICAgZGV2LXdkdC5vIGRldi11c2ItdXNiZC5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogCiBvYmoteQkJKz0gYm9hcmRzLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvYm9hcmRzL2JvYXJkX2JjbTk2M3h4LmMgYi9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYwppbmRleCA1Yjk3NGViLi4zMzcyN2U3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGJjbTYzeHhfZGV2X2VuZXQuaD4KICNpbmNsdWRlIDxiY202M3h4X2Rldl9kc3AuaD4KICNpbmNsdWRlIDxiY202M3h4X2Rldl9mbGFzaC5oPgorI2luY2x1ZGUgPGJjbTYzeHhfZGV2X2hzc3BpLmg+CiAjaW5jbHVkZSA8YmNtNjN4eF9kZXZfcGNtY2lhLmg+CiAjaW5jbHVkZSA8YmNtNjN4eF9kZXZfc3BpLmg+CiAjaW5jbHVkZSA8YmNtNjN4eF9kZXZfdXNiX3VzYmQuaD4KQEAgLTkxNSw2ICs5MTYsOCBAQAogCiAJYmNtNjN4eF9zcGlfcmVnaXN0ZXIoKTsKIAorCWJjbTYzeHhfaHNzcGlfcmVnaXN0ZXIoKTsKKwogCWJjbTYzeHhfZmxhc2hfcmVnaXN0ZXIoKTsKIAogCWJjbTYzeHhfbGVkX2RhdGEubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGJvYXJkLmxlZHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvY2xrLmMgYi9hcmNoL21pcHMvYmNtNjN4eC9jbGsuYwppbmRleCA0M2RhNGFlLi42Mzc1NjUyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9jbGsuYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9jbGsuYwpAQCAtMjI2LDYgKzIyNiwyOCBAQAogfTsKIAogLyoKKyAqIEhTU1BJIGNsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGhzc3BpX3NldChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJdTMyIG1hc2s7CisKKwlpZiAoQkNNQ1BVX0lTXzYzMjgoKSkKKwkJbWFzayA9IENLQ1RMXzYzMjhfSFNTUElfRU47CisJZWxzZSBpZiAoQkNNQ1BVX0lTXzYzNjIoKSkKKwkJbWFzayA9IENLQ1RMXzYzNjJfSFNTUElfRU47CisJZWxzZQorCQlyZXR1cm47CisKKwliY21faHdjbG9ja19zZXQobWFzaywgZW5hYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2hzc3BpID0geworCS5zZXQJPSBoc3NwaV9zZXQsCit9OworCisKKy8qCiAgKiBYVE0gY2xvY2sKICAqLwogc3RhdGljIHZvaWQgeHRtX3NldChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCkBAIC0zNDYsNiArMzY4LDggQEAKIAkJcmV0dXJuICZjbGtfdXNiZDsKIAlpZiAoIXN0cmNtcChpZCwgInNwaSIpKQogCQlyZXR1cm4gJmNsa19zcGk7CisJaWYgKCFzdHJjbXAoaWQsICJoc3NwaSIpKQorCQlyZXR1cm4gJmNsa19oc3NwaTsKIAlpZiAoIXN0cmNtcChpZCwgInh0bSIpKQogCQlyZXR1cm4gJmNsa194dG07CiAJaWYgKCFzdHJjbXAoaWQsICJwZXJpcGgiKSkKQEAgLTM2NiwzICszOTAsMjEgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKworI2RlZmluZSBIU1NQSV9QTExfSFpfNjMyOAkxMzMzMzMzMzMKKyNkZWZpbmUgSFNTUElfUExMX0haXzYzNjIJNDAwMDAwMDAwCisKK3N0YXRpYyBpbnQgX19pbml0IGJjbTYzeHhfY2xrX2luaXQodm9pZCkKK3sKKwlzd2l0Y2ggKGJjbTYzeHhfZ2V0X2NwdV9pZCgpKSB7CisJY2FzZSBCQ002MzI4X0NQVV9JRDoKKwkJY2xrX2hzc3BpLnJhdGUgPSBIU1NQSV9QTExfSFpfNjMyODsKKwkJYnJlYWs7CisJY2FzZSBCQ002MzYyX0NQVV9JRDoKKwkJY2xrX2hzc3BpLnJhdGUgPSBIU1NQSV9QTExfSFpfNjM2MjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGJjbTYzeHhfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvY3B1LmMgYi9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYwppbmRleCBiNzEzY2Q2Li4xYjFiOGE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYwpAQCAtMTIzLDcgKzEyMyw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGV0ZWN0X2NwdV9jbG9jayh2b2lkKQogewotCXN3aXRjaCAoYmNtNjN4eF9nZXRfY3B1X2lkKCkpIHsKKwl1MTYgY3B1X2lkID0gYmNtNjN4eF9nZXRfY3B1X2lkKCk7CisKKwlzd2l0Y2ggKGNwdV9pZCkgewogCWNhc2UgQkNNMzM2OF9DUFVfSUQ6CiAJCXJldHVybiAzMDAwMDAwMDA7CiAKQEAgLTI0OSw3ICsyNTEsNyBAQAogCX0KIAogCWRlZmF1bHQ6Ci0JCUJVRygpOworCQlwYW5pYygiRmFpbGVkIHRvIGRldGVjdCBjbG9jayBmb3IgQ1BVIHdpdGggaWQ9JTA0WFxuIiwgY3B1X2lkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2Rldi1oc3NwaS5jIGIvYXJjaC9taXBzL2JjbTYzeHgvZGV2LWhzc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9iY202M3h4L2Rldi1oc3NwaS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9uYXMgR29yc2tpIDxqb25hcy5nb3Jza2lAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxiY202M3h4X2NwdS5oPgorI2luY2x1ZGUgPGJjbTYzeHhfZGV2X2hzc3BpLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9yZWdzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3BpX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IC0xLCAvKiBmaWxsZWQgYXQgcnVudGltZSAqLworCQkuZW5kCQk9IC0xLCAvKiBmaWxsZWQgYXQgcnVudGltZSAqLworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSAtMSwgLyogZmlsbGVkIGF0IHJ1bnRpbWUgKi8KKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiY202M3h4X2hzc3BpX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYmNtNjN4eC1oc3NwaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNwaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNwaV9yZXNvdXJjZXMsCit9OworCitpbnQgX19pbml0IGJjbTYzeHhfaHNzcGlfcmVnaXN0ZXIodm9pZCkKK3sKKwlpZiAoIUJDTUNQVV9JU182MzI4KCkgJiYgIUJDTUNQVV9JU182MzYyKCkpCisJCXJldHVybiAtRU5PREVWOworCisJc3BpX3Jlc291cmNlc1swXS5zdGFydCA9IGJjbTYzeHhfcmVnc2V0X2FkZHJlc3MoUlNFVF9IU1NQSSk7CisJc3BpX3Jlc291cmNlc1swXS5lbmQgPSBzcGlfcmVzb3VyY2VzWzBdLnN0YXJ0OworCXNwaV9yZXNvdXJjZXNbMF0uZW5kICs9IFJTRVRfSFNTUElfU0laRSAtIDE7CisJc3BpX3Jlc291cmNlc1sxXS5zdGFydCA9IGJjbTYzeHhfZ2V0X2lycV9udW1iZXIoSVJRX0hTU1BJKTsKKworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmJjbTYzeHhfaHNzcGlfZGV2aWNlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2Vhcmx5X3ByaW50ay5jIGIvYXJjaC9taXBzL2JjbTYzeHgvZWFybHlfcHJpbnRrLmMKaW5kZXggYWE4ZjdmOS4uNjA5MjIyNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTYzeHgvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvZWFybHlfcHJpbnRrLmMKQEAgLTYsOSArNiw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWF4aW1lIEJpem9uIDxtYml6b25AZnJlZWJveC5mcj4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGJjbTYzeHhfaW8uaD4KLSNpbmNsdWRlIDxiY202M3h4X3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfYmNtNjN4eC5oPgogCiBzdGF0aWMgdm9pZCB3YWl0X3hmZXJlZCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvcHJvbS5jIGIvYXJjaC9taXBzL2JjbTYzeHgvcHJvbS5jCmluZGV4IDhhYzRlMDkuLmUxZjI3ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY202M3h4L3Byb20uYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9wcm9tLmMKQEAgLTU5LDE0ICs1OSwxMiBAQAogCS8qIGRvIGxvdyBsZXZlbCBib2FyZCBpbml0ICovCiAJYm9hcmRfcHJvbV9pbml0KCk7CiAKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfQ1BVX0JNSVBTNDM1MCkgJiYgSVNfRU5BQkxFRChDT05GSUdfU01QKSkgewotCQkvKiBzZXQgdXAgU01QICovCi0JCXJlZ2lzdGVyX3NtcF9vcHMoJmJtaXBzX3NtcF9vcHMpOwotCisJLyogc2V0IHVwIFNNUCAqLworCWlmICghcmVnaXN0ZXJfYm1pcHNfc21wX29wcygpKSB7CiAJCS8qCi0JCSAqIEJDTTYzMjggbWlnaHQgbm90IGhhdmUgaXRzIHNlY29uZCBDUFUgZW5hYmxlZCwgd2hpbGUgQkNNNjM1OAotCQkgKiBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBpdHMgc2hhcmVkIFRMQiwgc28gZGlzYWJsZSBTTVAKLQkJICogZm9yIG5vdy4KKwkJICogQkNNNjMyOCBtaWdodCBub3QgaGF2ZSBpdHMgc2Vjb25kIENQVSBlbmFibGVkLCB3aGlsZSBCQ00zMzY4CisJCSAqIGFuZCBCQ002MzU4IG5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlaXIgc2hhcmVkIFRMQiwgc28KKwkJICogZGlzYWJsZSBTTVAgZm9yIG5vdy4KIAkJICovCiAJCWlmIChCQ01DUFVfSVNfNjMyOCgpKSB7CiAJCQlyZWcgPSBiY21fcmVhZGwoQkNNXzYzMjhfT1RQX0JBU0UgKwpAQCAtNzQsNyArNzIsNyBAQAogCiAJCQlpZiAocmVnICYgT1RQXzYzMjhfUkVHM19UUDFfRElTQUJMRUQpCiAJCQkJYm1pcHNfc21wX2VuYWJsZWQgPSAwOwotCQl9IGVsc2UgaWYgKEJDTUNQVV9JU182MzU4KCkpIHsKKwkJfSBlbHNlIGlmIChCQ01DUFVfSVNfMzM2OCgpIHx8IEJDTUNQVV9JU182MzU4KCkpIHsKIAkJCWJtaXBzX3NtcF9lbmFibGVkID0gMDsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCBjYTBjMzQzLi42MWFmNmI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTI3LDEwICsyNywxMCBAQAogCS1EQk9PVF9IRUFQX1NJWkU9JChCT09UX0hFQVBfU0laRSkgXAogCS1ES0VSTkVMX0VOVFJZPSQoVk1MSU5VWF9FTlRSWV9BRERSRVNTKQogCi10YXJnZXRzIDo9IGhlYWQubyBkZWNvbXByZXNzLm8gZGJnLm8gdWFydC0xNjU1MC5vIHVhcnQtYWxjaGVteS5vCit0YXJnZXRzIDo9IGhlYWQubyBkZWNvbXByZXNzLm8gc3RyaW5nLm8gZGJnLm8gdWFydC0xNjU1MC5vIHVhcnQtYWxjaGVteS5vCiAKICMgZGVjb21wcmVzc29yIG9iamVjdHMgKGxpbmtlZCB3aXRoIHZtbGludXopCi12bWxpbnV6b2Jqcy15IDo9ICQob2JqKS9oZWFkLm8gJChvYmopL2RlY29tcHJlc3MubyAkKG9iaikvZGJnLm8KK3ZtbGludXpvYmpzLXkgOj0gJChvYmopL2hlYWQubyAkKG9iaikvZGVjb21wcmVzcy5vICQob2JqKS9zdHJpbmcubyAkKG9iaikvZGJnLm8KIAogaWZkZWYgQ09ORklHX0RFQlVHX1pCT09UCiB2bWxpbnV6b2Jqcy0kKENPTkZJR19TWVNfU1VQUE9SVFNfWkJPT1RfVUFSVDE2NTUwKSArPSAkKG9iaikvdWFydC0xNjU1MC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2RiZy5jIGIvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9kYmcuYwppbmRleCAxMzRhNjE2Li4wNmM2YTViIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2RiZy5jCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvZGJnLmMKQEAgLTYsNyArNiw2IEBACiAgKiBuZWVkIHRvIGltcGxlbWVudCB5b3VyIG93biBwdXRjKCkuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiB2b2lkIF9fd2VhayBwdXRjKGNoYXIgYykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvZGVjb21wcmVzcy5jIGIvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9kZWNvbXByZXNzLmMKaW5kZXggYThjNmZkNi4uYzAwYzRkZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9kZWNvbXByZXNzLmMKKysrIGIvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9kZWNvbXByZXNzLmMKQEAgLTQzLDMzICs0MywxMSBAQAogLyogYWN0aXZhdGUgdGhlIGNvZGUgZm9yIHByZS1ib290IGVudmlyb25tZW50ICovCiAjZGVmaW5lIFNUQVRJQyBzdGF0aWMKIAotI2lmIGRlZmluZWQoQ09ORklHX0tFUk5FTF9HWklQKSB8fCBkZWZpbmVkKENPTkZJR19LRVJORUxfWFopIHx8IFwKLQlkZWZpbmVkKENPTkZJR19LRVJORUxfTFo0KQotdm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqcyA9IHNyYzsKLQljaGFyICpkID0gZGVzdDsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCWRbaV0gPSBzW2ldOwotCXJldHVybiBkZXN0OwotfQotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tFUk5FTF9HWklQCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfaW5mbGF0ZS5jIgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfS0VSTkVMX0JaSVAyCi12b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQotewotCWludCBpOwotCWNoYXIgKnNzID0gczsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCXNzW2ldID0gYzsKLQlyZXR1cm4gczsKLX0KICNpbmNsdWRlICIuLi8uLi8uLi8uLi9saWIvZGVjb21wcmVzc19idW56aXAyLmMiCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlOTg4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGFyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKKyAqCisgKiBWZXJ5IHNtYWxsIHN1YnNldCBvZiBzaW1wbGUgc3RyaW5nIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3ZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnMgPSBzcmM7CisJY2hhciAqZCA9IGRlc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlkW2ldID0gc1tpXTsKKwlyZXR1cm4gZGVzdDsKK30KKwordm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikKK3sKKwlpbnQgaTsKKwljaGFyICpzcyA9IHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlzc1tpXSA9IGM7CisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL3VhcnQtMTY1NTAuYyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvdWFydC0xNjU1MC5jCmluZGV4IGMwMWQzNDMuLjIzNzQ5NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvdWFydC0xNjU1MC5jCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvdWFydC0xNjU1MC5jCkBAIC00LDcgKzQsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCkBAIC0xOSw4ICsxOCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NQUNIX0paNDc0MAotI2RlZmluZSBVQVJUMF9CQVNFICAweEIwMDMwMDAwCi0jZGVmaW5lIFBPUlQob2Zmc2V0KSAoVUFSVDBfQkFTRSArICg0ICogb2Zmc2V0KSkKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvYmFzZS5oPgorI2RlZmluZSBQT1JUKG9mZnNldCkgKENLU0VHMUFERFIoSlo0NzQwX1VBUlQwX0JBU0VfQUREUikgKyAoNCAqIG9mZnNldCkpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfWExSCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1jbWQtcXVldWUuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWNtZC1xdWV1ZS5jCmluZGV4IDEzMmJjY2MuLjgyNDFmYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWNtZC1xdWV1ZS5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWNtZC1xdWV1ZS5jCkBAIC00Nyw2ICs0Nyw3IEBACiAgKiBzdGF0ZS4gSXQgcG9pbnRzIHRvIGEgYm9vdG1lbSBuYW1lZCBibG9jay4KICAqLwogX19jdm14X2NtZF9xdWV1ZV9hbGxfc3RhdGVfdCAqX19jdm14X2NtZF9xdWV1ZV9zdGF0ZV9wdHI7CitFWFBPUlRfU1lNQk9MX0dQTChfX2N2bXhfY21kX3F1ZXVlX3N0YXRlX3B0cik7CiAKIC8qKgogICogSW5pdGlhbGl6ZSB0aGUgR2xvYmFsIHF1ZXVlIHN0YXRlIHBvaW50ZXIuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1oZWxwZXItYm9hcmQuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci1ib2FyZC5jCmluZGV4IDBhMTI4M2MuLmI3NjRkZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci1ib2FyZC5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci1ib2FyZC5jCkBAIC03MjIsMyArNzIyLDMwIEBACiAJfQogCXJldHVybiAwOwogfQorCisvKioKKyAqIEdldCB0aGUgY2xvY2sgdHlwZSB1c2VkIGZvciB0aGUgVVNCIGJsb2NrIGJhc2VkIG9uIGJvYXJkIHR5cGUuCisgKiBVc2VkIGJ5IHRoZSBVU0IgY29kZSBmb3IgYXV0byBjb25maWd1cmF0aW9uIG9mIGNsb2NrIHR5cGUuCisgKgorICogUmV0dXJuIFVTQiBjbG9jayB0eXBlIGVudW1lcmF0aW9uCisgKi8KK2VudW0gY3ZteF9oZWxwZXJfYm9hcmRfdXNiX2Nsb2NrX3R5cGVzIF9fY3ZteF9oZWxwZXJfYm9hcmRfdXNiX2dldF9jbG9ja190eXBlKHZvaWQpCit7CisJc3dpdGNoIChjdm14X3N5c2luZm9fZ2V0KCktPmJvYXJkX3R5cGUpIHsKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9CQkdXX1JFRjoKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9MQU5BSTJfQToKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9MQU5BSTJfVToKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9MQU5BSTJfRzoKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9OSUMxMEVfNjY6CisJY2FzZSBDVk1YX0JPQVJEX1RZUEVfVUJOVF9FMTAwOgorCQlyZXR1cm4gVVNCX0NMT0NLX1RZUEVfQ1JZU1RBTF8xMjsKKwljYXNlIENWTVhfQk9BUkRfVFlQRV9OSUMxMEU6CisJCXJldHVybiBVU0JfQ0xPQ0tfVFlQRV9SRUZfMTI7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCS8qIE1vc3QgYm9hcmRzIGV4Y2VwdCBOSUMxMGUgdXNlIGEgMTJNSHogY3J5c3RhbCAqLworCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0ZBTV8yKSkKKwkJcmV0dXJuIFVTQl9DTE9DS19UWVBFX0NSWVNUQUxfMTI7CisJcmV0dXJuIFVTQl9DTE9DS19UWVBFX1JFRl80ODsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci11dGlsLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1oZWxwZXItdXRpbC5jCmluZGV4IDY1ZDJiYzkuLjQ1M2Q3ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci11dGlsLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtaGVscGVyLXV0aWwuYwpAQCAtMjUxLDYgKzI1MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN2bXhfaGVscGVyX3NldHVwX3JlZCk7CiAKIC8qKgogICogU2V0dXAgdGhlIGNvbW1vbiBHTVggc2V0dGluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZgpAQCAtMzg0LDYgKzM4NSw3IEBACiAJfQogCXJldHVybiAtMTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN2bXhfaGVscGVyX2dldF9pcGRfcG9ydCk7CiAKIC8qKgogICogUmV0dXJucyB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgYW4gSVBEL1BLTyBwb3J0IG51bWJlci4KQEAgLTQwOCw2ICs0MTAsNyBAQAogCiAJcmV0dXJuIC0xOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3ZteF9oZWxwZXJfZ2V0X2ludGVyZmFjZV9udW0pOwogCiAvKioKICAqIFJldHVybnMgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgZm9yIGFuIElQRC9QS08gcG9ydApAQCAtNDMxLDMgKzQzNCw0IEBACiAKIAlyZXR1cm4gLTE7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjdm14X2hlbHBlcl9nZXRfaW50ZXJmYWNlX2luZGV4X251bSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1oZWxwZXIuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci5jCmluZGV4IGQ2M2QyMGQuLjg1NTNhZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWhlbHBlci5jCkBAIC02Nyw3ICs2Nyw3IEBACiB2b2lkICgqY3ZteF9vdmVycmlkZV9pcGRfcG9ydF9zZXR1cCkgKGludCBpcGRfcG9ydCk7CiAKIC8qIFBvcnQgY291bnQgcGVyIGludGVyZmFjZSAqLwotc3RhdGljIGludCBpbnRlcmZhY2VfcG9ydF9jb3VudFs0XSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCBpbnRlcmZhY2VfcG9ydF9jb3VudFs1XTsKIAogLyogUG9ydCBsYXN0IGNvbmZpZ3VyZWQgbGluayBpbmZvIGluZGV4IGJ5IElQRC9QS08gcG9ydCAqLwogc3RhdGljIGN2bXhfaGVscGVyX2xpbmtfaW5mb190CkBAIC04OCw2ICs4OCw3IEBACiAJZWxzZQogCQlyZXR1cm4gMzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN2bXhfaGVscGVyX2dldF9udW1iZXJfb2ZfaW50ZXJmYWNlcyk7CiAKIC8qKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcG9ydHMgb24gYW4gaW50ZXJmYWNlLiBEZXBlbmRpbmcgb24gdGhlCkBAIC0xMDIsNiArMTAzLDcgQEAKIHsKIAlyZXR1cm4gaW50ZXJmYWNlX3BvcnRfY291bnRbaW50ZXJmYWNlXTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN2bXhfaGVscGVyX3BvcnRzX29uX2ludGVyZmFjZSk7CiAKIC8qKgogICogR2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBvZiBhbiBpbnRlcmZhY2UuIERlcGVuZGluZyBvbiB0aGUgT2N0ZW9uCkBAIC0xNzksNiArMTgxLDcgQEAKIAkJCXJldHVybiBDVk1YX0hFTFBFUl9JTlRFUkZBQ0VfTU9ERV9SR01JSTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjdm14X2hlbHBlcl9pbnRlcmZhY2VfZ2V0X21vZGUpOwogCiAvKioKICAqIENvbmZpZ3VyZSB0aGUgSVBEL1BJUCB0YWdnaW5nIGFuZCBRb1Mgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYwpAQCAtODI1LDYgKzgyOCw3IEBACiAJCV9fY3ZteF9oZWxwZXJfZXJyYXRhX2ZpeF9pcGRfcHRyX2FsaWdubWVudCgpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3ZteF9oZWxwZXJfaXBkX2FuZF9wYWNrZXRfaW5wdXRfZW5hYmxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIHRoZSBQSVAsIElQRCwgYW5kIFBLTyBoYXJkd2FyZSB0byBzdXBwb3J0CkBAIC05MDMsNiArOTA3LDcgQEAKICNlbmRpZgogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjdm14X2hlbHBlcl9pbml0aWFsaXplX3BhY2tldF9pb19nbG9iYWwpOwogCiAvKioKICAqIERvZXMgY29yZSBsb2NhbCBpbml0aWFsaXphdGlvbiBmb3IgcGFja2V0IGlvCkBAIC05NDcsNiArOTUyLDcgQEAKIAkgKi8KIAlyZXR1cm4gcG9ydF9saW5rX2luZm9baXBkX3BvcnRdOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3ZteF9oZWxwZXJfbGlua19hdXRvY29uZik7CiAKIC8qKgogICogUmV0dXJuIHRoZSBsaW5rIHN0YXRlIG9mIGFuIElQRC9QS08gcG9ydCBhcyByZXR1cm5lZCBieQpAQCAtMTAwNSw2ICsxMDExLDcgQEAKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN2bXhfaGVscGVyX2xpbmtfZ2V0KTsKIAogLyoqCiAgKiBDb25maWd1cmUgYW4gSVBEL1BLTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIGxpbmsgc3RhdGUuIFRoaXMKQEAgLTEwNjAsNiArMTA2Nyw3IEBACiAJCXBvcnRfbGlua19pbmZvW2lwZF9wb3J0XS51NjQgPSBsaW5rX2luZm8udTY0OwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjdm14X2hlbHBlcl9saW5rX3NldCk7CiAKIC8qKgogICogQ29uZmlndXJlIGEgcG9ydCBmb3IgaW50ZXJuYWwgYW5kL29yIGV4dGVybmFsIGxvb3BiYWNrLiBJbnRlcm5hbCBsb29wYmFjawpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtcGtvLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1wa28uYwppbmRleCBmMmM4Nzc1Li4wMDhiODgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1wa28uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1wa28uYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJcGtvX3JlZ19mbGFncy5zLmVuYV9wa28gPSAwOwogCWN2bXhfd3JpdGVfY3NyKENWTVhfUEtPX1JFR19GTEFHUywgcGtvX3JlZ19mbGFncy51NjQpOwogfQotCitFWFBPUlRfU1lNQk9MX0dQTChjdm14X3Brb19kaXNhYmxlKTsKIAogLyoqCiAgKiBSZXNldCB0aGUgcGFja2V0IG91dHB1dC4KQEAgLTE4Miw2ICsxODIsNyBAQAogCX0KIAlfX2N2bXhfcGtvX3Jlc2V0KCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjdm14X3Brb19zaHV0ZG93bik7CiAKIC8qKgogICogQ29uZmlndXJlIGEgb3V0cHV0IHBvcnQgYW5kIHRoZSBhc3NvY2lhdGVkIHF1ZXVlcyBmb3IgdXNlLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtc3BpLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1zcGkuYwppbmRleCBlZjUxOThkLi40NTllM2IxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1zcGkuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1zcGkuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAKIAlyZXR1cm4gcmVzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3ZteF9zcGlfcmVzdGFydF9pbnRlcmZhY2UpOwogCiAvKioKICAqIENhbGxiYWNrIHRvIHBlcmZvcm0gU1BJNCByZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwppbmRleCAxODMwODc0Li42ZGYwZjRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwpAQCAtMTcxLDYgKzE3MSw3IEBACiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9jdGVvbl9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi02MzM1LXVjdGwiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi01NzUwLXVzYm4iLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi0zODYwLWJvb3RidXMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG1kaW8tbXV4IiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImdwaW8tbGVkcyIsIH0sCkBAIC0zMzYsMTQgKzMzNywxNCBAQAogCWludCBwOwogCWludCBjb3VudCA9IDA7CiAKLQlpZiAoY3ZteF9oZWxwZXJfaW50ZXJmYWNlX2VudW1lcmF0ZShpZHgpID09IDApCi0JCWNvdW50ID0gY3ZteF9oZWxwZXJfcG9ydHNfb25faW50ZXJmYWNlKGlkeCk7Ci0KIAlzbnByaW50ZihuYW1lX2J1ZmZlciwgc2l6ZW9mKG5hbWVfYnVmZmVyKSwgImludGVyZmFjZUAlZCIsIGlkeCk7CiAJaWZhY2UgPSBmZHRfc3Vibm9kZV9vZmZzZXQoaW5pdGlhbF9ib290X3BhcmFtcywgcGlwLCBuYW1lX2J1ZmZlcik7CiAJaWYgKGlmYWNlIDwgMCkKIAkJcmV0dXJuOwogCisJaWYgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9lbnVtZXJhdGUoaWR4KSA9PSAwKQorCQljb3VudCA9IGN2bXhfaGVscGVyX3BvcnRzX29uX2ludGVyZmFjZShpZHgpOworCiAJZm9yIChwID0gMDsgcCA8IDE2OyBwKyspCiAJCW9jdGVvbl9mZHRfcGlwX3BvcnQoaWZhY2UsIGlkeCwgcCwgY291bnQgLSAxLCBwbWFjKTsKIH0KQEAgLTY4Miw2ICs2ODMsMzcgQEAKIAkJfQogCX0KIAorCS8qIERXQzIgVVNCICovCisJYWxpYXNfcHJvcCA9IGZkdF9nZXRwcm9wKGluaXRpYWxfYm9vdF9wYXJhbXMsIGFsaWFzZXMsCisJCQkJICJ1c2JuIiwgTlVMTCk7CisJaWYgKGFsaWFzX3Byb3ApIHsKKwkJaW50IHVzYm4gPSBmZHRfcGF0aF9vZmZzZXQoaW5pdGlhbF9ib290X3BhcmFtcywgYWxpYXNfcHJvcCk7CisKKwkJaWYgKHVzYm4gPj0gMCAmJiAoY3VycmVudF9jcHVfdHlwZSgpID09IENQVV9DQVZJVU1fT0NURU9OMiB8fAorCQkJCSAgIW9jdGVvbl9oYXNfZmVhdHVyZShPQ1RFT05fRkVBVFVSRV9VU0IpKSkgeworCQkJcHJfZGVidWcoIkRlbGV0aW5nIHVzYm5cbiIpOworCQkJZmR0X25vcF9ub2RlKGluaXRpYWxfYm9vdF9wYXJhbXMsIHVzYm4pOworCQkJZmR0X25vcF9wcm9wZXJ0eShpbml0aWFsX2Jvb3RfcGFyYW1zLCBhbGlhc2VzLCAidXNibiIpOworCQl9IGVsc2UgIHsKKwkJCV9fYmUzMiBuZXdfZlsxXTsKKwkJCWVudW0gY3ZteF9oZWxwZXJfYm9hcmRfdXNiX2Nsb2NrX3R5cGVzIGM7CisJCQljID0gX19jdm14X2hlbHBlcl9ib2FyZF91c2JfZ2V0X2Nsb2NrX3R5cGUoKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSBVU0JfQ0xPQ0tfVFlQRV9SRUZfNDg6CisJCQkJbmV3X2ZbMF0gPSBjcHVfdG9fYmUzMig0ODAwMDAwMCk7CisJCQkJZmR0X3NldHByb3BfaW5wbGFjZShpbml0aWFsX2Jvb3RfcGFyYW1zLCB1c2JuLAorCQkJCQkJICAgICJyZWZjbGstZnJlcXVlbmN5IiwgIG5ld19mLCBzaXplb2YobmV3X2YpKTsKKwkJCQkvKiBGYWxsIHRocm91Z2ggLi4uKi8KKwkJCWNhc2UgVVNCX0NMT0NLX1RZUEVfUkVGXzEyOgorCQkJCS8qIE1pc3NpbmcgInJlZmNsay10eXBlIiBkZWZhdWx0cyB0byBleHRlcm5hbC4gKi8KKwkJCQlmZHRfbm9wX3Byb3BlcnR5KGluaXRpYWxfYm9vdF9wYXJhbXMsIHVzYm4sICJyZWZjbGstdHlwZSIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb25fM3h4eC5kdHMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb25fM3h4eC5kdHMKaW5kZXggODhjYjQyZC4uZmEzMzExNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uXzN4eHguZHRzCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbl8zeHh4LmR0cwpAQCAtNTUwLDYgKzU1MCwyNCBAQAogCQkJCWJpZy1lbmRpYW4tcmVnczsKIAkJCX07CiAJCX07CisKKwkJdXNibjogdXNibkAxMTgwMDY4MDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi01NzUwLXVzYm4iOworCQkJcmVnID0gPDB4MTE4MDAgMHg2ODAwMDAwMCAweDAgMHgxMDAwPjsKKwkJCXJhbmdlczsgLyogRGlyZWN0IG1hcHBpbmcgKi8KKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkvKiAxMk1IeiwgMjRNSHogYW5kIDQ4TUh6IGFsbG93ZWQgKi8KKwkJCXJlZmNsay1mcmVxdWVuY3kgPSA8MTIwMDAwMDA+OworCQkJLyogRWl0aGVyICJjcnlzdGFsIiBvciAiZXh0ZXJuYWwiICovCisJCQlyZWZjbGstdHlwZSA9ICJjcnlzdGFsIjsKKworCQkJdXNiY0AxNmYwMDEwMDAwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNTc1MC11c2JjIjsKKwkJCQlyZWcgPSA8MHgxNmYwMCAweDEwMDAwMDAwIDB4MCAweDgwMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTY+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJYWxpYXNlcyB7CkBAIC01NjYsNiArNTg0LDcgQEAKIAkJZmxhc2gwID0gJmZsYXNoMDsKIAkJY2YwID0gJmNmMDsKIAkJdWN0bCA9ICZ1Y3RsOworCQl1c2JuID0gJnVzYm47CiAJCWxlZDAgPSAmbGVkMDsKIAl9OwogIH07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCmluZGV4IDI0YTIxNjcuLjY3YTA3OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCkBAIC02LDcgKzYsNiBAQAogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDgsIDIwMDksIDIwMTAgQ2F2aXVtIE5ldHdvcmtzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2FyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9hcjdfZGVmY29uZmlnCmluZGV4IDgwZTAxMmZhLi4zMjA3NzJjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9hcjdfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2FyN19kZWZjb25maWcKQEAgLTg2LDcgKzg2LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvYmNtNDd4eF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9iY200N3h4X2RlZmNvbmZpZwppbmRleCA0Y2E4ZTVjLi4wZGI0ZWIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9iY200N3h4X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9iY200N3h4X2RlZmNvbmZpZwpAQCAtMSw2MjMgKzEsODYgQEAKIENPTkZJR19CQ000N1hYPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19LRVhFQz15Ci0jIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15Ci1DT05GSUdfVEFTS1NUQVRTPXkKLUNPTkZJR19UQVNLX0RFTEFZX0FDQ1Q9eQotQ09ORklHX1RBU0tfWEFDQ1Q9eQotQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORz15Ci1DT05GSUdfQVVESVQ9eQotQ09ORklHX1RJTllfUkNVPXkKLUNPTkZJR19DR1JPVVBTPXkKLUNPTkZJR19DR1JPVVBfQ1BVQUNDVD15Ci1DT05GSUdfUkVMQVk9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfVUlER0lEX1NUUklDVF9UWVBFX0NIRUNLUz15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX1JEX0xaTUE9eQotQ09ORklHX0VYUEVSVD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKIENPTkZJR19TTEFCPXkKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIENPTkZJR19QQ0k9eQotQ09ORklHX0JJTkZNVF9NSVNDPW0KKyMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNX1VTRVI9bQotQ09ORklHX05FVF9LRVk9bQogQ09ORklHX0lORVQ9eQogQ09ORklHX0lQX01VTFRJQ0FTVD15CiBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci1DT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15Ci1DT05GSUdfTkVUX0lQSVA9bQotQ09ORklHX05FVF9JUEdSRT1tCi1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CiBDT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQorQ09ORklHX0lQX01ST1VURV9NVUxUSVBMRV9UQUJMRVM9eQogQ09ORklHX1NZTl9DT09LSUVTPXkKLUNPTkZJR19JTkVUX0FIPW0KLUNPTkZJR19JTkVUX0VTUD1tCi1DT05GSUdfSU5FVF9JUENPTVA9bQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPW0KLUNPTkZJR19JTkVUX0RJQUc9bQogQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX1RDUF9DT05HX0NVQklDPW0KLUNPTkZJR19UQ1BfQ09OR19IU1RDUD1tCi1DT05GSUdfVENQX0NPTkdfSFlCTEE9bQotQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFPW0KLUNPTkZJR19UQ1BfQ09OR19MUD1tCi1DT05GSUdfVENQX0NPTkdfVkVOTz1tCi1DT05GSUdfVENQX0NPTkdfWUVBSD1tCi1DT05GSUdfVENQX0NPTkdfSUxMSU5PSVM9bQogQ09ORklHX0lQVjZfUFJJVkFDWT15Ci1DT05GSUdfSU5FVDZfQUg9bQotQ09ORklHX0lORVQ2X0VTUD1tCi1DT05GSUdfSU5FVDZfSVBDT01QPW0KLUNPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQotQ09ORklHX0lQVjZfVFVOTkVMPW0KIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CiBDT05GSUdfSVBWNl9TVUJUUkVFUz15Ci1DT05GSUdfTkVUV09SS19TRUNNQVJLPXkKK0NPTkZJR19JUFY2X01ST1VURT15CiBDT05GSUdfTkVURklMVEVSPXkKLUNPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSz15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQotQ09ORklHX05GX0NPTk5UUkFDS19JUkM9bQotQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9bQotQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQotQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KLUNPTkZJR19ORl9DVF9ORVRMSU5LPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1NFQ01BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BIWVNERVY9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCi1DT05GSUdfSVBfVlM9bQotQ09ORklHX0lQX1ZTX1BST1RPX1RDUD15Ci1DT05GSUdfSVBfVlNfUFJPVE9fVURQPXkKLUNPTkZJR19JUF9WU19QUk9UT19FU1A9eQotQ09ORklHX0lQX1ZTX1BST1RPX0FIPXkKLUNPTkZJR19JUF9WU19SUj1tCi1DT05GSUdfSVBfVlNfV1JSPW0KLUNPTkZJR19JUF9WU19MQz1tCi1DT05GSUdfSVBfVlNfV0xDPW0KLUNPTkZJR19JUF9WU19MQkxDPW0KLUNPTkZJR19JUF9WU19MQkxDUj1tCi1DT05GSUdfSVBfVlNfREg9bQotQ09ORklHX0lQX1ZTX1NIPW0KLUNPTkZJR19JUF9WU19TRUQ9bQotQ09ORklHX0lQX1ZTX05RPW0KLUNPTkZJR19JUF9WU19GVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19JUF9ORl9RVUVVRT1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQotQ09ORklHX05GX05BVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCi1DT05GSUdfTkZfTkFUX1NOTVBfQkFTSUM9bQotQ09ORklHX0lQX05GX01BTkdMRT1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCi1DT05GSUdfSVBfTkZfUkFXPW0KLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQotQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCi1DT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX0lQNl9ORl9RVUVVRT1tCi1DT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND1tCi1DT05GSUdfSVA2X05GX01BVENIX0ZSQUc9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfSEw9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfTUg9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9SVD1tCi1DT05GSUdfSVA2X05GX1RBUkdFVF9ITD1tCi1DT05GSUdfSVA2X05GX1RBUkdFVF9MT0c9bQotQ09ORklHX0lQNl9ORl9GSUxURVI9bQotQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVKRUNUPW0KLUNPTkZJR19JUDZfTkZfTUFOR0xFPW0KLUNPTkZJR19JUDZfTkZfUkFXPW0KLUNPTkZJR19CUklER0VfTkZfRUJUQUJMRVM9bQotQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPW0KLUNPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPW0KLUNPTkZJR19CUklER0VfRUJUX1RfTkFUPW0KLUNPTkZJR19CUklER0VfRUJUXzgwMl8zPW0KLUNPTkZJR19CUklER0VfRUJUX0FNT05HPW0KLUNPTkZJR19CUklER0VfRUJUX0FSUD1tCi1DT05GSUdfQlJJREdFX0VCVF9JUD1tCi1DT05GSUdfQlJJREdFX0VCVF9MSU1JVD1tCi1DT05GSUdfQlJJREdFX0VCVF9NQVJLPW0KLUNPTkZJR19CUklER0VfRUJUX1BLVFRZUEU9bQotQ09ORklHX0JSSURHRV9FQlRfU1RQPW0KLUNPTkZJR19CUklER0VfRUJUX1ZMQU49bQotQ09ORklHX0JSSURHRV9FQlRfQVJQUkVQTFk9bQotQ09ORklHX0JSSURHRV9FQlRfRE5BVD1tCi1DT05GSUdfQlJJREdFX0VCVF9NQVJLX1Q9bQotQ09ORklHX0JSSURHRV9FQlRfUkVESVJFQ1Q9bQotQ09ORklHX0JSSURHRV9FQlRfU05BVD1tCi1DT05GSUdfQlJJREdFX0VCVF9MT0c9bQotQ09ORklHX0JSSURHRV9FQlRfVUxPRz1tCi1DT05GSUdfSVBfRENDUD1tCi1DT05GSUdfVElQQz1tCi1DT05GSUdfVElQQ19BRFZBTkNFRD15Ci1DT05GSUdfQVRNPW0KLUNPTkZJR19BVE1fQ0xJUD1tCi1DT05GSUdfQVRNX0xBTkU9bQotQ09ORklHX0FUTV9NUE9BPW0KLUNPTkZJR19BVE1fQlIyNjg0PW0KLUNPTkZJR19CUklER0U9bQotQ09ORklHX1ZMQU5fODAyMVE9bQorQ09ORklHX1ZMQU5fODAyMVE9eQogQ09ORklHX05FVF9TQ0hFRD15Ci1DT05GSUdfTkVUX1NDSF9DQlE9bQotQ09ORklHX05FVF9TQ0hfSFRCPW0KLUNPTkZJR19ORVRfU0NIX0hGU0M9bQotQ09ORklHX05FVF9TQ0hfQVRNPW0KLUNPTkZJR19ORVRfU0NIX1BSSU89bQotQ09ORklHX05FVF9TQ0hfUkVEPW0KLUNPTkZJR19ORVRfU0NIX1NGUT1tCi1DT05GSUdfTkVUX1NDSF9URVFMPW0KLUNPTkZJR19ORVRfU0NIX1RCRj1tCi1DT05GSUdfTkVUX1NDSF9HUkVEPW0KLUNPTkZJR19ORVRfU0NIX0RTTUFSSz1tCi1DT05GSUdfTkVUX1NDSF9ORVRFTT1tCi1DT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KLUNPTkZJR19ORVRfQ0xTX0JBU0lDPW0KLUNPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQotQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KLUNPTkZJR19ORVRfQ0xTX0ZXPW0KLUNPTkZJR19ORVRfQ0xTX1UzMj1tCi1DT05GSUdfQ0xTX1UzMl9QRVJGPXkKLUNPTkZJR19DTFNfVTMyX01BUks9eQotQ09ORklHX05FVF9DTFNfUlNWUD1tCi1DT05GSUdfTkVUX0NMU19SU1ZQNj1tCi1DT05GSUdfTkVUX0VNQVRDSD15Ci1DT05GSUdfTkVUX0VNQVRDSF9DTVA9bQotQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9bQotQ09ORklHX05FVF9FTUFUQ0hfVTMyPW0KLUNPTkZJR19ORVRfRU1BVENIX01FVEE9bQotQ09ORklHX05FVF9FTUFUQ0hfVEVYVD1tCi1DT05GSUdfTkVUX0NMU19BQ1Q9eQotQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KLUNPTkZJR19ORVRfQUNUX0dBQ1Q9bQotQ09ORklHX0dBQ1RfUFJPQj15Ci1DT05GSUdfTkVUX0FDVF9NSVJSRUQ9bQotQ09ORklHX05FVF9BQ1RfSVBUPW0KLUNPTkZJR19ORVRfQUNUX05BVD1tCi1DT05GSUdfTkVUX0FDVF9QRURJVD1tCi1DT05GSUdfTkVUX0FDVF9TSU1QPW0KLUNPTkZJR19ORVRfQ0xTX0lORD15Ci1DT05GSUdfTkVUX1BLVEdFTj1tCi1DT05GSUdfQlQ9bQotQ09ORklHX0JUX0hDSVVBUlQ9bQotQ09ORklHX0JUX0hDSVVBUlRfSDQ9eQotQ09ORklHX0JUX0hDSVVBUlRfQkNTUD15Ci1DT05GSUdfQlRfSENJVUFSVF9MTD15Ci1DT05GSUdfQlRfSENJQkNNMjAzWD1tCi1DT05GSUdfQlRfSENJQlBBMTBYPW0KLUNPTkZJR19CVF9IQ0lCRlVTQj1tCi1DT05GSUdfQlRfSENJVkhDST1tCi1DT05GSUdfQ0ZHODAyMTE9bQotQ09ORklHX01BQzgwMjExPW0KLUNPTkZJR19NQUM4MDIxMV9SQ19QSUQ9eQotQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfUElEPXkKLUNPTkZJR19NQUM4MDIxMV9NRVNIPXkKLUNPTkZJR19SRktJTEw9bQotQ09ORklHX1JGS0lMTF9JTlBVVD15Ci1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX0ZXX0xPQURFUj1tCi1DT05GSUdfQ09OTkVDVE9SPW0KK0NPTkZJR19ORVRfU0NIX0ZRX0NPREVMPXkKK0NPTkZJR19IQU1SQURJTz15CitDT05GSUdfQ0ZHODAyMTE9eQorQ09ORklHX01BQzgwMjExPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JDTTQ3WFhfUEFSVFM9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0NGST15CiBDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CiBDT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfU1RBQT15Ci1DT05GSUdfTVREX1JBTT15Ci1DT05GSUdfTVREX1JPTT15Ci1DT05GSUdfTVREX0FCU0VOVD15CitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogQ09ORklHX01URF9QSFlTTUFQPXkKLUNPTkZJR19CTEtfREVWX0xPT1A9bQotQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCi1DT05GSUdfQkxLX0RFVl9OQkQ9bQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTE2Mzg0Ci1DT05GSUdfQVRBX09WRVJfRVRIPW0KLUNPTkZJR19SQUlEX0FUVFJTPW0KLUNPTkZJR19TQ1NJPXkKLUNPTkZJR19TQ1NJX1RHVD1tCi1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TVD1tCi1DT05GSUdfQ0hSX0RFVl9PU1NUPW0KLUNPTkZJR19CTEtfREVWX1NSPW0KLUNPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15Ci1DT05GSUdfQ0hSX0RFVl9TRz1tCi1DT05GSUdfQ0hSX0RFVl9TQ0g9bQotQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKLUNPTkZJR19TQ1NJX0NPTlNUQU5UUz15Ci1DT05GSUdfU0NTSV9MT0dHSU5HPXkKLUNPTkZJR19TQ1NJX1NDQU5fQVNZTkM9eQotQ09ORklHX0lTQ1NJX1RDUD1tCitDT05GSUdfTVREX0JDTTQ3WFhTRkxBU0g9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9CQ000N1hYTkZMQVNIPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19EVU1NWT1tCi1DT05GSUdfRVFVQUxJWkVSPW0KLUNPTkZJR19UVU49bQotQ09ORklHX1ZFVEg9bQotQ09ORklHX1BIWUxJQj1tCi1DT05GSUdfTUFSVkVMTF9QSFk9bQotQ09ORklHX0RBVklDT01fUEhZPW0KLUNPTkZJR19RU0VNSV9QSFk9bQotQ09ORklHX0xYVF9QSFk9bQotQ09ORklHX0NJQ0FEQV9QSFk9bQotQ09ORklHX1ZJVEVTU0VfUEhZPW0KLUNPTkZJR19TTVNDX1BIWT1tCi1DT05GSUdfQlJPQURDT01fUEhZPW0KLUNPTkZJR19JQ1BMVVNfUEhZPW0KLUNPTkZJR19NRElPX0JJVEJBTkc9bQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTkVUX1BDST15CiBDT05GSUdfQjQ0PXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQVRIX0NPTU1PTj1tCi1DT05GSUdfQVRINUs9bQotQ09ORklHX0I0Mz1tCi1DT05GSUdfQjQzTEVHQUNZPW0KLUNPTkZJR19aRDEyMTFSVz1tCi1DT05GSUdfVVNCX0NBVEM9bQotQ09ORklHX1VTQl9LQVdFVEg9bQotQ09ORklHX1VTQl9QRUdBU1VTPW0KLUNPTkZJR19VU0JfUlRMODE1MD1tCi1DT05GSUdfVVNCX1VTQk5FVD1tCi1DT05GSUdfVVNCX05FVF9ETTk2MDE9bQotQ09ORklHX1VTQl9ORVRfR0w2MjBBPW0KLUNPTkZJR19VU0JfTkVUX1BMVVNCPW0KLUNPTkZJR19VU0JfTkVUX01DUzc4MzA9bQotQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVD1tCi1DT05GSUdfVVNCX0FMSV9NNTYzMj15Ci1DT05GSUdfVVNCX0FOMjcyMD15Ci1DT05GSUdfVVNCX0VQU09OMjg4OD15Ci1DT05GSUdfVVNCX0tDMjE5MD15Ci1DT05GSUdfVVNCX1NJRVJSQV9ORVQ9bQotQ09ORklHX0FUTV9EVU1NWT1tCi1DT05GSUdfQVRNX1RDUD1tCi1DT05GSUdfUFBQPW0KLUNPTkZJR19QUFBfQVNZTkM9bQotQ09ORklHX1BQUF9ERUZMQVRFPW0KLUNPTkZJR19QUFBfQlNEQ09NUD1tCi1DT05GSUdfUFBQX01QUEU9bQotQ09ORklHX1BQUE9FPW0KLUNPTkZJR19QUFBPQVRNPW0KLUNPTkZJR19TTElQPW0KLUNPTkZJR19JTlBVVF9FVkRFVj1tCi0jIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfVElHT04zPXkKK0NPTkZJR19CR01BQz15CitDT05GSUdfQVRIX0NBUkRTPXkKK0NPTkZJR19BVEg1Sz15CitDT05GSUdfQjQzPXkKK0NPTkZJR19CNDNMRUdBQ1k9eQorQ09ORklHX0JSQ01TTUFDPXkKK0NPTkZJR19JU0ROPXkKIENPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJQUxfODI1MF9ERVBSRUNBVEVEX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMXzgyNTBfUENJIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCiBDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0yCi0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX1cxPW0KLUNPTkZJR19XMV9NQVNURVJfTUFUUk9YPW0KLUNPTkZJR19XMV9NQVNURVJfRFMyNDkwPW0KLUNPTkZJR19XMV9TTEFWRV9USEVSTT1tCi1DT05GSUdfVzFfU0xBVkVfU01FTT1tCi1DT05GSUdfVzFfU0xBVkVfRFMyNDMzPW0KLUNPTkZJR19XMV9TTEFWRV9EUzI3NjA9bQotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotQ09ORklHX1RIRVJNQUw9eQorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX0hXX1JBTkRPTT15CitDT05GSUdfR1BJT19TWVNGUz15CiBDT05GSUdfV0FUQ0hET0c9eQotQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKIENPTkZJR19CQ000N1hYX1dEVD15CitDT05GSUdfU1NCX0RFQlVHPXkKIENPTkZJR19TU0JfRFJJVkVSX0dJR0U9eQotQ09ORklHX0RJU1BMQVlfU1VQUE9SVD1tCi1DT05GSUdfU09VTkQ9bQotQ09ORklHX1NORD1tCi1DT05GSUdfU05EX1NFUVVFTkNFUj1tCi1DT05GSUdfU05EX1NFUV9EVU1NWT1tCi1DT05GSUdfU05EX01JWEVSX09TUz1tCi1DT05GSUdfU05EX1BDTV9PU1M9bQotQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKLUNPTkZJR19TTkRfRFVNTVk9bQotQ09ORklHX1NORF9WSVJNSURJPW0KLUNPTkZJR19TTkRfVVNCX0FVRElPPW0KLUNPTkZJR19ISUQ9bQotQ09ORklHX1VTQl9ISUQ9bQotQ09ORklHX1VTQl9ISURERVY9eQorQ09ORklHX0JDTUFfRFJJVkVSX0dNQUNfQ01OPXkKIENPTkZJR19VU0I9eQotQ09ORklHX1VTQl9ERVZJQ0VGUz15Ci0jIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9eQotQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9eQotQ09ORklHX1VTQl9VMTMyX0hDRD1tCi1DT05GSUdfVVNCX1I4QTY2NTk3X0hDRD1tCi1DT05GSUdfVVNCX0FDTT1tCi1DT05GSUdfVVNCX1BSSU5URVI9bQotQ09ORklHX1VTQl9TVE9SQUdFPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9VU0JBVD15Ci1DT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5PXkKLUNPTkZJR19VU0JfU1RPUkFHRV9TRERSNTU9eQotQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9BTEFVREE9eQotQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9LQVJNQT15Ci1DT05GSUdfVVNCX01EQzgwMD1tCi1DT05GSUdfVVNCX01JQ1JPVEVLPW0KLUNPTkZJR19VU0JfU0VSSUFMPW0KLUNPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQotQ09ORklHX1VTQl9TRVJJQUxfQUlSQ0FCTEU9bQotQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNj1tCi1DT05GSUdfVVNCX1NFUklBTF9CRUxLSU49bQotQ09ORklHX1VTQl9TRVJJQUxfQ0gzNDE9bQotQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUPW0KLUNPTkZJR19VU0JfU0VSSUFMX0NZUFJFU1NfTTg9bQotQ09ORklHX1VTQl9TRVJJQUxfRU1QRUc9bQotQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU89bQotQ09ORklHX1VTQl9TRVJJQUxfRlVOU09GVD1tCi1DT05GSUdfVVNCX1NFUklBTF9WSVNPUj1tCi1DT05GSUdfVVNCX1NFUklBTF9JUEFRPW0KLUNPTkZJR19VU0JfU0VSSUFMX0lSPW0KLUNPTkZJR19VU0JfU0VSSUFMX0dBUk1JTj1tCi1DT05GSUdfVVNCX1NFUklBTF9JUFc9bQotQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREE9bQotQ09ORklHX1VTQl9TRVJJQUxfS0xTST1tCi1DT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1Q9bQotQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzI9bQotQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMD1tCi1DT05GSUdfVVNCX1NFUklBTF9NT1M3ODQwPW0KLUNPTkZJR19VU0JfU0VSSUFMX05BVk1BTj1tCi1DT05GSUdfVVNCX1NFUklBTF9QTDIzMDM9bQotQ09ORklHX1VTQl9TRVJJQUxfT1RJNjg1OD1tCi1DT05GSUdfVVNCX1NFUklBTF9IUDRYPW0KLUNPTkZJR19VU0JfU0VSSUFMX1NBRkU9bQotQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1M9bQotQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLPW0KLUNPTkZJR19VU0JfU0VSSUFMX1hJUkNPTT1tCi1DT05GSUdfVVNCX1NFUklBTF9PUFRJT049bQotQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVD1tCi1DT05GSUdfVVNCX1NFUklBTF9ERUJVRz1tCi1DT05GSUdfVVNCX0FEVVRVWD1tCi1DT05GSUdfVVNCX1JJTzUwMD1tCi1DT05GSUdfVVNCX0xFR09UT1dFUj1tCi1DT05GSUdfVVNCX0xDRD1tCi1DT05GSUdfVVNCX0xFRD1tCi1DT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzPW0KLUNPTkZJR19VU0JfQ1lUSEVSTT1tCi1DT05GSUdfVVNCX0lETU9VU0U9bQotQ09ORklHX1VTQl9GVERJX0VMQU49bQotQ09ORklHX1VTQl9TSVNVU0JWR0E9bQotQ09ORklHX1VTQl9MRD1tCi1DT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SPW0KLUNPTkZJR19VU0JfSU9XQVJSSU9SPW0KLUNPTkZJR19VU0JfVEVTVD1tCi1DT05GSUdfVVNCX0FUTT1tCi1DT05GSUdfVVNCX1NQRUVEVE9VQ0g9bQotQ09ORklHX1VTQl9DWEFDUlU9bQotQ09ORklHX1VTQl9VRUFHTEVBVE09bQotQ09ORklHX1VTQl9YVVNCQVRNPW0KLUNPTkZJR19VU0JfR0FER0VUPW0KLUNPTkZJR19VU0JfR0FER0VUX05FVDIyODA9eQotQ09ORklHX1VTQl9aRVJPPW0KLUNPTkZJR19VU0JfRVRIPW0KLUNPTkZJR19VU0JfR0FER0VURlM9bQotQ09ORklHX1VTQl9NQVNTX1NUT1JBR0U9bQotQ09ORklHX1VTQl9HX1NFUklBTD1tCi1DT05GSUdfVVNCX01JRElfR0FER0VUPW0KLUNPTkZJR19MRURTX0NMQVNTPXkKLUNPTkZJR19MRURTX0dQSU89eQorQ09ORklHX1VTQl9IQ0RfQkNNQT15CitDT05GSUdfVVNCX0hDRF9TU0I9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15Ci1DT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CiBDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049eQotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDJfRlNfWEFUVFI9eQotQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotQ09ORklHX1JFSVNFUkZTX0ZTPW0KLUNPTkZJR19SRUlTRVJGU19GU19YQVRUUj15Ci1DT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15Ci1DT05GSUdfSkZTX0ZTPW0KLUNPTkZJR19KRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19KRlNfU0VDVVJJVFk9eQotQ09ORklHX1hGU19GUz1tCi1DT05GSUdfWEZTX1FVT1RBPXkKLUNPTkZJR19YRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19YRlNfUlQ9eQotQ09ORklHX0dGUzJfRlM9bQotQ09ORklHX1FVT1RBPXkKLUNPTkZJR19RVU9UQV9ORVRMSU5LX0lOVEVSRkFDRT15Ci1DT05GSUdfUUZNVF9WMT1tCi1DT05GSUdfUUZNVF9WMj1tCi1DT05GSUdfQVVUT0ZTX0ZTPW0KLUNPTkZJR19BVVRPRlM0X0ZTPW0KLUNPTkZJR19GVVNFX0ZTPW0KLUNPTkZJR19JU085NjYwX0ZTPW0KLUNPTkZJR19KT0xJRVQ9eQotQ09ORklHX1pJU09GUz15Ci1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19NU0RPU19GUz1tCi1DT05GSUdfVkZBVF9GUz1tCi1DT05GSUdfTlRGU19GUz1tCi1DT05GSUdfTlRGU19SVz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15Ci1DT05GSUdfQURGU19GUz1tCi1DT05GSUdfQUZGU19GUz1tCi1DT05GSUdfSEZTX0ZTPW0KLUNPTkZJR19IRlNQTFVTX0ZTPW0KLUNPTkZJR19CRUZTX0ZTPW0KLUNPTkZJR19CRlNfRlM9bQotQ09ORklHX0VGU19GUz1tCi1DT05GSUdfSkZGUzJfRlM9bQotQ09ORklHX0pGRlMyX0ZTX1hBVFRSPXkKLUNPTkZJR19DUkFNRlM9bQotQ09ORklHX1ZYRlNfRlM9bQotQ09ORklHX01JTklYX0ZTPW0KLUNPTkZJR19IUEZTX0ZTPW0KLUNPTkZJR19RTlg0RlNfRlM9bQotQ09ORklHX1JPTUZTX0ZTPW0KLUNPTkZJR19TWVNWX0ZTPW0KLUNPTkZJR19VRlNfRlM9bQotQ09ORklHX05GU19GUz1tCi1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjNfQUNMPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU0Q9bQotQ09ORklHX05GU0RfVjNfQUNMPXkKLUNPTkZJR19ORlNEX1Y0PXkKLUNPTkZJR19SUENTRUNfR1NTX1NQS00zPW0KLUNPTkZJR19DSUZTPW0KLUNPTkZJR19DSUZTX1hBVFRSPXkKLUNPTkZJR19DSUZTX1BPU0lYPXkKLUNPTkZJR19OQ1BfRlM9bQotQ09ORklHX05DUEZTX05GU19OUz15Ci1DT05GSUdfTkNQRlNfT1MyX05TPXkKLUNPTkZJR19OQ1BGU19OTFM9eQotQ09ORklHX05DUEZTX0VYVFJBUz15Ci1DT05GSUdfQ09EQV9GUz1tCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLUNPTkZJR19LQVJNQV9QQVJUSVRJT049eQotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQotQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQotQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTI9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTc9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjA9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjE9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjI9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjM9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjQ9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjY9bQotQ09ORklHX05MU19DT0RFUEFHRV84Njk9bQotQ09ORklHX05MU19DT0RFUEFHRV85MzY9bQotQ09ORklHX05MU19DT0RFUEFHRV85NTA9bQotQ09ORklHX05MU19DT0RFUEFHRV85MzI9bQotQ09ORklHX05MU19DT0RFUEFHRV85NDk9bQotQ09ORklHX05MU19DT0RFUEFHRV84NzQ9bQotQ09ORklHX05MU19JU084ODU5Xzg9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfMTI1MT1tCi1DT05GSUdfTkxTX0FTQ0lJPW0KLUNPTkZJR19OTFNfSVNPODg1OV8xPW0KLUNPTkZJR19OTFNfSVNPODg1OV8yPW0KLUNPTkZJR19OTFNfSVNPODg1OV8zPW0KLUNPTkZJR19OTFNfSVNPODg1OV80PW0KLUNPTkZJR19OTFNfSVNPODg1OV81PW0KLUNPTkZJR19OTFNfSVNPODg1OV82PW0KLUNPTkZJR19OTFNfSVNPODg1OV83PW0KLUNPTkZJR19OTFNfSVNPODg1OV85PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xMz1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTQ9bQotQ09ORklHX05MU19JU084ODU5XzE1PW0KLUNPTkZJR19OTFNfS09JOF9SPW0KLUNPTkZJR19OTFNfS09JOF9VPW0KLUNPTkZJR19ETE09bQotQ09ORklHX0RMTV9ERUJVRz15CitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX0RFQlVHX0lORk9fUkVEVUNFRD15CitDT05GSUdfU1RSSVBfQVNNX1NZTVM9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19DUllQVE9fTlVMTD1tCi1DT05GSUdfQ1JZUFRPX1RFU1Q9bQotQ09ORklHX0NSWVBUT19MUlc9bQotQ09ORklHX0NSWVBUT19QQ0JDPW0KLUNPTkZJR19DUllQVE9fWFRTPW0KLUNPTkZJR19DUllQVE9fSE1BQz15Ci1DT05GSUdfQ1JZUFRPX1hDQkM9bQotQ09ORklHX0NSWVBUT19NRDQ9bQotQ09ORklHX0NSWVBUT19NRDU9eQotQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCi1DT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCi1DT05GSUdfQ1JZUFRPX1NIQTUxMj1tCi1DT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCi1DT05GSUdfQ1JZUFRPX1dQNTEyPW0KLUNPTkZJR19DUllQVE9fQU5VQklTPW0KLUNPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQotQ09ORklHX0NSWVBUT19DQU1FTExJQT1tCi1DT05GSUdfQ1JZUFRPX0NBU1Q2PW0KLUNPTkZJR19DUllQVE9fRkNSWVBUPW0KLUNPTkZJR19DUllQVE9fS0hBWkFEPW0KLUNPTkZJR19DUllQVE9fU0VFRD1tCi1DT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQotQ09ORklHX0NSWVBUT19URUE9bQotQ09ORklHX0NSWVBUT19UV09GSVNIPW0KLUNPTkZJR19DUkMxNj1tCi1DT05GSUdfQ1JDNz1tCitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwxMTUyMDAiCitDT05GSUdfQ1JDMzJfU0FSV0FURT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9iY202M3h4X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2JjbTYzeHhfZGVmY29uZmlnCmluZGV4IDkxOTAwNTEuLjNmZWMyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2JjbTYzeHhfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2JjbTYzeHhfZGVmY29uZmlnCkBAIC00NCw3ICs0NCw2IEBACiAjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DRkk9eQogQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQogQ09ORklHX01URF9DRklfQU1EU1REPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCmluZGV4IDU0MTlhZGIuLjIzYjY2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZwpAQCAtMTksNyArMTksNiBAQAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0pFREVDUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZ3ByX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2dwcl9kZWZjb25maWcKaW5kZXggZmI2NDU4OS4uOGYyMTlkYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZ3ByX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9ncHJfZGVmY29uZmlnCkBAIC0xNjUsNyArMTY1LDYgQEAKIENPTkZJR19DRkc4MDIxMT15CiBDT05GSUdfTUFDODAyMTE9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCBkYjU3MDVlLi45YmMwOGYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtMjIsNyArMjIsNiBAQAogIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0NGST15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9sYXNhdF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9sYXNhdF9kZWZjb25maWcKaW5kZXggZDlmM2RiMi4uMDE3OWM3ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXRfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0X2RlZmNvbmZpZwpAQCAtMzEsNyArMzEsNiBAQAogIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9kZWZjb25maWcKaW5kZXggOGE2NjYwMi4uZDc1OTMxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdnBfZGVmY29uZmlnCkBAIC00LDcgKzQsNyBAQAogQ09ORklHX01JUFNfTVRfU01QPXkKIENPTkZJR19TQ0hFRF9TTVQ9eQogQ09ORklHX01JUFNfQ01QPXkKLUNPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19OUl9DUFVTPTIKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX0xPQ0FMVkVSU0lPTj0iY21wIgogQ09ORklHX1NZU1ZJUEM9eQpAQCAtNTgsNyArNTgsNiBAQAogQ09ORklHX0RFVl9BUFBMRVRBTEs9bQogQ09ORklHX0lQRERQPW0KIENPTkZJR19JUEREUF9FTkNBUD15Ci1DT05GSUdfSVBERFBfREVDQVA9eQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQogQ09ORklHX05FVF9TQ0hfSFRCPW0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hcmtlaW5zX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hcmtlaW5zX2RlZmNvbmZpZwppbmRleCA2MzZmODJiLi40YzJjMGM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYXJrZWluc19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFya2VpbnNfZGVmY29uZmlnCkBAIC0xMjQsNyArMTI0LDYgQEAKIENPTkZJR19JUDZfTkZfUkFXPW0KIENPTkZJR19GV19MT0FERVI9bQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKaW5kZXggOWZhOGYxNi4uNTkzOTQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKQEAgLTI0Niw3ICsyNDYsNiBAQAogQ09ORklHX0JUX0hDSVZIQ0k9bQogQ09ORklHX0NPTk5FQ1RPUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0NGST15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wbng4MzM1X3N0YjIyNV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wbng4MzM1X3N0YjIyNV9kZWZjb25maWcKaW5kZXggZjI5MjU3Ni4uYzg4NzA2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODMzNV9zdGIyMjVfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDgzMzVfc3RiMjI1X2RlZmNvbmZpZwpAQCAtMzEsNyArMzEsNiBAQAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3FpX2xiNjBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcWlfbGI2MF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NjU0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3FpX2xiNjBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTg4IEBACitDT05GSUdfTUFDSF9KWjQ3NDA9eQorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUk9TU19NRU1PUllfQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX1BSRUVNUFQ9eQorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX01ST1VURV9NVUxUSVBMRV9UQUJMRVM9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQorIyBDT05GSUdfVENQX0NPTkdfQklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0NVQklDIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19XRVNUV09PRD15CisjIENPTkZJR19UQ1BfQ09OR19IVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9KWjQ3NDA9eQorQ09ORklHX01URF9VQkk9eQorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX0dQSU89eQorQ09ORklHX0tFWUJPQVJEX01BVFJJWD15CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTUlTQz15CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yCisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfODI1MF9ETUEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTIKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfR1BJTz15CitDT05GSUdfUE9XRVJfU1VQUExZPXkKK0NPTkZJR19CQVRURVJZX0paNDc0MD15CitDT05GSUdfQ0hBUkdFUl9HUElPPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NRkRfSlo0NzQwX0FEQz15CitDT05GSUdfUkVHVUxBVE9SPXkKK0NPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0paNDc0MD15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0xPR089eQorIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0IGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EUklWRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JUFMgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1NORF9KWjQ3NDBfU09DPXkKK0NPTkZJR19TTkRfSlo0NzQwX1NPQ19RSV9MQjYwPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01VU0JfSERSQz15CitDT05GSUdfVVNCX01VU0JfR0FER0VUPXkKK0NPTkZJR19VU0JfTVVTQl9KWjQ3NDA9eQorQ09ORklHX05PUF9VU0JfWENFSVY9eQorQ09ORklHX1VTQl9HQURHRVQ9eQorQ09ORklHX1VTQl9HQURHRVRfREVCVUc9eQorQ09ORklHX1VTQl9FVEg9eQorIyBDT05GSUdfVVNCX0VUSF9STkRJUyBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfVU5TQUZFX1JFU1VNRT15CisjIENPTkZJR19NTUNfQkxPQ0tfQk9VTkNFIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfSlo0NzQwPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfSlo0NzQwPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19ETUFfSlo0NzQwPXkKK0NPTkZJR19QV009eQorQ09ORklHX1BXTV9KWjQ3NDA9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CisjIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKK0NPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKKyMgQ09ORklHX0pGRlMyX1pMSUIgaXMgbm90IHNldAorQ09ORklHX1VCSUZTX0ZTPXkKK0NPTkZJR19VQklGU19GU19BRFZBTkNFRF9DT01QUj15CisjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNzM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNzc1PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODU1PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODU3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODYwPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODYxPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODYyPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODYzPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODY0PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODY1PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODY2PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODY5PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTUwPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODc0PXkKK0NPTkZJR19OTFNfSVNPODg1OV84PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD15CitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9eQorQ09ORklHX05MU19BU0NJST15CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX0lTTzg4NTlfMj15CitDT05GSUdfTkxTX0lTTzg4NTlfMz15CitDT05GSUdfTkxTX0lTTzg4NTlfND15CitDT05GSUdfTkxTX0lTTzg4NTlfNT15CitDT05GSUdfTkxTX0lTTzg4NTlfNj15CitDT05GSUdfTkxTX0lTTzg4NTlfNz15CitDT05GSUdfTkxTX0lTTzg4NTlfOT15CitDT05GSUdfTkxTX0lTTzg4NTlfMTM9eQorQ09ORklHX05MU19JU084ODU5XzE0PXkKK0NPTkZJR19OTFNfSVNPODg1OV8xNT15CitDT05GSUdfTkxTX0tPSThfUj15CitDT05GSUdfTkxTX0tPSThfVT15CitDT05GSUdfTkxTX1VURjg9eQorQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKK0NPTkZJR19TVFJJUF9BU01fU1lNUz15CitDT05GSUdfUkVBREFCTEVfQVNNPXkKK0NPTkZJR19ERUJVR19LTUVNTEVBSz15CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQorQ09ORklHX1BBTklDX09OX09PUFM9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19LR0RCPXkKK0NPTkZJR19SVU5USU1FX0RFQlVHPXkKK0NPTkZJR19DUllQVE9fWkxJQj15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVFM9eQorQ09ORklHX0ZPTlRfU1VOOHgxNj15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9yYjUzMl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9yYjUzMl9kZWZjb25maWcKaW5kZXggYjg1YjEyMS4uNWQ5ZDcwOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcmI1MzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3JiNTMyX2RlZmNvbmZpZwpAQCAtMTE0LDcgKzExNCw2IEBACiBDT05GSUdfSEFNUkFESU89eQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQkxPQ0syTVREPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3JidHg0OXh4X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3JidHg0OXh4X2RlZmNvbmZpZwppbmRleCA5Y2JhODU2Li5mOGJmOWI0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9yYnR4NDl4eF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcmJ0eDQ5eHhfZGVmY29uZmlnCkBAIC0zNSw3ICszNSw2IEBACiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZncvYXJjL2ZpbGUuYyBiL2FyY2gvbWlwcy9mdy9hcmMvZmlsZS5jCmluZGV4IGE4YjA4MDMuLjQ5ZmQzZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9mdy9hcmMvZmlsZS5jCisrKyBiL2FyY2gvbWlwcy9mdy9hcmMvZmlsZS5jCkBAIC04LDcgKzgsNiBAQAogICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5IFJhbGYgQmFlY2hsZQogICogQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9mdy9hcmMvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2dpYWxpYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Ftb24uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hbW9uLmgKaW5kZXggYzNkYzFhNi4uM2NjMDNjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Ftb24uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYW1vbi5oCkBAIC0xLDcgKzEsMTIgQEAKIC8qCi0gKiBBbW9uIHN1cHBvcnQKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIEFyYml0cmFyeSBNb25pdG9yIFN1cHBvcnQgKEFNT04pCiAgKi8KLQotaW50IGFtb25fY3B1X2F2YWlsKGludCk7Ci12b2lkIGFtb25fY3B1X3N0YXJ0KGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworaW50IGFtb25fY3B1X2F2YWlsKGludCBjcHUpOworaW50IGFtb25fY3B1X3N0YXJ0KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgc3AsCisJCSAgIHVuc2lnbmVkIGxvbmcgZ3AsIHVuc2lnbmVkIGxvbmcgYTApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTMyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaAppbmRleCAyNDEzYWZlLi43MGUxZjE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaApAQCAtMTIsMjcgKzEyLDYgQEAKICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KIAotCS5tYWNybwlmcHVfc2F2ZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAxPXQwCi0JY2ZjMQlcdG1wMSwgIGZjcjMxCi0Jc2RjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQotCXNkYzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKLQlzZGMxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCi0Jc2RjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQotCXNkYzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKLQlzZGMxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQotCXNkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCi0Jc2RjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKLQlzZGMxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQotCXNkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCi0Jc2RjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKLQlzZGMxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQotCXNkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCi0Jc2RjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKLQlzZGMxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQotCXNkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCi0Jc3cJXHRtcDEsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQotCS5lbmRtCi0KIAkubWFjcm8JZnB1X3NhdmVfc2luZ2xlIHRocmVhZCB0bXA9dDAKIAljZmMxCVx0bXAsICBmY3IzMQogCXN3YzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKQEAgLTcwLDI3ICs0OSw2IEBACiAJc3cJXHRtcCwgVEhSRUFEX0ZDUjMxKFx0aHJlYWQpCiAJLmVuZG0KIAotCS5tYWNybwlmcHVfcmVzdG9yZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXA9dDAKLQlsdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKLQlsZGMxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCi0JbGRjMQkkZjIsICBUSFJFQURfRlBSMihcdGhyZWFkKQotCWxkYzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKLQlsZGMxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCi0JbGRjMQkkZjgsICBUSFJFQURfRlBSOChcdGhyZWFkKQotCWxkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCi0JbGRjMQkkZjEyLCBUSFJFQURfRlBSMTIoXHRocmVhZCkKLQlsZGMxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQotCWxkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCi0JbGRjMQkkZjE4LCBUSFJFQURfRlBSMTgoXHRocmVhZCkKLQlsZGMxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQotCWxkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCi0JbGRjMQkkZjI0LCBUSFJFQURfRlBSMjQoXHRocmVhZCkKLQlsZGMxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQotCWxkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCi0JbGRjMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKLQljdGMxCVx0bXAsIGZjcjMxCi0JLmVuZG0KLQogCS5tYWNybwlmcHVfcmVzdG9yZV9zaW5nbGUgdGhyZWFkIHRtcD10MAogCWx3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQogCWx3YzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby02NC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTY0LmgKaW5kZXggMDhhNTI3ZC4uMzhlYTYwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTY0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTY0LmgKQEAgLTEzLDEwMiArMTMsNiBAQAogI2luY2x1ZGUgPGFzbS9mcHJlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogCi0JLm1hY3JvCWZwdV9zYXZlXzE2ZXZlbiB0aHJlYWQgdG1wPXQwCi0JY2ZjMQlcdG1wLCBmY3IzMQotCXNkYzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKLQlzZGMxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCi0Jc2RjMQkkZjQsICBUSFJFQURfRlBSNChcdGhyZWFkKQotCXNkYzEJJGY2LCAgVEhSRUFEX0ZQUjYoXHRocmVhZCkKLQlzZGMxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCi0Jc2RjMQkkZjEwLCBUSFJFQURfRlBSMTAoXHRocmVhZCkKLQlzZGMxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQotCXNkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0KFx0aHJlYWQpCi0Jc2RjMQkkZjE2LCBUSFJFQURfRlBSMTYoXHRocmVhZCkKLQlzZGMxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQotCXNkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwKFx0aHJlYWQpCi0Jc2RjMQkkZjIyLCBUSFJFQURfRlBSMjIoXHRocmVhZCkKLQlzZGMxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQotCXNkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2KFx0aHJlYWQpCi0Jc2RjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKLQlzZGMxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQotCXN3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQotCS5lbmRtCi0KLQkubWFjcm8JZnB1X3NhdmVfMTZvZGQgdGhyZWFkCi0Jc2RjMQkkZjEsICBUSFJFQURfRlBSMShcdGhyZWFkKQotCXNkYzEJJGYzLCAgVEhSRUFEX0ZQUjMoXHRocmVhZCkKLQlzZGMxCSRmNSwgIFRIUkVBRF9GUFI1KFx0aHJlYWQpCi0Jc2RjMQkkZjcsICBUSFJFQURfRlBSNyhcdGhyZWFkKQotCXNkYzEJJGY5LCAgVEhSRUFEX0ZQUjkoXHRocmVhZCkKLQlzZGMxCSRmMTEsIFRIUkVBRF9GUFIxMShcdGhyZWFkKQotCXNkYzEJJGYxMywgVEhSRUFEX0ZQUjEzKFx0aHJlYWQpCi0Jc2RjMQkkZjE1LCBUSFJFQURfRlBSMTUoXHRocmVhZCkKLQlzZGMxCSRmMTcsIFRIUkVBRF9GUFIxNyhcdGhyZWFkKQotCXNkYzEJJGYxOSwgVEhSRUFEX0ZQUjE5KFx0aHJlYWQpCi0Jc2RjMQkkZjIxLCBUSFJFQURfRlBSMjEoXHRocmVhZCkKLQlzZGMxCSRmMjMsIFRIUkVBRF9GUFIyMyhcdGhyZWFkKQotCXNkYzEJJGYyNSwgVEhSRUFEX0ZQUjI1KFx0aHJlYWQpCi0Jc2RjMQkkZjI3LCBUSFJFQURfRlBSMjcoXHRocmVhZCkKLQlzZGMxCSRmMjksIFRIUkVBRF9GUFIyOShcdGhyZWFkKQotCXNkYzEJJGYzMSwgVEhSRUFEX0ZQUjMxKFx0aHJlYWQpCi0JLmVuZG0KLQotCS5tYWNybwlmcHVfc2F2ZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAKLQlzbGwJXHRtcCwgXHN0YXR1cywgNQotCWJnZXoJXHRtcCwgMmYKLQlmcHVfc2F2ZV8xNm9kZCBcdGhyZWFkCi0yOgotCWZwdV9zYXZlXzE2ZXZlbiBcdGhyZWFkIFx0bXAKLQkuZW5kbQotCi0JLm1hY3JvCWZwdV9yZXN0b3JlXzE2ZXZlbiB0aHJlYWQgdG1wPXQwCi0JbHcJXHRtcCwgVEhSRUFEX0ZDUjMxKFx0aHJlYWQpCi0JbGRjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQotCWxkYzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKLQlsZGMxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCi0JbGRjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQotCWxkYzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKLQlsZGMxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQotCWxkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCi0JbGRjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKLQlsZGMxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQotCWxkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCi0JbGRjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKLQlsZGMxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQotCWxkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCi0JbGRjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKLQlsZGMxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQotCWxkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCi0JY3RjMQlcdG1wLCBmY3IzMQotCS5lbmRtCi0KLQkubWFjcm8JZnB1X3Jlc3RvcmVfMTZvZGQgdGhyZWFkCi0JbGRjMQkkZjEsICBUSFJFQURfRlBSMShcdGhyZWFkKQotCWxkYzEJJGYzLCAgVEhSRUFEX0ZQUjMoXHRocmVhZCkKLQlsZGMxCSRmNSwgIFRIUkVBRF9GUFI1KFx0aHJlYWQpCi0JbGRjMQkkZjcsICBUSFJFQURfRlBSNyhcdGhyZWFkKQotCWxkYzEJJGY5LCAgVEhSRUFEX0ZQUjkoXHRocmVhZCkKLQlsZGMxCSRmMTEsIFRIUkVBRF9GUFIxMShcdGhyZWFkKQotCWxkYzEJJGYxMywgVEhSRUFEX0ZQUjEzKFx0aHJlYWQpCi0JbGRjMQkkZjE1LCBUSFJFQURfRlBSMTUoXHRocmVhZCkKLQlsZGMxCSRmMTcsIFRIUkVBRF9GUFIxNyhcdGhyZWFkKQotCWxkYzEJJGYxOSwgVEhSRUFEX0ZQUjE5KFx0aHJlYWQpCi0JbGRjMQkkZjIxLCBUSFJFQURfRlBSMjEoXHRocmVhZCkKLQlsZGMxCSRmMjMsIFRIUkVBRF9GUFIyMyhcdGhyZWFkKQotCWxkYzEJJGYyNSwgVEhSRUFEX0ZQUjI1KFx0aHJlYWQpCi0JbGRjMQkkZjI3LCBUSFJFQURfRlBSMjcoXHRocmVhZCkKLQlsZGMxCSRmMjksIFRIUkVBRF9GUFIyOShcdGhyZWFkKQotCWxkYzEJJGYzMSwgVEhSRUFEX0ZQUjMxKFx0aHJlYWQpCi0JLmVuZG0KLQotCS5tYWNybwlmcHVfcmVzdG9yZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAKLQlzbGwJXHRtcCwgXHN0YXR1cywgNQotCWJnZXoJXHRtcCwgMWYJCQkJIyAxNiByZWdpc3RlciBtb2RlPwotCi0JZnB1X3Jlc3RvcmVfMTZvZGQgXHRocmVhZAotMToJZnB1X3Jlc3RvcmVfMTZldmVuIFx0aHJlYWQgXHRtcAotCS5lbmRtCi0KIAkubWFjcm8JY3B1X3NhdmVfbm9uc2NyYXRjaCB0aHJlYWQKIAlMT05HX1MJczAsIFRIUkVBRF9SRUcxNihcdGhyZWFkKQogCUxPTkdfUwlzMSwgVEhSRUFEX1JFRzE3KFx0aHJlYWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCmluZGV4IDZjODM0MmEuLjMyMjBjOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCkBAIC02Miw2ICs2MiwxMTMgQEAKIAkuZW5kbQogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAorCS5tYWNybwlmcHVfc2F2ZV8xNmV2ZW4gdGhyZWFkIHRtcD10MAorCWNmYzEJXHRtcCwgZmNyMzEKKwlzZGMxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCisJc2RjMQkkZjIsICBUSFJFQURfRlBSMihcdGhyZWFkKQorCXNkYzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKKwlzZGMxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCisJc2RjMQkkZjgsICBUSFJFQURfRlBSOChcdGhyZWFkKQorCXNkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCisJc2RjMQkkZjEyLCBUSFJFQURfRlBSMTIoXHRocmVhZCkKKwlzZGMxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQorCXNkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCisJc2RjMQkkZjE4LCBUSFJFQURfRlBSMTgoXHRocmVhZCkKKwlzZGMxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQorCXNkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCisJc2RjMQkkZjI0LCBUSFJFQURfRlBSMjQoXHRocmVhZCkKKwlzZGMxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQorCXNkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCisJc2RjMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKKwlzdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKKwkuZW5kbQorCisJLm1hY3JvCWZwdV9zYXZlXzE2b2RkIHRocmVhZAorCS5zZXQJcHVzaAorCS5zZXQJbWlwczY0cjIKKwlzZGMxCSRmMSwgIFRIUkVBRF9GUFIxKFx0aHJlYWQpCisJc2RjMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQorCXNkYzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKKwlzZGMxCSRmNywgIFRIUkVBRF9GUFI3KFx0aHJlYWQpCisJc2RjMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQorCXNkYzEJJGYxMSwgVEhSRUFEX0ZQUjExKFx0aHJlYWQpCisJc2RjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKKwlzZGMxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQorCXNkYzEJJGYxNywgVEhSRUFEX0ZQUjE3KFx0aHJlYWQpCisJc2RjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKKwlzZGMxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQorCXNkYzEJJGYyMywgVEhSRUFEX0ZQUjIzKFx0aHJlYWQpCisJc2RjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKKwlzZGMxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQorCXNkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5KFx0aHJlYWQpCisJc2RjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JZnB1X3NhdmVfZG91YmxlIHRocmVhZCBzdGF0dXMgdG1wCisjaWYgZGVmaW5lZChDT05GSUdfTUlQUzY0KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IyKQorCXNsbAlcdG1wLCBcc3RhdHVzLCA1CisJYmdleglcdG1wLCAxMGYKKwlmcHVfc2F2ZV8xNm9kZCBcdGhyZWFkCisxMDoKKyNlbmRpZgorCWZwdV9zYXZlXzE2ZXZlbiBcdGhyZWFkIFx0bXAKKwkuZW5kbQorCisJLm1hY3JvCWZwdV9yZXN0b3JlXzE2ZXZlbiB0aHJlYWQgdG1wPXQwCisJbHcJXHRtcCwgVEhSRUFEX0ZDUjMxKFx0aHJlYWQpCisJbGRjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQorCWxkYzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKKwlsZGMxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCisJbGRjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQorCWxkYzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKKwlsZGMxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQorCWxkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCisJbGRjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKKwlsZGMxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQorCWxkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCisJbGRjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKKwlsZGMxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQorCWxkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCisJbGRjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKKwlsZGMxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQorCWxkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCisJY3RjMQlcdG1wLCBmY3IzMQorCS5lbmRtCisKKwkubWFjcm8JZnB1X3Jlc3RvcmVfMTZvZGQgdGhyZWFkCisJLnNldAlwdXNoCisJLnNldAltaXBzNjRyMgorCWxkYzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKKwlsZGMxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCisJbGRjMQkkZjUsICBUSFJFQURfRlBSNShcdGhyZWFkKQorCWxkYzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKKwlsZGMxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCisJbGRjMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKKwlsZGMxCSRmMTMsIFRIUkVBRF9GUFIxMyhcdGhyZWFkKQorCWxkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCisJbGRjMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKKwlsZGMxCSRmMTksIFRIUkVBRF9GUFIxOShcdGhyZWFkKQorCWxkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCisJbGRjMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKKwlsZGMxCSRmMjUsIFRIUkVBRF9GUFIyNShcdGhyZWFkKQorCWxkYzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCisJbGRjMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKKwlsZGMxCSRmMzEsIFRIUkVBRF9GUFIzMShcdGhyZWFkKQorCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwlmcHVfcmVzdG9yZV9kb3VibGUgdGhyZWFkIHN0YXR1cyB0bXAKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCisJc2xsCVx0bXAsIFxzdGF0dXMsIDUKKwliZ2V6CVx0bXAsIDEwZgkJCQkjIDE2IHJlZ2lzdGVyIG1vZGU/CisKKwlmcHVfcmVzdG9yZV8xNm9kZCBcdGhyZWFkCisxMDoKKyNlbmRpZgorCWZwdV9yZXN0b3JlXzE2ZXZlbiBcdGhyZWFkIFx0bXAKKwkuZW5kbQorCiAvKgogICogVGVtcG9yYXJ5IHVudGlsIGFsbCBnYXMgaGF2ZSBNVCBBU0Ugc3VwcG9ydAogICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm1pcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ibWlwcy5oCmluZGV4IDI3YmQwNjAuLmNiYWNjZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ibWlwcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ibWlwcy5oCkBAIC00Niw4ICs0NiwzNSBAQAogCiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGFzbS9yNGtjYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9zbXAtb3BzLmg+CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIGJtaXBzX3NtcF9vcHM7CitleHRlcm4gc3RydWN0IHBsYXRfc21wX29wcyBibWlwczQzeHhfc21wX29wczsKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIGJtaXBzNTAwMF9zbXBfb3BzOworCitzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9ibWlwc19zbXBfb3BzKHZvaWQpCit7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfQ1BVX0JNSVBTKSAmJiBJU19FTkFCTEVEKENPTkZJR19TTVApCisJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKKwljYXNlIENQVV9CTUlQUzMyOgorCWNhc2UgQ1BVX0JNSVBTMzMwMDoKKwkJcmV0dXJuIHJlZ2lzdGVyX3VwX3NtcF9vcHMoKTsKKwljYXNlIENQVV9CTUlQUzQzNTA6CisJY2FzZSBDUFVfQk1JUFM0MzgwOgorCQlyZWdpc3Rlcl9zbXBfb3BzKCZibWlwczQzeHhfc21wX29wcyk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0JNSVBTNTAwMDoKKwkJcmVnaXN0ZXJfc21wX29wcygmYm1pcHM1MDAwX3NtcF9vcHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKK30KKwogZXh0ZXJuIGNoYXIgYm1pcHNfcmVzZXRfbm1pX3ZlYzsKIGV4dGVybiBjaGFyIGJtaXBzX3Jlc2V0X25taV92ZWNfZW5kOwogZXh0ZXJuIGNoYXIgYm1pcHNfc21wX21vdmV2ZWM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKaW5kZXggZDQ0NWQwNi4uNmU3MGIwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1mZWF0dXJlcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaApAQCAtMjAsNiArMjAsMTMgQEAKICNpZm5kZWYgY3B1X2hhc190bGIKICNkZWZpbmUgY3B1X2hhc190bGIJCShjcHVfZGF0YVswXS5vcHRpb25zICYgTUlQU19DUFVfVExCKQogI2VuZGlmCisjaWZuZGVmIGNwdV9oYXNfdGxiaW52CisjZGVmaW5lIGNwdV9oYXNfdGxiaW52CQkoY3B1X2RhdGFbMF0ub3B0aW9ucyAmIE1JUFNfQ1BVX1RMQklOVikKKyNlbmRpZgorI2lmbmRlZiBjcHVfaGFzX3NlZ21lbnRzCisjZGVmaW5lIGNwdV9oYXNfc2VnbWVudHMJKGNwdV9kYXRhWzBdLm9wdGlvbnMgJiBNSVBTX0NQVV9TRUdNRU5UUykKKyNlbmRpZgorCiAKIC8qCiAgKiBGb3IgdGhlIG1vbWVudCB3ZSBkb24ndCBjb25zaWRlciBSNjAwMCBhbmQgUjgwMDAgc28gd2UgY2FuIGFzc3VtZSB0aGF0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWluZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCmluZGV4IDIxYzhlMjkuLjhmN2FkZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oCkBAIC01Miw2ICs1Miw5IEBACiAJdW5zaWduZWQgaW50CQljcHV0eXBlOwogCWludAkJCWlzYV9sZXZlbDsKIAlpbnQJCQl0bGJzaXplOworCWludAkJCXRsYnNpemV2dGxiOworCWludAkJCXRsYnNpemVmdGxic2V0czsKKwlpbnQJCQl0bGJzaXplZnRsYndheXM7CiAJc3RydWN0IGNhY2hlX2Rlc2MJaWNhY2hlOyAvKiBQcmltYXJ5IEktY2FjaGUgKi8KIAlzdHJ1Y3QgY2FjaGVfZGVzYwlkY2FjaGU7IC8qIFByaW1hcnkgRCBvciBjb21iaW5lZCBJL0QgY2FjaGUgKi8KIAlzdHJ1Y3QgY2FjaGVfZGVzYwlzY2FjaGU7IC8qIFNlY29uZGFyeSBjYWNoZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS10eXBlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaAppbmRleCA0YTQwMmNjLi4wMmY1OTFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaApAQCAtMjcsMTAgKzI3LDcgQEAKICNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJY2FzZSBDUFVfNEtDOgogCWNhc2UgQ1BVX0FMQ0hFTVk6Ci0JY2FzZSBDUFVfQk1JUFMzMzAwOgotCWNhc2UgQ1BVX0JNSVBTNDM1MDoKIAljYXNlIENQVV9QUjQ0NTA6Ci0JY2FzZSBDUFVfQk1JUFMzMjoKIAljYXNlIENQVV9KWlJJU0M6CiAjZW5kaWYKIApAQCAtNDcsNiArNDQsOCBAQAogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV9NMTRLQzoKIAljYXNlIENQVV9NMTRLRUM6CisJY2FzZSBDUFVfSU5URVJBUFRJVjoKKwljYXNlIENQVV9QUk9BUFRJVjoKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NZU19IQVNfQ1BVX01JUFM2NF9SMQpAQCAtMTYzLDYgKzE2MiwxNiBAQAogCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT04yOgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfSEFTX0NQVV9CTUlQUzMyXzMzMDApIHx8IFwKKwlkZWZpbmVkIChDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxKQorCWNhc2UgQ1BVX0JNSVBTMzI6CisJY2FzZSBDUFVfQk1JUFMzMzAwOgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfQk1JUFM0MzUwCisJY2FzZSBDUFVfQk1JUFM0MzUwOgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfU1lTX0hBU19DUFVfQk1JUFM0MzgwCiAJY2FzZSBDUFVfQk1JUFM0MzgwOgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggZDIwMzVlMS4uNzY0MTFkZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMTExLDYgKzExMSwxMCBAQAogI2RlZmluZSBQUklEX0lNUF8xMDc0SwkJMHg5YTAwCiAjZGVmaW5lIFBSSURfSU1QX00xNEtDCQkweDljMDAKICNkZWZpbmUgUFJJRF9JTVBfTTE0S0VDCQkweDllMDAKKyNkZWZpbmUgUFJJRF9JTVBfSU5URVJBUFRJVl9VUAkweGEwMDAKKyNkZWZpbmUgUFJJRF9JTVBfSU5URVJBUFRJVl9NUAkweGExMDAKKyNkZWZpbmUgUFJJRF9JTVBfUFJPQVBUSVZfVVAJMHhhMjAwCisjZGVmaW5lIFBSSURfSU1QX1BST0FQVElWX01QCTB4YTMwMAogCiAvKgogICogVGhlc2UgYXJlIHRoZSBQUklEJ3MgZm9yIHdoZW4gMjM6MTYgPT0gUFJJRF9DT01QX1NJQllURQpAQCAtMTk0LDYgKzE5OCw3IEBACiAjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUDhYWAkweDEwMDAKICNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExQM1hYCTB4MTEwMAogI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFAyWFgJMHgxMjAwCisjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUDlYWAkweDE1MDAKIAogLyoKICAqIFBhcnRpY3VsYXIgUmV2aXNpb24gdmFsdWVzIGZvciBiaXRzIDc6MCBvZiB0aGUgUFJJZCByZWdpc3Rlci4KQEAgLTI0OSw2ICsyNTQsOCBAQAogCiAjZGVmaW5lIEZQSVJfSU1QX05PTkUJCTB4MDAwMAogCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQorCiBlbnVtIGNwdV90eXBlX2VudW0gewogCUNQVV9VTktOT1dOLAogCkBAIC0yODksNyArMjk2LDcgQEAKIAlDUFVfNEtDLCBDUFVfNEtFQywgQ1BVXzRLU0MsIENQVV8yNEssIENQVV8zNEssIENQVV8xMDA0SywgQ1BVXzc0SywKIAlDUFVfQUxDSEVNWSwgQ1BVX1BSNDQ1MCwgQ1BVX0JNSVBTMzIsIENQVV9CTUlQUzMzMDAsIENQVV9CTUlQUzQzNTAsCiAJQ1BVX0JNSVBTNDM4MCwgQ1BVX0JNSVBTNTAwMCwgQ1BVX0paUklTQywgQ1BVX0xPT05HU09OMSwgQ1BVX00xNEtDLAotCUNQVV9NMTRLRUMsCisJQ1BVX00xNEtFQywgQ1BVX0lOVEVSQVBUSVYsIENQVV9QUk9BUFRJViwKIAogCS8qCiAJICogTUlQUzY0IGNsYXNzIHByb2Nlc3NvcnMKQEAgLTMwMSw2ICszMDgsNyBAQAogCUNQVV9MQVNUCiB9OwogCisjZW5kaWYgLyogIV9fQVNTRU1CTFkgKi8KIAogLyoKICAqIElTQSBMZXZlbCBlbmNvZGluZ3MKQEAgLTM0OCw2ICszNTYsOCBAQAogI2RlZmluZSBNSVBTX0NQVV9QQ0kJCTB4MDA0MDAwMDAgLyogQ1BVIGhhcyBQZXJmIEN0ciBJbnQgaW5kaWNhdG9yICovCiAjZGVmaW5lIE1JUFNfQ1BVX1JJWEkJCTB4MDA4MDAwMDAgLyogQ1BVIGhhcyBUTEIgUmVhZC9lWGVjIEluaGliaXQgKi8KICNkZWZpbmUgTUlQU19DUFVfTUlDUk9NSVBTCTB4MDEwMDAwMDAgLyogQ1BVIGhhcyBtaWNyb01JUFMgY2FwYWJpbGl0eSAqLworI2RlZmluZSBNSVBTX0NQVV9UTEJJTlYJCTB4MDIwMDAwMDAgLyogQ1BVIHN1cHBvcnRzIFRMQklOVi9GICovCisjZGVmaW5lIE1JUFNfQ1BVX1NFR01FTlRTCTB4MDQwMDAwMDAgLyogQ1BVIHN1cHBvcnRzIFNlZ21lbnRhdGlvbiBDb250cm9sIHJlZ2lzdGVycyAqLwogCiAvKgogICogQ1BVIEFTRSBlbmNvZGluZ3MKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEtY29oZXJlbmNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLWNvaGVyZW5jZS5oCmluZGV4IDI0MmNiYjMuLmJjNWU4NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEtY29oZXJlbmNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RtYS1jb2hlcmVuY2UuaApAQCAtOSw3ICs5LDE2IEBACiAjaWZuZGVmIF9fQVNNX0RNQV9DT0hFUkVOQ0VfSAogI2RlZmluZSBfX0FTTV9ETUFfQ09IRVJFTkNFX0gKIAorI2lmZGVmIENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQKIGV4dGVybiBpbnQgY29oZXJlbnRpbzsKIGV4dGVybiBpbnQgaHdfY29oZXJlbnRpbzsKKyNlbHNlCisjaWZkZWYgQ09ORklHX0RNQV9DT0hFUkVOVAorI2RlZmluZSBjb2hlcmVudGlvCTEKKyNlbHNlCisjZGVmaW5lIGNvaGVyZW50aW8JMAorI2VuZGlmCisjZGVmaW5lIGh3X2NvaGVyZW50aW8JMAorI2VuZGlmIC8qIENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYTY2MzU5ZS4uZDQxNDQwNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMzYsNiArMzYsNyBAQAogI2RlZmluZSBFRl9NSVBTX0FCSTIJCTB4MDAwMDAwMjAKICNkZWZpbmUgRUZfTUlQU19PUFRJT05TX0ZJUlNUCTB4MDAwMDAwODAKICNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUJMHgwMDAwMDEwMAorI2RlZmluZSBFRl9NSVBTX0ZQNjQJCTB4MDAwMDAyMDAKICNkZWZpbmUgRUZfTUlQU19BQkkJCTB4MDAwMGYwMDAKICNkZWZpbmUgRUZfTUlQU19BUkNICQkweGYwMDAwMDAwCiAKQEAgLTE3Niw2ICsxNzcsMTggQEAKICNpZmRlZiBDT05GSUdfMzJCSVQKIAogLyoKKyAqIEluIG9yZGVyIHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBhdHRlbXB0IHRvIGV4ZWN1dGUgYW4gTzMyIGJpbmFyeSB3aGljaAorICogcmVxdWlyZXMgNjQgYml0IEZQIChGUj0xKSBvbiBhIHN5c3RlbSB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IHdlIHJlZnVzZQorICogdG8gZXhlY3V0ZSBhbnkgYmluYXJ5IHdoaWNoIGhhcyBiaXRzIHNwZWNpZmllZCBieSB0aGUgZm9sbG93aW5nIG1hY3JvIHNldAorICogaW4gaXRzIEVMRiBoZWFkZXIgZmxhZ3MuCisgKi8KKyNpZmRlZiBDT05GSUdfTUlQU19PMzJfRlA2NF9TVVBQT1JUCisjIGRlZmluZSBfX01JUFNfTzMyX0ZQNjRfTVVTVF9CRV9aRVJPCTAKKyNlbHNlCisjIGRlZmluZSBfX01JUFNfTzMyX0ZQNjRfTVVTVF9CRV9aRVJPCUVGX01JUFNfRlA2NAorI2VuZGlmCisKKy8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgogICovCiAjZGVmaW5lIGVsZl9jaGVja19hcmNoKGhkcikJCQkJCQlcCkBAIC0xOTIsNiArMjA1LDggQEAKIAlpZiAoKChfX2gtPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgIT0gMCkgJiYJCQlcCiAJICAgICgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpICE9IEVGX01JUFNfQUJJX08zMikpCQlcCiAJCV9fcmVzID0gMDsJCQkJCQlcCisJaWYgKF9faC0+ZV9mbGFncyAmIF9fTUlQU19PMzJfRlA2NF9NVVNUX0JFX1pFUk8pCQlcCisJCV9fcmVzID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19yZXM7CQkJCQkJCQlcCiB9KQpAQCAtMjQ5LDYgKzI2NCwxMSBAQAogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAorCWlmICgoZXgpLmVfZmxhZ3MgJiBFRl9NSVBTX0ZQNjQpCQkJCVwKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUyk7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpOwkJCVwKKwkJCQkJCQkJCVwKIAlpZiAocGVyc29uYWxpdHkoY3VycmVudC0+cGVyc29uYWxpdHkpICE9IFBFUl9MSU5VWCkJCVwKIAkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQkJCVwKIAkJCQkJCQkJCVwKQEAgLTI3MSwxNCArMjkxLDE4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NSVBTMzJfTzMyCi0jZGVmaW5lIF9fU0VUX1BFUlNPTkFMSVRZMzJfTzMyKCkJCQkJCVwKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoZXgpCQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlzZXRfdGhyZWFkX2ZsYWcoVElGXzMyQklUX1JFR1MpOwkJCVwKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKTsJCQlcCisJCQkJCQkJCQlcCisJCWlmICghKChleCkuZV9mbGFncyAmIEVGX01JUFNfRlA2NCkpCQkJXAorCQkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpOwkJXAorCQkJCQkJCQkJXAogCQljdXJyZW50LT50aHJlYWQuYWJpID0gJm1pcHNfYWJpXzMyOwkJCVwKIAl9IHdoaWxlICgwKQogI2Vsc2UKLSNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoKQkJCQkJXAorI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyX08zMihleCkJCQkJCVwKIAlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIApAQCAtMjg5LDcgKzMxMyw3IEBACiAJICAgICAoKGV4KS5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IDApCQkJCVwKIAkJX19TRVRfUEVSU09OQUxJVFkzMl9OMzIoKTsJCQkJXAogCWVsc2UJCQkJCQkJCVwKLQkJX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoKTsJCQkJXAorCQlfX1NFVF9QRVJTT05BTElUWTMyX08zMihleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyKGV4KSBkbyB7IH0gd2hpbGUgKDApCkBAIC0zMDAsNiArMzI0LDcgQEAKIAl1bnNpZ25lZCBpbnQgcDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCWNsZWFyX3RocmVhZF9mbGFnKFRJRl8zMkJJVF9SRUdTKTsJCQkJXAorCWNsZWFyX3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpOwkJCQlcCiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpOwkJCQlcCiAJCQkJCQkJCQlcCiAJaWYgKChleCkuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmgKaW5kZXggZDA4OGU1ZC4uNmI5NzQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHUuaApAQCAtMzMsMTEgKzMzLDUwIEBACiBleHRlcm4gdm9pZCBfc2F2ZV9mcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfcmVzdG9yZV9mcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAKLSNkZWZpbmUgX19lbmFibGVfZnB1KCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlzZXRfYzBfc3RhdHVzKFNUMF9DVTEpOwkJCQkJCVwKLQllbmFibGVfZnB1X2hhemFyZCgpOwkJCQkJCVwKLX0gd2hpbGUgKDApCisvKgorICogVGhpcyBlbnVtIHNwZWNpZmllcyBhIG1vZGUgaW4gd2hpY2ggd2Ugd2FudCB0aGUgRlBVIHRvIG9wZXJhdGUsIGZvciBjb3JlcworICogd2hpY2ggaW1wbGVtZW50IHRoZSBTdGF0dXMuRlIgYml0LiBOb3RlIHRoYXQgRlBVXzMyQklUICYgRlBVXzY0QklUCisgKiBwdXJwb3NlZnVsbHkgaGF2ZSB0aGUgdmFsdWVzIDAgJiAxIHJlc3BlY3RpdmVseSwgc28gdGhhdCBhbiBpbnRlZ2VyIHZhbHVlCisgKiBvZiBTdGF0dXMuRlIgY2FuIGJlIHRyaXZpYWxseSBjYXN0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZW51bSBmcHVfbW9kZS4KKyAqLworZW51bSBmcHVfbW9kZSB7CisJRlBVXzMyQklUID0gMCwJCS8qIEZSID0gMCAqLworCUZQVV82NEJJVCwJCS8qIEZSID0gMSAqLworCUZQVV9BU19JUywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZW5hYmxlX2ZwdShlbnVtIGZwdV9tb2RlIG1vZGUpCit7CisJaW50IGZyOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBGUFVfQVNfSVM6CisJCS8qIGp1c3QgZW5hYmxlIHRoZSBGUFUgaW4gaXRzIGN1cnJlbnQgbW9kZSAqLworCQlzZXRfYzBfc3RhdHVzKFNUMF9DVTEpOworCQllbmFibGVfZnB1X2hhemFyZCgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRlBVXzY0QklUOgorI2lmICEoZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikgfHwgZGVmaW5lZChDT05GSUdfTUlQUzY0KSkKKwkJLyogd2Ugb25seSBoYXZlIGEgMzItYml0IEZQVSAqLworCQlyZXR1cm4gU0lHRlBFOworI2VuZGlmCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRlBVXzMyQklUOgorCQkvKiBzZXQgQ1UxICYgY2hhbmdlIEZSIGFwcHJvcHJpYXRlbHkgKi8KKwkJZnIgPSAoaW50KW1vZGU7CisJCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0NVMSB8IFNUMF9GUiwgU1QwX0NVMSB8IChmciA/IFNUMF9GUiA6IDApKTsKKwkJZW5hYmxlX2ZwdV9oYXphcmQoKTsKKworCQkvKiBjaGVjayBGUiBoYXMgdGhlIGRlc2lyZWQgdmFsdWUgKi8KKwkJcmV0dXJuICghIShyZWFkX2MwX3N0YXR1cygpICYgU1QwX0ZSKSA9PSAhIWZyKSA/IDAgOiBTSUdGUEU7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gU0lHRlBFOworfQogCiAjZGVmaW5lIF9fZGlzYWJsZV9mcHUoKQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXApAQCAtNDUsMTkgKzg0LDYgQEAKIAlkaXNhYmxlX2ZwdV9oYXphcmQoKTsJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIGVuYWJsZV9mcHUoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChjcHVfaGFzX2ZwdSkJCQkJCQlcCi0JCV9fZW5hYmxlX2ZwdSgpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgZGlzYWJsZV9mcHUoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChjcHVfaGFzX2ZwdSkJCQkJCQlcCi0JCV9fZGlzYWJsZV9mcHUoKTsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLQogI2RlZmluZSBjbGVhcl9mcHVfb3duZXIoKQljbGVhcl90aHJlYWRfZmxhZyhUSUZfVVNFREZQVSkKIAogc3RhdGljIGlubGluZSBpbnQgX19pc19mcHVfb3duZXIodm9pZCkKQEAgLTcwLDI3ICs5Niw0NiBAQAogCXJldHVybiBjcHVfaGFzX2ZwdSAmJiBfX2lzX2ZwdV9vd25lcigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vd25fZnB1KHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBfX293bl9mcHUodm9pZCkKIHsKLQlfX2VuYWJsZV9mcHUoKTsKKwllbnVtIGZwdV9tb2RlIG1vZGU7CisJaW50IHJldDsKKworCW1vZGUgPSAhdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfRlBSRUdTKTsKKwlyZXQgPSBfX2VuYWJsZV9mcHUobW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCUtTVEtfU1RBVFVTKGN1cnJlbnQpIHw9IFNUMF9DVTE7CisJaWYgKG1vZGUgPT0gRlBVXzY0QklUKQorCQlLU1RLX1NUQVRVUyhjdXJyZW50KSB8PSBTVDBfRlI7CisJZWxzZSAvKiBtb2RlID09IEZQVV8zMkJJVCAqLworCQlLU1RLX1NUQVRVUyhjdXJyZW50KSAmPSB+U1QwX0ZSOworCiAJc2V0X3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG93bl9mcHVfaW5hdG9taWMoaW50IHJlc3RvcmUpCitzdGF0aWMgaW5saW5lIGludCBvd25fZnB1X2luYXRvbWljKGludCByZXN0b3JlKQogeworCWludCByZXQgPSAwOworCiAJaWYgKGNwdV9oYXNfZnB1ICYmICFfX2lzX2ZwdV9vd25lcigpKSB7Ci0JCV9fb3duX2ZwdSgpOwotCQlpZiAocmVzdG9yZSkKKwkJcmV0ID0gX19vd25fZnB1KCk7CisJCWlmIChyZXN0b3JlICYmICFyZXQpCiAJCQlfcmVzdG9yZV9mcChjdXJyZW50KTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG93bl9mcHUoaW50IHJlc3RvcmUpCitzdGF0aWMgaW5saW5lIGludCBvd25fZnB1KGludCByZXN0b3JlKQogeworCWludCByZXQ7CisKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlvd25fZnB1X2luYXRvbWljKHJlc3RvcmUpOworCXJldCA9IG93bl9mcHVfaW5hdG9taWMocmVzdG9yZSk7CiAJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9zZV9mcHUoaW50IHNhdmUpCkBAIC0xMDYsMTYgKzE1MSwyMSBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2ZwdSh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgaW5pdF9mcHUodm9pZCkKIHsKKwlpbnQgcmV0ID0gMDsKKwogCXByZWVtcHRfZGlzYWJsZSgpOwogCWlmIChjcHVfaGFzX2ZwdSkgewotCQlfX293bl9mcHUoKTsKLQkJX2luaXRfZnB1KCk7CisJCXJldCA9IF9fb3duX2ZwdSgpOworCQlpZiAoIXJldCkKKwkJCV9pbml0X2ZwdSgpOwogCX0gZWxzZSB7CiAJCWZwdV9lbXVsYXRvcl9pbml0X2ZwdSgpOwogCX0KKwogCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfZnAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaGlnaG1lbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2hpZ2htZW0uaAppbmRleCBiMGRkMGM4Li41NzJlNjNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaGlnaG1lbS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oaWdobWVtLmgKQEAgLTE5LDcgKzE5LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggMzI5NjY5Ni4uYTk5NWZjZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTM5MSw5ICszOTEsNiBAQAogCXVpbnQzMl90IGd1ZXN0X2tlcm5lbF9hc2lkW05SX0NQVVNdOwogCXN0cnVjdCBtbV9zdHJ1Y3QgZ3Vlc3Rfa2VybmVsX21tLCBndWVzdF91c2VyX21tOwogCi0Jc3RydWN0IGt2bV9taXBzX3RsYiBzaGFkb3dfdGxiW05SX0NQVVNdW0tWTV9NSVBTX0dVRVNUX1RMQl9TSVpFXTsKLQotCiAJc3RydWN0IGhydGltZXIgY29tcGFyZWNvdW50X3RpbWVyOwogCiAJaW50IGxhc3Rfc2NoZWRfY3B1OwpAQCAtNTI5LDcgKzUyNiw2IEBACiAKIGV4dGVybiB2b2lkIGt2bV9taXBzX2R1bXBfaG9zdF90bGJzKHZvaWQpOwogZXh0ZXJuIHZvaWQga3ZtX21pcHNfZHVtcF9ndWVzdF90bGJzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci1leHRlcm4gdm9pZCBrdm1fbWlwc19kdW1wX3NoYWRvd190bGJzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gdm9pZCBrdm1fbWlwc19mbHVzaF9ob3N0X3RsYihpbnQgc2tpcF9rc2VnMCk7CiBleHRlcm4gaW50IGt2bV9taXBzX2hvc3RfdGxiX2ludihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZW50cnloaSk7CiBleHRlcm4gaW50IGt2bV9taXBzX2hvc3RfdGxiX2ludl9pbmRleChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpbmRleCk7CkBAIC01NDEsMTAgKzUzNyw3IEBACiAJCQkJCQkgICB1bnNpZ25lZCBsb25nIGd2YSk7CiBleHRlcm4gdm9pZCBrdm1fZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBjcHUsCiAJCQkJICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci1leHRlcm4gdm9pZCBrdm1fc2hhZG93X3RsYl9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLWV4dGVybiB2b2lkIGt2bV9zaGFkb3dfdGxiX2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiB2b2lkIGt2bV9sb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQga3ZtX21pcHNfaW5pdF9zaGFkb3dfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gdm9pZCBrdm1fbWlwc19hbGxvY19uZXdfbW11X2NvbnRleHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiB2b2lkIGt2bV9taXBzX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpOwogZXh0ZXJuIHZvaWQga3ZtX21pcHNfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF0aDc5L2FyNzF4eF9yZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdGg3OS9hcjcxeHhfcmVncy5oCmluZGV4IGI4NmExMjUuLmNkNDFlOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF0aDc5L2FyNzF4eF9yZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXRoNzkvYXI3MXh4X3JlZ3MuaApAQCAtMTYsNyArMTYsNiBAQAogI2RlZmluZSBfX0FTTV9NQUNIX0FSNzFYWF9SRUdTX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4LmgKaW5kZXggY2M3NTYzYi4uNzUyN2MxZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4LmgKQEAgLTU2LDQgKzU2LDYgQEAKIAkJCQkgY29uc3QgY2hhciAqcHJlZml4KTsKICNlbmRpZgogCit2b2lkIGJjbTQ3eHhfc2V0X3N5c3RlbV90eXBlKHUxNiBjaGlwX2lkKTsKKwogI2VuZGlmIC8qIF9fQVNNX0JDTTQ3WFhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4X2JvYXJkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHhfYm9hcmQuaAppbmRleCAwMDg2N2RkLi40MDAwNWZiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHhfYm9hcmQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHhfYm9hcmQuaApAQCAtNjYsNiArNjYsNyBAQAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQzMTBOVjEsCiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDMxME5WMiwKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHM0dWMiwKKwlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHU1YxLAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjEsCiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMiwKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUU0w1NEdTLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5OTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTAsMCArMSw4MiBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0JDTTQ3WFhfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKyNkZWZpbmUgX19BU01fTUFDSF9CQ000N1hYX0NQVV9GRUFUVVJFX09WRVJSSURFU19ICisKKyNkZWZpbmUgY3B1X2hhc190bGIJCQkxCisjZGVmaW5lIGNwdV9oYXNfNGtleAkJCTEKKyNkZWZpbmUgY3B1X2hhc18za19jYWNoZQkJMAorI2RlZmluZSBjcHVfaGFzXzRrX2NhY2hlCQkxCisjZGVmaW5lIGNwdV9oYXNfdHgzOV9jYWNoZQkJMAorI2RlZmluZSBjcHVfaGFzX2ZwdQkJCTAKKyNkZWZpbmUgY3B1X2hhc18zMmZwcgkJCTAKKyNkZWZpbmUgY3B1X2hhc19jb3VudGVyCQkJMQorI2lmIGRlZmluZWQoQ09ORklHX0JDTTQ3WFhfQkNNQSkgJiYgIWRlZmluZWQoQ09ORklHX0JDTTQ3WFhfU1NCKQorI2RlZmluZSBjcHVfaGFzX3dhdGNoCQkJMQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkNNNDdYWF9TU0IpICYmICFkZWZpbmVkKENPTkZJR19CQ000N1hYX0JDTUEpCisjZGVmaW5lIGNwdV9oYXNfd2F0Y2gJCQkwCisjZW5kaWYKKyNkZWZpbmUgY3B1X2hhc19kaXZlYwkJCTEKKyNkZWZpbmUgY3B1X2hhc192Y2UJCQkwCisjZGVmaW5lIGNwdV9oYXNfY2FjaGVfY2RleF9wCQkwCisjZGVmaW5lIGNwdV9oYXNfY2FjaGVfY2RleF9zCQkwCisjZGVmaW5lIGNwdV9oYXNfcHJlZmV0Y2gJCTEKKyNkZWZpbmUgY3B1X2hhc19tY2hlY2sJCQkxCisjZGVmaW5lIGNwdV9oYXNfZWp0YWcJCQkxCisjZGVmaW5lIGNwdV9oYXNfbGxzYwkJCTEKKworLyogY3B1X2hhc19taXBzMTYgKi8KKyNkZWZpbmUgY3B1X2hhc19tZG14CQkJMAorI2RlZmluZSBjcHVfaGFzX21pcHMzZAkJCTAKKyNkZWZpbmUgY3B1X2hhc19yaXhpCQkJMAorI2RlZmluZSBjcHVfaGFzX21taXBzCQkJMAorI2RlZmluZSBjcHVfaGFzX3NtYXJ0bWlwcwkJMAorI2RlZmluZSBjcHVfaGFzX3Z0YWdfaWNhY2hlCQkwCisvKiBjcHVfaGFzX2RjX2FsaWFzZXMgKi8KKyNkZWZpbmUgY3B1X2hhc19pY19maWxsc19mX2RjCQkwCisjZGVmaW5lIGNwdV9oYXNfcGluZGV4ZWRfZGNhY2hlCQkwCisjZGVmaW5lIGNwdV9pY2FjaGVfc25vb3BzX3JlbW90ZV9zdG9yZQkwCisKKyNkZWZpbmUgY3B1X2hhc19taXBzXzIJCQkxCisjZGVmaW5lIGNwdV9oYXNfbWlwc18zCQkJMAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIxCQkxCisjaWYgZGVmaW5lZChDT05GSUdfQkNNNDdYWF9CQ01BKSAmJiAhZGVmaW5lZChDT05GSUdfQkNNNDdYWF9TU0IpCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJCTEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JDTTQ3WFhfU1NCKSAmJiAhZGVmaW5lZChDT05GSUdfQkNNNDdYWF9CQ01BKQorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIyCQkwCisjZW5kaWYKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMQkJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIyCQkwCisKKyNpZiBkZWZpbmVkKENPTkZJR19CQ000N1hYX0JDTUEpICYmICFkZWZpbmVkKENPTkZJR19CQ000N1hYX1NTQikKKyNkZWZpbmUgY3B1X2hhc19kc3AJCQkxCisjZGVmaW5lIGNwdV9oYXNfZHNwMgkJCTEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JDTTQ3WFhfU1NCKSAmJiAhZGVmaW5lZChDT05GSUdfQkNNNDdYWF9CQ01BKQorI2RlZmluZSBjcHVfaGFzX2RzcAkJCTAKKyNkZWZpbmUgY3B1X2hhc19kc3AyCQkJMAorI2VuZGlmCisjZGVmaW5lIGNwdV9oYXNfbWlwc210CQkJMAorLyogY3B1X2hhc191c2VybG9jYWwgKi8KKworI2RlZmluZSBjcHVfaGFzX25vZnB1ZXgJCQkwCisjZGVmaW5lIGNwdV9oYXNfNjRiaXRzCQkJMAorI2RlZmluZSBjcHVfaGFzXzY0Yml0X3plcm9fcmVnCQkwCisjaWYgZGVmaW5lZChDT05GSUdfQkNNNDdYWF9CQ01BKSAmJiAhZGVmaW5lZChDT05GSUdfQkNNNDdYWF9TU0IpCisjZGVmaW5lIGNwdV9oYXNfdmludAkJCTEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JDTTQ3WFhfU1NCKSAmJiAhZGVmaW5lZChDT05GSUdfQkNNNDdYWF9CQ01BKQorI2RlZmluZSBjcHVfaGFzX3ZpbnQJCQkwCisjZW5kaWYKKyNkZWZpbmUgY3B1X2hhc192ZWljCQkJMAorI2RlZmluZSBjcHVfaGFzX2luY2x1c2l2ZV9wY2FjaGVzCTAKKworI2lmIGRlZmluZWQoQ09ORklHX0JDTTQ3WFhfQkNNQSkgJiYgIWRlZmluZWQoQ09ORklHX0JDTTQ3WFhfU1NCKQorI2RlZmluZSBjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpCQkzMgorI2RlZmluZSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpCQkzMgorI2RlZmluZSBjcHVfaGFzX3BlcmZfY250cl9pbnRyX2JpdAkxCisjZWxpZiBkZWZpbmVkKENPTkZJR19CQ000N1hYX1NTQikgJiYgIWRlZmluZWQoQ09ORklHX0JDTTQ3WFhfQkNNQSkKKyNkZWZpbmUgY3B1X2RjYWNoZV9saW5lX3NpemUoKQkJMTYKKyNkZWZpbmUgY3B1X2ljYWNoZV9saW5lX3NpemUoKQkJMTYKKyNkZWZpbmUgY3B1X2hhc19wZXJmX2NudHJfaW50cl9iaXQJMAorI2VuZGlmCisjZGVmaW5lIGNwdV9zY2FjaGVfbGluZV9zaXplKCkJCTAKKyNkZWZpbmUgY3B1X2hhc192egkJCTAKKworI2VuZGlmIC8qIF9fQVNNX01BQ0hfQkNNNDdYWF9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X2NwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X2NwdS5oCmluZGV4IDE5ZjkxMzQuLjMxMTJmMDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTYzeHgvYmNtNjN4eF9jcHUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfY3B1LmgKQEAgLTE0NSw2ICsxNDUsNyBAQAogCVJTRVRfVUFSVDEsCiAJUlNFVF9HUElPLAogCVJTRVRfU1BJLAorCVJTRVRfSFNTUEksCiAJUlNFVF9VREMwLAogCVJTRVRfT0hDSTAsCiAJUlNFVF9PSENJX1BSSVYsCkBAIC0xOTMsNiArMTk0LDcgQEAKICNkZWZpbmUgUlNFVF9FTkVURE1BU19TSVpFKGNoYW5zKQkoMTYgKiAoY2hhbnMpKQogI2RlZmluZSBSU0VUX0VORVRTV19TSVpFCQk2NTUzNgogI2RlZmluZSBSU0VUX1VBUlRfU0laRQkJCTI0CisjZGVmaW5lIFJTRVRfSFNTUElfU0laRQkJCTE1MzYKICNkZWZpbmUgUlNFVF9VRENfU0laRQkJCTI1NgogI2RlZmluZSBSU0VUX09IQ0lfU0laRQkJCTI1NgogI2RlZmluZSBSU0VUX0VIQ0lfU0laRQkJCTI1NgpAQCAtMjY1LDYgKzI2Nyw3IEBACiAjZGVmaW5lIEJDTV82MzI4X1VBUlQxX0JBU0UJCSgweGIwMDAwMTIwKQogI2RlZmluZSBCQ01fNjMyOF9HUElPX0JBU0UJCSgweGIwMDAwMDgwKQogI2RlZmluZSBCQ01fNjMyOF9TUElfQkFTRQkJKDB4ZGVhZGJlZWYpCisjZGVmaW5lIEJDTV82MzI4X0hTU1BJX0JBU0UJCSgweGIwMDAxMDAwKQogI2RlZmluZSBCQ01fNjMyOF9VREMwX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjMyOF9VU0JETUFfQkFTRQkJKDB4YjAwMGMwMDApCiAjZGVmaW5lIEJDTV82MzI4X09IQ0kwX0JBU0UJCSgweGIwMDAyNjAwKQpAQCAtMzEzLDYgKzMxNiw3IEBACiAjZGVmaW5lIEJDTV82MzM4X1VBUlQxX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjMzOF9HUElPX0JBU0UJCSgweGZmZmUwNDAwKQogI2RlZmluZSBCQ01fNjMzOF9TUElfQkFTRQkJKDB4ZmZmZTBjMDApCisjZGVmaW5lIEJDTV82MzM4X0hTU1BJX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjMzOF9VREMwX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjMzOF9VU0JETUFfQkFTRQkJKDB4ZmZmZTI0MDApCiAjZGVmaW5lIEJDTV82MzM4X09IQ0kwX0JBU0UJCSgweGRlYWRiZWVmKQpAQCAtMzYwLDYgKzM2NCw3IEBACiAjZGVmaW5lIEJDTV82MzQ1X1VBUlQxX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM0NV9HUElPX0JBU0UJCSgweGZmZmUwNDAwKQogI2RlZmluZSBCQ01fNjM0NV9TUElfQkFTRQkJKDB4ZGVhZGJlZWYpCisjZGVmaW5lIEJDTV82MzQ1X0hTU1BJX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM0NV9VREMwX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM0NV9VU0JETUFfQkFTRQkJKDB4ZmZmZTI4MDApCiAjZGVmaW5lIEJDTV82MzQ1X0VORVQwX0JBU0UJCSgweGZmZmUxODAwKQpAQCAtNDA2LDYgKzQxMSw3IEBACiAjZGVmaW5lIEJDTV82MzQ4X1VBUlQxX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM0OF9HUElPX0JBU0UJCSgweGZmZmUwNDAwKQogI2RlZmluZSBCQ01fNjM0OF9TUElfQkFTRQkJKDB4ZmZmZTBjMDApCisjZGVmaW5lIEJDTV82MzQ4X0hTU1BJX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM0OF9VREMwX0JBU0UJCSgweGZmZmUxMDAwKQogI2RlZmluZSBCQ01fNjM0OF9VU0JETUFfQkFTRQkJKDB4ZGVhZGJlZWYpCiAjZGVmaW5lIEJDTV82MzQ4X09IQ0kwX0JBU0UJCSgweGZmZmUxYjAwKQpAQCAtNDUxLDYgKzQ1Nyw3IEBACiAjZGVmaW5lIEJDTV82MzU4X1VBUlQxX0JBU0UJCSgweGZmZmUwMTIwKQogI2RlZmluZSBCQ01fNjM1OF9HUElPX0JBU0UJCSgweGZmZmUwMDgwKQogI2RlZmluZSBCQ01fNjM1OF9TUElfQkFTRQkJKDB4ZmZmZTA4MDApCisjZGVmaW5lIEJDTV82MzU4X0hTU1BJX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM1OF9VREMwX0JBU0UJCSgweGZmZmUwODAwKQogI2RlZmluZSBCQ01fNjM1OF9VU0JETUFfQkFTRQkJKDB4ZGVhZGJlZWYpCiAjZGVmaW5lIEJDTV82MzU4X09IQ0kwX0JBU0UJCSgweGZmZmUxNDAwKQpAQCAtNTUzLDYgKzU2MCw3IEBACiAjZGVmaW5lIEJDTV82MzY4X1VBUlQxX0JBU0UJCSgweGIwMDAwMTIwKQogI2RlZmluZSBCQ01fNjM2OF9HUElPX0JBU0UJCSgweGIwMDAwMDgwKQogI2RlZmluZSBCQ01fNjM2OF9TUElfQkFTRQkJKDB4YjAwMDA4MDApCisjZGVmaW5lIEJDTV82MzY4X0hTU1BJX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM2OF9VREMwX0JBU0UJCSgweGRlYWRiZWVmKQogI2RlZmluZSBCQ01fNjM2OF9VU0JETUFfQkFTRQkJKDB4YjAwMDQ4MDApCiAjZGVmaW5lIEJDTV82MzY4X09IQ0kwX0JBU0UJCSgweGIwMDAxNjAwKQpAQCAtNjA0LDYgKzYxMiw3IEBACiAJX19HRU5fUlNFVF9CQVNFKF9fY3B1LCBVQVJUMSkJCQkJCVwKIAlfX0dFTl9SU0VUX0JBU0UoX19jcHUsIEdQSU8pCQkJCQlcCiAJX19HRU5fUlNFVF9CQVNFKF9fY3B1LCBTUEkpCQkJCQlcCisJX19HRU5fUlNFVF9CQVNFKF9fY3B1LCBIU1NQSSkJCQkJCVwKIAlfX0dFTl9SU0VUX0JBU0UoX19jcHUsIFVEQzApCQkJCQlcCiAJX19HRU5fUlNFVF9CQVNFKF9fY3B1LCBPSENJMCkJCQkJCVwKIAlfX0dFTl9SU0VUX0JBU0UoX19jcHUsIE9IQ0lfUFJJVikJCQkJXApAQCAtNjQ3LDYgKzY1Niw3IEBACiAJW1JTRVRfVUFSVDFdCQk9IEJDTV8jIyBfX2NwdSAjI19VQVJUMV9CQVNFLAkJXAogCVtSU0VUX0dQSU9dCQk9IEJDTV8jIyBfX2NwdSAjI19HUElPX0JBU0UsCQlcCiAJW1JTRVRfU1BJXQkJPSBCQ01fIyMgX19jcHUgIyNfU1BJX0JBU0UsCQlcCisJW1JTRVRfSFNTUEldCQk9IEJDTV8jIyBfX2NwdSAjI19IU1NQSV9CQVNFLAkJXAogCVtSU0VUX1VEQzBdCQk9IEJDTV8jIyBfX2NwdSAjI19VREMwX0JBU0UsCQlcCiAJW1JTRVRfT0hDSTBdCQk9IEJDTV8jIyBfX2NwdSAjI19PSENJMF9CQVNFLAkJXAogCVtSU0VUX09IQ0lfUFJJVl0JPSBCQ01fIyMgX19jcHUgIyNfT0hDSV9QUklWX0JBU0UsCVwKQEAgLTcyNyw2ICs3MzcsNyBAQAogCUlSUV9FTkVUMCwKIAlJUlFfRU5FVDEsCiAJSVJRX0VORVRfUEhZLAorCUlSUV9IU1NQSSwKIAlJUlFfT0hDSTAsCiAJSVJRX0VIQ0kwLAogCUlSUV9VU0JELApAQCAtODE1LDYgKzgyNiw3IEBACiAjZGVmaW5lIEJDTV82MzI4X0VORVQwX0lSUQkJMAogI2RlZmluZSBCQ01fNjMyOF9FTkVUMV9JUlEJCTAKICNkZWZpbmUgQkNNXzYzMjhfRU5FVF9QSFlfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyAxMikKKyNkZWZpbmUgQkNNXzYzMjhfSFNTUElfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyAyOSkKICNkZWZpbmUgQkNNXzYzMjhfT0hDSTBfSVJRCQkoQkNNXzYzMjhfSElHSF9JUlFfQkFTRSArIDkpCiAjZGVmaW5lIEJDTV82MzI4X0VIQ0kwX0lSUQkJKEJDTV82MzI4X0hJR0hfSVJRX0JBU0UgKyAxMCkKICNkZWZpbmUgQkNNXzYzMjhfVVNCRF9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDQpCkBAIC04NjAsNiArODcyLDcgQEAKICNkZWZpbmUgQkNNXzYzMzhfRU5FVDBfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyA4KQogI2RlZmluZSBCQ01fNjMzOF9FTkVUMV9JUlEJCTAKICNkZWZpbmUgQkNNXzYzMzhfRU5FVF9QSFlfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyA5KQorI2RlZmluZSBCQ01fNjMzOF9IU1NQSV9JUlEJCTAKICNkZWZpbmUgQkNNXzYzMzhfT0hDSTBfSVJRCQkwCiAjZGVmaW5lIEJDTV82MzM4X0VIQ0kwX0lSUQkJMAogI2RlZmluZSBCQ01fNjMzOF9VU0JEX0lSUQkJMApAQCAtODk4LDYgKzkxMSw3IEBACiAjZGVmaW5lIEJDTV82MzQ1X0VORVQwX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgOCkKICNkZWZpbmUgQkNNXzYzNDVfRU5FVDFfSVJRCQkwCiAjZGVmaW5lIEJDTV82MzQ1X0VORVRfUEhZX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgMTIpCisjZGVmaW5lIEJDTV82MzQ1X0hTU1BJX0lSUQkJMAogI2RlZmluZSBCQ01fNjM0NV9PSENJMF9JUlEJCTAKICNkZWZpbmUgQkNNXzYzNDVfRUhDSTBfSVJRCQkwCiAjZGVmaW5lIEJDTV82MzQ1X1VTQkRfSVJRCQkwCkBAIC05MzYsNiArOTUwLDcgQEAKICNkZWZpbmUgQkNNXzYzNDhfRU5FVDBfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyA4KQogI2RlZmluZSBCQ01fNjM0OF9FTkVUMV9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDcpCiAjZGVmaW5lIEJDTV82MzQ4X0VORVRfUEhZX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgOSkKKyNkZWZpbmUgQkNNXzYzNDhfSFNTUElfSVJRCQkwCiAjZGVmaW5lIEJDTV82MzQ4X09IQ0kwX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgMTIpCiAjZGVmaW5lIEJDTV82MzQ4X0VIQ0kwX0lSUQkJMAogI2RlZmluZSBCQ01fNjM0OF9VU0JEX0lSUQkJMApAQCAtOTc0LDYgKzk4OSw3IEBACiAjZGVmaW5lIEJDTV82MzU4X0VORVQwX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgOCkKICNkZWZpbmUgQkNNXzYzNThfRU5FVDFfSVJRCQkoSVJRX0lOVEVSTkFMX0JBU0UgKyA2KQogI2RlZmluZSBCQ01fNjM1OF9FTkVUX1BIWV9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDkpCisjZGVmaW5lIEJDTV82MzU4X0hTU1BJX0lSUQkJMAogI2RlZmluZSBCQ01fNjM1OF9PSENJMF9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDUpCiAjZGVmaW5lIEJDTV82MzU4X0VIQ0kwX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgMTApCiAjZGVmaW5lIEJDTV82MzU4X1VTQkRfSVJRCQkwCkBAIC0xMDg2LDYgKzExMDIsNyBAQAogI2RlZmluZSBCQ01fNjM2OF9FTkVUMF9JUlEJCTAKICNkZWZpbmUgQkNNXzYzNjhfRU5FVDFfSVJRCQkwCiAjZGVmaW5lIEJDTV82MzY4X0VORVRfUEhZX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgMTUpCisjZGVmaW5lIEJDTV82MzY4X0hTU1BJX0lSUQkJMAogI2RlZmluZSBCQ01fNjM2OF9PSENJMF9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDUpCiAjZGVmaW5lIEJDTV82MzY4X0VIQ0kwX0lSUQkJKElSUV9JTlRFUk5BTF9CQVNFICsgNykKICNkZWZpbmUgQkNNXzYzNjhfVVNCRF9JUlEJCShJUlFfSU5URVJOQUxfQkFTRSArIDgpCkBAIC0xMTMzLDYgKzExNTAsNyBAQAogCVtJUlFfRU5FVDBdCQk9IEJDTV8jIyBfX2NwdSAjI19FTkVUMF9JUlEsCQlcCiAJW0lSUV9FTkVUMV0JCT0gQkNNXyMjIF9fY3B1ICMjX0VORVQxX0lSUSwJCVwKIAlbSVJRX0VORVRfUEhZXQkJPSBCQ01fIyMgX19jcHUgIyNfRU5FVF9QSFlfSVJRLAkJXAorCVtJUlFfSFNTUEldCQk9IEJDTV8jIyBfX2NwdSAjI19IU1NQSV9JUlEsCQlcCiAJW0lSUV9PSENJMF0JCT0gQkNNXyMjIF9fY3B1ICMjX09IQ0kwX0lSUSwJCVwKIAlbSVJRX0VIQ0kwXQkJPSBCQ01fIyMgX19jcHUgIyNfRUhDSTBfSVJRLAkJXAogCVtJUlFfVVNCRF0JCT0gQkNNXyMjIF9fY3B1ICMjX1VTQkRfSVJRLAkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X2Rldl9oc3NwaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X2Rldl9oc3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWFjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfZGV2X2hzc3BpLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIEJDTTYzWFhfREVWX0hTU1BJX0gKKyNkZWZpbmUgQkNNNjNYWF9ERVZfSFNTUElfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworaW50IGJjbTYzeHhfaHNzcGlfcmVnaXN0ZXIodm9pZCk7CisKKyNlbmRpZiAvKiBCQ002M1hYX0RFVl9IU1NQSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X3JlZ3MuaAppbmRleCA5ODc1ZGIzLi5hYjQyN2Y4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfcmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTYzeHgvYmNtNjN4eF9yZWdzLmgKQEAgLTQ2MywxMjYgKzQ2Myw2IEBACiAjZGVmaW5lIFdEVF9TT0ZUUkVTRVRfUkVHCQkweGMKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIF9SRUcgcmVsYXRpdmUgdG8gUlNFVF9VQVJUeAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFVBUlQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBVQVJUX0NUTF9SRUcJCQkweDAKLSNkZWZpbmUgVUFSVF9DVExfUlhUTU9VVENOVF9TSElGVAkwCi0jZGVmaW5lIFVBUlRfQ1RMX1JYVE1PVVRDTlRfTUFTSwkoMHgxZiA8PCBVQVJUX0NUTF9SWFRNT1VUQ05UX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9SU1RUWEROX1NISUZUCQk1Ci0jZGVmaW5lIFVBUlRfQ1RMX1JTVFRYRE5fTUFTSwkJKDEgPDwgVUFSVF9DVExfUlNUVFhETl9TSElGVCkKLSNkZWZpbmUgVUFSVF9DVExfUlNUUlhGSUZPX1NISUZUCQk2Ci0jZGVmaW5lIFVBUlRfQ1RMX1JTVFJYRklGT19NQVNLCQkoMSA8PCBVQVJUX0NUTF9SU1RSWEZJRk9fU0hJRlQpCi0jZGVmaW5lIFVBUlRfQ1RMX1JTVFRYRklGT19TSElGVAkJNwotI2RlZmluZSBVQVJUX0NUTF9SU1RUWEZJRk9fTUFTSwkJKDEgPDwgVUFSVF9DVExfUlNUVFhGSUZPX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9TVE9QQklUU19TSElGVAkJOAotI2RlZmluZSBVQVJUX0NUTF9TVE9QQklUU19NQVNLCQkoMHhmIDw8IFVBUlRfQ1RMX1NUT1BCSVRTX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9TVE9QQklUU18xCQkoMHg3IDw8IFVBUlRfQ1RMX1NUT1BCSVRTX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9TVE9QQklUU18yCQkoMHhmIDw8IFVBUlRfQ1RMX1NUT1BCSVRTX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9CSVRTUEVSU1lNX1NISUZUCTEyCi0jZGVmaW5lIFVBUlRfQ1RMX0JJVFNQRVJTWU1fTUFTSwkoMHgzIDw8IFVBUlRfQ1RMX0JJVFNQRVJTWU1fU0hJRlQpCi0jZGVmaW5lIFVBUlRfQ1RMX1hNSVRCUktfU0hJRlQJCTE0Ci0jZGVmaW5lIFVBUlRfQ1RMX1hNSVRCUktfTUFTSwkJKDEgPDwgVUFSVF9DVExfWE1JVEJSS19TSElGVCkKLSNkZWZpbmUgVUFSVF9DVExfUlNWRF9TSElGVAkJMTUKLSNkZWZpbmUgVUFSVF9DVExfUlNWRF9NQVNLCQkoMSA8PCBVQVJUX0NUTF9SU1ZEX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9SWFBBUkVWRU5fU0hJRlQJCTE2Ci0jZGVmaW5lIFVBUlRfQ1RMX1JYUEFSRVZFTl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9SWFBBUkVWRU5fU0hJRlQpCi0jZGVmaW5lIFVBUlRfQ1RMX1JYUEFSRU5fU0hJRlQJCTE3Ci0jZGVmaW5lIFVBUlRfQ1RMX1JYUEFSRU5fTUFTSwkJKDEgPDwgVUFSVF9DVExfUlhQQVJFTl9TSElGVCkKLSNkZWZpbmUgVUFSVF9DVExfVFhQQVJFVkVOX1NISUZUCQkxOAotI2RlZmluZSBVQVJUX0NUTF9UWFBBUkVWRU5fTUFTSwkJKDEgPDwgVUFSVF9DVExfVFhQQVJFVkVOX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9UWFBBUkVOX1NISUZUCQkxOAotI2RlZmluZSBVQVJUX0NUTF9UWFBBUkVOX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1RYUEFSRU5fU0hJRlQpCi0jZGVmaW5lIFVBUlRfQ1RMX0xPT1BCQUNLX1NISUZUCQkyMAotI2RlZmluZSBVQVJUX0NUTF9MT09QQkFDS19NQVNLCQkoMSA8PCBVQVJUX0NUTF9MT09QQkFDS19TSElGVCkKLSNkZWZpbmUgVUFSVF9DVExfUlhFTl9TSElGVAkJMjEKLSNkZWZpbmUgVUFSVF9DVExfUlhFTl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9SWEVOX1NISUZUKQotI2RlZmluZSBVQVJUX0NUTF9UWEVOX1NISUZUCQkyMgotI2RlZmluZSBVQVJUX0NUTF9UWEVOX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1RYRU5fU0hJRlQpCi0jZGVmaW5lIFVBUlRfQ1RMX0JSR0VOX1NISUZUCQkyMwotI2RlZmluZSBVQVJUX0NUTF9CUkdFTl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9CUkdFTl9TSElGVCkKLQotLyogVUFSVCBCYXVkd29yZCByZWdpc3RlciAqLwotI2RlZmluZSBVQVJUX0JBVURfUkVHCQkJMHg0Ci0KLS8qIFVBUlQgTWlzYyBDb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfTUNUTF9SRUcJCQkweDgKLSNkZWZpbmUgVUFSVF9NQ1RMX0RUUl9TSElGVAkJMAotI2RlZmluZSBVQVJUX01DVExfRFRSX01BU0sJCSgxIDw8IFVBUlRfTUNUTF9EVFJfU0hJRlQpCi0jZGVmaW5lIFVBUlRfTUNUTF9SVFNfU0hJRlQJCTEKLSNkZWZpbmUgVUFSVF9NQ1RMX1JUU19NQVNLCQkoMSA8PCBVQVJUX01DVExfUlRTX1NISUZUKQotI2RlZmluZSBVQVJUX01DVExfUlhGSUZPVEhSRVNIX1NISUZUCTgKLSNkZWZpbmUgVUFSVF9NQ1RMX1JYRklGT1RIUkVTSF9NQVNLCSgweGYgPDwgVUFSVF9NQ1RMX1JYRklGT1RIUkVTSF9TSElGVCkKLSNkZWZpbmUgVUFSVF9NQ1RMX1RYRklGT1RIUkVTSF9TSElGVAkxMgotI2RlZmluZSBVQVJUX01DVExfVFhGSUZPVEhSRVNIX01BU0sJKDB4ZiA8PCBVQVJUX01DVExfVFhGSUZPVEhSRVNIX1NISUZUKQotI2RlZmluZSBVQVJUX01DVExfUlhGSUZPRklMTF9TSElGVAkxNgotI2RlZmluZSBVQVJUX01DVExfUlhGSUZPRklMTF9NQVNLCSgweDFmIDw8IFVBUlRfTUNUTF9SWEZJRk9GSUxMX1NISUZUKQotI2RlZmluZSBVQVJUX01DVExfVFhGSUZPRklMTF9TSElGVAkyNAotI2RlZmluZSBVQVJUX01DVExfVFhGSUZPRklMTF9NQVNLCSgweDFmIDw8IFVBUlRfTUNUTF9UWEZJRk9GSUxMX1NISUZUKQotCi0vKiBVQVJUIEV4dGVybmFsIElucHV0IENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9FWFRJTlBfUkVHCQkJMHhjCi0jZGVmaW5lIFVBUlRfRVhUSU5QX1JJX1NISUZUCQkwCi0jZGVmaW5lIFVBUlRfRVhUSU5QX1JJX01BU0sJCSgxIDw8IFVBUlRfRVhUSU5QX1JJX1NISUZUKQotI2RlZmluZSBVQVJUX0VYVElOUF9DVFNfU0hJRlQJCTEKLSNkZWZpbmUgVUFSVF9FWFRJTlBfQ1RTX01BU0sJCSgxIDw8IFVBUlRfRVhUSU5QX0NUU19TSElGVCkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfRENEX1NISUZUCQkyCi0jZGVmaW5lIFVBUlRfRVhUSU5QX0RDRF9NQVNLCQkoMSA8PCBVQVJUX0VYVElOUF9EQ0RfU0hJRlQpCi0jZGVmaW5lIFVBUlRfRVhUSU5QX0RTUl9TSElGVAkJMwotI2RlZmluZSBVQVJUX0VYVElOUF9EU1JfTUFTSwkJKDEgPDwgVUFSVF9FWFRJTlBfRFNSX1NISUZUKQotI2RlZmluZSBVQVJUX0VYVElOUF9JUlNUQVQoeCkJCSgxIDw8ICh4ICsgNCkpCi0jZGVmaW5lIFVBUlRfRVhUSU5QX0lSTUFTSyh4KQkJKDEgPDwgKHggKyA4KSkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfSVJfUkkJCTAKLSNkZWZpbmUgVUFSVF9FWFRJTlBfSVJfQ1RTCQkxCi0jZGVmaW5lIFVBUlRfRVhUSU5QX0lSX0RDRAkJMgotI2RlZmluZSBVQVJUX0VYVElOUF9JUl9EU1IJCTMKLSNkZWZpbmUgVUFSVF9FWFRJTlBfUklfTk9TRU5TRV9TSElGVAkxNgotI2RlZmluZSBVQVJUX0VYVElOUF9SSV9OT1NFTlNFX01BU0sJKDEgPDwgVUFSVF9FWFRJTlBfUklfTk9TRU5TRV9TSElGVCkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfQ1RTX05PU0VOU0VfU0hJRlQJMTcKLSNkZWZpbmUgVUFSVF9FWFRJTlBfQ1RTX05PU0VOU0VfTUFTSwkoMSA8PCBVQVJUX0VYVElOUF9DVFNfTk9TRU5TRV9TSElGVCkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfRENEX05PU0VOU0VfU0hJRlQJMTgKLSNkZWZpbmUgVUFSVF9FWFRJTlBfRENEX05PU0VOU0VfTUFTSwkoMSA8PCBVQVJUX0VYVElOUF9EQ0RfTk9TRU5TRV9TSElGVCkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfRFNSX05PU0VOU0VfU0hJRlQJMTkKLSNkZWZpbmUgVUFSVF9FWFRJTlBfRFNSX05PU0VOU0VfTUFTSwkoMSA8PCBVQVJUX0VYVElOUF9EU1JfTk9TRU5TRV9TSElGVCkKLQotLyogVUFSVCBJbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9JUl9SRUcJCQkweDEwCi0jZGVmaW5lIFVBUlRfSVJfTUFTSyh4KQkJCSgxIDw8ICh4ICsgMTYpKQotI2RlZmluZSBVQVJUX0lSX1NUQVQoeCkJCQkoMSA8PCAoeCkpCi0jZGVmaW5lIFVBUlRfSVJfRVhUSVAJCQkwCi0jZGVmaW5lIFVBUlRfSVJfVFhVTkRFUgkJCTEKLSNkZWZpbmUgVUFSVF9JUl9UWE9WRVIJCQkyCi0jZGVmaW5lIFVBUlRfSVJfVFhUUkVTSAkJCTMKLSNkZWZpbmUgVUFSVF9JUl9UWFJETEFUQ0gJCTQKLSNkZWZpbmUgVUFSVF9JUl9UWEVNUFRZCQkJNQotI2RlZmluZSBVQVJUX0lSX1JYVU5ERVIJCQk2Ci0jZGVmaW5lIFVBUlRfSVJfUlhPVkVSCQkJNwotI2RlZmluZSBVQVJUX0lSX1JYVElNRU9VVAkJOAotI2RlZmluZSBVQVJUX0lSX1JYRlVMTAkJCTkKLSNkZWZpbmUgVUFSVF9JUl9SWFRIUkVTSAkJMTAKLSNkZWZpbmUgVUFSVF9JUl9SWE5PVEVNUFRZCQkxMQotI2RlZmluZSBVQVJUX0lSX1JYRlJBTUVFUlIJCTEyCi0jZGVmaW5lIFVBUlRfSVJfUlhQQVJFUlIJCTEzCi0jZGVmaW5lIFVBUlRfSVJfUlhCUksJCQkxNAotI2RlZmluZSBVQVJUX0lSX1RYRE9ORQkJCTE1Ci0KLS8qIFVBUlQgRmlmbyByZWdpc3RlciAqLwotI2RlZmluZSBVQVJUX0ZJRk9fUkVHCQkJMHgxNAotI2RlZmluZSBVQVJUX0ZJRk9fVkFMSURfU0hJRlQJCTAKLSNkZWZpbmUgVUFSVF9GSUZPX1ZBTElEX01BU0sJCTB4ZmYKLSNkZWZpbmUgVUFSVF9GSUZPX0ZSQU1FRVJSX1NISUZUCTgKLSNkZWZpbmUgVUFSVF9GSUZPX0ZSQU1FRVJSX01BU0sJCSgxIDw8IFVBUlRfRklGT19GUkFNRUVSUl9TSElGVCkKLSNkZWZpbmUgVUFSVF9GSUZPX1BBUkVSUl9TSElGVAkJOQotI2RlZmluZSBVQVJUX0ZJRk9fUEFSRVJSX01BU0sJCSgxIDw8IFVBUlRfRklGT19QQVJFUlJfU0hJRlQpCi0jZGVmaW5lIFVBUlRfRklGT19CUktERVRfU0hJRlQJCTEwCi0jZGVmaW5lIFVBUlRfRklGT19CUktERVRfTUFTSwkJKDEgPDwgVUFSVF9GSUZPX0JSS0RFVF9TSElGVCkKLSNkZWZpbmUgVUFSVF9GSUZPX0FOWUVSUl9NQVNLCQkoVUFSVF9GSUZPX0ZSQU1FRVJSX01BU0sgfAlcCi0JCQkJCVVBUlRfRklGT19QQVJFUlJfTUFTSyB8CQlcCi0JCQkJCVVBUlRfRklGT19CUktERVRfTUFTSykKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogX1JFRyByZWxhdGl2ZSB0byBSU0VUX0dQSU8KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZG1hLWNvaGVyZW5jZS5oCmluZGV4IGE5ZThmNmIuLjc2MjljMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZG1hLWNvaGVyZW5jZS5oCkBAIC00OSwxMSArNDksNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwbGF0X2RldmljZV9pc19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX0RNQV9DT0hFUkVOVAotCXJldHVybiAxOwotI2Vsc2UKIAlyZXR1cm4gY29oZXJlbnRpbzsKLSNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZmxvcHB5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2Zsb3BweS5oCmluZGV4IDViNWNkNjguLmUyNTYxZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9mbG9wcHkuaApAQCAtOSw3ICs5LDYgQEAKICNkZWZpbmUgX19BU01fTUFDSF9HRU5FUklDX0ZMT1BQWV9ICiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvaWRlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2lkZS5oCmluZGV4IGFmZmE2NmYuLjRhZTVmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvaWRlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9pZGUuaApAQCAtMjMsNyArMjMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2ZsdXNoX3Byb2xvZ3VlKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcyB8fCAhY3B1X2hhc19pY19maWxsc19mX2RjKQogCQlwcmVlbXB0X2Rpc2FibGUoKTsKICNlbmRpZgogfQpAQCAtMzEsMTQgKzMxLDE0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfZmx1c2hfZXBpbG9ndWUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzIHx8ICFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpCiAJCXByZWVtcHRfZW5hYmxlKCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlpZiAoY3B1X2hhc19kY19hbGlhc2VzKSB7CisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcyB8fCAhY3B1X2hhc19pY19maWxsc19mX2RjKSB7CiAJCXVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIHNpemU7CiAKIAkJd2hpbGUgKGFkZHIgPCBlbmQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZmxvcHB5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qYXp6L2Zsb3BweS5oCmluZGV4IDYyYWExZTIuLjRiODZjODggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZmxvcHB5LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtamF6ei9mbG9wcHkuaApAQCAtOSw3ICs5LDYgQEAKICNkZWZpbmUgX19BU01fTUFDSF9KQVpaX0ZMT1BQWV9ICiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvcGxhdGZvcm0uaAppbmRleCAwNTk4OGMyLi4wNjliNDNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvcGxhdGZvcm0uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvcGxhdGZvcm0uaApAQCAtMjEsNiArMjEsNyBAQAogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdXNiX29oY2lfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX3VkY19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdWRjX3hjZWl2X2RldmljZTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGp6NDc0MF9tbWNfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX3J0Y19kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfaTJjX2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW5ldGxvZ2ljL2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvaXJxLmgKaW5kZXggODY4ZWQ4YS4uYzBkYmQ1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvaXJxLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvaXJxLmgKQEAgLTksNyArOSw4IEBACiAjZGVmaW5lIF9fQVNNX05FVExPR0lDX0lSUV9ICiAKICNpbmNsdWRlIDxhc20vbWFjaC1uZXRsb2dpYy9tdWx0aS1ub2RlLmg+Ci0jZGVmaW5lIE5SX0lSUVMJCQkoNjQgKiBOTE1fTlJfTk9ERVMpCisjZGVmaW5lIE5MTV9JUlFTX1BFUl9OT0RFCTEwMjQKKyNkZWZpbmUgTlJfSVJRUwkJCShOTE1fSVJRU19QRVJfTk9ERSAqIE5MTV9OUl9OT0RFUykKIAogI2RlZmluZSBNSVBTX0NQVV9JUlFfQkFTRQkwCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW5ldGxvZ2ljL211bHRpLW5vZGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW5ldGxvZ2ljL211bHRpLW5vZGUuaAppbmRleCBkNjJmYzc3Li45ZWQ4ZGFjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy9tdWx0aS1ub2RlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvbXVsdGktbm9kZS5oCkBAIC00Nyw4ICs0NywzNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBOTE1fQ09SRVNfUEVSX05PREUJOAogI2RlZmluZSBOTE1fVEhSRUFEU19QRVJfQ09SRQk0Ci0jZGVmaW5lIE5MTV9DUFVTX1BFUl9OT0RFCShOTE1fQ09SRVNfUEVSX05PREUgKiBOTE1fVEhSRUFEU19QRVJfQ09SRSkKKyNpZmRlZiBDT05GSUdfQ1BVX1hMUgorI2RlZmluZSBubG1fY29yZXNfcGVyX25vZGUoKQk4CisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGludCB4bHBfY29yZXNfcGVyX25vZGU7CisjZGVmaW5lIG5sbV9jb3Jlc19wZXJfbm9kZSgpCXhscF9jb3Jlc19wZXJfbm9kZQorI2VuZGlmCisKKyNkZWZpbmUgbmxtX3RocmVhZHNfcGVyX25vZGUoKQkobmxtX2NvcmVzX3Blcl9ub2RlKCkgKiBOTE1fVEhSRUFEU19QRVJfQ09SRSkKKyNkZWZpbmUgbmxtX2NwdWlkX3RvX25vZGUoYykJKChjKSAvIG5sbV90aHJlYWRzX3Blcl9ub2RlKCkpCisKK3N0cnVjdCBubG1fc29jX2luZm8geworCXVuc2lnbmVkIGxvbmcJY29yZW1hc2s7CS8qIGNvcmVzIGVuYWJsZWQgb24gdGhlIHNvYyAqLworCXVuc2lnbmVkIGxvbmcJZWJhc2U7CQkvKiBub3QgdXNlZCBub3cgKi8KKwl1aW50NjRfdAlpcnFtYXNrOwkvKiBFSU1SIGZvciB0aGUgbm9kZSAqLworCXVpbnQ2NF90CXN5c2Jhc2U7CS8qIG9ubHkgZm9yIFhMUCAtIHN5cyBibG9jayBiYXNlICovCisJdWludDY0X3QJcGljYmFzZTsJLyogUElDIGJsb2NrIGJhc2UgKi8KKwlzcGlubG9ja190CXBpY2xvY2s7CS8qIGxvY2sgZm9yIFBJQyBhY2Nlc3MgKi8KKwljcHVtYXNrX3QJY3B1bWFzazsJLyogbG9naWNhbCBjcHUgbWFzayBmb3Igbm9kZSAqLworCXVuc2lnbmVkIGludAlzb2NidXM7Cit9OworCitleHRlcm4gc3RydWN0IG5sbV9zb2NfaW5mbyBubG1fbm9kZXNbTkxNX05SX05PREVTXTsKKyNkZWZpbmUgbmxtX2dldF9ub2RlKGkpCQkoJm5sbV9ub2Rlc1tpXSkKKyNkZWZpbmUgbmxtX25vZGVfcHJlc2VudChuKQkoKG4pID49IDAgJiYgKG4pIDwgTkxNX05SX05PREVTICYmIFwKKwkJCQkJbmxtX2dldF9ub2RlKG4pLT5jb3JlbWFzayAhPSAwKQorI2lmZGVmIENPTkZJR19DUFVfWExSCisjZGVmaW5lIG5sbV9jdXJyZW50X25vZGUoKQkoJm5sbV9ub2Rlc1swXSkKKyNlbHNlCisjZGVmaW5lIG5sbV9jdXJyZW50X25vZGUoKQkoJm5sbV9ub2Rlc1tubG1fbm9kZWlkKCldKQorI2VuZGlmCit2b2lkIG5sbV9ub2RlX2luaXQoaW50IG5vZGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW5ldGxvZ2ljL3RvcG9sb2d5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy90b3BvbG9neS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTk5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy90b3BvbG9neS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqLworI2lmbmRlZiBfQVNNX01BQ0hfTkVUTE9HSUNfVE9QT0xPR1lfSAorI2RlZmluZSBfQVNNX01BQ0hfTkVUTE9HSUNfVE9QT0xPR1lfSAorCisjaW5jbHVkZSA8YXNtL21hY2gtbmV0bG9naWMvbXVsdGktbm9kZS5oPgorCisjZGVmaW5lIHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KQljcHVfdG9fbm9kZShjcHUpCisjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkoY3B1X2xvZ2ljYWxfbWFwKGNwdSkgLyBOTE1fVEhSRUFEU19QRVJfQ09SRSkKKyNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KQkJKCZjcHVfc2libGluZ19tYXBbY3B1XSkKKyNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGNwdSkpCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgorCisjZW5kaWYgLyogX0FTTV9NQUNIX05FVExPR0lDX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9waWl4NC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3BpaXg0LmgKaW5kZXggZTMzMjI3OS4uODM2ZTJlZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3BpaXg0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3BpaXg0LmgKQEAgLTI2LDYgKzI2LDEwIEBACiAjZGVmaW5lICAgUElJWDRfRlVOQzBfUElSUVJDX0lSUV9ST1VUSU5HX0RJU0FCTEUJKDEgPDwgNykKICNkZWZpbmUgICBQSUlYNF9GVU5DMF9QSVJRUkNfSVJRX1JPVVRJTkdfTUFTSwkJMHhmCiAjZGVmaW5lICAgUElJWDRfRlVOQzBfUElSUVJDX0lSUV9ST1VUSU5HX01BWAkJMTYKKy8qIFNFUklSUSBDb250cm9sICovCisjZGVmaW5lIFBJSVg0X0ZVTkMwX1NFUklSUUMJCQkweDY0CisjZGVmaW5lICAgUElJWDRfRlVOQzBfU0VSSVJRQ19FTgkJCSgxIDw8IDcpCisjZGVmaW5lICAgUElJWDRfRlVOQzBfU0VSSVJRQ19DT05UCQkJKDEgPDwgNikKIC8qIFRvcCBPZiBNZW1vcnkgKi8KICNkZWZpbmUgUElJWDRfRlVOQzBfVE9NCQkJCTB4NjkKICNkZWZpbmUgICBQSUlYNF9GVU5DMF9UT01fVE9QX09GX01FTU9SWV9NQVNLCQkweGYwCkBAIC0zNCw2ICszOCw5IEBACiAjZGVmaW5lICAgUElJWDRfRlVOQzBfRExDX1VTQlBSX0VOCQkJKDEgPDwgMikKICNkZWZpbmUgICBQSUlYNF9GVU5DMF9ETENfUEFTU0lWRV9SRUxFQVNFX0VOCQkoMSA8PCAxKQogI2RlZmluZSAgIFBJSVg0X0ZVTkMwX0RMQ19ERUxBWUVEX1RSQU5TQUNUSU9OX0VOCSgxIDw8IDApCisvKiBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUElJWDRfRlVOQzBfR0VOQ0ZHCQkJMHhiMAorI2RlZmluZSAgIFBJSVg0X0ZVTkMwX0dFTkNGR19TRVJJUlEJCQkoMSA8PCAxNikKIAogLyogSURFIFRpbWluZyAqLwogI2RlZmluZSBQSUlYNF9GVU5DMV9JREVUSU1fUFJJTUFSWV9MTwkJMHg0MApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAppbmRleCBlMDMzMTQxLi5iYmMzZGQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBfQVNNX01JUFNSRUdTX0gKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXphcmRzLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogCkBAIC01NzMsNyArNTc0LDkgQEAKICNkZWZpbmUgTUlQU19DT05GMV9JQQkJKF9VTENBU1RfKDcpIDw8IDE2KQogI2RlZmluZSBNSVBTX0NPTkYxX0lMCQkoX1VMQ0FTVF8oNykgPDwgMTkpCiAjZGVmaW5lIE1JUFNfQ09ORjFfSVMJCShfVUxDQVNUXyg3KSA8PCAyMikKLSNkZWZpbmUgTUlQU19DT05GMV9UTEJTCQkoX1VMQ0FTVF8oNjMpPDwgMjUpCisjZGVmaW5lIE1JUFNfQ09ORjFfVExCU19TSElGVCAgICgyNSkKKyNkZWZpbmUgTUlQU19DT05GMV9UTEJTX1NJWkUgICAgKDYpCisjZGVmaW5lIE1JUFNfQ09ORjFfVExCUyAgICAgICAgIChfVUxDQVNUXyg2MykgPDwgTUlQU19DT05GMV9UTEJTX1NISUZUKQogCiAjZGVmaW5lIE1JUFNfQ09ORjJfU0EJCShfVUxDQVNUXygxNSk8PAkgMCkKICNkZWZpbmUgTUlQU19DT05GMl9TTAkJKF9VTENBU1RfKDE1KTw8CSA0KQpAQCAtNTg3LDIxICs1OTAsNTMgQEAKICNkZWZpbmUgTUlQU19DT05GM19UTAkJKF9VTENBU1RfKDEpIDw8CSAwKQogI2RlZmluZSBNSVBTX0NPTkYzX1NNCQkoX1VMQ0FTVF8oMSkgPDwJIDEpCiAjZGVmaW5lIE1JUFNfQ09ORjNfTVQJCShfVUxDQVNUXygxKSA8PAkgMikKKyNkZWZpbmUgTUlQU19DT05GM19DRE1NCQkoX1VMQ0FTVF8oMSkgPDwJIDMpCiAjZGVmaW5lIE1JUFNfQ09ORjNfU1AJCShfVUxDQVNUXygxKSA8PAkgNCkKICNkZWZpbmUgTUlQU19DT05GM19WSU5UCQkoX1VMQ0FTVF8oMSkgPDwJIDUpCiAjZGVmaW5lIE1JUFNfQ09ORjNfVkVJQwkJKF9VTENBU1RfKDEpIDw8CSA2KQogI2RlZmluZSBNSVBTX0NPTkYzX0xQQQkJKF9VTENBU1RfKDEpIDw8CSA3KQorI2RlZmluZSBNSVBTX0NPTkYzX0lUTAkJKF9VTENBU1RfKDEpIDw8CSA4KQorI2RlZmluZSBNSVBTX0NPTkYzX0NUWFRDCShfVUxDQVNUXygxKSA8PAkgOSkKICNkZWZpbmUgTUlQU19DT05GM19EU1AJCShfVUxDQVNUXygxKSA8PCAxMCkKICNkZWZpbmUgTUlQU19DT05GM19EU1AyUAkoX1VMQ0FTVF8oMSkgPDwgMTEpCiAjZGVmaW5lIE1JUFNfQ09ORjNfUlhJCQkoX1VMQ0FTVF8oMSkgPDwgMTIpCiAjZGVmaW5lIE1JUFNfQ09ORjNfVUxSSQkJKF9VTENBU1RfKDEpIDw8IDEzKQogI2RlZmluZSBNSVBTX0NPTkYzX0lTQQkJKF9VTENBU1RfKDMpIDw8IDE0KQogI2RlZmluZSBNSVBTX0NPTkYzX0lTQV9PRQkoX1VMQ0FTVF8oMSkgPDwgMTYpCisjZGVmaW5lIE1JUFNfQ09ORjNfTUNVCQkoX1VMQ0FTVF8oMSkgPDwgMTcpCisjZGVmaW5lIE1JUFNfQ09ORjNfTU1BUgkJKF9VTENBU1RfKDcpIDw8IDE4KQorI2RlZmluZSBNSVBTX0NPTkYzX0lQTFcJCShfVUxDQVNUXygzKSA8PCAyMSkKICNkZWZpbmUgTUlQU19DT05GM19WWgkJKF9VTENBU1RfKDEpIDw8IDIzKQorI2RlZmluZSBNSVBTX0NPTkYzX1BXCQkoX1VMQ0FTVF8oMSkgPDwgMjQpCisjZGVmaW5lIE1JUFNfQ09ORjNfU0MJCShfVUxDQVNUXygxKSA8PCAyNSkKKyNkZWZpbmUgTUlQU19DT05GM19CSQkJKF9VTENBU1RfKDEpIDw8IDI2KQorI2RlZmluZSBNSVBTX0NPTkYzX0JQCQkoX1VMQ0FTVF8oMSkgPDwgMjcpCisjZGVmaW5lIE1JUFNfQ09ORjNfTVNBCQkoX1VMQ0FTVF8oMSkgPDwgMjgpCisjZGVmaW5lIE1JUFNfQ09ORjNfQ01HQ1IJKF9VTENBU1RfKDEpIDw8IDI5KQorI2RlZmluZSBNSVBTX0NPTkYzX0JQRwkJKF9VTENBU1RfKDEpIDw8IDMwKQogCisjZGVmaW5lIE1JUFNfQ09ORjRfTU1VU0laRUVYVF9TSElGVAkoMCkKICNkZWZpbmUgTUlQU19DT05GNF9NTVVTSVpFRVhUCShfVUxDQVNUXygyNTUpIDw8IDApCisjZGVmaW5lIE1JUFNfQ09ORjRfRlRMQlNFVFNfU0hJRlQJKDApCisjZGVmaW5lIE1JUFNfQ09ORjRfRlRMQlNFVFNfU0hJRlQJKDApCisjZGVmaW5lIE1JUFNfQ09ORjRfRlRMQlNFVFMJKF9VTENBU1RfKDE1KSA8PCBNSVBTX0NPTkY0X0ZUTEJTRVRTX1NISUZUKQorI2RlZmluZSBNSVBTX0NPTkY0X0ZUTEJXQVlTX1NISUZUCSg0KQorI2RlZmluZSBNSVBTX0NPTkY0X0ZUTEJXQVlTCShfVUxDQVNUXygxNSkgPDwgTUlQU19DT05GNF9GVExCV0FZU19TSElGVCkKKyNkZWZpbmUgTUlQU19DT05GNF9GVExCUEFHRVNJWkVfU0hJRlQJKDgpCisvKiBiaXRzIDEwOjggaW4gRlRMQi1vbmx5IGNvbmZpZ3VyYXRpb25zICovCisjZGVmaW5lIE1JUFNfQ09ORjRfRlRMQlBBR0VTSVpFIChfVUxDQVNUXyg3KSA8PCBNSVBTX0NPTkY0X0ZUTEJQQUdFU0laRV9TSElGVCkKKy8qIGJpdHMgMTI6OCBpbiBWVExCLUZUTEIgb25seSBjb25maWd1cmF0aW9ucyAqLworI2RlZmluZSBNSVBTX0NPTkY0X1ZGVExCUEFHRVNJWkUgKF9VTENBU1RfKDMxKSA8PCBNSVBTX0NPTkY0X0ZUTEJQQUdFU0laRV9TSElGVCkKICNkZWZpbmUgTUlQU19DT05GNF9NTVVFWFRERUYJKF9VTENBU1RfKDMpIDw8IDE0KQogI2RlZmluZSBNSVBTX0NPTkY0X01NVUVYVERFRl9NTVVTSVpFRVhUIChfVUxDQVNUXygxKSA8PCAxNCkKKyNkZWZpbmUgTUlQU19DT05GNF9NTVVFWFRERUZfRlRMQlNJWkVFWFQJKF9VTENBU1RfKDIpIDw8IDE0KQorI2RlZmluZSBNSVBTX0NPTkY0X01NVUVYVERFRl9WVExCU0laRUVYVAkoX1VMQ0FTVF8oMykgPDwgMTQpCisjZGVmaW5lIE1JUFNfQ09ORjRfS1NDUkVYSVNUCShfVUxDQVNUXygyNTUpIDw8IDE2KQorI2RlZmluZSBNSVBTX0NPTkY0X1ZUTEJTSVpFRVhUX1NISUZUCSgyNCkKKyNkZWZpbmUgTUlQU19DT05GNF9WVExCU0laRUVYVAkoX1VMQ0FTVF8oMTUpIDw8IE1JUFNfQ09ORjRfVlRMQlNJWkVFWFRfU0hJRlQpCisjZGVmaW5lIE1JUFNfQ09ORjRfQUUJCShfVUxDQVNUXygxKSA8PCAyOCkKKyNkZWZpbmUgTUlQU19DT05GNF9JRQkJKF9VTENBU1RfKDMpIDw8IDI5KQorI2RlZmluZSBNSVBTX0NPTkY0X1RMQklOVgkoX1VMQ0FTVF8oMikgPDwgMjkpCiAKICNkZWZpbmUgTUlQU19DT05GNV9ORgkJKF9VTENBU1RfKDEpIDw8IDApCiAjZGVmaW5lIE1JUFNfQ09ORjVfVUZSCQkoX1VMQ0FTVF8oMSkgPDwgMikKQEAgLTYxMSwxMSArNjQ2LDE1IEBACiAjZGVmaW5lIE1JUFNfQ09ORjVfSwkJKF9VTENBU1RfKDEpIDw8IDMwKQogCiAjZGVmaW5lIE1JUFNfQ09ORjZfU1lORAkJKF9VTENBU1RfKDEpIDw8IDEzKQorLyogcHJvQXB0aXYgRlRMQiBvbi9vZmYgYml0ICovCisjZGVmaW5lIE1JUFNfQ09ORjZfRlRMQkVOCShfVUxDQVNUXygxKSA8PCAxNSkKIAogI2RlZmluZSBNSVBTX0NPTkY3X1dJSQkJKF9VTENBU1RfKDEpIDw8IDMxKQogCiAjZGVmaW5lIE1JUFNfQ09ORjdfUlBTCQkoX1VMQ0FTVF8oMSkgPDwgMikKIAorLyogIEVudHJ5SEkgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTUlQU19FTlRSWUhJX0VISU5WCShfVUxDQVNUXygxKSA8PCAxMCkKIAogLyoKICAqIEJpdHMgaW4gdGhlIE1JUFMzMi82NCBjb3Byb2Nlc3NvciAxIChGUFUpIHJldmlzaW9uIHJlZ2lzdGVyLgpAQCAtNjI4LDYgKzY2NywyNiBAQAogI2RlZmluZSBNSVBTX0ZQSVJfTAkJKF9VTENBU1RfKDEpIDw8IDIxKQogI2RlZmluZSBNSVBTX0ZQSVJfRjY0CQkoX1VMQ0FTVF8oMSkgPDwgMjIpCiAKKy8qCisgKiBCaXRzIGluIHRoZSBNSVBTMzIgTWVtb3J5IFNlZ21lbnRhdGlvbiByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgTUlQU19TRUdDRkdfUEFfU0hJRlQJOQorI2RlZmluZSBNSVBTX1NFR0NGR19QQQkJKF9VTENBU1RfKDEyNykgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpCisjZGVmaW5lIE1JUFNfU0VHQ0ZHX0FNX1NISUZUCTQKKyNkZWZpbmUgTUlQU19TRUdDRkdfQU0JCShfVUxDQVNUXyg3KSA8PCBNSVBTX1NFR0NGR19BTV9TSElGVCkKKyNkZWZpbmUgTUlQU19TRUdDRkdfRVVfU0hJRlQJMworI2RlZmluZSBNSVBTX1NFR0NGR19FVQkJKF9VTENBU1RfKDEpIDw8IE1JUFNfU0VHQ0ZHX0VVX1NISUZUKQorI2RlZmluZSBNSVBTX1NFR0NGR19DX1NISUZUCTAKKyNkZWZpbmUgTUlQU19TRUdDRkdfQwkJKF9VTENBU1RfKDcpIDw8IE1JUFNfU0VHQ0ZHX0NfU0hJRlQpCisKKyNkZWZpbmUgTUlQU19TRUdDRkdfVVVTSwlfVUxDQVNUXyg3KQorI2RlZmluZSBNSVBTX1NFR0NGR19VU0sJCV9VTENBU1RfKDUpCisjZGVmaW5lIE1JUFNfU0VHQ0ZHX01VU1VLCV9VTENBU1RfKDQpCisjZGVmaW5lIE1JUFNfU0VHQ0ZHX01VU0sJX1VMQ0FTVF8oMykKKyNkZWZpbmUgTUlQU19TRUdDRkdfTVNLCQlfVUxDQVNUXygyKQorI2RlZmluZSBNSVBTX1NFR0NGR19NSwkJX1VMQ0FTVF8oMSkKKyNkZWZpbmUgTUlQU19TRUdDRkdfVUsJCV9VTENBU1RfKDApCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qCkBAIC02NDksNiArNzA4LDE5IEBACiB9CiAKIC8qCisgKiBUTEIgSW52YWxpZGF0ZSBGbHVzaAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiaW52Zih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoXG5cdCIKKwkJIi5zZXQgbm9yZW9yZGVyXG5cdCIKKwkJIi53b3JkIDB4NDIwMDAwMDRcblx0IiAvKiB0bGJpbnZmICovCisJCSIuc2V0IHBvcCIpOworfQorCisKKy8qCiAgKiBGdW5jdGlvbnMgdG8gYWNjZXNzIHRoZSBSMTAwMDAgcGVyZm9ybWFuY2UgY291bnRlcnMuCSBUaGVzZSBhcmUgYmFzaWNhbGx5CiAgKiBtZmMwIGFuZCBtdGMwIGluc3RydWN0aW9ucyBmcm9tIGFuZCB0byBjb3Byb2Nlc3NvciByZWdpc3RlciB3aXRoIGEgNS1iaXQKICAqIHBlcmZvcm1hbmNlIGNvdW50ZXIgbnVtYmVyIGVuY29kZWQgaW50byBiaXRzIDEgLi4uIDUgb2YgdGhlIGluc3RydWN0aW9uLgpAQCAtMTEwMiw2ICsxMTc0LDE1IEBACiAjZGVmaW5lIHJlYWRfYzBfZWJhc2UoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMSkKICNkZWZpbmUgd3JpdGVfYzBfZWJhc2UodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMSwgdmFsKQogCisvKiBNSVBTUjMgKi8KKyNkZWZpbmUgcmVhZF9jMF9zZWdjdGwwKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ1LCAyKQorI2RlZmluZSB3cml0ZV9jMF9zZWdjdGwwKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkNSwgMiwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfc2VnY3RsMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkNSwgMykKKyNkZWZpbmUgd3JpdGVfYzBfc2VnY3RsMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDUsIDMsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX3NlZ2N0bDIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDUsIDQpCisjZGVmaW5lIHdyaXRlX2MwX3NlZ2N0bDIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ1LCA0LCB2YWwpCiAKIC8qIENhdml1bSBPQ1RFT04gKGNuTUlQUykgKi8KICNkZWZpbmUgcmVhZF9jMF9jdm1jb3VudCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkOSwgNikKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy9jb21tb24uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy9jb21tb24uaAppbmRleCBiYjY4YzMzLi5jMjgxZjAzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvY29tbW9uLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL2NvbW1vbi5oCkBAIC04NCw3ICs4NCw2IEBACiAgKi8KIHZvaWQgbmxtX2luaXRfYm9vdF9jcHUodm9pZCk7CiB1bnNpZ25lZCBpbnQgbmxtX2dldF9jcHVfZnJlcXVlbmN5KHZvaWQpOwotdm9pZCBubG1fbm9kZV9pbml0KGludCBub2RlKTsKIGV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIG5sbV9zbXBfb3BzOwogZXh0ZXJuIGNoYXIgbmxtX3Jlc2V0X2VudHJ5W10sIG5sbV9yZXNldF9lbnRyeV9lbmRbXTsKIApAQCAtOTQsMjYgKzkzLDE2IEBACiBleHRlcm4gdW5zaWduZWQgaW50IG5sbV90aHJlYWRzX3Blcl9jb3JlOwogZXh0ZXJuIGNwdW1hc2tfdCBubG1fY3B1bWFzazsKIAotc3RydWN0IG5sbV9zb2NfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBjb3JlbWFzazsgLyogY29yZXMgZW5hYmxlZCBvbiB0aGUgc29jICovCi0JdW5zaWduZWQgbG9uZyBlYmFzZTsKLQl1aW50NjRfdCBpcnFtYXNrOwotCXVpbnQ2NF90IHN5c2Jhc2U7CS8qIG9ubHkgZm9yIFhMUCAqLwotCXVpbnQ2NF90IHBpY2Jhc2U7Ci0Jc3BpbmxvY2tfdCBwaWNsb2NrOwotfTsKLQotI2RlZmluZSBubG1fZ2V0X25vZGUoaSkJCSgmbmxtX25vZGVzW2ldKQotI2lmZGVmIENPTkZJR19DUFVfWExSCi0jZGVmaW5lIG5sbV9jdXJyZW50X25vZGUoKQkoJm5sbV9ub2Rlc1swXSkKLSNlbHNlCi0jZGVmaW5lIG5sbV9jdXJyZW50X25vZGUoKQkoJm5sbV9ub2Rlc1tubG1fbm9kZWlkKCldKQotI2VuZGlmCi0KIHN0cnVjdCBpcnFfZGF0YTsKIHVpbnQ2NF90IG5sbV9wY2lfaXJxbWFzayhpbnQgbm9kZSk7Cit2b2lkIG5sbV9zZXR1cF9waWNfaXJxKGludCBub2RlLCBpbnQgcGljaXJxLCBpbnQgaXJxLCBpbnQgaXJ0KTsKIHZvaWQgbmxtX3NldF9waWNfZXh0cmFfYWNrKGludCBub2RlLCBpbnQgaXJxLCAgdm9pZCAoKnhhY2spKHN0cnVjdCBpcnFfZGF0YSAqKSk7CiAKKyNpZmRlZiBDT05GSUdfUENJX01TSQordm9pZCBubG1fZGlzcGF0Y2hfbXNpKGludCBub2RlLCBpbnQgbGlycSk7Cit2b2lkIG5sbV9kaXNwYXRjaF9tc2l4KGludCBub2RlLCBpbnQgbXNpeGlycSk7CisjZW5kaWYKKwogLyoKICAqIFRoZSBOUl9JUlFzIGlzIGRpdmlkZWQgYmV0d2VlbiBub2RlcywgZWFjaCBvZiB0aGVtIGhhcyBhIHNlcGFyYXRlIGlycSBzcGFjZQogICovCkBAIC0xMjIsNyArMTExLDYgQEAKIAlyZXR1cm4gbm9kZSAqIE5SX0lSUVMgLyBOTE1fTlJfTk9ERVMgKyBpcnE7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgbmxtX3NvY19pbmZvIG5sbV9ub2Rlc1tOTE1fTlJfTk9ERVNdOwogZXh0ZXJuIGludCBubG1fY3B1X3JlYWR5W107CiAjZW5kaWYKICNlbmRpZiAvKiBfTkVUTE9HSUNfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvbWlwcy1leHRucy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL21pcHMtZXh0bnMuaAppbmRleCBmMjk5ZDMxLi5kZTlhYWRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvbWlwcy1leHRucy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy9taXBzLWV4dG5zLmgKQEAgLTE0Niw3ICsxNDYsMTIgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbmxtX25vZGVpZCh2b2lkKQogewotCXJldHVybiAoX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMSkgPj4gNSkgJiAweDM7CisJdWludDMyX3QgcHJpZCA9IHJlYWRfYzBfcHJpZCgpOworCisJaWYgKChwcmlkICYgMHhmZjAwKSA9PSBQUklEX0lNUF9ORVRMT0dJQ19YTFA5WFgpCisJCXJldHVybiAoX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMSkgPj4gNykgJiAweDc7CisJZWxzZQorCQlyZXR1cm4gKF9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDEpID4+IDUpICYgMHgzOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBubG1fY29yZV9pZCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwvYnJpZGdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9icmlkZ2UuaAppbmRleCA0ZThlYWNiLi4zMDY3Zjk4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9icmlkZ2UuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9icmlkZ2UuaApAQCAtNjksNDQgKzY5LDkgQEAKICNkZWZpbmUgQlJJREdFX0ZMQVNIX0xJTUlUMwkJMHgxMwogCiAjZGVmaW5lIEJSSURHRV9EUkFNX0JBUihpKQkJKDB4MTQgKyAoaSkpCi0jZGVmaW5lIEJSSURHRV9EUkFNX0JBUjAJCTB4MTQKLSNkZWZpbmUgQlJJREdFX0RSQU1fQkFSMQkJMHgxNQotI2RlZmluZSBCUklER0VfRFJBTV9CQVIyCQkweDE2Ci0jZGVmaW5lIEJSSURHRV9EUkFNX0JBUjMJCTB4MTcKLSNkZWZpbmUgQlJJREdFX0RSQU1fQkFSNAkJMHgxOAotI2RlZmluZSBCUklER0VfRFJBTV9CQVI1CQkweDE5Ci0jZGVmaW5lIEJSSURHRV9EUkFNX0JBUjYJCTB4MWEKLSNkZWZpbmUgQlJJREdFX0RSQU1fQkFSNwkJMHgxYgotCiAjZGVmaW5lIEJSSURHRV9EUkFNX0xJTUlUKGkpCQkoMHgxYyArIChpKSkKLSNkZWZpbmUgQlJJREdFX0RSQU1fTElNSVQwCQkweDFjCi0jZGVmaW5lIEJSSURHRV9EUkFNX0xJTUlUMQkJMHgxZAotI2RlZmluZSBCUklER0VfRFJBTV9MSU1JVDIJCTB4MWUKLSNkZWZpbmUgQlJJREdFX0RSQU1fTElNSVQzCQkweDFmCi0jZGVmaW5lIEJSSURHRV9EUkFNX0xJTUlUNAkJMHgyMAotI2RlZmluZSBCUklER0VfRFJBTV9MSU1JVDUJCTB4MjEKLSNkZWZpbmUgQlJJREdFX0RSQU1fTElNSVQ2CQkweDIyCi0jZGVmaW5lIEJSSURHRV9EUkFNX0xJTUlUNwkJMHgyMwotCiAjZGVmaW5lIEJSSURHRV9EUkFNX05PREVfVFJBTlNMTihpKQkoMHgyNCArIChpKSkKLSNkZWZpbmUgQlJJREdFX0RSQU1fTk9ERV9UUkFOU0xOMAkweDI0Ci0jZGVmaW5lIEJSSURHRV9EUkFNX05PREVfVFJBTlNMTjEJMHgyNQotI2RlZmluZSBCUklER0VfRFJBTV9OT0RFX1RSQU5TTE4yCTB4MjYKLSNkZWZpbmUgQlJJREdFX0RSQU1fTk9ERV9UUkFOU0xOMwkweDI3Ci0jZGVmaW5lIEJSSURHRV9EUkFNX05PREVfVFJBTlNMTjQJMHgyOAotI2RlZmluZSBCUklER0VfRFJBTV9OT0RFX1RSQU5TTE41CTB4MjkKLSNkZWZpbmUgQlJJREdFX0RSQU1fTk9ERV9UUkFOU0xONgkweDJhCi0jZGVmaW5lIEJSSURHRV9EUkFNX05PREVfVFJBTlNMTjcJMHgyYgotCiAjZGVmaW5lIEJSSURHRV9EUkFNX0NITkxfVFJBTlNMTihpKQkoMHgyYyArIChpKSkKLSNkZWZpbmUgQlJJREdFX0RSQU1fQ0hOTF9UUkFOU0xOMAkweDJjCi0jZGVmaW5lIEJSSURHRV9EUkFNX0NITkxfVFJBTlNMTjEJMHgyZAotI2RlZmluZSBCUklER0VfRFJBTV9DSE5MX1RSQU5TTE4yCTB4MmUKLSNkZWZpbmUgQlJJREdFX0RSQU1fQ0hOTF9UUkFOU0xOMwkweDJmCi0jZGVmaW5lIEJSSURHRV9EUkFNX0NITkxfVFJBTlNMTjQJMHgzMAotI2RlZmluZSBCUklER0VfRFJBTV9DSE5MX1RSQU5TTE41CTB4MzEKLSNkZWZpbmUgQlJJREdFX0RSQU1fQ0hOTF9UUkFOU0xONgkweDMyCi0jZGVmaW5lIEJSSURHRV9EUkFNX0NITkxfVFJBTlNMTjcJMHgzMwogCiAjZGVmaW5lIEJSSURHRV9QQ0lFTUVNX0JBU0UwCQkweDM0CiAjZGVmaW5lIEJSSURHRV9QQ0lFTUVNX0JBU0UxCQkweDM1CkBAIC0xNzgsMTIgKzE0Myw0MiBAQAogI2RlZmluZSBCUklER0VfR0lPX1dFSUdIVAkJMHgyY2IKICNkZWZpbmUgQlJJREdFX0ZMQVNIX1dFSUdIVAkJMHgyY2MKIAorLyogRklYTUUgdmVyaWZ5ICovCisjZGVmaW5lIEJSSURHRV85WFhfRkxBU0hfQkFSKGkpCQkoMHgxMSArIChpKSkKKyNkZWZpbmUgQlJJREdFXzlYWF9GTEFTSF9CQVJfTElNSVQoaSkJKDB4MTUgKyAoaSkpCisKKyNkZWZpbmUgQlJJREdFXzlYWF9EUkFNX0JBUihpKQkJKDB4MTkgKyAoaSkpCisjZGVmaW5lIEJSSURHRV85WFhfRFJBTV9MSU1JVChpKQkoMHgyOSArIChpKSkKKyNkZWZpbmUgQlJJREdFXzlYWF9EUkFNX05PREVfVFJBTlNMTihpKQkoMHgzOSArIChpKSkKKyNkZWZpbmUgQlJJREdFXzlYWF9EUkFNX0NITkxfVFJBTlNMTihpKQkoMHg0OSArIChpKSkKKworI2RlZmluZSBCUklER0VfOVhYX0FERFJFU1NfRVJST1IwCTB4OWQKKyNkZWZpbmUgQlJJREdFXzlYWF9BRERSRVNTX0VSUk9SMQkweDllCisjZGVmaW5lIEJSSURHRV85WFhfQUREUkVTU19FUlJPUjIJMHg5ZgorCisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9CQVNFMAkweDU5CisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9CQVNFMQkweDVhCisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9CQVNFMgkweDViCisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9CQVNFMwkweDVjCisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9MSU1JVDAJMHg1ZAorI2RlZmluZSBCUklER0VfOVhYX1BDSUVNRU1fTElNSVQxCTB4NWUKKyNkZWZpbmUgQlJJREdFXzlYWF9QQ0lFTUVNX0xJTUlUMgkweDVmCisjZGVmaW5lIEJSSURHRV85WFhfUENJRU1FTV9MSU1JVDMJMHg2MAorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19CQVNFMAkJMHg2MQorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19CQVNFMQkJMHg2MgorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19CQVNFMgkJMHg2MworI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19CQVNFMwkJMHg2NAorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19MSU1JVDAJMHg2NQorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19MSU1JVDEJMHg2NgorI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19MSU1JVDIJMHg2NworI2RlZmluZSBCUklER0VfOVhYX1BDSUVJT19MSU1JVDMJMHg2OAorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjZGVmaW5lIG5sbV9yZWFkX2JyaWRnZV9yZWcoYiwgcikJbmxtX3JlYWRfcmVnKGIsIHIpCiAjZGVmaW5lIG5sbV93cml0ZV9icmlkZ2VfcmVnKGIsIHIsIHYpCW5sbV93cml0ZV9yZWcoYiwgciwgdikKLSNkZWZpbmUgbmxtX2dldF9icmlkZ2VfcGNpYmFzZShub2RlKQlcCi0JCQlubG1fcGNpY2ZnX2Jhc2UoWExQX0lPX0JSSURHRV9PRkZTRVQobm9kZSkpCisjZGVmaW5lIG5sbV9nZXRfYnJpZGdlX3BjaWJhc2Uobm9kZSkJbmxtX3BjaWNmZ19iYXNlKGNwdV9pc194bHA5eHgoKSA/IFwKKwkJWExQOVhYX0lPX0JSSURHRV9PRkZTRVQobm9kZSkgOiBYTFBfSU9fQlJJREdFX09GRlNFVChub2RlKSkKICNkZWZpbmUgbmxtX2dldF9icmlkZ2VfcmVnYmFzZShub2RlKQlcCiAJCQkobmxtX2dldF9icmlkZ2VfcGNpYmFzZShub2RlKSArIFhMUF9JT19QQ0lfSERSU1opCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL2lvbWFwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9pb21hcC5oCmluZGV4IDU1ZWVlNzcuLjFmMjNkZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL2lvbWFwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwvaW9tYXAuaApAQCAtNDgsOCArNDgsMTAgQEAKICNkZWZpbmUgWExQX0lPX1NJWkUJCQkoNjQgPDwgMjApCS8qIEVDRkcgc3BhY2Ugc2l6ZSAqLwogI2RlZmluZSBYTFBfSU9fUENJX0hEUlNaCQkweDEwMAogI2RlZmluZSBYTFBfSU9fREVWKG5vZGUsIGRldikJCSgoZGV2KSArIChub2RlKSAqIDgpCi0jZGVmaW5lIFhMUF9IRFJfT0ZGU0VUKG5vZGUsIGJ1cywgZGV2LCBmbikJKCgoYnVzKSA8PCAyMCkgfCBcCi0JCQkJKChYTFBfSU9fREVWKG5vZGUsIGRldikpIDw8IDE1KSB8ICgoZm4pIDw8IDEyKSkKKyNkZWZpbmUgWExQX0lPX1BDSV9PRkZTRVQoYiwgZCwgZikJKCgoYikgPDwgMjApIHwgKChkKSA8PCAxNSkgfCAoKGYpIDw8IDEyKSkKKworI2RlZmluZSBYTFBfSERSX09GRlNFVChub2RlLCBidXMsIGRldiwgZm4pIFwKKwkJWExQX0lPX1BDSV9PRkZTRVQoYnVzLCBYTFBfSU9fREVWKG5vZGUsIGRldiksIGZuKQogCiAjZGVmaW5lIFhMUF9JT19CUklER0VfT0ZGU0VUKG5vZGUpCVhMUF9IRFJfT0ZGU0VUKG5vZGUsIDAsIDAsIDApCiAvKiBjb2hlcmVudCBpbnRlciBjaGlwICovCkBAIC0xMDksNiArMTExLDM2IEBACiAjZGVmaW5lIFhMUF9JT19NTUNfT0ZGU0VUKG5vZGUsIHNsb3QpCVwKIAkJKChYTFBfSU9fU0RfT0ZGU0VUKG5vZGUpKSsoc2xvdCoweDEwMCkrWExQX0lPX1BDSV9IRFJTWikKIAorLyogVGhpbmdzIGhhdmUgY2hhbmdlZCBkcmFzdGljYWxseSBpbiBYTFAgOVhYICovCisjZGVmaW5lIFhMUDlYWF9IRFJfT0ZGU0VUKG4sIGQsIGYpCVwKKwkJCVhMUF9JT19QQ0lfT0ZGU0VUKHhscDl4eF9nZXRfc29jYnVzKG4pLCBkLCBmKQorCisjZGVmaW5lIFhMUDlYWF9JT19CUklER0VfT0ZGU0VUKG5vZGUpCVhMUF9JT19QQ0lfT0ZGU0VUKDAsIDAsIG5vZGUpCisjZGVmaW5lIFhMUDlYWF9JT19QSUNfT0ZGU0VUKG5vZGUpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDIsIDApCisjZGVmaW5lIFhMUDlYWF9JT19VQVJUX09GRlNFVChub2RlKQlYTFA5WFhfSERSX09GRlNFVChub2RlLCAyLCAyKQorI2RlZmluZSBYTFA5WFhfSU9fU1lTX09GRlNFVChub2RlKQlYTFA5WFhfSERSX09GRlNFVChub2RlLCA2LCAwKQorI2RlZmluZSBYTFA5WFhfSU9fRlVTRV9PRkZTRVQobm9kZSkJWExQOVhYX0hEUl9PRkZTRVQobm9kZSwgNiwgMSkKKyNkZWZpbmUgWExQOVhYX0lPX0pUQUdfT0ZGU0VUKG5vZGUpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDYsIDQpCisKKyNkZWZpbmUgWExQOVhYX0lPX1BDSUVfT0ZGU0VUKG5vZGUsIGkpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDEsIGkpCisjZGVmaW5lIFhMUDlYWF9JT19QQ0lFMF9PRkZTRVQobm9kZSkJWExQOVhYX0hEUl9PRkZTRVQobm9kZSwgMSwgMCkKKyNkZWZpbmUgWExQOVhYX0lPX1BDSUUyX09GRlNFVChub2RlKQlYTFA5WFhfSERSX09GRlNFVChub2RlLCAxLCAyKQorI2RlZmluZSBYTFA5WFhfSU9fUENJRTNfT0ZGU0VUKG5vZGUpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDEsIDMpCisKKy8qIFhMUDl4eCBVU0IgYmxvY2sgKi8KKyNkZWZpbmUgWExQOVhYX0lPX1VTQl9PRkZTRVQobm9kZSwgaSkJCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDQsIGkpCisjZGVmaW5lIFhMUDlYWF9JT19VU0JfWEhDSTBfT0ZGU0VUKG5vZGUpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDQsIDEpCisjZGVmaW5lIFhMUDlYWF9JT19VU0JfWEhDSTFfT0ZGU0VUKG5vZGUpCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDQsIDIpCisKKy8qIFhMUDlYWCBvbi1jaGlwIFNBVEEgY29udHJvbGxlciAqLworI2RlZmluZSBYTFA5WFhfSU9fU0FUQV9PRkZTRVQobm9kZSkJCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDMsIDIpCisKKyNkZWZpbmUgWExQOVhYX0lPX05PUl9PRkZTRVQobm9kZSkJCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDcsIDApCisjZGVmaW5lIFhMUDlYWF9JT19OQU5EX09GRlNFVChub2RlKQkJWExQOVhYX0hEUl9PRkZTRVQobm9kZSwgNywgMSkKKyNkZWZpbmUgWExQOVhYX0lPX1NQSV9PRkZTRVQobm9kZSkJCVhMUDlYWF9IRFJfT0ZGU0VUKG5vZGUsIDcsIDIpCisvKiBTRCBmbGFzaCAqLworI2RlZmluZSBYTFA5WFhfSU9fTU1DU0RfT0ZGU0VUKG5vZGUpCQlYTFA5WFhfSERSX09GRlNFVChub2RlLCA3LCAzKQorCiAvKiBQQ0kgY29uZmlnIGhlYWRlciByZWdpc3RlciBpZCdzICovCiAjZGVmaW5lIFhMUF9QQ0lfQ0ZHUkVHMAkJCTB4MDAKICNkZWZpbmUgWExQX1BDSV9DRkdSRUcxCQkJMHgwMQpAQCAtMTU2LDExICsxODgsMjMgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OTE1fTU1DCQkweDEwMTgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OTE1fWEhDSQkJMHgxMDFkCiAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YTFA5WFhfU0FUQQkweDkwMUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YTFA5WFhfWEhDSQkweDkwMUQKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2RlZmluZSBubG1fcmVhZF9wY2lfcmVnKGIsIHIpCQlubG1fcmVhZF9yZWcoYiwgcikKICNkZWZpbmUgbmxtX3dyaXRlX3BjaV9yZWcoYiwgciwgdikJbmxtX3dyaXRlX3JlZyhiLCByLCB2KQogCitzdGF0aWMgaW5saW5lIGludCB4bHA5eHhfZ2V0X3NvY2J1cyhpbnQgbm9kZSkKK3sKKwl1aW50NjRfdCBzb2NicmlkZ2U7CisKKwlpZiAobm9kZSA9PSAwKQorCQlyZXR1cm4gMTsKKwlzb2NicmlkZ2UgPSBubG1fcGNpY2ZnX2Jhc2UoWExQOVhYX0lPX0JSSURHRV9PRkZTRVQobm9kZSkpOworCXJldHVybiAobmxtX3JlYWRfcGNpX3JlZyhzb2NicmlkZ2UsIDB4NikgPj4gOCkgJiAweGZmOworfQogI2VuZGlmIC8qICFfX0FTU0VNQkxZICovCiAKICNlbmRpZiAvKiBfX05MTV9IQUxfSU9NQVBfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9wY2lidXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BjaWJ1cy5oCmluZGV4IGI1NTljYjkuLmQ0ZGViODcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BjaWJ1cy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BjaWJ1cy5oCkBAIC01MiwyNSArNTIsNDggQEAKICNkZWZpbmUgUENJRV9CWVRFX1NXQVBfTUVNX0xJTQkJMHgyNDgKICNkZWZpbmUgUENJRV9CWVRFX1NXQVBfSU9fQkFTRQkJMHgyNDkKICNkZWZpbmUgUENJRV9CWVRFX1NXQVBfSU9fTElNCQkweDI0QQorCisjZGVmaW5lIFBDSUVfQlJJREdFX01TSVhfQUREUl9CQVNFCTB4MjRGCisjZGVmaW5lIFBDSUVfQlJJREdFX01TSVhfQUREUl9MSU1JVAkweDI1MAogI2RlZmluZSBQQ0lFX01TSV9TVEFUVVMJCQkweDI1QQogI2RlZmluZSBQQ0lFX01TSV9FTgkJCTB4MjVCCisjZGVmaW5lIFBDSUVfTVNJWF9TVEFUVVMJCTB4MjVECisjZGVmaW5lIFBDSUVfSU5UX1NUQVRVUzAJCTB4MjVGCisjZGVmaW5lIFBDSUVfSU5UX1NUQVRVUzEJCTB4MjYwCiAjZGVmaW5lIFBDSUVfSU5UX0VOMAkJCTB4MjYxCisjZGVmaW5lIFBDSUVfSU5UX0VOMQkJCTB4MjYyCiAKLS8qIFBDSUVfTVNJX0VOICovCi0jZGVmaW5lIFBDSUVfTVNJX1ZFQ1RPUl9JTlRfRU4JCTB4RkZGRkZGRkYKKy8qIFhMUDlYWCBoYXMgYmFzaWMgY2hhbmdlcyAqLworI2RlZmluZSBQQ0lFXzlYWF9CWVRFX1NXQVBfTUVNX0JBU0UJMHgyNWMKKyNkZWZpbmUgUENJRV85WFhfQllURV9TV0FQX01FTV9MSU0JMHgyNWQKKyNkZWZpbmUgUENJRV85WFhfQllURV9TV0FQX0lPX0JBU0UJMHgyNWUKKyNkZWZpbmUgUENJRV85WFhfQllURV9TV0FQX0lPX0xJTQkweDI1ZgogCi0vKiBQQ0lFX0lOVF9FTjAgKi8KLSNkZWZpbmUgUENJRV9NU0lfSU5UX0VOCQkJKDEgPDwgOSkKKy8qIG90aGVyICovCisjZGVmaW5lIFBDSUVfTkxJTktTCQkJNAogCisvKiBNU0kgYWRkcmVzc2VzICovCisjZGVmaW5lIE1TSV9BRERSX0JBU0UJCQkweGZmZmVlMDAwMDBVTEwKKyNkZWZpbmUgTVNJX0FERFJfU1oJCQkweDEwMDAwCisjZGVmaW5lIE1TSV9MSU5LX0FERFIobiwgbCkJCShNU0lfQUREUl9CQVNFICsgXAorCQkJCShQQ0lFX05MSU5LUyAqIChuKSArIChsKSkgKiBNU0lfQUREUl9TWikKKyNkZWZpbmUgTVNJWF9BRERSX0JBU0UJCQkweGZmZmVmMDAwMDBVTEwKKyNkZWZpbmUgTVNJWF9MSU5LX0FERFIobiwgbCkJCShNU0lYX0FERFJfQkFTRSArIFwKKwkJCQkoUENJRV9OTElOS1MgKiAobikgKyAobCkpICogTVNJX0FERFJfU1opCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjZGVmaW5lIG5sbV9yZWFkX3BjaWVfcmVnKGIsIHIpCQlubG1fcmVhZF9yZWcoYiwgcikKICNkZWZpbmUgbmxtX3dyaXRlX3BjaWVfcmVnKGIsIHIsIHYpCW5sbV93cml0ZV9yZWcoYiwgciwgdikKLSNkZWZpbmUgbmxtX2dldF9wY2llX2Jhc2Uobm9kZSwgaW5zdCkJXAotCQkJbmxtX3BjaWNmZ19iYXNlKFhMUF9JT19QQ0lFX09GRlNFVChub2RlLCBpbnN0KSkKLSNkZWZpbmUgbmxtX2dldF9wY2llX3JlZ2Jhc2Uobm9kZSwgaW5zdCkJXAotCQkJKG5sbV9nZXRfcGNpZV9iYXNlKG5vZGUsIGluc3QpICsgWExQX0lPX1BDSV9IRFJTWikKKyNkZWZpbmUgbmxtX2dldF9wY2llX2Jhc2Uobm9kZSwgaW5zdCkJbmxtX3BjaWNmZ19iYXNlKGNwdV9pc194bHA5eHgoKSA/IFwKKwlYTFA5WFhfSU9fUENJRV9PRkZTRVQobm9kZSwgaW5zdCkgOiBYTFBfSU9fUENJRV9PRkZTRVQobm9kZSwgaW5zdCkpCiAKLWludCB4bHBfcGNpZV9saW5rX2lydChpbnQgbGluayk7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3ZvaWQgeGxwX2luaXRfbm9kZV9tc2lfaXJxcyhpbnQgbm9kZSwgaW50IGxpbmspOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bHBfaW5pdF9ub2RlX21zaV9pcnFzKGludCBub2RlLCBpbnQgbGluaykge30KKyNlbmRpZgorCitzdHJ1Y3QgcGNpX2RldiAqeGxwX2dldF9wY2llX2xpbmsoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldik7CisKICNlbmRpZgogI2VuZGlmIC8qIF9fTkxNX0hBTF9QQ0lCVVNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9waWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BpYy5oCmluZGV4IDEwNTM4OWIuLmYxMGJmM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BpYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3BpYy5oCkBAIC0xNTAsMTIgKzE1MCwxOSBAQAogI2RlZmluZSBQSUNfSVJUMAkJMHg3NAogI2RlZmluZSBQSUNfSVJUKGkpCQkoUElDX0lSVDAgKyAoKGkpICogMikpCiAKLSNkZWZpbmUgVElNRVJfQ1lDTEVTX01BWFZBTAkweGZmZmZmZmZmZmZmZmZmZmZVTEwKKyNkZWZpbmUgUElDXzlYWF9QRU5ESU5HXzAJMHg2CisjZGVmaW5lIFBJQ185WFhfUEVORElOR18xCTB4OAorI2RlZmluZSBQSUNfOVhYX1BFTkRJTkdfMgkweGEKKyNkZWZpbmUgUElDXzlYWF9QRU5ESU5HXzMJMHhjCisKKyNkZWZpbmUgUElDXzlYWF9JUlQwCQkweDFjMAorI2RlZmluZSBQSUNfOVhYX0lSVChpKQkJKFBJQ185WFhfSVJUMCArICgoaSkgKiAyKSkKIAogLyoKICAqICAgIElSVCBNYXAKICAqLwogI2RlZmluZSBQSUNfTlVNX0lSVFMJCTE2MAorI2RlZmluZSBQSUNfOVhYX05VTV9JUlRTCTI1NgogCiAjZGVmaW5lIFBJQ19JUlRfV0RfMF9JTkRFWAkwCiAjZGVmaW5lIFBJQ19JUlRfV0RfMV9JTkRFWAkxCkBAIC0xOTMsMTQgKzIwMCw5IEBACiAjZGVmaW5lIFBJQ19JUlRfUENJRV9MSU5LX0lOREVYKG51bSkJKChudW0pICsgUElDX0lSVF9QQ0lFX0xJTktfMF9JTkRFWCkKIAogI2RlZmluZSBQSUNfQ0xPQ0tfVElNRVIJCQk3Ci0jZGVmaW5lIFBJQ19JUlFfQkFTRQkJCTgKIAogI2lmICFkZWZpbmVkKExPQ09SRSkgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQogCi0jZGVmaW5lIFBJQ19JUlRfRklSU1RfSVJRCQkoUElDX0lSUV9CQVNFKQotI2RlZmluZSBQSUNfSVJUX0xBU1RfSVJRCQk2MwotI2RlZmluZSBQSUNfSVJRX0lTX0lSVChpcnEpCQkoKGlycSkgPj0gUElDX0lSVF9GSVJTVF9JUlEpCi0KIC8qCiAgKiAgIE1pc2MKICAqLwpAQCAtMjEwLDMwICsyMTIsMjYgQEAKIAogI2RlZmluZSBubG1fcmVhZF9waWNfcmVnKGIsIHIpCW5sbV9yZWFkX3JlZzY0KGIsIHIpCiAjZGVmaW5lIG5sbV93cml0ZV9waWNfcmVnKGIsIHIsIHYpIG5sbV93cml0ZV9yZWc2NChiLCByLCB2KQotI2RlZmluZSBubG1fZ2V0X3BpY19wY2liYXNlKG5vZGUpIG5sbV9wY2ljZmdfYmFzZShYTFBfSU9fUElDX09GRlNFVChub2RlKSkKKyNkZWZpbmUgbmxtX2dldF9waWNfcGNpYmFzZShub2RlKQlubG1fcGNpY2ZnX2Jhc2UoY3B1X2lzX3hscDl4eCgpID8gXAorCQlYTFA5WFhfSU9fUElDX09GRlNFVChub2RlKSA6IFhMUF9JT19QSUNfT0ZGU0VUKG5vZGUpKQogI2RlZmluZSBubG1fZ2V0X3BpY19yZWdiYXNlKG5vZGUpIChubG1fZ2V0X3BpY19wY2liYXNlKG5vZGUpICsgWExQX0lPX1BDSV9IRFJTWikKIAogLyogV2UgdXNlIFBJQyBvbiBub2RlIDAgYXMgYSB0aW1lciAqLwogI2RlZmluZSBwaWNfdGltZXJfZnJlcSgpCQlubG1fZ2V0X3BpY19mcmVxdWVuY3koMCkKIAogLyogSVJUIGFuZCBoL3cgaW50ZXJydXB0IHJvdXRpbmVzICovCi1zdGF0aWMgaW5saW5lIGludAotbmxtX3BpY19yZWFkX2lydCh1aW50NjRfdCBiYXNlLCBpbnQgaXJ0X2luZGV4KQotewotCXJldHVybiBubG1fcmVhZF9waWNfcmVnKGJhc2UsIFBJQ19JUlQoaXJ0X2luZGV4KSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAotbmxtX3NldF9pcnRfdG9fY3B1KHVpbnQ2NF90IGJhc2UsIGludCBpcnQsIGludCBjcHUpCitubG1fOXh4X3BpY193cml0ZV9pcnQodWludDY0X3QgYmFzZSwgaW50IGlydF9udW0sIGludCBlbiwgaW50IG5taSwKKwlpbnQgc2NoLCBpbnQgdmVjLCBpbnQgZHQsIGludCBkYiwgaW50IGNwdSkKIHsKIAl1aW50NjRfdCB2YWw7CiAKLQl2YWwgPSBubG1fcmVhZF9waWNfcmVnKGJhc2UsIFBJQ19JUlQoaXJ0KSk7Ci0JLyogY2xlYXIgY3B1c2V0IGFuZCBtYXNrICovCi0JdmFsICY9IH4oKDB4N3VsbCA8PCAxNikgfCAweGZmZmYpOwotCS8qIHNldCBEQiwgY3B1c2V0IGFuZCBjcHVtYXNrICovCi0JdmFsIHw9ICgxIDw8IDE5KSB8ICgoY3B1ID4+IDQpIDw8IDE2KSB8ICgxIDw8IChjcHUgJiAweGYpKTsKLQlubG1fd3JpdGVfcGljX3JlZyhiYXNlLCBQSUNfSVJUKGlydCksIHZhbCk7CisJdmFsID0gKCgodWludDY0X3QpZW4gJiAweDEpIDw8IDIyKSB8ICgobm1pICYgMHgxKSA8PCAyMykgfAorCQkJKCgwIC8qbWMqLykgPDwgMjApIHwgKCh2ZWMgJiAweDNmKSA8PCAyNCkgfAorCQkJKChkdCAmIDB4MSkgPDwgMjEpIHwgKDAgLypwdHIqLyA8PCAxNikgfAorCQkJKGNwdSAmIDB4M2ZmKTsKKworCW5sbV93cml0ZV9waWNfcmVnKGJhc2UsIFBJQ185WFhfSVJUKGlydF9udW0pLCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTI1NCw5ICsyNTIsMTMgQEAKIG5sbV9waWNfd3JpdGVfaXJ0X2RpcmVjdCh1aW50NjRfdCBiYXNlLCBpbnQgaXJ0X251bSwgaW50IGVuLCBpbnQgbm1pLAogCWludCBzY2gsIGludCB2ZWMsIGludCBjcHUpCiB7Ci0JbmxtX3BpY193cml0ZV9pcnQoYmFzZSwgaXJ0X251bSwgZW4sIG5taSwgc2NoLCB2ZWMsIDEsCi0JCShjcHUgPj4gNCksCQkvKiB0aHJlYWQgZ3JvdXAgKi8KLQkJMSA8PCAoY3B1ICYgMHhmKSk7CS8qIHRocmVhZCBtYXNrICovCisJaWYgKGNwdV9pc194bHA5eHgoKSkKKwkJbmxtXzl4eF9waWNfd3JpdGVfaXJ0KGJhc2UsIGlydF9udW0sIGVuLCBubWksIHNjaCwgdmVjLAorCQkJCQkJCTEsIDAsIGNwdSk7CisJZWxzZQorCQlubG1fcGljX3dyaXRlX2lydChiYXNlLCBpcnRfbnVtLCBlbiwgbm1pLCBzY2gsIHZlYywgMSwKKwkJCShjcHUgPj4gNCksCQkvKiB0aHJlYWQgZ3JvdXAgKi8KKwkJCTEgPDwgKGNwdSAmIDB4ZikpOwkvKiB0aHJlYWQgbWFzayAqLwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQ2NF90CkBAIC0yOTgsOCArMzAwLDEzIEBACiB7CiAJdWludDY0X3QgcmVnOwogCi0JcmVnID0gbmxtX3JlYWRfcGljX3JlZyhiYXNlLCBQSUNfSVJUKGlydCkpOwotCW5sbV93cml0ZV9waWNfcmVnKGJhc2UsIFBJQ19JUlQoaXJ0KSwgcmVnIHwgKDF1IDw8IDMxKSk7CisJaWYgKGNwdV9pc194bHA5eHgoKSkgeworCQlyZWcgPSBubG1fcmVhZF9waWNfcmVnKGJhc2UsIFBJQ185WFhfSVJUKGlydCkpOworCQlubG1fd3JpdGVfcGljX3JlZyhiYXNlLCBQSUNfOVhYX0lSVChpcnQpLCByZWcgfCAoMSA8PCAyMikpOworCX0gZWxzZSB7CisJCXJlZyA9IG5sbV9yZWFkX3BpY19yZWcoYmFzZSwgUElDX0lSVChpcnQpKTsKKwkJbmxtX3dyaXRlX3BpY19yZWcoYmFzZSwgUElDX0lSVChpcnQpLCByZWcgfCAoMXUgPDwgMzEpKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMzA3LDggKzMxNCwxNSBAQAogewogCXVpbnQ2NF90IHJlZzsKIAotCXJlZyA9IG5sbV9yZWFkX3BpY19yZWcoYmFzZSwgUElDX0lSVChpcnQpKTsKLQlubG1fd3JpdGVfcGljX3JlZyhiYXNlLCBQSUNfSVJUKGlydCksIHJlZyAmIH4oKHVpbnQ2NF90KTEgPDwgMzEpKTsKKwlpZiAoY3B1X2lzX3hscDl4eCgpKSB7CisJCXJlZyA9IG5sbV9yZWFkX3BpY19yZWcoYmFzZSwgUElDXzlYWF9JUlQoaXJ0KSk7CisJCXJlZyAmPSB+KCh1aW50NjRfdCkxIDw8IDIyKTsKKwkJbmxtX3dyaXRlX3BpY19yZWcoYmFzZSwgUElDXzlYWF9JUlQoaXJ0KSwgcmVnKTsKKwl9IGVsc2UgeworCQlyZWcgPSBubG1fcmVhZF9waWNfcmVnKGJhc2UsIFBJQ19JUlQoaXJ0KSk7CisJCXJlZyAmPSB+KCh1aW50NjRfdCkxIDw8IDMxKTsKKwkJbmxtX3dyaXRlX3BpY19yZWcoYmFzZSwgUElDX0lSVChpcnQpLCByZWcpOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0zMTYsOCArMzMwLDEzIEBACiB7CiAJdWludDY0X3QgaXBpOwogCi0JaXBpID0gKCh1aW50NjRfdClubWkgPDwgMzEpIHwgKGlycSA8PCAyMCk7Ci0JaXBpIHw9ICgoaHd0ID4+IDQpIDw8IDE2KSB8ICgxIDw8IChod3QgJiAweGYpKTsgLyogY3B1c2V0IGFuZCBtYXNrICovCisJaWYgKGNwdV9pc194bHA5eHgoKSkKKwkJaXBpID0gKG5taSA8PCAyMykgfCAoaXJxIDw8IDI0KSB8CisJCQkoMC8qbWNtKi8gPDwgMjApIHwgKDAvKnB0ciovIDw8IDE2KSB8IGh3dDsKKwllbHNlCisJCWlwaSA9ICgodWludDY0X3Qpbm1pIDw8IDMxKSB8IChpcnEgPDwgMjApIHwKKwkJCSgoaHd0ID4+IDQpIDw8IDE2KSB8ICgxIDw8IChod3QgJiAweGYpKTsKKwogCW5sbV93cml0ZV9waWNfcmVnKGJhc2UsIFBJQ19JUElfQ1RMLCBpcGkpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC9zeXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3N5cy5oCmluZGV4IGZjZjI4MzMuLmQ5YjEwN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3N5cy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3N5cy5oCkBAIC0xNDcsMTMgKzE0NywyOSBAQAogI2RlZmluZSBTWVNfU1lTX1BMTF9NRU1fUkVRCQkJMHgyYTMKICNkZWZpbmUgU1lTX1BMTF9NRU1fU1RBVAkJCTB4MmE0CiAKKy8qIFJlZ2lzdGVycyBjaGFuZ2VkIG9uIDlYWCAqLworI2RlZmluZSBTWVNfOVhYX1BPV0VSX09OX1JFU0VUX0NGRwkJMHgwMAorI2RlZmluZSBTWVNfOVhYX0NISVBfUkVTRVQJCQkweDAxCisjZGVmaW5lIFNZU185WFhfQ1BVX1JFU0VUCQkJMHgwMgorI2RlZmluZSBTWVNfOVhYX0NQVV9OT05DT0hFUkVOVF9NT0RFCQkweDAzCisKKy8qIFhMUCA5WFggZnVzZSBibG9jayByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRlVTRV85WFhfREVWQ0ZHNgkJCTB4YzYKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2RlZmluZSBubG1fcmVhZF9zeXNfcmVnKGIsIHIpCQlubG1fcmVhZF9yZWcoYiwgcikKICNkZWZpbmUgbmxtX3dyaXRlX3N5c19yZWcoYiwgciwgdikJbmxtX3dyaXRlX3JlZyhiLCByLCB2KQotI2RlZmluZSBubG1fZ2V0X3N5c19wY2liYXNlKG5vZGUpIG5sbV9wY2ljZmdfYmFzZShYTFBfSU9fU1lTX09GRlNFVChub2RlKSkKKyNkZWZpbmUgbmxtX2dldF9zeXNfcGNpYmFzZShub2RlKQlubG1fcGNpY2ZnX2Jhc2UoY3B1X2lzX3hscDl4eCgpID8gXAorCQlYTFA5WFhfSU9fU1lTX09GRlNFVChub2RlKSA6IFhMUF9JT19TWVNfT0ZGU0VUKG5vZGUpKQogI2RlZmluZSBubG1fZ2V0X3N5c19yZWdiYXNlKG5vZGUpIChubG1fZ2V0X3N5c19wY2liYXNlKG5vZGUpICsgWExQX0lPX1BDSV9IRFJTWikKIAorLyogWExQOVhYIGZ1c2UgYmxvY2sgKi8KKyNkZWZpbmUgbmxtX2dldF9mdXNlX3BjaWJhc2Uobm9kZSkJXAorCQkJbmxtX3BjaWNmZ19iYXNlKFhMUDlYWF9JT19GVVNFX09GRlNFVChub2RlKSkKKyNkZWZpbmUgbmxtX2dldF9mdXNlX3JlZ2Jhc2Uobm9kZSkJXAorCQkJKG5sbV9nZXRfZnVzZV9wY2liYXNlKG5vZGUpICsgWExQX0lPX1BDSV9IRFJTWikKKwogdW5zaWduZWQgaW50IG5sbV9nZXRfcGljX2ZyZXF1ZW5jeShpbnQgbm9kZSk7CiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwvdWFydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwvdWFydC5oCmluZGV4IDg2ZDE2ZTEuLmE2YzU0NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3VhcnQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxwLWhhbC91YXJ0LmgKQEAgLTk0LDcgKzk0LDggQEAKICNkZWZpbmUgbmxtX3JlYWRfdWFydF9yZWcoYiwgcikJCW5sbV9yZWFkX3JlZyhiLCByKQogI2RlZmluZSBubG1fd3JpdGVfdWFydF9yZWcoYiwgciwgdikJbmxtX3dyaXRlX3JlZyhiLCByLCB2KQogI2RlZmluZSBubG1fZ2V0X3VhcnRfcGNpYmFzZShub2RlLCBpbnN0KQlcCi0JCW5sbV9wY2ljZmdfYmFzZShYTFBfSU9fVUFSVF9PRkZTRVQobm9kZSwgaW5zdCkpCisJbmxtX3BjaWNmZ19iYXNlKGNwdV9pc194bHA5eHgoKSA/ICBYTFA5WFhfSU9fVUFSVF9PRkZTRVQobm9kZSkgOiBcCisJCQkJCQlYTFBfSU9fVUFSVF9PRkZTRVQobm9kZSwgaW5zdCkpCiAjZGVmaW5lIG5sbV9nZXRfdWFydF9yZWdiYXNlKG5vZGUsIGluc3QpCVwKIAkJCShubG1fZ2V0X3VhcnRfcGNpYmFzZShub2RlLCBpbnN0KSArIFhMUF9JT19QQ0lfSERSU1opCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHAtaGFsL3hscC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwveGxwLmgKaW5kZXggNDcwZjIwOS4uMmIwYzk1OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwveGxwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hscC1oYWwveGxwLmgKQEAgLTM3LDEwICszNyw5IEBACiAKICNkZWZpbmUgUElDX1VBUlRfMF9JUlEJCQkxNwogI2RlZmluZSBQSUNfVUFSVF8xX0lSUQkJCTE4Ci0jZGVmaW5lIFBJQ19QQ0lFX0xJTktfMF9JUlEJCTE5Ci0jZGVmaW5lIFBJQ19QQ0lFX0xJTktfMV9JUlEJCTIwCi0jZGVmaW5lIFBJQ19QQ0lFX0xJTktfMl9JUlEJCTIxCi0jZGVmaW5lIFBJQ19QQ0lFX0xJTktfM19JUlEJCTIyCisKKyNkZWZpbmUgUElDX1BDSUVfTElOS19MRUdBQ1lfSVJRX0JBU0UJMTkKKyNkZWZpbmUgUElDX1BDSUVfTElOS19MRUdBQ1lfSVJRKGkpCSgxOSArIChpKSkKIAogI2RlZmluZSBQSUNfRUhDSV8wX0lSUQkJCTIzCiAjZGVmaW5lIFBJQ19FSENJXzFfSVJRCQkJMjQKQEAgLTUxLDYgKzUwLDggQEAKICNkZWZpbmUgUElDXzJYWF9YSENJXzBfSVJRCQkyMwogI2RlZmluZSBQSUNfMlhYX1hIQ0lfMV9JUlEJCTI0CiAjZGVmaW5lIFBJQ18yWFhfWEhDSV8yX0lSUQkJMjUKKyNkZWZpbmUgUElDXzlYWF9YSENJXzBfSVJRCQkyMworI2RlZmluZSBQSUNfOVhYX1hIQ0lfMV9JUlEJCTI0CiAKICNkZWZpbmUgUElDX01NQ19JUlEJCQkyOQogI2RlZmluZSBQSUNfSTJDXzBfSVJRCQkJMzAKQEAgLTU4LDYgKzU5LDIzIEBACiAjZGVmaW5lIFBJQ19JMkNfMl9JUlEJCQkzMgogI2RlZmluZSBQSUNfSTJDXzNfSVJRCQkJMzMKIAorI2RlZmluZSBQSUNfUENJRV9MSU5LX01TSV9JUlFfQkFTRQk0NAkvKiA0NCAtIDQ3IE1TSSBJUlEgKi8KKyNkZWZpbmUgUElDX1BDSUVfTElOS19NU0lfSVJRKGkpCSg0NCArIChpKSkKKworLyogTVNJLVggd2l0aCBzZWNvbmQgbGluay1sZXZlbCBkaXNwYXRjaCAqLworI2RlZmluZSBQSUNfUENJRV9NU0lYX0lSUV9CQVNFCQk0OAkvKiA0OCAtIDUxIE1TSS1YIElSUSAqLworI2RlZmluZSBQSUNfUENJRV9NU0lYX0lSUShpKQkJKDQ4ICsgKGkpKQorCisjZGVmaW5lIE5MTV9NU0lYX1ZFQ19CQVNFCQk5NgkvKiA5NiAtIDEyNyAtIE1TSVggbWFwcGVkICovCisjZGVmaW5lIE5MTV9NU0lfVkVDX0JBU0UJCTEyOAkvKiAxMjggLTI1NSAtIE1TSSBtYXBwZWQgKi8KKworI2RlZmluZSBOTE1fUElDX0lORElSRUNUX1ZFQ19CQVNFCTUxMgorI2RlZmluZSBOTE1fR1BJT19WRUNfQkFTRQkJNzY4CisKKyNkZWZpbmUgUElDX0lSUV9CQVNFCQkJOAorI2RlZmluZSBQSUNfSVJUX0ZJUlNUX0lSUQkJUElDX0lSUV9CQVNFCisjZGVmaW5lIFBJQ19JUlRfTEFTVF9JUlEJCTYzCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIFNNUCBzdXBwb3J0IGZ1bmN0aW9ucyAqLwpAQCAtNjgsNiArODYsOSBAQAogdm9pZCBubG1faGFsX2luaXQodm9pZCk7CiBpbnQgeGxwX2dldF9kcmFtX21hcChpbnQgbiwgdWludDY0X3QgKmRyYW1fbWFwKTsKIAorc3RydWN0IHBjaV9kZXY7CitpbnQgeGxwX3NvY2Rldl90b19ub2RlKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCiAvKiBEZXZpY2UgdHJlZSByZWxhdGVkICovCiB2b2lkIHhscF9lYXJseV9pbml0X2RldnRyZWUodm9pZCk7CiB2b2lkICp4bHBfZHRfaW5pdCh2b2lkICpmZHRwKTsKQEAgLTc2LDggKzk3LDE1IEBACiB7CiAJaW50IGNoaXAgPSByZWFkX2MwX3ByaWQoKSAmIDB4ZmYwMDsKIAotCXJldHVybiBjaGlwID09IFBSSURfSU1QX05FVExPR0lDX1hMUDJYWDsKKwlyZXR1cm4gY2hpcCA9PSBQUklEX0lNUF9ORVRMT0dJQ19YTFAyWFggfHwKKwkJY2hpcCA9PSBQUklEX0lNUF9ORVRMT0dJQ19YTFA5WFg7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9pc194bHA5eHgodm9pZCkKK3sKKwlpbnQgY2hpcCA9IHJlYWRfYzBfcHJpZCgpICYgMHhmZjAwOworCisJcmV0dXJuIGNoaXAgPT0gUFJJRF9JTVBfTkVUTE9HSUNfWExQOVhYOworfQogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfQVNNX05MTV9YTFBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci94bHIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIveGxyLmgKaW5kZXggYzE2NjdlMC4uY2ViOTkxYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci94bHIuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxyL3hsci5oCkBAIC0zNSwxMSArMzUsNiBAQAogI2lmbmRlZiBfQVNNX05MTV9YTFJfSAogI2RlZmluZSBfQVNNX05MTV9YTFJfSAogCi0vKiBQbGF0Zm9ybSBVQVJUIGZ1bmN0aW9ucyAqLwotc3RydWN0IHVhcnRfcG9ydDsKLXVuc2lnbmVkIGludCBubG1feGxyX3VhcnRfaW4oc3RydWN0IHVhcnRfcG9ydCAqLCBpbnQpOwotdm9pZCBubG1feGxyX3VhcnRfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKiwgaW50LCBpbnQpOwotCiAvKiBTTVAgaGVscGVycyAqLwogdm9pZCB4bHJfd2FrZXVwX3NlY29uZGFyeV9jcHVzKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtaGVscGVyLWJvYXJkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtaGVscGVyLWJvYXJkLmgKaW5kZXggNDE3ODVkZC4uODkzMzIwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWhlbHBlci1ib2FyZC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1oZWxwZXItYm9hcmQuaApAQCAtMzYsNiArMzYsMTMgQEAKIAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1oZWxwZXIuaD4KIAorZW51bSBjdm14X2hlbHBlcl9ib2FyZF91c2JfY2xvY2tfdHlwZXMgeworCVVTQl9DTE9DS19UWVBFX1JFRl8xMiwKKwlVU0JfQ0xPQ0tfVFlQRV9SRUZfMjQsCisJVVNCX0NMT0NLX1RZUEVfUkVGXzQ4LAorCVVTQl9DTE9DS19UWVBFX0NSWVNUQUxfMTIsCit9OworCiB0eXBlZGVmIGVudW0gewogCXNldF9waHlfbGlua19mbGFnc19hdXRvbmVnID0gMHgxLAogCXNldF9waHlfbGlua19mbGFnc19mbG93X2NvbnRyb2xfZG9udF90b3VjaCA9IDB4MCA8PCAxLApAQCAtMTU0LDQgKzE2MSw2IEBACiAgKi8KIGV4dGVybiBpbnQgX19jdm14X2hlbHBlcl9ib2FyZF9oYXJkd2FyZV9lbmFibGUoaW50IGludGVyZmFjZSk7CiAKK2VudW0gY3ZteF9oZWxwZXJfYm9hcmRfdXNiX2Nsb2NrX3R5cGVzIF9fY3ZteF9oZWxwZXJfYm9hcmRfdXNiX2dldF9jbG9ja190eXBlKHZvaWQpOworCiAjZW5kaWYgLyogX19DVk1YX0hFTFBFUl9CT0FSRF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IGY2YmU0NzQuLjVlMDhiY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTEsNiArMTEsOCBAQAogCiAjaW5jbHVkZSA8c3BhY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KIAogLyoKICAqIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplCkBAIC0zMyw2ICszNSwyOSBAQAogI2RlZmluZSBQQUdFX1NJWkUJKF9BQygxLFVMKSA8PCBQQUdFX1NISUZUKQogI2RlZmluZSBQQUdFX01BU0sJKH4oKDEgPDwgUEFHRV9TSElGVCkgLSAxKSkKIAorLyoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIHJlYWwgcGFnZSBzaXplcworICogZm9yIEZUTEIgb3IgVlRMQiArIEZUTEIgY29uZnVncmF0aW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGFnZV9zaXplX2Z0bGIodW5zaWduZWQgaW50IG1tdWV4dGRlZikKK3sKKwlzd2l0Y2ggKG1tdWV4dGRlZikgeworCWNhc2UgTUlQU19DT05GNF9NTVVFWFRERUZfRlRMQlNJWkVFWFQ6CisJCWlmIChQQUdFX1NJWkUgPT0gKDEgPDwgMzApKQorCQkJcmV0dXJuIDU7CisJCWlmIChQQUdFX1NJWkUgPT0gKDFsbHUgPDwgMzIpKQorCQkJcmV0dXJuIDY7CisJCWlmIChQQUdFX1NJWkUgPiAoMjU2IDw8IDEwKSkKKwkJCXJldHVybiA3OyAvKiByZXNlcnZlZCAqLworCQkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBNSVBTX0NPTkY0X01NVUVYVERFRl9WVExCU0laRUVYVDoKKwkJcmV0dXJuIChQQUdFX1NISUZUIC0gMTApIC8gMjsKKwlkZWZhdWx0OgorCQlwYW5pYygiSW52YWxpZCBGVExCIGNvbmZpZ3VyYXRpb24gd2l0aCBDb25mNF9tbXVleHRkZWY9JWQgdmFsdWVcbiIsCisJCSAgICAgIG1tdWV4dGRlZiA+PiAxNCk7CisJfQorfQorCiAjaWZkZWYgQ09ORklHX01JUFNfSFVHRV9UTEJfU1VQUE9SVAogI2RlZmluZSBIUEFHRV9TSElGVAkoUEFHRV9TSElGVCArIFBBR0VfU0hJRlQgLSAzKQogI2RlZmluZSBIUEFHRV9TSVpFCShfQUMoMSxVTCkgPDwgSFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcnRseC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3J0bHguaAppbmRleCA5MDk4NWI2Li5jMTAyMDY1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcnRseC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ydGx4LmgKQEAgLTEsMTMgKzEsMTggQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwotCiAjaWZuZGVmIF9fQVNNX1JUTFhfSF8KICNkZWZpbmUgX19BU01fUlRMWF9IXwogCiAjaW5jbHVkZSA8aXJxLmg+CiAKKyNkZWZpbmUgUlRMWF9NT0RVTEVfTkFNRSAicnRseCIKKwogI2RlZmluZSBMWF9OT0RFX0JBU0UgMTAKIAogI2RlZmluZSBNSVBTX0NQVV9SVExYX0lSUSAwCkBAIC0xNSwxOCArMjAsMzEgQEAKICNkZWZpbmUgUlRMWF9WRVJTSU9OIDIKICNkZWZpbmUgUlRMWF94SUQgMHgxMjM0NTYwMAogI2RlZmluZSBSVExYX0lEIChSVExYX3hJRCB8IFJUTFhfVkVSU0lPTikKKyNkZWZpbmUgUlRMWF9CVUZGRVJfU0laRSAyMDQ4CiAjZGVmaW5lIFJUTFhfQ0hBTk5FTFMgOAogCiAjZGVmaW5lIFJUTFhfQ0hBTk5FTF9TVERJTwkwCiAjZGVmaW5lIFJUTFhfQ0hBTk5FTF9EQkcJMQogI2RlZmluZSBSVExYX0NIQU5ORUxfU1lTSU8JMgogCi1leHRlcm4gaW50IHJ0bHhfb3BlbihpbnQgaW5kZXgsIGludCBjYW5fc2xlZXApOwotZXh0ZXJuIGludCBydGx4X3JlbGVhc2UoaW50IGluZGV4KTsKLWV4dGVybiBzc2l6ZV90IHJ0bHhfcmVhZChpbnQgaW5kZXgsIHZvaWQgX191c2VyICpidWZmLCBzaXplX3QgY291bnQpOwotZXh0ZXJuIHNzaXplX3QgcnRseF93cml0ZShpbnQgaW5kZXgsIGNvbnN0IHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHJ0bHhfcmVhZF9wb2xsKGludCBpbmRleCwgaW50IGNhbl9zbGVlcCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHJ0bHhfd3JpdGVfcG9sbChpbnQgaW5kZXgpOwordm9pZCBydGx4X3N0YXJ0aW5nKGludCB2cGUpOwordm9pZCBydGx4X3N0b3BwaW5nKGludCB2cGUpOworCitpbnQgcnRseF9vcGVuKGludCBpbmRleCwgaW50IGNhbl9zbGVlcCk7CitpbnQgcnRseF9yZWxlYXNlKGludCBpbmRleCk7Citzc2l6ZV90IHJ0bHhfcmVhZChpbnQgaW5kZXgsIHZvaWQgX191c2VyICpidWZmLCBzaXplX3QgY291bnQpOworc3NpemVfdCBydGx4X3dyaXRlKGludCBpbmRleCwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KTsKK3Vuc2lnbmVkIGludCBydGx4X3JlYWRfcG9sbChpbnQgaW5kZXgsIGludCBjYW5fc2xlZXApOwordW5zaWduZWQgaW50IHJ0bHhfd3JpdGVfcG9sbChpbnQgaW5kZXgpOworCitpbnQgX19pbml0IHJ0bHhfbW9kdWxlX2luaXQodm9pZCk7Cit2b2lkIF9fZXhpdCBydGx4X21vZHVsZV9leGl0KHZvaWQpOworCit2b2lkIF9pbnRlcnJ1cHRfc3Aodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgcnRseF9ub3RpZnk7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGx4X2ZvcHM7CitleHRlcm4gdm9pZCAoKmFwcnBfaG9vaykodm9pZCk7CiAKIGVudW0gcnRseF9zdGF0ZSB7CiAJUlRMWF9TVEFURV9VTlVTRUQgPSAwLApAQCAtMzUsMTAgKzUzLDE1IEBACiAJUlRMWF9TVEFURV9PUEVORUQKIH07CiAKLSNkZWZpbmUgUlRMWF9CVUZGRVJfU0laRSAyMDQ4CitleHRlcm4gc3RydWN0IGNoYW5fd2FpdHF1ZXVlcyB7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcnRfcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbHhfcXVldWU7CisJYXRvbWljX3QgaW5fb3BlbjsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Cit9IGNoYW5uZWxfd3FzW1JUTFhfQ0hBTk5FTFNdOwogCiAvKiBlYWNoIGNoYW5uZWwgc3VwcG9ydHMgcmVhZCBhbmQgd3JpdGUuCi0gICBsaW51eCAodnBlMCkgcmVhZHMgbHhfYnVmZmVyCSBhbmQgd3JpdGVzIHJ0X2J1ZmZlcgorICAgbGludXggKHZwZTApIHJlYWRzIGx4X2J1ZmZlciBhbmQgd3JpdGVzIHJ0X2J1ZmZlcgogICAgU1AgKHZwZTEpIHJlYWRzIHJ0X2J1ZmZlciBhbmQgd3JpdGVzIGx4X2J1ZmZlcgogKi8KIHN0cnVjdCBydGx4X2NoYW5uZWwgewpAQCAtNTUsMTEgKzc4LDExIEBACiAJY2hhciAqbHhfYnVmZmVyOwogfTsKIAotc3RydWN0IHJ0bHhfaW5mbyB7CitleHRlcm4gc3RydWN0IHJ0bHhfaW5mbyB7CiAJdW5zaWduZWQgbG9uZyBpZDsKIAllbnVtIHJ0bHhfc3RhdGUgc3RhdGU7CisJaW50IGFwX2ludF9wZW5kaW5nOwkvKiBTdGF0dXMgb2YgMCBvciAxIGZvciBDT05GSUdfTUlQU19DTVAgb25seSAqLwogCiAJc3RydWN0IHJ0bHhfY2hhbm5lbCBjaGFubmVsW1JUTFhfQ0hBTk5FTFNdOwotfTsKLQorfSAqcnRseDsKICNlbmRpZiAvKiBfX0FTTV9SVExYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKaW5kZXggZWIwYWYxNS4uMjc4ZDQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaApAQCAtMTksMTEgKzE5LDE5IEBACiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAotLyoKLSAqIHN3aXRjaF90byhuKSBzaG91bGQgc3dpdGNoIHRhc2tzIHRvIHRhc2sgbnIgbiwgZmlyc3QKLSAqIGNoZWNraW5nIHRoYXQgbiBpc24ndCB0aGUgY3VycmVudCB0YXNrLCBpbiB3aGljaCBjYXNlIGl0IGRvZXMgbm90aGluZy4KKy8qKgorICogcmVzdW1lIC0gcmVzdW1lIGV4ZWN1dGlvbiBvZiBhIHRhc2sKKyAqIEBwcmV2OglUaGUgdGFzayBwcmV2aW91c2x5IGV4ZWN1dGVkLgorICogQG5leHQ6CVRoZSB0YXNrIHRvIGJlZ2luIGV4ZWN1dGluZy4KKyAqIEBuZXh0X3RpOgl0YXNrX3RocmVhZF9pbmZvKG5leHQpLgorICogQHVzZWRmcHU6CU5vbi16ZXJvIGlmIHByZXYncyBGUCBjb250ZXh0IHNob3VsZCBiZSBzYXZlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hpbHN0IHNjaGVkdWxpbmcgdG8gc2F2ZSB0aGUgY29udGV4dCBvZiBwcmV2ICYgbG9hZAorICogdGhlIGNvbnRleHQgb2YgbmV4dC4gUmV0dXJucyBwcmV2LgogICovCi1leHRlcm4gYXNtbGlua2FnZSB2b2lkICpyZXN1bWUodm9pZCAqbGFzdCwgdm9pZCAqbmV4dCwgdm9pZCAqbmV4dF90aSwgdTMyIF9fdXNlZGZwdSk7CitleHRlcm4gYXNtbGlua2FnZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlc3VtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCwgc3RydWN0IHRocmVhZF9pbmZvICpuZXh0X3RpLAorCQl1MzIgdXNlZGZwdSk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbGxfYml0OwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqbGxfdGFzazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzY2FsbC5oCmluZGV4IDgxYzg5MTMuLjMzZThkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMjksNyArMjksNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1pcHNfZ2V0X3N5c2NhbGxfYXJnKHVuc2lnbmVkIGxvbmcgKmFyZywKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgbikKIHsKLQl1bnNpZ25lZCBsb25nIHVzcCA9IHJlZ3MtPnJlZ3NbMjldOworCXVuc2lnbmVkIGxvbmcgdXNwIF9fbWF5YmVfdW51c2VkID0gcmVncy0+cmVnc1syOV07CiAKIAlzd2l0Y2ggKG4pIHsKIAljYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDRmNThlZjYuLjI0ODQ2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMTAsMTEgKzExMCwxMiBAQAogI2RlZmluZSBUSUZfTk9IWgkJMTkJLyogaW4gYWRhcHRpdmUgbm9oeiBtb2RlICovCiAjZGVmaW5lIFRJRl9GSVhBREUJCTIwCS8qIEZpeCBhZGRyZXNzIGVycm9ycyBpbiBzb2Z0d2FyZSAqLwogI2RlZmluZSBUSUZfTE9HQURFCQkyMQkvKiBMb2cgYWRkcmVzcyBlcnJvcnMgdG8gc3lzbG9nICovCi0jZGVmaW5lIFRJRl8zMkJJVF9SRUdTCQkyMgkvKiBhbHNvIGltcGxpZXMgMTYvMzIgZnBycyAqLworI2RlZmluZSBUSUZfMzJCSVRfUkVHUwkJMjIJLyogMzItYml0IGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGXzMyQklUX0FERFIJCTIzCS8qIDMyLWJpdCBhZGRyZXNzIHNwYWNlIChvMzIvbjMyKSAqLwogI2RlZmluZSBUSUZfRlBVQk9VTkQJCTI0CS8qIHRocmVhZCBib3VuZCB0byBGUFUtZnVsbCBDUFUgc2V0ICovCiAjZGVmaW5lIFRJRl9MT0FEX1dBVENICQkyNQkvKiBJZiBzZXQsIGxvYWQgd2F0Y2ggcmVnaXN0ZXJzICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFUE9JTlQJMjYJLyogc3lzY2FsbCB0cmFjZXBvaW50IGluc3RydW1lbnRhdGlvbiAqLworI2RlZmluZSBUSUZfMzJCSVRfRlBSRUdTCTI3CS8qIDMyLWJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMzEJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtMTMxLDYgKzEzMiw3IEBACiAjZGVmaW5lIF9USUZfMzJCSVRfQUREUgkJKDE8PFRJRl8zMkJJVF9BRERSKQogI2RlZmluZSBfVElGX0ZQVUJPVU5ECQkoMTw8VElGX0ZQVUJPVU5EKQogI2RlZmluZSBfVElGX0xPQURfV0FUQ0gJCSgxPDxUSUZfTE9BRF9XQVRDSCkKKyNkZWZpbmUgX1RJRl8zMkJJVF9GUFJFR1MJKDE8PFRJRl8zMkJJVF9GUFJFR1MpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQogCiAjZGVmaW5lIF9USUZfV09SS19TWVNDQUxMX0VOVFJZCShfVElGX05PSFogfCBfVElGX1NZU0NBTExfVFJBQ0UgfAlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGxiLmgKaW5kZXggYzY3ODQyYi4uNGEyMzQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90bGIuaApAQCAtMTgsNiArMTgsMTAgQEAKICAqLwogI2RlZmluZSB0bGJfZmx1c2godGxiKSBmbHVzaF90bGJfbW0oKHRsYiktPm1tKQogCisjZGVmaW5lIFVOSVFVRV9FTlRSWUhJKGlkeCkJCQkJCQlcCisJCSgoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKSB8CQlcCisJCSAoY3B1X2hhc190bGJpbnYgPyBNSVBTX0VOVFJZSElfRUhJTlYgOiAwKSkKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RsYi5oPgogCiAjZW5kaWYgLyogX19BU01fVExCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS92cGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS92cGUuaAppbmRleCAwODgwZmU4Li43ODQ5ZjM5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnBlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZwZS5oCkBAIC0xLDI0ICsxLDk1IEBACiAvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCi0KICNpZm5kZWYgX0FTTV9WUEVfSAogI2RlZmluZSBfQVNNX1ZQRV9ICiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgVlBFX01PRFVMRV9OQU1FICJ2cGUiCisjZGVmaW5lIFZQRV9NT0RVTEVfTUlOT1IgMQorCisvKiBncmFiIHRoZSBsaWtlbHkgYW1vdW50IG9mIG1lbW9yeSB3ZSB3aWxsIG5lZWQuICovCisjaWZkZWYgQ09ORklHX01JUFNfVlBFX0xPQURFUl9UT00KKyNkZWZpbmUgUF9TSVpFICgyICogMTAyNCAqIDEwMjQpCisjZWxzZQorLyogYWRkIGFuIG92ZXJoZWFkIHRvIHRoZSBtYXgga21hbGxvYyBzaXplIGZvciBub24tc3RyaXBlZCBzeW1ib2xzL2V0YyAqLworI2RlZmluZSBQX1NJWkUgKDI1NiAqIDEwMjQpCisjZW5kaWYKKworI2RlZmluZSBNQVhfVlBFUyAxNgorI2RlZmluZSBWUEVfUEFUSF9NQVggMjU2CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwcnBfY3B1X2luZGV4KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01JUFNfQ01QCisJcmV0dXJuIHNldHVwX21heF9jcHVzOworI2Vsc2UKKwlleHRlcm4gaW50IHRjbGltaXQ7CisJcmV0dXJuIHRjbGltaXQ7CisjZW5kaWYKK30KKworZW51bSB2cGVfc3RhdGUgeworCVZQRV9TVEFURV9VTlVTRUQgPSAwLAorCVZQRV9TVEFURV9JTlVTRSwKKwlWUEVfU1RBVEVfUlVOTklORworfTsKKworZW51bSB0Y19zdGF0ZSB7CisJVENfU1RBVEVfVU5VU0VEID0gMCwKKwlUQ19TVEFURV9JTlVTRSwKKwlUQ19TVEFURV9SVU5OSU5HLAorCVRDX1NUQVRFX0RZTkFNSUMKK307CisKK3N0cnVjdCB2cGUgeworCWVudW0gdnBlX3N0YXRlIHN0YXRlOworCisJLyogKGRldmljZSkgbWlub3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdnBlICovCisJaW50IG1pbm9yOworCisJLyogZWxmbG9hZGVyIHN0dWZmICovCisJdm9pZCAqbG9hZF9hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWNoYXIgKnBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBwbGVuOworCWNoYXIgY3dkW1ZQRV9QQVRIX01BWF07CisKKwl1bnNpZ25lZCBsb25nIF9fc3RhcnQ7CisKKwkvKiB0YydzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZwZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgdGM7CisKKwkvKiBUaGUgbGlzdCBvZiB2cGUncyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIHNoYXJlZCBzeW1ib2wgYWRkcmVzcyAqLworCXZvaWQgKnNoYXJlZF9wdHI7CisKKwkvKiB0aGUgbGlzdCBvZiB3aG8gd2FudHMgdG8ga25vdyB3aGVuIHNvbWV0aGluZyBtYWpvciBoYXBwZW5zICovCisJc3RydWN0IGxpc3RfaGVhZCBub3RpZnk7CisKKwl1bnNpZ25lZCBpbnQgbnRjczsKK307CisKK3N0cnVjdCB0YyB7CisJZW51bSB0Y19zdGF0ZSBzdGF0ZTsKKwlpbnQgaW5kZXg7CisKKwlzdHJ1Y3QgdnBlICpwdnBlOwkvKiBwYXJlbnQgVlBFICovCisJc3RydWN0IGxpc3RfaGVhZCB0YzsJLyogVGhlIGxpc3Qgb2YgVEMncyB3aXRoIHRoaXMgVlBFICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBUaGUgZ2xvYmFsIGxpc3Qgb2YgdGMncyAqLworfTsKKwogc3RydWN0IHZwZV9ub3RpZmljYXRpb25zIHsKIAl2b2lkICgqc3RhcnQpKGludCB2cGUpOwogCXZvaWQgKCpzdG9wKShpbnQgdnBlKTsKQEAgLTI2LDEwICs5NywzNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKK3N0cnVjdCB2cGVfY29udHJvbCB7CisJc3BpbmxvY2tfdCB2cGVfbGlzdF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgdnBlX2xpc3Q7ICAgICAgLyogVmlydHVhbCBwcm9jZXNzaW5nIGVsZW1lbnRzICovCisJc3BpbmxvY2tfdCB0Y19saXN0X2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCB0Y19saXN0OyAgICAgICAvKiBUaHJlYWQgY29udGV4dHMgKi8KK307CiAKLWV4dGVybiBpbnQgdnBlX25vdGlmeShpbnQgaW5kZXgsIHN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyAqbm90aWZ5KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNpY2FsX21lbXNpemU7CitleHRlcm4gc3RydWN0IHZwZV9jb250cm9sIHZwZWNvbnRyb2w7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cGVfZm9wczsKIAotZXh0ZXJuIHZvaWQgKnZwZV9nZXRfc2hhcmVkKGludCBpbmRleCk7Ci1leHRlcm4gY2hhciAqdnBlX2dldGN3ZChpbnQgaW5kZXgpOworaW50IHZwZV9ub3RpZnkoaW50IGluZGV4LCBzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgKm5vdGlmeSk7CiAKK3ZvaWQgKnZwZV9nZXRfc2hhcmVkKGludCBpbmRleCk7CitjaGFyICp2cGVfZ2V0Y3dkKGludCBpbmRleCk7CisKK3N0cnVjdCB2cGUgKmdldF92cGUoaW50IG1pbm9yKTsKK3N0cnVjdCB0YyAqZ2V0X3RjKGludCBpbmRleCk7CitzdHJ1Y3QgdnBlICphbGxvY192cGUoaW50IG1pbm9yKTsKK3N0cnVjdCB0YyAqYWxsb2NfdGMoaW50IGluZGV4KTsKK3ZvaWQgcmVsZWFzZV92cGUoc3RydWN0IHZwZSAqdik7CisKK3ZvaWQgKmFsbG9jX3Byb2dtZW0odW5zaWduZWQgbG9uZyBsZW4pOwordm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKTsKKworaW50IF9fd2VhayB2cGVfcnVuKHN0cnVjdCB2cGUgKnYpOwordm9pZCBjbGVhbnVwX3RjKHN0cnVjdCB0YyAqdGMpOworCitpbnQgX19pbml0IHZwZV9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgX19leGl0IHZwZV9tb2R1bGVfZXhpdCh2b2lkKTsKICNlbmRpZiAvKiBfQVNNX1ZQRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9pbnN0LmggYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9pbnN0LmgKaW5kZXggZTVhNjc2ZS4uYjM5YmEyNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vaW5zdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2luc3QuaApAQCAtOTgsOCArOTgsOSBAQAogICovCiBlbnVtIGNvcF9vcCB7CiAJbWZjX29wCSAgICAgID0gMHgwMCwgZG1mY19vcAkgICAgPSAweDAxLAotCWNmY19vcAkgICAgICA9IDB4MDIsIG10Y19vcAkgICAgPSAweDA0LAotCWRtdGNfb3AJICAgICAgPSAweDA1LCBjdGNfb3AJICAgID0gMHgwNiwKKwljZmNfb3AJICAgICAgPSAweDAyLCBtZmhjX29wCSAgICA9IDB4MDMsCisJbXRjX29wICAgICAgICA9IDB4MDQsIGRtdGNfb3AJICAgID0gMHgwNSwKKwljdGNfb3AJICAgICAgPSAweDA2LCBtdGhjX29wCSAgICA9IDB4MDcsCiAJYmNfb3AJICAgICAgPSAweDA4LCBjb3Bfb3AJICAgID0gMHgxMCwKIAljb3BtX29wCSAgICAgID0gMHgxOAogfTsKQEAgLTM5Nyw4ICszOTgsMTAgQEAKIAltbV9tb3Z0MV9vcCA9IDB4YTUsCiAJbW1fZnRydW5jd19vcCA9IDB4YWMsCiAJbW1fZm5lZzFfb3AgPSAweGFkLAorCW1tX21maGMxX29wID0gMHhjMCwKIAltbV9mcm91bmRsX29wID0gMHhjYywKIAltbV9mY3Z0ZDFfb3AgPSAweGNkLAorCW1tX210aGMxX29wID0gMHhlMCwKIAltbV9mcm91bmR3X29wID0gMHhlYywKIAltbV9mY3Z0czFfb3AgPSAweGVkLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKaW5kZXggMWRlZTI3OS4uZDZlMTU0YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKQEAgLTM2OSwxNiArMzY5LDE4IEBACiAjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJCShfX05SX0xpbnV4ICsgMzQ2KQogI2RlZmluZSBfX05SX2tjbXAJCQkoX19OUl9MaW51eCArIDM0NykKICNkZWZpbmUgX19OUl9maW5pdF9tb2R1bGUJCShfX05SX0xpbnV4ICsgMzQ4KQorI2RlZmluZSBfX05SX3NjaGVkX3NldGF0dHIJCShfX05SX0xpbnV4ICsgMzQ5KQorI2RlZmluZSBfX05SX3NjaGVkX2dldGF0dHIJCShfX05SX0xpbnV4ICsgMzUwKQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IExpbnV4IG8zMiBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTM0OAorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzNTAKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJMzIgKi8KIAogI2RlZmluZSBfX05SX08zMl9MaW51eAkJCTQwMDAKLSNkZWZpbmUgX19OUl9PMzJfTGludXhfc3lzY2FsbHMJCTM0OAorI2RlZmluZSBfX05SX08zMl9MaW51eF9zeXNjYWxscwkJMzUwCiAKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTY0CiAKQEAgLTY5NSwxNiArNjk3LDE4IEBACiAjZGVmaW5lIF9fTlJfa2NtcAkJCShfX05SX0xpbnV4ICsgMzA2KQogI2RlZmluZSBfX05SX2Zpbml0X21vZHVsZQkJKF9fTlJfTGludXggKyAzMDcpCiAjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJCShfX05SX0xpbnV4ICsgMzA4KQorI2RlZmluZSBfX05SX3NjaGVkX3NldGF0dHIJCShfX05SX0xpbnV4ICsgMzA5KQorI2RlZmluZSBfX05SX3NjaGVkX2dldGF0dHIJCShfX05SX0xpbnV4ICsgMzEwKQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IExpbnV4IDY0LWJpdCBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTMwOAorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzMTAKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJNjQgKi8KIAogI2RlZmluZSBfX05SXzY0X0xpbnV4CQkJNTAwMAotI2RlZmluZSBfX05SXzY0X0xpbnV4X3N5c2NhbGxzCQkzMDgKKyNkZWZpbmUgX19OUl82NF9MaW51eF9zeXNjYWxscwkJMzEwCiAKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgogCkBAIC0xMDI1LDE1ICsxMDI5LDE3IEBACiAjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJCShfX05SX0xpbnV4ICsgMzEwKQogI2RlZmluZSBfX05SX2tjbXAJCQkoX19OUl9MaW51eCArIDMxMSkKICNkZWZpbmUgX19OUl9maW5pdF9tb2R1bGUJCShfX05SX0xpbnV4ICsgMzEyKQorI2RlZmluZSBfX05SX3NjaGVkX3NldGF0dHIJCShfX05SX0xpbnV4ICsgMzEzKQorI2RlZmluZSBfX05SX3NjaGVkX2dldGF0dHIJCShfX05SX0xpbnV4ICsgMzE0KQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IE4zMiBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTMxMgorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzMTQKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fTkFCSTMyICovCiAKICNkZWZpbmUgX19OUl9OMzJfTGludXgJCQk2MDAwCi0jZGVmaW5lIF9fTlJfTjMyX0xpbnV4X3N5c2NhbGxzCQkzMTIKKyNkZWZpbmUgX19OUl9OMzJfTGludXhfc3lzY2FsbHMJCTMxNAogCiAjZW5kaWYgLyogX1VBUElfQVNNX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL2JvYXJkLXFpX2xiNjAuYyBiL2FyY2gvbWlwcy9qejQ3NDAvYm9hcmQtcWlfbGI2MC5jCmluZGV4IDhhNWVjMGUuLmMwMTkwMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qejQ3NDAvYm9hcmQtcWlfbGI2MC5jCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvYm9hcmQtcWlfbGI2MC5jCkBAIC00MjcsNiArNDI3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmp6X3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZqejQ3NDBfdWRjX2RldmljZSwKKwkmano0NzQwX3VkY194Y2Vpdl9kZXZpY2UsCiAJJmp6NDc0MF9tbWNfZGV2aWNlLAogCSZqejQ3NDBfbmFuZF9kZXZpY2UsCiAJJnFpX2xiNjBfa2V5cGFkLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2p6NDc0MC9wbGF0Zm9ybS5jCmluZGV4IGRmNjU2NzcuLmE0NDcxMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qejQ3NDAvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvano0NzQwL3BsYXRmb3JtLmMKQEAgLTE0LDEzICsxNCwxNCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKKyNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi5oPgorCiAjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvaXJxLmg+CkBAIC01NiwyOSArNTcsMzUgQEAKIAkucmVzb3VyY2UJPSBqejQ3NDBfdXNiX29oY2lfcmVzb3VyY2VzLAogfTsKIAotLyogVURDIChVU0IgZ2FkZ2V0IGNvbnRyb2xsZXIpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF91c2JfZ2R0X3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gSlo0NzQwX1VEQ19CQVNFX0FERFIsCi0JCS5lbmQJPSBKWjQ3NDBfVURDX0JBU0VfQUREUiArIDB4MTAwMCAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorLyogVVNCIERldmljZSBDb250cm9sbGVyICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGp6NDc0MF91ZGNfeGNlaXZfZGV2aWNlID0geworCS5uYW1lID0gInVzYl9waHlfZ2VuX3hjZWl2IiwKKwkuaWQgICA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF91ZGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBKWjQ3NDBfVURDX0JBU0VfQUREUiwKKwkJLmVuZCAgID0gSlo0NzQwX1VEQ19CQVNFX0FERFIgKyAweDEwMDAwIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLQl7Ci0JCS5zdGFydAk9IEpaNDc0MF9JUlFfVURDLAotCQkuZW5kCT0gSlo0NzQwX0lSUV9VREMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSlo0NzQwX0lSUV9VREMsCisJCS5lbmQgICA9IEpaNDc0MF9JUlFfVURDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJLm5hbWUgID0gIm1jIiwKIAl9LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdWRjX2RldmljZSA9IHsKLQkubmFtZQkJPSAianotdWRjIiwKLQkuaWQJCT0gLTEsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrID0gJmp6NDc0MF91ZGNfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkubmFtZSA9ICJtdXNiLWp6NDc0MCIsCisJLmlkICAgPSAtMSwKKwkuZGV2ICA9IHsKKwkJLmRtYV9tYXNrICAgICAgICAgID0gJmp6NDc0MF91ZGNfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqejQ3NDBfdXNiX2dkdF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGp6NDc0MF91c2JfZ2R0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoano0NzQwX3VkY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgID0gano0NzQwX3VkY19yZXNvdXJjZXMsCiB9OwogCiAvKiBNTUMvU0QgY29udHJvbGxlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMWMxYjcxNy4uMjZjNjE3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCkBAIC0zMCw2ICszMCw3IEBACiBvYmotJChDT05GSUdfQ1NSQ19TQjEyNTApCSs9IGNzcmMtc2IxMjUwLm8KIG9iai0kKENPTkZJR19TWU5DX1I0SykJCSs9IHN5bmMtcjRrLm8KIAorb2JqLSQoQ09ORklHX0RFQlVHX0ZTKQkJKz0gc2VnbWVudC5vCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1pcHNfa3N5bXMubyBtb2R1bGUubwogb2JqLSQoQ09ORklHX01PRFVMRVNfVVNFX0VMRl9SRUxBKSArPSBtb2R1bGUtcmVsYS5vCkBAIC01NSw3ICs1NiwxMSBAQAogb2JqLSQoQ09ORklHX0NQVV9NSVBTUjIpCSs9IHNwcmFtLm8KIAogb2JqLSQoQ09ORklHX01JUFNfVlBFX0xPQURFUikJKz0gdnBlLm8KK29iai0kKENPTkZJR19NSVBTX1ZQRV9MT0FERVJfQ01QKSArPSB2cGUtY21wLm8KK29iai0kKENPTkZJR19NSVBTX1ZQRV9MT0FERVJfTVQpICs9IHZwZS1tdC5vCiBvYmotJChDT05GSUdfTUlQU19WUEVfQVBTUF9BUEkpICs9IHJ0bHgubworb2JqLSQoQ09ORklHX01JUFNfVlBFX0FQU1BfQVBJX0NNUCkgKz0gcnRseC1jbXAubworb2JqLSQoQ09ORklHX01JUFNfVlBFX0FQU1BfQVBJX01UKSArPSBydGx4LW10Lm8KIAogb2JqLSQoQ09ORklHX0k4MjU5KQkJKz0gaTgyNTkubwogb2JqLSQoQ09ORklHX0lSUV9DUFUpCQkrPSBpcnFfY3B1Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbzMyLmMKaW5kZXggMjAyZTU4MS4uN2ZhZjVmMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbzMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbzMyLmMKQEAgLTI4LDYgKzI4LDE4IEBACiB0eXBlZGVmIGVsZl9mcHJlZ190IGVsZl9mcHJlZ3NldF90W0VMRl9ORlBSRUddOwogCiAvKgorICogSW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IGF0dGVtcHQgdG8gZXhlY3V0ZSBhbiBPMzIgYmluYXJ5IHdoaWNoCisgKiByZXF1aXJlcyA2NCBiaXQgRlAgKEZSPTEpIG9uIGEgc3lzdGVtIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQgd2UgcmVmdXNlCisgKiB0byBleGVjdXRlIGFueSBiaW5hcnkgd2hpY2ggaGFzIGJpdHMgc3BlY2lmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFjcm8gc2V0CisgKiBpbiBpdHMgRUxGIGhlYWRlciBmbGFncy4KKyAqLworI2lmZGVmIENPTkZJR19NSVBTX08zMl9GUDY0X1NVUFBPUlQKKyMgZGVmaW5lIF9fTUlQU19PMzJfRlA2NF9NVVNUX0JFX1pFUk8JMAorI2Vsc2UKKyMgZGVmaW5lIF9fTUlQU19PMzJfRlA2NF9NVVNUX0JFX1pFUk8JRUZfTUlQU19GUDY0CisjZW5kaWYKKworLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCiAgKi8KICNkZWZpbmUgZWxmX2NoZWNrX2FyY2goaGRyKQkJCQkJCVwKQEAgLTQ0LDYgKzU2LDggQEAKIAlpZiAoKChfX2gtPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgIT0gMCkgJiYJCQlcCiAJICAgICgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpICE9IEVGX01JUFNfQUJJX08zMikpCQlcCiAJCV9fcmVzID0gMDsJCQkJCQlcCisJaWYgKF9faC0+ZV9mbGFncyAmIF9fTUlQU19PMzJfRlA2NF9NVVNUX0JFX1pFUk8pCQlcCisJCV9fcmVzID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19yZXM7CQkJCQkJCQlcCiB9KQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9ibWlwc192ZWMuUyBiL2FyY2gvbWlwcy9rZXJuZWwvYm1pcHNfdmVjLlMKaW5kZXggYmQ3OWM0Zi4uYTViZjczZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ibWlwc192ZWMuUworKysgYi9hcmNoL21pcHMva2VybmVsL2JtaXBzX3ZlYy5TCkBAIC04LDExICs4LDExIEBACiAgKiBSZXNldC9OTUkvcmUtZW50cnkgdmVjdG9ycyBmb3IgQk1JUFMgcHJvY2Vzc29ycwogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlb3BzLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgpAQCAtOTEsMTIgKzkxLDE4IEBACiAJYmVxeglrMCwgYm1pcHNfc21wX2VudHJ5CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM1MDAwKQorCW1mYzAJazAsIENQMF9QUklECisJbGkJazEsIFBSSURfSU1QX0JNSVBTNTAwMAorCWFuZGkJazAsIDB4ZmYwMAorCWJuZQlrMCwgazEsIDFmCisKIAkvKiBpZiB3ZSdyZSBub3Qgb24gY29yZSAwLCB0aGlzIG11c3QgYmUgdGhlIFNNUCBib290IHNpZ25hbCAqLwogCWxpCWsxLCAoMyA8PCAyNSkKIAltZmMwCWswLCAkMjIKIAlhbmQJazAsIGsxCiAJYm5leglrMCwgYm1pcHNfc21wX2VudHJ5Ci0jZW5kaWYKKzE6CisjZW5kaWYgLyogQ09ORklHX0NQVV9CTUlQUzUwMDAgKi8KICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIAkvKiBub3BlLCBpdCdzIGp1c3QgYSByZWd1bGFyIE5NSSAqLwpAQCAtMTM5LDcgKzE0NSwxMiBAQAogCXhvcmkJazAsIDB4MDQKIAltdGMwCWswLCBDUDBfQ09ORklHCiAKKwltZmMwCWswLCBDUDBfUFJJRAorCWFuZGkJazAsIDB4ZmYwMAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzQzNTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzQzODApCisJbGkJazEsIFBSSURfSU1QX0JNSVBTNDNYWAorCWJuZQlrMCwgazEsIDJmCisKIAkvKiBpbml0aWFsaXplIENQVTEncyBsb2NhbCBJLWNhY2hlICovCiAJbGkJazAsIDB4ODAwMDAwMDAKIAlsaQlrMSwgMHg4MDAxMDAwMApAQCAtMTUwLDE0ICsxNjEsMjEgQEAKIDE6CWNhY2hlCUluZGV4X1N0b3JlX1RhZ19JLCAwKGswKQogCWFkZGl1CWswLCAxNgogCWJuZQlrMCwgazEsIDFiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM1MDAwKQorCisJYgkzZgorMjoKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0JNSVBTNDM1MCB8fCBDT05GSUdfQ1BVX0JNSVBTNDM4MCAqLworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCiAJLyogc2V0IGV4Y2VwdGlvbiB2ZWN0b3IgYmFzZSAqLworCWxpCWsxLCBQUklEX0lNUF9CTUlQUzUwMDAKKwlibmUJazAsIGsxLCAzZgorCiAJbGEJazAsIGViYXNlCiAJbHcJazAsIDAoazApCiAJbXRjMAlrMCwgJDE1LCAxCiAJQkFSUklFUgotI2VuZGlmCi0KKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0JNSVBTNTAwMCAqLworMzoKIAkvKiBqdW1wIGJhY2sgdG8ga3NlZzAgaW4gY2FzZSB3ZSBuZWVkIHRvIHJlbWFwIHRoZSBrc2VnMSBhcmVhICovCiAJbGEJazAsIDFmCiAJanIJazAKQEAgLTIyMSw4ICsyMzksMTggQEAKIExFQUYoYm1pcHNfZW5hYmxlX3hrczAxKQogCiAjaWYgZGVmaW5lZChDT05GSUdfWEtTMDEpCi0KKwltZmMwCXQwLCBDUDBfUFJJRAorCWFuZGkJdDIsIHQwLCAweGZmMDAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM0MzgwKQorCWxpCXQxLCBQUklEX0lNUF9CTUlQUzQzWFgKKwlibmUJdDIsIHQxLCAxZgorCisJYW5kaQl0MCwgMHhmZgorCWFkZGl1CXQxLCB0MCwgLVBSSURfUkVWX0JNSVBTNDM4MF9ISQorCWJndHoJdDEsIDJmCisJYWRkaXUJdDAsIC1QUklEX1JFVl9CTUlQUzQzODBfTE8KKwlibHR6CXQwLCAyZgorCiAJbWZjMAl0MCwgJDIyLCAzCiAJbGkJdDEsIDB4MWZmMAogCWxpCXQyLCAoMSA8PCAxMikgfCAoMSA8PCA5KQpAQCAtMjMxLDcgKzI1OSwxMyBAQAogCW9yCXQwLCB0MgogCW10YzAJdDAsICQyMiwgMwogCUJBUlJJRVIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCisJYgkyZgorMToKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0JNSVBTNDM4MCAqLworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCisJbGkJdDEsIFBSSURfSU1QX0JNSVBTNTAwMAorCWJuZQl0MiwgdDEsIDJmCisKIAltZmMwCXQwLCAkMjIsIDUKIAlsaQl0MSwgMHgwMWZmCiAJbGkJdDIsICgxIDw8IDgpIHwgKDEgPDwgNSkKQEAgLTI0MCwxMiArMjc0LDggQEAKIAlvcgl0MCwgdDIKIAltdGMwCXQwLCAkMjIsIDUKIAlCQVJSSUVSCi0jZWxzZQotCi0jZXJyb3IgTWlzc2luZyBYS1MwMSBzZXR1cAotCi0jZW5kaWYKLQorI2VuZGlmIC8qIENPTkZJR19DUFVfQk1JUFM1MDAwICovCisyOgogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1hLUzAxKSAqLwogCiAJanIJcmEKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IGM4MTQyODcuLjUzMGY4MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJdW5zaWduZWQgbG9uZyB0bXAsIGZwdV9pZDsKIAogCXRtcCA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JX19lbmFibGVfZnB1KCk7CisJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7CiAJZnB1X2lkID0gcmVhZF8zMmJpdF9jcDFfcmVnaXN0ZXIoQ1AxX1JFVklTSU9OKTsKIAl3cml0ZV9jMF9zdGF0dXModG1wKTsKIAlyZXR1cm4gZnB1X2lkOwpAQCAtMTYzLDYgKzE2MywyNSBAQAogc3RhdGljIGNoYXIgdW5rbm93bl9pc2FbXSA9IEtFUk5fRVJSIFwKIAkiVW5zdXBwb3J0ZWQgSVNBIHR5cGUsIGMwLmNvbmZpZzA6ICVkLiI7CiAKK3N0YXRpYyB2b2lkIHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCBjb25maWc2OworCS8qCisJICogQ29uZmlnNiBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgYW5kIGl0J3MgY3VycmVudGx5IG9ubHkKKwkgKiB1c2VkIGJ5IHByb0FwdGl2CisJICovCisJaWYgKGMtPmNwdXR5cGUgPT0gQ1BVX1BST0FQVElWKSB7CisJCWNvbmZpZzYgPSByZWFkX2MwX2NvbmZpZzYoKTsKKwkJaWYgKGVuYWJsZSkKKwkJCS8qIEVuYWJsZSBGVExCICovCisJCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZzYgfCBNSVBTX0NPTkY2X0ZUTEJFTik7CisJCWVsc2UKKwkJCS8qIERpc2FibGUgRlRMQiAqLworCQkJd3JpdGVfYzBfY29uZmlnNihjb25maWc2ICYgIH5NSVBTX0NPTkY2X0ZUTEJFTik7CisJCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRlY29kZV9jb25maWcwKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMpCiB7CiAJdW5zaWduZWQgaW50IGNvbmZpZzA7CkBAIC0xNzAsOCArMTg5LDEzIEBACiAKIAljb25maWcwID0gcmVhZF9jMF9jb25maWcoKTsKIAotCWlmICgoKGNvbmZpZzAgJiBNSVBTX0NPTkZfTVQpID4+IDcpID09IDEpCisJLyoKKwkgKiBMb29rIGZvciBTdGFuZGFyZCBUTEIgb3IgRHVhbCBWVExCIGFuZCBGVExCCisJICovCisJaWYgKCgoKGNvbmZpZzAgJiBNSVBTX0NPTkZfTVQpID4+IDcpID09IDEpIHx8CisJICAgICgoKGNvbmZpZzAgJiBNSVBTX0NPTkZfTVQpID4+IDcpID09IDQpKQogCQljLT5vcHRpb25zIHw9IE1JUFNfQ1BVX1RMQjsKKwogCWlzYSA9IChjb25maWcwICYgTUlQU19DT05GX0FUKSA+PiAxMzsKIAlzd2l0Y2ggKGlzYSkgewogCWNhc2UgMDoKQEAgLTIyNiw4ICsyNTAsMTEgQEAKIAkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9GUFU7CiAJCWMtPm9wdGlvbnMgfD0gTUlQU19DUFVfMzJGUFI7CiAJfQotCWlmIChjcHVfaGFzX3RsYikKKwlpZiAoY3B1X2hhc190bGIpIHsKIAkJYy0+dGxic2l6ZSA9ICgoY29uZmlnMSAmIE1JUFNfQ09ORjFfVExCUykgPj4gMjUpICsgMTsKKwkJYy0+dGxic2l6ZXZ0bGIgPSBjLT50bGJzaXplOworCQljLT50bGJzaXplZnRsYnNldHMgPSAwOworCX0KIAogCXJldHVybiBjb25maWcxICYgTUlQU19DT05GX007CiB9CkBAIC0yNzIsNiArMjk5LDggQEAKIAkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9NSUNST01JUFM7CiAJaWYgKGNvbmZpZzMgJiBNSVBTX0NPTkYzX1ZaKQogCQljLT5hc2VzIHw9IE1JUFNfQVNFX1ZaOworCWlmIChjb25maWczICYgTUlQU19DT05GM19TQykKKwkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9TRUdNRU5UUzsKIAogCXJldHVybiBjb25maWczICYgTUlQU19DT05GX007CiB9CkBAIC0yNzksMTIgKzMwOCw1MSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZGVjb2RlX2NvbmZpZzQoc3RydWN0IGNwdWluZm9fbWlwcyAqYykKIHsKIAl1bnNpZ25lZCBpbnQgY29uZmlnNDsKKwl1bnNpZ25lZCBpbnQgbmV3Y2Y0OworCXVuc2lnbmVkIGludCBtbXVleHRkZWY7CisJdW5zaWduZWQgaW50IGZ0bGJfcGFnZSA9IE1JUFNfQ09ORjRfRlRMQlBBR0VTSVpFOwogCiAJY29uZmlnNCA9IHJlYWRfYzBfY29uZmlnNCgpOwogCi0JaWYgKChjb25maWc0ICYgTUlQU19DT05GNF9NTVVFWFRERUYpID09IE1JUFNfQ09ORjRfTU1VRVhUREVGX01NVVNJWkVFWFQKLQkgICAgJiYgY3B1X2hhc190bGIpCi0JCWMtPnRsYnNpemUgKz0gKGNvbmZpZzQgJiBNSVBTX0NPTkY0X01NVVNJWkVFWFQpICogMHg0MDsKKwlpZiAoY3B1X2hhc190bGIpIHsKKwkJaWYgKCgoY29uZmlnNCAmIE1JUFNfQ09ORjRfSUUpID4+IDI5KSA9PSAyKQorCQkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9UTEJJTlY7CisJCW1tdWV4dGRlZiA9IGNvbmZpZzQgJiBNSVBTX0NPTkY0X01NVUVYVERFRjsKKwkJc3dpdGNoIChtbXVleHRkZWYpIHsKKwkJY2FzZSBNSVBTX0NPTkY0X01NVUVYVERFRl9NTVVTSVpFRVhUOgorCQkJYy0+dGxic2l6ZSArPSAoY29uZmlnNCAmIE1JUFNfQ09ORjRfTU1VU0laRUVYVCkgKiAweDQwOworCQkJYy0+dGxic2l6ZXZ0bGIgPSBjLT50bGJzaXplOworCQkJYnJlYWs7CisJCWNhc2UgTUlQU19DT05GNF9NTVVFWFRERUZfVlRMQlNJWkVFWFQ6CisJCQljLT50bGJzaXpldnRsYiArPQorCQkJCSgoY29uZmlnNCAmIE1JUFNfQ09ORjRfVlRMQlNJWkVFWFQpID4+CisJCQkJICBNSVBTX0NPTkY0X1ZUTEJTSVpFRVhUX1NISUZUKSAqIDB4NDA7CisJCQljLT50bGJzaXplID0gYy0+dGxic2l6ZXZ0bGI7CisJCQlmdGxiX3BhZ2UgPSBNSVBTX0NPTkY0X1ZGVExCUEFHRVNJWkU7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBNSVBTX0NPTkY0X01NVUVYVERFRl9GVExCU0laRUVYVDoKKwkJCW5ld2NmNCA9IChjb25maWc0ICYgfmZ0bGJfcGFnZSkgfAorCQkJCShwYWdlX3NpemVfZnRsYihtbXVleHRkZWYpIDw8CisJCQkJIE1JUFNfQ09ORjRfRlRMQlBBR0VTSVpFX1NISUZUKTsKKwkJCXdyaXRlX2MwX2NvbmZpZzQobmV3Y2Y0KTsKKwkJCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsKKwkJCWNvbmZpZzQgPSByZWFkX2MwX2NvbmZpZzQoKTsKKwkJCWlmIChjb25maWc0ICE9IG5ld2NmNCkgeworCQkJCXByX2VycigiUEFHRV9TSVpFIDB4JWx4IGlzIG5vdCBzdXBwb3J0ZWQgYnkgRlRMQiAoY29uZmlnND0weCV4KVxuIiwKKwkJCQkgICAgICAgUEFHRV9TSVpFLCBjb25maWc0KTsKKwkJCQkvKiBTd2l0Y2ggRlRMQiBvZmYgKi8KKwkJCQlzZXRfZnRsYl9lbmFibGUoYywgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljLT50bGJzaXplZnRsYnNldHMgPSAxIDw8CisJCQkJKChjb25maWc0ICYgTUlQU19DT05GNF9GVExCU0VUUykgPj4KKwkJCQkgTUlQU19DT05GNF9GVExCU0VUU19TSElGVCk7CisJCQljLT50bGJzaXplZnRsYndheXMgPSAoKGNvbmZpZzQgJiBNSVBTX0NPTkY0X0ZUTEJXQVlTKSA+PgorCQkJCQkgICAgICBNSVBTX0NPTkY0X0ZUTEJXQVlTX1NISUZUKSArIDI7CisJCQljLT50bGJzaXplICs9IGMtPnRsYnNpemVmdGxid2F5cyAqIGMtPnRsYnNpemVmdGxic2V0czsKKwkJCWJyZWFrOworCQl9CisJfQogCiAJYy0+a3NjcmF0Y2hfbWFzayA9IChjb25maWc0ID4+IDE2KSAmIDB4ZmY7CiAKQEAgLTMxMiw2ICszODAsOSBAQAogCiAJYy0+c2NhY2hlLmZsYWdzID0gTUlQU19DQUNIRV9OT1RfUFJFU0VOVDsKIAorCS8qIEVuYWJsZSBGVExCIGlmIHByZXNlbnQgKi8KKwlzZXRfZnRsYl9lbmFibGUoYywgMSk7CisKIAlvayA9IGRlY29kZV9jb25maWcwKGMpOwkJCS8qIFJlYWQgQ29uZmlnIHJlZ2lzdGVycy4gICovCiAJQlVHX09OKCFvayk7CQkJCS8qIEFyY2ggc3BlYyB2aW9sYXRpb24hCSAqLwogCWlmIChvaykKQEAgLTY3NSw3ICs3NDYsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3Byb2JlX21pcHMoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgdW5zaWduZWQgaW50IGNwdSkKIHsKLQlkZWNvZGVfY29uZmlncyhjKTsKIAlzd2l0Y2ggKGMtPnByb2Nlc3Nvcl9pZCAmIFBSSURfSU1QX01BU0spIHsKIAljYXNlIFBSSURfSU1QXzRLQzoKIAkJYy0+Y3B1dHlwZSA9IENQVV80S0M7CkBAIC03MzksOCArODA5LDI2IEBACiAJCWMtPmNwdXR5cGUgPSBDUFVfNzRLOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiTUlQUyAxMDc0S2MiOwogCQlicmVhazsKKwljYXNlIFBSSURfSU1QX0lOVEVSQVBUSVZfVVA6CisJCWMtPmNwdXR5cGUgPSBDUFVfSU5URVJBUFRJVjsKKwkJX19jcHVfbmFtZVtjcHVdID0gIk1JUFMgaW50ZXJBcHRpdiI7CisJCWJyZWFrOworCWNhc2UgUFJJRF9JTVBfSU5URVJBUFRJVl9NUDoKKwkJYy0+Y3B1dHlwZSA9IENQVV9JTlRFUkFQVElWOworCQlfX2NwdV9uYW1lW2NwdV0gPSAiTUlQUyBpbnRlckFwdGl2IChtdWx0aSkiOworCQlicmVhazsKKwljYXNlIFBSSURfSU1QX1BST0FQVElWX1VQOgorCQljLT5jcHV0eXBlID0gQ1BVX1BST0FQVElWOworCQlfX2NwdV9uYW1lW2NwdV0gPSAiTUlQUyBwcm9BcHRpdiI7CisJCWJyZWFrOworCWNhc2UgUFJJRF9JTVBfUFJPQVBUSVZfTVA6CisJCWMtPmNwdXR5cGUgPSBDUFVfUFJPQVBUSVY7CisJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIHByb0FwdGl2IChtdWx0aSkiOworCQlicmVhazsKIAl9CiAKKwlkZWNvZGVfY29uZmlncyhjKTsKKwogCXNwcmFtX2NvbmZpZygpOwogfQogCkBAIC05NDMsNiArMTAzMSw3IEBACiAKIAlzd2l0Y2ggKGMtPnByb2Nlc3Nvcl9pZCAmIFBSSURfSU1QX01BU0spIHsKIAljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUDJYWDoKKwljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUDlYWDoKIAkJYy0+Y3B1dHlwZSA9IENQVV9YTFA7CiAJCV9fY3B1X25hbWVbY3B1XSA9ICJCcm9hZGNvbSBYTFBJSSI7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcmFzaC5jCmluZGV4IDkzYWEzMDIuLmQyMTI2NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL21pcHMva2VybmVsL2NyYXNoLmMKQEAgLTUsNyArNSw2IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggNDdkNzU4My4uZDg0ZjZhNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtNDc2LDYgKzQ3Niw3IEBACiAJQlVJTERfSEFORExFUiBvdiBvdiBzdGkgc2lsZW50CQkJLyogIzEyICovCiAJQlVJTERfSEFORExFUiB0ciB0ciBzdGkgc2lsZW50CQkJLyogIzEzICovCiAJQlVJTERfSEFORExFUiBmcGUgZnBlIGZwZSBzaWxlbnQJCS8qICMxNSAqLworCUJVSUxEX0hBTkRMRVIgZnRsYiBmdGxiIG5vbmUgc2lsZW50CQkvKiAjMTYgKi8KIAlCVUlMRF9IQU5ETEVSIG1kbXggbWRteCBzdGkgc2lsZW50CQkvKiAjMjIgKi8KICNpZmRlZglDT05GSUdfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pZGxlLmMgYi9hcmNoL21pcHMva2VybmVsL2lkbGUuYwppbmRleCBmNzk5MWQ5Li4zNTUzMjQzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lkbGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lkbGUuYwpAQCAtMTg0LDYgKzE4NCw4IEBACiAJY2FzZSBDUFVfMjRLOgogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCWNhc2UgQ1BVX1BST0FQVElWOgogCQljcHVfd2FpdCA9IHI0a193YWl0OwogCQlpZiAocmVhZF9jMF9jb25maWc3KCkgJiBNSVBTX0NPTkY3X1dJSSkKIAkJCWNwdV93YWl0ID0gcjRrX3dhaXRfaXJxb2ZmOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2MuYwppbmRleCA4YzU4ZDhhLi4wMGQyMDk3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2MuYwpAQCAtNjUsMjYgKzY1LDI1IEBACiAJCQkJY3B1X2RhdGFbbl0ud2F0Y2hfcmVnX21hc2tzW2ldKTsKIAkJc2VxX3ByaW50ZihtLCAiXVxuIik7CiAJfQotCWlmIChjcHVfaGFzX21pcHNfcikgewotCQlzZXFfcHJpbnRmKG0sICJpc2FcdFx0XHQ6IG1pcHMxIik7Ci0JCWlmIChjcHVfaGFzX21pcHNfMikKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzMiIpOwotCQlpZiAoY3B1X2hhc19taXBzXzMpCi0JCQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbWlwczMiKTsKLQkJaWYgKGNwdV9oYXNfbWlwc180KQotCQkJc2VxX3ByaW50ZihtLCAiJXMiLCAiIG1pcHM0Iik7Ci0JCWlmIChjcHVfaGFzX21pcHNfNSkKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzNSIpOwotCQlpZiAoY3B1X2hhc19taXBzMzJyMSkKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzMzJyMSIpOwotCQlpZiAoY3B1X2hhc19taXBzMzJyMikKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzMzJyMiIpOwotCQlpZiAoY3B1X2hhc19taXBzNjRyMSkKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzNjRyMSIpOwotCQlpZiAoY3B1X2hhc19taXBzNjRyMikKLQkJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzNjRyMiIpOwotCQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCX0KKworCXNlcV9wcmludGYobSwgImlzYVx0XHRcdDogbWlwczEiKTsKKwlpZiAoY3B1X2hhc19taXBzXzIpCisJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzMiIpOworCWlmIChjcHVfaGFzX21pcHNfMykKKwkJc2VxX3ByaW50ZihtLCAiJXMiLCAiIG1pcHMzIik7CisJaWYgKGNwdV9oYXNfbWlwc180KQorCQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbWlwczQiKTsKKwlpZiAoY3B1X2hhc19taXBzXzUpCisJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzNSIpOworCWlmIChjcHVfaGFzX21pcHMzMnIxKQorCQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbWlwczMycjEiKTsKKwlpZiAoY3B1X2hhc19taXBzMzJyMikKKwkJc2VxX3ByaW50ZihtLCAiJXMiLCAiIG1pcHMzMnIyIik7CisJaWYgKGNwdV9oYXNfbWlwczY0cjEpCisJCXNlcV9wcmludGYobSwgIiVzIiwgIiBtaXBzNjRyMSIpOworCWlmIChjcHVfaGFzX21pcHM2NHIyKQorCQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbWlwczY0cjIiKTsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOwogCiAJc2VxX3ByaW50ZihtLCAiQVNFcyBpbXBsZW1lbnRlZFx0OiIpOwogCWlmIChjcHVfaGFzX21pcHMxNikJc2VxX3ByaW50ZihtLCAiJXMiLCAiIG1pcHMxNiIpOwpAQCAtMTA3LDcgKzEwNiwxNCBAQAogCXNlcV9wcmludGYobSwgImtzY3JhdGNoIHJlZ2lzdGVyc1x0OiAlZFxuIiwKIAkJICAgICAgaHdlaWdodDgoY3B1X2RhdGFbbl0ua3NjcmF0Y2hfbWFzaykpOwogCXNlcV9wcmludGYobSwgImNvcmVcdFx0XHQ6ICVkXG4iLCBjcHVfZGF0YVtuXS5jb3JlKTsKLQorI2lmIGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCisJaWYgKGNwdV9oYXNfbWlwc210KSB7CisJCXNlcV9wcmludGYobSwgIlZQRVx0XHRcdDogJWRcbiIsIGNwdV9kYXRhW25dLnZwZV9pZCk7CisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQorCQlzZXFfcHJpbnRmKG0sICJUQ1x0XHRcdDogJWRcbiIsIGNwdV9kYXRhW25dLnRjX2lkKTsKKyNlbmRpZgorCX0KKyNlbmRpZgogCXNwcmludGYoZm10LCAiVkNFJSVjIGV4Y2VwdGlvbnNcdFx0OiAlc1xuIiwKIAkJICAgICAgY3B1X2hhc192Y2UgPyAiJXUiIDogIm5vdCBhdmFpbGFibGUiKTsKIAlzZXFfcHJpbnRmKG0sIGZtdCwgJ0QnLCB2Y2VkX2NvdW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZGRjNzYxMC4uNmFlNTQwZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTYwLDE1ICs2MCwxMSBAQAogCiAJLyogTmV3IHRocmVhZCBsb3NlcyBrZXJuZWwgcHJpdmlsZWdlcy4gKi8KIAlzdGF0dXMgPSByZWdzLT5jcDBfc3RhdHVzICYgfihTVDBfQ1UwfFNUMF9DVTF8U1QwX0ZSfEtVX01BU0spOwotI2lmZGVmIENPTkZJR182NEJJVAotCXN0YXR1cyB8PSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9SRUdTKSA/IDAgOiBTVDBfRlI7Ci0jZW5kaWYKIAlzdGF0dXMgfD0gS1VfVVNFUjsKIAlyZWdzLT5jcDBfc3RhdHVzID0gc3RhdHVzOwogCWNsZWFyX3VzZWRfbWF0aCgpOwogCWNsZWFyX2ZwdV9vd25lcigpOwotCWlmIChjcHVfaGFzX2RzcCkKLQkJX19pbml0X2RzcCgpOworCWluaXRfZHNwKCk7CiAJcmVncy0+Y3AwX2VwYyA9IHBjOwogCXJlZ3MtPnJlZ3NbMjldID0gc3A7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiNTJlMWQyLi43ZGE5Yjc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKQEAgLTEzNywxMyArMTM3LDEzIEBACiAJCWlmIChjcHVfaGFzX21pcHNtdCkgewogCQkJdW5zaWduZWQgaW50IHZwZmxhZ3MgPSBkdnBlKCk7CiAJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQlfX2VuYWJsZV9mcHUoKTsKKwkJCV9fZW5hYmxlX2ZwdShGUFVfQVNfSVMpOwogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIiA6ICI9ciIgKHRtcCkpOwogCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKIAkJCWV2cGUodnBmbGFncyk7CiAJCX0gZWxzZSB7CiAJCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQlfX2VuYWJsZV9mcHUoKTsKKwkJCV9fZW5hYmxlX2ZwdShGUFVfQVNfSVMpOwogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNmYzFcdCUwLCQwIiA6ICI9ciIgKHRtcCkpOwogCQkJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKIAkJfQpAQCAtNDA4LDYgKzQwOCw3IEBACiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwkJZnB1cmVnX3QgKmZyZWdzOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7CiAKIAkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CkBAIC00MTgsMjYgKzQxOSwyOCBAQAogCQkJdG1wID0gcmVncy0+cmVnc1thZGRyXTsKIAkJCWJyZWFrOwogCQljYXNlIEZQUl9CQVNFIC4uLiBGUFJfQkFTRSArIDMxOgotCQkJaWYgKHRza191c2VkX21hdGgoY2hpbGQpKSB7Ci0JCQkJZnB1cmVnX3QgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKKwkJCWlmICghdHNrX3VzZWRfbWF0aChjaGlsZCkpIHsKKwkJCQkvKiBGUCBub3QgeWV0IHVzZWQgKi8KKwkJCQl0bXAgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKIAogI2lmZGVmIENPTkZJR18zMkJJVAorCQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUykpIHsKIAkJCQkvKgogCQkJCSAqIFRoZSBvZGQgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSB0aGUgaGlnaAogCQkJCSAqIG9yZGVyIGJpdHMgb2YgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGV2ZW4KIAkJCQkgKiByZWdpc3RlcnMgLSB1bmxlc3Mgd2UncmUgdXNpbmcgcjJrX3N3aXRjaC5TLgogCQkJCSAqLwogCQkJCWlmIChhZGRyICYgMSkKLQkJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIChmcmVnc1soKGFkZHIgJiB+MSkgLSAzMildID4+IDMyKTsKKwkJCQkJdG1wID0gZnJlZ3NbKGFkZHIgJiB+MSkgLSAzMl0gPj4gMzI7CiAJCQkJZWxzZQotCQkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgKGZyZWdzWyhhZGRyIC0gMzIpXSAmIDB4ZmZmZmZmZmYpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzY0QklUCi0JCQkJdG1wID0gZnJlZ3NbYWRkciAtIEZQUl9CQVNFXTsKLSNlbmRpZgotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSAtMTsJLyogRlAgbm90IHlldCB1c2VkICAqLworCQkJCQl0bXAgPSBmcmVnc1thZGRyIC0gMzJdOworCQkJCWJyZWFrOwogCQkJfQorI2VuZGlmCisJCQl0bXAgPSBmcmVnc1thZGRyIC0gRlBSX0JBU0VdOwogCQkJYnJlYWs7CiAJCWNhc2UgUEM6CiAJCQl0bXAgPSByZWdzLT5jcDBfZXBjOwpAQCAtNDgzLDEzICs0ODYsMTMgQEAKIAkJCWlmIChjcHVfaGFzX21pcHNtdCkgewogCQkJCXVuc2lnbmVkIGludCB2cGZsYWdzID0gZHZwZSgpOwogCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoKTsKKwkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKIAkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKIAkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwogCQkJCWV2cGUodnBmbGFncyk7CiAJCQl9IGVsc2UgewogCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoKTsKKwkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKIAkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKIAkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwogCQkJfQpAQCAtNTU0LDIyICs1NTcsMjUgQEAKIAkJCQljaGlsZC0+dGhyZWFkLmZwdS5mY3IzMSA9IDA7CiAJCQl9CiAjaWZkZWYgQ09ORklHXzMyQklUCi0JCQkvKgotCQkJICogVGhlIG9kZCByZWdpc3RlcnMgYXJlIGFjdHVhbGx5IHRoZSBoaWdoIG9yZGVyIGJpdHMKLQkJCSAqIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuIHJlZ2lzdGVycyAtIHVubGVzcwotCQkJICogd2UncmUgdXNpbmcgcjJrX3N3aXRjaC5TLgotCQkJICovCi0JCQlpZiAoYWRkciAmIDEpIHsKLQkJCQlmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSAmPSAweGZmZmZmZmZmOwotCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBkYXRhKSA8PCAzMjsKLQkJCX0gZWxzZSB7Ci0JCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSAmPSB+MHhmZmZmZmZmZkxMOwotCQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gfD0gZGF0YTsKKwkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgb2RkIHJlZ2lzdGVycyBhcmUgYWN0dWFsbHkgdGhlIGhpZ2gKKwkJCQkgKiBvcmRlciBiaXRzIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuCisJCQkJICogcmVnaXN0ZXJzIC0gdW5sZXNzIHdlJ3JlIHVzaW5nIHIya19zd2l0Y2guUy4KKwkJCQkgKi8KKwkJCQlpZiAoYWRkciAmIDEpIHsKKwkJCQkJZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0gJj0KKwkJCQkJCTB4ZmZmZmZmZmY7CisJCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdIHw9CisJCQkJCQkoKHU2NClkYXRhKSA8PCAzMjsKKwkJCQl9IGVsc2UgeworCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdICY9IH4weGZmZmZmZmZmTEw7CisJCQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gfD0gZGF0YTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQl9CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gPSBkYXRhOwotI2VuZGlmCiAJCQlicmVhazsKIAkJfQogCQljYXNlIFBDOgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCmluZGV4IDk0ODYwNTUuLmI4YWEyZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKQEAgLTgwLDYgKzgwLDcgQEAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOworCQlmcHVyZWdfdCAqZnJlZ3M7CiAJCXVuc2lnbmVkIGludCB0bXA7CiAKIAkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CkBAIC05MCwyMSArOTEsMjUgQEAKIAkJCXRtcCA9IHJlZ3MtPnJlZ3NbYWRkcl07CiAJCQlicmVhazsKIAkJY2FzZSBGUFJfQkFTRSAuLi4gRlBSX0JBU0UgKyAzMToKLQkJCWlmICh0c2tfdXNlZF9tYXRoKGNoaWxkKSkgewotCQkJCWZwdXJlZ190ICpmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7Ci0KKwkJCWlmICghdHNrX3VzZWRfbWF0aChjaGlsZCkpIHsKKwkJCQkvKiBGUCBub3QgeWV0IHVzZWQgKi8KKwkJCQl0bXAgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKKwkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGUgb2RkIHJlZ2lzdGVycyBhcmUgYWN0dWFsbHkgdGhlIGhpZ2gKIAkJCQkgKiBvcmRlciBiaXRzIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuCiAJCQkJICogcmVnaXN0ZXJzIC0gdW5sZXNzIHdlJ3JlIHVzaW5nIHIya19zd2l0Y2guUy4KIAkJCQkgKi8KIAkJCQlpZiAoYWRkciAmIDEpCi0JCQkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSAoZnJlZ3NbKChhZGRyICYgfjEpIC0gMzIpXSA+PiAzMik7CisJCQkJCXRtcCA9IGZyZWdzWyhhZGRyICYgfjEpIC0gMzJdID4+IDMyOwogCQkJCWVsc2UKLQkJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIChmcmVnc1soYWRkciAtIDMyKV0gJiAweGZmZmZmZmZmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG1wID0gLTE7CS8qIEZQIG5vdCB5ZXQgdXNlZCAgKi8KKwkJCQkJdG1wID0gZnJlZ3NbYWRkciAtIDMyXTsKKwkJCQlicmVhazsKIAkJCX0KKwkJCXRtcCA9IGZyZWdzW2FkZHIgLSBGUFJfQkFTRV07CiAJCQlicmVhazsKIAkJY2FzZSBQQzoKIAkJCXRtcCA9IHJlZ3MtPmNwMF9lcGM7CkBAIC0xNDcsMTMgKzE1MiwxMyBAQAogCQkJaWYgKGNwdV9oYXNfbWlwc210KSB7CiAJCQkJdW5zaWduZWQgaW50IHZwZmxhZ3MgPSBkdnBlKCk7CiAJCQkJZmxhZ3MgPSByZWFkX2MwX3N0YXR1cygpOwotCQkJCV9fZW5hYmxlX2ZwdSgpOworCQkJCV9fZW5hYmxlX2ZwdShGUFVfQVNfSVMpOwogCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJjZmMxXHQlMCwkMCI6ICI9ciIgKHRtcCkpOwogCQkJCXdyaXRlX2MwX3N0YXR1cyhmbGFncyk7CiAJCQkJZXZwZSh2cGZsYWdzKTsKIAkJCX0gZWxzZSB7CiAJCQkJZmxhZ3MgPSByZWFkX2MwX3N0YXR1cygpOwotCQkJCV9fZW5hYmxlX2ZwdSgpOworCQkJCV9fZW5hYmxlX2ZwdShGUFVfQVNfSVMpOwogCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJjZmMxXHQlMCwkMCI6ICI9ciIgKHRtcCkpOwogCQkJCXdyaXRlX2MwX3N0YXR1cyhmbGFncyk7CiAJCQl9CkBAIC0yMzYsMjAgKzI0MSwyNCBAQAogCQkJCSAgICAgICBzaXplb2YoY2hpbGQtPnRocmVhZC5mcHUpKTsKIAkJCQljaGlsZC0+dGhyZWFkLmZwdS5mY3IzMSA9IDA7CiAJCQl9Ci0JCQkvKgotCQkJICogVGhlIG9kZCByZWdpc3RlcnMgYXJlIGFjdHVhbGx5IHRoZSBoaWdoIG9yZGVyIGJpdHMKLQkJCSAqIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuIHJlZ2lzdGVycyAtIHVubGVzcwotCQkJICogd2UncmUgdXNpbmcgcjJrX3N3aXRjaC5TLgotCQkJICovCi0JCQlpZiAoYWRkciAmIDEpIHsKLQkJCQlmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSAmPSAweGZmZmZmZmZmOwotCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBkYXRhKSA8PCAzMjsKLQkJCX0gZWxzZSB7Ci0JCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSAmPSB+MHhmZmZmZmZmZkxMOwotCQkJCS8qIE11c3QgY2FzdCwgbGVzdCBzaWduIGV4dGVuc2lvbiBmaWxsIHVwcGVyCi0JCQkJICAgYml0cyEgICovCi0JCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSB8PSAodW5zaWduZWQgaW50KWRhdGE7CisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfRlBSRUdTKSkgeworCQkJCS8qCisJCQkJICogVGhlIG9kZCByZWdpc3RlcnMgYXJlIGFjdHVhbGx5IHRoZSBoaWdoCisJCQkJICogb3JkZXIgYml0cyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbgorCQkJCSAqIHJlZ2lzdGVycyAtIHVubGVzcyB3ZSdyZSB1c2luZyByMmtfc3dpdGNoLlMuCisJCQkJICovCisJCQkJaWYgKGFkZHIgJiAxKSB7CisJCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdICY9CisJCQkJCQkweGZmZmZmZmZmOworCQkJCQlmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSB8PQorCQkJCQkJKCh1NjQpZGF0YSkgPDwgMzI7CisJCQkJfSBlbHNlIHsKKwkJCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSAmPSB+MHhmZmZmZmZmZkxMOworCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdIHw9IGRhdGE7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQorCQkJZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSA9IGRhdGE7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIFBDOgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfZnB1LlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUwppbmRleCA1NWZmZTE0Li4yNTNiMmZiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUwpAQCAtMzUsNyArMzUsMTUgQEAKIExFQUYoX3NhdmVfZnBfY29udGV4dCkKIAljZmMxCXQxLCBmY3IzMQogCi0jaWZkZWYgQ09ORklHXzY0QklUCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX01JUFMzMl9SMikKKwkuc2V0CXB1c2gKKyNpZmRlZiBDT05GSUdfTUlQUzMyX1IyCisJLnNldAltaXBzNjRyMgorCW1mYzAJdDAsIENQMF9TVEFUVVMKKwlzbGwJdDAsIHQwLCA1CisJYmdlegl0MCwgMWYJCQkjIHNraXAgc3RvcmluZyBvZGQgaWYgRlI9MAorCSBub3AKKyNlbmRpZgogCS8qIFN0b3JlIHRoZSAxNiBvZGQgZG91YmxlIHByZWNpc2lvbiByZWdpc3RlcnMgKi8KIAlFWAlzZGMxICRmMSwgU0NfRlBSRUdTKzgoYTApCiAJRVgJc2RjMSAkZjMsIFNDX0ZQUkVHUysyNChhMCkKQEAgLTUzLDYgKzYxLDcgQEAKIAlFWAlzZGMxICRmMjcsIFNDX0ZQUkVHUysyMTYoYTApCiAJRVgJc2RjMSAkZjI5LCBTQ19GUFJFR1MrMjMyKGEwKQogCUVYCXNkYzEgJGYzMSwgU0NfRlBSRUdTKzI0OChhMCkKKzE6CS5zZXQJcG9wCiAjZW5kaWYKIAogCS8qIFN0b3JlIHRoZSAxNiBldmVuIGRvdWJsZSBwcmVjaXNpb24gcmVnaXN0ZXJzICovCkBAIC04Miw3ICs5MSwzMSBAQAogTEVBRihfc2F2ZV9mcF9jb250ZXh0MzIpCiAJY2ZjMQl0MSwgZmNyMzEKIAotCUVYCXNkYzEgJGYwLCBTQzMyX0ZQUkVHUyswKGEwKQorCW1mYzAJdDAsIENQMF9TVEFUVVMKKwlzbGwJdDAsIHQwLCA1CisJYmdlegl0MCwgMWYJCQkjIHNraXAgc3RvcmluZyBvZGQgaWYgRlI9MAorCSBub3AKKworCS8qIFN0b3JlIHRoZSAxNiBvZGQgZG91YmxlIHByZWNpc2lvbiByZWdpc3RlcnMgKi8KKwlFWCAgICAgIHNkYzEgJGYxLCBTQzMyX0ZQUkVHUys4KGEwKQorCUVYICAgICAgc2RjMSAkZjMsIFNDMzJfRlBSRUdTKzI0KGEwKQorCUVYICAgICAgc2RjMSAkZjUsIFNDMzJfRlBSRUdTKzQwKGEwKQorCUVYICAgICAgc2RjMSAkZjcsIFNDMzJfRlBSRUdTKzU2KGEwKQorCUVYICAgICAgc2RjMSAkZjksIFNDMzJfRlBSRUdTKzcyKGEwKQorCUVYICAgICAgc2RjMSAkZjExLCBTQzMyX0ZQUkVHUys4OChhMCkKKwlFWCAgICAgIHNkYzEgJGYxMywgU0MzMl9GUFJFR1MrMTA0KGEwKQorCUVYICAgICAgc2RjMSAkZjE1LCBTQzMyX0ZQUkVHUysxMjAoYTApCisJRVggICAgICBzZGMxICRmMTcsIFNDMzJfRlBSRUdTKzEzNihhMCkKKwlFWCAgICAgIHNkYzEgJGYxOSwgU0MzMl9GUFJFR1MrMTUyKGEwKQorCUVYICAgICAgc2RjMSAkZjIxLCBTQzMyX0ZQUkVHUysxNjgoYTApCisJRVggICAgICBzZGMxICRmMjMsIFNDMzJfRlBSRUdTKzE4NChhMCkKKwlFWCAgICAgIHNkYzEgJGYyNSwgU0MzMl9GUFJFR1MrMjAwKGEwKQorCUVYICAgICAgc2RjMSAkZjI3LCBTQzMyX0ZQUkVHUysyMTYoYTApCisJRVggICAgICBzZGMxICRmMjksIFNDMzJfRlBSRUdTKzIzMihhMCkKKwlFWCAgICAgIHNkYzEgJGYzMSwgU0MzMl9GUFJFR1MrMjQ4KGEwKQorCisJLyogU3RvcmUgdGhlIDE2IGV2ZW4gZG91YmxlIHByZWNpc2lvbiByZWdpc3RlcnMgKi8KKzE6CUVYCXNkYzEgJGYwLCBTQzMyX0ZQUkVHUyswKGEwKQogCUVYCXNkYzEgJGYyLCBTQzMyX0ZQUkVHUysxNihhMCkKIAlFWAlzZGMxICRmNCwgU0MzMl9GUFJFR1MrMzIoYTApCiAJRVgJc2RjMSAkZjYsIFNDMzJfRlBSRUdTKzQ4KGEwKQpAQCAtMTE0LDcgKzE0NywxNiBAQAogICovCiBMRUFGKF9yZXN0b3JlX2ZwX2NvbnRleHQpCiAJRVgJbHcgdDAsIFNDX0ZQQ19DU1IoYTApCi0jaWZkZWYgQ09ORklHXzY0QklUCisKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfTUlQUzMyX1IyKQorCS5zZXQJcHVzaAorI2lmZGVmIENPTkZJR19NSVBTMzJfUjIKKwkuc2V0CW1pcHM2NHIyCisJbWZjMAl0MCwgQ1AwX1NUQVRVUworCXNsbAl0MCwgdDAsIDUKKwliZ2V6CXQwLCAxZgkJCSMgc2tpcCBsb2FkaW5nIG9kZCBpZiBGUj0wCisJIG5vcAorI2VuZGlmCiAJRVgJbGRjMSAkZjEsIFNDX0ZQUkVHUys4KGEwKQogCUVYCWxkYzEgJGYzLCBTQ19GUFJFR1MrMjQoYTApCiAJRVgJbGRjMSAkZjUsIFNDX0ZQUkVHUys0MChhMCkKQEAgLTEzMSw2ICsxNzMsNyBAQAogCUVYCWxkYzEgJGYyNywgU0NfRlBSRUdTKzIxNihhMCkKIAlFWAlsZGMxICRmMjksIFNDX0ZQUkVHUysyMzIoYTApCiAJRVgJbGRjMSAkZjMxLCBTQ19GUFJFR1MrMjQ4KGEwKQorMToJLnNldCBwb3AKICNlbmRpZgogCUVYCWxkYzEgJGYwLCBTQ19GUFJFR1MrMChhMCkKIAlFWAlsZGMxICRmMiwgU0NfRlBSRUdTKzE2KGEwKQpAQCAtMTU3LDcgKzIwMCwzMCBAQAogTEVBRihfcmVzdG9yZV9mcF9jb250ZXh0MzIpCiAJLyogUmVzdG9yZSBhbiBvMzIgc2lnY29udGV4dC4gICovCiAJRVgJbHcgdDAsIFNDMzJfRlBDX0NTUihhMCkKLQlFWAlsZGMxICRmMCwgU0MzMl9GUFJFR1MrMChhMCkKKworCW1mYzAJdDAsIENQMF9TVEFUVVMKKwlzbGwJdDAsIHQwLCA1CisJYmdlegl0MCwgMWYJCQkjIHNraXAgbG9hZGluZyBvZGQgaWYgRlI9MAorCSBub3AKKworCUVYICAgICAgbGRjMSAkZjEsIFNDMzJfRlBSRUdTKzgoYTApCisJRVggICAgICBsZGMxICRmMywgU0MzMl9GUFJFR1MrMjQoYTApCisJRVggICAgICBsZGMxICRmNSwgU0MzMl9GUFJFR1MrNDAoYTApCisJRVggICAgICBsZGMxICRmNywgU0MzMl9GUFJFR1MrNTYoYTApCisJRVggICAgICBsZGMxICRmOSwgU0MzMl9GUFJFR1MrNzIoYTApCisJRVggICAgICBsZGMxICRmMTEsIFNDMzJfRlBSRUdTKzg4KGEwKQorCUVYICAgICAgbGRjMSAkZjEzLCBTQzMyX0ZQUkVHUysxMDQoYTApCisJRVggICAgICBsZGMxICRmMTUsIFNDMzJfRlBSRUdTKzEyMChhMCkKKwlFWCAgICAgIGxkYzEgJGYxNywgU0MzMl9GUFJFR1MrMTM2KGEwKQorCUVYICAgICAgbGRjMSAkZjE5LCBTQzMyX0ZQUkVHUysxNTIoYTApCisJRVggICAgICBsZGMxICRmMjEsIFNDMzJfRlBSRUdTKzE2OChhMCkKKwlFWCAgICAgIGxkYzEgJGYyMywgU0MzMl9GUFJFR1MrMTg0KGEwKQorCUVYICAgICAgbGRjMSAkZjI1LCBTQzMyX0ZQUkVHUysyMDAoYTApCisJRVggICAgICBsZGMxICRmMjcsIFNDMzJfRlBSRUdTKzIxNihhMCkKKwlFWCAgICAgIGxkYzEgJGYyOSwgU0MzMl9GUFJFR1MrMjMyKGEwKQorCUVYICAgICAgbGRjMSAkZjMxLCBTQzMyX0ZQUkVHUysyNDgoYTApCisKKzE6CUVYCWxkYzEgJGYwLCBTQzMyX0ZQUkVHUyswKGEwKQogCUVYCWxkYzEgJGYyLCBTQzMyX0ZQUkVHUysxNihhMCkKIAlFWAlsZGMxICRmNCwgU0MzMl9GUFJFR1MrMzIoYTApCiAJRVgJbGRjMSAkZjYsIFNDMzJfRlBSRUdTKzQ4KGEwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwppbmRleCAwNzhkZTVlLi5jYzc4ZGQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgKiBTYXZlIGEgdGhyZWFkJ3MgZnAgY29udGV4dC4KICAqLwogTEVBRihfc2F2ZV9mcCkKLSNpZmRlZiBDT05GSUdfNjRCSVQKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKIAltZmMwCXQwLCBDUDBfU1RBVFVTCiAjZW5kaWYKIAlmcHVfc2F2ZV9kb3VibGUgYTAgdDAgdDEJCSMgY2xvYmJlcnMgdDEKQEAgLTEzNCw3ICsxMzQsNyBAQAogICogUmVzdG9yZSBhIHRocmVhZCdzIGZwIGNvbnRleHQuCiAgKi8KIExFQUYoX3Jlc3RvcmVfZnApCi0jaWZkZWYgQ09ORklHXzY0QklUCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCiAJbWZjMAl0MCwgQ1AwX1NUQVRVUwogI2VuZGlmCiAJZnB1X3Jlc3RvcmVfZG91YmxlIGEwIHQwIHQxCQkjIGNsb2JiZXJzIHQxCkBAIC0yMjgsNiArMjI4LDQ3IEBACiAJbXRjMQl0MSwgJGYyOQogCW10YzEJdDEsICRmMzAKIAltdGMxCXQxLCAkZjMxCisKKyNpZmRlZiBDT05GSUdfQ1BVX01JUFMzMl9SMgorCS5zZXQgICAgcHVzaAorCS5zZXQgICAgbWlwczY0cjIKKwlzbGwgICAgIHQwLCB0MCwgNQkJCSMgaXMgU3RhdHVzLkZSIHNldD8KKwliZ2V6ICAgIHQwLCAxZgkJCQkjIG5vOiBza2lwIHNldHRpbmcgdXBwZXIgMzJiCisKKwltdGhjMSAgIHQxLCAkZjAKKwltdGhjMSAgIHQxLCAkZjEKKwltdGhjMSAgIHQxLCAkZjIKKwltdGhjMSAgIHQxLCAkZjMKKwltdGhjMSAgIHQxLCAkZjQKKwltdGhjMSAgIHQxLCAkZjUKKwltdGhjMSAgIHQxLCAkZjYKKwltdGhjMSAgIHQxLCAkZjcKKwltdGhjMSAgIHQxLCAkZjgKKwltdGhjMSAgIHQxLCAkZjkKKwltdGhjMSAgIHQxLCAkZjEwCisJbXRoYzEgICB0MSwgJGYxMQorCW10aGMxICAgdDEsICRmMTIKKwltdGhjMSAgIHQxLCAkZjEzCisJbXRoYzEgICB0MSwgJGYxNAorCW10aGMxICAgdDEsICRmMTUKKwltdGhjMSAgIHQxLCAkZjE2CisJbXRoYzEgICB0MSwgJGYxNworCW10aGMxICAgdDEsICRmMTgKKwltdGhjMSAgIHQxLCAkZjE5CisJbXRoYzEgICB0MSwgJGYyMAorCW10aGMxICAgdDEsICRmMjEKKwltdGhjMSAgIHQxLCAkZjIyCisJbXRoYzEgICB0MSwgJGYyMworCW10aGMxICAgdDEsICRmMjQKKwltdGhjMSAgIHQxLCAkZjI1CisJbXRoYzEgICB0MSwgJGYyNgorCW10aGMxICAgdDEsICRmMjcKKwltdGhjMSAgIHQxLCAkZjI4CisJbXRoYzEgICB0MSwgJGYyOQorCW10aGMxICAgdDEsICRmMzAKKwltdGhjMSAgIHQxLCAkZjMxCisxOgkuc2V0ICAgIHBvcAorI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQUzMyX1IyICovCiAjZWxzZQogCS5zZXQJbWlwczMKIAlkbXRjMQl0MSwgJGYwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3J0bHgtY21wLmMgYi9hcmNoL21pcHMva2VybmVsL3J0bHgtY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkYzY5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1jbXAuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9taXBzX210Lmg+CisjaW5jbHVkZSA8YXNtL3ZwZS5oPgorI2luY2x1ZGUgPGFzbS9ydGx4Lmg+CisKK3N0YXRpYyBpbnQgbWFqb3I7CisKK3N0YXRpYyB2b2lkIHJ0bHhfaW50ZXJydXB0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHJ0bHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcnRseF9pbmZvICoqcCA9IHZwZV9nZXRfc2hhcmVkKGFwcnBfY3B1X2luZGV4KCkpOworCisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpbmZvID0gKnA7CisKKwlpZiAoaW5mby0+YXBfaW50X3BlbmRpbmcgPT0gMSAmJiBzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKSB7CisJCQl3YWtlX3VwKCZjaGFubmVsX3dxc1tpXS5seF9xdWV1ZSk7CisJCQl3YWtlX3VwKCZjaGFubmVsX3dxc1tpXS5ydF9xdWV1ZSk7CisJCX0KKwkJaW5mby0+YXBfaW50X3BlbmRpbmcgPSAwOworCX0KK30KKwordm9pZCBfaW50ZXJydXB0X3NwKHZvaWQpCit7CisJc21wX3NlbmRfcmVzY2hlZHVsZShhcHJwX2NwdV9pbmRleCgpKTsKK30KKworaW50IF9faW5pdCBydGx4X21vZHVsZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBpLCBlcnI7CisKKwlpZiAoIWNwdV9oYXNfbWlwc210KSB7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IG5vdCBhIE1JUFMgTVQgY2FwYWJsZSBwcm9jZXNzb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSAtIGFwcnBfY3B1X2luZGV4KCkgPCAxKSB7CisJCXByX3dhcm4oIk5vIFRDcyByZXNlcnZlZCBmb3IgQVAvU1AsIG5vdCBpbml0aWFsaXppbmcgUlRMWC5cbiIKKwkJCSJQYXNzIG1heGNwdXM9PG4+IGFyZ3VtZW50IGFzIGtlcm5lbCBhcmd1bWVudFxuIik7CisKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgUlRMWF9NT0RVTEVfTkFNRSwgJnJ0bHhfZm9wcyk7CisJaWYgKG1ham9yIDwgMCkgeworCQlwcl9lcnIoInJ0bHhfbW9kdWxlX2luaXQ6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gbWFqb3I7CisJfQorCisJLyogaW5pdGlhbGlzZSB0aGUgd2FpdCBxdWV1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoYW5uZWxfd3FzW2ldLnJ0X3F1ZXVlKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hhbm5lbF93cXNbaV0ubHhfcXVldWUpOworCQlhdG9taWNfc2V0KCZjaGFubmVsX3dxc1tpXS5pbl9vcGVuLCAwKTsKKwkJbXV0ZXhfaW5pdCgmY2hhbm5lbF93cXNbaV0ubXV0ZXgpOworCisJCWRldiA9IGRldmljZV9jcmVhdGUobXRfY2xhc3MsIE5VTEwsIE1LREVWKG1ham9yLCBpKSwgTlVMTCwKKwkJCQkgICAgIiVzJWQiLCBSVExYX01PRFVMRV9OQU1FLCBpKTsKKwkJaWYgKElTX0VSUihkZXYpKSB7CisJCQllcnIgPSBQVFJfRVJSKGRldik7CisJCQlnb3RvIG91dF9jaHJkZXY7CisJCX0KKwl9CisKKwkvKiBzZXQgdXAgbm90aWZpZXJzICovCisJcnRseF9ub3RpZnkuc3RhcnQgPSBydGx4X3N0YXJ0aW5nOworCXJ0bHhfbm90aWZ5LnN0b3AgPSBydGx4X3N0b3BwaW5nOworCXZwZV9ub3RpZnkoYXBycF9jcHVfaW5kZXgoKSwgJnJ0bHhfbm90aWZ5KTsKKworCWlmIChjcHVfaGFzX3ZpbnQpIHsKKwkJYXBycF9ob29rID0gcnRseF9pbnRlcnJ1cHQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJBUFJQIFJUTFggaW5pdCBvbiBub24tdmVjdG9yZWQtaW50ZXJydXB0IHByb2Nlc3NvclxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCXJldHVybiAwOworCitvdXRfY2xhc3M6CisJZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykKKwkJZGV2aWNlX2Rlc3Ryb3kobXRfY2xhc3MsIE1LREVWKG1ham9yLCBpKSk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBSVExYX01PRFVMRV9OQU1FKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IHJ0bHhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSVExYX0NIQU5ORUxTOyBpKyspCisJCWRldmljZV9kZXN0cm95KG10X2NsYXNzLCBNS0RFVihtYWpvciwgaSkpOworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBSVExYX01PRFVMRV9OQU1FKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LW10LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkNjFiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1tdC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21pcHNfbXQuaD4KKyNpbmNsdWRlIDxhc20vdnBlLmg+CisjaW5jbHVkZSA8YXNtL3J0bHguaD4KKworc3RhdGljIGludCBtYWpvcjsKKworc3RhdGljIHZvaWQgcnRseF9kaXNwYXRjaCh2b2lkKQoreworCWlmIChyZWFkX2MwX2NhdXNlKCkgJiByZWFkX2MwX3N0YXR1cygpICYgQ19TVzApCisJCWRvX0lSUShNSVBTX0NQVV9JUlFfQkFTRSArIE1JUFNfQ1BVX1JUTFhfSVJRKTsKK30KKworLyoKKyAqIEludGVycnVwdCBoYW5kbGVyIG1heSBiZSBjYWxsZWQgYmVmb3JlIHJ0bHhfaW5pdCBoYXMgb3RoZXJ3aXNlIGhhZAorICogYSBjaGFuY2UgdG8gcnVuLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRseF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGludCB2cGVmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogT3VnaHQgbm90IHRvIGJlIHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IgU01UQyBidWlsZHMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdnBlZmxhZ3MgPSBkdnBlKCk7CisJc2V0X2MwX3N0YXR1cygweDEwMCA8PCBNSVBTX0NQVV9SVExYX0lSUSk7CisJaXJxX2VuYWJsZV9oYXphcmQoKTsKKwlldnBlKHZwZWZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKSB7CisJCXdha2VfdXAoJmNoYW5uZWxfd3FzW2ldLmx4X3F1ZXVlKTsKKwkJd2FrZV91cCgmY2hhbm5lbF93cXNbaV0ucnRfcXVldWUpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcnRseF9pcnEgPSB7CisJLmhhbmRsZXIJPSBydGx4X2ludGVycnVwdCwKKwkubmFtZQkJPSAiUlRMWCIsCit9OworCitzdGF0aWMgaW50IHJ0bHhfaXJxX251bSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgTUlQU19DUFVfUlRMWF9JUlE7CisKK3ZvaWQgX2ludGVycnVwdF9zcCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZHZwZSgpOworCXNldHRjKDEpOworCXdyaXRlX3ZwZV9jMF9jYXVzZShyZWFkX3ZwZV9jMF9jYXVzZSgpIHwgQ19TVzApOworCWV2cGUoRVZQRV9FTkFCTEUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50IF9faW5pdCBydGx4X21vZHVsZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBpLCBlcnI7CisKKwlpZiAoIWNwdV9oYXNfbWlwc210KSB7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IG5vdCBhIE1JUFMgTVQgY2FwYWJsZSBwcm9jZXNzb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoYXBycF9jcHVfaW5kZXgoKSA9PSAwKSB7CisJCXByX3dhcm4oIk5vIFRDcyByZXNlcnZlZCBmb3IgQVAvU1AsIG5vdCBpbml0aWFsaXppbmcgUlRMWC5cbiIKKwkJCSJQYXNzIG1heHRjcz08bj4gYXJndW1lbnQgYXMga2VybmVsIGFyZ3VtZW50XG4iKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBSVExYX01PRFVMRV9OQU1FLCAmcnRseF9mb3BzKTsKKwlpZiAobWFqb3IgPCAwKSB7CisJCXByX2VycigicnRseF9tb2R1bGVfaW5pdDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJldHVybiBtYWpvcjsKKwl9CisKKwkvKiBpbml0aWFsaXNlIHRoZSB3YWl0IHF1ZXVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBSVExYX0NIQU5ORUxTOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hhbm5lbF93cXNbaV0ucnRfcXVldWUpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFubmVsX3dxc1tpXS5seF9xdWV1ZSk7CisJCWF0b21pY19zZXQoJmNoYW5uZWxfd3FzW2ldLmluX29wZW4sIDApOworCQltdXRleF9pbml0KCZjaGFubmVsX3dxc1tpXS5tdXRleCk7CisKKwkJZGV2ID0gZGV2aWNlX2NyZWF0ZShtdF9jbGFzcywgTlVMTCwgTUtERVYobWFqb3IsIGkpLCBOVUxMLAorCQkJCSAgICAiJXMlZCIsIFJUTFhfTU9EVUxFX05BTUUsIGkpOworCQlpZiAoSVNfRVJSKGRldikpIHsKKwkJCWVyciA9IFBUUl9FUlIoZGV2KTsKKwkJCWdvdG8gb3V0X2NocmRldjsKKwkJfQorCX0KKworCS8qIHNldCB1cCBub3RpZmllcnMgKi8KKwlydGx4X25vdGlmeS5zdGFydCA9IHJ0bHhfc3RhcnRpbmc7CisJcnRseF9ub3RpZnkuc3RvcCA9IHJ0bHhfc3RvcHBpbmc7CisJdnBlX25vdGlmeShhcHJwX2NwdV9pbmRleCgpLCAmcnRseF9ub3RpZnkpOworCisJaWYgKGNwdV9oYXNfdmludCkgeworCQlhcHJwX2hvb2sgPSBydGx4X2Rpc3BhdGNoOworCX0gZWxzZSB7CisJCXByX2VycigiQVBSUCBSVExYIGluaXQgb24gbm9uLXZlY3RvcmVkLWludGVycnVwdCBwcm9jZXNzb3JcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlydGx4X2lycS5kZXZfaWQgPSBydGx4OworCWVyciA9IHNldHVwX2lycShydGx4X2lycV9udW0sICZydGx4X2lycSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xhc3M7CisKKwlyZXR1cm4gMDsKKworb3V0X2NsYXNzOgorCWZvciAoaSA9IDA7IGkgPCBSVExYX0NIQU5ORUxTOyBpKyspCisJCWRldmljZV9kZXN0cm95KG10X2NsYXNzLCBNS0RFVihtYWpvciwgaSkpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgUlRMWF9NT0RVTEVfTkFNRSk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIF9fZXhpdCBydGx4X21vZHVsZV9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKQorCQlkZXZpY2VfZGVzdHJveShtdF9jbGFzcywgTUtERVYobWFqb3IsIGkpKTsKKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgUlRMWF9NT0RVTEVfTkFNRSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3J0bHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCmluZGV4IDJjMTJlYTEuLjMxYjFiNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCkBAIC0xLDExNCArMSw1MSBAQAogLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwNSwgMDYgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgogI2luY2x1ZGUgPGFzbS9taXBzX210Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS92cGUuaD4KICNpbmNsdWRlIDxhc20vcnRseC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS92cGUuaD4KIAotc3RhdGljIHN0cnVjdCBydGx4X2luZm8gKnJ0bHg7Ci1zdGF0aWMgaW50IG1ham9yOwotc3RhdGljIGNoYXIgbW9kdWxlX25hbWVbXSA9ICJydGx4IjsKLQotc3RhdGljIHN0cnVjdCBjaGFuX3dhaXRxdWV1ZXMgewotCXdhaXRfcXVldWVfaGVhZF90IHJ0X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGx4X3F1ZXVlOwotCWF0b21pY190IGluX29wZW47Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotfSBjaGFubmVsX3dxc1tSVExYX0NIQU5ORUxTXTsKLQotc3RhdGljIHN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyBub3RpZnk7CiBzdGF0aWMgaW50IHNwX3N0b3BwaW5nOwotCi1leHRlcm4gdm9pZCAqdnBlX2dldF9zaGFyZWQoaW50IGluZGV4KTsKLQotc3RhdGljIHZvaWQgcnRseF9kaXNwYXRjaCh2b2lkKQotewotCWRvX0lSUShNSVBTX0NQVV9JUlFfQkFTRSArIE1JUFNfQ1BVX1JUTFhfSVJRKTsKLX0KLQotCi0vKiBJbnRlcnJ1cHQgaGFuZGxlciBtYXkgYmUgY2FsbGVkIGJlZm9yZSBydGx4X2luaXQgaGFzIG90aGVyd2lzZSBoYWQKLSAgIGEgY2hhbmNlIHRvIHJ1bi4KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgcnRseF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGludCB2cGVmbGFnczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JLyogT3VnaHQgbm90IHRvIGJlIHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IgU01UQyBidWlsZHMgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdnBlZmxhZ3MgPSBkdnBlKCk7Ci0Jc2V0X2MwX3N0YXR1cygweDEwMCA8PCBNSVBTX0NQVV9SVExYX0lSUSk7Ci0JaXJxX2VuYWJsZV9oYXphcmQoKTsKLQlldnBlKHZwZWZsYWdzKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKSB7Ci0JCQl3YWtlX3VwKCZjaGFubmVsX3dxc1tpXS5seF9xdWV1ZSk7Ci0JCQl3YWtlX3VwKCZjaGFubmVsX3dxc1tpXS5ydF9xdWV1ZSk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQorc3RydWN0IHJ0bHhfaW5mbyAqcnRseDsKK3N0cnVjdCBjaGFuX3dhaXRxdWV1ZXMgY2hhbm5lbF93cXNbUlRMWF9DSEFOTkVMU107CitzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgcnRseF9ub3RpZnk7Cit2b2lkICgqYXBycF9ob29rKSh2b2lkKSA9IE5VTEw7CitFWFBPUlRfU1lNQk9MKGFwcnBfaG9vayk7CiAKIHN0YXRpYyB2b2lkIF9fdXNlZCBkdW1wX3J0bHgodm9pZCkKIHsKIAlpbnQgaTsKIAotCXByaW50aygiaWQgMHglbHggc3RhdGUgJWRcbiIsIHJ0bHgtPmlkLCBydGx4LT5zdGF0ZSk7CisJcHJfaW5mbygiaWQgMHglbHggc3RhdGUgJWRcbiIsIHJ0bHgtPmlkLCBydGx4LT5zdGF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKSB7CiAJCXN0cnVjdCBydGx4X2NoYW5uZWwgKmNoYW4gPSAmcnRseC0+Y2hhbm5lbFtpXTsKIAotCQlwcmludGsoIiBydF9zdGF0ZSAlZCBseF9zdGF0ZSAlZCBidWZmZXJfc2l6ZSAlZFxuIiwKLQkJICAgICAgIGNoYW4tPnJ0X3N0YXRlLCBjaGFuLT5seF9zdGF0ZSwgY2hhbi0+YnVmZmVyX3NpemUpOworCQlwcl9pbmZvKCIgcnRfc3RhdGUgJWQgbHhfc3RhdGUgJWQgYnVmZmVyX3NpemUgJWRcbiIsCisJCQljaGFuLT5ydF9zdGF0ZSwgY2hhbi0+bHhfc3RhdGUsIGNoYW4tPmJ1ZmZlcl9zaXplKTsKIAotCQlwcmludGsoIiBydF9yZWFkICVkIHJ0X3dyaXRlICVkXG4iLAotCQkgICAgICAgY2hhbi0+cnRfcmVhZCwgY2hhbi0+cnRfd3JpdGUpOworCQlwcl9pbmZvKCIgcnRfcmVhZCAlZCBydF93cml0ZSAlZFxuIiwKKwkJCWNoYW4tPnJ0X3JlYWQsIGNoYW4tPnJ0X3dyaXRlKTsKIAotCQlwcmludGsoIiBseF9yZWFkICVkIGx4X3dyaXRlICVkXG4iLAotCQkgICAgICAgY2hhbi0+bHhfcmVhZCwgY2hhbi0+bHhfd3JpdGUpOworCQlwcl9pbmZvKCIgbHhfcmVhZCAlZCBseF93cml0ZSAlZFxuIiwKKwkJCWNoYW4tPmx4X3JlYWQsIGNoYW4tPmx4X3dyaXRlKTsKIAotCQlwcmludGsoIiBydF9idWZmZXIgPCVzPlxuIiwgY2hhbi0+cnRfYnVmZmVyKTsKLQkJcHJpbnRrKCIgbHhfYnVmZmVyIDwlcz5cbiIsIGNoYW4tPmx4X2J1ZmZlcik7CisJCXByX2luZm8oIiBydF9idWZmZXIgPCVzPlxuIiwgY2hhbi0+cnRfYnVmZmVyKTsKKwkJcHJfaW5mbygiIGx4X2J1ZmZlciA8JXM+XG4iLCBjaGFuLT5seF9idWZmZXIpOwogCX0KIH0KIApAQCAtMTE2LDggKzUzLDcgQEAKIHN0YXRpYyBpbnQgcnRseF9pbml0KHN0cnVjdCBydGx4X2luZm8gKnJ0bHhpKQogewogCWlmIChydGx4aS0+aWQgIT0gUlRMWF9JRCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5vIHZhbGlkIFJUTFggaWQgYXQgMHglcCAweCVseFxuIiwKLQkJCXJ0bHhpLCBydGx4aS0+aWQpOworCQlwcl9lcnIoIm5vIHZhbGlkIFJUTFggaWQgYXQgMHglcCAweCVseFxuIiwgcnRseGksIHJ0bHhpLT5pZCk7CiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKQEAgLTEyNywyMCArNjMsMjAgQEAKIH0KIAogLyogbm90aWZpY2F0aW9ucyAqLwotc3RhdGljIHZvaWQgc3RhcnRpbmcoaW50IHZwZSkKK3ZvaWQgcnRseF9zdGFydGluZyhpbnQgdnBlKQogewogCWludCBpOwogCXNwX3N0b3BwaW5nID0gMDsKIAogCS8qIGZvcmNlIGEgcmVsb2FkIG9mIHJ0bHggKi8KLQlydGx4PU5VTEw7CisJcnRseCA9IE5VTEw7CiAKIAkvKiB3YWtlIHVwIGFueSBzbGVlcGluZyBydGx4X29wZW4ncyAqLwogCWZvciAoaSA9IDA7IGkgPCBSVExYX0NIQU5ORUxTOyBpKyspCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hhbm5lbF93cXNbaV0ubHhfcXVldWUpOwogfQogCi1zdGF0aWMgdm9pZCBzdG9wcGluZyhpbnQgdnBlKQordm9pZCBydGx4X3N0b3BwaW5nKGludCB2cGUpCiB7CiAJaW50IGk7CiAKQEAgLTE1OCwzMSArOTQsMzAgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChpbmRleCA+PSBSVExYX0NIQU5ORUxTKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGx4X29wZW4gaW5kZXggb3V0IG9mIHJhbmdlXG4iKTsKKwkJcHJfZGVidWcoS0VSTl9ERUJVRyAicnRseF9vcGVuIGluZGV4IG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRU5PU1lTOwogCX0KIAogCWlmIChhdG9taWNfaW5jX3JldHVybigmY2hhbm5lbF93cXNbaW5kZXhdLmluX29wZW4pID4gMSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicnRseF9vcGVuIGNoYW5uZWwgJWQgYWxyZWFkeSBvcGVuZWRcbiIsCi0JCSAgICAgICBpbmRleCk7CisJCXByX2RlYnVnKEtFUk5fREVCVUcgInJ0bHhfb3BlbiBjaGFubmVsICVkIGFscmVhZHkgb3BlbmVkXG4iLCBpbmRleCk7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfZmFpbDsKIAl9CiAKIAlpZiAocnRseCA9PSBOVUxMKSB7Ci0JCWlmKCAocCA9IHZwZV9nZXRfc2hhcmVkKHRjbGltaXQpKSA9PSBOVUxMKSB7Ci0JCSAgICBpZiAoY2FuX3NsZWVwKSB7Ci0JCQlyZXQgPSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJcCA9IHZwZV9nZXRfc2hhcmVkKGFwcnBfY3B1X2luZGV4KCkpOworCQlpZiAocCA9PSBOVUxMKSB7CisJCQlpZiAoY2FuX3NsZWVwKSB7CisJCQkJcmV0ID0gX193YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCiAJCQkJCWNoYW5uZWxfd3FzW2luZGV4XS5seF9xdWV1ZSwKLQkJCQkJKHAgPSB2cGVfZ2V0X3NoYXJlZCh0Y2xpbWl0KSkpOwotCQkJaWYgKHJldCkKKwkJCQkJKHAgPSB2cGVfZ2V0X3NoYXJlZChhcHJwX2NwdV9pbmRleCgpKSkpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0X2ZhaWw7CisJCQl9IGVsc2UgeworCQkJCXByX2RlYnVnKCJObyBTUCBwcm9ncmFtIGxvYWRlZCwgYW5kIGRldmljZSBvcGVuZWQgd2l0aCBPX05PTkJMT0NLXG4iKTsKKwkJCQlyZXQgPSAtRU5PU1lTOwogCQkJCWdvdG8gb3V0X2ZhaWw7Ci0JCSAgICB9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIk5vIFNQIHByb2dyYW0gbG9hZGVkLCBhbmQgZGV2aWNlICIKLQkJCQkJIm9wZW5lZCB3aXRoIE9fTk9OQkxPQ0tcbiIpOwotCQkJcmV0ID0gLUVOT1NZUzsKLQkJCWdvdG8gb3V0X2ZhaWw7Ci0JCSAgICB9CisJCQl9CiAJCX0KIAogCQlzbXBfcm1iKCk7CkBAIC0yMDQsMjQgKzEzOSwyNCBAQAogCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CiAJCQkJCWdvdG8gb3V0X2ZhaWw7CiAJCQkJfQotCQkJCWZpbmlzaF93YWl0KCZjaGFubmVsX3dxc1tpbmRleF0ubHhfcXVldWUsICZ3YWl0KTsKKwkJCQlmaW5pc2hfd2FpdCgmY2hhbm5lbF93cXNbaW5kZXhdLmx4X3F1ZXVlLAorCQkJCQkgICAgJndhaXQpOwogCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiAqdnBlX2dldF9zaGFyZWQgaXMgTlVMTC4gIgotCQkJCSAgICAgICAiSGFzIGFuIFNQIHByb2dyYW0gYmVlbiBsb2FkZWQ/XG4iKTsKKwkJCQlwcl9lcnIoIiAqdnBlX2dldF9zaGFyZWQgaXMgTlVMTC4gSGFzIGFuIFNQIHByb2dyYW0gYmVlbiBsb2FkZWQ/XG4iKTsKIAkJCQlyZXQgPSAtRU5PU1lTOwogCQkJCWdvdG8gb3V0X2ZhaWw7CiAJCQl9CiAJCX0KIAogCQlpZiAoKHVuc2lnbmVkIGludCkqcCA8IEtTRUcwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2cGVfZ2V0X3NoYXJlZCByZXR1cm5lZCBhbiAiCi0JCQkgICAgICAgImludmFsaWQgcG9pbnRlciBtYXliZSBhbiBlcnJvciBjb2RlICVkXG4iLAotCQkJICAgICAgIChpbnQpKnApOworCQkJcHJfd2FybigidnBlX2dldF9zaGFyZWQgcmV0dXJuZWQgYW4gaW52YWxpZCBwb2ludGVyIG1heWJlIGFuIGVycm9yIGNvZGUgJWRcbiIsCisJCQkJKGludCkqcCk7CiAJCQlyZXQgPSAtRU5PU1lTOwogCQkJZ290byBvdXRfZmFpbDsKIAkJfQogCi0JCWlmICgocmV0ID0gcnRseF9pbml0KCpwKSkgPCAwKQorCQlyZXQgPSBydGx4X2luaXQoKnApOworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0X3JldDsKIAl9CiAKQEAgLTM1Miw3ICsyODcsNyBAQAogCXNpemVfdCBmbDsKIAogCWlmIChydGx4ID09IE5VTEwpCi0JCXJldHVybigtRU5PU1lTKTsKKwkJcmV0dXJuIC1FTk9TWVM7CiAKIAlydCA9ICZydGx4LT5jaGFubmVsW2luZGV4XTsKIApAQCAtMzYxLDggKzI5Niw4IEBACiAJcnRfcmVhZCA9IHJ0LT5ydF9yZWFkOwogCiAJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KLQljb3VudCA9IG1pbihjb3VudCwgKHNpemVfdCl3cml0ZV9zcGFjZWZyZWUocnRfcmVhZCwgcnQtPnJ0X3dyaXRlLAotCQkJCQkJCXJ0LT5idWZmZXJfc2l6ZSkpOworCWNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgd3JpdGVfc3BhY2VmcmVlKHJ0X3JlYWQsIHJ0LT5ydF93cml0ZSwKKwkJCQkJCSAgICAgcnQtPmJ1ZmZlcl9zaXplKSk7CiAKIAkvKiBmaXJzdCBiaXQgZnJvbSB3cml0ZSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgb3IgY291bnQgKi8KIAlmbCA9IG1pbihjb3VudCwgKHNpemVfdCkgcnQtPmJ1ZmZlcl9zaXplIC0gcnQtPnJ0X3dyaXRlKTsKQEAgLTM3Miw5ICszMDcsOCBAQAogCQlnb3RvIG91dDsKIAogCS8qIGlmIHRoZXJlJ3MgYW55IGxlZnQgY29weSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgKi8KLQlpZiAoY291bnQgLSBmbCkgeworCWlmIChjb3VudCAtIGZsKQogCQlmYWlsZWQgPSBjb3B5X2Zyb21fdXNlcihydC0+cnRfYnVmZmVyLCBidWZmZXIgKyBmbCwgY291bnQgLSBmbCk7Ci0JfQogCiBvdXQ6CiAJY291bnQgLT0gZmFpbGVkOwpAQCAtMzg0LDYgKzMxOCw4IEBACiAJc21wX3dtYigpOwogCW11dGV4X3VubG9jaygmY2hhbm5lbF93cXNbaW5kZXhdLm11dGV4KTsKIAorCV9pbnRlcnJ1cHRfc3AoKTsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzk4LDcgKzMzNCw3IEBACiAJcmV0dXJuIHJ0bHhfcmVsZWFzZShpbWlub3IoaW5vZGUpKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBmaWxlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQorc3RhdGljIHVuc2lnbmVkIGludCBmaWxlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJaW50IG1pbm9yID0gaW1pbm9yKGZpbGVfaW5vZGUoZmlsZSkpOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKQEAgLTQyMCwyMSArMzU2LDIwIEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwKLQkJCSBsb2ZmX3QgKiBwcG9zKQorc3RhdGljIHNzaXplX3QgZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQogewogCWludCBtaW5vciA9IGltaW5vcihmaWxlX2lub2RlKGZpbGUpKTsKIAogCS8qIGRhdGEgYXZhaWxhYmxlPyAqLwotCWlmICghcnRseF9yZWFkX3BvbGwobWlub3IsIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPyAwIDogMSkpIHsKLQkJcmV0dXJuIDA7CS8vIC1FQUdBSU4gbWFrZXMgY2F0IHdoaW5nZQotCX0KKwlpZiAoIXJ0bHhfcmVhZF9wb2xsKG1pbm9yLCAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID8gMCA6IDEpKQorCQlyZXR1cm4gMDsJLyogLUVBR0FJTiBtYWtlcyAnY2F0JyB3aGluZSAqLwogCiAJcmV0dXJuIHJ0bHhfcmVhZChtaW5vciwgYnVmZmVyLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCitzdGF0aWMgc3NpemVfdCBmaWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgbWlub3IgPSBpbWlub3IoZmlsZV9pbm9kZShmaWxlKSk7CiAKQEAgLTQ1NCwxMDAgKzM4OSwxNiBAQAogCXJldHVybiBydGx4X3dyaXRlKG1pbm9yLCBidWZmZXIsIGNvdW50KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRseF9mb3BzID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGx4X2ZvcHMgPSB7CiAJLm93bmVyID0gICBUSElTX01PRFVMRSwKLQkub3BlbiA9CSAgIGZpbGVfb3BlbiwKKwkub3BlbiA9ICAgIGZpbGVfb3BlbiwKIAkucmVsZWFzZSA9IGZpbGVfcmVsZWFzZSwKIAkud3JpdGUgPSAgIGZpbGVfd3JpdGUsCi0JLnJlYWQgPQkgICBmaWxlX3JlYWQsCi0JLnBvbGwgPQkgICBmaWxlX3BvbGwsCisJLnJlYWQgPSAgICBmaWxlX3JlYWQsCisJLnBvbGwgPSAgICBmaWxlX3BvbGwsCiAJLmxsc2VlayA9ICBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHJ0bHhfaXJxID0gewotCS5oYW5kbGVyCT0gcnRseF9pbnRlcnJ1cHQsCi0JLm5hbWUJCT0gIlJUTFgiLAotfTsKLQotc3RhdGljIGludCBydGx4X2lycV9udW0gPSBNSVBTX0NQVV9JUlFfQkFTRSArIE1JUFNfQ1BVX1JUTFhfSVJROwotCi1zdGF0aWMgY2hhciByZWdpc3Rlcl9jaHJkZXZfZmFpbGVkW10gX19pbml0ZGF0YSA9Ci0JS0VSTl9FUlIgInJ0bHhfbW9kdWxlX2luaXQ6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiI7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0bHhfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IGksIGVycjsKLQotCWlmICghY3B1X2hhc19taXBzbXQpIHsKLQkJcHJpbnRrKCJWUEUgbG9hZGVyOiBub3QgYSBNSVBTIE1UIGNhcGFibGUgcHJvY2Vzc29yXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHRjbGltaXQgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBUQ3MgcmVzZXJ2ZWQgZm9yIEFQL1NQLCBub3QgIgotCQkgICAgICAgImluaXRpYWxpemluZyBSVExYLlxuUGFzcyBtYXh0Y3M9PG4+IGFyZ3VtZW50IGFzIGtlcm5lbCAiCi0JCSAgICAgICAiYXJndW1lbnRcbiIpOwotCi0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIG1vZHVsZV9uYW1lLCAmcnRseF9mb3BzKTsKLQlpZiAobWFqb3IgPCAwKSB7Ci0JCXByaW50ayhyZWdpc3Rlcl9jaHJkZXZfZmFpbGVkKTsKLQkJcmV0dXJuIG1ham9yOwotCX0KLQotCS8qIGluaXRpYWxpc2UgdGhlIHdhaXQgcXVldWVzICovCi0JZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykgewotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFubmVsX3dxc1tpXS5ydF9xdWV1ZSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoYW5uZWxfd3FzW2ldLmx4X3F1ZXVlKTsKLQkJYXRvbWljX3NldCgmY2hhbm5lbF93cXNbaV0uaW5fb3BlbiwgMCk7Ci0JCW11dGV4X2luaXQoJmNoYW5uZWxfd3FzW2ldLm11dGV4KTsKLQotCQlkZXYgPSBkZXZpY2VfY3JlYXRlKG10X2NsYXNzLCBOVUxMLCBNS0RFVihtYWpvciwgaSksIE5VTEwsCi0JCQkJICAgICIlcyVkIiwgbW9kdWxlX25hbWUsIGkpOwotCQlpZiAoSVNfRVJSKGRldikpIHsKLQkJCWVyciA9IFBUUl9FUlIoZGV2KTsKLQkJCWdvdG8gb3V0X2NocmRldjsKLQkJfQotCX0KLQotCS8qIHNldCB1cCBub3RpZmllcnMgKi8KLQlub3RpZnkuc3RhcnQgPSBzdGFydGluZzsKLQlub3RpZnkuc3RvcCA9IHN0b3BwaW5nOwotCXZwZV9ub3RpZnkodGNsaW1pdCwgJm5vdGlmeSk7Ci0KLQlpZiAoY3B1X2hhc192aW50KQotCQlzZXRfdmlfaGFuZGxlcihNSVBTX0NQVV9SVExYX0lSUSwgcnRseF9kaXNwYXRjaCk7Ci0JZWxzZSB7Ci0JCXByX2VycigiQVBSUCBSVExYIGluaXQgb24gbm9uLXZlY3RvcmVkLWludGVycnVwdCBwcm9jZXNzb3JcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dF9jaHJkZXY7Ci0JfQotCi0JcnRseF9pcnEuZGV2X2lkID0gcnRseDsKLQlzZXR1cF9pcnEocnRseF9pcnFfbnVtLCAmcnRseF9pcnEpOwotCi0JcmV0dXJuIDA7Ci0KLW91dF9jaHJkZXY6Ci0JZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykKLQkJZGV2aWNlX2Rlc3Ryb3kobXRfY2xhc3MsIE1LREVWKG1ham9yLCBpKSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcnRseF9tb2R1bGVfZXhpdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykKLQkJZGV2aWNlX2Rlc3Ryb3kobXRfY2xhc3MsIE1LREVWKG1ham9yLCBpKSk7Ci0KLQl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgbW9kdWxlX25hbWUpOwotfQotCiBtb2R1bGVfaW5pdChydGx4X21vZHVsZV9pbml0KTsKIG1vZHVsZV9leGl0KHJ0bHhfbW9kdWxlX2V4aXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKaW5kZXggZThlNTQxYi4uYTViMTRmNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwpAQCAtNTYzLDMgKzU2Myw1IEBACiAJUFRSCXN5c19wcm9jZXNzX3ZtX3dyaXRldgogCVBUUglzeXNfa2NtcAogCVBUUglzeXNfZmluaXRfbW9kdWxlCisJUFRSCXN5c19zY2hlZF9zZXRhdHRyCisJUFRSCXN5c19zY2hlZF9nZXRhdHRyCQkvKiA0MzUwICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCmluZGV4IDU3ZTM3NDIuLmI1NmUyNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCkBAIC00MjUsNCArNDI1LDYgQEAKIAlQVFIJc3lzX2tjbXAKIAlQVFIJc3lzX2Zpbml0X21vZHVsZQogCVBUUglzeXNfZ2V0ZGVudHM2NAorCVBUUglzeXNfc2NoZWRfc2V0YXR0cgorCVBUUglzeXNfc2NoZWRfZ2V0YXR0cgkJLyogNTMxMCAqLwogCS5zaXplCXN5c19jYWxsX3RhYmxlLC4tc3lzX2NhbGxfdGFibGUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwppbmRleCAyZjQ4ZjU5Li5mN2U1YjcyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCkBAIC00MTgsNCArNDE4LDYgQEAKIAlQVFIJY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldgkvKiA2MzEwICovCiAJUFRSCXN5c19rY21wCiAJUFRSCXN5c19maW5pdF9tb2R1bGUKKwlQVFIJc3lzX3NjaGVkX3NldGF0dHIKKwlQVFIJc3lzX3NjaGVkX2dldGF0dHIKIAkuc2l6ZQlzeXNuMzJfY2FsbF90YWJsZSwuLXN5c24zMl9jYWxsX3RhYmxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKaW5kZXggZjFhY2RiNC4uNjc4ODcyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwpAQCAtNTQxLDQgKzU0MSw2IEBACiAJUFRSCWNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXYKIAlQVFIJc3lzX2tjbXAKIAlQVFIJc3lzX2Zpbml0X21vZHVsZQorCVBUUglzeXNfc2NoZWRfc2V0YXR0cgorCVBUUglzeXNfc2NoZWRfZ2V0YXR0cgkJLyogNDM1MCAqLwogCS5zaXplCXN5czMyX2NhbGxfdGFibGUsLi1zeXMzMl9jYWxsX3RhYmxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NlZ21lbnQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2VnbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL3NlZ21lbnQuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NlZ21lbnRfY29uZmlnKGNoYXIgKnN0ciwgdW5zaWduZWQgaW50IGNmZykKK3sKKwl1bnNpZ25lZCBpbnQgYW07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbV9zdHJbXSA9IHsKKwkJIlVLIiwgIk1LIiwgIk1TSyIsICJNVVNLIiwgIk1VU1VLIiwgIlVTSyIsCisJCSJSU1JWRCIsICJVVVNLIn07CisKKwkvKiBTZWdtZW50IGFjY2VzcyBtb2RlLiAqLworCWFtID0gKGNmZyAmIE1JUFNfU0VHQ0ZHX0FNKSA+PiBNSVBTX1NFR0NGR19BTV9TSElGVDsKKwlzdHIgKz0gc3ByaW50ZihzdHIsICIlLTVzIiwgYW1fc3RyW2FtXSk7CisKKwkvKgorCSAqIEFjY2VzcyBtb2RlcyBNSywgTVNLIGFuZCBNVVNLIGFyZSBtYXBwZWQgc2VnbWVudHMuIFRoZXJlZm9yZQorCSAqIHRoZXJlIGlzIG5vIGRpcmVjdCBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcuCisJICovCisJaWYgKChhbSA9PSAwKSB8fCAoYW0gPiAzKSkgeworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIgICAgICAgICAlMDNseCIsCisJCQkoKGNmZyAmIE1JUFNfU0VHQ0ZHX1BBKSA+PiBNSVBTX1NFR0NGR19QQV9TSElGVCkpOworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIgICAgICAgICAlMDFsZCIsCisJCQkoKGNmZyAmIE1JUFNfU0VHQ0ZHX0MpID4+IE1JUFNfU0VHQ0ZHX0NfU0hJRlQpKTsKKwl9IGVsc2UgeworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIgICAgICAgICBVTkQiKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiICAgICAgICAgVSIpOworCX0KKworCS8qIEV4Y2VwdGlvbiBjb25maWd1cmF0aW9uLiAqLworCXN0ciArPSBzcHJpbnRmKHN0ciwgIiAgICAgICAlMDFsZFxuIiwKKwkJKChjZmcgJiBNSVBTX1NFR0NGR19FVSkgPj4gTUlQU19TRUdDRkdfRVVfU0hJRlQpKTsKK30KKworc3RhdGljIGludCBzaG93X3NlZ21lbnRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwl1bnNpZ25lZCBpbnQgc2VnY2ZnOworCWNoYXIgc3RyWzQyXTsKKworCXNlcV9wdXRzKG0sICJTZWdtZW50ICAgVmlydHVhbCAgICBTaXplICAgQWNjZXNzIE1vZGUgICBQaHlzaWNhbCAgIENhY2hpbmcgICBFVVxuIik7CisJc2VxX3B1dHMobSwgIi0tLS0tLS0gICAtLS0tLS0tICAgIC0tLS0gICAtLS0tLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLSAgIC0tXG4iKTsKKworCXNlZ2NmZyA9IHJlYWRfYzBfc2VnY3RsMCgpOworCWJ1aWxkX3NlZ21lbnRfY29uZmlnKHN0ciwgc2VnY2ZnKTsKKwlzZXFfcHJpbnRmKG0sICIgICAwICAgICAgZTAwMDAwMDAgICA1MTJNICAgICAgJXMiLCBzdHIpOworCisJc2VnY2ZnID4+PSAxNjsKKwlidWlsZF9zZWdtZW50X2NvbmZpZyhzdHIsIHNlZ2NmZyk7CisJc2VxX3ByaW50ZihtLCAiICAgMSAgICAgIGMwMDAwMDAwICAgNTEyTSAgICAgICVzIiwgc3RyKTsKKworCXNlZ2NmZyA9IHJlYWRfYzBfc2VnY3RsMSgpOworCWJ1aWxkX3NlZ21lbnRfY29uZmlnKHN0ciwgc2VnY2ZnKTsKKwlzZXFfcHJpbnRmKG0sICIgICAyICAgICAgYTAwMDAwMDAgICA1MTJNICAgICAgJXMiLCBzdHIpOworCisJc2VnY2ZnID4+PSAxNjsKKwlidWlsZF9zZWdtZW50X2NvbmZpZyhzdHIsIHNlZ2NmZyk7CisJc2VxX3ByaW50ZihtLCAiICAgMyAgICAgIDgwMDAwMDAwICAgNTEyTSAgICAgICVzIiwgc3RyKTsKKworCXNlZ2NmZyA9IHJlYWRfYzBfc2VnY3RsMigpOworCWJ1aWxkX3NlZ21lbnRfY29uZmlnKHN0ciwgc2VnY2ZnKTsKKwlzZXFfcHJpbnRmKG0sICIgICA0ICAgICAgNDAwMDAwMDAgICAgMUcgICAgICAgJXMiLCBzdHIpOworCisJc2VnY2ZnID4+PSAxNjsKKwlidWlsZF9zZWdtZW50X2NvbmZpZyhzdHIsIHNlZ2NmZyk7CisJc2VxX3ByaW50ZihtLCAiICAgNSAgICAgIDAwMDAwMDAwICAgIDFHICAgICAgICVzXG4iLCBzdHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VnbWVudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19zZWdtZW50cywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlZ21lbnRzX2ZvcHMgPSB7CisJLm9wZW4JCT0gc2VnbWVudHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2VnbWVudHNfaW5mbyh2b2lkKQoreworCWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICptaXBzX2RlYnVnZnNfZGlyOworCXN0cnVjdCBkZW50cnkgKnNlZ21lbnRzOworCisJaWYgKGNwdV9oYXNfc2VnbWVudHMpIHsKKwkJaWYgKCFtaXBzX2RlYnVnZnNfZGlyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJc2VnbWVudHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzZWdtZW50cyIsIFNfSVJVR08sCisJCQkJCSAgICAgICBtaXBzX2RlYnVnZnNfZGlyLCBOVUxMLAorCQkJCQkgICAgICAgJnNlZ21lbnRzX2ZvcHMpOworCQlpZiAoIXNlZ21lbnRzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoc2VnbWVudHNfaW5mbyk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYwppbmRleCAyZjI4NWFiLi41MTk5NTYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKQEAgLTcxLDggKzcxLDkgQEAKIAlpbnQgZXJyOwogCXdoaWxlICgxKSB7CiAJCWxvY2tfZnB1X293bmVyKCk7Ci0JCW93bl9mcHVfaW5hdG9taWMoMSk7Ci0JCWVyciA9IHNhdmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLworCQllcnIgPSBvd25fZnB1X2luYXRvbWljKDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHNhdmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLwogCQl1bmxvY2tfZnB1X293bmVyKCk7CiAJCWlmIChsaWtlbHkoIWVycikpCiAJCQlicmVhazsKQEAgLTkxLDggKzkyLDkgQEAKIAlpbnQgZXJyLCB0bXAgX19tYXliZV91bnVzZWQ7CiAJd2hpbGUgKDEpIHsKIAkJbG9ja19mcHVfb3duZXIoKTsKLQkJb3duX2ZwdV9pbmF0b21pYygwKTsKLQkJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0KHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCisJCWVyciA9IG93bl9mcHVfaW5hdG9taWMoMCk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0KHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCiAJCXVubG9ja19mcHVfb3duZXIoKTsKIAkJaWYgKGxpa2VseSghZXJyKSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCmluZGV4IDE5MDVhNDEuLjNkNjBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKQEAgLTg1LDggKzg1LDkgQEAKIAlpbnQgZXJyOwogCXdoaWxlICgxKSB7CiAJCWxvY2tfZnB1X293bmVyKCk7Ci0JCW93bl9mcHVfaW5hdG9taWMoMSk7Ci0JCWVyciA9IHNhdmVfZnBfY29udGV4dDMyKHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCisJCWVyciA9IG93bl9mcHVfaW5hdG9taWMoMSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gc2F2ZV9mcF9jb250ZXh0MzIoc2MpOyAvKiB0aGlzIG1pZ2h0IGZhaWwgKi8KIAkJdW5sb2NrX2ZwdV9vd25lcigpOwogCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJYnJlYWs7CkBAIC0xMDUsOCArMTA2LDkgQEAKIAlpbnQgZXJyLCB0bXAgX19tYXliZV91bnVzZWQ7CiAJd2hpbGUgKDEpIHsKIAkJbG9ja19mcHVfb3duZXIoKTsKLQkJb3duX2ZwdV9pbmF0b21pYygwKTsKLQkJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0MzIoc2MpOyAvKiB0aGlzIG1pZ2h0IGZhaWwgKi8KKwkJZXJyID0gb3duX2ZwdV9pbmF0b21pYygwKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSByZXN0b3JlX2ZwX2NvbnRleHQzMihzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLwogCQl1bmxvY2tfZnB1X293bmVyKCk7CiAJCWlmIChsaWtlbHkoIWVycikpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWJtaXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1ibWlwcy5jCmluZGV4IDIzNjI2NjUuLmVhNGMyZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWJtaXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtYm1pcHMuYwpAQCAtNDksOCArNDksMTAgQEAKIHVuc2lnbmVkIGxvbmcgYm1pcHNfc21wX2Jvb3Rfc3A7CiB1bnNpZ25lZCBsb25nIGJtaXBzX3NtcF9ib290X2dwOwogCi1zdGF0aWMgdm9pZCBibWlwc19zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbik7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYm1pcHNfaXBpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIHZvaWQgYm1pcHM0M3h4X3NlbmRfaXBpX3NpbmdsZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKTsKK3N0YXRpYyB2b2lkIGJtaXBzNTAwMF9zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbik7CitzdGF0aWMgaXJxcmV0dXJuX3QgYm1pcHM0M3h4X2lwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWlwczUwMDBfaXBpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCiAvKiBTVyBpbnRlcnJ1cHRzIDAsMSBhcmUgdXNlZCBmb3IgaW50ZXJwcm9jZXNzb3Igc2lnbmFsaW5nICovCiAjZGVmaW5lIElQSTBfSVJRCQkJKE1JUFNfQ1BVX0lSUV9CQVNFICsgMCkKQEAgLTY0LDQ5ICs2Niw1OCBAQAogc3RhdGljIHZvaWQgX19pbml0IGJtaXBzX3NtcF9zZXR1cCh2b2lkKQogewogCWludCBpLCBjcHUgPSAxLCBib290X2NwdSA9IDA7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM0MzUwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM0MzgwKQogCWludCBjcHVfaHdfaW50cjsKIAotCS8qIGFyYml0cmF0aW9uIHByaW9yaXR5ICovCi0JY2xlYXJfYzBfYnJjbV9jbXRfY3RybCgweDMwKTsKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X3R5cGUoKSkgeworCWNhc2UgQ1BVX0JNSVBTNDM1MDoKKwljYXNlIENQVV9CTUlQUzQzODA6CisJCS8qIGFyYml0cmF0aW9uIHByaW9yaXR5ICovCisJCWNsZWFyX2MwX2JyY21fY210X2N0cmwoMHgzMCk7CiAKLQkvKiBOQksgYW5kIHdlYWsgb3JkZXIgZmxhZ3MgKi8KLQlzZXRfYzBfYnJjbV9jb25maWdfMCgweDMwMDAwKTsKKwkJLyogTkJLIGFuZCB3ZWFrIG9yZGVyIGZsYWdzICovCisJCXNldF9jMF9icmNtX2NvbmZpZ18wKDB4MzAwMDApOwogCi0JLyogRmluZCBvdXQgaWYgd2UgYXJlIHJ1bm5pbmcgb24gVFAwIG9yIFRQMSAqLwotCWJvb3RfY3B1ID0gISEocmVhZF9jMF9icmNtX2NtdF9sb2NhbCgpICYgKDEgPDwgMzEpKTsKKwkJLyogRmluZCBvdXQgaWYgd2UgYXJlIHJ1bm5pbmcgb24gVFAwIG9yIFRQMSAqLworCQlib290X2NwdSA9ICEhKHJlYWRfYzBfYnJjbV9jbXRfbG9jYWwoKSAmICgxIDw8IDMxKSk7CiAKLQkvKgotCSAqIE1JUFMgaW50ZXJydXB0cyAwLDEgKFNXIElOVCAwLDEpIGNyb3NzIG92ZXIgdG8gdGhlIG90aGVyIHRocmVhZAotCSAqIE1JUFMgaW50ZXJydXB0IDIgKEhXIElOVCAwKSBpcyB0aGUgQ1BVMCBMMSBjb250cm9sbGVyIG91dHB1dAotCSAqIE1JUFMgaW50ZXJydXB0IDMgKEhXIElOVCAxKSBpcyB0aGUgQ1BVMSBMMSBjb250cm9sbGVyIG91dHB1dAotCSAqLwotCWlmIChib290X2NwdSA9PSAwKQotCQljcHVfaHdfaW50ciA9IDB4MDI7Ci0JZWxzZQotCQljcHVfaHdfaW50ciA9IDB4MWQ7CisJCS8qCisJCSAqIE1JUFMgaW50ZXJydXB0cyAwLDEgKFNXIElOVCAwLDEpIGNyb3NzIG92ZXIgdG8gdGhlIG90aGVyCisJCSAqIHRocmVhZAorCQkgKiBNSVBTIGludGVycnVwdCAyIChIVyBJTlQgMCkgaXMgdGhlIENQVTAgTDEgY29udHJvbGxlciBvdXRwdXQKKwkJICogTUlQUyBpbnRlcnJ1cHQgMyAoSFcgSU5UIDEpIGlzIHRoZSBDUFUxIEwxIGNvbnRyb2xsZXIgb3V0cHV0CisJCSAqLworCQlpZiAoYm9vdF9jcHUgPT0gMCkKKwkJCWNwdV9od19pbnRyID0gMHgwMjsKKwkJZWxzZQorCQkJY3B1X2h3X2ludHIgPSAweDFkOwogCi0JY2hhbmdlX2MwX2JyY21fY210X2ludHIoMHhmODAxODAwMCwgKGNwdV9od19pbnRyIDw8IDI3KSB8ICgweDAzIDw8IDE1KSk7CisJCWNoYW5nZV9jMF9icmNtX2NtdF9pbnRyKDB4ZjgwMTgwMDAsCisJCQkJCShjcHVfaHdfaW50ciA8PCAyNykgfCAoMHgwMyA8PCAxNSkpOwogCi0JLyogc2luZ2xlIGNvcmUsIDIgdGhyZWFkcyAoMiBwaXBlbGluZXMpICovCi0JbWF4X2NwdXMgPSAyOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0JNSVBTNTAwMCkKLQkvKiBlbmFibGUgcmFjZWxlc3MgU1cgaW50ZXJydXB0cyAqLwotCXNldF9jMF9icmNtX2NvbmZpZygweDAzIDw8IDIyKTsKKwkJLyogc2luZ2xlIGNvcmUsIDIgdGhyZWFkcyAoMiBwaXBlbGluZXMpICovCisJCW1heF9jcHVzID0gMjsKIAotCS8qIHJvdXRlIEhXIGludGVycnVwdCAwIHRvIENQVTAsIEhXIGludGVycnVwdCAxIHRvIENQVTEgKi8KLQljaGFuZ2VfYzBfYnJjbV9tb2RlKDB4MWYgPDwgMjcsIDB4MDIgPDwgMjcpOworCQlicmVhazsKKwljYXNlIENQVV9CTUlQUzUwMDA6CisJCS8qIGVuYWJsZSByYWNlbGVzcyBTVyBpbnRlcnJ1cHRzICovCisJCXNldF9jMF9icmNtX2NvbmZpZygweDAzIDw8IDIyKTsKIAotCS8qIE4gY29yZXMsIDIgdGhyZWFkcyBwZXIgY29yZSAqLwotCW1heF9jcHVzID0gKCgocmVhZF9jMF9icmNtX2NvbmZpZygpID4+IDYpICYgMHgwMykgKyAxKSA8PCAxOworCQkvKiByb3V0ZSBIVyBpbnRlcnJ1cHQgMCB0byBDUFUwLCBIVyBpbnRlcnJ1cHQgMSB0byBDUFUxICovCisJCWNoYW5nZV9jMF9icmNtX21vZGUoMHgxZiA8PCAyNywgMHgwMiA8PCAyNyk7CiAKLQkvKiBjbGVhciBhbnkgcGVuZGluZyBTVyBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspIHsKLQkJd3JpdGVfYzBfYnJjbV9hY3Rpb24oQUNUSU9OX0NMUl9JUEkoaSwgMCkpOwotCQl3cml0ZV9jMF9icmNtX2FjdGlvbihBQ1RJT05fQ0xSX0lQSShpLCAxKSk7CisJCS8qIE4gY29yZXMsIDIgdGhyZWFkcyBwZXIgY29yZSAqLworCQltYXhfY3B1cyA9ICgoKHJlYWRfYzBfYnJjbV9jb25maWcoKSA+PiA2KSAmIDB4MDMpICsgMSkgPDwgMTsKKworCQkvKiBjbGVhciBhbnkgcGVuZGluZyBTVyBpbnRlcnJ1cHRzICovCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKSB7CisJCQl3cml0ZV9jMF9icmNtX2FjdGlvbihBQ1RJT05fQ0xSX0lQSShpLCAwKSk7CisJCQl3cml0ZV9jMF9icmNtX2FjdGlvbihBQ1RJT05fQ0xSX0lQSShpLCAxKSk7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYXhfY3B1cyA9IDE7CiAJfQotI2VuZGlmCiAKIAlpZiAoIWJtaXBzX3NtcF9lbmFibGVkKQogCQltYXhfY3B1cyA9IDE7CkBAIC0xMzQsNiArMTQ1LDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJtaXBzX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CisJaXJxcmV0dXJuX3QgKCpibWlwc19pcGlfaW50ZXJydXB0KShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKKwljYXNlIENQVV9CTUlQUzQzNTA6CisJY2FzZSBDUFVfQk1JUFM0MzgwOgorCQlibWlwc19pcGlfaW50ZXJydXB0ID0gYm1pcHM0M3h4X2lwaV9pbnRlcnJ1cHQ7CisJCWJyZWFrOworCWNhc2UgQ1BVX0JNSVBTNTAwMDoKKwkJYm1pcHNfaXBpX2ludGVycnVwdCA9IGJtaXBzNTAwMF9pcGlfaW50ZXJydXB0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCiAJaWYgKHJlcXVlc3RfaXJxKElQSTBfSVJRLCBibWlwc19pcGlfaW50ZXJydXB0LCBJUlFGX1BFUkNQVSwKIAkJCSJzbXBfaXBpMCIsIE5VTEwpKQogCQlwYW5pYygiQ2FuJ3QgcmVxdWVzdCBJUEkwIGludGVycnVwdCIpOwpAQCAtMTY4LDI2ICsxOTMsMzkgQEAKIAogCXByX2luZm8oIlNNUDogQm9vdGluZyBDUFUlZC4uLlxuIiwgY3B1KTsKIAotCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJmJtaXBzX2Jvb3RlZF9tYXNrKSkKLQkJYm1pcHNfc2VuZF9pcGlfc2luZ2xlKGNwdSwgMCk7Ci0JZWxzZSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX0JNSVBTNDM1MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0JNSVBTNDM4MCkKLQkJLyogUmVzZXQgc2xhdmUgVFAxIGlmIGJvb3RpbmcgZnJvbSBUUDAgKi8KLQkJaWYgKGNwdV9sb2dpY2FsX21hcChjcHUpID09IDEpCi0JCQlzZXRfYzBfYnJjbV9jbXRfY3RybCgweDAxKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCi0JCWlmIChjcHUgJiAweDAxKQotCQkJd3JpdGVfYzBfYnJjbV9hY3Rpb24oQUNUSU9OX0JPT1RfVEhSRUFEKGNwdSkpOwotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBjb3JlIE4gdGhyZWFkIDAgd2FzIGFscmVhZHkgYm9vdGVkOyBqdXN0Ci0JCQkgKiBwdWxzZSB0aGUgTk1JIGxpbmUKLQkJCSAqLwotCQkJYm1pcHNfd3JpdGVfenNjbV9yZWcoMHgyMTAsIDB4YzAwMDAwMDApOwotCQkJdWRlbGF5KDEwKTsKLQkJCWJtaXBzX3dyaXRlX3pzY21fcmVnKDB4MjEwLCAweDAwKTsKKwlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsICZibWlwc19ib290ZWRfbWFzaykpIHsKKwkJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKKwkJY2FzZSBDUFVfQk1JUFM0MzUwOgorCQljYXNlIENQVV9CTUlQUzQzODA6CisJCQlibWlwczQzeHhfc2VuZF9pcGlfc2luZ2xlKGNwdSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQk1JUFM1MDAwOgorCQkJYm1pcHM1MDAwX3NlbmRfaXBpX3NpbmdsZShjcHUsIDApOworCQkJYnJlYWs7CiAJCX0KLSNlbmRpZgorCX0KKwllbHNlIHsKKwkJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKKwkJY2FzZSBDUFVfQk1JUFM0MzUwOgorCQljYXNlIENQVV9CTUlQUzQzODA6CisJCQkvKiBSZXNldCBzbGF2ZSBUUDEgaWYgYm9vdGluZyBmcm9tIFRQMCAqLworCQkJaWYgKGNwdV9sb2dpY2FsX21hcChjcHUpID09IDEpCisJCQkJc2V0X2MwX2JyY21fY210X2N0cmwoMHgwMSk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQk1JUFM1MDAwOgorCQkJaWYgKGNwdSAmIDB4MDEpCisJCQkJd3JpdGVfYzBfYnJjbV9hY3Rpb24oQUNUSU9OX0JPT1RfVEhSRUFEKGNwdSkpOworCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBjb3JlIE4gdGhyZWFkIDAgd2FzIGFscmVhZHkgYm9vdGVkOyBqdXN0CisJCQkJICogcHVsc2UgdGhlIE5NSSBsaW5lCisJCQkJICovCisJCQkJYm1pcHNfd3JpdGVfenNjbV9yZWcoMHgyMTAsIDB4YzAwMDAwMDApOworCQkJCXVkZWxheSgxMCk7CisJCQkJYm1pcHNfd3JpdGVfenNjbV9yZWcoMHgyMTAsIDB4MDApOworCQkJfQorCQkJYnJlYWs7CisJCX0KIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgJmJtaXBzX2Jvb3RlZF9tYXNrKTsKIAl9CiB9CkBAIC0xOTksMjYgKzIzNywzMiBAQAogewogCS8qIG1vdmUgTk1JIHZlY3RvciB0byBrc2VnMCwgaW4gY2FzZSBYS1MwMSBpcyBlbmFibGVkICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM0MzUwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM0MzgwKQotCXZvaWQgX19pb21lbSAqY2JyID0gQk1JUFNfR0VUX0NCUigpOworCXZvaWQgX19pb21lbSAqY2JyOwogCXVuc2lnbmVkIGxvbmcgb2xkX3ZlYzsKIAl1bnNpZ25lZCBsb25nIHJlbG9fdmVjdG9yOwogCWludCBib290X2NwdTsKIAotCWJvb3RfY3B1ID0gISEocmVhZF9jMF9icmNtX2NtdF9sb2NhbCgpICYgKDEgPDwgMzEpKTsKLQlyZWxvX3ZlY3RvciA9IGJvb3RfY3B1ID8gQk1JUFNfUkVMT19WRUNUT1JfQ09OVFJPTF8wIDoKLQkJCSAgQk1JUFNfUkVMT19WRUNUT1JfQ09OVFJPTF8xOworCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CisJY2FzZSBDUFVfQk1JUFM0MzUwOgorCWNhc2UgQ1BVX0JNSVBTNDM4MDoKKwkJY2JyID0gQk1JUFNfR0VUX0NCUigpOwogCi0Jb2xkX3ZlYyA9IF9fcmF3X3JlYWRsKGNiciArIHJlbG9fdmVjdG9yKTsKLQlfX3Jhd193cml0ZWwob2xkX3ZlYyAmIH4weDIwMDAwMDAwLCBjYnIgKyByZWxvX3ZlY3Rvcik7CisJCWJvb3RfY3B1ID0gISEocmVhZF9jMF9icmNtX2NtdF9sb2NhbCgpICYgKDEgPDwgMzEpKTsKKwkJcmVsb192ZWN0b3IgPSBib290X2NwdSA/IEJNSVBTX1JFTE9fVkVDVE9SX0NPTlRST0xfMCA6CisJCQkJICBCTUlQU19SRUxPX1ZFQ1RPUl9DT05UUk9MXzE7CiAKLQljbGVhcl9jMF9jYXVzZShzbXBfcHJvY2Vzc29yX2lkKCkgPyBDX1NXMSA6IENfU1cwKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCi0Jd3JpdGVfYzBfYnJjbV9ib290dmVjKHJlYWRfYzBfYnJjbV9ib290dmVjKCkgJgotCQkoc21wX3Byb2Nlc3Nvcl9pZCgpICYgMHgwMSA/IH4weDIwMDAwMDAwIDogfjB4MjAwMCkpOworCQlvbGRfdmVjID0gX19yYXdfcmVhZGwoY2JyICsgcmVsb192ZWN0b3IpOworCQlfX3Jhd193cml0ZWwob2xkX3ZlYyAmIH4weDIwMDAwMDAwLCBjYnIgKyByZWxvX3ZlY3Rvcik7CiAKLQl3cml0ZV9jMF9icmNtX2FjdGlvbihBQ1RJT05fQ0xSX0lQSShzbXBfcHJvY2Vzc29yX2lkKCksIDApKTsKLSNlbmRpZgorCQljbGVhcl9jMF9jYXVzZShzbXBfcHJvY2Vzc29yX2lkKCkgPyBDX1NXMSA6IENfU1cwKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfQk1JUFM1MDAwOgorCQl3cml0ZV9jMF9icmNtX2Jvb3R2ZWMocmVhZF9jMF9icmNtX2Jvb3R2ZWMoKSAmCisJCQkoc21wX3Byb2Nlc3Nvcl9pZCgpICYgMHgwMSA/IH4weDIwMDAwMDAwIDogfjB4MjAwMCkpOworCisJCXdyaXRlX2MwX2JyY21fYWN0aW9uKEFDVElPTl9DTFJfSVBJKHNtcF9wcm9jZXNzb3JfaWQoKSwgMCkpOworCQlicmVhazsKKwl9CiB9CiAKIC8qCkBAIC0yNDMsOCArMjg3LDYgQEAKIHsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzUwMDApCi0KIC8qCiAgKiBCTUlQUzUwMDAgcmFjZWxlc3MgSVBJcwogICoKQEAgLTI1MywxMiArMjk1LDEyIEBACiAgKiBJUEkxIGlzIHVzZWQgZm9yIFNNUF9DQUxMX0ZVTkNUSU9OCiAgKi8KIAotc3RhdGljIHZvaWQgYm1pcHNfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCitzdGF0aWMgdm9pZCBibWlwczUwMDBfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCiB7CiAJd3JpdGVfYzBfYnJjbV9hY3Rpb24oQUNUSU9OX1NFVF9JUEkoY3B1LCBhY3Rpb24gPT0gU01QX0NBTExfRlVOQ1RJT04pKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGJtaXBzX2lwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IGJtaXBzNTAwMF9pcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlpbnQgYWN0aW9uID0gaXJxIC0gSVBJMF9JUlE7CiAKQEAgLTI3Miw3ICszMTQsMTQgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNlbHNlCitzdGF0aWMgdm9pZCBibWlwczUwMDBfc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywKKwl1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yX2VhY2hfY3B1KGksIG1hc2spCisJCWJtaXBzNTAwMF9zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKK30KIAogLyoKICAqIEJNSVBTNDN4eCByYWNleSBJUElzCkBAIC0yODcsNyArMzM2LDcgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBpX2xvY2spOwogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgaXBpX2FjdGlvbl9tYXNrKTsKIAotc3RhdGljIHZvaWQgYm1pcHNfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCitzdGF0aWMgdm9pZCBibWlwczQzeHhfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjk4LDcgKzM0Nyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBpX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGJtaXBzX2lwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IGJtaXBzNDN4eF9pcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBhY3Rpb24sIGNwdSA9IGlycSAtIElQSTBfSVJROwpAQCAtMzE3LDE1ICszNjYsMTMgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNlbmRpZiAvKiBCTUlQUyB0eXBlICovCi0KLXN0YXRpYyB2b2lkIGJtaXBzX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCitzdGF0aWMgdm9pZCBibWlwczQzeHhfc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywKIAl1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yX2VhY2hfY3B1KGksIG1hc2spCi0JCWJtaXBzX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOworCQlibWlwczQzeHhfc2VuZF9pcGlfc2luZ2xlKGksIGFjdGlvbik7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKQEAgLTM4MSwxNSArNDI4LDMwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAotc3RydWN0IHBsYXRfc21wX29wcyBibWlwc19zbXBfb3BzID0geworc3RydWN0IHBsYXRfc21wX29wcyBibWlwczQzeHhfc21wX29wcyA9IHsKIAkuc21wX3NldHVwCQk9IGJtaXBzX3NtcF9zZXR1cCwKIAkucHJlcGFyZV9jcHVzCQk9IGJtaXBzX3ByZXBhcmVfY3B1cywKIAkuYm9vdF9zZWNvbmRhcnkJCT0gYm1pcHNfYm9vdF9zZWNvbmRhcnksCiAJLnNtcF9maW5pc2gJCT0gYm1pcHNfc21wX2ZpbmlzaCwKIAkuaW5pdF9zZWNvbmRhcnkJCT0gYm1pcHNfaW5pdF9zZWNvbmRhcnksCiAJLmNwdXNfZG9uZQkJPSBibWlwc19jcHVzX2RvbmUsCi0JLnNlbmRfaXBpX3NpbmdsZQk9IGJtaXBzX3NlbmRfaXBpX3NpbmdsZSwKLQkuc2VuZF9pcGlfbWFzawkJPSBibWlwc19zZW5kX2lwaV9tYXNrLAorCS5zZW5kX2lwaV9zaW5nbGUJPSBibWlwczQzeHhfc2VuZF9pcGlfc2luZ2xlLAorCS5zZW5kX2lwaV9tYXNrCQk9IGJtaXBzNDN4eF9zZW5kX2lwaV9tYXNrLAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCS5jcHVfZGlzYWJsZQkJPSBibWlwc19jcHVfZGlzYWJsZSwKKwkuY3B1X2RpZQkJPSBibWlwc19jcHVfZGllLAorI2VuZGlmCit9OworCitzdHJ1Y3QgcGxhdF9zbXBfb3BzIGJtaXBzNTAwMF9zbXBfb3BzID0geworCS5zbXBfc2V0dXAJCT0gYm1pcHNfc21wX3NldHVwLAorCS5wcmVwYXJlX2NwdXMJCT0gYm1pcHNfcHJlcGFyZV9jcHVzLAorCS5ib290X3NlY29uZGFyeQkJPSBibWlwc19ib290X3NlY29uZGFyeSwKKwkuc21wX2ZpbmlzaAkJPSBibWlwc19zbXBfZmluaXNoLAorCS5pbml0X3NlY29uZGFyeQkJPSBibWlwc19pbml0X3NlY29uZGFyeSwKKwkuY3B1c19kb25lCQk9IGJtaXBzX2NwdXNfZG9uZSwKKwkuc2VuZF9pcGlfc2luZ2xlCT0gYm1pcHM1MDAwX3NlbmRfaXBpX3NpbmdsZSwKKwkuc2VuZF9pcGlfbWFzawkJPSBibWlwczUwMDBfc2VuZF9pcGlfbWFzaywKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkuY3B1X2Rpc2FibGUJCT0gYm1pcHNfY3B1X2Rpc2FibGUsCiAJLmNwdV9kaWUJCT0gYm1pcHNfY3B1X2RpZSwKQEAgLTQyNyw0MyArNDg5LDQ3IEBACiAKIAlCVUdfT04oZWJhc2UgIT0gQ0tTRUcwKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzQzNTApCi0JLyoKLQkgKiBCTUlQUzQzNTAgY2Fubm90IHJlbG9jYXRlIHRoZSBub3JtYWwgdmVjdG9ycywgYnV0IGl0Ci0JICogY2FuIHJlbG9jYXRlIHRoZSBCRVY9MSB2ZWN0b3JzLiAgU28gQ1BVMSBzdGFydHMgdXAgYXQKLQkgKiB0aGUgcmVsb2NhdGVkIEJFVj0xLCBJVj0wIGdlbmVyYWwgZXhjZXB0aW9uIHZlY3RvciBACi0JICogMHhhMDAwXzAzODAuCi0JICoKLQkgKiBzZXRfdW5jYWNoZWRfaGFuZGxlcigpIGlzIHVzZWQgaGVyZSBiZWNhdXNlOgotCSAqICAtIENQVTEgd2lsbCBydW4gdGhpcyBmcm9tIHVuY2FjaGVkIHNwYWNlCi0JICogIC0gTm9uZSBvZiB0aGUgY2FjaGVmbHVzaCBmdW5jdGlvbnMgYXJlIHNldCB1cCB5ZXQKLQkgKi8KLQlzZXRfdW5jYWNoZWRfaGFuZGxlcihCTUlQU19XQVJNX1JFU1RBUlRfVkVDIC0gQ0tTRUcwLAotCQkmYm1pcHNfc21wX2ludF92ZWMsIDB4ODApOwotCV9fc3luYygpOwotCXJldHVybjsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9CTUlQUzQzODApCi0JLyoKLQkgKiAweDgwMDBfMDAwMDogcmVzZXQvTk1JIChpbml0aWFsbHkgaW4ga3NlZzEpCi0JICogMHg4MDAwXzA0MDA6IG5vcm1hbCB2ZWN0b3JzCi0JICovCi0JbmV3X2ViYXNlID0gMHg4MDAwMDQwMDsKLQljYnIgPSBCTUlQU19HRVRfQ0JSKCk7Ci0JX19yYXdfd3JpdGVsKDB4ODAwODA4MDAsIGNiciArIEJNSVBTX1JFTE9fVkVDVE9SX0NPTlRST0xfMCk7Ci0JX19yYXdfd3JpdGVsKDB4YTAwODA4MDAsIGNiciArIEJNSVBTX1JFTE9fVkVDVE9SX0NPTlRST0xfMSk7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfQk1JUFM1MDAwKQotCS8qCi0JICogMHg4MDAwXzAwMDA6IHJlc2V0L05NSSAoaW5pdGlhbGx5IGluIGtzZWcxKQotCSAqIDB4ODAwMF8xMDAwOiBub3JtYWwgdmVjdG9ycwotCSAqLwotCW5ld19lYmFzZSA9IDB4ODAwMDEwMDA7Ci0Jd3JpdGVfYzBfYnJjbV9ib290dmVjKDB4YTAwODgwMDgpOwotCXdyaXRlX2MwX2ViYXNlKG5ld19lYmFzZSk7Ci0JaWYgKG1heF9jcHVzID4gMikKLQkJYm1pcHNfd3JpdGVfenNjbV9yZWcoMHhhMCwgMHhhMDA4YTAwOCk7Ci0jZWxzZQotCXJldHVybjsKLSNlbmRpZgorCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CisJY2FzZSBDUFVfQk1JUFM0MzUwOgorCQkvKgorCQkgKiBCTUlQUzQzNTAgY2Fubm90IHJlbG9jYXRlIHRoZSBub3JtYWwgdmVjdG9ycywgYnV0IGl0CisJCSAqIGNhbiByZWxvY2F0ZSB0aGUgQkVWPTEgdmVjdG9ycy4gIFNvIENQVTEgc3RhcnRzIHVwIGF0CisJCSAqIHRoZSByZWxvY2F0ZWQgQkVWPTEsIElWPTAgZ2VuZXJhbCBleGNlcHRpb24gdmVjdG9yIEAKKwkJICogMHhhMDAwXzAzODAuCisJCSAqCisJCSAqIHNldF91bmNhY2hlZF9oYW5kbGVyKCkgaXMgdXNlZCBoZXJlIGJlY2F1c2U6CisJCSAqICAtIENQVTEgd2lsbCBydW4gdGhpcyBmcm9tIHVuY2FjaGVkIHNwYWNlCisJCSAqICAtIE5vbmUgb2YgdGhlIGNhY2hlZmx1c2ggZnVuY3Rpb25zIGFyZSBzZXQgdXAgeWV0CisJCSAqLworCQlzZXRfdW5jYWNoZWRfaGFuZGxlcihCTUlQU19XQVJNX1JFU1RBUlRfVkVDIC0gQ0tTRUcwLAorCQkJJmJtaXBzX3NtcF9pbnRfdmVjLCAweDgwKTsKKwkJX19zeW5jKCk7CisJCXJldHVybjsKKwljYXNlIENQVV9CTUlQUzQzODA6CisJCS8qCisJCSAqIDB4ODAwMF8wMDAwOiByZXNldC9OTUkgKGluaXRpYWxseSBpbiBrc2VnMSkKKwkJICogMHg4MDAwXzA0MDA6IG5vcm1hbCB2ZWN0b3JzCisJCSAqLworCQluZXdfZWJhc2UgPSAweDgwMDAwNDAwOworCQljYnIgPSBCTUlQU19HRVRfQ0JSKCk7CisJCV9fcmF3X3dyaXRlbCgweDgwMDgwODAwLCBjYnIgKyBCTUlQU19SRUxPX1ZFQ1RPUl9DT05UUk9MXzApOworCQlfX3Jhd193cml0ZWwoMHhhMDA4MDgwMCwgY2JyICsgQk1JUFNfUkVMT19WRUNUT1JfQ09OVFJPTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfQk1JUFM1MDAwOgorCQkvKgorCQkgKiAweDgwMDBfMDAwMDogcmVzZXQvTk1JIChpbml0aWFsbHkgaW4ga3NlZzEpCisJCSAqIDB4ODAwMF8xMDAwOiBub3JtYWwgdmVjdG9ycworCQkgKi8KKwkJbmV3X2ViYXNlID0gMHg4MDAwMTAwMDsKKwkJd3JpdGVfYzBfYnJjbV9ib290dmVjKDB4YTAwODgwMDgpOworCQl3cml0ZV9jMF9lYmFzZShuZXdfZWJhc2UpOworCQlpZiAobWF4X2NwdXMgPiAyKQorCQkJYm1pcHNfd3JpdGVfenNjbV9yZWcoMHhhMCwgMHhhMDA4YTAwOCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKIAlib2FyZF9ubWlfaGFuZGxlcl9zZXR1cCA9ICZibWlwc19ubWlfaGFuZGxlcl9zZXR1cDsKIAllYmFzZSA9IG5ld19lYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNtcC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMKaW5kZXggNTk2OWYxZS4uMWI5MjVkOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMKQEAgLTE5OSwxMSArMTk5LDE0IEBACiAJcHJfZGVidWcoIlNNUENNUDogQ1BVJWQ6ICVzIG1heF9jcHVzPSVkXG4iLAogCQkgc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2Z1bmNfXywgbWF4X2NwdXMpOwogCisjaWZkZWYgQ09ORklHX01JUFNfTVQKIAkvKgogCSAqIEZJWE1FOiBzb21lIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHBlci1zeXN0ZW0sIHNvbWUgcGVyLWNvcmUgYW5kCiAJICogc29tZSBwZXItY3B1CiAJICovCiAJbWlwc19tdF9zZXRfY3B1b3B0aW9ucygpOworI2VuZGlmCisKIH0KIAogc3RydWN0IHBsYXRfc21wX29wcyBjbXBfc21wX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCmluZGV4IDU3YTNmN2EuLjBmYjhjZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwpAQCAtNzEsNiArNzEsNyBAQAogCiAJCS8qIFJlY29yZCB0aGlzIGFzIGF2YWlsYWJsZSBDUFUgKi8KIAkJc2V0X2NwdV9wb3NzaWJsZSh0YywgdHJ1ZSk7CisJCXNldF9jcHVfcHJlc2VudCh0YywgdHJ1ZSk7CiAJCV9fY3B1X251bWJlcl9tYXBbdGNdCT0gKytuY3B1OwogCQlfX2NwdV9sb2dpY2FsX21hcFtuY3B1XSA9IHRjOwogCX0KQEAgLTExMiwxMiArMTEzLDM5IEBACiAJd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKIH0KIAorI2lmZGVmIENPTkZJR19JUlFfR0lDCitzdGF0aWMgdm9pZCBtcF9zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFNNUF9DQUxMX0ZVTkNUSU9OOgorCQlnaWNfc2VuZF9pcGkocGxhdF9pcGlfY2FsbF9pbnRfeGxhdGUoY3B1KSk7CisJCWJyZWFrOworCisJY2FzZSBTTVBfUkVTQ0hFRFVMRV9ZT1VSU0VMRjoKKwkJZ2ljX3NlbmRfaXBpKHBsYXRfaXBpX3Jlc2NoZWRfaW50X3hsYXRlKGNwdSkpOworCQlicmVhazsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgdnNtcF9zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB2cGZsYWdzOwogCisjaWZkZWYgQ09ORklHX0lSUV9HSUMKKwlpZiAoZ2ljX3ByZXNlbnQpIHsKKwkJbXBfc2VuZF9pcGlfc2luZ2xlKGNwdSwgYWN0aW9uKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCXZwZmxhZ3MgPSBkdnBlKCk7CS8qIGNhbid0IGFjY2VzcyB0aGUgb3RoZXIgQ1BVJ3MgcmVnaXN0ZXJzIHdoaWxzdCBNVlBFIGVuYWJsZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYwppbmRleCA5M2Y4NjgxLi5iMjQyZTJjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NwcmFtLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zcHJhbS5jCkBAIC04LDcgKzgsNiBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpAQCAtMjA2LDYgKzIwNSw4IEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCWNhc2UgQ1BVX1BST0FQVElWOgogCQljb25maWcwID0gcmVhZF9jMF9jb25maWcoKTsKIAkJLyogRklYTUU6IGFkZHJlc3NlcyBhcmUgTWFsdGEgc3BlY2lmaWMgKi8KIAkJaWYgKGNvbmZpZzAgJiAoMTw8MjQpKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5bmMtcjRrLmMgYi9hcmNoL21pcHMva2VybmVsL3N5bmMtcjRrLmMKaW5kZXggODQ1MzZiZi4uYzI0YWQ1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeW5jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3luYy1yNGsuYwpAQCAtMTEsNyArMTEsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCBmOWM4NzQ2Li5lMGI0OTk2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC03OCw2ICs3OCw3IEBACiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9vdih2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3RyKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfZnBlKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfZnRsYih2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX21kbXgodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV93YXRjaCh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX210KHZvaWQpOwpAQCAtMTA4MCw3ICsxMDgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIG9sZF9lcGMsIG9sZDMxOwogCXVuc2lnbmVkIGludCBvcGNvZGU7CiAJdW5zaWduZWQgaW50IGNwaWQ7Ci0JaW50IHN0YXR1czsKKwlpbnQgc3RhdHVzLCBlcnI7CiAJdW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCBmbGFnczsKIAogCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKQEAgLTExNTMsMTkgKzExNTQsMTkgQEAKIAogCWNhc2UgMToKIAkJaWYgKHVzZWRfbWF0aCgpKQkvKiBVc2luZyB0aGUgRlBVIGFnYWluLgkgKi8KLQkJCW93bl9mcHUoMSk7CisJCQllcnIgPSBvd25fZnB1KDEpOwogCQllbHNlIHsJCQkvKiBGaXJzdCB0aW1lIEZQVSB1c2VyLgkgKi8KLQkJCWluaXRfZnB1KCk7CisJCQllcnIgPSBpbml0X2ZwdSgpOwogCQkJc2V0X3VzZWRfbWF0aCgpOwogCQl9CiAKLQkJaWYgKCFyYXdfY3B1X2hhc19mcHUpIHsKKwkJaWYgKCFyYXdfY3B1X2hhc19mcHUgfHwgZXJyKSB7CiAJCQlpbnQgc2lnOwogCQkJdm9pZCBfX3VzZXIgKmZhdWx0X2FkZHIgPSBOVUxMOwogCQkJc2lnID0gZnB1X2VtdWxhdG9yX2NvcDFIYW5kbGVyKHJlZ3MsCiAJCQkJCQkgICAgICAgJmN1cnJlbnQtPnRocmVhZC5mcHUsCiAJCQkJCQkgICAgICAgMCwgJmZhdWx0X2FkZHIpOwotCQkJaWYgKCFwcm9jZXNzX2ZwZW11X3JldHVybihzaWcsIGZhdWx0X2FkZHIpKQorCQkJaWYgKCFwcm9jZXNzX2ZwZW11X3JldHVybihzaWcsIGZhdWx0X2FkZHIpICYmICFlcnIpCiAJCQkJbXRfYXNlX2ZwX2FmZmluaXR5KCk7CiAJCX0KIApAQCAtMTMzNiw2ICsxMzM3LDggQEAKIAljYXNlIENQVV8zNEs6CiAJY2FzZSBDUFVfNzRLOgogCWNhc2UgQ1BVXzEwMDRLOgorCWNhc2UgQ1BVX0lOVEVSQVBUSVY6CisJY2FzZSBDUFVfUFJPQVBUSVY6CiAJCXsKICNkZWZpbmUgRVJSQ1RMX1BFCTB4ODAwMDAwMDAKICNkZWZpbmUgRVJSQ1RMX0wyUAkweDAwODAwMDAwCkBAIC0xNDI1LDE0ICsxNDI4LDI3IEBACiAJcHJpbnRrKCJEZWNvZGVkIGMwX2NhY2hlZXJyOiAlcyBjYWNoZSBmYXVsdCBpbiAlcyByZWZlcmVuY2UuXG4iLAogCSAgICAgICByZWdfdmFsICYgKDE8PDMwKSA/ICJzZWNvbmRhcnkiIDogInByaW1hcnkiLAogCSAgICAgICByZWdfdmFsICYgKDE8PDMxKSA/ICJkYXRhIiA6ICJpbnNuIik7Ci0JcHJpbnRrKCJFcnJvciBiaXRzOiAlcyVzJXMlcyVzJXMlc1xuIiwKLQkgICAgICAgcmVnX3ZhbCAmICgxPDwyOSkgPyAiRUQgIiA6ICIiLAotCSAgICAgICByZWdfdmFsICYgKDE8PDI4KSA/ICJFVCAiIDogIiIsCi0JICAgICAgIHJlZ192YWwgJiAoMTw8MjYpID8gIkVFICIgOiAiIiwKLQkgICAgICAgcmVnX3ZhbCAmICgxPDwyNSkgPyAiRUIgIiA6ICIiLAotCSAgICAgICByZWdfdmFsICYgKDE8PDI0KSA/ICJFSSAiIDogIiIsCi0JICAgICAgIHJlZ192YWwgJiAoMTw8MjMpID8gIkUxICIgOiAiIiwKLQkgICAgICAgcmVnX3ZhbCAmICgxPDwyMikgPyAiRTAgIiA6ICIiKTsKKwlpZiAoY3B1X2hhc19taXBzX3IyICYmCisJICAgICgoY3VycmVudF9jcHVfZGF0YS5wcm9jZXNzb3JfaWQgJiYgMHhmZjAwMDApID09IFBSSURfQ09NUF9NSVBTKSkgeworCQlwcl9lcnIoIkVycm9yIGJpdHM6ICVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCQlyZWdfdmFsICYgKDE8PDI5KSA/ICJFRCAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI4KSA/ICJFVCAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI3KSA/ICJFUyAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI2KSA/ICJFRSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI1KSA/ICJFQiAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI0KSA/ICJFSSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDIzKSA/ICJFMSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDIyKSA/ICJFMCAiIDogIiIpOworCX0gZWxzZSB7CisJCXByX2VycigiRXJyb3IgYml0czogJXMlcyVzJXMlcyVzJXNcbiIsCisJCQlyZWdfdmFsICYgKDE8PDI5KSA/ICJFRCAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI4KSA/ICJFVCAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI2KSA/ICJFRSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI1KSA/ICJFQiAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDI0KSA/ICJFSSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDIzKSA/ICJFMSAiIDogIiIsCisJCQlyZWdfdmFsICYgKDE8PDIyKSA/ICJFMCAiIDogIiIpOworCX0KIAlwcmludGsoIklEWDogMHglMDh4XG4iLCByZWdfdmFsICYgKCgxPDwyMiktMSkpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFM2NCkKQEAgLTE0NDYsNiArMTQ2MiwzNCBAQAogCXBhbmljKCJDYW4ndCBoYW5kbGUgdGhlIGNhY2hlIGVycm9yISIpOwogfQogCithc21saW5rYWdlIHZvaWQgZG9fZnRsYih2b2lkKQoreworCWNvbnN0IGludCBmaWVsZCA9IDIgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisKKwkvKiBGb3IgdGhlIG1vbWVudCwgcmVwb3J0IHRoZSBwcm9ibGVtIGFuZCBoYW5nLiAqLworCWlmIChjcHVfaGFzX21pcHNfcjIgJiYKKwkgICAgKChjdXJyZW50X2NwdV9kYXRhLnByb2Nlc3Nvcl9pZCAmJiAweGZmMDAwMCkgPT0gUFJJRF9DT01QX01JUFMpKSB7CisJCXByX2VycigiRlRMQiBlcnJvciBleGNlcHRpb24sIGNwMF9lY2M9MHglMDh4OlxuIiwKKwkJICAgICAgIHJlYWRfYzBfZWNjKCkpOworCQlwcl9lcnIoImNwMF9lcnJvcmVwYyA9PSAlMCpseFxuIiwgZmllbGQsIHJlYWRfYzBfZXJyb3JlcGMoKSk7CisJCXJlZ192YWwgPSByZWFkX2MwX2NhY2hlZXJyKCk7CisJCXByX2VycigiYzBfY2FjaGVlcnIgPT0gJTA4eFxuIiwgcmVnX3ZhbCk7CisKKwkJaWYgKChyZWdfdmFsICYgMHhjMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkgeworCQkJcHJfZXJyKCJEZWNvZGVkIGMwX2NhY2hlZXJyOiBGVExCIHBhcml0eSBlcnJvclxuIik7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkRlY29kZWQgYzBfY2FjaGVlcnI6ICVzIGNhY2hlIGZhdWx0IGluICVzIHJlZmVyZW5jZS5cbiIsCisJCQkgICAgICAgcmVnX3ZhbCAmICgxPDwzMCkgPyAic2Vjb25kYXJ5IiA6ICJwcmltYXJ5IiwKKwkJCSAgICAgICByZWdfdmFsICYgKDE8PDMxKSA/ICJkYXRhIiA6ICJpbnNuIik7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIkZUTEIgZXJyb3IgZXhjZXB0aW9uXG4iKTsKKwl9CisJLyogSnVzdCBwcmludCB0aGUgY2FjaGVlcnIgYml0cyBmb3Igbm93ICovCisJY2FjaGVfcGFyaXR5X2Vycm9yKCk7Cit9CisKIC8qCiAgKiBTREJCUCBFSlRBRyBkZWJ1ZyBleGNlcHRpb24gaGFuZGxlci4KICAqIFdlIHNraXAgdGhlIGluc3RydWN0aW9uIGFuZCByZXR1cm4gdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCkBAIC0xOTk1LDYgKzIwMzksNyBAQAogCWlmIChjcHVfaGFzX2ZwdSAmJiAhY3B1X2hhc19ub2ZwdWV4KQogCQlzZXRfZXhjZXB0X3ZlY3RvcigxNSwgaGFuZGxlX2ZwZSk7CiAKKwlzZXRfZXhjZXB0X3ZlY3RvcigxNiwgaGFuZGxlX2Z0bGIpOwogCXNldF9leGNlcHRfdmVjdG9yKDIyLCBoYW5kbGVfbWRteCk7CiAKIAlpZiAoY3B1X2hhc19tY2hlY2spCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZwZS1jbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjhlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS1jbXAuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vdnBlLmg+CisKK3N0YXRpYyBpbnQgbWFqb3I7CisKK3ZvaWQgY2xlYW51cF90YyhzdHJ1Y3QgdGMgKnRjKQoreworCit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2tpbGwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB2cGUgKnZwZSA9IGdldF92cGUoYXBycF9jcHVfaW5kZXgoKSk7CisJc3RydWN0IHZwZV9ub3RpZmljYXRpb25zICpub3RpZmllcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZpZXIsICZ2cGUtPm5vdGlmeSwgbGlzdCkKKwkJbm90aWZpZXItPnN0b3AoYXBycF9jcHVfaW5kZXgoKSk7CisKKwlyZWxlYXNlX3Byb2dtZW0odnBlLT5sb2FkX2FkZHIpOworCXZwZS0+c3RhdGUgPSBWUEVfU1RBVEVfVU5VU0VEOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihraWxsLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9raWxsKTsKKworc3RhdGljIHNzaXplX3QgbnRjc19zaG93KHN0cnVjdCBkZXZpY2UgKmNkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IHZwZSAqdnBlID0gZ2V0X3ZwZShhcHJwX2NwdV9pbmRleCgpKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2cGUtPm50Y3MpOworfQorCitzdGF0aWMgc3NpemVfdCBudGNzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdnBlICp2cGUgPSBnZXRfdnBlKGFwcnBfY3B1X2luZGV4KCkpOworCXVuc2lnbmVkIGxvbmcgbmV3OworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZuZXcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQVBSUCBjYW4gb25seSByZXNlcnZlIG9uZSBUQyBpbiBhIFZQRSBhbmQgbm8gbW9yZS4gKi8KKwlpZiAobmV3ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJdnBlLT5udGNzID0gbmV3OworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhudGNzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZwZV9hdHRyc1tdID0geworCSZkZXZfYXR0cl9raWxsLmF0dHIsCisJJmRldl9hdHRyX250Y3MuYXR0ciwKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFModnBlKTsKKworc3RhdGljIHZvaWQgdnBlX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmNkKQoreworCWtmcmVlKGNkKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyB2cGVfY2xhc3MgPSB7CisJLm5hbWUgPSAidnBlIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGV2X3JlbGVhc2UgPSB2cGVfZGV2aWNlX3JlbGVhc2UsCisJLmRldl9ncm91cHMgPSB2cGVfZ3JvdXBzLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgdnBlX2RldmljZTsKKworaW50IF9faW5pdCB2cGVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdnBlICp2ID0gTlVMTDsKKwlzdHJ1Y3QgdGMgKnQ7CisJaW50IGVycjsKKworCWlmICghY3B1X2hhc19taXBzbXQpIHsKKwkJcHJfd2FybigiVlBFIGxvYWRlcjogbm90IGEgTUlQUyBNVCBjYXBhYmxlIHByb2Nlc3NvclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChudW1fcG9zc2libGVfY3B1cygpIC0gYXBycF9jcHVfaW5kZXgoKSA8IDEpIHsKKwkJcHJfd2FybigiTm8gVlBFcyByZXNlcnZlZCBmb3IgQVAvU1AsIG5vdCBpbml0aWFsaXplIFZQRSBsb2FkZXJcbiIKKwkJCSJQYXNzIG1heGNwdXM9PG4+IGFyZ3VtZW50IGFzIGtlcm5lbCBhcmd1bWVudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIFZQRV9NT0RVTEVfTkFNRSwgJnZwZV9mb3BzKTsKKwlpZiAobWFqb3IgPCAwKSB7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IHVuYWJsZSB0byByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIG1ham9yOworCX0KKworCWVyciA9IGNsYXNzX3JlZ2lzdGVyKCZ2cGVfY2xhc3MpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJ2cGVfY2xhc3MgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2NocmRldjsKKwl9CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmdnBlX2RldmljZSk7CisJdnBlX2RldmljZS5jbGFzcwk9ICZ2cGVfY2xhc3MsCisJdnBlX2RldmljZS5wYXJlbnQJPSBOVUxMLAorCWRldl9zZXRfbmFtZSgmdnBlX2RldmljZSwgInZwZV9zcCIpOworCXZwZV9kZXZpY2UuZGV2dCA9IE1LREVWKG1ham9yLCBWUEVfTU9EVUxFX01JTk9SKTsKKwllcnIgPSBkZXZpY2VfYWRkKCZ2cGVfZGV2aWNlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiQWRkaW5nIHZwZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfY2xhc3M7CisJfQorCisJdCA9IGFsbG9jX3RjKGFwcnBfY3B1X2luZGV4KCkpOworCWlmICghdCkgeworCQlwcl93YXJuKCJWUEU6IHVuYWJsZSB0byBhbGxvY2F0ZSBUQ1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwkvKiBWUEUgKi8KKwl2ID0gYWxsb2NfdnBlKGFwcnBfY3B1X2luZGV4KCkpOworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfd2FybigiVlBFOiB1bmFibGUgdG8gYWxsb2NhdGUgVlBFXG4iKTsKKwkJa2ZyZWUodCk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwl2LT5udGNzID0gMTsKKworCS8qIGFkZCB0aGUgdGMgdG8gdGhlIGxpc3Qgb2YgdGhpcyB2cGUncyB0YydzLiAqLworCWxpc3RfYWRkKCZ0LT50YywgJnYtPnRjKTsKKworCS8qIFRDICovCisJdC0+cHZwZSA9IHY7CS8qIHNldCB0aGUgcGFyZW50IHZwZSAqLworCisJcmV0dXJuIDA7CisKK291dF9kZXY6CisJZGV2aWNlX2RlbCgmdnBlX2RldmljZSk7CisKK291dF9jbGFzczoKKwljbGFzc191bnJlZ2lzdGVyKCZ2cGVfY2xhc3MpOworCitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBWUEVfTU9EVUxFX05BTUUpOworCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBfX2V4aXQgdnBlX21vZHVsZV9leGl0KHZvaWQpCit7CisJc3RydWN0IHZwZSAqdiwgKm47CisKKwlkZXZpY2VfZGVsKCZ2cGVfZGV2aWNlKTsKKwljbGFzc191bnJlZ2lzdGVyKCZ2cGVfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBWUEVfTU9EVUxFX05BTUUpOworCisJLyogTm8gbG9ja2luZyBuZWVkZWQgaGVyZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2LCBuLCAmdnBlY29udHJvbC52cGVfbGlzdCwgbGlzdCkKKwkJaWYgKHYtPnN0YXRlICE9IFZQRV9TVEFURV9VTlVTRUQpCisJCQlyZWxlYXNlX3ZwZSh2KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLW10LmMgYi9hcmNoL21pcHMva2VybmVsL3ZwZS1tdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWFlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS1tdC5jCkBAIC0wLDAgKzEsNTIzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9taXBzbXRyZWdzLmg+CisjaW5jbHVkZSA8YXNtL21pcHNfbXQuaD4KKyNpbmNsdWRlIDxhc20vdnBlLmg+CisKK3N0YXRpYyBpbnQgbWFqb3I7CisKKy8qIFRoZSBudW1iZXIgb2YgVENzIGFuZCBWUEVzIHBoeXNpY2FsbHkgYXZhaWxhYmxlIG9uIHRoZSBjb3JlICovCitzdGF0aWMgaW50IGh3X3RjcywgaHdfdnBlczsKKworLyogV2UgYXJlIHByZXBhcmVkIHNvIGNvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIFZQRS4uLiAqLworaW50IHZwZV9ydW4oc3RydWN0IHZwZSAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWwsIGRtdF9mbGFnOworCXN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyAqbm90aWZpZXI7CisJdW5zaWduZWQgaW50IHZwZWZsYWdzOworCXN0cnVjdCB0YyAqdDsKKworCS8qIGNoZWNrIHdlIGFyZSB0aGUgTWFzdGVyIFZQRSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2YWwgPSByZWFkX2MwX3ZwZWNvbmYwKCk7CisJaWYgKCEodmFsICYgVlBFQ09ORjBfTVZQKSkgeworCQlwcl93YXJuKCJWUEUgbG9hZGVyOiBvbmx5IE1hc3RlciBWUEUncyBhcmUgYWJsZSB0byBjb25maWcgTVRcbiIpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWRtdF9mbGFnID0gZG10KCk7CisJdnBlZmxhZ3MgPSBkdnBlKCk7CisKKwlpZiAobGlzdF9lbXB0eSgmdi0+dGMpKSB7CisJCWV2cGUodnBlZmxhZ3MpOworCQllbXQoZG10X2ZsYWcpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJcHJfd2FybigiVlBFIGxvYWRlcjogTm8gVEMncyBhc3NvY2lhdGVkIHdpdGggVlBFICVkXG4iLAorCQkJdi0+bWlub3IpOworCisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwl0ID0gbGlzdF9maXJzdF9lbnRyeSgmdi0+dGMsIHN0cnVjdCB0YywgdGMpOworCisJLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLworCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCXNldHRjKHQtPmluZGV4KTsKKworCS8qIHNob3VsZCBjaGVjayBpdCBpcyBoYWx0ZWQsIGFuZCBub3QgYWN0aXZhdGVkICovCisJaWYgKChyZWFkX3RjX2MwX3Rjc3RhdHVzKCkgJiBUQ1NUQVRVU19BKSB8fAorCSAgICEocmVhZF90Y19jMF90Y2hhbHQoKSAmIFRDSEFMVF9IKSkgeworCQlldnBlKHZwZWZsYWdzKTsKKwkJZW10KGRtdF9mbGFnKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IFRDICVkIGlzIGFscmVhZHkgYWN0aXZlIVxuIiwKKwkJCXQtPmluZGV4KTsKKworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyB3ZSB3YW50IGl0IHRvIHN0YXJ0IHJ1bm5pbmcgZnJvbSBpbiB0aGUgVENQQworCSAqIHJlZ2lzdGVyLgorCSAqLworCXdyaXRlX3RjX2MwX3RjcmVzdGFydCgodW5zaWduZWQgbG9uZyl2LT5fX3N0YXJ0KTsKKwl3cml0ZV90Y19jMF90Y2NvbnRleHQoKHVuc2lnbmVkIGxvbmcpMCk7CisKKwkvKgorCSAqIE1hcmsgdGhlIFRDIGFzIGFjdGl2YXRlZCwgbm90IGludGVycnVwdCBleGVtcHQgYW5kIG5vdCBkeW5hbWljYWxseQorCSAqIGFsbG9jYXRhYmxlCisJICovCisJdmFsID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCXZhbCA9ICh2YWwgJiB+KFRDU1RBVFVTX0RBIHwgVENTVEFUVVNfSVhNVCkpIHwgVENTVEFUVVNfQTsKKwl3cml0ZV90Y19jMF90Y3N0YXR1cyh2YWwpOworCisJd3JpdGVfdGNfYzBfdGNoYWx0KHJlYWRfdGNfYzBfdGNoYWx0KCkgJiB+VENIQUxUX0gpOworCisJLyoKKwkgKiBUaGUgc2RlLWtpdCBwYXNzZXMgJ21lbXNpemUnIHRvIF9fc3RhcnQgaW4gJGEzLCBzbyBzZXQgc29tZXRoaW5nCisJICogaGVyZS4uLiAgT3Igc2V0ICRhMyB0byB6ZXJvIGFuZCBkZWZpbmUgREZMVF9TVEFDS19TSVpFIGFuZAorCSAqIERGTFRfSEVBUF9TSVpFIHdoZW4geW91IGNvbXBpbGUgeW91ciBwcm9ncmFtCisJICovCisJbXR0Z3ByKDYsIHYtPm50Y3MpOworCW10dGdwcig3LCBwaHlzaWNhbF9tZW1zaXplKTsKKworCS8qIHNldCB1cCBWUEUxICovCisJLyoKKwkgKiBiaW5kIHRoZSBUQyB0byBWUEUgMSBhcyBsYXRlIGFzIHBvc3NpYmxlIHNvIHdlIG9ubHkgaGF2ZSB0aGUgZmluYWwKKwkgKiBWUEUgcmVnaXN0ZXJzIHRvIHNldCB1cCwgYW5kIHNvIGFuIEVKVEFHIHByb2JlIGNhbiB0cmlnZ2VyIG9uIGl0CisJICovCisJd3JpdGVfdGNfYzBfdGNiaW5kKChyZWFkX3RjX2MwX3RjYmluZCgpICYgflRDQklORF9DVVJWUEUpIHwgMSk7CisKKwl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH4oVlBFQ09ORjBfVlBBKSk7CisKKwliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7CisKKwkvKiBTZXQgdXAgdGhlIFhUQyBiaXQgaW4gdnBlY29uZjAgdG8gcG9pbnQgYXQgb3VyIHRjICovCisJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKChyZWFkX3ZwZV9jMF92cGVjb25mMCgpICYgfihWUEVDT05GMF9YVEMpKQorCQkJICAgICAgfCAodC0+aW5kZXggPDwgVlBFQ09ORjBfWFRDX1NISUZUKSk7CisKKwliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7CisKKwkvKiBlbmFibGUgdGhpcyBWUEUgKi8KKwl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSB8IFZQRUNPTkYwX1ZQQSk7CisKKwkvKiBjbGVhciBvdXQgYW55IGxlZnQgb3ZlcnMgZnJvbSBhIHByZXZpb3VzIHByb2dyYW0gKi8KKwl3cml0ZV92cGVfYzBfc3RhdHVzKDApOworCXdyaXRlX3ZwZV9jMF9jYXVzZSgwKTsKKworCS8qIHRha2Ugc3lzdGVtIG91dCBvZiBjb25maWd1cmF0aW9uIHN0YXRlICovCisJY2xlYXJfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7CisKKwkvKgorCSAqIFNNVEMvU01WUCBrZXJuZWxzIG1hbmFnZSBWUEUgZW5hYmxlIGluZGVwZW5kZW50bHksCisJICogYnV0IHVuaXByb2Nlc3NvciBrZXJuZWxzIG5lZWQgdG8gdHVybiBpdCBvbiwgZXZlbgorCSAqIGlmIHRoYXQgd2Fzbid0IHRoZSBwcmUtZHZwZSgpIHN0YXRlLgorCSAqLworI2lmZGVmIENPTkZJR19TTVAKKwlldnBlKHZwZWZsYWdzKTsKKyNlbHNlCisJZXZwZShFVlBFX0VOQUJMRSk7CisjZW5kaWYKKwllbXQoZG10X2ZsYWcpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZpZXIsICZ2LT5ub3RpZnksIGxpc3QpCisJCW5vdGlmaWVyLT5zdGFydChWUEVfTU9EVUxFX01JTk9SKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfdGMoc3RydWN0IHRjICp0YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtdGZsYWdzLCB2cGZsYWdzOworCWludCB0bXA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbXRmbGFncyA9IGRtdCgpOworCXZwZmxhZ3MgPSBkdnBlKCk7CisJLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLworCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCXNldHRjKHRjLT5pbmRleCk7CisJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCisJLyogbWFyayBub3QgYWxsb2NhdGVkIGFuZCBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGFibGUgKi8KKwl0bXAgJj0gfihUQ1NUQVRVU19BIHwgVENTVEFUVVNfREEpOworCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkvKiBpbnRlcnJ1cHQgZXhlbXB0ICovCisJd3JpdGVfdGNfYzBfdGNzdGF0dXModG1wKTsKKworCXdyaXRlX3RjX2MwX3RjaGFsdChUQ0hBTFRfSCk7CisJbWlwc19paGIoKTsKKworCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworCWV2cGUodnBmbGFncyk7CisJZW10KG10ZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogbW9kdWxlIHdyYXBwZXIgZW50cnkgcG9pbnRzICovCisvKiBnaXZlIG1lIGEgdnBlICovCit2b2lkICp2cGVfYWxsb2Modm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdnBlICp2OworCisJLyogZmluZCBhIHZwZSAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfVlBFUzsgaSsrKSB7CisJCXYgPSBnZXRfdnBlKGkpOworCQlpZiAodiAhPSBOVUxMKSB7CisJCQl2LT5zdGF0ZSA9IFZQRV9TVEFURV9JTlVTRTsKKwkJCXJldHVybiB2OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh2cGVfYWxsb2MpOworCisvKiBzdGFydCBydW5uaW5nIGZyb20gaGVyZSAqLworaW50IHZwZV9zdGFydCh2b2lkICp2cGUsIHVuc2lnbmVkIGxvbmcgc3RhcnQpCit7CisJc3RydWN0IHZwZSAqdiA9IHZwZTsKKworCXYtPl9fc3RhcnQgPSBzdGFydDsKKwlyZXR1cm4gdnBlX3J1bih2KTsKK30KK0VYUE9SVF9TWU1CT0wodnBlX3N0YXJ0KTsKKworLyogaGFsdCBpdCBmb3Igbm93ICovCitpbnQgdnBlX3N0b3Aodm9pZCAqdnBlKQoreworCXN0cnVjdCB2cGUgKnYgPSB2cGU7CisJc3RydWN0IHRjICp0OworCXVuc2lnbmVkIGludCBldnBlX2ZsYWdzOworCisJZXZwZV9mbGFncyA9IGR2cGUoKTsKKworCXQgPSBsaXN0X2VudHJ5KHYtPnRjLm5leHQsIHN0cnVjdCB0YywgdGMpOworCWlmICh0ICE9IE5VTEwpIHsKKwkJc2V0dGModC0+aW5kZXgpOworCQl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH5WUEVDT05GMF9WUEEpOworCX0KKworCWV2cGUoZXZwZV9mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodnBlX3N0b3ApOworCisvKiBJJ3ZlIGRvbmUgd2l0aCBpdCB0aGFuayB5b3UgKi8KK2ludCB2cGVfZnJlZSh2b2lkICp2cGUpCit7CisJc3RydWN0IHZwZSAqdiA9IHZwZTsKKwlzdHJ1Y3QgdGMgKnQ7CisJdW5zaWduZWQgaW50IGV2cGVfZmxhZ3M7CisKKwl0ID0gbGlzdF9lbnRyeSh2LT50Yy5uZXh0LCBzdHJ1Y3QgdGMsIHRjKTsKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VYRUM7CisKKwlldnBlX2ZsYWdzID0gZHZwZSgpOworCisJLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLworCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCXNldHRjKHQtPmluZGV4KTsKKwl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH5WUEVDT05GMF9WUEEpOworCisJLyogaGFsdCB0aGUgVEMgKi8KKwl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOworCW1pcHNfaWhiKCk7CisKKwkvKiBtYXJrIHRoZSBUQyB1bmFsbG9jYXRlZCAqLworCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHJlYWRfdGNfYzBfdGNzdGF0dXMoKSAmIH5UQ1NUQVRVU19BKTsKKworCXYtPnN0YXRlID0gVlBFX1NUQVRFX1VOVVNFRDsKKworCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworCWV2cGUoZXZwZV9mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodnBlX2ZyZWUpOworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9raWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdnBlICp2cGUgPSBnZXRfdnBlKGFwcnBfY3B1X2luZGV4KCkpOworCXN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyAqbm90aWZpZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmaWVyLCAmdnBlLT5ub3RpZnksIGxpc3QpCisJCW5vdGlmaWVyLT5zdG9wKGFwcnBfY3B1X2luZGV4KCkpOworCisJcmVsZWFzZV9wcm9nbWVtKHZwZS0+bG9hZF9hZGRyKTsKKwljbGVhbnVwX3RjKGdldF90YyhhcHJwX2NwdV9pbmRleCgpKSk7CisJdnBlX3N0b3AodnBlKTsKKwl2cGVfZnJlZSh2cGUpOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihraWxsLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9raWxsKTsKKworc3RhdGljIHNzaXplX3QgbnRjc19zaG93KHN0cnVjdCBkZXZpY2UgKmNkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IHZwZSAqdnBlID0gZ2V0X3ZwZShhcHJwX2NwdV9pbmRleCgpKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2cGUtPm50Y3MpOworfQorCitzdGF0aWMgc3NpemVfdCBudGNzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdnBlICp2cGUgPSBnZXRfdnBlKGFwcnBfY3B1X2luZGV4KCkpOworCXVuc2lnbmVkIGxvbmcgbmV3OworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZuZXcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldyA9PSAwIHx8IG5ldyA+IChod190Y3MgLSBhcHJwX2NwdV9pbmRleCgpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2cGUtPm50Y3MgPSBuZXc7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKG50Y3MpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdnBlX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2tpbGwuYXR0ciwKKwkmZGV2X2F0dHJfbnRjcy5hdHRyLAorCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyh2cGUpOworCitzdGF0aWMgdm9pZCB2cGVfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqY2QpCit7CisJa2ZyZWUoY2QpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHZwZV9jbGFzcyA9IHsKKwkubmFtZSA9ICJ2cGUiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kZXZfcmVsZWFzZSA9IHZwZV9kZXZpY2VfcmVsZWFzZSwKKwkuZGV2X2dyb3VwcyA9IHZwZV9ncm91cHMsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZSB2cGVfZGV2aWNlOworCitpbnQgX19pbml0IHZwZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBtdGZsYWdzLCB2cGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbDsKKwlzdHJ1Y3QgdnBlICp2ID0gTlVMTDsKKwlzdHJ1Y3QgdGMgKnQ7CisJaW50IHRjLCBlcnI7CisKKwlpZiAoIWNwdV9oYXNfbWlwc210KSB7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IG5vdCBhIE1JUFMgTVQgY2FwYWJsZSBwcm9jZXNzb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAodnBlbGltaXQgPT0gMCkgeworCQlwcl93YXJuKCJObyBWUEVzIHJlc2VydmVkIGZvciBBUC9TUCwgbm90IGluaXRpYWxpemUgVlBFIGxvYWRlclxuIgorCQkJIlBhc3MgbWF4dnBlcz08bj4gYXJndW1lbnQgYXMga2VybmVsIGFyZ3VtZW50XG4iKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoYXBycF9jcHVfaW5kZXgoKSA9PSAwKSB7CisJCXByX3dhcm4oIk5vIFRDcyByZXNlcnZlZCBmb3IgQVAvU1AsIG5vdCBpbml0aWFsaXplIFZQRSBsb2FkZXJcbiIKKwkJCSJQYXNzIG1heHRjcz08bj4gYXJndW1lbnQgYXMga2VybmVsIGFyZ3VtZW50XG4iKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBWUEVfTU9EVUxFX05BTUUsICZ2cGVfZm9wcyk7CisJaWYgKG1ham9yIDwgMCkgeworCQlwcl93YXJuKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZVxuIik7CisJCXJldHVybiBtYWpvcjsKKwl9CisKKwllcnIgPSBjbGFzc19yZWdpc3RlcigmdnBlX2NsYXNzKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigidnBlX2NsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCisJZGV2aWNlX2luaXRpYWxpemUoJnZwZV9kZXZpY2UpOworCXZwZV9kZXZpY2UuY2xhc3MJPSAmdnBlX2NsYXNzLAorCXZwZV9kZXZpY2UucGFyZW50CT0gTlVMTCwKKwlkZXZfc2V0X25hbWUoJnZwZV9kZXZpY2UsICJ2cGUxIik7CisJdnBlX2RldmljZS5kZXZ0ID0gTUtERVYobWFqb3IsIFZQRV9NT0RVTEVfTUlOT1IpOworCWVyciA9IGRldmljZV9hZGQoJnZwZV9kZXZpY2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJBZGRpbmcgdnBlX2RldmljZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbXRmbGFncyA9IGRtdCgpOworCXZwZmxhZ3MgPSBkdnBlKCk7CisKKwkvKiBQdXQgTVZQRSdzIGludG8gJ2NvbmZpZ3VyYXRpb24gc3RhdGUnICovCisJc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworCisJdmFsID0gcmVhZF9jMF9tdnBjb25mMCgpOworCWh3X3RjcyA9ICh2YWwgJiBNVlBDT05GMF9QVEMpICsgMTsKKwlod192cGVzID0gKCh2YWwgJiBNVlBDT05GMF9QVlBFKSA+PiBNVlBDT05GMF9QVlBFX1NISUZUKSArIDE7CisKKwlmb3IgKHRjID0gYXBycF9jcHVfaW5kZXgoKTsgdGMgPCBod190Y3M7IHRjKyspIHsKKwkJLyoKKwkJICogTXVzdCByZS1lbmFibGUgbXVsdGl0aHJlYWRpbmcgdGVtcG9yYXJpbHkgb3IgaW4gY2FzZSB3ZQorCQkgKiByZXNjaGVkdWxlIHNlbmQgSVBJcyBvciBzaW1pbGFyIHdlIG1pZ2h0IGhhbmcuCisJCSAqLworCQljbGVhcl9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKwkJZXZwZSh2cGZsYWdzKTsKKwkJZW10KG10ZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXQgPSBhbGxvY190Yyh0Yyk7CisJCWlmICghdCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2RldjsKKwkJfQorCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbXRmbGFncyA9IGRtdCgpOworCQl2cGZsYWdzID0gZHZwZSgpOworCQlzZXRfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7CisKKwkJLyogVlBFJ3MgKi8KKwkJaWYgKHRjIDwgaHdfdGNzKSB7CisJCQlzZXR0Yyh0Yyk7CisKKwkJCXYgPSBhbGxvY192cGUodGMpOworCQkJaWYgKHYgPT0gTlVMTCkgeworCQkJCXByX3dhcm4oIlZQRTogdW5hYmxlIHRvIGFsbG9jYXRlIFZQRVxuIik7CisJCQkJZ290byBvdXRfcmVlbmFibGU7CisJCQl9CisKKwkJCXYtPm50Y3MgPSBod190Y3MgLSBhcHJwX2NwdV9pbmRleCgpOworCisJCQkvKiBhZGQgdGhlIHRjIHRvIHRoZSBsaXN0IG9mIHRoaXMgdnBlJ3MgdGMncy4gKi8KKwkJCWxpc3RfYWRkKCZ0LT50YywgJnYtPnRjKTsKKworCQkJLyogZGVhY3RpdmF0ZSBhbGwgYnV0IHZwZTAgKi8KKwkJCWlmICh0YyA+PSBhcHJwX2NwdV9pbmRleCgpKSB7CisJCQkJdW5zaWduZWQgbG9uZyB0bXAgPSByZWFkX3ZwZV9jMF92cGVjb25mMCgpOworCisJCQkJdG1wICY9IH5WUEVDT05GMF9WUEE7CisKKwkJCQkvKiBtYXN0ZXIgVlBFICovCisJCQkJdG1wIHw9IFZQRUNPTkYwX01WUDsKKwkJCQl3cml0ZV92cGVfYzBfdnBlY29uZjAodG1wKTsKKwkJCX0KKworCQkJLyogZGlzYWJsZSBtdWx0aS10aHJlYWRpbmcgd2l0aCBUQydzICovCisJCQl3cml0ZV92cGVfYzBfdnBlY29udHJvbChyZWFkX3ZwZV9jMF92cGVjb250cm9sKCkgJgorCQkJCQkJflZQRUNPTlRST0xfVEUpOworCisJCQlpZiAodGMgPj0gdnBlbGltaXQpIHsKKwkJCQkvKgorCQkJCSAqIFNldCBjb25maWcgdG8gYmUgdGhlIHNhbWUgYXMgdnBlMCwKKwkJCQkgKiBwYXJ0aWN1bGFybHkga3NlZzAgY29oZXJlbmN5IGFsZworCQkJCSAqLworCQkJCXdyaXRlX3ZwZV9jMF9jb25maWcocmVhZF9jMF9jb25maWcoKSk7CisJCQl9CisJCX0KKworCQkvKiBUQydzICovCisJCXQtPnB2cGUgPSB2OwkvKiBzZXQgdGhlIHBhcmVudCB2cGUgKi8KKworCQlpZiAodGMgPj0gYXBycF9jcHVfaW5kZXgoKSkgeworCQkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJCXNldHRjKHRjKTsKKworCQkJLyogQW55IFRDIHRoYXQgaXMgYm91bmQgdG8gVlBFMCBnZXRzIGxlZnQgYXMgaXMgLSBpbgorCQkJICogY2FzZSB3ZSBhcmUgcnVubmluZyBTTVRDIG9uIFZQRTAuIEEgVEMgdGhhdCBpcyBib3VuZAorCQkJICogdG8gYW55IG90aGVyIFZQRSBnZXRzIGJvdW5kIHRvIFZQRTAsIGlkZWFsbHkgSSdkIGxpa2UKKwkJCSAqIHRvIG1ha2UgaXQgaG9tZWxlc3MgYnV0IGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGxldCBtZQorCQkJICogYmluZCBhIFRDIHRvIGEgbm9uLWV4aXN0ZW50IFZQRS4gV2hpY2ggaXMgcGVyZmVjdGx5CisJCQkgKiByZWFzb25hYmxlLgorCQkJICoKKwkJCSAqIFRoZSAodW4pYm91bmQgc3RhdGUgaXMgdmlzaWJsZSB0byBhbiBFSlRBRyBwcm9iZSBzbworCQkJICogbWF5IG5vdGlmeSBHREIuLi4KKwkJCSAqLworCQkJdG1wID0gcmVhZF90Y19jMF90Y2JpbmQoKTsKKwkJCWlmICh0bXAgJiBUQ0JJTkRfQ1VSVlBFKSB7CisJCQkJLyogdGMgaXMgYm91bmQgPnZwZTAgKi8KKwkJCQl3cml0ZV90Y19jMF90Y2JpbmQodG1wICYgflRDQklORF9DVVJWUEUpOworCisJCQkJdC0+cHZwZSA9IGdldF92cGUoMCk7CS8qIHNldCB0aGUgcGFyZW50IHZwZSAqLworCQkJfQorCisJCQkvKiBoYWx0IHRoZSBUQyAqLworCQkJd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKKwkJCW1pcHNfaWhiKCk7CisKKwkJCXRtcCA9IHJlYWRfdGNfYzBfdGNzdGF0dXMoKTsKKworCQkJLyogbWFyayBub3QgYWN0aXZhdGVkIGFuZCBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGFibGUgKi8KKwkJCXRtcCAmPSB+KFRDU1RBVFVTX0EgfCBUQ1NUQVRVU19EQSk7CisJCQl0bXAgfD0gVENTVEFUVVNfSVhNVDsJLyogaW50ZXJydXB0IGV4ZW1wdCAqLworCQkJd3JpdGVfdGNfYzBfdGNzdGF0dXModG1wKTsKKwkJfQorCX0KKworb3V0X3JlZW5hYmxlOgorCS8qIHJlbGVhc2UgY29uZmlnIHN0YXRlICovCisJY2xlYXJfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7CisKKwlldnBlKHZwZmxhZ3MpOworCWVtdChtdGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKKworb3V0X2RldjoKKwlkZXZpY2VfZGVsKCZ2cGVfZGV2aWNlKTsKKworb3V0X2NsYXNzOgorCWNsYXNzX3VucmVnaXN0ZXIoJnZwZV9jbGFzcyk7CisKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsIFZQRV9NT0RVTEVfTkFNRSk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIF9fZXhpdCB2cGVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgdnBlICp2LCAqbjsKKworCWRldmljZV9kZWwoJnZwZV9kZXZpY2UpOworCWNsYXNzX3VucmVnaXN0ZXIoJnZwZV9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsIFZQRV9NT0RVTEVfTkFNRSk7CisKKwkvKiBObyBsb2NraW5nIG5lZWRlZCBoZXJlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHYsIG4sICZ2cGVjb250cm9sLnZwZV9saXN0LCBsaXN0KSB7CisJCWlmICh2LT5zdGF0ZSAhPSBWUEVfU1RBVEVfVU5VU0VEKQorCQkJcmVsZWFzZV92cGUodik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggMmQ1YzE0Mi4uMTFkYTMxNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCkBAIC0xLDM3ICsxLDIyIEBACiAvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotLyoKLSAqIFZQRSBzdXBwb3J0IG1vZHVsZQotICoKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGxvYWRpbmcgYSBNSVBTIFNQIHByb2dyYW0gb24gVlBFMS4KLSAqIFRoZSBTUCBlbnZpcm9ubWVudCBpcyByYXRoZXIgc2ltcGxlLCBubyB0bGIncy4gIEl0IG5lZWRzIHRvIGJlIHJlbG9jYXRhYmxlCi0gKiAob3IgcGFydGlhbGx5IGxpbmtlZCkuIFlvdSBzaG91bGQgaW5pdGlhbGlzZSB5b3VyIHN0YWNrIGluIHRoZSBzdGFydHVwCi0gKiBjb2RlLiBUaGlzIGxvYWRlciBsb29rcyBmb3IgdGhlIHN5bWJvbCBfX3N0YXJ0IGFuZCBzZXRzIHVwCi0gKiBleGVjdXRpb24gdG8gcmVzdW1lIGZyb20gdGhlcmUuIFRoZSBNSVBTIFNERSBraXQgY29udGFpbnMgc3VpdGFibGUgZXhhbXBsZXMuCi0gKgotICogVG8gbG9hZCBhbmQgcnVuLCBzaW1wbHkgY2F0IGEgU1AgJ3Byb2dyYW0gZmlsZScgdG8gL2Rldi92cGUxLgotICogaS5lIGNhdCBzcGFwcCA+L2Rldi92cGUxLgorICogVlBFIHNwcG9ydCBtb2R1bGUgZm9yIGxvYWRpbmcgYSBNSVBTIFNQIHByb2dyYW0gaW50byBWUEUxLiBUaGUgU1AKKyAqIGVudmlyb25tZW50IGlzIHJhdGhlciBzaW1wbGUgc2luY2UgdGhlcmUgYXJlIG5vIFRMQnMuIEl0IG5lZWRzCisgKiB0byBiZSByZWxvY2F0YWJsZSAob3IgcGFydGlhbGwgbGlua2VkKS4gSW5pdGlhbGl6ZSB5b3VyIHN0YWNrIGluCisgKiB0aGUgc3RhcnR1cC1jb2RlLiBUaGUgbG9hZGVyIGxvb2tzIGZvciB0aGUgc3ltYm9sIF9fc3RhcnQgYW5kIHNldHMKKyAqIHVwIHRoZSBleGVjdXRpb24gdG8gcmVzdW1lIGZyb20gdGhlcmUuIFRvIGxvYWQgYW5kIHJ1biwgc2ltcGx5IGRvCisgKiBhIGNhdCBTUCAnYmluYXJ5JyB0byB0aGUgL2Rldi92cGUxIGRldmljZS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC00NiwxMyArMzEsMTAgQEAKICNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS5oPgogI2luY2x1ZGUgPGFzbS9taXBzX210Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS92cGUuaD4KIAotdHlwZWRlZiB2b2lkICp2cGVfaGFuZGxlOwotCiAjaWZuZGVmIEFSQ0hfU0hGX1NNQUxMCiAjZGVmaW5lIEFSQ0hfU0hGX1NNQUxMIDAKICNlbmRpZgpAQCAtNjAsOTUgKzQyLDE1IEBACiAvKiBJZiB0aGlzIGlzIHNldCwgdGhlIHNlY3Rpb24gYmVsb25ncyBpbiB0aGUgaW5pdCBwYXJ0IG9mIHRoZSBtb2R1bGUgKi8KICNkZWZpbmUgSU5JVF9PRkZTRVRfTUFTSyAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKQogCi0vKgotICogVGhlIG51bWJlciBvZiBUQ3MgYW5kIFZQRXMgcGh5c2ljYWxseSBhdmFpbGFibGUgb24gdGhlIGNvcmUKLSAqLwotc3RhdGljIGludCBod190Y3MsIGh3X3ZwZXM7Ci1zdGF0aWMgY2hhciBtb2R1bGVfbmFtZVtdID0gInZwZSI7Ci1zdGF0aWMgaW50IG1ham9yOwotc3RhdGljIGNvbnN0IGludCBtaW5vciA9IDE7CS8qIGZpeGVkIGZvciBub3cgICovCi0KLS8qIGdyYWIgdGhlIGxpa2VseSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgbmVlZC4gKi8KLSNpZmRlZiBDT05GSUdfTUlQU19WUEVfTE9BREVSX1RPTQotI2RlZmluZSBQX1NJWkUgKDIgKiAxMDI0ICogMTAyNCkKLSNlbHNlCi0vKiBhZGQgYW4gb3ZlcmhlYWQgdG8gdGhlIG1heCBrbWFsbG9jIHNpemUgZm9yIG5vbi1zdHJpcGVkIHN5bWJvbHMvZXRjICovCi0jZGVmaW5lIFBfU0laRSAoMjU2ICogMTAyNCkKLSNlbmRpZgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzaWNhbF9tZW1zaXplOwotCi0jZGVmaW5lIE1BWF9WUEVTIDE2Ci0jZGVmaW5lIFZQRV9QQVRIX01BWCAyNTYKLQotZW51bSB2cGVfc3RhdGUgewotCVZQRV9TVEFURV9VTlVTRUQgPSAwLAotCVZQRV9TVEFURV9JTlVTRSwKLQlWUEVfU1RBVEVfUlVOTklORwotfTsKLQotZW51bSB0Y19zdGF0ZSB7Ci0JVENfU1RBVEVfVU5VU0VEID0gMCwKLQlUQ19TVEFURV9JTlVTRSwKLQlUQ19TVEFURV9SVU5OSU5HLAotCVRDX1NUQVRFX0RZTkFNSUMKLX07Ci0KLXN0cnVjdCB2cGUgewotCWVudW0gdnBlX3N0YXRlIHN0YXRlOwotCi0JLyogKGRldmljZSkgbWlub3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdnBlICovCi0JaW50IG1pbm9yOwotCi0JLyogZWxmbG9hZGVyIHN0dWZmICovCi0Jdm9pZCAqbG9hZF9hZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCWNoYXIgKnBidWZmZXI7Ci0JdW5zaWduZWQgbG9uZyBwbGVuOwotCWNoYXIgY3dkW1ZQRV9QQVRIX01BWF07Ci0KLQl1bnNpZ25lZCBsb25nIF9fc3RhcnQ7Ci0KLQkvKiB0YydzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZwZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdGM7Ci0KLQkvKiBUaGUgbGlzdCBvZiB2cGUncyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIHNoYXJlZCBzeW1ib2wgYWRkcmVzcyAqLwotCXZvaWQgKnNoYXJlZF9wdHI7Ci0KLQkvKiB0aGUgbGlzdCBvZiB3aG8gd2FudHMgdG8ga25vdyB3aGVuIHNvbWV0aGluZyBtYWpvciBoYXBwZW5zICovCi0Jc3RydWN0IGxpc3RfaGVhZCBub3RpZnk7Ci0KLQl1bnNpZ25lZCBpbnQgbnRjczsKLX07Ci0KLXN0cnVjdCB0YyB7Ci0JZW51bSB0Y19zdGF0ZSBzdGF0ZTsKLQlpbnQgaW5kZXg7Ci0KLQlzdHJ1Y3QgdnBlICpwdnBlOwkvKiBwYXJlbnQgVlBFICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0YzsJLyogVGhlIGxpc3Qgb2YgVEMncyB3aXRoIHRoaXMgVlBFICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBUaGUgZ2xvYmFsIGxpc3Qgb2YgdGMncyAqLwotfTsKLQotc3RydWN0IHsKLQlzcGlubG9ja190IHZwZV9saXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2cGVfbGlzdDsJLyogVmlydHVhbCBwcm9jZXNzaW5nIGVsZW1lbnRzICovCi0Jc3BpbmxvY2tfdCB0Y19saXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0Y19saXN0OwkvKiBUaHJlYWQgY29udGV4dHMgKi8KLX0gdnBlY29udHJvbCA9IHsKK3N0cnVjdCB2cGVfY29udHJvbCB2cGVjb250cm9sID0gewogCS52cGVfbGlzdF9sb2NrCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQodnBlX2xpc3RfbG9jayksCiAJLnZwZV9saXN0CT0gTElTVF9IRUFEX0lOSVQodnBlY29udHJvbC52cGVfbGlzdCksCiAJLnRjX2xpc3RfbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHRjX2xpc3RfbG9jayksCiAJLnRjX2xpc3QJPSBMSVNUX0hFQURfSU5JVCh2cGVjb250cm9sLnRjX2xpc3QpCiB9OwogCi1zdGF0aWMgdm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKTsKLQogLyogZ2V0IHRoZSB2cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWlub3IgKi8KLXN0YXRpYyBzdHJ1Y3QgdnBlICpnZXRfdnBlKGludCBtaW5vcikKK3N0cnVjdCB2cGUgKmdldF92cGUoaW50IG1pbm9yKQogewogCXN0cnVjdCB2cGUgKnJlcywgKnY7CiAKQEAgLTE1OCw3ICs2MCw3IEBACiAJcmVzID0gTlVMTDsKIAlzcGluX2xvY2soJnZwZWNvbnRyb2wudnBlX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdnBlY29udHJvbC52cGVfbGlzdCwgbGlzdCkgewotCQlpZiAodi0+bWlub3IgPT0gbWlub3IpIHsKKwkJaWYgKHYtPm1pbm9yID09IFZQRV9NT0RVTEVfTUlOT1IpIHsKIAkJCXJlcyA9IHY7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY5LDcgKzcxLDcgQEAKIH0KIAogLyogZ2V0IHRoZSB2cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWlub3IgKi8KLXN0YXRpYyBzdHJ1Y3QgdGMgKmdldF90YyhpbnQgaW5kZXgpCitzdHJ1Y3QgdGMgKmdldF90YyhpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHRjICpyZXMsICp0OwogCkBAIC0xODcsMTIgKzg5LDEzIEBACiB9CiAKIC8qIGFsbG9jYXRlIGEgdnBlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1pbm9yIChvciBpbmRleCkgKi8KLXN0YXRpYyBzdHJ1Y3QgdnBlICphbGxvY192cGUoaW50IG1pbm9yKQorc3RydWN0IHZwZSAqYWxsb2NfdnBlKGludCBtaW5vcikKIHsKIAlzdHJ1Y3QgdnBlICp2OwogCi0JaWYgKCh2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwl2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwZSksIEdGUF9LRVJORUwpOworCWlmICh2ID09IE5VTEwpCisJCWdvdG8gb3V0OwogCiAJSU5JVF9MSVNUX0hFQUQoJnYtPnRjKTsKIAlzcGluX2xvY2soJnZwZWNvbnRyb2wudnBlX2xpc3RfbG9jayk7CkBAIC0yMDAsMTcgKzEwMywxOSBAQAogCXNwaW5fdW5sb2NrKCZ2cGVjb250cm9sLnZwZV9saXN0X2xvY2spOwogCiAJSU5JVF9MSVNUX0hFQUQoJnYtPm5vdGlmeSk7Ci0Jdi0+bWlub3IgPSBtaW5vcjsKKwl2LT5taW5vciA9IFZQRV9NT0RVTEVfTUlOT1I7CiAKK291dDoKIAlyZXR1cm4gdjsKIH0KIAogLyogYWxsb2NhdGUgYSB0Yy4gQXQgc3RhcnR1cCBvbmx5IHRjMCBpcyBydW5uaW5nLCBhbGwgb3RoZXIgY2FuIGJlIGhhbHRlZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgdGMgKmFsbG9jX3RjKGludCBpbmRleCkKK3N0cnVjdCB0YyAqYWxsb2NfdGMoaW50IGluZGV4KQogewogCXN0cnVjdCB0YyAqdGM7CiAKLQlpZiAoKHRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJdGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGMgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKIAlJTklUX0xJU1RfSEVBRCgmdGMtPnRjKTsKQEAgLTIyNSw3ICsxMzAsNyBAQAogfQogCiAvKiBjbGVhbiB1cCBhbmQgZnJlZSBldmVyeXRoaW5nICovCi1zdGF0aWMgdm9pZCByZWxlYXNlX3ZwZShzdHJ1Y3QgdnBlICp2KQordm9pZCByZWxlYXNlX3ZwZShzdHJ1Y3QgdnBlICp2KQogewogCWxpc3RfZGVsKCZ2LT5saXN0KTsKIAlpZiAodi0+bG9hZF9hZGRyKQpAQCAtMjMzLDI4ICsxMzgsOCBAQAogCWtmcmVlKHYpOwogfQogCi1zdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBkdW1wX210cmVncyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JdmFsID0gcmVhZF9jMF9jb25maWczKCk7Ci0JcHJpbnRrKCJjb25maWczIDB4JWx4IE1UICVsZFxuIiwgdmFsLAotCSAgICAgICAodmFsICYgQ09ORklHM19NVCkgPj4gQ09ORklHM19NVF9TSElGVCk7Ci0KLQl2YWwgPSByZWFkX2MwX212cGNvbnRyb2woKTsKLQlwcmludGsoIk1WUENvbnRyb2wgMHglbHgsIFNUTEIgJWxkIFZQQyAlbGQgRVZQICVsZFxuIiwgdmFsLAotCSAgICAgICAodmFsICYgTVZQQ09OVFJPTF9TVExCKSA+PiBNVlBDT05UUk9MX1NUTEJfU0hJRlQsCi0JICAgICAgICh2YWwgJiBNVlBDT05UUk9MX1ZQQykgPj4gTVZQQ09OVFJPTF9WUENfU0hJRlQsCi0JICAgICAgICh2YWwgJiBNVlBDT05UUk9MX0VWUCkpOwotCi0JdmFsID0gcmVhZF9jMF9tdnBjb25mMCgpOwotCXByaW50aygibXZwY29uZjAgMHglbHgsIFBWUEUgJWxkIFBUQyAlbGQgTSAlbGRcbiIsIHZhbCwKLQkgICAgICAgKHZhbCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQsCi0JICAgICAgIHZhbCAmIE1WUENPTkYwX1BUQywgKHZhbCAmIE1WUENPTkYwX00pID4+IE1WUENPTkYwX01fU0hJRlQpOwotfQotCi0vKiBGaW5kIHNvbWUgVlBFIHByb2dyYW0gc3BhY2UJKi8KLXN0YXRpYyB2b2lkICphbGxvY19wcm9nbWVtKHVuc2lnbmVkIGxvbmcgbGVuKQorLyogRmluZCBzb21lIFZQRSBwcm9ncmFtIHNwYWNlICovCit2b2lkICphbGxvY19wcm9nbWVtKHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXZvaWQgKmFkZHI7CiAKQEAgLTI3Myw3ICsxNTgsNyBAQAogCXJldHVybiBhZGRyOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKQordm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKQogewogI2lmbmRlZiBDT05GSUdfTUlQU19WUEVfTE9BREVSX1RPTQogCWtmcmVlKHB0cik7CkBAIC0yODEsNyArMTY2LDcgQEAKIH0KIAogLyogVXBkYXRlIHNpemUgd2l0aCB0aGlzIHNlY3Rpb246IHJldHVybiBvZmZzZXQuICovCi1zdGF0aWMgbG9uZyBnZXRfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgKnNpemUsIEVsZl9TaGRyICogc2VjaGRyKQorc3RhdGljIGxvbmcgZ2V0X29mZnNldCh1bnNpZ25lZCBsb25nICpzaXplLCBFbGZfU2hkciAqc2VjaGRyKQogewogCWxvbmcgcmV0OwogCkBAIC0yOTQsOCArMTc5LDggQEAKICAgIG1pZ2h0IC0tIGNvZGUsIHJlYWQtb25seSBkYXRhLCByZWFkLXdyaXRlIGRhdGEsIHNtYWxsIGRhdGEuCVRhbGx5CiAgICBzaXplcywgYW5kIHBsYWNlIHRoZSBvZmZzZXRzIGludG8gc2hfZW50c2l6ZSBmaWVsZHM6IGhpZ2ggYml0IG1lYW5zIGl0CiAgICBiZWxvbmdzIGluIGluaXQuICovCi1zdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBFbGZfRWhkciAqIGhkciwKLQkJCSAgICBFbGZfU2hkciAqIHNlY2hkcnMsIGNvbnN0IGNoYXIgKnNlY3N0cmluZ3MpCitzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBFbGZfRWhkciAqaGRyLAorCQkJICAgIEVsZl9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzZWNzdHJpbmdzKQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnN0IG1hc2tzW11bMl0gPSB7CiAJCS8qIE5PVEU6IGFsbCBleGVjdXRhYmxlIGNvZGUgbXVzdCBiZSB0aGUgZmlyc3Qgc2VjdGlvbgpAQCAtMzE1LDcgKzIwMCw2IEBACiAJCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07ICsraSkgewogCQkJRWxmX1NoZHIgKnMgPSAmc2VjaGRyc1tpXTsKIAotCQkJLy8gIHx8IHN0cm5jbXAoc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUsICIuaW5pdCIsIDUpID09IDApCiAJCQlpZiAoKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMF0pICE9IG1hc2tzW21dWzBdCiAJCQkgICAgfHwgKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMV0pCiAJCQkgICAgfHwgcy0+c2hfZW50c2l6ZSAhPSB+MFVMKQpAQCAtMzMwLDcgKzIxNCw2IEBACiAJfQogfQogCi0KIC8qIGZyb20gbW9kdWxlLWVsZjMyLmMsIGJ1dCBzdWJ2ZXJ0ZWQgYSBsaXR0bGUgKi8KIAogc3RydWN0IG1pcHNfaGkxNiB7CkBAIC0zNTMsMjAgKzIzNiwxOCBAQAogewogCWludCByZWw7CiAKLQlpZiggISgqbG9jYXRpb24gJiAweGZmZmYpICkgeworCWlmICghKCpsb2NhdGlvbiAmIDB4ZmZmZikpIHsKIAkJcmVsID0gKGludCl2IC0gZ3BfYWRkcjsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogLnNic3MgKyBncChyZWxhdGl2ZSkgKyBvZmZzZXQgKi8KIAkJLyoga2x1ZGdlISAqLwogCQlyZWwgPSAgKGludCkoc2hvcnQpKChpbnQpdiArIGdwX29mZnMgKwogCQkJCSAgICAoaW50KShzaG9ydCkoKmxvY2F0aW9uICYgMHhmZmZmKSAtIGdwX2FkZHIpOwogCX0KIAotCWlmKCAocmVsID4gMzI3NjgpIHx8IChyZWwgPCAtMzI3NjgpICkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiVlBFIGxvYWRlcjogYXBwbHlfcl9taXBzX2dwcmVsMTY6ICIKLQkJICAgICAgICJyZWxhdGl2ZSBhZGRyZXNzIDB4JXggb3V0IG9mIHJhbmdlIG9mIGdwIHJlZ2lzdGVyXG4iLAotCQkgICAgICAgcmVsKTsKKwlpZiAoKHJlbCA+IDMyNzY4KSB8fCAocmVsIDwgLTMyNzY4KSkgeworCQlwcl9kZWJ1ZygiVlBFIGxvYWRlcjogYXBwbHlfcl9taXBzX2dwcmVsMTY6IHJlbGF0aXZlIGFkZHJlc3MgMHgleCBvdXQgb2YgcmFuZ2Ugb2YgZ3AgcmVnaXN0ZXJcbiIsCisJCQkgcmVsKTsKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KIApAQCAtMzgwLDEyICsyNjEsMTIgQEAKIHsKIAlpbnQgcmVsOwogCXJlbCA9ICgoKHVuc2lnbmVkIGludCl2IC0gKHVuc2lnbmVkIGludClsb2NhdGlvbikpOwotCXJlbCA+Pj0gMjsJCS8vIGJlY2F1c2UgdGhlIG9mZnNldCBpcyBpbiBfaW5zdHJ1Y3Rpb25zXyBub3QgYnl0ZXMuCi0JcmVsIC09IDE7CQkvLyBhbmQgb25lIGluc3RydWN0aW9uIGxlc3MgZHVlIHRvIHRoZSBicmFuY2ggZGVsYXkgc2xvdC4KKwlyZWwgPj49IDI7IC8qIGJlY2F1c2UgdGhlIG9mZnNldCBpcyBpbiBfaW5zdHJ1Y3Rpb25zXyBub3QgYnl0ZXMuICovCisJcmVsIC09IDE7ICAvKiBhbmQgb25lIGluc3RydWN0aW9uIGxlc3MgZHVlIHRvIHRoZSBicmFuY2ggZGVsYXkgc2xvdC4gKi8KIAotCWlmKCAocmVsID4gMzI3NjgpIHx8IChyZWwgPCAtMzI3NjgpICkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiVlBFIGxvYWRlcjogIgotCQkgICAgICAgImFwcGx5X3JfbWlwc19wYzE2OiByZWxhdGl2ZSBhZGRyZXNzIG91dCBvZiByYW5nZSAweCV4XG4iLCByZWwpOworCWlmICgocmVsID4gMzI3NjgpIHx8IChyZWwgPCAtMzI3NjgpKSB7CisJCXByX2RlYnVnKCJWUEUgbG9hZGVyOiBhcHBseV9yX21pcHNfcGMxNjogcmVsYXRpdmUgYWRkcmVzcyBvdXQgb2YgcmFuZ2UgMHgleFxuIiwKKwkJCSByZWwpOwogCQlyZXR1cm4gLUVOT0VYRUM7CiAJfQogCkBAIC00MDYsOCArMjg3LDcgQEAKIAkJCSAgIEVsZjMyX0FkZHIgdikKIHsKIAlpZiAodiAlIDQpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlZQRSBsb2FkZXI6IGFwcGx5X3JfbWlwc18yNiAiCi0JCSAgICAgICAiIHVuYWxpZ25lZCByZWxvY2F0aW9uXG4iKTsKKwkJcHJfZGVidWcoIlZQRSBsb2FkZXI6IGFwcGx5X3JfbWlwc18yNjogdW5hbGlnbmVkIHJlbG9jYXRpb25cbiIpOwogCQlyZXR1cm4gLUVOT0VYRUM7CiAJfQogCkBAIC00MzgsNyArMzE4LDcgQEAKIAkgKiB0aGUgY2Fycnkgd2UgbmVlZCB0byBhZGQuICBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2IGRvIHRoZQogCSAqIGFjdHVhbCByZWxvY2F0aW9uLgogCSAqLwotCW4gPSBrbWFsbG9jKHNpemVvZiAqbiwgR0ZQX0tFUk5FTCk7CisJbiA9IGttYWxsb2Moc2l6ZW9mKCpuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDcwLDkgKzM1MCw3IEBACiAJCQkgKiBUaGUgdmFsdWUgZm9yIHRoZSBISTE2IGhhZCBiZXN0IGJlIHRoZSBzYW1lLgogCQkJICovCiAJCQlpZiAodiAhPSBsLT52YWx1ZSkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJWUEUgbG9hZGVyOiAiCi0JCQkJICAgICAgICJhcHBseV9yX21pcHNfbG8xNi9oaTE2OiBcdCIKLQkJCQkgICAgICAgImluY29uc2lzdGVudCB2YWx1ZSBpbmZvcm1hdGlvblxuIik7CisJCQkJcHJfZGVidWcoIlZQRSBsb2FkZXI6IGFwcGx5X3JfbWlwc19sbzE2L2hpMTY6IGluY29uc2lzdGVudCB2YWx1ZSBpbmZvcm1hdGlvblxuIik7CiAJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KIApAQCAtNTY4LDIwICs0NDYsMTkgQEAKIAkJCSsgRUxGMzJfUl9TWU0ocl9pbmZvKTsKIAogCQlpZiAoIXN5bS0+c3RfdmFsdWUpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5kZWZpbmVkIHdlYWsgc3ltYm9sICVzXG4iLAotCQkJICAgICAgIG1lLT5uYW1lLCBzdHJ0YWIgKyBzeW0tPnN0X25hbWUpOworCQkJcHJfZGVidWcoIiVzOiB1bmRlZmluZWQgd2VhayBzeW1ib2wgJXNcbiIsCisJCQkJIG1lLT5uYW1lLCBzdHJ0YWIgKyBzeW0tPnN0X25hbWUpOwogCQkJLyoganVzdCBwcmludCB0aGUgd2FybmluZywgZG9udCBiYXJmICovCiAJCX0KIAogCQl2ID0gc3ltLT5zdF92YWx1ZTsKIAogCQlyZXMgPSByZWxvY19oYW5kbGVyc1tFTEYzMl9SX1RZUEUocl9pbmZvKV0obWUsIGxvY2F0aW9uLCB2KTsKLQkJaWYoIHJlcyApIHsKKwkJaWYgKHJlcykgewogCQkJY2hhciAqciA9IHJzdHJzW0VMRjMyX1JfVFlQRShyX2luZm8pXTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZQRSBsb2FkZXI6IC50ZXh0KzB4JXggIgotCQkJICAgICAgICJyZWxvY2F0aW9uIHR5cGUgJXMgZm9yIHN5bWJvbCBcIiVzXCIgZmFpbGVkXG4iLAotCQkJICAgICAgIHJlbFtpXS5yX29mZnNldCwgciA/IHIgOiAiVU5LTk9XTiIsCi0JCQkgICAgICAgc3RydGFiICsgc3ltLT5zdF9uYW1lKTsKKwkJCXByX3dhcm4oIlZQRSBsb2FkZXI6IC50ZXh0KzB4JXggcmVsb2NhdGlvbiB0eXBlICVzIGZvciBzeW1ib2wgXCIlc1wiIGZhaWxlZFxuIiwKKwkJCQlyZWxbaV0ucl9vZmZzZXQsIHIgPyByIDogIlVOS05PV04iLAorCQkJCXN0cnRhYiArIHN5bS0+c3RfbmFtZSk7CiAJCQlyZXR1cm4gcmVzOwogCQl9CiAJfQpAQCAtNTk2LDEwICs0NzMsOCBAQAogfQogLyogZW5kIG1vZHVsZS1lbGYzMi5jICovCiAKLQotCiAvKiBDaGFuZ2UgYWxsIHN5bWJvbHMgc28gdGhhdCBzaF92YWx1ZSBlbmNvZGVzIHRoZSBwb2ludGVyIGRpcmVjdGx5LiAqLwotc3RhdGljIHZvaWQgc2ltcGxpZnlfc3ltYm9scyhFbGZfU2hkciAqIHNlY2hkcnMsCitzdGF0aWMgdm9pZCBzaW1wbGlmeV9zeW1ib2xzKEVsZl9TaGRyICpzZWNoZHJzLAogCQkJICAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKIAkJCSAgICBjb25zdCBjaGFyICpzdHJ0YWIsCiAJCQkgICAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKQEAgLTY0MCwxOCArNTE1LDE2IEBACiAJCQlicmVhazsKIAogCQljYXNlIFNITl9NSVBTX1NDT01NT046Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAic2ltcGxpZnlfc3ltYm9sczogaWdub3JpbmcgU0hOX01JUFNfU0NPTU1PTiAiCi0JCQkgICAgICAgInN5bWJvbCA8JXM+IHN0X3NobmR4ICVkXG4iLCBzdHJ0YWIgKyBzeW1baV0uc3RfbmFtZSwKLQkJCSAgICAgICBzeW1baV0uc3Rfc2huZHgpOwotCQkJLy8gLnNic3Mgc2VjdGlvbgorCQkJcHJfZGVidWcoInNpbXBsaWZ5X3N5bWJvbHM6IGlnbm9yaW5nIFNITl9NSVBTX1NDT01NT04gc3ltYm9sIDwlcz4gc3Rfc2huZHggJWRcbiIsCisJCQkJIHN0cnRhYiArIHN5bVtpXS5zdF9uYW1lLCBzeW1baV0uc3Rfc2huZHgpOworCQkJLyogLnNic3Mgc2VjdGlvbiAqLwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAkJCXNlY2Jhc2UgPSBzZWNoZHJzW3N5bVtpXS5zdF9zaG5keF0uc2hfYWRkcjsKIAotCQkJaWYgKHN0cm5jbXAoc3RydGFiICsgc3ltW2ldLnN0X25hbWUsICJfZ3AiLCAzKSA9PSAwKSB7CisJCQlpZiAoc3RybmNtcChzdHJ0YWIgKyBzeW1baV0uc3RfbmFtZSwgIl9ncCIsIDMpID09IDApCiAJCQkJc2F2ZV9ncF9hZGRyZXNzKHNlY2Jhc2UsIHN5bVtpXS5zdF92YWx1ZSk7Ci0JCQl9CiAKIAkJCXN5bVtpXS5zdF92YWx1ZSArPSBzZWNiYXNlOwogCQkJYnJlYWs7CkBAIC02NjAsMTQyICs1MzMsMjEgQEAKIH0KIAogI2lmZGVmIERFQlVHX0VMRkxPQURFUgotc3RhdGljIHZvaWQgZHVtcF9lbGZzeW1ib2xzKEVsZl9TaGRyICogc2VjaGRycywgdW5zaWduZWQgaW50IHN5bWluZGV4LAorc3RhdGljIHZvaWQgZHVtcF9lbGZzeW1ib2xzKEVsZl9TaGRyICpzZWNoZHJzLCB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCiAJCQkgICAgY29uc3QgY2hhciAqc3RydGFiLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJRWxmX1N5bSAqc3ltID0gKHZvaWQgKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyOwogCXVuc2lnbmVkIGludCBpLCBuID0gc2VjaGRyc1tzeW1pbmRleF0uc2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJkdW1wX2VsZnN5bWJvbHM6IG4gJWRcbiIsIG4pOworCXByX2RlYnVnKCJkdW1wX2VsZnN5bWJvbHM6IG4gJWRcbiIsIG4pOwogCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiBpICVkIG5hbWUgPCVzPiAweCV4XG4iLCBpLAotCQkgICAgICAgc3RydGFiICsgc3ltW2ldLnN0X25hbWUsIHN5bVtpXS5zdF92YWx1ZSk7CisJCXByX2RlYnVnKCIgaSAlZCBuYW1lIDwlcz4gMHgleFxuIiwgaSwgc3RydGFiICsgc3ltW2ldLnN0X25hbWUsCisJCQkgc3ltW2ldLnN0X3ZhbHVlKTsKIAl9CiB9CiAjZW5kaWYKIAotLyogV2UgYXJlIHByZXBhcmVkIHNvIGNvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIFZQRS4uLiAqLwotc3RhdGljIGludCB2cGVfcnVuKHN0cnVjdCB2cGUgKiB2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbCwgZG10X2ZsYWc7Ci0Jc3RydWN0IHZwZV9ub3RpZmljYXRpb25zICpuOwotCXVuc2lnbmVkIGludCB2cGVmbGFnczsKLQlzdHJ1Y3QgdGMgKnQ7Ci0KLQkvKiBjaGVjayB3ZSBhcmUgdGhlIE1hc3RlciBWUEUgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdmFsID0gcmVhZF9jMF92cGVjb25mMCgpOwotCWlmICghKHZhbCAmIFZQRUNPTkYwX01WUCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlZQRSBsb2FkZXI6IG9ubHkgTWFzdGVyIFZQRSdzIGFyZSBhbGxvd2VkIHRvIGNvbmZpZ3VyZSBNVFxuIik7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZG10X2ZsYWcgPSBkbXQoKTsKLQl2cGVmbGFncyA9IGR2cGUoKTsKLQotCWlmIChsaXN0X2VtcHR5KCZ2LT50YykpIHsKLQkJZXZwZSh2cGVmbGFncyk7Ci0JCWVtdChkbXRfZmxhZyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiVlBFIGxvYWRlcjogTm8gVEMncyBhc3NvY2lhdGVkIHdpdGggVlBFICVkXG4iLAotCQkgICAgICAgdi0+bWlub3IpOwotCi0JCXJldHVybiAtRU5PRVhFQzsKLQl9Ci0KLQl0ID0gbGlzdF9maXJzdF9lbnRyeSgmdi0+dGMsIHN0cnVjdCB0YywgdGMpOwotCi0JLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLwotCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKLQotCXNldHRjKHQtPmluZGV4KTsKLQotCS8qIHNob3VsZCBjaGVjayBpdCBpcyBoYWx0ZWQsIGFuZCBub3QgYWN0aXZhdGVkICovCi0JaWYgKChyZWFkX3RjX2MwX3Rjc3RhdHVzKCkgJiBUQ1NUQVRVU19BKSB8fCAhKHJlYWRfdGNfYzBfdGNoYWx0KCkgJiBUQ0hBTFRfSCkpIHsKLQkJZXZwZSh2cGVmbGFncyk7Ci0JCWVtdChkbXRfZmxhZyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJWUEUgbG9hZGVyOiBUQyAlZCBpcyBhbHJlYWR5IGFjdGl2ZSFcbiIsCi0JCSAgICAgICB0LT5pbmRleCk7Ci0KLQkJcmV0dXJuIC1FTk9FWEVDOwotCX0KLQotCS8qIFdyaXRlIHRoZSBhZGRyZXNzIHdlIHdhbnQgaXQgdG8gc3RhcnQgcnVubmluZyBmcm9tIGluIHRoZSBUQ1BDIHJlZ2lzdGVyLiAqLwotCXdyaXRlX3RjX2MwX3RjcmVzdGFydCgodW5zaWduZWQgbG9uZyl2LT5fX3N0YXJ0KTsKLQl3cml0ZV90Y19jMF90Y2NvbnRleHQoKHVuc2lnbmVkIGxvbmcpMCk7Ci0KLQkvKgotCSAqIE1hcmsgdGhlIFRDIGFzIGFjdGl2YXRlZCwgbm90IGludGVycnVwdCBleGVtcHQgYW5kIG5vdCBkeW5hbWljYWxseQotCSAqIGFsbG9jYXRhYmxlCi0JICovCi0JdmFsID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOwotCXZhbCA9ICh2YWwgJiB+KFRDU1RBVFVTX0RBIHwgVENTVEFUVVNfSVhNVCkpIHwgVENTVEFUVVNfQTsKLQl3cml0ZV90Y19jMF90Y3N0YXR1cyh2YWwpOwotCi0Jd3JpdGVfdGNfYzBfdGNoYWx0KHJlYWRfdGNfYzBfdGNoYWx0KCkgJiB+VENIQUxUX0gpOwotCi0JLyoKLQkgKiBUaGUgc2RlLWtpdCBwYXNzZXMgJ21lbXNpemUnIHRvIF9fc3RhcnQgaW4gJGEzLCBzbyBzZXQgc29tZXRoaW5nCi0JICogaGVyZS4uLiAgT3Igc2V0ICRhMyB0byB6ZXJvIGFuZCBkZWZpbmUgREZMVF9TVEFDS19TSVpFIGFuZAotCSAqIERGTFRfSEVBUF9TSVpFIHdoZW4geW91IGNvbXBpbGUgeW91ciBwcm9ncmFtCi0JICovCi0JbXR0Z3ByKDYsIHYtPm50Y3MpOwotCW10dGdwcig3LCBwaHlzaWNhbF9tZW1zaXplKTsKLQotCS8qIHNldCB1cCBWUEUxICovCi0JLyoKLQkgKiBiaW5kIHRoZSBUQyB0byBWUEUgMSBhcyBsYXRlIGFzIHBvc3NpYmxlIHNvIHdlIG9ubHkgaGF2ZSB0aGUgZmluYWwKLQkgKiBWUEUgcmVnaXN0ZXJzIHRvIHNldCB1cCwgYW5kIHNvIGFuIEVKVEFHIHByb2JlIGNhbiB0cmlnZ2VyIG9uIGl0Ci0JICovCi0Jd3JpdGVfdGNfYzBfdGNiaW5kKChyZWFkX3RjX2MwX3RjYmluZCgpICYgflRDQklORF9DVVJWUEUpIHwgMSk7Ci0KLQl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH4oVlBFQ09ORjBfVlBBKSk7Ci0KLQliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7Ci0KLQkvKiBTZXQgdXAgdGhlIFhUQyBiaXQgaW4gdnBlY29uZjAgdG8gcG9pbnQgYXQgb3VyIHRjICovCi0Jd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKCAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH4oVlBFQ09ORjBfWFRDKSkKLQkJCSAgICAgIHwgKHQtPmluZGV4IDw8IFZQRUNPTkYwX1hUQ19TSElGVCkpOwotCi0JYmFja190b19iYWNrX2MwX2hhemFyZCgpOwotCi0JLyogZW5hYmxlIHRoaXMgVlBFICovCi0Jd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCkgfCBWUEVDT05GMF9WUEEpOwotCi0JLyogY2xlYXIgb3V0IGFueSBsZWZ0IG92ZXJzIGZyb20gYSBwcmV2aW91cyBwcm9ncmFtICovCi0Jd3JpdGVfdnBlX2MwX3N0YXR1cygwKTsKLQl3cml0ZV92cGVfYzBfY2F1c2UoMCk7Ci0KLQkvKiB0YWtlIHN5c3RlbSBvdXQgb2YgY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCi0JLyoKLQkgKiBTTVRDL1NNVlAga2VybmVscyBtYW5hZ2UgVlBFIGVuYWJsZSBpbmRlcGVuZGVudGx5LAotCSAqIGJ1dCB1bmlwcm9jZXNzb3Iga2VybmVscyBuZWVkIHRvIHR1cm4gaXQgb24sIGV2ZW4KLQkgKiBpZiB0aGF0IHdhc24ndCB0aGUgcHJlLWR2cGUoKSBzdGF0ZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0JZXZwZSh2cGVmbGFncyk7Ci0jZWxzZQotCWV2cGUoRVZQRV9FTkFCTEUpOwotI2VuZGlmCi0JZW10KGRtdF9mbGFnKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG4sICZ2LT5ub3RpZnksIGxpc3QpCi0JCW4tPnN0YXJ0KG1pbm9yKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZpbmRfdnBlX3N5bWJvbHMoc3RydWN0IHZwZSAqIHYsIEVsZl9TaGRyICogc2VjaGRycywKK3N0YXRpYyBpbnQgZmluZF92cGVfc3ltYm9scyhzdHJ1Y3QgdnBlICp2LCBFbGZfU2hkciAqc2VjaGRycywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIGNvbnN0IGNoYXIgKnN0cnRhYiwKIAkJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CkBAIC04MDMsMTYgKzU1NSwxNCBAQAogCXVuc2lnbmVkIGludCBpLCBuID0gc2VjaGRyc1tzeW1pbmRleF0uc2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKTsKIAogCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJaWYgKHN0cmNtcChzdHJ0YWIgKyBzeW1baV0uc3RfbmFtZSwgIl9fc3RhcnQiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAoc3RydGFiICsgc3ltW2ldLnN0X25hbWUsICJfX3N0YXJ0IikgPT0gMCkKIAkJCXYtPl9fc3RhcnQgPSBzeW1baV0uc3RfdmFsdWU7Ci0JCX0KIAotCQlpZiAoc3RyY21wKHN0cnRhYiArIHN5bVtpXS5zdF9uYW1lLCAidnBlX3NoYXJlZCIpID09IDApIHsKKwkJaWYgKHN0cmNtcChzdHJ0YWIgKyBzeW1baV0uc3RfbmFtZSwgInZwZV9zaGFyZWQiKSA9PSAwKQogCQkJdi0+c2hhcmVkX3B0ciA9ICh2b2lkICopc3ltW2ldLnN0X3ZhbHVlOwotCQl9CiAJfQogCi0JaWYgKCAodi0+X19zdGFydCA9PSAwKSB8fCAodi0+c2hhcmVkX3B0ciA9PSBOVUxMKSkKKwlpZiAoKHYtPl9fc3RhcnQgPT0gMCkgfHwgKHYtPnNoYXJlZF9wdHIgPT0gTlVMTCkpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpAQCAtODIzLDE0ICs1NzMsMTQgQEAKICAqIGNvbnRlbnRzIG9mIHRoZSBwcm9ncmFtIChwKWJ1ZmZlciBwZXJmb3JtaW5nIHJlbG9jYXRhdGlvbnMvZXRjLCBmcmVlJ3MgaXQKICAqIHdoZW4gZmluaXNoZWQuCiAgKi8KLXN0YXRpYyBpbnQgdnBlX2VsZmxvYWQoc3RydWN0IHZwZSAqIHYpCitzdGF0aWMgaW50IHZwZV9lbGZsb2FkKHN0cnVjdCB2cGUgKnYpCiB7CiAJRWxmX0VoZHIgKmhkcjsKIAlFbGZfU2hkciAqc2VjaGRyczsKIAlsb25nIGVyciA9IDA7CiAJY2hhciAqc2Vjc3RyaW5ncywgKnN0cnRhYiA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGxlbiwgaSwgc3ltaW5kZXggPSAwLCBzdHJpbmRleCA9IDAsIHJlbG9jYXRlID0gMDsKLQlzdHJ1Y3QgbW9kdWxlIG1vZDsJLy8gc28gd2UgY2FuIHJlLXVzZSB0aGUgcmVsb2NhdGlvbnMgY29kZQorCXN0cnVjdCBtb2R1bGUgbW9kOyAvKiBzbyB3ZSBjYW4gcmUtdXNlIHRoZSByZWxvY2F0aW9ucyBjb2RlICovCiAKIAltZW1zZXQoJm1vZCwgMCwgc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKTsKIAlzdHJjcHkobW9kLm5hbWUsICJWUEUgbG9hZGVyIik7CkBAIC04NDQsOCArNTk0LDcgQEAKIAkgICAgfHwgKGhkci0+ZV90eXBlICE9IEVUX1JFTCAmJiBoZHItPmVfdHlwZSAhPSBFVF9FWEVDKQogCSAgICB8fCAhZWxmX2NoZWNrX2FyY2goaGRyKQogCSAgICB8fCBoZHItPmVfc2hlbnRzaXplICE9IHNpemVvZigqc2VjaGRycykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlZQRSBsb2FkZXI6IHByb2dyYW0gd3JvbmcgYXJjaCBvciB3ZWlyZCBlbGYgdmVyc2lvblxuIik7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IHByb2dyYW0gd3JvbmcgYXJjaCBvciB3ZWlyZCBlbGYgdmVyc2lvblxuIik7CiAKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KQEAgLTg1NCw4ICs2MDMsNyBAQAogCQlyZWxvY2F0ZSA9IDE7CiAKIAlpZiAobGVuIDwgaGRyLT5lX3Nob2ZmICsgaGRyLT5lX3NobnVtICogc2l6ZW9mKEVsZl9TaGRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlZQRSBsb2FkZXI6IHByb2dyYW0gbGVuZ3RoICV1IHRydW5jYXRlZFxuIiwKLQkJICAgICAgIGxlbik7CisJCXByX2VycigiVlBFIGxvYWRlcjogcHJvZ3JhbSBsZW5ndGggJXUgdHJ1bmNhdGVkXG4iLCBsZW4pOwogCiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CkBAIC04NzAsMjIgKzYxOCwyNCBAQAogCiAJaWYgKHJlbG9jYXRlKSB7CiAJCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JCQkgICAgJiYgbGVuIDwgc2VjaGRyc1tpXS5zaF9vZmZzZXQgKyBzZWNoZHJzW2ldLnNoX3NpemUpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlZQRSBwcm9ncmFtIGxlbmd0aCAldSB0cnVuY2F0ZWRcbiIsCisJCQlpZiAoKHNlY2hkcnNbaV0uc2hfdHlwZSAhPSBTSFRfTk9CSVRTKSAmJgorCQkJICAgIChsZW4gPCBzZWNoZHJzW2ldLnNoX29mZnNldCArIHNlY2hkcnNbaV0uc2hfc2l6ZSkpIHsKKwkJCQlwcl9lcnIoIlZQRSBwcm9ncmFtIGxlbmd0aCAldSB0cnVuY2F0ZWRcbiIsCiAJCQkJICAgICAgIGxlbik7CiAJCQkJcmV0dXJuIC1FTk9FWEVDOwogCQkJfQogCiAJCQkvKiBNYXJrIGFsbCBzZWN0aW9ucyBzaF9hZGRyIHdpdGggdGhlaXIgYWRkcmVzcyBpbiB0aGUKIAkJCSAgIHRlbXBvcmFyeSBpbWFnZS4gKi8KLQkJCXNlY2hkcnNbaV0uc2hfYWRkciA9IChzaXplX3QpIGhkciArIHNlY2hkcnNbaV0uc2hfb2Zmc2V0OworCQkJc2VjaGRyc1tpXS5zaF9hZGRyID0gKHNpemVfdCkgaGRyICsKKwkJCQlzZWNoZHJzW2ldLnNoX29mZnNldDsKIAogCQkJLyogSW50ZXJuYWwgc3ltYm9scyBhbmQgc3RyaW5ncy4gKi8KIAkJCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikgewogCQkJCXN5bWluZGV4ID0gaTsKIAkJCQlzdHJpbmRleCA9IHNlY2hkcnNbaV0uc2hfbGluazsKLQkJCQlzdHJ0YWIgPSAoY2hhciAqKWhkciArIHNlY2hkcnNbc3RyaW5kZXhdLnNoX29mZnNldDsKKwkJCQlzdHJ0YWIgPSAoY2hhciAqKWhkciArCisJCQkJCXNlY2hkcnNbc3RyaW5kZXhdLnNoX29mZnNldDsKIAkJCX0KIAkJfQogCQlsYXlvdXRfc2VjdGlvbnMoJm1vZCwgaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKQEAgLTkxMiw4ICs2NjIsOSBAQAogCQkJLyogVXBkYXRlIHNoX2FkZHIgdG8gcG9pbnQgdG8gY29weSBpbiBpbWFnZS4gKi8KIAkJCXNlY2hkcnNbaV0uc2hfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7CiAKLQkJCXByaW50ayhLRVJOX0RFQlVHICIgc2VjdGlvbiBzaF9uYW1lICVzIHNoX2FkZHIgMHgleFxuIiwKLQkJCSAgICAgICBzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCBzZWNoZHJzW2ldLnNoX2FkZHIpOworCQkJcHJfZGVidWcoIiBzZWN0aW9uIHNoX25hbWUgJXMgc2hfYWRkciAweCV4XG4iLAorCQkJCSBzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLAorCQkJCSBzZWNoZHJzW2ldLnNoX2FkZHIpOwogCQl9CiAKIAkJLyogRml4IHVwIHN5bXMsIHNvIHRoYXQgc3RfdmFsdWUgaXMgYSBwb2ludGVyIHRvIGxvY2F0aW9uLiAqLwpAQCAtOTM0LDE3ICs2ODUsMTggQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfUkVMKQotCQkJCWVyciA9IGFwcGx5X3JlbG9jYXRpb25zKHNlY2hkcnMsIHN0cnRhYiwgc3ltaW5kZXgsIGksCi0JCQkJCQkJJm1vZCk7CisJCQkJZXJyID0gYXBwbHlfcmVsb2NhdGlvbnMoc2VjaGRycywgc3RydGFiLAorCQkJCQkJCXN5bWluZGV4LCBpLCAmbW9kKTsKIAkJCWVsc2UgaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkJCQllcnIgPSBhcHBseV9yZWxvY2F0ZV9hZGQoc2VjaGRycywgc3RydGFiLCBzeW1pbmRleCwgaSwKLQkJCQkJCQkgJm1vZCk7CisJCQkJZXJyID0gYXBwbHlfcmVsb2NhdGVfYWRkKHNlY2hkcnMsIHN0cnRhYiwKKwkJCQkJCQkgc3ltaW5kZXgsIGksICZtb2QpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAogCQl9CiAJfSBlbHNlIHsKLQkJc3RydWN0IGVsZl9waGRyICpwaGRyID0gKHN0cnVjdCBlbGZfcGhkciAqKSAoKGNoYXIgKiloZHIgKyBoZHItPmVfcGhvZmYpOworCQlzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIgPSAoc3RydWN0IGVsZl9waGRyICopCisJCQkJCQkoKGNoYXIgKiloZHIgKyBoZHItPmVfcGhvZmYpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfcGhudW07IGkrKykgewogCQkJaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEKSB7CkBAIC05NjIsMTEgKzcxNCwxNSBAQAogCQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCKSB7CiAJCQkJc3ltaW5kZXggPSBpOwogCQkJCXN0cmluZGV4ID0gc2VjaGRyc1tpXS5zaF9saW5rOwotCQkJCXN0cnRhYiA9IChjaGFyICopaGRyICsgc2VjaGRyc1tzdHJpbmRleF0uc2hfb2Zmc2V0OworCQkJCXN0cnRhYiA9IChjaGFyICopaGRyICsKKwkJCQkJc2VjaGRyc1tzdHJpbmRleF0uc2hfb2Zmc2V0OwogCi0JCQkJLyogbWFyayB0aGUgc3ltdGFiJ3MgYWRkcmVzcyBmb3Igd2hlbiB3ZSB0cnkgdG8gZmluZCB0aGUKLQkJCQkgICBtYWdpYyBzeW1ib2xzICovCi0JCQkJc2VjaGRyc1tpXS5zaF9hZGRyID0gKHNpemVfdCkgaGRyICsgc2VjaGRyc1tpXS5zaF9vZmZzZXQ7CisJCQkJLyoKKwkJCQkgKiBtYXJrIHN5bXRhYidzIGFkZHJlc3MgZm9yIHdoZW4gd2UgdHJ5CisJCQkJICogdG8gZmluZCB0aGUgbWFnaWMgc3ltYm9scworCQkJCSAqLworCQkJCXNlY2hkcnNbaV0uc2hfYWRkciA9IChzaXplX3QpIGhkciArCisJCQkJCXNlY2hkcnNbaV0uc2hfb2Zmc2V0OwogCQkJfQogCQl9CiAJfQpAQCAtOTc3LDUzICs3MzMsMTkgQEAKIAogCWlmICgoZmluZF92cGVfc3ltYm9scyh2LCBzZWNoZHJzLCBzeW1pbmRleCwgc3RydGFiLCAmbW9kKSkgPCAwKSB7CiAJCWlmICh2LT5fX3N0YXJ0ID09IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZQRSBsb2FkZXI6IHByb2dyYW0gZG9lcyBub3QgY29udGFpbiAiCi0JCQkgICAgICAgImEgX19zdGFydCBzeW1ib2xcbiIpOworCQkJcHJfd2FybigiVlBFIGxvYWRlcjogcHJvZ3JhbSBkb2VzIG5vdCBjb250YWluIGEgX19zdGFydCBzeW1ib2xcbiIpOwogCQkJcmV0dXJuIC1FTk9FWEVDOwogCQl9CiAKIAkJaWYgKHYtPnNoYXJlZF9wdHIgPT0gTlVMTCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZQRSBsb2FkZXI6ICIKLQkJCSAgICAgICAicHJvZ3JhbSBkb2VzIG5vdCBjb250YWluIHZwZV9zaGFyZWQgc3ltYm9sLlxuIgotCQkJICAgICAgICIgVW5hYmxlIHRvIHVzZSBBTVZQIChBUC9TUCkgZmFjaWxpdGllcy5cbiIpOworCQkJcHJfd2FybigiVlBFIGxvYWRlcjogcHJvZ3JhbSBkb2VzIG5vdCBjb250YWluIHZwZV9zaGFyZWQgc3ltYm9sLlxuIgorCQkJCSIgVW5hYmxlIHRvIHVzZSBBTVZQIChBUC9TUCkgZmFjaWxpdGllcy5cbiIpOwogCX0KIAotCXByaW50aygiIGVsZiBsb2FkZWRcbiIpOworCXByX2luZm8oIiBlbGYgbG9hZGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF90YyhzdHJ1Y3QgdGMgKnRjKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IG10ZmxhZ3MsIHZwZmxhZ3M7Ci0JaW50IHRtcDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQltdGZsYWdzID0gZG10KCk7Ci0JdnBmbGFncyA9IGR2cGUoKTsKLQkvKiBQdXQgTVZQRSdzIGludG8gJ2NvbmZpZ3VyYXRpb24gc3RhdGUnICovCi0Jc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCi0Jc2V0dGModGMtPmluZGV4KTsKLQl0bXAgPSByZWFkX3RjX2MwX3Rjc3RhdHVzKCk7Ci0KLQkvKiBtYXJrIG5vdCBhbGxvY2F0ZWQgYW5kIG5vdCBkeW5hbWljYWxseSBhbGxvY2F0YWJsZSAqLwotCXRtcCAmPSB+KFRDU1RBVFVTX0EgfCBUQ1NUQVRVU19EQSk7Ci0JdG1wIHw9IFRDU1RBVFVTX0lYTVQ7CS8qIGludGVycnVwdCBleGVtcHQgKi8KLQl3cml0ZV90Y19jMF90Y3N0YXR1cyh0bXApOwotCi0Jd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKLQltaXBzX2loYigpOwotCi0JLyogYmluZCBpdCB0byBhbnl0aGluZyBvdGhlciB0aGFuIFZQRTEgKi8KLS8vCXdyaXRlX3RjX2MwX3RjYmluZChyZWFkX3RjX2MwX3RjYmluZCgpICYgflRDQklORF9DVVJWUEUpOyAvLyB8IFRDQklORF9DVVJWUEUKLQotCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCWV2cGUodnBmbGFncyk7Ci0JZW10KG10ZmxhZ3MpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBnZXRjd2QoY2hhciAqYnVmZiwgaW50IHNpemUpCiB7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKQEAgLTEwNDMsMzkgKzc2NSwzOSBAQAogc3RhdGljIGludCB2cGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAllbnVtIHZwZV9zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgKm5vdDsKKwlzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgKm5vdGlmaWVyOwogCXN0cnVjdCB2cGUgKnY7CiAJaW50IHJldDsKIAotCWlmIChtaW5vciAhPSBpbWlub3IoaW5vZGUpKSB7CisJaWYgKFZQRV9NT0RVTEVfTUlOT1IgIT0gaW1pbm9yKGlub2RlKSkgewogCQkvKiBhc3N1bWUgb25seSAxIGRldmljZSBhdCB0aGUgbW9tZW50LiAqLwotCQlwcl93YXJuaW5nKCJWUEUgbG9hZGVyOiBvbmx5IHZwZTEgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcHJfd2FybigiVlBFIGxvYWRlcjogb25seSB2cGUxIGlzIHN1cHBvcnRlZFxuIik7CiAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCh2ID0gZ2V0X3ZwZSh0Y2xpbWl0KSkgPT0gTlVMTCkgewotCQlwcl93YXJuaW5nKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gZ2V0IHZwZVxuIik7CisJdiA9IGdldF92cGUoYXBycF9jcHVfaW5kZXgoKSk7CisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl93YXJuKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gZ2V0IHZwZVxuIik7CiAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc3RhdGUgPSB4Y2hnKCZ2LT5zdGF0ZSwgVlBFX1NUQVRFX0lOVVNFKTsKIAlpZiAoc3RhdGUgIT0gVlBFX1NUQVRFX1VOVVNFRCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiVlBFIGxvYWRlcjogdGMgaW4gdXNlIGR1bXBpbmcgcmVnc1xuIik7CisJCXByX2RlYnVnKCJWUEUgbG9hZGVyOiB0YyBpbiB1c2UgZHVtcGluZyByZWdzXG4iKTsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdCwgJnYtPm5vdGlmeSwgbGlzdCkgewotCQkJbm90LT5zdG9wKHRjbGltaXQpOwotCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZpZXIsICZ2LT5ub3RpZnksIGxpc3QpCisJCQlub3RpZmllci0+c3RvcChhcHJwX2NwdV9pbmRleCgpKTsKIAogCQlyZWxlYXNlX3Byb2dtZW0odi0+bG9hZF9hZGRyKTsKLQkJY2xlYW51cF90YyhnZXRfdGModGNsaW1pdCkpOworCQljbGVhbnVwX3RjKGdldF90YyhhcHJwX2NwdV9pbmRleCgpKSk7CiAJfQogCiAJLyogdGhpcyBvZi1jb3Vyc2UgdHJhc2hlcyB3aGF0IHdhcyB0aGVyZSBiZWZvcmUuLi4gKi8KIAl2LT5wYnVmZmVyID0gdm1hbGxvYyhQX1NJWkUpOwogCWlmICghdi0+cGJ1ZmZlcikgewotCQlwcl93YXJuaW5nKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcHJfd2FybigiVlBFIGxvYWRlcjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl2LT5wbGVuID0gUF9TSVpFOwpAQCAtMTA4NSw3ICs4MDcsNyBAQAogCXYtPmN3ZFswXSA9IDA7CiAJcmV0ID0gZ2V0Y3dkKHYtPmN3ZCwgVlBFX1BBVEhfTUFYKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBFIGxvYWRlcjogb3BlbiwgZ2V0Y3dkIHJldHVybmVkICVkXG4iLCByZXQpOworCQlwcl93YXJuKCJWUEUgbG9hZGVyOiBvcGVuLCBnZXRjd2QgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAKIAl2LT5zaGFyZWRfcHRyID0gTlVMTDsKIAl2LT5fX3N0YXJ0ID0gMDsKQEAgLTEwOTksMjAgKzgyMSwyMCBAQAogCUVsZl9FaGRyICpoZHI7CiAJaW50IHJldCA9IDA7CiAKLQl2ID0gZ2V0X3ZwZSh0Y2xpbWl0KTsKKwl2ID0gZ2V0X3ZwZShhcHJwX2NwdV9pbmRleCgpKTsKIAlpZiAodiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWhkciA9IChFbGZfRWhkciAqKSB2LT5wYnVmZmVyOwogCWlmIChtZW1jbXAoaGRyLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpID09IDApIHsKLQkJaWYgKHZwZV9lbGZsb2FkKHYpID49IDApIHsKKwkJaWYgKCh2cGVfZWxmbG9hZCh2KSA+PSAwKSAmJiB2cGVfcnVuKSB7CiAJCQl2cGVfcnVuKHYpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBFIGxvYWRlcjogRUxGIGxvYWQgZmFpbGVkLlxuIik7CisJCQlwcl93YXJuKCJWUEUgbG9hZGVyOiBFTEYgbG9hZCBmYWlsZWQuXG4iKTsKIAkJCXJldCA9IC1FTk9FWEVDOwogCQl9CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBFIGxvYWRlcjogb25seSBlbGYgZmlsZXMgYXJlIHN1cHBvcnRlZFxuIik7CisJCXByX3dhcm4oIlZQRSBsb2FkZXI6IG9ubHkgZWxmIGZpbGVzIGFyZSBzdXBwb3J0ZWRcbiIpOwogCQlyZXQgPSAtRU5PRVhFQzsKIAl9CiAKQEAgLTExMzAsMjIgKzg1MiwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHZwZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQorc3RhdGljIHNzaXplX3QgdnBlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXNpemVfdCByZXQgPSBjb3VudDsKIAlzdHJ1Y3QgdnBlICp2OwogCi0JaWYgKGltaW5vcihmaWxlX2lub2RlKGZpbGUpKSAhPSBtaW5vcikKKwlpZiAoaW1pbm9yKGZpbGVfaW5vZGUoZmlsZSkpICE9IFZQRV9NT0RVTEVfTUlOT1IpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdiA9IGdldF92cGUodGNsaW1pdCk7CisJdiA9IGdldF92cGUoYXBycF9jcHVfaW5kZXgoKSk7CisKIAlpZiAodiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoY291bnQgKyB2LT5sZW4pID4gdi0+cGxlbikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiVlBFIGxvYWRlcjogZWxmIHNpemUgdG9vIGJpZy4gUGVyaGFwcyBzdHJpcCB1bmVlZGVkIHN5bWJvbHNcbiIpOworCQlwcl93YXJuKCJWUEUgbG9hZGVyOiBlbGYgc2l6ZSB0b28gYmlnLiBQZXJoYXBzIHN0cmlwIHVuZWVkZWQgc3ltYm9sc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTE1Nyw3ICs4NzksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZwZV9mb3BzID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cGVfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHZwZV9vcGVuLAogCS5yZWxlYXNlID0gdnBlX3JlbGVhc2UsCkBAIC0xMTY1LDM5NiArODg3LDQwIEBACiAJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAogfTsKIAotLyogbW9kdWxlIHdyYXBwZXIgZW50cnkgcG9pbnRzICovCi0vKiBnaXZlIG1lIGEgdnBlICovCi12cGVfaGFuZGxlIHZwZV9hbGxvYyh2b2lkKQotewotCWludCBpOwotCXN0cnVjdCB2cGUgKnY7Ci0KLQkvKiBmaW5kIGEgdnBlICovCi0JZm9yIChpID0gMTsgaSA8IE1BWF9WUEVTOyBpKyspIHsKLQkJaWYgKCh2ID0gZ2V0X3ZwZShpKSkgIT0gTlVMTCkgewotCQkJdi0+c3RhdGUgPSBWUEVfU1RBVEVfSU5VU0U7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotRVhQT1JUX1NZTUJPTCh2cGVfYWxsb2MpOwotCi0vKiBzdGFydCBydW5uaW5nIGZyb20gaGVyZSAqLwotaW50IHZwZV9zdGFydCh2cGVfaGFuZGxlIHZwZSwgdW5zaWduZWQgbG9uZyBzdGFydCkKLXsKLQlzdHJ1Y3QgdnBlICp2ID0gdnBlOwotCi0Jdi0+X19zdGFydCA9IHN0YXJ0OwotCXJldHVybiB2cGVfcnVuKHYpOwotfQotCi1FWFBPUlRfU1lNQk9MKHZwZV9zdGFydCk7Ci0KLS8qIGhhbHQgaXQgZm9yIG5vdyAqLwotaW50IHZwZV9zdG9wKHZwZV9oYW5kbGUgdnBlKQotewotCXN0cnVjdCB2cGUgKnYgPSB2cGU7Ci0Jc3RydWN0IHRjICp0OwotCXVuc2lnbmVkIGludCBldnBlX2ZsYWdzOwotCi0JZXZwZV9mbGFncyA9IGR2cGUoKTsKLQotCWlmICgodCA9IGxpc3RfZW50cnkodi0+dGMubmV4dCwgc3RydWN0IHRjLCB0YykpICE9IE5VTEwpIHsKLQotCQlzZXR0Yyh0LT5pbmRleCk7Ci0JCXdyaXRlX3ZwZV9jMF92cGVjb25mMChyZWFkX3ZwZV9jMF92cGVjb25mMCgpICYgflZQRUNPTkYwX1ZQQSk7Ci0JfQotCi0JZXZwZShldnBlX2ZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHZwZV9zdG9wKTsKLQotLyogSSd2ZSBkb25lIHdpdGggaXQgdGhhbmsgeW91ICovCi1pbnQgdnBlX2ZyZWUodnBlX2hhbmRsZSB2cGUpCi17Ci0Jc3RydWN0IHZwZSAqdiA9IHZwZTsKLQlzdHJ1Y3QgdGMgKnQ7Ci0JdW5zaWduZWQgaW50IGV2cGVfZmxhZ3M7Ci0KLQlpZiAoKHQgPSBsaXN0X2VudHJ5KHYtPnRjLm5leHQsIHN0cnVjdCB0YywgdGMpKSA9PSBOVUxMKSB7Ci0JCXJldHVybiAtRU5PRVhFQzsKLQl9Ci0KLQlldnBlX2ZsYWdzID0gZHZwZSgpOwotCi0JLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLwotCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKLQotCXNldHRjKHQtPmluZGV4KTsKLQl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH5WUEVDT05GMF9WUEEpOwotCi0JLyogaGFsdCB0aGUgVEMgKi8KLQl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOwotCW1pcHNfaWhiKCk7Ci0KLQkvKiBtYXJrIHRoZSBUQyB1bmFsbG9jYXRlZCAqLwotCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHJlYWRfdGNfYzBfdGNzdGF0dXMoKSAmIH5UQ1NUQVRVU19BKTsKLQotCXYtPnN0YXRlID0gVlBFX1NUQVRFX1VOVVNFRDsKLQotCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCWV2cGUoZXZwZV9mbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTCh2cGVfZnJlZSk7Ci0KIHZvaWQgKnZwZV9nZXRfc2hhcmVkKGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgdnBlICp2OworCXN0cnVjdCB2cGUgKnYgPSBnZXRfdnBlKGluZGV4KTsKIAotCWlmICgodiA9IGdldF92cGUoaW5kZXgpKSA9PSBOVUxMKQorCWlmICh2ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHYtPnNoYXJlZF9wdHI7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodnBlX2dldF9zaGFyZWQpOwogCiBpbnQgdnBlX25vdGlmeShpbnQgaW5kZXgsIHN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyAqbm90aWZ5KQogewotCXN0cnVjdCB2cGUgKnY7CisJc3RydWN0IHZwZSAqdiA9IGdldF92cGUoaW5kZXgpOwogCi0JaWYgKCh2ID0gZ2V0X3ZwZShpbmRleCkpID09IE5VTEwpCisJaWYgKHYgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCiAJbGlzdF9hZGQoJm5vdGlmeS0+bGlzdCwgJnYtPm5vdGlmeSk7CiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodnBlX25vdGlmeSk7CiAKIGNoYXIgKnZwZV9nZXRjd2QoaW50IGluZGV4KQogewotCXN0cnVjdCB2cGUgKnY7CisJc3RydWN0IHZwZSAqdiA9IGdldF92cGUoaW5kZXgpOwogCi0JaWYgKCh2ID0gZ2V0X3ZwZShpbmRleCkpID09IE5VTEwpCisJaWYgKHYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gdi0+Y3dkOwogfQotCiBFWFBPUlRfU1lNQk9MKHZwZV9nZXRjd2QpOwogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9raWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgdnBlICp2cGUgPSBnZXRfdnBlKHRjbGltaXQpOwotCXN0cnVjdCB2cGVfbm90aWZpY2F0aW9ucyAqbm90OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShub3QsICZ2cGUtPm5vdGlmeSwgbGlzdCkgewotCQlub3QtPnN0b3AodGNsaW1pdCk7Ci0JfQotCi0JcmVsZWFzZV9wcm9nbWVtKHZwZS0+bG9hZF9hZGRyKTsKLQljbGVhbnVwX3RjKGdldF90Yyh0Y2xpbWl0KSk7Ci0JdnBlX3N0b3AodnBlKTsKLQl2cGVfZnJlZSh2cGUpOwotCi0JcmV0dXJuIGxlbjsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihraWxsLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9raWxsKTsKLQotc3RhdGljIHNzaXplX3QgbnRjc19zaG93KHN0cnVjdCBkZXZpY2UgKmNkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHZwZSAqdnBlID0gZ2V0X3ZwZSh0Y2xpbWl0KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2cGUtPm50Y3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBudGNzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgdnBlICp2cGUgPSBnZXRfdnBlKHRjbGltaXQpOwotCXVuc2lnbmVkIGxvbmcgbmV3OwotCWNoYXIgKmVuZHA7Ci0KLQluZXcgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYpCi0JCWdvdG8gb3V0X2VpbnZhbDsKLQotCWlmIChuZXcgPT0gMCB8fCBuZXcgPiAoaHdfdGNzIC0gdGNsaW1pdCkpCi0JCWdvdG8gb3V0X2VpbnZhbDsKLQotCXZwZS0+bnRjcyA9IG5ldzsKLQotCXJldHVybiBsZW47Ci0KLW91dF9laW52YWw6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcobnRjcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2cGVfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfa2lsbC5hdHRyLAotCSZkZXZfYXR0cl9udGNzLmF0dHIsCi0JTlVMTCwKLX07Ci1BVFRSSUJVVEVfR1JPVVBTKHZwZSk7Ci0KLXN0YXRpYyB2b2lkIHZwZV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpjZCkKLXsKLQlrZnJlZShjZCk7Ci19Ci0KLXN0cnVjdCBjbGFzcyB2cGVfY2xhc3MgPSB7Ci0JLm5hbWUgPSAidnBlIiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuZGV2X3JlbGVhc2UgPSB2cGVfZGV2aWNlX3JlbGVhc2UsCi0JLmRldl9ncm91cHMgPSB2cGVfZ3JvdXBzLAotfTsKLQotc3RydWN0IGRldmljZSB2cGVfZGV2aWNlOwotCi1zdGF0aWMgaW50IF9faW5pdCB2cGVfbW9kdWxlX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbXRmbGFncywgdnBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7Ci0Jc3RydWN0IHZwZSAqdiA9IE5VTEw7Ci0Jc3RydWN0IHRjICp0OwotCWludCB0YywgZXJyOwotCi0JaWYgKCFjcHVfaGFzX21pcHNtdCkgewotCQlwcmludGsoIlZQRSBsb2FkZXI6IG5vdCBhIE1JUFMgTVQgY2FwYWJsZSBwcm9jZXNzb3JcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAodnBlbGltaXQgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBWUEVzIHJlc2VydmVkIGZvciBBUC9TUCwgbm90ICIKLQkJICAgICAgICJpbml0aWFsaXppbmcgVlBFIGxvYWRlci5cblBhc3MgbWF4dnBlcz08bj4gYXJndW1lbnQgYXMgIgotCQkgICAgICAgImtlcm5lbCBhcmd1bWVudFxuIik7Ci0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHRjbGltaXQgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBUQ3MgcmVzZXJ2ZWQgZm9yIEFQL1NQLCBub3QgIgotCQkgICAgICAgImluaXRpYWxpemluZyBWUEUgbG9hZGVyLlxuUGFzcyBtYXh0Y3M9PG4+IGFyZ3VtZW50IGFzICIKLQkJICAgICAgICJrZXJuZWwgYXJndW1lbnRcbiIpOwotCi0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIG1vZHVsZV9uYW1lLCAmdnBlX2ZvcHMpOwotCWlmIChtYWpvciA8IDApIHsKLQkJcHJpbnRrKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZVxuIik7Ci0JCXJldHVybiBtYWpvcjsKLQl9Ci0KLQllcnIgPSBjbGFzc19yZWdpc3RlcigmdnBlX2NsYXNzKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidnBlX2NsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9jaHJkZXY7Ci0JfQotCi0JZGV2aWNlX2luaXRpYWxpemUoJnZwZV9kZXZpY2UpOwotCXZwZV9kZXZpY2UuY2xhc3MJPSAmdnBlX2NsYXNzLAotCXZwZV9kZXZpY2UucGFyZW50CT0gTlVMTCwKLQlkZXZfc2V0X25hbWUoJnZwZV9kZXZpY2UsICJ2cGUxIik7Ci0JdnBlX2RldmljZS5kZXZ0ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKLQllcnIgPSBkZXZpY2VfYWRkKCZ2cGVfZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQWRkaW5nIHZwZV9kZXZpY2UgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfY2xhc3M7Ci0JfQotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW10ZmxhZ3MgPSBkbXQoKTsKLQl2cGZsYWdzID0gZHZwZSgpOwotCi0JLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLwotCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKLQotCS8qIGR1bXBfbXRyZWdzKCk7ICovCi0KLQl2YWwgPSByZWFkX2MwX212cGNvbmYwKCk7Ci0JaHdfdGNzID0gKHZhbCAmIE1WUENPTkYwX1BUQykgKyAxOwotCWh3X3ZwZXMgPSAoKHZhbCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpICsgMTsKLQotCWZvciAodGMgPSB0Y2xpbWl0OyB0YyA8IGh3X3RjczsgdGMrKykgewotCQkvKgotCQkgKiBNdXN0IHJlLWVuYWJsZSBtdWx0aXRocmVhZGluZyB0ZW1wb3JhcmlseSBvciBpbiBjYXNlIHdlCi0JCSAqIHJlc2NoZWR1bGUgc2VuZCBJUElzIG9yIHNpbWlsYXIgd2UgbWlnaHQgaGFuZy4KLQkJICovCi0JCWNsZWFyX2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCQlldnBlKHZwZmxhZ3MpOwotCQllbXQobXRmbGFncyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJdCA9IGFsbG9jX3RjKHRjKTsKLQkJaWYgKCF0KSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCW10ZmxhZ3MgPSBkbXQoKTsKLQkJdnBmbGFncyA9IGR2cGUoKTsKLQkJc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOwotCi0JCS8qIFZQRSdzICovCi0JCWlmICh0YyA8IGh3X3RjcykgewotCQkJc2V0dGModGMpOwotCi0JCQlpZiAoKHYgPSBhbGxvY192cGUodGMpKSA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBFOiB1bmFibGUgdG8gYWxsb2NhdGUgVlBFXG4iKTsKLQotCQkJCWdvdG8gb3V0X3JlZW5hYmxlOwotCQkJfQotCi0JCQl2LT5udGNzID0gaHdfdGNzIC0gdGNsaW1pdDsKLQotCQkJLyogYWRkIHRoZSB0YyB0byB0aGUgbGlzdCBvZiB0aGlzIHZwZSdzIHRjJ3MuICovCi0JCQlsaXN0X2FkZCgmdC0+dGMsICZ2LT50Yyk7Ci0KLQkJCS8qIGRlYWN0aXZhdGUgYWxsIGJ1dCB2cGUwICovCi0JCQlpZiAodGMgPj0gdGNsaW1pdCkgewotCQkJCXVuc2lnbmVkIGxvbmcgdG1wID0gcmVhZF92cGVfYzBfdnBlY29uZjAoKTsKLQotCQkJCXRtcCAmPSB+VlBFQ09ORjBfVlBBOwotCi0JCQkJLyogbWFzdGVyIFZQRSAqLwotCQkJCXRtcCB8PSBWUEVDT05GMF9NVlA7Ci0JCQkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7Ci0JCQl9Ci0KLQkJCS8qIGRpc2FibGUgbXVsdGktdGhyZWFkaW5nIHdpdGggVEMncyAqLwotCQkJd3JpdGVfdnBlX2MwX3ZwZWNvbnRyb2wocmVhZF92cGVfYzBfdnBlY29udHJvbCgpICYgflZQRUNPTlRST0xfVEUpOwotCi0JCQlpZiAodGMgPj0gdnBlbGltaXQpIHsKLQkJCQkvKgotCQkJCSAqIFNldCBjb25maWcgdG8gYmUgdGhlIHNhbWUgYXMgdnBlMCwKLQkJCQkgKiBwYXJ0aWN1bGFybHkga3NlZzAgY29oZXJlbmN5IGFsZwotCQkJCSAqLwotCQkJCXdyaXRlX3ZwZV9jMF9jb25maWcocmVhZF9jMF9jb25maWcoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBUQydzICovCi0JCXQtPnB2cGUgPSB2OwkvKiBzZXQgdGhlIHBhcmVudCB2cGUgKi8KLQotCQlpZiAodGMgPj0gdGNsaW1pdCkgewotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQkJCXNldHRjKHRjKTsKLQotCQkJLyogQW55IFRDIHRoYXQgaXMgYm91bmQgdG8gVlBFMCBnZXRzIGxlZnQgYXMgaXMgLSBpbiBjYXNlCi0JCQkgICB3ZSBhcmUgcnVubmluZyBTTVRDIG9uIFZQRTAuIEEgVEMgdGhhdCBpcyBib3VuZCB0byBhbnkKLQkJCSAgIG90aGVyIFZQRSBnZXRzIGJvdW5kIHRvIFZQRTAsIGlkZWFsbHkgSSdkIGxpa2UgdG8gbWFrZQotCQkJICAgaXQgaG9tZWxlc3MgYnV0IGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGxldCBtZSBiaW5kIGEgVEMKLQkJCSAgIHRvIGEgbm9uLWV4aXN0ZW50IFZQRS4gV2hpY2ggaXMgcGVyZmVjdGx5IHJlYXNvbmFibGUuCi0KLQkJCSAgIFRoZSAodW4pYm91bmQgc3RhdGUgaXMgdmlzaWJsZSB0byBhbiBFSlRBRyBwcm9iZSBzbyBtYXkKLQkJCSAgIG5vdGlmeSBHREIuLi4KLQkJCSovCi0KLQkJCWlmICgoKHRtcCA9IHJlYWRfdGNfYzBfdGNiaW5kKCkpICYgVENCSU5EX0NVUlZQRSkpIHsKLQkJCQkvKiB0YyBpcyBib3VuZCA+dnBlMCAqLwotCQkJCXdyaXRlX3RjX2MwX3RjYmluZCh0bXAgJiB+VENCSU5EX0NVUlZQRSk7Ci0KLQkJCQl0LT5wdnBlID0gZ2V0X3ZwZSgwKTsJLyogc2V0IHRoZSBwYXJlbnQgdnBlICovCi0JCQl9Ci0KLQkJCS8qIGhhbHQgdGhlIFRDICovCi0JCQl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOwotCQkJbWlwc19paGIoKTsKLQotCQkJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOwotCi0JCQkvKiBtYXJrIG5vdCBhY3RpdmF0ZWQgYW5kIG5vdCBkeW5hbWljYWxseSBhbGxvY2F0YWJsZSAqLwotCQkJdG1wICY9IH4oVENTVEFUVVNfQSB8IFRDU1RBVFVTX0RBKTsKLQkJCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkvKiBpbnRlcnJ1cHQgZXhlbXB0ICovCi0JCQl3cml0ZV90Y19jMF90Y3N0YXR1cyh0bXApOwotCQl9Ci0JfQotCi1vdXRfcmVlbmFibGU6Ci0JLyogcmVsZWFzZSBjb25maWcgc3RhdGUgKi8KLQljbGVhcl9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKLQotCWV2cGUodnBmbGFncyk7Ci0JZW10KG10ZmxhZ3MpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAwOwotCi1vdXRfY2xhc3M6Ci0JY2xhc3NfdW5yZWdpc3RlcigmdnBlX2NsYXNzKTsKLW91dF9jaHJkZXY6Ci0JdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsIG1vZHVsZV9uYW1lKTsKLQotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2cGVfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3QgdnBlICp2LCAqbjsKLQotCWRldmljZV9kZWwoJnZwZV9kZXZpY2UpOwotCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBtb2R1bGVfbmFtZSk7Ci0KLQkvKiBObyBsb2NraW5nIG5lZWRlZCBoZXJlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHYsIG4sICZ2cGVjb250cm9sLnZwZV9saXN0LCBsaXN0KSB7Ci0JCWlmICh2LT5zdGF0ZSAhPSBWUEVfU1RBVEVfVU5VU0VEKQotCQkJcmVsZWFzZV92cGUodik7Ci0JfQotfQotCiBtb2R1bGVfaW5pdCh2cGVfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQodnBlX21vZHVsZV9leGl0KTsKIE1PRFVMRV9ERVNDUklQVElPTigiTUlQUyBWUEUgTG9hZGVyIik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL2t2bV9taXBzLmMgYi9hcmNoL21pcHMva3ZtL2t2bV9taXBzLmMKaW5kZXggNzNiMzQ4Mi4uZGE1MTg2ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2t2bS9rdm1fbWlwcy5jCisrKyBiL2FyY2gvbWlwcy9rdm0va3ZtX21pcHMuYwpAQCAtMTAwMSw3ICsxMDAxLDYgQEAKIAlocnRpbWVyX2luaXQoJnZjcHUtPmFyY2guY29tcGFyZWNvdW50X3RpbWVyLCBDTE9DS19NT05PVE9OSUMsCiAJCSAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CiAJdmNwdS0+YXJjaC5jb21wYXJlY291bnRfdGltZXIuZnVuY3Rpb24gPSBrdm1fbWlwc19jb21wYXJlY291bnRfd2FrZXVwOwotCWt2bV9taXBzX2luaXRfc2hhZG93X3RsYih2Y3B1KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9rdm1fdGxiLmMgYi9hcmNoL21pcHMva3ZtL2t2bV90bGIuYwppbmRleCBjNzc3ZGQzLi41MGFiOWM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL2t2bV90bGIuYworKysgYi9hcmNoL21pcHMva3ZtL2t2bV90bGIuYwpAQCAtMTAsNyArMTAsNiBAQAogKiBBdXRob3JzOiBTYW5qYXkgTGFsIDxzYW5qYXlsQGt5bWFzeXMuY29tPgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0yNSw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KIAogI3VuZGVmIENPTkZJR19NSVBTX01UCiAjaW5jbHVkZSA8YXNtL3I0a2NhY2hlLmg+CkBAIC0zNSw5ICszNSw2IEBACiAKICNkZWZpbmUgUFJJeDY0ICJsbHgiCiAKLS8qIFVzZSBWWiBFbnRyeUhpLkVISU5WIHRvIGludmFsaWRhdGUgVExCIGVudHJpZXMgKi8KLSNkZWZpbmUgVU5JUVVFX0VOVFJZSEkoaWR4KSAoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKQotCiBhdG9taWNfdCBrdm1fbWlwc19pbnN0YW5jZTsKIEVYUE9SVF9TWU1CT0woa3ZtX21pcHNfaW5zdGFuY2UpOwogCkBAIC0xNDcsMzAgKzE0NCw2IEBACiAJfQogfQogCi12b2lkIGt2bV9taXBzX2R1bXBfc2hhZG93X3RsYnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCWludCBpOwotCXZvbGF0aWxlIHN0cnVjdCBrdm1fbWlwc190bGIgdGxiOwotCi0JcHJpbnRrKCJTaGFkb3cgVExCczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBLVk1fTUlQU19HVUVTVF9UTEJfU0laRTsgaSsrKSB7Ci0JCXRsYiA9IHZjcHUtPmFyY2guc2hhZG93X3RsYltzbXBfcHJvY2Vzc29yX2lkKCldW2ldOwotCQlwcmludGsoIlRMQiVjJTNkIEhpIDB4JTA4bHggIiwKLQkJICAgICAgICh0bGIudGxiX2xvMCB8IHRsYi50bGJfbG8xKSAmIE1JUFMzX1BHX1YgPyAnICcgOiAnKicsCi0JCSAgICAgICBpLCB0bGIudGxiX2hpKTsKLQkJcHJpbnRrKCJMbzA9MHglMDkiIFBSSXg2NCAiICVjJWMgYXR0ciAlbHggIiwKLQkJICAgICAgICh1aW50NjRfdCkgbWlwczNfdGxicGZuX3RvX3BhZGRyKHRsYi50bGJfbG8wKSwKLQkJICAgICAgICh0bGIudGxiX2xvMCAmIE1JUFMzX1BHX0QpID8gJ0QnIDogJyAnLAotCQkgICAgICAgKHRsYi50bGJfbG8wICYgTUlQUzNfUEdfRykgPyAnRycgOiAnICcsCi0JCSAgICAgICAodGxiLnRsYl9sbzAgPj4gMykgJiA3KTsKLQkJcHJpbnRrKCJMbzE9MHglMDkiIFBSSXg2NCAiICVjJWMgYXR0ciAlbHggc3o9JWx4XG4iLAotCQkgICAgICAgKHVpbnQ2NF90KSBtaXBzM190bGJwZm5fdG9fcGFkZHIodGxiLnRsYl9sbzEpLAotCQkgICAgICAgKHRsYi50bGJfbG8xICYgTUlQUzNfUEdfRCkgPyAnRCcgOiAnICcsCi0JCSAgICAgICAodGxiLnRsYl9sbzEgJiBNSVBTM19QR19HKSA/ICdHJyA6ICcgJywKLQkJICAgICAgICh0bGIudGxiX2xvMSA+PiAzKSAmIDcsIHRsYi50bGJfbWFzayk7Ci0JfQotfQotCiBzdGF0aWMgaW50IGt2bV9taXBzX21hcF9wYWdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQogewogCWludCBzcmN1X2lkeCwgZXJyID0gMDsKQEAgLTY1Nyw3MCArNjMwLDYgQEAKIAljcHVfY29udGV4dChjcHUsIG1tKSA9IGFzaWRfY2FjaGUoY3B1KSA9IGFzaWQ7CiB9CiAKLXZvaWQga3ZtX3NoYWRvd190bGJfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgb2xkX2VudHJ5aGk7Ci0JdW5zaWduZWQgbG9uZyBvbGRfcGFnZW1hc2s7Ci0JaW50IGVudHJ5ID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0Jb2xkX2VudHJ5aGkgPSByZWFkX2MwX2VudHJ5aGkoKTsKLQlvbGRfcGFnZW1hc2sgPSByZWFkX2MwX3BhZ2VtYXNrKCk7Ci0KLQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBjdXJyZW50X2NwdV9kYXRhLnRsYnNpemU7IGVudHJ5KyspIHsKLQkJd3JpdGVfYzBfaW5kZXgoZW50cnkpOwotCQltdGMwX3RsYndfaGF6YXJkKCk7Ci0JCXRsYl9yZWFkKCk7Ci0JCXRsYndfdXNlX2hhemFyZCgpOwotCi0JCXZjcHUtPmFyY2guc2hhZG93X3RsYltjcHVdW2VudHJ5XS50bGJfaGkgPSByZWFkX2MwX2VudHJ5aGkoKTsKLQkJdmNwdS0+YXJjaC5zaGFkb3dfdGxiW2NwdV1bZW50cnldLnRsYl9sbzAgPSByZWFkX2MwX2VudHJ5bG8wKCk7Ci0JCXZjcHUtPmFyY2guc2hhZG93X3RsYltjcHVdW2VudHJ5XS50bGJfbG8xID0gcmVhZF9jMF9lbnRyeWxvMSgpOwotCQl2Y3B1LT5hcmNoLnNoYWRvd190bGJbY3B1XVtlbnRyeV0udGxiX21hc2sgPSByZWFkX2MwX3BhZ2VtYXNrKCk7Ci0JfQotCi0Jd3JpdGVfYzBfZW50cnloaShvbGRfZW50cnloaSk7Ci0Jd3JpdGVfYzBfcGFnZW1hc2sob2xkX3BhZ2VtYXNrKTsKLQltdGMwX3RsYndfaGF6YXJkKCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLX0KLQotdm9pZCBrdm1fc2hhZG93X3RsYl9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgb2xkX2N0eDsKLQlpbnQgZW50cnk7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCW9sZF9jdHggPSByZWFkX2MwX2VudHJ5aGkoKTsKLQotCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IGN1cnJlbnRfY3B1X2RhdGEudGxic2l6ZTsgZW50cnkrKykgewotCQl3cml0ZV9jMF9lbnRyeWhpKHZjcHUtPmFyY2guc2hhZG93X3RsYltjcHVdW2VudHJ5XS50bGJfaGkpOwotCQltdGMwX3RsYndfaGF6YXJkKCk7Ci0JCXdyaXRlX2MwX2VudHJ5bG8wKHZjcHUtPmFyY2guc2hhZG93X3RsYltjcHVdW2VudHJ5XS50bGJfbG8wKTsKLQkJd3JpdGVfYzBfZW50cnlsbzEodmNwdS0+YXJjaC5zaGFkb3dfdGxiW2NwdV1bZW50cnldLnRsYl9sbzEpOwotCi0JCXdyaXRlX2MwX2luZGV4KGVudHJ5KTsKLQkJbXRjMF90bGJ3X2hhemFyZCgpOwotCi0JCXRsYl93cml0ZV9pbmRleGVkKCk7Ci0JCXRsYndfdXNlX2hhemFyZCgpOwotCX0KLQotCXRsYndfdXNlX2hhemFyZCgpOwotCXdyaXRlX2MwX2VudHJ5aGkob2xkX2N0eCk7Ci0JbXRjMF90bGJ3X2hhemFyZCgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotCiB2b2lkIGt2bV9sb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc0OSwzMCArNjU4LDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXZvaWQga3ZtX21pcHNfaW5pdF9zaGFkb3dfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpbnQgY3B1LCBlbnRyeTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgY3VycmVudF9jcHVfZGF0YS50bGJzaXplOyBlbnRyeSsrKSB7Ci0JCQl2Y3B1LT5hcmNoLnNoYWRvd190bGJbY3B1XVtlbnRyeV0udGxiX2hpID0KLQkJCSAgICBVTklRVUVfRU5UUllISShlbnRyeSk7Ci0JCQl2Y3B1LT5hcmNoLnNoYWRvd190bGJbY3B1XVtlbnRyeV0udGxiX2xvMCA9IDB4MDsKLQkJCXZjcHUtPmFyY2guc2hhZG93X3RsYltjcHVdW2VudHJ5XS50bGJfbG8xID0gMHgwOwotCQkJdmNwdS0+YXJjaC5zaGFkb3dfdGxiW2NwdV1bZW50cnldLnRsYl9tYXNrID0KLQkJCSAgICByZWFkX2MwX3BhZ2VtYXNrKCk7Ci0jaWZkZWYgREVCVUcKLQkJCWt2bV9kZWJ1ZwotCQkJICAgICgic2hhZG93X3RsYlslZF1bJWRdOiB0bGJfaGk6ICUjbHgsIGxvMDogJSNseCwgbG8xOiAlI2x4XG4iLAotCQkJICAgICBjcHUsIGVudHJ5LAotCQkJICAgICB2Y3B1LT5hcmNoLnNoYWRvd190bGJbY3B1XVtlbnRyeV0udGxiX2hpLAotCQkJICAgICB2Y3B1LT5hcmNoLnNoYWRvd190bGJbY3B1XVtlbnRyeV0udGxiX2xvMCwKLQkJCSAgICAgdmNwdS0+YXJjaC5zaGFkb3dfdGxiW2NwdV1bZW50cnldLnRsYl9sbzEpOwotI2VuZGlmCi0JCX0KLQl9Ci19Ci0KIC8qIFJlc3RvcmUgQVNJRCBvbmNlIHdlIGFyZSBzY2hlZHVsZWQgYmFjayBhZnRlciBwcmVlbXB0aW9uICovCiB2b2lkIGt2bV9hcmNoX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCiB7CkBAIC04MTAsMTQgKzY5NSw2IEBACiAJCQkgdmNwdS0+YXJjaC5sYXN0X3NjaGVkX2NwdSwgY3B1LCB2Y3B1LT52Y3B1X2lkKTsKIAl9CiAKLQkvKiBPbmx5IHJlbG9hZCBzaGFkb3cgaG9zdCBUTEIgaWYgbmV3IEFTSURzIGhhdmVuJ3QgYmVlbiBhbGxvY2F0ZWQgKi8KLSNpZiAwCi0JaWYgKChhdG9taWNfcmVhZCgma3ZtX21pcHNfaW5zdGFuY2UpID4gMSkgJiYgIW5ld2FzaWQpIHsKLQkJa3ZtX21pcHNfZmx1c2hfaG9zdF90bGIoMCk7Ci0JCWt2bV9zaGFkb3dfdGxiX2xvYWQodmNwdSk7Ci0JfQotI2VuZGlmCi0KIAlpZiAoIW5ld2FzaWQpIHsKIAkJLyogSWYgd2UgcHJlZW1wdGVkIHdoaWxlIHRoZSBndWVzdCB3YXMgZXhlY3V0aW5nLCB0aGVuIHJlbG9hZCB0aGUgcHJlLWVtcHRlZCBBU0lEICovCiAJCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1ZDUFUpIHsKQEAgLTg2MywxMiArNzQwLDYgQEAKIAl2Y3B1LT5hcmNoLnByZWVtcHRfZW50cnloaSA9IHJlYWRfYzBfZW50cnloaSgpOwogCXZjcHUtPmFyY2gubGFzdF9zY2hlZF9jcHUgPSBjcHU7CiAKLSNpZiAwCi0JaWYgKChhdG9taWNfcmVhZCgma3ZtX21pcHNfaW5zdGFuY2UpID4gMSkpIHsKLQkJa3ZtX3NoYWRvd190bGJfcHV0KHZjcHUpOwotCX0KLSNlbmRpZgotCiAJaWYgKCgoY3B1X2NvbnRleHQoY3B1LCBjdXJyZW50LT5tbSkgXiBhc2lkX2NhY2hlKGNwdSkpICYKIAkgICAgIEFTSURfVkVSU0lPTl9NQVNLKSkgewogCQlrdm1fZGVidWcoIiVzOiBEcm9wcGluZyBNTVUgQ29udGV4dDogICUjbHhcbiIsIF9fZnVuY19fLApAQCAtOTMwLDEwICs4MDEsOCBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGt2bV9sb2NhbF9mbHVzaF90bGJfYWxsKTsKLUVYUE9SVF9TWU1CT0woa3ZtX3NoYWRvd190bGJfcHV0KTsKIEVYUE9SVF9TWU1CT0woa3ZtX21pcHNfaGFuZGxlX21hcHBlZF9zZWdfdGxiX2ZhdWx0KTsKIEVYUE9SVF9TWU1CT0woa3ZtX21pcHNfaGFuZGxlX2NvbW1wYWdlX3RsYl9mYXVsdCk7Ci1FWFBPUlRfU1lNQk9MKGt2bV9taXBzX2luaXRfc2hhZG93X3RsYik7CiBFWFBPUlRfU1lNQk9MKGt2bV9taXBzX2R1bXBfaG9zdF90bGJzKTsKIEVYUE9SVF9TWU1CT0woa3ZtX21pcHNfaGFuZGxlX2tzZWcwX3RsYl9mYXVsdCk7CiBFWFBPUlRfU1lNQk9MKGt2bV9taXBzX2hvc3RfdGxiX2xvb2t1cCk7CkBAIC05NDEsOCArODEwLDYgQEAKIEVYUE9SVF9TWU1CT0woa3ZtX21pcHNfZ3Vlc3RfdGxiX2xvb2t1cCk7CiBFWFBPUlRfU1lNQk9MKGt2bV9taXBzX2hvc3RfdGxiX2ludik7CiBFWFBPUlRfU1lNQk9MKGt2bV9taXBzX3RyYW5zbGF0ZV9ndWVzdF9rc2VnMF90b19ocGEpOwotRVhQT1JUX1NZTUJPTChrdm1fc2hhZG93X3RsYl9sb2FkKTsKLUVYUE9SVF9TWU1CT0woa3ZtX21pcHNfZHVtcF9zaGFkb3dfdGxicyk7CiBFWFBPUlRfU1lNQk9MKGt2bV9taXBzX2R1bXBfZ3Vlc3RfdGxicyk7CiBFWFBPUlRfU1lNQk9MKGt2bV9nZXRfaW5zdCk7CiBFWFBPUlRfU1lNQk9MKGt2bV9hcmNoX3ZjcHVfbG9hZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvY2xrLmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvY2xrLmMKaW5kZXggMWFiNTc2ZC4uODc1MGRjMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L2Nsay5jCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9jbGsuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9kbWEuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9kbWEuYwppbmRleCAwOGY3ZWJkLi43OGE5MWZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZG1hLmMKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RtYS5jCkBAIC0yMjAsMTAgKzIyMCw2IEBACiAJaW50IGk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlwYW5pYygiRmFpbGVkIHRvIGdldCBkbWEgcmVzb3VyY2UiKTsKLQotCS8qIHJlbWFwIGRtYSByZWdpc3RlciByYW5nZSAqLwogCWx0cV9kbWFfbWVtYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIobHRxX2RtYV9tZW1iYXNlKSkKIAkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCBkbWEgcmVzb3VyY2UiKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5jIGIvYXJjaC9taXBzL2xhc2F0L2F0OTNjLmMKaW5kZXggNzkzZTIzNC4uOTQyZjMyYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhc2F0L2F0OTNjLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L2F0OTNjLmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vbGFzYXQvbGFzYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlICJhdDkzYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvcGljdnVlLmMgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlLmMKaW5kZXggN2ViMzM0OC4uZDYxM2I5NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZS5jCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9waWN2dWUuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vbGFzYXQvbGFzYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi91bmNhY2hlZC5jIGIvYXJjaC9taXBzL2xpYi91bmNhY2hlZC5jCmluZGV4IGQ4NTIyZjguLjA5ZDVkZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvdW5jYWNoZWQuYworKysgYi9hcmNoL21pcHMvbGliL3VuY2FjaGVkLmMKQEAgLTgsNyArOCw2IEBACiAgKglBdXRob3I6IE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BtaXBzLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9sZW1vdGUtMmYvY2xvY2suYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sZW1vdGUtMmYvY2xvY2suYwppbmRleCA0ZGMyZjVmLi5hZWQzMmI4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vbGVtb3RlLTJmL2Nsb2NrLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2xlbW90ZS0yZi9jbG9jay5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMgYi9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMKaW5kZXggZWZlMDA4OC4uNTA2OTI1YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYwpAQCAtNDE3LDE0ICs0MTcsMjAgQEAKIAkJCWNhc2UgbW1fbXRjMV9vcDoKIAkJCWNhc2UgbW1fY2ZjMV9vcDoKIAkJCWNhc2UgbW1fY3RjMV9vcDoKKwkJCWNhc2UgbW1fbWZoYzFfb3A6CisJCQljYXNlIG1tX210aGMxX29wOgogCQkJCWlmIChpbnNuLm1tX2ZwMV9mb3JtYXQub3AgPT0gbW1fbWZjMV9vcCkKIAkJCQkJb3AgPSBtZmNfb3A7CiAJCQkJZWxzZSBpZiAoaW5zbi5tbV9mcDFfZm9ybWF0Lm9wID09IG1tX210YzFfb3ApCiAJCQkJCW9wID0gbXRjX29wOwogCQkJCWVsc2UgaWYgKGluc24ubW1fZnAxX2Zvcm1hdC5vcCA9PSBtbV9jZmMxX29wKQogCQkJCQlvcCA9IGNmY19vcDsKLQkJCQllbHNlCisJCQkJZWxzZSBpZiAoaW5zbi5tbV9mcDFfZm9ybWF0Lm9wID09IG1tX2N0YzFfb3ApCiAJCQkJCW9wID0gY3RjX29wOworCQkJCWVsc2UgaWYgKGluc24ubW1fZnAxX2Zvcm1hdC5vcCA9PSBtbV9tZmhjMV9vcCkKKwkJCQkJb3AgPSBtZmhjX29wOworCQkJCWVsc2UKKwkJCQkJb3AgPSBtdGhjX29wOwogCQkJCW1pcHMzMl9pbnNuLmZwMV9mb3JtYXQub3Bjb2RlID0gY29wMV9vcDsKIAkJCQltaXBzMzJfaW5zbi5mcDFfZm9ybWF0Lm9wID0gb3A7CiAJCQkJbWlwczMyX2luc24uZnAxX2Zvcm1hdC5ydCA9CkBAIC04NTMsMjAgKzg1OSwyMCBAQAogICogSW4gdGhlIExpbnV4IGtlcm5lbCwgd2Ugc3VwcG9ydCBzZWxlY3Rpb24gb2YgRlBSIGZvcm1hdCBvbiB0aGUKICAqIGJhc2lzIG9mIHRoZSBTdGF0dXMuRlIgYml0LglJZiBhbiBGUFUgaXMgbm90IHByZXNlbnQsIHRoZSBGUiBiaXQKICAqIGlzIGhhcmR3aXJlZCB0byB6ZXJvLCB3aGljaCB3b3VsZCBpbXBseSBhIDMyLWJpdCBGUFUgZXZlbiBmb3IKLSAqIDY0LWJpdCBDUFVzIHNvIHdlIHJhdGhlciBsb29rIGF0IFRJRl8zMkJJVF9SRUdTLgorICogNjQtYml0IENQVXMgc28gd2UgcmF0aGVyIGxvb2sgYXQgVElGXzMyQklUX0ZQUkVHUy4KICAqIEZQVSBlbXUgaXMgc2xvdyBhbmQgYnVsa3kgYW5kIG9wdGltaXppbmcgdGhpcyBmdW5jdGlvbiBvZmZlcnMgZmFpcmx5CiAgKiBzaXplYWJsZSBiZW5lZml0cyBzbyB3ZSB0cnkgdG8gYmUgY2xldmVyIGFuZCBtYWtlIHRoaXMgZnVuY3Rpb24gcmV0dXJuCiAgKiBhIGNvbnN0YW50IHdoZW5ldmVyIHBvc3NpYmxlLCB0aGF0IGlzIG9uIDY0LWJpdCBrZXJuZWxzIHdpdGhvdXQgTzMyCi0gKiBjb21wYXRpYmlsaXR5IGVuYWJsZWQgYW5kIG9uIDMyLWJpdCBrZXJuZWxzLgorICogY29tcGF0aWJpbGl0eSBlbmFibGVkIGFuZCBvbiAzMi1iaXQgd2l0aG91dCA2NC1iaXQgRlBVIHN1cHBvcnQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNvcDFfNjRiaXQoc3RydWN0IHB0X3JlZ3MgKnhjcCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgIWRlZmluZWQoQ09ORklHX01JUFMzMl9PMzIpCiAJcmV0dXJuIDE7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfTUlQUzMyX08zMikKLQlyZXR1cm4gIXRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX1JFR1MpOwotI2Vsc2UKKyNlbGlmIGRlZmluZWQoQ09ORklHXzMyQklUKSAmJiAhZGVmaW5lZChDT05GSUdfTUlQU19PMzJfRlA2NF9TVVBQT1JUKQogCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gIXRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUyk7CiAjZW5kaWYKIH0KIApAQCAtODc4LDYgKzg4NCwxMCBAQAogCQkJY3R4LT5mcHJbeCAmIH4xXSA+PiAzMiA8PCAzMiB8ICh1MzIpKHNpKSA6IFwKIAkJCWN0eC0+ZnByW3ggJiB+MV0gPDwgMzIgPj4gMzIgfCAodTY0KShzaSkgPDwgMzIpCiAKKyNkZWZpbmUgU0lGUk9NSFJFRyhzaSwgeCkJKChzaSkgPSAoaW50KShjdHgtPmZwclt4XSA+PiAzMikpCisjZGVmaW5lIFNJVE9IUkVHKHNpLCB4KQkJKGN0eC0+ZnByW3hdID0gXAorCQkJCWN0eC0+ZnByW3hdIDw8IDMyID4+IDMyIHwgKHU2NCkoc2kpIDw8IDMyKQorCiAjZGVmaW5lIERJRlJPTVJFRyhkaSwgeCkgKChkaSkgPSBjdHgtPmZwclt4ICYgfihjb3AxXzY0Yml0KHhjcCkgPT0gMCldKQogI2RlZmluZSBESVRPUkVHKGRpLCB4KQkoY3R4LT5mcHJbeCAmIH4oY29wMV82NGJpdCh4Y3ApID09IDApXSA9IChkaSkpCiAKQEAgLTEwNTUsNiArMTA2NSwyNSBAQAogCQkJYnJlYWs7CiAjZW5kaWYKIAorCQljYXNlIG1maGNfb3A6CisJCQlpZiAoIWNwdV9oYXNfbWlwc19yMikKKwkJCQlnb3RvIHNpZ2lsbDsKKworCQkJLyogY29wcmVnaXN0ZXIgcmQgLT4gZ3ByW3J0XSAqLworCQkJaWYgKE1JUFNJbnN0X1JUKGlyKSAhPSAwKSB7CisJCQkJU0lGUk9NSFJFRyh4Y3AtPnJlZ3NbTUlQU0luc3RfUlQoaXIpXSwKKwkJCQkJTUlQU0luc3RfUkQoaXIpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgbXRoY19vcDoKKwkJCWlmICghY3B1X2hhc19taXBzX3IyKQorCQkJCWdvdG8gc2lnaWxsOworCisJCQkvKiBjb3ByZWdpc3RlciByZCA8LSBncHJbcnRdICovCisJCQlTSVRPSFJFRyh4Y3AtPnJlZ3NbTUlQU0luc3RfUlQoaXIpXSwgTUlQU0luc3RfUkQoaXIpKTsKKwkJCWJyZWFrOworCiAJCWNhc2UgbWZjX29wOgogCQkJLyogY29wcmVnaXN0ZXIgcmQgLT4gZ3ByW3J0XSAqLwogCQkJaWYgKE1JUFNJbnN0X1JUKGlyKSAhPSAwKSB7CkBAIC0xMjYzLDYgKzEyOTIsNyBAQAogI2VuZGlmCiAKIAlkZWZhdWx0Ogorc2lnaWxsOgogCQlyZXR1cm4gU0lHSUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L2tlcm5lbF9saW5rYWdlLmMgYi9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYwppbmRleCAxYzU4NjU3Li4zYWVhZTA3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYwpAQCAtODksOCArODksOSBAQAogewogCWludCBpOwogCWludCBlcnIgPSAwOworCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrPTIpIHsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gaW5jKSB7CiAJCWVyciB8PQogCQkgICAgX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgJnNjLT5zY19mcHJlZ3NbaV0pOwogCX0KQEAgLTEwMyw4ICsxMDQsOSBAQAogewogCWludCBpOwogCWludCBlcnIgPSAwOworCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrPTIpIHsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gaW5jKSB7CiAJCWVyciB8PQogCQkgICAgX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgJnNjLT5zY19mcHJlZ3NbaV0pOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLW9jdGVvbi5jIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKaW5kZXggYzhlZmRiNS4uZjQxYTVjNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKQEAgLTYsNyArNiw2IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBDYXZpdW0gTmV0d29ya3MKICAqLwogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjNrLmMgYi9hcmNoL21pcHMvbW0vYy1yM2suYwppbmRleCAyZmNkZTBjLi4xMzVlYzMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yM2suYworKysgYi9hcmNoL21pcHMvbW0vYy1yM2suYwpAQCAtOSw3ICs5LDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCBHbGViIFJhaWtvICYgVmxhZGltaXIgUm9nYW5vdgogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA0LCAyMDA3ICBNYWNpZWogVy4gUm96eWNraQogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IDQ5ZTU3MmQuLmMxNDI1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC0xMDIwLDEwICsxMDIwLDE0IEBACiAJCSAqLwogCQljb25maWcxID0gcmVhZF9jMF9jb25maWcxKCk7CiAKLQkJaWYgKChsc2l6ZSA9ICgoY29uZmlnMSA+PiAxOSkgJiA3KSkpCi0JCQljLT5pY2FjaGUubGluZXN6ID0gMiA8PCBsc2l6ZTsKLQkJZWxzZQotCQkJYy0+aWNhY2hlLmxpbmVzeiA9IGxzaXplOworCQlsc2l6ZSA9IChjb25maWcxID4+IDE5KSAmIDc7CisKKwkJLyogSUwgPT0gNyBpcyByZXNlcnZlZCAqLworCQlpZiAobHNpemUgPT0gNykKKwkJCXBhbmljKCJJbnZhbGlkIGljYWNoZSBsaW5lIHNpemUiKTsKKworCQljLT5pY2FjaGUubGluZXN6ID0gbHNpemUgPyAyIDw8IGxzaXplIDogMDsKKwogCQljLT5pY2FjaGUuc2V0cyA9IDMyIDw8ICgoKGNvbmZpZzEgPj4gMjIpICsgMSkgJiA3KTsKIAkJYy0+aWNhY2hlLndheXMgPSAxICsgKChjb25maWcxID4+IDE2KSAmIDcpOwogCkBAIC0xMDQwLDEwICsxMDQ0LDE0IEBACiAJCSAqLwogCQljLT5kY2FjaGUuZmxhZ3MgPSAwOwogCi0JCWlmICgobHNpemUgPSAoKGNvbmZpZzEgPj4gMTApICYgNykpKQotCQkJYy0+ZGNhY2hlLmxpbmVzeiA9IDIgPDwgbHNpemU7Ci0JCWVsc2UKLQkJCWMtPmRjYWNoZS5saW5lc3o9IGxzaXplOworCQlsc2l6ZSA9IChjb25maWcxID4+IDEwKSAmIDc7CisKKwkJLyogREwgPT0gNyBpcyByZXNlcnZlZCAqLworCQlpZiAobHNpemUgPT0gNykKKwkJCXBhbmljKCJJbnZhbGlkIGRjYWNoZSBsaW5lIHNpemUiKTsKKworCQljLT5kY2FjaGUubGluZXN6ID0gbHNpemUgPyAyIDw8IGxzaXplIDogMDsKKwogCQljLT5kY2FjaGUuc2V0cyA9IDMyIDw8ICgoKGNvbmZpZzEgPj4gMTMpICsgMSkgJiA3KTsKIAkJYy0+ZGNhY2hlLndheXMgPSAxICsgKChjb25maWcxID4+IDcpICYgNyk7CiAKQEAgLTExMDUsNiArMTExMyw4IEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCWNhc2UgQ1BVX1BST0FQVElWOgogCQlpZiAoY3VycmVudF9jcHVfdHlwZSgpID09IENQVV83NEspCiAJCQlhbGlhc183NGtfZXJyYXR1bShjKTsKIAkJaWYgKChyZWFkX2MwX2NvbmZpZzcoKSAmICgxIDw8IDE2KSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggMTVmODEzYy4uZmRlN2U1NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTgsNyArOCw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jZXgtc2IxLlMgYi9hcmNoL21pcHMvbW0vY2V4LXNiMS5TCmluZGV4IDE5MWNmNmUuLjVkNWYyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jZXgtc2IxLlMKKysrIGIvYXJjaC9taXBzL21tL2NleC1zYjEuUwpAQCAtMTUsNyArMTUsNiBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9kbWEtZGVmYXVsdC5jIGIvYXJjaC9taXBzL21tL2RtYS1kZWZhdWx0LmMKaW5kZXggMmU5NDE4NS4uNDRiNmRmZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2RtYS1kZWZhdWx0LmMKKysrIGIvYXJjaC9taXBzL21tL2RtYS1kZWZhdWx0LmMKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGRtYS1jb2hlcmVuY2UuaD4KIAorI2lmZGVmIENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQKIGludCBjb2hlcmVudGlvID0gMDsJLyogVXNlciBkZWZpbmVkIERNQSBjb2hlcmVuY3kgZnJvbSBjb21tYW5kIGxpbmUuICovCiBFWFBPUlRfU1lNQk9MX0dQTChjb2hlcmVudGlvKTsKIGludCBod19jb2hlcmVudGlvID0gMDsJLyogQWN0dWFsIGhhcmR3YXJlIHN1cHBvcnRlZCBETUEgY29oZXJlbmN5IHNldHRpbmcuICovCkBAIC00Miw2ICs0Myw3IEBACiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgibm9jb2hlcmVudGlvIiwgc2V0bm9jb2hlcmVudGlvKTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpkbWFfYWRkcl90b19wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlkbWFfYWRkcl90IGRtYV9hZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL21pcHMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAwMWZkYTQ0Li43N2UwYWUwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL21pcHMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtMTEsNyArMTEsNiBAQAogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IENhdml1bSBOZXR3b3JrcywgSW5jLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pbml0LmMgYi9hcmNoL21pcHMvbW0vaW5pdC5jCmluZGV4IDEyMTU2MTcuLjZiNTk2MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pbml0LmMKKysrIGIvYXJjaC9taXBzL21tL2luaXQuYwpAQCAtMTcxLDggKzE3MSw2IEBACiAJcmV0dXJuICh2b2lkKikgdmFkZHI7CiB9CiAKLSNkZWZpbmUgVU5JUVVFX0VOVFJZSEkoaWR4KSAoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKQotCiB2b2lkIGt1bm1hcF9jb2hlcmVudCh2b2lkKQogewogI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vcGFnZS5jIGIvYXJjaC9taXBzL21tL3BhZ2UuYwppbmRleCBjYmQ4MWQxLi41ODAzM2M0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vcGFnZS5jCisrKyBiL2FyY2gvbWlwcy9tbS9wYWdlLmMKQEAgLTgsNyArOCw2IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFRoaWVtbyBTZXVmZXIKICAqIENvcHlyaWdodCAoQykgMjAxMiAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYyBiL2FyY2gvbWlwcy9tbS9zYy1taXBzLmMKaW5kZXggMDhkMDVhZS4uN2E1NmFlZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYworKysgYi9hcmNoL21pcHMvbW0vc2MtbWlwcy5jCkBAIC03Niw2ICs3Niw4IEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCWNhc2UgQ1BVX1BST0FQVElWOgogCWNhc2UgQ1BVX0JNSVBTNTAwMDoKIAkJaWYgKGNvbmZpZzIgJiAoMSA8PCAxMikpCiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9zYy1ybTdrLmMgYi9hcmNoL21pcHMvbW0vc2Mtcm03ay5jCmluZGV4IGFhZmZiYmEuLjlhYzFlZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9zYy1ybTdrLmMKKysrIGIvYXJjaC9taXBzL21tL3NjLXJtN2suYwpAQCAtNiw3ICs2LDYgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGItcjNrLmMgYi9hcmNoL21pcHMvbW0vdGxiLXIzay5jCmluZGV4IDlhY2ExMDkuLmQ2NTc0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGItcjNrLmMKKysrIGIvYXJjaC9taXBzL21tL3RsYi1yM2suYwpAQCAtMTAsNyArMTAsNiBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyICBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMjAwMiAgTWFjaWVqIFcuIFJvenlja2kKICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYi1yNGsuYyBiL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKaW5kZXggZGEzYjBiOS4uYWU0Y2EyNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYi1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCkBAIC0yMCwxNiArMjAsMTEgQEAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vdGxibWlzYy5oPgogCiBleHRlcm4gdm9pZCBidWlsZF90bGJfcmVmaWxsX2hhbmRsZXIodm9pZCk7CiAKLS8qCi0gKiBNYWtlIHN1cmUgYWxsIGVudHJpZXMgZGlmZmVyLiAgSWYgdGhleSdyZSBub3QgZGlmZmVyZW50Ci0gKiBNSVBTMzIgd2lsbCB0YWtlIHJldmVuZ2UgLi4uCi0gKi8KLSNkZWZpbmUgVU5JUVVFX0VOVFJZSEkoaWR4KSAoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKQotCiAvKiBBdG9taWNpdHkgYW5kIGludGVycnVwdGFiaWxpdHkgKi8KICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAKQEAgLTc3LDcgKzcyLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgb2xkX2N0eDsKLQlpbnQgZW50cnk7CisJaW50IGVudHJ5LCBmdGxiaGlnaHNldDsKIAogCUVOVEVSX0NSSVRJQ0FMKGZsYWdzKTsKIAkvKiBTYXZlIG9sZCBjb250ZXh0IGFuZCBjcmVhdGUgaW1wb3NzaWJsZSBWUE4yIHZhbHVlICovCkBAIC04OCwxMyArODMsMzAgQEAKIAllbnRyeSA9IHJlYWRfYzBfd2lyZWQoKTsKIAogCS8qIEJsYXN0ICdlbSBhbGwgYXdheS4gKi8KLQl3aGlsZSAoZW50cnkgPCBjdXJyZW50X2NwdV9kYXRhLnRsYnNpemUpIHsKLQkJLyogTWFrZSBzdXJlIGFsbCBlbnRyaWVzIGRpZmZlci4gKi8KLQkJd3JpdGVfYzBfZW50cnloaShVTklRVUVfRU5UUllISShlbnRyeSkpOwotCQl3cml0ZV9jMF9pbmRleChlbnRyeSk7Ci0JCW10YzBfdGxid19oYXphcmQoKTsKLQkJdGxiX3dyaXRlX2luZGV4ZWQoKTsKLQkJZW50cnkrKzsKKwlpZiAoY3B1X2hhc190bGJpbnYpIHsKKwkJaWYgKGN1cnJlbnRfY3B1X2RhdGEudGxic2l6ZXZ0bGIpIHsKKwkJCXdyaXRlX2MwX2luZGV4KDApOworCQkJbXRjMF90bGJ3X2hhemFyZCgpOworCQkJdGxiaW52ZigpOyAgLyogaW52YWxpZGF0ZSBWVExCICovCisJCX0KKwkJZnRsYmhpZ2hzZXQgPSBjdXJyZW50X2NwdV9kYXRhLnRsYnNpemV2dGxiICsKKwkJCWN1cnJlbnRfY3B1X2RhdGEudGxic2l6ZWZ0bGJzZXRzOworCQlmb3IgKGVudHJ5ID0gY3VycmVudF9jcHVfZGF0YS50bGJzaXpldnRsYjsKKwkJICAgICBlbnRyeSA8IGZ0bGJoaWdoc2V0OworCQkgICAgIGVudHJ5KyspIHsKKwkJCXdyaXRlX2MwX2luZGV4KGVudHJ5KTsKKwkJCW10YzBfdGxid19oYXphcmQoKTsKKwkJCXRsYmludmYoKTsgIC8qIGludmFsaWRhdGUgb25lIEZUTEIgc2V0ICovCisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAoZW50cnkgPCBjdXJyZW50X2NwdV9kYXRhLnRsYnNpemUpIHsKKwkJCS8qIE1ha2Ugc3VyZSBhbGwgZW50cmllcyBkaWZmZXIuICovCisJCQl3cml0ZV9jMF9lbnRyeWhpKFVOSVFVRV9FTlRSWUhJKGVudHJ5KSk7CisJCQl3cml0ZV9jMF9pbmRleChlbnRyeSk7CisJCQltdGMwX3RsYndfaGF6YXJkKCk7CisJCQl0bGJfd3JpdGVfaW5kZXhlZCgpOworCQkJZW50cnkrKzsKKwkJfQogCX0KIAl0bGJ3X3VzZV9oYXphcmQoKTsKIAl3cml0ZV9jMF9lbnRyeWhpKG9sZF9jdHgpOwpAQCAtMTMzLDcgKzE0NSw5IEBACiAJCXN0YXJ0ID0gcm91bmRfZG93bihzdGFydCwgUEFHRV9TSVpFIDw8IDEpOwogCQllbmQgPSByb3VuZF91cChlbmQsIFBBR0VfU0laRSA8PCAxKTsKIAkJc2l6ZSA9IChlbmQgLSBzdGFydCkgPj4gKFBBR0VfU0hJRlQgKyAxKTsKLQkJaWYgKHNpemUgPD0gY3VycmVudF9jcHVfZGF0YS50bGJzaXplLzIpIHsKKwkJaWYgKHNpemUgPD0gKGN1cnJlbnRfY3B1X2RhdGEudGxic2l6ZWZ0bGJzZXRzID8KKwkJCSAgICAgY3VycmVudF9jcHVfZGF0YS50bGJzaXplIC8gOCA6CisJCQkgICAgIGN1cnJlbnRfY3B1X2RhdGEudGxic2l6ZSAvIDIpKSB7CiAJCQlpbnQgb2xkcGlkID0gcmVhZF9jMF9lbnRyeWhpKCk7CiAJCQlpbnQgbmV3cGlkID0gY3B1X2FzaWQoY3B1LCBtbSk7CiAKQEAgLTE3Miw3ICsxODYsOSBAQAogCUVOVEVSX0NSSVRJQ0FMKGZsYWdzKTsKIAlzaXplID0gKGVuZCAtIHN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwogCXNpemUgPSAoc2l6ZSArIDEpID4+IDE7Ci0JaWYgKHNpemUgPD0gY3VycmVudF9jcHVfZGF0YS50bGJzaXplIC8gMikgeworCWlmIChzaXplIDw9IChjdXJyZW50X2NwdV9kYXRhLnRsYnNpemVmdGxic2V0cyA/CisJCSAgICAgY3VycmVudF9jcHVfZGF0YS50bGJzaXplIC8gOCA6CisJCSAgICAgY3VycmVudF9jcHVfZGF0YS50bGJzaXplIC8gMikpIHsKIAkJaW50IHBpZCA9IHJlYWRfYzBfZW50cnloaSgpOwogCiAJCXN0YXJ0ICY9IChQQUdFX01BU0sgPDwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiLXI4ay5jIGIvYXJjaC9taXBzL21tL3RsYi1yOGsuYwppbmRleCA2YTk5NzMzLi4xMzhhMmVjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiLXI4ay5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGItcjhrLmMKQEAgLTgsNyArOCw2IEBACiAgKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KICAqIENvcHlyaWdodCAoQykgMjAwMiBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiZXguYyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCmluZGV4IDE4M2YyYjUuLmIyMzRiMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGJleC5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC01MTAsNiArNTA5LDcgQEAKIAkJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKIAkJY2FzZSBDUFVfTTE0S0M6CiAJCWNhc2UgQ1BVXzc0SzoKKwkJY2FzZSBDUFVfUFJPQVBUSVY6CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3Vhc20tbWljcm9taXBzLmMgYi9hcmNoL21pcHMvbW0vdWFzbS1taWNyb21pcHMuYwppbmRleCAwNjAwMDBmLi5iOGQ1ODBjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdWFzbS1taWNyb21pcHMuYworKysgYi9hcmNoL21pcHMvbW0vdWFzbS1taWNyb21pcHMuYwpAQCAtMTUsNyArMTUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW5zdC5oPgogI2luY2x1ZGUgPGFzbS9lbGYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS91YXNtLW1pcHMuYyBiL2FyY2gvbWlwcy9tbS91YXNtLW1pcHMuYwppbmRleCAwYzcyNDU4Li4zYWJkNjA5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdWFzbS1taXBzLmMKKysrIGIvYXJjaC9taXBzL21tL3Vhc20tbWlwcy5jCkBAIC0xNSw3ICsxNSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9pbnN0Lmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tdGktbWFsdGEvTWFrZWZpbGUKaW5kZXggNzJmZGVkYi4uZWFlMGJhMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL01ha2VmaWxlCkBAIC05LDcgKzksNSBAQAogCQkJCSAgIG1hbHRhLWludC5vIG1hbHRhLW1lbW9yeS5vIG1hbHRhLXBsYXRmb3JtLm8gXAogCQkJCSAgIG1hbHRhLXJlc2V0Lm8gbWFsdGEtc2V0dXAubyBtYWx0YS10aW1lLm8KIAotb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gbWFsdGEtY29uc29sZS5vCi0KICMgRklYTUUgRklYTUUgRklYTUUKIG9iai0kKENPTkZJR19NSVBTX01UX1NNVEMpCSs9IG1hbHRhLXNtdGMubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1hbW9uLmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWFtb24uYwppbmRleCAxZTQ3ODQ0Li41OTJhYzA0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWFtb24uYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWFtb24uYwpAQCAtMSwzMCArMSwyMCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KLSAqCUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGZvciBtb3JlIGRldGFpbHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBBcmJpdHJhcnkgTW9uaXRvciBpbnRlcmZhY2UKKyAqIEFyYml0cmFyeSBNb25pdG9yIEludGVyZmFjZQogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2xhdW5jaC5oPgogI2luY2x1ZGUgPGFzbS9taXBzbXRyZWdzLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2xhdW5jaC5oPgorI2luY2x1ZGUgPGFzbS92cGUuaD4KIAogaW50IGFtb25fY3B1X2F2YWlsKGludCBjcHUpCiB7CkBAIC00OCw3ICszOCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQgYW1vbl9jcHVfc3RhcnQoaW50IGNwdSwKK2ludCBhbW9uX2NwdV9zdGFydChpbnQgY3B1LAogCQkgICAgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgZ3AsIHVuc2lnbmVkIGxvbmcgYTApCiB7CkBAIC01NiwxMCArNDYsMTAgQEAKIAkJKHN0cnVjdCBjcHVsYXVuY2ggICopQ0tTRUcwQUREUihDUFVMQVVOQ0gpOwogCiAJaWYgKCFhbW9uX2NwdV9hdmFpbChjcHUpKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgewogCQlwcl9kZWJ1ZygibGF1bmNoOiBJIGFtIGNwdSVkIVxuIiwgY3B1KTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAJfQogCWxhdW5jaCArPSBjcHU7CiAKQEAgLTc4LDQgKzY4LDIxIEBACiAJCTsKIAlzbXBfcm1iKCk7CS8qIFRhcmdldCB3aWxsIGJlIHVwZGF0aW5nIGZsYWdzIHNvb24gKi8KIAlwcl9kZWJ1ZygibGF1bmNoOiBjcHUlZCBnb25lIVxuIiwgY3B1KTsKKworCXJldHVybiAwOwogfQorCisjaWZkZWYgQ09ORklHX01JUFNfVlBFX0xPQURFUgoraW50IHZwZV9ydW4oc3RydWN0IHZwZSAqdikKK3sKKwlzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgKm47CisKKwlpZiAoYW1vbl9jcHVfc3RhcnQoYXBycF9jcHVfaW5kZXgoKSwgdi0+X19zdGFydCwgMCwgMCwgMCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG4sICZ2LT5ub3RpZnksIGxpc3QpCisJCW4tPnN0YXJ0KFZQRV9NT0RVTEVfTUlOT1IpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtY29uc29sZS5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1jb25zb2xlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmNmYjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1jb25zb2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcwotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBQdXR0aW5nIHRoaW5ncyBvbiB0aGUgc2NyZWVuL3NlcmlhbCBsaW5lIHVzaW5nIFlBTU9OcyBmYWNpbGl0aWVzLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLQotI2RlZmluZSBQT1JUKG9mZnNldCkgKDB4M2Y4ICsgKG9mZnNldCkpCi0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKGludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGluYihQT1JUKG9mZnNldCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VyaWFsX291dChpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jb3V0Yih2YWx1ZSwgUE9SVChvZmZzZXQpKTsKLX0KLQotaW50IHByb21fcHV0Y2hhcihjaGFyIGMpCi17Ci0Jd2hpbGUgKChzZXJpYWxfaW4oVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkgPT0gMCkKLQkJOwotCi0Jc2VyaWFsX291dChVQVJUX1RYLCBjKTsKLQotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbml0LmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYwppbmRleCBmZjhjYWZmLi5mY2ViZmNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgpAQCAtNDQsMzIgKzQ1LDM5IEBACiAJY2hhciBwYXJpdHkgPSAnXDAnLCBiaXRzID0gJ1wwJywgZmxvdyA9ICdcMCc7CiAJY2hhciAqczsKIAotCWlmICgoc3Ryc3RyKGZ3X2dldGNtZGxpbmUoKSwgImNvbnNvbGU9IikpID09IE5VTEwpIHsKLQkJcyA9IGZ3X2dldGVudigibW9kZXR0eTAiKTsKLQkJaWYgKHMpIHsKLQkJCXdoaWxlICgqcyA+PSAnMCcgJiYgKnMgPD0gJzknKQotCQkJCWJhdWQgPSBiYXVkKjEwICsgKnMrKyAtICcwJzsKLQkJCWlmICgqcyA9PSAnLCcpCi0JCQkJcysrOwotCQkJaWYgKCpzKQotCQkJCXBhcml0eSA9ICpzKys7Ci0JCQlpZiAoKnMgPT0gJywnKQotCQkJCXMrKzsKLQkJCWlmICgqcykKLQkJCQliaXRzID0gKnMrKzsKLQkJCWlmICgqcyA9PSAnLCcpCi0JCQkJcysrOwotCQkJaWYgKCpzID09ICdoJykKLQkJCQlmbG93ID0gJ3InOwotCQl9Ci0JCWlmIChiYXVkID09IDApCi0JCQliYXVkID0gMzg0MDA7Ci0JCWlmIChwYXJpdHkgIT0gJ24nICYmIHBhcml0eSAhPSAnbycgJiYgcGFyaXR5ICE9ICdlJykKLQkJCXBhcml0eSA9ICduJzsKLQkJaWYgKGJpdHMgIT0gJzcnICYmIGJpdHMgIT0gJzgnKQotCQkJYml0cyA9ICc4JzsKLQkJaWYgKGZsb3cgPT0gJ1wwJykKKwlzID0gZndfZ2V0ZW52KCJtb2RldHR5MCIpOworCWlmIChzKSB7CisJCXdoaWxlICgqcyA+PSAnMCcgJiYgKnMgPD0gJzknKQorCQkJYmF1ZCA9IGJhdWQqMTAgKyAqcysrIC0gJzAnOworCQlpZiAoKnMgPT0gJywnKQorCQkJcysrOworCQlpZiAoKnMpCisJCQlwYXJpdHkgPSAqcysrOworCQlpZiAoKnMgPT0gJywnKQorCQkJcysrOworCQlpZiAoKnMpCisJCQliaXRzID0gKnMrKzsKKwkJaWYgKCpzID09ICcsJykKKwkJCXMrKzsKKwkJaWYgKCpzID09ICdoJykKIAkJCWZsb3cgPSAncic7CisJfQorCWlmIChiYXVkID09IDApCisJCWJhdWQgPSAzODQwMDsKKwlpZiAocGFyaXR5ICE9ICduJyAmJiBwYXJpdHkgIT0gJ28nICYmIHBhcml0eSAhPSAnZScpCisJCXBhcml0eSA9ICduJzsKKwlpZiAoYml0cyAhPSAnNycgJiYgYml0cyAhPSAnOCcpCisJCWJpdHMgPSAnOCc7CisJaWYgKGZsb3cgPT0gJ1wwJykKKwkJZmxvdyA9ICdyJzsKKworCWlmICgoc3Ryc3RyKGZ3X2dldGNtZGxpbmUoKSwgImVhcmx5Y29uPSIpKSA9PSBOVUxMKSB7CisJCXNwcmludGYoY29uc29sZV9zdHJpbmcsICJ1YXJ0ODI1MCxpbywweDNmOCwlZCVjJWMiLCBiYXVkLAorCQkJcGFyaXR5LCBiaXRzKTsKKwkJc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKGNvbnNvbGVfc3RyaW5nKTsKKwl9CisKKwlpZiAoKHN0cnN0cihmd19nZXRjbWRsaW5lKCksICJjb25zb2xlPSIpKSA9PSBOVUxMKSB7CiAJCXNwcmludGYoY29uc29sZV9zdHJpbmcsICIgY29uc29sZT10dHlTMCwlZCVjJWMlYyIsIGJhdWQsCiAJCQlwYXJpdHksIGJpdHMsIGZsb3cpOwogCQlzdHJjYXQoZndfZ2V0Y21kbGluZSgpLCBjb25zb2xlX3N0cmluZyk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYwppbmRleCAwODkyNTc1Li5jYTNlM2E0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW50LmMKQEAgLTEsMjUgKzEsMTYgQEAKIC8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCiAgKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwNCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDAxIFJhbGYgQmFlY2hsZQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKgogICogUm91dGluZXMgZm9yIGdlbmVyaWMgbWFuaXB1bGF0aW9uIG9mIHRoZSBpbnRlcnJ1cHRzIGZvdW5kIG9uIHRoZSBNSVBTCi0gKiBNYWx0YSBib2FyZC4KLSAqIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyBsb2NhdGVkIGluIHRoZSBTb3V0aCBCcmlkZ2UgYSBQSUlYNCBkZXZpY2UKLSAqIHdpdGggdHdvIGludGVybmFsIDgyQzk1IGludGVycnVwdCBjb250cm9sbGVycy4KKyAqIE1hbHRhIGJvYXJkLiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgaXMgbG9jYXRlZCBpbiB0aGUgU291dGggQnJpZGdlCisgKiBhIFBJSVg0IGRldmljZSB3aXRoIHR3byBpbnRlcm5hbCA4MkM5NSBpbnRlcnJ1cHQgY29udHJvbGxlcnMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC00NCw2ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL2dpYy5oPgogI2luY2x1ZGUgPGFzbS9nY21wcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9ydGx4Lmg+CiAKIGludCBnY21wX3ByZXNlbnQgPSAtMTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9tc2MwMV9iaXVfYmFzZTsKQEAgLTkwLDcgKzgyLDcgQEAKIAkJQk9OSVRPX1BDSU1BUF9DRkcgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIHN5c3RlbSBjb250cm9sbGVyLlxuIik7CisJCXByX2VtZXJnKCJVbmtub3duIHN5c3RlbSBjb250cm9sbGVyLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJcmV0dXJuIGlycTsKQEAgLTEyNiw2ICsxMTgsMTEgQEAKIAl9CiAKIAlkb19JUlEoTUFMVEFfSU5UX0JBU0UgKyBpcnEpOworCisjaWZkZWYgTUlQU19WUEVfQVBTUF9BUEkKKwlpZiAoYXBycF9ob29rKQorCQlhcHJwX2hvb2soKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBtYWx0YV9pcGlfaXJxZGlzcGF0Y2godm9pZCkKQEAgLTE0OSwxMSArMTQ2LDExIEBACiAJdW5zaWduZWQgaW50IGludHJjYXVzZSwgZGF0YWxvLCBkYXRhaGk7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJDb3JlSEkgaW50ZXJydXB0LCBzaG91bGRuJ3QgaGFwcGVuLCB3ZSBkaWUgaGVyZSFcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJlcGMJIDogJTA4bHhcblN0YXR1czogJTA4bHhcbiIKLQkJCSJDYXVzZSA6ICUwOGx4XG5iYWRWYWRkciA6ICUwOGx4XG4iLAotCQkJcmVncy0+Y3AwX2VwYywgcmVncy0+Y3AwX3N0YXR1cywKLQkJCXJlZ3MtPmNwMF9jYXVzZSwgcmVncy0+Y3AwX2JhZHZhZGRyKTsKKwlwcl9lbWVyZygiQ29yZUhJIGludGVycnVwdCwgc2hvdWxkbid0IGhhcHBlbiwgd2UgZGllIGhlcmUhXG4iKTsKKwlwcl9lbWVyZygiZXBjCSA6ICUwOGx4XG5TdGF0dXM6ICUwOGx4XG4iCisJCSAiQ2F1c2UgOiAlMDhseFxuYmFkVmFkZHIgOiAlMDhseFxuIiwKKwkJIHJlZ3MtPmNwMF9lcGMsIHJlZ3MtPmNwMF9zdGF0dXMsCisJCSByZWdzLT5jcDBfY2F1c2UsIHJlZ3MtPmNwMF9iYWR2YWRkcik7CiAKIAkvKiBSZWFkIGFsbCB0aGUgcmVnaXN0ZXJzIGFuZCB0aGVuIHByaW50IHRoZW0gYXMgdGhlcmUgaXMgYQogCSAgIHByb2JsZW0gd2l0aCBpbnRlcnNwZXJzZWQgcHJpbnRrJ3MgdXBzZXR0aW5nIHRoZSBCb25pdG8gY29udHJvbGxlci4KQEAgLTE3MSw4ICsxNjgsOCBAQAogCQlpbnRyY2F1c2UgPSBHVF9SRUFEKEdUX0lOVFJDQVVTRV9PRlMpOwogCQlkYXRhbG8gPSBHVF9SRUFEKEdUX0NQVUVSUl9BRERSTE9fT0ZTKTsKIAkJZGF0YWhpID0gR1RfUkVBRChHVF9DUFVFUlJfQUREUkhJX09GUyk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJHVF9JTlRSQ0FVU0UgPSAlMDh4XG4iLCBpbnRyY2F1c2UpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiR1RfQ1BVRVJSX0FERFIgPSAlMDJ4JTA4eFxuIiwKKwkJcHJfZW1lcmcoIkdUX0lOVFJDQVVTRSA9ICUwOHhcbiIsIGludHJjYXVzZSk7CisJCXByX2VtZXJnKCJHVF9DUFVFUlJfQUREUiA9ICUwMnglMDh4XG4iLAogCQkJCWRhdGFoaSwgZGF0YWxvKTsKIAkJYnJlYWs7CiAJY2FzZSBNSVBTX1JFVklTSU9OX1NDT05fQk9OSVRPOgpAQCAtMTg0LDE0ICsxODEsMTQgQEAKIAkJaW50ZWRnZSA9IEJPTklUT19JTlRFREdFOwogCQlpbnRzdGVlciA9IEJPTklUT19JTlRTVEVFUjsKIAkJcGNpY21kID0gQk9OSVRPX1BDSUNNRDsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkJPTklUT19JTlRJU1IgPSAlMDh4XG4iLCBpbnRpc3IpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQk9OSVRPX0lOVEVOID0gJTA4eFxuIiwgaW50ZW4pOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQk9OSVRPX0lOVFBPTCA9ICUwOHhcbiIsIGludHBvbCk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJCT05JVE9fSU5URURHRSA9ICUwOHhcbiIsIGludGVkZ2UpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQk9OSVRPX0lOVFNURUVSID0gJTA4eFxuIiwgaW50c3RlZXIpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQk9OSVRPX1BDSUNNRCA9ICUwOHhcbiIsIHBjaWNtZCk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJCT05JVE9fUENJQkFEQUREUiA9ICUwOHhcbiIsIHBjaWJhZGFkZHIpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQk9OSVRPX1BDSU1TVEFUID0gJTA4eFxuIiwgcGNpbXN0YXQpOworCQlwcl9lbWVyZygiQk9OSVRPX0lOVElTUiA9ICUwOHhcbiIsIGludGlzcik7CisJCXByX2VtZXJnKCJCT05JVE9fSU5URU4gPSAlMDh4XG4iLCBpbnRlbik7CisJCXByX2VtZXJnKCJCT05JVE9fSU5UUE9MID0gJTA4eFxuIiwgaW50cG9sKTsKKwkJcHJfZW1lcmcoIkJPTklUT19JTlRFREdFID0gJTA4eFxuIiwgaW50ZWRnZSk7CisJCXByX2VtZXJnKCJCT05JVE9fSU5UU1RFRVIgPSAlMDh4XG4iLCBpbnRzdGVlcik7CisJCXByX2VtZXJnKCJCT05JVE9fUENJQ01EID0gJTA4eFxuIiwgcGNpY21kKTsKKwkJcHJfZW1lcmcoIkJPTklUT19QQ0lCQURBRERSID0gJTA4eFxuIiwgcGNpYmFkYWRkcik7CisJCXByX2VtZXJnKCJCT05JVE9fUENJTVNUQVQgPSAlMDh4XG4iLCBwY2ltc3RhdCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzEzLDYgKzMxMCwxMSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX3Jlc2NoZWRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKKyNpZmRlZiBNSVBTX1ZQRV9BUFNQX0FQSQorCWlmIChhcHJwX2hvb2spCisJCWFwcnBfaG9vaygpOworI2VuZGlmCisKIAlzY2hlZHVsZXJfaXBpKCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0zNjUsMTMgKzM2NywxMyBAQAogCS5mbGFncyA9IElSUUZfTk9fVEhSRUFELAogfTsKIAotc3RhdGljIG1zY19pcnFtYXBfdCBfX2luaXRkYXRhIG1zY19pcnFtYXBbXSA9IHsKK3N0YXRpYyBtc2NfaXJxbWFwX3QgbXNjX2lycW1hcFtdIF9faW5pdGRhdGEgPSB7CiAJe01TQzAxQ19JTlRfVE1SLAkJTVNDMDFfSVJRX0VER0UsIDB9LAogCXtNU0MwMUNfSU5UX1BDSSwJCU1TQzAxX0lSUV9MRVZFTCwgMH0sCiB9Owotc3RhdGljIGludCBfX2luaXRkYXRhIG1zY19ucl9pcnFzID0gQVJSQVlfU0laRShtc2NfaXJxbWFwKTsKK3N0YXRpYyBpbnQgbXNjX25yX2lycXMgX19pbml0ZGF0YSA9IEFSUkFZX1NJWkUobXNjX2lycW1hcCk7CiAKLXN0YXRpYyBtc2NfaXJxbWFwX3QgX19pbml0ZGF0YSBtc2NfZWljaXJxbWFwW10gPSB7CitzdGF0aWMgbXNjX2lycW1hcF90IG1zY19laWNpcnFtYXBbXSBfX2luaXRkYXRhID0gewogCXtNU0MwMUVfSU5UX1NXMCwJCU1TQzAxX0lSUV9MRVZFTCwgMH0sCiAJe01TQzAxRV9JTlRfU1cxLAkJTVNDMDFfSVJRX0xFVkVMLCAwfSwKIAl7TVNDMDFFX0lOVF9JODI1OUEsCQlNU0MwMV9JUlFfTEVWRUwsIDB9LApAQCAtMzg0LDcgKzM4Niw3IEBACiAJe01TQzAxRV9JTlRfQ1BVQ1RSLAkJTVNDMDFfSVJRX0xFVkVMLCAwfQogfTsKIAotc3RhdGljIGludCBfX2luaXRkYXRhIG1zY19ucl9laWNpcnFzID0gQVJSQVlfU0laRShtc2NfZWljaXJxbWFwKTsKK3N0YXRpYyBpbnQgbXNjX25yX2VpY2lycXMgX19pbml0ZGF0YSA9IEFSUkFZX1NJWkUobXNjX2VpY2lycW1hcCk7CiAKIC8qCiAgKiBUaGlzIEdJQyBzcGVjaWZpYyB0YWJ1bGFyIGFycmF5IGRlZmluZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gRXh0ZXJuYWwKQEAgLTQzMSw5ICs0MzMsMTIgQEAKIAlpZiAoZ2NtcF9wcmVzZW50ID49IDApCiAJCXJldHVybiBnY21wX3ByZXNlbnQ7CiAKLQlfZ2NtcF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZShHQ01QX0JBU0VfQUREUiwgR0NNUF9BRERSU1BBQ0VfU1opOwotCV9tc2MwMV9iaXVfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwX25vY2FjaGUoTVNDMDFfQklVX1JFR19CQVNFLCBNU0MwMV9CSVVfQUREUlNQQUNFX1NaKTsKLQlnY21wX3ByZXNlbnQgPSAoR0NNUEdDQihHQ01QQikgJiBHQ01QX0dDQl9HQ01QQl9HQ01QQkFTRV9NU0spID09IEdDTVBfQkFTRV9BRERSOworCV9nY21wX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcF9ub2NhY2hlKEdDTVBfQkFTRV9BRERSLAorCQlHQ01QX0FERFJTUEFDRV9TWik7CisJX21zYzAxX2JpdV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZShNU0MwMV9CSVVfUkVHX0JBU0UsCisJCU1TQzAxX0JJVV9BRERSU1BBQ0VfU1opOworCWdjbXBfcHJlc2VudCA9ICgoR0NNUEdDQihHQ01QQikgJiBHQ01QX0dDQl9HQ01QQl9HQ01QQkFTRV9NU0spID09CisJCUdDTVBfQkFTRV9BRERSKTsKIAogCWlmIChnY21wX3ByZXNlbnQpCiAJCXByX2RlYnVnKCJHQ01QIHByZXNlbnRcbiIpOwpAQCAtNDQzLDkgKzQ0OCw4IEBACiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBJT0NVJ3MgcHJlc2VudCAqLwogaW50IF9faW5pdCBnY21wX25pb2N1KHZvaWQpCiB7Ci0gIHJldHVybiBnY21wX3ByZXNlbnQgPwotICAgIChHQ01QR0NCKEdDKSAmIEdDTVBfR0NCX0dDX05VTUlPQ1VfTVNLKSA+PiBHQ01QX0dDQl9HQ19OVU1JT0NVX1NIRiA6Ci0gICAgMDsKKwlyZXR1cm4gZ2NtcF9wcmVzZW50ID8gKChHQ01QR0NCKEdDKSAmIEdDTVBfR0NCX0dDX05VTUlPQ1VfTVNLKSA+PgorCQlHQ01QX0dDQl9HQ19OVU1JT0NVX1NIRikgOiAwOwogfQogCiAvKiBTZXQgR0NNUCByZWdpb24gYXR0cmlidXRlcyAqLwpAQCAtNTk0LDExICs1OTgsMTQgQEAKIAkJCXNldF92aV9oYW5kbGVyKE1JUFNDUFVfSU5UX0lQSTEsIG1hbHRhX2lwaV9pcnFkaXNwYXRjaCk7CiAJCX0KIAkJLyogQXJnaC4uIHRoaXMgcmVhbGx5IG5lZWRzIHNvcnRpbmcgb3V0Li4gKi8KLQkJcHJpbnRrKCJDUFUlZDogc3RhdHVzIHJlZ2lzdGVyIHdhcyAlMDh4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWRfYzBfc3RhdHVzKCkpOworCQlwcl9pbmZvKCJDUFUlZDogc3RhdHVzIHJlZ2lzdGVyIHdhcyAlMDh4XG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWFkX2MwX3N0YXR1cygpKTsKIAkJd3JpdGVfYzBfc3RhdHVzKHJlYWRfYzBfc3RhdHVzKCkgfCBTVEFUVVNGX0lQMyB8IFNUQVRVU0ZfSVA0KTsKLQkJcHJpbnRrKCJDUFUlZDogc3RhdHVzIHJlZ2lzdGVyIG5vdyAlMDh4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWRfYzBfc3RhdHVzKCkpOworCQlwcl9pbmZvKCJDUFUlZDogc3RhdHVzIHJlZ2lzdGVyIG5vdyAlMDh4XG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWFkX2MwX3N0YXR1cygpKTsKIAkJd3JpdGVfYzBfc3RhdHVzKDB4MTEwMGRjMDApOwotCQlwcmludGsoIkNQVSVkOiBzdGF0dXMgcmVnaXN0ZXIgZnJjICUwOHhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgcmVhZF9jMF9zdGF0dXMoKSk7CisJCXByX2luZm8oIkNQVSVkOiBzdGF0dXMgcmVnaXN0ZXIgZnJjICUwOHhcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWRfYzBfc3RhdHVzKCkpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1X2lkczsgaSsrKSB7CiAJCQlhcmNoX2luaXRfaXBpaXJxKE1JUFNfR0lDX0lSUV9CQVNFICsKIAkJCQkJIEdJQ19SRVNDSEVEX0lOVChpKSwgJmlycV9yZXNjaGVkKTsKQEAgLTYxNiwxMSArNjIzLDE1IEBACiAJCQljcHVfaXBpX2NhbGxfaXJxID0gTVNDMDFFX0lOVF9TVzE7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY3B1X2hhc192aW50KSB7Ci0JCQkJc2V0X3ZpX2hhbmRsZXIgKE1JUFNfQ1BVX0lQSV9SRVNDSEVEX0lSUSwgaXBpX3Jlc2NoZWRfZGlzcGF0Y2gpOwotCQkJCXNldF92aV9oYW5kbGVyIChNSVBTX0NQVV9JUElfQ0FMTF9JUlEsIGlwaV9jYWxsX2Rpc3BhdGNoKTsKKwkJCQlzZXRfdmlfaGFuZGxlciAoTUlQU19DUFVfSVBJX1JFU0NIRURfSVJRLAorCQkJCQlpcGlfcmVzY2hlZF9kaXNwYXRjaCk7CisJCQkJc2V0X3ZpX2hhbmRsZXIgKE1JUFNfQ1BVX0lQSV9DQUxMX0lSUSwKKwkJCQkJaXBpX2NhbGxfZGlzcGF0Y2gpOwogCQkJfQotCQkJY3B1X2lwaV9yZXNjaGVkX2lycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgTUlQU19DUFVfSVBJX1JFU0NIRURfSVJROwotCQkJY3B1X2lwaV9jYWxsX2lycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgTUlQU19DUFVfSVBJX0NBTExfSVJROworCQkJY3B1X2lwaV9yZXNjaGVkX2lycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsKKwkJCQlNSVBTX0NQVV9JUElfUkVTQ0hFRF9JUlE7CisJCQljcHVfaXBpX2NhbGxfaXJxID0gTUlQU19DUFVfSVJRX0JBU0UgKworCQkJCU1JUFNfQ1BVX0lQSV9DQUxMX0lSUTsKIAkJfQogCQlhcmNoX2luaXRfaXBpaXJxKGNwdV9pcGlfcmVzY2hlZF9pcnEsICZpcnFfcmVzY2hlZCk7CiAJCWFyY2hfaW5pdF9pcGlpcnEoY3B1X2lwaV9jYWxsX2lycSwgJmlycV9jYWxsKTsKQEAgLTYzMCw5ICs2NDEsNyBAQAogCiB2b2lkIG1hbHRhX2JlX2luaXQodm9pZCkKIHsKLQlpZiAoZ2NtcF9wcmVzZW50KSB7Ci0JCS8qIENvdWxkIGNoYW5nZSBDTSBlcnJvciBtYXNrIHJlZ2lzdGVyICovCi0JfQorCS8qIENvdWxkIGNoYW5nZSBDTSBlcnJvciBtYXNrIHJlZ2lzdGVyLiAqLwogfQogCiAKQEAgLTcxMiwxNCArNzIxLDE0IEBACiAJCQlpZiAoY2F1c2UgPCAxNikgewogCQkJCXVuc2lnbmVkIGxvbmcgY2NhX2JpdHMgPSAoY21fZXJyb3IgPj4gMTUpICYgNzsKIAkJCQl1bnNpZ25lZCBsb25nIHRyX2JpdHMgPSAoY21fZXJyb3IgPj4gMTIpICYgNzsKLQkJCQl1bnNpZ25lZCBsb25nIG1jbWRfYml0cyA9IChjbV9lcnJvciA+PiA3KSAmIDB4MWY7CisJCQkJdW5zaWduZWQgbG9uZyBjbWRfYml0cyA9IChjbV9lcnJvciA+PiA3KSAmIDB4MWY7CiAJCQkJdW5zaWduZWQgbG9uZyBzdGFnX2JpdHMgPSAoY21fZXJyb3IgPj4gMykgJiAxNTsKIAkJCQl1bnNpZ25lZCBsb25nIHNwb3J0X2JpdHMgPSAoY21fZXJyb3IgPj4gMCkgJiA3OwogCiAJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKIAkJCQkJICJDQ0E9JWx1IFRSPSVzIE1DbWQ9JXMgU1RhZz0lbHUgIgogCQkJCQkgIlNQb3J0PSVsdVxuIiwKLQkJCQkJIGNjYV9iaXRzLCB0clt0cl9iaXRzXSwgbWNtZFttY21kX2JpdHNdLAorCQkJCQkgY2NhX2JpdHMsIHRyW3RyX2JpdHNdLCBtY21kW2NtZF9iaXRzXSwKIAkJCQkJIHN0YWdfYml0cywgc3BvcnRfYml0cyk7CiAJCQl9IGVsc2UgewogCQkJCS8qIGdsb2Igc3RhdGUgJiBzcmVzcCB0b2dldGhlciAqLwpAQCAtNzI4LDcgKzczNyw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBjMV9iaXRzID0gKGNtX2Vycm9yID4+IDEyKSAmIDc7CiAJCQkJdW5zaWduZWQgbG9uZyBjMF9iaXRzID0gKGNtX2Vycm9yID4+IDkpICYgNzsKIAkJCQl1bnNpZ25lZCBsb25nIHNjX2JpdCA9IChjbV9lcnJvciA+PiA4KSAmIDE7Ci0JCQkJdW5zaWduZWQgbG9uZyBtY21kX2JpdHMgPSAoY21fZXJyb3IgPj4gMykgJiAweDFmOworCQkJCXVuc2lnbmVkIGxvbmcgY21kX2JpdHMgPSAoY21fZXJyb3IgPj4gMykgJiAweDFmOwogCQkJCXVuc2lnbmVkIGxvbmcgc3BvcnRfYml0cyA9IChjbV9lcnJvciA+PiAwKSAmIDc7CiAJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKIAkJCQkJICJDMz0lcyBDMj0lcyBDMT0lcyBDMD0lcyBTQz0lcyAiCkBAIC03MzYsMTYgKzc0NSwxNiBAQAogCQkJCQkgY29yZVtjM19iaXRzXSwgY29yZVtjMl9iaXRzXSwKIAkJCQkJIGNvcmVbYzFfYml0c10sIGNvcmVbYzBfYml0c10sCiAJCQkJCSBzY19iaXQgPyAiVHJ1ZSIgOiAiRmFsc2UiLAotCQkJCQkgbWNtZFttY21kX2JpdHNdLCBzcG9ydF9iaXRzKTsKKwkJCQkJIG1jbWRbY21kX2JpdHNdLCBzcG9ydF9iaXRzKTsKIAkJCX0KIAogCQkJb2NhdXNlID0gKGNtX290aGVyICYgR0NNUF9HQ0JfR01FT19FUlJPUl8yTkRfTVNLKSA+PgogCQkJCSBHQ01QX0dDQl9HTUVPX0VSUk9SXzJORF9TSEY7CiAKLQkJCXByaW50aygiQ01fRVJST1I9JTA4bHggJXMgPCVzPlxuIiwgY21fZXJyb3IsCisJCQlwcl9lcnIoIkNNX0VSUk9SPSUwOGx4ICVzIDwlcz5cbiIsIGNtX2Vycm9yLAogCQkJICAgICAgIGNhdXNlc1tjYXVzZV0sIGJ1Zik7Ci0JCQlwcmludGsoIkNNX0FERFIgPSUwOGx4XG4iLCBjbV9hZGRyKTsKLQkJCXByaW50aygiQ01fT1RIRVI9JTA4bHggJXNcbiIsIGNtX290aGVyLCBjYXVzZXNbb2NhdXNlXSk7CisJCQlwcl9lcnIoIkNNX0FERFIgPSUwOGx4XG4iLCBjbV9hZGRyKTsKKwkJCXByX2VycigiQ01fT1RIRVI9JTA4bHggJXNcbiIsIGNtX290aGVyLCBjYXVzZXNbb2NhdXNlXSk7CiAKIAkJCS8qIHJlcHJpbWUgY2F1c2UgcmVnaXN0ZXIgKi8KIAkJCUdDTVBHQ0IoR0NNRUMpID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtcGxhdGZvcm0uYwppbmRleCAxMzJmODY2Li5lMWRkMWMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXBsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1wbGF0Zm9ybS5jCkBAIC00Nyw2ICs0Nyw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHVhcnQ4MjUwX2RhdGFbXSA9IHsKIAlTTUNfUE9SVCgweDNGOCwgNCksCiAJU01DX1BPUlQoMHgyRjgsIDMpLAorI2lmbmRlZiBDT05GSUdfTUlQU19DTVAKIAl7CiAJCS5tYXBiYXNlCT0gMHgxZjAwMDkwMCwJLyogVGhlIENCVVMgVUFSVCAqLwogCQkuaXJxCQk9IE1JUFNfQ1BVX0lSUV9CQVNFICsgTUlQU0NQVV9JTlRfTUIyLApAQCAtNTUsNiArNTYsNyBAQAogCQkuZmxhZ3MJCT0gQ0JVU19VQVJUX0ZMQUdTLAogCQkucmVnc2hpZnQJPSAzLAogCX0sCisjZW5kaWYKIAl7IH0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXRpbWUuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtdGltZS5jCmluZGV4IGExOGFmNWYuLjMxOTAwOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtdGltZS5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtdGltZS5jCkBAIC00Miw4ICs0Miw2IEBACiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaD4KIAotdW5zaWduZWQgbG9uZyBjcHVfa2h6OwotCiBzdGF0aWMgaW50IG1pcHNfY3B1X3RpbWVyX2lycTsKIHN0YXRpYyBpbnQgbWlwc19jcHVfcGVyZl9pcnE7CiBleHRlcm4gaW50IGNwMF9wZXJmY291bnRfaXJxOwpAQCAtMTY4LDExICsxNjYsMjQgQEAKIAlyZXR1cm4gbWlwc19jcHVfdGltZXJfaXJxOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9ydGModm9pZCkKK3sKKwkvKiBzdG9wIHRoZSBjbG9jayB3aGlsc3Qgc2V0dGluZyBpdCB1cCAqLworCUNNT1NfV1JJVEUoUlRDX1NFVCB8IFJUQ18yNEgsIFJUQ19DT05UUk9MKTsKKworCS8qIDMyS0h6IHRpbWUgYmFzZSAqLworCUNNT1NfV1JJVEUoUlRDX1JFRl9DTENLXzMyS0haLCBSVENfRlJFUV9TRUxFQ1QpOworCisJLyogc3RhcnQgdGhlIGNsb2NrICovCisJQ01PU19XUklURShSVENfMjRILCBSVENfQ09OVFJPTCk7Cit9CisKIHZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHByaWQgPSByZWFkX2MwX3ByaWQoKSAmIChQUklEX0NPTVBfTUFTSyB8IFBSSURfSU1QX01BU0spOwogCXVuc2lnbmVkIGludCBmcmVxOwogCisJaW5pdF9ydGMoKTsKIAllc3RpbWF0ZV9mcmVxdWVuY2llcygpOwogCiAJZnJlcSA9IG1pcHNfaHB0X2ZyZXF1ZW5jeTsKQEAgLTE4Miw3ICsxOTMsNiBAQAogCWZyZXEgPSBmcmVxcm91bmQoZnJlcSwgNTAwMCk7CiAJcHJpbnRrKCJDUFUgZnJlcXVlbmN5ICVkLiUwMmQgTUh6XG4iLCBmcmVxLzEwMDAwMDAsCiAJICAgICAgIChmcmVxJTEwMDAwMDApKjEwMC8xMDAwMDAwKTsKLQljcHVfa2h6ID0gZnJlcSAvIDEwMDA7CiAKIAltaXBzX3Njcm9sbF9tZXNzYWdlKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktc2VhZDMvTWFrZWZpbGUgYi9hcmNoL21pcHMvbXRpLXNlYWQzL01ha2VmaWxlCmluZGV4IGJlMTE0MjAuLjA3MTc4NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktc2VhZDMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL210aS1zZWFkMy9NYWtlZmlsZQpAQCAtMjEsNSArMjEsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9FSENJX0hDRCkJKz0gc2VhZDMtZWhjaS5vCiBvYmotJChDT05GSUdfT0YpCQkrPSBzZWFkMy5kdGIubwogCitDRkxBR1Nfc2VhZDMtc2V0dXAubyA9IC1JJChzcmMpLy4uLy4uLy4uL3NjcmlwdHMvZHRjL2xpYmZkdAorCiAkKG9iaikvJS5kdGI6ICQob2JqKS8lLmR0cwogCSQoY2FsbCBpZl9jaGFuZ2VkLGR0YykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtcGljMzItYnVzLmMgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLXBpYzMyLWJ1cy5jCmluZGV4IGViMmJmOTMuLjNiMTJhYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtcGljMzItYnVzLmMKKysrIGIvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1waWMzMi1idXMuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1zZXR1cC5jIGIvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1zZXR1cC5jCmluZGV4IDkyOGJhODQuLmJmN2ZlNDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtc2V0dXAuYworKysgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLXNldHVwLmMKQEAgLTQsMTMgKzQsMTUgQEAKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliZmR0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9mdy9mdy5oPgogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KIApAQCAtMTksOCArMjEsNzMgQEAKIAlyZXR1cm4gIk1JUFMgU0VBRDMiOwogfQogCitzdGF0aWMgdWludDMyX3QgZ2V0X21lbXNpemVfZnJvbV9jbWRsaW5lKHZvaWQpCit7CisJaW50IG1lbXNpemUgPSAwOworCWNoYXIgKnAgPSBhcmNzX2NtZGxpbmU7CisJY2hhciAqcyA9ICJtZW1zaXplPSI7CisKKwlwID0gc3Ryc3RyKHAsIHMpOworCWlmIChwKSB7CisJCXAgKz0gc3RybGVuKHMpOworCQltZW1zaXplID0gbWVtcGFyc2UocCwgTlVMTCk7CisJfQorCisJcmV0dXJuIG1lbXNpemU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfbWVtc2l6ZV9mcm9tX2Vudih2b2lkKQoreworCWludCBtZW1zaXplID0gMDsKKwljaGFyICpwOworCisJcCA9IGZ3X2dldGVudigibWVtc2l6ZSIpOworCWlmIChwKQorCQltZW1zaXplID0gbWVtcGFyc2UocCwgTlVMTCk7CisKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworc3RhdGljIHVpbnQzMl90IGdldF9tZW1zaXplKHZvaWQpCit7CisJdWludDMyX3QgbWVtc2l6ZTsKKworCW1lbXNpemUgPSBnZXRfbWVtc2l6ZV9mcm9tX2NtZGxpbmUoKTsKKwlpZiAobWVtc2l6ZSkKKwkJcmV0dXJuIG1lbXNpemU7CisKKwlyZXR1cm4gZ2V0X21lbXNpemVfZnJvbV9lbnYoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX21lbXNpemVfcGFyYW0odm9pZCkKK3sKKwlpbnQgb2Zmc2V0OworCWNvbnN0IHVpbnQ2NF90ICpwcm9wX3ZhbHVlOworCWludCBwcm9wX2xlbjsKKwl1aW50MzJfdCBtZW1zaXplID0gZ2V0X21lbXNpemUoKTsKKworCWlmICghbWVtc2l6ZSkKKwkJcmV0dXJuOworCisJb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KCZfX2R0Yl9zdGFydCwgIi9tZW1vcnkiKTsKKwlpZiAob2Zmc2V0ID4gMCkgeworCQl1aW50NjRfdCBuZXdfdmFsdWU7CisJCS8qCisJCSAqIHJlZyBjb250YWlucyAyIDMyLWJpdHMgQkUgdmFsdWVzLCBvZmZzZXQgYW5kIHNpemUuIFdlIGp1c3QKKwkJICogd2FudCB0byByZXBsYWNlIHRoZSBzaXplIHZhbHVlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvZmZzZXQKKwkJICovCisJCXByb3BfdmFsdWUgPSBmZHRfZ2V0cHJvcCgmX19kdGJfc3RhcnQsIG9mZnNldCwgInJlZyIsICZwcm9wX2xlbik7CisJCW5ld192YWx1ZSA9IGJlNjRfdG9fY3B1KCpwcm9wX3ZhbHVlKTsKKwkJbmV3X3ZhbHVlID0gIChuZXdfdmFsdWUgJiB+MHhmZmZmZmZmZmxsdSkgfCBtZW1zaXplOworCQlmZHRfc2V0cHJvcF9pbnBsYWNlX3U2NCgmX19kdGJfc3RhcnQsIG9mZnNldCwgInJlZyIsIG5ld192YWx1ZSk7CisJfQorfQorCiB2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQogeworCS8qIGFsbG93IGNvbW1hbmQgbGluZS9ib290bG9hZGVyIGVudiB0byBvdmVycmlkZSBtZW1vcnkgc2l6ZSBpbiBEVCAqLworCXBhcnNlX21lbXNpemVfcGFyYW0oKTsKKwogCS8qCiAJICogTG9hZCB0aGUgYnVpbHRpbiBkZXZpY2V0cmVlLiBUaGlzIGNhdXNlcyB0aGUgY2hvc2VuIG5vZGUgdG8gYmUKIAkgKiBwYXJzZWQgcmVzdWx0aW5nIGluIG91ciBtZW1vcnkgYXBwZWFyaW5nCkBAIC0zMCwxNiArOTcsMTUgQEAKIAogdm9pZCBfX2luaXQgZGV2aWNlX3RyZWVfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKLQogCWlmICghaW5pdGlhbF9ib290X3BhcmFtcykKIAkJcmV0dXJuOwogCi0JYmFzZSA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWluaXRpYWxfYm9vdF9wYXJhbXMpOwotCXNpemUgPSBiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT50b3RhbHNpemUpOwotCi0JLyogQmVmb3JlIHdlIGRvIGFueXRoaW5nLCBsZXRzIHJlc2VydmUgdGhlIGR0IGJsb2IgKi8KLQlyZXNlcnZlX2Jvb3RtZW0oYmFzZSwgc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKLQotCXVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpOworCXVuZmxhdHRlbl9hbmRfY29weV9kZXZpY2VfdHJlZSgpOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBjdXN0b21pemVfbWFjaGluZSh2b2lkKQoreworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoY3VzdG9taXplX21hY2hpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy10aW1lLmMgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLXRpbWUuYwppbmRleCA1NTJkMjZjLi42NzhkMDNkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLXRpbWUuYworKysgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLXRpbWUuYwpAQCAtMTMsOCArMTMsNiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvZ2VuZXJpYy5oPgogCi11bnNpZ25lZCBsb25nIGNwdV9raHo7Ci0KIHN0YXRpYyBpbnQgbWlwc19jcHVfdGltZXJfaXJxOwogc3RhdGljIGludCBtaXBzX2NwdV9wZXJmX2lycTsKIApAQCAtMTA5LDggKzEwNyw2IEBACiAJcHJfZGVidWcoIkNQVSBmcmVxdWVuY3kgJWQuJTAyZCBNSHpcbiIsIChlc3RfZnJlcSAvIDEwMDAwMDApLAogCQkoZXN0X2ZyZXEgJSAxMDAwMDAwKSAqIDEwMCAvIDEwMDAwMDApOwogCi0JY3B1X2toeiA9IGVzdF9mcmVxIC8gMTAwMDsKLQogCW1pcHNfc2Nyb2xsX21lc3NhZ2UoKTsKIAogCXBsYXRfcGVyZl9zZXR1cCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy5kdHMgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLmR0cwppbmRleCA2NThmNDM3Li5lNGIzMTdkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLmR0cworKysgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLmR0cwpAQCAtMTUsMTAgKzE1LDYgQEAKIAkJfTsKIAl9OwogCi0JY2hvc2VuIHsKLQkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlTMSwzODQwMCByb290ZGVsYXk9MTAgcm9vdD0vZGV2L3NkYTMiOwotCX07Ci0KIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MHgwIDB4MDgwMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL0tjb25maWcgYi9hcmNoL21pcHMvbmV0bG9naWMvS2NvbmZpZwppbmRleCA4NTJhNGVlLi40ZWI2ODNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvbmV0bG9naWMvS2NvbmZpZwpAQCAtMjgsNiArMjgsMTUgQEAKIAkgIHBvaW50ZXIgdG8gdGhlIGtlcm5lbC4gIFRoZSBjb3JyZXNwb25kaW5nIERUUyBmaWxlIGlzIGF0CiAJICBhcmNoL21pcHMvbmV0bG9naWMvZHRzL3hscF9mdnAuZHRzCiAKK2NvbmZpZyBEVF9YTFBfR1ZQCisJYm9vbCAiQnVpbHQtaW4gZGV2aWNlIHRyZWUgZm9yIFhMUCBHVlAgYm9hcmRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFkZCBhbiBGRFQgYmxvYiBmb3IgWExQIEdWUCBib2FyZCBpbnRvIHRoZSBrZXJuZWwuCisJICBUaGlzIERUQiB3aWxsIGJlIHVzZWQgaWYgdGhlIGZpcm13YXJlIGRvZXMgbm90IHBhc3MgaW4gYSBEVEIKKwkgIHBvaW50ZXIgdG8gdGhlIGtlcm5lbC4gIFRoZSBjb3JyZXNwb25kaW5nIERUUyBmaWxlIGlzIGF0CisJICBhcmNoL21pcHMvbmV0bG9naWMvZHRzL3hscF9ndnAuZHRzCisKIGNvbmZpZyBOTE1fTVVMVElOT0RFCiAJYm9vbCAiU3VwcG9ydCBmb3IgbXVsdGktY2hpcCBib2FyZHMiCiAJZGVwZW5kcyBvbiBOTE1fWExQX0JPQVJECmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL2Vhcmx5Y29ucy5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL2NvbW1vbi9lYXJseWNvbnMuYwppbmRleCAxOTAyZmEyLi43NjlmOTMwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL2Vhcmx5Y29ucy5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy9jb21tb24vZWFybHljb25zLmMKQEAgLTM3LDkgKzM3LDExIEBACiAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMvaGFsZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9jb21tb24uaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9YTFApCiAjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvaW9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC94bHAuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC91YXJ0Lmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfWExSKQogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIvaW9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL2lycS5jCmluZGV4IDFjN2UzYTEuLjVhZmM0YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL2NvbW1vbi9pcnEuYwpAQCAtMTgwLDYgKzE4MCw3IEBACiAjZW5kaWYKIH0KIAorCiB2b2lkIG5sbV9zZXR1cF9waWNfaXJxKGludCBub2RlLCBpbnQgcGljaXJxLCBpbnQgaXJxLCBpbnQgaXJ0KQogewogCXN0cnVjdCBubG1fcGljX2lycSAqcGljX2RhdGE7CkBAIC0yMDcsMzIgKzIwOCwzMiBAQAogCiBzdGF0aWMgdm9pZCBubG1faW5pdF9ub2RlX2lycXMoaW50IG5vZGUpCiB7Ci0JaW50IGksIGlydDsKLQl1aW50NjRfdCBpcnFtYXNrOwogCXN0cnVjdCBubG1fc29jX2luZm8gKm5vZGVwOworCWludCBpLCBpcnQ7CiAKIAlwcl9pbmZvKCJJbml0IElSUSBmb3Igbm9kZSAlZFxuIiwgbm9kZSk7CiAJbm9kZXAgPSBubG1fZ2V0X25vZGUobm9kZSk7Ci0JaXJxbWFzayA9IFBFUkNQVV9JUlFfTUFTSzsKKwlub2RlcC0+aXJxbWFzayA9IFBFUkNQVV9JUlFfTUFTSzsKIAlmb3IgKGkgPSBQSUNfSVJUX0ZJUlNUX0lSUTsgaSA8PSBQSUNfSVJUX0xBU1RfSVJROyBpKyspIHsKIAkJaXJ0ID0gbmxtX2lycV90b19pcnQoaSk7Ci0JCWlmIChpcnQgPT0gLTEpCisJCWlmIChpcnQgPT0gLTEpCQkvKiB1bnVzZWQgaXJxICovCiAJCQljb250aW51ZTsKLQkJbmxtX3NldHVwX3BpY19pcnEobm9kZSwgaSwgaSwgaXJ0KTsKLQkJLyogc2V0IGludGVycnVwdHMgdG8gZmlyc3QgY3B1IGluIG5vZGUgKi8KKwkJbm9kZXAtPmlycW1hc2sgfD0gMXVsbCA8PCBpOworCQlpZiAoaXJ0ID09IC0yKQkJLyogbm90IGEgZGlyZWN0IFBJQyBpcnEgKi8KKwkJCWNvbnRpbnVlOworCiAJCW5sbV9waWNfaW5pdF9pcnQobm9kZXAtPnBpY2Jhc2UsIGlydCwgaSwKLQkJCQkJbm9kZSAqIE5MTV9DUFVTX1BFUl9OT0RFLCAwKTsKLQkJaXJxbWFzayB8PSAoMXVsbCA8PCBpKTsKKwkJCQlub2RlICogbmxtX3RocmVhZHNfcGVyX25vZGUoKSwgMCk7CisJCW5sbV9zZXR1cF9waWNfaXJxKG5vZGUsIGksIGksIGlydCk7CiAJfQotCW5vZGVwLT5pcnFtYXNrID0gaXJxbWFzazsKIH0KIAogdm9pZCBubG1fc21wX2lycV9pbml0KGludCBod2NwdWlkKQogewogCWludCBub2RlLCBjcHU7CiAKLQlub2RlID0gaHdjcHVpZCAvIE5MTV9DUFVTX1BFUl9OT0RFOwotCWNwdSAgPSBod2NwdWlkICUgTkxNX0NQVVNfUEVSX05PREU7CisJbm9kZSA9IG5sbV9jcHVpZF90b19ub2RlKGh3Y3B1aWQpOworCWNwdSAgPSBod2NwdWlkICUgbmxtX3RocmVhZHNfcGVyX25vZGUoKTsKIAogCWlmIChjcHUgPT0gMCAmJiBub2RlICE9IDApCiAJCW5sbV9pbml0X25vZGVfaXJxcyhub2RlKTsKQEAgLTI1NiwxMyArMjU3LDIzIEBACiAJCXJldHVybjsKIAl9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0lfTVNJKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfWExQKQorCS8qIFBDSSBpbnRlcnJ1cHRzIG5lZWQgYSBzZWNvbmQgbGV2ZWwgZGlzcGF0Y2ggZm9yIE1TSSBiaXRzICovCisJaWYgKGkgPj0gUElDX1BDSUVfTElOS19NU0lfSVJRKDApICYmIGkgPD0gUElDX1BDSUVfTElOS19NU0lfSVJRKDMpKSB7CisJCW5sbV9kaXNwYXRjaF9tc2kobm9kZSwgaSk7CisJCXJldHVybjsKKwl9CisJaWYgKGkgPj0gUElDX1BDSUVfTVNJWF9JUlEoMCkgJiYgaSA8PSBQSUNfUENJRV9NU0lYX0lSUSgzKSkgeworCQlubG1fZGlzcGF0Y2hfbXNpeChub2RlLCBpKTsKKwkJcmV0dXJuOworCX0KKworI2VuZGlmCiAJLyogdG9wIGxldmVsIGlycSBoYW5kbGluZyAqLwogCWRvX0lSUShubG1faXJxX3RvX3hpcnEobm9kZSwgaSkpOwogfQogCiAjaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgc3RydWN0IGlycV9kb21haW4gKnhscF9waWNfZG9tYWluOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIHhscF9waWNfaXJxX2RvbWFpbl9vcHMgPSB7CiAJLnhsYXRlID0gaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsLAogfTsKQEAgLTI3MSw4ICsyODIsOSBAQAogCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKIHsKIAljb25zdCBpbnQgbl9waWNpcnFzID0gUElDX0lSVF9MQVNUX0lSUSAtIFBJQ19JUlFfQkFTRSArIDE7CisJc3RydWN0IGlycV9kb21haW4gKnhscF9waWNfZG9tYWluOwogCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0JaW50IHNvY2lkLCByZXQ7CisJaW50IHNvY2lkLCByZXQsIGJ1czsKIAogCS8qIHdlIG5lZWQgYSBoYWNrIHRvIGdldCB0aGUgUElDJ3MgU29DIGNoaXAgaWQgKi8KIAlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZyZXMpOwpAQCAtMjgwLDcgKzI5MiwzNCBAQAogCQlwcl9lcnIoIlBJQyAlczogcmVnIHByb3BlcnR5IG5vdCBmb3VuZCFcbiIsIG5vZGUtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jc29jaWQgPSAocmVzLnN0YXJ0ID4+IDE4KSAmIDB4MzsKKworCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJYnVzID0gKHJlcy5zdGFydCA+PiAyMCkgJiAweGY7CisJCWZvciAoc29jaWQgPSAwOyBzb2NpZCA8IE5MTV9OUl9OT0RFUzsgc29jaWQrKykgeworCQkJaWYgKCFubG1fbm9kZV9wcmVzZW50KHNvY2lkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChubG1fZ2V0X25vZGUoc29jaWQpLT5zb2NidXMgPT0gYnVzKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChzb2NpZCA9PSBOTE1fTlJfTk9ERVMpIHsKKwkJCXByX2VycigiUElDICVzOiBOb2RlIG1hcHBpbmcgZm9yIGJ1cyAlZCBub3QgZm91bmQhXG4iLAorCQkJCQlub2RlLT5uYW1lLCBidXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlzb2NpZCA9IChyZXMuc3RhcnQgPj4gMTgpICYgMHgzOworCQlpZiAoIW5sbV9ub2RlX3ByZXNlbnQoc29jaWQpKSB7CisJCQlwcl9lcnIoIlBJQyAlczogbm9kZSAlZCBkb2VzIG5vdCBleGlzdCFcbiIsCisJCQkJCQkJbm9kZS0+bmFtZSwgc29jaWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIW5sbV9ub2RlX3ByZXNlbnQoc29jaWQpKSB7CisJCXByX2VycigiUElDICVzOiBub2RlICVkIGRvZXMgbm90IGV4aXN0IVxuIiwgbm9kZS0+bmFtZSwgc29jaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAl4bHBfcGljX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xlZ2FjeShub2RlLCBuX3BpY2lycXMsCiAJCW5sbV9pcnFfdG9feGlycShzb2NpZCwgUElDX0lSUV9CQVNFKSwgUElDX0lSUV9CQVNFLAogCQkmeGxwX3BpY19pcnFfZG9tYWluX29wcywgTlVMTCk7CkBAIC0yODgsOCArMzI3LDcgQEAKIAkJcHJfZXJyKCJQSUMgJXM6IENyZWF0aW5nIGxlZ2FjeSBkb21haW4gZmFpbGVkIVxuIiwgbm9kZS0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwcl9pbmZvKCJOb2RlICVkOiBJUlEgZG9tYWluIGNyZWF0ZWQgZm9yIFBJQ0AlcGFcbiIsIHNvY2lkLAotCQkJCQkJCSZyZXMuc3RhcnQpOworCXByX2luZm8oIk5vZGUgJWQ6IElSUSBkb21haW4gY3JlYXRlZCBmb3IgUElDQCVwUlxuIiwgc29jaWQsICZyZXMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3Jlc2V0LlMgYi9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3Jlc2V0LlMKaW5kZXggYWRiMTgyOC4uYjIzMWZlMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL2NvbW1vbi9yZXNldC5TCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy9jb21tb24vcmVzZXQuUwpAQCAtMzIsMTAgKzMyLDEwIEBACiAgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZW9wcy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgpAQCAtNTAsOCArNTAsOCBAQAogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHAtaGFsL2NwdWNvbnRyb2wuaD4KIAogI2RlZmluZSBDUDBfRUJBU0UJJDE1Ci0jZGVmaW5lIFNZU19DUFVfQ09IRVJFTlRfQkFTRShub2RlKQlDS1NFRzFBRERSKFhMUF9ERUZBVUxUX0lPX0JBU0UpICsgXAotCQkJWExQX0lPX1NZU19PRkZTRVQobm9kZSkgKyBYTFBfSU9fUENJX0hEUlNaICsgXAorI2RlZmluZSBTWVNfQ1BVX0NPSEVSRU5UX0JBU0UJQ0tTRUcxQUREUihYTFBfREVGQVVMVF9JT19CQVNFKSArIFwKKwkJCVhMUF9JT19TWVNfT0ZGU0VUKDApICsgWExQX0lPX1BDSV9IRFJTWiArIFwKIAkJCVNZU19DUFVfTk9OQ09IRVJFTlRfTU9ERSAqIDQKIAogLyogRW5hYmxlIFhMUCBmZWF0dXJlcyBhbmQgd29ya2Fyb3VuZHMgaW4gdGhlIExTVSAqLwpAQCAtNzQsMzUgKzc0LDU1IEBACiAuZW5kbQogCiAvKgotICogTG93IGxldmVsIGZsdXNoIGZvciBMMUQgY2FjaGUgb24gWExQLCB0aGUgbm9ybWFsIGNhY2hlIG9wcyBkb2VzCi0gKiBub3QgZG8gdGhlIGNvbXBsZXRlIGFuZCBjb3JyZWN0IGNhY2hlIGZsdXNoLgorICogTDFEIGNhY2hlIGhhcyB0byBiZSBmbHVzaGVkIGJlZm9yZSBlbmFibGluZyB0aHJlYWRzIGluIFhMUC4KKyAqIE9uIFhMUDh4eC9YTFAzeHgsIHdlIGRvIGEgbG93IGxldmVsIGZsdXNoIHVzaW5nIHByb2Nlc3NvciBjb250cm9sCisgKiByZWdpc3RlcnMuIE9uIFhMUElJIENQVXMsIHVzdWFsIGNhY2hlIGluc3RydWN0aW9ucyB3b3JrLgogICovCiAubWFjcm8JeGxwX2ZsdXNoX2wxX2RjYWNoZQorCW1mYzAJdDAsIENQMF9FQkFTRSwgMAorCWFuZGkJdDAsIHQwLCAweGZmMDAKKwlzbHQJdDEsIHQwLCAweDEyMDAKKwliZXF6CXQxLCAxNWYKKwlub3AKKworCS8qIFhMUDh4eCBsb3cgbGV2ZWwgY2FjaGUgZmx1c2ggKi8KIAlsaQl0MCwgTFNVX0RFQlVHX0RBVEEwCiAJbGkJdDEsIExTVV9ERUJVR19BRERSCiAJbGkJdDIsIDAJCS8qIGluZGV4ICovCiAJbGkJdDMsIDB4MTAwMAkvKiBsb29wIGNvdW50ICovCi0xOgorMTE6CiAJc2xsCXYwLCB0MiwgNQogCW10Y3IJemVybywgdDAKIAlvcmkJdjEsIHYwLCAweDMJLyogd2F5MCB8IHdyaXRlX2VuYWJsZSB8IHdyaXRlX2FjdGl2ZSAqLwogCW10Y3IJdjEsIHQxCi0yOgorMTI6CiAJbWZjcgl2MSwgdDEKIAlhbmRpCXYxLCAweDEJCS8qIHdhaXQgZm9yIHdyaXRlX2FjdGl2ZSA9PSAwICovCi0JYm5legl2MSwgMmIKKwlibmV6CXYxLCAxMmIKIAlub3AKIAltdGNyCXplcm8sIHQwCiAJb3JpCXYxLCB2MCwgMHg3CS8qIHdheTEgfCB3cml0ZV9lbmFibGUgfCB3cml0ZV9hY3RpdmUgKi8KIAltdGNyCXYxLCB0MQotMzoKKzEzOgogCW1mY3IJdjEsIHQxCiAJYW5kaQl2MSwgMHgxCQkvKiB3YWl0IGZvciB3cml0ZV9hY3RpdmUgPT0gMCAqLwotCWJuZXoJdjEsIDNiCisJYm5legl2MSwgMTNiCiAJbm9wCiAJYWRkaQl0MiwgMQotCWJuZQl0MywgdDIsIDFiCisJYm5lCXQzLCB0MiwgMTFiCiAJbm9wCisJYgkxN2YKKwlub3AKKworCS8qIFhMUElJIENQVXMsIEludmFsaWRhdGUgYWxsIDY0ayBvZiBMMSBELWNhY2hlICovCisxNToKKwlsaQl0MCwgMHg4MDAwMDAwMAorCWxpCXQxLCAweDgwMDEwMDAwCisxNjoJY2FjaGUJSW5kZXhfV3JpdGViYWNrX0ludl9ELCAwKHQwKQorCWFkZGl1CXQwLCB0MCwgMzIKKwlibmUJdDAsIHQxLCAxNmIKKwlub3AKKzE3OgogLmVuZG0KIAogLyoKQEAgLTEzOCw2ICsxNTgsMTMgQEAKIAlub3AKIAogMToJLyogRW50cnkgcG9pbnQgb24gY29yZSB3YWtldXAgKi8KKwltZmMwCXQwLCBDUDBfRUJBU0UsIDAJLyogcHJvY2Vzc29yIElEICovCisJYW5kaQl0MCwgMHhmZjAwCisJbGkJdDEsIDB4MTUwMAkJLyogWExQIDl4eCAqLworCWJlcQl0MCwgdDEsIDJmCQkvKiBkb2VzIG5vdCBuZWVkIHRvIHNldCBjb2hlcmVudCAqLworCW5vcAorCisJLyogc2V0IGJpdCBpbiBTWVMgY29oZXJlbnQgcmVnaXN0ZXIgZm9yIHRoZSBjb3JlICovCiAJbWZjMAl0MCwgQ1AwX0VCQVNFLCAxCiAJbWZjMAl0MSwgQ1AwX0VCQVNFLCAxCiAJc3JsCXQxLCA1CkBAIC0xNDksNyArMTc2LDcgQEAKIAlsaQl0MSwgMHgxCiAJc2xsCXQwLCB0MSwgdDAKIAlub3IJdDAsIHQwLCB6ZXJvCQkvKiB0MCA8LSB+KDEgPDwgY29yZSkgKi8KLQlsaQl0MiwgU1lTX0NQVV9DT0hFUkVOVF9CQVNFKDApCisJbGkJdDIsIFNZU19DUFVfQ09IRVJFTlRfQkFTRQogCWFkZAl0MiwgdDIsIHQzCQkvKiB0MiA8LSBTWVMgb2Zmc2V0IGZvciBub2RlICovCiAJbHcJdDEsIDAodDIpCiAJYW5kCXQxLCB0MSwgdDAKQEAgLTE1OSwxMyArMTg2LDEzIEBACiAJbHcJdDEsIDAodDIpCiAJc3luYwogCisyOgogCS8qIENvbmZpZ3VyZSBMU1Ugb24gTm9uLTAgQ29yZXMuICovCiAJeGxwX2NvbmZpZ19sc3UKIAkvKiBGQUxMIFRIUk9VR0ggKi8KIAogLyoKLSAqIFdha2UgdXAgc2libGluZyB0aHJlYWRzIGZyb20gdGhlIGluaXRpYWwgdGhyZWFkIGluCi0gKiBhIGNvcmUuCisgKiBXYWtlIHVwIHNpYmxpbmcgdGhyZWFkcyBmcm9tIHRoZSBpbml0aWFsIHRocmVhZCBpbiBhIGNvcmUuCiAgKi8KIEVYUE9SVChubG1fYm9vdF9zaWJsaW5ncykKIAkvKiBjb3JlIEwxRCBmbHVzaCBiZWZvcmUgZW5hYmxlIHRocmVhZHMgKi8KQEAgLTE4MSw4ICsyMDgsMTAgQEAKIAkvKgogCSAqIFRoZSBuZXcgaGFyZHdhcmUgdGhyZWFkIHN0YXJ0cyBhdCB0aGUgbmV4dCBpbnN0cnVjdGlvbgogCSAqIEZvciBhbGwgdGhlIGNhc2VzIG90aGVyIHRoYW4gY29yZSAwIHRocmVhZCAwLCB3ZSB3aWxsCi0JKiBqdW1wIHRvIHRoZSBzZWNvbmRhcnkgd2FpdCBmdW5jdGlvbi4KLQkqLworCSAqIGp1bXAgdG8gdGhlIHNlY29uZGFyeSB3YWl0IGZ1bmN0aW9uLgorCisJICogTk9URTogQWxsIEdQUiBjb250ZW50cyBhcmUgbG9zdCBhZnRlciB0aGUgbXRjciBhYm92ZSEKKwkgKi8KIAltZmMwCXYwLCBDUDBfRUJBU0UsIDEKIAlhbmRpCXYwLCAweDNmZgkJLyogdjAgPC0gbm9kZS9jb3JlICovCiAKQEAgLTE5Niw3ICsyMjUsNyBAQAogI2VuZGlmCiAJbXRjMAl0MSwgQ1AwX1NUQVRVUwogCi0JLyogbWFyayBDUFUgcmVhZHksIGNhcmVmdWwgaGVyZSwgcHJldmlvdXMgbXRjciB0cmFzaGVkIHJlZ2lzdGVycyAqLworCS8qIG1hcmsgQ1BVIHJlYWR5ICovCiAJbGkJdDMsIENLU0VHMUFERFIoUkVTRVRfREFUQV9QSFlTKQogCUFERElVCXQxLCB0MywgQk9PVF9DUFVfUkVBRFkKIAlzbGwJdjEsIHYwLCAyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3NtcC5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL2NvbW1vbi9zbXAuYwppbmRleCBjMGVkZWQwLi42YmFhZTE1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy9jb21tb24vc21wLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAl1aW50NjRfdCBwaWNiYXNlOwogCiAJY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKGxvZ2ljYWxfY3B1KTsKLQlub2RlID0gY3B1IC8gTkxNX0NQVVNfUEVSX05PREU7CisJbm9kZSA9IG5sbV9jcHVpZF90b19ub2RlKGNwdSk7CiAJcGljYmFzZSA9IG5sbV9nZXRfbm9kZShub2RlKS0+cGljYmFzZTsKIAogCWlmIChhY3Rpb24gJiBTTVBfQ0FMTF9GVU5DVElPTikKQEAgLTE1Miw3ICsxNTIsNyBAQAogCWludCBjcHUsIG5vZGU7CiAKIAljcHUgPSBjcHVfbG9naWNhbF9tYXAobG9naWNhbF9jcHUpOwotCW5vZGUgPSBjcHUgLyBOTE1fQ1BVU19QRVJfTk9ERTsKKwlub2RlID0gbmxtX2NwdWlkX3RvX25vZGUobG9naWNhbF9jcHUpOwogCW5sbV9uZXh0X3NwID0gKHVuc2lnbmVkIGxvbmcpX19LU1RLX1RPUyhpZGxlKTsKIAlubG1fbmV4dF9ncCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogdm9pZCBfX2luaXQgbmxtX3NtcF9zZXR1cCh2b2lkKQogewogCXVuc2lnbmVkIGludCBib290X2NwdTsKLQlpbnQgbnVtX2NwdXMsIGksIG5jb3JlOworCWludCBudW1fY3B1cywgaSwgbmNvcmUsIG5vZGU7CiAJdm9sYXRpbGUgdTMyICpjcHVfcmVhZHkgPSBubG1fZ2V0X2Jvb3RfZGF0YShCT09UX0NQVV9SRUFEWSk7CiAJY2hhciBidWZbNjRdOwogCkBAIC0xODcsNiArMTg3LDggQEAKIAkJCV9fY3B1X251bWJlcl9tYXBbaV0gPSBudW1fY3B1czsKIAkJCV9fY3B1X2xvZ2ljYWxfbWFwW251bV9jcHVzXSA9IGk7CiAJCQlzZXRfY3B1X3Bvc3NpYmxlKG51bV9jcHVzLCB0cnVlKTsKKwkJCW5vZGUgPSBubG1fY3B1aWRfdG9fbm9kZShpKTsKKwkJCWNwdW1hc2tfc2V0X2NwdShudW1fY3B1cywgJm5sbV9nZXRfbm9kZShub2RlKS0+Y3B1bWFzayk7CiAJCQkrK251bV9jcHVzOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL2NvbW1vbi9zbXBib290LlMgYi9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3NtcGJvb3QuUwppbmRleCBhYTZjZmYwLi44NTk3NjU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3NtcGJvb3QuUworKysgYi9hcmNoL21pcHMvbmV0bG9naWMvY29tbW9uL3NtcGJvb3QuUwpAQCAtMzIsNyArMzIsNiBAQAogICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KQEAgLTk4LDcgKzk3LDcgQEAKICAqIEluIGNhc2Ugb2YgUk1JYm9vdCBib290bG9hZGVyIHdoaWNoIGlzIHVzZWQgb24gWExSIGJvYXJkcywgdGhlIENQVXMKICAqIGJlIGFscmVhZHkgd29rZW4gdXAgYW5kIHdhaXRpbmcgaW4gYm9vdGxvYWRlciBjb2RlLgogICogVGhpcyB3aWxsIGdldCB0aGVtIG91dCBvZiB0aGUgYm9vdGxvYWRlciBjb2RlIGFuZCBpbnRvIGxpbnV4LiBOZWVkZWQKLSAqICBiZWNhdXNlIHRoZSBib290bG9hZGVyIGFyZWEgd2lsbCBiZSB0YWtlbiBhbmQgaW5pdGlhbGl6ZWQgYnkgbGludXguCisgKiBiZWNhdXNlIHRoZSBib290bG9hZGVyIGFyZWEgd2lsbCBiZSB0YWtlbiBhbmQgaW5pdGlhbGl6ZWQgYnkgbGludXguCiAgKi8KIE5FU1RFRChubG1fcm1pYm9vdF9wcmVib290LCAxNiwgc3ApCiAJbWZjMAl0MCwgJDE1LCAxCS8qIHJlYWQgZWJhc2UgKi8KQEAgLTEzMyw2ICsxMzIsNyBAQAogCW9yCXQxLCB0MiwgdjEJLyogcHV0IGluIG5ldyB2YWx1ZSAqLwogCW10Y3IJdDEsIHQwCQkvKiB1cGRhdGUgY29yZSBjb250cm9sICovCiAKKwkvKiB3YWl0IGZvciBOTUkgdG8gaGl0ICovCiAxOgl3YWl0CiAJYgkxYgogCW5vcApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL2R0cy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9uZXRsb2dpYy9kdHMvTWFrZWZpbGUKaW5kZXggMGI5YmU1Zi4uMjVjOGU4NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL2R0cy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbmV0bG9naWMvZHRzL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLSQoQ09ORklHX0RUX1hMUF9FVlApIDo9IHhscF9ldnAuZHRiLm8KIG9iai0kKENPTkZJR19EVF9YTFBfU1ZQKSArPSB4bHBfc3ZwLmR0Yi5vCiBvYmotJChDT05GSUdfRFRfWExQX0ZWUCkgKz0geGxwX2Z2cC5kdGIubworb2JqLSQoQ09ORklHX0RUX1hMUF9HVlApICs9IHhscF9ndnAuZHRiLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy9kdHMveGxwX2d2cC5kdHMgYi9hcmNoL21pcHMvbmV0bG9naWMvZHRzL3hscF9ndnAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0N2QyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMvZHRzL3hscF9ndnAuZHRzCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBYTFA5WFggRGV2aWNlIFRyZWUgU291cmNlIGZvciBHVlAgYm9hcmRzCisgKi8KKworL2R0cy12MS87CisvIHsKKwltb2RlbCA9ICJuZXRsb2dpYyxYTFAtR1ZQIjsKKwljb21wYXRpYmxlID0gIm5ldGxvZ2ljLHhscCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisKKwlzb2MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwwIDAgIDAgMHgxODAwMDAwMCAgMHgwNDAwMDAwMCAgIC8vIFBDSWUgQ0ZHCisJCQkgIDEgMCAgMCAweDE2MDAwMDAwICAweDAyMDAwMDAwPjsgLy8gR0JVIGNoaXBzZWxlY3RzCisKKwkJc2VyaWFsMDogc2VyaWFsQDMwMDAwIHsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDAgMHgxMTIxMDAgMHhhMDA+OworCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEyNTAwMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCQkJaW50ZXJydXB0cyA9IDwxNz47CisJCX07CisJCXBpYzogcGljQDQwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MCAweDExMDAwMCAweDIwMD47CisJCX07CisKKwkJbm9yX2ZsYXNoQDEsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCXJlZyA9IDwxIDAgMHgxMDAwMDAwPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCWxhYmVsID0gIngtbG9hZGVyIjsKKwkJCQlyZWcgPSA8MHgwIDB4MTAwMDAwPjsgLyogMU0gKi8KKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMTAwMDAwIHsKKwkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCXJlZyA9IDwweDEwMDAwMCAweDEwMDAwMD47IC8qIDFNICovCisJCQl9OworCisJCQlwYXJ0aXRpb25AMjAwMDAwIHsKKwkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCXJlZyA9IDwweDIwMDAwMCAweDUwMDAwMD47IC8qIDVNICovCisJCQl9OworCisJCQlwYXJ0aXRpb25ANzAwMDAwIHsKKwkJCQlsYWJlbCA9ICJyb290ZnMiOworCQkJCXJlZyA9IDwweDcwMDAwMCAweDgwMDAwMD47IC8qIDhNICovCisJCQl9OworCisJCQlwYXJ0aXRpb25AZjAwMDAwIHsKKwkJCQlsYWJlbCA9ICJlbnYiOworCQkJCXJlZyA9IDwweGYwMDAwMCAweDEwMDAwMD47IC8qIDFNICovCisJCQkJcmVhZC1vbmx5OworCQkJfTsKKwkJfTsKKworCX07CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJjb25zb2xlPXR0eVMwLDExNTIwMCByZGluaXQ9L3NiaW4vaW5pdCI7CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxwL2R0LmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxwL2R0LmMKaW5kZXggODMxNmQ1NC4uNTc1NDA5NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL3hscC9kdC5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvZHQuYwpAQCAtNDIsMTMgKzQyLDE4IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogZXh0ZXJuIHUzMiBfX2R0Yl94bHBfZXZwX2JlZ2luW10sIF9fZHRiX3hscF9zdnBfYmVnaW5bXSwKLQlfX2R0Yl94bHBfZnZwX2JlZ2luW10sIF9fZHRiX3N0YXJ0W107CisJX19kdGJfeGxwX2Z2cF9iZWdpbltdLCBfX2R0Yl94bHBfZ3ZwX2JlZ2luW10sIF9fZHRiX3N0YXJ0W107CiBzdGF0aWMgdm9pZCAqeGxwX2ZkdF9ibG9iOwogCiB2b2lkIF9faW5pdCAqeGxwX2R0X2luaXQodm9pZCAqZmR0cCkKIHsKIAlpZiAoIWZkdHApIHsKIAkJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLnByb2Nlc3Nvcl9pZCAmIDB4ZmYwMCkgeworI2lmZGVmIENPTkZJR19EVF9YTFBfR1ZQCisJCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExQOVhYOgorCQkJZmR0cCA9IF9fZHRiX3hscF9ndnBfYmVnaW47CisJCQlicmVhazsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19EVF9YTFBfRlZQCiAJCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExQMlhYOgogCQkJZmR0cCA9IF9fZHRiX3hscF9mdnBfYmVnaW47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxwL25sbV9oYWwuYyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvbmxtX2hhbC5jCmluZGV4IDU2YzUwYmEuLjk5N2NkOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvbmxtX2hhbC5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvbmxtX2hhbC5jCkBAIC01Nyw2ICs1NywxMCBAQAogCW5vZGVwLT5zeXNiYXNlID0gbmxtX2dldF9zeXNfcmVnYmFzZShub2RlKTsKIAlub2RlcC0+cGljYmFzZSA9IG5sbV9nZXRfcGljX3JlZ2Jhc2Uobm9kZSk7CiAJbm9kZXAtPmViYXNlID0gcmVhZF9jMF9lYmFzZSgpICYgKH4oKDEgPDwgMTIpIC0gMSkpOworCWlmIChjcHVfaXNfeGxwOXh4KCkpCisJCW5vZGVwLT5zb2NidXMgPSB4bHA5eHhfZ2V0X3NvY2J1cyhub2RlKTsKKwllbHNlCisJCW5vZGVwLT5zb2NidXMgPSAwOwogCXNwaW5fbG9ja19pbml0KCZub2RlcC0+cGljbG9jayk7CiB9CiAKQEAgLTY1LDYgKzY5LDI2IEBACiAJdWludDY0X3QgcGNpYmFzZTsKIAlpbnQgZGV2b2ZmLCBpcnQ7CiAKKwkvKiBieXBhc3MgZm9yIDl4eCAqLworCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSBQSUNfOVhYX1hIQ0lfMF9JUlE6CisJCQlyZXR1cm4gMTE0OworCQljYXNlIFBJQ185WFhfWEhDSV8xX0lSUToKKwkJCXJldHVybiAxMTU7CisJCWNhc2UgUElDX1VBUlRfMF9JUlE6CisJCQlyZXR1cm4gMTMzOworCQljYXNlIFBJQ19VQVJUXzFfSVJROgorCQkJcmV0dXJuIDEzNDsKKwkJY2FzZSBQSUNfUENJRV9MSU5LX0xFR0FDWV9JUlEoMCk6CisJCWNhc2UgUElDX1BDSUVfTElOS19MRUdBQ1lfSVJRKDEpOgorCQljYXNlIFBJQ19QQ0lFX0xJTktfTEVHQUNZX0lSUSgyKToKKwkJY2FzZSBQSUNfUENJRV9MSU5LX0xFR0FDWV9JUlEoMyk6CisJCQlyZXR1cm4gMTkxICsgaXJxIC0gUElDX1BDSUVfTElOS19MRUdBQ1lfSVJRX0JBU0U7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwogCWRldm9mZiA9IDA7CiAJc3dpdGNoIChpcnEpIHsKIAljYXNlIFBJQ19VQVJUXzBfSVJROgpAQCAtMTM1LDkgKzE1OSwxNyBAQAogCQljYXNlIFBJQ19JMkNfM19JUlE6CiAJCQlpcnQgPSBpcnQgKyAzOyBicmVhazsKIAkJfQotCX0gZWxzZSBpZiAoaXJxID49IFBJQ19QQ0lFX0xJTktfMF9JUlEgJiYgaXJxIDw9IFBJQ19QQ0lFX0xJTktfM19JUlEpIHsKKwl9IGVsc2UgaWYgKGlycSA+PSBQSUNfUENJRV9MSU5LX0xFR0FDWV9JUlEoMCkgJiYKKwkJCWlycSA8PSBQSUNfUENJRV9MSU5LX0xFR0FDWV9JUlEoMykpIHsKIAkJLyogSFcgYnVnLCBQQ0kgSVJUIGVudHJpZXMgYXJlIGJhZCBvbiBlYXJseSBzaWxpY29uLCBmaXggKi8KLQkJaXJ0ID0gUElDX0lSVF9QQ0lFX0xJTktfSU5ERVgoaXJxIC0gUElDX1BDSUVfTElOS18wX0lSUSk7CisJCWlydCA9IFBJQ19JUlRfUENJRV9MSU5LX0lOREVYKGlycSAtCisJCQkJCVBJQ19QQ0lFX0xJTktfTEVHQUNZX0lSUV9CQVNFKTsKKwl9IGVsc2UgaWYgKGlycSA+PSBQSUNfUENJRV9MSU5LX01TSV9JUlEoMCkgJiYKKwkJCWlycSA8PSBQSUNfUENJRV9MSU5LX01TSV9JUlEoMykpIHsKKwkJaXJ0ID0gLTI7CisJfSBlbHNlIGlmIChpcnEgPj0gUElDX1BDSUVfTVNJWF9JUlEoMCkgJiYKKwkJCWlycSA8PSBQSUNfUENJRV9NU0lYX0lSUSgzKSkgeworCQlpcnQgPSAtMjsKIAl9IGVsc2UgewogCQlpcnQgPSAtMTsKIAl9CkBAIC0xNTEsNyArMTgzLDEwIEBACiAJdWludDY0X3QgbnVtLCBzeXNiYXNlOwogCiAJc3lzYmFzZSA9IG5sbV9nZXRfbm9kZShub2RlKS0+c3lzYmFzZTsKLQlyc3R2YWwgPSBubG1fcmVhZF9zeXNfcmVnKHN5c2Jhc2UsIFNZU19QT1dFUl9PTl9SRVNFVF9DRkcpOworCWlmIChjcHVfaXNfeGxwOXh4KCkpCisJCXJzdHZhbCA9IG5sbV9yZWFkX3N5c19yZWcoc3lzYmFzZSwgU1lTXzlYWF9QT1dFUl9PTl9SRVNFVF9DRkcpOworCWVsc2UKKwkJcnN0dmFsID0gbmxtX3JlYWRfc3lzX3JlZyhzeXNiYXNlLCBTWVNfUE9XRVJfT05fUkVTRVRfQ0ZHKTsKIAlpZiAoY3B1X2lzX3hscGlpKCkpIHsKIAkJbnVtID0gMTAwMDAwMFVMTCAqICg0MDAgKiAzICsgMTAwICogKHJzdHZhbCA+PiAyNikpOwogCQlkZW5vbSA9IDM7CkBAIC0yNjUsNiArMzAwLDEwIEBACiAKIHVuc2lnbmVkIGludCBubG1fZ2V0X3BpY19mcmVxdWVuY3koaW50IG5vZGUpCiB7CisJLyogVE9ETyBIYXMgdG8gY2FsY3VsYXRlIGZyZXEgYXMgbGlrZSAyeHggKi8KKwlpZiAoY3B1X2lzX3hscDl4eCgpKQorCQlyZXR1cm4gMjUwMDAwMDAwOworCiAJaWYgKGNwdV9pc194bHBpaSgpKQogCQlyZXR1cm4gbmxtXzJ4eF9nZXRfcGljX2ZyZXF1ZW5jeShub2RlKTsKIAllbHNlCkBAIC0yODQsMjEgKzMyMywzMyBAQAogewogCXVpbnQ2NF90IGJyaWRnZWJhc2UsIGJhc2UsIGxpbTsKIAl1aW50MzJfdCB2YWw7CisJdW5zaWduZWQgaW50IGJhcnJlZywgbGltcmVnLCB4bGF0cmVnOwogCWludCBpLCBub2RlLCBydjsKIAogCS8qIExvb2sgb25seSBhdCBtYXBwaW5nIG9uIE5vZGUgMCwgd2UgZG9uJ3QgaGFuZGxlIGNyYXp5IGNvbmZpZ3MgKi8KIAlicmlkZ2ViYXNlID0gbmxtX2dldF9icmlkZ2VfcmVnYmFzZSgwKTsKIAlydiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQl2YWwgPSBubG1fcmVhZF9icmlkZ2VfcmVnKGJyaWRnZWJhc2UsCi0JCQkJCUJSSURHRV9EUkFNX05PREVfVFJBTlNMTihpKSk7Ci0JCW5vZGUgPSAodmFsID4+IDEpICYgMHgzOwotCQlpZiAobiA+PSAwICYmIG4gIT0gbm9kZSkKLQkJCWNvbnRpbnVlOwotCQl2YWwgPSBubG1fcmVhZF9icmlkZ2VfcmVnKGJyaWRnZWJhc2UsIEJSSURHRV9EUkFNX0JBUihpKSk7CisJCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJCWJhcnJlZyA9IEJSSURHRV85WFhfRFJBTV9CQVIoaSk7CisJCQlsaW1yZWcgPSBCUklER0VfOVhYX0RSQU1fTElNSVQoaSk7CisJCQl4bGF0cmVnID0gQlJJREdFXzlYWF9EUkFNX05PREVfVFJBTlNMTihpKTsKKwkJfSBlbHNlIHsKKwkJCWJhcnJlZyA9IEJSSURHRV9EUkFNX0JBUihpKTsKKwkJCWxpbXJlZyA9IEJSSURHRV9EUkFNX0xJTUlUKGkpOworCQkJeGxhdHJlZyA9IEJSSURHRV9EUkFNX05PREVfVFJBTlNMTihpKTsKKwkJfQorCQlpZiAobiA+PSAwKSB7CisJCQkvKiBub2RlIHNwZWNpZmllZCwgZ2V0IG5vZGUgbWFwcGluZyBvZiBCQVIgKi8KKwkJCXZhbCA9IG5sbV9yZWFkX2JyaWRnZV9yZWcoYnJpZGdlYmFzZSwgeGxhdHJlZyk7CisJCQlub2RlID0gKHZhbCA+PiAxKSAmIDB4MzsKKwkJCWlmIChuICE9IG5vZGUpCisJCQkJY29udGludWU7CisJCX0KKwkJdmFsID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhicmlkZ2ViYXNlLCBiYXJyZWcpOwogCQl2YWwgPSAodmFsID4+ICAxMikgJiAweGZmZmZmOwogCQliYXNlID0gKHVpbnQ2NF90KSB2YWwgPDwgMjA7Ci0JCXZhbCA9IG5sbV9yZWFkX2JyaWRnZV9yZWcoYnJpZGdlYmFzZSwgQlJJREdFX0RSQU1fTElNSVQoaSkpOworCQl2YWwgPSBubG1fcmVhZF9icmlkZ2VfcmVnKGJyaWRnZWJhc2UsIGxpbXJlZyk7CiAJCXZhbCA9ICh2YWwgPj4gIDEyKSAmIDB4ZmZmZmY7CiAJCWlmICh2YWwgPT0gMCkgICAvKiBCQVIgbm90IHVzZWQgKi8KIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hscC9zZXR1cC5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hscC9zZXR1cC5jCmluZGV4IDU0ZTc1YzcuLjhjNjBhMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxwL3NldHVwLmMKQEAgLTUxLDEyICs1MSwxNiBAQAogc3RydWN0IG5sbV9zb2NfaW5mbyBubG1fbm9kZXNbTkxNX05SX05PREVTXTsKIGNwdW1hc2tfdCBubG1fY3B1bWFzayA9IENQVV9NQVNLX0NQVTA7CiB1bnNpZ25lZCBpbnQgbmxtX3RocmVhZHNfcGVyX2NvcmU7Cit1bnNpZ25lZCBpbnQgeGxwX2NvcmVzX3Blcl9ub2RlOwogCiBzdGF0aWMgdm9pZCBubG1fbGludXhfZXhpdCh2b2lkKQogewogCXVpbnQ2NF90IHN5c2Jhc2UgPSBubG1fZ2V0X25vZGUoMCktPnN5c2Jhc2U7CiAKLQlubG1fd3JpdGVfc3lzX3JlZyhzeXNiYXNlLCBTWVNfQ0hJUF9SRVNFVCwgMSk7CisJaWYgKGNwdV9pc194bHA5eHgoKSkKKwkJbmxtX3dyaXRlX3N5c19yZWcoc3lzYmFzZSwgU1lTXzlYWF9DSElQX1JFU0VULCAxKTsKKwllbHNlCisJCW5sbV93cml0ZV9zeXNfcmVnKHN5c2Jhc2UsIFNZU19DSElQX1JFU0VULCAxKTsKIAlmb3IgKCA7IDsgKQogCQljcHVfd2FpdCgpOwogfQpAQCAtOTIsNiArOTYsMTQgQEAKIAogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU01QCisJbmxtX3dha2V1cF9zZWNvbmRhcnlfY3B1cygpOworCisJLyogdXBkYXRlIFRMQiBzaXplIGFmdGVyIHdha2luZyB1cCB0aHJlYWRzICovCisJY3VycmVudF9jcHVfZGF0YS50bGJzaXplID0gKChyZWFkX2MwX2NvbmZpZzYoKSA+PiAxNikgJiAweGZmZmYpICsgMTsKKworCXJlZ2lzdGVyX3NtcF9vcHMoJm5sbV9zbXBfb3BzKTsKKyNlbmRpZgogCV9tYWNoaW5lX3Jlc3RhcnQgPSAodm9pZCAoKikoY2hhciAqKSlubG1fbGludXhfZXhpdDsKIAlfbWFjaGluZV9oYWx0CT0gbmxtX2xpbnV4X2V4aXQ7CiAJcG1fcG93ZXJfb2ZmCT0gbmxtX2xpbnV4X2V4aXQ7CkBAIC0xMTAsNiArMTIyLDcgQEAKIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewogCXN3aXRjaCAocmVhZF9jMF9wcmlkKCkgJiAweGZmMDApIHsKKwljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUDlYWDoKIAljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUDJYWDoKIAkJcmV0dXJuICJCcm9hZGNvbSBYTFBJSSBTZXJpZXMiOwogCWRlZmF1bHQ6CkBAIC0xNDksNiArMTYyLDEwIEBACiAJdm9pZCAqcmVzZXRfdmVjOwogCiAJbmxtX2lvX2Jhc2UgPSBDS1NFRzFBRERSKFhMUF9ERUZBVUxUX0lPX0JBU0UpOworCWlmIChjcHVfaXNfeGxwOXh4KCkpCisJCXhscF9jb3Jlc19wZXJfbm9kZSA9IDMyOworCWVsc2UKKwkJeGxwX2NvcmVzX3Blcl9ub2RlID0gODsKIAlubG1faW5pdF9ib290X2NwdSgpOwogCXhscF9tbXVfaW5pdCgpOwogCW5sbV9ub2RlX2luaXQoMCk7CkBAIC0xNjIsMTEgKzE3OSw1IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJY3B1bWFza19zZXRhbGwoJm5sbV9jcHVtYXNrKTsKLQlubG1fd2FrZXVwX3NlY29uZGFyeV9jcHVzKCk7Ci0KLQkvKiB1cGRhdGUgVExCIHNpemUgYWZ0ZXIgd2FraW5nIHVwIHRocmVhZHMgKi8KLQljdXJyZW50X2NwdV9kYXRhLnRsYnNpemUgPSAoKHJlYWRfYzBfY29uZmlnNigpID4+IDE2KSAmIDB4ZmZmZikgKyAxOwotCi0JcmVnaXN0ZXJfc21wX29wcygmbmxtX3NtcF9vcHMpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxwL3VzYi1pbml0LXhscDIuYyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvdXNiLWluaXQteGxwMi5jCmluZGV4IDM2ZTljMjIuLjE3YWRlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvdXNiLWluaXQteGxwMi5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvdXNiLWluaXQteGxwMi5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCkBAIC04MywxMiArODQsMTQgQEAKICNkZWZpbmUgbmxtX3JlYWRfdXNiX3JlZyhiLCByKQkJbmxtX3JlYWRfcmVnKGIsIHIpCiAjZGVmaW5lIG5sbV93cml0ZV91c2JfcmVnKGIsIHIsIHYpCW5sbV93cml0ZV9yZWcoYiwgciwgdikKIAotI2RlZmluZSBubG1feGxwaWlfZ2V0X3VzYl9wY2liYXNlKG5vZGUsIGluc3QpCQlcCi0JbmxtX3BjaWNmZ19iYXNlKFhMUDJYWF9JT19VU0JfT0ZGU0VUKG5vZGUsIGluc3QpKQorI2RlZmluZSBubG1feGxwaWlfZ2V0X3VzYl9wY2liYXNlKG5vZGUsIGluc3QpCQkJXAorCQkJbmxtX3BjaWNmZ19iYXNlKGNwdV9pc194bHA5eHgoKSA/CVwKKwkJCVhMUDlYWF9JT19VU0JfT0ZGU0VUKG5vZGUsIGluc3QpIDoJXAorCQkJWExQMlhYX0lPX1VTQl9PRkZTRVQobm9kZSwgaW5zdCkpCiAjZGVmaW5lIG5sbV94bHBpaV9nZXRfdXNiX3JlZ2Jhc2Uobm9kZSwgaW5zdCkJCVwKIAkobmxtX3hscGlpX2dldF91c2JfcGNpYmFzZShub2RlLCBpbnN0KSArIFhMUF9JT19QQ0lfSERSU1opCiAKLXN0YXRpYyB2b2lkIHhscGlpX3VzYl9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQorc3RhdGljIHZvaWQgeGxwMnh4X3VzYl9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewogCXU2NCBwb3J0X2FkZHI7CiAKQEAgLTEwOSw2ICsxMTIsMjkgQEAKIAlubG1fd3JpdGVfdXNiX3JlZyhwb3J0X2FkZHIsIFhMUElJX1VTQjNfSU5UX1JFRywgMHhmZmZmZmZmZik7CiB9CiAKK3N0YXRpYyB2b2lkIHhscDl4eF91c2JfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1NjQgcG9ydF9hZGRyOworCWludCBub2RlLCBpcnE7CisKKwkvKiBGaW5kIHRoZSBub2RlIGFuZCBpcnEgb24gdGhlIG5vZGUgKi8KKwlpcnEgPSBkYXRhLT5pcnEgJSBOTE1fSVJRU19QRVJfTk9ERTsKKwlub2RlID0gZGF0YS0+aXJxIC8gTkxNX0lSUVNfUEVSX05PREU7CisKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgUElDXzlYWF9YSENJXzBfSVJROgorCQlwb3J0X2FkZHIgPSBubG1feGxwaWlfZ2V0X3VzYl9yZWdiYXNlKG5vZGUsIDEpOworCQlicmVhazsKKwljYXNlIFBJQ185WFhfWEhDSV8xX0lSUToKKwkJcG9ydF9hZGRyID0gbmxtX3hscGlpX2dldF91c2JfcmVnYmFzZShub2RlLCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJObyBtYXRjaGluZyBVU0IgaXJxICVkIG5vZGUgICVkIVxuIiwgaXJxLCBub2RlKTsKKwkJcmV0dXJuOworCX0KKwlubG1fd3JpdGVfdXNiX3JlZyhwb3J0X2FkZHIsIFhMUElJX1VTQjNfSU5UX1JFRywgMHhmZmZmZmZmZik7Cit9CisKIHN0YXRpYyB2b2lkIG5sbV94bHBpaV91c2JfaHdfcmVzZXQoaW50IG5vZGUsIGludCBwb3J0KQogewogCXU2NCBwb3J0X2FkZHIsIHhoY2lfYmFzZSwgcGNpX2Jhc2U7CkBAIC0xNzgsMTcgKzIwNCwzMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBubG1fcGxhdGZvcm1feGxwaWlfdXNiX2luaXQodm9pZCkKIHsKKwlpbnQgbm9kZTsKKwogCWlmICghY3B1X2lzX3hscGlpKCkpCiAJCXJldHVybiAwOwogCi0JcHJfaW5mbygiSW5pdGlhbGl6aW5nIDJYWCBVU0IgSW50ZXJmYWNlXG4iKTsKLQlubG1feGxwaWlfdXNiX2h3X3Jlc2V0KDAsIDEpOwotCW5sbV94bHBpaV91c2JfaHdfcmVzZXQoMCwgMik7Ci0JbmxtX3hscGlpX3VzYl9od19yZXNldCgwLCAzKTsKLQlubG1fc2V0X3BpY19leHRyYV9hY2soMCwgUElDXzJYWF9YSENJXzBfSVJRLCB4bHBpaV91c2JfYWNrKTsKLQlubG1fc2V0X3BpY19leHRyYV9hY2soMCwgUElDXzJYWF9YSENJXzFfSVJRLCB4bHBpaV91c2JfYWNrKTsKLQlubG1fc2V0X3BpY19leHRyYV9hY2soMCwgUElDXzJYWF9YSENJXzJfSVJRLCB4bHBpaV91c2JfYWNrKTsKKwlpZiAoIWNwdV9pc194bHA5eHgoKSkgeworCQkvKiBYTFAgMlhYIHNpbmdsZSBub2RlICovCisJCXByX2luZm8oIkluaXRpYWxpemluZyAyWFggVVNCIEludGVyZmFjZVxuIik7CisJCW5sbV94bHBpaV91c2JfaHdfcmVzZXQoMCwgMSk7CisJCW5sbV94bHBpaV91c2JfaHdfcmVzZXQoMCwgMik7CisJCW5sbV94bHBpaV91c2JfaHdfcmVzZXQoMCwgMyk7CisJCW5sbV9zZXRfcGljX2V4dHJhX2FjaygwLCBQSUNfMlhYX1hIQ0lfMF9JUlEsIHhscDJ4eF91c2JfYWNrKTsKKwkJbmxtX3NldF9waWNfZXh0cmFfYWNrKDAsIFBJQ18yWFhfWEhDSV8xX0lSUSwgeGxwMnh4X3VzYl9hY2spOworCQlubG1fc2V0X3BpY19leHRyYV9hY2soMCwgUElDXzJYWF9YSENJXzJfSVJRLCB4bHAyeHhfdXNiX2Fjayk7CisJCXJldHVybiAwOworCX0KIAorCS8qIFhMUCA5WFgsIG11bHRpLW5vZGUgKi8KKwlwcl9pbmZvKCJJbml0aWFsaXppbmcgOVhYIFVTQiBJbnRlcmZhY2VcbiIpOworCWZvciAobm9kZSA9IDA7IG5vZGUgPCBOTE1fTlJfTk9ERVM7IG5vZGUrKykgeworCQlpZiAoIW5sbV9ub2RlX3ByZXNlbnQobm9kZSkpCisJCQljb250aW51ZTsKKwkJbmxtX3hscGlpX3VzYl9od19yZXNldChub2RlLCAxKTsKKwkJbmxtX3hscGlpX3VzYl9od19yZXNldChub2RlLCAyKTsKKwkJbmxtX3NldF9waWNfZXh0cmFfYWNrKG5vZGUsIFBJQ185WFhfWEhDSV8wX0lSUSwgeGxwOXh4X3VzYl9hY2spOworCQlubG1fc2V0X3BpY19leHRyYV9hY2sobm9kZSwgUElDXzlYWF9YSENJXzFfSVJRLCB4bHA5eHhfdXNiX2Fjayk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xOTYsOCArMjM4LDI2IEBACiAKIHN0YXRpYyB1NjQgeGxwX3VzYl9kbWFtYXNrID0gfih1MzIpMDsKIAotLyogRml4dXAgSVJRIGZvciBVU0IgZGV2aWNlcyBvbiBYTFAgdGhlIFNvQyBQQ0llIGJ1cyAqLwotc3RhdGljIHZvaWQgbmxtX3VzYl9maXh1cF9maW5hbChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorLyogRml4dXAgdGhlIElSUSBmb3IgVVNCIGRldmljZXMgd2hpY2ggaXMgZXhpc3Qgb24gWExQOVhYIFNPQyBQQ0lFIGJ1cyAqLworc3RhdGljIHZvaWQgbmxtX3hscDl4eF91c2JfZml4dXBfZmluYWwoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbm9kZTsKKworCW5vZGUgPSB4bHBfc29jZGV2X3RvX25vZGUoZGV2KTsKKwlkZXYtPmRldi5kbWFfbWFzawkJPSAmeGxwX3VzYl9kbWFtYXNrOworCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKTsKKwlzd2l0Y2ggKGRldi0+ZGV2Zm4pIHsKKwljYXNlIDB4MjE6CisJCWRldi0+aXJxID0gbmxtX2lycV90b194aXJxKG5vZGUsIFBJQ185WFhfWEhDSV8wX0lSUSk7CisJCWJyZWFrOworCWNhc2UgMHgyMjoKKwkJZGV2LT5pcnEgPSBubG1faXJxX3RvX3hpcnEobm9kZSwgUElDXzlYWF9YSENJXzFfSVJRKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBGaXh1cCB0aGUgSVJRIGZvciBVU0IgZGV2aWNlcyB3aGljaCBpcyBleGlzdCBvbiBYTFAyWFggU09DIFBDSUUgYnVzICovCitzdGF0aWMgdm9pZCBubG1feGxwMnh4X3VzYl9maXh1cF9maW5hbChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWRldi0+ZGV2LmRtYV9tYXNrCQk9ICZ4bHBfdXNiX2RtYW1hc2s7CiAJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpOwpAQCAtMjE0LDUgKzI3NCw3IEBACiAJfQogfQogCitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1hMUDlYWF9YSENJLAorCQlubG1feGxwOXh4X3VzYl9maXh1cF9maW5hbCk7CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX05FVExPR0lDLCBQQ0lfREVWSUNFX0lEX05MTV9YSENJLAotCQlubG1fdXNiX2ZpeHVwX2ZpbmFsKTsKKwkJbmxtX3hscDJ4eF91c2JfZml4dXBfZmluYWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hscC93YWtldXAuYyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHAvd2FrZXVwLmMKaW5kZXggNjgyZDU2My4uOWE5MjYxNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL3hscC93YWtldXAuYworKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxwL3dha2V1cC5jCkBAIC0zMiw3ICszMiw2IEBACiAgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KIApAQCAtNDcsMTQgKzQ2LDE0IEBACiAjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL21pcHMtZXh0bnMuaD4KIAogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHAtaGFsL2lvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvcGljLmg+CiAjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwveGxwLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvcGljLmg+CiAjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvc3lzLmg+CiAKIHN0YXRpYyBpbnQgeGxwX3dha2V1cF9jb3JlKHVpbnQ2NF90IHN5c2Jhc2UsIGludCBub2RlLCBpbnQgY29yZSkKIHsKIAl1aW50MzJfdCBjb3JlbWFzaywgdmFsdWU7Ci0JaW50IGNvdW50OworCWludCBjb3VudCwgcmVzZXRyZWc7CiAKIAljb3JlbWFzayA9ICgxIDw8IGNvcmUpOwogCkBAIC02NSwxMiArNjQsMjQgQEAKIAkJbmxtX3dyaXRlX3N5c19yZWcoc3lzYmFzZSwgU1lTX0NPUkVfREZTX0RJU19DVFJMLCB2YWx1ZSk7CiAJfQogCi0JLyogUmVtb3ZlIENQVSBSZXNldCAqLwotCXZhbHVlID0gbmxtX3JlYWRfc3lzX3JlZyhzeXNiYXNlLCBTWVNfQ1BVX1JFU0VUKTsKLQl2YWx1ZSAmPSB+Y29yZW1hc2s7Ci0JbmxtX3dyaXRlX3N5c19yZWcoc3lzYmFzZSwgU1lTX0NQVV9SRVNFVCwgdmFsdWUpOworCS8qIE9uIDlYWCwgbWFyayBjb2hlcmVudCBmaXJzdCAqLworCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJdmFsdWUgPSBubG1fcmVhZF9zeXNfcmVnKHN5c2Jhc2UsIFNZU185WFhfQ1BVX05PTkNPSEVSRU5UX01PREUpOworCQl2YWx1ZSAmPSB+Y29yZW1hc2s7CisJCW5sbV93cml0ZV9zeXNfcmVnKHN5c2Jhc2UsIFNZU185WFhfQ1BVX05PTkNPSEVSRU5UX01PREUsIHZhbHVlKTsKKwl9CiAKLQkvKiBQb2xsIGZvciBDUFUgdG8gbWFyayBpdHNlbGYgY29oZXJlbnQgKi8KKwkvKiBSZW1vdmUgQ1BVIFJlc2V0ICovCisJcmVzZXRyZWcgPSBjcHVfaXNfeGxwOXh4KCkgPyBTWVNfOVhYX0NQVV9SRVNFVCA6IFNZU19DUFVfUkVTRVQ7CisJdmFsdWUgPSBubG1fcmVhZF9zeXNfcmVnKHN5c2Jhc2UsIHJlc2V0cmVnKTsKKwl2YWx1ZSAmPSB+Y29yZW1hc2s7CisJbmxtX3dyaXRlX3N5c19yZWcoc3lzYmFzZSwgcmVzZXRyZWcsIHZhbHVlKTsKKworCS8qIFdlIGFyZSBkb25lIG9uIDlYWCAqLworCWlmIChjcHVfaXNfeGxwOXh4KCkpCisJCXJldHVybiAxOworCisJLyogUG9sbCBmb3IgQ1BVIHRvIG1hcmsgaXRzZWxmIGNvaGVyZW50IG9uIG90aGVyIHR5cGUgb2YgWExQICovCiAJY291bnQgPSAxMDAwMDA7CiAJZG8gewogCQl2YWx1ZSA9IG5sbV9yZWFkX3N5c19yZWcoc3lzYmFzZSwgU1lTX0NQVV9OT05DT0hFUkVOVF9NT0RFKTsKQEAgLTg0LDcgKzk1LDcgQEAKIAl2b2xhdGlsZSB1aW50MzJfdCAqY3B1X3JlYWR5ID0gbmxtX2dldF9ib290X2RhdGEoQk9PVF9DUFVfUkVBRFkpOwogCWludCBpLCBjb3VudCwgbm90cmVhZHk7CiAKLQljb3VudCA9IDB4MjAwMDAwMDA7CisJY291bnQgPSAweDgwMDAwMDsKIAlkbyB7CiAJCW5vdHJlYWR5ID0gbmxtX3RocmVhZHNfcGVyX2NvcmU7CiAJCWZvciAoaSA9IDA7IGkgPCBubG1fdGhyZWFkc19wZXJfY29yZTsgaSsrKQpAQCAtOTgsMjcgKzEwOSw2MiBAQAogc3RhdGljIHZvaWQgeGxwX2VuYWJsZV9zZWNvbmRhcnlfY29yZXMoY29uc3QgY3B1bWFza190ICp3YWtldXBfbWFzaykKIHsKIAlzdHJ1Y3QgbmxtX3NvY19pbmZvICpub2RlcDsKLQl1aW50NjRfdCBzeXNwY2liYXNlOwotCXVpbnQzMl90IHN5c2NvcmVtYXNrOworCXVpbnQ2NF90IHN5c3BjaWJhc2UsIGZ1c2ViYXNlOworCXVpbnQzMl90IHN5c2NvcmVtYXNrLCBtYXNrLCBmdXNlbWFzazsKIAlpbnQgY29yZSwgbiwgY3B1OwogCiAJZm9yIChuID0gMDsgbiA8IE5MTV9OUl9OT0RFUzsgbisrKSB7Ci0JCXN5c3BjaWJhc2UgPSBubG1fZ2V0X3N5c19wY2liYXNlKG4pOwotCQlpZiAobmxtX3JlYWRfcmVnKHN5c3BjaWJhc2UsIDApID09IDB4ZmZmZmZmZmYpCi0JCQlicmVhazsKLQotCQkvKiByZWFkIGNvcmVzIGluIHJlc2V0IGZyb20gU1lTICovCi0JCWlmIChuICE9IDApCisJCWlmIChuICE9IDApIHsKKwkJCS8qIGNoZWNrIGlmIG5vZGUgZXhpc3RzIGFuZCBpcyBvbmxpbmUgKi8KKwkJCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJCQlpbnQgYiA9IHhscDl4eF9nZXRfc29jYnVzKG4pOworCQkJCXByX2luZm8oIk5vZGUgJWQgU29DIFBDSSBidXMgJWQuXG4iLCBuLCBiKTsKKwkJCQlpZiAoYiA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJc3lzcGNpYmFzZSA9IG5sbV9nZXRfc3lzX3BjaWJhc2Uobik7CisJCQkJaWYgKG5sbV9yZWFkX3JlZyhzeXNwY2liYXNlLCAwKSA9PSAweGZmZmZmZmZmKQorCQkJCQlicmVhazsKKwkJCX0KIAkJCW5sbV9ub2RlX2luaXQobik7Ci0JCW5vZGVwID0gbmxtX2dldF9ub2RlKG4pOwotCQlzeXNjb3JlbWFzayA9IG5sbV9yZWFkX3N5c19yZWcobm9kZXAtPnN5c2Jhc2UsIFNZU19DUFVfUkVTRVQpOwotCQkvKiBUaGUgYm9vdCBjcHUgKi8KLQkJaWYgKG4gPT0gMCkgewotCQkJc3lzY29yZW1hc2sgfD0gMTsKLQkJCW5vZGVwLT5jb3JlbWFzayA9IDE7CiAJCX0KIAotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgTkxNX0NPUkVTX1BFUl9OT0RFOyBjb3JlKyspIHsKKwkJLyogcmVhZCBjb3JlcyBpbiByZXNldCBmcm9tIFNZUyAqLworCQlub2RlcCA9IG5sbV9nZXRfbm9kZShuKTsKKworCQlpZiAoY3B1X2lzX3hscDl4eCgpKSB7CisJCQlmdXNlYmFzZSA9IG5sbV9nZXRfZnVzZV9yZWdiYXNlKG4pOworCQkJZnVzZW1hc2sgPSBubG1fcmVhZF9yZWcoZnVzZWJhc2UsIEZVU0VfOVhYX0RFVkNGRzYpOworCQkJbWFzayA9IDB4ZmZmZmY7CisJCX0gZWxzZSB7CisJCQlmdXNlbWFzayA9IG5sbV9yZWFkX3N5c19yZWcobm9kZXAtPnN5c2Jhc2UsCisJCQkJCQlTWVNfRUZVU0VfREVWSUNFX0NGR19TVEFUVVMwKTsKKwkJCXN3aXRjaCAocmVhZF9jMF9wcmlkKCkgJiAweGZmMDApIHsKKwkJCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExQM1hYOgorCQkJCW1hc2sgPSAweGY7CisJCQkJYnJlYWs7CisJCQljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUDJYWDoKKwkJCQltYXNrID0gMHgzOworCQkJCWJyZWFrOworCQkJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFA4WFg6CisJCQlkZWZhdWx0OgorCQkJCW1hc2sgPSAweGZmOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogRnVzZWQgb3V0IGNvcmVzIGFyZSBzZXQgaW4gdGhlIGZ1c2VtYXNrLCBhbmQgdGhlIHJlbWFpbmluZworCQkgKiBjb3JlcyBhcmUgcmVudW1iZXJlZCB0byByYW5nZSAwIC4uIG5hY3RpdmUtMQorCQkgKi8KKwkJc3lzY29yZW1hc2sgPSAoMSA8PCBod2VpZ2h0MzIofmZ1c2VtYXNrICYgbWFzaykpIC0gMTsKKworCQkvKiBUaGUgYm9vdCBjcHUgKi8KKwkJaWYgKG4gPT0gMCkKKwkJCW5vZGVwLT5jb3JlbWFzayA9IDE7CisKKwkJcHJfaW5mbygiTm9kZSAlZCAtIFNZUy9GVVNFIGNvcmVtYXNrICV4XG4iLCBuLCBzeXNjb3JlbWFzayk7CisJCWZvciAoY29yZSA9IDA7IGNvcmUgPCBubG1fY29yZXNfcGVyX25vZGUoKTsgY29yZSsrKSB7CiAJCQkvKiB3ZSB3aWxsIGJlIG9uIG5vZGUgMCBjb3JlIDAgKi8KIAkJCWlmIChuID09IDAgJiYgY29yZSA9PSAwKQogCQkJCWNvbnRpbnVlOwpAQCAtMTI4LDcgKzE3NCw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCS8qIHNlZSBpZiBhdCBsZWFzdCB0aGUgZmlyc3QgaHcgdGhyZWFkIGlzIGVuYWJsZWQgKi8KLQkJCWNwdSA9IChuICogTkxNX0NPUkVTX1BFUl9OT0RFICsgY29yZSkKKwkJCWNwdSA9IChuICogbmxtX2NvcmVzX3Blcl9ub2RlKCkgKyBjb3JlKQogCQkJCQkJKiBOTE1fVEhSRUFEU19QRVJfQ09SRTsKIAkJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHdha2V1cF9tYXNrKSkKIAkJCQljb250aW51ZTsKQEAgLTE0MSw3ICsxODcsOCBAQAogCQkJbm9kZXAtPmNvcmVtYXNrIHw9IDF1IDw8IGNvcmU7CiAKIAkJCS8qIHNwaW4gdW50aWwgdGhlIGh3IHRocmVhZHMgc2V0cyB0aGVpciByZWFkeSAqLwotCQkJd2FpdF9mb3JfY3B1cyhjcHUsIDApOworCQkJaWYgKCF3YWl0X2Zvcl9jcHVzKGNwdSwgMCkpCisJCQkJcHJfZXJyKCJOb2RlICVkIDogdGltZW91dCBjb3JlICVkXG4iLCBuLCBjb3JlKTsKIAkJfQogCX0KIH0KQEAgLTE1Myw3ICsyMDAsOCBAQAogCSAqIGZpcnN0IHdha2V1cCBjb3JlIDAgdGhyZWFkcwogCSAqLwogCXhscF9ib290X2NvcmUwX3NpYmxpbmdzKCk7Ci0Jd2FpdF9mb3JfY3B1cygwLCAwKTsKKwlpZiAoIXdhaXRfZm9yX2NwdXMoMCwgMCkpCisJCXByX2VycigiTm9kZSAwIDogdGltZW91dCBjb3JlIDBcbiIpOwogCiAJLyogbm93IGdldCBvdGhlciBjb3JlcyBvdXQgb2YgcmVzZXQgKi8KIAl4bHBfZW5hYmxlX3NlY29uZGFyeV9jb3JlcygmbmxtX2NwdW1hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9wbGF0Zm9ybS5jCmluZGV4IDdiOTZhOTEuLjQ3ODU5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3BsYXRmb3JtLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL3BpYy5oPgogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIveGxyLmg+CiAKLXVuc2lnbmVkIGludCBubG1feGxyX3VhcnRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmxtX3hscl91YXJ0X2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCiB7CiAJdWludDY0X3QgdWFydGJhc2U7CiAJdW5zaWduZWQgaW50IHZhbHVlOwpAQCAtNDEsNyArNDEsNyBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotdm9pZCBubG1feGxyX3VhcnRfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3N0YXRpYyB2b2lkIG5sbV94bHJfdWFydF9vdXQoc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCwgaW50IHZhbHVlKQogewogCXVpbnQ2NF90IHVhcnRiYXNlOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NldHVwLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NldHVwLmMKaW5kZXggOTIxYmU1Zi4uZDExOGI5YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc2V0dXAuYwpAQCAtNjAsMjUgKzYwLDYgQEAKIHN0cnVjdCBubG1fc29jX2luZm8gbmxtX25vZGVzW05MTV9OUl9OT0RFU107CiBjcHVtYXNrX3QgbmxtX2NwdW1hc2sgPSBDUFVfTUFTS19DUFUwOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgbmxtX2Vhcmx5X3NlcmlhbF9zZXR1cCh2b2lkKQotewotCXN0cnVjdCB1YXJ0X3BvcnQgczsKLQl1bnNpZ25lZCBsb25nIHVhcnRfYmFzZTsKLQotCXVhcnRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKW5sbV9tbWlvX2Jhc2UoTkVUTE9HSUNfSU9fVUFSVF8wX09GRlNFVCk7Ci0JbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOwotCXMuZmxhZ3MJCT0gQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVDsKLQlzLmlvdHlwZQk9IFVQSU9fTUVNMzI7Ci0Jcy5yZWdzaGlmdAk9IDI7Ci0Jcy5pcnEJCT0gUElDX1VBUlRfMF9JUlE7Ci0Jcy51YXJ0Y2xrCT0gUElDX0NMS19IWjsKLQlzLnNlcmlhbF9pbgk9IG5sbV94bHJfdWFydF9pbjsKLQlzLnNlcmlhbF9vdXQJPSBubG1feGxyX3VhcnRfb3V0OwotCXMubWFwYmFzZQk9IHVhcnRfYmFzZTsKLQlzLm1lbWJhc2UJPSAodW5zaWduZWQgY2hhciBfX2lvbWVtICopdWFydF9iYXNlOwotCWVhcmx5X3NlcmlhbF9zZXR1cCgmcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIG5sbV9saW51eF9leGl0KHZvaWQpCiB7CiAJdWludDY0X3QgZ3Bpb2Jhc2U7CkBAIC0yMTQsNyArMTk1LDYgQEAKIAltZW1jcHkocmVzZXRfdmVjLCAodm9pZCAqKW5sbV9yZXNldF9lbnRyeSwKIAkJCShubG1fcmVzZXRfZW50cnlfZW5kIC0gbmxtX3Jlc2V0X2VudHJ5KSk7CiAKLQlubG1fZWFybHlfc2VyaWFsX3NldHVwKCk7CiAJYnVpbGRfYXJjc19jbWRsaW5lKGFyZ3YpOwogCXByb21fYWRkX21lbW9yeSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3dha2V1cC5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci93YWtldXAuYwppbmRleCA5ZmI4MWZhLi5kNjFjYmExIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3dha2V1cC5jCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvd2FrZXVwLmMKQEAgLTMyLDcgKzMyLDYgQEAKICAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAKQEAgLTcwLDcgKzY5LDcgQEAKIAogCS8qIEZpbGwgdXAgdGhlIGNvcmVtYXNrIGVhcmx5ICovCiAJbm9kZXAtPmNvcmVtYXNrID0gMTsKLQlmb3IgKGkgPSAxOyBpIDwgTkxNX0NPUkVTX1BFUl9OT0RFOyBpKyspIHsKKwlmb3IgKGkgPSAxOyBpIDwgbmxtX2NvcmVzX3Blcl9ub2RlKCk7IGkrKykgewogCQlmb3IgKGogPSAxMDAwMDAwOyBqID4gMDsgai0tKSB7CiAJCQlpZiAoY3B1X3JlYWR5W2kgKiBOTE1fVEhSRUFEU19QRVJfQ09SRV0pCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggNGQxNzM2Zi4uMmE4NmUzOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYwpAQCAtODYsNiArODYsOCBAQAogCWNhc2UgQ1BVXzM0SzoKIAljYXNlIENQVV8xMDA0SzoKIAljYXNlIENQVV83NEs6CisJY2FzZSBDUFVfSU5URVJBUFRJVjoKKwljYXNlIENQVV9QUk9BUFRJVjoKIAljYXNlIENQVV9MT09OR1NPTjE6CiAJY2FzZSBDUFVfU0IxOgogCWNhc2UgQ1BVX1NCMUE6CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKaW5kZXggM2EyYjZlOS4uNGQ5NGQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwpAQCAtMzc2LDYgKzM3NiwxNCBAQAogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvNzRLIjsKIAkJYnJlYWs7CiAKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvaW50ZXJBcHRpdiI7CisJCWJyZWFrOworCisJY2FzZSBDUFVfUFJPQVBUSVY6CisJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy9wcm9BcHRpdiI7CisJCWJyZWFrOworCiAJY2FzZSBDUFVfNUtDOgogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvNUsiOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IDcxOWU0NTUuLjEzN2YyYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtNjAsNCArNjAsNSBAQAogCiBpZmRlZiBDT05GSUdfUENJX01TSQogb2JqLSQoQ09ORklHX0NBVklVTV9PQ1RFT05fU09DKSArPSBtc2ktb2N0ZW9uLm8KK29iai0kKENPTkZJR19DUFVfWExQKQkJKz0gbXNpLXhscC5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1tYWx0YS5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1tYWx0YS5jCmluZGV4IGRmMzZlMjMuLjdhMGVkYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtbWFsdGEuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMKQEAgLTU0LDYgKzU0LDcgQEAKIHN0YXRpYyB2b2lkIG1hbHRhX3BpaXhfZnVuYzBfZml4dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdW5zaWduZWQgY2hhciByZWdfdmFsOworCXUzMiByZWdfdmFsMzI7CiAJLyogUElJWCBQSVJRQ1tBOkRdIGlycSBtYXBwaW5ncyAqLwogCXN0YXRpYyBpbnQgcGlpeGlycW1hcFtQSUlYNF9GVU5DMF9QSVJRUkNfSVJRX1JPVVRJTkdfTUFYXSA9IHsKIAkJMCwgIDAsCTAsICAzLApAQCAtODMsNiArODQsMTYgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVg0X0ZVTkMwX1RPTSwgcmVnX3ZhbCB8CiAJCQkJUElJWDRfRlVOQzBfVE9NX1RPUF9PRl9NRU1PUllfTUFTSyk7CiAJfQorCisJLyogTXV4IFNFUklSUSB0byBpdHMgcGluICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBJSVg0X0ZVTkMwX0dFTkNGRywgJnJlZ192YWwzMik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYNF9GVU5DMF9HRU5DRkcsCisJCQkgICAgICAgcmVnX3ZhbDMyIHwgUElJWDRfRlVOQzBfR0VOQ0ZHX1NFUklSUSk7CisKKwkvKiBFbmFibGUgU0VSSVJRICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUElJWDRfRlVOQzBfU0VSSVJRQywgJnJlZ192YWwpOworCXJlZ192YWwgfD0gUElJWDRfRlVOQzBfU0VSSVJRQ19FTiB8IFBJSVg0X0ZVTkMwX1NFUklSUUNfQ09OVDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUElJWDRfRlVOQzBfU0VSSVJRQywgcmVnX3ZhbCk7CiB9CiAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMCwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtcmMzMjQzNC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1yYzMyNDM0LmMKaW5kZXggZDBmNmVjYi4uN2ZjYWZkNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1yYzMyNDM0LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1yYzMyNDM0LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvcmMzMjQzNC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXNiMTI1MC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1zYjEyNTAuYwppbmRleCAxNDQxYmVjLi44ZmVhZTkxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXNiMTI1MC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtc2IxMjUwLmMKQEAgLTgsNyArOCw2IEBACiAgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL21zaS14bHAuYyBiL2FyY2gvbWlwcy9wY2kvbXNpLXhscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDg0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGNpL21zaS14bHAuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlIEJyb2FkY29tCisgKiBsaWNlbnNlIGJlbG93OgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCUk9BRENPTSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkZXNjLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbmV0bG9naWMvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL2hhbGRlZnMuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMvY29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL21pcHMtZXh0bnMuaD4KKworI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHAtaGFsL2lvbWFwLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwveGxwLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvcGljLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvcGNpYnVzLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvYnJpZGdlLmg+CisKKyNkZWZpbmUgWExQX01TSVZFQ19QRVJfTElOSwkzMgorI2RlZmluZSBYTFBfTVNJWFZFQ19UT1RBTAkzMgorI2RlZmluZSBYTFBfTVNJWFZFQ19QRVJfTElOSwk4CisKKy8qIDEyOCBNU0kgaXJxcyBwZXIgbm9kZSwgbWFwcGVkIHN0YXJ0aW5nIGF0IE5MTV9NU0lfVkVDX0JBU0UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5sbV9saW5rX21zaWlycShpbnQgbGluaywgaW50IG1zaXZlYykKK3sKKwlyZXR1cm4gTkxNX01TSV9WRUNfQkFTRSArIGxpbmsgKiBYTFBfTVNJVkVDX1BFUl9MSU5LICsgbXNpdmVjOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1faXJxX21zaXZlYyhpbnQgaXJxKQoreworCXJldHVybiBpcnEgJSBYTFBfTVNJVkVDX1BFUl9MSU5LOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1faXJxX21zaWxpbmsoaW50IGlycSkKK3sKKwlyZXR1cm4gKGlycSAlIChYTFBfTVNJVkVDX1BFUl9MSU5LICogUENJRV9OTElOS1MpKSAvCisJCQkJCQlYTFBfTVNJVkVDX1BFUl9MSU5LOworfQorCisvKgorICogT25seSAzMiBNU0ktWCB2ZWN0b3JzIGFyZSBwb3NzaWJsZSBiZWNhdXNlIHRoZXJlIGFyZSBvbmx5IDMyIFBJQworICogaW50ZXJydXB0cyBmb3IgTVNJLiBXZSBzcGxpdCB0aGVtIHN0YXRpY2FsbHkgYW5kIHVzZSA4IE1TSS1YIHZlY3RvcnMKKyAqIHBlciBsaW5rIC0gdGhpcyBrZWVwcyB0aGUgYWxsb2NhdGlvbiBhbmQgbG9va3VwIHNpbXBsZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmxtX2xpbmtfbXNpeGlycShpbnQgbGluaywgaW50IGJpdCkKK3sKKwlyZXR1cm4gTkxNX01TSVhfVkVDX0JBU0UgKyBsaW5rICogWExQX01TSVhWRUNfUEVSX0xJTksgKyBiaXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5sbV9pcnFfbXNpeHZlYyhpbnQgaXJxKQoreworCXJldHVybiBpcnEgJSBYTFBfTVNJWFZFQ19UT1RBTDsgIC8qIHdvcmtzIHdoZW4gZ2l2ZW4geGlycSAqLworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1faXJxX21zaXhsaW5rKGludCBpcnEpCit7CisJcmV0dXJuIG5sbV9pcnFfbXNpeHZlYyhpcnEpIC8gWExQX01TSVhWRUNfUEVSX0xJTks7Cit9CisKKy8qCisgKiBQZXIgbGluayBNU0kgYW5kIE1TSS1YIGluZm9ybWF0aW9uLCBzZXQgYXMgSVJRIGhhbmRsZXIgZGF0YSBmb3IKKyAqIE1TSSBhbmQgTVNJLVggaW50ZXJydXB0cy4KKyAqLworc3RydWN0IHhscF9tc2lfZGF0YSB7CisJc3RydWN0IG5sbV9zb2NfaW5mbyAqbm9kZTsKKwl1aW50NjRfdAlsbmtiYXNlOworCXVpbnQzMl90CW1zaV9lbmFibGVkX21hc2s7CisJdWludDMyX3QJbXNpX2FsbG9jX21hc2s7CisJdWludDMyX3QJbXNpeF9hbGxvY19tYXNrOworCXNwaW5sb2NrX3QJbXNpX2xvY2s7Cit9OworCisvKgorICogTVNJIENoaXAgZGVmaW5pdGlvbnMKKyAqCisgKiBPbiBYTFAsIHRoZXJlIGlzIGEgUElDIGludGVycnVwdCBhc3NvY2lhdGVkIHdpdGggZWFjaCBQQ0llIGxpbmsgb24gdGhlCisgKiBjaGlwICh3aGljaCBhcHBlYXJzIGFzIGEgUENJIGJyaWRnZSB0byB1cykuIFRoaXMgZ2l2ZXMgdXMgMzIgTVNJIGlycWEKKyAqIHBlciBsaW5rIGFuZCAxMjggb3ZlcmFsbC4KKyAqCisgKiBXaGVuIGEgZGV2aWNlIGNvbm5lY3RlZCB0byB0aGUgbGluayByYWlzZXMgYSBNU0kgaW50ZXJydXB0LCB3ZSBnZXQgYQorICogbGluayBpbnRlcnJ1cHQgYW5kIHdlIHRoZW4gaGF2ZSB0byBsb29rIGF0IFBDSUVfTVNJX1NUQVRVUyByZWdpc3RlciBhdAorICogdGhlIGJyaWRnZSB0byBtYXAgaXQgdG8gdGhlIElSUQorICovCitzdGF0aWMgdm9pZCB4bHBfbXNpX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHhscF9tc2lfZGF0YSAqbWQgPSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2ZWM7CisKKwl2ZWMgPSBubG1faXJxX21zaXZlYyhkLT5pcnEpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKKwltZC0+bXNpX2VuYWJsZWRfbWFzayB8PSAxdSA8PCB2ZWM7CisJbmxtX3dyaXRlX3JlZyhtZC0+bG5rYmFzZSwgUENJRV9NU0lfRU4sIG1kLT5tc2lfZW5hYmxlZF9tYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgeGxwX21zaV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgeGxwX21zaV9kYXRhICptZCA9IGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZlYzsKKworCXZlYyA9IG5sbV9pcnFfbXNpdmVjKGQtPmlycSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kLT5tc2lfbG9jaywgZmxhZ3MpOworCW1kLT5tc2lfZW5hYmxlZF9tYXNrICY9IH4oMXUgPDwgdmVjKTsKKwlubG1fd3JpdGVfcmVnKG1kLT5sbmtiYXNlLCBQQ0lFX01TSV9FTiwgbWQtPm1zaV9lbmFibGVkX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kLT5tc2lfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB4bHBfbXNpX21hc2tfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgeGxwX21zaV9kYXRhICptZCA9IGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOworCWludCBsaW5rLCB2ZWM7CisKKwlsaW5rID0gbmxtX2lycV9tc2lsaW5rKGQtPmlycSk7CisJdmVjID0gbmxtX2lycV9tc2l2ZWMoZC0+aXJxKTsKKwl4bHBfbXNpX2Rpc2FibGUoZCk7CisKKwkvKiBBY2sgTVNJIG9uIGJyaWRnZSAqLworCW5sbV93cml0ZV9yZWcobWQtPmxua2Jhc2UsIFBDSUVfTVNJX1NUQVRVUywgMXUgPDwgdmVjKTsKKworCS8qIEFjayBhdCBlaXJyIGFuZCBQSUMgKi8KKwlhY2tfYzBfZWlycihQSUNfUENJRV9MSU5LX01TSV9JUlEobGluaykpOworCW5sbV9waWNfYWNrKG1kLT5ub2RlLT5waWNiYXNlLCBQSUNfSVJUX1BDSUVfTElOS19JTkRFWChsaW5rKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGxwX21zaV9jaGlwID0geworCS5uYW1lCQk9ICJYTFAtTVNJIiwKKwkuaXJxX2VuYWJsZQk9IHhscF9tc2lfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IHhscF9tc2lfZGlzYWJsZSwKKwkuaXJxX21hc2tfYWNrCT0geGxwX21zaV9tYXNrX2FjaywKKwkuaXJxX3VubWFzawk9IHhscF9tc2lfZW5hYmxlLAorfTsKKworLyoKKyAqIFRoZSBNU0ktWCBpbnRlcnJ1cHQgaGFuZGxpbmcgaXMgZGlmZmVyZW50IGZyb20gTVNJLCB0aGVyZSBhcmUgMzIKKyAqIE1TSS1YIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBQSUMgYW5kIGVhY2ggb2YgdGhlc2UgY29ycmVzcG9uZAorICogdG8gYSBNU0ktWCB2ZWN0b3IgKDAtMzEpIHRoYXQgY2FuIGJlIGFzc2lnbmVkLgorICoKKyAqIFdlIGRpdmlkZSB0aGUgTVNJLVggdmVjdG9ycyB0byA4IHBlciBsaW5rIGFuZCBkbyBhIHBlci1saW5rCisgKiBhbGxvY2F0aW9uCisgKgorICogRW5hYmxlIGFuZCBkaXNhYmxlIGRvbmUgdXNpbmcgc3RhbmRhcmQgTVNJIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgeGxwX21zaXhfbWFza19hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCB4bHBfbXNpX2RhdGEgKm1kID0gaXJxX2RhdGFfZ2V0X2lycV9oYW5kbGVyX2RhdGEoZCk7CisJaW50IGxpbmssIG1zaXh2ZWM7CisKKwltc2l4dmVjID0gbmxtX2lycV9tc2l4dmVjKGQtPmlycSk7CisJbGluayA9IG5sbV9pcnFfbXNpeGxpbmsoZC0+aXJxKTsKKwltYXNrX21zaV9pcnEoZCk7CisKKwkvKiBBY2sgTVNJIG9uIGJyaWRnZSAqLworCW5sbV93cml0ZV9yZWcobWQtPmxua2Jhc2UsIFBDSUVfTVNJWF9TVEFUVVMsIDF1IDw8IG1zaXh2ZWMpOworCisJLyogQWNrIGF0IGVpcnIgYW5kIFBJQyAqLworCWFja19jMF9laXJyKFBJQ19QQ0lFX01TSVhfSVJRKGxpbmspKTsKKwlubG1fcGljX2FjayhtZC0+bm9kZS0+cGljYmFzZSwgUElDX0lSVF9QQ0lFX01TSVhfSU5ERVgobXNpeHZlYykpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHhscF9tc2l4X2NoaXAgPSB7CisJLm5hbWUJCT0gIlhMUC1NU0lYIiwKKwkuaXJxX2VuYWJsZQk9IHVubWFza19tc2lfaXJxLAorCS5pcnFfZGlzYWJsZQk9IG1hc2tfbXNpX2lycSwKKwkuaXJxX21hc2tfYWNrCT0geGxwX21zaXhfbWFza19hY2ssCisJLmlycV91bm1hc2sJPSB1bm1hc2tfbXNpX2lycSwKK307CisKK3ZvaWQgZGVzdHJveV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwkgICAgLyogbm90aGluZyB0byBkbyB5ZXQgKi8KK30KKwordm9pZCBhcmNoX3RlYXJkb3duX21zaV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlkZXN0cm95X2lycShpcnEpOworfQorCisvKgorICogU2V0dXAgYSBQQ0llIGxpbmsgZm9yIE1TSS4gIEJ5IGRlZmF1bHQsIHRoZSBsaW5rcyBhcmUgaW4KKyAqIGxlZ2FjeSBpbnRlcnJ1cHQgbW9kZS4gIFdlIHdpbGwgc3dpdGNoIHRoZW0gdG8gTVNJIG1vZGUKKyAqIGF0IHRoZSBmaXJzdCBNU0kgcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQgeGxwX2NvbmZpZ19saW5rX21zaSh1aW50NjRfdCBsbmtiYXNlLCBpbnQgbGlycSwgdWludDY0X3QgbXNpYWRkcikKK3sKKwl1MzIgdmFsOworCisJdmFsID0gbmxtX3JlYWRfcmVnKGxua2Jhc2UsIFBDSUVfSU5UX0VOMCk7CisJaWYgKCh2YWwgJiAweDIwMCkgPT0gMCkgeworCQl2YWwgfD0gMHgyMDA7CQkvKiBNU0kgSW50ZXJydXB0IGVuYWJsZSAqLworCQlubG1fd3JpdGVfcmVnKGxua2Jhc2UsIFBDSUVfSU5UX0VOMCwgdmFsKTsKKwl9CisKKwl2YWwgPSBubG1fcmVhZF9yZWcobG5rYmFzZSwgMHgxKTsJLyogQ01EICovCisJaWYgKCh2YWwgJiAweDA0MDApID09IDApIHsKKwkJdmFsIHw9IDB4MDQwMDsKKwkJbmxtX3dyaXRlX3JlZyhsbmtiYXNlLCAweDEsIHZhbCk7CisJfQorCisJLyogVXBkYXRlIElSUSBpbiB0aGUgUENJIGlycSByZWcgKi8KKwl2YWwgPSBubG1fcmVhZF9wY2lfcmVnKGxua2Jhc2UsIDB4Zik7CisJdmFsICY9IH4weDFmdTsKKwl2YWwgfD0gKDEgPDwgOCkgfCBsaXJxOworCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsIDB4ZiwgdmFsKTsKKworCS8qIE1TSSBhZGRyICovCisJbmxtX3dyaXRlX3JlZyhsbmtiYXNlLCBQQ0lFX0JSSURHRV9NU0lfQUREUkgsIG1zaWFkZHIgPj4gMzIpOworCW5sbV93cml0ZV9yZWcobG5rYmFzZSwgUENJRV9CUklER0VfTVNJX0FERFJMLCBtc2lhZGRyICYgMHhmZmZmZmZmZik7CisKKwkvKiBNU0kgY2FwIGZvciBicmlkZ2UgKi8KKwl2YWwgPSBubG1fcmVhZF9yZWcobG5rYmFzZSwgUENJRV9CUklER0VfTVNJX0NBUCk7CisJaWYgKCh2YWwgJiAoMSA8PCAxNikpID09IDApIHsKKwkJdmFsIHw9IDB4YiA8PCAxNjsJCS8qIG1tYzMyLCBtc2kgZW5hYmxlICovCisJCW5sbV93cml0ZV9yZWcobG5rYmFzZSwgUENJRV9CUklER0VfTVNJX0NBUCwgdmFsKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIE1TSSB2ZWN0b3Igb24gYSBsaW5rCisgKi8KK3N0YXRpYyBpbnQgeGxwX3NldHVwX21zaSh1aW50NjRfdCBsbmtiYXNlLCBpbnQgbm9kZSwgaW50IGxpbmssCisJc3RydWN0IG1zaV9kZXNjICpkZXNjKQoreworCXN0cnVjdCB4bHBfbXNpX2RhdGEgKm1kOworCXN0cnVjdCBtc2lfbXNnIG1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtc2l2ZWMsIGlydCwgbGlycSwgeGlycSwgcmV0OworCXVpbnQ2NF90IG1zaWFkZHI7CisKKwkvKiBHZXQgTVNJIGRhdGEgZm9yIHRoZSBsaW5rICovCisJbGlycSA9IFBJQ19QQ0lFX0xJTktfTVNJX0lSUShsaW5rKTsKKwl4aXJxID0gbmxtX2lycV90b194aXJxKG5vZGUsIG5sbV9saW5rX21zaWlycShsaW5rLCAwKSk7CisJbWQgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YSh4aXJxKTsKKwltc2lhZGRyID0gTVNJX0xJTktfQUREUihub2RlLCBsaW5rKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKKwlpZiAobWQtPm1zaV9hbGxvY19tYXNrID09IDApIHsKKwkJLyogc3dpdGNoIHRoZSBsaW5rIElSUSB0byBNU0kgcmFuZ2UgKi8KKwkJeGxwX2NvbmZpZ19saW5rX21zaShsbmtiYXNlLCBsaXJxLCBtc2lhZGRyKTsKKwkJaXJ0ID0gUElDX0lSVF9QQ0lFX0xJTktfSU5ERVgobGluayk7CisJCW5sbV9zZXR1cF9waWNfaXJxKG5vZGUsIGxpcnEsIGxpcnEsIGlydCk7CisJCW5sbV9waWNfaW5pdF9pcnQobmxtX2dldF9ub2RlKG5vZGUpLT5waWNiYXNlLCBpcnQsIGxpcnEsCisJCQkJIG5vZGUgKiBubG1fdGhyZWFkc19wZXJfbm9kZSgpLCAxIC8qZW4gKi8pOworCX0KKworCS8qIGFsbG9jYXRlIGEgTVNJIHZlYywgYW5kIHRlbGwgdGhlIGJyaWRnZSBhYm91dCBpdCAqLworCW1zaXZlYyA9IGZscyhtZC0+bXNpX2FsbG9jX21hc2spOworCWlmIChtc2l2ZWMgPT0gWExQX01TSVZFQ19QRVJfTElOSykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1kLT5tc2lfYWxsb2NfbWFzayB8PSAoMXUgPDwgbXNpdmVjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKKworCW1zZy5hZGRyZXNzX2hpID0gbXNpYWRkciA+PiAzMjsKKwltc2cuYWRkcmVzc19sbyA9IG1zaWFkZHIgJiAweGZmZmZmZmZmOworCW1zZy5kYXRhID0gMHhjMDAgfCBtc2l2ZWM7CisKKwl4aXJxID0geGlycSArIG1zaXZlYzsJCS8qIG1zaSBtYXBwZWQgdG8gZ2xvYmFsIGlycSBzcGFjZSAqLworCXJldCA9IGlycV9zZXRfbXNpX2Rlc2MoeGlycSwgZGVzYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGVzdHJveV9pcnEoeGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisJd3JpdGVfbXNpX21zZyh4aXJxLCAmbXNnKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN3aXRjaCBhIGxpbmsgdG8gTVNJLVggbW9kZQorICovCitzdGF0aWMgdm9pZCB4bHBfY29uZmlnX2xpbmtfbXNpeCh1aW50NjRfdCBsbmtiYXNlLCBpbnQgbGlycSwgdWludDY0X3QgbXNpeGFkZHIpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IG5sbV9yZWFkX3JlZyhsbmtiYXNlLCAweDJDKTsKKwlpZiAoKHZhbCAmIDB4ODAwMDAwMDBVKSA9PSAwKSB7CisJCXZhbCB8PSAweDgwMDAwMDAwVTsKKwkJbmxtX3dyaXRlX3JlZyhsbmtiYXNlLCAweDJDLCB2YWwpOworCX0KKwl2YWwgPSBubG1fcmVhZF9yZWcobG5rYmFzZSwgUENJRV9JTlRfRU4wKTsKKwlpZiAoKHZhbCAmIDB4MjAwKSA9PSAwKSB7CisJCXZhbCB8PSAweDIwMDsJCS8qIE1TSSBJbnRlcnJ1cHQgZW5hYmxlICovCisJCW5sbV93cml0ZV9yZWcobG5rYmFzZSwgUENJRV9JTlRfRU4wLCB2YWwpOworCX0KKworCXZhbCA9IG5sbV9yZWFkX3JlZyhsbmtiYXNlLCAweDEpOwkvKiBDTUQgKi8KKwlpZiAoKHZhbCAmIDB4MDQwMCkgPT0gMCkgeworCQl2YWwgfD0gMHgwNDAwOworCQlubG1fd3JpdGVfcmVnKGxua2Jhc2UsIDB4MSwgdmFsKTsKKwl9CisKKwkvKiBVcGRhdGUgSVJRIGluIHRoZSBQQ0kgaXJxIHJlZyAqLworCXZhbCA9IG5sbV9yZWFkX3BjaV9yZWcobG5rYmFzZSwgMHhmKTsKKwl2YWwgJj0gfjB4MWZ1OworCXZhbCB8PSAoMSA8PCA4KSB8IGxpcnE7CisJbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwgMHhmLCB2YWwpOworCisJLyogTVNJLVggYWRkcmVzc2VzICovCisJbmxtX3dyaXRlX3JlZyhsbmtiYXNlLCBQQ0lFX0JSSURHRV9NU0lYX0FERFJfQkFTRSwgbXNpeGFkZHIgPj4gOCk7CisJbmxtX3dyaXRlX3JlZyhsbmtiYXNlLCBQQ0lFX0JSSURHRV9NU0lYX0FERFJfTElNSVQsCisJCQkJCShtc2l4YWRkciArIE1TSV9BRERSX1NaKSA+PiA4KTsKK30KKworLyoKKyAqICBBbGxvY2F0ZSBhIE1TSS1YIHZlY3RvcgorICovCitzdGF0aWMgaW50IHhscF9zZXR1cF9tc2l4KHVpbnQ2NF90IGxua2Jhc2UsIGludCBub2RlLCBpbnQgbGluaywKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHhscF9tc2lfZGF0YSAqbWQ7CisJc3RydWN0IG1zaV9tc2cgbXNnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHQsIG1zaXh2ZWMsIGxpcnEsIHhpcnEsIHJldDsKKwl1aW50NjRfdCBtc2l4YWRkcjsKKworCS8qIEdldCBNU0kgZGF0YSBmb3IgdGhlIGxpbmsgKi8KKwlsaXJxID0gUElDX1BDSUVfTVNJWF9JUlEobGluayk7CisJeGlycSA9IG5sbV9pcnFfdG9feGlycShub2RlLCBubG1fbGlua19tc2l4aXJxKGxpbmssIDApKTsKKwltZCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKHhpcnEpOworCW1zaXhhZGRyID0gTVNJWF9MSU5LX0FERFIobm9kZSwgbGluayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWQtPm1zaV9sb2NrLCBmbGFncyk7CisJLyogc3dpdGNoIHRoZSBQQ0llIGxpbmsgdG8gTVNJLVggbW9kZSBhdCB0aGUgZmlyc3QgYWxsb2MgKi8KKwlpZiAobWQtPm1zaXhfYWxsb2NfbWFzayA9PSAwKQorCQl4bHBfY29uZmlnX2xpbmtfbXNpeChsbmtiYXNlLCBsaXJxLCBtc2l4YWRkcik7CisKKwkvKiBhbGxvY2F0ZSBhIE1TSS1YIHZlYywgYW5kIHRlbGwgdGhlIGJyaWRnZSBhYm91dCBpdCAqLworCXQgPSBmbHMobWQtPm1zaXhfYWxsb2NfbWFzayk7CisJaWYgKHQgPT0gWExQX01TSVhWRUNfUEVSX0xJTkspIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWQtPm1zaV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZC0+bXNpeF9hbGxvY19tYXNrIHw9ICgxdSA8PCB0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+bXNpX2xvY2ssIGZsYWdzKTsKKworCXhpcnEgKz0gdDsKKwltc2l4dmVjID0gbmxtX2lycV9tc2l4dmVjKHhpcnEpOworCW1zZy5hZGRyZXNzX2hpID0gbXNpeGFkZHIgPj4gMzI7CisJbXNnLmFkZHJlc3NfbG8gPSBtc2l4YWRkciAmIDB4ZmZmZmZmZmY7CisJbXNnLmRhdGEgPSAweGMwMCB8IG1zaXh2ZWM7CisKKwlyZXQgPSBpcnFfc2V0X21zaV9kZXNjKHhpcnEsIGRlc2MpOworCWlmIChyZXQgPCAwKSB7CisJCWRlc3Ryb3lfaXJxKHhpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXdyaXRlX21zaV9tc2coeGlycSwgJm1zZyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhcmNoX3NldHVwX21zaV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBwY2lfZGV2ICpsbmtkZXY7CisJdWludDY0X3QgbG5rYmFzZTsKKwlpbnQgbm9kZSwgbGluaywgc2xvdDsKKworCWxua2RldiA9IHhscF9nZXRfcGNpZV9saW5rKGRldik7CisJaWYgKGxua2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IGZpbmQgYnJpZGdlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXNsb3QgPSBQQ0lfU0xPVChsbmtkZXYtPmRldmZuKTsKKwlsaW5rID0gUENJX0ZVTkMobG5rZGV2LT5kZXZmbik7CisJbm9kZSA9IHNsb3QgLyA4OworCWxua2Jhc2UgPSBubG1fZ2V0X3BjaWVfYmFzZShub2RlLCBsaW5rKTsKKworCWlmIChkZXNjLT5tc2lfYXR0cmliLmlzX21zaXgpCisJCXJldHVybiB4bHBfc2V0dXBfbXNpeChsbmtiYXNlLCBub2RlLCBsaW5rLCBkZXNjKTsKKwllbHNlCisJCXJldHVybiB4bHBfc2V0dXBfbXNpKGxua2Jhc2UsIG5vZGUsIGxpbmssIGRlc2MpOworfQorCit2b2lkIF9faW5pdCB4bHBfaW5pdF9ub2RlX21zaV9pcnFzKGludCBub2RlLCBpbnQgbGluaykKK3sKKwlzdHJ1Y3QgbmxtX3NvY19pbmZvICpub2RlcDsKKwlzdHJ1Y3QgeGxwX21zaV9kYXRhICptZDsKKwlpbnQgaXJxLCBpLCBpcnQsIG1zaXh2ZWM7CisKKwlwcl9pbmZvKCJbJWQgJWRdIEluaXQgbm9kZSBQQ0kgSVJUXG4iLCBub2RlLCBsaW5rKTsKKwlub2RlcCA9IG5sbV9nZXRfbm9kZShub2RlKTsKKworCS8qIEFsbG9jIGFuIE1TSSBibG9jayBmb3IgdGhlIGxpbmsgKi8KKwltZCA9IGt6YWxsb2Moc2l6ZW9mKCptZCksIEdGUF9LRVJORUwpOworCXNwaW5fbG9ja19pbml0KCZtZC0+bXNpX2xvY2spOworCW1kLT5tc2lfZW5hYmxlZF9tYXNrID0gMDsKKwltZC0+bXNpX2FsbG9jX21hc2sgPSAwOworCW1kLT5tc2l4X2FsbG9jX21hc2sgPSAwOworCW1kLT5ub2RlID0gbm9kZXA7CisJbWQtPmxua2Jhc2UgPSBubG1fZ2V0X3BjaWVfYmFzZShub2RlLCBsaW5rKTsKKworCS8qIGV4dGVuZGVkIHNwYWNlIGZvciBNU0kgaW50ZXJydXB0cyAqLworCWlycSA9IG5sbV9pcnFfdG9feGlycShub2RlLCBubG1fbGlua19tc2lpcnEobGluaywgMCkpOworCWZvciAoaSA9IGlycTsgaSA8IGlycSArIFhMUF9NU0lWRUNfUEVSX0xJTks7IGkrKykgeworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJnhscF9tc2lfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGksIG1kKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgWExQX01TSVhWRUNfUEVSX0xJTks7IGkrKykgeworCQkvKiBJbml0aWFsaXplIE1TSS1YIGlydHMgdG8gZ2VuZXJhdGUgb25lIGludGVycnVwdCBwZXIgbGluayAqLworCQltc2l4dmVjID0gbGluayAqIFhMUF9NU0lYVkVDX1BFUl9MSU5LICsgaTsKKwkJaXJ0ID0gUElDX0lSVF9QQ0lFX01TSVhfSU5ERVgobXNpeHZlYyk7CisJCW5sbV9waWNfaW5pdF9pcnQobm9kZXAtPnBpY2Jhc2UsIGlydCwgUElDX1BDSUVfTVNJWF9JUlEobGluayksCisJCQlub2RlICogbmxtX3RocmVhZHNfcGVyX25vZGUoKSwgMSAvKiBlbmFibGUgKi8pOworCisJCS8qIEluaXRpYWxpemUgTVNJLVggZXh0ZW5kZWQgaXJxIHNwYWNlIGZvciB0aGUgbGluayAgKi8KKwkJaXJxID0gbmxtX2lycV90b194aXJxKG5vZGUsIG5sbV9saW5rX21zaXhpcnEobGluaywgaSkpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmeGxwX21zaXhfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgbWQpOworCX0KKworfQorCit2b2lkIG5sbV9kaXNwYXRjaF9tc2koaW50IG5vZGUsIGludCBsaXJxKQoreworCXN0cnVjdCB4bHBfbXNpX2RhdGEgKm1kOworCWludCBsaW5rLCBpLCBpcnFiYXNlOworCXUzMiBzdGF0dXM7CisKKwlsaW5rID0gbGlycSAtIFBJQ19QQ0lFX0xJTktfTVNJX0lSUV9CQVNFOworCWlycWJhc2UgPSBubG1faXJxX3RvX3hpcnEobm9kZSwgbmxtX2xpbmtfbXNpaXJxKGxpbmssIDApKTsKKwltZCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycWJhc2UpOworCXN0YXR1cyA9IG5sbV9yZWFkX3JlZyhtZC0+bG5rYmFzZSwgUENJRV9NU0lfU1RBVFVTKSAmCisJCQkJCQltZC0+bXNpX2VuYWJsZWRfbWFzazsKKwl3aGlsZSAoc3RhdHVzKSB7CisJCWkgPSBfX2ZmcyhzdGF0dXMpOworCQlkb19JUlEoaXJxYmFzZSArIGkpOworCQlzdGF0dXMgJj0gc3RhdHVzIC0gMTsKKwl9Cit9CisKK3ZvaWQgbmxtX2Rpc3BhdGNoX21zaXgoaW50IG5vZGUsIGludCBsaXJxKQoreworCXN0cnVjdCB4bHBfbXNpX2RhdGEgKm1kOworCWludCBsaW5rLCBpLCBpcnFiYXNlOworCXUzMiBzdGF0dXM7CisKKwlsaW5rID0gbGlycSAtIFBJQ19QQ0lFX01TSVhfSVJRX0JBU0U7CisJaXJxYmFzZSA9IG5sbV9pcnFfdG9feGlycShub2RlLCBubG1fbGlua19tc2l4aXJxKGxpbmssIDApKTsKKwltZCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycWJhc2UpOworCXN0YXR1cyA9IG5sbV9yZWFkX3JlZyhtZC0+bG5rYmFzZSwgUENJRV9NU0lYX1NUQVRVUyk7CisKKwkvKiBuYXJyb3cgaXQgZG93biB0byB0aGUgTVNJLXggdmVjdG9ycyBmb3Igb3VyIGxpbmsgKi8KKwlzdGF0dXMgPSAoc3RhdHVzID4+IChsaW5rICogWExQX01TSVhWRUNfUEVSX0xJTkspKSAmCisJCQkoKDEgPDwgWExQX01TSVhWRUNfUEVSX0xJTkspIC0gMSk7CisKKwl3aGlsZSAoc3RhdHVzKSB7CisJCWkgPSBfX2ZmcyhzdGF0dXMpOworCQlkb19JUlEoaXJxYmFzZSArIGkpOworCQlzdGF0dXMgJj0gc3RhdHVzIC0gMTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMgYi9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMKaW5kZXggNjE0NGJiMy4uMTNlZWE2OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtYmNtNjN4eC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWJvbml0bzY0LmMgYi9hcmNoL21pcHMvcGNpL29wcy1ib25pdG82NC5jCmluZGV4IDgzMDM1MmUuLmMwNjIwNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWJvbml0bzY0LmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtYm9uaXRvNjQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2Jvbml0bzY0Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWxhbnRpcS5jIGIvYXJjaC9taXBzL3BjaS9vcHMtbGFudGlxLmMKaW5kZXggMTZlN2MyNS4uZTU3MzhlZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtbGFudGlxLmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtbGFudGlxLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWxvb25nc29uMi5jIGIvYXJjaC9taXBzL3BjaS9vcHMtbG9vbmdzb24yLmMKaW5kZXggOTgyNTRhZi4uMjQxMzhiYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtbG9vbmdzb24yLmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtbG9vbmdzb24yLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGxvb25nc29uLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1tYWNlLmMgYi9hcmNoL21pcHMvcGNpL29wcy1tYWNlLmMKaW5kZXggMWNmYjU1OC4uNmI1ODIxZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtbWFjZS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLW1hY2UuYwpAQCAtNiw3ICs2LDYgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBLZWl0aCBNIFdlc29sb3dza2kKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wY2kuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLW1zYy5jIGIvYXJjaC9taXBzL3BjaS9vcHMtbXNjLmMKaW5kZXggOTJhODU0My4uZGJiZjM2NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtbXNjLmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtbXNjLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtbmlsZTQuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLW5pbGU0LmMKaW5kZXggNDk5ZTM1Yy4uYTFhN2M5ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtbmlsZTQuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1uaWxlNC5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtcmMzMjQzNC5jIGIvYXJjaC9taXBzL3BjaS9vcHMtcmMzMjQzNC5jCmluZGV4IDdjNzE4MmUuLjg3NGVkNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLXJjMzI0MzQuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1yYzMyNDM0LmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwppbmRleCAxNjJiNGNiLi4wZjA5ZWFmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCkBAIC03LDcgKzcsNiBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAwNCBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktbWFsdGEuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLW1hbHRhLmMKaW5kZXggMzcxMzRkZC4uZjFhNzM4OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktbWFsdGEuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1tYWx0YS5jCkBAIC0yNDEsOSArMjQxLDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIENoYW5nZSBzdGFydCBhZGRyZXNzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIEFDUEkgYW5kIFNNQiBkZXZpY2VzICovCi0JaWYgKGNvbnRyb2xsZXItPmlvX3Jlc291cmNlLT5zdGFydCA8IDB4MDAwMDIwMDBVTCkKLQkJY29udHJvbGxlci0+aW9fcmVzb3VyY2UtPnN0YXJ0ID0gMHgwMDAwMjAwMFVMOworCS8qIFBJSVg0IEFDUEkgc3RhcnRzIGF0IDB4MTAwMCAqLworCWlmIChjb250cm9sbGVyLT5pb19yZXNvdXJjZS0+c3RhcnQgPCAweDAwMDAxMDAwVUwpCisJCWNvbnRyb2xsZXItPmlvX3Jlc291cmNlLT5zdGFydCA9IDB4MDAwMDEwMDBVTDsKIAogCWlvbWVtX3Jlc291cmNlLmVuZCAmPSAweGZmZmZmZmZmZlVMTDsJCQkvKiA2NCBHQiAqLwogCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSBjb250cm9sbGVyLT5pb19yZXNvdXJjZS0+ZW5kOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktcnQzODgzLmMgYi9hcmNoL21pcHMvcGNpL3BjaS1ydDM4ODMuYwppbmRleCBhZGVmZjJiLi43MjkxOWFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1ydDM4ODMuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1ydDM4ODMuYwpAQCAtNDM2LDkgKzQzNiw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlycGMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwogCWlmIChJU19FUlIocnBjLT5iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIocnBjLT5iYXNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLXhscC5jIGIvYXJjaC9taXBzL3BjaS9wY2kteGxwLmMKaW5kZXggNjUzZDJkYi4uN2JhYmYwMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2kteGxwLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2kteGxwLmMKQEAgLTQ3LDEwICs0NywxMSBAQAogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMvaGFsZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMvbWlwcy1leHRucy5oPgogCiAjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hscC1oYWwvaW9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC9waWMuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC94bHAuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC9waWMuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC9wY2lidXMuaD4KICNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxwLWhhbC9icmlkZ2UuaD4KIApAQCAtNjYsOSArNjcsMjIgQEAKIAl1MzIgKmNmZ2FkZHI7CiAKIAl3aGVyZSAmPSB+MzsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMSAmJiB3aGVyZSA9PSAweDk1NCkKKwlpZiAoY3B1X2lzX3hscDl4eCgpKSB7CisJCS8qIGJlIHZlcnkgY2FyZWZ1bCBvbiBTb0MgYnVzZXMgKi8KKwkJaWYgKGJ1cy0+bnVtYmVyID09IDApIHsKKwkJCS8qIFNjYW4gb25seSBleGlzdGluZyBub2RlcyAtIHVib290IGJ1Zz8gKi8KKwkJCWlmIChQQ0lfU0xPVChkZXZmbikgIT0gMCB8fAorCQkJCQkgICAhbmxtX25vZGVfcHJlc2VudChQQ0lfRlVOQyhkZXZmbikpKQorCQkJCXJldHVybiAweGZmZmZmZmZmOworCQl9IGVsc2UgaWYgKGJ1cy0+cGFyZW50LT5udW1iZXIgPT0gMCkgewkvKiBTb0MgYnVzICovCisJCQlpZiAoUENJX1NMT1QoZGV2Zm4pID09IDApCS8qIGIuMC4wIGhhbmdzICovCisJCQkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJCQlpZiAoZGV2Zm4gPT0gNDQpCQkvKiBiLjUuNCBoYW5ncyAqLworCQkJCXJldHVybiAweGZmZmZmZmZmOworCQl9CisJfSBlbHNlIGlmIChidXMtPm51bWJlciA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAxICYmIHdoZXJlID09IDB4OTU0KSB7CiAJCXJldHVybiAweGZmZmZmZmZmOwotCisJfQogCWNmZ2FkZHIgPSAodTMyICopKHBjaV9jb25maWdfYmFzZSArCiAJCQlwY2lfY2ZnX2FkZHIoYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSkpOwogCWRhdGEgPSAqY2ZnYWRkcjsKQEAgLTE2MiwyNyArMTc2LDM5IEBACiAJLmlvX29mZnNldAk9IDB4MDAwMDAwMDBVTCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqeGxwX2dldF9wY2llX2xpbmsoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldikKK3N0cnVjdCBwY2lfZGV2ICp4bHBfZ2V0X3BjaWVfbGluayhjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfYnVzICpidXMsICpwOwogCi0JLyogRmluZCB0aGUgYnJpZGdlIG9uIGJ1cyAwICovCiAJYnVzID0gZGV2LT5idXM7Ci0JZm9yIChwID0gYnVzLT5wYXJlbnQ7IHAgJiYgcC0+bnVtYmVyICE9IDA7IHAgPSBwLT5wYXJlbnQpCi0JCWJ1cyA9IHA7CiAKLQlyZXR1cm4gcCA/IGJ1cy0+c2VsZiA6IE5VTEw7CisJaWYgKGNwdV9pc194bHA5eHgoKSkgeworCQkvKiBmaW5kIGJ1cyB3aXRoIGdyYW5kIHBhcmVudCBudW1iZXIgPT0gMCAqLworCQlmb3IgKHAgPSBidXMtPnBhcmVudDsgcCAmJiBwLT5wYXJlbnQgJiYgcC0+cGFyZW50LT5udW1iZXIgIT0gMDsKKwkJCQlwID0gcC0+cGFyZW50KQorCQkJYnVzID0gcDsKKwkJcmV0dXJuIChwICYmIHAtPnBhcmVudCkgPyBidXMtPnNlbGYgOiBOVUxMOworCX0gZWxzZSB7CisJCS8qIEZpbmQgdGhlIGJyaWRnZSBvbiBidXMgMCAqLworCQlmb3IgKHAgPSBidXMtPnBhcmVudDsgcCAmJiBwLT5udW1iZXIgIT0gMDsgcCA9IHAtPnBhcmVudCkKKwkJCWJ1cyA9IHA7CisKKwkJcmV0dXJuIHAgPyBidXMtPnNlbGYgOiBOVUxMOworCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgbmxtX3BjaV9saW5rX3RvX2lycShpbnQgbGluaykKK2ludCB4bHBfc29jZGV2X3RvX25vZGUoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmxua2RldikKIHsKLQlyZXR1cm4gUElDX1BDSUVfTElOS18wX0lSUSArIGxpbms7CisJaWYgKGNwdV9pc194bHA5eHgoKSkKKwkJcmV0dXJuIFBDSV9GVU5DKGxua2Rldi0+YnVzLT5zZWxmLT5kZXZmbik7CisJZWxzZQorCQlyZXR1cm4gUENJX1NMT1QobG5rZGV2LT5kZXZmbikgLyA4OwogfQogCiBpbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9kZXYgKmxua2RldjsKLQlpbnQgbG5rc2xvdCwgbG5rZnVuYzsKKwlpbnQgbG5rZnVuYywgbm9kZTsKIAogCS8qCiAJICogRm9yIFhMUCBQQ0llLCB0aGVyZSBpcyBhbiBJUlEgcGVyIExpbmssIGZpbmQgb3V0IHdoaWNoCkBAIC0xOTEsOSArMjE3LDExIEBACiAJbG5rZGV2ID0geGxwX2dldF9wY2llX2xpbmsoZGV2KTsKIAlpZiAobG5rZGV2ID09IE5VTEwpCiAJCXJldHVybiAwOworCiAJbG5rZnVuYyA9IFBDSV9GVU5DKGxua2Rldi0+ZGV2Zm4pOwotCWxua3Nsb3QgPSBQQ0lfU0xPVChsbmtkZXYtPmRldmZuKTsKLQlyZXR1cm4gbmxtX2lycV90b194aXJxKGxua3Nsb3QgLyA4LCBubG1fcGNpX2xpbmtfdG9faXJxKGxua2Z1bmMpKTsKKwlub2RlID0geGxwX3NvY2Rldl90b19ub2RlKGxua2Rldik7CisKKwlyZXR1cm4gbmxtX2lycV90b194aXJxKG5vZGUsIFBJQ19QQ0lFX0xJTktfTEVHQUNZX0lSUShsbmtmdW5jKSk7CiB9CiAKIC8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KQEAgLTIyMCwxNyArMjQ4LDM4IEBACiAJICogIEVuYWJsZSBieXRlIHN3YXAgaW4gaGFyZHdhcmUuIFByb2dyYW0gZWFjaCBsaW5rJ3MgUENJZSBTV0FQIHJlZ2lvbnMKIAkgKiBmcm9tIHRoZSBsaW5rJ3MgYWRkcmVzcyByYW5nZXMuCiAJICovCi0JcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLCBCUklER0VfUENJRU1FTV9CQVNFMCArIGxpbmspOwotCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsIFBDSUVfQllURV9TV0FQX01FTV9CQVNFLCByZWcpOworCWlmIChjcHVfaXNfeGxwOXh4KCkpIHsKKwkJcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLAorCQkJCUJSSURHRV85WFhfUENJRU1FTV9CQVNFMCArIGxpbmspOworCQlubG1fd3JpdGVfcGNpX3JlZyhsbmtiYXNlLCBQQ0lFXzlYWF9CWVRFX1NXQVBfTUVNX0JBU0UsIHJlZyk7CiAKLQlyZWcgPSBubG1fcmVhZF9icmlkZ2VfcmVnKG5idWJhc2UsIEJSSURHRV9QQ0lFTUVNX0xJTUlUMCArIGxpbmspOwotCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsIFBDSUVfQllURV9TV0FQX01FTV9MSU0sIHJlZyB8IDB4ZmZmKTsKKwkJcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLAorCQkJCUJSSURHRV85WFhfUENJRU1FTV9MSU1JVDAgKyBsaW5rKTsKKwkJbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwKKwkJCQlQQ0lFXzlYWF9CWVRFX1NXQVBfTUVNX0xJTSwgcmVnIHwgMHhmZmYpOwogCi0JcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLCBCUklER0VfUENJRUlPX0JBU0UwICsgbGluayk7Ci0JbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwgUENJRV9CWVRFX1NXQVBfSU9fQkFTRSwgcmVnKTsKKwkJcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLAorCQkJCUJSSURHRV85WFhfUENJRUlPX0JBU0UwICsgbGluayk7CisJCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsIFBDSUVfOVhYX0JZVEVfU1dBUF9JT19CQVNFLCByZWcpOwogCi0JcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLCBCUklER0VfUENJRUlPX0xJTUlUMCArIGxpbmspOwotCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsIFBDSUVfQllURV9TV0FQX0lPX0xJTSwgcmVnIHwgMHhmZmYpOworCQlyZWcgPSBubG1fcmVhZF9icmlkZ2VfcmVnKG5idWJhc2UsCisJCQkJQlJJREdFXzlYWF9QQ0lFSU9fTElNSVQwICsgbGluayk7CisJCW5sbV93cml0ZV9wY2lfcmVnKGxua2Jhc2UsCisJCQkJUENJRV85WFhfQllURV9TV0FQX0lPX0xJTSwgcmVnIHwgMHhmZmYpOworCX0gZWxzZSB7CisJCXJlZyA9IG5sbV9yZWFkX2JyaWRnZV9yZWcobmJ1YmFzZSwgQlJJREdFX1BDSUVNRU1fQkFTRTAgKyBsaW5rKTsKKwkJbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwgUENJRV9CWVRFX1NXQVBfTUVNX0JBU0UsIHJlZyk7CisKKwkJcmVnID0gbmxtX3JlYWRfYnJpZGdlX3JlZyhuYnViYXNlLAorCQkJCQlCUklER0VfUENJRU1FTV9MSU1JVDAgKyBsaW5rKTsKKwkJbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwgUENJRV9CWVRFX1NXQVBfTUVNX0xJTSwgcmVnIHwgMHhmZmYpOworCisJCXJlZyA9IG5sbV9yZWFkX2JyaWRnZV9yZWcobmJ1YmFzZSwgQlJJREdFX1BDSUVJT19CQVNFMCArIGxpbmspOworCQlubG1fd3JpdGVfcGNpX3JlZyhsbmtiYXNlLCBQQ0lFX0JZVEVfU1dBUF9JT19CQVNFLCByZWcpOworCisJCXJlZyA9IG5sbV9yZWFkX2JyaWRnZV9yZWcobmJ1YmFzZSwgQlJJREdFX1BDSUVJT19MSU1JVDAgKyBsaW5rKTsKKwkJbmxtX3dyaXRlX3BjaV9yZWcobG5rYmFzZSwgUENJRV9CWVRFX1NXQVBfSU9fTElNLCByZWcgfCAweGZmZik7CisJfQogfQogI2Vsc2UKIC8qIFN3YXAgY29uZmlndXJhdGlvbiBub3QgbmVlZGVkIGluIGxpdHRsZS1lbmRpYW4gbW9kZSAqLwpAQCAtMjM5LDcgKzI4OCw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQogewotCXN0cnVjdCBubG1fc29jX2luZm8gKm5vZGVwOwogCXVpbnQ2NF90IHBjaWViYXNlOwogCWludCBsaW5rLCBuOwogCXUzMiByZWc7CkBAIC0yNTMsMjAgKzMwMSwyMCBAQAogCWlvcG9ydF9yZXNvdXJjZS5lbmQgICA9IH4wOwogCiAJZm9yIChuID0gMDsgbiA8IE5MTV9OUl9OT0RFUzsgbisrKSB7Ci0JCW5vZGVwID0gbmxtX2dldF9ub2RlKG4pOwotCQlpZiAoIW5vZGVwLT5jb3JlbWFzaykKLQkJCWNvbnRpbnVlOwkvKiBub2RlIGRvZXMgbm90IGV4aXN0ICovCisJCWlmICghbmxtX25vZGVfcHJlc2VudChuKSkKKwkJCWNvbnRpbnVlOwogCi0JCWZvciAobGluayA9IDA7IGxpbmsgPCA0OyBsaW5rKyspIHsKKwkJZm9yIChsaW5rID0gMDsgbGluayA8IFBDSUVfTkxJTktTOyBsaW5rKyspIHsKIAkJCXBjaWViYXNlID0gbmxtX2dldF9wY2llX2Jhc2UobiwgbGluayk7CiAJCQlpZiAobmxtX3JlYWRfcGNpX3JlZyhwY2llYmFzZSwgMCkgPT0gMHhmZmZmZmZmZikKIAkJCQljb250aW51ZTsKIAkJCXhscF9jb25maWdfcGNpX2Jzd2FwKG4sIGxpbmspOworCQkJeGxwX2luaXRfbm9kZV9tc2lfaXJxcyhuLCBsaW5rKTsKIAogCQkJLyogcHV0IGluIGludHBpbiBhbmQgaXJxIC0gdS1ib290IGRvZXMgbm90ICovCiAJCQlyZWcgPSBubG1fcmVhZF9wY2lfcmVnKHBjaWViYXNlLCAweGYpOwotCQkJcmVnICY9IH4weDFmdTsKLQkJCXJlZyB8PSAoMSA8PCA4KSB8IG5sbV9wY2lfbGlua190b19pcnEobGluayk7CisJCQlyZWcgJj0gfjB4MWZmdTsKKwkJCXJlZyB8PSAoMSA8PCA4KSB8IFBJQ19QQ0lFX0xJTktfTEVHQUNZX0lSUShsaW5rKTsKIAkJCW5sbV93cml0ZV9wY2lfcmVnKHBjaWViYXNlLCAweGYsIHJlZyk7CiAJCQlwcl9pbmZvKCJYTFAgUENJZTogTGluayAlZC0lZCBpbml0aWFsaXplZC5cbiIsIG4sIGxpbmspOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jcy1tc3A3MXh4L0tjb25maWcgYi9hcmNoL21pcHMvcG1jcy1tc3A3MXh4L0tjb25maWcKaW5kZXggMzQ4MmI4Yy4uNjA3M2NhNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtY3MtbXNwNzF4eC9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9wbWNzLW1zcDcxeHgvS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAlib29sICJQTUMtU2llcnJhIE1TUDQyMDAgRXZhbCBCb2FyZCIKIAlzZWxlY3QgSVJRX01TUF9TTFAKIAlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzQKIAogY29uZmlnIFBNQ19NU1A0MjAwX0dXCiAJYm9vbCAiUE1DLVNpZXJyYSBNU1A0MjAwIFZvSVAgR2F0ZXdheSIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZyBiL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZwppbmRleCA0MjRmMDM0Li4xYmZkMWMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmFsaW5rL0tjb25maWcKKysrIGIvYXJjaC9taXBzL3JhbGluay9LY29uZmlnCkBAIC0xNSw2ICsxNSw3IEBACiAKIAljb25maWcgU09DX1JUMjg4WAogCQlib29sICJSVDI4OHgiCisJCXNlbGVjdCBNSVBTX0wxX0NBQ0hFX1NISUZUXzQKIAogCWNvbmZpZyBTT0NfUlQzMDVYCiAJCWJvb2wgIlJUMzA1eCIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWNvbnNvbGUuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWNvbnNvbGUuYwppbmRleCBiOTUyZDViLi40NWZkZmJjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1jb25zb2xlLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctY29uc29sZS5jCkBAIC01LDcgKzUsNiBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSYWxmIEJhZWNobGUKICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEtcGNpLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEtcGNpLmMKaW5kZXggZWMyMmVjNS4uMmExYzQwNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLXBjaS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS1wY2kuYwpAQCAtOCw3ICs4LDYgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsY29uZmlnLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1rbGNvbmZpZy5jCmluZGV4IDdhZmUxNDYuLmM4NzNkNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsY29uZmlnLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjcta2xjb25maWcuYwpAQCAtMiw3ICsyLDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBSYWxmIEJhZWNobGUgKHJhbGZAZ251Lm9yZykKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXh0YWxrLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy14dGFsay5jCmluZGV4IGQ1OWI4MjAuLjIwZjU4MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXh0YWxrLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjcteHRhbGsuYwpAQCAtNyw3ICs3LDYgQEAKICAqIEdlbmVyaWMgWFRBTEsgaW5pdGlhbGl6YXRpb24gY29kZQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvTWFrZWZpbGUgYi9hcmNoL21uMTAzMDAvTWFrZWZpbGUKaW5kZXggYTNkMGZlZi4uM2YxZWE1ZCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL01ha2VmaWxlCisrKyBiL2FyY2gvbW4xMDMwMC9NYWtlZmlsZQpAQCAtOTIsMTQgKzkyLDYgQEAKICAgZWNobyAgJyogekltYWdlICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UpJwogZW5kZWYKIAotIyBJZiB5b3UgbWFrZSBzdXJlIHRoZSAuUyBmaWxlcyBnZXQgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvLAotIyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBkaXNhYmxlIG9wdGltaXNhdGlvbnMKLSMgdGhhdCBhcmUgdW5oZWxwZnVsIHdoaWxzdCBkZWJ1Z2dpbmcuCi1pZmRlZiBDT05GSUdfREVCVUdfSU5GTwotI0tCVUlMRF9DRkxBR1MJKz0gLU8xCi1LQlVJTERfQUZMQUdTCSs9IC1XYSwtLWdkd2FyZjIKLWVuZGlmCi0KICMKICMgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLSBhbmQgdW5pdC1zcGVjaWZpYyBoZWFkZXJzCiAjCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvZW50cnkuUwppbmRleCBkOGE0NTVlLi5mZWM4YmY5IDEwMDY0NAotLS0gYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL2VudHJ5LlMKQEAgLTg1MywzOCArODUzLDQ1IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyByZXR1cm4gXSA9PT0gKi8KIAotX3dvcmtfcGVuZGluZzoKLQkvKgotCSAqIGlmIChjdXJyZW50X3RocmVhZF9pbmZvLT5mbGFncyAmIF9USUZfTkVFRF9SRVNDSEVEKQotCSAqICAgICBzY2hlZHVsZSgpOwotCSAqLwotCWwubHd6ICAgcjUsVElfRkxBR1MocjEwKQotCWwuYW5kaQlyMyxyNSxfVElGX05FRURfUkVTQ0hFRAotCWwuc2ZuZWkgcjMsMAotCWwuYm5mICAgX3dvcmtfbm90aWZ5c2lnCi0JIGwubm9wCi0JbC5qYWwgICBzY2hlZHVsZQotCSBsLm5vcAotCWwuaglfcmVzdW1lX3VzZXJzcGFjZQotCSBsLm5vcAotCi0vKiBIYW5kbGUgcGVuZGluZyBzaWduYWxzIGFuZCBub3RpZnktcmVzdW1lIHJlcXVlc3RzLgotICogZG9fbm90aWZ5X3Jlc3VtZSBtdXN0IGJlIHBhc3NlZCB0aGUgbGF0ZXN0IHB1c2hlZCBwdF9yZWdzLCBub3QKLSAqIG5lY2Vzc2FyaWx5IHRoZSAidXNlcnNwYWNlIiBvbmVzLiAgQWxzbywgcHRfcmVncy0+c3lzY2FsbG5vCi0gKiBtdXN0IGJlIHNldCBzbyB0aGF0IHRoZSBzeXNjYWxsIHJlc3RhcnQgZnVuY3Rpb25hbGl0eSB3b3Jrcy4KLSAqLwotX3dvcmtfbm90aWZ5c2lnOgotCWwuamFsCWRvX25vdGlmeV9yZXN1bWUKLQkgbC5vcmkJcjMscjEsMAkJICAvKiBwdF9yZWdzICovCi0KIF9yZXN1bWVfdXNlcnNwYWNlOgogCURJU0FCTEVfSU5URVJSVVBUUyhyMyxyNCkKLQlsLmx3eglyMyxUSV9GTEFHUyhyMTApCi0JbC5hbmRpCXIzLHIzLF9USUZfV09SS19NQVNLCi0JbC5zZm5laQlyMywwCi0JbC5iZglfd29ya19wZW5kaW5nCisJbC5sd3oJcjQsVElfRkxBR1MocjEwKQorCWwuYW5kaQlyMTMscjQsX1RJRl9XT1JLX01BU0sKKwlsLnNmZXFpCXIxMywwCisJbC5iZglfcmVzdG9yZV9hbGwKIAkgbC5ub3AKIAorX3dvcmtfcGVuZGluZzoKKwlsLmx3eglyNSxQVF9PUklHX0dQUjExKHIxKQorCWwuc2ZsdHNpIHI1LDAKKwlsLmJuZgkxZgorCSBsLm5vcAorCWwuYW5kaQlyNSxyNSwwCisxOgorCWwuamFsCWRvX3dvcmtfcGVuZGluZworCSBsLm9yaQlyMyxyMSwwCQkJLyogcHRfcmVncyAqLworCisJbC5zZmVxaQlyMTEsMAorCWwuYmYJX3Jlc3RvcmVfYWxsCisJIGwubm9wCisJbC5zZmx0c2kgcjExLDAKKwlsLmJuZgkxZgorCSBsLm5vcAorCWwuYW5kCXIxMSxyMTEscjAKKwlsLm9yaQlyMTEscjExLF9fTlJfcmVzdGFydF9zeXNjYWxsCisJbC5qCV9zeXNjYWxsX2NoZWNrX3RyYWNlX2VudGVyCisJIGwubm9wCisxOgorCWwubHd6CXIxMSxQVF9PUklHX0dQUjExKHIxKQorCS8qIFJlc3RvcmUgYXJnIHJlZ2lzdGVycyAqLworCWwubHd6CXIzLFBUX0dQUjMocjEpCisJbC5sd3oJcjQsUFRfR1BSNChyMSkKKwlsLmx3eglyNSxQVF9HUFI1KHIxKQorCWwubHd6CXI2LFBUX0dQUjYocjEpCisJbC5sd3oJcjcsUFRfR1BSNyhyMSkKKwlsLmoJX3N5c2NhbGxfY2hlY2tfdHJhY2VfZW50ZXIKKwkgbC5sd3oJcjgsUFRfR1BSOChyMSkKKwogX3Jlc3RvcmVfYWxsOgogCVJFU1RPUkVfQUxMCiAJLyogVGhpcyByZXR1cm5zIHRvIHVzZXJzcGFjZSBjb2RlICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3NpZ25hbC5jCmluZGV4IGFlMTY3ZjcuLjY2Nzc1YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3NpZ25hbC5jCkBAIC0yOCwyNCArMjgsMjQgQEAKICNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNkZWZpbmUgREVCVUdfU0lHIDAKIAogc3RydWN0IHJ0X3NpZ2ZyYW1lIHsKLQlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87Ci0Jdm9pZCAqcHVjOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHVjb250ZXh0IHVjOwogCXVuc2lnbmVkIGNoYXIgcmV0Y29kZVsxNl07CS8qIHRyYW1wb2xpbmUgY29kZSAqLwogfTsKIAotc3RhdGljIGludCByZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3N0YXRpYyBpbnQgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKIHsKLQl1bnNpZ25lZCBpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMDsKIAotCS8qIEFsd3lzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxsIHJldHVybiAtRUlOVFIgKi8KKwkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKIAkvKgpAQCAtNTMsMjUgKzUzLDIxIEBACiAJICogKHNjIGlzIGFscmVhZHkgY2hlY2tlZCBmb3IgVkVSSUZZX1JFQUQgc2luY2UgdGhlIHNpZ2ZyYW1lIHdhcwogCSAqICBjaGVja2VkIGluIHN5c19zaWdyZXR1cm4gcHJldmlvdXNseSkKIAkgKi8KLQlpZiAoX19jb3B5X2Zyb21fdXNlcihyZWdzLCBzYy0+cmVncy5ncHIsIDMyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJZ290byBiYWRmcmFtZTsKLQlpZiAoX19jb3B5X2Zyb21fdXNlcigmcmVncy0+cGMsICZzYy0+cmVncy5wYywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJZ290byBiYWRmcmFtZTsKLQlpZiAoX19jb3B5X2Zyb21fdXNlcigmcmVncy0+c3IsICZzYy0+cmVncy5zciwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJZ290byBiYWRmcmFtZTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcihyZWdzLCBzYy0+cmVncy5ncHIsIDMyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigmcmVncy0+cGMsICZzYy0+cmVncy5wYywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigmcmVncy0+c3IsICZzYy0+cmVncy5zciwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAogCS8qIG1ha2Ugc3VyZSB0aGUgU00tYml0IGlzIGNsZWFyZWQgc28gdXNlci1tb2RlIGNhbm5vdCBmb29sIHVzICovCiAJcmVncy0+c3IgJj0gflNQUl9TUl9TTTsKIAorCXJlZ3MtPm9yaWdfZ3ByMTEgPSAtMTsJLyogQXZvaWQgc3lzY2FsbCByZXN0YXJ0IGNoZWNrcyAqLworCiAJLyogVE9ETzogdGhlIG90aGVyIHBvcnRzIHVzZSByZWdzLT5vcmlnX1hYIHRvIGRpc2FibGUgc3lzY2FsbCBjaGVja3MKIAkgKiBhZnRlciB0aGlzIGNvbXBsZXRlcywgYnV0IHdlIGRvbid0IHVzZSB0aGF0IG1lY2hhbmlzbS4gbWF5YmUgd2UgY2FuCiAJICogdXNlIGl0IG5vdyA/CiAJICovCiAKIAlyZXR1cm4gZXJyOwotCi1iYWRmcmFtZToKLQlyZXR1cm4gMTsKIH0KIAogYXNtbGlua2FnZSBsb25nIF9zeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTExLDIxICsxMDcsMTggQEAKICAqIFNldCB1cCBhIHNpZ25hbCBmcmFtZS4KICAqLwogCi1zdGF0aWMgaW50IHNldHVwX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgKnNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgICB1bnNpZ25lZCBsb25nIG1hc2spCitzdGF0aWMgaW50IHNldHVwX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCiB7CiAJaW50IGVyciA9IDA7CiAKIAkvKiBjb3B5IHRoZSByZWdzICovCi0KKwkvKiBUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBzYXZlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgaGVyZS4uLgorCSAqIC4uLmJ1dCB3ZSBzYXZlIHRoZW0gYW55d2F5LiAgUmV2aXNpdCB0aGlzCisJICovCiAJZXJyIHw9IF9fY29weV90b191c2VyKHNjLT5yZWdzLmdwciwgcmVncywgMzIgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmc2MtPnJlZ3MucGMsICZyZWdzLT5wYywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJnNjLT5yZWdzLnNyLCAmcmVncy0+c3IsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKLQkvKiB0aGVuIHNvbWUgb3RoZXIgc3R1ZmYgKi8KLQotCWVyciB8PSBfX3B1dF91c2VyKG1hc2ssICZzYy0+b2xkbWFzayk7Ci0KIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNzMsNTUgKzE2Niw1MyBAQAogICogdHJhbXBvbGluZSB3aGljaCBwZXJmb3JtcyB0aGUgc3lzY2FsbCBzaWdyZXR1cm4sIG9yIGEgcHJvdmlkZWQKICAqIHVzZXItbW9kZSB0cmFtcG9saW5lLgogICovCi1zdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKLQkJCSAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzaWdzZXRfdCAqc2V0LAorCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lOwogCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2lwOwogCWludCBlcnIgPSAwOwogCi0JZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKwlmcmFtZSA9IGdldF9zaWdmcmFtZSgma3NpZy0+a2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKLQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7CisJLyogQ3JlYXRlIHNpZ2luZm8uICAqLworCWlmIChrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCisJCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKTsKIAotCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKLQlpZiAoZXJyKQotCQlnb3RvIGdpdmVfc2lnc2VndjsKLQotCS8qIENsZWFyIGFsbCB0aGUgYml0cyBvZiB0aGUgdWNvbnRleHQgd2UgZG9uJ3QgdXNlLiAgKi8KLQllcnIgfD0gX19jbGVhcl91c2VyKCZmcmFtZS0+dWMsIG9mZnNldG9mKHN0cnVjdCB1Y29udGV4dCwgdWNfbWNvbnRleHQpKTsKKwkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKIAllcnIgfD0gX19wdXRfdXNlcihOVUxMLCAmZnJhbWUtPnVjLnVjX2xpbmspOwogCWVyciB8PSBfX3NhdmVfYWx0c3RhY2soJmZyYW1lLT51Yy51Y19zdGFjaywgcmVncy0+c3ApOwotCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsIHJlZ3MsIHNldC0+c2lnWzBdKTsKKwllcnIgfD0gc2V0dXBfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0KTsKIAogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKIAogCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIHRyYW1wb2xpbmUgLSB0aGUgZGVzaXJlZCByZXR1cm4gaXAgaXMgdGhlIHJldGNvZGUgaXRzZWxmICovCiAJcmV0dXJuX2lwID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5yZXRjb2RlOwotCS8qIFRoaXMgaXMgbC5vcmkgcjExLHIwLF9fTlJfc2lncmV0dXJuLCBsLnN5cyAxICovCi0JZXJyIHw9IF9fcHV0X3VzZXIoMHhhOTYwLCAoc2hvcnQgKikoZnJhbWUtPnJldGNvZGUgKyAwKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChzaG9ydCAqKShmcmFtZS0+cmV0Y29kZSArIDIpKTsKKwkvKiBUaGlzIGlzOgorCQlsLm9yaSByMTEscjAsX19OUl9zaWdyZXR1cm4KKwkJbC5zeXMgMQorCSAqLworCWVyciB8PSBfX3B1dF91c2VyKDB4YTk2MCwgICAgICAgICAgICAgKHNob3J0ICopKGZyYW1lLT5yZXRjb2RlICsgMCkpOworCWVyciB8PSBfX3B1dF91c2VyKF9fTlJfcnRfc2lncmV0dXJuLCAgKHNob3J0ICopKGZyYW1lLT5yZXRjb2RlICsgMikpOwogCWVyciB8PSBfX3B1dF91c2VyKDB4MjAwMDAwMDEsICh1bnNpZ25lZCBsb25nICopKGZyYW1lLT5yZXRjb2RlICsgNCkpOwogCWVyciB8PSBfX3B1dF91c2VyKDB4MTUwMDAwMDAsICh1bnNpZ25lZCBsb25nICopKGZyYW1lLT5yZXRjb2RlICsgOCkpOwogCiAJaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogVE9ETyB3aGF0IGlzIHRoZSBjdXJyZW50LT5leGVjX2RvbWFpbiBzdHVmZiBhbmQgaW52bWFwID8gKi8KIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCi0JcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfaGFuZGxlcjsgLyogd2hhdCB3ZSBlbnRlciBOT1cgKi8KKwlyZWdzLT5wYyA9ICh1bnNpZ25lZCBsb25nKWtzaWctPmthLnNhLnNhX2hhbmRsZXI7IC8qIHdoYXQgd2UgZW50ZXIgTk9XICovCiAJcmVncy0+Z3ByWzldID0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2lwOyAgICAgLyogd2hhdCB3ZSBlbnRlciBMQVRFUiAqLwotCXJlZ3MtPmdwclszXSA9ICh1bnNpZ25lZCBsb25nKXNpZzsgICAgICAgICAgIC8qIGFyZyAxOiBzaWdubyAqLworCXJlZ3MtPmdwclszXSA9ICh1bnNpZ25lZCBsb25nKWtzaWctPnNpZzsgICAgICAgICAgIC8qIGFyZyAxOiBzaWdubyAqLwogCXJlZ3MtPmdwcls0XSA9ICh1bnNpZ25lZCBsb25nKSZmcmFtZS0+aW5mbzsgIC8qIGFyZyAyOiAoc2lnaW5mb190KikgKi8KIAlyZWdzLT5ncHJbNV0gPSAodW5zaWduZWQgbG9uZykmZnJhbWUtPnVjOyAgICAvKiBhcmcgMzogdWNvbnRleHQgKi8KIApAQCAtMjI5LDI1ICsyMjAsMTYgQEAKIAlyZWdzLT5zcCA9ICh1bnNpZ25lZCBsb25nKWZyYW1lOwogCiAJcmV0dXJuIDA7Ci0KLWdpdmVfc2lnc2VndjoKLQlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywKLQkgICAgICBzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitoYW5kbGVfc2lnbmFsKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgc2lnbWFza190b19zYXZlKCksIHJlZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybjsKKwlyZXQgPSBzZXR1cF9ydF9mcmFtZShrc2lnLCBzaWdtYXNrX3RvX3NhdmUoKSwgcmVncyk7CiAKLQlzaWduYWxfZGVsaXZlcmVkKHNpZywgaW5mbywga2EsIHJlZ3MsCi0JCQkJIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKKwlzaWduYWxfc2V0dXBfZG9uZShyZXQsIGtzaWcsIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKIH0KIAogLyoKQEAgLTI2Miw4MiArMjQ0LDk5IEBACiAgKiBtb2RlIGJlbG93LgogICovCiAKLXZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHN5c2NhbGwpCiB7Ci0Jc2lnaW5mb190IGluZm87Ci0JaW50IHNpZ25yOwotCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKwlzdHJ1Y3Qga3NpZ25hbCBrc2lnOworCXVuc2lnbmVkIGxvbmcgY29udGludWVfYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyByZXN0YXJ0X2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gMDsKKwlpbnQgcmVzdGFydCA9IDA7CisKKwlpZiAoc3lzY2FsbCkgeworCQljb250aW51ZV9hZGRyID0gcmVncy0+cGM7CisJCXJlc3RhcnRfYWRkciA9IGNvbnRpbnVlX2FkZHIgLSA0OworCQlyZXR2YWwgPSByZWdzLT5ncHJbMTFdOworCisJCS8qCisJCSAqIFNldHVwIHN5c2NhbGwgcmVzdGFydCBoZXJlIHNvIHRoYXQgYSBkZWJ1Z2dlciB3aWxsCisJCSAqIHNlZSB0aGUgYWxyZWFkeSBjaGFuZ2VkIFBDLgorCQkgKi8KKwkJc3dpdGNoIChyZXR2YWwpIHsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQkJcmVzdGFydCA9IC0yOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQlyZXN0YXJ0Kys7CisJCQlyZWdzLT5ncHJbMTFdID0gcmVncy0+b3JpZ19ncHIxMTsKKwkJCXJlZ3MtPnBjID0gcmVzdGFydF9hZGRyOworCQkJYnJlYWs7CisJCX0KKwl9CiAKIAkvKgotCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCi0JICogaXMgd2h5IHdlIG1heSBpbiBjZXJ0YWluIGNhc2VzIGdldCBoZXJlIGZyb20KLQkgKiBrZXJuZWwgbW9kZS4gSnVzdCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZwotCSAqIGlmIHNvLgorCSAqIEdldCB0aGUgc2lnbmFsIHRvIGRlbGl2ZXIuICBEdXJpbmcgdGhlIGNhbGwgdG8gZ2V0X3NpZ25hbCB0aGUKKwkgKiBkZWJ1Z2dlciBtYXkgY2hhbmdlIGFsbCBvdXIgcmVnaXN0ZXJzIHNvIHdlIG1heSBuZWVkIHRvIHJldmVydAorCSAqIHRoZSBkZWNpc2lvbiB0byByZXN0YXJ0IHRoZSBzeXNjYWxsOyBzcGVjaWZpY2FsbHksIGlmIHRoZSBQQyBpcworCSAqIGNoYW5nZWQsIGRvbid0IHJlc3RhcnQgdGhlIHN5c2NhbGwuCiAJICovCi0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJldHVybjsKLQotCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwotCi0JLyogSWYgd2UgYXJlIGNvbWluZyBvdXQgb2YgYSBzeXNjYWxsIHRoZW4gd2UgbmVlZAotCSAqIHRvIGNoZWNrIGlmIHRoZSBzeXNjYWxsIHdhcyBpbnRlcnJ1cHRlZCBhbmQgd2FudHMgdG8gYmUKLQkgKiByZXN0YXJ0ZWQgYWZ0ZXIgaGFuZGxpbmcgdGhlIHNpZ25hbC4gIElmIHNvLCB0aGUgb3JpZ2luYWwKLQkgKiBzeXNjYWxsIG51bWJlciBpcyBwdXQgYmFjayBpbnRvIHIxMSBhbmQgdGhlIFBDIHJld291bmQgdG8KLQkgKiBwb2ludCBhdCB0aGUgbC5zeXMgaW5zdHJ1Y3Rpb24gdGhhdCByZXN1bHRlZCBpbiB0aGUKLQkgKiBvcmlnaW5hbCBzeXNjYWxsLiAgU3lzY2FsbCByZXN1bHRzIG90aGVyIHRoYW4gdGhlIGZvdXIKLQkgKiBiZWxvdyBtZWFuIHRoYXQgdGhlIHN5c2NhbGwgZXhlY3V0ZWQgdG8gY29tcGxldGlvbiBhbmQgbm8KLQkgKiByZXN0YXJ0IGlzIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAocmVncy0+b3JpZ19ncHIxMSkgewotCQlpbnQgcmVzdGFydCA9IDA7Ci0KLQkJc3dpdGNoIChyZWdzLT5ncHJbMTFdKSB7Ci0JCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKLQkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6Ci0JCQkvKiBSZXN0YXJ0IGlmIHRoZXJlIGlzIG5vIHNpZ25hbCBoYW5kbGVyICovCi0JCQlyZXN0YXJ0ID0gKHNpZ25yIDw9IDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVSRVNUQVJUU1lTOgotCQkJLyogUmVzdGFydCBpZiB0aGVyZSBubyBzaWduYWwgaGFuZGxlciBvcgotCQkJICogU0FfUkVTVEFSVCBmbGFnIGlzIHNldCAqLwotCQkJcmVzdGFydCA9IChzaWduciA8PSAwIHx8IChrYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKLQkJCS8qIEFsd2F5cyByZXN0YXJ0ICovCi0JCQlyZXN0YXJ0ID0gMTsKLQkJCWJyZWFrOworCWlmIChnZXRfc2lnbmFsKCZrc2lnKSkgeworCQlpZiAodW5saWtlbHkocmVzdGFydCkgJiYgcmVncy0+cGMgPT0gcmVzdGFydF9hZGRyKSB7CisJCQlpZiAocmV0dmFsID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkJICAgIHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCisJCQkgICAgfHwgKHJldHZhbCA9PSAtRVJFU1RBUlRTWVMKKwkJCSAgICAgICAgJiYgIShrc2lnLmthLnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpKSB7CisJCQkJLyogTm8gYXV0b21hdGljIHJlc3RhcnQgKi8KKwkJCQlyZWdzLT5ncHJbMTFdID0gLUVJTlRSOworCQkJCXJlZ3MtPnBjID0gY29udGludWVfYWRkcjsKKwkJCX0KIAkJfQotCi0JCWlmIChyZXN0YXJ0KSB7Ci0JCQlpZiAocmVncy0+Z3ByWzExXSA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKQotCQkJCXJlZ3MtPmdwclsxMV0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKLQkJCWVsc2UKLQkJCQlyZWdzLT5ncHJbMTFdID0gcmVncy0+b3JpZ19ncHIxMTsKLQkJCXJlZ3MtPnBjIC09IDQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5ncHJbMTFdID0gLUVJTlRSOwotCQl9Ci0JfQotCi0JaWYgKHNpZ25yIDw9IDApIHsKLQkJLyogbm8gc2lnbmFsIHRvIGRlbGl2ZXIgc28gd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sKLQkJICogYmFjayAqLworCQloYW5kbGVfc2lnbmFsKCZrc2lnLCByZWdzKTsKKwl9IGVsc2UgeworCQkvKiBubyBoYW5kbGVyICovCiAJCXJlc3RvcmVfc2F2ZWRfc2lnbWFzaygpOwotCX0gZWxzZSB7CQkvKiBzaWduciA+IDAgKi8KLQkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIHJlZ3MpOworCQkvKgorCQkgKiBSZXN0b3JlIHB0X3JlZ3MgUEMgYXMgc3lzY2FsbCByZXN0YXJ0IHdpbGwgYmUgaGFuZGxlZCBieQorCQkgKiBrZXJuZWwgd2l0aG91dCByZXR1cm4gdG8gdXNlcnNwYWNlCisJCSAqLworCQlpZiAodW5saWtlbHkocmVzdGFydCkgJiYgcmVncy0+cGMgPT0gcmVzdGFydF9hZGRyKSB7CisJCQlyZWdzLT5wYyA9IGNvbnRpbnVlX2FkZHI7CisJCQlyZXR1cm4gcmVzdGFydDsKKwkJfQogCX0KIAotCXJldHVybjsKKwlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludAorZG9fd29ya19wZW5kaW5nKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgdGhyZWFkX2ZsYWdzLCBpbnQgc3lzY2FsbCkKIHsKLQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyAmIF9USUZfU0lHUEVORElORykKLQkJZG9fc2lnbmFsKHJlZ3MpOwotCi0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwotCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKLQl9CisJZG8geworCQlpZiAobGlrZWx5KHRocmVhZF9mbGFncyAmIF9USUZfTkVFRF9SRVNDSEVEKSkgeworCQkJc2NoZWR1bGUoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh1bmxpa2VseSghdXNlcl9tb2RlKHJlZ3MpKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX1NJR1BFTkRJTkcpIHsKKwkJCQlpbnQgcmVzdGFydCA9IGRvX3NpZ25hbChyZWdzLCBzeXNjYWxsKTsKKwkJCQlpZiAodW5saWtlbHkocmVzdGFydCkpIHsKKwkJCQkJLyoKKwkJCQkJICogUmVzdGFydCB3aXRob3V0IGhhbmRsZXJzLgorCQkJCQkgKiBEZWFsIHdpdGggaXQgd2l0aG91dCBsZWF2aW5nCisJCQkJCSAqIHRoZSBrZXJuZWwgc3BhY2UuCisJCQkJCSAqLworCQkJCQlyZXR1cm4gcmVzdGFydDsKKwkJCQl9CisJCQkJc3lzY2FsbCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKKwkJCX0KKwkJfQorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl0aHJlYWRfZmxhZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzOworCX0gd2hpbGUgKHRocmVhZF9mbGFncyAmIF9USUZfV09SS19NQVNLKTsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2hwdXgvZnMuYyBiL2FyY2gvcGFyaXNjL2hwdXgvZnMuYwppbmRleCA4OGQwOTYyLi4yYmVkYWZlIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9ocHV4L2ZzLmMKKysrIGIvYXJjaC9wYXJpc2MvaHB1eC9mcy5jCkBAIC0zMywyMiArMzMsOSBAQAogCiBpbnQgaHB1eF9leGVjdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmaWxlbmFtZSAqZmlsZW5hbWU7Ci0KLQlmaWxlbmFtZSA9IGdldG5hbWUoKGNvbnN0IGNoYXIgX191c2VyICopIHJlZ3MtPmdyWzI2XSk7Ci0JZXJyb3IgPSBQVFJfRVJSKGZpbGVuYW1lKTsKLQlpZiAoSVNfRVJSKGZpbGVuYW1lKSkKLQkJZ290byBvdXQ7Ci0KLQllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZS0+bmFtZSwKKwlyZXR1cm4gIGRvX2V4ZWN2ZShnZXRuYW1lKChjb25zdCBjaGFyIF9fdXNlciAqKSByZWdzLT5nclsyNl0pLAogCQkJICAoY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqKSByZWdzLT5nclsyNV0sCiAJCQkgIChjb25zdCBjaGFyIF9fdXNlciAqY29uc3QgX191c2VyICopIHJlZ3MtPmdyWzI0XSk7Ci0KLQlwdXRuYW1lKGZpbGVuYW1lKTsKLQotb3V0OgotCXJldHVybiBlcnJvcjsKIH0KIAogc3RydWN0IGhwdXhfZGlyZW50IHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAppbmRleCAyZjliNzUxLi5kZTY1ZjY2IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCkBAIC0xMzIsNyArMTMyLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAltaWdodF9zbGVlcCgpOwotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CiB9CiAKQEAgLTE0NCw3ICsxNDMsNiBAQAogc3RhdGljIGlubGluZSB2b2lkICprbWFwX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYWQyYjUwMy4uMzM5MWQwNiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTM0OCw0ICszNDgsOCBAQAogCiAjZGVmaW5lIEVMRl9IV0NBUAkwCiAKK3N0cnVjdCBtbV9zdHJ1Y3Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqKTsKKyNkZWZpbmUgYXJjaF9yYW5kb21pemVfYnJrIGFyY2hfcmFuZG9taXplX2JyaworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCBjNTNmYzYzLi42MzdmZTAzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0yOSw3ICsyOSw4IEBACiB2b2lkIGNsZWFyX3BhZ2VfYXNtKHZvaWQgKnBhZ2UpOwogdm9pZCBjb3B5X3BhZ2VfYXNtKHZvaWQgKnRvLCB2b2lkICpmcm9tKTsKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHZ0bywgdmFkZHIsIHBhZ2UpIGNsZWFyX3BhZ2VfYXNtKHZ0bykKLSNkZWZpbmUgY29weV91c2VyX3BhZ2UodnRvLCB2ZnJvbSwgdmFkZHIsIHBhZ2UpIGNvcHlfcGFnZV9hc20odnRvLCB2ZnJvbSkKK3ZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdnRvLCB2b2lkICp2ZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkciwKKwkJCXN0cnVjdCBwYWdlICpwZyk7CiAKIC8qICNkZWZpbmUgQ09ORklHX1BBUklTQ19UTVBBTElBUyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggMzQ4OTliNS4uMjJiODlkMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNTExLDYgKzUxMSw3IEBACiAvKiBXZSBwcm92aWRlIG91ciBvd24gZ2V0X3VubWFwcGVkX2FyZWEgdG8gcHJvdmlkZSBjYWNoZSBjb2hlcmVuY3kgKi8KIAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQorI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQV9UT1BET1dOCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggY2MyMjkwYS4uMTk4YTg2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTMwLDYgKzMwLDggQEAKICNlbmRpZgogI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICh7IHZvaWQgKnBjOyBjdXJyZW50X2lhKHBjKTsgcGM7IH0pCiAKKyNkZWZpbmUgSEFWRV9BUkNIX1BJQ0tfTU1BUF9MQVlPVVQKKwogI2RlZmluZSBUQVNLX1NJWkVfT0YodHNrKSAgICAgICAoKHRzayktPnRocmVhZC50YXNrX3NpemUpCiAjZGVmaW5lIFRBU0tfU0laRQkgICAgICAgIFRBU0tfU0laRV9PRihjdXJyZW50KQogI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UgICAgICAoY3VycmVudC0+dGhyZWFkLm1hcF9iYXNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggZDVmOTdlYS4uNGI5YjEwYyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC03Niw2ICs3NiwxNiBAQAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0VfTUFTSyAoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TSU5HTEVTVEVQIHwJXAogCQkJCSBfVElGX0JMT0NLU1RFUCB8IF9USUZfU1lTQ0FMTF9BVURJVCkKIAorI2lmZGVmIENPTkZJR182NEJJVAorIyBpZmRlZiBDT05GSUdfQ09NUEFUCisjICBkZWZpbmUgaXNfMzJiaXRfdGFzaygpCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpCisjIGVsc2UKKyMgIGRlZmluZSBpc18zMmJpdF90YXNrKCkJKDApCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgaXNfMzJiaXRfdGFzaygpCSgxKQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfQVNNX1BBUklTQ19USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL2Vycm5vLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL2Vycm5vLmgKaW5kZXggZjNhOGFhNS4uYzBhZTYyNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9lcnJuby5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vZXJybm8uaApAQCAtMTA2LDcgKzEwNiw3IEBACiAKICNkZWZpbmUJRUFMUkVBRFkJMjQ0CS8qIE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzICovCiAjZGVmaW5lCUVJTlBST0dSRVNTCTI0NQkvKiBPcGVyYXRpb24gbm93IGluIHByb2dyZXNzICovCi0jZGVmaW5lCUVXT1VMREJMT0NLCTI0NgkvKiBPcGVyYXRpb24gd291bGQgYmxvY2sgKExpbnV4IHJldHVybnMgRUFHQUlOKSAqLworI2RlZmluZQlFV09VTERCTE9DSwlFQUdBSU4JLyogT3BlcmF0aW9uIHdvdWxkIGJsb2NrIChOb3QgSFBVWCBjb21wbGlhbnQpICovCiAjZGVmaW5lCUVOT1RFTVBUWQkyNDcJLyogRGlyZWN0b3J5IG5vdCBlbXB0eSAqLwogI2RlZmluZQlFTkFNRVRPT0xPTkcJMjQ4CS8qIEZpbGUgbmFtZSB0b28gbG9uZyAqLwogI2RlZmluZQlFTE9PUAkJMjQ5CS8qIFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3N0YXQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc3RhdC5oCmluZGV4IGQ3NmZiZGEuLmI2MDZiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc3RhdC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc3RhdC5oCkBAIC01LDY3ICs1LDY1IEBACiAKIHN0cnVjdCBzdGF0IHsKIAl1bnNpZ25lZCBpbnQJc3RfZGV2OwkJLyogZGV2X3QgaXMgMzIgYml0cyBvbiBwYXJpc2MgKi8KLQlpbm9fdAkJc3RfaW5vOwkJLyogMzIgYml0cyAqLwotCW1vZGVfdAkJc3RfbW9kZTsJLyogMTYgYml0cyAqLworCXVuc2lnbmVkIGludAlzdF9pbm87CQkvKiAzMiBiaXRzICovCisJdW5zaWduZWQgc2hvcnQJc3RfbW9kZTsJLyogMTYgYml0cyAqLwogCXVuc2lnbmVkIHNob3J0CXN0X25saW5rOwkvKiAxNiBiaXRzICovCiAJdW5zaWduZWQgc2hvcnQJc3RfcmVzZXJ2ZWQxOwkvKiBvbGQgc3RfdWlkICovCiAJdW5zaWduZWQgc2hvcnQJc3RfcmVzZXJ2ZWQyOwkvKiBvbGQgc3RfZ2lkICovCiAJdW5zaWduZWQgaW50CXN0X3JkZXY7Ci0Jb2ZmX3QJCXN0X3NpemU7Ci0JdGltZV90CQlzdF9hdGltZTsKKwlzaWduZWQgaW50CXN0X3NpemU7CisJc2lnbmVkIGludAlzdF9hdGltZTsKIAl1bnNpZ25lZCBpbnQJc3RfYXRpbWVfbnNlYzsKLQl0aW1lX3QJCXN0X210aW1lOworCXNpZ25lZCBpbnQJc3RfbXRpbWU7CiAJdW5zaWduZWQgaW50CXN0X210aW1lX25zZWM7Ci0JdGltZV90CQlzdF9jdGltZTsKKwlzaWduZWQgaW50CXN0X2N0aW1lOwogCXVuc2lnbmVkIGludAlzdF9jdGltZV9uc2VjOwogCWludAkJc3RfYmxrc2l6ZTsKIAlpbnQJCXN0X2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQJX191bnVzZWQxOwkvKiBBQ0wgc3R1ZmYgKi8KIAl1bnNpZ25lZCBpbnQJX191bnVzZWQyOwkvKiBuZXR3b3JrICovCi0JaW5vX3QJCV9fdW51c2VkMzsJLyogbmV0d29yayAqLworCXVuc2lnbmVkIGludAlfX3VudXNlZDM7CS8qIG5ldHdvcmsgKi8KIAl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OwkvKiBjbm9kZXMgKi8KIAl1bnNpZ25lZCBzaG9ydAlfX3VudXNlZDU7CS8qIG5ldHNpdGUgKi8KIAlzaG9ydAkJc3RfZnN0eXBlOwogCXVuc2lnbmVkIGludAlzdF9yZWFsZGV2OwogCXVuc2lnbmVkIHNob3J0CXN0X2Jhc2Vtb2RlOwogCXVuc2lnbmVkIHNob3J0CXN0X3NwYXJlc2hvcnQ7Ci0JdWlkX3QJCXN0X3VpZDsKLQlnaWRfdAkJc3RfZ2lkOworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKIAl1bnNpZ25lZCBpbnQJc3Rfc3BhcmU0WzNdOwogfTsKIAogI2RlZmluZSBTVEFUX0hBVkVfTlNFQwogCi10eXBlZGVmIF9fa2VybmVsX29mZjY0X3QJb2ZmNjRfdDsKLQogc3RydWN0IGhwdXhfc3RhdDY0IHsKIAl1bnNpZ25lZCBpbnQJc3RfZGV2OwkJLyogZGV2X3QgaXMgMzIgYml0cyBvbiBwYXJpc2MgKi8KLQlpbm9fdCAgICAgICAgICAgc3RfaW5vOyAgICAgICAgIC8qIDMyIGJpdHMgKi8KLQltb2RlX3QJCXN0X21vZGU7CS8qIDE2IGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQJc3RfaW5vOyAgICAgICAgIC8qIDMyIGJpdHMgKi8KKwl1bnNpZ25lZCBzaG9ydAlzdF9tb2RlOwkvKiAxNiBiaXRzICovCiAJdW5zaWduZWQgc2hvcnQJc3Rfbmxpbms7CS8qIDE2IGJpdHMgKi8KIAl1bnNpZ25lZCBzaG9ydAlzdF9yZXNlcnZlZDE7CS8qIG9sZCBzdF91aWQgKi8KIAl1bnNpZ25lZCBzaG9ydAlzdF9yZXNlcnZlZDI7CS8qIG9sZCBzdF9naWQgKi8KIAl1bnNpZ25lZCBpbnQJc3RfcmRldjsKLQlvZmY2NF90CQlzdF9zaXplOwotCXRpbWVfdAkJc3RfYXRpbWU7CisJc2lnbmVkIGxvbmcgbG9uZyBzdF9zaXplOworCXNpZ25lZCBpbnQJc3RfYXRpbWU7CiAJdW5zaWduZWQgaW50CXN0X3NwYXJlMTsKLQl0aW1lX3QJCXN0X210aW1lOworCXNpZ25lZCBpbnQJc3RfbXRpbWU7CiAJdW5zaWduZWQgaW50CXN0X3NwYXJlMjsKLQl0aW1lX3QJCXN0X2N0aW1lOworCXNpZ25lZCBpbnQJc3RfY3RpbWU7CiAJdW5zaWduZWQgaW50CXN0X3NwYXJlMzsKIAlpbnQJCXN0X2Jsa3NpemU7Ci0JX191NjQJCXN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfYmxvY2tzOwogCXVuc2lnbmVkIGludAlfX3VudXNlZDE7CS8qIEFDTCBzdHVmZiAqLwogCXVuc2lnbmVkIGludAlfX3VudXNlZDI7CS8qIG5ldHdvcmsgKi8KLQlpbm9fdCAgICAgICAgICAgX191bnVzZWQzOyAgICAgIC8qIG5ldHdvcmsgKi8KKwl1bnNpZ25lZCBpbnQJX191bnVzZWQzOyAgICAgIC8qIG5ldHdvcmsgKi8KIAl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OwkvKiBjbm9kZXMgKi8KIAl1bnNpZ25lZCBzaG9ydAlfX3VudXNlZDU7CS8qIG5ldHNpdGUgKi8KIAlzaG9ydAkJc3RfZnN0eXBlOwogCXVuc2lnbmVkIGludAlzdF9yZWFsZGV2OwogCXVuc2lnbmVkIHNob3J0CXN0X2Jhc2Vtb2RlOwogCXVuc2lnbmVkIHNob3J0CXN0X3NwYXJlc2hvcnQ7Ci0JdWlkX3QJCXN0X3VpZDsKLQlnaWRfdAkJc3RfZ2lkOworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKIAl1bnNpZ25lZCBpbnQJc3Rfc3BhcmU0WzNdOwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKaW5kZXggMmM4YjliZC4uNDI3MDY3OSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCkBAIC04MjYsOCArODI2LDEwIEBACiAjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJKF9fTlJfTGludXggKyAzMzEpCiAjZGVmaW5lIF9fTlJfa2NtcAkJKF9fTlJfTGludXggKyAzMzIpCiAjZGVmaW5lIF9fTlJfZmluaXRfbW9kdWxlCShfX05SX0xpbnV4ICsgMzMzKQorI2RlZmluZSBfX05SX3NjaGVkX3NldGF0dHIJKF9fTlJfTGludXggKyAzMzQpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YXR0cgkoX19OUl9MaW51eCArIDMzNSkKIAotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX2Zpbml0X21vZHVsZSArIDEpCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc2NoZWRfZ2V0YXR0ciArIDEpCiAKIAogI2RlZmluZSBfX0lHTk9SRV9zZWxlY3QJCS8qIG5ld3NlbGVjdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwppbmRleCBhNzI1NDU1Li5hYzg3YTQwIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwpAQCAtMzg4LDYgKzM4OCwyMCBAQAogfQogRVhQT1JUX1NZTUJPTChmbHVzaF9rZXJuZWxfZGNhY2hlX3BhZ2VfYWRkcik7CiAKK3ZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdnRvLCB2b2lkICp2ZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkciwKKwlzdHJ1Y3QgcGFnZSAqcGcpCit7CisgICAgICAgLyogQ29weSB1c2luZyBrZXJuZWwgbWFwcGluZy4gIE5vIGNvaGVyZW5jeSBpcyBuZWVkZWQgKGFsbCBpbgorCSAga3VubWFwKSBmb3IgdGhlIGB0bycgcGFnZS4gIEhvd2V2ZXIsIHRoZSBgZnJvbScgcGFnZSBuZWVkcyB0bworCSAgYmUgZmx1c2hlZCB0aHJvdWdoIGEgbWFwcGluZyBlcXVpdmFsZW50IHRvIHRoZSB1c2VyIG1hcHBpbmcKKwkgIGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUga2VybmVsIG1hcHBpbmcuICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJZmx1c2hfZGNhY2hlX3BhZ2VfYXNtKF9fcGEodmZyb20pLCB2YWRkcik7CisJcHJlZW1wdF9lbmFibGUoKTsKKwljb3B5X3BhZ2VfYXNtKHZ0bywgdmZyb20pOworfQorRVhQT1JUX1NZTUJPTChjb3B5X3VzZXJfcGFnZSk7CisKIHZvaWQgcHVyZ2VfdGxiX2VudHJpZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNTVmOTJiNi4uMGJiYmYwZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDAgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyIHdpdGggcGFyaXNjLWxpbnV4Lm9yZz4KICAqICAgIENvcHlyaWdodCAoQykgMjAwMSBBbGFuIE1vZHJhIDxhbW9kcmEgYXQgcGFyaXNjLWxpbnV4Lm9yZz4KICAqICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJ5YW4gQnJhZGV0aWNoIDxyYnJhZCBhdCBwYXJpc2MtbGludXgub3JnPgotICogICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgSGVsZ2UgRGVsbGVyIDxkZWxsZXIgYXQgcGFyaXNjLWxpbnV4Lm9yZz4KKyAqICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBSYW5kb2xwaCBDaHVuZyA8dGF1c3Egd2l0aCBwYXJpc2MtbGludXgub3JnPgogICoKICAqCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgpAQCAtMjg2LDMgKzI4NywyMSBAQAogCXJldHVybiBwdHI7CiB9CiAjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJya19ybmQodm9pZCkKK3sKKwkvKiA4TUIgZm9yIDMyYml0LCAxR0IgZm9yIDY0Yml0ICovCisJaWYgKGlzXzMyYml0X3Rhc2soKSkKKwkJcmV0dXJuIChnZXRfcmFuZG9tX2ludCgpICYgMHg3ZmZVTCkgPDwgUEFHRV9TSElGVDsKKwllbHNlCisJCXJldHVybiAoZ2V0X3JhbmRvbV9pbnQoKSAmIDB4M2ZmZmZVTCkgPDwgUEFHRV9TSElGVDsKK30KKwordW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSBQQUdFX0FMSUdOKG1tLT5icmsgKyBicmtfcm5kKCkpOworCisJaWYgKHJldCA8IG1tLT5icmspCisJCXJldHVybiBtbS0+YnJrOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MuYwppbmRleCAwZDNhOWQ0Li5iN2NhZGM0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjLmMKQEAgLTUsNiArNSw3IEBACiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBNYXR0aGV3IFdpbGNveCA8d2lsbHkgYXQgcGFyaXNjLWxpbnV4Lm9yZz4KICAqICAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIFBhdWwgQmFtZSA8YmFtZSBhdCBwYXJpc2MtbGludXgub3JnPgogICogICAgQ29weXJpZ2h0IChDKSAyMDAxIFRob21hcyBCb2dlbmRvZXJmZXIgPHRzYm9nZW5kIGF0IHBhcmlzYy1saW51eC5vcmc+CisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxNCBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CiAgKgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yMyw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTMyLDc4ICszNCwyMzAgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdW5zaGFyZWRfYXJlYSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQorLyogd2UgY29uc3RydWN0IGFuIGFydGlmaWNpYWwgb2Zmc2V0IGZvciB0aGUgbWFwcGluZyBiYXNlZCBvbiB0aGUgcGh5c2ljYWwKKyAqIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBtYXBwaW5nIHZhcmlhYmxlICovCisjZGVmaW5lIEdFVF9MQVNUX01NQVAoZmlscCkJCVwKKwkoZmlscCA/ICgodW5zaWduZWQgbG9uZykgZmlscC0+Zl9tYXBwaW5nKSA+PiA4IDogMFVMKQorI2RlZmluZSBTRVRfTEFTVF9NTUFQKGZpbHAsIHZhbCkJXAorCSB7IC8qIG5vdGhpbmcgKi8gfQorCitzdGF0aWMgaW50IGdldF9vZmZzZXQodW5zaWduZWQgaW50IGxhc3RfbW1hcCkKIHsKLQlzdHJ1Y3Qgdm1fdW5tYXBwZWRfYXJlYV9pbmZvIGluZm87CisJcmV0dXJuIChsYXN0X21tYXAgJiAoU0hNTEJBLTEpKSA+PiBQQUdFX1NISUZUOworfQogCi0JaW5mby5mbGFncyA9IDA7Ci0JaW5mby5sZW5ndGggPSBsZW47Ci0JaW5mby5sb3dfbGltaXQgPSBQQUdFX0FMSUdOKGFkZHIpOwotCWluZm8uaGlnaF9saW1pdCA9IFRBU0tfU0laRTsKLQlpbmZvLmFsaWduX21hc2sgPSAwOwotCWluZm8uYWxpZ25fb2Zmc2V0ID0gMDsKLQlyZXR1cm4gdm1fdW5tYXBwZWRfYXJlYSgmaW5mbyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfYWxpZ25fb2Zmc2V0KHVuc2lnbmVkIGludCBsYXN0X21tYXAsCisJCQkJCSB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCXJldHVybiAoZ2V0X29mZnNldChsYXN0X21tYXApICsgcGdvZmYpIDw8IFBBR0VfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBDT0xPUl9BTElHTih1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgdW5zaWduZWQgaW50IGxhc3RfbW1hcCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSAoYWRkcitTSE1MQkEtMSkgJiB+KFNITUxCQS0xKTsKKwl1bnNpZ25lZCBsb25nIG9mZiAgPSAoU0hNTEJBLTEpICYKKwkJKHNoYXJlZF9hbGlnbl9vZmZzZXQobGFzdF9tbWFwLCBwZ29mZikgPDwgUEFHRV9TSElGVCk7CisKKwlyZXR1cm4gYmFzZSArIG9mZjsKIH0KIAogLyoKLSAqIFdlIG5lZWQgdG8ga25vdyB0aGUgb2Zmc2V0IHRvIHVzZS4gIE9sZCBzY2hlbWUgd2FzIHRvIGxvb2sgZm9yCi0gKiBleGlzdGluZyBtYXBwaW5nIGFuZCB1c2UgdGhlIHNhbWUgb2Zmc2V0LiAgTmV3IHNjaGVtZSBpcyB0byB1c2UgdGhlCi0gKiBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgZGF0YSBzdHJ1Y3R1cmUgYXMgdGhlIHNlZWQgZm9yIHRoZSBvZmZzZXQuCi0gKiBXZSdsbCBzZWUgaG93IHRoYXQgd29ya3MuLi4KLSAqCi0gKiBUaGUgbWFwcGluZyBpcyBjYWNoZWxpbmUgYWxpZ25lZCwgc28gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBpbiB0aGUgYm90dG9tCi0gKiBmZXcgYml0cyBvZiB0aGUgYWRkcmVzcy4gIFdlJ3JlIGxvb2tpbmcgZm9yIDEwIGJpdHMgKDRNQiAvIDRrKSwgc28gbGV0J3MKLSAqIGRyb3AgdGhlIGJvdHRvbSA4IGJpdHMgYW5kIHVzZSBiaXRzIDgtMTcuICAKKyAqIFRvcCBvZiBtbWFwIGFyZWEgKGp1c3QgYmVsb3cgdGhlIHByb2Nlc3Mgc3RhY2spLgogICovCi1zdGF0aWMgaW50IGdldF9vZmZzZXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1tYXBfdXBwZXJfbGltaXQodm9pZCkKIHsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIG1hcHBpbmcgPj4gODsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2Jhc2U7CisKKwkvKiBMaW1pdCBzdGFjayBzaXplIHRvIDFHQiAtIHNlZSBzZXR1cF9hcmdfcGFnZXMoKSBpbiBmcy9leGVjLmMgKi8KKwlzdGFja19iYXNlID0gcmxpbWl0X21heChSTElNSVRfU1RBQ0spOworCWlmIChzdGFja19iYXNlID4gKDEgPDwgMzApKQorCQlzdGFja19iYXNlID0gMSA8PCAzMDsKKworCXJldHVybiBQQUdFX0FMSUdOKFNUQUNLX1RPUCAtIHN0YWNrX2Jhc2UpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfYWxpZ25fb2Zmc2V0KHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlscCA/IGZpbHAtPmZfbWFwcGluZyA6IE5VTEw7Ci0KLQlyZXR1cm4gKGdldF9vZmZzZXQobWFwcGluZykgKyBwZ29mZikgPDwgUEFHRV9TSElGVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3NoYXJlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCB2bV91bm1hcHBlZF9hcmVhX2luZm8gaW5mbzsKLQotCWluZm8uZmxhZ3MgPSAwOwotCWluZm8ubGVuZ3RoID0gbGVuOwotCWluZm8ubG93X2xpbWl0ID0gUEFHRV9BTElHTihhZGRyKTsKLQlpbmZvLmhpZ2hfbGltaXQgPSBUQVNLX1NJWkU7Ci0JaW5mby5hbGlnbl9tYXNrID0gUEFHRV9NQVNLICYgKFNITUxCQSAtIDEpOwotCWluZm8uYWxpZ25fb2Zmc2V0ID0gc2hhcmVkX2FsaWduX29mZnNldChmaWxwLCBwZ29mZik7Ci0JcmV0dXJuIHZtX3VubWFwcGVkX2FyZWEoJmluZm8pOwotfQogCiB1bnNpZ25lZCBsb25nIGFyY2hfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JaWYgKGxlbiA+IFRBU0tfU0laRSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7Ci0JCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJgotCQkgICAgKGFkZHIgLSBzaGFyZWRfYWxpZ25fb2Zmc2V0KGZpbHAsIHBnb2ZmKSkgJiAoU0hNTEJBIC0gMSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIGFkZHI7Ci0JfQotCWlmICghYWRkcikKLQkJYWRkciA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgdGFza19zaXplID0gVEFTS19TSVpFOworCWludCBkb19jb2xvcl9hbGlnbiwgbGFzdF9tbWFwOworCXN0cnVjdCB2bV91bm1hcHBlZF9hcmVhX2luZm8gaW5mbzsKIAorCWlmIChsZW4gPiB0YXNrX3NpemUpCisJCXJldHVybiAtRU5PTUVNOworCisJZG9fY29sb3JfYWxpZ24gPSAwOwogCWlmIChmaWxwIHx8IChmbGFncyAmIE1BUF9TSEFSRUQpKQotCQlhZGRyID0gZ2V0X3NoYXJlZF9hcmVhKGZpbHAsIGFkZHIsIGxlbiwgcGdvZmYpOwotCWVsc2UKLQkJYWRkciA9IGdldF91bnNoYXJlZF9hcmVhKGFkZHIsIGxlbik7CisJCWRvX2NvbG9yX2FsaWduID0gMTsKKwlsYXN0X21tYXAgPSBHRVRfTEFTVF9NTUFQKGZpbHApOworCisJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CisJCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJiBsYXN0X21tYXAgJiYKKwkJICAgIChhZGRyIC0gc2hhcmVkX2FsaWduX29mZnNldChsYXN0X21tYXAsIHBnb2ZmKSkKKwkJCQkmIChTSE1MQkEgLSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGZvdW5kX2FkZHI7CisJfQorCisJaWYgKGFkZHIpIHsKKwkJaWYgKGRvX2NvbG9yX2FsaWduICYmIGxhc3RfbW1hcCkKKwkJCWFkZHIgPSBDT0xPUl9BTElHTihhZGRyLCBsYXN0X21tYXAsIHBnb2ZmKTsKKwkJZWxzZQorCQkJYWRkciA9IFBBR0VfQUxJR04oYWRkcik7CisKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAodGFza19zaXplIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCisJCQlnb3RvIGZvdW5kX2FkZHI7CisJfQorCisJaW5mby5mbGFncyA9IDA7CisJaW5mby5sZW5ndGggPSBsZW47CisJaW5mby5sb3dfbGltaXQgPSBtbS0+bW1hcF9sZWdhY3lfYmFzZTsKKwlpbmZvLmhpZ2hfbGltaXQgPSBtbWFwX3VwcGVyX2xpbWl0KCk7CisJaW5mby5hbGlnbl9tYXNrID0gbGFzdF9tbWFwID8gKFBBR0VfTUFTSyAmIChTSE1MQkEgLSAxKSkgOiAwOworCWluZm8uYWxpZ25fb2Zmc2V0ID0gc2hhcmVkX2FsaWduX29mZnNldChsYXN0X21tYXAsIHBnb2ZmKTsKKwlhZGRyID0gdm1fdW5tYXBwZWRfYXJlYSgmaW5mbyk7CisKK2ZvdW5kX2FkZHI6CisJaWYgKGRvX2NvbG9yX2FsaWduICYmICFsYXN0X21tYXAgJiYgIShhZGRyICYgflBBR0VfTUFTSykpCisJCVNFVF9MQVNUX01NQVAoZmlscCwgYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KIAordW5zaWduZWQgbG9uZworYXJjaF9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCB1bnNpZ25lZCBsb25nIGFkZHIwLAorCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJCSAgY29uc3QgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGFkZHIwOworCWludCBkb19jb2xvcl9hbGlnbiwgbGFzdF9tbWFwOworCXN0cnVjdCB2bV91bm1hcHBlZF9hcmVhX2luZm8gaW5mbzsKKworI2lmZGVmIENPTkZJR182NEJJVAorCS8qIFRoaXMgc2hvdWxkIG9ubHkgZXZlciBydW4gZm9yIDMyLWJpdCBwcm9jZXNzZXMuICAqLworCUJVR19PTighdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKTsKKyNlbmRpZgorCisJLyogcmVxdWVzdGVkIGxlbmd0aCB0b28gYmlnIGZvciBlbnRpcmUgYWRkcmVzcyBzcGFjZSAqLworCWlmIChsZW4gPiBUQVNLX1NJWkUpCisJCXJldHVybiAtRU5PTUVNOworCisJZG9fY29sb3JfYWxpZ24gPSAwOworCWlmIChmaWxwIHx8IChmbGFncyAmIE1BUF9TSEFSRUQpKQorCQlkb19jb2xvcl9hbGlnbiA9IDE7CisJbGFzdF9tbWFwID0gR0VUX0xBU1RfTU1BUChmaWxwKTsKKworCWlmIChmbGFncyAmIE1BUF9GSVhFRCkgeworCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgbGFzdF9tbWFwICYmCisJCSAgICAoYWRkciAtIHNoYXJlZF9hbGlnbl9vZmZzZXQobGFzdF9tbWFwLCBwZ29mZikpCisJCQkmIChTSE1MQkEgLSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGZvdW5kX2FkZHI7CisJfQorCisJLyogcmVxdWVzdGluZyBhIHNwZWNpZmljIGFkZHJlc3MgKi8KKwlpZiAoYWRkcikgeworCQlpZiAoZG9fY29sb3JfYWxpZ24gJiYgbGFzdF9tbWFwKQorCQkJYWRkciA9IENPTE9SX0FMSUdOKGFkZHIsIGxhc3RfbW1hcCwgcGdvZmYpOworCQllbHNlCisJCQlhZGRyID0gUEFHRV9BTElHTihhZGRyKTsKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCisJCQlnb3RvIGZvdW5kX2FkZHI7CisJfQorCisJaW5mby5mbGFncyA9IFZNX1VOTUFQUEVEX0FSRUFfVE9QRE9XTjsKKwlpbmZvLmxlbmd0aCA9IGxlbjsKKwlpbmZvLmxvd19saW1pdCA9IFBBR0VfU0laRTsKKwlpbmZvLmhpZ2hfbGltaXQgPSBtbS0+bW1hcF9iYXNlOworCWluZm8uYWxpZ25fbWFzayA9IGxhc3RfbW1hcCA/IChQQUdFX01BU0sgJiAoU0hNTEJBIC0gMSkpIDogMDsKKwlpbmZvLmFsaWduX29mZnNldCA9IHNoYXJlZF9hbGlnbl9vZmZzZXQobGFzdF9tbWFwLCBwZ29mZik7CisJYWRkciA9IHZtX3VubWFwcGVkX2FyZWEoJmluZm8pOworCWlmICghKGFkZHIgJiB+UEFHRV9NQVNLKSkKKwkJZ290byBmb3VuZF9hZGRyOworCVZNX0JVR19PTihhZGRyICE9IC1FTk9NRU0pOworCisJLyoKKwkgKiBBIGZhaWxlZCBtbWFwKCkgdmVyeSBsaWtlbHkgY2F1c2VzIGFwcGxpY2F0aW9uIGZhaWx1cmUsCisJICogc28gZmFsbCBiYWNrIHRvIHRoZSBib3R0b20tdXAgZnVuY3Rpb24gaGVyZS4gVGhpcyBzY2VuYXJpbworCSAqIGNhbiBoYXBwZW4gd2l0aCBsYXJnZSBzdGFjayBsaW1pdHMgYW5kIGxhcmdlIG1tYXAoKQorCSAqIGFsbG9jYXRpb25zLgorCSAqLworCXJldHVybiBhcmNoX2dldF91bm1hcHBlZF9hcmVhKGZpbHAsIGFkZHIwLCBsZW4sIHBnb2ZmLCBmbGFncyk7CisKK2ZvdW5kX2FkZHI6CisJaWYgKGRvX2NvbG9yX2FsaWduICYmICFsYXN0X21tYXAgJiYgIShhZGRyICYgflBBR0VfTUFTSykpCisJCVNFVF9MQVNUX01NQVAoZmlscCwgYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGludCBtbWFwX2lzX2xlZ2FjeSh2b2lkKQoreworCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfQ09NUEFUX0xBWU9VVCkKKwkJcmV0dXJuIDE7CisKKwkvKiBwYXJpc2Mgc3RhY2sgYWx3YXlzIGdyb3dzIHVwIC0gc28gYSB1bmxpbWl0ZWQgc3RhY2sgc2hvdWxkCisJICogbm90IGJlIGFuIGluZGljYXRvciB0byB1c2UgdGhlIGxlZ2FjeSBtZW1vcnkgbGF5b3V0LgorCSAqIGlmIChybGltaXQoUkxJTUlUX1NUQUNLKSA9PSBSTElNX0lORklOSVRZKQorCSAqCXJldHVybiAxOworCSAqLworCisJcmV0dXJuIHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX3JuZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm5kID0gMDsKKworCS8qCisJKiAgOCBiaXRzIG9mIHJhbmRvbW5lc3MgaW4gMzJiaXQgbW1hcHMsIDIwIGFkZHJlc3Mgc3BhY2UgYml0cworCSogMjggYml0cyBvZiByYW5kb21uZXNzIGluIDY0Yml0IG1tYXBzLCA0MCBhZGRyZXNzIHNwYWNlIGJpdHMKKwkqLworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgeworCQlpZiAoaXNfMzJiaXRfdGFzaygpKQorCQkJcm5kID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDw4KTsKKwkJZWxzZQorCQkJcm5kID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDwyOCk7CisJfQorCXJldHVybiBybmQgPDwgUEFHRV9TSElGVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9sZWdhY3lfYmFzZSh2b2lkKQoreworCXJldHVybiBUQVNLX1VOTUFQUEVEX0JBU0UgKyBtbWFwX3JuZCgpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiwgY2FsbGVkIHZlcnkgZWFybHkgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIG5ldworICogcHJvY2VzcyBWTSBpbWFnZSwgc2V0cyB1cCB3aGljaCBWTSBsYXlvdXQgZnVuY3Rpb24gdG8gdXNlOgorICovCit2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwltbS0+bW1hcF9sZWdhY3lfYmFzZSA9IG1tYXBfbGVnYWN5X2Jhc2UoKTsKKwltbS0+bW1hcF9iYXNlID0gbW1hcF91cHBlcl9saW1pdCgpOworCisJaWYgKG1tYXBfaXNfbGVnYWN5KCkpIHsKKwkJbW0tPm1tYXBfYmFzZSA9IG1tLT5tbWFwX2xlZ2FjeV9iYXNlOworCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhOworCX0gZWxzZSB7CisJCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bjsKKwl9Cit9CisKKwogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwKIAl1bnNpZ25lZCBsb25nIHBnb2ZmKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggMGM5MTA3Mi4uOGZhM2ZiYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC00MjksNiArNDI5LDggQEAKIAlFTlRSWV9DT01QKHByb2Nlc3Nfdm1fd3JpdGV2KQogCUVOVFJZX1NBTUUoa2NtcCkKIAlFTlRSWV9TQU1FKGZpbml0X21vZHVsZSkKKwlFTlRSWV9TQU1FKHNjaGVkX3NldGF0dHIpCisJRU5UUllfU0FNRShzY2hlZF9nZXRhdHRyKQkvKiAzMzUgKi8KIAogCS8qIE5vdGhpbmcgeWV0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggMjU0OTNhMC4uOTU3YmYzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTM0Miw2ICszNDIsOCBAQAogICAgICAgIGJvb2wgIlRyYW5zYWN0aW9uYWwgTWVtb3J5IHN1cHBvcnQgZm9yIFBPV0VSUEMiCiAgICAgICAgZGVwZW5kcyBvbiBQUENfQk9PSzNTXzY0CiAgICAgICAgZGVwZW5kcyBvbiBTTVAKKyAgICAgICBzZWxlY3QgQUxUSVZFQworICAgICAgIHNlbGVjdCBWU1gKICAgICAgICBkZWZhdWx0IG4KICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBTdXBwb3J0IHVzZXItbW9kZSBUcmFuc2FjdGlvbmFsIE1lbW9yeSBvbiBQT1dFUlBDLgpAQCAtNTMyLDYgKzUzNCw3IEBACiAKIGNvbmZpZyBQUENfNjRLX1BBR0VTCiAJYm9vbCAiNjRrIHBhZ2Ugc2l6ZSIgaWYgNDR4IHx8IFBQQ19TVERfTU1VXzY0IHx8IFBQQ19CT09LM0VfNjQKKwlkZXBlbmRzIG9uICFQUENfRlNMX0JPT0szRQogCXNlbGVjdCBQUENfSEFTX0hBU0hfNjRLIGlmIFBQQ19TVERfTU1VXzY0CiAKIGNvbmZpZyBQUENfMjU2S19QQUdFUwpAQCAtMTA0NSwxMSArMTA0OCw2IEBACiAKIHNvdXJjZSAiY3J5cHRvL0tjb25maWciCiAKLWNvbmZpZyBQUENfQ0xPQ0sKLQlib29sCi0JZGVmYXVsdCBuCi0Jc2VsZWN0IEhBVkVfQ0xLCi0KIGNvbmZpZyBQUENfTElCX1JIRUFQCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYWMxNHh4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hYzE0eHguZHRzCmluZGV4IGE1NDNjNDAuLmExYjg4MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hYzE0eHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hYzE0eHguZHRzCkBAIC0xMzksNyArMTM5LDE0IEBACiAJCX07CiAJfTsKIAorCWNsb2NrcyB7CisJCW9zYyB7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjUwMDAwMDA+OworCQl9OworCX07CisKIAlzb2NAODAwMDAwMDAgeworCQlidXMtZnJlcXVlbmN5ID0gPDgwMDAwMDAwPjsJLyogODAgTUh6IGlwcyBidXMgKi8KIAogCQljbG9ja0BmMDAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMXJldjItY2xvY2siLCAiZnNsLG1wYzUxMjEtY2xvY2siOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTIxLmR0c2kKaW5kZXggMmQ3Y2IwNC4uMmMwZTE1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjEuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyMS5kdHNpCkBAIC05LDYgKzksOCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXBjNTEyeC1jbG9jay5oPgorCiAvZHRzLXYxLzsKIAogLyB7CkBAIC00OSw2ICs1MSwxMCBAQAogCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLW1ieCI7CiAJCXJlZyA9IDwweDIwMDAwMDAwIDB4NDAwMD47CiAJCWludGVycnVwdHMgPSA8NjYgMHg4PjsKKwkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX01CWF9CVVM+LAorCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19NQlhfM0Q+LAorCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19NQlg+OworCQljbG9jay1uYW1lcyA9ICJtYngtYnVzIiwgIm1ieC0zZCIsICJtYngiOwogCX07CiAKIAlzcmFtQDMwMDAwMDAwIHsKQEAgLTYyLDYgKzY4LDggQEAKIAkJaW50ZXJydXB0cyA9IDw2IDg+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19ORkM+OworCQljbG9jay1uYW1lcyA9ICJpcGciOwogCX07CiAKIAlsb2NhbGJ1c0A4MDAwMDAyMCB7CkBAIC03Myw2ICs4MSwxNyBAQAogCQlyYW5nZXMgPSA8MHgwIDB4MCAweGZjMDAwMDAwIDB4MDQwMDAwMDA+OwogCX07CiAKKwljbG9ja3MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJb3NjOiBvc2MgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MzMwMDAwMDA+OworCQl9OworCX07CisKIAlzb2NAODAwMDAwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWltbXIiOwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKQEAgLTExNyw5ICsxMzYsMTIgQEAKIAkJfTsKIAogCQkvKiBDbG9jayBjb250cm9sICovCi0JCWNsb2NrQGYwMCB7CisJCWNsa3M6IGNsb2NrQGYwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWNsb2NrIjsKIAkJCXJlZyA9IDwweGYwMCAweDEwMD47CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQljbG9ja3MgPSA8Jm9zYz47CisJCQljbG9jay1uYW1lcyA9ICJvc2MiOwogCQl9OwogCiAJCS8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbGxlciAqLwpAQCAtMTM5LDEyICsxNjEsMjQgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtbXNjYW4iOwogCQkJcmVnID0gPDB4MTMwMCAweDgwPjsKIAkJCWludGVycnVwdHMgPSA8MTIgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19CRExDPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX0lQUz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19TWVM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUkVGPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX01TQ0FOMF9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJpcHMiLCAic3lzIiwgInJlZiIsICJtY2xrIjsKIAkJfTsKIAogCQljYW5AMTM4MCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLW1zY2FuIjsKIAkJCXJlZyA9IDwweDEzODAgMHg4MD47CiAJCQlpbnRlcnJ1cHRzID0gPDEzIDB4OD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfQkRMQz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19JUFM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfU1lTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1JFRj4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19NU0NBTjFfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAiaXBzIiwgInN5cyIsICJyZWYiLCAibWNsayI7CiAJCX07CiAKIAkJc2RoY0AxNTAwIHsKQEAgLTE1Myw2ICsxODcsOSBAQAogCQkJaW50ZXJydXB0cyA9IDw4IDB4OD47CiAJCQlkbWFzID0gPCZkbWEwIDMwPjsKIAkJCWRtYS1uYW1lcyA9ICJyeC10eCI7CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfSVBTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1NESEM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgInBlciI7CiAJCX07CiAKIAkJaTJjQDE3MDAgewpAQCAtMTYxLDYgKzE5OCw4IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWkyYyIsICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDE3MDAgMHgyMD47CiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19JMkM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAkJfTsKIAogCQlpMmNAMTcyMCB7CkBAIC0xNjksNiArMjA4LDggQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtaTJjIiwgImZzbC1pMmMiOwogCQkJcmVnID0gPDB4MTcyMCAweDIwPjsKIAkJCWludGVycnVwdHMgPSA8MTAgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19JMkM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAkJfTsKIAogCQlpMmNAMTc0MCB7CkBAIC0xNzcsNiArMjE4LDggQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtaTJjIiwgImZzbC1pMmMiOwogCQkJcmVnID0gPDB4MTc0MCAweDIwPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19JMkM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAkJfTsKIAogCQlpMmNjb250cm9sQDE3NjAgewpAQCAtMTg4LDMwICsyMzEsNDggQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtYXhlIjsKIAkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDw0MiAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX0FYRT47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCWRpc3BsYXlAMjEwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWRpdSI7CiAJCQlyZWcgPSA8MHgyMTAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8NjQgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19ESVU+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAkJfTsKIAogCQljYW5AMjMwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLW1zY2FuIjsKIAkJCXJlZyA9IDwweDIzMDAgMHg4MD47CiAJCQlpbnRlcnJ1cHRzID0gPDkwIDB4OD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfQkRMQz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19JUFM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfU1lTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1JFRj4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19NU0NBTjJfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAiaXBzIiwgInN5cyIsICJyZWYiLCAibWNsayI7CiAJCX07CiAKIAkJY2FuQDIzODAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1tc2NhbiI7CiAJCQlyZWcgPSA8MHgyMzgwIDB4ODA+OwogCQkJaW50ZXJydXB0cyA9IDw5MSAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX0JETEM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfSVBTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1NZUz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19SRUY+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfTVNDQU4zX01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgImlwcyIsICJzeXMiLCAicmVmIiwgIm1jbGsiOwogCQl9OwogCiAJCXZpdUAyNDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtdml1IjsKIAkJCXJlZyA9IDwweDI0MDAgMHg0MDA+OwogCQkJaW50ZXJydXB0cyA9IDw2NyAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1ZJVT47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCW1kaW9AMjgwMCB7CkBAIC0yMTksNiArMjgwLDggQEAKIAkJCXJlZyA9IDwweDI4MDAgMHg4MDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19GRUM+OworCQkJY2xvY2stbmFtZXMgPSAicGVyIjsKIAkJfTsKIAogCQlldGgwOiBldGhlcm5ldEAyODAwIHsKQEAgLTIyNyw2ICsyOTAsOCBAQAogCQkJcmVnID0gPDB4MjgwMCAweDgwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8NCAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX0ZFQz47CisJCQljbG9jay1uYW1lcyA9ICJwZXIiOwogCQl9OwogCiAJCS8qIFVTQjEgdXNpbmcgZXh0ZXJuYWwgVUxQSSBQSFkgKi8KQEAgLTIzOCw2ICszMDMsOCBAQAogCQkJaW50ZXJydXB0cyA9IDw0MyAweDg+OwogCQkJZHJfbW9kZSA9ICJvdGciOwogCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfVVNCMT47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCS8qIFVTQjAgdXNpbmcgaW50ZXJuYWwgVVRNSSBQSFkgKi8KQEAgLTI0OSw2ICszMTYsOCBAQAogCQkJaW50ZXJydXB0cyA9IDw0NCAweDg+OwogCQkJZHJfbW9kZSA9ICJvdGciOwogCQkJcGh5X3R5cGUgPSAidXRtaV93aWRlIjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19VU0IyPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyI7CiAJCX07CiAKIAkJLyogSU8gY29udHJvbCAqLwpAQCAtMjY3LDYgKzMzNiw4IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBhdGEiOwogCQkJcmVnID0gPDB4MTAyMDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDw1IDB4OD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUEFUQT47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCS8qIDUxMnggUFNDcyBhcmUgbm90IDUyeHggUFNDIGNvbXBhdGlibGUgKi8KQEAgLTI3OCw2ICszNDksOSBAQAogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OwogCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CiAJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MwPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzBfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAibWNsayI7CiAJCX07CiAKIAkJLyogUFNDMSAqLwpAQCAtMjg3LDYgKzM2MSw5IEBACiAJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CiAJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKIAkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzE+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDMV9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJtY2xrIjsKIAkJfTsKIAogCQkvKiBQU0MyICovCkBAIC0yOTYsNiArMzczLDkgQEAKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKIAkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OwogCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDMj4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MyX01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgIm1jbGsiOwogCQl9OwogCiAJCS8qIFBTQzMgKi8KQEAgLTMwNSw2ICszODUsOSBAQAogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OwogCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CiAJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MzPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzNfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAibWNsayI7CiAJCX07CiAKIAkJLyogUFNDNCAqLwpAQCAtMzE0LDYgKzM5Nyw5IEBACiAJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CiAJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKIAkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzQ+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDNF9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJtY2xrIjsKIAkJfTsKIAogCQkvKiBQU0M1ICovCkBAIC0zMjMsNiArNDA5LDkgQEAKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKIAkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OwogCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDNT4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19QU0M1X01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgIm1jbGsiOwogCQl9OwogCiAJCS8qIFBTQzYgKi8KQEAgLTMzMiw2ICs0MjEsOSBAQAogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OwogCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CiAJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0M2PiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzZfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAibWNsayI7CiAJCX07CiAKIAkJLyogUFNDNyAqLwpAQCAtMzQxLDYgKzQzMyw5IEBACiAJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CiAJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKIAkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzc+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDN19NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJtY2xrIjsKIAkJfTsKIAogCQkvKiBQU0M4ICovCkBAIC0zNTAsNiArNDQ1LDkgQEAKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKIAkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OwogCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDOD4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19QU0M4X01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgIm1jbGsiOwogCQl9OwogCiAJCS8qIFBTQzkgKi8KQEAgLTM1OSw2ICs0NTcsOSBAQAogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OwogCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CiAJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0M5PiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzlfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAibWNsayI7CiAJCX07CiAKIAkJLyogUFNDMTAgKi8KQEAgLTM2OCw2ICs0NjksOSBAQAogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OwogCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CiAJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MxMD4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MxMF9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJtY2xrIjsKIAkJfTsKIAogCQkvKiBQU0MxMSAqLwpAQCAtMzc3LDEyICs0ODEsMTcgQEAKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKIAkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OwogCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDMTE+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDMTFfTUNMSz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciLCAibWNsayI7CiAJCX07CiAKIAkJcHNjZmlmb0AxMWYwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy1maWZvIjsKIAkJCXJlZyA9IDwweDExZjAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19QU0NfRklGTz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCWRtYTA6IGRtYUAxNDAwMCB7CkBAIC00MDAsNiArNTA5LDggQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUENJPjsKKwkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAogCQlyZWcgPSA8MHg4MDAwODUwMCAweDEwMAkvKiBpbnRlcm5hbCByZWdpc3RlcnMgKi8KIAkJICAgICAgIDB4ODAwMDgzMDAgMHg4PjsJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTI1dHdyLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTI1dHdyLmR0cwppbmRleCBhNjE4ZGZjLi5lNGYyOTc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyNXR3ci5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjV0d3IuZHRzCkBAIC0xMiw2ICsxMiw4IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tcGM1MTJ4LWNsb2NrLmg+CisKIC9kdHMtdjEvOwogCiAvIHsKQEAgLTU0LDYgKzU2LDE3IEBACiAJCXJlZyA9IDwweDMwMDAwMDAwIDB4MDgwMDA+OwkJLy8gMzJLIGF0IDB4MzAwMDAwMDAKIAl9OwogCisJY2xvY2tzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCW9zYzogb3NjIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMDAwMDAwPjsKKwkJfTsKKwl9OworCiAJc29jQDgwMDAwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pbW1yIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CkBAIC04Nyw5ICsxMDAsMTIgQEAKIAkJCXJlZyA9IDwweGUwMCAweDEwMD47CiAJCX07CiAKLQkJY2xvY2tAZjAwIHsJLy8gQ2xvY2sgY29udHJvbAorCQljbGtzOiBjbG9ja0BmMDAgewkvLyBDbG9jayBjb250cm9sCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWNsb2NrIjsKIAkJCXJlZyA9IDwweGYwMCAweDEwMD47CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQljbG9ja3MgPSA8Jm9zYz47CisJCQljbG9jay1uYW1lcyA9ICJvc2MiOwogCQl9OwogCiAJCXBtY0AxMDAweyAgLy8gUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyCkBAIC0xMTQsMTggKzEzMCwzMyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1tc2NhbiI7CiAJCQlpbnRlcnJ1cHRzID0gPDEyIDB4OD47CiAJCQlyZWcgPSA8MHgxMzAwIDB4ODA+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX0JETEM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfSVBTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1NZUz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19SRUY+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfTVNDQU4wX01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgImlwcyIsICJzeXMiLCAicmVmIiwgIm1jbGsiOwogCQl9OwogCiAJCWNhbkAxMzgwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtbXNjYW4iOwogCQkJaW50ZXJydXB0cyA9IDwxMyAweDg+OwogCQkJcmVnID0gPDB4MTM4MCAweDgwPjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19CRExDPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX0lQUz4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19TWVM+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUkVGPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX01TQ0FOMV9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJpcHMiLCAic3lzIiwgInJlZiIsICJtY2xrIjsKIAkJfTsKIAogCQlzZGhjQDE1MDAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1zZGhjIjsKIAkJCWludGVycnVwdHMgPSA8OCAweDg+OwogCQkJcmVnID0gPDB4MTUwMCAweDEwMD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfSVBTPiwKKwkJCQkgPCZjbGtzIE1QQzUxMnhfQ0xLX1NESEM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgInBlciI7CiAJCX07CiAKIAkJaTJjQDE3MDAgewpAQCAtMTM0LDYgKzE2NSw4IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWkyYyIsICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDE3MDAgMHgyMD47CiAJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX0kyQz47CisJCQljbG9jay1uYW1lcyA9ICJpcGciOwogCQl9OwogCiAJCWkyY0AxNzIwIHsKQEAgLTE0Miw2ICsxNzUsOCBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pMmMiLCAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgxNzIwIDB4MjA+OwogCQkJaW50ZXJydXB0cyA9IDwweGEgMHg4PjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19JMkM+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIjsKIAkJfTsKIAogCQlpMmNAMTc0MCB7CkBAIC0xNTAsNiArMTg1LDggQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtaTJjIiwgImZzbC1pMmMiOwogCQkJcmVnID0gPDB4MTc0MCAweDIwPjsKIAkJCWludGVycnVwdHMgPSA8MHhiIDB4OD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfSTJDPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyI7CiAJCX07CiAKIAkJaTJjY29udHJvbEAxNzYwIHsKQEAgLTE2MSw2ICsxOTgsOCBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1kaXUiOwogCQkJcmVnID0gPDB4MjEwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDY0IDB4OD47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfRElVPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyI7CiAJCX07CiAKIAkJbWRpb0AyODAwIHsKQEAgLTE4MCw2ICsyMTksOCBAQAogCQkJaW50ZXJydXB0cyA9IDw0IDB4OD47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5MCA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJybWlpIjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19GRUM+OworCQkJY2xvY2stbmFtZXMgPSAicGVyIjsKIAkJfTsKIAogCQkvLyBJTyBjb250cm9sCkBAIC0yMDAsNiArMjQxLDggQEAKIAkJCWludGVycnVwdHMgPSA8NDMgMHg4PjsKIAkJCWRyX21vZGUgPSAiaG9zdCI7CiAJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwkJCWNsb2NrcyA9IDwmY2xrcyBNUEM1MTJ4X0NMS19VU0IxPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyI7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCkBAIC0yMTEsNiArMjU0LDkgQEAKIAkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKIAkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OwogCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQljbG9ja3MgPSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDMT4sCisJCQkJIDwmY2xrcyBNUEM1MTJ4X0NMS19QU0MxX01DTEs+OworCQkJY2xvY2stbmFtZXMgPSAiaXBnIiwgIm1jbGsiOwogCQl9OwogCiAJCS8vIFBTQzkgdWFydDEgYWthIHR0eVBTQzEKQEAgLTIyMCwxMiArMjY2LDE3IEBACiAJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CiAJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKIAkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQzk+LAorCQkJCSA8JmNsa3MgTVBDNTEyeF9DTEtfUFNDOV9NQ0xLPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyIsICJtY2xrIjsKIAkJfTsKIAogCQlwc2NmaWZvQDExZjAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtcHNjLWZpZm8iOwogCQkJcmVnID0gPDB4MTFmMDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OworCQkJY2xvY2tzID0gPCZjbGtzIE1QQzUxMnhfQ0xLX1BTQ19GSUZPPjsKKwkJCWNsb2NrLW5hbWVzID0gImlwZyI7CiAJCX07CiAKIAkJZG1hQDE0MDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jbGtfaW50ZXJmYWNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY2xrX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjE4ODJjLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jbGtfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1BPV0VSUENfQ0xLX0lOVEVSRkFDRV9ICi0jZGVmaW5lIF9fQVNNX1BPV0VSUENfQ0xLX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLQotc3RydWN0IGNsa19pbnRlcmZhY2UgewotCXN0cnVjdCBjbGsqCSgqY2xrX2dldCkJKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpOwotCWludAkJKCpjbGtfZW5hYmxlKQkoc3RydWN0IGNsayAqY2xrKTsKLQl2b2lkCQkoKmNsa19kaXNhYmxlKQkoc3RydWN0IGNsayAqY2xrKTsKLQl1bnNpZ25lZCBsb25nCSgqY2xrX2dldF9yYXRlKQkoc3RydWN0IGNsayAqY2xrKTsKLQl2b2lkCQkoKmNsa19wdXQpCShzdHJ1Y3QgY2xrICpjbGspOwotCWxvbmcJCSgqY2xrX3JvdW5kX3JhdGUpIChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci0JaW50IAkJKCpjbGtfc2V0X3JhdGUpCShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci0JaW50CQkoKmNsa19zZXRfcGFyZW50KSAoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpOwotCXN0cnVjdCBjbGsqCSgqY2xrX2dldF9wYXJlbnQpIChzdHJ1Y3QgY2xrICpjbGspOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBjbGtfaW50ZXJmYWNlIGNsa19mdW5jdGlvbnM7Ci0KLSNlbmRpZiAvKiBfX0FTTV9QT1dFUlBDX0NMS19JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VwYXByX2hjYWxscy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VwYXByX2hjYWxscy5oCmluZGV4IDg2YjBhYzcuLjMzNDQ1OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lcGFwcl9oY2FsbHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXBhcHJfaGNhbGxzLmgKQEAgLTQ2MCw1ICs0NjAsMTE2IEBACiAKIAlyZXR1cm4gcjM7CiB9CisKKyNpZmRlZiBDT05GSUdfRVBBUFJfUEFSQVZJUlQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBlcGFwcl9oeXBlcmNhbGwodW5zaWduZWQgbG9uZyAqaW4sCisJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnIpCit7CisJdW5zaWduZWQgbG9uZyByZWdpc3RlciByMCBhc20oInIwIik7CisJdW5zaWduZWQgbG9uZyByZWdpc3RlciByMyBhc20oInIzIikgPSBpblswXTsKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHI0IGFzbSgicjQiKSA9IGluWzFdOworCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjUgYXNtKCJyNSIpID0gaW5bMl07CisJdW5zaWduZWQgbG9uZyByZWdpc3RlciByNiBhc20oInI2IikgPSBpblszXTsKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHI3IGFzbSgicjciKSA9IGluWzRdOworCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjggYXNtKCJyOCIpID0gaW5bNV07CisJdW5zaWduZWQgbG9uZyByZWdpc3RlciByOSBhc20oInI5IikgPSBpbls2XTsKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHIxMCBhc20oInIxMCIpID0gaW5bN107CisJdW5zaWduZWQgbG9uZyByZWdpc3RlciByMTEgYXNtKCJyMTEiKSA9IG5yOworCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjEyIGFzbSgicjEyIik7CisKKwlhc20gdm9sYXRpbGUoImJsCWVwYXByX2h5cGVyY2FsbF9zdGFydCIKKwkJICAgICA6ICI9ciIocjApLCAiPXIiKHIzKSwgIj1yIihyNCksICI9ciIocjUpLCAiPXIiKHI2KSwKKwkJICAgICAgICI9ciIocjcpLCAiPXIiKHI4KSwgIj1yIihyOSksICI9ciIocjEwKSwgIj1yIihyMTEpLAorCQkgICAgICAgIj1yIihyMTIpCisJCSAgICAgOiAiciIocjMpLCAiciIocjQpLCAiciIocjUpLCAiciIocjYpLCAiciIocjcpLCAiciIocjgpLAorCQkgICAgICAgInIiKHI5KSwgInIiKHIxMCksICJyIihyMTEpCisJCSAgICAgOiAibWVtb3J5IiwgImNjIiwgInhlciIsICJjdHIiLCAibHIiKTsKKworCW91dFswXSA9IHI0OworCW91dFsxXSA9IHI1OworCW91dFsyXSA9IHI2OworCW91dFszXSA9IHI3OworCW91dFs0XSA9IHI4OworCW91dFs1XSA9IHI5OworCW91dFs2XSA9IHIxMDsKKwlvdXRbN10gPSByMTE7CisKKwlyZXR1cm4gcjM7Cit9CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZXBhcHJfaHlwZXJjYWxsKHVuc2lnbmVkIGxvbmcgKmluLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG5yKQoreworCXJldHVybiBFVl9VTklNUExFTUVOVEVEOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBlcGFwcl9oeXBlcmNhbGwwXzEodW5zaWduZWQgaW50IG5yLCB1bnNpZ25lZCBsb25nICpyMikKK3sKKwl1bnNpZ25lZCBsb25nIGluWzhdOworCXVuc2lnbmVkIGxvbmcgb3V0WzhdOworCXVuc2lnbmVkIGxvbmcgcjsKKworCXIgPSBlcGFwcl9oeXBlcmNhbGwoaW4sIG91dCwgbnIpOworCSpyMiA9IG91dFswXTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZXBhcHJfaHlwZXJjYWxsMCh1bnNpZ25lZCBpbnQgbnIpCit7CisJdW5zaWduZWQgbG9uZyBpbls4XTsKKwl1bnNpZ25lZCBsb25nIG91dFs4XTsKKworCXJldHVybiBlcGFwcl9oeXBlcmNhbGwoaW4sIG91dCwgbnIpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZXBhcHJfaHlwZXJjYWxsMSh1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEpCit7CisJdW5zaWduZWQgbG9uZyBpbls4XTsKKwl1bnNpZ25lZCBsb25nIG91dFs4XTsKKworCWluWzBdID0gcDE7CisJcmV0dXJuIGVwYXByX2h5cGVyY2FsbChpbiwgb3V0LCBucik7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBlcGFwcl9oeXBlcmNhbGwyKHVuc2lnbmVkIGludCBuciwgdW5zaWduZWQgbG9uZyBwMSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwMikKK3sKKwl1bnNpZ25lZCBsb25nIGluWzhdOworCXVuc2lnbmVkIGxvbmcgb3V0WzhdOworCisJaW5bMF0gPSBwMTsKKwlpblsxXSA9IHAyOworCXJldHVybiBlcGFwcl9oeXBlcmNhbGwoaW4sIG91dCwgbnIpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZXBhcHJfaHlwZXJjYWxsMyh1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgcDMpCit7CisJdW5zaWduZWQgbG9uZyBpbls4XTsKKwl1bnNpZ25lZCBsb25nIG91dFs4XTsKKworCWluWzBdID0gcDE7CisJaW5bMV0gPSBwMjsKKwlpblsyXSA9IHAzOworCXJldHVybiBlcGFwcl9oeXBlcmNhbGwoaW4sIG91dCwgbnIpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZXBhcHJfaHlwZXJjYWxsNCh1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgcDMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcDQpCit7CisJdW5zaWduZWQgbG9uZyBpbls4XTsKKwl1bnNpZ25lZCBsb25nIG91dFs4XTsKKworCWluWzBdID0gcDE7CisJaW5bMV0gPSBwMjsKKwlpblsyXSA9IHAzOworCWluWzNdID0gcDQ7CisJcmV0dXJuIGVwYXByX2h5cGVyY2FsbChpbiwgb3V0LCBucik7Cit9CiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9FUEFQUl9IQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKaW5kZXggMTUwM2Q4Yy4uMTllYjc0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oCkBAIC05MiwxNCArOTIsMTcgQEAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9GUF9VTkFWQUlMCTB4ODAwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfREVDUkVNRU5URVIJMHg5MDAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUgkweDk4MAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0RPT1JCRUxMCTB4YTAwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAkweGMwMAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX1RSQUNFCQkweGQwMAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0hfREFUQV9TVE9SQUdFCTB4ZTAwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSF9JTlNUX1NUT1JBR0UJMHhlMjAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9IX0VNVUxfQVNTSVNUCTB4ZTQwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSF9ET09SQkVMTAkweGU4MAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX1BFUkZNT04JMHhmMDAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9BTFRJVkVDCTB4ZjIwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfVlNYCQkweGY0MAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0hfRkFDX1VOQVZBSUwJMHhmODAKIAogI2RlZmluZSBCT09LM1NfSVJRUFJJT19TWVNURU1fUkVTRVQJCTAKICNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fREFUQV9TRUdNRU5UCQkxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAppbmRleCBiYzIzYjFiLi44Mzg1MWFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKQEAgLTE4Niw5ICsxODYsNiBAQAogCiBleHRlcm4gdm9pZCBrdm1wcGNfZW50cnlfdHJhbXBvbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19odl9lbnRyeV90cmFtcG9saW5lKHZvaWQpOwotZXh0ZXJuIHZvaWQga3ZtcHBjX2xvYWRfdXBfZnB1KHZvaWQpOwotZXh0ZXJuIHZvaWQga3ZtcHBjX2xvYWRfdXBfYWx0aXZlYyh2b2lkKTsKLWV4dGVybiB2b2lkIGt2bXBwY19sb2FkX3VwX3ZzeCh2b2lkKTsKIGV4dGVybiB1MzIga3ZtcHBjX2FsaWdubWVudF9kc2lzcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBpbnN0KTsKIGV4dGVybiB1bG9uZyBrdm1wcGNfYWxpZ25tZW50X2RhcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBpbnN0KTsKIGV4dGVybiBpbnQga3ZtcHBjX2hfcHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNtZCk7CkBAIC0yNzEsMTYgKzI2OCwyNSBAQAogCXJldHVybiB2Y3B1LT5hcmNoLnBjOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBrdm1wcGNfZ2V0X2xhc3RfaW5zdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW5saW5lIGJvb2wga3ZtcHBjX25lZWRfYnl0ZXN3YXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXVsb25nIHBjID0ga3ZtcHBjX2dldF9wYyh2Y3B1KTsKKwlyZXR1cm4gKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfTEUpICE9IChNU1JfS0VSTkVMICYgTVNSX0xFKTsKK30KIAorc3RhdGljIGlubGluZSB1MzIga3ZtcHBjX2dldF9sYXN0X2luc3RfaW50ZXJuYWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBwYykKK3sKIAkvKiBMb2FkIHRoZSBpbnN0cnVjdGlvbiBtYW51YWxseSBpZiBpdCBmYWlsZWQgdG8gZG8gc28gaW4gdGhlCiAJICogZXhpdCBwYXRoICovCiAJaWYgKHZjcHUtPmFyY2gubGFzdF9pbnN0ID09IEtWTV9JTlNUX0ZFVENIX0ZBSUxFRCkKIAkJa3ZtcHBjX2xkKHZjcHUsICZwYywgc2l6ZW9mKHUzMiksICZ2Y3B1LT5hcmNoLmxhc3RfaW5zdCwgZmFsc2UpOwogCi0JcmV0dXJuIHZjcHUtPmFyY2gubGFzdF9pbnN0OworCXJldHVybiBrdm1wcGNfbmVlZF9ieXRlc3dhcCh2Y3B1KSA/IHN3YWIzMih2Y3B1LT5hcmNoLmxhc3RfaW5zdCkgOgorCQl2Y3B1LT5hcmNoLmxhc3RfaW5zdDsKK30KKworc3RhdGljIGlubGluZSB1MzIga3ZtcHBjX2dldF9sYXN0X2luc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiBrdm1wcGNfZ2V0X2xhc3RfaW5zdF9pbnRlcm5hbCh2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpKTsKIH0KIAogLyoKQEAgLTI5MCwxNCArMjk2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB1MzIga3ZtcHBjX2dldF9sYXN0X3NjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl1bG9uZyBwYyA9IGt2bXBwY19nZXRfcGModmNwdSkgLSA0OwotCi0JLyogTG9hZCB0aGUgaW5zdHJ1Y3Rpb24gbWFudWFsbHkgaWYgaXQgZmFpbGVkIHRvIGRvIHNvIGluIHRoZQotCSAqIGV4aXQgcGF0aCAqLwotCWlmICh2Y3B1LT5hcmNoLmxhc3RfaW5zdCA9PSBLVk1fSU5TVF9GRVRDSF9GQUlMRUQpCi0JCWt2bXBwY19sZCh2Y3B1LCAmcGMsIHNpemVvZih1MzIpLCAmdmNwdS0+YXJjaC5sYXN0X2luc3QsIGZhbHNlKTsKLQotCXJldHVybiB2Y3B1LT5hcmNoLmxhc3RfaW5zdDsKKwlyZXR1cm4ga3ZtcHBjX2dldF9sYXN0X2luc3RfaW50ZXJuYWwodmNwdSwga3ZtcHBjX2dldF9wYyh2Y3B1KSAtIDQpOwogfQogCiBzdGF0aWMgaW5saW5lIHVsb25nIGt2bXBwY19nZXRfZmF1bHRfZGFyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzX2FzbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKaW5kZXggMTkyOTE3ZC4uZjNhOTFkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKQEAgLTg4LDYgKzg4LDcgQEAKIAl1OCBod3RocmVhZF9yZXE7CiAJdTggaHd0aHJlYWRfc3RhdGU7CiAJdTggaG9zdF9pcGk7CisJdTggcHRpZDsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKmt2bV92Y3B1OwogCXN0cnVjdCBrdm1wcGNfdmNvcmUgKmt2bV92Y29yZTsKIAl1bnNpZ25lZCBsb25nIHhpY3NfcGh5czsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2UuaAppbmRleCBkZDhmNjE1Li44MGQ0NmI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2tlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rZS5oCkBAIC02Myw2ICs2MywxMiBAQAogCXJldHVybiB2Y3B1LT5hcmNoLnhlcjsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGt2bXBwY19uZWVkX2J5dGVzd2FwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwkvKiBYWFggV291bGQgbmVlZCB0byBjaGVjayBUTEIgZW50cnkgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIGt2bXBwY19nZXRfbGFzdF9pbnN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gdmNwdS0+YXJjaC5sYXN0X2luc3Q7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDIzN2QxZDIuLjFlYWVhMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yODgsNiArMjg4LDcgQEAKIAlpbnQgbl93b2tlbjsKIAlpbnQgbmFwX2NvdW50OwogCWludCBuYXBwaW5nX3RocmVhZHM7CisJaW50IGZpcnN0X3ZjcHVpZDsKIAl1MTYgcGNwdTsKIAl1MTYgbGFzdF9jcHU7CiAJdTggdmNvcmVfc3RhdGU7CkBAIC0yOTgsMTAgKzI5OSwxMiBAQAogCXU2NCBzdG9sZW5fdGI7CiAJdTY0IHByZWVtcHRfdGI7CiAJc3RydWN0IGt2bV92Y3B1ICpydW5uZXI7CisJc3RydWN0IGt2bSAqa3ZtOwogCXU2NCB0Yl9vZmZzZXQ7CQkvKiBndWVzdCB0aW1lYmFzZSAtIGhvc3QgdGltZWJhc2UgKi8KIAl1bG9uZyBscGNyOwogCXUzMiBhcmNoX2NvbXBhdDsKIAl1bG9uZyBwY3I7CisJdWxvbmcgZHBkZXM7CQkvKiBkb29yYmVsbCBzdGF0ZSAoUE9XRVI4KSAqLwogfTsKIAogI2RlZmluZSBWQ09SRV9FTlRSWV9DT1VOVCh2YykJKCh2YyktPmVudHJ5X2V4aXRfY291bnQgJiAweGZmKQpAQCAtNDEwLDggKzQxMyw3IEBACiAKIAl1bG9uZyBncHJbMzJdOwogCi0JdTY0IGZwclszMl07Ci0JdTY0IGZwc2NyOworCXN0cnVjdCB0aHJlYWRfZnBfc3RhdGUgZnA7CiAKICNpZmRlZiBDT05GSUdfU1BFCiAJdWxvbmcgZXZyWzMyXTsKQEAgLTQyMCwxMiArNDIyLDcgQEAKIAl1NjQgYWNjOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKLQl2ZWN0b3IxMjggdnJbMzJdOwotCXZlY3RvcjEyOCB2c2NyOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVlNYCi0JdTY0IHZzcls2NF07CisJc3RydWN0IHRocmVhZF92cl9zdGF0ZSB2cjsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tWTV9CT09LRV9IVgpAQCAtNDUyLDYgKzQ0OSw3IEBACiAJdWxvbmcgcGM7CiAJdWxvbmcgY3RyOwogCXVsb25nIGxyOworCXVsb25nIHRhcjsKIAogCXVsb25nIHhlcjsKIAl1MzIgY3I7CkBAIC00NjEsMTMgKzQ1OSwzMCBAQAogCXVsb25nIGd1ZXN0X293bmVkX2V4dDsKIAl1bG9uZyBwdXJyOwogCXVsb25nIHNwdXJyOworCXVsb25nIGljOworCXVsb25nIHZ0YjsKIAl1bG9uZyBkc2NyOwogCXVsb25nIGFtcjsKIAl1bG9uZyB1YW1vcjsKKwl1bG9uZyBpYW1yOwogCXUzMiBjdHJsOworCXUzMiBkYWJyeDsKIAl1bG9uZyBkYWJyOworCXVsb25nIGRhd3I7CisJdWxvbmcgZGF3cng7CisJdWxvbmcgY2lhYnI7CiAJdWxvbmcgY2ZhcjsKIAl1bG9uZyBwcHI7CisJdWxvbmcgcHNwYjsKKwl1bG9uZyBmc2NyOworCXVsb25nIGViYmhyOworCXVsb25nIGViYnJyOworCXVsb25nIGJlc2NyOworCXVsb25nIGNzaWdyOworCXVsb25nIHRhY3I7CisJdWxvbmcgdGNzY3I7CisJdWxvbmcgYWNvcDsKKwl1bG9uZyB3b3J0OwogCXVsb25nIHNoYWRvd19zcnIxOwogI2VuZGlmCiAJdTMyIHZyc2F2ZTsgLyogYWxzbyBVU1BSRzAgKi8KQEAgLTUwMiwxMCArNTE3LDMzIEBACiAJdTMyIGNjcjE7CiAJdTMyIGRic3I7CiAKLQl1NjQgbW1jclszXTsKKwl1NjQgbW1jcls1XTsKIAl1MzIgcG1jWzhdOworCXUzMiBzcG1jWzJdOwogCXU2NCBzaWFyOwogCXU2NCBzZGFyOworCXU2NCBzaWVyOworI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwl1NjQgdGZoYXI7CisJdTY0IHRleGFzcjsKKwl1NjQgdGZpYXI7CisKKwl1MzIgY3JfdG07CisJdTY0IGxyX3RtOworCXU2NCBjdHJfdG07CisJdTY0IGFtcl90bTsKKwl1NjQgcHByX3RtOworCXU2NCBkc2NyX3RtOworCXU2NCB0YXJfdG07CisKKwl1bG9uZyBncHJfdG1bMzJdOworCisJc3RydWN0IHRocmVhZF9mcF9zdGF0ZSBmcF90bTsKKworCXN0cnVjdCB0aHJlYWRfdnJfc3RhdGUgdnJfdG07CisJdTMyIHZyc2F2ZV90bTsgLyogYWxzbyBVU1BSRzAgKi8KKworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfS1ZNX0VYSVRfVElNSU5HCiAJc3RydWN0IG11dGV4IGV4aXRfdGltaW5nX2xvY2s7CkBAIC01NDYsNiArNTg0LDcgQEAKICNlbmRpZgogCWdwYV90IHBhZGRyX2FjY2Vzc2VkOwogCWd2YV90IHZhZGRyX2FjY2Vzc2VkOworCXBnZF90ICpwZ2RpcjsKIAogCXU4IGlvX2dwcjsgLyogR1BSIHVzZWQgYXMgSU8gc291cmNlL3RhcmdldCAqLwogCXU4IG1taW9faXNfYmlnZW5kaWFuOwpAQCAtNjAzLDcgKzY0Miw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ1bl90YXNrOwogCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuOwotCXBnZF90ICpwZ2RpcjsKIAogCXNwaW5sb2NrX3QgdnBhX3VwZGF0ZV9sb2NrOwogCXN0cnVjdCBrdm1wcGNfdnBhIHZwYTsKQEAgLTYxNiw5ICs2NTQsMTIgQEAKIAlzcGlubG9ja190IHRiYWNjdF9sb2NrOwogCXU2NCBidXN5X3N0b2xlbjsKIAl1NjQgYnVzeV9wcmVlbXB0OworCXVuc2lnbmVkIGxvbmcgaW50cl9tc3I7CiAjZW5kaWYKIH07CiAKKyNkZWZpbmUgVkNQVV9GUFIodmNwdSwgaSkJKHZjcHUpLT5hcmNoLmZwLmZwcltpXVtUU19GUFJPRkZTRVRdCisKIC8qIFZhbHVlcyBmb3IgdmNwdS0+YXJjaC5zdGF0ZSAqLwogI2RlZmluZSBLVk1QUENfVkNQVV9OT1RSRUFEWQkJMAogI2RlZmluZSBLVk1QUENfVkNQVV9SVU5OQUJMRQkJMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wYXJhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BhcmEuaAppbmRleCAyYjExOTY1Li4zMzZhOTFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BhcmEuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BhcmEuaApAQCAtMzksMTAgKzM5LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcga3ZtX2h5cGVyY2FsbCh1bnNpZ25lZCBsb25nICppbiwKLQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBucik7Ci0KICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IGt2bV9wYXJhX2F2YWlsYWJsZSh2b2lkKQpAQCAtNTAsODIgKzQ2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcga3ZtX2h5cGVyY2FsbCh1bnNpZ25lZCBsb25nICppbiwKLQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBucikKLXsKLQlyZXR1cm4gRVZfVU5JTVBMRU1FTlRFRDsKLX0KLQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBrdm1faHlwZXJjYWxsMF8xKHVuc2lnbmVkIGludCBuciwgdW5zaWduZWQgbG9uZyAqcjIpCi17Ci0JdW5zaWduZWQgbG9uZyBpbls4XTsKLQl1bnNpZ25lZCBsb25nIG91dFs4XTsKLQl1bnNpZ25lZCBsb25nIHI7Ci0KLQlyID0ga3ZtX2h5cGVyY2FsbChpbiwgb3V0LCBLVk1fSENBTExfVE9LRU4obnIpKTsKLQkqcjIgPSBvdXRbMF07Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGt2bV9oeXBlcmNhbGwwKHVuc2lnbmVkIGludCBucikKLXsKLQl1bnNpZ25lZCBsb25nIGluWzhdOwotCXVuc2lnbmVkIGxvbmcgb3V0WzhdOwotCi0JcmV0dXJuIGt2bV9oeXBlcmNhbGwoaW4sIG91dCwgS1ZNX0hDQUxMX1RPS0VOKG5yKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBrdm1faHlwZXJjYWxsMSh1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEpCi17Ci0JdW5zaWduZWQgbG9uZyBpbls4XTsKLQl1bnNpZ25lZCBsb25nIG91dFs4XTsKLQotCWluWzBdID0gcDE7Ci0JcmV0dXJuIGt2bV9oeXBlcmNhbGwoaW4sIG91dCwgS1ZNX0hDQUxMX1RPS0VOKG5yKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBrdm1faHlwZXJjYWxsMih1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEsCi0JCQkJICB1bnNpZ25lZCBsb25nIHAyKQotewotCXVuc2lnbmVkIGxvbmcgaW5bOF07Ci0JdW5zaWduZWQgbG9uZyBvdXRbOF07Ci0KLQlpblswXSA9IHAxOwotCWluWzFdID0gcDI7Ci0JcmV0dXJuIGt2bV9oeXBlcmNhbGwoaW4sIG91dCwgS1ZNX0hDQUxMX1RPS0VOKG5yKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBrdm1faHlwZXJjYWxsMyh1bnNpZ25lZCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgcDEsCi0JCQkJICB1bnNpZ25lZCBsb25nIHAyLCB1bnNpZ25lZCBsb25nIHAzKQotewotCXVuc2lnbmVkIGxvbmcgaW5bOF07Ci0JdW5zaWduZWQgbG9uZyBvdXRbOF07Ci0KLQlpblswXSA9IHAxOwotCWluWzFdID0gcDI7Ci0JaW5bMl0gPSBwMzsKLQlyZXR1cm4ga3ZtX2h5cGVyY2FsbChpbiwgb3V0LCBLVk1fSENBTExfVE9LRU4obnIpKTsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGt2bV9oeXBlcmNhbGw0KHVuc2lnbmVkIGludCBuciwgdW5zaWduZWQgbG9uZyBwMSwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgcDMsCi0JCQkJICB1bnNpZ25lZCBsb25nIHA0KQotewotCXVuc2lnbmVkIGxvbmcgaW5bOF07Ci0JdW5zaWduZWQgbG9uZyBvdXRbOF07Ci0KLQlpblswXSA9IHAxOwotCWluWzFdID0gcDI7Ci0JaW5bMl0gPSBwMzsKLQlpblszXSA9IHA0OwotCXJldHVybiBrdm1faHlwZXJjYWxsKGluLCBvdXQsIEtWTV9IQ0FMTF9UT0tFTihucikpOwotfQotCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGt2bV9hcmNoX3BhcmFfZmVhdHVyZXModm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHI7CkBAIC0xMzMsNyArNTUsNyBAQAogCWlmICgha3ZtX3BhcmFfYXZhaWxhYmxlKCkpCiAJCXJldHVybiAwOwogCi0JaWYoa3ZtX2h5cGVyY2FsbDBfMShLVk1fSENfRkVBVFVSRVMsICZyKSkKKwlpZihlcGFwcl9oeXBlcmNhbGwwXzEoS1ZNX0hDQUxMX1RPS0VOKEtWTV9IQ19GRUFUVVJFUyksICZyKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCmluZGV4IGM4MzE3ZmIuLmZjZDUzZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaApAQCAtNTQsMTIgKzU0LDEzIEBACiBleHRlcm4gdm9pZCBrdm1wcGNfZHVtcF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gaW50IGt2bXBwY19oYW5kbGVfbG9hZChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcnQsIHVuc2lnbmVkIGludCBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19iaWdlbmRpYW4pOworCQkJICAgICAgaW50IGlzX2RlZmF1bHRfZW5kaWFuKTsKIGV4dGVybiBpbnQga3ZtcHBjX2hhbmRsZV9sb2FkcyhzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ0LCB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2JpZ2VuZGlhbik7CisJCQkgICAgICAgaW50IGlzX2RlZmF1bHRfZW5kaWFuKTsKIGV4dGVybiBpbnQga3ZtcHBjX2hhbmRsZV9zdG9yZShzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IHZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLCBpbnQgaXNfYmlnZW5kaWFuKTsKKwkJCSAgICAgICB1NjQgdmFsLCB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkgICAgICAgaW50IGlzX2RlZmF1bHRfZW5kaWFuKTsKIAogZXh0ZXJuIGludCBrdm1wcGNfZW11bGF0ZV9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtNDU1LDYgKzQ1NiwxMiBAQAogCXRyYWNlX2hhcmRpcnFzX29uKCk7CiAKICNpZmRlZiBDT05GSUdfUFBDNjQKKwkvKgorCSAqIFRvIGF2b2lkIHJhY2VzLCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBnb25lIGRpcmVjdGx5IGZyb20gaGF2aW5nCisJICogaW50ZXJydXB0cyBmdWxseS1lbmFibGVkIHRvIGhhcmQtZGlzYWJsZWQuCisJICovCisJV0FSTl9PTihsb2NhbF9wYWNhLT5pcnFfaGFwcGVuZWQgIT0gUEFDQV9JUlFfSEFSRF9ESVMpOworCiAJLyogT25seSBuZWVkIHRvIGVuYWJsZSBJUlFzIGJ5IGhhcmQgZW5hYmxpbmcgdGhlbSBhZnRlciB0aGlzICovCiAJbG9jYWxfcGFjYS0+aXJxX2hhcHBlbmVkID0gMDsKIAlsb2NhbF9wYWNhLT5zb2Z0X2VuYWJsZWQgPSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUxMjEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGM1MTIxLmgKaW5kZXggODg3ZDNkNi4uNGE2OWNkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUxMjEuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBjNTEyMS5oCkBAIC0zNyw3ICszNywxMiBAQAogCXUzMgljY2NyOwkvKiBDRk0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLwogCXUzMglkY2NyOwkvKiBESVUgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLwogCXUzMgltc2Nhbl9jY3JbNF07CS8qIE1TQ0FOIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCi0JdTgJcmVzWzB4OThdOyAvKiBSZXNlcnZlZCAqLworCXUzMglvdXRfY2NyWzRdOwkvKiBPVVQgQ0xLIENvbmZpZ3VyZSBSZWdpc3RlcnMgKi8KKwl1MzIJcnN2MFsyXTsJLyogUmVzZXJ2ZWQgKi8KKwl1MzIJc2NmcjM7CQkvKiBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IFJlZ2lzdGVyIDMgKi8KKwl1MzIJcnN2MVszXTsJLyogUmVzZXJ2ZWQgKi8KKwl1MzIJc3BsbF9sb2NrX2NudDsJLyogU3lzdGVtIFBMTCBMb2NrIENvdW50ZXIgKi8KKwl1OAlyZXNbMHg2Y107CS8qIFJlc2VydmVkICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmgKaW5kZXggZDI3OTYwYy4uYmMxNDFjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1wcGM2NC5oCkBAIC01NjAsOSArNTYwLDkgQEAKIAkJCSAgICBwbWRfdCAqcG1kcCk7CiAKICNkZWZpbmUgcG1kX21vdmVfbXVzdF93aXRoZHJhdyBwbWRfbW92ZV9tdXN0X3dpdGhkcmF3Ci10eXBlZGVmIHN0cnVjdCBzcGlubG9jayBzcGlubG9ja190Owotc3RhdGljIGlubGluZSBpbnQgcG1kX21vdmVfbXVzdF93aXRoZHJhdyhzcGlubG9ja190ICpuZXdfcG1kX3B0bCwKLQkJCQkJIHNwaW5sb2NrX3QgKm9sZF9wbWRfcHRsKQorc3RydWN0IHNwaW5sb2NrOworc3RhdGljIGlubGluZSBpbnQgcG1kX21vdmVfbXVzdF93aXRoZHJhdyhzdHJ1Y3Qgc3BpbmxvY2sgKm5ld19wbWRfcHRsLAorCQkJCQkgc3RydWN0IHNwaW5sb2NrICpvbGRfcG1kX3B0bCkKIHsKIAkvKgogCSAqIEFyY2hzIGxpa2UgcHBjNjQgdXNlIHBndGFibGUgdG8gc3RvcmUgcGVyIHBtZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggYjk5OWNhMy4uZjgzYjZmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yODcsNiArMjg3LDI3IEBACiAjZW5kaWYKIHB0ZV90ICpmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSwKIAkJCQkgdW5zaWduZWQgKnNoaWZ0KTsKKworc3RhdGljIGlubGluZSBwdGVfdCAqbG9va3VwX2xpbnV4X3B0ZXAocGdkX3QgKnBnZGlyLCB1bnNpZ25lZCBsb25nIGh2YSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnB0ZV9zaXplcCkKK3sKKwlwdGVfdCAqcHRlcDsKKwl1bnNpZ25lZCBsb25nIHBzID0gKnB0ZV9zaXplcDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisKKwlwdGVwID0gZmluZF9saW51eF9wdGVfb3JfaHVnZXB0ZShwZ2RpciwgaHZhLCAmc2hpZnQpOworCWlmICghcHRlcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNoaWZ0KQorCQkqcHRlX3NpemVwID0gMXVsIDw8IHNoaWZ0OworCWVsc2UKKwkJKnB0ZV9zaXplcCA9IFBBR0VfU0laRTsKKworCWlmIChwcyA+ICpwdGVfc2l6ZXApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHB0ZXA7Cit9CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggOGNhMjBhYy4uYjYyZGU0MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNDUwLDEzICs0NTAsNiBAQAogCiBleHRlcm4gaW50IHBvd2Vyc2F2ZV9uYXA7CS8qIHNldCBpZiBuYXAgbW9kZSBjYW4gYmUgdXNlZCBpbiBpZGxlIGxvb3AgKi8KIGV4dGVybiB2b2lkIHBvd2VyN19uYXAodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfUFNFUklFU19JRExFCi1leHRlcm4gdm9pZCB1cGRhdGVfc210X3Nub296ZV9kZWxheShpbnQgY3B1LCBpbnQgcmVzaWRlbmN5KTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3NtdF9zbm9vemVfZGVsYXkoaW50IGNwdSwgaW50IHJlc2lkZW5jeSkge30KLSNlbmRpZgotCiBleHRlcm4gdm9pZCBmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZSh2b2lkKTsKIGV4dGVybiB2b2lkIGhhcmRfcmVzZXRfbm93KHZvaWQpOwogZXh0ZXJuIHZvaWQgcG93ZXJvZmZfbm93KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCmluZGV4IDYyYjExNGUuLjkwYzA2ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKQEAgLTIyMywxNyArMjIzLDI2IEBACiAjZGVmaW5lICAgQ1RSTF9URQkweDAwYzAwMDAwCS8qIHRocmVhZCBlbmFibGUgKi8KICNkZWZpbmUgICBDVFJMX1JVTkxBVENICTB4MQogI2RlZmluZSBTUFJOX0RBV1IJMHhCNAorI2RlZmluZSBTUFJOX0NJQUJSCTB4QkIKKyNkZWZpbmUgICBDSUFCUl9QUklWCQkweDMKKyNkZWZpbmUgICBDSUFCUl9QUklWX1VTRVIJMQorI2RlZmluZSAgIENJQUJSX1BSSVZfU1VQRVIJMgorI2RlZmluZSAgIENJQUJSX1BSSVZfSFlQRVIJMwogI2RlZmluZSBTUFJOX0RBV1JYCTB4QkMKLSNkZWZpbmUgICBEQVdSWF9VU0VSCSgxVUwgPDwgMCkKLSNkZWZpbmUgICBEQVdSWF9LRVJORUwJKDFVTCA8PCAxKQotI2RlZmluZSAgIERBV1JYX0hZUAkoMVVMIDw8IDIpCisjZGVmaW5lICAgREFXUlhfVVNFUglfX01BU0soMCkKKyNkZWZpbmUgICBEQVdSWF9LRVJORUwJX19NQVNLKDEpCisjZGVmaW5lICAgREFXUlhfSFlQCV9fTUFTSygyKQorI2RlZmluZSAgIERBV1JYX1dUSQlfX01BU0soMykKKyNkZWZpbmUgICBEQVdSWF9XVAlfX01BU0soNCkKKyNkZWZpbmUgICBEQVdSWF9EUglfX01BU0soNSkKKyNkZWZpbmUgICBEQVdSWF9EVwlfX01BU0soNikKICNkZWZpbmUgU1BSTl9EQUJSCTB4M0Y1CS8qIERhdGEgQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fREFCUjIJMHgxM0QJLyogZTMwMCAqLwogI2RlZmluZSBTUFJOX0RBQlJYCTB4M0Y3CS8qIERhdGEgQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyIEV4dGVuc2lvbiAqLwotI2RlZmluZSAgIERBQlJYX1VTRVIJKDFVTCA8PCAwKQotI2RlZmluZSAgIERBQlJYX0tFUk5FTAkoMVVMIDw8IDEpCi0jZGVmaW5lICAgREFCUlhfSFlQCSgxVUwgPDwgMikKLSNkZWZpbmUgICBEQUJSWF9CVEkJKDFVTCA8PCAzKQorI2RlZmluZSAgIERBQlJYX1VTRVIJX19NQVNLKDApCisjZGVmaW5lICAgREFCUlhfS0VSTkVMCV9fTUFTSygxKQorI2RlZmluZSAgIERBQlJYX0hZUAlfX01BU0soMikKKyNkZWZpbmUgICBEQUJSWF9CVEkJX19NQVNLKDMpCiAjZGVmaW5lICAgREFCUlhfQUxMICAgICAoREFCUlhfQlRJIHwgREFCUlhfSFlQIHwgREFCUlhfS0VSTkVMIHwgREFCUlhfVVNFUikKICNkZWZpbmUgU1BSTl9EQVIJMHgwMTMJLyogRGF0YSBBZGRyZXNzIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fREJDUgkweDEzNgkvKiBlMzAwIERhdGEgQnJlYWtwb2ludCBDb250cm9sIFJlZyAqLwpAQCAtMjYwLDYgKzI2OSw4IEBACiAjZGVmaW5lIFNQUk5fSFJNT1IJMHgxMzkJLyogUmVhbCBtb2RlIG9mZnNldCByZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0hTUlIwCTB4MTNBCS8qIEh5cGVydmlzb3IgU2F2ZS9SZXN0b3JlIDAgKi8KICNkZWZpbmUgU1BSTl9IU1JSMQkweDEzQgkvKiBIeXBlcnZpc29yIFNhdmUvUmVzdG9yZSAxICovCisjZGVmaW5lIFNQUk5fSUMJCTB4MzUwCS8qIFZpcnR1YWwgSW5zdHJ1Y3Rpb24gQ291bnQgKi8KKyNkZWZpbmUgU1BSTl9WVEIJMHgzNTEJLyogVmlydHVhbCBUaW1lIEJhc2UgKi8KIC8qIEhGU0NSIGFuZCBGU0NSIGJpdCBudW1iZXJzIGFyZSB0aGUgc2FtZSAqLwogI2RlZmluZSBGU0NSX1RBUl9MRwk4CS8qIEVuYWJsZSBUYXJnZXQgQWRkcmVzcyBSZWdpc3RlciAqLwogI2RlZmluZSBGU0NSX0VCQl9MRwk3CS8qIEVuYWJsZSBFdmVudCBCYXNlZCBCcmFuY2hpbmcgKi8KQEAgLTI5OCw5ICszMDksMTMgQEAKICNkZWZpbmUgICBMUENSX1JNTFMgICAgMHgxQzAwMDAwMCAgICAgIC8qIGltcGwgZGVwZW5kZW50IHJtbyBsaW1pdCBzZWwgKi8KICNkZWZpbmUJICBMUENSX1JNTFNfU0gJKDYzLTM3KQogI2RlZmluZSAgIExQQ1JfSUxFICAgICAweDAyMDAwMDAwICAgICAgLyogIUhWIGlycXMgc2V0IE1TUjpMRSAqLworI2RlZmluZSAgIExQQ1JfQUlMCTB4MDE4MDAwMDAJLyogQWx0ZXJuYXRlIGludGVycnVwdCBsb2NhdGlvbiAqLwogI2RlZmluZSAgIExQQ1JfQUlMXzAJMHgwMDAwMDAwMAkvKiBNTVUgb2ZmIGV4Y2VwdGlvbiBvZmZzZXQgMHgwICovCiAjZGVmaW5lICAgTFBDUl9BSUxfMwkweDAxODAwMDAwCS8qIE1NVSBvbiBleGNlcHRpb24gb2Zmc2V0IDB4YzAwLi4uNHh4eCAqLwotI2RlZmluZSAgIExQQ1JfUEVDRQkweDAwMDA3MDAwCS8qIHBvd2Vyc2F2ZSBleGl0IGNhdXNlIGVuYWJsZSAqLworI2RlZmluZSAgIExQQ1JfT05MCTB4MDAwNDAwMDAJLyogb25saW5lIC0gUFVSUi9TUFVSUiBjb3VudCAqLworI2RlZmluZSAgIExQQ1JfUEVDRQkweDAwMDFmMDAwCS8qIHBvd2Vyc2F2ZSBleGl0IGNhdXNlIGVuYWJsZSAqLworI2RlZmluZSAgICAgTFBDUl9QRUNFRFAJMHgwMDAxMDAwMAkvKiBkaXJlY3RlZCBwcml2IGRiZWxscyBjYXVzZSBleGl0ICovCisjZGVmaW5lICAgICBMUENSX1BFQ0VESAkweDAwMDA4MDAwCS8qIGRpcmVjdGVkIGh5cCBkYmVsbHMgY2F1c2UgZXhpdCAqLwogI2RlZmluZSAgICAgTFBDUl9QRUNFMAkweDAwMDA0MDAwCS8qIGV4dC4gZXhjZXB0aW9ucyBjYW4gY2F1c2UgZXhpdCAqLwogI2RlZmluZSAgICAgTFBDUl9QRUNFMQkweDAwMDAyMDAwCS8qIGRlY3JlbWVudGVyIGNhbiBjYXVzZSBleGl0ICovCiAjZGVmaW5lICAgICBMUENSX1BFQ0UyCTB4MDAwMDEwMDAJLyogbWFjaGluZSBjaGVjayBldGMgY2FuIGNhdXNlIGV4aXQgKi8KQEAgLTMyMiw2ICszMzcsOCBAQAogI2RlZmluZSBTUFJOX1BDUgkweDE1MgkvKiBQcm9jZXNzb3IgY29tcGF0aWJpbGl0eSByZWdpc3RlciAqLwogI2RlZmluZSAgIFBDUl9WRUNfRElTCSgxdWwgPDwgKDYzLTApKQkvKiBWZWMuIGRpc2FibGUgKGJpdCBOQSBzaW5jZSBQT1dFUjgpICovCiAjZGVmaW5lICAgUENSX1ZTWF9ESVMJKDF1bCA8PCAoNjMtMSkpCS8qIFZTWCBkaXNhYmxlIChiaXQgTkEgc2luY2UgUE9XRVI4KSAqLworI2RlZmluZSAgIFBDUl9UTV9ESVMJKDF1bCA8PCAoNjMtMikpCS8qIFRyYW5zLiBtZW1vcnkgZGlzYWJsZSAoUE9XRVI4KSAqLworI2RlZmluZSAgIFBDUl9BUkNIXzIwNgkweDQJCS8qIEFyY2hpdGVjdHVyZSAyLjA2ICovCiAjZGVmaW5lICAgUENSX0FSQ0hfMjA1CTB4MgkJLyogQXJjaGl0ZWN0dXJlIDIuMDUgKi8KICNkZWZpbmUJU1BSTl9IRUlSCTB4MTUzCS8qIEh5cGVydmlzb3IgRW11bGF0ZWQgSW5zdHJ1Y3Rpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9UTEJJTkRFWFIJMHgxNTQJLyogUDcgVExCIGNvbnRyb2wgcmVnaXN0ZXIgKi8KQEAgLTM2OCw2ICszODUsOCBAQAogI2RlZmluZSBERVJfRUJSS0UJMHgwMDAwMDAwMgkvKiBFeHRlcm5hbCBCcmVha3BvaW50IEludGVycnVwdCAqLwogI2RlZmluZSBERVJfRFBJRQkweDAwMDAwMDAxCS8qIERldi4gUG9ydCBOb25tYXNrYWJsZSBSZXF1ZXN0ICovCiAjZGVmaW5lIFNQUk5fRE1JU1MJMHgzRDAJCS8qIERhdGEgVExCIE1pc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BSTl9ESERFUwkweDBCMQkJLyogRGlyZWN0ZWQgSHlwLiBEb29yYmVsbCBFeGMuIFN0YXRlICovCisjZGVmaW5lIFNQUk5fRFBERVMJMHgwQjAJCS8qIERpcmVjdGVkIFByaXYuIERvb3JiZWxsIEV4Yy4gU3RhdGUgKi8KICNkZWZpbmUgU1BSTl9FQVIJMHgxMUEJCS8qIEV4dGVybmFsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9IQVNIMQkweDNEMgkJLyogUHJpbWFyeSBIYXNoIEFkZHJlc3MgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9IQVNIMgkweDNEMwkJLyogU2Vjb25kYXJ5IEhhc2ggQWRkcmVzcyBSZXNnaXN0ZXIgKi8KQEAgLTQyNyw2ICs0NDYsNyBAQAogI2RlZmluZSBTUFJOX0lBQlIJMHgzRjIJLyogSW5zdHJ1Y3Rpb24gQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fSUFCUjIJMHgzRkEJCS8qIDgzeHggKi8KICNkZWZpbmUgU1BSTl9JQkNSCTB4MTM1CQkvKiA4M3h4IEluc24gQnJlYWtwb2ludCBDb250cm9sIFJlZyAqLworI2RlZmluZSBTUFJOX0lBTVIJMHgwM0QJCS8qIEluc3RyLiBBdXRob3JpdHkgTWFzayBSZWcgKi8KICNkZWZpbmUgU1BSTl9ISUQ0CTB4M0Y0CQkvKiA5NzAgSElENCAqLwogI2RlZmluZSAgSElENF9MUEVTMAkgKDF1bCA8PCAoNjMtMCkpIC8qIExQQVIgZW52LiBzZWwuIGJpdCAwICovCiAjZGVmaW5lCSBISUQ0X1JNTFMyX1NICSAoNjMgLSAyKQkvKiBSZWFsIG1vZGUgbGltaXQgYm90dG9tIDIgYml0cyAqLwpAQCAtNTQxLDYgKzU2MSw3IEBACiAjZGVmaW5lIFNQUk5fUElSCTB4M0ZGCS8qIFByb2Nlc3NvciBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLwogI2VuZGlmCiAjZGVmaW5lIFNQUk5fVElSCTB4MUJFCS8qIFRocmVhZCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX1BTUEIJMHgwOUYJLyogUHJvYmxlbSBTdGF0ZSBQcmlvcml0eSBCb29zdCByZWcgKi8KICNkZWZpbmUgU1BSTl9QVEVISQkweDNENQkvKiA5ODEgNzQ1MCBQVEUgSEkgd29yZCAoUy9XIFRMQiBsb2FkKSAqLwogI2RlZmluZSBTUFJOX1BURUxPCTB4M0Q2CS8qIDk4MiA3NDUwIFBURSBMTyB3b3JkIChTL1cgVExCIGxvYWQpICovCiAjZGVmaW5lIFNQUk5fUFVSUgkweDEzNQkvKiBQcm9jZXNzb3IgVXRpbGl6YXRpb24gb2YgUmVzb3VyY2VzIFJlZyAqLwpAQCAtNjgyLDYgKzcwMyw3IEBACiAjZGVmaW5lIFNQUk5fRUJCSFIJODA0CS8qIEV2ZW50IGJhc2VkIGJyYW5jaCBoYW5kbGVyIHJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fRUJCUlIJODA1CS8qIEV2ZW50IGJhc2VkIGJyYW5jaCByZXR1cm4gcmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9CRVNDUgk4MDYJLyogQnJhbmNoIGV2ZW50IHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTUFJOX1dPUlQJODk1CS8qIFdvcmtsb2FkIG9wdGltaXphdGlvbiByZWdpc3RlciAtIHRocmVhZCAqLwogCiAjZGVmaW5lIFNQUk5fUE1DMQk3ODcKICNkZWZpbmUgU1BSTl9QTUMyCTc4OApAQCAtNjk4LDYgKzcyMCwxMSBAQAogI2RlZmluZSAgIFNJRVJfU0lIVgkJMHgxMDAwMDAwCS8qIFNhbXBsZWQgTVNSX0hWICovCiAjZGVmaW5lICAgU0lFUl9TSUFSX1ZBTElECTB4MDQwMDAwMAkvKiBTSUFSIGNvbnRlbnRzIHZhbGlkICovCiAjZGVmaW5lICAgU0lFUl9TREFSX1ZBTElECTB4MDIwMDAwMAkvKiBTREFSIGNvbnRlbnRzIHZhbGlkICovCisjZGVmaW5lIFNQUk5fVEFDUgk4ODgKKyNkZWZpbmUgU1BSTl9UQ1NDUgk4ODkKKyNkZWZpbmUgU1BSTl9DU0lHUgk4OTAKKyNkZWZpbmUgU1BSTl9TUE1DMQk4OTIKKyNkZWZpbmUgU1BSTl9TUE1DMgk4OTMKIAogLyogV2hlbiBFQkIgaXMgZW5hYmxlZCwgc29tZSBvZiBNTUNSMC9NTUNSMi9TSUVSIGFyZSB1c2VyIGFjY2Vzc2libGUgKi8KICNkZWZpbmUgTU1DUjBfVVNFUl9NQVNLCShNTUNSMF9GQyB8IE1NQ1IwX1BNWEUgfCBNTUNSMF9QTUFPKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCmluZGV4IGFhY2U5MDUuLjBlODNlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKQEAgLTI1LDEwICsyNSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV90YXIoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYpIHt9CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgbG9hZF91cF9mcHUodm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfa2VybmVsX2ZwKHZvaWQpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKHZvaWQpOwotZXh0ZXJuIHZvaWQgbG9hZF91cF9hbHRpdmVjKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgZW11bGF0ZV9hbHRpdmVjKHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgX19naXZldXBfdnN4KHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGdpdmV1cF92c3goc3RydWN0IHRhc2tfc3RydWN0ICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCmluZGV4IDQzNTIzZmUuLjNkZGY3MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKQEAgLTM1OSwzICszNTksNSBAQAogQ09NUEFUX1NZUyhwcm9jZXNzX3ZtX3dyaXRldikKIFNZU0NBTEwoZmluaXRfbW9kdWxlKQogU1lTQ0FMTChuaV9zeXNjYWxsKSAvKiBzeXNfa2NtcCAqLworU1lTQ0FMTF9TUFUoc2NoZWRfc2V0YXR0cikKK1NZU0NBTExfU1BVKHNjaGVkX2dldGF0dHIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggM2NhODE5Zi4uNDQ5NGYwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPHVhcGkvYXNtL3VuaXN0ZC5oPgogCiAKLSNkZWZpbmUgX19OUl9zeXNjYWxscwkJMzU1CisjZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTM1NwogCiAjZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0CiAjZGVmaW5lIE5SX3N5c2NhbGxzCV9fTlJfc3lzY2FsbHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggNjgzNmVjNy4uYTY2NjViZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKQEAgLTU0NSw2ICs1NDUsNyBAQAogI2RlZmluZSBLVk1fUkVHX1BQQ19UQ1NDUgkoS1ZNX1JFR19QUEMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMHhiMSkKICNkZWZpbmUgS1ZNX1JFR19QUENfUElECQkoS1ZNX1JFR19QUEMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMHhiMikKICNkZWZpbmUgS1ZNX1JFR19QUENfQUNPUAkoS1ZNX1JFR19QUEMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMHhiMykKKyNkZWZpbmUgS1ZNX1JFR19QUENfV09SVAkoS1ZNX1JFR19QUEMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMHhiNCkKIAogI2RlZmluZSBLVk1fUkVHX1BQQ19WUlNBVkUJKEtWTV9SRUdfUFBDIHwgS1ZNX1JFR19TSVpFX1UzMiB8IDB4YjQpCiAjZGVmaW5lIEtWTV9SRUdfUFBDX0xQQ1IJKEtWTV9SRUdfUFBDIHwgS1ZNX1JFR19TSVpFX1UzMiB8IDB4YjUpCkBAIC01NTMsNiArNTU0LDggQEAKIC8qIEFyY2hpdGVjdHVyZSBjb21wYXRpYmlsaXR5IGxldmVsICovCiAjZGVmaW5lIEtWTV9SRUdfUFBDX0FSQ0hfQ09NUEFUCShLVk1fUkVHX1BQQyB8IEtWTV9SRUdfU0laRV9VMzIgfCAweGI3KQogCisjZGVmaW5lIEtWTV9SRUdfUFBDX0RBQlJYCShLVk1fUkVHX1BQQyB8IEtWTV9SRUdfU0laRV9VMzIgfCAweGI4KQorCiAvKiBUcmFuc2FjdGlvbmFsIE1lbW9yeSBjaGVja3BvaW50ZWQgc3RhdGU6CiAgKiBUaGlzIGlzIGFsbCBHUFJzLCBhbGwgVlNYIHJlZ3MgYW5kIGEgc3Vic2V0IG9mIFNQUnMKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vdG0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL3RtLmgKaW5kZXggODUwNTlhMC4uNWQ4MzZiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vdG0uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS90bS5oCkBAIC02LDYgKzYsOCBAQAogICogdGhlIGZhaWx1cmUgaXMgcGVyc2lzdGVudC4gIFBBUFIgc2F2ZXMgMHhmZi0weGUwIGZvciB0aGUgaHlwZXJ2aXNvci4KICAqLwogI2RlZmluZSBUTV9DQVVTRV9QRVJTSVNURU5UCTB4MDEKKyNkZWZpbmUgVE1fQ0FVU0VfS1ZNX1JFU0NIRUQJMHhlMCAgLyogRnJvbSBQQVBSICovCisjZGVmaW5lIFRNX0NBVVNFX0tWTV9GQUNfVU5BVgkweGUyICAvKiBGcm9tIFBBUFIgKi8KICNkZWZpbmUgVE1fQ0FVU0VfUkVTQ0hFRAkweGRlCiAjZGVmaW5lIFRNX0NBVVNFX1RMQkkJCTB4ZGMKICNkZWZpbmUgVE1fQ0FVU0VfRkFDX1VOQVYJMHhkYQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAppbmRleCA3NGNiNGQ3Li44ODFiZjJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaApAQCAtMzc3LDYgKzM3Nyw3IEBACiAjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzUyCiAjZGVmaW5lIF9fTlJfZmluaXRfbW9kdWxlCTM1MwogI2RlZmluZSBfX05SX2tjbXAJCTM1NAotCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YXR0cgkzNTUKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhdHRyCTM1NgogCiAjZW5kaWYgLyogX1VBUElfQVNNX1BPV0VSUENfVU5JU1REX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA5MDRkNzEzLi5mY2M5YTg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTQ4LDcgKzQ4LDYgQEAKIG9iai0kKENPTkZJR19QUENfOTcwX05BUCkJKz0gaWRsZV9wb3dlcjQubwogb2JqLSQoQ09ORklHX1BQQ19QN19OQVApCSs9IGlkbGVfcG93ZXI3Lm8KIG9iai0kKENPTkZJR19QUENfT0YpCQkrPSBvZl9wbGF0Zm9ybS5vIHByb21fcGFyc2Uubwotb2JqLSQoQ09ORklHX1BQQ19DTE9DSykJCSs9IGNsb2NrLm8KIHByb2Nmcy15CQkJOj0gcHJvY19wb3dlcnBjLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gJChwcm9jZnMteSkKIHJ0YXNwY2ktJChDT05GSUdfUFBDNjQpLSQoQ09ORklHX1BDSSkJOj0gcnRhc19wY2kubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDhkMWQ5NGQuLmI1YWFjZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTQzOCwxOCArNDM4LDE0IEBACiAJREVGSU5FKFZDUFVfR1VFU1RfUElELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucGlkKSk7CiAJREVGSU5FKFZDUFVfR1BSUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmdwcikpOwogCURFRklORShWQ1BVX1ZSU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZyc2F2ZSkpOwotCURFRklORShWQ1BVX0ZQUlMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mcHIpKTsKLQlERUZJTkUoVkNQVV9GUFNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZwc2NyKSk7CisJREVGSU5FKFZDUFVfRlBSUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZwLmZwcikpOwogI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JREVGSU5FKFZDUFVfVlJTLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudnIpKTsKLQlERUZJTkUoVkNQVV9WU0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudnNjcikpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZTWAotCURFRklORShWQ1BVX1ZTUlMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52c3IpKTsKKwlERUZJTkUoVkNQVV9WUlMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52ci52cikpOwogI2VuZGlmCiAJREVGSU5FKFZDUFVfWEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gueGVyKSk7CiAJREVGSU5FKFZDUFVfQ1RSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3RyKSk7CiAJREVGSU5FKFZDUFVfTFIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5scikpOworCURFRklORShWQ1BVX1RBUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRhcikpOwogCURFRklORShWQ1BVX0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3IpKTsKIAlERUZJTkUoVkNQVV9QQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBjKSk7CiAjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfSFZfUE9TU0lCTEUKQEAgLTQ5NywxNiArNDkzLDI0IEBACiAJREVGSU5FKFZDUFVfREFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hyZWdzLmRhcikpOwogCURFRklORShWQ1BVX1ZQQSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZwYS5waW5uZWRfYWRkcikpOwogCURFRklORShWQ1BVX1ZQQV9ESVJUWSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZwYS5kaXJ0eSkpOworCURFRklORShWQ1BVX0lOVFJfTVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaW50cl9tc3IpKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCiAJREVGSU5FKFZDUFVfVkNQVUlELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHZjcHVfaWQpKTsKIAlERUZJTkUoVkNQVV9QVVJSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHVycikpOwogCURFRklORShWQ1BVX1NQVVJSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc3B1cnIpKTsKKwlERUZJTkUoVkNQVV9JQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmljKSk7CisJREVGSU5FKFZDUFVfVlRCLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudnRiKSk7CiAJREVGSU5FKFZDUFVfRFNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRzY3IpKTsKIAlERUZJTkUoVkNQVV9BTVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5hbXIpKTsKIAlERUZJTkUoVkNQVV9VQU1PUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnVhbW9yKSk7CisJREVGSU5FKFZDUFVfSUFNUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmlhbXIpKTsKIAlERUZJTkUoVkNQVV9DVFJMLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3RybCkpOwogCURFRklORShWQ1BVX0RBQlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kYWJyKSk7CisJREVGSU5FKFZDUFVfREFCUlgsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kYWJyeCkpOworCURFRklORShWQ1BVX0RBV1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kYXdyKSk7CisJREVGSU5FKFZDUFVfREFXUlgsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kYXdyeCkpOworCURFRklORShWQ1BVX0NJQUJSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY2lhYnIpKTsKIAlERUZJTkUoVkNQVV9IRkxBR1MsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5oZmxhZ3MpKTsKIAlERUZJTkUoVkNQVV9ERUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kZWMpKTsKIAlERUZJTkUoVkNQVV9ERUNfRVhQSVJFUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRlY19leHBpcmVzKSk7CkBAIC01MTUsOCArNTE5LDEwIEBACiAJREVGSU5FKFZDUFVfUFJPRERFRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnByb2RkZWQpKTsKIAlERUZJTkUoVkNQVV9NTUNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gubW1jcikpOwogCURFRklORShWQ1BVX1BNQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBtYykpOworCURFRklORShWQ1BVX1NQTUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zcG1jKSk7CiAJREVGSU5FKFZDUFVfU0lBUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNpYXIpKTsKIAlERUZJTkUoVkNQVV9TREFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2RhcikpOworCURFRklORShWQ1BVX1NJRVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaWVyKSk7CiAJREVGSU5FKFZDUFVfU0xCLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2xiKSk7CiAJREVGSU5FKFZDUFVfU0xCX01BWCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNsYl9tYXgpKTsKIAlERUZJTkUoVkNQVV9TTEJfTlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zbGJfbnIpKTsKQEAgLTUyNCwyMCArNTMwLDQ3IEBACiAJREVGSU5FKFZDUFVfRkFVTFRfREFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHRfZGFyKSk7CiAJREVGSU5FKFZDUFVfTEFTVF9JTlNULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gubGFzdF9pbnN0KSk7CiAJREVGSU5FKFZDUFVfVFJBUCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRyYXApKTsKLQlERUZJTkUoVkNQVV9QVElELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHRpZCkpOwogCURFRklORShWQ1BVX0NGQVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5jZmFyKSk7CiAJREVGSU5FKFZDUFVfUFBSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHByKSk7CisJREVGSU5FKFZDUFVfRlNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZzY3IpKTsKKwlERUZJTkUoVkNQVV9QU1BCLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHNwYikpOworCURFRklORShWQ1BVX0VCQkhSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZWJiaHIpKTsKKwlERUZJTkUoVkNQVV9FQkJSUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmViYnJyKSk7CisJREVGSU5FKFZDUFVfQkVTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5iZXNjcikpOworCURFRklORShWQ1BVX0NTSUdSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3NpZ3IpKTsKKwlERUZJTkUoVkNQVV9UQUNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudGFjcikpOworCURFRklORShWQ1BVX1RDU0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudGNzY3IpKTsKKwlERUZJTkUoVkNQVV9BQ09QLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guYWNvcCkpOworCURFRklORShWQ1BVX1dPUlQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC53b3J0KSk7CiAJREVGSU5FKFZDUFVfU0hBRE9XX1NSUjEsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaGFkb3dfc3JyMSkpOwogCURFRklORShWQ09SRV9FTlRSWV9FWElULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBlbnRyeV9leGl0X2NvdW50KSk7CiAJREVGSU5FKFZDT1JFX05BUF9DT1VOVCwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgbmFwX2NvdW50KSk7CiAJREVGSU5FKFZDT1JFX0lOX0dVRVNULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBpbl9ndWVzdCkpOwogCURFRklORShWQ09SRV9OQVBQSU5HX1RIUkVBRFMsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIG5hcHBpbmdfdGhyZWFkcykpOworCURFRklORShWQ09SRV9LVk0sIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGt2bSkpOwogCURFRklORShWQ09SRV9UQl9PRkZTRVQsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIHRiX29mZnNldCkpOwogCURFRklORShWQ09SRV9MUENSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBscGNyKSk7CiAJREVGSU5FKFZDT1JFX1BDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgcGNyKSk7CisJREVGSU5FKFZDT1JFX0RQREVTLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBkcGRlcykpOwogCURFRklORShWQ1BVX1NMQl9FLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3NsYiwgb3JpZ2UpKTsKIAlERUZJTkUoVkNQVV9TTEJfViwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19zbGIsIG9yaWd2KSk7CiAJREVGSU5FKFZDUFVfU0xCX1NJWkUsIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3NsYikpOworI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwlERUZJTkUoVkNQVV9URkhBUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRmaGFyKSk7CisJREVGSU5FKFZDUFVfVEZJQVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50ZmlhcikpOworCURFRklORShWQ1BVX1RFWEFTUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRleGFzcikpOworCURFRklORShWQ1BVX0dQUl9UTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmdwcl90bSkpOworCURFRklORShWQ1BVX0ZQUlNfVE0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mcF90bS5mcHIpKTsKKwlERUZJTkUoVkNQVV9WUlNfVE0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52cl90bS52cikpOworCURFRklORShWQ1BVX1ZSU0FWRV9UTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZyc2F2ZV90bSkpOworCURFRklORShWQ1BVX0NSX1RNLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3JfdG0pKTsKKwlERUZJTkUoVkNQVV9MUl9UTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmxyX3RtKSk7CisJREVGSU5FKFZDUFVfQ1RSX1RNLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3RyX3RtKSk7CisJREVGSU5FKFZDUFVfQU1SX1RNLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guYW1yX3RtKSk7CisJREVGSU5FKFZDUFVfUFBSX1RNLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHByX3RtKSk7CisJREVGSU5FKFZDUFVfRFNDUl9UTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRzY3JfdG0pKTsKKwlERUZJTkUoVkNQVV9UQVJfVE0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50YXJfdG0pKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUl9QT1NTSUJMRQpAQCAtNjAyLDYgKzYzNSw3IEBACiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9YSUNTX1BIWVMsIHhpY3NfcGh5cyk7CiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9TQVZFRF9YSVJSLCBzYXZlZF94aXJyKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX0hPU1RfSVBJLCBob3N0X2lwaSk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9QVElELCBwdGlkKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX01NQ1IsIGhvc3RfbW1jcik7CiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9QTUMsIGhvc3RfcG1jKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX1BVUlIsIGhvc3RfcHVycik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYwppbmRleCBhYmZhMDExLi4yOTEyYjg3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKQEAgLTc5Myw2ICs3OTMsOSBAQAogewogCXJlbW92ZV9pbmRleF9kaXJzKGNhY2hlX2Rpcik7CiAKKwkvKiBSZW1vdmUgY2FjaGUgZGlyIGZyb20gc3lzZnMgKi8KKwlrb2JqZWN0X2RlbChjYWNoZV9kaXItPmtvYmopOworCiAJa29iamVjdF9wdXQoY2FjaGVfZGlyLT5rb2JqKTsKIAogCWtmcmVlKGNhY2hlX2Rpcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2Nsb2NrLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjRiNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIER1bW15IGNsayBpbXBsZW1lbnRhdGlvbnMgZm9yIHBvd2VycGMuCi0gKiBUaGVzZSBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaW4gcGxhdGZvcm0gY29kZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxhc20vY2xrX2ludGVyZmFjZS5oPgotCi1zdHJ1Y3QgY2xrX2ludGVyZmFjZSBjbGtfZnVuY3Rpb25zOwotCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX2dldCkKLQkJcmV0dXJuIGNsa19mdW5jdGlvbnMuY2xrX2dldChkZXYsIGlkKTsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci0KLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX3B1dCkKLQkJY2xrX2Z1bmN0aW9ucy5jbGtfcHV0KGNsayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19wdXQpOwotCi1pbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX2VuYWJsZSkKLQkJcmV0dXJuIGNsa19mdW5jdGlvbnMuY2xrX2VuYWJsZShjbGspOwotCXJldHVybiAtRU5PU1lTOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKLQotdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX2Rpc2FibGUpCi0JCWNsa19mdW5jdGlvbnMuY2xrX2Rpc2FibGUoY2xrKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwotCi11bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX2dldF9yYXRlKQotCQlyZXR1cm4gY2xrX2Z1bmN0aW9ucy5jbGtfZ2V0X3JhdGUoY2xrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKLQotbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlpZiAoY2xrX2Z1bmN0aW9ucy5jbGtfcm91bmRfcmF0ZSkKLQkJcmV0dXJuIGNsa19mdW5jdGlvbnMuY2xrX3JvdW5kX3JhdGUoY2xrLCByYXRlKTsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3JvdW5kX3JhdGUpOwotCi1pbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCWlmIChjbGtfZnVuY3Rpb25zLmNsa19zZXRfcmF0ZSkKLQkJcmV0dXJuIGNsa19mdW5jdGlvbnMuY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7Ci0KLXN0cnVjdCBjbGsgKmNsa19nZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpZiAoY2xrX2Z1bmN0aW9ucy5jbGtfZ2V0X3BhcmVudCkKLQkJcmV0dXJuIGNsa19mdW5jdGlvbnMuY2xrX2dldF9wYXJlbnQoY2xrKTsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldF9wYXJlbnQpOwotCi1pbnQgY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCi17Ci0JaWYgKGNsa19mdW5jdGlvbnMuY2xrX3NldF9wYXJlbnQpCi0JCXJldHVybiBjbGtfZnVuY3Rpb25zLmNsa19zZXRfcGFyZW50KGNsaywgcGFyZW50KTsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3NldF9wYXJlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rdm0uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3ZtLmMKaW5kZXggZGIyODAzMi4uNmEwMTc1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2t2bS5jCkBAIC00MTMsMTMgKzQxMywxMyBAQAogewogCXUzMiAqZmVhdHVyZXMgPSBkYXRhOwogCi0JdWxvbmcgaW5bOF07CisJdWxvbmcgaW5bOF0gPSB7MH07CiAJdWxvbmcgb3V0WzhdOwogCiAJaW5bMF0gPSBLVk1fTUFHSUNfUEFHRTsKIAlpblsxXSA9IEtWTV9NQUdJQ19QQUdFOwogCi0Ja3ZtX2h5cGVyY2FsbChpbiwgb3V0LCBLVk1fSENBTExfVE9LRU4oS1ZNX0hDX1BQQ19NQVBfTUFHSUNfUEFHRSkpOworCWVwYXByX2h5cGVyY2FsbChpbiwgb3V0LCBLVk1fSENBTExfVE9LRU4oS1ZNX0hDX1BQQ19NQVBfTUFHSUNfUEFHRSkpOwogCiAJKmZlYXR1cmVzID0gb3V0WzBdOwogfQpAQCAtNzExLDQzICs3MTEsNiBAQAogCQkJIGt2bV9wYXRjaGluZ193b3JrZWQgPyAid29ya2VkIiA6ICJmYWlsZWQiKTsKIH0KIAotdW5zaWduZWQgbG9uZyBrdm1faHlwZXJjYWxsKHVuc2lnbmVkIGxvbmcgKmluLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgKm91dCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIG5yKQotewotCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjAgYXNtKCJyMCIpOwotCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjMgYXNtKCJyMyIpID0gaW5bMF07Ci0JdW5zaWduZWQgbG9uZyByZWdpc3RlciByNCBhc20oInI0IikgPSBpblsxXTsKLQl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHI1IGFzbSgicjUiKSA9IGluWzJdOwotCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjYgYXNtKCJyNiIpID0gaW5bM107Ci0JdW5zaWduZWQgbG9uZyByZWdpc3RlciByNyBhc20oInI3IikgPSBpbls0XTsKLQl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHI4IGFzbSgicjgiKSA9IGluWzVdOwotCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjkgYXNtKCJyOSIpID0gaW5bNl07Ci0JdW5zaWduZWQgbG9uZyByZWdpc3RlciByMTAgYXNtKCJyMTAiKSA9IGluWzddOwotCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXIgcjExIGFzbSgicjExIikgPSBucjsKLQl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyIHIxMiBhc20oInIxMiIpOwotCi0JYXNtIHZvbGF0aWxlKCJibAllcGFwcl9oeXBlcmNhbGxfc3RhcnQiCi0JCSAgICAgOiAiPXIiKHIwKSwgIj1yIihyMyksICI9ciIocjQpLCAiPXIiKHI1KSwgIj1yIihyNiksCi0JCSAgICAgICAiPXIiKHI3KSwgIj1yIihyOCksICI9ciIocjkpLCAiPXIiKHIxMCksICI9ciIocjExKSwKLQkJICAgICAgICI9ciIocjEyKQotCQkgICAgIDogInIiKHIzKSwgInIiKHI0KSwgInIiKHI1KSwgInIiKHI2KSwgInIiKHI3KSwgInIiKHI4KSwKLQkJICAgICAgICJyIihyOSksICJyIihyMTApLCAiciIocjExKQotCQkgICAgIDogIm1lbW9yeSIsICJjYyIsICJ4ZXIiLCAiY3RyIiwgImxyIik7Ci0KLQlvdXRbMF0gPSByNDsKLQlvdXRbMV0gPSByNTsKLQlvdXRbMl0gPSByNjsKLQlvdXRbM10gPSByNzsKLQlvdXRbNF0gPSByODsKLQlvdXRbNV0gPSByOTsKLQlvdXRbNl0gPSByMTA7Ci0Jb3V0WzddID0gcjExOwotCi0JcmV0dXJuIHIzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2h5cGVyY2FsbCk7Ci0KIHN0YXRpYyBfX2luaXQgdm9pZCBrdm1fZnJlZV90bXAodm9pZCkKIHsKIAlmcmVlX3Jlc2VydmVkX2FyZWEoJmt2bV90bXBba3ZtX3RtcF9pbmRleF0sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDY0YjdhNmUuLjhkNGMyNDdmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTgxMSw3ICs4MTEsNyBAQAogICogc2NoZWR1bGUgREFCUgogICovCiAjaWZuZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKLQlpZiAodW5saWtlbHkoaHdfYnJrX21hdGNoKCZfX2dldF9jcHVfdmFyKGN1cnJlbnRfYnJrKSwgJm5ldy0+dGhyZWFkLmh3X2JyaykpKQorCWlmICh1bmxpa2VseSghaHdfYnJrX21hdGNoKCZfX2dldF9jcHVfdmFyKGN1cnJlbnRfYnJrKSwgJm5ldy0+dGhyZWFkLmh3X2JyaykpKQogCQlzZXRfYnJlYWtwb2ludCgmbmV3LT50aHJlYWQuaHdfYnJrKTsKICNlbmRpZiAvKiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IDZjZTY5ZTYuLmE2N2UwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtMTAyMiwyOSArMTAyMiwyNCBAQAogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KIAl0bV9mcmFtZSA9ICZydF9zZi0+dWNfdHJhbnNhY3QudWNfbWNvbnRleHQ7CiAJaWYgKE1TUl9UTV9BQ1RJVkUocmVncy0+bXNyKSkgeworCQlpZiAoX19wdXRfdXNlcigodW5zaWduZWQgbG9uZykmcnRfc2YtPnVjX3RyYW5zYWN0LAorCQkJICAgICAgICZydF9zZi0+dWMudWNfbGluaykgfHwKKwkJICAgIF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpdG1fZnJhbWUsCisJCQkgICAgICAgJnJ0X3NmLT51Y190cmFuc2FjdC51Y19yZWdzKSkKKwkJCWdvdG8gYmFkZnJhbWU7CiAJCWlmIChzYXZlX3RtX3VzZXJfcmVncyhyZWdzLCBmcmFtZSwgdG1fZnJhbWUsIHNpZ3JldCkpCiAJCQlnb3RvIGJhZGZyYW1lOwogCX0KIAllbHNlCiAjZW5kaWYKIAl7CisJCWlmIChfX3B1dF91c2VyKDAsICZydF9zZi0+dWMudWNfbGluaykpCisJCQlnb3RvIGJhZGZyYW1lOwogCQlpZiAoc2F2ZV91c2VyX3JlZ3MocmVncywgZnJhbWUsIHRtX2ZyYW1lLCBzaWdyZXQsIDEpKQogCQkJZ290byBiYWRmcmFtZTsKIAl9CiAJcmVncy0+bGluayA9IHRyYW1wOwogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCWlmIChNU1JfVE1fQUNUSVZFKHJlZ3MtPm1zcikpIHsKLQkJaWYgKF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpJnJ0X3NmLT51Y190cmFuc2FjdCwKLQkJCSAgICAgICAmcnRfc2YtPnVjLnVjX2xpbmspCi0JCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKXRtX2ZyYW1lLCAmcnRfc2YtPnVjX3RyYW5zYWN0LnVjX3JlZ3MpKQotCQkJZ290byBiYWRmcmFtZTsKLQl9Ci0JZWxzZQotI2VuZGlmCi0JCWlmIChfX3B1dF91c2VyKDAsICZydF9zZi0+dWMudWNfbGluaykpCi0JCQlnb3RvIGJhZGZyYW1lOwotCiAJY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlLmZwc2NyID0gMDsJLyogdHVybiBvZmYgYWxsIGZwIGV4Y2VwdGlvbnMgKi8KIAogCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggZDRhNDNlNi4uOTdlMWRjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNTEsOCArNTEsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBlcl9jcHUoc210X3Nub296ZV9kZWxheSwgY3B1LT5kZXYuaWQpID0gc25vb3plOwotCXVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KGNwdS0+ZGV2LmlkLCBzbm9vemUpOwotCiAJcmV0dXJuIGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtLzQ0eC5jIGIvYXJjaC9wb3dlcnBjL2t2bS80NHguYwppbmRleCA5MzIyMWU4Li45Y2I0YjBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtLzQ0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vNDR4LmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpAQCAtMjMxLDMgKzIzMyw1IEBACiAKIG1vZHVsZV9pbml0KGt2bXBwY180NHhfaW5pdCk7CiBtb2R1bGVfZXhpdChrdm1wcGNfNDR4X2V4aXQpOworTU9EVUxFX0FMSUFTX01JU0NERVYoS1ZNX01JTk9SKTsKK01PRFVMRV9BTElBUygiZGV2bmFtZTprdm0iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCmluZGV4IDg5MTI2MDguLjk0ZTU5N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CkBAIC01NzUsMTAgKzU3NywxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgS1ZNX1JFR19QUENfRlBSMCAuLi4gS1ZNX1JFR19QUENfRlBSMzE6CiAJCQlpID0gcmVnLT5pZCAtIEtWTV9SRUdfUFBDX0ZQUjA7Ci0JCQl2YWwgPSBnZXRfcmVnX3ZhbChyZWctPmlkLCB2Y3B1LT5hcmNoLmZwcltpXSk7CisJCQl2YWwgPSBnZXRfcmVnX3ZhbChyZWctPmlkLCBWQ1BVX0ZQUih2Y3B1LCBpKSk7CiAJCQlicmVhazsKIAkJY2FzZSBLVk1fUkVHX1BQQ19GUFNDUjoKLQkJCXZhbCA9IGdldF9yZWdfdmFsKHJlZy0+aWQsIHZjcHUtPmFyY2guZnBzY3IpOworCQkJdmFsID0gZ2V0X3JlZ192YWwocmVnLT5pZCwgdmNwdS0+YXJjaC5mcC5mcHNjcik7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCQljYXNlIEtWTV9SRUdfUFBDX1ZSMCAuLi4gS1ZNX1JFR19QUENfVlIzMToKQEAgLTU4NiwxOSArNTg4LDMwIEBACiAJCQkJciA9IC1FTlhJTzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXZhbC52dmFsID0gdmNwdS0+YXJjaC52cltyZWctPmlkIC0gS1ZNX1JFR19QUENfVlIwXTsKKwkJCXZhbC52dmFsID0gdmNwdS0+YXJjaC52ci52cltyZWctPmlkIC0gS1ZNX1JFR19QUENfVlIwXTsKIAkJCWJyZWFrOwogCQljYXNlIEtWTV9SRUdfUFBDX1ZTQ1I6CiAJCQlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKSB7CiAJCQkJciA9IC1FTlhJTzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXZhbCA9IGdldF9yZWdfdmFsKHJlZy0+aWQsIHZjcHUtPmFyY2gudnNjci51WzNdKTsKKwkJCXZhbCA9IGdldF9yZWdfdmFsKHJlZy0+aWQsIHZjcHUtPmFyY2gudnIudnNjci51WzNdKTsKIAkJCWJyZWFrOwogCQljYXNlIEtWTV9SRUdfUFBDX1ZSU0FWRToKIAkJCXZhbCA9IGdldF9yZWdfdmFsKHJlZy0+aWQsIHZjcHUtPmFyY2gudnJzYXZlKTsKIAkJCWJyZWFrOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCisjaWZkZWYgQ09ORklHX1ZTWAorCQljYXNlIEtWTV9SRUdfUFBDX1ZTUjAgLi4uIEtWTV9SRUdfUFBDX1ZTUjMxOgorCQkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1ZTWCkpIHsKKwkJCQlsb25nIGludCBpID0gcmVnLT5pZCAtIEtWTV9SRUdfUFBDX1ZTUjA7CisJCQkJdmFsLnZzeHZhbFswXSA9IHZjcHUtPmFyY2guZnAuZnByW2ldWzBdOworCQkJCXZhbC52c3h2YWxbMV0gPSB2Y3B1LT5hcmNoLmZwLmZwcltpXVsxXTsKKwkJCX0gZWxzZSB7CisJCQkJciA9IC1FTlhJTzsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19WU1ggKi8KIAkJY2FzZSBLVk1fUkVHX1BQQ19ERUJVR19JTlNUOiB7CiAJCQl1MzIgb3Bjb2RlID0gSU5TX1RXOwogCQkJciA9IGNvcHlfdG9fdXNlcigodTMyIF9fdXNlciAqKShsb25nKXJlZy0+YWRkciwKQEAgLTY1NCwxMCArNjY3LDEwIEBACiAJCQlicmVhazsKIAkJY2FzZSBLVk1fUkVHX1BQQ19GUFIwIC4uLiBLVk1fUkVHX1BQQ19GUFIzMToKIAkJCWkgPSByZWctPmlkIC0gS1ZNX1JFR19QUENfRlBSMDsKLQkJCXZjcHUtPmFyY2guZnByW2ldID0gc2V0X3JlZ192YWwocmVnLT5pZCwgdmFsKTsKKwkJCVZDUFVfRlBSKHZjcHUsIGkpID0gc2V0X3JlZ192YWwocmVnLT5pZCwgdmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIEtWTV9SRUdfUFBDX0ZQU0NSOgotCQkJdmNwdS0+YXJjaC5mcHNjciA9IHNldF9yZWdfdmFsKHJlZy0+aWQsIHZhbCk7CisJCQl2Y3B1LT5hcmNoLmZwLmZwc2NyID0gc2V0X3JlZ192YWwocmVnLT5pZCwgdmFsKTsKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJCWNhc2UgS1ZNX1JFR19QUENfVlIwIC4uLiBLVk1fUkVHX1BQQ19WUjMxOgpAQCAtNjY1LDE0ICs2NzgsMTQgQEAKIAkJCQlyID0gLUVOWElPOwogCQkJCWJyZWFrOwogCQkJfQotCQkJdmNwdS0+YXJjaC52cltyZWctPmlkIC0gS1ZNX1JFR19QUENfVlIwXSA9IHZhbC52dmFsOworCQkJdmNwdS0+YXJjaC52ci52cltyZWctPmlkIC0gS1ZNX1JFR19QUENfVlIwXSA9IHZhbC52dmFsOwogCQkJYnJlYWs7CiAJCWNhc2UgS1ZNX1JFR19QUENfVlNDUjoKIAkJCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpIHsKIAkJCQlyID0gLUVOWElPOwogCQkJCWJyZWFrOwogCQkJfQotCQkJdmNwdS0+YXJjaC52c2NyLnVbM10gPSBzZXRfcmVnX3ZhbChyZWctPmlkLCB2YWwpOworCQkJdmNwdS0+YXJjaC52ci52c2NyLnVbM10gPSBzZXRfcmVnX3ZhbChyZWctPmlkLCB2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgS1ZNX1JFR19QUENfVlJTQVZFOgogCQkJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkgewpAQCAtNjgyLDYgKzY5NSwxNyBAQAogCQkJdmNwdS0+YXJjaC52cnNhdmUgPSBzZXRfcmVnX3ZhbChyZWctPmlkLCB2YWwpOwogCQkJYnJlYWs7CiAjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KKyNpZmRlZiBDT05GSUdfVlNYCisJCWNhc2UgS1ZNX1JFR19QUENfVlNSMCAuLi4gS1ZNX1JFR19QUENfVlNSMzE6CisJCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVlNYKSkgeworCQkJCWxvbmcgaW50IGkgPSByZWctPmlkIC0gS1ZNX1JFR19QUENfVlNSMDsKKwkJCQl2Y3B1LT5hcmNoLmZwLmZwcltpXVswXSA9IHZhbC52c3h2YWxbMF07CisJCQkJdmNwdS0+YXJjaC5mcC5mcHJbaV1bMV0gPSB2YWwudnN4dmFsWzFdOworCQkJfSBlbHNlIHsKKwkJCQlyID0gLUVOWElPOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX1ZTWCAqLwogI2lmZGVmIENPTkZJR19LVk1fWElDUwogCQljYXNlIEtWTV9SRUdfUFBDX0lDUF9TVEFURToKIAkJCWlmICghdmNwdS0+YXJjaC5pY3ApIHsKQEAgLTg3OSwzICs5MDMsOSBAQAogCiBtb2R1bGVfaW5pdChrdm1wcGNfYm9vazNzX2luaXQpOwogbW9kdWxlX2V4aXQoa3ZtcHBjX2Jvb2szc19leGl0KTsKKworLyogT24gMzJiaXQgdGhpcyBpcyBvdXIgb25lIGFuZCBvbmx5IGtlcm5lbCBtb2R1bGUgKi8KKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU18zMgorTU9EVUxFX0FMSUFTX01JU0NERVYoS1ZNX01JTk9SKTsKK01PRFVMRV9BTElBUygiZGV2bmFtZTprdm0iKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfbW11X2hvc3QuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdV9ob3N0LmMKaW5kZXggM2EwYWJkMi4uNWZhYzg5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfbW11X2hvc3QuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9tbXVfaG9zdC5jCkBAIC0yNDMsNiArMjQzLDExIEBACiAJLyogTm93IHRlbGwgb3VyIFNoYWRvdyBQVEUgY29kZSBhYm91dCB0aGUgbmV3IHBhZ2UgKi8KIAogCXB0ZSA9IGt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHZjcHUpOworCWlmICghcHRlKSB7CisJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihocGFkZHIgPj4gUEFHRV9TSElGVCk7CisJCXIgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CiAKIAlkcHJpbnRrX21tdSgiS1ZNOiAlYyVjIE1hcCAweCVsbHg6IFslbHhdIDB4JWxseCAoMHglbGx4KSAtPiAlbHhcbiIsCiAJCSAgICBvcmlnX3B0ZS0+bWF5X3dyaXRlID8gJ3cnIDogJy0nLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11X2h2LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaHYuYwppbmRleCBjNWQxNDg0Li4zMDNlY2U3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaHYuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaHYuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIHN0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X2h2X3Jlc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Ja3ZtcHBjX3NldF9tc3IodmNwdSwgTVNSX1NGIHwgTVNSX01FKTsKKwlrdm1wcGNfc2V0X21zcih2Y3B1LCB2Y3B1LT5hcmNoLmludHJfbXNyKTsKIH0KIAogLyoKQEAgLTU2Miw3ICs1NjIsNyBAQAogCSAqIHdlIGp1c3QgcmV0dXJuIGFuZCByZXRyeSB0aGUgaW5zdHJ1Y3Rpb24uCiAJICovCiAKLQlpZiAoaW5zdHJ1Y3Rpb25faXNfc3RvcmUodmNwdS0+YXJjaC5sYXN0X2luc3QpICE9ICEhaXNfc3RvcmUpCisJaWYgKGluc3RydWN0aW9uX2lzX3N0b3JlKGt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpKSAhPSAhIWlzX3N0b3JlKQogCQlyZXR1cm4gUkVTVU1FX0dVRVNUOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYwppbmRleCA4NTI5ODlhLi4yMGQ0ZWE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19leHBvcnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZXhwb3J0cy5jCkBAIC0yNSw5ICsyNSw1IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUl9QT1NTSUJMRQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2VudHJ5X3RyYW1wb2xpbmUpOwotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2xvYWRfdXBfZnB1KTsKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2xvYWRfdXBfYWx0aXZlYyk7Ci0jZW5kaWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwppbmRleCAzODE4YmQ5Li4xN2ZjOTQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpAQCAtODUsMTAgKzg2LDEzIEBACiAKIAkvKiBDUFUgcG9pbnRzIHRvIHRoZSBmaXJzdCB0aHJlYWQgb2YgdGhlIGNvcmUgKi8KIAlpZiAoY3B1ICE9IG1lICYmIGNwdSA+PSAwICYmIGNwdSA8IG5yX2NwdV9pZHMpIHsKKyNpZmRlZiBDT05GSUdfS1ZNX1hJQ1MKIAkJaW50IHJlYWxfY3B1ID0gY3B1ICsgdmNwdS0+YXJjaC5wdGlkOwogCQlpZiAocGFjYVtyZWFsX2NwdV0ua3ZtX2hzdGF0ZS54aWNzX3BoeXMpCiAJCQl4aWNzX3dha2VfY3B1KHJlYWxfY3B1KTsKLQkJZWxzZSBpZiAoY3B1X29ubGluZShjcHUpKQorCQllbHNlCisjZW5kaWYKKwkJaWYgKGNwdV9vbmxpbmUoY3B1KSkKIAkJCXNtcF9zZW5kX3Jlc2NoZWR1bGUoY3B1KTsKIAl9CiAJcHV0X2NwdSgpOwpAQCAtMTgyLDE0ICsxODYsMjggQEAKIAogCQlzd2l0Y2ggKGFyY2hfY29tcGF0KSB7CiAJCWNhc2UgUFZSX0FSQ0hfMjA1OgotCQkJcGNyID0gUENSX0FSQ0hfMjA1OworCQkJLyoKKwkJCSAqIElmIGFuIGFyY2ggYml0IGlzIHNldCBpbiBQQ1IsIGFsbCB0aGUgZGVmaW5lZAorCQkJICogaGlnaGVyLW9yZGVyIGFyY2ggYml0cyBhbHNvIGhhdmUgdG8gYmUgc2V0LgorCQkJICovCisJCQlwY3IgPSBQQ1JfQVJDSF8yMDYgfCBQQ1JfQVJDSF8yMDU7CiAJCQlicmVhazsKIAkJY2FzZSBQVlJfQVJDSF8yMDY6CiAJCWNhc2UgUFZSX0FSQ0hfMjA2cDoKKwkJCXBjciA9IFBDUl9BUkNIXzIwNjsKKwkJCWJyZWFrOworCQljYXNlIFBWUl9BUkNIXzIwNzoKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKworCQlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA3UykpIHsKKwkJCS8qIFBPV0VSNyBjYW4ndCBlbXVsYXRlIFBPV0VSOCAqLworCQkJaWYgKCEocGNyICYgUENSX0FSQ0hfMjA2KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXBjciAmPSB+UENSX0FSQ0hfMjA2OworCQl9CiAJfQogCiAJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CkBAIC02MzcsNiArNjU1LDcgQEAKIAkJciA9IFJFU1VNRV9HVUVTVDsKIAkJYnJlYWs7CiAJY2FzZSBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMOgorCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9IX0RPT1JCRUxMOgogCQl2Y3B1LT5zdGF0LmV4dF9pbnRyX2V4aXRzKys7CiAJCXIgPSBSRVNVTUVfR1VFU1Q7CiAJCWJyZWFrOwpAQCAtNjczLDEyICs2OTIsMTAgQEAKIAkJLyogaGNhbGwgLSBwdW50IHRvIHVzZXJzcGFjZSAqLwogCQlpbnQgaTsKIAotCQlpZiAodmNwdS0+YXJjaC5zaHJlZ3MubXNyICYgTVNSX1BSKSB7Ci0JCQkvKiBzYyAxIGZyb20gdXNlcnNwYWNlIC0gcmVmbGVjdCB0byBndWVzdCBzeXNjYWxsICovCi0JCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMKTsKLQkJCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCQlicmVhazsKLQkJfQorCQkvKiBoeXBlcmNhbGwgd2l0aCBNU1JfUFIgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHJtb2RlLAorCQkgKiBhbmQgbmV2ZXIgcmVhY2hlcyBoZXJlLgorCQkgKi8KKwogCQlydW4tPnBhcHJfaGNhbGwubnIgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCAzKTsKIAkJZm9yIChpID0gMDsgaSA8IDk7ICsraSkKIAkJCXJ1bi0+cGFwcl9oY2FsbC5hcmdzW2ldID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNCArIGkpOwpAQCAtNzA4LDcgKzcyNSwxNiBAQAogCSAqIHdlIGRvbid0IGVtdWxhdGUgYW55IGd1ZXN0IGluc3RydWN0aW9ucyBhdCB0aGlzIHN0YWdlLgogCSAqLwogCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9IX0VNVUxfQVNTSVNUOgotCQlrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHZjcHUsIDB4ODAwMDApOworCQlrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHZjcHUsIFNSUjFfUFJPR0lMTCk7CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCS8qCisJICogVGhpcyBvY2N1cnMgaWYgdGhlIGd1ZXN0IChrZXJuZWwgb3IgdXNlcnNwYWNlKSwgZG9lcyBzb21ldGhpbmcgdGhhdAorCSAqIGlzIHByb2hpYml0ZWQgYnkgSEZTQ1IuICBXZSBqdXN0IGdlbmVyYXRlIGEgcHJvZ3JhbSBpbnRlcnJ1cHQgdG8KKwkgKiB0aGUgZ3Vlc3QuCisJICovCisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0hfRkFDX1VOQVZBSUw6CisJCWt2bXBwY19jb3JlX3F1ZXVlX3Byb2dyYW0odmNwdSwgU1JSMV9QUk9HSUxMKTsKIAkJciA9IFJFU1VNRV9HVUVTVDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTc2NiwxMCArNzkyLDM0IEBACiAKIAlzcGluX2xvY2soJnZjLT5sb2NrKTsKIAkvKgorCSAqIElmIElMRSAoaW50ZXJydXB0IGxpdHRsZS1lbmRpYW4pIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlCisJICogTVNSX0xFIGJpdCBpbiB0aGUgaW50cl9tc3IgZm9yIGVhY2ggdmNwdSBpbiB0aGlzIHZjb3JlLgorCSAqLworCWlmICgobmV3X2xwY3IgJiBMUENSX0lMRSkgIT0gKHZjLT5scGNyICYgTFBDUl9JTEUpKSB7CisJCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKKwkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCQlpbnQgaTsKKworCQltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBrdm0pIHsKKwkJCWlmICh2Y3B1LT5hcmNoLnZjb3JlICE9IHZjKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5ld19scGNyICYgTFBDUl9JTEUpCisJCQkJdmNwdS0+YXJjaC5pbnRyX21zciB8PSBNU1JfTEU7CisJCQllbHNlCisJCQkJdmNwdS0+YXJjaC5pbnRyX21zciAmPSB+TVNSX0xFOworCQl9CisJCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwl9CisKKwkvKgogCSAqIFVzZXJzcGFjZSBjYW4gb25seSBtb2RpZnkgRFBGRCAoZGVmYXVsdCBwcmVmZXRjaCBkZXB0aCksCiAJICogSUxFIChpbnRlcnJ1cHQgbGl0dGxlLWVuZGlhbikgYW5kIFRDICh0cmFuc2xhdGlvbiBjb250cm9sKS4KKwkgKiBPbiBQT1dFUjggdXNlcnNwYWNlIGNhbiBhbHNvIG1vZGlmeSBBSUwgKGFsdC4gaW50ZXJydXB0IGxvYy4pCiAJICovCiAJbWFzayA9IExQQ1JfRFBGRCB8IExQQ1JfSUxFIHwgTFBDUl9UQzsKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDdTKSkKKwkJbWFzayB8PSBMUENSX0FJTDsKIAl2Yy0+bHBjciA9ICh2Yy0+bHBjciAmIH5tYXNrKSB8IChuZXdfbHBjciAmIG1hc2spOwogCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CiB9CkBAIC03ODcsNiArODM3LDkgQEAKIAljYXNlIEtWTV9SRUdfUFBDX0RBQlI6CiAJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5kYWJyKTsKIAkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19EQUJSWDoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmRhYnJ4KTsKKwkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX1BQQ19EU0NSOgogCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guZHNjcik7CiAJCWJyZWFrOwpAQCAtODAyLDcgKzg1NSw3IEBACiAJY2FzZSBLVk1fUkVHX1BQQ19VQU1PUjoKIAkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnVhbW9yKTsKIAkJYnJlYWs7Ci0JY2FzZSBLVk1fUkVHX1BQQ19NTUNSMCAuLi4gS1ZNX1JFR19QUENfTU1DUkE6CisJY2FzZSBLVk1fUkVHX1BQQ19NTUNSMCAuLi4gS1ZNX1JFR19QUENfTU1DUlM6CiAJCWkgPSBpZCAtIEtWTV9SRUdfUFBDX01NQ1IwOwogCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gubW1jcltpXSk7CiAJCWJyZWFrOwpAQCAtODEwLDMzICs4NjMsODcgQEAKIAkJaSA9IGlkIC0gS1ZNX1JFR19QUENfUE1DMTsKIAkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnBtY1tpXSk7CiAJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfU1BNQzEgLi4uIEtWTV9SRUdfUFBDX1NQTUMyOgorCQlpID0gaWQgLSBLVk1fUkVHX1BQQ19TUE1DMTsKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnNwbWNbaV0pOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX1NJQVI6CiAJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5zaWFyKTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX1BQQ19TREFSOgogCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guc2Rhcik7CiAJCWJyZWFrOwotI2lmZGVmIENPTkZJR19WU1gKLQljYXNlIEtWTV9SRUdfUFBDX0ZQUjAgLi4uIEtWTV9SRUdfUFBDX0ZQUjMxOgotCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVlNYKSkgewotCQkJLyogVlNYID0+IEZQIHJlZyBpIGlzIHN0b3JlZCBpbiBhcmNoLnZzclsyKmldICovCi0JCQlsb25nIGludCBpID0gaWQgLSBLVk1fUkVHX1BQQ19GUFIwOwotCQkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnZzclsyICogaV0pOwotCQl9IGVsc2UgewotCQkJLyogbGV0IGdlbmVyaWMgY29kZSBoYW5kbGUgaXQgKi8KLQkJCXIgPSAtRUlOVkFMOwotCQl9CisJY2FzZSBLVk1fUkVHX1BQQ19TSUVSOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guc2llcik7CiAJCWJyZWFrOwotCWNhc2UgS1ZNX1JFR19QUENfVlNSMCAuLi4gS1ZNX1JFR19QUENfVlNSMzE6Ci0JCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9WU1gpKSB7Ci0JCQlsb25nIGludCBpID0gaWQgLSBLVk1fUkVHX1BQQ19WU1IwOwotCQkJdmFsLT52c3h2YWxbMF0gPSB2Y3B1LT5hcmNoLnZzclsyICogaV07Ci0JCQl2YWwtPnZzeHZhbFsxXSA9IHZjcHUtPmFyY2gudnNyWzIgKiBpICsgMV07Ci0JCX0gZWxzZSB7Ci0JCQlyID0gLUVOWElPOwotCQl9CisJY2FzZSBLVk1fUkVHX1BQQ19JQU1SOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guaWFtcik7CiAJCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19WU1ggKi8KKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJY2FzZSBLVk1fUkVHX1BQQ19URkhBUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnRmaGFyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19URklBUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnRmaWFyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19URVhBU1I6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC50ZXhhc3IpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgS1ZNX1JFR19QUENfRlNDUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmZzY3IpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1BTUEI6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5wc3BiKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19FQkJIUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmViYmhyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19FQkJSUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmViYnJyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19CRVNDUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmJlc2NyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19UQVI6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC50YXIpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX0RQREVTOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gudmNvcmUtPmRwZGVzKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19EQVdSOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guZGF3cik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfREFXUlg6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5kYXdyeCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfQ0lBQlI6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5jaWFicik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfSUM6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5pYyk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfVlRCOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gudnRiKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19DU0lHUjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmNzaWdyKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19UQUNSOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gudGFjcik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfVENTQ1I6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC50Y3Njcik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfUElEOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gucGlkKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19BQ09QOgorCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2guYWNvcCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfV09SVDoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLndvcnQpOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX1ZQQV9BRERSOgogCQlzcGluX2xvY2soJnZjcHUtPmFyY2gudnBhX3VwZGF0ZV9sb2NrKTsKIAkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnZwYS5uZXh0X2dwYSk7CkBAIC04OTAsNiArOTk3LDkgQEAKIAljYXNlIEtWTV9SRUdfUFBDX0RBQlI6CiAJCXZjcHUtPmFyY2guZGFiciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKIAkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19EQUJSWDoKKwkJdmNwdS0+YXJjaC5kYWJyeCA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKSAmIH5EQUJSWF9IWVA7CisJCWJyZWFrOwogCWNhc2UgS1ZNX1JFR19QUENfRFNDUjoKIAkJdmNwdS0+YXJjaC5kc2NyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQlicmVhazsKQEAgLTkwNSw3ICsxMDE1LDcgQEAKIAljYXNlIEtWTV9SRUdfUFBDX1VBTU9SOgogCQl2Y3B1LT5hcmNoLnVhbW9yID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQlicmVhazsKLQljYXNlIEtWTV9SRUdfUFBDX01NQ1IwIC4uLiBLVk1fUkVHX1BQQ19NTUNSQToKKwljYXNlIEtWTV9SRUdfUFBDX01NQ1IwIC4uLiBLVk1fUkVHX1BQQ19NTUNSUzoKIAkJaSA9IGlkIC0gS1ZNX1JFR19QUENfTU1DUjA7CiAJCXZjcHUtPmFyY2gubW1jcltpXSA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKIAkJYnJlYWs7CkBAIC05MTMsMzMgKzEwMjMsOTAgQEAKIAkJaSA9IGlkIC0gS1ZNX1JFR19QUENfUE1DMTsKIAkJdmNwdS0+YXJjaC5wbWNbaV0gPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CiAJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfU1BNQzEgLi4uIEtWTV9SRUdfUFBDX1NQTUMyOgorCQlpID0gaWQgLSBLVk1fUkVHX1BQQ19TUE1DMTsKKwkJdmNwdS0+YXJjaC5zcG1jW2ldID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX1NJQVI6CiAJCXZjcHUtPmFyY2guc2lhciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX1BQQ19TREFSOgogCQl2Y3B1LT5hcmNoLnNkYXIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CiAJCWJyZWFrOwotI2lmZGVmIENPTkZJR19WU1gKLQljYXNlIEtWTV9SRUdfUFBDX0ZQUjAgLi4uIEtWTV9SRUdfUFBDX0ZQUjMxOgotCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVlNYKSkgewotCQkJLyogVlNYID0+IEZQIHJlZyBpIGlzIHN0b3JlZCBpbiBhcmNoLnZzclsyKmldICovCi0JCQlsb25nIGludCBpID0gaWQgLSBLVk1fUkVHX1BQQ19GUFIwOwotCQkJdmNwdS0+YXJjaC52c3JbMiAqIGldID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwotCQl9IGVsc2UgewotCQkJLyogbGV0IGdlbmVyaWMgY29kZSBoYW5kbGUgaXQgKi8KLQkJCXIgPSAtRUlOVkFMOwotCQl9CisJY2FzZSBLVk1fUkVHX1BQQ19TSUVSOgorCQl2Y3B1LT5hcmNoLnNpZXIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CiAJCWJyZWFrOwotCWNhc2UgS1ZNX1JFR19QUENfVlNSMCAuLi4gS1ZNX1JFR19QUENfVlNSMzE6Ci0JCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9WU1gpKSB7Ci0JCQlsb25nIGludCBpID0gaWQgLSBLVk1fUkVHX1BQQ19WU1IwOwotCQkJdmNwdS0+YXJjaC52c3JbMiAqIGldID0gdmFsLT52c3h2YWxbMF07Ci0JCQl2Y3B1LT5hcmNoLnZzclsyICogaSArIDFdID0gdmFsLT52c3h2YWxbMV07Ci0JCX0gZWxzZSB7Ci0JCQlyID0gLUVOWElPOwotCQl9CisJY2FzZSBLVk1fUkVHX1BQQ19JQU1SOgorCQl2Y3B1LT5hcmNoLmlhbXIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CiAJCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19WU1ggKi8KKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJY2FzZSBLVk1fUkVHX1BQQ19URkhBUjoKKwkJdmNwdS0+YXJjaC50ZmhhciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19URklBUjoKKwkJdmNwdS0+YXJjaC50ZmlhciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19URVhBU1I6CisJCXZjcHUtPmFyY2gudGV4YXNyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgS1ZNX1JFR19QUENfRlNDUjoKKwkJdmNwdS0+YXJjaC5mc2NyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1BTUEI6CisJCXZjcHUtPmFyY2gucHNwYiA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19FQkJIUjoKKwkJdmNwdS0+YXJjaC5lYmJociA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19FQkJSUjoKKwkJdmNwdS0+YXJjaC5lYmJyciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19CRVNDUjoKKwkJdmNwdS0+YXJjaC5iZXNjciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19UQVI6CisJCXZjcHUtPmFyY2gudGFyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX0RQREVTOgorCQl2Y3B1LT5hcmNoLnZjb3JlLT5kcGRlcyA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19EQVdSOgorCQl2Y3B1LT5hcmNoLmRhd3IgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfREFXUlg6CisJCXZjcHUtPmFyY2guZGF3cnggPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCkgJiB+REFXUlhfSFlQOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX0NJQUJSOgorCQl2Y3B1LT5hcmNoLmNpYWJyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQkvKiBEb24ndCBhbGxvdyBzZXR0aW5nIGJyZWFrcG9pbnRzIGluIGh5cGVydmlzb3IgY29kZSAqLworCQlpZiAoKHZjcHUtPmFyY2guY2lhYnIgJiBDSUFCUl9QUklWKSA9PSBDSUFCUl9QUklWX0hZUEVSKQorCQkJdmNwdS0+YXJjaC5jaWFiciAmPSB+Q0lBQlJfUFJJVjsJLyogZGlzYWJsZSAqLworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX0lDOgorCQl2Y3B1LT5hcmNoLmljID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1ZUQjoKKwkJdmNwdS0+YXJjaC52dGIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfQ1NJR1I6CisJCXZjcHUtPmFyY2guY3NpZ3IgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfVEFDUjoKKwkJdmNwdS0+YXJjaC50YWNyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1RDU0NSOgorCQl2Y3B1LT5hcmNoLnRjc2NyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1BJRDoKKwkJdmNwdS0+YXJjaC5waWQgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19QUENfQUNPUDoKKwkJdmNwdS0+YXJjaC5hY29wID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1dPUlQ6CisJCXZjcHUtPmFyY2gud29ydCA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKKwkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX1BQQ19WUEFfQUREUjoKIAkJYWRkciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKIAkJciA9IC1FSU5WQUw7CkBAIC0xMDE3LDYgKzExODQsNyBAQAogCXNwaW5fbG9ja19pbml0KCZ2Y3B1LT5hcmNoLnZwYV91cGRhdGVfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnZjcHUtPmFyY2gudGJhY2N0X2xvY2spOwogCXZjcHUtPmFyY2guYnVzeV9wcmVlbXB0ID0gVEJfTklMOworCXZjcHUtPmFyY2guaW50cl9tc3IgPSBNU1JfU0YgfCBNU1JfTUU7CiAKIAlrdm1wcGNfbW11X2Jvb2szc19odl9pbml0KHZjcHUpOwogCkBAIC0xMDM0LDYgKzEyMDIsOCBAQAogCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdmNvcmUtPndxKTsKIAkJCXZjb3JlLT5wcmVlbXB0X3RiID0gVEJfTklMOwogCQkJdmNvcmUtPmxwY3IgPSBrdm0tPmFyY2gubHBjcjsKKwkJCXZjb3JlLT5maXJzdF92Y3B1aWQgPSBjb3JlICogdGhyZWFkc19wZXJfY29yZTsKKwkJCXZjb3JlLT5rdm0gPSBrdm07CiAJCX0KIAkJa3ZtLT5hcmNoLnZjb3Jlc1tjb3JlXSA9IHZjb3JlOwogCQlrdm0tPmFyY2gub25saW5lX3Zjb3JlcysrOwpAQCAtMTA0Nyw2ICsxMjE3LDcgQEAKIAkrK3Zjb3JlLT5udW1fdGhyZWFkczsKIAlzcGluX3VubG9jaygmdmNvcmUtPmxvY2spOwogCXZjcHUtPmFyY2gudmNvcmUgPSB2Y29yZTsKKwl2Y3B1LT5hcmNoLnB0aWQgPSB2Y3B1LT52Y3B1X2lkIC0gdmNvcmUtPmZpcnN0X3ZjcHVpZDsKIAogCXZjcHUtPmFyY2guY3B1X3R5cGUgPSBLVk1fQ1BVXzNTXzY0OwogCWt2bXBwY19zYW5pdHlfY2hlY2sodmNwdSk7CkBAIC0xMTEwLDcgKzEyODEsNyBAQAogCX0KIH0KIAotZXh0ZXJuIGludCBfX2t2bXBwY192Y29yZV9lbnRyeShzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2V4dGVybiB2b2lkIF9fa3ZtcHBjX3Zjb3JlX2VudHJ5KHZvaWQpOwogCiBzdGF0aWMgdm9pZCBrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjLAogCQkJCSAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTExODQsMTMgKzEzNTUsMTYgQEAKIAl0cGFjYSA9ICZwYWNhW2NwdV07CiAJdHBhY2EtPmt2bV9oc3RhdGUua3ZtX3ZjcHUgPSB2Y3B1OwogCXRwYWNhLT5rdm1faHN0YXRlLmt2bV92Y29yZSA9IHZjOwotCXRwYWNhLT5rdm1faHN0YXRlLm5hcHBpbmcgPSAwOworCXRwYWNhLT5rdm1faHN0YXRlLnB0aWQgPSB2Y3B1LT5hcmNoLnB0aWQ7CiAJdmNwdS0+Y3B1ID0gdmMtPnBjcHU7CiAJc21wX3dtYigpOwogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19JQ1BfTkFUSVZFKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JaWYgKHZjcHUtPmFyY2gucHRpZCkgeworCWlmIChjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisjaWZkZWYgQ09ORklHX0tWTV9YSUNTCiAJCXhpY3Nfd2FrZV9jcHUoY3B1KTsKLQkJKyt2Yy0+bl93b2tlbjsKKyNlbmRpZgorCQlpZiAodmNwdS0+YXJjaC5wdGlkKQorCQkJKyt2Yy0+bl93b2tlbjsKIAl9CiAjZW5kaWYKIH0KQEAgLTEyNDcsMTAgKzE0MjEsMTAgQEAKICAqLwogc3RhdGljIHZvaWQga3ZtcHBjX3J1bl9jb3JlKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQogewotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnZjcHUwLCAqdm5leHQ7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCAqdm5leHQ7CiAJbG9uZyByZXQ7CiAJdTY0IG5vdzsKLQlpbnQgcHRpZCwgaSwgbmVlZF92cGFfdXBkYXRlOworCWludCBpLCBuZWVkX3ZwYV91cGRhdGU7CiAJaW50IHNyY3VfaWR4OwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdXNfdG9fdXBkYXRlW3RocmVhZHNfcGVyX2NvcmVdOwogCkBAIC0xMjg4LDI1ICsxNDYyLDYgQEAKIAl9CiAKIAkvKgotCSAqIEFzc2lnbiBwaHlzaWNhbCB0aHJlYWQgSURzLCBmaXJzdCB0byBub24tY2VkZWQgdmNwdXMKLQkgKiBhbmQgdGhlbiB0byBjZWRlZCBvbmVzLgotCSAqLwotCXB0aWQgPSAwOwotCXZjcHUwID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkgewotCQlpZiAoIXZjcHUtPmFyY2guY2VkZWQpIHsKLQkJCWlmICghcHRpZCkKLQkJCQl2Y3B1MCA9IHZjcHU7Ci0JCQl2Y3B1LT5hcmNoLnB0aWQgPSBwdGlkKys7Ci0JCX0KLQl9Ci0JaWYgKCF2Y3B1MCkKLQkJZ290byBvdXQ7CS8qIG5vdGhpbmcgdG8gcnVuOyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCi0JCWlmICh2Y3B1LT5hcmNoLmNlZGVkKQotCQkJdmNwdS0+YXJjaC5wdGlkID0gcHRpZCsrOwotCi0JLyoKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgb24gdGhyZWFkIDAsIGFuZCB0aGF0CiAJICogc2Vjb25kYXJ5IHRocmVhZHMgYXJlIG9mZmxpbmUuCiAJICovCkBAIC0xMzIyLDE1ICsxNDc3LDE5IEBACiAJCWt2bXBwY19jcmVhdGVfZHRsX2VudHJ5KHZjcHUsIHZjKTsKIAl9CiAKKwkvKiBTZXQgdGhpcyBleHBsaWNpdGx5IGluIGNhc2UgdGhyZWFkIDAgZG9lc24ndCBoYXZlIGEgdmNwdSAqLworCWdldF9wYWNhKCktPmt2bV9oc3RhdGUua3ZtX3Zjb3JlID0gdmM7CisJZ2V0X3BhY2EoKS0+a3ZtX2hzdGF0ZS5wdGlkID0gMDsKKwogCXZjLT52Y29yZV9zdGF0ZSA9IFZDT1JFX1JVTk5JTkc7CiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKIAogCWt2bV9ndWVzdF9lbnRlcigpOwogCi0Jc3JjdV9pZHggPSBzcmN1X3JlYWRfbG9jaygmdmNwdTAtPmt2bS0+c3JjdSk7CisJc3JjdV9pZHggPSBzcmN1X3JlYWRfbG9jaygmdmMtPmt2bS0+c3JjdSk7CiAKLQlfX2t2bXBwY192Y29yZV9lbnRyeShOVUxMLCB2Y3B1MCk7CisJX19rdm1wcGNfdmNvcmVfZW50cnkoKTsKIAogCXNwaW5fbG9jaygmdmMtPmxvY2spOwogCS8qIGRpc2FibGUgc2VuZGluZyBvZiBJUElzIG9uIHZpcnR1YWwgZXh0ZXJuYWwgaXJxcyAqLwpAQCAtMTM0NSw3ICsxNTA0LDcgQEAKIAl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9FWElUSU5HOwogCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CiAKLQlzcmN1X3JlYWRfdW5sb2NrKCZ2Y3B1MC0+a3ZtLT5zcmN1LCBzcmN1X2lkeCk7CisJc3JjdV9yZWFkX3VubG9jaygmdmMtPmt2bS0+c3JjdSwgc3JjdV9pZHgpOwogCiAJLyogbWFrZSBzdXJlIHVwZGF0ZXMgdG8gc2Vjb25kYXJ5IHZjcHUgc3RydWN0cyBhcmUgdmlzaWJsZSBub3cgKi8KIAlzbXBfbWIoKTsKQEAgLTE0NTMsNyArMTYxMiw2IEBACiAJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQlpZiAodmMtPnZjb3JlX3N0YXRlID09IFZDT1JFX1JVTk5JTkcgJiYKIAkJICAgIFZDT1JFX0VYSVRfQ09VTlQodmMpID09IDApIHsKLQkJCXZjcHUtPmFyY2gucHRpZCA9IHZjLT5uX3J1bm5hYmxlIC0gMTsKIAkJCWt2bXBwY19jcmVhdGVfZHRsX2VudHJ5KHZjcHUsIHZjKTsKIAkJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7CiAJCX0gZWxzZSBpZiAodmMtPnZjb3JlX3N0YXRlID09IFZDT1JFX1NMRUVQSU5HKSB7CkBAIC0yMDQ4LDYgKzIyMDYsOSBAQAogCQkJTFBDUl9WUE0wIHwgTFBDUl9WUE0xOwogCQlrdm0tPmFyY2gudnJtYV9zbGJfdiA9IFNMQl9WU0lEX0JfMVQgfAogCQkJKFZSTUFfVlNJRCA8PCBTTEJfVlNJRF9TSElGVF8xVCk7CisJCS8qIE9uIFBPV0VSOCB0dXJuIG9uIG9ubGluZSBiaXQgdG8gZW5hYmxlIFBVUlIvU1BVUlIgKi8KKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA3UykpCisJCQlscGNyIHw9IExQQ1JfT05MOwogCX0KIAlrdm0tPmFyY2gubHBjciA9IGxwY3I7CiAKQEAgLTIyMjIsMyArMjM4Myw1IEBACiBtb2R1bGVfaW5pdChrdm1wcGNfYm9vazNzX2luaXRfaHYpOwogbW9kdWxlX2V4aXQoa3ZtcHBjX2Jvb2szc19leGl0X2h2KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKEtWTV9NSU5PUik7CitNT0RVTEVfQUxJQVMoImRldm5hbWU6a3ZtIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9pbnRlcnJ1cHRzLlMKaW5kZXggOTI4MTQyYy4uZTg3Mzc5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfaW50ZXJydXB0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2ludGVycnVwdHMuUwpAQCAtMzUsNyArMzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFJlZ2lzdGVyczoKLSAqICByNDogdmNwdSBwb2ludGVyCisgKiAgbm9uZQogICovCiBfR0xPQkFMKF9fa3ZtcHBjX3Zjb3JlX2VudHJ5KQogCkBAIC01Nyw5ICs1NywxMSBAQAogCXN0ZAlyMywgSFNUQVRFX0RTQ1IocjEzKQogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCiAKK0JFR0lOX0ZUUl9TRUNUSU9OCiAJLyogU2F2ZSBob3N0IERBQlIgKi8KIAltZnNwcglyMywgU1BSTl9EQUJSCiAJc3RkCXIzLCBIU1RBVEVfREFCUihyMTMpCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAKIAkvKiBIYXJkLWRpc2FibGUgaW50ZXJydXB0cyAqLwogCW1mbXNyICAgcjEwCkBAIC02OSw3ICs3MSw2IEBACiAJbXRtc3JkICByMTAsMQogCiAJLyogU2F2ZSBob3N0IFBNVSByZWdpc3RlcnMgKi8KLQkvKiBSNCBpcyBsaXZlIGhlcmUgKHZjcHUgcG9pbnRlcikgYnV0IG5vdCByMyBvciByNSAqLwogCWxpCXIzLCAxCiAJc2xkaQlyMywgcjMsIDMxCQkvKiBNTUNSMF9GQyAoZnJlZXplIGNvdW50ZXJzKSBiaXQgKi8KIAltZnNwcglyNywgU1BSTl9NTUNSMAkJLyogc2F2ZSBNTUNSMCAqLwpAQCAtMTM0LDE2ICsxMzUsMTUgQEAKIAkgKiBlbnRlcnMgdGhlIGd1ZXN0IHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgogCSAqLwogQkVHSU5fRlRSX1NFQ1RJT04KKwlsZAlyNCwgSFNUQVRFX0tWTV9WQ1BVKHIxMykKIAlsZAlyMCwgVkNQVV9QRU5ESU5HX0VYQyhyNCkKIAlsaQlyNywgKDEgPDwgQk9PSzNTX0lSUVBSSU9fRVhURVJOQUwpCiAJb3JpcwlyNywgcjcsICgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMX0xFVkVMKUBoCiAJYW5kLglyMCwgcjAsIHI3CiAJYmVxCTMyZgotCW1yCXIzMSwgcjQKIAlsaHoJcjMsIFBBQ0FQQUNBSU5ERVgocjEzKQogCWJsCXNtcF9zZW5kX3Jlc2NoZWR1bGUKIAlub3AKLQltcglyNCwgcjMxCiAzMjoKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1fbW11LmMKaW5kZXggODY4OWUyZS4uMzdmYjNjYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1fbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1fbW11LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCXVubG9ja19ybWFwKHJtYXApOwogfQogCi1zdGF0aWMgcHRlX3QgbG9va3VwX2xpbnV4X3B0ZShwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgaHZhLAorc3RhdGljIHB0ZV90IGxvb2t1cF9saW51eF9wdGVfYW5kX3VwZGF0ZShwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgaHZhLAogCQkJICAgICAgaW50IHdyaXRpbmcsIHVuc2lnbmVkIGxvbmcgKnB0ZV9zaXplcCkKIHsKIAlwdGVfdCAqcHRlcDsKQEAgLTIzMiw3ICsyMzIsOCBAQAogCiAJCS8qIExvb2sgdXAgdGhlIExpbnV4IFBURSBmb3IgdGhlIGJhY2tpbmcgcGFnZSAqLwogCQlwdGVfc2l6ZSA9IHBzaXplOwotCQlwdGUgPSBsb29rdXBfbGludXhfcHRlKHBnZGlyLCBodmEsIHdyaXRpbmcsICZwdGVfc2l6ZSk7CisJCXB0ZSA9IGxvb2t1cF9saW51eF9wdGVfYW5kX3VwZGF0ZShwZ2RpciwgaHZhLCB3cml0aW5nLAorCQkJCQkJICAmcHRlX3NpemUpOwogCQlpZiAocHRlX3ByZXNlbnQocHRlKSkgewogCQkJaWYgKHdyaXRpbmcgJiYgIXB0ZV93cml0ZShwdGUpKQogCQkJCS8qIG1ha2UgdGhlIGFjdHVhbCBIUFRFIGJlIHJlYWQtb25seSAqLwpAQCAtNjcyLDcgKzY3Myw4IEBACiAJCQltZW1zbG90ID0gX19nZm5fdG9fbWVtc2xvdChrdm1fbWVtc2xvdHMoa3ZtKSwgZ2ZuKTsKIAkJCWlmIChtZW1zbG90KSB7CiAJCQkJaHZhID0gX19nZm5fdG9faHZhX21lbXNsb3QobWVtc2xvdCwgZ2ZuKTsKLQkJCQlwdGUgPSBsb29rdXBfbGludXhfcHRlKHBnZGlyLCBodmEsIDEsICZwc2l6ZSk7CisJCQkJcHRlID0gbG9va3VwX2xpbnV4X3B0ZV9hbmRfdXBkYXRlKHBnZGlyLCBodmEsCisJCQkJCQkJCSAgMSwgJnBzaXplKTsKIAkJCQlpZiAocHRlX3ByZXNlbnQocHRlKSAmJiAhcHRlX3dyaXRlKHB0ZSkpCiAJCQkJCXIgPSBocHRlX21ha2VfcmVhZG9ubHkocik7CiAJCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKaW5kZXggYmU0ZmEwNGEuLmU2NmQ0ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKQEAgLTMzLDYgKzMzLDEwIEBACiAjZXJyb3IgTmVlZCB0byBmaXggbHBwYWNhIGFuZCBTTEIgc2hhZG93IGFjY2Vzc2VzIGluIGxpdHRsZSBlbmRpYW4gbW9kZQogI2VuZGlmCiAKKy8qIFZhbHVlcyBpbiBIU1RBVEVfTkFQUElORyhyMTMpICovCisjZGVmaW5lIE5BUFBJTkdfQ0VERQkxCisjZGVmaW5lIE5BUFBJTkdfTk9WQ1BVCTIKKwogLyoKICAqIENhbGwga3ZtcHBjX2h2X2VudHJ5IGluIHJlYWwgbW9kZS4KICAqIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBoYXJkLWRpc2FibGVkLgpAQCAtNTcsMjkgKzYxLDIzIEBACiAJUkZJCiAKIGt2bXBwY19jYWxsX2h2X2VudHJ5OgorCWxkCXI0LCBIU1RBVEVfS1ZNX1ZDUFUocjEzKQogCWJsCWt2bXBwY19odl9lbnRyeQogCiAJLyogQmFjayBmcm9tIGd1ZXN0IC0gcmVzdG9yZSBob3N0IHN0YXRlIGFuZCByZXR1cm4gdG8gY2FsbGVyICovCiAKK0JFR0lOX0ZUUl9TRUNUSU9OCiAJLyogUmVzdG9yZSBob3N0IERBQlIgYW5kIERBQlJYICovCiAJbGQJcjUsSFNUQVRFX0RBQlIocjEzKQogCWxpCXI2LDcKIAltdHNwcglTUFJOX0RBQlIscjUKIAltdHNwcglTUFJOX0RBQlJYLHI2CitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAKIAkvKiBSZXN0b3JlIFNQUkczICovCiAJbGQJcjMsUEFDQV9TUFJHMyhyMTMpCiAJbXRzcHIJU1BSTl9TUFJHMyxyMwogCi0JLyoKLQkgKiBSZWxvYWQgREVDLiAgSERFQyBpbnRlcnJ1cHRzIHdlcmUgZGlzYWJsZWQgd2hlbgotCSAqIHdlIHJlbG9hZGVkIHRoZSBob3N0J3MgTFBDUiB2YWx1ZS4KLQkgKi8KLQlsZAlyMywgSFNUQVRFX0RFQ0VYUChyMTMpCi0JbWZ0YglyNAotCXN1YmYJcjQsIHI0LCByMwotCW10c3ByCVNQUk5fREVDLCByNAotCiAJLyogUmVsb2FkIHRoZSBob3N0J3MgUE1VIHJlZ2lzdGVycyAqLwogCWxkCXIzLCBQQUNBTFBQQUNBUFRSKHIxMykJLyogaXMgdGhlIGhvc3QgdXNpbmcgdGhlIFBNVT8gKi8KIAlsYnoJcjQsIExQUEFDQV9QTUNJTlVTRShyMykKQEAgLTExNSw2ICsxMTMsMTUgQEAKIDIzOgogCiAJLyoKKwkgKiBSZWxvYWQgREVDLiAgSERFQyBpbnRlcnJ1cHRzIHdlcmUgZGlzYWJsZWQgd2hlbgorCSAqIHdlIHJlbG9hZGVkIHRoZSBob3N0J3MgTFBDUiB2YWx1ZS4KKwkgKi8KKwlsZAlyMywgSFNUQVRFX0RFQ0VYUChyMTMpCisJbWZ0YglyNAorCXN1YmYJcjQsIHI0LCByMworCW10c3ByCVNQUk5fREVDLCByNAorCisJLyoKIAkgKiBGb3IgZXh0ZXJuYWwgYW5kIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0cywgd2UgbmVlZAogCSAqIHRvIGNhbGwgdGhlIExpbnV4IGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgaW50ZXJydXB0LgogCSAqIFdlIGRvIHRoYXQgYnkganVtcGluZyB0byBhYnNvbHV0ZSBhZGRyZXNzIDB4NTAwIGZvcgpAQCAtMTUzLDE1ICsxNjAsNzUgQEAKIAogMTM6CWIJbWFjaGluZV9jaGVja19md25taQogCitrdm1wcGNfcHJpbWFyeV9ub19ndWVzdDoKKwkvKiBXZSBoYW5kbGUgdGhpcyBtdWNoIGxpa2UgYSBjZWRlZCB2Y3B1ICovCisJLyogc2V0IG91ciBiaXQgaW4gbmFwcGluZ190aHJlYWRzICovCisJbGQJcjUsIEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWxieglyNywgSFNUQVRFX1BUSUQocjEzKQorCWxpCXIwLCAxCisJc2xkCXIwLCByMCwgcjcKKwlhZGRpCXI2LCByNSwgVkNPUkVfTkFQUElOR19USFJFQURTCisxOglsd2FyeAlyMywgMCwgcjYKKwlvcglyMywgcjMsIHIwCisJc3R3Y3guCXIzLCAwLCByNgorCWJuZQkxYgorCS8qIG9yZGVyIG5hcHBpbmdfdGhyZWFkcyB1cGRhdGUgdnMgdGVzdGluZyBlbnRyeV9leGl0X2NvdW50ICovCisJaXN5bmMKKwlsaQlyMTIsIDAKKwlsd3oJcjcsIFZDT1JFX0VOVFJZX0VYSVQocjUpCisJY21wd2kJcjcsIDB4MTAwCisJYmdlCWt2bV9ub3ZjcHVfZXhpdAkvKiBhbm90aGVyIHRocmVhZCBhbHJlYWR5IGV4aXRpbmcgKi8KKwlsaQlyMywgTkFQUElOR19OT1ZDUFUKKwlzdGIJcjMsIEhTVEFURV9OQVBQSU5HKHIxMykKKwlsaQlyMywgMQorCXN0YglyMywgSFNUQVRFX0hXVEhSRUFEX1JFUShyMTMpCisKKwliCWt2bV9kb19uYXAKKwora3ZtX25vdmNwdV93YWtldXA6CisJbGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKKwlsZAlyNSwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJbGkJcjAsIDAKKwlzdGIJcjAsIEhTVEFURV9OQVBQSU5HKHIxMykKKwlzdGIJcjAsIEhTVEFURV9IV1RIUkVBRF9SRVEocjEzKQorCisJLyogY2hlY2sgdGhlIHdha2UgcmVhc29uICovCisJYmwJa3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uCisJCisJLyogc2VlIGlmIGFueSBvdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBleGl0aW5nICovCisJbHd6CXIwLCBWQ09SRV9FTlRSWV9FWElUKHI1KQorCWNtcHdpCXIwLCAweDEwMAorCWJnZQlrdm1fbm92Y3B1X2V4aXQKKworCS8qIGNsZWFyIG91ciBiaXQgaW4gbmFwcGluZ190aHJlYWRzICovCisJbGJ6CXI3LCBIU1RBVEVfUFRJRChyMTMpCisJbGkJcjAsIDEKKwlzbGQJcjAsIHIwLCByNworCWFkZGkJcjYsIHI1LCBWQ09SRV9OQVBQSU5HX1RIUkVBRFMKKzQ6CWx3YXJ4CXI3LCAwLCByNgorCWFuZGMJcjcsIHI3LCByMAorCXN0d2N4LglyNywgMCwgcjYKKwlibmUJNGIKKworCS8qIFNlZSBpZiB0aGUgd2FrZSByZWFzb24gbWVhbnMgd2UgbmVlZCB0byBleGl0ICovCisJY21wZGkJcjMsIDAKKwliZ2UJa3ZtX25vdmNwdV9leGl0CisKKwkvKiBHb3QgYW4gSVBJIGJ1dCBvdGhlciB2Y3B1cyBhcmVuJ3QgeWV0IGV4aXRpbmcsIG11c3QgYmUgYSBsYXRlY29tZXIgKi8KKwlsZAlyNCwgSFNUQVRFX0tWTV9WQ1BVKHIxMykKKwljbXBkaQlyNCwgMAorCWJuZQlrdm1wcGNfZ290X2d1ZXN0CisKK2t2bV9ub3ZjcHVfZXhpdDoKKwliCWhkZWNfc29vbgorCiAvKgotICogV2UgY29tZSBpbiBoZXJlIHdoZW4gd2FrZW5lZCBmcm9tIG5hcCBtb2RlIG9uIGEgc2Vjb25kYXJ5IGh3IHRocmVhZC4KKyAqIFdlIGNvbWUgaW4gaGVyZSB3aGVuIHdha2VuZWQgZnJvbSBuYXAgbW9kZS4KICAqIFJlbG9jYXRpb24gaXMgb2ZmIGFuZCBtb3N0IHJlZ2lzdGVyIHZhbHVlcyBhcmUgbG9zdC4KICAqIHIxMyBwb2ludHMgdG8gdGhlIFBBQ0EuCiAgKi8KIAkuZ2xvYmwJa3ZtX3N0YXJ0X2d1ZXN0CiBrdm1fc3RhcnRfZ3Vlc3Q6Ci0JbGQJcjEsUEFDQUVNRVJHU1AocjEzKQotCXN1YmkJcjEscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsZAlyMixQQUNBVE9DKHIxMykKIAogCWxpCXIwLEtWTV9IV1RIUkVBRF9JTl9LVk0KQEAgLTE3Myw4ICsyNDAsMTMgQEAKIAogCS8qIHdlcmUgd2UgbmFwcGluZyBkdWUgdG8gY2VkZT8gKi8KIAlsYnoJcjAsSFNUQVRFX05BUFBJTkcocjEzKQotCWNtcHdpCXIwLDAKLQlibmUJa3ZtX2VuZF9jZWRlCisJY21wd2kJcjAsTkFQUElOR19DRURFCisJYmVxCWt2bV9lbmRfY2VkZQorCWNtcHdpCXIwLE5BUFBJTkdfTk9WQ1BVCisJYmVxCWt2bV9ub3ZjcHVfd2FrZXVwCisKKwlsZAlyMSxQQUNBRU1FUkdTUChyMTMpCisJc3ViaQlyMSxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCiAJLyoKIAkgKiBXZSB3ZXJlbid0IG5hcHBpbmcgZHVlIHRvIGNlZGUsIHNvIHRoaXMgbXVzdCBiZSBhIHNlY29uZGFyeQpAQCAtMTg0LDQwICsyNTYsMjIgQEAKIAkgKi8KIAogCS8qIENoZWNrIHRoZSB3YWtlIHJlYXNvbiBpbiBTUlIxIHRvIHNlZSB3aHkgd2UgZ290IGhlcmUgKi8KLQltZnNwcglyMyxTUFJOX1NSUjEKLQlybHdpbm0JcjMscjMsNDQtMzEsMHg3CQkvKiBleHRyYWN0IHdha2UgcmVhc29uIGZpZWxkICovCi0JY21wd2kJcjMsNAkJCS8qIHdhcyBpdCBhbiBleHRlcm5hbCBpbnRlcnJ1cHQ/ICovCi0JYm5lCTI3ZgkJCS8qIGlmIG5vdCAqLwotCWxkCXI1LEhTVEFURV9YSUNTX1BIWVMocjEzKQotCWxpCXI3LFhJQ1NfWElSUgkJLyogaWYgaXQgd2FzIGFuIGV4dGVybmFsIGludGVycnVwdCwgKi8KLQlsd3pjaXgJcjgscjUscjcJCS8qIGdldCBhbmQgYWNrIHRoZSBpbnRlcnJ1cHQgKi8KLQlzeW5jCi0JY2xybGRpLglyOSxyOCw0MAkJLyogZ2V0IGludGVycnVwdCBzb3VyY2UgSUQuICovCi0JYmVxCTI4ZgkJCS8qIG5vbmUgdGhlcmU/ICovCi0JY21wd2kJcjksWElDU19JUEkJCS8qIHdhcyBpdCBhbiBJUEk/ICovCi0JYm5lCTI5ZgotCWxpCXIwLDB4ZmYKLQlsaQlyNixYSUNTX01GUlIKLQlzdGJjaXgJcjAscjUscjYJCS8qIGNsZWFyIElQSSAqLwotCXN0d2NpeAlyOCxyNSxyNwkJLyogRU9JIHRoZSBpbnRlcnJ1cHQgKi8KLQlzeW5jCQkJCS8qIG9yZGVyIGxvYWRpbmcgb2YgdmNwdSBhZnRlciB0aGF0ICovCisJYmwJa3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uCisJY21wZGkJcjMsIDAKKwliZ2UJa3ZtX25vX2d1ZXN0CiAKIAkvKiBnZXQgdmNwdSBwb2ludGVyLCBOVUxMIGlmIHdlIGhhdmUgbm8gdmNwdSB0byBydW4gKi8KIAlsZAlyNCxIU1RBVEVfS1ZNX1ZDUFUocjEzKQogCWNtcGRpCXI0LDAKIAkvKiBpZiB3ZSBoYXZlIG5vIHZjcHUgdG8gcnVuLCBnbyBiYWNrIHRvIHNsZWVwICovCiAJYmVxCWt2bV9ub19ndWVzdAotCWIJMzBmCiAKLTI3OgkvKiBYWFggc2hvdWxkIGhhbmRsZSBoeXBlcnZpc29yIG1haW50ZW5hbmNlIGludGVycnVwdHMgZXRjLiBoZXJlICovCi0JYglrdm1fbm9fZ3Vlc3QKLTI4OgkvKiBTUlIxIHNhaWQgZXh0ZXJuYWwgYnV0IElDUCBzYWlkIG5vcGU/PyAqLwotCWIJa3ZtX25vX2d1ZXN0Ci0yOToJLyogRXh0ZXJuYWwgbm9uLUlQSSBpbnRlcnJ1cHQgdG8gb2ZmbGluZSBzZWNvbmRhcnkgdGhyZWFkPyBoZWxwPz8gKi8KLQlzdHcJcjgsSFNUQVRFX1NBVkVEX1hJUlIocjEzKQotCWIJa3ZtX25vX2d1ZXN0CisJLyogU2V0IEhTVEFURV9EU0NSKHIxMykgdG8gc29tZXRoaW5nIHNlbnNpYmxlICovCisJTE9BRF9SRUdfQUREUihyNiwgZHNjcl9kZWZhdWx0KQorCWxkCXI2LCAwKHI2KQorCXN0ZAlyNiwgSFNUQVRFX0RTQ1IocjEzKQogCi0zMDoJYmwJa3ZtcHBjX2h2X2VudHJ5CisJYmwJa3ZtcHBjX2h2X2VudHJ5CiAKIAkvKiBCYWNrIGZyb20gdGhlIGd1ZXN0LCBnbyBiYWNrIHRvIG5hcCAqLwogCS8qIENsZWFyIG91ciB2Y3B1IHBvaW50ZXIgc28gd2UgZG9uJ3QgY29tZSBiYWNrIGluIGVhcmx5ICovCkBAIC0yMjksMTggKzI4Myw2IEBACiAJICogdmlzaWJsZSB3ZSBjb3VsZCBiZSBnaXZlbiBhbm90aGVyIHZjcHUuCiAJICovCiAJbHdzeW5jCi0JLyogQ2xlYXIgYW55IHBlbmRpbmcgSVBJIC0gd2UncmUgYW4gb2ZmbGluZSB0aHJlYWQgKi8KLQlsZAlyNSwgSFNUQVRFX1hJQ1NfUEhZUyhyMTMpCi0JbGkJcjcsIFhJQ1NfWElSUgotCWx3emNpeAlyMywgcjUsIHI3CQkvKiBhY2sgYW55IHBlbmRpbmcgaW50ZXJydXB0ICovCi0Jcmx3aW5tLglyMCwgcjMsIDAsIDB4ZmZmZmZmCS8qIGFueSBwZW5kaW5nPyAqLwotCWJlcQkzN2YKLQlzeW5jCi0JbGkJcjAsIDB4ZmYKLQlsaQlyNiwgWElDU19NRlJSCi0Jc3RiY2l4CXIwLCByNSwgcjYJCS8qIGNsZWFyIHRoZSBJUEkgKi8KLQlzdHdjaXgJcjMsIHI1LCByNwkJLyogRU9JIGl0ICovCi0zNzoJc3luYwogCiAJLyogaW5jcmVtZW50IHRoZSBuYXAgY291bnQgYW5kIHRoZW4gZ28gdG8gbmFwIG1vZGUgKi8KIAlsZAlyNCwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCkBAIC0yNTMsNiArMjk1LDcgQEAKIGt2bV9ub19ndWVzdDoKIAlsaQlyMCwgS1ZNX0hXVEhSRUFEX0lOX05BUAogCXN0YglyMCwgSFNUQVRFX0hXVEhSRUFEX1NUQVRFKHIxMykKK2t2bV9kb19uYXA6CiAJbGkJcjMsIExQQ1JfUEVDRTAKIAltZnNwcglyNCwgU1BSTl9MUENSCiAJcmx3aW1pCXI0LCByMywgMCwgTFBDUl9QRUNFMCB8IExQQ1JfUEVDRTEKQEAgLTI3Nyw3ICszMjAsNyBAQAogCiAJLyogUmVxdWlyZWQgc3RhdGU6CiAJICoKLQkgKiBSNCA9IHZjcHUgcG9pbnRlcgorCSAqIFI0ID0gdmNwdSBwb2ludGVyIChvciBOVUxMKQogCSAqIE1TUiA9IH5JUnxEUgogCSAqIFIxMyA9IFBBQ0EKIAkgKiBSMSA9IGhvc3QgUjEKQEAgLTI4NywxMjIgKzMzMCwxMiBAQAogCXN0ZAlyMCwgUFBDX0xSX1NUS09GRihyMSkKIAlzdGR1CXIxLCAtMTEyKHIxKQogCi0JLyogU2V0IHBhcnRpdGlvbiBEQUJSICovCi0JLyogRG8gdGhpcyBiZWZvcmUgcmUtZW5hYmxpbmcgUE1VIHRvIGF2b2lkIFA3IERBQlIgY29ycnVwdGlvbiBidWcgKi8KLQlsaQlyNSwzCi0JbGQJcjYsVkNQVV9EQUJSKHI0KQotCW10c3ByCVNQUk5fREFCUlgscjUKLQltdHNwcglTUFJOX0RBQlIscjYKLUJFR0lOX0ZUUl9TRUNUSU9OCi0JaXN5bmMKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQotCi0JLyogTG9hZCBndWVzdCBQTVUgcmVnaXN0ZXJzICovCi0JLyogUjQgaXMgbGl2ZSBoZXJlICh2Y3B1IHBvaW50ZXIpICovCi0JbGkJcjMsIDEKLQlzbGRpCXIzLCByMywgMzEJCS8qIE1NQ1IwX0ZDIChmcmVlemUgY291bnRlcnMpIGJpdCAqLwotCW10c3ByCVNQUk5fTU1DUjAsIHIzCQkvKiBmcmVlemUgYWxsIGNvdW50ZXJzLCBkaXNhYmxlIGludHMgKi8KLQlpc3luYwotCWx3eglyMywgVkNQVV9QTUMocjQpCS8qIGFsd2F5cyBsb2FkIHVwIGd1ZXN0IFBNVSByZWdpc3RlcnMgKi8KLQlsd3oJcjUsIFZDUFVfUE1DICsgNChyNCkJLyogdG8gcHJldmVudCBpbmZvcm1hdGlvbiBsZWFrICovCi0JbHd6CXI2LCBWQ1BVX1BNQyArIDgocjQpCi0JbHd6CXI3LCBWQ1BVX1BNQyArIDEyKHI0KQotCWx3eglyOCwgVkNQVV9QTUMgKyAxNihyNCkKLQlsd3oJcjksIFZDUFVfUE1DICsgMjAocjQpCi1CRUdJTl9GVFJfU0VDVElPTgotCWx3eglyMTAsIFZDUFVfUE1DICsgMjQocjQpCi0JbHd6CXIxMSwgVkNQVV9QTUMgKyAyOChyNCkKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQotCW10c3ByCVNQUk5fUE1DMSwgcjMKLQltdHNwcglTUFJOX1BNQzIsIHI1Ci0JbXRzcHIJU1BSTl9QTUMzLCByNgotCW10c3ByCVNQUk5fUE1DNCwgcjcKLQltdHNwcglTUFJOX1BNQzUsIHI4Ci0JbXRzcHIJU1BSTl9QTUM2LCByOQotQkVHSU5fRlRSX1NFQ1RJT04KLQltdHNwcglTUFJOX1BNQzcsIHIxMAotCW10c3ByCVNQUk5fUE1DOCwgcjExCi1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKLQlsZAlyMywgVkNQVV9NTUNSKHI0KQotCWxkCXI1LCBWQ1BVX01NQ1IgKyA4KHI0KQotCWxkCXI2LCBWQ1BVX01NQ1IgKyAxNihyNCkKLQlsZAlyNywgVkNQVV9TSUFSKHI0KQotCWxkCXI4LCBWQ1BVX1NEQVIocjQpCi0JbXRzcHIJU1BSTl9NTUNSMSwgcjUKLQltdHNwcglTUFJOX01NQ1JBLCByNgotCW10c3ByCVNQUk5fU0lBUiwgcjcKLQltdHNwcglTUFJOX1NEQVIsIHI4Ci0JbXRzcHIJU1BSTl9NTUNSMCwgcjMKLQlpc3luYwotCi0JLyogTG9hZCB1cCBGUCwgVk1YIGFuZCBWU1ggcmVnaXN0ZXJzICovCi0JYmwJa3ZtcHBjX2xvYWRfZnAKLQotCWxkCXIxNCwgVkNQVV9HUFIoUjE0KShyNCkKLQlsZAlyMTUsIFZDUFVfR1BSKFIxNSkocjQpCi0JbGQJcjE2LCBWQ1BVX0dQUihSMTYpKHI0KQotCWxkCXIxNywgVkNQVV9HUFIoUjE3KShyNCkKLQlsZAlyMTgsIFZDUFVfR1BSKFIxOCkocjQpCi0JbGQJcjE5LCBWQ1BVX0dQUihSMTkpKHI0KQotCWxkCXIyMCwgVkNQVV9HUFIoUjIwKShyNCkKLQlsZAlyMjEsIFZDUFVfR1BSKFIyMSkocjQpCi0JbGQJcjIyLCBWQ1BVX0dQUihSMjIpKHI0KQotCWxkCXIyMywgVkNQVV9HUFIoUjIzKShyNCkKLQlsZAlyMjQsIFZDUFVfR1BSKFIyNCkocjQpCi0JbGQJcjI1LCBWQ1BVX0dQUihSMjUpKHI0KQotCWxkCXIyNiwgVkNQVV9HUFIoUjI2KShyNCkKLQlsZAlyMjcsIFZDUFVfR1BSKFIyNykocjQpCi0JbGQJcjI4LCBWQ1BVX0dQUihSMjgpKHI0KQotCWxkCXIyOSwgVkNQVV9HUFIoUjI5KShyNCkKLQlsZAlyMzAsIFZDUFVfR1BSKFIzMCkocjQpCi0JbGQJcjMxLCBWQ1BVX0dQUihSMzEpKHI0KQotCi1CRUdJTl9GVFJfU0VDVElPTgotCS8qIFN3aXRjaCBEU0NSIHRvIGd1ZXN0IHZhbHVlICovCi0JbGQJcjUsIFZDUFVfRFNDUihyNCkKLQltdHNwcglTUFJOX0RTQ1IsIHI1Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKLQotCS8qCi0JICogU2V0IHRoZSBkZWNyZW1lbnRlciB0byB0aGUgZ3Vlc3QgZGVjcmVtZW50ZXIuCi0JICovCi0JbGQJcjgsVkNQVV9ERUNfRVhQSVJFUyhyNCkKLQltZnRiCXI3Ci0Jc3ViZglyMyxyNyxyOAotCW10c3ByCVNQUk5fREVDLHIzCi0Jc3R3CXIzLFZDUFVfREVDKHI0KQotCi0JbGQJcjUsIFZDUFVfU1BSRzAocjQpCi0JbGQJcjYsIFZDUFVfU1BSRzEocjQpCi0JbGQJcjcsIFZDUFVfU1BSRzIocjQpCi0JbGQJcjgsIFZDUFVfU1BSRzMocjQpCi0JbXRzcHIJU1BSTl9TUFJHMCwgcjUKLQltdHNwcglTUFJOX1NQUkcxLCByNgotCW10c3ByCVNQUk5fU1BSRzIsIHI3Ci0JbXRzcHIJU1BSTl9TUFJHMywgcjgKLQogCS8qIFNhdmUgUjEgaW4gdGhlIFBBQ0EgKi8KIAlzdGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKIAotCS8qIExvYWQgdXAgREFSIGFuZCBEU0lTUiAqLwotCWxkCXI1LCBWQ1BVX0RBUihyNCkKLQlsd3oJcjYsIFZDUFVfRFNJU1IocjQpCi0JbXRzcHIJU1BSTl9EQVIsIHI1Ci0JbXRzcHIJU1BSTl9EU0lTUiwgcjYKLQogCWxpCXI2LCBLVk1fR1VFU1RfTU9ERV9IT1NUX0hWCiAJc3RiCXI2LCBIU1RBVEVfSU5fR1VFU1QocjEzKQogCi1CRUdJTl9GVFJfU0VDVElPTgotCS8qIFJlc3RvcmUgQU1SIGFuZCBVQU1PUiwgc2V0IEFNT1IgdG8gYWxsIDFzICovCi0JbGQJcjUsVkNQVV9BTVIocjQpCi0JbGQJcjYsVkNQVV9VQU1PUihyNCkKLQlsaQlyNywtMQotCW10c3ByCVNQUk5fQU1SLHI1Ci0JbXRzcHIJU1BSTl9VQU1PUixyNgotCW10c3ByCVNQUk5fQU1PUixyNwotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCi0KIAkvKiBDbGVhciBvdXQgU0xCICovCiAJbGkJcjYsMAogCXNsYm10ZQlyNixyNgpAQCAtNDI4LDggKzM2MSw4IEBACiAJYm5lCTIxYgogCiAJLyogUHJpbWFyeSB0aHJlYWQgc3dpdGNoZXMgdG8gZ3Vlc3QgcGFydGl0aW9uLiAqLwotCWxkCXI5LFZDUFVfS1ZNKHI0KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCi0JbHd6CXI2LFZDUFVfUFRJRChyNCkKKwlsZAlyOSxWQ09SRV9LVk0ocjUpCS8qIHBvaW50ZXIgdG8gc3RydWN0IGt2bSAqLworCWxieglyNixIU1RBVEVfUFRJRChyMTMpCiAJY21wd2kJcjYsMAogCWJuZQkyMGYKIAlsZAlyNixLVk1fU0RSMShyOSkKQEAgLTQ1Nyw3ICszOTAsMTMgQEAKIAlhbmRjCXI3LHI3LHIwCiAJc3RkY3guCXI3LDAscjYKIAlibmUJMjNiCi0JbGkJcjYsMTI4CQkJLyogYW5kIGZsdXNoIHRoZSBUTEIgKi8KKwkvKiBGbHVzaCB0aGUgVExCIG9mIGFueSBlbnRyaWVzIGZvciB0aGlzIExQSUQgKi8KKwkvKiB1c2UgYXJjaCAyLjA3UyBhcyBhIHByb3h5IGZvciBQT1dFUjggKi8KK0JFR0lOX0ZUUl9TRUNUSU9OCisJbGkJcjYsNTEyCQkJLyogUE9XRVI4IGhhcyA1MTIgc2V0cyAqLworRlRSX1NFQ1RJT05fRUxTRQorCWxpCXI2LDEyOAkJCS8qIFBPV0VSNyBoYXMgMTI4IHNldHMgKi8KK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAJbXRjdHIJcjYKIAlsaQlyNywweDgwMAkJLyogSVMgZmllbGQgPSAwYjEwICovCiAJcHRlc3luYwpAQCAtNDg3LDYgKzQyNiwxMyBAQAogCWJlcQkzOGYKIAltdHNwcglTUFJOX1BDUiwgcjcKIDM4OgorCitCRUdJTl9GVFJfU0VDVElPTgorCS8qIERQREVTIGlzIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgKi8KKwlsZAlyOCwgVkNPUkVfRFBERVMocjUpCisJbXRzcHIJU1BSTl9EUERFUywgcjgKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA3UykKKwogCWxpCXIwLDEKIAlzdGIJcjAsVkNPUkVfSU5fR1VFU1QocjUpCS8qIHNpZ25hbCBzZWNvbmRhcmllcyB0byBjb250aW51ZSAqLwogCWIJMTBmCkBAIC01MDMsMzIgKzQ0OSwxMSBAQAogCW10c3ByCVNQUk5fUk1PUixyOAogCWlzeW5jCiAKLQkvKiBJbmNyZW1lbnQgeWllbGQgY291bnQgaWYgdGhleSBoYXZlIGEgVlBBICovCi0JbGQJcjMsIFZDUFVfVlBBKHI0KQotCWNtcGRpCXIzLCAwCi0JYmVxCTI1ZgotCWx3eglyNSwgTFBQQUNBX1lJRUxEQ09VTlQocjMpCi0JYWRkaQlyNSwgcjUsIDEKLQlzdHcJcjUsIExQUEFDQV9ZSUVMRENPVU5UKHIzKQotCWxpCXI2LCAxCi0Jc3RiCXI2LCBWQ1BVX1ZQQV9ESVJUWShyNCkKLTI1OgogCS8qIENoZWNrIGlmIEhERUMgZXhwaXJlcyBzb29uICovCiAJbWZzcHIJcjMsU1BSTl9IREVDCi0JY21wd2kJcjMsMTAKKwljbXB3aQlyMyw1MTIJCS8qIDEgbWljcm9zZWNvbmQgKi8KIAlsaQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUgotCW1yCXI5LHI0CiAJYmx0CWhkZWNfc29vbgotCi0JLyogU2F2ZSBwdXJyL3NwdXJyICovCi0JbWZzcHIJcjUsU1BSTl9QVVJSCi0JbWZzcHIJcjYsU1BSTl9TUFVSUgotCXN0ZAlyNSxIU1RBVEVfUFVSUihyMTMpCi0Jc3RkCXI2LEhTVEFURV9TUFVSUihyMTMpCi0JbGQJcjcsVkNQVV9QVVJSKHI0KQotCWxkCXI4LFZDUFVfU1BVUlIocjQpCi0JbXRzcHIJU1BSTl9QVVJSLHI3Ci0JbXRzcHIJU1BSTl9TUFVSUixyOAogCWIJMzFmCiAKIAkvKgpAQCAtNTM5LDcgKzQ2NCw4IEBACiAJICogV2UgYWxzbyBoYXZlIHRvIGludmFsaWRhdGUgdGhlIFRMQiBzaW5jZSBpdHMKIAkgKiBlbnRyaWVzIGFyZW4ndCB0YWdnZWQgd2l0aCB0aGUgTFBJRC4KIAkgKi8KLTMwOglsZAlyOSxWQ1BVX0tWTShyNCkJCS8qIHBvaW50ZXIgdG8gc3RydWN0IGt2bSAqLworMzA6CWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWxkCXI5LFZDT1JFX0tWTShyNSkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCiAKIAkvKiBmaXJzdCB0YWtlIG5hdGl2ZV90bGJpZV9sb2NrICovCiAJLnNlY3Rpb24gIi50b2MiLCJhdyIKQEAgLTYwNCw3ICs1MzAsNiBAQAogCW1mc3ByCXIzLFNQUk5fSERFQwogCWNtcHdpCXIzLDEwCiAJbGkJcjEyLEJPT0szU19JTlRFUlJVUFRfSFZfREVDUkVNRU5URVIKLQltcglyOSxyNAogCWJsdAloZGVjX3Nvb24KIAogCS8qIEVuYWJsZSBIREVDIGludGVycnVwdHMgKi8KQEAgLTYxOSw5ICs1NDQsMTQgQEAKIAltZnNwcglyMCxTUFJOX0hJRDAKIAltZnNwcglyMCxTUFJOX0hJRDAKIAltZnNwcglyMCxTUFJOX0hJRDAKKzMxOgorCS8qIERvIHdlIGhhdmUgYSBndWVzdCB2Y3B1IHRvIHJ1bj8gKi8KKwljbXBkaQlyNCwgMAorCWJlcQlrdm1wcGNfcHJpbWFyeV9ub19ndWVzdAora3ZtcHBjX2dvdF9ndWVzdDoKIAogCS8qIExvYWQgdXAgZ3Vlc3QgU0xCIGVudHJpZXMgKi8KLTMxOglsd3oJcjUsVkNQVV9TTEJfTUFYKHI0KQorCWx3eglyNSxWQ1BVX1NMQl9NQVgocjQpCiAJY21wd2kJcjUsMAogCWJlcQk5ZgogCW10Y3RyCXI1CkBAIC02MzIsNiArNTYyLDIwOSBAQAogCWFkZGkJcjYscjYsVkNQVV9TTEJfU0laRQogCWJkbnoJMWIKIDk6CisJLyogSW5jcmVtZW50IHlpZWxkIGNvdW50IGlmIHRoZXkgaGF2ZSBhIFZQQSAqLworCWxkCXIzLCBWQ1BVX1ZQQShyNCkKKwljbXBkaQlyMywgMAorCWJlcQkyNWYKKwlsd3oJcjUsIExQUEFDQV9ZSUVMRENPVU5UKHIzKQorCWFkZGkJcjUsIHI1LCAxCisJc3R3CXI1LCBMUFBBQ0FfWUlFTERDT1VOVChyMykKKwlsaQlyNiwgMQorCXN0YglyNiwgVkNQVV9WUEFfRElSVFkocjQpCisyNToKKworQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBTYXZlIHB1cnIvc3B1cnIgKi8KKwltZnNwcglyNSxTUFJOX1BVUlIKKwltZnNwcglyNixTUFJOX1NQVVJSCisJc3RkCXI1LEhTVEFURV9QVVJSKHIxMykKKwlzdGQJcjYsSFNUQVRFX1NQVVJSKHIxMykKKwlsZAlyNyxWQ1BVX1BVUlIocjQpCisJbGQJcjgsVkNQVV9TUFVSUihyNCkKKwltdHNwcglTUFJOX1BVUlIscjcKKwltdHNwcglTUFJOX1NQVVJSLHI4CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKworQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBTZXQgcGFydGl0aW9uIERBQlIgKi8KKwkvKiBEbyB0aGlzIGJlZm9yZSByZS1lbmFibGluZyBQTVUgdG8gYXZvaWQgUDcgREFCUiBjb3JydXB0aW9uIGJ1ZyAqLworCWx3eglyNSxWQ1BVX0RBQlJYKHI0KQorCWxkCXI2LFZDUFVfREFCUihyNCkKKwltdHNwcglTUFJOX0RBQlJYLHI1CisJbXRzcHIJU1BSTl9EQUJSLHI2CisgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDg5KQorCWlzeW5jCisgRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChDUFVfRlRSX0FSQ0hfMjA2LCBDUFVfRlRSX0FSQ0hfMjA2LCA4OSkKK0VORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0FSQ0hfMjA3UykKKworCS8qIExvYWQgZ3Vlc3QgUE1VIHJlZ2lzdGVycyAqLworCS8qIFI0IGlzIGxpdmUgaGVyZSAodmNwdSBwb2ludGVyKSAqLworCWxpCXIzLCAxCisJc2xkaQlyMywgcjMsIDMxCQkvKiBNTUNSMF9GQyAoZnJlZXplIGNvdW50ZXJzKSBiaXQgKi8KKwltdHNwcglTUFJOX01NQ1IwLCByMwkJLyogZnJlZXplIGFsbCBjb3VudGVycywgZGlzYWJsZSBpbnRzICovCisJaXN5bmMKKwlsd3oJcjMsIFZDUFVfUE1DKHI0KQkvKiBhbHdheXMgbG9hZCB1cCBndWVzdCBQTVUgcmVnaXN0ZXJzICovCisJbHd6CXI1LCBWQ1BVX1BNQyArIDQocjQpCS8qIHRvIHByZXZlbnQgaW5mb3JtYXRpb24gbGVhayAqLworCWx3eglyNiwgVkNQVV9QTUMgKyA4KHI0KQorCWx3eglyNywgVkNQVV9QTUMgKyAxMihyNCkKKwlsd3oJcjgsIFZDUFVfUE1DICsgMTYocjQpCisJbHd6CXI5LCBWQ1BVX1BNQyArIDIwKHI0KQorQkVHSU5fRlRSX1NFQ1RJT04KKwlsd3oJcjEwLCBWQ1BVX1BNQyArIDI0KHI0KQorCWx3eglyMTEsIFZDUFVfUE1DICsgMjgocjQpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKKwltdHNwcglTUFJOX1BNQzEsIHIzCisJbXRzcHIJU1BSTl9QTUMyLCByNQorCW10c3ByCVNQUk5fUE1DMywgcjYKKwltdHNwcglTUFJOX1BNQzQsIHI3CisJbXRzcHIJU1BSTl9QTUM1LCByOAorCW10c3ByCVNQUk5fUE1DNiwgcjkKK0JFR0lOX0ZUUl9TRUNUSU9OCisJbXRzcHIJU1BSTl9QTUM3LCByMTAKKwltdHNwcglTUFJOX1BNQzgsIHIxMQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCisJbGQJcjMsIFZDUFVfTU1DUihyNCkKKwlsZAlyNSwgVkNQVV9NTUNSICsgOChyNCkKKwlsZAlyNiwgVkNQVV9NTUNSICsgMTYocjQpCisJbGQJcjcsIFZDUFVfU0lBUihyNCkKKwlsZAlyOCwgVkNQVV9TREFSKHI0KQorCW10c3ByCVNQUk5fTU1DUjEsIHI1CisJbXRzcHIJU1BSTl9NTUNSQSwgcjYKKwltdHNwcglTUFJOX1NJQVIsIHI3CisJbXRzcHIJU1BSTl9TREFSLCByOAorQkVHSU5fRlRSX1NFQ1RJT04KKwlsZAlyNSwgVkNQVV9NTUNSICsgMjQocjQpCisJbGQJcjYsIFZDUFVfU0lFUihyNCkKKwlsd3oJcjcsIFZDUFVfUE1DICsgMjQocjQpCisJbHd6CXI4LCBWQ1BVX1BNQyArIDI4KHI0KQorCWxkCXI5LCBWQ1BVX01NQ1IgKyAzMihyNCkKKwltdHNwcglTUFJOX01NQ1IyLCByNQorCW10c3ByCVNQUk5fU0lFUiwgcjYKKwltdHNwcglTUFJOX1NQTUMxLCByNworCW10c3ByCVNQUk5fU1BNQzIsIHI4CisJbXRzcHIJU1BSTl9NTUNSUywgcjkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA3UykKKwltdHNwcglTUFJOX01NQ1IwLCByMworCWlzeW5jCisKKwkvKiBMb2FkIHVwIEZQLCBWTVggYW5kIFZTWCByZWdpc3RlcnMgKi8KKwlibAlrdm1wcGNfbG9hZF9mcAorCisJbGQJcjE0LCBWQ1BVX0dQUihSMTQpKHI0KQorCWxkCXIxNSwgVkNQVV9HUFIoUjE1KShyNCkKKwlsZAlyMTYsIFZDUFVfR1BSKFIxNikocjQpCisJbGQJcjE3LCBWQ1BVX0dQUihSMTcpKHI0KQorCWxkCXIxOCwgVkNQVV9HUFIoUjE4KShyNCkKKwlsZAlyMTksIFZDUFVfR1BSKFIxOSkocjQpCisJbGQJcjIwLCBWQ1BVX0dQUihSMjApKHI0KQorCWxkCXIyMSwgVkNQVV9HUFIoUjIxKShyNCkKKwlsZAlyMjIsIFZDUFVfR1BSKFIyMikocjQpCisJbGQJcjIzLCBWQ1BVX0dQUihSMjMpKHI0KQorCWxkCXIyNCwgVkNQVV9HUFIoUjI0KShyNCkKKwlsZAlyMjUsIFZDUFVfR1BSKFIyNSkocjQpCisJbGQJcjI2LCBWQ1BVX0dQUihSMjYpKHI0KQorCWxkCXIyNywgVkNQVV9HUFIoUjI3KShyNCkKKwlsZAlyMjgsIFZDUFVfR1BSKFIyOCkocjQpCisJbGQJcjI5LCBWQ1BVX0dQUihSMjkpKHI0KQorCWxkCXIzMCwgVkNQVV9HUFIoUjMwKShyNCkKKwlsZAlyMzEsIFZDUFVfR1BSKFIzMSkocjQpCisKK0JFR0lOX0ZUUl9TRUNUSU9OCisJLyogU3dpdGNoIERTQ1IgdG8gZ3Vlc3QgdmFsdWUgKi8KKwlsZAlyNSwgVkNQVV9EU0NSKHI0KQorCW10c3ByCVNQUk5fRFNDUiwgcjUKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCitCRUdJTl9GVFJfU0VDVElPTgorCS8qIFNraXAgbmV4dCBzZWN0aW9uIG9uIFBPV0VSNyBvciBQUEM5NzAgKi8KKwliCThmCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCisJLyogVHVybiBvbiBUTSBzbyB3ZSBjYW4gYWNjZXNzIFRGSEFSL1RGSUFSL1RFWEFTUiAqLworCW1mbXNyCXI4CisJbGkJcjAsIDEKKwlybGRpbWkJcjgsIHIwLCBNU1JfVE1fTEcsIDYzLU1TUl9UTV9MRworCW10bXNyZAlyOAorCisJLyogTG9hZCB1cCBQT1dFUjgtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJbGQJcjUsIFZDUFVfSUFNUihyNCkKKwlsd3oJcjYsIFZDUFVfUFNQQihyNCkKKwlsZAlyNywgVkNQVV9GU0NSKHI0KQorCW10c3ByCVNQUk5fSUFNUiwgcjUKKwltdHNwcglTUFJOX1BTUEIsIHI2CisJbXRzcHIJU1BSTl9GU0NSLCByNworCWxkCXI1LCBWQ1BVX0RBV1IocjQpCisJbGQJcjYsIFZDUFVfREFXUlgocjQpCisJbGQJcjcsIFZDUFVfQ0lBQlIocjQpCisJbGQJcjgsIFZDUFVfVEFSKHI0KQorCW10c3ByCVNQUk5fREFXUiwgcjUKKwltdHNwcglTUFJOX0RBV1JYLCByNgorCW10c3ByCVNQUk5fQ0lBQlIsIHI3CisJbXRzcHIJU1BSTl9UQVIsIHI4CisJbGQJcjUsIFZDUFVfSUMocjQpCisJbGQJcjYsIFZDUFVfVlRCKHI0KQorCW10c3ByCVNQUk5fSUMsIHI1CisJbXRzcHIJU1BSTl9WVEIsIHI2CisjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQorCWxkCXI1LCBWQ1BVX1RGSEFSKHI0KQorCWxkCXI2LCBWQ1BVX1RGSUFSKHI0KQorCWxkCXI3LCBWQ1BVX1RFWEFTUihyNCkKKwltdHNwcglTUFJOX1RGSEFSLCByNQorCW10c3ByCVNQUk5fVEZJQVIsIHI2CisJbXRzcHIJU1BSTl9URVhBU1IsIHI3CisjZW5kaWYKKwlsZAlyOCwgVkNQVV9FQkJIUihyNCkKKwltdHNwcglTUFJOX0VCQkhSLCByOAorCWxkCXI1LCBWQ1BVX0VCQlJSKHI0KQorCWxkCXI2LCBWQ1BVX0JFU0NSKHI0KQorCWxkCXI3LCBWQ1BVX0NTSUdSKHI0KQorCWxkCXI4LCBWQ1BVX1RBQ1IocjQpCisJbXRzcHIJU1BSTl9FQkJSUiwgcjUKKwltdHNwcglTUFJOX0JFU0NSLCByNgorCW10c3ByCVNQUk5fQ1NJR1IsIHI3CisJbXRzcHIJU1BSTl9UQUNSLCByOAorCWxkCXI1LCBWQ1BVX1RDU0NSKHI0KQorCWxkCXI2LCBWQ1BVX0FDT1AocjQpCisJbHd6CXI3LCBWQ1BVX0dVRVNUX1BJRChyNCkKKwlsZAlyOCwgVkNQVV9XT1JUKHI0KQorCW10c3ByCVNQUk5fVENTQ1IsIHI1CisJbXRzcHIJU1BSTl9BQ09QLCByNgorCW10c3ByCVNQUk5fUElELCByNworCW10c3ByCVNQUk5fV09SVCwgcjgKKzg6CisKKwkvKgorCSAqIFNldCB0aGUgZGVjcmVtZW50ZXIgdG8gdGhlIGd1ZXN0IGRlY3JlbWVudGVyLgorCSAqLworCWxkCXI4LFZDUFVfREVDX0VYUElSRVMocjQpCisJbWZ0YglyNworCXN1YmYJcjMscjcscjgKKwltdHNwcglTUFJOX0RFQyxyMworCXN0dwlyMyxWQ1BVX0RFQyhyNCkKKworCWxkCXI1LCBWQ1BVX1NQUkcwKHI0KQorCWxkCXI2LCBWQ1BVX1NQUkcxKHI0KQorCWxkCXI3LCBWQ1BVX1NQUkcyKHI0KQorCWxkCXI4LCBWQ1BVX1NQUkczKHI0KQorCW10c3ByCVNQUk5fU1BSRzAsIHI1CisJbXRzcHIJU1BSTl9TUFJHMSwgcjYKKwltdHNwcglTUFJOX1NQUkcyLCByNworCW10c3ByCVNQUk5fU1BSRzMsIHI4CisKKwkvKiBMb2FkIHVwIERBUiBhbmQgRFNJU1IgKi8KKwlsZAlyNSwgVkNQVV9EQVIocjQpCisJbHd6CXI2LCBWQ1BVX0RTSVNSKHI0KQorCW10c3ByCVNQUk5fREFSLCByNQorCW10c3ByCVNQUk5fRFNJU1IsIHI2CisKK0JFR0lOX0ZUUl9TRUNUSU9OCisJLyogUmVzdG9yZSBBTVIgYW5kIFVBTU9SLCBzZXQgQU1PUiB0byBhbGwgMXMgKi8KKwlsZAlyNSxWQ1BVX0FNUihyNCkKKwlsZAlyNixWQ1BVX1VBTU9SKHI0KQorCWxpCXI3LC0xCisJbXRzcHIJU1BSTl9BTVIscjUKKwltdHNwcglTUFJOX1VBTU9SLHI2CisJbXRzcHIJU1BSTl9BTU9SLHI3CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKIAogCS8qIFJlc3RvcmUgc3RhdGUgb2YgQ1RSTCBydW4gYml0OyBhc3N1bWUgMSBvbiBlbnRyeSAqLwogCWx3eglyNSxWQ1BVX0NUUkwocjQpCkBAIC02NDcsNDggKzc4MCw1MyBAQAogCW10Y3RyCXI2CiAJbXR4ZXIJcjcKIAora3ZtcHBjX2NlZGVfcmVlbnRyeToJCS8qIHI0ID0gdmNwdSwgcjEzID0gcGFjYSAqLwogCWxkCXIxMCwgVkNQVV9QQyhyNCkKIAlsZAlyMTEsIFZDUFVfTVNSKHI0KQota3ZtcHBjX2NlZGVfcmVlbnRyeToJCS8qIHI0ID0gdmNwdSwgcjEzID0gcGFjYSAqLwogCWxkCXI2LCBWQ1BVX1NSUjAocjQpCiAJbGQJcjcsIFZDUFVfU1JSMShyNCkKKwltdHNwcglTUFJOX1NSUjAsIHI2CisJbXRzcHIJU1BSTl9TUlIxLCByNwogCitkZWxpdmVyX2d1ZXN0X2ludGVycnVwdDoKIAkvKiByMTEgPSB2Y3B1LT5hcmNoLm1zciAmIH5NU1JfSFYgKi8KIAlybGRpY2wJcjExLCByMTEsIDYzIC0gTVNSX0hWX0xHLCAxCiAJcm90bGRpCXIxMSwgcjExLCAxICsgTVNSX0hWX0xHCiAJb3JpCXIxMSwgcjExLCBNU1JfTUUKIAogCS8qIENoZWNrIGlmIHdlIGNhbiBkZWxpdmVyIGFuIGV4dGVybmFsIG9yIGRlY3JlbWVudGVyIGludGVycnVwdCBub3cgKi8KLQlsZAlyMCxWQ1BVX1BFTkRJTkdfRVhDKHI0KQotCWxpcwlyOCwoMSA8PCBCT09LM1NfSVJRUFJJT19FWFRFUk5BTF9MRVZFTClAaAotCWFuZAlyMCxyMCxyOAotCWNtcGRpCWNyMSxyMCwwCi0JYW5kaS4JcjAscjExLE1TUl9FRQotCWJlcQljcjEsMTFmCisJbGQJcjAsIFZDUFVfUEVORElOR19FWEMocjQpCisJcmxkaWNsCXIwLCByMCwgNjQgLSBCT09LM1NfSVJRUFJJT19FWFRFUk5BTF9MRVZFTCwgNjMKKwljbXBkaQljcjEsIHIwLCAwCisJYW5kaS4JcjgsIHIxMSwgTVNSX0VFCiBCRUdJTl9GVFJfU0VDVElPTgotCW1mc3ByCXI4LFNQUk5fTFBDUgotCW9yaQlyOCxyOCxMUENSX01FUgotCW10c3ByCVNQUk5fTFBDUixyOAorCW1mc3ByCXI4LCBTUFJOX0xQQ1IKKwkvKiBJbnNlcnQgRVhURVJOQUxfTEVWRUwgYml0IGludG8gTFBDUiBhdCB0aGUgTUVSIGJpdCBwb3NpdGlvbiAqLworCXJsZGltaQlyOCwgcjAsIExQQ1JfTUVSX1NILCA2MyAtIExQQ1JfTUVSX1NICisJbXRzcHIJU1BSTl9MUENSLCByOAogCWlzeW5jCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKIAliZXEJNWYKLQlsaQlyMCxCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCi0xMjoJbXIJcjYscjEwCisJbGkJcjAsIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKKwlibmUJY3IxLCAxMmYKKwltZnNwcglyMCwgU1BSTl9ERUMKKwljbXB3aQlyMCwgMAorCWxpCXIwLCBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCisJYmdlCTVmCisKKzEyOgltdHNwcglTUFJOX1NSUjAsIHIxMAogCW1yCXIxMCxyMAotCW1yCXI3LHIxMQotCWxpCXIxMSwoTVNSX01FIDw8IDEpIHwgMQkvKiBzeW50aGVzaXplIE1TUl9TRiB8IE1TUl9NRSAqLwotCXJvdGxkaQlyMTEscjExLDYzCi0JYgk1ZgotMTE6CWJlcQk1ZgotCW1mc3ByCXIwLFNQUk5fREVDCi0JY21wd2kJcjAsMAotCWxpCXIwLEJPT0szU19JTlRFUlJVUFRfREVDUkVNRU5URVIKLQlibHQJMTJiCisJbXRzcHIJU1BSTl9TUlIxLCByMTEKKwlsZAlyMTEsIFZDUFVfSU5UUl9NU1IocjQpCis1OgogCi0JLyogTW92ZSBTUlIwIGFuZCBTUlIxIGludG8gdGhlIHJlc3BlY3RpdmUgcmVncyAqLwotNToJbXRzcHIJU1BSTl9TUlIwLCByNgotCW10c3ByCVNQUk5fU1JSMSwgcjcKLQorLyoKKyAqIFJlcXVpcmVkIHN0YXRlOgorICogUjQgPSB2Y3B1CisgKiBSMTA6IHZhbHVlIGZvciBIU1JSMAorICogUjExOiB2YWx1ZSBmb3IgSFNSUjEKKyAqIFIxMyA9IFBBQ0EKKyAqLwogZmFzdF9ndWVzdF9yZXR1cm46CiAJbGkJcjAsMAogCXN0YglyMCxWQ1BVX0NFREVEKHI0KQkvKiBjYW5jZWwgY2VkZSAqLwpAQCAtODY4LDM5ICsxMDA2LDE5IEBACiAJLyogRXh0ZXJuYWwgaW50ZXJydXB0LCBmaXJzdCBjaGVjayBmb3IgaG9zdF9pcGkuIElmIHRoaXMgaXMKIAkgKiBzZXQsIHdlIGtub3cgdGhlIGhvc3Qgd2FudHMgdXMgb3V0IHNvIGxldCdzIGRvIGl0IG5vdwogCSAqLwotZG9fZXh0X2ludGVycnVwdDoKIAlibAlrdm1wcGNfcmVhZF9pbnRyCiAJY21wZGkJcjMsIDAKIAliZ3QJZXh0X2ludGVycnVwdF90b19ob3N0CiAKLQkvKiBBbGxyaWdodCwgbG9va3MgbGlrZSBhbiBJUEkgZm9yIHRoZSBndWVzdCwgd2UgbmVlZCB0byBzZXQgTUVSICovCiAJLyogQ2hlY2sgaWYgYW55IENQVSBpcyBoZWFkaW5nIG91dCB0byB0aGUgaG9zdCwgaWYgc28gaGVhZCBvdXQgdG9vICovCiAJbGQJcjUsIEhTVEFURV9LVk1fVkNPUkUocjEzKQogCWx3eglyMCwgVkNPUkVfRU5UUllfRVhJVChyNSkKIAljbXB3aQlyMCwgMHgxMDAKIAliZ2UJZXh0X2ludGVycnVwdF90b19ob3N0CiAKLQkvKiBTZWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGludGVycnVwdCBmb3IgdGhlIGd1ZXN0ICovCi0JbWZzcHIJcjgsIFNQUk5fTFBDUgotCWxkCXIwLCBWQ1BVX1BFTkRJTkdfRVhDKHI5KQotCS8qIEluc2VydCBFWFRFUk5BTF9MRVZFTCBiaXQgaW50byBMUENSIGF0IHRoZSBNRVIgYml0IHBvc2l0aW9uICovCi0JcmxkaWNsLglyMCwgcjAsIDY0IC0gQk9PSzNTX0lSUVBSSU9fRVhURVJOQUxfTEVWRUwsIDYzCi0JcmxkaW1pCXI4LCByMCwgTFBDUl9NRVJfU0gsIDYzIC0gTFBDUl9NRVJfU0gKLQliZXEJMmYKLQotCS8qIEFuZCBpZiB0aGUgZ3Vlc3QgRUUgaXMgc2V0LCB3ZSBjYW4gZGVsaXZlciBpbW1lZGlhdGVseSwgZWxzZQotCSAqIHdlIHJldHVybiB0byB0aGUgZ3Vlc3Qgd2l0aCBNRVIgc2V0Ci0JICovCi0JYW5kaS4JcjAsIHIxMSwgTVNSX0VFCi0JYmVxCTJmCi0JbXRzcHIJU1BSTl9TUlIwLCByMTAKLQltdHNwcglTUFJOX1NSUjEsIHIxMQotCWxpCXIxMCwgQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAotCWxpCXIxMSwgKE1TUl9NRSA8PCAxKSB8IDEJLyogc3ludGhlc2l6ZSBNU1JfU0YgfCBNU1JfTUUgKi8KLQlyb3RsZGkJcjExLCByMTEsIDYzCi0yOgltcglyNCwgcjkKLQltdHNwcglTUFJOX0xQQ1IsIHI4Ci0JYglmYXN0X2d1ZXN0X3JldHVybgorCS8qIFJldHVybiB0byBndWVzdCBhZnRlciBkZWxpdmVyaW5nIGFueSBwZW5kaW5nIGludGVycnVwdCAqLworCW1yCXI0LCByOQorCWIJZGVsaXZlcl9ndWVzdF9pbnRlcnJ1cHQKIAogZXh0X2ludGVycnVwdF90b19ob3N0OgogCkBAIC05NzUsMTMgKzEwOTMsMTk0IEBACiAJbXRzcHIJU1BSTl9TUFVSUixyNAogRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfQVJDSF8yMDEpCiAKKwkvKiBTYXZlIERFQyAqLworCW1mc3ByCXI1LFNQUk5fREVDCisJbWZ0YglyNgorCWV4dHN3CXI1LHI1CisJYWRkCXI1LHI1LHI2CisJc3RkCXI1LFZDUFVfREVDX0VYUElSRVMocjkpCisKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYgk4ZgorRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfQVJDSF8yMDdTKQorCS8qIFR1cm4gb24gVE0gc28gd2UgY2FuIGFjY2VzcyBURkhBUi9URklBUi9URVhBU1IgKi8KKwltZm1zcglyOAorCWxpCXIwLCAxCisJcmxkaW1pCXI4LCByMCwgTVNSX1RNX0xHLCA2My1NU1JfVE1fTEcKKwltdG1zcmQJcjgKKworCS8qIFNhdmUgUE9XRVI4LXNwZWNpZmljIHJlZ2lzdGVycyAqLworCW1mc3ByCXI1LCBTUFJOX0lBTVIKKwltZnNwcglyNiwgU1BSTl9QU1BCCisJbWZzcHIJcjcsIFNQUk5fRlNDUgorCXN0ZAlyNSwgVkNQVV9JQU1SKHI5KQorCXN0dwlyNiwgVkNQVV9QU1BCKHI5KQorCXN0ZAlyNywgVkNQVV9GU0NSKHI5KQorCW1mc3ByCXI1LCBTUFJOX0lDCisJbWZzcHIJcjYsIFNQUk5fVlRCCisJbWZzcHIJcjcsIFNQUk5fVEFSCisJc3RkCXI1LCBWQ1BVX0lDKHI5KQorCXN0ZAlyNiwgVkNQVV9WVEIocjkpCisJc3RkCXI3LCBWQ1BVX1RBUihyOSkKKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJbWZzcHIJcjUsIFNQUk5fVEZIQVIKKwltZnNwcglyNiwgU1BSTl9URklBUgorCW1mc3ByCXI3LCBTUFJOX1RFWEFTUgorCXN0ZAlyNSwgVkNQVV9URkhBUihyOSkKKwlzdGQJcjYsIFZDUFVfVEZJQVIocjkpCisJc3RkCXI3LCBWQ1BVX1RFWEFTUihyOSkKKyNlbmRpZgorCW1mc3ByCXI4LCBTUFJOX0VCQkhSCisJc3RkCXI4LCBWQ1BVX0VCQkhSKHI5KQorCW1mc3ByCXI1LCBTUFJOX0VCQlJSCisJbWZzcHIJcjYsIFNQUk5fQkVTQ1IKKwltZnNwcglyNywgU1BSTl9DU0lHUgorCW1mc3ByCXI4LCBTUFJOX1RBQ1IKKwlzdGQJcjUsIFZDUFVfRUJCUlIocjkpCisJc3RkCXI2LCBWQ1BVX0JFU0NSKHI5KQorCXN0ZAlyNywgVkNQVV9DU0lHUihyOSkKKwlzdGQJcjgsIFZDUFVfVEFDUihyOSkKKwltZnNwcglyNSwgU1BSTl9UQ1NDUgorCW1mc3ByCXI2LCBTUFJOX0FDT1AKKwltZnNwcglyNywgU1BSTl9QSUQKKwltZnNwcglyOCwgU1BSTl9XT1JUCisJc3RkCXI1LCBWQ1BVX1RDU0NSKHI5KQorCXN0ZAlyNiwgVkNQVV9BQ09QKHI5KQorCXN0dwlyNywgVkNQVV9HVUVTVF9QSUQocjkpCisJc3RkCXI4LCBWQ1BVX1dPUlQocjkpCis4OgorCisJLyogU2F2ZSBhbmQgcmVzZXQgQU1SIGFuZCBVQU1PUiBiZWZvcmUgdHVybmluZyBvbiB0aGUgTU1VICovCitCRUdJTl9GVFJfU0VDVElPTgorCW1mc3ByCXI1LFNQUk5fQU1SCisJbWZzcHIJcjYsU1BSTl9VQU1PUgorCXN0ZAlyNSxWQ1BVX0FNUihyOSkKKwlzdGQJcjYsVkNQVV9VQU1PUihyOSkKKwlsaQlyNiwwCisJbXRzcHIJU1BSTl9BTVIscjYKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyogU3dpdGNoIERTQ1IgYmFjayB0byBob3N0IHZhbHVlICovCitCRUdJTl9GVFJfU0VDVElPTgorCW1mc3ByCXI4LCBTUFJOX0RTQ1IKKwlsZAlyNywgSFNUQVRFX0RTQ1IocjEzKQorCXN0ZAlyOCwgVkNQVV9EU0NSKHI5KQorCW10c3ByCVNQUk5fRFNDUiwgcjcKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyogU2F2ZSBub24tdm9sYXRpbGUgR1BScyAqLworCXN0ZAlyMTQsIFZDUFVfR1BSKFIxNCkocjkpCisJc3RkCXIxNSwgVkNQVV9HUFIoUjE1KShyOSkKKwlzdGQJcjE2LCBWQ1BVX0dQUihSMTYpKHI5KQorCXN0ZAlyMTcsIFZDUFVfR1BSKFIxNykocjkpCisJc3RkCXIxOCwgVkNQVV9HUFIoUjE4KShyOSkKKwlzdGQJcjE5LCBWQ1BVX0dQUihSMTkpKHI5KQorCXN0ZAlyMjAsIFZDUFVfR1BSKFIyMCkocjkpCisJc3RkCXIyMSwgVkNQVV9HUFIoUjIxKShyOSkKKwlzdGQJcjIyLCBWQ1BVX0dQUihSMjIpKHI5KQorCXN0ZAlyMjMsIFZDUFVfR1BSKFIyMykocjkpCisJc3RkCXIyNCwgVkNQVV9HUFIoUjI0KShyOSkKKwlzdGQJcjI1LCBWQ1BVX0dQUihSMjUpKHI5KQorCXN0ZAlyMjYsIFZDUFVfR1BSKFIyNikocjkpCisJc3RkCXIyNywgVkNQVV9HUFIoUjI3KShyOSkKKwlzdGQJcjI4LCBWQ1BVX0dQUihSMjgpKHI5KQorCXN0ZAlyMjksIFZDUFVfR1BSKFIyOSkocjkpCisJc3RkCXIzMCwgVkNQVV9HUFIoUjMwKShyOSkKKwlzdGQJcjMxLCBWQ1BVX0dQUihSMzEpKHI5KQorCisJLyogU2F2ZSBTUFJHcyAqLworCW1mc3ByCXIzLCBTUFJOX1NQUkcwCisJbWZzcHIJcjQsIFNQUk5fU1BSRzEKKwltZnNwcglyNSwgU1BSTl9TUFJHMgorCW1mc3ByCXI2LCBTUFJOX1NQUkczCisJc3RkCXIzLCBWQ1BVX1NQUkcwKHI5KQorCXN0ZAlyNCwgVkNQVV9TUFJHMShyOSkKKwlzdGQJcjUsIFZDUFVfU1BSRzIocjkpCisJc3RkCXI2LCBWQ1BVX1NQUkczKHI5KQorCisJLyogc2F2ZSBGUCBzdGF0ZSAqLworCW1yCXIzLCByOQorCWJsCWt2bXBwY19zYXZlX2ZwCisKKwkvKiBJbmNyZW1lbnQgeWllbGQgY291bnQgaWYgdGhleSBoYXZlIGEgVlBBICovCisJbGQJcjgsIFZDUFVfVlBBKHI5KQkvKiBkbyB0aGV5IGhhdmUgYSBWUEE/ICovCisJY21wZGkJcjgsIDAKKwliZXEJMjVmCisJbHd6CXIzLCBMUFBBQ0FfWUlFTERDT1VOVChyOCkKKwlhZGRpCXIzLCByMywgMQorCXN0dwlyMywgTFBQQUNBX1lJRUxEQ09VTlQocjgpCisJbGkJcjMsIDEKKwlzdGIJcjMsIFZDUFVfVlBBX0RJUlRZKHI5KQorMjU6CisJLyogU2F2ZSBQTVUgcmVnaXN0ZXJzIGlmIHJlcXVlc3RlZCAqLworCS8qIHI4IGFuZCBjcjAuZXEgYXJlIGxpdmUgaGVyZSAqLworCWxpCXIzLCAxCisJc2xkaQlyMywgcjMsIDMxCQkvKiBNTUNSMF9GQyAoZnJlZXplIGNvdW50ZXJzKSBiaXQgKi8KKwltZnNwcglyNCwgU1BSTl9NTUNSMAkJLyogc2F2ZSBNTUNSMCAqLworCW10c3ByCVNQUk5fTU1DUjAsIHIzCQkvKiBmcmVlemUgYWxsIGNvdW50ZXJzLCBkaXNhYmxlIGludHMgKi8KKwltZnNwcglyNiwgU1BSTl9NTUNSQQorQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBPbiBQNywgY2xlYXIgTU1DUkEgaW4gb3JkZXIgdG8gZGlzYWJsZSBTREFSIHVwZGF0ZXMgKi8KKwlsaQlyNywgMAorCW10c3ByCVNQUk5fTU1DUkEsIHI3CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKwlpc3luYworCWJlcQkyMWYJCQkvKiBpZiBubyBWUEEsIHNhdmUgUE1VIHN0dWZmIGFueXdheSAqLworCWxieglyNywgTFBQQUNBX1BNQ0lOVVNFKHI4KQorCWNtcHdpCXI3LCAwCQkJLyogZGlkIHRoZXkgYXNrIGZvciBQTVUgc3R1ZmYgdG8gYmUgc2F2ZWQ/ICovCisJYm5lCTIxZgorCXN0ZAlyMywgVkNQVV9NTUNSKHI5KQkvKiBpZiBub3QsIHNldCBzYXZlZCBNTUNSMCB0byBGQyAqLworCWIJMjJmCisyMToJbWZzcHIJcjUsIFNQUk5fTU1DUjEKKwltZnNwcglyNywgU1BSTl9TSUFSCisJbWZzcHIJcjgsIFNQUk5fU0RBUgorCXN0ZAlyNCwgVkNQVV9NTUNSKHI5KQorCXN0ZAlyNSwgVkNQVV9NTUNSICsgOChyOSkKKwlzdGQJcjYsIFZDUFVfTU1DUiArIDE2KHI5KQorCXN0ZAlyNywgVkNQVV9TSUFSKHI5KQorCXN0ZAlyOCwgVkNQVV9TREFSKHI5KQorCW1mc3ByCXIzLCBTUFJOX1BNQzEKKwltZnNwcglyNCwgU1BSTl9QTUMyCisJbWZzcHIJcjUsIFNQUk5fUE1DMworCW1mc3ByCXI2LCBTUFJOX1BNQzQKKwltZnNwcglyNywgU1BSTl9QTUM1CisJbWZzcHIJcjgsIFNQUk5fUE1DNgorQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyMTAsIFNQUk5fUE1DNworCW1mc3ByCXIxMSwgU1BSTl9QTUM4CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKKwlzdHcJcjMsIFZDUFVfUE1DKHI5KQorCXN0dwlyNCwgVkNQVV9QTUMgKyA0KHI5KQorCXN0dwlyNSwgVkNQVV9QTUMgKyA4KHI5KQorCXN0dwlyNiwgVkNQVV9QTUMgKyAxMihyOSkKKwlzdHcJcjcsIFZDUFVfUE1DICsgMTYocjkpCisJc3R3CXI4LCBWQ1BVX1BNQyArIDIwKHI5KQorQkVHSU5fRlRSX1NFQ1RJT04KKwlzdHcJcjEwLCBWQ1BVX1BNQyArIDI0KHI5KQorCXN0dwlyMTEsIFZDUFVfUE1DICsgMjgocjkpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKK0JFR0lOX0ZUUl9TRUNUSU9OCisJbWZzcHIJcjQsIFNQUk5fTU1DUjIKKwltZnNwcglyNSwgU1BSTl9TSUVSCisJbWZzcHIJcjYsIFNQUk5fU1BNQzEKKwltZnNwcglyNywgU1BSTl9TUE1DMgorCW1mc3ByCXI4LCBTUFJOX01NQ1JTCisJc3RkCXI0LCBWQ1BVX01NQ1IgKyAyNChyOSkKKwlzdGQJcjUsIFZDUFVfU0lFUihyOSkKKwlzdHcJcjYsIFZDUFVfUE1DICsgMjQocjkpCisJc3R3CXI3LCBWQ1BVX1BNQyArIDI4KHI5KQorCXN0ZAlyOCwgVkNQVV9NTUNSICsgMzIocjkpCisJbGlzCXI0LCAweDgwMDAKKwltdHNwcglTUFJOX01NQ1JTLCByNAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQorMjI6CiAJLyogQ2xlYXIgb3V0IFNMQiAqLwogCWxpCXI1LDAKIAlzbGJtdGUJcjUscjUKIAlzbGJpYQogCXB0ZXN5bmMKIAotaGRlY19zb29uOgkJCS8qIHI5ID0gdmNwdSwgcjEyID0gdHJhcCwgcjEzID0gcGFjYSAqLworaGRlY19zb29uOgkJCS8qIHIxMiA9IHRyYXAsIHIxMyA9IHBhY2EgKi8KIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYgkzMmYKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQpAQCAtMTAxNCw4ICsxMzEzLDYgQEAKIAkgKi8KIAljbXB3aQlyMywweDEwMAkvKiBBcmUgd2UgdGhlIGZpcnN0IGhlcmU/ICovCiAJYmdlCTQzZgotCWNtcHdpCXIzLDEJCS8qIEFyZSBhbnkgb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3Vlc3Q/ICovCi0JYmxlCTQzZgogCWNtcHdpCXIxMixCT09LM1NfSU5URVJSVVBUX0hWX0RFQ1JFTUVOVEVSCiAJYmVxCTQwZgogCWxpCXIwLDAKQEAgLTEwMjYsNyArMTMyMyw3IEBACiAJICogZG9lc24ndCB3YWtlIENQVXMgdXAgZnJvbSBuYXAuCiAJICovCiAJbHd6CXIzLFZDT1JFX05BUFBJTkdfVEhSRUFEUyhyNSkKLQlsd3oJcjQsVkNQVV9QVElEKHI5KQorCWxieglyNCxIU1RBVEVfUFRJRChyMTMpCiAJbGkJcjAsMQogCXNsZAlyMCxyMCxyNAogCWFuZGMuCXIzLHIzLHIwCQkvKiBubyBzZW5zZSBJUEknaW5nIG91cnNlbHZlcyAqLwpAQCAtMTA0NSwxMCArMTM0MiwxMSBAQAogCWFkZGkJcjYscjYsUEFDQV9TSVpFCiAJYm5lCTQyYgogCitzZWNvbmRhcnlfdG9vX2xhdGU6CiAJLyogU2Vjb25kYXJ5IHRocmVhZHMgd2FpdCBmb3IgcHJpbWFyeSB0byBkbyBwYXJ0aXRpb24gc3dpdGNoICovCi00MzoJbGQJcjQsVkNQVV9LVk0ocjkpCQkvKiBwb2ludGVyIHRvIHN0cnVjdCBrdm0gKi8KLQlsZAlyNSxIU1RBVEVfS1ZNX1ZDT1JFKHIxMykKLQlsd3oJcjMsVkNQVV9QVElEKHI5KQorNDM6CWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWxkCXI0LFZDT1JFX0tWTShyNSkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCisJbGJ6CXIzLEhTVEFURV9QVElEKHIxMykKIAljbXB3aQlyMywwCiAJYmVxCTE1ZgogCUhNVF9MT1cKQEAgLTEwNzYsNiArMTM3NCwxNSBAQAogCW10c3ByCVNQUk5fTFBJRCxyNwogCWlzeW5jCiAKK0JFR0lOX0ZUUl9TRUNUSU9OCisJLyogRFBERVMgaXMgc2hhcmVkIGJldHdlZW4gdGhyZWFkcyAqLworCW1mc3ByCXI3LCBTUFJOX0RQREVTCisJc3RkCXI3LCBWQ09SRV9EUERFUyhyNSkKKwkvKiBjbGVhciBEUERFUyBzbyB3ZSBkb24ndCBnZXQgZ3Vlc3QgZG9vcmJlbGxzIGluIHRoZSBob3N0ICovCisJbGkJcjgsIDAKKwltdHNwcglTUFJOX0RQREVTLCByOAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQorCiAJLyogU3VidHJhY3QgdGltZWJhc2Ugb2Zmc2V0IGZyb20gdGltZWJhc2UgKi8KIAlsZAlyOCxWQ09SRV9UQl9PRkZTRVQocjUpCiAJY21wZGkJcjgsMApAQCAtMTExMyw3ICsxNDIwLDggQEAKIAkgKiBXZSBoYXZlIHRvIGxvY2sgYWdhaW5zdCBjb25jdXJyZW50IHRsYmllcywgYW5kCiAJICogd2UgaGF2ZSB0byBmbHVzaCB0aGUgd2hvbGUgVExCLgogCSAqLwotMzI6CWxkCXI0LFZDUFVfS1ZNKHI5KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCiszMjoJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJbGQJcjQsVkNPUkVfS1ZNKHI1KQkvKiBwb2ludGVyIHRvIHN0cnVjdCBrdm0gKi8KIAogCS8qIFRha2UgdGhlIGd1ZXN0J3MgdGxiaWVfbG9jayAqLwogI2lmZGVmIF9fQklHX0VORElBTl9fCkBAIC0xMjAzLDYgKzE1MTEsNTYgQEAKIAlhZGQJcjUscjUscjYKIAlzdGQJcjUsVkNQVV9ERUNfRVhQSVJFUyhyOSkKIAorQkVHSU5fRlRSX1NFQ1RJT04KKwliCThmCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCisJLyogVHVybiBvbiBUTSBzbyB3ZSBjYW4gYWNjZXNzIFRGSEFSL1RGSUFSL1RFWEFTUiAqLworCW1mbXNyCXI4CisJbGkJcjAsIDEKKwlybGRpbWkJcjgsIHIwLCBNU1JfVE1fTEcsIDYzLU1TUl9UTV9MRworCW10bXNyZAlyOAorCisJLyogU2F2ZSBQT1dFUjgtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJbWZzcHIJcjUsIFNQUk5fSUFNUgorCW1mc3ByCXI2LCBTUFJOX1BTUEIKKwltZnNwcglyNywgU1BSTl9GU0NSCisJc3RkCXI1LCBWQ1BVX0lBTVIocjkpCisJc3R3CXI2LCBWQ1BVX1BTUEIocjkpCisJc3RkCXI3LCBWQ1BVX0ZTQ1IocjkpCisJbWZzcHIJcjUsIFNQUk5fSUMKKwltZnNwcglyNiwgU1BSTl9WVEIKKwltZnNwcglyNywgU1BSTl9UQVIKKwlzdGQJcjUsIFZDUFVfSUMocjkpCisJc3RkCXI2LCBWQ1BVX1ZUQihyOSkKKwlzdGQJcjcsIFZDUFVfVEFSKHI5KQorI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwltZnNwcglyNSwgU1BSTl9URkhBUgorCW1mc3ByCXI2LCBTUFJOX1RGSUFSCisJbWZzcHIJcjcsIFNQUk5fVEVYQVNSCisJc3RkCXI1LCBWQ1BVX1RGSEFSKHI5KQorCXN0ZAlyNiwgVkNQVV9URklBUihyOSkKKwlzdGQJcjcsIFZDUFVfVEVYQVNSKHI5KQorI2VuZGlmCisJbWZzcHIJcjgsIFNQUk5fRUJCSFIKKwlzdGQJcjgsIFZDUFVfRUJCSFIocjkpCisJbWZzcHIJcjUsIFNQUk5fRUJCUlIKKwltZnNwcglyNiwgU1BSTl9CRVNDUgorCW1mc3ByCXI3LCBTUFJOX0NTSUdSCisJbWZzcHIJcjgsIFNQUk5fVEFDUgorCXN0ZAlyNSwgVkNQVV9FQkJSUihyOSkKKwlzdGQJcjYsIFZDUFVfQkVTQ1IocjkpCisJc3RkCXI3LCBWQ1BVX0NTSUdSKHI5KQorCXN0ZAlyOCwgVkNQVV9UQUNSKHI5KQorCW1mc3ByCXI1LCBTUFJOX1RDU0NSCisJbWZzcHIJcjYsIFNQUk5fQUNPUAorCW1mc3ByCXI3LCBTUFJOX1BJRAorCW1mc3ByCXI4LCBTUFJOX1dPUlQKKwlzdGQJcjUsIFZDUFVfVENTQ1IocjkpCisJc3RkCXI2LCBWQ1BVX0FDT1AocjkpCisJc3R3CXI3LCBWQ1BVX0dVRVNUX1BJRChyOSkKKwlzdGQJcjgsIFZDUFVfV09SVChyOSkKKzg6CisKIAkvKiBTYXZlIGFuZCByZXNldCBBTVIgYW5kIFVBTU9SIGJlZm9yZSB0dXJuaW5nIG9uIHRoZSBNTVUgKi8KIEJFR0lOX0ZUUl9TRUNUSU9OCiAJbWZzcHIJcjUsU1BSTl9BTVIKQEAgLTEyMTcsMTMwICsxNTc1LDEwIEBACiAJbGkJcjAsIEtWTV9HVUVTVF9NT0RFX05PTkUKIAlzdGIJcjAsIEhTVEFURV9JTl9HVUVTVChyMTMpCiAKLQkvKiBTd2l0Y2ggRFNDUiBiYWNrIHRvIGhvc3QgdmFsdWUgKi8KLUJFR0lOX0ZUUl9TRUNUSU9OCi0JbWZzcHIJcjgsIFNQUk5fRFNDUgotCWxkCXI3LCBIU1RBVEVfRFNDUihyMTMpCi0Jc3RkCXI4LCBWQ1BVX0RTQ1IocjkpCi0JbXRzcHIJU1BSTl9EU0NSLCByNwotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCi0KLQkvKiBTYXZlIG5vbi12b2xhdGlsZSBHUFJzICovCi0Jc3RkCXIxNCwgVkNQVV9HUFIoUjE0KShyOSkKLQlzdGQJcjE1LCBWQ1BVX0dQUihSMTUpKHI5KQotCXN0ZAlyMTYsIFZDUFVfR1BSKFIxNikocjkpCi0Jc3RkCXIxNywgVkNQVV9HUFIoUjE3KShyOSkKLQlzdGQJcjE4LCBWQ1BVX0dQUihSMTgpKHI5KQotCXN0ZAlyMTksIFZDUFVfR1BSKFIxOSkocjkpCi0Jc3RkCXIyMCwgVkNQVV9HUFIoUjIwKShyOSkKLQlzdGQJcjIxLCBWQ1BVX0dQUihSMjEpKHI5KQotCXN0ZAlyMjIsIFZDUFVfR1BSKFIyMikocjkpCi0Jc3RkCXIyMywgVkNQVV9HUFIoUjIzKShyOSkKLQlzdGQJcjI0LCBWQ1BVX0dQUihSMjQpKHI5KQotCXN0ZAlyMjUsIFZDUFVfR1BSKFIyNSkocjkpCi0Jc3RkCXIyNiwgVkNQVV9HUFIoUjI2KShyOSkKLQlzdGQJcjI3LCBWQ1BVX0dQUihSMjcpKHI5KQotCXN0ZAlyMjgsIFZDUFVfR1BSKFIyOCkocjkpCi0Jc3RkCXIyOSwgVkNQVV9HUFIoUjI5KShyOSkKLQlzdGQJcjMwLCBWQ1BVX0dQUihSMzApKHI5KQotCXN0ZAlyMzEsIFZDUFVfR1BSKFIzMSkocjkpCi0KLQkvKiBTYXZlIFNQUkdzICovCi0JbWZzcHIJcjMsIFNQUk5fU1BSRzAKLQltZnNwcglyNCwgU1BSTl9TUFJHMQotCW1mc3ByCXI1LCBTUFJOX1NQUkcyCi0JbWZzcHIJcjYsIFNQUk5fU1BSRzMKLQlzdGQJcjMsIFZDUFVfU1BSRzAocjkpCi0Jc3RkCXI0LCBWQ1BVX1NQUkcxKHI5KQotCXN0ZAlyNSwgVkNQVV9TUFJHMihyOSkKLQlzdGQJcjYsIFZDUFVfU1BSRzMocjkpCi0KLQkvKiBzYXZlIEZQIHN0YXRlICovCi0JbXIJcjMsIHI5Ci0JYmwJLmt2bXBwY19zYXZlX2ZwCi0KLQkvKiBJbmNyZW1lbnQgeWllbGQgY291bnQgaWYgdGhleSBoYXZlIGEgVlBBICovCi0JbGQJcjgsIFZDUFVfVlBBKHI5KQkvKiBkbyB0aGV5IGhhdmUgYSBWUEE/ICovCi0JY21wZGkJcjgsIDAKLQliZXEJMjVmCi0JbHd6CXIzLCBMUFBBQ0FfWUlFTERDT1VOVChyOCkKLQlhZGRpCXIzLCByMywgMQotCXN0dwlyMywgTFBQQUNBX1lJRUxEQ09VTlQocjgpCi0JbGkJcjMsIDEKLQlzdGIJcjMsIFZDUFVfVlBBX0RJUlRZKHI5KQotMjU6Ci0JLyogU2F2ZSBQTVUgcmVnaXN0ZXJzIGlmIHJlcXVlc3RlZCAqLwotCS8qIHI4IGFuZCBjcjAuZXEgYXJlIGxpdmUgaGVyZSAqLwotCWxpCXIzLCAxCi0Jc2xkaQlyMywgcjMsIDMxCQkvKiBNTUNSMF9GQyAoZnJlZXplIGNvdW50ZXJzKSBiaXQgKi8KLQltZnNwcglyNCwgU1BSTl9NTUNSMAkJLyogc2F2ZSBNTUNSMCAqLwotCW10c3ByCVNQUk5fTU1DUjAsIHIzCQkvKiBmcmVlemUgYWxsIGNvdW50ZXJzLCBkaXNhYmxlIGludHMgKi8KLQltZnNwcglyNiwgU1BSTl9NTUNSQQotQkVHSU5fRlRSX1NFQ1RJT04KLQkvKiBPbiBQNywgY2xlYXIgTU1DUkEgaW4gb3JkZXIgdG8gZGlzYWJsZSBTREFSIHVwZGF0ZXMgKi8KLQlsaQlyNywgMAotCW10c3ByCVNQUk5fTU1DUkEsIHI3Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKLQlpc3luYwotCWJlcQkyMWYJCQkvKiBpZiBubyBWUEEsIHNhdmUgUE1VIHN0dWZmIGFueXdheSAqLwotCWxieglyNywgTFBQQUNBX1BNQ0lOVVNFKHI4KQotCWNtcHdpCXI3LCAwCQkJLyogZGlkIHRoZXkgYXNrIGZvciBQTVUgc3R1ZmYgdG8gYmUgc2F2ZWQ/ICovCi0JYm5lCTIxZgotCXN0ZAlyMywgVkNQVV9NTUNSKHI5KQkvKiBpZiBub3QsIHNldCBzYXZlZCBNTUNSMCB0byBGQyAqLwotCWIJMjJmCi0yMToJbWZzcHIJcjUsIFNQUk5fTU1DUjEKLQltZnNwcglyNywgU1BSTl9TSUFSCi0JbWZzcHIJcjgsIFNQUk5fU0RBUgotCXN0ZAlyNCwgVkNQVV9NTUNSKHI5KQotCXN0ZAlyNSwgVkNQVV9NTUNSICsgOChyOSkKLQlzdGQJcjYsIFZDUFVfTU1DUiArIDE2KHI5KQotCXN0ZAlyNywgVkNQVV9TSUFSKHI5KQotCXN0ZAlyOCwgVkNQVV9TREFSKHI5KQotCW1mc3ByCXIzLCBTUFJOX1BNQzEKLQltZnNwcglyNCwgU1BSTl9QTUMyCi0JbWZzcHIJcjUsIFNQUk5fUE1DMwotCW1mc3ByCXI2LCBTUFJOX1BNQzQKLQltZnNwcglyNywgU1BSTl9QTUM1Ci0JbWZzcHIJcjgsIFNQUk5fUE1DNgotQkVHSU5fRlRSX1NFQ1RJT04KLQltZnNwcglyMTAsIFNQUk5fUE1DNwotCW1mc3ByCXIxMSwgU1BSTl9QTUM4Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKLQlzdHcJcjMsIFZDUFVfUE1DKHI5KQotCXN0dwlyNCwgVkNQVV9QTUMgKyA0KHI5KQotCXN0dwlyNSwgVkNQVV9QTUMgKyA4KHI5KQotCXN0dwlyNiwgVkNQVV9QTUMgKyAxMihyOSkKLQlzdHcJcjcsIFZDUFVfUE1DICsgMTYocjkpCi0Jc3R3CXI4LCBWQ1BVX1BNQyArIDIwKHI5KQotQkVHSU5fRlRSX1NFQ1RJT04KLQlzdHcJcjEwLCBWQ1BVX1BNQyArIDI0KHI5KQotCXN0dwlyMTEsIFZDUFVfUE1DICsgMjgocjkpCi1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKLTIyOgogCWxkCXIwLCAxMTIrUFBDX0xSX1NUS09GRihyMSkKIAlhZGRpCXIxLCByMSwgMTEyCiAJbXRscglyMAogCWJscgotc2Vjb25kYXJ5X3Rvb19sYXRlOgotCWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQotCUhNVF9MT1cKLTEzOglsYnoJcjMsVkNPUkVfSU5fR1VFU1QocjUpCi0JY21wd2kJcjMsMAotCWJuZQkxM2IKLQlITVRfTUVESVVNCi0JbGkJcjAsIEtWTV9HVUVTVF9NT0RFX05PTkUKLQlzdGIJcjAsIEhTVEFURV9JTl9HVUVTVChyMTMpCi0JbGQJcjExLFBBQ0FfU0xCU0hBRE9XUFRSKHIxMykKLQotCS5yZXB0CVNMQl9OVU1fQk9MVEVECi0JbGQJcjUsU0xCU0hBRE9XX1NBVkVBUkVBKHIxMSkKLQlsZAlyNixTTEJTSEFET1dfU0FWRUFSRUErOChyMTEpCi0JYW5kaXMuCXI3LHI1LFNMQl9FU0lEX1ZAaAotCWJlcQkxZgotCXNsYm10ZQlyNixyNQotMToJYWRkaQlyMTEscjExLDE2Ci0JLmVuZHIKLQliCTIyYgogCiAvKgogICogQ2hlY2sgd2hldGhlciBhbiBIRFNJIGlzIGFuIEhQVEUgbm90IGZvdW5kIGZhdWx0IG9yIHNvbWV0aGluZyBlbHNlLgpAQCAtMTM4Niw4ICsxNjI0LDcgQEAKIAltdHNwcglTUFJOX1NSUjAsIHIxMAogCW10c3ByCVNQUk5fU1JSMSwgcjExCiAJbGkJcjEwLCBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRQotCWxpCXIxMSwgKE1TUl9NRSA8PCAxKSB8IDEJLyogc3ludGhlc2l6ZSBNU1JfU0YgfCBNU1JfTUUgKi8KLQlyb3RsZGkJcjExLCByMTEsIDYzCisJbGQJcjExLCBWQ1BVX0lOVFJfTVNSKHI5KQogZmFzdF9pbnRlcnJ1cHRfY19yZXR1cm46CiA2OglsZAlyNywgVkNQVV9DVFIocjkpCiAJbHd6CXI4LCBWQ1BVX1hFUihyOSkKQEAgLTE0NTYsOCArMTY5Myw3IEBACiAxOgltdHNwcglTUFJOX1NSUjAsIHIxMAogCW10c3ByCVNQUk5fU1JSMSwgcjExCiAJbGkJcjEwLCBCT09LM1NfSU5URVJSVVBUX0lOU1RfU1RPUkFHRQotCWxpCXIxMSwgKE1TUl9NRSA8PCAxKSB8IDEJLyogc3ludGhlc2l6ZSBNU1JfU0YgfCBNU1JfTUUgKi8KLQlyb3RsZGkJcjExLCByMTEsIDYzCisJbGQJcjExLCBWQ1BVX0lOVFJfTVNSKHI5KQogCWIJZmFzdF9pbnRlcnJ1cHRfY19yZXR1cm4KIAogMzoJbGQJcjYsIFZDUFVfS1ZNKHI5KQkvKiBub3QgcmVsb2NhdGVkLCB1c2UgVlJNQSAqLwpAQCAtMTQ3NCw3ICsxNzEwLDggQEAKIGhjYWxsX3RyeV9yZWFsX21vZGU6CiAJbGQJcjMsVkNQVV9HUFIoUjMpKHI5KQogCWFuZGkuCXIwLHIxMSxNU1JfUFIKLQlibmUJZ3Vlc3RfZXhpdF9jb250CisJLyogc2MgMSBmcm9tIHVzZXJzcGFjZSAtIHJlZmxlY3QgdG8gZ3Vlc3Qgc3lzY2FsbCAqLworCWJuZQlzY18xX2Zhc3RfcmV0dXJuCiAJY2xycmRpCXIzLHIzLDIKIAljbXBsZGkJcjMsaGNhbGxfcmVhbF90YWJsZV9lbmQgLSBoY2FsbF9yZWFsX3RhYmxlCiAJYmdlCWd1ZXN0X2V4aXRfY29udApAQCAtMTQ5NSw2ICsxNzMyLDE0IEBACiAJbGQJcjExLFZDUFVfTVNSKHI0KQogCWIJZmFzdF9ndWVzdF9yZXR1cm4KIAorc2NfMV9mYXN0X3JldHVybjoKKwltdHNwcglTUFJOX1NSUjAscjEwCisJbXRzcHIJU1BSTl9TUlIxLHIxMQorCWxpCXIxMCwgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCisJbGQJcjExLCBWQ1BVX0lOVFJfTVNSKHI5KQorCW1yCXI0LHI5CisJYglmYXN0X2d1ZXN0X3JldHVybgorCiAJLyogV2UndmUgYXR0ZW1wdGVkIGEgcmVhbCBtb2RlIGhjYWxsLCBidXQgaXQncyBwdW50ZWQgaXQgYmFjawogCSAqIHRvIHVzZXJzcGFjZS4gIFdlIG5lZWQgdG8gcmVzdG9yZSBzb21lIGNsb2JiZXJlZCB2b2xhdGlsZXMKIAkgKiBiZWZvcmUgcmVzdW1pbmcgdGhlIHBhc3MtaXQtdG8tcWVtdSBwYXRoICovCkBAIC0xNTg4LDE0ICsxODMzLDM0IEBACiAJLmxvbmcJMAkJLyogMHgxMWMgKi8KIAkubG9uZwkwCQkvKiAweDEyMCAqLwogCS5sb25nCS5rdm1wcGNfaF9idWxrX3JlbW92ZSAtIGhjYWxsX3JlYWxfdGFibGUKKwkubG9uZwkwCQkvKiAweDEyOCAqLworCS5sb25nCTAJCS8qIDB4MTJjICovCisJLmxvbmcJMAkJLyogMHgxMzAgKi8KKwkubG9uZwkua3ZtcHBjX2hfc2V0X3hkYWJyIC0gaGNhbGxfcmVhbF90YWJsZQogaGNhbGxfcmVhbF90YWJsZV9lbmQ6CiAKIGlnbm9yZV9oZGVjOgogCW1yCXI0LHI5CiAJYglmYXN0X2d1ZXN0X3JldHVybgogCitfR0xPQkFMKGt2bXBwY19oX3NldF94ZGFicikKKwlhbmRpLglyMCwgcjUsIERBQlJYX1VTRVIgfCBEQUJSWF9LRVJORUwKKwliZXEJNmYKKwlsaQlyMCwgREFCUlhfVVNFUiB8IERBQlJYX0tFUk5FTCB8IERBQlJYX0JUSQorCWFuZGMuCXIwLCByNSwgcjAKKwliZXEJM2YKKzY6CWxpCXIzLCBIX1BBUkFNRVRFUgorCWJscgorCiBfR0xPQkFMKGt2bXBwY19oX3NldF9kYWJyKQorCWxpCXI1LCBEQUJSWF9VU0VSIHwgREFCUlhfS0VSTkVMCiszOgorQkVHSU5fRlRSX1NFQ1RJT04KKwliCTJmCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAJc3RkCXI0LFZDUFVfREFCUihyMykKKwlzdHcJcjUsIFZDUFVfREFCUlgocjMpCisJbXRzcHIJU1BSTl9EQUJSWCwgcjUKIAkvKiBXb3JrIGFyb3VuZCBQNyBidWcgd2hlcmUgREFCUiBjYW4gZ2V0IGNvcnJ1cHRlZCBvbiBtdHNwciAqLwogMToJbXRzcHIJU1BSTl9EQUJSLHI0CiAJbWZzcHIJcjUsIFNQUk5fREFCUgpAQCAtMTYwNSw2ICsxODcwLDE3IEBACiAJbGkJcjMsMAogCWJscgogCisJLyogRW11bGF0ZSBIX1NFVF9EQUJSL1ggb24gUDggZm9yIHRoZSBzYWtlIG9mIGNvbXBhdCBtb2RlIGd1ZXN0cyAqLworMjoJcmx3aW1pCXI1LCByNCwgNSwgREFXUlhfRFIgfCBEQVdSWF9EVworCXJsd2ltaQlyNSwgcjQsIDEsIERBV1JYX1dUCisJY2xycmRpCXI0LCByNCwgMworCXN0ZAlyNCwgVkNQVV9EQVdSKHIzKQorCXN0ZAlyNSwgVkNQVV9EQVdSWChyMykKKwltdHNwcglTUFJOX0RBV1IsIHI0CisJbXRzcHIJU1BSTl9EQVdSWCwgcjUKKwlsaQlyMywgMAorCWJscgorCiBfR0xPQkFMKGt2bXBwY19oX2NlZGUpCiAJb3JpCXIxMSxyMTEsTVNSX0VFCiAJc3RkCXIxMSxWQ1BVX01TUihyMykKQEAgLTE2MjgsNyArMTkwNCw3IEBACiAJICogdXAgdG8gdGhlIGhvc3QuCiAJICovCiAJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCi0JbHd6CXI2LFZDUFVfUFRJRChyMykKKwlsYnoJcjYsSFNUQVRFX1BUSUQocjEzKQogCWx3eglyOCxWQ09SRV9FTlRSWV9FWElUKHI1KQogCWNscmxkaQlyOCxyOCw1NgogCWxpCXIwLDEKQEAgLTE2NDMsOSArMTkxOSw4IEBACiAJYm5lCTMxYgogCS8qIG9yZGVyIG5hcHBpbmdfdGhyZWFkcyB1cGRhdGUgdnMgdGVzdGluZyBlbnRyeV9leGl0X2NvdW50ICovCiAJaXN5bmMKLQlsaQlyMCwxCisJbGkJcjAsTkFQUElOR19DRURFCiAJc3RiCXIwLEhTVEFURV9OQVBQSU5HKHIxMykKLQltcglyNCxyMwogCWx3eglyNyxWQ09SRV9FTlRSWV9FWElUKHI1KQogCWNtcHdpCXI3LDB4MTAwCiAJYmdlCTMzZgkJLyogYW5vdGhlciB0aHJlYWQgYWxyZWFkeSBleGl0aW5nICovCkBAIC0xNjc3LDE2ICsxOTUyLDE5IEBACiAJc3RkCXIzMSwgVkNQVV9HUFIoUjMxKShyMykKIAogCS8qIHNhdmUgRlAgc3RhdGUgKi8KLQlibAkua3ZtcHBjX3NhdmVfZnAKKwlibAlrdm1wcGNfc2F2ZV9mcAogCiAJLyoKLQkgKiBUYWtlIGEgbmFwIHVudGlsIGEgZGVjcmVtZW50ZXIgb3IgZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycywKLQkgKiB3aXRoIFBFQ0UxICh3YWtlIG9uIGRlY3IpIGFuZCBQRUNFMCAod2FrZSBvbiBleHRlcm5hbCkgc2V0IGluIExQQ1IKKwkgKiBUYWtlIGEgbmFwIHVudGlsIGEgZGVjcmVtZW50ZXIgb3IgZXh0ZXJuYWwgb3IgZG9vYmVsbCBpbnRlcnJ1cHQKKwkgKiBvY2N1cnMsIHdpdGggUEVDRTEsIFBFQ0UwIGFuZCBQRUNFRFAgc2V0IGluIExQQ1IKIAkgKi8KIAlsaQlyMCwxCiAJc3RiCXIwLEhTVEFURV9IV1RIUkVBRF9SRVEocjEzKQogCW1mc3ByCXI1LFNQUk5fTFBDUgogCW9yaQlyNSxyNSxMUENSX1BFQ0UwIHwgTFBDUl9QRUNFMQorQkVHSU5fRlRSX1NFQ1RJT04KKwlvcmlzCXI1LHI1LExQQ1JfUEVDRURQQGgKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA3UykKIAltdHNwcglTUFJOX0xQQ1IscjUKIAlpc3luYwogCWxpCXIwLCAwCkBAIC0xNjk4LDYgKzE5NzYsMTEgQEAKIAluYXAKIAliCS4KIAorMzM6CW1yCXI0LCByMworCWxpCXIzLCAwCisJbGkJcjEyLCAwCisJYgkzNGYKKwoga3ZtX2VuZF9jZWRlOgogCS8qIGdldCB2Y3B1IHBvaW50ZXIgKi8KIAlsZAlyNCwgSFNUQVRFX0tWTV9WQ1BVKHIxMykKQEAgLTE3MjcsMTIgKzIwMTAsMTUgQEAKIAlsZAlyMjksIFZDUFVfR1BSKFIyOSkocjQpCiAJbGQJcjMwLCBWQ1BVX0dQUihSMzApKHI0KQogCWxkCXIzMSwgVkNQVV9HUFIoUjMxKShyNCkKKyAKKwkvKiBDaGVjayB0aGUgd2FrZSByZWFzb24gaW4gU1JSMSB0byBzZWUgd2h5IHdlIGdvdCBoZXJlICovCisJYmwJa3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uCiAKIAkvKiBjbGVhciBvdXIgYml0IGluIHZjb3JlLT5uYXBwaW5nX3RocmVhZHMgKi8KLTMzOglsZAlyNSxIU1RBVEVfS1ZNX1ZDT1JFKHIxMykKLQlsd3oJcjMsVkNQVV9QVElEKHI0KQorMzQ6CWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWxieglyNyxIU1RBVEVfUFRJRChyMTMpCiAJbGkJcjAsMQotCXNsZAlyMCxyMCxyMworCXNsZAlyMCxyMCxyNwogCWFkZGkJcjYscjUsVkNPUkVfTkFQUElOR19USFJFQURTCiAzMjoJbHdhcngJcjcsMCxyNgogCWFuZGMJcjcscjcscjAKQEAgLTE3NDEsMjMgKzIwMjcsMTggQEAKIAlsaQlyMCwwCiAJc3RiCXIwLEhTVEFURV9OQVBQSU5HKHIxMykKIAotCS8qIENoZWNrIHRoZSB3YWtlIHJlYXNvbiBpbiBTUlIxIHRvIHNlZSB3aHkgd2UgZ290IGhlcmUgKi8KLQltZnNwcglyMywgU1BSTl9TUlIxCi0Jcmx3aW5tCXIzLCByMywgNDQtMzEsIDB4NwkvKiBleHRyYWN0IHdha2UgcmVhc29uIGZpZWxkICovCi0JY21wd2kJcjMsIDQJCQkvKiB3YXMgaXQgYW4gZXh0ZXJuYWwgaW50ZXJydXB0PyAqLwotCWxpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAorCS8qIFNlZSBpZiB0aGUgd2FrZSByZWFzb24gbWVhbnMgd2UgbmVlZCB0byBleGl0ICovCisJc3R3CXIxMiwgVkNQVV9UUkFQKHI0KQogCW1yCXI5LCByNAotCWxkCXIxMCwgVkNQVV9QQyhyOSkKLQlsZAlyMTEsIFZDUFVfTVNSKHI5KQotCWJlcQlkb19leHRfaW50ZXJydXB0CS8qIGlmIHNvICovCisJY21wZGkJcjMsIDAKKwliZ3QJZ3Vlc3RfZXhpdF9jb250CiAKIAkvKiBzZWUgaWYgYW55IG90aGVyIHRocmVhZCBpcyBhbHJlYWR5IGV4aXRpbmcgKi8KIAlsd3oJcjAsVkNPUkVfRU5UUllfRVhJVChyNSkKIAljbXB3aQlyMCwweDEwMAotCWJsdAlrdm1wcGNfY2VkZV9yZWVudHJ5CS8qIGlmIG5vdCBnbyBiYWNrIHRvIGd1ZXN0ICovCisJYmdlCWd1ZXN0X2V4aXRfY29udAogCi0JLyogc29tZSB0aHJlYWRzIGFyZSBleGl0aW5nLCBzbyBnbyB0byB0aGUgZ3Vlc3QgZXhpdCBwYXRoICovCi0JYgloY2FsbF9yZWFsX2ZhbGxiYWNrCisJYglrdm1wcGNfY2VkZV9yZWVudHJ5CS8qIGlmIG5vdCBnbyBiYWNrIHRvIGd1ZXN0ICovCiAKIAkvKiBjZWRlIHdoZW4gYWxyZWFkeSBwcmV2aW91c2x5IHByb2RkZWQgY2FzZSAqLwoga3ZtX2NlZGVfcHJvZGRlZDoKQEAgLTE3ODMsMTEgKzIwNjQsNDggQEAKIAliZXEJbWNfY29udAogCS8qIElmIG5vdCwgZGVsaXZlciBhIG1hY2hpbmUgY2hlY2suICBTUlIwLzEgYXJlIGFscmVhZHkgc2V0ICovCiAJbGkJcjEwLCBCT09LM1NfSU5URVJSVVBUX01BQ0hJTkVfQ0hFQ0sKLQlsaQlyMTEsIChNU1JfTUUgPDwgMSkgfCAxCS8qIHN5bnRoZXNpemUgTVNSX1NGIHwgTVNSX01FICovCi0Jcm90bGRpCXIxMSwgcjExLCA2MworCWxkCXIxMSwgVkNQVV9JTlRSX01TUihyOSkKIAliCWZhc3RfaW50ZXJydXB0X2NfcmV0dXJuCiAKIC8qCisgKiBDaGVjayB0aGUgcmVhc29uIHdlIHdva2UgZnJvbSBuYXAsIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbi4KKyAqIFJldHVybnM6CisgKgkwIGlmIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQorICoJMSBpZiBzb21ldGhpbmcgaGFwcGVuZWQgdGhhdCBuZWVkcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBob3N0CisgKgktMSBpZiB0aGVyZSB3YXMgYSBndWVzdCB3YWtldXAgKElQSSkKKyAqCisgKiBBbHNvIHNldHMgcjEyIHRvIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIGZvciBhbnkgaW50ZXJydXB0IHRoYXQgbmVlZHMKKyAqIHRvIGJlIGhhbmRsZWQgbm93IGJ5IHRoZSBob3N0ICgweDUwMCBmb3IgZXh0ZXJuYWwgaW50ZXJydXB0KSwgb3IgemVyby4KKyAqLwora3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uOgorCW1mc3ByCXI2LCBTUFJOX1NSUjEKK0JFR0lOX0ZUUl9TRUNUSU9OCisJcmx3aW5tCXI2LCByNiwgNDUtMzEsIDB4ZgkvKiBleHRyYWN0IHdha2UgcmVhc29uIGZpZWxkIChQOCkgKi8KK0ZUUl9TRUNUSU9OX0VMU0UKKwlybHdpbm0JcjYsIHI2LCA0NS0zMSwgMHhlCS8qIFA3IHdha2UgcmVhc29uIGZpZWxkIGlzIDMgYml0cyAqLworQUxUX0ZUUl9TRUNUSU9OX0VORF9JRlNFVChDUFVfRlRSX0FSQ0hfMjA3UykKKwljbXB3aQlyNiwgOAkJCS8qIHdhcyBpdCBhbiBleHRlcm5hbCBpbnRlcnJ1cHQ/ICovCisJbGkJcjEyLCBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisJYmVxCWt2bXBwY19yZWFkX2ludHIJLyogaWYgc28sIHNlZSB3aGF0IGl0IHdhcyAqLworCWxpCXIzLCAwCisJbGkJcjEyLCAwCisJY21wd2kJcjYsIDYJCQkvKiB3YXMgaXQgdGhlIGRlY3JlbWVudGVyPyAqLworCWJlcQkwZgorQkVHSU5fRlRSX1NFQ1RJT04KKwljbXB3aQlyNiwgNQkJCS8qIHByaXZpbGVnZWQgZG9vcmJlbGw/ICovCisJYmVxCTBmCisJY21wd2kJcjYsIDMJCQkvKiBoeXBlcnZpc29yIGRvb3JiZWxsPyAqLworCWJlcQkzZgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQorCWxpCXIzLCAxCQkJLyogYW55dGhpbmcgZWxzZSwgcmV0dXJuIDEgKi8KKzA6CWJscgorCisJLyogaHlwZXJ2aXNvciBkb29yYmVsbCAqLworMzoJbGkJcjEyLCBCT09LM1NfSU5URVJSVVBUX0hfRE9PUkJFTEwKKwlsaQlyMywgMQorCWJscgorCisvKgogICogRGV0ZXJtaW5lIHdoYXQgc29ydCBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgcGVuZGluZyAoaWYgYW55KS4KICAqIFJldHVybnM6CiAgKgkwIGlmIG5vIGludGVycnVwdCBpcyBwZW5kaW5nCkBAIC0xODE4LDcgKzIxMzYsNiBAQAogCSAqIGludGVycnVwdHMgZGlyZWN0bHkgdG8gdGhlIGd1ZXN0CiAJICovCiAJY21wd2kJcjMsIFhJQ1NfSVBJCQkvKiBpZiB0aGVyZSBpcywgaXMgaXQgYW4gSVBJPyAqLwotCWxpCXIzLCAxCiAJYm5lCTQyZgogCiAJLyogSXQncyBhbiBJUEksIGNsZWFyIHRoZSBNRlJSIGFuZCBFT0kgaXQgKi8KQEAgLTE4NDQsMTkgKzIxNjEsMjUgQEAKIAkgKiBiZWZvcmUgZXhpdCwgaXQgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdGhlIGhvc3QgSUNQIGRyaXZlcgogCSAqLwogCXN0dwlyMCwgSFNUQVRFX1NBVkVEX1hJUlIocjEzKQorCWxpCXIzLCAxCiAJYgkxYgogCiA0MzoJLyogV2UgcmFjZWQgd2l0aCB0aGUgaG9zdCwgd2UgbmVlZCB0byByZXNlbmQgdGhhdCBJUEksIGJ1bW1lciAqLwogCWxpCXIwLCBJUElfUFJJT1JJVFkKIAlzdGJjaXgJcjAsIHI2LCByOAkJLyogc2V0IHRoZSBJUEkgKi8KIAlzeW5jCisJbGkJcjMsIDEKIAliCTFiCiAKIC8qCiAgKiBTYXZlIGF3YXkgRlAsIFZNWCBhbmQgVlNYIHJlZ2lzdGVycy4KICAqIHIzID0gdmNwdSBwb2ludGVyCisgKiBOLkIuIHIzMCBhbmQgcjMxIGFyZSB2b2xhdGlsZSBhY3Jvc3MgdGhpcyBmdW5jdGlvbiwKKyAqIHRodXMgaXQgaXMgbm90IGNhbGxhYmxlIGZyb20gQy4KICAqLwotX0dMT0JBTChrdm1wcGNfc2F2ZV9mcCkKK2t2bXBwY19zYXZlX2ZwOgorCW1mbHIJcjMwCisJbXIJcjMxLHIzCiAJbWZtc3IJcjUKIAlvcmkJcjgscjUsTVNSX0ZQCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKQEAgLTE4NzEsNDIgKzIxOTQsMTcgQEAKICNlbmRpZgogCW10bXNyZAlyOAogCWlzeW5jCi0jaWZkZWYgQ09ORklHX1ZTWAotQkVHSU5fRlRSX1NFQ1RJT04KLQlyZWcgPSAwCi0JLnJlcHQJMzIKLQlsaQlyNixyZWcqMTYrVkNQVV9WU1JTCi0JU1RYVkQyWChyZWcsUjYsUjMpCi0JcmVnID0gcmVnICsgMQotCS5lbmRyCi1GVFJfU0VDVElPTl9FTFNFCi0jZW5kaWYKLQlyZWcgPSAwCi0JLnJlcHQJMzIKLQlzdGZkCXJlZyxyZWcqOCtWQ1BVX0ZQUlMocjMpCi0JcmVnID0gcmVnICsgMQotCS5lbmRyCi0jaWZkZWYgQ09ORklHX1ZTWAotQUxUX0ZUUl9TRUNUSU9OX0VORF9JRlNFVChDUFVfRlRSX1ZTWCkKLSNlbmRpZgotCW1mZnMJZnIwCi0Jc3RmZAlmcjAsVkNQVV9GUFNDUihyMykKLQorCWFkZGkJcjMscjMsVkNQVV9GUFJTCisJYmwJLnN0b3JlX2ZwX3N0YXRlCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIEJFR0lOX0ZUUl9TRUNUSU9OCi0JcmVnID0gMAotCS5yZXB0CTMyCi0JbGkJcjYscmVnKjE2K1ZDUFVfVlJTCi0Jc3R2eAlyZWcscjYscjMKLQlyZWcgPSByZWcgKyAxCi0JLmVuZHIKLQltZnZzY3IJdnIwCi0JbGkJcjYsVkNQVV9WU0NSCi0Jc3R2eAl2cjAscjYscjMKKwlhZGRpCXIzLHIzMSxWQ1BVX1ZSUworCWJsCS5zdG9yZV92cl9zdGF0ZQogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKICNlbmRpZgogCW1mc3ByCXI2LFNQUk5fVlJTQVZFCiAJc3R3CXI2LFZDUFVfVlJTQVZFKHIzKQorCW10bHIJcjMwCiAJbXRtc3JkCXI1CiAJaXN5bmMKIAlibHIKQEAgLTE5MTQsOSArMjIxMiwxMiBAQAogLyoKICAqIExvYWQgdXAgRlAsIFZNWCBhbmQgVlNYIHJlZ2lzdGVycwogICogcjQgPSB2Y3B1IHBvaW50ZXIKKyAqIE4uQi4gcjMwIGFuZCByMzEgYXJlIHZvbGF0aWxlIGFjcm9zcyB0aGlzIGZ1bmN0aW9uLAorICogdGh1cyBpdCBpcyBub3QgY2FsbGFibGUgZnJvbSBDLgogICovCi0JLmdsb2JsCWt2bXBwY19sb2FkX2ZwCiBrdm1wcGNfbG9hZF9mcDoKKwltZmxyCXIzMAorCW1yCXIzMSxyNAogCW1mbXNyCXI5CiAJb3JpCXI4LHI5LE1TUl9GUAogI2lmZGVmIENPTkZJR19BTFRJVkVDCkBAIC0xOTMxLDQyICsyMjMyLDE4IEBACiAjZW5kaWYKIAltdG1zcmQJcjgKIAlpc3luYwotCWxmZAlmcjAsVkNQVV9GUFNDUihyNCkKLQlNVEZTRl9MKGZyMCkKLSNpZmRlZiBDT05GSUdfVlNYCi1CRUdJTl9GVFJfU0VDVElPTgotCXJlZyA9IDAKLQkucmVwdAkzMgotCWxpCXI3LHJlZyoxNitWQ1BVX1ZTUlMKLQlMWFZEMlgocmVnLFI3LFI0KQotCXJlZyA9IHJlZyArIDEKLQkuZW5kcgotRlRSX1NFQ1RJT05fRUxTRQotI2VuZGlmCi0JcmVnID0gMAotCS5yZXB0CTMyCi0JbGZkCXJlZyxyZWcqOCtWQ1BVX0ZQUlMocjQpCi0JcmVnID0gcmVnICsgMQotCS5lbmRyCi0jaWZkZWYgQ09ORklHX1ZTWAotQUxUX0ZUUl9TRUNUSU9OX0VORF9JRlNFVChDUFVfRlRSX1ZTWCkKLSNlbmRpZgotCisJYWRkaQlyMyxyNCxWQ1BVX0ZQUlMKKwlibAkubG9hZF9mcF9zdGF0ZQogI2lmZGVmIENPTkZJR19BTFRJVkVDCiBCRUdJTl9GVFJfU0VDVElPTgotCWxpCXI3LFZDUFVfVlNDUgotCWx2eAl2cjAscjcscjQKLQltdHZzY3IJdnIwCi0JcmVnID0gMAotCS5yZXB0CTMyCi0JbGkJcjcscmVnKjE2K1ZDUFVfVlJTCi0JbHZ4CXJlZyxyNyxyNAotCXJlZyA9IHJlZyArIDEKLQkuZW5kcgorCWFkZGkJcjMscjMxLFZDUFVfVlJTCisJYmwJLmxvYWRfdnJfc3RhdGUKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FMVElWRUMpCiAjZW5kaWYKIAlsd3oJcjcsVkNQVV9WUlNBVkUocjQpCiAJbXRzcHIJU1BSTl9WUlNBVkUscjcKKwltdGxyCXIzMAorCW1yCXI0LHIzMQogCWJscgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcGFpcmVkX3NpbmdsZXMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3BhaXJlZF9zaW5nbGVzLmMKaW5kZXggYTU5YTI1YS4uYzFhYmQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcGFpcmVkX3NpbmdsZXMuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wYWlyZWRfc2luZ2xlcy5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19zeW5jX3FwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBydCkKIHsKLQlrdm1fY3Z0X2RmKCZ2Y3B1LT5hcmNoLmZwcltydF0sICZ2Y3B1LT5hcmNoLnFwcltydF0pOworCWt2bV9jdnRfZGYoJlZDUFVfRlBSKHZjcHUsIHJ0KSwgJnZjcHUtPmFyY2gucXByW3J0XSk7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bXBwY19pbmplY3RfcGYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBlYWRkciwgYm9vbCBpc19zdG9yZSkKQEAgLTIwNywxMSArMjA3LDExIEBACiAJLyogcHV0IGluIHJlZ2lzdGVycyAqLwogCXN3aXRjaCAobHNfdHlwZSkgewogCWNhc2UgRlBVX0xTX1NJTkdMRToKLQkJa3ZtX2N2dF9mZCgodTMyKil0bXAsICZ2Y3B1LT5hcmNoLmZwcltyc10pOworCQlrdm1fY3Z0X2ZkKCh1MzIqKXRtcCwgJlZDUFVfRlBSKHZjcHUsIHJzKSk7CiAJCXZjcHUtPmFyY2gucXByW3JzXSA9ICooKHUzMiopdG1wKTsKIAkJYnJlYWs7CiAJY2FzZSBGUFVfTFNfRE9VQkxFOgotCQl2Y3B1LT5hcmNoLmZwcltyc10gPSAqKCh1NjQqKXRtcCk7CisJCVZDUFVfRlBSKHZjcHUsIHJzKSA9ICooKHU2NCopdG1wKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMzMsMTggKzIzMywxOCBAQAogCiAJc3dpdGNoIChsc190eXBlKSB7CiAJY2FzZSBGUFVfTFNfU0lOR0xFOgotCQlrdm1fY3Z0X2RmKCZ2Y3B1LT5hcmNoLmZwcltyc10sICh1MzIqKXRtcCk7CisJCWt2bV9jdnRfZGYoJlZDUFVfRlBSKHZjcHUsIHJzKSwgKHUzMiopdG1wKTsKIAkJdmFsID0gKigodTMyKil0bXApOwogCQlsZW4gPSBzaXplb2YodTMyKTsKIAkJYnJlYWs7CiAJY2FzZSBGUFVfTFNfU0lOR0xFX0xPVzoKLQkJKigodTMyKil0bXApID0gdmNwdS0+YXJjaC5mcHJbcnNdOwotCQl2YWwgPSB2Y3B1LT5hcmNoLmZwcltyc10gJiAweGZmZmZmZmZmOworCQkqKCh1MzIqKXRtcCkgPSBWQ1BVX0ZQUih2Y3B1LCBycyk7CisJCXZhbCA9IFZDUFVfRlBSKHZjcHUsIHJzKSAmIDB4ZmZmZmZmZmY7CiAJCWxlbiA9IHNpemVvZih1MzIpOwogCQlicmVhazsKIAljYXNlIEZQVV9MU19ET1VCTEU6Ci0JCSooKHU2NCopdG1wKSA9IHZjcHUtPmFyY2guZnByW3JzXTsKLQkJdmFsID0gdmNwdS0+YXJjaC5mcHJbcnNdOworCQkqKCh1NjQqKXRtcCkgPSBWQ1BVX0ZQUih2Y3B1LCBycyk7CisJCXZhbCA9IFZDUFVfRlBSKHZjcHUsIHJzKTsKIAkJbGVuID0gc2l6ZW9mKHU2NCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0zMDEsNyArMzAxLDcgQEAKIAllbXVsYXRlZCA9IEVNVUxBVEVfRE9ORTsKIAogCS8qIHB1dCBpbiByZWdpc3RlcnMgKi8KLQlrdm1fY3Z0X2ZkKCZ0bXBbMF0sICZ2Y3B1LT5hcmNoLmZwcltyc10pOworCWt2bV9jdnRfZmQoJnRtcFswXSwgJlZDUFVfRlBSKHZjcHUsIHJzKSk7CiAJdmNwdS0+YXJjaC5xcHJbcnNdID0gdG1wWzFdOwogCiAJZHByaW50ayhLRVJOX0lORk8gIktWTTogUFNRX0xEIFsweCV4LCAweCV4XSBhdCAweCVseCAoJWQpXG4iLCB0bXBbMF0sCkBAIC0zMTksNyArMzE5LDcgQEAKIAl1MzIgdG1wWzJdOwogCWludCBsZW4gPSB3ID8gc2l6ZW9mKHUzMikgOiBzaXplb2YodTY0KTsKIAotCWt2bV9jdnRfZGYoJnZjcHUtPmFyY2guZnByW3JzXSwgJnRtcFswXSk7CisJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgcnMpLCAmdG1wWzBdKTsKIAl0bXBbMV0gPSB2Y3B1LT5hcmNoLnFwcltyc107CiAKIAlyID0ga3ZtcHBjX3N0KHZjcHUsICZhZGRyLCBsZW4sIHRtcCwgdHJ1ZSk7CkBAIC01MTIsNyArNTEyLDYgQEAKIAkJCQkJCSB1MzIgKnNyYzIsIHUzMiAqc3JjMykpCiB7CiAJdTMyICpxcHIgPSB2Y3B1LT5hcmNoLnFwcjsKLQl1NjQgKmZwciA9IHZjcHUtPmFyY2guZnByOwogCXUzMiBwczBfb3V0OwogCXUzMiBwczBfaW4xLCBwczBfaW4yLCBwczBfaW4zOwogCXUzMiBwczFfaW4xLCBwczFfaW4yLCBwczFfaW4zOwpAQCAtNTIxLDIwICs1MjAsMjAgQEAKIAlXQVJOX09OKHJjKTsKIAogCS8qIFBTMCAqLwotCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4xXSwgJnBzMF9pbjEpOwotCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4yXSwgJnBzMF9pbjIpOwotCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4zXSwgJnBzMF9pbjMpOworCWt2bV9jdnRfZGYoJlZDUFVfRlBSKHZjcHUsIHJlZ19pbjEpLCAmcHMwX2luMSk7CisJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgcmVnX2luMiksICZwczBfaW4yKTsKKwlrdm1fY3Z0X2RmKCZWQ1BVX0ZQUih2Y3B1LCByZWdfaW4zKSwgJnBzMF9pbjMpOwogCiAJaWYgKHNjYWxhciAmIFNDQUxBUl9MT1cpCiAJCXBzMF9pbjIgPSBxcHJbcmVnX2luMl07CiAKLQlmdW5jKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmcHMwX291dCwgJnBzMF9pbjEsICZwczBfaW4yLCAmcHMwX2luMyk7CisJZnVuYygmdmNwdS0+YXJjaC5mcC5mcHNjciwgJnBzMF9vdXQsICZwczBfaW4xLCAmcHMwX2luMiwgJnBzMF9pbjMpOwogCiAJZHByaW50ayhLRVJOX0lORk8gIlBTMyBwczAgLT4gZigweCV4LCAweCV4LCAweCV4KSA9IDB4JXhcbiIsCiAJCQkgIHBzMF9pbjEsIHBzMF9pbjIsIHBzMF9pbjMsIHBzMF9vdXQpOwogCiAJaWYgKCEoc2NhbGFyICYgU0NBTEFSX05PX1BTMCkpCi0JCWt2bV9jdnRfZmQoJnBzMF9vdXQsICZmcHJbcmVnX291dF0pOworCQlrdm1fY3Z0X2ZkKCZwczBfb3V0LCAmVkNQVV9GUFIodmNwdSwgcmVnX291dCkpOwogCiAJLyogUFMxICovCiAJcHMxX2luMSA9IHFwcltyZWdfaW4xXTsKQEAgLTU0NSw3ICs1NDQsNyBAQAogCQlwczFfaW4yID0gcHMwX2luMjsKIAogCWlmICghKHNjYWxhciAmIFNDQUxBUl9OT19QUzEpKQotCQlmdW5jKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmcXByW3JlZ19vdXRdLCAmcHMxX2luMSwgJnBzMV9pbjIsICZwczFfaW4zKTsKKwkJZnVuYygmdmNwdS0+YXJjaC5mcC5mcHNjciwgJnFwcltyZWdfb3V0XSwgJnBzMV9pbjEsICZwczFfaW4yLCAmcHMxX2luMyk7CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiUFMzIHBzMSAtPiBmKDB4JXgsIDB4JXgsIDB4JXgpID0gMHgleFxuIiwKIAkJCSAgcHMxX2luMSwgcHMxX2luMiwgcHMxX2luMywgcXByW3JlZ19vdXRdKTsKQEAgLTU2MSw3ICs1NjAsNiBAQAogCQkJCQkJIHUzMiAqc3JjMikpCiB7CiAJdTMyICpxcHIgPSB2Y3B1LT5hcmNoLnFwcjsKLQl1NjQgKmZwciA9IHZjcHUtPmFyY2guZnByOwogCXUzMiBwczBfb3V0OwogCXUzMiBwczBfaW4xLCBwczBfaW4yOwogCXUzMiBwczFfb3V0OwpAQCAtNTcxLDIwICs1NjksMjAgQEAKIAlXQVJOX09OKHJjKTsKIAogCS8qIFBTMCAqLwotCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4xXSwgJnBzMF9pbjEpOworCWt2bV9jdnRfZGYoJlZDUFVfRlBSKHZjcHUsIHJlZ19pbjEpLCAmcHMwX2luMSk7CiAKIAlpZiAoc2NhbGFyICYgU0NBTEFSX0xPVykKIAkJcHMwX2luMiA9IHFwcltyZWdfaW4yXTsKIAllbHNlCi0JCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4yXSwgJnBzMF9pbjIpOworCQlrdm1fY3Z0X2RmKCZWQ1BVX0ZQUih2Y3B1LCByZWdfaW4yKSwgJnBzMF9pbjIpOwogCi0JZnVuYygmdmNwdS0+YXJjaC5mcHNjciwgJnBzMF9vdXQsICZwczBfaW4xLCAmcHMwX2luMik7CisJZnVuYygmdmNwdS0+YXJjaC5mcC5mcHNjciwgJnBzMF9vdXQsICZwczBfaW4xLCAmcHMwX2luMik7CiAKIAlpZiAoIShzY2FsYXIgJiBTQ0FMQVJfTk9fUFMwKSkgewogCQlkcHJpbnRrKEtFUk5fSU5GTyAiUFMyIHBzMCAtPiBmKDB4JXgsIDB4JXgpID0gMHgleFxuIiwKIAkJCQkgIHBzMF9pbjEsIHBzMF9pbjIsIHBzMF9vdXQpOwogCi0JCWt2bV9jdnRfZmQoJnBzMF9vdXQsICZmcHJbcmVnX291dF0pOworCQlrdm1fY3Z0X2ZkKCZwczBfb3V0LCAmVkNQVV9GUFIodmNwdSwgcmVnX291dCkpOwogCX0KIAogCS8qIFBTMSAqLwpAQCAtNTk0LDcgKzU5Miw3IEBACiAJaWYgKHNjYWxhciAmIFNDQUxBUl9ISUdIKQogCQlwczFfaW4yID0gcHMwX2luMjsKIAotCWZ1bmMoJnZjcHUtPmFyY2guZnBzY3IsICZwczFfb3V0LCAmcHMxX2luMSwgJnBzMV9pbjIpOworCWZ1bmMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZwczFfb3V0LCAmcHMxX2luMSwgJnBzMV9pbjIpOwogCiAJaWYgKCEoc2NhbGFyICYgU0NBTEFSX05PX1BTMSkpIHsKIAkJcXByW3JlZ19vdXRdID0gcHMxX291dDsKQEAgLTYxMiw3ICs2MTAsNiBAQAogCQkJCQkJIHUzMiAqZHN0LCB1MzIgKnNyYzEpKQogewogCXUzMiAqcXByID0gdmNwdS0+YXJjaC5xcHI7Ci0JdTY0ICpmcHIgPSB2Y3B1LT5hcmNoLmZwcjsKIAl1MzIgcHMwX291dCwgcHMwX2luOwogCXUzMiBwczFfaW47CiAKQEAgLTYyMCwxNyArNjE3LDE3IEBACiAJV0FSTl9PTihyYyk7CiAKIAkvKiBQUzAgKi8KLQlrdm1fY3Z0X2RmKCZmcHJbcmVnX2luXSwgJnBzMF9pbik7Ci0JZnVuYygmdmNwdS0+YXJjaC5mcHNjciwgJnBzMF9vdXQsICZwczBfaW4pOworCWt2bV9jdnRfZGYoJlZDUFVfRlBSKHZjcHUsIHJlZ19pbiksICZwczBfaW4pOworCWZ1bmMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZwczBfb3V0LCAmcHMwX2luKTsKIAogCWRwcmludGsoS0VSTl9JTkZPICJQUzEgcHMwIC0+IGYoMHgleCkgPSAweCV4XG4iLAogCQkJICBwczBfaW4sIHBzMF9vdXQpOwogCi0Ja3ZtX2N2dF9mZCgmcHMwX291dCwgJmZwcltyZWdfb3V0XSk7CisJa3ZtX2N2dF9mZCgmcHMwX291dCwgJlZDUFVfRlBSKHZjcHUsIHJlZ19vdXQpKTsKIAogCS8qIFBTMSAqLwogCXBzMV9pbiA9IHFwcltyZWdfaW5dOwotCWZ1bmMoJnZjcHUtPmFyY2guZnBzY3IsICZxcHJbcmVnX291dF0sICZwczFfaW4pOworCWZ1bmMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZxcHJbcmVnX291dF0sICZwczFfaW4pOwogCiAJZHByaW50ayhLRVJOX0lORk8gIlBTMSBwczEgLT4gZigweCV4KSA9IDB4JXhcbiIsCiAJCQkgIHBzMV9pbiwgcXByW3JlZ19vdXRdKTsKQEAgLTY0OSwxMCArNjQ2LDEwIEBACiAJaW50IGF4X3JjID0gaW5zdF9nZXRfZmllbGQoaW5zdCwgMjEsIDI1KTsKIAlzaG9ydCBmdWxsX2QgPSBpbnN0X2dldF9maWVsZChpbnN0LCAxNiwgMzEpOwogCi0JdTY0ICpmcHJfZCA9ICZ2Y3B1LT5hcmNoLmZwcltheF9yZF07Ci0JdTY0ICpmcHJfYSA9ICZ2Y3B1LT5hcmNoLmZwcltheF9yYV07Ci0JdTY0ICpmcHJfYiA9ICZ2Y3B1LT5hcmNoLmZwcltheF9yYl07Ci0JdTY0ICpmcHJfYyA9ICZ2Y3B1LT5hcmNoLmZwcltheF9yY107CisJdTY0ICpmcHJfZCA9ICZWQ1BVX0ZQUih2Y3B1LCBheF9yZCk7CisJdTY0ICpmcHJfYSA9ICZWQ1BVX0ZQUih2Y3B1LCBheF9yYSk7CisJdTY0ICpmcHJfYiA9ICZWQ1BVX0ZQUih2Y3B1LCBheF9yYik7CisJdTY0ICpmcHJfYyA9ICZWQ1BVX0ZQUih2Y3B1LCBheF9yYyk7CiAKIAlib29sIHJjb21wID0gKGluc3QgJiAxKSA/IHRydWUgOiBmYWxzZTsKIAl1MzIgY3IgPSBrdm1wcGNfZ2V0X2NyKHZjcHUpOwpAQCAtNjc0LDExICs2NzEsMTEgQEAKIAkvKiBEbyB3ZSBuZWVkIHRvIGNsZWFyIEZFMCAvIEZFMSBoZXJlPyBEb24ndCB0aGluayBzby4gKi8KIAogI2lmZGVmIERFQlVHCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC5mcHIpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmZwLmZwcik7IGkrKykgewogCQl1MzIgZjsKLQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbaV0sICZmKTsKKwkJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgaSksICZmKTsKIAkJZHByaW50ayhLRVJOX0lORk8gIkZQUlslZF0gPSAweCV4IC8gMHglbGx4ICAgIFFQUlslZF0gPSAweCV4XG4iLAotCQkJaSwgZiwgdmNwdS0+YXJjaC5mcHJbaV0sIGksIHZjcHUtPmFyY2gucXByW2ldKTsKKwkJCWksIGYsIFZDUFVfRlBSKHZjcHUsIGkpLCBpLCB2Y3B1LT5hcmNoLnFwcltpXSk7CiAJfQogI2VuZGlmCiAKQEAgLTc2NCw4ICs3NjEsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBPUF80WF9QU19ORUc6Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gPSB2Y3B1LT5hcmNoLmZwcltheF9yYl07Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gXj0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gVkNQVV9GUFIodmNwdSwgYXhfcmIpOworCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpIF49IDB4ODAwMDAwMDAwMDAwMDAwMFVMTDsKIAkJCXZjcHUtPmFyY2gucXByW2F4X3JkXSA9IHZjcHUtPmFyY2gucXByW2F4X3JiXTsKIAkJCXZjcHUtPmFyY2gucXByW2F4X3JkXSBePSAweDgwMDAwMDAwOwogCQkJYnJlYWs7CkBAIC03NzUsNyArNzcyLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE9QXzRYX1BTX01SOgogCQkJV0FSTl9PTihyY29tcCk7Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gPSB2Y3B1LT5hcmNoLmZwcltheF9yYl07CisJCQlWQ1BVX0ZQUih2Y3B1LCBheF9yZCkgPSBWQ1BVX0ZQUih2Y3B1LCBheF9yYik7CiAJCQl2Y3B1LT5hcmNoLnFwcltheF9yZF0gPSB2Y3B1LT5hcmNoLnFwcltheF9yYl07CiAJCQlicmVhazsKIAkJY2FzZSBPUF80WF9QU19DTVBPMToKQEAgLTc4NCw0NCArNzgxLDQ0IEBACiAJCQlicmVhazsKIAkJY2FzZSBPUF80WF9QU19OQUJTOgogCQkJV0FSTl9PTihyY29tcCk7Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gPSB2Y3B1LT5hcmNoLmZwcltheF9yYl07Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gfD0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gVkNQVV9GUFIodmNwdSwgYXhfcmIpOworCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpIHw9IDB4ODAwMDAwMDAwMDAwMDAwMFVMTDsKIAkJCXZjcHUtPmFyY2gucXByW2F4X3JkXSA9IHZjcHUtPmFyY2gucXByW2F4X3JiXTsKIAkJCXZjcHUtPmFyY2gucXByW2F4X3JkXSB8PSAweDgwMDAwMDAwOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfQUJTOgogCQkJV0FSTl9PTihyY29tcCk7Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gPSB2Y3B1LT5hcmNoLmZwcltheF9yYl07Ci0JCQl2Y3B1LT5hcmNoLmZwcltheF9yZF0gJj0gfjB4ODAwMDAwMDAwMDAwMDAwMFVMTDsKKwkJCVZDUFVfRlBSKHZjcHUsIGF4X3JkKSA9IFZDUFVfRlBSKHZjcHUsIGF4X3JiKTsKKwkJCVZDUFVfRlBSKHZjcHUsIGF4X3JkKSAmPSB+MHg4MDAwMDAwMDAwMDAwMDAwVUxMOwogCQkJdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmJdOwogCQkJdmNwdS0+YXJjaC5xcHJbYXhfcmRdICY9IH4weDgwMDAwMDAwOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UwMDoKIAkJCVdBUk5fT04ocmNvbXApOwotCQkJdmNwdS0+YXJjaC5mcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5mcHJbYXhfcmFdOwotCQkJLyogdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5mcHJbYXhfcmJdOyAqLwotCQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAorCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gVkNQVV9GUFIodmNwdSwgYXhfcmEpOworCQkJLyogdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gVkNQVV9GUFIodmNwdSwgYXhfcmIpOyAqLworCQkJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgYXhfcmIpLAogCQkJCSAgICZ2Y3B1LT5hcmNoLnFwcltheF9yZF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UwMToKIAkJCVdBUk5fT04ocmNvbXApOwotCQkJdmNwdS0+YXJjaC5mcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5mcHJbYXhfcmFdOworCQkJVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gVkNQVV9GUFIodmNwdSwgYXhfcmEpOwogCQkJdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmJdOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UxMDoKIAkJCVdBUk5fT04ocmNvbXApOwotCQkJLyogdmNwdS0+YXJjaC5mcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmFdOyAqLworCQkJLyogVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gdmNwdS0+YXJjaC5xcHJbYXhfcmFdOyAqLwogCQkJa3ZtX2N2dF9mZCgmdmNwdS0+YXJjaC5xcHJbYXhfcmFdLAotCQkJCSAgICZ2Y3B1LT5hcmNoLmZwcltheF9yZF0pOwotCQkJLyogdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5mcHJbYXhfcmJdOyAqLwotCQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAorCQkJCSAgICZWQ1BVX0ZQUih2Y3B1LCBheF9yZCkpOworCQkJLyogdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gVkNQVV9GUFIodmNwdSwgYXhfcmIpOyAqLworCQkJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgYXhfcmIpLAogCQkJCSAgICZ2Y3B1LT5hcmNoLnFwcltheF9yZF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UxMToKIAkJCVdBUk5fT04ocmNvbXApOwotCQkJLyogdmNwdS0+YXJjaC5mcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmFdOyAqLworCQkJLyogVkNQVV9GUFIodmNwdSwgYXhfcmQpID0gdmNwdS0+YXJjaC5xcHJbYXhfcmFdOyAqLwogCQkJa3ZtX2N2dF9mZCgmdmNwdS0+YXJjaC5xcHJbYXhfcmFdLAotCQkJCSAgICZ2Y3B1LT5hcmNoLmZwcltheF9yZF0pOworCQkJCSAgICZWQ1BVX0ZQUih2Y3B1LCBheF9yZCkpOwogCQkJdmNwdS0+YXJjaC5xcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmJdOwogCQkJYnJlYWs7CiAJCX0KQEAgLTg1Niw3ICs4NTMsNyBAQAogCQljYXNlIE9QXzRBX1BTX1NVTTE6CiAJCQllbXVsYXRlZCA9IGt2bXBwY19wc190d29faW4odmNwdSwgcmNvbXAsIGF4X3JkLAogCQkJCQlheF9yYiwgYXhfcmEsIFNDQUxBUl9OT19QUzAgfCBTQ0FMQVJfSElHSCwgZnBzX2ZhZGRzKTsKLQkJCXZjcHUtPmFyY2guZnByW2F4X3JkXSA9IHZjcHUtPmFyY2guZnByW2F4X3JjXTsKKwkJCVZDUFVfRlBSKHZjcHUsIGF4X3JkKSA9IFZDUFVfRlBSKHZjcHUsIGF4X3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzRBX1BTX1NVTTA6CiAJCQllbXVsYXRlZCA9IGt2bXBwY19wc190d29faW4odmNwdSwgcmNvbXAsIGF4X3JkLApAQCAtMTEwNiw0NSArMTEwMyw0NSBAQAogCWNhc2UgNTk6CiAJCXN3aXRjaCAoaW5zdF9nZXRfZmllbGQoaW5zdCwgMjEsIDMwKSkgewogCQljYXNlIE9QXzU5X0ZBRERTOgotCQkJZnBkX2ZhZGRzKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOworCQkJZnBkX2ZhZGRzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOwogCQkJa3ZtcHBjX3N5bmNfcXByKHZjcHUsIGF4X3JkKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzU5X0ZTVUJTOgotCQkJZnBkX2ZzdWJzKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOworCQkJZnBkX2ZzdWJzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOwogCQkJa3ZtcHBjX3N5bmNfcXByKHZjcHUsIGF4X3JkKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzU5X0ZESVZTOgotCQkJZnBkX2ZkaXZzKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOworCQkJZnBkX2ZkaXZzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOwogCQkJa3ZtcHBjX3N5bmNfcXByKHZjcHUsIGF4X3JkKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzU5X0ZSRVM6Ci0JCQlmcGRfZnJlcygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOworCQkJZnBkX2ZyZXMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9iKTsKIAkJCWt2bXBwY19zeW5jX3Fwcih2Y3B1LCBheF9yZCk7CiAJCQlicmVhazsKIAkJY2FzZSBPUF81OV9GUlNRUlRFUzoKLQkJCWZwZF9mcnNxcnRlcygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOworCQkJZnBkX2Zyc3FydGVzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYik7CiAJCQlrdm1wcGNfc3luY19xcHIodmNwdSwgYXhfcmQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3dpdGNoIChpbnN0X2dldF9maWVsZChpbnN0LCAyNiwgMzApKSB7CiAJCWNhc2UgT1BfNTlfRk1VTFM6Ci0JCQlmcGRfZm11bHMoJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYyk7CisJCQlmcGRfZm11bHMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYyk7CiAJCQlrdm1wcGNfc3luY19xcHIodmNwdSwgYXhfcmQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNTlfRk1TVUJTOgotCQkJZnBkX2Ztc3VicygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9jLCBmcHJfYik7CisJCQlmcGRfZm1zdWJzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKIAkJCWt2bXBwY19zeW5jX3Fwcih2Y3B1LCBheF9yZCk7CiAJCQlicmVhazsKIAkJY2FzZSBPUF81OV9GTUFERFM6Ci0JCQlmcGRfZm1hZGRzKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKKwkJCWZwZF9mbWFkZHMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYywgZnByX2IpOwogCQkJa3ZtcHBjX3N5bmNfcXByKHZjcHUsIGF4X3JkKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzU5X0ZOTVNVQlM6Ci0JCQlmcGRfZm5tc3VicygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9jLCBmcHJfYik7CisJCQlmcGRfZm5tc3VicygmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9jLCBmcHJfYik7CiAJCQlrdm1wcGNfc3luY19xcHIodmNwdSwgYXhfcmQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNTlfRk5NQUREUzoKLQkJCWZwZF9mbm1hZGRzKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKKwkJCWZwZF9mbm1hZGRzKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKIAkJCWt2bXBwY19zeW5jX3Fwcih2Y3B1LCBheF9yZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTE1OSwxMiArMTE1NiwxMiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfTUZGUzoKIAkJCS8qIFhYWCBtaXNzaW5nIENSICovCi0JCQkqZnByX2QgPSB2Y3B1LT5hcmNoLmZwc2NyOworCQkJKmZwcl9kID0gdmNwdS0+YXJjaC5mcC5mcHNjcjsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX01URlNGOgogCQkJLyogWFhYIG1pc3NpbmcgZm0gYml0cyAqLwogCQkJLyogWFhYIG1pc3NpbmcgQ1IgKi8KLQkJCXZjcHUtPmFyY2guZnBzY3IgPSAqZnByX2I7CisJCQl2Y3B1LT5hcmNoLmZwLmZwc2NyID0gKmZwcl9iOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRkNNUFU6CiAJCXsKQEAgLTExNzIsNyArMTE2OSw3IEBACiAJCQl1MzIgY3IwX21hc2sgPSAweGYwMDAwMDAwOwogCQkJdTMyIGNyX3NoaWZ0ID0gaW5zdF9nZXRfZmllbGQoaW5zdCwgNiwgOCkgKiA0OwogCi0JCQlmcGRfZmNtcHUoJnZjcHUtPmFyY2guZnBzY3IsICZ0bXBfY3IsIGZwcl9hLCBmcHJfYik7CisJCQlmcGRfZmNtcHUoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZ0bXBfY3IsIGZwcl9hLCBmcHJfYik7CiAJCQljciAmPSB+KGNyMF9tYXNrID4+IGNyX3NoaWZ0KTsKIAkJCWNyIHw9IChjciAmIGNyMF9tYXNrKSA+PiBjcl9zaGlmdDsKIAkJCWJyZWFrOwpAQCAtMTE4Myw0MCArMTE4MCw0MCBAQAogCQkJdTMyIGNyMF9tYXNrID0gMHhmMDAwMDAwMDsKIAkJCXUzMiBjcl9zaGlmdCA9IGluc3RfZ2V0X2ZpZWxkKGluc3QsIDYsIDgpICogNDsKIAotCQkJZnBkX2ZjbXBvKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmdG1wX2NyLCBmcHJfYSwgZnByX2IpOworCQkJZnBkX2ZjbXBvKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmdG1wX2NyLCBmcHJfYSwgZnByX2IpOwogCQkJY3IgJj0gfihjcjBfbWFzayA+PiBjcl9zaGlmdCk7CiAJCQljciB8PSAoY3IgJiBjcjBfbWFzaykgPj4gY3Jfc2hpZnQ7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIE9QXzYzX0ZORUc6Ci0JCQlmcGRfZm5lZygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOworCQkJZnBkX2ZuZWcoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZNUjoKIAkJCSpmcHJfZCA9ICpmcHJfYjsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZBQlM6Ci0JCQlmcGRfZmFicygmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOworCQkJZnBkX2ZhYnMoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZDUFNHTjoKLQkJCWZwZF9mY3BzZ24oJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYik7CisJCQlmcGRfZmNwc2duKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRkRJVjoKLQkJCWZwZF9mZGl2KCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOworCQkJZnBkX2ZkaXYoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYik7CiAJCQlicmVhazsKIAkJY2FzZSBPUF82M19GQUREOgotCQkJZnBkX2ZhZGQoJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYik7CisJCQlmcGRfZmFkZCgmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZTVUI6Ci0JCQlmcGRfZnN1YigmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9iKTsKKwkJCWZwZF9mc3ViKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRkNUSVc6Ci0JCQlmcGRfZmN0aXcoJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9iKTsKKwkJCWZwZF9mY3RpdygmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRkNUSVdaOgotCQkJZnBkX2ZjdGl3eigmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOworCQkJZnBkX2ZjdGl3eigmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRlJTUDoKLQkJCWZwZF9mcnNwKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYik7CisJCQlmcGRfZnJzcCgmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2IpOwogCQkJa3ZtcHBjX3N5bmNfcXByKHZjcHUsIGF4X3JkKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZSU1FSVEU6CkBAIC0xMjI0LDM5ICsxMjIxLDM5IEBACiAJCQlkb3VibGUgb25lID0gMS4wZjsKIAogCQkJLyogZkQgPSBzcXJ0KGZCKSAqLwotCQkJZnBkX2ZzcXJ0KCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYik7CisJCQlmcGRfZnNxcnQoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9iKTsKIAkJCS8qIGZEID0gMS4wZiAvIGZEICovCi0JCQlmcGRfZmRpdigmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgKHU2NCopJm9uZSwgZnByX2QpOworCQkJZnBkX2ZkaXYoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsICh1NjQqKSZvbmUsIGZwcl9kKTsKIAkJCWJyZWFrOwogCQl9CiAJCX0KIAkJc3dpdGNoIChpbnN0X2dldF9maWVsZChpbnN0LCAyNiwgMzApKSB7CiAJCWNhc2UgT1BfNjNfRk1VTDoKLQkJCWZwZF9mbXVsKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MpOworCQkJZnBkX2ZtdWwoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUF82M19GU0VMOgotCQkJZnBkX2ZzZWwoJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYywgZnByX2IpOworCQkJZnBkX2ZzZWwoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYywgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRk1TVUI6Ci0JCQlmcGRfZm1zdWIoJnZjcHUtPmFyY2guZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYywgZnByX2IpOworCQkJZnBkX2Ztc3ViKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QXzYzX0ZNQUREOgotCQkJZnBkX2ZtYWRkKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKKwkJCWZwZF9mbWFkZCgmdmNwdS0+YXJjaC5mcC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9jLCBmcHJfYik7CiAJCQlicmVhazsKIAkJY2FzZSBPUF82M19GTk1TVUI6Ci0JCQlmcGRfZm5tc3ViKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKKwkJCWZwZF9mbm1zdWIoJnZjcHUtPmFyY2guZnAuZnBzY3IsICZjciwgZnByX2QsIGZwcl9hLCBmcHJfYywgZnByX2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNjNfRk5NQUREOgotCQkJZnBkX2ZubWFkZCgmdmNwdS0+YXJjaC5mcHNjciwgJmNyLCBmcHJfZCwgZnByX2EsIGZwcl9jLCBmcHJfYik7CisJCQlmcGRfZm5tYWRkKCZ2Y3B1LT5hcmNoLmZwLmZwc2NyLCAmY3IsIGZwcl9kLCBmcHJfYSwgZnByX2MsIGZwcl9iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCX0KIAogI2lmZGVmIERFQlVHCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC5mcHIpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmZwLmZwcik7IGkrKykgewogCQl1MzIgZjsKLQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbaV0sICZmKTsKKwkJa3ZtX2N2dF9kZigmVkNQVV9GUFIodmNwdSwgaSksICZmKTsKIAkJZHByaW50ayhLRVJOX0lORk8gIkZQUlslZF0gPSAweCV4XG4iLCBpLCBmKTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wci5jCmluZGV4IDViOWU5MDYuLmM1YzA1MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAjaW5jbHVkZSAiYm9vazNzLmgiCiAKQEAgLTU2NiwxMiArNTY3LDYgQEAKIHZvaWQga3ZtcHBjX2dpdmV1cF9leHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBtc3IpCiB7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmY3VycmVudC0+dGhyZWFkOwotCXU2NCAqdmNwdV9mcHIgPSB2Y3B1LT5hcmNoLmZwcjsKLSNpZmRlZiBDT05GSUdfVlNYCi0JdTY0ICp2Y3B1X3ZzeCA9IHZjcHUtPmFyY2gudnNyOwotI2VuZGlmCi0JdTY0ICp0aHJlYWRfZnByID0gJnQtPmZwX3N0YXRlLmZwclswXVswXTsKLQlpbnQgaTsKIAogCS8qCiAJICogVlNYIGluc3RydWN0aW9ucyBjYW4gYWNjZXNzIEZQIGFuZCB2ZWN0b3IgcmVnaXN0ZXJzLCBzbyBpZgpAQCAtNTk0LDI2ICs1ODksMTYgQEAKIAkJICogYm90aCB0aGUgdHJhZGl0aW9uYWwgRlAgcmVnaXN0ZXJzIGFuZCB0aGUgYWRkZWQgVlNYCiAJCSAqIHJlZ2lzdGVycyBpbnRvIHRocmVhZC5mcF9zdGF0ZS5mcHJbXS4KIAkJICovCi0JCWlmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKQorCQlpZiAodC0+cmVncy0+bXNyICYgTVNSX0ZQKQogCQkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC5mcHIpOyBpKyspCi0JCQl2Y3B1X2ZwcltpXSA9IHRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKV07Ci0KLQkJdmNwdS0+YXJjaC5mcHNjciA9IHQtPmZwX3N0YXRlLmZwc2NyOwotCi0jaWZkZWYgQ09ORklHX1ZTWAotCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVlNYKSkKLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHUtPmFyY2gudnNyKSAvIDI7IGkrKykKLQkJCQl2Y3B1X3ZzeFtpXSA9IHRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKSArIDFdOwotI2VuZGlmCisJCXQtPmZwX3NhdmVfYXJlYSA9IE5VTEw7CiAJfQogCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIAlpZiAobXNyICYgTVNSX1ZFQykgewogCQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpCiAJCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKLQkJbWVtY3B5KHZjcHUtPmFyY2gudnIsIHQtPnZyX3N0YXRlLnZyLCBzaXplb2YodmNwdS0+YXJjaC52cikpOwotCQl2Y3B1LT5hcmNoLnZzY3IgPSB0LT52cl9zdGF0ZS52c2NyOworCQl0LT52cl9zYXZlX2FyZWEgPSBOVUxMOwogCX0KICNlbmRpZgogCkBAIC02NjEsMTIgKzY0Niw2IEBACiAJCQkgICAgIHVsb25nIG1zcikKIHsKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7Ci0JdTY0ICp2Y3B1X2ZwciA9IHZjcHUtPmFyY2guZnByOwotI2lmZGVmIENPTkZJR19WU1gKLQl1NjQgKnZjcHVfdnN4ID0gdmNwdS0+YXJjaC52c3I7Ci0jZW5kaWYKLQl1NjQgKnRocmVhZF9mcHIgPSAmdC0+ZnBfc3RhdGUuZnByWzBdWzBdOwotCWludCBpOwogCiAJLyogV2hlbiB3ZSBoYXZlIHBhaXJlZCBzaW5nbGVzLCB3ZSBlbXVsYXRlIGluIHNvZnR3YXJlICovCiAJaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1BBSVJFRF9TSU5HTEUpCkBAIC03MDQsMjcgKzY4MywyMCBAQAogI2VuZGlmCiAKIAlpZiAobXNyICYgTVNSX0ZQKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHUtPmFyY2guZnByKTsgaSsrKQotCQkJdGhyZWFkX2ZwcltnZXRfZnByX2luZGV4KGkpXSA9IHZjcHVfZnByW2ldOwotI2lmZGVmIENPTkZJR19WU1gKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC52c3IpIC8gMjsgaSsrKQotCQkJdGhyZWFkX2ZwcltnZXRfZnByX2luZGV4KGkpICsgMV0gPSB2Y3B1X3ZzeFtpXTsKLSNlbmRpZgotCQl0LT5mcF9zdGF0ZS5mcHNjciA9IHZjcHUtPmFyY2guZnBzY3I7Ci0JCXQtPmZwZXhjX21vZGUgPSAwOwotCQlrdm1wcGNfbG9hZF91cF9mcHUoKTsKKwkJZW5hYmxlX2tlcm5lbF9mcCgpOworCQlsb2FkX2ZwX3N0YXRlKCZ2Y3B1LT5hcmNoLmZwKTsKKwkJdC0+ZnBfc2F2ZV9hcmVhID0gJnZjcHUtPmFyY2guZnA7CiAJfQogCiAJaWYgKG1zciAmIE1TUl9WRUMpIHsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwotCQltZW1jcHkodC0+dnJfc3RhdGUudnIsIHZjcHUtPmFyY2gudnIsIHNpemVvZih2Y3B1LT5hcmNoLnZyKSk7Ci0JCXQtPnZyX3N0YXRlLnZzY3IgPSB2Y3B1LT5hcmNoLnZzY3I7Ci0JCXQtPnZyc2F2ZSA9IC0xOwotCQlrdm1wcGNfbG9hZF91cF9hbHRpdmVjKCk7CisJCWVuYWJsZV9rZXJuZWxfYWx0aXZlYygpOworCQlsb2FkX3ZyX3N0YXRlKCZ2Y3B1LT5hcmNoLnZyKTsKKwkJdC0+dnJfc2F2ZV9hcmVhID0gJnZjcHUtPmFyY2gudnI7CiAjZW5kaWYKIAl9CiAKLQljdXJyZW50LT50aHJlYWQucmVncy0+bXNyIHw9IG1zcjsKKwl0LT5yZWdzLT5tc3IgfD0gbXNyOwogCXZjcHUtPmFyY2guZ3Vlc3Rfb3duZWRfZXh0IHw9IG1zcjsKIAlrdm1wcGNfcmVjYWxjX3NoYWRvd19tc3IodmNwdSk7CiAKQEAgLTc0MywxMSArNzE1LDE1IEBACiAJaWYgKCFsb3N0X2V4dCkKIAkJcmV0dXJuOwogCi0JaWYgKGxvc3RfZXh0ICYgTVNSX0ZQKQotCQlrdm1wcGNfbG9hZF91cF9mcHUoKTsKKwlpZiAobG9zdF9leHQgJiBNU1JfRlApIHsKKwkJZW5hYmxlX2tlcm5lbF9mcCgpOworCQlsb2FkX2ZwX3N0YXRlKCZ2Y3B1LT5hcmNoLmZwKTsKKwl9CiAjaWZkZWYgQ09ORklHX0FMVElWRUMKLQlpZiAobG9zdF9leHQgJiBNU1JfVkVDKQotCQlrdm1wcGNfbG9hZF91cF9hbHRpdmVjKCk7CisJaWYgKGxvc3RfZXh0ICYgTVNSX1ZFQykgeworCQllbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKwkJbG9hZF92cl9zdGF0ZSgmdmNwdS0+YXJjaC52cik7CisJfQogI2VuZGlmCiAJY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciB8PSBsb3N0X2V4dDsKIH0KQEAgLTg3Myw2ICs4NDksNyBAQAogCS8qIFdlJ3JlIGdvb2Qgb24gdGhlc2UgLSB0aGUgaG9zdCBtZXJlbHkgd2FudGVkIHRvIGdldCBvdXIgYXR0ZW50aW9uICovCiAJY2FzZSBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSOgogCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUjoKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfRE9PUkJFTEw6CiAJCXZjcHUtPnN0YXQuZGVjX2V4aXRzKys7CiAJCXIgPSBSRVNVTUVfR1VFU1Q7CiAJCWJyZWFrOwpAQCAtMTA0NSwxNCArMTAyMiwxNCBAQAogCQkgKiBhbmQgaWYgd2UgcmVhbGx5IGRpZCB0aW1lIHRoaW5ncyBzbyBiYWRseSwgdGhlbiB3ZSBqdXN0IGV4aXQKIAkJICogYWdhaW4gZHVlIHRvIGEgaG9zdCBleHRlcm5hbCBpbnRlcnJ1cHQuCiAJCSAqLwotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQlzID0ga3ZtcHBjX3ByZXBhcmVfdG9fZW50ZXIodmNwdSk7Ci0JCWlmIChzIDw9IDApIHsKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJaWYgKHMgPD0gMCkKIAkJCXIgPSBzOwotCQl9IGVsc2UgeworCQllbHNlIHsKKwkJCS8qIGludGVycnVwdHMgbm93IGhhcmQtZGlzYWJsZWQgKi8KIAkJCWt2bXBwY19maXhfZWVfYmVmb3JlX2VudHJ5KCk7CiAJCX0KKwogCQlrdm1wcGNfaGFuZGxlX2xvc3RfZXh0KHZjcHUpOwogCX0KIApAQCAtMTEzMywxOSArMTExMCw2IEBACiAJY2FzZSBLVk1fUkVHX1BQQ19ISU9SOgogCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHRvX2Jvb2szcyh2Y3B1KS0+aGlvcik7CiAJCWJyZWFrOwotI2lmZGVmIENPTkZJR19WU1gKLQljYXNlIEtWTV9SRUdfUFBDX1ZTUjAgLi4uIEtWTV9SRUdfUFBDX1ZTUjMxOiB7Ci0JCWxvbmcgaW50IGkgPSBpZCAtIEtWTV9SRUdfUFBDX1ZTUjA7Ci0KLQkJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9WU1gpKSB7Ci0JCQlyID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmFsLT52c3h2YWxbMF0gPSB2Y3B1LT5hcmNoLmZwcltpXTsKLQkJdmFsLT52c3h2YWxbMV0gPSB2Y3B1LT5hcmNoLnZzcltpXTsKLQkJYnJlYWs7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19WU1ggKi8KIAlkZWZhdWx0OgogCQlyID0gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0xMTY0LDE5ICsxMTI4LDYgQEAKIAkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQl0b19ib29rM3ModmNwdSktPmhpb3JfZXhwbGljaXQgPSB0cnVlOwogCQlicmVhazsKLSNpZmRlZiBDT05GSUdfVlNYCi0JY2FzZSBLVk1fUkVHX1BQQ19WU1IwIC4uLiBLVk1fUkVHX1BQQ19WU1IzMTogewotCQlsb25nIGludCBpID0gaWQgLSBLVk1fUkVHX1BQQ19WU1IwOwotCi0JCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVlNYKSkgewotCQkJciA9IC1FTlhJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCXZjcHUtPmFyY2guZnByW2ldID0gdmFsLT52c3h2YWxbMF07Ci0JCXZjcHUtPmFyY2gudnNyW2ldID0gdmFsLT52c3h2YWxbMV07Ci0JCWJyZWFrOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfVlNYICovCiAJZGVmYXVsdDoKIAkJciA9IC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMTI3NCwxNyArMTIyNSw5IEBACiBzdGF0aWMgaW50IGt2bXBwY192Y3B1X3J1bl9wcihzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCByZXQ7Ci0Jc3RydWN0IHRocmVhZF9mcF9zdGF0ZSBmcDsKLQlpbnQgZnBleGNfbW9kZTsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwotCXN0cnVjdCB0aHJlYWRfdnJfc3RhdGUgdnI7CiAJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3Zhcih2cnNhdmUpOwotCWludCB1c2VkX3ZyOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZTWAotCWludCB1c2VkX3ZzcjsKLSNlbmRpZgotCXVsb25nIGV4dF9tc3I7CiAKIAkvKiBDaGVjayBpZiB3ZSBjYW4gcnVuIHRoZSB2Y3B1IGF0IGFsbCAqLwogCWlmICghdmNwdS0+YXJjaC5zYW5lKSB7CkBAIC0xMjk5LDQwICsxMjQyLDI3IEBACiAJICogcmVhbGx5IGRpZCB0aW1lIHRoaW5ncyBzbyBiYWRseSwgdGhlbiB3ZSBqdXN0IGV4aXQgYWdhaW4gZHVlIHRvCiAJICogYSBob3N0IGV4dGVybmFsIGludGVycnVwdC4KIAkgKi8KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXJldCA9IGt2bXBwY19wcmVwYXJlX3RvX2VudGVyKHZjcHUpOwotCWlmIChyZXQgPD0gMCkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKHJldCA8PSAwKQogCQlnb3RvIG91dDsKLQl9CisJLyogaW50ZXJydXB0cyBub3cgaGFyZC1kaXNhYmxlZCAqLwogCi0JLyogU2F2ZSBGUFUgc3RhdGUgaW4gc3RhY2sgKi8KKwkvKiBTYXZlIEZQVSBzdGF0ZSBpbiB0aHJlYWRfc3RydWN0ICovCiAJaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApCiAJCWdpdmV1cF9mcHUoY3VycmVudCk7Ci0JZnAgPSBjdXJyZW50LT50aHJlYWQuZnBfc3RhdGU7Ci0JZnBleGNfbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlOwogCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKLQkvKiBTYXZlIEFsdGl2ZWMgc3RhdGUgaW4gc3RhY2sgKi8KLQl1c2VkX3ZyID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnI7Ci0JaWYgKHVzZWRfdnIpIHsKLQkJaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVkVDKQotCQkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7Ci0JCXZyID0gY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlOwotCQl2cnNhdmUgPSBjdXJyZW50LT50aHJlYWQudnJzYXZlOwotCX0KKwkvKiBTYXZlIEFsdGl2ZWMgc3RhdGUgaW4gdGhyZWFkX3N0cnVjdCAqLworCWlmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX1ZFQykKKwkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19WU1gKLQkvKiBTYXZlIFZTWCBzdGF0ZSBpbiBzdGFjayAqLwotCXVzZWRfdnNyID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyOwotCWlmICh1c2VkX3ZzciAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WU1gpKQorCS8qIFNhdmUgVlNYIHN0YXRlIGluIHRocmVhZF9zdHJ1Y3QgKi8KKwlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WU1gpCiAJCV9fZ2l2ZXVwX3ZzeChjdXJyZW50KTsKICNlbmRpZgogCi0JLyogUmVtZW1iZXIgdGhlIE1TUiB3aXRoIGRpc2FibGVkIGV4dGVuc2lvbnMgKi8KLQlleHRfbXNyID0gY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zcjsKLQogCS8qIFByZWxvYWQgRlBVIGlmIGl0J3MgZW5hYmxlZCAqLwogCWlmICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX0ZQKQogCQlrdm1wcGNfaGFuZGxlX2V4dCh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUwsIE1TUl9GUCk7CkBAIC0xMzQ3LDI1ICsxMjc3LDYgQEAKIAkvKiBNYWtlIHN1cmUgd2Ugc2F2ZSB0aGUgZ3Vlc3QgRlBVL0FsdGl2ZWMvVlNYIHN0YXRlICovCiAJa3ZtcHBjX2dpdmV1cF9leHQodmNwdSwgTVNSX0ZQIHwgTVNSX1ZFQyB8IE1TUl9WU1gpOwogCi0JY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciA9IGV4dF9tc3I7Ci0KLQkvKiBSZXN0b3JlIEZQVS9WU1ggc3RhdGUgZnJvbSBzdGFjayAqLwotCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZSA9IGZwOwotCWN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlID0gZnBleGNfbW9kZTsKLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JLyogUmVzdG9yZSBBbHRpdmVjIHN0YXRlIGZyb20gc3RhY2sgKi8KLQlpZiAodXNlZF92ciAmJiBjdXJyZW50LT50aHJlYWQudXNlZF92cikgewotCQljdXJyZW50LT50aHJlYWQudnJfc3RhdGUgPSB2cjsKLQkJY3VycmVudC0+dGhyZWFkLnZyc2F2ZSA9IHZyc2F2ZTsKLQl9Ci0JY3VycmVudC0+dGhyZWFkLnVzZWRfdnIgPSB1c2VkX3ZyOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVlNYCi0JY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyID0gdXNlZF92c3I7Ci0jZW5kaWYKLQogb3V0OgogCXZjcHUtPm1vZGUgPSBPVVRTSURFX0dVRVNUX01PREU7CiAJcmV0dXJuIHJldDsKQEAgLTE2MDYsNCArMTUxNyw2IEBACiBtb2R1bGVfZXhpdChrdm1wcGNfYm9vazNzX2V4aXRfcHIpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihLVk1fTUlOT1IpOworTU9EVUxFX0FMSUFTKCJkZXZuYW1lOmt2bSIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMKaW5kZXggYzNjNTIzMS4uOWVlYzY3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUwpAQCAtMTYyLDUxICsxNjIsNCBAQAogCW10c3JyMQlyNgogCVJGSQogCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKLSNkZWZpbmUgU1RBQ0tfTFIJSU5UX0ZSQU1FX1NJWkUrNAotCi0vKiBsb2FkX3VwX3h4eCBoYXZlIHRvIHJ1biB3aXRoIE1TUl9EUj0wIG9uIEJvb2szU18zMiAqLwotI2RlZmluZSBNU1JfRVhUX1NUQVJUCQkJCQkJXAotCVBQQ19TVEwJcjIwLCBfTklQKHIxKTsJCQkJCVwKLQltZm1zcglyMjA7CQkJCQkJXAotCUxPQURfUkVHX0lNTUVESUFURShyMywgTVNSX0RSfE1TUl9FRSk7CQkJXAotCWFuZGMJcjMscjIwLHIzOwkJLyogRGlzYWJsZSBEUixFRSAqLwlcCi0JbXRtc3IJcjM7CQkJCQkJXAotCXN5bmMKLQotI2RlZmluZSBNU1JfRVhUX0VORAkJCQkJCVwKLQltdG1zcglyMjA7CQkJLyogRW5hYmxlIERSLEVFICovCVwKLQlzeW5jOwkJCQkJCQlcCi0JUFBDX0xMCXIyMCwgX05JUChyMSkKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU182NCkKLSNkZWZpbmUgU1RBQ0tfTFIJX0xJTksKLSNkZWZpbmUgTVNSX0VYVF9TVEFSVAotI2RlZmluZSBNU1JfRVhUX0VORAotI2VuZGlmCi0KLS8qCi0gKiBBY3RpdmF0ZSBjdXJyZW50J3MgZXh0ZXJuYWwgZmVhdHVyZSAoRlBVL0FsdGl2ZWMvVlNYKQotICovCi0jZGVmaW5lIGRlZmluZV9sb2FkX3VwKHdoYXQpIAkJCQkJXAotCQkJCQkJCQlcCi1fR0xPQkFMKGt2bXBwY19sb2FkX3VwXyAjIyB3aGF0KTsJCQkJXAotCVBQQ19TVExVIHIxLCAtSU5UX0ZSQU1FX1NJWkUocjEpOwkJCVwKLQltZmxyCXIzOwkJCQkJCVwKLQlQUENfU1RMCXIzLCBTVEFDS19MUihyMSk7CQkJCVwKLQlNU1JfRVhUX1NUQVJUOwkJCQkJCVwKLQkJCQkJCQkJXAotCWJsCUZVTkMobG9hZF91cF8gIyMgd2hhdCk7CQkJCVwKLQkJCQkJCQkJXAotCU1TUl9FWFRfRU5EOwkJCQkJCVwKLQlQUENfTEwJcjMsIFNUQUNLX0xSKHIxKTsJCQkJXAotCW10bHIJcjM7CQkJCQkJXAotCWFkZGkJcjEsIHIxLCBJTlRfRlJBTUVfU0laRTsJCQkJXAotCWJscgotCi1kZWZpbmVfbG9hZF91cChmcHUpCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLWRlZmluZV9sb2FkX3VwKGFsdGl2ZWMpCi0jZW5kaWYKLQogI2luY2x1ZGUgImJvb2szc19zZWdtZW50LlMiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMKaW5kZXggYmM1MGM5Ny4uMWUwY2MyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfc2VnbWVudC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3NlZ21lbnQuUwpAQCAtMzYxLDYgKzM2MSw4IEBACiAJYmVxYQlCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCiAJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX1BFUkZNT04KIAliZXFhCUJPT0szU19JTlRFUlJVUFRfUEVSRk1PTgorCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9ET09SQkVMTAorCWJlcWEJQk9PSzNTX0lOVEVSUlVQVF9ET09SQkVMTAogCiAJUkZJCiBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2V4aXRfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfeGljcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfeGljcy5jCmluZGV4IDAyYTE3ZGMuLmQxYWNkMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc194aWNzLmMKQEAgLTEyNDYsOCArMTI0NiwxMCBAQAogCQlrdm0tPmFyY2gueGljcyA9IHhpY3M7CiAJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOwogCi0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWtmcmVlKHhpY3MpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXhpY3NfZGVidWdmc19pbml0KHhpY3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKaW5kZXggMDU5MWUwNS4uYWI2MjEwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYwpAQCAtNjQzLDcgKzY0Myw3IEBACiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CiAJCWNsZWFyX2JpdChLVk1fUkVRX1VOSEFMVCwgJnZjcHUtPnJlcXVlc3RzKTsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJaGFyZF9pcnFfZGlzYWJsZSgpOwogCiAJCWt2bXBwY19zZXRfZXhpdF90eXBlKHZjcHUsIEVNVUxBVEVEX01UTVNSV0VfRVhJVFMpOwogCQlyID0gMTsKQEAgLTY4MiwzNCArNjgyLDIyIEBACiB7CiAJaW50IHJldCwgczsKIAlzdHJ1Y3QgZGVidWdfcmVnIGRlYnVnOwotI2lmZGVmIENPTkZJR19QUENfRlBVCi0Jc3RydWN0IHRocmVhZF9mcF9zdGF0ZSBmcDsKLQlpbnQgZnBleGNfbW9kZTsKLSNlbmRpZgogCiAJaWYgKCF2Y3B1LT5hcmNoLnNhbmUpIHsKIAkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlzID0ga3ZtcHBjX3ByZXBhcmVfdG9fZW50ZXIodmNwdSk7CiAJaWYgKHMgPD0gMCkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXJldCA9IHM7CiAJCWdvdG8gb3V0OwogCX0KKwkvKiBpbnRlcnJ1cHRzIG5vdyBoYXJkLWRpc2FibGVkICovCiAKICNpZmRlZiBDT05GSUdfUFBDX0ZQVQogCS8qIFNhdmUgdXNlcnNwYWNlIEZQVSBzdGF0ZSBpbiBzdGFjayAqLwogCWVuYWJsZV9rZXJuZWxfZnAoKTsKLQlmcCA9IGN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZTsKLQlmcGV4Y19tb2RlID0gY3VycmVudC0+dGhyZWFkLmZwZXhjX21vZGU7Ci0KLQkvKiBSZXN0b3JlIGd1ZXN0IEZQVSBzdGF0ZSB0byB0aHJlYWQgKi8KLQltZW1jcHkoY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlLmZwciwgdmNwdS0+YXJjaC5mcHIsCi0JICAgICAgIHNpemVvZih2Y3B1LT5hcmNoLmZwcikpOwotCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IHZjcHUtPmFyY2guZnBzY3I7CiAKIAkvKgogCSAqIFNpbmNlIHdlIGNhbid0IHRyYXAgb24gTVNSX0ZQIGluIEdTLW1vZGUsIHdlIGNvbnNpZGVyIHRoZSBndWVzdApAQCAtNzI4LDYgKzcxNiw3IEBACiAJZGVidWcgPSBjdXJyZW50LT50aHJlYWQuZGVidWc7CiAJY3VycmVudC0+dGhyZWFkLmRlYnVnID0gdmNwdS0+YXJjaC5zaGFkb3dfZGJnX3JlZzsKIAorCXZjcHUtPmFyY2gucGdkaXIgPSBjdXJyZW50LT5tbS0+cGdkOwogCWt2bXBwY19maXhfZWVfYmVmb3JlX2VudHJ5KCk7CiAKIAlyZXQgPSBfX2t2bXBwY192Y3B1X3J1bihrdm1fcnVuLCB2Y3B1KTsKQEAgLTc0MywxNSArNzMyLDYgQEAKIAlrdm1wcGNfc2F2ZV9ndWVzdF9mcCh2Y3B1KTsKIAogCXZjcHUtPmZwdV9hY3RpdmUgPSAwOwotCi0JLyogU2F2ZSBndWVzdCBGUFUgc3RhdGUgZnJvbSB0aHJlYWQgKi8KLQltZW1jcHkodmNwdS0+YXJjaC5mcHIsIGN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZS5mcHIsCi0JICAgICAgIHNpemVvZih2Y3B1LT5hcmNoLmZwcikpOwotCXZjcHUtPmFyY2guZnBzY3IgPSBjdXJyZW50LT50aHJlYWQuZnBfc3RhdGUuZnBzY3I7Ci0KLQkvKiBSZXN0b3JlIHVzZXJzcGFjZSBGUFUgc3RhdGUgZnJvbSBzdGFjayAqLwotCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZSA9IGZwOwotCWN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlID0gZnBleGNfbW9kZTsKICNlbmRpZgogCiBvdXQ6CkBAIC04OTgsMTcgKzg3OCw2IEBACiAJaW50IHM7CiAJaW50IGlkeDsKIAotI2lmZGVmIENPTkZJR19QUEM2NAotCVdBUk5fT04obG9jYWxfcGFjYS0+aXJxX2hhcHBlbmVkICE9IDApOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIGVudGVyIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBpbiBoYXJkd2FyZSwgYnV0Ci0JICogd2UgbmVlZCB0byBjYWxsIGhhcmRfaXJxX2Rpc2FibGUgYW55d2F5IHRvIGVuc3VyZSB0aGF0Ci0JICogdGhlIHNvZnR3YXJlIHN0YXRlIGlzIGtlcHQgaW4gc3luYy4KLQkgKi8KLQloYXJkX2lycV9kaXNhYmxlKCk7Ci0KIAkvKiB1cGRhdGUgYmVmb3JlIGEgbmV3IGxhc3RfZXhpdF90eXBlIGlzIHJld3JpdHRlbiAqLwogCWt2bXBwY191cGRhdGVfdGltaW5nX3N0YXRzKHZjcHUpOwogCkBAIC0xMjE3LDEyICsxMTg2LDExIEBACiAJICogYXJlbid0IGFscmVhZHkgZXhpdGluZyB0byB1c2Vyc3BhY2UgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgogCSAqLwogCWlmICghKHIgJiBSRVNVTUVfSE9TVCkpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJcyA9IGt2bXBwY19wcmVwYXJlX3RvX2VudGVyKHZjcHUpOwotCQlpZiAocyA8PSAwKSB7Ci0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWlmIChzIDw9IDApCiAJCQlyID0gKHMgPDwgMikgfCBSRVNVTUVfSE9TVCB8IChyICYgUkVTVU1FX0ZMQUdfTlYpOwotCQl9IGVsc2UgeworCQllbHNlIHsKKwkJCS8qIGludGVycnVwdHMgbm93IGhhcmQtZGlzYWJsZWQgKi8KIAkJCWt2bXBwY19maXhfZWVfYmVmb3JlX2VudHJ5KCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmgKaW5kZXggMDliZmQ5Yi4uYjYzMmNkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuaApAQCAtMTM2LDcgKzEzNiw5IEBACiB7CiAjaWZkZWYgQ09ORklHX1BQQ19GUFUKIAlpZiAodmNwdS0+ZnB1X2FjdGl2ZSAmJiAhKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApKSB7Ci0JCWxvYWRfdXBfZnB1KCk7CisJCWVuYWJsZV9rZXJuZWxfZnAoKTsKKwkJbG9hZF9mcF9zdGF0ZSgmdmNwdS0+YXJjaC5mcCk7CisJCWN1cnJlbnQtPnRocmVhZC5mcF9zYXZlX2FyZWEgPSAmdmNwdS0+YXJjaC5mcDsKIAkJY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciB8PSBNU1JfRlA7CiAJfQogI2VuZGlmCkBAIC0xNTEsNiArMTUzLDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX0ZQVQogCWlmICh2Y3B1LT5mcHVfYWN0aXZlICYmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKSkKIAkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKKwljdXJyZW50LT50aHJlYWQuZnBfc2F2ZV9hcmVhID0gTlVMTDsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlaHZfaW50ZXJydXB0cy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZWh2X2ludGVycnVwdHMuUwppbmRleCBhMGQ2OTI5Li5lNDE4NWY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlaHZfaW50ZXJydXB0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2Vodl9pbnRlcnJ1cHRzLlMKQEAgLTMzLDYgKzMzLDggQEAKIAogI2lmZGVmIENPTkZJR182NEJJVAogI2luY2x1ZGUgPGFzbS9leGNlcHRpb24tNjRlLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgogI2Vsc2UKICNpbmNsdWRlICIuLi9rZXJuZWwvaGVhZF9ib29rZS5oIiAvKiBmb3IgVEhSRUFEX05PUk1TQVZFKCkgKi8KICNlbmRpZgpAQCAtNDY3LDYgKzQ2OSwxNSBAQAogCW10c3ByCVNQUk5fRVBDUiwgcjMKIAlpc3luYwogCisjaWZkZWYgQ09ORklHXzY0QklUCisJLyoKKwkgKiBXZSBlbnRlciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgaW4gaGFyZHdhcmUsIGJ1dAorCSAqIHdlIG5lZWQgdG8gY2FsbCBSRUNPTkNJTEVfSVJRX1NUQVRFIHRvIGVuc3VyZQorCSAqIHRoYXQgdGhlIHNvZnR3YXJlIHN0YXRlIGlzIGtlcHQgaW4gc3luYy4KKwkgKi8KKwlSRUNPTkNJTEVfSVJRX1NUQVRFKHIzLHI1KQorI2VuZGlmCisKIAkvKiBTd2l0Y2ggdG8ga2VybmVsIHN0YWNrIGFuZCBqdW1wIHRvIGhhbmRsZXIuICovCiAJUFBDX0xMCXIzLCBIT1NUX1JVTihyMSkKIAltcglyNSwgcjE0IC8qIGludG5vICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCmluZGV4IDQ5N2IxNDIuLjJlMDJlZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KQEAgLTU3MywzICs1NzUsNSBAQAogCiBtb2R1bGVfaW5pdChrdm1wcGNfZTUwMF9pbml0KTsKIG1vZHVsZV9leGl0KGt2bXBwY19lNTAwX2V4aXQpOworTU9EVUxFX0FMSUFTX01JU0NERVYoS1ZNX01JTk9SKTsKK01PRFVMRV9BTElBUygiZGV2bmFtZTprdm0iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5oIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmgKaW5kZXggNGZkOTY1MC4uYTMyNjE3OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmgKQEAgLTMxLDExICszMSwxMyBAQAogI2RlZmluZSBFNTAwX1RMQl9OVU0gICAyCiAKIC8qIGVudHJ5IGlzIG1hcHBlZCBzb21ld2hlcmUgaW4gaG9zdCBUTEIgKi8KLSNkZWZpbmUgRTUwMF9UTEJfVkFMSUQJCSgxIDw8IDApCisjZGVmaW5lIEU1MDBfVExCX1ZBTElECQkoMSA8PCAzMSkKIC8qIFRMQjEgZW50cnkgaXMgbWFwcGVkIGJ5IGhvc3QgVExCMSwgdHJhY2tlZCBieSBiaXRtYXBzICovCi0jZGVmaW5lIEU1MDBfVExCX0JJVE1BUAkJKDEgPDwgMSkKKyNkZWZpbmUgRTUwMF9UTEJfQklUTUFQCQkoMSA8PCAzMCkKIC8qIFRMQjEgZW50cnkgaXMgbWFwcGVkIGJ5IGhvc3QgVExCMCAqLwotI2RlZmluZSBFNTAwX1RMQl9UTEIwCQkoMSA8PCAyKQorI2RlZmluZSBFNTAwX1RMQl9UTEIwCQkoMSA8PCAyOSkKKy8qIGJpdHMgWzYtNV0gTUFTMl9YMSBhbmQgTUFTMl9YMCBhbmQgWzQtMF0gYml0cyBmb3IgV0lNR0UgKi8KKyNkZWZpbmUgRTUwMF9UTEJfTUFTMl9BVFRSCSgweDdmKQogCiBzdHJ1Y3QgdGxiZV9yZWYgewogCXBmbl90IHBmbjsJCS8qIHZhbGlkIG9ubHkgZm9yIFRMQjAsIGV4Y2VwdCBicmllZmx5ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmMKaW5kZXggZWJjYTZiOC4uNTA4NjBlOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfZTUwMF9kZWxpdmVyX3RsYl9taXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJdW5zaWduZWQgaW50IGVhZGRyLCBpbnQgYXMpCisJCWd2YV90IGVhZGRyLCBpbnQgYXMpCiB7CiAJc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCA9IHRvX2U1MDAodmNwdSk7CiAJdW5zaWduZWQgaW50IHZpY3RpbSwgdHNpemVkOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdV9ob3N0LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11X2hvc3QuYwppbmRleCBlY2YyMjQ3Li5kZDJjYzAzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11X2hvc3QuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11X2hvc3QuYwpAQCAtNjUsMTUgKzY1LDYgQEAKIAlyZXR1cm4gbWFzMzsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIodTMyIG1hczIsIGludCB1c2VybW9kZSkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JcmV0dXJuIChtYXMyICYgTUFTMl9BVFRSSUJfTUFTSykgfCBNQVMyX007Ci0jZWxzZQotCXJldHVybiBtYXMyICYgTUFTMl9BVFRSSUJfTUFTSzsKLSNlbmRpZgotfQotCiAvKgogICogd3JpdGluZyBzaGFkb3cgdGxiIGVudHJ5IHRvIGhvc3QgVExCCiAgKi8KQEAgLTIzMSwxNSArMjIyLDE1IEBACiAJCXJlZi0+ZmxhZ3MgJj0gfihFNTAwX1RMQl9UTEIwIHwgRTUwMF9UTEJfVkFMSUQpOwogCX0KIAotCS8qIEFscmVhZHkgaW52YWxpZGF0ZWQgaW4gYmV0d2VlbiAqLwotCWlmICghKHJlZi0+ZmxhZ3MgJiBFNTAwX1RMQl9WQUxJRCkpCi0JCXJldHVybjsKLQotCS8qIEd1ZXN0IHRsYmUgaXMgYmFja2VkIGJ5IGF0IG1vc3Qgb25lIGhvc3QgdGxiZSBwZXIgc2hhZG93IHBpZC4gKi8KLQlrdm1wcGNfZTUwMF90bGJpbF9vbmUodmNwdV9lNTAwLCBndGxiZSk7CisJLyoKKwkgKiBJZiBUTEIgZW50cnkgaXMgc3RpbGwgdmFsaWQgdGhlbiBpdCdzIGEgVExCMCBlbnRyeSwgYW5kIHRodXMKKwkgKiBiYWNrZWQgYnkgYXQgbW9zdCBvbmUgaG9zdCB0bGJlIHBlciBzaGFkb3cgcGlkCisJICovCisJaWYgKHJlZi0+ZmxhZ3MgJiBFNTAwX1RMQl9WQUxJRCkKKwkJa3ZtcHBjX2U1MDBfdGxiaWxfb25lKHZjcHVfZTUwMCwgZ3RsYmUpOwogCiAJLyogTWFyayB0aGUgVExCIGFzIG5vdCBiYWNrZWQgYnkgdGhlIGhvc3QgYW55bW9yZSAqLwotCXJlZi0+ZmxhZ3MgJj0gfkU1MDBfVExCX1ZBTElEOworCXJlZi0+ZmxhZ3MgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB0bGJlX2lzX3dyaXRhYmxlKHN0cnVjdCBrdm1fYm9vazNlXzIwNl90bGJfZW50cnkgKnRsYmUpCkBAIC0yNDksMTAgKzI0MCwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2U1MDBfcmVmX3NldHVwKHN0cnVjdCB0bGJlX3JlZiAqcmVmLAogCQkJCQkgc3RydWN0IGt2bV9ib29rM2VfMjA2X3RsYl9lbnRyeSAqZ3RsYmUsCi0JCQkJCSBwZm5fdCBwZm4pCisJCQkJCSBwZm5fdCBwZm4sIHVuc2lnbmVkIGludCB3aW1nKQogewogCXJlZi0+cGZuID0gcGZuOwotCXJlZi0+ZmxhZ3MgfD0gRTUwMF9UTEJfVkFMSUQ7CisJcmVmLT5mbGFncyA9IEU1MDBfVExCX1ZBTElEOworCisJLyogVXNlIGd1ZXN0IHN1cHBsaWVkIE1BUzJfRyBhbmQgTUFTMl9FICovCisJcmVmLT5mbGFncyB8PSAoZ3RsYmUtPm1hczIgJiBNQVMyX0FUVFJJQl9NQVNLKSB8IHdpbWc7CiAKIAkvKiBNYXJrIHRoZSBwYWdlIGFjY2Vzc2VkICovCiAJa3ZtX3NldF9wZm5fYWNjZXNzZWQocGZuKTsKQEAgLTMxNiw4ICszMTAsNyBAQAogCiAJLyogRm9yY2UgSVBST1Q9MCBmb3IgYWxsIGd1ZXN0IG1hcHBpbmdzLiAqLwogCXN0bGJlLT5tYXMxID0gTUFTMV9UU0laRSh0c2l6ZSkgfCBnZXRfdGxiX3N0cyhndGxiZSkgfCBNQVMxX1ZBTElEOwotCXN0bGJlLT5tYXMyID0gKGd2YWRkciAmIE1BUzJfRVBOKSB8Ci0JCSAgICAgIGU1MDBfc2hhZG93X21hczJfYXR0cmliKGd0bGJlLT5tYXMyLCBwcik7CisJc3RsYmUtPm1hczIgPSAoZ3ZhZGRyICYgTUFTMl9FUE4pIHwgKHJlZi0+ZmxhZ3MgJiBFNTAwX1RMQl9NQVMyX0FUVFIpOwogCXN0bGJlLT5tYXM3XzMgPSAoKHU2NClwZm4gPDwgUEFHRV9TSElGVCkgfAogCQkJZTUwMF9zaGFkb3dfbWFzM19hdHRyaWIoZ3RsYmUtPm1hczdfMywgcHIpOwogCkBAIC0zMzksNiArMzMyLDEwIEBACiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBtbXVfc2VxOwogCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHVfZTUwMC0+dmNwdS5rdm07CisJdW5zaWduZWQgbG9uZyB0c2l6ZV9wYWdlcyA9IDA7CisJcHRlX3QgKnB0ZXA7CisJdW5zaWduZWQgaW50IHdpbWcgPSAwOworCXBnZF90ICpwZ2RpcjsKIAogCS8qIHVzZWQgdG8gY2hlY2sgZm9yIGludmFsaWRhdGlvbnMgaW4gcHJvZ3Jlc3MgKi8KIAltbXVfc2VxID0ga3ZtLT5tbXVfbm90aWZpZXJfc2VxOwpAQCAtNDA1LDcgKzQwMiw3IEBACiAJCQkgKi8KIAogCQkJZm9yICg7IHRzaXplID4gQk9PSzNFX1BBR0VTWl80SzsgdHNpemUgLT0gMikgewotCQkJCXVuc2lnbmVkIGxvbmcgZ2ZuX3N0YXJ0LCBnZm5fZW5kLCB0c2l6ZV9wYWdlczsKKwkJCQl1bnNpZ25lZCBsb25nIGdmbl9zdGFydCwgZ2ZuX2VuZDsKIAkJCQl0c2l6ZV9wYWdlcyA9IDEgPDwgKHRzaXplIC0gMik7CiAKIAkJCQlnZm5fc3RhcnQgPSBnZm4gJiB+KHRzaXplX3BhZ2VzIC0gMSk7CkBAIC00NDcsMTEgKzQ0NCwxMiBAQAogCX0KIAogCWlmIChsaWtlbHkoIXBmbm1hcCkpIHsKLQkJdW5zaWduZWQgbG9uZyB0c2l6ZV9wYWdlcyA9IDEgPDwgKHRzaXplICsgMTAgLSBQQUdFX1NISUZUKTsKKwkJdHNpemVfcGFnZXMgPSAxIDw8ICh0c2l6ZSArIDEwIC0gUEFHRV9TSElGVCk7CiAJCXBmbiA9IGdmbl90b19wZm5fbWVtc2xvdChzbG90LCBnZm4pOwogCQlpZiAoaXNfZXJyb3Jfbm9zbG90X3BmbihwZm4pKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGdldCByZWFsIHBhZ2UgZm9yIGdmbiAlbHghXG4iLAotCQkJCQkobG9uZylnZm4pOworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlwcl9lcnIoIiVzOiByZWFsIHBhZ2Ugbm90IGZvdW5kIGZvciBnZm4gJWx4XG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgKGxvbmcpZ2ZuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ2Niw3ICs0NjQsMTggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Ja3ZtcHBjX2U1MDBfcmVmX3NldHVwKHJlZiwgZ3RsYmUsIHBmbik7CisKKwlwZ2RpciA9IHZjcHVfZTUwMC0+dmNwdS5hcmNoLnBnZGlyOworCXB0ZXAgPSBsb29rdXBfbGludXhfcHRlcChwZ2RpciwgaHZhLCAmdHNpemVfcGFnZXMpOworCWlmIChwdGVfcHJlc2VudCgqcHRlcCkpCisJCXdpbWcgPSAoKnB0ZXAgPj4gUFRFX1dJTUdFX1NISUZUKSAmIE1BUzJfV0lNR0VfTUFTSzsKKwllbHNlIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByX2VycigiJXM6IHB0ZSBub3QgcHJlc2VudDogZ2ZuICVseCwgcGZuICVseFxuIiwKKwkJCQlfX2Z1bmNfXywgKGxvbmcpZ2ZuLCBwZm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJa3ZtcHBjX2U1MDBfcmVmX3NldHVwKHJlZiwgZ3RsYmUsIHBmbiwgd2ltZyk7CiAKIAlrdm1wcGNfZTUwMF9zZXR1cF9zdGxiZSgmdmNwdV9lNTAwLT52Y3B1LCBndGxiZSwgdHNpemUsCiAJCQkJcmVmLCBndmFkZHIsIHN0bGJlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMG1jLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDBtYy5jCmluZGV4IDQxMzJjZDIuLjE3ZTQ1NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMG1jLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwbWMuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CkBAIC0zOTEsMyArMzkzLDUgQEAKIAogbW9kdWxlX2luaXQoa3ZtcHBjX2U1MDBtY19pbml0KTsKIG1vZHVsZV9leGl0KGt2bXBwY19lNTAwbWNfZXhpdCk7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihLVk1fTUlOT1IpOworTU9EVUxFX0FMSUFTKCJkZXZuYW1lOmt2bSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lbXVsYXRlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwppbmRleCAyZjlhMDg3Li5jMmI4ODdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwpAQCAtMjE5LDcgKzIxOSw2IEBACiAgKiBsbXcKICAqIHN0bXcKICAqCi0gKiBYWFggaXNfYmlnZW5kaWFuIHNob3VsZCBkZXBlbmQgb24gTU1VIG1hcHBpbmcgb3IgTVNSW0xFXQogICovCiAvKiBYWFggU2hvdWxkIHByb2JhYmx5IGF1dG8tZ2VuZXJhdGUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgZm9yIGEgcGFydGljdWxhciBjb3JlCiAgKiBmcm9tIG9wY29kZSB0YWJsZXMgaW4gdGhlIGZ1dHVyZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vbXBpYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKaW5kZXggMjg2MWFlOS4uZWZiZDk5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKQEAgLTE2MzUsNiArMTYzNSw3IEBACiAKIAlkZXYtPmt2bS0+YXJjaC5tcGljID0gTlVMTDsKIAlrZnJlZShvcHApOworCWtmcmVlKGRldik7CiB9CiAKIHN0YXRpYyBpbnQgbXBpY19zZXRfZGVmYXVsdF9pcnFfcm91dGluZyhzdHJ1Y3Qgb3BlbnBpYyAqb3BwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwppbmRleCA5YWU5NzY4Li4zY2Y1NDFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwpAQCAtNjgsMTQgKzY4LDE2IEBACiAgKi8KIGludCBrdm1wcGNfcHJlcGFyZV90b19lbnRlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JaW50IHIgPSAxOworCWludCByOwogCi0JV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKwloYXJkX2lycV9kaXNhYmxlKCk7CisKIAl3aGlsZSAodHJ1ZSkgewogCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCWhhcmRfaXJxX2Rpc2FibGUoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTEwMSw3ICsxMDMsNyBAQAogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkJdHJhY2Vfa3ZtX2NoZWNrX3JlcXVlc3RzKHZjcHUpOwogCQkJciA9IGt2bXBwY19jb3JlX2NoZWNrX3JlcXVlc3RzKHZjcHUpOwotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCWhhcmRfaXJxX2Rpc2FibGUoKTsKIAkJCWlmIChyID4gMCkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwpAQCAtMTEzLDIyICsxMTUsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQkJLyogbGF6eSBFRSBtYWdpYyAqLwotCQloYXJkX2lycV9kaXNhYmxlKCk7Ci0JCWlmIChsYXp5X2lycV9wZW5kaW5nKCkpIHsKLQkJCS8qIEdvdCBhbiBpbnRlcnJ1cHQgaW4gYmV0d2VlbiwgdHJ5IGFnYWluICovCi0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJa3ZtX2d1ZXN0X2V4aXQoKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYKLQogCQlrdm1fZ3Vlc3RfZW50ZXIoKTsKLQkJYnJlYWs7CisJCXJldHVybiAxOwogCX0KIAorCS8qIHJldHVybiB0byBob3N0ICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX3ByZXBhcmVfdG9fZW50ZXIpOwpAQCAtNjU2LDE0ICs2NDgsMTQgQEAKIAkJa3ZtcHBjX3NldF9ncHIodmNwdSwgdmNwdS0+YXJjaC5pb19ncHIsIGdwcik7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX01NSU9fUkVHX0ZQUjoKLQkJdmNwdS0+YXJjaC5mcHJbdmNwdS0+YXJjaC5pb19ncHIgJiBLVk1fTU1JT19SRUdfTUFTS10gPSBncHI7CisJCVZDUFVfRlBSKHZjcHUsIHZjcHUtPmFyY2guaW9fZ3ByICYgS1ZNX01NSU9fUkVHX01BU0spID0gZ3ByOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwogCWNhc2UgS1ZNX01NSU9fUkVHX1FQUjoKIAkJdmNwdS0+YXJjaC5xcHJbdmNwdS0+YXJjaC5pb19ncHIgJiBLVk1fTU1JT19SRUdfTUFTS10gPSBncHI7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX01NSU9fUkVHX0ZRUFI6Ci0JCXZjcHUtPmFyY2guZnByW3ZjcHUtPmFyY2guaW9fZ3ByICYgS1ZNX01NSU9fUkVHX01BU0tdID0gZ3ByOworCQlWQ1BVX0ZQUih2Y3B1LCB2Y3B1LT5hcmNoLmlvX2dwciAmIEtWTV9NTUlPX1JFR19NQVNLKSA9IGdwcjsKIAkJdmNwdS0+YXJjaC5xcHJbdmNwdS0+YXJjaC5pb19ncHIgJiBLVk1fTU1JT19SRUdfTUFTS10gPSBncHI7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC02NzMsOSArNjY1LDE5IEBACiB9CiAKIGludCBrdm1wcGNfaGFuZGxlX2xvYWQoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcnQsIHVuc2lnbmVkIGludCBieXRlcywgaW50IGlzX2JpZ2VuZGlhbikKKwkJICAgICAgIHVuc2lnbmVkIGludCBydCwgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkgICAgICAgaW50IGlzX2RlZmF1bHRfZW5kaWFuKQogewogCWludCBpZHgsIHJldDsKKwlpbnQgaXNfYmlnZW5kaWFuOworCisJaWYgKGt2bXBwY19uZWVkX2J5dGVzd2FwKHZjcHUpKSB7CisJCS8qIERlZmF1bHQgZW5kaWFubmVzcyBpcyAibGl0dGxlIGVuZGlhbiIuICovCisJCWlzX2JpZ2VuZGlhbiA9ICFpc19kZWZhdWx0X2VuZGlhbjsKKwl9IGVsc2UgeworCQkvKiBEZWZhdWx0IGVuZGlhbm5lc3MgaXMgImJpZyBlbmRpYW4iLiAqLworCQlpc19iaWdlbmRpYW4gPSBpc19kZWZhdWx0X2VuZGlhbjsKKwl9CiAKIAlpZiAoYnl0ZXMgPiBzaXplb2YocnVuLT5tbWlvLmRhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBNTUlPIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLApAQCAtNzExLDIxICs3MTMsMzEgQEAKIAogLyogU2FtZSBhcyBhYm92ZSwgYnV0IHNpZ24gZXh0ZW5kcyAqLwogaW50IGt2bXBwY19oYW5kbGVfbG9hZHMoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ0LCB1bnNpZ25lZCBpbnQgYnl0ZXMsIGludCBpc19iaWdlbmRpYW4pCisJCQl1bnNpZ25lZCBpbnQgcnQsIHVuc2lnbmVkIGludCBieXRlcywKKwkJCWludCBpc19kZWZhdWx0X2VuZGlhbikKIHsKIAlpbnQgcjsKIAogCXZjcHUtPmFyY2gubW1pb19zaWduX2V4dGVuZCA9IDE7Ci0JciA9IGt2bXBwY19oYW5kbGVfbG9hZChydW4sIHZjcHUsIHJ0LCBieXRlcywgaXNfYmlnZW5kaWFuKTsKKwlyID0ga3ZtcHBjX2hhbmRsZV9sb2FkKHJ1biwgdmNwdSwgcnQsIGJ5dGVzLCBpc19kZWZhdWx0X2VuZGlhbik7CiAKIAlyZXR1cm4gcjsKIH0KIAogaW50IGt2bXBwY19oYW5kbGVfc3RvcmUoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICAgdTY0IHZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLCBpbnQgaXNfYmlnZW5kaWFuKQorCQkJdTY0IHZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLCBpbnQgaXNfZGVmYXVsdF9lbmRpYW4pCiB7CiAJdm9pZCAqZGF0YSA9IHJ1bi0+bW1pby5kYXRhOwogCWludCBpZHgsIHJldDsKKwlpbnQgaXNfYmlnZW5kaWFuOworCisJaWYgKGt2bXBwY19uZWVkX2J5dGVzd2FwKHZjcHUpKSB7CisJCS8qIERlZmF1bHQgZW5kaWFubmVzcyBpcyAibGl0dGxlIGVuZGlhbiIuICovCisJCWlzX2JpZ2VuZGlhbiA9ICFpc19kZWZhdWx0X2VuZGlhbjsKKwl9IGVsc2UgeworCQkvKiBEZWZhdWx0IGVuZGlhbm5lc3MgaXMgImJpZyBlbmRpYW4iLiAqLworCQlpc19iaWdlbmRpYW4gPSBpc19kZWZhdWx0X2VuZGlhbjsKKwl9CiAKIAlpZiAoYnl0ZXMgPiBzaXplb2YocnVuLT5tbWlvLmRhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBNTUlPIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA5MGJiNmQ5Li5lYjkyMzY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNDcyLDEyICs0NzIsMTMgQEAKIHsKIAlzdHJ1Y3QgaHVnZXBkX2ZyZWVsaXN0ICoqYmF0Y2hwOwogCi0JYmF0Y2hwID0gJl9fZ2V0X2NwdV92YXIoaHVnZXBkX2ZyZWVsaXN0X2N1cik7CisJYmF0Y2hwID0gJmdldF9jcHVfdmFyKGh1Z2VwZF9mcmVlbGlzdF9jdXIpOwogCiAJaWYgKGF0b21pY19yZWFkKCZ0bGItPm1tLT5tbV91c2VycykgPCAyIHx8CiAJICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayh0bGItPm1tKSwKIAkJCSAgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewogCQlrbWVtX2NhY2hlX2ZyZWUoaHVnZXB0ZV9jYWNoZSwgaHVnZXB0ZSk7CisgICAgICAgIHB1dF9jcHVfdmFyKGh1Z2VwZF9mcmVlbGlzdF9jdXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC00OTEsNiArNDkyLDcgQEAKIAkJY2FsbF9yY3Vfc2NoZWQoJigqYmF0Y2hwKS0+cmN1LCBodWdlcGRfZnJlZV9yY3VfY2FsbGJhY2spOwogCQkqYmF0Y2hwID0gTlVMTDsKIAl9CisJcHV0X2NwdV92YXIoaHVnZXBkX2ZyZWVsaXN0X2N1cik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL251bWEuYyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKaW5kZXggODZhNjNkZS4uMzBhNDJlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL251bWEuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCkBAIC0xNzg1LDcgKzE3ODUsNyBAQAogc3RhdGljIGludCB0b3BvbG9neV91cGRhdGVfaW5pdCh2b2lkKQogewogCXN0YXJ0X3RvcG9sb2d5X3VwZGF0ZSgpOwotCXByb2NfY3JlYXRlKCJwb3dlcnBjL3RvcG9sb2d5X3VwZGF0ZXMiLCA2NDQsIE5VTEwsICZ0b3BvbG9neV9vcHMpOworCXByb2NfY3JlYXRlKCJwb3dlcnBjL3RvcG9sb2d5X3VwZGF0ZXMiLCAwNjQ0LCBOVUxMLCAmdG9wb2xvZ3lfb3BzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3NsaWNlLmMgYi9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYwppbmRleCA3Y2U5Y2YzLi5iMGM3NWNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJaWYgKGZpeGVkICYmIChhZGRyICYgKCgxdWwgPDwgcHNoaWZ0KSAtIDEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGZpeGVkICYmIGFkZHIgPiAobW0tPnRhc2tfc2l6ZSAtIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIElmIGhpbnQsIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIG91ciBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zICovCiAJaWYgKCFmaXhlZCAmJiBhZGRyKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCmluZGV4IDE2MjUwYjEuLmM5NWViMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCkBAIC0yNDAsNiArMjQwLDcgQEAKIAliZXEJdGxiX21pc3NfY29tbW9uX2JvbHRlZAogCWIJaXRsYl9taXNzX2tlcm5lbF9ib2x0ZWQKIAorI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQogLyoKICAqIFRMQiBtaXNzIGhhbmRsaW5nIGZvciBlNjUwMCBhbmQgZGVyaXZhdGl2ZXMsIHVzaW5nIGhhcmR3YXJlIHRhYmxld2Fsay4KICAqCkBAIC00MDksNyArNDEwLDcgQEAKIAlUTEJfTUlTU19TVEFUU19JKE1NU1RBVF9UTEJfTUlTU19OT1JNX0ZBVUxUKQogCXRsYl9lcGlsb2dfYm9sdGVkCiAJYglleGNfaW5zdHJ1Y3Rpb25fc3RvcmFnZV9ib29rM2UKLQorI2VuZGlmIC8qIENPTkZJR19QUENfRlNMX0JPT0szRSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCmluZGV4IDczNTgzOWIuLmIzN2E1OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwpAQCAtNTU3LDEwICs1NTcsMTIgQEAKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19odHdfYm9vazNlKTsKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWUwLCBleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfaHR3X2Jvb2szZSk7CiAJCWJyZWFrOworI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQogCWNhc2UgUFBDX0hUV19FNjUwMDoKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19lNjUwMF9ib29rM2UpOwogCQlwYXRjaF9leGNlcHRpb24oMHgxZTAsIGV4Y19pbnN0cnVjdGlvbl90bGJfbWlzc19lNjUwMF9ib29rM2UpOwogCQlicmVhazsKKyNlbmRpZgogCX0KIAlwcl9pbmZvKCJNTVU6IEJvb2szRSBIVyB0YWJsZXdhbGsgJXNcbiIsCiAJCWJvb2szZV9odHdfbW9kZSAhPSBQUENfSFRXX05PTkUgPyAiZW5hYmxlZCIgOiAibm90IHN1cHBvcnRlZCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZwppbmRleCBmYzljMWNiLi41YWEzZjRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZwpAQCAtMSw5ICsxLDkgQEAKIGNvbmZpZyBQUENfTVBDNTEyeAogCWJvb2wgIjUxMngtYmFzZWQgYm9hcmRzIgogCWRlcGVuZHMgb24gNnh4CisJc2VsZWN0IENPTU1PTl9DTEsKIAlzZWxlY3QgRlNMX1NPQwogCXNlbGVjdCBJUElDCi0Jc2VsZWN0IFBQQ19DTE9DSwogCXNlbGVjdCBQUENfUENJX0NIT0lDRQogCXNlbGVjdCBGU0xfUENJIGlmIFBDSQogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L01ha2VmaWxlCmluZGV4IDcyZmI5MzQuLjAxNjkzMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgRnJlZXNjYWxlIFBvd2VyUEMgNTEyeCBsaW51eCBrZXJuZWwuCiAjCi1vYmoteQkJCQkrPSBjbG9jay5vIG1wYzUxMnhfc2hhcmVkLm8KK29iai0kKENPTkZJR19DT01NT05fQ0xLKQkrPSBjbG9jay1jb21tb25jbGsubworb2JqLXkJCQkJKz0gbXBjNTEyeF9zaGFyZWQubwogb2JqLSQoQ09ORklHX01QQzUxMjFfQURTKQkrPSBtcGM1MTIxX2Fkcy5vIG1wYzUxMjFfYWRzX2NwbGQubwogb2JqLSQoQ09ORklHX01QQzUxMnhfR0VORVJJQykJKz0gbXBjNTEyeF9nZW5lcmljLm8KIG9iai0kKENPTkZJR19QRE0zNjBORykJCSs9IHBkbTM2MG5nLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay1jb21tb25jbGsuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay1jb21tb25jbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI2MTRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLWNvbW1vbmNsay5jCkBAIC0wLDAgKzEsMTIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogR2VyaGFyZCBTaXR0aWcsIDxnc2lAZGVueC5kZT4KKyAqCisgKiBjb21tb24gY2xvY2sgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBNUEM1MTJ4IHBsYXRmb3JtCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9tcGM1MTIxLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXBjNTEyeC1jbG9jay5oPgorCisjaW5jbHVkZSAibXBjNTEyeC5oIgkJLyogb3VyIHB1YmxpYyBtcGM1MTIxX2Nsa19pbml0KCkgQVBJICovCisKKy8qIGhlbHBlcnMgdG8ga2VlcCB0aGUgTUNMSyBpbnRlcm1lZGlhdGVzICJzb21ld2hlcmUiIGluIG91ciB0YWJsZSAqLworZW51bSB7CisJTUNMS19JRFhfTVVYMCwKKwlNQ0xLX0lEWF9FTjAsCisJTUNMS19JRFhfRElWMCwKKwlNQ0xLX01BWF9JRFgsCit9OworCisjZGVmaW5lIE5SX1BTQ1MJCQkxMgorI2RlZmluZSBOUl9NU0NBTlMJCTQKKyNkZWZpbmUgTlJfU1BESUZTCQkxCisjZGVmaW5lIE5SX09VVENMSwkJNAorI2RlZmluZSBOUl9NQ0xLUwkJKE5SX1BTQ1MgKyBOUl9NU0NBTlMgKyBOUl9TUERJRlMgKyBOUl9PVVRDTEspCisKKy8qIGV4dGVuZCB0aGUgcHVibGljIHNldCBvZiBjbG9ja3MgYnkgYWRkaW5nIGludGVybmFsIHNsb3RzIGZvciBtYW5hZ2VtZW50ICovCitlbnVtIHsKKwkvKiBhcnJhbmdlIGZvciBhZGphY2VudCBudW1iZXJzIGFmdGVyIHRoZSBwdWJsaWMgc2V0ICovCisJTVBDNTEyeF9DTEtfU1RBUlRfUFJJVkFURSA9IE1QQzUxMnhfQ0xLX0xBU1RfUFVCTElDLAorCS8qIGNsb2NrcyB3aGljaCBhcmVuJ3QgYW5ub3VuY2VkIHRvIHRoZSBwdWJsaWMgKi8KKwlNUEM1MTJ4X0NMS19ERFIsCisJTVBDNTEyeF9DTEtfTUVNLAorCU1QQzUxMnhfQ0xLX0lJTSwKKwkvKiBpbnRlcm1lZGlhdGVzIGluIGRpditnYXRlIGNvbWJvcyBvciBmcmFjdGlvbmFsIGRpdmlkZXJzICovCisJTVBDNTEyeF9DTEtfRERSX1VHLAorCU1QQzUxMnhfQ0xLX1NESENfeDQsCisJTVBDNTEyeF9DTEtfU0RIQ19VRywKKwlNUEM1MTJ4X0NMS19TREhDMl9VRywKKwlNUEM1MTJ4X0NMS19ESVVfeDQsCisJTVBDNTEyeF9DTEtfRElVX1VHLAorCU1QQzUxMnhfQ0xLX01CWF9CVVNfVUcsCisJTVBDNTEyeF9DTEtfTUJYX1VHLAorCU1QQzUxMnhfQ0xLX01CWF8zRF9VRywKKwlNUEM1MTJ4X0NMS19QQ0lfVUcsCisJTVBDNTEyeF9DTEtfTkZDX1VHLAorCU1QQzUxMnhfQ0xLX0xQQ19VRywKKwlNUEM1MTJ4X0NMS19TUERJRl9UWF9JTiwKKwkvKiBpbnRlcm1lZGlhdGVzIGZvciB0aGUgbXV4K2dhdGUrZGl2K211eCBNQ0xLIGdlbmVyYXRpb24gKi8KKwlNUEM1MTJ4X0NMS19NQ0xLU19GSVJTVCwKKwlNUEM1MTJ4X0NMS19NQ0xLU19MQVNUID0gTVBDNTEyeF9DTEtfTUNMS1NfRklSU1QKKwkJCQkrIE5SX01DTEtTICogTUNMS19NQVhfSURYLAorCS8qIGludGVybmFsLCBzeW1ib2xpYyBzcGVjIGZvciB0aGUgbnVtYmVyIG9mIHNsb3RzICovCisJTVBDNTEyeF9DTEtfTEFTVF9QUklWQVRFLAorfTsKKworLyogZGF0YSByZXF1aXJlZCBmb3IgdGhlIE9GIGNsb2NrIHByb3ZpZGVyIHJlZ2lzdHJhdGlvbiAqLworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbTVBDNTEyeF9DTEtfTEFTVF9QUklWQVRFXTsKK3N0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfZGF0YTsKKworLyogQ0NNIHJlZ2lzdGVyIGFjY2VzcyAqLworc3RhdGljIHN0cnVjdCBtcGM1MTJ4X2NjbSBfX2lvbWVtICpjbGtyZWdzOworc3RhdGljIERFRklORV9TUElOTE9DSyhjbGtsb2NrKTsKKworLyogU29DIHZhcmlhbnRzIHt7eyAqLworCisvKgorICogdGVsbCBTb0MgdmFyaWFudHMgYXBhcnQgYXMgdGhleSBhcmUgcmF0aGVyIHNpbWlsYXIgeWV0IG5vdCBpZGVudGljYWwsCisgKiBjYWNoZSB0aGUgcmVzdWx0IGluIGFuIGVudW0gdG8gbm90IHJlcGVhdGVkbHkgcnVuIHRoZSBleHBlbnNpdmUgT0YgdGVzdAorICoKKyAqIE1QQzUxMjMgaXMgYW4gTVBDNTEyMSB3aXRob3V0IHRoZSBNQlggZ3JhcGhpY3MgYWNjZWxlcmF0b3IKKyAqCisgKiBNUEM1MTI1IGhhcyBtYW55IG1vcmUgZGlmZmVyZW5jZXM6IG5vIE1CWCwgbm8gQVhFLCBubyBWSVUsIG5vIFNQRElGLAorICogbm8gUEFUQSwgbm8gU0FUQSwgbm8gUENJLCB0d28gRkVDcyAob2YgZGlmZmVyZW50IGNvbXBhdGliaWxpdHkgbmFtZSksCisgKiBvbmx5IDEwIFBTQ3MgKG9mIGRpZmZlcmVudCBjb21wYXRpYmlsaXR5IG5hbWUpLCB0d28gU0RIQ3MsIGRpZmZlcmVudAorICogTkZDIElQIGJsb2NrLCBvdXRwdXQgY2xvY2tzLCBzeXN0ZW0gUExMIHN0YXR1cyBxdWVyeSwgZGlmZmVyZW50IENQTUYKKyAqIGludGVycHJldGF0aW9uLCBubyBDRk0sIGRpZmZlcmVudCBmb3VydGggUFNDL0NBTiBtdXgwIGlucHV0IC0tIHlldAorICogdGhvc2UgZGlmZmVyZW5jZXMgY2FuIGdldCBmb2xkZWQgaW50byB0aGlzIGNsb2NrIHByb3ZpZGVyIHN1cHBvcnQKKyAqIGNvZGUgYW5kIGRvbid0IHdhcnJhbnQgYSBzZXBhcmF0ZSBoaWdobHkgcmVkdW5kYW50IGltcGxlbWVudGF0aW9uCisgKi8KKworc3RhdGljIGVudW0gc29jX3R5cGUgeworCU1QQzUxMnhfU09DX01QQzUxMjEsCisJTVBDNTEyeF9TT0NfTVBDNTEyMywKKwlNUEM1MTJ4X1NPQ19NUEM1MTI1LAorfSBzb2M7CisKK3N0YXRpYyB2b2lkIG1wYzUxMnhfY2xrX2RldGVybWluZV9zb2Modm9pZCkKK3sKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJmc2wsbXBjNTEyMSIpKSB7CisJCXNvYyA9IE1QQzUxMnhfU09DX01QQzUxMjE7CisJCXJldHVybjsKKwl9CisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiZnNsLG1wYzUxMjMiKSkgeworCQlzb2MgPSBNUEM1MTJ4X1NPQ19NUEM1MTIzOworCQlyZXR1cm47CisJfQorCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImZzbCxtcGM1MTI1IikpIHsKKwkJc29jID0gTVBDNTEyeF9TT0NfTVBDNTEyNTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGJvb2wgc29jX2hhc19tYngodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjEpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc19heGUodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjUpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc192aXUodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjUpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc19zcGRpZih2b2lkKQoreworCWlmIChzb2MgPT0gTVBDNTEyeF9TT0NfTVBDNTEyNSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBzb2NfaGFzX3BhdGEodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjUpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc19zYXRhKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHNvY19oYXNfcGNpKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHNvY19oYXNfZmVjMih2b2lkKQoreworCWlmIChzb2MgPT0gTVBDNTEyeF9TT0NfTVBDNTEyNSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHNvY19tYXhfcHNjbnVtKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gMTA7CisJcmV0dXJuIDEyOworfQorCitzdGF0aWMgYm9vbCBzb2NfaGFzX3NkaGMyKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHNvY19oYXNfbmZjXzUxMjUodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjUpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc19vdXRjbGsodm9pZCkKK3sKKwlpZiAoc29jID09IE1QQzUxMnhfU09DX01QQzUxMjUpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc29jX2hhc19jcG1mXzBfYnlwYXNzKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHNvY19oYXNfbWNsa19tdXgwX2NhbmluKHZvaWQpCit7CisJaWYgKHNvYyA9PSBNUEM1MTJ4X1NPQ19NUEM1MTI1KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIH19fSBTb0MgdmFyaWFudHMgKi8KKy8qIGNvbW1vbiBjbGsgQVBJIHdyYXBwZXJzIHt7eyAqLworCisvKiBjb252ZW5pZW5jZSB3cmFwcGVycyBhcm91bmQgdGhlIGNvbW1vbiBjbGsgQVBJICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjbGsgKm1wYzUxMnhfY2xrX2ZpeGVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCByYXRlKQoreworCXJldHVybiBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCBuYW1lLCBOVUxMLCBDTEtfSVNfUk9PVCwgcmF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqbXBjNTEyeF9jbGtfZmFjdG9yKAorCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAorCWludCBtdWwsIGludCBkaXYpCit7CisJaW50IGNsa2ZsYWdzOworCisJY2xrZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5UOworCXJldHVybiBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCBjbGtmbGFncywKKwkJCQkJIG11bCwgZGl2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2xrICptcGM1MTJ4X2Nsa19kaXZpZGVyKAorCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1OCBjbGtmbGFncywKKwl1MzIgX19pb21lbSAqcmVnLCB1OCBwb3MsIHU4IGxlbiwgaW50IGRpdmZsYWdzKQoreworCXJldHVybiBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgY2xrZmxhZ3MsCisJCQkJICAgIHJlZywgcG9zLCBsZW4sIGRpdmZsYWdzLCAmY2xrbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqbXBjNTEyeF9jbGtfZGl2dGFibGUoCisJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCisJdTMyIF9faW9tZW0gKnJlZywgdTggcG9zLCB1OCBsZW4sCisJY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgKmRpdnRhYikKK3sKKwl1OCBkaXZmbGFnczsKKworCWRpdmZsYWdzID0gMDsKKwlyZXR1cm4gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIDAsCisJCQkJCSAgcmVnLCBwb3MsIGxlbiwgZGl2ZmxhZ3MsCisJCQkJCSAgZGl2dGFiLCAmY2xrbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqbXBjNTEyeF9jbGtfZ2F0ZWQoCisJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCisJdTMyIF9faW9tZW0gKnJlZywgdTggcG9zKQoreworCWludCBjbGtmbGFnczsKKworCWNsa2ZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVDsKKwlyZXR1cm4gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIGNsa2ZsYWdzLAorCQkJCSByZWcsIHBvcywgMCwgJmNsa2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjbGsgKm1wYzUxMnhfY2xrX211eGVkKGNvbnN0IGNoYXIgKm5hbWUsCisJY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgaW50IHBhcmVudF9jb3VudCwKKwl1MzIgX19pb21lbSAqcmVnLCB1OCBwb3MsIHU4IGxlbikKK3sKKwlpbnQgY2xrZmxhZ3M7CisJdTggbXV4ZmxhZ3M7CisKKwljbGtmbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQ7CisJbXV4ZmxhZ3MgPSAwOworCXJldHVybiBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsIG5hbWUsCisJCQkJcGFyZW50X25hbWVzLCBwYXJlbnRfY291bnQsIGNsa2ZsYWdzLAorCQkJCXJlZywgcG9zLCBsZW4sIG11eGZsYWdzLCAmY2xrbG9jayk7Cit9CisKKy8qIH19fSBjb21tb24gY2xrIEFQSSB3cmFwcGVycyAqLworCisvKiBoZWxwZXIgdG8gaXNvbGF0ZSBhIGJpdCBmaWVsZCBmcm9tIGEgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRfZmllbGQodWludDMyX3QgX19pb21lbSAqcmVnLCB1aW50OF90IHBvcywgdWludDhfdCBsZW4pCit7CisJdWludDMyX3QgdmFsOworCisJdmFsID0gaW5fYmUzMihyZWcpOworCXZhbCA+Pj0gcG9zOworCXZhbCAmPSAoMSA8PCBsZW4pIC0gMTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBnZXQgdGhlIFNQTUYgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIHRoZSAic3lzIHBsbCIgbXVsdGlwbGllciAqLworc3RhdGljIGludCBnZXRfc3BtZl9tdWx0KHZvaWQpCit7CisJc3RhdGljIGludCBzcG1mX3RvX211bHRbXSA9IHsKKwkJNjgsIDEsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsCisJCTM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwKKwl9OworCWludCBzcG1mOworCisJc3BtZiA9IGdldF9iaXRfZmllbGQoJmNsa3JlZ3MtPnNwbXIsIDI0LCA0KTsKKwlyZXR1cm4gc3BtZl90b19tdWx0W3NwbWZdOworfQorCisvKgorICogZ2V0IHRoZSBTWVNfRElWIHZhbHVlIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIGRpdmlkZSBmYWN0b3IKKyAqCisgKiB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBoZXJlIGFyZSBhIG11bHRpcGxlIG9mIHRoZSByZWFsIGZhY3RvciBzaW5jZSB0aGUKKyAqIGRpdmlkZSByYXRpbyBpcyBmcmFjdGlvbmFsCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3N5c19kaXZfeDIodm9pZCkKK3sKKwlzdGF0aWMgaW50IHN5c2Rpdl9jb2RlX3RvX3gyW10gPSB7CisJCTQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNCwKKwkJMTIsIDE2LCAxOCwgMjIsIDIwLCAyNCwgMjYsIDMwLAorCQkyOCwgMzIsIDM0LCAzOCwgMzYsIDQwLCA0MiwgNDYsCisJCTQ0LCA0OCwgNTAsIDU0LCA1MiwgNTYsIDU4LCA2MiwKKwkJNjAsIDY0LCA2NiwKKwl9OworCWludCBkaXZjb2RlOworCisJZGl2Y29kZSA9IGdldF9iaXRfZmllbGQoJmNsa3JlZ3MtPnNjZnIyLCAyNiwgNik7CisJcmV0dXJuIHN5c2Rpdl9jb2RlX3RvX3gyW2RpdmNvZGVdOworfQorCisvKgorICogZ2V0IHRoZSBDUE1GIHZhbHVlIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIG11bHRpcGxpZXIgZmFjdG9yCisgKgorICogdmFsdWVzIHJldHVybmVkIGZyb20gaGVyZSBhcmUgYSBtdWx0aXBsZSBvZiB0aGUgcmVhbCBmYWN0b3Igc2luY2UgdGhlCisgKiBtdWx0aXBsaWVyIHJhdGlvIGlzIGZyYWN0aW9uYWwKKyAqLworc3RhdGljIGludCBnZXRfY3BtZl9tdWx0X3gyKHZvaWQpCit7CisJc3RhdGljIGludCBjcG1mX3RvX211bHRfeDM2W10gPSB7CisJCS8qIDBiMDAwIGlzICJ0aW1lcyAzNiIgKi8KKwkJNzIsIDIsIDIsIDMsIDQsIDUsIDYsIDcsCisJfTsKKwlzdGF0aWMgaW50IGNwbWZfdG9fbXVsdF8wYnlbXSA9IHsKKwkJLyogMGIwMDAgaXMgImJ5cGFzcyIgKi8KKwkJMiwgMiwgMiwgMywgNCwgNSwgNiwgNywKKwl9OworCisJaW50ICpjcG1mX3RvX211bHQ7CisJaW50IGNwbWY7CisKKwljcG1mID0gZ2V0X2JpdF9maWVsZCgmY2xrcmVncy0+c3BtciwgMTYsIDQpOworCWlmIChzb2NfaGFzX2NwbWZfMF9ieXBhc3MoKSkKKwkJY3BtZl90b19tdWx0ID0gY3BtZl90b19tdWx0XzBieTsKKwllbHNlCisJCWNwbWZfdG9fbXVsdCA9IGNwbWZfdG9fbXVsdF94MzY7CisJcmV0dXJuIGNwbWZfdG9fbXVsdFtjcG1mXTsKK30KKworLyoKKyAqIHNvbWUgb2YgdGhlIGNsb2NrIGRpdmlkZXJzIGRvIHNjYWxlIGluIGEgbGluZWFyIHdheSwgeWV0IG5vdCBhbGwgb2YKKyAqIHRoZWlyIGJpdCBjb21iaW5hdGlvbnMgYXJlIGxlZ2FsOyB1c2UgYSBkaXZpZGVyIHRhYmxlIHRvIGdldCBhCisgKiByZXN1bHRpbmcgc2V0IG9mIGFwcGxpY2FibGUgZGl2aWRlciB2YWx1ZXMKKyAqLworCisvKiBhcHBsaWVzIHRvIHRoZSBJUFNfRElWLCBhbmQgUENJX0RJViB2YWx1ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBkaXZ0YWJfMjM0NltdID0geworCXsgLnZhbCA9IDIsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSAzLCB9LAorCXsgLnZhbCA9IDQsIC5kaXYgPSA0LCB9LAorCXsgLnZhbCA9IDYsIC5kaXYgPSA2LCB9LAorCXsgLmRpdiA9IDAsIH0sCit9OworCisvKiBhcHBsaWVzIHRvIHRoZSBNQlhfRElWLCBMUENfRElWLCBhbmQgTkZDX0RJViB2YWx1ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBkaXZ0YWJfMTIzNFtdID0geworCXsgLnZhbCA9IDEsIC5kaXYgPSAxLCB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSAzLCB9LAorCXsgLnZhbCA9IDQsIC5kaXYgPSA0LCB9LAorCXsgLmRpdiA9IDAsIH0sCit9OworCitzdGF0aWMgaW50IGdldF9mcmVxX2Zyb21fZHQoY2hhciAqcHJvcG5hbWUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CisJaW50IHZhbDsKKworCXZhbCA9IDA7CisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLG1wYzUxMjEtaW1tciIpOworCWlmIChucCkgeworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisJCWlmIChwcm9wKQorCQkJdmFsID0gKnByb3A7CisJICAgIG9mX25vZGVfcHV0KG5wKTsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgbXBjNTEyeF9jbGtfcHJlc2V0X2RhdGEodm9pZCkKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsa3MpOyBpKyspCisJCWNsa3NbaV0gPSBFUlJfUFRSKC1FTk9ERVYpOworfQorCisvKgorICogLSByZWNlaXZlcyB0aGUgImJ1cyBmcmVxdWVuY3kiIGZyb20gdGhlIGNhbGxlciAodGhhdCdzIHRoZSBJUFMgY2xvY2sKKyAqICAgcmF0ZSwgdGhlIGhpc3RvcmljYWwgc291cmNlIG9mIGNsb2NrIGluZm9ybWF0aW9uKQorICogLSBmZXRjaGVzIHRoZSBzeXN0ZW0gUExMIG11bHRpcGxpZXIgYW5kIGRpdmlkZXIgdmFsdWVzIGFzIHdlbGwgYXMgdGhlCisgKiAgIElQUyBkaXZpZGVyIHZhbHVlIGZyb20gaGFyZHdhcmUKKyAqIC0gZGV0ZXJtaW5lcyB0aGUgUkVGIGNsb2NrIHJhdGUgZWl0aGVyIGZyb20gdGhlIFhUQUwvT1NDIHNwZWMgKGlmCisgKiAgIHRoZXJlIGlzIGEgZGV2aWNlIHRyZWUgbm9kZSBkZXNjcmliaW5nIHRoZSBvc2NpbGxhdG9yKSBvciBmcm9tIHRoZQorICogICBJUFMgYnVzIGNsb2NrIChzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzdWNoIHRoYXQKKyAqICAgc2V0dXBzIHdpdGhvdXQgWFRBTC9PU0Mgc3BlY3Mga2VlcCB3b3JraW5nKQorICogLSBjcmVhdGVzIHRoZSAicmVmIiBjbG9jayBpdGVtIGluIHRoZSBjbG9jayB0cmVlLCBzdWNoIHRoYXQKKyAqICAgc3Vic2VxdWVudCBjb2RlIGNhbiBjcmVhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgaGllcmFyY2h5IChSRUYgLT4KKyAqICAgU1lTIC0+IENTQiAtPiBJUFMpIGZyb20gdGhlIFJFRiBjbG9jayByYXRlIGFuZCB0aGUgcmV0dXJuZWQgbXVsL2RpdgorICogICB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgbXBjNTEyeF9jbGtfc2V0dXBfcmVmX2Nsb2NrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBidXNfZnJlcSwKKwkJCQkJaW50ICpzeXNfbXVsLCBpbnQgKnN5c19kaXYsCisJCQkJCWludCAqaXBzX2RpdikKK3sKKwlzdHJ1Y3QgY2xrICpvc2NfY2xrOworCWludCBjYWxjX2ZyZXE7CisKKwkvKiBmZXRjaCBtdWwvZGl2IGZhY3RvcnMgZnJvbSB0aGUgaGFyZHdhcmUgKi8KKwkqc3lzX211bCA9IGdldF9zcG1mX211bHQoKTsKKwkqc3lzX211bCAqPSAyOwkJLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZyYWN0aW9uYWwgZGl2aWRlciAqLworCSpzeXNfZGl2ID0gZ2V0X3N5c19kaXZfeDIoKTsKKwkqaXBzX2RpdiA9IGdldF9iaXRfZmllbGQoJmNsa3JlZ3MtPnNjZnIxLCAyMywgMyk7CisKKwkvKiBsb29rdXAgdGhlIG9zY2lsbGF0b3IgY2xvY2sgZm9yIGl0cyByYXRlICovCisJb3NjX2NsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgIm9zYyIpOworCisJLyoKKwkgKiBlaXRoZXIgZGVzY2VuZCBmcm9tIE9TQyB0byBSRUYgKGFuZCBpbiBieXBhc3NpbmcgdmVyaWZ5IHRoZQorCSAqIElQUyByYXRlKSwgb3IgYmFja3RyYWNrIGZyb20gSVBTIGFuZCBtdWx0aXBsaWVyIHZhbHVlcyB0aGF0CisJICogd2VyZSBmZXRjaGVkIGZyb20gaGFyZHdhcmUgdG8gUkVGIGFuZCB0aHVzIHRvIHRoZSBPU0MgdmFsdWUKKwkgKgorCSAqIGluIGVpdGhlciBjYXNlIHRoZSBSRUYgY2xvY2sgZ2V0cyBjcmVhdGVkIGhlcmUgYW5kIHRoZQorCSAqIHJlbWFpbmRlciBvZiB0aGUgY2xvY2sgdHJlZSBjYW4gZ2V0IHNwYW5uZWQgZnJvbSB0aGVyZQorCSAqLworCWlmICghSVNfRVJSKG9zY19jbGspKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfUkVGXSA9IG1wYzUxMnhfY2xrX2ZhY3RvcigicmVmIiwgIm9zYyIsIDEsIDEpOworCQljYWxjX2ZyZXEgPSBjbGtfZ2V0X3JhdGUoY2xrc1tNUEM1MTJ4X0NMS19SRUZdKTsKKwkJY2FsY19mcmVxICo9ICpzeXNfbXVsOworCQljYWxjX2ZyZXEgLz0gKnN5c19kaXY7CisJCWNhbGNfZnJlcSAvPSAyOworCQljYWxjX2ZyZXEgLz0gKmlwc19kaXY7CisJCWlmIChidXNfZnJlcSAmJiBjYWxjX2ZyZXEgIT0gYnVzX2ZyZXEpCisJCQlwcl93YXJuKCJjYWxjIHJhdGUgJWQgIT0gT0Ygc3BlYyAlZFxuIiwKKwkJCQljYWxjX2ZyZXEsIGJ1c19mcmVxKTsKKwl9IGVsc2UgeworCQljYWxjX2ZyZXEgPSBidXNfZnJlcTsJLyogc3RhcnQgd2l0aCBJUFMgKi8KKwkJY2FsY19mcmVxICo9ICppcHNfZGl2OwkvKiBJUFMgLT4gQ1NCICovCisJCWNhbGNfZnJlcSAqPSAyOwkJLyogQ1NCIC0+IFNZUyAqLworCQljYWxjX2ZyZXEgKj0gKnN5c19kaXY7CS8qIFNZUyAtPiBQTEwgb3V0ICovCisJCWNhbGNfZnJlcSAvPSAqc3lzX211bDsJLyogUExMIG91dCAtPiBSRUYgPT0gT1NDICovCisJCWNsa3NbTVBDNTEyeF9DTEtfUkVGXSA9IG1wYzUxMnhfY2xrX2ZpeGVkKCJyZWYiLCBjYWxjX2ZyZXEpOworCX0KK30KKworLyogTUNMSyBoZWxwZXJzIHt7eyAqLworCisvKgorICogaGVscGVyIGNvZGUgZm9yIHRoZSBNQ0xLIHN1YnRyZWUgc2V0dXAKKyAqCisgKiB0aGUgb3ZlcnZpZXcgaW4gc2VjdGlvbiA1LjIuNCBvZiB0aGUgTVBDNTEyMWUgUmVmZXJlbmNlIE1hbnVhbCByZXY0CisgKiBzdWdnZXN0cyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlICJQU0MgY2xvY2sgZ2VuZXJhdGlvbiIgYXJlIGVxdWFsLAorICogYW5kIHRoYXQgb25lIG1pZ2h0IHJlLXVzZSB0aGUgUFNDIHNldHVwIGZvciBNU0NBTiBjbG9jayBnZW5lcmF0aW9uCisgKiAoc2VjdGlvbiA1LjIuNSkgYXMgd2VsbCwgYXQgbGVhc3QgdGhlIGxvZ2ljIGlmIG5vdCB0aGUgZGF0YSBmb3IKKyAqIGRlc2NyaXB0aW9uCisgKgorICogdGhlIGRldGFpbHMgKHN0YXJ0aW5nIGF0IHBhZ2UgNS0yMCkgc2hvdyBkaWZmZXJlbmNlcyBpbiB0aGUgc3BlY2lmaWMKKyAqIGlucHV0cyBvZiB0aGUgZmlyc3QgbXV4IHN0YWdlICgiY2FuIGNsayBpbiIsICJzcGRpZiB0eCIpLCBhbmQgdGhlCisgKiBmYWN0dWFsIG5vbi1hdmFpbGFiaWxpdHkgb2YgdGhlIHNlY29uZCBtdXggc3RhZ2UgKGl0J3MgcHJlc2VudCB5ZXQKKyAqIG9ubHkgb25lIGlucHV0IGlzIHZhbGlkKQorICoKKyAqIHRoZSBNU0NBTiBjbG9jayByZWxhdGVkIHJlZ2lzdGVycyAoc3RhcnRpbmcgYXQgcGFnZSA1LTM1KSBhbGwKKyAqIHJlZmVyZW5jZSAic3BkaWYgY2xrIiBhdCB0aGUgZmlyc3QgbXV4IHN0YWdlIGFuZCBkb24ndCBtZW50aW9uIGFueQorICogImNhbiBjbGsiIGF0IGFsbCwgd2hpY2ggc29tZWhvdyBpcyB1bmV4cGVjdGVkCisgKgorICogVE9ETyByZS1jaGVjayB0aGUgZG9jdW1lbnQsIGFuZCBjbGFyaWZ5IHdoZXRoZXIgdGhlIFJNIGlzIGNvcnJlY3QgaW4KKyAqIHRoZSBvdmVydmlldyBvciBpbiB0aGUgZGV0YWlscywgYW5kIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2UgaXMgYQorICogY2xpcGJvYXJkIGluZHVjZWQgZXJyb3Igb3IgcmVzdWx0cyBmcm9tIGNoaXAgcmV2aXNpb25zCisgKgorICogaXQgdHVybnMgb3V0IHRoYXQgdGhlIFJNIHJldjQgYXMgb2YgMjAxMi0wNiB0YWxrcyBhYm91dCAiY2FuIiBmb3IgdGhlCisgKiBQU0NzIHdoaWxlIFJNIHJldjMgYXMgb2YgMjAwOC0xMCB0YWxrcyBhYm91dCAic3BkaWYiLCBzbyBJIGd1ZXNzIHRoYXQKKyAqIGZpcnN0IGEgZG9jIHVwZGF0ZSBpcyByZXF1aXJlZCB3aGljaCBiZXR0ZXIgcmVmbGVjdHMgcmVhbGl0eSBpbiB0aGUKKyAqIFNvQyBiZWZvcmUgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBmb2xsb3cgd2hpbGUgbm8gcXVlc3Rpb25zIHJlbWFpbgorICovCisKKy8qCisgKiBub3RlIHRoYXQgdGhpcyBkZWNsYXJhdGlvbiByYWlzZXMgYSBjaGVja3BhdGNoIHdhcm5pbmcsIGJ1dAorICogaXQncyB0aGUgdmVyeSBkYXRhIHR5cGUgZGljdGF0ZWQgYnkgPGxpbnV4L2Nsay1wcm92aWRlci5oPiwKKyAqICJmaXhpbmciIHRoaXMgd2FybmluZyB3aWxsIGJyZWFrIGNvbXBpbGF0aW9uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXJlbnRfbmFtZXNfbXV4MF9zcGRpZltdID0geworCSJzeXMiLCAicmVmIiwgInBzYy1tY2xrLWluIiwgInNwZGlmLXR4IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJlbnRfbmFtZXNfbXV4MF9jYW5pbltdID0geworCSJzeXMiLCAicmVmIiwgInBzYy1tY2xrLWluIiwgImNhbi1jbGstaW4iLAorfTsKKworZW51bSBtY2xrX3R5cGUgeworCU1DTEtfVFlQRV9QU0MsCisJTUNMS19UWVBFX01TQ0FOLAorCU1DTEtfVFlQRV9TUERJRiwKKwlNQ0xLX1RZUEVfT1VUQ0xLLAorfTsKKworc3RydWN0IG1jbGtfc2V0dXBfZGF0YSB7CisJZW51bSBtY2xrX3R5cGUgdHlwZTsKKwlib29sIGhhc19tY2xrMTsKKwljb25zdCBjaGFyICpuYW1lX211eDA7CisJY29uc3QgY2hhciAqbmFtZV9lbjA7CisJY29uc3QgY2hhciAqbmFtZV9kaXYwOworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc19tdXgxWzJdOworCWNvbnN0IGNoYXIgKm5hbWVfbWNsazsKK307CisKKyNkZWZpbmUgTUNMS19TRVRVUF9EQVRBX1BTQyhpZCkgeyBcCisJTUNMS19UWVBFX1BTQywgMCwgXAorCSJwc2MiICNpZCAiLW11eDAiLCBcCisJInBzYyIgI2lkICItZW4wIiwgXAorCSJwc2MiICNpZCAiX21jbGtfZGl2IiwgXAorCXsgInBzYyIgI2lkICJfbWNsa19kaXYiLCAiZHVtbXkiLCB9LCBcCisJInBzYyIgI2lkICJfbWNsayIsIFwKK30KKworI2RlZmluZSBNQ0xLX1NFVFVQX0RBVEFfTVNDQU4oaWQpIHsgXAorCU1DTEtfVFlQRV9NU0NBTiwgMCwgXAorCSJtc2NhbiIgI2lkICItbXV4MCIsIFwKKwkibXNjYW4iICNpZCAiLWVuMCIsIFwKKwkibXNjYW4iICNpZCAiX21jbGtfZGl2IiwgXAorCXsgIm1zY2FuIiAjaWQgIl9tY2xrX2RpdiIsICJkdW1teSIsIH0sIFwKKwkibXNjYW4iICNpZCAiX21jbGsiLCBcCit9CisKKyNkZWZpbmUgTUNMS19TRVRVUF9EQVRBX1NQRElGIHsgXAorCU1DTEtfVFlQRV9TUERJRiwgMSwgXAorCSJzcGRpZi1tdXgwIiwgXAorCSJzcGRpZi1lbjAiLCBcCisJInNwZGlmX21jbGtfZGl2IiwgXAorCXsgInNwZGlmX21jbGtfZGl2IiwgInNwZGlmLXJ4IiwgfSwgXAorCSJzcGRpZl9tY2xrIiwgXAorfQorCisjZGVmaW5lIE1DTEtfU0VUVVBfREFUQV9PVVRDTEsoaWQpIHsgXAorCU1DTEtfVFlQRV9PVVRDTEssIDAsIFwKKwkib3V0IiAjaWQgIi1tdXgwIiwgXAorCSJvdXQiICNpZCAiLWVuMCIsIFwKKwkib3V0IiAjaWQgIl9tY2xrX2RpdiIsIFwKKwl7ICJvdXQiICNpZCAiX21jbGtfZGl2IiwgImR1bW15IiwgfSwgXAorCSJvdXQiICNpZCAiX2NsayIsIFwKK30KKworc3RhdGljIHN0cnVjdCBtY2xrX3NldHVwX2RhdGEgbWNsa19wc2NfZGF0YVtdID0geworCU1DTEtfU0VUVVBfREFUQV9QU0MoMCksCisJTUNMS19TRVRVUF9EQVRBX1BTQygxKSwKKwlNQ0xLX1NFVFVQX0RBVEFfUFNDKDIpLAorCU1DTEtfU0VUVVBfREFUQV9QU0MoMyksCisJTUNMS19TRVRVUF9EQVRBX1BTQyg0KSwKKwlNQ0xLX1NFVFVQX0RBVEFfUFNDKDUpLAorCU1DTEtfU0VUVVBfREFUQV9QU0MoNiksCisJTUNMS19TRVRVUF9EQVRBX1BTQyg3KSwKKwlNQ0xLX1NFVFVQX0RBVEFfUFNDKDgpLAorCU1DTEtfU0VUVVBfREFUQV9QU0MoOSksCisJTUNMS19TRVRVUF9EQVRBX1BTQygxMCksCisJTUNMS19TRVRVUF9EQVRBX1BTQygxMSksCit9OworCitzdGF0aWMgc3RydWN0IG1jbGtfc2V0dXBfZGF0YSBtY2xrX21zY2FuX2RhdGFbXSA9IHsKKwlNQ0xLX1NFVFVQX0RBVEFfTVNDQU4oMCksCisJTUNMS19TRVRVUF9EQVRBX01TQ0FOKDEpLAorCU1DTEtfU0VUVVBfREFUQV9NU0NBTigyKSwKKwlNQ0xLX1NFVFVQX0RBVEFfTVNDQU4oMyksCit9OworCitzdGF0aWMgc3RydWN0IG1jbGtfc2V0dXBfZGF0YSBtY2xrX3NwZGlmX2RhdGFbXSA9IHsKKwlNQ0xLX1NFVFVQX0RBVEFfU1BESUYsCit9OworCitzdGF0aWMgc3RydWN0IG1jbGtfc2V0dXBfZGF0YSBtY2xrX291dGNsa19kYXRhW10gPSB7CisJTUNMS19TRVRVUF9EQVRBX09VVENMSygwKSwKKwlNQ0xLX1NFVFVQX0RBVEFfT1VUQ0xLKDEpLAorCU1DTEtfU0VUVVBfREFUQV9PVVRDTEsoMiksCisJTUNMS19TRVRVUF9EQVRBX09VVENMSygzKSwKK307CisKKy8qIHNldHVwIHRoZSBNQ0xLIGNsb2NrIHN1YnRyZWUgb2YgYW4gaW5kaXZpZHVhbCBQU0MvTVNDQU4vU1BESUYgKi8KK3N0YXRpYyB2b2lkIG1wYzUxMnhfY2xrX3NldHVwX21jbGsoc3RydWN0IG1jbGtfc2V0dXBfZGF0YSAqZW50cnksIHNpemVfdCBpZHgpCit7CisJc2l6ZV90IGNsa3NfaWR4X3B1YiwgY2xrc19pZHhfaW50OworCXUzMiBfX2lvbWVtICptY2NyX3JlZzsJLyogTUNMSyBjb250cm9sIHJlZ2lzdGVyIChtdXgsIGVuLCBkaXYpICovCisJaW50IGRpdjsKKworCS8qIGRlcml2ZSBhIGZldyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBpbmRleCAqLworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE1DTEtfVFlQRV9QU0M6CisJCWNsa3NfaWR4X3B1YiA9IE1QQzUxMnhfQ0xLX1BTQzBfTUNMSyArIGlkeDsKKwkJY2xrc19pZHhfaW50ID0gTVBDNTEyeF9DTEtfTUNMS1NfRklSU1QKKwkJCSAgICAgKyAoaWR4KSAqIE1DTEtfTUFYX0lEWDsKKwkJbWNjcl9yZWcgPSAmY2xrcmVncy0+cHNjX2NjcltpZHhdOworCQlicmVhazsKKwljYXNlIE1DTEtfVFlQRV9NU0NBTjoKKwkJY2xrc19pZHhfcHViID0gTVBDNTEyeF9DTEtfTVNDQU4wX01DTEsgKyBpZHg7CisJCWNsa3NfaWR4X2ludCA9IE1QQzUxMnhfQ0xLX01DTEtTX0ZJUlNUCisJCQkgICAgICsgKE5SX1BTQ1MgKyBpZHgpICogTUNMS19NQVhfSURYOworCQltY2NyX3JlZyA9ICZjbGtyZWdzLT5tc2Nhbl9jY3JbaWR4XTsKKwkJYnJlYWs7CisJY2FzZSBNQ0xLX1RZUEVfU1BESUY6CisJCWNsa3NfaWR4X3B1YiA9IE1QQzUxMnhfQ0xLX1NQRElGX01DTEs7CisJCWNsa3NfaWR4X2ludCA9IE1QQzUxMnhfQ0xLX01DTEtTX0ZJUlNUCisJCQkgICAgICsgKE5SX1BTQ1MgKyBOUl9NU0NBTlMpICogTUNMS19NQVhfSURYOworCQltY2NyX3JlZyA9ICZjbGtyZWdzLT5zcGNjcjsKKwkJYnJlYWs7CisJY2FzZSBNQ0xLX1RZUEVfT1VUQ0xLOgorCQljbGtzX2lkeF9wdWIgPSBNUEM1MTJ4X0NMS19PVVQwX0NMSyArIGlkeDsKKwkJY2xrc19pZHhfaW50ID0gTVBDNTEyeF9DTEtfTUNMS1NfRklSU1QKKwkJCSAgICAgKyAoTlJfUFNDUyArIE5SX01TQ0FOUyArIE5SX1NQRElGUyArIGlkeCkKKwkJCSAgICAgKiBNQ0xLX01BWF9JRFg7CisJCW1jY3JfcmVnID0gJmNsa3JlZ3MtPm91dF9jY3JbaWR4XTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogdGhpcyB3YXMgZ3JhYmJlZCBmcm9tIHRoZSBQUENfQ0xPQ0sgaW1wbGVtZW50YXRpb24sIHdoaWNoCisJICogZW5mb3JjZWQgYSBzcGVjaWZpYyBNQ0xLIGRpdmlkZXIgd2hpbGUgdGhlIGNsb2NrIHdhcyBnYXRlZAorCSAqIGR1cmluZyBzZXR1cCAodGhhdCdzIGEgZG9jdW1lbnRlZCBoYXJkd2FyZSByZXF1aXJlbWVudCkKKwkgKgorCSAqIHRoZSBQUENfQ0xPQ0sgaW1wbGVtZW50YXRpb24gbWlnaHQgZXZlbiBoYXZlIHZpb2xhdGVkIHRoZQorCSAqICJNQ0xLIDw9IElQUyIgY29uc3RyYWludCwgdGhlIGZpeGVkIGRpdmlkZXIgdmFsdWUgb2YgMQorCSAqIHJlc3VsdHMgaW4gYSBkaXZpZGVyIG9mIDIgYW5kIHRodXMgTUNMSyA9IFNZUy8yIHdoaWNoIGVxdWFscworCSAqIENTQiB3aGljaCBpcyBncmVhdGVyIHRoYW4gSVBTOyB0aGUgc2VyaWFsIHBvcnQgc2V0dXAgbWF5IGhhdmUKKwkgKiBhZGp1c3RlZCB0aGUgZGl2aWRlciB3aGljaCB0aGUgY2xvY2sgc2V0dXAgbWlnaHQgaGF2ZSBsZWZ0IGluCisJICogYW4gdW5kZXNpcmFibGUgc3RhdGUKKwkgKgorCSAqIGluaXRpYWwgc2V0dXAgaXM6CisJICogLSBNQ0xLIDAgZnJvbSBTWVMKKwkgKiAtIE1DTEsgRElWIHN1Y2ggdG8gbm90IGV4Y2VlZCB0aGUgSVBTIGNsb2NrCisJICogLSBNQ0xLIDAgZW5hYmxlZAorCSAqIC0gTUNMSyAxIGZyb20gTUNMSyBESVYKKwkgKi8KKwlkaXYgPSBjbGtfZ2V0X3JhdGUoY2xrc1tNUEM1MTJ4X0NMS19TWVNdKTsKKwlkaXYgLz0gY2xrX2dldF9yYXRlKGNsa3NbTVBDNTEyeF9DTEtfSVBTXSk7CisJb3V0X2JlMzIobWNjcl9yZWcsICgwIDw8IDE2KSk7CisJb3V0X2JlMzIobWNjcl9yZWcsICgwIDw8IDE2KSB8ICgoZGl2IC0gMSkgPDwgMTcpKTsKKwlvdXRfYmUzMihtY2NyX3JlZywgKDEgPDwgMTYpIHwgKChkaXYgLSAxKSA8PCAxNykpOworCisJLyoKKwkgKiBjcmVhdGUgdGhlICdzdHJ1Y3QgY2xrJyBpdGVtcyBvZiB0aGUgTUNMSydzIGNsb2NrIHN1YnRyZWUKKwkgKgorCSAqIG5vdGUgdGhhdCBieSBkZXNpZ24gd2UgYWx3YXlzIGNyZWF0ZSBhbGwgbm9kZXMgYW5kIHdvbid0IHRha2UKKwkgKiBzaG9ydGN1dHMgaGVyZSwgYmVjYXVzZQorCSAqIC0gdGhlICJpbnRlcm5hbCIgTUNMS19ESVYgYW5kIE1DTEtfT1VUIHNpZ25hbCBpbiB0dXJuIGFyZQorCSAqICAgc2VsZWN0YWJsZSBpbnB1dHMgdG8gdGhlIENGTSB3aGlsZSB0aG9zZSB3aG8gImFjdHVhbGx5IHVzZSIKKwkgKiAgIHRoZSBQU0MvTVNDQU4vU1BESUYgKHNlcmlhbCBkcml2ZXJzIGV0IGFsKSBuZWVkIHRoZSBNQ0xLCisJICogICBmb3IgdGhlaXIgYml0cmF0ZQorCSAqIC0gaW4gdGhlIGFic2VuY2Ugb2YgImFsaWFzZXMiIGZvciBjbG9ja3Mgd2UgbmVlZCB0byBjcmVhdGUKKwkgKiAgIGluZGl2aWRpYWwgJ3N0cnVjdCBjbGsnIGl0ZW1zIGZvciB3aGF0ZXZlciBtaWdodCBnZXQKKwkgKiAgIHJlZmVyZW5jZWQgb3IgbG9va2VkIHVwLCBldmVuIGlmIHNldmVyYWwgb2YgdGhvc2UgaXRlbXMgYXJlCisJICogICBpZGVudGljYWwgZnJvbSB0aGUgbG9naWNhbCBQT1YgKHRoZWlyIHJhdGUgdmFsdWUpCisJICogLSBmb3IgZWFzaWVyIGZ1dHVyZSBtYWludGVuYW5jZSBhbmQgZm9yIGJldHRlciByZWZsZWN0aW9uIG9mCisJICogICB0aGUgU29DJ3MgZG9jdW1lbnRhdGlvbiwgaXQgYXBwZWFycyBhcHByb3ByaWF0ZSB0byBnZW5lcmF0ZQorCSAqICAgY2xvY2sgaXRlbXMgZXZlbiBmb3IgdGhvc2UgbXV4ZXJzIHdoaWNoIGFjdHVhbGx5IGFyZSBOT1BzCisJICogICAodGhvc2Ugd2l0aCB0d28gaW5wdXRzIG9mIHdoaWNoIG9uZSBpcyByZXNlcnZlZCkKKwkgKi8KKwljbGtzW2Nsa3NfaWR4X2ludCArIE1DTEtfSURYX01VWDBdID0gbXBjNTEyeF9jbGtfbXV4ZWQoCisJCQllbnRyeS0+bmFtZV9tdXgwLAorCQkJc29jX2hhc19tY2xrX211eDBfY2FuaW4oKQorCQkJCT8gJnBhcmVudF9uYW1lc19tdXgwX2NhbmluWzBdCisJCQkJOiAmcGFyZW50X25hbWVzX211eDBfc3BkaWZbMF0sCisJCQlBUlJBWV9TSVpFKHBhcmVudF9uYW1lc19tdXgwX3NwZGlmKSwKKwkJCW1jY3JfcmVnLCAxNCwgMik7CisJY2xrc1tjbGtzX2lkeF9pbnQgKyBNQ0xLX0lEWF9FTjBdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoCisJCQllbnRyeS0+bmFtZV9lbjAsIGVudHJ5LT5uYW1lX211eDAsCisJCQltY2NyX3JlZywgMTYpOworCWNsa3NbY2xrc19pZHhfaW50ICsgTUNMS19JRFhfRElWMF0gPSBtcGM1MTJ4X2Nsa19kaXZpZGVyKAorCQkJZW50cnktPm5hbWVfZGl2MCwKKwkJCWVudHJ5LT5uYW1lX2VuMCwgQ0xLX1NFVF9SQVRFX0dBVEUsCisJCQltY2NyX3JlZywgMTcsIDE1LCAwKTsKKwlpZiAoZW50cnktPmhhc19tY2xrMSkgeworCQljbGtzW2Nsa3NfaWR4X3B1Yl0gPSBtcGM1MTJ4X2Nsa19tdXhlZCgKKwkJCQllbnRyeS0+bmFtZV9tY2xrLAorCQkJCSZlbnRyeS0+cGFyZW50X25hbWVzX211eDFbMF0sCisJCQkJQVJSQVlfU0laRShlbnRyeS0+cGFyZW50X25hbWVzX211eDEpLAorCQkJCW1jY3JfcmVnLCA3LCAxKTsKKwl9IGVsc2UgeworCQljbGtzW2Nsa3NfaWR4X3B1Yl0gPSBtcGM1MTJ4X2Nsa19mYWN0b3IoCisJCQkJZW50cnktPm5hbWVfbWNsaywKKwkJCQllbnRyeS0+cGFyZW50X25hbWVzX211eDFbMF0sCisJCQkJMSwgMSk7CisJfQorfQorCisvKiB9fX0gTUNMSyBoZWxwZXJzICovCisKK3N0YXRpYyB2b2lkIG1wYzUxMnhfY2xrX3NldHVwX2Nsb2NrX3RyZWUoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGJ1c2ZyZXEpCit7CisJaW50IHN5c19tdWwsIHN5c19kaXYsIGlwc19kaXY7CisJaW50IG11bCwgZGl2OworCXNpemVfdCBtY2xrX2lkeDsKKwlpbnQgZnJlcTsKKworCS8qCisJICogZGV2ZWxvcGVyJ3Mgbm90ZXM6CisJICogLSBjb25zaWRlciB3aGV0aGVyIHRvIGhhbmRsZSBjbG9ja3Mgd2hpY2ggaGF2ZSBib3RoIGdhdGVzIGFuZAorCSAqICAgZGl2aWRlcnMgdmlhIGludGVybWVkaWF0ZXMgb3IgYnkgbWVhbnMgb2YgY29tcG9zaXRlcworCSAqIC0gZnJhY3Rpb25hbCBkaXZpZGVycyBhcHBlYXIgdG8gbm90IG1hcCB3ZWxsIHRvIGNvbXBvc2l0ZXMKKwkgKiAgIHNpbmNlIHRoZXkgY2FuIGJlIHNlZW4gYXMgYSBmaXhlZCBtdWx0aXBsaWVyIGFuZCBhbgorCSAqICAgYWRqdXN0YWJsZSBkaXZpZGVyLCB3aGlsZSBjb21wb3NpdGVzIGNhbiBvbmx5IGNvbWJpbmUgYXQKKwkgKiAgIG1vc3Qgb25lIG9mIGEgbXV4LCBkaXYsIGFuZCBnYXRlIGVhY2ggaW50byBvbmUgJ3N0cnVjdCBjbGsnCisJICogICBpdGVtCisJICogLSBQU0MvTVNDQU4vU1BESUYgY2xvY2sgZ2VuZXJhdGlvbiBPVE9IIGFscmVhZHkgaXMgdmVyeQorCSAqICAgc3BlY2lmaWMgYW5kIGNhbm5vdCBnZXQgbWFwcGVkIHRvIGNvbXBvbnNpdGVzIChhdCBsZWFzdCBub3QKKwkgKiAgIGEgc2luZ2xlIG9uZSwgbWF5YmUgdHdvIG9mIHRoZW0sIGJ1dCB0aGVuIHNvbWUgb2YgdGhlc2UKKwkgKiAgIGludGVybWVkaWF0ZSBjbG9jayBzaWduYWxzIGdldCByZWZlcmVuY2VkIGVsc2V3aGVyZSAoZS5nLgorCSAqICAgaW4gdGhlIGNsb2NrIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCwgQ0ZNKSBhbmQgdGh1cyBuZWVkCisJICogICBwdWJsaWNseSBhdmFpbGFibGUgbmFtZXMKKwkgKiAtIHRoZSBjdXJyZW50IHNvdXJjZSBsYXlvdXQgYXBwcm9wcmlhdGVseSByZWZsZWN0cyB0aGUKKwkgKiAgIGhhcmR3YXJlIHNldHVwLCBhbmQgaXQgd29ya3MsIHNvIGl0J3MgcXVlc3Rpb25hYmxlIHdoZXRoZXIKKwkgKiAgIGZ1cnRoZXIgY2hhbmdlcyB3aWxsIHJlc3VsdCBpbiBiaWcgZW5vdWdoIGEgYmVuZWZpdAorCSAqLworCisJLyogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFhUQUwvT1NDIGV4aXN0cywgaGF2ZSBSRUYgY3JlYXRlZCAqLworCW1wYzUxMnhfY2xrX3NldHVwX3JlZl9jbG9jayhucCwgYnVzZnJlcSwgJnN5c19tdWwsICZzeXNfZGl2LCAmaXBzX2Rpdik7CisKKwkvKiBub3cgc2V0dXAgdGhlIFJFRiAtPiBTWVMgLT4gQ1NCIC0+IElQUyBoaWVyYXJjaHkgKi8KKwljbGtzW01QQzUxMnhfQ0xLX1NZU10gPSBtcGM1MTJ4X2Nsa19mYWN0b3IoInN5cyIsICJyZWYiLAorCQkJCQkJICAgc3lzX211bCwgc3lzX2Rpdik7CisJY2xrc1tNUEM1MTJ4X0NMS19DU0JdID0gbXBjNTEyeF9jbGtfZmFjdG9yKCJjc2IiLCAic3lzIiwgMSwgMik7CisJY2xrc1tNUEM1MTJ4X0NMS19JUFNdID0gbXBjNTEyeF9jbGtfZGl2dGFibGUoImlwcyIsICJjc2IiLAorCQkJCQkJICAgICAmY2xrcmVncy0+c2NmcjEsIDIzLCAzLAorCQkJCQkJICAgICBkaXZ0YWJfMjM0Nik7CisJLyogbm93IHNldHVwIGFueXRoaW5nIGJlbG93IFNZUyBhbmQgQ1NCIGFuZCBJUFMgKi8KKworCWNsa3NbTVBDNTEyeF9DTEtfRERSX1VHXSA9IG1wYzUxMnhfY2xrX2ZhY3RvcigiZGRyLXVnIiwgInN5cyIsIDEsIDIpOworCisJLyoKKwkgKiB0aGUgUmVmZXJlbmNlIE1hbnVhbCBkaXNjdXNzZXMgdGhhdCBmb3IgU0RIQyBvbmx5IGV2ZW4gZGl2aWRlCisJICogcmF0aW9zIGFyZSBzdXBwb3J0ZWQgYmVjYXVzZSBjbG9jayBkb21haW4gc3luY2hyb25pemF0aW9uCisJICogYmV0d2VlbiAncGVyJyBhbmQgJ2lwZycgaXMgYnJva2VuOworCSAqIGtlZXAgdGhlIGRpdmlkZXIncyBiaXQgMCBjbGVhcmVkIChwZXIgcmVzZXQgdmFsdWUpLCBhbmQgb25seQorCSAqIGFsbG93IHRvIHNldHVwIHRoZSBkaXZpZGVyJ3MgYml0cyA3OjEsIHdoaWNoIHJlc3VsdHMgaW4gdGhhdAorCSAqIG9ubHkgZXZlbiBkaXZpZGUgcmF0aW9zIGNhbiBnZXQgY29uZmlndXJlZCB1cG9uIHJhdGUgY2hhbmdlczsKKwkgKiBrZWVwIHRoZSAieDQiIG5hbWUgYmVjYXVzZSB0aGlzIGJpdCBzaGlmdCBoYWNrIGlzIGFuIGludGVybmFsCisJICogaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGUgImZyYWN0aW9uYWwgZGl2aWRlciB3aXRoIHF1YXJ0ZXJzIgorCSAqIHNlbWFudGljcyByZW1haW5zCisJICovCisJY2xrc1tNUEM1MTJ4X0NMS19TREhDX3g0XSA9IG1wYzUxMnhfY2xrX2ZhY3Rvcigic2RoYy14NCIsICJjc2IiLCAyLCAxKTsKKwljbGtzW01QQzUxMnhfQ0xLX1NESENfVUddID0gbXBjNTEyeF9jbGtfZGl2aWRlcigic2RoYy11ZyIsICJzZGhjLXg0IiwgMCwKKwkJCQkJCQkmY2xrcmVncy0+c2NmcjIsIDEsIDcsCisJCQkJCQkJQ0xLX0RJVklERVJfT05FX0JBU0VEKTsKKwlpZiAoc29jX2hhc19zZGhjMigpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfU0RIQzJfVUddID0gbXBjNTEyeF9jbGtfZGl2aWRlcigKKwkJCQkic2RoYzItdWciLCAic2RoYy14NCIsIDAsICZjbGtyZWdzLT5zY2ZyMiwKKwkJCQk5LCA3LCBDTEtfRElWSURFUl9PTkVfQkFTRUQpOworCX0KKworCWNsa3NbTVBDNTEyeF9DTEtfRElVX3g0XSA9IG1wYzUxMnhfY2xrX2ZhY3RvcigiZGl1LXg0IiwgImNzYiIsIDQsIDEpOworCWNsa3NbTVBDNTEyeF9DTEtfRElVX1VHXSA9IG1wYzUxMnhfY2xrX2RpdmlkZXIoImRpdS11ZyIsICJkaXUteDQiLCAwLAorCQkJCQkJICAgICAgICZjbGtyZWdzLT5zY2ZyMSwgMCwgOCwKKwkJCQkJCSAgICAgICBDTEtfRElWSURFUl9PTkVfQkFTRUQpOworCisJLyoKKwkgKiB0aGUgInBvd2VyIGFyY2hpdGVjdHVyZSBQTEwiIHdhcyBzZXR1cCBmcm9tIGRhdGEgd2hpY2ggd2FzCisJICogc2FtcGxlZCBmcm9tIHRoZSByZXNldCBjb25maWcgd29yZCwgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNvbnNpZGVyZWQgZml4ZWQgYW5kIHJlYWQgb25seSAoaS5lLiBubworCSAqIGxvbmdlciBhZGp1c3RhYmxlLCBvciBubyBsb25nZXIgaW4gbmVlZCBvZiBhZGp1c3RtZW50KSwgd2hpY2gKKwkgKiBpcyB3aHkgd2UgZG9uJ3QgcmVnaXN0ZXIgYSBQTEwgaGVyZSBidXQgYXNzdW1lIGZpeGVkIGZhY3RvcnMKKwkgKi8KKwltdWwgPSBnZXRfY3BtZl9tdWx0X3gyKCk7CisJZGl2ID0gMjsJLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZyYWN0aW9uYWwgZmFjdG9yICovCisJY2xrc1tNUEM1MTJ4X0NMS19FMzAwXSA9IG1wYzUxMnhfY2xrX2ZhY3RvcigiZTMwMCIsICJjc2IiLCBtdWwsIGRpdik7CisKKwlpZiAoc29jX2hhc19tYngoKSkgeworCQljbGtzW01QQzUxMnhfQ0xLX01CWF9CVVNfVUddID0gbXBjNTEyeF9jbGtfZmFjdG9yKAorCQkJCSJtYngtYnVzLXVnIiwgImNzYiIsIDEsIDIpOworCQljbGtzW01QQzUxMnhfQ0xLX01CWF9VR10gPSBtcGM1MTJ4X2Nsa19kaXZ0YWJsZSgKKwkJCQkibWJ4LXVnIiwgIm1ieC1idXMtdWciLCAmY2xrcmVncy0+c2NmcjEsCisJCQkJMTQsIDMsIGRpdnRhYl8xMjM0KTsKKwkJY2xrc1tNUEM1MTJ4X0NMS19NQlhfM0RfVUddID0gbXBjNTEyeF9jbGtfZmFjdG9yKAorCQkJCSJtYngtM2QtdWciLCAibWJ4LXVnIiwgMSwgMSk7CisJfQorCWlmIChzb2NfaGFzX3BjaSgpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfUENJX1VHXSA9IG1wYzUxMnhfY2xrX2RpdnRhYmxlKAorCQkJCSJwY2ktdWciLCAiY3NiIiwgJmNsa3JlZ3MtPnNjZnIxLAorCQkJCTIwLCAzLCBkaXZ0YWJfMjM0Nik7CisJfQorCWlmIChzb2NfaGFzX25mY181MTI1KCkpIHsKKwkJLyoKKwkJICogWFhYIFRPRE8gaW1wbGVtZW50IDUxMjUgTkZDIGNsb2NrIHNldHVwIGxvZ2ljLAorCQkgKiB3aXRoIGhpZ2gvbG93IHBlcmlvZCBjb3VudGVycyBpbiBjbGtyZWdzLT5zY2ZyMywKKwkJICogY3VycmVudGx5IHRoZXJlIGFyZSBubyB1c2VycyBzbyBpdCdzIEVOT0lNUEwKKwkJICovCisJCWNsa3NbTVBDNTEyeF9DTEtfTkZDX1VHXSA9IEVSUl9QVFIoLUVOT1RTVVBQKTsKKwl9IGVsc2UgeworCQljbGtzW01QQzUxMnhfQ0xLX05GQ19VR10gPSBtcGM1MTJ4X2Nsa19kaXZ0YWJsZSgKKwkJCQkibmZjLXVnIiwgImlwcyIsICZjbGtyZWdzLT5zY2ZyMSwKKwkJCQk4LCAzLCBkaXZ0YWJfMTIzNCk7CisJfQorCWNsa3NbTVBDNTEyeF9DTEtfTFBDX1VHXSA9IG1wYzUxMnhfY2xrX2RpdnRhYmxlKCJscGMtdWciLCAiaXBzIiwKKwkJCQkJCQkmY2xrcmVncy0+c2NmcjEsIDExLCAzLAorCQkJCQkJCWRpdnRhYl8xMjM0KTsKKworCWNsa3NbTVBDNTEyeF9DTEtfTFBDXSA9IG1wYzUxMnhfY2xrX2dhdGVkKCJscGMiLCAibHBjLXVnIiwKKwkJCQkJCSAgJmNsa3JlZ3MtPnNjY3IxLCAzMCk7CisJY2xrc1tNUEM1MTJ4X0NMS19ORkNdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoIm5mYyIsICJuZmMtdWciLAorCQkJCQkJICAmY2xrcmVncy0+c2NjcjEsIDI5KTsKKwlpZiAoc29jX2hhc19wYXRhKCkpIHsKKwkJY2xrc1tNUEM1MTJ4X0NMS19QQVRBXSA9IG1wYzUxMnhfY2xrX2dhdGVkKAorCQkJCSJwYXRhIiwgImlwcyIsICZjbGtyZWdzLT5zY2NyMSwgMjgpOworCX0KKwkvKiBmb3IgUFNDcyB0aGVyZSBpcyBhICJyZWdpc3RlcnMiIGdhdGUgYW5kIGEgYml0cmF0ZSBNQ0xLIHN1YnRyZWUgKi8KKwlmb3IgKG1jbGtfaWR4ID0gMDsgbWNsa19pZHggPCBzb2NfbWF4X3BzY251bSgpOyBtY2xrX2lkeCsrKSB7CisJCWNoYXIgbmFtZVsxMl07CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInBzYyVkIiwgbWNsa19pZHgpOworCQljbGtzW01QQzUxMnhfQ0xLX1BTQzAgKyBtY2xrX2lkeF0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgKKwkJCQluYW1lLCAiaXBzIiwgJmNsa3JlZ3MtPnNjY3IxLCAyNyAtIG1jbGtfaWR4KTsKKwkJbXBjNTEyeF9jbGtfc2V0dXBfbWNsaygmbWNsa19wc2NfZGF0YVttY2xrX2lkeF0sIG1jbGtfaWR4KTsKKwl9CisJY2xrc1tNUEM1MTJ4X0NMS19QU0NfRklGT10gPSBtcGM1MTJ4X2Nsa19nYXRlZCgicHNjLWZpZm8iLCAiaXBzIiwKKwkJCQkJCSAgICAgICAmY2xrcmVncy0+c2NjcjEsIDE1KTsKKwlpZiAoc29jX2hhc19zYXRhKCkpIHsKKwkJY2xrc1tNUEM1MTJ4X0NMS19TQVRBXSA9IG1wYzUxMnhfY2xrX2dhdGVkKAorCQkJCSJzYXRhIiwgImlwcyIsICZjbGtyZWdzLT5zY2NyMSwgMTQpOworCX0KKwljbGtzW01QQzUxMnhfQ0xLX0ZFQ10gPSBtcGM1MTJ4X2Nsa19nYXRlZCgiZmVjIiwgImlwcyIsCisJCQkJCQkgICZjbGtyZWdzLT5zY2NyMSwgMTMpOworCWlmIChzb2NfaGFzX3BjaSgpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfUENJXSA9IG1wYzUxMnhfY2xrX2dhdGVkKAorCQkJCSJwY2kiLCAicGNpLXVnIiwgJmNsa3JlZ3MtPnNjY3IxLCAxMSk7CisJfQorCWNsa3NbTVBDNTEyeF9DTEtfRERSXSA9IG1wYzUxMnhfY2xrX2dhdGVkKCJkZHIiLCAiZGRyLXVnIiwKKwkJCQkJCSAgJmNsa3JlZ3MtPnNjY3IxLCAxMCk7CisJaWYgKHNvY19oYXNfZmVjMigpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfRkVDMl0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgKKwkJCQkiZmVjMiIsICJpcHMiLCAmY2xrcmVncy0+c2NjcjEsIDkpOworCX0KKworCWNsa3NbTVBDNTEyeF9DTEtfRElVXSA9IG1wYzUxMnhfY2xrX2dhdGVkKCJkaXUiLCAiZGl1LXVnIiwKKwkJCQkJCSAgJmNsa3JlZ3MtPnNjY3IyLCAzMSk7CisJaWYgKHNvY19oYXNfYXhlKCkpIHsKKwkJY2xrc1tNUEM1MTJ4X0NMS19BWEVdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoCisJCQkJImF4ZSIsICJjc2IiLCAmY2xrcmVncy0+c2NjcjIsIDMwKTsKKwl9CisJY2xrc1tNUEM1MTJ4X0NMS19NRU1dID0gbXBjNTEyeF9jbGtfZ2F0ZWQoIm1lbSIsICJpcHMiLAorCQkJCQkJICAmY2xrcmVncy0+c2NjcjIsIDI5KTsKKwljbGtzW01QQzUxMnhfQ0xLX1VTQjFdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoInVzYjEiLCAiY3NiIiwKKwkJCQkJCSAgICZjbGtyZWdzLT5zY2NyMiwgMjgpOworCWNsa3NbTVBDNTEyeF9DTEtfVVNCMl0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgidXNiMiIsICJjc2IiLAorCQkJCQkJICAgJmNsa3JlZ3MtPnNjY3IyLCAyNyk7CisJY2xrc1tNUEM1MTJ4X0NMS19JMkNdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoImkyYyIsICJpcHMiLAorCQkJCQkJICAmY2xrcmVncy0+c2NjcjIsIDI2KTsKKwkvKiBNU0NBTiBkaWZmZXJzIGZyb20gUFNDIHdpdGgganVzdCBvbmUgZ2F0ZSBmb3IgbXVsdGlwbGUgY29tcG9uZW50cyAqLworCWNsa3NbTVBDNTEyeF9DTEtfQkRMQ10gPSBtcGM1MTJ4X2Nsa19nYXRlZCgiYmRsYyIsICJpcHMiLAorCQkJCQkJICAgJmNsa3JlZ3MtPnNjY3IyLCAyNSk7CisJZm9yIChtY2xrX2lkeCA9IDA7IG1jbGtfaWR4IDwgQVJSQVlfU0laRShtY2xrX21zY2FuX2RhdGEpOyBtY2xrX2lkeCsrKQorCQltcGM1MTJ4X2Nsa19zZXR1cF9tY2xrKCZtY2xrX21zY2FuX2RhdGFbbWNsa19pZHhdLCBtY2xrX2lkeCk7CisJY2xrc1tNUEM1MTJ4X0NMS19TREhDXSA9IG1wYzUxMnhfY2xrX2dhdGVkKCJzZGhjIiwgInNkaGMtdWciLAorCQkJCQkJICAgJmNsa3JlZ3MtPnNjY3IyLCAyNCk7CisJLyogdGhlcmUgaXMgb25seSBvbmUgU1BESUYgY29tcG9uZW50LCB3aGljaCBzaGFyZXMgTUNMSyBzdXBwb3J0IGNvZGUgKi8KKwlpZiAoc29jX2hhc19zcGRpZigpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfU1BESUZdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoCisJCQkJInNwZGlmIiwgImlwcyIsICZjbGtyZWdzLT5zY2NyMiwgMjMpOworCQltcGM1MTJ4X2Nsa19zZXR1cF9tY2xrKCZtY2xrX3NwZGlmX2RhdGFbMF0sIDApOworCX0KKwlpZiAoc29jX2hhc19tYngoKSkgeworCQljbGtzW01QQzUxMnhfQ0xLX01CWF9CVVNdID0gbXBjNTEyeF9jbGtfZ2F0ZWQoCisJCQkJIm1ieC1idXMiLCAibWJ4LWJ1cy11ZyIsICZjbGtyZWdzLT5zY2NyMiwgMjIpOworCQljbGtzW01QQzUxMnhfQ0xLX01CWF0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgKKwkJCQkibWJ4IiwgIm1ieC11ZyIsICZjbGtyZWdzLT5zY2NyMiwgMjEpOworCQljbGtzW01QQzUxMnhfQ0xLX01CWF8zRF0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgKKwkJCQkibWJ4LTNkIiwgIm1ieC0zZC11ZyIsICZjbGtyZWdzLT5zY2NyMiwgMjApOworCX0KKwljbGtzW01QQzUxMnhfQ0xLX0lJTV0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgiaWltIiwgImNzYiIsCisJCQkJCQkgICZjbGtyZWdzLT5zY2NyMiwgMTkpOworCWlmIChzb2NfaGFzX3ZpdSgpKSB7CisJCWNsa3NbTVBDNTEyeF9DTEtfVklVXSA9IG1wYzUxMnhfY2xrX2dhdGVkKAorCQkJCSJ2aXUiLCAiY3NiIiwgJmNsa3JlZ3MtPnNjY3IyLCAxOCk7CisJfQorCWlmIChzb2NfaGFzX3NkaGMyKCkpIHsKKwkJY2xrc1tNUEM1MTJ4X0NMS19TREhDMl0gPSBtcGM1MTJ4X2Nsa19nYXRlZCgKKwkJCQkic2RoYy0yIiwgInNkaGMyLXVnIiwgJmNsa3JlZ3MtPnNjY3IyLCAxNyk7CisJfQorCisJaWYgKHNvY19oYXNfb3V0Y2xrKCkpIHsKKwkJc2l6ZV90IGlkeDsJLyogdXNlZCBhcyBtY2xrX2lkeCwganVzdCB0byB0cmltIGxpbmUgbGVuZ3RoICovCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShtY2xrX291dGNsa19kYXRhKTsgaWR4KyspCisJCQltcGM1MTJ4X2Nsa19zZXR1cF9tY2xrKCZtY2xrX291dGNsa19kYXRhW2lkeF0sIGlkeCk7CisJfQorCisJLyoKKwkgKiBleHRlcm5hbGx5IHByb3ZpZGVkIGNsb2NrcyAod2hlbiBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSwKKwkgKiBkZXZpY2UgdHJlZSBtYXkgc3BlY2lmeSB2YWx1ZXMgd2hpY2ggb3RoZXJ3aXNlIHdlcmUgdW5rbm93bikKKwkgKi8KKwlmcmVxID0gZ2V0X2ZyZXFfZnJvbV9kdCgicHNjX21jbGtfaW4iKTsKKwlpZiAoIWZyZXEpCisJCWZyZXEgPSAyNTAwMDAwMDsKKwljbGtzW01QQzUxMnhfQ0xLX1BTQ19NQ0xLX0lOXSA9IG1wYzUxMnhfY2xrX2ZpeGVkKCJwc2NfbWNsa19pbiIsIGZyZXEpOworCWlmIChzb2NfaGFzX21jbGtfbXV4MF9jYW5pbigpKSB7CisJCWZyZXEgPSBnZXRfZnJlcV9mcm9tX2R0KCJjYW5fY2xrX2luIik7CisJCWNsa3NbTVBDNTEyeF9DTEtfQ0FOX0NMS19JTl0gPSBtcGM1MTJ4X2Nsa19maXhlZCgKKwkJCQkiY2FuX2Nsa19pbiIsIGZyZXEpOworCX0gZWxzZSB7CisJCWZyZXEgPSBnZXRfZnJlcV9mcm9tX2R0KCJzcGRpZl90eF9pbiIpOworCQljbGtzW01QQzUxMnhfQ0xLX1NQRElGX1RYX0lOXSA9IG1wYzUxMnhfY2xrX2ZpeGVkKAorCQkJCSJzcGRpZl90eF9pbiIsIGZyZXEpOworCQlmcmVxID0gZ2V0X2ZyZXFfZnJvbV9kdCgic3BkaWZfcnhfaW4iKTsKKwkJY2xrc1tNUEM1MTJ4X0NMS19TUERJRl9UWF9JTl0gPSBtcGM1MTJ4X2Nsa19maXhlZCgKKwkJCQkic3BkaWZfcnhfaW4iLCBmcmVxKTsKKwl9CisKKwkvKiBmaXhlZCBmcmVxdWVuY3kgZm9yIEFDOTcsIGFsd2F5cyAyNC41NjdNSHogKi8KKwljbGtzW01QQzUxMnhfQ0xLX0FDOTddID0gbXBjNTEyeF9jbGtfZml4ZWQoImFjOTciLCAyNDU2NzAwMCk7CisKKwkvKgorCSAqIHByZS1lbmFibGUgdGhvc2UgImludGVybmFsIiBjbG9jayBpdGVtcyB3aGljaCBuZXZlciBnZXQKKwkgKiBjbGFpbWVkIGJ5IGFueSBwZXJpcGhlcmFsIGRyaXZlciwgdG8gbm90IGhhdmUgdGhlIGNsb2NrCisJICogc3Vic3lzdGVtIGRpc2FibGUgdGhlbSBsYXRlIGF0IHN0YXJ0dXAKKwkgKi8KKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19EVU1NWV0pOworCWNsa19wcmVwYXJlX2VuYWJsZShjbGtzW01QQzUxMnhfQ0xLX0UzMDBdKTsJLyogUG93ZXJQQyBDUFUgKi8KKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19ERFJdKTsJLyogRFJBTSAqLworCWNsa19wcmVwYXJlX2VuYWJsZShjbGtzW01QQzUxMnhfQ0xLX01FTV0pOwkvKiBTUkFNICovCisJY2xrX3ByZXBhcmVfZW5hYmxlKGNsa3NbTVBDNTEyeF9DTEtfSVBTXSk7CS8qIFNvQyBwZXJpcGggKi8KKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19MUENdKTsJLyogYm9vdCBtZWRpYSAqLworfQorCisvKgorICogcmVnaXN0ZXJzIHRoZSBzZXQgb2YgcHVibGljIGNsb2NrcyAodGhvc2UgbGlzdGVkIGluIHRoZSBkdC1iaW5kaW5ncy8KKyAqIGhlYWRlciBmaWxlKSBmb3IgT0YgbG9va3Vwcywga2VlcHMgdGhlIGludGVybWVkaWF0ZXMgcHJpdmF0ZSB0byB1cworICovCitzdGF0aWMgdm9pZCBtcGM1MTIxX2Nsa19yZWdpc3Rlcl9vZl9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNsa19kYXRhLmNsa3MgPSBjbGtzOworCWNsa19kYXRhLmNsa19udW0gPSBNUEM1MTJ4X0NMS19MQVNUX1BVQkxJQyArIDE7CS8qIF9ub3RfIEFSUkFZX1NJWkUoKSAqLworCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7Cit9CisKKy8qCisgKiB0ZW1wb3Jhcnkgc3VwcG9ydCBmb3IgdGhlIHBlcmlvZCBvZiB0aW1lIGJldHdlZW4gaW50cm9kdWN0aW9uIG9mIENDRgorICogc3VwcG9ydCBhbmQgdGhlIGFkanVzdG1lbnQgb2YgcGVyaXBoZXJhbCBkcml2ZXJzIHRvIE9GIGJhc2VkIGxvb2t1cHMKKyAqLworc3RhdGljIHZvaWQgbXBjNTEyMV9jbGtfcHJvdmlkZV9taWdyYXRpb25fc3VwcG9ydCh2b2lkKQoreworCisJLyoKKwkgKiBwcmUtZW5hYmxlIHRob3NlIGNsb2NrIGl0ZW1zIHdoaWNoIGFyZSBub3QgeWV0IGFwcHJvcHJpYXRlbHkKKwkgKiBhY3F1aXJlZCBieSB0aGVpciBwZXJpcGhlcmFsIGRyaXZlcgorCSAqCisJICogdGhlIFBDSSBjbG9jayBjYW5ub3QgZ2V0IGFjcXVpcmVkIGJ5IGl0cyBwZXJpcGhlcmFsIGRyaXZlciwKKwkgKiBiZWNhdXNlIGZvciB0aGlzIHBsYXRmb3JtIHRoZSBkcml2ZXIgd29uJ3QgcHJvYmUoKSwgaW5zdGVhZAorCSAqIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgZnJvbSB3aXRoaW4gdGhlIC5zZXR1cF9hcmNoKCkgcm91dGluZQorCSAqIGF0IGEgcG9pbnQgaW4gdGltZSB3aGVyZSB0aGUgY2xvY2sgcHJvdmlkZXIgaGFzIG5vdCBiZWVuCisJICogc2V0dXAgeWV0IGFuZCB0aHVzIGlzbid0IGF2YWlsYWJsZSB5ZXQKKwkgKgorCSAqIHNvIHdlICJwcmUtZW5hYmxlIiB0aGUgY2xvY2sgaGVyZSwgdG8gbm90IGhhdmUgdGhlIGNsb2NrCisJICogc3Vic3lzdGVtIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGlzIGl0ZW0gaW4gYSBsYXRlIGluaXQgY2FsbAorCSAqCisJICogdGhpcyBQQ0kgY2xvY2sgcHJlLWVuYWJsZSB3b3JrYXJvdW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZXJlCisJICogYXJlIGRldmljZSB0cmVlIG5vZGVzIGZvciBQQ0kgYW5kIHRodXMgdGhlIHBlcmlwaGVyYWwgZHJpdmVyCisJICogaGFzIGF0dGFjaGVkIHRvIGJyaWRnZXMsIG90aGVyd2lzZSB0aGUgUENJIGNsb2NrIHJlbWFpbnMKKwkgKiB1bnVzZWQgYW5kIHNvIGl0IGdldHMgZGlzYWJsZWQKKwkgKi8KKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19QU0MzX01DTEtdKTsvKiBzZXJpYWwgY29uc29sZSAqLworCWlmIChvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAicGNpIiwgImZzbCxtcGM1MTIxLXBjaSIpKQorCQljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19QQ0ldKTsKK30KKworLyoKKyAqIHRob3NlIG1hY3JvcyBhcmUgbm90IGV4YWN0bHkgcHJldHR5LCBidXQgdGhleSBlbmNhcHN1bGF0ZSBhIGxvdAorICogb2YgY29weSduJ3Bhc3RlIGhlYXZ5IGNvZGUgd2hpY2ggaXMgZXZlbiBtb3JlIHVnbHksIGFuZCByZWR1Y2UKKyAqIHRoZSBwb3RlbnRpYWwgZm9yIGluY29uc2lzdGVuY2llcyBpbiB0aG9zZSBtYW55IGNvZGUgY29waWVzCisgKi8KKyNkZWZpbmUgRk9SX05PREVTKGNvbXBhdG5hbWUpIFwKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsIGNvbXBhdG5hbWUpCisKKyNkZWZpbmUgTk9ERV9QUkVQIGRvIHsgXAorCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOyBcCisJc25wcmludGYoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCAiJTA4eC4lcyIsIHJlcy5zdGFydCwgbnAtPm5hbWUpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5PREVfQ0hLKGNsa25hbWUsIGNsa2l0ZW0sIHJlZ25vZGUsIHJlZ2ZsYWcpIGRvIHsgXAorCXN0cnVjdCBjbGsgKmNsazsgXAorCWNsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgY2xrbmFtZSk7IFwKKwlpZiAoSVNfRVJSKGNsaykpIHsgXAorCQljbGsgPSBjbGtpdGVtOyBcCisJCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBjbGtuYW1lLCBkZXZuYW1lKTsgXAorCQlpZiAocmVnbm9kZSkgXAorCQkJY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIGNsa25hbWUsIG5wLT5uYW1lKTsgXAorCQlkaWRfcmVnaXN0ZXIgfD0gRElEX1JFR18gIyMgcmVnZmxhZzsgXAorCQlwcl9kZWJ1ZygiY2xvY2sgYWxpYXMgbmFtZSAnJXMnIGZvciBkZXYgJyVzJyBwb2ludGVyICVwXG4iLCBcCisJCQkgY2xrbmFtZSwgZGV2bmFtZSwgY2xrKTsgXAorCX0gZWxzZSB7IFwKKwkJY2xrX3B1dChjbGspOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisvKgorICogcmVnaXN0ZXIgc291cmNlIGNvZGUgcHJvdmlkZWQgZmFsbGJhY2sgcmVzdWx0cyBmb3IgY2xvY2sgbG9va3VwcywKKyAqIHRoZXNlIGdldCBjb25zdWx0ZWQgd2hlbiBPRiBiYXNlZCBjbG9jayBsb29rdXAgZmFpbHMgKHRoYXQgaXMgaW4gdGhlCisgKiBjYXNlIG9mIG5vdCB5ZXQgYWRqdXN0ZWQgZGV2aWNlIHRyZWUgZGF0YSwgd2hlcmUgY2xvY2sgcmVsYXRlZCBzcGVjcworICogYXJlIG1pc3NpbmcpCisgKi8KK3N0YXRpYyB2b2lkIG1wYzUxMjFfY2xrX3Byb3ZpZGVfYmFja3dhcmRzX2NvbXBhdCh2b2lkKQoreworCWVudW0gZGlkX3JlZ19mbGFncyB7CisJCURJRF9SRUdfUFNDCT0gQklUKDApLAorCQlESURfUkVHX1BTQ0ZJRk8JPSBCSVQoMSksCisJCURJRF9SRUdfTkZDCT0gQklUKDIpLAorCQlESURfUkVHX0NBTgk9IEJJVCgzKSwKKwkJRElEX1JFR19JMkMJPSBCSVQoNCksCisJCURJRF9SRUdfRElVCT0gQklUKDUpLAorCQlESURfUkVHX1ZJVQk9IEJJVCg2KSwKKwkJRElEX1JFR19GRUMJPSBCSVQoNyksCisJCURJRF9SRUdfVVNCCT0gQklUKDgpLAorCQlESURfUkVHX1BBVEEJPSBCSVQoOSksCisJfTsKKworCWludCBkaWRfcmVnaXN0ZXI7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCWludCBpZHg7CisJY2hhciBkZXZuYW1lWzMyXTsKKworCWRpZF9yZWdpc3RlciA9IDA7CisKKwlGT1JfTk9ERVMobXBjNTEyeF9zZWxlY3RfcHNjX2NvbXBhdCgpKSB7CisJCU5PREVfUFJFUDsKKwkJaWR4ID0gKHJlcy5zdGFydCA+PiA4KSAmIDB4ZjsKKwkJTk9ERV9DSEsoImlwZyIsIGNsa3NbTVBDNTEyeF9DTEtfUFNDMCArIGlkeF0sIDAsIFBTQyk7CisJCU5PREVfQ0hLKCJtY2xrIiwgY2xrc1tNUEM1MTJ4X0NMS19QU0MwX01DTEsgKyBpZHhdLCAwLCBQU0MpOworCX0KKworCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtcHNjLWZpZm8iKSB7CisJCU5PREVfUFJFUDsKKwkJTk9ERV9DSEsoImlwZyIsIGNsa3NbTVBDNTEyeF9DTEtfUFNDX0ZJRk9dLCAxLCBQU0NGSUZPKTsKKwl9CisKKwlGT1JfTk9ERVMoImZzbCxtcGM1MTIxLW5mYyIpIHsKKwkJTk9ERV9QUkVQOworCQlOT0RFX0NISygiaXBnIiwgY2xrc1tNUEM1MTJ4X0NMS19ORkNdLCAwLCBORkMpOworCX0KKworCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtbXNjYW4iKSB7CisJCU5PREVfUFJFUDsKKwkJaWR4ID0gMDsKKwkJaWR4ICs9IChyZXMuc3RhcnQgJiAweDIwMDApID8gMiA6IDA7CisJCWlkeCArPSAocmVzLnN0YXJ0ICYgMHgwMDgwKSA/IDEgOiAwOworCQlOT0RFX0NISygiaXBnIiwgY2xrc1tNUEM1MTJ4X0NMS19CRExDXSwgMCwgQ0FOKTsKKwkJTk9ERV9DSEsoIm1jbGsiLCBjbGtzW01QQzUxMnhfQ0xLX01TQ0FOMF9NQ0xLICsgaWR4XSwgMCwgQ0FOKTsKKwl9CisKKwkvKgorCSAqIGRvIHJlZ2lzdGVyIHRoZSAnaXBzJywgJ3N5cycsIGFuZCAncmVmJyBuYW1lcyBnbG9iYWxseQorCSAqIGluc3RlYWQgb2YgaW5zaWRlIGVhY2ggaW5kaXZpZHVhbCBDQU4gbm9kZSwgYXMgdGhlcmUgaXMgbm8KKwkgKiBwb3RlbnRpYWwgZm9yIGEgbmFtZSBjb25mbGljdCAoaW4gY29udHJhc3QgdG8gJ2lwZycgYW5kICdtY2xrJykKKwkgKi8KKwlpZiAoZGlkX3JlZ2lzdGVyICYgRElEX1JFR19DQU4pIHsKKwkJY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtzW01QQzUxMnhfQ0xLX0lQU10sICJpcHMiLCBOVUxMKTsKKwkJY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtzW01QQzUxMnhfQ0xLX1NZU10sICJzeXMiLCBOVUxMKTsKKwkJY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtzW01QQzUxMnhfQ0xLX1JFRl0sICJyZWYiLCBOVUxMKTsKKwl9CisKKwlGT1JfTk9ERVMoImZzbCxtcGM1MTIxLWkyYyIpIHsKKwkJTk9ERV9QUkVQOworCQlOT0RFX0NISygiaXBnIiwgY2xrc1tNUEM1MTJ4X0NMS19JMkNdLCAwLCBJMkMpOworCX0KKworCS8qCisJICogd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgSTJDIGRyaXZlciBkb2VzIGFuICJhbm9ueW1vdXMiCisJICogbG9va3VwIChOVUxMIG5hbWUgc3BlYywgd2hpY2ggeWllbGRzIHRoZSBmaXJzdCBjbG9jayBzcGVjKSBmb3IKKwkgKiB3aGljaCB3ZSBjYW5ub3QgcmVnaXN0ZXIgYW4gYWxpYXMgLS0gYSBfZ2xvYmFsXyAnaXBnJyBhbGlhcyB0aGF0CisJICogaXMgbm90IGJvdW5kIHRvIGFueSBkZXZpY2UgbmFtZSBhbmQgcmV0dXJucyB0aGUgSTJDIGNsb2NrIGl0ZW0KKwkgKiBpcyBub3QgYSBnb29kIGlkZWEKKwkgKgorCSAqIHNvIHdlIGhhdmUgdGhlIGxvb2t1cCBpbiB0aGUgcGVyaXBoZXJhbCBkcml2ZXIgZmFpbCwgd2hpY2ggaXMKKwkgKiBzaWxlbnQgYW5kIG5vbi1mYXRhbCwgYW5kIHByZS1lbmFibGUgdGhlIGNsb2NrIGl0ZW0gaGVyZSBzdWNoCisJICogdGhhdCByZWdpc3RlciBhY2Nlc3MgaXMgcG9zc2libGUKKwkgKgorCSAqIHNlZSBjb21taXQgYjNiZmNlMmIgImkyYzogbXBjOiBjbGVhbnVwIGNsb2NrIEFQSSB1c2UiIGZvcgorCSAqIGRldGFpbHMsIGFkanVzdGluZyBzL05VTEwvImlwZyIvIGluIGkyYy1tcGMuYyB3b3VsZCBtYWtlIHRoaXMKKwkgKiB3b3JrYXJvdW5kIG9ic29sZXRlCisJICovCisJaWYgKGRpZF9yZWdpc3RlciAmIERJRF9SRUdfSTJDKQorCQljbGtfcHJlcGFyZV9lbmFibGUoY2xrc1tNUEM1MTJ4X0NMS19JMkNdKTsKKworCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtZGl1IikgeworCQlOT0RFX1BSRVA7CisJCU5PREVfQ0hLKCJpcGciLCBjbGtzW01QQzUxMnhfQ0xLX0RJVV0sIDEsIERJVSk7CisJfQorCisJRk9SX05PREVTKCJmc2wsbXBjNTEyMS12aXUiKSB7CisJCU5PREVfUFJFUDsKKwkJTk9ERV9DSEsoImlwZyIsIGNsa3NbTVBDNTEyeF9DTEtfVklVXSwgMCwgVklVKTsKKwl9CisKKwkvKgorCSAqIG5vdGUgdGhhdCAyNzcxMzk5YSAiZnNfZW5ldDogY2xlYW51cCBjbG9jayBBUEkgdXNlIiBkaWQgdXNlIHRoZQorCSAqICJwZXIiIHN0cmluZyBmb3IgdGhlIGNsb2NrIGxvb2t1cCBpbiBjb250cmFzdCB0byB0aGUgImlwZyIgbmFtZQorCSAqIHdoaWNoIG1vc3Qgb3RoZXIgbm9kZXMgYXJlIHVzaW5nIC0tIHRoaXMgaXMgbm90IGEgZmF0YWwgdGhpbmcKKwkgKiBidXQganVzdCBzb21ldGhpbmcgdG8ga2VlcCBpbiBtaW5kIHdoZW4gZG9pbmcgY29tcGF0aWJpbGl0eQorCSAqIHJlZ2lzdHJhdGlvbiwgaXQncyBhIG5vbi1pc3N1ZSB3aXRoIHVwLXRvLWRhdGUgZGV2aWNlIHRyZWUgZGF0YQorCSAqLworCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtZmVjIikgeworCQlOT0RFX1BSRVA7CisJCU5PREVfQ0hLKCJwZXIiLCBjbGtzW01QQzUxMnhfQ0xLX0ZFQ10sIDAsIEZFQyk7CisJfQorCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtZmVjLW1kaW8iKSB7CisJCU5PREVfUFJFUDsKKwkJTk9ERV9DSEsoInBlciIsIGNsa3NbTVBDNTEyeF9DTEtfRkVDXSwgMCwgRkVDKTsKKwl9CisJLyoKKwkgKiBNUEM1MTI1IGhhcyB0d28gRkVDczogRkVDMSBhdCAweDI4MDAsIEZFQzIgYXQgMHg0ODAwOworCSAqIHRoZSBjbG9jayBpdGVtcyBkb24ndCAiZm9ybSBhbiBhcnJheSIgc2luY2UgRkVDMiB3YXMKKwkgKiBhZGRlZCBvbmx5IGxhdGVyIGFuZCB3YXMgbm90IGFsbG93ZWQgdG8gc2hpZnQgYWxsIG90aGVyCisJICogY2xvY2sgaXRlbSBpbmRpY2VzLCBzbyB0aGUgbnVtYmVycyBhcmVuJ3QgYWRqYWNlbnQKKwkgKi8KKwlGT1JfTk9ERVMoImZzbCxtcGM1MTI1LWZlYyIpIHsKKwkJTk9ERV9QUkVQOworCQlpZiAocmVzLnN0YXJ0ICYgMHg0MDAwKQorCQkJaWR4ID0gTVBDNTEyeF9DTEtfRkVDMjsKKwkJZWxzZQorCQkJaWR4ID0gTVBDNTEyeF9DTEtfRkVDOworCQlOT0RFX0NISygicGVyIiwgY2xrc1tpZHhdLCAwLCBGRUMpOworCX0KKworCUZPUl9OT0RFUygiZnNsLG1wYzUxMjEtdXNiMi1kciIpIHsKKwkJTk9ERV9QUkVQOworCQlpZHggPSAocmVzLnN0YXJ0ICYgMHg0MDAwKSA/IDEgOiAwOworCQlOT0RFX0NISygiaXBnIiwgY2xrc1tNUEM1MTJ4X0NMS19VU0IxICsgaWR4XSwgMCwgVVNCKTsKKwl9CisKKwlGT1JfTk9ERVMoImZzbCxtcGM1MTIxLXBhdGEiKSB7CisJCU5PREVfUFJFUDsKKwkJTk9ERV9DSEsoImlwZyIsIGNsa3NbTVBDNTEyeF9DTEtfUEFUQV0sIDAsIFBBVEEpOworCX0KKworCS8qCisJICogdHJ5IHRvIGNvbGxhcHNlIGRpYWdub3N0aWNzIGludG8gYSBzaW5nbGUgbGluZSBvZiBvdXRwdXQgeWV0CisJICogcHJvdmlkZSBhIGZ1bGwgbGlzdCBvZiB3aGF0IGlzIG1pc3NpbmcsIHRvIGF2b2lkIG5vaXNlIGluIHRoZQorCSAqIGFic2VuY2Ugb2YgdXAtdG8tZGF0ZSBkZXZpY2UgdHJlZSBkYXRhIC0tIGJhY2t3YXJkcworCSAqIGNvbXBhdGliaWxpdHkgdG8gb2xkIERUQnMgaXMgYSByZXF1aXJlbWVudCwgdXBkYXRlcyBtYXkgYmUKKwkgKiBkZXNpcmFibGUgb3IgcHJlZmVycmFibGUgYnV0IGFyZSBub3QgYXQgYWxsIG1hbmRhdG9yeQorCSAqLworCWlmIChkaWRfcmVnaXN0ZXIpIHsKKwkJcHJfbm90aWNlKCJkZXZpY2UgdHJlZSBsYWNrcyBjbG9jayBzcGVjcywgYWRkaW5nIGZhbGxiYWNrcyAoMHgleCwlcyVzJXMlcyVzJXMlcyVzJXMlcylcbiIsCisJCQkgIGRpZF9yZWdpc3RlciwKKwkJCSAgKGRpZF9yZWdpc3RlciAmIERJRF9SRUdfUFNDKSA/ICIgUFNDIiA6ICIiLAorCQkJICAoZGlkX3JlZ2lzdGVyICYgRElEX1JFR19QU0NGSUZPKSA/ICIgUFNDRklGTyIgOiAiIiwKKwkJCSAgKGRpZF9yZWdpc3RlciAmIERJRF9SRUdfTkZDKSA/ICIgTkZDIiA6ICIiLAorCQkJICAoZGlkX3JlZ2lzdGVyICYgRElEX1JFR19DQU4pID8gIiBDQU4iIDogIiIsCisJCQkgIChkaWRfcmVnaXN0ZXIgJiBESURfUkVHX0kyQykgPyAiIEkyQyIgOiAiIiwKKwkJCSAgKGRpZF9yZWdpc3RlciAmIERJRF9SRUdfRElVKSA/ICIgRElVIiA6ICIiLAorCQkJICAoZGlkX3JlZ2lzdGVyICYgRElEX1JFR19WSVUpID8gIiBWSVUiIDogIiIsCisJCQkgIChkaWRfcmVnaXN0ZXIgJiBESURfUkVHX0ZFQykgPyAiIEZFQyIgOiAiIiwKKwkJCSAgKGRpZF9yZWdpc3RlciAmIERJRF9SRUdfVVNCKSA/ICIgVVNCIiA6ICIiLAorCQkJICAoZGlkX3JlZ2lzdGVyICYgRElEX1JFR19QQVRBKSA/ICIgUEFUQSIgOiAiIik7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoImRldmljZSB0cmVlIGhhcyBjbG9jayBzcGVjcywgbm8gZmFsbGJhY2tzIGFkZGVkXG4iKTsKKwl9Cit9CisKK2ludCBfX2luaXQgbXBjNTEyMV9jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2xrX25wOworCWludCBidXNmcmVxOworCisJLyogbWFwIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVycyAqLworCWNsa19ucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjNTEyMS1jbG9jayIpOworCWlmICghY2xrX25wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljbGtyZWdzID0gb2ZfaW9tYXAoY2xrX25wLCAwKTsKKwlXQVJOX09OKCFjbGtyZWdzKTsKKworCS8qIGRldGVybWluZSB0aGUgU29DIHZhcmlhbnQgd2UgcnVuIG9uICovCisJbXBjNTEyeF9jbGtfZGV0ZXJtaW5lX3NvYygpOworCisJLyogaW52YWxpZGF0ZSBhbGwgbm90IHlldCByZWdpc3RlcmVkIGNsb2NrIHNsb3RzICovCisJbXBjNTEyeF9jbGtfcHJlc2V0X2RhdGEoKTsKKworCS8qCisJICogaGF2ZSB0aGUgZGV2aWNlIHRyZWUgc2Nhbm5lZCBmb3IgImZpeGVkLWNsb2NrIiBub2RlcyAod2hpY2gKKwkgKiBpbmNsdWRlcyB0aGUgb3NjaWxsYXRvciBub2RlIGlmIHRoZSBib2FyZCdzIERUIHByb3ZpZGVzIG9uZSkKKwkgKi8KKwlvZl9jbGtfaW5pdChOVUxMKTsKKworCS8qCisJICogYWRkIGEgZHVtbXkgY2xvY2sgZm9yIHRob3NlIHNpdHVhdGlvbnMgd2hlcmUgYSBjbG9jayBzcGVjIGlzCisJICogcmVxdWlyZWQgeWV0IG5vIHJlYWwgY2xvY2sgaXMgaW52b2x2ZWQKKwkgKi8KKwljbGtzW01QQzUxMnhfQ0xLX0RVTU1ZXSA9IG1wYzUxMnhfY2xrX2ZpeGVkKCJkdW1teSIsIDApOworCisJLyoKKwkgKiBoYXZlIGFsbCB0aGUgcmVhbCBub2RlcyBpbiB0aGUgY2xvY2sgdHJlZSBwb3B1bGF0ZWQgZnJvbSBSRUYKKwkgKiBkb3duIHRvIGFsbCBsZWF2ZXMsIGVpdGhlciBzdGFydGluZyBmcm9tIHRoZSBPU0Mgbm9kZSBvciBmcm9tCisJICogYSBSRUYgcm9vdCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gdGhlIElQUyBidXMgY2xvY2sgaW5wdXQKKwkgKi8KKwlidXNmcmVxID0gZ2V0X2ZyZXFfZnJvbV9kdCgiYnVzLWZyZXF1ZW5jeSIpOworCW1wYzUxMnhfY2xrX3NldHVwX2Nsb2NrX3RyZWUoY2xrX25wLCBidXNmcmVxKTsKKworCS8qIHJlZ2lzdGVyIGFzIGFuIE9GIGNsb2NrIHByb3ZpZGVyICovCisJbXBjNTEyMV9jbGtfcmVnaXN0ZXJfb2ZfcHJvdmlkZXIoY2xrX25wKTsKKworCS8qCisJICogdW5icmVhayBub3QgeWV0IGFkanVzdGVkIHBlcmlwaGVyYWwgZHJpdmVycyBkdXJpbmcgbWlncmF0aW9uCisJICogdG93YXJkcyBmdWxseSBvcGVyYXRpb25hbCBjb21tb24gY2xvY2sgc3VwcG9ydCwgYW5kIGFsbG93CisJICogb3BlcmF0aW9uIGluIHRoZSBhYnNlbmNlIG9mIGNsb2NrIHJlbGF0ZWQgZGV2aWNlIHRyZWUgc3BlY3MKKwkgKi8KKwltcGM1MTIxX2Nsa19wcm92aWRlX21pZ3JhdGlvbl9zdXBwb3J0KCk7CisJbXBjNTEyMV9jbGtfcHJvdmlkZV9iYWNrd2FyZHNfY29tcGF0KCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGEzNzYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQXV0aG9yOiBKb2huIFJpZ2J5IDxqcmlnYnlAZnJlZXNjYWxlLmNvbT4KLSAqCi0gKiBJbXBsZW1lbnRzIHRoZSBjbGsgYXBpIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9jbGsuaAotICoKLSAqICAgIE9yaWdpbmFsIGJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jCi0gKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkLgotICogICAgV3JpdHRlbiBieSBEZWVwIEJsdWUgU29sdXRpb25zIExpbWl0ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGFzbS9tcGM1eHh4Lmg+Ci0jaW5jbHVkZSA8YXNtL21wYzUxMjEuaD4KLSNpbmNsdWRlIDxhc20vY2xrX2ludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAibXBjNTEyeC5oIgotCi0jdW5kZWYgQ0xLX0RFQlVHCi0KLXN0YXRpYyBpbnQgY2xvY2tzX2luaXRpYWxpemVkOwotCi0jZGVmaW5lIENMS19IQVNfUkFURQkweDEJLyogaGFzIHJhdGUgaW4gTUh6ICovCi0jZGVmaW5lIENMS19IQVNfQ1RSTAkweDIJLyogaGFzIGNvbnRyb2wgcmVnIGFuZCBiaXQgKi8KLQotc3RydWN0IGNsayB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCWNoYXIgbmFtZVszMl07Ci0JaW50IGZsYWdzOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0Jdm9pZCAoKmNhbGMpIChzdHJ1Y3QgY2xrICopOwotCXN0cnVjdCBjbGsgKnBhcmVudDsKLQlpbnQgcmVnLCBiaXQ7CQkvKiBDTEtfSEFTX0NUUkwgKi8KLQlpbnQgZGl2X3NoaWZ0OwkJLyogb25seSB1c2VkIGJ5IGdlbmVyaWNfZGl2X2Nsa19jYWxjICovCi19OwotCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICptcGM1MTIxX2Nsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKLQlpbnQgZGV2X21hdGNoOwotCWludCBpZF9tYXRjaDsKLQotCWlmIChkZXYgPT0gTlVMTCB8fCBpZCA9PSBOVUxMKQotCQlyZXR1cm4gY2xrOwotCi0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKLQkJZGV2X21hdGNoID0gaWRfbWF0Y2ggPSAwOwotCi0JCWlmIChkZXYgPT0gcC0+ZGV2KQotCQkJZGV2X21hdGNoKys7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDApCi0JCQlpZF9tYXRjaCsrOwotCQlpZiAoKGRldl9tYXRjaCB8fCBpZF9tYXRjaCkgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotI2lmZGVmIENMS19ERUJVRwotc3RhdGljIHZvaWQgZHVtcF9jbG9ja3Modm9pZCkKLXsKLQlzdHJ1Y3QgY2xrICpwOwotCi0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQlwcmludGsoS0VSTl9JTkZPICJDTE9DS1M6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKLQkJcHJfaW5mbygiICAlcz0lbGQiLCBwLT5uYW1lLCBwLT5yYXRlKTsKLQkJaWYgKHAtPnBhcmVudCkKLQkJCXByX2NvbnQoIiAlcz0lbGQiLCBwLT5wYXJlbnQtPm5hbWUsCi0JCQkgICAgICAgcC0+cGFyZW50LT5yYXRlKTsKLQkJaWYgKHAtPmZsYWdzICYgQ0xLX0hBU19DVFJMKQotCQkJcHJfY29udCgiIHJlZy9iaXQ9JWQvJWQiLCBwLT5yZWcsIHAtPmJpdCk7Ci0JCXByX2NvbnQoIlxuIik7Ci0JfQotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLX0KLSNkZWZpbmUJREVCVUdfQ0xLX0RVTVAoKSBkdW1wX2Nsb2NrcygpCi0jZWxzZQotI2RlZmluZQlERUJVR19DTEtfRFVNUCgpCi0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBtcGM1MTIxX2Nsa19wdXQoc3RydWN0IGNsayAqY2xrKQotewotCW1vZHVsZV9wdXQoY2xrLT5vd25lcik7Ci19Ci0KLSNkZWZpbmUgTlJQU0MgMTIKLQotc3RydWN0IG1wYzUxMnhfY2xvY2tjdGwgewotCXUzMiBzcG1yOwkJLyogU3lzdGVtIFBMTCBNb2RlIFJlZyAqLwotCXUzMiBzY2NyWzJdOwkJLyogU3lzdGVtIENsayBDdHJsIFJlZyAxICYgMiAqLwotCXUzMiBzY2ZyMTsJCS8qIFN5c3RlbSBDbGsgRnJlcSBSZWcgMSAqLwotCXUzMiBzY2ZyMjsJCS8qIFN5c3RlbSBDbGsgRnJlcSBSZWcgMiAqLwotCXUzMiByZXNlcnZlZDsKLQl1MzIgYmNyOwkJLyogQnJlYWQgQ3J1bWIgUmVnICovCi0JdTMyIHBjY3JbTlJQU0NdOwkvKiBQU0MgQ2xrIEN0cmwgUmVnIDAtMTEgKi8KLQl1MzIgc3BjY3I7CQkvKiBTUERJRiBDbGsgQ3RybCBSZWcgKi8KLQl1MzIgY2NjcjsJCS8qIENGTSBDbGsgQ3RybCBSZWcgKi8KLQl1MzIgZGNjcjsJCS8qIERJVSBDbGsgQ25mZyBSZWcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXBjNTEyeF9jbG9ja2N0bCBfX2lvbWVtICpjbG9ja2N0bDsKLQotc3RhdGljIGludCBtcGM1MTIxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JaWYgKGNsay0+ZmxhZ3MgJiBDTEtfSEFTX0NUUkwpIHsKLQkJbWFzayA9IGluX2JlMzIoJmNsb2NrY3RsLT5zY2NyW2Nsay0+cmVnXSk7Ci0JCW1hc2sgfD0gMSA8PCBjbGstPmJpdDsKLQkJb3V0X2JlMzIoJmNsb2NrY3RsLT5zY2NyW2Nsay0+cmVnXSwgbWFzayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtcGM1MTIxX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCWlmIChjbGstPmZsYWdzICYgQ0xLX0hBU19DVFJMKSB7Ci0JCW1hc2sgPSBpbl9iZTMyKCZjbG9ja2N0bC0+c2NjcltjbGstPnJlZ10pOwotCQltYXNrICY9IH4oMSA8PCBjbGstPmJpdCk7Ci0JCW91dF9iZTMyKCZjbG9ja2N0bC0+c2NjcltjbGstPnJlZ10sIG1hc2spOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXBjNTEyMV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCWlmIChjbGstPmZsYWdzICYgQ0xLX0hBU19SQVRFKQotCQlyZXR1cm4gY2xrLT5yYXRlOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIG1wYzUxMjFfY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgbXBjNTEyMV9jbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3BtZl9tdWx0KHZvaWQpCi17Ci0JLyoKLQkgKiBDb252ZXJ0IHNwbWYgdG8gbXVsdGlwbGllcgotCSAqLwotCXN0YXRpYyBpbnQgc3BtZl90b19tdWx0W10gPSB7Ci0JCTY4LCAxLCAxMiwgMTYsCi0JCTIwLCAyNCwgMjgsIDMyLAotCQkzNiwgNDAsIDQ0LCA0OCwKLQkJNTIsIDU2LCA2MCwgNjQKLQl9OwotCWludCBzcG1mID0gKGluX2JlMzIoJmNsb2NrY3RsLT5zcG1yKSA+PiAyNCkgJiAweGY7Ci0JcmV0dXJuIHNwbWZfdG9fbXVsdFtzcG1mXTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3lzZGl2X2Rpdl94XzIodm9pZCkKLXsKLQkvKgotCSAqIENvbnZlcnQgc3lzZGl2IHRvIGRpdmlzb3IgeCAyCi0JICogU29tZSBkaXZpc29ycyBoYXZlIGZyYWN0aW9uYWwgcGFydHMgc28KLQkgKiBtdWx0aXBseSBieSAyIHRoZW4gZGl2aWRlIGJ5IHRoaXMgdmFsdWUKLQkgKi8KLQlzdGF0aWMgaW50IHN5c2Rpdl90b19kaXZfeF8yW10gPSB7Ci0JCTQsIDUsIDYsIDcsCi0JCTgsIDksIDEwLCAxNCwKLQkJMTIsIDE2LCAxOCwgMjIsCi0JCTIwLCAyNCwgMjYsIDMwLAotCQkyOCwgMzIsIDM0LCAzOCwKLQkJMzYsIDQwLCA0MiwgNDYsCi0JCTQ0LCA0OCwgNTAsIDU0LAotCQk1MiwgNTYsIDU4LCA2MiwKLQkJNjAsIDY0LCA2NiwKLQl9OwotCWludCBzeXNkaXYgPSAoaW5fYmUzMigmY2xvY2tjdGwtPnNjZnIyKSA+PiAyNikgJiAweDNmOwotCXJldHVybiBzeXNkaXZfdG9fZGl2X3hfMltzeXNkaXZdOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWZfdG9fc3lzKHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlyYXRlICo9IHNwbWZfbXVsdCgpOwotCXJhdGUgKj0gMjsKLQlyYXRlIC89IHN5c2Rpdl9kaXZfeF8yKCk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3lzX3RvX3JlZih1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmF0ZSAqPSBzeXNkaXZfZGl2X3hfMigpOwotCXJhdGUgLz0gMjsKLQlyYXRlIC89IHNwbWZfbXVsdCgpOwotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyBsb25nIGlwc190b19yZWYodW5zaWduZWQgbG9uZyByYXRlKQotewotCWludCBpcHNfZGl2ID0gKGluX2JlMzIoJmNsb2NrY3RsLT5zY2ZyMSkgPj4gMjMpICYgMHg3OwotCi0JcmF0ZSAqPSBpcHNfZGl2OwkvKiBjc2JfY2xrID0gaXBzX2NsayAqIGlwc19kaXYgKi8KLQlyYXRlICo9IDI7CQkvKiBzeXNfY2xrID0gY3NiX2NsayAqIDIgKi8KLQlyZXR1cm4gc3lzX3RvX3JlZihyYXRlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGV2dHJlZV9nZXRmcmVxKGNoYXIgKmNsb2NrbmFtZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKLQl1bnNpZ25lZCBpbnQgdmFsID0gMDsKLQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM1MTIxLWltbXIiKTsKLQlpZiAobnApIHsKLQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgY2xvY2tuYW1lLCBOVUxMKTsKLQkJaWYgKHByb3ApCi0JCQl2YWwgPSAqcHJvcDsKLQkgICAgb2Zfbm9kZV9wdXQobnApOwotCX0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCByZWZfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCXJhdGUgPSBkZXZ0cmVlX2dldGZyZXEoImJ1cy1mcmVxdWVuY3kiKTsKLQlpZiAocmF0ZSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTm8gYnVzLWZyZXF1ZW5jeSBpbiBkZXYgdHJlZVxuIik7Ci0JCWNsay0+cmF0ZSA9IDA7Ci0JCXJldHVybjsKLQl9Ci0JY2xrLT5yYXRlID0gaXBzX3RvX3JlZihyYXRlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGsgcmVmX2NsayA9IHsKLQkubmFtZSA9ICJyZWZfY2xrIiwKLQkuY2FsYyA9IHJlZl9jbGtfY2FsYywKLX07Ci0KLQotc3RhdGljIHZvaWQgc3lzX2Nsa19jYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQljbGstPnJhdGUgPSByZWZfdG9fc3lzKHJlZl9jbGsucmF0ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGsgPSB7Ci0JLm5hbWUgPSAic3lzX2NsayIsCi0JLmNhbGMgPSBzeXNfY2xrX2NhbGMsCi19OwotCi1zdGF0aWMgdm9pZCBkaXVfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWludCBkaXVkaXZfeF8yID0gaW5fYmUzMigmY2xvY2tjdGwtPnNjZnIxKSAmIDB4ZmY7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCi0JcmF0ZSA9IHN5c19jbGsucmF0ZTsKLQotCXJhdGUgKj0gMjsKLQlyYXRlIC89IGRpdWRpdl94XzI7Ci0KLQljbGstPnJhdGUgPSByYXRlOwotfQotCi1zdGF0aWMgdm9pZCB2aXVfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCXJhdGUgPSBzeXNfY2xrLnJhdGU7Ci0JcmF0ZSAvPSAyOwotCWNsay0+cmF0ZSA9IHJhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbGZfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gMjsKLX0KLQotc3RhdGljIHZvaWQgZ2VuZXJpY19kaXZfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWludCBkaXYgPSAoaW5fYmUzMigmY2xvY2tjdGwtPnNjZnIxKSA+PiBjbGstPmRpdl9zaGlmdCkgJiAweDc7Ci0KLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGRpdjsKLX0KLQotc3RhdGljIHZvaWQgdW5pdHlfY2xrX2NhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBjc2JfY2xrID0gewotCS5uYW1lID0gImNzYl9jbGsiLAotCS5jYWxjID0gaGFsZl9jbGtfY2FsYywKLQkucGFyZW50ID0gJnN5c19jbGssCi19OwotCi1zdGF0aWMgdm9pZCBlMzAwX2Nsa19jYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgc3BtZiA9IChpbl9iZTMyKCZjbG9ja2N0bC0+c3BtcikgPj4gMTYpICYgMHhmOwotCWludCByYXRleDIgPSBjbGstPnBhcmVudC0+cmF0ZSAqIHNwbWY7Ci0KLQljbGstPnJhdGUgPSByYXRleDIgLyAyOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBlMzAwX2NsayA9IHsKLQkubmFtZSA9ICJlMzAwX2NsayIsCi0JLmNhbGMgPSBlMzAwX2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmY3NiX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGlwc19jbGsgPSB7Ci0JLm5hbWUgPSAiaXBzX2NsayIsCi0JLmNhbGMgPSBnZW5lcmljX2Rpdl9jbGtfY2FsYywKLQkucGFyZW50ID0gJmNzYl9jbGssCi0JLmRpdl9zaGlmdCA9IDIzLAotfTsKLQotLyoKLSAqIENsb2NrcyBjb250cm9sbGVkIGJ5IFNDQ1IxICgucmVnID0gMCkKLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgbHBjX2NsayA9IHsKLQkubmFtZSA9ICJscGNfY2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDAsCi0JLmJpdCA9IDMwLAotCS5jYWxjID0gZ2VuZXJpY19kaXZfY2xrX2NhbGMsCi0JLnBhcmVudCA9ICZpcHNfY2xrLAotCS5kaXZfc2hpZnQgPSAxMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG5mY19jbGsgPSB7Ci0JLm5hbWUgPSAibmZjX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAwLAotCS5iaXQgPSAyOSwKLQkuY2FsYyA9IGdlbmVyaWNfZGl2X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmaXBzX2NsaywKLQkuZGl2X3NoaWZ0ID0gOCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBhdGFfY2xrID0gewotCS5uYW1lID0gInBhdGFfY2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDAsCi0JLmJpdCA9IDI4LAotCS5jYWxjID0gdW5pdHlfY2xrX2NhbGMsCi0JLnBhcmVudCA9ICZpcHNfY2xrLAotfTsKLQotLyoKLSAqIFBTQyBjbG9ja3MgKGJpdHMgMjcgLSAxNikKLSAqIGFyZSBzZXR1cCBlbHNld2hlcmUKLSAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBzYXRhX2NsayA9IHsKLQkubmFtZSA9ICJzYXRhX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAwLAotCS5iaXQgPSAxNCwKLQkuY2FsYyA9IHVuaXR5X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmaXBzX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZlY19jbGsgPSB7Ci0JLm5hbWUgPSAiZmVjX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAwLAotCS5iaXQgPSAxMywKLQkuY2FsYyA9IHVuaXR5X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmaXBzX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBjaV9jbGsgPSB7Ci0JLm5hbWUgPSAicGNpX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAwLAotCS5iaXQgPSAxMSwKLQkuY2FsYyA9IGdlbmVyaWNfZGl2X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmY3NiX2NsaywKLQkuZGl2X3NoaWZ0ID0gMjAsCi19OwotCi0vKgotICogQ2xvY2tzIGNvbnRyb2xsZWQgYnkgU0NDUjIgKC5yZWcgPSAxKQotICovCi1zdGF0aWMgc3RydWN0IGNsayBkaXVfY2xrID0gewotCS5uYW1lID0gImRpdV9jbGsiLAotCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKLQkucmVnID0gMSwKLQkuYml0ID0gMzEsCi0JLmNhbGMgPSBkaXVfY2xrX2NhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB2aXVfY2xrID0gewotCS5uYW1lID0gInZpdV9jbGsiLAotCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKLQkucmVnID0gMSwKLQkuYml0ID0gMTgsCi0JLmNhbGMgPSB2aXVfY2xrX2NhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBheGVfY2xrID0gewotCS5uYW1lID0gImF4ZV9jbGsiLAotCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKLQkucmVnID0gMSwKLQkuYml0ID0gMzAsCi0JLmNhbGMgPSB1bml0eV9jbGtfY2FsYywKLQkucGFyZW50ID0gJmNzYl9jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2IxX2NsayA9IHsKLQkubmFtZSA9ICJ1c2IxX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAxLAotCS5iaXQgPSAyOCwKLQkuY2FsYyA9IHVuaXR5X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmY3NiX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYjJfY2xrID0gewotCS5uYW1lID0gInVzYjJfY2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDEsCi0JLmJpdCA9IDI3LAotCS5jYWxjID0gdW5pdHlfY2xrX2NhbGMsCi0JLnBhcmVudCA9ICZjc2JfY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaTJjX2NsayA9IHsKLQkubmFtZSA9ICJpMmNfY2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDEsCi0JLmJpdCA9IDI2LAotCS5jYWxjID0gdW5pdHlfY2xrX2NhbGMsCi0JLnBhcmVudCA9ICZpcHNfY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbXNjYW5fY2xrID0gewotCS5uYW1lID0gIm1zY2FuX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAxLAotCS5iaXQgPSAyNSwKLQkuY2FsYyA9IHVuaXR5X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmaXBzX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNkaGNfY2xrID0gewotCS5uYW1lID0gInNkaGNfY2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDEsCi0JLmJpdCA9IDI0LAotCS5jYWxjID0gdW5pdHlfY2xrX2NhbGMsCi0JLnBhcmVudCA9ICZpcHNfY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWJ4X2J1c19jbGsgPSB7Ci0JLm5hbWUgPSAibWJ4X2J1c19jbGsiLAotCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKLQkucmVnID0gMSwKLQkuYml0ID0gMjIsCi0JLmNhbGMgPSBoYWxmX2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmY3NiX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1ieF9jbGsgPSB7Ci0JLm5hbWUgPSAibWJ4X2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAxLAotCS5iaXQgPSAyMSwKLQkuY2FsYyA9IHVuaXR5X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmY3NiX2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1ieF8zZF9jbGsgPSB7Ci0JLm5hbWUgPSAibWJ4XzNkX2NsayIsCi0JLmZsYWdzID0gQ0xLX0hBU19DVFJMLAotCS5yZWcgPSAxLAotCS5iaXQgPSAyMCwKLQkuY2FsYyA9IGdlbmVyaWNfZGl2X2Nsa19jYWxjLAotCS5wYXJlbnQgPSAmbWJ4X2J1c19jbGssCi0JLmRpdl9zaGlmdCA9IDE0LAotfTsKLQotc3RhdGljIHZvaWQgcHNjX21jbGtfaW5fY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JY2xrLT5yYXRlID0gZGV2dHJlZV9nZXRmcmVxKCJwc2NfbWNsa19pbiIpOwotCWlmICghY2xrLT5yYXRlKQotCQljbGstPnJhdGUgPSAyNTAwMDAwMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGsgcHNjX21jbGtfaW4gPSB7Ci0JLm5hbWUgPSAicHNjX21jbGtfaW4iLAotCS5jYWxjID0gcHNjX21jbGtfaW5fY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNwZGlmX3R4Y2xrID0gewotCS5uYW1lID0gInNwZGlmX3R4Y2xrIiwKLQkuZmxhZ3MgPSBDTEtfSEFTX0NUUkwsCi0JLnJlZyA9IDEsCi0JLmJpdCA9IDIzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3BkaWZfcnhjbGsgPSB7Ci0JLm5hbWUgPSAic3BkaWZfcnhjbGsiLAotCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKLQkucmVnID0gMSwKLQkuYml0ID0gMjMsCi19OwotCi1zdGF0aWMgdm9pZCBhYzk3X2Nsa19jYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQkvKiBhYzk3IGJpdCBjbG9jayBpcyBhbHdheXMgMjQuNTY3IE1IeiAqLwotCWNsay0+cmF0ZSA9IDI0NTY3MDAwOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBhYzk3X2NsayA9IHsKLQkubmFtZSA9ICJhYzk3X2Nsa19pbiIsCi0JLmNhbGMgPSBhYzk3X2Nsa19jYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKnJhdGVfY2xrc1tdID0gewotCSZyZWZfY2xrLAotCSZzeXNfY2xrLAotCSZkaXVfY2xrLAotCSZ2aXVfY2xrLAotCSZjc2JfY2xrLAotCSZlMzAwX2NsaywKLQkmaXBzX2NsaywKLQkmZmVjX2NsaywKLQkmc2F0YV9jbGssCi0JJnBhdGFfY2xrLAotCSZuZmNfY2xrLAotCSZscGNfY2xrLAotCSZtYnhfYnVzX2NsaywKLQkmbWJ4X2NsaywKLQkmbWJ4XzNkX2NsaywKLQkmYXhlX2NsaywKLQkmdXNiMV9jbGssCi0JJnVzYjJfY2xrLAotCSZpMmNfY2xrLAotCSZtc2Nhbl9jbGssCi0JJnNkaGNfY2xrLAotCSZwY2lfY2xrLAotCSZwc2NfbWNsa19pbiwKLQkmc3BkaWZfdHhjbGssCi0JJnNwZGlmX3J4Y2xrLAotCSZhYzk3X2NsaywKLQlOVUxMCi19OwotCi1zdGF0aWMgdm9pZCByYXRlX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpZiAoY2xrLT5jYWxjKSB7Ci0JCWNsay0+Y2FsYyhjbGspOwotCQljbGstPmZsYWdzIHw9IENMS19IQVNfUkFURTsKLQkJY2xrX3JlZ2lzdGVyKGNsayk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkNvdWxkIG5vdCBpbml0aWFsaXplIGNsayAlcyB3aXRob3V0IGEgY2FsYyByb3V0aW5lXG4iLAotCQkgICAgICAgY2xrLT5uYW1lKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJhdGVfY2xrc19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqKmNwcCwgKmNsazsKLQotCWNwcCA9IHJhdGVfY2xrczsKLQl3aGlsZSAoKGNsayA9ICpjcHArKykpCi0JCXJhdGVfY2xrX2luaXQoY2xrKTsKLX0KLQotLyoKLSAqIFRoZXJlIGFyZSB0d28gY2xrIGVuYWJsZSByZWdpc3RlcnMgd2l0aCAzMiBlbmFibGUgYml0cyBlYWNoCi0gKiBwc2MgY2xvY2tzIGFuZCBkZXZpY2UgY2xvY2tzIGFyZSBhbGwgc3RvcmVkIGluIGRldl9jbGtzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRldl9jbGtzWzJdWzMyXTsKLQotLyoKLSAqIEdpdmVuIGEgcHNjIG51bWJlciByZXR1cm4gdGhlIGRldl9jbGsKLSAqIGFzc29jaWF0ZWQgd2l0aCBpdAotICovCi1zdGF0aWMgc3RydWN0IGNsayAqcHNjX2Rldl9jbGsoaW50IHBzY251bSkKLXsKLQlpbnQgcmVnLCBiaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwotCi0JcmVnID0gMDsKLQliaXQgPSAyNyAtIHBzY251bTsKLQotCWNsayA9ICZkZXZfY2xrc1tyZWddW2JpdF07Ci0JY2xrLT5yZWcgPSAwOwotCWNsay0+Yml0ID0gYml0OwotCXJldHVybiBjbGs7Ci19Ci0KLS8qCi0gKiBQU0MgY2xvY2sgcmF0ZSBjYWxjdWxhdGlvbgotICovCi1zdGF0aWMgdm9pZCBwc2NfY2FsY19yYXRlKHN0cnVjdCBjbGsgKmNsaywgaW50IHBzY251bSwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1bnNpZ25lZCBsb25nIG1jbGtfc3JjID0gc3lzX2Nsay5yYXRlOwotCXVuc2lnbmVkIGxvbmcgbWNsa19kaXY7Ci0KLQkvKgotCSAqIENhbiBvbmx5IGNoYW5nZSB2YWx1ZSBvZiBtY2xrIGRpdmlkZXIKLQkgKiB3aGVuIHRoZSBkaXZpZGVyIGlzIGRpc2FibGVkLgotCSAqCi0JICogWmVybyBpcyBub3QgYSB2YWxpZCBkaXZpZGVyIHNvIG1pbmltdW0KLQkgKiBkaXZpZGVyIGlzIDEKLQkgKgotCSAqIGRpc2FibGUvc2V0IGRpdmlkZXIvZW5hYmxlCi0JICovCi0Jb3V0X2JlMzIoJmNsb2NrY3RsLT5wY2NyW3BzY251bV0sIDApOwotCW91dF9iZTMyKCZjbG9ja2N0bC0+cGNjcltwc2NudW1dLCAweDAwMDIwMDAwKTsKLQlvdXRfYmUzMigmY2xvY2tjdGwtPnBjY3JbcHNjbnVtXSwgMHgwMDAzMDAwMCk7Ci0KLQlpZiAoaW5fYmUzMigmY2xvY2tjdGwtPnBjY3JbcHNjbnVtXSkgJiAweDgwKSB7Ci0JCWNsay0+cmF0ZSA9IHNwZGlmX3J4Y2xrLnJhdGU7Ci0JCXJldHVybjsKLQl9Ci0KLQlzd2l0Y2ggKChpbl9iZTMyKCZjbG9ja2N0bC0+cGNjcltwc2NudW1dKSA+PiAxNCkgJiAweDMpIHsKLQljYXNlIDA6Ci0JCW1jbGtfc3JjID0gc3lzX2Nsay5yYXRlOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCW1jbGtfc3JjID0gcmVmX2Nsay5yYXRlOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCW1jbGtfc3JjID0gcHNjX21jbGtfaW4ucmF0ZTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQltY2xrX3NyYyA9IHNwZGlmX3R4Y2xrLnJhdGU7Ci0JCWJyZWFrOwotCX0KLQotCW1jbGtfZGl2ID0gKChpbl9iZTMyKCZjbG9ja2N0bC0+cGNjcltwc2NudW1dKSA+PiAxNykgJiAweDdmZmYpICsgMTsKLQljbGstPnJhdGUgPSBtY2xrX3NyYyAvIG1jbGtfZGl2OwotfQotCi0vKgotICogRmluZCBhbGwgcHNjIG5vZGVzIGluIGRldmljZSB0cmVlIGFuZCBhc3NpZ24gYSBjbG9jawotICogd2l0aCBuYW1lICJwc2MlZF9tY2xrIiBhbmQgZGV2IHBvaW50aW5nIGF0IHRoZSBkZXZpY2UKLSAqIHJldHVybmVkIGZyb20gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZQotICovCi1zdGF0aWMgdm9pZCBwc2NfY2xrc19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldjsKLQl1MzIgcmVnOwotCWNvbnN0IGNoYXIgKnBzY19jb21wYXQ7Ci0KLQlwc2NfY29tcGF0ID0gbXBjNTEyeF9zZWxlY3RfcHNjX2NvbXBhdCgpOwotCWlmICghcHNjX2NvbXBhdCkKLQkJcmV0dXJuOwotCi0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCBwc2NfY29tcGF0KSB7Ci0JCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWciLCAmcmVnKSkgewotCQkJaW50IHBzY251bSA9IChyZWcgJiAweGYwMCkgPj4gODsKLQkJCXN0cnVjdCBjbGsgKmNsayA9IHBzY19kZXZfY2xrKHBzY251bSk7Ci0KLQkJCWNsay0+ZmxhZ3MgPSBDTEtfSEFTX1JBVEUgfCBDTEtfSEFTX0NUUkw7Ci0JCQlvZmRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobnApOwotCQkJY2xrLT5kZXYgPSAmb2ZkZXYtPmRldjsKLQkJCS8qCi0JCQkgKiBBQzk3IGlzIHNwZWNpYWwgcmF0ZSBjbG9jayBkb2VzCi0JCQkgKiBub3QgZ28gdGhyb3VnaCBub3JtYWwgcGF0aAotCQkJICovCi0JCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsbXBjNTEyMS1wc2MtYWM5NyIpKQotCQkJCWNsay0+cmF0ZSA9IGFjOTdfY2xrLnJhdGU7Ci0JCQllbHNlCi0JCQkJcHNjX2NhbGNfcmF0ZShjbGssIHBzY251bSwgbnApOwotCQkJc3ByaW50ZihjbGstPm5hbWUsICJwc2MlZF9tY2xrIiwgcHNjbnVtKTsKLQkJCWNsa19yZWdpc3RlcihjbGspOwotCQkJY2xrX2VuYWJsZShjbGspOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGNsa19pbnRlcmZhY2UgbXBjNTEyMV9jbGtfZnVuY3Rpb25zID0gewotCS5jbGtfZ2V0CQk9IG1wYzUxMjFfY2xrX2dldCwKLQkuY2xrX2VuYWJsZQkJPSBtcGM1MTIxX2Nsa19lbmFibGUsCi0JLmNsa19kaXNhYmxlCQk9IG1wYzUxMjFfY2xrX2Rpc2FibGUsCi0JLmNsa19nZXRfcmF0ZQkJPSBtcGM1MTIxX2Nsa19nZXRfcmF0ZSwKLQkuY2xrX3B1dAkJPSBtcGM1MTIxX2Nsa19wdXQsCi0JLmNsa19yb3VuZF9yYXRlCQk9IG1wYzUxMjFfY2xrX3JvdW5kX3JhdGUsCi0JLmNsa19zZXRfcmF0ZQkJPSBtcGM1MTIxX2Nsa19zZXRfcmF0ZSwKLQkuY2xrX3NldF9wYXJlbnQJCT0gTlVMTCwKLQkuY2xrX2dldF9wYXJlbnQJCT0gTlVMTCwKLX07Ci0KLWludCBfX2luaXQgbXBjNTEyMV9jbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjNTEyMS1jbG9jayIpOwotCWlmIChucCkgewotCQljbG9ja2N0bCA9IG9mX2lvbWFwKG5wLCAwKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCX0KLQotCWlmICghY2xvY2tjdGwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgbWFwIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXJzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmF0ZV9jbGtzX2luaXQoKTsKLQlwc2NfY2xrc19pbml0KCk7Ci0KLQkvKiBsZWF2ZSBjbG9ja2N0bCBtYXBwZWQgZm9yZXZlciAqLwotCS8qaW91bm1hcChjbG9ja2N0bCk7ICovCi0JREVCVUdfQ0xLX0RVTVAoKTsKLQljbG9ja3NfaW5pdGlhbGl6ZWQrKzsKLQljbGtfZnVuY3Rpb25zID0gbXBjNTEyMV9jbGtfZnVuY3Rpb25zOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfc2hhcmVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwppbmRleCAzNmI1NjUyLi5hZGI5NWYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwpAQCAtMTIsNiArMTIsNyBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTY4LDk4ICs2OSwxMTIgQEAKIAlib29sCQlpbl91c2U7CiB9OwogCi0jZGVmaW5lIERJVV9ESVZfTUFTSwkweDAwMDAwMGZmCisvKiByZWNlaXZlcyBhIHBpeGVsIGNsb2NrIHNwZWMgaW4gcGljbyBzZWNvbmRzLCBhZGp1c3RzIHRoZSBESVUgY2xvY2sgcmF0ZSAqLwogc3RhdGljIHZvaWQgbXBjNTEyeF9zZXRfcGl4ZWxfY2xvY2sodW5zaWduZWQgaW50IHBpeGNsb2NrKQogewotCXVuc2lnbmVkIGxvbmcgYmVzdHZhbCwgYmVzdGZyZXEsIHNwZWVkLCBidXNmcmVxOwotCXVuc2lnbmVkIGxvbmcgbWlucGl4Y2xvY2ssIG1heHBpeGNsb2NrLCBwaXh2YWw7Ci0Jc3RydWN0IG1wYzUxMnhfY2NtIF9faW9tZW0gKmNjbTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXUzMiB0ZW1wOwotCWxvbmcgZXJyOwotCWludCBpOworCXN0cnVjdCBjbGsgKmNsa19kaXU7CisJdW5zaWduZWQgbG9uZyBlcHNpbG9uLCBtaW5waXhjbG9jaywgbWF4cGl4Y2xvY2s7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHdhbnQsIGdvdCwgZGVsdGE7CiAKLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjNTEyMS1jbG9jayIpOworCS8qIGxvb2t1cCBhbmQgZW5hYmxlIHRoZSBESVUgY2xvY2sgKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjNTEyMS1kaXUiKTsKIAlpZiAoIW5wKSB7Ci0JCXByX2VycigiQ2FuJ3QgZmluZCBjbG9jayBjb250cm9sIG1vZHVsZS5cbiIpOworCQlwcl9lcnIoIkNvdWxkIG5vdCBmaW5kIERJVSBkZXZpY2UgdHJlZSBub2RlLlxuIik7CiAJCXJldHVybjsKIAl9Ci0KLQljY20gPSBvZl9pb21hcChucCwgMCk7CisJY2xrX2RpdSA9IG9mX2Nsa19nZXQobnAsIDApOworCWlmIChJU19FUlIoY2xrX2RpdSkpIHsKKwkJLyogYmFja3dhcmRzIGNvbXBhdCB3aXRoIGRldmljZSB0cmVlcyB0aGF0IGxhY2sgY2xvY2sgc3BlY3MgKi8KKwkJY2xrX2RpdSA9IGNsa19nZXRfc3lzKG5wLT5uYW1lLCAiaXBnIik7CisJfQogCW9mX25vZGVfcHV0KG5wKTsKLQlpZiAoIWNjbSkgewotCQlwcl9lcnIoIkNhbid0IG1hcCBjbG9jayBjb250cm9sIG1vZHVsZSByZWcuXG4iKTsKKwlpZiAoSVNfRVJSKGNsa19kaXUpKSB7CisJCXByX2VycigiQ291bGQgbm90IGxvb2t1cCBESVUgY2xvY2suXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2xrX3ByZXBhcmVfZW5hYmxlKGNsa19kaXUpKSB7CisJCXByX2VycigiQ291bGQgbm90IGVuYWJsZSBESVUgY2xvY2suXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwotCWlmIChucCkgewotCQljb25zdCB1bnNpZ25lZCBpbnQgKnByb3AgPQotCQkJb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYnVzLWZyZXF1ZW5jeSIsIE5VTEwpOworCS8qCisJICogY29udmVydCB0aGUgcGljb3NlY29uZHMgc3BlYyBpbnRvIHRoZSBkZXNpcmVkIGNsb2NrIHJhdGUsCisJICogZGV0ZXJtaW5lIHRoZSBhY2NlcHRhYmxlIGNsb2NrIHJhbmdlIGZvciB0aGUgbW9uaXRvciAoKy8tIDUlKSwKKwkgKiBkbyB0aGUgY2FsY3VsYXRpb24gaW4gc3RlcHMgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdworCSAqLworCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgaW4gcHMgLSAldVxuIiwgcGl4Y2xvY2spOworCXBpeGNsb2NrID0gKDEwMDAwMDAwMDAgLyBwaXhjbG9jaykgKiAxMDAwOworCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgZnJlcSAgLSAldVxuIiwgcGl4Y2xvY2spOworCWVwc2lsb24gPSBwaXhjbG9jayAvIDIwOyAvKiBwaXhjbG9jayAqIDAuMDUgKi8KKwlwcl9kZWJ1ZygiRElVIGRldmlhdGlvbiAgICAgIC0gJWx1XG4iLCBlcHNpbG9uKTsKKwltaW5waXhjbG9jayA9IHBpeGNsb2NrIC0gZXBzaWxvbjsKKwltYXhwaXhjbG9jayA9IHBpeGNsb2NrICsgZXBzaWxvbjsKKwlwcl9kZWJ1ZygiRElVIG1pbnBpeGNsb2NrICAgIC0gJWx1XG4iLCBtaW5waXhjbG9jayk7CisJcHJfZGVidWcoIkRJVSBtYXhwaXhjbG9jayAgICAtICVsdVxuIiwgbWF4cGl4Y2xvY2spOwogCi0JCW9mX25vZGVfcHV0KG5wKTsKLQkJaWYgKHByb3ApIHsKLQkJCWJ1c2ZyZXEgPSAqcHJvcDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiQ2FuJ3QgZ2V0IGJ1cy1mcmVxdWVuY3kgcHJvcGVydHlcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJDYW4ndCBmaW5kICdjcHUnIG5vZGUuXG4iKTsKKwkvKgorCSAqIGNoZWNrIHdoZXRoZXIgdGhlIERJVSBzdXBwb3J0cyB0aGUgZGVzaXJlZCBwaXhlbCBjbG9jaworCSAqCisJICogLSBzaW1wbHkgcmVxdWVzdCB0aGUgZGVzaXJlZCBjbG9jayBhbmQgc2VlIHdoYXQgdGhlCisJICogICBwbGF0Zm9ybSdzIGNsb2NrIGRyaXZlciB3aWxsIG1ha2Ugb2YgaXQsIGFzc3VtaW5nIHRoYXQgaXQKKwkgKiAgIHdpbGwgc2V0dXAgdGhlIGJlc3QgYXBwcm94aW1hdGlvbiBvZiB0aGUgcmVxdWVzdGVkIHZhbHVlCisJICogLSB0cnkgb3RoZXIgY2FuZGlkYXRlIGZyZXF1ZW5jaWVzIGluIHRoZSBvcmRlciBvZiBkZWNyZWFzaW5nCisJICogICBwcmVmZXJlbmNlIChpLmUuIHdpdGggaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIHRoZSBkZXNpcmVkCisJICogICBwaXhlbCBjbG9jaywgYW5kIGNoZWNraW5nIHRoZSBsb3dlciBmcmVxdWVuY3kgYmVmb3JlIHRoZQorCSAqICAgaGlnaGVyIGZyZXF1ZW5jeSB0byBub3Qgb3ZlcmxvYWQgdGhlIGhhcmR3YXJlKSB1bnRpbCB0aGUKKwkgKiAgIGZpcnN0IG1hdGNoIGlzIGZvdW5kIC0tIGFueSBwb3RlbnRpYWwgc3Vic2VxdWVudCBtYXRjaAorCSAqICAgd291bGQgb25seSBiZSBhcyBnb29kIGFzIHRoZSBmb3JtZXIgbWF0Y2ggb3IgdHlwaWNhbGx5CisJICogICB3b3VsZCBiZSBsZXNzIHByZWZlcnJhYmxlCisJICoKKwkgKiB0aGUgb2Zmc2V0IGluY3JlbWVudCBvZiBwaXhlbGNsb2NrIGRpdmlkZWQgYnkgNjQgaXMgYW4KKwkgKiBhcmJpdHJhcnkgY2hvaWNlIC0tIGl0J3Mgc2ltcGxlIHRvIGNhbGN1bGF0ZSwgaW4gdGhlIHR5cGljYWwKKwkgKiBjYXNlIHdlIGV4cGVjdCB0aGUgZmlyc3QgY2hlY2sgdG8gc3VjY2VlZCBhbHJlYWR5LCBpbiB0aGUKKwkgKiB3b3JzdCBjYXNlIHNldmVuIGZyZXF1ZW5jaWVzIGdldCB0ZXN0ZWQgKHRoZSBleGFjdCBjZW50ZXIgYW5kCisJICogdGhyZWUgbW9yZSB2YWx1ZXMgZWFjaCB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0KSBiZWZvcmUKKwkgKiB0aGUgNSUgdG9sZXJhbmNlIHdpbmRvdyBpcyBleGNlZWRlZCwgcmVzdWx0aW5nIGluIGZhc3QgZW5vdWdoCisJICogZXhlY3V0aW9uIHlldCBoaWdoIGVub3VnaCBwcm9iYWJpbGl0eSBvZiBmaW5kaW5nIGEgc3VpdGFibGUKKwkgKiB2YWx1ZSwgd2hpbGUgdGhlIGVycm9yIHJhdGUgd2lsbCBiZSBpbiB0aGUgb3JkZXIgb2Ygc2luZ2xlCisJICogcGVyY2VudHMKKwkgKi8KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8PSBlcHNpbG9uOyBvZmZzZXQgKz0gcGl4Y2xvY2sgLyA2NCkgeworCQl3YW50ID0gcGl4Y2xvY2sgLSBvZmZzZXQ7CisJCXByX2RlYnVnKCJESVUgY2hlY2tpbmcgY2xvY2sgLSAlbHVcbiIsIHdhbnQpOworCQljbGtfc2V0X3JhdGUoY2xrX2RpdSwgd2FudCk7CisJCWdvdCA9IGNsa19nZXRfcmF0ZShjbGtfZGl1KTsKKwkJZGVsdGEgPSBhYnMocGl4Y2xvY2sgLSBnb3QpOworCQlpZiAoZGVsdGEgPCBlcHNpbG9uKQorCQkJYnJlYWs7CisJCWlmICghb2Zmc2V0KQorCQkJY29udGludWU7CisJCXdhbnQgPSBwaXhjbG9jayArIG9mZnNldDsKKwkJcHJfZGVidWcoIkRJVSBjaGVja2luZyBjbG9jayAtICVsdVxuIiwgd2FudCk7CisJCWNsa19zZXRfcmF0ZShjbGtfZGl1LCB3YW50KTsKKwkJZ290ID0gY2xrX2dldF9yYXRlKGNsa19kaXUpOworCQlkZWx0YSA9IGFicyhwaXhjbG9jayAtIGdvdCk7CisJCWlmIChkZWx0YSA8IGVwc2lsb24pCisJCQlicmVhazsKKwl9CisJaWYgKG9mZnNldCA8PSBlcHNpbG9uKSB7CisJCXByX2RlYnVnKCJESVUgY2xvY2sgYWNjZXB0ZWQgLSAlbHVcbiIsIHdhbnQpOworCQlwcl9kZWJ1ZygiRElVIHBpeGNsb2NrIHdhbnQgJXUsIGdvdCAlbHUsIGRlbHRhICVsdSwgZXBzICVsdVxuIiwKKwkJCSBwaXhjbG9jaywgZ290LCBkZWx0YSwgZXBzaWxvbik7CiAJCXJldHVybjsKIAl9CisJcHJfd2FybigiRElVIHBpeGNsb2NrIGF1dG8gc2VhcmNoIHVuc3VjY2Vzc2Z1bFxuIik7CiAKLQkvKiBQaXhlbCBDbG9jayBjb25maWd1cmF0aW9uICovCi0JcHJfZGVidWcoIkRJVTogQnVzIEZyZXF1ZW5jeSA9ICVsdVxuIiwgYnVzZnJlcSk7Ci0Jc3BlZWQgPSBidXNmcmVxICogNDsgLyogRElVX0RJViByYXRpbyBpcyA0ICogQ1NCX0NMSyAvIERJVV9DTEsgKi8KLQotCS8qIENhbGN1bGF0ZSB0aGUgcGl4ZWwgY2xvY2sgd2l0aCB0aGUgc21hbGxlc3QgZXJyb3IgKi8KLQkvKiBjYWxjdWxhdGUgdGhlIGZvbGxvd2luZyBpbiBzdGVwcyB0byBhdm9pZCBvdmVyZmxvdyAqLwotCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgaW4gcHMgLSAlZFxuIiwgcGl4Y2xvY2spOwotCXRlbXAgPSAoMTAwMDAwMDAwMCAvIHBpeGNsb2NrKSAqIDEwMDA7Ci0JcGl4Y2xvY2sgPSB0ZW1wOwotCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgZnJlcSAtICV1XG4iLCBwaXhjbG9jayk7Ci0KLQl0ZW1wID0gdGVtcCAvIDIwOyAvKiBwaXhjbG9jayAqIDAuMDUgKi8KLQlwcl9kZWJ1ZygiZGV2aWF0aW9uID0gJWRcbiIsIHRlbXApOwotCW1pbnBpeGNsb2NrID0gcGl4Y2xvY2sgLSB0ZW1wOwotCW1heHBpeGNsb2NrID0gcGl4Y2xvY2sgKyB0ZW1wOwotCXByX2RlYnVnKCJESVUgbWlucGl4Y2xvY2sgLSAlbHVcbiIsIG1pbnBpeGNsb2NrKTsKLQlwcl9kZWJ1ZygiRElVIG1heHBpeGNsb2NrIC0gJWx1XG4iLCBtYXhwaXhjbG9jayk7Ci0JcGl4dmFsID0gc3BlZWQvcGl4Y2xvY2s7Ci0JcHJfZGVidWcoIkRJVSBwaXh2YWwgPSAlbHVcbiIsIHBpeHZhbCk7Ci0KLQllcnIgPSBMT05HX01BWDsKLQliZXN0dmFsID0gcGl4dmFsOwotCXByX2RlYnVnKCJESVUgYmVzdHZhbCA9ICVsdVxuIiwgYmVzdHZhbCk7Ci0KLQliZXN0ZnJlcSA9IDA7Ci0JZm9yIChpID0gLTE7IGkgPD0gMTsgaSsrKSB7Ci0JCXRlbXAgPSBzcGVlZCAvIChwaXh2YWwraSk7Ci0JCXByX2RlYnVnKCJESVUgdGVzdCBwaXh2YWwgaT0lZCwgcGl4dmFsPSVsdSwgdGVtcCBmcmVxLiA9ICV1XG4iLAotCQkJaSwgcGl4dmFsLCB0ZW1wKTsKLQkJaWYgKCh0ZW1wIDwgbWlucGl4Y2xvY2spIHx8ICh0ZW1wID4gbWF4cGl4Y2xvY2spKQotCQkJcHJfZGVidWcoIkRJVSBleGNlZWRzIG1vbml0b3IgcmFuZ2UgKCVsdSB0byAlbHUpXG4iLAotCQkJCW1pbnBpeGNsb2NrLCBtYXhwaXhjbG9jayk7Ci0JCWVsc2UgaWYgKGFicyh0ZW1wIC0gcGl4Y2xvY2spIDwgZXJyKSB7Ci0JCQlwcl9kZWJ1ZygiRW50ZXJlZCB0aGUgZWxzZSBpZiBibG9jayAlZFxuIiwgaSk7Ci0JCQllcnIgPSBhYnModGVtcCAtIHBpeGNsb2NrKTsKLQkJCWJlc3R2YWwgPSBwaXh2YWwgKyBpOwotCQkJYmVzdGZyZXEgPSB0ZW1wOwotCQl9Ci0JfQotCi0JcHJfZGVidWcoIkRJVSBjaG9zZSA9ICVseFxuIiwgYmVzdHZhbCk7Ci0JcHJfZGVidWcoIkRJVSBlcnJvciA9ICVsZFxuIE5vbVBpeENsayAiLCBlcnIpOwotCXByX2RlYnVnKCJESVU6IEJlc3QgRnJlcSA9ICVseFxuIiwgYmVzdGZyZXEpOwotCS8qIE1vZGlmeSBESVVfRElWIGluIENDTSBTQ0ZSMSAqLwotCXRlbXAgPSBpbl9iZTMyKCZjY20tPnNjZnIxKTsKLQlwcl9kZWJ1ZygiRElVOiBDdXJyZW50IHZhbHVlIG9mIFNDRlIxOiAweCUwOHhcbiIsIHRlbXApOwotCXRlbXAgJj0gfkRJVV9ESVZfTUFTSzsKLQl0ZW1wIHw9IChiZXN0dmFsICYgRElVX0RJVl9NQVNLKTsKLQlvdXRfYmUzMigmY2NtLT5zY2ZyMSwgdGVtcCk7Ci0JcHJfZGVidWcoIkRJVTogTW9kaWZpZWQgdmFsdWUgb2YgU0NGUjE6IDB4JTA4eFxuIiwgdGVtcCk7Ci0JaW91bm1hcChjY20pOworCS8qCisJICogd2hhdCBpcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gdGFrZSB3aGVuIHRoZSBzZWFyY2gKKwkgKiBmb3IgYW4gYXZhaWxhYmxlIHBpeGVsIGNsb2NrIHdoaWNoIGlzIGFjY2VwdGFibGUgdG8gdGhlCisJICogbW9uaXRvciBoYXMgZmFpbGVkPyAgZGlzYWJsZSB0aGUgRElVIChjbG9jaykgb3IganVzdCBwcm92aWRlCisJICogYSAiYmVzdCBlZmZvcnQiPyAgd2UgZ28gd2l0aCB0aGUgbGF0dGVyCisJICovCisJcHJfd2FybigiRElVIHBpeGNsb2NrIGJlc3QgZWZmb3J0IGZhbGxiYWNrIChiYWNrZW5kJ3MgY2hvaWNlKVxuIik7CisJY2xrX3NldF9yYXRlKGNsa19kaXUsIHBpeGNsb2NrKTsKKwlnb3QgPSBjbGtfZ2V0X3JhdGUoY2xrX2RpdSk7CisJZGVsdGEgPSBhYnMocGl4Y2xvY2sgLSBnb3QpOworCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgd2FudCAldSwgZ290ICVsdSwgZGVsdGEgJWx1LCBlcHMgJWx1XG4iLAorCQkgcGl4Y2xvY2ssIGdvdCwgZGVsdGEsIGVwc2lsb24pOwogfQogCiBzdGF0aWMgZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZwppbmRleCBhZjU0MTc0Li5iNjI1YTJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKIGNvbmZpZyBQUENfTVBDNTJ4eAogCWJvb2wgIjUyeHgtYmFzZWQgYm9hcmRzIgogCWRlcGVuZHMgb24gNnh4Ci0Jc2VsZWN0IFBQQ19DTE9DSworCXNlbGVjdCBDT01NT05fQ0xLCiAJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFCiAKIGNvbmZpZyBQUENfTVBDNTIwMF9TSU1QTEUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKaW5kZXggYTkzMmZlYi4uMjExNjZmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgpAQCAtMjE2LDYgKzIxNywxNiBAQAogCXJldHVybiAxOwogfQogCit2b2lkIHBvd2VybnZfaWRsZSh2b2lkKQoreworCS8qIEhvb2sgdG8gY3B1aWRsZSBmcmFtZXdvcmsgaWYgYXZhaWxhYmxlLCBlbHNlCisJICogY2FsbCBvbiBkZWZhdWx0IHBsYXRmb3JtIGlkbGUgY29kZQorCSAqLworCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKSB7CisJCXBvd2VyN19pZGxlKCk7CisJfQorfQorCiBkZWZpbmVfbWFjaGluZShwb3dlcm52KSB7CiAJLm5hbWUJCQk9ICJQb3dlck5WIiwKIAkucHJvYmUJCQk9IHBudl9wcm9iZSwKQEAgLTIyNSw3ICsyMzYsNyBAQAogCS5zaG93X2NwdWluZm8JCT0gcG52X3Nob3dfY3B1aW5mbywKIAkucHJvZ3Jlc3MJCT0gcG52X3Byb2dyZXNzLAogCS5tYWNoaW5lX3NodXRkb3duCT0gcG52X3NodXRkb3duLAotCS5wb3dlcl9zYXZlICAgICAgICAgICAgID0gcG93ZXI3X2lkbGUsCisJLnBvd2VyX3NhdmUgICAgICAgICAgICAgPSBwb3dlcm52X2lkbGUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJLmtleGVjX2NwdV9kb3duCQk9IHBudl9rZXhlY19jcHVfZG93biwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcKaW5kZXggZTY2NjQzMi4uMzczMDBmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcKQEAgLTExOSwxMiArMTE5LDMgQEAKIAkgIHdoaWNoIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggYSBkZWJ1Z2ZzIGZpbGUuCiAKIAkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgotCi1jb25maWcgUFNFUklFU19JRExFCi0JYm9vbCAiQ3B1aWRsZSBkcml2ZXIgZm9yIHBTZXJpZXMgcGxhdGZvcm1zIgotCWRlcGVuZHMgb24gQ1BVX0lETEUKLQlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBwcm9jZXNzb3IgaWRsZSBzdGF0ZSBtYW5hZ2VtZW50Ci0JICB0aHJvdWdoIGNwdWlkbGUgc3Vic3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCmluZGV4IGZiY2NhYzkuLjAzNDgwNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDYgQEAKIG9iai0kKENPTkZJR19DTU0pCQkrPSBjbW0ubwogb2JqLSQoQ09ORklHX0RUTCkJCSs9IGR0bC5vCiBvYmotJChDT05GSUdfSU9fRVZFTlRfSVJRKQkrPSBpb19ldmVudF9pcnEubwotb2JqLSQoQ09ORklHX1BTRVJJRVNfSURMRSkJKz0gcHJvY2Vzc29yX2lkbGUubwogb2JqLSQoQ09ORklHX0xQQVJDRkcpCQkrPSBscGFyY2ZnLm8KIAogaWZlcSAoJChDT05GSUdfUFBDX1BTRVJJRVMpLHkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2F4b25yYW0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCmluZGV4IDFjMTYxNDEuLjQ3YjZiOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCkBAIC0xMDksMjcgKzEwOSwyOCBAQAogCXN0cnVjdCBheG9uX3JhbV9iYW5rICpiYW5rID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBwaHlzX21lbSwgcGh5c19lbmQ7CiAJdm9pZCAqdXNlcl9tZW07Ci0Jc3RydWN0IGJpb192ZWMgKnZlYzsKKwlzdHJ1Y3QgYmlvX3ZlYyB2ZWM7CiAJdW5zaWduZWQgaW50IHRyYW5zZmVyZWQ7Ci0JdW5zaWduZWQgc2hvcnQgaWR4OworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAotCXBoeXNfbWVtID0gYmFuay0+aW9fYWRkciArIChiaW8tPmJpX3NlY3RvciA8PCBBWE9OX1JBTV9TRUNUT1JfU0hJRlQpOworCXBoeXNfbWVtID0gYmFuay0+aW9fYWRkciArIChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8CisJCQkJICAgIEFYT05fUkFNX1NFQ1RPUl9TSElGVCk7CiAJcGh5c19lbmQgPSBiYW5rLT5pb19hZGRyICsgYmFuay0+c2l6ZTsKIAl0cmFuc2ZlcmVkID0gMDsKLQliaW9fZm9yX2VhY2hfc2VnbWVudCh2ZWMsIGJpbywgaWR4KSB7Ci0JCWlmICh1bmxpa2VseShwaHlzX21lbSArIHZlYy0+YnZfbGVuID4gcGh5c19lbmQpKSB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQodmVjLCBiaW8sIGl0ZXIpIHsKKwkJaWYgKHVubGlrZWx5KHBoeXNfbWVtICsgdmVjLmJ2X2xlbiA+IHBoeXNfZW5kKSkgewogCQkJYmlvX2lvX2Vycm9yKGJpbyk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQl1c2VyX21lbSA9IHBhZ2VfYWRkcmVzcyh2ZWMtPmJ2X3BhZ2UpICsgdmVjLT5idl9vZmZzZXQ7CisJCXVzZXJfbWVtID0gcGFnZV9hZGRyZXNzKHZlYy5idl9wYWdlKSArIHZlYy5idl9vZmZzZXQ7CiAJCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKQotCQkJbWVtY3B5KHVzZXJfbWVtLCAodm9pZCAqKSBwaHlzX21lbSwgdmVjLT5idl9sZW4pOworCQkJbWVtY3B5KHVzZXJfbWVtLCAodm9pZCAqKSBwaHlzX21lbSwgdmVjLmJ2X2xlbik7CiAJCWVsc2UKLQkJCW1lbWNweSgodm9pZCAqKSBwaHlzX21lbSwgdXNlcl9tZW0sIHZlYy0+YnZfbGVuKTsKKwkJCW1lbWNweSgodm9pZCAqKSBwaHlzX21lbSwgdXNlcl9tZW0sIHZlYy5idl9sZW4pOwogCi0JCXBoeXNfbWVtICs9IHZlYy0+YnZfbGVuOwotCQl0cmFuc2ZlcmVkICs9IHZlYy0+YnZfbGVuOworCQlwaHlzX21lbSArPSB2ZWMuYnZfbGVuOworCQl0cmFuc2ZlcmVkICs9IHZlYy5idl9sZW47CiAJfQogCWJpb19lbmRpbyhiaW8sIDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwppbmRleCBiZDk2OGE0Li42MmM0N2JiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwpAQCAtMjkyLDYgKzI5Miw3IEBACiAJaW9tbXVfdGFibGVfZGFydC5pdF9vZmZzZXQgPSAwOwogCS8qIGl0X3NpemUgaXMgaW4gbnVtYmVyIG9mIGVudHJpZXMgKi8KIAlpb21tdV90YWJsZV9kYXJ0Lml0X3NpemUgPSBkYXJ0X3RhYmxlc2l6ZSAvIHNpemVvZih1MzIpOworCWlvbW11X3RhYmxlX2RhcnQuaXRfcGFnZV9zaGlmdCA9IElPTU1VX1BBR0VfU0hJRlRfNEs7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjb21tb24gSU9NTVUgY29kZSAqLwogCWlvbW11X3RhYmxlX2RhcnQuaXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKWRhcnRfdmJhc2U7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKaW5kZXggYjNmZWFiZC4uY2YzYzAwOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgImNyeXB0X3MzOTAuaCIKIAogI2RlZmluZSBBRVNfS0VZTEVOXzEyOAkJMQpAQCAtMzIsNiArMzMsNyBAQAogI2RlZmluZSBBRVNfS0VZTEVOXzI1NgkJNAogCiBzdGF0aWMgdTggKmN0cmJsazsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3RyYmxrX2xvY2spOwogc3RhdGljIGNoYXIga2V5bGVuX2ZsYWc7CiAKIHN0cnVjdCBzMzkwX2Flc19jdHggewpAQCAtNzU4LDQzICs3NjAsNjcgQEAKIAlyZXR1cm4gYWVzX3NldF9rZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbjsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcywgbWF4LiBQQUdFX1NJWkUgKi8KKwluID0gKG5ieXRlcyA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJZm9yIChpID0gQUVTX0JMT0NLX1NJWkU7IGkgPCBuOyBpICs9IEFFU19CTE9DS19TSVpFKSB7CisJCW1lbWNweShjdHJwdHIgKyBpLCBjdHJwdHIgKyBpIC0gQUVTX0JMT0NLX1NJWkUsCisJCSAgICAgICBBRVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMoY3RycHRyICsgaSwgQUVTX0JMT0NLX1NJWkUpOworCX0KKwlyZXR1cm4gbjsKK30KKwogc3RhdGljIGludCBjdHJfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAogCQkJIHN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHgsIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKIAlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydF9ibG9jayhkZXNjLCB3YWxrLCBBRVNfQkxPQ0tfU0laRSk7Ci0JdW5zaWduZWQgaW50IGksIG4sIG5ieXRlczsKLQl1OCBidWZbQUVTX0JMT0NLX1NJWkVdOwotCXU4ICpvdXQsICppbjsKKwl1bnNpZ25lZCBpbnQgbiwgbmJ5dGVzOworCXU4IGJ1ZltBRVNfQkxPQ0tfU0laRV0sIGN0cmJ1ZltBRVNfQkxPQ0tfU0laRV07CisJdTggKm91dCwgKmluLCAqY3RycHRyID0gY3RyYnVmOwogCiAJaWYgKCF3YWxrLT5uYnl0ZXMpCiAJCXJldHVybiByZXQ7CiAKLQltZW1jcHkoY3RyYmxrLCB3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOworCWlmIChzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKSkKKwkJY3RycHRyID0gY3RyYmxrOworCisJbWVtY3B5KGN0cnB0ciwgd2Fsay0+aXYsIEFFU19CTE9DS19TSVpFKTsKIAl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gQUVTX0JMT0NLX1NJWkUpIHsKIAkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKIAkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwogCQl3aGlsZSAobmJ5dGVzID49IEFFU19CTE9DS19TSVpFKSB7Ci0JCQkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MsIG1heC4gUEFHRV9TSVpFICovCi0JCQluID0gKG5ieXRlcyA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOgotCQkJCQkJIG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJCWZvciAoaSA9IEFFU19CTE9DS19TSVpFOyBpIDwgbjsgaSArPSBBRVNfQkxPQ0tfU0laRSkgewotCQkJCW1lbWNweShjdHJibGsgKyBpLCBjdHJibGsgKyBpIC0gQUVTX0JMT0NLX1NJWkUsCi0JCQkJICAgICAgIEFFU19CTE9DS19TSVpFKTsKLQkJCQljcnlwdG9faW5jKGN0cmJsayArIGksIEFFU19CTE9DS19TSVpFKTsKLQkJCX0KLQkJCXJldCA9IGNyeXB0X3MzOTBfa21jdHIoZnVuYywgc2N0eC0+a2V5LCBvdXQsIGluLCBuLCBjdHJibGspOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pCisJCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCQluID0gX19jdHJibGtfaW5pdChjdHJwdHIsIG5ieXRlcyk7CisJCQllbHNlCisJCQkJbiA9IEFFU19CTE9DS19TSVpFOworCQkJcmV0ID0gY3J5cHRfczM5MF9rbWN0cihmdW5jLCBzY3R4LT5rZXksIG91dCwgaW4sCisJCQkJCSAgICAgICBuLCBjdHJwdHIpOworCQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pIHsKKwkJCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCQkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKIAkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAkJCWlmIChuID4gQUVTX0JMT0NLX1NJWkUpCi0JCQkJbWVtY3B5KGN0cmJsaywgY3RyYmxrICsgbiAtIEFFU19CTE9DS19TSVpFLAorCQkJCW1lbWNweShjdHJwdHIsIGN0cnB0ciArIG4gLSBBRVNfQkxPQ0tfU0laRSwKIAkJCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOwotCQkJY3J5cHRvX2luYyhjdHJibGssIEFFU19CTE9DS19TSVpFKTsKKwkJCWNyeXB0b19pbmMoY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7CiAJCQlvdXQgKz0gbjsKIAkJCWluICs9IG47CiAJCQluYnl0ZXMgLT0gbjsKIAkJfQogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CiAJfQorCWlmIChjdHJwdHIgPT0gY3RyYmxrKSB7CisJCWlmIChuYnl0ZXMpCisJCQltZW1jcHkoY3RyYnVmLCBjdHJwdHIsIEFFU19CTE9DS19TSVpFKTsKKwkJZWxzZQorCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIsIEFFU19CTE9DS19TSVpFKTsKKwkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKKwl9CiAJLyoKIAkgKiBmaW5hbCBibG9jayBtYXkgYmUgPCBBRVNfQkxPQ0tfU0laRSwgY29weSBvbmx5IG5ieXRlcwogCSAqLwpAQCAtODAyLDE0ICs4MjgsMTUgQEAKIAkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKIAkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwogCQlyZXQgPSBjcnlwdF9zMzkwX2ttY3RyKGZ1bmMsIHNjdHgtPmtleSwgYnVmLCBpbiwKLQkJCQkgICAgICAgQUVTX0JMT0NLX1NJWkUsIGN0cmJsayk7CisJCQkJICAgICAgIEFFU19CTE9DS19TSVpFLCBjdHJidWYpOwogCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gQUVTX0JMT0NLX1NJWkUpCiAJCQlyZXR1cm4gLUVJTzsKIAkJbWVtY3B5KG91dCwgYnVmLCBuYnl0ZXMpOwotCQljcnlwdG9faW5jKGN0cmJsaywgQUVTX0JMT0NLX1NJWkUpOworCQljcnlwdG9faW5jKGN0cmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIDApOworCQltZW1jcHkod2Fsay0+aXYsIGN0cmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOwogCX0KLQltZW1jcHkod2Fsay0+aXYsIGN0cmJsaywgQUVTX0JMT0NLX1NJWkUpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCmluZGV4IDIwMGYyYTEuLjBhNWFhYzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNkZWZpbmUgREVTM19LRVlfU0laRQkoMyAqIERFU19LRVlfU0laRSkKIAogc3RhdGljIHU4ICpjdHJibGs7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGN0cmJsa19sb2NrKTsKIAogc3RydWN0IHMzOTBfZGVzX2N0eCB7CiAJdTggaXZbREVTX0JMT0NLX1NJWkVdOwpAQCAtMTA1LDI5ICsxMDYsMzUgQEAKIH0KIAogc3RhdGljIGludCBjYmNfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJICAgIHU4ICppdiwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQorCQkJICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKKwlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwogCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJc3RydWN0IHsKKwkJdTggaXZbREVTX0JMT0NLX1NJWkVdOworCQl1OCBrZXlbREVTM19LRVlfU0laRV07CisJfSBwYXJhbTsKIAogCWlmICghbmJ5dGVzKQogCQlnb3RvIG91dDsKIAotCW1lbWNweShpdiwgd2Fsay0+aXYsIERFU19CTE9DS19TSVpFKTsKKwltZW1jcHkocGFyYW0uaXYsIHdhbGstPml2LCBERVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KHBhcmFtLmtleSwgY3R4LT5rZXksIERFUzNfS0VZX1NJWkUpOwogCWRvIHsKIAkJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCiAJCXVuc2lnbmVkIGludCBuID0gbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOwogCQl1OCAqb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKIAkJdTggKmluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKIAotCQlyZXQgPSBjcnlwdF9zMzkwX2ttYyhmdW5jLCBpdiwgb3V0LCBpbiwgbik7CisJCXJldCA9IGNyeXB0X3MzOTBfa21jKGZ1bmMsICZwYXJhbSwgb3V0LCBpbiwgbik7CiAJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQogCQkJcmV0dXJuIC1FSU87CiAKIAkJbmJ5dGVzICY9IERFU19CTE9DS19TSVpFIC0gMTsKIAkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwogCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKLQltZW1jcHkod2Fsay0+aXYsIGl2LCBERVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KHdhbGstPml2LCBwYXJhbS5pdiwgREVTX0JMT0NLX1NJWkUpOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTE3OSwyMiArMTg2LDIwIEBACiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBLTUNfREVBX0VOQ1JZUFQsIGN0eC0+aXYsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBLTUNfREVBX0VOQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjYmNfZGVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgS01DX0RFQV9ERUNSWVBULCBjdHgtPml2LCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgS01DX0RFQV9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjYmNfZGVzX2FsZyA9IHsKQEAgLTMyNywyMiArMzMyLDIwIEBACiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIEtNQ19UREVBXzE5Ml9FTkNSWVBULCBjdHgtPml2LCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgS01DX1RERUFfMTkyX0VOQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjYmNfZGVzM19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgS01DX1RERUFfMTkyX0RFQ1JZUFQsIGN0eC0+aXYsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBLTUNfVERFQV8xOTJfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY2JjX2RlczNfYWxnID0gewpAQCAtMzY2LDU0ICszNjksODAgQEAKIAl9CiB9OwogCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbjsKKworCS8qIGFsaWduIHRvIGJsb2NrIHNpemUsIG1heC4gUEFHRV9TSVpFICovCisJbiA9IChuYnl0ZXMgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOworCWZvciAoaSA9IERFU19CTE9DS19TSVpFOyBpIDwgbjsgaSArPSBERVNfQkxPQ0tfU0laRSkgeworCQltZW1jcHkoY3RycHRyICsgaSwgY3RycHRyICsgaSAtIERFU19CTE9DS19TSVpFLCBERVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMoY3RycHRyICsgaSwgREVTX0JMT0NLX1NJWkUpOworCX0KKwlyZXR1cm4gbjsKK30KKwogc3RhdGljIGludCBjdHJfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJICAgIHN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQorCQkJICAgIHN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCwKKwkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7CiAJaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgREVTX0JMT0NLX1NJWkUpOwotCXVuc2lnbmVkIGludCBpLCBuLCBuYnl0ZXM7Ci0JdTggYnVmW0RFU19CTE9DS19TSVpFXTsKLQl1OCAqb3V0LCAqaW47CisJdW5zaWduZWQgaW50IG4sIG5ieXRlczsKKwl1OCBidWZbREVTX0JMT0NLX1NJWkVdLCBjdHJidWZbREVTX0JMT0NLX1NJWkVdOworCXU4ICpvdXQsICppbiwgKmN0cnB0ciA9IGN0cmJ1ZjsKIAotCW1lbWNweShjdHJibGssIHdhbGstPml2LCBERVNfQkxPQ0tfU0laRSk7CisJaWYgKCF3YWxrLT5uYnl0ZXMpCisJCXJldHVybiByZXQ7CisKKwlpZiAoc3Bpbl90cnlsb2NrKCZjdHJibGtfbG9jaykpCisJCWN0cnB0ciA9IGN0cmJsazsKKworCW1lbWNweShjdHJwdHIsIHdhbGstPml2LCBERVNfQkxPQ0tfU0laRSk7CiAJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IERFU19CTE9DS19TSVpFKSB7CiAJCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CiAJCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKIAkJd2hpbGUgKG5ieXRlcyA+PSBERVNfQkxPQ0tfU0laRSkgewotCQkJLyogYWxpZ24gdG8gYmxvY2sgc2l6ZSwgbWF4LiBQQUdFX1NJWkUgKi8KLQkJCW4gPSAobmJ5dGVzID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6Ci0JCQkJbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOwotCQkJZm9yIChpID0gREVTX0JMT0NLX1NJWkU7IGkgPCBuOyBpICs9IERFU19CTE9DS19TSVpFKSB7Ci0JCQkJbWVtY3B5KGN0cmJsayArIGksIGN0cmJsayArIGkgLSBERVNfQkxPQ0tfU0laRSwKLQkJCQkgICAgICAgREVTX0JMT0NLX1NJWkUpOwotCQkJCWNyeXB0b19pbmMoY3RyYmxrICsgaSwgREVTX0JMT0NLX1NJWkUpOwotCQkJfQotCQkJcmV0ID0gY3J5cHRfczM5MF9rbWN0cihmdW5jLCBjdHgtPmtleSwgb3V0LCBpbiwgbiwgY3RyYmxrKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQorCQkJaWYgKGN0cnB0ciA9PSBjdHJibGspCisJCQkJbiA9IF9fY3RyYmxrX2luaXQoY3RycHRyLCBuYnl0ZXMpOworCQkJZWxzZQorCQkJCW4gPSBERVNfQkxPQ0tfU0laRTsKKwkJCXJldCA9IGNyeXB0X3MzOTBfa21jdHIoZnVuYywgY3R4LT5rZXksIG91dCwgaW4sCisJCQkJCSAgICAgICBuLCBjdHJwdHIpOworCQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pIHsKKwkJCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCQkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKIAkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAkJCWlmIChuID4gREVTX0JMT0NLX1NJWkUpCi0JCQkJbWVtY3B5KGN0cmJsaywgY3RyYmxrICsgbiAtIERFU19CTE9DS19TSVpFLAorCQkJCW1lbWNweShjdHJwdHIsIGN0cnB0ciArIG4gLSBERVNfQkxPQ0tfU0laRSwKIAkJCQkgICAgICAgREVTX0JMT0NLX1NJWkUpOwotCQkJY3J5cHRvX2luYyhjdHJibGssIERFU19CTE9DS19TSVpFKTsKKwkJCWNyeXB0b19pbmMoY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7CiAJCQlvdXQgKz0gbjsKIAkJCWluICs9IG47CiAJCQluYnl0ZXMgLT0gbjsKIAkJfQogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CiAJfQotCisJaWYgKGN0cnB0ciA9PSBjdHJibGspIHsKKwkJaWYgKG5ieXRlcykKKwkJCW1lbWNweShjdHJidWYsIGN0cnB0ciwgREVTX0JMT0NLX1NJWkUpOworCQllbHNlCisJCQltZW1jcHkod2Fsay0+aXYsIGN0cnB0ciwgREVTX0JMT0NLX1NJWkUpOworCQlzcGluX3VubG9jaygmY3RyYmxrX2xvY2spOworCX0KIAkvKiBmaW5hbCBibG9jayBtYXkgYmUgPCBERVNfQkxPQ0tfU0laRSwgY29weSBvbmx5IG5ieXRlcyAqLwogCWlmIChuYnl0ZXMpIHsKIAkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKIAkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwogCQlyZXQgPSBjcnlwdF9zMzkwX2ttY3RyKGZ1bmMsIGN0eC0+a2V5LCBidWYsIGluLAotCQkJCSAgICAgICBERVNfQkxPQ0tfU0laRSwgY3RyYmxrKTsKKwkJCQkgICAgICAgREVTX0JMT0NLX1NJWkUsIGN0cmJ1Zik7CiAJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBERVNfQkxPQ0tfU0laRSkKIAkJCXJldHVybiAtRUlPOwogCQltZW1jcHkob3V0LCBidWYsIG5ieXRlcyk7Ci0JCWNyeXB0b19pbmMoY3RyYmxrLCBERVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMoY3RyYnVmLCBERVNfQkxPQ0tfU0laRSk7CiAJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgMCk7CisJCW1lbWNweSh3YWxrLT5pdiwgY3RyYnVmLCBERVNfQkxPQ0tfU0laRSk7CiAJfQotCW1lbWNweSh3YWxrLT5pdiwgY3RyYmxrLCBERVNfQkxPQ0tfU0laRSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBkNWJjMzc1Li5lZWYzZGQzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMTA2LDkgKzEwNiwyMiBAQAogCV9fdTY0CWdiZWE7CQkJLyogMHgwMTgwICovCiAJX191OAlyZXNlcnZlZDE4OFsyNF07CS8qIDB4MDE4OCAqLwogCV9fdTMyCWZhYzsJCQkvKiAweDAxYTAgKi8KLQlfX3U4CXJlc2VydmVkMWE0WzkyXTsJLyogMHgwMWE0ICovCisJX191OAlyZXNlcnZlZDFhNFs2OF07CS8qIDB4MDFhNCAqLworCV9fdTY0CWl0ZGJhOwkJCS8qIDB4MDFlOCAqLworCV9fdTgJcmVzZXJ2ZWQxZjBbMTZdOwkvKiAweDAxZjAgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBrdm1fczM5MF9pdGRiIHsKKwlfX3U4CWRhdGFbMjU2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzaWVfcGFnZSB7CisJc3RydWN0IGt2bV9zMzkwX3NpZV9ibG9jayBzaWVfYmxvY2s7CisJX191OCByZXNlcnZlZDIwMFsxMDI0XTsJCS8qIDB4MDIwMCAqLworCXN0cnVjdCBrdm1fczM5MF9pdGRiIGl0ZGI7CS8qIDB4MDYwMCAqLworCV9fdTggcmVzZXJ2ZWQ3MDBbMjMwNF07CQkvKiAweDA3MDAgKi8KK30gX19wYWNrZWQ7CisKIHN0cnVjdCBrdm1fdmNwdV9zdGF0IHsKIAl1MzIgZXhpdF91c2Vyc3BhY2U7CiAJdTMyIGV4aXRfbnVsbDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IGUwMzBkMmIuLmRiMDIwNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtMjg2LDggKzI4Niw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU1lTVklQQwotQ09NUEFUX1NZU0NBTExfREVGSU5FNShzMzkwX2lwYywgdWludCwgY2FsbCwgaW50LCBmaXJzdCwgdW5zaWduZWQgbG9uZywgc2Vjb25kLAotCQl1bnNpZ25lZCBsb25nLCB0aGlyZCwgY29tcGF0X3VwdHJfdCwgcHRyKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShzMzkwX2lwYywgdWludCwgY2FsbCwgaW50LCBmaXJzdCwgY29tcGF0X3Vsb25nX3QsIHNlY29uZCwKKwkJY29tcGF0X3Vsb25nX3QsIHRoaXJkLCBjb21wYXRfdXB0cl90LCBwdHIpCiB7CiAJaWYgKGNhbGwgPj4gMTYpCQkvKiBoYWNrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKaW5kZXggNWRkYmJkZS4uZWViMWFjNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCkBAIC0xMTIsNiArMTEyLDE3IEBACiBzdGF0aWMgaW50IGhhbmRsZV9wcm9nKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl2Y3B1LT5zdGF0LmV4aXRfcHJvZ3JhbV9pbnRlcnJ1cHRpb24rKzsKKworCS8qIFJlc3RvcmUgSVREQiB0byBQcm9ncmFtLUludGVycnVwdGlvbiBUREIgaW4gZ3Vlc3QgbWVtb3J5ICovCisJaWYgKElTX1RFX0VOQUJMRUQodmNwdSkgJiYKKwkgICAgIShjdXJyZW50LT50aHJlYWQucGVyX2ZsYWdzICYgUEVSX0ZMQUdfTk9fVEUpICYmCisJICAgIElTX0lUREJfVkFMSUQodmNwdSkpIHsKKwkJY29weV90b19ndWVzdCh2Y3B1LCBUREJfQUREUiwgdmNwdS0+YXJjaC5zaWVfYmxvY2stPml0ZGJhLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBrdm1fczM5MF9pdGRiKSk7CisJCW1lbXNldCgodm9pZCAqKSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXRkYmEsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2l0ZGIpKTsKKwl9CisKIAl0cmFjZV9rdm1fczM5MF9pbnRlcmNlcHRfcHJvZyh2Y3B1LCB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXByY2MpOwogCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgdmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwcmNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCA3NjM1YzAwLi5lMDY3NmYzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC0zOTUsNiArMzk1LDkgQEAKIAkJCQkJCSAgICBDUFVTVEFUX1NUT1BQRUQgfAogCQkJCQkJICAgIENQVVNUQVRfR0VEKTsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiICAgPSA2OworCWlmICh0ZXN0X3ZmYWNpbGl0eSg1MCkgJiYgdGVzdF92ZmFjaWxpdHkoNzMpKQorCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiIHw9IDB4MTA7CisKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMiAgPSA4OwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2EgICA9IDB4QzEwMDIwMDFVOwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5mYWMgICA9IChpbnQpIChsb25nKSB2ZmFjaWxpdGllczsKQEAgLTQxMSw2ICs0MTQsNyBAQAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJc3RydWN0IHNpZV9wYWdlICpzaWVfcGFnZTsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCiAJaWYgKGlkID49IEtWTV9NQVhfVkNQVVMpCkBAIC00MjIsMTIgKzQyNiwxMyBAQAogCWlmICghdmNwdSkKIAkJZ290byBvdXQ7CiAKLQl2Y3B1LT5hcmNoLnNpZV9ibG9jayA9IChzdHJ1Y3Qga3ZtX3MzOTBfc2llX2Jsb2NrICopCi0JCQkJCWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQotCWlmICghdmNwdS0+YXJjaC5zaWVfYmxvY2spCisJc2llX3BhZ2UgPSAoc3RydWN0IHNpZV9wYWdlICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXNpZV9wYWdlKQogCQlnb3RvIG91dF9mcmVlX2NwdTsKIAorCXZjcHUtPmFyY2guc2llX2Jsb2NrID0gJnNpZV9wYWdlLT5zaWVfYmxvY2s7CisJdmNwdS0+YXJjaC5zaWVfYmxvY2stPml0ZGJhID0gKHVuc2lnbmVkIGxvbmcpICZzaWVfcGFnZS0+aXRkYjsKKwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3B1YSA9IGlkOwogCWlmICgha3ZtX2lzX3Vjb250cm9sKGt2bSkpIHsKIAkJaWYgKCFrdm0tPmFyY2guc2NhKSB7CkBAIC0xMTgyLDggKzExODcsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtY3B5KHZmYWNpbGl0aWVzLCBTMzkwX2xvd2NvcmUuc3RmbGVfZmFjX2xpc3QsIDE2KTsKLQl2ZmFjaWxpdGllc1swXSAmPSAweGZmODJmZmYzZjQ3YzAwMDBVTDsKLQl2ZmFjaWxpdGllc1sxXSAmPSAweDAwMWMwMDAwMDAwMDAwMDBVTDsKKwl2ZmFjaWxpdGllc1swXSAmPSAweGZmODJmZmYzZjRmYzIwMDBVTDsKKwl2ZmFjaWxpdGllc1sxXSAmPSAweDAwNWMwMDAwMDAwMDAwMDBVTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCmluZGV4IDA5NWNmNTEuLmY5NTU5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAorKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKQEAgLTI2LDYgKzI2LDEyIEBACiAKIGludCBrdm1faGFuZGxlX3NpZV9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAorLyogVHJhbnNhY3Rpb25hbCBNZW1vcnkgRXhlY3V0aW9uIHJlbGF0ZWQgbWFjcm9zICovCisjZGVmaW5lIElTX1RFX0VOQUJMRUQodmNwdSkJKCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiICYgMHgxMCkpCisjZGVmaW5lIFREQl9BRERSCQkweDE4MDBVTAorI2RlZmluZSBUREJfRk9STUFUMQkJMQorI2RlZmluZSBJU19JVERCX1ZBTElEKHZjcHUpCSgoKihjaGFyICopdmNwdS0+YXJjaC5zaWVfYmxvY2stPml0ZGJhID09IFREQl9GT1JNQVQxKSkKKwogI2RlZmluZSBWTV9FVkVOVChkX2t2bSwgZF9sb2dsZXZlbCwgZF9zdHJpbmcsIGRfYXJncy4uLilcCiBkbyB7IFwKIAlkZWJ1Z19zcHJpbnRmX2V2ZW50KGRfa3ZtLT5hcmNoLmRiZiwgZF9sb2dsZXZlbCwgZF9zdHJpbmcgIlxuIiwgXApkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9saWIvY2hlY2tzdW0uUyBiL2FyY2gvc2NvcmUvbGliL2NoZWNrc3VtLlMKaW5kZXggNzA2MTU3ZS4uMTE0MWYyYiAxMDA2NDQKLS0tIGEvYXJjaC9zY29yZS9saWIvY2hlY2tzdW0uUworKysgYi9hcmNoL3Njb3JlL2xpYi9jaGVja3N1bS5TCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlsZGkgcjI1LCAwCiAJbXYgcjEwLCByNQogCWNtcGkuYwlyNSwgMHg4Ci0JYmx0CXNtYWxsX2NzdW1jcHkJCS8qIDwgOChzaW5nZWQpIGJ5dGVzIHRvIGNvcHkgKi8KKwlibHQJc21hbGxfY3N1bWNweQkJLyogPCA4KHNpZ25lZCkgYnl0ZXMgdG8gY29weSAqLwogCWNtcGkuYwlyNSwgMHgwCiAJYmVxCW91dAogCWFuZHJpLmMJcjI1LCBzcmMsIDB4MQkJLyogb2RkIGJ1ZmZlcj8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAppbmRleCA2MmNlZDU4Li5iNzMyNzRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCkBAIC00MDgsOCArNDA4LDEwIEBACiAjZGVmaW5lIF9fTlJfa2Vybl9mZWF0dXJlcwkzNDAKICNkZWZpbmUgX19OUl9rY21wCQkzNDEKICNkZWZpbmUgX19OUl9maW5pdF9tb2R1bGUJMzQyCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YXR0cgkzNDMKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhdHRyCTM0NAogCi0jZGVmaW5lIE5SX3N5c2NhbGxzCQkzNDMKKyNkZWZpbmUgTlJfc3lzY2FsbHMJCTM0NQogCiAvKiBCaXRtYXNrIHZhbHVlcyByZXR1cm5lZCBmcm9tIGtlcm5fZmVhdHVyZXMgc3lzdGVtIGNhbGwuICAqLwogI2RlZmluZSBLRVJOX0ZFQVRVUkVfTUlYRURfTU9ERV9TVEFDSwkweDAwMDAwMDAxCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9jcHVtYXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCmluZGV4IGNiNWQyNzIuLmRlMWM4NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwppbmRleCBlMzA2ZmIwOC4uYWNmODMxNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9odnRyYW1wLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odnRyYW1wLlMKaW5kZXggNGViMWE1YS4uYjdkZGNkZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaHZ0cmFtcC5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2h2dHJhbXAuUwpAQCAtMyw3ICszLDYgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMKaW5kZXggZGUxOTliZi4uMzI0MWY1NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV9jb21tb24uYwpAQCAtMSw3ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCA3ZGU4ZDFmLi4xNTU1YmJjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtMTAwNSw2ICsxMDA1LDUgQEAKIAogCXJldHVybiAwOwogfQotCi1tb2R1bGVfaW5pdChvZl9wY2lfc2xvdF9pbml0KTsKK2RldmljZV9pbml0Y2FsbChvZl9wY2lfc2xvdF9pbml0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IGE2ODk1OTguLjk0NGEwNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKQEAgLTUsNyArNSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGZkZDgxOWQuLjUxMGJhZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzMyLmMKaW5kZXggZTUyMWM1NC4uYmY0Y2NiMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc18zMi5jCkBAIC02LDcgKzYsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYwppbmRleCA5ZjVlMjRkLi5hOTJkNWQyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMKQEAgLTcsNyArNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCmluZGV4IDdiODcxNzEuLjE1MWFjZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKQEAgLTg1LDQgKzg1LDQgQEAKIC8qMzI1Ki8JLmxvbmcgc3lzX3B3cml0ZXYsIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkubG9uZyBzeXNfZmFub3RpZnlfbWFyaywgc3lzX3BybGltaXQ2NCwgc3lzX25hbWVfdG9faGFuZGxlX2F0LCBzeXNfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19jbG9ja19hZGp0aW1lCiAvKjMzNSovCS5sb25nIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zLCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2Ci0vKjM0MCovCS5sb25nIHN5c19uaV9zeXNjYWxsLCBzeXNfa2NtcCwgc3lzX2Zpbml0X21vZHVsZQorLyozNDAqLwkubG9uZyBzeXNfbmlfc3lzY2FsbCwgc3lzX2tjbXAsIHN5c19maW5pdF9tb2R1bGUsIHN5c19zY2hlZF9zZXRhdHRyLCBzeXNfc2NoZWRfZ2V0YXR0cgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCmluZGV4IDZkODE1OTcuLjRiZDRlMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKQEAgLTg2LDcgKzg2LDcgQEAKIAkud29yZCBjb21wYXRfc3lzX3B3cml0ZXYsIGNvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8sIHN5c19wZXJmX2V2ZW50X29wZW4sIGNvbXBhdF9zeXNfcmVjdm1tc2csIHN5c19mYW5vdGlmeV9pbml0CiAvKjMzMCovCS53b3JkIGNvbXBhdF9zeXNfZmFub3RpZnlfbWFyaywgc3lzX3BybGltaXQ2NCwgc3lzX25hbWVfdG9faGFuZGxlX2F0LCBjb21wYXRfc3lzX29wZW5fYnlfaGFuZGxlX2F0LCBjb21wYXRfc3lzX2Nsb2NrX2FkanRpbWUKIAkud29yZCBzeXNfc3luY2ZzLCBjb21wYXRfc3lzX3NlbmRtbXNnLCBzeXNfc2V0bnMsIGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdiwgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldgotLyozNDAqLwkud29yZCBzeXNfa2Vybl9mZWF0dXJlcywgc3lzX2tjbXAsIHN5c19maW5pdF9tb2R1bGUKKy8qMzQwKi8JLndvcmQgc3lzX2tlcm5fZmVhdHVyZXMsIHN5c19rY21wLCBzeXNfZmluaXRfbW9kdWxlLCBzeXNfc2NoZWRfc2V0YXR0ciwgc3lzX3NjaGVkX2dldGF0dHIKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApAQCAtMTY0LDQgKzE2NCw0IEBACiAJLndvcmQgc3lzX3B3cml0ZXYsIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkud29yZCBzeXNfZmFub3RpZnlfbWFyaywgc3lzX3BybGltaXQ2NCwgc3lzX25hbWVfdG9faGFuZGxlX2F0LCBzeXNfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19jbG9ja19hZGp0aW1lCiAJLndvcmQgc3lzX3N5bmNmcywgc3lzX3NlbmRtbXNnLCBzeXNfc2V0bnMsIHN5c19wcm9jZXNzX3ZtX3JlYWR2LCBzeXNfcHJvY2Vzc192bV93cml0ZXYKLS8qMzQwKi8JLndvcmQgc3lzX2tlcm5fZmVhdHVyZXMsIHN5c19rY21wLCBzeXNfZmluaXRfbW9kdWxlCisvKjM0MCovCS53b3JkIHN5c19rZXJuX2ZlYXR1cmVzLCBzeXNfa2NtcCwgc3lzX2Zpbml0X21vZHVsZSwgc3lzX3NjaGVkX3NldGF0dHIsIHN5c19zY2hlZF9nZXRhdHRyCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lXzMyLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lXzMyLlMKaW5kZXggNzZkY2JkMy4uM2VlZDk5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhbXBvbGluZV8zMi5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYW1wb2xpbmVfMzIuUwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2hlYWQuaD4KICNpbmNsdWRlIDxhc20vcHNyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYW1wb2xpbmVfNjQuUyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYW1wb2xpbmVfNjQuUwppbmRleCBhZDRiZGUzLi43MzdmOGNiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lXzY0LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhbXBvbGluZV82NC5TCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IChDKSAxOTk3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2hlYWQuaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3NwYXJjL21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggMzA5NjMxNy4uOWJkOWNlOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS90bGIuYyBiL2FyY2gvc3BhcmMvbW0vdGxiLmMKaW5kZXggYWQzYmY0Yi4uYjEyY2I1ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS90bGIuYworKysgYi9hcmNoL3NwYXJjL21tL3RsYi5jCkBAIC00LDcgKzQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcDEyNzUuYyBiL2FyY2gvc3BhcmMvcHJvbS9wMTI3NS5jCmluZGV4IDA0YTQ1NDAuLmU1OGI4MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9wMTI3NS5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9wMTI3NS5jCkBAIC01LDcgKzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCA3OGYxZjJkLi5mZmQ0NDkzIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0yODEsNyArMjgxLDYgQEAKIAkJCXUzMiBkdW1teSwgdTMyIGxvdywgdTMyIGhpZ2gpOwogbG9uZyBjb21wYXRfc3lzX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjb3VudCwKIAkJCSB1MzIgZHVtbXksIHUzMiBsb3csIHUzMiBoaWdoKTsKLWxvbmcgY29tcGF0X3N5c19sb29rdXBfZGNvb2tpZSh1MzIgbG93LCB1MzIgaGlnaCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbik7CiBsb25nIGNvbXBhdF9zeXNfc3luY19maWxlX3JhbmdlMihpbnQgZmQsIHVuc2lnbmVkIGludCBmbGFncywKIAkJCQkgdTMyIG9mZnNldF9sbywgdTMyIG9mZnNldF9oaSwKIAkJCQkgdTMyIG5ieXRlc19sbywgdTMyIG5ieXRlc19oaSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCA5NDBlNTBlLi4wYWY1MjUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTQ0NCw2ICs0NDQsNyBAQAogCWJvb2wgIkludGVsIE1JRCBwbGF0Zm9ybSBzdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2XzMyCiAJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KKwlkZXBlbmRzIG9uIFg4Nl9QTEFURk9STV9ERVZJQ0VTCiAJZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIFBDSV9HT0FOWQogCWRlcGVuZHMgb24gWDg2X0lPX0FQSUMKQEAgLTEwNTEsOSArMTA1Miw5IEBACiAJICBUaGlzIG9wdGlvbnMgZW5hYmxlcyBtaWNyb2NvZGUgcGF0Y2ggbG9hZGluZyBzdXBwb3J0IGZvciBJbnRlbAogCSAgcHJvY2Vzc29ycy4KIAotCSAgRm9yIGxhdGVzdCBuZXdzIGFuZCBpbmZvcm1hdGlvbiBvbiBvYnRhaW5pbmcgYWxsIHRoZSByZXF1aXJlZAotCSAgSW50ZWwgaW5ncmVkaWVudHMgZm9yIHRoaXMgZHJpdmVyLCBjaGVjazoKLQkgIDxodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlLz4uCisJICBGb3IgdGhlIGN1cnJlbnQgSW50ZWwgbWljcm9jb2RlIGRhdGEgcGFja2FnZSBnbyB0bworCSAgPGh0dHBzOi8vZG93bmxvYWRjZW50ZXIuaW50ZWwuY29tPiBhbmQgc2VhcmNoIGZvcgorCSAgJ0xpbnV4IFByb2Nlc3NvciBNaWNyb2NvZGUgRGF0YSBGaWxlJy4KIAogY29uZmlnIE1JQ1JPQ09ERV9BTUQKIAlib29sICJBTUQgbWljcm9jb2RlIGxvYWRpbmcgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuZGVidWcgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCmluZGV4IDBmMzYyMWUuLjMyMWE1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwpAQCAtMTg0LDYgKzE4NCw3IEBACiBjb25maWcgWDg2X0RFQ09ERVJfU0VMRlRFU1QKIAlib29sICJ4ODYgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZWxmdGVzdCIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBLUFJPQkVTCisJZGVwZW5kcyBvbiAhQ09NUElMRV9URVNUCiAJLS0taGVscC0tLQogCSBQZXJmb3JtIHg4NiBpbnN0cnVjdGlvbiBkZWNvZGVyIHNlbGZ0ZXN0cyBhdCBidWlsZCB0aW1lLgogCSBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIHRoZSBzYW5pdHkgb2YgeDg2IGluc3RydWN0aW9uCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZSBiL2FyY2gveDg2L01ha2VmaWxlCmluZGV4IDEzYjIyZTAuLmVlZGE0M2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L01ha2VmaWxlCkBAIC0xMSw2ICsxMSwyOCBAQAogICAgICAgICBLQlVJTERfREVGQ09ORklHIDo9ICQoQVJDSClfZGVmY29uZmlnCiBlbmRpZgogCisjIEhvdyB0byBjb21waWxlIHRoZSAxNi1iaXQgY29kZS4gIE5vdGUgd2UgYWx3YXlzIGNvbXBpbGUgZm9yIC1tYXJjaD1pMzg2OworIyB0aGF0IHdheSB3ZSBjYW4gY29tcGxhaW4gdG8gdGhlIHVzZXIgaWYgdGhlIENQVSBpcyBpbnN1ZmZpY2llbnQuCisjCisjIFRoZSAtbTE2IG9wdGlvbiBpcyBzdXBwb3J0ZWQgYnkgR0NDID49IDQuOSBhbmQgY2xhbmcgPj0gMy41LiBGb3IKKyMgb2xkZXIgdmVyc2lvbnMgb2YgR0NDLCB3ZSBuZWVkIHRvIHBsYXkgZXZpbCBhbmQgdW5yZWxpYWJsZSB0cmlja3MgdG8KKyMgYXR0ZW1wdCB0byBlbnN1cmUgdGhhdCBvdXIgYXNtKCIuY29kZTE2Z2NjIikgaXMgZmlyc3QgaW4gdGhlIGFzbQorIyBvdXRwdXQuCitDT0RFMTZHQ0NfQ0ZMQUdTIDo9IC1tMzIgLWluY2x1ZGUgJChzcmN0cmVlKS9hcmNoL3g4Ni9ib290L2NvZGUxNmdjYy5oIFwKKwkJICAgICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tdG9wbGV2ZWwtcmVvcmRlcixcCisJCSAgICAgICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tdW5pdC1hdC1hLXRpbWUpKQorTTE2X0NGTEFHUwkgOj0gJChjYWxsIGNjLW9wdGlvbiwgLW0xNiwgJChDT0RFMTZHQ0NfQ0ZMQUdTKSkKKworUkVBTE1PREVfQ0ZMQUdTCTo9ICQoTTE2X0NGTEFHUykgLWcgLU9zIC1EX19LRVJORUxfXyBcCisJCSAgIC1ERElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HIFwKKwkJICAgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtbWFyY2g9aTM4NiAtbXJlZ3Bhcm09MyBcCisJCSAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tcGljIFwKKwkJICAgLW1uby1tbXggLW1uby1zc2UgXAorCQkgICAkKGNhbGwgY2Mtb3B0aW9uLCAtZmZyZWVzdGFuZGluZykgXAorCQkgICAkKGNhbGwgY2Mtb3B0aW9uLCAtZm5vLXN0YWNrLXByb3RlY3RvcikgXAorCQkgICAkKGNhbGwgY2Mtb3B0aW9uLCAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yKQorZXhwb3J0IFJFQUxNT0RFX0NGTEFHUworCiAjIEJJVFMgaXMgdXNlZCBhcyBleHRlbnNpb24gZm9yIGZpbGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gYSAzMiBiaXQKICMgYW5kIGEgNjQgYml0IHZlcnNpb24gdG8gc2ltcGxpZnkgc2hhcmVkIE1ha2VmaWxlcy4KICMgZS5nLjogb2JqLXkgKz0gZm9vXyQoQklUUykubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggZGU3MDY2OS4uODc4ZGY3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L01ha2VmaWxlCkBAIC01MSwyMCArNTEsNyBAQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jIEhvdyB0byBjb21waWxlIHRoZSAxNi1iaXQgY29kZS4gIE5vdGUgd2UgYWx3YXlzIGNvbXBpbGUgZm9yIC1tYXJjaD1pMzg2LAotIyB0aGF0IHdheSB3ZSBjYW4gY29tcGxhaW4gdG8gdGhlIHVzZXIgaWYgdGhlIENQVSBpcyBpbnN1ZmZpY2llbnQuCi1LQlVJTERfQ0ZMQUdTCTo9ICQoVVNFUklOQ0xVREUpIC1tMzIgLWcgLU9zIC1EX1NFVFVQIC1EX19LRVJORUxfXyBcCi0JCSAgIC1ERElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HIFwKLQkJICAgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyBcCi0JCSAgIC1tYXJjaD1pMzg2IC1tcmVncGFybT0zIFwKLQkJICAgLWluY2x1ZGUgJChzcmN0cmVlKS8kKHNyYykvY29kZTE2Z2NjLmggXAotCQkgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXBpYyBcCi0JCSAgIC1tbm8tbW14IC1tbm8tc3NlIFwKLQkJICAgJChjYWxsIGNjLW9wdGlvbiwgLWZmcmVlc3RhbmRpbmcpIFwKLQkJICAgJChjYWxsIGNjLW9wdGlvbiwgLWZuby10b3BsZXZlbC1yZW9yZGVyLFwKLQkJICAgJChjYWxsIGNjLW9wdGlvbiwgLWZuby11bml0LWF0LWEtdGltZSkpIFwKLQkJICAgJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IpIFwKLQkJICAgJChjYWxsIGNjLW9wdGlvbiwgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MikKK0tCVUlMRF9DRkxBR1MJOj0gJChVU0VSSU5DTFVERSkgJChSRUFMTU9ERV9DRkxBR1MpIC1EX1NFVFVQCiBLQlVJTERfQUZMQUdTCTo9ICQoS0JVSUxEX0NGTEFHUykgLURfX0FTU0VNQkxZX18KIEdDT1ZfUFJPRklMRSA6PSBuCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY3B1ZmxhZ3MuYyBiL2FyY2gveDg2L2Jvb3QvY3B1ZmxhZ3MuYwppbmRleCBhOWZjYjdjLi40MzFmYTVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NwdWZsYWdzLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jcHVmbGFncy5jCkBAIC0yOCwyMCArMjgsMzUgQEAKIAlyZXR1cm4gZnN3ID09IDAgJiYgKGZjdyAmIDB4MTAzZikgPT0gMHgwMDNmOwogfQogCisvKgorICogRm9yIGJ1aWxkaW5nIHRoZSAxNi1iaXQgY29kZSB3ZSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSAzMi1iaXQKKyAqIHB1c2gvcG9wIG9wZXJhdGlvbnMsIHJhdGhlciB0aGFuIGp1c3Qgc2F5aW5nICdwdXNoZicgb3IgJ3BvcGYnIGFuZAorICogbGV0dGluZyB0aGUgY29tcGlsZXIgY2hvb3NlLiBCdXQgdGhpcyBpcyBhbHNvIGluY2x1ZGVkIGZyb20gdGhlCisgKiBjb21wcmVzc2VkLyBkaXJlY3Rvcnkgd2hlcmUgaXQgbWF5IGJlIDY0LWJpdCBjb2RlLCBhbmQgdGh1cyBuZWVkcworICogdG8gYmUgJ3B1c2hmcScgb3IgJ3BvcGZxJyBpbiB0aGF0IGNhc2UuCisgKi8KKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIFBVU0hGICJwdXNoZnEiCisjZGVmaW5lIFBPUEYgInBvcGZxIgorI2Vsc2UKKyNkZWZpbmUgUFVTSEYgInB1c2hmbCIKKyNkZWZpbmUgUE9QRiAicG9wZmwiCisjZW5kaWYKKwogaW50IGhhc19lZmxhZyh1bnNpZ25lZCBsb25nIG1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBmMCwgZjE7CiAKLQlhc20gdm9sYXRpbGUoInB1c2hmCVxuXHQiCi0JCSAgICAgInB1c2hmCVxuXHQiCisJYXNtIHZvbGF0aWxlKFBVU0hGICIJXG5cdCIKKwkJICAgICBQVVNIRiAiCVxuXHQiCiAJCSAgICAgInBvcCAlMAlcblx0IgogCQkgICAgICJtb3YgJTAsJTEJXG5cdCIKIAkJICAgICAieG9yICUyLCUxCVxuXHQiCiAJCSAgICAgInB1c2ggJTEJXG5cdCIKLQkJICAgICAicG9wZglcblx0IgotCQkgICAgICJwdXNoZglcblx0IgorCQkgICAgIFBPUEYgIglcblx0IgorCQkgICAgIFBVU0hGICIJXG5cdCIKIAkJICAgICAicG9wICUxCVxuXHQiCi0JCSAgICAgInBvcGYiCisJCSAgICAgUE9QRgogCQkgICAgIDogIj0mciIgKGYwKSwgIj0mciIgKGYxKQogCQkgICAgIDogInJpIiAobWFzaykpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmggYi9hcmNoL3g4Ni9ib290L3ZpZGVvLmgKaW5kZXggZmYzMzljNS4uMGJiMjU0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby5oCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uaApAQCAtODAsNyArODAsNyBAQAogCXUxNiB4bW9kZV9uOwkJLyogU2l6ZSBvZiB1bnByb2JlZCBtb2RlIHJhbmdlICovCiB9OwogCi0jZGVmaW5lIF9fdmlkZW9jYXJkIHN0cnVjdCBjYXJkX2luZm8gX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLnZpZGVvY2FyZHMiKSkpCisjZGVmaW5lIF9fdmlkZW9jYXJkIHN0cnVjdCBjYXJkX2luZm8gX19hdHRyaWJ1dGVfXygodXNlZCxzZWN0aW9uKCIudmlkZW9jYXJkcyIpKSkKIGV4dGVybiBzdHJ1Y3QgY2FyZF9pbmZvIHZpZGVvX2NhcmRzW10sIHZpZGVvX2NhcmRzX2VuZFtdOwogCiBpbnQgbW9kZV9kZWZpbmVkKHUxNiBtb2RlKTsJLyogdmlkZW8uYyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaAppbmRleCBhNTRlZTFkLi5hYWFjM2IyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaApAQCAtMTksNyArMTksNyBAQAogZXh0ZXJuIHZvaWQgYW1kX2ZsdXNoX2dhcnRzKHZvaWQpOwogZXh0ZXJuIGludCBhbWRfbnVtYV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBhbWRfZ2V0X3N1YmNhY2hlcyhpbnQpOwotZXh0ZXJuIGludCBhbWRfc2V0X3N1YmNhY2hlcyhpbnQsIGludCk7CitleHRlcm4gaW50IGFtZF9zZXRfc3ViY2FjaGVzKGludCwgdW5zaWduZWQgbG9uZyk7CiAKIHN0cnVjdCBhbWRfbDNfY2FjaGUgewogCXVuc2lnbmVkIGluZGljZXM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3BhcmEuaAppbmRleCAxZGYxMTU5Li5jNzY3OGU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9wYXJhLmgKQEAgLTg1LDI4ICs4NSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBrdm1fY3B1aWRfYmFzZSh2b2lkKQotewotCWlmIChib290X2NwdV9kYXRhLmNwdWlkX2xldmVsIDwgMCkKLQkJcmV0dXJuIDA7CS8qIFNvIHdlIGRvbid0IGJsb3cgdXAgb24gb2xkIHByb2Nlc3NvcnMgKi8KLQotCWlmIChjcHVfaGFzX2h5cGVydmlzb3IpCi0JCXJldHVybiBoeXBlcnZpc29yX2NwdWlkX2Jhc2UoIktWTUtWTUtWTVwwXDBcMCIsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fcGFyYV9hdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4ga3ZtX2NwdWlkX2Jhc2UoKSAhPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBrdm1fYXJjaF9wYXJhX2ZlYXR1cmVzKHZvaWQpCi17Ci0JcmV0dXJuIGNwdWlkX2VheChLVk1fQ1BVSURfRkVBVFVSRVMpOwotfQotCiAjaWZkZWYgQ09ORklHX0tWTV9HVUVTVAorYm9vbCBrdm1fcGFyYV9hdmFpbGFibGUodm9pZCk7Cit1bnNpZ25lZCBpbnQga3ZtX2FyY2hfcGFyYV9mZWF0dXJlcyh2b2lkKTsKIHZvaWQgX19pbml0IGt2bV9ndWVzdF9pbml0KHZvaWQpOwogdm9pZCBrdm1fYXN5bmNfcGZfdGFza193YWl0KHUzMiB0b2tlbik7CiB2b2lkIGt2bV9hc3luY19wZl90YXNrX3dha2UodTMyIHRva2VuKTsKQEAgLTEyNiw2ICsxMDcsMTYgQEAKICNkZWZpbmUga3ZtX2FzeW5jX3BmX3Rhc2tfd2FpdChUKSBkbyB7fSB3aGlsZSgwKQogI2RlZmluZSBrdm1fYXN5bmNfcGZfdGFza193YWtlKFQpIGRvIHt9IHdoaWxlKDApCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fcGFyYV9hdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQga3ZtX2FyY2hfcGFyYV9mZWF0dXJlcyh2b2lkKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBrdm1fcmVhZF9hbmRfcmVzZXRfcGZfcmVhc29uKHZvaWQpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAppbmRleCA0MDFmMzUwLi5jZDZlMTYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKQEAgLTc4MSw5ICs3ODEsOSBAQAogICovCiAjZGVmaW5lIFBWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoZnVuYykJCQkJCVwKIAlleHRlcm4gdHlwZW9mKGZ1bmMpIF9fcmF3X2NhbGxlZV9zYXZlXyMjZnVuYzsJCQlcCi0Jc3RhdGljIHZvaWQgKl9fIyNmdW5jIyNfXyBfX3VzZWQgPSBmdW5jOwkJCVwKIAkJCQkJCQkJCVwKIAlhc20oIi5wdXNoc2VjdGlvbiAudGV4dDsiCQkJCQlcCisJICAgICIuZ2xvYmwgX19yYXdfY2FsbGVlX3NhdmVfIiAjZnVuYyAiIDsgIgkJCVwKIAkgICAgIl9fcmF3X2NhbGxlZV9zYXZlXyIgI2Z1bmMgIjogIgkJCQlcCiAJICAgIFBWX1NBVkVfQUxMX0NBTExFUl9SRUdTCQkJCQlcCiAJICAgICJjYWxsICIgI2Z1bmMgIjsiCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKaW5kZXggYWFiOGY2Ny4uNzU0OWI4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCkBAIC0zODgsMTAgKzM4OCwxMSBAQAogCV9wYXJhdmlydF9hbHQoaW5zbl9zdHJpbmcsICIlY1twYXJhdmlydF90eXBlbnVtXSIsICIlY1twYXJhdmlydF9jbG9iYmVyXSIpCiAKIC8qIFNpbXBsZSBpbnN0cnVjdGlvbiBwYXRjaGluZyBjb2RlLiAqLwotI2RlZmluZSBERUZfTkFUSVZFKG9wcywgbmFtZSwgY29kZSkgCQkJCQlcCi0JZXh0ZXJuIGNvbnN0IGNoYXIgc3RhcnRfIyNvcHMjI18jI25hbWVbXSBfX3Zpc2libGUsCQlcCi0JCQkgIGVuZF8jI29wcyMjXyMjbmFtZVtdIF9fdmlzaWJsZTsJCVwKLQlhc20oInN0YXJ0XyIgI29wcyAiXyIgI25hbWUgIjogIiBjb2RlICI7IGVuZF8iICNvcHMgIl8iICNuYW1lICI6IikKKyNkZWZpbmUgTkFUSVZFX0xBQkVMKGEseCxiKSAiXG5cdC5nbG9ibCAiIGEgI3ggIl8iICNiICJcbiIgYSAjeCAiXyIgI2IgIjpcblx0IgorCisjZGVmaW5lIERFRl9OQVRJVkUob3BzLCBuYW1lLCBjb2RlKQkJCQkJXAorCV9fdmlzaWJsZSBleHRlcm4gY29uc3QgY2hhciBzdGFydF8jI29wcyMjXyMjbmFtZVtdLCBlbmRfIyNvcHMjI18jI25hbWVbXTsJXAorCWFzbShOQVRJVkVfTEFCRUwoInN0YXJ0XyIsIG9wcywgbmFtZSkgY29kZSBOQVRJVkVfTEFCRUwoImVuZF8iLCBvcHMsIG5hbWUpKQogCiB1bnNpZ25lZCBwYXJhdmlydF9wYXRjaF9ub3Aodm9pZCk7CiB1bnNpZ25lZCBwYXJhdmlydF9wYXRjaF9pZGVudF8zMih2b2lkICppbnNuYnVmLCB1bnNpZ25lZCBsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGJiYzhiMTIuLjVhZDM4YWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTQ0NSwxMCArNDQ1LDIwIEBACiAJcmV0dXJuIGEucHRlID09IGIucHRlOwogfQogCitzdGF0aWMgaW5saW5lIGludCBwdGV2YWxfcHJlc2VudChwdGV2YWxfdCBwdGV2YWwpCit7CisJLyoKKwkgKiBZZXMgTGludXMsIF9QQUdFX1BST1ROT05FID09IF9QQUdFX05VTUEuIEV4cHJlc3NpbmcgaXQgdGhpcworCSAqIHdheSBjbGVhcmx5IHN0YXRlcyB0aGF0IHRoZSBpbnRlbnQgaXMgdGhhdCBwcm90bm9uZSBhbmQgbnVtYQorCSAqIGhpbnRpbmcgcHRlcyBhcmUgY29uc2lkZXJlZCBwcmVzZW50IGZvciB0aGUgcHVycG9zZXMgb2YKKwkgKiBwYWdldGFibGUgb3BlcmF0aW9ucyBsaWtlIHphcHBpbmcsIHByb3RlY3Rpb24gY2hhbmdlcywgZ3VwIGV0Yy4KKwkgKi8KKwlyZXR1cm4gcHRldmFsICYgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX05VTUEpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwdGVfcHJlc2VudChwdGVfdCBhKQogewotCXJldHVybiBwdGVfZmxhZ3MoYSkgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FIHwKLQkJCSAgICAgICBfUEFHRV9OVU1BKTsKKwlyZXR1cm4gcHRldmFsX3ByZXNlbnQocHRlX2ZsYWdzKGEpKTsKIH0KIAogI2RlZmluZSBwdGVfYWNjZXNzaWJsZSBwdGVfYWNjZXNzaWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCmluZGV4IGE4M2FhNDQuLjFhYTljY2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKQEAgLTEyMSw3ICsxMjEsOCBAQAogCiAvKiBTZXQgb2YgYml0cyBub3QgY2hhbmdlZCBpbiBwdGVfbW9kaWZ5ICovCiAjZGVmaW5lIF9QQUdFX0NIR19NQVNLCShQVEVfUEZOX01BU0sgfCBfUEFHRV9QQ0QgfCBfUEFHRV9QV1QgfAkJXAotCQkJIF9QQUdFX1NQRUNJQUwgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorCQkJIF9QQUdFX1NQRUNJQUwgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwJXAorCQkJIF9QQUdFX1NPRlRfRElSVFkpCiAjZGVmaW5lIF9IUEFHRV9DSEdfTUFTSyAoX1BBR0VfQ0hHX01BU0sgfCBfUEFHRV9QU0UpCiAKICNkZWZpbmUgX1BBR0VfQ0FDSEVfTUFTSwkoX1BBR0VfUENEIHwgX1BBR0VfUFdUKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggM2JhM2RlNC4uZTE5NDBjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xNjMsOSArMTYzLDExIEBACiAgKi8KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLQotLyogaG93IHRvIGdldCB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyIGZyb20gQyAqLwotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrX3BvaW50ZXIgYXNtKCJlc3AiKSBfX3VzZWQ7CisjZGVmaW5lIGN1cnJlbnRfc3RhY2tfcG9pbnRlciAoewkJXAorCXVuc2lnbmVkIGxvbmcgc3A7CQkJXAorCWFzbSgibW92ICUlZXNwLCUwIiA6ICI9ZyIgKHNwKSk7CVwKKwlzcDsJCQkJCVwKK30pCiAKIC8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggZTZkOTBiYS4uMDQ5MDViZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC02Miw3ICs2Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhZGRyKQogewotCWNvdW50X3ZtX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9PTkUpOworCWNvdW50X3ZtX3RsYl9ldmVudChOUl9UTEJfTE9DQUxfRkxVU0hfT05FKTsKIAlfX2ZsdXNoX3RsYl9zaW5nbGUoYWRkcik7CiB9CiAKQEAgLTkzLDEzICs5MywxMyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF90bGJfdXAodm9pZCkKIHsKLQljb3VudF92bV9ldmVudChOUl9UTEJfTE9DQUxfRkxVU0hfQUxMKTsKKwljb3VudF92bV90bGJfZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CiAJX19mbHVzaF90bGIoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKIHsKLQljb3VudF92bV9ldmVudChOUl9UTEJfTE9DQUxfRkxVU0hfQUxMKTsKKwljb3VudF92bV90bGJfZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CiAJX19mbHVzaF90bGJfYWxsKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91di5oCmluZGV4IDZiOTY0YTAuLjA2MjkyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXYuaApAQCAtMTIsNyArMTIsNiBAQAogZXh0ZXJuIGludCBpc191dl9zeXN0ZW0odm9pZCk7CiBleHRlcm4gdm9pZCB1dl9jcHVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHV2X25taV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgdXZfcmVnaXN0ZXJfbm1pX25vdGlmaWVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgdXZfc3lzdGVtX2luaXQodm9pZCk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGNwdW1hc2sgKnV2X2ZsdXNoX3RsYl9vdGhlcnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCiAJCQkJCQkgc3RydWN0IG1tX3N0cnVjdCAqbW0sCkBAIC0yNiw3ICsyNSw2IEBACiBzdGF0aWMgaW5saW5lIGludCBpc191dl9zeXN0ZW0odm9pZCkJeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHV2X2NwdV9pbml0KHZvaWQpCXsgfQogc3RhdGljIGlubGluZSB2b2lkIHV2X3N5c3RlbV9pbml0KHZvaWQpCXsgfQotc3RhdGljIGlubGluZSB2b2lkIHV2X3JlZ2lzdGVyX25taV9ub3RpZmllcih2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sgKgogdXZfZmx1c2hfdGxiX290aGVycyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2VtYnVmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3NlbWJ1Zi5oCmluZGV4IGVlNTBjODAuLmNjMmQ2YTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2VtYnVmLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9zZW1idWYuaApAQCAtMTMsMTIgKzEzLDEyIEBACiBzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CiAJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLwogCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CS8qIGxhc3Qgc2Vtb3AgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3Vsb25nX3QgX191bnVzZWQxOwogCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKLQl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKKwlfX2tlcm5lbF91bG9uZ190IF9fdW51c2VkMjsKKwlfX2tlcm5lbF91bG9uZ190IHNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KKwlfX2tlcm5lbF91bG9uZ190IF9fdW51c2VkMzsKKwlfX2tlcm5lbF91bG9uZ190IF9fdW51c2VkNDsKIH07CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCmluZGV4IDU5NTU0ZGMuLmRlYzhkZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogCXJldHVybiAobWFzayA+PiAoNCAqIGN1aWQpKSAmIDB4ZjsKIH0KIAotaW50IGFtZF9zZXRfc3ViY2FjaGVzKGludCBjcHUsIGludCBtYXNrKQoraW50IGFtZF9zZXRfc3ViY2FjaGVzKGludCBjcHUsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IHJlc2V0LCBiYW47CiAJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIgPSBub2RlX3RvX2FtZF9uYihhbWRfZ2V0X25iX2lkKGNwdSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKaW5kZXggYWQwZGMwNC4uZDI2M2IxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCkBAIC05ODAsNyArOTgwLDYgQEAKIAl1dl9ubWlfc2V0dXAoKTsKIAl1dl9jcHVfaW5pdCgpOwogCXV2X3NjaXJfcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCk7Ci0JdXZfcmVnaXN0ZXJfbm1pX25vdGlmaWVyKCk7CiAJcHJvY19ta2Rpcigic2dpX3V2IiwgTlVMTCk7CiAKIAkvKiByZWdpc3RlciBMZWdhY3kgVkdBIEkvTyByZWRpcmVjdGlvbiBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwppbmRleCBkMzE1M2UyLi5jNjdmZmE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTc2NywxMCArNzY3LDcgQEAKIAogc3RhdGljIHZvaWQgY3B1X3NldF90bGJfZmx1c2hhbGxfc2hpZnQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXRsYl9mbHVzaGFsbF9zaGlmdCA9IDU7Ci0KLQlpZiAoYy0+eDg2IDw9IDB4MTEpCi0JCXRsYl9mbHVzaGFsbF9zaGlmdCA9IDQ7CisJdGxiX2ZsdXNoYWxsX3NoaWZ0ID0gNjsKIH0KIAogc3RhdGljIHZvaWQgY3B1X2RldGVjdF90bGJfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCAzZGI2MWM2Li41Y2Q5YmZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC02NDAsMjEgKzY0MCwxNyBAQAogCWNhc2UgMHg2MWQ6IC8qIHNpeC1jb3JlIDQ1IG5tIHhlb24gIkR1bm5pbmd0b24iICovCiAJCXRsYl9mbHVzaGFsbF9zaGlmdCA9IC0xOwogCQlicmVhazsKKwljYXNlIDB4NjNhOiAvKiBJdnlicmlkZ2UgKi8KKwkJdGxiX2ZsdXNoYWxsX3NoaWZ0ID0gMjsKKwkJYnJlYWs7CiAJY2FzZSAweDYxYTogLyogNDUgbm0gbmVoYWxlbSwgIkJsb29tZmllbGQiICovCiAJY2FzZSAweDYxZTogLyogNDUgbm0gbmVoYWxlbSwgIkx5bm5maWVsZCIgKi8KIAljYXNlIDB4NjI1OiAvKiAzMiBubSBuZWhhbGVtLCAiQ2xhcmtkYWxlIiAqLwogCWNhc2UgMHg2MmM6IC8qIDMyIG5tIG5laGFsZW0sICJHdWxmdG93biIgKi8KIAljYXNlIDB4NjJlOiAvKiA0NSBubSBuZWhhbGVtLWV4LCAiQmVja3RvbiIgKi8KIAljYXNlIDB4NjJmOiAvKiAzMiBubSBYZW9uIEU3ICovCi0JCXRsYl9mbHVzaGFsbF9zaGlmdCA9IDY7Ci0JCWJyZWFrOwogCWNhc2UgMHg2MmE6IC8qIFNhbmR5QnJpZGdlICovCiAJY2FzZSAweDYyZDogLyogU2FuZHlCcmlkZ2UsICJSb21lbHktRVAiICovCi0JCXRsYl9mbHVzaGFsbF9zaGlmdCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgMHg2M2E6IC8qIEl2eWJyaWRnZSAqLwotCQl0bGJfZmx1c2hhbGxfc2hpZnQgPSAxOwotCQlicmVhazsKIAlkZWZhdWx0OgogCQl0bGJfZmx1c2hhbGxfc2hpZnQgPSA2OwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZF9lYXJseS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kX2Vhcmx5LmMKaW5kZXggODM4NGMwZi4uNjE3YTllMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kX2Vhcmx5LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kX2Vhcmx5LmMKQEAgLTI4NSw2ICsyODUsMTUgQEAKIAogCXVjaS0+Y3B1X3NpZy5zaWcgPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7CiB9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRfYnNwX3NpZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBic3AgPSBib290X2NwdV9kYXRhLmNwdV9pbmRleDsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgYnNwOworCisJaWYgKCF1Y2ktPmNwdV9zaWcuc2lnKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoYnNwLCBjb2xsZWN0X2NwdV9zaWdfb25fYnNwLCBOVUxMLCAxKTsKK30KICNlbHNlCiB2b2lkIGxvYWRfdWNvZGVfYW1kX2FwKHZvaWQpCiB7CkBAIC0zMzcsMzEgKzM0NiwzNyBAQAogCiBpbnQgX19pbml0IHNhdmVfbWljcm9jb2RlX2luX2luaXRyZF9hbWQodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGNvbnQ7CiAJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAJdTMyIGVheDsKIAotI2lmZGVmIENPTkZJR19YODZfMzIKLQl1bnNpZ25lZCBpbnQgYnNwID0gYm9vdF9jcHVfZGF0YS5jcHVfaW5kZXg7Ci0Jc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGJzcDsKKwlpZiAoIWNvbnRhaW5lcikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXVjaS0+Y3B1X3NpZy5zaWcpCi0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShic3AsIGNvbGxlY3RfY3B1X3NpZ19vbl9ic3AsIE5VTEwsIDEpOworI2lmZGVmIENPTkZJR19YODZfMzIKKwlnZXRfYnNwX3NpZygpOworCWNvbnQgPSAodW5zaWduZWQgbG9uZyljb250YWluZXI7CisjZWxzZQorCS8qCisJICogV2UgbmVlZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udGFpbmVyIGZvciBib3RoIGJpdG5lc3Mgc2luY2UKKwkgKiBib290X3BhcmFtcy5oZHIucmFtZGlza19pbWFnZSBpcyBhIHBoeXNpY2FsIGFkZHJlc3MuCisJICovCisJY29udCA9IF9fcGEoY29udGFpbmVyKTsKKyNlbmRpZgogCiAJLyoKLQkgKiBUYWtlIGludG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHRoZSByYW1kaXNrIG1pZ2h0IGdldCByZWxvY2F0ZWQKLQkgKiBhbmQgdGhlcmVmb3JlIHdlIG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb250YWluZXIncyBwb3NpdGlvbiBpbgotCSAqIHZpcnR1YWwgbWVtb3J5IHNwYWNlLgorCSAqIFRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgdGhlIHJhbWRpc2sgbWlnaHQgZ2V0IHJlbG9jYXRlZCBhbmQKKwkgKiB0aGVyZWZvcmUgd2UgbmVlZCB0byByZWNvbXB1dGUgdGhlIGNvbnRhaW5lcidzIHBvc2l0aW9uIGluIHZpcnR1YWwKKwkgKiBtZW1vcnkgc3BhY2UuCiAJICovCi0JY29udGFpbmVyID0gKHU4ICopKF9fdmEoKHUzMilyZWxvY2F0ZWRfcmFtZGlzaykgKwotCQkJICAgKCh1MzIpY29udGFpbmVyIC0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2UpKTsKLSNlbmRpZgorCWlmIChyZWxvY2F0ZWRfcmFtZGlzaykKKwkJY29udGFpbmVyID0gKHU4ICopKF9fdmEocmVsb2NhdGVkX3JhbWRpc2spICsKKwkJCSAgICAgKGNvbnQgLSBib290X3BhcmFtcy5oZHIucmFtZGlza19pbWFnZSkpOworCiAJaWYgKHVjb2RlX25ld19yZXYpCiAJCXByX2luZm8oIm1pY3JvY29kZTogdXBkYXRlZCBlYXJseSB0byBuZXcgcGF0Y2hfbGV2ZWw9MHglMDh4XG4iLAogCQkJdWNvZGVfbmV3X3Jldik7CiAKLQlpZiAoIWNvbnRhaW5lcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAllYXggICA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKIAllYXggICA9ICgoZWF4ID4+IDgpICYgMHhmKSArICgoZWF4ID4+IDIwKSAmIDB4ZmYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwppbmRleCBjZTJkMGEyLi4wZTI1YTFiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKQEAgLTY4Myw3ICs2ODMsNyBAQAogCX0KIAogCS8qIEZsdXNoIGFsbCBUTEJzIHZpYSBhIG1vdiAlY3IzLCAlcmVnOyBtb3YgJXJlZywgJWNyMyAqLwotCWNvdW50X3ZtX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9BTEwpOworCWNvdW50X3ZtX3RsYl9ldmVudChOUl9UTEJfTE9DQUxfRkxVU0hfQUxMKTsKIAlfX2ZsdXNoX3RsYigpOwogCiAJLyogU2F2ZSBNVFJSIHN0YXRlICovCkBAIC02OTcsNyArNjk3LDcgQEAKIHN0YXRpYyB2b2lkIHBvc3Rfc2V0KHZvaWQpIF9fcmVsZWFzZXMoc2V0X2F0b21pY2l0eV9sb2NrKQogewogCS8qIEZsdXNoIFRMQnMgKG5vIG5lZWQgdG8gZmx1c2ggY2FjaGVzIC0gdGhleSBhcmUgZGlzYWJsZWQpICovCi0JY291bnRfdm1fZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CisJY291bnRfdm1fdGxiX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9BTEwpOwogCV9fZmx1c2hfdGxiKCk7CiAKIAkvKiBJbnRlbCAoUDYpIHN0YW5kYXJkIE1UUlJzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggZGJiNjA4Ny4uZDk5ZjMxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtMjY2LDYgKzI2NiwxNCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodmVjdG9yX3VzZWRfYnlfcGVyY3B1X2lycSk7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworLyogVGhlc2UgdHdvIGRlY2xhcmF0aW9ucyBhcmUgb25seSB1c2VkIGluIGNoZWNrX2lycV92ZWN0b3JzX2Zvcl9jcHVfZGlzYWJsZSgpCisgKiBiZWxvdywgd2hpY2ggaXMgcHJvdGVjdGVkIGJ5IHN0b3BfbWFjaGluZSgpLiAgUHV0dGluZyB0aGVtIG9uIHRoZSBzdGFjaworICogcmVzdWx0cyBpbiBhIHN0YWNrIGZyYW1lIG92ZXJmbG93LiAgRHluYW1pY2FsbHkgYWxsb2NhdGluZyBjb3VsZCByZXN1bHQgaW4gYQorICogZmFpbHVyZSBzbyBkZWNsYXJlIHRoZXNlIHR3byBjcHVtYXNrcyBhcyBnbG9iYWwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1bWFzayBhZmZpbml0eV9uZXcsIG9ubGluZV9uZXc7CisKIC8qCiAgKiBUaGlzIGNwdSBpcyBnb2luZyB0byBiZSByZW1vdmVkIGFuZCBpdHMgdmVjdG9ycyBtaWdyYXRlZCB0byB0aGUgcmVtYWluaW5nCiAgKiBvbmxpbmUgY3B1cy4gIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgZW5vdWdoIHZlY3RvcnMgaW4gdGhlIHJlbWFpbmluZyBjcHVzLgpAQCAtMjc3LDcgKzI4NSw2IEBACiAJdW5zaWduZWQgaW50IHRoaXNfY3B1LCB2ZWN0b3IsIHRoaXNfY291bnQsIGNvdW50OwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGNwdW1hc2sgYWZmaW5pdHlfbmV3LCBvbmxpbmVfbmV3OwogCiAJdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJY3B1bWFza19jb3B5KCZvbmxpbmVfbmV3LCBjcHVfb25saW5lX21hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bS5jIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCmluZGV4IDZkZDgwMmMuLjcxM2YxYjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKQEAgLTUwMCw2ICs1MDAsMzggQEAKICNlbmRpZgogfQogCitzdGF0aWMgbm9pbmxpbmUgdWludDMyX3QgX19rdm1fY3B1aWRfYmFzZSh2b2lkKQoreworCWlmIChib290X2NwdV9kYXRhLmNwdWlkX2xldmVsIDwgMCkKKwkJcmV0dXJuIDA7CS8qIFNvIHdlIGRvbid0IGJsb3cgdXAgb24gb2xkIHByb2Nlc3NvcnMgKi8KKworCWlmIChjcHVfaGFzX2h5cGVydmlzb3IpCisJCXJldHVybiBoeXBlcnZpc29yX2NwdWlkX2Jhc2UoIktWTUtWTUtWTVwwXDBcMCIsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qga3ZtX2NwdWlkX2Jhc2Uodm9pZCkKK3sKKwlzdGF0aWMgaW50IGt2bV9jcHVpZF9iYXNlID0gLTE7CisKKwlpZiAoa3ZtX2NwdWlkX2Jhc2UgPT0gLTEpCisJCWt2bV9jcHVpZF9iYXNlID0gX19rdm1fY3B1aWRfYmFzZSgpOworCisJcmV0dXJuIGt2bV9jcHVpZF9iYXNlOworfQorCitib29sIGt2bV9wYXJhX2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiBrdm1fY3B1aWRfYmFzZSgpICE9IDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fcGFyYV9hdmFpbGFibGUpOworCit1bnNpZ25lZCBpbnQga3ZtX2FyY2hfcGFyYV9mZWF0dXJlcyh2b2lkKQoreworCXJldHVybiBjcHVpZF9lYXgoa3ZtX2NwdWlkX2Jhc2UoKSB8IEtWTV9DUFVJRF9GRUFUVVJFUyk7Cit9CisKIHN0YXRpYyB1aW50MzJfdCBfX2luaXQga3ZtX2RldGVjdCh2b2lkKQogewogCXJldHVybiBrdm1fY3B1aWRfYmFzZSgpOwpAQCAtNjczLDcgKzcwNSw3IEBACiAvKiBUcmFjayBzcGlubG9jayBvbiB3aGljaCBhIGNwdSBpcyB3YWl0aW5nICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGt2bV9sb2NrX3dhaXRpbmcsIGtsb2NrX3dhaXRpbmcpOwogCi1zdGF0aWMgdm9pZCBrdm1fbG9ja19zcGlubmluZyhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywgX190aWNrZXRfdCB3YW50KQorX192aXNpYmxlIHZvaWQga3ZtX2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3Qgd2FudCkKIHsKIAlzdHJ1Y3Qga3ZtX2xvY2tfd2FpdGluZyAqdzsKIAlpbnQgY3B1OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCmluZGV4IDA0ZWUxZTIuLjdjNmFjZDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTU3MSwzICs1NzEsNDAgQEAKIAkJCXF1aXJrX2FtZF9uYl9ub2RlKTsKIAogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisvKgorICogUHJvY2Vzc29yIGRvZXMgbm90IGVuc3VyZSBEUkFNIHNjcnViIHJlYWQvd3JpdGUgc2VxdWVuY2UKKyAqIGlzIGF0b21pYyB3cnQgYWNjZXNzZXMgdG8gQ0M2IHNhdmUgc3RhdGUgYXJlYS4gVGhlcmVmb3JlCisgKiBpZiBhIGNvbmN1cnJlbnQgc2NydWIgcmVhZC93cml0ZSBhY2Nlc3MgaXMgdG8gc2FtZSBhZGRyZXNzCisgKiB0aGUgZW50cnkgbWF5IGFwcGVhciBhcyBpZiBpdCBpcyBub3Qgd3JpdHRlbi4gVGhpcyBxdWlyaworICogYXBwbGllcyB0byBGYW0xNmggbW9kZWxzIDAwaC0wRmgKKyAqCisgKiBTZWUgIlJldmlzaW9uIEd1aWRlIiBmb3IgQU1EIEYxNmggbW9kZWxzIDAwaC0wZmgsCisgKiBkb2N1bWVudCA1MTgxMCByZXYuIDMuMDQsIE5vdiAyMDEzCisgKi8KK3N0YXRpYyB2b2lkIGFtZF9kaXNhYmxlX3NlcV9hbmRfcmVkaXJlY3Rfc2NydWIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgdmFsOworCisJLyoKKwkgKiBTdWdnZXN0ZWQgd29ya2Fyb3VuZDoKKwkgKiBzZXQgRDE4RjN4NThbNDowXSA9IDAwaCBhbmQgc2V0IEQxOEYzeDVDWzBdID0gMGIKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDU4LCAmdmFsKTsKKwlpZiAodmFsICYgMHgxRikgeworCQl2YWwgJj0gfigweDFGKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NTgsIHZhbCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1QywgJnZhbCk7CisJaWYgKHZhbCAmIEJJVCgwKSkgeworCQl2YWwgJj0gfkJJVCgwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIHZhbCk7CisJfQorfQorCitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTZIX05CX0YzLAorCQkJYW1kX2Rpc2FibGVfc2VxX2FuZF9yZWRpcmVjdF9zY3J1Yik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzbXBfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC92c21wXzY0LmMKaW5kZXggOTkyZjg5MC4uZjY1ODRhOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZzbXBfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnNtcF82NC5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBhbmQgdmljZSB2ZXJzYS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2c21wX3NhdmVfZmwodm9pZCkKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyB2c21wX3NhdmVfZmwodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gbmF0aXZlX3NhdmVfZmwoKTsKIApAQCAtNDMsNyArNDMsNyBAQAogfQogUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh2c21wX3NhdmVfZmwpOwogCi1zdGF0aWMgdm9pZCB2c21wX3Jlc3RvcmVfZmwodW5zaWduZWQgbG9uZyBmbGFncykKK19fdmlzaWJsZSB2b2lkIHZzbXBfcmVzdG9yZV9mbCh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWlmIChmbGFncyAmIFg4Nl9FRkxBR1NfSUYpCiAJCWZsYWdzICY9IH5YODZfRUZMQUdTX0FDOwpAQCAtNTMsNyArNTMsNyBAQAogfQogUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh2c21wX3Jlc3RvcmVfZmwpOwogCi1zdGF0aWMgdm9pZCB2c21wX2lycV9kaXNhYmxlKHZvaWQpCithc21saW5rYWdlIHZvaWQgdnNtcF9pcnFfZGlzYWJsZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBuYXRpdmVfc2F2ZV9mbCgpOwogCkBAIC02MSw3ICs2MSw3IEBACiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHZzbXBfaXJxX2Rpc2FibGUpOwogCi1zdGF0aWMgdm9pZCB2c21wX2lycV9lbmFibGUodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCB2c21wX2lycV9lbmFibGUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gbmF0aXZlX3NhdmVfZmwoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2NwdWlkLmggYi9hcmNoL3g4Ni9rdm0vY3B1aWQuaAppbmRleCBmMWU0ODk1Li5hMmExYmI3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vY3B1aWQuaAorKysgYi9hcmNoL3g4Ni9rdm0vY3B1aWQuaApAQCAtNzIsNCArNzIsMTIgQEAKIAlyZXR1cm4gYmVzdCAmJiAoYmVzdC0+ZWN4ICYgYml0KFg4Nl9GRUFUVVJFX1BDSUQpKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGd1ZXN0X2NwdWlkX2hhc194MmFwaWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkyICpiZXN0OworCisJYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDEsIDApOworCXJldHVybiBiZXN0ICYmIChiZXN0LT5lY3ggJiBiaXQoWDg2X0ZFQVRVUkVfWDJBUElDKSk7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmggYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaAppbmRleCBjOGIwZDBkLi42YTExODQ1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuaAorKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaApAQCAtNjUsNyArNjUsNyBAQAogCQlzdHJ1Y3Qga3ZtX2xhcGljX2lycSAqaXJxLCBpbnQgKnIsIHVuc2lnbmVkIGxvbmcgKmRlc3RfbWFwKTsKIAogdTY0IGt2bV9nZXRfYXBpY19iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci12b2lkIGt2bV9zZXRfYXBpY19iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGRhdGEpOworaW50IGt2bV9zZXRfYXBpY19iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IG1zcl9kYXRhICptc3JfaW5mbyk7CiB2b2lkIGt2bV9hcGljX3Bvc3Rfc3RhdGVfcmVzdG9yZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCXN0cnVjdCBrdm1fbGFwaWNfc3RhdGUgKnMpOwogaW50IGt2bV9sYXBpY19maW5kX2hpZ2hlc3RfaXJyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggNWM4ODc5MS4uYTA2ZjEwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtNDM5Miw3ICs0MzkyLDcgQEAKIHN0YXRpYyB2b2lkIHZteF92Y3B1X3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKLQl1NjQgbXNyOworCXN0cnVjdCBtc3JfZGF0YSBhcGljX2Jhc2VfbXNyOwogCiAJdm14LT5ybW9kZS52bTg2X2FjdGl2ZSA9IDA7CiAKQEAgLTQ0MDAsMTAgKzQ0MDAsMTEgQEAKIAogCXZteC0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JEWF0gPSBnZXRfcmR4X2luaXRfdmFsKCk7CiAJa3ZtX3NldF9jcjgoJnZteC0+dmNwdSwgMCk7Ci0JbXNyID0gMHhmZWUwMDAwMCB8IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRTsKKwlhcGljX2Jhc2VfbXNyLmRhdGEgPSAweGZlZTAwMDAwIHwgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFOwogCWlmIChrdm1fdmNwdV9pc19ic3AoJnZteC0+dmNwdSkpCi0JCW1zciB8PSBNU1JfSUEzMl9BUElDQkFTRV9CU1A7Ci0Ja3ZtX3NldF9hcGljX2Jhc2UoJnZteC0+dmNwdSwgbXNyKTsKKwkJYXBpY19iYXNlX21zci5kYXRhIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0JTUDsKKwlhcGljX2Jhc2VfbXNyLmhvc3RfaW5pdGlhdGVkID0gdHJ1ZTsKKwlrdm1fc2V0X2FwaWNfYmFzZSgmdm14LT52Y3B1LCAmYXBpY19iYXNlX21zcik7CiAKIAl2bXhfc2VnbWVudF9jYWNoZV9jbGVhcih2bXgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmMgYi9hcmNoL3g4Ni9rdm0veDg2LmMKaW5kZXggMGM3NmY3Yy4uMzljMjhmMDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTI1NywxMCArMjU3LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fZ2V0X2FwaWNfYmFzZSk7CiAKLXZvaWQga3ZtX3NldF9hcGljX2Jhc2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZGF0YSkKK2ludCBrdm1fc2V0X2FwaWNfYmFzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBtc3JfZGF0YSAqbXNyX2luZm8pCiB7Ci0JLyogVE9ETzogcmVzZXJ2ZSBiaXRzIGNoZWNrICovCi0Ja3ZtX2xhcGljX3NldF9iYXNlKHZjcHUsIGRhdGEpOworCXU2NCBvbGRfc3RhdGUgPSB2Y3B1LT5hcmNoLmFwaWNfYmFzZSAmCisJCShNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBYMkFQSUNfRU5BQkxFKTsKKwl1NjQgbmV3X3N0YXRlID0gbXNyX2luZm8tPmRhdGEgJgorCQkoTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgWDJBUElDX0VOQUJMRSk7CisJdTY0IHJlc2VydmVkX2JpdHMgPSAoKH4wVUxMKSA8PCBjcHVpZF9tYXhwaHlhZGRyKHZjcHUpKSB8CisJCTB4MmZmIHwgKGd1ZXN0X2NwdWlkX2hhc194MmFwaWModmNwdSkgPyAwIDogWDJBUElDX0VOQUJMRSk7CisKKwlpZiAoIW1zcl9pbmZvLT5ob3N0X2luaXRpYXRlZCAmJgorCSAgICAoKG1zcl9pbmZvLT5kYXRhICYgcmVzZXJ2ZWRfYml0cykgIT0gMCB8fAorCSAgICAgbmV3X3N0YXRlID09IFgyQVBJQ19FTkFCTEUgfHwKKwkgICAgIChuZXdfc3RhdGUgPT0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFICYmCisJICAgICAgb2xkX3N0YXRlID09IChNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBYMkFQSUNfRU5BQkxFKSkgfHwKKwkgICAgIChuZXdfc3RhdGUgPT0gKE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IFgyQVBJQ19FTkFCTEUpICYmCisJICAgICAgb2xkX3N0YXRlID09IDApKSkKKwkJcmV0dXJuIDE7CisKKwlrdm1fbGFwaWNfc2V0X2Jhc2UodmNwdSwgbXNyX2luZm8tPmRhdGEpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3NldF9hcGljX2Jhc2UpOwogCkBAIC0xODQwLDYgKzE4NTYsNyBAQAogCQlpZiAoX19jb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYWRkciwgaW5zdHJ1Y3Rpb25zLCA0KSkKIAkJCXJldHVybiAxOwogCQlrdm0tPmFyY2guaHZfaHlwZXJjYWxsID0gZGF0YTsKKwkJbWFya19wYWdlX2RpcnR5KGt2bSwgZ2ZuKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSFZfWDY0X01TUl9SRUZFUkVOQ0VfVFNDOiB7CkBAIC0xODY4LDE5ICsxODg1LDIxIEBACiB7CiAJc3dpdGNoIChtc3IpIHsKIAljYXNlIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRTogeworCQl1NjQgZ2ZuOwogCQl1bnNpZ25lZCBsb25nIGFkZHI7CiAKIAkJaWYgKCEoZGF0YSAmIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9FTkFCTEUpKSB7CiAJCQl2Y3B1LT5hcmNoLmh2X3ZhcGljID0gZGF0YTsKIAkJCWJyZWFrOwogCQl9Ci0JCWFkZHIgPSBnZm5fdG9faHZhKHZjcHUtPmt2bSwgZGF0YSA+PgotCQkJCSAgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0FERFJFU1NfU0hJRlQpOworCQlnZm4gPSBkYXRhID4+IEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9BRERSRVNTX1NISUZUOworCQlhZGRyID0gZ2ZuX3RvX2h2YSh2Y3B1LT5rdm0sIGdmbik7CiAJCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQkJcmV0dXJuIDE7CiAJCWlmIChfX2NsZWFyX3VzZXIoKHZvaWQgX191c2VyICopYWRkciwgUEFHRV9TSVpFKSkKIAkJCXJldHVybiAxOwogCQl2Y3B1LT5hcmNoLmh2X3ZhcGljID0gZGF0YTsKKwkJbWFya19wYWdlX2RpcnR5KHZjcHUtPmt2bSwgZ2ZuKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSFZfWDY0X01TUl9FT0k6CkBAIC0yMDA2LDggKzIwMjUsNyBAQAogCWNhc2UgMHgyMDAgLi4uIDB4MmZmOgogCQlyZXR1cm4gc2V0X21zcl9tdHJyKHZjcHUsIG1zciwgZGF0YSk7CiAJY2FzZSBNU1JfSUEzMl9BUElDQkFTRToKLQkJa3ZtX3NldF9hcGljX2Jhc2UodmNwdSwgZGF0YSk7Ci0JCWJyZWFrOworCQlyZXR1cm4ga3ZtX3NldF9hcGljX2Jhc2UodmNwdSwgbXNyX2luZm8pOwogCWNhc2UgQVBJQ19CQVNFX01TUiAuLi4gQVBJQ19CQVNFX01TUiArIDB4M2ZmOgogCQlyZXR1cm4ga3ZtX3gyYXBpY19tc3Jfd3JpdGUodmNwdSwgbXNyLCBkYXRhKTsKIAljYXNlIE1TUl9JQTMyX1RTQ0RFQURMSU5FOgpAQCAtMjU5OCwxMCArMjYxNiwxMCBAQAogCWNhc2UgS1ZNX0NBUF9HRVRfVFNDX0tIWjoKIAljYXNlIEtWTV9DQVBfS1ZNQ0xPQ0tfQ1RSTDoKIAljYXNlIEtWTV9DQVBfUkVBRE9OTFlfTUVNOgorCWNhc2UgS1ZNX0NBUF9IWVBFUlZfVElNRToKICNpZmRlZiBDT05GSUdfS1ZNX0RFVklDRV9BU1NJR05NRU5UCiAJY2FzZSBLVk1fQ0FQX0FTU0lHTl9ERVZfSVJROgogCWNhc2UgS1ZNX0NBUF9QQ0lfMl8zOgotCWNhc2UgS1ZNX0NBUF9IWVBFUlZfVElNRToKICNlbmRpZgogCQlyID0gMTsKIAkJYnJlYWs7CkBAIC02NDA5LDYgKzY0MjcsNyBAQAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X3NyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQogeworCXN0cnVjdCBtc3JfZGF0YSBhcGljX2Jhc2VfbXNyOwogCWludCBtbXVfcmVzZXRfbmVlZGVkID0gMDsKIAlpbnQgcGVuZGluZ192ZWMsIG1heF9iaXRzLCBpZHg7CiAJc3RydWN0IGRlc2NfcHRyIGR0OwpAQCAtNjQzMiw3ICs2NDUxLDkgQEAKIAogCW1tdV9yZXNldF9uZWVkZWQgfD0gdmNwdS0+YXJjaC5lZmVyICE9IHNyZWdzLT5lZmVyOwogCWt2bV94ODZfb3BzLT5zZXRfZWZlcih2Y3B1LCBzcmVncy0+ZWZlcik7Ci0Ja3ZtX3NldF9hcGljX2Jhc2UodmNwdSwgc3JlZ3MtPmFwaWNfYmFzZSk7CisJYXBpY19iYXNlX21zci5kYXRhID0gc3JlZ3MtPmFwaWNfYmFzZTsKKwlhcGljX2Jhc2VfbXNyLmhvc3RfaW5pdGlhdGVkID0gdHJ1ZTsKKwlrdm1fc2V0X2FwaWNfYmFzZSh2Y3B1LCAmYXBpY19iYXNlX21zcik7CiAKIAltbXVfcmVzZXRfbmVlZGVkIHw9IGt2bV9yZWFkX2NyMCh2Y3B1KSAhPSBzcmVncy0+Y3IwOwogCWt2bV94ODZfb3BzLT5zZXRfY3IwKHZjcHUsIHNyZWdzLT5jcjApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggYmRmODUzMi4uYWQxZmI1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC0yMzMsMTMgKzIzMywxMyBAQAogICogZmxhZ3Mgd29yZCBjb250YWlucyBhbGwga2luZCBvZiBzdHVmZiwgYnV0IGluIHByYWN0aWNlIExpbnV4IG9ubHkgY2FyZXMKICAqIGFib3V0IHRoZSBpbnRlcnJ1cHQgZmxhZy4gIE91ciAic2F2ZV9mbGFncygpIiBqdXN0IHJldHVybnMgdGhhdC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZV9mbCh2b2lkKQorYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIGxndWVzdF9zYXZlX2ZsKHZvaWQpCiB7CiAJcmV0dXJuIGxndWVzdF9kYXRhLmlycV9lbmFibGVkOwogfQogCiAvKiBJbnRlcnJ1cHRzIGdvIG9mZi4uLiAqLwotc3RhdGljIHZvaWQgaXJxX2Rpc2FibGUodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBsZ3Vlc3RfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAlsZ3Vlc3RfZGF0YS5pcnFfZW5hYmxlZCA9IDA7CiB9CkBAIC0yNTMsOCArMjUzLDggQEAKICAqIFBWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoKSwgd2hpY2ggcHVzaGVzICVlYXggb250byB0aGUgc3RhY2ssIGNhbGxzIHRoZQogICogQyBmdW5jdGlvbiwgdGhlbiByZXN0b3JlcyBpdC4KICAqLwotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyhzYXZlX2ZsKTsKLVBWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoaXJxX2Rpc2FibGUpOworUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyhsZ3Vlc3Rfc2F2ZV9mbCk7CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKGxndWVzdF9pcnFfZGlzYWJsZSk7CiAvKjoqLwogCiAvKiBUaGVzZSBhcmUgaW4gaTM4Nl9oZWFkLlMgKi8KQEAgLTEyOTEsOSArMTI5MSw5IEBACiAJICovCiAKIAkvKiBJbnRlcnJ1cHQtcmVsYXRlZCBvcGVyYXRpb25zICovCi0JcHZfaXJxX29wcy5zYXZlX2ZsID0gUFZfQ0FMTEVFX1NBVkUoc2F2ZV9mbCk7CisJcHZfaXJxX29wcy5zYXZlX2ZsID0gUFZfQ0FMTEVFX1NBVkUobGd1ZXN0X3NhdmVfZmwpOwogCXB2X2lycV9vcHMucmVzdG9yZV9mbCA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUobGdfcmVzdG9yZV9mbCk7Ci0JcHZfaXJxX29wcy5pcnFfZGlzYWJsZSA9IFBWX0NBTExFRV9TQVZFKGlycV9kaXNhYmxlKTsKKwlwdl9pcnFfb3BzLmlycV9kaXNhYmxlID0gUFZfQ0FMTEVFX1NBVkUobGd1ZXN0X2lycV9kaXNhYmxlKTsKIAlwdl9pcnFfb3BzLmlycV9lbmFibGUgPSBfX1BWX0lTX0NBTExFRV9TQVZFKGxnX2lycV9lbmFibGUpOwogCXB2X2lycV9vcHMuc2FmZV9oYWx0ID0gbGd1ZXN0X3NhZmVfaGFsdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWF0aC1lbXUvZXJyb3JzLmMgYi9hcmNoL3g4Ni9tYXRoLWVtdS9lcnJvcnMuYwppbmRleCA1OWQzNTNkLi5hNTQ0OTA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tYXRoLWVtdS9lcnJvcnMuYworKysgYi9hcmNoL3g4Ni9tYXRoLWVtdS9lcnJvcnMuYwpAQCAtMzMwLDExICszMzAsNiBAQAogCiAJUkVfRU5UUkFOVF9DSEVDS19PRkY7CiAJaWYgKCh+Y29udHJvbF93b3JkICYgbiAmIENXX0V4Y2VwdGlvbnMpIHx8IChuID09IEVYX0lOVEVSTkFMKSkgewotI2lmZGVmIFBSSU5UX01FU1NBR0VTCi0JCS8qIE15IG1lc3NhZ2UgZnJvbSB0aGUgc3BvbnNvciAqLwotCQlwcmludGsoRlBVX1ZFUlNJT04gIiAiIF9fREFURV9fICIgKEMpIFcuIE1ldHplbnRoZW4uXG4iKTsKLSNlbmRpZiAvKiBQUklOVF9NRVNTQUdFUyAqLwotCiAJCS8qIEdldCBhIG5hbWUgc3RyaW5nIGZvciBlcnJvciByZXBvcnRpbmcgKi8KIAkJZm9yIChpID0gMDsgZXhjZXB0aW9uX25hbWVzW2ldLnR5cGU7IGkrKykKIAkJCWlmICgoZXhjZXB0aW9uX25hbWVzW2ldLnR5cGUgJiBuKSA9PQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYS5jIGIvYXJjaC94ODYvbW0vbnVtYS5jCmluZGV4IDgxYjI3NTAuLjI3YWEwNDU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYS5jCkBAIC00OTMsMTQgKzQ5Myw2IEBACiAJCXN0cnVjdCBudW1hX21lbWJsayAqbWIgPSAmbWktPmJsa1tpXTsKIAkJbWVtYmxvY2tfc2V0X25vZGUobWItPnN0YXJ0LCBtYi0+ZW5kIC0gbWItPnN0YXJ0LAogCQkJCSAgJm1lbWJsb2NrLm1lbW9yeSwgbWItPm5pZCk7Ci0KLQkJLyoKLQkJICogQXQgdGhpcyB0aW1lLCBhbGwgbWVtb3J5IHJlZ2lvbnMgcmVzZXJ2ZWQgYnkgbWVtYmxvY2sgYXJlCi0JCSAqIHVzZWQgYnkgdGhlIGtlcm5lbC4gU2V0IHRoZSBuaWQgaW4gbWVtYmxvY2sucmVzZXJ2ZWQgd2lsbAotCQkgKiBtYXJrIG91dCBhbGwgdGhlIG5vZGVzIHRoZSBrZXJuZWwgcmVzaWRlcyBpbi4KLQkJICovCi0JCW1lbWJsb2NrX3NldF9ub2RlKG1iLT5zdGFydCwgbWItPmVuZCAtIG1iLT5zdGFydCwKLQkJCQkgICZtZW1ibG9jay5yZXNlcnZlZCwgbWItPm5pZCk7CiAJfQogCiAJLyoKQEAgLTU2NSwxMCArNTU3LDIxIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbnVtYV9jbGVhcl9rZXJuZWxfbm9kZV9ob3RwbHVnKHZvaWQpCiB7CiAJaW50IGksIG5pZDsKLQlub2RlbWFza190IG51bWFfa2VybmVsX25vZGVzOworCW5vZGVtYXNrX3QgbnVtYV9rZXJuZWxfbm9kZXMgPSBOT0RFX01BU0tfTk9ORTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAJc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUgPSAmbWVtYmxvY2sucmVzZXJ2ZWQ7CiAKKwkvKgorCSAqIEF0IHRoaXMgdGltZSwgYWxsIG1lbW9yeSByZWdpb25zIHJlc2VydmVkIGJ5IG1lbWJsb2NrIGFyZQorCSAqIHVzZWQgYnkgdGhlIGtlcm5lbC4gU2V0IHRoZSBuaWQgaW4gbWVtYmxvY2sucmVzZXJ2ZWQgd2lsbAorCSAqIG1hcmsgb3V0IGFsbCB0aGUgbm9kZXMgdGhlIGtlcm5lbCByZXNpZGVzIGluLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1hX21lbWluZm8ubnJfYmxrczsgaSsrKSB7CisJCXN0cnVjdCBudW1hX21lbWJsayAqbWIgPSAmbnVtYV9tZW1pbmZvLmJsa1tpXTsKKwkJbWVtYmxvY2tfc2V0X25vZGUobWItPnN0YXJ0LCBtYi0+ZW5kIC0gbWItPnN0YXJ0LAorCQkJCSAgJm1lbWJsb2NrLnJlc2VydmVkLCBtYi0+bmlkKTsKKwl9CisKIAkvKiBNYXJrIGFsbCBrZXJuZWwgbm9kZXMuICovCiAJZm9yIChpID0gMDsgaSA8IHR5cGUtPmNudDsgaSsrKQogCQlub2RlX3NldCh0eXBlLT5yZWdpb25zW2ldLm5pZCwgbnVtYV9rZXJuZWxfbm9kZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYV8zMi5jIGIvYXJjaC94ODYvbW0vbnVtYV8zMi5jCmluZGV4IDAzNDJkMjcuLjQ3YjY0MzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWFfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKQEAgLTUyLDYgKzUyLDggQEAKIAkJCW5pZCwgc3RhcnQsIGVuZCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiAgU2V0dGluZyBwaHlzbm9kZV9tYXAgYXJyYXkgdG8gbm9kZSAlZCBmb3IgcGZuczpcbiIsIG5pZCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiAgIik7CisJc3RhcnQgPSByb3VuZF9kb3duKHN0YXJ0LCBQQUdFU19QRVJfU0VDVElPTik7CisJZW5kID0gcm91bmRfdXAoZW5kLCBQQUdFU19QRVJfU0VDVElPTik7CiAJZm9yIChwZm4gPSBzdGFydDsgcGZuIDwgZW5kOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKIAkJcGh5c25vZGVfbWFwW3BmbiAvIFBBR0VTX1BFUl9TRUNUSU9OXSA9IG5pZDsKIAkJcHJpbnRrKEtFUk5fQ09OVCAiJWx4ICIsIHBmbik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zcmF0LmMgYi9hcmNoL3g4Ni9tbS9zcmF0LmMKaW5kZXggMWEyNTE4Ny4uMTk1M2U5YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vc3JhdC5jCisrKyBiL2FyY2gveDg2L21tL3NyYXQuYwpAQCAtNDIsMTUgKzQyLDI1IEBACiAJcmV0dXJuIGFjcGlfbnVtYSA8IDA7CiB9CiAKLS8qIENhbGxiYWNrIGZvciBTTElUIHBhcnNpbmcgKi8KKy8qCisgKiBDYWxsYmFjayBmb3IgU0xJVCBwYXJzaW5nLiAgcHhtX3RvX25vZGUoKSByZXR1cm5zIE5VTUFfTk9fTk9ERSBmb3IKKyAqIEkvTyBsb2NhbGl0aWVzIHNpbmNlIFNSQVQgZG9lcyBub3QgbGlzdCB0aGVtLiAgSS9PIGxvY2FsaXRpZXMgYXJlCisgKiBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgcG9pbnQuCisgKi8KIHZvaWQgX19pbml0IGFjcGlfbnVtYV9zbGl0X2luaXQoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKIHsKIAlpbnQgaSwgajsKIAotCWZvciAoaSA9IDA7IGkgPCBzbGl0LT5sb2NhbGl0eV9jb3VudDsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGorKykKKwlmb3IgKGkgPSAwOyBpIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGkrKykgeworCQlpZiAocHhtX3RvX25vZGUoaSkgPT0gTlVNQV9OT19OT0RFKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBzbGl0LT5sb2NhbGl0eV9jb3VudDsgaisrKSB7CisJCQlpZiAocHhtX3RvX25vZGUoaikgPT0gTlVNQV9OT19OT0RFKQorCQkJCWNvbnRpbnVlOwogCQkJbnVtYV9zZXRfZGlzdGFuY2UocHhtX3RvX25vZGUoaSksIHB4bV90b19ub2RlKGopLAogCQkJCXNsaXQtPmVudHJ5W3NsaXQtPmxvY2FsaXR5X2NvdW50ICogaSArIGpdKTsKKwkJfQorCX0KIH0KIAogLyogQ2FsbGJhY2sgZm9yIFByb3hpbWl0eSBEb21haW4gLT4geDJBUElDIG1hcHBpbmcgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3RsYi5jIGIvYXJjaC94ODYvbW0vdGxiLmMKaW5kZXggYWU2OTliMy4uZGQ4ZGRhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vdGxiLmMKKysrIGIvYXJjaC94ODYvbW0vdGxiLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCWlmIChmLT5mbHVzaF9tbSAhPSB0aGlzX2NwdV9yZWFkKGNwdV90bGJzdGF0ZS5hY3RpdmVfbW0pKQogCQlyZXR1cm47CiAKLQljb3VudF92bV9ldmVudChOUl9UTEJfUkVNT1RFX0ZMVVNIX1JFQ0VJVkVEKTsKKwljb3VudF92bV90bGJfZXZlbnQoTlJfVExCX1JFTU9URV9GTFVTSF9SRUNFSVZFRCk7CiAJaWYgKHRoaXNfY3B1X3JlYWQoY3B1X3RsYnN0YXRlLnN0YXRlKSA9PSBUTEJTVEFURV9PSykgewogCQlpZiAoZi0+Zmx1c2hfZW5kID09IFRMQl9GTFVTSF9BTEwpCiAJCQlsb2NhbF9mbHVzaF90bGIoKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCWluZm8uZmx1c2hfc3RhcnQgPSBzdGFydDsKIAlpbmZvLmZsdXNoX2VuZCA9IGVuZDsKIAotCWNvdW50X3ZtX2V2ZW50KE5SX1RMQl9SRU1PVEVfRkxVU0gpOworCWNvdW50X3ZtX3RsYl9ldmVudChOUl9UTEJfUkVNT1RFX0ZMVVNIKTsKIAlpZiAoaXNfdXZfc3lzdGVtKCkpIHsKIAkJdW5zaWduZWQgaW50IGNwdTsKIApAQCAtMTUxLDQ0ICsxNTEsMTkgQEAKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCi0JY291bnRfdm1fZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CisJY291bnRfdm1fdGxiX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9BTEwpOwogCWxvY2FsX2ZsdXNoX3RsYigpOwogCWlmIChjcHVtYXNrX2FueV9idXQobW1fY3B1bWFzayhtbSksIHNtcF9wcm9jZXNzb3JfaWQoKSkgPCBucl9jcHVfaWRzKQogCQlmbHVzaF90bGJfb3RoZXJzKG1tX2NwdW1hc2sobW0pLCBtbSwgMFVMLCBUTEJfRkxVU0hfQUxMKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi0vKgotICogSXQgY2FuIGZpbmQgb3V0IHRoZSBUSFAgbGFyZ2UgcGFnZSwgb3IKLSAqIEhVR0VUTEIgcGFnZSBpbiB0bGJfZmx1c2ggd2hlbiBUSFAgZGlzYWJsZWQKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc19sYXJnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlwZ2RfdCAqcGdkOwotCXB1ZF90ICpwdWQ7Ci0JcG1kX3QgKnBtZDsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBBTElHTihzdGFydCwgSFBBR0VfU0laRSk7Ci0JZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gSFBBR0VfU0laRSkgewotCQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKLQkJaWYgKGxpa2VseSghcGdkX25vbmUoKnBnZCkpKSB7Ci0JCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7Ci0JCQlpZiAobGlrZWx5KCFwdWRfbm9uZSgqcHVkKSkpIHsKLQkJCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7Ci0JCQkJaWYgKGxpa2VseSghcG1kX25vbmUoKnBtZCkpKQotCQkJCQlpZiAocG1kX2xhcmdlKCpwbWQpKQotCQkJCQkJcmV0dXJuIGFkZHI7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgZmx1c2hfdGxiX21tX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHZtZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgYWN0X2VudHJpZXMsIHRsYl9lbnRyaWVzID0gMDsKKwl1bnNpZ25lZCBsb25nIG5yX2Jhc2VfcGFnZXM7CiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlpZiAoY3VycmVudC0+YWN0aXZlX21tICE9IG1tKQpAQCAtMjEwLDIxICsxODUsMjAgQEAKIAkJdGxiX2VudHJpZXMgPSB0bGJfbGxpXzRrW0VOVFJJRVNdOwogCWVsc2UKIAkJdGxiX2VudHJpZXMgPSB0bGJfbGxkXzRrW0VOVFJJRVNdOworCiAJLyogQXNzdW1lIGFsbCBvZiBUTEIgZW50cmllcyB3YXMgb2NjdXBpZWQgYnkgdGhpcyB0YXNrICovCi0JYWN0X2VudHJpZXMgPSBtbS0+dG90YWxfdm0gPiB0bGJfZW50cmllcyA/IHRsYl9lbnRyaWVzIDogbW0tPnRvdGFsX3ZtOworCWFjdF9lbnRyaWVzID0gdGxiX2VudHJpZXMgPj4gdGxiX2ZsdXNoYWxsX3NoaWZ0OworCWFjdF9lbnRyaWVzID0gbW0tPnRvdGFsX3ZtID4gYWN0X2VudHJpZXMgPyBhY3RfZW50cmllcyA6IG1tLT50b3RhbF92bTsKKwlucl9iYXNlX3BhZ2VzID0gKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUOwogCiAJLyogdGxiX2ZsdXNoYWxsX3NoaWZ0IGlzIG9uIGJhbGFuY2UgcG9pbnQsIGRldGFpbHMgaW4gY29tbWl0IGxvZyAqLwotCWlmICgoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQgPiBhY3RfZW50cmllcyA+PiB0bGJfZmx1c2hhbGxfc2hpZnQpIHsKLQkJY291bnRfdm1fZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CisJaWYgKG5yX2Jhc2VfcGFnZXMgPiBhY3RfZW50cmllcykgeworCQljb3VudF92bV90bGJfZXZlbnQoTlJfVExCX0xPQ0FMX0ZMVVNIX0FMTCk7CiAJCWxvY2FsX2ZsdXNoX3RsYigpOwogCX0gZWxzZSB7Ci0JCWlmIChoYXNfbGFyZ2VfcGFnZShtbSwgc3RhcnQsIGVuZCkpIHsKLQkJCWxvY2FsX2ZsdXNoX3RsYigpOwotCQkJZ290byBmbHVzaF9hbGw7Ci0JCX0KIAkJLyogZmx1c2ggcmFuZ2UgYnkgb25lIGJ5IG9uZSAnaW52bHBnJyAqLwogCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsJYWRkciArPSBQQUdFX1NJWkUpIHsKLQkJCWNvdW50X3ZtX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9PTkUpOworCQkJY291bnRfdm1fdGxiX2V2ZW50KE5SX1RMQl9MT0NBTF9GTFVTSF9PTkUpOwogCQkJX19mbHVzaF90bGJfc2luZ2xlKGFkZHIpOwogCQl9CiAKQEAgLTI2Miw3ICsyMzYsNyBAQAogCiBzdGF0aWMgdm9pZCBkb19mbHVzaF90bGJfYWxsKHZvaWQgKmluZm8pCiB7Ci0JY291bnRfdm1fZXZlbnQoTlJfVExCX1JFTU9URV9GTFVTSF9SRUNFSVZFRCk7CisJY291bnRfdm1fdGxiX2V2ZW50KE5SX1RMQl9SRU1PVEVfRkxVU0hfUkVDRUlWRUQpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwogCWlmICh0aGlzX2NwdV9yZWFkKGNwdV90bGJzdGF0ZS5zdGF0ZSkgPT0gVExCU1RBVEVfTEFaWSkKIAkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKQEAgLTI3MCw3ICsyNDQsNyBAQAogCiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKIHsKLQljb3VudF92bV9ldmVudChOUl9UTEJfUkVNT1RFX0ZMVVNIKTsKKwljb3VudF92bV90bGJfZXZlbnQoTlJfVExCX1JFTU9URV9GTFVTSCk7CiAJb25fZWFjaF9jcHUoZG9fZmx1c2hfdGxiX2FsbCwgTlVMTCwgMSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS1iZ3J0LmMKaW5kZXggNzE0NWVjNi4uNGRmOTU5MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS1iZ3J0LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS1iZ3J0LmMKQEAgLTQ5LDcgKzQ5LDggQEAKIAogCWltYWdlID0gZWZpX2xvb2t1cF9tYXBwZWRfYWRkcihiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcyk7CiAJaWYgKCFpbWFnZSkgewotCQlpbWFnZSA9IGlvcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsIHNpemVvZihibXBfaGVhZGVyKSk7CisJCWltYWdlID0gZWFybHlfbWVtcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsCisJCQkJICAgICAgIHNpemVvZihibXBfaGVhZGVyKSk7CiAJCWlvcmVtYXBwZWQgPSB0cnVlOwogCQlpZiAoIWltYWdlKQogCQkJcmV0dXJuOwpAQCAtNTcsNyArNTgsNyBAQAogCiAJbWVtY3B5X2Zyb21pbygmYm1wX2hlYWRlciwgaW1hZ2UsIHNpemVvZihibXBfaGVhZGVyKSk7CiAJaWYgKGlvcmVtYXBwZWQpCi0JCWlvdW5tYXAoaW1hZ2UpOworCQllYXJseV9pb3VubWFwKGltYWdlLCBzaXplb2YoYm1wX2hlYWRlcikpOwogCWJncnRfaW1hZ2Vfc2l6ZSA9IGJtcF9oZWFkZXIuc2l6ZTsKIAogCWJncnRfaW1hZ2UgPSBrbWFsbG9jKGJncnRfaW1hZ2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC02NSw3ICs2Niw4IEBACiAJCXJldHVybjsKIAogCWlmIChpb3JlbWFwcGVkKSB7Ci0JCWltYWdlID0gaW9yZW1hcChiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywgYm1wX2hlYWRlci5zaXplKTsKKwkJaW1hZ2UgPSBlYXJseV9tZW1yZW1hcChiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywKKwkJCQkgICAgICAgYm1wX2hlYWRlci5zaXplKTsKIAkJaWYgKCFpbWFnZSkgewogCQkJa2ZyZWUoYmdydF9pbWFnZSk7CiAJCQliZ3J0X2ltYWdlID0gTlVMTDsKQEAgLTc1LDUgKzc3LDUgQEAKIAogCW1lbWNweV9mcm9taW8oYmdydF9pbWFnZSwgaW1hZ2UsIGJncnRfaW1hZ2Vfc2l6ZSk7CiAJaWYgKGlvcmVtYXBwZWQpCi0JCWlvdW5tYXAoaW1hZ2UpOworCQllYXJseV9pb3VubWFwKGltYWdlLCBibXBfaGVhZGVyLnNpemUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX2lwYy5oIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX2lwYy5oCmluZGV4IDhmNTY4ZGQuLjc5YmIwOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9pcGMuaAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvcGxhdGZvcm1faXBjLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpZm5kZWYgX1BMQVRGT1JNX0lQQ19IXwogI2RlZmluZSBfUExBVEZPUk1fSVBDX0hfCiAKLWV4dGVybiB2b2lkIF9faW5pdCBpcGNfZGV2aWNlX2hhbmRsZXIoc3RydWN0IHNmaV9kZXZpY2VfdGFibGVfZW50cnkgKnBlbnRyeSwKLQkJCXN0cnVjdCBkZXZzX2lkICpkZXYpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK3ZvaWQgX19pbml0CitpcGNfZGV2aWNlX2hhbmRsZXIoc3RydWN0IHNmaV9kZXZpY2VfdGFibGVfZW50cnkgKnBlbnRyeSwgc3RydWN0IGRldnNfaWQgKmRldik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX21zaWMuaCBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tc2ljLmgKaW5kZXggOTE3ZWI1Ni4uYjdiZTFkMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX21zaWMuaAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvcGxhdGZvcm1fbXNpYy5oCkBAIC0xNCw2ICsxNCw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgaW50ZWxfbXNpY19wbGF0Zm9ybV9kYXRhIG1zaWNfcGRhdGE7CiAKLWV4dGVybiB2b2lkICptc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvLAotCQkJZW51bSBpbnRlbF9tc2ljX2Jsb2NrIGJsb2NrKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Cit2b2lkICptc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvLCBlbnVtIGludGVsX21zaWNfYmxvY2sgYmxvY2spOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9pbnRlbF9taWRfd2Vha19kZWNscy5oIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2ludGVsX21pZF93ZWFrX2RlY2xzLmgKaW5kZXggYTUzN2ZmYy4uNDZhYTI1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2ludGVsX21pZF93ZWFrX2RlY2xzLmgKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2ludGVsX21pZF93ZWFrX2RlY2xzLmgKQEAgLTE0LDYgKzE0LDYgQEAKIC8qIEZvciBldmVyeSBDUFUgYWRkaXRpb24gYSBuZXcgZ2V0XzxjcHVuYW1lPl9vcHMgaW50ZXJmYWNlIG5lZWRzCiAgKiB0byBiZSBhZGRlZC4KICAqLwotZXh0ZXJuIHZvaWQgKiBfX2NwdWluaXQgZ2V0X3BlbndlbGxfb3BzKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKLWV4dGVybiB2b2lkICogX19jcHVpbml0IGdldF9jbG92ZXJ2aWV3X29wcyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1leHRlcm4gdm9pZCAqIF9faW5pdCBnZXRfdGFuZ2llcl9vcHModm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIHZvaWQgKmdldF9wZW53ZWxsX29wcyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CitleHRlcm4gdm9pZCAqZ2V0X2Nsb3ZlcnZpZXdfb3BzKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiB2b2lkICpnZXRfdGFuZ2llcl9vcHModm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaykpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL21mbGQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9tZmxkLmMKaW5kZXggNGY3ODg0ZS4uMjMzODFkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL21mbGQuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvbWZsZC5jCkBAIC01OCwxOCArNTgsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBlbndlbGxfYXJjaF9zZXR1cCgpCitzdGF0aWMgdm9pZCBfX2luaXQgcGVud2VsbF9hcmNoX3NldHVwKHZvaWQpCiB7CiAJeDg2X3BsYXRmb3JtLmNhbGlicmF0ZV90c2MgPSBtZmxkX2NhbGlicmF0ZV90c2M7CiAJcG1fcG93ZXJfb2ZmID0gbWZsZF9wb3dlcl9vZmY7CiB9CiAKLXZvaWQgKiBfX2NwdWluaXQgZ2V0X3BlbndlbGxfb3BzKCkKK3ZvaWQgKmdldF9wZW53ZWxsX29wcyh2b2lkKQogewogCXJldHVybiAmcGVud2VsbF9vcHM7CiB9CiAKLXZvaWQgKiBfX2NwdWluaXQgZ2V0X2Nsb3ZlcnZpZXdfb3BzKCkKK3ZvaWQgKmdldF9jbG92ZXJ2aWV3X29wcyh2b2lkKQogewogCXJldHVybiAmcGVud2VsbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvbXJmbC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL21yZmwuYwppbmRleCAwOWQxMDE1Li5hYWNhOTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvbXJmbC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9tcmZsLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkuYXJjaF9zZXR1cCA9IHRhbmdpZXJfYXJjaF9zZXR1cCwKIH07CiAKLXZvaWQgKiBfX2NwdWluaXQgZ2V0X3RhbmdpZXJfb3BzKCkKK3ZvaWQgKmdldF90YW5naWVyX29wcyh2b2lkKQogewogCXJldHVybiAmdGFuZ2llcl9vcHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di91dl9ubWkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L3V2X25taS5jCmluZGV4IDhlZWNjYmEuLmJlMjdkYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3V2X25taS5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L3V2X25taS5jCkBAIC03NCw3ICs3NCw2IEBACiBzdGF0aWMgYXRvbWljX3QgdXZfbm1pX2NwdSA9IEFUT01JQ19JTklUKC0xKTsKIHN0YXRpYyBhdG9taWNfdCB1dl9ubWlfY3B1c19pbl9ubWkgPSBBVE9NSUNfSU5JVCgtMSk7CiBzdGF0aWMgYXRvbWljX3QgdXZfbm1pX3NsYXZlX2NvbnRpbnVlOwotc3RhdGljIGF0b21pY190IHV2X25taV9rZXhlY19mYWlsZWQ7CiBzdGF0aWMgY3B1bWFza192YXJfdCB1dl9ubWlfY3B1X21hc2s7CiAKIC8qIFZhbHVlcyBmb3IgdXZfbm1pX3NsYXZlX2NvbnRpbnVlICovCkBAIC0xNDksNyArMTQ4LDggQEAKICAqICAiZHVtcCIJLSBkdW1wIHByb2Nlc3Mgc3RhY2sgZm9yIGVhY2ggY3B1CiAgKiAgImlwcyIJLSBkdW1wIElQIGluZm8gZm9yIGVhY2ggY3B1CiAgKiAgImtkdW1wIgktIGRvIGNyYXNoIGR1bXAKLSAqICAia2RiIgktIGVudGVyIEtEQi9LR0RCIChkZWZhdWx0KQorICogICJrZGIiCS0gZW50ZXIgS0RCIChkZWZhdWx0KQorICogICJrZ2RiIgktIGVudGVyIEtHREIKICAqLwogc3RhdGljIGNoYXIgdXZfbm1pX2FjdGlvbls4XSA9ICJrZGIiOwogbW9kdWxlX3BhcmFtX3N0cmluZyhhY3Rpb24sIHV2X25taV9hY3Rpb24sIHNpemVvZih1dl9ubWlfYWN0aW9uKSwgMDY0NCk7CkBAIC01MDQsNiArNTA0LDcgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQorc3RhdGljIGF0b21pY190IHV2X25taV9rZXhlY19mYWlsZWQ7CiBzdGF0aWMgdm9pZCB1dl9ubWlfa2R1bXAoaW50IGNwdSwgaW50IG1hc3Rlciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyogQ2FsbCBjcmFzaCB0byBkdW1wIHN5c3RlbSBzdGF0ZSAqLwpAQCAtNTM3LDE4ICs1MzgsNDUgQEAKIH0KICNlbmRpZiAvKiAhQ09ORklHX0tFWEVDICovCiAKKyNpZmRlZiBDT05GSUdfS0dEQgogI2lmZGVmIENPTkZJR19LR0RCX0tEQgotLyogQ2FsbCBLREIgZnJvbSBOTUkgaGFuZGxlciAqLwotc3RhdGljIHZvaWQgdXZfY2FsbF9rZGIoaW50IGNwdSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtYXN0ZXIpCitzdGF0aWMgaW5saW5lIGludCB1dl9ubWlfa2RiX3JlYXNvbih2b2lkKQogewotCWludCByZXQ7CisJcmV0dXJuIEtEQl9SRUFTT05fU1lTVEVNX05NSTsKK30KKyNlbHNlIC8qICFDT05GSUdfS0dEQl9LREIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHV2X25taV9rZGJfcmVhc29uKHZvaWQpCit7CisJLyogSW5zdXJlIHVzZXIgaXMgZXhwZWN0aW5nIHRvIGF0dGFjaCBnZGIgcmVtb3RlICovCisJaWYgKHV2X25taV9hY3Rpb25faXMoImtnZGIiKSkKKwkJcmV0dXJuIDA7CiAKKwlwcl9lcnIoIlVWOiBOTUkgZXJyb3I6IEtEQiBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbFxuIik7CisJcmV0dXJuIC0xOworfQorI2VuZGlmIC8qIENPTkZJR19LR0RCX0tEQiAqLworCisvKgorICogQ2FsbCBLR0RCL0tEQiBmcm9tIE5NSSBoYW5kbGVyCisgKgorICogTm90ZSB0aGF0IGlmIGJvdGggS0dEQiBhbmQgS0RCIGFyZSBjb25maWd1cmVkLCB0aGVuIHRoZSBhY3Rpb24gb2YgJ2tnZGInIG9yCisgKiAna2RiJyBoYXMgbm8gYWZmZWN0IG9uIHdoaWNoIGlzIHVzZWQuICBTZWUgdGhlIEtHREIgZG9jdW1lbnRpb24gZm9yIGZ1cnRoZXIKKyAqIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCB1dl9jYWxsX2tnZGJfa2RiKGludCBjcHUsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbWFzdGVyKQorewogCWlmIChtYXN0ZXIpIHsKKwkJaW50IHJlYXNvbiA9IHV2X25taV9rZGJfcmVhc29uKCk7CisJCWludCByZXQ7CisKKwkJaWYgKHJlYXNvbiA8IDApCisJCQlyZXR1cm47CisKIAkJLyogY2FsbCBLR0RCIE5NSSBoYW5kbGVyIGFzIE1BU1RFUiAqLwotCQlyZXQgPSBrZ2RiX25taWNhbGxpbihjcHUsIFg4Nl9UUkFQX05NSSwgcmVncywKLQkJCQkJJnV2X25taV9zbGF2ZV9jb250aW51ZSk7CisJCXJldCA9IGtnZGJfbm1pY2FsbGluKGNwdSwgWDg2X1RSQVBfTk1JLCByZWdzLCByZWFzb24sCisJCQkJJnV2X25taV9zbGF2ZV9jb250aW51ZSk7CiAJCWlmIChyZXQpIHsKLQkJCXByX2FsZXJ0KCJLREIgcmV0dXJuZWQgZXJyb3IsIGlzIGtnZGJvYyBzZXQ/XG4iKTsKKwkJCXByX2FsZXJ0KCJLR0RCIHJldHVybmVkIGVycm9yLCBpcyBrZ2Rib2Mgc2V0P1xuIik7CiAJCQlhdG9taWNfc2V0KCZ1dl9ubWlfc2xhdmVfY29udGludWUsIFNMQVZFX0VYSVQpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTU2NywxMiArNTk1LDEyIEBACiAJdXZfbm1pX3N5bmNfZXhpdChtYXN0ZXIpOwogfQogCi0jZWxzZSAvKiAhQ09ORklHX0tHREJfS0RCICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdXZfY2FsbF9rZGIoaW50IGNwdSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtYXN0ZXIpCisjZWxzZSAvKiAhQ09ORklHX0tHREIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1dl9jYWxsX2tnZGJfa2RiKGludCBjcHUsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbWFzdGVyKQogewotCXByX2VycigiVVY6IE5NSSBlcnJvcjogS0dEQi9LREIgaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBrZXJuZWxcbiIpOworCXByX2VycigiVVY6IE5NSSBlcnJvcjogS0dEQiBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbFxuIik7CiB9Ci0jZW5kaWYgLyogIUNPTkZJR19LR0RCX0tEQiAqLworI2VuZGlmIC8qICFDT05GSUdfS0dEQiAqLwogCiAvKgogICogVVYgTk1JIGhhbmRsZXIKQEAgLTYwNiw5ICs2MzQsOSBAQAogCWlmICh1dl9ubWlfYWN0aW9uX2lzKCJpcHMiKSB8fCB1dl9ubWlfYWN0aW9uX2lzKCJkdW1wIikpCiAJCXV2X25taV9kdW1wX3N0YXRlKGNwdSwgcmVncywgbWFzdGVyKTsKIAotCS8qIENhbGwgS0RCIGlmIGVuYWJsZWQgKi8KLQllbHNlIGlmICh1dl9ubWlfYWN0aW9uX2lzKCJrZGIiKSkKLQkJdXZfY2FsbF9rZGIoY3B1LCByZWdzLCBtYXN0ZXIpOworCS8qIENhbGwgS0dEQi9LREIgaWYgZW5hYmxlZCAqLworCWVsc2UgaWYgKHV2X25taV9hY3Rpb25faXMoImtkYiIpIHx8IHV2X25taV9hY3Rpb25faXMoImtnZGIiKSkKKwkJdXZfY2FsbF9rZ2RiX2tkYihjcHUsIHJlZ3MsIG1hc3Rlcik7CiAKIAkvKiBDbGVhciBwZXJfY3B1ICJpbiBubWkiIGZsYWcgKi8KIAlhdG9taWNfc2V0KCZ1dl9jcHVfbm1pLnN0YXRlLCBVVl9OTUlfU1RBVEVfT1VUKTsKQEAgLTYzNCw3ICs2NjIsNyBAQAogLyoKICAqIE5NSSBoYW5kbGVyIGZvciBwdWxsaW5nIGluIENQVXMgd2hlbiBwZXJmIGV2ZW50cyBhcmUgZ3JhYmJpbmcgb3VyIE5NSQogICovCi1pbnQgdXZfaGFuZGxlX25taV9waW5nKHVuc2lnbmVkIGludCByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB1dl9oYW5kbGVfbm1pX3BpbmcodW5zaWduZWQgaW50IHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IHJldDsKIApAQCAtNjUxLDcgKzY3OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB1dl9yZWdpc3Rlcl9ubWlfbm90aWZpZXIodm9pZCkKK3N0YXRpYyB2b2lkIHV2X3JlZ2lzdGVyX25taV9ub3RpZmllcih2b2lkKQogewogCWlmIChyZWdpc3Rlcl9ubWlfaGFuZGxlcihOTUlfVU5LTk9XTiwgdXZfaGFuZGxlX25taSwgMCwgInV2IikpCiAJCXByX3dhcm4oIlVWOiBOTUkgaGFuZGxlciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOwpAQCAtNjk1LDYgKzcyMyw1IEBACiAJCXV2X2h1Yl9ubWlfcGVyKGNwdSkgPSB1dl9odWJfbm1pX2xpc3RbbmlkXTsKIAl9CiAJQlVHX09OKCFhbGxvY19jcHVtYXNrX3ZhcigmdXZfbm1pX2NwdV9tYXNrLCBHRlBfS0VSTkVMKSk7CisJdXZfcmVnaXN0ZXJfbm1pX25vdGlmaWVyKCk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcmVhbG1vZGUvcm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9yZWFsbW9kZS9ybS9NYWtlZmlsZQppbmRleCA5Y2FjODI1Li4zNDk3ZjE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9yZWFsbW9kZS9ybS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9yZWFsbW9kZS9ybS9NYWtlZmlsZQpAQCAtNjQsMjAgKzY0LDcgQEAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotIyBIb3cgdG8gY29tcGlsZSB0aGUgMTYtYml0IGNvZGUuICBOb3RlIHdlIGFsd2F5cyBjb21waWxlIGZvciAtbWFyY2g9aTM4NiwKLSMgdGhhdCB3YXkgd2UgY2FuIGNvbXBsYWluIHRvIHRoZSB1c2VyIGlmIHRoZSBDUFUgaXMgaW5zdWZmaWNpZW50LgotS0JVSUxEX0NGTEFHUwk6PSAkKExJTlVYSU5DTFVERSkgLW0zMiAtZyAtT3MgLURfU0VUVVAgLURfX0tFUk5FTF9fIC1EX1dBS0VVUCBcCi0JCSAgIC1JJChzcmN0cmVlKS9hcmNoL3g4Ni9ib290IFwKLQkJICAgLURESVNBQkxFX0JSQU5DSF9QUk9GSUxJTkcgXAotCQkgICAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIFwKLQkJICAgLW1hcmNoPWkzODYgLW1yZWdwYXJtPTMgXAotCQkgICAtaW5jbHVkZSAkKHNyY3RyZWUpLyQoc3JjKS8uLi8uLi9ib290L2NvZGUxNmdjYy5oIFwKLQkJICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1waWMgXAotCQkgICAtbW5vLW1teCAtbW5vLXNzZSBcCi0JCSAgICQoY2FsbCBjYy1vcHRpb24sIC1mZnJlZXN0YW5kaW5nKSBcCi0JCSAgICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tdG9wbGV2ZWwtcmVvcmRlcixcCi0JCSAgICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tdW5pdC1hdC1hLXRpbWUpKSBcCi0JCSAgICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKSBcCi0JCSAgICQoY2FsbCBjYy1vcHRpb24sIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCitLQlVJTERfQ0ZMQUdTCTo9ICQoTElOVVhJTkNMVURFKSAkKFJFQUxNT0RFX0NGTEFHUykgLURfU0VUVVAgLURfV0FLRVVQIFwKKwkJICAgLUkkKHNyY3RyZWUpL2FyY2gveDg2L2Jvb3QKIEtCVUlMRF9BRkxBR1MJOj0gJChLQlVJTERfQ0ZMQUdTKSAtRF9fQVNTRU1CTFlfXwogR0NPVl9QUk9GSUxFIDo9IG4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKaW5kZXggMTFmOTI4NS4uY2ZiZGJkYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKKysrIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKQEAgLTEwMjUsNiArMTAyNSwyOSBAQAogCX0KIH0KIAorLyoKKyAqIEFzIGFuIGFpZCB0byBkZWJ1Z2dpbmcgcHJvYmxlbXMgd2l0aCBkaWZmZXJlbnQgbGlua2VycworICogcHJpbnQgc3VtbWFyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NzLgorICogU2luY2UgZGlmZmVyZW50IGxpbmtlcnMgdGVuZCB0byBlbWl0IHRoZSBzZWN0aW9ucyBpbgorICogZGlmZmVyZW50IG9yZGVycyB3ZSB1c2UgdGhlIHNlY3Rpb24gbmFtZXMgaW4gdGhlIG91dHB1dC4KKyAqLworc3RhdGljIGludCBkb19yZWxvY19pbmZvKHN0cnVjdCBzZWN0aW9uICpzZWMsIEVsZl9SZWwgKnJlbCwgRWxmVyhTeW0pICpzeW0sCisJCQkJY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlwcmludGYoIiVzXHQlc1x0JXNcdCVzXG4iLAorCQlzZWNfbmFtZShzZWMtPnNoZHIuc2hfaW5mbyksCisJCXJlbF90eXBlKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pKSwKKwkJc3ltbmFtZSwKKwkJc2VjX25hbWUoc3ltLT5zdF9zaG5keCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yZWxvY19pbmZvKHZvaWQpCit7CisJcHJpbnRmKCJyZWxvYyBzZWN0aW9uXHRyZWxvYyB0eXBlXHRzeW1ib2xcdHN5bWJvbCBzZWN0aW9uXG4iKTsKKwl3YWxrX3JlbG9jcyhkb19yZWxvY19pbmZvKTsKK30KKwogI2lmIEVMRl9CSVRTID09IDY0CiAjIGRlZmluZSBwcm9jZXNzIHByb2Nlc3NfNjQKICNlbHNlCkBAIC0xMDMyLDcgKzEwNTUsOCBAQAogI2VuZGlmCiAKIHZvaWQgcHJvY2VzcyhGSUxFICpmcCwgaW50IHVzZV9yZWFsX21vZGUsIGludCBhc190ZXh0LAotCSAgICAgaW50IHNob3dfYWJzb2x1dGVfc3ltcywgaW50IHNob3dfYWJzb2x1dGVfcmVsb2NzKQorCSAgICAgaW50IHNob3dfYWJzb2x1dGVfc3ltcywgaW50IHNob3dfYWJzb2x1dGVfcmVsb2NzLAorCSAgICAgaW50IHNob3dfcmVsb2NfaW5mbykKIHsKIAlyZWdleF9pbml0KHVzZV9yZWFsX21vZGUpOwogCXJlYWRfZWhkcihmcCk7CkBAIC0xMDUwLDUgKzEwNzQsOSBAQAogCQlwcmludF9hYnNvbHV0ZV9yZWxvY3MoKTsKIAkJcmV0dXJuOwogCX0KKwlpZiAoc2hvd19yZWxvY19pbmZvKSB7CisJCXByaW50X3JlbG9jX2luZm8oKTsKKwkJcmV0dXJuOworCX0KIAllbWl0X3JlbG9jcyhhc190ZXh0LCB1c2VfcmVhbF9tb2RlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5oIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmgKaW5kZXggMDdjZGIxZS4uZjU5NTkwNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmgKKysrIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmgKQEAgLTI5LDggKzI5LDkgQEAKIH07CiAKIHZvaWQgcHJvY2Vzc18zMihGSUxFICpmcCwgaW50IHVzZV9yZWFsX21vZGUsIGludCBhc190ZXh0LAotCQlpbnQgc2hvd19hYnNvbHV0ZV9zeW1zLCBpbnQgc2hvd19hYnNvbHV0ZV9yZWxvY3MpOworCQlpbnQgc2hvd19hYnNvbHV0ZV9zeW1zLCBpbnQgc2hvd19hYnNvbHV0ZV9yZWxvY3MsCisJCWludCBzaG93X3JlbG9jX2luZm8pOwogdm9pZCBwcm9jZXNzXzY0KEZJTEUgKmZwLCBpbnQgdXNlX3JlYWxfbW9kZSwgaW50IGFzX3RleHQsCi0JCWludCBzaG93X2Fic29sdXRlX3N5bXMsIGludCBzaG93X2Fic29sdXRlX3JlbG9jcyk7Ci0KKwkJaW50IHNob3dfYWJzb2x1dGVfc3ltcywgaW50IHNob3dfYWJzb2x1dGVfcmVsb2NzLAorCQlpbnQgc2hvd19yZWxvY19pbmZvKTsKICNlbmRpZiAvKiBSRUxPQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdG9vbHMvcmVsb2NzX2NvbW1vbi5jIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzX2NvbW1vbi5jCmluZGV4IDQ0ZDM5NjguLmFjYWI2MzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jc19jb21tb24uYworKysgYi9hcmNoL3g4Ni90b29scy9yZWxvY3NfY29tbW9uLmMKQEAgLTExLDEyICsxMSwxMyBAQAogCiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewotCWRpZSgicmVsb2NzIFstLWFicy1zeW1zfC0tYWJzLXJlbG9jc3wtLXRleHR8LS1yZWFsbW9kZV0gdm1saW51eFxuIik7CisJZGllKCJyZWxvY3MgWy0tYWJzLXN5bXN8LS1hYnMtcmVsb2NzfC0tcmVsb2MtaW5mb3wtLXRleHR8LS1yZWFsbW9kZV0iIFwKKwkgICAgIiB2bWxpbnV4XG4iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBzaG93X2Fic29sdXRlX3N5bXMsIHNob3dfYWJzb2x1dGVfcmVsb2NzOworCWludCBzaG93X2Fic29sdXRlX3N5bXMsIHNob3dfYWJzb2x1dGVfcmVsb2NzLCBzaG93X3JlbG9jX2luZm87CiAJaW50IGFzX3RleHQsIHVzZV9yZWFsX21vZGU7CiAJY29uc3QgY2hhciAqZm5hbWU7CiAJRklMRSAqZnA7CkBAIC0yNSw2ICsyNiw3IEBACiAKIAlzaG93X2Fic29sdXRlX3N5bXMgPSAwOwogCXNob3dfYWJzb2x1dGVfcmVsb2NzID0gMDsKKwlzaG93X3JlbG9jX2luZm8gPSAwOwogCWFzX3RleHQgPSAwOwogCXVzZV9yZWFsX21vZGUgPSAwOwogCWZuYW1lID0gTlVMTDsKQEAgLTM5LDYgKzQxLDEwIEBACiAJCQkJc2hvd19hYnNvbHV0ZV9yZWxvY3MgPSAxOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKHN0cmNtcChhcmcsICItLXJlbG9jLWluZm8iKSA9PSAwKSB7CisJCQkJc2hvd19yZWxvY19pbmZvID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWlmIChzdHJjbXAoYXJnLCAiLS10ZXh0IikgPT0gMCkgewogCQkJCWFzX3RleHQgPSAxOwogCQkJCWNvbnRpbnVlOwpAQCAtNjcsMTAgKzczLDEyIEBACiAJcmV3aW5kKGZwKTsKIAlpZiAoZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkKIAkJcHJvY2Vzc182NChmcCwgdXNlX3JlYWxfbW9kZSwgYXNfdGV4dCwKLQkJCSAgIHNob3dfYWJzb2x1dGVfc3ltcywgc2hvd19hYnNvbHV0ZV9yZWxvY3MpOworCQkJICAgc2hvd19hYnNvbHV0ZV9zeW1zLCBzaG93X2Fic29sdXRlX3JlbG9jcywKKwkJCSAgIHNob3dfcmVsb2NfaW5mbyk7CiAJZWxzZQogCQlwcm9jZXNzXzMyKGZwLCB1c2VfcmVhbF9tb2RlLCBhc190ZXh0LAotCQkJICAgc2hvd19hYnNvbHV0ZV9zeW1zLCBzaG93X2Fic29sdXRlX3JlbG9jcyk7CisJCQkgICBzaG93X2Fic29sdXRlX3N5bXMsIHNob3dfYWJzb2x1dGVfcmVsb2NzLAorCQkJICAgc2hvd19yZWxvY19pbmZvKTsKIAlmY2xvc2UoZnApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGE0ZDdiNjQuLjIwMWQwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTE0NzMsNiArMTQ3MywxOCBAQAogCSAqIFg4Nl9DUjBfVFMsIFg4Nl9DUjBfUEUsIFg4Nl9DUjBfRVQgYXJlIHNldCBieSBYZW4gZm9yIEhWTSBndWVzdHMKIAkgKiAod2hpY2ggUFZIIHNoYXJlZCBjb2RlcGF0aHMpLCB3aGlsZSBYODZfQ1IwX1BHIGlzIGZvciBQVkguICovCiAJd3JpdGVfY3IwKHJlYWRfY3IwKCkgfCBYODZfQ1IwX01QIHwgWDg2X0NSMF9ORSB8IFg4Nl9DUjBfV1AgfCBYODZfQ1IwX0FNKTsKKworCWlmICghY3B1KQorCQlyZXR1cm47CisJLyoKKwkgKiBGb3IgQlNQLCBQU0UgUEdFIGFyZSBzZXQgaW4gcHJvYmVfcGFnZV9zaXplX21hc2soKSwgZm9yIEFQcworCSAqIHNldCB0aGVtIGhlcmUuIEZvciBhbGwsIE9TRlhTUiBPU1hNTUVYQ1BUIGFyZSBzZXQgaW4gZnB1X2luaXQuCisJKi8KKwlpZiAoY3B1X2hhc19wc2UpCisJCXNldF9pbl9jcjQoWDg2X0NSNF9QU0UpOworCisJaWYgKGNwdV9oYXNfcGdlKQorCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUEdFKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggMTAzYzkzZi4uYzk4NTgzNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKQEAgLTE2MiwxNCArMTYyLDE1IEBACiAJcmMgPSBhcmNoX2dudHRhYl9tYXBfc2hhcmVkKHBmbnMsIG5yX2dyYW50X2ZyYW1lcywgbnJfZ3JhbnRfZnJhbWVzLAogCQkJCSAgICAmeGVuX2F1dG9feGxhdF9ncmFudF9mcmFtZXMudmFkZHIpOwogCi0Ja2ZyZWUocGFnZXMpOwogCWlmIChyYykgewogCQlwcl93YXJuKCIlcyBDb3VsZG4ndCBtYXAgJWxkIHBmbnMgcmM6JWRcbiIsIF9fZnVuY19fLAogCQkJbnJfZ3JhbnRfZnJhbWVzLCByYyk7CiAJCWZyZWVfeGVuYmFsbG9vbmVkX3BhZ2VzKG5yX2dyYW50X2ZyYW1lcywgcGFnZXMpOworCQlrZnJlZShwYWdlcyk7CiAJCWtmcmVlKHBmbnMpOwogCQlyZXR1cm4gcmM7CiAJfQorCWtmcmVlKHBhZ2VzKTsKIAogCXhlbl9hdXRvX3hsYXRfZ3JhbnRfZnJhbWVzLnBmbiA9IHBmbnM7CiAJeGVuX2F1dG9feGxhdF9ncmFudF9mcmFtZXMuY291bnQgPSBucl9ncmFudF9mcmFtZXM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vaXJxLmMgYi9hcmNoL3g4Ni94ZW4vaXJxLmMKaW5kZXggNzZjYTMyNi4uMDhmNzYzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2lycS5jCisrKyBiL2FyY2gveDg2L3hlbi9pcnEuYwpAQCAtMjMsNyArMjMsNyBAQAogCSh2b2lkKUhZUEVSVklTT1JfeGVuX3ZlcnNpb24oMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9zYXZlX2ZsKHZvaWQpCithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgeGVuX3NhdmVfZmwodm9pZCkKIHsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MSw3ICs0MSw3IEBACiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9zYXZlX2ZsKTsKIAotc3RhdGljIHZvaWQgeGVuX3Jlc3RvcmVfZmwodW5zaWduZWQgbG9uZyBmbGFncykKK19fdmlzaWJsZSB2b2lkIHhlbl9yZXN0b3JlX2ZsKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHZjcHVfaW5mbyAqdmNwdTsKIApAQCAtNjMsNyArNjMsNyBAQAogfQogUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcmVzdG9yZV9mbCk7CiAKLXN0YXRpYyB2b2lkIHhlbl9pcnFfZGlzYWJsZSh2b2lkKQorYXNtbGlua2FnZSB2b2lkIHhlbl9pcnFfZGlzYWJsZSh2b2lkKQogewogCS8qIFRoZXJlJ3MgYSBvbmUgaW5zdHJ1Y3Rpb24gcHJlZW1wdCB3aW5kb3cgaGVyZS4gIFdlIG5lZWQgdG8KIAkgICBtYWtlIHN1cmUgd2UncmUgZG9uJ3Qgc3dpdGNoIENQVXMgYmV0d2VlbiBnZXR0aW5nIHRoZSB2Y3B1CkBAIC03NCw3ICs3NCw3IEBACiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9pcnFfZGlzYWJsZSk7CiAKLXN0YXRpYyB2b2lkIHhlbl9pcnFfZW5hYmxlKHZvaWQpCithc21saW5rYWdlIHZvaWQgeGVuX2lycV9lbmFibGUodm9pZCkKIHsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggYzFkNDA2Zi4uMjU2MjgyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAvKiBBc3N1bWUgcHRldmFsX3QgaXMgZXF1aXZhbGVudCB0byBhbGwgdGhlIG90aGVyICp2YWxfdCB0eXBlcy4gKi8KIHN0YXRpYyBwdGV2YWxfdCBwdGVfbWZuX3RvX3BmbihwdGV2YWxfdCB2YWwpCiB7Ci0JaWYgKHZhbCAmIF9QQUdFX1BSRVNFTlQpIHsKKwlpZiAocHRldmFsX3ByZXNlbnQodmFsKSkgewogCQl1bnNpZ25lZCBsb25nIG1mbiA9ICh2YWwgJiBQVEVfUEZOX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJCXVuc2lnbmVkIGxvbmcgcGZuID0gbWZuX3RvX3BmbihtZm4pOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIAogc3RhdGljIHB0ZXZhbF90IHB0ZV9wZm5fdG9fbWZuKHB0ZXZhbF90IHZhbCkKIHsKLQlpZiAodmFsICYgX1BBR0VfUFJFU0VOVCkgeworCWlmIChwdGV2YWxfcHJlc2VudCh2YWwpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKIAkJcHRldmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVfRkxBR1NfTUFTSzsKIAkJdW5zaWduZWQgbG9uZyBtZm47CkBAIC00MzEsNyArNDMxLDcgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgcHRldmFsX3QgeGVuX3B0ZV92YWwocHRlX3QgcHRlKQorX192aXNpYmxlIHB0ZXZhbF90IHhlbl9wdGVfdmFsKHB0ZV90IHB0ZSkKIHsKIAlwdGV2YWxfdCBwdGV2YWwgPSBwdGUucHRlOwogI2lmIDAKQEAgLTQ0OCw3ICs0NDgsNyBAQAogfQogUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcHRlX3ZhbCk7CiAKLXN0YXRpYyBwZ2R2YWxfdCB4ZW5fcGdkX3ZhbChwZ2RfdCBwZ2QpCitfX3Zpc2libGUgcGdkdmFsX3QgeGVuX3BnZF92YWwocGdkX3QgcGdkKQogewogCXJldHVybiBwdGVfbWZuX3RvX3BmbihwZ2QucGdkKTsKIH0KQEAgLTQ3OSw3ICs0NzksNyBAQAogCVdBUk5fT04ocGF0ICE9IDB4MDAwNzAxMDYwMDA3MDEwNnVsbCk7CiB9CiAKLXN0YXRpYyBwdGVfdCB4ZW5fbWFrZV9wdGUocHRldmFsX3QgcHRlKQorX192aXNpYmxlIHB0ZV90IHhlbl9tYWtlX3B0ZShwdGV2YWxfdCBwdGUpCiB7CiAJcGh5c19hZGRyX3QgYWRkciA9IChwdGUgJiBQVEVfUEZOX01BU0spOwogI2lmIDAKQEAgLTUxNCwxNCArNTE0LDE0IEBACiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3B0ZSk7CiAKLXN0YXRpYyBwZ2RfdCB4ZW5fbWFrZV9wZ2QocGdkdmFsX3QgcGdkKQorX192aXNpYmxlIHBnZF90IHhlbl9tYWtlX3BnZChwZ2R2YWxfdCBwZ2QpCiB7CiAJcGdkID0gcHRlX3Bmbl90b19tZm4ocGdkKTsKIAlyZXR1cm4gbmF0aXZlX21ha2VfcGdkKHBnZCk7CiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3BnZCk7CiAKLXN0YXRpYyBwbWR2YWxfdCB4ZW5fcG1kX3ZhbChwbWRfdCBwbWQpCitfX3Zpc2libGUgcG1kdmFsX3QgeGVuX3BtZF92YWwocG1kX3QgcG1kKQogewogCXJldHVybiBwdGVfbWZuX3RvX3BmbihwbWQucG1kKTsKIH0KQEAgLTU4MCw3ICs1ODAsNyBAQAogfQogI2VuZGlmCS8qIENPTkZJR19YODZfUEFFICovCiAKLXN0YXRpYyBwbWRfdCB4ZW5fbWFrZV9wbWQocG1kdmFsX3QgcG1kKQorX192aXNpYmxlIHBtZF90IHhlbl9tYWtlX3BtZChwbWR2YWxfdCBwbWQpCiB7CiAJcG1kID0gcHRlX3Bmbl90b19tZm4ocG1kKTsKIAlyZXR1cm4gbmF0aXZlX21ha2VfcG1kKHBtZCk7CkBAIC01ODgsMTMgKzU4OCwxMyBAQAogUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fbWFrZV9wbWQpOwogCiAjaWYgUEFHRVRBQkxFX0xFVkVMUyA9PSA0Ci1zdGF0aWMgcHVkdmFsX3QgeGVuX3B1ZF92YWwocHVkX3QgcHVkKQorX192aXNpYmxlIHB1ZHZhbF90IHhlbl9wdWRfdmFsKHB1ZF90IHB1ZCkKIHsKIAlyZXR1cm4gcHRlX21mbl90b19wZm4ocHVkLnB1ZCk7CiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9wdWRfdmFsKTsKIAotc3RhdGljIHB1ZF90IHhlbl9tYWtlX3B1ZChwdWR2YWxfdCBwdWQpCitfX3Zpc2libGUgcHVkX3QgeGVuX21ha2VfcHVkKHB1ZHZhbF90IHB1ZCkKIHsKIAlwdWQgPSBwdGVfcGZuX3RvX21mbihwdWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IGRkNWY5MDUuLjA5ODIyMzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC0zNSw3ICszNSw3IEBACiBleHRlcm4gY29uc3QgY2hhciB4ZW5faHlwZXJ2aXNvcl9jYWxsYmFja1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIgeGVuX2ZhaWxzYWZlX2NhbGxiYWNrW107CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotZXh0ZXJuIGNvbnN0IGNoYXIgbm1pW107CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgeGVuX3N5c2VudGVyX3RhcmdldCh2b2lkKTsKIGV4dGVybiB2b2lkIHhlbl9zeXNjYWxsX3RhcmdldCh2b2lkKTsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogdm9pZCB4ZW5fZW5hYmxlX25taSh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKLQlpZiAocmVnaXN0ZXJfY2FsbGJhY2soQ0FMTEJBQ0tUWVBFX25taSwgbm1pKSkKKwlpZiAocmVnaXN0ZXJfY2FsbGJhY2soQ0FMTEJBQ0tUWVBFX25taSwgKGNoYXIgKilubWkpKQogCQlCVUcoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwppbmRleCAwZTM2Y2RlLi41ODE1MjFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYworKysgYi9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYwpAQCAtMTA2LDcgKzEwNiw3IEBACiBzdGF0aWMgY3B1bWFza190IHdhaXRpbmdfY3B1czsKIAogc3RhdGljIGJvb2wgeGVuX3B2c3BpbiA9IHRydWU7Ci1zdGF0aWMgdm9pZCB4ZW5fbG9ja19zcGlubmluZyhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywgX190aWNrZXRfdCB3YW50KQorX192aXNpYmxlIHZvaWQgeGVuX2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3Qgd2FudCkKIHsKIAlpbnQgaXJxID0gX190aGlzX2NwdV9yZWFkKGxvY2tfa2lja2VyX2lycSk7CiAJc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcgKncgPSAmX19nZXRfY3B1X3Zhcihsb2NrX3dhaXRpbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zaW1kaXNrLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NpbWRpc2suYwppbmRleCA4YzZlODE5Li40OGVlYmFjIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NpbWRpc2suYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NpbWRpc2suYwpAQCAtMTAzLDE4ICsxMDMsMTggQEAKIAogc3RhdGljIGludCBzaW1kaXNrX3hmZXJfYmlvKHN0cnVjdCBzaW1kaXNrICpkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKKwlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7Ci0JCWNoYXIgKmJ1ZmZlciA9IF9fYmlvX2ttYXBfYXRvbWljKGJpbywgaSk7Ci0JCXVuc2lnbmVkIGxlbiA9IGJ2ZWMtPmJ2X2xlbiA+PiBTRUNUT1JfU0hJRlQ7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CisJCWNoYXIgKmJ1ZmZlciA9IF9fYmlvX2ttYXBfYXRvbWljKGJpbywgaXRlcik7CisJCXVuc2lnbmVkIGxlbiA9IGJ2ZWMuYnZfbGVuID4+IFNFQ1RPUl9TSElGVDsKIAogCQlzaW1kaXNrX3RyYW5zZmVyKGRldiwgc2VjdG9yLCBsZW4sIGJ1ZmZlciwKIAkJCQliaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSk7CiAJCXNlY3RvciArPSBsZW47Ci0JCV9fYmlvX2t1bm1hcF9hdG9taWMoYmlvKTsKKwkJX19iaW9fa3VubWFwX2F0b21pYyhidWZmZXIpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDhiZGQwMTIuLmMwMGUwYmQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMzgsNiArMzgsNyBAQAogCiAjaW5jbHVkZSAiYmxrLmgiCiAjaW5jbHVkZSAiYmxrLWNncm91cC5oIgorI2luY2x1ZGUgImJsay1tcS5oIgogCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX2Jpb19yZW1hcCk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX3JxX3JlbWFwKTsKQEAgLTEzMCw3ICsxMzEsNyBAQAogCWJpb19hZHZhbmNlKGJpbywgbmJ5dGVzKTsKIAogCS8qIGRvbid0IGFjdHVhbGx5IGZpbmlzaCBiaW8gaWYgaXQncyBwYXJ0IG9mIGZsdXNoIHNlcXVlbmNlICovCi0JaWYgKGJpby0+Ymlfc2l6ZSA9PSAwICYmICEocnEtPmNtZF9mbGFncyAmIFJFUV9GTFVTSF9TRVEpKQorCWlmIChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9PSAwICYmICEocnEtPmNtZF9mbGFncyAmIFJFUV9GTFVTSF9TRVEpKQogCQliaW9fZW5kaW8oYmlvLCBlcnJvcik7CiB9CiAKQEAgLTI0NSw3ICsyNDYsMTYgQEAKIHZvaWQgYmxrX3N5bmNfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJnEtPnRpbWVvdXQpOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcS0+ZGVsYXlfd29yayk7CisKKwlpZiAocS0+bXFfb3BzKSB7CisJCXN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4OworCQlpbnQgaTsKKworCQlxdWV1ZV9mb3JfZWFjaF9od19jdHgocSwgaGN0eCwgaSkKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaGN0eC0+ZGVsYXllZF93b3JrKTsKKwl9IGVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnEtPmRlbGF5X3dvcmspOworCX0KIH0KIEVYUE9SVF9TWU1CT0woYmxrX3N5bmNfcXVldWUpOwogCkBAIC00OTcsOCArNTA3LDEzIEBACiAJICogRHJhaW4gYWxsIHJlcXVlc3RzIHF1ZXVlZCBiZWZvcmUgRFlJTkcgbWFya2luZy4gU2V0IERFQUQgZmxhZyB0bwogCSAqIHByZXZlbnQgdGhhdCBxLT5yZXF1ZXN0X2ZuKCkgZ2V0cyBpbnZva2VkIGFmdGVyIGRyYWluaW5nIGZpbmlzaGVkLgogCSAqLwotCXNwaW5fbG9ja19pcnEobG9jayk7Ci0JX19ibGtfZHJhaW5fcXVldWUocSwgdHJ1ZSk7CisJaWYgKHEtPm1xX29wcykgeworCQlibGtfbXFfZHJhaW5fcXVldWUocSk7CisJCXNwaW5fbG9ja19pcnEobG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycShsb2NrKTsKKwkJX19ibGtfZHJhaW5fcXVldWUocSwgdHJ1ZSk7CisJfQogCXF1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfREVBRCwgcSk7CiAJc3Bpbl91bmxvY2tfaXJxKGxvY2spOwogCkBAIC0xMzI2LDcgKzEzNDEsNyBAQAogCWJpby0+YmlfaW9fdmVjLT5idl9vZmZzZXQgPSAwOwogCWJpby0+YmlfaW9fdmVjLT5idl9sZW4gPSBsZW47CiAKLQliaW8tPmJpX3NpemUgPSBsZW47CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CiAJYmlvLT5iaV92Y250ID0gMTsKIAliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSAxOwogCkBAIC0xMzUxLDcgKzEzNjYsNyBAQAogCiAJcmVxLT5iaW90YWlsLT5iaV9uZXh0ID0gYmlvOwogCXJlcS0+YmlvdGFpbCA9IGJpbzsKLQlyZXEtPl9fZGF0YV9sZW4gKz0gYmlvLT5iaV9zaXplOworCXJlcS0+X19kYXRhX2xlbiArPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBiaW9fcHJpbyhiaW8pKTsKIAogCWJsa19hY2NvdW50X2lvX3N0YXJ0KHJlcSwgZmFsc2UpOwpAQCAtMTM4MCw4ICsxMzk1LDggQEAKIAkgKiBub3QgdG91Y2ggcmVxLT5idWZmZXIgZWl0aGVyLi4uCiAJICovCiAJcmVxLT5idWZmZXIgPSBiaW9fZGF0YShiaW8pOwotCXJlcS0+X19zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLQlyZXEtPl9fZGF0YV9sZW4gKz0gYmlvLT5iaV9zaXplOworCXJlcS0+X19zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOworCXJlcS0+X19kYXRhX2xlbiArPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBiaW9fcHJpbyhiaW8pKTsKIAogCWJsa19hY2NvdW50X2lvX3N0YXJ0KHJlcSwgZmFsc2UpOwpAQCAtMTQ1OSw3ICsxNDc0LDcgQEAKIAkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX0ZBSUxGQVNUX01BU0s7CiAKIAlyZXEtPmVycm9ycyA9IDA7Ci0JcmVxLT5fX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCXJlcS0+X19zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCXJlcS0+aW9wcmlvID0gYmlvX3ByaW8oYmlvKTsKIAlibGtfcnFfYmlvX3ByZXAocmVxLT5xLCByZXEsIGJpbyk7CiB9CkBAIC0xNTgzLDEyICsxNTk4LDEyIEBACiAJaWYgKGJpb19zZWN0b3JzKGJpbykgJiYgYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykgewogCQlzdHJ1Y3QgaGRfc3RydWN0ICpwID0gYmRldi0+YmRfcGFydDsKIAotCQliaW8tPmJpX3NlY3RvciArPSBwLT5zdGFydF9zZWN0OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICs9IHAtPnN0YXJ0X3NlY3Q7CiAJCWJpby0+YmlfYmRldiA9IGJkZXYtPmJkX2NvbnRhaW5zOwogCiAJCXRyYWNlX2Jsb2NrX2Jpb19yZW1hcChiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpLCBiaW8sCiAJCQkJICAgICAgYmRldi0+YmRfZGV2LAotCQkJCSAgICAgIGJpby0+Ymlfc2VjdG9yIC0gcC0+c3RhcnRfc2VjdCk7CisJCQkJICAgICAgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAtIHAtPnN0YXJ0X3NlY3QpOwogCX0KIH0KIApAQCAtMTY1NCw3ICsxNjY5LDcgQEAKIAkvKiBUZXN0IGRldmljZSBvciBwYXJ0aXRpb24gc2l6ZSwgd2hlbiBrbm93bi4gKi8KIAltYXhzZWN0b3IgPSBpX3NpemVfcmVhZChiaW8tPmJpX2JkZXYtPmJkX2lub2RlKSA+PiA5OwogCWlmIChtYXhzZWN0b3IpIHsKLQkJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAkJaWYgKG1heHNlY3RvciA8IG5yX3NlY3RvcnMgfHwgbWF4c2VjdG9yIC0gbnJfc2VjdG9ycyA8IHNlY3RvcikgewogCQkJLyoKQEAgLTE2OTAsNyArMTcwNSw3IEBACiAJCSAgICAgICAiZ2VuZXJpY19tYWtlX3JlcXVlc3Q6IFRyeWluZyB0byBhY2Nlc3MgIgogCQkJIm5vbmV4aXN0ZW50IGJsb2NrLWRldmljZSAlcyAoJUx1KVxuIiwKIAkJCWJkZXZuYW1lKGJpby0+YmlfYmRldiwgYiksCi0JCQkobG9uZyBsb25nKSBiaW8tPmJpX3NlY3Rvcik7CisJCQkobG9uZyBsb25nKSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJZ290byBlbmRfaW87CiAJfQogCkBAIC0xNzA0LDkgKzE3MTksOSBAQAogCX0KIAogCXBhcnQgPSBiaW8tPmJpX2JkZXYtPmJkX3BhcnQ7Ci0JaWYgKHNob3VsZF9mYWlsX3JlcXVlc3QocGFydCwgYmlvLT5iaV9zaXplKSB8fAorCWlmIChzaG91bGRfZmFpbF9yZXF1ZXN0KHBhcnQsIGJpby0+YmlfaXRlci5iaV9zaXplKSB8fAogCSAgICBzaG91bGRfZmFpbF9yZXF1ZXN0KCZwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLAotCQkJCWJpby0+Ymlfc2l6ZSkpCisJCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUpKQogCQlnb3RvIGVuZF9pbzsKIAogCS8qCkBAIC0xODY1LDcgKzE4ODAsNyBAQAogCQlpZiAocncgJiBXUklURSkgewogCQkJY291bnRfdm1fZXZlbnRzKFBHUEdPVVQsIGNvdW50KTsKIAkJfSBlbHNlIHsKLQkJCXRhc2tfaW9fYWNjb3VudF9yZWFkKGJpby0+Ymlfc2l6ZSk7CisJCQl0YXNrX2lvX2FjY291bnRfcmVhZChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAJCQljb3VudF92bV9ldmVudHMoUEdQR0lOLCBjb3VudCk7CiAJCX0KIApAQCAtMTg3NCw3ICsxODg5LDcgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlcyglZCk6ICVzIGJsb2NrICVMdSBvbiAlcyAoJXUgc2VjdG9ycylcbiIsCiAJCQljdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKIAkJCQkocncgJiBXUklURSkgPyAiV1JJVEUiIDogIlJFQUQiLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJCWJkZXZuYW1lKGJpby0+YmlfYmRldiwgYiksCiAJCQkJY291bnQpOwogCQl9CkBAIC0yMDA3LDcgKzIwMjIsNyBAQAogCWZvciAoYmlvID0gcnEtPmJpbzsgYmlvOyBiaW8gPSBiaW8tPmJpX25leHQpIHsKIAkJaWYgKChiaW8tPmJpX3J3ICYgZmYpICE9IGZmKQogCQkJYnJlYWs7Ci0JCWJ5dGVzICs9IGJpby0+Ymlfc2l6ZTsKKwkJYnl0ZXMgKz0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJfQogCiAJLyogdGhpcyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIGxvb3AgKi8KQEAgLTIzNzgsOSArMjM5Myw5IEBACiAJdG90YWxfYnl0ZXMgPSAwOwogCXdoaWxlIChyZXEtPmJpbykgewogCQlzdHJ1Y3QgYmlvICpiaW8gPSByZXEtPmJpbzsKLQkJdW5zaWduZWQgYmlvX2J5dGVzID0gbWluKGJpby0+Ymlfc2l6ZSwgbnJfYnl0ZXMpOworCQl1bnNpZ25lZCBiaW9fYnl0ZXMgPSBtaW4oYmlvLT5iaV9pdGVyLmJpX3NpemUsIG5yX2J5dGVzKTsKIAotCQlpZiAoYmlvX2J5dGVzID09IGJpby0+Ymlfc2l6ZSkKKwkJaWYgKGJpb19ieXRlcyA9PSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkKIAkJCXJlcS0+YmlvID0gYmlvLT5iaV9uZXh0OwogCiAJCXJlcV9iaW9fZW5kaW8ocmVxLCBiaW8sIGJpb19ieXRlcywgZXJyb3IpOwpAQCAtMjcyOCw3ICsyNzQzLDcgQEAKIAkJcnEtPm5yX3BoeXNfc2VnbWVudHMgPSBiaW9fcGh5c19zZWdtZW50cyhxLCBiaW8pOwogCQlycS0+YnVmZmVyID0gYmlvX2RhdGEoYmlvKTsKIAl9Ci0JcnEtPl9fZGF0YV9sZW4gPSBiaW8tPmJpX3NpemU7CisJcnEtPl9fZGF0YV9sZW4gPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlycS0+YmlvID0gcnEtPmJpb3RhaWwgPSBiaW87CiAKIAlpZiAoYmlvLT5iaV9iZGV2KQpAQCAtMjc0NiwxMCArMjc2MSwxMCBAQAogdm9pZCBycV9mbHVzaF9kY2FjaGVfcGFnZXMoc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCiAJcnFfZm9yX2VhY2hfc2VnbWVudChidmVjLCBycSwgaXRlcikKLQkJZmx1c2hfZGNhY2hlX3BhZ2UoYnZlYy0+YnZfcGFnZSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJ2ZWMuYnZfcGFnZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChycV9mbHVzaF9kY2FjaGVfcGFnZXMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9ibG9jay9ibGstZXhlYy5jIGIvYmxvY2svYmxrLWV4ZWMuYwppbmRleCBjM2VkZjlkLi5iYmZjMDcyIDEwMDY0NAotLS0gYS9ibG9jay9ibGstZXhlYy5jCisrKyBiL2Jsb2NrL2Jsay1leGVjLmMKQEAgLTYwLDYgKzYwLDEwIEBACiAJcnEtPnJxX2Rpc2sgPSBiZF9kaXNrOwogCXJxLT5lbmRfaW8gPSBkb25lOwogCisJLyoKKwkgKiBkb24ndCBjaGVjayBkeWluZyBmbGFnIGZvciBNUSBiZWNhdXNlIHRoZSByZXF1ZXN0IHdvbid0CisJICogYmUgcmVzdWVkIGFmdGVyIGR5aW5nIGZsYWcgaXMgc2V0CisJICovCiAJaWYgKHEtPm1xX29wcykgewogCQlibGtfbXFfaW5zZXJ0X3JlcXVlc3QocSwgcnEsIHRydWUpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9ibG9jay9ibGstZmx1c2guYyBiL2Jsb2NrL2Jsay1mbHVzaC5jCmluZGV4IGZiNmYzYzAuLjkyODhhYWYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1mbHVzaC5jCisrKyBiL2Jsb2NrL2Jsay1mbHVzaC5jCkBAIC01NDgsNyArNTQ4LDcgQEAKIAkgKiBjb3BpZWQgZnJvbSBibGtfcnFfcG9zKHJxKS4KIAkgKi8KIAlpZiAoZXJyb3Jfc2VjdG9yKQotCQkqZXJyb3Jfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJCSplcnJvcl9zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCiAJYmlvX3B1dChiaW8pOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW50ZWdyaXR5LmMgYi9ibG9jay9ibGstaW50ZWdyaXR5LmMKaW5kZXggMDNjZjcxNy4uN2ZiYWI4NCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWludGVncml0eS5jCisrKyBiL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYwpAQCAtNDMsMzAgKzQzLDMyIEBACiAgKi8KIGludCBibGtfcnFfY291bnRfaW50ZWdyaXR5X3NnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IGJpb192ZWMgKml2LCAqaXZwcnYgPSBOVUxMOworCXN0cnVjdCBiaW9fdmVjIGl2LCBpdnBydiA9IHsgTlVMTCB9OwogCXVuc2lnbmVkIGludCBzZWdtZW50cyA9IDA7CiAJdW5zaWduZWQgaW50IHNlZ19zaXplID0gMDsKLQl1bnNpZ25lZCBpbnQgaSA9IDA7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCWludCBwcmV2ID0gMDsKIAotCWJpb19mb3JfZWFjaF9pbnRlZ3JpdHlfdmVjKGl2LCBiaW8sIGkpIHsKKwliaW9fZm9yX2VhY2hfaW50ZWdyaXR5X3ZlYyhpdiwgYmlvLCBpdGVyKSB7CiAKLQkJaWYgKGl2cHJ2KSB7Ci0JCQlpZiAoIUJJT1ZFQ19QSFlTX01FUkdFQUJMRShpdnBydiwgaXYpKQorCQlpZiAocHJldikgeworCQkJaWYgKCFCSU9WRUNfUEhZU19NRVJHRUFCTEUoJml2cHJ2LCAmaXYpKQogCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAKLQkJCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCBpdnBydiwgaXYpKQorCQkJaWYgKCFCSU9WRUNfU0VHX0JPVU5EQVJZKHEsICZpdnBydiwgJml2KSkKIAkJCQlnb3RvIG5ld19zZWdtZW50OwogCi0JCQlpZiAoc2VnX3NpemUgKyBpdi0+YnZfbGVuID4gcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKKwkJCWlmIChzZWdfc2l6ZSArIGl2LmJ2X2xlbiA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCiAJCQkJZ290byBuZXdfc2VnbWVudDsKIAotCQkJc2VnX3NpemUgKz0gaXYtPmJ2X2xlbjsKKwkJCXNlZ19zaXplICs9IGl2LmJ2X2xlbjsKIAkJfSBlbHNlIHsKIG5ld19zZWdtZW50OgogCQkJc2VnbWVudHMrKzsKLQkJCXNlZ19zaXplID0gaXYtPmJ2X2xlbjsKKwkJCXNlZ19zaXplID0gaXYuYnZfbGVuOwogCQl9CiAKKwkJcHJldiA9IDE7CiAJCWl2cHJ2ID0gaXY7CiAJfQogCkBAIC04NywyNCArODksMjUgQEAKIGludCBibGtfcnFfbWFwX2ludGVncml0eV9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLAogCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0KQogewotCXN0cnVjdCBiaW9fdmVjICppdiwgKml2cHJ2ID0gTlVMTDsKKwlzdHJ1Y3QgYmlvX3ZlYyBpdiwgaXZwcnYgPSB7IE5VTEwgfTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgc2VnbWVudHMgPSAwOwotCXVuc2lnbmVkIGludCBpID0gMDsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CisJaW50IHByZXYgPSAwOwogCi0JYmlvX2Zvcl9lYWNoX2ludGVncml0eV92ZWMoaXYsIGJpbywgaSkgeworCWJpb19mb3JfZWFjaF9pbnRlZ3JpdHlfdmVjKGl2LCBiaW8sIGl0ZXIpIHsKIAotCQlpZiAoaXZwcnYpIHsKLQkJCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKGl2cHJ2LCBpdikpCisJCWlmIChwcmV2KSB7CisJCQlpZiAoIUJJT1ZFQ19QSFlTX01FUkdFQUJMRSgmaXZwcnYsICZpdikpCiAJCQkJZ290byBuZXdfc2VnbWVudDsKIAotCQkJaWYgKCFCSU9WRUNfU0VHX0JPVU5EQVJZKHEsIGl2cHJ2LCBpdikpCisJCQlpZiAoIUJJT1ZFQ19TRUdfQk9VTkRBUlkocSwgJml2cHJ2LCAmaXYpKQogCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAKLQkJCWlmIChzZy0+bGVuZ3RoICsgaXYtPmJ2X2xlbiA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCisJCQlpZiAoc2ctPmxlbmd0aCArIGl2LmJ2X2xlbiA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCiAJCQkJZ290byBuZXdfc2VnbWVudDsKIAotCQkJc2ctPmxlbmd0aCArPSBpdi0+YnZfbGVuOworCQkJc2ctPmxlbmd0aCArPSBpdi5idl9sZW47CiAJCX0gZWxzZSB7CiBuZXdfc2VnbWVudDoKIAkJCWlmICghc2cpCkBAIC0xMTQsMTAgKzExNywxMSBAQAogCQkJCXNnID0gc2dfbmV4dChzZyk7CiAJCQl9CiAKLQkJCXNnX3NldF9wYWdlKHNnLCBpdi0+YnZfcGFnZSwgaXYtPmJ2X2xlbiwgaXYtPmJ2X29mZnNldCk7CisJCQlzZ19zZXRfcGFnZShzZywgaXYuYnZfcGFnZSwgaXYuYnZfbGVuLCBpdi5idl9vZmZzZXQpOwogCQkJc2VnbWVudHMrKzsKIAkJfQogCisJCXByZXYgPSAxOwogCQlpdnBydiA9IGl2OwogCX0KIApkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWxpYi5jIGIvYmxvY2svYmxrLWxpYi5jCmluZGV4IDliNWI1NjEuLjJkYTc2YzkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1saWIuYworKysgYi9ibG9jay9ibGstbGliLmMKQEAgLTEwOCwxMiArMTA4LDEyIEBACiAJCQlyZXFfc2VjdHMgPSBlbmRfc2VjdCAtIHNlY3RvcjsKIAkJfQogCi0JCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCQliaW8tPmJpX2VuZF9pbyA9IGJpb19iYXRjaF9lbmRfaW87CiAJCWJpby0+YmlfYmRldiA9IGJkZXY7CiAJCWJpby0+YmlfcHJpdmF0ZSA9ICZiYjsKIAotCQliaW8tPmJpX3NpemUgPSByZXFfc2VjdHMgPDwgOTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSByZXFfc2VjdHMgPDwgOTsKIAkJbnJfc2VjdHMgLT0gcmVxX3NlY3RzOwogCQlzZWN0b3IgPSBlbmRfc2VjdDsKIApAQCAtMTc0LDcgKzE3NCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCQliaW8tPmJpX2VuZF9pbyA9IGJpb19iYXRjaF9lbmRfaW87CiAJCWJpby0+YmlfYmRldiA9IGJkZXY7CiAJCWJpby0+YmlfcHJpdmF0ZSA9ICZiYjsKQEAgLTE4NCwxMSArMTg0LDExIEBACiAJCWJpby0+YmlfaW9fdmVjLT5idl9sZW4gPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KTsKIAogCQlpZiAobnJfc2VjdHMgPiBtYXhfd3JpdGVfc2FtZV9zZWN0b3JzKSB7Ci0JCQliaW8tPmJpX3NpemUgPSBtYXhfd3JpdGVfc2FtZV9zZWN0b3JzIDw8IDk7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IG1heF93cml0ZV9zYW1lX3NlY3RvcnMgPDwgOTsKIAkJCW5yX3NlY3RzIC09IG1heF93cml0ZV9zYW1lX3NlY3RvcnM7CiAJCQlzZWN0b3IgKz0gbWF4X3dyaXRlX3NhbWVfc2VjdG9yczsKIAkJfSBlbHNlIHsKLQkJCWJpby0+Ymlfc2l6ZSA9IG5yX3NlY3RzIDw8IDk7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IG5yX3NlY3RzIDw8IDk7CiAJCQlucl9zZWN0cyA9IDA7CiAJCX0KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCQliaW8tPmJpX2JkZXYgICA9IGJkZXY7CiAJCWJpby0+YmlfZW5kX2lvID0gYmlvX2JhdGNoX2VuZF9pbzsKIAkJYmlvLT5iaV9wcml2YXRlID0gJmJiOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1hcC5jIGIvYmxvY2svYmxrLW1hcC5jCmluZGV4IDYyM2UxY2QuLmFlNGFlMTAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tYXAuYworKysgYi9ibG9jay9ibGstbWFwLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAkJcnEtPmJpb3RhaWwtPmJpX25leHQgPSBiaW87CiAJCXJxLT5iaW90YWlsID0gYmlvOwogCi0JCXJxLT5fX2RhdGFfbGVuICs9IGJpby0+Ymlfc2l6ZTsKKwkJcnEtPl9fZGF0YV9sZW4gKz0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzYsNyArNzYsNyBAQAogCiAJcmV0ID0gYmxrX3JxX2FwcGVuZF9iaW8ocSwgcnEsIGJpbyk7CiAJaWYgKCFyZXQpCi0JCXJldHVybiBiaW8tPmJpX3NpemU7CisJCXJldHVybiBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAogCS8qIGlmIGl0IHdhcyBib3VjbmVkIHdlIG11c3QgY2FsbCB0aGUgZW5kIGlvIGZ1bmN0aW9uICovCiAJYmlvX2VuZGlvKGJpbywgMCk7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAlpZiAoSVNfRVJSKGJpbykpCiAJCXJldHVybiBQVFJfRVJSKGJpbyk7CiAKLQlpZiAoYmlvLT5iaV9zaXplICE9IGxlbikgeworCWlmIChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSAhPSBsZW4pIHsKIAkJLyoKIAkJICogR3JhYiBhbiBleHRyYSByZWZlcmVuY2UgdG8gdGhpcyBiaW8sIGFzIGJpb191bm1hcF91c2VyKCkKIAkJICogZXhwZWN0cyB0byBiZSBhYmxlIHRvIGRyb3AgaXQgdHdpY2UgYXMgaXQgaGFwcGVucyBvbiB0aGUKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tZXJnZS5jIGIvYmxvY2svYmxrLW1lcmdlLmMKaW5kZXggMWZmYzU4OS4uOGY4YWRhYSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1lcmdlLmMKKysrIGIvYmxvY2svYmxrLW1lcmdlLmMKQEAgLTEyLDEwICsxMiwxMSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBfX2Jsa19yZWNhbGNfcnFfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJCSAgICAgc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCBiaW9fdmVjICpidiwgKmJ2cHJ2ID0gTlVMTDsKLQlpbnQgY2x1c3RlciwgaSwgaGlnaCwgaGlnaHBydiA9IDE7CisJc3RydWN0IGJpb192ZWMgYnYsIGJ2cHJ2ID0geyBOVUxMIH07CisJaW50IGNsdXN0ZXIsIGhpZ2gsIGhpZ2hwcnYgPSAxOwogCXVuc2lnbmVkIGludCBzZWdfc2l6ZSwgbnJfcGh5c19zZWdzOwogCXN0cnVjdCBiaW8gKmZiaW8sICpiYmlvOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAogCWlmICghYmlvKQogCQlyZXR1cm4gMDsKQEAgLTI1LDI1ICsyNiwyMyBAQAogCXNlZ19zaXplID0gMDsKIAlucl9waHlzX3NlZ3MgPSAwOwogCWZvcl9lYWNoX2JpbyhiaW8pIHsKLQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7CiAJCQkvKgogCQkJICogdGhlIHRyaWNrIGhlcmUgaXMgbWFraW5nIHN1cmUgdGhhdCBhIGhpZ2ggcGFnZSBpcwogCQkJICogbmV2ZXIgY29uc2lkZXJlZCBwYXJ0IG9mIGFub3RoZXIgc2VnbWVudCwgc2luY2UgdGhhdAogCQkJICogbWlnaHQgY2hhbmdlIHdpdGggdGhlIGJvdW5jZSBwYWdlLgogCQkJICovCi0JCQloaWdoID0gcGFnZV90b19wZm4oYnYtPmJ2X3BhZ2UpID4gcXVldWVfYm91bmNlX3BmbihxKTsKLQkJCWlmIChoaWdoIHx8IGhpZ2hwcnYpCi0JCQkJZ290byBuZXdfc2VnbWVudDsKLQkJCWlmIChjbHVzdGVyKSB7Ci0JCQkJaWYgKHNlZ19zaXplICsgYnYtPmJ2X2xlbgorCQkJaGlnaCA9IHBhZ2VfdG9fcGZuKGJ2LmJ2X3BhZ2UpID4gcXVldWVfYm91bmNlX3BmbihxKTsKKwkJCWlmICghaGlnaCAmJiAhaGlnaHBydiAmJiBjbHVzdGVyKSB7CisJCQkJaWYgKHNlZ19zaXplICsgYnYuYnZfbGVuCiAJCQkJICAgID4gcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKIAkJCQkJZ290byBuZXdfc2VnbWVudDsKLQkJCQlpZiAoIUJJT1ZFQ19QSFlTX01FUkdFQUJMRShidnBydiwgYnYpKQorCQkJCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKCZidnBydiwgJmJ2KSkKIAkJCQkJZ290byBuZXdfc2VnbWVudDsKLQkJCQlpZiAoIUJJT1ZFQ19TRUdfQk9VTkRBUlkocSwgYnZwcnYsIGJ2KSkKKwkJCQlpZiAoIUJJT1ZFQ19TRUdfQk9VTkRBUlkocSwgJmJ2cHJ2LCAmYnYpKQogCQkJCQlnb3RvIG5ld19zZWdtZW50OwogCi0JCQkJc2VnX3NpemUgKz0gYnYtPmJ2X2xlbjsKKwkJCQlzZWdfc2l6ZSArPSBidi5idl9sZW47CiAJCQkJYnZwcnYgPSBidjsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTU0LDcgKzUzLDcgQEAKIAogCQkJbnJfcGh5c19zZWdzKys7CiAJCQlidnBydiA9IGJ2OwotCQkJc2VnX3NpemUgPSBidi0+YnZfbGVuOworCQkJc2VnX3NpemUgPSBidi5idl9sZW47CiAJCQloaWdocHJ2ID0gaGlnaDsKIAkJfQogCQliYmlvID0gYmlvOwpAQCAtODcsNiArODYsOSBAQAogc3RhdGljIGludCBibGtfcGh5c19jb250aWdfc2VnbWVudChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLAogCQkJCSAgIHN0cnVjdCBiaW8gKm54dCkKIHsKKwlzdHJ1Y3QgYmlvX3ZlYyBlbmRfYnYgPSB7IE5VTEwgfSwgbnh0X2J2OworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKKwogCWlmICghYmxrX3F1ZXVlX2NsdXN0ZXIocSkpCiAJCXJldHVybiAwOwogCkBAIC05NywzNCArOTksNDAgQEAKIAlpZiAoIWJpb19oYXNfZGF0YShiaW8pKQogCQlyZXR1cm4gMTsKIAotCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKF9fQlZFQ19FTkQoYmlvKSwgX19CVkVDX1NUQVJUKG54dCkpKQorCWJpb19mb3JfZWFjaF9zZWdtZW50KGVuZF9idiwgYmlvLCBpdGVyKQorCQlpZiAoZW5kX2J2LmJ2X2xlbiA9PSBpdGVyLmJpX3NpemUpCisJCQlicmVhazsKKworCW54dF9idiA9IGJpb19pb3ZlYyhueHQpOworCisJaWYgKCFCSU9WRUNfUEhZU19NRVJHRUFCTEUoJmVuZF9idiwgJm54dF9idikpCiAJCXJldHVybiAwOwogCiAJLyoKIAkgKiBiaW8gYW5kIG54dCBhcmUgY29udGlndW91cyBpbiBtZW1vcnk7IGNoZWNrIGlmIHRoZSBxdWV1ZSBhbGxvd3MKIAkgKiB0aGVzZSB0d28gdG8gYmUgbWVyZ2VkIGludG8gb25lCiAJICovCi0JaWYgKEJJT19TRUdfQk9VTkRBUlkocSwgYmlvLCBueHQpKQorCWlmIChCSU9WRUNfU0VHX0JPVU5EQVJZKHEsICZlbmRfYnYsICZueHRfYnYpKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBfX2Jsa19zZWdtZW50X21hcF9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCi0JCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHN0cnVjdCBiaW9fdmVjICoqYnZwcnYsCisJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHN0cnVjdCBiaW9fdmVjICpidnBydiwKIAkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKipzZywgaW50ICpuc2VncywgaW50ICpjbHVzdGVyKQogewogCiAJaW50IG5ieXRlcyA9IGJ2ZWMtPmJ2X2xlbjsKIAotCWlmICgqYnZwcnYgJiYgKmNsdXN0ZXIpIHsKKwlpZiAoKnNnICYmICpjbHVzdGVyKSB7CiAJCWlmICgoKnNnKS0+bGVuZ3RoICsgbmJ5dGVzID4gcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKIAkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAKLQkJaWYgKCFCSU9WRUNfUEhZU19NRVJHRUFCTEUoKmJ2cHJ2LCBidmVjKSkKKwkJaWYgKCFCSU9WRUNfUEhZU19NRVJHRUFCTEUoYnZwcnYsIGJ2ZWMpKQogCQkJZ290byBuZXdfc2VnbWVudDsKLQkJaWYgKCFCSU9WRUNfU0VHX0JPVU5EQVJZKHEsICpidnBydiwgYnZlYykpCisJCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCBidnBydiwgYnZlYykpCiAJCQlnb3RvIG5ld19zZWdtZW50OwogCiAJCSgqc2cpLT5sZW5ndGggKz0gbmJ5dGVzOwpAQCAtMTUwLDcgKzE1OCw3IEBACiAJCXNnX3NldF9wYWdlKCpzZywgYnZlYy0+YnZfcGFnZSwgbmJ5dGVzLCBidmVjLT5idl9vZmZzZXQpOwogCQkoKm5zZWdzKSsrOwogCX0KLQkqYnZwcnYgPSBidmVjOworCSpidnBydiA9ICpidmVjOwogfQogCiAvKgpAQCAtMTYwLDcgKzE2OCw3IEBACiBpbnQgYmxrX3JxX21hcF9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0KQogewotCXN0cnVjdCBiaW9fdmVjICpidmVjLCAqYnZwcnY7CisJc3RydWN0IGJpb192ZWMgYnZlYywgYnZwcnYgPSB7IE5VTEwgfTsKIAlzdHJ1Y3QgcmVxX2l0ZXJhdG9yIGl0ZXI7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgbnNlZ3MsIGNsdXN0ZXI7CkBAIC0xNzEsMTAgKzE3OSw5IEBACiAJLyoKIAkgKiBmb3IgZWFjaCBiaW8gaW4gcnEKIAkgKi8KLQlidnBydiA9IE5VTEw7CiAJc2cgPSBOVUxMOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgcnEsIGl0ZXIpIHsKLQkJX19ibGtfc2VnbWVudF9tYXBfc2cocSwgYnZlYywgc2dsaXN0LCAmYnZwcnYsICZzZywKKwkJX19ibGtfc2VnbWVudF9tYXBfc2cocSwgJmJ2ZWMsIHNnbGlzdCwgJmJ2cHJ2LCAmc2csCiAJCQkJICAgICAmbnNlZ3MsICZjbHVzdGVyKTsKIAl9IC8qIHNlZ21lbnRzIGluIHJxICovCiAKQEAgLTIyMywxOCArMjMwLDE3IEBACiBpbnQgYmxrX2Jpb19tYXBfc2coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKIAkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QpCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMsICpidnBydjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjLCBidnBydiA9IHsgTlVMTCB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IG5zZWdzLCBjbHVzdGVyOwotCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKIAluc2VncyA9IDA7CiAJY2x1c3RlciA9IGJsa19xdWV1ZV9jbHVzdGVyKHEpOwogCi0JYnZwcnYgPSBOVUxMOwogCXNnID0gTlVMTDsKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKLQkJX19ibGtfc2VnbWVudF9tYXBfc2cocSwgYnZlYywgc2dsaXN0LCAmYnZwcnYsICZzZywKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGl0ZXIpIHsKKwkJX19ibGtfc2VnbWVudF9tYXBfc2cocSwgJmJ2ZWMsIHNnbGlzdCwgJmJ2cHJ2LCAmc2csCiAJCQkJICAgICAmbnNlZ3MsICZjbHVzdGVyKTsKIAl9IC8qIHNlZ21lbnRzIGluIGJpbyAqLwogCkBAIC01NDMsOSArNTQ5LDkgQEAKIAogaW50IGJsa190cnlfbWVyZ2Uoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaWYgKGJsa19ycV9wb3MocnEpICsgYmxrX3JxX3NlY3RvcnMocnEpID09IGJpby0+Ymlfc2VjdG9yKQorCWlmIChibGtfcnFfcG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKSA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKQogCQlyZXR1cm4gRUxFVkFUT1JfQkFDS19NRVJHRTsKLQllbHNlIGlmIChibGtfcnFfcG9zKHJxKSAtIGJpb19zZWN0b3JzKGJpbykgPT0gYmlvLT5iaV9zZWN0b3IpCisJZWxzZSBpZiAoYmxrX3JxX3BvcyhycSkgLSBiaW9fc2VjdG9ycyhiaW8pID09IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpCiAJCXJldHVybiBFTEVWQVRPUl9GUk9OVF9NRVJHRTsKIAlyZXR1cm4gRUxFVkFUT1JfTk9fTUVSR0U7CiB9CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEtY3B1LmMgYi9ibG9jay9ibGstbXEtY3B1LmMKaW5kZXggMDA0NWFjZS4uMzE0NmJlZiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLWNwdS5jCisrKyBiL2Jsb2NrL2Jsay1tcS1jcHUuYwpAQCAtMjgsMzYgKzI4LDYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgdm9pZCBibGtfbXFfY3B1X25vdGlmeSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjcHUpCi17Ci0JaWYgKGFjdGlvbiA9PSBDUFVfREVBRCB8fCBhY3Rpb24gPT0gQ1BVX0RFQURfRlJPWkVOKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBDUFUgZ29lcyBhd2F5LCBlbnN1cmUgdGhhdCB3ZSBydW4gYW55IHBlbmRpbmcKLQkJICogY29tcGxldGlvbnMuCi0JCSAqLwotCQlzdHJ1Y3QgbGxpc3Rfbm9kZSAqbm9kZTsKLQkJc3RydWN0IHJlcXVlc3QgKnJxOwotCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQkJbm9kZSA9IGxsaXN0X2RlbF9hbGwoJnBlcl9jcHUoaXBpX2xpc3RzLCBjcHUpKTsKLQkJd2hpbGUgKG5vZGUpIHsKLQkJCXN0cnVjdCBsbGlzdF9ub2RlICpuZXh0ID0gbm9kZS0+bmV4dDsKLQotCQkJcnEgPSBsbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgcmVxdWVzdCwgbGxfbGlzdCk7Ci0JCQlfX2Jsa19tcV9lbmRfaW8ocnEsIHJxLT5lcnJvcnMpOwotCQkJbm9kZSA9IG5leHQ7Ci0JCX0KLQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgYmxrX21xX21haW5fY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gYmxrX21xX21haW5fY3B1X25vdGlmeSwKLX07Ci0KIHZvaWQgYmxrX21xX3JlZ2lzdGVyX2NwdV9ub3RpZmllcihzdHJ1Y3QgYmxrX21xX2NwdV9ub3RpZmllciAqbm90aWZpZXIpCiB7CiAJQlVHX09OKCFub3RpZmllci0+bm90aWZ5KTsKQEAgLTgyLDEyICs1Miw3IEBACiAJbm90aWZpZXItPmRhdGEgPSBkYXRhOwogfQogCi1zdGF0aWMgc3RydWN0IGJsa19tcV9jcHVfbm90aWZpZXIgX19jcHVpbml0ZGF0YSBjcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmeSA9IGJsa19tcV9jcHVfbm90aWZ5LAotfTsKLQogdm9pZCBfX2luaXQgYmxrX21xX2NwdV9pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZibGtfbXFfbWFpbl9jcHVfbm90aWZpZXIpOwotCWJsa19tcV9yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdV9ub3RpZmllcik7CisJaG90Y3B1X25vdGlmaWVyKGJsa19tcV9tYWluX2NwdV9ub3RpZnksIDApOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLXRhZy5jIGIvYmxvY2svYmxrLW1xLXRhZy5jCmluZGV4IGQ2NGEwMmYuLjVkNzBlZGMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS10YWcuYworKysgYi9ibG9jay9ibGstbXEtdGFnLmMKQEAgLTM2LDcgKzM2LDggQEAKIHsKIAlpbnQgdGFnOwogCi0JdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmdGFncy0+ZnJlZV90YWdzLCBnZnApOworCXRhZyA9IHBlcmNwdV9pZGFfYWxsb2MoJnRhZ3MtPmZyZWVfdGFncywgKGdmcCAmIF9fR0ZQX1dBSVQpID8KKwkJCSAgICAgICBUQVNLX1VOSU5URVJSVVBUSUJMRSA6IFRBU0tfUlVOTklORyk7CiAJaWYgKHRhZyA8IDApCiAJCXJldHVybiBCTEtfTVFfVEFHX0ZBSUw7CiAJcmV0dXJuIHRhZyArIHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7CkBAIC01Miw3ICs1Myw4IEBACiAJCXJldHVybiBCTEtfTVFfVEFHX0ZBSUw7CiAJfQogCi0JdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmdGFncy0+cmVzZXJ2ZWRfdGFncywgZ2ZwKTsKKwl0YWcgPSBwZXJjcHVfaWRhX2FsbG9jKCZ0YWdzLT5yZXNlcnZlZF90YWdzLCAoZ2ZwICYgX19HRlBfV0FJVCkgPworCQkJICAgICAgIFRBU0tfVU5JTlRFUlJVUFRJQkxFIDogVEFTS19SVU5OSU5HKTsKIAlpZiAodGFnIDwgMCkKIAkJcmV0dXJuIEJMS19NUV9UQUdfRkFJTDsKIAlyZXR1cm4gdGFnOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLmMgYi9ibG9jay9ibGstbXEuYwppbmRleCBjNzkxMjZlLi41NzAzOWZjIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEuYworKysgYi9ibG9jay9ibGstbXEuYwpAQCAtMjcsOCArMjcsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2Jsa19tcV9ydW5faHdfcXVldWUoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgpOwogCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGxpc3RfaGVhZCwgaXBpX2xpc3RzKTsKLQogc3RhdGljIHN0cnVjdCBibGtfbXFfY3R4ICpfX2Jsa19tcV9nZXRfY3R4KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KQogewpAQCAtMTA2LDEwICsxMDQsMTMgQEAKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2xvY2tfaXJxKHEtPm1xX2ZyZWV6ZV93cSwKLQkJIWJsa19xdWV1ZV9ieXBhc3MocSksICpxLT5xdWV1ZV9sb2NrKTsKKwkJIWJsa19xdWV1ZV9ieXBhc3MocSkgfHwgYmxrX3F1ZXVlX2R5aW5nKHEpLAorCQkqcS0+cXVldWVfbG9jayk7CiAJLyogaW5jIHVzYWdlIHdpdGggbG9jayBob2xkIHRvIGF2b2lkIGZyZWV6ZV9xdWV1ZSBydW5zIGhlcmUgKi8KLQlpZiAoIXJldCkKKwlpZiAoIXJldCAmJiAhYmxrX3F1ZXVlX2R5aW5nKHEpKQogCQlfX3BlcmNwdV9jb3VudGVyX2FkZCgmcS0+bXFfdXNhZ2VfY291bnRlciwgMSwgMTAwMDAwMCk7CisJZWxzZSBpZiAoYmxrX3F1ZXVlX2R5aW5nKHEpKQorCQlyZXQgPSAtRU5PREVWOwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMjAsNiArMTIxLDIyIEBACiAJX19wZXJjcHVfY291bnRlcl9hZGQoJnEtPm1xX3VzYWdlX2NvdW50ZXIsIC0xLCAxMDAwMDAwKTsKIH0KIAorc3RhdGljIHZvaWQgX19ibGtfbXFfZHJhaW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJd2hpbGUgKHRydWUpIHsKKwkJczY0IGNvdW50OworCisJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJCWNvdW50ID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZxLT5tcV91c2FnZV9jb3VudGVyKTsKKwkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCisJCWlmIChjb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCWJsa19tcV9ydW5fcXVldWVzKHEsIGZhbHNlKTsKKwkJbXNsZWVwKDEwKTsKKwl9Cit9CisKIC8qCiAgKiBHdWFyYW50ZWUgbm8gcmVxdWVzdCBpcyBpbiB1c2UsIHNvIHdlIGNhbiBjaGFuZ2UgYW55IGRhdGEgc3RydWN0dXJlIG9mCiAgKiB0aGUgcXVldWUgYWZ0ZXJ3YXJkLgpAQCAtMTMzLDIxICsxNTAsMTMgQEAKIAlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX0JZUEFTUywgcSk7CiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCi0JaWYgKCFkcmFpbikKLQkJcmV0dXJuOworCWlmIChkcmFpbikKKwkJX19ibGtfbXFfZHJhaW5fcXVldWUocSk7Cit9CiAKLQl3aGlsZSAodHJ1ZSkgewotCQlzNjQgY291bnQ7Ci0KLQkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQkJY291bnQgPSBwZXJjcHVfY291bnRlcl9zdW0oJnEtPm1xX3VzYWdlX2NvdW50ZXIpOwotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0KLQkJaWYgKGNvdW50ID09IDApCi0JCQlicmVhazsKLQkJYmxrX21xX3J1bl9xdWV1ZXMocSwgZmFsc2UpOwotCQltc2xlZXAoMTApOwotCX0KK3ZvaWQgYmxrX21xX2RyYWluX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCV9fYmxrX21xX2RyYWluX3F1ZXVlKHEpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfbXFfdW5mcmVlemVfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0xNzksNiArMTg4LDggQEAKIAogCXJxLT5tcV9jdHggPSBjdHg7CiAJcnEtPmNtZF9mbGFncyA9IHJ3X2ZsYWdzOworCXJxLT5zdGFydF90aW1lID0gamlmZmllczsKKwlzZXRfc3RhcnRfdGltZV9ucyhycSk7CiAJY3R4LT5ycV9kaXNwYXRjaGVkW3J3X2lzX3N5bmMocndfZmxhZ3MpXSsrOwogfQogCkBAIC0zMDUsNyArMzE2LDcgQEAKIAkJc3RydWN0IGJpbyAqbmV4dCA9IGJpby0+YmlfbmV4dDsKIAogCQliaW8tPmJpX25leHQgPSBOVUxMOwotCQlieXRlcyArPSBiaW8tPmJpX3NpemU7CisJCWJ5dGVzICs9IGJpby0+YmlfaXRlci5iaV9zaXplOwogCQlibGtfbXFfYmlvX2VuZGlvKHJxLCBiaW8sIGVycm9yKTsKIAkJYmlvID0gbmV4dDsKIAl9CkBAIC0zMjYsNTYgKzMzNywxMyBAQAogCQlibGtfbXFfY29tcGxldGVfcmVxdWVzdChycSwgZXJyb3IpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU01QKQotCi0vKgotICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLSAqLwotc3RhdGljIHZvaWQgaXBpX2VuZF9pbyh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYmxrX21xX2VuZF9pb19yZW1vdGUodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCA9ICZwZXJfY3B1KGlwaV9saXN0cywgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpuZXh0OwotCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkYXRhOwogCi0JZW50cnkgPSBsbGlzdF9kZWxfYWxsKGxpc3QpOwotCi0Jd2hpbGUgKGVudHJ5KSB7Ci0JCW5leHQgPSBlbnRyeS0+bmV4dDsKLQkJcnEgPSBsbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHJlcXVlc3QsIGxsX2xpc3QpOwotCQlfX2Jsa19tcV9lbmRfaW8ocnEsIHJxLT5lcnJvcnMpOwotCQllbnRyeSA9IG5leHQ7Ci0JfQorCV9fYmxrX21xX2VuZF9pbyhycSwgcnEtPmVycm9ycyk7CiB9CiAKLXN0YXRpYyBpbnQgaXBpX3JlbW90ZV9jcHUoc3RydWN0IGJsa19tcV9jdHggKmN0eCwgY29uc3QgaW50IGNwdSwKLQkJCSAgc3RydWN0IHJlcXVlc3QgKnJxLCBjb25zdCBpbnQgZXJyb3IpCi17Ci0Jc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmRhdGEgPSAmcnEtPmNzZDsKLQotCXJxLT5lcnJvcnMgPSBlcnJvcjsKLQlycS0+bGxfbGlzdC5uZXh0ID0gTlVMTDsKLQotCS8qCi0JICogSWYgdGhlIGxpc3QgaXMgbm9uLWVtcHR5LCBhbiBleGlzdGluZyBJUEkgbXVzdCBhbHJlYWR5Ci0JICogYmUgImluIGZsaWdodCIuIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIG5lZWQgbm90IHNjaGVkdWxlCi0JICogYSBuZXcgb25lLgotCSAqLwotCWlmIChsbGlzdF9hZGQoJnJxLT5sbF9saXN0LCAmcGVyX2NwdShpcGlfbGlzdHMsIGN0eC0+Y3B1KSkpIHsKLQkJZGF0YS0+ZnVuYyA9IGlwaV9lbmRfaW87Ci0JCWRhdGEtPmZsYWdzID0gMDsKLQkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3R4LT5jcHUsIGRhdGEsIDApOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotI2Vsc2UgLyogQ09ORklHX1NNUCAqLwotc3RhdGljIGludCBpcGlfcmVtb3RlX2NwdShzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4LCBjb25zdCBpbnQgY3B1LAotCQkJICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGNvbnN0IGludCBlcnJvcikKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQogLyoKICAqIEVuZCBJTyBvbiB0aGlzIHJlcXVlc3Qgb24gYSBtdWx0aXF1ZXVlIGVuYWJsZWQgZHJpdmVyLiBXZSdsbCBlaXRoZXIgZG8KICAqIGl0IGRpcmVjdGx5IGlubGluZSwgb3IgcHVudCB0byBhIGxvY2FsIElQSSBoYW5kbGVyIG9uIHRoZSBtYXRjaGluZwpAQCAtMzkwLDExICszNTgsMTUgQEAKIAkJcmV0dXJuIF9fYmxrX21xX2VuZF9pbyhycSwgZXJyb3IpOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwotCi0JaWYgKGNwdSA9PSBjdHgtPmNwdSB8fCAhY3B1X29ubGluZShjdHgtPmNwdSkgfHwKLQkgICAgIWlwaV9yZW1vdGVfY3B1KGN0eCwgY3B1LCBycSwgZXJyb3IpKQorCWlmIChjcHUgIT0gY3R4LT5jcHUgJiYgY3B1X29ubGluZShjdHgtPmNwdSkpIHsKKwkJcnEtPmVycm9ycyA9IGVycm9yOworCQlycS0+Y3NkLmZ1bmMgPSBibGtfbXFfZW5kX2lvX3JlbW90ZTsKKwkJcnEtPmNzZC5pbmZvID0gcnE7CisJCXJxLT5jc2QuZmxhZ3MgPSAwOworCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjdHgtPmNwdSwgJnJxLT5jc2QsIDApOworCX0gZWxzZSB7CiAJCV9fYmxrX21xX2VuZF9pbyhycSwgZXJyb3IpOwotCisJfQogCXB1dF9jcHUoKTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX21xX2VuZF9pbyk7CkBAIC0xMDkxLDggKzEwNjMsOCBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZoY3R4LT5wYWdlX2xpc3QpKSB7Ci0JCXBhZ2UgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoY3R4LT5wYWdlX2xpc3QsIHN0cnVjdCBwYWdlLCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmcGFnZS0+bGlzdCk7CisJCXBhZ2UgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoY3R4LT5wYWdlX2xpc3QsIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbF9pbml0KCZwYWdlLT5scnUpOwogCQlfX2ZyZWVfcGFnZXMocGFnZSwgcGFnZS0+cHJpdmF0ZSk7CiAJfQogCkBAIC0xMTU2LDcgKzExMjgsNyBAQAogCQkJYnJlYWs7CiAKIAkJcGFnZS0+cHJpdmF0ZSA9IHRoaXNfb3JkZXI7Ci0JCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxpc3QsICZoY3R4LT5wYWdlX2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsICZoY3R4LT5wYWdlX2xpc3QpOwogCiAJCXAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJCWVudHJpZXNfcGVyX3BhZ2UgPSBvcmRlcl90b19zaXplKHRoaXNfb3JkZXIpIC8gcnFfc2l6ZTsKQEAgLTE0MjksNyArMTQwMSw2IEBACiAJaW50IGk7CiAKIAlxdWV1ZV9mb3JfZWFjaF9od19jdHgocSwgaGN0eCwgaSkgewotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhjdHgtPmRlbGF5ZWRfd29yayk7CiAJCWtmcmVlKGhjdHgtPmN0eF9tYXApOwogCQlrZnJlZShoY3R4LT5jdHhzKTsKIAkJYmxrX21xX2ZyZWVfcnFfbWFwKGhjdHgpOwpAQCAtMTQ1MSw3ICsxNDIyLDYgQEAKIAlsaXN0X2RlbF9pbml0KCZxLT5hbGxfcV9ub2RlKTsKIAltdXRleF91bmxvY2soJmFsbF9xX211dGV4KTsKIH0KLUVYUE9SVF9TWU1CT0woYmxrX21xX2ZyZWVfcXVldWUpOwogCiAvKiBCYXNpY2FsbHkgcmVkbyBibGtfbXFfaW5pdF9xdWV1ZSB3aXRoIHF1ZXVlIGZyb3plbiAqLwogc3RhdGljIHZvaWQgYmxrX21xX3F1ZXVlX3JlaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKQEAgLTE0OTUsMTEgKzE0NjUsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBibGtfbXFfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCWluaXRfbGxpc3RfaGVhZCgmcGVyX2NwdShpcGlfbGlzdHMsIGkpKTsKLQogCWJsa19tcV9jcHVfaW5pdCgpOwogCiAJLyogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcGVyY3B1X2NvdW50ZXJfaG90Y3B1X2NhbGxiYWNrKCkgKi8KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5oIGIvYmxvY2svYmxrLW1xLmgKaW5kZXggNTJiZjFmOS4uNWMzOTE3OSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmgKKysrIGIvYmxvY2svYmxrLW1xLmgKQEAgLTI3LDYgKzI3LDggQEAKIHZvaWQgYmxrX21xX3J1bl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgYm9vbCBydW5fcXVldWUsIGJvb2wgYXN5bmMpOwogdm9pZCBibGtfbXFfcnVuX2h3X3F1ZXVlKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBib29sIGFzeW5jKTsKIHZvaWQgYmxrX21xX2luaXRfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwordm9pZCBibGtfbXFfZHJhaW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwordm9pZCBibGtfbXFfZnJlZV9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAKIC8qCiAgKiBDUFUgaG90cGx1ZyBoZWxwZXJzCkBAIC0zOCw3ICs0MCw2IEBACiB2b2lkIGJsa19tcV9yZWdpc3Rlcl9jcHVfbm90aWZpZXIoc3RydWN0IGJsa19tcV9jcHVfbm90aWZpZXIgKm5vdGlmaWVyKTsKIHZvaWQgYmxrX21xX3VucmVnaXN0ZXJfY3B1X25vdGlmaWVyKHN0cnVjdCBibGtfbXFfY3B1X25vdGlmaWVyICpub3RpZmllcik7CiB2b2lkIGJsa19tcV9jcHVfaW5pdCh2b2lkKTsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgbGxpc3RfaGVhZCwgaXBpX2xpc3RzKTsKIAogLyoKICAqIENQVSAtPiBxdWV1ZSBtYXBwaW5ncwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXNldHRpbmdzLmMgYi9ibG9jay9ibGstc2V0dGluZ3MuYwppbmRleCAwNWU4MjY3Li41ZDIxMjM5IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc2V0dGluZ3MuYworKysgYi9ibG9jay9ibGstc2V0dGluZ3MuYwpAQCAtNTkyLDYgKzU5MiwxMCBAQAogCQlyZXQgPSAtMTsKIAl9CiAKKwl0LT5yYWlkX3BhcnRpYWxfc3RyaXBlc19leHBlbnNpdmUgPQorCQltYXgodC0+cmFpZF9wYXJ0aWFsX3N0cmlwZXNfZXhwZW5zaXZlLAorCQkgICAgYi0+cmFpZF9wYXJ0aWFsX3N0cmlwZXNfZXhwZW5zaXZlKTsKKwogCS8qIEZpbmQgbG93ZXN0IGNvbW1vbiBhbGlnbm1lbnRfb2Zmc2V0ICovCiAJdC0+YWxpZ25tZW50X29mZnNldCA9IGxjbSh0LT5hbGlnbm1lbnRfb2Zmc2V0LCBhbGlnbm1lbnQpCiAJCSYgKG1heCh0LT5waHlzaWNhbF9ibG9ja19zaXplLCB0LT5pb19taW4pIC0gMSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstc3lzZnMuYyBiL2Jsb2NrL2Jsay1zeXNmcy5jCmluZGV4IDk3Nzc5NTIuLjgwOTVjNGEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1zeXNmcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlICJibGsuaCIKICNpbmNsdWRlICJibGstY2dyb3VwLmgiCisjaW5jbHVkZSAiYmxrLW1xLmgiCiAKIHN0cnVjdCBxdWV1ZV9zeXNmc19lbnRyeSB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRocm90dGxlLmMgYi9ibG9jay9ibGstdGhyb3R0bGUuYwppbmRleCBhNzYwODU3Li4xNDc0YzNhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGhyb3R0bGUuYworKysgYi9ibG9jay9ibGstdGhyb3R0bGUuYwpAQCAtODc3LDE0ICs4NzcsMTQgQEAKIAlkb19kaXYodG1wLCBIWik7CiAJYnl0ZXNfYWxsb3dlZCA9IHRtcDsKIAotCWlmICh0Zy0+Ynl0ZXNfZGlzcFtyd10gKyBiaW8tPmJpX3NpemUgPD0gYnl0ZXNfYWxsb3dlZCkgeworCWlmICh0Zy0+Ynl0ZXNfZGlzcFtyd10gKyBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA8PSBieXRlc19hbGxvd2VkKSB7CiAJCWlmICh3YWl0KQogCQkJKndhaXQgPSAwOwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBDYWxjIGFwcHJveCB0aW1lIHRvIGRpc3BhdGNoICovCi0JZXh0cmFfYnl0ZXMgPSB0Zy0+Ynl0ZXNfZGlzcFtyd10gKyBiaW8tPmJpX3NpemUgLSBieXRlc19hbGxvd2VkOworCWV4dHJhX2J5dGVzID0gdGctPmJ5dGVzX2Rpc3BbcnddICsgYmlvLT5iaV9pdGVyLmJpX3NpemUgLSBieXRlc19hbGxvd2VkOwogCWppZmZ5X3dhaXQgPSBkaXY2NF91NjQoZXh0cmFfYnl0ZXMgKiBIWiwgdGctPmJwc1tyd10pOwogCiAJaWYgKCFqaWZmeV93YWl0KQpAQCAtOTg3LDcgKzk4Nyw3IEBACiAJYm9vbCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCiAJLyogQ2hhcmdlIHRoZSBiaW8gdG8gdGhlIGdyb3VwICovCi0JdGctPmJ5dGVzX2Rpc3BbcnddICs9IGJpby0+Ymlfc2l6ZTsKKwl0Zy0+Ynl0ZXNfZGlzcFtyd10gKz0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJdGctPmlvX2Rpc3BbcnddKys7CiAKIAkvKgpAQCAtMTAwMyw4ICsxMDAzLDggQEAKIAkgKi8KIAlpZiAoIShiaW8tPmJpX3J3ICYgUkVRX1RIUk9UVExFRCkpIHsKIAkJYmlvLT5iaV9ydyB8PSBSRVFfVEhST1RUTEVEOwotCQl0aHJvdGxfdXBkYXRlX2Rpc3BhdGNoX3N0YXRzKHRnX3RvX2Jsa2codGcpLCBiaW8tPmJpX3NpemUsCi0JCQkJCSAgICAgYmlvLT5iaV9ydyk7CisJCXRocm90bF91cGRhdGVfZGlzcGF0Y2hfc3RhdHModGdfdG9fYmxrZyh0ZyksCisJCQkJCSAgICAgYmlvLT5iaV9pdGVyLmJpX3NpemUsIGJpby0+YmlfcncpOwogCX0KIH0KIApAQCAtMTUwMyw3ICsxNTAzLDcgQEAKIAlpZiAodGcpIHsKIAkJaWYgKCF0Zy0+aGFzX3J1bGVzW3J3XSkgewogCQkJdGhyb3RsX3VwZGF0ZV9kaXNwYXRjaF9zdGF0cyh0Z190b19ibGtnKHRnKSwKLQkJCQkJCSAgICAgYmlvLT5iaV9zaXplLCBiaW8tPmJpX3J3KTsKKwkJCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUsIGJpby0+YmlfcncpOwogCQkJZ290byBvdXRfdW5sb2NrX3JjdTsKIAkJfQogCX0KQEAgLTE1NTksNyArMTU1OSw3IEBACiAJLyogb3V0LW9mLWxpbWl0LCBxdWV1ZSB0byBAdGcgKi8KIAl0aHJvdGxfbG9nKHNxLCAiWyVjXSBiaW8uIGJkaXNwPSVsbHUgc3o9JXUgYnBzPSVsbHUgaW9kaXNwPSV1IGlvcHM9JXUgcXVldWVkPSVkLyVkIiwKIAkJICAgcncgPT0gUkVBRCA/ICdSJyA6ICdXJywKLQkJICAgdGctPmJ5dGVzX2Rpc3BbcnddLCBiaW8tPmJpX3NpemUsIHRnLT5icHNbcnddLAorCQkgICB0Zy0+Ynl0ZXNfZGlzcFtyd10sIGJpby0+YmlfaXRlci5iaV9zaXplLCB0Zy0+YnBzW3J3XSwKIAkJICAgdGctPmlvX2Rpc3BbcnddLCB0Zy0+aW9wc1tyd10sCiAJCSAgIHNxLT5ucl9xdWV1ZWRbUkVBRF0sIHNxLT5ucl9xdWV1ZWRbV1JJVEVdKTsKIApkaWZmIC0tZ2l0IGEvYmxvY2svY21kbGluZS1wYXJzZXIuYyBiL2Jsb2NrL2NtZGxpbmUtcGFyc2VyLmMKaW5kZXggY2MyNjM3Zi4uOWRiYzY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svY21kbGluZS1wYXJzZXIuYworKysgYi9ibG9jay9jbWRsaW5lLXBhcnNlci5jCkBAIC00LDggKzQsNyBAQAogICogV3JpdHRlbiBieSBDYWkgWmhpeW9uZyA8Y2FpemhpeW9uZ0BodWF3ZWkuY29tPgogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY21kbGluZS1wYXJzZXIuaD4KIAogc3RhdGljIGludCBwYXJzZV9zdWJwYXJ0KHN0cnVjdCBjbWRsaW5lX3N1YnBhcnQgKipzdWJwYXJ0LCBjaGFyICpwYXJ0ZGVmKQpAQCAtMTU5LDYgKzE1OCw3IEBACiAJCSpwYXJ0cyA9IG5leHRfcGFydHM7CiAJfQogfQorRVhQT1JUX1NZTUJPTChjbWRsaW5lX3BhcnRzX2ZyZWUpOwogCiBpbnQgY21kbGluZV9wYXJ0c19wYXJzZShzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqKnBhcnRzLCBjb25zdCBjaGFyICpjbWRsaW5lKQogewpAQCAtMjA2LDYgKzIwNiw3IEBACiAJY21kbGluZV9wYXJ0c19mcmVlKHBhcnRzKTsKIAlnb3RvIGRvbmU7CiB9CitFWFBPUlRfU1lNQk9MKGNtZGxpbmVfcGFydHNfcGFyc2UpOwogCiBzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqY21kbGluZV9wYXJ0c19maW5kKHN0cnVjdCBjbWRsaW5lX3BhcnRzICpwYXJ0cywKIAkJCQkJIGNvbnN0IGNoYXIgKmJkZXYpCkBAIC0yMTQsMTcgKzIxNSwxNyBAQAogCQlwYXJ0cyA9IHBhcnRzLT5uZXh0X3BhcnRzOwogCXJldHVybiBwYXJ0czsKIH0KK0VYUE9SVF9TWU1CT0woY21kbGluZV9wYXJ0c19maW5kKTsKIAogLyoKICAqICBhZGRfcGFydCgpCiAgKiAgICAwIHN1Y2Nlc3MuCiAgKiAgICAxIGNhbiBub3QgYWRkIHNvIG1hbnkgcGFydGl0aW9ucy4KICAqLwotdm9pZCBjbWRsaW5lX3BhcnRzX3NldChzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqcGFydHMsIHNlY3Rvcl90IGRpc2tfc2l6ZSwKLQkJICAgICAgIGludCBzbG90LAotCQkgICAgICAgaW50ICgqYWRkX3BhcnQpKGludCwgc3RydWN0IGNtZGxpbmVfc3VicGFydCAqLCB2b2lkICopLAotCQkgICAgICAgdm9pZCAqcGFyYW0pCi0KK2ludCBjbWRsaW5lX3BhcnRzX3NldChzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqcGFydHMsIHNlY3Rvcl90IGRpc2tfc2l6ZSwKKwkJICAgICAgaW50IHNsb3QsCisJCSAgICAgIGludCAoKmFkZF9wYXJ0KShpbnQsIHN0cnVjdCBjbWRsaW5lX3N1YnBhcnQgKiwgdm9pZCAqKSwKKwkJICAgICAgdm9pZCAqcGFyYW0pCiB7CiAJc2VjdG9yX3QgZnJvbSA9IDA7CiAJc3RydWN0IGNtZGxpbmVfc3VicGFydCAqc3VicGFydDsKQEAgLTI0Nyw0ICsyNDgsNyBAQAogCQlpZiAoYWRkX3BhcnQoc2xvdCwgc3VicGFydCwgcGFyYW0pKQogCQkJYnJlYWs7CiAJfQorCisJcmV0dXJuIHNsb3Q7CiB9CitFWFBPUlRfU1lNQk9MKGNtZGxpbmVfcGFydHNfc2V0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IGI3ZmYyODYuLjQyYzQ1YTcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAJLyoKIAkgKiBTZWUgaWYgb3VyIGhhc2ggbG9va3VwIGNhbiBmaW5kIGEgcG90ZW50aWFsIGJhY2ttZXJnZS4KIAkgKi8KLQlfX3JxID0gZWx2X3JxaGFzaF9maW5kKHEsIGJpby0+Ymlfc2VjdG9yKTsKKwlfX3JxID0gZWx2X3JxaGFzaF9maW5kKHEsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCWlmIChfX3JxICYmIGVsdl9ycV9tZXJnZV9vayhfX3JxLCBiaW8pKSB7CiAJCSpyZXEgPSBfX3JxOwogCQlyZXR1cm4gRUxFVkFUT1JfQkFDS19NRVJHRTsKZGlmZiAtLWdpdCBhL2Jsb2NrL3Njc2lfaW9jdGwuYyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwppbmRleCA2MjVlM2U0Li4yNjQ4Nzk3IDEwMDY0NAotLS0gYS9ibG9jay9zY3NpX2lvY3RsLmMKKysrIGIvYmxvY2svc2NzaV9pb2N0bC5jCkBAIC0zMjMsMTIgKzMyMywxNCBAQAogCiAJaWYgKGhkci0+aW92ZWNfY291bnQpIHsKIAkJc2l6ZV90IGlvdl9kYXRhX2xlbjsKLQkJc3RydWN0IGlvdmVjICppb3Y7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gTlVMTDsKIAogCQlyZXQgPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IoLTEsIGhkci0+ZHhmZXJwLCBoZHItPmlvdmVjX2NvdW50LAogCQkJCQkgICAgMCwgTlVMTCwgJmlvdik7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUoaW92KTsKIAkJCWdvdG8gb3V0OworCQl9CiAKIAkJaW92X2RhdGFfbGVuID0gcmV0OwogCQlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfcHJvY2Vzc29yLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYwppbmRleCBjOTMxMWJlLi5jMjljMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAKIAlhcGljX2lkID0gYWNwaV9nZXRfYXBpY2lkKHByLT5oYW5kbGUsIGRldmljZV9kZWNsYXJhdGlvbiwgcHItPmFjcGlfaWQpOwogCWlmIChhcGljX2lkIDwgMCkgewotCQlhY3BpX2hhbmRsZV9lcnIocHItPmhhbmRsZSwgImZhaWxlZCB0byBnZXQgQ1BVIEFQSUMgSUQuXG4iKTsKKwkJYWNwaV9oYW5kbGVfZGVidWcocHItPmhhbmRsZSwgImZhaWxlZCB0byBnZXQgQ1BVIEFQSUMgSUQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXByLT5hcGljX2lkID0gYXBpY19pZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaAppbmRleCAyNGRiOGUxLi40ZWQxYWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCkBAIC0xMDgsNyArMTA4LDcgQEAKIC8qCiAgKiBPcHRpb25hbGx5IGVuYWJsZSBvdXRwdXQgZnJvbSB0aGUgQU1MIERlYnVnIE9iamVjdC4KICAqLwotYm9vbCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0LCBGQUxTRSk7Cit1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0LCBGQUxTRSk7CiAKIC8qCiAgKiBPcHRpb25hbGx5IGNvcHkgdGhlIGVudGlyZSBEU0RUIHRvIGxvY2FsIG1lbW9yeSAoaW5zdGVhZCBvZiBzaW1wbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IDQ3MGU3NTQuLjAxOGE0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB4OwogCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSB0b19hY3BpX2JhdHRlcnkoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCWlmIChzc2NhbmYoYnVmLCAiJWxkXG4iLCAmeCkgPT0gMSkKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVsdVxuIiwgJngpID09IDEpCiAJCWJhdHRlcnktPmFsYXJtID0geC8xMDAwOwogCWlmIChhY3BpX2JhdHRlcnlfcHJlc2VudChiYXR0ZXJ5KSkKIAkJYWNwaV9iYXR0ZXJ5X3NldF9hbGFybShiYXR0ZXJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXMuYyBiL2RyaXZlcnMvYWNwaS9idXMuYwppbmRleCAzODRkYTVhLi5mY2I1OWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1cy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpZmRlZiBDT05GSUdfWDg2CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2VuZGlmCkBAIC01MDksNiArNTEwLDE0IEBACiAJCWdvdG8gZXJyb3IwOwogCX0KIAorCS8qCisJICogSWYgdGhlIHN5c3RlbSBpcyB1c2luZyBBQ1BJIHRoZW4gd2UgY2FuIGJlIHJlYXNvbmFibHkKKwkgKiBjb25maWRlbnQgdGhhdCBhbnkgcmVndWxhdG9ycyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUKKwkgKiBzbyB0ZWxsIHRoZSByZWd1bGF0b3IgY29yZSBpdCBoYXMgZXZlcnl0aGluZyBpdCBuZWVkcyB0bworCSAqIGtub3cuCisJICovCisJcmVndWxhdG9yX2hhc19mdWxsX2NvbnN0cmFpbnRzKCk7CisKIAlyZXR1cm47CiAKICAgICAgIGVycm9yMDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kZXZpY2VfcG0uYyBiL2RyaXZlcnMvYWNwaS9kZXZpY2VfcG0uYwppbmRleCBkNDlmMWU0Li5jMTRhMDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGV2aWNlX3BtLmMKKysrIGIvZHJpdmVycy9hY3BpL2RldmljZV9wbS5jCkBAIC03MjcsMTggKzcyNyw2IEBACiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKIC8qKgotICogYWNwaV9kZXZfcG1fZ2V0X25vZGUgLSBHZXQgQUNQSSBkZXZpY2Ugbm9kZSBmb3IgdGhlIGdpdmVuIHBoeXNpY2FsIGRldmljZS4KLSAqIEBkZXY6IERldmljZSB0byBnZXQgdGhlIEFDUEkgbm9kZSBmb3IuCi0gKi8KLXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXZfcG1fZ2V0X25vZGUoc3RydWN0IGRldmljZSAqZGV2KQotewotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IEFDUElfSEFORExFKGRldik7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwotCi0JcmV0dXJuIGhhbmRsZSAmJiAhYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhZGV2KSA/IGFkZXYgOiBOVUxMOwotfQotCi0vKioKICAqIGFjcGlfZGV2X3BtX2xvd19wb3dlciAtIFB1dCBBQ1BJIGRldmljZSBpbnRvIGEgbG93LXBvd2VyIHN0YXRlLgogICogQGRldjogRGV2aWNlIHRvIHB1dCBpbnRvIGEgbG93LXBvd2VyIHN0YXRlLgogICogQGFkZXY6IEFDUEkgZGV2aWNlIG5vZGUgY29ycmVzcG9uZGluZyB0byBAZGV2LgpAQCAtNzc4LDcgKzc2Niw3IEBACiAgKi8KIGludCBhY3BpX2Rldl9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFjcGlfZGV2X3BtX2dldF9ub2RlKGRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKIAlib29sIHJlbW90ZV93YWtldXA7CiAJaW50IGVycm9yOwogCkBAIC04MDksNyArNzk3LDcgQEAKICAqLwogaW50IGFjcGlfZGV2X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBhY3BpX2Rldl9wbV9nZXRfbm9kZShkZXYpOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7CiAJaW50IGVycm9yOwogCiAJaWYgKCFhZGV2KQpAQCAtODYyLDcgKzg1MCw3IEBACiAgKi8KIGludCBhY3BpX2Rldl9zdXNwZW5kX2xhdGUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFjcGlfZGV2X3BtX2dldF9ub2RlKGRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKIAl1MzIgdGFyZ2V0X3N0YXRlOwogCWJvb2wgd2FrZXVwOwogCWludCBlcnJvcjsKQEAgLTg5NCw3ICs4ODIsNyBAQAogICovCiBpbnQgYWNwaV9kZXZfcmVzdW1lX2Vhcmx5KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBhY3BpX2Rldl9wbV9nZXRfbm9kZShkZXYpOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7CiAJaW50IGVycm9yOwogCiAJaWYgKCFhZGV2KQpAQCAtOTg1LDcgKzk3Myw3IEBACiAgKi8KIGludCBhY3BpX2Rldl9wbV9hdHRhY2goc3RydWN0IGRldmljZSAqZGV2LCBib29sIHBvd2VyX29uKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFjcGlfZGV2X3BtX2dldF9ub2RlKGRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKIAogCWlmICghYWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMDE3LDcgKzEwMDUsNyBAQAogICovCiB2b2lkIGFjcGlfZGV2X3BtX2RldGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcG93ZXJfb2ZmKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFjcGlfZGV2X3BtX2dldF9ub2RlKGRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKIAogCWlmIChhZGV2ICYmIGRldi0+cG1fZG9tYWluID09ICZhY3BpX2dlbmVyYWxfcG1fZG9tYWluKSB7CiAJCWRldi0+cG1fZG9tYWluID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCmluZGV4IDUwZmUzNGYuLjc1YzI4ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2MuYwpAQCAtNjAsNyArNjAsNyBAQAogCQkJCXNlcV9wcmludGYoc2VxLCAiJWMlLThzICAlczolc1xuIiwKIAkJCQkJZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgPyAnKicgOiAnICcsCiAJCQkJCShkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpIHx8Ci0JCQkJCShsZGV2ICYmIGRldmljZV9tYXlfd2FrZXVwKGxkZXYpKSkgPworCQkJCQlkZXZpY2VfbWF5X3dha2V1cChsZGV2KSkgPwogCQkJCQkiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAogCQkJCQlsZGV2LT5idXMgPyBsZGV2LT5idXMtPm5hbWUgOgogCQkJCQkibm8tYnVzIiwgZGV2X25hbWUobGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCAzNGU3YjNjLi5hNGVlYTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNDQsMTMgKzQ0LDEzIEBACiAJCShzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKillbnRyeTsKIAogCWlmICghKGxhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGxhcGljLT5wcm9jZXNzb3JfaWQgIT0gYWNwaV9pZCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJKmFwaWNfaWQgPSBsYXBpYy0+aWQ7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbWFwX3gyYXBpY19pZChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5LApAQCAtNjAsMTQgKzYwLDE0IEBACiAJCShzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3gyYXBpYyAqKWVudHJ5OwogCiAJaWYgKCEoYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24gJiYgKGFwaWMtPnVpZCA9PSBhY3BpX2lkKSkgewogCQkqYXBpY19pZCA9IGFwaWMtPmxvY2FsX2FwaWNfaWQ7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBtYXBfbHNhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCkBAIC03NywxNiArNzcsMTYgQEAKIAkJKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgKillbnRyeTsKIAogCWlmICghKGxzYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24pIHsKIAkJaWYgKChlbnRyeS0+bGVuZ3RoIDwgMTYpIHx8IChsc2FwaWMtPnVpZCAhPSBhY3BpX2lkKSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIGlmIChsc2FwaWMtPnByb2Nlc3Nvcl9pZCAhPSBhY3BpX2lkKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqYXBpY19pZCA9IChsc2FwaWMtPmlkIDw8IDgpIHwgbHNhcGljLT5laWQ7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbWFwX21hZHRfZW50cnkoaW50IHR5cGUsIHUzMiBhY3BpX2lkKQpAQCAtMTE2LDEzICsxMTYsMTMgQEAKIAkJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIgPQogCQkJKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKWVudHJ5OwogCQlpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMpIHsKLQkJCWlmIChtYXBfbGFwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmYXBpY19pZCkpCisJCQlpZiAoIW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZhcGljX2lkKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfTE9DQUxfWDJBUElDKSB7Ci0JCQlpZiAobWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZhcGljX2lkKSkKKwkJCWlmICghbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZhcGljX2lkKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfTE9DQUxfU0FQSUMpIHsKLQkJCWlmIChtYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJmFwaWNfaWQpKQorCQkJaWYgKCFtYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJmFwaWNfaWQpKQogCQkJCWJyZWFrOwogCQl9CiAJCWVudHJ5ICs9IGhlYWRlci0+bGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggZTAwMzY1Yy4uNTdiMDUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC00ODQsNyArNDg0LDYgQEAKIHN0YXRpYyB2b2lkIGFjcGlfaG90cGx1Z19ub3RpZnlfY2IoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqZGF0YSkKIHsKIAl1MzIgb3N0X2NvZGUgPSBBQ1BJX09TVF9TQ19OT05fU1BFQ0lGSUNfRkFJTFVSRTsKLQlzdHJ1Y3QgYWNwaV9zY2FuX2hhbmRsZXIgKmhhbmRsZXIgPSBkYXRhOwogCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKQEAgLTUwMCw3ICs0OTksMTAgQEAKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgogCQlhY3BpX2hhbmRsZV9kZWJ1ZyhoYW5kbGUsICJBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUIGV2ZW50XG4iKTsKLQkJaWYgKCFoYW5kbGVyLT5ob3RwbHVnLmVuYWJsZWQpIHsKKwkJaWYgKCFhZGV2LT5oYW5kbGVyKQorCQkJZ290byBlcnJfb3V0OworCisJCWlmICghYWRldi0+aGFuZGxlci0+aG90cGx1Zy5lbmFibGVkKSB7CiAJCQlhY3BpX2hhbmRsZV9lcnIoaGFuZGxlLCAiRWplY3QgZGlzYWJsZWRcbiIpOwogCQkJb3N0X2NvZGUgPSBBQ1BJX09TVF9TQ19FSkVDVF9OT1RfU1VQUE9SVEVEOwogCQkJZ290byBlcnJfb3V0OwpAQCAtMjEwNSw2ICsyMTA3LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY2hpbGQsICZhZGV2LT5jaGlsZHJlbiwgbm9kZSkKIAkJYWNwaV9idXNfdHJpbShjaGlsZCk7CiAKKwlhZGV2LT5mbGFncy5tYXRjaF9kcml2ZXIgPSBmYWxzZTsKIAlpZiAoaGFuZGxlcikgewogCQlpZiAoaGFuZGxlci0+ZGV0YWNoKQogCQkJaGFuZGxlci0+ZGV0YWNoKGFkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCA0NDNkYzkzLi45MWEzMmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAvKiAvc3lzL21vZHVsZXMvYWNwaS9wYXJhbWV0ZXJzL2FtbF9kZWJ1Z19vdXRwdXQgKi8KIAogbW9kdWxlX3BhcmFtX25hbWVkKGFtbF9kZWJ1Z19vdXRwdXQsIGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0LAotCQkgICBib29sLCAwNjQ0KTsKKwkJICAgYnl0ZSwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFtbF9kZWJ1Z19vdXRwdXQsCiAJCSAiVG8gZW5hYmxlL2Rpc2FibGUgdGhlIEFDUEkgRGVidWcgT2JqZWN0IG91dHB1dC4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwppbmRleCAwMzQ3YTM3Li44NWUzYjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwpAQCAtOTksMTAgKzk5LDYgQEAKIAogCQl1bmlvbiBhY3BpX29iamVjdCAqZWxlbWVudCA9ICYocGFja2FnZS0+cGFja2FnZS5lbGVtZW50c1tpXSk7CiAKLQkJaWYgKCFlbGVtZW50KSB7Ci0JCQlyZXR1cm4gQUVfQkFEX0RBVEE7Ci0JCX0KLQogCQlzd2l0Y2ggKGVsZW1lbnQtPnR5cGUpIHsKIAogCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCmluZGV4IGYwNDQ3ZDMuLmE2OTdiNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKQEAgLTE3MCw2ICsxNzAsMTQgQEAKIAl9LAogCXsKIAkuY2FsbGJhY2sgPSB2aWRlb19kZXRlY3RfZm9yY2VfdmVuZG9yLAorCS5pZGVudCA9ICJIUCBFbGl0ZUJvb2sgUmV2b2x2ZSA4MTAiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBFbGl0ZUJvb2sgUmV2b2x2ZSA4MTAgRzEiKSwKKwkJfSwKKwl9LAorCXsKKwkuY2FsbGJhY2sgPSB2aWRlb19kZXRlY3RfZm9yY2VfdmVuZG9yLAogCS5pZGVudCA9ICJMZW5vdm8gWW9nYSAxMyIsCiAJLm1hdGNoZXMgPSB7CiAJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL0tjb25maWcgYi9kcml2ZXJzL2JjbWEvS2NvbmZpZwppbmRleCA3YzA4MWIzLi4wZWU0OGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2JjbWEvS2NvbmZpZwpAQCAtNzUsNiArNzUsNyBAQAogY29uZmlnIEJDTUFfRFJJVkVSX0dQSU8KIAlib29sICJCQ01BIEdQSU8gZHJpdmVyIgogCWRlcGVuZHMgb24gQkNNQSAmJiBHUElPTElCCisJc2VsZWN0IElSUV9ET01BSU4gaWYgQkNNQV9IT1NUX1NPQwogCWhlbHAKIAkgIERyaXZlciB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9mIHRoZSBiY21hIGJ1cy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9ncGlvLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYwppbmRleCA0NWYwOTk2Li4yNWY5ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYworKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYwpAQCAtOSw2ICs5LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogCkBAIC03MywxOSArNzYsMTM2IEBACiAJYmNtYV9jaGlwY29fZ3Bpb19wdWxsdXAoY2MsIDEgPDwgZ3BpbywgMCk7CiB9CiAKKyNpZiBJU19CVUlMVElOKENPTkZJR19CQ01BX0hPU1RfU09DKQogc3RhdGljIGludCBiY21hX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCiB7CiAJc3RydWN0IGJjbWFfZHJ2X2NjICpjYyA9IGJjbWFfZ3Bpb19nZXRfY2MoY2hpcCk7CiAKIAlpZiAoY2MtPmNvcmUtPmJ1cy0+aG9zdHR5cGUgPT0gQkNNQV9IT1NUVFlQRV9TT0MpCi0JCXJldHVybiBiY21hX2NvcmVfaXJxKGNjLT5jb3JlKTsKKwkJcmV0dXJuIGlycV9maW5kX21hcHBpbmcoY2MtPmlycV9kb21haW4sIGdwaW8pOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyB2b2lkIGJjbWFfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOworCXUzMiB2YWwgPSBiY21hX2NoaXBjb19ncGlvX2luKGNjLCBCSVQoZ3BpbykpOworCisJYmNtYV9jaGlwY29fZ3Bpb19wb2xhcml0eShjYywgQklUKGdwaW8pLCB2YWwpOworCWJjbWFfY2hpcGNvX2dwaW9faW50bWFzayhjYywgQklUKGdwaW8pLCBCSVQoZ3BpbykpOworfQorCitzdGF0aWMgdm9pZCBiY21hX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBiY21hX2Rydl9jYyAqY2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlpbnQgZ3BpbyA9IGlycWRfdG9faHdpcnEoZCk7CisKKwliY21hX2NoaXBjb19ncGlvX2ludG1hc2soY2MsIEJJVChncGlvKSwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmNtYV9ncGlvX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJCQ01BLUdQSU8iLAorCS5pcnFfbWFzawk9IGJjbWFfZ3Bpb19pcnFfbWFzaywKKwkuaXJxX3VubWFzawk9IGJjbWFfZ3Bpb19pcnFfdW5tYXNrLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGJjbWFfZ3Bpb19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJjbWFfZHJ2X2NjICpjYyA9IGRldl9pZDsKKwl1MzIgdmFsID0gYmNtYV9jY19yZWFkMzIoY2MsIEJDTUFfQ0NfR1BJT0lOKTsKKwl1MzIgbWFzayA9IGJjbWFfY2NfcmVhZDMyKGNjLCBCQ01BX0NDX0dQSU9JUlEpOworCXUzMiBwb2wgPSBiY21hX2NjX3JlYWQzMihjYywgQkNNQV9DQ19HUElPUE9MKTsKKwl1bnNpZ25lZCBsb25nIGlycXMgPSAodmFsIF4gcG9sKSAmIG1hc2s7CisJaW50IGdwaW87CisKKwlpZiAoIWlycXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZvcl9lYWNoX3NldF9iaXQoZ3BpbywgJmlycXMsIGNjLT5ncGlvLm5ncGlvKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoYmNtYV9ncGlvX3RvX2lycSgmY2MtPmdwaW8sIGdwaW8pKTsKKwliY21hX2NoaXBjb19ncGlvX3BvbGFyaXR5KGNjLCBpcnFzLCB2YWwgJiBpcnFzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBiY21hX2dwaW9faXJxX2RvbWFpbl9pbml0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9ICZjYy0+Z3BpbzsKKwlpbnQgZ3BpbywgaHdpcnEsIGVycjsKKworCWlmIChjYy0+Y29yZS0+YnVzLT5ob3N0dHlwZSAhPSBCQ01BX0hPU1RUWVBFX1NPQykKKwkJcmV0dXJuIDA7CisKKwljYy0+aXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihOVUxMLCBjaGlwLT5uZ3BpbywKKwkJCQkJICAgICAgICZpcnFfZG9tYWluX3NpbXBsZV9vcHMsIGNjKTsKKwlpZiAoIWNjLT5pcnFfZG9tYWluKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2lycV9kb21haW47CisJfQorCWZvciAoZ3BpbyA9IDA7IGdwaW8gPCBjaGlwLT5uZ3BpbzsgZ3BpbysrKSB7CisJCWludCBpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoY2MtPmlycV9kb21haW4sIGdwaW8pOworCisJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgY2MpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmYmNtYV9ncGlvX2lycV9jaGlwLAorCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCX0KKworCWh3aXJxID0gYmNtYV9jb3JlX2lycShjYy0+Y29yZSk7CisJZXJyID0gcmVxdWVzdF9pcnEoaHdpcnEsIGJjbWFfZ3Bpb19pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsICJncGlvIiwKKwkJCSAgY2MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcV9pcnE7CisKKwliY21hX2NoaXBjb19ncGlvX2ludG1hc2soY2MsIH4wLCAwKTsKKwliY21hX2NjX3NldDMyKGNjLCBCQ01BX0NDX0lSUU1BU0ssIEJDTUFfQ0NfSVJRX0dQSU8pOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXFfaXJxOgorCWZvciAoZ3BpbyA9IDA7IGdwaW8gPCBjaGlwLT5uZ3BpbzsgZ3BpbysrKSB7CisJCWludCBpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGNjLT5pcnFfZG9tYWluLCBncGlvKTsKKworCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycSk7CisJfQorCWlycV9kb21haW5fcmVtb3ZlKGNjLT5pcnFfZG9tYWluKTsKK2Vycl9pcnFfZG9tYWluOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWFfZ3Bpb19pcnFfZG9tYWluX2V4aXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYykKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmNjLT5ncGlvOworCWludCBncGlvOworCisJaWYgKGNjLT5jb3JlLT5idXMtPmhvc3R0eXBlICE9IEJDTUFfSE9TVFRZUEVfU09DKQorCQlyZXR1cm47CisKKwliY21hX2NjX21hc2szMihjYywgQkNNQV9DQ19JUlFNQVNLLCB+QkNNQV9DQ19JUlFfR1BJTyk7CisJZnJlZV9pcnEoYmNtYV9jb3JlX2lycShjYy0+Y29yZSksIGNjKTsKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhjYy0+aXJxX2RvbWFpbiwgZ3Bpbyk7CisKKwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpcnEpOworCX0KKwlpcnFfZG9tYWluX3JlbW92ZShjYy0+aXJxX2RvbWFpbik7Cit9CisjZWxzZQorc3RhdGljIGludCBiY21hX2dwaW9faXJxX2RvbWFpbl9pbml0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWFfZ3Bpb19pcnFfZG9tYWluX2V4aXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYykKK3sKK30KKyNlbmRpZgorCiBpbnQgYmNtYV9ncGlvX2luaXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYykKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmNjLT5ncGlvOworCWludCBlcnI7CiAKIAljaGlwLT5sYWJlbAkJPSAiYmNtYV9ncGlvIjsKIAljaGlwLT5vd25lcgkJPSBUSElTX01PRFVMRTsKQEAgLTk1LDcgKzIxNSw5IEBACiAJY2hpcC0+c2V0CQk9IGJjbWFfZ3Bpb19zZXRfdmFsdWU7CiAJY2hpcC0+ZGlyZWN0aW9uX2lucHV0CT0gYmNtYV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKIAljaGlwLT5kaXJlY3Rpb25fb3V0cHV0CT0gYmNtYV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisjaWYgSVNfQlVJTFRJTihDT05GSUdfQkNNQV9IT1NUX1NPQykKIAljaGlwLT50b19pcnEJCT0gYmNtYV9ncGlvX3RvX2lycTsKKyNlbmRpZgogCWNoaXAtPm5ncGlvCQk9IDE2OwogCS8qIFRoZXJlIGlzIGp1c3Qgb25lIFNvQyBpbiBvbmUgZGV2aWNlIGFuZCBpdHMgR1BJTyBhZGRyZXNzZXMgc2hvdWxkIGJlCiAJICogZGV0ZXJtaW5pc3RpYyB0byBhZGRyZXNzIHRoZW0gbW9yZSBlYXNpbHkuIFRoZSBvdGhlciBidXNlcyBjb3VsZCBnZXQKQEAgLTEwNSwxMCArMjI3LDIxIEBACiAJZWxzZQogCQljaGlwLT5iYXNlCQk9IC0xOwogCi0JcmV0dXJuIGdwaW9jaGlwX2FkZChjaGlwKTsKKwllcnIgPSBiY21hX2dwaW9faXJxX2RvbWFpbl9pbml0KGNjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZ3Bpb2NoaXBfYWRkKGNoaXApOworCWlmIChlcnIpIHsKKwkJYmNtYV9ncGlvX2lycV9kb21haW5fZXhpdChjYyk7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIGludCBiY21hX2dwaW9fdW5yZWdpc3RlcihzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKQogeworCWJjbWFfZ3Bpb19pcnFfZG9tYWluX2V4aXQoY2MpOwogCXJldHVybiBncGlvY2hpcF9yZW1vdmUoJmNjLT5ncGlvKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwppbmRleCA5ZmZhOTBjLi4wMTRhMWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcKKysrIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCkBAIC0xMDgsNiArMTA4LDggQEAKIAogc291cmNlICJkcml2ZXJzL2Jsb2NrL210aXAzMnh4L0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9ibG9jay96cmFtL0tjb25maWciCisKIGNvbmZpZyBCTEtfQ1BRX0RBCiAJdHJpc3RhdGUgIkNvbXBhcSBTTUFSVDIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUyAmJiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQppbmRleCA4MTZkOTc5Li4wMmI2ODhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKQEAgLTQyLDYgKzQyLDcgQEAKIAogb2JqLSQoQ09ORklHX0JMS19ERVZfUlNYWCkgKz0gcnN4eC8KIG9iai0kKENPTkZJR19CTEtfREVWX05VTExfQkxLKQkrPSBudWxsX2Jsay5vCitvYmotJChDT05GSUdfWlJBTSkgKz0genJhbS8KIAogbnZtZS15CQk6PSBudm1lLWNvcmUubyBudm1lLXNjc2kubwogc2tkLXkJCTo9IHNrZF9tYWluLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKaW5kZXggMTRhOWQxOS4uOTIyMGY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKQEAgLTEwMCwxMSArMTAwLDggQEAKIAogc3RydWN0IGJ1ZiB7CiAJdWxvbmcgbmZyYW1lc291dDsKLQl1bG9uZyByZXNpZDsKLQl1bG9uZyBidl9yZXNpZDsKLQlzZWN0b3JfdCBzZWN0b3I7CiAJc3RydWN0IGJpbyAqYmlvOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogfTsKIApAQCAtMTIwLDEzICsxMTcsMTAgQEAKIAl1bG9uZyB3YWl0ZWQ7CiAJdWxvbmcgd2FpdGVkX3RvdGFsOwogCXN0cnVjdCBhb2V0Z3QgKnQ7CQkvKiBwYXJlbnQgdGFyZ2V0IEkgYmVsb25nIHRvICovCi0Jc2VjdG9yX3QgbGJhOwogCXN0cnVjdCBza19idWZmICpza2I7CQkvKiBjb21tYW5kIHNrYiBmcmVlZCBvbiBtb2R1bGUgZXhpdCAqLwogCXN0cnVjdCBza19idWZmICpyX3NrYjsJCS8qIHJlc3BvbnNlIHNrYiBmb3IgYXN5bmMgcHJvY2Vzc2luZyAqLwogCXN0cnVjdCBidWYgKmJ1ZjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JdWxvbmcgYmNudDsKLQl1bG9uZyBidl9vZmY7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCWNoYXIgZmxhZ3M7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCmluZGV4IGQyNTE1NDMuLjgxODQ0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCkBAIC0xOTYsOCArMTk2LDcgQEAKIAogCXQgPSBmLT50OwogCWYtPmJ1ZiA9IE5VTEw7Ci0JZi0+bGJhID0gMDsKLQlmLT5idiA9IE5VTEw7CisJbWVtc2V0KCZmLT5pdGVyLCAwLCBzaXplb2YoZi0+aXRlcikpOwogCWYtPnJfc2tiID0gTlVMTDsKIAlmLT5mbGFncyA9IDA7CiAJbGlzdF9hZGQoJmYtPmhlYWQsICZ0LT5mZnJlZSk7CkBAIC0yOTUsMjEgKzI5NCwxNCBAQAogfQogCiBzdGF0aWMgdm9pZAotc2tiX2ZpbGx1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmlvX3ZlYyAqYnYsIHVsb25nIG9mZiwgdWxvbmcgY250KQorc2tiX2ZpbGx1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBidmVjX2l0ZXIgaXRlcikKIHsKIAlpbnQgZnJhZyA9IDA7Ci0JdWxvbmcgZmNudDsKLWxvb3A6Ci0JZmNudCA9IGJ2LT5idl9sZW4gLSAob2ZmIC0gYnYtPmJ2X29mZnNldCk7Ci0JaWYgKGZjbnQgPiBjbnQpCi0JCWZjbnQgPSBjbnQ7Ci0Jc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgZnJhZysrLCBidi0+YnZfcGFnZSwgb2ZmLCBmY250KTsKLQljbnQgLT0gZmNudDsKLQlpZiAoY250IDw9IDApCi0JCXJldHVybjsKLQlidisrOwotCW9mZiA9IGJ2LT5idl9vZmZzZXQ7Ci0JZ290byBsb29wOworCXN0cnVjdCBiaW9fdmVjIGJ2OworCisJX19iaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyLCBpdGVyKQorCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBmcmFnKyssIGJ2LmJ2X3BhZ2UsCisJCQkJICAgYnYuYnZfb2Zmc2V0LCBidi5idl9sZW4pOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzQ2LDEyICszMzgsMTAgQEAKIAl0LT5ub3V0Kys7CiAJZi0+d2FpdGVkID0gMDsKIAlmLT53YWl0ZWRfdG90YWwgPSAwOwotCWlmIChmLT5idWYpCi0JCWYtPmxiYSA9IGYtPmJ1Zi0+c2VjdG9yOwogCiAJLyogc2V0IHVwIGF0YSBoZWFkZXIgKi8KLQlhaC0+c2NudCA9IGYtPmJjbnQgPj4gOTsKLQlwdXRfbGJhKGFoLCBmLT5sYmEpOworCWFoLT5zY250ID0gZi0+aXRlci5iaV9zaXplID4+IDk7CisJcHV0X2xiYShhaCwgZi0+aXRlci5iaV9zZWN0b3IpOwogCWlmICh0LT5kLT5mbGFncyAmIERFVkZMX0VYVCkgewogCQlhaC0+YWZsYWdzIHw9IEFPRUFGTF9FWFQ7CiAJfSBlbHNlIHsKQEAgLTM2MCwxMSArMzUwLDExIEBACiAJCWFoLT5sYmEzIHw9IDB4ZTA7CS8qIExCQSBiaXQgKyBvYnNvbGV0ZSAweGEwICovCiAJfQogCWlmIChmLT5idWYgJiYgYmlvX2RhdGFfZGlyKGYtPmJ1Zi0+YmlvKSA9PSBXUklURSkgewotCQlza2JfZmlsbHVwKHNrYiwgZi0+YnYsIGYtPmJ2X29mZiwgZi0+YmNudCk7CisJCXNrYl9maWxsdXAoc2tiLCBmLT5idWYtPmJpbywgZi0+aXRlcik7CiAJCWFoLT5hZmxhZ3MgfD0gQU9FQUZMX1dSSVRFOwotCQlza2ItPmxlbiArPSBmLT5iY250OwotCQlza2ItPmRhdGFfbGVuID0gZi0+YmNudDsKLQkJc2tiLT50cnVlc2l6ZSArPSBmLT5iY250OworCQlza2ItPmxlbiArPSBmLT5pdGVyLmJpX3NpemU7CisJCXNrYi0+ZGF0YV9sZW4gPSBmLT5pdGVyLmJpX3NpemU7CisJCXNrYi0+dHJ1ZXNpemUgKz0gZi0+aXRlci5iaV9zaXplOwogCQl0LT53cGt0cysrOwogCX0gZWxzZSB7CiAJCXQtPnJwa3RzKys7CkBAIC0zODIsNyArMzcyLDYgQEAKIAlzdHJ1Y3QgYnVmICpidWY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOwotCXVsb25nIGJjbnQsIGZiY250OwogCiAJYnVmID0gbmV4dGJ1ZihkKTsKIAlpZiAoYnVmID09IE5VTEwpCkBAIC0zOTAsMzkgKzM3OSwyMiBAQAogCWYgPSBuZXdmcmFtZShkKTsKIAlpZiAoZiA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQliY250ID0gZC0+bWF4YmNudDsKLQlpZiAoYmNudCA9PSAwKQotCQliY250ID0gREVGQVVMVEJDTlQ7Ci0JaWYgKGJjbnQgPiBidWYtPnJlc2lkKQotCQliY250ID0gYnVmLT5yZXNpZDsKLQlmYmNudCA9IGJjbnQ7Ci0JZi0+YnYgPSBidWYtPmJ2OwotCWYtPmJ2X29mZiA9IGYtPmJ2LT5idl9vZmZzZXQgKyAoZi0+YnYtPmJ2X2xlbiAtIGJ1Zi0+YnZfcmVzaWQpOwotCWRvIHsKLQkJaWYgKGZiY250IDwgYnVmLT5idl9yZXNpZCkgewotCQkJYnVmLT5idl9yZXNpZCAtPSBmYmNudDsKLQkJCWJ1Zi0+cmVzaWQgLT0gZmJjbnQ7Ci0JCQlicmVhazsKLQkJfQotCQlmYmNudCAtPSBidWYtPmJ2X3Jlc2lkOwotCQlidWYtPnJlc2lkIC09IGJ1Zi0+YnZfcmVzaWQ7Ci0JCWlmIChidWYtPnJlc2lkID09IDApIHsKLQkJCWQtPmlwLmJ1ZiA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlidWYtPmJ2Kys7Ci0JCWJ1Zi0+YnZfcmVzaWQgPSBidWYtPmJ2LT5idl9sZW47Ci0JCVdBUk5fT04oYnVmLT5idl9yZXNpZCA9PSAwKTsKLQl9IHdoaWxlIChmYmNudCk7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlmLT5idWYgPSBidWY7Ci0JZi0+YmNudCA9IGJjbnQ7Ci0JYXRhX3J3X2ZyYW1laW5pdChmKTsKKwlmLT5pdGVyID0gYnVmLT5pdGVyOworCWYtPml0ZXIuYmlfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsCisJCQkJZC0+bWF4YmNudCA/OiBERUZBVUxUQkNOVCwKKwkJCQlmLT5pdGVyLmJpX3NpemUpOworCWJpb19hZHZhbmNlX2l0ZXIoYnVmLT5iaW8sICZidWYtPml0ZXIsIGYtPml0ZXIuYmlfc2l6ZSk7CisKKwlpZiAoIWJ1Zi0+aXRlci5iaV9zaXplKQorCQlkLT5pcC5idWYgPSBOVUxMOwogCiAJLyogbWFyayBhbGwgdHJhY2tpbmcgZmllbGRzIGFuZCBsb2FkIG91dCAqLwogCWJ1Zi0+bmZyYW1lc291dCArPSAxOwotCWJ1Zi0+c2VjdG9yICs9IGJjbnQgPj4gOTsKKworCWF0YV9yd19mcmFtZWluaXQoZik7CiAKIAlza2IgPSBza2JfY2xvbmUoZi0+c2tiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiKSB7CkBAIC02MTMsMTAgKzU4NSw3IEBACiAJc2tiID0gbmYtPnNrYjsKIAluZi0+c2tiID0gZi0+c2tiOwogCW5mLT5idWYgPSBmLT5idWY7Ci0JbmYtPmJjbnQgPSBmLT5iY250OwotCW5mLT5sYmEgPSBmLT5sYmE7Ci0JbmYtPmJ2ID0gZi0+YnY7Ci0JbmYtPmJ2X29mZiA9IGYtPmJ2X29mZjsKKwluZi0+aXRlciA9IGYtPml0ZXI7CiAJbmYtPndhaXRlZCA9IDA7CiAJbmYtPndhaXRlZF90b3RhbCA9IGYtPndhaXRlZF90b3RhbDsKIAluZi0+c2VudCA9IGYtPnNlbnQ7CkBAIC02NDgsMTkgKzYxNywxOSBAQAogCX0KIAlmLT5mbGFncyB8PSBGRkxfUFJPQkU7CiAJaWZyb3RhdGUodCk7Ci0JZi0+YmNudCA9IHQtPmQtPm1heGJjbnQgPyB0LT5kLT5tYXhiY250IDogREVGQVVMVEJDTlQ7CisJZi0+aXRlci5iaV9zaXplID0gdC0+ZC0+bWF4YmNudCA/IHQtPmQtPm1heGJjbnQgOiBERUZBVUxUQkNOVDsKIAlhdGFfcndfZnJhbWVpbml0KGYpOwogCXNrYiA9IGYtPnNrYjsKLQlmb3IgKGZyYWcgPSAwLCBuID0gZi0+YmNudDsgbiA+IDA7ICsrZnJhZywgbiAtPSBtKSB7CisJZm9yIChmcmFnID0gMCwgbiA9IGYtPml0ZXIuYmlfc2l6ZTsgbiA+IDA7ICsrZnJhZywgbiAtPSBtKSB7CiAJCWlmIChuIDwgUEFHRV9TSVpFKQogCQkJbSA9IG47CiAJCWVsc2UKIAkJCW0gPSBQQUdFX1NJWkU7CiAJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIGZyYWcsIGVtcHR5X3BhZ2UsIDAsIG0pOwogCX0KLQlza2ItPmxlbiArPSBmLT5iY250OwotCXNrYi0+ZGF0YV9sZW4gPSBmLT5iY250OwotCXNrYi0+dHJ1ZXNpemUgKz0gZi0+YmNudDsKKwlza2ItPmxlbiArPSBmLT5pdGVyLmJpX3NpemU7CisJc2tiLT5kYXRhX2xlbiA9IGYtPml0ZXIuYmlfc2l6ZTsKKwlza2ItPnRydWVzaXplICs9IGYtPml0ZXIuYmlfc2l6ZTsKIAogCXNrYiA9IHNrYl9jbG9uZShmLT5za2IsIEdGUF9BVE9NSUMpOwogCWlmIChza2IpIHsKQEAgLTg5NywxNSArODY2LDE1IEBACiBzdGF0aWMgdm9pZAogYmlvX3BhZ2VpbmMoc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgaTsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaXRlcikgewogCQkvKiBOb24temVybyBwYWdlIGNvdW50IGZvciBub24taGVhZCBtZW1iZXJzIG9mCiAJCSAqIGNvbXBvdW5kIHBhZ2VzIGlzIG5vIGxvbmdlciBhbGxvd2VkIGJ5IHRoZSBrZXJuZWwuCiAJCSAqLwotCQlwYWdlID0gY29tcG91bmRfdHJhbnNfaGVhZChidi0+YnZfcGFnZSk7CisJCXBhZ2UgPSBjb21wb3VuZF90cmFuc19oZWFkKGJ2LmJ2X3BhZ2UpOwogCQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwogCX0KIH0KQEAgLTkxMywxMiArODgyLDEyIEBACiBzdGF0aWMgdm9pZAogYmlvX3BhZ2VkZWMoc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCBiaW9fdmVjICpidjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7Ci0JCXBhZ2UgPSBjb21wb3VuZF90cmFuc19oZWFkKGJ2LT5idl9wYWdlKTsKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7CisJCXBhZ2UgPSBjb21wb3VuZF90cmFuc19oZWFkKGJ2LmJ2X3BhZ2UpOwogCQlhdG9taWNfZGVjKCZwYWdlLT5fY291bnQpOwogCX0KIH0KQEAgLTkyOSwxMiArODk4LDggQEAKIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwogCWJ1Zi0+cnEgPSBycTsKIAlidWYtPmJpbyA9IGJpbzsKLQlidWYtPnJlc2lkID0gYmlvLT5iaV9zaXplOwotCWJ1Zi0+c2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJYnVmLT5pdGVyID0gYmlvLT5iaV9pdGVyOwogCWJpb19wYWdlaW5jKGJpbyk7Ci0JYnVmLT5idiA9IGJpb19pb3ZlYyhiaW8pOwotCWJ1Zi0+YnZfcmVzaWQgPSBidWYtPmJ2LT5idl9sZW47Ci0JV0FSTl9PTihidWYtPmJ2X3Jlc2lkID09IDApOwogfQogCiBzdGF0aWMgc3RydWN0IGJ1ZiAqCkBAIC0xMTE5LDI0ICsxMDg0LDE4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1idmNweShzdHJ1Y3QgYmlvX3ZlYyAqYnYsIHVsb25nIG9mZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgbG9uZyBjbnQpCitidmNweShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBidmVjX2l0ZXIgaXRlciwgbG9uZyBjbnQpCiB7Ci0JdWxvbmcgZmNudDsKLQljaGFyICpwOwogCWludCBzb2ZmID0gMDsKLWxvb3A6Ci0JZmNudCA9IGJ2LT5idl9sZW4gLSAob2ZmIC0gYnYtPmJ2X29mZnNldCk7Ci0JaWYgKGZjbnQgPiBjbnQpCi0JCWZjbnQgPSBjbnQ7Ci0JcCA9IHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSkgKyBvZmY7Ci0Jc2tiX2NvcHlfYml0cyhza2IsIHNvZmYsIHAsIGZjbnQpOwotCXNvZmYgKz0gZmNudDsKLQljbnQgLT0gZmNudDsKLQlpZiAoY250IDw9IDApCi0JCXJldHVybjsKLQlidisrOwotCW9mZiA9IGJ2LT5idl9vZmZzZXQ7Ci0JZ290byBsb29wOworCXN0cnVjdCBiaW9fdmVjIGJ2OworCisJaXRlci5iaV9zaXplID0gY250OworCisJX19iaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyLCBpdGVyKSB7CisJCWNoYXIgKnAgPSBwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CisJCXNrYl9jb3B5X2JpdHMoc2tiLCBzb2ZmLCBwLCBidi5idl9sZW4pOworCQlzb2ZmICs9IGJ2LmJ2X2xlbjsKKwl9CiB9CiAKIHZvaWQKQEAgLTExNTIsNyArMTExMSw3IEBACiAJZG8gewogCQliaW8gPSBycS0+YmlvOwogCQlib2sgPSAhZmFzdGZhaWwgJiYgdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0JfSB3aGlsZSAoX19ibGtfZW5kX3JlcXVlc3QocnEsIGJvayA/IDAgOiAtRUlPLCBiaW8tPmJpX3NpemUpKTsKKwl9IHdoaWxlIChfX2Jsa19lbmRfcmVxdWVzdChycSwgYm9rID8gMCA6IC1FSU8sIGJpby0+YmlfaXRlci5iaV9zaXplKSk7CiAKIAkvKiBjZi4gaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNi8xMC8zMS8yOCAqLwogCWlmICghZmFzdGZhaWwpCkBAIC0xMjI5LDcgKzExODgsMTUgQEAKIAkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZidWYtPmJpby0+YmlfZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJYnZjcHkoZi0+YnYsIGYtPmJ2X29mZiwgc2tiLCBuKTsKKwkJaWYgKG4gPiBmLT5pdGVyLmJpX3NpemUpIHsKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgiJXMgZSVsZC4lZC4gIGJ5dGVzPSVsZCBuZWVkPSV1XG4iLAorCQkJCSJhb2U6IHRvby1sYXJnZSBkYXRhIHNpemUgaW4gcmVhZCBmcm9tIiwKKwkJCQkobG9uZykgZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yLAorCQkJCW4sIGYtPml0ZXIuYmlfc2l6ZSk7CisJCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYnVmLT5iaW8tPmJpX2ZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCWJ2Y3B5KHNrYiwgZi0+YnVmLT5iaW8sIGYtPml0ZXIsIG4pOwogCWNhc2UgQVRBX0NNRF9QSU9fV1JJVEU6CiAJY2FzZSBBVEFfQ01EX1BJT19XUklURV9FWFQ6CiAJCXNwaW5fbG9ja19pcnEoJmQtPmxvY2spOwpAQCAtMTI3Miw3ICsxMjM5LDcgQEAKIAogCWFvZV9mcmVldGZyYW1lKGYpOwogCi0JaWYgKGJ1ZiAmJiAtLWJ1Zi0+bmZyYW1lc291dCA9PSAwICYmIGJ1Zi0+cmVzaWQgPT0gMCkKKwlpZiAoYnVmICYmIC0tYnVmLT5uZnJhbWVzb3V0ID09IDAgJiYgYnVmLT5pdGVyLmJpX3NpemUgPT0gMCkKIAkJYW9lX2VuZF9idWYoZCwgYnVmKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmZC0+bG9jayk7CkBAIC0xNzI3LDcgKzE2OTQsNyBAQAogewogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWJ1Zi0+cmVzaWQgPSAwOworCWJ1Zi0+aXRlci5iaV9zaXplID0gMDsKIAljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYnVmLT5iaW8tPmJpX2ZsYWdzKTsKIAlpZiAoYnVmLT5uZnJhbWVzb3V0ID09IDApCiAJCWFvZV9lbmRfYnVmKGQsIGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2JyZC5jIGIvZHJpdmVycy9ibG9jay9icmQuYwppbmRleCBkOTFmMWE1Li5lNzNiODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2JyZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKQEAgLTMyOCwxOCArMzI4LDE4IEBACiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJpby0+YmlfYmRldjsKIAlzdHJ1Y3QgYnJkX2RldmljZSAqYnJkID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCWludCBydzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXNlY3Rvcl90IHNlY3RvcjsKLQlpbnQgaTsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJaW50IGVyciA9IC1FSU87CiAKLQlzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwlzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCWlmIChiaW9fZW5kX3NlY3RvcihiaW8pID4gZ2V0X2NhcGFjaXR5KGJkZXYtPmJkX2Rpc2spKQogCQlnb3RvIG91dDsKIAogCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpKSB7CiAJCWVyciA9IDA7Ci0JCWRpc2NhcmRfZnJvbV9icmQoYnJkLCBzZWN0b3IsIGJpby0+Ymlfc2l6ZSk7CisJCWRpc2NhcmRfZnJvbV9icmQoYnJkLCBzZWN0b3IsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zNDcsMTAgKzM0NywxMCBAQAogCWlmIChydyA9PSBSRUFEQSkKIAkJcncgPSBSRUFEOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7Ci0JCXVuc2lnbmVkIGludCBsZW4gPSBidmVjLT5idl9sZW47Ci0JCWVyciA9IGJyZF9kb19idmVjKGJyZCwgYnZlYy0+YnZfcGFnZSwgbGVuLAotCQkJCQlidmVjLT5idl9vZmZzZXQsIHJ3LCBzZWN0b3IpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gYnZlYy5idl9sZW47CisJCWVyciA9IGJyZF9kb19idmVjKGJyZCwgYnZlYy5idl9wYWdlLCBsZW4sCisJCQkJCWJ2ZWMuYnZfb2Zmc2V0LCBydywgc2VjdG9yKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCQlzZWN0b3IgKz0gbGVuID4+IFNFQ1RPUl9TSElGVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCBiMzVmYzRmLi4wMzZlOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC01MDA0LDcgKzUwMDQsNyBAQAogCiAJaSA9IGFsbG9jX2NjaXNzX2hiYShwZGV2KTsKIAlpZiAoaSA8IDApCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAloID0gaGJhW2ldOwogCWgtPnBkZXYgPSBwZGV2OwpAQCAtNTIwNSw3ICs1MjA1LDcgQEAKIAkgKi8KIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJlZV9oYmEoaCk7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgdm9pZCBjY2lzc19zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKaW5kZXggMjhjNzNjYS4uYTliMTNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCiAJYmlvID0gYmlvX2FsbG9jX2RyYmQoR0ZQX05PSU8pOwogCWJpby0+YmlfYmRldiA9IGJkZXYtPm1kX2JkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKIAllcnIgPSAtRUlPOwogCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBzaXplLCAwKSAhPSBzaXplKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKaW5kZXggYjEyYzExZS4uNTk3ZjExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKQEAgLTEwMjgsNyArMTAyOCw3IEBACiAJfSBlbHNlCiAJCXBhZ2UgPSBiLT5ibV9wYWdlc1twYWdlX25yXTsKIAliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5tZF9iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gb25fZGlza19zZWN0b3I7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IG9uX2Rpc2tfc2VjdG9yOwogCS8qIGJpb19hZGRfcGFnZSBvZiBhIHNpbmdsZSBwYWdlIHRvIGFuIGVtcHR5IGJpbyB3aWxsIGFsd2F5cyBzdWNjZWVkLAogCSAqIGFjY29yZGluZyB0byBhcGkuICBEbyB3ZSB3YW50IHRvIGFzc2VydCB0aGF0PyAqLwogCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGxlbiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMKaW5kZXggOWUzODE4Yi4uOTI5NDY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYwpAQCAtMTUzNywxNSArMTUzNywxNyBAQAogCiBzdGF0aWMgaW50IF9kcmJkX3NlbmRfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQlpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKKwogCS8qIGhpbnQgYWxsIGJ1dCBsYXN0IHBhZ2Ugd2l0aCBNU0dfTU9SRSAqLwotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQlpbnQgZXJyOwogCi0JCWVyciA9IF9kcmJkX25vX3NlbmRfcGFnZShtZGV2LCBidmVjLT5idl9wYWdlLAotCQkJCQkgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4sCi0JCQkJCSBpID09IGJpby0+YmlfdmNudCAtIDEgPyAwIDogTVNHX01PUkUpOworCQllcnIgPSBfZHJiZF9ub19zZW5kX3BhZ2UobWRldiwgYnZlYy5idl9wYWdlLAorCQkJCQkgYnZlYy5idl9vZmZzZXQsIGJ2ZWMuYnZfbGVuLAorCQkJCQkgYmlvX2l0ZXJfbGFzdChidmVjLCBpdGVyKQorCQkJCQkgPyAwIDogTVNHX01PUkUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNTU0LDE1ICsxNTU2LDE2IEBACiAKIHN0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCBiaW9fdmVjICpidmVjOwotCWludCBpOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCiAJLyogaGludCBhbGwgYnV0IGxhc3QgcGFnZSB3aXRoIE1TR19NT1JFICovCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCWludCBlcnI7CiAKLQkJZXJyID0gX2RyYmRfc2VuZF9wYWdlKG1kZXYsIGJ2ZWMtPmJ2X3BhZ2UsCi0JCQkJICAgICAgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4sCi0JCQkJICAgICAgaSA9PSBiaW8tPmJpX3ZjbnQgLSAxID8gMCA6IE1TR19NT1JFKTsKKwkJZXJyID0gX2RyYmRfc2VuZF9wYWdlKG1kZXYsIGJ2ZWMuYnZfcGFnZSwKKwkJCQkgICAgICBidmVjLmJ2X29mZnNldCwgYnZlYy5idl9sZW4sCisJCQkJICAgICAgYmlvX2l0ZXJfbGFzdChidmVjLCBpdGVyKSA/IDAgOiBNU0dfTU9SRSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCmluZGV4IDZmYTY2NzMuLmQwNzMzMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAKIAkJZ290byBmYWlsOwogCX0KIAkvKiA+IHBlZXJfcmVxLT5pLnNlY3RvciwgdW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IGJpbyAqLwotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2OwogCWJpby0+YmlfcncgPSBydzsKIAliaW8tPmJpX3ByaXZhdGUgPSBwZWVyX3JlcTsKQEAgLTEzNTMsNyArMTM1Myw3IEBACiAJCQkJZGV2X2VycihERVYsCiAJCQkJCSJiaW9fYWRkX3BhZ2UgZmFpbGVkIGZvciBsZW49JXUsICIKIAkJCQkJImJpX3ZjbnQ9MCAoYmlfc2VjdG9yPSVsbHUpXG4iLAotCQkJCQlsZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQkJCQlsZW4sICh1aW50NjRfdCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJCQllcnIgPSAtRU5PU1BDOwogCQkJCWdvdG8gZmFpbDsKIAkJCX0KQEAgLTE1OTUsOSArMTU5NSwxMCBAQAogc3RhdGljIGludCByZWN2X2RsZXNzX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLAogCQkJICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgZGF0YV9zaXplKQogewotCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXN0cnVjdCBiaW8gKmJpbzsKLQlpbnQgZGdzLCBlcnIsIGksIGV4cGVjdDsKKwlpbnQgZGdzLCBlcnIsIGV4cGVjdDsKIAl2b2lkICpkaWdfaW4gPSBtZGV2LT50Y29ubi0+aW50X2RpZ19pbjsKIAl2b2lkICpkaWdfdnYgPSBtZGV2LT50Y29ubi0+aW50X2RpZ192djsKIApAQCAtMTYxNSwxMyArMTYxNiwxMyBAQAogCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKIAogCWJpbyA9IHJlcS0+bWFzdGVyX2JpbzsKLQlEX0FTU0VSVChzZWN0b3IgPT0gYmlvLT5iaV9zZWN0b3IpOworCURfQVNTRVJUKHNlY3RvciA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewotCQl2b2lkICptYXBwZWQgPSBrbWFwKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OwotCQlleHBlY3QgPSBtaW5fdChpbnQsIGRhdGFfc2l6ZSwgYnZlYy0+YnZfbGVuKTsKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGl0ZXIpIHsKKwkJdm9pZCAqbWFwcGVkID0ga21hcChidmVjLmJ2X3BhZ2UpICsgYnZlYy5idl9vZmZzZXQ7CisJCWV4cGVjdCA9IG1pbl90KGludCwgZGF0YV9zaXplLCBidmVjLmJ2X2xlbik7CiAJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgbWFwcGVkLCBleHBlY3QpOwotCQlrdW5tYXAoYnZlYy0+YnZfcGFnZSk7CisJCWt1bm1hcChidmVjLmJ2X3BhZ2UpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJZGF0YV9zaXplIC09IGV4cGVjdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKaW5kZXggZmVjN2JlZi4uMTA0YTA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKQEAgLTc3LDggKzc3LDggQEAKIAlyZXEtPmVwb2NoICAgICAgID0gMDsKIAogCWRyYmRfY2xlYXJfaW50ZXJ2YWwoJnJlcS0+aSk7Ci0JcmVxLT5pLnNlY3RvciAgICAgPSBiaW9fc3JjLT5iaV9zZWN0b3I7Ci0JcmVxLT5pLnNpemUgICAgICA9IGJpb19zcmMtPmJpX3NpemU7CisJcmVxLT5pLnNlY3RvciAgICAgPSBiaW9fc3JjLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwlyZXEtPmkuc2l6ZSAgICAgID0gYmlvX3NyYy0+YmlfaXRlci5iaV9zaXplOwogCXJlcS0+aS5sb2NhbCA9IHRydWU7CiAJcmVxLT5pLndhaXRpbmcgPSBmYWxzZTsKIApAQCAtMTI4MCw3ICsxMjgwLDcgQEAKIAkvKgogCSAqIHdoYXQgd2UgImJsaW5kbHkiIGFzc3VtZToKIAkgKi8KLQlEX0FTU0VSVChJU19BTElHTkVEKGJpby0+Ymlfc2l6ZSwgNTEyKSk7CisJRF9BU1NFUlQoSVNfQUxJR05FRChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgNTEyKSk7CiAKIAlpbmNfYXBfYmlvKG1kZXYpOwogCV9fZHJiZF9tYWtlX3JlcXVlc3QobWRldiwgYmlvLCBzdGFydF90aW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5oIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKaW5kZXggOTc4Y2IxYS4uMjhlMTVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmgKQEAgLTI2OSw3ICsyNjksNyBAQAogCiAvKiBTaG9ydCBsaXZlZCB0ZW1wb3Jhcnkgc3RydWN0IG9uIHRoZSBzdGFjay4KICAqIFdlIGNvdWxkIHNxdWlycmVsIHRoZSBlcnJvciB0byBiZSByZXR1cm5lZCBpbnRvCi0gKiBiaW8tPmJpX3NpemUsIG9yIHNpbWlsYXIuIEJ1dCB0aGF0IHdvdWxkIGJlIHRvbyB1Z2x5LiAqLworICogYmlvLT5iaV9pdGVyLmJpX3NpemUsIG9yIHNpbWlsYXIuIEJ1dCB0aGF0IHdvdWxkIGJlIHRvbyB1Z2x5LiAqLwogc3RydWN0IGJpb19hbmRfZXJyb3IgewogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCmluZGV4IDg5MWMwZWMuLjg0ZDMxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCkBAIC0zMTMsOCArMzEzLDggQEAKIHsKIAlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwotCXN0cnVjdCBiaW9fdmVjICpidmVjOwotCWludCBpOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCiAJZGVzYy50Zm0gPSB0Zm07CiAJZGVzYy5mbGFncyA9IDA7CkBAIC0zMjIsOCArMzIyLDggQEAKIAlzZ19pbml0X3RhYmxlKCZzZywgMSk7CiAJY3J5cHRvX2hhc2hfaW5pdCgmZGVzYyk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKLQkJc2dfc2V0X3BhZ2UoJnNnLCBidmVjLT5idl9wYWdlLCBidmVjLT5idl9sZW4sIGJ2ZWMtPmJ2X29mZnNldCk7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CisJCXNnX3NldF9wYWdlKCZzZywgYnZlYy5idl9wYWdlLCBidmVjLmJ2X2xlbiwgYnZlYy5idl9vZmZzZXQpOwogCQljcnlwdG9faGFzaF91cGRhdGUoJmRlc2MsICZzZywgc2cubGVuZ3RoKTsKIAl9CiAJY3J5cHRvX2hhc2hfZmluYWwoJmRlc2MsIGRpZ2VzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwppbmRleCAwMDBhYmUyLi4yMDIzMDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKQEAgLTIzNTEsNyArMjM1MSw3IEBACiAvKiBDb21wdXRlIG1heGltYWwgY29udGlndW91cyBidWZmZXIgc2l6ZS4gKi8KIHN0YXRpYyBpbnQgYnVmZmVyX2NoYWluX3NpemUodm9pZCkKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJaW50IHNpemU7CiAJc3RydWN0IHJlcV9pdGVyYXRvciBpdGVyOwogCWNoYXIgKmJhc2U7CkBAIC0yMzYwLDEwICsyMzYwLDEwIEBACiAJc2l6ZSA9IDA7CiAKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCBjdXJyZW50X3JlcSwgaXRlcikgewotCQlpZiAocGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQgIT0gYmFzZSArIHNpemUpCisJCWlmIChwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQgIT0gYmFzZSArIHNpemUpCiAJCQlicmVhazsKIAotCQlzaXplICs9IGJ2LT5idl9sZW47CisJCXNpemUgKz0gYnYuYnZfbGVuOwogCX0KIAogCXJldHVybiBzaXplID4+IDk7CkBAIC0yMzg5LDcgKzIzODksNyBAQAogc3RhdGljIHZvaWQgY29weV9idWZmZXIoaW50IHNzaXplLCBpbnQgbWF4X3NlY3RvciwgaW50IG1heF9zZWN0b3JfMikKIHsKIAlpbnQgcmVtYWluaW5nOwkJLyogbnVtYmVyIG9mIHRyYW5zZmVycmVkIDUxMi1ieXRlIHNlY3RvcnMgKi8KLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqYnVmZmVyOwogCWNoYXIgKmRtYV9idWZmZXI7CiAJaW50IHNpemU7CkBAIC0yNDI3LDEwICsyNDI3LDEwIEBACiAJCWlmICghcmVtYWluaW5nKQogCQkJYnJlYWs7CiAKLQkJc2l6ZSA9IGJ2LT5idl9sZW47CisJCXNpemUgPSBidi5idl9sZW47CiAJCVNVUEJPVU5EKHNpemUsIHJlbWFpbmluZyk7CiAKLQkJYnVmZmVyID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7CisJCWJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKSArIGJ2LmJ2X29mZnNldDsKIAkJaWYgKGRtYV9idWZmZXIgKyBzaXplID4KIAkJICAgIGZsb3BweV90cmFja19idWZmZXIgKyAobWF4X2J1ZmZlcl9zZWN0b3JzIDw8IDEwKSB8fAogCQkgICAgZG1hX2J1ZmZlciA8IGZsb3BweV90cmFja19idWZmZXIpIHsKQEAgLTM2OTEsOSArMzY5MSwxMiBAQAogCWlmICghKG1vZGUgJiBGTU9ERV9OREVMQVkpKSB7CiAJCWlmIChtb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKSB7CiAJCQlVRFJTLT5sYXN0X2NoZWNrZWQgPSAwOworCQkJY2xlYXJfYml0KEZEX09QRU5fU0hPVUxEX0ZBSUxfQklULCAmVURSUy0+ZmxhZ3MpOwogCQkJY2hlY2tfZGlza19jaGFuZ2UoYmRldik7CiAJCQlpZiAodGVzdF9iaXQoRkRfRElTS19DSEFOR0VEX0JJVCwgJlVEUlMtPmZsYWdzKSkKIAkJCQlnb3RvIG91dDsKKwkJCWlmICh0ZXN0X2JpdChGRF9PUEVOX1NIT1VMRF9GQUlMX0JJVCwgJlVEUlMtPmZsYWdzKSkKKwkJCQlnb3RvIG91dDsKIAkJfQogCQlyZXMgPSAtRVJPRlM7CiAJCWlmICgobW9kZSAmIEZNT0RFX1dSSVRFKSAmJgpAQCAtMzc0NiwxNyArMzc0OSwyOSBAQAogICogYSBkaXNrIGluIHRoZSBkcml2ZSwgYW5kIHdoZXRoZXIgdGhhdCBkaXNrIGlzIHdyaXRhYmxlLgogICovCiAKLXN0YXRpYyB2b2lkIGZsb3BweV9yYjBfY29tcGxldGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQorc3RydWN0IHJiMF9jYmRhdGEgeworCWludCBkcml2ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZTsKK307CisKK3N0YXRpYyB2b2lkIGZsb3BweV9yYjBfY2Ioc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQogewotCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKWJpby0+YmlfcHJpdmF0ZSk7CisJc3RydWN0IHJiMF9jYmRhdGEgKmNiZGF0YSA9IChzdHJ1Y3QgcmIwX2NiZGF0YSAqKWJpby0+YmlfcHJpdmF0ZTsKKwlpbnQgZHJpdmUgPSBjYmRhdGEtPmRyaXZlOworCisJaWYgKGVycikgeworCQlwcl9pbmZvKCJmbG9wcHk6IGVycm9yICVkIHdoaWxlIHJlYWRpbmcgYmxvY2sgMCIsIGVycik7CisJCXNldF9iaXQoRkRfT1BFTl9TSE9VTERfRkFJTF9CSVQsICZVRFJTLT5mbGFncyk7CisJfQorCWNvbXBsZXRlKCZjYmRhdGEtPmNvbXBsZXRlKTsKIH0KIAotc3RhdGljIGludCBfX2Zsb3BweV9yZWFkX2Jsb2NrXzAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3N0YXRpYyBpbnQgX19mbG9wcHlfcmVhZF9ibG9ja18wKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBkcml2ZSkKIHsKIAlzdHJ1Y3QgYmlvIGJpbzsKIAlzdHJ1Y3QgYmlvX3ZlYyBiaW9fdmVjOwotCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOwogCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCByYjBfY2JkYXRhIGNiZGF0YTsKIAlzaXplX3Qgc2l6ZTsKIAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0lPKTsKQEAgLTM3NjksMjMgKzM3ODQsMjYgQEAKIAlpZiAoIXNpemUpCiAJCXNpemUgPSAxMDI0OwogCisJY2JkYXRhLmRyaXZlID0gZHJpdmU7CisKIAliaW9faW5pdCgmYmlvKTsKIAliaW8uYmlfaW9fdmVjID0gJmJpb192ZWM7CiAJYmlvX3ZlYy5idl9wYWdlID0gcGFnZTsKIAliaW9fdmVjLmJ2X2xlbiA9IHNpemU7CiAJYmlvX3ZlYy5idl9vZmZzZXQgPSAwOwogCWJpby5iaV92Y250ID0gMTsKLQliaW8uYmlfc2l6ZSA9IHNpemU7CisJYmlvLmJpX2l0ZXIuYmlfc2l6ZSA9IHNpemU7CiAJYmlvLmJpX2JkZXYgPSBiZGV2OwotCWJpby5iaV9zZWN0b3IgPSAwOworCWJpby5iaV9pdGVyLmJpX3NlY3RvciA9IDA7CiAJYmlvLmJpX2ZsYWdzID0gKDEgPDwgQklPX1FVSUVUKTsKLQlpbml0X2NvbXBsZXRpb24oJmNvbXBsZXRlKTsKLQliaW8uYmlfcHJpdmF0ZSA9ICZjb21wbGV0ZTsKLQliaW8uYmlfZW5kX2lvID0gZmxvcHB5X3JiMF9jb21wbGV0ZTsKKwliaW8uYmlfcHJpdmF0ZSA9ICZjYmRhdGE7CisJYmlvLmJpX2VuZF9pbyA9IGZsb3BweV9yYjBfY2I7CiAKIAlzdWJtaXRfYmlvKFJFQUQsICZiaW8pOwogCXByb2Nlc3NfZmRfcmVxdWVzdCgpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRlKTsKKworCWluaXRfY29tcGxldGlvbigmY2JkYXRhLmNvbXBsZXRlKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYmRhdGEuY29tcGxldGUpOwogCiAJX19mcmVlX3BhZ2UocGFnZSk7CiAKQEAgLTM4MjcsNyArMzg0NSw3IEBACiAJCQlVRFJTLT5nZW5lcmF0aW9uKys7CiAJCWlmIChkcml2ZV9ub19nZW9tKGRyaXZlKSkgewogCQkJLyogYXV0by1zZW5zaW5nICovCi0JCQlyZXMgPSBfX2Zsb3BweV9yZWFkX2Jsb2NrXzAob3BlbmVkX2JkZXZbZHJpdmVdKTsKKwkJCXJlcyA9IF9fZmxvcHB5X3JlYWRfYmxvY2tfMChvcGVuZWRfYmRldltkcml2ZV0sIGRyaXZlKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChjZikKIAkJCQlwb2xsX2RyaXZlKGZhbHNlLCBGRF9SQVdfTkVFRF9ESVNLKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggYzhkYWM3My4uNjZlOGMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTI4OCw5ICsyODgsMTAgQEAKIHsKIAlpbnQgKCpkb19sb19zZW5kKShzdHJ1Y3QgbG9vcF9kZXZpY2UgKiwgc3RydWN0IGJpb192ZWMgKiwgbG9mZl90LAogCQkJc3RydWN0IHBhZ2UgKnBhZ2UpOwotCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChsby0+dHJhbnNmZXIgIT0gdHJhbnNmZXJfbm9uZSkgewogCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOwpAQCAtMzAyLDExICszMDMsMTEgQEAKIAkJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlOwogCX0KIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewotCQlyZXQgPSBkb19sb19zZW5kKGxvLCBidmVjLCBwb3MsIHBhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgeworCQlyZXQgPSBkb19sb19zZW5kKGxvLCAmYnZlYywgcG9zLCBwYWdlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJcG9zICs9IGJ2ZWMtPmJ2X2xlbjsKKwkJcG9zICs9IGJ2ZWMuYnZfbGVuOwogCX0KIAlpZiAocGFnZSkgewogCQlrdW5tYXAocGFnZSk7CkBAIC0zOTIsMjAgKzM5MywyMCBAQAogc3RhdGljIGludAogbG9fcmVjZWl2ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBic2l6ZSwgbG9mZl90IHBvcykKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAlzc2l6ZV90IHM7Ci0JaW50IGk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKLQkJcyA9IGRvX2xvX3JlY2VpdmUobG8sIGJ2ZWMsIGJzaXplLCBwb3MpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgeworCQlzID0gZG9fbG9fcmVjZWl2ZShsbywgJmJ2ZWMsIGJzaXplLCBwb3MpOwogCQlpZiAocyA8IDApCiAJCQlyZXR1cm4gczsKIAotCQlpZiAocyAhPSBidmVjLT5idl9sZW4pIHsKKwkJaWYgKHMgIT0gYnZlYy5idl9sZW4pIHsKIAkJCXplcm9fZmlsbF9iaW8oYmlvKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXBvcyArPSBidmVjLT5idl9sZW47CisJCXBvcyArPSBidmVjLmJ2X2xlbjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNyArNDE2LDcgQEAKIAlsb2ZmX3QgcG9zOwogCWludCByZXQ7CiAKLQlwb3MgPSAoKGxvZmZfdCkgYmlvLT5iaV9zZWN0b3IgPDwgOSkgKyBsby0+bG9fb2Zmc2V0OworCXBvcyA9ICgobG9mZl90KSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDkpICsgbG8tPmxvX29mZnNldDsKIAogCWlmIChiaW9fcncoYmlvKSA9PSBXUklURSkgewogCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CkBAIC00NDQsNyArNDQ1LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXJldCA9IGZpbGUtPmZfb3AtPmZhbGxvY2F0ZShmaWxlLCBtb2RlLCBwb3MsCi0JCQkJCQkgICAgYmlvLT5iaV9zaXplKTsKKwkJCQkJCSAgICBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAJCQlpZiAodW5saWtlbHkocmV0ICYmIHJldCAhPSAtRUlOVkFMICYmCiAJCQkJICAgICByZXQgIT0gLUVPUE5PVFNVUFApKQogCQkJCXJldCA9IC1FSU87CkBAIC03OTgsNyArNzk5LDcgQEAKIAogCS8qCiAJICogV2UgdXNlIHB1bmNoIGhvbGUgdG8gcmVjbGFpbSB0aGUgZnJlZSBzcGFjZSB1c2VkIGJ5IHRoZQotCSAqIGltYWdlIGEuay5hLiBkaXNjYXJkLiBIb3dldmVyIHdlIGRvIHN1cHBvcnQgZGlzY2FyZCBpZgorCSAqIGltYWdlIGEuay5hLiBkaXNjYXJkLiBIb3dldmVyIHdlIGRvIG5vdCBzdXBwb3J0IGRpc2NhcmQgaWYKIAkgKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGJlY2F1c2UgaXQgbWF5IGdpdmUgYW4gYXR0YWNrZXIKIAkgKiB1c2VmdWwgaW5mb3JtYXRpb24uCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL21nX2Rpc2suYyBiL2RyaXZlcnMvYmxvY2svbWdfZGlzay5jCmluZGV4IDdiYzM2M2YuLmViNTliMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbWdfZGlzay5jCisrKyBiL2RyaXZlcnMvYmxvY2svbWdfZGlzay5jCkBAIC05MTUsNyArOTE1LDcgQEAKIAogCS8qIGRpc2sgcmVzZXQgKi8KIAlpZiAocHJ2X2RhdGEtPmRldl9hdHRyID09IE1HX1NUT1JBR0VfREVWKSB7Ci0JCS8qIElmIFBPUiBzZXEuIG5vdCB5ZXQgZmluaXNlZCwgd2FpdCAqLworCQkvKiBJZiBQT1Igc2VxLiBub3QgeWV0IGZpbmlzaGVkLCB3YWl0ICovCiAJCWVyciA9IG1nX3dhaXRfcnN0b3V0KGhvc3QtPnJzdG91dCwgTUdfVE1BWF9SU1RPVVQpOwogCQlpZiAoZXJyKQogCQkJZ290byBwcm9iZV9lcnJfM2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMKaW5kZXggMDUwYzcxMi4uNTE2MDI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYwpAQCAtNDEsMTAgKzQxLDMxIEBACiAjaW5jbHVkZSAibXRpcDMyeHguaCIKIAogI2RlZmluZSBIV19DTURfU0xPVF9TWgkJKE1USVBfTUFYX0NPTU1BTkRfU0xPVFMgKiAzMikKLSNkZWZpbmUgSFdfQ01EX1RCTF9TWgkJKEFIQ0lfQ01EX1RCTF9IRFJfU1ogKyAoTVRJUF9NQVhfU0cgKiAxNikpCi0jZGVmaW5lIEhXX0NNRF9UQkxfQVJfU1oJKEhXX0NNRF9UQkxfU1ogKiBNVElQX01BWF9DT01NQU5EX1NMT1RTKQotI2RlZmluZSBIV19QT1JUX1BSSVZfRE1BX1NaIFwKLQkJKEhXX0NNRF9TTE9UX1NaICsgSFdfQ01EX1RCTF9BUl9TWiArIEFIQ0lfUlhfRklTX1NaKQorCisvKiBETUEgcmVnaW9uIGNvbnRhaW5pbmcgUlggRmlzLCBJZGVudGlmeSwgUkxFMTAsIGFuZCBTTUFSVCBidWZmZXJzICovCisjZGVmaW5lIEFIQ0lfUlhfRklTX1NaICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEFIQ0lfUlhfRklTX09GRlNFVCAgICAgIDB4MAorI2RlZmluZSBBSENJX0lERllfU1ogICAgICAgICAgICBBVEFfU0VDVF9TSVpFCisjZGVmaW5lIEFIQ0lfSURGWV9PRkZTRVQgICAgICAgIDB4NDAwCisjZGVmaW5lIEFIQ0lfU0VDVEJVRl9TWiAgICAgICAgIEFUQV9TRUNUX1NJWkUKKyNkZWZpbmUgQUhDSV9TRUNUQlVGX09GRlNFVCAgICAgMHg4MDAKKyNkZWZpbmUgQUhDSV9TTUFSVEJVRl9TWiAgICAgICAgQVRBX1NFQ1RfU0laRQorI2RlZmluZSBBSENJX1NNQVJUQlVGX09GRlNFVCAgICAweEMwMAorLyogMHgxMDAgKyAweDIwMCArIDB4MjAwICsgMHgyMDAgaXMgc21hbGxlciB0aGFuIDRrIGJ1dCB3ZSBwYWQgaXQgb3V0ICovCisjZGVmaW5lIEJMT0NLX0RNQV9BTExPQ19TWiAgICAgIDQwOTYKKworLyogRE1BIHJlZ2lvbiBjb250YWluaW5nIGNvbW1hbmQgdGFibGUgKHNob3VsZCBiZSA4MTkyIGJ5dGVzKSAqLworI2RlZmluZSBBSENJX0NNRF9TTE9UX1NaICAgICAgICBzaXplb2Yoc3RydWN0IG10aXBfY21kX2hkcikKKyNkZWZpbmUgQUhDSV9DTURfVEJMX1NaICAgICAgICAgKE1USVBfTUFYX0NPTU1BTkRfU0xPVFMgKiBBSENJX0NNRF9TTE9UX1NaKQorI2RlZmluZSBBSENJX0NNRF9UQkxfT0ZGU0VUICAgICAweDAKKworLyogRE1BIHJlZ2lvbiBwZXIgY29tbWFuZCAoY29udGFpbnMgaGVhZGVyIGFuZCBTR0wpICovCisjZGVmaW5lIEFIQ0lfQ01EX1RCTF9IRFJfU1ogICAgIDB4ODAKKyNkZWZpbmUgQUhDSV9DTURfVEJMX0hEUl9PRkZTRVQgMHgwCisjZGVmaW5lIEFIQ0lfQ01EX1RCTF9TR0xfU1ogICAgIChNVElQX01BWF9TRyAqIHNpemVvZihzdHJ1Y3QgbXRpcF9jbWRfc2cpKQorI2RlZmluZSBBSENJX0NNRF9UQkxfU0dMX09GRlNFVCBBSENJX0NNRF9UQkxfSERSX1NaCisjZGVmaW5lIENNRF9ETUFfQUxMT0NfU1ogICAgICAgIChBSENJX0NNRF9UQkxfU0dMX1NaICsgQUhDSV9DTURfVEJMX0hEUl9TWikKKwogCiAjZGVmaW5lIEhPU1RfQ0FQX05aRE1BCQkoMSA8PCAxOSkKICNkZWZpbmUgSE9TVF9IU09SRwkJMHhGQwpAQCAtODk5LDggKzkyMCw5IEBACiAJCQlmYWlsX3JlYXNvbiA9ICJ0aGVybWFsIHNodXRkb3duIjsKIAkJfQogCQlpZiAoYnVmWzI4OF0gPT0gMHhCRikgeworCQkJc2V0X2JpdChNVElQX0RERl9TRUNfTE9DS19CSVQsICZkZC0+ZGRfZmxhZyk7CiAJCQlkZXZfaW5mbygmZGQtPnBkZXYtPmRldiwKLQkJCQkiRHJpdmUgaW5kaWNhdGVzIHJlYnVpbGQgaGFzIGZhaWxlZC5cbiIpOworCQkJCSJEcml2ZSBpbmRpY2F0ZXMgcmVidWlsZCBoYXMgZmFpbGVkLiBTZWN1cmUgZXJhc2UgcmVxdWlyZWQuXG4iKTsKIAkJCWZhaWxfYWxsX25jcV9jbWRzID0gMTsKIAkJCWZhaWxfcmVhc29uID0gInJlYnVpbGQgZmFpbGVkIjsKIAkJfQpAQCAtMTU2Niw2ICsxNTg4LDEyIEBACiAJfQogI2VuZGlmCiAKKwkvKiBDaGVjayBzZWN1cml0eSBsb2NrZWQgc3RhdGUgKi8KKwlpZiAocG9ydC0+aWRlbnRpZnlbMTI4XSAmIDB4NCkKKwkJc2V0X2JpdChNVElQX0RERl9TRUNfTE9DS19CSVQsICZwb3J0LT5kZC0+ZGRfZmxhZyk7CisJZWxzZQorCQljbGVhcl9iaXQoTVRJUF9EREZfU0VDX0xPQ0tfQklULCAmcG9ydC0+ZGQtPmRkX2ZsYWcpOworCiAjaWZkZWYgTVRJUF9UUklNIC8qIERpc2FibGluZyBUUklNIHN1cHBvcnQgdGVtcG9yYXJpbHkgKi8KIAkvKiBEZW11eCBJRC5EUkFUICYgSUQuUlpBVCB0byBkZXRlcm1pbmUgdHJpbSBzdXBwb3J0ICovCiAJaWYgKHBvcnQtPmlkZW50aWZ5WzY5XSAmICgxIDw8IDE0KSAmJiBwb3J0LT5pZGVudGlmeVs2OV0gJiAoMSA8PCA1KSkKQEAgLTE4ODcsNiArMTkxNSwxMCBAQAogCXN0cmxjcHkoY2J1ZiwgKGNoYXIgKikocG9ydC0+aWRlbnRpZnkrMjcpLCA0MSk7CiAJZGV2X2luZm8oJnBvcnQtPmRkLT5wZGV2LT5kZXYsICJNb2RlbDogJXNcbiIsIGNidWYpOwogCisJZGV2X2luZm8oJnBvcnQtPmRkLT5wZGV2LT5kZXYsICJTZWN1cml0eTogJTA0eCAlc1xuIiwKKwkJcG9ydC0+aWRlbnRpZnlbMTI4XSwKKwkJcG9ydC0+aWRlbnRpZnlbMTI4XSAmIDB4NCA/ICIoTE9DS0VEKSIgOiAiIik7CisKIAlpZiAobXRpcF9od19nZXRfY2FwYWNpdHkocG9ydC0+ZGQsICZzZWN0b3JzKSkKIAkJZGV2X2luZm8oJnBvcnQtPmRkLT5wZGV2LT5kZXYsCiAJCQkiQ2FwYWNpdHk6ICVsbHUgc2VjdG9ycyAoJWxsdSBNQilcbiIsCkBAIC0zMzEzLDYgKzMzNDUsMTE4IEBACiB9CiAKIC8qCisgKiBETUEgcmVnaW9uIHRlYXJkb3duCisgKgorICogQGRkIFBvaW50ZXIgdG8gZHJpdmVyX2RhdGEgc3RydWN0dXJlCisgKgorICogcmV0dXJuIHZhbHVlCisgKiAgICAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQgbXRpcF9kbWFfZnJlZShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRkKQoreworCWludCBpOworCXN0cnVjdCBtdGlwX3BvcnQgKnBvcnQgPSBkZC0+cG9ydDsKKworCWlmIChwb3J0LT5ibG9jazEpCisJCWRtYW1fZnJlZV9jb2hlcmVudCgmZGQtPnBkZXYtPmRldiwgQkxPQ0tfRE1BX0FMTE9DX1NaLAorCQkJCQlwb3J0LT5ibG9jazEsIHBvcnQtPmJsb2NrMV9kbWEpOworCisJaWYgKHBvcnQtPmNvbW1hbmRfbGlzdCkgeworCQlkbWFtX2ZyZWVfY29oZXJlbnQoJmRkLT5wZGV2LT5kZXYsIEFIQ0lfQ01EX1RCTF9TWiwKKwkJCQlwb3J0LT5jb21tYW5kX2xpc3QsIHBvcnQtPmNvbW1hbmRfbGlzdF9kbWEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNVElQX01BWF9DT01NQU5EX1NMT1RTOyBpKyspIHsKKwkJaWYgKHBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmQpCisJCQlkbWFtX2ZyZWVfY29oZXJlbnQoJmRkLT5wZGV2LT5kZXYsIENNRF9ETUFfQUxMT0NfU1osCisJCQkJcG9ydC0+Y29tbWFuZHNbaV0uY29tbWFuZCwKKwkJCQlwb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2RtYSk7CisJfQorfQorCisvKgorICogRE1BIHJlZ2lvbiBzZXR1cAorICoKKyAqIEBkZCBQb2ludGVyIHRvIGRyaXZlcl9kYXRhIHN0cnVjdHVyZQorICoKKyAqIHJldHVybiB2YWx1ZQorICogICAgICAtRU5PTUVNIE5vdCBlbm91Z2ggZnJlZSBETUEgcmVnaW9uIHNwYWNlIHRvIGluaXRpYWxpemUgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgbXRpcF9kbWFfYWxsb2Moc3RydWN0IGRyaXZlcl9kYXRhICpkZCkKK3sKKwlzdHJ1Y3QgbXRpcF9wb3J0ICpwb3J0ID0gZGQtPnBvcnQ7CisJaW50IGksIHJ2ID0gMDsKKwl1MzIgaG9zdF9jYXBfNjQgPSByZWFkbChkZC0+bW1pbyArIEhPU1RfQ0FQKSAmIEhPU1RfQ0FQXzY0OworCisJLyogQWxsb2NhdGUgZG1hIG1lbW9yeSBmb3IgUlggRmlzLCBJZGVudGlmeSwgYW5kIFNlY3RvciBCdWZmZmVyICovCisJcG9ydC0+YmxvY2sxID0KKwkJZG1hbV9hbGxvY19jb2hlcmVudCgmZGQtPnBkZXYtPmRldiwgQkxPQ0tfRE1BX0FMTE9DX1NaLAorCQkJCQkmcG9ydC0+YmxvY2sxX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3J0LT5ibG9jazEpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwb3J0LT5ibG9jazEsIDAsIEJMT0NLX0RNQV9BTExPQ19TWik7CisKKwkvKiBBbGxvY2F0ZSBkbWEgbWVtb3J5IGZvciBjb21tYW5kIGxpc3QgKi8KKwlwb3J0LT5jb21tYW5kX2xpc3QgPQorCQlkbWFtX2FsbG9jX2NvaGVyZW50KCZkZC0+cGRldi0+ZGV2LCBBSENJX0NNRF9UQkxfU1osCisJCQkJCSZwb3J0LT5jb21tYW5kX2xpc3RfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQtPmNvbW1hbmRfbGlzdCkgeworCQlkbWFtX2ZyZWVfY29oZXJlbnQoJmRkLT5wZGV2LT5kZXYsIEJMT0NLX0RNQV9BTExPQ19TWiwKKwkJCQkJcG9ydC0+YmxvY2sxLCBwb3J0LT5ibG9jazFfZG1hKTsKKwkJcG9ydC0+YmxvY2sxID0gTlVMTDsKKwkJcG9ydC0+YmxvY2sxX2RtYSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocG9ydC0+Y29tbWFuZF9saXN0LCAwLCBBSENJX0NNRF9UQkxfU1opOworCisJLyogU2V0dXAgYWxsIHBvaW50ZXJzIGludG8gZmlyc3QgRE1BIHJlZ2lvbiAqLworCXBvcnQtPnJ4ZmlzICAgICAgICAgPSBwb3J0LT5ibG9jazEgKyBBSENJX1JYX0ZJU19PRkZTRVQ7CisJcG9ydC0+cnhmaXNfZG1hICAgICA9IHBvcnQtPmJsb2NrMV9kbWEgKyBBSENJX1JYX0ZJU19PRkZTRVQ7CisJcG9ydC0+aWRlbnRpZnkgICAgICA9IHBvcnQtPmJsb2NrMSArIEFIQ0lfSURGWV9PRkZTRVQ7CisJcG9ydC0+aWRlbnRpZnlfZG1hICA9IHBvcnQtPmJsb2NrMV9kbWEgKyBBSENJX0lERllfT0ZGU0VUOworCXBvcnQtPmxvZ19idWYgICAgICAgPSBwb3J0LT5ibG9jazEgKyBBSENJX1NFQ1RCVUZfT0ZGU0VUOworCXBvcnQtPmxvZ19idWZfZG1hICAgPSBwb3J0LT5ibG9jazFfZG1hICsgQUhDSV9TRUNUQlVGX09GRlNFVDsKKwlwb3J0LT5zbWFydF9idWYgICAgID0gcG9ydC0+YmxvY2sxICsgQUhDSV9TTUFSVEJVRl9PRkZTRVQ7CisJcG9ydC0+c21hcnRfYnVmX2RtYSA9IHBvcnQtPmJsb2NrMV9kbWEgKyBBSENJX1NNQVJUQlVGX09GRlNFVDsKKworCS8qIFNldHVwIHBlciBjb21tYW5kIFNHTCBETUEgcmVnaW9uICovCisKKwkvKiBQb2ludCB0aGUgY29tbWFuZCBoZWFkZXJzIGF0IHRoZSBjb21tYW5kIHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBNVElQX01BWF9DT01NQU5EX1NMT1RTOyBpKyspIHsKKwkJcG9ydC0+Y29tbWFuZHNbaV0uY29tbWFuZCA9CisJCQlkbWFtX2FsbG9jX2NvaGVyZW50KCZkZC0+cGRldi0+ZGV2LCBDTURfRE1BX0FMTE9DX1NaLAorCQkJCSZwb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2RtYSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydC0+Y29tbWFuZHNbaV0uY29tbWFuZCkgeworCQkJcnYgPSAtRU5PTUVNOworCQkJbXRpcF9kbWFfZnJlZShkZCk7CisJCQlyZXR1cm4gcnY7CisJCX0KKwkJbWVtc2V0KHBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmQsIDAsIENNRF9ETUFfQUxMT0NfU1opOworCisJCXBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfaGVhZGVyID0gcG9ydC0+Y29tbWFuZF9saXN0ICsKKwkJCQkJKHNpemVvZihzdHJ1Y3QgbXRpcF9jbWRfaGRyKSAqIGkpOworCQlwb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2hlYWRlcl9kbWEgPQorCQkJCQlkZC0+cG9ydC0+Y29tbWFuZF9saXN0X2RtYSArCisJCQkJCShzaXplb2Yoc3RydWN0IG10aXBfY21kX2hkcikgKiBpKTsKKworCQlpZiAoaG9zdF9jYXBfNjQpCisJCQlwb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2hlYWRlci0+Y3RiYXUgPQorCQkJCV9fZm9yY2VfYml0MmludCBjcHVfdG9fbGUzMigKKwkJCQkocG9ydC0+Y29tbWFuZHNbaV0uY29tbWFuZF9kbWEgPj4gMTYpID4+IDE2KTsKKworCQlwb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2hlYWRlci0+Y3RiYSA9CisJCQkJX19mb3JjZV9iaXQyaW50IGNwdV90b19sZTMyKAorCQkJCXBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfZG1hICYgMHhGRkZGRkZGRik7CisKKwkJc2dfaW5pdF90YWJsZShwb3J0LT5jb21tYW5kc1tpXS5zZywgTVRJUF9NQVhfU0cpOworCisJCS8qIE1hcmsgY29tbWFuZCBhcyBjdXJyZW50bHkgaW5hY3RpdmUgKi8KKwkJYXRvbWljX3NldCgmZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmFjdGl2ZSwgMCk7CisJfQorCXJldHVybiAwOworfQorCisvKgogICogQ2FsbGVkIG9uY2UgZm9yIGVhY2ggY2FyZC4KICAqCiAgKiBAZGQgUG9pbnRlciB0byB0aGUgZHJpdmVyIGRhdGEgc3RydWN0dXJlLgpAQCAtMzM3MCw4MyArMzUxNCwxMCBAQAogCWRkLT5wb3J0LT5tbWlvCT0gZGQtPm1taW8gKyBQT1JUX09GRlNFVDsKIAlkZC0+cG9ydC0+ZGQJPSBkZDsKIAotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbW1hbmQgbGlzdC4gKi8KLQlkZC0+cG9ydC0+Y29tbWFuZF9saXN0ID0KLQkJZG1hbV9hbGxvY19jb2hlcmVudCgmZGQtPnBkZXYtPmRldiwKLQkJCUhXX1BPUlRfUFJJVl9ETUFfU1ogKyAoQVRBX1NFQ1RfU0laRSAqIDQpLAotCQkJJmRkLT5wb3J0LT5jb21tYW5kX2xpc3RfZG1hLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZC0+cG9ydC0+Y29tbWFuZF9saXN0KSB7Ci0JCWRldl9lcnIoJmRkLT5wZGV2LT5kZXYsCi0JCQkiTWVtb3J5IGFsbG9jYXRpb246IGNvbW1hbmQgbGlzdFxuIik7Ci0JCXJ2ID0gLUVOT01FTTsKKwkvKiBETUEgYWxsb2NhdGlvbnMgKi8KKwlydiA9IG10aXBfZG1hX2FsbG9jKGRkKTsKKwlpZiAocnYgPCAwKQogCQlnb3RvIG91dDE7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIG1lbW9yeSB3ZSBoYXZlIGFsbG9jYXRlZC4gKi8KLQltZW1zZXQoZGQtPnBvcnQtPmNvbW1hbmRfbGlzdCwKLQkJMCwKLQkJSFdfUE9SVF9QUklWX0RNQV9TWiArIChBVEFfU0VDVF9TSVpFICogNCkpOwotCi0JLyogU2V0dXAgdGhlIGFkZHJlc3NlIG9mIHRoZSBSWCBGSVMuICovCi0JZGQtPnBvcnQtPnJ4ZmlzCSAgICA9IGRkLT5wb3J0LT5jb21tYW5kX2xpc3QgKyBIV19DTURfU0xPVF9TWjsKLQlkZC0+cG9ydC0+cnhmaXNfZG1hID0gZGQtPnBvcnQtPmNvbW1hbmRfbGlzdF9kbWEgKyBIV19DTURfU0xPVF9TWjsKLQotCS8qIFNldHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBjb21tYW5kIHRhYmxlcy4gKi8KLQlkZC0+cG9ydC0+Y29tbWFuZF90YWJsZQkgID0gZGQtPnBvcnQtPnJ4ZmlzICsgQUhDSV9SWF9GSVNfU1o7Ci0JZGQtPnBvcnQtPmNvbW1hbmRfdGJsX2RtYSA9IGRkLT5wb3J0LT5yeGZpc19kbWEgKyBBSENJX1JYX0ZJU19TWjsKLQotCS8qIFNldHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBpZGVudGlmeSBkYXRhLiAqLwotCWRkLT5wb3J0LT5pZGVudGlmeSAgICAgPSBkZC0+cG9ydC0+Y29tbWFuZF90YWJsZSArCi0JCQkJCUhXX0NNRF9UQkxfQVJfU1o7Ci0JZGQtPnBvcnQtPmlkZW50aWZ5X2RtYSA9IGRkLT5wb3J0LT5jb21tYW5kX3RibF9kbWEgKwotCQkJCQlIV19DTURfVEJMX0FSX1NaOwotCi0JLyogU2V0dXAgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3RvciBidWZmZXIgLSBmb3Igc29tZSBub24tbmNxIGNtZHMgKi8KLQlkZC0+cG9ydC0+c2VjdG9yX2J1ZmZlcgk9ICh2b2lkICopIGRkLT5wb3J0LT5pZGVudGlmeSArIEFUQV9TRUNUX1NJWkU7Ci0JZGQtPnBvcnQtPnNlY3Rvcl9idWZmZXJfZG1hID0gZGQtPnBvcnQtPmlkZW50aWZ5X2RtYSArIEFUQV9TRUNUX1NJWkU7Ci0KLQkvKiBTZXR1cCB0aGUgYWRkcmVzcyBvZiB0aGUgbG9nIGJ1ZiAtIGZvciByZWFkIGxvZyBjb21tYW5kICovCi0JZGQtPnBvcnQtPmxvZ19idWYgPSAodm9pZCAqKWRkLT5wb3J0LT5zZWN0b3JfYnVmZmVyICArIEFUQV9TRUNUX1NJWkU7Ci0JZGQtPnBvcnQtPmxvZ19idWZfZG1hID0gZGQtPnBvcnQtPnNlY3Rvcl9idWZmZXJfZG1hICsgQVRBX1NFQ1RfU0laRTsKLQotCS8qIFNldHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBzbWFydCBidWYgLSBmb3Igc21hcnQgcmVhZCBkYXRhIGNvbW1hbmQgKi8KLQlkZC0+cG9ydC0+c21hcnRfYnVmID0gKHZvaWQgKilkZC0+cG9ydC0+bG9nX2J1ZiAgKyBBVEFfU0VDVF9TSVpFOwotCWRkLT5wb3J0LT5zbWFydF9idWZfZG1hID0gZGQtPnBvcnQtPmxvZ19idWZfZG1hICsgQVRBX1NFQ1RfU0laRTsKLQotCi0JLyogUG9pbnQgdGhlIGNvbW1hbmQgaGVhZGVycyBhdCB0aGUgY29tbWFuZCB0YWJsZXMuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9jb21tYW5kX3Nsb3RzOyBpKyspIHsKLQkJZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfaGVhZGVyID0KLQkJCQkJZGQtPnBvcnQtPmNvbW1hbmRfbGlzdCArCi0JCQkJCShzaXplb2Yoc3RydWN0IG10aXBfY21kX2hkcikgKiBpKTsKLQkJZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfaGVhZGVyX2RtYSA9Ci0JCQkJCWRkLT5wb3J0LT5jb21tYW5kX2xpc3RfZG1hICsKLQkJCQkJKHNpemVvZihzdHJ1Y3QgbXRpcF9jbWRfaGRyKSAqIGkpOwotCi0JCWRkLT5wb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kID0KLQkJCWRkLT5wb3J0LT5jb21tYW5kX3RhYmxlICsgKEhXX0NNRF9UQkxfU1ogKiBpKTsKLQkJZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfZG1hID0KLQkJCWRkLT5wb3J0LT5jb21tYW5kX3RibF9kbWEgKyAoSFdfQ01EX1RCTF9TWiAqIGkpOwotCi0JCWlmIChyZWFkbChkZC0+bW1pbyArIEhPU1RfQ0FQKSAmIEhPU1RfQ0FQXzY0KQotCQkJZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfaGVhZGVyLT5jdGJhdSA9Ci0JCQlfX2ZvcmNlX2JpdDJpbnQgY3B1X3RvX2xlMzIoCi0JCQkoZGQtPnBvcnQtPmNvbW1hbmRzW2ldLmNvbW1hbmRfZG1hID4+IDE2KSA+PiAxNik7Ci0JCWRkLT5wb3J0LT5jb21tYW5kc1tpXS5jb21tYW5kX2hlYWRlci0+Y3RiYSA9Ci0JCQlfX2ZvcmNlX2JpdDJpbnQgY3B1X3RvX2xlMzIoCi0JCQlkZC0+cG9ydC0+Y29tbWFuZHNbaV0uY29tbWFuZF9kbWEgJiAweEZGRkZGRkZGKTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIG5vdCBkb25lLCBhIGJ1ZyBpcyByZXBvcnRlZCBieSB0aGUgc3RvY2sKLQkJICogRkMxMSBpMzg2LiBEdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBoYXMgbG90cyBvZiBrZXJuZWwKLQkJICogZGVidWdnaW5nIGVuYWJsZWQuCi0JCSAqLwotCQlzZ19pbml0X3RhYmxlKGRkLT5wb3J0LT5jb21tYW5kc1tpXS5zZywgTVRJUF9NQVhfU0cpOwotCi0JCS8qIE1hcmsgYWxsIGNvbW1hbmRzIGFzIGN1cnJlbnRseSBpbmFjdGl2ZS4qLwotCQlhdG9taWNfc2V0KCZkZC0+cG9ydC0+Y29tbWFuZHNbaV0uYWN0aXZlLCAwKTsKLQl9CiAKIAkvKiBTZXR1cCB0aGUgcG9pbnRlcnMgdG8gdGhlIGV4dGVuZGVkIHNfYWN0aXZlIGFuZCBDSSByZWdpc3RlcnMuICovCiAJZm9yIChpID0gMDsgaSA8IGRkLT5zbG90X2dyb3VwczsgaSsrKSB7CkBAIC0zNTk0LDEyICszNjY1LDggQEAKIAogb3V0MjoKIAltdGlwX2RlaW5pdF9wb3J0KGRkLT5wb3J0KTsKKwltdGlwX2RtYV9mcmVlKGRkKTsKIAotCS8qIEZyZWUgdGhlIGNvbW1hbmQvY29tbWFuZCBoZWFkZXIgbWVtb3J5LiAqLwotCWRtYW1fZnJlZV9jb2hlcmVudCgmZGQtPnBkZXYtPmRldiwKLQkJCQlIV19QT1JUX1BSSVZfRE1BX1NaICsgKEFUQV9TRUNUX1NJWkUgKiA0KSwKLQkJCQlkZC0+cG9ydC0+Y29tbWFuZF9saXN0LAotCQkJCWRkLT5wb3J0LT5jb21tYW5kX2xpc3RfZG1hKTsKIG91dDE6CiAJLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGZvciBzdHJ1Y3R1cmUuICovCiAJa2ZyZWUoZGQtPnBvcnQpOwpAQCAtMzYyMiw3ICszNjg5LDggQEAKIAkgKiBzYXZlcyBpdHMgc3RhdGUuCiAJICovCiAJaWYgKCFkZC0+c3IpIHsKLQkJaWYgKCF0ZXN0X2JpdChNVElQX0RERl9SRUJVSUxEX0ZBSUxFRF9CSVQsICZkZC0+ZGRfZmxhZykpCisJCWlmICghdGVzdF9iaXQoTVRJUF9QRl9SRUJVSUxEX0JJVCwgJmRkLT5wb3J0LT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChNVElQX0RERl9TRUNfTE9DS19CSVQsICZkZC0+ZGRfZmxhZykpCiAJCQlpZiAobXRpcF9zdGFuZGJ5X2ltbWVkaWF0ZShkZC0+cG9ydCkpCiAJCQkJZGV2X3dhcm4oJmRkLT5wZGV2LT5kZXYsCiAJCQkJCSJTVEFOREJZIElNTUVESUFURSBmYWlsZWRcbiIpOwpAQCAtMzY0MSwxMSArMzcwOSw5IEBACiAJaXJxX3NldF9hZmZpbml0eV9oaW50KGRkLT5wZGV2LT5pcnEsIE5VTEwpOwogCWRldm1fZnJlZV9pcnEoJmRkLT5wZGV2LT5kZXYsIGRkLT5wZGV2LT5pcnEsIGRkKTsKIAotCS8qIEZyZWUgdGhlIGNvbW1hbmQvY29tbWFuZCBoZWFkZXIgbWVtb3J5LiAqLwotCWRtYW1fZnJlZV9jb2hlcmVudCgmZGQtPnBkZXYtPmRldiwKLQkJCUhXX1BPUlRfUFJJVl9ETUFfU1ogKyAoQVRBX1NFQ1RfU0laRSAqIDQpLAotCQkJZGQtPnBvcnQtPmNvbW1hbmRfbGlzdCwKLQkJCWRkLT5wb3J0LT5jb21tYW5kX2xpc3RfZG1hKTsKKwkvKiBGcmVlIGRtYSByZWdpb25zICovCisJbXRpcF9kbWFfZnJlZShkZCk7CisKIAkvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZm9yIHN0cnVjdHVyZS4gKi8KIAlrZnJlZShkZC0+cG9ydCk7CiAJZGQtPnBvcnQgPSBOVUxMOwpAQCAtMzk2Miw4ICs0MDI4LDkgQEAKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRkID0gcXVldWUtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXN0cnVjdCBiaW9fdmVjICpidmVjOwotCWludCBpLCBuZW50cyA9IDA7CisJc3RydWN0IGJpb192ZWMgYnZlYzsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CisJaW50IG5lbnRzID0gMDsKIAlpbnQgdGFnID0gMCwgdW5hbGlnbmVkID0gMDsKIAogCWlmICh1bmxpa2VseShkZC0+ZGRfZmxhZyAmIE1USVBfRERGX1NUT1BfSU8pKSB7CkBAIC0zOTkzLDcgKzQwNjAsNyBAQAogCX0KIAogCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpKSB7Ci0JCWJpb19lbmRpbyhiaW8sIG10aXBfc2VuZF90cmltKGRkLCBiaW8tPmJpX3NlY3RvciwKKwkJYmlvX2VuZGlvKGJpbywgbXRpcF9zZW5kX3RyaW0oZGQsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCiAJCQkJCQliaW9fc2VjdG9ycyhiaW8pKSk7CiAJCXJldHVybjsKIAl9CkBAIC00MDA2LDcgKzQwNzMsOCBAQAogCiAJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFICYmIGJpb19zZWN0b3JzKGJpbykgPD0gNjQgJiYKIAkJCQkJCQlkZC0+dW5hbF9xZGVwdGgpIHsKLQkJaWYgKGJpby0+Ymlfc2VjdG9yICUgOCAhPSAwKSAvKiBVbmFsaWduZWQgb24gNGsgYm91bmRhcmllcyAqLworCQlpZiAoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAlIDggIT0gMCkKKwkJCS8qIFVuYWxpZ25lZCBvbiA0ayBib3VuZGFyaWVzICovCiAJCQl1bmFsaWduZWQgPSAxOwogCQllbHNlIGlmIChiaW9fc2VjdG9ycyhiaW8pICUgOCAhPSAwKSAvKiBBbGlnbmVkIGJ1dCBub3QgNGsvOGsgKi8KIAkJCXVuYWxpZ25lZCA9IDE7CkBAIC00MDI1LDE3ICs0MDkzLDE3IEBACiAJCX0KIAogCQkvKiBDcmVhdGUgdGhlIHNjYXR0ZXIgbGlzdCBmb3IgdGhpcyBiaW8uICovCi0JCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGl0ZXIpIHsKIAkJCXNnX3NldF9wYWdlKCZzZ1tuZW50c10sCi0JCQkJCWJ2ZWMtPmJ2X3BhZ2UsCi0JCQkJCWJ2ZWMtPmJ2X2xlbiwKLQkJCQkJYnZlYy0+YnZfb2Zmc2V0KTsKKwkJCQkJYnZlYy5idl9wYWdlLAorCQkJCQlidmVjLmJ2X2xlbiwKKwkJCQkJYnZlYy5idl9vZmZzZXQpOwogCQkJbmVudHMrKzsKIAkJfQogCiAJCS8qIElzc3VlIHRoZSByZWFkL3dyaXRlLiAqLwogCQltdGlwX2h3X3N1Ym1pdF9pbyhkZCwKLQkJCQliaW8tPmJpX3NlY3RvciwKKwkJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJCWJpb19zZWN0b3JzKGJpbyksCiAJCQkJbmVudHMsCiAJCQkJdGFnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oCmluZGV4IDliZTdhMTUuLmI1MmU5YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguaAorKysgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmgKQEAgLTY5LDcgKzY5LDcgQEAKICAqIE1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIgZ2F0aGVyIGVudHJpZXMKICAqIGEgc2luZ2xlIGNvbW1hbmQgbWF5IGhhdmUuCiAgKi8KLSNkZWZpbmUgTVRJUF9NQVhfU0cJCTEyOAorI2RlZmluZSBNVElQX01BWF9TRwkJNTA0CiAKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBzbG90IGdyb3VwcyAoQ29tbWFuZCBJc3N1ZSAmIHNfYWN0aXZlIHJlZ2lzdGVycykKQEAgLTkyLDcgKzkyLDcgQEAKIAogLyogRHJpdmVyIG5hbWUgYW5kIHZlcnNpb24gc3RyaW5ncyAqLwogI2RlZmluZSBNVElQX0RSVl9OQU1FCQkibXRpcDMyeHgiCi0jZGVmaW5lIE1USVBfRFJWX1ZFUlNJT04JIjEuMi42b3MzIgorI2RlZmluZSBNVElQX0RSVl9WRVJTSU9OCSIxLjMuMCIKIAogLyogTWF4aW11bSBudW1iZXIgb2YgbWlub3IgZGV2aWNlIG51bWJlcnMgcGVyIGRldmljZS4gKi8KICNkZWZpbmUgTVRJUF9NQVhfTUlOT1JTCQkxNgpAQCAtMzkxLDE1ICszOTEsMTMgQEAKIAkgKi8KIAlkbWFfYWRkcl90IHJ4ZmlzX2RtYTsKIAkvKgotCSAqIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tbWFuZCB0YWJsZSBtZW1vcnkgYXMgdXNlZAotCSAqIGJ5IHRoZSBkcml2ZXIuCisJICogUG9pbnRlciB0byB0aGUgRE1BIHJlZ2lvbiBmb3IgUlggRmlzLCBJZGVudGlmeSwgUkxFMTAsIGFuZCBTTUFSVAogCSAqLwotCXZvaWQgKmNvbW1hbmRfdGFibGU7CisJdm9pZCAqYmxvY2sxOwogCS8qCi0JICogUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21tYW5kIHRhYmxlIG1lbW9yeSBhcyB1c2VkCi0JICogYnkgdGhlIERNQS4KKwkgKiBETUEgYWRkcmVzcyBvZiByZWdpb24gZm9yIFJYIEZpcywgSWRlbnRpZnksIFJMRTEwLCBhbmQgU01BUlQKIAkgKi8KLQlkbWFfYWRkcl90IGNvbW1hbmRfdGJsX2RtYTsKKwlkbWFfYWRkcl90IGJsb2NrMV9kbWE7CiAJLyoKIAkgKiBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlkZW50aWZ5IGRhdGEgbWVtb3J5IGFzIHVzZWQKIAkgKiBieSB0aGUgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggMmRjM2I1MS4uNTUyOThkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0yNzEsMTggKzI3MSwxOCBAQAogCiAJaWYgKG5iZF9jbWQocmVxKSA9PSBOQkRfQ01EX1dSSVRFKSB7CiAJCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQkJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CiAJCS8qCiAJCSAqIHdlIGFyZSByZWFsbHkgcHJvYmluZyBhdCBpbnRlcm5hbHMgdG8gZGV0ZXJtaW5lCiAJCSAqIHdoZXRoZXIgdG8gc2V0IE1TR19NT1JFIG9yIG5vdC4uLgogCQkgKi8KIAkJcnFfZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEsIGl0ZXIpIHsKIAkJCWZsYWdzID0gMDsKLQkJCWlmICghcnFfaXRlcl9sYXN0KHJlcSwgaXRlcikpCisJCQlpZiAoIXJxX2l0ZXJfbGFzdChidmVjLCBpdGVyKSkKIAkJCQlmbGFncyA9IE1TR19NT1JFOwogCQkJZHByaW50ayhEQkdfVFgsICIlczogcmVxdWVzdCAlcDogc2VuZGluZyAlZCBieXRlcyBkYXRhXG4iLAotCQkJCQluYmQtPmRpc2stPmRpc2tfbmFtZSwgcmVxLCBidmVjLT5idl9sZW4pOwotCQkJcmVzdWx0ID0gc29ja19zZW5kX2J2ZWMobmJkLCBidmVjLCBmbGFncyk7CisJCQkJCW5iZC0+ZGlzay0+ZGlza19uYW1lLCByZXEsIGJ2ZWMuYnZfbGVuKTsKKwkJCXJlc3VsdCA9IHNvY2tfc2VuZF9idmVjKG5iZCwgJmJ2ZWMsIGZsYWdzKTsKIAkJCWlmIChyZXN1bHQgPD0gMCkgewogCQkJCWRldl9lcnIoZGlza190b19kZXYobmJkLT5kaXNrKSwKIAkJCQkJIlNlbmQgZGF0YSBmYWlsZWQgKHJlc3VsdCAlZClcbiIsCkBAIC0zNzgsMTAgKzM3OCwxMCBAQAogCQkJbmJkLT5kaXNrLT5kaXNrX25hbWUsIHJlcSk7CiAJaWYgKG5iZF9jbWQocmVxKSA9PSBOQkRfQ01EX1JFQUQpIHsKIAkJc3RydWN0IHJlcV9pdGVyYXRvciBpdGVyOwotCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwkJc3RydWN0IGJpb192ZWMgYnZlYzsKIAogCQlycV9mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIHJlcSwgaXRlcikgewotCQkJcmVzdWx0ID0gc29ja19yZWN2X2J2ZWMobmJkLCBidmVjKTsKKwkJCXJlc3VsdCA9IHNvY2tfcmVjdl9idmVjKG5iZCwgJmJ2ZWMpOwogCQkJaWYgKHJlc3VsdCA8PSAwKSB7CiAJCQkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLCAiUmVjZWl2ZSBkYXRhIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKIAkJCQkJcmVzdWx0KTsKQEAgLTM4OSw3ICszODksNyBAQAogCQkJCXJldHVybiByZXE7CiAJCQl9CiAJCQlkcHJpbnRrKERCR19SWCwgIiVzOiByZXF1ZXN0ICVwOiBnb3QgJWQgYnl0ZXMgZGF0YVxuIiwKLQkJCQluYmQtPmRpc2stPmRpc2tfbmFtZSwgcmVxLCBidmVjLT5idl9sZW4pOworCQkJCW5iZC0+ZGlzay0+ZGlza19uYW1lLCByZXEsIGJ2ZWMuYnZfbGVuKTsKIAkJfQogCX0KIAlyZXR1cm4gcmVxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9udWxsX2Jsay5jIGIvZHJpdmVycy9ibG9jay9udWxsX2Jsay5jCmluZGV4IDgzYTU5OGUuLjMxMDcyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbnVsbF9ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL251bGxfYmxrLmMKQEAgLTYxNiw2ICs2MTYsMTEgQEAKIAkJaXJxbW9kZSA9IE5VTExfSVJRX05PTkU7CiAJfQogI2VuZGlmCisJaWYgKGJzID4gUEFHRV9TSVpFKSB7CisJCXByX3dhcm4oIm51bGxfYmxrOiBpbnZhbGlkIGJsb2NrIHNpemVcbiIpOworCQlwcl93YXJuKCJudWxsX2JsazogZGVmYXVsdHMgYmxvY2sgc2l6ZSB0byAlbHVcbiIsIFBBR0VfU0laRSk7CisJCWJzID0gUEFHRV9TSVpFOworCX0KIAogCWlmIChxdWV1ZV9tb2RlID09IE5VTExfUV9NUSAmJiB1c2VfcGVyX25vZGVfaGN0eCkgewogCQlpZiAoc3VibWl0X3F1ZXVlcyA8IG5yX29ubGluZV9ub2RlcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYyBiL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMKaW5kZXggMjZkMDNmYS4uNTE4MjRkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYworKysgYi9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jCkBAIC00Niw3ICs0Niw2IEBACiAjZGVmaW5lIE5WTUVfUV9ERVBUSCAxMDI0CiAjZGVmaW5lIFNRX1NJWkUoZGVwdGgpCQkoZGVwdGggKiBzaXplb2Yoc3RydWN0IG52bWVfY29tbWFuZCkpCiAjZGVmaW5lIENRX1NJWkUoZGVwdGgpCQkoZGVwdGggKiBzaXplb2Yoc3RydWN0IG52bWVfY29tcGxldGlvbikpCi0jZGVmaW5lIE5WTUVfTUlOT1JTIDY0CiAjZGVmaW5lIEFETUlOX1RJTUVPVVQJKDYwICogSFopCiAKIHN0YXRpYyBpbnQgbnZtZV9tYWpvcjsKQEAgLTU4LDYgKzU3LDE3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldl9saXN0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRChkZXZfbGlzdCk7CiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpudm1lX3RocmVhZDsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbnZtZV93b3JrcTsKKworc3RhdGljIHZvaWQgbnZtZV9yZXNldF9mYWlsZWRfZGV2KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOworCitzdHJ1Y3QgYXN5bmNfY21kX2luZm8geworCXN0cnVjdCBrdGhyZWFkX3dvcmsgd29yazsKKwlzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjsKKwl1MzIgcmVzdWx0OworCWludCBzdGF0dXM7CisJdm9pZCAqY3R4OworfTsKIAogLyoKICAqIEFuIE5WTSBFeHByZXNzIHF1ZXVlLiAgRWFjaCBkZXZpY2UgaGFzIGF0IGxlYXN0IHR3byAob25lIGZvciBhZG1pbgpAQCAtNjYsNiArNzYsNyBAQAogc3RydWN0IG52bWVfcXVldWUgewogCXN0cnVjdCBkZXZpY2UgKnFfZG1hZGV2OwogCXN0cnVjdCBudm1lX2RldiAqZGV2OworCWNoYXIgaXJxbmFtZVsyNF07CS8qIG52bWU0Mjk0OTY3Mjk1LTY1NTM1XDAgKi8KIAlzcGlubG9ja190IHFfbG9jazsKIAlzdHJ1Y3QgbnZtZV9jb21tYW5kICpzcV9jbWRzOwogCXZvbGF0aWxlIHN0cnVjdCBudm1lX2NvbXBsZXRpb24gKmNxZXM7CkBAIC04MCw5ICs5MSwxMSBAQAogCXUxNiBzcV9oZWFkOwogCXUxNiBzcV90YWlsOwogCXUxNiBjcV9oZWFkOworCXUxNiBxaWQ7CiAJdTggY3FfcGhhc2U7CiAJdTggY3FlX3NlZW47CiAJdTggcV9zdXNwZW5kZWQ7CisJc3RydWN0IGFzeW5jX2NtZF9pbmZvIGNtZGluZm87CiAJdW5zaWduZWQgbG9uZyBjbWRpZF9kYXRhW107CiB9OwogCkBAIC05Nyw2ICsxMTAsNyBAQAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IG52bWVfZGVsZXRlX3F1ZXVlKSAhPSA2NCk7CiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbnZtZV9mZWF0dXJlcykgIT0gNjQpOwogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IG52bWVfZm9ybWF0X2NtZCkgIT0gNjQpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IG52bWVfYWJvcnRfY21kKSAhPSA2NCk7CiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbnZtZV9jb21tYW5kKSAhPSA2NCk7CiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbnZtZV9pZF9jdHJsKSAhPSA0MDk2KTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBudm1lX2lkX25zKSAhPSA0MDk2KTsKQEAgLTExMSw2ICsxMjUsNyBAQAogCW52bWVfY29tcGxldGlvbl9mbiBmbjsKIAl2b2lkICpjdHg7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBhYm9ydGVkOwogfTsKIAogc3RhdGljIHN0cnVjdCBudm1lX2NtZF9pbmZvICpudm1lX2NtZF9pbmZvKHN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSkKQEAgLTE1NCw2ICsxNjksNyBAQAogCWluZm9bY21kaWRdLmZuID0gaGFuZGxlcjsKIAlpbmZvW2NtZGlkXS5jdHggPSBjdHg7CiAJaW5mb1tjbWRpZF0udGltZW91dCA9IGppZmZpZXMgKyB0aW1lb3V0OworCWluZm9bY21kaWRdLmFib3J0ZWQgPSAwOwogCXJldHVybiBjbWRpZDsKIH0KIApAQCAtMTcyLDYgKzE4OCw3IEBACiAjZGVmaW5lIENNRF9DVFhfQ09NUExFVEVECSgweDMxMCArIENNRF9DVFhfQkFTRSkKICNkZWZpbmUgQ01EX0NUWF9JTlZBTElECQkoMHgzMTQgKyBDTURfQ1RYX0JBU0UpCiAjZGVmaW5lIENNRF9DVFhfRkxVU0gJCSgweDMxOCArIENNRF9DVFhfQkFTRSkKKyNkZWZpbmUgQ01EX0NUWF9BQk9SVAkJKDB4MzFDICsgQ01EX0NUWF9CQVNFKQogCiBzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbXBsZXRpb24oc3RydWN0IG52bWVfZGV2ICpkZXYsIHZvaWQgKmN0eCwKIAkJCQkJCXN0cnVjdCBudm1lX2NvbXBsZXRpb24gKmNxZSkKQEAgLTE4MCw2ICsxOTcsMTAgQEAKIAkJcmV0dXJuOwogCWlmIChjdHggPT0gQ01EX0NUWF9GTFVTSCkKIAkJcmV0dXJuOworCWlmIChjdHggPT0gQ01EX0NUWF9BQk9SVCkgeworCQkrK2Rldi0+YWJvcnRfbGltaXQ7CisJCXJldHVybjsKKwl9CiAJaWYgKGN0eCA9PSBDTURfQ1RYX0NPTVBMRVRFRCkgewogCQlkZXZfd2FybigmZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkJImNvbXBsZXRlZCBpZCAlZCB0d2ljZSBvbiBxdWV1ZSAlZFxuIiwKQEAgLTE5Niw2ICsyMTcsMTUgQEAKIAlkZXZfd2FybigmZGV2LT5wY2lfZGV2LT5kZXYsICJVbmtub3duIHNwZWNpYWwgY29tcGxldGlvbiAlcFxuIiwgY3R4KTsKIH0KIAorc3RhdGljIHZvaWQgYXN5bmNfY29tcGxldGlvbihzdHJ1Y3QgbnZtZV9kZXYgKmRldiwgdm9pZCAqY3R4LAorCQkJCQkJc3RydWN0IG52bWVfY29tcGxldGlvbiAqY3FlKQoreworCXN0cnVjdCBhc3luY19jbWRfaW5mbyAqY21kaW5mbyA9IGN0eDsKKwljbWRpbmZvLT5yZXN1bHQgPSBsZTMyX3RvX2NwdXAoJmNxZS0+cmVzdWx0KTsKKwljbWRpbmZvLT5zdGF0dXMgPSBsZTE2X3RvX2NwdXAoJmNxZS0+c3RhdHVzKSA+PiAxOworCXF1ZXVlX2t0aHJlYWRfd29yayhjbWRpbmZvLT53b3JrZXIsICZjbWRpbmZvLT53b3JrKTsKK30KKwogLyoKICAqIENhbGxlZCB3aXRoIGxvY2FsIGludGVycnVwdHMgZGlzYWJsZWQgYW5kIHRoZSBxX2xvY2sgaGVsZC4gIE1heSBub3Qgc2xlZXAuCiAgKi8KQEAgLTQ0MSwxMDQgKzQ3MSwxOSBAQAogCXJldHVybiB0b3RhbF9sZW47CiB9CiAKLXN0cnVjdCBudm1lX2Jpb19wYWlyIHsKLQlzdHJ1Y3QgYmlvIGIxLCBiMiwgKnBhcmVudDsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnYxLCAqYnYyOwotCWludCBlcnI7Ci0JYXRvbWljX3QgY250OwotfTsKLQotc3RhdGljIHZvaWQgbnZtZV9iaW9fcGFpcl9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCi17Ci0Jc3RydWN0IG52bWVfYmlvX3BhaXIgKmJwID0gYmlvLT5iaV9wcml2YXRlOwotCi0JaWYgKGVycikKLQkJYnAtPmVyciA9IGVycjsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZicC0+Y250KSkgewotCQliaW9fZW5kaW8oYnAtPnBhcmVudCwgYnAtPmVycik7Ci0JCWtmcmVlKGJwLT5idjEpOwotCQlrZnJlZShicC0+YnYyKTsKLQkJa2ZyZWUoYnApOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBudm1lX2Jpb19wYWlyICpudm1lX2Jpb19zcGxpdChzdHJ1Y3QgYmlvICpiaW8sIGludCBpZHgsCi0JCQkJCQkJaW50IGxlbiwgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgbnZtZV9iaW9fcGFpciAqYnA7Ci0KLQlCVUdfT04obGVuID4gYmlvLT5iaV9zaXplKTsKLQlCVUdfT04oaWR4ID4gYmlvLT5iaV92Y250KTsKLQotCWJwID0ga21hbGxvYyhzaXplb2YoKmJwKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFicCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnAtPmVyciA9IDA7Ci0KLQlicC0+YjEgPSAqYmlvOwotCWJwLT5iMiA9ICpiaW87Ci0KLQlicC0+YjEuYmlfc2l6ZSA9IGxlbjsKLQlicC0+YjIuYmlfc2l6ZSAtPSBsZW47Ci0JYnAtPmIxLmJpX3ZjbnQgPSBpZHg7Ci0JYnAtPmIyLmJpX2lkeCA9IGlkeDsKLQlicC0+YjIuYmlfc2VjdG9yICs9IGxlbiA+PiA5OwotCi0JaWYgKG9mZnNldCkgewotCQlicC0+YnYxID0ga21hbGxvYyhiaW8tPmJpX21heF92ZWNzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwKLQkJCQkJCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYnAtPmJ2MSkKLQkJCWdvdG8gc3BsaXRfZmFpbF8xOwotCi0JCWJwLT5idjIgPSBrbWFsbG9jKGJpby0+YmlfbWF4X3ZlY3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpLAotCQkJCQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFicC0+YnYyKQotCQkJZ290byBzcGxpdF9mYWlsXzI7Ci0KLQkJbWVtY3B5KGJwLT5idjEsIGJpby0+YmlfaW9fdmVjLAotCQkJYmlvLT5iaV9tYXhfdmVjcyAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOwotCQltZW1jcHkoYnAtPmJ2MiwgYmlvLT5iaV9pb192ZWMsCi0JCQliaW8tPmJpX21heF92ZWNzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7Ci0KLQkJYnAtPmIxLmJpX2lvX3ZlYyA9IGJwLT5idjE7Ci0JCWJwLT5iMi5iaV9pb192ZWMgPSBicC0+YnYyOwotCQlicC0+YjIuYmlfaW9fdmVjW2lkeF0uYnZfb2Zmc2V0ICs9IG9mZnNldDsKLQkJYnAtPmIyLmJpX2lvX3ZlY1tpZHhdLmJ2X2xlbiAtPSBvZmZzZXQ7Ci0JCWJwLT5iMS5iaV9pb192ZWNbaWR4XS5idl9sZW4gPSBvZmZzZXQ7Ci0JCWJwLT5iMS5iaV92Y250Kys7Ci0JfSBlbHNlCi0JCWJwLT5idjEgPSBicC0+YnYyID0gTlVMTDsKLQotCWJwLT5iMS5iaV9wcml2YXRlID0gYnA7Ci0JYnAtPmIyLmJpX3ByaXZhdGUgPSBicDsKLQotCWJwLT5iMS5iaV9lbmRfaW8gPSBudm1lX2Jpb19wYWlyX2VuZGlvOwotCWJwLT5iMi5iaV9lbmRfaW8gPSBudm1lX2Jpb19wYWlyX2VuZGlvOwotCi0JYnAtPnBhcmVudCA9IGJpbzsKLQlhdG9taWNfc2V0KCZicC0+Y250LCAyKTsKLQotCXJldHVybiBicDsKLQotIHNwbGl0X2ZhaWxfMjoKLQlrZnJlZShicC0+YnYxKTsKLSBzcGxpdF9mYWlsXzE6Ci0Ja2ZyZWUoYnApOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50IG52bWVfc3BsaXRfYW5kX3N1Ym1pdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSwKLQkJCQkJCWludCBpZHgsIGludCBsZW4sIGludCBvZmZzZXQpCisJCQkJIGludCBsZW4pCiB7Ci0Jc3RydWN0IG52bWVfYmlvX3BhaXIgKmJwID0gbnZtZV9iaW9fc3BsaXQoYmlvLCBpZHgsIGxlbiwgb2Zmc2V0KTsKLQlpZiAoIWJwKQorCXN0cnVjdCBiaW8gKnNwbGl0ID0gYmlvX3NwbGl0KGJpbywgbGVuID4+IDksIEdGUF9BVE9NSUMsIE5VTEwpOworCWlmICghc3BsaXQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJYmlvX2NoYWluKHNwbGl0LCBiaW8pOworCiAJaWYgKGJpb19saXN0X2VtcHR5KCZudm1lcS0+c3FfY29uZykpCiAJCWFkZF93YWl0X3F1ZXVlKCZudm1lcS0+c3FfZnVsbCwgJm52bWVxLT5zcV9jb25nX3dhaXQpOwotCWJpb19saXN0X2FkZCgmbnZtZXEtPnNxX2NvbmcsICZicC0+YjEpOwotCWJpb19saXN0X2FkZCgmbnZtZXEtPnNxX2NvbmcsICZicC0+YjIpOworCWJpb19saXN0X2FkZCgmbnZtZXEtPnNxX2NvbmcsIHNwbGl0KTsKKwliaW9fbGlzdF9hZGQoJm52bWVxLT5zcV9jb25nLCBiaW8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTAsNDEgKzQ5NSw0NCBAQAogc3RhdGljIGludCBudm1lX21hcF9iaW8oc3RydWN0IG52bWVfcXVldWUgKm52bWVxLCBzdHJ1Y3QgbnZtZV9pb2QgKmlvZCwKIAkJc3RydWN0IGJpbyAqYmlvLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyLCBpbnQgcHNlZ3MpCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMsICpidnBydiA9IE5VTEw7CisJc3RydWN0IGJpb192ZWMgYnZlYywgYnZwcnY7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOwotCWludCBpLCBsZW5ndGggPSAwLCBuc2VncyA9IDAsIHNwbGl0X2xlbiA9IGJpby0+Ymlfc2l6ZTsKKwlpbnQgbGVuZ3RoID0gMCwgbnNlZ3MgPSAwLCBzcGxpdF9sZW4gPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKKwlpbnQgZmlyc3QgPSAxOwogCiAJaWYgKG52bWVxLT5kZXYtPnN0cmlwZV9zaXplKQogCQlzcGxpdF9sZW4gPSBudm1lcS0+ZGV2LT5zdHJpcGVfc2l6ZSAtCi0JCQkoKGJpby0+Ymlfc2VjdG9yIDw8IDkpICYgKG52bWVxLT5kZXYtPnN0cmlwZV9zaXplIC0gMSkpOworCQkJKChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDkpICYKKwkJCSAobnZtZXEtPmRldi0+c3RyaXBlX3NpemUgLSAxKSk7CiAKIAlzZ19pbml0X3RhYmxlKGlvZC0+c2csIHBzZWdzKTsKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKLQkJaWYgKGJ2cHJ2ICYmIEJJT1ZFQ19QSFlTX01FUkdFQUJMRShidnBydiwgYnZlYykpIHsKLQkJCXNnLT5sZW5ndGggKz0gYnZlYy0+YnZfbGVuOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgeworCQlpZiAoIWZpcnN0ICYmIEJJT1ZFQ19QSFlTX01FUkdFQUJMRSgmYnZwcnYsICZidmVjKSkgeworCQkJc2ctPmxlbmd0aCArPSBidmVjLmJ2X2xlbjsKIAkJfSBlbHNlIHsKLQkJCWlmIChidnBydiAmJiBCSU9WRUNfTk9UX1ZJUlRfTUVSR0VBQkxFKGJ2cHJ2LCBidmVjKSkKLQkJCQlyZXR1cm4gbnZtZV9zcGxpdF9hbmRfc3VibWl0KGJpbywgbnZtZXEsIGksCi0JCQkJCQkJCWxlbmd0aCwgMCk7CisJCQlpZiAoIWZpcnN0ICYmIEJJT1ZFQ19OT1RfVklSVF9NRVJHRUFCTEUoJmJ2cHJ2LCAmYnZlYykpCisJCQkJcmV0dXJuIG52bWVfc3BsaXRfYW5kX3N1Ym1pdChiaW8sIG52bWVxLAorCQkJCQkJCSAgICAgbGVuZ3RoKTsKIAogCQkJc2cgPSBzZyA/IHNnICsgMSA6IGlvZC0+c2c7Ci0JCQlzZ19zZXRfcGFnZShzZywgYnZlYy0+YnZfcGFnZSwgYnZlYy0+YnZfbGVuLAotCQkJCQkJCWJ2ZWMtPmJ2X29mZnNldCk7CisJCQlzZ19zZXRfcGFnZShzZywgYnZlYy5idl9wYWdlLAorCQkJCSAgICBidmVjLmJ2X2xlbiwgYnZlYy5idl9vZmZzZXQpOwogCQkJbnNlZ3MrKzsKIAkJfQogCi0JCWlmIChzcGxpdF9sZW4gLSBsZW5ndGggPCBidmVjLT5idl9sZW4pCi0JCQlyZXR1cm4gbnZtZV9zcGxpdF9hbmRfc3VibWl0KGJpbywgbnZtZXEsIGksIHNwbGl0X2xlbiwKLQkJCQkJCQlzcGxpdF9sZW4gLSBsZW5ndGgpOwotCQlsZW5ndGggKz0gYnZlYy0+YnZfbGVuOworCQlpZiAoc3BsaXRfbGVuIC0gbGVuZ3RoIDwgYnZlYy5idl9sZW4pCisJCQlyZXR1cm4gbnZtZV9zcGxpdF9hbmRfc3VibWl0KGJpbywgbnZtZXEsIHNwbGl0X2xlbik7CisJCWxlbmd0aCArPSBidmVjLmJ2X2xlbjsKIAkJYnZwcnYgPSBidmVjOworCQlmaXJzdCA9IDA7CiAJfQogCWlvZC0+bmVudHMgPSBuc2VnczsKIAlzZ19tYXJrX2VuZChzZyk7CiAJaWYgKGRtYV9tYXBfc2cobnZtZXEtPnFfZG1hZGV2LCBpb2QtPnNnLCBpb2QtPm5lbnRzLCBkbWFfZGlyKSA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCUJVR19PTihsZW5ndGggIT0gYmlvLT5iaV9zaXplKTsKKwlCVUdfT04obGVuZ3RoICE9IGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCkBAIC02MDgsOCArNTU2LDggQEAKIAlpb2QtPm5wYWdlcyA9IDA7CiAKIAlyYW5nZS0+Y2F0dHIgPSBjcHVfdG9fbGUzMigwKTsKLQlyYW5nZS0+bmxiID0gY3B1X3RvX2xlMzIoYmlvLT5iaV9zaXplID4+IG5zLT5sYmFfc2hpZnQpOwotCXJhbmdlLT5zbGJhID0gY3B1X3RvX2xlNjQobnZtZV9ibG9ja19ucihucywgYmlvLT5iaV9zZWN0b3IpKTsKKwlyYW5nZS0+bmxiID0gY3B1X3RvX2xlMzIoYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gbnMtPmxiYV9zaGlmdCk7CisJcmFuZ2UtPnNsYmEgPSBjcHVfdG9fbGU2NChudm1lX2Jsb2NrX25yKG5zLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSk7CiAKIAltZW1zZXQoY21uZCwgMCwgc2l6ZW9mKCpjbW5kKSk7CiAJY21uZC0+ZHNtLm9wY29kZSA9IG52bWVfY21kX2RzbTsKQEAgLTY3NCw3ICs2MjIsNyBAQAogCX0KIAogCXJlc3VsdCA9IC1FTk9NRU07Ci0JaW9kID0gbnZtZV9hbGxvY19pb2QocHNlZ3MsIGJpby0+Ymlfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaW9kID0gbnZtZV9hbGxvY19pb2QocHNlZ3MsIGJpby0+YmlfaXRlci5iaV9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWlvZCkKIAkJZ290byBub21lbTsKIAlpb2QtPnByaXZhdGUgPSBiaW87CkBAIC03MjMsNyArNjcxLDcgQEAKIAljbW5kLT5ydy5uc2lkID0gY3B1X3RvX2xlMzIobnMtPm5zX2lkKTsKIAlsZW5ndGggPSBudm1lX3NldHVwX3BycHMobnZtZXEtPmRldiwgJmNtbmQtPmNvbW1vbiwgaW9kLCBsZW5ndGgsCiAJCQkJCQkJCUdGUF9BVE9NSUMpOwotCWNtbmQtPnJ3LnNsYmEgPSBjcHVfdG9fbGU2NChudm1lX2Jsb2NrX25yKG5zLCBiaW8tPmJpX3NlY3RvcikpOworCWNtbmQtPnJ3LnNsYmEgPSBjcHVfdG9fbGU2NChudm1lX2Jsb2NrX25yKG5zLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSk7CiAJY21uZC0+cncubGVuZ3RoID0gY3B1X3RvX2xlMTYoKGxlbmd0aCA+PiBucy0+bGJhX3NoaWZ0KSAtIDEpOwogCWNtbmQtPnJ3LmNvbnRyb2wgPSBjcHVfdG9fbGUxNihjb250cm9sKTsKIAljbW5kLT5ydy5kc21nbXQgPSBjcHVfdG9fbGUzMihkc21nbXQpOwpAQCAtNzc1LDcgKzcyMyw3IEBACiAJaWYgKGhlYWQgPT0gbnZtZXEtPmNxX2hlYWQgJiYgcGhhc2UgPT0gbnZtZXEtPmNxX3BoYXNlKQogCQlyZXR1cm4gMDsKIAotCXdyaXRlbChoZWFkLCBudm1lcS0+cV9kYiArICgxIDw8IG52bWVxLT5kZXYtPmRiX3N0cmlkZSkpOworCXdyaXRlbChoZWFkLCBudm1lcS0+cV9kYiArIG52bWVxLT5kZXYtPmRiX3N0cmlkZSk7CiAJbnZtZXEtPmNxX2hlYWQgPSBoZWFkOwogCW52bWVxLT5jcV9waGFzZSA9IHBoYXNlOwogCkBAIC04ODYsMTIgKzgzNCwzNCBAQAogCXJldHVybiBjbWRpbmZvLnN0YXR1czsKIH0KIAorc3RhdGljIGludCBudm1lX3N1Ym1pdF9hc3luY19jbWQoc3RydWN0IG52bWVfcXVldWUgKm52bWVxLAorCQkJc3RydWN0IG52bWVfY29tbWFuZCAqY21kLAorCQkJc3RydWN0IGFzeW5jX2NtZF9pbmZvICpjbWRpbmZvLCB1bnNpZ25lZCB0aW1lb3V0KQoreworCWludCBjbWRpZDsKKworCWNtZGlkID0gYWxsb2NfY21kaWRfa2lsbGFibGUobnZtZXEsIGNtZGluZm8sIGFzeW5jX2NvbXBsZXRpb24sIHRpbWVvdXQpOworCWlmIChjbWRpZCA8IDApCisJCXJldHVybiBjbWRpZDsKKwljbWRpbmZvLT5zdGF0dXMgPSAtRUlOVFI7CisJY21kLT5jb21tb24uY29tbWFuZF9pZCA9IGNtZGlkOworCW52bWVfc3VibWl0X2NtZChudm1lcSwgY21kKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IG52bWVfc3VibWl0X2FkbWluX2NtZChzdHJ1Y3QgbnZtZV9kZXYgKmRldiwgc3RydWN0IG52bWVfY29tbWFuZCAqY21kLAogCQkJCQkJCQl1MzIgKnJlc3VsdCkKIHsKIAlyZXR1cm4gbnZtZV9zdWJtaXRfc3luY19jbWQoZGV2LT5xdWV1ZXNbMF0sIGNtZCwgcmVzdWx0LCBBRE1JTl9USU1FT1VUKTsKIH0KIAorc3RhdGljIGludCBudm1lX3N1Ym1pdF9hZG1pbl9jbWRfYXN5bmMoc3RydWN0IG52bWVfZGV2ICpkZXYsCisJCXN0cnVjdCBudm1lX2NvbW1hbmQgKmNtZCwgc3RydWN0IGFzeW5jX2NtZF9pbmZvICpjbWRpbmZvKQoreworCXJldHVybiBudm1lX3N1Ym1pdF9hc3luY19jbWQoZGV2LT5xdWV1ZXNbMF0sIGNtZCwgY21kaW5mbywKKwkJCQkJCQkJQURNSU5fVElNRU9VVCk7Cit9CisKIHN0YXRpYyBpbnQgYWRhcHRlcl9kZWxldGVfcXVldWUoc3RydWN0IG52bWVfZGV2ICpkZXYsIHU4IG9wY29kZSwgdTE2IGlkKQogewogCWludCBzdGF0dXM7CkBAIC0xMDAyLDYgKzk3Miw1NiBAQAogfQogCiAvKioKKyAqIG52bWVfYWJvcnRfY21kIC0gQXR0ZW1wdCBhYm9ydGluZyBhIGNvbW1hbmQKKyAqIEBjbWRpZDogQ29tbWFuZCBpZCBvZiBhIHRpbWVkIG91dCBJTworICogQHF1ZXVlOiBUaGUgcXVldWUgd2l0aCB0aW1lZCBvdXQgSU8KKyAqCisgKiBTY2hlZHVsZSBjb250cm9sbGVyIHJlc2V0IGlmIHRoZSBjb21tYW5kIHdhcyBhbHJlYWR5IGFib3J0ZWQgb25jZSBiZWZvcmUgYW5kCisgKiBzdGlsbCBoYXNuJ3QgYmVlbiByZXR1cm5lZCB0byB0aGUgZHJpdmVyLCBvciBpZiB0aGlzIGlzIHRoZSBhZG1pbiBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgbnZtZV9hYm9ydF9jbWQoaW50IGNtZGlkLCBzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEpCit7CisJaW50IGFfY21kaWQ7CisJc3RydWN0IG52bWVfY29tbWFuZCBjbWQ7CisJc3RydWN0IG52bWVfZGV2ICpkZXYgPSBudm1lcS0+ZGV2OworCXN0cnVjdCBudm1lX2NtZF9pbmZvICppbmZvID0gbnZtZV9jbWRfaW5mbyhudm1lcSk7CisKKwlpZiAoIW52bWVxLT5xaWQgfHwgaW5mb1tjbWRpZF0uYWJvcnRlZCkgeworCQlpZiAod29ya19idXN5KCZkZXYtPnJlc2V0X3dvcmspKQorCQkJcmV0dXJuOworCQlsaXN0X2RlbF9pbml0KCZkZXYtPm5vZGUpOworCQlkZXZfd2FybigmZGV2LT5wY2lfZGV2LT5kZXYsCisJCQkiSS9PICVkIFFJRCAlZCB0aW1lb3V0LCByZXNldCBjb250cm9sbGVyXG4iLCBjbWRpZCwKKwkJCQkJCQkJbnZtZXEtPnFpZCk7CisJCVBSRVBBUkVfV09SSygmZGV2LT5yZXNldF93b3JrLCBudm1lX3Jlc2V0X2ZhaWxlZF9kZXYpOworCQlxdWV1ZV93b3JrKG52bWVfd29ya3EsICZkZXYtPnJlc2V0X3dvcmspOworCQlyZXR1cm47CisJfQorCisJaWYgKCFkZXYtPmFib3J0X2xpbWl0KQorCQlyZXR1cm47CisKKwlhX2NtZGlkID0gYWxsb2NfY21kaWQoZGV2LT5xdWV1ZXNbMF0sIENNRF9DVFhfQUJPUlQsIHNwZWNpYWxfY29tcGxldGlvbiwKKwkJCQkJCQkJQURNSU5fVElNRU9VVCk7CisJaWYgKGFfY21kaWQgPCAwKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5hYm9ydC5vcGNvZGUgPSBudm1lX2FkbWluX2Fib3J0X2NtZDsKKwljbWQuYWJvcnQuY2lkID0gY21kaWQ7CisJY21kLmFib3J0LnNxaWQgPSBjcHVfdG9fbGUxNihudm1lcS0+cWlkKTsKKwljbWQuYWJvcnQuY29tbWFuZF9pZCA9IGFfY21kaWQ7CisKKwktLWRldi0+YWJvcnRfbGltaXQ7CisJaW5mb1tjbWRpZF0uYWJvcnRlZCA9IDE7CisJaW5mb1tjbWRpZF0udGltZW91dCA9IGppZmZpZXMgKyBBRE1JTl9USU1FT1VUOworCisJZGV2X3dhcm4obnZtZXEtPnFfZG1hZGV2LCAiQWJvcnRpbmcgSS9PICVkIFFJRCAlZFxuIiwgY21kaWQsCisJCQkJCQkJbnZtZXEtPnFpZCk7CisJbnZtZV9zdWJtaXRfY21kKGRldi0+cXVldWVzWzBdLCAmY21kKTsKK30KKworLyoqCiAgKiBudm1lX2NhbmNlbF9pb3MgLSBDYW5jZWwgb3V0c3RhbmRpbmcgSS9PcwogICogQHF1ZXVlOiBUaGUgcXVldWUgdG8gY2FuY2VsIEkvT3Mgb24KICAqIEB0aW1lb3V0OiBUcnVlIHRvIG9ubHkgY2FuY2VsIEkvT3Mgd2hpY2ggaGF2ZSB0aW1lZCBvdXQKQEAgLTEwMjQsNyArMTA0NCwxMiBAQAogCQkJY29udGludWU7CiAJCWlmIChpbmZvW2NtZGlkXS5jdHggPT0gQ01EX0NUWF9DQU5DRUxMRUQpCiAJCQljb250aW51ZTsKLQkJZGV2X3dhcm4obnZtZXEtPnFfZG1hZGV2LCAiQ2FuY2VsbGluZyBJL08gJWRcbiIsIGNtZGlkKTsKKwkJaWYgKHRpbWVvdXQgJiYgbnZtZXEtPmRldi0+aW5pdGlhbGl6ZWQpIHsKKwkJCW52bWVfYWJvcnRfY21kKGNtZGlkLCBudm1lcSk7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfd2Fybihudm1lcS0+cV9kbWFkZXYsICJDYW5jZWxsaW5nIEkvTyAlZCBRSUQgJWRcbiIsIGNtZGlkLAorCQkJCQkJCQludm1lcS0+cWlkKTsKIAkJY3R4ID0gY2FuY2VsX2NtZGlkKG52bWVxLCBjbWRpZCwgJmZuKTsKIAkJZm4obnZtZXEtPmRldiwgY3R4LCAmY3FlKTsKIAl9CkBAIC0xMDQ2LDI2ICsxMDcxLDMxIEBACiAJa2ZyZWUobnZtZXEpOwogfQogCi1zdGF0aWMgdm9pZCBudm1lX2ZyZWVfcXVldWVzKHN0cnVjdCBudm1lX2RldiAqZGV2KQorc3RhdGljIHZvaWQgbnZtZV9mcmVlX3F1ZXVlcyhzdHJ1Y3QgbnZtZV9kZXYgKmRldiwgaW50IGxvd2VzdCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID49IDA7IGktLSkgeworCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID49IGxvd2VzdDsgaS0tKSB7CiAJCW52bWVfZnJlZV9xdWV1ZShkZXYtPnF1ZXVlc1tpXSk7CiAJCWRldi0+cXVldWVfY291bnQtLTsKIAkJZGV2LT5xdWV1ZXNbaV0gPSBOVUxMOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbnZtZV9kaXNhYmxlX3F1ZXVlKHN0cnVjdCBudm1lX2RldiAqZGV2LCBpbnQgcWlkKQorLyoqCisgKiBudm1lX3N1c3BlbmRfcXVldWUgLSBwdXQgcXVldWUgaW50byBzdXNwZW5kZWQgc3RhdGUKKyAqIEBudm1lcSAtIHF1ZXVlIHRvIHN1c3BlbmQKKyAqCisgKiBSZXR1cm5zIDEgaWYgYWxyZWFkeSBzdXNwZW5kZWQsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IG52bWVfc3VzcGVuZF9xdWV1ZShzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEpCiB7Ci0Jc3RydWN0IG52bWVfcXVldWUgKm52bWVxID0gZGV2LT5xdWV1ZXNbcWlkXTsKLQlpbnQgdmVjdG9yID0gZGV2LT5lbnRyeVtudm1lcS0+Y3FfdmVjdG9yXS52ZWN0b3I7CisJaW50IHZlY3RvciA9IG52bWVxLT5kZXYtPmVudHJ5W252bWVxLT5jcV92ZWN0b3JdLnZlY3RvcjsKIAogCXNwaW5fbG9ja19pcnEoJm52bWVxLT5xX2xvY2spOwogCWlmIChudm1lcS0+cV9zdXNwZW5kZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZudm1lcS0+cV9sb2NrKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAJbnZtZXEtPnFfc3VzcGVuZGVkID0gMTsKIAlzcGluX3VubG9ja19pcnEoJm52bWVxLT5xX2xvY2spOwpAQCAtMTA3MywxOCArMTEwMywzNSBAQAogCWlycV9zZXRfYWZmaW5pdHlfaGludCh2ZWN0b3IsIE5VTEwpOwogCWZyZWVfaXJxKHZlY3RvciwgbnZtZXEpOwogCi0JLyogRG9uJ3QgdGVsbCB0aGUgYWRhcHRlciB0byBkZWxldGUgdGhlIGFkbWluIHF1ZXVlICovCi0JaWYgKHFpZCkgewotCQlhZGFwdGVyX2RlbGV0ZV9zcShkZXYsIHFpZCk7Ci0JCWFkYXB0ZXJfZGVsZXRlX2NxKGRldiwgcWlkKTsKLQl9CisJcmV0dXJuIDA7Cit9CiAKK3N0YXRpYyB2b2lkIG52bWVfY2xlYXJfcXVldWUoc3RydWN0IG52bWVfcXVldWUgKm52bWVxKQorewogCXNwaW5fbG9ja19pcnEoJm52bWVxLT5xX2xvY2spOwogCW52bWVfcHJvY2Vzc19jcShudm1lcSk7CiAJbnZtZV9jYW5jZWxfaW9zKG52bWVxLCBmYWxzZSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZudm1lcS0+cV9sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgbnZtZV9kaXNhYmxlX3F1ZXVlKHN0cnVjdCBudm1lX2RldiAqZGV2LCBpbnQgcWlkKQoreworCXN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSA9IGRldi0+cXVldWVzW3FpZF07CisKKwlpZiAoIW52bWVxKQorCQlyZXR1cm47CisJaWYgKG52bWVfc3VzcGVuZF9xdWV1ZShudm1lcSkpCisJCXJldHVybjsKKworCS8qIERvbid0IHRlbGwgdGhlIGFkYXB0ZXIgdG8gZGVsZXRlIHRoZSBhZG1pbiBxdWV1ZS4KKwkgKiBEb24ndCB0ZWxsIGEgcmVtb3ZlZCBhZGFwdGVyIHRvIGRlbGV0ZSBJTyBxdWV1ZXMuICovCisJaWYgKHFpZCAmJiByZWFkbCgmZGV2LT5iYXItPmNzdHMpICE9IC0xKSB7CisJCWFkYXB0ZXJfZGVsZXRlX3NxKGRldiwgcWlkKTsKKwkJYWRhcHRlcl9kZWxldGVfY3EoZGV2LCBxaWQpOworCX0KKwludm1lX2NsZWFyX3F1ZXVlKG52bWVxKTsKK30KKwogc3RhdGljIHN0cnVjdCBudm1lX3F1ZXVlICpudm1lX2FsbG9jX3F1ZXVlKHN0cnVjdCBudm1lX2RldiAqZGV2LCBpbnQgcWlkLAogCQkJCQkJCWludCBkZXB0aCwgaW50IHZlY3RvcikKIHsKQEAgLTExMDcsMTUgKzExNTQsMTggQEAKIAogCW52bWVxLT5xX2RtYWRldiA9IGRtYWRldjsKIAludm1lcS0+ZGV2ID0gZGV2OworCXNucHJpbnRmKG52bWVxLT5pcnFuYW1lLCBzaXplb2YobnZtZXEtPmlycW5hbWUpLCAibnZtZSVkcSVkIiwKKwkJCWRldi0+aW5zdGFuY2UsIHFpZCk7CiAJc3Bpbl9sb2NrX2luaXQoJm52bWVxLT5xX2xvY2spOwogCW52bWVxLT5jcV9oZWFkID0gMDsKIAludm1lcS0+Y3FfcGhhc2UgPSAxOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm52bWVxLT5zcV9mdWxsKTsKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbnZtZXEtPnNxX2Nvbmdfd2FpdCwgbnZtZV90aHJlYWQpOwogCWJpb19saXN0X2luaXQoJm52bWVxLT5zcV9jb25nKTsKLQludm1lcS0+cV9kYiA9ICZkZXYtPmRic1txaWQgPDwgKGRldi0+ZGJfc3RyaWRlICsgMSldOworCW52bWVxLT5xX2RiID0gJmRldi0+ZGJzW3FpZCAqIDIgKiBkZXYtPmRiX3N0cmlkZV07CiAJbnZtZXEtPnFfZGVwdGggPSBkZXB0aDsKIAludm1lcS0+Y3FfdmVjdG9yID0gdmVjdG9yOworCW52bWVxLT5xaWQgPSBxaWQ7CiAJbnZtZXEtPnFfc3VzcGVuZGVkID0gMTsKIAlkZXYtPnF1ZXVlX2NvdW50Kys7CiAKQEAgLTExMzQsMTEgKzExODQsMTAgQEAKIHsKIAlpZiAodXNlX3RocmVhZGVkX2ludGVycnVwdHMpCiAJCXJldHVybiByZXF1ZXN0X3RocmVhZGVkX2lycShkZXYtPmVudHJ5W252bWVxLT5jcV92ZWN0b3JdLnZlY3RvciwKLQkJCQkJbnZtZV9pcnFfY2hlY2ssIG52bWVfaXJxLAotCQkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCQkJCW52bWVfaXJxX2NoZWNrLCBudm1lX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkJCW5hbWUsIG52bWVxKTsKIAlyZXR1cm4gcmVxdWVzdF9pcnEoZGV2LT5lbnRyeVtudm1lcS0+Y3FfdmVjdG9yXS52ZWN0b3IsIG52bWVfaXJxLAotCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwgbmFtZSwgbnZtZXEpOworCQkJCUlSUUZfU0hBUkVELCBuYW1lLCBudm1lcSk7CiB9CiAKIHN0YXRpYyB2b2lkIG52bWVfaW5pdF9xdWV1ZShzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEsIHUxNiBxaWQpCkBAIC0xMTQ5LDcgKzExOTgsNyBAQAogCW52bWVxLT5zcV90YWlsID0gMDsKIAludm1lcS0+Y3FfaGVhZCA9IDA7CiAJbnZtZXEtPmNxX3BoYXNlID0gMTsKLQludm1lcS0+cV9kYiA9ICZkZXYtPmRic1txaWQgPDwgKGRldi0+ZGJfc3RyaWRlICsgMSldOworCW52bWVxLT5xX2RiID0gJmRldi0+ZGJzW3FpZCAqIDIgKiBkZXYtPmRiX3N0cmlkZV07CiAJbWVtc2V0KG52bWVxLT5jbWRpZF9kYXRhLCAwLCBleHRyYSk7CiAJbWVtc2V0KCh2b2lkICopbnZtZXEtPmNxZXMsIDAsIENRX1NJWkUobnZtZXEtPnFfZGVwdGgpKTsKIAludm1lX2NhbmNlbF9pb3MobnZtZXEsIGZhbHNlKTsKQEAgLTExNjksMTMgKzEyMTgsMTMgQEAKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byByZWxlYXNlX2NxOwogCi0JcmVzdWx0ID0gcXVldWVfcmVxdWVzdF9pcnEoZGV2LCBudm1lcSwgIm52bWUiKTsKKwlyZXN1bHQgPSBxdWV1ZV9yZXF1ZXN0X2lycShkZXYsIG52bWVxLCBudm1lcS0+aXJxbmFtZSk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gcmVsZWFzZV9zcTsKIAotCXNwaW5fbG9jaygmbnZtZXEtPnFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmbnZtZXEtPnFfbG9jayk7CiAJbnZtZV9pbml0X3F1ZXVlKG52bWVxLCBxaWQpOwotCXNwaW5fdW5sb2NrKCZudm1lcS0+cV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJm52bWVxLT5xX2xvY2spOwogCiAJcmV0dXJuIHJlc3VsdDsKIApAQCAtMTI4NywxMyArMTMzNiwxMyBAQAogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKLQlyZXN1bHQgPSBxdWV1ZV9yZXF1ZXN0X2lycShkZXYsIG52bWVxLCAibnZtZSBhZG1pbiIpOworCXJlc3VsdCA9IHF1ZXVlX3JlcXVlc3RfaXJxKGRldiwgbnZtZXEsIG52bWVxLT5pcnFuYW1lKTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCi0Jc3Bpbl9sb2NrKCZudm1lcS0+cV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZudm1lcS0+cV9sb2NrKTsKIAludm1lX2luaXRfcXVldWUobnZtZXEsIDApOwotCXNwaW5fdW5sb2NrKCZudm1lcS0+cV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJm52bWVxLT5xX2xvY2spOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE1NjksMTAgKzE2MTgsNDcgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgaW50IG52bWVfY29tcGF0X2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG52bWVfbnMgKm5zID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNHX0lPOgorCQlyZXR1cm4gbnZtZV9zZ19pbzMyKG5zLCBhcmcpOworCX0KKwlyZXR1cm4gbnZtZV9pb2N0bChiZGV2LCBtb2RlLCBjbWQsIGFyZyk7Cit9CisjZWxzZQorI2RlZmluZSBudm1lX2NvbXBhdF9pb2N0bAlOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBudm1lX29wZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbnZtZV9kZXYgKmRldiA9IG5zLT5kZXY7CisKKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZtZV9mcmVlX2RldihzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyB2b2lkIG52bWVfcmVsZWFzZShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgZm1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbnZtZV9kZXYgKmRldiA9IG5zLT5kZXY7CisKKwlrcmVmX3B1dCgmZGV2LT5rcmVmLCBudm1lX2ZyZWVfZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBudm1lX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5pb2N0bAkJPSBudm1lX2lvY3RsLAotCS5jb21wYXRfaW9jdGwJPSBudm1lX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBudm1lX2NvbXBhdF9pb2N0bCwKKwkub3BlbgkJPSBudm1lX29wZW4sCisJLnJlbGVhc2UJPSBudm1lX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgdm9pZCBudm1lX3Jlc3VibWl0X2Jpb3Moc3RydWN0IG52bWVfcXVldWUgKm52bWVxKQpAQCAtMTU5NiwxMyArMTY4MiwyNSBAQAogCiBzdGF0aWMgaW50IG52bWVfa3RocmVhZCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBudm1lX2RldiAqZGV2OworCXN0cnVjdCBudm1lX2RldiAqZGV2LCAqbmV4dDsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fbG9jaygmZGV2X2xpc3RfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZGV2X2xpc3QsIG5vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgbmV4dCwgJmRldl9saXN0LCBub2RlKSB7CiAJCQlpbnQgaTsKKwkJCWlmIChyZWFkbCgmZGV2LT5iYXItPmNzdHMpICYgTlZNRV9DU1RTX0NGUyAmJgorCQkJCQkJCWRldi0+aW5pdGlhbGl6ZWQpIHsKKwkJCQlpZiAod29ya19idXN5KCZkZXYtPnJlc2V0X3dvcmspKQorCQkJCQljb250aW51ZTsKKwkJCQlsaXN0X2RlbF9pbml0KCZkZXYtPm5vZGUpOworCQkJCWRldl93YXJuKCZkZXYtPnBjaV9kZXYtPmRldiwKKwkJCQkJIkZhaWxlZCBzdGF0dXMsIHJlc2V0IGNvbnRyb2xsZXJcbiIpOworCQkJCVBSRVBBUkVfV09SSygmZGV2LT5yZXNldF93b3JrLAorCQkJCQkJCW52bWVfcmVzZXRfZmFpbGVkX2Rldik7CisJCQkJcXVldWVfd29yayhudm1lX3dvcmtxLCAmZGV2LT5yZXNldF93b3JrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKIAkJCQlzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEgPSBkZXYtPnF1ZXVlc1tpXTsKIAkJCQlpZiAoIW52bWVxKQpAQCAtMTYyMywzMyArMTcyMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBERUZJTkVfSURBKG52bWVfaW5kZXhfaWRhKTsKLQotc3RhdGljIGludCBudm1lX2dldF9uc19pZHgodm9pZCkKLXsKLQlpbnQgaW5kZXgsIGVycm9yOwotCi0JZG8gewotCQlpZiAoIWlkYV9wcmVfZ2V0KCZudm1lX2luZGV4X2lkYSwgR0ZQX0tFUk5FTCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKLQkJZXJyb3IgPSBpZGFfZ2V0X25ldygmbnZtZV9pbmRleF9pZGEsICZpbmRleCk7Ci0JCXNwaW5fdW5sb2NrKCZkZXZfbGlzdF9sb2NrKTsKLQl9IHdoaWxlIChlcnJvciA9PSAtRUFHQUlOKTsKLQotCWlmIChlcnJvcikKLQkJaW5kZXggPSAtMTsKLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLXN0YXRpYyB2b2lkIG52bWVfcHV0X25zX2lkeChpbnQgaW5kZXgpCi17Ci0Jc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKLQlpZGFfcmVtb3ZlKCZudm1lX2luZGV4X2lkYSwgaW5kZXgpOwotCXNwaW5fdW5sb2NrKCZkZXZfbGlzdF9sb2NrKTsKLX0KLQogc3RhdGljIHZvaWQgbnZtZV9jb25maWdfZGlzY2FyZChzdHJ1Y3QgbnZtZV9ucyAqbnMpCiB7CiAJdTMyIGxvZ2ljYWxfYmxvY2tfc2l6ZSA9IHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShucy0+cXVldWUpOwpAQCAtMTY4Myw3ICsxNzU0LDcgQEAKIAlucy0+ZGV2ID0gZGV2OwogCW5zLT5xdWV1ZS0+cXVldWVkYXRhID0gbnM7CiAKLQlkaXNrID0gYWxsb2NfZGlzayhOVk1FX01JTk9SUyk7CisJZGlzayA9IGFsbG9jX2Rpc2soMCk7CiAJaWYgKCFkaXNrKQogCQlnb3RvIG91dF9mcmVlX3F1ZXVlOwogCW5zLT5uc19pZCA9IG5zaWQ7CkBAIC0xNjk2LDEyICsxNzY3LDEyIEBACiAJCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhucy0+cXVldWUsIGRldi0+bWF4X2h3X3NlY3RvcnMpOwogCiAJZGlzay0+bWFqb3IgPSBudm1lX21ham9yOwotCWRpc2stPm1pbm9ycyA9IE5WTUVfTUlOT1JTOwotCWRpc2stPmZpcnN0X21pbm9yID0gTlZNRV9NSU5PUlMgKiBudm1lX2dldF9uc19pZHgoKTsKKwlkaXNrLT5maXJzdF9taW5vciA9IDA7CiAJZGlzay0+Zm9wcyA9ICZudm1lX2ZvcHM7CiAJZGlzay0+cHJpdmF0ZV9kYXRhID0gbnM7CiAJZGlzay0+cXVldWUgPSBucy0+cXVldWU7CiAJZGlzay0+ZHJpdmVyZnNfZGV2ID0gJmRldi0+cGNpX2Rldi0+ZGV2OworCWRpc2stPmZsYWdzID0gR0VOSERfRkxfRVhUX0RFVlQ7CiAJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJudm1lJWRuJWQiLCBkZXYtPmluc3RhbmNlLCBuc2lkKTsKIAlzZXRfY2FwYWNpdHkoZGlzaywgbGU2NF90b19jcHVwKCZpZC0+bnN6ZSkgPDwgKG5zLT5sYmFfc2hpZnQgLSA5KSk7CiAKQEAgLTE3MTcsMTUgKzE3ODgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBudm1lX25zX2ZyZWUoc3RydWN0IG52bWVfbnMgKm5zKQotewotCWludCBpbmRleCA9IG5zLT5kaXNrLT5maXJzdF9taW5vciAvIE5WTUVfTUlOT1JTOwotCXB1dF9kaXNrKG5zLT5kaXNrKTsKLQludm1lX3B1dF9uc19pZHgoaW5kZXgpOwotCWJsa19jbGVhbnVwX3F1ZXVlKG5zLT5xdWV1ZSk7Ci0Ja2ZyZWUobnMpOwotfQotCiBzdGF0aWMgaW50IHNldF9xdWV1ZV9jb3VudChzdHJ1Y3QgbnZtZV9kZXYgKmRldiwgaW50IGNvdW50KQogewogCWludCBzdGF0dXM7CkBAIC0xNzQxLDExICsxODAzLDEyIEBACiAKIHN0YXRpYyBzaXplX3QgZGJfYmFyX3NpemUoc3RydWN0IG52bWVfZGV2ICpkZXYsIHVuc2lnbmVkIG5yX2lvX3F1ZXVlcykKIHsKLQlyZXR1cm4gNDA5NiArICgobnJfaW9fcXVldWVzICsgMSkgPDwgKGRldi0+ZGJfc3RyaWRlICsgMykpOworCXJldHVybiA0MDk2ICsgKChucl9pb19xdWV1ZXMgKyAxKSAqIDggKiBkZXYtPmRiX3N0cmlkZSk7CiB9CiAKIHN0YXRpYyBpbnQgbnZtZV9zZXR1cF9pb19xdWV1ZXMoc3RydWN0IG52bWVfZGV2ICpkZXYpCiB7CisJc3RydWN0IG52bWVfcXVldWUgKmFkbWlucSA9IGRldi0+cXVldWVzWzBdOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wY2lfZGV2OwogCWludCByZXN1bHQsIGNwdSwgaSwgdmVjcywgbnJfaW9fcXVldWVzLCBzaXplLCBxX2RlcHRoOwogCkBAIC0xNzcyLDcgKzE4MzUsNyBAQAogCX0KIAogCS8qIERlcmVnaXN0ZXIgdGhlIGFkbWluIHF1ZXVlJ3MgaW50ZXJydXB0ICovCi0JZnJlZV9pcnEoZGV2LT5lbnRyeVswXS52ZWN0b3IsIGRldi0+cXVldWVzWzBdKTsKKwlmcmVlX2lycShkZXYtPmVudHJ5WzBdLnZlY3RvciwgYWRtaW5xKTsKIAogCXZlY3MgPSBucl9pb19xdWV1ZXM7CiAJZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKQEAgLTE4MTAsOSArMTg3Myw5IEBACiAJICovCiAJbnJfaW9fcXVldWVzID0gdmVjczsKIAotCXJlc3VsdCA9IHF1ZXVlX3JlcXVlc3RfaXJxKGRldiwgZGV2LT5xdWV1ZXNbMF0sICJudm1lIGFkbWluIik7CisJcmVzdWx0ID0gcXVldWVfcmVxdWVzdF9pcnEoZGV2LCBhZG1pbnEsIGFkbWlucS0+aXJxbmFtZSk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXYtPnF1ZXVlc1swXS0+cV9zdXNwZW5kZWQgPSAxOworCQlhZG1pbnEtPnFfc3VzcGVuZGVkID0gMTsKIAkJZ290byBmcmVlX3F1ZXVlczsKIAl9CiAKQEAgLTE4MjEsOSArMTg4NCw5IEBACiAJZm9yIChpID0gZGV2LT5xdWV1ZV9jb3VudCAtIDE7IGkgPiBucl9pb19xdWV1ZXM7IGktLSkgewogCQlzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEgPSBkZXYtPnF1ZXVlc1tpXTsKIAotCQlzcGluX2xvY2soJm52bWVxLT5xX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZudm1lcS0+cV9sb2NrKTsKIAkJbnZtZV9jYW5jZWxfaW9zKG52bWVxLCBmYWxzZSk7Ci0JCXNwaW5fdW5sb2NrKCZudm1lcS0+cV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZudm1lcS0+cV9sb2NrKTsKIAogCQludm1lX2ZyZWVfcXVldWUobnZtZXEpOwogCQlkZXYtPnF1ZXVlX2NvdW50LS07CkBAIC0xODY0LDcgKzE5MjcsNyBAQAogCXJldHVybiAwOwogCiAgZnJlZV9xdWV1ZXM6Ci0JbnZtZV9mcmVlX3F1ZXVlcyhkZXYpOworCW52bWVfZnJlZV9xdWV1ZXMoZGV2LCAxKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xODc2LDYgKzE5MzksNyBAQAogICovCiBzdGF0aWMgaW50IG52bWVfZGV2X2FkZChzdHJ1Y3QgbnZtZV9kZXYgKmRldikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGNpX2RldjsKIAlpbnQgcmVzOwogCXVuc2lnbmVkIG5uLCBpOwogCXN0cnVjdCBudm1lX25zICpuczsKQEAgLTE4ODUsOCArMTk0OSw3IEBACiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlpbnQgc2hpZnQgPSBOVk1FX0NBUF9NUFNNSU4ocmVhZHEoJmRldi0+YmFyLT5jYXApKSArIDEyOwogCi0JbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBjaV9kZXYtPmRldiwgODE5MiwgJmRtYV9hZGRyLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwltZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgODE5MiwgJmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE4OTksMTMgKzE5NjIsMTQgQEAKIAljdHJsID0gbWVtOwogCW5uID0gbGUzMl90b19jcHVwKCZjdHJsLT5ubik7CiAJZGV2LT5vbmNzID0gbGUxNl90b19jcHVwKCZjdHJsLT5vbmNzKTsKKwlkZXYtPmFib3J0X2xpbWl0ID0gY3RybC0+YWNsICsgMTsKIAltZW1jcHkoZGV2LT5zZXJpYWwsIGN0cmwtPnNuLCBzaXplb2YoY3RybC0+c24pKTsKIAltZW1jcHkoZGV2LT5tb2RlbCwgY3RybC0+bW4sIHNpemVvZihjdHJsLT5tbikpOwogCW1lbWNweShkZXYtPmZpcm13YXJlX3JldiwgY3RybC0+ZnIsIHNpemVvZihjdHJsLT5mcikpOwogCWlmIChjdHJsLT5tZHRzKQogCQlkZXYtPm1heF9od19zZWN0b3JzID0gMSA8PCAoY3RybC0+bWR0cyArIHNoaWZ0IC0gOSk7Ci0JaWYgKChkZXYtPnBjaV9kZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSAmJgotCQkJKGRldi0+cGNpX2Rldi0+ZGV2aWNlID09IDB4MDk1MykgJiYgY3RybC0+dnNbM10pCisJaWYgKChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkgJiYKKwkJCShwZGV2LT5kZXZpY2UgPT0gMHgwOTUzKSAmJiBjdHJsLT52c1szXSkKIAkJZGV2LT5zdHJpcGVfc2l6ZSA9IDEgPDwgKGN0cmwtPnZzWzNdICsgc2hpZnQpOwogCiAJaWRfbnMgPSBtZW07CkBAIC0xOTUzLDE2ICsyMDE3LDIxIEBACiAJICAgIGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkpCiAJCWdvdG8gZGlzYWJsZTsKIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCWRldi0+YmFyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIDgxOTIpOwogCWlmICghZGV2LT5iYXIpCiAJCWdvdG8gZGlzYWJsZTsKLQotCWRldi0+ZGJfc3RyaWRlID0gTlZNRV9DQVBfU1RSSURFKHJlYWRxKCZkZXYtPmJhci0+Y2FwKSk7CisJaWYgKHJlYWRsKCZkZXYtPmJhci0+Y3N0cykgPT0gLTEpIHsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byB1bm1hcDsKKwl9CisJZGV2LT5kYl9zdHJpZGUgPSAxIDw8IE5WTUVfQ0FQX1NUUklERShyZWFkcSgmZGV2LT5iYXItPmNhcCkpOwogCWRldi0+ZGJzID0gKCh2b2lkIF9faW9tZW0gKilkZXYtPmJhcikgKyA0MDk2OwogCiAJcmV0dXJuIDA7CiAKKyB1bm1hcDoKKwlpb3VubWFwKGRldi0+YmFyKTsKKwlkZXYtPmJhciA9IE5VTEw7CiAgZGlzYWJsZToKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogIGRpc2FibGVfcGNpOgpAQCAtMTk4MCwzNyArMjA0OSwxODMgQEAKIAlpZiAoZGV2LT5iYXIpIHsKIAkJaW91bm1hcChkZXYtPmJhcik7CiAJCWRldi0+YmFyID0gTlVMTDsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYtPnBjaV9kZXYpOwogCX0KIAotCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2LT5wY2lfZGV2KTsKIAlpZiAocGNpX2lzX2VuYWJsZWQoZGV2LT5wY2lfZGV2KSkKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldi0+cGNpX2Rldik7CiB9CiAKK3N0cnVjdCBudm1lX2RlbHFfY3R4IHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndhaXRlcjsKKwlzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjsKKwlhdG9taWNfdCByZWZjb3VudDsKK307CisKK3N0YXRpYyB2b2lkIG52bWVfd2FpdF9kcShzdHJ1Y3QgbnZtZV9kZWxxX2N0eCAqZHEsIHN0cnVjdCBudm1lX2RldiAqZGV2KQoreworCWRxLT53YWl0ZXIgPSBjdXJyZW50OworCW1iKCk7CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfS0lMTEFCTEUpOworCQlpZiAoIWF0b21pY19yZWFkKCZkcS0+cmVmY291bnQpKQorCQkJYnJlYWs7CisJCWlmICghc2NoZWR1bGVfdGltZW91dChBRE1JTl9USU1FT1VUKSB8fAorCQkJCQlmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQkJbnZtZV9kaXNhYmxlX2N0cmwoZGV2LCByZWFkcSgmZGV2LT5iYXItPmNhcCkpOworCQkJbnZtZV9kaXNhYmxlX3F1ZXVlKGRldiwgMCk7CisKKwkJCXNlbmRfc2lnKFNJR0tJTEwsIGRxLT53b3JrZXItPnRhc2ssIDEpOworCQkJZmx1c2hfa3RocmVhZF93b3JrZXIoZHEtPndvcmtlcik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KKworc3RhdGljIHZvaWQgbnZtZV9wdXRfZHEoc3RydWN0IG52bWVfZGVscV9jdHggKmRxKQoreworCWF0b21pY19kZWMoJmRxLT5yZWZjb3VudCk7CisJaWYgKGRxLT53YWl0ZXIpCisJCXdha2VfdXBfcHJvY2VzcyhkcS0+d2FpdGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBudm1lX2RlbHFfY3R4ICpudm1lX2dldF9kcShzdHJ1Y3QgbnZtZV9kZWxxX2N0eCAqZHEpCit7CisJYXRvbWljX2luYygmZHEtPnJlZmNvdW50KTsKKwlyZXR1cm4gZHE7Cit9CisKK3N0YXRpYyB2b2lkIG52bWVfZGVsX3F1ZXVlX2VuZChzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEpCit7CisJc3RydWN0IG52bWVfZGVscV9jdHggKmRxID0gbnZtZXEtPmNtZGluZm8uY3R4OworCisJbnZtZV9jbGVhcl9xdWV1ZShudm1lcSk7CisJbnZtZV9wdXRfZHEoZHEpOworfQorCitzdGF0aWMgaW50IGFkYXB0ZXJfYXN5bmNfZGVsX3F1ZXVlKHN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSwgdTggb3Bjb2RlLAorCQkJCQkJa3RocmVhZF93b3JrX2Z1bmNfdCBmbikKK3sKKwlzdHJ1Y3QgbnZtZV9jb21tYW5kIGM7CisKKwltZW1zZXQoJmMsIDAsIHNpemVvZihjKSk7CisJYy5kZWxldGVfcXVldWUub3Bjb2RlID0gb3Bjb2RlOworCWMuZGVsZXRlX3F1ZXVlLnFpZCA9IGNwdV90b19sZTE2KG52bWVxLT5xaWQpOworCisJaW5pdF9rdGhyZWFkX3dvcmsoJm52bWVxLT5jbWRpbmZvLndvcmssIGZuKTsKKwlyZXR1cm4gbnZtZV9zdWJtaXRfYWRtaW5fY21kX2FzeW5jKG52bWVxLT5kZXYsICZjLCAmbnZtZXEtPmNtZGluZm8pOworfQorCitzdGF0aWMgdm9pZCBudm1lX2RlbF9jcV93b3JrX2hhbmRsZXIoc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG52bWVfcXVldWUsCisJCQkJCQkJY21kaW5mby53b3JrKTsKKwludm1lX2RlbF9xdWV1ZV9lbmQobnZtZXEpOworfQorCitzdGF0aWMgaW50IG52bWVfZGVsZXRlX2NxKHN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSkKK3sKKwlyZXR1cm4gYWRhcHRlcl9hc3luY19kZWxfcXVldWUobnZtZXEsIG52bWVfYWRtaW5fZGVsZXRlX2NxLAorCQkJCQkJbnZtZV9kZWxfY3Ffd29ya19oYW5kbGVyKTsKK30KKworc3RhdGljIHZvaWQgbnZtZV9kZWxfc3Ffd29ya19oYW5kbGVyKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IG52bWVfcXVldWUgKm52bWVxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBudm1lX3F1ZXVlLAorCQkJCQkJCWNtZGluZm8ud29yayk7CisJaW50IHN0YXR1cyA9IG52bWVxLT5jbWRpbmZvLnN0YXR1czsKKworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBudm1lX2RlbGV0ZV9jcShudm1lcSk7CisJaWYgKHN0YXR1cykKKwkJbnZtZV9kZWxfcXVldWVfZW5kKG52bWVxKTsKK30KKworc3RhdGljIGludCBudm1lX2RlbGV0ZV9zcShzdHJ1Y3QgbnZtZV9xdWV1ZSAqbnZtZXEpCit7CisJcmV0dXJuIGFkYXB0ZXJfYXN5bmNfZGVsX3F1ZXVlKG52bWVxLCBudm1lX2FkbWluX2RlbGV0ZV9zcSwKKwkJCQkJCW52bWVfZGVsX3NxX3dvcmtfaGFuZGxlcik7Cit9CisKK3N0YXRpYyB2b2lkIG52bWVfZGVsX3F1ZXVlX3N0YXJ0KHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IG52bWVfcXVldWUgKm52bWVxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBudm1lX3F1ZXVlLAorCQkJCQkJCWNtZGluZm8ud29yayk7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCWlmIChudm1lX2RlbGV0ZV9zcShudm1lcSkpCisJCW52bWVfZGVsX3F1ZXVlX2VuZChudm1lcSk7Cit9CisKK3N0YXRpYyB2b2lkIG52bWVfZGlzYWJsZV9pb19xdWV1ZXMoc3RydWN0IG52bWVfZGV2ICpkZXYpCit7CisJaW50IGk7CisJREVGSU5FX0tUSFJFQURfV09SS0VSX09OU1RBQ0sod29ya2VyKTsKKwlzdHJ1Y3QgbnZtZV9kZWxxX2N0eCBkcTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt3b3JrZXJfdGFzayA9IGt0aHJlYWRfcnVuKGt0aHJlYWRfd29ya2VyX2ZuLAorCQkJCQkmd29ya2VyLCAibnZtZSVkIiwgZGV2LT5pbnN0YW5jZSk7CisKKwlpZiAoSVNfRVJSKGt3b3JrZXJfdGFzaykpIHsKKwkJZGV2X2VycigmZGV2LT5wY2lfZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGNyZWF0ZSBxdWV1ZSBkZWwgdGFza1xuIik7CisJCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID4gMDsgaS0tKQorCQkJbnZtZV9kaXNhYmxlX3F1ZXVlKGRldiwgaSk7CisJCXJldHVybjsKKwl9CisKKwlkcS53YWl0ZXIgPSBOVUxMOworCWF0b21pY19zZXQoJmRxLnJlZmNvdW50LCAwKTsKKwlkcS53b3JrZXIgPSAmd29ya2VyOworCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID4gMDsgaS0tKSB7CisJCXN0cnVjdCBudm1lX3F1ZXVlICpudm1lcSA9IGRldi0+cXVldWVzW2ldOworCisJCWlmIChudm1lX3N1c3BlbmRfcXVldWUobnZtZXEpKQorCQkJY29udGludWU7CisJCW52bWVxLT5jbWRpbmZvLmN0eCA9IG52bWVfZ2V0X2RxKCZkcSk7CisJCW52bWVxLT5jbWRpbmZvLndvcmtlciA9IGRxLndvcmtlcjsKKwkJaW5pdF9rdGhyZWFkX3dvcmsoJm52bWVxLT5jbWRpbmZvLndvcmssIG52bWVfZGVsX3F1ZXVlX3N0YXJ0KTsKKwkJcXVldWVfa3RocmVhZF93b3JrKGRxLndvcmtlciwgJm52bWVxLT5jbWRpbmZvLndvcmspOworCX0KKwludm1lX3dhaXRfZHEoJmRxLCBkZXYpOworCWt0aHJlYWRfc3RvcChrd29ya2VyX3Rhc2spOworfQorCiBzdGF0aWMgdm9pZCBudm1lX2Rldl9zaHV0ZG93bihzdHJ1Y3QgbnZtZV9kZXYgKmRldikKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID49IDA7IGktLSkKLQkJbnZtZV9kaXNhYmxlX3F1ZXVlKGRldiwgaSk7CisJZGV2LT5pbml0aWFsaXplZCA9IDA7CiAKIAlzcGluX2xvY2soJmRldl9saXN0X2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmRldi0+bm9kZSk7CiAJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOwogCi0JaWYgKGRldi0+YmFyKQorCWlmICghZGV2LT5iYXIgfHwgKGRldi0+YmFyICYmIHJlYWRsKCZkZXYtPmJhci0+Y3N0cykgPT0gLTEpKSB7CisJCWZvciAoaSA9IGRldi0+cXVldWVfY291bnQgLSAxOyBpID49IDA7IGktLSkgeworCQkJc3RydWN0IG52bWVfcXVldWUgKm52bWVxID0gZGV2LT5xdWV1ZXNbaV07CisJCQludm1lX3N1c3BlbmRfcXVldWUobnZtZXEpOworCQkJbnZtZV9jbGVhcl9xdWV1ZShudm1lcSk7CisJCX0KKwl9IGVsc2UgeworCQludm1lX2Rpc2FibGVfaW9fcXVldWVzKGRldik7CiAJCW52bWVfc2h1dGRvd25fY3RybChkZXYpOworCQludm1lX2Rpc2FibGVfcXVldWUoZGV2LCAwKTsKKwl9CiAJbnZtZV9kZXZfdW5tYXAoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgbnZtZV9kZXZfcmVtb3ZlKHN0cnVjdCBudm1lX2RldiAqZGV2KQogewotCXN0cnVjdCBudm1lX25zICpucywgKm5leHQ7CisJc3RydWN0IG52bWVfbnMgKm5zOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zLCBuZXh0LCAmZGV2LT5uYW1lc3BhY2VzLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZucy0+bGlzdCk7Ci0JCWRlbF9nZW5kaXNrKG5zLT5kaXNrKTsKLQkJbnZtZV9uc19mcmVlKG5zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zLCAmZGV2LT5uYW1lc3BhY2VzLCBsaXN0KSB7CisJCWlmIChucy0+ZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkKKwkJCWRlbF9nZW5kaXNrKG5zLT5kaXNrKTsKKwkJaWYgKCFibGtfcXVldWVfZHlpbmcobnMtPnF1ZXVlKSkKKwkJCWJsa19jbGVhbnVwX3F1ZXVlKG5zLT5xdWV1ZSk7CiAJfQogfQogCkBAIC0yMDY3LDE0ICsyMjgyLDIyIEBACiAJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBudm1lX2ZyZWVfbmFtZXNwYWNlcyhzdHJ1Y3QgbnZtZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbnZtZV9ucyAqbnMsICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zLCBuZXh0LCAmZGV2LT5uYW1lc3BhY2VzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZucy0+bGlzdCk7CisJCXB1dF9kaXNrKG5zLT5kaXNrKTsKKwkJa2ZyZWUobnMpOworCX0KK30KKwogc3RhdGljIHZvaWQgbnZtZV9mcmVlX2RldihzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgbnZtZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgbnZtZV9kZXYsIGtyZWYpOwotCW52bWVfZGV2X3JlbW92ZShkZXYpOwotCW52bWVfZGV2X3NodXRkb3duKGRldik7Ci0JbnZtZV9mcmVlX3F1ZXVlcyhkZXYpOwotCW52bWVfcmVsZWFzZV9pbnN0YW5jZShkZXYpOwotCW52bWVfcmVsZWFzZV9wcnBfcG9vbHMoZGV2KTsKKworCW52bWVfZnJlZV9uYW1lc3BhY2VzKGRldik7CiAJa2ZyZWUoZGV2LT5xdWV1ZXMpOwogCWtmcmVlKGRldi0+ZW50cnkpOwogCWtmcmVlKGRldik7CkBAIC0yMTM4LDYgKzIzNjEsNyBAQAogCXJldHVybiByZXN1bHQ7CiAKICBkaXNhYmxlOgorCW52bWVfZGlzYWJsZV9xdWV1ZShkZXYsIDApOwogCXNwaW5fbG9jaygmZGV2X2xpc3RfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmZGV2LT5ub2RlKTsKIAlzcGluX3VubG9jaygmZGV2X2xpc3RfbG9jayk7CkBAIC0yMTQ2LDYgKzIzNzAsNzEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IG52bWVfcmVtb3ZlX2RlYWRfY3RybCh2b2lkICphcmcpCit7CisJc3RydWN0IG52bWVfZGV2ICpkZXYgPSAoc3RydWN0IG52bWVfZGV2ICopYXJnOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wY2lfZGV2OworCisJaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSkKKwkJcGNpX3N0b3BfYW5kX3JlbW92ZV9idXNfZGV2aWNlKHBkZXYpOworCWtyZWZfcHV0KCZkZXYtPmtyZWYsIG52bWVfZnJlZV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudm1lX3JlbW92ZV9kaXNrcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCWludCBpOworCXN0cnVjdCBudm1lX2RldiAqZGV2ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgbnZtZV9kZXYsIHJlc2V0X3dvcmspOworCisJbnZtZV9kZXZfcmVtb3ZlKGRldik7CisJc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKKwlmb3IgKGkgPSBkZXYtPnF1ZXVlX2NvdW50IC0gMTsgaSA+IDA7IGktLSkgeworCQlCVUdfT04oIWRldi0+cXVldWVzW2ldIHx8ICFkZXYtPnF1ZXVlc1tpXS0+cV9zdXNwZW5kZWQpOworCQludm1lX2ZyZWVfcXVldWUoZGV2LT5xdWV1ZXNbaV0pOworCQlkZXYtPnF1ZXVlX2NvdW50LS07CisJCWRldi0+cXVldWVzW2ldID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IG52bWVfZGV2X3Jlc3VtZShzdHJ1Y3QgbnZtZV9kZXYgKmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbnZtZV9kZXZfc3RhcnQoZGV2KTsKKwlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpCisJCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAtRUJVU1kpIHsKKwkJc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKKwkJUFJFUEFSRV9XT1JLKCZkZXYtPnJlc2V0X3dvcmssIG52bWVfcmVtb3ZlX2Rpc2tzKTsKKwkJcXVldWVfd29yayhudm1lX3dvcmtxLCAmZGV2LT5yZXNldF93b3JrKTsKKwkJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOworCX0KKwlkZXYtPmluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZtZV9kZXZfcmVzZXQoc3RydWN0IG52bWVfZGV2ICpkZXYpCit7CisJbnZtZV9kZXZfc2h1dGRvd24oZGV2KTsKKwlpZiAobnZtZV9kZXZfcmVzdW1lKGRldikpIHsKKwkJZGV2X2VycigmZGV2LT5wY2lfZGV2LT5kZXYsICJEZXZpY2UgZmFpbGVkIHRvIHJlc3VtZVxuIik7CisJCWtyZWZfZ2V0KCZkZXYtPmtyZWYpOworCQlpZiAoSVNfRVJSKGt0aHJlYWRfcnVuKG52bWVfcmVtb3ZlX2RlYWRfY3RybCwgZGV2LCAibnZtZSVkIiwKKwkJCQkJCQlkZXYtPmluc3RhbmNlKSkpIHsKKwkJCWRldl9lcnIoJmRldi0+cGNpX2Rldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gc3RhcnQgY29udHJvbGxlciByZW1vdmUgdGFza1xuIik7CisJCQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBudm1lX2ZyZWVfZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbnZtZV9yZXNldF9mYWlsZWRfZGV2KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJc3RydWN0IG52bWVfZGV2ICpkZXYgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBudm1lX2RldiwgcmVzZXRfd29yayk7CisJbnZtZV9kZXZfcmVzZXQoZGV2KTsKK30KKwogc3RhdGljIGludCBudm1lX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHJlc3VsdCA9IC1FTk9NRU07CkBAIC0yMTY0LDggKzI0NTMsOSBAQAogCQlnb3RvIGZyZWU7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5uYW1lc3BhY2VzKTsKKwlJTklUX1dPUksoJmRldi0+cmVzZXRfd29yaywgbnZtZV9yZXNldF9mYWlsZWRfZGV2KTsKIAlkZXYtPnBjaV9kZXYgPSBwZGV2OwotCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAJcmVzdWx0ID0gbnZtZV9zZXRfaW5zdGFuY2UoZGV2KTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGZyZWU7CkBAIC0yMTgxLDYgKzI0NzEsNyBAQAogCQlnb3RvIHJlbGVhc2VfcG9vbHM7CiAJfQogCisJa3JlZl9pbml0KCZkZXYtPmtyZWYpOwogCXJlc3VsdCA9IG52bWVfZGV2X2FkZChkZXYpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gc2h1dGRvd247CkBAIC0yMTk1LDE1ICsyNDg2LDE2IEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byByZW1vdmU7CiAKLQlrcmVmX2luaXQoJmRldi0+a3JlZik7CisJZGV2LT5pbml0aWFsaXplZCA9IDE7CiAJcmV0dXJuIDA7CiAKICByZW1vdmU6CiAJbnZtZV9kZXZfcmVtb3ZlKGRldik7CisJbnZtZV9mcmVlX25hbWVzcGFjZXMoZGV2KTsKICBzaHV0ZG93bjoKIAludm1lX2Rldl9zaHV0ZG93bihkZXYpOwogIHJlbGVhc2VfcG9vbHM6Ci0JbnZtZV9mcmVlX3F1ZXVlcyhkZXYpOworCW52bWVfZnJlZV9xdWV1ZXMoZGV2LCAwKTsKIAludm1lX3JlbGVhc2VfcHJwX3Bvb2xzKGRldik7CiAgcmVsZWFzZToKIAludm1lX3JlbGVhc2VfaW5zdGFuY2UoZGV2KTsKQEAgLTIyMTQsMTAgKzI1MDYsMjggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBudm1lX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBudm1lX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW52bWVfZGV2X3NodXRkb3duKGRldik7Cit9CisKIHN0YXRpYyB2b2lkIG52bWVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBudm1lX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3Bpbl9sb2NrKCZkZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZkZXYtPm5vZGUpOworCXNwaW5fdW5sb2NrKCZkZXZfbGlzdF9sb2NrKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmbHVzaF93b3JrKCZkZXYtPnJlc2V0X3dvcmspOwogCW1pc2NfZGVyZWdpc3RlcigmZGV2LT5taXNjZGV2KTsKKwludm1lX2Rldl9yZW1vdmUoZGV2KTsKKwludm1lX2Rldl9zaHV0ZG93bihkZXYpOworCW52bWVfZnJlZV9xdWV1ZXMoZGV2LCAwKTsKKwludm1lX3JlbGVhc2VfaW5zdGFuY2UoZGV2KTsKKwludm1lX3JlbGVhc2VfcHJwX3Bvb2xzKGRldik7CiAJa3JlZl9wdXQoJmRldi0+a3JlZiwgbnZtZV9mcmVlX2Rldik7CiB9CiAKQEAgLTIyNDEsMTMgKzI1NTEsMTIgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgbnZtZV9kZXYgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKIAotCXJldCA9IG52bWVfZGV2X3N0YXJ0KG5kZXYpOwotCS8qIFhYWDogc2hvdWxkIHJlbW92ZSBnZW5kaXNrcyBpZiByZXN1bWUgZmFpbHMgKi8KLQlpZiAocmV0KQotCQludm1lX2ZyZWVfcXVldWVzKG5kZXYpOwotCXJldHVybiByZXQ7CisJaWYgKG52bWVfZGV2X3Jlc3VtZShuZGV2KSAmJiAhd29ya19idXN5KCZuZGV2LT5yZXNldF93b3JrKSkgeworCQlQUkVQQVJFX1dPUksoJm5kZXYtPnJlc2V0X3dvcmssIG52bWVfcmVzZXRfZmFpbGVkX2Rldik7CisJCXF1ZXVlX3dvcmsobnZtZV93b3JrcSwgJm5kZXYtPnJlc2V0X3dvcmspOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG52bWVfZGV2X3BtX29wcywgbnZtZV9zdXNwZW5kLCBudm1lX3Jlc3VtZSk7CkBAIC0yMjc0LDYgKzI1ODMsNyBAQAogCS5pZF90YWJsZQk9IG52bWVfaWRfdGFibGUsCiAJLnByb2JlCQk9IG52bWVfcHJvYmUsCiAJLnJlbW92ZQkJPSBudm1lX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBudm1lX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewogCQkucG0JPSAmbnZtZV9kZXZfcG1fb3BzLAogCX0sCkBAIC0yMjg4LDkgKzI1OTgsMTQgQEAKIAlpZiAoSVNfRVJSKG52bWVfdGhyZWFkKSkKIAkJcmV0dXJuIFBUUl9FUlIobnZtZV90aHJlYWQpOwogCisJcmVzdWx0ID0gLUVOT01FTTsKKwludm1lX3dvcmtxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm52bWUiKTsKKwlpZiAoIW52bWVfd29ya3EpCisJCWdvdG8ga2lsbF9rdGhyZWFkOworCiAJcmVzdWx0ID0gcmVnaXN0ZXJfYmxrZGV2KG52bWVfbWFqb3IsICJudm1lIik7CiAJaWYgKHJlc3VsdCA8IDApCi0JCWdvdG8ga2lsbF9rdGhyZWFkOworCQlnb3RvIGtpbGxfd29ya3E7CiAJZWxzZSBpZiAocmVzdWx0ID4gMCkKIAkJbnZtZV9tYWpvciA9IHJlc3VsdDsKIApAQCAtMjMwMSw2ICsyNjE2LDggQEAKIAogIHVucmVnaXN0ZXJfYmxrZGV2OgogCXVucmVnaXN0ZXJfYmxrZGV2KG52bWVfbWFqb3IsICJudm1lIik7Cisga2lsbF93b3JrcToKKwlkZXN0cm95X3dvcmtxdWV1ZShudm1lX3dvcmtxKTsKICBraWxsX2t0aHJlYWQ6CiAJa3RocmVhZF9zdG9wKG52bWVfdGhyZWFkKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjMxMCw2ICsyNjI3LDcgQEAKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm52bWVfZHJpdmVyKTsKIAl1bnJlZ2lzdGVyX2Jsa2Rldihudm1lX21ham9yLCAibnZtZSIpOworCWRlc3Ryb3lfd29ya3F1ZXVlKG52bWVfd29ya3EpOwogCWt0aHJlYWRfc3RvcChudm1lX3RocmVhZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbnZtZS1zY3NpLmMgYi9kcml2ZXJzL2Jsb2NrL252bWUtc2NzaS5jCmluZGV4IDRhNGZmNGUuLjRhMGNlYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbnZtZS1zY3NpLmMKKysrIGIvZHJpdmVycy9ibG9jay9udm1lLXNjc2kuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtMzAzOCw2ICszMDM5LDE1MiBAQAogCXJldHVybiByZXRjb2RlOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9faGRyMzIgeworCWNvbXBhdF9pbnRfdCBpbnRlcmZhY2VfaWQ7CS8qIFtpXSAnUycgZm9yIFNDU0kgZ2VuZXJpYyAocmVxdWlyZWQpICovCisJY29tcGF0X2ludF90IGR4ZmVyX2RpcmVjdGlvbjsJLyogW2ldIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICAqLworCXVuc2lnbmVkIGNoYXIgY21kX2xlbjsJCS8qIFtpXSBTQ1NJIGNvbW1hbmQgbGVuZ3RoICggPD0gMTYgYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciBteF9zYl9sZW47CQkvKiBbaV0gbWF4IGxlbmd0aCB0byB3cml0ZSB0byBzYnAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpb3ZlY19jb3VudDsJLyogW2ldIDAgaW1wbGllcyBubyBzY2F0dGVyIGdhdGhlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJfbGVuOwkJLyogW2ldIGJ5dGUgY291bnQgb2YgZGF0YSB0cmFuc2ZlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJwOwkJLyogW2ldLCBbKmlvXSBwb2ludHMgdG8gZGF0YSB0cmFuc2ZlciBtZW1vcnkKKwkJCQkJICAgICAgb3Igc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCWNvbXBhdF91cHRyX3QgY21kcDsJCS8qIFtpXSwgWyppXSBwb2ludHMgdG8gY29tbWFuZCB0byBwZXJmb3JtICovCisJY29tcGF0X3VwdHJfdCBzYnA7CQkvKiBbaV0sIFsqb10gcG9pbnRzIHRvIHNlbnNlX2J1ZmZlciBtZW1vcnkgKi8KKwljb21wYXRfdWludF90IHRpbWVvdXQ7CQkvKiBbaV0gTUFYX1VJTlQtPm5vIHRpbWVvdXQgKHVuaXQ6IG1pbGxpc2VjKSAqLworCWNvbXBhdF91aW50X3QgZmxhZ3M7CQkvKiBbaV0gMCAtPiBkZWZhdWx0LCBzZWUgU0dfRkxBRy4uLiAqLworCWNvbXBhdF9pbnRfdCBwYWNrX2lkOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5IChub3JtYWxseSkgKi8KKwljb21wYXRfdXB0cl90IHVzcl9wdHI7CQkvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsJCS8qIFtvXSBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbWFza2VkX3N0YXR1czsJLyogW29dIHNoaWZ0ZWQsIG1hc2tlZCBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbXNnX3N0YXR1czsJCS8qIFtvXSBtZXNzYWdpbmcgbGV2ZWwgZGF0YSAob3B0aW9uYWwpICovCisJdW5zaWduZWQgY2hhciBzYl9sZW5fd3I7CQkvKiBbb10gYnl0ZSBjb3VudCBhY3R1YWxseSB3cml0dGVuIHRvIHNicCAqLworCXVuc2lnbmVkIHNob3J0IGhvc3Rfc3RhdHVzOwkvKiBbb10gZXJyb3JzIGZyb20gaG9zdCBhZGFwdGVyICovCisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX3N0YXR1czsJLyogW29dIGVycm9ycyBmcm9tIHNvZnR3YXJlIGRyaXZlciAqLworCWNvbXBhdF9pbnRfdCByZXNpZDsJCS8qIFtvXSBkeGZlcl9sZW4gLSBhY3R1YWxfdHJhbnNmZXJyZWQgKi8KKwljb21wYXRfdWludF90IGR1cmF0aW9uOwkJLyogW29dIHRpbWUgdGFrZW4gYnkgY21kICh1bml0OiBtaWxsaXNlYykgKi8KKwljb21wYXRfdWludF90IGluZm87CQkvKiBbb10gYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCit9IHNnX2lvX2hkcjMyX3Q7ICAvKiA2NCBieXRlcyBsb25nIChvbiBzcGFyYzMyKSAqLworCit0eXBlZGVmIHN0cnVjdCBzZ19pb3ZlYzMyIHsKKwljb21wYXRfdWludF90IGlvdl9iYXNlOworCWNvbXBhdF91aW50X3QgaW92X2xlbjsKK30gc2dfaW92ZWMzMl90OworCitzdGF0aWMgaW50IHNnX2J1aWxkX2lvdmVjKHNnX2lvX2hkcl90IF9fdXNlciAqc2dpbywgdm9pZCBfX3VzZXIgKmR4ZmVycCwgdTE2IGlvdmVjX2NvdW50KQoreworCXNnX2lvdmVjX3QgX191c2VyICppb3YgPSAoc2dfaW92ZWNfdCBfX3VzZXIgKikgKHNnaW8gKyAxKTsKKwlzZ19pb3ZlYzMyX3QgX191c2VyICppb3YzMiA9IGR4ZmVycDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3ZlY19jb3VudDsgaSsrKSB7CisJCXUzMiBiYXNlLCBsZW47CisKKwkJaWYgKGdldF91c2VyKGJhc2UsICZpb3YzMltpXS5pb3ZfYmFzZSkgfHwKKwkJICAgIGdldF91c2VyKGxlbiwgJmlvdjMyW2ldLmlvdl9sZW4pIHx8CisJCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGJhc2UpLCAmaW92W2ldLmlvdl9iYXNlKSB8fAorCQkgICAgcHV0X3VzZXIobGVuLCAmaW92W2ldLmlvdl9sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHB1dF91c2VyKGlvdiwgJnNnaW8tPmR4ZmVycCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgbnZtZV9zZ19pbzMyKHN0cnVjdCBudm1lX25zICpucywgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc2dfaW9faGRyMzJfdCBfX3VzZXIgKnNnaW8zMiA9IChzZ19pb19oZHIzMl90IF9fdXNlciAqKWFyZzsKKwlzZ19pb19oZHJfdCBfX3VzZXIgKnNnaW87CisJdTE2IGlvdmVjX2NvdW50OworCXUzMiBkYXRhOworCXZvaWQgX191c2VyICpkeGZlcnA7CisJaW50IGVycjsKKwlpbnQgaW50ZXJmYWNlX2lkOworCisJaWYgKGdldF91c2VyKGludGVyZmFjZV9pZCwgJnNnaW8zMi0+aW50ZXJmYWNlX2lkKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGludGVyZmFjZV9pZCAhPSAnUycpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKGlvdmVjX2NvdW50LCAmc2dpbzMyLT5pb3ZlY19jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJeworCQl2b2lkIF9fdXNlciAqdG9wID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UoMCk7CisJCXZvaWQgX191c2VyICpuZXcgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc2dfaW9faGRyX3QpICsKKwkJCQkgICAgICAgKGlvdmVjX2NvdW50ICogc2l6ZW9mKHNnX2lvdmVjX3QpKSk7CisJCWlmIChuZXcgPiB0b3ApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzZ2lvID0gbmV3OworCX0KKworCS8qIE9rLCBub3cgY29uc3RydWN0LiAgKi8KKwlpZiAoY29weV9pbl91c2VyKCZzZ2lvLT5pbnRlcmZhY2VfaWQsICZzZ2lvMzItPmludGVyZmFjZV9pZCwKKwkJCSAoMiAqIHNpemVvZihpbnQpKSArCisJCQkgKDIgKiBzaXplb2YodW5zaWduZWQgY2hhcikpICsKKwkJCSAoMSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpICsKKwkJCSAoMSAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGRhdGEsICZzZ2lvMzItPmR4ZmVycCkpCisJCXJldHVybiAtRUZBVUxUOworCWR4ZmVycCA9IGNvbXBhdF9wdHIoZGF0YSk7CisJaWYgKGlvdmVjX2NvdW50KSB7CisJCWlmIChzZ19idWlsZF9pb3ZlYyhzZ2lvLCBkeGZlcnAsIGlvdmVjX2NvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWlmIChwdXRfdXNlcihkeGZlcnAsICZzZ2lvLT5keGZlcnApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJeworCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqY21kcDsKKwkJdW5zaWduZWQgY2hhciBfX3VzZXIgKnNicDsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJnNnaW8zMi0+Y21kcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJY21kcCA9IGNvbXBhdF9wdHIoZGF0YSk7CisKKwkJaWYgKGdldF91c2VyKGRhdGEsICZzZ2lvMzItPnNicCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2JwID0gY29tcGF0X3B0cihkYXRhKTsKKworCQlpZiAocHV0X3VzZXIoY21kcCwgJnNnaW8tPmNtZHApIHx8CisJCSAgICBwdXRfdXNlcihzYnAsICZzZ2lvLT5zYnApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGNvcHlfaW5fdXNlcigmc2dpby0+dGltZW91dCwgJnNnaW8zMi0+dGltZW91dCwKKwkJCSAzICogc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihkYXRhLCAmc2dpbzMyLT51c3JfcHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHB1dF91c2VyKGNvbXBhdF9wdHIoZGF0YSksICZzZ2lvLT51c3JfcHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBudm1lX3NnX2lvKG5zLCBzZ2lvKTsKKwlpZiAoZXJyID49IDApIHsKKwkJdm9pZCBfX3VzZXIgKmRhdGFwOworCisJCWlmIChjb3B5X2luX3VzZXIoJnNnaW8zMi0+cGFja19pZCwgJnNnaW8tPnBhY2tfaWQsCisJCQkJIHNpemVvZihpbnQpKSB8fAorCQkgICAgZ2V0X3VzZXIoZGF0YXAsICZzZ2lvLT51c3JfcHRyKSB8fAorCQkgICAgcHV0X3VzZXIoKHUzMikodW5zaWduZWQgbG9uZylkYXRhcCwKKwkJCSAgICAgJnNnaW8zMi0+dXNyX3B0cikgfHwKKwkJICAgIGNvcHlfaW5fdXNlcigmc2dpbzMyLT5zdGF0dXMsICZzZ2lvLT5zdGF0dXMsCisJCQkJICg0ICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSArCisJCQkJICgyICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkgKworCQkJCSAoMyAqIHNpemVvZihpbnQpKSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKwogaW50IG52bWVfc2dfZ2V0X3ZlcnNpb25fbnVtKGludCBfX3VzZXIgKmlwKQogewogCXJldHVybiBwdXRfdXNlcihzZ192ZXJzaW9uX251bSwgaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKaW5kZXggNGEyN2IxZC4uMmNlM2RmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCkBAIC01ODEsNyArNTgxLDcgQEAKIAogCWlmIChoZHIubWFnaWMgIT0gUEdfTUFHSUMpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChoZHIuZGxlbiA+IFBHX01BWF9EQVRBKQorCWlmIChoZHIuZGxlbiA8IDAgfHwgaGRyLmRsZW4gPiBQR19NQVhfREFUQSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKChjb3VudCAtIGhzKSA+IFBHX01BWF9EQVRBKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKaW5kZXggZmY4NjY4Yy4uYTJhZjczZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKQEAgLTY1MSw3ICs2NTEsNyBAQAogCiAJZm9yICg7OykgewogCQl0bXAgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGt0X3JiX25vZGUsIHJiX25vZGUpOwotCQlpZiAocyA8PSB0bXAtPmJpby0+Ymlfc2VjdG9yKQorCQlpZiAocyA8PSB0bXAtPmJpby0+YmlfaXRlci5iaV9zZWN0b3IpCiAJCQluZXh0ID0gbi0+cmJfbGVmdDsKIAkJZWxzZQogCQkJbmV4dCA9IG4tPnJiX3JpZ2h0OwpAQCAtNjYwLDEyICs2NjAsMTIgQEAKIAkJbiA9IG5leHQ7CiAJfQogCi0JaWYgKHMgPiB0bXAtPmJpby0+Ymlfc2VjdG9yKSB7CisJaWYgKHMgPiB0bXAtPmJpby0+YmlfaXRlci5iaV9zZWN0b3IpIHsKIAkJdG1wID0gcGt0X3JidHJlZV9uZXh0KHRtcCk7CiAJCWlmICghdG1wKQogCQkJcmV0dXJuIE5VTEw7CiAJfQotCUJVR19PTihzID4gdG1wLT5iaW8tPmJpX3NlY3Rvcik7CisJQlVHX09OKHMgPiB0bXAtPmJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCXJldHVybiB0bXA7CiB9CiAKQEAgLTY3NiwxMyArNjc2LDEzIEBACiB7CiAJc3RydWN0IHJiX25vZGUgKipwID0gJnBkLT5iaW9fcXVldWUucmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzZWN0b3JfdCBzID0gbm9kZS0+YmlvLT5iaV9zZWN0b3I7CisJc2VjdG9yX3QgcyA9IG5vZGUtPmJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAJc3RydWN0IHBrdF9yYl9ub2RlICp0bXA7CiAKIAl3aGlsZSAoKnApIHsKIAkJcGFyZW50ID0gKnA7CiAJCXRtcCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHBrdF9yYl9ub2RlLCByYl9ub2RlKTsKLQkJaWYgKHMgPCB0bXAtPmJpby0+Ymlfc2VjdG9yKQorCQlpZiAocyA8IHRtcC0+YmlvLT5iaV9pdGVyLmJpX3NlY3RvcikKIAkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKIAkJZWxzZQogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKQEAgLTcwNiw3ICs3MDYsOSBAQAogCQkJICAgICBXUklURSA6IFJFQUQsIF9fR0ZQX1dBSVQpOwogCiAJaWYgKGNnYy0+YnVmbGVuKSB7Ci0JCWlmIChibGtfcnFfbWFwX2tlcm4ocSwgcnEsIGNnYy0+YnVmZmVyLCBjZ2MtPmJ1ZmxlbiwgX19HRlBfV0FJVCkpCisJCXJldCA9IGJsa19ycV9tYXBfa2VybihxLCBycSwgY2djLT5idWZmZXIsIGNnYy0+YnVmbGVuLAorCQkJCSAgICAgIF9fR0ZQX1dBSVQpOworCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCkBAIC04NTcsNyArODU5LDggQEAKIAkJCXNwaW5fbG9jaygmcGQtPmlvc2NoZWQubG9jayk7CiAJCQliaW8gPSBiaW9fbGlzdF9wZWVrKCZwZC0+aW9zY2hlZC53cml0ZV9xdWV1ZSk7CiAJCQlzcGluX3VubG9jaygmcGQtPmlvc2NoZWQubG9jayk7Ci0JCQlpZiAoYmlvICYmIChiaW8tPmJpX3NlY3RvciA9PSBwZC0+aW9zY2hlZC5sYXN0X3dyaXRlKSkKKwkJCWlmIChiaW8gJiYgKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPT0KKwkJCQkgICAgcGQtPmlvc2NoZWQubGFzdF93cml0ZSkpCiAJCQkJbmVlZF93cml0ZV9zZWVrID0gMDsKIAkJCWlmIChuZWVkX3dyaXRlX3NlZWsgJiYgcmVhZHNfcXVldWVkKSB7CiAJCQkJaWYgKGF0b21pY19yZWFkKCZwZC0+Y2Rydy5wZW5kaW5nX2Jpb3MpID4gMCkgewpAQCAtODg4LDcgKzg5MSw4IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkKLQkJCXBkLT5pb3NjaGVkLnN1Y2Nlc3NpdmVfcmVhZHMgKz0gYmlvLT5iaV9zaXplID4+IDEwOworCQkJcGQtPmlvc2NoZWQuc3VjY2Vzc2l2ZV9yZWFkcyArPQorCQkJCWJpby0+YmlfaXRlci5iaV9zaXplID4+IDEwOwogCQllbHNlIHsKIAkJCXBkLT5pb3NjaGVkLnN1Y2Nlc3NpdmVfcmVhZHMgPSAwOwogCQkJcGQtPmlvc2NoZWQubGFzdF93cml0ZSA9IGJpb19lbmRfc2VjdG9yKGJpbyk7CkBAIC05NzgsNyArOTgyLDcgQEAKIAogCXBrdF9kYmcoMiwgcGQsICJiaW89JXAgc2VjMD0lbGx4IHNlYz0lbGx4IGVycj0lZFxuIiwKIAkJYmlvLCAodW5zaWduZWQgbG9uZyBsb25nKXBrdC0+c2VjdG9yLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBlcnIpOworCQkodW5zaWduZWQgbG9uZyBsb25nKWJpby0+YmlfaXRlci5iaV9zZWN0b3IsIGVycik7CiAKIAlpZiAoZXJyKQogCQlhdG9taWNfaW5jKCZwa3QtPmlvX2Vycm9ycyk7CkBAIC0xMDI2LDggKzEwMzAsOSBAQAogCW1lbXNldCh3cml0dGVuLCAwLCBzaXplb2Yod3JpdHRlbikpOwogCXNwaW5fbG9jaygmcGt0LT5sb2NrKTsKIAliaW9fbGlzdF9mb3JfZWFjaChiaW8sICZwa3QtPm9yaWdfYmlvcykgewotCQlpbnQgZmlyc3RfZnJhbWUgPSAoYmlvLT5iaV9zZWN0b3IgLSBwa3QtPnNlY3RvcikgLyAoQ0RfRlJBTUVTSVpFID4+IDkpOwotCQlpbnQgbnVtX2ZyYW1lcyA9IGJpby0+Ymlfc2l6ZSAvIENEX0ZSQU1FU0laRTsKKwkJaW50IGZpcnN0X2ZyYW1lID0gKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgLSBwa3QtPnNlY3RvcikgLworCQkJKENEX0ZSQU1FU0laRSA+PiA5KTsKKwkJaW50IG51bV9mcmFtZXMgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSAvIENEX0ZSQU1FU0laRTsKIAkJcGQtPnN0YXRzLnNlY3NfdyArPSBudW1fZnJhbWVzICogKENEX0ZSQU1FU0laRSA+PiA5KTsKIAkJQlVHX09OKGZpcnN0X2ZyYW1lIDwgMCk7CiAJCUJVR19PTihmaXJzdF9mcmFtZSArIG51bV9mcmFtZXMgPiBwa3QtPmZyYW1lcyk7CkBAIC0xMDUzLDcgKzEwNTgsNyBAQAogCiAJCWJpbyA9IHBrdC0+cl9iaW9zW2ZdOwogCQliaW9fcmVzZXQoYmlvKTsKLQkJYmlvLT5iaV9zZWN0b3IgPSBwa3QtPnNlY3RvciArIGYgKiAoQ0RfRlJBTUVTSVpFID4+IDkpOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGt0LT5zZWN0b3IgKyBmICogKENEX0ZSQU1FU0laRSA+PiA5KTsKIAkJYmlvLT5iaV9iZGV2ID0gcGQtPmJkZXY7CiAJCWJpby0+YmlfZW5kX2lvID0gcGt0X2VuZF9pb19yZWFkOwogCQliaW8tPmJpX3ByaXZhdGUgPSBwa3Q7CkBAIC0xMTUwLDggKzExNTUsOCBAQAogCWJpb19yZXNldChwa3QtPmJpbyk7CiAJcGt0LT5iaW8tPmJpX2JkZXYgPSBwZC0+YmRldjsKIAlwa3QtPmJpby0+YmlfcncgPSBSRVFfV1JJVEU7Ci0JcGt0LT5iaW8tPmJpX3NlY3RvciA9IG5ld19zZWN0b3I7Ci0JcGt0LT5iaW8tPmJpX3NpemUgPSBwa3QtPmZyYW1lcyAqIENEX0ZSQU1FU0laRTsKKwlwa3QtPmJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBuZXdfc2VjdG9yOworCXBrdC0+YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBwa3QtPmZyYW1lcyAqIENEX0ZSQU1FU0laRTsKIAlwa3QtPmJpby0+YmlfdmNudCA9IHBrdC0+ZnJhbWVzOwogCiAJcGt0LT5iaW8tPmJpX2VuZF9pbyA9IHBrdF9lbmRfaW9fcGFja2V0X3dyaXRlOwpAQCAtMTIxMyw3ICsxMjE4LDcgQEAKIAlub2RlID0gZmlyc3Rfbm9kZTsKIAl3aGlsZSAobm9kZSkgewogCQliaW8gPSBub2RlLT5iaW87Ci0JCXpvbmUgPSBnZXRfem9uZShiaW8tPmJpX3NlY3RvciwgcGQpOworCQl6b25lID0gZ2V0X3pvbmUoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgcGQpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwZC0+Y2Rydy5wa3RfYWN0aXZlX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChwLT5zZWN0b3IgPT0gem9uZSkgewogCQkJCWJpbyA9IE5VTEw7CkBAIC0xMjUyLDE0ICsxMjU3LDE0IEBACiAJcGt0X2RiZygyLCBwZCwgImxvb2tpbmcgZm9yIHpvbmUgJWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lKTsKIAl3aGlsZSAoKG5vZGUgPSBwa3RfcmJ0cmVlX2ZpbmQocGQsIHpvbmUpKSAhPSBOVUxMKSB7CiAJCWJpbyA9IG5vZGUtPmJpbzsKLQkJcGt0X2RiZygyLCBwZCwgImZvdW5kIHpvbmU9JWxseFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZ2V0X3pvbmUoYmlvLT5iaV9zZWN0b3IsIHBkKSk7Ci0JCWlmIChnZXRfem9uZShiaW8tPmJpX3NlY3RvciwgcGQpICE9IHpvbmUpCisJCXBrdF9kYmcoMiwgcGQsICJmb3VuZCB6b25lPSVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQlnZXRfem9uZShiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBwZCkpOworCQlpZiAoZ2V0X3pvbmUoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgcGQpICE9IHpvbmUpCiAJCQlicmVhazsKIAkJcGt0X3JidHJlZV9lcmFzZShwZCwgbm9kZSk7CiAJCXNwaW5fbG9jaygmcGt0LT5sb2NrKTsKIAkJYmlvX2xpc3RfYWRkKCZwa3QtPm9yaWdfYmlvcywgYmlvKTsKLQkJcGt0LT53cml0ZV9zaXplICs9IGJpby0+Ymlfc2l6ZSAvIENEX0ZSQU1FU0laRTsKKwkJcGt0LT53cml0ZV9zaXplICs9IGJpby0+YmlfaXRlci5iaV9zaXplIC8gQ0RfRlJBTUVTSVpFOwogCQlzcGluX3VubG9jaygmcGt0LT5sb2NrKTsKIAl9CiAJLyogY2hlY2sgd3JpdGUgY29uZ2VzdGlvbiBtYXJrcywgYW5kIGlmIGJpb19xdWV1ZV9zaXplIGlzCkBAIC0xMjkzLDcgKzEyOTgsNyBAQAogCXN0cnVjdCBiaW9fdmVjICpidmVjID0gcGt0LT53X2Jpby0+YmlfaW9fdmVjOwogCiAJYmlvX3Jlc2V0KHBrdC0+d19iaW8pOwotCXBrdC0+d19iaW8tPmJpX3NlY3RvciA9IHBrdC0+c2VjdG9yOworCXBrdC0+d19iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGt0LT5zZWN0b3I7CiAJcGt0LT53X2Jpby0+YmlfYmRldiA9IHBkLT5iZGV2OwogCXBrdC0+d19iaW8tPmJpX2VuZF9pbyA9IHBrdF9lbmRfaW9fcGFja2V0X3dyaXRlOwogCXBrdC0+d19iaW8tPmJpX3ByaXZhdGUgPSBwa3Q7CkBAIC0yMzM1LDc1ICsyMzQwLDI5IEBACiAJcGt0X2Jpb19maW5pc2hlZChwZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBrdF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIHBrdF9tYWtlX3JlcXVlc3RfcmVhZChzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZDsKLQljaGFyIGJbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IGJpbyAqY2xvbmVkX2JpbyA9IGJpb19jbG9uZShiaW8sIEdGUF9OT0lPKTsKKwlzdHJ1Y3QgcGFja2V0X3N0YWNrZWRfZGF0YSAqcHNkID0gbWVtcG9vbF9hbGxvYyhwc2RfcG9vbCwgR0ZQX05PSU8pOworCisJcHNkLT5wZCA9IHBkOworCXBzZC0+YmlvID0gYmlvOworCWNsb25lZF9iaW8tPmJpX2JkZXYgPSBwZC0+YmRldjsKKwljbG9uZWRfYmlvLT5iaV9wcml2YXRlID0gcHNkOworCWNsb25lZF9iaW8tPmJpX2VuZF9pbyA9IHBrdF9lbmRfaW9fcmVhZF9jbG9uZWQ7CisJcGQtPnN0YXRzLnNlY3NfciArPSBiaW9fc2VjdG9ycyhiaW8pOworCXBrdF9xdWV1ZV9iaW8ocGQsIGNsb25lZF9iaW8pOworfQorCitzdGF0aWMgdm9pZCBwa3RfbWFrZV9yZXF1ZXN0X3dyaXRlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCA9IHEtPnF1ZXVlZGF0YTsKIAlzZWN0b3JfdCB6b25lOwogCXN0cnVjdCBwYWNrZXRfZGF0YSAqcGt0OwogCWludCB3YXNfZW1wdHksIGJsb2NrZWRfYmlvOwogCXN0cnVjdCBwa3RfcmJfbm9kZSAqbm9kZTsKIAotCXBkID0gcS0+cXVldWVkYXRhOwotCWlmICghcGQpIHsKLQkJcHJfZXJyKCIlcyBpbmNvcnJlY3QgcmVxdWVzdCBxdWV1ZVxuIiwKLQkJICAgICAgIGJkZXZuYW1lKGJpby0+YmlfYmRldiwgYikpOwotCQlnb3RvIGVuZF9pbzsKLQl9Ci0KLQkvKgotCSAqIENsb25lIFJFQUQgYmlvcyBzbyB3ZSBjYW4gaGF2ZSBvdXIgb3duIGJpX2VuZF9pbyBjYWxsYmFjay4KLQkgKi8KLQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgewotCQlzdHJ1Y3QgYmlvICpjbG9uZWRfYmlvID0gYmlvX2Nsb25lKGJpbywgR0ZQX05PSU8pOwotCQlzdHJ1Y3QgcGFja2V0X3N0YWNrZWRfZGF0YSAqcHNkID0gbWVtcG9vbF9hbGxvYyhwc2RfcG9vbCwgR0ZQX05PSU8pOwotCi0JCXBzZC0+cGQgPSBwZDsKLQkJcHNkLT5iaW8gPSBiaW87Ci0JCWNsb25lZF9iaW8tPmJpX2JkZXYgPSBwZC0+YmRldjsKLQkJY2xvbmVkX2Jpby0+YmlfcHJpdmF0ZSA9IHBzZDsKLQkJY2xvbmVkX2Jpby0+YmlfZW5kX2lvID0gcGt0X2VuZF9pb19yZWFkX2Nsb25lZDsKLQkJcGQtPnN0YXRzLnNlY3NfciArPSBiaW9fc2VjdG9ycyhiaW8pOwotCQlwa3RfcXVldWVfYmlvKHBkLCBjbG9uZWRfYmlvKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghdGVzdF9iaXQoUEFDS0VUX1dSSVRBQkxFLCAmcGQtPmZsYWdzKSkgewotCQlwa3Rfbm90aWNlKHBkLCAiV1JJVEUgZm9yIHJvIGRldmljZSAoJWxsdSlcbiIsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yKTsKLQkJZ290byBlbmRfaW87Ci0JfQotCi0JaWYgKCFiaW8tPmJpX3NpemUgfHwgKGJpby0+Ymlfc2l6ZSAlIENEX0ZSQU1FU0laRSkpIHsKLQkJcGt0X2VycihwZCwgIndyb25nIGJpbyBzaXplXG4iKTsKLQkJZ290byBlbmRfaW87Ci0JfQotCi0JYmxrX3F1ZXVlX2JvdW5jZShxLCAmYmlvKTsKLQotCXpvbmUgPSBnZXRfem9uZShiaW8tPmJpX3NlY3RvciwgcGQpOwotCXBrdF9kYmcoMiwgcGQsICJzdGFydCA9ICU2bGx4IHN0b3AgPSAlNmxseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW9fZW5kX3NlY3RvcihiaW8pKTsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgdG8gc3BsaXQgdGhlIGJpbyAqLwotCXsKLQkJc3RydWN0IGJpb19wYWlyICpicDsKLQkJc2VjdG9yX3QgbGFzdF96b25lOwotCQlpbnQgZmlyc3Rfc2VjdG9yczsKLQotCQlsYXN0X3pvbmUgPSBnZXRfem9uZShiaW9fZW5kX3NlY3RvcihiaW8pIC0gMSwgcGQpOwotCQlpZiAobGFzdF96b25lICE9IHpvbmUpIHsKLQkJCUJVR19PTihsYXN0X3pvbmUgIT0gem9uZSArIHBkLT5zZXR0aW5ncy5zaXplKTsKLQkJCWZpcnN0X3NlY3RvcnMgPSBsYXN0X3pvbmUgLSBiaW8tPmJpX3NlY3RvcjsKLQkJCWJwID0gYmlvX3NwbGl0KGJpbywgZmlyc3Rfc2VjdG9ycyk7Ci0JCQlCVUdfT04oIWJwKTsKLQkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKTsKLQkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8yKTsKLQkJCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorCXpvbmUgPSBnZXRfem9uZShiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBwZCk7CiAKIAkvKgogCSAqIElmIHdlIGZpbmQgYSBtYXRjaGluZyBwYWNrZXQgaW4gc3RhdGUgV0FJVElORyBvciBSRUFEX1dBSVQsIHdlIGNhbgpAQCAtMjQxNyw3ICsyMzc2LDggQEAKIAkJCWlmICgocGt0LT5zdGF0ZSA9PSBQQUNLRVRfV0FJVElOR19TVEFURSkgfHwKIAkJCSAgICAocGt0LT5zdGF0ZSA9PSBQQUNLRVRfUkVBRF9XQUlUX1NUQVRFKSkgewogCQkJCWJpb19saXN0X2FkZCgmcGt0LT5vcmlnX2Jpb3MsIGJpbyk7Ci0JCQkJcGt0LT53cml0ZV9zaXplICs9IGJpby0+Ymlfc2l6ZSAvIENEX0ZSQU1FU0laRTsKKwkJCQlwa3QtPndyaXRlX3NpemUgKz0KKwkJCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUgLyBDRF9GUkFNRVNJWkU7CiAJCQkJaWYgKChwa3QtPndyaXRlX3NpemUgPj0gcGt0LT5mcmFtZXMpICYmCiAJCQkJICAgIChwa3QtPnN0YXRlID09IFBBQ0tFVF9XQUlUSU5HX1NUQVRFKSkgewogCQkJCQlhdG9taWNfaW5jKCZwa3QtPnJ1bl9zbSk7CkBAIC0yNDc2LDYgKzI0MzYsNjQgQEAKIAkJICovCiAJCXdha2VfdXAoJnBkLT53cXVldWUpOwogCX0KK30KKworc3RhdGljIHZvaWQgcGt0X21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQ7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCBiaW8gKnNwbGl0OworCisJcGQgPSBxLT5xdWV1ZWRhdGE7CisJaWYgKCFwZCkgeworCQlwcl9lcnIoIiVzIGluY29ycmVjdCByZXF1ZXN0IHF1ZXVlXG4iLAorCQkgICAgICAgYmRldm5hbWUoYmlvLT5iaV9iZGV2LCBiKSk7CisJCWdvdG8gZW5kX2lvOworCX0KKworCXBrdF9kYmcoMiwgcGQsICJzdGFydCA9ICU2bGx4IHN0b3AgPSAlNmxseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWJpb19lbmRfc2VjdG9yKGJpbykpOworCisJLyoKKwkgKiBDbG9uZSBSRUFEIGJpb3Mgc28gd2UgY2FuIGhhdmUgb3VyIG93biBiaV9lbmRfaW8gY2FsbGJhY2suCisJICovCisJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpIHsKKwkJcGt0X21ha2VfcmVxdWVzdF9yZWFkKHBkLCBiaW8pOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0ZXN0X2JpdChQQUNLRVRfV1JJVEFCTEUsICZwZC0+ZmxhZ3MpKSB7CisJCXBrdF9ub3RpY2UocGQsICJXUklURSBmb3Igcm8gZGV2aWNlICglbGx1KVxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CisJCWdvdG8gZW5kX2lvOworCX0KKworCWlmICghYmlvLT5iaV9pdGVyLmJpX3NpemUgfHwgKGJpby0+YmlfaXRlci5iaV9zaXplICUgQ0RfRlJBTUVTSVpFKSkgeworCQlwa3RfZXJyKHBkLCAid3JvbmcgYmlvIHNpemVcbiIpOworCQlnb3RvIGVuZF9pbzsKKwl9CisKKwlibGtfcXVldWVfYm91bmNlKHEsICZiaW8pOworCisJZG8geworCQlzZWN0b3JfdCB6b25lID0gZ2V0X3pvbmUoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgcGQpOworCQlzZWN0b3JfdCBsYXN0X3pvbmUgPSBnZXRfem9uZShiaW9fZW5kX3NlY3RvcihiaW8pIC0gMSwgcGQpOworCisJCWlmIChsYXN0X3pvbmUgIT0gem9uZSkgeworCQkJQlVHX09OKGxhc3Rfem9uZSAhPSB6b25lICsgcGQtPnNldHRpbmdzLnNpemUpOworCisJCQlzcGxpdCA9IGJpb19zcGxpdChiaW8sIGxhc3Rfem9uZSAtCisJCQkJCSAgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQkJICBHRlBfTk9JTywgZnNfYmlvX3NldCk7CisJCQliaW9fY2hhaW4oc3BsaXQsIGJpbyk7CisJCX0gZWxzZSB7CisJCQlzcGxpdCA9IGJpbzsKKwkJfQorCisJCXBrdF9tYWtlX3JlcXVlc3Rfd3JpdGUocSwgc3BsaXQpOworCX0gd2hpbGUgKHNwbGl0ICE9IGJpbyk7CisKIAlyZXR1cm47CiBlbmRfaW86CiAJYmlvX2lvX2Vycm9yKGJpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYyBiL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCmluZGV4IGQ3NTRhODguLmMxMjBkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCisrKyBiL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCkBAIC05NCwyNiArOTQsMjUgQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgcmVxX2l0ZXJhdG9yIGl0ZXI7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IGJpb192ZWMgYnZlYzsKIAl1bnNpZ25lZCBpbnQgaSA9IDA7CiAJc2l6ZV90IHNpemU7CiAJdm9pZCAqYnVmOwogCiAJcnFfZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEsIGl0ZXIpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwKLQkJCSIlczoldTogYmlvICV1OiAldSBzZWdzICV1IHNlY3RvcnMgZnJvbSAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGksIGJpb19zZWdtZW50cyhpdGVyLmJpbyksCi0JCQliaW9fc2VjdG9ycyhpdGVyLmJpbyksIGl0ZXIuYmlvLT5iaV9zZWN0b3IpOworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IGJpbyAldTogJXUgc2VjdG9ycyBmcm9tICVsdVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSwgYmlvX3NlY3RvcnMoaXRlci5iaW8pLAorCQkJaXRlci5iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAotCQlzaXplID0gYnZlYy0+YnZfbGVuOwotCQlidWYgPSBidmVjX2ttYXBfaXJxKGJ2ZWMsICZmbGFncyk7CisJCXNpemUgPSBidmVjLmJ2X2xlbjsKKwkJYnVmID0gYnZlY19rbWFwX2lycSgmYnZlYywgJmZsYWdzKTsKIAkJaWYgKGdhdGhlcikKIAkJCW1lbWNweShkZXYtPmJvdW5jZV9idWYrb2Zmc2V0LCBidWYsIHNpemUpOwogCQllbHNlCiAJCQltZW1jcHkoYnVmLCBkZXYtPmJvdW5jZV9idWYrb2Zmc2V0LCBzaXplKTsKIAkJb2Zmc2V0ICs9IHNpemU7Ci0JCWZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZShidmVjLT5idl9wYWdlKTsKKwkJZmx1c2hfa2VybmVsX2RjYWNoZV9wYWdlKGJ2ZWMuYnZfcGFnZSk7CiAJCWJ2ZWNfa3VubWFwX2lycShidWYsICZmbGFncyk7CiAJCWkrKzsKIAl9CkBAIC0xMzAsNyArMTI5LDcgQEAKIAogI2lmZGVmIERFQlVHCiAJdW5zaWduZWQgaW50IG4gPSAwOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAlzdHJ1Y3QgcmVxX2l0ZXJhdG9yIGl0ZXI7CiAKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BzM3ZyYW0uYyBiL2RyaXZlcnMvYmxvY2svcHMzdnJhbS5jCmluZGV4IDA2YTJlNTMuLmVmNDVjZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcHMzdnJhbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcHMzdnJhbS5jCkBAIC01NTMsMTYgKzU1MywxNiBAQAogCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBwczNfc3lzdGVtX2J1c19nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB3cml0ZSA9IGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFOwogCWNvbnN0IGNoYXIgKm9wID0gd3JpdGUgPyAid3JpdGUiIDogInJlYWQiOwotCWxvZmZfdCBvZmZzZXQgPSBiaW8tPmJpX3NlY3RvciA8PCA5OworCWxvZmZfdCBvZmZzZXQgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDk7CiAJaW50IGVycm9yID0gMDsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgYmlvICpuZXh0OwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCS8qIFBTMyBpcyBwcGM2NCwgc28gd2UgZG9uJ3QgaGFuZGxlIGhpZ2htZW0gKi8KLQkJY2hhciAqcHRyID0gcGFnZV9hZGRyZXNzKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OwotCQlzaXplX3QgbGVuID0gYnZlYy0+YnZfbGVuLCByZXRsZW47CisJCWNoYXIgKnB0ciA9IHBhZ2VfYWRkcmVzcyhidmVjLmJ2X3BhZ2UpICsgYnZlYy5idl9vZmZzZXQ7CisJCXNpemVfdCBsZW4gPSBidmVjLmJ2X2xlbiwgcmV0bGVuOwogCiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiAgICAlcyAlenUgYnl0ZXMgYXQgb2Zmc2V0ICVsbHVcbiIsIG9wLAogCQkJbGVuLCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9yYmQuYyBiL2RyaXZlcnMvYmxvY2svcmJkLmMKaW5kZXggMTZjYWI2Ni4uYjM2NWUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9yYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JiZC5jCkBAIC0xMTU2LDIzICsxMTU2LDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHplcm9fYmlvX2NoYWluKHN0cnVjdCBiaW8gKmNoYWluLCBpbnQgc3RhcnRfb2ZzKQogewotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICpidWY7Ci0JaW50IGk7CiAJaW50IHBvcyA9IDA7CiAKIAl3aGlsZSAoY2hhaW4pIHsKLQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGNoYWluLCBpKSB7Ci0JCQlpZiAocG9zICsgYnYtPmJ2X2xlbiA+IHN0YXJ0X29mcykgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgY2hhaW4sIGl0ZXIpIHsKKwkJCWlmIChwb3MgKyBidi5idl9sZW4gPiBzdGFydF9vZnMpIHsKIAkJCQlpbnQgcmVtYWluZGVyID0gbWF4KHN0YXJ0X29mcyAtIHBvcywgMCk7Ci0JCQkJYnVmID0gYnZlY19rbWFwX2lycShidiwgJmZsYWdzKTsKKwkJCQlidWYgPSBidmVjX2ttYXBfaXJxKCZidiwgJmZsYWdzKTsKIAkJCQltZW1zZXQoYnVmICsgcmVtYWluZGVyLCAwLAotCQkJCSAgICAgICBidi0+YnZfbGVuIC0gcmVtYWluZGVyKTsKLQkJCQlmbHVzaF9kY2FjaGVfcGFnZShidi0+YnZfcGFnZSk7CisJCQkJICAgICAgIGJ2LmJ2X2xlbiAtIHJlbWFpbmRlcik7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoYnYuYnZfcGFnZSk7CiAJCQkJYnZlY19rdW5tYXBfaXJxKGJ1ZiwgJmZsYWdzKTsKIAkJCX0KLQkJCXBvcyArPSBidi0+YnZfbGVuOworCQkJcG9zICs9IGJ2LmJ2X2xlbjsKIAkJfQogCiAJCWNoYWluID0gY2hhaW4tPmJpX25leHQ7CkBAIC0xMjIwLDc0ICsxMjIwLDE0IEBACiAJCQkJCXVuc2lnbmVkIGludCBsZW4sCiAJCQkJCWdmcF90IGdmcG1hc2spCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCXVuc2lnbmVkIGludCByZXNpZDsKLQl1bnNpZ25lZCBzaG9ydCBpZHg7Ci0JdW5zaWduZWQgaW50IHZvZmY7Ci0JdW5zaWduZWQgc2hvcnQgZW5kX2lkeDsKLQl1bnNpZ25lZCBzaG9ydCB2Y250OwogCXN0cnVjdCBiaW8gKmJpbzsKIAotCS8qIEhhbmRsZSB0aGUgZWFzeSBjYXNlIGZvciB0aGUgY2FsbGVyICovCi0KLQlpZiAoIW9mZnNldCAmJiBsZW4gPT0gYmlvX3NyYy0+Ymlfc2l6ZSkKLQkJcmV0dXJuIGJpb19jbG9uZShiaW9fc3JjLCBnZnBtYXNrKTsKLQotCWlmIChXQVJOX09OX09OQ0UoIWxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChXQVJOX09OX09OQ0UobGVuID4gYmlvX3NyYy0+Ymlfc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChXQVJOX09OX09OQ0Uob2Zmc2V0ID4gYmlvX3NyYy0+Ymlfc2l6ZSAtIGxlbikpCi0JCXJldHVybiBOVUxMOwotCi0JLyogRmluZCBmaXJzdCBhZmZlY3RlZCBzZWdtZW50Li4uICovCi0KLQlyZXNpZCA9IG9mZnNldDsKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvX3NyYywgaWR4KSB7Ci0JCWlmIChyZXNpZCA8IGJ2LT5idl9sZW4pCi0JCQlicmVhazsKLQkJcmVzaWQgLT0gYnYtPmJ2X2xlbjsKLQl9Ci0Jdm9mZiA9IHJlc2lkOwotCi0JLyogLi4uYW5kIHRoZSBsYXN0IGFmZmVjdGVkIHNlZ21lbnQgKi8KLQotCXJlc2lkICs9IGxlbjsKLQlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW9fc3JjLCBlbmRfaWR4LCBpZHgpIHsKLQkJaWYgKHJlc2lkIDw9IGJ2LT5idl9sZW4pCi0JCQlicmVhazsKLQkJcmVzaWQgLT0gYnYtPmJ2X2xlbjsKLQl9Ci0JdmNudCA9IGVuZF9pZHggLSBpZHggKyAxOwotCi0JLyogQnVpbGQgdGhlIGNsb25lICovCi0KLQliaW8gPSBiaW9fYWxsb2MoZ2ZwbWFzaywgKHVuc2lnbmVkIGludCkgdmNudCk7CisJYmlvID0gYmlvX2Nsb25lKGJpb19zcmMsIGdmcG1hc2spOwogCWlmICghYmlvKQogCQlyZXR1cm4gTlVMTDsJLyogRU5PTUVNICovCiAKLQliaW8tPmJpX2JkZXYgPSBiaW9fc3JjLT5iaV9iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gYmlvX3NyYy0+Ymlfc2VjdG9yICsgKG9mZnNldCA+PiBTRUNUT1JfU0hJRlQpOwotCWJpby0+YmlfcncgPSBiaW9fc3JjLT5iaV9ydzsKLQliaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX0NMT05FRDsKLQotCS8qCi0JICogQ29weSBvdmVyIG91ciBwYXJ0IG9mIHRoZSBiaW9fdmVjLCB0aGVuIHVwZGF0ZSB0aGUgZmlyc3QKLQkgKiBhbmQgbGFzdCAob3Igb25seSkgZW50cmllcy4KLQkgKi8KLQltZW1jcHkoJmJpby0+YmlfaW9fdmVjWzBdLCAmYmlvX3NyYy0+YmlfaW9fdmVjW2lkeF0sCi0JCQl2Y250ICogc2l6ZW9mIChzdHJ1Y3QgYmlvX3ZlYykpOwotCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCArPSB2b2ZmOwotCWlmICh2Y250ID4gMSkgewotCQliaW8tPmJpX2lvX3ZlY1swXS5idl9sZW4gLT0gdm9mZjsKLQkJYmlvLT5iaV9pb192ZWNbdmNudCAtIDFdLmJ2X2xlbiA9IHJlc2lkOwotCX0gZWxzZSB7Ci0JCWJpby0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IGxlbjsKLQl9Ci0KLQliaW8tPmJpX3ZjbnQgPSB2Y250OwotCWJpby0+Ymlfc2l6ZSA9IGxlbjsKLQliaW8tPmJpX2lkeCA9IDA7CisJYmlvX2FkdmFuY2UoYmlvLCBvZmZzZXQpOworCWJpby0+YmlfaXRlci5iaV9zaXplID0gbGVuOwogCiAJcmV0dXJuIGJpbzsKIH0KQEAgLTEzMTgsNyArMTI1OCw3IEBACiAKIAkvKiBCdWlsZCB1cCBhIGNoYWluIG9mIGNsb25lIGJpb3MgdXAgdG8gdGhlIGxpbWl0ICovCiAKLQlpZiAoIWJpIHx8IG9mZiA+PSBiaS0+Ymlfc2l6ZSB8fCAhbGVuKQorCWlmICghYmkgfHwgb2ZmID49IGJpLT5iaV9pdGVyLmJpX3NpemUgfHwgIWxlbikKIAkJcmV0dXJuIE5VTEw7CQkvKiBOb3RoaW5nIHRvIGNsb25lICovCiAKIAllbmQgPSAmY2hhaW47CkBAIC0xMzMwLDcgKzEyNzAsNyBAQAogCQkJcmJkX3dhcm4oTlVMTCwgImJpb19jaGFpbiBleGhhdXN0ZWQgd2l0aCAldSBsZWZ0IiwgbGVuKTsKIAkJCWdvdG8gb3V0X2VycjsJLyogRUlOVkFMOyByYW4gb3V0IG9mIGJpbydzICovCiAJCX0KLQkJYmlfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgYmktPmJpX3NpemUgLSBvZmYsIGxlbik7CisJCWJpX3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGJpLT5iaV9pdGVyLmJpX3NpemUgLSBvZmYsIGxlbik7CiAJCWJpbyA9IGJpb19jbG9uZV9yYW5nZShiaSwgb2ZmLCBiaV9zaXplLCBnZnBtYXNrKTsKIAkJaWYgKCFiaW8pCiAJCQlnb3RvIG91dF9lcnI7CS8qIEVOT01FTSAqLwpAQCAtMTMzOSw3ICsxMjc5LDcgQEAKIAkJZW5kID0gJmJpby0+YmlfbmV4dDsKIAogCQlvZmYgKz0gYmlfc2l6ZTsKLQkJaWYgKG9mZiA9PSBiaS0+Ymlfc2l6ZSkgeworCQlpZiAob2ZmID09IGJpLT5iaV9pdGVyLmJpX3NpemUpIHsKIAkJCWJpID0gYmktPmJpX25leHQ7CiAJCQlvZmYgPSAwOwogCQl9CkBAIC0yMjI3LDcgKzIxNjcsOCBAQAogCiAJaWYgKHR5cGUgPT0gT0JKX1JFUVVFU1RfQklPKSB7CiAJCWJpb19saXN0ID0gZGF0YV9kZXNjOwotCQlyYmRfYXNzZXJ0KGltZ19vZmZzZXQgPT0gYmlvX2xpc3QtPmJpX3NlY3RvciA8PCBTRUNUT1JfU0hJRlQpOworCQlyYmRfYXNzZXJ0KGltZ19vZmZzZXQgPT0KKwkJCSAgIGJpb19saXN0LT5iaV9pdGVyLmJpX3NlY3RvciA8PCBTRUNUT1JfU0hJRlQpOwogCX0gZWxzZSB7CiAJCXJiZF9hc3NlcnQodHlwZSA9PSBPQkpfUkVRVUVTVF9QQUdFUyk7CiAJCXBhZ2VzID0gZGF0YV9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9yc3h4L2Rldi5jIGIvZHJpdmVycy9ibG9jay9yc3h4L2Rldi5jCmluZGV4IDIyODRmNWQuLjI4MzlkMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcnN4eC9kZXYuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JzeHgvZGV2LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWlmICghY2FyZCkKIAkJZ290byByZXFfZXJyOwogCi0JaWYgKGJpby0+Ymlfc2VjdG9yICsgKGJpby0+Ymlfc2l6ZSA+PiA5KSA+IGdldF9jYXBhY2l0eShjYXJkLT5nZW5kaXNrKSkKKwlpZiAoYmlvX2VuZF9zZWN0b3IoYmlvKSA+IGdldF9jYXBhY2l0eShjYXJkLT5nZW5kaXNrKSkKIAkJZ290byByZXFfZXJyOwogCiAJaWYgKHVubGlrZWx5KGNhcmQtPmhhbHQpKSB7CkBAIC0xODcsNyArMTg3LDcgQEAKIAkJZ290byByZXFfZXJyOwogCX0KIAotCWlmIChiaW8tPmJpX3NpemUgPT0gMCkgeworCWlmIChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9PSAwKSB7CiAJCWRldl9lcnIoQ0FSRF9UT19ERVYoY2FyZCksICJzaXplIHplcm8gQklPIVxuIik7CiAJCWdvdG8gcmVxX2VycjsKIAl9CkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCWRldl9kYmcoQ0FSRF9UT19ERVYoY2FyZCksICJCSU9bJWNdOiBtZXRhOiAlcCBhZGRyODogeCVsbHggc2l6ZTogJWRcbiIsCiAJCSBiaW9fZGF0YV9kaXIoYmlvKSA/ICdXJyA6ICdSJywgYmlvX21ldGEsCi0JCSAodTY0KWJpby0+Ymlfc2VjdG9yIDw8IDksIGJpby0+Ymlfc2l6ZSk7CisJCSAodTY0KWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPDwgOSwgYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCiAJc3QgPSByc3h4X2RtYV9xdWV1ZV9iaW8oY2FyZCwgYmlvLCAmYmlvX21ldGEtPnBlbmRpbmdfZG1hcywKIAkJCQkgICAgYmlvX2RtYV9kb25lX2NiLCBiaW9fbWV0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JzeHgvZG1hLmMgYi9kcml2ZXJzL2Jsb2NrL3JzeHgvZG1hLmMKaW5kZXggZmM4OGJhMy4uY2Y4Y2QyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9yc3h4L2RtYS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcnN4eC9kbWEuYwpAQCAtNjg0LDcgKzY4NCw4IEBACiAJCQkgICB2b2lkICpjYl9kYXRhKQogewogCXN0cnVjdCBsaXN0X2hlYWQgZG1hX2xpc3RbUlNYWF9NQVhfVEFSR0VUU107Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IGJpb192ZWMgYnZlYzsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI4OwogCXVuc2lnbmVkIGludCBsYWRkcjsKIAl1bnNpZ25lZCBpbnQgYnZfbGVuOwpAQCAtNjk2LDcgKzY5Nyw3IEBACiAJaW50IHN0OwogCWludCBpOwogCi0JYWRkcjggPSBiaW8tPmJpX3NlY3RvciA8PCA5OyAvKiBzZWN0b3JzIGFyZSA1MTIgYnl0ZXMgKi8KKwlhZGRyOCA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPDwgOTsgLyogc2VjdG9ycyBhcmUgNTEyIGJ5dGVzICovCiAJYXRvbWljX3NldChuX2RtYXMsIDApOwogCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm5fdGFyZ2V0czsgaSsrKSB7CkBAIC03MDUsNyArNzA2LDcgQEAKIAl9CiAKIAlpZiAoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSB7Ci0JCWJ2X2xlbiA9IGJpby0+Ymlfc2l6ZTsKKwkJYnZfbGVuID0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAKIAkJd2hpbGUgKGJ2X2xlbiA+IDApIHsKIAkJCXRndCAgID0gcnN4eF9nZXRfZG1hX3RndChjYXJkLCBhZGRyOCk7CkBAIC03MjIsOSArNzIzLDkgQEAKIAkJCWJ2X2xlbiAtPSBSU1hYX0hXX0JMS19TSVpFOwogCQl9CiAJfSBlbHNlIHsKLQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7Ci0JCQlidl9sZW4gPSBidmVjLT5idl9sZW47Ci0JCQlidl9vZmYgPSBidmVjLT5idl9vZmZzZXQ7CisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgeworCQkJYnZfbGVuID0gYnZlYy5idl9sZW47CisJCQlidl9vZmYgPSBidmVjLmJ2X29mZnNldDsKIAogCQkJd2hpbGUgKGJ2X2xlbiA+IDApIHsKIAkJCQl0Z3QgICA9IHJzeHhfZ2V0X2RtYV90Z3QoY2FyZCwgYWRkcjgpOwpAQCAtNzM2LDcgKzczNyw3IEBACiAJCQkJc3QgPSByc3h4X3F1ZXVlX2RtYShjYXJkLCAmZG1hX2xpc3RbdGd0XSwKIAkJCQkJCQliaW9fZGF0YV9kaXIoYmlvKSwKIAkJCQkJCQlkbWFfb2ZmLCBkbWFfbGVuLAotCQkJCQkJCWxhZGRyLCBidmVjLT5idl9wYWdlLAorCQkJCQkJCWxhZGRyLCBidmVjLmJ2X3BhZ2UsCiAJCQkJCQkJYnZfb2ZmLCBjYiwgY2JfZGF0YSk7CiAJCQkJaWYgKHN0KQogCQkJCQlnb3RvIGJ2ZWNfZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zeDguYyBiL2RyaXZlcnMvYmxvY2svc3g4LmMKaW5kZXggM2ZiNmFiNC4uZDVlMmQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zeDguYworKysgYi9kcml2ZXJzL2Jsb2NrL3N4OC5jCkBAIC0xNzQ0LDIwICsxNzQ0LDYgQEAKIAlrZnJlZShob3N0KTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGNhcm1faW5pdCh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjYXJtX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjYXJtX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNhcm1fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoY2FybV9pbml0KTsKLW1vZHVsZV9leGl0KGNhcm1fZXhpdCk7Ci0KLQorbW9kdWxlX3BjaV9kcml2ZXIoY2FybV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91bWVtLmMgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwppbmRleCBhZDcwODY4Li40Y2Y4MWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwpAQCAtMTA4LDggKzEwOCw3IEBACiAJCQkJICAgICogaGF2ZSBiZWVuIHdyaXR0ZW4KIAkJCQkgICAgKi8KIAlzdHJ1Y3QgYmlvCSpiaW8sICpjdXJyZW50YmlvLCAqKmJpb3RhaWw7Ci0JaW50CQljdXJyZW50X2lkeDsKLQlzZWN0b3JfdAljdXJyZW50X3NlY3RvcjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGN1cnJlbnRfaXRlcjsKIAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIApAQCAtMTE4LDcgKzExNyw3IEBACiAJCXN0cnVjdCBtbV9kbWFfZGVzYwkqZGVzYzsKIAkJaW50CSAJCWNudCwgaGVhZGNudDsKIAkJc3RydWN0IGJpbwkJKmJpbywgKipiaW90YWlsOwotCQlpbnQJCQlpZHg7CisJCXN0cnVjdCBidmVjX2l0ZXIJaXRlcjsKIAl9IG1tX3BhZ2VzWzJdOwogI2RlZmluZSBERVNDX1BFUl9QQUdFICgoUEFHRV9TSVpFKjIpL3NpemVvZihzdHJ1Y3QgbW1fZG1hX2Rlc2MpKQogCkBAIC0zNDQsMTYgKzM0MywxMyBAQAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlpbnQgb2Zmc2V0OwogCXN0cnVjdCBiaW8gKmJpbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqdmVjOwotCWludCBpZHg7CisJc3RydWN0IGJpb192ZWMgdmVjOwogCWludCBydzsKLQlpbnQgbGVuOwogCiAJYmlvID0gY2FyZC0+Y3VycmVudGJpbzsKIAlpZiAoIWJpbyAmJiBjYXJkLT5iaW8pIHsKIAkJY2FyZC0+Y3VycmVudGJpbyA9IGNhcmQtPmJpbzsKLQkJY2FyZC0+Y3VycmVudF9pZHggPSBjYXJkLT5iaW8tPmJpX2lkeDsKLQkJY2FyZC0+Y3VycmVudF9zZWN0b3IgPSBjYXJkLT5iaW8tPmJpX3NlY3RvcjsKKwkJY2FyZC0+Y3VycmVudF9pdGVyID0gY2FyZC0+YmlvLT5iaV9pdGVyOwogCQljYXJkLT5iaW8gPSBjYXJkLT5iaW8tPmJpX25leHQ7CiAJCWlmIChjYXJkLT5iaW8gPT0gTlVMTCkKIAkJCWNhcmQtPmJpb3RhaWwgPSAmY2FyZC0+YmlvOwpAQCAtMzYyLDE4ICszNTgsMTcgQEAKIAl9CiAJaWYgKCFiaW8pCiAJCXJldHVybiAwOwotCWlkeCA9IGNhcmQtPmN1cnJlbnRfaWR4OwogCiAJcncgPSBiaW9fcncoYmlvKTsKIAlpZiAoY2FyZC0+bW1fcGFnZXNbY2FyZC0+UmVhZHldLmNudCA+PSBERVNDX1BFUl9QQUdFKQogCQlyZXR1cm4gMDsKIAotCXZlYyA9IGJpb19pb3ZlY19pZHgoYmlvLCBpZHgpOwotCWxlbiA9IHZlYy0+YnZfbGVuOworCXZlYyA9IGJpb19pdGVyX2lvdmVjKGJpbywgY2FyZC0+Y3VycmVudF9pdGVyKTsKKwogCWRtYV9oYW5kbGUgPSBwY2lfbWFwX3BhZ2UoY2FyZC0+ZGV2LAotCQkJCSAgdmVjLT5idl9wYWdlLAotCQkJCSAgdmVjLT5idl9vZmZzZXQsCi0JCQkJICBsZW4sCisJCQkJICB2ZWMuYnZfcGFnZSwKKwkJCQkgIHZlYy5idl9vZmZzZXQsCisJCQkJICB2ZWMuYnZfbGVuLAogCQkJCSAgKHJ3ID09IFJFQUQpID8KIAkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSA6IFBDSV9ETUFfVE9ERVZJQ0UpOwogCkBAIC0zODEsNyArMzc2LDcgQEAKIAlkZXNjID0gJnAtPmRlc2NbcC0+Y250XTsKIAlwLT5jbnQrKzsKIAlpZiAocC0+YmlvID09IE5VTEwpCi0JCXAtPmlkeCA9IGlkeDsKKwkJcC0+aXRlciA9IGNhcmQtPmN1cnJlbnRfaXRlcjsKIAlpZiAoKHAtPmJpb3RhaWwpICE9ICZiaW8tPmJpX25leHQpIHsKIAkJKihwLT5iaW90YWlsKSA9IGJpbzsKIAkJcC0+YmlvdGFpbCA9ICYoYmlvLT5iaV9uZXh0KTsKQEAgLTM5MSw4ICszODYsOCBAQAogCWRlc2MtPmRhdGFfZG1hX2hhbmRsZSA9IGRtYV9oYW5kbGU7CiAKIAlkZXNjLT5wY2lfYWRkciA9IGNwdV90b19sZTY0KCh1NjQpZGVzYy0+ZGF0YV9kbWFfaGFuZGxlKTsKLQlkZXNjLT5sb2NhbF9hZGRyID0gY3B1X3RvX2xlNjQoY2FyZC0+Y3VycmVudF9zZWN0b3IgPDwgOSk7Ci0JZGVzYy0+dHJhbnNmZXJfc2l6ZSA9IGNwdV90b19sZTMyKGxlbik7CisJZGVzYy0+bG9jYWxfYWRkciA9IGNwdV90b19sZTY0KGNhcmQtPmN1cnJlbnRfaXRlci5iaV9zZWN0b3IgPDwgOSk7CisJZGVzYy0+dHJhbnNmZXJfc2l6ZSA9IGNwdV90b19sZTMyKHZlYy5idl9sZW4pOwogCW9mZnNldCA9ICgoKGNoYXIgKikmZGVzYy0+c2VtX2NvbnRyb2xfYml0cykgLSAoKGNoYXIgKilwLT5kZXNjKSk7CiAJZGVzYy0+c2VtX2FkZHIgPSBjcHVfdG9fbGU2NCgodTY0KShwLT5wYWdlX2RtYStvZmZzZXQpKTsKIAlkZXNjLT56ZXJvMSA9IGRlc2MtPnplcm8yID0gMDsKQEAgLTQwNywxMCArNDAyLDkgQEAKIAkJZGVzYy0+Y29udHJvbF9iaXRzIHw9IGNwdV90b19sZTMyKERNQVNDUl9UUkFOU0ZFUl9SRUFEKTsKIAlkZXNjLT5zZW1fY29udHJvbF9iaXRzID0gZGVzYy0+Y29udHJvbF9iaXRzOwogCi0JY2FyZC0+Y3VycmVudF9zZWN0b3IgKz0gKGxlbiA+PiA5KTsKLQlpZHgrKzsKLQljYXJkLT5jdXJyZW50X2lkeCA9IGlkeDsKLQlpZiAoaWR4ID49IGJpby0+YmlfdmNudCkKKworCWJpb19hZHZhbmNlX2l0ZXIoYmlvLCAmY2FyZC0+Y3VycmVudF9pdGVyLCB2ZWMuYnZfbGVuKTsKKwlpZiAoIWNhcmQtPmN1cnJlbnRfaXRlci5iaV9zaXplKQogCQljYXJkLT5jdXJyZW50YmlvID0gTlVMTDsKIAogCXJldHVybiAxOwpAQCAtNDM5LDIzICs0MzMsMjUgQEAKIAkJc3RydWN0IG1tX2RtYV9kZXNjICpkZXNjID0gJnBhZ2UtPmRlc2NbcGFnZS0+aGVhZGNudF07CiAJCWludCBjb250cm9sID0gbGUzMl90b19jcHUoZGVzYy0+c2VtX2NvbnRyb2xfYml0cyk7CiAJCWludCBsYXN0ID0gMDsKLQkJaW50IGlkeDsKKwkJc3RydWN0IGJpb192ZWMgdmVjOwogCiAJCWlmICghKGNvbnRyb2wgJiBETUFTQ1JfRE1BX0NPTVBMRVRFKSkgewogCQkJY29udHJvbCA9IGRtYV9zdGF0dXM7CiAJCQlsYXN0ID0gMTsKIAkJfQorCiAJCXBhZ2UtPmhlYWRjbnQrKzsKLQkJaWR4ID0gcGFnZS0+aWR4OwotCQlwYWdlLT5pZHgrKzsKLQkJaWYgKHBhZ2UtPmlkeCA+PSBiaW8tPmJpX3ZjbnQpIHsKKwkJdmVjID0gYmlvX2l0ZXJfaW92ZWMoYmlvLCBwYWdlLT5pdGVyKTsKKwkJYmlvX2FkdmFuY2VfaXRlcihiaW8sICZwYWdlLT5pdGVyLCB2ZWMuYnZfbGVuKTsKKworCQlpZiAoIXBhZ2UtPml0ZXIuYmlfc2l6ZSkgewogCQkJcGFnZS0+YmlvID0gYmlvLT5iaV9uZXh0OwogCQkJaWYgKHBhZ2UtPmJpbykKLQkJCQlwYWdlLT5pZHggPSBwYWdlLT5iaW8tPmJpX2lkeDsKKwkJCQlwYWdlLT5pdGVyID0gcGFnZS0+YmlvLT5iaV9pdGVyOwogCQl9CiAKIAkJcGNpX3VubWFwX3BhZ2UoY2FyZC0+ZGV2LCBkZXNjLT5kYXRhX2RtYV9oYW5kbGUsCi0JCQkgICAgICAgYmlvX2lvdmVjX2lkeChiaW8sIGlkeCktPmJ2X2xlbiwKKwkJCSAgICAgICB2ZWMuYnZfbGVuLAogCQkJCSAoY29udHJvbCAmIERNQVNDUl9UUkFOU0ZFUl9SRUFEKSA/CiAJCQkJUENJX0RNQV9UT0RFVklDRSA6IFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWlmIChjb250cm9sICYgRE1BU0NSX0hBUkRfRVJST1IpIHsKQEAgLTUzMiw3ICs1MjgsOCBAQAogewogCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IHEtPnF1ZXVlZGF0YTsKIAlwcl9kZWJ1ZygibW1fbWFrZV9yZXF1ZXN0ICVsbHUgJXVcbiIsCi0JCSAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUpOworCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkgYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCiAJc3Bpbl9sb2NrX2lycSgmY2FyZC0+bG9jayk7CiAJKmNhcmQtPmJpb3RhaWwgPSBiaW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCmluZGV4IDY2MjBiNzMuLjRiOTdiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCkBAIC0xMjU3LDcgKzEyNTcsNyBAQAogCQkJYmlvLT5iaV9iZGV2ICAgID0gcHJlcS5iZGV2OwogCQkJYmlvLT5iaV9wcml2YXRlID0gcGVuZGluZ19yZXE7CiAJCQliaW8tPmJpX2VuZF9pbyAgPSBlbmRfYmxvY2tfaW9fb3A7Ci0JCQliaW8tPmJpX3NlY3RvciAgPSBwcmVxLnNlY3Rvcl9udW1iZXI7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICA9IHByZXEuc2VjdG9yX251bWJlcjsKIAkJfQogCiAJCXByZXEuc2VjdG9yX251bWJlciArPSBzZWdbaV0ubnNlYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IGY5YzQzZjkuLjhkY2ZiNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBwZW5kaW5nOyBpKyspIHsKIAkJCQlvZmZzZXQgPSAoaSAqIHNlZ3MgKiBQQUdFX1NJWkUpID4+IDk7CiAJCQkJc2l6ZSA9IG1pbigodW5zaWduZWQgaW50KShzZWdzICogUEFHRV9TSVpFKSA+PiA5LAotCQkJCQkgICAodW5zaWduZWQgaW50KShiaW8tPmJpX3NpemUgPj4gOSkgLSBvZmZzZXQpOworCQkJCQkgICAodW5zaWduZWQgaW50KWJpb19zZWN0b3JzKGJpbykgLSBvZmZzZXQpOwogCQkJCWNsb25lZF9iaW8gPSBiaW9fY2xvbmUoYmlvLCBHRlBfTk9JTyk7CiAJCQkJQlVHX09OKGNsb25lZF9iaW8gPT0gTlVMTCk7CiAJCQkJYmlvX3RyaW0oY2xvbmVkX2Jpbywgb2Zmc2V0LCBzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL3pyYW0vS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL2Jsb2NrL3pyYW0vS2NvbmZpZwppbmRleCA5ODMzMTRjLi4zNDUwYmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svenJhbS9LY29uZmlnCkBAIC0xNCw3ICsxNCw2IEBACiAJICBkaXNrcyBhbmQgbWF5YmUgbWFueSBtb3JlLgogCiAJICBTZWUgenJhbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0JICBQcm9qZWN0IGhvbWU6IDxodHRwczovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8+CiAKIGNvbmZpZyBaUkFNX0RFQlVHCiAJYm9vbCAiQ29tcHJlc3NlZCBSQU0gYmxvY2sgZGV2aWNlIGRlYnVnIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS9NYWtlZmlsZSBiL2RyaXZlcnMvYmxvY2svenJhbS9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3pyYW0vTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvYmxvY2svenJhbS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYyBiL2RyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5jCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKcmVuYW1lIHRvIGRyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5jCmluZGV4IDMyNzdkOTguLjAxMWU1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKKysrIGIvZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb21wcmVzc2VkIFJBTSBibG9jayBkZXZpY2UKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgIE5pdGluIEd1cHRhCisgKiAgICAgICAgICAgICAgIDIwMTIsIDIwMTMgTWluY2hhbiBLaW0KICAqCiAgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKICAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCkBAIC05LDcgKzEwLDYgQEAKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCiAgKgotICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCiAgKi8KIAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAienJhbSIKQEAgLTEwNCw3ICsxMDQsNyBAQAogewogCXN0cnVjdCB6cmFtICp6cmFtID0gZGV2X3RvX3pyYW0oZGV2KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB6cmFtLT5zdGF0cy5wYWdlc196ZXJvKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYXRvbWljX3JlYWQoJnpyYW0tPnN0YXRzLnBhZ2VzX3plcm8pKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3JpZ19kYXRhX3NpemVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGRldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLAotCQkodTY0KSh6cmFtLT5zdGF0cy5wYWdlc19zdG9yZWQpIDw8IFBBR0VfU0hJRlQpOworCQkodTY0KShhdG9taWNfcmVhZCgmenJhbS0+c3RhdHMucGFnZXNfc3RvcmVkKSkgPDwgUEFHRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGNvbXByX2RhdGFfc2l6ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE0MCw2ICsxNDAsNyBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIHZhbCk7CiB9CiAKKy8qIGZsYWcgb3BlcmF0aW9ucyBuZWVkcyBtZXRhLT50Yl9sb2NrICovCiBzdGF0aWMgaW50IHpyYW1fdGVzdF9mbGFnKHN0cnVjdCB6cmFtX21ldGEgKm1ldGEsIHUzMiBpbmRleCwKIAkJCWVudW0genJhbV9wYWdlZmxhZ3MgZmxhZykKIHsKQEAgLTE3MSwxMyArMTcyLDE0IEBACiAJdTY0IHN0YXJ0LCBlbmQsIGJvdW5kOwogCiAJLyogdW5hbGlnbmVkIHJlcXVlc3QgKi8KLQlpZiAodW5saWtlbHkoYmlvLT5iaV9zZWN0b3IgJiAoWlJBTV9TRUNUT1JfUEVSX0xPR0lDQUxfQkxPQ0sgLSAxKSkpCisJaWYgKHVubGlrZWx5KGJpby0+YmlfaXRlci5iaV9zZWN0b3IgJgorCQkgICAgIChaUkFNX1NFQ1RPUl9QRVJfTE9HSUNBTF9CTE9DSyAtIDEpKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKHVubGlrZWx5KGJpby0+Ymlfc2l6ZSAmIChaUkFNX0xPR0lDQUxfQkxPQ0tfU0laRSAtIDEpKSkKKwlpZiAodW5saWtlbHkoYmlvLT5iaV9pdGVyLmJpX3NpemUgJiAoWlJBTV9MT0dJQ0FMX0JMT0NLX1NJWkUgLSAxKSkpCiAJCXJldHVybiAwOwogCi0Jc3RhcnQgPSBiaW8tPmJpX3NlY3RvcjsKLQllbmQgPSBzdGFydCArIChiaW8tPmJpX3NpemUgPj4gU0VDVE9SX1NISUZUKTsKKwlzdGFydCA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJZW5kID0gc3RhcnQgKyAoYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gU0VDVE9SX1NISUZUKTsKIAlib3VuZCA9IHpyYW0tPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVDsKIAkvKiBvdXQgb2YgcmFuZ2UgcmFuZ2UgKi8KIAlpZiAodW5saWtlbHkoc3RhcnQgPj0gYm91bmQgfHwgZW5kID4gYm91bmQgfHwgc3RhcnQgPiBlbmQpKQpAQCAtMjI3LDYgKzIyOSw4IEBACiAJCWdvdG8gZnJlZV90YWJsZTsKIAl9CiAKKwlyd2xvY2tfaW5pdCgmbWV0YS0+dGJfbG9jayk7CisJbXV0ZXhfaW5pdCgmbWV0YS0+YnVmZmVyX2xvY2spOwogCXJldHVybiBtZXRhOwogCiBmcmVlX3RhYmxlOgpAQCAtMjc5LDYgKzI4Myw3IEBACiAJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiB9CiAKKy8qIE5PVEU6IGNhbGxlciBzaG91bGQgaG9sZCBtZXRhLT50Yl9sb2NrIHdpdGggd3JpdGUtc2lkZSAqLwogc3RhdGljIHZvaWQgenJhbV9mcmVlX3BhZ2Uoc3RydWN0IHpyYW0gKnpyYW0sIHNpemVfdCBpbmRleCkKIHsKIAlzdHJ1Y3QgenJhbV9tZXRhICptZXRhID0genJhbS0+bWV0YTsKQEAgLTI5MiwyMSArMjk3LDIxIEBACiAJCSAqLwogCQlpZiAoenJhbV90ZXN0X2ZsYWcobWV0YSwgaW5kZXgsIFpSQU1fWkVSTykpIHsKIAkJCXpyYW1fY2xlYXJfZmxhZyhtZXRhLCBpbmRleCwgWlJBTV9aRVJPKTsKLQkJCXpyYW0tPnN0YXRzLnBhZ2VzX3plcm8tLTsKKwkJCWF0b21pY19kZWMoJnpyYW0tPnN0YXRzLnBhZ2VzX3plcm8pOwogCQl9CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodW5saWtlbHkoc2l6ZSA+IG1heF96cGFnZV9zaXplKSkKLQkJenJhbS0+c3RhdHMuYmFkX2NvbXByZXNzLS07CisJCWF0b21pY19kZWMoJnpyYW0tPnN0YXRzLmJhZF9jb21wcmVzcyk7CiAKIAl6c19mcmVlKG1ldGEtPm1lbV9wb29sLCBoYW5kbGUpOwogCiAJaWYgKHNpemUgPD0gUEFHRV9TSVpFIC8gMikKLQkJenJhbS0+c3RhdHMuZ29vZF9jb21wcmVzcy0tOworCQlhdG9taWNfZGVjKCZ6cmFtLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKIAogCWF0b21pYzY0X3N1YihtZXRhLT50YWJsZVtpbmRleF0uc2l6ZSwgJnpyYW0tPnN0YXRzLmNvbXByX3NpemUpOwotCXpyYW0tPnN0YXRzLnBhZ2VzX3N0b3JlZC0tOworCWF0b21pY19kZWMoJnpyYW0tPnN0YXRzLnBhZ2VzX3N0b3JlZCk7CiAKIAltZXRhLT50YWJsZVtpbmRleF0uaGFuZGxlID0gMDsKIAltZXRhLT50YWJsZVtpbmRleF0uc2l6ZSA9IDA7CkBAIC0zMTgsMjAgKzMyMywyNiBAQAogCXNpemVfdCBjbGVuID0gUEFHRV9TSVpFOwogCXVuc2lnbmVkIGNoYXIgKmNtZW07CiAJc3RydWN0IHpyYW1fbWV0YSAqbWV0YSA9IHpyYW0tPm1ldGE7Ci0JdW5zaWduZWQgbG9uZyBoYW5kbGUgPSBtZXRhLT50YWJsZVtpbmRleF0uaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworCXUxNiBzaXplOworCisJcmVhZF9sb2NrKCZtZXRhLT50Yl9sb2NrKTsKKwloYW5kbGUgPSBtZXRhLT50YWJsZVtpbmRleF0uaGFuZGxlOworCXNpemUgPSBtZXRhLT50YWJsZVtpbmRleF0uc2l6ZTsKIAogCWlmICghaGFuZGxlIHx8IHpyYW1fdGVzdF9mbGFnKG1ldGEsIGluZGV4LCBaUkFNX1pFUk8pKSB7CisJCXJlYWRfdW5sb2NrKCZtZXRhLT50Yl9sb2NrKTsKIAkJY2xlYXJfcGFnZShtZW0pOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljbWVtID0genNfbWFwX29iamVjdChtZXRhLT5tZW1fcG9vbCwgaGFuZGxlLCBaU19NTV9STyk7Ci0JaWYgKG1ldGEtPnRhYmxlW2luZGV4XS5zaXplID09IFBBR0VfU0laRSkKKwlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpCiAJCWNvcHlfcGFnZShtZW0sIGNtZW0pOwogCWVsc2UKLQkJcmV0ID0gbHpvMXhfZGVjb21wcmVzc19zYWZlKGNtZW0sIG1ldGEtPnRhYmxlW2luZGV4XS5zaXplLAotCQkJCQkJbWVtLCAmY2xlbik7CisJCXJldCA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjbWVtLCBzaXplLAltZW0sICZjbGVuKTsKIAl6c191bm1hcF9vYmplY3QobWV0YS0+bWVtX3Bvb2wsIGhhbmRsZSk7CisJcmVhZF91bmxvY2soJm1ldGEtPnRiX2xvY2spOwogCiAJLyogU2hvdWxkIE5FVkVSIGhhcHBlbi4gUmV0dXJuIGJpbyBlcnJvciBpZiBpdCBkb2VzLiAqLwogCWlmICh1bmxpa2VseShyZXQgIT0gTFpPX0VfT0spKSB7CkBAIC0zNTIsMTEgKzM2MywxNCBAQAogCXN0cnVjdCB6cmFtX21ldGEgKm1ldGEgPSB6cmFtLT5tZXRhOwogCXBhZ2UgPSBidmVjLT5idl9wYWdlOwogCisJcmVhZF9sb2NrKCZtZXRhLT50Yl9sb2NrKTsKIAlpZiAodW5saWtlbHkoIW1ldGEtPnRhYmxlW2luZGV4XS5oYW5kbGUpIHx8CiAJCQl6cmFtX3Rlc3RfZmxhZyhtZXRhLCBpbmRleCwgWlJBTV9aRVJPKSkgeworCQlyZWFkX3VubG9jaygmbWV0YS0+dGJfbG9jayk7CiAJCWhhbmRsZV96ZXJvX3BhZ2UoYnZlYyk7CiAJCXJldHVybiAwOwogCX0KKwlyZWFkX3VubG9jaygmbWV0YS0+dGJfbG9jayk7CiAKIAlpZiAoaXNfcGFydGlhbF9pbyhidmVjKSkKIAkJLyogVXNlICBhIHRlbXBvcmFyeSBidWZmZXIgdG8gZGVjb21wcmVzcyB0aGUgcGFnZSAqLwpAQCAtMzk5LDYgKzQxMyw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtLCAqc3JjLCAqdW5jbWVtID0gTlVMTDsKIAlzdHJ1Y3QgenJhbV9tZXRhICptZXRhID0genJhbS0+bWV0YTsKKwlib29sIGxvY2tlZCA9IGZhbHNlOwogCiAJcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CiAJc3JjID0gbWV0YS0+Y29tcHJlc3NfYnVmZmVyOwpAQCAtNDE4LDYgKzQzMyw4IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKKwltdXRleF9sb2NrKCZtZXRhLT5idWZmZXJfbG9jayk7CisJbG9ja2VkID0gdHJ1ZTsKIAl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UpOwogCiAJaWYgKGlzX3BhcnRpYWxfaW8oYnZlYykpIHsKQEAgLTQzMiwyNSArNDQ5LDE4IEBACiAJaWYgKHBhZ2VfemVyb19maWxsZWQodW5jbWVtKSkgewogCQlrdW5tYXBfYXRvbWljKHVzZXJfbWVtKTsKIAkJLyogRnJlZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VjdG9yIG5vdy4gKi8KKwkJd3JpdGVfbG9jaygmenJhbS0+bWV0YS0+dGJfbG9jayk7CiAJCXpyYW1fZnJlZV9wYWdlKHpyYW0sIGluZGV4KTsKLQotCQl6cmFtLT5zdGF0cy5wYWdlc196ZXJvKys7CiAJCXpyYW1fc2V0X2ZsYWcobWV0YSwgaW5kZXgsIFpSQU1fWkVSTyk7CisJCXdyaXRlX3VubG9jaygmenJhbS0+bWV0YS0+dGJfbG9jayk7CisKKwkJYXRvbWljX2luYygmenJhbS0+c3RhdHMucGFnZXNfemVybyk7CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAotCS8qCi0JICogenJhbV9zbG90X2ZyZWVfbm90aWZ5IGNvdWxkIG1pc3MgZnJlZSBzbyB0aGF0IGxldCdzCi0JICogZG91YmxlIGNoZWNrLgotCSAqLwotCWlmICh1bmxpa2VseShtZXRhLT50YWJsZVtpbmRleF0uaGFuZGxlIHx8Ci0JCQl6cmFtX3Rlc3RfZmxhZyhtZXRhLCBpbmRleCwgWlJBTV9aRVJPKSkpCi0JCXpyYW1fZnJlZV9wYWdlKHpyYW0sIGluZGV4KTsKLQogCXJldCA9IGx6bzF4XzFfY29tcHJlc3ModW5jbWVtLCBQQUdFX1NJWkUsIHNyYywgJmNsZW4sCiAJCQkgICAgICAgbWV0YS0+Y29tcHJlc3Nfd29ya21lbSk7Ci0KIAlpZiAoIWlzX3BhcnRpYWxfaW8oYnZlYykpIHsKIAkJa3VubWFwX2F0b21pYyh1c2VyX21lbSk7CiAJCXVzZXJfbWVtID0gTlVMTDsKQEAgLTQ2Myw3ICs0NzMsNyBAQAogCX0KIAogCWlmICh1bmxpa2VseShjbGVuID4gbWF4X3pwYWdlX3NpemUpKSB7Ci0JCXpyYW0tPnN0YXRzLmJhZF9jb21wcmVzcysrOworCQlhdG9taWNfaW5jKCZ6cmFtLT5zdGF0cy5iYWRfY29tcHJlc3MpOwogCQljbGVuID0gUEFHRV9TSVpFOwogCQlzcmMgPSBOVUxMOwogCQlpZiAoaXNfcGFydGlhbF9pbyhidmVjKSkKQEAgLTQ5MywxOCArNTAzLDIyIEBACiAJICogRnJlZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VjdG9yCiAJICogYmVmb3JlIG92ZXJ3cml0aW5nIHVudXNlZCBzZWN0b3JzLgogCSAqLworCXdyaXRlX2xvY2soJnpyYW0tPm1ldGEtPnRiX2xvY2spOwogCXpyYW1fZnJlZV9wYWdlKHpyYW0sIGluZGV4KTsKIAogCW1ldGEtPnRhYmxlW2luZGV4XS5oYW5kbGUgPSBoYW5kbGU7CiAJbWV0YS0+dGFibGVbaW5kZXhdLnNpemUgPSBjbGVuOworCXdyaXRlX3VubG9jaygmenJhbS0+bWV0YS0+dGJfbG9jayk7CiAKIAkvKiBVcGRhdGUgc3RhdHMgKi8KIAlhdG9taWM2NF9hZGQoY2xlbiwgJnpyYW0tPnN0YXRzLmNvbXByX3NpemUpOwotCXpyYW0tPnN0YXRzLnBhZ2VzX3N0b3JlZCsrOworCWF0b21pY19pbmMoJnpyYW0tPnN0YXRzLnBhZ2VzX3N0b3JlZCk7CiAJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKLQkJenJhbS0+c3RhdHMuZ29vZF9jb21wcmVzcysrOworCQlhdG9taWNfaW5jKCZ6cmFtLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKIAogb3V0OgorCWlmIChsb2NrZWQpCisJCW11dGV4X3VubG9jaygmbWV0YS0+YnVmZmVyX2xvY2spOwogCWlmIChpc19wYXJ0aWFsX2lvKGJ2ZWMpKQogCQlrZnJlZSh1bmNtZW0pOwogCkBAIC01MTMsMzYgKzUyNywxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9wZW5kaW5nX3Nsb3RfZnJlZShzdHJ1Y3QgenJhbSAqenJhbSkKLXsKLQlzdHJ1Y3QgenJhbV9zbG90X2ZyZWUgKmZyZWVfcnE7Ci0KLQlzcGluX2xvY2soJnpyYW0tPnNsb3RfZnJlZV9sb2NrKTsKLQl3aGlsZSAoenJhbS0+c2xvdF9mcmVlX3JxKSB7Ci0JCWZyZWVfcnEgPSB6cmFtLT5zbG90X2ZyZWVfcnE7Ci0JCXpyYW0tPnNsb3RfZnJlZV9ycSA9IGZyZWVfcnEtPm5leHQ7Ci0JCXpyYW1fZnJlZV9wYWdlKHpyYW0sIGZyZWVfcnEtPmluZGV4KTsKLQkJa2ZyZWUoZnJlZV9ycSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZ6cmFtLT5zbG90X2ZyZWVfbG9jayk7Ci19Ci0KIHN0YXRpYyBpbnQgenJhbV9idmVjX3J3KHN0cnVjdCB6cmFtICp6cmFtLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgdTMyIGluZGV4LAogCQkJaW50IG9mZnNldCwgc3RydWN0IGJpbyAqYmlvLCBpbnQgcncpCiB7CiAJaW50IHJldDsKIAotCWlmIChydyA9PSBSRUFEKSB7Ci0JCWRvd25fcmVhZCgmenJhbS0+bG9jayk7Ci0JCWhhbmRsZV9wZW5kaW5nX3Nsb3RfZnJlZSh6cmFtKTsKKwlpZiAocncgPT0gUkVBRCkKIAkJcmV0ID0genJhbV9idmVjX3JlYWQoenJhbSwgYnZlYywgaW5kZXgsIG9mZnNldCwgYmlvKTsKLQkJdXBfcmVhZCgmenJhbS0+bG9jayk7Ci0JfSBlbHNlIHsKLQkJZG93bl93cml0ZSgmenJhbS0+bG9jayk7Ci0JCWhhbmRsZV9wZW5kaW5nX3Nsb3RfZnJlZSh6cmFtKTsKKwllbHNlCiAJCXJldCA9IHpyYW1fYnZlY193cml0ZSh6cmFtLCBidmVjLCBpbmRleCwgb2Zmc2V0KTsKLQkJdXBfd3JpdGUoJnpyYW0tPmxvY2spOwotCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC01NTIsOCArNTQ1LDYgQEAKIAlzaXplX3QgaW5kZXg7CiAJc3RydWN0IHpyYW1fbWV0YSAqbWV0YTsKIAotCWZsdXNoX3dvcmsoJnpyYW0tPmZyZWVfd29yayk7Ci0KIAlkb3duX3dyaXRlKCZ6cmFtLT5pbml0X2xvY2spOwogCWlmICghenJhbS0+aW5pdF9kb25lKSB7CiAJCXVwX3dyaXRlKCZ6cmFtLT5pbml0X2xvY2spOwpAQCAtNjgwLDkgKzY3MSwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX3pyYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCB6cmFtICp6cmFtLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBydykKIHsKLQlpbnQgaSwgb2Zmc2V0OworCWludCBvZmZzZXQ7CiAJdTMyIGluZGV4OwotCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCiAJc3dpdGNoIChydykgewogCWNhc2UgUkVBRDoKQEAgLTY5MywzNiArNjg1LDM3IEBACiAJCWJyZWFrOwogCX0KIAotCWluZGV4ID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKLQlvZmZzZXQgPSAoYmlvLT5iaV9zZWN0b3IgJiAoU0VDVE9SU19QRVJfUEFHRSAtIDEpKSA8PCBTRUNUT1JfU0hJRlQ7CisJaW5kZXggPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisJb2Zmc2V0ID0gKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgJgorCQkgIChTRUNUT1JTX1BFUl9QQUdFIC0gMSkpIDw8IFNFQ1RPUl9TSElGVDsKIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQlpbnQgbWF4X3RyYW5zZmVyX3NpemUgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CiAKLQkJaWYgKGJ2ZWMtPmJ2X2xlbiA+IG1heF90cmFuc2Zlcl9zaXplKSB7CisJCWlmIChidmVjLmJ2X2xlbiA+IG1heF90cmFuc2Zlcl9zaXplKSB7CiAJCQkvKgogCQkJICogenJhbV9idmVjX3J3KCkgY2FuIG9ubHkgbWFrZSBvcGVyYXRpb24gb24gYSBzaW5nbGUKIAkJCSAqIHpyYW0gcGFnZS4gU3BsaXQgdGhlIGJpbyB2ZWN0b3IuCiAJCQkgKi8KIAkJCXN0cnVjdCBiaW9fdmVjIGJ2OwogCi0JCQlidi5idl9wYWdlID0gYnZlYy0+YnZfcGFnZTsKKwkJCWJ2LmJ2X3BhZ2UgPSBidmVjLmJ2X3BhZ2U7CiAJCQlidi5idl9sZW4gPSBtYXhfdHJhbnNmZXJfc2l6ZTsKLQkJCWJ2LmJ2X29mZnNldCA9IGJ2ZWMtPmJ2X29mZnNldDsKKwkJCWJ2LmJ2X29mZnNldCA9IGJ2ZWMuYnZfb2Zmc2V0OwogCiAJCQlpZiAoenJhbV9idmVjX3J3KHpyYW0sICZidiwgaW5kZXgsIG9mZnNldCwgYmlvLCBydykgPCAwKQogCQkJCWdvdG8gb3V0OwogCi0JCQlidi5idl9sZW4gPSBidmVjLT5idl9sZW4gLSBtYXhfdHJhbnNmZXJfc2l6ZTsKKwkJCWJ2LmJ2X2xlbiA9IGJ2ZWMuYnZfbGVuIC0gbWF4X3RyYW5zZmVyX3NpemU7CiAJCQlidi5idl9vZmZzZXQgKz0gbWF4X3RyYW5zZmVyX3NpemU7CiAJCQlpZiAoenJhbV9idmVjX3J3KHpyYW0sICZidiwgaW5kZXgrMSwgMCwgYmlvLCBydykgPCAwKQogCQkJCWdvdG8gb3V0OwogCQl9IGVsc2UKLQkJCWlmICh6cmFtX2J2ZWNfcncoenJhbSwgYnZlYywgaW5kZXgsIG9mZnNldCwgYmlvLCBydykKKwkJCWlmICh6cmFtX2J2ZWNfcncoenJhbSwgJmJ2ZWMsIGluZGV4LCBvZmZzZXQsIGJpbywgcncpCiAJCQkgICAgPCAwKQogCQkJCWdvdG8gb3V0OwogCi0JCXVwZGF0ZV9wb3NpdGlvbigmaW5kZXgsICZvZmZzZXQsIGJ2ZWMpOworCQl1cGRhdGVfcG9zaXRpb24oJmluZGV4LCAmb2Zmc2V0LCAmYnZlYyk7CiAJfQogCiAJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKQEAgLTc1OSw0MCArNzUyLDE5IEBACiAJYmlvX2lvX2Vycm9yKGJpbyk7CiB9CiAKLXN0YXRpYyB2b2lkIHpyYW1fc2xvdF9mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgenJhbSAqenJhbTsKLQotCXpyYW0gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpyYW0sIGZyZWVfd29yayk7Ci0JZG93bl93cml0ZSgmenJhbS0+bG9jayk7Ci0JaGFuZGxlX3BlbmRpbmdfc2xvdF9mcmVlKHpyYW0pOwotCXVwX3dyaXRlKCZ6cmFtLT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYWRkX3Nsb3RfZnJlZShzdHJ1Y3QgenJhbSAqenJhbSwgc3RydWN0IHpyYW1fc2xvdF9mcmVlICpmcmVlX3JxKQotewotCXNwaW5fbG9jaygmenJhbS0+c2xvdF9mcmVlX2xvY2spOwotCWZyZWVfcnEtPm5leHQgPSB6cmFtLT5zbG90X2ZyZWVfcnE7Ci0JenJhbS0+c2xvdF9mcmVlX3JxID0gZnJlZV9ycTsKLQlzcGluX3VubG9jaygmenJhbS0+c2xvdF9mcmVlX2xvY2spOwotfQotCiBzdGF0aWMgdm9pZCB6cmFtX3Nsb3RfZnJlZV9ub3RpZnkoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4KQogewogCXN0cnVjdCB6cmFtICp6cmFtOwotCXN0cnVjdCB6cmFtX3Nsb3RfZnJlZSAqZnJlZV9ycTsKKwlzdHJ1Y3QgenJhbV9tZXRhICptZXRhOwogCiAJenJhbSA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwltZXRhID0genJhbS0+bWV0YTsKKworCXdyaXRlX2xvY2soJm1ldGEtPnRiX2xvY2spOworCXpyYW1fZnJlZV9wYWdlKHpyYW0sIGluZGV4KTsKKwl3cml0ZV91bmxvY2soJm1ldGEtPnRiX2xvY2spOwogCWF0b21pYzY0X2luYygmenJhbS0+c3RhdHMubm90aWZ5X2ZyZWUpOwotCi0JZnJlZV9ycSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6cmFtX3Nsb3RfZnJlZSksIEdGUF9BVE9NSUMpOwotCWlmICghZnJlZV9ycSkKLQkJcmV0dXJuOwotCi0JZnJlZV9ycS0+aW5kZXggPSBpbmRleDsKLQlhZGRfc2xvdF9mcmVlKHpyYW0sIGZyZWVfcnEpOwotCXNjaGVkdWxlX3dvcmsoJnpyYW0tPmZyZWVfd29yayk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgenJhbV9kZXZvcHMgPSB7CkBAIC04MzYsMTMgKzgwOCw4IEBACiB7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQlpbml0X3J3c2VtKCZ6cmFtLT5sb2NrKTsKIAlpbml0X3J3c2VtKCZ6cmFtLT5pbml0X2xvY2spOwogCi0JSU5JVF9XT1JLKCZ6cmFtLT5mcmVlX3dvcmssIHpyYW1fc2xvdF9mcmVlKTsKLQlzcGluX2xvY2tfaW5pdCgmenJhbS0+c2xvdF9mcmVlX2xvY2spOwotCXpyYW0tPnNsb3RfZnJlZV9ycSA9IE5VTEw7Ci0KIAl6cmFtLT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKIAlpZiAoIXpyYW0tPnF1ZXVlKSB7CiAJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBkaXNrIHF1ZXVlIGZvciBkZXZpY2UgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5oIGIvZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmgKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuaApyZW5hbWUgdG8gZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmgKaW5kZXggOTdhM2FjZi4uYWQ4YWEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuaAorKysgYi9kcml2ZXJzL2Jsb2NrL3pyYW0venJhbV9kcnYuaApAQCAtMiw2ICsyLDcgQEAKICAqIENvbXByZXNzZWQgUkFNIGJsb2NrIGRldmljZQogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCAgTml0aW4gR3VwdGEKKyAqICAgICAgICAgICAgICAgMjAxMiwgMjAxMyBNaW5jaGFuIEtpbQogICoKICAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAogICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KQEAgLTksNyArMTAsNiBAQAogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKICAqCi0gKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KICAqLwogCiAjaWZuZGVmIF9aUkFNX0RSVl9IXwpAQCAtMTcsOCArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSAiLi4venNtYWxsb2MvenNtYWxsb2MuaCIKKyNpbmNsdWRlIDxsaW51eC96c21hbGxvYy5oPgogCiAvKgogICogU29tZSBhcmJpdHJhcnkgdmFsdWUuIFRoaXMgaXMganVzdCB0byBjYXRjaApAQCAtNjksMTAgKzY4LDYgQEAKIAl1OCBmbGFnczsKIH0gX19hbGlnbmVkKDQpOwogCi0vKgotICogQWxsIDY0Yml0IGZpZWxkcyBzaG91bGQgb25seSBiZSBtYW5pcHVsYXRlZCBieSA2NGJpdCBhdG9taWMgYWNjZXNzb3JzLgotICogQWxsIG1vZGlmaWNhdGlvbnMgdG8gMzJiaXQgY291bnRlciBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IHpyYW0tPmxvY2suCi0gKi8KIHN0cnVjdCB6cmFtX3N0YXRzIHsKIAlhdG9taWM2NF90IGNvbXByX3NpemU7CS8qIGNvbXByZXNzZWQgc2l6ZSBvZiBwYWdlcyBzdG9yZWQgKi8KIAlhdG9taWM2NF90IG51bV9yZWFkczsJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLwpAQCAtODEsMzMgKzc2LDIzIEBACiAJYXRvbWljNjRfdCBmYWlsZWRfd3JpdGVzOwkvKiBjYW4gaGFwcGVuIHdoZW4gbWVtb3J5IGlzIHRvbyBsb3cgKi8KIAlhdG9taWM2NF90IGludmFsaWRfaW87CS8qIG5vbi1wYWdlLWFsaWduZWQgSS9PIHJlcXVlc3RzICovCiAJYXRvbWljNjRfdCBub3RpZnlfZnJlZTsJLyogbm8uIG9mIHN3YXAgc2xvdCBmcmVlIG5vdGlmaWNhdGlvbnMgKi8KLQl1MzIgcGFnZXNfemVybzsJCS8qIG5vLiBvZiB6ZXJvIGZpbGxlZCBwYWdlcyAqLwotCXUzMiBwYWdlc19zdG9yZWQ7CS8qIG5vLiBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkICovCi0JdTMyIGdvb2RfY29tcHJlc3M7CS8qICUgb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCi0JdTMyIGJhZF9jb21wcmVzczsJLyogJSBvZiBwYWdlcyB3aXRoIGNvbXByZXNzaW9uIHJhdGlvPj03NSUgKi8KKwlhdG9taWNfdCBwYWdlc196ZXJvOwkJLyogbm8uIG9mIHplcm8gZmlsbGVkIHBhZ2VzICovCisJYXRvbWljX3QgcGFnZXNfc3RvcmVkOwkvKiBuby4gb2YgcGFnZXMgY3VycmVudGx5IHN0b3JlZCAqLworCWF0b21pY190IGdvb2RfY29tcHJlc3M7CS8qICUgb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCisJYXRvbWljX3QgYmFkX2NvbXByZXNzOwkvKiAlIG9mIHBhZ2VzIHdpdGggY29tcHJlc3Npb24gcmF0aW8+PTc1JSAqLwogfTsKIAogc3RydWN0IHpyYW1fbWV0YSB7CisJcndsb2NrX3QgdGJfbG9jazsJLyogcHJvdGVjdCB0YWJsZSAqLwogCXZvaWQgKmNvbXByZXNzX3dvcmttZW07CiAJdm9pZCAqY29tcHJlc3NfYnVmZmVyOwogCXN0cnVjdCB0YWJsZSAqdGFibGU7CiAJc3RydWN0IHpzX3Bvb2wgKm1lbV9wb29sOwotfTsKLQotc3RydWN0IHpyYW1fc2xvdF9mcmVlIHsKLQl1bnNpZ25lZCBsb25nIGluZGV4OwotCXN0cnVjdCB6cmFtX3Nsb3RfZnJlZSAqbmV4dDsKKwlzdHJ1Y3QgbXV0ZXggYnVmZmVyX2xvY2s7IC8qIHByb3RlY3QgY29tcHJlc3MgYnVmZmVycyAqLwogfTsKIAogc3RydWN0IHpyYW0gewogCXN0cnVjdCB6cmFtX21ldGEgKm1ldGE7Ci0Jc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOyAvKiBwcm90ZWN0IGNvbXByZXNzaW9uIGJ1ZmZlcnMsIHRhYmxlLAotCQkJCSAgICogMzJiaXQgc3RhdCBjb3VudGVycyBhZ2FpbnN0IGNvbmN1cnJlbnQKLQkJCQkgICAqIG5vdGlmaWNhdGlvbnMsIHJlYWRzIGFuZCB3cml0ZXMgKi8KLQotCXN0cnVjdCB3b3JrX3N0cnVjdCBmcmVlX3dvcms7ICAvKiBoYW5kbGUgcGVuZGluZyBmcmVlIHJlcXVlc3QgKi8KLQlzdHJ1Y3QgenJhbV9zbG90X2ZyZWUgKnNsb3RfZnJlZV9ycTsgLyogbGlzdCBoZWFkIG9mIGZyZWUgcmVxdWVzdCAqLwotCiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCWludCBpbml0X2RvbmU7CkBAIC0xMTgsNyArMTAzLDYgQEAKIAkgKiB3ZSBjYW4gc3RvcmUgaW4gYSBkaXNrLgogCSAqLwogCXU2NCBkaXNrc2l6ZTsJLyogYnl0ZXMgKi8KLQlzcGlubG9ja190IHNsb3RfZnJlZV9sb2NrOwogCiAJc3RydWN0IHpyYW1fc3RhdHMgc3RhdHM7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvYXJtLWNjaS5jIGIvZHJpdmVycy9idXMvYXJtLWNjaS5jCmluZGV4IGI2NzM5Y2IuLjk2MmZkMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL2FybS1jY2kuYworKysgYi9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKQEAgLTk3OSw3ICs5NzksNyBAQAogCiAJbmJfY2NpX3BvcnRzID0gY2NpX2NvbmZpZy0+bmJfYWNlICsgY2NpX2NvbmZpZy0+bmJfYWNlX2xpdGU7CiAKLQlwb3J0cyA9IGtjYWxsb2Moc2l6ZW9mKCpwb3J0cyksIG5iX2NjaV9wb3J0cywgR0ZQX0tFUk5FTCk7CisJcG9ydHMgPSBrY2FsbG9jKG5iX2NjaV9wb3J0cywgc2l6ZW9mKCpwb3J0cyksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydHMpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMKaW5kZXggNTk4MGNiOS4uNTFlNzVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9nZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vZ2Ryb20uYwpAQCAtNTYxLDExICs1NjEsMTEgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gcmVxdWVzdF9pcnEoSFdfRVZFTlRfR0RST01fQ01ELCBnZHJvbV9jb21tYW5kX2ludGVycnVwdCwKLQkJSVJRRl9ESVNBQkxFRCwgImdkcm9tX2NvbW1hbmQiLCAmZ2QpOworCQkwLCAiZ2Ryb21fY29tbWFuZCIsICZnZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAllcnIgPSByZXF1ZXN0X2lycShIV19FVkVOVF9HRFJPTV9ETUEsIGdkcm9tX2RtYV9pbnRlcnJ1cHQsCi0JCUlSUUZfRElTQUJMRUQsICJnZHJvbV9kbWEiLCAmZ2QpOworCQkwLCAiZ2Ryb21fZG1hIiwgJmdkKTsKIAlpZiAoZXJyKQogCQlmcmVlX2lycShIV19FVkVOVF9HRFJPTV9DTUQsICZnZCk7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCAyOTBmZTViLi5hMzI0ZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC00OSw3ICs0OSw3IEBACiBvYmotJChDT05GSUdfVEVMQ0xPQ0spCQkrPSB0bGNsay5vCiAKIG9iai0kKENPTkZJR19NV0FWRSkJCSs9IG13YXZlLwotb2JqLSQoQ09ORklHX0FHUCkJCSs9IGFncC8KK29iai15CQkJCSs9IGFncC8KIG9iai0kKENPTkZJR19QQ01DSUEpCQkrPSBwY21jaWEvCiAKIG9iai0kKENPTkZJR19IQU5HQ0hFQ0tfVElNRVIpCSs9IGhhbmdjaGVjay10aW1lci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKaW5kZXggZDhiMWI1Ny4uYzUyOGY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwpAQCAtNjgsNiArNjgsNyBAQAogY29uZmlnIEFHUF9JTlRFTAogCXRyaXN0YXRlICJJbnRlbCA0NDBMWC9CWC9HWCwgSTh4eCBhbmQgRTd4MDUgY2hpcHNldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQUdQICYmIFg4NgorCXNlbGVjdCBJTlRFTF9HVFQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mIFgKIAkgIG9uIEludGVsIDQ0MExYL0JYL0dYLCA4MTUsIDgyMCwgODMwLCA4NDAsIDg0NSwgODUwLCA4NjAsIDg3NSwKQEAgLTE1NSwzICsxNTYsNyBAQAogICAgICAgICAgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgU0dJIFRJTyBjaGlwc2V0CiAgICAgICAgICAgZm9yIElBNjQgcHJvY2Vzc29ycy4KIAorY29uZmlnIElOVEVMX0dUVAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBYODYgJiYgUENJCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlCmluZGV4IDhlYjU2ZTIuLjYwNDQ4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNyBAQAogb2JqLSQoQ09ORklHX0FHUF9QQVJJU0MpCSs9IHBhcmlzYy1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9JNDYwKQkJKz0gaTQ2MC1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9JTlRFTCkJCSs9IGludGVsLWFncC5vCi1vYmotJChDT05GSUdfQUdQX0lOVEVMKQkJKz0gaW50ZWwtZ3R0Lm8KK29iai0kKENPTkZJR19JTlRFTF9HVFQpCQkrPSBpbnRlbC1ndHQubwogb2JqLSQoQ09ORklHX0FHUF9OVklESUEpCSs9IG52aWRpYS1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9TR0lfVElPQ0EpCSs9IHNnaS1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9TSVMpCQkrPSBzaXMtYWdwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IGE3YzI3NjUuLmY5YjljYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtMTQsOSArMTQsNiBAQAogI2luY2x1ZGUgImludGVsLWFncC5oIgogI2luY2x1ZGUgPGRybS9pbnRlbC1ndHQuaD4KIAotaW50IGludGVsX2FncF9lbmFibGVkOwotRVhQT1JUX1NZTUJPTChpbnRlbF9hZ3BfZW5hYmxlZCk7Ci0KIHN0YXRpYyBpbnQgaW50ZWxfZmV0Y2hfc2l6ZSh2b2lkKQogewogCWludCBpOwpAQCAtODA2LDggKzgwMyw2IEBACiBmb3VuZF9nbWNoOgogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOwogCWVyciA9IGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Ci0JaWYgKCFlcnIpCi0JCWludGVsX2FncF9lbmFibGVkID0gMTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwppbmRleCBhZDVkYTFmLi41Yzg1MzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKQEAgLTk0LDYgKzk0LDcgQEAKICNkZWZpbmUgSVNfSVJPTkxBS0UJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmlzX2lyb25sYWtlCiAjZGVmaW5lIEhBU19QR1RCTF9FTglpbnRlbF9wcml2YXRlLmRyaXZlci0+aGFzX3BndGJsX2VuYWJsZQogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQUdQX0lOVEVMKQogc3RhdGljIGludCBpbnRlbF9ndHRfbWFwX21lbW9yeShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAogCQkJCXVuc2lnbmVkIGludCBudW1fZW50cmllcywKIAkJCQlzdHJ1Y3Qgc2dfdGFibGUgKnN0KQpAQCAtMTY4LDYgKzE2OSw3IEBACiAJX19mcmVlX3BhZ2VzKHBhZ2UsIDIpOwogCWF0b21pY19kZWMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CiB9CisjZW5kaWYKIAogI2RlZmluZSBJODEwX0dUVF9PUkRFUiA0CiBzdGF0aWMgaW50IGk4MTBfc2V0dXAodm9pZCkKQEAgLTIwOCw2ICsyMTAsNyBAQAogCWZyZWVfZ2F0dF9wYWdlcyhpbnRlbF9wcml2YXRlLmk4MXhfZ3R0X3RhYmxlLCBJODEwX0dUVF9PUkRFUik7CiB9CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BR1BfSU5URUwpCiBzdGF0aWMgaW50IGk4MTBfaW5zZXJ0X2RjYWNoZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAogCQkJCSAgICAgIGludCB0eXBlKQogewpAQCAtMjg4LDYgKzI5MSw3IEBACiAJfQogCWtmcmVlKGN1cnIpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgaW50ZWxfZ3R0X3NldHVwX3NjcmF0Y2hfcGFnZSh2b2lkKQogewpAQCAtNjQ1LDcgKzY0OSw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FHUF9JTlRFTCkKIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsgICAvKiBGSVhNRTogPyAqLworI2VuZGlmCiAKIAlpbnRlbF9wcml2YXRlLnN0b2xlbl9zaXplID0gaW50ZWxfZ3R0X3N0b2xlbl9zaXplKCk7CiAKQEAgLTY2Niw2ICs2NzIsNyBAQAogCXJldHVybiAwOwogfQogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQUdQX0lOVEVMKQogc3RhdGljIGludCBpbnRlbF9mYWtlX2FncF9mZXRjaF9zaXplKHZvaWQpCiB7CiAJaW50IG51bV9zaXplcyA9IEFSUkFZX1NJWkUoaW50ZWxfZmFrZV9hZ3Bfc2l6ZXMpOwpAQCAtNjg0LDYgKzY5MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBpODMwX2NsZWFudXAodm9pZCkKIHsKQEAgLTc5NSw2ICs4MDMsNyBAQAogCXJldHVybiAwOwogfQogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQUdQX0lOVEVMKQogc3RhdGljIGludCBpbnRlbF9mYWtlX2FncF9jcmVhdGVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCiB7CiAJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsID0gTlVMTDsKQEAgLTgxOSw2ICs4MjgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGJvb2wgaTgzMF9jaGVja19mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CkBAIC04NTcsNiArODY3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FHUF9JTlRFTCkKIHN0YXRpYyB2b2lkIGludGVsX2d0dF9pbnNlcnRfcGFnZXModW5zaWduZWQgaW50IGZpcnN0X2VudHJ5LAogCQkJCSAgIHVuc2lnbmVkIGludCBudW1fZW50cmllcywKIAkJCQkgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLApAQCAtOTIyLDYgKzkzMyw3IEBACiAJbWVtLT5pc19mbHVzaGVkID0gdHJ1ZTsKIAlyZXR1cm4gcmV0OwogfQorI2VuZGlmCiAKIHZvaWQgaW50ZWxfZ3R0X2NsZWFyX3JhbmdlKHVuc2lnbmVkIGludCBmaXJzdF9lbnRyeSwgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzKQogewpAQCAtOTM1LDYgKzk0Nyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGludGVsX2d0dF9jbGVhcl9yYW5nZSk7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BR1BfSU5URUwpCiBzdGF0aWMgaW50IGludGVsX2Zha2VfYWdwX3JlbW92ZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCiAJCQkJCSBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCiB7CkBAIC05NzYsNiArOTg5LDcgQEAKIAkvKiBhbHdheXMgcmV0dXJuIE5VTEwgZm9yIG90aGVyIGFsbG9jYXRpb24gdHlwZXMgZm9yIG5vdyAqLwogCXJldHVybiBOVUxMOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgaW50ZWxfYWxsb2NfY2hpcHNldF9mbHVzaF9yZXNvdXJjZSh2b2lkKQogewpAQCAtMTEyOSw2ICsxMTQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FHUF9JTlRFTCkKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfZmFrZV9hZ3BfZHJpdmVyID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnNpemVfdHlwZQkJPSBGSVhFRF9BUEVSX1NJWkUsCkBAIC0xMTUwLDYgKzExNjUsNyBAQAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIH07CisjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIGk4MXhfZ3R0X2RyaXZlciA9IHsKIAkuZ2VuID0gMSwKQEAgLTEzNjcsMTEgKzEzODMsMTMgQEAKIAogCWludGVsX3ByaXZhdGUucmVmY291bnQrKzsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FHUF9JTlRFTCkKIAlpZiAoYnJpZGdlKSB7CiAJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsX2Zha2VfYWdwX2RyaXZlcjsKIAkJYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhID0gJmludGVsX3ByaXZhdGU7CiAJCWJyaWRnZS0+ZGV2ID0gYnJpZGdlX3BkZXY7CiAJfQorI2VuZGlmCiAKIAlpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYgPSBwY2lfZGV2X2dldChicmlkZ2VfcGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pOGsuYyBiL2RyaXZlcnMvY2hhci9pOGsuYwppbmRleCBlMjEwZjg1Li5kOTE1NzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaThrLmMKKysrIGIvZHJpdmVycy9jaGFyL2k4ay5jCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1vIERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KICAqCiAgKiBId21vbiBpbnRlZ3JhdGlvbjoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqIENvcHlyaWdodCAoQykgMjAxMyAgR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IDY3MWMzODUuLjAzZjQxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0yNzI0LDYgKzI3MjQsNyBAQAogc3RhdGljIGludCBpcG1pX3BhcmlzY19wcm9iZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKKwlpbnQgcnY7CiAKIAlpbmZvID0gc21pX2luZm9fYWxsb2MoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCBmZWVhODdjLi42OTI4ZDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtODkwLDEyICs4OTAsMTAgQEAKIAl9IGVsc2UgewogCQkvKiBGYWlsYmFjayB0byBjb3B5aW5nIGEgcGFnZSAqLwogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWNoYXIgKnNyYyA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAxKTsKLQkJY2hhciAqZHN0OworCQljaGFyICpzcmM7CiAKIAkJaWYgKCFwYWdlKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWRzdCA9IGttYXAocGFnZSk7CiAKIAkJb2Zmc2V0ID0gc2QtPnBvcyAmIH5QQUdFX01BU0s7CiAKQEAgLTkwMyw5ICs5MDEsOCBAQAogCQlpZiAobGVuICsgb2Zmc2V0ID4gUEFHRV9TSVpFKQogCQkJbGVuID0gUEFHRV9TSVpFIC0gb2Zmc2V0OwogCi0JCW1lbWNweShkc3QgKyBvZmZzZXQsIHNyYyArIGJ1Zi0+b2Zmc2V0LCBsZW4pOwotCi0JCWt1bm1hcChwYWdlKTsKKwkJc3JjID0gYnVmLT5vcHMtPm1hcChwaXBlLCBidWYsIDEpOworCQltZW1jcHkocGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCBzcmMgKyBidWYtPm9mZnNldCwgbGVuKTsKIAkJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKIAogCQlzZ19zZXRfcGFnZSgmKHNnbC0+c2dbc2dsLT5uXSksIHBhZ2UsIGxlbiwgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYmNtX2tvbmFfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYmNtX2tvbmFfdGltZXIuYwppbmRleCA1MTc2ZTc2Li45NzRiMmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2JjbV9rb25hX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9iY21fa29uYV90aW1lci5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CkBAIC0xMDEsMTEgKzEwMiwxOCBAQAogc3RhdGljIHZvaWQgX19pbml0IGtvbmFfdGltZXJzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXUzMiBmcmVxOworCXN0cnVjdCBjbGsgKmV4dGVybmFsX2NsazsKIAotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsICZmcmVxKSkKKwlleHRlcm5hbF9jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUobm9kZSwgTlVMTCk7CisKKwlpZiAoIUlTX0VSUihleHRlcm5hbF9jbGspKSB7CisJCWFyY2hfdGltZXJfcmF0ZSA9IGNsa19nZXRfcmF0ZShleHRlcm5hbF9jbGspOworCQljbGtfcHJlcGFyZV9lbmFibGUoZXh0ZXJuYWxfY2xrKTsKKwl9IGVsc2UgaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJmZyZXEpKSB7CiAJCWFyY2hfdGltZXJfcmF0ZSA9IGZyZXE7Ci0JZWxzZQotCQlwYW5pYygiY2xvY2stZnJlcXVlbmN5IG5vdCBzZXQgaW4gdGhlIC5kdHMgZmlsZSIpOworCX0gZWxzZSB7CisJCXBhbmljKCJ1bmFibGUgdG8gZGV0ZXJtaW5lIGNsb2NrLWZyZXF1ZW5jeSIpOworCX0KIAogCS8qIFNldHVwIElSUSBudW1iZXJzICovCiAJdGltZXJzLnRtcl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA3OWU1NjA4Li4xODQ0OGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC05MTksNyArOTE5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2NwdWZyZXFfYm9vc3RfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgYWNwaV9jcHVmcmVxX2Jvb3N0X2V4aXQodm9pZCkKIHsKIAlpZiAobXNycykgewogCQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmYm9vc3RfbmIpOwpAQCAtOTY5LDkgKzk2OSwxMCBAQAogCWFjcGlfY3B1ZnJlcV9ib29zdF9pbml0KCk7CiAKIAlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9jcHVmcmVxX2RyaXZlcik7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCWZyZWVfYWNwaV9wZXJmX2RhdGEoKTsKLQorCQlhY3BpX2NwdWZyZXFfYm9vc3RfZXhpdCgpOworCX0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMgYi9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKaW5kZXggN2UyNTdiMi4uNzk2MDZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwpAQCAtNTcsNiArNTcsNyBAQAogCWludDMyX3QgY29yZV9wY3RfYnVzeTsKIAl1NjQgYXBlcmY7CiAJdTY0IG1wZXJmOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2M7CiAJaW50IGZyZXE7CiB9OwogCkBAIC05Niw2ICs5Nyw3IEBACiAKIAl1NjQJcHJldl9hcGVyZjsKIAl1NjQJcHJldl9tcGVyZjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcHJldl90c2M7CiAJaW50CXNhbXBsZV9wdHI7CiAJc3RydWN0IHNhbXBsZSBzYW1wbGVzW1NBTVBMRV9DT1VOVF07CiB9OwpAQCAtNTQ4LDMwICs1NTAsNDEgQEAKIAkJCQkJc3RydWN0IHNhbXBsZSAqc2FtcGxlKQogewogCXU2NCBjb3JlX3BjdDsKLQljb3JlX3BjdCA9IGRpdjY0X3U2NChpbnRfdG9mcChzYW1wbGUtPmFwZXJmICogMTAwKSwKLQkJCSAgICAgc2FtcGxlLT5tcGVyZik7Ci0Jc2FtcGxlLT5mcmVxID0gZnBfdG9pbnQoY3B1LT5wc3RhdGUubWF4X3BzdGF0ZSAqIGNvcmVfcGN0ICogMTAwMCk7CisJdTY0IGMwX3BjdDsKIAotCXNhbXBsZS0+Y29yZV9wY3RfYnVzeSA9IGNvcmVfcGN0OworCWNvcmVfcGN0ID0gZGl2NjRfdTY0KHNhbXBsZS0+YXBlcmYgKiAxMDAsIHNhbXBsZS0+bXBlcmYpOworCisJYzBfcGN0ID0gZGl2NjRfdTY0KHNhbXBsZS0+bXBlcmYgKiAxMDAsIHNhbXBsZS0+dHNjKTsKKwlzYW1wbGUtPmZyZXEgPSBmcF90b2ludCgKKwkJbXVsX2ZwKGludF90b2ZwKGNwdS0+cHN0YXRlLm1heF9wc3RhdGUpLAorCQkJaW50X3RvZnAoY29yZV9wY3QgKiAxMDAwKSkpOworCisJc2FtcGxlLT5jb3JlX3BjdF9idXN5ID0gbXVsX2ZwKGludF90b2ZwKGNvcmVfcGN0KSwKKwkJCQlkaXZfZnAoaW50X3RvZnAoYzBfcGN0ICsgMSksIGludF90b2ZwKDEwMCkpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGludGVsX3BzdGF0ZV9zYW1wbGUoc3RydWN0IGNwdWRhdGEgKmNwdSkKIHsKIAl1NjQgYXBlcmYsIG1wZXJmOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2M7CiAKIAlyZG1zcmwoTVNSX0lBMzJfQVBFUkYsIGFwZXJmKTsKIAlyZG1zcmwoTVNSX0lBMzJfTVBFUkYsIG1wZXJmKTsKKwl0c2MgPSBuYXRpdmVfcmVhZF90c2MoKTsKIAogCWNwdS0+c2FtcGxlX3B0ciA9IChjcHUtPnNhbXBsZV9wdHIgKyAxKSAlIFNBTVBMRV9DT1VOVDsKIAljcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXS5hcGVyZiA9IGFwZXJmOwogCWNwdS0+c2FtcGxlc1tjcHUtPnNhbXBsZV9wdHJdLm1wZXJmID0gbXBlcmY7CisJY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl0udHNjID0gdHNjOwogCWNwdS0+c2FtcGxlc1tjcHUtPnNhbXBsZV9wdHJdLmFwZXJmIC09IGNwdS0+cHJldl9hcGVyZjsKIAljcHUtPnNhbXBsZXNbY3B1LT5zYW1wbGVfcHRyXS5tcGVyZiAtPSBjcHUtPnByZXZfbXBlcmY7CisJY3B1LT5zYW1wbGVzW2NwdS0+c2FtcGxlX3B0cl0udHNjIC09IGNwdS0+cHJldl90c2M7CiAKIAlpbnRlbF9wc3RhdGVfY2FsY19idXN5KGNwdSwgJmNwdS0+c2FtcGxlc1tjcHUtPnNhbXBsZV9wdHJdKTsKIAogCWNwdS0+cHJldl9hcGVyZiA9IGFwZXJmOwogCWNwdS0+cHJldl9tcGVyZiA9IG1wZXJmOworCWNwdS0+cHJldl90c2MgPSB0c2M7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9wc3RhdGVfc2V0X3NhbXBsZV90aW1lKHN0cnVjdCBjcHVkYXRhICpjcHUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvS2NvbmZpZyBiL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCmluZGV4IGIzZmI4MWQuLmYwNGUyNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCkBAIC0zNSw2ICszNSwxMSBAQAogc291cmNlICJkcml2ZXJzL2NwdWlkbGUvS2NvbmZpZy5hcm0iCiBlbmRtZW51CiAKK21lbnUgIlBPV0VSUEMgQ1BVIElkbGUgRHJpdmVycyIKK2RlcGVuZHMgb24gUFBDCitzb3VyY2UgImRyaXZlcnMvY3B1aWRsZS9LY29uZmlnLnBvd2VycGMiCitlbmRtZW51CisKIGVuZGlmCiAKIGNvbmZpZyBBUkNIX05FRURTX0NQVV9JRExFX0NPVVBMRUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnLnBvd2VycGMgYi9kcml2ZXJzL2NwdWlkbGUvS2NvbmZpZy5wb3dlcnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWlkbGUvS2NvbmZpZy5wb3dlcnBjCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgUE9XRVJQQyBDUFUgSWRsZSBEcml2ZXJzCisjCitjb25maWcgUFNFUklFU19DUFVJRExFCisJYm9vbCAiQ3B1aWRsZSBkcml2ZXIgZm9yIHBTZXJpZXMgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gQ1BVX0lETEUKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBwcm9jZXNzb3IgaWRsZSBzdGF0ZSBtYW5hZ2VtZW50CisJICB0aHJvdWdoIGNwdWlkbGUgc3Vic3lzdGVtLgorCitjb25maWcgUE9XRVJOVl9DUFVJRExFCisJYm9vbCAiQ3B1aWRsZSBkcml2ZXIgZm9yIHBvd2VybnYgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gQ1BVX0lETEUKKwlkZXBlbmRzIG9uIFBQQ19QT1dFUk5WCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBwcm9jZXNzb3IgaWRsZSBzdGF0ZSBtYW5hZ2VtZW50CisJICB0aHJvdWdoIGNwdWlkbGUgc3Vic3lzdGVtLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL01ha2VmaWxlIGIvZHJpdmVycy9jcHVpZGxlL01ha2VmaWxlCmluZGV4IDUyN2JlMjguLmY3MWFlMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NwdWlkbGUvTWFrZWZpbGUKQEAgLTEzLDMgKzEzLDggQEAKIG9iai0kKENPTkZJR19BUk1fWllOUV9DUFVJRExFKQkJKz0gY3B1aWRsZS16eW5xLm8KIG9iai0kKENPTkZJR19BUk1fVTg1MDBfQ1BVSURMRSkgICAgICAgICArPSBjcHVpZGxlLXV4NTAwLm8KIG9iai0kKENPTkZJR19BUk1fQVQ5MV9DUFVJRExFKSAgICAgICAgICArPSBjcHVpZGxlLWF0OTEubworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBPV0VSUEMgZHJpdmVycworb2JqLSQoQ09ORklHX1BTRVJJRVNfQ1BVSURMRSkJCSs9IGNwdWlkbGUtcHNlcmllcy5vCitvYmotJChDT05GSUdfUE9XRVJOVl9DUFVJRExFKQkJKz0gY3B1aWRsZS1wb3dlcm52Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZkMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogIGNwdWlkbGUtcG93ZXJudiAtIGlkbGUgc3RhdGUgY3B1aWRsZSBkcml2ZXIuCisgKiAgQWRhcHRlZCBmcm9tIGRyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworc3RydWN0IGNwdWlkbGVfZHJpdmVyIHBvd2VybnZfaWRsZV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgICAgPSAicG93ZXJudl9pZGxlIiwKKwkub3duZXIgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBtYXhfaWRsZV9zdGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqY3B1aWRsZV9zdGF0ZV90YWJsZTsKKworc3RhdGljIGludCBzbm9vemVfbG9vcChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJaW50IGluZGV4KQoreworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJSE1UX2xvdygpOworCQlITVRfdmVyeV9sb3coKTsKKwl9CisKKwlITVRfbWVkaXVtKCk7CisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwlzbXBfbWIoKTsKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgbmFwX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCWludCBpbmRleCkKK3sKKwlwb3dlcjdfaWRsZSgpOworCXJldHVybiBpbmRleDsKK30KKworLyoKKyAqIFN0YXRlcyBmb3IgZGVkaWNhdGVkIHBhcnRpdGlvbiBjYXNlLgorICovCitzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgcG93ZXJudl9zdGF0ZXNbXSA9IHsKKwl7IC8qIFNub296ZSAqLworCQkubmFtZSA9ICJzbm9vemUiLAorCQkuZGVzYyA9ICJzbm9vemUiLAorCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKKwkJLmV4aXRfbGF0ZW5jeSA9IDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMCwKKwkJLmVudGVyID0gJnNub296ZV9sb29wIH0sCisJeyAvKiBOQVAgKi8KKwkJLm5hbWUgPSAiTkFQIiwKKwkJLmRlc2MgPSAiTkFQIiwKKwkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCisJCS5leGl0X2xhdGVuY3kgPSAxMCwKKwkJLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAsCisJCS5lbnRlciA9ICZuYXBfbG9vcCB9LAorfTsKKworc3RhdGljIGludCBwb3dlcm52X2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sCisJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9CisJCQkJcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGhvdGNwdSk7CisKKwlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7CisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgQ1BVX09OTElORToKKwkJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKKwkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJCWNwdWlkbGVfZW5hYmxlX2RldmljZShkZXYpOworCQkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDUFVfREVBRDoKKwkJY2FzZSBDUFVfREVBRF9GUk9aRU46CisJCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7CisJCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7CisJCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQl9CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2V0dXBfaG90cGx1Z19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHBvd2VybnZfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyLAorfTsKKworLyoKKyAqIHBvd2VybnZfY3B1aWRsZV9kcml2ZXJfaW5pdCgpCisgKi8KK3N0YXRpYyBpbnQgcG93ZXJudl9jcHVpZGxlX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGlkbGVfc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmcG93ZXJudl9pZGxlX2RyaXZlcjsKKworCWRydi0+c3RhdGVfY291bnQgPSAwOworCisJZm9yIChpZGxlX3N0YXRlID0gMDsgaWRsZV9zdGF0ZSA8IG1heF9pZGxlX3N0YXRlOyArK2lkbGVfc3RhdGUpIHsKKwkJLyogSXMgdGhlIHN0YXRlIG5vdCBlbmFibGVkPyAqLworCQlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZVtpZGxlX3N0YXRlXS5lbnRlciA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZHJ2LT5zdGF0ZXNbZHJ2LT5zdGF0ZV9jb3VudF0gPQkvKiBzdHJ1Y3R1cmUgY29weSAqLworCQkJY3B1aWRsZV9zdGF0ZV90YWJsZVtpZGxlX3N0YXRlXTsKKworCQlkcnYtPnN0YXRlX2NvdW50ICs9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwb3dlcm52X2lkbGVfcHJvYmUoKQorICogQ2hvb3NlIHN0YXRlIHRhYmxlIGZvciBzaGFyZWQgdmVyc3VzIGRlZGljYXRlZCBwYXJ0aXRpb24KKyAqLworc3RhdGljIGludCBwb3dlcm52X2lkbGVfcHJvYmUodm9pZCkKK3sKKworCWlmIChjcHVpZGxlX2Rpc2FibGUgIT0gSURMRV9OT19PVkVSUklERSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMdjMpKSB7CisJCWNwdWlkbGVfc3RhdGVfdGFibGUgPSBwb3dlcm52X3N0YXRlczsKKwkJbWF4X2lkbGVfc3RhdGUgPSBBUlJBWV9TSVpFKHBvd2VybnZfc3RhdGVzKTsKKyAJfSBlbHNlCisgCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm52X3Byb2Nlc3Nvcl9pZGxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcG93ZXJudl9pZGxlX3Byb2JlKCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXBvd2VybnZfY3B1aWRsZV9kcml2ZXJfaW5pdCgpOworCXJldHZhbCA9IGNwdWlkbGVfcmVnaXN0ZXIoJnBvd2VybnZfaWRsZV9kcml2ZXIsIE5VTEwpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJlZ2lzdHJhdGlvbiBvZiBwb3dlcm52IGRyaXZlciBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdfbm90aWZpZXIpOworCXByaW50ayhLRVJOX0RFQlVHICJwb3dlcm52X2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwocG93ZXJudl9wcm9jZXNzb3JfaWRsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKaW5kZXggMDAyZDViNC4uN2FiNTY0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBwcm9jZXNzb3JfaWRsZSAtIGlkbGUgc3RhdGUgY3B1aWRsZSBkcml2ZXIuCisgKiAgY3B1aWRsZS1wc2VyaWVzIC0gaWRsZSBzdGF0ZSBjcHVpZGxlIGRyaXZlci4KICAqICBBZGFwdGVkIGZyb20gZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYyBhbmQKICAqICBkcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwogICoKQEAgLTI0LDkgKzI0LDcgQEAKIAkub3duZXIgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAotI2RlZmluZSBNQVhfSURMRV9TVEFURV9DT1VOVAkyCi0KLXN0YXRpYyBpbnQgbWF4X2lkbGVfc3RhdGUgPSBNQVhfSURMRV9TVEFURV9DT1VOVCAtIDE7CitzdGF0aWMgaW50IG1heF9pZGxlX3N0YXRlOwogc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpjcHVpZGxlX3N0YXRlX3RhYmxlOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9sb29wX3Byb2xvZyh1bnNpZ25lZCBsb25nICppbl9wdXJyKQpAQCAtNTQsMTMgKzUyLDEyIEBACiAJCQlpbnQgaW5kZXgpCiB7CiAJdW5zaWduZWQgbG9uZyBpbl9wdXJyOwotCWludCBjcHUgPSBkZXYtPmNwdTsKIAogCWlkbGVfbG9vcF9wcm9sb2coJmluX3B1cnIpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAotCXdoaWxlICgoIW5lZWRfcmVzY2hlZCgpKSAmJiBjcHVfb25saW5lKGNwdSkpIHsKKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCUhNVF9sb3coKTsKIAkJSE1UX3ZlcnlfbG93KCk7CiAJfQpAQCAtMTM1LDcgKzEzMiw3IEBACiAvKgogICogU3RhdGVzIGZvciBkZWRpY2F0ZWQgcGFydGl0aW9uIGNhc2UuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBkZWRpY2F0ZWRfc3RhdGVzW01BWF9JRExFX1NUQVRFX0NPVU5UXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBkZWRpY2F0ZWRfc3RhdGVzW10gPSB7CiAJeyAvKiBTbm9vemUgKi8KIAkJLm5hbWUgPSAic25vb3plIiwKIAkJLmRlc2MgPSAic25vb3plIiwKQEAgLTE1NSw3ICsxNTIsNyBAQAogLyoKICAqIFN0YXRlcyBmb3Igc2hhcmVkIHBhcnRpdGlvbiBjYXNlLgogICovCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgc2hhcmVkX3N0YXRlc1tNQVhfSURMRV9TVEFURV9DT1VOVF0gPSB7CitzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgc2hhcmVkX3N0YXRlc1tdID0gewogCXsgLyogU2hhcmVkIENlZGUgKi8KIAkJLm5hbWUgPSAiU2hhcmVkIENlZGUiLAogCQkuZGVzYyA9ICJTaGFyZWQgQ2VkZSIsCkBAIC0xNjUsMjkgKzE2MiwxMiBAQAogCQkuZW50ZXIgPSAmc2hhcmVkX2NlZGVfbG9vcCB9LAogfTsKIAotdm9pZCB1cGRhdGVfc210X3Nub296ZV9kZWxheShpbnQgY3B1LCBpbnQgcmVzaWRlbmN5KQotewotCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfZHJpdmVyKCk7Ci0Jc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKLQotCWlmIChjcHVpZGxlX3N0YXRlX3RhYmxlICE9IGRlZGljYXRlZF9zdGF0ZXMpCi0JCXJldHVybjsKLQotCWlmIChyZXNpZGVuY3kgPCAwKSB7Ci0JCS8qIERpc2FibGUgdGhlIE5hcCBzdGF0ZSBvbiB0aGF0IGNwdSAqLwotCQlpZiAoZGV2KQotCQkJZGV2LT5zdGF0ZXNfdXNhZ2VbMV0uZGlzYWJsZSA9IDE7Ci0JfSBlbHNlCi0JCWlmIChkcnYpCi0JCQlkcnYtPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gcmVzaWRlbmN5OwotfQotCiBzdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwKIAkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewogCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0KLQkJCXBlcl9jcHVfcHRyKGNwdWlkbGVfZGV2aWNlcywgaG90Y3B1KTsKKwkJCQlwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgaG90Y3B1KTsKIAogCWlmIChkZXYgJiYgY3B1aWRsZV9nZXRfZHJpdmVyKCkpIHsKIAkJc3dpdGNoIChhY3Rpb24pIHsKQEAgLTIyNiwxMiArMjA2LDggQEAKIAogCWRydi0+c3RhdGVfY291bnQgPSAwOwogCi0JZm9yIChpZGxlX3N0YXRlID0gMDsgaWRsZV9zdGF0ZSA8IE1BWF9JRExFX1NUQVRFX0NPVU5UOyArK2lkbGVfc3RhdGUpIHsKLQotCQlpZiAoaWRsZV9zdGF0ZSA+IG1heF9pZGxlX3N0YXRlKQotCQkJYnJlYWs7Ci0KLQkJLyogaXMgdGhlIHN0YXRlIG5vdCBlbmFibGVkPyAqLworCWZvciAoaWRsZV9zdGF0ZSA9IDA7IGlkbGVfc3RhdGUgPCBtYXhfaWRsZV9zdGF0ZTsgKytpZGxlX3N0YXRlKSB7CisJCS8qIElzIHRoZSBzdGF0ZSBub3QgZW5hYmxlZD8gKi8KIAkJaWYgKGNwdWlkbGVfc3RhdGVfdGFibGVbaWRsZV9zdGF0ZV0uZW50ZXIgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNTEsMjEgKzIyNywxOSBAQAogc3RhdGljIGludCBwc2VyaWVzX2lkbGVfcHJvYmUodm9pZCkKIHsKIAotCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWlmIChjcHVpZGxlX2Rpc2FibGUgIT0gSURMRV9OT19PVkVSUklERSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAobWF4X2lkbGVfc3RhdGUgPT0gMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicHNlcmllcyBwcm9jZXNzb3IgaWRsZSBkaXNhYmxlZC5cbiIpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCWlmIChscHBhY2Ffc2hhcmVkX3Byb2MoZ2V0X2xwcGFjYSgpKSkKLQkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IHNoYXJlZF9zdGF0ZXM7Ci0JZWxzZQotCQljcHVpZGxlX3N0YXRlX3RhYmxlID0gZGVkaWNhdGVkX3N0YXRlczsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKSB7CisJCWlmIChscHBhY2Ffc2hhcmVkX3Byb2MoZ2V0X2xwcGFjYSgpKSkgeworCQkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IHNoYXJlZF9zdGF0ZXM7CisJCQltYXhfaWRsZV9zdGF0ZSA9IEFSUkFZX1NJWkUoc2hhcmVkX3N0YXRlcyk7CisJCX0gZWxzZSB7CisJCQljcHVpZGxlX3N0YXRlX3RhYmxlID0gZGVkaWNhdGVkX3N0YXRlczsKKwkJCW1heF9pZGxlX3N0YXRlID0gQVJSQVlfU0laRShkZWRpY2F0ZWRfc3RhdGVzKTsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiAwOwogfQpAQCAtMjg3LDIyICsyNjEsNyBAQAogCiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzZXR1cF9ob3RwbHVnX25vdGlmaWVyKTsKIAlwcmludGsoS0VSTl9ERUJVRyAicHNlcmllc19pZGxlX2RyaXZlciByZWdpc3RlcmVkXG4iKTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHNlcmllc19wcm9jZXNzb3JfaWRsZV9leGl0KHZvaWQpCi17Ci0KLQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2V0dXBfaG90cGx1Z19ub3RpZmllcik7Ci0JY3B1aWRsZV91bnJlZ2lzdGVyKCZwc2VyaWVzX2lkbGVfZHJpdmVyKTsKLQotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQocHNlcmllc19wcm9jZXNzb3JfaWRsZV9pbml0KTsKLW1vZHVsZV9leGl0KHBzZXJpZXNfcHJvY2Vzc29yX2lkbGVfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkRlZXB0aGkgRGhhcndhciA8ZGVlcHRoaUBsaW51eC52bmV0LmlibS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNwdWlkbGUgZHJpdmVyIGZvciBQT1dFUiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworZGV2aWNlX2luaXRjYWxsKHBzZXJpZXNfcHJvY2Vzc29yX2lkbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCmluZGV4IDMxZjNhZGIuLjdkMmY0MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCkBAIC02Nyw3ICs2Nyw3IEBACiAKIGNvbmZpZyBBUk1fRVhZTk9TNF9CVVNfREVWRlJFUQogCWJvb2wgIkFSTSBFeHlub3M0MjEwLzQyMTIvNDQxMiBNZW1vcnkgQnVzIERFVkZSRVEgRHJpdmVyIgotCWRlcGVuZHMgb24gQ1BVX0VYWU5PUzQyMTAgfHwgU09DX0VYWU5PUzQyMTIgfHwgU09DX0VYWU5PUzQ0MTIKKwlkZXBlbmRzIG9uIChDUFVfRVhZTk9TNDIxMCB8fCBTT0NfRVhZTk9TNDIxMiB8fCBTT0NfRVhZTk9TNDQxMikgJiYgIUFSQ0hfTVVMVElQTEFURk9STQogCXNlbGVjdCBBUkNIX0hBU19PUFAKIAlzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggYzEwZWI4OS4uOWJlZDFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zMDYsNiArMzA2LDEyIEBACiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKIAorY29uZmlnIERNQV9CQ00yODM1CisJdHJpc3RhdGUgIkJDTTI4MzUgRE1BIGVuZ2luZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKEFSQ0hfQkNNMjgzNSB8fCBNQUNIX0JDTTI3MDgpCisJc2VsZWN0IERNQV9FTkdJTkUKKwlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKwogY29uZmlnIFRJX0NQUEk0MQogCXRyaXN0YXRlICJBTTMzeHggQ1BQSTQxIERNQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9PTUFQCkBAIC0zMzYsNiArMzQyLDE0IEBACiAJICBTdXBwb3J0IHRoZSBETUEgZW5naW5lIGZvciBIaXNpbGljb24gSzMgcGxhdGZvcm0KIAkgIGRldmljZXMuCiAKK2NvbmZpZyBNT1hBUlRfRE1BCisJdHJpc3RhdGUgIk1PWEFSVCBETUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUCisJc2VsZWN0IERNQV9FTkdJTkUKKwlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1PWEEgQVJUIFNvQyBETUEgY29udHJvbGxlci4KKwogY29uZmlnIERNQV9FTkdJTkUKIAlib29sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggMGNlMmRhOS4uYTAyOWQwZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC0zOCw3ICszOCw5IEBACiBvYmotJChDT05GSUdfRE1BX1NBMTFYMCkgKz0gc2ExMXgwLWRtYS5vCiBvYmotJChDT05GSUdfTU1QX1RETUEpICs9IG1tcF90ZG1hLm8KIG9iai0kKENPTkZJR19ETUFfT01BUCkgKz0gb21hcC1kbWEubworb2JqLSQoQ09ORklHX0RNQV9CQ00yODM1KSArPSBiY20yODM1LWRtYS5vCiBvYmotJChDT05GSUdfTU1QX1BETUEpICs9IG1tcF9wZG1hLm8KIG9iai0kKENPTkZJR19ETUFfSlo0NzQwKSArPSBkbWEtano0NzQwLm8KIG9iai0kKENPTkZJR19USV9DUFBJNDEpICs9IGNwcGk0MS5vCiBvYmotJChDT05GSUdfSzNfRE1BKSArPSBrM2RtYS5vCitvYmotJChDT05GSUdfTU9YQVJUX0RNQSkgKz0gbW94YXJ0LWRtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hY3BpLWRtYS5jIGIvZHJpdmVycy9kbWEvYWNwaS1kbWEuYwppbmRleCBlNjliMDNjLi4xZTUwNmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hY3BpLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2FjcGktZG1hLmMKQEAgLTMwLDExICszMCwxMiBAQAogICogQGFkZXY6CUFDUEkgZGV2aWNlIHRvIG1hdGNoIHdpdGgKICAqIEBhZG1hOglzdHJ1Y3QgYWNwaV9kbWEgb2YgdGhlIGdpdmVuIERNQSBjb250cm9sbGVyCiAgKgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgd2hlbiBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIG9yIGFwcHJvcHJpYXRlCi0gKiBlcnJubyB2YWx1ZSBvbiBlcnJvci4KLSAqCiAgKiBJbiBvcmRlciB0byBtYXRjaCBhIGRldmljZSBmcm9tIERTRFQgdGFibGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ1NSVCBkZXZpY2UKICAqIHdlIHVzZSBNTUlPIGFkZHJlc3MgYW5kIElSUS4KKyAqCisgKiBSZXR1cm46CisgKiAxIG9uIHN1Y2Nlc3MsIDAgd2hlbiBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIG9yIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlCisgKiBvbiBlcnJvci4KICAqLwogc3RhdGljIGludCBhY3BpX2RtYV9wYXJzZV9yZXNvdXJjZV9ncm91cChjb25zdCBzdHJ1Y3QgYWNwaV9jc3J0X2dyb3VwICpncnAsCiAJCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwgc3RydWN0IGFjcGlfZG1hICphZG1hKQpAQCAtMTAxLDcgKzEwMiw2IEBACiAgKgogICogV2UgYXJlIHVzaW5nIHRoaXMgdGFibGUgdG8gZ2V0IHRoZSByZXF1ZXN0IGxpbmUgcmFuZ2Ugb2YgdGhlIHNwZWNpZmljIERNQQogICogY29udHJvbGxlciB0byBiZSB1c2VkIGxhdGVyLgotICoKICAqLwogc3RhdGljIHZvaWQgYWNwaV9kbWFfcGFyc2VfY3NydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIHN0cnVjdCBhY3BpX2RtYSAqYWRtYSkKIHsKQEAgLTE0MSwxMCArMTQxLDExIEBACiAgKiBAZGF0YQkJcG9pbnRlciB0byBjb250cm9sbGVyIHNwZWNpZmljIGRhdGEgdG8gYmUgdXNlZCBieQogICoJCQl0cmFuc2xhdGlvbiBmdW5jdGlvbgogICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlIG9uIGVycm9yLgotICoKICAqIEFsbG9jYXRlZCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIHdpdGggYXBwcm9wcmlhdGUgYWNwaV9kbWFfY29udHJvbGxlcl9mcmVlKCkKICAqIGNhbGwuCisgKgorICogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzIG9yIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlIG9uIGVycm9yLgogICovCiBpbnQgYWNwaV9kbWFfY29udHJvbGxlcl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkbWFfY2hhbiAqKCphY3BpX2RtYV94bGF0ZSkKQEAgLTE4OCw2ICsxODksOSBAQAogICogQGRldjoJc3RydWN0IGRldmljZSBvZiBETUEgY29udHJvbGxlcgogICoKICAqIE1lbW9yeSBhbGxvY2F0ZWQgYnkgYWNwaV9kbWFfY29udHJvbGxlcl9yZWdpc3RlcigpIGlzIGZyZWVkIGhlcmUuCisgKgorICogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzIG9yIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlIG9uIGVycm9yLgogICovCiBpbnQgYWNwaV9kbWFfY29udHJvbGxlcl9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTIyNSw2ICsyMjksOSBAQAogICogTWFuYWdlZCBhY3BpX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyKCkuIERNQSBjb250cm9sbGVyIHJlZ2lzdGVyZWQgYnkgdGhpcwogICogZnVuY3Rpb24gYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgb24gZHJpdmVyIGRldGFjaC4gU2VlCiAgKiBhY3BpX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzIG9yIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlIG9uIGVycm9yLgogICovCiBpbnQgZGV2bV9hY3BpX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRtYV9jaGFuICooKmFjcGlfZG1hX3hsYXRlKQpAQCAtMjY3LDggKzI3NCw2IEBACiAgKiBAYWRtYToJc3RydWN0IGFjcGlfZG1hIG9mIERNQSBjb250cm9sbGVyCiAgKiBAZG1hX3NwZWM6CWRtYSBzcGVjaWZpZXIgdG8gdXBkYXRlCiAgKgotICogUmV0dXJucyAwLCBpZiBubyBpbmZvcm1hdGlvbiBpcyBhdmFpYWJsZSwgLTEgb24gbWlzbWF0Y2gsIGFuZCAxIG90aGVyd2lzZS4KLSAqCiAgKiBBY2NvcmRpbmdseSB0byBBQ1BJIDUuMCBTcGVjaWZpY2F0aW9uIFRhYmxlIDYtMTcwICJGaXhlZCBETUEgUmVzb3VyY2UKICAqIERlc2NyaXB0b3IiOgogICoJRE1BIFJlcXVlc3QgTGluZSBiaXRzIGlzIGEgcGxhdGZvcm0tcmVsYXRpdmUgbnVtYmVyIHVuaXF1ZWx5CkBAIC0yNzYsNiArMjgxLDkgQEAKICAqCW1hcHBpbmcgaXMgZG9uZSBpbiBhIGNvbnRyb2xsZXItc3BlY2lmaWMgT1MgZHJpdmVyLgogICogVGhhdCdzIHdoeSB3ZSBjYW4gc2FmZWx5IGFkanVzdCBzbGF2ZV9pZCB3aGVuIHRoZSBhcHByb3ByaWF0ZSBjb250cm9sbGVyIGlzCiAgKiBmb3VuZC4KKyAqCisgKiBSZXR1cm46CisgKiAwLCBpZiBubyBpbmZvcm1hdGlvbiBpcyBhdmFpYWJsZSwgLTEgb24gbWlzbWF0Y2gsIGFuZCAxIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGludCBhY3BpX2RtYV91cGRhdGVfZG1hX3NwZWMoc3RydWN0IGFjcGlfZG1hICphZG1hLAogCQlzdHJ1Y3QgYWNwaV9kbWFfc3BlYyAqZG1hX3NwZWMpCkBAIC0zMzQsNyArMzQyLDggQEAKICAqIEBkZXY6CXN0cnVjdCBkZXZpY2UgdG8gZ2V0IERNQSByZXF1ZXN0IGZyb20KICAqIEBpbmRleDoJaW5kZXggb2YgRml4ZWRETUEgZGVzY3JpcHRvciBmb3IgQGRldgogICoKLSAqIFJldHVybnMgcG9pbnRlciB0byBhcHByb3ByaWF0ZSBkbWEgY2hhbm5lbCBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZXJyb3IuCisgKiBSZXR1cm46CisgKiBQb2ludGVyIHRvIGFwcHJvcHJpYXRlIGRtYSBjaGFubmVsIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbiBlcnJvci4KICAqLwogc3RydWN0IGRtYV9jaGFuICphY3BpX2RtYV9yZXF1ZXN0X3NsYXZlX2NoYW5fYnlfaW5kZXgoc3RydWN0IGRldmljZSAqZGV2LAogCQlzaXplX3QgaW5kZXgpCkBAIC00MDMsNyArNDEyLDggQEAKICAqIHRyYW5zbGF0ZSB0aGUgbmFtZXMgInR4IiBhbmQgInJ4IiBoZXJlIGJhc2VkIG9uIHRoZSBtb3N0IGNvbW1vbiBjYXNlIHdoZXJlCiAgKiB0aGUgZmlyc3QgRml4ZWRETUEgZGVzY3JpcHRvciBpcyBUWCBhbmQgc2Vjb25kIGlzIFJYLgogICoKLSAqIFJldHVybnMgcG9pbnRlciB0byBhcHByb3ByaWF0ZSBkbWEgY2hhbm5lbCBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZXJyb3IuCisgKiBSZXR1cm46CisgKiBQb2ludGVyIHRvIGFwcHJvcHJpYXRlIGRtYSBjaGFubmVsIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbiBlcnJvci4KICAqLwogc3RydWN0IGRtYV9jaGFuICphY3BpX2RtYV9yZXF1ZXN0X3NsYXZlX2NoYW5fYnlfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCWNvbnN0IGNoYXIgKm5hbWUpCkBAIC00MjcsOCArNDM3LDEwIEBACiAgKiBAYWRtYTogcG9pbnRlciB0byBBQ1BJIERNQSBjb250cm9sbGVyIGRhdGEKICAqCiAgKiBBIHNpbXBsZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiBmb3IgQUNQSSBiYXNlZCBkZXZpY2VzLiBQYXNzZXMgJnN0cnVjdAotICogZG1hX3NwZWMgdG8gdGhlIERNQSBjb250cm9sbGVyIGRyaXZlciBwcm92aWRlZCBmaWx0ZXIgZnVuY3Rpb24uIFJldHVybnMKLSAqIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwgaWYgZm91bmQgb3IgJU5VTEwgb3RoZXJ3aXNlLgorICogZG1hX3NwZWMgdG8gdGhlIERNQSBjb250cm9sbGVyIGRyaXZlciBwcm92aWRlZCBmaWx0ZXIgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOgorICogUG9pbnRlciB0byB0aGUgY2hhbm5lbCBpZiBmb3VuZCBvciAlTlVMTCBvdGhlcndpc2UuCiAgKi8KIHN0cnVjdCBkbWFfY2hhbiAqYWNwaV9kbWFfc2ltcGxlX3hsYXRlKHN0cnVjdCBhY3BpX2RtYV9zcGVjICpkbWFfc3BlYywKIAkJc3RydWN0IGFjcGlfZG1hICphZG1hKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jIGIvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCmluZGV4IGVjNGVlNWMuLjgxMTQ3MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYworKysgYi9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKQEAgLTgzLDYgKzgzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNzcxLDYgKzE3NzIsNyBAQAogCiAJcmV0dXJuIGZhbHNlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGwwOHhfZmlsdGVyX2lkKTsKIAogLyoKICAqIEp1c3QgY2hlY2sgdGhhdCB0aGUgZGV2aWNlIGlzIHRoZXJlIGFuZCBhY3RpdmUKQEAgLTIxNjcsNyArMjE2OSw3IEBACiAJLyogUmVnaXN0ZXIgc2xhdmUgY2hhbm5lbHMgKi8KIAlyZXQgPSBwbDA4eF9kbWFfaW5pdF92aXJ0dWFsX2NoYW5uZWxzKHBsMDh4LCAmcGwwOHgtPnNsYXZlLAogCQkJcGwwOHgtPnBkLT5udW1fc2xhdmVfY2hhbm5lbHMsIHRydWUpOwotCWlmIChyZXQgPD0gMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCWRldl93YXJuKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJIiVzIGZhaWxlZCB0byBlbnVtZXJhdGUgc2xhdmUgY2hhbm5lbHMgLSAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2JjbTI4MzUtZG1hLmMgYi9kcml2ZXJzL2RtYS9iY20yODM1LWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzYwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9iY20yODM1LWRtYS5jCkBAIC0wLDAgKzEsNzA3IEBACisvKgorICogQkNNMjgzNSBETUEgZW5naW5lIHN1cHBvcnQKKyAqCisgKiBUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIGN5Y2xpYyBETUEgdHJhbnNmZXJzCisgKiBhcyBuZWVkZWQgZm9yIHRoZSBJMlMgbW9kdWxlLgorICoKKyAqIEF1dGhvcjogICAgICBGbG9yaWFuIE1laWVyIDxmbG9yaWFuLm1laWVyQGtvYWxvLmRlPgorICogICAgICAgICAgICAgIENvcHlyaWdodCAyMDEzCisgKgorICogQmFzZWQgb24KKyAqCU9NQVAgRE1BZW5naW5lIHN1cHBvcnQgYnkgUnVzc2VsbCBLaW5nCisgKgorICoJQkNNMjcwOCBETUEgRHJpdmVyCisgKglDb3B5cmlnaHQgKEMpIDIwMTAgQnJvYWRjb20KKyAqCisgKglSYXNwYmVycnkgUGkgUENNIEkyUyBBTFNBIERyaXZlcgorICoJQ29weXJpZ2h0IChjKSBieSBQaGlsIFBvb2xlIDIwMTMKKyAqCisgKglNQVJWRUxMIE1NUCBQZXJpcGhlcmFsIERNQSBEcml2ZXIKKyAqCUNvcHlyaWdodCAyMDEyIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KKworI2luY2x1ZGUgInZpcnQtZG1hLmgiCisKK3N0cnVjdCBiY20yODM1X2RtYWRldiB7CisJc3RydWN0IGRtYV9kZXZpY2UgZGRldjsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBkZXZpY2VfZG1hX3BhcmFtZXRlcnMgZG1hX3Bhcm1zOworfTsKKworc3RydWN0IGJjbTI4MzVfZG1hX2NiIHsKKwl1aW50MzJfdCBpbmZvOworCXVpbnQzMl90IHNyYzsKKwl1aW50MzJfdCBkc3Q7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQzMl90IHN0cmlkZTsKKwl1aW50MzJfdCBuZXh0OworCXVpbnQzMl90IHBhZFsyXTsKK307CisKK3N0cnVjdCBiY20yODM1X2NoYW4geworCXN0cnVjdCB2aXJ0X2RtYV9jaGFuIHZjOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnCWNmZzsKKwlib29sIGN5Y2xpYzsKKwl1bnNpZ25lZCBpbnQgZHJlcTsKKworCWludCBjaDsKKwlzdHJ1Y3QgYmNtMjgzNV9kZXNjICpkZXNjOworCisJdm9pZCBfX2lvbWVtICpjaGFuX2Jhc2U7CisJaW50IGlycV9udW1iZXI7Cit9OworCitzdHJ1Y3QgYmNtMjgzNV9kZXNjIHsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyB2ZDsKKwllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOworCisJdW5zaWduZWQgaW50IGNvbnRyb2xfYmxvY2tfc2l6ZTsKKwlzdHJ1Y3QgYmNtMjgzNV9kbWFfY2IgKmNvbnRyb2xfYmxvY2tfYmFzZTsKKwlkbWFfYWRkcl90IGNvbnRyb2xfYmxvY2tfYmFzZV9waHlzOworCisJdW5zaWduZWQgaW50IGZyYW1lczsKKwlzaXplX3Qgc2l6ZTsKK307CisKKyNkZWZpbmUgQkNNMjgzNV9ETUFfQ1MJCTB4MDAKKyNkZWZpbmUgQkNNMjgzNV9ETUFfQUREUgkweDA0CisjZGVmaW5lIEJDTTI4MzVfRE1BX1NPVVJDRV9BRAkweDBjCisjZGVmaW5lIEJDTTI4MzVfRE1BX0RFU1RfQUQJMHgxMAorI2RlZmluZSBCQ00yODM1X0RNQV9ORVhUQ0IJMHgxQworCisvKiBETUEgQ1MgQ29udHJvbCBhbmQgU3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgQkNNMjgzNV9ETUFfQUNUSVZFCUJJVCgwKQorI2RlZmluZSBCQ00yODM1X0RNQV9JTlQJQklUKDIpCisjZGVmaW5lIEJDTTI4MzVfRE1BX0lTUEFVU0VECUJJVCg0KSAgLyogUGF1c2UgcmVxdWVzdGVkIG9yIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgQkNNMjgzNV9ETUFfSVNIRUxECUJJVCg1KSAgLyogSXMgaGVsZCBieSBEUkVRIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBCQ00yODM1X0RNQV9FUlIJQklUKDgpCisjZGVmaW5lIEJDTTI4MzVfRE1BX0FCT1JUCUJJVCgzMCkgLyogU3RvcCBjdXJyZW50IENCLCBnbyB0byBuZXh0LCBXTyAqLworI2RlZmluZSBCQ00yODM1X0RNQV9SRVNFVAlCSVQoMzEpIC8qIFdPLCBzZWxmIGNsZWFyaW5nICovCisKKyNkZWZpbmUgQkNNMjgzNV9ETUFfSU5UX0VOCUJJVCgwKQorI2RlZmluZSBCQ00yODM1X0RNQV9EX0lOQwlCSVQoNCkKKyNkZWZpbmUgQkNNMjgzNV9ETUFfRF9EUkVRCUJJVCg2KQorI2RlZmluZSBCQ00yODM1X0RNQV9TX0lOQwlCSVQoOCkKKyNkZWZpbmUgQkNNMjgzNV9ETUFfU19EUkVRCUJJVCgxMCkKKworI2RlZmluZSBCQ00yODM1X0RNQV9QRVJfTUFQKHgpCSgoeCkgPDwgMTYpCisKKyNkZWZpbmUgQkNNMjgzNV9ETUFfREFUQV9UWVBFX1M4CTEKKyNkZWZpbmUgQkNNMjgzNV9ETUFfREFUQV9UWVBFX1MxNgkyCisjZGVmaW5lIEJDTTI4MzVfRE1BX0RBVEFfVFlQRV9TMzIJNAorI2RlZmluZSBCQ00yODM1X0RNQV9EQVRBX1RZUEVfUzEyOAkxNgorCisjZGVmaW5lIEJDTTI4MzVfRE1BX0JVTEtfTUFTSwlCSVQoMCkKKyNkZWZpbmUgQkNNMjgzNV9ETUFfRklRX01BU0sJKEJJVCgyKSB8IEJJVCgzKSkKKworLyogVmFsaWQgb25seSBmb3IgY2hhbm5lbHMgMCAtIDE0LCAxNSBoYXMgaXRzIG93biBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQkNNMjgzNV9ETUFfQ0hBTihuKQkoKG4pIDw8IDgpIC8qIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBCQ00yODM1X0RNQV9DSEFOSU8oYmFzZSwgbikgKChiYXNlKSArIEJDTTI4MzVfRE1BX0NIQU4obikpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJjbTI4MzVfZG1hZGV2ICp0b19iY20yODM1X2RtYV9kZXYoc3RydWN0IGRtYV9kZXZpY2UgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgYmNtMjgzNV9kbWFkZXYsIGRkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBiY20yODM1X2NoYW4gKnRvX2JjbTI4MzVfZG1hX2NoYW4oc3RydWN0IGRtYV9jaGFuICpjKQoreworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IGJjbTI4MzVfY2hhbiwgdmMuY2hhbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJjbTI4MzVfZGVzYyAqdG9fYmNtMjgzNV9kbWFfZGVzYygKKwkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0KQoreworCXJldHVybiBjb250YWluZXJfb2YodCwgc3RydWN0IGJjbTI4MzVfZGVzYywgdmQudHgpOworfQorCitzdGF0aWMgdm9pZCBiY20yODM1X2RtYV9kZXNjX2ZyZWUoc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXN0cnVjdCBiY20yODM1X2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2YodmQsIHN0cnVjdCBiY20yODM1X2Rlc2MsIHZkKTsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXNjLT52ZC50eC5jaGFuLT5kZXZpY2UtPmRldiwKKwkJCWRlc2MtPmNvbnRyb2xfYmxvY2tfc2l6ZSwKKwkJCWRlc2MtPmNvbnRyb2xfYmxvY2tfYmFzZSwKKwkJCWRlc2MtPmNvbnRyb2xfYmxvY2tfYmFzZV9waHlzKTsKKwlrZnJlZShkZXNjKTsKK30KKworc3RhdGljIGludCBiY20yODM1X2RtYV9hYm9ydCh2b2lkIF9faW9tZW0gKmNoYW5fYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNzOworCWxvbmcgaW50IHRpbWVvdXQgPSAxMDAwMDsKKworCWNzID0gcmVhZGwoY2hhbl9iYXNlICsgQkNNMjgzNV9ETUFfQ1MpOworCWlmICghKGNzICYgQkNNMjgzNV9ETUFfQUNUSVZFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBXcml0ZSAwIHRvIHRoZSBhY3RpdmUgYml0IC0gUGF1c2UgdGhlIERNQSAqLworCXdyaXRlbCgwLCBjaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUyk7CisKKwkvKiBXYWl0IGZvciBhbnkgY3VycmVudCBBWEkgdHJhbnNmZXIgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoKGNzICYgQkNNMjgzNV9ETUFfSVNQQVVTRUQpICYmIC0tdGltZW91dCkgeworCQljcHVfcmVsYXgoKTsKKwkJY3MgPSByZWFkbChjaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUyk7CisJfQorCisJLyogV2UnbGwgdW4tcGF1c2Ugd2hlbiB3ZSBzZXQgb2Ygb3VyIG5leHQgRE1BICovCisJaWYgKCF0aW1lb3V0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCWlmICghKGNzICYgQkNNMjgzNV9ETUFfQUNUSVZFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUZXJtaW5hdGUgdGhlIGNvbnRyb2wgYmxvY2sgY2hhaW4gKi8KKwl3cml0ZWwoMCwgY2hhbl9iYXNlICsgQkNNMjgzNV9ETUFfTkVYVENCKTsKKworCS8qIEFib3J0IHRoZSB3aG9sZSBETUEgKi8KKwl3cml0ZWwoQkNNMjgzNV9ETUFfQUJPUlQgfCBCQ00yODM1X0RNQV9BQ1RJVkUsCisJICAgICAgIGNoYW5fYmFzZSArIEJDTTI4MzVfRE1BX0NTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY20yODM1X2RtYV9zdGFydF9kZXNjKHN0cnVjdCBiY20yODM1X2NoYW4gKmMpCit7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkID0gdmNoYW5fbmV4dF9kZXNjKCZjLT52Yyk7CisJc3RydWN0IGJjbTI4MzVfZGVzYyAqZDsKKworCWlmICghdmQpIHsKKwkJYy0+ZGVzYyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbCgmdmQtPm5vZGUpOworCisJYy0+ZGVzYyA9IGQgPSB0b19iY20yODM1X2RtYV9kZXNjKCZ2ZC0+dHgpOworCisJd3JpdGVsKGQtPmNvbnRyb2xfYmxvY2tfYmFzZV9waHlzLCBjLT5jaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9BRERSKTsKKwl3cml0ZWwoQkNNMjgzNV9ETUFfQUNUSVZFLCBjLT5jaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiY20yODM1X2RtYV9jYWxsYmFjayhpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiY20yODM1X2NoYW4gKmMgPSBkYXRhOworCXN0cnVjdCBiY20yODM1X2Rlc2MgKmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoQkNNMjgzNV9ETUFfSU5ULCBjLT5jaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUyk7CisKKwlkID0gYy0+ZGVzYzsKKworCWlmIChkKSB7CisJCS8qIFRPRE8gT25seSB3b3JrcyBmb3IgY3ljbGljIERNQSAqLworCQl2Y2hhbl9jeWNsaWNfY2FsbGJhY2soJmQtPnZkKTsKKwl9CisKKwkvKiBLZWVwIHRoZSBETUEgZW5naW5lIHJ1bm5pbmcgKi8KKwl3cml0ZWwoQkNNMjgzNV9ETUFfQUNUSVZFLCBjLT5jaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBiY20yODM1X2NoYW4gKmMgPSB0b19iY20yODM1X2RtYV9jaGFuKGNoYW4pOworCisJZGV2X2RiZyhjLT52Yy5jaGFuLmRldmljZS0+ZGV2LAorCQkJIkFsbG9jYXRpbmcgRE1BIGNoYW5uZWwgJWRcbiIsIGMtPmNoKTsKKworCXJldHVybiByZXF1ZXN0X2lycShjLT5pcnFfbnVtYmVyLAorCQkJYmNtMjgzNV9kbWFfY2FsbGJhY2ssIDAsICJETUEgSVJRIiwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBiY20yODM1X2NoYW4gKmMgPSB0b19iY20yODM1X2RtYV9jaGFuKGNoYW4pOworCisJdmNoYW5fZnJlZV9jaGFuX3Jlc291cmNlcygmYy0+dmMpOworCWZyZWVfaXJxKGMtPmlycV9udW1iZXIsIGMpOworCisJZGV2X2RiZyhjLT52Yy5jaGFuLmRldmljZS0+ZGV2LCAiRnJlZWluZyBETUEgY2hhbm5lbCAldVxuIiwgYy0+Y2gpOworfQorCitzdGF0aWMgc2l6ZV90IGJjbTI4MzVfZG1hX2Rlc2Nfc2l6ZShzdHJ1Y3QgYmNtMjgzNV9kZXNjICpkKQoreworCXJldHVybiBkLT5zaXplOworfQorCitzdGF0aWMgc2l6ZV90IGJjbTI4MzVfZG1hX2Rlc2Nfc2l6ZV9wb3Moc3RydWN0IGJjbTI4MzVfZGVzYyAqZCwgZG1hX2FkZHJfdCBhZGRyKQoreworCXVuc2lnbmVkIGludCBpOworCXNpemVfdCBzaXplOworCisJZm9yIChzaXplID0gaSA9IDA7IGkgPCBkLT5mcmFtZXM7IGkrKykgeworCQlzdHJ1Y3QgYmNtMjgzNV9kbWFfY2IgKmNvbnRyb2xfYmxvY2sgPQorCQkJJmQtPmNvbnRyb2xfYmxvY2tfYmFzZVtpXTsKKwkJc2l6ZV90IHRoaXNfc2l6ZSA9IGNvbnRyb2xfYmxvY2stPmxlbmd0aDsKKwkJZG1hX2FkZHJfdCBkbWE7CisKKwkJaWYgKGQtPmRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJCWRtYSA9IGNvbnRyb2xfYmxvY2stPmRzdDsKKwkJZWxzZQorCQkJZG1hID0gY29udHJvbF9ibG9jay0+c3JjOworCisJCWlmIChzaXplKQorCQkJc2l6ZSArPSB0aGlzX3NpemU7CisJCWVsc2UgaWYgKGFkZHIgPj0gZG1hICYmIGFkZHIgPCBkbWEgKyB0aGlzX3NpemUpCisJCQlzaXplICs9IGRtYSArIHRoaXNfc2l6ZSAtIGFkZHI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMgYmNtMjgzNV9kbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwlkbWFfY29va2llX3QgY29va2llLCBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQoreworCXN0cnVjdCBiY20yODM1X2NoYW4gKmMgPSB0b19iY20yODM1X2RtYV9jaGFuKGNoYW4pOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKKwllbnVtIGRtYV9zdGF0dXMgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZXQgPSBkbWFfY29va2llX3N0YXR1cyhjaGFuLCBjb29raWUsIHR4c3RhdGUpOworCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFIHx8ICF0eHN0YXRlKQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwl2ZCA9IHZjaGFuX2ZpbmRfZGVzYygmYy0+dmMsIGNvb2tpZSk7CisJaWYgKHZkKSB7CisJCXR4c3RhdGUtPnJlc2lkdWUgPQorCQkJYmNtMjgzNV9kbWFfZGVzY19zaXplKHRvX2JjbTI4MzVfZG1hX2Rlc2MoJnZkLT50eCkpOworCX0gZWxzZSBpZiAoYy0+ZGVzYyAmJiBjLT5kZXNjLT52ZC50eC5jb29raWUgPT0gY29va2llKSB7CisJCXN0cnVjdCBiY20yODM1X2Rlc2MgKmQgPSBjLT5kZXNjOworCQlkbWFfYWRkcl90IHBvczsKKworCQlpZiAoZC0+ZGlyID09IERNQV9NRU1fVE9fREVWKQorCQkJcG9zID0gcmVhZGwoYy0+Y2hhbl9iYXNlICsgQkNNMjgzNV9ETUFfU09VUkNFX0FEKTsKKwkJZWxzZSBpZiAoZC0+ZGlyID09IERNQV9ERVZfVE9fTUVNKQorCQkJcG9zID0gcmVhZGwoYy0+Y2hhbl9iYXNlICsgQkNNMjgzNV9ETUFfREVTVF9BRCk7CisJCWVsc2UKKwkJCXBvcyA9IDA7CisKKwkJdHhzdGF0ZS0+cmVzaWR1ZSA9IGJjbTI4MzVfZG1hX2Rlc2Nfc2l6ZV9wb3MoZCwgcG9zKTsKKwl9IGVsc2UgeworCQl0eHN0YXRlLT5yZXNpZHVlID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiY20yODM1X2RtYV9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9jaGFuICpjID0gdG9fYmNtMjgzNV9kbWFfY2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYy0+Y3ljbGljID0gdHJ1ZTsgLyogTm90aGluZyBlbHNlIGlzIGltcGxlbWVudGVkICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCWlmICh2Y2hhbl9pc3N1ZV9wZW5kaW5nKCZjLT52YykgJiYgIWMtPmRlc2MpCisJCWJjbTI4MzVfZG1hX3N0YXJ0X2Rlc2MoYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmJjbTI4MzVfZG1hX3ByZXBfZG1hX2N5Y2xpYygKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgYnVmX2FkZHIsIHNpemVfdCBidWZfbGVuLAorCXNpemVfdCBwZXJpb2RfbGVuLCBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyZWN0aW9uLAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGJjbTI4MzVfY2hhbiAqYyA9IHRvX2JjbTI4MzVfZG1hX2NoYW4oY2hhbik7CisJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggZGV2X3dpZHRoOworCXN0cnVjdCBiY20yODM1X2Rlc2MgKmQ7CisJZG1hX2FkZHJfdCBkZXZfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZXMsIHN5bmNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWU7CisKKwkvKiBHcmFiIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoIWlzX3NsYXZlX2RpcmVjdGlvbihkaXJlY3Rpb24pKSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogYmFkIGRpcmVjdGlvbj9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSkgeworCQlkZXZfYWRkciA9IGMtPmNmZy5zcmNfYWRkcjsKKwkJZGV2X3dpZHRoID0gYy0+Y2ZnLnNyY19hZGRyX3dpZHRoOworCQlzeW5jX3R5cGUgPSBCQ00yODM1X0RNQV9TX0RSRVE7CisJfSBlbHNlIHsKKwkJZGV2X2FkZHIgPSBjLT5jZmcuZHN0X2FkZHI7CisJCWRldl93aWR0aCA9IGMtPmNmZy5kc3RfYWRkcl93aWR0aDsKKwkJc3luY190eXBlID0gQkNNMjgzNV9ETUFfRF9EUkVROworCX0KKworCS8qIEJ1cyB3aWR0aCB0cmFuc2xhdGVzIHRvIHRoZSBlbGVtZW50IHNpemUgKEVTKSAqLworCXN3aXRjaCAoZGV2X3dpZHRoKSB7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKKwkJZXMgPSBCQ00yODM1X0RNQV9EQVRBX1RZUEVfUzMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBOb3cgYWxsb2NhdGUgYW5kIHNldHVwIHRoZSBkZXNjcmlwdG9yLiAqLworCWQgPSBremFsbG9jKHNpemVvZigqZCksIEdGUF9OT1dBSVQpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkLT5kaXIgPSBkaXJlY3Rpb247CisJZC0+ZnJhbWVzID0gYnVmX2xlbiAvIHBlcmlvZF9sZW47CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2tzICovCisJZC0+Y29udHJvbF9ibG9ja19zaXplID0gZC0+ZnJhbWVzICogc2l6ZW9mKHN0cnVjdCBiY20yODM1X2RtYV9jYik7CisJZC0+Y29udHJvbF9ibG9ja19iYXNlID0gZG1hX3phbGxvY19jb2hlcmVudChjaGFuLT5kZXZpY2UtPmRldiwKKwkJCWQtPmNvbnRyb2xfYmxvY2tfc2l6ZSwgJmQtPmNvbnRyb2xfYmxvY2tfYmFzZV9waHlzLAorCQkJR0ZQX05PV0FJVCk7CisKKwlpZiAoIWQtPmNvbnRyb2xfYmxvY2tfYmFzZSkgeworCQlrZnJlZShkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcywgY3JlYXRlIGEgY29udHJvbCBibG9jaworCSAqIGZvciBlYWNoIGZyYW1lIGFuZCBsaW5rIHRoZW0gdG9nZXRoZXIuCisJICovCisJZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgZC0+ZnJhbWVzOyBmcmFtZSsrKSB7CisJCXN0cnVjdCBiY20yODM1X2RtYV9jYiAqY29udHJvbF9ibG9jayA9CisJCQkmZC0+Y29udHJvbF9ibG9ja19iYXNlW2ZyYW1lXTsKKworCQkvKiBTZXR1cCBhZHJlc3NlcyAqLworCQlpZiAoZC0+ZGlyID09IERNQV9ERVZfVE9fTUVNKSB7CisJCQljb250cm9sX2Jsb2NrLT5pbmZvID0gQkNNMjgzNV9ETUFfRF9JTkM7CisJCQljb250cm9sX2Jsb2NrLT5zcmMgPSBkZXZfYWRkcjsKKwkJCWNvbnRyb2xfYmxvY2stPmRzdCA9IGJ1Zl9hZGRyICsgZnJhbWUgKiBwZXJpb2RfbGVuOworCQl9IGVsc2UgeworCQkJY29udHJvbF9ibG9jay0+aW5mbyA9IEJDTTI4MzVfRE1BX1NfSU5DOworCQkJY29udHJvbF9ibG9jay0+c3JjID0gYnVmX2FkZHIgKyBmcmFtZSAqIHBlcmlvZF9sZW47CisJCQljb250cm9sX2Jsb2NrLT5kc3QgPSBkZXZfYWRkcjsKKwkJfQorCisJCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJY29udHJvbF9ibG9jay0+aW5mbyB8PSBCQ00yODM1X0RNQV9JTlRfRU47CisKKwkJLyogU2V0dXAgc3luY2hyb25pemF0aW9uICovCisJCWlmIChzeW5jX3R5cGUgIT0gMCkKKwkJCWNvbnRyb2xfYmxvY2stPmluZm8gfD0gc3luY190eXBlOworCisJCS8qIFNldHVwIERSRVEgY2hhbm5lbCAqLworCQlpZiAoYy0+ZHJlcSAhPSAwKQorCQkJY29udHJvbF9ibG9jay0+aW5mbyB8PQorCQkJCUJDTTI4MzVfRE1BX1BFUl9NQVAoYy0+ZHJlcSk7CisKKwkJLyogTGVuZ3RoIG9mIGEgZnJhbWUgKi8KKwkJY29udHJvbF9ibG9jay0+bGVuZ3RoID0gcGVyaW9kX2xlbjsKKwkJZC0+c2l6ZSArPSBjb250cm9sX2Jsb2NrLT5sZW5ndGg7CisKKwkJLyoKKwkJICogTmV4dCBibG9jayBpcyB0aGUgbmV4dCBmcmFtZS4KKwkJICogVGhpcyBETUEgZW5naW5lIGRyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBjeWNsaWMgRE1BLgorCQkgKiBUaGVyZWZvcmUsIHdyYXAgYXJvdW5kIGF0IG51bWJlciBvZiBmcmFtZXMuCisJCSAqLworCQljb250cm9sX2Jsb2NrLT5uZXh0ID0gZC0+Y29udHJvbF9ibG9ja19iYXNlX3BoeXMgKworCQkJc2l6ZW9mKHN0cnVjdCBiY20yODM1X2RtYV9jYikKKwkJCSogKChmcmFtZSArIDEpICUgZC0+ZnJhbWVzKTsKKwl9CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmYy0+dmMsICZkLT52ZCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfZG1hX3NsYXZlX2NvbmZpZyhzdHJ1Y3QgYmNtMjgzNV9jaGFuICpjLAorCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQoreworCWlmICgoY2ZnLT5kaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19NRU0gJiYKKwkgICAgIGNmZy0+c3JjX2FkZHJfd2lkdGggIT0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVMpIHx8CisJICAgIChjZmctPmRpcmVjdGlvbiA9PSBETUFfTUVNX1RPX0RFViAmJgorCSAgICAgY2ZnLT5kc3RfYWRkcl93aWR0aCAhPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUykgfHwKKwkgICAgIWlzX3NsYXZlX2RpcmVjdGlvbihjZmctPmRpcmVjdGlvbikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYy0+Y2ZnID0gKmNmZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGJjbTI4MzVfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9kbWFkZXYgKmQgPSB0b19iY20yODM1X2RtYV9kZXYoYy0+dmMuY2hhbi5kZXZpY2UpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWVvdXQgPSAxMDAwMDsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCisJLyogUHJldmVudCB0aGlzIGNoYW5uZWwgYmVpbmcgc2NoZWR1bGVkICovCisJc3Bpbl9sb2NrKCZkLT5sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZjLT5ub2RlKTsKKwlzcGluX3VubG9jaygmZC0+bG9jayk7CisKKwkvKgorCSAqIFN0b3AgRE1BIGFjdGl2aXR5OiB3ZSBhc3N1bWUgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZAorCSAqIGFmdGVyIGJjbV9kbWFfYWJvcnQoKSByZXR1cm5zIChldmVuIGlmIGl0IGRvZXMsIGl0IHdpbGwgc2VlCisJICogYy0+ZGVzYyBpcyBOVUxMIGFuZCBleGl0LikKKwkgKi8KKwlpZiAoYy0+ZGVzYykgeworCQljLT5kZXNjID0gTlVMTDsKKwkJYmNtMjgzNV9kbWFfYWJvcnQoYy0+Y2hhbl9iYXNlKTsKKworCQkvKiBXYWl0IGZvciBzdG9wcGluZyAqLworCQl3aGlsZSAoLS10aW1lb3V0KSB7CisJCQlpZiAoIShyZWFkbChjLT5jaGFuX2Jhc2UgKyBCQ00yODM1X0RNQV9DUykgJgorCQkJCQkJQkNNMjgzNV9ETUFfQUNUSVZFKSkKKwkJCQlicmVhazsKKworCQkJY3B1X3JlbGF4KCk7CisJCX0KKworCQlpZiAoIXRpbWVvdXQpCisJCQlkZXZfZXJyKGQtPmRkZXYuZGV2LCAiRE1BIHRyYW5zZmVyIGNvdWxkIG5vdCBiZSB0ZXJtaW5hdGVkXG4iKTsKKwl9CisKKwl2Y2hhbl9nZXRfYWxsX2Rlc2NyaXB0b3JzKCZjLT52YywgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QoJmMtPnZjLCAmaGVhZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yODM1X2RtYV9jb250cm9sKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfY3RybF9jbWQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBiY20yODM1X2NoYW4gKmMgPSB0b19iY20yODM1X2RtYV9jaGFuKGNoYW4pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERNQV9TTEFWRV9DT05GSUc6CisJCXJldHVybiBiY20yODM1X2RtYV9zbGF2ZV9jb25maWcoYywKKwkJCQkoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKilhcmcpOworCisJY2FzZSBETUFfVEVSTUlOQVRFX0FMTDoKKwkJcmV0dXJuIGJjbTI4MzVfZG1hX3Rlcm1pbmF0ZV9hbGwoYyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KK30KKworc3RhdGljIGludCBiY20yODM1X2RtYV9jaGFuX2luaXQoc3RydWN0IGJjbTI4MzVfZG1hZGV2ICpkLCBpbnQgY2hhbl9pZCwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9jaGFuICpjOworCisJYyA9IGRldm1fa3phbGxvYyhkLT5kZGV2LmRldiwgc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWMtPnZjLmRlc2NfZnJlZSA9IGJjbTI4MzVfZG1hX2Rlc2NfZnJlZTsKKwl2Y2hhbl9pbml0KCZjLT52YywgJmQtPmRkZXYpOworCUlOSVRfTElTVF9IRUFEKCZjLT5ub2RlKTsKKworCWQtPmRkZXYuY2hhbmNudCsrOworCisJYy0+Y2hhbl9iYXNlID0gQkNNMjgzNV9ETUFfQ0hBTklPKGQtPmJhc2UsIGNoYW5faWQpOworCWMtPmNoID0gY2hhbl9pZDsKKwljLT5pcnFfbnVtYmVyID0gaXJxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfZG1hX2ZyZWUoc3RydWN0IGJjbTI4MzVfZG1hZGV2ICpvZCkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9jaGFuICpjLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCBuZXh0LCAmb2QtPmRkZXYuY2hhbm5lbHMsCisJCQkJIHZjLmNoYW4uZGV2aWNlX25vZGUpIHsKKwkJbGlzdF9kZWwoJmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOworCQl0YXNrbGV0X2tpbGwoJmMtPnZjLnRhc2spOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtMjgzNV9kbWFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtMjgzNS1kbWEiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbTI4MzVfZG1hX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqYmNtMjgzNV9kbWFfeGxhdGUoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3BlYywKKwkJCQkJICAgc3RydWN0IG9mX2RtYSAqb2ZkbWEpCit7CisJc3RydWN0IGJjbTI4MzVfZG1hZGV2ICpkID0gb2ZkbWEtPm9mX2RtYV9kYXRhOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKworCWNoYW4gPSBkbWFfZ2V0X2FueV9zbGF2ZV9jaGFubmVsKCZkLT5kZGV2KTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJLyogU2V0IERSRVEgZnJvbSBwYXJhbSAqLworCXRvX2JjbTI4MzVfZG1hX2NoYW4oY2hhbiktPmRyZXEgPSBzcGVjLT5hcmdzWzBdOworCisJcmV0dXJuIGNoYW47Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9kbWFfZGV2aWNlX3NsYXZlX2NhcHMoc3RydWN0IGRtYV9jaGFuICpkY2hhbiwKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NhcHMgKmNhcHMpCit7CisJY2Fwcy0+c3JjX2FkZHJfd2lkdGhzID0gQklUKERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKTsKKwljYXBzLT5kc3RuX2FkZHJfd2lkdGhzID0gQklUKERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKTsKKwljYXBzLT5kaXJlY3Rpb25zID0gQklUKERNQV9ERVZfVE9fTUVNKSB8IEJJVChETUFfTUVNX1RPX0RFVik7CisJY2Fwcy0+Y21kX3BhdXNlID0gZmFsc2U7CisJY2Fwcy0+Y21kX3Rlcm1pbmF0ZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yODM1X2RtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY20yODM1X2RtYWRldiAqb2Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByYzsKKwlpbnQgaTsKKwlpbnQgaXJxOworCXVpbnQzMl90IGNoYW5zX2F2YWlsYWJsZTsKKworCWlmICghcGRldi0+ZGV2LmRtYV9tYXNrKQorCQlwZGV2LT5kZXYuZG1hX21hc2sgPSAmcGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrOworCisJcmMgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJb2QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpvZCksIEdGUF9LRVJORUwpOworCWlmICghb2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRldi0+ZGV2LmRtYV9wYXJtcyA9ICZvZC0+ZG1hX3Bhcm1zOworCWRtYV9zZXRfbWF4X3NlZ19zaXplKCZwZGV2LT5kZXYsIDB4M0ZGRkZGRkYpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisKKwlvZC0+YmFzZSA9IGJhc2U7CisKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIG9kLT5kZGV2LmNhcF9tYXNrKTsKKwlkbWFfY2FwX3NldChETUFfUFJJVkFURSwgb2QtPmRkZXYuY2FwX21hc2spOworCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMsIG9kLT5kZGV2LmNhcF9tYXNrKTsKKwlvZC0+ZGRldi5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSBiY20yODM1X2RtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwlvZC0+ZGRldi5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9IGJjbTI4MzVfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJb2QtPmRkZXYuZGV2aWNlX3R4X3N0YXR1cyA9IGJjbTI4MzVfZG1hX3R4X3N0YXR1czsKKwlvZC0+ZGRldi5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGJjbTI4MzVfZG1hX2lzc3VlX3BlbmRpbmc7CisJb2QtPmRkZXYuZGV2aWNlX3NsYXZlX2NhcHMgPSBiY20yODM1X2RtYV9kZXZpY2Vfc2xhdmVfY2FwczsKKwlvZC0+ZGRldi5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gYmNtMjgzNV9kbWFfcHJlcF9kbWFfY3ljbGljOworCW9kLT5kZGV2LmRldmljZV9jb250cm9sID0gYmNtMjgzNV9kbWFfY29udHJvbDsKKwlvZC0+ZGRldi5kZXYgPSAmcGRldi0+ZGV2OworCUlOSVRfTElTVF9IRUFEKCZvZC0+ZGRldi5jaGFubmVscyk7CisJc3Bpbl9sb2NrX2luaXQoJm9kLT5sb2NrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG9kKTsKKworCS8qIFJlcXVlc3QgRE1BIGNoYW5uZWwgbWFzayBmcm9tIGRldmljZSB0cmVlICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJImJyY20sZG1hLWNoYW5uZWwtbWFzayIsCisJCQkmY2hhbnNfYXZhaWxhYmxlKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgbWFza1xuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfbm9fZG1hOworCX0KKworCS8qCisJICogRG8gbm90IHVzZSB0aGUgRklRIGFuZCBCVUxLIGNoYW5uZWxzLAorCSAqIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBieSB0aGUgR1BVLgorCSAqLworCWNoYW5zX2F2YWlsYWJsZSAmPSB+KEJDTTI4MzVfRE1BX0ZJUV9NQVNLIHwgQkNNMjgzNV9ETUFfQlVMS19NQVNLKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGV2LT5udW1fcmVzb3VyY2VzOyBpKyspIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKKwkJaWYgKGlycSA8IDApCisJCQlicmVhazsKKworCQlpZiAoY2hhbnNfYXZhaWxhYmxlICYgKDEgPDwgaSkpIHsKKwkJCXJjID0gYmNtMjgzNV9kbWFfY2hhbl9pbml0KG9kLCBpLCBpcnEpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZXJyX25vX2RtYTsKKwkJfQorCX0KKworCWRldl9kYmcoJnBkZXYtPmRldiwgIkluaXRpYWxpemVkICVpIERNQSBjaGFubmVsc1xuIiwgaSk7CisKKwkvKiBEZXZpY2UtdHJlZSBETUEgY29udHJvbGxlciByZWdpc3RyYXRpb24gKi8KKwlyYyA9IG9mX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJYmNtMjgzNV9kbWFfeGxhdGUsIG9kKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIERNQSBjb250cm9sbGVyXG4iKTsKKwkJZ290byBlcnJfbm9fZG1hOworCX0KKworCXJjID0gZG1hX2FzeW5jX2RldmljZV9yZWdpc3Rlcigmb2QtPmRkZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHNsYXZlIERNQSBlbmdpbmUgZGV2aWNlOiAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9ub19kbWE7CisJfQorCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiTG9hZCBCQ00yODM1IERNQSBlbmdpbmUgZHJpdmVyXG4iKTsKKworCXJldHVybiAwOworCitlcnJfbm9fZG1hOgorCWJjbTI4MzVfZG1hX2ZyZWUob2QpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBiY20yODM1X2RtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9kbWFkZXYgKm9kID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJm9kLT5kZGV2KTsKKwliY20yODM1X2RtYV9mcmVlKG9kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY20yODM1X2RtYV9kcml2ZXIgPSB7CisJLnByb2JlCT0gYmNtMjgzNV9kbWFfcHJvYmUsCisJLnJlbW92ZQk9IGJjbTI4MzVfZG1hX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiY20yODM1LWRtYSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYmNtMjgzNV9kbWFfb2ZfbWF0Y2gpLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbTI4MzVfZG1hX2RyaXZlcik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmNtMjgzNS1kbWEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQkNNMjgzNSBETUEgZW5naW5lIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRmxvcmlhbiBNZWllciA8Zmxvcmlhbi5tZWllckBrb2Fsby5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NwcGk0MS5jIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKaW5kZXggYzI5ZGFjZi4uYzE4YWViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY3BwaTQxLmMKKysrIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKQEAgLTk3Miw4ICs5NzIsMTAgQEAKIAkJZ290byBlcnJfY2hhbnM7CiAKIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPm9mX25vZGUsIDApOwotCWlmICghaXJxKQorCWlmICghaXJxKSB7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2lycTsKKwl9CiAKIAljcHBpX3dyaXRlbChVU0JTU19JUlFfUERfQ09NUCwgY2RkLT51c2Jzc19tZW0gKyBVU0JTU19JUlFfRU5BQkxFUik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwppbmRleCA5ZGZjYWY1Li4wNWI2ZGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKKysrIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCkBAIC0zMSw3ICszMSw3IEBACiAJCVNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbCwgIkJ1cyBJRCBvZiB0aGUgY2hhbm5lbCB0byB0ZXN0IChkZWZhdWx0OiBhbnkpIik7CiAKLXN0YXRpYyBjaGFyIHRlc3RfZGV2aWNlWzIwXTsKK3N0YXRpYyBjaGFyIHRlc3RfZGV2aWNlWzMyXTsKIG1vZHVsZV9wYXJhbV9zdHJpbmcoZGV2aWNlLCB0ZXN0X2RldmljZSwgc2l6ZW9mKHRlc3RfZGV2aWNlKSwKIAkJU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZXZpY2UsICJCdXMgSUQgb2YgdGhlIERNQSBFbmdpbmUgdG8gdGVzdCAoZGVmYXVsdDogYW55KSIpOwpAQCAtODksNyArODksNyBAQAogc3RydWN0IGRtYXRlc3RfcGFyYW1zIHsKIAl1bnNpZ25lZCBpbnQJYnVmX3NpemU7CiAJY2hhcgkJY2hhbm5lbFsyMF07Ci0JY2hhcgkJZGV2aWNlWzIwXTsKKwljaGFyCQlkZXZpY2VbMzJdOwogCXVuc2lnbmVkIGludAl0aHJlYWRzX3Blcl9jaGFuOwogCXVuc2lnbmVkIGludAltYXhfY2hhbm5lbHM7CiAJdW5zaWduZWQgaW50CWl0ZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kdy9jb3JlLmMgYi9kcml2ZXJzL2RtYS9kdy9jb3JlLmMKaW5kZXggNzUxNmJlNC4uMTNhYzNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZHcvY29yZS5jCisrKyBiL2RyaXZlcnMvZG1hL2R3L2NvcmUuYwpAQCAtMjE4LDggKzIxOCwxMCBAQAogCXN0cnVjdCBkd19kbWEJKmR3ID0gdG9fZHdfZG1hKGR3Yy0+Y2hhbi5kZXZpY2UpOwogCXUzMgkJY3RsbG87CiAKLQkvKiBTb2Z0d2FyZSBlbXVsYXRpb24gb2YgTExQIG1vZGUgcmVsaWVzIG9uIGludGVycnVwdHMgdG8gY29udGludWUKLQkgKiBtdWx0aSBibG9jayB0cmFuc2Zlci4gKi8KKwkvKgorCSAqIFNvZnR3YXJlIGVtdWxhdGlvbiBvZiBMTFAgbW9kZSByZWxpZXMgb24gaW50ZXJydXB0cyB0byBjb250aW51ZQorCSAqIG11bHRpIGJsb2NrIHRyYW5zZmVyLgorCSAqLwogCWN0bGxvID0gZGVzYy0+bGxpLmN0bGxvIHwgRFdDX0NUTExfSU5UX0VOOwogCiAJY2hhbm5lbF93cml0ZWwoZHdjLCBTQVIsIGRlc2MtPmxsaS5zYXIpOwpAQCAtMjUzLDggKzI1NSw3IEBACiAJCQkJCQkmZHdjLT5mbGFncyk7CiAJCWlmICh3YXNfc29mdF9sbHApIHsKIAkJCWRldl9lcnIoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCi0JCQkJIkJVRzogQXR0ZW1wdGVkIHRvIHN0YXJ0IG5ldyBMTFAgdHJhbnNmZXIgIgotCQkJCSJpbnNpZGUgb25nb2luZyBvbmVcbiIpOworCQkJCSJCVUc6IEF0dGVtcHRlZCB0byBzdGFydCBuZXcgTExQIHRyYW5zZmVyIGluc2lkZSBvbmdvaW5nIG9uZVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNDIwLDggKzQyMSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlkZXZfdmRiZyhjaGFuMmRldigmZHdjLT5jaGFuKSwgIiVzOiBsbHA9MHglbGx4XG4iLCBfX2Z1bmNfXywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGxwKTsKKwlkZXZfdmRiZyhjaGFuMmRldigmZHdjLT5jaGFuKSwgIiVzOiBsbHA9JXBhZFxuIiwgX19mdW5jX18sICZsbHApOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmZHdjLT5hY3RpdmVfbGlzdCwgZGVzY19ub2RlKSB7CiAJCS8qIEluaXRpYWwgcmVzaWR1ZSB2YWx1ZSAqLwpAQCAtNTY3LDkgKzU2Nyw5IEBACiAJCQl1bmxpa2VseShzdGF0dXNfeGZlciAmIGR3Yy0+bWFzaykpIHsKIAkJaW50IGk7CiAKLQkJZGV2X2VycihjaGFuMmRldigmZHdjLT5jaGFuKSwgImN5Y2xpYyBETUEgdW5leHBlY3RlZCAlcyAiCi0JCQkJImludGVycnVwdCwgc3RvcHBpbmcgRE1BIHRyYW5zZmVyXG4iLAotCQkJCXN0YXR1c194ZmVyID8gInhmZXIiIDogImVycm9yIik7CisJCWRldl9lcnIoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCisJCQkiY3ljbGljIERNQSB1bmV4cGVjdGVkICVzIGludGVycnVwdCwgc3RvcHBpbmcgRE1BIHRyYW5zZmVyXG4iLAorCQkJc3RhdHVzX3hmZXIgPyAieGZlciIgOiAiZXJyb3IiKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTcxMSw5ICs3MTEsOCBAQAogCXUzMgkJCWN0bGxvOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksCi0JCQkiJXM6IGQweCVsbHggczB4JWxseCBsMHglenggZjB4JWx4XG4iLCBfX2Z1bmNfXywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVzdCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzcmMsCi0JCQlsZW4sIGZsYWdzKTsKKwkJCSIlczogZCVwYWQgcyVwYWQgbDB4JXp4IGYweCVseFxuIiwgX19mdW5jX18sCisJCQkmZGVzdCwgJnNyYywgbGVuLCBmbGFncyk7CiAKIAlpZiAodW5saWtlbHkoIWxlbikpIHsKIAkJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgIiVzOiBsZW5ndGggaXMgemVybyFcbiIsIF9fZnVuY19fKTsKQEAgLTE0MDEsOSArMTQwMCw5IEBACiAJLyogTGV0J3MgbWFrZSBhIGN5Y2xpYyBsaXN0ICovCiAJbGFzdC0+bGxpLmxscCA9IGNkZXNjLT5kZXNjWzBdLT50eGQucGh5czsKIAotCWRldl9kYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJjeWNsaWMgcHJlcGFyZWQgYnVmIDB4JWxseCBsZW4gJXp1ICIKLQkJCSJwZXJpb2QgJXp1IHBlcmlvZHMgJWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYnVmX2FkZHIsCi0JCQlidWZfbGVuLCBwZXJpb2RfbGVuLCBwZXJpb2RzKTsKKwlkZXZfZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAorCQkJImN5Y2xpYyBwcmVwYXJlZCBidWYgJXBhZCBsZW4gJXp1IHBlcmlvZCAlenUgcGVyaW9kcyAlZFxuIiwKKwkJCSZidWZfYWRkciwgYnVmX2xlbiwgcGVyaW9kX2xlbiwgcGVyaW9kcyk7CiAKIAljZGVzYy0+cGVyaW9kcyA9IHBlcmlvZHM7CiAJZHdjLT5jZGVzYyA9IGNkZXNjOwpAQCAtMTYwMyw5ICsxNjAyLDExIEBACiAJCQlkZXZfZGJnKGNoaXAtPmRldiwgIkRXQ19QQVJBTVNbJWRdOiAweCUwOHhcbiIsIGksCiAJCQkJCSAgIGR3Y19wYXJhbXMpOwogCi0JCQkvKiBEZWNvZGUgbWF4aW11bSBibG9jayBzaXplIGZvciBnaXZlbiBjaGFubmVsLiBUaGUKKwkJCS8qCisJCQkgKiBEZWNvZGUgbWF4aW11bSBibG9jayBzaXplIGZvciBnaXZlbiBjaGFubmVsLiBUaGUKIAkJCSAqIHN0b3JlZCA0IGJpdCB2YWx1ZSByZXByZXNlbnRzIGJsb2NrcyBmcm9tIDB4MDAgZm9yIDMKLQkJCSAqIHVwIHRvIDB4MGEgZm9yIDQwOTUuICovCisJCQkgKiB1cCB0byAweDBhIGZvciA0MDk1LgorCQkJICovCiAJCQlkd2MtPmJsb2NrX3NpemUgPQogCQkJCSg0IDw8ICgobWF4X2Jsa19zaXplID4+IDQgKiBpKSAmIDB4ZikpIC0gMTsKIAkJCWR3Yy0+bm9sbHAgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZWRtYS5jIGIvZHJpdmVycy9kbWEvZWRtYS5jCmluZGV4IDI1MzllYTAuLmNkOGRhNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2VkbWEuYworKysgYi9kcml2ZXJzL2RtYS9lZG1hLmMKQEAgLTY5OSw4ICs2OTksOCBAQAogCWVjaGFuLT5hbGxvY2VkID0gdHJ1ZTsKIAllY2hhbi0+c2xvdFswXSA9IGVjaGFuLT5jaF9udW07CiAKLQlkZXZfaW5mbyhkZXYsICJhbGxvY2F0ZWQgY2hhbm5lbCBmb3IgJXU6JXVcbiIsCi0JCSBFRE1BX0NUTFIoZWNoYW4tPmNoX251bSksIEVETUFfQ0hBTl9TTE9UKGVjaGFuLT5jaF9udW0pKTsKKwlkZXZfZGJnKGRldiwgImFsbG9jYXRlZCBjaGFubmVsIGZvciAldToldVxuIiwKKwkJRURNQV9DVExSKGVjaGFuLT5jaF9udW0pLCBFRE1BX0NIQU5fU0xPVChlY2hhbi0+Y2hfbnVtKSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNzM2LDcgKzczNiw3IEBACiAJCWVjaGFuLT5hbGxvY2VkID0gZmFsc2U7CiAJfQogCi0JZGV2X2luZm8oZGV2LCAiZnJlZWluZyBjaGFubmVsIGZvciAldVxuIiwgZWNoYW4tPmNoX251bSk7CisJZGV2X2RiZyhkZXYsICJmcmVlaW5nIGNoYW5uZWwgZm9yICV1XG4iLCBlY2hhbi0+Y2hfbnVtKTsKIH0KIAogLyogU2VuZCBwZW5kaW5nIGRlc2NyaXB0b3IgdG8gaGFyZHdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5oIGIvZHJpdmVycy9kbWEvZnNsZG1hLmgKaW5kZXggMWZmYzI0NC4uZDU2ZTgzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvZnNsZG1hLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAqIGNoYW5uZWwgaXMgYWxsb3dlZCB0byB0cmFuc2ZlciBiZWZvcmUgdGhlIERNQSBlbmdpbmUgcGF1c2VzCiAgKiB0aGUgY3VycmVudCBjaGFubmVsIGFuZCBzd2l0Y2hlcyB0byB0aGUgbmV4dCBjaGFubmVsCiAgKi8KLSNkZWZpbmUgRlNMX0RNQV9NUl9CV0MgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEZTTF9ETUFfTVJfQldDICAgICAgICAgMHgwQTAwMDAwMAogCiAvKiBTcGVjaWFsIE1SIGRlZmluaXRpb24gZm9yIE1QQzgzNDkgKi8KICNkZWZpbmUgRlNMX0RNQV9NUl9FT1RJRQkweDAwMDAwMDgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jIGIvZHJpdmVycy9kbWEvaW14LXNkbWEuYwppbmRleCBjNzU2NzlkLi40ZTc5MTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKQEAgLTMyMyw2ICszMjMsNyBAQAogCXN0cnVjdCBjbGsJCQkqY2xrX2lwZzsKIAlzdHJ1Y3QgY2xrCQkJKmNsa19haGI7CiAJc3BpbmxvY2tfdAkJCWNoYW5uZWxfMF9sb2NrOworCXUzMgkJCQlzY3JpcHRfbnVtYmVyOwogCXN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycwkqc2NyaXB0X2FkZHJzOwogCWNvbnN0IHN0cnVjdCBzZG1hX2RyaXZlcl9kYXRhCSpkcnZkYXRhOwogfTsKQEAgLTcyNCw2ICs3MjUsMTAgQEAKIAkJcGVyXzJfZW1pID0gc2RtYS0+c2NyaXB0X2FkZHJzLT5hcHBfMl9tY3VfYWRkcjsKIAkJZW1pXzJfcGVyID0gc2RtYS0+c2NyaXB0X2FkZHJzLT5tY3VfMl9hcHBfYWRkcjsKIAkJYnJlYWs7CisJY2FzZSBJTVhfRE1BVFlQRV9TU0lfRFVBTDoKKwkJcGVyXzJfZW1pID0gc2RtYS0+c2NyaXB0X2FkZHJzLT5zc2lzaF8yX21jdV9hZGRyOworCQllbWlfMl9wZXIgPSBzZG1hLT5zY3JpcHRfYWRkcnMtPm1jdV8yX3NzaXNoX2FkZHI7CisJCWJyZWFrOwogCWNhc2UgSU1YX0RNQVRZUEVfU1NJX1NQOgogCWNhc2UgSU1YX0RNQVRZUEVfTU1DOgogCWNhc2UgSU1YX0RNQVRZUEVfU0RIQzoKQEAgLTEyMzgsNiArMTI0Myw3IEBACiB9CiAKICNkZWZpbmUgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMQkzNAorI2RlZmluZSBTRE1BX1NDUklQVF9BRERSU19BUlJBWV9TSVpFX1YyCTM4CiAKIHN0YXRpYyB2b2lkIHNkbWFfYWRkX3NjcmlwdHMoc3RydWN0IHNkbWFfZW5naW5lICpzZG1hLAogCQljb25zdCBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgKmFkZHIpCkBAIC0xMjQ2LDcgKzEyNTIsMTEgQEAKIAlzMzIgKnNhZGRyX2FyciA9ICh1MzIgKilzZG1hLT5zY3JpcHRfYWRkcnM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMTsgaSsrKQorCS8qIHVzZSB0aGUgZGVmYXVsdCBmaXJtd2FyZSBpbiBST00gaWYgbWlzc2luZyBleHRlcm5hbCBmaXJtd2FyZSAqLworCWlmICghc2RtYS0+c2NyaXB0X251bWJlcikKKwkJc2RtYS0+c2NyaXB0X251bWJlciA9IFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjE7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2RtYS0+c2NyaXB0X251bWJlcjsgaSsrKQogCQlpZiAoYWRkcl9hcnJbaV0gPiAwKQogCQkJc2FkZHJfYXJyW2ldID0gYWRkcl9hcnJbaV07CiB9CkBAIC0xMjcyLDYgKzEyODIsMTcgQEAKIAkJZ290byBlcnJfZmlybXdhcmU7CiAJaWYgKGhlYWRlci0+cmFtX2NvZGVfc3RhcnQgKyBoZWFkZXItPnJhbV9jb2RlX3NpemUgPiBmdy0+c2l6ZSkKIAkJZ290byBlcnJfZmlybXdhcmU7CisJc3dpdGNoIChoZWFkZXItPnZlcnNpb25fbWFqb3IpIHsKKwkJY2FzZSAxOgorCQkJc2RtYS0+c2NyaXB0X251bWJlciA9IFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc2RtYS0+c2NyaXB0X251bWJlciA9IFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoc2RtYS0+ZGV2LCAidW5rbm93biBmaXJtd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCWdvdG8gZXJyX2Zpcm13YXJlOworCX0KIAogCWFkZHIgPSAodm9pZCAqKWhlYWRlciArIGhlYWRlci0+c2NyaXB0X2FkZHJzX3N0YXJ0OwogCXJhbV9jb2RlID0gKHZvaWQgKiloZWFkZXIgKyBoZWFkZXItPnJhbV9jb2RlX3N0YXJ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvazNkbWEuYyBiL2RyaXZlcnMvZG1hL2szZG1hLmMKaW5kZXggZTI2MDc1NC4uYTFmOTExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvazNkbWEuYworKysgYi9kcml2ZXJzL2RtYS9rM2RtYS5jCkBAIC00NzcsNyArNDc3LDcgQEAKIAlkbWFfYWRkcl90IGFkZHIsIHNyYyA9IDAsIGRzdCA9IDA7CiAJaW50IG51bSA9IHNnbGVuLCBpOwogCi0JaWYgKHNnbCA9PSAwKQorCWlmIChzZ2wgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ2xlbiwgaSkgewpAQCAtODE3LDcgKzgxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLVNJTVBMRV9ERVZfUE1fT1BTKGszX2RtYV9wbW9wcywgazNfZG1hX3N1c3BlbmQsIGszX2RtYV9yZXN1bWUpOworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGszX2RtYV9wbW9wcywgazNfZG1hX3N1c3BlbmQsIGszX2RtYV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBrM19wZG1hX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21tcF9wZG1hLmMgYi9kcml2ZXJzL2RtYS9tbXBfcGRtYS5jCmluZGV4IGM2YTAxZWEuLmI0Mzk2NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21tcF9wZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbW1wX3BkbWEuYwpAQCAtNSw2ICs1LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzIsMzggKzMzLDM3IEBACiAjZGVmaW5lIERUQURSCQkweDAyMDgKICNkZWZpbmUgRENNRAkJMHgwMjBjCiAKLSNkZWZpbmUgRENTUl9SVU4JKDEgPDwgMzEpCS8qIFJ1biBCaXQgKHJlYWQgLyB3cml0ZSkgKi8KLSNkZWZpbmUgRENTUl9OT0RFU0MJKDEgPDwgMzApCS8qIE5vLURlc2NyaXB0b3IgRmV0Y2ggKHJlYWQgLyB3cml0ZSkgKi8KLSNkZWZpbmUgRENTUl9TVE9QSVJRRU4JKDEgPDwgMjkpCS8qIFN0b3AgSW50ZXJydXB0IEVuYWJsZSAocmVhZCAvIHdyaXRlKSAqLwotI2RlZmluZSBEQ1NSX1JFUVBFTkQJKDEgPDwgOCkJLyogUmVxdWVzdCBQZW5kaW5nIChyZWFkLW9ubHkpICovCi0jZGVmaW5lIERDU1JfU1RPUFNUQVRFCSgxIDw8IDMpCS8qIFN0b3AgU3RhdGUgKHJlYWQtb25seSkgKi8KLSNkZWZpbmUgRENTUl9FTkRJTlRSCSgxIDw8IDIpCS8qIEVuZCBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KLSNkZWZpbmUgRENTUl9TVEFSVElOVFIJKDEgPDwgMSkJLyogU3RhcnQgSW50ZXJydXB0IChyZWFkIC8gd3JpdGUpICovCi0jZGVmaW5lIERDU1JfQlVTRVJSCSgxIDw8IDApCS8qIEJ1cyBFcnJvciBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KKyNkZWZpbmUgRENTUl9SVU4JQklUKDMxKQkvKiBSdW4gQml0IChyZWFkIC8gd3JpdGUpICovCisjZGVmaW5lIERDU1JfTk9ERVNDCUJJVCgzMCkJLyogTm8tRGVzY3JpcHRvciBGZXRjaCAocmVhZCAvIHdyaXRlKSAqLworI2RlZmluZSBEQ1NSX1NUT1BJUlFFTglCSVQoMjkpCS8qIFN0b3AgSW50ZXJydXB0IEVuYWJsZSAocmVhZCAvIHdyaXRlKSAqLworI2RlZmluZSBEQ1NSX1JFUVBFTkQJQklUKDgpCS8qIFJlcXVlc3QgUGVuZGluZyAocmVhZC1vbmx5KSAqLworI2RlZmluZSBEQ1NSX1NUT1BTVEFURQlCSVQoMykJLyogU3RvcCBTdGF0ZSAocmVhZC1vbmx5KSAqLworI2RlZmluZSBEQ1NSX0VORElOVFIJQklUKDIpCS8qIEVuZCBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KKyNkZWZpbmUgRENTUl9TVEFSVElOVFIJQklUKDEpCS8qIFN0YXJ0IEludGVycnVwdCAocmVhZCAvIHdyaXRlKSAqLworI2RlZmluZSBEQ1NSX0JVU0VSUglCSVQoMCkJLyogQnVzIEVycm9yIEludGVycnVwdCAocmVhZCAvIHdyaXRlKSAqLwogCi0jZGVmaW5lIERDU1JfRU9SSVJRRU4JKDEgPDwgMjgpICAgICAgIC8qIEVuZCBvZiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKFIvVykgKi8KLSNkZWZpbmUgRENTUl9FT1JKTVBFTgkoMSA8PCAyNykgICAgICAgLyogSnVtcCB0byBuZXh0IGRlc2NyaXB0b3Igb24gRU9SICovCi0jZGVmaW5lIERDU1JfRU9SU1RPUEVOCSgxIDw8IDI2KSAgICAgICAvKiBTVE9QIG9uIGFuIEVPUiAqLwotI2RlZmluZSBEQ1NSX1NFVENNUFNUCSgxIDw8IDI1KSAgICAgICAvKiBTZXQgRGVzY3JpcHRvciBDb21wYXJlIFN0YXR1cyAqLwotI2RlZmluZSBEQ1NSX0NMUkNNUFNUCSgxIDw8IDI0KSAgICAgICAvKiBDbGVhciBEZXNjcmlwdG9yIENvbXBhcmUgU3RhdHVzICovCi0jZGVmaW5lIERDU1JfQ01QU1QJKDEgPDwgMTApICAgICAgIC8qIFRoZSBEZXNjcmlwdG9yIENvbXBhcmUgU3RhdHVzICovCi0jZGVmaW5lIERDU1JfRU9SSU5UUgkoMSA8PCA5KSAgICAgICAgLyogVGhlIGVuZCBvZiBSZWNlaXZlICovCisjZGVmaW5lIERDU1JfRU9SSVJRRU4JQklUKDI4KQkvKiBFbmQgb2YgUmVjZWl2ZSBJbnRlcnJ1cHQgRW5hYmxlIChSL1cpICovCisjZGVmaW5lIERDU1JfRU9SSk1QRU4JQklUKDI3KQkvKiBKdW1wIHRvIG5leHQgZGVzY3JpcHRvciBvbiBFT1IgKi8KKyNkZWZpbmUgRENTUl9FT1JTVE9QRU4JQklUKDI2KQkvKiBTVE9QIG9uIGFuIEVPUiAqLworI2RlZmluZSBEQ1NSX1NFVENNUFNUCUJJVCgyNSkJLyogU2V0IERlc2NyaXB0b3IgQ29tcGFyZSBTdGF0dXMgKi8KKyNkZWZpbmUgRENTUl9DTFJDTVBTVAlCSVQoMjQpCS8qIENsZWFyIERlc2NyaXB0b3IgQ29tcGFyZSBTdGF0dXMgKi8KKyNkZWZpbmUgRENTUl9DTVBTVAlCSVQoMTApCS8qIFRoZSBEZXNjcmlwdG9yIENvbXBhcmUgU3RhdHVzICovCisjZGVmaW5lIERDU1JfRU9SSU5UUglCSVQoOSkJLyogVGhlIGVuZCBvZiBSZWNlaXZlICovCiAKLSNkZWZpbmUgRFJDTVIobikJKCgoKG4pIDwgNjQpID8gMHgwMTAwIDogMHgxMTAwKSArIFwKLQkJCQkgKCgobikgJiAweDNmKSA8PCAyKSkKLSNkZWZpbmUgRFJDTVJfTUFQVkxECSgxIDw8IDcpCS8qIE1hcCBWYWxpZCAocmVhZCAvIHdyaXRlKSAqLwotI2RlZmluZSBEUkNNUl9DSExOVU0JMHgxZgkJLyogbWFzayBmb3IgQ2hhbm5lbCBOdW1iZXIgKHJlYWQgLyB3cml0ZSkgKi8KKyNkZWZpbmUgRFJDTVIobikJKCgoKG4pIDwgNjQpID8gMHgwMTAwIDogMHgxMTAwKSArICgoKG4pICYgMHgzZikgPDwgMikpCisjZGVmaW5lIERSQ01SX01BUFZMRAlCSVQoNykJLyogTWFwIFZhbGlkIChyZWFkIC8gd3JpdGUpICovCisjZGVmaW5lIERSQ01SX0NITE5VTQkweDFmCS8qIG1hc2sgZm9yIENoYW5uZWwgTnVtYmVyIChyZWFkIC8gd3JpdGUpICovCiAKICNkZWZpbmUgRERBRFJfREVTQ0FERFIJMHhmZmZmZmZmMAkvKiBBZGRyZXNzIG9mIG5leHQgZGVzY3JpcHRvciAobWFzaykgKi8KLSNkZWZpbmUgRERBRFJfU1RPUAkoMSA8PCAwKQkvKiBTdG9wIChyZWFkIC8gd3JpdGUpICovCisjZGVmaW5lIEREQURSX1NUT1AJQklUKDApCS8qIFN0b3AgKHJlYWQgLyB3cml0ZSkgKi8KIAotI2RlZmluZSBEQ01EX0lOQ1NSQ0FERFIJKDEgPDwgMzEpCS8qIFNvdXJjZSBBZGRyZXNzIEluY3JlbWVudCBTZXR0aW5nLiAqLwotI2RlZmluZSBEQ01EX0lOQ1RSR0FERFIJKDEgPDwgMzApCS8qIFRhcmdldCBBZGRyZXNzIEluY3JlbWVudCBTZXR0aW5nLiAqLwotI2RlZmluZSBEQ01EX0ZMT1dTUkMJKDEgPDwgMjkpCS8qIEZsb3cgQ29udHJvbCBieSB0aGUgc291cmNlLiAqLwotI2RlZmluZSBEQ01EX0ZMT1dUUkcJKDEgPDwgMjgpCS8qIEZsb3cgQ29udHJvbCBieSB0aGUgdGFyZ2V0LiAqLwotI2RlZmluZSBEQ01EX1NUQVJUSVJRRU4JKDEgPDwgMjIpCS8qIFN0YXJ0IEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgRENNRF9FTkRJUlFFTgkoMSA8PCAyMSkJLyogRW5kIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgRENNRF9FTkRJQU4JKDEgPDwgMTgpCS8qIERldmljZSBFbmRpYW4tbmVzcy4gKi8KKyNkZWZpbmUgRENNRF9JTkNTUkNBRERSCUJJVCgzMSkJLyogU291cmNlIEFkZHJlc3MgSW5jcmVtZW50IFNldHRpbmcuICovCisjZGVmaW5lIERDTURfSU5DVFJHQUREUglCSVQoMzApCS8qIFRhcmdldCBBZGRyZXNzIEluY3JlbWVudCBTZXR0aW5nLiAqLworI2RlZmluZSBEQ01EX0ZMT1dTUkMJQklUKDI5KQkvKiBGbG93IENvbnRyb2wgYnkgdGhlIHNvdXJjZS4gKi8KKyNkZWZpbmUgRENNRF9GTE9XVFJHCUJJVCgyOCkJLyogRmxvdyBDb250cm9sIGJ5IHRoZSB0YXJnZXQuICovCisjZGVmaW5lIERDTURfU1RBUlRJUlFFTglCSVQoMjIpCS8qIFN0YXJ0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgRENNRF9FTkRJUlFFTglCSVQoMjEpCS8qIEVuZCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIERDTURfRU5ESUFOCUJJVCgxOCkJLyogRGV2aWNlIEVuZGlhbi1uZXNzLiAqLwogI2RlZmluZSBEQ01EX0JVUlNUOAkoMSA8PCAxNikJLyogOCBieXRlIGJ1cnN0ICovCiAjZGVmaW5lIERDTURfQlVSU1QxNgkoMiA8PCAxNikJLyogMTYgYnl0ZSBidXJzdCAqLwogI2RlZmluZSBEQ01EX0JVUlNUMzIJKDMgPDwgMTYpCS8qIDMyIGJ5dGUgYnVyc3QgKi8KQEAgLTEzMiwxMCArMTMyLDE0IEBACiAJc3BpbmxvY2tfdCBwaHlfbG9jazsgLyogcHJvdGVjdCBhbGxvYy9mcmVlIHBoeSBjaGFubmVscyAqLwogfTsKIAotI2RlZmluZSB0eF90b19tbXBfcGRtYV9kZXNjKHR4KSBjb250YWluZXJfb2YodHgsIHN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3LCBhc3luY190eCkKLSNkZWZpbmUgdG9fbW1wX3BkbWFfZGVzYyhsaCkgY29udGFpbmVyX29mKGxoLCBzdHJ1Y3QgbW1wX3BkbWFfZGVzY19zdywgbm9kZSkKLSNkZWZpbmUgdG9fbW1wX3BkbWFfY2hhbihkY2hhbikgY29udGFpbmVyX29mKGRjaGFuLCBzdHJ1Y3QgbW1wX3BkbWFfY2hhbiwgY2hhbikKLSNkZWZpbmUgdG9fbW1wX3BkbWFfZGV2KGRtYWRldikgY29udGFpbmVyX29mKGRtYWRldiwgc3RydWN0IG1tcF9wZG1hX2RldmljZSwgZGV2aWNlKQorI2RlZmluZSB0eF90b19tbXBfcGRtYV9kZXNjKHR4KQkJCQkJXAorCWNvbnRhaW5lcl9vZih0eCwgc3RydWN0IG1tcF9wZG1hX2Rlc2Nfc3csIGFzeW5jX3R4KQorI2RlZmluZSB0b19tbXBfcGRtYV9kZXNjKGxoKQkJCQkJXAorCWNvbnRhaW5lcl9vZihsaCwgc3RydWN0IG1tcF9wZG1hX2Rlc2Nfc3csIG5vZGUpCisjZGVmaW5lIHRvX21tcF9wZG1hX2NoYW4oZGNoYW4pCQkJCQlcCisJY29udGFpbmVyX29mKGRjaGFuLCBzdHJ1Y3QgbW1wX3BkbWFfY2hhbiwgY2hhbikKKyNkZWZpbmUgdG9fbW1wX3BkbWFfZGV2KGRtYWRldikJCQkJCVwKKwljb250YWluZXJfb2YoZG1hZGV2LCBzdHJ1Y3QgbW1wX3BkbWFfZGV2aWNlLCBkZXZpY2UpCiAKIHN0YXRpYyB2b2lkIHNldF9kZXNjKHN0cnVjdCBtbXBfcGRtYV9waHkgKnBoeSwgZG1hX2FkZHJfdCBhZGRyKQogewpAQCAtMTYyLDE5ICsxNjYsMTggQEAKIAl3cml0ZWwoZGFsZ24sIHBoeS0+YmFzZSArIERBTEdOKTsKIAogCXJlZyA9IChwaHktPmlkeCA8PCAyKSArIERDU1I7Ci0Jd3JpdGVsKHJlYWRsKHBoeS0+YmFzZSArIHJlZykgfCBEQ1NSX1JVTiwKLQkJCQkJcGh5LT5iYXNlICsgcmVnKTsKKwl3cml0ZWwocmVhZGwocGh5LT5iYXNlICsgcmVnKSB8IERDU1JfUlVOLCBwaHktPmJhc2UgKyByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2NoYW4oc3RydWN0IG1tcF9wZG1hX3BoeSAqcGh5KQogewogCXUzMiByZWc7CiAKLQlpZiAocGh5KSB7Ci0JCXJlZyA9IChwaHktPmlkeCA8PCAyKSArIERDU1I7Ci0JCXdyaXRlbChyZWFkbChwaHktPmJhc2UgKyByZWcpICYgfkRDU1JfUlVOLAotCQkJCQkJcGh5LT5iYXNlICsgcmVnKTsKLQl9CisJaWYgKCFwaHkpCisJCXJldHVybjsKKworCXJlZyA9IChwaHktPmlkeCA8PCAyKSArIERDU1I7CisJd3JpdGVsKHJlYWRsKHBoeS0+YmFzZSArIHJlZykgJiB+RENTUl9SVU4sIHBoeS0+YmFzZSArIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgY2xlYXJfY2hhbl9pcnEoc3RydWN0IG1tcF9wZG1hX3BoeSAqcGh5KQpAQCAtMTgzLDI2ICsxODYsMjcgQEAKIAl1MzIgZGludCA9IHJlYWRsKHBoeS0+YmFzZSArIERJTlQpOwogCXUzMiByZWcgPSAocGh5LT5pZHggPDwgMikgKyBEQ1NSOwogCi0JaWYgKGRpbnQgJiBCSVQocGh5LT5pZHgpKSB7Ci0JCS8qIGNsZWFyIGlycSAqLwotCQlkY3NyID0gcmVhZGwocGh5LT5iYXNlICsgcmVnKTsKLQkJd3JpdGVsKGRjc3IsIHBoeS0+YmFzZSArIHJlZyk7Ci0JCWlmICgoZGNzciAmIERDU1JfQlVTRVJSKSAmJiAocGh5LT52Y2hhbikpCi0JCQlkZXZfd2FybihwaHktPnZjaGFuLT5kZXYsICJEQ1NSX0JVU0VSUlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoIShkaW50ICYgQklUKHBoeS0+aWR4KSkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogY2xlYXIgaXJxICovCisJZGNzciA9IHJlYWRsKHBoeS0+YmFzZSArIHJlZyk7CisJd3JpdGVsKGRjc3IsIHBoeS0+YmFzZSArIHJlZyk7CisJaWYgKChkY3NyICYgRENTUl9CVVNFUlIpICYmIChwaHktPnZjaGFuKSkKKwkJZGV2X3dhcm4ocGh5LT52Y2hhbi0+ZGV2LCAiRENTUl9CVVNFUlJcbiIpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtbXBfcGRtYV9jaGFuX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBtbXBfcGRtYV9waHkgKnBoeSA9IGRldl9pZDsKIAotCWlmIChjbGVhcl9jaGFuX2lycShwaHkpID09IDApIHsKLQkJdGFza2xldF9zY2hlZHVsZSgmcGh5LT52Y2hhbi0+dGFza2xldCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9IGVsc2UKKwlpZiAoY2xlYXJfY2hhbl9pcnEocGh5KSAhPSAwKQogCQlyZXR1cm4gSVJRX05PTkU7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZwaHktPnZjaGFuLT50YXNrbGV0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtbXBfcGRtYV9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC0yMjQsOCArMjI4LDggQEAKIAogCWlmIChpcnFfbnVtKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JZWxzZQotCQlyZXR1cm4gSVJRX05PTkU7CisKKwlyZXR1cm4gSVJRX05PTkU7CiB9CiAKIC8qIGxvb2t1cCBmcmVlIHBoeSBjaGFubmVsIGFzIGRlc2NlbmRpbmcgcHJpb3JpdHkgKi8KQEAgLTI0NSw5ICsyNDksOSBAQAogCSAqLwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnBoeV9sb2NrLCBmbGFncyk7Ci0JZm9yIChwcmlvID0gMDsgcHJpbyA8PSAoKChwZGV2LT5kbWFfY2hhbm5lbHMgLSAxKSAmIDB4ZikgPj4gMik7IHByaW8rKykgeworCWZvciAocHJpbyA9IDA7IHByaW8gPD0gKChwZGV2LT5kbWFfY2hhbm5lbHMgLSAxKSAmIDB4ZikgPj4gMjsgcHJpbysrKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwZGV2LT5kbWFfY2hhbm5lbHM7IGkrKykgewotCQkJaWYgKHByaW8gIT0gKChpICYgMHhmKSA+PiAyKSkKKwkJCWlmIChwcmlvICE9IChpICYgMHhmKSA+PiAyKQogCQkJCWNvbnRpbnVlOwogCQkJcGh5ID0gJnBkZXYtPnBoeVtpXTsKIAkJCWlmICghcGh5LT52Y2hhbikgewpAQCAtMzg5LDE0ICszOTMsMTYgQEAKIAlpZiAoY2hhbi0+ZGVzY19wb29sKQogCQlyZXR1cm4gMTsKIAotCWNoYW4tPmRlc2NfcG9vbCA9Ci0JCWRtYV9wb29sX2NyZWF0ZShkZXZfbmFtZSgmZGNoYW4tPmRldi0+ZGV2aWNlKSwgY2hhbi0+ZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3KSwKLQkJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3KSwgMCk7CisJY2hhbi0+ZGVzY19wb29sID0gZG1hX3Bvb2xfY3JlYXRlKGRldl9uYW1lKCZkY2hhbi0+ZGV2LT5kZXZpY2UpLAorCQkJCQkgIGNoYW4tPmRldiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IG1tcF9wZG1hX2Rlc2Nfc3cpLAorCQkJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3KSwKKwkJCQkJICAwKTsKIAlpZiAoIWNoYW4tPmRlc2NfcG9vbCkgewogCQlkZXZfZXJyKGNoYW4tPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBkZXNjcmlwdG9yIHBvb2xcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKIAltbXBfcGRtYV9mcmVlX3BoeShjaGFuKTsKIAljaGFuLT5pZGxlID0gdHJ1ZTsKIAljaGFuLT5kZXZfYWRkciA9IDA7CkBAIC00MDQsNyArNDEwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbW1wX3BkbWFfZnJlZV9kZXNjX2xpc3Qoc3RydWN0IG1tcF9wZG1hX2NoYW4gKmNoYW4sCi0JCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3ICpkZXNjLCAqX2Rlc2M7CiAKQEAgLTQzNCw4ICs0NDAsOCBAQAogCiBzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIG1tcF9wZG1hX3ByZXBfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sCi0JZG1hX2FkZHJfdCBkbWFfZHN0LCBkbWFfYWRkcl90IGRtYV9zcmMsCi0Jc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJICAgICBkbWFfYWRkcl90IGRtYV9kc3QsIGRtYV9hZGRyX3QgZG1hX3NyYywKKwkJICAgICBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBtbXBfcGRtYV9jaGFuICpjaGFuOwogCXN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3ICpmaXJzdCA9IE5VTEwsICpwcmV2ID0gTlVMTCwgKm5ldzsKQEAgLTUxNSw4ICs1MjEsOCBAQAogCiBzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIG1tcF9wZG1hX3ByZXBfc2xhdmVfc2coc3RydWN0IGRtYV9jaGFuICpkY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCi0JCQkgdW5zaWduZWQgaW50IHNnX2xlbiwgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKLQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpjb250ZXh0KQorCQkgICAgICAgdW5zaWduZWQgaW50IHNnX2xlbiwgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IG1tcF9wZG1hX2NoYW4gKmNoYW4gPSB0b19tbXBfcGRtYV9jaGFuKGRjaGFuKTsKIAlzdHJ1Y3QgbW1wX3BkbWFfZGVzY19zdyAqZmlyc3QgPSBOVUxMLCAqcHJldiA9IE5VTEwsICpuZXcgPSBOVUxMOwpAQCAtNTkxLDEwICs1OTcsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqbW1wX3BkbWFfcHJlcF9kbWFfY3ljbGljKAotCXN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sIGRtYV9hZGRyX3QgYnVmX2FkZHIsIHNpemVfdCBsZW4sCi0Jc2l6ZV90IHBlcmlvZF9sZW4sIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCAqY29udGV4dCkKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorbW1wX3BkbWFfcHJlcF9kbWFfY3ljbGljKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sCisJCQkgZG1hX2FkZHJfdCBidWZfYWRkciwgc2l6ZV90IGxlbiwgc2l6ZV90IHBlcmlvZF9sZW4sCisJCQkgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBtbXBfcGRtYV9jaGFuICpjaGFuOwogCXN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3ICpmaXJzdCA9IE5VTEwsICpwcmV2ID0gTlVMTCwgKm5ldzsKQEAgLTYzNiw4ICs2NDMsOCBAQAogCQkJZ290byBmYWlsOwogCQl9CiAKLQkJbmV3LT5kZXNjLmRjbWQgPSBjaGFuLT5kY21kIHwgRENNRF9FTkRJUlFFTiB8Ci0JCQkJCShEQ01EX0xFTkdUSCAmIHBlcmlvZF9sZW4pOworCQluZXctPmRlc2MuZGNtZCA9IChjaGFuLT5kY21kIHwgRENNRF9FTkRJUlFFTiB8CisJCQkJICAoRENNRF9MRU5HVEggJiBwZXJpb2RfbGVuKSk7CiAJCW5ldy0+ZGVzYy5kc2FkciA9IGRtYV9zcmM7CiAJCW5ldy0+ZGVzYy5kdGFkciA9IGRtYV9kc3Q7CiAKQEAgLTY3NywxMiArNjg0LDExIEBACiB9CiAKIHN0YXRpYyBpbnQgbW1wX3BkbWFfY29udHJvbChzdHJ1Y3QgZG1hX2NoYW4gKmRjaGFuLCBlbnVtIGRtYV9jdHJsX2NtZCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBtbXBfcGRtYV9jaGFuICpjaGFuID0gdG9fbW1wX3BkbWFfY2hhbihkY2hhbik7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNmZyA9ICh2b2lkICopYXJnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7CiAJdTMyIG1heGJ1cnN0ID0gMCwgYWRkciA9IDA7CiAJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEOwogCkBAIC03MzksMTEgKzc0NSwxMiBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgZW51bSBkbWFfc3RhdHVzIG1tcF9wZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmRjaGFuLAotCQkJZG1hX2Nvb2tpZV90IGNvb2tpZSwgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKKwkJCQkJICBkbWFfY29va2llX3QgY29va2llLAorCQkJCQkgIHN0cnVjdCBkbWFfdHhfc3RhdGUgKnR4c3RhdGUpCiB7CiAJcmV0dXJuIGRtYV9jb29raWVfc3RhdHVzKGRjaGFuLCBjb29raWUsIHR4c3RhdGUpOwogfQpAQCAtODQ1LDE1ICs4NTIsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbXBfcGRtYV9jaGFuX2luaXQoc3RydWN0IG1tcF9wZG1hX2RldmljZSAqcGRldiwKLQkJCQkJCQlpbnQgaWR4LCBpbnQgaXJxKQorc3RhdGljIGludCBtbXBfcGRtYV9jaGFuX2luaXQoc3RydWN0IG1tcF9wZG1hX2RldmljZSAqcGRldiwgaW50IGlkeCwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgbW1wX3BkbWFfcGh5ICpwaHkgID0gJnBkZXYtPnBoeVtpZHhdOwogCXN0cnVjdCBtbXBfcGRtYV9jaGFuICpjaGFuOwogCWludCByZXQ7CiAKLQljaGFuID0gZGV2bV9remFsbG9jKHBkZXYtPmRldiwKLQkJCXNpemVvZihzdHJ1Y3QgbW1wX3BkbWFfY2hhbiksIEdGUF9LRVJORUwpOworCWNoYW4gPSBkZXZtX2t6YWxsb2MocGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG1tcF9wZG1hX2NoYW4pLAorCQkJICAgIEdGUF9LRVJORUwpOwogCWlmIChjaGFuID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC04NjEsOCArODY3LDggQEAKIAlwaHktPmJhc2UgPSBwZGV2LT5iYXNlOwogCiAJaWYgKGlycSkgewotCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKHBkZXYtPmRldiwgaXJxLAotCQkJbW1wX3BkbWFfY2hhbl9oYW5kbGVyLCAwLCAicGRtYSIsIHBoeSk7CisJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEocGRldi0+ZGV2LCBpcnEsIG1tcF9wZG1hX2NoYW5faGFuZGxlciwgMCwKKwkJCQkgICAgICAgInBkbWEiLCBwaHkpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKHBkZXYtPmRldiwgImNoYW5uZWwgcmVxdWVzdCBpcnEgZmFpbCFcbiIpOwogCQkJcmV0dXJuIHJldDsKQEAgLTg3Nyw4ICs4ODMsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5jaGFpbl9ydW5uaW5nKTsKIAogCS8qIHJlZ2lzdGVyIHZpcnQgY2hhbm5lbCB0byBkbWEgZW5naW5lICovCi0JbGlzdF9hZGRfdGFpbCgmY2hhbi0+Y2hhbi5kZXZpY2Vfbm9kZSwKLQkJCSZwZGV2LT5kZXZpY2UuY2hhbm5lbHMpOworCWxpc3RfYWRkX3RhaWwoJmNoYW4tPmNoYW4uZGV2aWNlX25vZGUsICZwZGV2LT5kZXZpY2UuY2hhbm5lbHMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OTQsMTQgKzg5OSwxMiBAQAogewogCXN0cnVjdCBtbXBfcGRtYV9kZXZpY2UgKmQgPSBvZmRtYS0+b2ZfZG1hX2RhdGE7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOwotCXN0cnVjdCBtbXBfcGRtYV9jaGFuICpjOwogCiAJY2hhbiA9IGRtYV9nZXRfYW55X3NsYXZlX2NoYW5uZWwoJmQtPmRldmljZSk7CiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gTlVMTDsKIAotCWMgPSB0b19tbXBfcGRtYV9jaGFuKGNoYW4pOwotCWMtPmRyY21yID0gZG1hX3NwZWMtPmFyZ3NbMF07CisJdG9fbW1wX3BkbWFfY2hhbihjaGFuKS0+ZHJjbXIgPSBkbWFfc3BlYy0+YXJnc1swXTsKIAogCXJldHVybiBjaGFuOwogfQpAQCAtOTE4LDYgKzkyMSw3IEBACiAJcGRldiA9IGRldm1fa3phbGxvYygmb3AtPmRldiwgc2l6ZW9mKCpwZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKKwogCXBkZXYtPmRldiA9ICZvcC0+ZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJnBkZXYtPnBoeV9sb2NrKTsKQEAgLTkyOSw4ICs5MzMsOCBAQAogCiAJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UobW1wX3BkbWFfZHRfaWRzLCBwZGV2LT5kZXYpOwogCWlmIChvZl9pZCkKLQkJb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2LT5vZl9ub2RlLAotCQkJCSIjZG1hLWNoYW5uZWxzIiwgJmRtYV9jaGFubmVscyk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi0+b2Zfbm9kZSwgIiNkbWEtY2hhbm5lbHMiLAorCQkJCSAgICAgJmRtYV9jaGFubmVscyk7CiAJZWxzZSBpZiAocGRhdGEgJiYgcGRhdGEtPmRtYV9jaGFubmVscykKIAkJZG1hX2NoYW5uZWxzID0gcGRhdGEtPmRtYV9jaGFubmVsczsKIAllbHNlCkBAIC05NDIsOCArOTQ2LDkgQEAKIAkJCWlycV9udW0rKzsKIAl9CiAKLQlwZGV2LT5waHkgPSBkZXZtX2t6YWxsb2MocGRldi0+ZGV2LAotCQlkbWFfY2hhbm5lbHMgKiBzaXplb2Yoc3RydWN0IG1tcF9wZG1hX2NoYW4pLCBHRlBfS0VSTkVMKTsKKwlwZGV2LT5waHkgPSBkZXZtX2tjYWxsb2MocGRldi0+ZGV2LAorCQkJCSBkbWFfY2hhbm5lbHMsIHNpemVvZihzdHJ1Y3QgbW1wX3BkbWFfY2hhbiksCisJCQkJIEdGUF9LRVJORUwpOwogCWlmIChwZGV2LT5waHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTk1Miw4ICs5NTcsOCBAQAogCWlmIChpcnFfbnVtICE9IGRtYV9jaGFubmVscykgewogCQkvKiBhbGwgY2hhbiBzaGFyZSBvbmUgaXJxLCBkZW11eCBpbnNpZGUgKi8KIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShvcCwgMCk7Ci0JCXJldCA9IGRldm1fcmVxdWVzdF9pcnEocGRldi0+ZGV2LCBpcnEsCi0JCQltbXBfcGRtYV9pbnRfaGFuZGxlciwgMCwgInBkbWEiLCBwZGV2KTsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShwZGV2LT5kZXYsIGlycSwgbW1wX3BkbWFfaW50X2hhbmRsZXIsIDAsCisJCQkJICAgICAgICJwZG1hIiwgcGRldik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTEwMjksNyArMTAzNCw3IEBACiAJaWYgKGNoYW4tPmRldmljZS0+ZGV2LT5kcml2ZXIgIT0gJm1tcF9wZG1hX2RyaXZlci5kcml2ZXIpCiAJCXJldHVybiBmYWxzZTsKIAotCWMtPmRyY21yID0gKih1bnNpZ25lZCBpbnQgKikgcGFyYW07CisJYy0+ZHJjbXIgPSAqKHVuc2lnbmVkIGludCAqKXBhcmFtOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xMDM3LDYgKzEwNDIsNiBAQAogCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1tcF9wZG1hX2RyaXZlcik7CiAKLU1PRFVMRV9ERVNDUklQVElPTigiTUFSVkVMTCBNTVAgUGVyaXBoZXJhIERNQSBEcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFSVkVMTCBNTVAgUGVyaXBoZXJhbCBETUEgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbW1wX3RkbWEuYyBiL2RyaXZlcnMvZG1hL21tcF90ZG1hLmMKaW5kZXggM2RkYWNjMS4uMzNmOTZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbW1wX3RkbWEuYworKysgYi9kcml2ZXJzL2RtYS9tbXBfdGRtYS5jCkBAIC0xMjEsMTEgKzEyMSwxMyBAQAogCWludAkJCQlpZHg7CiAJZW51bSBtbXBfdGRtYV90eXBlCQl0eXBlOwogCWludAkJCQlpcnE7Ci0JdW5zaWduZWQgbG9uZwkJCXJlZ19iYXNlOworCXZvaWQgX19pb21lbQkJCSpyZWdfYmFzZTsKIAogCXNpemVfdAkJCQlidWZfbGVuOwogCXNpemVfdAkJCQlwZXJpb2RfbGVuOwogCXNpemVfdAkJCQlwb3M7CisKKwlzdHJ1Y3QgZ2VuX3Bvb2wJCQkqcG9vbDsKIH07CiAKICNkZWZpbmUgVERNQV9DSEFOTkVMX05VTSAyCkBAIC0xODIsNyArMTg0LDcgQEAKIAogc3RhdGljIGludCBtbXBfdGRtYV9jb25maWdfY2hhbihzdHJ1Y3QgbW1wX3RkbWFfY2hhbiAqdGRtYWMpCiB7Ci0JdW5zaWduZWQgaW50IHRkY3I7CisJdW5zaWduZWQgaW50IHRkY3IgPSAwOwogCiAJbW1wX3RkbWFfZGlzYWJsZV9jaGFuKHRkbWFjKTsKIApAQCAtMzI0LDcgKzMyNiw3IEBACiAJc3RydWN0IGdlbl9wb29sICpncG9vbDsKIAlpbnQgc2l6ZSA9IHRkbWFjLT5kZXNjX251bSAqIHNpemVvZihzdHJ1Y3QgbW1wX3RkbWFfZGVzYyk7CiAKLQlncG9vbCA9IHNyYW1fZ2V0X2dwb29sKCJhc3JhbSIpOworCWdwb29sID0gdGRtYWMtPnBvb2w7CiAJaWYgKHRkbWFjLT5kZXNjX2FycikKIAkJZ2VuX3Bvb2xfZnJlZShncG9vbCwgKHVuc2lnbmVkIGxvbmcpdGRtYWMtPmRlc2NfYXJyLAogCQkJCXNpemUpOwpAQCAtMzc0LDcgKzM3Niw3IEBACiAJc3RydWN0IGdlbl9wb29sICpncG9vbDsKIAlpbnQgc2l6ZSA9IHRkbWFjLT5kZXNjX251bSAqIHNpemVvZihzdHJ1Y3QgbW1wX3RkbWFfZGVzYyk7CiAKLQlncG9vbCA9IHNyYW1fZ2V0X2dwb29sKCJhc3JhbSIpOworCWdwb29sID0gdGRtYWMtPnBvb2w7CiAJaWYgKCFncG9vbCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTUwNSw3ICs1MDcsOCBAQAogfQogCiBzdGF0aWMgaW50IG1tcF90ZG1hX2NoYW5faW5pdChzdHJ1Y3QgbW1wX3RkbWFfZGV2aWNlICp0ZGV2LAotCQkJCQkJaW50IGlkeCwgaW50IGlycSwgaW50IHR5cGUpCisJCQkJCWludCBpZHgsIGludCBpcnEsCisJCQkJCWludCB0eXBlLCBzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wpCiB7CiAJc3RydWN0IG1tcF90ZG1hX2NoYW4gKnRkbWFjOwogCkBAIC01MjYsNyArNTI5LDggQEAKIAl0ZG1hYy0+Y2hhbi5kZXZpY2UgPSAmdGRldi0+ZGV2aWNlOwogCXRkbWFjLT5pZHgJICAgPSBpZHg7CiAJdGRtYWMtPnR5cGUJICAgPSB0eXBlOwotCXRkbWFjLT5yZWdfYmFzZQkgICA9ICh1bnNpZ25lZCBsb25nKXRkZXYtPmJhc2UgKyBpZHggKiA0OworCXRkbWFjLT5yZWdfYmFzZQkgICA9IHRkZXYtPmJhc2UgKyBpZHggKiA0OworCXRkbWFjLT5wb29sCSAgID0gcG9vbDsKIAl0ZG1hYy0+c3RhdHVzID0gRE1BX0NPTVBMRVRFOwogCXRkZXYtPnRkbWFjW3RkbWFjLT5pZHhdID0gdGRtYWM7CiAJdGFza2xldF9pbml0KCZ0ZG1hYy0+dGFza2xldCwgZG1hX2RvX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXRkbWFjKTsKQEAgLTU1Myw2ICs1NTcsNyBAQAogCWludCBpLCByZXQ7CiAJaW50IGlycSA9IDAsIGlycV9udW0gPSAwOwogCWludCBjaGFuX251bSA9IFRETUFfQ0hBTk5FTF9OVU07CisJc3RydWN0IGdlbl9wb29sICpwb29sOwogCiAJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UobW1wX3RkbWFfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlpZiAob2ZfaWQpCkBAIC01NzksNiArNTg0LDE1IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdGRldi0+ZGV2aWNlLmNoYW5uZWxzKTsKIAorCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJcG9vbCA9IG9mX2dldF9uYW1lZF9nZW5fcG9vbChwZGV2LT5kZXYub2Zfbm9kZSwgImFzcmFtIiwgMCk7CisJZWxzZQorCQlwb29sID0gc3JhbV9nZXRfZ3Bvb2woImFzcmFtIik7CisJaWYgKCFwb29sKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFzcmFtIHBvb2wgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCWlmIChpcnFfbnVtICE9IGNoYW5fbnVtKSB7CiAJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLApAQCAtNTkwLDcgKzYwNCw3IEBACiAJLyogaW5pdGlhbGl6ZSBjaGFubmVsIHBhcmFtZXRlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2hhbl9udW07IGkrKykgewogCQlpcnEgPSAoaXJxX251bSAhPSBjaGFuX251bSkgPyAwIDogcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJcmV0ID0gbW1wX3RkbWFfY2hhbl9pbml0KHRkZXYsIGksIGlycSwgdHlwZSk7CisJCXJldCA9IG1tcF90ZG1hX2NoYW5faW5pdCh0ZGV2LCBpLCBpcnEsIHR5cGUsIHBvb2wpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMgYi9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGU0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIE1PWEEgQVJUIFNvQ3MgRE1BIEVuZ2luZSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBKb25hcyBKZW5zZW4KKyAqCisgKiBKb25hcyBKZW5zZW4gPGpvbmFzLmplbnNlbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAiZG1hZW5naW5lLmgiCisjaW5jbHVkZSAidmlydC1kbWEuaCIKKworI2RlZmluZSBBUEJfRE1BX01BWF9DSEFOTkVMCQkJNAorCisjZGVmaW5lIFJFR19PRkZfQUREUkVTU19TT1VSQ0UJCQkwCisjZGVmaW5lIFJFR19PRkZfQUREUkVTU19ERVNUCQkJNAorI2RlZmluZSBSRUdfT0ZGX0NZQ0xFUwkJCQk4CisjZGVmaW5lIFJFR19PRkZfQ1RSTAkJCQkxMgorI2RlZmluZSBSRUdfT0ZGX0NIQU5fU0laRQkJCTE2CisKKyNkZWZpbmUgQVBCX0RNQV9FTkFCTEUJCQkJQklUKDApCisjZGVmaW5lIEFQQl9ETUFfRklOX0lOVF9TVFMJCQlCSVQoMSkKKyNkZWZpbmUgQVBCX0RNQV9GSU5fSU5UX0VOCQkJQklUKDIpCisjZGVmaW5lIEFQQl9ETUFfQlVSU1RfTU9ERQkJCUJJVCgzKQorI2RlZmluZSBBUEJfRE1BX0VSUl9JTlRfU1RTCQkJQklUKDQpCisjZGVmaW5lIEFQQl9ETUFfRVJSX0lOVF9FTgkJCUJJVCg1KQorCisvKgorICogVW5zZXQ6IEFQQgorICogU2V0OiAgIEFIQgorICovCisjZGVmaW5lIEFQQl9ETUFfU09VUkNFX1NFTEVDVAkJCTB4NDAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX1NFTEVDVAkJCTB4ODAKKworI2RlZmluZSBBUEJfRE1BX1NPVVJDRQkJCQkweDEwMAorI2RlZmluZSBBUEJfRE1BX0RFU1QJCQkJMHgxMDAwCisKKyNkZWZpbmUgQVBCX0RNQV9TT1VSQ0VfTUFTSwkJCTB4NzAwCisjZGVmaW5lIEFQQl9ETUFfREVTVF9NQVNLCQkJMHg3MDAwCisKKy8qCisgKiAwMDA6IE5vIGluY3JlbWVudAorICogMDAxOiArMSAoQnVyc3Q9MCksICs0ICAoQnVyc3Q9MSkKKyAqIDAxMDogKzIgKEJ1cnN0PTApLCArOCAgKEJ1cnN0PTEpCisgKiAwMTE6ICs0IChCdXJzdD0wKSwgKzE2IChCdXJzdD0xKQorICogMTAxOiAtMSAoQnVyc3Q9MCksIC00ICAoQnVyc3Q9MSkKKyAqIDExMDogLTIgKEJ1cnN0PTApLCAtOCAgKEJ1cnN0PTEpCisgKiAxMTE6IC00IChCdXJzdD0wKSwgLTE2IChCdXJzdD0xKQorICovCisjZGVmaW5lIEFQQl9ETUFfU09VUkNFX0lOQ18wCQkJMAorI2RlZmluZSBBUEJfRE1BX1NPVVJDRV9JTkNfMV80CQkJMHgxMDAKKyNkZWZpbmUgQVBCX0RNQV9TT1VSQ0VfSU5DXzJfOAkJCTB4MjAwCisjZGVmaW5lIEFQQl9ETUFfU09VUkNFX0lOQ180XzE2CQkJMHgzMDAKKyNkZWZpbmUgQVBCX0RNQV9TT1VSQ0VfREVDXzFfNAkJCTB4NTAwCisjZGVmaW5lIEFQQl9ETUFfU09VUkNFX0RFQ18yXzgJCQkweDYwMAorI2RlZmluZSBBUEJfRE1BX1NPVVJDRV9ERUNfNF8xNgkJCTB4NzAwCisjZGVmaW5lIEFQQl9ETUFfREVTVF9JTkNfMAkJCTAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX0lOQ18xXzQJCQkweDEwMDAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX0lOQ18yXzgJCQkweDIwMDAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX0lOQ180XzE2CQkJMHgzMDAwCisjZGVmaW5lIEFQQl9ETUFfREVTVF9ERUNfMV80CQkJMHg1MDAwCisjZGVmaW5lIEFQQl9ETUFfREVTVF9ERUNfMl84CQkJMHg2MDAwCisjZGVmaW5lIEFQQl9ETUFfREVTVF9ERUNfNF8xNgkJCTB4NzAwMAorCisvKgorICogUmVxdWVzdCBzaWduYWwgc2VsZWN0IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBETUEgaGFyZHdhcmUgaGFuZHNoYWtlLgorICoKKyAqIFRoZSByZXF1ZXN0IGxpbmUgbnVtYmVyIGlzIGEgcHJvcGVydHkgb2YgdGhlIERNQSBjb250cm9sbGVyIGl0c2VsZiwKKyAqIGUuZy4gTU1DIG11c3QgYWx3YXlzIHJlcXVlc3QgY2hhbm5lbHMgd2hlcmUgZG1hX3NsYXZlX2NvbmZpZy0+c2xhdmVfaWQgaXMgNS4KKyAqCisgKiAwOiAgICBObyByZXF1ZXN0IC8gR3JhbnQgc2lnbmFsCisgKiAxLTE1OiBSZXF1ZXN0ICAgIC8gR3JhbnQgc2lnbmFsCisgKi8KKyNkZWZpbmUgQVBCX0RNQV9TT1VSQ0VfUkVRX05PCQkJMHgxMDAwMDAwCisjZGVmaW5lIEFQQl9ETUFfU09VUkNFX1JFUV9OT19NQVNLCQkweGYwMDAwMDAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX1JFUV9OTwkJCTB4MTAwMDAKKyNkZWZpbmUgQVBCX0RNQV9ERVNUX1JFUV9OT19NQVNLCQkweGYwMDAwCisKKyNkZWZpbmUgQVBCX0RNQV9EQVRBX1dJRFRICQkJMHgxMDAwMDAKKyNkZWZpbmUgQVBCX0RNQV9EQVRBX1dJRFRIX01BU0sJCQkweDMwMDAwMAorLyoKKyAqIERhdGEgd2lkdGggb2YgdHJhbnNmZXI6CisgKgorICogMDA6IFdvcmQKKyAqIDAxOiBIYWxmCisgKiAxMDogQnl0ZQorICovCisjZGVmaW5lIEFQQl9ETUFfREFUQV9XSURUSF80CQkJMAorI2RlZmluZSBBUEJfRE1BX0RBVEFfV0lEVEhfMgkJCTB4MTAwMDAwCisjZGVmaW5lIEFQQl9ETUFfREFUQV9XSURUSF8xCQkJMHgyMDAwMDAKKworI2RlZmluZSBBUEJfRE1BX0NZQ0xFU19NQVNLCQkJMHgwMGZmZmZmZgorCisjZGVmaW5lIE1PWEFSVF9ETUFfREFUQV9UWVBFX1M4CQkJMHgwMAorI2RlZmluZSBNT1hBUlRfRE1BX0RBVEFfVFlQRV9TMTYJCTB4MDEKKyNkZWZpbmUgTU9YQVJUX0RNQV9EQVRBX1RZUEVfUzMyCQkweDAyCisKK3N0cnVjdCBtb3hhcnRfc2cgeworCWRtYV9hZGRyX3QgYWRkcjsKKwl1aW50MzJfdCBsZW47Cit9OworCitzdHJ1Y3QgbW94YXJ0X2Rlc2MgeworCWVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbglkbWFfZGlyOworCWRtYV9hZGRyX3QJCQlkZXZfYWRkcjsKKwl1bnNpZ25lZCBpbnQJCQlzZ2xlbjsKKwl1bnNpZ25lZCBpbnQJCQlkbWFfY3ljbGVzOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjCQl2ZDsKKwl1aW50OF90CQkJCWVzOworCXN0cnVjdCBtb3hhcnRfc2cJCXNnWzBdOworfTsKKworc3RydWN0IG1veGFydF9jaGFuIHsKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbgkJdmM7CisKKwl2b2lkIF9faW9tZW0JCQkqYmFzZTsKKwlzdHJ1Y3QgbW94YXJ0X2Rlc2MJCSpkZXNjOworCisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcJCWNmZzsKKworCWJvb2wJCQkJYWxsb2NhdGVkOworCWJvb2wJCQkJZXJyb3I7CisJaW50CQkJCWNoX251bTsKKwl1bnNpZ25lZCBpbnQJCQlsaW5lX3JlcW5vOworCXVuc2lnbmVkIGludAkJCXNnaWR4OworfTsKKworc3RydWN0IG1veGFydF9kbWFkZXYgeworCXN0cnVjdCBkbWFfZGV2aWNlCQlkbWFfc2xhdmU7CisJc3RydWN0IG1veGFydF9jaGFuCQlzbGF2ZV9jaGFuc1tBUEJfRE1BX01BWF9DSEFOTkVMXTsKK307CisKK3N0cnVjdCBtb3hhcnRfZmlsdGVyX2RhdGEgeworCXN0cnVjdCBtb3hhcnRfZG1hZGV2CQkqbWRjOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MJCSpkbWFfc3BlYzsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXNfYnl0ZXNbXSA9IHsKKwlbTU9YQVJUX0RNQV9EQVRBX1RZUEVfUzhdID0gMSwKKwlbTU9YQVJUX0RNQV9EQVRBX1RZUEVfUzE2XSA9IDIsCisJW01PWEFSVF9ETUFfREFUQV9UWVBFX1MzMl0gPSA0LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNoYW4yZGV2KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlyZXR1cm4gJmNoYW4tPmRldi0+ZGV2aWNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtb3hhcnRfY2hhbiAqdG9fbW94YXJ0X2RtYV9jaGFuKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBtb3hhcnRfY2hhbiwgdmMuY2hhbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1veGFydF9kZXNjICp0b19tb3hhcnRfZG1hX2Rlc2MoCisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0KQoreworCXJldHVybiBjb250YWluZXJfb2YodCwgc3RydWN0IG1veGFydF9kZXNjLCB2ZC50eCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFydF9kbWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKK3sKKwlrZnJlZShjb250YWluZXJfb2YodmQsIHN0cnVjdCBtb3hhcnRfZGVzYywgdmQpKTsKK30KKworc3RhdGljIGludCBtb3hhcnRfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG1veGFydF9jaGFuICpjaCA9IHRvX21veGFydF9kbWFfY2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChoZWFkKTsKKwl1MzIgY3RybDsKKworCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICIlczogY2g9JXBcbiIsIF9fZnVuY19fLCBjaCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKKworCWlmIChjaC0+ZGVzYykKKwkJY2gtPmRlc2MgPSBOVUxMOworCisJY3RybCA9IHJlYWRsKGNoLT5iYXNlICsgUkVHX09GRl9DVFJMKTsKKwljdHJsICY9IH4oQVBCX0RNQV9FTkFCTEUgfCBBUEJfRE1BX0ZJTl9JTlRfRU4gfCBBUEJfRE1BX0VSUl9JTlRfRU4pOworCXdyaXRlbChjdHJsLCBjaC0+YmFzZSArIFJFR19PRkZfQ1RSTCk7CisKKwl2Y2hhbl9nZXRfYWxsX2Rlc2NyaXB0b3JzKCZjaC0+dmMsICZoZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+dmMubG9jaywgZmxhZ3MpOworCXZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdCgmY2gtPnZjLCAmaGVhZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3hhcnRfc2xhdmVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJCSAgICAgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBtb3hhcnRfY2hhbiAqY2ggPSB0b19tb3hhcnRfZG1hX2NoYW4oY2hhbik7CisJdTMyIGN0cmw7CisKKwljaC0+Y2ZnID0gKmNmZzsKKworCWN0cmwgPSByZWFkbChjaC0+YmFzZSArIFJFR19PRkZfQ1RSTCk7CisJY3RybCB8PSBBUEJfRE1BX0JVUlNUX01PREU7CisJY3RybCAmPSB+KEFQQl9ETUFfREVTVF9NQVNLIHwgQVBCX0RNQV9TT1VSQ0VfTUFTSyk7CisJY3RybCAmPSB+KEFQQl9ETUFfREVTVF9SRVFfTk9fTUFTSyB8IEFQQl9ETUFfU09VUkNFX1JFUV9OT19NQVNLKTsKKworCXN3aXRjaCAoY2gtPmNmZy5zcmNfYWRkcl93aWR0aCkgeworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKKwkJY3RybCB8PSBBUEJfRE1BX0RBVEFfV0lEVEhfMTsKKwkJaWYgKGNoLT5jZmcuZGlyZWN0aW9uICE9IERNQV9NRU1fVE9fREVWKQorCQkJY3RybCB8PSBBUEJfRE1BX0RFU1RfSU5DXzFfNDsKKwkJZWxzZQorCQkJY3RybCB8PSBBUEJfRE1BX1NPVVJDRV9JTkNfMV80OworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOgorCQljdHJsIHw9IEFQQl9ETUFfREFUQV9XSURUSF8yOworCQlpZiAoY2gtPmNmZy5kaXJlY3Rpb24gIT0gRE1BX01FTV9UT19ERVYpCisJCQljdHJsIHw9IEFQQl9ETUFfREVTVF9JTkNfMl84OworCQllbHNlCisJCQljdHJsIHw9IEFQQl9ETUFfU09VUkNFX0lOQ18yXzg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM6CisJCWN0cmwgJj0gfkFQQl9ETUFfREFUQV9XSURUSDsKKwkJaWYgKGNoLT5jZmcuZGlyZWN0aW9uICE9IERNQV9NRU1fVE9fREVWKQorCQkJY3RybCB8PSBBUEJfRE1BX0RFU1RfSU5DXzRfMTY7CisJCWVsc2UKKwkJCWN0cmwgfD0gQVBCX0RNQV9TT1VSQ0VfSU5DXzRfMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaC0+Y2ZnLmRpcmVjdGlvbiA9PSBETUFfTUVNX1RPX0RFVikgeworCQljdHJsICY9IH5BUEJfRE1BX0RFU1RfU0VMRUNUOworCQljdHJsIHw9IEFQQl9ETUFfU09VUkNFX1NFTEVDVDsKKwkJY3RybCB8PSAoY2gtPmxpbmVfcmVxbm8gPDwgMTYgJgorCQkJIEFQQl9ETUFfREVTVF9SRVFfTk9fTUFTSyk7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBBUEJfRE1BX0RFU1RfU0VMRUNUOworCQljdHJsICY9IH5BUEJfRE1BX1NPVVJDRV9TRUxFQ1Q7CisJCWN0cmwgfD0gKGNoLT5saW5lX3JlcW5vIDw8IDI0ICYKKwkJCSBBUEJfRE1BX1NPVVJDRV9SRVFfTk9fTUFTSyk7CisJfQorCisJd3JpdGVsKGN0cmwsIGNoLT5iYXNlICsgUkVHX09GRl9DVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1veGFydF9jb250cm9sKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfY3RybF9jbWQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBETUFfUEFVU0U6CisJY2FzZSBETUFfUkVTVU1FOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIERNQV9URVJNSU5BVEVfQUxMOgorCQltb3hhcnRfdGVybWluYXRlX2FsbChjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQ09ORklHOgorCQlyZXQgPSBtb3hhcnRfc2xhdmVfY29uZmlnKGNoYW4sIChzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqKWFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqbW94YXJ0X3ByZXBfc2xhdmVfc2coCisJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwl1bnNpZ25lZCBpbnQgc2dfbGVuLCBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCXVuc2lnbmVkIGxvbmcgdHhfZmxhZ3MsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG1veGFydF9jaGFuICpjaCA9IHRvX21veGFydF9kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgbW94YXJ0X2Rlc2MgKmQ7CisJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggZGV2X3dpZHRoOworCWRtYV9hZGRyX3QgZGV2X2FkZHI7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2VudDsKKwl1bnNpZ25lZCBpbnQgZXM7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWlzX3NsYXZlX2RpcmVjdGlvbihkaXIpKSB7CisJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiksICIlczogaW52YWxpZCBETUEgZGlyZWN0aW9uXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZGlyID09IERNQV9ERVZfVE9fTUVNKSB7CisJCWRldl9hZGRyID0gY2gtPmNmZy5zcmNfYWRkcjsKKwkJZGV2X3dpZHRoID0gY2gtPmNmZy5zcmNfYWRkcl93aWR0aDsKKwl9IGVsc2UgeworCQlkZXZfYWRkciA9IGNoLT5jZmcuZHN0X2FkZHI7CisJCWRldl93aWR0aCA9IGNoLT5jZmcuZHN0X2FkZHJfd2lkdGg7CisJfQorCisJc3dpdGNoIChkZXZfd2lkdGgpIHsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6CisJCWVzID0gTU9YQVJUX0RNQV9EQVRBX1RZUEVfUzg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM6CisJCWVzID0gTU9YQVJUX0RNQV9EQVRBX1RZUEVfUzE2OworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQllcyA9IE1PWEFSVF9ETUFfREFUQV9UWVBFX1MzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihjaGFuMmRldihjaGFuKSwgIiVzOiB1bnN1cHBvcnRlZCBkYXRhIHdpZHRoICgldSlcbiIsCisJCQlfX2Z1bmNfXywgZGV2X3dpZHRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSArIHNnX2xlbiAqIHNpemVvZihkLT5zZ1swXSksIEdGUF9BVE9NSUMpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkLT5kbWFfZGlyID0gZGlyOworCWQtPmRldl9hZGRyID0gZGV2X2FkZHI7CisJZC0+ZXMgPSBlczsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2dlbnQsIHNnX2xlbiwgaSkgeworCQlkLT5zZ1tpXS5hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dlbnQpOworCQlkLT5zZ1tpXS5sZW4gPSBzZ19kbWFfbGVuKHNnZW50KTsKKwl9CisKKwlkLT5zZ2xlbiA9IHNnX2xlbjsKKworCWNoLT5lcnJvciA9IDA7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmY2gtPnZjLCAmZC0+dmQsIHR4X2ZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqbW94YXJ0X29mX3hsYXRlKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmRtYV9zcGVjLAorCQkJCQlzdHJ1Y3Qgb2ZfZG1hICpvZmRtYSkKK3sKKwlzdHJ1Y3QgbW94YXJ0X2RtYWRldiAqbWRjID0gb2ZkbWEtPm9mX2RtYV9kYXRhOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoOworCisJY2hhbiA9IGRtYV9nZXRfYW55X3NsYXZlX2NoYW5uZWwoJm1kYy0+ZG1hX3NsYXZlKTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJY2ggPSB0b19tb3hhcnRfZG1hX2NoYW4oY2hhbik7CisJY2gtPmxpbmVfcmVxbm8gPSBkbWFfc3BlYy0+YXJnc1swXTsKKworCXJldHVybiBjaGFuOworfQorCitzdGF0aWMgaW50IG1veGFydF9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG1veGFydF9jaGFuICpjaCA9IHRvX21veGFydF9kbWFfY2hhbihjaGFuKTsKKworCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICIlczogYWxsb2NhdGluZyBjaGFubmVsICMldVxuIiwKKwkJX19mdW5jX18sIGNoLT5jaF9udW0pOworCWNoLT5hbGxvY2F0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFydF9mcmVlX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoID0gdG9fbW94YXJ0X2RtYV9jaGFuKGNoYW4pOworCisJdmNoYW5fZnJlZV9jaGFuX3Jlc291cmNlcygmY2gtPnZjKTsKKworCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICIlczogZnJlZWluZyBjaGFubmVsICMldVxuIiwKKwkJX19mdW5jX18sIGNoLT5jaF9udW0pOworCWNoLT5hbGxvY2F0ZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBtb3hhcnRfZG1hX3NldF9wYXJhbXMoc3RydWN0IG1veGFydF9jaGFuICpjaCwgZG1hX2FkZHJfdCBzcmNfYWRkciwKKwkJCQkgIGRtYV9hZGRyX3QgZHN0X2FkZHIpCit7CisJd3JpdGVsKHNyY19hZGRyLCBjaC0+YmFzZSArIFJFR19PRkZfQUREUkVTU19TT1VSQ0UpOworCXdyaXRlbChkc3RfYWRkciwgY2gtPmJhc2UgKyBSRUdfT0ZGX0FERFJFU1NfREVTVCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFydF9zZXRfdHJhbnNmZXJfcGFyYW1zKHN0cnVjdCBtb3hhcnRfY2hhbiAqY2gsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IG1veGFydF9kZXNjICpkID0gY2gtPmRlc2M7CisJdW5zaWduZWQgaW50IHNnbGVuX2RpdiA9IGVzX2J5dGVzW2QtPmVzXTsKKworCWQtPmRtYV9jeWNsZXMgPSBsZW4gPj4gc2dsZW5fZGl2OworCisJLyoKKwkgKiBUaGVyZSBhcmUgNCBjeWNsZXMgb24gNjQgYnl0ZXMgY29waWVkLCBpLmUuIG9uZSBjeWNsZSBjb3BpZXMgMTYKKwkgKiBieXRlcyAoIHdoZW4gd2lkdGggaXMgQVBCX0RNQUJfREFUQV9XSURUSF80ICkuCisJICovCisJd3JpdGVsKGQtPmRtYV9jeWNsZXMsIGNoLT5iYXNlICsgUkVHX09GRl9DWUNMRVMpOworCisJZGV2X2RiZyhjaGFuMmRldigmY2gtPnZjLmNoYW4pLCAiJXM6IHNldCAldSBETUEgY3ljbGVzIChsZW49JXUpXG4iLAorCQlfX2Z1bmNfXywgZC0+ZG1hX2N5Y2xlcywgbGVuKTsKK30KKworc3RhdGljIHZvaWQgbW94YXJ0X3N0YXJ0X2RtYShzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoKQoreworCXUzMiBjdHJsOworCisJY3RybCA9IHJlYWRsKGNoLT5iYXNlICsgUkVHX09GRl9DVFJMKTsKKwljdHJsIHw9IChBUEJfRE1BX0VOQUJMRSB8IEFQQl9ETUFfRklOX0lOVF9FTiB8IEFQQl9ETUFfRVJSX0lOVF9FTik7CisJd3JpdGVsKGN0cmwsIGNoLT5iYXNlICsgUkVHX09GRl9DVFJMKTsKK30KKworc3RhdGljIHZvaWQgbW94YXJ0X2RtYV9zdGFydF9zZyhzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoLCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBtb3hhcnRfZGVzYyAqZCA9IGNoLT5kZXNjOworCXN0cnVjdCBtb3hhcnRfc2cgKnNnID0gY2gtPmRlc2MtPnNnICsgaWR4OworCisJaWYgKGNoLT5kZXNjLT5kbWFfZGlyID09IERNQV9NRU1fVE9fREVWKQorCQltb3hhcnRfZG1hX3NldF9wYXJhbXMoY2gsIHNnLT5hZGRyLCBkLT5kZXZfYWRkcik7CisJZWxzZSBpZiAoY2gtPmRlc2MtPmRtYV9kaXIgPT0gRE1BX0RFVl9UT19NRU0pCisJCW1veGFydF9kbWFfc2V0X3BhcmFtcyhjaCwgZC0+ZGV2X2FkZHIsIHNnLT5hZGRyKTsKKworCW1veGFydF9zZXRfdHJhbnNmZXJfcGFyYW1zKGNoLCBzZy0+bGVuKTsKKworCW1veGFydF9zdGFydF9kbWEoY2gpOworfQorCitzdGF0aWMgdm9pZCBtb3hhcnRfZG1hX3N0YXJ0X2Rlc2Moc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtb3hhcnRfY2hhbiAqY2ggPSB0b19tb3hhcnRfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkOworCisJdmQgPSB2Y2hhbl9uZXh0X2Rlc2MoJmNoLT52Yyk7CisKKwlpZiAoIXZkKSB7CisJCWNoLT5kZXNjID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGVsKCZ2ZC0+bm9kZSk7CisKKwljaC0+ZGVzYyA9IHRvX21veGFydF9kbWFfZGVzYygmdmQtPnR4KTsKKwljaC0+c2dpZHggPSAwOworCisJbW94YXJ0X2RtYV9zdGFydF9zZyhjaCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFydF9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoID0gdG9fbW94YXJ0X2RtYV9jaGFuKGNoYW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKKwlpZiAodmNoYW5faXNzdWVfcGVuZGluZygmY2gtPnZjKSAmJiAhY2gtPmRlc2MpCisJCW1veGFydF9kbWFfc3RhcnRfZGVzYyhjaGFuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+dmMubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc2l6ZV90IG1veGFydF9kbWFfZGVzY19zaXplKHN0cnVjdCBtb3hhcnRfZGVzYyAqZCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY29tcGxldGVkX3NncykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3Qgc2l6ZTsKKworCWZvciAoc2l6ZSA9IGkgPSBjb21wbGV0ZWRfc2dzOyBpIDwgZC0+c2dsZW47IGkrKykKKwkJc2l6ZSArPSBkLT5zZ1tpXS5sZW47CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBtb3hhcnRfZG1hX2Rlc2Nfc2l6ZV9pbl9mbGlnaHQoc3RydWN0IG1veGFydF9jaGFuICpjaCkKK3sKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY29tcGxldGVkX2N5Y2xlcywgY3ljbGVzOworCisJc2l6ZSA9IG1veGFydF9kbWFfZGVzY19zaXplKGNoLT5kZXNjLCBjaC0+c2dpZHgpOworCWN5Y2xlcyA9IHJlYWRsKGNoLT5iYXNlICsgUkVHX09GRl9DWUNMRVMpOworCWNvbXBsZXRlZF9jeWNsZXMgPSAoY2gtPmRlc2MtPmRtYV9jeWNsZXMgLSBjeWNsZXMpOworCXNpemUgLT0gY29tcGxldGVkX2N5Y2xlcyA8PCBlc19ieXRlc1tjaC0+ZGVzYy0+ZXNdOworCisJZGV2X2RiZyhjaGFuMmRldigmY2gtPnZjLmNoYW4pLCAiJXM6IHNpemU9JXp1XG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGVudW0gZG1hX3N0YXR1cyBtb3hhcnRfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJCQkJZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJCQkJc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKK3sKKwlzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoID0gdG9fbW94YXJ0X2RtYV9jaGFuKGNoYW4pOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKKwlzdHJ1Y3QgbW94YXJ0X2Rlc2MgKmQ7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBkbWFfY29va2llX3N0YXR1cygpIGFzc2lnbnMgaW5pdGlhbCByZXNpZHVlIHZhbHVlLgorCSAqLworCXJldCA9IGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKKwl2ZCA9IHZjaGFuX2ZpbmRfZGVzYygmY2gtPnZjLCBjb29raWUpOworCWlmICh2ZCkgeworCQlkID0gdG9fbW94YXJ0X2RtYV9kZXNjKCZ2ZC0+dHgpOworCQl0eHN0YXRlLT5yZXNpZHVlID0gbW94YXJ0X2RtYV9kZXNjX3NpemUoZCwgMCk7CisJfSBlbHNlIGlmIChjaC0+ZGVzYyAmJiBjaC0+ZGVzYy0+dmQudHguY29va2llID09IGNvb2tpZSkgeworCQl0eHN0YXRlLT5yZXNpZHVlID0gbW94YXJ0X2RtYV9kZXNjX3NpemVfaW5fZmxpZ2h0KGNoKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKKworCWlmIChjaC0+ZXJyb3IpCisJCXJldHVybiBETUFfRVJST1I7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtb3hhcnRfZG1hX2luaXQoc3RydWN0IGRtYV9kZXZpY2UgKmRtYSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWRtYS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2cJCT0gbW94YXJ0X3ByZXBfc2xhdmVfc2c7CisJZG1hLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMJPSBtb3hhcnRfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZG1hLT5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcwkJPSBtb3hhcnRfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nCQk9IG1veGFydF9pc3N1ZV9wZW5kaW5nOworCWRtYS0+ZGV2aWNlX3R4X3N0YXR1cwkJCT0gbW94YXJ0X3R4X3N0YXR1czsKKwlkbWEtPmRldmljZV9jb250cm9sCQkJPSBtb3hhcnRfY29udHJvbDsKKwlkbWEtPmRldgkJCQk9IGRldjsKKworCUlOSVRfTElTVF9IRUFEKCZkbWEtPmNoYW5uZWxzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1veGFydF9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBtb3hhcnRfZG1hZGV2ICptYyA9IGRldmlkOworCXN0cnVjdCBtb3hhcnRfY2hhbiAqY2ggPSAmbWMtPnNsYXZlX2NoYW5zWzBdOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGN0cmw7CisKKwlkZXZfZGJnKGNoYW4yZGV2KCZjaC0+dmMuY2hhbiksICIlc1xuIiwgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IEFQQl9ETUFfTUFYX0NIQU5ORUw7IGkrKywgY2grKykgeworCQlpZiAoIWNoLT5hbGxvY2F0ZWQpCisJCQljb250aW51ZTsKKworCQljdHJsID0gcmVhZGwoY2gtPmJhc2UgKyBSRUdfT0ZGX0NUUkwpOworCisJCWRldl9kYmcoY2hhbjJkZXYoJmNoLT52Yy5jaGFuKSwgIiVzOiBjaD0lcCBjaC0+YmFzZT0lcCBjdHJsPSV4XG4iLAorCQkJX19mdW5jX18sIGNoLCBjaC0+YmFzZSwgY3RybCk7CisKKwkJaWYgKGN0cmwgJiBBUEJfRE1BX0ZJTl9JTlRfU1RTKSB7CisJCQljdHJsICY9IH5BUEJfRE1BX0ZJTl9JTlRfU1RTOworCQkJaWYgKGNoLT5kZXNjKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT52Yy5sb2NrLCBmbGFncyk7CisJCQkJaWYgKCsrY2gtPnNnaWR4IDwgY2gtPmRlc2MtPnNnbGVuKSB7CisJCQkJCW1veGFydF9kbWFfc3RhcnRfc2coY2gsIGNoLT5zZ2lkeCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZjaC0+ZGVzYy0+dmQpOworCQkJCQltb3hhcnRfZG1hX3N0YXJ0X2Rlc2MoJmNoLT52Yy5jaGFuKTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCisJCWlmIChjdHJsICYgQVBCX0RNQV9FUlJfSU5UX1NUUykgeworCQkJY3RybCAmPSB+QVBCX0RNQV9FUlJfSU5UX1NUUzsKKwkJCWNoLT5lcnJvciA9IDE7CisJCX0KKworCQl3cml0ZWwoY3RybCwgY2gtPmJhc2UgKyBSRUdfT0ZGX0NUUkwpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtb3hhcnRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdGF0aWMgdm9pZCBfX2lvbWVtICpkbWFfYmFzZV9hZGRyOworCWludCByZXQsIGk7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdHJ1Y3QgbW94YXJ0X2NoYW4gKmNoOworCXN0cnVjdCBtb3hhcnRfZG1hZGV2ICptZGM7CisKKwltZGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm1kYyksIEdGUF9LRVJORUwpOworCWlmICghbWRjKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgYWxsb2NhdGUgRE1BIGNvbnRhaW5lclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCWRldl9lcnIoZGV2LCAibm8gSVJRIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlkbWFfYmFzZV9hZGRyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRtYV9iYXNlX2FkZHIpKQorCQlyZXR1cm4gUFRSX0VSUihkbWFfYmFzZV9hZGRyKTsKKworCWRtYV9jYXBfemVybyhtZGMtPmRtYV9zbGF2ZS5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtZGMtPmRtYV9zbGF2ZS5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1BSSVZBVEUsIG1kYy0+ZG1hX3NsYXZlLmNhcF9tYXNrKTsKKworCW1veGFydF9kbWFfaW5pdCgmbWRjLT5kbWFfc2xhdmUsIGRldik7CisKKwljaCA9ICZtZGMtPnNsYXZlX2NoYW5zWzBdOworCWZvciAoaSA9IDA7IGkgPCBBUEJfRE1BX01BWF9DSEFOTkVMOyBpKyssIGNoKyspIHsKKwkJY2gtPmNoX251bSA9IGk7CisJCWNoLT5iYXNlID0gZG1hX2Jhc2VfYWRkciArIGkgKiBSRUdfT0ZGX0NIQU5fU0laRTsKKwkJY2gtPmFsbG9jYXRlZCA9IDA7CisKKwkJY2gtPnZjLmRlc2NfZnJlZSA9IG1veGFydF9kbWFfZGVzY19mcmVlOworCQl2Y2hhbl9pbml0KCZjaC0+dmMsICZtZGMtPmRtYV9zbGF2ZSk7CisKKwkJZGV2X2RiZyhkZXYsICIlczogY2hzWyVkXTogY2gtPmNoX251bT0ldSBjaC0+YmFzZT0lcFxuIiwKKwkJCV9fZnVuY19fLCBpLCBjaC0+Y2hfbnVtLCBjaC0+YmFzZSk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWRjKTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIG1veGFydF9kbWFfaW50ZXJydXB0LCAwLAorCQkJICAgICAgICJtb3hhcnQtZG1hLWVuZ2luZSIsIG1kYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRldm1fcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZtZGMtPmRtYV9zbGF2ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3Rlcihub2RlLCBtb3hhcnRfb2ZfeGxhdGUsIG1kYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIm9mX2RtYV9jb250cm9sbGVyX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmbWRjLT5kbWFfc2xhdmUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoZGV2LCAiJXM6IElSUT0ldVxuIiwgX19mdW5jX18sIGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3hhcnRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1veGFydF9kbWFkZXYgKm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmbS0+ZG1hX3NsYXZlKTsKKworCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbW94YXJ0X2RtYV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibW94YSxtb3hhcnQtZG1hIiB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbW94YXJ0X2RyaXZlciA9IHsKKwkucHJvYmUJPSBtb3hhcnRfcHJvYmUsCisJLnJlbW92ZQk9IG1veGFydF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gIm1veGFydC1kbWEtZW5naW5lIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBtb3hhcnRfZG1hX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IG1veGFydF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbW94YXJ0X2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwobW94YXJ0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbW94YXJ0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbW94YXJ0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtb3hhcnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkpvbmFzIEplbnNlbiA8am9uYXMuamVuc2VuQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTU9YQVJUIERNQSBlbmdpbmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jIGIvZHJpdmVycy9kbWEvb21hcC1kbWEuYwppbmRleCAyZjY2Y2Y0Li4zNjJlN2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL29tYXAtZG1hLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogewogCXN0cnVjdCBvbWFwX2NoYW4gKmMgPSB0b19vbWFwX2RtYV9jaGFuKGNoYW4pOwogCi0JZGV2X2luZm8oYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgImFsbG9jYXRpbmcgY2hhbm5lbCBmb3IgJXVcbiIsIGMtPmRtYV9zaWcpOworCWRldl9kYmcoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgImFsbG9jYXRpbmcgY2hhbm5lbCBmb3IgJXVcbiIsIGMtPmRtYV9zaWcpOwogCiAJcmV0dXJuIG9tYXBfcmVxdWVzdF9kbWEoYy0+ZG1hX3NpZywgIkRNQSBlbmdpbmUiLAogCQlvbWFwX2RtYV9jYWxsYmFjaywgYywgJmMtPmRtYV9jaCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAl2Y2hhbl9mcmVlX2NoYW5fcmVzb3VyY2VzKCZjLT52Yyk7CiAJb21hcF9mcmVlX2RtYShjLT5kbWFfY2gpOwogCi0JZGV2X2luZm8oYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgImZyZWVpbmcgY2hhbm5lbCBmb3IgJXVcbiIsIGMtPmRtYV9zaWcpOworCWRldl9kYmcoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgImZyZWVpbmcgY2hhbm5lbCBmb3IgJXVcbiIsIGMtPmRtYV9zaWcpOwogfQogCiBzdGF0aWMgc2l6ZV90IG9tYXBfZG1hX3NnX3NpemUoc3RydWN0IG9tYXBfc2cgKnNnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGwzMzAuYyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKaW5kZXggYzkwZWRlYy4uNzNmYTliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcGwzMzAuYworKysgYi9kcml2ZXJzL2RtYS9wbDMzMC5jCkBAIC01NDMsNyArNTQzLDkgQEAKIAkvKiBETUEtRW5naW5lIENoYW5uZWwgKi8KIAlzdHJ1Y3QgZG1hX2NoYW4gY2hhbjsKIAotCS8qIExpc3Qgb2YgdG8gYmUgeGZlcmVkIGRlc2NyaXB0b3JzICovCisJLyogTGlzdCBvZiBzdWJtaXR0ZWQgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1Ym1pdHRlZF9saXN0OworCS8qIExpc3Qgb2YgaXNzdWVkIGRlc2NyaXB0b3JzICovCiAJc3RydWN0IGxpc3RfaGVhZCB3b3JrX2xpc3Q7CiAJLyogTGlzdCBvZiBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbXBsZXRlZF9saXN0OwpAQCAtNTc4LDEyICs1ODAsMTYgQEAKIAkvKiBETUEtRW5naW5lIERldmljZSAqLwogCXN0cnVjdCBkbWFfZGV2aWNlIGRkbWE7CiAKKwkvKiBIb2xkcyBpbmZvIGFib3V0IHNnIGxpbWl0YXRpb25zICovCisJc3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycyBkbWFfcGFybXM7CisKIAkvKiBQb29sIG9mIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSBmb3IgdGhlIERNQUMncyBjaGFubmVscyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZGVzY19wb29sOwogCS8qIFRvIHByb3RlY3QgZGVzY19wb29sIG1hbmlwdWxhdGlvbiAqLwogCXNwaW5sb2NrX3QgcG9vbF9sb2NrOwogCiAJLyogUGVyaXBoZXJhbCBjaGFubmVscyBjb25uZWN0ZWQgdG8gdGhpcyBETUFDICovCisJdW5zaWduZWQgaW50IG51bV9wZXJpcGhlcmFsczsKIAlzdHJ1Y3QgZG1hX3BsMzMwX2NoYW4gKnBlcmlwaGVyYWxzOyAvKiBrZWVwIGF0IGVuZCAqLwogfTsKIApAQCAtNjA2LDExICs2MTIsNiBAQAogCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoYW47CiB9OwogCi1zdHJ1Y3QgZG1hX3BsMzMwX2ZpbHRlcl9hcmdzIHsKLQlzdHJ1Y3QgZG1hX3BsMzMwX2RtYWMgKnBkbWFjOwotCXVuc2lnbmVkIGludCBjaGFuX2lkOwotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIF9jYWxsYmFjayhzdHJ1Y3QgcGwzMzBfcmVxICpyLCBlbnVtIHBsMzMwX29wX2VyciBlcnIpCiB7CiAJaWYgKHIgJiYgci0+eGZlcl9jYikKQEAgLTIyOTgsMTYgKzIyOTksNiBAQAogCXRhc2tsZXRfc2NoZWR1bGUoJnBjaC0+dGFzayk7CiB9CiAKLXN0YXRpYyBib29sIHBsMzMwX2R0X2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQotewotCXN0cnVjdCBkbWFfcGwzMzBfZmlsdGVyX2FyZ3MgKmZhcmdzID0gcGFyYW07Ci0KLQlpZiAoY2hhbi0+ZGV2aWNlICE9ICZmYXJncy0+cGRtYWMtPmRkbWEpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiAoY2hhbi0+Y2hhbl9pZCA9PSBmYXJncy0+Y2hhbl9pZCk7Ci19Ci0KIGJvb2wgcGwzMzBfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCiB7CiAJdTggKnBlcmlfaWQ7CkBAIC0yMzI1LDIzICsyMzE2LDE2IEBACiB7CiAJaW50IGNvdW50ID0gZG1hX3NwZWMtPmFyZ3NfY291bnQ7CiAJc3RydWN0IGRtYV9wbDMzMF9kbWFjICpwZG1hYyA9IG9mZG1hLT5vZl9kbWFfZGF0YTsKLQlzdHJ1Y3QgZG1hX3BsMzMwX2ZpbHRlcl9hcmdzIGZhcmdzOwotCWRtYV9jYXBfbWFza190IGNhcDsKLQotCWlmICghcGRtYWMpCi0JCXJldHVybiBOVUxMOworCXVuc2lnbmVkIGludCBjaGFuX2lkOwogCiAJaWYgKGNvdW50ICE9IDEpCiAJCXJldHVybiBOVUxMOwogCi0JZmFyZ3MucGRtYWMgPSBwZG1hYzsKLQlmYXJncy5jaGFuX2lkID0gZG1hX3NwZWMtPmFyZ3NbMF07CisJY2hhbl9pZCA9IGRtYV9zcGVjLT5hcmdzWzBdOworCWlmIChjaGFuX2lkID49IHBkbWFjLT5udW1fcGVyaXBoZXJhbHMpCisJCXJldHVybiBOVUxMOwogCi0JZG1hX2NhcF96ZXJvKGNhcCk7Ci0JZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBjYXApOwotCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMsIGNhcCk7Ci0KLQlyZXR1cm4gZG1hX3JlcXVlc3RfY2hhbm5lbChjYXAsIHBsMzMwX2R0X2ZpbHRlciwgJmZhcmdzKTsKKwlyZXR1cm4gZG1hX2dldF9zbGF2ZV9jaGFubmVsKCZwZG1hYy0+cGVyaXBoZXJhbHNbY2hhbl9pZF0uY2hhbik7CiB9CiAKIHN0YXRpYyBpbnQgcGwzMzBfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQpAQCAtMjM4NSw2ICsyMzY5LDExIEBACiAJCXBsMzMwX2NoYW5fY3RybChwY2gtPnBsMzMwX2NoaWQsIFBMMzMwX09QX0ZMVVNIKTsKIAogCQkvKiBNYXJrIGFsbCBkZXNjIGRvbmUgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXNjLCAmcGNoLT5zdWJtaXR0ZWRfbGlzdCwgbm9kZSkgeworCQkJZGVzYy0+c3RhdHVzID0gRlJFRTsKKwkJCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPnR4ZCk7CisJCX0KKwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZwY2gtPndvcmtfbGlzdCAsIG5vZGUpIHsKIAkJCWRlc2MtPnN0YXR1cyA9IEZSRUU7CiAJCQlkbWFfY29va2llX2NvbXBsZXRlKCZkZXNjLT50eGQpOwpAQCAtMjM5NSw2ICsyMzg0LDcgQEAKIAkJCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPnR4ZCk7CiAJCX0KIAorCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJnBjaC0+c3VibWl0dGVkX2xpc3QsICZwZG1hYy0+ZGVzY19wb29sKTsKIAkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZwY2gtPndvcmtfbGlzdCwgJnBkbWFjLT5kZXNjX3Bvb2wpOwogCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJnBjaC0+Y29tcGxldGVkX2xpc3QsICZwZG1hYy0+ZGVzY19wb29sKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CkBAIC0yNDUzLDcgKzI0NDMsMTQgQEAKIAogc3RhdGljIHZvaWQgcGwzMzBfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7Ci0JcGwzMzBfdGFza2xldCgodW5zaWduZWQgbG9uZykgdG9fcGNoYW4oY2hhbikpOworCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoID0gdG9fcGNoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnBjaC0+c3VibWl0dGVkX2xpc3QsICZwY2gtPndvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CisKKwlwbDMzMF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBjaCk7CiB9CiAKIC8qCkBAIC0yNDgwLDExICsyNDc3LDExIEBACiAKIAkJZG1hX2Nvb2tpZV9hc3NpZ24oJmRlc2MtPnR4ZCk7CiAKLQkJbGlzdF9tb3ZlX3RhaWwoJmRlc2MtPm5vZGUsICZwY2gtPndvcmtfbGlzdCk7CisJCWxpc3RfbW92ZV90YWlsKCZkZXNjLT5ub2RlLCAmcGNoLT5zdWJtaXR0ZWRfbGlzdCk7CiAJfQogCiAJY29va2llID0gZG1hX2Nvb2tpZV9hc3NpZ24oJmxhc3QtPnR4ZCk7Ci0JbGlzdF9hZGRfdGFpbCgmbGFzdC0+bm9kZSwgJnBjaC0+d29ya19saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZsYXN0LT5ub2RlLCAmcGNoLT5zdWJtaXR0ZWRfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gY29va2llOwpAQCAtMjk2MCw2ICsyOTU3LDggQEAKIAllbHNlCiAJCW51bV9jaGFuID0gbWF4X3QoaW50LCBwaS0+cGNmZy5udW1fcGVyaSwgcGktPnBjZmcubnVtX2NoYW4pOwogCisJcGRtYWMtPm51bV9wZXJpcGhlcmFscyA9IG51bV9jaGFuOworCiAJcGRtYWMtPnBlcmlwaGVyYWxzID0ga3phbGxvYyhudW1fY2hhbiAqIHNpemVvZigqcGNoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZG1hYy0+cGVyaXBoZXJhbHMpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTI5NzQsNiArMjk3Myw3IEBACiAJCWVsc2UKIAkJCXBjaC0+Y2hhbi5wcml2YXRlID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKKwkJSU5JVF9MSVNUX0hFQUQoJnBjaC0+c3VibWl0dGVkX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmcGNoLT53b3JrX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmcGNoLT5jb21wbGV0ZWRfbGlzdCk7CiAJCXNwaW5fbG9ja19pbml0KCZwY2gtPmxvY2spOwpAQCAtMzAyMSw2ICszMDIxLDkgQEAKIAkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgRE1BIHRvIHRoZSBnZW5lcmljIERUIERNQSBoZWxwZXJzXG4iKTsKIAkJfQogCX0KKworCWFkZXYtPmRldi5kbWFfcGFybXMgPSAmcGRtYWMtPmRtYV9wYXJtczsKKwogCS8qCiAJICogVGhpcyBpcyB0aGUgbGltaXQgZm9yIHRyYW5zZmVycyB3aXRoIGEgYnVzd2lkdGggb2YgMSwgbGFyZ2VyCiAJICogYnVzd2lkdGhzIHdpbGwgaGF2ZSBsYXJnZXIgbGltaXRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcHBjNHh4L2FkbWEuYyBiL2RyaXZlcnMvZG1hL3BwYzR4eC9hZG1hLmMKaW5kZXggOGJiYTI5OC4uY2U3YThkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcHBjNHh4L2FkbWEuYworKysgYi9kcml2ZXJzL2RtYS9wcGM0eHgvYWRtYS5jCkBAIC00MTE0LDYgKzQxMTQsNyBAQAogCXJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYgKCFyZWdzKSB7CiAJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCByZWdzIVxuIik7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3JlZ3NfYWxsb2M7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaXJmLWRtYS5jIGIvZHJpdmVycy9kbWEvc2lyZi1kbWEuYwppbmRleCA2YWVjM2FkLi5kNGQzYTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaXJmLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3NpcmYtZG1hLmMKQEAgLTY0MCw2ICs2NDAsMjUgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2lyZnNvY19kbWFfZmlsdGVyX2lkKTsKIAorI2RlZmluZSBTSVJGU09DX0RNQV9CVVNXSURUSFMgXAorCShCSVQoRE1BX1NMQVZFX0JVU1dJRFRIX1VOREVGSU5FRCkgfCBcCisJQklUKERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEUpIHwgXAorCUJJVChETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUykgfCBcCisJQklUKERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKSB8IFwKKwlCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzhfQllURVMpKQorCitzdGF0aWMgaW50IHNpcmZzb2NfZG1hX2RldmljZV9zbGF2ZV9jYXBzKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sCisJc3RydWN0IGRtYV9zbGF2ZV9jYXBzICpjYXBzKQoreworCWNhcHMtPnNyY19hZGRyX3dpZHRocyA9IFNJUkZTT0NfRE1BX0JVU1dJRFRIUzsKKwljYXBzLT5kc3RuX2FkZHJfd2lkdGhzID0gU0lSRlNPQ19ETUFfQlVTV0lEVEhTOworCWNhcHMtPmRpcmVjdGlvbnMgPSBCSVQoRE1BX0RFVl9UT19NRU0pIHwgQklUKERNQV9NRU1fVE9fREVWKTsKKwljYXBzLT5jbWRfcGF1c2UgPSB0cnVlOworCWNhcHMtPmNtZF90ZXJtaW5hdGUgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc2lyZnNvY19kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IG9wLT5kZXYub2Zfbm9kZTsKQEAgLTcxMiw2ICs3MzEsNyBAQAogCWRtYS0+ZGV2aWNlX3R4X3N0YXR1cyA9IHNpcmZzb2NfZG1hX3R4X3N0YXR1czsKIAlkbWEtPmRldmljZV9wcmVwX2ludGVybGVhdmVkX2RtYSA9IHNpcmZzb2NfZG1hX3ByZXBfaW50ZXJsZWF2ZWQ7CiAJZG1hLT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gc2lyZnNvY19kbWFfcHJlcF9jeWNsaWM7CisJZG1hLT5kZXZpY2Vfc2xhdmVfY2FwcyA9IHNpcmZzb2NfZG1hX2RldmljZV9zbGF2ZV9jYXBzOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRtYS0+Y2hhbm5lbHMpOwogCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgZG1hLT5jYXBfbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90ZWdyYTIwLWFwYi1kbWEuYyBiL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCmluZGV4IGQxMWJiMzYuLjAzYWQ2NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCkBAIC0xMDAsNiArMTAwLDExIEBACiAjZGVmaW5lIFRFR1JBX0FQQkRNQV9BUEJTRVFfREFUQV9TV0FQCQlCSVQoMjcpCiAjZGVmaW5lIFRFR1JBX0FQQkRNQV9BUEJTRVFfV1JBUF9XT1JEXzEJCSgxIDw8IDE2KQogCisvKiBUZWdyYTE0OCBzcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVEVHUkFfQVBCRE1BX0NIQU5fV0NPVU5UCQkweDIwCisKKyNkZWZpbmUgVEVHUkFfQVBCRE1BX0NIQU5fV09SRF9UUkFOU0ZFUgkJMHgyNAorCiAvKgogICogSWYgYW55IGJ1cnN0IGlzIGluIGZsaWdodCBhbmQgRE1BIHBhdXNlZCB0aGVuIHRoaXMgaXMgdGhlIHRpbWUgdG8gY29tcGxldGUKICAqIG9uLWZsaWdodCBidXJzdCBhbmQgdXBkYXRlIERNQSBzdGF0dXMgcmVnaXN0ZXIuCkBAIC0xMDksMjEgKzExNCwyMiBAQAogLyogQ2hhbm5lbCBiYXNlIGFkZHJlc3Mgb2Zmc2V0IGZyb20gQVBCRE1BIGJhc2UgYWRkcmVzcyAqLwogI2RlZmluZSBURUdSQV9BUEJETUFfQ0hBTk5FTF9CQVNFX0FERF9PRkZTRVQJMHgxMDAwCiAKLS8qIERNQSBjaGFubmVsIHJlZ2lzdGVyIHNwYWNlIHNpemUgKi8KLSNkZWZpbmUgVEVHUkFfQVBCRE1BX0NIQU5ORUxfUkVHSVNURVJfU0laRQkweDIwCi0KIHN0cnVjdCB0ZWdyYV9kbWE7CiAKIC8qCiAgKiB0ZWdyYV9kbWFfY2hpcF9kYXRhIFRlZ3JhIGNoaXAgc3BlY2lmaWMgRE1BIGRhdGEKICAqIEBucl9jaGFubmVsczogTnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSBpbiB0aGUgY29udHJvbGxlci4KKyAqIEBjaGFubmVsX3JlZ19zaXplOiBDaGFubmVsIHJlZ2lzdGVyIHNpemUvc3RyaWRlLgogICogQG1heF9kbWFfY291bnQ6IE1heGltdW0gRE1BIHRyYW5zZmVyIGNvdW50IHN1cHBvcnRlZCBieSBETUEgY29udHJvbGxlci4KICAqIEBzdXBwb3J0X2NoYW5uZWxfcGF1c2U6IFN1cHBvcnQgY2hhbm5lbCB3aXNlIHBhdXNlIG9mIGRtYS4KKyAqIEBzdXBwb3J0X3NlcGFyYXRlX3djb3VudF9yZWc6IFN1cHBvcnQgc2VwYXJhdGUgd29yZCBjb3VudCByZWdpc3Rlci4KICAqLwogc3RydWN0IHRlZ3JhX2RtYV9jaGlwX2RhdGEgewogCWludCBucl9jaGFubmVsczsKKwlpbnQgY2hhbm5lbF9yZWdfc2l6ZTsKIAlpbnQgbWF4X2RtYV9jb3VudDsKIAlib29sIHN1cHBvcnRfY2hhbm5lbF9wYXVzZTsKKwlib29sIHN1cHBvcnRfc2VwYXJhdGVfd2NvdW50X3JlZzsKIH07CiAKIC8qIERNQSBjaGFubmVsIHJlZ2lzdGVycyAqLwpAQCAtMTMzLDYgKzEzOSw3IEBACiAJdW5zaWduZWQgbG9uZwlhcGJfcHRyOwogCXVuc2lnbmVkIGxvbmcJYWhiX3NlcTsKIAl1bnNpZ25lZCBsb25nCWFwYl9zZXE7CisJdW5zaWduZWQgbG9uZwl3Y291bnQ7CiB9OwogCiAvKgpAQCAtNDI2LDYgKzQzMyw4IEBACiAJdGRjX3dyaXRlKHRkYywgVEVHUkFfQVBCRE1BX0NIQU5fQVBCUFRSLCBjaF9yZWdzLT5hcGJfcHRyKTsKIAl0ZGNfd3JpdGUodGRjLCBURUdSQV9BUEJETUFfQ0hBTl9BSEJTRVEsIGNoX3JlZ3MtPmFoYl9zZXEpOwogCXRkY193cml0ZSh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX0FIQlBUUiwgY2hfcmVncy0+YWhiX3B0cik7CisJaWYgKHRkYy0+dGRtYS0+Y2hpcF9kYXRhLT5zdXBwb3J0X3NlcGFyYXRlX3djb3VudF9yZWcpCisJCXRkY193cml0ZSh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX1dDT1VOVCwgY2hfcmVncy0+d2NvdW50KTsKIAogCS8qIFN0YXJ0IERNQSAqLwogCXRkY193cml0ZSh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX0NTUiwKQEAgLTQ2NSw2ICs0NzQsOSBAQAogCS8qIFNhZmUgdG8gcHJvZ3JhbSBuZXcgY29uZmlndXJhdGlvbiAqLwogCXRkY193cml0ZSh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX0FQQlBUUiwgbnNnX3JlcS0+Y2hfcmVncy5hcGJfcHRyKTsKIAl0ZGNfd3JpdGUodGRjLCBURUdSQV9BUEJETUFfQ0hBTl9BSEJQVFIsIG5zZ19yZXEtPmNoX3JlZ3MuYWhiX3B0cik7CisJaWYgKHRkYy0+dGRtYS0+Y2hpcF9kYXRhLT5zdXBwb3J0X3NlcGFyYXRlX3djb3VudF9yZWcpCisJCXRkY193cml0ZSh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX1dDT1VOVCwKKwkJCQkJCW5zZ19yZXEtPmNoX3JlZ3Mud2NvdW50KTsKIAl0ZGNfd3JpdGUodGRjLCBURUdSQV9BUEJETUFfQ0hBTl9DU1IsCiAJCQkJbnNnX3JlcS0+Y2hfcmVncy5jc3IgfCBURUdSQV9BUEJETUFfQ1NSX0VOQik7CiAJbnNnX3JlcS0+Y29uZmlndXJlZCA9IHRydWU7CkBAIC03MTgsNiArNzMwLDcgQEAKIAlzdHJ1Y3QgdGVncmFfZG1hX2Rlc2MgKmRtYV9kZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyB3Y291bnQ7CiAJYm9vbCB3YXNfYnVzeTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0ZGMtPmxvY2ssIGZsYWdzKTsKQEAgLTczOCw2ICs3NTEsMTAgQEAKIAkJdGRjLT5pc3JfaGFuZGxlcih0ZGMsIHRydWUpOwogCQlzdGF0dXMgPSB0ZGNfcmVhZCh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX1NUQVRVUyk7CiAJfQorCWlmICh0ZGMtPnRkbWEtPmNoaXBfZGF0YS0+c3VwcG9ydF9zZXBhcmF0ZV93Y291bnRfcmVnKQorCQl3Y291bnQgPSB0ZGNfcmVhZCh0ZGMsIFRFR1JBX0FQQkRNQV9DSEFOX1dPUkRfVFJBTlNGRVIpOworCWVsc2UKKwkJd2NvdW50ID0gc3RhdHVzOwogCiAJd2FzX2J1c3kgPSB0ZGMtPmJ1c3k7CiAJdGVncmFfZG1hX3N0b3AodGRjKTsKQEAgLTc0Niw3ICs3NjMsNyBAQAogCQlzZ3JlcSA9IGxpc3RfZmlyc3RfZW50cnkoJnRkYy0+cGVuZGluZ19zZ19yZXEsCiAJCQkJCXR5cGVvZigqc2dyZXEpLCBub2RlKTsKIAkJc2dyZXEtPmRtYV9kZXNjLT5ieXRlc190cmFuc2ZlcnJlZCArPQotCQkJCWdldF9jdXJyZW50X3hmZXJyZWRfY291bnQodGRjLCBzZ3JlcSwgc3RhdHVzKTsKKwkJCQlnZXRfY3VycmVudF94ZmVycmVkX2NvdW50KHRkYywgc2dyZXEsIHdjb3VudCk7CiAJfQogCXRlZ3JhX2RtYV9yZXN1bWUodGRjKTsKIApAQCAtOTA4LDYgKzkyNSwxNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgdm9pZCB0ZWdyYV9kbWFfcHJlcF93Y291bnQoc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICp0ZGMsCisJc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsX3JlZ3MgKmNoX3JlZ3MsIHUzMiBsZW4pCit7CisJdTMyIGxlbl9maWVsZCA9IChsZW4gLSA0KSAmIDB4RkZGQzsKKworCWlmICh0ZGMtPnRkbWEtPmNoaXBfZGF0YS0+c3VwcG9ydF9zZXBhcmF0ZV93Y291bnRfcmVnKQorCQljaF9yZWdzLT53Y291bnQgPSBsZW5fZmllbGQ7CisJZWxzZQorCQljaF9yZWdzLT5jc3IgfD0gbGVuX2ZpZWxkOworfQorCiBzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0ZWdyYV9kbWFfcHJlcF9zbGF2ZV9zZygKIAlzdHJ1Y3QgZG1hX2NoYW4gKmRjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IHNnX2xlbiwKIAllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyZWN0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzLApAQCAtOTkxLDcgKzEwMTksOCBAQAogCiAJCXNnX3JlcS0+Y2hfcmVncy5hcGJfcHRyID0gYXBiX3B0cjsKIAkJc2dfcmVxLT5jaF9yZWdzLmFoYl9wdHIgPSBtZW07Ci0JCXNnX3JlcS0+Y2hfcmVncy5jc3IgPSBjc3IgfCAoKGxlbiAtIDQpICYgMHhGRkZDKTsKKwkJc2dfcmVxLT5jaF9yZWdzLmNzciA9IGNzcjsKKwkJdGVncmFfZG1hX3ByZXBfd2NvdW50KHRkYywgJnNnX3JlcS0+Y2hfcmVncywgbGVuKTsKIAkJc2dfcmVxLT5jaF9yZWdzLmFwYl9zZXEgPSBhcGJfc2VxOwogCQlzZ19yZXEtPmNoX3JlZ3MuYWhiX3NlcSA9IGFoYl9zZXE7CiAJCXNnX3JlcS0+Y29uZmlndXJlZCA9IGZhbHNlOwpAQCAtMTEyMCw3ICsxMTQ5LDggQEAKIAkJYWhiX3NlcSB8PSBnZXRfYnVyc3Rfc2l6ZSh0ZGMsIGJ1cnN0X3NpemUsIHNsYXZlX2J3LCBsZW4pOwogCQlzZ19yZXEtPmNoX3JlZ3MuYXBiX3B0ciA9IGFwYl9wdHI7CiAJCXNnX3JlcS0+Y2hfcmVncy5haGJfcHRyID0gbWVtOwotCQlzZ19yZXEtPmNoX3JlZ3MuY3NyID0gY3NyIHwgKChsZW4gLSA0KSAmIDB4RkZGQyk7CisJCXNnX3JlcS0+Y2hfcmVncy5jc3IgPSBjc3I7CisJCXRlZ3JhX2RtYV9wcmVwX3djb3VudCh0ZGMsICZzZ19yZXEtPmNoX3JlZ3MsIGxlbik7CiAJCXNnX3JlcS0+Y2hfcmVncy5hcGJfc2VxID0gYXBiX3NlcTsKIAkJc2dfcmVxLT5jaF9yZWdzLmFoYl9zZXEgPSBhaGJfc2VxOwogCQlzZ19yZXEtPmNvbmZpZ3VyZWQgPSBmYWxzZTsKQEAgLTEyMzQsMjcgKzEyNjQsNDUgQEAKIC8qIFRlZ3JhMjAgc3BlY2lmaWMgRE1BIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZG1hX2NoaXBfZGF0YSB0ZWdyYTIwX2RtYV9jaGlwX2RhdGEgPSB7CiAJLm5yX2NoYW5uZWxzCQk9IDE2LAorCS5jaGFubmVsX3JlZ19zaXplCT0gMHgyMCwKIAkubWF4X2RtYV9jb3VudAkJPSAxMDI0VUwgKiA2NCwKIAkuc3VwcG9ydF9jaGFubmVsX3BhdXNlCT0gZmFsc2UsCisJLnN1cHBvcnRfc2VwYXJhdGVfd2NvdW50X3JlZyA9IGZhbHNlLAogfTsKIAogLyogVGVncmEzMCBzcGVjaWZpYyBETUEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9kbWFfY2hpcF9kYXRhIHRlZ3JhMzBfZG1hX2NoaXBfZGF0YSA9IHsKIAkubnJfY2hhbm5lbHMJCT0gMzIsCisJLmNoYW5uZWxfcmVnX3NpemUJPSAweDIwLAogCS5tYXhfZG1hX2NvdW50CQk9IDEwMjRVTCAqIDY0LAogCS5zdXBwb3J0X2NoYW5uZWxfcGF1c2UJPSBmYWxzZSwKKwkuc3VwcG9ydF9zZXBhcmF0ZV93Y291bnRfcmVnID0gZmFsc2UsCiB9OwogCiAvKiBUZWdyYTExNCBzcGVjaWZpYyBETUEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9kbWFfY2hpcF9kYXRhIHRlZ3JhMTE0X2RtYV9jaGlwX2RhdGEgPSB7CiAJLm5yX2NoYW5uZWxzCQk9IDMyLAorCS5jaGFubmVsX3JlZ19zaXplCT0gMHgyMCwKIAkubWF4X2RtYV9jb3VudAkJPSAxMDI0VUwgKiA2NCwKIAkuc3VwcG9ydF9jaGFubmVsX3BhdXNlCT0gdHJ1ZSwKKwkuc3VwcG9ydF9zZXBhcmF0ZV93Y291bnRfcmVnID0gZmFsc2UsCit9OworCisvKiBUZWdyYTE0OCBzcGVjaWZpYyBETUEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9kbWFfY2hpcF9kYXRhIHRlZ3JhMTQ4X2RtYV9jaGlwX2RhdGEgPSB7CisJLm5yX2NoYW5uZWxzCQk9IDMyLAorCS5jaGFubmVsX3JlZ19zaXplCT0gMHg0MCwKKwkubWF4X2RtYV9jb3VudAkJPSAxMDI0VUwgKiA2NCwKKwkuc3VwcG9ydF9jaGFubmVsX3BhdXNlCT0gdHJ1ZSwKKwkuc3VwcG9ydF9zZXBhcmF0ZV93Y291bnRfcmVnID0gdHJ1ZSwKIH07CiAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZG1hX29mX21hdGNoW10gPSB7CiAJeworCQkuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExNDgtYXBiZG1hIiwKKwkJLmRhdGEgPSAmdGVncmExNDhfZG1hX2NoaXBfZGF0YSwKKwl9LCB7CiAJCS5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1hcGJkbWEiLAogCQkuZGF0YSA9ICZ0ZWdyYTExNF9kbWFfY2hpcF9kYXRhLAogCX0sIHsKQEAgLTEzNDgsNyArMTM5Niw3IEBACiAJCXN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqdGRjID0gJnRkbWEtPmNoYW5uZWxzW2ldOwogCiAJCXRkYy0+Y2hhbl9iYXNlX29mZnNldCA9IFRFR1JBX0FQQkRNQV9DSEFOTkVMX0JBU0VfQUREX09GRlNFVCArCi0JCQkJCWkgKiBURUdSQV9BUEJETUFfQ0hBTk5FTF9SRUdJU1RFUl9TSVpFOworCQkJCQlpICogY2RhdGEtPmNoYW5uZWxfcmVnX3NpemU7CiAKIAkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCBpKTsKIAkJaWYgKCFyZXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmggYi9kcml2ZXJzL2RtYS92aXJ0LWRtYS5oCmluZGV4IDg1YzE5ZDYuLjE4MWI5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvdmlydC1kbWEuaApAQCAtODQsMTAgKzg0LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmNoYW5fY29va2llX2NvbXBsZXRlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKIHsKIAlzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMgPSB0b192aXJ0X2NoYW4odmQtPnR4LmNoYW4pOworCWRtYV9jb29raWVfdCBjb29raWU7CiAKKwljb29raWUgPSB2ZC0+dHguY29va2llOwogCWRtYV9jb29raWVfY29tcGxldGUoJnZkLT50eCk7CiAJZGV2X3ZkYmcodmMtPmNoYW4uZGV2aWNlLT5kZXYsICJ0eGQgJXBbJXhdOiBtYXJrZWQgY29tcGxldGVcbiIsCi0JCXZkLCB2ZC0+dHguY29va2llKTsKKwkJIHZkLCBjb29raWUpOwogCWxpc3RfYWRkX3RhaWwoJnZkLT5ub2RlLCAmdmMtPmRlc2NfY29tcGxldGVkKTsKIAogCXRhc2tsZXRfc2NoZWR1bGUoJnZjLT50YXNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jCmluZGV4IDUxYzAzNjIuLjhlYzE3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNfc3lzZnMuYwpAQCAtNjEsNyArNjEsNyBAQAogCXJldCA9IGtzdHJ0b2wodmFsLCAwLCAmbCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlpZiAoKGludClsICE9IGwpCisJaWYgKCFsIHx8ICgoaW50KWwgIT0gbCkpCiAJCXJldHVybiAtRUlOVkFMOwogCSooKGludCAqKWtwLT5hcmcpID0gbDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwppbmRleCBmODY0Mjc1Li44ZTdmYTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwpAQCAtMjAsNiArMjAsMTAgQEAKIAkgIGRldGFpbHMuICBZb3Ugc2hvdWxkIGFsc28gc2VsZWN0IGFuZCBjb25maWd1cmUgQUdQCiAJICAoL2Rldi9hZ3BnYXJ0KSBzdXBwb3J0IGlmIGl0IGlzIGF2YWlsYWJsZSBmb3IgeW91ciBwbGF0Zm9ybS4KIAorY29uZmlnIERSTV9NSVBJX0RTSQorCWJvb2wKKwlkZXBlbmRzIG9uIERSTQorCiBjb25maWcgRFJNX1VTQgogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBEUk0KQEAgLTE4OCw2ICsxOTIsMTAgQEAKIAogc291cmNlICJkcml2ZXJzL2dwdS9kcm0vcXhsL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9ncHUvZHJtL2JvY2hzL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS90ZWdyYS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCmluZGV4IGNjMDhiODQuLjI5MmE3OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKIGRybS0kKENPTkZJR19DT01QQVQpICs9IGRybV9pb2MzMi5vCiBkcm0tJChDT05GSUdfRFJNX0dFTV9DTUFfSEVMUEVSKSArPSBkcm1fZ2VtX2NtYV9oZWxwZXIubwogZHJtLSQoQ09ORklHX1BDSSkgKz0gYXRpX3BjaWdhcnQubworZHJtLSQoQ09ORklHX0RSTV9QQU5FTCkgKz0gZHJtX3BhbmVsLm8KIAogZHJtLXVzYi15ICAgOj0gZHJtX3VzYi5vCiAKQEAgLTMxLDYgKzMyLDcgQEAKIENGTEFHU19kcm1fdHJhY2VfcG9pbnRzLm8gOj0gLUkkKHNyYykKIAogb2JqLSQoQ09ORklHX0RSTSkJKz0gZHJtLm8KK29iai0kKENPTkZJR19EUk1fTUlQSV9EU0kpICs9IGRybV9taXBpX2RzaS5vCiBvYmotJChDT05GSUdfRFJNX1VTQikgICArPSBkcm1fdXNiLm8KIG9iai0kKENPTkZJR19EUk1fVFRNKQkrPSB0dG0vCiBvYmotJChDT05GSUdfRFJNX1RERlgpCSs9IHRkZngvCkBAIC01Niw2ICs1OCw4IEBACiBvYmotJChDT05GSUdfRFJNX09NQVApCSs9IG9tYXBkcm0vCiBvYmotJChDT05GSUdfRFJNX1RJTENEQykJKz0gdGlsY2RjLwogb2JqLSQoQ09ORklHX0RSTV9RWEwpICs9IHF4bC8KK29iai0kKENPTkZJR19EUk1fQk9DSFMpICs9IGJvY2hzLwogb2JqLSQoQ09ORklHX0RSTV9NU00pICs9IG1zbS8KIG9iai0kKENPTkZJR19EUk1fVEVHUkEpICs9IHRlZ3JhLwogb2JqLXkJCQkrPSBpMmMvCitvYmoteQkJCSs9IHBhbmVsLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9LY29uZmlnCmluZGV4IDQwZDM3MTUuLjUwYWU4OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXJtYWRhL0tjb25maWcKQEAgLTUsNiArNSw3IEBACiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCiAJc2VsZWN0IERSTV9LTVNfSEVMUEVSCisJc2VsZWN0IERSTV9LTVNfRkJfSEVMUEVSCiAJaGVscAogCSAgU3VwcG9ydCB0aGUgIkxDRCIgY29udHJvbGxlcnMgZm91bmQgb24gdGhlIE1hcnZlbGwgQXJtYWRhIDUxMAogCSAgZGV2aWNlcy4gIFRoZXJlIGFyZSB0d28gY29udHJvbGxlcnMgb24gdGhlIGRldmljZSwgZWFjaCBjb250cm9sbGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2Rydi5jCmluZGV4IDYyZDBmZjMuLmFjZjNhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2Rydi5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LT5wbGF0Zm9ybWRldiwgZGV2KTsKIAlkZXYtPmRldl9wcml2YXRlID0gcHJpdjsKIAogCS8qIEdldCB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZHJpdmVyIGRhdGEuICovCkBAIC0zODEsNyArMzgyLDcgQEAKIAogc3RhdGljIGludCBhcm1hZGFfZHJtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWRybV9wbGF0Zm9ybV9leGl0KCZhcm1hZGFfZHJtX2RyaXZlciwgcGRldik7CisJZHJtX3B1dF9kZXYocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfZmIuYwppbmRleCA3YjMzZTE0Li5hMjg2NDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2ZiLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiB0aGVuIHRoZSBCTyBpcyBiZWluZyBtb3ZlZCBhbmQgd2Ugc2hvdWxkCiAJICogc3RvcmUgdXAgdGhlIGRhbWFnZSB1bnRpbCBsYXRlci4KIAkgKi8KLQlpZiAoIWluX2ludGVycnVwdCgpKQorCWlmIChkcm1fY2FuX3NsZWVwKCkpCiAJCXJldCA9IGFzdF9ib19yZXNlcnZlKGJvLCB0cnVlKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgIT0gLUVCVVNZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbWFpbi5jIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbWFpbi5jCmluZGV4IGFmMGI4NjguLjUwNTM1ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X21haW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9tYWluLmMKQEAgLTE4OSw1MyArMTg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdWludDMyX3QgYXN0X2dldF9tYXhfZGNsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgYnBwKQotewotCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBkY2xrLCBqcmVnOwotCXVpbnQzMl90IGRyYW1fYnVzX3dpZHRoLCBtY2xrLCBkcmFtX2JhbmR3aWR0aCwgYWN0dWFsX2RyYW1fYmFuZHdpZHRoLCBkcmFtX2VmZmljZW5jeSA9IDUwMDsKLQotCWRyYW1fYnVzX3dpZHRoID0gYXN0LT5kcmFtX2J1c193aWR0aDsKLQltY2xrID0gYXN0LT5tY2xrOwotCi0JaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMTAwIHx8Ci0JICAgIGFzdC0+Y2hpcCA9PSBBU1QxMTAwIHx8Ci0JICAgIGFzdC0+Y2hpcCA9PSBBU1QyMjAwIHx8Ci0JICAgIGFzdC0+Y2hpcCA9PSBBU1QyMTUwIHx8Ci0JICAgIGFzdC0+ZHJhbV9idXNfd2lkdGggPT0gMTYpCi0JCWRyYW1fZWZmaWNlbmN5ID0gNjAwOwotCWVsc2UgaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKQotCQlkcmFtX2VmZmljZW5jeSA9IDQwMDsKLQotCWRyYW1fYmFuZHdpZHRoID0gbWNsayAqIGRyYW1fYnVzX3dpZHRoICogMiAvIDg7Ci0JYWN0dWFsX2RyYW1fYmFuZHdpZHRoID0gZHJhbV9iYW5kd2lkdGggKiBkcmFtX2VmZmljZW5jeSAvIDEwMDA7Ci0KLQlpZiAoYXN0LT5jaGlwID09IEFTVDExODApCi0JCWRjbGsgPSBhY3R1YWxfZHJhbV9iYW5kd2lkdGggLyAoKGJwcCArIDEpIC8gOCk7Ci0JZWxzZSB7Ci0JCWpyZWcgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMCwgMHhmZik7Ci0JCWlmICgoanJlZyAmIDB4MDgpICYmIChhc3QtPmNoaXAgPT0gQVNUMjAwMCkpCi0JCQlkY2xrID0gYWN0dWFsX2RyYW1fYmFuZHdpZHRoIC8gKChicHAgKyAxICsgMTYpIC8gOCk7Ci0JCWVsc2UgaWYgKChqcmVnICYgMHgwOCkgJiYgKGJwcCA9PSA4KSkKLQkJCWRjbGsgPSBhY3R1YWxfZHJhbV9iYW5kd2lkdGggLyAoKGJwcCArIDEgKyAyNCkgLyA4KTsKLQkJZWxzZQotCQkJZGNsayA9IGFjdHVhbF9kcmFtX2JhbmR3aWR0aCAvICgoYnBwICsgMSkgLyA4KTsKLQl9Ci0KLQlpZiAoYXN0LT5jaGlwID09IEFTVDIxMDAgfHwKLQkgICAgYXN0LT5jaGlwID09IEFTVDIyMDAgfHwKLQkgICAgYXN0LT5jaGlwID09IEFTVDIzMDAgfHwKLQkgICAgYXN0LT5jaGlwID09IEFTVDExODApIHsKLQkJaWYgKGRjbGsgPiAyMDApCi0JCQlkY2xrID0gMjAwOwotCX0gZWxzZSB7Ci0JCWlmIChkY2xrID4gMTY1KQotCQkJZGNsayA9IDE2NTsKLQl9Ci0KLQlyZXR1cm4gZGNsazsKLX0KLQogc3RhdGljIHZvaWQgYXN0X3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKIHsKIAlzdHJ1Y3QgYXN0X2ZyYW1lYnVmZmVyICphc3RfZmIgPSB0b19hc3RfZnJhbWVidWZmZXIoZmIpOwpAQCAtNDQ5LDcgKzQwMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXN0X2JvX3VucmVmKHN0cnVjdCBhc3RfYm8gKipibykKK3N0YXRpYyB2b2lkIGFzdF9ib191bnJlZihzdHJ1Y3QgYXN0X2JvICoqYm8pCiB7CiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0Ym87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X21vZGUuYwppbmRleCA3ZmM5ZjcyLi5jY2EwNjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9tb2RlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbW9kZS5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAl9CiB9CiAKLXZvaWQgYXN0X3NldF9zeW5jX3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKK3N0YXRpYyB2b2lkIGFzdF9zZXRfc3luY19yZWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCSAgICAgIHN0cnVjdCBhc3RfdmJpb3NfbW9kZV9pbmZvICp2Ymlvc19tb2RlKQogewogCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCWFzdF9pb193cml0ZTgoYXN0LCBBU1RfSU9fTUlTQ19QT1JUX1dSSVRFLCBqcmVnKTsKIH0KIAotYm9vbCBhc3Rfc2V0X2RhY19yZWcoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKK3N0YXRpYyBib29sIGFzdF9zZXRfZGFjX3JlZyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkgICAgIHN0cnVjdCBhc3RfdmJpb3NfbW9kZV9pbmZvICp2Ymlvc19tb2RlKQogewogCXN3aXRjaCAoY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsKSB7CkBAIC00MjcsNyArNDI3LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBhc3Rfc2V0X3N0YXJ0X2FkZHJlc3NfY3J0MShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyB2b2lkIGFzdF9zZXRfc3RhcnRfYWRkcmVzc19jcnQxKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgb2Zmc2V0KQogewogCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgYWRkcjsKQEAgLTYyMyw3ICs2MjMsNyBAQAogCS5kZXN0cm95ID0gYXN0X2NydGNfZGVzdHJveSwKIH07CiAKLWludCBhc3RfY3J0Y19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFzdF9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXN0X2NydGMgKmNydGM7CiAJaW50IGk7CkBAIC03MTAsNyArNzEwLDcgQEAKIAkubW9kZV9zZXQgPSBhc3RfZW5jb2Rlcl9tb2RlX3NldCwKIH07CiAKLWludCBhc3RfZW5jb2Rlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFzdF9lbmNvZGVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXN0X2VuY29kZXIgKmFzdF9lbmNvZGVyOwogCkBAIC03NzcsNyArNzc3LDcgQEAKIAkuZGVzdHJveSA9IGFzdF9jb25uZWN0b3JfZGVzdHJveSwKIH07CiAKLWludCBhc3RfY29ubmVjdG9yX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXN0X2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFzdF9jb25uZWN0b3IgKmFzdF9jb25uZWN0b3I7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKQEAgLTgxMCw3ICs4MTAsNyBAQAogfQogCiAvKiBhbGxvY2F0ZSBjdXJzb3IgY2FjaGUgYW5kIHBpbiBhdCBzdGFydCBvZiBWUkFNICovCi1pbnQgYXN0X2N1cnNvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFzdF9jdXJzb3JfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgc2l6ZTsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYXN0X2N1cnNvcl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBhc3RfY3Vyc29yX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdHRtX2JvX2t1bm1hcCgmYXN0LT5jYWNoZV9rbWFwKTsKQEAgLTk2NSw3ICs5NjUsNyBAQAogCWtmcmVlKGkyYyk7CiB9CiAKLXZvaWQgYXN0X3Nob3dfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGFzdF9zaG93X2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCXU4IGpyZWc7CkBAIC05NzYsNyArOTc2LDcgQEAKIAlhc3Rfc2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhjYiwgMHhmYywganJlZyk7CiB9CiAKLXZvaWQgYXN0X2hpZGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGFzdF9oaWRlX2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCWFzdF9zZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweGNiLCAweGZjLCAweDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfdHRtLmMKaW5kZXggMzJhZWNiMy4uNGVhOWIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfdHRtLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFzdF90dG1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCiB7CiAJaWYgKGFzdC0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPT0gTlVMTCkKQEAgLTEwMiw3ICsxMDIsNyBAQAogCWtmcmVlKGJvKTsKIH0KIAotYm9vbCBhc3RfdHRtX2JvX2lzX2FzdF9ibyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQorc3RhdGljIGJvb2wgYXN0X3R0bV9ib19pc19hc3RfYm8oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlpZiAoYm8tPmRlc3Ryb3kgPT0gJmFzdF9ib190dG1fZGVzdHJveSkKIAkJcmV0dXJuIHRydWU7CkBAIC0yMDgsNyArMjA4LDcgQEAKIH07CiAKIAotc3RydWN0IHR0bV90dCAqYXN0X3R0bV90dF9jcmVhdGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCitzdGF0aWMgc3RydWN0IHR0bV90dCAqYXN0X3R0bV90dF9jcmVhdGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCiAJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdWludDMyX3QgcGFnZV9mbGFncywKIAkJCQkgc3RydWN0IHBhZ2UgKmR1bW15X3JlYWRfcGFnZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL2JvY2hzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmY2YxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9LY29uZmlnCkBAIC0wLDAgKzEsMTEgQEAKK2NvbmZpZyBEUk1fQk9DSFMKKwl0cmlzdGF0ZSAiRFJNIFN1cHBvcnQgZm9yIGJvY2hzIGRpc3BpIHZnYSBpbnRlcmZhY2UgKHFlbXUgc3RkdmdhKSIKKwlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKKwlzZWxlY3QgRFJNX0tNU19IRUxQRVIKKwlzZWxlY3QgRkJfU1lTX0ZJTExSRUNUCisJc2VsZWN0IEZCX1NZU19DT1BZQVJFQQorCXNlbGVjdCBGQl9TWVNfSU1BR0VCTElUCisJc2VsZWN0IERSTV9UVE0KKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gZm9yIHFlbXUuCisJICBJZiBNIGlzIHNlbGVjdGVkIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYm9jaHMtZHJtLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JvY2hzL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2JvY2hzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitjY2ZsYWdzLXkgOj0gLUlpbmNsdWRlL2RybQorYm9jaHMtZHJtLXkgOj0gYm9jaHNfZHJ2Lm8gYm9jaHNfbW0ubyBib2Noc19rbXMubyBib2Noc19mYmRldi5vIGJvY2hzX2h3Lm8KKworb2JqLSQoQ09ORklHX0RSTV9CT0NIUykJKz0gYm9jaHMtZHJtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Nocy5oIGIvZHJpdmVycy9ncHUvZHJtL2JvY2hzL2JvY2hzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxOTY1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Nocy5oCkBAIC0wLDAgKzEsMTY0IEBACisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KKworI2luY2x1ZGUgPHR0bS90dG1fYm9fZHJpdmVyLmg+CisjaW5jbHVkZSA8dHRtL3R0bV9wYWdlX2FsbG9jLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBWQkVfRElTUElfSU9QT1JUX0lOREVYICAgICAgICAgICAweDAxQ0UKKyNkZWZpbmUgVkJFX0RJU1BJX0lPUE9SVF9EQVRBICAgICAgICAgICAgMHgwMUNGCisKKyNkZWZpbmUgVkJFX0RJU1BJX0lOREVYX0lEICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFZCRV9ESVNQSV9JTkRFWF9YUkVTICAgICAgICAgICAgIDB4MQorI2RlZmluZSBWQkVfRElTUElfSU5ERVhfWVJFUyAgICAgICAgICAgICAweDIKKyNkZWZpbmUgVkJFX0RJU1BJX0lOREVYX0JQUCAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFZCRV9ESVNQSV9JTkRFWF9FTkFCTEUgICAgICAgICAgIDB4NAorI2RlZmluZSBWQkVfRElTUElfSU5ERVhfQkFOSyAgICAgICAgICAgICAweDUKKyNkZWZpbmUgVkJFX0RJU1BJX0lOREVYX1ZJUlRfV0lEVEggICAgICAgMHg2CisjZGVmaW5lIFZCRV9ESVNQSV9JTkRFWF9WSVJUX0hFSUdIVCAgICAgIDB4NworI2RlZmluZSBWQkVfRElTUElfSU5ERVhfWF9PRkZTRVQgICAgICAgICAweDgKKyNkZWZpbmUgVkJFX0RJU1BJX0lOREVYX1lfT0ZGU0VUICAgICAgICAgMHg5CisjZGVmaW5lIFZCRV9ESVNQSV9JTkRFWF9WSURFT19NRU1PUllfNjRLIDB4YQorCisjZGVmaW5lIFZCRV9ESVNQSV9JRDAgICAgICAgICAgICAgICAgICAgIDB4QjBDMAorI2RlZmluZSBWQkVfRElTUElfSUQxICAgICAgICAgICAgICAgICAgICAweEIwQzEKKyNkZWZpbmUgVkJFX0RJU1BJX0lEMiAgICAgICAgICAgICAgICAgICAgMHhCMEMyCisjZGVmaW5lIFZCRV9ESVNQSV9JRDMgICAgICAgICAgICAgICAgICAgIDB4QjBDMworI2RlZmluZSBWQkVfRElTUElfSUQ0ICAgICAgICAgICAgICAgICAgICAweEIwQzQKKyNkZWZpbmUgVkJFX0RJU1BJX0lENSAgICAgICAgICAgICAgICAgICAgMHhCMEM1CisKKyNkZWZpbmUgVkJFX0RJU1BJX0RJU0FCTEVEICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBWQkVfRElTUElfRU5BQkxFRCAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFZCRV9ESVNQSV9HRVRDQVBTICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgVkJFX0RJU1BJXzhCSVRfREFDICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBWQkVfRElTUElfTEZCX0VOQUJMRUQgICAgICAgICAgICAweDQwCisjZGVmaW5lIFZCRV9ESVNQSV9OT0NMRUFSTUVNICAgICAgICAgICAgIDB4ODAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGJvY2hzX3R5cGVzIHsKKwlCT0NIU19RRU1VX1NURFZHQSwKKwlCT0NIU19VTktOT1dOLAorfTsKKworc3RydWN0IGJvY2hzX2ZyYW1lYnVmZmVyIHsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyIGJhc2U7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Cit9OworCitzdHJ1Y3QgYm9jaHNfZGV2aWNlIHsKKwkvKiBodyAqLworCXZvaWQgX19pb21lbSAgICptbWlvOworCWludCAgICAgICAgICAgIGlvcG9ydHM7CisJdm9pZCBfX2lvbWVtICAgKmZiX21hcDsKKwl1bnNpZ25lZCBsb25nICBmYl9iYXNlOworCXVuc2lnbmVkIGxvbmcgIGZiX3NpemU7CisKKwkvKiBtb2RlICovCisJdTE2IHhyZXM7CisJdTE2IHlyZXM7CisJdTE2IHlyZXNfdmlydHVhbDsKKwl1MzIgc3RyaWRlOworCXUzMiBicHA7CisKKwkvKiBkcm0gKi8KKwlzdHJ1Y3QgZHJtX2RldmljZSAgKmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgY3J0YzsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7CisJYm9vbCBtb2RlX2NvbmZpZ19pbml0aWFsaXplZDsKKworCS8qIHR0bSAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSBtZW1fZ2xvYmFsX3JlZjsKKwkJc3RydWN0IHR0bV9ib19nbG9iYWxfcmVmIGJvX2dsb2JhbF9yZWY7CisJCXN0cnVjdCB0dG1fYm9fZGV2aWNlIGJkZXY7CisJCWJvb2wgaW5pdGlhbGl6ZWQ7CisJfSB0dG07CisKKwkvKiBmYmRldiAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciBnZmI7CisJCXN0cnVjdCBkcm1fZmJfaGVscGVyIGhlbHBlcjsKKwkJaW50IHNpemU7CisJCWludCB4MSwgeTEsIHgyLCB5MjsgLyogZGlydHkgcmVjdCAqLworCQlzcGlubG9ja190IGRpcnR5X2xvY2s7CisJCWJvb2wgaW5pdGlhbGl6ZWQ7CisJfSBmYjsKK307CisKKyNkZWZpbmUgdG9fYm9jaHNfZnJhbWVidWZmZXIoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciwgYmFzZSkKKworc3RydWN0IGJvY2hzX2JvIHsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgYm87CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgcGxhY2VtZW50OworCXN0cnVjdCB0dG1fYm9fa21hcF9vYmoga21hcDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgZ2VtOworCXUzMiBwbGFjZW1lbnRzWzNdOworCWludCBwaW5fY291bnQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBib2Noc19ibyAqYm9jaHNfYm8oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGJvLCBzdHJ1Y3QgYm9jaHNfYm8sIGJvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYm9jaHNfYm8gKmdlbV90b19ib2Noc19ibyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGdlbSwgc3RydWN0IGJvY2hzX2JvLCBnZW0pOworfQorCisjZGVmaW5lIERSTV9GSUxFX1BBR0VfT0ZGU0VUICgweDEwMDAwMDAwMFVMTCA+PiBQQUdFX1NISUZUKQorCitzdGF0aWMgaW5saW5lIHU2NCBib2Noc19ib19tbWFwX29mZnNldChzdHJ1Y3QgYm9jaHNfYm8gKmJvKQoreworCXJldHVybiBkcm1fdm1hX25vZGVfb2Zmc2V0X2FkZHIoJmJvLT5iby52bWFfbm9kZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYm9jaHNfaHcuYyAqLworaW50IGJvY2hzX2h3X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZmxhZ3MpOwordm9pZCBib2Noc19od19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCit2b2lkIGJvY2hzX2h3X3NldG1vZGUoc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMsCisJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK3ZvaWQgYm9jaHNfaHdfc2V0YmFzZShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocywKKwkJICAgICAgaW50IHgsIGludCB5LCB1NjQgYWRkcik7CisKKy8qIGJvY2hzX21tLmMgKi8KK2ludCBib2Noc19tbV9pbml0KHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKTsKK3ZvaWQgYm9jaHNfbW1fZmluaShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2Nocyk7CitpbnQgYm9jaHNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitpbnQgYm9jaHNfZ2VtX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2l6ZSwgYm9vbCBpc2tlcm5lbCwKKwkJICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmopOworaW50IGJvY2hzX2dlbV9pbml0X29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGJvY2hzX2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitpbnQgYm9jaHNfZHVtYl9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgKmFyZ3MpOworaW50IGJvY2hzX2R1bWJfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9maWxlICpmaWxlLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgdWludDMyX3QgaGFuZGxlLCB1aW50NjRfdCAqb2Zmc2V0KTsKKworaW50IGJvY2hzX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciAqZ2ZiLAorCQkJICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kLAorCQkJICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworaW50IGJvY2hzX2JvX3BpbihzdHJ1Y3QgYm9jaHNfYm8gKmJvLCB1MzIgcGxfZmxhZywgdTY0ICpncHVfYWRkcik7CitpbnQgYm9jaHNfYm9fdW5waW4oc3RydWN0IGJvY2hzX2JvICpibyk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIGJvY2hzX21vZGVfZnVuY3M7CisKKy8qIGJvY2hzX2ttcy5jICovCitpbnQgYm9jaHNfa21zX2luaXQoc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMpOwordm9pZCBib2Noc19rbXNfZmluaShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2Nocyk7CisKKy8qIGJvY2hzX2ZiZGV2LmMgKi8KK2ludCBib2Noc19mYmRldl9pbml0KHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKTsKK3ZvaWQgYm9jaHNfZmJkZXZfZmluaShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2Nocyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YmJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19kcnYuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiYm9jaHMuaCIKKworc3RhdGljIGJvb2wgZW5hYmxlX2ZiZGV2ID0gdHJ1ZTsKK21vZHVsZV9wYXJhbV9uYW1lZChmYmRldiwgZW5hYmxlX2ZiZGV2LCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZmJkZXYsICJyZWdpc3RlciBmYmRldiBkZXZpY2UiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZHJtIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGJvY2hzX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWJvY2hzX2ZiZGV2X2ZpbmkoYm9jaHMpOworCWJvY2hzX2ttc19maW5pKGJvY2hzKTsKKwlib2Noc19tbV9maW5pKGJvY2hzKTsKKwlib2Noc19od19maW5pKGRldik7CisJa2ZyZWUoYm9jaHMpOworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJvY2hzX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NoczsKKwlpbnQgcmV0OworCisJYm9jaHMgPSBremFsbG9jKHNpemVvZigqYm9jaHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYm9jaHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2LT5kZXZfcHJpdmF0ZSA9IGJvY2hzOworCWJvY2hzLT5kZXYgPSBkZXY7CisKKwlyZXQgPSBib2Noc19od19pbml0KGRldiwgZmxhZ3MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gYm9jaHNfbW1faW5pdChib2Nocyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBib2Noc19rbXNfaW5pdChib2Nocyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpZiAoZW5hYmxlX2ZiZGV2KQorCQlib2Noc19mYmRldl9pbml0KGJvY2hzKTsKKworCXJldHVybiAwOworCitlcnI6CisJYm9jaHNfdW5sb2FkKGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm9jaHNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZHJtX29wZW4sCisJLnJlbGVhc2UJPSBkcm1fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBkcm1faW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBkcm1fY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLnBvbGwJCT0gZHJtX3BvbGwsCisJLnJlYWQJCT0gZHJtX3JlYWQsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLm1tYXAgICAgICAgICAgID0gYm9jaHNfbW1hcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBib2Noc19kcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcwk9IERSSVZFUl9HRU0gfCBEUklWRVJfTU9ERVNFVCwKKwkubG9hZAkJCT0gYm9jaHNfbG9hZCwKKwkudW5sb2FkCQkJPSBib2Noc191bmxvYWQsCisJLmZvcHMJCQk9ICZib2Noc19mb3BzLAorCS5uYW1lCQkJPSAiYm9jaHMtZHJtIiwKKwkuZGVzYwkJCT0gImJvY2hzIGRpc3BpIHZnYSBpbnRlcmZhY2UgKHFlbXUgc3RkdmdhKSIsCisJLmRhdGUJCQk9ICIyMDEzMDkyNSIsCisJLm1ham9yCQkJPSAxLAorCS5taW5vcgkJCT0gMCwKKwkuZ2VtX2ZyZWVfb2JqZWN0ICAgICAgICA9IGJvY2hzX2dlbV9mcmVlX29iamVjdCwKKwkuZHVtYl9jcmVhdGUgICAgICAgICAgICA9IGJvY2hzX2R1bWJfY3JlYXRlLAorCS5kdW1iX21hcF9vZmZzZXQgICAgICAgID0gYm9jaHNfZHVtYl9tbWFwX29mZnNldCwKKwkuZHVtYl9kZXN0cm95ICAgICAgICAgICA9IGRybV9nZW1fZHVtYl9kZXN0cm95LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcGNpIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGJvY2hzX2tpY2tfb3V0X2Zpcm13YXJlX2ZiKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhcGVydHVyZXNfc3RydWN0ICphcDsKKworCWFwID0gYWxsb2NfYXBlcnR1cmVzKDEpOworCWlmICghYXApCisJCXJldHVybiAtRU5PTUVNOworCisJYXAtPnJhbmdlc1swXS5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWFwLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhhcCwgImJvY2hzZHJtZmIiLCBmYWxzZSk7CisJa2ZyZWUoYXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYm9jaHNfa2lja19vdXRfZmlybXdhcmVfZmIocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkcm1fZ2V0X3BjaV9kZXYocGRldiwgZW50LCAmYm9jaHNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYm9jaHNfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZHJtX3B1dF9kZXYoZGV2KTsKK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJvY2hzX3BjaV90YmwpID0geworCXsKKwkJLnZlbmRvciAgICAgID0gMHgxMjM0LAorCQkuZGV2aWNlICAgICAgPSAweDExMTEsCisJCS5zdWJ2ZW5kb3IgICA9IDB4MWFmNCwKKwkJLnN1YmRldmljZSAgID0gMHgxMTAwLAorCQkuZHJpdmVyX2RhdGEgPSBCT0NIU19RRU1VX1NURFZHQSwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gMHgxMjM0LAorCQkuZGV2aWNlICAgICAgPSAweDExMTEsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IEJPQ0hTX1VOS05PV04sCisJfSwKKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBib2Noc19wY2lfZHJpdmVyID0geworCS5uYW1lID0JCSJib2Nocy1kcm0iLAorCS5pZF90YWJsZSA9CWJvY2hzX3BjaV90YmwsCisJLnByb2JlID0JYm9jaHNfcGNpX3Byb2JlLAorCS5yZW1vdmUgPQlib2Noc19wY2lfcmVtb3ZlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbW9kdWxlIGluaXQvZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IF9faW5pdCBib2Noc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGRybV9wY2lfaW5pdCgmYm9jaHNfZHJpdmVyLCAmYm9jaHNfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBib2Noc19leGl0KHZvaWQpCit7CisJZHJtX3BjaV9leGl0KCZib2Noc19kcml2ZXIsICZib2Noc19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYm9jaHNfaW5pdCk7Cittb2R1bGVfZXhpdChib2Noc19leGl0KTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJvY2hzX3BjaV90YmwpOworTU9EVUxFX0FVVEhPUigiR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfZmJkZXYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19mYmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTUyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfZmJkZXYuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgImJvY2hzLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBmYl9vcHMgYm9jaHNmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyLAorCS5mYl9maWxscmVjdCA9IHN5c19maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBzeXNfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IHN5c19pbWFnZWJsaXQsCisJLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKKwkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAorCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAorfTsKKworc3RhdGljIGludCBib2Noc2ZiX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMsCisJCQkJIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyICptb2RlX2NtZCwKKwkJCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqZ29ial9wKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBib2Nocy0+ZGV2OworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKKwl1MzIgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCXNpemUgPSBtb2RlX2NtZC0+cGl0Y2hlc1swXSAqIG1vZGVfY21kLT5oZWlnaHQ7CisJcmV0ID0gYm9jaHNfZ2VtX2NyZWF0ZShkZXYsIHNpemUsIHRydWUsICZnb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKmdvYmpfcCA9IGdvYmo7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBib2Noc2ZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAorCQkJICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0KKwkJY29udGFpbmVyX29mKGhlbHBlciwgc3RydWN0IGJvY2hzX2RldmljZSwgZmIuaGVscGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYm9jaHMtPmRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMiBtb2RlX2NtZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmZGV2LT5wZGV2LT5kZXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqID0gTlVMTDsKKwlzdHJ1Y3QgYm9jaHNfYm8gKmJvID0gTlVMTDsKKwlpbnQgc2l6ZSwgcmV0OworCisJaWYgKHNpemVzLT5zdXJmYWNlX2JwcCAhPSAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltb2RlX2NtZC53aWR0aCA9IHNpemVzLT5zdXJmYWNlX3dpZHRoOworCW1vZGVfY21kLmhlaWdodCA9IHNpemVzLT5zdXJmYWNlX2hlaWdodDsKKwltb2RlX2NtZC5waXRjaGVzWzBdID0gbW9kZV9jbWQud2lkdGggKiAoKHNpemVzLT5zdXJmYWNlX2JwcCArIDcpIC8gOCk7CisJbW9kZV9jbWQucGl4ZWxfZm9ybWF0ID0gZHJtX21vZGVfbGVnYWN5X2ZiX2Zvcm1hdChzaXplcy0+c3VyZmFjZV9icHAsCisJCQkJCQkJICBzaXplcy0+c3VyZmFjZV9kZXB0aCk7CisJc2l6ZSA9IG1vZGVfY21kLnBpdGNoZXNbMF0gKiBtb2RlX2NtZC5oZWlnaHQ7CisKKwkvKiBhbGxvYywgcGluICYgbWFwIGJvICovCisJcmV0ID0gYm9jaHNmYl9jcmVhdGVfb2JqZWN0KGJvY2hzLCAmbW9kZV9jbWQsICZnb2JqKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBmYmNvbiBiYWNraW5nIG9iamVjdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlibyA9IGdlbV90b19ib2Noc19ibyhnb2JqKTsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKCZiby0+Ym8sIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGJvY2hzX2JvX3BpbihibywgVFRNX1BMX0ZMQUdfVlJBTSwgTlVMTCk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gZmJjb25cbiIpOworCQl0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHR0bV9ib19rbWFwKCZiby0+Ym8sIDAsIGJvLT5iby5udW1fcGFnZXMsCisJCQkgICZiby0+a21hcCk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBrbWFwIGZiY29uXG4iKTsKKwkJdHRtX2JvX3VucmVzZXJ2ZSgmYm8tPmJvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOworCisJLyogaW5pdCBmYiBkZXZpY2UgKi8KKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2MoMCwgZGV2aWNlKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluZm8tPnBhciA9ICZib2Nocy0+ZmIuaGVscGVyOworCisJcmV0ID0gYm9jaHNfZnJhbWVidWZmZXJfaW5pdChib2Nocy0+ZGV2LCAmYm9jaHMtPmZiLmdmYiwgJm1vZGVfY21kLCBnb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYm9jaHMtPmZiLnNpemUgPSBzaXplOworCisJLyogc2V0dXAgaGVscGVyICovCisJZmIgPSAmYm9jaHMtPmZiLmdmYi5iYXNlOworCWJvY2hzLT5mYi5oZWxwZXIuZmIgPSBmYjsKKwlib2Nocy0+ZmIuaGVscGVyLmZiZGV2ID0gaW5mbzsKKworCXN0cmNweShpbmZvLT5maXguaWQsICJib2Noc2RybWZiIik7CisKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCWluZm8tPmZib3BzID0gJmJvY2hzZmJfb3BzOworCisJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChpbmZvLCBmYi0+cGl0Y2hlc1swXSwgZmItPmRlcHRoKTsKKwlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sICZib2Nocy0+ZmIuaGVscGVyLCBzaXplcy0+ZmJfd2lkdGgsCisJCQkgICAgICAgc2l6ZXMtPmZiX2hlaWdodCk7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGJvLT5rbWFwLnZpcnR1YWw7CisJaW5mby0+c2NyZWVuX3NpemUgPSBzaXplOworCisjaWYgMAorCS8qIEZJWE1FOiBnZXQgdGhpcyByaWdodCBmb3IgbW1hcCgvZGV2L2ZiMCkgKi8KKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGJvY2hzX2JvX21tYXBfb2Zmc2V0KGJvKTsKKwlpbmZvLT5maXguc21lbV9sZW4gPSBzaXplOworI2VuZGlmCisKKwlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCIlczogY2FuJ3QgYWxsb2NhdGUgY29sb3IgbWFwXG4iLCBpbmZvLT5maXguaWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBib2Noc19mYmRldl9kZXN0cm95KHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKQoreworCXN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciAqZ2ZiID0gJmJvY2hzLT5mYi5nZmI7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisKKwlEUk1fREVCVUdfRFJJVkVSKCJcbiIpOworCisJaWYgKGJvY2hzLT5mYi5oZWxwZXIuZmJkZXYpIHsKKwkJaW5mbyA9IGJvY2hzLT5mYi5oZWxwZXIuZmJkZXY7CisKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJaWYgKGluZm8tPmNtYXAubGVuKQorCQkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlpZiAoZ2ZiLT5vYmopIHsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoZ2ZiLT5vYmopOworCQlnZmItPm9iaiA9IE5VTEw7CisJfQorCisJZHJtX2ZiX2hlbHBlcl9maW5pKCZib2Nocy0+ZmIuaGVscGVyKTsKKwlkcm1fZnJhbWVidWZmZXJfdW5yZWdpc3Rlcl9wcml2YXRlKCZnZmItPmJhc2UpOworCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKCZnZmItPmJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm9jaHNfZmJfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2IHJlZCwgdTE2IGdyZWVuLAorCQkJdTE2IGJsdWUsIGludCByZWdubykKK3sKK30KKwordm9pZCBib2Noc19mYl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKKwkJCXUxNiAqYmx1ZSwgaW50IHJlZ25vKQoreworCSpyZWQgICA9IHJlZ25vOworCSpncmVlbiA9IHJlZ25vOworCSpibHVlICA9IHJlZ25vOworfQorCitzdGF0aWMgc3RydWN0IGRybV9mYl9oZWxwZXJfZnVuY3MgYm9jaHNfZmJfaGVscGVyX2Z1bmNzID0geworCS5nYW1tYV9zZXQgPSBib2Noc19mYl9nYW1tYV9zZXQsCisJLmdhbW1hX2dldCA9IGJvY2hzX2ZiX2dhbW1hX2dldCwKKwkuZmJfcHJvYmUgPSBib2Noc2ZiX2NyZWF0ZSwKK307CisKK2ludCBib2Noc19mYmRldl9pbml0KHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKQoreworCWludCByZXQ7CisKKwlib2Nocy0+ZmIuaGVscGVyLmZ1bmNzID0gJmJvY2hzX2ZiX2hlbHBlcl9mdW5jczsKKwlzcGluX2xvY2tfaW5pdCgmYm9jaHMtPmZiLmRpcnR5X2xvY2spOworCisJcmV0ID0gZHJtX2ZiX2hlbHBlcl9pbml0KGJvY2hzLT5kZXYsICZib2Nocy0+ZmIuaGVscGVyLAorCQkJCSAxLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZHJtX2ZiX2hlbHBlcl9zaW5nbGVfYWRkX2FsbF9jb25uZWN0b3JzKCZib2Nocy0+ZmIuaGVscGVyKTsKKwlkcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhib2Nocy0+ZGV2KTsKKwlkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnKCZib2Nocy0+ZmIuaGVscGVyLCAzMik7CisKKwlib2Nocy0+ZmIuaW5pdGlhbGl6ZWQgPSB0cnVlOworCXJldHVybiAwOworfQorCit2b2lkIGJvY2hzX2ZiZGV2X2Zpbmkoc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMpCit7CisJaWYgKCFib2Nocy0+ZmIuaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCWJvY2hzX2ZiZGV2X2Rlc3Ryb3koYm9jaHMpOworCWJvY2hzLT5mYi5pbml0aWFsaXplZCA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JvY2hzL2JvY2hzX2h3LmMgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmU2MTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2JvY2hzL2JvY2hzX2h3LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJib2Nocy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGJvY2hzX3ZnYV93cml0ZWIoc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMsIHUxNiBpb3BvcnQsIHU4IHZhbCkKK3sKKwlpZiAoV0FSTl9PTihpb3BvcnQgPCAweDNjMCB8fCBpb3BvcnQgPiAweDNkZikpCisJCXJldHVybjsKKworCWlmIChib2Nocy0+bW1pbykgeworCQlpbnQgb2Zmc2V0ID0gaW9wb3J0IC0gMHgzYzAgKyAweDQwMDsKKwkJd3JpdGViKHZhbCwgYm9jaHMtPm1taW8gKyBvZmZzZXQpOworCX0gZWxzZSB7CisJCW91dGIodmFsLCBpb3BvcnQpOworCX0KK30KKworc3RhdGljIHUxNiBib2Noc19kaXNwaV9yZWFkKHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzLCB1MTYgcmVnKQoreworCXUxNiByZXQgPSAwOworCisJaWYgKGJvY2hzLT5tbWlvKSB7CisJCWludCBvZmZzZXQgPSAweDUwMCArIChyZWcgPDwgMSk7CisJCXJldCA9IHJlYWR3KGJvY2hzLT5tbWlvICsgb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlvdXR3KHJlZywgVkJFX0RJU1BJX0lPUE9SVF9JTkRFWCk7CisJCXJldCA9IGludyhWQkVfRElTUElfSU9QT1JUX0RBVEEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBib2Noc19kaXNwaV93cml0ZShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocywgdTE2IHJlZywgdTE2IHZhbCkKK3sKKwlpZiAoYm9jaHMtPm1taW8pIHsKKwkJaW50IG9mZnNldCA9IDB4NTAwICsgKHJlZyA8PCAxKTsKKwkJd3JpdGV3KHZhbCwgYm9jaHMtPm1taW8gKyBvZmZzZXQpOworCX0gZWxzZSB7CisJCW91dHcocmVnLCBWQkVfRElTUElfSU9QT1JUX0lOREVYKTsKKwkJb3V0dyh2YWwsIFZCRV9ESVNQSV9JT1BPUlRfREFUQSk7CisJfQorfQorCitpbnQgYm9jaHNfaHdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocyA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplLCBtZW0sIGlvYWRkciwgaW9zaXplOworCXUxNiBpZDsKKworCWlmICgvKiAoZW50LT5kcml2ZXJfZGF0YSA9PSBCT0NIU19RRU1VX1NURFZHQSkgJiYgKi8KKwkgICAgKHBkZXYtPnJlc291cmNlWzJdLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCS8qIG1taW8gYmFyIHdpdGggdmdhIGFuZCBib2NocyByZWdpc3RlcnMgcHJlc2VudCAqLworCQlpZiAocGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDIsICJib2Nocy1kcm0iKSAhPSAwKSB7CisJCQlEUk1fRVJST1IoIkNhbm5vdCByZXF1ZXN0IG1taW8gcmVnaW9uXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCQlpb3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpOworCQlib2Nocy0+bW1pbyA9IGlvcmVtYXAoaW9hZGRyLCBpb3NpemUpOworCQlpZiAoYm9jaHMtPm1taW8gPT0gTlVMTCkgeworCQkJRFJNX0VSUk9SKCJDYW5ub3QgbWFwIG1taW8gcmVnaW9uXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJaW9hZGRyID0gVkJFX0RJU1BJX0lPUE9SVF9JTkRFWDsKKwkJaW9zaXplID0gMjsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIGlvc2l6ZSwgImJvY2hzLWRybSIpKSB7CisJCQlEUk1fRVJST1IoIkNhbm5vdCByZXF1ZXN0IGlvcG9ydHNcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlib2Nocy0+aW9wb3J0cyA9IDE7CisJfQorCisJaWQgPSBib2Noc19kaXNwaV9yZWFkKGJvY2hzLCBWQkVfRElTUElfSU5ERVhfSUQpOworCW1lbSA9IGJvY2hzX2Rpc3BpX3JlYWQoYm9jaHMsIFZCRV9ESVNQSV9JTkRFWF9WSURFT19NRU1PUllfNjRLKQorCQkqIDY0ICogMTAyNDsKKwlpZiAoKGlkICYgMHhmZmYwKSAhPSBWQkVfRElTUElfSUQwKSB7CisJCURSTV9FUlJPUigiSUQgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHBkZXYtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCisJCXJldHVybiAtRU5PREVWOworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJaWYgKGFkZHIgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHNpemUgIT0gbWVtKSB7CisJCURSTV9FUlJPUigiU2l6ZSBtaXNtYXRjaDogcGNpPSVsZCwgYm9jaHM9JWxkXG4iLAorCQkJc2l6ZSwgbWVtKTsKKwkJc2l6ZSA9IG1pbihzaXplLCBtZW0pOworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgImJvY2hzLWRybSIpICE9IDApIHsKKwkJRFJNX0VSUk9SKCJDYW5ub3QgcmVxdWVzdCBmcmFtZWJ1ZmZlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJYm9jaHMtPmZiX21hcCA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7CisJaWYgKGJvY2hzLT5mYl9tYXAgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkNhbm5vdCBtYXAgZnJhbWVidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYm9jaHMtPmZiX2Jhc2UgPSBhZGRyOworCWJvY2hzLT5mYl9zaXplID0gc2l6ZTsKKworCURSTV9JTkZPKCJGb3VuZCBib2NocyBWR0EsIElEIDB4JXguXG4iLCBpZCk7CisJRFJNX0lORk8oIkZyYW1lYnVmZmVyIHNpemUgJWxkIGtCIEAgMHglbHgsICVzIEAgMHglbHguXG4iLAorCQkgc2l6ZSAvIDEwMjQsIGFkZHIsCisJCSBib2Nocy0+aW9wb3J0cyA/ICJpb3BvcnRzIiA6ICJtbWlvIiwKKwkJIGlvYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm9jaHNfaHdfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChib2Nocy0+bW1pbykKKwkJaW91bm1hcChib2Nocy0+bW1pbyk7CisJaWYgKGJvY2hzLT5pb3BvcnRzKQorCQlyZWxlYXNlX3JlZ2lvbihWQkVfRElTUElfSU9QT1JUX0lOREVYLCAyKTsKKwlpZiAoYm9jaHMtPmZiX21hcCkKKwkJaW91bm1hcChib2Nocy0+ZmJfbWFwKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGRldi0+cGRldik7Cit9CisKK3ZvaWQgYm9jaHNfaHdfc2V0bW9kZShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocywKKwkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJYm9jaHMtPnhyZXMgPSBtb2RlLT5oZGlzcGxheTsKKwlib2Nocy0+eXJlcyA9IG1vZGUtPnZkaXNwbGF5OworCWJvY2hzLT5icHAgPSAzMjsKKwlib2Nocy0+c3RyaWRlID0gbW9kZS0+aGRpc3BsYXkgKiAoYm9jaHMtPmJwcCAvIDgpOworCWJvY2hzLT55cmVzX3ZpcnR1YWwgPSBib2Nocy0+ZmJfc2l6ZSAvIGJvY2hzLT5zdHJpZGU7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlZHglZCBAICVkIGJwcCwgdnkgJWRcbiIsCisJCQkgYm9jaHMtPnhyZXMsIGJvY2hzLT55cmVzLCBib2Nocy0+YnBwLAorCQkJIGJvY2hzLT55cmVzX3ZpcnR1YWwpOworCisJYm9jaHNfdmdhX3dyaXRlYihib2NocywgMHgzYzAsIDB4MjApOyAvKiB1bmJsYW5rICovCisKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX0JQUCwgICAgICAgICBib2Nocy0+YnBwKTsKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX1hSRVMsICAgICAgICBib2Nocy0+eHJlcyk7CisJYm9jaHNfZGlzcGlfd3JpdGUoYm9jaHMsIFZCRV9ESVNQSV9JTkRFWF9ZUkVTLCAgICAgICAgYm9jaHMtPnlyZXMpOworCWJvY2hzX2Rpc3BpX3dyaXRlKGJvY2hzLCBWQkVfRElTUElfSU5ERVhfQkFOSywgICAgICAgIDApOworCWJvY2hzX2Rpc3BpX3dyaXRlKGJvY2hzLCBWQkVfRElTUElfSU5ERVhfVklSVF9XSURUSCwgIGJvY2hzLT54cmVzKTsKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX1ZJUlRfSEVJR0hULAorCQkJICBib2Nocy0+eXJlc192aXJ0dWFsKTsKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX1hfT0ZGU0VULCAgICAwKTsKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX1lfT0ZGU0VULCAgICAwKTsKKworCWJvY2hzX2Rpc3BpX3dyaXRlKGJvY2hzLCBWQkVfRElTUElfSU5ERVhfRU5BQkxFLAorCQkJICBWQkVfRElTUElfRU5BQkxFRCB8IFZCRV9ESVNQSV9MRkJfRU5BQkxFRCk7Cit9CisKK3ZvaWQgYm9jaHNfaHdfc2V0YmFzZShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocywKKwkJICAgICAgaW50IHgsIGludCB5LCB1NjQgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWFkZHIgKworCQl5ICogYm9jaHMtPnN0cmlkZSArCisJCXggKiAoYm9jaHMtPmJwcCAvIDgpOworCWludCB2eSA9IG9mZnNldCAvIGJvY2hzLT5zdHJpZGU7CisJaW50IHZ4ID0gKG9mZnNldCAlIGJvY2hzLT5zdHJpZGUpICogOCAvIGJvY2hzLT5icHA7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJ4ICVkLCB5ICVkLCBhZGRyICVsbHggLT4gb2Zmc2V0ICVseCwgdnggJWQsIHZ5ICVkXG4iLAorCQkJIHgsIHksIGFkZHIsIG9mZnNldCwgdngsIHZ5KTsKKwlib2Noc19kaXNwaV93cml0ZShib2NocywgVkJFX0RJU1BJX0lOREVYX1hfT0ZGU0VULCB2eCk7CisJYm9jaHNfZGlzcGlfd3JpdGUoYm9jaHMsIFZCRV9ESVNQSV9JTkRFWF9ZX09GRlNFVCwgdnkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JvY2hzL2JvY2hzX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL2JvY2hzL2JvY2hzX2ttcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZWM3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfa21zLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJib2Nocy5oIgorCitzdGF0aWMgaW50IGRlZnggPSAxMDI0Oworc3RhdGljIGludCBkZWZ5ID0gNzY4OworCittb2R1bGVfcGFyYW0oZGVmeCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShkZWZ5LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWZ4LCAiZGVmYXVsdCB4IHJlc29sdXRpb24iKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmeSwgImRlZmF1bHQgeSByZXNvbHV0aW9uIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgYm9jaHNfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7Cit9CisKK3N0YXRpYyB2b2lkIGJvY2hzX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBib29sIGJvY2hzX2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGJvY2hzX2NydGNfbW9kZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKKwkJCQkgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0KKwkJY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBib2Noc19kZXZpY2UsIGNydGMpOworCXN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciAqYm9jaHNfZmI7CisJc3RydWN0IGJvY2hzX2JvICpibzsKKwl1NjQgZ3B1X2FkZHIgPSAwOworCWludCByZXQ7CisKKwlpZiAob2xkX2ZiKSB7CisJCWJvY2hzX2ZiID0gdG9fYm9jaHNfZnJhbWVidWZmZXIob2xkX2ZiKTsKKwkJYm8gPSBnZW1fdG9fYm9jaHNfYm8oYm9jaHNfZmItPm9iaik7CisJCXJldCA9IHR0bV9ib19yZXNlcnZlKCZiby0+Ym8sIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc2VydmUgb2xkX2ZiIGJvXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWJvY2hzX2JvX3VucGluKGJvKTsKKwkJCXR0bV9ib191bnJlc2VydmUoJmJvLT5ibyk7CisJCX0KKwl9CisKKwlpZiAoV0FSTl9PTihjcnRjLT5mYiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlib2Noc19mYiA9IHRvX2JvY2hzX2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwlibyA9IGdlbV90b19ib2Noc19ibyhib2Noc19mYi0+b2JqKTsKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPmJvLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBib2Noc19ib19waW4oYm8sIFRUTV9QTF9GTEFHX1ZSQU0sICZncHVfYWRkcik7CisJaWYgKHJldCkgeworCQl0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXR0bV9ib191bnJlc2VydmUoJmJvLT5ibyk7CisJYm9jaHNfaHdfc2V0YmFzZShib2NocywgeCwgeSwgZ3B1X2FkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJvY2hzX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLAorCQkJICAgICAgIGludCB4LCBpbnQgeSwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0KKwkJY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBib2Noc19kZXZpY2UsIGNydGMpOworCisJYm9jaHNfaHdfc2V0bW9kZShib2NocywgbW9kZSk7CisJYm9jaHNfY3J0Y19tb2RlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvY2hzX2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7Cit9CisKK3N0YXRpYyB2b2lkIGJvY2hzX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKK30KKworc3RhdGljIHZvaWQgYm9jaHNfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKKwkJCQkgdTE2ICpibHVlLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKK30KKworLyogVGhlc2UgcHJvdmlkZSB0aGUgbWluaW11bSBzZXQgb2YgZnVuY3Rpb25zIHJlcXVpcmVkIHRvIGhhbmRsZSBhIENSVEMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgYm9jaHNfY3J0Y19mdW5jcyA9IHsKKwkuZ2FtbWFfc2V0ID0gYm9jaHNfY3J0Y19nYW1tYV9zZXQsCisJLnNldF9jb25maWcgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKKwkuZGVzdHJveSA9IGRybV9jcnRjX2NsZWFudXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBib2Noc19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBib2Noc19jcnRjX2RwbXMsCisJLm1vZGVfZml4dXAgPSBib2Noc19jcnRjX21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gYm9jaHNfY3J0Y19tb2RlX3NldCwKKwkubW9kZV9zZXRfYmFzZSA9IGJvY2hzX2NydGNfbW9kZV9zZXRfYmFzZSwKKwkucHJlcGFyZSA9IGJvY2hzX2NydGNfcHJlcGFyZSwKKwkuY29tbWl0ID0gYm9jaHNfY3J0Y19jb21taXQsCisJLmxvYWRfbHV0ID0gYm9jaHNfY3J0Y19sb2FkX2x1dCwKK307CisKK3N0YXRpYyB2b2lkIGJvY2hzX2NydGNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmYm9jaHMtPmNydGM7CisKKwlkcm1fY3J0Y19pbml0KGRldiwgY3J0YywgJmJvY2hzX2NydGNfZnVuY3MpOworCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoY3J0YywgMjU2KTsKKwlkcm1fY3J0Y19oZWxwZXJfYWRkKGNydGMsICZib2Noc19oZWxwZXJfZnVuY3MpOworfQorCitzdGF0aWMgYm9vbCBib2Noc19lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYm9jaHNfZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7Cit9CisKK3N0YXRpYyB2b2lkIGJvY2hzX2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBzdGF0ZSkKK3sKK30KKworc3RhdGljIHZvaWQgYm9jaHNfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKK30KKworc3RhdGljIHZvaWQgYm9jaHNfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBib2Noc19lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGJvY2hzX2VuY29kZXJfZHBtcywKKwkubW9kZV9maXh1cCA9IGJvY2hzX2VuY29kZXJfbW9kZV9maXh1cCwKKwkubW9kZV9zZXQgPSBib2Noc19lbmNvZGVyX21vZGVfc2V0LAorCS5wcmVwYXJlID0gYm9jaHNfZW5jb2Rlcl9wcmVwYXJlLAorCS5jb21taXQgPSBib2Noc19lbmNvZGVyX2NvbW1pdCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgYm9jaHNfZW5jb2Rlcl9lbmNvZGVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gZHJtX2VuY29kZXJfY2xlYW51cCwKK307CisKK3N0YXRpYyB2b2lkIGJvY2hzX2VuY29kZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmYm9jaHMtPmVuY29kZXI7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MTsKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJmJvY2hzX2VuY29kZXJfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX0RBQyk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmYm9jaHNfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOworfQorCisKK2ludCBib2Noc19jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJaW50IGNvdW50OworCisJY291bnQgPSBkcm1fYWRkX21vZGVzX25vZWRpZChjb25uZWN0b3IsIDgxOTIsIDgxOTIpOworCWRybV9zZXRfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCBkZWZ4LCBkZWZ5KTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocyA9CisJCWNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCBib2Noc19kZXZpY2UsIGNvbm5lY3Rvcik7CisJdW5zaWduZWQgbG9uZyBzaXplID0gbW9kZS0+aGRpc3BsYXkgKiBtb2RlLT52ZGlzcGxheSAqIDQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBjYW4gZml0IHR3byBmcmFtZWJ1ZmZlcnMgaW50byB2aWRlbyBtZW1vcnkuCisJICogVGhpcyBhbGxvd3MgdXAgdG8gMTYwMHgxMjAwIHdpdGggMTYgTUIgKGRlZmF1bHQgc2l6ZSkuCisJICogSWYgeW91IHdhbnQgbW9yZSB0cnkgdGhpczoKKwkgKiAgICAgJ3FlbXUgLXZnYSBzdGQgLWdsb2JhbCBWR0EudmdhbWVtX21iPTMyICRvdGhlcmFyZ3MnCisJICovCisJaWYgKHNpemUgKiAyID4gYm9jaHMtPmZiX3NpemUpCisJCXJldHVybiBNT0RFX0JBRDsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICoKK2JvY2hzX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlpbnQgZW5jX2lkID0gY29ubmVjdG9yLT5lbmNvZGVyX2lkc1swXTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCisJLyogcGljayB0aGUgZW5jb2RlciBpZHMgKi8KKwlpZiAoZW5jX2lkKSB7CisJCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGNvbm5lY3Rvci0+ZGV2LCBlbmNfaWQsCisJCQkJCSAgIERSTV9NT0RFX09CSkVDVF9FTkNPREVSKTsKKwkJaWYgKCFvYmopCisJCQlyZXR1cm4gTlVMTDsKKwkJZW5jb2RlciA9IG9ial90b19lbmNvZGVyKG9iaik7CisJCXJldHVybiBlbmNvZGVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgYm9jaHNfY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvcgorCQkJCQkJCSpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCit7CisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworfQorCitzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgYm9jaHNfY29ubmVjdG9yX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IGJvY2hzX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSBib2Noc19jb25uZWN0b3JfbW9kZV92YWxpZCwKKwkuYmVzdF9lbmNvZGVyID0gYm9jaHNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKK307CisKK3N0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGJvY2hzX2Nvbm5lY3Rvcl9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRwbXMgPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAorCS5kZXRlY3QgPSBib2Noc19jb25uZWN0b3JfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAorfTsKKworc3RhdGljIHZvaWQgYm9jaHNfY29ubmVjdG9yX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocyA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZib2Nocy0+Y29ubmVjdG9yOworCisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLCAmYm9jaHNfY29ubmVjdG9yX2Nvbm5lY3Rvcl9mdW5jcywKKwkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WSVJUVUFMKTsKKwlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLAorCQkJCSAmYm9jaHNfY29ubmVjdG9yX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworfQorCisKK2ludCBib2Noc19rbXNfaW5pdChzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocykKK3sKKwlkcm1fbW9kZV9jb25maWdfaW5pdChib2Nocy0+ZGV2KTsKKwlib2Nocy0+bW9kZV9jb25maWdfaW5pdGlhbGl6ZWQgPSB0cnVlOworCisJYm9jaHMtPmRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gODE5MjsKKwlib2Nocy0+ZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKKworCWJvY2hzLT5kZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBib2Nocy0+ZmJfYmFzZTsKKwlib2Nocy0+ZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJyZWRfZGVwdGggPSAyNDsKKwlib2Nocy0+ZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJfc2hhZG93ID0gMDsKKworCWJvY2hzLT5kZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmYm9jaHNfbW9kZV9mdW5jczsKKworCWJvY2hzX2NydGNfaW5pdChib2Nocy0+ZGV2KTsKKwlib2Noc19lbmNvZGVyX2luaXQoYm9jaHMtPmRldik7CisJYm9jaHNfY29ubmVjdG9yX2luaXQoYm9jaHMtPmRldik7CisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZib2Nocy0+Y29ubmVjdG9yLAorCQkJCQkgICZib2Nocy0+ZW5jb2Rlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBib2Noc19rbXNfZmluaShzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocykKK3sKKwlpZiAoYm9jaHMtPm1vZGVfY29uZmlnX2luaXRpYWxpemVkKSB7CisJCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGJvY2hzLT5kZXYpOworCQlib2Nocy0+bW9kZV9jb25maWdfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfbW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjg1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfbW0uYwpAQCAtMCwwICsxLDU0NiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgImJvY2hzLmgiCisKK3N0YXRpYyB2b2lkIGJvY2hzX3R0bV9wbGFjZW1lbnQoc3RydWN0IGJvY2hzX2JvICpibywgaW50IGRvbWFpbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2Noc19iZGV2KHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGJkLCBzdHJ1Y3QgYm9jaHNfZGV2aWNlLCB0dG0uYmRldik7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfdHRtX21lbV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKK3sKKwlyZXR1cm4gdHRtX21lbV9nbG9iYWxfaW5pdChyZWYtPm9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIGJvY2hzX3R0bV9tZW1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpCit7CisJdHRtX21lbV9nbG9iYWxfcmVsZWFzZShyZWYtPm9iamVjdCk7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfdHRtX2dsb2JhbF9pbml0KHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKQoreworCXN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqZ2xvYmFsX3JlZjsKKwlpbnQgcjsKKworCWdsb2JhbF9yZWYgPSAmYm9jaHMtPnR0bS5tZW1fZ2xvYmFsX3JlZjsKKwlnbG9iYWxfcmVmLT5nbG9iYWxfdHlwZSA9IERSTV9HTE9CQUxfVFRNX01FTTsKKwlnbG9iYWxfcmVmLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0dG1fbWVtX2dsb2JhbCk7CisJZ2xvYmFsX3JlZi0+aW5pdCA9ICZib2Noc190dG1fbWVtX2dsb2JhbF9pbml0OworCWdsb2JhbF9yZWYtPnJlbGVhc2UgPSAmYm9jaHNfdHRtX21lbV9nbG9iYWxfcmVsZWFzZTsKKwlyID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKKwlpZiAociAhPSAwKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIG1lbW9yeSBhY2NvdW50aW5nICIKKwkJCSAgInN1YnN5c3RlbS5cbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlib2Nocy0+dHRtLmJvX2dsb2JhbF9yZWYubWVtX2dsb2IgPQorCQlib2Nocy0+dHRtLm1lbV9nbG9iYWxfcmVmLm9iamVjdDsKKwlnbG9iYWxfcmVmID0gJmJvY2hzLT50dG0uYm9fZ2xvYmFsX3JlZi5yZWY7CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBEUk1fR0xPQkFMX1RUTV9CTzsKKwlnbG9iYWxfcmVmLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0dG1fYm9fZ2xvYmFsKTsKKwlnbG9iYWxfcmVmLT5pbml0ID0gJnR0bV9ib19nbG9iYWxfaW5pdDsKKwlnbG9iYWxfcmVmLT5yZWxlYXNlID0gJnR0bV9ib19nbG9iYWxfcmVsZWFzZTsKKwlyID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKKwlpZiAociAhPSAwKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIEJPIHN1YnN5c3RlbS5cbiIpOworCQlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmJvY2hzLT50dG0ubWVtX2dsb2JhbF9yZWYpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9jaHNfdHRtX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKQoreworCWlmIChib2Nocy0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHJtX2dsb2JhbF9pdGVtX3VucmVmKCZib2Nocy0+dHRtLmJvX2dsb2JhbF9yZWYucmVmKTsKKwlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmJvY2hzLT50dG0ubWVtX2dsb2JhbF9yZWYpOworCWJvY2hzLT50dG0ubWVtX2dsb2JhbF9yZWYucmVsZWFzZSA9IE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgYm9jaHNfYm9fdHRtX2Rlc3Ryb3koc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0Ym8pCit7CisJc3RydWN0IGJvY2hzX2JvICpibzsKKworCWJvID0gY29udGFpbmVyX29mKHRibywgc3RydWN0IGJvY2hzX2JvLCBibyk7CisJZHJtX2dlbV9vYmplY3RfcmVsZWFzZSgmYm8tPmdlbSk7CisJa2ZyZWUoYm8pOworfQorCitzdGF0aWMgYm9vbCBib2Noc190dG1fYm9faXNfYm9jaHNfYm8oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3sKKwlpZiAoYm8tPmRlc3Ryb3kgPT0gJmJvY2hzX2JvX3R0bV9kZXN0cm95KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfYm9faW5pdF9tZW1fdHlwZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdWludDMyX3QgdHlwZSwKKwkJCQkgIHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVFRNX1BMX1NZU1RFTToKKwkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEU7CisJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfTUFTS19DQUNISU5HOworCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX0NBQ0hFRDsKKwkJYnJlYWs7CisJY2FzZSBUVE1fUExfVlJBTToKKwkJbWFuLT5mdW5jID0gJnR0bV9ib19tYW5hZ2VyX2Z1bmM7CisJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX0ZJWEVEIHwKKwkJCVRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEU7CisJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CisJCQlUVE1fUExfRkxBR19XQzsKKwkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19XQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbnN1cHBvcnRlZCBtZW1vcnkgdHlwZSAldVxuIiwgKHVuc2lnbmVkKXR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitib2Noc19ib19ldmljdF9mbGFncyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGwpCit7CisJc3RydWN0IGJvY2hzX2JvICpib2Noc2JvID0gYm9jaHNfYm8oYm8pOworCisJaWYgKCFib2Noc190dG1fYm9faXNfYm9jaHNfYm8oYm8pKQorCQlyZXR1cm47CisKKwlib2Noc190dG1fcGxhY2VtZW50KGJvY2hzYm8sIFRUTV9QTF9GTEFHX1NZU1RFTSk7CisJKnBsID0gYm9jaHNiby0+cGxhY2VtZW50OworfQorCitzdGF0aWMgaW50IGJvY2hzX2JvX3ZlcmlmeV9hY2Nlc3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBib2Noc19ibyAqYm9jaHNibyA9IGJvY2hzX2JvKGJvKTsKKworCXJldHVybiBkcm1fdm1hX25vZGVfdmVyaWZ5X2FjY2VzcygmYm9jaHNiby0+Z2VtLnZtYV9ub2RlLCBmaWxwKTsKK30KKworc3RhdGljIGludCBib2Noc190dG1faW9fbWVtX3Jlc2VydmUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQkJICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hblttZW0tPm1lbV90eXBlXTsKKwlzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocyA9IGJvY2hzX2JkZXYoYmRldik7CisKKwltZW0tPmJ1cy5hZGRyID0gTlVMTDsKKwltZW0tPmJ1cy5vZmZzZXQgPSAwOworCW1lbS0+YnVzLnNpemUgPSBtZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZUOworCW1lbS0+YnVzLmJhc2UgPSAwOworCW1lbS0+YnVzLmlzX2lvbWVtID0gZmFsc2U7CisJaWYgKCEobWFuLT5mbGFncyAmIFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKG1lbS0+bWVtX3R5cGUpIHsKKwljYXNlIFRUTV9QTF9TWVNURU06CisJCS8qIHN5c3RlbSBtZW1vcnkgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSBUVE1fUExfVlJBTToKKwkJbWVtLT5idXMub2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCQltZW0tPmJ1cy5iYXNlID0gYm9jaHMtPmZiX2Jhc2U7CisJCW1lbS0+YnVzLmlzX2lvbWVtID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9jaHNfdHRtX2lvX21lbV9mcmVlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorCQkJCSAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCit7Cit9CisKK3N0YXRpYyBpbnQgYm9jaHNfYm9fbW92ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJIGJvb2wgZXZpY3QsIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCSBib29sIG5vX3dhaXRfZ3B1LAorCQkJIHN0cnVjdCB0dG1fbWVtX3JlZyAqbmV3X21lbSkKK3sKKwlyZXR1cm4gdHRtX2JvX21vdmVfbWVtY3B5KGJvLCBldmljdCwgbm9fd2FpdF9ncHUsIG5ld19tZW0pOworfQorCisKK3N0YXRpYyB2b2lkIGJvY2hzX3R0bV9iYWNrZW5kX2Rlc3Ryb3koc3RydWN0IHR0bV90dCAqdHQpCit7CisJdHRtX3R0X2ZpbmkodHQpOworCWtmcmVlKHR0KTsKK30KKworc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIGJvY2hzX3R0X2JhY2tlbmRfZnVuYyA9IHsKKwkuZGVzdHJveSA9ICZib2Noc190dG1fYmFja2VuZF9kZXN0cm95LAorfTsKKworc3RhdGljIHN0cnVjdCB0dG1fdHQgKmJvY2hzX3R0bV90dF9jcmVhdGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgIHVpbnQzMl90IHBhZ2VfZmxhZ3MsCisJCQkJCSAgc3RydWN0IHBhZ2UgKmR1bW15X3JlYWRfcGFnZSkKK3sKKwlzdHJ1Y3QgdHRtX3R0ICp0dDsKKworCXR0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR0bV90dCksIEdGUF9LRVJORUwpOworCWlmICh0dCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl0dC0+ZnVuYyA9ICZib2Noc190dF9iYWNrZW5kX2Z1bmM7CisJaWYgKHR0bV90dF9pbml0KHR0LCBiZGV2LCBzaXplLCBwYWdlX2ZsYWdzLCBkdW1teV9yZWFkX3BhZ2UpKSB7CisJCWtmcmVlKHR0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB0dDsKK30KKworc3RydWN0IHR0bV9ib19kcml2ZXIgYm9jaHNfYm9fZHJpdmVyID0geworCS50dG1fdHRfY3JlYXRlID0gYm9jaHNfdHRtX3R0X2NyZWF0ZSwKKwkudHRtX3R0X3BvcHVsYXRlID0gdHRtX3Bvb2xfcG9wdWxhdGUsCisJLnR0bV90dF91bnBvcHVsYXRlID0gdHRtX3Bvb2xfdW5wb3B1bGF0ZSwKKwkuaW5pdF9tZW1fdHlwZSA9IGJvY2hzX2JvX2luaXRfbWVtX3R5cGUsCisJLmV2aWN0X2ZsYWdzID0gYm9jaHNfYm9fZXZpY3RfZmxhZ3MsCisJLm1vdmUgPSBib2Noc19ib19tb3ZlLAorCS52ZXJpZnlfYWNjZXNzID0gYm9jaHNfYm9fdmVyaWZ5X2FjY2VzcywKKwkuaW9fbWVtX3Jlc2VydmUgPSAmYm9jaHNfdHRtX2lvX21lbV9yZXNlcnZlLAorCS5pb19tZW1fZnJlZSA9ICZib2Noc190dG1faW9fbWVtX2ZyZWUsCit9OworCitpbnQgYm9jaHNfbW1faW5pdChzdHJ1Y3QgYm9jaHNfZGV2aWNlICpib2NocykKK3sKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZib2Nocy0+dHRtLmJkZXY7CisJaW50IHJldDsKKworCXJldCA9IGJvY2hzX3R0bV9nbG9iYWxfaW5pdChib2Nocyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9ib19kZXZpY2VfaW5pdCgmYm9jaHMtPnR0bS5iZGV2LAorCQkJCSBib2Nocy0+dHRtLmJvX2dsb2JhbF9yZWYucmVmLm9iamVjdCwKKwkJCQkgJmJvY2hzX2JvX2RyaXZlciwgRFJNX0ZJTEVfUEFHRV9PRkZTRVQsCisJCQkJIHRydWUpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJFcnJvciBpbml0aWFsaXNpbmcgYm8gZHJpdmVyOyAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB0dG1fYm9faW5pdF9tbShiZGV2LCBUVE1fUExfVlJBTSwKKwkJCSAgICAgYm9jaHMtPmZiX3NpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0dG0gVlJBTSBpbml0OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlib2Nocy0+dHRtLmluaXRpYWxpemVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBib2Noc19tbV9maW5pKHN0cnVjdCBib2Noc19kZXZpY2UgKmJvY2hzKQoreworCWlmICghYm9jaHMtPnR0bS5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJdHRtX2JvX2RldmljZV9yZWxlYXNlKCZib2Nocy0+dHRtLmJkZXYpOworCWJvY2hzX3R0bV9nbG9iYWxfcmVsZWFzZShib2Nocyk7CisJYm9jaHMtPnR0bS5pbml0aWFsaXplZCA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBib2Noc190dG1fcGxhY2VtZW50KHN0cnVjdCBib2Noc19ibyAqYm8sIGludCBkb21haW4pCit7CisJdTMyIGMgPSAwOworCWJvLT5wbGFjZW1lbnQuZnBmbiA9IDA7CisJYm8tPnBsYWNlbWVudC5scGZuID0gMDsKKwliby0+cGxhY2VtZW50LnBsYWNlbWVudCA9IGJvLT5wbGFjZW1lbnRzOworCWJvLT5wbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSBiby0+cGxhY2VtZW50czsKKwlpZiAoZG9tYWluICYgVFRNX1BMX0ZMQUdfVlJBTSkgeworCQliby0+cGxhY2VtZW50c1tjKytdID0gVFRNX1BMX0ZMQUdfV0MgfCBUVE1fUExfRkxBR19VTkNBQ0hFRAorCQkJfCBUVE1fUExfRkxBR19WUkFNOworCX0KKwlpZiAoZG9tYWluICYgVFRNX1BMX0ZMQUdfU1lTVEVNKSB7CisJCWJvLT5wbGFjZW1lbnRzW2MrK10gPSBUVE1fUExfTUFTS19DQUNISU5HIHwgVFRNX1BMX0ZMQUdfU1lTVEVNOworCX0KKwlpZiAoIWMpIHsKKwkJYm8tPnBsYWNlbWVudHNbYysrXSA9IFRUTV9QTF9NQVNLX0NBQ0hJTkcgfCBUVE1fUExfRkxBR19TWVNURU07CisJfQorCWJvLT5wbGFjZW1lbnQubnVtX3BsYWNlbWVudCA9IGM7CisJYm8tPnBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSBjOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBib2Noc19ib19ncHVfb2Zmc2V0KHN0cnVjdCBib2Noc19ibyAqYm8pCit7CisJcmV0dXJuIGJvLT5iby5vZmZzZXQ7Cit9CisKK2ludCBib2Noc19ib19waW4oc3RydWN0IGJvY2hzX2JvICpibywgdTMyIHBsX2ZsYWcsIHU2NCAqZ3B1X2FkZHIpCit7CisJaW50IGksIHJldDsKKworCWlmIChiby0+cGluX2NvdW50KSB7CisJCWJvLT5waW5fY291bnQrKzsKKwkJaWYgKGdwdV9hZGRyKQorCQkJKmdwdV9hZGRyID0gYm9jaHNfYm9fZ3B1X29mZnNldChibyk7CisJCXJldHVybiAwOworCX0KKworCWJvY2hzX3R0bV9wbGFjZW1lbnQoYm8sIHBsX2ZsYWcpOworCWZvciAoaSA9IDA7IGkgPCBiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKKwkJYm8tPnBsYWNlbWVudHNbaV0gfD0gVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKCZiby0+Ym8sICZiby0+cGxhY2VtZW50LCBmYWxzZSwgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliby0+cGluX2NvdW50ID0gMTsKKwlpZiAoZ3B1X2FkZHIpCisJCSpncHVfYWRkciA9IGJvY2hzX2JvX2dwdV9vZmZzZXQoYm8pOworCXJldHVybiAwOworfQorCitpbnQgYm9jaHNfYm9fdW5waW4oc3RydWN0IGJvY2hzX2JvICpibykKK3sKKwlpbnQgaSwgcmV0OworCisJaWYgKCFiby0+cGluX2NvdW50KSB7CisJCURSTV9FUlJPUigidW5waW4gYmFkICVwXG4iLCBibyk7CisJCXJldHVybiAwOworCX0KKwliby0+cGluX2NvdW50LS07CisKKwlpZiAoYm8tPnBpbl9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYm8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50OyBpKyspCisJCWJvLT5wbGFjZW1lbnRzW2ldICY9IH5UVE1fUExfRkxBR19OT19FVklDVDsKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJmJvLT5ibywgJmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitpbnQgYm9jaHNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CisJc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHM7CisKKwlpZiAodW5saWtlbHkodm1hLT52bV9wZ29mZiA8IERSTV9GSUxFX1BBR0VfT0ZGU0VUKSkKKwkJcmV0dXJuIGRybV9tbWFwKGZpbHAsIHZtYSk7CisKKwlmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJYm9jaHMgPSBmaWxlX3ByaXYtPm1pbm9yLT5kZXYtPmRldl9wcml2YXRlOworCXJldHVybiB0dG1fYm9fbW1hcChmaWxwLCB2bWEsICZib2Nocy0+dHRtLmJkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYm9jaHNfYm9fY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBzaXplLCBpbnQgYWxpZ24sCisJCQkgICB1aW50MzJfdCBmbGFncywgc3RydWN0IGJvY2hzX2JvICoqcGJvY2hzYm8pCit7CisJc3RydWN0IGJvY2hzX2RldmljZSAqYm9jaHMgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBib2Noc19ibyAqYm9jaHNibzsKKwlzaXplX3QgYWNjX3NpemU7CisJaW50IHJldDsKKworCWJvY2hzYm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm9jaHNfYm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJvY2hzYm8pCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gZHJtX2dlbV9vYmplY3RfaW5pdChkZXYsICZib2Noc2JvLT5nZW0sIHNpemUpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoYm9jaHNibyk7CisJCXJldHVybiByZXQ7CisJfQorCisJYm9jaHNiby0+Ym8uYmRldiA9ICZib2Nocy0+dHRtLmJkZXY7CisJYm9jaHNiby0+Ym8uYmRldi0+ZGV2X21hcHBpbmcgPSBkZXYtPmRldl9tYXBwaW5nOworCisJYm9jaHNfdHRtX3BsYWNlbWVudChib2Noc2JvLCBUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX0ZMQUdfU1lTVEVNKTsKKworCWFjY19zaXplID0gdHRtX2JvX2RtYV9hY2Nfc2l6ZSgmYm9jaHMtPnR0bS5iZGV2LCBzaXplLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJvY2hzX2JvKSk7CisKKwlyZXQgPSB0dG1fYm9faW5pdCgmYm9jaHMtPnR0bS5iZGV2LCAmYm9jaHNiby0+Ym8sIHNpemUsCisJCQkgIHR0bV9ib190eXBlX2RldmljZSwgJmJvY2hzYm8tPnBsYWNlbWVudCwKKwkJCSAgYWxpZ24gPj4gUEFHRV9TSElGVCwgZmFsc2UsIE5VTEwsIGFjY19zaXplLAorCQkJICBOVUxMLCBib2Noc19ib190dG1fZGVzdHJveSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSpwYm9jaHNibyA9IGJvY2hzYm87CisJcmV0dXJuIDA7Cit9CisKK2ludCBib2Noc19nZW1fY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzaXplLCBib29sIGlza2VybmVsLAorCQkgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iaikKK3sKKwlzdHJ1Y3QgYm9jaHNfYm8gKmJvY2hzYm87CisJaW50IHJldDsKKworCSpvYmogPSBOVUxMOworCisJc2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBib2Noc19ib19jcmVhdGUoZGV2LCBzaXplLCAwLCAwLCAmYm9jaHNibyk7CisJaWYgKHJldCkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIEdFTSBvYmplY3RcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkqb2JqID0gJmJvY2hzYm8tPmdlbTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJvY2hzX2R1bWJfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iICphcmdzKQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKKwl1MzIgaGFuZGxlOworCWludCByZXQ7CisKKwlhcmdzLT5waXRjaCA9IGFyZ3MtPndpZHRoICogKChhcmdzLT5icHAgKyA3KSAvIDgpOworCWFyZ3MtPnNpemUgPSBhcmdzLT5waXRjaCAqIGFyZ3MtPmhlaWdodDsKKworCXJldCA9IGJvY2hzX2dlbV9jcmVhdGUoZGV2LCBhcmdzLT5zaXplLCBmYWxzZSwKKwkJCSAgICAgICAmZ29iaik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlLCBnb2JqLCAmaGFuZGxlKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChnb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYXJncy0+aGFuZGxlID0gaGFuZGxlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib2Noc19ib191bnJlZihzdHJ1Y3QgYm9jaHNfYm8gKipibykKK3sKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKnRibzsKKworCWlmICgoKmJvKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0Ym8gPSAmKCgqYm8pLT5ibyk7CisJdHRtX2JvX3VucmVmKCZ0Ym8pOworCWlmICh0Ym8gPT0gTlVMTCkKKwkJKmJvID0gTlVMTDsKKworfQorCit2b2lkIGJvY2hzX2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgYm9jaHNfYm8gKmJvY2hzX2JvID0gZ2VtX3RvX2JvY2hzX2JvKG9iaik7CisKKwlpZiAoIWJvY2hzX2JvKQorCQlyZXR1cm47CisJYm9jaHNfYm9fdW5yZWYoJmJvY2hzX2JvKTsKK30KKworaW50IGJvY2hzX2R1bWJfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9maWxlICpmaWxlLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgdWludDMyX3QgaGFuZGxlLCB1aW50NjRfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCWludCByZXQ7CisJc3RydWN0IGJvY2hzX2JvICpibzsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBoYW5kbGUpOworCWlmIChvYmogPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJYm8gPSBnZW1fdG9fYm9jaHNfYm8ob2JqKTsKKwkqb2Zmc2V0ID0gYm9jaHNfYm9fbW1hcF9vZmZzZXQoYm8pOworCisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlyZXQgPSAwOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgYm9jaHNfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQoreworCXN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciAqYm9jaHNfZmIgPSB0b19ib2Noc19mcmFtZWJ1ZmZlcihmYik7CisJaWYgKGJvY2hzX2ZiLT5vYmopCisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGJvY2hzX2ZiLT5vYmopOworCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKKwlrZnJlZShmYik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIGJvY2hzX2ZiX2Z1bmNzID0geworCS5kZXN0cm95ID0gYm9jaHNfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95LAorfTsKKworaW50IGJvY2hzX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBib2Noc19mcmFtZWJ1ZmZlciAqZ2ZiLAorCQkJICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kLAorCQkJICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJaW50IHJldDsKKworCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmZ2ZiLT5iYXNlLCBtb2RlX2NtZCk7CisJZ2ZiLT5vYmogPSBvYmo7CisJcmV0ID0gZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmZ2ZiLT5iYXNlLCAmYm9jaHNfZmJfZnVuY3MpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJkcm1fZnJhbWVidWZmZXJfaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKgorYm9jaHNfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlscCwKKwkJCSAgICAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyICptb2RlX2NtZCkKK3sKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgYm9jaHNfZnJhbWVidWZmZXIgKmJvY2hzX2ZiOworCWludCByZXQ7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlZHglZCwgZm9ybWF0ICVjJWMlYyVjXG4iLAorCSAgICAgICBtb2RlX2NtZC0+d2lkdGgsIG1vZGVfY21kLT5oZWlnaHQsCisJICAgICAgIChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0KSAgICAgICAmIDB4ZmYsCisJICAgICAgIChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0ID4+IDgpICAmIDB4ZmYsCisJICAgICAgIChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0ID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0ID4+IDI0KSAmIDB4ZmYpOworCisJaWYgKG1vZGVfY21kLT5waXhlbF9mb3JtYXQgIT0gRFJNX0ZPUk1BVF9YUkdCODg4OCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxwLCBtb2RlX2NtZC0+aGFuZGxlc1swXSk7CisJaWYgKG9iaiA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCWJvY2hzX2ZiID0ga3phbGxvYyhzaXplb2YoKmJvY2hzX2ZiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFib2Noc19mYikgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXQgPSBib2Noc19mcmFtZWJ1ZmZlcl9pbml0KGRldiwgYm9jaHNfZmIsIG1vZGVfY21kLCBvYmopOworCWlmIChyZXQpIHsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKwkJa2ZyZWUoYm9jaHNfZmIpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwlyZXR1cm4gJmJvY2hzX2ZiLT5iYXNlOworfQorCitjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIGJvY2hzX21vZGVfZnVuY3MgPSB7CisJLmZiX2NyZWF0ZSA9IGJvY2hzX3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfZHJ2LmgKaW5kZXggYjZhZGVkNy4uMTE3ZDNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfZHJ2LmgKQEAgLTIyMiw3ICsyMjIsNyBAQAogdm9pZCBjaXJydXNfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGNpcnJ1c19kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBjaXJydXNfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pcnFyZXR1cm5fdCBjaXJydXNfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitpcnFyZXR1cm5fdCBjaXJydXNfZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZyk7CiAKIAkJCQkvKiBjaXJydXNfa21zLmMgKi8KIGludCBjaXJydXNfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19mYmRldi5jIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfZmJkZXYuYwppbmRleCBiMjdlOTU2Li4zMmJiYmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19mYmRldi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX2ZiZGV2LmMKQEAgLTM5LDcgKzM5LDcgQEAKIAkgKiB0aGVuIHRoZSBCTyBpcyBiZWluZyBtb3ZlZCBhbmQgd2Ugc2hvdWxkCiAJICogc3RvcmUgdXAgdGhlIGRhbWFnZSB1bnRpbCBsYXRlci4KIAkgKi8KLQlpZiAoIWluX2ludGVycnVwdCgpKQorCWlmIChkcm1fY2FuX3NsZWVwKCkpCiAJCXJldCA9IGNpcnJ1c19ib19yZXNlcnZlKGJvLCB0cnVlKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgIT0gLUVCVVNZKQpAQCAtMjMzLDYgKzIzMyw5IEBACiAJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IGNkZXYtPmRldi0+bW9kZV9jb25maWcuZmJfYmFzZTsKIAlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gY2Rldi0+bWMudnJhbV9zaXplOwogCisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBjZGV2LT5kZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CisJaW5mby0+Zml4LnNtZW1fbGVuID0gY2Rldi0+bWMudnJhbV9zaXplOworCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBzeXNyYW07CiAJaW5mby0+c2NyZWVuX3NpemUgPSBzaXplOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19tYWluLmMgYi9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19tYWluLmMKaW5kZXggNzhlNzZmMi4uNGIwMTcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfbWFpbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21haW4uYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgY2lycnVzX2JvX3VucmVmKHN0cnVjdCBjaXJydXNfYm8gKipibykKK3N0YXRpYyB2b2lkIGNpcnJ1c19ib191bnJlZihzdHJ1Y3QgY2lycnVzX2JvICoqYm8pCiB7CiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0Ym87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21vZGUuYwppbmRleCBhZGFiYzNkLi41MzBmNzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19tb2RlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfbW9kZS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBjaXJydXNfc2V0X3N0YXJ0X2FkZHJlc3Moc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBvZmZzZXQpCitzdGF0aWMgdm9pZCBjaXJydXNfc2V0X3N0YXJ0X2FkZHJlc3Moc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGNpcnJ1c19kZXZpY2UgKmNkZXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCXUzMiBhZGRyOwpAQCAtMjczLDggKzI3Myw4IEBACiAJCXNyMDcgfD0gMHgxMTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKLQkJc3IwNyB8PSAweGMxOwotCQloZHIgPSAweGMwOworCQlzcjA3IHw9IDB4MTc7CisJCWhkciA9IDB4YzE7CiAJCWJyZWFrOwogCWNhc2UgMjQ6CiAJCXNyMDcgfD0gMHgxNTsKQEAgLTQ1Myw3ICs0NTMsNyBAQAogewogfQogCi12b2lkIGNpcnJ1c19lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQorc3RhdGljIHZvaWQgY2lycnVzX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGNpcnJ1c19lbmNvZGVyICpjaXJydXNfZW5jb2RlciA9IHRvX2NpcnJ1c19lbmNvZGVyKGVuY29kZXIpOwogCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CkBAIC00OTIsNyArNDkyLDcgQEAKIH0KIAogCi1pbnQgY2lycnVzX3ZnYV9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3N0YXRpYyBpbnQgY2lycnVzX3ZnYV9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlpbnQgY291bnQ7CiAKQEAgLTUwOSw3ICs1MDksNyBAQAogCXJldHVybiBNT0RFX09LOwogfQogCi1zdHJ1Y3QgZHJtX2VuY29kZXIgKmNpcnJ1c19jb25uZWN0b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICpjaXJydXNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvcgogCQkJCQkJICAqY29ubmVjdG9yKQogewogCWludCBlbmNfaWQgPSBjb25uZWN0b3ItPmVuY29kZXJfaWRzWzBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c190dG0uYwppbmRleCA3NWJlY2RlLi44YjM3YzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c190dG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c190dG0uYwpAQCAtODAsNyArODAsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogY2lycnVzX3R0bV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgY2lycnVzX2RldmljZSAqY2lycnVzKQogewogCWlmIChjaXJydXMtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID09IE5VTEwpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlrZnJlZShibyk7CiB9CiAKLWJvb2wgY2lycnVzX3R0bV9ib19pc19jaXJydXNfYm8oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3N0YXRpYyBib29sIGNpcnJ1c190dG1fYm9faXNfY2lycnVzX2JvKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CiAJaWYgKGJvLT5kZXN0cm95ID09ICZjaXJydXNfYm9fdHRtX2Rlc3Ryb3kpCiAJCXJldHVybiB0cnVlOwpAQCAtMjA4LDcgKzIwOCw3IEBACiB9OwogCiAKLXN0cnVjdCB0dG1fdHQgKmNpcnJ1c190dG1fdHRfY3JlYXRlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorc3RhdGljIHN0cnVjdCB0dG1fdHQgKmNpcnJ1c190dG1fdHRfY3JlYXRlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAogCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsIHVpbnQzMl90IHBhZ2VfZmxhZ3MsCiAJCQkJIHN0cnVjdCBwYWdlICpkdW1teV9yZWFkX3BhZ2UpCiB7CkBAIC0zNzUsMjYgKzM3NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjaXJydXNfYm9fdW5waW4oc3RydWN0IGNpcnJ1c19ibyAqYm8pCi17Ci0JaW50IGksIHJldDsKLQlpZiAoIWJvLT5waW5fY291bnQpIHsKLQkJRFJNX0VSUk9SKCJ1bnBpbiBiYWQgJXBcbiIsIGJvKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWJvLT5waW5fY291bnQtLTsKLQlpZiAoYm8tPnBpbl9jb3VudCkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYm8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50IDsgaSsrKQotCQliby0+cGxhY2VtZW50c1tpXSAmPSB+VFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7Ci0JcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKCZiby0+Ym8sICZiby0+cGxhY2VtZW50LCBmYWxzZSwgZmFsc2UpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50IGNpcnJ1c19ib19wdXNoX3N5c3JhbShzdHJ1Y3QgY2lycnVzX2JvICpibykKIHsKIAlpbnQgaSwgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2FncHN1cHBvcnQuYwppbmRleCBlMzAxZDY1Li5kZGUyMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2FncHN1cHBvcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2FncHN1cHBvcnQuYwpAQCAtNTMsNyArNTMsNyBAQAogICovCiBpbnQgZHJtX2FncF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2luZm8gKmluZm8pCiB7Ci0JRFJNX0FHUF9LRVJOICprZXJuOworCXN0cnVjdCBhZ3Bfa2Vybl9pbmZvICprZXJuOwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5OCwxNyArMTk4LDE1IEBACiBpbnQgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgKnJlcXVlc3QpCiB7CiAJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKLQlEUk1fQUdQX01FTSAqbWVtb3J5OworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgdHlwZTsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCEoZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoZW50cnkgPSBremFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7Ci0KIAlwYWdlcyA9IChyZXF1ZXN0LT5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJdHlwZSA9ICh1MzIpIHJlcXVlc3QtPnR5cGU7CiAJaWYgKCEobWVtb3J5ID0gYWdwX2FsbG9jYXRlX21lbW9yeShkZXYtPmFncC0+YnJpZGdlLCBwYWdlcywgdHlwZSkpKSB7CkBAIC0zOTMsMTQgKzM5MSwxNiBAQAogICogR2V0cyB0aGUgZHJtX2FncF90IHN0cnVjdHVyZSB3aGljaCBpcyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgYWdwZ2FydCBtb2R1bGUKICAqIHZpYSB0aGUgaW50ZXJfbW9kdWxlXyogZnVuY3Rpb25zLiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9hZ3BfaGVhZAogICogc3RydWN0dXJlLgorICoKKyAqIE5vdGUgdGhhdCBmaW5hbCBjbGVhbnVwIG9mIHRoZSBrbWFsbG9jZWQgc3RydWN0dXJlIGlzIGRpcmVjdGx5IGRvbmUgaW4KKyAqIGRybV9wY2lfYWdwX2Rlc3Ryb3kuCiAgKi8KIHN0cnVjdCBkcm1fYWdwX2hlYWQgKmRybV9hZ3BfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fYWdwX2hlYWQgKmhlYWQgPSBOVUxMOwogCi0JaWYgKCEoaGVhZCA9IGttYWxsb2Moc2l6ZW9mKCpoZWFkKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGhlYWQgPSBremFsbG9jKHNpemVvZigqaGVhZCksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCh2b2lkICopaGVhZCwgMCwgc2l6ZW9mKCpoZWFkKSk7CiAJaGVhZC0+YnJpZGdlID0gYWdwX2ZpbmRfYnJpZGdlKGRldi0+cGRldik7CiAJaWYgKCFoZWFkLT5icmlkZ2UpIHsKIAkJaWYgKCEoaGVhZC0+YnJpZGdlID0gYWdwX2JhY2tlbmRfYWNxdWlyZShkZXYtPnBkZXYpKSkgewpAQCAtNDM5LDcgKzQzOSw3IEBACiB7CiAJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeSwgKnRlbXBlOwogCi0JaWYgKCFkcm1fY29yZV9oYXNfQUdQKGRldikgfHwgIWRldi0+YWdwKQorCWlmICghZGV2LT5hZ3ApCiAJCXJldHVybjsKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJcmV0dXJuOwpAQCAtNDYwLDM1ICs0NjAsMjAgQEAKIH0KIAogLyoqCi0gKiBkcm1fYWdwX2Rlc3Ryb3kgLSBEZXN0cm95IEFHUCBoZWFkCi0gKiBAZGV2OiBEUk0gZGV2aWNlCi0gKgotICogRGVzdHJveSByZXNvdXJjZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHZpYSBkcm1fYWdwX2luaXRwLiBDYWxsZXIKLSAqIG11c3QgZW5zdXJlIHRvIGNsZWFuIHVwIGFsbCBBR1AgcmVzb3VyY2VzIGJlZm9yZSBjYWxsaW5nIHRoaXMuIFNlZQotICogZHJtX2FncF9jbGVhcigpLgotICoKLSAqIENhbGwgdGhpcyB0byBkZXN0cm95IEFHUCBoZWFkcyBhbGxvY2F0ZWQgdmlhIGRybV9hZ3BfaW5pdCgpLgotICovCi12b2lkIGRybV9hZ3BfZGVzdHJveShzdHJ1Y3QgZHJtX2FncF9oZWFkICphZ3ApCi17Ci0Ja2ZyZWUoYWdwKTsKLX0KLQotLyoqCiAgKiBCaW5kcyBhIGNvbGxlY3Rpb24gb2YgcGFnZXMgaW50byBBR1AgbWVtb3J5IGF0IHRoZSBnaXZlbiBvZmZzZXQsIHJldHVybmluZwogICogdGhlIEFHUCBtZW1vcnkgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlbS4KICAqCiAgKiBObyByZWZlcmVuY2UgaXMgaGVsZCBvbiB0aGUgcGFnZXMgZHVyaW5nIHRoaXMgdGltZSAtLSBpdCBpcyB1cCB0byB0aGUKICAqIGNhbGxlciB0byBoYW5kbGUgdGhhdC4KICAqLwotRFJNX0FHUF9NRU0gKgorc3RydWN0IGFncF9tZW1vcnkgKgogZHJtX2FncF9iaW5kX3BhZ2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCSAgIHN0cnVjdCBwYWdlICoqcGFnZXMsCiAJCSAgIHVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzLAogCQkgICB1aW50MzJfdCBndHRfb2Zmc2V0LAogCQkgICB1MzIgdHlwZSkKIHsKLQlEUk1fQUdQX01FTSAqbWVtOworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW07CiAJaW50IHJldCwgaTsKIAogCURSTV9ERUJVRygiXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZmZlci5jCmluZGV4IDM5YTcxODMuLjA0MDYxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZmZXIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IG5yX3BhZ2VzOyArK2lkeCkgewogCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmLT5kYXRhW2lkeF0sCisJCWlmIChjb3B5X2Zyb21fdXNlcihidWYtPmRhdGFbaWR4XSwKIAkJCXVzZXJfZGF0YSArIGlkeCAqIFBBR0VfU0laRSwKIAkJCW1pbihQQUdFX1NJWkUsIHNpemUgLSBpZHggKiBQQUdFX1NJWkUpKSkgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gY29weSB1c2VyIGRhdGEgKCVwKSB0byBkcm0gYnVmZmVyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYwppbmRleCA0NzFlMDUxZC4uZWRlYzMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCQlpbnQgdmFsaWQgPSAwOwogCi0JCWlmICghZHJtX2NvcmVfaGFzX0FHUChkZXYpKSB7CisJCWlmICghZGV2LT5hZ3ApIHsKIAkJCWtmcmVlKG1hcCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzAzLDkgKzMwMyw2IEBACiAKIAkJYnJlYWs7CiAJfQotCWNhc2UgX0RSTV9HRU06Ci0JCURSTV9FUlJPUigidHJpZWQgdG8gYWRkbWFwIEdFTSBvYmplY3RcbiIpOwotCQlicmVhazsKIAljYXNlIF9EUk1fU0NBVFRFUl9HQVRIRVI6CiAJCWlmICghZGV2LT5zZykgewogCQkJa2ZyZWUobWFwKTsKQEAgLTQ4Myw5ICs0ODAsNiBAQAogCQlkbWFoLnNpemUgPSBtYXAtPnNpemU7CiAJCV9fZHJtX3BjaV9mcmVlKGRldiwgJmRtYWgpOwogCQlicmVhazsKLQljYXNlIF9EUk1fR0VNOgotCQlEUk1fRVJST1IoInRyaWVkIHRvIHJtbWFwIEdFTSBvYmplY3RcbiIpOwotCQlicmVhazsKIAl9CiAJa2ZyZWUobWFwKTsKIApAQCAtMTM5Niw3ICsxMzkwLDcgQEAKIAlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKIAogCWlmIChyZXF1ZXN0LT5jb3VudCA+PSBkbWEtPmJ1Zl9jb3VudCkgewotCQlpZiAoKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9BR1ApKQorCQlpZiAoKGRldi0+YWdwICYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX0FHUCkpCiAJCSAgICB8fCAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykKIAkJCSYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX1NHKSkpIHsKIAkJCXN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXAgPSBkZXYtPmFncF9idWZmZXJfbWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCBkNmNmNzdjLi4zYjdkMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtNjc1LDYgKzY3NSwyOSBAQAogRVhQT1JUX1NZTUJPTChkcm1fY3J0Y19jbGVhbnVwKTsKIAogLyoqCisgKiBkcm1fY3J0Y19pbmRleCAtIGZpbmQgdGhlIGluZGV4IG9mIGEgcmVnaXN0ZXJlZCBDUlRDCisgKiBAY3J0YzogQ1JUQyB0byBmaW5kIGluZGV4IGZvcgorICoKKyAqIEdpdmVuIGEgcmVnaXN0ZXJlZCBDUlRDLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoYXQgQ1JUQyB3aXRoaW4gYSBEUk0KKyAqIGRldmljZSdzIGxpc3Qgb2YgQ1JUQ3MuCisgKi8KK3Vuc2lnbmVkIGludCBkcm1fY3J0Y19pbmRleChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKwlzdHJ1Y3QgZHJtX2NydGMgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmY3J0Yy0+ZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKHRtcCA9PSBjcnRjKQorCQkJcmV0dXJuIGluZGV4OworCisJCWluZGV4Kys7CisJfQorCisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jcnRjX2luZGV4KTsKKworLyoqCiAgKiBkcm1fbW9kZV9wcm9iZWRfYWRkIC0gYWRkIGEgbW9kZSB0byBhIGNvbm5lY3RvcidzIHByb2JlZCBtb2RlIGxpc3QKICAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB0aGUgbmV3IG1vZGUKICAqIEBtb2RlOiBtb2RlIGRhdGEKQEAgLTI3NjcsMTAgKzI3OTAsOCBAQAogCX0KIAogCWlmIChmYi0+ZnVuY3MtPmRpcnR5KSB7Ci0JCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CiAJCXJldCA9IGZiLT5mdW5jcy0+ZGlydHkoZmIsIGZpbGVfcHJpdiwgZmxhZ3MsIHItPmNvbG9yLAogCQkJCSAgICAgICBjbGlwcywgbnVtX2NsaXBzKTsKLQkJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IC1FTk9TWVM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IDAxMzYxYWIuLmVhOTJiODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTMyNCwzNSArMzI0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMpOwogCi0vKioKLSAqIGRybV9lbmNvZGVyX2NydGNfb2sgLSBjYW4gYSBnaXZlbiBjcnRjIGRyaXZlIGEgZ2l2ZW4gZW5jb2Rlcj8KLSAqIEBlbmNvZGVyOiBlbmNvZGVyIHRvIHRlc3QKLSAqIEBjcnRjOiBjcnRjIHRvIHRlc3QKLSAqCi0gKiBSZXR1cm4gZmFsc2UgaWYgQGVuY29kZXIgY2FuJ3QgYmUgZHJpdmVuIGJ5IEBjcnRjLCB0cnVlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGJvb2wgZHJtX2VuY29kZXJfY3J0Y19vayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGRybV9jcnRjICp0bXA7Ci0JaW50IGNydGNfbWFzayA9IDE7Ci0KLQlXQVJOKCFjcnRjLCAiY2hlY2tpbmcgbnVsbCBjcnRjP1xuIik7Ci0KLQlkZXYgPSBjcnRjLT5kZXY7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7Ci0JCWlmICh0bXAgPT0gY3J0YykKLQkJCWJyZWFrOwotCQljcnRjX21hc2sgPDw9IDE7Ci0JfQotCi0JaWYgKGVuY29kZXItPnBvc3NpYmxlX2NydGNzICYgY3J0Y19tYXNrKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIC8qCiAgKiBDaGVjayB0aGUgQ1JUQyB3ZSdyZSBnb2luZyB0byBtYXAgZWFjaCBvdXRwdXQgdG8gdnMuIGl0cyBjdXJyZW50CiAgKiBDUlRDLiAgSWYgdGhleSBkb24ndCBtYXRjaCwgd2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBvdXRwdXQgYW5kIHRoZSBDUlRDCkBAIC01MzYsNyArNTA3LDcgQEAKIAkgKiBhcmUgbGF0ZXIgbmVlZGVkIGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uCiAJICogdGltZXN0YW1waW5nLiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gdHJ1ZSBod21vZGUuCiAJICovCi0JZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhjcnRjKTsKKwlkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKGNydGMsICZjcnRjLT5od21vZGUpOwogCiAJLyogRklYTUU6IGFkZCBzdWJwaXhlbCBvcmRlciAqLwogZG9uZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCmluZGV4IGQ5MTM3ZTQuLjM0NWJlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwpAQCAtMzE1LDkgKzMxNSw2IEBACiAJaWYgKGRybV9kZXZpY2VfaXNfdW5wbHVnZ2VkKGRldikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JYXRvbWljX2luYygmZGV2LT5pb2N0bF9jb3VudCk7Ci0JKytmaWxlX3ByaXYtPmlvY3RsX2NvdW50OwotCiAJaWYgKChuciA+PSBEUk1fQ09SRV9JT0NUTF9DT1VOVCkgJiYKIAkgICAgKChuciA8IERSTV9DT01NQU5EX0JBU0UpIHx8IChuciA+PSBEUk1fQ09NTUFORF9FTkQpKSkKIAkJZ290byBlcnJfaTE7CkBAIC00MTAsNyArNDA3LDYgQEAKIAogCWlmIChrZGF0YSAhPSBzdGFja19rZGF0YSkKIAkJa2ZyZWUoa2RhdGEpOwotCWF0b21pY19kZWMoJmRldi0+aW9jdGxfY291bnQpOwogCWlmIChyZXRjb2RlKQogCQlEUk1fREVCVUcoInJldCA9ICVkXG4iLCByZXRjb2RlKTsKIAlyZXR1cm4gcmV0Y29kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKaW5kZXggODgzNWRjZC4uYjkyNDMwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKQEAgLTYwNSwzNDcgKzYwNSwzNDcgQEAKIAl7IERSTV9NT0RFKCI2NDB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI1MTc1LCA2NDAsIDY1NiwKIAkJICAgNzUyLCA4MDAsIDAsIDQ4MCwgNDkwLCA0OTIsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAyIC0gNzIweDQ4MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiNzIweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNzAwMCwgNzIwLCA3MzYsCiAJCSAgIDc5OCwgODU4LCAwLCA0ODAsIDQ4OSwgNDk1LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF80XzMsIH0sCiAJLyogMyAtIDcyMHg0ODBANjBIeiAqLwogCXsgRFJNX01PREUoIjcyMHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDcyMCwgNzM2LAogCQkgICA3OTgsIDg1OCwgMCwgNDgwLCA0ODksIDQ5NSwgNTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDYwLCB9LAorCSAgLnZyZWZyZXNoID0gNjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA0IC0gMTI4MHg3MjBANjBIeiAqLwogCXsgRFJNX01PREUoIjEyODB4NzIwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc0MjUwLCAxMjgwLCAxMzkwLAogCQkgICAxNDMwLCAxNjUwLCAwLCA3MjAsIDcyNSwgNzMwLCA3NTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDUgLSAxOTIweDEwODBpQDYwSHogKi8KIAl7IERSTV9NT0RFKCIxOTIweDEwODBpIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc0MjUwLCAxOTIwLCAyMDA4LAogCQkgICAyMDUyLCAyMjAwLCAwLCAxMDgwLCAxMDg0LCAxMDk0LCAxMTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSwKLQkgIC52cmVmcmVzaCA9IDYwLCB9LAorCSAgLnZyZWZyZXNoID0gNjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA2IC0gMTQ0MHg0ODBpQDYwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDQ4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDE0NDAsIDE0NzgsCiAJCSAgIDE2MDIsIDE3MTYsIDAsIDQ4MCwgNDg4LCA0OTQsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSB8IERSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDYwLCB9LAorCSAgLnZyZWZyZXNoID0gNjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDcgLSAxNDQweDQ4MGlANjBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4NDgwaSIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNzAwMCwgMTQ0MCwgMTQ3OCwKIAkJICAgMTYwMiwgMTcxNiwgMCwgNDgwLCA0ODgsIDQ5NCwgNTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDggLSAxNDQweDI0MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHgyNDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDE0NDAsIDE0NzgsCiAJCSAgIDE2MDIsIDE3MTYsIDAsIDI0MCwgMjQ0LCAyNDcsIDI2MiwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0RCTENMSyksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiA5IC0gMTQ0MHgyNDBANjBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4MjQwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI3MDAwLCAxNDQwLCAxNDc4LAogCQkgICAxNjAyLCAxNzE2LCAwLCAyNDAsIDI0NCwgMjQ3LCAyNjIsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDEwIC0gMjg4MHg0ODBpQDYwSHogKi8KIAl7IERSTV9NT0RFKCIyODgweDQ4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDI4ODAsIDI5NTYsCiAJCSAgIDMyMDQsIDM0MzIsIDAsIDQ4MCwgNDg4LCA0OTQsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAxMSAtIDI4ODB4NDgwaUA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHg0ODBpIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCAyODgwLCAyOTU2LAogCQkgICAzMjA0LCAzNDMyLCAwLCA0ODAsIDQ4OCwgNDk0LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDEyIC0gMjg4MHgyNDBANjBIeiAqLwogCXsgRFJNX01PREUoIjI4ODB4MjQwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCAyODgwLCAyOTU2LAogCQkgICAzMjA0LCAzNDMyLCAwLCAyNDAsIDI0NCwgMjQ3LCAyNjIsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF80XzMsIH0sCiAJLyogMTMgLSAyODgweDI0MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHgyNDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDI4ODAsIDI5NTYsCiAJCSAgIDMyMDQsIDM0MzIsIDAsIDI0MCwgMjQ0LCAyNDcsIDI2MiwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMTQgLSAxNDQweDQ4MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDE0NDAsIDE0NzIsCiAJCSAgIDE1OTYsIDE3MTYsIDAsIDQ4MCwgNDg5LCA0OTUsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAxNSAtIDE0NDB4NDgwQDYwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA1NDAwMCwgMTQ0MCwgMTQ3MiwKIAkJICAgMTU5NiwgMTcxNiwgMCwgNDgwLCA0ODksIDQ5NSwgNTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDYwLCB9LAorCSAgLnZyZWZyZXNoID0gNjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAxNiAtIDE5MjB4MTA4MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMTkyMHgxMDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE0ODUwMCwgMTkyMCwgMjAwOCwKIAkJICAgMjA1MiwgMjIwMCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSA2MCwgfSwKKwkgIC52cmVmcmVzaCA9IDYwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMTcgLSA3MjB4NTc2QDUwSHogKi8KIAl7IERSTV9NT0RFKCI3MjB4NTc2IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI3MDAwLCA3MjAsIDczMiwKIAkJICAgNzk2LCA4NjQsIDAsIDU3NiwgNTgxLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA1MCwgfSwKKwkgIC52cmVmcmVzaCA9IDUwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAxOCAtIDcyMHg1NzZANTBIeiAqLwogCXsgRFJNX01PREUoIjcyMHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDcyMCwgNzMyLAogCQkgICA3OTYsIDg2NCwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAxOSAtIDEyODB4NzIwQDUwSHogKi8KIAl7IERSTV9NT0RFKCIxMjgweDcyMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwgMTI4MCwgMTcyMCwKIAkJICAgMTc2MCwgMTk4MCwgMCwgNzIwLCA3MjUsIDczMCwgNzUwLCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAyMCAtIDE5MjB4MTA4MGlANTBIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzQyNTAsIDE5MjAsIDI0NDgsCiAJCSAgIDI0OTIsIDI2NDAsIDAsIDEwODAsIDEwODQsIDEwOTQsIDExMjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpLAotCSAgLnZyZWZyZXNoID0gNTAsIH0sCisJICAudnJlZnJlc2ggPSA1MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDIxIC0gMTQ0MHg1NzZpQDUwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDU3NmkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTAsIDE3MjgsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSB8IERSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDIyIC0gMTQ0MHg1NzZpQDUwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDU3NmkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTAsIDE3MjgsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSB8IERSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAyMyAtIDE0NDB4Mjg4QDUwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDI4OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNzAwMCwgMTQ0MCwgMTQ2NCwKIAkJICAgMTU5MCwgMTcyOCwgMCwgMjg4LCAyOTAsIDI5MywgMzEyLCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDI0IC0gMTQ0MHgyODhANTBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4Mjg4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI3MDAwLCAxNDQwLCAxNDY0LAogCQkgICAxNTkwLCAxNzI4LCAwLCAyODgsIDI5MCwgMjkzLCAzMTIsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gNTAsIH0sCisJICAudnJlZnJlc2ggPSA1MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDI1IC0gMjg4MHg1NzZpQDUwSHogKi8KIAl7IERSTV9NT0RFKCIyODgweDU3NmkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDI4ODAsIDI5MjgsCiAJCSAgIDMxODAsIDM0NTYsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSksCi0JICAudnJlZnJlc2ggPSA1MCwgfSwKKwkgIC52cmVmcmVzaCA9IDUwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAyNiAtIDI4ODB4NTc2aUA1MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHg1NzZpIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCAyODgwLCAyOTI4LAogCQkgICAzMTgwLCAzNDU2LCAwLCA1NzYsIDU4MCwgNTg2LCA2MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpLAotCSAgLnZyZWZyZXNoID0gNTAsIH0sCisJICAudnJlZnJlc2ggPSA1MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDI3IC0gMjg4MHgyODhANTBIeiAqLwogCXsgRFJNX01PREUoIjI4ODB4Mjg4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCAyODgwLCAyOTI4LAogCQkgICAzMTgwLCAzNDU2LCAwLCAyODgsIDI5MCwgMjkzLCAzMTIsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNTAsIH0sCisJICAudnJlZnJlc2ggPSA1MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF80XzMsIH0sCiAJLyogMjggLSAyODgweDI4OEA1MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHgyODgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDI4ODAsIDI5MjgsCiAJCSAgIDMxODAsIDM0NTYsIDAsIDI4OCwgMjkwLCAyOTMsIDMxMiwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA1MCwgfSwKKwkgIC52cmVmcmVzaCA9IDUwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMjkgLSAxNDQweDU3NkA1MEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTIsIDE3MjgsIDAsIDU3NiwgNTgxLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSA1MCwgfSwKKwkgIC52cmVmcmVzaCA9IDUwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiAzMCAtIDE0NDB4NTc2QDUwSHogKi8KIAl7IERSTV9NT0RFKCIxNDQweDU3NiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA1NDAwMCwgMTQ0MCwgMTQ2NCwKIAkJICAgMTU5MiwgMTcyOCwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAzMSAtIDE5MjB4MTA4MEA1MEh6ICovCiAJeyBEUk1fTU9ERSgiMTkyMHgxMDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE0ODUwMCwgMTkyMCwgMjQ0OCwKIAkJICAgMjQ5MiwgMjY0MCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSA1MCwgfSwKKwkgIC52cmVmcmVzaCA9IDUwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMzIgLSAxOTIweDEwODBAMjRIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwgMTkyMCwgMjU1OCwKIAkJICAgMjYwMiwgMjc1MCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSAyNCwgfSwKKwkgIC52cmVmcmVzaCA9IDI0LCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMzMgLSAxOTIweDEwODBAMjVIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwgMTkyMCwgMjQ0OCwKIAkJICAgMjQ5MiwgMjY0MCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSAyNSwgfSwKKwkgIC52cmVmcmVzaCA9IDI1LCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMzQgLSAxOTIweDEwODBAMzBIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwgMTkyMCwgMjAwOCwKIAkJICAgMjA1MiwgMjIwMCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSAzMCwgfSwKKwkgIC52cmVmcmVzaCA9IDMwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogMzUgLSAyODgweDQ4MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAyODgwLCAyOTQ0LAogCQkgICAzMTkyLCAzNDMyLCAwLCA0ODAsIDQ4OSwgNDk1LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF80XzMsIH0sCiAJLyogMzYgLSAyODgweDQ4MEA2MEh6ICovCiAJeyBEUk1fTU9ERSgiMjg4MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAyODgwLCAyOTQ0LAogCQkgICAzMTkyLCAzNDMyLCAwLCA0ODAsIDQ4OSwgNDk1LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gNjAsIH0sCisJICAudnJlZnJlc2ggPSA2MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDM3IC0gMjg4MHg1NzZANTBIeiAqLwogCXsgRFJNX01PREUoIjI4ODB4NTc2IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMjg4MCwgMjkyOCwKIAkJICAgMzE4NCwgMzQ1NiwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDM4IC0gMjg4MHg1NzZANTBIeiAqLwogCXsgRFJNX01PREUoIjI4ODB4NTc2IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMjg4MCwgMjkyOCwKIAkJICAgMzE4NCwgMzQ1NiwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDUwLCB9LAorCSAgLnZyZWZyZXNoID0gNTAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiAzOSAtIDE5MjB4MTA4MGlANTBIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzIwMDAsIDE5MjAsIDE5NTIsCiAJCSAgIDIxMjAsIDIzMDQsIDAsIDEwODAsIDExMjYsIDExMzYsIDEyNTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpLAotCSAgLnZyZWZyZXNoID0gNTAsIH0sCisJICAudnJlZnJlc2ggPSA1MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDQwIC0gMTkyMHgxMDgwaUAxMDBIeiAqLwogCXsgRFJNX01PREUoIjE5MjB4MTA4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTQ4NTAwLCAxOTIwLCAyNDQ4LAogCQkgICAyNDkyLCAyNjQwLCAwLCAxMDgwLCAxMDg0LCAxMDk0LCAxMTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSwKLQkgIC52cmVmcmVzaCA9IDEwMCwgfSwKKwkgIC52cmVmcmVzaCA9IDEwMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDQxIC0gMTI4MHg3MjBAMTAwSHogKi8KIAl7IERSTV9NT0RFKCIxMjgweDcyMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxNDg1MDAsIDEyODAsIDE3MjAsCiAJCSAgIDE3NjAsIDE5ODAsIDAsIDcyMCwgNzI1LCA3MzAsIDc1MCwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JICAudnJlZnJlc2ggPSAxMDAsIH0sCisJICAudnJlZnJlc2ggPSAxMDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA0MiAtIDcyMHg1NzZAMTAwSHogKi8KIAl7IERSTV9NT0RFKCI3MjB4NTc2IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCA3MjAsIDczMiwKIAkJICAgNzk2LCA4NjQsIDAsIDU3NiwgNTgxLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSAxMDAsIH0sCisJICAudnJlZnJlc2ggPSAxMDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDQzIC0gNzIweDU3NkAxMDBIeiAqLwogCXsgRFJNX01PREUoIjcyMHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDcyMCwgNzMyLAogCQkgICA3OTYsIDg2NCwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDEwMCwgfSwKKwkgIC52cmVmcmVzaCA9IDEwMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDQ0IC0gMTQ0MHg1NzZpQDEwMEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTAsIDE3MjgsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0RCTENMSyksCi0JICAudnJlZnJlc2ggPSAxMDAsIH0sCisJICAudnJlZnJlc2ggPSAxMDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDQ1IC0gMTQ0MHg1NzZpQDEwMEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTQwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTAsIDE3MjgsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0RCTENMSyksCi0JICAudnJlZnJlc2ggPSAxMDAsIH0sCisJICAudnJlZnJlc2ggPSAxMDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA0NiAtIDE5MjB4MTA4MGlAMTIwSHogKi8KIAl7IERSTV9NT0RFKCIxOTIweDEwODBpIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE0ODUwMCwgMTkyMCwgMjAwOCwKIAkJICAgMjA1MiwgMjIwMCwgMCwgMTA4MCwgMTA4NCwgMTA5NCwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSksCi0JICAudnJlZnJlc2ggPSAxMjAsIH0sCisJICAudnJlZnJlc2ggPSAxMjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA0NyAtIDEyODB4NzIwQDEyMEh6ICovCiAJeyBEUk1fTU9ERSgiMTI4MHg3MjAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTQ4NTAwLCAxMjgwLCAxMzkwLAogCQkgICAxNDMwLCAxNjUwLCAwLCA3MjAsIDcyNSwgNzMwLCA3NTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gMTIwLCB9LAorCSAgLnZyZWZyZXNoID0gMTIwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogNDggLSA3MjB4NDgwQDEyMEh6ICovCiAJeyBEUk1fTU9ERSgiNzIweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA1NDAwMCwgNzIwLCA3MzYsCiAJCSAgIDc5OCwgODU4LCAwLCA0ODAsIDQ4OSwgNDk1LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gMTIwLCB9LAorCSAgLnZyZWZyZXNoID0gMTIwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiA0OSAtIDcyMHg0ODBAMTIwSHogKi8KIAl7IERSTV9NT0RFKCI3MjB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU0MDAwLCA3MjAsIDczNiwKIAkJICAgNzk4LCA4NTgsIDAsIDQ4MCwgNDg5LCA0OTUsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSAxMjAsIH0sCisJICAudnJlZnJlc2ggPSAxMjAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA1MCAtIDE0NDB4NDgwaUAxMjBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4NDgwaSIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA1NDAwMCwgMTQ0MCwgMTQ3OCwKIAkJICAgMTYwMiwgMTcxNiwgMCwgNDgwLCA0ODgsIDQ5NCwgNTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gMTIwLCB9LAorCSAgLnZyZWZyZXNoID0gMTIwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiA1MSAtIDE0NDB4NDgwaUAxMjBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4NDgwaSIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA1NDAwMCwgMTQ0MCwgMTQ3OCwKIAkJICAgMTYwMiwgMTcxNiwgMCwgNDgwLCA0ODgsIDQ5NCwgNTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gMTIwLCB9LAorCSAgLnZyZWZyZXNoID0gMTIwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogNTIgLSA3MjB4NTc2QDIwMEh6ICovCiAJeyBEUk1fTU9ERSgiNzIweDU3NiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDcyMCwgNzMyLAogCQkgICA3OTYsIDg2NCwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDIwMCwgfSwKKwkgIC52cmVmcmVzaCA9IDIwMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF80XzMsIH0sCiAJLyogNTMgLSA3MjB4NTc2QDIwMEh6ICovCiAJeyBEUk1fTU9ERSgiNzIweDU3NiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDcyMCwgNzMyLAogCQkgICA3OTYsIDg2NCwgMCwgNTc2LCA1ODEsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKLQkgIC52cmVmcmVzaCA9IDIwMCwgfSwKKwkgIC52cmVmcmVzaCA9IDIwMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDU0IC0gMTQ0MHg1NzZpQDIwMEh6ICovCiAJeyBEUk1fTU9ERSgiMTQ0MHg1NzZpIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMTQ0MCwgMTQ2NCwKIAkJICAgMTU5MCwgMTcyOCwgMCwgNTc2LCA1ODAsIDU4NiwgNjI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwKIAkJCURSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxDTEspLAotCSAgLnZyZWZyZXNoID0gMjAwLCB9LAorCSAgLnZyZWZyZXNoID0gMjAwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzRfMywgfSwKIAkvKiA1NSAtIDE0NDB4NTc2aUAyMDBIeiAqLwogCXsgRFJNX01PREUoIjE0NDB4NTc2aSIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDE0NDAsIDE0NjQsCiAJCSAgIDE1OTAsIDE3MjgsIDAsIDU3NiwgNTgwLCA1ODYsIDYyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSB8IERSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDIwMCwgfSwKKwkgIC52cmVmcmVzaCA9IDIwMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDU2IC0gNzIweDQ4MEAyNDBIeiAqLwogCXsgRFJNX01PREUoIjcyMHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCA3MjAsIDczNiwKIAkJICAgNzk4LCA4NTgsIDAsIDQ4MCwgNDg5LCA0OTUsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSAyNDAsIH0sCisJICAudnJlZnJlc2ggPSAyNDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDU3IC0gNzIweDQ4MEAyNDBIeiAqLwogCXsgRFJNX01PREUoIjcyMHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCA3MjAsIDczNiwKIAkJICAgNzk4LCA4NTgsIDAsIDQ4MCwgNDg5LCA0OTUsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyksCi0JICAudnJlZnJlc2ggPSAyNDAsIH0sCisJICAudnJlZnJlc2ggPSAyNDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIAkvKiA1OCAtIDE0NDB4NDgwaUAyNDAgKi8KIAl7IERSTV9NT0RFKCIxNDQweDQ4MGkiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxNDQwLCAxNDc4LAogCQkgICAxNjAyLCAxNzE2LCAwLCA0ODAsIDQ4OCwgNDk0LCA1MjUsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMgfAogCQkJRFJNX01PREVfRkxBR19JTlRFUkxBQ0UgfCBEUk1fTU9ERV9GTEFHX0RCTENMSyksCi0JICAudnJlZnJlc2ggPSAyNDAsIH0sCisJICAudnJlZnJlc2ggPSAyNDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfNF8zLCB9LAogCS8qIDU5IC0gMTQ0MHg0ODBpQDI0MCAqLwogCXsgRFJNX01PREUoIjE0NDB4NDgwaSIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDE0NDAsIDE0NzgsCiAJCSAgIDE2MDIsIDE3MTYsIDAsIDQ4MCwgNDg4LCA0OTQsIDUyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQyB8CiAJCQlEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSB8IERSTV9NT0RFX0ZMQUdfREJMQ0xLKSwKLQkgIC52cmVmcmVzaCA9IDI0MCwgfSwKKwkgIC52cmVmcmVzaCA9IDI0MCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDYwIC0gMTI4MHg3MjBAMjRIeiAqLwogCXsgRFJNX01PREUoIjEyODB4NzIwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU5NDAwLCAxMjgwLCAzMDQwLAogCQkgICAzMDgwLCAzMzAwLCAwLCA3MjAsIDcyNSwgNzMwLCA3NTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gMjQsIH0sCisJICAudnJlZnJlc2ggPSAyNCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDYxIC0gMTI4MHg3MjBAMjVIeiAqLwogCXsgRFJNX01PREUoIjEyODB4NzIwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc0MjUwLCAxMjgwLCAzNzAwLAogCQkgICAzNzQwLCAzOTYwLCAwLCA3MjAsIDcyNSwgNzMwLCA3NTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gMjUsIH0sCisJICAudnJlZnJlc2ggPSAyNSwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDYyIC0gMTI4MHg3MjBAMzBIeiAqLwogCXsgRFJNX01PREUoIjEyODB4NzIwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc0MjUwLCAxMjgwLCAzMDQwLAogCQkgICAzMDgwLCAzMzAwLCAwLCA3MjAsIDcyNSwgNzMwLCA3NTAsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpLAotCSAgLnZyZWZyZXNoID0gMzAsIH0sCisJICAudnJlZnJlc2ggPSAzMCwgLnBpY3R1cmVfYXNwZWN0X3JhdGlvID0gSERNSV9QSUNUVVJFX0FTUEVDVF8xNl85LCB9LAogCS8qIDYzIC0gMTkyMHgxMDgwQDEyMEh6ICovCiAJeyBEUk1fTU9ERSgiMTkyMHgxMDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI5NzAwMCwgMTkyMCwgMjAwOCwKIAkJICAgMjA1MiwgMjIwMCwgMCwgMTA4MCwgMTA4NCwgMTA4OSwgMTEyNSwgMCwKIAkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQyksCi0JIC52cmVmcmVzaCA9IDEyMCwgfSwKKwkgLnZyZWZyZXNoID0gMTIwLCAucGljdHVyZV9hc3BlY3RfcmF0aW8gPSBIRE1JX1BJQ1RVUkVfQVNQRUNUXzE2XzksIH0sCiAJLyogNjQgLSAxOTIweDEwODBAMTAwSHogKi8KIAl7IERSTV9NT0RFKCIxOTIweDEwODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjk3MDAwLCAxOTIwLCAyNDQ4LAogCQkgICAyNDkyLCAyNjQwLCAwLCAxMDgwLCAxMDg0LCAxMDk0LCAxMTI1LCAwLAogCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSwKLQkgLnZyZWZyZXNoID0gMTAwLCB9LAorCSAudnJlZnJlc2ggPSAxMDAsIC5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IEhETUlfUElDVFVSRV9BU1BFQ1RfMTZfOSwgfSwKIH07CiAKIC8qCkBAIC0yNTYyLDI1ICsyNTYyLDQwIEBACiAJcmV0dXJuIG1vZGVzOwogfQogCitzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKgorZHJtX2Rpc3BsYXlfbW9kZV9mcm9tX3ZpY19pbmRleChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCWNvbnN0IHU4ICp2aWRlb19kYiwgdTggdmlkZW9fbGVuLAorCQkJCXU4IHZpZGVvX2luZGV4KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKKwl1OCBjZWFfbW9kZTsKKworCWlmICh2aWRlb19kYiA9PSBOVUxMIHx8IHZpZGVvX2luZGV4ID49IHZpZGVvX2xlbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDRUEgbW9kZXMgYXJlIG51bWJlcmVkIDEuLjEyNyAqLworCWNlYV9tb2RlID0gKHZpZGVvX2RiW3ZpZGVvX2luZGV4XSAmIDEyNykgLSAxOworCWlmIChjZWFfbW9kZSA+PSBBUlJBWV9TSVpFKGVkaWRfY2VhX21vZGVzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdtb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgJmVkaWRfY2VhX21vZGVzW2NlYV9tb2RlXSk7CisJbmV3bW9kZS0+dnJlZnJlc2ggPSAwOworCisJcmV0dXJuIG5ld21vZGU7Cit9CisKIHN0YXRpYyBpbnQKIGRvX2NlYV9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBjb25zdCB1OCAqZGIsIHU4IGxlbikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7Ci0JY29uc3QgdTggKm1vZGU7Ci0JdTggY2VhX21vZGU7Ci0JaW50IG1vZGVzID0gMDsKKwlpbnQgaSwgbW9kZXMgPSAwOwogCi0JZm9yIChtb2RlID0gZGI7IG1vZGUgPCBkYiArIGxlbjsgbW9kZSsrKSB7Ci0JCWNlYV9tb2RlID0gKCptb2RlICYgMTI3KSAtIDE7IC8qIENFQSBtb2RlcyBhcmUgbnVtYmVyZWQgMS4uMTI3ICovCi0JCWlmIChjZWFfbW9kZSA8IEFSUkFZX1NJWkUoZWRpZF9jZWFfbW9kZXMpKSB7Ci0JCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKLQkJCW5ld21vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LAotCQkJCQkJICAgICAmZWRpZF9jZWFfbW9kZXNbY2VhX21vZGVdKTsKLQkJCWlmIChuZXdtb2RlKSB7Ci0JCQkJbmV3bW9kZS0+dnJlZnJlc2ggPSAwOwotCQkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKLQkJCQltb2RlcysrOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwkJbW9kZSA9IGRybV9kaXNwbGF5X21vZGVfZnJvbV92aWNfaW5kZXgoY29ubmVjdG9yLCBkYiwgbGVuLCBpKTsKKwkJaWYgKG1vZGUpIHsKKwkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJCW1vZGVzKys7CiAJCX0KIAl9CiAKQEAgLTI2NzQsMjEgKzI2ODksMTMgQEAKIHN0YXRpYyBpbnQgYWRkXzNkX3N0cnVjdF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1MTYgc3RydWN0dXJlLAogCQkJICAgICAgIGNvbnN0IHU4ICp2aWRlb19kYiwgdTggdmlkZW9fbGVuLCB1OCB2aWRlb19pbmRleCkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CiAJaW50IG1vZGVzID0gMDsKLQl1OCBjZWFfbW9kZTsKLQotCWlmICh2aWRlb19kYiA9PSBOVUxMIHx8IHZpZGVvX2luZGV4ID49IHZpZGVvX2xlbikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDRUEgbW9kZXMgYXJlIG51bWJlcmVkIDEuLjEyNyAqLwotCWNlYV9tb2RlID0gKHZpZGVvX2RiW3ZpZGVvX2luZGV4XSAmIDEyNykgLSAxOwotCWlmIChjZWFfbW9kZSA+PSBBUlJBWV9TSVpFKGVkaWRfY2VhX21vZGVzKSkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoc3RydWN0dXJlICYgKDEgPDwgMCkpIHsKLQkJbmV3bW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZlZGlkX2NlYV9tb2Rlc1tjZWFfbW9kZV0pOworCQluZXdtb2RlID0gZHJtX2Rpc3BsYXlfbW9kZV9mcm9tX3ZpY19pbmRleChjb25uZWN0b3IsIHZpZGVvX2RiLAorCQkJCQkJCSAgdmlkZW9fbGVuLAorCQkJCQkJCSAgdmlkZW9faW5kZXgpOwogCQlpZiAobmV3bW9kZSkgewogCQkJbmV3bW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR18zRF9GUkFNRV9QQUNLSU5HOwogCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOwpAQCAtMjY5Niw3ICsyNzAzLDkgQEAKIAkJfQogCX0KIAlpZiAoc3RydWN0dXJlICYgKDEgPDwgNikpIHsKLQkJbmV3bW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZlZGlkX2NlYV9tb2Rlc1tjZWFfbW9kZV0pOworCQluZXdtb2RlID0gZHJtX2Rpc3BsYXlfbW9kZV9mcm9tX3ZpY19pbmRleChjb25uZWN0b3IsIHZpZGVvX2RiLAorCQkJCQkJCSAgdmlkZW9fbGVuLAorCQkJCQkJCSAgdmlkZW9faW5kZXgpOwogCQlpZiAobmV3bW9kZSkgewogCQkJbmV3bW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR18zRF9UT1BfQU5EX0JPVFRPTTsKIAkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKQEAgLTI3MDQsNyArMjcxMyw5IEBACiAJCX0KIAl9CiAJaWYgKHN0cnVjdHVyZSAmICgxIDw8IDgpKSB7Ci0JCW5ld21vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmZWRpZF9jZWFfbW9kZXNbY2VhX21vZGVdKTsKKwkJbmV3bW9kZSA9IGRybV9kaXNwbGF5X21vZGVfZnJvbV92aWNfaW5kZXgoY29ubmVjdG9yLCB2aWRlb19kYiwKKwkJCQkJCQkgIHZpZGVvX2xlbiwKKwkJCQkJCQkgIHZpZGVvX2luZGV4KTsKIAkJaWYgKG5ld21vZGUpIHsKIAkJCW5ld21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfM0RfU0lERV9CWV9TSURFX0hBTEY7CiAJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7CkBAIC0yNzI4LDcgKzI3MzksNyBAQAogZG9faGRtaV92c2RiX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGNvbnN0IHU4ICpkYiwgdTggbGVuLAogCQkgICBjb25zdCB1OCAqdmlkZW9fZGIsIHU4IHZpZGVvX2xlbikKIHsKLQlpbnQgbW9kZXMgPSAwLCBvZmZzZXQgPSAwLCBpLCBtdWx0aV9wcmVzZW50ID0gMDsKKwlpbnQgbW9kZXMgPSAwLCBvZmZzZXQgPSAwLCBpLCBtdWx0aV9wcmVzZW50ID0gMCwgbXVsdGlfbGVuOwogCXU4IHZpY19sZW4sIGhkbWlfM2RfbGVuID0gMDsKIAl1MTYgbWFzazsKIAl1MTYgc3RydWN0dXJlX2FsbDsKQEAgLTI3NzQsMzIgKzI3ODUsODQgQEAKIAl9CiAJb2Zmc2V0ICs9IDEgKyB2aWNfbGVuOwogCi0JaWYgKCEobXVsdGlfcHJlc2VudCA9PSAxIHx8IG11bHRpX3ByZXNlbnQgPT0gMikpCi0JCWdvdG8gb3V0OwotCi0JaWYgKChtdWx0aV9wcmVzZW50ID09IDEgJiYgbGVuIDwgKDkgKyBvZmZzZXQpKSB8fAotCSAgICAobXVsdGlfcHJlc2VudCA9PSAyICYmIGxlbiA8ICgxMSArIG9mZnNldCkpKQotCQlnb3RvIG91dDsKLQotCWlmICgobXVsdGlfcHJlc2VudCA9PSAxICYmIGhkbWlfM2RfbGVuIDwgMikgfHwKLQkgICAgKG11bHRpX3ByZXNlbnQgPT0gMiAmJiBoZG1pXzNkX2xlbiA8IDQpKQotCQlnb3RvIG91dDsKLQotCS8qIDNEX1N0cnVjdHVyZV9BTEwgKi8KLQlzdHJ1Y3R1cmVfYWxsID0gKGRiWzggKyBvZmZzZXRdIDw8IDgpIHwgZGJbOSArIG9mZnNldF07Ci0KLQkvKiBjaGVjayBpZiAzRF9NQVNLIGlzIHByZXNlbnQgKi8KLQlpZiAobXVsdGlfcHJlc2VudCA9PSAyKQotCQltYXNrID0gKGRiWzEwICsgb2Zmc2V0XSA8PCA4KSB8IGRiWzExICsgb2Zmc2V0XTsKKwlpZiAobXVsdGlfcHJlc2VudCA9PSAxKQorCQltdWx0aV9sZW4gPSAyOworCWVsc2UgaWYgKG11bHRpX3ByZXNlbnQgPT0gMikKKwkJbXVsdGlfbGVuID0gNDsKIAllbHNlCi0JCW1hc2sgPSAweGZmZmY7CisJCW11bHRpX2xlbiA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlpZiAobWFzayAmICgxIDw8IGkpKQotCQkJbW9kZXMgKz0gYWRkXzNkX3N0cnVjdF9tb2Rlcyhjb25uZWN0b3IsCi0JCQkJCQkgICAgIHN0cnVjdHVyZV9hbGwsCi0JCQkJCQkgICAgIHZpZGVvX2RiLAotCQkJCQkJICAgICB2aWRlb19sZW4sIGkpOworCWlmIChsZW4gPCAoOCArIG9mZnNldCArIGhkbWlfM2RfbGVuIC0gMSkpCisJCWdvdG8gb3V0OworCisJaWYgKGhkbWlfM2RfbGVuIDwgbXVsdGlfbGVuKQorCQlnb3RvIG91dDsKKworCWlmIChtdWx0aV9wcmVzZW50ID09IDEgfHwgbXVsdGlfcHJlc2VudCA9PSAyKSB7CisJCS8qIDNEX1N0cnVjdHVyZV9BTEwgKi8KKwkJc3RydWN0dXJlX2FsbCA9IChkYls4ICsgb2Zmc2V0XSA8PCA4KSB8IGRiWzkgKyBvZmZzZXRdOworCisJCS8qIGNoZWNrIGlmIDNEX01BU0sgaXMgcHJlc2VudCAqLworCQlpZiAobXVsdGlfcHJlc2VudCA9PSAyKQorCQkJbWFzayA9IChkYlsxMCArIG9mZnNldF0gPDwgOCkgfCBkYlsxMSArIG9mZnNldF07CisJCWVsc2UKKwkJCW1hc2sgPSAweGZmZmY7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQkJbW9kZXMgKz0gYWRkXzNkX3N0cnVjdF9tb2Rlcyhjb25uZWN0b3IsCisJCQkJCQlzdHJ1Y3R1cmVfYWxsLAorCQkJCQkJdmlkZW9fZGIsCisJCQkJCQl2aWRlb19sZW4sIGkpOworCQl9CisJfQorCisJb2Zmc2V0ICs9IG11bHRpX2xlbjsKKworCWZvciAoaSA9IDA7IGkgPCAoaGRtaV8zZF9sZW4gLSBtdWx0aV9sZW4pOyBpKyspIHsKKwkJaW50IHZpY19pbmRleDsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGUgPSBOVUxMOworCQl1bnNpZ25lZCBpbnQgbmV3ZmxhZyA9IDA7CisJCWJvb2wgZGV0YWlsX3ByZXNlbnQ7CisKKwkJZGV0YWlsX3ByZXNlbnQgPSAoKGRiWzggKyBvZmZzZXQgKyBpXSAmIDB4MGYpID4gNyk7CisKKwkJaWYgKGRldGFpbF9wcmVzZW50ICYmIChpICsgMSA9PSBoZG1pXzNkX2xlbiAtIG11bHRpX2xlbikpCisJCQlicmVhazsKKworCQkvKiAyRF9WSUNfb3JkZXJfWCAqLworCQl2aWNfaW5kZXggPSBkYls4ICsgb2Zmc2V0ICsgaV0gPj4gNDsKKworCQkvKiAzRF9TdHJ1Y3R1cmVfWCAqLworCQlzd2l0Y2ggKGRiWzggKyBvZmZzZXQgKyBpXSAmIDB4MGYpIHsKKwkJY2FzZSAwOgorCQkJbmV3ZmxhZyA9IERSTV9NT0RFX0ZMQUdfM0RfRlJBTUVfUEFDS0lORzsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQluZXdmbGFnID0gRFJNX01PREVfRkxBR18zRF9UT1BfQU5EX0JPVFRPTTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQkvKiAzRF9EZXRhaWxfWCAqLworCQkJaWYgKChkYls5ICsgb2Zmc2V0ICsgaV0gPj4gNCkgPT0gMSkKKwkJCQluZXdmbGFnID0gRFJNX01PREVfRkxBR18zRF9TSURFX0JZX1NJREVfSEFMRjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ld2ZsYWcgIT0gMCkgeworCQkJbmV3bW9kZSA9IGRybV9kaXNwbGF5X21vZGVfZnJvbV92aWNfaW5kZXgoY29ubmVjdG9yLAorCQkJCQkJCQkgIHZpZGVvX2RiLAorCQkJCQkJCQkgIHZpZGVvX2xlbiwKKwkJCQkJCQkJICB2aWNfaW5kZXgpOworCisJCQlpZiAobmV3bW9kZSkgeworCQkJCW5ld21vZGUtPmZsYWdzIHw9IG5ld2ZsYWc7CisJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOworCQkJCW1vZGVzKys7CisJCQl9CisJCX0KKworCQlpZiAoZGV0YWlsX3ByZXNlbnQpCisJCQlpKys7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkX2xvYWQuYwppbmRleCA5MDgxMTcyLi4xYjRjN2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZF9sb2FkLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCXJldHVybiAoZWRpZFsweDdlXSArIDEpICogRURJRF9MRU5HVEg7CiB9CiAKLXN0YXRpYyB1OCAqZWRpZF9sb2FkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGNvbnN0IGNoYXIgKm5hbWUsCitzdGF0aWMgdm9pZCAqZWRpZF9sb2FkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQljb25zdCBjaGFyICpjb25uZWN0b3JfbmFtZSkKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWlmICgqbGFzdCA9PSAnXG4nKQogCQkqbGFzdCA9ICdcMCc7CiAKLQllZGlkID0gKHN0cnVjdCBlZGlkICopIGVkaWRfbG9hZChjb25uZWN0b3IsIGVkaWRuYW1lLCBjb25uZWN0b3JfbmFtZSk7CisJZWRpZCA9IGVkaWRfbG9hZChjb25uZWN0b3IsIGVkaWRuYW1lLCBjb25uZWN0b3JfbmFtZSk7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGVkaWQpKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggMGExOTQwMS4uOThhMDM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC0zNTksNiArMzU5LDExIEBACiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCWludCBib3VuZCA9IDAsIGNydGNzX2JvdW5kID0gMDsKIAorCS8qIFNvbWV0aW1lcyB1c2VyIHNwYWNlIHdhbnRzIGV2ZXJ5dGhpbmcgZGlzYWJsZWQsIHNvIGRvbid0IHN0ZWFsIHRoZQorCSAqIGRpc3BsYXkgaWYgdGhlcmUncyBhIG1hc3Rlci4gKi8KKwlpZiAoZGV2LT5wcmltYXJ5LT5tYXN0ZXIpCisJCXJldHVybiBmYWxzZTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCWlmIChjcnRjLT5mYikKIAkJCWNydGNzX2JvdW5kKys7CkBAIC0zNjgsNiArMzczLDcgQEAKIAogCWlmIChib3VuZCA8IGNydGNzX2JvdW5kKQogCQlyZXR1cm4gZmFsc2U7CisKIAlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCBjNWI5MjljLi43ZjJhZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMjMyLDcgKzIzMiw2IEBACiAJCWdvdG8gb3V0X3B1dF9waWQ7CiAJfQogCi0JcHJpdi0+aW9jdGxfY291bnQgPSAwOwogCS8qIGZvciBjb21wYXRpYmlsaXR5IHJvb3QgaXMgYWx3YXlzIGF1dGhlbnRpY2F0ZWQgKi8KIAlwcml2LT5hbHdheXNfYXV0aGVudGljYXRlZCA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CiAJcHJpdi0+YXV0aGVudGljYXRlZCA9IHByaXYtPmFsd2F5c19hdXRoZW50aWNhdGVkOwpAQCAtMzkyLDkgKzM5MSw2IEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybjsKIAotCWF0b21pY19zZXQoJmRldi0+aW9jdGxfY291bnQsIDApOwotCWF0b21pY19zZXQoJmRldi0+dm1hX2NvdW50LCAwKTsKLQogCWRldi0+c2lnZGF0YS5sb2NrID0gTlVMTDsKIAogCWRldi0+Y29udGV4dF9mbGFnID0gMDsKQEAgLTU3OCwxMiArNTc0LDcgQEAKIAkgKi8KIAogCWlmICghLS1kZXYtPm9wZW5fY291bnQpIHsKLQkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmlvY3RsX2NvdW50KSkgewotCQkJRFJNX0VSUk9SKCJEZXZpY2UgYnVzeTogJWRcbiIsCi0JCQkJICBhdG9taWNfcmVhZCgmZGV2LT5pb2N0bF9jb3VudCkpOwotCQkJcmV0Y29kZSA9IC1FQlVTWTsKLQkJfSBlbHNlCi0JCQlyZXRjb2RlID0gZHJtX2xhc3RjbG9zZShkZXYpOworCQlyZXRjb2RlID0gZHJtX2xhc3RjbG9zZShkZXYpOwogCQlpZiAoZHJtX2RldmljZV9pc191bnBsdWdnZWQoZGV2KSkKIAkJCWRybV9wdXRfZGV2KGRldik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKaW5kZXggNDc2MWFkZS4uNWJiYWQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCkBAIC05MSwxOSArOTEsMTkgQEAKIGludAogZHJtX2dlbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9nZW1fbW0gKm1tOworCXN0cnVjdCBkcm1fdm1hX29mZnNldF9tYW5hZ2VyICp2bWFfb2Zmc2V0X21hbmFnZXI7CiAKIAltdXRleF9pbml0KCZkZXYtPm9iamVjdF9uYW1lX2xvY2spOwogCWlkcl9pbml0KCZkZXYtPm9iamVjdF9uYW1lX2lkcik7CiAKLQltbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fZ2VtX21tKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtbSkgeworCXZtYV9vZmZzZXRfbWFuYWdlciA9IGt6YWxsb2Moc2l6ZW9mKCp2bWFfb2Zmc2V0X21hbmFnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZtYV9vZmZzZXRfbWFuYWdlcikgewogCQlEUk1fRVJST1IoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXYtPm1tX3ByaXZhdGUgPSBtbTsKLQlkcm1fdm1hX29mZnNldF9tYW5hZ2VyX2luaXQoJm1tLT52bWFfbWFuYWdlciwKKwlkZXYtPnZtYV9vZmZzZXRfbWFuYWdlciA9IHZtYV9vZmZzZXRfbWFuYWdlcjsKKwlkcm1fdm1hX29mZnNldF9tYW5hZ2VyX2luaXQodm1hX29mZnNldF9tYW5hZ2VyLAogCQkJCSAgICBEUk1fRklMRV9QQUdFX09GRlNFVF9TVEFSVCwKIAkJCQkgICAgRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU0laRSk7CiAKQEAgLTExMywxMSArMTEzLDEwIEBACiB2b2lkCiBkcm1fZ2VtX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7CiAKLQlkcm1fdm1hX29mZnNldF9tYW5hZ2VyX2Rlc3Ryb3koJm1tLT52bWFfbWFuYWdlcik7Ci0Ja2ZyZWUobW0pOwotCWRldi0+bW1fcHJpdmF0ZSA9IE5VTEw7CisJZHJtX3ZtYV9vZmZzZXRfbWFuYWdlcl9kZXN0cm95KGRldi0+dm1hX29mZnNldF9tYW5hZ2VyKTsKKwlrZnJlZShkZXYtPnZtYV9vZmZzZXRfbWFuYWdlcik7CisJZGV2LT52bWFfb2Zmc2V0X21hbmFnZXIgPSBOVUxMOwogfQogCiAvKioKQEAgLTEyOSwxMSArMTI4LDEyIEBACiB7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAKKwlkcm1fZ2VtX3ByaXZhdGVfb2JqZWN0X2luaXQoZGV2LCBvYmosIHNpemUpOworCiAJZmlscCA9IHNobWVtX2ZpbGVfc2V0dXAoImRybSBtbSBvYmplY3QiLCBzaXplLCBWTV9OT1JFU0VSVkUpOwogCWlmIChJU19FUlIoZmlscCkpCiAJCXJldHVybiBQVFJfRVJSKGZpbHApOwogCi0JZHJtX2dlbV9wcml2YXRlX29iamVjdF9pbml0KGRldiwgb2JqLCBzaXplKTsKIAlvYmotPmZpbHAgPSBmaWxwOwogCiAJcmV0dXJuIDA7CkBAIC0xNzUsMTEgKzE3NSw2IEBACiAJbXV0ZXhfdW5sb2NrKCZmaWxwLT5wcmltZS5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgZHJtX2dlbV9vYmplY3RfcmVmX2J1ZyhzdHJ1Y3Qga3JlZiAqbGlzdF9rcmVmKQotewotCUJVRygpOwotfQotCiAvKioKICAqIENhbGxlZCBhZnRlciB0aGUgbGFzdCBoYW5kbGUgdG8gdGhlIG9iamVjdCBoYXMgYmVlbiBjbG9zZWQKICAqCkBAIC0xOTUsMTMgKzE5MCw2IEBACiAJaWYgKG9iai0+bmFtZSkgewogCQlpZHJfcmVtb3ZlKCZkZXYtPm9iamVjdF9uYW1lX2lkciwgb2JqLT5uYW1lKTsKIAkJb2JqLT5uYW1lID0gMDsKLQkJLyoKLQkJICogVGhlIG9iamVjdCBuYW1lIGhlbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QsIGRyb3AKLQkJICogdGhhdCBub3cuCi0JCSoKLQkJKiBUaGlzIGNhbm5vdCBiZSB0aGUgbGFzdCByZWZlcmVuY2UsIHNpbmNlIHRoZSBoYW5kbGUgaG9sZHMgb25lIHRvby4KLQkJICovCi0JCWtyZWZfcHV0KCZvYmotPnJlZmNvdW50LCBkcm1fZ2VtX29iamVjdF9yZWZfYnVnKTsKIAl9CiB9CiAKQEAgLTM3NCw5ICszNjIsOCBAQAogZHJtX2dlbV9mcmVlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7CiAKLQlkcm1fdm1hX29mZnNldF9yZW1vdmUoJm1tLT52bWFfbWFuYWdlciwgJm9iai0+dm1hX25vZGUpOworCWRybV92bWFfb2Zmc2V0X3JlbW92ZShkZXYtPnZtYV9vZmZzZXRfbWFuYWdlciwgJm9iai0+dm1hX25vZGUpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQpOwogCkBAIC0zOTgsOSArMzg1LDggQEAKIGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0X3NpemUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7CiAKLQlyZXR1cm4gZHJtX3ZtYV9vZmZzZXRfYWRkKCZtbS0+dm1hX21hbmFnZXIsICZvYmotPnZtYV9ub2RlLAorCXJldHVybiBkcm1fdm1hX29mZnNldF9hZGQoZGV2LT52bWFfb2Zmc2V0X21hbmFnZXIsICZvYmotPnZtYV9ub2RlLAogCQkJCSAgc2l6ZSAvIFBBR0VfU0laRSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0X3NpemUpOwpAQCAtNjAyLDkgKzU4OCw2IEBACiAJCQlnb3RvIGVycjsKIAogCQlvYmotPm5hbWUgPSByZXQ7Ci0KLQkJLyogQWxsb2NhdGUgYSByZWZlcmVuY2UgZm9yIHRoZSBuYW1lIHRhYmxlLiAgKi8KLQkJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CiAJfQogCiAJYXJncy0+bmFtZSA9ICh1aW50NjRfdCkgb2JqLT5uYW1lOwpAQCAtODMzLDcgKzgxNiw2IEBACiB7CiAJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5taW5vci0+ZGV2OwotCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX3ZtYV9vZmZzZXRfbm9kZSAqbm9kZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTg0Myw3ICs4MjUsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0Jbm9kZSA9IGRybV92bWFfb2Zmc2V0X2V4YWN0X2xvb2t1cCgmbW0tPnZtYV9tYW5hZ2VyLCB2bWEtPnZtX3Bnb2ZmLAorCW5vZGUgPSBkcm1fdm1hX29mZnNldF9leGFjdF9sb29rdXAoZGV2LT52bWFfb2Zmc2V0X21hbmFnZXIsCisJCQkJCSAgIHZtYS0+dm1fcGdvZmYsCiAJCQkJCSAgIHZtYV9wYWdlcyh2bWEpKTsKIAlpZiAoIW5vZGUpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2luZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW5mby5jCmluZGV4IDdkNWExNTIuLjc0NzMwMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW5mby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW5mby5jCkBAIC0xODYsMTQgKzE4NiwxNCBAQAogCXN0cnVjdCBkcm1fZmlsZSAqcHJpdjsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlzZXFfcHJpbnRmKG0sICJhIGRldglwaWQgICAgdWlkCW1hZ2ljCSAgaW9jdGxzXG5cbiIpOworCXNlcV9wcmludGYobSwgImEgZGV2CXBpZCAgICB1aWQJbWFnaWNcblxuIik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpIHsKLQkJc2VxX3ByaW50ZihtLCAiJWMgJTNkICU1ZCAlNWQgJTEwdSAlMTBsdVxuIiwKKwkJc2VxX3ByaW50ZihtLCAiJWMgJTNkICU1ZCAlNWQgJTEwdVxuIiwKIAkJCSAgIHByaXYtPmF1dGhlbnRpY2F0ZWQgPyAneScgOiAnbicsCiAJCQkgICBwcml2LT5taW5vci0+aW5kZXgsCiAJCQkgICBwaWRfdm5yKHByaXYtPnBpZCksCiAJCQkgICBmcm9tX2t1aWRfbXVuZ2VkKHNlcV91c2VyX25zKG0pLCBwcml2LT51aWQpLAotCQkJICAgcHJpdi0+bWFnaWMsIHByaXYtPmlvY3RsX2NvdW50KTsKKwkJCSAgIHByaXYtPm1hZ2ljKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIDA7CkBAIC0yMzQsMTQgKzIzNCwxOCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpwdDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwl1bnNpZ25lZCBsb25nIHZtYV9jb3VudCA9IDA7CiAjaWYgZGVmaW5lZChfX2kzODZfXykKIAl1bnNpZ25lZCBpbnQgcGdwcm90OwogI2VuZGlmCiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0Jc2VxX3ByaW50ZihtLCAidm1hIHVzZSBjb3VudDogJWQsIGhpZ2hfbWVtb3J5ID0gJXBLLCAweCVwS1xuIiwKLQkJICAgYXRvbWljX3JlYWQoJmRldi0+dm1hX2NvdW50KSwKLQkJICAgaGlnaF9tZW1vcnksICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdCwgJmRldi0+dm1hbGlzdCwgaGVhZCkKKwkJdm1hX2NvdW50Kys7CisKKwlzZXFfcHJpbnRmKG0sICJ2bWEgdXNlIGNvdW50OiAlbHUsIGhpZ2hfbWVtb3J5ID0gJXBLLCAweCVwS1xuIiwKKwkJICAgdm1hX2NvdW50LCBoaWdoX21lbW9yeSwKKwkJICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocHQsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKIAkJdm1hID0gcHQtPnZtYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCmluZGV4IDY0YzM0ZDUuLmMyNjc2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJaWYgKGRldi0+bnVtX2NydGNzKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9jcnRjczsgaSsrKSB7Ci0JCQlEUk1fV0FLRVVQKCZkZXYtPnZibGFua1tpXS5xdWV1ZSk7CisJCQl3YWtlX3VwKCZkZXYtPnZibGFua1tpXS5xdWV1ZSk7CiAJCQlkZXYtPnZibGFua1tpXS5lbmFibGVkID0gZmFsc2U7CiAJCQlkZXYtPnZibGFua1tpXS5sYXN0ID0KIAkJCQlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgaSk7CkBAIC00MzYsNDUgKzQzNiw0MSBAQAogfQogCiAvKioKLSAqIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMgLSBDYWxjdWxhdGUgYW5kCi0gKiBzdG9yZSB2YXJpb3VzIGNvbnN0YW50cyB3aGljaCBhcmUgbGF0ZXIgbmVlZGVkIGJ5Ci0gKiB2YmxhbmsgYW5kIHN3YXAtY29tcGxldGlvbiB0aW1lc3RhbXBpbmcsIGUuZywgYnkKLSAqIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoKS4KLSAqIFRoZXkgYXJlIGRlcml2ZWQgZnJvbSBjcnRjJ3MgdHJ1ZSBzY2Fub3V0IHRpbWluZywKLSAqIHNvIHRoZXkgdGFrZSB0aGluZ3MgbGlrZSBwYW5lbCBzY2FsaW5nIG9yIG90aGVyCi0gKiBhZGp1c3RtZW50cyBpbnRvIGFjY291bnQuCisgKiBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzIC0gQ2FsY3VsYXRlIHZibGFuayB0aW1lc3RhbXAgY29uc3RhbnRzCiAgKgogICogQGNydGMgZHJtX2NydGMgd2hvc2UgdGltZXN0YW1wIGNvbnN0YW50cyBzaG91bGQgYmUgdXBkYXRlZC4KKyAqIEBtb2RlIGRpc3BsYXkgbW9kZSBjb250YWluaW5nIHRoZSBzY2Fub3V0IHRpbWluZ3MKICAqCisgKiBDYWxjdWxhdGUgYW5kIHN0b3JlIHZhcmlvdXMgY29uc3RhbnRzIHdoaWNoIGFyZSBsYXRlcgorICogbmVlZGVkIGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uIHRpbWVzdGFtcGluZywgZS5nLAorICogYnkgZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcygpLiBUaGV5IGFyZQorICogZGVyaXZlZCBmcm9tIGNydGMncyB0cnVlIHNjYW5vdXQgdGltaW5nLCBzbyB0aGV5IHRha2UKKyAqIHRoaW5ncyBsaWtlIHBhbmVsIHNjYWxpbmcgb3Igb3RoZXIgYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgogICovCi12b2lkIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQordm9pZCBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewotCXM2NCBsaW5lZHVyX25zID0gMCwgcGl4ZWxkdXJfbnMgPSAwLCBmcmFtZWR1cl9ucyA9IDA7Ci0JdTY0IGRvdGNsb2NrOwotCi0JLyogRG90IGNsb2NrIGluIEh6OiAqLwotCWRvdGNsb2NrID0gKHU2NCkgY3J0Yy0+aHdtb2RlLmNsb2NrICogMTAwMDsKLQotCS8qIEZpZWxkcyBvZiBpbnRlcmxhY2VkIHNjYW5vdXQgbW9kZXMgYXJlIG9ubHkgaGFsZiBhIGZyYW1lIGR1cmF0aW9uLgotCSAqIERvdWJsZSB0aGUgZG90Y2xvY2sgdG8gZ2V0IGhhbGYgdGhlIGZyYW1lLS9saW5lLS9waXhlbGR1cmF0aW9uLgotCSAqLwotCWlmIChjcnRjLT5od21vZGUuZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLQkJZG90Y2xvY2sgKj0gMjsKKwlpbnQgbGluZWR1cl9ucyA9IDAsIHBpeGVsZHVyX25zID0gMCwgZnJhbWVkdXJfbnMgPSAwOworCWludCBkb3RjbG9jayA9IG1vZGUtPmNydGNfY2xvY2s7CiAKIAkvKiBWYWxpZCBkb3RjbG9jaz8gKi8KIAlpZiAoZG90Y2xvY2sgPiAwKSB7Ci0JCWludCBmcmFtZV9zaXplOwotCQkvKiBDb252ZXJ0IHNjYW5saW5lIGxlbmd0aCBpbiBwaXhlbHMgYW5kIHZpZGVvIGRvdCBjbG9jayB0bwotCQkgKiBsaW5lIGR1cmF0aW9uLCBmcmFtZSBkdXJhdGlvbiBhbmQgcGl4ZWwgZHVyYXRpb24gaW4KLQkJICogbmFub3NlY29uZHM6CisJCWludCBmcmFtZV9zaXplID0gbW9kZS0+Y3J0Y19odG90YWwgKiBtb2RlLT5jcnRjX3Z0b3RhbDsKKworCQkvKgorCQkgKiBDb252ZXJ0IHNjYW5saW5lIGxlbmd0aCBpbiBwaXhlbHMgYW5kIHZpZGVvCisJCSAqIGRvdCBjbG9jayB0byBsaW5lIGR1cmF0aW9uLCBmcmFtZSBkdXJhdGlvbgorCQkgKiBhbmQgcGl4ZWwgZHVyYXRpb24gaW4gbmFub3NlY29uZHM6CiAJCSAqLwotCQlwaXhlbGR1cl9ucyA9IChzNjQpIGRpdjY0X3U2NCgxMDAwMDAwMDAwLCBkb3RjbG9jayk7Ci0JCWxpbmVkdXJfbnMgID0gKHM2NCkgZGl2NjRfdTY0KCgodTY0KSBjcnRjLT5od21vZGUuY3J0Y19odG90YWwgKgotCQkJCQkgICAgICAxMDAwMDAwMDAwKSwgZG90Y2xvY2spOwotCQlmcmFtZV9zaXplID0gY3J0Yy0+aHdtb2RlLmNydGNfaHRvdGFsICoKLQkJCQljcnRjLT5od21vZGUuY3J0Y192dG90YWw7Ci0JCWZyYW1lZHVyX25zID0gKHM2NCkgZGl2NjRfdTY0KCh1NjQpIGZyYW1lX3NpemUgKiAxMDAwMDAwMDAwLAotCQkJCQkgICAgICBkb3RjbG9jayk7CisJCXBpeGVsZHVyX25zID0gMTAwMDAwMCAvIGRvdGNsb2NrOworCQlsaW5lZHVyX25zICA9IGRpdl91NjQoKHU2NCkgbW9kZS0+Y3J0Y19odG90YWwgKiAxMDAwMDAwLCBkb3RjbG9jayk7CisJCWZyYW1lZHVyX25zID0gZGl2X3U2NCgodTY0KSBmcmFtZV9zaXplICogMTAwMDAwMCwgZG90Y2xvY2spOworCisJCS8qCisJCSAqIEZpZWxkcyBvZiBpbnRlcmxhY2VkIHNjYW5vdXQgbW9kZXMgYXJlIG9ubHkgaGFsZiBhIGZyYW1lIGR1cmF0aW9uLgorCQkgKi8KKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQlmcmFtZWR1cl9ucyAvPSAyOwogCX0gZWxzZQogCQlEUk1fRVJST1IoImNydGMgJWQ6IENhbid0IGNhbGN1bGF0ZSBjb25zdGFudHMsIGRvdGNsb2NrID0gMCFcbiIsCiAJCQkgIGNydGMtPmJhc2UuaWQpOwpAQCAtNDg0LDExICs0ODAsMTEgQEAKIAljcnRjLT5mcmFtZWR1cl9ucyA9IGZyYW1lZHVyX25zOwogCiAJRFJNX0RFQlVHKCJjcnRjICVkOiBod21vZGU6IGh0b3RhbCAlZCwgdnRvdGFsICVkLCB2ZGlzcGxheSAlZFxuIiwKLQkJICBjcnRjLT5iYXNlLmlkLCBjcnRjLT5od21vZGUuY3J0Y19odG90YWwsCi0JCSAgY3J0Yy0+aHdtb2RlLmNydGNfdnRvdGFsLCBjcnRjLT5od21vZGUuY3J0Y192ZGlzcGxheSk7CisJCSAgY3J0Yy0+YmFzZS5pZCwgbW9kZS0+Y3J0Y19odG90YWwsCisJCSAgbW9kZS0+Y3J0Y192dG90YWwsIG1vZGUtPmNydGNfdmRpc3BsYXkpOwogCURSTV9ERUJVRygiY3J0YyAlZDogY2xvY2sgJWQga0h6IGZyYW1lZHVyICVkIGxpbmVkdXIgJWQsIHBpeGVsZHVyICVkXG4iLAotCQkgIGNydGMtPmJhc2UuaWQsIChpbnQpIGRvdGNsb2NrLzEwMDAsIChpbnQpIGZyYW1lZHVyX25zLAotCQkgIChpbnQpIGxpbmVkdXJfbnMsIChpbnQpIHBpeGVsZHVyX25zKTsKKwkJICBjcnRjLT5iYXNlLmlkLCBkb3RjbG9jaywgZnJhbWVkdXJfbnMsCisJCSAgbGluZWR1cl9ucywgcGl4ZWxkdXJfbnMpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKTsKIApAQCAtNTIxLDYgKzUxNyw3IEBACiAgKiAgICAgICAgIDAgPSBEZWZhdWx0LgogICogICAgICAgICBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRID0gSWYgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdmJsIGlycSBoYW5kbGVyLgogICogQHJlZmNydGM6IGRybV9jcnRjKiBvZiBjcnRjIHdoaWNoIGRlZmluZXMgc2Nhbm91dCB0aW1pbmcuCisgKiBAbW9kZTogbW9kZSB3aGljaCBkZWZpbmVzIHRoZSBzY2Fub3V0IHRpbWluZ3MKICAqCiAgKiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBmYWlsdXJlIG9yIGlmIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudAogICogdmlkZW8gbW9kZToKQEAgLTU0MCwxNCArNTM3LDE0IEBACiAJCQkJCSAgaW50ICptYXhfZXJyb3IsCiAJCQkJCSAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAogCQkJCQkgIHVuc2lnbmVkIGZsYWdzLAotCQkJCQkgIHN0cnVjdCBkcm1fY3J0YyAqcmVmY3J0YykKKwkJCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2NydGMgKnJlZmNydGMsCisJCQkJCSAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJa3RpbWVfdCBzdGltZSwgZXRpbWUsIG1vbm9fdGltZV9vZmZzZXQ7CiAJc3RydWN0IHRpbWV2YWwgdHZfZXRpbWU7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7Ci0JaW50IHZibF9zdGF0dXMsIHZ0b3RhbCwgdmRpc3BsYXk7CisJaW50IHZibF9zdGF0dXM7CiAJaW50IHZwb3MsIGhwb3MsIGk7Ci0JczY0IGZyYW1lZHVyX25zLCBsaW5lZHVyX25zLCBwaXhlbGR1cl9ucywgZGVsdGFfbnMsIGR1cmF0aW9uX25zOworCWludCBmcmFtZWR1cl9ucywgbGluZWR1cl9ucywgcGl4ZWxkdXJfbnMsIGRlbHRhX25zLCBkdXJhdGlvbl9uczsKIAlib29sIGludmJsOwogCiAJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gZGV2LT5udW1fY3J0Y3MpIHsKQEAgLTU2MSwxMCArNTU4LDYgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbW9kZSA9ICZyZWZjcnRjLT5od21vZGU7Ci0JdnRvdGFsID0gbW9kZS0+Y3J0Y192dG90YWw7Ci0JdmRpc3BsYXkgPSBtb2RlLT5jcnRjX3ZkaXNwbGF5OwotCiAJLyogRHVyYXRpb25zIG9mIGZyYW1lcywgbGluZXMsIHBpeGVscyBpbiBuYW5vc2Vjb25kcy4gKi8KIAlmcmFtZWR1cl9ucyA9IHJlZmNydGMtPmZyYW1lZHVyX25zOwogCWxpbmVkdXJfbnMgID0gcmVmY3J0Yy0+bGluZWR1cl9uczsKQEAgLTU3Myw3ICs1NjYsNyBAQAogCS8qIElmIG1vZGUgdGltaW5nIHVuZGVmaW5lZCwganVzdCByZXR1cm4gYXMgbm8tb3A6CiAJICogSGFwcGVucyBkdXJpbmcgaW5pdGlhbCBtb2Rlc2V0dGluZyBvZiBhIGNydGMuCiAJICovCi0JaWYgKHZ0b3RhbCA8PSAwIHx8IHZkaXNwbGF5IDw9IDAgfHwgZnJhbWVkdXJfbnMgPT0gMCkgeworCWlmIChmcmFtZWR1cl9ucyA9PSAwKSB7CiAJCURSTV9ERUJVRygiY3J0YyAlZDogTm9vcCBkdWUgdG8gdW5pbml0aWFsaXplZCBtb2RlLlxuIiwgY3J0Yyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTU5MCw3ICs1ODMsNyBAQAogCQkgKiBHZXQgdmVydGljYWwgYW5kIGhvcml6b250YWwgc2Nhbm91dCBwb3NpdGlvbiB2cG9zLCBocG9zLAogCQkgKiBhbmQgYm91bmRpbmcgdGltZXN0YW1wcyBzdGltZSwgZXRpbWUsIHByZS9wb3N0IHF1ZXJ5LgogCQkgKi8KLQkJdmJsX3N0YXR1cyA9IGRldi0+ZHJpdmVyLT5nZXRfc2Nhbm91dF9wb3NpdGlvbihkZXYsIGNydGMsICZ2cG9zLAorCQl2Ymxfc3RhdHVzID0gZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uKGRldiwgY3J0YywgZmxhZ3MsICZ2cG9zLAogCQkJCQkJCSAgICAgICAmaHBvcywgJnN0aW1lLCAmZXRpbWUpOwogCiAJCS8qCkBAIC02MTEsMTggKzYwNCwxOCBAQAogCQlkdXJhdGlvbl9ucyA9IGt0aW1lX3RvX25zKGV0aW1lKSAtIGt0aW1lX3RvX25zKHN0aW1lKTsKIAogCQkvKiBBY2NlcHQgcmVzdWx0IHdpdGggPCAgbWF4X2Vycm9yIG5zZWNzIHRpbWluZyB1bmNlcnRhaW50eS4gKi8KLQkJaWYgKGR1cmF0aW9uX25zIDw9IChzNjQpICptYXhfZXJyb3IpCisJCWlmIChkdXJhdGlvbl9ucyA8PSAqbWF4X2Vycm9yKQogCQkJYnJlYWs7CiAJfQogCiAJLyogTm9pc3kgc3lzdGVtIHRpbWluZz8gKi8KIAlpZiAoaSA9PSBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMpIHsKIAkJRFJNX0RFQlVHKCJjcnRjICVkOiBOb2lzeSB0aW1lc3RhbXAgJWQgdXMgPiAlZCB1cyBbJWQgcmVwc10uXG4iLAotCQkJICBjcnRjLCAoaW50KSBkdXJhdGlvbl9ucy8xMDAwLCAqbWF4X2Vycm9yLzEwMDAsIGkpOworCQkJICBjcnRjLCBkdXJhdGlvbl9ucy8xMDAwLCAqbWF4X2Vycm9yLzEwMDAsIGkpOwogCX0KIAogCS8qIFJldHVybiB1cHBlciBib3VuZCBvZiB0aW1lc3RhbXAgcHJlY2lzaW9uIGVycm9yLiAqLwotCSptYXhfZXJyb3IgPSAoaW50KSBkdXJhdGlvbl9uczsKKwkqbWF4X2Vycm9yID0gZHVyYXRpb25fbnM7CiAKIAkvKiBDaGVjayBpZiBpbiB2YmxhbmsgYXJlYToKIAkgKiB2cG9zIGlzID49MCBpbiB2aWRlbyBzY2Fub3V0IGFyZWEsIGJ1dCBuZWdhdGl2ZQpAQCAtNjM1LDI1ICs2MjgsNyBAQAogCSAqIHNpbmNlIHN0YXJ0IG9mIHNjYW5vdXQgYXQgZmlyc3QgZGlzcGxheSBzY2FubGluZS4gZGVsdGFfbnMKIAkgKiBjYW4gYmUgbmVnYXRpdmUgaWYgc3RhcnQgb2Ygc2Nhbm91dCBoYXNuJ3QgaGFwcGVuZWQgeWV0LgogCSAqLwotCWRlbHRhX25zID0gKHM2NCkgdnBvcyAqIGxpbmVkdXJfbnMgKyAoczY0KSBocG9zICogcGl4ZWxkdXJfbnM7Ci0KLQkvKiBJcyB2cG9zIG91dHNpZGUgbm9taW5hbCB2YmxhbmsgYXJlYSwgYnV0IGxlc3MgdGhhbgotCSAqIDEvMTAwIG9mIGEgZnJhbWUgaGVpZ2h0IGF3YXkgZnJvbSBzdGFydCBvZiB2Ymxhbms/Ci0JICogSWYgc28sIGFzc3VtZSB0aGlzIGlzbid0IGEgbWFzc2l2ZWx5IGRlbGF5ZWQgdmJsYW5rCi0JICogaW50ZXJydXB0LCBidXQgYSB2YmxhbmsgaW50ZXJydXB0IHRoYXQgZmlyZWQgYSBmZXcKLQkgKiBtaWNyb3NlY29uZHMgYmVmb3JlIHRydWUgc3RhcnQgb2YgdmJsYW5rLiBDb21wZW5zYXRlCi0JICogYnkgYWRkaW5nIGEgZnVsbCBmcmFtZSBkdXJhdGlvbiB0byB0aGUgZmluYWwgdGltZXN0YW1wLgotCSAqIEhhcHBlbnMsIGUuZy4sIG9uIEFUSSBSNTAwLCBSNjAwLgotCSAqCi0JICogV2Ugb25seSBkbyB0aGlzIGlmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEuCi0JICovCi0JaWYgKChmbGFncyAmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEpICYmICFpbnZibCAmJgotCSAgICAoKHZkaXNwbGF5IC0gdnBvcykgPCB2dG90YWwgLyAxMDApKSB7Ci0JCWRlbHRhX25zID0gZGVsdGFfbnMgLSBmcmFtZWR1cl9uczsKLQotCQkvKiBTaWduYWwgdGhpcyBjb3JyZWN0aW9uIGFzICJhcHBsaWVkIi4gKi8KLQkJdmJsX3N0YXR1cyB8PSAweDg7Ci0JfQorCWRlbHRhX25zID0gdnBvcyAqIGxpbmVkdXJfbnMgKyBocG9zICogcGl4ZWxkdXJfbnM7CiAKIAlpZiAoIWRybV90aW1lc3RhbXBfbW9ub3RvbmljKQogCQlldGltZSA9IGt0aW1lX3N1YihldGltZSwgbW9ub190aW1lX29mZnNldCk7CkBAIC02NzMsNyArNjQ4LDcgQEAKIAkJICBjcnRjLCAoaW50KXZibF9zdGF0dXMsIGhwb3MsIHZwb3MsCiAJCSAgKGxvbmcpdHZfZXRpbWUudHZfc2VjLCAobG9uZyl0dl9ldGltZS50dl91c2VjLAogCQkgIChsb25nKXZibGFua190aW1lLT50dl9zZWMsIChsb25nKXZibGFua190aW1lLT50dl91c2VjLAotCQkgIChpbnQpZHVyYXRpb25fbnMvMTAwMCwgaSk7CisJCSAgZHVyYXRpb25fbnMvMTAwMCwgaSk7CiAKIAl2Ymxfc3RhdHVzID0gRFJNX1ZCTEFOS1RJTUVfU0NBTk9VVFBPU19NRVRIT0Q7CiAJaWYgKGludmJsKQpAQCAtOTYwLDcgKzkzNSw3IEBACiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+dmJsYW5rW2NydGNdLnJlZmNvdW50KSAmJgogCSAgICAoZHJtX3ZibGFua19vZmZkZWxheSA+IDApKQogCQltb2RfdGltZXIoJmRldi0+dmJsYW5rX2Rpc2FibGVfdGltZXIsCi0JCQkgIGppZmZpZXMgKyAoKGRybV92Ymxhbmtfb2ZmZGVsYXkgKiBEUk1fSFopLzEwMDApKTsKKwkJCSAgamlmZmllcyArICgoZHJtX3ZibGFua19vZmZkZWxheSAqIEhaKS8xMDAwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV92YmxhbmtfcHV0KTsKIApAQCAtOTgwLDcgKzk1NSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgY3J0Yyk7Ci0JRFJNX1dBS0VVUCgmZGV2LT52YmxhbmtbY3J0Y10ucXVldWUpOworCXdha2VfdXAoJmRldi0+dmJsYW5rW2NydGNdLnF1ZXVlKTsKIAogCS8qIFNlbmQgYW55IHF1ZXVlZCB2YmxhbmsgZXZlbnRzLCBsZXN0IHRoZSBuYXRpdmVzIGdyb3cgZGlzcXVpZXQgKi8KIAlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgY3J0YywgJm5vdyk7CkBAIC0xMjQ0LDcgKzEyMTksNyBAQAogCURSTV9ERUJVRygid2FpdGluZyBvbiB2YmxhbmsgY291bnQgJWQsIGNydGMgJWRcbiIsCiAJCSAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSwgY3J0Yyk7CiAJZGV2LT52YmxhbmtbY3J0Y10ubGFzdF93YWl0ID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKLQlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsYW5rW2NydGNdLnF1ZXVlLCAzICogRFJNX0haLAorCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxhbmtbY3J0Y10ucXVldWUsIDMgKiBIWiwKIAkJICAgICgoKGRybV92YmxhbmtfY291bnQoZGV2LCBjcnRjKSAtCiAJCSAgICAgICB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpIHx8CiAJCSAgICAgIWRldi0+aXJxX2VuYWJsZWQpKTsKQEAgLTEzNjMsNyArMTMzOCw3IEBACiAJCQkgIGNydGMsIChpbnQpIGRpZmZfbnMpOwogCX0KIAotCURSTV9XQUtFVVAoJmRldi0+dmJsYW5rW2NydGNdLnF1ZXVlKTsKKwl3YWtlX3VwKCZkZXYtPnZibGFua1tjcnRjXS5xdWV1ZSk7CiAJZHJtX2hhbmRsZV92YmxhbmtfZXZlbnRzKGRldiwgY3J0Yyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jCmluZGV4IDY0ZTQ0ZmEuLjAwYzY3YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYwpAQCAtODIsMTkgKzgyLDE5IEBACiB9CiAKIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfZnJlZV9tZW1vcnkoKSAqLwotdm9pZCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIGludCBwYWdlcykKK3ZvaWQgZHJtX2ZyZWVfYWdwKHN0cnVjdCBhZ3BfbWVtb3J5ICogaGFuZGxlLCBpbnQgcGFnZXMpCiB7CiAJYWdwX2ZyZWVfbWVtb3J5KGhhbmRsZSk7CiB9CiAKIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfYmluZF9tZW1vcnkoKSAqLwotaW50IGRybV9iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQoraW50IGRybV9iaW5kX2FncChzdHJ1Y3QgYWdwX21lbW9yeSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQogewogCXJldHVybiBhZ3BfYmluZF9tZW1vcnkoaGFuZGxlLCBzdGFydCk7CiB9CiAKIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfdW5iaW5kX21lbW9yeSgpICovCi1pbnQgZHJtX3VuYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUpCitpbnQgZHJtX3VuYmluZF9hZ3Aoc3RydWN0IGFncF9tZW1vcnkgKiBoYW5kbGUpCiB7CiAJcmV0dXJuIGFncF91bmJpbmRfbWVtb3J5KGhhbmRsZSk7CiB9CkBAIC0xMTAsOCArMTEwLDcgQEAKIAogdm9pZCBkcm1fY29yZV9pb3JlbWFwKHN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJgotCSAgICBkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQorCWlmIChkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQogCQltYXAtPmhhbmRsZSA9IGFncF9yZW1hcChtYXAtPm9mZnNldCwgbWFwLT5zaXplLCBkZXYpOwogCWVsc2UKIAkJbWFwLT5oYW5kbGUgPSBpb3JlbWFwKG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUpOwpAQCAtMTIwLDggKzExOSw3IEBACiAKIHZvaWQgZHJtX2NvcmVfaW9yZW1hcF93YyhzdHJ1Y3QgZHJtX2xvY2FsX21hcCAqbWFwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYKLQkgICAgZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlICYmIG1hcC0+dHlwZSA9PSBfRFJNX0FHUCkKKwlpZiAoZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlICYmIG1hcC0+dHlwZSA9PSBfRFJNX0FHUCkKIAkJbWFwLT5oYW5kbGUgPSBhZ3BfcmVtYXAobWFwLT5vZmZzZXQsIG1hcC0+c2l6ZSwgZGV2KTsKIAllbHNlCiAJCW1hcC0+aGFuZGxlID0gaW9yZW1hcF93YyhtYXAtPm9mZnNldCwgbWFwLT5zaXplKTsKQEAgLTEzMyw4ICsxMzEsNyBAQAogCWlmICghbWFwLT5oYW5kbGUgfHwgIW1hcC0+c2l6ZSkKIAkJcmV0dXJuOwogCi0JaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJgotCSAgICBkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQorCWlmIChkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQogCQl2dW5tYXAobWFwLT5oYW5kbGUpOwogCWVsc2UKIAkJaW91bm1hcChtYXAtPmhhbmRsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21pcGlfZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21pcGlfZHNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWlwaV9kc2kuYwpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIE1JUEkgRFNJIEJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzLCBTYW1zdW5nIEVsZWN0cm9uaWNzLCBDby4sIEx0ZC4KKyAqIEFuZHJ6ZWogSGFqZGEgPGEuaGFqZGFAc2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtX21pcGlfZHNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CisKK3N0YXRpYyBpbnQgbWlwaV9kc2lfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gb2ZfZHJpdmVyX21hdGNoX2RldmljZShkZXYsIGRydik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBtaXBpX2RzaV9kZXZpY2VfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAorCS5zdXNwZW5kID0gcG1fZ2VuZXJpY19zdXNwZW5kLAorCS5yZXN1bWUgPSBwbV9nZW5lcmljX3Jlc3VtZSwKKwkuZnJlZXplID0gcG1fZ2VuZXJpY19mcmVlemUsCisJLnRoYXcgPSBwbV9nZW5lcmljX3RoYXcsCisJLnBvd2Vyb2ZmID0gcG1fZ2VuZXJpY19wb3dlcm9mZiwKKwkucmVzdG9yZSA9IHBtX2dlbmVyaWNfcmVzdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbWlwaV9kc2lfYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAibWlwaS1kc2kiLAorCS5tYXRjaCA9IG1pcGlfZHNpX2RldmljZV9tYXRjaCwKKwkucG0gPSAmbWlwaV9kc2lfZGV2aWNlX3BtX29wcywKK307CisKK3N0YXRpYyB2b2lkIG1pcGlfZHNpX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoZGV2KTsKKworCW9mX25vZGVfcHV0KGRldi0+b2Zfbm9kZSk7CisJa2ZyZWUoZHNpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZSBtaXBpX2RzaV9kZXZpY2VfdHlwZSA9IHsKKwkucmVsZWFzZSA9IG1pcGlfZHNpX2Rldl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKm1pcGlfZHNpX2RldmljZV9hbGxvYyhzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2k7CisKKwlkc2kgPSBremFsbG9jKHNpemVvZigqZHNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkc2kpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZHNpLT5ob3N0ID0gaG9zdDsKKwlkc2ktPmRldi5idXMgPSAmbWlwaV9kc2lfYnVzX3R5cGU7CisJZHNpLT5kZXYucGFyZW50ID0gaG9zdC0+ZGV2OworCWRzaS0+ZGV2LnR5cGUgPSAmbWlwaV9kc2lfZGV2aWNlX3R5cGU7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZHNpLT5kZXYpOworCisJcmV0dXJuIGRzaTsKK30KKworc3RhdGljIGludCBtaXBpX2RzaV9kZXZpY2VfYWRkKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCA9IGRzaS0+aG9zdDsKKworCWRldl9zZXRfbmFtZSgmZHNpLT5kZXYsICIlcy4lZCIsIGRldl9uYW1lKGhvc3QtPmRldiksICBkc2ktPmNoYW5uZWwpOworCisJcmV0dXJuIGRldmljZV9hZGQoJmRzaS0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKgorb2ZfbWlwaV9kc2lfZGV2aWNlX2FkZChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBob3N0LT5kZXY7CisJaW50IHJldDsKKwl1MzIgcmVnOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInJlZyIsICZyZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm9kZSAlcyBoYXMgbm8gdmFsaWQgcmVnIHByb3BlcnR5OiAlZFxuIiwKKwkJCW5vZGUtPmZ1bGxfbmFtZSwgcmV0KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKHJlZyA+IDMpIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm9kZSAlcyBoYXMgaW52YWxpZCByZWcgcHJvcGVydHk6ICV1XG4iLAorCQkJbm9kZS0+ZnVsbF9uYW1lLCByZWcpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlkc2kgPSBtaXBpX2RzaV9kZXZpY2VfYWxsb2MoaG9zdCk7CisJaWYgKElTX0VSUihkc2kpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIERTSSBkZXZpY2UgJXM6ICVsZFxuIiwKKwkJCW5vZGUtPmZ1bGxfbmFtZSwgUFRSX0VSUihkc2kpKTsKKwkJcmV0dXJuIGRzaTsKKwl9CisKKwlkc2ktPmRldi5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisJZHNpLT5jaGFubmVsID0gcmVnOworCisJcmV0ID0gbWlwaV9kc2lfZGV2aWNlX2FkZChkc2kpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIERTSSBkZXZpY2UgJXM6ICVkXG4iLAorCQkJbm9kZS0+ZnVsbF9uYW1lLCByZXQpOworCQlrZnJlZShkc2kpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBkc2k7Cit9CisKK2ludCBtaXBpX2RzaV9ob3N0X3JlZ2lzdGVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKGhvc3QtPmRldi0+b2Zfbm9kZSwgbm9kZSkKKwkJb2ZfbWlwaV9kc2lfZGV2aWNlX2FkZChob3N0LCBub2RlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtaXBpX2RzaV9ob3N0X3JlZ2lzdGVyKTsKKworc3RhdGljIGludCBtaXBpX2RzaV9yZW1vdmVfZGV2aWNlX2ZuKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoZGV2KTsKKworCWRldmljZV91bnJlZ2lzdGVyKCZkc2ktPmRldik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpCit7CisJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGhvc3QtPmRldiwgTlVMTCwgbWlwaV9kc2lfcmVtb3ZlX2RldmljZV9mbik7Cit9CitFWFBPUlRfU1lNQk9MKG1pcGlfZHNpX2hvc3RfdW5yZWdpc3Rlcik7CisKKy8qKgorICogbWlwaV9kc2lfYXR0YWNoIC0gYXR0YWNoIGEgRFNJIGRldmljZSB0byBpdHMgRFNJIGhvc3QKKyAqIEBkc2k6IERTSSBwZXJpcGhlcmFsCisgKi8KK2ludCBtaXBpX2RzaV9hdHRhY2goc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQoreworCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyAqb3BzID0gZHNpLT5ob3N0LT5vcHM7CisKKwlpZiAoIW9wcyB8fCAhb3BzLT5hdHRhY2gpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIG9wcy0+YXR0YWNoKGRzaS0+aG9zdCwgZHNpKTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kc2lfYXR0YWNoKTsKKworLyoqCisgKiBtaXBpX2RzaV9kZXRhY2ggLSBkZXRhY2ggYSBEU0kgZGV2aWNlIGZyb20gaXRzIERTSSBob3N0CisgKiBAZHNpOiBEU0kgcGVyaXBoZXJhbAorICovCitpbnQgbWlwaV9kc2lfZGV0YWNoKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwljb25zdCBzdHJ1Y3QgbWlwaV9kc2lfaG9zdF9vcHMgKm9wcyA9IGRzaS0+aG9zdC0+b3BzOworCisJaWYgKCFvcHMgfHwgIW9wcy0+ZGV0YWNoKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXJldHVybiBvcHMtPmRldGFjaChkc2ktPmhvc3QsIGRzaSk7Cit9CitFWFBPUlRfU1lNQk9MKG1pcGlfZHNpX2RldGFjaCk7CisKKy8qKgorICogbWlwaV9kc2lfZGNzX3dyaXRlIC0gc2VuZCBEQ1Mgd3JpdGUgY29tbWFuZAorICogQGRzaTogRFNJIGRldmljZQorICogQGNoYW5uZWw6IHZpcnR1YWwgY2hhbm5lbAorICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgZm9sbG93ZWQgYnkgcGFyYW1ldGVycworICogQGxlbjogbGVuZ3RoIG9mIEBkYXRhCisgKi8KK2ludCBtaXBpX2RzaV9kY3Nfd3JpdGUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJY29uc3Qgc3RydWN0IG1pcGlfZHNpX2hvc3Rfb3BzICpvcHMgPSBkc2ktPmhvc3QtPm9wczsKKwlzdHJ1Y3QgbWlwaV9kc2lfbXNnIG1zZyA9IHsKKwkJLmNoYW5uZWwgPSBjaGFubmVsLAorCQkudHhfYnVmID0gZGF0YSwKKwkJLnR4X2xlbiA9IGxlbgorCX07CisKKwlpZiAoIW9wcyB8fCAhb3BzLT50cmFuc2ZlcikKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAxOgorCQltc2cudHlwZSA9IE1JUElfRFNJX0RDU19TSE9SVF9XUklURTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltc2cudHlwZSA9IE1JUElfRFNJX0RDU19TSE9SVF9XUklURV9QQVJBTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnLnR5cGUgPSBNSVBJX0RTSV9EQ1NfTE9OR19XUklURTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG9wcy0+dHJhbnNmZXIoZHNpLT5ob3N0LCAmbXNnKTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kc2lfZGNzX3dyaXRlKTsKKworLyoqCisgKiBtaXBpX2RzaV9kY3NfcmVhZCAtIHNlbmQgRENTIHJlYWQgcmVxdWVzdCBjb21tYW5kCisgKiBAZHNpOiBEU0kgZGV2aWNlCisgKiBAY2hhbm5lbDogdmlydHVhbCBjaGFubmVsCisgKiBAY21kOiBEQ1MgcmVhZCBjb21tYW5kCisgKiBAZGF0YTogcG9pbnRlciB0byByZWFkIGJ1ZmZlcgorICogQGxlbjogbGVuZ3RoIG9mIEBkYXRhCisgKgorICogRnVuY3Rpb24gcmV0dXJucyBudW1iZXIgb2YgcmVhZCBieXRlcyBvciBlcnJvciBjb2RlLgorICovCitzc2l6ZV90IG1pcGlfZHNpX2Rjc19yZWFkKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgIHU4IGNtZCwgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgbWlwaV9kc2lfaG9zdF9vcHMgKm9wcyA9IGRzaS0+aG9zdC0+b3BzOworCXN0cnVjdCBtaXBpX2RzaV9tc2cgbXNnID0geworCQkuY2hhbm5lbCA9IGNoYW5uZWwsCisJCS50eXBlID0gTUlQSV9EU0lfRENTX1JFQUQsCisJCS50eF9idWYgPSAmY21kLAorCQkudHhfbGVuID0gMSwKKwkJLnJ4X2J1ZiA9IGRhdGEsCisJCS5yeF9sZW4gPSBsZW4KKwl9OworCisJaWYgKCFvcHMgfHwgIW9wcy0+dHJhbnNmZXIpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIG9wcy0+dHJhbnNmZXIoZHNpLT5ob3N0LCAmbXNnKTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kc2lfZGNzX3JlYWQpOworCitzdGF0aWMgaW50IG1pcGlfZHNpX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1pcGlfZHNpX2RyaXZlciAqZHJ2ID0gdG9fbWlwaV9kc2lfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBkcnYtPnByb2JlKGRzaSk7Cit9CisKK3N0YXRpYyBpbnQgbWlwaV9kc2lfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1pcGlfZHNpX2RyaXZlciAqZHJ2ID0gdG9fbWlwaV9kc2lfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBkcnYtPnJlbW92ZShkc2kpOworfQorCisvKioKKyAqIG1pcGlfZHNpX2RyaXZlcl9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgZHJpdmVyIGZvciBEU0kgZGV2aWNlcworICogQGRydjogRFNJIGRyaXZlciBzdHJ1Y3R1cmUKKyAqLworaW50IG1pcGlfZHNpX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbWlwaV9kc2lfZHJpdmVyICpkcnYpCit7CisJZHJ2LT5kcml2ZXIuYnVzID0gJm1pcGlfZHNpX2J1c190eXBlOworCWlmIChkcnYtPnByb2JlKQorCQlkcnYtPmRyaXZlci5wcm9iZSA9IG1pcGlfZHNpX2Rydl9wcm9iZTsKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCWRydi0+ZHJpdmVyLnJlbW92ZSA9IG1pcGlfZHNpX2Rydl9yZW1vdmU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKG1pcGlfZHNpX2RyaXZlcl9yZWdpc3Rlcik7CisKKy8qKgorICogbWlwaV9kc2lfZHJpdmVyX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGEgZHJpdmVyIGZvciBEU0kgZGV2aWNlcworICogQGRydjogRFNJIGRyaXZlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBtaXBpX2RzaV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbWlwaV9kc2lfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kc2lfZHJpdmVyX3VucmVnaXN0ZXIpOworCitzdGF0aWMgaW50IF9faW5pdCBtaXBpX2RzaV9idXNfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJm1pcGlfZHNpX2J1c190eXBlKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKG1pcGlfZHNpX2J1c19pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcnplaiBIYWpkYSA8YS5oYWpkYUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUlQSSBEU0kgQnVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wYW5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjk4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BhbmVsLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIE5WSURJQSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+CisKK3N0YXRpYyBERUZJTkVfTVVURVgocGFuZWxfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHBhbmVsX2xpc3QpOworCit2b2lkIGRybV9wYW5lbF9pbml0KHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQoreworCUlOSVRfTElTVF9IRUFEKCZwYW5lbC0+bGlzdCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wYW5lbF9pbml0KTsKKworaW50IGRybV9wYW5lbF9hZGQoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJbXV0ZXhfbG9jaygmcGFuZWxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcGFuZWwtPmxpc3QsICZwYW5lbF9saXN0KTsKKwltdXRleF91bmxvY2soJnBhbmVsX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wYW5lbF9hZGQpOworCit2b2lkIGRybV9wYW5lbF9yZW1vdmUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJbXV0ZXhfbG9jaygmcGFuZWxfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmcGFuZWwtPmxpc3QpOworCW11dGV4X3VubG9jaygmcGFuZWxfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wYW5lbF9yZW1vdmUpOworCitpbnQgZHJtX3BhbmVsX2F0dGFjaChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlpZiAocGFuZWwtPmNvbm5lY3RvcikKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBhbmVsLT5jb25uZWN0b3IgPSBjb25uZWN0b3I7CisJcGFuZWwtPmRybSA9IGNvbm5lY3Rvci0+ZGV2OworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wYW5lbF9hdHRhY2gpOworCitpbnQgZHJtX3BhbmVsX2RldGFjaChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlwYW5lbC0+Y29ubmVjdG9yID0gTlVMTDsKKwlwYW5lbC0+ZHJtID0gTlVMTDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fcGFuZWxfZGV0YWNoKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RydWN0IGRybV9wYW5lbCAqb2ZfZHJtX2ZpbmRfcGFuZWwoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKKworCW11dGV4X2xvY2soJnBhbmVsX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYW5lbCwgJnBhbmVsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBhbmVsLT5kZXYtPm9mX25vZGUgPT0gbnApIHsKKwkJCW11dGV4X3VubG9jaygmcGFuZWxfbG9jayk7CisJCQlyZXR1cm4gcGFuZWw7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnBhbmVsX2xvY2spOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9kcm1fZmluZF9wYW5lbCk7CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRFJNIHBhbmVsIGluZnJhc3RydWN0dXJlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKaW5kZXggMDI2Nzk3OS4uNTczNmFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCkBAIC0yNjIsMTYgKzI2MiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9wY2lfYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGRybV9wY2lfYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpKSB7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfVVNFX0FHUCkpIHsKIAkJaWYgKGRybV9wY2lfZGV2aWNlX2lzX2FncChkZXYpKQogCQkJZGV2LT5hZ3AgPSBkcm1fYWdwX2luaXQoZGV2KTsKLQkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUkVRVUlSRV9BR1ApCi0JCSAgICAmJiAoZGV2LT5hZ3AgPT0gTlVMTCkpIHsKLQkJCURSTV9FUlJPUigiQ2Fubm90IGluaXRpYWxpemUgdGhlIGFncGdhcnQgbW9kdWxlLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlpZiAoZGV2LT5hZ3ApIHsKIAkJCWRldi0+YWdwLT5hZ3BfbXRyciA9IGFyY2hfcGh5c193Y19hZGQoCiAJCQkJZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfYmFzZSwKQEAgLTI3OSwxNSArMjc0LDE0IEBACiAJCQkJMTAyNCAqIDEwMjQpOwogCQl9CiAJfQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkcm1fcGNpX2FncF9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkIGRybV9wY2lfYWdwX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CisJaWYgKGRldi0+YWdwKSB7CiAJCWFyY2hfcGh5c193Y19kZWwoZGV2LT5hZ3AtPmFncF9tdHJyKTsKIAkJZHJtX2FncF9jbGVhcihkZXYpOwotCQlkcm1fYWdwX2Rlc3Ryb3koZGV2LT5hZ3ApOworCQlrZnJlZShkZXYtPmFncCk7CiAJCWRldi0+YWdwID0gTlVMTDsKIAl9CiB9CkBAIC0yOTksOCArMjkzLDYgQEAKIAkuc2V0X2J1c2lkID0gZHJtX3BjaV9zZXRfYnVzaWQsCiAJLnNldF91bmlxdWUgPSBkcm1fcGNpX3NldF91bmlxdWUsCiAJLmlycV9ieV9idXNpZCA9IGRybV9wY2lfaXJxX2J5X2J1c2lkLAotCS5hZ3BfaW5pdCA9IGRybV9wY2lfYWdwX2luaXQsCi0JLmFncF9kZXN0cm95ID0gZHJtX3BjaV9hZ3BfZGVzdHJveSwKIH07CiAKIC8qKgpAQCAtMzM4LDE3ICszMzAsMjUgQEAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKKwlkcm1fcGNpX2FncF9pbml0KGRldik7CisKIAlyZXQgPSBkcm1fZGV2X3JlZ2lzdGVyKGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfcGNpOworCQlnb3RvIGVycl9hZ3A7CiAKIAlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgZm9yICVzIG9uIG1pbm9yICVkXG4iLAogCQkgZHJpdmVyLT5uYW1lLCBkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yLCBkcml2ZXItPnBhdGNobGV2ZWwsCiAJCSBkcml2ZXItPmRhdGUsIHBjaV9uYW1lKHBkZXYpLCBkZXYtPnByaW1hcnktPmluZGV4KTsKIAorCS8qIE5vIGxvY2tpbmcgbmVlZGVkIHNpbmNlIHNoYWRvdy1hdHRhY2ggaXMgc2luZ2xlLXRocmVhZGVkIHNpbmNlIGl0IG1heQorCSAqIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHBlci1kcml2ZXIgbW9kdWxlIGluaXQgaG9vay4gKi8KKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCWxpc3RfYWRkX3RhaWwoJmRldi0+bGVnYWN5X2Rldl9saXN0LCAmZHJpdmVyLT5sZWdhY3lfZGV2X2xpc3QpOworCiAJcmV0dXJuIDA7CiAKLWVycl9wY2k6CitlcnJfYWdwOgorCWRybV9wY2lfYWdwX2Rlc3Ryb3koZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBlcnJfZnJlZToKIAlkcm1fZGV2X2ZyZWUoZGV2KTsKQEAgLTM3NSw3ICszNzUsNiBAQAogCiAJRFJNX0RFQlVHKCJcbiIpOwogCi0JSU5JVF9MSVNUX0hFQUQoJmRyaXZlci0+ZGV2aWNlX2xpc3QpOwogCWRyaXZlci0+a2RyaXZlci5wY2kgPSBwZHJpdmVyOwogCWRyaXZlci0+YnVzID0gJmRybV9wY2lfYnVzOwogCkBAIC0zODMsNiArMzgyLDcgQEAKIAkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIocGRyaXZlcik7CiAKIAkvKiBJZiBub3QgdXNpbmcgS01TLCBmYWxsIGJhY2sgdG8gc3RlYWx0aCBtb2RlIG1hbnVhbCBzY2FubmluZy4gKi8KKwlJTklUX0xJU1RfSEVBRCgmZHJpdmVyLT5sZWdhY3lfZGV2X2xpc3QpOwogCWZvciAoaSA9IDA7IHBkcml2ZXItPmlkX3RhYmxlW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKIAkJcGlkID0gJnBkcml2ZXItPmlkX3RhYmxlW2ldOwogCkBAIC00NTIsNiArNDUyLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3ZvaWQgZHJtX3BjaV9hZ3BfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7fQogI2VuZGlmCiAKIEVYUE9SVF9TWU1CT0woZHJtX3BjaV9pbml0KTsKQEAgLTQ2NSw4ICs0NjYsMTEgQEAKIAlpZiAoZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfTU9ERVNFVCkgewogCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIocGRyaXZlcik7CiAJfSBlbHNlIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmZHJpdmVyLT5kZXZpY2VfbGlzdCwgZHJpdmVyX2l0ZW0pCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmRyaXZlci0+bGVnYWN5X2Rldl9saXN0LAorCQkJCQkgbGVnYWN5X2Rldl9saXN0KSB7CiAJCQlkcm1fcHV0X2RldihkZXYpOworCQkJbGlzdF9kZWwoJmRldi0+bGVnYWN5X2Rldl9saXN0KTsKKwkJfQogCX0KIAlEUk1fSU5GTygiTW9kdWxlIHVubG9hZGVkXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYwppbmRleCBmYzI0ZmVlLi4yMWZjODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wbGF0Zm9ybS5jCkBAIC0xNDcsMTggKzE0Nyw2IEBACiAKIAlkcml2ZXItPmtkcml2ZXIucGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlOwogCWRyaXZlci0+YnVzID0gJmRybV9wbGF0Zm9ybV9idXM7Ci0JSU5JVF9MSVNUX0hFQUQoJmRyaXZlci0+ZGV2aWNlX2xpc3QpOwogCXJldHVybiBkcm1fZ2V0X3BsYXRmb3JtX2RldihwbGF0Zm9ybV9kZXZpY2UsIGRyaXZlcik7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9wbGF0Zm9ybV9pbml0KTsKLQotdm9pZCBkcm1fcGxhdGZvcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2UpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiwgKnRtcDsKLQlEUk1fREVCVUcoIlxuIik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZkcml2ZXItPmRldmljZV9saXN0LCBkcml2ZXJfaXRlbSkKLQkJZHJtX3B1dF9kZXYoZGV2KTsKLQlEUk1fSU5GTygiTW9kdWxlIHVubG9hZGVkXG4iKTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX3BsYXRmb3JtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwppbmRleCA2NmRkM2EwLi45OGEzM2M1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jCkBAIC05OSwxMyArOTksMTkgQEAKIAkJCSBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAogCQkJIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCWlmIChkcm1fZGVidWcgJiByZXF1ZXN0X2xldmVsKSB7Ci0JCWlmIChmdW5jdGlvbl9uYW1lKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlslczolc10sICIsIHByZWZpeCwgZnVuY3Rpb25fbmFtZSk7CiAJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JCXZwcmludGsoZm9ybWF0LCBhcmdzKTsKKwkJdmFmLmZtdCA9IGZvcm1hdDsKKwkJdmFmLnZhID0gJmFyZ3M7CisKKwkJaWYgKGZ1bmN0aW9uX25hbWUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiWyVzOiVzXSwgJXBWIiwgcHJlZml4LAorCQkJICAgICAgIGZ1bmN0aW9uX25hbWUsICZ2YWYpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXBWIiwgJnZhZik7CiAJCXZhX2VuZChhcmdzKTsKIAl9CiB9CkBAIC01MjEsMTYgKzUyNywxMCBAQAogCiAJbXV0ZXhfbG9jaygmZHJtX2dsb2JhbF9tdXRleCk7CiAKLQlpZiAoZGV2LT5kcml2ZXItPmJ1cy0+YWdwX2luaXQpIHsKLQkJcmV0ID0gZGV2LT5kcml2ZXItPmJ1cy0+YWdwX2luaXQoZGV2KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewogCQlyZXQgPSBkcm1fZ2V0X21pbm9yKGRldiwgJmRldi0+Y29udHJvbCwgRFJNX01JTk9SX0NPTlRST0wpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnJfYWdwOworCQkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1JFTkRFUikgJiYgZHJtX3Jub2RlcykgewpAQCAtNTU3LDggKzU1Nyw2IEBACiAJCQlnb3RvIGVycl91bmxvYWQ7CiAJfQogCi0JbGlzdF9hZGRfdGFpbCgmZGV2LT5kcml2ZXJfaXRlbSwgJmRldi0+ZHJpdmVyLT5kZXZpY2VfbGlzdCk7Ci0KIAlyZXQgPSAwOwogCWdvdG8gb3V0X3VubG9jazsKIApAQCAtNTcxLDkgKzU2OSw2IEBACiAJZHJtX3VucGx1Z19taW5vcihkZXYtPnJlbmRlcik7CiBlcnJfY29udHJvbF9ub2RlOgogCWRybV91bnBsdWdfbWlub3IoZGV2LT5jb250cm9sKTsKLWVycl9hZ3A6Ci0JaWYgKGRldi0+ZHJpdmVyLT5idXMtPmFncF9kZXN0cm95KQotCQlkZXYtPmRyaXZlci0+YnVzLT5hZ3BfZGVzdHJveShkZXYpOwogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmRybV9nbG9iYWxfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC01OTcsOCArNTkyLDggQEAKIAlpZiAoZGV2LT5kcml2ZXItPnVubG9hZCkKIAkJZGV2LT5kcml2ZXItPnVubG9hZChkZXYpOwogCi0JaWYgKGRldi0+ZHJpdmVyLT5idXMtPmFncF9kZXN0cm95KQotCQlkZXYtPmRyaXZlci0+YnVzLT5hZ3BfZGVzdHJveShkZXYpOworCWlmIChkZXYtPmFncCkKKwkJZHJtX3BjaV9hZ3BfZGVzdHJveShkZXYpOwogCiAJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CiAKQEAgLTYwOCw3ICs2MDMsNSBAQAogCWRybV91bnBsdWdfbWlub3IoZGV2LT5jb250cm9sKTsKIAlkcm1fdW5wbHVnX21pbm9yKGRldi0+cmVuZGVyKTsKIAlkcm1fdW5wbHVnX21pbm9yKGRldi0+cHJpbWFyeSk7Ci0KLQlsaXN0X2RlbCgmZGV2LT5kcml2ZXJfaXRlbSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9kZXZfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3VzYi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYwppbmRleCBiMTc5YjcwLi4wZjhjYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3VzYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdXNiLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC02Myw3ICs2NCw2IEBACiAJaW50IHJlczsKIAlEUk1fREVCVUcoIlxuIik7CiAKLQlJTklUX0xJU1RfSEVBRCgmZHJpdmVyLT5kZXZpY2VfbGlzdCk7CiAJZHJpdmVyLT5rZHJpdmVyLnVzYiA9IHVkcml2ZXI7CiAJZHJpdmVyLT5idXMgPSAmZHJtX3VzYl9idXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwppbmRleCA5M2U5NWQ3Li4yNGUwNDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkvKgogCSAqIEZpbmQgdGhlIHJpZ2h0IG1hcAogCSAqLwotCWlmICghZHJtX2NvcmVfaGFzX0FHUChkZXYpKQorCWlmICghZGV2LT5hZ3ApCiAJCWdvdG8gdm1fZmF1bHRfZXJyb3I7CiAKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUpCkBAIC0yMjAsNyArMjIwLDYgQEAKIAogCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAogCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7Ci0JYXRvbWljX2RlYygmZGV2LT52bWFfY291bnQpOwogCiAJbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKQEAgLTI2Niw5ICsyNjUsNiBAQAogCQkJCWRtYWguc2l6ZSA9IG1hcC0+c2l6ZTsKIAkJCQlfX2RybV9wY2lfZnJlZShkZXYsICZkbWFoKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgX0RSTV9HRU06Ci0JCQkJRFJNX0VSUk9SKCJ0cmllZCB0byBybW1hcCBHRU0gb2JqZWN0XG4iKTsKLQkJCQlicmVhazsKIAkJCX0KIAkJCWtmcmVlKG1hcCk7CiAJCX0KQEAgLTQwOCw3ICs0MDQsNiBAQAogCiAJRFJNX0RFQlVHKCIweCUwOGx4LDB4JTA4bHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKLQlhdG9taWNfaW5jKCZkZXYtPnZtYV9jb3VudCk7CiAKIAl2bWFfZW50cnkgPSBrbWFsbG9jKHNpemVvZigqdm1hX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHZtYV9lbnRyeSkgewpAQCAtNDM2LDcgKzQzMSw2IEBACiAKIAlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKIAkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwotCWF0b21pY19kZWMoJmRldi0+dm1hX2NvdW50KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgdGVtcCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgewogCQlpZiAocHQtPnZtYSA9PSB2bWEpIHsKQEAgLTU5NSw3ICs1ODksNyBAQAogCXN3aXRjaCAobWFwLT50eXBlKSB7CiAjaWYgIWRlZmluZWQoX19hcm1fXykKIAljYXNlIF9EUk1fQUdQOgotCQlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwLT5jYW50X3VzZV9hcGVydHVyZSkgeworCQlpZiAoZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlKSB7CiAJCQkvKgogCQkJICogT24gc29tZSBwbGF0Zm9ybXMgd2UgY2FuJ3QgdGFsayB0byBidXMgZG1hIGFkZHJlc3MgZnJvbSB0aGUgQ1BVLCBzbyBmb3IKIAkJCSAqIG1lbW9yeSBvZiB0eXBlIERSTV9BR1AsIHdlJ2xsIGRlYWwgd2l0aCBzb3J0aW5nIG91dCB0aGUgcmVhbCBwaHlzaWNhbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCmluZGV4IDIyYjhmNWUuLjlkMDk2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2Fub25faW5vZGVzLmg+CisKICNpbmNsdWRlIDxkcm0vZXh5bm9zX2RybS5oPgogCiAjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKQEAgLTExOSw2ICsxMjEsOCBAQAogCiAJZHJtX3ZibGFua19vZmZkZWxheSA9IFZCTEFOS19PRkZfREVMQVk7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYtPnBsYXRmb3JtZGV2LCBkZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycl9kcm1fZGV2aWNlOgpAQCAtMTUwLDkgKzE1NCwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHlub3NfZHJtX2dlbV9mb3BzID0geworCS5tbWFwID0gZXh5bm9zX2RybV9nZW1fbW1hcF9idWZmZXIsCit9OworCiBzdGF0aWMgaW50IGV4eW5vc19kcm1fb3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9leHlub3NfZmlsZV9wcml2YXRlICpmaWxlX3ByaXY7CisJc3RydWN0IGZpbGUgKmFub25fZmlscDsKIAlpbnQgcmV0OwogCiAJZmlsZV9wcml2ID0ga3phbGxvYyhzaXplb2YoKmZpbGVfcHJpdiksIEdGUF9LRVJORUwpOwpAQCAtMTY3LDYgKzE3NiwxNiBAQAogCQlmaWxlLT5kcml2ZXJfcHJpdiA9IE5VTEw7CiAJfQogCisJYW5vbl9maWxwID0gYW5vbl9pbm9kZV9nZXRmaWxlKCJleHlub3NfZ2VtIiwgJmV4eW5vc19kcm1fZ2VtX2ZvcHMsCisJCQkJCU5VTEwsIDApOworCWlmIChJU19FUlIoYW5vbl9maWxwKSkgeworCQlrZnJlZShmaWxlX3ByaXYpOworCQlyZXR1cm4gUFRSX0VSUihhbm9uX2ZpbHApOworCX0KKworCWFub25fZmlscC0+Zl9tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWZpbGVfcHJpdi0+YW5vbl9maWxwID0gYW5vbl9maWxwOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTc5LDYgKzE5OCw3IEBACiBzdGF0aWMgdm9pZCBleHlub3NfZHJtX3Bvc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9leHlub3NfZmlsZV9wcml2YXRlICpmaWxlX3ByaXY7CiAJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqdiwgKnZ0OwogCXN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCAqZSwgKmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMDQsNiArMjI0LDkgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAKKwlmaWxlX3ByaXYgPSBmaWxlLT5kcml2ZXJfcHJpdjsKKwlpZiAoZmlsZV9wcml2LT5hbm9uX2ZpbHApCisJCWZwdXQoZmlsZV9wcml2LT5hbm9uX2ZpbHApOwogCiAJa2ZyZWUoZmlsZS0+ZHJpdmVyX3ByaXYpOwogCWZpbGUtPmRyaXZlcl9wcml2ID0gTlVMTDsKQEAgLTMwNSw3ICszMjgsNyBAQAogCiBzdGF0aWMgaW50IGV4eW5vc19kcm1fcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JZHJtX3BsYXRmb3JtX2V4aXQoJmV4eW5vc19kcm1fZHJpdmVyLCBwZGV2KTsKKwlkcm1fcHV0X2RldihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuaAppbmRleCBlYWExOTY2Li4wZWFmNWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5oCkBAIC0yMjYsNiArMjI2LDcgQEAKIHN0cnVjdCBkcm1fZXh5bm9zX2ZpbGVfcHJpdmF0ZSB7CiAJc3RydWN0IGV4eW5vc19kcm1fZzJkX3ByaXZhdGUJKmcyZF9wcml2OwogCXN0cnVjdCBleHlub3NfZHJtX2lwcF9wcml2YXRlCSppcHBfcHJpdjsKKwlzdHJ1Y3QgZmlsZQkJCSphbm9uX2ZpbHA7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1kLmMKaW5kZXggYTYxODc4Yi4uYTIwNDQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkgKi8KIAlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChjdHgtPndhaXRfdnN5bmNfcXVldWUsCiAJCQkJIWF0b21pY19yZWFkKCZjdHgtPndhaXRfdnN5bmNfZXZlbnQpLAotCQkJCURSTV9IWi8yMCkpCisJCQkJSFovMjApKQogCQlEUk1fREVCVUdfS01TKCJ2Ymxhbmsgd2FpdCB0aW1lZCBvdXQuXG4iKTsKIH0KIApAQCAtNzA2LDcgKzcwNiw3IEBACiAJLyogc2V0IHdhaXQgdnN5bmMgZXZlbnQgdG8gemVybyBhbmQgd2FrZSB1cCBxdWV1ZS4gKi8KIAlpZiAoYXRvbWljX3JlYWQoJmN0eC0+d2FpdF92c3luY19ldmVudCkpIHsKIAkJYXRvbWljX3NldCgmY3R4LT53YWl0X3ZzeW5jX2V2ZW50LCAwKTsKLQkJRFJNX1dBS0VVUCgmY3R4LT53YWl0X3ZzeW5jX3F1ZXVlKTsKKwkJd2FrZV91cCgmY3R4LT53YWl0X3ZzeW5jX3F1ZXVlKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTU0LDcgKzk1NCw3IEBACiAJfQogCiAJY3R4LT5kcml2ZXJfZGF0YSA9IGRybV9maW1kX2dldF9kcml2ZXJfZGF0YShwZGV2KTsKLQlEUk1fSU5JVF9XQUlUUVVFVUUoJmN0eC0+d2FpdF92c3luY19xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT53YWl0X3ZzeW5jX3F1ZXVlKTsKIAlhdG9taWNfc2V0KCZjdHgtPndhaXRfdnN5bmNfZXZlbnQsIDApOwogCiAJc3ViZHJ2ID0gJmN0eC0+c3ViZHJ2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5jCmluZGV4IGJlNTlkNTAuLjQyZDI5MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmMKQEAgLTMzOCw0NiArMzM4LDIyIEBACiAJCQkmYXJncy0+b2Zmc2V0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBkcm1fZmlsZSAqZXh5bm9zX2RybV9maW5kX2RybV9maWxlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LAotCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2OwotCi0JLyogZmluZCBjdXJyZW50IHByb2Nlc3MncyBkcm1fZmlsZSBmcm9tIGZpbGVsaXN0LiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsZV9wcml2LCAmZHJtX2Rldi0+ZmlsZWxpc3QsIGxoZWFkKQotCQlpZiAoZmlsZV9wcml2LT5maWxwID09IGZpbHApCi0JCQlyZXR1cm4gZmlsZV9wcml2OwotCi0JV0FSTl9PTigxKTsKLQotCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fZ2VtX21tYXBfYnVmZmVyKHN0cnVjdCBmaWxlICpmaWxwLAoraW50IGV4eW5vc19kcm1fZ2VtX21tYXBfYnVmZmVyKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmoob2JqKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IG9iai0+ZGV2OwogCXN0cnVjdCBleHlub3NfZHJtX2dlbV9idWYgKmJ1ZmZlcjsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHZtX3NpemU7CiAJaW50IHJldDsKIAorCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmb2JqLT5kZXYtPnN0cnVjdF9tdXRleCkpOworCiAJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX0RPTlRFWFBBTkQgfCBWTV9ET05URFVNUDsKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IG9iajsKIAl2bWEtPnZtX29wcyA9IGRybV9kZXYtPmRyaXZlci0+Z2VtX3ZtX29wczsKIAotCS8qIHJlc3RvcmUgaXQgdG8gZHJpdmVyJ3MgZm9wcy4gKi8KLQlmaWxwLT5mX29wID0gZm9wc19nZXQoZHJtX2Rldi0+ZHJpdmVyLT5mb3BzKTsKLQotCWZpbGVfcHJpdiA9IGV4eW5vc19kcm1fZmluZF9kcm1fZmlsZShkcm1fZGV2LCBmaWxwKTsKLQlpZiAoSVNfRVJSKGZpbGVfcHJpdikpCi0JCXJldHVybiBQVFJfRVJSKGZpbGVfcHJpdik7Ci0KLQkvKiByZXN0b3JlIGl0IHRvIGRybV9maWxlLiAqLwotCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZpbGVfcHJpdjsKLQogCXVwZGF0ZV92bV9jYWNoZV9hdHRyKGV4eW5vc19nZW1fb2JqLCB2bWEpOwogCiAJdm1fc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKQEAgLTQxMSwxNSArMzg3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4eW5vc19kcm1fZ2VtX2ZvcHMgPSB7Ci0JLm1tYXAgPSBleHlub3NfZHJtX2dlbV9tbWFwX2J1ZmZlciwKLX07Ci0KIGludCBleHlub3NfZHJtX2dlbV9tbWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19maWxlX3ByaXZhdGUgKmV4eW5vc19maWxlX3ByaXY7CiAJc3RydWN0IGRybV9leHlub3NfZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBmaWxlICphbm9uX2ZpbHA7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCiAJaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKSB7CkBAIC00MjcsNDcgKzQwMSwyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKIAlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CiAJaWYgKCFvYmopIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbG9va3VwIGdlbSBvYmplY3QuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qCi0JICogV2UgaGF2ZSB0byB1c2UgZ2VtIG9iamVjdCBhbmQgaXRzIGZvcHMgZm9yIHNwZWNpZmljIG1tYXBlciwKLQkgKiBidXQgdm1fbW1hcCgpIGNhbiBkZWxpdmVyIG9ubHkgZmlscC4gU28gd2UgaGF2ZSB0byBjaGFuZ2UKLQkgKiBmaWxwLT5mX29wIGFuZCBmaWxwLT5wcml2YXRlX2RhdGEgdGVtcG9yYXJpbHksIHRoZW4gcmVzdG9yZQotCSAqIGFnYWluLiBTbyBpdCBpcyBpbXBvcnRhbnQgdG8ga2VlcCBsb2NrIHVudGlsIHJlc3RvcmF0aW9uIHRoZQotCSAqIHNldHRpbmdzIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gbWlzdXNlIG9mIGZpbHAtPmZfb3Agb3IKLQkgKiBmaWxwLT5wcml2YXRlX2RhdGEuCi0JICovCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWV4eW5vc19maWxlX3ByaXYgPSBmaWxlX3ByaXYtPmRyaXZlcl9wcml2OworCWFub25fZmlscCA9IGV4eW5vc19maWxlX3ByaXYtPmFub25fZmlscDsKKwlhbm9uX2ZpbHAtPnByaXZhdGVfZGF0YSA9IG9iajsKIAotCS8qCi0JICogU2V0IHNwZWNpZmljIG1tcGVyJ3MgZm9wcy4gQW5kIGl0IHdpbGwgYmUgcmVzdG9yZWQgYnkKLQkgKiBleHlub3NfZHJtX2dlbV9tbWFwX2J1ZmZlciB0byBkZXYtPmRyaXZlci0+Zm9wcy4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gY2FsbCBzcGVjaWZpYyBtYXBwZXIgdGVtcG9yYXJpbHkuCi0JICovCi0JZmlsZV9wcml2LT5maWxwLT5mX29wID0gJmV4eW5vc19kcm1fZ2VtX2ZvcHM7Ci0KLQkvKgotCSAqIFNldCBnZW0gb2JqZWN0IHRvIHByaXZhdGVfZGF0YSBzbyB0aGF0IHNwZWNpZmljIG1tYXBlcgotCSAqIGNhbiBnZXQgdGhlIGdlbSBvYmplY3QuIEFuZCBpdCB3aWxsIGJlIHJlc3RvcmVkIGJ5Ci0JICogZXh5bm9zX2RybV9nZW1fbW1hcF9idWZmZXIgdG8gZHJtX2ZpbGUuCi0JICovCi0JZmlsZV9wcml2LT5maWxwLT5wcml2YXRlX2RhdGEgPSBvYmo7Ci0KLQlhZGRyID0gdm1fbW1hcChmaWxlX3ByaXYtPmZpbHAsIDAsIGFyZ3MtPnNpemUsCi0JCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCAwKTsKKwlhZGRyID0gdm1fbW1hcChhbm9uX2ZpbHAsIDAsIGFyZ3MtPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQlNQVBfU0hBUkVELCAwKTsKIAogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CiAKIAlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKSB7Ci0JCS8qIGNoZWNrIGZpbHAtPmZfb3AsIGZpbHAtPnByaXZhdGVfZGF0YSBhcmUgcmVzdG9yZWQgKi8KLQkJaWYgKGZpbGVfcHJpdi0+ZmlscC0+Zl9vcCA9PSAmZXh5bm9zX2RybV9nZW1fZm9wcykgewotCQkJZmlsZV9wcml2LT5maWxwLT5mX29wID0gZm9wc19nZXQoZGV2LT5kcml2ZXItPmZvcHMpOwotCQkJZmlsZV9wcml2LT5maWxwLT5wcml2YXRlX2RhdGEgPSBmaWxlX3ByaXY7Ci0JCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAoaW50KWFkZHI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5oCmluZGV4IGI4YzgxOGIuLjE1OTJjMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmgKQEAgLTEyMiw2ICsxMjIsOSBAQAogaW50IGV4eW5vc19kcm1fZ2VtX21tYXBfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIAoraW50IGV4eW5vc19kcm1fZ2VtX21tYXBfYnVmZmVyKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwogLyogbWFwIHVzZXIgc3BhY2UgYWxsb2NhdGVkIGJ5IG1hbGxvYyB0byBwYWdlcy4gKi8KIGludCBleHlub3NfZHJtX2dlbV91c2VycHRyX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfbWl4ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX21peGVyLmMKaW5kZXggNjNiYzVmOS4uMmRmYTQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfbWl4ZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19taXhlci5jCkBAIC04NjgsNyArODY4LDcgQEAKIAkgKi8KIAlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChtaXhlcl9jdHgtPndhaXRfdnN5bmNfcXVldWUsCiAJCQkJIWF0b21pY19yZWFkKCZtaXhlcl9jdHgtPndhaXRfdnN5bmNfZXZlbnQpLAotCQkJCURSTV9IWi8yMCkpCisJCQkJSFovMjApKQogCQlEUk1fREVCVUdfS01TKCJ2Ymxhbmsgd2FpdCB0aW1lZCBvdXQuXG4iKTsKIH0KIApAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJLyogc2V0IHdhaXQgdnN5bmMgZXZlbnQgdG8gemVybyBhbmQgd2FrZSB1cCBxdWV1ZS4gKi8KIAkJaWYgKGF0b21pY19yZWFkKCZjdHgtPndhaXRfdnN5bmNfZXZlbnQpKSB7CiAJCQlhdG9taWNfc2V0KCZjdHgtPndhaXRfdnN5bmNfZXZlbnQsIDApOwotCQkJRFJNX1dBS0VVUCgmY3R4LT53YWl0X3ZzeW5jX3F1ZXVlKTsKKwkJCXdha2VfdXAoJmN0eC0+d2FpdF92c3luY19xdWV1ZSk7CiAJCX0KIAl9CiAKQEAgLTEyMDksNyArMTIwOSw3IEBACiAJZHJtX2hkbWlfY3R4LT5jdHggPSAodm9pZCAqKWN0eDsKIAljdHgtPnZwX2VuYWJsZWQgPSBkcnYtPmlzX3ZwX2VuYWJsZWQ7CiAJY3R4LT5teHJfdmVyID0gZHJ2LT52ZXJzaW9uOwotCURSTV9JTklUX1dBSVRRVUVVRSgmY3R4LT53YWl0X3ZzeW5jX3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndhaXRfdnN5bmNfcXVldWUpOwogCWF0b21pY19zZXQoJmN0eC0+d2FpdF92c3luY19ldmVudCwgMCk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkcm1faGRtaV9jdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9hY2NlbF8yZC5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9hY2NlbF8yZC5jCmluZGV4IGQ1ZWYxYTUuLmRlNmY2MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvYWNjZWxfMmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2FjY2VsXzJkLmMKQEAgLTMyNiw3ICszMjYsNyBAQAogCXN0cnVjdCBwc2JfZnJhbWVidWZmZXIgKnBzYmZiID0gJmZiZGV2LT5wZmI7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBzYmZiLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyBfZW5kID0gamlmZmllcyArIERSTV9IWjsKKwl1bnNpZ25lZCBsb25nIF9lbmQgPSBqaWZmaWVzICsgSFo7CiAJaW50IGJ1c3kgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9kcC5jCmluZGV4IGY4OGExODEuLjA0OTBjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50ZWxfZHAuYwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAKIAlpZiAoc2VuZF9ieXRlcyA+IDE2KQogCQlyZXR1cm4gLTE7Ci0JbXNnWzBdID0gQVVYX05BVElWRV9XUklURSA8PCA0OworCW1zZ1swXSA9IERQX0FVWF9OQVRJVkVfV1JJVEUgPDwgNDsKIAltc2dbMV0gPSBhZGRyZXNzID4+IDg7CiAJbXNnWzJdID0gYWRkcmVzcyAmIDB4ZmY7CiAJbXNnWzNdID0gc2VuZF9ieXRlcyAtIDE7CkBAIC00OTMsOSArNDkzLDEwIEBACiAJCXJldCA9IGNkdl9pbnRlbF9kcF9hdXhfY2goZW5jb2RlciwgbXNnLCBtc2dfYnl0ZXMsICZhY2ssIDEpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0FDSykKKwkJYWNrID4+PSA0OworCQlpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9BQ0spCiAJCQlicmVhazsKLQkJZWxzZSBpZiAoKGFjayAmIEFVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gQVVYX05BVElWRV9SRVBMWV9ERUZFUikKKwkJZWxzZSBpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9ERUZFUikKIAkJCXVkZWxheSgxMDApOwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTUyMyw3ICs1MjQsNyBAQAogCXVpbnQ4X3QgYWNrOwogCWludCByZXQ7CiAKLQltc2dbMF0gPSBBVVhfTkFUSVZFX1JFQUQgPDwgNDsKKwltc2dbMF0gPSBEUF9BVVhfTkFUSVZFX1JFQUQgPDwgNDsKIAltc2dbMV0gPSBhZGRyZXNzID4+IDg7CiAJbXNnWzJdID0gYWRkcmVzcyAmIDB4ZmY7CiAJbXNnWzNdID0gcmVjdl9ieXRlcyAtIDE7CkBAIC01MzgsMTIgKzUzOSwxMiBAQAogCQkJcmV0dXJuIC1FUFJPVE87CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJYWNrID0gcmVwbHlbMF07Ci0JCWlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0FDSykgeworCQlhY2sgPSByZXBseVswXSA+PiA0OworCQlpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9BQ0spIHsKIAkJCW1lbWNweShyZWN2LCByZXBseSArIDEsIHJldCAtIDEpOwogCQkJcmV0dXJuIHJldCAtIDE7CiAJCX0KLQkJZWxzZSBpZiAoKGFjayAmIEFVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gQVVYX05BVElWRV9SRVBMWV9ERUZFUikKKwkJZWxzZSBpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9ERUZFUikKIAkJCXVkZWxheSgxMDApOwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTU2OSwxMiArNTcwLDEyIEBACiAKIAkvKiBTZXQgdXAgdGhlIGNvbW1hbmQgYnl0ZSAqLwogCWlmIChtb2RlICYgTU9ERV9JMkNfUkVBRCkKLQkJbXNnWzBdID0gQVVYX0kyQ19SRUFEIDw8IDQ7CisJCW1zZ1swXSA9IERQX0FVWF9JMkNfUkVBRCA8PCA0OwogCWVsc2UKLQkJbXNnWzBdID0gQVVYX0kyQ19XUklURSA8PCA0OworCQltc2dbMF0gPSBEUF9BVVhfSTJDX1dSSVRFIDw8IDQ7CiAKIAlpZiAoIShtb2RlICYgTU9ERV9JMkNfU1RPUCkpCi0JCW1zZ1swXSB8PSBBVVhfSTJDX01PVCA8PCA0OworCQltc2dbMF0gfD0gRFBfQVVYX0kyQ19NT1QgPDwgNDsKIAogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKIAltc2dbMl0gPSBhZGRyZXNzOwpAQCAtNjA2LDE2ICs2MDcsMTYgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlzd2l0Y2ggKHJlcGx5WzBdICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSB7Ci0JCWNhc2UgQVVYX05BVElWRV9SRVBMWV9BQ0s6CisJCXN3aXRjaCAoKHJlcGx5WzBdID4+IDQpICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSB7CisJCWNhc2UgRFBfQVVYX05BVElWRV9SRVBMWV9BQ0s6CiAJCQkvKiBJMkMtb3Zlci1BVVggUmVwbHkgZmllbGQgaXMgb25seSB2YWxpZAogCQkJICogd2hlbiBwYWlyZWQgd2l0aCBBVVggQUNLLgogCQkJICovCiAJCQlicmVhazsKLQkJY2FzZSBBVVhfTkFUSVZFX1JFUExZX05BQ0s6CisJCWNhc2UgRFBfQVVYX05BVElWRV9SRVBMWV9OQUNLOgogCQkJRFJNX0RFQlVHX0tNUygiYXV4X2NoIG5hdGl2ZSBuYWNrXG4iKTsKIAkJCXJldHVybiAtRVJFTU9URUlPOwotCQljYXNlIEFVWF9OQVRJVkVfUkVQTFlfREVGRVI6CisJCWNhc2UgRFBfQVVYX05BVElWRV9SRVBMWV9ERUZFUjoKIAkJCXVkZWxheSgxMDApOwogCQkJY29udGludWU7CiAJCWRlZmF1bHQ6CkBAIC02MjQsMTYgKzYyNSwxNiBAQAogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJCX0KIAotCQlzd2l0Y2ggKHJlcGx5WzBdICYgQVVYX0kyQ19SRVBMWV9NQVNLKSB7Ci0JCWNhc2UgQVVYX0kyQ19SRVBMWV9BQ0s6CisJCXN3aXRjaCAoKHJlcGx5WzBdID4+IDQpICYgRFBfQVVYX0kyQ19SRVBMWV9NQVNLKSB7CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9BQ0s6CiAJCQlpZiAobW9kZSA9PSBNT0RFX0kyQ19SRUFEKSB7CiAJCQkJKnJlYWRfYnl0ZSA9IHJlcGx5WzFdOwogCQkJfQogCQkJcmV0dXJuIHJlcGx5X2J5dGVzIC0gMTsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX05BQ0s6CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9OQUNLOgogCQkJRFJNX0RFQlVHX0tNUygiYXV4X2kyYyBuYWNrXG4iKTsKIAkJCXJldHVybiAtRVJFTU9URUlPOwotCQljYXNlIEFVWF9JMkNfUkVQTFlfREVGRVI6CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9ERUZFUjoKIAkJCURSTV9ERUJVR19LTVMoImF1eF9pMmMgZGVmZXJcbiIpOwogCQkJdWRlbGF5KDEwMCk7CiAJCQlicmVhazsKQEAgLTY3Nyw3ICs2NzgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgY2R2X2ludGVsX2ZpeGVkX3BhbmVsX21vZGUoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpeGVkX21vZGUsCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxfZml4ZWRfcGFuZWxfbW9kZShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSwKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKIAlhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSA9IGZpeGVkX21vZGUtPmhkaXNwbGF5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9nbWFfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9nbWFfZGlzcGxheS5jCmluZGV4IDI0ZThhZjMuLjM4NmRlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZ21hX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2dtYV9kaXNwbGF5LmMKQEAgLTM0OSw2ICszNDksNyBAQAogCS8qIElmIHdlIGRpZG4ndCBnZXQgYSBoYW5kbGUgdGhlbiB0dXJuIHRoZSBjdXJzb3Igb2ZmICovCiAJaWYgKCFoYW5kbGUpIHsKIAkJdGVtcCA9IENVUlNPUl9NT0RFX0RJU0FCTEU7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCQlpZiAoZ21hX3Bvd2VyX2JlZ2luKGRldiwgZmFsc2UpKSB7CiAJCQlSRUdfV1JJVEUoY29udHJvbCwgdGVtcCk7CkBAIC0zNjUsNiArMzY2LDcgQEAKIAkJCWdtYV9jcnRjLT5jdXJzb3Jfb2JqID0gTlVMTDsKIAkJfQogCisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM3NCw5ICszNzYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgaGFuZGxlKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byB1bmxvY2s7CisJfQogCiAJaWYgKG9iai0+c2l6ZSA8IHdpZHRoICogaGVpZ2h0ICogNCkgewogCQlkZXZfZGJnKGRldi0+ZGV2LCAiQnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CkBAIC00NDAsMTAgKzQ0NSwxMyBAQAogCX0KIAogCWdtYV9jcnRjLT5jdXJzb3Jfb2JqID0gb2JqOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CiAKIHVucmVmX2N1cnNvcjoKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvcHNiX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfZHJ2LmgKaW5kZXggYjU5ZTY1OC4uNWFkNmEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfZHJ2LmgKQEAgLTIxMiw4ICsyMTIsOCBAQAogI2RlZmluZSBQU0JfSElHSF9SRUdfT0ZGUyAweDA2MDAKIAogI2RlZmluZSBQU0JfTlVNX1ZCTEFOS1MgMgotI2RlZmluZSBQU0JfV0FUQ0hET0dfREVMQVkgKERSTV9IWiAqIDIpCi0jZGVmaW5lIFBTQl9MSURfREVMQVkgKERSTV9IWiAvIDEwKQorI2RlZmluZSBQU0JfV0FUQ0hET0dfREVMQVkgKEhaICogMikKKyNkZWZpbmUgUFNCX0xJRF9ERUxBWSAoSFogLyAxMCkKIAogI2RlZmluZSBNREZMRF9QTldfQjAgMHgwNAogI2RlZmluZSBNREZMRF9QTldfQzAgMHgwOApAQCAtMjMyLDcgKzIzMiw3IEBACiAjZGVmaW5lIE1ERkxEX0RTUl9SUgkJNDUKICNkZWZpbmUgTURGTERfRFBVX0VOQUJMRSAJKDEgPDwgMzEpCiAjZGVmaW5lIE1ERkxEX0RTUl9GVUxMU0NSRUVOIAkoMSA8PCAzMCkKLSNkZWZpbmUgTURGTERfRFNSX0RFTEFZCQkoRFJNX0haIC8gTURGTERfRFNSX1JSKQorI2RlZmluZSBNREZMRF9EU1JfREVMQVkJCShIWiAvIE1ERkxEX0RTUl9SUikKIAogI2RlZmluZSBQU0JfUFdSX1NUQVRFX09OCQkxCiAjZGVmaW5lIFBTQl9QV1JfU1RBVEVfT0ZGCQkyCkBAIC03NjksNyArNzY5LDcgQEAKICAqcHNiX2lycS5jCiAgKi8KIAotZXh0ZXJuIGlycXJldHVybl90IHBzYl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIGlycXJldHVybl90IHBzYl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpOwogZXh0ZXJuIGludCBwc2JfaXJxX2VuYWJsZV9kcHN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBwc2JfaXJxX2Rpc2FibGVfZHBzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBzYl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvcHNiX2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfaW50ZWxfZHJ2LmgKaW5kZXggYmRlMjdmZC4uZGMyYzhlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfaW50ZWxfZHJ2LmgKQEAgLTI1MCwxMSArMjUwLDYgQEAKIGV4dGVybiBpbnQgaW50ZWxmYl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaW50ZWxmYl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpOwotZXh0ZXJuIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKnBzYl9pbnRlbF9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UKLQkJCQkJCQkqZGV2LCBzdHJ1Y3QKLQkJCQkJCQlkcm1fbW9kZV9mYl9jbWQKLQkJCQkJCQkqbW9kZV9jbWQsCi0JCQkJCQkJdm9pZCAqbW1fcHJpdmF0ZSk7CiBleHRlcm4gYm9vbCBwc2JfaW50ZWxfbHZkc19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvcHNiX2lycS5jCmluZGV4IGJhNDgzMDMuLmY4ODNmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvcHNiX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvcHNiX2lycS5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkJbWlkX3BpcGVfZXZlbnRfaGFuZGxlcihkZXYsIDEpOwogfQogCi1pcnFyZXR1cm5fdCBwc2JfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQoraXJxcmV0dXJuX3QgcHNiX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXJnOwogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJUFNCX1dWREMzMih2ZGNfc3RhdCwgUFNCX0lOVF9JREVOVElUWV9SKTsKIAkodm9pZCkgUFNCX1JWREMzMihQU0JfSU5UX0lERU5USVRZX1IpOwotCURSTV9SRUFETUVNT1JZQkFSUklFUigpOworCXJtYigpOwogCiAJaWYgKCFoYW5kbGVkKQogCQlyZXR1cm4gSVJRX05PTkU7CkBAIC00NTAsMjEgKzQ1MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBQU0JfRklYTUUKLXN0YXRpYyBpbnQgcHNiX3ZibGFua19kb193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlLCBhdG9taWNfdCAqY291bnRlcikKLXsKLQl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKLQlpbnQgcmV0ID0gMDsKLQlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsYW5rLnF1ZXVlLCAzICogRFJNX0haLAotCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKGNvdW50ZXIpKQotCQkgICAgICAtICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7Ci0JKnNlcXVlbmNlID0gY3VyX3ZibGFuazsKLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQogLyoKICAqIEl0IGlzIHVzZWQgdG8gZW5hYmxlIFZCTEFOSyBpbnRlcnJ1cHQKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfaXJxLmggYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9pcnEuaAppbmRleCBkZWJiN2YxLi5kMGI0NWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9pcnEuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9pcnEuaApAQCAtMzIsNyArMzIsNyBAQAogdm9pZCBwc2JfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgIHBzYl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIHBzYl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaXJxcmV0dXJuX3QgcHNiX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitpcnFyZXR1cm5fdCBwc2JfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKTsKIAogaW50IHBzYl9pcnFfZW5hYmxlX2Rwc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgcHNiX2lycV9kaXNhYmxlX2Rwc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kbWEuYwppbmRleCAyNDlmZGZmLi5hZWFjZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZG1hLmMKQEAgLTExOTMsNiArMTE5MywxMCBAQAogCiBpbnQgaTgxMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogeworCS8qIE91ciB1c2Vyc3BhY2UgZGVwZW5kcyB1cG9uIHRoZSBhZ3AgbWFwcGluZyBzdXBwb3J0LiAqLworCWlmICghZGV2LT5hZ3ApCisJCXJldHVybiAtRUlOVkFMOworCiAJcGNpX3NldF9tYXN0ZXIoZGV2LT5wZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmMKaW5kZXggZDgxODBkMi4uNDQxY2NmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jCkBAIC01Nyw3ICs1Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9Ci0JICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwKKwkgICAgRFJJVkVSX1VTRV9BR1AgfAogCSAgICBEUklWRVJfSEFWRV9ETUEsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX2k4MTBfYnVmX3ByaXZfdCksCiAJLmxvYWQgPSBpODEwX2RyaXZlcl9sb2FkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L0tjb25maWcKaW5kZXggNjE5OWQwYi4uNzNlZDU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnCkBAIC0xLDggKzEsMTAgQEAKIGNvbmZpZyBEUk1fSTkxNQogCXRyaXN0YXRlICJJbnRlbCA4eHgvOXh4L0czeC9HNHgvSEQgR3JhcGhpY3MiCiAJZGVwZW5kcyBvbiBEUk0KLQlkZXBlbmRzIG9uIEFHUAotCWRlcGVuZHMgb24gQUdQX0lOVEVMCisJZGVwZW5kcyBvbiBYODYgJiYgUENJCisJZGVwZW5kcyBvbiAoQUdQIHx8IEFHUD1uKQorCXNlbGVjdCBJTlRFTF9HVFQKKwlzZWxlY3QgQUdQX0lOVEVMIGlmIEFHUAogCSMgd2UgbmVlZCBzaG1mcyBmb3IgdGhlIHN3YXBwYWJsZSBiYWNraW5nIHN0b3JlLCBhbmQgaW4gcGFydGljdWxhcgogCSMgdGhlIHNobWVtX3JlYWRwYWdlKCkgd2hpY2ggZGVwZW5kcyB1cG9uIHRtcGZzCiAJc2VsZWN0IFNITUVNCkBAIC0zNSwxNSArMzcsMTQgQEAKIGNvbmZpZyBEUk1fSTkxNV9LTVMKIAlib29sICJFbmFibGUgbW9kZXNldHRpbmcgb24gaW50ZWwgYnkgZGVmYXVsdCIKIAlkZXBlbmRzIG9uIERSTV9JOTE1CisJZGVmYXVsdCB5CiAJaGVscAotCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGtlcm5lbCBtb2Rlc2V0dGluZyBlbmFibGVkIGJ5IGRlZmF1bHQsCi0JICBhbmQgeW91IGhhdmUgYSBuZXcgZW5vdWdoIHVzZXJzcGFjZSB0byBzdXBwb3J0IHRoaXMuIFJ1bm5pbmcgb2xkCi0JICB1c2Vyc3BhY2VzIHdpdGggdGhpcyBlbmFibGVkIHdpbGwgY2F1c2UgcGFpbi4gIE5vdGUgdGhhdCB0aGlzIGNhdXNlcwotCSAgdGhlIGRyaXZlciB0byBiaW5kIHRvIFBDSSBkZXZpY2VzLCB3aGljaCBwcmVjbHVkZXMgbG9hZGluZyB0aGluZ3MKLQkgIGxpa2UgaW50ZWxmYi4KKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBrZXJuZWwgbW9kZXNldHRpbmcgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiBpbiBkb3VidCwgc2F5ICJZIi4KIAogY29uZmlnIERSTV9JOTE1X0ZCREVWCi0JYm9vbCAiRW5hYmxlIGxlZ2FjeSBmYmRldiBzdXBwb3J0IGZvciB0aGUgbW9kZXNldHR0aW5nIGludGVsIGRyaXZlciIKKwlib29sICJFbmFibGUgbGVnYWN5IGZiZGV2IHN1cHBvcnQgZm9yIHRoZSBtb2Rlc2V0dGluZyBpbnRlbCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBEUk1fSTkxNQogCXNlbGVjdCBEUk1fS01TX0ZCX0hFTFBFUgogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKQEAgLTU1LDkgKzU2LDEyIEBACiAJICBzdXBwb3J0LiBOb3RlIHRoYXQgdGhpcyBzdXBwb3J0IGFsc28gcHJvdmlkZSB0aGUgbGludXggY29uc29sZQogCSAgc3VwcG9ydCBvbiB0b3Agb2YgdGhlIGludGVsIG1vZGVzZXR0aW5nIGRyaXZlci4KIAorCSAgSWYgaW4gZG91YnQsIHNheSAiWSIuCisKIGNvbmZpZyBEUk1fSTkxNV9QUkVMSU1JTkFSWV9IV19TVVBQT1JUCiAJYm9vbCAiRW5hYmxlIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHByZXJlbGVhc2UgSW50ZWwgaGFyZHdhcmUgYnkgZGVmYXVsdCIKIAlkZXBlbmRzIG9uIERSTV9JOTE1CisJZGVmYXVsdCBuCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIHByZXJlbGVhc2UgSW50ZWwgaGFyZHdhcmUgYW5kIHdhbnQgdGhlCiAJICBpOTE1IGRyaXZlciB0byBzdXBwb3J0IGl0IGJ5IGRlZmF1bHQuICBZb3UgY2FuIGVuYWJsZSBzdWNoIHN1cHBvcnQgYXQKQEAgLTY1LDMgKzY5LDE1IEBACiAJICBvcHRpb24gY2hhbmdlcyB0aGUgZGVmYXVsdCBmb3IgdGhhdCBtb2R1bGUgb3B0aW9uLgogCiAJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KKworY29uZmlnIERSTV9JOTE1X1VNUworCWJvb2wgIkVuYWJsZSB1c2Vyc3BhY2UgbW9kZXNldHRpbmcgb24gSW50ZWwgaGFyZHdhcmUgKERFUFJFQ0FURUQpIgorCWRlcGVuZHMgb24gRFJNX0k5MTUKKwlkZWZhdWx0IG4KKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHN0aWxsIG5lZWQgdXNlcnNwYWNlIG1vZGVzZXR0aW5nLgorCisJICBVc2Vyc3BhY2UgbW9kZXNldHRpbmcgaXMgZGVwcmVjYXRlZCBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdywgc28KKwkgIGVuYWJsZSB0aGlzIG9ubHkgaWYgeW91IGhhdmUgYW5jaWVudCB2ZXJzaW9ucyBvZiB0aGUgRERYIGRyaXZlcnMuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCBkNGFlNDhiLi45ZmQ0NGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNCw3ICs0LDYgQEAKIAogY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KIGk5MTUteSA6PSBpOTE1X2Rydi5vIGk5MTVfZG1hLm8gaTkxNV9pcnEubyBcCi0JICBpOTE1X2RlYnVnZnMubyBcCiAJICBpOTE1X2dwdV9lcnJvci5vIFwKICAgICAgICAgICBpOTE1X3N1c3BlbmQubyBcCiAJICBpOTE1X2dlbS5vIFwKQEAgLTU0LDYgKzUzLDggQEAKIAogaTkxNS0kKENPTkZJR19EUk1fSTkxNV9GQkRFVikgKz0gaW50ZWxfZmJkZXYubwogCitpOTE1LSQoQ09ORklHX0RFQlVHX0ZTKSArPSBpOTE1X2RlYnVnZnMubworCiBvYmotJChDT05GSUdfRFJNX0k5MTUpICArPSBpOTE1Lm8KIAogQ0ZMQUdTX2k5MTVfdHJhY2VfcG9pbnRzLm8gOj0gLUkkKHNyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19uczI1MDEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19uczI1MDEuYwppbmRleCBjNGEyNTViLi45NTRhY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fbnMyNTAxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX25zMjUwMS5jCkBAIC04Nyw0OSArODcsNiBAQAogICogd2hlbiBzd2l0Y2hpbmcgdGhlIHJlc29sdXRpb24uCiAgKi8KIAotc3RhdGljIHZvaWQgZW5hYmxlX2R2byhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQotewotCXN0cnVjdCBuczI1MDFfcHJpdiAqbnMgPSAoc3RydWN0IG5zMjUwMV9wcml2ICopKGR2by0+ZGV2X3ByaXYpOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGR2by0+aTJjX2J1czsKLQlzdHJ1Y3QgaW50ZWxfZ21idXMgKmJ1cyA9IGNvbnRhaW5lcl9vZihhZGFwdGVyLAotCQkJCQkgICAgICAgc3RydWN0IGludGVsX2dtYnVzLAotCQkJCQkgICAgICAgYWRhcHRlcik7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gYnVzLT5kZXZfcHJpdjsKLQotCURSTV9ERUJVR19LTVMoIiVzOiBUcnlpbmcgdG8gcmUtZW5hYmxlIHRoZSBEVk9cbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlucy0+ZHZvYyA9IEk5MTVfUkVBRChEVk9fQyk7Ci0JbnMtPnBsbF9hID0gSTkxNV9SRUFEKF9EUExMX0EpOwotCW5zLT5zcmNkaW0gPSBJOTE1X1JFQUQoRFZPQ19TUkNESU0pOwotCW5zLT5md19ibGMgPSBJOTE1X1JFQUQoRldfQkxDKTsKLQotCUk5MTVfV1JJVEUoRFZPQywgMHgxMDAwNDA4NCk7Ci0JSTkxNV9XUklURShfRFBMTF9BLCAweGQwODIwMDAwKTsKLQlJOTE1X1dSSVRFKERWT0NfU1JDRElNLCAweDQwMDMwMCk7CS8vIDEwMjR4NzY4Ci0JSTkxNV9XUklURShGV19CTEMsIDB4MTA4MDMwNCk7Ci0KLQlJOTE1X1dSSVRFKERWT0MsIDB4OTAwMDQwODQpOwotfQotCi0vKgotICogUmVzdG9yZSB0aGUgSTkxNSByZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGFib3ZlCi0gKiB0cmlnZ2VyIGZ1bmN0aW9uLgotICovCi1zdGF0aWMgdm9pZCByZXN0b3JlX2R2byhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQotewotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGR2by0+aTJjX2J1czsKLQlzdHJ1Y3QgaW50ZWxfZ21idXMgKmJ1cyA9IGNvbnRhaW5lcl9vZihhZGFwdGVyLAotCQkJCQkgICAgICAgc3RydWN0IGludGVsX2dtYnVzLAotCQkJCQkgICAgICAgYWRhcHRlcik7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gYnVzLT5kZXZfcHJpdjsKLQlzdHJ1Y3QgbnMyNTAxX3ByaXYgKm5zID0gKHN0cnVjdCBuczI1MDFfcHJpdiAqKShkdm8tPmRldl9wcml2KTsKLQotCUk5MTVfV1JJVEUoRFZPQywgbnMtPmR2b2MpOwotCUk5MTVfV1JJVEUoX0RQTExfQSwgbnMtPnBsbF9hKTsKLQlJOTE1X1dSSVRFKERWT0NfU1JDRElNLCBucy0+c3JjZGltKTsKLQlJOTE1X1dSSVRFKEZXX0JMQywgbnMtPmZ3X2JsYyk7Ci19Ci0KIC8qCiAqKiBSZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgbnMyNTAxLgogKiogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KQEAgLTMwMCw3ICsyNTcsNyBAQAogCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewogCWJvb2wgb2s7Ci0JYm9vbCByZXN0b3JlID0gZmFsc2U7CisJaW50IHJldHJpZXMgPSAxMDsKIAlzdHJ1Y3QgbnMyNTAxX3ByaXYgKm5zID0gKHN0cnVjdCBuczI1MDFfcHJpdiAqKShkdm8tPmRldl9wcml2KTsKIAogCURSTV9ERUJVR19LTVMKQEAgLTQ3NiwyMCArNDMzLDcgQEAKIAkJCW5zLT5yZWdfOF9zaGFkb3cgfD0gTlMyNTAxXzhfQlBBUzsKIAkJfQogCQlvayAmPSBuczI1MDFfd3JpdGViKGR2bywgTlMyNTAxX1JFRzgsIG5zLT5yZWdfOF9zaGFkb3cpOwotCi0JCWlmICghb2spIHsKLQkJCWlmIChyZXN0b3JlKQotCQkJCXJlc3RvcmVfZHZvKGR2byk7Ci0JCQllbmFibGVfZHZvKGR2byk7Ci0JCQlyZXN0b3JlID0gdHJ1ZTsKLQkJfQotCX0gd2hpbGUgKCFvayk7Ci0JLyoKLQkgKiBSZXN0b3JlIHRoZSBvbGQgaTkxNSByZWdpc3RlcnMgYmVmb3JlCi0JICogZm9yY2luZyB0aGUgbnMyNTAxIG9uLgotCSAqLwotCWlmIChyZXN0b3JlKQotCQlyZXN0b3JlX2R2byhkdm8pOworCX0gd2hpbGUgKCFvayAmJiByZXRyaWVzLS0pOwogfQogCiAvKiBzZXQgdGhlIE5TMjUwMSBwb3dlciBzdGF0ZSAqLwpAQCAtNTEwLDcgKzQ1NCw3IEBACiBzdGF0aWMgdm9pZCBuczI1MDFfZHBtcyhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBib29sIGVuYWJsZSkKIHsKIAlib29sIG9rOwotCWJvb2wgcmVzdG9yZSA9IGZhbHNlOworCWludCByZXRyaWVzID0gMTA7CiAJc3RydWN0IG5zMjUwMV9wcml2ICpucyA9IChzdHJ1Y3QgbnMyNTAxX3ByaXYgKikoZHZvLT5kZXZfcHJpdik7CiAJdW5zaWduZWQgY2hhciBjaDsKIApAQCAtNTM3LDE2ICs0ODEsNyBAQAogCQkJb2sgJj0KIAkJCSAgICBuczI1MDFfd3JpdGViKGR2bywgMHgzNSwKIAkJCQkJICBlbmFibGUgPyAweGZmIDogMHgwMCk7Ci0JCQlpZiAoIW9rKSB7Ci0JCQkJaWYgKHJlc3RvcmUpCi0JCQkJCXJlc3RvcmVfZHZvKGR2byk7Ci0JCQkJZW5hYmxlX2R2byhkdm8pOwotCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJfQotCQl9IHdoaWxlICghb2spOwotCi0JCWlmIChyZXN0b3JlKQotCQkJcmVzdG9yZV9kdm8oZHZvKTsKKwkJfSB3aGlsZSAoIW9rICYmIHJldHJpZXMtLSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCmluZGV4IDZlZDQ1YTkuLmIyYjQ2YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCkBAIC00MCw4ICs0MCw2IEBACiAjaW5jbHVkZSA8ZHJtL2k5MTVfZHJtLmg+CiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQotCiBlbnVtIHsKIAlBQ1RJVkVfTElTVCwKIAlJTkFDVElWRV9MSVNULApAQCAtNDA2LDE2ICs0MDQsMjYgQEAKIAlzZXFfcHV0YyhtLCAnXG4nKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZmlsZSwgJmRldi0+ZmlsZWxpc3QsIGxoZWFkKSB7CiAJCXN0cnVjdCBmaWxlX3N0YXRzIHN0YXRzOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKIAkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CiAJCWlkcl9mb3JfZWFjaCgmZmlsZS0+b2JqZWN0X2lkciwgcGVyX2ZpbGVfc3RhdHMsICZzdGF0cyk7CisJCS8qCisJCSAqIEFsdGhvdWdoIHdlIGhhdmUgYSB2YWxpZCByZWZlcmVuY2Ugb24gZmlsZS0+cGlkLCB0aGF0IGRvZXMKKwkJICogbm90IGd1YXJhbnRlZSB0aGF0IHRoZSB0YXNrX3N0cnVjdCB3aG8gY2FsbGVkIGdldF9waWQoKSBpcworCQkgKiBzdGlsbCBhbGl2ZSAoZS5nLiBnZXRfcGlkKGN1cnJlbnQpID0+IGZvcmsoKSA9PiBleGl0KCkpLgorCQkgKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gcHJvdGVjdCB0aGlzIC0+Y29tbSBhY2Nlc3MgdXNpbmcgUkNVLgorCQkgKi8KKwkJcmN1X3JlYWRfbG9jaygpOworCQl0YXNrID0gcGlkX3Rhc2soZmlsZS0+cGlkLCBQSURUWVBFX1BJRCk7CiAJCXNlcV9wcmludGYobSwgIiVzOiAldSBvYmplY3RzLCAlenUgYnl0ZXMgKCV6dSBhY3RpdmUsICV6dSBpbmFjdGl2ZSwgJXp1IHVuYm91bmQpXG4iLAotCQkJICAgZ2V0X3BpZF90YXNrKGZpbGUtPnBpZCwgUElEVFlQRV9QSUQpLT5jb21tLAorCQkJICAgdGFzayA/IHRhc2stPmNvbW0gOiAiPHVua25vd24+IiwKIAkJCSAgIHN0YXRzLmNvdW50LAogCQkJICAgc3RhdHMudG90YWwsCiAJCQkgICBzdGF0cy5hY3RpdmUsCiAJCQkgICBzdGF0cy5pbmFjdGl2ZSwKIAkJCSAgIHN0YXRzLnVuYm91bmQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTU2NCwxMCArNTcyLDEyIEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlmb3JfZWFjaF9yaW5nKHJpbmcsIGRldl9wcml2LCBpKQogCQlpOTE1X3Jpbmdfc2Vxbm9faW5mbyhtLCByaW5nKTsKIAorCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwpAQCAtNTg1LDYgKzU5NSw3IEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gOCkgewogCQlpbnQgaTsKQEAgLTcxMSw2ICs3MjIsNyBAQAogCQl9CiAJCWk5MTVfcmluZ19zZXFub19pbmZvKG0sIHJpbmcpOwogCX0KKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTkwNCw5ICs5MTYsMTEgQEAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKIAogCWNyc3RhbmRkZWxheSA9IEk5MTVfUkVBRDE2KENSU1RBTkRWSUQpOwogCisJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJc2VxX3ByaW50ZihtLCAidy9jdHg6ICVkLCB3L28gY3R4OiAlZFxuIiwgKGNyc3RhbmRkZWxheSA+PiA4KSAmIDB4M2YsIChjcnN0YW5kZGVsYXkgJiAweDNmKSk7CkBAIC05MTksNyArOTMzLDkgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CisKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlmbHVzaF9kZWxheWVkX3dvcmsoJmRldl9wcml2LT5ycHMuZGVsYXllZF9yZXN1bWVfd29yayk7CiAKQEAgLTk0NSw5ICs5NjEsOSBAQAogCQkvKiBSUFNUQVQxIGlzIGluIHRoZSBHVCBwb3dlciB3ZWxsICovCiAJCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCi0JCWdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOworCQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAogCQlyZXFmID0gSTkxNV9SRUFEKEdFTjZfUlBOU1dSRVEpOwogCQlyZXFmICY9IH5HRU42X1RVUkJPX0RJU0FCTEU7CkBAIC05NzAsNyArOTg2LDcgQEAKIAkJCWNhZ2YgPSAocnBzdGF0ICYgR0VONl9DQUdGX01BU0spID4+IEdFTjZfQ0FHRl9TSElGVDsKIAkJY2FnZiAqPSBHVF9GUkVRVUVOQ1lfTVVMVElQTElFUjsKIAotCQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwkJZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJCXNlcV9wcmludGYobSwgIkdUX1BFUkZfU1RBVFVTOiAweCUwOHhcbiIsIGd0X3BlcmZfc3RhdHVzKTsKQEAgLTEwMTgsMjMgKzEwMzQsMjQgQEAKIAkJc2VxX3ByaW50ZihtLCAiUFVOSVRfUkVHX0dQVV9GUkVRX1NUUzogMHglMDh4XG4iLCBmcmVxX3N0cyk7CiAJCXNlcV9wcmludGYobSwgIkREUiBmcmVxOiAlZCBNSHpcbiIsIGRldl9wcml2LT5tZW1fZnJlcSk7CiAKLQkJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX0ZVU0VfQlVTMSk7CisJCXZhbCA9IHZhbGxleXZpZXdfcnBzX21heF9mcmVxKGRldl9wcml2KTsKIAkJc2VxX3ByaW50ZihtLCAibWF4IEdQVSBmcmVxOiAlZCBNSHpcbiIsCi0JCQkgICB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLCB2YWwpKTsKKwkJCSAgIHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgdmFsKSk7CiAKLQkJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19HUFVfTEZNKTsKKwkJdmFsID0gdmFsbGV5dmlld19ycHNfbWluX2ZyZXEoZGV2X3ByaXYpOwogCQlzZXFfcHJpbnRmKG0sICJtaW4gR1BVIGZyZXE6ICVkIE1IelxuIiwKLQkJCSAgIHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsIHZhbCkpOworCQkJICAgdmx2X2dwdV9mcmVxKGRldl9wcml2LCB2YWwpKTsKIAogCQlzZXFfcHJpbnRmKG0sICJjdXJyZW50IEdQVSBmcmVxOiAlZCBNSHpcbiIsCi0JCQkgICB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLAotCQkJCQkoZnJlcV9zdHMgPj4gOCkgJiAweGZmKSk7CisJCQkgICB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIChmcmVxX3N0cyA+PiA4KSAmIDB4ZmYpKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogCX0gZWxzZSB7CiAJCXNlcV9wdXRzKG0sICJubyBQLXN0YXRlIGluZm8gYXZhaWxhYmxlXG4iKTsKIAl9CiAKLQlyZXR1cm4gMDsKK291dDoKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpOTE1X2RlbGF5ZnJlcV90YWJsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKQEAgLTEwNDgsNiArMTA2NSw3IEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlkZWxheWZyZXEgPSBJOTE1X1JFQUQoUFhWRlJFUV9CQVNFICsgaSAqIDQpOwpAQCAtMTA1NSw2ICsxMDczLDggQEAKIAkJCSAgIChkZWxheWZyZXEgJiBQWFZGUkVRX1BYX01BU0spID4+IFBYVkZSRVFfUFhfU0hJRlQpOwogCX0KIAorCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKKwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDc2LDEyICsxMDk2LDE0IEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlmb3IgKGkgPSAxOyBpIDw9IDMyOyBpKyspIHsKIAkJaW50dG9leHQgPSBJOTE1X1JFQUQoSU5UVE9FWFRfQkFTRV9JTEsgKyBpICogNCk7CiAJCXNlcV9wcmludGYobSwgIklOVFRPRVhUJTAyZDogMHglMDh4XG4iLCBpLCBpbnR0b2V4dCk7CiAJfQogCisJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDk5LDExICsxMTIxLDEzIEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlyZ3Ztb2RlY3RsID0gSTkxNV9SRUFEKE1FTU1PREVDVEwpOwogCXJzdGRieWN0bCA9IEk5MTVfUkVBRChSU1REQllDVEwpOwogCWNyc3RhbmR2aWQgPSBJOTE1X1JFQUQxNihDUlNUQU5EVklEKTsKIAorCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXNlcV9wcmludGYobSwgIkhEIGJvb3N0OiAlc1xuIiwgKHJndm1vZGVjdGwgJiBNRU1NT0RFX0JPT1NUX0VOKSA/CkBAIC0xMTU0LDYgKzExNzgsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2bHZfZHJwY19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcnBtb2RlY3RsMSwgcmNjdGwxOworCXVuc2lnbmVkIGZ3X3JlbmRlcmNvdW50ID0gMCwgZndfbWVkaWFjb3VudCA9IDA7CisKKwlycG1vZGVjdGwxID0gSTkxNV9SRUFEKEdFTjZfUlBfQ09OVFJPTCk7CisJcmNjdGwxID0gSTkxNV9SRUFEKEdFTjZfUkNfQ09OVFJPTCk7CisKKwlzZXFfcHJpbnRmKG0sICJWaWRlbyBUdXJibyBNb2RlOiAlc1xuIiwKKwkJICAgeWVzbm8ocnBtb2RlY3RsMSAmIEdFTjZfUlBfTUVESUFfVFVSQk8pKTsKKwlzZXFfcHJpbnRmKG0sICJUdXJibyBlbmFibGVkOiAlc1xuIiwKKwkJICAgeWVzbm8ocnBtb2RlY3RsMSAmIEdFTjZfUlBfRU5BQkxFKSk7CisJc2VxX3ByaW50ZihtLCAiSFcgY29udHJvbCBlbmFibGVkOiAlc1xuIiwKKwkJICAgeWVzbm8ocnBtb2RlY3RsMSAmIEdFTjZfUlBfRU5BQkxFKSk7CisJc2VxX3ByaW50ZihtLCAiU1cgY29udHJvbCBlbmFibGVkOiAlc1xuIiwKKwkJICAgeWVzbm8oKHJwbW9kZWN0bDEgJiBHRU42X1JQX01FRElBX01PREVfTUFTSykgPT0KKwkJCSAgR0VONl9SUF9NRURJQV9TV19NT0RFKSk7CisJc2VxX3ByaW50ZihtLCAiUkM2IEVuYWJsZWQ6ICVzXG4iLAorCQkgICB5ZXNubyhyY2N0bDEgJiAoR0VON19SQ19DVExfVE9fTU9ERSB8CisJCQkJCUdFTjZfUkNfQ1RMX0VJX01PREUoMSkpKSk7CisJc2VxX3ByaW50ZihtLCAiUmVuZGVyIFBvd2VyIFdlbGw6ICVzXG4iLAorCQkJKEk5MTVfUkVBRChWTFZfR1RMQ19QV19TVEFUVVMpICYKKwkJCQlWTFZfR1RMQ19QV19SRU5ERVJfU1RBVFVTX01BU0spID8gIlVwIiA6ICJEb3duIik7CisJc2VxX3ByaW50ZihtLCAiTWVkaWEgUG93ZXIgV2VsbDogJXNcbiIsCisJCQkoSTkxNV9SRUFEKFZMVl9HVExDX1BXX1NUQVRVUykgJgorCQkJCVZMVl9HVExDX1BXX01FRElBX1NUQVRVU19NQVNLKSA/ICJVcCIgOiAiRG93biIpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrKTsKKwlmd19yZW5kZXJjb3VudCA9IGRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQ7CisJZndfbWVkaWFjb3VudCA9IGRldl9wcml2LT51bmNvcmUuZndfbWVkaWFjb3VudDsKKwlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT51bmNvcmUubG9jayk7CisKKwlzZXFfcHJpbnRmKG0sICJGb3JjZXdha2UgUmVuZGVyIENvdW50ID0gJXVcbiIsIGZ3X3JlbmRlcmNvdW50KTsKKwlzZXFfcHJpbnRmKG0sICJGb3JjZXdha2UgTWVkaWEgQ291bnQgPSAldVxuIiwgZndfbWVkaWFjb3VudCk7CisKKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgZ2VuNl9kcnBjX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewogCkBAIC0xMTY3LDYgKzEyMzUsNyBAQAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwogCiAJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrKTsKIAlmb3JjZXdha2VfY291bnQgPSBkZXZfcHJpdi0+dW5jb3JlLmZvcmNld2FrZV9jb3VudDsKQEAgLTExOTIsNiArMTI2MSw4IEBACiAJc2FuZHlicmlkZ2VfcGNvZGVfcmVhZChkZXZfcHJpdiwgR0VONl9QQ09ERV9SRUFEX1JDNlZJRFMsICZyYzZ2aWRzKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisKIAlzZXFfcHJpbnRmKG0sICJWaWRlbyBUdXJibyBNb2RlOiAlc1xuIiwKIAkJICAgeWVzbm8ocnBtb2RlY3RsMSAmIEdFTjZfUlBfTUVESUFfVFVSQk8pKTsKIAlzZXFfcHJpbnRmKG0sICJIVyBjb250cm9sIGVuYWJsZWQ6ICVzXG4iLApAQCAtMTI1Niw3ICsxMzI3LDkgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCi0JaWYgKElTX0dFTjYoZGV2KSB8fCBJU19HRU43KGRldikpCisJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkKKwkJcmV0dXJuIHZsdl9kcnBjX2luZm8obSk7CisJZWxzZSBpZiAoSVNfR0VONihkZXYpIHx8IElTX0dFTjcoZGV2KSkKIAkJcmV0dXJuIGdlbjZfZHJwY19pbmZvKG0pOwogCWVsc2UKIAkJcmV0dXJuIGlyb25sYWtlX2RycGNfaW5mbyhtKTsKQEAgLTEyNjgsNyArMTM0MSw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIUk5MTVfSEFTX0ZCQyhkZXYpKSB7CisJaWYgKCFIQVNfRkJDKGRldikpIHsKIAkJc2VxX3B1dHMobSwgIkZCQyB1bnN1cHBvcnRlZCBvbiB0aGlzIGNoaXBzZXRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzMwLDcgKzE0MDMsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoSTkxNV9SRUFEKElQU19DVEwpICYgSVBTX0VOQUJMRSkKKwlpZiAoSVNfQlJPQURXRUxMKGRldikgfHwgSTkxNV9SRUFEKElQU19DVEwpICYgSVBTX0VOQUJMRSkKIAkJc2VxX3B1dHMobSwgImVuYWJsZWRcbiIpOwogCWVsc2UKIAkJc2VxX3B1dHMobSwgImRpc2FibGVkXG4iKTsKQEAgLTE0MDYsNiArMTQ3OSw3IEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwogCiAJc2VxX3B1dHMobSwgIkdQVSBmcmVxIChNSHopXHRFZmZlY3RpdmUgQ1BVIGZyZXEgKE1IeilcdEVmZmVjdGl2ZSBSaW5nIGZyZXEgKE1IeilcbiIpOwogCkBAIC0xNDIyLDYgKzE0OTYsNyBAQAogCQkJICAgKChpYV9mcmVxID4+IDgpICYgMHhmZikgKiAxMDApOwogCX0KIAorCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTE0MzcsOCArMTUxMiwxMCBAQAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwogCiAJc2VxX3ByaW50ZihtLCAiR0ZYRUM6ICVsZFxuIiwgKHVuc2lnbmVkIGxvbmcpSTkxNV9SRUFEKDB4MTEyZjQpKTsKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtMTU2NSwxMyArMTY0MiwyMSBAQAogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBmb3JjZXdha2VfY291bnQ7CisJdW5zaWduZWQgZm9yY2V3YWtlX2NvdW50ID0gMCwgZndfcmVuZGVyY291bnQgPSAwLCBmd19tZWRpYWNvdW50ID0gMDsKIAogCXNwaW5fbG9ja19pcnEoJmRldl9wcml2LT51bmNvcmUubG9jayk7Ci0JZm9yY2V3YWtlX2NvdW50ID0gZGV2X3ByaXYtPnVuY29yZS5mb3JjZXdha2VfY291bnQ7CisJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgeworCQlmd19yZW5kZXJjb3VudCA9IGRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQ7CisJCWZ3X21lZGlhY291bnQgPSBkZXZfcHJpdi0+dW5jb3JlLmZ3X21lZGlhY291bnQ7CisJfSBlbHNlCisJCWZvcmNld2FrZV9jb3VudCA9IGRldl9wcml2LT51bmNvcmUuZm9yY2V3YWtlX2NvdW50OwogCXNwaW5fdW5sb2NrX2lycSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrKTsKIAotCXNlcV9wcmludGYobSwgImZvcmNld2FrZSBjb3VudCA9ICV1XG4iLCBmb3JjZXdha2VfY291bnQpOworCWlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKKwkJc2VxX3ByaW50ZihtLCAiZndfcmVuZGVyY291bnQgPSAldVxuIiwgZndfcmVuZGVyY291bnQpOworCQlzZXFfcHJpbnRmKG0sICJmd19tZWRpYWNvdW50ID0gJXVcbiIsIGZ3X21lZGlhY291bnQpOworCX0gZWxzZQorCQlzZXFfcHJpbnRmKG0sICJmb3JjZXdha2UgY291bnQgPSAldVxuIiwgZm9yY2V3YWtlX2NvdW50KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYxMCw2ICsxNjk1LDcgQEAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKIAogCXNlcV9wcmludGYobSwgImJpdDYgc3dpenpsZSBmb3IgWC10aWxpbmcgPSAlc1xuIiwKIAkJICAgc3dpenpsZV9zdHJpbmcoZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCkpOwpAQCAtMTY0MSw2ICsxNzI3LDcgQEAKIAkJc2VxX3ByaW50ZihtLCAiRElTUF9BUkJfQ1RMID0gMHglMDh4XG4iLAogCQkJICAgSTkxNV9SRUFEKERJU1BfQVJCX0NUTCkpOwogCX0KKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE3MDEsMTYgKzE3ODgsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpbnQgcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gOCkKIAkJZ2VuOF9wcGd0dF9pbmZvKG0sIGRldik7CiAJZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikKIAkJZ2VuNl9wcGd0dF9pbmZvKG0sIGRldik7CiAKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE3MzUsMjggKzE4MjUsMjggQEAKIAogCXNlcV9wcmludGYobSwgIkRQSU9fQ1RMOiAweCUwOHhcbiIsIEk5MTVfUkVBRChEUElPX0NUTCkpOwogCi0Jc2VxX3ByaW50ZihtLCAiRFBJT19ESVZfQTogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX0RJVl9BKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJT19ESVZfQjogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX0RJVl9CKSk7CisJc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFczIENIMCA6IDB4JTA4eFxuIiwKKwkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMygwKSkpOworCXNlcV9wcmludGYobSwgIkRQSU8gUExMIERXMyBDSDE6IDB4JTA4eFxuIiwKKwkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMygxKSkpOwogCi0Jc2VxX3ByaW50ZihtLCAiRFBJT19SRUZTRlJfQTogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX1JFRlNGUl9BKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJT19SRUZTRlJfQjogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX1JFRlNGUl9CKSk7CisJc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFc1IENIMDogMHglMDh4XG4iLAorCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9QTExfRFc1KDApKSk7CisJc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFc1IENIMTogMHglMDh4XG4iLAorCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9QTExfRFc1KDEpKSk7CiAKLQlzZXFfcHJpbnRmKG0sICJEUElPX0NPUkVfQ0xLX0E6IDB4JTA4eFxuIiwKLQkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBfRFBJT19DT1JFX0NMS19BKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJT19DT1JFX0NMS19COiAweCUwOHhcbiIsCi0JCSAgIHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIFBJUEVfQSwgX0RQSU9fQ09SRV9DTEtfQikpOworCXNlcV9wcmludGYobSwgIkRQSU8gUExMIERXNyBDSDA6IDB4JTA4eFxuIiwKKwkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXNygwKSkpOworCXNlcV9wcmludGYobSwgIkRQSU8gUExMIERXNyBDSDE6IDB4JTA4eFxuIiwKKwkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXNygxKSkpOwogCi0Jc2VxX3ByaW50ZihtLCAiRFBJT19MUEZfQ09FRkZfQTogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX0xQRl9DT0VGRl9BKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJT19MUEZfQ09FRkZfQjogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIF9EUElPX0xQRl9DT0VGRl9CKSk7CisJc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFcxMCBDSDA6IDB4JTA4eFxuIiwKKwkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMTAoMCkpKTsKKwlzZXFfcHJpbnRmKG0sICJEUElPIFBMTCBEVzEwIENIMTogMHglMDh4XG4iLAorCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9QTExfRFcxMCgxKSkpOwogCiAJc2VxX3ByaW50ZihtLCAiRFBJT19GQVNUQ0xLX0RJU0FCTEU6IDB4JTA4eFxuIiwKLQkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBEUElPX0ZBU1RDTEtfRElTQUJMRSkpOworCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9DTU5fRFcwKSk7CiAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCkBAIC0xNzg0LDYgKzE4NzQsOCBAQAogCXUzMiBwc3JwZXJmID0gMDsKIAlib29sIGVuYWJsZWQgPSBmYWxzZTsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCXNlcV9wcmludGYobSwgIlNpbmtfU3VwcG9ydDogJXNcbiIsIHllc25vKGRldl9wcml2LT5wc3Iuc2lua19zdXBwb3J0KSk7CiAJc2VxX3ByaW50ZihtLCAiU291cmNlX09LOiAlc1xuIiwgeWVzbm8oZGV2X3ByaXYtPnBzci5zb3VyY2Vfb2spKTsKIApAQCAtMTc5Niw2ICsxODg4LDcgQEAKIAkJCUVEUF9QU1JfUEVSRl9DTlRfTUFTSzsKIAlzZXFfcHJpbnRmKG0sICJQZXJmb3JtYW5jZV9Db3VudGVyOiAldVxuIiwgcHNycGVyZik7CiAKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NDUsNiArMTkzOCw3NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqcG93ZXJfZG9tYWluX3N0cihlbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIGRvbWFpbikKK3sKKwlzd2l0Y2ggKGRvbWFpbikgeworCWNhc2UgUE9XRVJfRE9NQUlOX1BJUEVfQToKKwkJcmV0dXJuICJQSVBFX0EiOworCWNhc2UgUE9XRVJfRE9NQUlOX1BJUEVfQjoKKwkJcmV0dXJuICJQSVBFX0IiOworCWNhc2UgUE9XRVJfRE9NQUlOX1BJUEVfQzoKKwkJcmV0dXJuICJQSVBFX0MiOworCWNhc2UgUE9XRVJfRE9NQUlOX1BJUEVfQV9QQU5FTF9GSVRURVI6CisJCXJldHVybiAiUElQRV9BX1BBTkVMX0ZJVFRFUiI7CisJY2FzZSBQT1dFUl9ET01BSU5fUElQRV9CX1BBTkVMX0ZJVFRFUjoKKwkJcmV0dXJuICJQSVBFX0JfUEFORUxfRklUVEVSIjsKKwljYXNlIFBPV0VSX0RPTUFJTl9QSVBFX0NfUEFORUxfRklUVEVSOgorCQlyZXR1cm4gIlBJUEVfQ19QQU5FTF9GSVRURVIiOworCWNhc2UgUE9XRVJfRE9NQUlOX1RSQU5TQ09ERVJfQToKKwkJcmV0dXJuICJUUkFOU0NPREVSX0EiOworCWNhc2UgUE9XRVJfRE9NQUlOX1RSQU5TQ09ERVJfQjoKKwkJcmV0dXJuICJUUkFOU0NPREVSX0IiOworCWNhc2UgUE9XRVJfRE9NQUlOX1RSQU5TQ09ERVJfQzoKKwkJcmV0dXJuICJUUkFOU0NPREVSX0MiOworCWNhc2UgUE9XRVJfRE9NQUlOX1RSQU5TQ09ERVJfRURQOgorCQlyZXR1cm4gIlRSQU5TQ09ERVJfRURQIjsKKwljYXNlIFBPV0VSX0RPTUFJTl9WR0E6CisJCXJldHVybiAiVkdBIjsKKwljYXNlIFBPV0VSX0RPTUFJTl9BVURJTzoKKwkJcmV0dXJuICJBVURJTyI7CisJY2FzZSBQT1dFUl9ET01BSU5fSU5JVDoKKwkJcmV0dXJuICJJTklUIjsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm4gIj8iOworCX0KK30KKworc3RhdGljIGludCBpOTE1X3Bvd2VyX2RvbWFpbl9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaTkxNV9wb3dlcl9kb21haW5zICpwb3dlcl9kb21haW5zID0gJmRldl9wcml2LT5wb3dlcl9kb21haW5zOworCWludCBpOworCisJbXV0ZXhfbG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7CisKKwlzZXFfcHJpbnRmKG0sICIlLTI1cyAlc1xuIiwgIlBvd2VyIHdlbGwvZG9tYWluIiwgIlVzZSBjb3VudCIpOworCWZvciAoaSA9IDA7IGkgPCBwb3dlcl9kb21haW5zLT5wb3dlcl93ZWxsX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGk5MTVfcG93ZXJfd2VsbCAqcG93ZXJfd2VsbDsKKwkJZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBwb3dlcl9kb21haW47CisKKwkJcG93ZXJfd2VsbCA9ICZwb3dlcl9kb21haW5zLT5wb3dlcl93ZWxsc1tpXTsKKwkJc2VxX3ByaW50ZihtLCAiJS0yNXMgJWRcbiIsIHBvd2VyX3dlbGwtPm5hbWUsCisJCQkgICBwb3dlcl93ZWxsLT5jb3VudCk7CisKKwkJZm9yIChwb3dlcl9kb21haW4gPSAwOyBwb3dlcl9kb21haW4gPCBQT1dFUl9ET01BSU5fTlVNOworCQkgICAgIHBvd2VyX2RvbWFpbisrKSB7CisJCQlpZiAoIShCSVQocG93ZXJfZG9tYWluKSAmIHBvd2VyX3dlbGwtPmRvbWFpbnMpKQorCQkJCWNvbnRpbnVlOworCisJCQlzZXFfcHJpbnRmKG0sICIgICUtMjNzICVkXG4iLAorCQkJCSBwb3dlcl9kb21haW5fc3RyKHBvd2VyX2RvbWFpbiksCisJCQkJIHBvd2VyX2RvbWFpbnMtPmRvbWFpbl91c2VfY291bnRbcG93ZXJfZG9tYWluXSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnBvd2VyX2RvbWFpbnMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBwaXBlX2NyY19pbmZvIHsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CkBAIC0xODU3LDYgKzIwMjAsOSBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGluZm8tPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX3BpcGVfY3JjICpwaXBlX2NyYyA9ICZkZXZfcHJpdi0+cGlwZV9jcmNbaW5mby0+cGlwZV07CiAKKwlpZiAoaW5mby0+cGlwZSA+PSBJTlRFTF9JTkZPKGluZm8tPmRldiktPm51bV9waXBlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlzcGluX2xvY2tfaXJxKCZwaXBlX2NyYy0+bG9jayk7CiAKIAlpZiAocGlwZV9jcmMtPm9wZW5lZCkgewpAQCAtMjAwNSw4ICsyMTcxLDggQEAKIAlpbmZvLT5kZXYgPSBkZXY7CiAJZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShpbmZvLT5uYW1lLCBTX0lSVUdPLCByb290LCBpbmZvLAogCQkJCSAgJmk5MTVfcGlwZV9jcmNfZm9wcyk7Ci0JaWYgKElTX0VSUihlbnQpKQotCQlyZXR1cm4gUFRSX0VSUihlbnQpOworCWlmICghZW50KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldHVybiBkcm1fYWRkX2Zha2VfaW5mb19ub2RlKG1pbm9yLCBlbnQsIGluZm8pOwogfQpAQCAtMjM0Nyw3ICsyNTEzLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9waXBlX2NyYyAqcGlwZV9jcmMgPSAmZGV2X3ByaXYtPnBpcGVfY3JjW3BpcGVdOwotCXUzMiB2YWw7CisJdTMyIHZhbCA9IDA7IC8qIHNodXQgdXAgZ2NjICovCiAJaW50IHJldDsKIAogCWlmIChwaXBlX2NyYy0+c291cmNlID09IHNvdXJjZSkKQEAgLTI3NDIsNyArMjkwOCw3IEBACiAJc3RydWN0IGk5MTVfdm1hICp2bWEsICp4OwogCWludCByZXQ7CiAKLQlEUk1fREVCVUdfRFJJVkVSKCJEcm9wcGluZyBjYWNoZXM6IDB4JTA4bGx4XG4iLCB2YWwpOworCURSTV9ERUJVRygiRHJvcHBpbmcgY2FjaGVzOiAweCUwOGxseFxuIiwgdmFsKTsKIAogCS8qIE5vIG5lZWQgdG8gY2hlY2sgYW5kIHdhaXQgZm9yIGdwdSByZXNldHMsIG9ubHkgbGliZHJtIGF1dG8tcmVzdGFydHMKIAkgKiBvbiBpb2N0bHMgb24gLUVBR0FJTi4gKi8KQEAgLTI4MTAsOCArMjk3Niw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQotCQkqdmFsID0gdmx2X2dwdV9mcmVxKGRldl9wcml2LT5tZW1fZnJlcSwKLQkJCQkgICAgZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkpOworCQkqdmFsID0gdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CiAJZWxzZQogCQkqdmFsID0gZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkgKiBHVF9GUkVRVUVOQ1lfTVVMVElQTElFUjsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CkBAIC0yODQxLDkgKzMwMDYsOSBAQAogCSAqIFR1cmJvIHdpbGwgc3RpbGwgYmUgZW5hYmxlZCwgYnV0IHdvbid0IGdvIGFib3ZlIHRoZSBzZXQgdmFsdWUuCiAJICovCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgewotCQl2YWwgPSB2bHZfZnJlcV9vcGNvZGUoZGV2X3ByaXYtPm1lbV9mcmVxLCB2YWwpOworCQl2YWwgPSB2bHZfZnJlcV9vcGNvZGUoZGV2X3ByaXYsIHZhbCk7CiAJCWRldl9wcml2LT5ycHMubWF4X2RlbGF5ID0gdmFsOwotCQlnZW42X3NldF9ycHMoZGV2LCB2YWwpOworCQl2YWxsZXl2aWV3X3NldF9ycHMoZGV2LCB2YWwpOwogCX0gZWxzZSB7CiAJCWRvX2Rpdih2YWwsIEdUX0ZSRVFVRU5DWV9NVUxUSVBMSUVSKTsKIAkJZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkgPSB2YWw7CkBAIC0yODc2LDggKzMwNDEsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkKLQkJKnZhbCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsCi0JCQkJICAgIGRldl9wcml2LT5ycHMubWluX2RlbGF5KTsKKwkJKnZhbCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkpOwogCWVsc2UKIAkJKnZhbCA9IGRldl9wcml2LT5ycHMubWluX2RlbGF5ICogR1RfRlJFUVVFTkNZX01VTFRJUExJRVI7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwpAQCAtMjkwNyw3ICszMDcxLDcgQEAKIAkgKiBUdXJibyB3aWxsIHN0aWxsIGJlIGVuYWJsZWQsIGJ1dCB3b24ndCBnbyBiZWxvdyB0aGUgc2V0IHZhbHVlLgogCSAqLwogCWlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKLQkJdmFsID0gdmx2X2ZyZXFfb3Bjb2RlKGRldl9wcml2LT5tZW1fZnJlcSwgdmFsKTsKKwkJdmFsID0gdmx2X2ZyZXFfb3Bjb2RlKGRldl9wcml2LCB2YWwpOwogCQlkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSA9IHZhbDsKIAkJdmFsbGV5dmlld19zZXRfcnBzKGRldiwgdmFsKTsKIAl9IGVsc2UgewpAQCAtMjkzOCw4ICszMTAyLDExIEBACiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlzbnBjciA9IEk5MTVfUkVBRChHRU42X01CQ1VOSVRfU05QQ1IpOworCisJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRldi0+c3RydWN0X211dGV4KTsKIAogCSp2YWwgPSAoc25wY3IgJiBHRU42X01CQ19TTlBDUl9NQVNLKSA+PiBHRU42X01CQ19TTlBDUl9TSElGVDsKQEAgLTI5NjAsNiArMzEyNyw3IEBACiAJaWYgKHZhbCA+IDMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwogCURSTV9ERUJVR19EUklWRVIoIk1hbnVhbGx5IHNldHRpbmcgdW5jb3JlIHNoYXJpbmcgdG8gJWxsdVxuIiwgdmFsKTsKIAogCS8qIFVwZGF0ZSB0aGUgY2FjaGUgc2hhcmluZyBwb2xpY3kgaGVyZSBhcyB3ZWxsICovCkBAIC0yOTY4LDYgKzMxMzYsNyBAQAogCXNucGNyIHw9ICh2YWwgPDwgR0VONl9NQkNfU05QQ1JfU0hJRlQpOwogCUk5MTVfV1JJVEUoR0VONl9NQkNVTklUX1NOUENSLCBzbnBjcik7CiAKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5ODMsNyArMzE1Miw4IEBACiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNikKIAkJcmV0dXJuIDA7CiAKLQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CisJZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5OTYsNyArMzE2Niw4IEBACiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNikKIAkJcmV0dXJuIDA7CiAKLQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMTYsOCArMzE4Nyw4IEBACiAJCQkJICBTX0lSVVNSLAogCQkJCSAgcm9vdCwgZGV2LAogCQkJCSAgJmk5MTVfZm9yY2V3YWtlX2ZvcHMpOwotCWlmIChJU19FUlIoZW50KSkKLQkJcmV0dXJuIFBUUl9FUlIoZW50KTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXR1cm4gZHJtX2FkZF9mYWtlX2luZm9fbm9kZShtaW5vciwgZW50LCAmaTkxNV9mb3JjZXdha2VfZm9wcyk7CiB9CkBAIC0zMDM0LDggKzMyMDUsOCBAQAogCQkJCSAgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkJICByb290LCBkZXYsCiAJCQkJICBmb3BzKTsKLQlpZiAoSVNfRVJSKGVudCkpCi0JCXJldHVybiBQVFJfRVJSKGVudCk7CisJaWYgKCFlbnQpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0dXJuIGRybV9hZGRfZmFrZV9pbmZvX25vZGUobWlub3IsIGVudCwgZm9wcyk7CiB9CkBAIC0zMDc5LDYgKzMyNTAsNyBAQAogCXsiaTkxNV9lZHBfcHNyX3N0YXR1cyIsIGk5MTVfZWRwX3Bzcl9zdGF0dXMsIDB9LAogCXsiaTkxNV9lbmVyZ3lfdUoiLCBpOTE1X2VuZXJneV91SiwgMH0sCiAJeyJpOTE1X3BjOF9zdGF0dXMiLCBpOTE1X3BjOF9zdGF0dXMsIDB9LAorCXsiaTkxNV9wb3dlcl9kb21haW5faW5mbyIsIGk5MTVfcG93ZXJfZG9tYWluX2luZm8sIDB9LAogfTsKICNkZWZpbmUgSTkxNV9ERUJVR0ZTX0VOVFJJRVMgQVJSQVlfU0laRShpOTE1X2RlYnVnZnNfbGlzdCkKIApAQCAtMzEwMiwxMCArMzI3NCwxMCBAQAogdm9pZCBpbnRlbF9kaXNwbGF5X2NyY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgaTsKKwllbnVtIHBpcGUgcGlwZTsKIAotCWZvciAoaSA9IDA7IGkgPCBJTlRFTF9JTkZPKGRldiktPm51bV9waXBlczsgaSsrKSB7Ci0JCXN0cnVjdCBpbnRlbF9waXBlX2NyYyAqcGlwZV9jcmMgPSAmZGV2X3ByaXYtPnBpcGVfY3JjW2ldOworCWZvcl9lYWNoX3BpcGUocGlwZSkgeworCQlzdHJ1Y3QgaW50ZWxfcGlwZV9jcmMgKnBpcGVfY3JjID0gJmRldl9wcml2LT5waXBlX2NyY1twaXBlXTsKIAogCQlwaXBlX2NyYy0+b3BlbmVkID0gZmFsc2U7CiAJCXNwaW5fbG9ja19pbml0KCZwaXBlX2NyYy0+bG9jayk7CkBAIC0zMTY0LDUgKzMzMzYsMyBAQAogCQlkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMoaW5mb19saXN0LCAxLCBtaW5vcik7CiAJfQogfQotCi0jZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCA1YzY0ODQyLi4xNWE3NGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlIDxsaW51eC92Z2Ffc3dpdGNoZXJvby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNkZWZpbmUgTFBfUklORyhkKSAoJigoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikoZCkpLT5yaW5nW1JDU10pCiAKQEAgLTc5MSw3ICs3OTMsNyBAQAogCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9XQUlUOwogCiAJaWYgKHJpbmctPmlycV9nZXQocmluZykpIHsKLQkJRFJNX1dBSVRfT04ocmV0LCByaW5nLT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCisJCURSTV9XQUlUX09OKHJldCwgcmluZy0+aXJxX3F1ZXVlLCAzICogSFosCiAJCQkgICAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpOwogCQlyaW5nLT5pcnFfcHV0KHJpbmcpOwogCX0gZWxzZSBpZiAod2FpdF9mb3IoUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIsIDMwMDApKQpAQCAtODI4LDcgKzgzMCw3IEBACiAJcmVzdWx0ID0gaTkxNV9lbWl0X2lycShkZXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JaWYgKERSTV9DT1BZX1RPX1VTRVIoZW1pdC0+aXJxX3NlcSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKSB7CisJaWYgKGNvcHlfdG9fdXNlcihlbWl0LT5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpIHsKIAkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0xMDE2LDggKzEwMTgsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoRFJNX0NPUFlfVE9fVVNFUihwYXJhbS0+dmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkpKSB7Ci0JCURSTV9FUlJPUigiRFJNX0NPUFlfVE9fVVNFUiBmYWlsZWRcbiIpOworCWlmIChjb3B5X3RvX3VzZXIocGFyYW0tPnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpKSkgeworCQlEUk1fRVJST1IoImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTE0MTEsNyArMTQxMyw3IEBACiAJbWFzdGVyLT5kcml2ZXJfcHJpdiA9IE5VTEw7CiB9CiAKLSNpZmRlZiBDT05GSUdfRFJNX0k5MTVfRkJERVYKKyNpZiBJU19FTkFCTEVEKENPTkZJR19GQikKIHN0YXRpYyB2b2lkIGk5MTVfa2lja19vdXRfZmlybXdhcmVfZmIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCXN0cnVjdCBhcGVydHVyZXNfc3RydWN0ICphcDsKQEAgLTE0ODQsNiArMTQ4NiwxMCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKiBVTVMgbmVlZHMgYWdwIHN1cHBvcnQuICovCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpICYmICFkZXYtPmFncCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlkZXZfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmIChkZXZfcHJpdiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0OTQsNyArMTUwMCw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmdwdV9lcnJvci5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmJhY2tsaWdodF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPnVuY29yZS5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPm1tLm9iamVjdF9zdGF0X2xvY2spOwogCW11dGV4X2luaXQoJmRldl9wcml2LT5kcGlvX2xvY2spOwpAQCAtMTYzOSw4ICsxNjQ1LDcgQEAKIAkJCWdvdG8gb3V0X2dlbV91bmxvYWQ7CiAJfQogCi0JaWYgKEhBU19QT1dFUl9XRUxMKGRldikpCi0JCWludGVsX3Bvd2VyX2RvbWFpbnNfaW5pdChkZXYpOworCWludGVsX3Bvd2VyX2RvbWFpbnNfaW5pdChkZXYpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKIAkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYpOwpAQCAtMTY2NCwxMSArMTY2OSwxMiBAQAogCWlmIChJU19HRU41KGRldikpCiAJCWludGVsX2dwdV9pcHNfaW5pdChkZXZfcHJpdik7CiAKKwlpbnRlbF9pbml0X3J1bnRpbWVfcG0oZGV2X3ByaXYpOworCiAJcmV0dXJuIDA7CiAKIG91dF9wb3dlcl93ZWxsOgotCWlmIChIQVNfUE9XRVJfV0VMTChkZXYpKQotCQlpbnRlbF9wb3dlcl9kb21haW5zX3JlbW92ZShkZXYpOworCWludGVsX3Bvd2VyX2RvbWFpbnNfcmVtb3ZlKGRldik7CiAJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CiBvdXRfZ2VtX3VubG9hZDoKIAlpZiAoZGV2X3ByaXYtPm1tLmluYWN0aXZlX3Nocmlua2VyLnNjYW5fb2JqZWN0cykKQEAgLTE2NzksNiArMTY4NSw3IEBACiAKIAlpbnRlbF90ZWFyZG93bl9nbWJ1cyhkZXYpOwogCWludGVsX3RlYXJkb3duX21jaGJhcihkZXYpOworCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmZGV2X3ByaXYtPnBtX3Fvcyk7CiAJZGVzdHJveV93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKIG91dF9tdHJyZnJlZToKIAlhcmNoX3BoeXNfd2NfZGVsKGRldl9wcml2LT5ndHQubXRycik7CkBAIC0xNzA0LDI1ICsxNzExLDI3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0OwogCisJcmV0ID0gaTkxNV9nZW1fc3VzcGVuZChkZXYpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaWRsZSBoYXJkd2FyZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW50ZWxfZmluaV9ydW50aW1lX3BtKGRldl9wcml2KTsKKwogCWludGVsX2dwdV9pcHNfdGVhcmRvd24oKTsKIAotCWlmIChIQVNfUE9XRVJfV0VMTChkZXYpKSB7Ci0JCS8qIFRoZSBpOTE1LmtvIG1vZHVsZSBpcyBzdGlsbCBub3QgcHJlcGFyZWQgdG8gYmUgbG9hZGVkIHdoZW4KLQkJICogdGhlIHBvd2VyIHdlbGwgaXMgbm90IGVuYWJsZWQsIHNvIGp1c3QgZW5hYmxlIGl0IGluIGNhc2UKLQkJICogd2UncmUgZ29pbmcgdG8gdW5sb2FkL3JlbG9hZC4gKi8KLQkJaW50ZWxfZGlzcGxheV9zZXRfaW5pdF9wb3dlcihkZXYsIHRydWUpOwotCQlpbnRlbF9wb3dlcl9kb21haW5zX3JlbW92ZShkZXYpOwotCX0KKwkvKiBUaGUgaTkxNS5rbyBtb2R1bGUgaXMgc3RpbGwgbm90IHByZXBhcmVkIHRvIGJlIGxvYWRlZCB3aGVuCisJICogdGhlIHBvd2VyIHdlbGwgaXMgbm90IGVuYWJsZWQsIHNvIGp1c3QgZW5hYmxlIGl0IGluIGNhc2UKKwkgKiB3ZSdyZSBnb2luZyB0byB1bmxvYWQvcmVsb2FkLiAqLworCWludGVsX2Rpc3BsYXlfc2V0X2luaXRfcG93ZXIoZGV2LCB0cnVlKTsKKwlpbnRlbF9wb3dlcl9kb21haW5zX3JlbW92ZShkZXYpOwogCiAJaTkxNV90ZWFyZG93bl9zeXNmcyhkZXYpOwogCiAJaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zY2FuX29iamVjdHMpCiAJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CiAKLQlyZXQgPSBpOTE1X2dlbV9zdXNwZW5kKGRldik7Ci0JaWYgKHJldCkKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaWRsZSBoYXJkd2FyZTogJWRcbiIsIHJldCk7Ci0KIAlpb19tYXBwaW5nX2ZyZWUoZGV2X3ByaXYtPmd0dC5tYXBwYWJsZSk7CiAJYXJjaF9waHlzX3djX2RlbChkZXZfcHJpdi0+Z3R0Lm10cnIpOwogCkBAIC0xNzc3LDcgKzE3ODYsNiBAQAogCiAJbGlzdF9kZWwoJmRldl9wcml2LT5ndHQuYmFzZS5nbG9iYWxfbGluayk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnZtX2xpc3QpKTsKLQlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5ndHQuYmFzZS5tbSk7CiAKIAlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIApAQCAtMTkxMCw2ICsxOTE4LDcgQEAKIAlEUk1fSU9DVExfREVGX0RSVihJOTE1X0dFTV9DT05URVhUX0NSRUFURSwgaTkxNV9nZW1fY29udGV4dF9jcmVhdGVfaW9jdGwsIERSTV9VTkxPQ0tFRHxEUk1fUkVOREVSX0FMTE9XKSwKIAlEUk1fSU9DVExfREVGX0RSVihJOTE1X0dFTV9DT05URVhUX0RFU1RST1ksIGk5MTVfZ2VtX2NvbnRleHRfZGVzdHJveV9pb2N0bCwgRFJNX1VOTE9DS0VEfERSTV9SRU5ERVJfQUxMT1cpLAogCURSTV9JT0NUTF9ERUZfRFJWKEk5MTVfUkVHX1JFQUQsIGk5MTVfcmVnX3JlYWRfaW9jdGwsIERSTV9VTkxPQ0tFRHxEUk1fUkVOREVSX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGX0RSVihJOTE1X0dFVF9SRVNFVF9TVEFUUywgaTkxNV9nZXRfcmVzZXRfc3RhdHNfaW9jdGwsIERSTV9VTkxPQ0tFRHxEUk1fUkVOREVSX0FMTE9XKSwKIH07CiAKIGludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCmluZGV4IDViN2I3ZTAuLjA0ZjFmMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtNTksNyArNTksNyBAQAogCQkiRW5hYmxlIHBvd2Vyc2F2aW5ncywgZmJjLCBkb3duY2xvY2tpbmcsIGV0Yy4gKGRlZmF1bHQ6IHRydWUpIik7CiAKIGludCBpOTE1X3NlbWFwaG9yZXMgX19yZWFkX21vc3RseSA9IC0xOwotbW9kdWxlX3BhcmFtX25hbWVkKHNlbWFwaG9yZXMsIGk5MTVfc2VtYXBob3JlcywgaW50LCAwNjAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChzZW1hcGhvcmVzLCBpOTE1X3NlbWFwaG9yZXMsIGludCwgMDQwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlbWFwaG9yZXMsCiAJCSJVc2Ugc2VtYXBob3JlcyBmb3IgaW50ZXItcmluZyBzeW5jIChkZWZhdWx0OiAtMSAodXNlIHBlci1jaGlwIGRlZmF1bHRzKSkiKTsKIApAQCAtMTE0LDcgKzExNCw3IEBACiAJCSIoZGVmYXVsdDogdHJ1ZSkiKTsKIAogaW50IGk5MTVfZW5hYmxlX3BwZ3R0IF9fcmVhZF9tb3N0bHkgPSAtMTsKLW1vZHVsZV9wYXJhbV9uYW1lZChpOTE1X2VuYWJsZV9wcGd0dCwgaTkxNV9lbmFibGVfcHBndHQsIGludCwgMDYwMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaTkxNV9lbmFibGVfcHBndHQsIGk5MTVfZW5hYmxlX3BwZ3R0LCBpbnQsIDA0MDApOwogTU9EVUxFX1BBUk1fREVTQyhpOTE1X2VuYWJsZV9wcGd0dCwKIAkJIkVuYWJsZSBQUEdUVCAoZGVmYXVsdDogdHJ1ZSkiKTsKIApAQCAtMTU1LDcgKzE1NSw2IEBACiAJCSJEaXNhYmxlIHBhZ2UgcHJlZmF1bHRpbmcgZm9yIHByZWFkL3B3cml0ZS9yZWxvYyAoZGVmYXVsdDpmYWxzZSkuIEZvciBkZXZlbG9wZXJzIG9ubHkuIik7CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXI7Ci1leHRlcm4gaW50IGludGVsX2FncF9lbmFibGVkOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2k4MzBfaW5mbyA9IHsKIAkuZ2VuID0gMiwgLmlzX21vYmlsZSA9IDEsIC5jdXJzb3JfbmVlZHNfcGh5c2ljYWwgPSAxLCAubnVtX3BpcGVzID0gMiwKQEAgLTE3Myw2ICsxNzIsNyBAQAogCS5nZW4gPSAyLCAuaXNfaTg1eCA9IDEsIC5pc19tb2JpbGUgPSAxLCAubnVtX3BpcGVzID0gMiwKIAkuY3Vyc29yX25lZWRzX3BoeXNpY2FsID0gMSwKIAkuaGFzX292ZXJsYXkgPSAxLCAub3ZlcmxheV9uZWVkc19waHlzaWNhbCA9IDEsCisJLmhhc19mYmMgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORywKIH07CiAKQEAgLTE5Miw2ICsxOTIsNyBAQAogCS5jdXJzb3JfbmVlZHNfcGh5c2ljYWwgPSAxLAogCS5oYXNfb3ZlcmxheSA9IDEsIC5vdmVybGF5X25lZWRzX3BoeXNpY2FsID0gMSwKIAkuc3VwcG9ydHNfdHYgPSAxLAorCS5oYXNfZmJjID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTQ1Z19pbmZvID0gewpAQCAtMjA0LDYgKzIwNSw3IEBACiAJLmhhc19ob3RwbHVnID0gMSwgLmN1cnNvcl9uZWVkc19waHlzaWNhbCA9IDEsCiAJLmhhc19vdmVybGF5ID0gMSwgLm92ZXJsYXlfbmVlZHNfcGh5c2ljYWwgPSAxLAogCS5zdXBwb3J0c190diA9IDEsCisJLmhhc19mYmMgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORywKIH07CiAKQEAgLTI2NSw2ICsyNjcsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9zYW5keWJyaWRnZV9kX2luZm8gPSB7CiAJLmdlbiA9IDYsIC5udW1fcGlwZXMgPSAyLAogCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAorCS5oYXNfZmJjID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HLAogCS5oYXNfbGxjID0gMSwKIH07CkBAIC0yODAsNiArMjgzLDcgQEAKICNkZWZpbmUgR0VON19GRUFUVVJFUyAgXAogCS5nZW4gPSA3LCAubnVtX3BpcGVzID0gMywgXAogCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLCBcCisJLmhhc19mYmMgPSAxLCBcCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcgfCBCTFRfUklORywgXAogCS5oYXNfbGxjID0gMQogCkBAIC0yOTIsNyArMjk2LDYgQEAKIAlHRU43X0ZFQVRVUkVTLAogCS5pc19pdnlicmlkZ2UgPSAxLAogCS5pc19tb2JpbGUgPSAxLAotCS5oYXNfZmJjID0gMSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaXZ5YnJpZGdlX3FfaW5mbyA9IHsKQEAgLTMwNyw2ICszMTAsNyBAQAogCS5udW1fcGlwZXMgPSAyLAogCS5pc192YWxsZXl2aWV3ID0gMSwKIAkuZGlzcGxheV9tbWlvX29mZnNldCA9IFZMVl9ESVNQTEFZX0JBU0UsCisJLmhhc19mYmMgPSAwLCAvKiBsZWdhbCwgbGFzdCBvbmUgd2lucyAqLwogCS5oYXNfbGxjID0gMCwgLyogbGVnYWwsIGxhc3Qgb25lIHdpbnMgKi8KIH07CiAKQEAgLTMxNSw2ICszMTksNyBAQAogCS5udW1fcGlwZXMgPSAyLAogCS5pc192YWxsZXl2aWV3ID0gMSwKIAkuZGlzcGxheV9tbWlvX29mZnNldCA9IFZMVl9ESVNQTEFZX0JBU0UsCisJLmhhc19mYmMgPSAwLCAvKiBsZWdhbCwgbGFzdCBvbmUgd2lucyAqLwogCS5oYXNfbGxjID0gMCwgLyogbGVnYWwsIGxhc3Qgb25lIHdpbnMgKi8KIH07CiAKQEAgLTMzMiwxMiArMzM3LDEwIEBACiAJLmlzX21vYmlsZSA9IDEsCiAJLmhhc19kZGkgPSAxLAogCS5oYXNfZnBnYV9kYmcgPSAxLAotCS5oYXNfZmJjID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HIHwgVkVCT1hfUklORywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfYnJvYWR3ZWxsX2RfaW5mbyA9IHsKLQkuaXNfcHJlbGltaW5hcnkgPSAxLAogCS5nZW4gPSA4LCAubnVtX3BpcGVzID0gMywKIAkubmVlZF9nZnhfaHdzID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HIHwgVkVCT1hfUklORywKQEAgLTM0Niw3ICszNDksNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9icm9hZHdlbGxfbV9pbmZvID0gewotCS5pc19wcmVsaW1pbmFyeSA9IDEsCiAJLmdlbiA9IDgsIC5pc19tb2JpbGUgPSAxLCAubnVtX3BpcGVzID0gMywKIAkubmVlZF9nZnhfaHdzID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HIHwgVkVCT1hfUklORywKQEAgLTQ3NiwxMiArNDc4LDEyIEBACiBib29sIGk5MTVfc2VtYXBob3JlX2lzX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA2KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogVW50aWwgd2UgZ2V0IGZ1cnRoZXIgdGVzdGluZy4uLiAqLwogCWlmIChJU19HRU44KGRldikpIHsKIAkJV0FSTl9PTighaTkxNV9wcmVsaW1pbmFyeV9od19zdXBwb3J0KTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlpZiAoaTkxNV9zZW1hcGhvcmVzID49IDApCkBAIC00OTMsNyArNDk1LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCBpOTE1X2RybV9mcmVlemUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTUwMSw2ICs1MDMsOCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOworCiAJLyogaWdub3JlIGxpZCBldmVudHMgZHVyaW5nIHN1c3BlbmQgKi8KIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX2xvY2spOwogCWRldl9wcml2LT5tb2Rlc2V0X3Jlc3RvcmUgPSBNT0RFU0VUX1NVU1BFTkRFRDsKQEAgLTY4OCw2ICs2OTIsOCBAQAogCW11dGV4X2xvY2soJmRldl9wcml2LT5tb2Rlc2V0X3Jlc3RvcmVfbG9jayk7CiAJZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZSA9IE1PREVTRVRfRE9ORTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5tb2Rlc2V0X3Jlc3RvcmVfbG9jayk7CisKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC03NjIsMTQgKzc2OCwxNCBAQAogCQlEUk1fSU5GTygiU2ltdWxhdGVkIGdwdSBoYW5nLCByZXNldHRpbmcgc3RvcF9yaW5nc1xuIik7CiAJCWRldl9wcml2LT5ncHVfZXJyb3Iuc3RvcF9yaW5ncyA9IDA7CiAJCWlmIChyZXQgPT0gLUVOT0RFVikgewotCQkJRFJNX0VSUk9SKCJSZXNldCBub3QgaW1wbGVtZW50ZWQsIGJ1dCBpZ25vcmluZyAiCi0JCQkJICAiZXJyb3IgZm9yIHNpbXVsYXRlZCBncHUgaGFuZ3NcbiIpOworCQkJRFJNX0lORk8oIlJlc2V0IG5vdCBpbXBsZW1lbnRlZCwgYnV0IGlnbm9yaW5nICIKKwkJCQkgImVycm9yIGZvciBzaW11bGF0ZWQgZ3B1IGhhbmdzXG4iKTsKIAkJCXJldCA9IDA7CiAJCX0KIAl9CiAKIAlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlc2V0IGNoaXAuXG4iKTsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVzZXQgY2hpcDogJWlcbiIsIHJldCk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTc5MCwxMiArNzk2LDkgQEAKIAkgKi8KIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSB8fAogCQkJIWRldl9wcml2LT51bXMubW1fc3VzcGVuZGVkKSB7Ci0JCWJvb2wgaHdfY29udGV4dHNfZGlzYWJsZWQgPSBkZXZfcHJpdi0+aHdfY29udGV4dHNfZGlzYWJsZWQ7CiAJCWRldl9wcml2LT51bXMubW1fc3VzcGVuZGVkID0gMDsKIAogCQlyZXQgPSBpOTE1X2dlbV9pbml0X2h3KGRldik7Ci0JCWlmICghaHdfY29udGV4dHNfZGlzYWJsZWQgJiYgZGV2X3ByaXYtPmh3X2NvbnRleHRzX2Rpc2FibGVkKQotCQkJRFJNX0VSUk9SKCJIVyBjb250ZXh0cyBkaWRuJ3Qgc3Vydml2ZSByZXNldFxuIik7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlpZiAocmV0KSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCBodyBpbml0IG9uIHJlc2V0ICVkXG4iLCByZXQpOwpAQCAtODMxLDE3ICs4MzQsNyBAQAogCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogV2UndmUgbWFuYWdlZCB0byBzaGlwIGEga21zLWVuYWJsZWQgZGR4IHRoYXQgc2hpcHBlZCB3aXRoIGFuIFh2TUMKLQkgKiBpbXBsZW1lbnRhdGlvbiBmb3IgZ2VuMyAoYW5kIG9ubHkgZ2VuMykgdGhhdCB1c2VkIGxlZ2FjeSBkcm0gbWFwcwotCSAqIChnYXNwISkgdG8gc2hhcmUgYnVmZmVycyBiZXR3ZWVuIFggYW5kIHRoZSBjbGllbnQuIEhlbmNlIHdlIG5lZWQgdG8KLQkgKiBrZWVwIGFyb3VuZCB0aGUgZmFrZSBhZ3Agc3R1ZmYgZm9yIGdlbjMsIGV2ZW4gd2hlbiBrbXMgaXMgZW5hYmxlZC4gKi8KLQlpZiAoaW50ZWxfaW5mby0+Z2VuICE9IDMpIHsKLQkJZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyAmPQotCQkJfihEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCk7Ci0JfSBlbHNlIGlmICghaW50ZWxfYWdwX2VuYWJsZWQpIHsKLQkJRFJNX0VSUk9SKCJkcm0vaTkxNSBjYW4ndCB3b3JrIHdpdGhvdXQgaW50ZWxfYWdwIG1vZHVsZSFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyAmPSB+KERSSVZFUl9VU0VfQUdQKTsKIAogCXJldHVybiBkcm1fZ2V0X3BjaV9kZXYocGRldiwgZW50LCAmZHJpdmVyKTsKIH0KQEAgLTkxNSw2ICs5MDgsNDkgQEAKIAlyZXR1cm4gaTkxNV9kcm1fZnJlZXplKGRybV9kZXYpOwogfQogCitzdGF0aWMgaW50IGk5MTVfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlXQVJOX09OKCFIQVNfUlVOVElNRV9QTShkZXYpKTsKKworCURSTV9ERUJVR19LTVMoIlN1c3BlbmRpbmcgZGV2aWNlXG4iKTsKKworCWk5MTVfZ2VtX3JlbGVhc2VfYWxsX21tYXBzKGRldl9wcml2KTsKKworCWRlbF90aW1lcl9zeW5jKCZkZXZfcHJpdi0+Z3B1X2Vycm9yLmhhbmdjaGVja190aW1lcik7CisJZGV2X3ByaXYtPnBtLnN1c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIGN1cnJlbnQgdmVyc2lvbnMgb2YgZmlybXdhcmUgd2hpY2ggZGVwZW5kIG9uIHRoaXMgb3ByZWdpb24KKwkgKiBub3RpZmljYXRpb24gaGF2ZSByZXB1cnBvc2VkIHRoZSBEMSBkZWZpbml0aW9uIHRvIG1lYW4KKwkgKiAicnVudGltZSBzdXNwZW5kZWQiIHZzLiB3aGF0IHlvdSB3b3VsZCBub3JtYWxseSBleHBlY3QgKEQzKQorCSAqIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gbm90aWZpY2F0aW9ucyB0aGF0IG1pZ2h0IGJlIHNlbnQKKwkgKiB2aWEgdGhlIHN1c3BlbmQgcGF0aC4KKwkgKi8KKwlpbnRlbF9vcHJlZ2lvbl9ub3RpZnlfYWRhcHRlcihkZXYsIFBDSV9EMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlXQVJOX09OKCFIQVNfUlVOVElNRV9QTShkZXYpKTsKKworCURSTV9ERUJVR19LTVMoIlJlc3VtaW5nIGRldmljZVxuIik7CisKKwlpbnRlbF9vcHJlZ2lvbl9ub3RpZnlfYWRhcHRlcihkZXYsIFBDSV9EMCk7CisJZGV2X3ByaXYtPnBtLnN1c3BlbmRlZCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpOTE1X3BtX29wcyA9IHsKIAkuc3VzcGVuZCA9IGk5MTVfcG1fc3VzcGVuZCwKIAkucmVzdW1lID0gaTkxNV9wbV9yZXN1bWUsCkBAIC05MjIsNiArOTU4LDggQEAKIAkudGhhdyA9IGk5MTVfcG1fdGhhdywKIAkucG93ZXJvZmYgPSBpOTE1X3BtX3Bvd2Vyb2ZmLAogCS5yZXN0b3JlID0gaTkxNV9wbV9yZXN1bWUsCisJLnJ1bnRpbWVfc3VzcGVuZCA9IGk5MTVfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IGk5MTVfcnVudGltZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGk5MTVfZ2VtX3ZtX29wcyA9IHsKQEAgLTk0OSw3ICs5ODcsNyBAQAogCSAqIGRlYWwgd2l0aCB0aGVtIGZvciBJbnRlbCBoYXJkd2FyZS4KIAkgKi8KIAkuZHJpdmVyX2ZlYXR1cmVzID0KLQkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfAorCSAgICBEUklWRVJfVVNFX0FHUCB8CiAJICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0dFTSB8IERSSVZFUl9QUklNRSB8CiAJICAgIERSSVZFUl9SRU5ERVIsCiAJLmxvYWQgPSBpOTE1X2RyaXZlcl9sb2FkLApAQCAtMTAyNCwxNCArMTA2MiwyNCBAQAogCQlkcml2ZXIuZHJpdmVyX2ZlYXR1cmVzICY9IH5EUklWRVJfTU9ERVNFVDsKICNlbmRpZgogCi0JaWYgKCEoZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9NT0RFU0VUKSkKKwlpZiAoIShkcml2ZXIuZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX01PREVTRVQpKSB7CiAJCWRyaXZlci5nZXRfdmJsYW5rX3RpbWVzdGFtcCA9IE5VTEw7CisjaWZuZGVmIENPTkZJR19EUk1fSTkxNV9VTVMKKwkJLyogU2lsZW50bHkgZmFpbCBsb2FkaW5nIHRvIG5vdCB1cHNldCB1c2Vyc3BhY2UuICovCisJCXJldHVybiAwOworI2VuZGlmCisJfQogCiAJcmV0dXJuIGRybV9wY2lfaW5pdCgmZHJpdmVyLCAmaTkxNV9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGk5MTVfZXhpdCh2b2lkKQogeworI2lmbmRlZiBDT05GSUdfRFJNX0k5MTVfVU1TCisJaWYgKCEoZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuOyAvKiBOZXZlciBsb2FkZWQgYSBkcml2ZXIuICovCisjZW5kaWYKKwogCWRybV9wY2lfZXhpdCgmZHJpdmVyLCAmaTkxNV9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggMWNhYTVlMy4uNGEyYmY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC04OSw2ICs4OSwxOCBAQAogfTsKICNkZWZpbmUgcG9ydF9uYW1lKHApICgocCkgKyAnQScpCiAKKyNkZWZpbmUgSTkxNV9OVU1fUEhZU19WTFYgMQorCitlbnVtIGRwaW9fY2hhbm5lbCB7CisJRFBJT19DSDAsCisJRFBJT19DSDEKK307CisKK2VudW0gZHBpb19waHkgeworCURQSU9fUEhZMCwKKwlEUElPX1BIWTEKK307CisKIGVudW0gaW50ZWxfZGlzcGxheV9wb3dlcl9kb21haW4gewogCVBPV0VSX0RPTUFJTl9QSVBFX0EsCiAJUE9XRVJfRE9NQUlOX1BJUEVfQiwKQEAgLTEwMSw2ICsxMTMsNyBAQAogCVBPV0VSX0RPTUFJTl9UUkFOU0NPREVSX0MsCiAJUE9XRVJfRE9NQUlOX1RSQU5TQ09ERVJfRURQLAogCVBPV0VSX0RPTUFJTl9WR0EsCisJUE9XRVJfRE9NQUlOX0FVRElPLAogCVBPV0VSX0RPTUFJTl9JTklULAogCiAJUE9XRVJfRE9NQUlOX05VTSwKQEAgLTMxMCwxMyArMzIzLDE0IEBACiAJdTMyIGluc3Rwc1tJOTE1X05VTV9SSU5HU107CiAJdTMyIGV4dHJhX2luc3Rkb25lW0k5MTVfTlVNX0lOU1RET05FX1JFR107CiAJdTMyIHNlcW5vW0k5MTVfTlVNX1JJTkdTXTsKLQl1NjQgYmJhZGRyOworCXU2NCBiYmFkZHJbSTkxNV9OVU1fUklOR1NdOwogCXUzMiBmYXVsdF9yZWdbSTkxNV9OVU1fUklOR1NdOwogCXUzMiBkb25lX3JlZzsKIAl1MzIgZmFkZHJbSTkxNV9OVU1fUklOR1NdOwogCXU2NCBmZW5jZVtJOTE1X01BWF9OVU1fRkVOQ0VTXTsKIAlzdHJ1Y3QgdGltZXZhbCB0aW1lOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9yaW5nIHsKKwkJYm9vbCB2YWxpZDsKIAkJc3RydWN0IGRybV9pOTE1X2Vycm9yX29iamVjdCB7CiAJCQlpbnQgcGFnZV9jb3VudDsKIAkJCXUzMiBndHRfb2Zmc2V0OwpAQCAtMzUxLDYgKzM2NSw3IEBACiAJZW51bSBpbnRlbF9yaW5nX2hhbmdjaGVja19hY3Rpb24gaGFuZ2NoZWNrX2FjdGlvbltJOTE1X05VTV9SSU5HU107CiB9OwogCitzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yOwogc3RydWN0IGludGVsX2NydGNfY29uZmlnOwogc3RydWN0IGludGVsX2NydGM7CiBzdHJ1Y3QgaW50ZWxfbGltaXQ7CkBAIC0zNTgsNyArMzczLDcgQEAKIAogc3RydWN0IGRybV9pOTE1X2Rpc3BsYXlfZnVuY3MgewogCWJvb2wgKCpmYmNfZW5hYmxlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmVuYWJsZV9mYmMpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCk7CisJdm9pZCAoKmVuYWJsZV9mYmMpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAoKmRpc2FibGVfZmJjKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAlpbnQgKCpnZXRfZGlzcGxheV9jbG9ja19zcGVlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJaW50ICgqZ2V0X2ZpZm9fc2l6ZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKTsKQEAgLTQxMywxMSArNDI4LDIwIEBACiAJLyogcmVuZGVyIGNsb2NrIGluY3JlYXNlL2RlY3JlYXNlICovCiAJLyogZGlzcGxheSBjbG9jayBpbmNyZWFzZS9kZWNyZWFzZSAqLwogCS8qIHBsbCBjbG9jayBpbmNyZWFzZS9kZWNyZWFzZSAqLworCisJaW50ICgqc2V0dXBfYmFja2xpZ2h0KShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpOworCXVpbnQzMl90ICgqZ2V0X2JhY2tsaWdodCkoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKwl2b2lkICgqc2V0X2JhY2tsaWdodCkoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICAgICAgdWludDMyX3QgbGV2ZWwpOworCXZvaWQgKCpkaXNhYmxlX2JhY2tsaWdodCkoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKwl2b2lkICgqZW5hYmxlX2JhY2tsaWdodCkoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIH07CiAKIHN0cnVjdCBpbnRlbF91bmNvcmVfZnVuY3MgewotCXZvaWQgKCpmb3JjZV93YWtlX2dldCkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLQl2b2lkICgqZm9yY2Vfd2FrZV9wdXQpKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CisJdm9pZCAoKmZvcmNlX3dha2VfZ2V0KShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCQkJaW50IGZ3X2VuZ2luZSk7CisJdm9pZCAoKmZvcmNlX3dha2VfcHV0KShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCQkJaW50IGZ3X2VuZ2luZSk7CiAKIAl1aW50OF90ICAoKm1taW9fcmVhZGIpKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgb2ZmX3Qgb2Zmc2V0LCBib29sIHRyYWNlKTsKIAl1aW50MTZfdCAoKm1taW9fcmVhZHcpKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgb2ZmX3Qgb2Zmc2V0LCBib29sIHRyYWNlKTsKQEAgLTQ0Miw2ICs0NjYsOSBAQAogCXVuc2lnbmVkIGZpZm9fY291bnQ7CiAJdW5zaWduZWQgZm9yY2V3YWtlX2NvdW50OwogCisJdW5zaWduZWQgZndfcmVuZGVyY291bnQ7CisJdW5zaWduZWQgZndfbWVkaWFjb3VudDsKKwogCXN0cnVjdCBkZWxheWVkX3dvcmsgZm9yY2Vfd2FrZV93b3JrOwogfTsKIApAQCAtNjY5LDcgKzY5Niw2IEBACiAJCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAkJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKLQkJaW50IGludGVydmFsOwogCX0gKmZiY193b3JrOwogCiAJZW51bSBub19mYmNfcmVhc29uIHsKQEAgLTcwOCw3ICs3MzQsNiBAQAogI2RlZmluZSBRVUlSS19QSVBFQV9GT1JDRSAoMTw8MCkKICNkZWZpbmUgUVVJUktfTFZEU19TU0NfRElTQUJMRSAoMTw8MSkKICNkZWZpbmUgUVVJUktfSU5WRVJUX0JSSUdIVE5FU1MgKDE8PDIpCi0jZGVmaW5lIFFVSVJLX05PX1BDSF9QV01fRU5BQkxFICgxPDwzKQogCiBzdHJ1Y3QgaW50ZWxfZmJkZXY7CiBzdHJ1Y3QgaW50ZWxfZmJjX3dvcms7CkBAIC03NjEsOCArNzg2LDYgQEAKIAl1MzIgc2F2ZUJMQ19QV01fQ1RMOwogCXUzMiBzYXZlQkxDX1BXTV9DVEwyOwogCXUzMiBzYXZlQkxDX0hJU1RfQ1RMX0I7Ci0JdTMyIHNhdmVCTENfUFdNX0NUTF9COwotCXUzMiBzYXZlQkxDX1BXTV9DVEwyX0I7CiAJdTMyIHNhdmVCTENfQ1BVX1BXTV9DVEw7CiAJdTMyIHNhdmVCTENfQ1BVX1BXTV9DVEwyOwogCXUzMiBzYXZlRlBCMDsKQEAgLTkzMiwyMSArOTU1LDI5IEBACiAKIC8qIFBvd2VyIHdlbGwgc3RydWN0dXJlIGZvciBoYXN3ZWxsICovCiBzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsIHsKKwljb25zdCBjaGFyICpuYW1lOworCWJvb2wgYWx3YXlzX29uOwogCS8qIHBvd2VyIHdlbGwgZW5hYmxlL2Rpc2FibGUgdXNhZ2UgY291bnQgKi8KIAlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBkb21haW5zOworCXZvaWQgKmRhdGE7CisJdm9pZCAoKnNldCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGk5MTVfcG93ZXJfd2VsbCAqcG93ZXJfd2VsbCwKKwkJICAgIGJvb2wgZW5hYmxlKTsKKwlib29sICgqaXNfZW5hYmxlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGwpOwogfTsKIAotI2RlZmluZSBJOTE1X01BWF9QT1dFUl9XRUxMUyAxCi0KIHN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgewogCS8qCiAJICogUG93ZXIgd2VsbHMgbmVlZGVkIGZvciBpbml0aWFsaXphdGlvbiBhdCBkcml2ZXIgaW5pdCBhbmQgc3VzcGVuZAogCSAqIHRpbWUgYXJlIG9uLiBUaGV5IGFyZSBrZXB0IG9uIHVudGlsIGFmdGVyIHRoZSBmaXJzdCBtb2Rlc2V0LgogCSAqLwogCWJvb2wgaW5pdF9wb3dlcl9vbjsKKwlpbnQgcG93ZXJfd2VsbF9jb3VudDsKIAogCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgcG93ZXJfd2VsbHNbSTkxNV9NQVhfUE9XRVJfV0VMTFNdOworCWludCBkb21haW5fdXNlX2NvdW50W1BPV0VSX0RPTUFJTl9OVU1dOworCXN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGxzOwogfTsKIAogc3RydWN0IGk5MTVfZHJpMV9zdGF0ZSB7CkBAIC0xMDc3LDM0ICsxMTA4LDMwIEBACiAJdW5zaWduZWQgbG9uZyBtaXNzZWRfaXJxX3JpbmdzOwogCiAJLyoqCi0JICogU3RhdGUgdmFyaWFibGUgYW5kIHJlc2V0IGNvdW50ZXIgY29udHJvbGxpbmcgdGhlIHJlc2V0IGZsb3cKKwkgKiBTdGF0ZSB2YXJpYWJsZSBjb250cm9sbGluZyB0aGUgcmVzZXQgZmxvdyBhbmQgY291bnQKIAkgKgotCSAqIFVwcGVyIGJpdHMgYXJlIGZvciB0aGUgcmVzZXQgY291bnRlci4gIFRoaXMgY291bnRlciBpcyB1c2VkIGJ5IHRoZQotCSAqIHdhaXRfc2Vxbm8gY29kZSB0byByYWNlLWZyZWUgbm90aWNlZCB0aGF0IGEgcmVzZXQgZXZlbnQgaGFwcGVuZWQgYW5kCi0JICogdGhhdCBpdCBuZWVkcyB0byByZXN0YXJ0IHRoZSBlbnRpcmUgaW9jdGwgKHNpbmNlIG1vc3QgbGlrZWx5IHRoZQotCSAqIHNlcW5vIGl0IHdhaXRlZCBmb3Igd29uJ3QgZXZlciBzaWduYWwgYW55dGltZSBzb29uKS4KKwkgKiBUaGlzIGlzIGEgY291bnRlciB3aGljaCBnZXRzIGluY3JlbWVudGVkIHdoZW4gcmVzZXQgaXMgdHJpZ2dlcmVkLAorCSAqIGFuZCBhZ2FpbiB3aGVuIHJlc2V0IGhhcyBiZWVuIGhhbmRsZWQuIFNvIG9kZCB2YWx1ZXMgKGxvd2VzdCBiaXQgc2V0KQorCSAqIG1lYW5zIHRoYXQgcmVzZXQgaXMgaW4gcHJvZ3Jlc3MgYW5kIGV2ZW4gdmFsdWVzIHRoYXQKKwkgKiAocmVzZXRfY291bnRlciA+PiAxKTp0aCByZXNldCB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKwkgKgorCSAqIElmIHJlc2V0IGlzIG5vdCBjb21wbGV0ZWQgc3VjY2VzZnVsbHksIHRoZSBJOTE1X1dFREdFIGJpdCBpcworCSAqIHNldCBtZWFuaW5nIHRoYXQgaGFyZHdhcmUgaXMgdGVybWluYWxseSBzb3VyIGFuZCB0aGVyZSBpcyBubworCSAqIHJlY292ZXJ5LiBBbGwgd2FpdGVycyBvbiB0aGUgcmVzZXRfcXVldWUgd2lsbCBiZSB3b2tlbiB3aGVuCisJICogdGhhdCBoYXBwZW5zLgorCSAqCisJICogVGhpcyBjb3VudGVyIGlzIHVzZWQgYnkgdGhlIHdhaXRfc2Vxbm8gY29kZSB0byBub3RpY2UgdGhhdCByZXNldAorCSAqIGV2ZW50IGhhcHBlbmVkIGFuZCBpdCBuZWVkcyB0byByZXN0YXJ0IHRoZSBlbnRpcmUgaW9jdGwgKHNpbmNlIG1vc3QKKwkgKiBsaWtlbHkgdGhlIHNlcW5vIGl0IHdhaXRlZCBmb3Igd29uJ3QgZXZlciBzaWduYWwgYW55dGltZSBzb29uKS4KIAkgKgogCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBsb2NrLWZyZWUgd2FpdCBwYXRocywgd2hlcmUgbm8gY29udGVuZGVkIGxvY2sKIAkgKiBuYXR1cmFsbHkgZW5mb3JjZXMgdGhlIGNvcnJlY3Qgb3JkZXJpbmcgYmV0d2VlbiB0aGUgYmFpbC1vdXQgb2YgdGhlCiAJICogd2FpdGVyIGFuZCB0aGUgZ3B1IHJlc2V0IHdvcmsgY29kZS4KLQkgKgotCSAqIExvd2VzdCBiaXQgY29udHJvbHMgdGhlIHJlc2V0IHN0YXRlIG1hY2hpbmU6IFNldCBtZWFucyBhIHJlc2V0IGlzIGluCi0JICogcHJvZ3Jlc3MuIFRoaXMgc3RhdGUgd2lsbCAocHJlc3VtaW5nIHdlIGRvbid0IGhhdmUgYW55IGJ1Z3MpIGRlY2F5Ci0JICogaW50byBlaXRoZXIgdW5zZXQgKHN1Y2Nlc3NmdWwgcmVzZXQpIG9yIHRoZSBzcGVjaWFsIFdFREdFRCB2YWx1ZSAoaHcKLQkgKiB0ZXJtaW5hbGx5IHNvdXIpLiBBbGwgd2FpdGVycyBvbiB0aGUgcmVzZXRfcXVldWUgd2lsbCBiZSB3b2tlbiB3aGVuCi0JICogdGhhdCBoYXBwZW5zLgogCSAqLwogCWF0b21pY190IHJlc2V0X2NvdW50ZXI7CiAKLQkvKioKLQkgKiBTcGVjaWFsIHZhbHVlcy9mbGFncyBmb3IgcmVzZXRfY291bnRlcgotCSAqCi0JICogTm90ZSB0aGF0IHRoZSBjb2RlIHJlbGllcyBvbgotCSAqIAlJOTE1X1dFREdFRCAmIEk5MTVfUkVTRVRfSU5fUFJPR1JFU1NfRkxBRwotCSAqIGJlaW5nIHRydWUuCi0JICovCiAjZGVmaW5lIEk5MTVfUkVTRVRfSU5fUFJPR1JFU1NfRkxBRwkxCi0jZGVmaW5lIEk5MTVfV0VER0VECQkJMHhmZmZmZmZmZgorI2RlZmluZSBJOTE1X1dFREdFRAkJCSgxIDw8IDMxKQogCiAJLyoqCiAJICogV2FpdHF1ZXVlIHRvIHNpZ25hbCB3aGVuIHRoZSByZXNldCBoYXMgY29tcGxldGVkLiBVc2VkIGJ5IGNsaWVudHMKQEAgLTExNTgsNiArMTE4NSwxMSBAQAogCWludCBlZHBfYnBwOwogCXN0cnVjdCBlZHBfcG93ZXJfc2VxIGVkcF9wcHM7CiAKKwlzdHJ1Y3QgeworCQl1MTYgcHdtX2ZyZXFfaHo7CisJCWJvb2wgYWN0aXZlX2xvd19wd207CisJfSBiYWNrbGlnaHQ7CisKIAkvKiBNSVBJIERTSSAqLwogCXN0cnVjdCB7CiAJCXUxNiBwYW5lbF9pZDsKQEAgLTExODQsNyArMTIxNiw3IEBACiAJdWludDMyX3QgZmJjX3ZhbDsKIH07CiAKLXN0cnVjdCBoc3dfd21fdmFsdWVzIHsKK3N0cnVjdCBpbGtfd21fdmFsdWVzIHsKIAl1aW50MzJfdCB3bV9waXBlWzNdOwogCXVpbnQzMl90IHdtX2xwWzNdOwogCXVpbnQzMl90IHdtX2xwX3NwclszXTsKQEAgLTEyNjIsNiArMTI5NCwxMCBAQAogCX0gcmVnc2F2ZTsKIH07CiAKK3N0cnVjdCBpOTE1X3J1bnRpbWVfcG0geworCWJvb2wgc3VzcGVuZGVkOworfTsKKwogZW51bSBpbnRlbF9waXBlX2NyY19zb3VyY2UgewogCUlOVEVMX1BJUEVfQ1JDX1NPVVJDRV9OT05FLAogCUlOVEVMX1BJUEVfQ1JDX1NPVVJDRV9QTEFORTEsCkBAIC0xMzY2LDE1ICsxNDAyLDkgQEAKIAogCS8qIG92ZXJsYXkgKi8KIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKLQl1bnNpZ25lZCBpbnQgc3ByaXRlX3NjYWxpbmdfZW5hYmxlZDsKIAotCS8qIGJhY2tsaWdodCAqLwotCXN0cnVjdCB7Ci0JCWludCBsZXZlbDsKLQkJYm9vbCBlbmFibGVkOwotCQlzcGlubG9ja190IGxvY2s7IC8qIGJsIHJlZ2lzdGVycyBhbmQgdGhlIGFib3ZlIGJsIGZpZWxkcyAqLwotCQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqZGV2aWNlOwotCX0gYmFja2xpZ2h0OworCS8qIGJhY2tsaWdodCByZWdpc3RlcnMgYW5kIGZpZWxkcyBpbiBzdHJ1Y3QgaW50ZWxfcGFuZWwgKi8KKwlzcGlubG9ja190IGJhY2tsaWdodF9sb2NrOwogCiAJLyogTFZEUyBpbmZvICovCiAJYm9vbCBub19hdXhfaGFuZHNoYWtlOwpAQCAtMTQyNiw2ICsxNDU2LDcgQEAKIAlpbnQgbnVtX3NoYXJlZF9kcGxsOwogCXN0cnVjdCBpbnRlbF9zaGFyZWRfZHBsbCBzaGFyZWRfZHBsbHNbSTkxNV9OVU1fUExMU107CiAJc3RydWN0IGludGVsX2RkaV9wbGxzIGRkaV9wbGxzOworCWludCBkcGlvX3BoeV9pb3NmX3BvcnRbSTkxNV9OVU1fUEhZU19WTFZdOwogCiAJLyogUmVjbG9ja2luZyBzdXBwb3J0ICovCiAJYm9vbCByZW5kZXJfcmVjbG9ja19hdmFpbDsKQEAgLTE0NzAsNyArMTUwMSw2IEBACiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIAotCWJvb2wgaHdfY29udGV4dHNfZGlzYWJsZWQ7CiAJdWludDMyX3QgaHdfY29udGV4dF9zaXplOwogCXN0cnVjdCBsaXN0X2hlYWQgY29udGV4dF9saXN0OwogCkBAIC0xNDkyLDExICsxNTIyLDEzIEBACiAJCXVpbnQxNl90IGN1cl9sYXRlbmN5WzVdOwogCiAJCS8qIGN1cnJlbnQgaGFyZHdhcmUgc3RhdGUgKi8KLQkJc3RydWN0IGhzd193bV92YWx1ZXMgaHc7CisJCXN0cnVjdCBpbGtfd21fdmFsdWVzIGh3OwogCX0gd207CiAKIAlzdHJ1Y3QgaTkxNV9wYWNrYWdlX2M4IHBjODsKIAorCXN0cnVjdCBpOTE1X3J1bnRpbWVfcG0gcG07CisKIAkvKiBPbGQgZHJpMSBzdXBwb3J0IGluZnJhc3RydWN0dXJlLCBiZXdhcmUgdGhlIGRyYWdvbnMgeWEgZm9vbHMgZW50ZXJpbmcKIAkgKiBoZXJlISAqLwogCXN0cnVjdCBpOTE1X2RyaTFfc3RhdGUgZHJpMTsKQEAgLTE4MTMsMTUgKzE4NDUsMTUgQEAKIAogI2RlZmluZSBIQVNfRldfQkxDKGRldikgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gMikKICNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19waXBlX2N4c3IpCi0jZGVmaW5lIEk5MTVfSEFTX0ZCQyhkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19mYmMpCisjZGVmaW5lIEhBU19GQkMoZGV2KSAoSU5URUxfSU5GTyhkZXYpLT5oYXNfZmJjKQogCiAjZGVmaW5lIEhBU19JUFMoZGV2KQkJKElTX1VMVChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQogCiAjZGVmaW5lIEhBU19EREkoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aGFzX2RkaSkKLSNkZWZpbmUgSEFTX1BPV0VSX1dFTEwoZGV2KQkoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQogI2RlZmluZSBIQVNfRlBHQV9EQkdfVU5DTEFJTUVEKGRldikJKElOVEVMX0lORk8oZGV2KS0+aGFzX2ZwZ2FfZGJnKQogI2RlZmluZSBIQVNfUFNSKGRldikJCShJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCiAjZGVmaW5lIEhBU19QQzgoZGV2KQkJKElTX0hBU1dFTEwoZGV2KSkgLyogWFhYIEhTVzpVTFggKi8KKyNkZWZpbmUgSEFTX1JVTlRJTUVfUE0oZGV2KQkoSVNfSEFTV0VMTChkZXYpKQogCiAjZGVmaW5lIElOVEVMX1BDSF9ERVZJQ0VfSURfTUFTSwkJMHhmZjAwCiAjZGVmaW5lIElOVEVMX1BDSF9JQlhfREVWSUNFX0lEX1RZUEUJCTB4M2IwMApAQCAtMTkxMSw3ICsxOTQzLDYgQEAKIGV4dGVybiB2b2lkIGludGVsX3VuY29yZV9zYW5pdGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX3VuY29yZV9lYXJseV9zYW5pdGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX3VuY29yZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaW50ZWxfdW5jb3JlX2NsZWFyX2Vycm9ycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX3VuY29yZV9jaGVja19lcnJvcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF91bmNvcmVfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIApAQCAtMTk4Nyw2ICsyMDE4LDcgQEAKIGludCBfX211c3RfY2hlY2sgaTkxNV92bWFfdW5iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKIGludCBfX211c3RfY2hlY2sgaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5iaW5kKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogaW50IGk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfYWxsX21tYXBzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIHZvaWQgaTkxNV9nZW1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCkBAIC0yMDYzLDEyICsyMDk1LDE3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9yZXNldF9pbl9wcm9ncmVzcyhzdHJ1Y3QgaTkxNV9ncHVfZXJyb3IgKmVycm9yKQogewogCXJldHVybiB1bmxpa2VseShhdG9taWNfcmVhZCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIpCi0JCQkmIEk5MTVfUkVTRVRfSU5fUFJPR1JFU1NfRkxBRyk7CisJCQkmIChJOTE1X1JFU0VUX0lOX1BST0dSRVNTX0ZMQUcgfCBJOTE1X1dFREdFRCkpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV90ZXJtaW5hbGx5X3dlZGdlZChzdHJ1Y3QgaTkxNV9ncHVfZXJyb3IgKmVycm9yKQogewotCXJldHVybiBhdG9taWNfcmVhZCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIpID09IEk5MTVfV0VER0VEOworCXJldHVybiBhdG9taWNfcmVhZCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIpICYgSTkxNV9XRURHRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGk5MTVfcmVzZXRfY291bnQoc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvcikKK3sKKwlyZXR1cm4gKChhdG9taWNfcmVhZCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIpICYgfkk5MTVfV0VER0VEKSArIDEpIC8gMjsKIH0KIAogdm9pZCBpOTE1X2dlbV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTIxODAsNyArMjIxNyw3IEBACiB9CiAKIC8qIGk5MTVfZ2VtX2NvbnRleHQuYyAqLwotdm9pZCBpOTE1X2dlbV9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9nZW1fY29udGV4dF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBpOTE1X2dlbV9jb250ZXh0X2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiBpbnQgaTkxNV9zd2l0Y2hfY29udGV4dChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCkBAIC0yMzk5LDYgKzI0MzYsOCBAQAogZXh0ZXJuIGJvb2wgaTkxNV9zZW1hcGhvcmVfaXNfZW5hYmxlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBpOTE1X3JlZ19yZWFkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOworaW50IGk5MTVfZ2V0X3Jlc2V0X3N0YXRzX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKTsKIAogLyogb3ZlcmxheSAqLwogZXh0ZXJuIHN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0YXRlICppbnRlbF9vdmVybGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0yNDE0LDggKzI0NTMsOCBAQAogICogbXVzdCBiZSBzZXQgdG8gcHJldmVudCBHVCBjb3JlIGZyb20gcG93ZXIgZG93biBhbmQgc3RhbGUgdmFsdWVzIGJlaW5nCiAgKiByZXR1cm5lZC4KICAqLwotdm9pZCBnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Ci12b2lkIGdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK3ZvaWQgZ2VuNl9ndF9mb3JjZV93YWtlX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBmd19lbmdpbmUpOwordm9pZCBnZW42X2d0X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGZ3X2VuZ2luZSk7CiAKIGludCBzYW5keWJyaWRnZV9wY29kZV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTggbWJveCwgdTMyICp2YWwpOwogaW50IHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTggbWJveCwgdTMyIHZhbCk7CkBAIC0yNDMwLDYgKzI0NjksOCBAQAogdm9pZCB2bHZfY2NrX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdTMyIHZhbCk7CiB1MzIgdmx2X2NjdV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZyk7CiB2b2lkIHZsdl9jY3Vfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKTsKK3UzMiB2bHZfYnVuaXRfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpOwordm9pZCB2bHZfYnVuaXRfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKTsKIHUzMiB2bHZfZ3BzX2NvcmVfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpOwogdm9pZCB2bHZfZ3BzX2NvcmVfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKTsKIHUzMiB2bHZfZHBpb19yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgZW51bSBwaXBlIHBpcGUsIGludCByZWcpOwpAQCAtMjQzOCw5ICsyNDc5LDMwIEBACiAJCSAgIGVudW0gaW50ZWxfc2JpX2Rlc3RpbmF0aW9uIGRlc3RpbmF0aW9uKTsKIHZvaWQgaW50ZWxfc2JpX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTE2IHJlZywgdTMyIHZhbHVlLAogCQkgICAgIGVudW0gaW50ZWxfc2JpX2Rlc3RpbmF0aW9uIGRlc3RpbmF0aW9uKTsKK3UzMiB2bHZfZmxpc2RzaV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZyk7Cit2b2lkIHZsdl9mbGlzZHNpX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdTMyIHZhbCk7CiAKLWludCB2bHZfZ3B1X2ZyZXEoaW50IGRkcl9mcmVxLCBpbnQgdmFsKTsKLWludCB2bHZfZnJlcV9vcGNvZGUoaW50IGRkcl9mcmVxLCBpbnQgdmFsKTsKK2ludCB2bHZfZ3B1X2ZyZXEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgdmFsKTsKK2ludCB2bHZfZnJlcV9vcGNvZGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgdmFsKTsKKwordm9pZCB2bHZfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgZndfZW5naW5lKTsKK3ZvaWQgdmx2X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGZ3X2VuZ2luZSk7CisKKyNkZWZpbmUgRk9SQ0VXQUtFX1ZMVl9SRU5ERVJfUkFOR0VfT0ZGU0VUKHJlZykgXAorCSgoKHJlZykgPj0gMHgyMDAwICYmIChyZWcpIDwgMHg0MDAwKSB8fFwKKwkoKHJlZykgPj0gMHg1MDAwICYmIChyZWcpIDwgMHg4MDAwKSB8fFwKKwkoKHJlZykgPj0gMHhCMDAwICYmIChyZWcpIDwgMHgxMjAwMCkgfHxcCisJKChyZWcpID49IDB4MkUwMDAgJiYgKHJlZykgPCAweDMwMDAwKSkKKworI2RlZmluZSBGT1JDRVdBS0VfVkxWX01FRElBX1JBTkdFX09GRlNFVChyZWcpXAorCSgoKHJlZykgPj0gMHgxMjAwMCAmJiAocmVnKSA8IDB4MTQwMDApIHx8XAorCSgocmVnKSA+PSAweDIyMDAwICYmIChyZWcpIDwgMHgyNDAwMCkgfHxcCisJKChyZWcpID49IDB4MzAwMDAgJiYgKHJlZykgPCAweDQwMDAwKSkKKworI2RlZmluZSBGT1JDRVdBS0VfUkVOREVSCSgxIDw8IDApCisjZGVmaW5lIEZPUkNFV0FLRV9NRURJQQkJKDEgPDwgMSkKKyNkZWZpbmUgRk9SQ0VXQUtFX0FMTAkJKEZPUkNFV0FLRV9SRU5ERVIgfCBGT1JDRVdBS0VfTUVESUEpCisKIAogI2RlZmluZSBJOTE1X1JFQUQ4KHJlZykJCWRldl9wcml2LT51bmNvcmUuZnVuY3MubW1pb19yZWFkYihkZXZfcHJpdiwgKHJlZyksIHRydWUpCiAjZGVmaW5lIEk5MTVfV1JJVEU4KHJlZywgdmFsKQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLm1taW9fd3JpdGViKGRldl9wcml2LCAocmVnKSwgKHZhbCksIHRydWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCA3NmQzZDFhLi4wMGM4MzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTEwMTUsOSArMTAxNSwxMSBAQAogCQkJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOworCWNvbnN0IGJvb2wgaXJxX3Rlc3RfaW5fcHJvZ3Jlc3MgPQorCQlBQ0NFU1NfT05DRShkZXZfcHJpdi0+Z3B1X2Vycm9yLnRlc3RfaXJxX3JpbmdzKSAmIGludGVsX3JpbmdfZmxhZyhyaW5nKTsKIAlzdHJ1Y3QgdGltZXNwZWMgYmVmb3JlLCBub3c7CiAJREVGSU5FX1dBSVQod2FpdCk7Ci0JbG9uZyB0aW1lb3V0X2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X2V4cGlyZTsKIAlpbnQgcmV0OwogCiAJV0FSTihkZXZfcHJpdi0+cGM4LmlycXNfZGlzYWJsZWQsICJJUlFzIGRpc2FibGVkXG4iKTsKQEAgLTEwMjUsNyArMTAyNyw3IEBACiAJaWYgKGk5MTVfc2Vxbm9fcGFzc2VkKHJpbmctPmdldF9zZXFubyhyaW5nLCB0cnVlKSwgc2Vxbm8pKQogCQlyZXR1cm4gMDsKIAotCXRpbWVvdXRfamlmZmllcyA9IHRpbWVvdXQgPyB0aW1lc3BlY190b19qaWZmaWVzX3RpbWVvdXQodGltZW91dCkgOiAxOworCXRpbWVvdXRfZXhwaXJlID0gdGltZW91dCA/IGppZmZpZXMgKyB0aW1lc3BlY190b19qaWZmaWVzX3RpbWVvdXQodGltZW91dCkgOiAwOwogCiAJaWYgKGRldl9wcml2LT5pbmZvLT5nZW4gPj0gNiAmJiBjYW5fd2FpdF9ib29zdChmaWxlX3ByaXYpKSB7CiAJCWdlbjZfcnBzX2Jvb3N0KGRldl9wcml2KTsKQEAgLTEwMzUsOCArMTAzNyw3IEBACiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwogCX0KIAotCWlmICghKGRldl9wcml2LT5ncHVfZXJyb3IudGVzdF9pcnFfcmluZ3MgJiBpbnRlbF9yaW5nX2ZsYWcocmluZykpICYmCi0JICAgIFdBUk5fT04oIXJpbmctPmlycV9nZXQocmluZykpKQorCWlmICghaXJxX3Rlc3RfaW5fcHJvZ3Jlc3MgJiYgV0FSTl9PTighcmluZy0+aXJxX2dldChyaW5nKSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogUmVjb3JkIGN1cnJlbnQgdGltZSBpbiBjYXNlIGludGVycnVwdGVkIGJ5IHNpZ25hbCwgb3Igd2VkZ2VkICovCkBAIC0xMDQ0LDcgKzEwNDUsNiBAQAogCWdldHJhd21vbm90b25pYygmYmVmb3JlKTsKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCQl1bnNpZ25lZCBsb25nIGV4cGlyZTsKIAogCQlwcmVwYXJlX3RvX3dhaXQoJnJpbmctPmlycV9xdWV1ZSwgJndhaXQsCiAJCQkJaW50ZXJydXB0aWJsZSA/IFRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKQEAgLTEwNzAsMjMgKzEwNzAsMjIgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHRpbWVvdXRfamlmZmllcyA8PSAwKSB7CisJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dF9leHBpcmUpKSB7CiAJCQlyZXQgPSAtRVRJTUU7CiAJCQlicmVhazsKIAkJfQogCiAJCXRpbWVyLmZ1bmN0aW9uID0gTlVMTDsKIAkJaWYgKHRpbWVvdXQgfHwgbWlzc2VkX2lycShkZXZfcHJpdiwgcmluZykpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZXhwaXJlOworCiAJCQlzZXR1cF90aW1lcl9vbl9zdGFjaygmdGltZXIsIGZha2VfaXJxLCAodW5zaWduZWQgbG9uZyljdXJyZW50KTsKLQkJCWV4cGlyZSA9IGppZmZpZXMgKyAobWlzc2VkX2lycShkZXZfcHJpdiwgcmluZykgPyAxOiB0aW1lb3V0X2ppZmZpZXMpOworCQkJZXhwaXJlID0gbWlzc2VkX2lycShkZXZfcHJpdiwgcmluZykgPyBqaWZmaWVzICsgMSA6IHRpbWVvdXRfZXhwaXJlOwogCQkJbW9kX3RpbWVyKCZ0aW1lciwgZXhwaXJlKTsKIAkJfQogCiAJCWlvX3NjaGVkdWxlKCk7CiAKLQkJaWYgKHRpbWVvdXQpCi0JCQl0aW1lb3V0X2ppZmZpZXMgPSBleHBpcmUgLSBqaWZmaWVzOwotCiAJCWlmICh0aW1lci5mdW5jdGlvbikgewogCQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmdGltZXIpOwogCQkJZGVzdHJveV90aW1lcl9vbl9zdGFjaygmdGltZXIpOwpAQCAtMTA5NSw3ICsxMDk0LDggQEAKIAlnZXRyYXdtb25vdG9uaWMoJm5vdyk7CiAJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF93YWl0X2VuZChyaW5nLCBzZXFubyk7CiAKLQlyaW5nLT5pcnFfcHV0KHJpbmcpOworCWlmICghaXJxX3Rlc3RfaW5fcHJvZ3Jlc3MpCisJCXJpbmctPmlycV9wdXQocmluZyk7CiAKIAlmaW5pc2hfd2FpdCgmcmluZy0+aXJxX3F1ZXVlLCAmd2FpdCk7CiAKQEAgLTEzODAsNiArMTM4MCw4IEBACiAJaW50IHJldCA9IDA7CiAJYm9vbCB3cml0ZSA9ICEhKHZtZi0+ZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFKTsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCS8qIFdlIGRvbid0IHVzZSB2bWYtPnBnb2ZmIHNpbmNlIHRoYXQgaGFzIHRoZSBmYWtlIG9mZnNldCAqLwogCXBhZ2Vfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4KIAkJUEFHRV9TSElGVDsKQEAgLTE0MjcsOCArMTQyOSwxMCBAQAogCQkvKiBJZiB0aGlzIC1FSU8gaXMgZHVlIHRvIGEgZ3B1IGhhbmcsIGdpdmUgdGhlIHJlc2V0IGNvZGUgYQogCQkgKiBjaGFuY2UgdG8gY2xlYW4gdXAgdGhlIG1lc3MuIE90aGVyd2lzZSByZXR1cm4gdGhlIHByb3BlcgogCQkgKiBTSUdCVVMuICovCi0JCWlmIChpOTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKCZkZXZfcHJpdi0+Z3B1X2Vycm9yKSkKLQkJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJCWlmIChpOTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKCZkZXZfcHJpdi0+Z3B1X2Vycm9yKSkgeworCQkJcmV0ID0gVk1fRkFVTFRfU0lHQlVTOworCQkJYnJlYWs7CisJCX0KIAljYXNlIC1FQUdBSU46CiAJCS8qCiAJCSAqIEVBR0FJTiBtZWFucyB0aGUgZ3B1IGlzIGh1bmcgYW5kIHdlJ2xsIHdhaXQgZm9yIHRoZSBlcnJvcgpAQCAtMTQ0MywxNSArMTQ0NywzOCBAQAogCQkgKiBFQlVTWSBpcyBvazogdGhpcyBqdXN0IG1lYW5zIHRoYXQgYW5vdGhlciB0aHJlYWQKIAkJICogYWxyZWFkeSBkaWQgdGhlIGpvYi4KIAkJICovCi0JCXJldHVybiBWTV9GQVVMVF9OT1BBR0U7CisJCXJldCA9IFZNX0ZBVUxUX05PUEFHRTsKKwkJYnJlYWs7CiAJY2FzZSAtRU5PTUVNOgotCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCQlyZXQgPSBWTV9GQVVMVF9PT007CisJCWJyZWFrOwogCWNhc2UgLUVOT1NQQzoKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwkJcmV0ID0gVk1fRkFVTFRfU0lHQlVTOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OQ0UocmV0LCAidW5oYW5kbGVkIGVycm9yIGluIGk5MTVfZ2VtX2ZhdWx0OiAlaVxuIiwgcmV0KTsKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwkJcmV0ID0gVk1fRkFVTFRfU0lHQlVTOworCQlicmVhazsKIAl9CisKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpOTE1X2dlbV9yZWxlYXNlX2FsbF9tbWFwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisKKwkvKgorCSAqIE9ubHkgdGhlIGdsb2JhbCBndHQgaXMgcmVsZXZhbnQgZm9yIGd0dCBtZW1vcnkgbWFwcGluZ3MsIHNvIHJlc3RyaWN0CisJICogbGlzdCB0cmF2ZXJzYWwgdG8gb2JqZWN0cyBib3VuZCBpbnRvIHRoZSBnbG9iYWwgYWRkcmVzcyBzcGFjZS4gTm90ZQorCSAqIHRoYXQgdGhlIGFjdGl2ZSBsaXN0IHNob3VsZCBiZSBlbXB0eSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuCisJICovCisJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPmd0dC5iYXNlLmFjdGl2ZV9saXN0KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bWEsICZkZXZfcHJpdi0+Z3R0LmJhc2UuYWN0aXZlX2xpc3QsIG1tX2xpc3QpCisJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcCh2bWEtPm9iaik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bWEsICZkZXZfcHJpdi0+Z3R0LmJhc2UuaW5hY3RpdmVfbGlzdCwgbW1fbGlzdCkKKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKHZtYS0+b2JqKTsKIH0KIAogLyoqCkBAIC0yMzAzLDcgKzIzMzAsNyBAQAogCiAJaWYgKHJpbmctPmhhbmdjaGVjay5hY3Rpb24gIT0gSEFOR0NIRUNLX1dBSVQgJiYKIAkgICAgaTkxNV9yZXF1ZXN0X2d1aWx0eShyZXF1ZXN0LCBhY3RoZCwgJmluc2lkZSkpIHsKLQkJRFJNX0VSUk9SKCIlcyBodW5nICVzIGJvICgweCVseCBjdHggJWQpIGF0IDB4JXhcbiIsCisJCURSTV9ERUJVRygiJXMgaHVuZyAlcyBibyAoMHglbHggY3R4ICVkKSBhdCAweCV4XG4iLAogCQkJICByaW5nLT5uYW1lLAogCQkJICBpbnNpZGUgPyAiaW5zaWRlIiA6ICJmbHVzaGluZyIsCiAJCQkgIG9mZnNldCwKQEAgLTIzNjEsMTYgKzIzODgsNiBAQAogc3RhdGljIHZvaWQgaTkxNV9nZW1fcmVzZXRfcmluZ19jbGVhbnVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCXdoaWxlICghbGlzdF9lbXB0eSgmcmluZy0+cmVxdWVzdF9saXN0KSkgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7Ci0KLQkJcmVxdWVzdCA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPnJlcXVlc3RfbGlzdCwKLQkJCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0LAotCQkJCQkgICBsaXN0KTsKLQotCQlpOTE1X2dlbV9mcmVlX3JlcXVlc3QocmVxdWVzdCk7Ci0JfQotCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpIHsKIAkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIApAQCAtMjM4MCw2ICsyMzk3LDIzIEBACiAKIAkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUob2JqKTsKIAl9CisKKwkvKgorCSAqIFdlIG11c3QgZnJlZSB0aGUgcmVxdWVzdHMgYWZ0ZXIgYWxsIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdHMgaGF2ZQorCSAqIGJlZW4gbW92ZWQgb2ZmIGFjdGl2ZSBsaXN0cy4gV2hpY2ggaXMgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIG5vcm1hbAorCSAqIHJldGlyZV9yZXF1ZXN0cyBmdW5jdGlvbiBkb2VzLiBUaGlzIGlzIGltcG9ydGFudCBpZiBvYmplY3QgaG9sZAorCSAqIGltcGxpY2l0IHJlZmVyZW5jZXMgb24gdGhpbmdzIGxpa2UgZS5nLiBwcGd0dCBhZGRyZXNzIHNwYWNlcyB0aHJvdWdoCisJICogdGhlIHJlcXVlc3QuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKKworCQlyZXF1ZXN0ID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+cmVxdWVzdF9saXN0LAorCQkJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QsCisJCQkJCSAgIGxpc3QpOworCisJCWk5MTVfZ2VtX2ZyZWVfcmVxdWVzdChyZXF1ZXN0KTsKKwl9CiB9CiAKIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTI3NjAsNyArMjc5NCw2IEBACiAJCW9iai0+aGFzX2FsaWFzaW5nX3BwZ3R0X21hcHBpbmcgPSAwOwogCX0KIAlpOTE1X2dlbV9ndHRfZmluaXNoX29iamVjdChvYmopOwotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogCiAJbGlzdF9kZWwoJnZtYS0+bW1fbGlzdCk7CiAJLyogQXZvaWQgYW4gdW5uZWNlc3NhcnkgY2FsbCB0byB1bmJpbmQgb24gcmViaW5kLiAqLwpAQCAtMjc2OCw3ICsyODAxLDYgQEAKIAkJb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSA9IHRydWU7CiAKIAlkcm1fbW1fcmVtb3ZlX25vZGUoJnZtYS0+bm9kZSk7Ci0KIAlpOTE1X2dlbV92bWFfZGVzdHJveSh2bWEpOwogCiAJLyogU2luY2UgdGhlIHVuYm91bmQgbGlzdCBpcyBnbG9iYWwsIG9ubHkgbW92ZSB0byB0aGF0IGxpc3QgaWYKQEAgLTI3NzYsNiArMjgwOCwxMiBAQAogCWlmIChsaXN0X2VtcHR5KCZvYmotPnZtYV9saXN0KSkKIAkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpc3QsICZkZXZfcHJpdi0+bW0udW5ib3VuZF9saXN0KTsKIAorCS8qIEFuZCBmaW5hbGx5IG5vdyB0aGUgb2JqZWN0IGlzIGNvbXBsZXRlbHkgZGVjb3VwbGVkIGZyb20gdGhpcyB2bWEsCisJICogd2UgY2FuIGRyb3AgaXRzIGhvbGQgb24gdGhlIGJhY2tpbmcgc3RvcmFnZSBhbmQgYWxsb3cgaXQgdG8gYmUKKwkgKiByZWFwZWQgYnkgdGhlIHNocmlua2VyLgorCSAqLworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNjgsNyArMzEwNiw3IEBACiAJfQogCiAJaWYgKGF2YWlsID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGRlYWRsb2NrOwogCiAJLyogTm9uZSBhdmFpbGFibGUsIHRyeSB0byBzdGVhbCBvbmUgb3Igd2FpdCBmb3IgYSB1c2VyIHRvIGZpbmlzaCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QsIGxydV9saXN0KSB7CkBAIC0zMDc4LDcgKzMxMTYsMTIgQEAKIAkJcmV0dXJuIHJlZzsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKK2RlYWRsb2NrOgorCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgcGVuZGluZyBmbGlwcyB3aGljaCBjb25zdW1lIGZlbmNlcyAqLworCWlmIChpbnRlbF9oYXNfcGVuZGluZ19mYl91bnBpbihkZXYpKQorCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKworCXJldHVybiBFUlJfUFRSKC1FREVBRExLKTsKIH0KIAogLyoqCkBAIC0zMTIzLDggKzMxNjYsOCBAQAogCQl9CiAJfSBlbHNlIGlmIChlbmFibGUpIHsKIAkJcmVnID0gaTkxNV9maW5kX2ZlbmNlX3JlZyhkZXYpOwotCQlpZiAocmVnID09IE5VTEwpCi0JCQlyZXR1cm4gLUVERUFETEs7CisJCWlmIChJU19FUlIocmVnKSkKKwkJCXJldHVybiBQVFJfRVJSKHJlZyk7CiAKIAkJaWYgKHJlZy0+b2JqKSB7CiAJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2xkID0gcmVnLT5vYmo7CkBAIC00MTc5LDYgKzQyMjIsOCBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpOTE1X3ZtYSAqdm1hLCAqbmV4dDsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9kZXN0cm95KG9iaik7CiAKIAlpZiAob2JqLT5waHlzX29iaikKQEAgLTQyMjMsNiArNDI2OCw4IEBACiAKIAlrZnJlZShvYmotPmJpdF8xNyk7CiAJaTkxNV9nZW1fb2JqZWN0X2ZyZWUob2JqKTsKKworCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIH0KIAogc3RydWN0IGk5MTVfdm1hICppOTE1X2dlbV9vYmpfdG9fdm1hKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCkBAIC00NDc5LDcgKzQ1MjYsMTMgQEAKIAkgKiBYWFg6IFRoZXJlIHdhcyBzb21lIHcvYSBkZXNjcmliZWQgc29tZXdoZXJlIHN1Z2dlc3RpbmcgbG9hZGluZwogCSAqIGNvbnRleHRzIGJlZm9yZSBQUEdUVC4KIAkgKi8KLQlpOTE1X2dlbV9jb250ZXh0X2luaXQoZGV2KTsKKwlyZXQgPSBpOTE1X2dlbV9jb250ZXh0X2luaXQoZGV2KTsKKwlpZiAocmV0KSB7CisJCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOworCQlEUk1fRVJST1IoIkNvbnRleHQgaW5pdGlhbGl6YXRpb24gZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCWlmIChkZXZfcHJpdi0+bW0uYWxpYXNpbmdfcHBndHQpIHsKIAkJcmV0ID0gZGV2X3ByaXYtPm1tLmFsaWFzaW5nX3BwZ3R0LT5lbmFibGUoZGV2KTsKIAkJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5jCmluZGV4IGIwZjQyYjkuLmUwOGFjYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9jb250ZXh0LmMKQEAgLTI0NywzNiArMjQ3LDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpOTE1X2dlbV9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK2ludCBpOTE1X2dlbV9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CiAKLQlpZiAoIUhBU19IV19DT05URVhUUyhkZXYpKSB7Ci0JCWRldl9wcml2LT5od19jb250ZXh0c19kaXNhYmxlZCA9IHRydWU7Ci0JCURSTV9ERUJVR19EUklWRVIoIkRpc2FibGluZyBIVyBDb250ZXh0czsgb2xkIGhhcmR3YXJlXG4iKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoIUhBU19IV19DT05URVhUUyhkZXYpKQorCQlyZXR1cm4gMDsKIAogCS8qIElmIGNhbGxlZCBmcm9tIHJlc2V0LCBvciB0aGF3Li4uIHdlJ3ZlIGJlZW4gaGVyZSBhbHJlYWR5ICovCi0JaWYgKGRldl9wcml2LT5od19jb250ZXh0c19kaXNhYmxlZCB8fAotCSAgICBkZXZfcHJpdi0+cmluZ1tSQ1NdLmRlZmF1bHRfY29udGV4dCkKLQkJcmV0dXJuOworCWlmIChkZXZfcHJpdi0+cmluZ1tSQ1NdLmRlZmF1bHRfY29udGV4dCkKKwkJcmV0dXJuIDA7CiAKIAlkZXZfcHJpdi0+aHdfY29udGV4dF9zaXplID0gcm91bmRfdXAoZ2V0X2NvbnRleHRfc2l6ZShkZXYpLCA0MDk2KTsKIAogCWlmIChkZXZfcHJpdi0+aHdfY29udGV4dF9zaXplID4gKDE8PDIwKSkgewotCQlkZXZfcHJpdi0+aHdfY29udGV4dHNfZGlzYWJsZWQgPSB0cnVlOwogCQlEUk1fREVCVUdfRFJJVkVSKCJEaXNhYmxpbmcgSFcgQ29udGV4dHM7IGludmFsaWQgc2l6ZVxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKLQlpZiAoY3JlYXRlX2RlZmF1bHRfY29udGV4dChkZXZfcHJpdikpIHsKLQkJZGV2X3ByaXYtPmh3X2NvbnRleHRzX2Rpc2FibGVkID0gdHJ1ZTsKLQkJRFJNX0RFQlVHX0RSSVZFUigiRGlzYWJsaW5nIEhXIENvbnRleHRzOyBjcmVhdGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOworCXJldCA9IGNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoZGV2X3ByaXYpOworCWlmIChyZXQpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiRGlzYWJsaW5nIEhXIENvbnRleHRzOyBjcmVhdGUgZmFpbGVkICVkXG4iLAorCQkJCSByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCURSTV9ERUJVR19EUklWRVIoIkhXIGNvbnRleHQgc3VwcG9ydCBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaTkxNV9nZW1fY29udGV4dF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0yODQsNyArMjgyLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmRjdHggPSBkZXZfcHJpdi0+cmluZ1tSQ1NdLmRlZmF1bHRfY29udGV4dDsKIAotCWlmIChkZXZfcHJpdi0+aHdfY29udGV4dHNfZGlzYWJsZWQpCisJaWYgKCFIQVNfSFdfQ09OVEVYVFMoZGV2KSkKIAkJcmV0dXJuOwogCiAJLyogVGhlIG9ubHkga25vd24gd2F5IHRvIHN0b3AgdGhlIGdwdSBmcm9tIGFjY2Vzc2luZyB0aGUgaHcgY29udGV4dCBpcwpAQCAtMzI3LDE2ICszMjUsMTYgQEAKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCiAJCQkJdTMyIGlkKQogewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7CiAJc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4OwogCiAJaWYgKGlkID09IERFRkFVTFRfQ09OVEVYVF9JRCkKIAkJcmV0dXJuICZmaWxlX3ByaXYtPmhhbmdfc3RhdHM7CiAKLQljdHggPSBOVUxMOwotCWlmICghZGV2X3ByaXYtPmh3X2NvbnRleHRzX2Rpc2FibGVkKQotCQljdHggPSBpOTE1X2dlbV9jb250ZXh0X2dldChmaWxlLT5kcml2ZXJfcHJpdiwgaWQpOworCWlmICghSEFTX0hXX0NPTlRFWFRTKGRldikpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJY3R4ID0gaTkxNV9nZW1fY29udGV4dF9nZXQoZmlsZS0+ZHJpdmVyX3ByaXYsIGlkKTsKIAlpZiAoY3R4ID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCkBAIC01MDIsOCArNTAwLDYgQEAKICAqIEByaW5nOiByaW5nIGZvciB3aGljaCB3ZSdsbCBleGVjdXRlIHRoZSBjb250ZXh0IHN3aXRjaAogICogQGZpbGVfcHJpdjogZmlsZV9wcml2IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dCwgbWF5IGJlIE5VTEwKICAqIEBpZDogY29udGV4dCBpZCBudW1iZXIKLSAqIEBzZXFubzogc2VxdWVuY2UgbnVtYmVyIGJ5IHdoaWNoIHRoZSBuZXcgY29udGV4dCB3aWxsIGJlIHN3aXRjaGVkIHRvCi0gKiBAZmxhZ3M6CiAgKgogICogVGhlIGNvbnRleHQgbGlmZSBjeWNsZSBpcyBzaW1wbGUuIFRoZSBjb250ZXh0IHJlZmNvdW50IGlzIGluY3JlbWVudGVkIGFuZAogICogZGVjcmVtZW50ZWQgYnkgMSBhbmQgY3JlYXRlIGFuZCBkZXN0cm95LiBJZiB0aGUgY29udGV4dCBpcyBpbiB1c2UgYnkgdGhlIEdQVSwKQEAgLTUxNyw3ICs1MTMsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGk5MTVfaHdfY29udGV4dCAqdG87CiAKLQlpZiAoZGV2X3ByaXYtPmh3X2NvbnRleHRzX2Rpc2FibGVkKQorCWlmICghSEFTX0hXX0NPTlRFWFRTKHJpbmctPmRldikpCiAJCXJldHVybiAwOwogCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXZfcHJpdi0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKQEAgLTU0Miw3ICs1MzgsNiBAQAogaW50IGk5MTVfZ2VtX2NvbnRleHRfY3JlYXRlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfY3JlYXRlICphcmdzID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZmlsZV9wcml2YXRlICpmaWxlX3ByaXYgPSBmaWxlLT5kcml2ZXJfcHJpdjsKIAlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CkBAIC01NTEsNyArNTQ2LDcgQEAKIAlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGRldl9wcml2LT5od19jb250ZXh0c19kaXNhYmxlZCkKKwlpZiAoIUhBU19IV19DT05URVhUUyhkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYwppbmRleCA4ZjNhZGM3Li4yY2EyODBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKQEAgLTI3LDggKzI3LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlIDxkcm0vaTkxNV9kcm0uaD4KKworI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogCiBzdGF0aWMgYm9vbApAQCAtNTMsNiArNTUsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZXZpY3Rpb25fbGlzdCwgdW53aW5kX2xpc3Q7CiAJc3RydWN0IGk5MTVfdm1hICp2bWE7CiAJaW50IHJldCA9IDA7CisJaW50IHBhc3MgPSAwOwogCiAJdHJhY2VfaTkxNV9nZW1fZXZpY3QoZGV2LCBtaW5fc2l6ZSwgYWxpZ25tZW50LCBtYXBwYWJsZSk7CiAKQEAgLTExOSwxNCArMTIyLDI0IEBACiAJLyogQ2FuIHdlIHVucGluIHNvbWUgb2JqZWN0cyBzdWNoIGFzIGlkbGUgaHcgY29udGVudHMsCiAJICogb3IgcGVuZGluZyBmbGlwcz8KIAkgKi8KLQlyZXQgPSBub25ibG9ja2luZyA/IC1FTk9TUEMgOiBpOTE1X2dwdV9pZGxlKGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAobm9uYmxvY2tpbmcpCisJCXJldHVybiAtRU5PU1BDOwogCiAJLyogT25seSBpZGxlIHRoZSBHUFUgYW5kIHJlcGVhdCB0aGUgc2VhcmNoIG9uY2UgKi8KLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2KTsKLQlub25ibG9ja2luZyA9IHRydWU7Ci0JZ290byBzZWFyY2hfYWdhaW47CisJaWYgKHBhc3MrKyA9PSAwKSB7CisJCXJldCA9IGk5MTVfZ3B1X2lkbGUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CisJCWdvdG8gc2VhcmNoX2FnYWluOworCX0KKworCS8qIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBwYWdlZmxpcCBjb21wbGV0aW9ucywgZHJvcAorCSAqIGJhY2sgdG8gdXNlcnNwYWNlIHRvIGdpdmUgb3VyIHdvcmtxdWV1ZXMgdGltZSB0bworCSAqIGFjcXVpcmUgb3VyIGxvY2tzIGFuZCB1bnBpbiB0aGUgb2xkIHNjYW5vdXRzLgorCSAqLworCXJldHVybiBpbnRlbF9oYXNfcGVuZGluZ19mYl91bnBpbihkZXYpID8gLUVBR0FJTiA6IC1FTk9TUEM7CiAKIGZvdW5kOgogCS8qIGRybV9tbSBkb2Vzbid0IGFsbG93IGFueSBvdGhlciBvdGhlciBvcGVyYXRpb25zIHdoaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKaW5kZXggYTNiYTlhOC4uZDI2OWVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtNDYsNyArNDYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBlYl92bWFzICoKLWViX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICphcmdzLCBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK2ViX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICphcmdzKQogewogCXN0cnVjdCBlYl92bWFzICplYiA9IE5VTEw7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXVpbnQzMl90IHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocmVsb2MtPm9mZnNldCk7CiAJY2hhciAqdmFkZHI7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJaW50IHJldDsKIAogCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihvYmosIHRydWUpOwogCWlmIChyZXQpCkBAIC0yODcsNyArMjg3LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IF9faW9tZW0gKnJlbG9jX2VudHJ5OwogCXZvaWQgX19pb21lbSAqcmVsb2NfcGFnZTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgcmV0OwogCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgdHJ1ZSk7CiAJaWYgKHJldCkKQEAgLTMzNSw3ICszMzUsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICp0YXJnZXRfaTkxNV9vYmo7CiAJc3RydWN0IGk5MTVfdm1hICp0YXJnZXRfdm1hOwogCXVpbnQzMl90IHRhcmdldF9vZmZzZXQ7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJaW50IHJldDsKIAogCS8qIHdlJ3ZlIGFscmVhZHkgaG9sZCBhIHJlZmVyZW5jZSB0byBhbGwgdmFsaWQgb2JqZWN0cyAqLwogCXRhcmdldF92bWEgPSBlYl9nZXRfdm1hKGViLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAl0YXJnZXRfaTkxNV9vYmogPSB0YXJnZXRfdm1hLT5vYmo7CiAJdGFyZ2V0X29iaiA9ICZ0YXJnZXRfdm1hLT5vYmotPmJhc2U7CiAKLQl0YXJnZXRfb2Zmc2V0ID0gaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KHRhcmdldF9pOTE1X29iaik7CisJdGFyZ2V0X29mZnNldCA9IHRhcmdldF92bWEtPm5vZGUuc3RhcnQ7CiAKIAkvKiBTYW5keWJyaWRnZSBQUEdUVCBlcnJhdGE6IFdlIG5lZWQgYSBnbG9iYWwgZ3R0IG1hcHBpbmcgZm9yIE1JIGFuZAogCSAqIHBpcGVfY29udHJvbCB3cml0ZXMgYmVjYXVzZSB0aGUgZ3B1IGRvZXNuJ3QgcHJvcGVybHkgcmVkaXJlY3QgdGhlbQpAQCAtMzY1LDcgKzM2NSw3IEBACiAJCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCiAJCQkgIHJlbG9jLT5yZWFkX2RvbWFpbnMsCiAJCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHVubGlrZWx5KChyZWxvYy0+d3JpdGVfZG9tYWluIHwgcmVsb2MtPnJlYWRfZG9tYWlucykKIAkJICAgICAmIH5JOTE1X0dFTV9HUFVfRE9NQUlOUykpIHsKQEAgLTM3Niw3ICszNzYsNyBAQAogCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAogCQkJICByZWxvYy0+cmVhZF9kb21haW5zLAogCQkJICByZWxvYy0+d3JpdGVfZG9tYWluKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdGFyZ2V0X29iai0+cGVuZGluZ19yZWFkX2RvbWFpbnMgfD0gcmVsb2MtPnJlYWRfZG9tYWluczsKQEAgLTM5NiwxNCArMzk2LDE0IEBACiAJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCiAJCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCiAJCQkgIChpbnQpIG9iai0+YmFzZS5zaXplKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICh1bmxpa2VseShyZWxvYy0+b2Zmc2V0ICYgMykpIHsKIAkJRFJNX0RFQlVHKCJSZWxvY2F0aW9uIG5vdCA0LWJ5dGUgYWxpZ25lZDogIgogCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQuXG4iLAogCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAogCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0KTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogV2UgY2FuJ3Qgd2FpdCBmb3IgcmVuZGVyaW5nIHdpdGggcGFnZWZhdWx0cyBkaXNhYmxlZCAqLwpAQCAtNDkxLDggKzQ5MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGUoc3RydWN0IGViX3ZtYXMgKmViLAotCQkJICAgICBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGUoc3RydWN0IGViX3ZtYXMgKmViKQogewogCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwogCWludCByZXQgPSAwOwpAQCAtOTAxLDYgKzkwMCwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitpOTE1X2dlbV92YWxpZGF0ZV9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKKwkJCSAgY29uc3QgdTMyIGN0eF9pZCkKK3sKKwlzdHJ1Y3QgaTkxNV9jdHhfaGFuZ19zdGF0cyAqaHM7CisKKwlocyA9IGk5MTVfZ2VtX2NvbnRleHRfZ2V0X2hhbmdfc3RhdHMoZGV2LCBmaWxlLCBjdHhfaWQpOworCWlmIChJU19FUlIoaHMpKQorCQlyZXR1cm4gUFRSX0VSUihocyk7CisKKwlpZiAoaHMtPmJhbm5lZCkgeworCQlEUk1fREVCVUcoIkNvbnRleHQgJXUgdHJpZWQgdG8gc3VibWl0IHdoaWxlIGJhbm5lZFxuIiwgY3R4X2lkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBpOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fYWN0aXZlKHN0cnVjdCBsaXN0X2hlYWQgKnZtYXMsCiAJCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQpAQCAtOTgwLDggKzk5Nyw3IEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmJhdGNoX29iajsKIAlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzID0gTlVMTDsKIAlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7Ci0Jc3RydWN0IGk5MTVfY3R4X2hhbmdfc3RhdHMgKmhzOwotCXUzMiBjdHhfaWQgPSBpOTE1X2V4ZWNidWZmZXIyX2dldF9jb250ZXh0X2lkKCphcmdzKTsKKwljb25zdCB1MzIgY3R4X2lkID0gaTkxNV9leGVjYnVmZmVyMl9nZXRfY29udGV4dF9pZCgqYXJncyk7CiAJdTMyIGV4ZWNfc3RhcnQsIGV4ZWNfbGVuOwogCXUzMiBtYXNrLCBmbGFnczsKIAlpbnQgcmV0LCBtb2RlLCBpOwpAQCAtMTEwOCw2ICsxMTI0LDggQEAKIAkJfQogCX0KIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CiAJaWYgKHJldCkKIAkJZ290byBwcmVfbXV0ZXhfZXJyOwpAQCAtMTExOCw3ICsxMTM2LDEzIEBACiAJCWdvdG8gcHJlX211dGV4X2VycjsKIAl9CiAKLQllYiA9IGViX2NyZWF0ZShhcmdzLCB2bSk7CisJcmV0ID0gaTkxNV9nZW1fdmFsaWRhdGVfY29udGV4dChkZXYsIGZpbGUsIGN0eF9pZCk7CisJaWYgKHJldCkgeworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJZ290byBwcmVfbXV0ZXhfZXJyOworCX0KKworCWViID0gZWJfY3JlYXRlKGFyZ3MpOwogCWlmIChlYiA9PSBOVUxMKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTE0MSw3ICsxMTY1LDcgQEAKIAogCS8qIFRoZSBvYmplY3RzIGFyZSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIGFwcGx5IHRoZSByZWxvY2F0aW9ucy4gKi8KIAlpZiAobmVlZF9yZWxvY3MpCi0JCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGUoZWIsIHZtKTsKKwkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZShlYik7CiAJaWYgKHJldCkgewogCQlpZiAocmV0ID09IC1FRkFVTFQpIHsKIAkJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfc2xvdyhkZXYsIGFyZ3MsIGZpbGUsIHJpbmcsCkBAIC0xMTcwLDE3ICsxMTk0LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAotCWhzID0gaTkxNV9nZW1fY29udGV4dF9nZXRfaGFuZ19zdGF0cyhkZXYsIGZpbGUsIGN0eF9pZCk7Ci0JaWYgKElTX0VSUihocykpIHsKLQkJcmV0ID0gUFRSX0VSUihocyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChocy0+YmFubmVkKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyOwotCX0KLQogCXJldCA9IGk5MTVfc3dpdGNoX2NvbnRleHQocmluZywgZmlsZSwgY3R4X2lkKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKQEAgLTEyNDIsNiArMTI1NSwxMCBAQAogCiBwcmVfbXV0ZXhfZXJyOgogCWtmcmVlKGNsaXByZWN0cyk7CisKKwkvKiBpbnRlbF9ncHVfYnVzeSBzaG91bGQgYWxzbyBnZXQgYSByZWYsIHNvIGl0IHdpbGwgZnJlZSB3aGVuIHRoZSBkZXZpY2UKKwkgKiBpcyByZWFsbHkgaWRsZS4gKi8KKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCAzNTQwNTY5Li40MGEyYjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMjQwLDEwICsyNDAsMTYgQEAKIAkJZm9yX2VhY2hfcmluZyhyaW5nLCBkZXZfcHJpdiwgaikgewogCQkJcmV0ID0gZ2VuOF93cml0ZV9wZHAocmluZywgaSwgYWRkcik7CiAJCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byBlcnJfb3V0OwogCQl9CiAJfQogCXJldHVybiAwOworCitlcnJfb3V0OgorCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGopCisJCUk5MTVfV1JJVEUoUklOR19NT0RFX0dFTjcocmluZyksCisJCQkgICBfTUFTS0VEX0JJVF9ESVNBQkxFKEdGWF9QUEdUVF9FTkFCTEUpKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBnZW44X3BwZ3R0X2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLApAQCAtMjkzLDIzICsyOTksMjMgQEAKIAl1bnNpZ25lZCBhY3RfcHRlID0gZmlyc3RfZW50cnkgJSBHRU44X1BURVNfUEVSX1BBR0U7CiAJc3RydWN0IHNnX3BhZ2VfaXRlciBzZ19pdGVyOwogCi0JcHRfdmFkZHIgPSBrbWFwX2F0b21pYygmcHBndHQtPmdlbjhfcHRfcGFnZXNbYWN0X3B0XSk7CisJcHRfdmFkZHIgPSBOVUxMOwogCWZvcl9lYWNoX3NnX3BhZ2UocGFnZXMtPnNnbCwgJnNnX2l0ZXIsIHBhZ2VzLT5uZW50cywgMCkgewotCQlkbWFfYWRkcl90IHBhZ2VfYWRkcjsKKwkJaWYgKHB0X3ZhZGRyID09IE5VTEwpCisJCQlwdF92YWRkciA9IGttYXBfYXRvbWljKCZwcGd0dC0+Z2VuOF9wdF9wYWdlc1thY3RfcHRdKTsKIAotCQlwYWdlX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZ19pdGVyLnNnKSArCi0JCQkJKHNnX2l0ZXIuc2dfcGdvZmZzZXQgPDwgUEFHRV9TSElGVCk7Ci0JCXB0X3ZhZGRyW2FjdF9wdGVdID0gZ2VuOF9wdGVfZW5jb2RlKHBhZ2VfYWRkciwgY2FjaGVfbGV2ZWwsCi0JCQkJCQkgICAgdHJ1ZSk7CisJCXB0X3ZhZGRyW2FjdF9wdGVdID0KKwkJCWdlbjhfcHRlX2VuY29kZShzZ19wYWdlX2l0ZXJfZG1hX2FkZHJlc3MoJnNnX2l0ZXIpLAorCQkJCQljYWNoZV9sZXZlbCwgdHJ1ZSk7CiAJCWlmICgrK2FjdF9wdGUgPT0gR0VOOF9QVEVTX1BFUl9QQUdFKSB7CiAJCQlrdW5tYXBfYXRvbWljKHB0X3ZhZGRyKTsKKwkJCXB0X3ZhZGRyID0gTlVMTDsKIAkJCWFjdF9wdCsrOwotCQkJcHRfdmFkZHIgPSBrbWFwX2F0b21pYygmcHBndHQtPmdlbjhfcHRfcGFnZXNbYWN0X3B0XSk7CiAJCQlhY3RfcHRlID0gMDsKLQogCQl9CiAJfQotCWt1bm1hcF9hdG9taWMocHRfdmFkZHIpOworCWlmIChwdF92YWRkcikKKwkJa3VubWFwX2F0b21pYyhwdF92YWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbjhfcHBndHRfY2xlYW51cChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKQEAgLTMxOCw2ICszMjQsOCBAQAogCQljb250YWluZXJfb2Yodm0sIHN0cnVjdCBpOTE1X2h3X3BwZ3R0LCBiYXNlKTsKIAlpbnQgaSwgajsKIAorCWRybV9tbV90YWtlZG93bigmdm0tPm1tKTsKKwogCWZvciAoaSA9IDA7IGkgPCBwcGd0dC0+bnVtX3BkX3BhZ2VzIDsgaSsrKSB7CiAJCWlmIChwcGd0dC0+cGRfZG1hX2FkZHJbaV0pIHsKIAkJCXBjaV91bm1hcF9wYWdlKHBwZ3R0LT5iYXNlLmRldi0+cGRldiwKQEAgLTM4MSw2ICszODksOCBAQAogCXBwZ3R0LT5iYXNlLmNsZWFyX3JhbmdlID0gZ2VuOF9wcGd0dF9jbGVhcl9yYW5nZTsKIAlwcGd0dC0+YmFzZS5pbnNlcnRfZW50cmllcyA9IGdlbjhfcHBndHRfaW5zZXJ0X2VudHJpZXM7CiAJcHBndHQtPmJhc2UuY2xlYW51cCA9IGdlbjhfcHBndHRfY2xlYW51cDsKKwlwcGd0dC0+YmFzZS5zdGFydCA9IDA7CisJcHBndHQtPmJhc2UudG90YWwgPSBwcGd0dC0+bnVtX3B0X3BhZ2VzICogR0VOOF9QVEVTX1BFUl9QQUdFICogUEFHRV9TSVpFOwogCiAJQlVHX09OKHBwZ3R0LT5udW1fcGRfcGFnZXMgPiBHRU44X0xFR0FDWV9QRFBTKTsKIApAQCAtNTczLDIxICs1ODMsMjMgQEAKIAl1bnNpZ25lZCBhY3RfcHRlID0gZmlyc3RfZW50cnkgJSBJOTE1X1BQR1RUX1BUX0VOVFJJRVM7CiAJc3RydWN0IHNnX3BhZ2VfaXRlciBzZ19pdGVyOwogCi0JcHRfdmFkZHIgPSBrbWFwX2F0b21pYyhwcGd0dC0+cHRfcGFnZXNbYWN0X3B0XSk7CisJcHRfdmFkZHIgPSBOVUxMOwogCWZvcl9lYWNoX3NnX3BhZ2UocGFnZXMtPnNnbCwgJnNnX2l0ZXIsIHBhZ2VzLT5uZW50cywgMCkgewotCQlkbWFfYWRkcl90IHBhZ2VfYWRkcjsKKwkJaWYgKHB0X3ZhZGRyID09IE5VTEwpCisJCQlwdF92YWRkciA9IGttYXBfYXRvbWljKHBwZ3R0LT5wdF9wYWdlc1thY3RfcHRdKTsKIAotCQlwYWdlX2FkZHIgPSBzZ19wYWdlX2l0ZXJfZG1hX2FkZHJlc3MoJnNnX2l0ZXIpOwotCQlwdF92YWRkclthY3RfcHRlXSA9IHZtLT5wdGVfZW5jb2RlKHBhZ2VfYWRkciwgY2FjaGVfbGV2ZWwsIHRydWUpOworCQlwdF92YWRkclthY3RfcHRlXSA9CisJCQl2bS0+cHRlX2VuY29kZShzZ19wYWdlX2l0ZXJfZG1hX2FkZHJlc3MoJnNnX2l0ZXIpLAorCQkJCSAgICAgICBjYWNoZV9sZXZlbCwgdHJ1ZSk7CiAJCWlmICgrK2FjdF9wdGUgPT0gSTkxNV9QUEdUVF9QVF9FTlRSSUVTKSB7CiAJCQlrdW5tYXBfYXRvbWljKHB0X3ZhZGRyKTsKKwkJCXB0X3ZhZGRyID0gTlVMTDsKIAkJCWFjdF9wdCsrOwotCQkJcHRfdmFkZHIgPSBrbWFwX2F0b21pYyhwcGd0dC0+cHRfcGFnZXNbYWN0X3B0XSk7CiAJCQlhY3RfcHRlID0gMDsKLQogCQl9CiAJfQotCWt1bm1hcF9hdG9taWMocHRfdmFkZHIpOworCWlmIChwdF92YWRkcikKKwkJa3VubWFwX2F0b21pYyhwdF92YWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbjZfcHBndHRfY2xlYW51cChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKQEAgLTYzMiw2ICs2NDQsOCBAQAogCXBwZ3R0LT5iYXNlLmluc2VydF9lbnRyaWVzID0gZ2VuNl9wcGd0dF9pbnNlcnRfZW50cmllczsKIAlwcGd0dC0+YmFzZS5jbGVhbnVwID0gZ2VuNl9wcGd0dF9jbGVhbnVwOwogCXBwZ3R0LT5iYXNlLnNjcmF0Y2ggPSBkZXZfcHJpdi0+Z3R0LmJhc2Uuc2NyYXRjaDsKKwlwcGd0dC0+YmFzZS5zdGFydCA9IDA7CisJcHBndHQtPmJhc2UudG90YWwgPSBHRU42X1BQR1RUX1BEX0VOVFJJRVMgKiBJOTE1X1BQR1RUX1BUX0VOVFJJRVMgKiBQQUdFX1NJWkU7CiAJcHBndHQtPnB0X3BhZ2VzID0ga2NhbGxvYyhwcGd0dC0+bnVtX3BkX2VudHJpZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKIAkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghcHBndHQtPnB0X3BhZ2VzKQpAQCAtMTEyNCw3ICsxMTM4LDYgQEAKIAkJaWYgKHJldCkKIAkJCURSTV9ERUJVR19LTVMoIlJlc2VydmF0aW9uIGZhaWxlZFxuIik7CiAJCW9iai0+aGFzX2dsb2JhbF9ndHRfbWFwcGluZyA9IDE7Ci0JCWxpc3RfYWRkKCZ2bWEtPnZtYV9saW5rLCAmb2JqLT52bWFfbGlzdCk7CiAJfQogCiAJZGV2X3ByaXYtPmd0dC5iYXNlLnN0YXJ0ID0gc3RhcnQ7CkBAIC0xNDAwLDYgKzE0MTMsOCBAQAogewogCiAJc3RydWN0IGk5MTVfZ3R0ICpndHQgPSBjb250YWluZXJfb2Yodm0sIHN0cnVjdCBpOTE1X2d0dCwgYmFzZSk7CisKKwlkcm1fbW1fdGFrZWRvd24oJnZtLT5tbSk7CiAJaW91bm1hcChndHQtPmdzbSk7CiAJdGVhcmRvd25fc2NyYXRjaF9wYWdlKHZtLT5kZXYpOwogfQpAQCAtMTQyNSw2ICsxNDQwLDkgQEAKIAlkZXZfcHJpdi0+Z3R0LmJhc2UuY2xlYXJfcmFuZ2UgPSBpOTE1X2dndHRfY2xlYXJfcmFuZ2U7CiAJZGV2X3ByaXYtPmd0dC5iYXNlLmluc2VydF9lbnRyaWVzID0gaTkxNV9nZ3R0X2luc2VydF9lbnRyaWVzOwogCisJaWYgKHVubGlrZWx5KGRldl9wcml2LT5ndHQuZG9faWRsZV9tYXBzKSkKKwkJRFJNX0lORk8oImFwcGx5aW5nIElyb25sYWtlIHF1aXJrcyBmb3IgaW50ZWxfaW9tbXVcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3N0b2xlbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fc3RvbGVuLmMKaW5kZXggZDI4NGQ4OS4uMWEyNGU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fc3RvbGVuLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fc3RvbGVuLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCX0KIAogCXNnID0gc3QtPnNnbDsKLQlzZy0+b2Zmc2V0ID0gb2Zmc2V0OworCXNnLT5vZmZzZXQgPSAwOwogCXNnLT5sZW5ndGggPSBzaXplOwogCiAJc2dfZG1hX2FkZHJlc3Moc2cpID0gKGRtYV9hZGRyX3QpZGV2X3ByaXYtPm1tLnN0b2xlbl9iYXNlICsgb2Zmc2V0OwpAQCAtNDIwLDYgKzQyMCw3IEBACiAKIAlsaXN0X2FkZF90YWlsKCZvYmotPmdsb2JhbF9saXN0LCAmZGV2X3ByaXYtPm1tLmJvdW5kX2xpc3QpOwogCWxpc3RfYWRkX3RhaWwoJnZtYS0+bW1fbGlzdCwgJmdndHQtPmluYWN0aXZlX2xpc3QpOworCWk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKIAogCXJldHVybiBvYmo7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3B1X2Vycm9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dwdV9lcnJvci5jCmluZGV4IDc5ZGNiOGYuLmQ3ZmQyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3B1X2Vycm9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ncHVfZXJyb3IuYwpAQCAtMjM5LDYgKzIzOSw5IEBACiAJCQkJICB1bnNpZ25lZCByaW5nKQogewogCUJVR19PTihyaW5nID49IEk5MTVfTlVNX1JJTkdTKTsgLyogc2h1dCB1cCBjb25mdXNlZCBnY2MgKi8KKwlpZiAoIWVycm9yLT5yaW5nW3JpbmddLnZhbGlkKQorCQlyZXR1cm47CisKIAllcnJfcHJpbnRmKG0sICIlcyBjb21tYW5kIHN0cmVhbTpcbiIsIHJpbmdfc3RyKHJpbmcpKTsKIAllcnJfcHJpbnRmKG0sICIgIEhFQUQ6IDB4JTA4eFxuIiwgZXJyb3ItPmhlYWRbcmluZ10pOwogCWVycl9wcmludGYobSwgIiAgVEFJTDogMHglMDh4XG4iLCBlcnJvci0+dGFpbFtyaW5nXSk7CkBAIC0yNDcsMTIgKzI1MCwxMSBAQAogCWVycl9wcmludGYobSwgIiAgSVBFSVI6IDB4JTA4eFxuIiwgZXJyb3ItPmlwZWlyW3JpbmddKTsKIAllcnJfcHJpbnRmKG0sICIgIElQRUhSOiAweCUwOHhcbiIsIGVycm9yLT5pcGVocltyaW5nXSk7CiAJZXJyX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+aW5zdGRvbmVbcmluZ10pOwotCWlmIChyaW5nID09IFJDUyAmJiBJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQotCQllcnJfcHJpbnRmKG0sICIgIEJCQUREUjogMHglMDhsbHhcbiIsIGVycm9yLT5iYmFkZHIpOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQorCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CisJCWVycl9wcmludGYobSwgIiAgQkJBRERSOiAweCUwOGxseFxuIiwgZXJyb3ItPmJiYWRkcltyaW5nXSk7CiAJCWVycl9wcmludGYobSwgIiAgQkJfU1RBVEU6IDB4JTA4eFxuIiwgZXJyb3ItPmJic3RhdGVbcmluZ10pOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQogCQllcnJfcHJpbnRmKG0sICIgIElOU1RQUzogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBzW3JpbmddKTsKKwl9CiAJZXJyX3ByaW50ZihtLCAiICBJTlNUUE06IDB4JTA4eFxuIiwgZXJyb3ItPmluc3RwbVtyaW5nXSk7CiAJZXJyX3ByaW50ZihtLCAiICBGQUREUjogMHglMDh4XG4iLCBlcnJvci0+ZmFkZHJbcmluZ10pOwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CkBAIC0yOTQsNyArMjk2LDYgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZXJyb3JfcHJpdi0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9zdGF0ZSAqZXJyb3IgPSBlcnJvcl9wcml2LT5lcnJvcjsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAJaW50IGksIGosIHBhZ2UsIG9mZnNldCwgZWx0OwogCiAJaWYgKCFlcnJvcikgewpAQCAtMzI5LDcgKzMzMCw3IEBACiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDcpCiAJCWVycl9wcmludGYobSwgIkVSUl9JTlQ6IDB4JTA4eFxuIiwgZXJyb3ItPmVycl9pbnQpOwogCi0JZm9yX2VhY2hfcmluZyhyaW5nLCBkZXZfcHJpdiwgaSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlcnJvci0+cmluZyk7IGkrKykKIAkJaTkxNV9yaW5nX2Vycm9yX3N0YXRlKG0sIGRldiwgZXJyb3IsIGkpOwogCiAJaWYgKGVycm9yLT5hY3RpdmVfYm8pCkBAIC0zODYsOCArMzg3LDcgQEAKIAkJCX0KIAkJfQogCi0JCW9iaiA9IGVycm9yLT5yaW5nW2ldLmN0eDsKLQkJaWYgKG9iaikgeworCQlpZiAoKG9iaiA9IGVycm9yLT5yaW5nW2ldLmN0eCkpIHsKIAkJCWVycl9wcmludGYobSwgIiVzIC0tLSBIVyBDb250ZXh0ID0gMHglMDh4XG4iLAogCQkJCSAgIGRldl9wcml2LT5yaW5nW2ldLm5hbWUsCiAJCQkJICAgb2JqLT5ndHRfb2Zmc2V0KTsKQEAgLTY2OCw3ICs2NjgsOCBAQAogCQkJcmV0dXJuIE5VTEw7CiAKIAkJb2JqID0gcmluZy0+c2NyYXRjaC5vYmo7Ci0JCWlmIChhY3RoZCA+PSBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKSAmJgorCQlpZiAob2JqICE9IE5VTEwgJiYKKwkJICAgIGFjdGhkID49IGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICYmCiAJCSAgICBhY3RoZCA8IGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgb2JqLT5iYXNlLnNpemUpCiAJCQlyZXR1cm4gaTkxNV9lcnJvcl9vYmplY3RfY3JlYXRlKGRldl9wcml2LCBvYmopOwogCX0KQEAgLTcyNSw4ICs3MjYsOSBAQAogCQllcnJvci0+aXBlaHJbcmluZy0+aWRdID0gSTkxNV9SRUFEKFJJTkdfSVBFSFIocmluZy0+bW1pb19iYXNlKSk7CiAJCWVycm9yLT5pbnN0ZG9uZVtyaW5nLT5pZF0gPSBJOTE1X1JFQUQoUklOR19JTlNURE9ORShyaW5nLT5tbWlvX2Jhc2UpKTsKIAkJZXJyb3ItPmluc3Rwc1tyaW5nLT5pZF0gPSBJOTE1X1JFQUQoUklOR19JTlNUUFMocmluZy0+bW1pb19iYXNlKSk7Ci0JCWlmIChyaW5nLT5pZCA9PSBSQ1MpCi0JCQllcnJvci0+YmJhZGRyID0gSTkxNV9SRUFENjQoQkJfQUREUik7CisJCWVycm9yLT5iYmFkZHJbcmluZy0+aWRdID0gSTkxNV9SRUFEKFJJTkdfQkJBRERSKHJpbmctPm1taW9fYmFzZSkpOworCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gOCkKKwkJCWVycm9yLT5iYmFkZHJbcmluZy0+aWRdIHw9ICh1NjQpIEk5MTVfUkVBRChSSU5HX0JCQUREUl9VRFcocmluZy0+bW1pb19iYXNlKSkgPDwgMzI7CiAJCWVycm9yLT5iYnN0YXRlW3JpbmctPmlkXSA9IEk5MTVfUkVBRChSSU5HX0JCU1RBVEUocmluZy0+bW1pb19iYXNlKSk7CiAJfSBlbHNlIHsKIAkJZXJyb3ItPmZhZGRyW3JpbmctPmlkXSA9IEk5MTVfUkVBRChETUFfRkFERF9JOFhYKTsKQEAgLTc3NSwxMSArNzc3LDE3IEBACiAJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfc3RhdGUgKmVycm9yKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIAlpbnQgaSwgY291bnQ7CiAKLQlmb3JfZWFjaF9yaW5nKHJpbmcsIGRldl9wcml2LCBpKSB7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsKKwkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW2ldOworCisJCWlmIChyaW5nLT5kZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWVycm9yLT5yaW5nW2ldLnZhbGlkID0gdHJ1ZTsKKwogCQlpOTE1X3JlY29yZF9yaW5nX3N0YXRlKGRldiwgZXJyb3IsIHJpbmcpOwogCiAJCWVycm9yLT5yaW5nW2ldLmJhdGNoYnVmZmVyID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IGYxM2Q1ZWQuLjE3ZDhmY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtNjIsNyArNjIsNyBAQAogCVtIUERfUE9SVF9EXSA9IFBPUlREX0hPVFBMVUdfSU5UX0VOCiB9OwogCi1zdGF0aWMgY29uc3QgdTMyIGhwZF9zdGF0dXNfZ2VuNFtdID0geworc3RhdGljIGNvbnN0IHUzMiBocGRfc3RhdHVzX2c0eFtdID0gewogCVtIUERfQ1JUXSA9IENSVF9IT1RQTFVHX0lOVF9TVEFUVVMsCiAJW0hQRF9TRFZPX0JdID0gU0RWT0JfSE9UUExVR19JTlRfU1RBVFVTX0c0WCwKIAlbSFBEX1NEVk9fQ10gPSBTRFZPQ19IT1RQTFVHX0lOVF9TVEFUVVNfRzRYLApAQCAtNjAwLDcgKzYwMCw3IEBACiAJICogQ29vayB1cCBhIHZibGFuayBjb3VudGVyIGJ5IGFsc28gY2hlY2tpbmcgdGhlIHBpeGVsCiAJICogY291bnRlciBhZ2FpbnN0IHZibGFuayBzdGFydC4KIAkgKi8KLQlyZXR1cm4gKChoaWdoMSA8PCA4KSB8IGxvdykgKyAocGl4ZWwgPj0gdmJsX3N0YXJ0KTsKKwlyZXR1cm4gKCgoaGlnaDEgPDwgOCkgfCBsb3cpICsgKHBpeGVsID49IHZibF9zdGFydCkpICYgMHhmZmZmZmY7CiB9CiAKIHN0YXRpYyB1MzIgZ200NV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCkBAIC02MjEsMzYgKzYyMSwxNSBAQAogI2RlZmluZSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdl9fLCByZWdfXykgcmVhZGwoKGRldl9wcml2X18pLT5yZWdzICsgKHJlZ19fKSkKICNkZWZpbmUgX19yYXdfaTkxNV9yZWFkMTYoZGV2X3ByaXZfXywgcmVnX18pIHJlYWR3KChkZXZfcHJpdl9fKS0+cmVncyArIChyZWdfXykpCiAKLXN0YXRpYyBib29sIGludGVsX3BpcGVfaW5fdmJsYW5rX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIHBpcGUgcGlwZSkKK3N0YXRpYyBib29sIGlsa19waXBlX2luX3ZibGFua19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwaXBlIHBpcGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBzdGF0dXM7Ci0JaW50IHJlZzsKIAotCWlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKLQkJc3RhdHVzID0gcGlwZSA9PSBQSVBFX0EgPwotCQkJSTkxNV9ESVNQTEFZX1BJUEVfQV9WQkxBTktfSU5URVJSVVBUIDoKLQkJCUk5MTVfRElTUExBWV9QSVBFX0JfVkJMQU5LX0lOVEVSUlVQVDsKLQotCQlyZWcgPSBWTFZfSVNSOwotCX0gZWxzZSBpZiAoSVNfR0VOMihkZXYpKSB7Ci0JCXN0YXR1cyA9IHBpcGUgPT0gUElQRV9BID8KLQkJCUk5MTVfRElTUExBWV9QSVBFX0FfVkJMQU5LX0lOVEVSUlVQVCA6Ci0JCQlJOTE1X0RJU1BMQVlfUElQRV9CX1ZCTEFOS19JTlRFUlJVUFQ7Ci0KLQkJcmVnID0gSVNSOwotCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1KSB7Ci0JCXN0YXR1cyA9IHBpcGUgPT0gUElQRV9BID8KLQkJCUk5MTVfRElTUExBWV9QSVBFX0FfVkJMQU5LX0lOVEVSUlVQVCA6Ci0JCQlJOTE1X0RJU1BMQVlfUElQRV9CX1ZCTEFOS19JTlRFUlJVUFQ7Ci0KLQkJcmVnID0gSVNSOwotCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA3KSB7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNykgewogCQlzdGF0dXMgPSBwaXBlID09IFBJUEVfQSA/CiAJCQlERV9QSVBFQV9WQkxBTksgOgogCQkJREVfUElQRUJfVkJMQU5LOwotCi0JCXJlZyA9IERFSVNSOwogCX0gZWxzZSB7CiAJCXN3aXRjaCAocGlwZSkgewogCQlkZWZhdWx0OgpAQCAtNjY0LDE4ICs2NDMsMTQgQEAKIAkJCXN0YXR1cyA9IERFX1BJUEVDX1ZCTEFOS19JVkI7CiAJCQlicmVhazsKIAkJfQotCi0JCXJlZyA9IERFSVNSOwogCX0KIAotCWlmIChJU19HRU4yKGRldikpCi0JCXJldHVybiBfX3Jhd19pOTE1X3JlYWQxNihkZXZfcHJpdiwgcmVnKSAmIHN0YXR1czsKLQllbHNlCi0JCXJldHVybiBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgcmVnKSAmIHN0YXR1czsKKwlyZXR1cm4gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIERFSVNSKSAmIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCi0JCQkgICAgIGludCAqdnBvcywgaW50ICpocG9zLCBrdGltZV90ICpzdGltZSwga3RpbWVfdCAqZXRpbWUpCisJCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywgaW50ICp2cG9zLCBpbnQgKmhwb3MsCisJCQkJICAgIGt0aW1lX3QgKnN0aW1lLCBrdGltZV90ICpldGltZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5waXBlX3RvX2NydGNfbWFwcGluZ1twaXBlXTsKQEAgLTY5OCw2ICs2NzMsMTIgQEAKIAl2Ymxfc3RhcnQgPSBtb2RlLT5jcnRjX3ZibGFua19zdGFydDsKIAl2YmxfZW5kID0gbW9kZS0+Y3J0Y192YmxhbmtfZW5kOwogCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIHsKKwkJdmJsX3N0YXJ0ID0gRElWX1JPVU5EX1VQKHZibF9zdGFydCwgMik7CisJCXZibF9lbmQgLz0gMjsKKwkJdnRvdGFsIC89IDI7CisJfQorCiAJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEIHwgRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEU7CiAKIAkvKgpAQCAtNzIyLDE3ICs3MDMsNDIgQEAKIAkJZWxzZQogCQkJcG9zaXRpb24gPSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgUElQRURTTChwaXBlKSkgJiBEU0xfTElORU1BU0tfR0VOMzsKIAotCQkvKgotCQkgKiBUaGUgc2NhbmxpbmUgY291bnRlciBpbmNyZW1lbnRzIGF0IHRoZSBsZWFkaW5nIGVkZ2UKLQkJICogb2YgaHN5bmMsIGllLiBpdCBjb21wbGV0ZWx5IG1pc3NlcyB0aGUgYWN0aXZlIHBvcnRpb24KLQkJICogb2YgdGhlIGxpbmUuIEZpeCB1cCB0aGUgY291bnRlciBhdCBib3RoIGVkZ2VzIG9mIHZibGFuawotCQkgKiB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIHBpY3R1cmUgd2hldGhlciB3ZSdyZSBpbiB2YmxhbmsKLQkJICogb3Igbm90LgotCQkgKi8KLQkJaW5fdmJsID0gaW50ZWxfcGlwZV9pbl92YmxhbmtfbG9ja2VkKGRldiwgcGlwZSk7Ci0JCWlmICgoaW5fdmJsICYmIHBvc2l0aW9uID09IHZibF9zdGFydCAtIDEpIHx8Ci0JCSAgICAoIWluX3ZibCAmJiBwb3NpdGlvbiA9PSB2YmxfZW5kIC0gMSkpCi0JCQlwb3NpdGlvbiA9IChwb3NpdGlvbiArIDEpICUgdnRvdGFsOworCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CisJCQkvKgorCQkJICogVGhlIHNjYW5saW5lIGNvdW50ZXIgaW5jcmVtZW50cyBhdCB0aGUgbGVhZGluZyBlZGdlCisJCQkgKiBvZiBoc3luYywgaWUuIGl0IGNvbXBsZXRlbHkgbWlzc2VzIHRoZSBhY3RpdmUgcG9ydGlvbgorCQkJICogb2YgdGhlIGxpbmUuIEZpeCB1cCB0aGUgY291bnRlciBhdCBib3RoIGVkZ2VzIG9mIHZibGFuaworCQkJICogdG8gZ2V0IGEgbW9yZSBhY2N1cmF0ZSBwaWN0dXJlIHdoZXRoZXIgd2UncmUgaW4gdmJsYW5rCisJCQkgKiBvciBub3QuCisJCQkgKi8KKwkJCWluX3ZibCA9IGlsa19waXBlX2luX3ZibGFua19sb2NrZWQoZGV2LCBwaXBlKTsKKwkJCWlmICgoaW5fdmJsICYmIHBvc2l0aW9uID09IHZibF9zdGFydCAtIDEpIHx8CisJCQkgICAgKCFpbl92YmwgJiYgcG9zaXRpb24gPT0gdmJsX2VuZCAtIDEpKQorCQkJCXBvc2l0aW9uID0gKHBvc2l0aW9uICsgMSkgJSB2dG90YWw7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSVNSIHZibGFuayBzdGF0dXMgYml0cyBkb24ndCB3b3JrIHRoZSB3YXkgd2UnZCB3YW50CisJCQkgKiB0aGVtIHRvIHdvcmsgb24gbm9uLVBDSCBwbGF0Zm9ybXMgKGZvcgorCQkJICogaWxrX3BpcGVfaW5fdmJsYW5rX2xvY2tlZCgpKSwgYW5kIHRoZXJlIGRvZXNuJ3QKKwkJCSAqIGFwcGVhciBhbnkgb3RoZXIgd2F5IHRvIGRldGVybWluZSBpZiB3ZSdyZSBjdXJyZW50bHkKKwkJCSAqIGluIHZibGFuay4KKwkJCSAqCisJCQkgKiBJbnN0ZWFkIGxldCdzIGFzc3VtZSB0aGF0IHdlJ3JlIGFscmVhZHkgaW4gdmJsYW5rIGlmCisJCQkgKiB3ZSBnb3QgY2FsbGVkIGZyb20gdGhlIHZibGFuayBpbnRlcnJ1cHQgYW5kIHRoZQorCQkJICogc2NhbmxpbmUgY291bnRlciB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBvbiB0aGUKKwkJCSAqIGxpbmUganVzdCBwcmlvciB0byB2Ymxhbmsgc3RhcnQuIFRoaXMgc2hvdWxkIHJlc3VsdAorCQkJICogaW4gdGhlIGNvcnJlY3QgYW5zd2VyLCB1bmxlc3MgdGhlIHZibGFuayBpbnRlcnJ1cHQKKwkJCSAqIGRlbGl2ZXJ5IHJlYWxseSBnb3QgZGVsYXllZCBmb3IgYWxtb3N0IGV4YWN0bHkgb25lCisJCQkgKiBmdWxsIGZyYW1lL2ZpZWxkLgorCQkJICovCisJCQlpZiAoZmxhZ3MgJiBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRICYmCisJCQkgICAgcG9zaXRpb24gPT0gdmJsX3N0YXJ0IC0gMSkgeworCQkJCXBvc2l0aW9uID0gKHBvc2l0aW9uICsgMSkgJSB2dG90YWw7CisKKwkJCQkvKiBTaWduYWwgdGhpcyBjb3JyZWN0aW9uIGFzICJhcHBsaWVkIi4gKi8KKwkJCQlyZXQgfD0gMHg4OworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJLyogSGF2ZSBhY2Nlc3MgdG8gcGl4ZWxjb3VudCBzaW5jZSBzdGFydCBvZiBmcmFtZS4KIAkJICogV2UgY2FuIHNwbGl0IHRoaXMgaW50byB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbApAQCAtODA5LDcgKzgxNSw4IEBACiAJLyogSGVscGVyIHJvdXRpbmUgaW4gRFJNIGNvcmUgZG9lcyBhbGwgdGhlIHdvcms6ICovCiAJcmV0dXJuIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoZGV2LCBwaXBlLCBtYXhfZXJyb3IsCiAJCQkJCQkgICAgIHZibGFua190aW1lLCBmbGFncywKLQkJCQkJCSAgICAgY3J0Yyk7CisJCQkJCQkgICAgIGNydGMsCisJCQkJCQkgICAgICZ0b19pbnRlbF9jcnRjKGNydGMpLT5jb25maWcuYWRqdXN0ZWRfbW9kZSk7CiB9CiAKIHN0YXRpYyBib29sIGludGVsX2hwZF9pcnFfZXZlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTEwMTUsMTAgKzEwMjIsOCBAQAogCS8qIHN5c2ZzIGZyZXF1ZW5jeSBpbnRlcmZhY2VzIG1heSBoYXZlIHNudWNrIGluIHdoaWxlIHNlcnZpY2luZyB0aGUKIAkgKiBpbnRlcnJ1cHQKIAkgKi8KLQlpZiAobmV3X2RlbGF5IDwgKGludClkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSkKLQkJbmV3X2RlbGF5ID0gZGV2X3ByaXYtPnJwcy5taW5fZGVsYXk7Ci0JaWYgKG5ld19kZWxheSA+IChpbnQpZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkpCi0JCW5ld19kZWxheSA9IGRldl9wcml2LT5ycHMubWF4X2RlbGF5OworCW5ld19kZWxheSA9IGNsYW1wX3QoaW50LCBuZXdfZGVsYXksCisJCQkgICAgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXksIGRldl9wcml2LT5ycHMubWF4X2RlbGF5KTsKIAlkZXZfcHJpdi0+cnBzLmxhc3RfYWRqID0gbmV3X2RlbGF5IC0gZGV2X3ByaXYtPnJwcy5jdXJfZGVsYXk7CiAKIAlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdi0+ZGV2KSkKQEAgLTEyMzUsOSArMTI0MCwxMCBAQAogCXNwaW5fbG9jaygmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAlmb3IgKGkgPSAxOyBpIDwgSFBEX05VTV9QSU5TOyBpKyspIHsKIAotCQlXQVJOKCgoaHBkW2ldICYgaG90cGx1Z190cmlnZ2VyKSAmJgotCQkgICAgICBkZXZfcHJpdi0+aHBkX3N0YXRzW2ldLmhwZF9tYXJrICE9IEhQRF9FTkFCTEVEKSwKLQkJICAgICAiUmVjZWl2ZWQgSFBEIGludGVycnVwdCBhbHRob3VnaCBkaXNhYmxlZFxuIik7CisJCVdBUk5fT05DRShocGRbaV0gJiBob3RwbHVnX3RyaWdnZXIgJiYKKwkJCSAgZGV2X3ByaXYtPmhwZF9zdGF0c1tpXS5ocGRfbWFyayA9PSBIUERfRElTQUJMRUQsCisJCQkgICJSZWNlaXZlZCBIUEQgaW50ZXJydXB0ICgweCUwOHgpIG9uIHBpbiAlZCAoMHglMDh4KSBhbHRob3VnaCBkaXNhYmxlZFxuIiwKKwkJCSAgaG90cGx1Z190cmlnZ2VyLCBpLCBocGRbaV0pOwogCiAJCWlmICghKGhwZFtpXSAmIGhvdHBsdWdfdHJpZ2dlcikgfHwKIAkJICAgIGRldl9wcml2LT5ocGRfc3RhdHNbaV0uaHBkX21hcmsgIT0gSFBEX0VOQUJMRUQpCkBAIC0xNDc0LDYgKzE0ODAsOSBAQAogCiAJCQlpbnRlbF9ocGRfaXJxX2hhbmRsZXIoZGV2LCBob3RwbHVnX3RyaWdnZXIsIGhwZF9zdGF0dXNfaTkxNSk7CiAKKwkJCWlmIChob3RwbHVnX3N0YXR1cyAmIERQX0FVWF9DSEFOTkVMX01BU0tfSU5UX1NUQVRVU19HNFgpCisJCQkJZHBfYXV4X2lycV9oYW5kbGVyKGRldik7CisKIAkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsIGhvdHBsdWdfc3RhdHVzKTsKIAkJCUk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7CiAJCX0KQEAgLTE5OTMsNyArMjAwMiw3IEBACiAJCQlrb2JqZWN0X3VldmVudF9lbnYoJmRldi0+cHJpbWFyeS0+a2Rldi0+a29iaiwKIAkJCQkJICAgS09CSl9DSEFOR0UsIHJlc2V0X2RvbmVfZXZlbnQpOwogCQl9IGVsc2UgewotCQkJYXRvbWljX3NldCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIsIEk5MTVfV0VER0VEKTsKKwkJCWF0b21pY19zZXRfbWFzayhJOTE1X1dFREdFRCwgJmVycm9yLT5yZXNldF9jb3VudGVyKTsKIAkJfQogCiAJCS8qCkBAIC0zMTQwLDEwICszMTQ5LDEwIEBACiAgKiBSZXR1cm5zIHRydWUgd2hlbiBhIHBhZ2UgZmxpcCBoYXMgY29tcGxldGVkLgogICovCiBzdGF0aWMgYm9vbCBpOHh4X2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBpbnQgcGlwZSwgdTE2IGlpcikKKwkJCSAgICAgICBpbnQgcGxhbmUsIGludCBwaXBlLCB1MzIgaWlyKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUxNiBmbGlwX3BlbmRpbmcgPSBESVNQTEFZX1BMQU5FX0ZMSVBfUEVORElORyhwaXBlKTsKKwl1MTYgZmxpcF9wZW5kaW5nID0gRElTUExBWV9QTEFORV9GTElQX1BFTkRJTkcocGxhbmUpOwogCiAJaWYgKCFkcm1faGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0zMTUxLDcgKzMxNjAsNyBAQAogCWlmICgoaWlyICYgZmxpcF9wZW5kaW5nKSA9PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpbnRlbF9wcmVwYXJlX3BhZ2VfZmxpcChkZXYsIHBpcGUpOworCWludGVsX3ByZXBhcmVfcGFnZV9mbGlwKGRldiwgcGxhbmUpOwogCiAJLyogV2UgZGV0ZWN0IEZsaXBEb25lIGJ5IGxvb2tpbmcgZm9yIHRoZSBjaGFuZ2UgaW4gUGVuZGluZ0ZsaXAgZnJvbSAnMScKIAkgKiB0byAnMCcgb24gdGhlIGZvbGxvd2luZyB2YmxhbmssIGkuZS4gSUlSIGhhcyB0aGUgUGVuZGluZ2ZsaXAKQEAgLTMyMjAsOSArMzIyOSwxMyBAQAogCQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbUkNTXSk7CiAKIAkJZm9yX2VhY2hfcGlwZShwaXBlKSB7CisJCQlpbnQgcGxhbmUgPSBwaXBlOworCQkJaWYgKEhBU19GQkMoZGV2KSkKKwkJCQlwbGFuZSA9ICFwbGFuZTsKKwogCQkJaWYgKHBpcGVfc3RhdHNbcGlwZV0gJiBQSVBFX1ZCTEFOS19JTlRFUlJVUFRfU1RBVFVTICYmCi0JCQkgICAgaTh4eF9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSwgaWlyKSkKLQkJCQlmbGlwX21hc2sgJj0gfkRJU1BMQVlfUExBTkVfRkxJUF9QRU5ESU5HKHBpcGUpOworCQkJICAgIGk4eHhfaGFuZGxlX3ZibGFuayhkZXYsIHBsYW5lLCBwaXBlLCBpaXIpKQorCQkJCWZsaXBfbWFzayAmPSB+RElTUExBWV9QTEFORV9GTElQX1BFTkRJTkcocGxhbmUpOwogCiAJCQlpZiAocGlwZV9zdGF0c1twaXBlXSAmIFBJUEVfQ1JDX0RPTkVfSU5URVJSVVBUX1NUQVRVUykKIAkJCQlpOXh4X3BpcGVfY3JjX2lycV9oYW5kbGVyKGRldiwgcGlwZSk7CkBAIC0zNDE4LDcgKzM0MzEsNyBAQAogCiAJCWZvcl9lYWNoX3BpcGUocGlwZSkgewogCQkJaW50IHBsYW5lID0gcGlwZTsKLQkJCWlmIChJU19NT0JJTEUoZGV2KSkKKwkJCWlmIChIQVNfRkJDKGRldikpCiAJCQkJcGxhbmUgPSAhcGxhbmU7CiAKIAkJCWlmIChwaXBlX3N0YXRzW3BpcGVdICYgUElQRV9WQkxBTktfSU5URVJSVVBUX1NUQVRVUyAmJgpAQCAtMzY1NSw3ICszNjY4LDExIEBACiAJCQkJICBob3RwbHVnX3N0YXR1cyk7CiAKIAkJCWludGVsX2hwZF9pcnFfaGFuZGxlcihkZXYsIGhvdHBsdWdfdHJpZ2dlciwKLQkJCQkJICAgICAgSVNfRzRYKGRldikgPyBocGRfc3RhdHVzX2dlbjQgOiBocGRfc3RhdHVzX2k5MTUpOworCQkJCQkgICAgICBJU19HNFgoZGV2KSA/IGhwZF9zdGF0dXNfZzR4IDogaHBkX3N0YXR1c19pOTE1KTsKKworCQkJaWYgKElTX0c0WChkZXYpICYmCisJCQkgICAgKGhvdHBsdWdfc3RhdHVzICYgRFBfQVVYX0NIQU5ORUxfTUFTS19JTlRfU1RBVFVTX0c0WCkpCisJCQkJZHBfYXV4X2lycV9oYW5kbGVyKGRldik7CiAKIAkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsIGhvdHBsdWdfc3RhdHVzKTsKIAkJCUk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7CkBAIC0zODkzLDggKzM5MTAsOCBAQAogCWRldl9wcml2LT5wYzgucmVnc2F2ZS5ndGllciA9IEk5MTVfUkVBRChHVElFUik7CiAJZGV2X3ByaXYtPnBjOC5yZWdzYXZlLmdlbjZfcG1pbXIgPSBJOTE1X1JFQUQoR0VONl9QTUlNUik7CiAKLQlpcm9ubGFrZV9kaXNhYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCB+REVfUENIX0VWRU5UX0lWQik7Ci0JaWJ4X2Rpc2FibGVfZGlzcGxheV9pbnRlcnJ1cHQoZGV2X3ByaXYsIH5TREVfSE9UUExVR19NQVNLX0NQVCk7CisJaXJvbmxha2VfZGlzYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgMHhmZmZmZmZmZik7CisJaWJ4X2Rpc2FibGVfZGlzcGxheV9pbnRlcnJ1cHQoZGV2X3ByaXYsIDB4ZmZmZmZmZmYpOwogCWlsa19kaXNhYmxlX2d0X2lycShkZXZfcHJpdiwgMHhmZmZmZmZmZik7CiAJc25iX2Rpc2FibGVfcG1faXJxKGRldl9wcml2LCAweGZmZmZmZmZmKTsKIApAQCAtMzkwOCwzNCArMzkyNSwyNiBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQl1aW50MzJfdCB2YWwsIGV4cGVjdGVkOworCXVpbnQzMl90IHZhbDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCXZhbCA9IEk5MTVfUkVBRChERUlNUik7Ci0JZXhwZWN0ZWQgPSB+REVfUENIX0VWRU5UX0lWQjsKLQlXQVJOKHZhbCAhPSBleHBlY3RlZCwgIkRFSU1SIGlzIDB4JTA4eCwgbm90IDB4JTA4eFxuIiwgdmFsLCBleHBlY3RlZCk7CisJV0FSTih2YWwgIT0gMHhmZmZmZmZmZiwgIkRFSU1SIGlzIDB4JTA4eFxuIiwgdmFsKTsKIAotCXZhbCA9IEk5MTVfUkVBRChTREVJTVIpICYgflNERV9IT1RQTFVHX01BU0tfQ1BUOwotCWV4cGVjdGVkID0gflNERV9IT1RQTFVHX01BU0tfQ1BUOwotCVdBUk4odmFsICE9IGV4cGVjdGVkLCAiU0RFSU1SIG5vbi1IUEQgYml0cyBhcmUgMHglMDh4LCBub3QgMHglMDh4XG4iLAotCSAgICAgdmFsLCBleHBlY3RlZCk7CisJdmFsID0gSTkxNV9SRUFEKFNERUlNUik7CisJV0FSTih2YWwgIT0gMHhmZmZmZmZmZiwgIlNERUlNUiBpcyAweCUwOHhcbiIsIHZhbCk7CiAKIAl2YWwgPSBJOTE1X1JFQUQoR1RJTVIpOwotCWV4cGVjdGVkID0gMHhmZmZmZmZmZjsKLQlXQVJOKHZhbCAhPSBleHBlY3RlZCwgIkdUSU1SIGlzIDB4JTA4eCwgbm90IDB4JTA4eFxuIiwgdmFsLCBleHBlY3RlZCk7CisJV0FSTih2YWwgIT0gMHhmZmZmZmZmZiwgIkdUSU1SIGlzIDB4JTA4eFxuIiwgdmFsKTsKIAogCXZhbCA9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKLQlleHBlY3RlZCA9IDB4ZmZmZmZmZmY7Ci0JV0FSTih2YWwgIT0gZXhwZWN0ZWQsICJHRU42X1BNSU1SIGlzIDB4JTA4eCwgbm90IDB4JTA4eFxuIiwgdmFsLAotCSAgICAgZXhwZWN0ZWQpOworCVdBUk4odmFsICE9IDB4ZmZmZmZmZmYsICJHRU42X1BNSU1SIGlzIDB4JTA4eFxuIiwgdmFsKTsKIAogCWRldl9wcml2LT5wYzguaXJxc19kaXNhYmxlZCA9IGZhbHNlOwogCiAJaXJvbmxha2VfZW5hYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCB+ZGV2X3ByaXYtPnBjOC5yZWdzYXZlLmRlaW1yKTsKLQlpYnhfZW5hYmxlX2Rpc3BsYXlfaW50ZXJydXB0KGRldl9wcml2LAotCQkJCSAgICAgfmRldl9wcml2LT5wYzgucmVnc2F2ZS5zZGVpbXIgJgotCQkJCSAgICAgflNERV9IT1RQTFVHX01BU0tfQ1BUKTsKKwlpYnhfZW5hYmxlX2Rpc3BsYXlfaW50ZXJydXB0KGRldl9wcml2LCB+ZGV2X3ByaXYtPnBjOC5yZWdzYXZlLnNkZWltcik7CiAJaWxrX2VuYWJsZV9ndF9pcnEoZGV2X3ByaXYsIH5kZXZfcHJpdi0+cGM4LnJlZ3NhdmUuZ3RpbXIpOwogCXNuYl9lbmFibGVfcG1faXJxKGRldl9wcml2LCB+ZGV2X3ByaXYtPnBjOC5yZWdzYXZlLmdlbjZfcG1pbXIpOwogCUk5MTVfV1JJVEUoR1RJRVIsIGRldl9wcml2LT5wYzgucmVnc2F2ZS5ndGllcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBlZTI3NDIxLi5hNDhiN2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTE5MywxMCArMTkzLDEzIEBACiAjZGVmaW5lICAgTUlfU0NFTkVfQ09VTlQJKDEgPDwgMykgLyoganVzdCBpbmNyZW1lbnQgc2NlbmUgY291bnQgKi8KICNkZWZpbmUgICBNSV9FTkRfU0NFTkUJCSgxIDw8IDQpIC8qIGZsdXNoIGJpbm5lciBhbmQgaW5jciBzY2VuZSBjb3VudCAqLwogI2RlZmluZSAgIE1JX0lOVkFMSURBVEVfSVNQCSgxIDw8IDUpIC8qIGludmFsaWRhdGUgaW5kaXJlY3Qgc3RhdGUgcG9pbnRlcnMgKi8KKyNkZWZpbmUgTUlfUkVQT1JUX0hFQUQJCU1JX0lOU1RSKDB4MDcsIDApCisjZGVmaW5lIE1JX0FSQl9PTl9PRkYJCU1JX0lOU1RSKDB4MDgsIDApCisjZGVmaW5lICAgTUlfQVJCX0VOQUJMRQkJCSgxPDwwKQorI2RlZmluZSAgIE1JX0FSQl9ESVNBQkxFCQkoMDw8MCkKICNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX0VORAlNSV9JTlNUUigweDBhLCAwKQogI2RlZmluZSBNSV9TVVNQRU5EX0ZMVVNICU1JX0lOU1RSKDB4MGIsIDApCiAjZGVmaW5lICAgTUlfU1VTUEVORF9GTFVTSF9FTgkoMTw8MCkKLSNkZWZpbmUgTUlfUkVQT1JUX0hFQUQJCU1JX0lOU1RSKDB4MDcsIDApCiAjZGVmaW5lIE1JX09WRVJMQVlfRkxJUAkJTUlfSU5TVFIoMHgxMSwgMCkKICNkZWZpbmUgICBNSV9PVkVSTEFZX0NPTlRJTlVFCSgweDA8PDIxKQogI2RlZmluZSAgIE1JX09WRVJMQVlfT04JCSgweDE8PDIxKQpAQCAtMjEyLDEwICsyMTUsMjQgQEAKICNkZWZpbmUgICBNSV9ESVNQTEFZX0ZMSVBfSVZCX1NQUklURV9CICgzIDw8IDE5KQogI2RlZmluZSAgIE1JX0RJU1BMQVlfRkxJUF9JVkJfUExBTkVfQyAgKDQgPDwgMTkpCiAjZGVmaW5lICAgTUlfRElTUExBWV9GTElQX0lWQl9TUFJJVEVfQyAoNSA8PCAxOSkKLSNkZWZpbmUgTUlfQVJCX09OX09GRgkJTUlfSU5TVFIoMHgwOCwgMCkKLSNkZWZpbmUgICBNSV9BUkJfRU5BQkxFCQkJKDE8PDApCi0jZGVmaW5lICAgTUlfQVJCX0RJU0FCTEUJCSgwPDwwKQotCisjZGVmaW5lIE1JX1NFTUFQSE9SRV9NQk9YCU1JX0lOU1RSKDB4MTYsIDEpIC8qIGdlbjYrICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX0dMT0JBTF9HVFQgICAgKDE8PDIyKQorI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9VUERBVEUJICAgICgxPDwyMSkKKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfQ09NUEFSRQkgICAgKDE8PDIwKQorI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9SRUdJU1RFUgkgICAgKDE8PDE4KQorI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX1ZSCSAgICAoMDw8MTYpIC8qIFJDUyAgd2FpdCBmb3IgVkNTICAoUlZTWU5DKSAqLworI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX1ZFUgkgICAgKDE8PDE2KSAvKiBSQ1MgIHdhaXQgZm9yIFZFQ1MgKFJWRVNZTkMpICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfQlIJICAgICgyPDwxNikgLyogUkNTICB3YWl0IGZvciBCQ1MgIChSQlNZTkMpICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfQlYJICAgICgwPDwxNikgLyogVkNTICB3YWl0IGZvciBCQ1MgIChWQlNZTkMpICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfVkVWCSAgICAoMTw8MTYpIC8qIFZDUyAgd2FpdCBmb3IgVkVDUyAoVlZFU1lOQykgKi8KKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19SVgkgICAgKDI8PDE2KSAvKiBWQ1MgIHdhaXQgZm9yIFJDUyAgKFZSU1lOQykgKi8KKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19SQgkgICAgKDA8PDE2KSAvKiBCQ1MgIHdhaXQgZm9yIFJDUyAgKEJSU1lOQykgKi8KKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19WRUIJICAgICgxPDwxNikgLyogQkNTICB3YWl0IGZvciBWRUNTIChCVkVTWU5DKSAqLworI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX1ZCCSAgICAoMjw8MTYpIC8qIEJDUyAgd2FpdCBmb3IgVkNTICAoQlZTWU5DKSAqLworI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX0JWRQkgICAgKDA8PDE2KSAvKiBWRUNTIHdhaXQgZm9yIEJDUyAgKFZFQlNZTkMpICovCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfVlZFCSAgICAoMTw8MTYpIC8qIFZFQ1Mgd2FpdCBmb3IgVkNTICAoVkVWU1lOQykgKi8KKyNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19SVkUJICAgICgyPDwxNikgLyogVkVDUyB3YWl0IGZvciBSQ1MgIChWRVJTWU5DKSAqLworI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQgICgzPDwxNikKICNkZWZpbmUgTUlfU0VUX0NPTlRFWFQJCU1JX0lOU1RSKDB4MTgsIDApCiAjZGVmaW5lICAgTUlfTU1fU1BBQ0VfR1RUCQkoMTw8OCkKICNkZWZpbmUgICBNSV9NTV9TUEFDRV9QSFlTSUNBTAkJKDA8PDgpCkBAIC0yMzUsNyArMjUyLDcgQEAKICAqLwogI2RlZmluZSBNSV9MT0FEX1JFR0lTVEVSX0lNTSh4KQlNSV9JTlNUUigweDIyLCAyKngtMSkKICNkZWZpbmUgTUlfU1RPUkVfUkVHSVNURVJfTUVNKHgpIE1JX0lOU1RSKDB4MjQsIDIqeC0xKQotI2RlZmluZSAgTUlfU1JNX0xSTV9HTE9CQUxfR1RUCQkoMTw8MjIpCisjZGVmaW5lICAgTUlfU1JNX0xSTV9HTE9CQUxfR1RUCQkoMTw8MjIpCiAjZGVmaW5lIE1JX0ZMVVNIX0RXCQlNSV9JTlNUUigweDI2LCAxKSAvKiBmb3IgR0VONiAqLwogI2RlZmluZSAgIE1JX0ZMVVNIX0RXX1NUT1JFX0lOREVYCSgxPDwyMSkKICNkZWZpbmUgICBNSV9JTlZBTElEQVRFX1RMQgkJKDE8PDE4KQpAQCAtMjQ2LDMwICsyNjMsMTMgQEAKICNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSCQlNSV9JTlNUUigweDMwLCAxKQogI2RlZmluZSAgIE1JX0JBVENIX05PTl9TRUNVUkUJCSgxKQogLyogZm9yIHNuYi9pdmIvdmx2IHRoaXMgYWxzbyBtZWFucyAiYmF0Y2ggaW4gcHBndHQiIHdoZW4gcHBndHQgaXMgZW5hYmxlZC4gKi8KLSNkZWZpbmUgICBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUgCSgxPDw4KQorI2RlZmluZSAgIE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NQkoMTw8OCkKICNkZWZpbmUgICBNSV9CQVRDSF9QUEdUVF9IU1cJCSgxPDw4KQotI2RlZmluZSAgIE1JX0JBVENIX05PTl9TRUNVUkVfSFNXIAkoMTw8MTMpCisjZGVmaW5lICAgTUlfQkFUQ0hfTk9OX1NFQ1VSRV9IU1cJKDE8PDEzKQogI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQJTUlfSU5TVFIoMHgzMSwgMCkKICNkZWZpbmUgICBNSV9CQVRDSF9HVFQJCSAgICAoMjw8NikgLyogYWxpYXNlZCB3aXRoICgxPDw3KSBvbiBnZW40ICovCiAjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVF9HRU44CU1JX0lOU1RSKDB4MzEsIDEpCi0jZGVmaW5lIE1JX1NFTUFQSE9SRV9NQk9YCU1JX0lOU1RSKDB4MTYsIDEpIC8qIGdlbjYrICovCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfR0xPQkFMX0dUVCAgICAoMTw8MjIpCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfVVBEQVRFCSAgICAoMTw8MjEpCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfQ09NUEFSRQkgICAgKDE8PDIwKQotI2RlZmluZSAgTUlfU0VNQVBIT1JFX1JFR0lTVEVSCSAgICAoMTw8MTgpCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19WUgkgICAgKDA8PDE2KSAvKiBSQ1MgIHdhaXQgZm9yIFZDUyAgKFJWU1lOQykgKi8KLSNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1ZFUgkgICAgKDE8PDE2KSAvKiBSQ1MgIHdhaXQgZm9yIFZFQ1MgKFJWRVNZTkMpICovCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19CUgkgICAgKDI8PDE2KSAvKiBSQ1MgIHdhaXQgZm9yIEJDUyAgKFJCU1lOQykgKi8KLSNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX0JWCSAgICAoMDw8MTYpIC8qIFZDUyAgd2FpdCBmb3IgQkNTICAoVkJTWU5DKSAqLwotI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfVkVWCSAgICAoMTw8MTYpIC8qIFZDUyAgd2FpdCBmb3IgVkVDUyAoVlZFU1lOQykgKi8KLSNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1JWCSAgICAoMjw8MTYpIC8qIFZDUyAgd2FpdCBmb3IgUkNTICAoVlJTWU5DKSAqLwotI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfUkIJICAgICgwPDwxNikgLyogQkNTICB3YWl0IGZvciBSQ1MgIChCUlNZTkMpICovCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19WRUIJICAgICgxPDwxNikgLyogQkNTICB3YWl0IGZvciBWRUNTIChCVkVTWU5DKSAqLwotI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfVkIJICAgICgyPDwxNikgLyogQkNTICB3YWl0IGZvciBWQ1MgIChCVlNZTkMpICovCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19CVkUJICAgICgwPDwxNikgLyogVkVDUyB3YWl0IGZvciBCQ1MgIChWRUJTWU5DKSAqLwotI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfVlZFCSAgICAoMTw8MTYpIC8qIFZFQ1Mgd2FpdCBmb3IgVkNTICAoVkVWU1lOQykgKi8KLSNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1JWRQkgICAgKDI8PDE2KSAvKiBWRUNTIHdhaXQgZm9yIFJDUyAgKFZFUlNZTkMpICovCi0jZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEICAoMzw8MTYpCisKIAogI2RlZmluZSBNSV9QUkVESUNBVEVfUkVTVUxUXzIJKDB4MjIxNCkKICNkZWZpbmUgIExPV0VSX1NMSUNFX0VOQUJMRUQJKDE8PDApCkBAIC0zNTQsNiArMzU0LDcgQEAKICNkZWZpbmUgICBJT1NGX0JZVEVfRU5BQkxFU19TSElGVAkJNAogI2RlZmluZSAgIElPU0ZfQkFSX1NISUZUCQkJMQogI2RlZmluZSAgIElPU0ZfU0JfQlVTWQkJCQkoMTw8MCkKKyNkZWZpbmUgICBJT1NGX1BPUlRfQlVOSVQJCQkweDMKICNkZWZpbmUgICBJT1NGX1BPUlRfUFVOSVQJCQkweDQKICNkZWZpbmUgICBJT1NGX1BPUlRfTkMJCQkJMHgxMQogI2RlZmluZSAgIElPU0ZfUE9SVF9EUElPCQkJMHgxMgpAQCAtMzYxLDEyICszNjIsMjEgQEAKICNkZWZpbmUgICBJT1NGX1BPUlRfQ0NLCQkJCTB4MTQKICNkZWZpbmUgICBJT1NGX1BPUlRfQ0NVCQkJCTB4QTkKICNkZWZpbmUgICBJT1NGX1BPUlRfR1BTX0NPUkUJCQkweDQ4CisjZGVmaW5lICAgSU9TRl9QT1JUX0ZMSVNEU0kJCQkweDFCCiAjZGVmaW5lIFZMVl9JT1NGX0RBVEEJCQkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIxMDQpCiAjZGVmaW5lIFZMVl9JT1NGX0FERFIJCQkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIxMDgpCiAKKy8qIFNlZSBjb25maWdkYiBidW5pdCBTQiBhZGRyIG1hcCAqLworI2RlZmluZSBCVU5JVF9SRUdfQklTT0MJCQkJMHgxMQorCiAjZGVmaW5lIFBVTklUX09QQ09ERV9SRUdfUkVBRAkJCTYKICNkZWZpbmUgUFVOSVRfT1BDT0RFX1JFR19XUklURQkJCTcKIAorI2RlZmluZSBQVU5JVF9SRUdfRFNQRlJFUQkJCTB4MzYKKyNkZWZpbmUgICBEU1BGUkVRU1RBVF9TSElGVAkJCTMwCisjZGVmaW5lICAgRFNQRlJFUVNUQVRfTUFTSwkJCSgweDMgPDwgRFNQRlJFUVNUQVRfU0hJRlQpCisjZGVmaW5lICAgRFNQRlJFUUdVQVJfU0hJRlQJCQkxNAorI2RlZmluZSAgIERTUEZSRVFHVUFSX01BU0sJCQkoMHgzIDw8IERTUEZSRVFHVUFSX1NISUZUKQogI2RlZmluZSBQVU5JVF9SRUdfUFdSR1RfQ1RSTAkJCTB4NjAKICNkZWZpbmUgUFVOSVRfUkVHX1BXUkdUX1NUQVRVUwkJCTB4NjEKICNkZWZpbmUJICBQVU5JVF9DTEtfR0FURQkJCTEKQEAgLTQyOSw2ICs0MzksNyBAQAogI2RlZmluZSAgRFNJX1BMTF9OMV9ESVZfTUFTSwkJCSgzIDw8IDE2KQogI2RlZmluZSAgRFNJX1BMTF9NMV9ESVZfU0hJRlQJCQkwCiAjZGVmaW5lICBEU0lfUExMX00xX0RJVl9NQVNLCQkJKDB4MWZmIDw8IDApCisjZGVmaW5lIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wJCTB4NmIKIAogLyoKICAqIERQSU8gLSBhIHNwZWNpYWwgYnVzIGZvciB2YXJpb3VzIGRpc3BsYXkgcmVsYXRlZCByZWdpc3RlcnMgdG8gaGlkZSBiZWhpbmQKQEAgLTQ0NywxNSArNDU4LDEzIEBACiAjZGVmaW5lICBEUElPX1NGUl9CWVBBU1MJCSgxPDwxKQogI2RlZmluZSAgRFBJT19DTU5SU1QJCQkoMTw8MCkKIAotI2RlZmluZSBfRFBJT19UWDNfU1dJTkdfQ1RMNF9BCQkweDY5MAotI2RlZmluZSBfRFBJT19UWDNfU1dJTkdfQ1RMNF9CCQkweDJhOTAKLSNkZWZpbmUgRFBJT19UWDNfU1dJTkdfQ1RMNChwaXBlKSBfUElQRShwaXBlLCBfRFBJT19UWDNfU1dJTkdfQ1RMNF9BLCBcCi0JCQkJCV9EUElPX1RYM19TV0lOR19DVEw0X0IpCisjZGVmaW5lIERQSU9fUEhZKHBpcGUpCQkJKChwaXBlKSA+PiAxKQorI2RlZmluZSBEUElPX1BIWV9JT1NGX1BPUlQocGh5KQkJKGRldl9wcml2LT5kcGlvX3BoeV9pb3NmX3BvcnRbcGh5XSkKIAogLyoKICAqIFBlciBwaXBlL1BMTCBEUElPIHJlZ3MKICAqLwotI2RlZmluZSBfRFBJT19ESVZfQQkJCTB4ODAwYworI2RlZmluZSBfVkxWX1BMTF9EVzNfQ0gwCQkweDgwMGMKICNkZWZpbmUgICBEUElPX1BPU1RfRElWX1NISUZUCQkoMjgpIC8qIDMgYml0cyAqLwogI2RlZmluZSAgIERQSU9fUE9TVF9ESVZfREFDCQkwCiAjZGVmaW5lICAgRFBJT19QT1NUX0RJVl9IRE1JRFAJCTEgLyogREFDIDIyNS00MDBNIHJhdGUgKi8KQEAgLTQ2OCwxMCArNDc3LDEwIEBACiAjZGVmaW5lICAgRFBJT19FTkFCTEVfQ0FMSUJSQVRJT04JKDE8PDExKQogI2RlZmluZSAgIERQSU9fTTFESVZfU0hJRlQJCSg4KSAvKiAzIGJpdHMgKi8KICNkZWZpbmUgICBEUElPX00yRElWX01BU0sJCTB4ZmYKLSNkZWZpbmUgX0RQSU9fRElWX0IJCQkweDgwMmMKLSNkZWZpbmUgRFBJT19ESVYocGlwZSkgX1BJUEUocGlwZSwgX0RQSU9fRElWX0EsIF9EUElPX0RJVl9CKQorI2RlZmluZSBfVkxWX1BMTF9EVzNfQ0gxCQkweDgwMmMKKyNkZWZpbmUgVkxWX1BMTF9EVzMoY2gpIF9QSVBFKGNoLCBfVkxWX1BMTF9EVzNfQ0gwLCBfVkxWX1BMTF9EVzNfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1JFRlNGUl9BCQkJMHg4MDE0CisjZGVmaW5lIF9WTFZfUExMX0RXNV9DSDAJCTB4ODAxNAogI2RlZmluZSAgIERQSU9fUkVGU0VMX09WRVJSSURFCQkyNwogI2RlZmluZSAgIERQSU9fUExMX01PREVTRUxfU0hJRlQJMjQgLyogMyBiaXRzICovCiAjZGVmaW5lICAgRFBJT19CSUFTX0NVUlJFTlRfQ1RMX1NISUZUCTIxIC8qIDMgYml0cywgYWx3YXlzIDB4NyAqLwpAQCAtNDc5LDExOCArNDg4LDExMiBAQAogI2RlZmluZSAgIERQSU9fUExMX1JFRkNMS19TRUxfTUFTSwkzCiAjZGVmaW5lICAgRFBJT19EUklWRVJfQ1RMX1NISUZUCQkxMiAvKiBhbHdheXMgc2V0IHRvIDB4OCAqLwogI2RlZmluZSAgIERQSU9fQ0xLX0JJQVNfQ1RMX1NISUZUCTggLyogYWx3YXlzIHNldCB0byAweDUgKi8KLSNkZWZpbmUgX0RQSU9fUkVGU0ZSX0IJCQkweDgwMzQKLSNkZWZpbmUgRFBJT19SRUZTRlIocGlwZSkgX1BJUEUocGlwZSwgX0RQSU9fUkVGU0ZSX0EsIF9EUElPX1JFRlNGUl9CKQorI2RlZmluZSBfVkxWX1BMTF9EVzVfQ0gxCQkweDgwMzQKKyNkZWZpbmUgVkxWX1BMTF9EVzUoY2gpIF9QSVBFKGNoLCBfVkxWX1BMTF9EVzVfQ0gwLCBfVkxWX1BMTF9EVzVfQ0gxKQogCi0jZGVmaW5lIF9EUElPX0NPUkVfQ0xLX0EJCTB4ODAxYwotI2RlZmluZSBfRFBJT19DT1JFX0NMS19CCQkweDgwM2MKLSNkZWZpbmUgRFBJT19DT1JFX0NMSyhwaXBlKSBfUElQRShwaXBlLCBfRFBJT19DT1JFX0NMS19BLCBfRFBJT19DT1JFX0NMS19CKQorI2RlZmluZSBfVkxWX1BMTF9EVzdfQ0gwCQkweDgwMWMKKyNkZWZpbmUgX1ZMVl9QTExfRFc3X0NIMQkJMHg4MDNjCisjZGVmaW5lIFZMVl9QTExfRFc3KGNoKSBfUElQRShjaCwgX1ZMVl9QTExfRFc3X0NIMCwgX1ZMVl9QTExfRFc3X0NIMSkKIAotI2RlZmluZSBfRFBJT19JUkVGX0NUTF9BCQkweDgwNDAKLSNkZWZpbmUgX0RQSU9fSVJFRl9DVExfQgkJMHg4MDYwCi0jZGVmaW5lIERQSU9fSVJFRl9DVEwocGlwZSkgX1BJUEUocGlwZSwgX0RQSU9fSVJFRl9DVExfQSwgX0RQSU9fSVJFRl9DVExfQikKKyNkZWZpbmUgX1ZMVl9QTExfRFc4X0NIMAkJMHg4MDQwCisjZGVmaW5lIF9WTFZfUExMX0RXOF9DSDEJCTB4ODA2MAorI2RlZmluZSBWTFZfUExMX0RXOChjaCkgX1BJUEUoY2gsIF9WTFZfUExMX0RXOF9DSDAsIF9WTFZfUExMX0RXOF9DSDEpCiAKLSNkZWZpbmUgRFBJT19JUkVGX0JDQVNUCQkJMHhjMDQ0Ci0jZGVmaW5lIF9EUElPX0lSRUZfQQkJCTB4ODA0NAotI2RlZmluZSBfRFBJT19JUkVGX0IJCQkweDgwNjQKLSNkZWZpbmUgRFBJT19JUkVGKHBpcGUpIF9QSVBFKHBpcGUsIF9EUElPX0lSRUZfQSwgX0RQSU9fSVJFRl9CKQorI2RlZmluZSBWTFZfUExMX0RXOV9CQ0FTVAkJMHhjMDQ0CisjZGVmaW5lIF9WTFZfUExMX0RXOV9DSDAJCTB4ODA0NAorI2RlZmluZSBfVkxWX1BMTF9EVzlfQ0gxCQkweDgwNjQKKyNkZWZpbmUgVkxWX1BMTF9EVzkoY2gpIF9QSVBFKGNoLCBfVkxWX1BMTF9EVzlfQ0gwLCBfVkxWX1BMTF9EVzlfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1BMTF9DTUxfQQkJCTB4ODA0YwotI2RlZmluZSBfRFBJT19QTExfQ01MX0IJCQkweDgwNmMKLSNkZWZpbmUgRFBJT19QTExfQ01MKHBpcGUpIF9QSVBFKHBpcGUsIF9EUElPX1BMTF9DTUxfQSwgX0RQSU9fUExMX0NNTF9CKQorI2RlZmluZSBfVkxWX1BMTF9EVzEwX0NIMAkJMHg4MDQ4CisjZGVmaW5lIF9WTFZfUExMX0RXMTBfQ0gxCQkweDgwNjgKKyNkZWZpbmUgVkxWX1BMTF9EVzEwKGNoKSBfUElQRShjaCwgX1ZMVl9QTExfRFcxMF9DSDAsIF9WTFZfUExMX0RXMTBfQ0gxKQogCi0jZGVmaW5lIF9EUElPX0xQRl9DT0VGRl9BCQkweDgwNDgKLSNkZWZpbmUgX0RQSU9fTFBGX0NPRUZGX0IJCTB4ODA2OAotI2RlZmluZSBEUElPX0xQRl9DT0VGRihwaXBlKSBfUElQRShwaXBlLCBfRFBJT19MUEZfQ09FRkZfQSwgX0RQSU9fTFBGX0NPRUZGX0IpCisjZGVmaW5lIF9WTFZfUExMX0RXMTFfQ0gwCQkweDgwNGMKKyNkZWZpbmUgX1ZMVl9QTExfRFcxMV9DSDEJCTB4ODA2YworI2RlZmluZSBWTFZfUExMX0RXMTEoY2gpIF9QSVBFKGNoLCBfVkxWX1BMTF9EVzExX0NIMCwgX1ZMVl9QTExfRFcxMV9DSDEpCiAKLSNkZWZpbmUgRFBJT19DQUxJQlJBVElPTgkJMHg4MGFjCisvKiBTcGVjIGZvciByZWYgYmxvY2sgc3RhcnQgY291bnRzIGF0IERXMTAgKi8KKyNkZWZpbmUgVkxWX1JFRl9EVzEzCQkJMHg4MGFjCiAKLSNkZWZpbmUgRFBJT19GQVNUQ0xLX0RJU0FCTEUJCTB4ODEwMAorI2RlZmluZSBWTFZfQ01OX0RXMAkJCTB4ODEwMAogCiAvKgogICogUGVyIERESSBjaGFubmVsIERQSU8gcmVncwogICovCiAKLSNkZWZpbmUgX0RQSU9fUENTX1RYXzAJCQkweDgyMDAKLSNkZWZpbmUgX0RQSU9fUENTX1RYXzEJCQkweDg0MDAKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcwX0NIMAkJMHg4MjAwCisjZGVmaW5lIF9WTFZfUENTX0RXMF9DSDEJCTB4ODQwMAogI2RlZmluZSAgIERQSU9fUENTX1RYX0xBTkUyX1JFU0VUCSgxPDwxNikKICNkZWZpbmUgICBEUElPX1BDU19UWF9MQU5FMV9SRVNFVAkoMTw8NykKLSNkZWZpbmUgRFBJT19QQ1NfVFgocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fUENTX1RYXzAsIF9EUElPX1BDU19UWF8xKQorI2RlZmluZSBWTFZfUENTX0RXMChjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMF9DSDAsIF9WTFZfUENTX0RXMF9DSDEpCiAKLSNkZWZpbmUgX0RQSU9fUENTX0NMS18wCQkJMHg4MjA0Ci0jZGVmaW5lIF9EUElPX1BDU19DTEtfMQkJCTB4ODQwNAorI2RlZmluZSBfVkxWX1BDU19EVzFfQ0gwCQkweDgyMDQKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcxX0NIMQkJMHg4NDA0CiAjZGVmaW5lICAgRFBJT19QQ1NfQ0xLX0NSSV9SWEVCX0VJT1NfRU4JKDE8PDIyKQogI2RlZmluZSAgIERQSU9fUENTX0NMS19DUklfUlhESUdGSUxUU0dfRU4gKDE8PDIxKQogI2RlZmluZSAgIERQSU9fUENTX0NMS19EQVRBV0lEVEhfU0hJRlQJKDYpCiAjZGVmaW5lICAgRFBJT19QQ1NfQ0xLX1NPRlRfUkVTRVQJKDE8PDUpCi0jZGVmaW5lIERQSU9fUENTX0NMSyhwb3J0KSBfUE9SVChwb3J0LCBfRFBJT19QQ1NfQ0xLXzAsIF9EUElPX1BDU19DTEtfMSkKKyNkZWZpbmUgVkxWX1BDU19EVzEoY2gpIF9QT1JUKGNoLCBfVkxWX1BDU19EVzFfQ0gwLCBfVkxWX1BDU19EVzFfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1BDU19DVExfT1ZSMV9BCQkweDgyMjQKLSNkZWZpbmUgX0RQSU9fUENTX0NUTF9PVlIxX0IJCTB4ODQyNAotI2RlZmluZSBEUElPX1BDU19DVExfT1ZFUjEocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fUENTX0NUTF9PVlIxX0EsIFwKLQkJCQkgICAgICAgX0RQSU9fUENTX0NUTF9PVlIxX0IpCisjZGVmaW5lIF9WTFZfUENTX0RXOF9DSDAJCTB4ODIyMAorI2RlZmluZSBfVkxWX1BDU19EVzhfQ0gxCQkweDg0MjAKKyNkZWZpbmUgVkxWX1BDU19EVzgoY2gpIF9QT1JUKGNoLCBfVkxWX1BDU19EVzhfQ0gwLCBfVkxWX1BDU19EVzhfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1BDU19TVEFHR0VSMF9BCQkweDgyMmMKLSNkZWZpbmUgX0RQSU9fUENTX1NUQUdHRVIwX0IJCTB4ODQyYwotI2RlZmluZSBEUElPX1BDU19TVEFHR0VSMChwb3J0KSBfUE9SVChwb3J0LCBfRFBJT19QQ1NfU1RBR0dFUjBfQSwgXAotCQkJCSAgICAgIF9EUElPX1BDU19TVEFHR0VSMF9CKQorI2RlZmluZSBfVkxWX1BDUzAxX0RXOF9DSDAJCTB4MDIyMAorI2RlZmluZSBfVkxWX1BDUzIzX0RXOF9DSDAJCTB4MDQyMAorI2RlZmluZSBfVkxWX1BDUzAxX0RXOF9DSDEJCTB4MjYyMAorI2RlZmluZSBfVkxWX1BDUzIzX0RXOF9DSDEJCTB4MjgyMAorI2RlZmluZSBWTFZfUENTMDFfRFc4KHBvcnQpIF9QT1JUKHBvcnQsIF9WTFZfUENTMDFfRFc4X0NIMCwgX1ZMVl9QQ1MwMV9EVzhfQ0gxKQorI2RlZmluZSBWTFZfUENTMjNfRFc4KHBvcnQpIF9QT1JUKHBvcnQsIF9WTFZfUENTMjNfRFc4X0NIMCwgX1ZMVl9QQ1MyM19EVzhfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1BDU19TVEFHR0VSMV9BCQkweDgyMzAKLSNkZWZpbmUgX0RQSU9fUENTX1NUQUdHRVIxX0IJCTB4ODQzMAotI2RlZmluZSBEUElPX1BDU19TVEFHR0VSMShwb3J0KSBfUE9SVChwb3J0LCBfRFBJT19QQ1NfU1RBR0dFUjFfQSwgXAotCQkJCSAgICAgIF9EUElPX1BDU19TVEFHR0VSMV9CKQorI2RlZmluZSBfVkxWX1BDU19EVzlfQ0gwCQkweDgyMjQKKyNkZWZpbmUgX1ZMVl9QQ1NfRFc5X0NIMQkJMHg4NDI0CisjZGVmaW5lCVZMVl9QQ1NfRFc5KGNoKSBfUE9SVChjaCwgX1ZMVl9QQ1NfRFc5X0NIMCwgX1ZMVl9QQ1NfRFc5X0NIMSkKIAotI2RlZmluZSBfRFBJT19QQ1NfQ0xPQ0tCVUYwX0EJCTB4ODIzOAotI2RlZmluZSBfRFBJT19QQ1NfQ0xPQ0tCVUYwX0IJCTB4ODQzOAotI2RlZmluZSBEUElPX1BDU19DTE9DS0JVRjAocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fUENTX0NMT0NLQlVGMF9BLCBcCi0JCQkJICAgICAgIF9EUElPX1BDU19DTE9DS0JVRjBfQikKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcxMV9DSDAJCTB4ODIyYworI2RlZmluZSBfVkxWX1BDU19EVzExX0NIMQkJMHg4NDJjCisjZGVmaW5lIFZMVl9QQ1NfRFcxMShjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMTFfQ0gwLCBfVkxWX1BDU19EVzExX0NIMSkKIAotI2RlZmluZSBfRFBJT19QQ1NfQ0xPQ0tCVUY4X0EJCTB4ODI1YwotI2RlZmluZSBfRFBJT19QQ1NfQ0xPQ0tCVUY4X0IJCTB4ODQ1YwotI2RlZmluZSBEUElPX1BDU19DTE9DS0JVRjgocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fUENTX0NMT0NLQlVGOF9BLCBcCi0JCQkJICAgICAgIF9EUElPX1BDU19DTE9DS0JVRjhfQikKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcxMl9DSDAJCTB4ODIzMAorI2RlZmluZSBfVkxWX1BDU19EVzEyX0NIMQkJMHg4NDMwCisjZGVmaW5lIFZMVl9QQ1NfRFcxMihjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMTJfQ0gwLCBfVkxWX1BDU19EVzEyX0NIMSkKIAotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEwyX0EJCTB4ODI4OAotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEwyX0IJCTB4ODQ4OAotI2RlZmluZSBEUElPX1RYX1NXSU5HX0NUTDIocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fVFhfU1dJTkdfQ1RMMl9BLCBcCi0JCQkJICAgICAgIF9EUElPX1RYX1NXSU5HX0NUTDJfQikKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcxNF9DSDAJCTB4ODIzOAorI2RlZmluZSBfVkxWX1BDU19EVzE0X0NIMQkJMHg4NDM4CisjZGVmaW5lCVZMVl9QQ1NfRFcxNChjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMTRfQ0gwLCBfVkxWX1BDU19EVzE0X0NIMSkKIAotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEwzX0EJCTB4ODI4YwotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEwzX0IJCTB4ODQ4YwotI2RlZmluZSBEUElPX1RYX1NXSU5HX0NUTDMocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fVFhfU1dJTkdfQ1RMM19BLCBcCi0JCQkJICAgICAgIF9EUElPX1RYX1NXSU5HX0NUTDNfQikKKyNkZWZpbmUgX1ZMVl9QQ1NfRFcyM19DSDAJCTB4ODI1YworI2RlZmluZSBfVkxWX1BDU19EVzIzX0NIMQkJMHg4NDVjCisjZGVmaW5lIFZMVl9QQ1NfRFcyMyhjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMjNfQ0gwLCBfVkxWX1BDU19EVzIzX0NIMSkKIAotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEw0X0EJCTB4ODI5MAotI2RlZmluZSBfRFBJT19UWF9TV0lOR19DVEw0X0IJCTB4ODQ5MAotI2RlZmluZSBEUElPX1RYX1NXSU5HX0NUTDQocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fVFhfU1dJTkdfQ1RMNF9BLCBcCi0JCQkJICAgICAgIF9EUElPX1RYX1NXSU5HX0NUTDRfQikKKyNkZWZpbmUgX1ZMVl9UWF9EVzJfQ0gwCQkJMHg4Mjg4CisjZGVmaW5lIF9WTFZfVFhfRFcyX0NIMQkJCTB4ODQ4OAorI2RlZmluZSBWTFZfVFhfRFcyKGNoKSBfUE9SVChjaCwgX1ZMVl9UWF9EVzJfQ0gwLCBfVkxWX1RYX0RXMl9DSDEpCiAKLSNkZWZpbmUgX0RQSU9fVFhfT0NBTElOSVRfMAkJMHg4Mjk0Ci0jZGVmaW5lIF9EUElPX1RYX09DQUxJTklUXzEJCTB4ODQ5NAorI2RlZmluZSBfVkxWX1RYX0RXM19DSDAJCQkweDgyOGMKKyNkZWZpbmUgX1ZMVl9UWF9EVzNfQ0gxCQkJMHg4NDhjCisjZGVmaW5lIFZMVl9UWF9EVzMoY2gpIF9QT1JUKGNoLCBfVkxWX1RYX0RXM19DSDAsIF9WTFZfVFhfRFczX0NIMSkKKworI2RlZmluZSBfVkxWX1RYX0RXNF9DSDAJCQkweDgyOTAKKyNkZWZpbmUgX1ZMVl9UWF9EVzRfQ0gxCQkJMHg4NDkwCisjZGVmaW5lIFZMVl9UWF9EVzQoY2gpIF9QT1JUKGNoLCBfVkxWX1RYX0RXNF9DSDAsIF9WTFZfVFhfRFc0X0NIMSkKKworI2RlZmluZSBfVkxWX1RYM19EVzRfQ0gwCQkweDY5MAorI2RlZmluZSBfVkxWX1RYM19EVzRfQ0gxCQkweDJhOTAKKyNkZWZpbmUgVkxWX1RYM19EVzQoY2gpIF9QT1JUKGNoLCBfVkxWX1RYM19EVzRfQ0gwLCBfVkxWX1RYM19EVzRfQ0gxKQorCisjZGVmaW5lIF9WTFZfVFhfRFc1X0NIMAkJCTB4ODI5NAorI2RlZmluZSBfVkxWX1RYX0RXNV9DSDEJCQkweDg0OTQKICNkZWZpbmUgICBEUElPX1RYX09DQUxJTklUX0VOCQkoMTw8MzEpCi0jZGVmaW5lIERQSU9fVFhfT0NBTElOSVQocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fVFhfT0NBTElOSVRfMCwgXAotCQkJCSAgICAgX0RQSU9fVFhfT0NBTElOSVRfMSkKKyNkZWZpbmUgVkxWX1RYX0RXNShjaCkgX1BPUlQoY2gsIF9WTFZfVFhfRFc1X0NIMCwgX1ZMVl9UWF9EVzVfQ0gxKQogCi0jZGVmaW5lIF9EUElPX1RYX0NUTF8wCQkJMHg4MmFjCi0jZGVmaW5lIF9EUElPX1RYX0NUTF8xCQkJMHg4NGFjCi0jZGVmaW5lIERQSU9fVFhfQ1RMKHBvcnQpIF9QT1JUKHBvcnQsIF9EUElPX1RYX0NUTF8wLCBfRFBJT19UWF9DVExfMSkKKyNkZWZpbmUgX1ZMVl9UWF9EVzExX0NIMAkJMHg4MmFjCisjZGVmaW5lIF9WTFZfVFhfRFcxMV9DSDEJCTB4ODRhYworI2RlZmluZSBWTFZfVFhfRFcxMShjaCkgX1BPUlQoY2gsIF9WTFZfVFhfRFcxMV9DSDAsIF9WTFZfVFhfRFcxMV9DSDEpCiAKLSNkZWZpbmUgX0RQSU9fVFhfTEFORV8wCQkJMHg4MmI4Ci0jZGVmaW5lIF9EUElPX1RYX0xBTkVfMQkJCTB4ODRiOAotI2RlZmluZSBEUElPX1RYX0xBTkUocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fVFhfTEFORV8wLCBfRFBJT19UWF9MQU5FXzEpCi0KLSNkZWZpbmUgX0RQSU9fREFUQV9DSEFOTkVMMQkJMHg4MjIwCi0jZGVmaW5lIF9EUElPX0RBVEFfQ0hBTk5FTDIJCTB4ODQyMAotI2RlZmluZSBEUElPX0RBVEFfQ0hBTk5FTChwb3J0KSBfUE9SVChwb3J0LCBfRFBJT19EQVRBX0NIQU5ORUwxLCBfRFBJT19EQVRBX0NIQU5ORUwyKQotCi0jZGVmaW5lIF9EUElPX1BPUlQwX1BDUzAJCTB4MDIyMAotI2RlZmluZSBfRFBJT19QT1JUMF9QQ1MxCQkweDA0MjAKLSNkZWZpbmUgX0RQSU9fUE9SVDFfUENTMgkJMHgyNjIwCi0jZGVmaW5lIF9EUElPX1BPUlQxX1BDUzMJCTB4MjgyMAotI2RlZmluZSBEUElPX0RBVEFfTEFORV9BKHBvcnQpIF9QT1JUKHBvcnQsIF9EUElPX1BPUlQwX1BDUzAsIF9EUElPX1BPUlQxX1BDUzIpCi0jZGVmaW5lIERQSU9fREFUQV9MQU5FX0IocG9ydCkgX1BPUlQocG9ydCwgX0RQSU9fUE9SVDBfUENTMSwgX0RQSU9fUE9SVDFfUENTMykKLSNkZWZpbmUgRFBJT19EQVRBX0NIQU5ORUwxICAgICAgICAgICAgICAweDgyMjAKLSNkZWZpbmUgRFBJT19EQVRBX0NIQU5ORUwyICAgICAgICAgICAgICAweDg0MjAKKyNkZWZpbmUgX1ZMVl9UWF9EVzE0X0NIMAkJMHg4MmI4CisjZGVmaW5lIF9WTFZfVFhfRFcxNF9DSDEJCTB4ODRiOAorI2RlZmluZSBWTFZfVFhfRFcxNChjaCkgX1BPUlQoY2gsIF9WTFZfVFhfRFcxNF9DSDAsIF9WTFZfVFhfRFcxNF9DSDEpCiAKIC8qCiAgKiBGZW5jZSByZWdpc3RlcnMKQEAgLTczMiw2ICs3MzUsOCBAQAogI2RlZmluZSBIV1NUQU0JCTB4MDIwOTgKICNkZWZpbmUgRE1BX0ZBRERfSThYWAkweDAyMGQwCiAjZGVmaW5lIFJJTkdfQkJTVEFURShiYXNlKQkoKGJhc2UpKzB4MTEwKQorI2RlZmluZSBSSU5HX0JCQUREUihiYXNlKQkoKGJhc2UpKzB4MTQwKQorI2RlZmluZSBSSU5HX0JCQUREUl9VRFcoYmFzZSkJKChiYXNlKSsweDE2OCkgLyogZ2VuOCsgKi8KIAogI2RlZmluZSBFUlJPUl9HRU42CTB4MDQwYTAKICNkZWZpbmUgR0VON19FUlJfSU5UCTB4NDQwNDAKQEAgLTkyMiw3ICs5MjcsNiBAQAogI2RlZmluZSAgIENNMF9DT0xPUl9FVklDVF9ESVNBQkxFICgxPDwzKQogI2RlZmluZSAgIENNMF9ERVBUSF9XUklURV9ESVNBQkxFICgxPDwxKQogI2RlZmluZSAgIENNMF9SQ19PUF9GTFVTSF9ESVNBQkxFICgxPDwwKQotI2RlZmluZSBCQl9BRERSCQkweDAyMTQwIC8qIDggYnl0ZXMgKi8KICNkZWZpbmUgR0ZYX0ZMU0hfQ05UTAkweDAyMTcwIC8qIDkxNSsgb25seSAqLwogI2RlZmluZSBHRlhfRkxTSF9DTlRMX0dFTjYJMHgxMDEwMDgKICNkZWZpbmUgICBHRlhfRkxTSF9DTlRMX0VOCSgxPDwwKQpAQCAtOTk5LDYgKzEwMDMsNyBAQAogCiAjZGVmaW5lIEdFTjdfRkZfVEhSRUFEX01PREUJCTB4MjBhMAogI2RlZmluZSAgIEdFTjdfRkZfU0NIRURfTUFTSwkJMHgwMDc3MDcwCisjZGVmaW5lICAgR0VOOF9GRl9EU19SRUZfQ05UX0ZGTUUJKDEgPDwgMTkpCiAjZGVmaW5lICAgR0VON19GRl9UU19TQ0hFRF9IUzEJCSgweDU8PDE2KQogI2RlZmluZSAgIEdFTjdfRkZfVFNfU0NIRURfSFMwCQkoMHgzPDwxNikKICNkZWZpbmUgICBHRU43X0ZGX1RTX1NDSEVEX0xPQURfQkFMQU5DRQkoMHgxPDwxNikKQEAgLTEwMjYsMTQgKzEwMzEsMTQgQEAKICNkZWZpbmUgICBGQkNfQ1RMX1VOQ09NUFJFU1NJQkxFICgxPDwxNCkKICNkZWZpbmUgICBGQkNfQ1RMX0MzX0lETEUJKDE8PDEzKQogI2RlZmluZSAgIEZCQ19DVExfU1RSSURFX1NISUZUCSg1KQotI2RlZmluZSAgIEZCQ19DVExfRkVOQ0VOTwkoMTw8MCkKKyNkZWZpbmUgICBGQkNfQ1RMX0ZFTkNFTk9fU0hJRlQJKDApCiAjZGVmaW5lIEZCQ19DT01NQU5ECQkweDAzMjBjCiAjZGVmaW5lICAgRkJDX0NNRF9DT01QUkVTUwkoMTw8MCkKICNkZWZpbmUgRkJDX1NUQVRVUwkJMHgwMzIxMAogI2RlZmluZSAgIEZCQ19TVEFUX0NPTVBSRVNTSU5HCSgxPDwzMSkKICNkZWZpbmUgICBGQkNfU1RBVF9DT01QUkVTU0VECSgxPDwzMCkKICNkZWZpbmUgICBGQkNfU1RBVF9NT0RJRklFRAkoMTw8MjkpCi0jZGVmaW5lICAgRkJDX1NUQVRfQ1VSUkVOVF9MSU5FCSgxPDwwKQorI2RlZmluZSAgIEZCQ19TVEFUX0NVUlJFTlRfTElORV9TSElGVAkoMCkKICNkZWZpbmUgRkJDX0NPTlRST0wyCQkweDAzMjE0CiAjZGVmaW5lICAgRkJDX0NUTF9GRU5DRV9EQkwJKDA8PDQpCiAjZGVmaW5lICAgRkJDX0NUTF9JRExFX0lNTQkoMDw8MikKQEAgLTIxMTcsOSArMjEyMiwxMyBAQAogICogUGxlYXNlIGNoZWNrIHRoZSBkZXRhaWxlZCBsb3JlIGluIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgZm9yIGV4cGVyaW1lbnRhbAogICogZXZpZGVuY2UuCiAgKi8KLSNkZWZpbmUgICBQT1JURF9IT1RQTFVHX0xJVkVfU1RBVFVTICAgICAgICAgICAgICAgKDEgPDwgMjkpCi0jZGVmaW5lICAgUE9SVENfSE9UUExVR19MSVZFX1NUQVRVUyAgICAgICAgICAgICAgICgxIDw8IDI4KQotI2RlZmluZSAgIFBPUlRCX0hPVFBMVUdfTElWRV9TVEFUVVMgICAgICAgICAgICAgICAoMSA8PCAyNykKKyNkZWZpbmUgICBQT1JURF9IT1RQTFVHX0xJVkVfU1RBVFVTX0c0WAkJKDEgPDwgMjkpCisjZGVmaW5lICAgUE9SVENfSE9UUExVR19MSVZFX1NUQVRVU19HNFgJCSgxIDw8IDI4KQorI2RlZmluZSAgIFBPUlRCX0hPVFBMVUdfTElWRV9TVEFUVVNfRzRYCQkoMSA8PCAyNykKKy8qIFZMViBEUC9IRE1JIGJpdHMgYWdhaW4gbWF0Y2ggQnNwZWMgKi8KKyNkZWZpbmUgICBQT1JURF9IT1RQTFVHX0xJVkVfU1RBVFVTX1ZMVgkJKDEgPDwgMjcpCisjZGVmaW5lICAgUE9SVENfSE9UUExVR19MSVZFX1NUQVRVU19WTFYJCSgxIDw8IDI4KQorI2RlZmluZSAgIFBPUlRCX0hPVFBMVUdfTElWRV9TVEFUVVNfVkxWCQkoMSA8PCAyOSkKICNkZWZpbmUgICBQT1JURF9IT1RQTFVHX0lOVF9TVEFUVVMJCSgzIDw8IDIxKQogI2RlZmluZSAgIFBPUlRDX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDMgPDwgMTkpCiAjZGVmaW5lICAgUE9SVEJfSE9UUExVR19JTlRfU1RBVFVTCQkoMyA8PCAxNykKQEAgLTIxMzAsNiArMjEzOSwxMSBAQAogI2RlZmluZSAgIENSVF9IT1RQTFVHX01PTklUT1JfQ09MT1IJCSgzIDw8IDgpCiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfTU9OSVRPUl9NT05PCQkoMiA8PCA4KQogI2RlZmluZSAgIENSVF9IT1RQTFVHX01PTklUT1JfTk9ORQkJKDAgPDwgOCkKKyNkZWZpbmUgICBEUF9BVVhfQ0hBTk5FTF9EX0lOVF9TVEFUVVNfRzRYCSgxIDw8IDYpCisjZGVmaW5lICAgRFBfQVVYX0NIQU5ORUxfQ19JTlRfU1RBVFVTX0c0WAkoMSA8PCA1KQorI2RlZmluZSAgIERQX0FVWF9DSEFOTkVMX0JfSU5UX1NUQVRVU19HNFgJKDEgPDwgNCkKKyNkZWZpbmUgICBEUF9BVVhfQ0hBTk5FTF9NQVNLX0lOVF9TVEFUVVNfRzRYCSg3IDw8IDQpCisKIC8qIFNEVk8gaXMgZGlmZmVyZW50IGFjcm9zcyBnZW4zLzQgKi8KICNkZWZpbmUgICBTRFZPQ19IT1RQTFVHX0lOVF9TVEFUVVNfRzRYCQkoMSA8PCAzKQogI2RlZmluZSAgIFNEVk9CX0hPVFBMVUdfSU5UX1NUQVRVU19HNFgJCSgxIDw8IDIpCkBAIC0zNDIxLDQyICszNDM1LDYgQEAKIC8qIHRoZSB1bml0IG9mIG1lbW9yeSBzZWxmLXJlZnJlc2ggbGF0ZW5jeSB0aW1lIGlzIDAuNXVzICovCiAjZGVmaW5lICBJTEtfU1JMVF9NQVNLCQkweDNmCiAKLS8qIGRlZmluZSB0aGUgZmlmbyBzaXplIG9uIElyb25sYWtlICovCi0jZGVmaW5lIElMS19ESVNQTEFZX0ZJRk8JMTI4Ci0jZGVmaW5lIElMS19ESVNQTEFZX01BWFdNCTY0Ci0jZGVmaW5lIElMS19ESVNQTEFZX0RGVFdNCTgKLSNkZWZpbmUgSUxLX0NVUlNPUl9GSUZPCQkzMgotI2RlZmluZSBJTEtfQ1VSU09SX01BWFdNCTE2Ci0jZGVmaW5lIElMS19DVVJTT1JfREZUV00JOAotCi0jZGVmaW5lIElMS19ESVNQTEFZX1NSX0ZJRk8JNTEyCi0jZGVmaW5lIElMS19ESVNQTEFZX01BWF9TUldNCTB4MWZmCi0jZGVmaW5lIElMS19ESVNQTEFZX0RGVF9TUldNCTB4M2YKLSNkZWZpbmUgSUxLX0NVUlNPUl9TUl9GSUZPCTY0Ci0jZGVmaW5lIElMS19DVVJTT1JfTUFYX1NSV00JMHgzZgotI2RlZmluZSBJTEtfQ1VSU09SX0RGVF9TUldNCTgKLQotI2RlZmluZSBJTEtfRklGT19MSU5FX1NJWkUJNjQKLQotLyogZGVmaW5lIHRoZSBXTSBpbmZvIG9uIFNhbmR5YnJpZGdlICovCi0jZGVmaW5lIFNOQl9ESVNQTEFZX0ZJRk8JMTI4Ci0jZGVmaW5lIFNOQl9ESVNQTEFZX01BWFdNCTB4N2YJLyogYml0IDE2OjIyICovCi0jZGVmaW5lIFNOQl9ESVNQTEFZX0RGVFdNCTgKLSNkZWZpbmUgU05CX0NVUlNPUl9GSUZPCQkzMgotI2RlZmluZSBTTkJfQ1VSU09SX01BWFdNCTB4MWYJLyogYml0IDQ6MCAqLwotI2RlZmluZSBTTkJfQ1VSU09SX0RGVFdNCTgKLQotI2RlZmluZSBTTkJfRElTUExBWV9TUl9GSUZPCTUxMgotI2RlZmluZSBTTkJfRElTUExBWV9NQVhfU1JXTQkweDFmZgkvKiBiaXQgMTY6OCAqLwotI2RlZmluZSBTTkJfRElTUExBWV9ERlRfU1JXTQkweDNmCi0jZGVmaW5lIFNOQl9DVVJTT1JfU1JfRklGTwk2NAotI2RlZmluZSBTTkJfQ1VSU09SX01BWF9TUldNCTB4M2YJLyogYml0IDU6MCAqLwotI2RlZmluZSBTTkJfQ1VSU09SX0RGVF9TUldNCTgKLQotI2RlZmluZSBTTkJfRkJDX01BWF9TUldNCTB4ZgkvKiBiaXQgMjM6MjAgKi8KLQotI2RlZmluZSBTTkJfRklGT19MSU5FX1NJWkUJNjQKLQogCiAvKiB0aGUgYWRkcmVzcyB3aGVyZSB3ZSBnZXQgYWxsIGtpbmRzIG9mIGxhdGVuY3kgdmFsdWUgKi8KICNkZWZpbmUgU1NLUEQJCQkweDVkMTAKQEAgLTM2MDAsOCArMzU3OCw2IEBACiAjZGVmaW5lIERJU1BfQkFTRUFERFJfTUFTSwkoMHhmZmZmZjAwMCkKICNkZWZpbmUgSTkxNV9MT19ESVNQQkFTRSh2YWwpCSh2YWwgJiB+RElTUF9CQVNFQUREUl9NQVNLKQogI2RlZmluZSBJOTE1X0hJX0RJU1BCQVNFKHZhbCkJKHZhbCAmIERJU1BfQkFTRUFERFJfTUFTSykKLSNkZWZpbmUgSTkxNV9NT0RJRllfRElTUEJBU0UocmVnLCBnZnhfYWRkcikgXAotCQkoSTkxNV9XUklURSgocmVnKSwgKGdmeF9hZGRyKSB8IEk5MTVfTE9fRElTUEJBU0UoSTkxNV9SRUFEKHJlZykpKSkKIAogLyogVkJJT1MgZmxhZ3MgKi8KICNkZWZpbmUgU1dGMDAJCQkoZGV2X3ByaXYtPmluZm8tPmRpc3BsYXlfbW1pb19vZmZzZXQgKyAweDcxNDEwKQpAQCAtMzc4Nyw3ICszNzYzLDcgQEAKIAogI2RlZmluZSBfU1BBQ05UUgkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDcyMTgwKQogI2RlZmluZSAgIFNQX0VOQUJMRQkJCSgxPDwzMSkKLSNkZWZpbmUgICBTUF9HRUFNTUFfRU5BQkxFCQkoMTw8MzApCisjZGVmaW5lICAgU1BfR0FNTUFfRU5BQkxFCQkoMTw8MzApCiAjZGVmaW5lICAgU1BfUElYRk9STUFUX01BU0sJCSgweGY8PDI2KQogI2RlZmluZSAgIFNQX0ZPUk1BVF9ZVVY0MjIJCSgwPDwyNikKICNkZWZpbmUgICBTUF9GT1JNQVRfQkdSNTY1CQkoNTw8MjYpCkBAIC00MTM5LDYgKzQxMTUsOCBAQAogI2RlZmluZSBESVNQX0FSQl9DVEwJMHg0NTAwMAogI2RlZmluZSAgRElTUF9USUxFX1NVUkZBQ0VfU1dJWlpMSU5HCSgxPDwxMykKICNkZWZpbmUgIERJU1BfRkJDX1dNX0RJUwkJKDE8PDE1KQorI2RlZmluZSBESVNQX0FSQl9DVEwyCTB4NDUwMDQKKyNkZWZpbmUgIERJU1BfREFUQV9QQVJUSVRJT05fNV82CSgxPDw2KQogI2RlZmluZSBHRU43X01TR19DVEwJMHg0NTAxMAogI2RlZmluZSAgV0FJVF9GT1JfUENIX1JFU0VUX0FDSwkJKDE8PDEpCiAjZGVmaW5lICBXQUlUX0ZPUl9QQ0hfRkxSX0FDSwkJKDE8PDApCkBAIC00MTU5LDYgKzQxMzcsMTAgQEAKICNkZWZpbmUgR0VON19MM1NRQ1JFRzQJCQkJMHhiMDM0CiAjZGVmaW5lICBMM1NRX1VSQl9SRUFEX0NBTV9NQVRDSF9ESVNBQkxFCSgxPDwyNykKIAorLyogR0VOOCBjaGlja2VuICovCisjZGVmaW5lIEhEQ19DSElDS0VOMAkJCQkweDczMDAKKyNkZWZpbmUgIEhEQ19GT1JDRV9OT05fQ09IRVJFTlQJCQkoMTw8NCkKKwogLyogV2FDYXRFcnJvclJlamVjdGlvbklzc3VlICovCiAjZGVmaW5lIEdFTjdfU1FfQ0hJQ0tFTl9NQkNVTklUX0NPTkZJRwkJMHg5MDMwCiAjZGVmaW5lICBHRU43X1NRX0NISUNLRU5fTUJDVU5JVF9TUUlOVE1PQgkoMTw8MTEpCkBAIC00ODQzLDYgKzQ4MjUsOCBAQAogI2RlZmluZSAgRk9SQ0VXQUtFX0FDSwkJCQkweDEzMDA5MAogI2RlZmluZSAgVkxWX0dUTENfV0FLRV9DVFJMCQkJMHgxMzAwOTAKICNkZWZpbmUgIFZMVl9HVExDX1BXX1NUQVRVUwkJCTB4MTMwMDk0CisjZGVmaW5lIFZMVl9HVExDX1BXX1JFTkRFUl9TVEFUVVNfTUFTSwkJMHg4MAorI2RlZmluZSBWTFZfR1RMQ19QV19NRURJQV9TVEFUVVNfTUFTSwkJMHgyMAogI2RlZmluZSAgRk9SQ0VXQUtFX01UCQkJCTB4YTE4OCAvKiBtdWx0aS10aHJlYWRlZCAqLwogI2RlZmluZSAgIEZPUkNFV0FLRV9LRVJORUwJCQkweDEKICNkZWZpbmUgICBGT1JDRVdBS0VfVVNFUgkJCTB4MgpAQCAtNDg1MSwxMiArNDgzNSwxNiBAQAogI2RlZmluZSAgICBGT1JDRVdBS0VfTVRfRU5BQkxFCQkJKDE8PDUpCiAKICNkZWZpbmUgIEdURklGT0RCRwkJCQkweDEyMDAwMAotI2RlZmluZSAgICBHVF9GSUZPX0NQVV9FUlJPUl9NQVNLCQk3CisjZGVmaW5lICAgIEdUX0ZJRk9fU0JEUk9QRVJSCQkJKDE8PDYpCisjZGVmaW5lICAgIEdUX0ZJRk9fQkxPQkRST1BFUlIJCQkoMTw8NSkKKyNkZWZpbmUgICAgR1RfRklGT19TQl9SRUFEX0FCT1JURVJSCQkoMTw8NCkKKyNkZWZpbmUgICAgR1RfRklGT19EUk9QRVJSCQkJKDE8PDMpCiAjZGVmaW5lICAgIEdUX0ZJRk9fT1ZGRVJSCQkJKDE8PDIpCiAjZGVmaW5lICAgIEdUX0ZJRk9fSUFXUkVSUgkJCSgxPDwxKQogI2RlZmluZSAgICBHVF9GSUZPX0lBUkRFUlIJCQkoMTw8MCkKIAotI2RlZmluZSAgR1RfRklGT19GUkVFX0VOVFJJRVMJCQkweDEyMDAwOAorI2RlZmluZSAgR1RGSUZPQ1RMCQkJCTB4MTIwMDA4CisjZGVmaW5lICAgIEdUX0ZJRk9fRlJFRV9FTlRSSUVTX01BU0sJCTB4N2YKICNkZWZpbmUgICAgR1RfRklGT19OVU1fUkVTRVJWRURfRU5UUklFUwkJMjAKIAogI2RlZmluZSAgSFNXX0lESUNSCQkJCTB4OTAwOApAQCAtNDg5MCw2ICs0ODc4LDcgQEAKICNkZWZpbmUgICBHRU42X1JDX0NUTF9SQzZfRU5BQkxFCQkoMTw8MTgpCiAjZGVmaW5lICAgR0VONl9SQ19DVExfUkMxZV9FTkFCTEUJCSgxPDwyMCkKICNkZWZpbmUgICBHRU42X1JDX0NUTF9SQzdfRU5BQkxFCQkoMTw8MjIpCisjZGVmaW5lICAgVkxWX1JDX0NUTF9DVFhfUlNUX1BBUkFMTEVMCQkoMTw8MjQpCiAjZGVmaW5lICAgR0VON19SQ19DVExfVE9fTU9ERQkJCSgxPDwyOCkKICNkZWZpbmUgICBHRU42X1JDX0NUTF9FSV9NT0RFKHgpCQkoKHgpPDwyNykKICNkZWZpbmUgICBHRU42X1JDX0NUTF9IV19FTkFCTEUJCQkoMTw8MzEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCmluZGV4IDk4NzkwYzcuLjgxNTBmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCkBAIC0xOTIsNyArMTkyLDYgQEAKIHN0YXRpYyB2b2lkIGk5MTVfc2F2ZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRGlzcGxheSBhcmJpdHJhdGlvbiBjb250cm9sICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDQpCkBAIC0yMDMsNDYgKzIwMiwyNyBAQAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJaTkxNV9zYXZlX2Rpc3BsYXlfcmVnKGRldik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrLCBmbGFncyk7Ci0KIAkvKiBMVkRTIHN0YXRlICovCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7Ci0JCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKLQkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMiA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwyKTsKLQkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19DUFVfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwpOwotCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX0NQVV9QV01fQ1RMMiA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwyKTsKIAkJaWYgKEhBU19QQ0hfSUJYKGRldikgfHwgSEFTX1BDSF9DUFQoZGV2KSkKIAkJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVMVkRTID0gSTkxNV9SRUFEKFBDSF9MVkRTKTsKIAl9IGVsc2UgaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgewogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQUF9DT05UUk9MKTsKIAkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZVBGSVRfUEdNX1JBVElPUyA9IEk5MTVfUkVBRChQRklUX1BHTV9SQVRJT1MpOwogCi0JCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTCA9Ci0JCQlJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMKFBJUEVfQSkpOwogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX0hJU1RfQ1RMID0KIAkJCUk5MTVfUkVBRChWTFZfQkxDX0hJU1RfQ1RMKFBJUEVfQSkpOwotCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwyID0KLQkJCUk5MTVfUkVBRChWTFZfQkxDX1BXTV9DVEwyKFBJUEVfQSkpOwotCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVExfQiA9Ci0JCQlJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMKFBJUEVfQikpOwogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX0hJU1RfQ1RMX0IgPQogCQkJSTkxNV9SRUFEKFZMVl9CTENfSElTVF9DVEwoUElQRV9CKSk7Ci0JCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDJfQiA9Ci0JCQlJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMMihQSVBFX0IpKTsKIAl9IGVsc2UgewogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQUF9DT05UUk9MKTsKIAkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZVBGSVRfUEdNX1JBVElPUyA9IEk5MTVfUkVBRChQRklUX1BHTV9SQVRJT1MpOwotCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DVEwpOwogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX0hJU1RfQ1RMID0gSTkxNV9SRUFEKEJMQ19ISVNUX0NUTCk7Ci0JCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQotCQkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOwogCQlpZiAoSVNfTU9CSUxFKGRldikgJiYgIUlTX0k4MzAoZGV2KSkKIAkJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVMVkRTID0gSTkxNV9SRUFEKExWRFMpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHQubG9jaywgZmxhZ3MpOwotCiAJaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSAmJiAhSEFTX1BDSF9TUExJVChkZXYpKQogCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUEZJVF9DT05UUk9MID0gSTkxNV9SRUFEKFBGSVRfQ09OVFJPTCk7CiAKQEAgLTI1Nyw3ICsyMzcsNyBAQAogCX0KIAogCS8qIE9ubHkgcmVnZmlsZS5zYXZlIEZCQyBzdGF0ZSBvbiB0aGUgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBGQkMgKi8KLQlpZiAoSTkxNV9IQVNfRkJDKGRldikpIHsKKwlpZiAoSEFTX0ZCQyhkZXYpKSB7CiAJCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKIAkJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVEUEZDX0NCX0JBU0UgPSBJOTE1X1JFQUQoSUxLX0RQRkNfQ0JfQkFTRSk7CiAJCX0gZWxzZSBpZiAoSVNfR000NShkZXYpKSB7CkBAIC0yNzgsNyArMjU4LDYgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBtYXNrID0gMHhmZmZmZmZmZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRGlzcGxheSBhcmJpdHJhdGlvbiAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA0KQpAQCAtMjg3LDEyICsyNjYsNiBAQAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJaTkxNV9yZXN0b3JlX2Rpc3BsYXlfcmVnKGRldik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrLCBmbGFncyk7Ci0KLQkvKiBMVkRTIHN0YXRlICovCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgJiYgIUhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJSTkxNV9XUklURShCTENfUFdNX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIpOwotCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCW1hc2sgPSB+TFZEU19QT1JUX0VOOwogCkBAIC0zMDUsMTMgKzI3OCw2IEBACiAJCUk5MTVfV1JJVEUoUEZJVF9DT05UUk9MLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUEZJVF9DT05UUk9MKTsKIAogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwpOwotCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIpOwotCQkvKiBOT1RFOiBCTENfUFdNX0NQVV9DVEwgbXVzdCBiZSB3cml0dGVuIGFmdGVyIEJMQ19QV01fQ1BVX0NUTDI7Ci0JCSAqIG90aGVyd2lzZSB3ZSBnZXQgYmxhbmsgZURQIHNjcmVlbiBhZnRlciBTMyBvbiBzb21lIG1hY2hpbmVzCi0JCSAqLwotCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfQ1BVX1BXTV9DVEwyKTsKLQkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfQ1BVX1BXTV9DVEwpOwogCQlJOTE1X1dSSVRFKFBDSF9QUF9PTl9ERUxBWVMsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVQUF9PTl9ERUxBWVMpOwogCQlJOTE1X1dSSVRFKFBDSF9QUF9PRkZfREVMQVlTLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUFBfT0ZGX0RFTEFZUyk7CiAJCUk5MTVfV1JJVEUoUENIX1BQX0RJVklTT1IsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVQUF9ESVZJU09SKTsKQEAgLTMxOSwyMSArMjg1LDEyIEBACiAJCUk5MTVfV1JJVEUoUlNUREJZQ1RMLAogCQkJICAgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZU1DSEJBUl9SRU5ERVJfU1RBTkRCWSk7CiAJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKLQkJSTkxNV9XUklURShWTFZfQkxDX1BXTV9DVEwoUElQRV9BKSwKLQkJCSAgIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTCk7CiAJCUk5MTVfV1JJVEUoVkxWX0JMQ19ISVNUX0NUTChQSVBFX0EpLAogCQkJICAgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19ISVNUX0NUTCk7Ci0JCUk5MTVfV1JJVEUoVkxWX0JMQ19QV01fQ1RMMihQSVBFX0EpLAotCQkJICAgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMik7Ci0JCUk5MTVfV1JJVEUoVkxWX0JMQ19QV01fQ1RMKFBJUEVfQiksCi0JCQkgICBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwpOwogCQlJOTE1X1dSSVRFKFZMVl9CTENfSElTVF9DVEwoUElQRV9CKSwKIAkJCSAgIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfSElTVF9DVEwpOwotCQlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTDIoUElQRV9CKSwKLQkJCSAgIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIpOwogCX0gZWxzZSB7CiAJCUk5MTVfV1JJVEUoUEZJVF9QR01fUkFUSU9TLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlUEZJVF9QR01fUkFUSU9TKTsKLQkJSTkxNV9XUklURShCTENfUFdNX0NUTCwgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMKTsKIAkJSTkxNV9XUklURShCTENfSElTVF9DVEwsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfSElTVF9DVEwpOwogCQlJOTE1X1dSSVRFKFBQX09OX0RFTEFZUywgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZVBQX09OX0RFTEFZUyk7CiAJCUk5MTVfV1JJVEUoUFBfT0ZGX0RFTEFZUywgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZVBQX09GRl9ERUxBWVMpOwpAQCAtMzQxLDExICsyOTgsOSBAQAogCQlJOTE1X1dSSVRFKFBQX0NPTlRST0wsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVQUF9DT05UUk9MKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKLQogCS8qIG9ubHkgcmVzdG9yZSBGQkMgaW5mbyBvbiB0aGUgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBGQkMqLwogCWludGVsX2Rpc2FibGVfZmJjKGRldik7Ci0JaWYgKEk5MTVfSEFTX0ZCQyhkZXYpKSB7CisJaWYgKEhBU19GQkMoZGV2KSkgewogCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCQlJOTE1X1dSSVRFKElMS19EUEZDX0NCX0JBU0UsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVEUEZDX0NCX0JBU0UpOwogCQl9IGVsc2UgaWYgKElTX0dNNDUoZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zeXNmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zeXNmcy5jCmluZGV4IGNlZjM4ZmQuLjMzYmNhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3lzZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N5c2ZzLmMKQEAgLTQwLDEwICs0MCwxMyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTY0IHJhd190aW1lOyAvKiAzMmIgdmFsdWUgbWF5IG92ZXJmbG93IGR1cmluZyBmaXhlZCBwb2ludCBtYXRoICovCiAJdTY0IHVuaXRzID0gMTI4VUxMLCBkaXYgPSAxMDAwMDBVTEwsIGJpYXMgPSAxMDBVTEw7CisJdTMyIHJldDsKIAogCWlmICghaW50ZWxfZW5hYmxlX3JjNihkZXYpKQogCQlyZXR1cm4gMDsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCS8qIE9uIFZMViwgcmVzaWRlbmN5IHRpbWUgaXMgaW4gQ1ogdW5pdHMgcmF0aGVyIHRoYW4gMS4yOHVzICovCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgewogCQl1MzIgY2xrY3RsMjsKQEAgLTUyLDcgKzU1LDggQEAKIAkJCUNMS19DVEwyX0NaQ09VTlRfMzBOU19TSElGVDsKIAkJaWYgKCFjbGtjdGwyKSB7CiAJCQlXQVJOKCFjbGtjdGwyLCAiYm9ndXMgQ1ogY291bnQgdmFsdWUiKTsKLQkJCXJldHVybiAwOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCXVuaXRzID0gRElWX1JPVU5EX1VQX1VMTCgzMFVMTCAqIGJpYXMsICh1NjQpY2xrY3RsMik7CiAJCWlmIChJOTE1X1JFQUQoVkxWX0NPVU5URVJfQ09OVFJPTCkgJiBWTFZfQ09VTlRfUkFOR0VfSElHSCkKQEAgLTYyLDcgKzY2LDExIEBACiAJfQogCiAJcmF3X3RpbWUgPSBJOTE1X1JFQUQocmVnKSAqIHVuaXRzOwotCXJldHVybiBESVZfUk9VTkRfVVBfVUxMKHJhd190aW1lLCBkaXYpOworCXJldCA9IERJVl9ST1VORF9VUF9VTEwocmF3X3RpbWUsIGRpdik7CisKK291dDoKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTE4MywxMyArMTkxLDEzIEBACiAJaW50IHNsaWNlID0gKGludCkodWludHB0cl90KWF0dHItPnByaXZhdGU7CiAJaW50IHJldDsKIAorCWlmICghSEFTX0hXX0NPTlRFWFRTKGRybV9kZXYpKQorCQlyZXR1cm4gLUVOWElPOworCiAJcmV0ID0gbDNfYWNjZXNzX3ZhbGlkKGRybV9kZXYsIG9mZnNldCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChkZXZfcHJpdi0+aHdfY29udGV4dHNfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5YSU87Ci0KIAlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkcm1fZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjU5LDcgKzI2Nyw3IEBACiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYtPmRldikpIHsKIAkJdTMyIGZyZXE7CiAJCWZyZXEgPSB2bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0dQVV9GUkVRX1NUUyk7Ci0JCXJldCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsIChmcmVxID4+IDgpICYgMHhmZik7CisJCXJldCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgKGZyZXEgPj4gOCkgJiAweGZmKTsKIAl9IGVsc2UgewogCQlyZXQgPSBkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSAqIEdUX0ZSRVFVRU5DWV9NVUxUSVBMSUVSOwogCX0KQEAgLTI3Niw4ICsyODQsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKLQkJCXZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsCi0JCQkJICAgICBkZXZfcHJpdi0+cnBzLnJwZV9kZWxheSkpOworCQkJdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLnJwZV9kZWxheSkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBndF9tYXhfZnJlcV9taHpfc2hvdyhzdHJ1Y3QgZGV2aWNlICprZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMjkxLDcgKzI5OCw3IEBACiAKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogCWlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2LT5kZXYpKQotCQlyZXQgPSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLCBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CisJCXJldCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkpOwogCWVsc2UKIAkJcmV0ID0gZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkgKiBHVF9GUkVRVUVOQ1lfTVVMVElQTElFUjsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CkBAIC0zMTgsNyArMzI1LDcgQEAKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYtPmRldikpIHsKLQkJdmFsID0gdmx2X2ZyZXFfb3Bjb2RlKGRldl9wcml2LT5tZW1fZnJlcSwgdmFsKTsKKwkJdmFsID0gdmx2X2ZyZXFfb3Bjb2RlKGRldl9wcml2LCB2YWwpOwogCiAJCWh3X21heCA9IHZhbGxleXZpZXdfcnBzX21heF9mcmVxKGRldl9wcml2KTsKIAkJaHdfbWluID0gdmFsbGV5dmlld19ycHNfbWluX2ZyZXEoZGV2X3ByaXYpOwpAQCAtMzQyLDE1ICszNDksMTUgQEAKIAkJRFJNX0RFQlVHKCJVc2VyIHJlcXVlc3RlZCBvdmVyY2xvY2tpbmcgdG8gJWRcbiIsCiAJCQkgIHZhbCAqIEdUX0ZSRVFVRU5DWV9NVUxUSVBMSUVSKTsKIAotCWlmIChkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSA+IHZhbCkgewotCQlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdi0+ZGV2KSkKLQkJCXZhbGxleXZpZXdfc2V0X3JwcyhkZXZfcHJpdi0+ZGV2LCB2YWwpOwotCQllbHNlCi0JCQlnZW42X3NldF9ycHMoZGV2X3ByaXYtPmRldiwgdmFsKTsKLQl9Ci0KIAlkZXZfcHJpdi0+cnBzLm1heF9kZWxheSA9IHZhbDsKIAorCWlmIChkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSA+IHZhbCkgeworCQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQorCQkJdmFsbGV5dmlld19zZXRfcnBzKGRldiwgdmFsKTsKKwkJZWxzZQorCQkJZ2VuNl9zZXRfcnBzKGRldiwgdmFsKTsKKwl9CisKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0zNjcsNyArMzc0LDcgQEAKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYtPmRldikpCi0JCXJldCA9IHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsIGRldl9wcml2LT5ycHMubWluX2RlbGF5KTsKKwkJcmV0ID0gdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSk7CiAJZWxzZQogCQlyZXQgPSBkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSAqIEdUX0ZSRVFVRU5DWV9NVUxUSVBMSUVSOwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKQEAgLTM5NCw3ICs0MDEsNyBAQAogCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAKIAlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0JCXZhbCA9IHZsdl9mcmVxX29wY29kZShkZXZfcHJpdi0+bWVtX2ZyZXEsIHZhbCk7CisJCXZhbCA9IHZsdl9mcmVxX29wY29kZShkZXZfcHJpdiwgdmFsKTsKIAogCQlod19tYXggPSB2YWxsZXl2aWV3X3Jwc19tYXhfZnJlcShkZXZfcHJpdik7CiAJCWh3X21pbiA9IHZhbGxleXZpZXdfcnBzX21pbl9mcmVxKGRldl9wcml2KTsKQEAgLTQxMSwxNSArNDE4LDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWRldl9wcml2LT5ycHMubWluX2RlbGF5ID0gdmFsOworCiAJaWYgKGRldl9wcml2LT5ycHMuY3VyX2RlbGF5IDwgdmFsKSB7CiAJCWlmIChJU19WQUxMRVlWSUVXKGRldikpCiAJCQl2YWxsZXl2aWV3X3NldF9ycHMoZGV2LCB2YWwpOwogCQllbHNlCi0JCQlnZW42X3NldF9ycHMoZGV2X3ByaXYtPmRldiwgdmFsKTsKKwkJCWdlbjZfc2V0X3JwcyhkZXYsIHZhbCk7CiAJfQogCi0JZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkgPSB2YWw7Ci0KIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC00NDksNyArNDU2LDkgQEAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKIAlycF9zdGF0ZV9jYXAgPSBJOTE1X1JFQUQoR0VONl9SUF9TVEFURV9DQVApOworCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCWlmIChhdHRyID09ICZkZXZfYXR0cl9ndF9SUDBfZnJlcV9taHopIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdW1zLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Vtcy5jCmluZGV4IDk2N2RhNDcuLmNhYTE4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdW1zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV91bXMuYwpAQCAtMjcwLDYgKzI3MCwxOCBAQAogCX0KIAkvKiBGSVhNRTogcmVnZmlsZS5zYXZlIFRWICYgU0RWTyBzdGF0ZSAqLwogCisJLyogQmFja2xpZ2h0ICovCisJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CisJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMik7CisJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfQ1BVX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMKTsKKwkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19DUFVfUFdNX0NUTDIgPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMMik7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCisJCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMMik7CisJfQorCiAJcmV0dXJuOwogfQogCkBAIC0yODAsNiArMjkyLDIxIEBACiAJaW50IGRwbGxfYl9yZWcsIGZwYjBfcmVnLCBmcGIxX3JlZzsKIAlpbnQgaTsKIAorCS8qIEJhY2tsaWdodCAqLworCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwpOworCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIpOworCQkvKiBOT1RFOiBCTENfUFdNX0NQVV9DVEwgbXVzdCBiZSB3cml0dGVuIGFmdGVyIEJMQ19QV01fQ1BVX0NUTDI7CisJCSAqIG90aGVyd2lzZSB3ZSBnZXQgYmxhbmsgZURQIHNjcmVlbiBhZnRlciBTMyBvbiBzb21lIG1hY2hpbmVzCisJCSAqLworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfQ1BVX1BXTV9DVEwyKTsKKwkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfQ1BVX1BXTV9DVEwpOworCX0gZWxzZSB7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQorCQkJSTkxNV9XUklURShCTENfUFdNX0NUTDIsIGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIpOworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCBkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwpOworCX0KKwogCS8qIERpc3BsYXkgcG9ydCByYXRpb3MgKG11c3QgYmUgZG9uZSBiZWZvcmUgY2xvY2sgaXMgc2V0KSAqLwogCWlmIChTVVBQT1JUU19JTlRFR1JBVEVEX0RQKGRldikpIHsKIAkJSTkxNV9XUklURShfUElQRUFfREFUQV9NX0c0WCwgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZVBJUEVBX0dNQ0hfREFUQV9NKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwppbmRleCBlNGZiYTM5Li5mMjIwNDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCkBAIC0yODEsNiArMjgxLDM0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorcGFyc2VfbGZwX2JhY2tsaWdodChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCit7CisJY29uc3Qgc3RydWN0IGJkYl9sZnBfYmFja2xpZ2h0X2RhdGEgKmJhY2tsaWdodF9kYXRhOworCWNvbnN0IHN0cnVjdCBiZGJfbGZwX2JhY2tsaWdodF9kYXRhX2VudHJ5ICplbnRyeTsKKworCWJhY2tsaWdodF9kYXRhID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfQkFDS0xJR0hUKTsKKwlpZiAoIWJhY2tsaWdodF9kYXRhKQorCQlyZXR1cm47CisKKwlpZiAoYmFja2xpZ2h0X2RhdGEtPmVudHJ5X3NpemUgIT0gc2l6ZW9mKGJhY2tsaWdodF9kYXRhLT5kYXRhWzBdKSkgeworCQlEUk1fREVCVUdfS01TKCJVbnN1cHBvcnRlZCBiYWNrbGlnaHQgZGF0YSBlbnRyeSBzaXplICV1XG4iLAorCQkJICAgICAgYmFja2xpZ2h0X2RhdGEtPmVudHJ5X3NpemUpOworCQlyZXR1cm47CisJfQorCisJZW50cnkgPSAmYmFja2xpZ2h0X2RhdGEtPmRhdGFbcGFuZWxfdHlwZV07CisKKwlkZXZfcHJpdi0+dmJ0LmJhY2tsaWdodC5wd21fZnJlcV9oeiA9IGVudHJ5LT5wd21fZnJlcV9oejsKKwlkZXZfcHJpdi0+dmJ0LmJhY2tsaWdodC5hY3RpdmVfbG93X3B3bSA9IGVudHJ5LT5hY3RpdmVfbG93X3B3bTsKKwlEUk1fREVCVUdfS01TKCJWQlQgYmFja2xpZ2h0IFBXTSBtb2R1bGF0aW9uIGZyZXF1ZW5jeSAldSBIeiwgIgorCQkgICAgICAiYWN0aXZlICVzLCBtaW4gYnJpZ2h0bmVzcyAldSwgbGV2ZWwgJXVcbiIsCisJCSAgICAgIGRldl9wcml2LT52YnQuYmFja2xpZ2h0LnB3bV9mcmVxX2h6LAorCQkgICAgICBkZXZfcHJpdi0+dmJ0LmJhY2tsaWdodC5hY3RpdmVfbG93X3B3bSA/ICJsb3ciIDogImhpZ2giLAorCQkgICAgICBlbnRyeS0+bWluX2JyaWdodG5lc3MsCisJCSAgICAgIGJhY2tsaWdodF9kYXRhLT5sZXZlbFtwYW5lbF90eXBlXSk7Cit9CisKIC8qIFRyeSB0byBmaW5kIHNkdm8gcGFuZWwgZGF0YSAqLwogc3RhdGljIHZvaWQKIHBhcnNlX3Nkdm9fcGFuZWxfZGF0YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC0zMjcsMTIgKzM1NSwxMiBAQAogewogCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKIAljYXNlIDI6Ci0JCXJldHVybiBhbHRlcm5hdGUgPyA2NiA6IDQ4OworCQlyZXR1cm4gYWx0ZXJuYXRlID8gNjY2NjcgOiA0ODAwMDsKIAljYXNlIDM6CiAJY2FzZSA0OgotCQlyZXR1cm4gYWx0ZXJuYXRlID8gMTAwIDogOTY7CisJCXJldHVybiBhbHRlcm5hdGUgPyAxMDAwMDAgOiA5NjAwMDsKIAlkZWZhdWx0OgotCQlyZXR1cm4gYWx0ZXJuYXRlID8gMTAwIDogMTIwOworCQlyZXR1cm4gYWx0ZXJuYXRlID8gMTAwMDAwIDogMTIwMDAwOwogCX0KIH0KIApAQCAtNzk2LDcgKzgyNCw3IEBACiAJICovCiAJZGV2X3ByaXYtPnZidC5sdmRzX3NzY19mcmVxID0gaW50ZWxfYmlvc19zc2NfZnJlcXVlbmN5KGRldiwKIAkJCSFIQVNfUENIX1NQTElUKGRldikpOwotCURSTV9ERUJVR19LTVMoIlNldCBkZWZhdWx0IHRvIFNTQyBhdCAlZE1IelxuIiwgZGV2X3ByaXYtPnZidC5sdmRzX3NzY19mcmVxKTsKKwlEUk1fREVCVUdfS01TKCJTZXQgZGVmYXVsdCB0byBTU0MgYXQgJWQga0h6XG4iLCBkZXZfcHJpdi0+dmJ0Lmx2ZHNfc3NjX2ZyZXEpOwogCiAJZm9yIChwb3J0ID0gUE9SVF9BOyBwb3J0IDwgSTkxNV9NQVhfUE9SVFM7IHBvcnQrKykgewogCQlzdHJ1Y3QgZGRpX3ZidF9wb3J0X2luZm8gKmluZm8gPQpAQCAtODk0LDYgKzkyMiw3IEBACiAJcGFyc2VfZ2VuZXJhbF9mZWF0dXJlcyhkZXZfcHJpdiwgYmRiKTsKIAlwYXJzZV9nZW5lcmFsX2RlZmluaXRpb25zKGRldl9wcml2LCBiZGIpOwogCXBhcnNlX2xmcF9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOworCXBhcnNlX2xmcF9iYWNrbGlnaHQoZGV2X3ByaXYsIGJkYik7CiAJcGFyc2Vfc2R2b19wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwogCXBhcnNlX3Nkdm9fZGV2aWNlX21hcHBpbmcoZGV2X3ByaXYsIGJkYik7CiAJcGFyc2VfZGV2aWNlX21hcHBpbmcoZGV2X3ByaXYsIGJkYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKaW5kZXggZjU4MGEyYi4uMjgyZGU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuaApAQCAtMzksNyArMzksNyBAQAogCXU4IHJlc2VydmVkMDsKIAl1MzIgYmRiX29mZnNldDsJCQkvKio8IGZyb20gYmVnaW5uaW5nIG9mIFZCVCAqLwogCXUzMiBhaW1fb2Zmc2V0WzRdOwkJLyoqPCBmcm9tIGJlZ2lubmluZyBvZiBWQlQgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYmRiX2hlYWRlciB7CiAJdTggc2lnbmF0dXJlWzE2XTsJCS8qKjwgQWx3YXlzICdCSU9TX0RBVEFfQkxPQ0snICovCkBAIC02NSw3ICs2NSw3IEBACiAJdTggcnN2ZDQ7IC8qIHBvcHVwIG1lbW9yeSBzaXplICovCiAJdTggcmVzaXplX3BjaV9iaW9zOwogCXU4IHJzdmQ1OyAvKiBpcyBjcnQgYWxyZWFkeSBvbiBkZGMyICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIEJJT1MgZGF0YSBibG9ja3MgKEJEQnMpLCBlYWNoIGJsb2NrIGhhcwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJdTggZHBfc3NjX2VuYjoxOwkvKiBQQ0ggYXR0YWNoZWQgZURQIHN1cHBvcnRzIFNTQyAqLwogCXU4IGRwX3NzY19mcmVxOjE7CS8qIFNTQyBmcmVxIGZvciBQQ0ggYXR0YWNoZWQgZURQICovCiAJdTggcnN2ZDExOjM7IC8qIGZpbmlzaCBieXRlICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogcHJlLTkxNSAqLwogI2RlZmluZSBHUElPX1BJTl9EVklfTFZEUwkweDAzIC8qICJEVkkvTFZEUyBEREMgR1BJTyBwaW5zIiAqLwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJdTggIGR2bzJfd2lyaW5nOwogCXUxNiBleHRlbmRlZF90eXBlOwogCXU4ICBkdm9fZnVuY3Rpb247Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGhpcyBvbmUgY29udGFpbnMgZmllbGQgb2Zmc2V0cyB0aGF0IGFyZSBrbm93biB0byBiZSBjb21tb24gZm9yIGFsbCBCREIKICAqIHZlcnNpb25zLiBOb3RpY2UgdGhhdCB0aGUgbWVhbmluZyBvZiB0aGUgY29udGVudHMgY29udGVudHMgbWF5IHN0aWxsIGNoYW5nZSwKQEAgLTIzOCw3ICsyMzgsNyBAQAogCXU4IG5vdF9jb21tb24yWzJdOwogCXU4IGRkY19waW47CiAJdTE2IGVkaWRfcHRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoaXMgZmllbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIEJEQiB2ZXJzaW9uLCBzbyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8KICAqIHJlYWQgaXQgaXMgYnkgY2hlY2tpbmcgdGhlIEJEQiB2ZXJzaW9uIGFuZCByZWFkaW5nIHRoZSByYXcgcG9pbnRlci4gKi8KQEAgLTI3OSw3ICsyNzksNyBAQAogCSAqCSAgICAgc2l6ZW9mKGNoaWxkX2RldmljZV9jb25maWcpOwogCSAqLwogCXVuaW9uIGNoaWxkX2RldmljZV9jb25maWcgZGV2aWNlc1swXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYmRiX2x2ZHNfb3B0aW9ucyB7CiAJdTggcGFuZWxfdHlwZTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCXU4IGx2ZHNfZWRpZDoxOwogCXU4IHJzdmQyOjE7CiAJdTggcnN2ZDQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogTEZQIHBvaW50ZXIgdGFibGUgY29udGFpbnMgZW50cmllcyB0byB0aGUgc3RydWN0IGJlbG93ICovCiBzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfcHRyIHsKQEAgLTMwMywxMiArMzAzLDEyIEBACiAJdTggZHZvX3RhYmxlX3NpemU7CiAJdTE2IHBhbmVsX3BucF9pZF9vZmZzZXQ7CiAJdTggcG5wX3RhYmxlX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0cnMgewogCXU4IGx2ZHNfZW50cmllczsgLyogZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbHZkc19kYXRhX3B0ciBzdHJ1Y3RzICovCiAJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0ciBwdHJbMTZdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIExGUCBkYXRhIGhhcyAzIGJsb2NrcyBwZXIgZW50cnkgKi8KIHN0cnVjdCBsdmRzX2ZwX3RpbWluZyB7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAl1MzIgcGZpdF9yZWc7CiAJdTMyIHBmaXRfcmVnX3ZhbDsKIAl1MTYgdGVybWluYXRvcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbHZkc19kdm9fdGltaW5nIHsKIAl1MTYgY2xvY2s7CQkvKio8IEluIDEwa2h6ICovCkBAIC0zNTMsNyArMzUzLDcgQEAKIAl1OCB2c3luY19wb3NpdGl2ZToxOwogCXU4IGhzeW5jX3Bvc2l0aXZlOjE7CiAJdTggcnN2ZDI6MTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbHZkc19wbnBfaWQgewogCXUxNiBtZmdfbmFtZTsKQEAgLTM2MSwxNyArMzYxLDMzIEBACiAJdTMyIHNlcmlhbDsKIAl1OCBtZmdfd2VlazsKIAl1OCBtZmdfeWVhcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgewogCXN0cnVjdCBsdmRzX2ZwX3RpbWluZyBmcF90aW1pbmc7CiAJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyBkdm9fdGltaW5nOwogCXN0cnVjdCBsdmRzX3BucF9pZCBwbnBfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhIHsKIAlzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgZGF0YVsxNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJkYl9sZnBfYmFja2xpZ2h0X2RhdGFfZW50cnkgeworCXU4IHR5cGU6MjsKKwl1OCBhY3RpdmVfbG93X3B3bToxOworCXU4IG9ic29sZXRlMTo1OworCXUxNiBwd21fZnJlcV9oejsKKwl1OCBtaW5fYnJpZ2h0bmVzczsKKwl1OCBvYnNvbGV0ZTI7CisJdTggb2Jzb2xldGUzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJkYl9sZnBfYmFja2xpZ2h0X2RhdGEgeworCXU4IGVudHJ5X3NpemU7CisJc3RydWN0IGJkYl9sZnBfYmFja2xpZ2h0X2RhdGFfZW50cnkgZGF0YVsxNl07CisJdTggbGV2ZWxbMTZdOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFpbWRiX2hlYWRlciB7CiAJY2hhciBzaWduYXR1cmVbMTZdOwpAQCAtMzc5LDEyICszOTUsMTIgQEAKIAl1MTYgYWltZGJfdmVyc2lvbjsKIAl1MTYgYWltZGJfaGVhZGVyX3NpemU7CiAJdTE2IGFpbWRiX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFpbWRiX2Jsb2NrIHsKIAl1OCBhaW1kYl9pZDsKIAl1MTYgYWltZGJfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdmNoX3BhbmVsX2RhdGEgewogCXUxNiBmcF90aW1pbmdfb2Zmc2V0OwpAQCAtMzk1LDEyICs0MTEsMTIgQEAKIAl1OCB0ZXh0X2ZpdHRpbmdfc2l6ZTsKIAl1MTYgZ3JhcGhpY3NfZml0dGluZ19vZmZzZXQ7CiAJdTggZ3JhcGhpY3NfZml0dGluZ19zaXplOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB2Y2hfYmRiXzIyIHsKIAlzdHJ1Y3QgYWltZGJfYmxvY2sgYWltZGJfYmxvY2s7CiAJc3RydWN0IHZjaF9wYW5lbF9kYXRhIHBhbmVsc1sxNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGJkYl9zZHZvX2x2ZHNfb3B0aW9ucyB7CiAJdTggcGFuZWxfYmFja2xpZ2h0OwpAQCAtNDE2LDcgKzQzMiw3IEBACiAJdTggcGFuZWxfbWlzY19iaXRzXzI7CiAJdTggcGFuZWxfbWlzY19iaXRzXzM7CiAJdTggcGFuZWxfbWlzY19iaXRzXzQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAjZGVmaW5lIEJEQl9EUklWRVJfRkVBVFVSRV9OT19MVkRTCQkwCkBAIC00NjIsNyArNDc4LDcgQEAKIAogCXU4IGhkbWlfdGVybWluYXRpb247CiAJdTggY3VzdG9tX3ZidF92ZXJzaW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgRURQXzE4QlBQCTAKICNkZWZpbmUgRURQXzI0QlBQCTEKQEAgLTQ4NywxNCArNTAzLDE0IEBACiAJdTE2IHQ5OwogCXUxNiB0MTA7CiAJdTE2IHQxMV90MTI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBlZHBfbGlua19wYXJhbXMgewogCXU4IHJhdGU6NDsKIAl1OCBsYW5lczo0OwogCXU4IHByZWVtcGhhc2lzOjQ7CiAJdTggdnN3aW5nOjQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBiZGJfZWRwIHsKIAlzdHJ1Y3QgZWRwX3Bvd2VyX3NlcSBwb3dlcl9zZXFzWzE2XTsKQEAgLTUwNSw3ICs1MjEsNyBAQAogCS8qIGl0aCBiaXQgaW5kaWNhdGVzIGVuYWJsZWQvZGlzYWJsZWQgZm9yIChpKzEpdGggcGFuZWwgKi8KIAl1MTYgZWRwX3MzZF9mZWF0dXJlOwogCXUxNiBlZHBfdDNfb3B0aW1pemF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB2b2lkIGludGVsX3NldHVwX2Jpb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaW50ZWxfcGFyc2VfYmlvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTczMyw2ICs3NDksNiBAQAogCXUzMiBobF9zd2l0Y2hfY250OwogCXUzMiBscF9ieXRlX2NsazsKIAl1MzIgY2xrX2xhbmVfc3dpdGNoX2NudDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYgLyogX0k4MzBfQklPU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwppbmRleCBiNWIxYjliLi5lMmUzOWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwpAQCAtMjIyLDggKzIyMiw5IEBACiAJaW50ZWxfbW9kZXNldF9jaGVja19zdGF0ZShjb25uZWN0b3ItPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfY3J0X21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cworaW50ZWxfY3J0X21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKaW5kZXggYjY5ZGMzZS4uZTA2YjllMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKQEAgLTczLDcgKzczLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYmR3X2RkaV90cmFuc2xhdGlvbnNfZWRwW10gPSB7Ci0JMHgwMEZGRkZGRiwgMHgwMDAwMDAxMiwJCS8qIERQIHBhcmFtZXRlcnMgKi8KKwkweDAwRkZGRkZGLCAweDAwMDAwMDEyLAkJLyogZURQIHBhcmFtZXRlcnMgKi8KIAkweDAwRUJBRkZGLCAweDAwMDIwMDExLAogCTB4MDBDNzFGRkYsIDB4MDAwNjAwMEYsCiAJMHgwMEZGRkZGRiwgMHgwMDAyMDAxMSwKQEAgLTY5NiwyNSArNjk2LDI1IEBACiAJKm4yX291dCA9IGJlc3QubjI7CiAJKnBfb3V0ID0gYmVzdC5wOwogCSpyMl9vdXQgPSBiZXN0LnIyOwotCi0JRFJNX0RFQlVHX0tNUygiV1JQTEw6ICVkSHogcmVmcmVzaCByYXRlIHdpdGggcD0lZCwgbjI9JWQgcjI9JWRcbiIsCi0JCSAgICAgIGNsb2NrLCAqcF9vdXQsICpuMl9vdXQsICpyMl9vdXQpOwogfQogCi1ib29sIGludGVsX2RkaV9wbGxfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQorLyoKKyAqIFRyaWVzIHRvIGZpbmQgYSBQTEwgZm9yIHRoZSBDUlRDLiBJZiBpdCBmaW5kcywgaXQgaW5jcmVhc2VzIHRoZSByZWZjb3VudCBhbmQKKyAqIHN0b3JlcyBpdCBpbiBpbnRlbF9jcnRjLT5kZGlfcGxsX3NlbCwgc28gb3RoZXIgbW9kZSBzZXRzIHdvbid0IGJlIGFibGUgdG8KKyAqIHN0ZWFsIHRoZSBzZWxlY3RlZCBQTEwuIFlvdSBuZWVkIHRvIGNhbGwgaW50ZWxfZGRpX3BsbF9lbmFibGUgdG8gYWN0dWFsbHkKKyAqIGVuYWJsZSB0aGUgUExMLgorICovCitib29sIGludGVsX2RkaV9wbGxfc2VsZWN0KHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjKQogewotCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmaW50ZWxfY3J0Yy0+YmFzZTsKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciA9IGludGVsX2RkaV9nZXRfY3J0Y19lbmNvZGVyKGNydGMpOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZpbnRlbF9lbmNvZGVyLT5iYXNlOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2RkaV9wbGxzICpwbGxzID0gJmRldl9wcml2LT5kZGlfcGxsczsKIAlpbnQgdHlwZSA9IGludGVsX2VuY29kZXItPnR5cGU7CiAJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCXVpbnQzMl90IHJlZywgdmFsOwogCWludCBjbG9jayA9IGludGVsX2NydGMtPmNvbmZpZy5wb3J0X2Nsb2NrOwogCi0JLyogVE9ETzogcmV1c2UgUExMcyB3aGVuIHBvc3NpYmxlIChjb21wYXJlIHZhbHVlcykgKi8KLQogCWludGVsX2RkaV9wdXRfY3J0Y19wbGwoY3J0Yyk7CiAKIAlpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQgfHwgdHlwZSA9PSBJTlRFTF9PVVRQVVRfRURQKSB7CkBAIC03MzYsNjYgKzczNiwxNDUgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCS8qIFdlIGRvbid0IG5lZWQgdG8gdHVybiBhbnkgUExMIG9uIGJlY2F1c2Ugd2UnbGwgdXNlIExDUExMLiAqLwotCQlyZXR1cm4gdHJ1ZTsKLQogCX0gZWxzZSBpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfSERNSSkgeworCQl1aW50MzJfdCByZWcsIHZhbDsKIAkJdW5zaWduZWQgcCwgbjIsIHIyOwogCi0JCWlmIChwbGxzLT53cnBsbDFfcmVmY291bnQgPT0gMCkgewotCQkJRFJNX0RFQlVHX0tNUygiVXNpbmcgV1JQTEwgMSBvbiBwaXBlICVjXG4iLAotCQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7Ci0JCQlwbGxzLT53cnBsbDFfcmVmY291bnQrKzsKLQkJCXJlZyA9IFdSUExMX0NUTDE7Ci0JCQlpbnRlbF9jcnRjLT5kZGlfcGxsX3NlbCA9IFBPUlRfQ0xLX1NFTF9XUlBMTDE7Ci0JCX0gZWxzZSBpZiAocGxscy0+d3JwbGwyX3JlZmNvdW50ID09IDApIHsKLQkJCURSTV9ERUJVR19LTVMoIlVzaW5nIFdSUExMIDIgb24gcGlwZSAlY1xuIiwKLQkJCQkgICAgICBwaXBlX25hbWUocGlwZSkpOwotCQkJcGxscy0+d3JwbGwyX3JlZmNvdW50Kys7Ci0JCQlyZWcgPSBXUlBMTF9DVEwyOwotCQkJaW50ZWxfY3J0Yy0+ZGRpX3BsbF9zZWwgPSBQT1JUX0NMS19TRUxfV1JQTEwyOwotCQl9IGVsc2UgewotCQkJRFJNX0VSUk9SKCJObyBXUlBMTHMgYXZhaWxhYmxlIVxuIik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlXQVJOKEk5MTVfUkVBRChyZWcpICYgV1JQTExfUExMX0VOQUJMRSwKLQkJICAgICAiV1JQTEwgYWxyZWFkeSBlbmFibGVkXG4iKTsKLQogCQlpbnRlbF9kZGlfY2FsY3VsYXRlX3dycGxsKGNsb2NrICogMTAwMCwgJnIyLCAmbjIsICZwKTsKIAogCQl2YWwgPSBXUlBMTF9QTExfRU5BQkxFIHwgV1JQTExfUExMX1NFTEVDVF9MQ1BMTF8yNzAwIHwKIAkJICAgICAgV1JQTExfRElWSURFUl9SRUZFUkVOQ0UocjIpIHwgV1JQTExfRElWSURFUl9GRUVEQkFDSyhuMikgfAogCQkgICAgICBXUlBMTF9ESVZJREVSX1BPU1QocCk7CiAKKwkJaWYgKHZhbCA9PSBJOTE1X1JFQUQoV1JQTExfQ1RMMSkpIHsKKwkJCURSTV9ERUJVR19LTVMoIlJldXNpbmcgV1JQTEwgMSBvbiBwaXBlICVjXG4iLAorCQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7CisJCQlyZWcgPSBXUlBMTF9DVEwxOworCQl9IGVsc2UgaWYgKHZhbCA9PSBJOTE1X1JFQUQoV1JQTExfQ1RMMikpIHsKKwkJCURSTV9ERUJVR19LTVMoIlJldXNpbmcgV1JQTEwgMiBvbiBwaXBlICVjXG4iLAorCQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7CisJCQlyZWcgPSBXUlBMTF9DVEwyOworCQl9IGVsc2UgaWYgKHBsbHMtPndycGxsMV9yZWZjb3VudCA9PSAwKSB7CisJCQlEUk1fREVCVUdfS01TKCJVc2luZyBXUlBMTCAxIG9uIHBpcGUgJWNcbiIsCisJCQkJICAgICAgcGlwZV9uYW1lKHBpcGUpKTsKKwkJCXJlZyA9IFdSUExMX0NUTDE7CisJCX0gZWxzZSBpZiAocGxscy0+d3JwbGwyX3JlZmNvdW50ID09IDApIHsKKwkJCURSTV9ERUJVR19LTVMoIlVzaW5nIFdSUExMIDIgb24gcGlwZSAlY1xuIiwKKwkJCQkgICAgICBwaXBlX25hbWUocGlwZSkpOworCQkJcmVnID0gV1JQTExfQ1RMMjsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiTm8gV1JQTExzIGF2YWlsYWJsZSFcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJRFJNX0RFQlVHX0tNUygiV1JQTEw6ICVkS0h6IHJlZnJlc2ggcmF0ZSB3aXRoIHA9JWQsIG4yPSVkIHIyPSVkXG4iLAorCQkJICAgICAgY2xvY2ssIHAsIG4yLCByMik7CisKKwkJaWYgKHJlZyA9PSBXUlBMTF9DVEwxKSB7CisJCQlwbGxzLT53cnBsbDFfcmVmY291bnQrKzsKKwkJCWludGVsX2NydGMtPmRkaV9wbGxfc2VsID0gUE9SVF9DTEtfU0VMX1dSUExMMTsKKwkJfSBlbHNlIHsKKwkJCXBsbHMtPndycGxsMl9yZWZjb3VudCsrOworCQkJaW50ZWxfY3J0Yy0+ZGRpX3BsbF9zZWwgPSBQT1JUX0NMS19TRUxfV1JQTEwyOworCQl9CisKIAl9IGVsc2UgaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0FOQUxPRykgewogCQlpZiAocGxscy0+c3BsbF9yZWZjb3VudCA9PSAwKSB7CiAJCQlEUk1fREVCVUdfS01TKCJVc2luZyBTUExMIG9uIHBpcGUgJWNcbiIsCiAJCQkJICAgICAgcGlwZV9uYW1lKHBpcGUpKTsKIAkJCXBsbHMtPnNwbGxfcmVmY291bnQrKzsKLQkJCXJlZyA9IFNQTExfQ1RMOwogCQkJaW50ZWxfY3J0Yy0+ZGRpX3BsbF9zZWwgPSBQT1JUX0NMS19TRUxfU1BMTDsKIAkJfSBlbHNlIHsKIAkJCURSTV9FUlJPUigiU1BMTCBhbHJlYWR5IGluIHVzZVxuIik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAotCQlXQVJOKEk5MTVfUkVBRChyZWcpICYgU1BMTF9QTExfRU5BQkxFLAotCQkgICAgICJTUExMIGFscmVhZHkgZW5hYmxlZFxuIik7Ci0KLQkJdmFsID0gU1BMTF9QTExfRU5BQkxFIHwgU1BMTF9QTExfRlJFUV8xMzUwTUh6IHwgU1BMTF9QTExfU1NDOwotCiAJfSBlbHNlIHsKIAkJV0FSTigxLCAiSW52YWxpZCBEREkgZW5jb2RlciB0eXBlICVkXG4iLCB0eXBlKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCUk5MTVfV1JJVEUocmVnLCB2YWwpOwotCXVkZWxheSgyMCk7Ci0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIFRvIGJlIGNhbGxlZCBhZnRlciBpbnRlbF9kZGlfcGxsX3NlbGVjdCgpLiBUaGF0IG9uZSBzZWxlY3RzIHRoZSBQTEwgdG8gYmUKKyAqIHVzZWQsIHRoaXMgb25lIGFjdHVhbGx5IGVuYWJsZXMgdGhlIFBMTC4KKyAqLwordm9pZCBpbnRlbF9kZGlfcGxsX2VuYWJsZShzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZGRpX3BsbHMgKnBsbHMgPSAmZGV2X3ByaXYtPmRkaV9wbGxzOworCWludCBjbG9jayA9IGNydGMtPmNvbmZpZy5wb3J0X2Nsb2NrOworCXVpbnQzMl90IHJlZywgY3VyX3ZhbCwgbmV3X3ZhbDsKKwlpbnQgcmVmY291bnQ7CisJY29uc3QgY2hhciAqcGxsX25hbWU7CisJdWludDMyX3QgZW5hYmxlX2JpdCA9ICgxIDw8IDMxKTsKKwl1bnNpZ25lZCBpbnQgcCwgbjIsIHIyOworCisJQlVJTERfQlVHX09OKGVuYWJsZV9iaXQgIT0gU1BMTF9QTExfRU5BQkxFKTsKKwlCVUlMRF9CVUdfT04oZW5hYmxlX2JpdCAhPSBXUlBMTF9QTExfRU5BQkxFKTsKKworCXN3aXRjaCAoY3J0Yy0+ZGRpX3BsbF9zZWwpIHsKKwljYXNlIFBPUlRfQ0xLX1NFTF9MQ1BMTF8yNzAwOgorCWNhc2UgUE9SVF9DTEtfU0VMX0xDUExMXzEzNTA6CisJY2FzZSBQT1JUX0NMS19TRUxfTENQTExfODEwOgorCQkvKgorCQkgKiBMQ1BMTCBzaG91bGQgYWx3YXlzIGJlIGVuYWJsZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgbW9kZSBzZXQKKwkJICogc2VxdWVuY2UsIHNvIG5vdGhpbmcgdG8gZG8uCisJCSAqLworCQlyZXR1cm47CisKKwljYXNlIFBPUlRfQ0xLX1NFTF9TUExMOgorCQlwbGxfbmFtZSA9ICJTUExMIjsKKwkJcmVnID0gU1BMTF9DVEw7CisJCXJlZmNvdW50ID0gcGxscy0+c3BsbF9yZWZjb3VudDsKKwkJbmV3X3ZhbCA9IFNQTExfUExMX0VOQUJMRSB8IFNQTExfUExMX0ZSRVFfMTM1ME1IeiB8CisJCQkgIFNQTExfUExMX1NTQzsKKwkJYnJlYWs7CisKKwljYXNlIFBPUlRfQ0xLX1NFTF9XUlBMTDE6CisJY2FzZSBQT1JUX0NMS19TRUxfV1JQTEwyOgorCQlpZiAoY3J0Yy0+ZGRpX3BsbF9zZWwgPT0gUE9SVF9DTEtfU0VMX1dSUExMMSkgeworCQkJcGxsX25hbWUgPSAiV1JQTEwxIjsKKwkJCXJlZyA9IFdSUExMX0NUTDE7CisJCQlyZWZjb3VudCA9IHBsbHMtPndycGxsMV9yZWZjb3VudDsKKwkJfSBlbHNlIHsKKwkJCXBsbF9uYW1lID0gIldSUExMMiI7CisJCQlyZWcgPSBXUlBMTF9DVEwyOworCQkJcmVmY291bnQgPSBwbGxzLT53cnBsbDJfcmVmY291bnQ7CisJCX0KKworCQlpbnRlbF9kZGlfY2FsY3VsYXRlX3dycGxsKGNsb2NrICogMTAwMCwgJnIyLCAmbjIsICZwKTsKKworCQluZXdfdmFsID0gV1JQTExfUExMX0VOQUJMRSB8IFdSUExMX1BMTF9TRUxFQ1RfTENQTExfMjcwMCB8CisJCQkgIFdSUExMX0RJVklERVJfUkVGRVJFTkNFKHIyKSB8CisJCQkgIFdSUExMX0RJVklERVJfRkVFREJBQ0sobjIpIHwgV1JQTExfRElWSURFUl9QT1NUKHApOworCisJCWJyZWFrOworCisJY2FzZSBQT1JUX0NMS19TRUxfTk9ORToKKwkJV0FSTigxLCAiQmFkIHNlbGVjdGVkIHBsbDogUE9SVF9DTEtfU0VMX05PTkVcbiIpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiQmFkIHNlbGVjdGVkIHBsbDogMHglMDh4XG4iLCBjcnRjLT5kZGlfcGxsX3NlbCk7CisJCXJldHVybjsKKwl9CisKKwljdXJfdmFsID0gSTkxNV9SRUFEKHJlZyk7CisKKwlXQVJOKHJlZmNvdW50IDwgMSwgIkJhZCAlcyByZWZjb3VudDogJWRcbiIsIHBsbF9uYW1lLCByZWZjb3VudCk7CisJaWYgKHJlZmNvdW50ID09IDEpIHsKKwkJV0FSTihjdXJfdmFsICYgZW5hYmxlX2JpdCwgIiVzIGFscmVhZHkgZW5hYmxlZFxuIiwgcGxsX25hbWUpOworCQlJOTE1X1dSSVRFKHJlZywgbmV3X3ZhbCk7CisJCVBPU1RJTkdfUkVBRChyZWcpOworCQl1ZGVsYXkoMjApOworCX0gZWxzZSB7CisJCVdBUk4oKGN1cl92YWwgJiBlbmFibGVfYml0KSA9PSAwLCAiJXMgZGlzYWJsZWRcbiIsIHBsbF9uYW1lKTsKKwl9Cit9CisKIHZvaWQgaW50ZWxfZGRpX3NldF9waXBlX3NldHRpbmdzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwpAQCAtMTEyMSw5ICsxMjAwLDcgQEAKIAogCWlmICh0eXBlID09IElOVEVMX09VVFBVVF9FRFApIHsKIAkJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKLQkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CiAJCWlyb25sYWtlX2VkcF9wYW5lbF9vbihpbnRlbF9kcCk7Ci0JCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCB0cnVlKTsKIAl9CiAKIAlXQVJOX09OKGludGVsX2NydGMtPmRkaV9wbGxfc2VsID09IFBPUlRfQ0xLX1NFTF9OT05FKTsKQEAgLTExNjYsNyArMTI0Myw2IEBACiAKIAlpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQgfHwgdHlwZSA9PSBJTlRFTF9PVVRQVVRfRURQKSB7CiAJCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoZW5jb2Rlcik7Ci0JCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwogCQlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT0ZGKTsKIAkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihpbnRlbF9kcCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IDJiZGUzNWQuLjlmYTI0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTkwLDggKzkwLDggQEAKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2k4eHhfZGFjID0gewogCS5kb3QgPSB7IC5taW4gPSAyNTAwMCwgLm1heCA9IDM1MDAwMCB9LAotCS52Y28gPSB7IC5taW4gPSA5MzAwMDAsIC5tYXggPSAxNDAwMDAwIH0sCi0JLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gMTYgfSwKKwkudmNvID0geyAubWluID0gOTA4MDAwLCAubWF4ID0gMTUxMjAwMCB9LAorCS5uID0geyAubWluID0gMiwgLm1heCA9IDE2IH0sCiAJLm0gPSB7IC5taW4gPSA5NiwgLm1heCA9IDE0MCB9LAogCS5tMSA9IHsgLm1pbiA9IDE4LCAubWF4ID0gMjYgfSwKIAkubTIgPSB7IC5taW4gPSA2LCAubWF4ID0gMTYgfSwKQEAgLTEwMyw4ICsxMDMsOCBAQAogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaTh4eF9kdm8gPSB7CiAJLmRvdCA9IHsgLm1pbiA9IDI1MDAwLCAubWF4ID0gMzUwMDAwIH0sCi0JLnZjbyA9IHsgLm1pbiA9IDkzMDAwMCwgLm1heCA9IDE0MDAwMDAgfSwKLQkubiA9IHsgLm1pbiA9IDMsIC5tYXggPSAxNiB9LAorCS52Y28gPSB7IC5taW4gPSA5MDgwMDAsIC5tYXggPSAxNTEyMDAwIH0sCisJLm4gPSB7IC5taW4gPSAyLCAubWF4ID0gMTYgfSwKIAkubSA9IHsgLm1pbiA9IDk2LCAubWF4ID0gMTQwIH0sCiAJLm0xID0geyAubWluID0gMTgsIC5tYXggPSAyNiB9LAogCS5tMiA9IHsgLm1pbiA9IDYsIC5tYXggPSAxNiB9LApAQCAtMTE2LDggKzExNiw4IEBACiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pOHh4X2x2ZHMgPSB7CiAJLmRvdCA9IHsgLm1pbiA9IDI1MDAwLCAubWF4ID0gMzUwMDAwIH0sCi0JLnZjbyA9IHsgLm1pbiA9IDkzMDAwMCwgLm1heCA9IDE0MDAwMDAgfSwKLQkubiA9IHsgLm1pbiA9IDMsIC5tYXggPSAxNiB9LAorCS52Y28gPSB7IC5taW4gPSA5MDgwMDAsIC5tYXggPSAxNTEyMDAwIH0sCisJLm4gPSB7IC5taW4gPSAyLCAubWF4ID0gMTYgfSwKIAkubSA9IHsgLm1pbiA9IDk2LCAubWF4ID0gMTQwIH0sCiAJLm0xID0geyAubWluID0gMTgsIC5tYXggPSAyNiB9LAogCS5tMiA9IHsgLm1pbiA9IDYsIC5tYXggPSAxNiB9LApAQCAtMzI5LDYgKzMyOSw4IEBACiB7CiAJY2xvY2stPm0gPSBjbG9jay0+bTEgKiBjbG9jay0+bTI7CiAJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9jay0+cDI7CisJaWYgKFdBUk5fT04oY2xvY2stPm4gPT0gMCB8fCBjbG9jay0+cCA9PSAwKSkKKwkJcmV0dXJuOwogCWNsb2NrLT52Y28gPSBESVZfUk9VTkRfQ0xPU0VTVChyZWZjbGsgKiBjbG9jay0+bSwgY2xvY2stPm4pOwogCWNsb2NrLT5kb3QgPSBESVZfUk9VTkRfQ0xPU0VTVChjbG9jay0+dmNvLCBjbG9jay0+cCk7CiB9CkBAIC00MzAsNiArNDMyLDggQEAKIHsKIAljbG9jay0+bSA9IGNsb2NrLT5tMiArIDI7CiAJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9jay0+cDI7CisJaWYgKFdBUk5fT04oY2xvY2stPm4gPT0gMCB8fCBjbG9jay0+cCA9PSAwKSkKKwkJcmV0dXJuOwogCWNsb2NrLT52Y28gPSBESVZfUk9VTkRfQ0xPU0VTVChyZWZjbGsgKiBjbG9jay0+bSwgY2xvY2stPm4pOwogCWNsb2NrLT5kb3QgPSBESVZfUk9VTkRfQ0xPU0VTVChjbG9jay0+dmNvLCBjbG9jay0+cCk7CiB9CkBAIC00NDMsNiArNDQ3LDggQEAKIHsKIAljbG9jay0+bSA9IGk5eHhfZHBsbF9jb21wdXRlX20oY2xvY2spOwogCWNsb2NrLT5wID0gY2xvY2stPnAxICogY2xvY2stPnAyOworCWlmIChXQVJOX09OKGNsb2NrLT5uICsgMiA9PSAwIHx8IGNsb2NrLT5wID09IDApKQorCQlyZXR1cm47CiAJY2xvY2stPnZjbyA9IERJVl9ST1VORF9DTE9TRVNUKHJlZmNsayAqIGNsb2NrLT5tLCBjbG9jay0+biArIDIpOwogCWNsb2NrLT5kb3QgPSBESVZfUk9VTkRfQ0xPU0VTVChjbG9jay0+dmNvLCBjbG9jay0+cCk7CiB9CkBAIC03NDgsMTAgKzc1NCwxMCBAQAogCXJldHVybiBpbnRlbF9jcnRjLT5jb25maWcuY3B1X3RyYW5zY29kZXI7CiB9CiAKLXN0YXRpYyB2b2lkIGlyb25sYWtlX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyB2b2lkIGc0eF93YWl0X2Zvcl92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgZnJhbWUsIGZyYW1lX3JlZyA9IFBJUEVGUkFNRShwaXBlKTsKKwl1MzIgZnJhbWUsIGZyYW1lX3JlZyA9IFBJUEVfRlJNQ09VTlRfR000NShwaXBlKTsKIAogCWZyYW1lID0gSTkxNV9SRUFEKGZyYW1lX3JlZyk7CiAKQEAgLTc3Miw4ICs3NzgsOCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBpcGVzdGF0X3JlZyA9IFBJUEVTVEFUKHBpcGUpOwogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDUpIHsKLQkJaXJvbmxha2Vfd2FpdF9mb3JfdmJsYW5rKGRldiwgcGlwZSk7CisJaWYgKElTX0c0WChkZXYpIHx8IElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDUpIHsKKwkJZzR4X3dhaXRfZm9yX3ZibGFuayhkZXYsIHBpcGUpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjA1LDE1ICsxMjExLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhc3NlcnRfcGNoX3JlZmNsa19lbmFibGVkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGlieF9hc3NlcnRfcGNoX3JlZmNsa19lbmFibGVkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKIAl1MzIgdmFsOwogCWJvb2wgZW5hYmxlZDsKIAotCWlmIChIQVNfUENIX0xQVChkZXZfcHJpdi0+ZGV2KSkgewotCQlEUk1fREVCVUdfRFJJVkVSKCJMUFQgZG9lcyBub3QgaGFzIFBDSCByZWZjbGssIHNraXBwaW5nIGNoZWNrXG4iKTsKLQkJcmV0dXJuOwotCX0KKwlXQVJOX09OKCEoSEFTX1BDSF9JQlgoZGV2X3ByaXYtPmRldikgfHwgSEFTX1BDSF9DUFQoZGV2X3ByaXYtPmRldikpKTsKIAogCXZhbCA9IEk5MTVfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKIAllbmFibGVkID0gISEodmFsICYgKERSRUZfU1NDX1NPVVJDRV9NQVNLIHwgRFJFRl9OT05TUFJFQURfU09VUkNFX01BU0sgfApAQCAtMTM2MSw2ICsxMzY0LDI0IEBACiAJaWYgKCFJU19WQUxMRVlWSUVXKGRldikpCiAJCXJldHVybjsKIAorCURQSU9fUEhZX0lPU0ZfUE9SVChEUElPX1BIWTApID0gSU9TRl9QT1JUX0RQSU87Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3Jlc2V0X2RwaW8oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFJU19WQUxMRVlWSUVXKGRldikpCisJCXJldHVybjsKKworCS8qCisJICogRW5hYmxlIHRoZSBDUkkgY2xvY2sgc291cmNlIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGRpc3BsYXkgYW5kIHRoZQorCSAqIHJlZmVyZW5jZSBjbG9jayBmb3IgVkdBIGhvdHBsdWcgLyBtYW51YWwgZGV0ZWN0aW9uLgorCSAqLworCUk5MTVfV1JJVEUoRFBMTChQSVBFX0IpLCBJOTE1X1JFQUQoRFBMTChQSVBFX0IpKSB8CisJCSAgIERQTExfUkVGQV9DTEtfRU5BQkxFX1ZMViB8CisJCSAgIERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMVik7CisKIAkvKgogCSAqIEZyb20gVkxWMkEwX0RQX2VEUF9EUElPX2RyaXZlcl92Ymlvc19ub3Rlc18xMC5kb2N4IC0KIAkgKiAgNi4JRGUtYXNzZXJ0IGNtbl9yZXNldC9zaWRlX3Jlc2V0LiBTYW1lIGFzIFZMViBYMC4KQEAgLTE0ODcsMjUgKzE1MDgsMzUgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIHBpcGUgaXNuJ3Qgc3RpbGwgcmVseWluZyBvbiB1cyAqLwogCWFzc2VydF9waXBlX2Rpc2FibGVkKGRldl9wcml2LCBwaXBlKTsKIAotCS8qIExlYXZlIGludGVncmF0ZWQgY2xvY2sgc291cmNlIGVuYWJsZWQgKi8KKwkvKgorCSAqIExlYXZlIGludGVncmF0ZWQgY2xvY2sgc291cmNlIGFuZCByZWZlcmVuY2UgY2xvY2sgZW5hYmxlZCBmb3IgcGlwZSBCLgorCSAqIFRoZSBsYXR0ZXIgaXMgbmVlZGVkIGZvciBWR0EgaG90cGx1ZyAvIG1hbnVhbCBkZXRlY3Rpb24uCisJICovCiAJaWYgKHBpcGUgPT0gUElQRV9CKQotCQl2YWwgPSBEUExMX0lOVEVHUkFURURfQ1JJX0NMS19WTFY7CisJCXZhbCA9IERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMViB8IERQTExfUkVGQV9DTEtfRU5BQkxFX1ZMVjsKIAlJOTE1X1dSSVRFKERQTEwocGlwZSksIHZhbCk7CiAJUE9TVElOR19SRUFEKERQTEwocGlwZSkpOwogfQogCi12b2lkIHZsdl93YWl0X3BvcnRfcmVhZHkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgcG9ydCkKK3ZvaWQgdmx2X3dhaXRfcG9ydF9yZWFkeShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCXN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmRwb3J0KQogewogCXUzMiBwb3J0X21hc2s7CiAKLQlpZiAoIXBvcnQpCisJc3dpdGNoIChkcG9ydC0+cG9ydCkgeworCWNhc2UgUE9SVF9COgogCQlwb3J0X21hc2sgPSBEUExMX1BPUlRCX1JFQURZX01BU0s7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIFBPUlRfQzoKIAkJcG9ydF9tYXNrID0gRFBMTF9QT1JUQ19SRUFEWV9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CiAKIAlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChEUExMKDApKSAmIHBvcnRfbWFzaykgPT0gMCwgMTAwMCkpCiAJCVdBUk4oMSwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBwb3J0ICVjIHJlYWR5OiAweCUwOHhcbiIsCi0JCSAgICAgJ0InICsgcG9ydCwgSTkxNV9SRUFEKERQTEwoMCkpKTsKKwkJICAgICBwb3J0X25hbWUoZHBvcnQtPnBvcnQpLCBJOTE1X1JFQUQoRFBMTCgwKSkpOwogfQogCiAvKioKQEAgLTIwODMsOCArMjExNCw4IEBACiAJCSAgICAgIGZiLT5waXRjaGVzWzBdKTsKIAlJOTE1X1dSSVRFKERTUFNUUklERShwbGFuZSksIGZiLT5waXRjaGVzWzBdKTsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQlJOTE1X01PRElGWV9ESVNQQkFTRShEU1BTVVJGKHBsYW5lKSwKLQkJCQkgICAgIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQpOworCQlJOTE1X1dSSVRFKERTUFNVUkYocGxhbmUpLAorCQkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBpbnRlbF9jcnRjLT5kc3BhZGRyX29mZnNldCk7CiAJCUk5MTVfV1JJVEUoRFNQVElMRU9GRihwbGFuZSksICh5IDw8IDE2KSB8IHgpOwogCQlJOTE1X1dSSVRFKERTUExJTk9GRihwbGFuZSksIGxpbmVhcl9vZmZzZXQpOwogCX0gZWxzZQpAQCAtMjE3NCw4ICsyMjA1LDggQEAKIAkJICAgICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaiksIGxpbmVhcl9vZmZzZXQsIHgsIHksCiAJCSAgICAgIGZiLT5waXRjaGVzWzBdKTsKIAlJOTE1X1dSSVRFKERTUFNUUklERShwbGFuZSksIGZiLT5waXRjaGVzWzBdKTsKLQlJOTE1X01PRElGWV9ESVNQQkFTRShEU1BTVVJGKHBsYW5lKSwKLQkJCSAgICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBpbnRlbF9jcnRjLT5kc3BhZGRyX29mZnNldCk7CisJSTkxNV9XUklURShEU1BTVVJGKHBsYW5lKSwKKwkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBpbnRlbF9jcnRjLT5kc3BhZGRyX29mZnNldCk7CiAJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkgewogCQlJOTE1X1dSSVRFKERTUE9GRlNFVChwbGFuZSksICh5IDw8IDE2KSB8IHgpOwogCX0gZWxzZSB7CkBAIC0yMjMzLDcgKzIyNjQsMTIgQEAKIAkJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCiAJCW11dGV4X2xvY2soJmNydGMtPm11dGV4KTsKLQkJaWYgKGludGVsX2NydGMtPmFjdGl2ZSkKKwkJLyoKKwkJICogRklYTUU6IE9uY2Ugd2UgaGF2ZSBwcm9wZXIgc3VwcG9ydCBmb3IgcHJpbWFyeSBwbGFuZXMgKGFuZAorCQkgKiBkaXNhYmxpbmcgdGhlbSB3aXRob3V0IGRpc2FibGluZyB0aGUgZW50aXJlIGNydGMpIGFsbG93IGFnYWluCisJCSAqIGEgTlVMTCBjcnRjLT5mYi4KKwkJICovCisJCWlmIChpbnRlbF9jcnRjLT5hY3RpdmUgJiYgY3J0Yy0+ZmIpCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfcGxhbmUoY3J0YywgY3J0Yy0+ZmIsCiAJCQkJCQkgICAgICAgY3J0Yy0+eCwgY3J0Yy0+eSk7CiAJCW11dGV4X3VubG9jaygmY3J0Yy0+bXV0ZXgpOwpAQCAtMjM1MCw2ICsyMzg2LDggQEAKIAkJCUk5MTVfV1JJVEUoUEZfV0lOX1BPUyhpbnRlbF9jcnRjLT5waXBlKSwgMCk7CiAJCQlJOTE1X1dSSVRFKFBGX1dJTl9TWihpbnRlbF9jcnRjLT5waXBlKSwgMCk7CiAJCX0KKwkJaW50ZWxfY3J0Yy0+Y29uZmlnLnBpcGVfc3JjX3cgPSBhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNwbGF5OworCQlpbnRlbF9jcnRjLT5jb25maWcucGlwZV9zcmNfaCA9IGFkanVzdGVkX21vZGUtPmNydGNfdmRpc3BsYXk7CiAJfQogCiAJcmV0ID0gZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3BsYW5lKGNydGMsIGZiLCB4LCB5KTsKQEAgLTI5NDQsNiArMjk4MiwzMCBAQAogCXJldHVybiBwZW5kaW5nOwogfQogCitib29sIGludGVsX2hhc19wZW5kaW5nX2ZiX3VucGluKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGludGVsX2NydGMgKmNydGM7CisKKwkvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBiZSBjYWxsZWQgd2l0aCBtb2RlX2NvbmZpZy5sb2NrIGhlcmUKKwkgKiBhcyBvdXIgbGlzdCBvZiBDUlRDIG9iamVjdHMgaXMgc3RhdGljIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlCisJICogZGV2aWNlIGFuZCBzbyBjYW5ub3QgZGlzYXBwZWFyIGFzIHdlIGl0ZXJhdGUuIFNpbWlsYXJseSwgd2UgY2FuCisJICogaGFwcGlseSB0cmVhdCB0aGUgcHJlZGljYXRlcyBhcyByYWN5LCBhdG9taWMgY2hlY2tzIGFzIHVzZXJzcGFjZQorCSAqIGNhbm5vdCBjbGFpbSBhbmQgcGluIGEgbmV3IGZiIHdpdGhvdXQgYXQgbGVhc3QgYWNxdXJpbmcgdGhlCisJICogc3RydWN0X211dGV4IGFuZCBzbyBzZXJpYWxpc2luZyB3aXRoIHVzLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZjcnRjLT51bnBpbl93b3JrX2NvdW50KSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGNydGMtPnVucGluX3dvcmspCisJCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBjcnRjLT5waXBlKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTMzOTksOSArMzQ2MSw4IEBACiAJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAkJLyogUXVvdGluZyBBcnQgUnVueWFuOiAiaXRzIG5vdCBzYWZlIHRvIGV4cGVjdCBhbnkgcGFydGljdWxhcgogCQkgKiB2YWx1ZSBpbiBJUFNfQ1RMIGJpdCAzMSBhZnRlciBlbmFibGluZyBJUFMgdGhyb3VnaCB0aGUKLQkJICogbWFpbGJveC4iIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGRlZmVyIHdhaXRpbmcgb24gdGhlIHN0YXRlCi0JCSAqIGNoYW5nZS4KLQkJICogVE9ETzogbmVlZCB0byBmaXggdGhpcyBmb3Igc3RhdGUgY2hlY2tlcgorCQkgKiBtYWlsYm94LiIgTW9yZW92ZXIsIHRoZSBtYWlsYm94IG1heSByZXR1cm4gYSBib2d1cyBzdGF0ZSwKKwkJICogc28gd2UgbmVlZCB0byBqdXN0IGVuYWJsZSBpdCBhbmQgY29udGludWUgb24uCiAJCSAqLwogCX0gZWxzZSB7CiAJCUk5MTVfV1JJVEUoSVBTX0NUTCwgSVBTX0VOQUJMRSk7CkBAIC0zNDI4LDkgKzM0ODksMTAgQEAKIAkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAkJV0FSTl9PTihzYW5keWJyaWRnZV9wY29kZV93cml0ZShkZXZfcHJpdiwgRElTUExBWV9JUFNfQ09OVFJPTCwgMCkpOwogCQltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJSTkxNV9XUklURShJUFNfQ1RMLCAwKTsKLQlQT1NUSU5HX1JFQUQoSVBTX0NUTCk7CisJCVBPU1RJTkdfUkVBRChJUFNfQ1RMKTsKKwl9CiAKIAkvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgdmJsYW5rIGJlZm9yZSB3ZSBjYW4gZGlzYWJsZSB0aGUgcGxhbmUuICovCiAJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgY3J0Yy0+cGlwZSk7CkBAIC0zNDY1LDcgKzM1MjcsNyBAQAogCS8qIFdvcmthcm91bmQgOiBEbyBub3QgcmVhZCBvciB3cml0ZSB0aGUgcGlwZSBwYWxldHRlL2dhbW1hIGRhdGEgd2hpbGUKIAkgKiBHQU1NQV9NT0RFIGlzIGNvbmZpZ3VyZWQgZm9yIHNwbGl0IGdhbW1hIGFuZCBJUFNfQ1RMIGhhcyBJUFMgZW5hYmxlZC4KIAkgKi8KLQlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmlwc19lbmFibGVkICYmCisJaWYgKElTX0hBU1dFTEwoZGV2KSAmJiBpbnRlbF9jcnRjLT5jb25maWcuaXBzX2VuYWJsZWQgJiYKIAkgICAgKChJOTE1X1JFQUQoR0FNTUFfTU9ERShwaXBlKSkgJiBHQU1NQV9NT0RFX01PREVfTUFTSykgPT0KIAkgICAgIEdBTU1BX01PREVfTU9ERV9TUExJVCkpIHsKIAkJaHN3X2Rpc2FibGVfaXBzKGludGVsX2NydGMpOwpAQCAtMzkxMCw2ICszOTcyLDE3NCBAQAogCUk5MTVfV1JJVEUoQkNMUlBBVChjcnRjLT5waXBlKSwgMCk7CiB9CiAKK2ludCB2YWxsZXl2aWV3X2dldF92Y28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWludCBocGxsX2ZyZXEsIHZjb19mcmVxW10gPSB7IDgwMCwgMTYwMCwgMjAwMCwgMjQwMCB9OworCisJLyogT2J0YWluIFNLVSBpbmZvcm1hdGlvbiAqLworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCWhwbGxfZnJlcSA9IHZsdl9jY2tfcmVhZChkZXZfcHJpdiwgQ0NLX0ZVU0VfUkVHKSAmCisJCUNDS19GVVNFX0hQTExfRlJFUV9NQVNLOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwlyZXR1cm4gdmNvX2ZyZXFbaHBsbF9mcmVxXTsKK30KKworLyogQWRqdXN0IENEY2xrIGRpdmlkZXJzIHRvIGFsbG93IGhpZ2ggcmVzIG9yIHNhdmUgcG93ZXIgaWYgcG9zc2libGUgKi8KK3N0YXRpYyB2b2lkIHZhbGxleXZpZXdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNsaykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiB2YWwsIGNtZDsKKworCWlmIChjZGNsayA+PSAzMjApIC8qIGp1bXAgdG8gaGlnaGVzdCB2b2x0YWdlIGZvciA0MDBNSHogdG9vICovCisJCWNtZCA9IDI7CisJZWxzZSBpZiAoY2RjbGsgPT0gMjY2KQorCQljbWQgPSAxOworCWVsc2UKKwkJY21kID0gMDsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKKwl2YWwgJj0gfkRTUEZSRVFHVUFSX01BU0s7CisJdmFsIHw9IChjbWQgPDwgRFNQRlJFUUdVQVJfU0hJRlQpOworCXZsdl9wdW5pdF93cml0ZShkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEsIHZhbCk7CisJaWYgKHdhaXRfZm9yKCh2bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEpICYKKwkJICAgICAgRFNQRlJFUVNUQVRfTUFTSykgPT0gKGNtZCA8PCBEU1BGUkVRU1RBVF9TSElGVCksCisJCSAgICAgNTApKSB7CisJCURSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIENEY2xrIGNoYW5nZVxuIik7CisJfQorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCWlmIChjZGNsayA9PSA0MDApIHsKKwkJdTMyIGRpdmlkZXIsIHZjbzsKKworCQl2Y28gPSB2YWxsZXl2aWV3X2dldF92Y28oZGV2X3ByaXYpOworCQlkaXZpZGVyID0gKCh2Y28gPDwgMSkgLyBjZGNsaykgLSAxOworCisJCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCQkvKiBhZGp1c3QgY2RjbGsgZGl2aWRlciAqLworCQl2YWwgPSB2bHZfY2NrX3JlYWQoZGV2X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wpOworCQl2YWwgJj0gfjB4ZjsKKwkJdmFsIHw9IGRpdmlkZXI7CisJCXZsdl9jY2tfd3JpdGUoZGV2X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wsIHZhbCk7CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisJLyogYWRqdXN0IHNlbGYtcmVmcmVzaCBleGl0IGxhdGVuY3kgdmFsdWUgKi8KKwl2YWwgPSB2bHZfYnVuaXRfcmVhZChkZXZfcHJpdiwgQlVOSVRfUkVHX0JJU09DKTsKKwl2YWwgJj0gfjB4N2Y7CisKKwkvKgorCSAqIEZvciBoaWdoIGJhbmR3aWR0aCBjb25maWdzLCB3ZSBzZXQgYSBoaWdoZXIgbGF0ZW5jeSBpbiB0aGUgYnVuaXQKKwkgKiBzbyB0aGF0IHRoZSBjb3JlIGRpc3BsYXkgZmV0Y2ggaGFwcGVucyBpbiB0aW1lIHRvIGF2b2lkIHVuZGVycnVucy4KKwkgKi8KKwlpZiAoY2RjbGsgPT0gNDAwKQorCQl2YWwgfD0gNDUwMCAvIDI1MDsgLyogNC41IHVzZWMgKi8KKwllbHNlCisJCXZhbCB8PSAzMDAwIC8gMjUwOyAvKiAzLjAgdXNlYyAqLworCXZsdl9idW5pdF93cml0ZShkZXZfcHJpdiwgQlVOSVRfUkVHX0JJU09DLCB2YWwpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBTaW5jZSB3ZSBjaGFuZ2VkIHRoZSBDRGNsaywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEdNQlVTRlJFUSB0b28gKi8KKwlpbnRlbF9pMmNfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCB2YWxsZXl2aWV3X2N1cl9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IGN1cl9jZGNsaywgdmNvOworCWludCBkaXZpZGVyOworCisJdmNvID0gdmFsbGV5dmlld19nZXRfdmNvKGRldl9wcml2KTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCWRpdmlkZXIgPSB2bHZfY2NrX3JlYWQoZGV2X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwlkaXZpZGVyICY9IDB4ZjsKKworCWN1cl9jZGNsayA9ICh2Y28gPDwgMSkgLyAoZGl2aWRlciArIDEpOworCisJcmV0dXJuIGN1cl9jZGNsazsKK30KKworc3RhdGljIGludCB2YWxsZXl2aWV3X2NhbGNfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSBpbnQgbWF4X3BpeGNsaykKK3sKKwlpbnQgY3VyX2NkY2xrOworCisJY3VyX2NkY2xrID0gdmFsbGV5dmlld19jdXJfY2RjbGsoZGV2X3ByaXYpOworCisJLyoKKwkgKiBSZWFsbHkgb25seSBhIGZldyBjYXNlcyB0byBkZWFsIHdpdGgsIGFzIG9ubHkgNCBDRGNsa3MgYXJlIHN1cHBvcnRlZDoKKwkgKiAgIDIwME1IegorCSAqICAgMjY3TUh6CisJICogICAzMjBNSHoKKwkgKiAgIDQwME1IegorCSAqIFNvIHdlIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlJ3JlIGFib3ZlIDkwJSBvZiB0aGUgbG93ZXIgYmluIGFuZAorCSAqIGFkanVzdCBpZiBuZWVkZWQuCisJICovCisJaWYgKG1heF9waXhjbGsgPiAyODgwMDApIHsKKwkJcmV0dXJuIDQwMDsKKwl9IGVsc2UgaWYgKG1heF9waXhjbGsgPiAyNDAwMDApIHsKKwkJcmV0dXJuIDMyMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDI2NjsKKwkvKiBMb29rcyBsaWtlIHRoZSAyMDBNSHogQ0RjbGsgZnJlcSBkb2Vzbid0IHdvcmsgb24gc29tZSBjb25maWdzICovCit9CisKK3N0YXRpYyBpbnQgaW50ZWxfbW9kZV9tYXhfcGl4Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgdW5zaWduZWQgbW9kZXNldF9waXBlcywKKwkJCQkgc3RydWN0IGludGVsX2NydGNfY29uZmlnICpwaXBlX2NvbmZpZykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKKwlpbnQgbWF4X3BpeGNsayA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVsX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKKwkJCSAgICBiYXNlLmhlYWQpIHsKKwkJaWYgKG1vZGVzZXRfcGlwZXMgJiAoMSA8PCBpbnRlbF9jcnRjLT5waXBlKSkKKwkJCW1heF9waXhjbGsgPSBtYXgobWF4X3BpeGNsaywKKwkJCQkJIHBpcGVfY29uZmlnLT5hZGp1c3RlZF9tb2RlLmNydGNfY2xvY2spOworCQllbHNlIGlmIChpbnRlbF9jcnRjLT5iYXNlLmVuYWJsZWQpCisJCQltYXhfcGl4Y2xrID0gbWF4KG1heF9waXhjbGssCisJCQkJCSBpbnRlbF9jcnRjLT5jb25maWcuYWRqdXN0ZWRfbW9kZS5jcnRjX2Nsb2NrKTsKKwl9CisKKwlyZXR1cm4gbWF4X3BpeGNsazsKK30KKworc3RhdGljIHZvaWQgdmFsbGV5dmlld19tb2Rlc2V0X2dsb2JhbF9waXBlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgdW5zaWduZWQgKnByZXBhcmVfcGlwZXMsCisJCQkJCSAgICB1bnNpZ25lZCBtb2Rlc2V0X3BpcGVzLAorCQkJCQkgICAgc3RydWN0IGludGVsX2NydGNfY29uZmlnICpwaXBlX2NvbmZpZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOworCWludCBtYXhfcGl4Y2xrID0gaW50ZWxfbW9kZV9tYXhfcGl4Y2xrKGRldl9wcml2LCBtb2Rlc2V0X3BpcGVzLAorCQkJCQkgICAgICAgcGlwZV9jb25maWcpOworCWludCBjdXJfY2RjbGsgPSB2YWxsZXl2aWV3X2N1cl9jZGNsayhkZXZfcHJpdik7CisKKwlpZiAodmFsbGV5dmlld19jYWxjX2NkY2xrKGRldl9wcml2LCBtYXhfcGl4Y2xrKSA9PSBjdXJfY2RjbGspCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZWxfY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LAorCQkJICAgIGJhc2UuaGVhZCkKKwkJaWYgKGludGVsX2NydGMtPmJhc2UuZW5hYmxlZCkKKwkJCSpwcmVwYXJlX3BpcGVzIHw9ICgxIDw8IGludGVsX2NydGMtPnBpcGUpOworfQorCitzdGF0aWMgdm9pZCB2YWxsZXl2aWV3X21vZGVzZXRfZ2xvYmFsX3Jlc291cmNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IG1heF9waXhjbGsgPSBpbnRlbF9tb2RlX21heF9waXhjbGsoZGV2X3ByaXYsIDAsIE5VTEwpOworCWludCBjdXJfY2RjbGsgPSB2YWxsZXl2aWV3X2N1cl9jZGNsayhkZXZfcHJpdik7CisJaW50IHJlcV9jZGNsayA9IHZhbGxleXZpZXdfY2FsY19jZGNsayhkZXZfcHJpdiwgbWF4X3BpeGNsayk7CisKKwlpZiAocmVxX2NkY2xrICE9IGN1cl9jZGNsaykKKwkJdmFsbGV5dmlld19zZXRfY2RjbGsoZGV2LCByZXFfY2RjbGspOworfQorCiBzdGF0aWMgdm9pZCB2YWxsZXl2aWV3X2NydGNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwpAQCAtNDU3MCw5ICs0ODAwLDggQEAKIAkJcmVmY2xrID0gMTAwMDAwOwogCX0gZWxzZSBpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykgJiYKIAkgICAgaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKSB7Ci0JCXJlZmNsayA9IGRldl9wcml2LT52YnQubHZkc19zc2NfZnJlcSAqIDEwMDA7Ci0JCURSTV9ERUJVR19LTVMoInVzaW5nIFNTQyByZWZlcmVuY2UgY2xvY2sgb2YgJWQgTUh6XG4iLAotCQkJICAgICAgcmVmY2xrIC8gMTAwMCk7CisJCXJlZmNsayA9IGRldl9wcml2LT52YnQubHZkc19zc2NfZnJlcTsKKwkJRFJNX0RFQlVHX0tNUygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBrSHpcbiIsIHJlZmNsayk7CiAJfSBlbHNlIGlmICghSVNfR0VOMihkZXYpKSB7CiAJCXJlZmNsayA9IDk2MDAwOwogCX0gZWxzZSB7CkBAIC00NjM0LDI0ICs0ODYzLDI0IEBACiAJICogUExMQiBvcGFtcCBhbHdheXMgY2FsaWJyYXRlcyB0byBtYXggdmFsdWUgb2YgMHgzZiwgZm9yY2UgZW5hYmxlIGl0CiAJICogYW5kIHNldCBpdCB0byBhIHJlYXNvbmFibGUgdmFsdWUgaW5zdGVhZC4KIAkgKi8KLQlyZWdfdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgRFBJT19JUkVGKDEpKTsKKwlyZWdfdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzkoMSkpOwogCXJlZ192YWwgJj0gMHhmZmZmZmYwMDsKIAlyZWdfdmFsIHw9IDB4MDAwMDAwMzA7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fSVJFRigxKSwgcmVnX3ZhbCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc5KDEpLCByZWdfdmFsKTsKIAotCXJlZ192YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBEUElPX0NBTElCUkFUSU9OKTsKKwlyZWdfdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1JFRl9EVzEzKTsKIAlyZWdfdmFsICY9IDB4OGNmZmZmZmY7CiAJcmVnX3ZhbCA9IDB4OGMwMDAwMDA7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fQ0FMSUJSQVRJT04sIHJlZ192YWwpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUkVGX0RXMTMsIHJlZ192YWwpOwogCi0JcmVnX3ZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIERQSU9fSVJFRigxKSk7CisJcmVnX3ZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc5KDEpKTsKIAlyZWdfdmFsICY9IDB4ZmZmZmZmMDA7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fSVJFRigxKSwgcmVnX3ZhbCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc5KDEpLCByZWdfdmFsKTsKIAotCXJlZ192YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBEUElPX0NBTElCUkFUSU9OKTsKKwlyZWdfdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1JFRl9EVzEzKTsKIAlyZWdfdmFsICY9IDB4MDBmZmZmZmY7CiAJcmVnX3ZhbCB8PSAweGIwMDAwMDAwOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX0NBTElCUkFUSU9OLCByZWdfdmFsKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1JFRl9EVzEzLCByZWdfdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfcGNoX3RyYW5zY29kZXJfc2V0X21fbihzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKQEAgLTQ3MjAsMTUgKzQ5NDksMTUgQEAKIAkJdmx2X3BsbGJfcmVjYWxfb3BhbXAoZGV2X3ByaXYsIHBpcGUpOwogCiAJLyogU2V0IHVwIFR4IHRhcmdldCBmb3IgcGVyaW9kaWMgUmNvbXAgdXBkYXRlICovCi0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fSVJFRl9CQ0FTVCwgMHgwMTAwMDAwZik7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc5X0JDQVNULCAweDAxMDAwMDBmKTsKIAogCS8qIERpc2FibGUgdGFyZ2V0IElSZWYgb24gUExMICovCi0JcmVnX3ZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIERQSU9fSVJFRl9DVEwocGlwZSkpOworCXJlZ192YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUExMX0RXOChwaXBlKSk7CiAJcmVnX3ZhbCAmPSAweDAwZmZmZmZmOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX0lSRUZfQ1RMKHBpcGUpLCByZWdfdmFsKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzgocGlwZSksIHJlZ192YWwpOwogCiAJLyogRGlzYWJsZSBmYXN0IGxvY2sgKi8KLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19GQVNUQ0xLX0RJU0FCTEUsIDB4NjEwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX0NNTl9EVzAsIDB4NjEwKTsKIAogCS8qIFNldCBpZHRhZmNyZWNhbCBiZWZvcmUgUExMIGlzIGVuYWJsZWQgKi8KIAltZGl2ID0gKChiZXN0bTEgPDwgRFBJT19NMURJVl9TSElGVCkgfCAoYmVzdG0yICYgRFBJT19NMkRJVl9NQVNLKSk7CkBAIC00NzQyLDUwICs0OTcxLDU0IEBACiAJICogTm90ZTogZG9uJ3QgdXNlIHRoZSBEQUMgcG9zdCBkaXZpZGVyIGFzIGl0IHNlZW1zIHVuc3RhYmxlLgogCSAqLwogCW1kaXYgfD0gKERQSU9fUE9TVF9ESVZfSERNSURQIDw8IERQSU9fUE9TVF9ESVZfU0hJRlQpOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX0RJVihwaXBlKSwgbWRpdik7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFczKHBpcGUpLCBtZGl2KTsKIAogCW1kaXYgfD0gRFBJT19FTkFCTEVfQ0FMSUJSQVRJT047Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fRElWKHBpcGUpLCBtZGl2KTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzMocGlwZSksIG1kaXYpOwogCiAJLyogU2V0IEhCUiBhbmQgUkJSIExQRiBjb2VmZmljaWVudHMgKi8KIAlpZiAoY3J0Yy0+Y29uZmlnLnBvcnRfY2xvY2sgPT0gMTYyMDAwIHx8CiAJICAgIGludGVsX3BpcGVfaGFzX3R5cGUoJmNydGMtPmJhc2UsIElOVEVMX09VVFBVVF9BTkFMT0cpIHx8CiAJICAgIGludGVsX3BpcGVfaGFzX3R5cGUoJmNydGMtPmJhc2UsIElOVEVMX09VVFBVVF9IRE1JKSkKLQkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fTFBGX0NPRUZGKHBpcGUpLAorCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzEwKHBpcGUpLAogCQkJCSAweDAwOWYwMDAzKTsKIAllbHNlCi0JCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX0xQRl9DT0VGRihwaXBlKSwKKwkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFcxMChwaXBlKSwKIAkJCQkgMHgwMGQwMDAwZik7CiAKIAlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZSgmY3J0Yy0+YmFzZSwgSU5URUxfT1VUUFVUX0VEUCkgfHwKIAkgICAgaW50ZWxfcGlwZV9oYXNfdHlwZSgmY3J0Yy0+YmFzZSwgSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUKSkgewogCQkvKiBVc2UgU1NDIHNvdXJjZSAqLwogCQlpZiAoIXBpcGUpCi0JCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19SRUZTRlIocGlwZSksCisJCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzUocGlwZSksCiAJCQkJCSAweDBkZjQwMDAwKTsKIAkJZWxzZQotCQkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUkVGU0ZSKHBpcGUpLAorCQkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc1KHBpcGUpLAogCQkJCQkgMHgwZGY3MDAwMCk7CiAJfSBlbHNlIHsgLyogSERNSSBvciBWR0EgKi8KIAkJLyogVXNlIGJlbmQgc291cmNlICovCiAJCWlmICghcGlwZSkKLQkJCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1JFRlNGUihwaXBlKSwKKwkJCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUExMX0RXNShwaXBlKSwKIAkJCQkJIDB4MGRmNzAwMDApOwogCQllbHNlCi0JCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19SRUZTRlIocGlwZSksCisJCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzUocGlwZSksCiAJCQkJCSAweDBkZjQwMDAwKTsKIAl9CiAKLQljb3JlY2xrID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgRFBJT19DT1JFX0NMSyhwaXBlKSk7CisJY29yZWNsayA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc3KHBpcGUpKTsKIAljb3JlY2xrID0gKGNvcmVjbGsgJiAweDAwMDBmZjAwKSB8IDB4MDFjMDAwMDA7CiAJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoJmNydGMtPmJhc2UsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkgfHwKIAkgICAgaW50ZWxfcGlwZV9oYXNfdHlwZSgmY3J0Yy0+YmFzZSwgSU5URUxfT1VUUFVUX0VEUCkpCiAJCWNvcmVjbGsgfD0gMHgwMTAwMDAwMDsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19DT1JFX0NMSyhwaXBlKSwgY29yZWNsayk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc3KHBpcGUpLCBjb3JlY2xrKTsKIAotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BMTF9DTUwocGlwZSksIDB4ODc4NzEwMDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUExMX0RXMTEocGlwZSksIDB4ODc4NzEwMDApOwogCi0JLyogRW5hYmxlIERQSU8gY2xvY2sgaW5wdXQgKi8KKwkvKgorCSAqIEVuYWJsZSBEUElPIGNsb2NrIGlucHV0LiBXZSBzaG91bGQgbmV2ZXIgZGlzYWJsZSB0aGUgcmVmZXJlbmNlCisJICogY2xvY2sgZm9yIHBpcGUgQiwgc2luY2UgVkdBIGhvdHBsdWcgLyBtYW51YWwgZGV0ZWN0aW9uIGRlcGVuZHMKKwkgKiBvbiBpdC4KKwkgKi8KIAlkcGxsID0gRFBMTF9FWFRfQlVGRkVSX0VOQUJMRV9WTFYgfCBEUExMX1JFRkFfQ0xLX0VOQUJMRV9WTFYgfAogCQlEUExMX1ZHQV9NT0RFX0RJUyB8IERQTExfSU5URUdSQVRFRF9DTE9DS19WTFY7CiAJLyogV2Ugc2hvdWxkIG5ldmVyIGRpc2FibGUgdGhpcywgc2V0IGl0IGhlcmUgZm9yIHN0YXRlIHRyYWNraW5nICovCkBAIC01MjMwLDYgKzU0NjMsOSBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgdG1wOwogCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDMgJiYgKElTX0k4MzAoZGV2KSB8fCAhSVNfTU9CSUxFKGRldikpKQorCQlyZXR1cm47CisKIAl0bXAgPSBJOTE1X1JFQUQoUEZJVF9DT05UUk9MKTsKIAlpZiAoISh0bXAgJiBQRklUX0VOQUJMRSkpCiAJCXJldHVybjsKQEAgLTUyNjEsNyArNTQ5Nyw3IEBACiAJaW50IHJlZmNsayA9IDEwMDAwMDsKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwotCW1kaXYgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBEUElPX0RJVihwaXBlKSk7CisJbWRpdiA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFczKHBpcGUpKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCiAJY2xvY2subTEgPSAobWRpdiA+PiBEUElPX00xRElWX1NISUZUKSAmIDc7CkBAIC01NzE4LDkgKzU5NTQsOSBAQAogCX0KIAogCWlmIChpc19sdmRzICYmIGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmIG51bV9jb25uZWN0b3JzIDwgMikgewotCQlEUk1fREVCVUdfS01TKCJ1c2luZyBTU0MgcmVmZXJlbmNlIGNsb2NrIG9mICVkIE1IelxuIiwKKwkJRFJNX0RFQlVHX0tNUygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBrSHpcbiIsCiAJCQkgICAgICBkZXZfcHJpdi0+dmJ0Lmx2ZHNfc3NjX2ZyZXEpOwotCQlyZXR1cm4gZGV2X3ByaXYtPnZidC5sdmRzX3NzY19mcmVxICogMTAwMDsKKwkJcmV0dXJuIGRldl9wcml2LT52YnQubHZkc19zc2NfZnJlcTsKIAl9CiAKIAlyZXR1cm4gMTIwMDAwOwpAQCAtNTk4Miw3ICs2MjE4LDcgQEAKIAlmYWN0b3IgPSAyMTsKIAlpZiAoaXNfbHZkcykgewogCQlpZiAoKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmCi0JCSAgICAgZGV2X3ByaXYtPnZidC5sdmRzX3NzY19mcmVxID09IDEwMCkgfHwKKwkJICAgICBkZXZfcHJpdi0+dmJ0Lmx2ZHNfc3NjX2ZyZXEgPT0gMTAwMDAwKSB8fAogCQkgICAgKEhBU19QQ0hfSUJYKGRldikgJiYgaW50ZWxfaXNfZHVhbF9saW5rX2x2ZHMoZGV2KSkpCiAJCQlmYWN0b3IgPSAyNTsKIAl9IGVsc2UgaWYgKGludGVsX2NydGMtPmNvbmZpZy5zZHZvX3R2X2Nsb2NrKQpAQCAtNjMyMyw3ICs2NTU5LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAl2YWwgPSBJOTE1X1JFQUQoREVJTVIpOwotCVdBUk4oKHZhbCAmIH5ERV9QQ0hfRVZFTlRfSVZCKSAhPSB2YWwsCisJV0FSTigodmFsIHwgREVfUENIX0VWRU5UX0lWQikgIT0gMHhmZmZmZmZmZiwKIAkgICAgICJVbmV4cGVjdGVkIERFSU1SIGJpdHMgZW5hYmxlZDogMHgleFxuIiwgdmFsKTsKIAl2YWwgPSBJOTE1X1JFQUQoU0RFSU1SKTsKIAlXQVJOKCh2YWwgfCBTREVfSE9UUExVR19NQVNLX0NQVCkgIT0gMHhmZmZmZmZmZiwKQEAgLTY0MDIsNyArNjYzOCw3IEBACiAKIAkvKiBNYWtlIHN1cmUgd2UncmUgbm90IG9uIFBDOCBzdGF0ZSBiZWZvcmUgZGlzYWJsaW5nIFBDOCwgb3RoZXJ3aXNlCiAJICogd2UnbGwgaGFuZyB0aGUgbWFjaGluZSEgKi8KLQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKwlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAogCWlmICh2YWwgJiBMQ1BMTF9QT1dFUl9ET1dOX0FMTE9XKSB7CiAJCXZhbCAmPSB+TENQTExfUE9XRVJfRE9XTl9BTExPVzsKQEAgLTY0MzYsNyArNjY3Miw3IEBACiAJCQlEUk1fRVJST1IoIlN3aXRjaGluZyBiYWNrIHRvIExDUExMIGZhaWxlZFxuIik7CiAJfQogCi0JZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChkZXZfcHJpdik7CisJZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiB9CiAKIHZvaWQgaHN3X2VuYWJsZV9wYzhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9fd29yaykKQEAgLTY0NDcsNiArNjY4Myw4IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJdWludDMyX3QgdmFsOwogCisJV0FSTl9PTighSEFTX1BDOChkZXYpKTsKKwogCWlmIChkZXZfcHJpdi0+cGM4LmVuYWJsZWQpCiAJCXJldHVybjsKIApAQCAtNjQ2Myw2ICs2NzAxLDggQEAKIAlscHRfZGlzYWJsZV9jbGtvdXRfZHAoZGV2KTsKIAloc3dfcGM4X2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOwogCWhzd19kaXNhYmxlX2xjcGxsKGRldl9wcml2LCB0cnVlLCB0cnVlKTsKKworCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIH0KIAogc3RhdGljIHZvaWQgX19oc3dfZW5hYmxlX3BhY2thZ2VfYzgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQpAQCAtNjQ5MiwxMiArNjczMiwxNiBAQAogCWlmIChkZXZfcHJpdi0+cGM4LmRpc2FibGVfY291bnQgIT0gMSkKIAkJcmV0dXJuOwogCisJV0FSTl9PTighSEFTX1BDOChkZXYpKTsKKwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGV2X3ByaXYtPnBjOC5lbmFibGVfd29yayk7CiAJaWYgKCFkZXZfcHJpdi0+cGM4LmVuYWJsZWQpCiAJCXJldHVybjsKIAogCURSTV9ERUJVR19LTVMoIkRpc2FibGluZyBwYWNrYWdlIEM4K1xuIik7CiAKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CisKIAloc3dfcmVzdG9yZV9sY3BsbChkZXZfcHJpdik7CiAJaHN3X3BjOF9yZXN0b3JlX2ludGVycnVwdHMoZGV2KTsKIAlscHRfaW5pdF9wY2hfcmVmY2xrKGRldik7CkBAIC02NzA0LDggKzY5NDgsOSBAQAogCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwogCWludCByZXQ7CiAKLQlpZiAoIWludGVsX2RkaV9wbGxfbW9kZV9zZXQoY3J0YykpCisJaWYgKCFpbnRlbF9kZGlfcGxsX3NlbGVjdChpbnRlbF9jcnRjKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaW50ZWxfZGRpX3BsbF9lbmFibGUoaW50ZWxfY3J0Yyk7CiAKIAlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19kcF9lbmNvZGVyKQogCQlpbnRlbF9kcF9zZXRfbV9uKGludGVsX2NydGMpOwpAQCAtNjc5Niw4ICs3MDQxLDkgQEAKIAlpZiAoaW50ZWxfZGlzcGxheV9wb3dlcl9lbmFibGVkKGRldiwgcGZpdF9kb21haW4pKQogCQlpcm9ubGFrZV9nZXRfcGZpdF9jb25maWcoY3J0YywgcGlwZV9jb25maWcpOwogCi0JcGlwZV9jb25maWctPmlwc19lbmFibGVkID0gaHN3X2NydGNfc3VwcG9ydHNfaXBzKGNydGMpICYmCi0JCQkJICAgKEk5MTVfUkVBRChJUFNfQ1RMKSAmIElQU19FTkFCTEUpOworCWlmIChJU19IQVNXRUxMKGRldikpCisJCXBpcGVfY29uZmlnLT5pcHNfZW5hYmxlZCA9IGhzd19jcnRjX3N1cHBvcnRzX2lwcyhjcnRjKSAmJgorCQkJKEk5MTVfUkVBRChJUFNfQ1RMKSAmIElQU19FTkFCTEUpOwogCiAJcGlwZV9jb25maWctPnBpeGVsX211bHRpcGxpZXIgPSAxOwogCkBAIC03Njg5LDcgKzc5MzUsNyBAQAogCXUzMiBkcGxsID0gcGlwZV9jb25maWctPmRwbGxfaHdfc3RhdGUuZHBsbDsKIAogCWlmICgoZHBsbCAmIFBMTF9SRUZfSU5QVVRfTUFTSykgPT0gUExMQl9SRUZfSU5QVVRfU1BSRUFEU1BFQ1RSVU1JTikKLQkJcmV0dXJuIGRldl9wcml2LT52YnQubHZkc19zc2NfZnJlcSAqIDEwMDA7CisJCXJldHVybiBkZXZfcHJpdi0+dmJ0Lmx2ZHNfc3NjX2ZyZXE7CiAJZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQlyZXR1cm4gMTIwMDAwOwogCWVsc2UgaWYgKCFJU19HRU4yKGRldikpCkBAIC03NzUyLDEyICs3OTk4LDE3IEBACiAJCWVsc2UKIAkJCWk5eHhfY2xvY2socmVmY2xrLCAmY2xvY2spOwogCX0gZWxzZSB7Ci0JCWJvb2wgaXNfbHZkcyA9IChwaXBlID09IDEpICYmIChJOTE1X1JFQUQoTFZEUykgJiBMVkRTX1BPUlRfRU4pOworCQl1MzIgbHZkcyA9IElTX0k4MzAoZGV2KSA/IDAgOiBJOTE1X1JFQUQoTFZEUyk7CisJCWJvb2wgaXNfbHZkcyA9IChwaXBlID09IDEpICYmIChsdmRzICYgTFZEU19QT1JUX0VOKTsKIAogCQlpZiAoaXNfbHZkcykgewogCQkJY2xvY2sucDEgPSBmZnMoKGRwbGwgJiBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSTgzMF9MVkRTKSA+PgogCQkJCSAgICAgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUKTsKLQkJCWNsb2NrLnAyID0gMTQ7CisKKwkJCWlmIChsdmRzICYgTFZEU19DTEtCX1BPV0VSX1VQKQorCQkJCWNsb2NrLnAyID0gNzsKKwkJCWVsc2UKKwkJCQljbG9jay5wMiA9IDE0OwogCQl9IGVsc2UgewogCQkJaWYgKGRwbGwgJiBQTExfUDFfRElWSURFX0JZX1RXTykKIAkJCQljbG9jay5wMSA9IDI7CkBAIC04NDkzLDI4ICs4NzQ0LDYgQEAKIAkubG9hZF9sdXQgPSBpbnRlbF9jcnRjX2xvYWRfbHV0LAogfTsKIAotc3RhdGljIGJvb2wgaW50ZWxfZW5jb2Rlcl9jcnRjX29rKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCXN0cnVjdCBkcm1fY3J0YyAqdG1wOwotCWludCBjcnRjX21hc2sgPSAxOwotCi0JV0FSTighY3J0YywgImNoZWNraW5nIG51bGwgY3J0Yz9cbiIpOwotCi0JZGV2ID0gY3J0Yy0+ZGV2OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewotCQlpZiAodG1wID09IGNydGMpCi0JCQlicmVhazsKLQkJY3J0Y19tYXNrIDw8PSAxOwotCX0KLQotCWlmIChlbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyAmIGNydGNfbWFzaykKLQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCiAvKioKICAqIGludGVsX21vZGVzZXRfdXBkYXRlX3N0YWdlZF9vdXRwdXRfc3RhdGUKICAqCkBAIC05MTIyLDcgKzkzNTEsOSBAQAogCQlQSVBFX0NPTkZfQ0hFQ0tfSShwY2hfcGZpdC5zaXplKTsKIAl9CiAKLQlQSVBFX0NPTkZfQ0hFQ0tfSShpcHNfZW5hYmxlZCk7CisJLyogQkRXKyBkb24ndCBleHBvc2UgYSBzeW5jaHJvbm91cyB3YXkgdG8gcmVhZCB0aGUgc3RhdGUgKi8KKwlpZiAoSVNfSEFTV0VMTChkZXYpKQorCQlQSVBFX0NPTkZfQ0hFQ0tfSShpcHNfZW5hYmxlZCk7CiAKIAlQSVBFX0NPTkZfQ0hFQ0tfSShkb3VibGVfd2lkZSk7CiAKQEAgLTkzNjgsMjEgKzk1OTksMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzYXZlZF9tb2RlLCAqc2F2ZWRfaHdtb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzYXZlZF9tb2RlOwogCXN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyAqcGlwZV9jb25maWcgPSBOVUxMOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOwogCXVuc2lnbmVkIGRpc2FibGVfcGlwZXMsIHByZXBhcmVfcGlwZXMsIG1vZGVzZXRfcGlwZXM7CiAJaW50IHJldCA9IDA7CiAKLQlzYXZlZF9tb2RlID0ga2NhbGxvYygyLCBzaXplb2YoKnNhdmVkX21vZGUpLCBHRlBfS0VSTkVMKTsKKwlzYXZlZF9tb2RlID0ga21hbGxvYyhzaXplb2YoKnNhdmVkX21vZGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNhdmVkX21vZGUpCiAJCXJldHVybiAtRU5PTUVNOwotCXNhdmVkX2h3bW9kZSA9IHNhdmVkX21vZGUgKyAxOwogCiAJaW50ZWxfbW9kZXNldF9hZmZlY3RlZF9waXBlcyhjcnRjLCAmbW9kZXNldF9waXBlcywKIAkJCQkgICAgICZwcmVwYXJlX3BpcGVzLCAmZGlzYWJsZV9waXBlcyk7CiAKLQkqc2F2ZWRfaHdtb2RlID0gY3J0Yy0+aHdtb2RlOwogCSpzYXZlZF9tb2RlID0gY3J0Yy0+bW9kZTsKIAogCS8qIEhhY2s6IEJlY2F1c2Ugd2UgZG9uJ3QgKHlldCkgc3VwcG9ydCBnbG9iYWwgbW9kZXNldCBvbiBtdWx0aXBsZQpAQCAtOTQwMiw2ICs5NjMxLDIxIEBACiAJCQkJICAgICAgICJbbW9kZXNldF0iKTsKIAl9CiAKKwkvKgorCSAqIFNlZSBpZiB0aGUgY29uZmlnIHJlcXVpcmVzIGFueSBhZGRpdGlvbmFsIHByZXBhcmF0aW9uLCBlLmcuCisJICogdG8gYWRqdXN0IGdsb2JhbCBzdGF0ZSB3aXRoIHBpcGVzIG9mZi4gIFdlIG5lZWQgdG8gZG8gdGhpcworCSAqIGhlcmUgc28gd2UgY2FuIGdldCB0aGUgbW9kZXNldF9waXBlIHVwZGF0ZWQgY29uZmlnIGZvciB0aGUgbmV3CisJICogbW9kZSBzZXQgb24gdGhpcyBjcnRjLiAgRm9yIG90aGVyIGNydGNzIHdlIG5lZWQgdG8gdXNlIHRoZQorCSAqIGFkanVzdGVkX21vZGUgYml0cyBpbiB0aGUgY3J0YyBkaXJlY3RseS4KKwkgKi8KKwlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJCXZhbGxleXZpZXdfbW9kZXNldF9nbG9iYWxfcGlwZXMoZGV2LCAmcHJlcGFyZV9waXBlcywKKwkJCQkJCW1vZGVzZXRfcGlwZXMsIHBpcGVfY29uZmlnKTsKKworCQkvKiBtYXkgaGF2ZSBhZGRlZCBtb3JlIHRvIHByZXBhcmVfcGlwZXMgdGhhbiB3ZSBzaG91bGQgKi8KKwkJcHJlcGFyZV9waXBlcyAmPSB+ZGlzYWJsZV9waXBlczsKKwl9CisKIAlmb3JfZWFjaF9pbnRlbF9jcnRjX21hc2tlZChkZXYsIGRpc2FibGVfcGlwZXMsIGludGVsX2NydGMpCiAJCWludGVsX2NydGNfZGlzYWJsZSgmaW50ZWxfY3J0Yy0+YmFzZSk7CiAKQEAgLTk0MTgsNiArOTY2MiwxNCBAQAogCQkvKiBtb2RlX3NldC9lbmFibGUvZGlzYWJsZSBmdW5jdGlvbnMgcmVseSBvbiBhIGNvcnJlY3QgcGlwZQogCQkgKiBjb25maWcuICovCiAJCXRvX2ludGVsX2NydGMoY3J0YyktPmNvbmZpZyA9ICpwaXBlX2NvbmZpZzsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgYW5kIHN0b3JlIHZhcmlvdXMgY29uc3RhbnRzIHdoaWNoCisJCSAqIGFyZSBsYXRlciBuZWVkZWQgYnkgdmJsYW5rIGFuZCBzd2FwLWNvbXBsZXRpb24KKwkJICogdGltZXN0YW1waW5nLiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gdHJ1ZSBod21vZGUuCisJCSAqLworCQlkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKGNydGMsCisJCQkJCQkmcGlwZV9jb25maWctPmFkanVzdGVkX21vZGUpOwogCX0KIAogCS8qIE9ubHkgYWZ0ZXIgZGlzYWJsaW5nIGFsbCBvdXRwdXQgcGlwZWxpbmVzIHRoYXQgd2lsbCBiZSBjaGFuZ2VkIGNhbiB3ZQpAQCAtOTQ0MSwyMyArOTY5MywxMCBAQAogCWZvcl9lYWNoX2ludGVsX2NydGNfbWFza2VkKGRldiwgcHJlcGFyZV9waXBlcywgaW50ZWxfY3J0YykKIAkJZGV2X3ByaXYtPmRpc3BsYXkuY3J0Y19lbmFibGUoJmludGVsX2NydGMtPmJhc2UpOwogCi0JaWYgKG1vZGVzZXRfcGlwZXMpIHsKLQkJLyogU3RvcmUgcmVhbCBwb3N0LWFkanVzdG1lbnQgaGFyZHdhcmUgbW9kZS4gKi8KLQkJY3J0Yy0+aHdtb2RlID0gcGlwZV9jb25maWctPmFkanVzdGVkX21vZGU7Ci0KLQkJLyogQ2FsY3VsYXRlIGFuZCBzdG9yZSB2YXJpb3VzIGNvbnN0YW50cyB3aGljaAotCQkgKiBhcmUgbGF0ZXIgbmVlZGVkIGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uCi0JCSAqIHRpbWVzdGFtcGluZy4gVGhleSBhcmUgZGVyaXZlZCBmcm9tIHRydWUgaHdtb2RlLgotCQkgKi8KLQkJZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhjcnRjKTsKLQl9Ci0KIAkvKiBGSVhNRTogYWRkIHN1YnBpeGVsIG9yZGVyICovCiBkb25lOgotCWlmIChyZXQgJiYgY3J0Yy0+ZW5hYmxlZCkgewotCQljcnRjLT5od21vZGUgPSAqc2F2ZWRfaHdtb2RlOworCWlmIChyZXQgJiYgY3J0Yy0+ZW5hYmxlZCkKIAkJY3J0Yy0+bW9kZSA9ICpzYXZlZF9tb2RlOwotCX0KIAogb3V0OgogCWtmcmVlKHBpcGVfY29uZmlnKTsKQEAgLTk2NzksOCArOTkxOCw4IEBACiAJCX0KIAogCQkvKiBNYWtlIHN1cmUgdGhlIG5ldyBDUlRDIHdpbGwgd29yayB3aXRoIHRoZSBlbmNvZGVyICovCi0JCWlmICghaW50ZWxfZW5jb2Rlcl9jcnRjX29rKCZjb25uZWN0b3ItPm5ld19lbmNvZGVyLT5iYXNlLAotCQkJCQkgICBuZXdfY3J0YykpIHsKKwkJaWYgKCFkcm1fZW5jb2Rlcl9jcnRjX29rKCZjb25uZWN0b3ItPm5ld19lbmNvZGVyLT5iYXNlLAorCQkJCQkgbmV3X2NydGMpKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQljb25uZWN0b3ItPmVuY29kZXItPm5ld19jcnRjID0gdG9faW50ZWxfY3J0YyhuZXdfY3J0Yyk7CkBAIC05Njk0LDE3ICs5OTMzLDIxIEBACiAJLyogQ2hlY2sgZm9yIGFueSBlbmNvZGVycyB0aGF0IG5lZWRzIHRvIGJlIGRpc2FibGVkLiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LAogCQkJICAgIGJhc2UuaGVhZCkgeworCQlpbnQgbnVtX2Nvbm5lY3RvcnMgPSAwOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwKIAkJCQkgICAgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsCiAJCQkJICAgIGJhc2UuaGVhZCkgewogCQkJaWYgKGNvbm5lY3Rvci0+bmV3X2VuY29kZXIgPT0gZW5jb2RlcikgewogCQkJCVdBUk5fT04oIWNvbm5lY3Rvci0+bmV3X2VuY29kZXItPm5ld19jcnRjKTsKLQotCQkJCWdvdG8gbmV4dF9lbmNvZGVyOworCQkJCW51bV9jb25uZWN0b3JzKys7CiAJCQl9CiAJCX0KLQkJZW5jb2Rlci0+bmV3X2NydGMgPSBOVUxMOwotbmV4dF9lbmNvZGVyOgorCisJCWlmIChudW1fY29ubmVjdG9ycyA9PSAwKQorCQkJZW5jb2Rlci0+bmV3X2NydGMgPSBOVUxMOworCQllbHNlIGlmIChudW1fY29ubmVjdG9ycyA+IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQkvKiBPbmx5IG5vdyBjaGVjayBmb3IgY3J0YyBjaGFuZ2VzIHNvIHdlIGRvbid0IG1pc3MgZW5jb2RlcnMKIAkJICogdGhhdCB3aWxsIGJlIGRpc2FibGVkLiAqLwogCQlpZiAoJmVuY29kZXItPm5ld19jcnRjLT5iYXNlICE9IGVuY29kZXItPmJhc2UuY3J0YykgewpAQCAtOTc3NSw2ICsxMDAxOCwxNiBAQAogCiAJCXJldCA9IGludGVsX3BpcGVfc2V0X2Jhc2Uoc2V0LT5jcnRjLAogCQkJCQkgIHNldC0+eCwgc2V0LT55LCBzZXQtPmZiKTsKKwkJLyoKKwkJICogSW4gdGhlIGZhc3Rib290IGNhc2UgdGhpcyBtYXkgYmUgb3VyIG9ubHkgY2hlY2sgb2YgdGhlCisJCSAqIHN0YXRlIGFmdGVyIGJvb3QuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gb25seSBkbyBpdCBvbgorCQkgKiB0aGUgZmlyc3QgdXBkYXRlLCBidXQgd2UgZG9uJ3QgaGF2ZSBhIG5pY2Ugd2F5IG9mIGRvaW5nIHRoYXQKKwkJICogKGFuZCByZWFsbHksIHNldF9jb25maWcgaXNuJ3QgdXNlZCBtdWNoIGZvciBoaWdoIGZyZXEgcGFnZQorCQkgKiBmbGlwcGluZywgc28gaW5jcmVhc2luZyBpdHMgY29zdCBoZXJlIHNob3VsZG4ndCBiZSBhIGJpZworCQkgKiBkZWFsKS4KKwkJICovCisJCWlmIChpOTE1X2Zhc3Rib290ICYmIHJldCA9PSAwKQorCQkJaW50ZWxfbW9kZXNldF9jaGVja19zdGF0ZShzZXQtPmNydGMtPmRldik7CiAJfQogCiAJaWYgKHJldCkgewpAQCAtOTgzNSw3ICsxMDA4OCw3IEBACiAJCQkJc3RydWN0IGludGVsX3NoYXJlZF9kcGxsICpwbGwpCiB7CiAJLyogUENIIHJlZmNsb2NrIG11c3QgYmUgZW5hYmxlZCBmaXJzdCAqLwotCWFzc2VydF9wY2hfcmVmY2xrX2VuYWJsZWQoZGV2X3ByaXYpOworCWlieF9hc3NlcnRfcGNoX3JlZmNsa19lbmFibGVkKGRldl9wcml2KTsKIAogCUk5MTVfV1JJVEUoUENIX0RQTEwocGxsLT5pZCksIHBsbC0+aHdfc3RhdGUuZHBsbCk7CiAKQEAgLTk5MDMsOCArMTAxNTYsNiBAQAogCQlkZXZfcHJpdi0+bnVtX3NoYXJlZF9kcGxsID0gMDsKIAogCUJVR19PTihkZXZfcHJpdi0+bnVtX3NoYXJlZF9kcGxsID4gSTkxNV9OVU1fUExMUyk7Ci0JRFJNX0RFQlVHX0tNUygiJWkgc2hhcmVkIFBMTHMgaW5pdGlhbGl6ZWRcbiIsCi0JCSAgICAgIGRldl9wcml2LT5udW1fc2hhcmVkX2RwbGwpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCkBAIC05OTI2LDEwICsxMDE3NywxMyBAQAogCQlpbnRlbF9jcnRjLT5sdXRfYltpXSA9IGk7CiAJfQogCi0JLyogU3dhcCBwaXBlcyAmIHBsYW5lcyBmb3IgRkJDIG9uIHByZS05NjUgKi8KKwkvKgorCSAqIE9uIGdlbjIvMyBvbmx5IHBsYW5lIEEgY2FuIGRvIGZiYywgYnV0IHRoZSBwYW5lbCBmaXR0ZXIgYW5kIGx2ZHMgcG9ydAorCSAqIGlzIGhvb2tlZCB0byBwbGFuZSBCLiBIZW5jZSB3ZSB3YW50IHBsYW5lIEEgZmVlZGluZyBwaXBlIEIuCisJICovCiAJaW50ZWxfY3J0Yy0+cGlwZSA9IHBpcGU7CiAJaW50ZWxfY3J0Yy0+cGxhbmUgPSBwaXBlOwotCWlmIChJU19NT0JJTEUoZGV2KSAmJiBJU19HRU4zKGRldikpIHsKKwlpZiAoSEFTX0ZCQyhkZXYpICYmIElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkgewogCQlEUk1fREVCVUdfS01TKCJzd2FwcGluZyBwaXBlcyAmIHBsYW5lcyBmb3IgRkJDXG4iKTsKIAkJaW50ZWxfY3J0Yy0+cGxhbmUgPSAhcGlwZTsKIAl9CkBAIC0xMDAxOCw2ICsxMDI3MiwyOCBAQAogCXJldHVybiB0cnVlOwogfQogCitjb25zdCBjaGFyICppbnRlbF9vdXRwdXRfbmFtZShpbnQgb3V0cHV0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tdID0geworCQlbSU5URUxfT1VUUFVUX1VOVVNFRF0gPSAiVW51c2VkIiwKKwkJW0lOVEVMX09VVFBVVF9BTkFMT0ddID0gIkFuYWxvZyIsCisJCVtJTlRFTF9PVVRQVVRfRFZPXSA9ICJEVk8iLAorCQlbSU5URUxfT1VUUFVUX1NEVk9dID0gIlNEVk8iLAorCQlbSU5URUxfT1VUUFVUX0xWRFNdID0gIkxWRFMiLAorCQlbSU5URUxfT1VUUFVUX1RWT1VUXSA9ICJUViIsCisJCVtJTlRFTF9PVVRQVVRfSERNSV0gPSAiSERNSSIsCisJCVtJTlRFTF9PVVRQVVRfRElTUExBWVBPUlRdID0gIkRpc3BsYXlQb3J0IiwKKwkJW0lOVEVMX09VVFBVVF9FRFBdID0gImVEUCIsCisJCVtJTlRFTF9PVVRQVVRfRFNJXSA9ICJEU0kiLAorCQlbSU5URUxfT1VUUFVUX1VOS05PV05dID0gIlVua25vd24iLAorCX07CisKKwlpZiAob3V0cHV0IDwgMCB8fCBvdXRwdXQgPj0gQVJSQVlfU0laRShuYW1lcykgfHwgIW5hbWVzW291dHB1dF0pCisJCXJldHVybiAiSW52YWxpZCI7CisKKwlyZXR1cm4gbmFtZXNbb3V0cHV0XTsKK30KKwogc3RhdGljIHZvaWQgaW50ZWxfc2V0dXBfb3V0cHV0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMDQxMiw4ICsxMDY4OCwxMSBAQAogCQl9CiAJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgewogCQlkZXZfcHJpdi0+ZGlzcGxheS53cml0ZV9lbGQgPSBnNHhfd3JpdGVfZWxkOwotCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQorCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfZ2xvYmFsX3Jlc291cmNlcyA9CisJCQl2YWxsZXl2aWV3X21vZGVzZXRfZ2xvYmFsX3Jlc291cmNlczsKIAkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkID0gaXJvbmxha2Vfd3JpdGVfZWxkOworCX0KIAogCS8qIERlZmF1bHQganVzdCByZXR1cm5zIC1FTk9ERVYgdG8gaW5kaWNhdGUgdW5zdXBwb3J0ZWQgKi8KIAlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZGVmYXVsdF9xdWV1ZV9mbGlwOwpAQCAtMTA0NDAsNiArMTA3MTksOCBAQAogCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuN19xdWV1ZV9mbGlwOwogCQlicmVhazsKIAl9CisKKwlpbnRlbF9wYW5lbF9pbml0X2JhY2tsaWdodF9mdW5jcyhkZXYpOwogfQogCiAvKgpAQCAtMTA0NzYsMTcgKzEwNzU3LDYgQEAKIAlEUk1fSU5GTygiYXBwbHlpbmcgaW52ZXJ0ZWQgcGFuZWwgYnJpZ2h0bmVzcyBxdWlya1xuIik7CiB9CiAKLS8qCi0gKiBTb21lIG1hY2hpbmVzIChEZWxsIFhQUzEzKSBzdWZmZXIgYnJva2VuIGJhY2tsaWdodCBjb250cm9scyBpZgotICogQkxNX1BDSF9QV01fRU5BQkxFIGlzIHNldC4KLSAqLwotc3RhdGljIHZvaWQgcXVpcmtfbm9fcGNtX3B3bV9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRldl9wcml2LT5xdWlya3MgfD0gUVVJUktfTk9fUENIX1BXTV9FTkFCTEU7Ci0JRFJNX0lORk8oImFwcGx5aW5nIG5vLVBDSF9QV01fRU5BQkxFIHF1aXJrXG4iKTsKLX0KLQogc3RydWN0IGludGVsX3F1aXJrIHsKIAlpbnQgZGV2aWNlOwogCWludCBzdWJzeXN0ZW1fdmVuZG9yOwpAQCAtMTA1NTUsMTEgKzEwODI1LDYgQEAKIAogCS8qIEFjZXIgQXNwaXJlIDQ3MzZaICovCiAJeyAweDJhNDIsIDB4MTAyNSwgMHgwMjYwLCBxdWlya19pbnZlcnRfYnJpZ2h0bmVzcyB9LAotCi0JLyogRGVsbCBYUFMxMyBIRCBTYW5keSBCcmlkZ2UgKi8KLQl7IDB4MDExNiwgMHgxMDI4LCAweDA1MmUsIHF1aXJrX25vX3BjbV9wd21fZW5hYmxlIH0sCi0JLyogRGVsbCBYUFMxMyBIRCBhbmQgWFBTMTMgRkhEIEl2eSBCcmlkZ2UgKi8KLQl7IDB4MDE2NiwgMHgxMDI4LCAweDA1OGIsIHF1aXJrX25vX3BjbV9wd21fZW5hYmxlIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBpbnRlbF9pbml0X3F1aXJrcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTA2MDMsMTggKzEwODY4LDExIEBACiAKIHZvaWQgaW50ZWxfbW9kZXNldF9pbml0X2h3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQogCWludGVsX3ByZXBhcmVfZGRpKGRldik7CiAKIAlpbnRlbF9pbml0X2Nsb2NrX2dhdGluZyhkZXYpOwogCi0JLyogRW5hYmxlIHRoZSBDUkkgY2xvY2sgc291cmNlIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGRpc3BsYXkgKi8KLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQotCQlJOTE1X1dSSVRFKERQTEwoUElQRV9CKSwgSTkxNV9SRUFEKERQTEwoUElQRV9CKSkgfAotCQkJICAgRFBMTF9JTlRFR1JBVEVEX0NSSV9DTEtfVkxWKTsKLQotCWludGVsX2luaXRfZHBpbyhkZXYpOworCWludGVsX3Jlc2V0X2RwaW8oZGV2KTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpbnRlbF9lbmFibGVfZ3RfcG93ZXJzYXZlKGRldik7CkBAIC0xMDY3Niw2ICsxMDkzNCw5IEBACiAJCX0KIAl9CiAKKwlpbnRlbF9pbml0X2RwaW8oZGV2KTsKKwlpbnRlbF9yZXNldF9kcGlvKGRldik7CisKIAlpbnRlbF9jcHVfcGxsX2luaXQoZGV2KTsKIAlpbnRlbF9zaGFyZWRfZHBsbF9pbml0KGRldik7CiAKQEAgLTEwODc5LDcgKzExMTQwLDcgQEAKIAkgKiBsZXZlbCwganVzdCBjaGVjayBpZiB0aGUgcG93ZXIgd2VsbCBpcyBlbmFibGVkIGluc3RlYWQgb2YgdHJ5aW5nIHRvCiAJICogZm9sbG93IHRoZSAiZG9uJ3QgdG91Y2ggdGhlIHBvd2VyIHdlbGwgaWYgd2UgZG9uJ3QgbmVlZCBpdCIgcG9saWN5CiAJICogdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciB1c2VzLiAqLwotCWlmIChIQVNfUE9XRVJfV0VMTChkZXYpICYmCisJaWYgKChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpICYmCiAJICAgIChJOTE1X1JFQUQoSFNXX1BXUl9XRUxMX0RSSVZFUikgJiBIU1dfUFdSX1dFTExfU1RBVEVfRU5BQkxFRCkgPT0gMCkKIAkJcmV0dXJuOwogCkBAIC0xMTAyMyw3ICsxMTI4NCw3IEBACiAJCXBsbC0+b24gPSBmYWxzZTsKIAl9CiAKLQlpZiAoSVNfSEFTV0VMTChkZXYpKQorCWlmIChIQVNfUENIX1NQTElUKGRldikpCiAJCWlsa193bV9nZXRfaHdfc3RhdGUoZGV2KTsKIAogCWlmIChmb3JjZV9yZXN0b3JlKSB7CkBAIC0xMTEwMSwxMiArMTEzNjIsMTEgQEAKIAkvKiBmbHVzaCBhbnkgZGVsYXllZCB0YXNrcyBvciBwZW5kaW5nIHdvcmsgKi8KIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCi0JLyogZGVzdHJveSBiYWNrbGlnaHQsIGlmIGFueSwgYmVmb3JlIHRoZSBjb25uZWN0b3JzICovCi0JaW50ZWxfcGFuZWxfZGVzdHJveV9iYWNrbGlnaHQoZGV2KTsKLQotCS8qIGRlc3Ryb3kgdGhlIHN5c2ZzIGZpbGVzIGJlZm9yZSBlbmNvZGVycy9jb25uZWN0b3JzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQorCS8qIGRlc3Ryb3kgdGhlIGJhY2tsaWdodCBhbmQgc3lzZnMgZmlsZXMgYmVmb3JlIGVuY29kZXJzL2Nvbm5lY3RvcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaW50ZWxfcGFuZWxfZGVzdHJveV9iYWNrbGlnaHQoY29ubmVjdG9yKTsKIAkJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKKwl9CiAKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOwogCkBAIC0xMTE2MSw2ICsxMTQyMSw3IEBACiAJfSBjdXJzb3JbSTkxNV9NQVhfUElQRVNdOwogCiAJc3RydWN0IGludGVsX3BpcGVfZXJyb3Jfc3RhdGUgeworCQlib29sIHBvd2VyX2RvbWFpbl9vbjsKIAkJdTMyIHNvdXJjZTsKIAl9IHBpcGVbSTkxNV9NQVhfUElQRVNdOwogCkBAIC0xMTE3NSw2ICsxMTQzNiw3IEBACiAJfSBwbGFuZVtJOTE1X01BWF9QSVBFU107CiAKIAlzdHJ1Y3QgaW50ZWxfdHJhbnNjb2Rlcl9lcnJvcl9zdGF0ZSB7CisJCWJvb2wgcG93ZXJfZG9tYWluX29uOwogCQllbnVtIHRyYW5zY29kZXIgY3B1X3RyYW5zY29kZXI7CiAKIAkJdTMyIGNvbmY7CkBAIC0xMTIwOCwxMSArMTE0NzAsMTMgQEAKIAlpZiAoZXJyb3IgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoSEFTX1BPV0VSX1dFTEwoZGV2KSkKKwlpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQogCQllcnJvci0+cG93ZXJfd2VsbF9kcml2ZXIgPSBJOTE1X1JFQUQoSFNXX1BXUl9XRUxMX0RSSVZFUik7CiAKIAlmb3JfZWFjaF9waXBlKGkpIHsKLQkJaWYgKCFpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWQoZGV2LCBQT1dFUl9ET01BSU5fUElQRShpKSkpCisJCWVycm9yLT5waXBlW2ldLnBvd2VyX2RvbWFpbl9vbiA9CisJCQlpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWRfc3coZGV2LCBQT1dFUl9ET01BSU5fUElQRShpKSk7CisJCWlmICghZXJyb3ItPnBpcGVbaV0ucG93ZXJfZG9tYWluX29uKQogCQkJY29udGludWU7CiAKIAkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDYgfHwgSVNfVkFMTEVZVklFVyhkZXYpKSB7CkBAIC0xMTI0OCw4ICsxMTUxMiwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBlcnJvci0+bnVtX3RyYW5zY29kZXJzOyBpKyspIHsKIAkJZW51bSB0cmFuc2NvZGVyIGNwdV90cmFuc2NvZGVyID0gdHJhbnNjb2RlcnNbaV07CiAKLQkJaWYgKCFpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWQoZGV2LAotCQkJCVBPV0VSX0RPTUFJTl9UUkFOU0NPREVSKGNwdV90cmFuc2NvZGVyKSkpCisJCWVycm9yLT50cmFuc2NvZGVyW2ldLnBvd2VyX2RvbWFpbl9vbiA9CisJCQlpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWRfc3coZGV2LAorCQkJCVBPV0VSX0RPTUFJTl9UUkFOU0NPREVSKGNwdV90cmFuc2NvZGVyKSk7CisJCWlmICghZXJyb3ItPnRyYW5zY29kZXJbaV0ucG93ZXJfZG9tYWluX29uKQogCQkJY29udGludWU7CiAKIAkJZXJyb3ItPnRyYW5zY29kZXJbaV0uY3B1X3RyYW5zY29kZXIgPSBjcHVfdHJhbnNjb2RlcjsKQEAgLTExMjc5LDExICsxMTU0NSwxMyBAQAogCQlyZXR1cm47CiAKIAllcnJfcHJpbnRmKG0sICJOdW0gUGlwZXM6ICVkXG4iLCBJTlRFTF9JTkZPKGRldiktPm51bV9waXBlcyk7Ci0JaWYgKEhBU19QT1dFUl9XRUxMKGRldikpCisJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkKIAkJZXJyX3ByaW50ZihtLCAiUFdSX1dFTExfQ1RMMjogJTA4eFxuIiwKIAkJCSAgIGVycm9yLT5wb3dlcl93ZWxsX2RyaXZlcik7CiAJZm9yX2VhY2hfcGlwZShpKSB7CiAJCWVycl9wcmludGYobSwgIlBpcGUgWyVkXTpcbiIsIGkpOworCQllcnJfcHJpbnRmKG0sICIgIFBvd2VyOiAlc1xuIiwKKwkJCSAgIGVycm9yLT5waXBlW2ldLnBvd2VyX2RvbWFpbl9vbiA/ICJvbiIgOiAib2ZmIik7CiAJCWVycl9wcmludGYobSwgIiAgU1JDOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS5zb3VyY2UpOwogCiAJCWVycl9wcmludGYobSwgIlBsYW5lIFslZF06XG4iLCBpKTsKQEAgLTExMzA5LDYgKzExNTc3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgZXJyb3ItPm51bV90cmFuc2NvZGVyczsgaSsrKSB7CiAJCWVycl9wcmludGYobSwgIkNQVSB0cmFuc2NvZGVyOiAlY1xuIiwKIAkJCSAgIHRyYW5zY29kZXJfbmFtZShlcnJvci0+dHJhbnNjb2RlcltpXS5jcHVfdHJhbnNjb2RlcikpOworCQllcnJfcHJpbnRmKG0sICIgIFBvd2VyOiAlc1xuIiwKKwkJCSAgIGVycm9yLT50cmFuc2NvZGVyW2ldLnBvd2VyX2RvbWFpbl9vbiA/ICJvbiIgOiAib2ZmIik7CiAJCWVycl9wcmludGYobSwgIiAgQ09ORjogJTA4eFxuIiwgZXJyb3ItPnRyYW5zY29kZXJbaV0uY29uZik7CiAJCWVycl9wcmludGYobSwgIiAgSFRPVEFMOiAlMDh4XG4iLCBlcnJvci0+dHJhbnNjb2RlcltpXS5odG90YWwpOwogCQllcnJfcHJpbnRmKG0sICIgIEhCTEFOSzogJTA4eFxuIiwgZXJyb3ItPnRyYW5zY29kZXJbaV0uaGJsYW5rKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDMwYzYyN2MuLjVlZGU0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJcmV0dXJuIChtYXhfbGlua19jbG9jayAqIG1heF9sYW5lcyAqIDgpIC8gMTA7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cwogaW50ZWxfZHBfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlpbnQgaSwgcmV0LCByZWN2X2J5dGVzOwogCXVpbnQzMl90IHN0YXR1czsKIAlpbnQgdHJ5LCBwcmVjaGFyZ2UsIGNsb2NrID0gMDsKLQlib29sIGhhc19hdXhfaXJxID0gSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSAmJiAhSVNfVkFMTEVZVklFVyhkZXYpOworCWJvb2wgaGFzX2F1eF9pcnEgPSB0cnVlOwogCXVpbnQzMl90IHRpbWVvdXQ7CiAKIAkvKiBkcCBhdXggaXMgZXh0cmVtZWx5IHNlbnNpdGl2ZSB0byBpcnEgbGF0ZW5jeSwgaGVuY2UgcmVxdWVzdCB0aGUKQEAgLTU0Miw3ICs1NDIsNyBAQAogCQlyZXR1cm4gLUUyQklHOwogCiAJaW50ZWxfZHBfY2hlY2tfZWRwKGludGVsX2RwKTsKLQltc2dbMF0gPSBBVVhfTkFUSVZFX1dSSVRFIDw8IDQ7CisJbXNnWzBdID0gRFBfQVVYX05BVElWRV9XUklURSA8PCA0OwogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKIAltc2dbMl0gPSBhZGRyZXNzICYgMHhmZjsKIAltc2dbM10gPSBzZW5kX2J5dGVzIC0gMTsKQEAgLTU1Miw5ICs1NTIsMTAgQEAKIAkJcmV0ID0gaW50ZWxfZHBfYXV4X2NoKGludGVsX2RwLCBtc2csIG1zZ19ieXRlcywgJmFjaywgMSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKChhY2sgJiBBVVhfTkFUSVZFX1JFUExZX01BU0spID09IEFVWF9OQVRJVkVfUkVQTFlfQUNLKQorCQlhY2sgPj49IDQ7CisJCWlmICgoYWNrICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSykKIAkJCWJyZWFrOwotCQllbHNlIGlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0RFRkVSKQorCQllbHNlIGlmICgoYWNrICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBEUF9BVVhfTkFUSVZFX1JFUExZX0RFRkVSKQogCQkJdWRlbGF5KDEwMCk7CiAJCWVsc2UKIAkJCXJldHVybiAtRUlPOwpAQCAtNTg2LDcgKzU4Nyw3IEBACiAJCXJldHVybiAtRTJCSUc7CiAKIAlpbnRlbF9kcF9jaGVja19lZHAoaW50ZWxfZHApOwotCW1zZ1swXSA9IEFVWF9OQVRJVkVfUkVBRCA8PCA0OworCW1zZ1swXSA9IERQX0FVWF9OQVRJVkVfUkVBRCA8PCA0OwogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKIAltc2dbMl0gPSBhZGRyZXNzICYgMHhmZjsKIAltc2dbM10gPSByZWN2X2J5dGVzIC0gMTsKQEAgLTYwMSwxMiArNjAyLDEyIEBACiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlhY2sgPSByZXBseVswXTsKLQkJaWYgKChhY2sgJiBBVVhfTkFUSVZFX1JFUExZX01BU0spID09IEFVWF9OQVRJVkVfUkVQTFlfQUNLKSB7CisJCWFjayA9IHJlcGx5WzBdID4+IDQ7CisJCWlmICgoYWNrICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSykgewogCQkJbWVtY3B5KHJlY3YsIHJlcGx5ICsgMSwgcmV0IC0gMSk7CiAJCQlyZXR1cm4gcmV0IC0gMTsKIAkJfQotCQllbHNlIGlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0RFRkVSKQorCQllbHNlIGlmICgoYWNrICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBEUF9BVVhfTkFUSVZFX1JFUExZX0RFRkVSKQogCQkJdWRlbGF5KDEwMCk7CiAJCWVsc2UKIAkJCXJldHVybiAtRUlPOwpAQCAtNjMzLDEyICs2MzQsMTIgQEAKIAlpbnRlbF9kcF9jaGVja19lZHAoaW50ZWxfZHApOwogCS8qIFNldCB1cCB0aGUgY29tbWFuZCBieXRlICovCiAJaWYgKG1vZGUgJiBNT0RFX0kyQ19SRUFEKQotCQltc2dbMF0gPSBBVVhfSTJDX1JFQUQgPDwgNDsKKwkJbXNnWzBdID0gRFBfQVVYX0kyQ19SRUFEIDw8IDQ7CiAJZWxzZQotCQltc2dbMF0gPSBBVVhfSTJDX1dSSVRFIDw8IDQ7CisJCW1zZ1swXSA9IERQX0FVWF9JMkNfV1JJVEUgPDwgNDsKIAogCWlmICghKG1vZGUgJiBNT0RFX0kyQ19TVE9QKSkKLQkJbXNnWzBdIHw9IEFVWF9JMkNfTU9UIDw8IDQ7CisJCW1zZ1swXSB8PSBEUF9BVVhfSTJDX01PVCA8PCA0OwogCiAJbXNnWzFdID0gYWRkcmVzcyA+PiA4OwogCW1zZ1syXSA9IGFkZHJlc3M7CkBAIC02NzUsMTcgKzY3NiwxNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlzd2l0Y2ggKHJlcGx5WzBdICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSB7Ci0JCWNhc2UgQVVYX05BVElWRV9SRVBMWV9BQ0s6CisJCXN3aXRjaCAoKHJlcGx5WzBdID4+IDQpICYgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLKSB7CisJCWNhc2UgRFBfQVVYX05BVElWRV9SRVBMWV9BQ0s6CiAJCQkvKiBJMkMtb3Zlci1BVVggUmVwbHkgZmllbGQgaXMgb25seSB2YWxpZAogCQkJICogd2hlbiBwYWlyZWQgd2l0aCBBVVggQUNLLgogCQkJICovCiAJCQlicmVhazsKLQkJY2FzZSBBVVhfTkFUSVZFX1JFUExZX05BQ0s6CisJCWNhc2UgRFBfQVVYX05BVElWRV9SRVBMWV9OQUNLOgogCQkJRFJNX0RFQlVHX0tNUygiYXV4X2NoIG5hdGl2ZSBuYWNrXG4iKTsKIAkJCXJldCA9IC1FUkVNT1RFSU87CiAJCQlnb3RvIG91dDsKLQkJY2FzZSBBVVhfTkFUSVZFX1JFUExZX0RFRkVSOgorCQljYXNlIERQX0FVWF9OQVRJVkVfUkVQTFlfREVGRVI6CiAJCQkvKgogCQkJICogRm9yIG5vdywganVzdCBnaXZlIG1vcmUgc2xhY2sgdG8gYnJhbmNoIGRldmljZXMuIFdlCiAJCQkgKiBjb3VsZCBjaGVjayB0aGUgRFBDRCBmb3IgSTJDIGJpdCByYXRlIGNhcGFiaWxpdGllcywKQEAgLTcwNiwxOCArNzA3LDE4IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXN3aXRjaCAocmVwbHlbMF0gJiBBVVhfSTJDX1JFUExZX01BU0spIHsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX0FDSzoKKwkJc3dpdGNoICgocmVwbHlbMF0gPj4gNCkgJiBEUF9BVVhfSTJDX1JFUExZX01BU0spIHsKKwkJY2FzZSBEUF9BVVhfSTJDX1JFUExZX0FDSzoKIAkJCWlmIChtb2RlID09IE1PREVfSTJDX1JFQUQpIHsKIAkJCQkqcmVhZF9ieXRlID0gcmVwbHlbMV07CiAJCQl9CiAJCQlyZXQgPSByZXBseV9ieXRlcyAtIDE7CiAJCQlnb3RvIG91dDsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX05BQ0s6CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9OQUNLOgogCQkJRFJNX0RFQlVHX0tNUygiYXV4X2kyYyBuYWNrXG4iKTsKIAkJCXJldCA9IC1FUkVNT1RFSU87CiAJCQlnb3RvIG91dDsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX0RFRkVSOgorCQljYXNlIERQX0FVWF9JMkNfUkVQTFlfREVGRVI6CiAJCQlEUk1fREVCVUdfS01TKCJhdXhfaTJjIGRlZmVyXG4iKTsKIAkJCXVkZWxheSgxMDApOwogCQkJYnJlYWs7CkBAIC0xMDM3LDYgKzEwMzgsOCBAQAogCQkJCUk5MTVfUkVBRChwcF9zdGF0X3JlZyksCiAJCQkJSTkxNV9SRUFEKHBwX2N0cmxfcmVnKSk7CiAJfQorCisJRFJNX0RFQlVHX0tNUygiV2FpdCBjb21wbGV0ZVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGlyb25sYWtlX3dhaXRfcGFuZWxfb24oc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKQEAgLTEwOTIsNiArMTA5NSw4IEBACiAJaWYgKGlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3ZkZChpbnRlbF9kcCkpCiAJCXJldHVybjsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwogCURSTV9ERUJVR19LTVMoIlR1cm5pbmcgZURQIFZERCBvblxuIik7CiAKIAlpZiAoIWlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3Bvd2VyKGludGVsX2RwKSkKQEAgLTExNDAsNyArMTE0NSwxMSBAQAogCQkvKiBNYWtlIHN1cmUgc2VxdWVuY2VyIGlzIGlkbGUgYmVmb3JlIGFsbG93aW5nIHN1YnNlcXVlbnQgYWN0aXZpdHkgKi8KIAkJRFJNX0RFQlVHX0tNUygiUFBfU1RBVFVTOiAweCUwOHggUFBfQ09OVFJPTDogMHglMDh4XG4iLAogCQlJOTE1X1JFQUQocHBfc3RhdF9yZWcpLCBJOTE1X1JFQUQocHBfY3RybF9yZWcpKTsKLQkJbXNsZWVwKGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5KTsKKworCQlpZiAoKHBwICYgUE9XRVJfVEFSR0VUX09OKSA9PSAwKQorCQkJbXNsZWVwKGludGVsX2RwLT5wYW5lbF9wb3dlcl9jeWNsZV9kZWxheSk7CisKKwkJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogCX0KIH0KIApAQCAtMTIzMywyMCArMTI0MiwxNiBAQAogCiAJRFJNX0RFQlVHX0tNUygiVHVybiBlRFAgcG93ZXIgb2ZmXG4iKTsKIAotCVdBUk4oIWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCwgIk5lZWQgVkREIHRvIHR1cm4gb2ZmIHBhbmVsXG4iKTsKLQogCXBwID0gaXJvbmxha2VfZ2V0X3BwX2NvbnRyb2woaW50ZWxfZHApOwogCS8qIFdlIG5lZWQgdG8gc3dpdGNoIG9mZiBwYW5lbCBwb3dlciBfYW5kXyBmb3JjZSB2ZGQsIGZvciBvdGhlcndpc2Ugc29tZQogCSAqIHBhbmVscyBnZXQgdmVyeSB1bmhhcHB5IGFuZCBjZWFzZSB0byB3b3JrLiAqLwotCXBwICY9IH4oUE9XRVJfVEFSR0VUX09OIHwgRURQX0ZPUkNFX1ZERCB8IFBBTkVMX1BPV0VSX1JFU0VUIHwgRURQX0JMQ19FTkFCTEUpOworCXBwICY9IH4oUE9XRVJfVEFSR0VUX09OIHwgUEFORUxfUE9XRVJfUkVTRVQgfCBFRFBfQkxDX0VOQUJMRSk7CiAKIAlwcF9jdHJsX3JlZyA9IF9wcF9jdHJsX3JlZyhpbnRlbF9kcCk7CiAKIAlJOTE1X1dSSVRFKHBwX2N0cmxfcmVnLCBwcCk7CiAJUE9TVElOR19SRUFEKHBwX2N0cmxfcmVnKTsKIAotCWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCA9IGZhbHNlOwotCiAJaXJvbmxha2Vfd2FpdF9wYW5lbF9vZmYoaW50ZWxfZHApOwogfQogCkBAIC0xNzcyLDcgKzE3NzcsNiBAQAogCiAJLyogTWFrZSBzdXJlIHRoZSBwYW5lbCBpcyBvZmYgYmVmb3JlIHRyeWluZyB0byBjaGFuZ2UgdGhlIG1vZGUuIEJ1dCBhbHNvCiAJICogZW5zdXJlIHRoYXQgd2UgaGF2ZSB2ZGQgd2hpbGUgd2Ugc3dpdGNoIG9mZiB0aGUgcGFuZWwuICovCi0JaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CiAJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYoaW50ZWxfZHApOwogCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgRFJNX01PREVfRFBNU19PRkYpOwogCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoaW50ZWxfZHApOwpAQCAtMTg0NSwyMyArMTg0OSwyMyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOwotCWludCBwb3J0ID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOworCWVudW0gZHBpb19jaGFubmVsIHBvcnQgPSB2bHZfZHBvcnRfdG9fY2hhbm5lbChkcG9ydCk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCXN0cnVjdCBlZHBfcG93ZXJfc2VxIHBvd2VyX3NlcTsKIAl1MzIgdmFsOwogCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CiAKLQl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBEUElPX0RBVEFfTEFORV9BKHBvcnQpKTsKKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFc4KHBvcnQpKTsKIAl2YWwgPSAwOwogCWlmIChwaXBlKQogCQl2YWwgfD0gKDE8PDIxKTsKIAllbHNlCiAJCXZhbCAmPSB+KDE8PDIxKTsKIAl2YWwgfD0gMHgwMDEwMDBjNDsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19EQVRBX0NIQU5ORUwocG9ydCksIHZhbCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NMT0NLQlVGMChwb3J0KSwgMHgwMDc2MDAxOCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NMT0NLQlVGOChwb3J0KSwgMHgwMDQwMDg4OCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFc4KHBvcnQpLCB2YWwpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTX0RXMTQocG9ydCksIDB4MDA3NjAwMTgpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTX0RXMjMocG9ydCksIDB4MDA0MDA4ODgpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIApAQCAtMTg3Miw3ICsxODc2LDcgQEAKIAogCWludGVsX2VuYWJsZV9kcChlbmNvZGVyKTsKIAotCXZsdl93YWl0X3BvcnRfcmVhZHkoZGV2X3ByaXYsIHBvcnQpOworCXZsdl93YWl0X3BvcnRfcmVhZHkoZGV2X3ByaXYsIGRwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgdmx2X2RwX3ByZV9wbGxfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTg4MiwyNCArMTg4NiwyNCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPQogCQl0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7Ci0JaW50IHBvcnQgPSB2bHZfZHBvcnRfdG9fY2hhbm5lbChkcG9ydCk7CisJZW51bSBkcGlvX2NoYW5uZWwgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CiAKIAkvKiBQcm9ncmFtIFR4IGxhbmUgcmVzZXRzIHRvIGRlZmF1bHQgKi8KIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19QQ1NfVFgocG9ydCksCisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFcwKHBvcnQpLAogCQkJIERQSU9fUENTX1RYX0xBTkUyX1JFU0VUIHwKIAkJCSBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NMSyhwb3J0KSwKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzEocG9ydCksCiAJCQkgRFBJT19QQ1NfQ0xLX0NSSV9SWEVCX0VJT1NfRU4gfAogCQkJIERQSU9fUENTX0NMS19DUklfUlhESUdGSUxUU0dfRU4gfAogCQkJICgxPDxEUElPX1BDU19DTEtfREFUQVdJRFRIX1NISUZUKSB8CiAJCQkJIERQSU9fUENTX0NMS19TT0ZUX1JFU0VUKTsKIAogCS8qIEZpeCB1cCBpbnRlci1wYWlyIHNrZXcgZmFpbHVyZSAqLwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BDU19TVEFHR0VSMShwb3J0KSwgMHgwMDc1MGYwMCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfQ1RMKHBvcnQpLCAweDAwMDAxNTAwKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9MQU5FKHBvcnQpLCAweDQwNDAwMDAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzEyKHBvcnQpLCAweDAwNzUwZjAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMTEocG9ydCksIDB4MDAwMDE1MDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFcxNChwb3J0KSwgMHg0MDQwMDAwMCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIApAQCAtMTk0MSwxOCArMTk0NSw2IEBACiAJCQkJCSAgICAgIERQX0xJTktfU1RBVFVTX1NJWkUpOwogfQogCi0jaWYgMAotc3RhdGljIGNoYXIJKnZvbHRhZ2VfbmFtZXNbXSA9IHsKLQkiMC40ViIsICIwLjZWIiwgIjAuOFYiLCAiMS4yViIKLX07Ci1zdGF0aWMgY2hhcgkqcHJlX2VtcGhfbmFtZXNbXSA9IHsKLQkiMGRCIiwgIjMuNWRCIiwgIjZkQiIsICI5LjVkQiIKLX07Ci1zdGF0aWMgY2hhcgkqbGlua190cmFpbl9uYW1lc1tdID0gewotCSJwYXR0ZXJuIDEiLCAicGF0dGVybiAyIiwgImlkbGUiLCAib2ZmIgotfTsKLSNlbmRpZgotCiAvKgogICogVGhlc2UgYXJlIHNvdXJjZS1zcGVjaWZpYyB2YWx1ZXM7IGN1cnJlbnQgSW50ZWwgaGFyZHdhcmUgc3VwcG9ydHMKICAqIGEgbWF4aW11bSB2b2x0YWdlIG9mIDgwMG1WIGFuZCBhIG1heGltdW0gcHJlLWVtcGhhc2lzIG9mIDZkQgpAQCAtMjA1MCw3ICsyMDQyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGRlbXBoX3JlZ192YWx1ZSwgcHJlZW1waF9yZWdfdmFsdWUsCiAJCXVuaXF0cmFuc2NhbGVfcmVnX3ZhbHVlOwogCXVpbnQ4X3QgdHJhaW5fc2V0ID0gaW50ZWxfZHAtPnRyYWluX3NldFswXTsKLQlpbnQgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKKwllbnVtIGRwaW9fY2hhbm5lbCBwb3J0ID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAogCXN3aXRjaCAodHJhaW5fc2V0ICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spIHsKQEAgLTIxMjcsMTQgKzIxMTksMTQgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9PQ0FMSU5JVChwb3J0KSwgMHgwMDAwMDAwMCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfU1dJTkdfQ1RMNChwb3J0KSwgZGVtcGhfcmVnX3ZhbHVlKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9TV0lOR19DVEwyKHBvcnQpLAorCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFc1KHBvcnQpLCAweDAwMDAwMDAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXNChwb3J0KSwgZGVtcGhfcmVnX3ZhbHVlKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMihwb3J0KSwKIAkJCSB1bmlxdHJhbnNjYWxlX3JlZ192YWx1ZSk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfU1dJTkdfQ1RMMyhwb3J0KSwgMHgwQzc4MjA0MCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX1NUQUdHRVIwKHBvcnQpLCAweDAwMDMwMDAwKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19QQ1NfQ1RMX09WRVIxKHBvcnQpLCBwcmVlbXBoX3JlZ192YWx1ZSk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfT0NBTElOSVQocG9ydCksIDB4ODAwMDAwMDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFczKHBvcnQpLCAweDBDNzgyMDQwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzExKHBvcnQpLCAweDAwMDMwMDAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzkocG9ydCksIHByZWVtcGhfcmVnX3ZhbHVlKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXNShwb3J0KSwgMHg4MDAwMDAwMCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMjY0Niw3ICsyNjM4LDYgQEAKIAogCQlpZiAoY3JfdHJpZXMgPiA1KSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byB0cmFpbiBEUCwgYWJvcnRpbmdcbiIpOwotCQkJaW50ZWxfZHBfbGlua19kb3duKGludGVsX2RwKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTI4OTksMTMgKzI4OTAsMTEgQEAKIAogCS8qIFRyeSB0byByZWFkIHJlY2VpdmVyIHN0YXR1cyBpZiB0aGUgbGluayBhcHBlYXJzIHRvIGJlIHVwICovCiAJaWYgKCFpbnRlbF9kcF9nZXRfbGlua19zdGF0dXMoaW50ZWxfZHAsIGxpbmtfc3RhdHVzKSkgewotCQlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOwogCQlyZXR1cm47CiAJfQogCiAJLyogTm93IHJlYWQgdGhlIERQQ0QgdG8gc2VlIGlmIGl0J3MgYWN0dWFsbHkgcnVubmluZyAqLwogCWlmICghaW50ZWxfZHBfZ2V0X2RwY2QoaW50ZWxfZHApKSB7Ci0JCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMwMjAsMTggKzMwMDksMzQgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlzd2l0Y2ggKGludGVsX2RpZ19wb3J0LT5wb3J0KSB7Ci0JY2FzZSBQT1JUX0I6Ci0JCWJpdCA9IFBPUlRCX0hPVFBMVUdfTElWRV9TVEFUVVM7Ci0JCWJyZWFrOwotCWNhc2UgUE9SVF9DOgotCQliaXQgPSBQT1JUQ19IT1RQTFVHX0xJVkVfU1RBVFVTOwotCQlicmVhazsKLQljYXNlIFBPUlRfRDoKLQkJYml0ID0gUE9SVERfSE9UUExVR19MSVZFX1NUQVRVUzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKwlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJCXN3aXRjaCAoaW50ZWxfZGlnX3BvcnQtPnBvcnQpIHsKKwkJY2FzZSBQT1JUX0I6CisJCQliaXQgPSBQT1JUQl9IT1RQTFVHX0xJVkVfU1RBVFVTX1ZMVjsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRfQzoKKwkJCWJpdCA9IFBPUlRDX0hPVFBMVUdfTElWRV9TVEFUVVNfVkxWOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9EOgorCQkJYml0ID0gUE9SVERfSE9UUExVR19MSVZFX1NUQVRVU19WTFY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGludGVsX2RpZ19wb3J0LT5wb3J0KSB7CisJCWNhc2UgUE9SVF9COgorCQkJYml0ID0gUE9SVEJfSE9UUExVR19MSVZFX1NUQVRVU19HNFg7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0M6CisJCQliaXQgPSBQT1JUQ19IT1RQTFVHX0xJVkVfU1RBVFVTX0c0WDsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRfRDoKKwkJCWJpdCA9IFBPUlREX0hPVFBMVUdfTElWRV9TVEFUVVNfRzRYOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCQl9CiAJfQogCiAJaWYgKChJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpICYgYml0KSA9PSAwKQpAQCAtMzA4Miw5ICszMDg3LDEyIEBACiAJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBkcF90b19kaWdfcG9ydChpbnRlbF9kcCk7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIgPSAmaW50ZWxfZGlnX3BvcnQtPmJhc2U7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGVkaWQgKmVkaWQgPSBOVUxMOwogCisJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOworCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsCiAJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKIApAQCAtMzA5Niw3ICszMTA0LDcgQEAKIAkJc3RhdHVzID0gZzR4X2RwX2RldGVjdChpbnRlbF9kcCk7CiAKIAlpZiAoc3RhdHVzICE9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKQotCQlyZXR1cm4gc3RhdHVzOworCQlnb3RvIG91dDsKIAogCWludGVsX2RwX3Byb2JlX291aShpbnRlbF9kcCk7CiAKQEAgLTMxMTIsNyArMzEyMCwxMSBAQAogCiAJaWYgKGludGVsX2VuY29kZXItPnR5cGUgIT0gSU5URUxfT1VUUFVUX0VEUCkKIAkJaW50ZWxfZW5jb2Rlci0+dHlwZSA9IElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVDsKLQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisKK291dDoKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBpbnRlbF9kcF9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggNzlmOTFmMi4uZmJmYWFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTY1LDggKzY1LDggQEAKICNkZWZpbmUgd2FpdF9mb3JfYXRvbWljX3VzKENPTkQsIFVTKSBfd2FpdF9mb3IoKENPTkQpLCBcCiAJCQkJCSAgICAgICBESVZfUk9VTkRfVVAoKFVTKSwgMTAwMCksIDApCiAKLSNkZWZpbmUgS0h6KHgpICgxMDAwKngpCi0jZGVmaW5lIE1Ieih4KSBLSHooMTAwMCp4KQorI2RlZmluZSBLSHooeCkgKDEwMDAgKiAoeCkpCisjZGVmaW5lIE1Ieih4KSBLSHooMTAwMCAqICh4KSkKIAogLyoKICAqIERpc3BsYXkgcmVsYXRlZCBzdHVmZgpAQCAtMTU1LDcgKzE1NSwxOSBAQAogCiBzdHJ1Y3QgaW50ZWxfcGFuZWwgewogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkb3duY2xvY2tfbW9kZTsKIAlpbnQgZml0dGluZ19tb2RlOworCisJLyogYmFja2xpZ2h0ICovCisJc3RydWN0IHsKKwkJYm9vbCBwcmVzZW50OworCQl1MzIgbGV2ZWw7CisJCXUzMiBtYXg7CisJCWJvb2wgZW5hYmxlZDsKKwkJYm9vbCBjb21iaW5hdGlvbl9tb2RlOwkvKiBnZW4gMi80IG9ubHkgKi8KKwkJYm9vbCBhY3RpdmVfbG93X3B3bTsKKwkJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldmljZTsKKwl9IGJhY2tsaWdodDsKIH07CiAKIHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgewpAQCAtNDQzLDcgKzQ1NSw3IEBACiAJYm9vbCByZ2JfcXVhbnRfcmFuZ2Vfc2VsZWN0YWJsZTsKIAl2b2lkICgqd3JpdGVfaW5mb2ZyYW1lKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJZW51bSBoZG1pX2luZm9mcmFtZV90eXBlIHR5cGUsCi0JCQkJY29uc3QgdWludDhfdCAqZnJhbWUsIHNzaXplX3QgbGVuKTsKKwkJCQljb25zdCB2b2lkICpmcmFtZSwgc3NpemVfdCBsZW4pOwogCXZvaWQgKCpzZXRfaW5mb2ZyYW1lcykoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKIH07CkBAIC00OTAsOSArNTAyLDkgQEAKIHsKIAlzd2l0Y2ggKGRwb3J0LT5wb3J0KSB7CiAJY2FzZSBQT1JUX0I6Ci0JCXJldHVybiAwOworCQlyZXR1cm4gRFBJT19DSDA7CiAJY2FzZSBQT1JUX0M6Ci0JCXJldHVybiAxOworCQlyZXR1cm4gRFBJT19DSDE7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtNjAxLDcgKzYxMyw4IEBACiB2b2lkIGludGVsX2RkaV9lbmFibGVfcGlwZV9jbG9jayhzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0Yyk7CiB2b2lkIGludGVsX2RkaV9kaXNhYmxlX3BpcGVfY2xvY2soc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMpOwogdm9pZCBpbnRlbF9kZGlfc2V0dXBfaHdfcGxsX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotYm9vbCBpbnRlbF9kZGlfcGxsX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Citib29sIGludGVsX2RkaV9wbGxfc2VsZWN0KHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKTsKK3ZvaWQgaW50ZWxfZGRpX3BsbF9lbmFibGUoc3RydWN0IGludGVsX2NydGMgKmNydGMpOwogdm9pZCBpbnRlbF9kZGlfcHV0X2NydGNfcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiB2b2lkIGludGVsX2RkaV9zZXRfcGlwZV9zZXR0aW5ncyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogdm9pZCBpbnRlbF9kZGlfcHJlcGFyZV9saW5rX3JldHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKQEAgLTYxMiw2ICs2MjUsOCBAQAogCiAKIC8qIGludGVsX2Rpc3BsYXkuYyAqLworY29uc3QgY2hhciAqaW50ZWxfb3V0cHV0X25hbWUoaW50IG91dHB1dCk7Citib29sIGludGVsX2hhc19wZW5kaW5nX2ZiX3VucGluKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX3BjaF9yYXdjbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGludGVsX21hcmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaW50ZWxfbWFya19mYl9idXN5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCkBAIC02MzgsNyArNjUzLDggQEAKIHZvaWQgaW50ZWxfd2FpdF9mb3JfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKTsKIHZvaWQgaW50ZWxfd2FpdF9mb3JfcGlwZV9vZmYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpOwogaW50IGlyb25sYWtlX2dldF9sYW5lc19yZXF1aXJlZChpbnQgdGFyZ2V0X2Nsb2NrLCBpbnQgbGlua19idywgaW50IGJwcCk7Ci12b2lkIHZsdl93YWl0X3BvcnRfcmVhZHkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgcG9ydCk7Cit2b2lkIHZsdl93YWl0X3BvcnRfcmVhZHkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJIHN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmRwb3J0KTsKIGJvb2wgaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQlzdHJ1Y3QgaW50ZWxfbG9hZF9kZXRlY3RfcGlwZSAqb2xkKTsKQEAgLTY5MCwxMSArNzA2LDEwIEBACiBpcm9ubGFrZV9jaGVja19lbmNvZGVyX2RvdGNsb2NrKGNvbnN0IHN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyAqcGlwZV9jb25maWcsCiAJCQkJaW50IGRvdGNsb2NrKTsKIGJvb2wgaW50ZWxfY3J0Y19hY3RpdmUoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKLXZvaWQgaTkxNV9kaXNhYmxlX3ZnYV9tZW0oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGhzd19lbmFibGVfaXBzKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKTsKIHZvaWQgaHN3X2Rpc2FibGVfaXBzKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKTsKIHZvaWQgaW50ZWxfZGlzcGxheV9zZXRfaW5pdF9wb3dlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGVuYWJsZSk7Ci0KK2ludCB2YWxsZXl2aWV3X2dldF92Y28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIAogLyogaW50ZWxfZHAuYyAqLwogdm9pZCBpbnRlbF9kcF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfcmVnLCBlbnVtIHBvcnQgcG9ydCk7CkBAIC04MDgsOSArODIzLDEzIEBACiBpbnQgaW50ZWxfcGFuZWxfc2V0dXBfYmFja2xpZ2h0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogdm9pZCBpbnRlbF9wYW5lbF9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CiB2b2lkIGludGVsX3BhbmVsX2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Ci12b2lkIGludGVsX3BhbmVsX2Rlc3Ryb3lfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBpbnRlbF9wYW5lbF9kZXN0cm95X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK3ZvaWQgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHRfZnVuY3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGludGVsX3BhbmVsX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLQorZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICppbnRlbF9maW5kX3BhbmVsX2Rvd25jbG9jaygKKwkJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlLAorCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogCiAvKiBpbnRlbF9wbS5jICovCiB2b2lkIGludGVsX2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtODMwLDYgKzg0OSw4IEBACiB2b2lkIGludGVsX3Bvd2VyX2RvbWFpbnNfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogYm9vbCBpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBkb21haW4pOworYm9vbCBpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWRfc3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBkb21haW4pOwogdm9pZCBpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICBlbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIGRvbWFpbik7CiB2b2lkIGludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCkBAIC04NDQsNiArODY1LDEwIEBACiB2b2lkIGdlbjZfcnBzX2Jvb3N0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX2F1eF9kaXNwbGF5X3J1bnRpbWVfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX2F1eF9kaXNwbGF5X3J1bnRpbWVfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGludGVsX3J1bnRpbWVfcG1fZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGludGVsX3J1bnRpbWVfcG1fcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGludGVsX2luaXRfcnVudGltZV9wbShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwordm9pZCBpbnRlbF9maW5pX3J1bnRpbWVfcG0oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIHZvaWQgaWxrX3dtX2dldF9od19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaS5jCmluZGV4IGQyNTdiMDkuLmZhYmJmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaS5jCkBAIC0zNyw0OSArMzcsMTggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSBpbnRlbF9kc2lfZGV2aWNlc1tdID0gewogfTsKIAotCi1zdGF0aWMgdm9pZCB2bHZfY2NrX21vZGlmeShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUzMiB2YWwsCi0JCQkgICB1MzIgbWFzaykKLXsKLQl1MzIgdG1wID0gdmx2X2Nja19yZWFkKGRldl9wcml2LCByZWcpOwotCXRtcCAmPSB+bWFzazsKLQl0bXAgfD0gdmFsOwotCXZsdl9jY2tfd3JpdGUoZGV2X3ByaXYsIHJlZywgdG1wKTsKLX0KLQotc3RhdGljIHZvaWQgYmFuZF9nYXBfd2Eoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorc3RhdGljIHZvaWQgYmFuZF9nYXBfcmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCi0JLyogRW5hYmxlIGJhbmRnYXAgZml4IGluIEdPUCBkcml2ZXIgKi8KLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RCwgMHgwMDAxMDAwMCwgMHgwMDAzMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RSwgMHgwMDAxMDAwMCwgMHgwMDAzMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RiwgMHgwMDAxMDAwMCwgMHgwMDAzMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHgwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHgwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODAwMCk7Ci0JbXNsZWVwKDIwKTsKLQotCS8qIFR1cm4gRGlzcGxheSBUcnVuayBvbiAqLwotCXZsdl9jY2tfbW9kaWZ5KGRldl9wcml2LCAweDZCLCAweDAwMDIwMDAwLCAweDAwMDMwMDAwKTsKLQltc2xlZXAoMjApOwotCi0Jdmx2X2Nja19tb2RpZnkoZGV2X3ByaXYsIDB4NkMsIDB4MDAwMjAwMDAsIDB4MDAwMzAwMDApOwotCW1zbGVlcCgyMCk7Ci0KLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RCwgMHgwMDAyMDAwMCwgMHgwMDAzMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RSwgMHgwMDAyMDAwMCwgMHgwMDAzMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQl2bHZfY2NrX21vZGlmeShkZXZfcHJpdiwgMHg2RiwgMHgwMDAyMDAwMCwgMHgwMDAzMDAwMCk7CisJdmx2X2ZsaXNkc2lfd3JpdGUoZGV2X3ByaXYsIDB4MDgsIDB4MDAwMSk7CisJdmx2X2ZsaXNkc2lfd3JpdGUoZGV2X3ByaXYsIDB4MEYsIDB4MDAwNSk7CisJdmx2X2ZsaXNkc2lfd3JpdGUoZGV2X3ByaXYsIDB4MEYsIDB4MDAyNSk7CisJdWRlbGF5KDE1MCk7CisJdmx2X2ZsaXNkc2lfd3JpdGUoZGV2X3ByaXYsIDB4MEYsIDB4MDAwMCk7CisJdmx2X2ZsaXNkc2lfd3JpdGUoZGV2X3ByaXYsIDB4MDgsIDB4MDAwMCk7CiAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwotCi0JLyogTmVlZCBodWdlIGRlbGF5LCBvdGhlcndpc2UgY2xvY2sgaXMgbm90IHN0YWJsZSAqLwotCW1zbGVlcCgxMDApOwogfQogCiBzdGF0aWMgc3RydWN0IGludGVsX2RzaSAqaW50ZWxfYXR0YWNoZWRfZHNpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xMzIsMTQgKzEwMSw0NyBAQAogCXZsdl9lbmFibGVfZHNpX3BsbChlbmNvZGVyKTsKIH0KIAorc3RhdGljIHZvaWQgaW50ZWxfZHNpX2RldmljZV9yZWFkeShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCXUzMiB2YWw7CisKKwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJdmFsID0gSTkxNV9SRUFEKE1JUElfUE9SVF9DVFJMKHBpcGUpKTsKKwlJOTE1X1dSSVRFKE1JUElfUE9SVF9DVFJMKHBpcGUpLCB2YWwgfCBMUF9PVVRQVVRfSE9MRCk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIERFVklDRV9SRUFEWSB8IFVMUFNfU1RBVEVfRVhJVCk7CisJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIERFVklDRV9SRUFEWSk7CisJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIDB4MDApOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKKwlJOTE1X1dSSVRFKE1JUElfREVWSUNFX1JFQURZKHBpcGUpLCBERVZJQ0VfUkVBRFkpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKK30KIHN0YXRpYyB2b2lkIGludGVsX2RzaV9wcmVfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQogeworCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGVuY190b19pbnRlbF9kc2koJmVuY29kZXItPmJhc2UpOworCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKKworCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5wYW5lbF9yZXNldCkKKwkJaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+cGFuZWxfcmVzZXQoJmludGVsX2RzaS0+ZGV2KTsKKworCS8qIHB1dCBkZXZpY2UgaW4gcmVhZHkgc3RhdGUgKi8KKwlpbnRlbF9kc2lfZGV2aWNlX3JlYWR5KGVuY29kZXIpOworCisJaWYgKGludGVsX2RzaS0+ZGV2LmRldl9vcHMtPnNlbmRfb3RwX2NtZHMpCisJCWludGVsX2RzaS0+ZGV2LmRldl9vcHMtPnNlbmRfb3RwX2NtZHMoJmludGVsX2RzaS0+ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfZHNpX2VuYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CiAJc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpID0gZW5jX3RvX2ludGVsX2RzaSgmZW5jb2Rlci0+YmFzZSk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwpAQCAtMTQ3LDQxICsxNDksMjggQEAKIAogCURSTV9ERUJVR19LTVMoIlxuIik7CiAKLQl0ZW1wID0gSTkxNV9SRUFEKE1JUElfREVWSUNFX1JFQURZKHBpcGUpKTsKLQlpZiAoKHRlbXAgJiBERVZJQ0VfUkVBRFkpID09IDApIHsKLQkJdGVtcCAmPSB+VUxQU19TVEFURV9NQVNLOwotCQlJOTE1X1dSSVRFKE1JUElfREVWSUNFX1JFQURZKHBpcGUpLCB0ZW1wIHwgREVWSUNFX1JFQURZKTsKLQl9IGVsc2UgaWYgKHRlbXAgJiBVTFBTX1NUQVRFX01BU0spIHsKLQkJdGVtcCAmPSB+VUxQU19TVEFURV9NQVNLOwotCQlJOTE1X1dSSVRFKE1JUElfREVWSUNFX1JFQURZKHBpcGUpLCB0ZW1wIHwgVUxQU19TVEFURV9FWElUKTsKLQkJLyoKLQkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gb2YgMSBtcyB0aW1lCi0JCSAqIGF2YWlsYWJsZSBiZWZvcmUgY2xlYXJpbmcgdGhlIFVQTFMgZXhpdCBzdGF0ZS4KLQkJICovCi0JCW1zbGVlcCgyKTsKLQkJSTkxNV9XUklURShNSVBJX0RFVklDRV9SRUFEWShwaXBlKSwgdGVtcCk7Ci0JfQotCiAJaWYgKGlzX2NtZF9tb2RlKGludGVsX2RzaSkpCiAJCUk5MTVfV1JJVEUoTUlQSV9NQVhfUkVUVVJOX1BLVF9TSVpFKHBpcGUpLCA4ICogNCk7Ci0KLQlpZiAoaXNfdmlkX21vZGUoaW50ZWxfZHNpKSkgeworCWVsc2UgewogCQltc2xlZXAoMjApOyAvKiBYWFggKi8KIAkJZHBpX3NlbmRfY21kKGludGVsX2RzaSwgVFVSTl9PTik7CiAJCW1zbGVlcCgxMDApOwogCiAJCS8qIGFzc2VydCBpcF90Z19lbmFibGUgc2lnbmFsICovCi0JCXRlbXAgPSBJOTE1X1JFQUQoTUlQSV9QT1JUX0NUUkwocGlwZSkpOworCQl0ZW1wID0gSTkxNV9SRUFEKE1JUElfUE9SVF9DVFJMKHBpcGUpKSAmIH5MQU5FX0NPTkZJR1VSQVRJT05fTUFTSzsKKwkJdGVtcCA9IHRlbXAgfCBpbnRlbF9kc2ktPnBvcnRfYml0czsKIAkJSTkxNV9XUklURShNSVBJX1BPUlRfQ1RSTChwaXBlKSwgdGVtcCB8IERQSV9FTkFCTEUpOwogCQlQT1NUSU5HX1JFQUQoTUlQSV9QT1JUX0NUUkwocGlwZSkpOwogCX0KIAotCWludGVsX2RzaS0+ZGV2LmRldl9vcHMtPmVuYWJsZSgmaW50ZWxfZHNpLT5kZXYpOworCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5lbmFibGUpCisJCWludGVsX2RzaS0+ZGV2LmRldl9vcHMtPmVuYWJsZSgmaW50ZWxfZHNpLT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9kc2lfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CiAJc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpID0gZW5jX3RvX2ludGVsX2RzaSgmZW5jb2Rlci0+YmFzZSk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwpAQCAtMTg5LDggKzE3OCw2IEBACiAKIAlEUk1fREVCVUdfS01TKCJcbiIpOwogCi0JaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+ZGlzYWJsZSgmaW50ZWxfZHNpLT5kZXYpOwotCiAJaWYgKGlzX3ZpZF9tb2RlKGludGVsX2RzaSkpIHsKIAkJZHBpX3NlbmRfY21kKGludGVsX2RzaSwgU0hVVERPV04pOwogCQltc2xlZXAoMTApOwpAQCAtMjAzLDIwICsxOTAsNTQgQEAKIAkJbXNsZWVwKDIpOwogCX0KIAotCXRlbXAgPSBJOTE1X1JFQUQoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSkpOwotCWlmICh0ZW1wICYgREVWSUNFX1JFQURZKSB7Ci0JCXRlbXAgJj0gfkRFVklDRV9SRUFEWTsKLQkJdGVtcCAmPSB+VUxQU19TVEFURV9NQVNLOwotCQlJOTE1X1dSSVRFKE1JUElfREVWSUNFX1JFQURZKHBpcGUpLCB0ZW1wKTsKLQl9CisJLyogaWYgZGlzYWJsZSBwYWNrZXRzIGFyZSBzZW50IGJlZm9yZSBzZW5kaW5nIHNodXRkb3duIHBhY2tldCB0aGVuIGluCisJICogc29tZSBuZXh0IGVuYWJsZSBzZXF1ZW5jZSBzZW5kIHR1cm4gb24gcGFja2V0IGVycm9yIGlzIG9ic2VydmVkICovCisJaWYgKGludGVsX2RzaS0+ZGV2LmRldl9vcHMtPmRpc2FibGUpCisJCWludGVsX2RzaS0+ZGV2LmRldl9vcHMtPmRpc2FibGUoJmludGVsX2RzaS0+ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfZHNpX3Bvc3RfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3N0YXRpYyB2b2lkIGludGVsX2RzaV9jbGVhcl9kZXZpY2VfcmVhZHkoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCiB7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgdmFsOworCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAorCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIFVMUFNfU1RBVEVfRU5URVIpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKKworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIFVMUFNfU1RBVEVfRVhJVCk7CisJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOworCisJSTkxNV9XUklURShNSVBJX0RFVklDRV9SRUFEWShwaXBlKSwgVUxQU19TVEFURV9FTlRFUik7CisJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOworCisJdmFsID0gSTkxNV9SRUFEKE1JUElfUE9SVF9DVFJMKHBpcGUpKTsKKwlJOTE1X1dSSVRFKE1JUElfUE9SVF9DVFJMKHBpcGUpLCB2YWwgJiB+TFBfT1VUUFVUX0hPTEQpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKKworCWlmICh3YWl0X2ZvcigoKEk5MTVfUkVBRChNSVBJX1BPUlRfQ1RSTChwaXBlKSkgJiBBRkVfTEFUQ0hPVVQpCisJCQkJCT09IDB4MDAwMDApLCAzMCkpCisJCURSTV9FUlJPUigiRFNJIExQIG5vdCBnb2luZyBMb3dcbiIpOworCisJSTkxNV9XUklURShNSVBJX0RFVklDRV9SRUFEWShwaXBlKSwgMHgwMCk7CisJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOworCiAJdmx2X2Rpc2FibGVfZHNpX3BsbChlbmNvZGVyKTsKIH0KK3N0YXRpYyB2b2lkIGludGVsX2RzaV9wb3N0X2Rpc2FibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpID0gZW5jX3RvX2ludGVsX2RzaSgmZW5jb2Rlci0+YmFzZSk7CisKKwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJaW50ZWxfZHNpX2NsZWFyX2RldmljZV9yZWFkeShlbmNvZGVyKTsKKworCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5kaXNhYmxlX3BhbmVsX3Bvd2VyKQorCQlpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5kaXNhYmxlX3BhbmVsX3Bvd2VyKCZpbnRlbF9kc2ktPmRldik7Cit9CiAKIHN0YXRpYyBib29sIGludGVsX2RzaV9nZXRfaHdfc3RhdGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJICAgZW51bSBwaXBlICpwaXBlKQpAQCAtMjUxLDggKzI3Miw5IEBACiAJLyogWFhYOiByZWFkIGZsYWdzLCBzZXQgdG8gYWRqdXN0ZWRfbW9kZSAqLwogfQogCi1zdGF0aWMgaW50IGludGVsX2RzaV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCitzdGF0aWMgZW51bSBkcm1fbW9kZV9zdGF0dXMKK2ludGVsX2RzaV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpeGVkX21vZGUgPSBpbnRlbF9jb25uZWN0b3ItPnBhbmVsLmZpeGVkX21vZGU7CkBAIC0zNTIsMTEgKzM3NCw4IEBACiAKIAlEUk1fREVCVUdfS01TKCJwaXBlICVjXG4iLCBwaXBlX25hbWUocGlwZSkpOwogCi0JLyogVXBkYXRlIHRoZSBEU0kgUExMICovCi0Jdmx2X2VuYWJsZV9kc2lfcGxsKGludGVsX2VuY29kZXIpOwotCiAJLyogWFhYOiBMb2NhdGlvbiBvZiB0aGUgY2FsbCAqLwotCWJhbmRfZ2FwX3dhKGRldl9wcml2KTsKKwliYW5kX2dhcF9yZXNldChkZXZfcHJpdik7CiAKIAkvKiBlc2NhcGUgY2xvY2sgZGl2aWRlciwgMjBNSHosIHNoYXJlZCBmb3IgQSBhbmQgQy4gZGV2aWNlIHJlYWR5IG11c3QgYmUKIAkgKiBvZmYgd2hlbiBkb2luZyB0aGlzISB0eGNsa2VzYz8gKi8KQEAgLTM3MywxMSArMzkyLDcgQEAKIAlJOTE1X1dSSVRFKE1JUElfSU5UUl9TVEFUKHBpcGUpLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKE1JUElfSU5UUl9FTihwaXBlKSwgMHhmZmZmZmZmZik7CiAKLQlJOTE1X1dSSVRFKE1JUElfRFBIWV9QQVJBTShwaXBlKSwKLQkJICAgMHgzYyA8PCBFWElUX1pFUk9fQ09VTlRfU0hJRlQgfAotCQkgICAweDFmIDw8IFRSQUlMX0NPVU5UX1NISUZUIHwKLQkJICAgMHhjNSA8PCBDTEtfWkVST19DT1VOVF9TSElGVCB8Ci0JCSAgIDB4MWYgPDwgUFJFUEFSRV9DT1VOVF9TSElGVCk7CisJSTkxNV9XUklURShNSVBJX0RQSFlfUEFSQU0ocGlwZSksIGludGVsX2RzaS0+ZHBoeV9yZWcpOwogCiAJSTkxNV9XUklURShNSVBJX0RQSV9SRVNPTFVUSU9OKHBpcGUpLAogCQkgICBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSA8PCBWRVJUSUNBTF9BRERSRVNTX1NISUZUIHwKQEAgLTQyNSw5ICs0NDAsOSBAQAogCQkJCSAgICAgICBhZGp1c3RlZF9tb2RlLT5odG90YWwsCiAJCQkJICAgICAgIGJwcCwgaW50ZWxfZHNpLT5sYW5lX2NvdW50KSArIDEpOwogCX0KLQlJOTE1X1dSSVRFKE1JUElfTFBfUlhfVElNRU9VVChwaXBlKSwgODMwOSk7IC8qIG1heCAqLwotCUk5MTVfV1JJVEUoTUlQSV9UVVJOX0FST1VORF9USU1FT1VUKHBpcGUpLCAweDE0KTsgLyogbWF4ICovCi0JSTkxNV9XUklURShNSVBJX0RFVklDRV9SRVNFVF9USU1FUihwaXBlKSwgMHhmZmZmKTsgLyogbWF4ICovCisJSTkxNV9XUklURShNSVBJX0xQX1JYX1RJTUVPVVQocGlwZSksIGludGVsX2RzaS0+bHBfcnhfdGltZW91dCk7CisJSTkxNV9XUklURShNSVBJX1RVUk5fQVJPVU5EX1RJTUVPVVQocGlwZSksIGludGVsX2RzaS0+dHVybl9hcm5kX3ZhbCk7CisJSTkxNV9XUklURShNSVBJX0RFVklDRV9SRVNFVF9USU1FUihwaXBlKSwgaW50ZWxfZHNpLT5yc3RfdGltZXJfdmFsKTsKIAogCS8qIGRwaHkgc3R1ZmYgKi8KIApAQCAtNDQyLDI5ICs0NTcsMzEgQEAKIAkgKgogCSAqIFhYWDogd3JpdGUgTUlQSV9TVE9QX1NUQVRFX1NUQUxMPwogCSAqLwotCUk5MTVfV1JJVEUoTUlQSV9ISUdIX0xPV19TV0lUQ0hfQ09VTlQocGlwZSksIDB4NDYpOworCUk5MTVfV1JJVEUoTUlQSV9ISUdIX0xPV19TV0lUQ0hfQ09VTlQocGlwZSksCisJCQkJCQlpbnRlbF9kc2ktPmhzX3RvX2xwX2NvdW50KTsKIAogCS8qIFhYWDogbG93IHBvd2VyIGNsb2NrIGVxdWl2YWxlbmNlIGluIHRlcm1zIG9mIGJ5dGUgY2xvY2suIHRoZSBudW1iZXIKIAkgKiBvZiBieXRlIGNsb2NrcyBvY2N1cGllZCBpbiBvbmUgbG93IHBvd2VyIGNsb2NrLiBiYXNlZCBvbiB0eGJ5dGVjbGtocwogCSAqIGFuZCB0eGNsa2VzYy4gdHhjbGtlc2MgdGltZSAvIHR4Ynl0ZWNsayB0aW1lICogKDEwNSArCiAJICogTUlQSV9TVE9QX1NUQVRFX1NUQUxMKSAvIDEwNS4/Pz8KIAkgKi8KLQlJOTE1X1dSSVRFKE1JUElfTFBfQllURUNMSyhwaXBlKSwgNCk7CisJSTkxNV9XUklURShNSVBJX0xQX0JZVEVDTEsocGlwZSksIGludGVsX2RzaS0+bHBfYnl0ZV9jbGspOwogCiAJLyogdGhlIGJ3IGVzc2VudGlhbCBmb3IgdHJhbnNtaXR0aW5nIDE2IGxvbmcgcGFja2V0cyBjb250YWluaW5nIDI1MgogCSAqIGJ5dGVzIG1lYW50IGZvciBkY3Mgd3JpdGUgbWVtb3J5IGNvbW1hbmQgaXMgcHJvZ3JhbW1lZCBpbiB0aGlzCiAJICogcmVnaXN0ZXIgaW4gdGVybXMgb2YgYnl0ZSBjbG9ja3MuIGJhc2VkIG9uIGRzaSB0cmFuc2ZlciByYXRlIGFuZCB0aGUKIAkgKiBudW1iZXIgb2YgbGFuZXMgY29uZmlndXJlZCB0aGUgdGltZSB0YWtlbiB0byB0cmFuc21pdCAxNiBsb25nIHBhY2tldHMKIAkgKiBpbiBhIGRzaSBzdHJlYW0gdmFyaWVzLiAqLwotCUk5MTVfV1JJVEUoTUlQSV9EQklfQldfQ1RSTChwaXBlKSwgMHg4MjApOworCUk5MTVfV1JJVEUoTUlQSV9EQklfQldfQ1RSTChwaXBlKSwgaW50ZWxfZHNpLT5id190aW1lcik7CiAKIAlJOTE1X1dSSVRFKE1JUElfQ0xLX0xBTkVfU1dJVENIX1RJTUVfQ05UKHBpcGUpLAotCQkgICAweGEgPDwgTFBfSFNfU1NXX0NOVF9TSElGVCB8Ci0JCSAgIDB4MTQgPDwgSFNfTFBfUFdSX1NXX0NOVF9TSElGVCk7CisJCSAgIGludGVsX2RzaS0+Y2xrX2xwX3RvX2hzX2NvdW50IDw8IExQX0hTX1NTV19DTlRfU0hJRlQgfAorCQkgICBpbnRlbF9kc2ktPmNsa19oc190b19scF9jb3VudCA8PCBIU19MUF9QV1JfU1dfQ05UX1NISUZUKTsKIAogCWlmIChpc192aWRfbW9kZShpbnRlbF9kc2kpKQogCQlJOTE1X1dSSVRFKE1JUElfVklERU9fTU9ERV9GT1JNQVQocGlwZSksCi0JCQkgICBpbnRlbF9kc2ktPnZpZGVvX21vZGVfZm9ybWF0KTsKKwkJCQlpbnRlbF9kc2ktPnZpZGVvX2ZybXRfY2ZnX2JpdHMgfAorCQkJCWludGVsX2RzaS0+dmlkZW9fbW9kZV9mb3JtYXQpOwogfQogCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuaAppbmRleCBjNzc2NWYzLi5iNGEyN2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuaApAQCAtMzksNiArMzksMTMgQEAKIHN0cnVjdCBpbnRlbF9kc2lfZGV2X29wcyB7CiAJYm9vbCAoKmluaXQpKHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlICpkc2kpOwogCisJdm9pZCAoKnBhbmVsX3Jlc2V0KShzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKTsKKworCXZvaWQgKCpkaXNhYmxlX3BhbmVsX3Bvd2VyKShzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKTsKKworCS8qIG9uZSB0aW1lIHByb2dyYW1tYWJsZSBjb21tYW5kcyBpZiBuZWVkZWQgKi8KKwl2b2lkICgqc2VuZF9vdHBfY21kcykoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSk7CisKIAkvKiBUaGlzIGNhbGxiYWNrIG11c3QgYmUgYWJsZSB0byBhc3N1bWUgRFNJIGNvbW1hbmRzIGNhbiBiZSBzZW50ICovCiAJdm9pZCAoKmVuYWJsZSkoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSk7CiAKQEAgLTg5LDYgKzk2LDIwIEBACiAKIAkvKiBlb3QgZm9yIE1JUElfRU9UX0RJU0FCTEUgcmVnaXN0ZXIgKi8KIAl1MzIgZW90X2Rpc2FibGU7CisKKwl1MzIgcG9ydF9iaXRzOworCXUzMiBid190aW1lcjsKKwl1MzIgZHBoeV9yZWc7CisJdTMyIHZpZGVvX2ZybXRfY2ZnX2JpdHM7CisJdTE2IGxwX2J5dGVfY2xrOworCisJLyogdGltZW91dHMgaW4gYnl0ZSBjbG9ja3MgKi8KKwl1MTYgbHBfcnhfdGltZW91dDsKKwl1MTYgdHVybl9hcm5kX3ZhbDsKKwl1MTYgcnN0X3RpbWVyX3ZhbDsKKwl1MTYgaHNfdG9fbHBfY291bnQ7CisJdTE2IGNsa19scF90b19oc19jb3VudDsKKwl1MTYgY2xrX2hzX3RvX2xwX2NvdW50OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZHNpICplbmNfdG9faW50ZWxfZHNpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaV9wbGwuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaV9wbGwuYwppbmRleCA0NDI3OWIyLi5iYTc5ZWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2lfcGxsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX3BsbC5jCkBAIC01MCw2ICs1MCw4IEBACiAJNzEsIDM1CQkJCQkJCS8qIDkxIC0gOTIgKi8KIH07CiAKKyNpZmRlZiBEU0lfQ0xLX0ZST01fUlIKKwogc3RhdGljIHUzMiBkc2lfcnJfZm9ybXVsYShjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCSAgaW50IHBpeGVsX2Zvcm1hdCwgaW50IHZpZGVvX21vZGVfZm9ybWF0LAogCQkJICBpbnQgbGFuZV9jb3VudCwgYm9vbCBlb3RwKQpAQCAtMTIxLDcgKzEyMyw3IEBACiAKIAkvKiB0aGUgZHNpIGNsb2NrIGlzIGRpdmlkZWQgYnkgMiBpbiB0aGUgaGFyZHdhcmUgdG8gZ2V0IGRzaSBkZHIgY2xvY2sgKi8KIAlkc2lfYml0X2Nsb2NrX2h6ID0gYnl0ZXNfcGVyX3hfZnJhbWVzX3hfbGFuZXMgKiA4OwotCWRzaV9jbGsgPSBkc2lfYml0X2Nsb2NrX2h6IC8gKDEwMDAgKiAxMDAwKTsKKwlkc2lfY2xrID0gZHNpX2JpdF9jbG9ja19oeiAvIDEwMDA7CiAKIAlpZiAoZW90cCAmJiB2aWRlb19tb2RlX2Zvcm1hdCA9PSBWSURFT19NT0RFX0JVUlNUKQogCQlkc2lfY2xrICo9IDI7CkBAIC0xMjksNjQgKzEzMSwzNyBAQAogCXJldHVybiBkc2lfY2xrOwogfQogCi0jaWZkZWYgTU5QX0ZST01fVEFCTEUKKyNlbHNlCiAKLXN0cnVjdCBkc2lfY2xvY2tfdGFibGUgewotCXUzMiBmcmVxOwotCXU4IG07Ci0JdTggcDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNpX2Nsb2NrX3RhYmxlIGRzaV9jbGtfdGJsW10gPSB7Ci0JezMwMCwgNzIsIDZ9LCB7MzEzLCA3NSwgNn0sIHszMjMsIDc4LCA2fSwgezMzMywgODAsIDZ9LAotCXszNDMsIDgyLCA2fSwgezM1MywgODUsIDZ9LCB7MzYzLCA4NywgNn0sIHszNzMsIDkwLCA2fSwKLQl7MzgzLCA5MiwgNn0sIHszOTAsIDc4LCA1fSwgezM5MywgNzksIDV9LCB7NDAwLCA4MCwgNX0sCi0JezQwMSwgODAsIDV9LCB7NDAyLCA4MCwgNX0sIHs0MDMsIDgxLCA1fSwgezQwNCwgODEsIDV9LAotCXs0MDUsIDgxLCA1fSwgezQwNiwgODEsIDV9LCB7NDA3LCA4MSwgNX0sIHs0MDgsIDgyLCA1fSwKLQl7NDA5LCA4MiwgNX0sIHs0MTAsIDgyLCA1fSwgezQxMSwgODIsIDV9LCB7NDEyLCA4MiwgNX0sCi0JezQxMywgODMsIDV9LCB7NDE0LCA4MywgNX0sIHs0MTUsIDgzLCA1fSwgezQxNiwgODMsIDV9LAotCXs0MTcsIDgzLCA1fSwgezQxOCwgODQsIDV9LCB7NDE5LCA4NCwgNX0sIHs0MjAsIDg0LCA1fSwKLQl7NDMwLCA4NiwgNX0sIHs0NDAsIDg4LCA1fSwgezQ1MCwgOTAsIDV9LCB7NDYwLCA5MiwgNX0sCi0JezQ3MCwgNzUsIDR9LCB7NDgwLCA3NywgNH0sIHs0OTAsIDc4LCA0fSwgezUwMCwgODAsIDR9LAotCXs1MTAsIDgyLCA0fSwgezUyMCwgODMsIDR9LCB7NTMwLCA4NSwgNH0sIHs1NDAsIDg2LCA0fSwKLQl7NTUwLCA4OCwgNH0sIHs1NjAsIDkwLCA0fSwgezU3MCwgOTEsIDR9LCB7NTgwLCA3MCwgM30sCi0JezU5MCwgNzEsIDN9LCB7NjAwLCA3MiwgM30sIHs2MTAsIDczLCAzfSwgezYyMCwgNzQsIDN9LAotCXs2MzAsIDc2LCAzfSwgezY0MCwgNzcsIDN9LCB7NjUwLCA3OCwgM30sIHs2NjAsIDc5LCAzfSwKLQl7NjcwLCA4MCwgM30sIHs2ODAsIDgyLCAzfSwgezY5MCwgODMsIDN9LCB7NzAwLCA4NCwgM30sCi0JezcxMCwgODUsIDN9LCB7NzIwLCA4NiwgM30sIHs3MzAsIDg4LCAzfSwgezc0MCwgODksIDN9LAotCXs3NTAsIDkwLCAzfSwgezc2MCwgOTEsIDN9LCB7NzcwLCA5MiwgM30sIHs3ODAsIDYyLCAyfSwKLQl7NzkwLCA2MywgMn0sIHs4MDAsIDY0LCAyfSwgezg4MCwgNzAsIDJ9LCB7OTAwLCA3MiwgMn0sCi0JezEwMDAsIDgwLCAyfSwJCS8qIGRzaSBjbG9jayBmcmVxdWVuY3kgaW4gTWh6Ki8KLX07Ci0KLXN0YXRpYyBpbnQgZHNpX2NhbGNfbW5wKHUzMiBkc2lfY2xrLCBzdHJ1Y3QgZHNpX21ucCAqZHNpX21ucCkKKy8qIEdldCBEU0kgY2xvY2sgZnJvbSBwaXhlbCBjbG9jayAqLworc3RhdGljIHUzMiBkc2lfY2xrX2Zyb21fcGNsayhjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgaW50IHBpeGVsX2Zvcm1hdCwgaW50IGxhbmVfY291bnQpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTggbTsKLQl1OCBuOwotCXU4IHA7Ci0JdTMyIG1fc2VlZDsKKwl1MzIgZHNpX2Nsa19raHo7CisJdTMyIGJwcDsKIAotCWlmIChkc2lfY2xrIDwgMzAwIHx8IGRzaV9jbGsgPiAxMDAwKQotCQlyZXR1cm4gLUVDSFJORzsKLQotCWZvciAoaSA9IDA7IGkgPD0gQVJSQVlfU0laRShkc2lfY2xrX3RibCk7IGkrKykgewotCQlpZiAoZHNpX2Nsa190YmxbaV0uZnJlcSA+IGRzaV9jbGspCi0JCQlicmVhazsKKwlzd2l0Y2ggKHBpeGVsX2Zvcm1hdCkgeworCWRlZmF1bHQ6CisJY2FzZSBWSURfTU9ERV9GT1JNQVRfUkdCODg4OgorCWNhc2UgVklEX01PREVfRk9STUFUX1JHQjY2Nl9MT09TRToKKwkJYnBwID0gMjQ7CisJCWJyZWFrOworCWNhc2UgVklEX01PREVfRk9STUFUX1JHQjY2NjoKKwkJYnBwID0gMTg7CisJCWJyZWFrOworCWNhc2UgVklEX01PREVfRk9STUFUX1JHQjU2NToKKwkJYnBwID0gMTY7CisJCWJyZWFrOwogCX0KIAotCW0gPSBkc2lfY2xrX3RibFtpXS5tOwotCXAgPSBkc2lfY2xrX3RibFtpXS5wOwotCW1fc2VlZCA9IGxmc3JfY29udmVydHNbbSAtIDYyXTsKLQluID0gMTsKLQlkc2lfbW5wLT5kc2lfcGxsX2N0cmwgPSAxIDw8IChEU0lfUExMX1AxX1BPU1RfRElWX1NISUZUICsgcCAtIDIpOwotCWRzaV9tbnAtPmRzaV9wbGxfZGl2ID0gKG4gLSAxKSA8PCBEU0lfUExMX04xX0RJVl9TSElGVCB8Ci0JCW1fc2VlZCA8PCBEU0lfUExMX00xX0RJVl9TSElGVDsKKwkvKiBEU0kgZGF0YSByYXRlID0gcGl4ZWwgY2xvY2sgKiBiaXRzIHBlciBwaXhlbCAvIGxhbmUgY291bnQKKwkgICBwaXhlbCBjbG9jayBpcyBjb252ZXJ0ZWQgZnJvbSBLSHogdG8gSHogKi8KKwlkc2lfY2xrX2toeiA9IERJVl9ST1VORF9DTE9TRVNUKG1vZGUtPmNsb2NrICogYnBwLCBsYW5lX2NvdW50KTsKIAotCXJldHVybiAwOworCXJldHVybiBkc2lfY2xrX2toejsKIH0KIAotI2Vsc2UKKyNlbmRpZgogCiBzdGF0aWMgaW50IGRzaV9jYWxjX21ucCh1MzIgZHNpX2Nsaywgc3RydWN0IGRzaV9tbnAgKmRzaV9tbnApCiB7CkBAIC0xOTQsMzYgKzE2OSw0NyBAQAogCXUzMiByZWZfY2xrOwogCXUzMiBlcnJvcjsKIAl1MzIgdG1wX2Vycm9yOwotCXUzMiB0YXJnZXRfZHNpX2NsazsKLQl1MzIgY2FsY19kc2lfY2xrOworCWludCB0YXJnZXRfZHNpX2NsazsKKwlpbnQgY2FsY19kc2lfY2xrOwogCXUzMiBjYWxjX207CiAJdTMyIGNhbGNfcDsKIAl1MzIgbV9zZWVkOwogCi0JaWYgKGRzaV9jbGsgPCAzMDAgfHwgZHNpX2NsayA+IDExNTApIHsKKwkvKiBkc2lfY2xrIGlzIGV4cGVjdGVkIGluIEtIWiAqLworCWlmIChkc2lfY2xrIDwgMzAwMDAwIHx8IGRzaV9jbGsgPiAxMTUwMDAwKSB7CiAJCURSTV9FUlJPUigiRFNJIENMSyBPdXQgb2YgUmFuZ2VcbiIpOwogCQlyZXR1cm4gLUVDSFJORzsKIAl9CiAKIAlyZWZfY2xrID0gMjUwMDA7Ci0JdGFyZ2V0X2RzaV9jbGsgPSBkc2lfY2xrICogMTAwMDsKKwl0YXJnZXRfZHNpX2NsayA9IGRzaV9jbGs7CiAJZXJyb3IgPSAweEZGRkZGRkZGOworCXRtcF9lcnJvciA9IDB4RkZGRkZGRkY7CiAJY2FsY19tID0gMDsKIAljYWxjX3AgPSAwOwogCiAJZm9yIChtID0gNjI7IG0gPD0gOTI7IG0rKykgewogCQlmb3IgKHAgPSAyOyBwIDw9IDY7IHArKykgewotCisJCQkvKiBGaW5kIHRoZSBvcHRpbWFsIG0gYW5kIHAgZGl2aXNvcnMKKwkJCXdpdGggbWluaW1hbCBlcnJvciArLy0gdGhlIHJlcXVpcmVkIGNsb2NrICovCiAJCQljYWxjX2RzaV9jbGsgPSAobSAqIHJlZl9jbGspIC8gcDsKLQkJCWlmIChjYWxjX2RzaV9jbGsgPj0gdGFyZ2V0X2RzaV9jbGspIHsKLQkJCQl0bXBfZXJyb3IgPSBjYWxjX2RzaV9jbGsgLSB0YXJnZXRfZHNpX2NsazsKLQkJCQlpZiAodG1wX2Vycm9yIDwgZXJyb3IpIHsKLQkJCQkJZXJyb3IgPSB0bXBfZXJyb3I7Ci0JCQkJCWNhbGNfbSA9IG07Ci0JCQkJCWNhbGNfcCA9IHA7Ci0JCQkJfQorCQkJaWYgKGNhbGNfZHNpX2NsayA9PSB0YXJnZXRfZHNpX2NsaykgeworCQkJCWNhbGNfbSA9IG07CisJCQkJY2FsY19wID0gcDsKKwkJCQllcnJvciA9IDA7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQl0bXBfZXJyb3IgPSBhYnModGFyZ2V0X2RzaV9jbGsgLSBjYWxjX2RzaV9jbGspOworCisJCQlpZiAodG1wX2Vycm9yIDwgZXJyb3IpIHsKKwkJCQllcnJvciA9IHRtcF9lcnJvcjsKKwkJCQljYWxjX20gPSBtOworCQkJCWNhbGNfcCA9IHA7CiAJCQl9CiAJCX0KKworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWJyZWFrOwogCX0KIAogCW1fc2VlZCA9IGxmc3JfY29udmVydHNbY2FsY19tIC0gNjJdOwpAQCAtMjM1LDggKzIyMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgotCiAvKgogICogWFhYOiBUaGUgbXV4aW5nIGFuZCBnYXRpbmcgaXMgaGFyZCBjb2RlZCBmb3Igbm93LiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvcgogICogc2hhcmluZyBQTExzIHdpdGggdHdvIERTSSBvdXRwdXRzLgpAQCAtMjUxLDkgKzIzNSw4IEBACiAJc3RydWN0IGRzaV9tbnAgZHNpX21ucDsKIAl1MzIgZHNpX2NsazsKIAotCWRzaV9jbGsgPSBkc2lfcnJfZm9ybXVsYShtb2RlLCBpbnRlbF9kc2ktPnBpeGVsX2Zvcm1hdCwKLQkJCQkgaW50ZWxfZHNpLT52aWRlb19tb2RlX2Zvcm1hdCwKLQkJCQkgaW50ZWxfZHNpLT5sYW5lX2NvdW50LCAhaW50ZWxfZHNpLT5lb3RfZGlzYWJsZSk7CisJZHNpX2NsayA9IGRzaV9jbGtfZnJvbV9wY2xrKG1vZGUsIGludGVsX2RzaS0+cGl4ZWxfZm9ybWF0LAorCQkJCQkJaW50ZWxfZHNpLT5sYW5lX2NvdW50KTsKIAogCXJldCA9IGRzaV9jYWxjX21ucChkc2lfY2xrLCAmZHNpX21ucCk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwppbmRleCAzYzc3MzY1Li5lZWZmOTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwpAQCAtMjM0LDggKzIzNCw5IEBACiAJaW50ZWxfbW9kZXNldF9jaGVja19zdGF0ZShjb25uZWN0b3ItPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfZHZvX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cworaW50ZWxfZHZvX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKIAlzdHJ1Y3QgaW50ZWxfZHZvICppbnRlbF9kdm8gPSBpbnRlbF9hdHRhY2hlZF9kdm8oY29ubmVjdG9yKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJkZXYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiZGV2LmMKaW5kZXggODk1ZmNiNC4uMzllYWM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJkZXYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYmRldi5jCkBAIC01NywxOCArNTcsMTQgQEAKIAkuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlLAogfTsKIAotc3RhdGljIGludCBpbnRlbGZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAotCQkJICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQorc3RhdGljIGludCBpbnRlbGZiX2FsbG9jKHN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIsCisJCQkgc3RydWN0IGRybV9mYl9oZWxwZXJfc3VyZmFjZV9zaXplICpzaXplcykKIHsKIAlzdHJ1Y3QgaW50ZWxfZmJkZXYgKmlmYmRldiA9CiAJCWNvbnRhaW5lcl9vZihoZWxwZXIsIHN0cnVjdCBpbnRlbF9mYmRldiwgaGVscGVyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGVscGVyLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKIAlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMiBtb2RlX2NtZCA9IHt9OwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OwogCWludCBzaXplLCByZXQ7CiAKIAkvKiB3ZSBkb24ndCBkbyBwYWNrZWQgMjRicHAgKi8KQEAgLTk0LDggKzkwLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCiAJLyogRmx1c2ggZXZlcnl0aGluZyBvdXQsIHdlJ2xsIGJlIGRvaW5nIEdUVCBvbmx5IGZyb20gbm93IG9uICovCiAJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIE5VTEwpOwogCWlmIChyZXQpIHsKQEAgLTEwMyw3ICs5Nyw1MCBAQAogCQlnb3RvIG91dF91bnJlZjsKIAl9CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2MoMCwgZGV2aWNlKTsKKwlyZXQgPSBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgJmlmYmRldi0+aWZiLCAmbW9kZV9jbWQsIG9iaik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5waW47CisKKwlyZXR1cm4gMDsKKworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworb3V0X3VucmVmOgorCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxmYl9jcmVhdGUoc3RydWN0IGRybV9mYl9oZWxwZXIgKmhlbHBlciwKKwkJCSAgc3RydWN0IGRybV9mYl9oZWxwZXJfc3VyZmFjZV9zaXplICpzaXplcykKK3sKKwlzdHJ1Y3QgaW50ZWxfZmJkZXYgKmlmYmRldiA9CisJCWNvbnRhaW5lcl9vZihoZWxwZXIsIHN0cnVjdCBpbnRlbF9mYmRldiwgaGVscGVyKTsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gJmlmYmRldi0+aWZiOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IHNpemUsIHJldDsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmICghaW50ZWxfZmItPm9iaikgeworCQlEUk1fREVCVUdfS01TKCJubyBCSU9TIGZiLCBhbGxvY2F0aW5nIGEgbmV3IG9uZVxuIik7CisJCXJldCA9IGludGVsZmJfYWxsb2MoaGVscGVyLCBzaXplcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIHsKKwkJRFJNX0RFQlVHX0tNUygicmUtdXNpbmcgQklPUyBmYlxuIik7CisJCXNpemVzLT5mYl93aWR0aCA9IGludGVsX2ZiLT5iYXNlLndpZHRoOworCQlzaXplcy0+ZmJfaGVpZ2h0ID0gaW50ZWxfZmItPmJhc2UuaGVpZ2h0OworCX0KKworCW9iaiA9IGludGVsX2ZiLT5vYmo7CisJc2l6ZSA9IG9iai0+YmFzZS5zaXplOworCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZkZXYtPnBkZXYtPmRldik7CiAJaWYgKCFpbmZvKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3VucGluOwpAQCAtMTExLDEwICsxNDgsNiBAQAogCiAJaW5mby0+cGFyID0gaGVscGVyOwogCi0JcmV0ID0gaW50ZWxfZnJhbWVidWZmZXJfaW5pdChkZXYsICZpZmJkZXYtPmlmYiwgJm1vZGVfY21kLCBvYmopOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VucGluOwotCiAJZmIgPSAmaWZiZGV2LT5pZmIuYmFzZTsKIAogCWlmYmRldi0+aGVscGVyLmZiID0gZmI7CkBAIC0xNzAsMTcgKzIwMywxNSBAQAogCQkgICAgICBmYi0+d2lkdGgsIGZiLT5oZWlnaHQsCiAJCSAgICAgIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopLCBvYmopOwogCi0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAl2Z2Ffc3dpdGNoZXJvb19jbGllbnRfZmJfc2V0KGRldi0+cGRldiwgaW5mbyk7CiAJcmV0dXJuIDA7CiAKIG91dF91bnBpbjoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLW91dF91bnJlZjoKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKK291dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci1vdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjk3LDggKzMyOCw2IEBACiAJZmJfc2V0X3N1c3BlbmQoaW5mbywgc3RhdGUpOwogfQogCi1NT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwotCiB2b2lkIGludGVsX2ZiZGV2X291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCmluZGV4IDAzZjljYTcuLjZkYjBkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTEzMCw5ICsxMzAsOSBAQAogCiBzdGF0aWMgdm9pZCBnNHhfd3JpdGVfaW5mb2ZyYW1lKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQllbnVtIGhkbWlfaW5mb2ZyYW1lX3R5cGUgdHlwZSwKLQkJCQljb25zdCB1aW50OF90ICpmcmFtZSwgc3NpemVfdCBsZW4pCisJCQkJY29uc3Qgdm9pZCAqZnJhbWUsIHNzaXplX3QgbGVuKQogewotCXVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopZnJhbWU7CisJY29uc3QgdWludDMyX3QgKmRhdGEgPSBmcmFtZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHZhbCA9IEk5MTVfUkVBRChWSURFT19ESVBfQ1RMKTsKQEAgLTE2Nyw5ICsxNjcsOSBAQAogCiBzdGF0aWMgdm9pZCBpYnhfd3JpdGVfaW5mb2ZyYW1lKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQllbnVtIGhkbWlfaW5mb2ZyYW1lX3R5cGUgdHlwZSwKLQkJCQljb25zdCB1aW50OF90ICpmcmFtZSwgc3NpemVfdCBsZW4pCisJCQkJY29uc3Qgdm9pZCAqZnJhbWUsIHNzaXplX3QgbGVuKQogewotCXVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopZnJhbWU7CisJY29uc3QgdWludDMyX3QgKmRhdGEgPSBmcmFtZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOwpAQCAtMjA1LDkgKzIwNSw5IEBACiAKIHN0YXRpYyB2b2lkIGNwdF93cml0ZV9pbmZvZnJhbWUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQkJCWVudW0gaGRtaV9pbmZvZnJhbWVfdHlwZSB0eXBlLAotCQkJCWNvbnN0IHVpbnQ4X3QgKmZyYW1lLCBzc2l6ZV90IGxlbikKKwkJCQljb25zdCB2b2lkICpmcmFtZSwgc3NpemVfdCBsZW4pCiB7Ci0JdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilmcmFtZTsKKwljb25zdCB1aW50MzJfdCAqZGF0YSA9IGZyYW1lOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CkBAIC0yNDYsOSArMjQ2LDkgQEAKIAogc3RhdGljIHZvaWQgdmx2X3dyaXRlX2luZm9mcmFtZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJZW51bSBoZG1pX2luZm9mcmFtZV90eXBlIHR5cGUsCi0JCQkJY29uc3QgdWludDhfdCAqZnJhbWUsIHNzaXplX3QgbGVuKQorCQkJCWNvbnN0IHZvaWQgKmZyYW1lLCBzc2l6ZV90IGxlbikKIHsKLQl1aW50MzJfdCAqZGF0YSA9ICh1aW50MzJfdCAqKWZyYW1lOworCWNvbnN0IHVpbnQzMl90ICpkYXRhID0gZnJhbWU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5jcnRjKTsKQEAgLTI4NCw5ICsyODQsOSBAQAogCiBzdGF0aWMgdm9pZCBoc3dfd3JpdGVfaW5mb2ZyYW1lKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQllbnVtIGhkbWlfaW5mb2ZyYW1lX3R5cGUgdHlwZSwKLQkJCQljb25zdCB1aW50OF90ICpmcmFtZSwgc3NpemVfdCBsZW4pCisJCQkJY29uc3Qgdm9pZCAqZnJhbWUsIHNzaXplX3QgbGVuKQogewotCXVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopZnJhbWU7CisJY29uc3QgdWludDMyX3QgKmRhdGEgPSBmcmFtZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOwpAQCAtODUzLDggKzg1Myw5IEBACiAJCXJldHVybiAyMjUwMDA7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfaGRtaV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQorc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzCitpbnRlbF9oZG1pX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJaWYgKG1vZGUtPmNsb2NrID4gaGRtaV9wb3J0Y2xvY2tfbGltaXQoaW50ZWxfYXR0YWNoZWRfaGRtaShjb25uZWN0b3IpKSkKIAkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKQEAgLTEwODEsNyArMTA4Miw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9CiAJCXRvX2ludGVsX2NydGMoZW5jb2Rlci0+YmFzZS5jcnRjKTsKLQlpbnQgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKKwllbnVtIGRwaW9fY2hhbm5lbCBwb3J0ID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAl1MzIgdmFsOwogCkBAIC0xMDkwLDQxICsxMDkxLDMzIEBACiAKIAkvKiBFbmFibGUgY2xvY2sgY2hhbm5lbHMgZm9yIHRoaXMgcG9ydCAqLwogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwotCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIERQSU9fREFUQV9MQU5FX0EocG9ydCkpOworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzgocG9ydCkpOwogCXZhbCA9IDA7CiAJaWYgKHBpcGUpCiAJCXZhbCB8PSAoMTw8MjEpOwogCWVsc2UKIAkJdmFsICY9IH4oMTw8MjEpOwogCXZhbCB8PSAweDAwMTAwMGM0OwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX0RBVEFfQ0hBTk5FTChwb3J0KSwgdmFsKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzgocG9ydCksIHZhbCk7CiAKIAkvKiBIRE1JIDEuMFYtMmRCICovCi0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfT0NBTElOSVQocG9ydCksIDApOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1RYX1NXSU5HX0NUTDQocG9ydCksCi0JCQkgMHgyYjI0NWY1Zik7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfU1dJTkdfQ1RMMihwb3J0KSwKLQkJCSAweDU1NzhiODNhKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9TV0lOR19DVEwzKHBvcnQpLAotCQkJIDB4MGM3ODIwNDApOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1RYM19TV0lOR19DVEw0KHBvcnQpLAotCQkJIDB4MmIyNDc4NzgpOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BDU19TVEFHR0VSMChwb3J0KSwgMHgwMDAzMDAwMCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NUTF9PVkVSMShwb3J0KSwKLQkJCSAweDAwMDAyMDAwKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9PQ0FMSU5JVChwb3J0KSwKLQkJCSBEUElPX1RYX09DQUxJTklUX0VOKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXNShwb3J0KSwgMCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9UWF9EVzQocG9ydCksIDB4MmIyNDVmNWYpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFcyKHBvcnQpLCAweDU1NzhiODNhKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMyhwb3J0KSwgMHgwYzc4MjA0MCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9UWDNfRFc0KHBvcnQpLCAweDJiMjQ3ODc4KTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzExKHBvcnQpLCAweDAwMDMwMDAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzkocG9ydCksIDB4MDAwMDIwMDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFc1KHBvcnQpLCBEUElPX1RYX09DQUxJTklUX0VOKTsKIAogCS8qIFByb2dyYW0gbGFuZSBjbG9jayAqLwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BDU19DTE9DS0JVRjAocG9ydCksCi0JCQkgMHgwMDc2MDAxOCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NMT0NLQlVGOChwb3J0KSwKLQkJCSAweDAwNDAwODg4KTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzE0KHBvcnQpLCAweDAwNzYwMDE4KTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzIzKHBvcnQpLCAweDAwNDAwODg4KTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCiAJaW50ZWxfZW5hYmxlX2hkbWkoZW5jb2Rlcik7CiAKLQl2bHZfd2FpdF9wb3J0X3JlYWR5KGRldl9wcml2LCBwb3J0KTsKKwl2bHZfd2FpdF9wb3J0X3JlYWR5KGRldl9wcml2LCBkcG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZsdl9oZG1pX3ByZV9wbGxfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTEzNCw3ICsxMTI3LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0KIAkJdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOwotCWludCBwb3J0ID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOworCWVudW0gZHBpb19jaGFubmVsIHBvcnQgPSB2bHZfZHBvcnRfdG9fY2hhbm5lbChkcG9ydCk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCiAJaWYgKCFJU19WQUxMRVlWSUVXKGRldikpCkBAIC0xMTQyLDI0ICsxMTM1LDIyIEBACiAKIAkvKiBQcm9ncmFtIFR4IGxhbmUgcmVzZXRzIHRvIGRlZmF1bHQgKi8KIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19QQ1NfVFgocG9ydCksCisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFcwKHBvcnQpLAogCQkJIERQSU9fUENTX1RYX0xBTkUyX1JFU0VUIHwKIAkJCSBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX0NMSyhwb3J0KSwKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDU19EVzEocG9ydCksCiAJCQkgRFBJT19QQ1NfQ0xLX0NSSV9SWEVCX0VJT1NfRU4gfAogCQkJIERQSU9fUENTX0NMS19DUklfUlhESUdGSUxUU0dfRU4gfAogCQkJICgxPDxEUElPX1BDU19DTEtfREFUQVdJRFRIX1NISUZUKSB8CiAJCQkgRFBJT19QQ1NfQ0xLX1NPRlRfUkVTRVQpOwogCiAJLyogRml4IHVwIGludGVyLXBhaXIgc2tldyBmYWlsdXJlICovCi0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fUENTX1NUQUdHRVIxKHBvcnQpLCAweDAwNzUwZjAwKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19UWF9DVEwocG9ydCksIDB4MDAwMDE1MDApOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1RYX0xBTkUocG9ydCksIDB4NDA0MDAwMDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTX0RXMTIocG9ydCksIDB4MDA3NTBmMDApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFcxMShwb3J0KSwgMHgwMDAwMTUwMCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9UWF9EVzE0KHBvcnQpLCAweDQwNDAwMDAwKTsKIAotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BDU19DVExfT1ZFUjEocG9ydCksCi0JCQkgMHgwMDAwMjAwMCk7Ci0Jdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIERQSU9fVFhfT0NBTElOSVQocG9ydCksCi0JCQkgRFBJT19UWF9PQ0FMSU5JVF9FTik7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFc5KHBvcnQpLCAweDAwMDAyMDAwKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXNShwb3J0KSwgRFBJT19UWF9PQ0FMSU5JVF9FTik7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIApAQCAtMTE2OSwxMyArMTE2MCwxMyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9CiAJCXRvX2ludGVsX2NydGMoZW5jb2Rlci0+YmFzZS5jcnRjKTsKLQlpbnQgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKKwllbnVtIGRwaW9fY2hhbm5lbCBwb3J0ID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAogCS8qIFJlc2V0IGxhbmVzIHRvIGF2b2lkIEhETUkgZmxpY2tlciAoVkxWIHcvYSkgKi8KIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKLQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgRFBJT19QQ1NfVFgocG9ydCksIDB4MDAwMDAwMDApOwotCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBEUElPX1BDU19DTEsocG9ydCksIDB4MDBlMDAwNjApOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTX0RXMChwb3J0KSwgMHgwMDAwMDAwMCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFcxKHBvcnQpLCAweDAwZTAwMDYwKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCmluZGV4IDJjYTE3YjEuLmIxZGMzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCkBAIC04MiwyMCArODIsMTEgQEAKIAogc3RhdGljIHZvaWQgZ21idXNfc2V0X2ZyZXEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewotCWludCB2Y29fZnJlcVtdID0geyA4MDAsIDE2MDAsIDIwMDAsIDI0MDAgfTsKLQlpbnQgZ21idXNfZnJlcSA9IDAsIGNkY2xrX2RpdiwgaHBsbF9mcmVxOworCWludCB2Y28sIGdtYnVzX2ZyZXEgPSAwLCBjZGNsa19kaXY7CiAKIAlCVUdfT04oIUlTX1ZBTExFWVZJRVcoZGV2X3ByaXYtPmRldikpOwogCi0JLyogU2tpcCBzZXR0aW5nIHRoZSBnbWJ1cyBmcmVxIGlmIEJJT1MgaGFzIGFscmVhZHkgcHJvZ3JhbW1lZCBpdCAqLwotCWlmIChJOTE1X1JFQUQoR01CVVNGUkVRX1ZMVikgIT0gMHhBMCkKLQkJcmV0dXJuOwotCi0JLyogT2J0YWluIFNLVSBpbmZvcm1hdGlvbiAqLwotCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwotCWhwbGxfZnJlcSA9Ci0JCXZsdl9jY2tfcmVhZChkZXZfcHJpdiwgQ0NLX0ZVU0VfUkVHKSAmIENDS19GVVNFX0hQTExfRlJFUV9NQVNLOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisJdmNvID0gdmFsbGV5dmlld19nZXRfdmNvKGRldl9wcml2KTsKIAogCS8qIEdldCB0aGUgQ0RDTEsgZGl2aWRlIHJhdGlvICovCiAJY2RjbGtfZGl2ID0gZ2V0X2Rpc3BfY2xrX2RpdihkZXZfcHJpdiwgQ0RDTEspOwpAQCAtMTA2LDcgKzk3LDcgQEAKIAkgKiBpbiBmYWN0IDFNSHogaXMgdGhlIGNvcnJlY3QgZnJlcXVlbmN5LgogCSAqLwogCWlmIChjZGNsa19kaXYpCi0JCWdtYnVzX2ZyZXEgPSAodmNvX2ZyZXFbaHBsbF9mcmVxXSA8PCAxKSAvIGNkY2xrX2RpdjsKKwkJZ21idXNfZnJlcSA9ICh2Y28gPDwgMSkgLyBjZGNsa19kaXY7CiAKIAlpZiAoV0FSTl9PTihnbWJ1c19mcmVxID09IDApKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggYzNiNGRhNy4uOGJjYjkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtMjU2LDggKzI1Niw5IEBACiAJUE9TVElOR19SRUFEKGx2ZHNfZW5jb2Rlci0+cmVnKTsKIH0KIAotc3RhdGljIGludCBpbnRlbF9sdmRzX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCitzdGF0aWMgZW51bSBkcm1fbW9kZV9zdGF0dXMKK2ludGVsX2x2ZHNfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKIAlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IgPSB0b19pbnRlbF9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSA9IGludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZml4ZWRfbW9kZTsKQEAgLTQ0Niw5ICs0NDcsMTkgQEAKIAlpZiAoZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZSA9PSBNT0RFU0VUX0RPTkUpCiAJCWdvdG8gZXhpdDsKIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0JaW50ZWxfbW9kZXNldF9zZXR1cF9od19zdGF0ZShkZXYsIHRydWUpOwotCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKKwkvKgorCSAqIFNvbWUgb2xkIHBsYXRmb3JtJ3MgQklPUyBsb3ZlIHRvIHdyZWFrIGhhdm9jIHdoaWxlIHRoZSBsaWQgaXMgY2xvc2VkLgorCSAqIFdlIHRyeSB0byBkZXRlY3QgdGhpcyBoZXJlIGFuZCB1bmRvIGFueSBkYW1hZ2UuIFRoZSBzcGxpdCBmb3IgUENICisJICogcGxhdGZvcm1zIGlzIHJhdGhlciBjb25zZXJ2YXRpdmUgYW5kIGEgYml0IGFyYml0cmFyeSBleHBlY3QgdGhhdCBvbgorCSAqIHRob3NlIHBsYXRmb3JtcyBWR0EgZGlzYWJsaW5nIHJlcXVpcmVzIGFjdHVhbCBsZWdhY3kgVkdBIEkvTyBhY2Nlc3MsCisJICogYW5kIGFzIHBhcnQgb2YgdGhlIGNsZWFudXAgaW4gdGhlIGh3IHN0YXRlIHJlc3RvcmUgd2UgYWxzbyByZWRpc2FibGUKKwkgKiB0aGUgdmdhIHBsYW5lLgorCSAqLworCWlmICghSEFTX1BDSF9TUExJVChkZXYpKSB7CisJCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CisJCWludGVsX21vZGVzZXRfc2V0dXBfaHdfc3RhdGUoZGV2LCB0cnVlKTsKKwkJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOworCX0KIAogCWRldl9wcml2LT5tb2Rlc2V0X3Jlc3RvcmUgPSBNT0RFU0VUX0RPTkU7CiAKQEAgLTc0NCw1NyArNzU1LDYgQEAKIAl7IH0JLyogdGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKLS8qKgotICogaW50ZWxfZmluZF9sdmRzX2Rvd25jbG9jayAtIGZpbmQgdGhlIHJlZHVjZWQgZG93bmNsb2NrIGZvciBMVkRTIGluIEVESUQKLSAqIEBkZXY6IGRybSBkZXZpY2UKLSAqIEBjb25uZWN0b3I6IExWRFMgY29ubmVjdG9yCi0gKgotICogRmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMgaW4gRURJRC4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxfZmluZF9sdmRzX2Rvd25jbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlLAotCQkJCSAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2NhbjsKLQlpbnQgdGVtcF9kb3duY2xvY2s7Ci0KLQl0ZW1wX2Rvd25jbG9jayA9IGZpeGVkX21vZGUtPmNsb2NrOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NhbiwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7Ci0JCS8qCi0JCSAqIElmIG9uZSBtb2RlIGhhcyB0aGUgc2FtZSByZXNvbHV0aW9uIHdpdGggdGhlIGZpeGVkX3BhbmVsCi0JCSAqIG1vZGUgd2hpbGUgdGhleSBoYXZlIHRoZSBkaWZmZXJlbnQgcmVmcmVzaCByYXRlLCBpdCBtZWFucwotCQkgKiB0aGF0IHRoZSByZWR1Y2VkIGRvd25jbG9jayBpcyBmb3VuZCBmb3IgdGhlIExWRFMuIEluIHN1Y2gKLQkJICogY2FzZSB3ZSBjYW4gc2V0IHRoZSBkaWZmZXJlbnQgRlB4MC8xIHRvIGR5bmFtaWNhbGx5IHNlbGVjdAotCQkgKiBiZXR3ZWVuIGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kuCi0JCSAqLwotCQlpZiAoc2Nhbi0+aGRpc3BsYXkgPT0gZml4ZWRfbW9kZS0+aGRpc3BsYXkgJiYKLQkJICAgIHNjYW4tPmhzeW5jX3N0YXJ0ID09IGZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICYmCi0JCSAgICBzY2FuLT5oc3luY19lbmQgPT0gZml4ZWRfbW9kZS0+aHN5bmNfZW5kICYmCi0JCSAgICBzY2FuLT5odG90YWwgPT0gZml4ZWRfbW9kZS0+aHRvdGFsICYmCi0JCSAgICBzY2FuLT52ZGlzcGxheSA9PSBmaXhlZF9tb2RlLT52ZGlzcGxheSAmJgotCQkgICAgc2Nhbi0+dnN5bmNfc3RhcnQgPT0gZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQgJiYKLQkJICAgIHNjYW4tPnZzeW5jX2VuZCA9PSBmaXhlZF9tb2RlLT52c3luY19lbmQgJiYKLQkJICAgIHNjYW4tPnZ0b3RhbCA9PSBmaXhlZF9tb2RlLT52dG90YWwpIHsKLQkJCWlmIChzY2FuLT5jbG9jayA8IHRlbXBfZG93bmNsb2NrKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgZG93bmNsb2NrIGlzIGFscmVhZHkgZm91bmQuIEJ1dCB3ZQotCQkJCSAqIGV4cGVjdCB0byBmaW5kIHRoZSBsb3dlciBkb3duY2xvY2suCi0JCQkJICovCi0JCQkJdGVtcF9kb3duY2xvY2sgPSBzY2FuLT5jbG9jazsKLQkJCX0KLQkJfQotCX0KLQlpZiAodGVtcF9kb3duY2xvY2sgPCBmaXhlZF9tb2RlLT5jbG9jayAmJiBpOTE1X2x2ZHNfZG93bmNsb2NrKSB7Ci0JCS8qIFdlIGZvdW5kIHRoZSBkb3duY2xvY2sgZm9yIExWRFMuICovCi0JCWRldl9wcml2LT5sdmRzX2Rvd25jbG9ja19hdmFpbCA9IDE7Ci0JCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayA9IHRlbXBfZG93bmNsb2NrOwotCQlEUk1fREVCVUdfS01TKCJMVkRTIGRvd25jbG9jayBpcyBmb3VuZCBpbiBFRElELiAiCi0JCQkgICAgICAiTm9ybWFsIGNsb2NrICVkS2h6LCBkb3duY2xvY2sgJWRLaHpcbiIsCi0JCQkgICAgICBmaXhlZF9tb2RlLT5jbG9jaywgdGVtcF9kb3duY2xvY2spOwotCX0KLX0KLQogLyoKICAqIEVudW1lcmF0ZSB0aGUgY2hpbGQgZGV2IGFycmF5IHBhcnNlZCBmcm9tIFZCVCB0byBjaGVjayB3aGV0aGVyCiAgKiB0aGUgTFZEUyBpcyBwcmVzZW50LgpAQCAtMTA3Miw4ICsxMDMyLDIyIEBACiAKIAkJCWZpeGVkX21vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBzY2FuKTsKIAkJCWlmIChmaXhlZF9tb2RlKSB7Ci0JCQkJaW50ZWxfZmluZF9sdmRzX2Rvd25jbG9jayhkZXYsIGZpeGVkX21vZGUsCi0JCQkJCQkJICBjb25uZWN0b3IpOworCQkJCWludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZG93bmNsb2NrX21vZGUgPQorCQkJCQlpbnRlbF9maW5kX3BhbmVsX2Rvd25jbG9jayhkZXYsCisJCQkJCWZpeGVkX21vZGUsIGNvbm5lY3Rvcik7CisJCQkJaWYgKGludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZG93bmNsb2NrX21vZGUgIT0KKwkJCQkJTlVMTCAmJglpOTE1X2x2ZHNfZG93bmNsb2NrKSB7CisJCQkJCS8qIFdlIGZvdW5kIHRoZSBkb3duY2xvY2sgZm9yIExWRFMuICovCisJCQkJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9ja19hdmFpbCA9IHRydWU7CisJCQkJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayA9CisJCQkJCQlpbnRlbF9jb25uZWN0b3ItPnBhbmVsLgorCQkJCQkJZG93bmNsb2NrX21vZGUtPmNsb2NrOworCQkJCQlEUk1fREVCVUdfS01TKCJMVkRTIGRvd25jbG9jayBpcyBmb3VuZCIKKwkJCQkJIiBpbiBFRElELiBOb3JtYWwgY2xvY2sgJWRLaHosICIKKwkJCQkJImRvd25jbG9jayAlZEtoelxuIiwKKwkJCQkJZml4ZWRfbW9kZS0+Y2xvY2ssCisJCQkJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayk7CisJCQkJfQogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYwppbmRleCA5YTg4MDRiLi40ZTk2MGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAl1OCBkcml2ZXJfdmVyWzE2XTsKIAl1MzIgbWJveGVzOwogCXU4IHJlc2VydmVkWzE2NF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogT3BSZWdpb24gbWFpbGJveCAjMTogcHVibGljIEFDUEkgbWV0aG9kcyAqLwogc3RydWN0IG9wcmVnaW9uX2FjcGkgewpAQCAtODUsNyArODUsNyBAQAogCXUzMiBjbm90OyAgICAgICAvKiBjdXJyZW50IE9TIG5vdGlmaWNhdGlvbiAqLwogCXUzMiBucmR5OyAgICAgICAvKiBkcml2ZXIgc3RhdHVzICovCiAJdTggcnN2ZDJbNjBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE9wUmVnaW9uIG1haWxib3ggIzI6IFNXU0NJICovCiBzdHJ1Y3Qgb3ByZWdpb25fc3dzY2kgewpAQCAtOTMsNyArOTMsNyBAQAogCXUzMiBwYXJtOyAgICAgICAvKiBjb21tYW5kIHBhcmFtZXRlcnMgKi8KIAl1MzIgZHNscDsgICAgICAgLyogZHJpdmVyIHNsZWVwIHRpbWUtb3V0ICovCiAJdTggcnN2ZFsyNDRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE9wUmVnaW9uIG1haWxib3ggIzM6IEFTTEUgKi8KIHN0cnVjdCBvcHJlZ2lvbl9hc2xlIHsKQEAgLTExNCw3ICsxMTQsNyBAQAogCXUzMiBzcm90OyAgICAgICAvKiBzdXBwb3J0ZWQgcm90YXRpb24gYW5nbGVzICovCiAJdTMyIGl1ZXI7ICAgICAgIC8qIElVRVIgZXZlbnRzICovCiAJdTggcnN2ZFs4Nl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogRHJpdmVyIHJlYWRpbmVzcyBpbmRpY2F0b3IgKi8KICNkZWZpbmUgQVNMRV9BUkRZX1JFQURZCQkoMSA8PCAwKQpAQCAtMzk1LDEzICszOTUsOCBAQAogc3RhdGljIHUzMiBhc2xlX3NldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGJjbHApCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IgPSBOVUxMOwotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5waXBlX3RvX2NydGNfbWFwcGluZ1swXTsKKwlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3I7CiAJc3RydWN0IG9wcmVnaW9uX2FzbGUgX19pb21lbSAqYXNsZSA9IGRldl9wcml2LT5vcHJlZ2lvbi5hc2xlOwotCXUzMiByZXQgPSAwOwotCWJvb2wgZm91bmQgPSBmYWxzZTsKIAogCURSTV9ERUJVR19EUklWRVIoImJjbHAgPSAweCUwOHhcbiIsIGJjbHApOwogCkBAIC00MTMsMzggKzQwOCwyMCBAQAogCQlyZXR1cm4gQVNMQ19CQUNLTElHSFRfRkFJTEVEOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKIAkvKgotCSAqIENvdWxkIG1hdGNoIHRoZSBPcFJlZ2lvbiBjb25uZWN0b3IgaGVyZSBpbnN0ZWFkLCBidXQgd2UnZCBhbHNvIG5lZWQKLQkgKiB0byB2ZXJpZnkgdGhlIGNvbm5lY3RvciBjb3VsZCBoYW5kbGUgYSBiYWNrbGlnaHQgY2FsbC4KKwkgKiBVcGRhdGUgYmFja2xpZ2h0IG9uIGFsbCBjb25uZWN0b3JzIHRoYXQgc3VwcG9ydCBiYWNrbGlnaHQgKHVzdWFsbHkKKwkgKiBvbmx5IG9uZSkuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpCi0JCWlmIChlbmNvZGVyLT5jcnRjID09IGNydGMpIHsKLQkJCWZvdW5kID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAoIWZvdW5kKSB7Ci0JCXJldCA9IEFTTENfQkFDS0xJR0hUX0ZBSUxFRDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQotCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIpCi0JCQlpbnRlbF9jb25uZWN0b3IgPSB0b19pbnRlbF9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQotCWlmICghaW50ZWxfY29ubmVjdG9yKSB7Ci0JCXJldCA9IEFTTENfQkFDS0xJR0hUX0ZBSUxFRDsKLQkJZ290byBvdXQ7Ci0JfQotCiAJRFJNX0RFQlVHX0tNUygidXBkYXRpbmcgb3ByZWdpb24gYmFja2xpZ2h0ICVkLzI1NVxuIiwgYmNscCk7Ci0JaW50ZWxfcGFuZWxfc2V0X2JhY2tsaWdodChpbnRlbF9jb25uZWN0b3IsIGJjbHAsIDI1NSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlbF9jb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBiYXNlLmhlYWQpCisJCWludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoaW50ZWxfY29ubmVjdG9yLCBiY2xwLCAyNTUpOwogCWlvd3JpdGUzMihESVZfUk9VTkRfVVAoYmNscCAqIDEwMCwgMjU1KSB8IEFTTEVfQ0JMVl9WQUxJRCwgJmFzbGUtPmNibHYpOwogCi1vdXQ6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIAotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHUzMiBhc2xlX3NldF9hbHNfaWxsdW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGFsc2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKaW5kZXggYTk4YTk5MC4uYTc1OWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAl1MzIgIHBmaXRfY29udHJvbDsKIAogCS8qIGk4MzAgZG9lc24ndCBoYXZlIGEgcGFuZWwgZml0dGVyICovCi0JaWYgKElTX0k4MzAoZGV2KSkKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPD0gMyAmJiAoSVNfSTgzMChkZXYpIHx8ICFJU19NT0JJTEUoZGV2KSkpCiAJCXJldHVybiAtMTsKIAogCXBmaXRfY29udHJvbCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKaW5kZXggZTZmNzgyZC4uMzUwZGUzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCkBAIC0zMjUsOTcgKzMyNSw2IEBACiAJcGlwZV9jb25maWctPmdtY2hfcGZpdC5sdmRzX2JvcmRlcl9iaXRzID0gYm9yZGVyOwogfQogCi1zdGF0aWMgaW50IGlzX2JhY2tsaWdodF9jb21iaW5hdGlvbl9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChJU19HRU40KGRldikpCi0JCXJldHVybiBJOTE1X1JFQUQoQkxDX1BXTV9DVEwyKSAmIEJMTV9DT01CSU5BVElPTl9NT0RFOwotCi0JaWYgKElTX0dFTjIoZGV2KSkKLQkJcmV0dXJuIEk5MTVfUkVBRChCTENfUFdNX0NUTCkgJiBCTE1fTEVHQUNZX01PREU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogWFhYOiBxdWVyeSBtb2RlIGNsb2NrIG9yIGhhcmR3YXJlIGNsb2NrIGFuZCBwcm9ncmFtIG1heCBQV00gYXBwcm9wcmlhdGVseQotICogd2hlbiBpdCdzIDAuCi0gKi8KLXN0YXRpYyB1MzIgaTkxNV9yZWFkX2JsY19wd21fY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdTMyIHZhbDsKLQotCVdBUk5fT05fU01QKCFzcGluX2lzX2xvY2tlZCgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBDVEwgdmFsdWUgaWYgaXQgbG9zdCwgZS5nLiBHUFUgcmVzZXQgKi8KLQotCWlmIChIQVNfUENIX1NQTElUKGRldl9wcml2LT5kZXYpKSB7Ci0JCXZhbCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwyKTsKLQkJaWYgKGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIgPT0gMCkgewotCQkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMiA9IHZhbDsKLQkJfSBlbHNlIGlmICh2YWwgPT0gMCkgewotCQkJdmFsID0gZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMjsKLQkJCUk5MTVfV1JJVEUoQkxDX1BXTV9QQ0hfQ1RMMiwgdmFsKTsKLQkJfQotCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0JCXZhbCA9IEk5MTVfUkVBRChWTFZfQkxDX1BXTV9DVEwocGlwZSkpOwotCQlpZiAoZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMID09IDApIHsKLQkJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTCA9IHZhbDsKLQkJCWRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDIgPQotCQkJCUk5MTVfUkVBRChWTFZfQkxDX1BXTV9DVEwyKHBpcGUpKTsKLQkJfSBlbHNlIGlmICh2YWwgPT0gMCkgewotCQkJdmFsID0gZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMOwotCQkJSTkxNV9XUklURShWTFZfQkxDX1BXTV9DVEwocGlwZSksIHZhbCk7Ci0JCQlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTDIocGlwZSksCi0JCQkJICAgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMik7Ci0JCX0KLQotCQlpZiAoIXZhbCkKLQkJCXZhbCA9IDB4MGY0MmZmZmY7Ci0JfSBlbHNlIHsKLQkJdmFsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKLQkJaWYgKGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTCA9PSAwKSB7Ci0JCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwgPSB2YWw7Ci0JCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKLQkJCQlkZXZfcHJpdi0+cmVnZmlsZS5zYXZlQkxDX1BXTV9DVEwyID0KLQkJCQkJSTkxNV9SRUFEKEJMQ19QV01fQ1RMMik7Ci0JCX0gZWxzZSBpZiAodmFsID09IDApIHsKLQkJCXZhbCA9IGRldl9wcml2LT5yZWdmaWxlLnNhdmVCTENfUFdNX0NUTDsKLQkJCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsIHZhbCk7Ci0JCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKLQkJCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwKLQkJCQkJICAgZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUJMQ19QV01fQ1RMMik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdTMyIGludGVsX3BhbmVsX2dldF9tYXhfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSBlbnVtIHBpcGUgcGlwZSkKLXsKLQl1MzIgbWF4OwotCi0JbWF4ID0gaTkxNV9yZWFkX2JsY19wd21fY3RsKGRldiwgcGlwZSk7Ci0KLQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7Ci0JCW1heCA+Pj0gMTY7Ci0JfSBlbHNlIHsKLQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKLQkJCW1heCA+Pj0gMTc7Ci0JCWVsc2UKLQkJCW1heCA+Pj0gMTY7Ci0KLQkJaWYgKGlzX2JhY2tsaWdodF9jb21iaW5hdGlvbl9tb2RlKGRldikpCi0JCQltYXggKj0gMHhmZjsKLQl9Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJtYXggYmFja2xpZ2h0IFBXTSA9ICVkXG4iLCBtYXgpOwotCi0JcmV0dXJuIG1heDsKLX0KLQogc3RhdGljIGludCBpOTE1X3BhbmVsX2ludmVydF9icmlnaHRuZXNzOwogTU9EVUxFX1BBUk1fREVTQyhpbnZlcnRfYnJpZ2h0bmVzcywgIkludmVydCBiYWNrbGlnaHQgYnJpZ2h0bmVzcyAiCiAJIigtMSBmb3JjZSBub3JtYWwsIDAgbWFjaGluZSBkZWZhdWx0cywgMSBmb3JjZSBpbnZlcnNpb24pLCBwbGVhc2UgIgpAQCAtNDIzLDExNiArMzMyLDE2MyBAQAogCSJ0byBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnLCBpZiB5b3VyIG1hY2hpbmUgbmVlZHMgaXQuICIKIAkiSXQgd2lsbCB0aGVuIGJlIGluY2x1ZGVkIGluIGFuIHVwY29taW5nIG1vZHVsZSB2ZXJzaW9uLiIpOwogbW9kdWxlX3BhcmFtX25hbWVkKGludmVydF9icmlnaHRuZXNzLCBpOTE1X3BhbmVsX2ludmVydF9icmlnaHRuZXNzLCBpbnQsIDA2MDApOwotc3RhdGljIHUzMiBpbnRlbF9wYW5lbF9jb21wdXRlX2JyaWdodG5lc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJICBlbnVtIHBpcGUgcGlwZSwgdTMyIHZhbCkKK3N0YXRpYyB1MzIgaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICB1MzIgdmFsKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOworCisJV0FSTl9PTihwYW5lbC0+YmFja2xpZ2h0Lm1heCA9PSAwKTsKIAogCWlmIChpOTE1X3BhbmVsX2ludmVydF9icmlnaHRuZXNzIDwgMCkKIAkJcmV0dXJuIHZhbDsKIAogCWlmIChpOTE1X3BhbmVsX2ludmVydF9icmlnaHRuZXNzID4gMCB8fAogCSAgICBkZXZfcHJpdi0+cXVpcmtzICYgUVVJUktfSU5WRVJUX0JSSUdIVE5FU1MpIHsKLQkJdTMyIG1heCA9IGludGVsX3BhbmVsX2dldF9tYXhfYmFja2xpZ2h0KGRldiwgcGlwZSk7Ci0JCWlmIChtYXgpCi0JCQlyZXR1cm4gbWF4IC0gdmFsOworCQlyZXR1cm4gcGFuZWwtPmJhY2tsaWdodC5tYXggLSB2YWw7CiAJfQogCiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHUzMiBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICAgICBlbnVtIHBpcGUgcGlwZSkKK3N0YXRpYyB1MzIgYmR3X2dldF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDIpICYgQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKK30KKworc3RhdGljIHUzMiBwY2hfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Cit9CisKK3N0YXRpYyB1MzIgaTl4eF9nZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5lbDsKKwl1MzIgdmFsOworCisJdmFsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKKwkJdmFsID4+PSAxOworCisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSkgeworCQl1OCBsYnBjOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgUENJX0xCUEMsICZsYnBjKTsKKwkJdmFsICo9IGxicGM7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHUzMiBfdmx2X2dldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwaXBlIHBpcGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiBJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMKHBpcGUpKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Cit9CisKK3N0YXRpYyB1MzIgdmx2X2dldF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfZ2V0X3BpcGVfZnJvbV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCXJldHVybiBfdmx2X2dldF9iYWNrbGlnaHQoZGV2LCBwaXBlKTsKK30KKworc3RhdGljIHUzMiBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiB2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVnOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5iYWNrbGlnaHQubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+YmFja2xpZ2h0X2xvY2ssIGZsYWdzKTsKIAotCWlmIChJU19CUk9BRFdFTEwoZGV2KSkgewotCQl2YWwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMikgJiBCQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLOwotCX0gZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7Ci0JCXZhbCA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwpICYgQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKLQl9IGVsc2UgewotCQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQotCQkJcmVnID0gVkxWX0JMQ19QV01fQ1RMKHBpcGUpOwotCQllbHNlCi0JCQlyZWcgPSBCTENfUFdNX0NUTDsKKwl2YWwgPSBkZXZfcHJpdi0+ZGlzcGxheS5nZXRfYmFja2xpZ2h0KGNvbm5lY3Rvcik7CisJdmFsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGNvbm5lY3RvciwgdmFsKTsKIAotCQl2YWwgPSBJOTE1X1JFQUQocmVnKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Ci0JCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCi0JCQl2YWwgPj49IDE7Ci0KLQkJaWYgKGlzX2JhY2tsaWdodF9jb21iaW5hdGlvbl9tb2RlKGRldikpIHsKLQkJCXU4IGxicGM7Ci0KLQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgUENJX0xCUEMsICZsYnBjKTsKLQkJCXZhbCAqPSBsYnBjOwotCQl9Ci0JfQotCi0JdmFsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGRldiwgcGlwZSwgdmFsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHQubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOwogCiAJRFJNX0RFQlVHX0RSSVZFUigiZ2V0IGJhY2tsaWdodCBQV00gPSAlZFxuIiwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9iZHdfcGFuZWxfc2V0X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCitzdGF0aWMgdm9pZCBiZHdfc2V0X2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IsIHUzMiBsZXZlbCkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiB2YWwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMikgJiB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKIAlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIHZhbCB8IGxldmVsKTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfcGNoX3BhbmVsX3NldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQorc3RhdGljIHZvaWQgcGNoX3NldF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1MzIgbGV2ZWwpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgdmFsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1BVX0NUTCkgJiB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKLQlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTCwgdmFsIHwgbGV2ZWwpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBlbnVtIHBpcGUgcGlwZSwgdTMyIGxldmVsKQoteworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHRtcDsKLQlpbnQgcmVnOwogCi0JRFJNX0RFQlVHX0RSSVZFUigic2V0IGJhY2tsaWdodCBQV00gPSAlZFxuIiwgbGV2ZWwpOwotCWxldmVsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGRldiwgcGlwZSwgbGV2ZWwpOworCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwpICYgfkJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CisJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIHRtcCB8IGxldmVsKTsKK30KIAotCWlmIChJU19CUk9BRFdFTEwoZGV2KSkKLQkJcmV0dXJuIGludGVsX2Jkd19wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgbGV2ZWwpOwotCWVsc2UgaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJcmV0dXJuIGludGVsX3BjaF9wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgbGV2ZWwpOworc3RhdGljIHZvaWQgaTl4eF9zZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwgdTMyIGxldmVsKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOworCXUzMiB0bXAsIG1hc2s7CiAKLQlpZiAoaXNfYmFja2xpZ2h0X2NvbWJpbmF0aW9uX21vZGUoZGV2KSkgewotCQl1MzIgbWF4ID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2LCBwaXBlKTsKKwlXQVJOX09OKHBhbmVsLT5iYWNrbGlnaHQubWF4ID09IDApOworCisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSkgewogCQl1OCBsYnBjOwogCi0JCS8qIHdlJ3JlIHNjcmV3ZWQsIGJ1dCBrZWVwIGJlaGF2aW91ciBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCQlpZiAoIW1heCkKLQkJCW1heCA9IDE7Ci0KLQkJbGJwYyA9IGxldmVsICogMHhmZSAvIG1heCArIDE7CisJCWxicGMgPSBsZXZlbCAqIDB4ZmUgLyBwYW5lbC0+YmFja2xpZ2h0Lm1heCArIDE7CiAJCWxldmVsIC89IGxicGM7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYtPnBkZXYsIFBDSV9MQlBDLCBsYnBjKTsKIAl9CiAKLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQotCQlyZWcgPSBWTFZfQkxDX1BXTV9DVEwocGlwZSk7Ci0JZWxzZQotCQlyZWcgPSBCTENfUFdNX0NUTDsKLQotCXRtcCA9IEk5MTVfUkVBRChyZWcpOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCisJaWYgKElTX0dFTjQoZGV2KSkgeworCQltYXNrID0gQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKKwl9IGVsc2UgewogCQlsZXZlbCA8PD0gMTsKLQl0bXAgJj0gfkJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Ci0JSTkxNV9XUklURShyZWcsIHRtcCB8IGxldmVsKTsKKwkJbWFzayA9IEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0tfUE5WOworCX0KKworCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCkgJiB+bWFzazsKKwlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCB0bXAgfCBsZXZlbCk7Cit9CisKK3N0YXRpYyB2b2lkIHZsdl9zZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwgdTMyIGxldmVsKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9nZXRfcGlwZV9mcm9tX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXUzMiB0bXA7CisKKwl0bXAgPSBJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMKHBpcGUpKSAmIH5CQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLOworCUk5MTVfV1JJVEUoVkxWX0JMQ19QV01fQ1RMKHBpcGUpLCB0bXAgfCBsZXZlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwgdTMyIGxldmVsKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJzZXQgYmFja2xpZ2h0IFBXTSA9ICVkXG4iLCBsZXZlbCk7CisKKwlsZXZlbCA9IGludGVsX3BhbmVsX2NvbXB1dGVfYnJpZ2h0bmVzcyhjb25uZWN0b3IsIGxldmVsKTsKKwlkZXZfcHJpdi0+ZGlzcGxheS5zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgbGV2ZWwpOwogfQogCiAvKiBzZXQgYmFja2xpZ2h0IGJyaWdodG5lc3MgdG8gbGV2ZWwgaW4gcmFuZ2UgWzAuLm1heF0gKi8KQEAgLTU0MSw0NSArNDk3LDg5IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CiAJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9nZXRfcGlwZV9mcm9tX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCXUzMiBmcmVxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocGlwZSA9PSBJTlZBTElEX1BJUEUpCisJaWYgKCFwYW5lbC0+YmFja2xpZ2h0LnByZXNlbnQgfHwgcGlwZSA9PSBJTlZBTElEX1BJUEUpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmJhY2tsaWdodF9sb2NrLCBmbGFncyk7CiAKLQlmcmVxID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2LCBwaXBlKTsKLQlpZiAoIWZyZXEpIHsKLQkJLyogd2UgYXJlIHNjcmV3ZWQsIGJhaWwgb3V0ICovCi0JCWdvdG8gb3V0OwotCX0KKwlXQVJOX09OKHBhbmVsLT5iYWNrbGlnaHQubWF4ID09IDApOwogCi0JLyogc2NhbGUgdG8gaGFyZHdhcmUsIGJ1dCBiZSBjYXJlZnVsIHRvIG5vdCBvdmVyZmxvdyAqLworCS8qIHNjYWxlIHRvIGhhcmR3YXJlIG1heCwgYnV0IGJlIGNhcmVmdWwgdG8gbm90IG92ZXJmbG93ICovCisJZnJlcSA9IHBhbmVsLT5iYWNrbGlnaHQubWF4OwogCWlmIChmcmVxIDwgbWF4KQogCQlsZXZlbCA9IGxldmVsICogZnJlcSAvIG1heDsKIAllbHNlCiAJCWxldmVsID0gZnJlcSAvIG1heCAqIGxldmVsOwogCi0JZGV2X3ByaXYtPmJhY2tsaWdodC5sZXZlbCA9IGxldmVsOwotCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0LmRldmljZSkKLQkJZGV2X3ByaXYtPmJhY2tsaWdodC5kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSBsZXZlbDsKKwlwYW5lbC0+YmFja2xpZ2h0LmxldmVsID0gbGV2ZWw7CisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuZGV2aWNlKQorCQlwYW5lbC0+YmFja2xpZ2h0LmRldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9IGxldmVsOwogCi0JaWYgKGRldl9wcml2LT5iYWNrbGlnaHQuZW5hYmxlZCkKLQkJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChkZXYsIHBpcGUsIGxldmVsKTsKLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKKwlpZiAocGFuZWwtPmJhY2tsaWdodC5lbmFibGVkKQorCQlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgbGV2ZWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmJhY2tsaWdodF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9kaXNhYmxlX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgdG1wOworCisJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChjb25uZWN0b3IsIDApOworCisJdG1wID0gSTkxNV9SRUFEKEJMQ19QV01fQ1BVX0NUTDIpOworCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMMiwgdG1wICYgfkJMTV9QV01fRU5BQkxFKTsKKworCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKKwlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIHRtcCAmIH5CTE1fUENIX1BXTV9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBpOXh4X2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGk5NjVfZGlzYWJsZV9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHRtcDsKKworCWludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoY29ubmVjdG9yLCAwKTsKKworCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOworCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwyLCB0bXAgJiB+QkxNX1BXTV9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCB2bHZfZGlzYWJsZV9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9nZXRfcGlwZV9mcm9tX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXUzMiB0bXA7CisKKwlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgMCk7CisKKwl0bXAgPSBJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMMihwaXBlKSk7CisJSTkxNV9XUklURShWTFZfQkxDX1BXTV9DVEwyKHBpcGUpLCB0bXAgJiB+QkxNX1BXTV9FTkFCTEUpOwogfQogCiB2b2lkIGludGVsX3BhbmVsX2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5lbDsKIAllbnVtIHBpcGUgcGlwZSA9IGludGVsX2dldF9waXBlX2Zyb21fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChwaXBlID09IElOVkFMSURfUElQRSkKKwlpZiAoIXBhbmVsLT5iYWNrbGlnaHQucHJlc2VudCB8fCBwaXBlID09IElOVkFMSURfUElQRSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTU5MywxNTAgKzU5MywyMTUgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmJhY2tsaWdodF9sb2NrLCBmbGFncyk7CiAKLQlkZXZfcHJpdi0+YmFja2xpZ2h0LmVuYWJsZWQgPSBmYWxzZTsKLQlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGRldiwgcGlwZSwgMCk7CisJcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0gZmFsc2U7CisJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9iYWNrbGlnaHQoY29ubmVjdG9yKTsKIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7Ci0JCXVpbnQzMl90IHJlZywgdG1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOworfQogCi0JCWlmIChIQVNfUENIX1NQTElUKGRldikpCi0JCQlyZWcgPSBCTENfUFdNX0NQVV9DVEwyOwotCQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpCi0JCQlyZWcgPSBWTFZfQkxDX1BXTV9DVEwyKHBpcGUpOwotCQllbHNlCi0JCQlyZWcgPSBCTENfUFdNX0NUTDI7CitzdGF0aWMgdm9pZCBiZHdfZW5hYmxlX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisJdTMyIHBjaF9jdGwxLCBwY2hfY3RsMjsKIAotCQlJOTE1X1dSSVRFKHJlZywgSTkxNV9SRUFEKHJlZykgJiB+QkxNX1BXTV9FTkFCTEUpOwotCi0JCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKLQkJCXRtcCAmPSB+QkxNX1BDSF9QV01fRU5BQkxFOwotCQkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCB0bXApOwotCQl9CisJcGNoX2N0bDEgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CisJaWYgKHBjaF9jdGwxICYgQkxNX1BDSF9QV01fRU5BQkxFKSB7CisJCURSTV9ERUJVR19LTVMoInBjaCBiYWNrbGlnaHQgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJcGNoX2N0bDEgJj0gfkJMTV9QQ0hfUFdNX0VOQUJMRTsKKwkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBwY2hfY3RsMSk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrLCBmbGFncyk7CisJcGNoX2N0bDIgPSBwYW5lbC0+YmFja2xpZ2h0Lm1heCA8PCAxNjsKKwlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIHBjaF9jdGwyKTsKKworCXBjaF9jdGwxID0gMDsKKwlpZiAocGFuZWwtPmJhY2tsaWdodC5hY3RpdmVfbG93X3B3bSkKKwkJcGNoX2N0bDEgfD0gQkxNX1BDSF9QT0xBUklUWTsKKworCS8qIEJEVyBhbHdheXMgdXNlcyB0aGUgcGNoIHB3bSBjb250cm9scy4gKi8KKwlwY2hfY3RsMSB8PSBCTE1fUENIX09WRVJSSURFX0VOQUJMRTsKKworCUk5MTVfV1JJVEUoQkxDX1BXTV9QQ0hfQ1RMMSwgcGNoX2N0bDEpOworCVBPU1RJTkdfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKKwlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIHBjaF9jdGwxIHwgQkxNX1BDSF9QV01fRU5BQkxFKTsKKworCS8qIFRoaXMgd29uJ3Qgc3RpY2sgdW50aWwgdGhlIGFib3ZlIGVuYWJsZS4gKi8KKwlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgcGFuZWwtPmJhY2tsaWdodC5sZXZlbCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5lbDsKKwllbnVtIHBpcGUgcGlwZSA9IGludGVsX2dldF9waXBlX2Zyb21fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJZW51bSB0cmFuc2NvZGVyIGNwdV90cmFuc2NvZGVyID0KKwkJaW50ZWxfcGlwZV90b19jcHVfdHJhbnNjb2RlcihkZXZfcHJpdiwgcGlwZSk7CisJdTMyIGNwdV9jdGwyLCBwY2hfY3RsMSwgcGNoX2N0bDI7CisKKwljcHVfY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwyKTsKKwlpZiAoY3B1X2N0bDIgJiBCTE1fUFdNX0VOQUJMRSkgeworCQlXQVJOKDEsICJjcHUgYmFja2xpZ2h0IGFscmVhZHkgZW5hYmxlZFxuIik7CisJCWNwdV9jdGwyICY9IH5CTE1fUFdNX0VOQUJMRTsKKwkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwyLCBjcHVfY3RsMik7CisJfQorCisJcGNoX2N0bDEgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CisJaWYgKHBjaF9jdGwxICYgQkxNX1BDSF9QV01fRU5BQkxFKSB7CisJCURSTV9ERUJVR19LTVMoInBjaCBiYWNrbGlnaHQgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJcGNoX2N0bDEgJj0gfkJMTV9QQ0hfUFdNX0VOQUJMRTsKKwkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBwY2hfY3RsMSk7CisJfQorCisJaWYgKGNwdV90cmFuc2NvZGVyID09IFRSQU5TQ09ERVJfRURQKQorCQljcHVfY3RsMiA9IEJMTV9UUkFOU0NPREVSX0VEUDsKKwllbHNlCisJCWNwdV9jdGwyID0gQkxNX1BJUEUoY3B1X3RyYW5zY29kZXIpOworCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMMiwgY3B1X2N0bDIpOworCVBPU1RJTkdfUkVBRChCTENfUFdNX0NQVV9DVEwyKTsKKwlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTDIsIGNwdV9jdGwyIHwgQkxNX1BXTV9FTkFCTEUpOworCisJLyogVGhpcyB3b24ndCBzdGljayB1bnRpbCB0aGUgYWJvdmUgZW5hYmxlLiAqLworCWludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoY29ubmVjdG9yLCBwYW5lbC0+YmFja2xpZ2h0LmxldmVsKTsKKworCXBjaF9jdGwyID0gcGFuZWwtPmJhY2tsaWdodC5tYXggPDwgMTY7CisJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwyLCBwY2hfY3RsMik7CisKKwlwY2hfY3RsMSA9IDA7CisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuYWN0aXZlX2xvd19wd20pCisJCXBjaF9jdGwxIHw9IEJMTV9QQ0hfUE9MQVJJVFk7CisKKwlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIHBjaF9jdGwxKTsKKwlQT1NUSU5HX1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CisJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBwY2hfY3RsMSB8IEJMTV9QQ0hfUFdNX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5eHhfZW5hYmxlX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisJdTMyIGN0bCwgZnJlcTsKKworCWN0bCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7CisJaWYgKGN0bCAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0tfUE5WKSB7CisJCVdBUk4oMSwgImJhY2tsaWdodCBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCAwKTsKKwl9CisKKwlmcmVxID0gcGFuZWwtPmJhY2tsaWdodC5tYXg7CisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSkKKwkJZnJlcSAvPSAweGZmOworCisJY3RsID0gZnJlcSA8PCAxNzsKKwlpZiAoSVNfR0VOMihkZXYpICYmIHBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSkKKwkJY3RsIHw9IEJMTV9MRUdBQ1lfTU9ERTsKKwlpZiAoSVNfUElORVZJRVcoZGV2KSAmJiBwYW5lbC0+YmFja2xpZ2h0LmFjdGl2ZV9sb3dfcHdtKQorCQljdGwgfD0gQkxNX1BPTEFSSVRZX1BOVjsKKworCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsIGN0bCk7CisJUE9TVElOR19SRUFEKEJMQ19QV01fQ1RMKTsKKworCS8qIFhYWDogY29tYmluZSB0aGlzIGludG8gYWJvdmUgd3JpdGU/ICovCisJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChjb25uZWN0b3IsIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwpOworfQorCitzdGF0aWMgdm9pZCBpOTY1X2VuYWJsZV9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOworCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfZ2V0X3BpcGVfZnJvbV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwl1MzIgY3RsLCBjdGwyLCBmcmVxOworCisJY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOworCWlmIChjdGwyICYgQkxNX1BXTV9FTkFCTEUpIHsKKwkJV0FSTigxLCAiYmFja2xpZ2h0IGFscmVhZHkgZW5hYmxlZFxuIik7CisJCWN0bDIgJj0gfkJMTV9QV01fRU5BQkxFOworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwgY3RsMik7CisJfQorCisJZnJlcSA9IHBhbmVsLT5iYWNrbGlnaHQubWF4OworCWlmIChwYW5lbC0+YmFja2xpZ2h0LmNvbWJpbmF0aW9uX21vZGUpCisJCWZyZXEgLz0gMHhmZjsKKworCWN0bCA9IGZyZXEgPDwgMTY7CisJSTkxNV9XUklURShCTENfUFdNX0NUTCwgY3RsKTsKKworCS8qIFhYWDogY29tYmluZSB0aGlzIGludG8gYWJvdmUgd3JpdGU/ICovCisJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChjb25uZWN0b3IsIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwpOworCisJY3RsMiA9IEJMTV9QSVBFKHBpcGUpOworCWlmIChwYW5lbC0+YmFja2xpZ2h0LmNvbWJpbmF0aW9uX21vZGUpCisJCWN0bDIgfD0gQkxNX0NPTUJJTkFUSU9OX01PREU7CisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuYWN0aXZlX2xvd19wd20pCisJCWN0bDIgfD0gQkxNX1BPTEFSSVRZX0k5NjU7CisJSTkxNV9XUklURShCTENfUFdNX0NUTDIsIGN0bDIpOworCVBPU1RJTkdfUkVBRChCTENfUFdNX0NUTDIpOworCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwyLCBjdGwyIHwgQkxNX1BXTV9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCB2bHZfZW5hYmxlX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9nZXRfcGlwZV9mcm9tX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXUzMiBjdGwsIGN0bDI7CisKKwljdGwyID0gSTkxNV9SRUFEKFZMVl9CTENfUFdNX0NUTDIocGlwZSkpOworCWlmIChjdGwyICYgQkxNX1BXTV9FTkFCTEUpIHsKKwkJV0FSTigxLCAiYmFja2xpZ2h0IGFscmVhZHkgZW5hYmxlZFxuIik7CisJCWN0bDIgJj0gfkJMTV9QV01fRU5BQkxFOworCQlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTDIocGlwZSksIGN0bDIpOworCX0KKworCWN0bCA9IHBhbmVsLT5iYWNrbGlnaHQubWF4IDw8IDE2OworCUk5MTVfV1JJVEUoVkxWX0JMQ19QV01fQ1RMKHBpcGUpLCBjdGwpOworCisJLyogWFhYOiBjb21iaW5lIHRoaXMgaW50byBhYm92ZSB3cml0ZT8gKi8KKwlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwgcGFuZWwtPmJhY2tsaWdodC5sZXZlbCk7CisKKwljdGwyID0gMDsKKwlpZiAocGFuZWwtPmJhY2tsaWdodC5hY3RpdmVfbG93X3B3bSkKKwkJY3RsMiB8PSBCTE1fUE9MQVJJVFlfSTk2NTsKKwlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTDIocGlwZSksIGN0bDIpOworCVBPU1RJTkdfUkVBRChWTFZfQkxDX1BXTV9DVEwyKHBpcGUpKTsKKwlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTDIocGlwZSksIGN0bDIgfCBCTE1fUFdNX0VOQUJMRSk7CiB9CiAKIHZvaWQgaW50ZWxfcGFuZWxfZW5hYmxlX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CiAJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9nZXRfcGlwZV9mcm9tX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCWVudW0gdHJhbnNjb2RlciBjcHVfdHJhbnNjb2RlciA9Ci0JCWludGVsX3BpcGVfdG9fY3B1X3RyYW5zY29kZXIoZGV2X3ByaXYsIHBpcGUpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocGlwZSA9PSBJTlZBTElEX1BJUEUpCisJaWYgKCFwYW5lbC0+YmFja2xpZ2h0LnByZXNlbnQgfHwgcGlwZSA9PSBJTlZBTElEX1BJUEUpCiAJCXJldHVybjsKIAogCURSTV9ERUJVR19LTVMoInBpcGUgJWNcbiIsIHBpcGVfbmFtZShwaXBlKSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmJhY2tsaWdodC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGRldl9wcml2LT5iYWNrbGlnaHQubGV2ZWwgPT0gMCkgewotCQlkZXZfcHJpdi0+YmFja2xpZ2h0LmxldmVsID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2LAotCQkJCQkJCQkJICBwaXBlKTsKLQkJaWYgKGRldl9wcml2LT5iYWNrbGlnaHQuZGV2aWNlKQotCQkJZGV2X3ByaXYtPmJhY2tsaWdodC5kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQotCQkJCWRldl9wcml2LT5iYWNrbGlnaHQubGV2ZWw7CisJV0FSTl9PTihwYW5lbC0+YmFja2xpZ2h0Lm1heCA9PSAwKTsKKworCWlmIChwYW5lbC0+YmFja2xpZ2h0LmxldmVsID09IDApIHsKKwkJcGFuZWwtPmJhY2tsaWdodC5sZXZlbCA9IHBhbmVsLT5iYWNrbGlnaHQubWF4OworCQlpZiAocGFuZWwtPmJhY2tsaWdodC5kZXZpY2UpCisJCQlwYW5lbC0+YmFja2xpZ2h0LmRldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9CisJCQkJcGFuZWwtPmJhY2tsaWdodC5sZXZlbDsKIAl9CiAKLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQl1aW50MzJfdCByZWcsIHRtcDsKKwlkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfYmFja2xpZ2h0KGNvbm5lY3Rvcik7CisJcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0gdHJ1ZTsKIAotCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQotCQkJcmVnID0gQkxDX1BXTV9DUFVfQ1RMMjsKLQkJZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQotCQkJcmVnID0gVkxWX0JMQ19QV01fQ1RMMihwaXBlKTsKLQkJZWxzZQotCQkJcmVnID0gQkxDX1BXTV9DVEwyOwotCi0JCXRtcCA9IEk5MTVfUkVBRChyZWcpOwotCi0JCS8qIE5vdGUgdGhhdCB0aGlzIGNhbiBhbHNvIGdldCBjYWxsZWQgdGhyb3VnaCBkcG1zIGNoYW5nZXMuIEFuZAotCQkgKiB3ZSBkb24ndCB0cmFjayB0aGUgYmFja2xpZ2h0IGRwbXMgc3RhdGUsIGhlbmNlIGNoZWNrIHdoZXRoZXIKLQkJICogd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBmaXJzdC4gKi8KLQkJaWYgKHRtcCAmIEJMTV9QV01fRU5BQkxFKQotCQkJZ290byBzZXRfbGV2ZWw7Ci0KLQkJaWYgKElOVEVMX0lORk8oZGV2KS0+bnVtX3BpcGVzID09IDMpCi0JCQl0bXAgJj0gfkJMTV9QSVBFX1NFTEVDVF9JVkI7Ci0JCWVsc2UKLQkJCXRtcCAmPSB+QkxNX1BJUEVfU0VMRUNUOwotCi0JCWlmIChjcHVfdHJhbnNjb2RlciA9PSBUUkFOU0NPREVSX0VEUCkKLQkJCXRtcCB8PSBCTE1fVFJBTlNDT0RFUl9FRFA7Ci0JCWVsc2UKLQkJCXRtcCB8PSBCTE1fUElQRShjcHVfdHJhbnNjb2Rlcik7Ci0JCXRtcCAmPSB+QkxNX1BXTV9FTkFCTEU7Ci0KLQkJSTkxNV9XUklURShyZWcsIHRtcCk7Ci0JCVBPU1RJTkdfUkVBRChyZWcpOwotCQlJOTE1X1dSSVRFKHJlZywgdG1wIHwgQkxNX1BXTV9FTkFCTEUpOwotCi0JCWlmIChJU19CUk9BRFdFTEwoZGV2KSkgewotCQkJLyoKLQkJCSAqIEJyb2Fkd2VsbCByZXF1aXJlcyBQQ0ggb3ZlcnJpZGUgdG8gZHJpdmUgdGhlIFBDSAotCQkJICogYmFja2xpZ2h0IHBpbi4gVGhlIGFib3ZlIHdpbGwgY29uZmlndXJlIHRoZSBDUFUKLQkJCSAqIGJhY2tsaWdodCBwaW4sIHdoaWNoIHdlIGRvbid0IHBsYW4gdG8gdXNlLgotCQkJICovCi0JCQl0bXAgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7Ci0JCQl0bXAgfD0gQkxNX1BDSF9PVkVSUklERV9FTkFCTEUgfCBCTE1fUENIX1BXTV9FTkFCTEU7Ci0JCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIHRtcCk7Ci0JCX0gZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpICYmCi0JCSAgICAhKGRldl9wcml2LT5xdWlya3MgJiBRVUlSS19OT19QQ0hfUFdNX0VOQUJMRSkpIHsKLQkJCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKLQkJCXRtcCB8PSBCTE1fUENIX1BXTV9FTkFCTEU7Ci0JCQl0bXAgJj0gfkJMTV9QQ0hfT1ZFUlJJREVfRU5BQkxFOwotCQkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCB0bXApOwotCQl9Ci0JfQotCi1zZXRfbGV2ZWw6Ci0JLyogQ2FsbCBiZWxvdyBhZnRlciBzZXR0aW5nIEJMQ19QV01fQ1BVX0NUTDIgYW5kIEJMQ19QV01fUENIX0NUTDEuCi0JICogQkxDX1BXTV9DUFVfQ1RMIG1heSBiZSBjbGVhcmVkIHRvIHplcm8gYXV0b21hdGljYWxseSB3aGVuIHRoZXNlCi0JICogcmVnaXN0ZXJzIGFyZSBzZXQuCi0JICovCi0JZGV2X3ByaXYtPmJhY2tsaWdodC5lbmFibGVkID0gdHJ1ZTsKLQlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGRldiwgcGlwZSwKLQkJCQkJICAgZGV2X3ByaXYtPmJhY2tsaWdodC5sZXZlbCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKLX0KLQotLyogRklYTUU6IHVzZSBWQlQgdmFscyB0byBpbml0IFBXTV9DVEwgYW5kIFBXTV9DVEwyIGNvcnJlY3RseSAqLwotc3RhdGljIHZvaWQgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHRfcmVncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0JCWVudW0gcGlwZSBwaXBlOwotCi0JCWZvcl9lYWNoX3BpcGUocGlwZSkgewotCQkJdTMyIGN1cl92YWwgPSBJOTE1X1JFQUQoVkxWX0JMQ19QV01fQ1RMKHBpcGUpKTsKLQotCQkJLyogU2tpcCBpZiB0aGUgbW9kdWxhdGlvbiBmcmVxIGlzIGFscmVhZHkgc2V0ICovCi0JCQlpZiAoY3VyX3ZhbCAmIH5CQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLKQotCQkJCWNvbnRpbnVlOwotCi0JCQljdXJfdmFsICY9IEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Ci0JCQlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTChwaXBlKSwgKDB4ZjQyIDw8IDE2KSB8Ci0JCQkJICAgY3VyX3ZhbCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsX3BhbmVsX2luaXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWludGVsX3BhbmVsX2luaXRfYmFja2xpZ2h0X3JlZ3MoZGV2KTsKLQotCWRldl9wcml2LT5iYWNrbGlnaHQubGV2ZWwgPSBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KGRldiwgMCk7Ci0JZGV2X3ByaXYtPmJhY2tsaWdodC5lbmFibGVkID0gZGV2X3ByaXYtPmJhY2tsaWdodC5sZXZlbCAhPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOwogfQogCiBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCkBAIC03NjIsNyArODI3LDcgQEAKIH0KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UpCi1zdGF0aWMgaW50IGludGVsX3BhbmVsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQorc3RhdGljIGludCBpbnRlbF9iYWNrbGlnaHRfZGV2aWNlX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciA9IGJsX2dldF9kYXRhKGJkKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKQEAgLTc3Niw4NSArODQxLDM2MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGludGVsX3BhbmVsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3N0YXRpYyBpbnQgaW50ZWxfYmFja2xpZ2h0X2RldmljZV9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYmxfZ2V0X2RhdGEoYmQpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OwotCWVudW0gcGlwZSBwaXBlOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKIAorCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKIAltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLQlwaXBlID0gaW50ZWxfZ2V0X3BpcGVfZnJvbV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlyZXQgPSBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KGNvbm5lY3Rvcik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLQlpZiAocGlwZSA9PSBJTlZBTElEX1BJUEUpCi0JCXJldHVybiAwOworCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAotCXJldHVybiBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KGNvbm5lY3Rvci0+YmFzZS5kZXYsIHBpcGUpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBpbnRlbF9wYW5lbF9ibF9vcHMgPSB7Ci0JLnVwZGF0ZV9zdGF0dXMgPSBpbnRlbF9wYW5lbF91cGRhdGVfc3RhdHVzLAotCS5nZXRfYnJpZ2h0bmVzcyA9IGludGVsX3BhbmVsX2dldF9icmlnaHRuZXNzLAorc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGludGVsX2JhY2tsaWdodF9kZXZpY2Vfb3BzID0geworCS51cGRhdGVfc3RhdHVzID0gaW50ZWxfYmFja2xpZ2h0X2RldmljZV91cGRhdGVfc3RhdHVzLAorCS5nZXRfYnJpZ2h0bmVzcyA9IGludGVsX2JhY2tsaWdodF9kZXZpY2VfZ2V0X2JyaWdodG5lc3MsCiB9OwogCitzdGF0aWMgaW50IGludGVsX2JhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5lbDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisKKwlpZiAoV0FSTl9PTihwYW5lbC0+YmFja2xpZ2h0LmRldmljZSkpCisJCXJldHVybiAtRU5PREVWOworCisJQlVHX09OKHBhbmVsLT5iYWNrbGlnaHQubWF4ID09IDApOworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHByb3BzKSk7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CisJcHJvcHMuYnJpZ2h0bmVzcyA9IHBhbmVsLT5iYWNrbGlnaHQubGV2ZWw7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBwYW5lbC0+YmFja2xpZ2h0Lm1heDsKKworCS8qCisJICogTm90ZTogdXNpbmcgdGhlIHNhbWUgbmFtZSBpbmRlcGVuZGVudCBvZiB0aGUgY29ubmVjdG9yIHByZXZlbnRzCisJICogcmVnaXN0cmF0aW9uIG9mIG11bHRpcGxlIGJhY2tsaWdodCBkZXZpY2VzIGluIHRoZSBkcml2ZXIuCisJICovCisJcGFuZWwtPmJhY2tsaWdodC5kZXZpY2UgPQorCQliYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJpbnRlbF9iYWNrbGlnaHQiLAorCQkJCQkgIGNvbm5lY3Rvci0+YmFzZS5rZGV2LAorCQkJCQkgIGNvbm5lY3RvciwKKwkJCQkJICAmaW50ZWxfYmFja2xpZ2h0X2RldmljZV9vcHMsICZwcm9wcyk7CisKKwlpZiAoSVNfRVJSKHBhbmVsLT5iYWNrbGlnaHQuZGV2aWNlKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBiYWNrbGlnaHQ6ICVsZFxuIiwKKwkJCSAgUFRSX0VSUihwYW5lbC0+YmFja2xpZ2h0LmRldmljZSkpOworCQlwYW5lbC0+YmFja2xpZ2h0LmRldmljZSA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisKKwlpZiAocGFuZWwtPmJhY2tsaWdodC5kZXZpY2UpIHsKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHBhbmVsLT5iYWNrbGlnaHQuZGV2aWNlKTsKKwkJcGFuZWwtPmJhY2tsaWdodC5kZXZpY2UgPSBOVUxMOworCX0KK30KKyNlbHNlIC8qIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFICovCitzdGF0aWMgaW50IGludGVsX2JhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgaW50ZWxfYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAqLworCisvKgorICogTm90ZTogVGhlIHNldHVwIGhvb2tzIGNhbid0IGFzc3VtZSBwaXBlIGlzIHNldCEKKyAqCisgKiBYWFg6IFF1ZXJ5IG1vZGUgY2xvY2sgb3IgaGFyZHdhcmUgY2xvY2sgYW5kIHByb2dyYW0gUFdNIG1vZHVsYXRpb24gZnJlcXVlbmN5CisgKiBhcHByb3ByaWF0ZWx5IHdoZW4gaXQncyAwLiBVc2UgVkJUIGFuZC9vciBzYW5lIGRlZmF1bHRzLgorICovCitzdGF0aWMgaW50IGJkd19zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOworCXUzMiBwY2hfY3RsMSwgcGNoX2N0bDIsIHZhbDsKKworCXBjaF9jdGwxID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDEpOworCXBhbmVsLT5iYWNrbGlnaHQuYWN0aXZlX2xvd19wd20gPSBwY2hfY3RsMSAmIEJMTV9QQ0hfUE9MQVJJVFk7CisKKwlwY2hfY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwyKTsKKwlwYW5lbC0+YmFja2xpZ2h0Lm1heCA9IHBjaF9jdGwyID4+IDE2OworCWlmICghcGFuZWwtPmJhY2tsaWdodC5tYXgpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsID0gYmR3X2dldF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKKwlwYW5lbC0+YmFja2xpZ2h0LmxldmVsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGNvbm5lY3RvciwgdmFsKTsKKworCXBhbmVsLT5iYWNrbGlnaHQuZW5hYmxlZCA9IChwY2hfY3RsMSAmIEJMTV9QQ0hfUFdNX0VOQUJMRSkgJiYKKwkJcGFuZWwtPmJhY2tsaWdodC5sZXZlbCAhPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNoX3NldHVwX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisJdTMyIGNwdV9jdGwyLCBwY2hfY3RsMSwgcGNoX2N0bDIsIHZhbDsKKworCXBjaF9jdGwxID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDEpOworCXBhbmVsLT5iYWNrbGlnaHQuYWN0aXZlX2xvd19wd20gPSBwY2hfY3RsMSAmIEJMTV9QQ0hfUE9MQVJJVFk7CisKKwlwY2hfY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwyKTsKKwlwYW5lbC0+YmFja2xpZ2h0Lm1heCA9IHBjaF9jdGwyID4+IDE2OworCWlmICghcGFuZWwtPmJhY2tsaWdodC5tYXgpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsID0gcGNoX2dldF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKKwlwYW5lbC0+YmFja2xpZ2h0LmxldmVsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGNvbm5lY3RvciwgdmFsKTsKKworCWNwdV9jdGwyID0gSTkxNV9SRUFEKEJMQ19QV01fQ1BVX0NUTDIpOworCXBhbmVsLT5iYWNrbGlnaHQuZW5hYmxlZCA9IChjcHVfY3RsMiAmIEJMTV9QV01fRU5BQkxFKSAmJgorCQkocGNoX2N0bDEgJiBCTE1fUENIX1BXTV9FTkFCTEUpICYmIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgIT0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5eHhfc2V0dXBfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5lbDsKKwl1MzIgY3RsLCB2YWw7CisKKwljdGwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DVEwpOworCisJaWYgKElTX0dFTjIoZGV2KSkKKwkJcGFuZWwtPmJhY2tsaWdodC5jb21iaW5hdGlvbl9tb2RlID0gY3RsICYgQkxNX0xFR0FDWV9NT0RFOworCisJaWYgKElTX1BJTkVWSUVXKGRldikpCisJCXBhbmVsLT5iYWNrbGlnaHQuYWN0aXZlX2xvd19wd20gPSBjdGwgJiBCTE1fUE9MQVJJVFlfUE5WOworCisJcGFuZWwtPmJhY2tsaWdodC5tYXggPSBjdGwgPj4gMTc7CisJaWYgKHBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSkKKwkJcGFuZWwtPmJhY2tsaWdodC5tYXggKj0gMHhmZjsKKworCWlmICghcGFuZWwtPmJhY2tsaWdodC5tYXgpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsID0gaTl4eF9nZXRfYmFja2xpZ2h0KGNvbm5lY3Rvcik7CisJcGFuZWwtPmJhY2tsaWdodC5sZXZlbCA9IGludGVsX3BhbmVsX2NvbXB1dGVfYnJpZ2h0bmVzcyhjb25uZWN0b3IsIHZhbCk7CisKKwlwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTY1X3NldHVwX2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5lY3Rvci0+cGFuZWw7CisJdTMyIGN0bCwgY3RsMiwgdmFsOworCisJY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOworCXBhbmVsLT5iYWNrbGlnaHQuY29tYmluYXRpb25fbW9kZSA9IGN0bDIgJiBCTE1fQ09NQklOQVRJT05fTU9ERTsKKwlwYW5lbC0+YmFja2xpZ2h0LmFjdGl2ZV9sb3dfcHdtID0gY3RsMiAmIEJMTV9QT0xBUklUWV9JOTY1OworCisJY3RsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKKwlwYW5lbC0+YmFja2xpZ2h0Lm1heCA9IGN0bCA+PiAxNjsKKwlpZiAocGFuZWwtPmJhY2tsaWdodC5jb21iaW5hdGlvbl9tb2RlKQorCQlwYW5lbC0+YmFja2xpZ2h0Lm1heCAqPSAweGZmOworCisJaWYgKCFwYW5lbC0+YmFja2xpZ2h0Lm1heCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwgPSBpOXh4X2dldF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKKwlwYW5lbC0+YmFja2xpZ2h0LmxldmVsID0gaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKGNvbm5lY3RvciwgdmFsKTsKKworCXBhbmVsLT5iYWNrbGlnaHQuZW5hYmxlZCA9IChjdGwyICYgQkxNX1BXTV9FTkFCTEUpICYmCisJCXBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgIT0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsdl9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOworCWVudW0gcGlwZSBwaXBlOworCXUzMiBjdGwsIGN0bDIsIHZhbDsKKworCWZvcl9lYWNoX3BpcGUocGlwZSkgeworCQl1MzIgY3VyX3ZhbCA9IEk5MTVfUkVBRChWTFZfQkxDX1BXTV9DVEwocGlwZSkpOworCisJCS8qIFNraXAgaWYgdGhlIG1vZHVsYXRpb24gZnJlcSBpcyBhbHJlYWR5IHNldCAqLworCQlpZiAoY3VyX3ZhbCAmIH5CQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLKQorCQkJY29udGludWU7CisKKwkJY3VyX3ZhbCAmPSBCQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLOworCQlJOTE1X1dSSVRFKFZMVl9CTENfUFdNX0NUTChwaXBlKSwgKDB4ZjQyIDw8IDE2KSB8CisJCQkgICBjdXJfdmFsKTsKKwl9CisKKwljdGwyID0gSTkxNV9SRUFEKFZMVl9CTENfUFdNX0NUTDIoUElQRV9BKSk7CisJcGFuZWwtPmJhY2tsaWdodC5hY3RpdmVfbG93X3B3bSA9IGN0bDIgJiBCTE1fUE9MQVJJVFlfSTk2NTsKKworCWN0bCA9IEk5MTVfUkVBRChWTFZfQkxDX1BXTV9DVEwoUElQRV9BKSk7CisJcGFuZWwtPmJhY2tsaWdodC5tYXggPSBjdGwgPj4gMTY7CisJaWYgKCFwYW5lbC0+YmFja2xpZ2h0Lm1heCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwgPSBfdmx2X2dldF9iYWNrbGlnaHQoZGV2LCBQSVBFX0EpOworCXBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBpbnRlbF9wYW5lbF9jb21wdXRlX2JyaWdodG5lc3MoY29ubmVjdG9yLCB2YWwpOworCisJcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0gKGN0bDIgJiBCTE1fUFdNX0VOQUJMRSkgJiYKKwkJcGFuZWwtPmJhY2tsaWdodC5sZXZlbCAhPSAwOworCisJcmV0dXJuIDA7Cit9CisKIGludCBpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZpbnRlbF9jb25uZWN0b3ItPnBhbmVsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAotCWludGVsX3BhbmVsX2luaXRfYmFja2xpZ2h0KGRldik7CisJLyogc2V0IGxldmVsIGFuZCBtYXggaW4gcGFuZWwgc3RydWN0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOworCXJldCA9IGRldl9wcml2LT5kaXNwbGF5LnNldHVwX2JhY2tsaWdodChpbnRlbF9jb25uZWN0b3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5iYWNrbGlnaHRfbG9jaywgZmxhZ3MpOwogCi0JaWYgKFdBUk5fT04oZGV2X3ByaXYtPmJhY2tsaWdodC5kZXZpY2UpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihwcm9wcykpOwotCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUkFXOwotCXByb3BzLmJyaWdodG5lc3MgPSBkZXZfcHJpdi0+YmFja2xpZ2h0LmxldmVsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5iYWNrbGlnaHQubG9jaywgZmxhZ3MpOwotCXByb3BzLm1heF9icmlnaHRuZXNzID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2LCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+YmFja2xpZ2h0LmxvY2ssIGZsYWdzKTsKLQotCWlmIChwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9PSAwKSB7Ci0JCURSTV9ERUJVR19EUklWRVIoIkZhaWxlZCB0byBnZXQgbWF4aW11bSBiYWNrbGlnaHQgdmFsdWVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocmV0KSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZXR1cCBiYWNrbGlnaHQgZm9yIGNvbm5lY3RvciAlc1xuIiwKKwkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCXJldHVybiByZXQ7CiAJfQotCWRldl9wcml2LT5iYWNrbGlnaHQuZGV2aWNlID0KLQkJYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiaW50ZWxfYmFja2xpZ2h0IiwKLQkJCQkJICBjb25uZWN0b3ItPmtkZXYsCi0JCQkJCSAgdG9faW50ZWxfY29ubmVjdG9yKGNvbm5lY3RvciksCi0JCQkJCSAgJmludGVsX3BhbmVsX2JsX29wcywgJnByb3BzKTsKIAotCWlmIChJU19FUlIoZGV2X3ByaXYtPmJhY2tsaWdodC5kZXZpY2UpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGJhY2tsaWdodDogJWxkXG4iLAotCQkJICBQVFJfRVJSKGRldl9wcml2LT5iYWNrbGlnaHQuZGV2aWNlKSk7Ci0JCWRldl9wcml2LT5iYWNrbGlnaHQuZGV2aWNlID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWludGVsX2JhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoaW50ZWxfY29ubmVjdG9yKTsKKworCXBhbmVsLT5iYWNrbGlnaHQucHJlc2VudCA9IHRydWU7CisKKwlEUk1fREVCVUdfS01TKCJiYWNrbGlnaHQgaW5pdGlhbGl6ZWQsICVzLCBicmlnaHRuZXNzICV1LyV1LCAiCisJCSAgICAgICJzeXNmcyBpbnRlcmZhY2UgJXNyZWdpc3RlcmVkXG4iLAorCQkgICAgICBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCQkgICAgICBwYW5lbC0+YmFja2xpZ2h0LmxldmVsLCBwYW5lbC0+YmFja2xpZ2h0Lm1heCwKKwkJICAgICAgcGFuZWwtPmJhY2tsaWdodC5kZXZpY2UgPyAiIiA6ICJub3QgIik7CisKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpbnRlbF9wYW5lbF9kZXN0cm95X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQordm9pZCBpbnRlbF9wYW5lbF9kZXN0cm95X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmludGVsX2Nvbm5lY3RvciA9IHRvX2ludGVsX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmaW50ZWxfY29ubmVjdG9yLT5wYW5lbDsKKworCXBhbmVsLT5iYWNrbGlnaHQucHJlc2VudCA9IGZhbHNlOworCWludGVsX2JhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpbnRlbF9jb25uZWN0b3IpOworfQorCisvKioKKyAqIGludGVsX2ZpbmRfcGFuZWxfZG93bmNsb2NrIC0gZmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMgaW4gRURJRAorICogQGRldjogZHJtIGRldmljZQorICogQGZpeGVkX21vZGUgOiBwYW5lbCBuYXRpdmUgbW9kZQorICogQGNvbm5lY3RvcjogTFZEUy9lRFAgY29ubmVjdG9yCisgKgorICogUmV0dXJuIGRvd25jbG9ja19hdmFpbAorICogRmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMvZURQIGluIEVESUQuCisgKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoKK2ludGVsX2ZpbmRfcGFuZWxfZG93bmNsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSwKKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnNjYW4sICp0bXBfbW9kZTsKKwlpbnQgdGVtcF9kb3duY2xvY2s7CisKKwl0ZW1wX2Rvd25jbG9jayA9IGZpeGVkX21vZGUtPmNsb2NrOworCXRtcF9tb2RlID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NhbiwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCS8qCisJCSAqIElmIG9uZSBtb2RlIGhhcyB0aGUgc2FtZSByZXNvbHV0aW9uIHdpdGggdGhlIGZpeGVkX3BhbmVsCisJCSAqIG1vZGUgd2hpbGUgdGhleSBoYXZlIHRoZSBkaWZmZXJlbnQgcmVmcmVzaCByYXRlLCBpdCBtZWFucworCQkgKiB0aGF0IHRoZSByZWR1Y2VkIGRvd25jbG9jayBpcyBmb3VuZC4gSW4gc3VjaAorCQkgKiBjYXNlIHdlIGNhbiBzZXQgdGhlIGRpZmZlcmVudCBGUHgwLzEgdG8gZHluYW1pY2FsbHkgc2VsZWN0CisJCSAqIGJldHdlZW4gbG93IGFuZCBoaWdoIGZyZXF1ZW5jeS4KKwkJICovCisJCWlmIChzY2FuLT5oZGlzcGxheSA9PSBmaXhlZF9tb2RlLT5oZGlzcGxheSAmJgorCQkgICAgc2Nhbi0+aHN5bmNfc3RhcnQgPT0gZml4ZWRfbW9kZS0+aHN5bmNfc3RhcnQgJiYKKwkJICAgIHNjYW4tPmhzeW5jX2VuZCA9PSBmaXhlZF9tb2RlLT5oc3luY19lbmQgJiYKKwkJICAgIHNjYW4tPmh0b3RhbCA9PSBmaXhlZF9tb2RlLT5odG90YWwgJiYKKwkJICAgIHNjYW4tPnZkaXNwbGF5ID09IGZpeGVkX21vZGUtPnZkaXNwbGF5ICYmCisJCSAgICBzY2FuLT52c3luY19zdGFydCA9PSBmaXhlZF9tb2RlLT52c3luY19zdGFydCAmJgorCQkgICAgc2Nhbi0+dnN5bmNfZW5kID09IGZpeGVkX21vZGUtPnZzeW5jX2VuZCAmJgorCQkgICAgc2Nhbi0+dnRvdGFsID09IGZpeGVkX21vZGUtPnZ0b3RhbCkgeworCQkJaWYgKHNjYW4tPmNsb2NrIDwgdGVtcF9kb3duY2xvY2spIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBkb3duY2xvY2sgaXMgYWxyZWFkeSBmb3VuZC4gQnV0IHdlCisJCQkJICogZXhwZWN0IHRvIGZpbmQgdGhlIGxvd2VyIGRvd25jbG9jay4KKwkJCQkgKi8KKwkJCQl0ZW1wX2Rvd25jbG9jayA9IHNjYW4tPmNsb2NrOworCQkJCXRtcF9tb2RlID0gc2NhbjsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0ZW1wX2Rvd25jbG9jayA8IGZpeGVkX21vZGUtPmNsb2NrKQorCQlyZXR1cm4gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgdG1wX21vZGUpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB1cCBjaGlwIHNwZWNpZmljIGJhY2tsaWdodCBmdW5jdGlvbnMgKi8KK3ZvaWQgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHRfZnVuY3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0LmRldmljZSkgewotCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZGV2X3ByaXYtPmJhY2tsaWdodC5kZXZpY2UpOwotCQlkZXZfcHJpdi0+YmFja2xpZ2h0LmRldmljZSA9IE5VTEw7CisKKwlpZiAoSVNfQlJPQURXRUxMKGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0dXBfYmFja2xpZ2h0ID0gYmR3X3NldHVwX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2JhY2tsaWdodCA9IGJkd19lbmFibGVfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2JhY2tsaWdodCA9IHBjaF9kaXNhYmxlX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0X2JhY2tsaWdodCA9IGJkd19zZXRfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfYmFja2xpZ2h0ID0gYmR3X2dldF9iYWNrbGlnaHQ7CisJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0dXBfYmFja2xpZ2h0ID0gcGNoX3NldHVwX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2JhY2tsaWdodCA9IHBjaF9lbmFibGVfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2JhY2tsaWdodCA9IHBjaF9kaXNhYmxlX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0X2JhY2tsaWdodCA9IHBjaF9zZXRfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfYmFja2xpZ2h0ID0gcGNoX2dldF9iYWNrbGlnaHQ7CisJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0dXBfYmFja2xpZ2h0ID0gdmx2X3NldHVwX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2JhY2tsaWdodCA9IHZsdl9lbmFibGVfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2JhY2tsaWdodCA9IHZsdl9kaXNhYmxlX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0X2JhY2tsaWdodCA9IHZsdl9zZXRfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfYmFja2xpZ2h0ID0gdmx2X2dldF9iYWNrbGlnaHQ7CisJfSBlbHNlIGlmIChJU19HRU40KGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0dXBfYmFja2xpZ2h0ID0gaTk2NV9zZXR1cF9iYWNrbGlnaHQ7CisJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9iYWNrbGlnaHQgPSBpOTY1X2VuYWJsZV9iYWNrbGlnaHQ7CisJCWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfYmFja2xpZ2h0ID0gaTk2NV9kaXNhYmxlX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuc2V0X2JhY2tsaWdodCA9IGk5eHhfc2V0X2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2JhY2tsaWdodCA9IGk5eHhfZ2V0X2JhY2tsaWdodDsKKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+ZGlzcGxheS5zZXR1cF9iYWNrbGlnaHQgPSBpOXh4X3NldHVwX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2JhY2tsaWdodCA9IGk5eHhfZW5hYmxlX2JhY2tsaWdodDsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9iYWNrbGlnaHQgPSBpOXh4X2Rpc2FibGVfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5zZXRfYmFja2xpZ2h0ID0gaTl4eF9zZXRfYmFja2xpZ2h0OworCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfYmFja2xpZ2h0ID0gaTl4eF9nZXRfYmFja2xpZ2h0OwogCX0KIH0KLSNlbHNlCi1pbnQgaW50ZWxfcGFuZWxfc2V0dXBfYmFja2xpZ2h0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHQoY29ubmVjdG9yLT5kZXYpOwotCXJldHVybiAwOwotfQotCi12b2lkIGludGVsX3BhbmVsX2Rlc3Ryb3lfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuOwotfQotI2VuZGlmCiAKIGludCBpbnRlbF9wYW5lbF9pbml0KHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwsCiAJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpeGVkX21vZGUpCkBAIC04NzEsNCArMTIxMyw4IEBACiAKIAlpZiAocGFuZWwtPmZpeGVkX21vZGUpCiAJCWRybV9tb2RlX2Rlc3Ryb3koaW50ZWxfY29ubmVjdG9yLT5iYXNlLmRldiwgcGFuZWwtPmZpeGVkX21vZGUpOworCisJaWYgKHBhbmVsLT5kb3duY2xvY2tfbW9kZSkKKwkJZHJtX21vZGVfZGVzdHJveShpbnRlbF9jb25uZWN0b3ItPmJhc2UuZGV2LAorCQkJCXBhbmVsLT5kb3duY2xvY2tfbW9kZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYwppbmRleCAyNmMyOWMxLi5kNzdjYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BtLmMKQEAgLTMwLDcgKzMwLDkgQEAKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmgiCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CiAjaW5jbHVkZSA8ZHJtL2k5MTVfcG93ZXJ3ZWxsLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAvKioKICAqIFJDNiBpcyBhIHNwZWNpYWwgcG93ZXIgc3RhZ2Ugd2hpY2ggYWxsb3dzIHRoZSBHUFUgdG8gZW50ZXIgYW4gdmVyeQpAQCAtODYsNyArODgsNyBAQAogCURSTV9ERUJVR19LTVMoImRpc2FibGVkIEZCQ1xuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGk4eHhfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCitzdGF0aWMgdm9pZCBpOHh4X2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk2LDMyICs5OCw0MCBAQAogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgY2ZiX3BpdGNoOwogCWludCBwbGFuZSwgaTsKLQl1MzIgZmJjX2N0bCwgZmJjX2N0bDI7CisJdTMyIGZiY19jdGw7CiAKIAljZmJfcGl0Y2ggPSBkZXZfcHJpdi0+ZmJjLnNpemUgLyBGQkNfTExfU0laRTsKIAlpZiAoZmItPnBpdGNoZXNbMF0gPCBjZmJfcGl0Y2gpCiAJCWNmYl9waXRjaCA9IGZiLT5waXRjaGVzWzBdOwogCi0JLyogRkJDX0NUTCB3YW50cyA2NEIgdW5pdHMgKi8KLQljZmJfcGl0Y2ggPSAoY2ZiX3BpdGNoIC8gNjQpIC0gMTsKKwkvKiBGQkNfQ1RMIHdhbnRzIDMyQiBvciA2NEIgdW5pdHMgKi8KKwlpZiAoSVNfR0VOMihkZXYpKQorCQljZmJfcGl0Y2ggPSAoY2ZiX3BpdGNoIC8gMzIpIC0gMTsKKwllbHNlCisJCWNmYl9waXRjaCA9IChjZmJfcGl0Y2ggLyA2NCkgLSAxOwogCXBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IEZCQ19DVExfUExBTkVBIDogRkJDX0NUTF9QTEFORUI7CiAKIAkvKiBDbGVhciBvbGQgdGFncyAqLwogCWZvciAoaSA9IDA7IGkgPCAoRkJDX0xMX1NJWkUgLyAzMikgKyAxOyBpKyspCiAJCUk5MTVfV1JJVEUoRkJDX1RBRyArIChpICogNCksIDApOwogCi0JLyogU2V0IGl0IHVwLi4uICovCi0JZmJjX2N0bDIgPSBGQkNfQ1RMX0ZFTkNFX0RCTCB8IEZCQ19DVExfSURMRV9JTU0gfCBGQkNfQ1RMX0NQVV9GRU5DRTsKLQlmYmNfY3RsMiB8PSBwbGFuZTsKLQlJOTE1X1dSSVRFKEZCQ19DT05UUk9MMiwgZmJjX2N0bDIpOwotCUk5MTVfV1JJVEUoRkJDX0ZFTkNFX09GRiwgY3J0Yy0+eSk7CisJaWYgKElTX0dFTjQoZGV2KSkgeworCQl1MzIgZmJjX2N0bDI7CisKKwkJLyogU2V0IGl0IHVwLi4uICovCisJCWZiY19jdGwyID0gRkJDX0NUTF9GRU5DRV9EQkwgfCBGQkNfQ1RMX0lETEVfSU1NIHwgRkJDX0NUTF9DUFVfRkVOQ0U7CisJCWZiY19jdGwyIHw9IHBsYW5lOworCQlJOTE1X1dSSVRFKEZCQ19DT05UUk9MMiwgZmJjX2N0bDIpOworCQlJOTE1X1dSSVRFKEZCQ19GRU5DRV9PRkYsIGNydGMtPnkpOworCX0KIAogCS8qIGVuYWJsZSBpdC4uLiAqLwotCWZiY19jdGwgPSBGQkNfQ1RMX0VOIHwgRkJDX0NUTF9QRVJJT0RJQzsKKwlmYmNfY3RsID0gSTkxNV9SRUFEKEZCQ19DT05UUk9MKTsKKwlmYmNfY3RsICY9IDB4M2ZmZiA8PCBGQkNfQ1RMX0lOVEVSVkFMX1NISUZUOworCWZiY19jdGwgfD0gRkJDX0NUTF9FTiB8IEZCQ19DVExfUEVSSU9ESUM7CiAJaWYgKElTX0k5NDVHTShkZXYpKQogCQlmYmNfY3RsIHw9IEZCQ19DVExfQzNfSURMRTsgLyogOTQ1IG5lZWRzIHNwZWNpYWwgU1IgaGFuZGxpbmcgKi8KIAlmYmNfY3RsIHw9IChjZmJfcGl0Y2ggJiAweGZmKSA8PCBGQkNfQ1RMX1NUUklERV9TSElGVDsKLQlmYmNfY3RsIHw9IChpbnRlcnZhbCAmIDB4MmZmZikgPDwgRkJDX0NUTF9JTlRFUlZBTF9TSElGVDsKIAlmYmNfY3RsIHw9IG9iai0+ZmVuY2VfcmVnOwogCUk5MTVfV1JJVEUoRkJDX0NPTlRST0wsIGZiY19jdGwpOwogCkBAIC0xMzYsNyArMTQ2LDcgQEAKIAlyZXR1cm4gSTkxNV9SRUFEKEZCQ19DT05UUk9MKSAmIEZCQ19DVExfRU47CiB9CiAKLXN0YXRpYyB2b2lkIGc0eF9lbmFibGVfZmJjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3N0YXRpYyB2b2lkIGc0eF9lbmFibGVfZmJjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNDUsMTYgKzE1NSwxMiBAQAogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBpbnRlbF9mYi0+b2JqOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZSA9PSAwID8gRFBGQ19DVExfUExBTkVBIDogRFBGQ19DVExfUExBTkVCOwotCXVuc2lnbmVkIGxvbmcgc3RhbGxfd2F0ZXJtYXJrID0gMjAwOwogCXUzMiBkcGZjX2N0bDsKIAogCWRwZmNfY3RsID0gcGxhbmUgfCBEUEZDX1NSX0VOIHwgRFBGQ19DVExfTElNSVRfMVg7CiAJZHBmY19jdGwgfD0gRFBGQ19DVExfRkVOQ0VfRU4gfCBvYmotPmZlbmNlX3JlZzsKIAlJOTE1X1dSSVRFKERQRkNfQ0hJQ0tFTiwgRFBGQ19IVF9NT0RJRlkpOwogCi0JSTkxNV9XUklURShEUEZDX1JFQ09NUF9DVEwsIERQRkNfUkVDT01QX1NUQUxMX0VOIHwKLQkJICAgKHN0YWxsX3dhdGVybWFyayA8PCBEUEZDX1JFQ09NUF9TVEFMTF9XTV9TSElGVCkgfAotCQkgICAoaW50ZXJ2YWwgPDwgRFBGQ19SRUNPTVBfVElNRVJfQ09VTlRfU0hJRlQpKTsKIAlJOTE1X1dSSVRFKERQRkNfRkVOQ0VfWU9GRiwgY3J0Yy0+eSk7CiAKIAkvKiBlbmFibGUgaXQuLi4gKi8KQEAgLTE5MSw3ICsxOTcsMTEgQEAKIAl1MzIgYmx0X2Vjb3NrcGQ7CiAKIAkvKiBNYWtlIHN1cmUgYmxpdHRlciBub3RpZmllcyBGQkMgb2Ygd3JpdGVzICovCi0JZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CisKKwkvKiBCbGl0dGVyIGlzIHBhcnQgb2YgTWVkaWEgcG93ZXJ3ZWxsIG9uIFZMVi4gTm8gaW1wYWN0IG9mCisJICogaGlzIHBhcmFtIGluIG90aGVyIHBsYXRmb3JtcyBmb3Igbm93ICovCisJZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX01FRElBKTsKKwogCWJsdF9lY29za3BkID0gSTkxNV9SRUFEKEdFTjZfQkxJVFRFUl9FQ09TS1BEKTsKIAlibHRfZWNvc2twZCB8PSBHRU42X0JMSVRURVJfRkJDX05PVElGWSA8PAogCQlHRU42X0JMSVRURVJfTE9DS19TSElGVDsKQEAgLTIwMiwxMCArMjEyLDExIEBACiAJCQkgR0VONl9CTElUVEVSX0xPQ0tfU0hJRlQpOwogCUk5MTVfV1JJVEUoR0VONl9CTElUVEVSX0VDT1NLUEQsIGJsdF9lY29za3BkKTsKIAlQT1NUSU5HX1JFQUQoR0VONl9CTElUVEVSX0VDT1NLUEQpOwotCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCisJZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChkZXZfcHJpdiwgRk9SQ0VXQUtFX01FRElBKTsKIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lbmFibGVfZmJjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMTQsNyArMjI1LDYgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IERQRkNfQ1RMX1BMQU5FQSA6IERQRkNfQ1RMX1BMQU5FQjsKLQl1bnNpZ25lZCBsb25nIHN0YWxsX3dhdGVybWFyayA9IDIwMDsKIAl1MzIgZHBmY19jdGw7CiAKIAlkcGZjX2N0bCA9IEk5MTVfUkVBRChJTEtfRFBGQ19DT05UUk9MKTsKQEAgLTIyMiwxMiArMjMyLDExIEBACiAJZHBmY19jdGwgfD0gKHBsYW5lIHwgRFBGQ19DVExfTElNSVRfMVgpOwogCS8qIFNldCBwZXJzaXN0ZW50IG1vZGUgZm9yIGZyb250LWJ1ZmZlciByZW5kZXJpbmcsIGFsYSBYLiAqLwogCWRwZmNfY3RsIHw9IERQRkNfQ1RMX1BFUlNJU1RFTlRfTU9ERTsKLQlkcGZjX2N0bCB8PSAoRFBGQ19DVExfRkVOQ0VfRU4gfCBvYmotPmZlbmNlX3JlZyk7CisJZHBmY19jdGwgfD0gRFBGQ19DVExfRkVOQ0VfRU47CisJaWYgKElTX0dFTjUoZGV2KSkKKwkJZHBmY19jdGwgfD0gb2JqLT5mZW5jZV9yZWc7CiAJSTkxNV9XUklURShJTEtfRFBGQ19DSElDS0VOLCBEUEZDX0hUX01PRElGWSk7CiAKLQlJOTE1X1dSSVRFKElMS19EUEZDX1JFQ09NUF9DVEwsIERQRkNfUkVDT01QX1NUQUxMX0VOIHwKLQkJICAgKHN0YWxsX3dhdGVybWFyayA8PCBEUEZDX1JFQ09NUF9TVEFMTF9XTV9TSElGVCkgfAotCQkgICAoaW50ZXJ2YWwgPDwgRFBGQ19SRUNPTVBfVElNRVJfQ09VTlRfU0hJRlQpKTsKIAlJOTE1X1dSSVRFKElMS19EUEZDX0ZFTkNFX1lPRkYsIGNydGMtPnkpOwogCUk5MTVfV1JJVEUoSUxLX0ZCQ19SVF9CQVNFLCBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKSB8IElMS19GQkNfUlRfVkFMSUQpOwogCS8qIGVuYWJsZSBpdC4uLiAqLwpAQCAtMjY1LDcgKzI3NCw3IEBACiAJcmV0dXJuIEk5MTVfUkVBRChJTEtfRFBGQ19DT05UUk9MKSAmIERQRkNfQ1RMX0VOOwogfQogCi1zdGF0aWMgdm9pZCBnZW43X2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQorc3RhdGljIHZvaWQgZ2VuN19lbmFibGVfZmJjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yOTUsNyArMzA0LDcgQEAKIAogCXNhbmR5YnJpZGdlX2JsaXRfZmJjX3VwZGF0ZShkZXYpOwogCi0JRFJNX0RFQlVHX0tNUygiZW5hYmxlZCBmYmMgb24gcGxhbmUgJWRcbiIsIGludGVsX2NydGMtPnBsYW5lKTsKKwlEUk1fREVCVUdfS01TKCJlbmFibGVkIGZiYyBvbiBwbGFuZSAlY1xuIiwgcGxhbmVfbmFtZShpbnRlbF9jcnRjLT5wbGFuZSkpOwogfQogCiBib29sIGludGVsX2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0zMjIsOCArMzMxLDcgQEAKIAkJICogdGhlIHByaW9yIHdvcmsuCiAJCSAqLwogCQlpZiAod29yay0+Y3J0Yy0+ZmIgPT0gd29yay0+ZmIpIHsKLQkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMod29yay0+Y3J0YywKLQkJCQkJCSAgICAgd29yay0+aW50ZXJ2YWwpOworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyh3b3JrLT5jcnRjKTsKIAogCQkJZGV2X3ByaXYtPmZiYy5wbGFuZSA9IHRvX2ludGVsX2NydGMod29yay0+Y3J0YyktPnBsYW5lOwogCQkJZGV2X3ByaXYtPmZiYy5mYl9pZCA9IHdvcmstPmNydGMtPmZiLT5iYXNlLmlkOwpAQCAtMzYwLDcgKzM2OCw3IEBACiAJZGV2X3ByaXYtPmZiYy5mYmNfd29yayA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQorc3RhdGljIHZvaWQgaW50ZWxfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGludGVsX2ZiY193b3JrICp3b3JrOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CkBAIC0zNzQsMTMgKzM4MiwxMiBAQAogCXdvcmsgPSBremFsbG9jKHNpemVvZigqd29yayksIEdGUF9LRVJORUwpOwogCWlmICh3b3JrID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgRkJDIHdvcmsgc3RydWN0dXJlXG4iKTsKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyhjcnRjLCBpbnRlcnZhbCk7CisJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMoY3J0Yyk7CiAJCXJldHVybjsKIAl9CiAKIAl3b3JrLT5jcnRjID0gY3J0YzsKIAl3b3JrLT5mYiA9IGNydGMtPmZiOwotCXdvcmstPmludGVydmFsID0gaW50ZXJ2YWw7CiAJSU5JVF9ERUxBWUVEX1dPUksoJndvcmstPndvcmssIGludGVsX2ZiY193b3JrX2ZuKTsKIAogCWRldl9wcml2LT5mYmMuZmJjX3dvcmsgPSB3b3JrOwpAQCAtNDU0LDcgKzQ2MSw3IEBACiAJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGU7CiAJdW5zaWduZWQgaW50IG1heF93aWR0aCwgbWF4X2hlaWdodDsKIAotCWlmICghSTkxNV9IQVNfRkJDKGRldikpIHsKKwlpZiAoIUhBU19GQkMoZGV2KSkgewogCQlzZXRfbm9fZmJjX3JlYXNvbihkZXZfcHJpdiwgRkJDX1VOU1VQUE9SVEVEKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUzMCwxMCArNTM3LDEwIEBACiAJCQlEUk1fREVCVUdfS01TKCJtb2RlIHRvbyBsYXJnZSBmb3IgY29tcHJlc3Npb24sIGRpc2FibGluZ1xuIik7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQotCWlmICgoSVNfSTkxNUdNKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfSEFTV0VMTChkZXYpKSAmJgotCSAgICBpbnRlbF9jcnRjLT5wbGFuZSAhPSAwKSB7CisJaWYgKChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQgfHwgSVNfSEFTV0VMTChkZXYpKSAmJgorCSAgICBpbnRlbF9jcnRjLT5wbGFuZSAhPSBQTEFORV9BKSB7CiAJCWlmIChzZXRfbm9fZmJjX3JlYXNvbihkZXZfcHJpdiwgRkJDX0JBRF9QTEFORSkpCi0JCQlEUk1fREVCVUdfS01TKCJwbGFuZSBub3QgMCwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoInBsYW5lIG5vdCBBLCBkaXNhYmxpbmcgY29tcHJlc3Npb25cbiIpOwogCQlnb3RvIG91dF9kaXNhYmxlOwogCX0KIApAQCAtNTk1LDcgKzYwMiw3IEBACiAJCWludGVsX2Rpc2FibGVfZmJjKGRldik7CiAJfQogCi0JaW50ZWxfZW5hYmxlX2ZiYyhjcnRjLCA1MDApOworCWludGVsX2VuYWJsZV9mYmMoY3J0Yyk7CiAJZGV2X3ByaXYtPmZiYy5ub19mYmNfcmVhc29uID0gRkJDX09LOwogCXJldHVybjsKIApAQCAtODE3LDcgKzgyNCw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBpbnQgaTg1eF9nZXRfZmlmb19zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSkKK3N0YXRpYyBpbnQgaTgzMF9nZXRfZmlmb19zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIpOwpAQCAtODUwLDIxICs4NTcsNiBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZ2V0X2ZpZm9fc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBkc3BhcmIgPSBJOTE1X1JFQUQoRFNQQVJCKTsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBkc3BhcmIgJiAweDdmOwotCXNpemUgPj49IDE7IC8qIENvbnZlcnQgdG8gY2FjaGVsaW5lcyAqLwotCi0JRFJNX0RFQlVHX0tNUygiRklGTyBzaXplIC0gKDB4JTA4eCkgJXM6ICVkXG4iLCBkc3BhcmIsCi0JCSAgICAgIHBsYW5lID8gIkIiIDogIkEiLCBzaXplKTsKLQotCXJldHVybiBzaXplOwotfQotCiAvKiBQaW5ldmlldyBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgdmFyaW91cyBjb25maWdzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgcGluZXZpZXdfZGlzcGxheV93bSA9IHsKIAlQSU5FVklFV19ESVNQTEFZX0ZJRk8sCkBAIC05NDMsMTQgKzkzNSwxNCBAQAogCTIsCiAJSTkxNV9GSUZPX0xJTkVfU0laRQogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpODU1X3dtX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaTgzMF93bV9pbmZvID0gewogCUk4NTVHTV9GSUZPX1NJWkUsCiAJSTkxNV9NQVhfV00sCiAJMSwKIAkyLAogCUk4MzBfRklGT19MSU5FX1NJWkUKIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaTgzMF93bV9pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGk4NDVfd21faW5mbyA9IHsKIAlJODMwX0ZJRk9fU0laRSwKIAlJOTE1X01BWF9XTSwKIAkxLApAQCAtOTU4LDY1ICs5NTAsNiBAQAogCUk4MzBfRklGT19MSU5FX1NJWkUKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8gPSB7Ci0JSUxLX0RJU1BMQVlfRklGTywKLQlJTEtfRElTUExBWV9NQVhXTSwKLQlJTEtfRElTUExBWV9ERlRXTSwKLQkyLAotCUlMS19GSUZPX0xJTkVfU0laRQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpcm9ubGFrZV9jdXJzb3Jfd21faW5mbyA9IHsKLQlJTEtfQ1VSU09SX0ZJRk8sCi0JSUxLX0NVUlNPUl9NQVhXTSwKLQlJTEtfQ1VSU09SX0RGVFdNLAotCTIsCi0JSUxLX0ZJRk9fTElORV9TSVpFCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvID0gewotCUlMS19ESVNQTEFZX1NSX0ZJRk8sCi0JSUxLX0RJU1BMQVlfTUFYX1NSV00sCi0JSUxLX0RJU1BMQVlfREZUX1NSV00sCi0JMiwKLQlJTEtfRklGT19MSU5FX1NJWkUKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaXJvbmxha2VfY3Vyc29yX3Nyd21faW5mbyA9IHsKLQlJTEtfQ1VSU09SX1NSX0ZJRk8sCi0JSUxLX0NVUlNPUl9NQVhfU1JXTSwKLQlJTEtfQ1VSU09SX0RGVF9TUldNLAotCTIsCi0JSUxLX0ZJRk9fTElORV9TSVpFCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvID0gewotCVNOQl9ESVNQTEFZX0ZJRk8sCi0JU05CX0RJU1BMQVlfTUFYV00sCi0JU05CX0RJU1BMQVlfREZUV00sCi0JMiwKLQlTTkJfRklGT19MSU5FX1NJWkUKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8gPSB7Ci0JU05CX0NVUlNPUl9GSUZPLAotCVNOQl9DVVJTT1JfTUFYV00sCi0JU05CX0NVUlNPUl9ERlRXTSwKLQkyLAotCVNOQl9GSUZPX0xJTkVfU0laRQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBzYW5keWJyaWRnZV9kaXNwbGF5X3Nyd21faW5mbyA9IHsKLQlTTkJfRElTUExBWV9TUl9GSUZPLAotCVNOQl9ESVNQTEFZX01BWF9TUldNLAotCVNOQl9ESVNQTEFZX0RGVF9TUldNLAotCTIsCi0JU05CX0ZJRk9fTElORV9TSVpFCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8gPSB7Ci0JU05CX0NVUlNPUl9TUl9GSUZPLAotCVNOQl9DVVJTT1JfTUFYX1NSV00sCi0JU05CX0NVUlNPUl9ERlRfU1JXTSwKLQkyLAotCVNOQl9GSUZPX0xJTkVfU0laRQotfTsKLQotCiAvKioKICAqIGludGVsX2NhbGN1bGF0ZV93bSAtIGNhbGN1bGF0ZSB3YXRlcm1hcmsgbGV2ZWwKICAqIEBjbG9ja19pbl9raHo6IHBpeGVsIGNsb2NrCkBAIC0xNTY3LDcgKzE1MDAsNyBAQAogCWVsc2UgaWYgKCFJU19HRU4yKGRldikpCiAJCXdtX2luZm8gPSAmaTkxNV93bV9pbmZvOwogCWVsc2UKLQkJd21faW5mbyA9ICZpODU1X3dtX2luZm87CisJCXdtX2luZm8gPSAmaTgzMF93bV9pbmZvOwogCiAJZmlmb19zaXplID0gZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZShkZXYsIDApOwogCWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mb3JfcGxhbmUoZGV2LCAwKTsKQEAgLTE2MTUsNyArMTU0OCw3IEBACiAJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikpCiAJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOX01BU0sgfCAwKTsKIAllbHNlIGlmIChJU19JOTE1R00oZGV2KSkKLQkJSTkxNV9XUklURShJTlNUUE0sIEk5MTVfUkVBRChJTlNUUE0pICYgfklOU1RQTV9TRUxGX0VOKTsKKwkJSTkxNV9XUklURShJTlNUUE0sIF9NQVNLRURfQklUX0RJU0FCTEUoSU5TVFBNX1NFTEZfRU4pKTsKIAogCS8qIENhbGMgc3IgZW50cmllcyBmb3Igb25lIHBsYW5lIGNvbmZpZ3MgKi8KIAlpZiAoSEFTX0ZXX0JMQyhkZXYpICYmIGVuYWJsZWQpIHsKQEAgLTE2NjcsMTQgKzE2MDAsMTQgQEAKIAkJCQlJOTE1X1dSSVRFKEZXX0JMQ19TRUxGLAogCQkJCQkgICBGV19CTENfU0VMRl9FTl9NQVNLIHwgRldfQkxDX1NFTEZfRU4pOwogCQkJZWxzZSBpZiAoSVNfSTkxNUdNKGRldikpCi0JCQkJSTkxNV9XUklURShJTlNUUE0sIEk5MTVfUkVBRChJTlNUUE0pIHwgSU5TVFBNX1NFTEZfRU4pOworCQkJCUk5MTVfV1JJVEUoSU5TVFBNLCBfTUFTS0VEX0JJVF9FTkFCTEUoSU5TVFBNX1NFTEZfRU4pKTsKIAkJCURSTV9ERUJVR19LTVMoIm1lbW9yeSBzZWxmIHJlZnJlc2ggZW5hYmxlZFxuIik7CiAJCX0gZWxzZQogCQkJRFJNX0RFQlVHX0tNUygibWVtb3J5IHNlbGYgcmVmcmVzaCBkaXNhYmxlZFxuIik7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2NydGMgKnVudXNlZF9jcnRjKQorc3RhdGljIHZvaWQgaTg0NV91cGRhdGVfd20oc3RydWN0IGRybV9jcnRjICp1bnVzZWRfY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdW51c2VkX2NydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTY4OSw3ICsxNjIyLDcgQEAKIAogCWFkanVzdGVkX21vZGUgPSAmdG9faW50ZWxfY3J0YyhjcnRjKS0+Y29uZmlnLmFkanVzdGVkX21vZGU7CiAJcGxhbmVhX3dtID0gaW50ZWxfY2FsY3VsYXRlX3dtKGFkanVzdGVkX21vZGUtPmNydGNfY2xvY2ssCi0JCQkJICAgICAgICZpODMwX3dtX2luZm8sCisJCQkJICAgICAgICZpODQ1X3dtX2luZm8sCiAJCQkJICAgICAgIGRldl9wcml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUoZGV2LCAwKSwKIAkJCQkgICAgICAgNCwgbGF0ZW5jeV9ucyk7CiAJZndhdGVyX2xvID0gSTkxNV9SRUFEKEZXX0JMQykgJiB+MHhmZmY7CkBAIC0xNzAwLDQyMyArMTYzMyw2IEBACiAJSTkxNV9XUklURShGV19CTEMsIGZ3YXRlcl9sbyk7CiB9CiAKLS8qCi0gKiBDaGVjayB0aGUgd20gcmVzdWx0LgotICoKLSAqIElmIGFueSBjYWxjdWxhdGVkIHdhdGVybWFyayB2YWx1ZXMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgdGhhdAotICogY2FuIGJlIHByb2dyYW1tZWQgaW50byB0aGUgYXNzb2NpYXRlZCB3YXRlcm1hcmsgcmVnaXN0ZXIsIHRoYXQgd2F0ZXJtYXJrCi0gKiBtdXN0IGJlIGRpc2FibGVkLgotICovCi1zdGF0aWMgYm9vbCBpcm9ubGFrZV9jaGVja19zcndtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZlbCwKLQkJCQlpbnQgZmJjX3dtLCBpbnQgZGlzcGxheV93bSwgaW50IGN1cnNvcl93bSwKLQkJCQljb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKLQkJCQljb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlEUk1fREVCVUdfS01TKCJ3YXRlcm1hcmsgJWQ6IGRpc3BsYXkgcGxhbmUgJWQsIGZiYyBsaW5lcyAlZCwiCi0JCSAgICAgICIgY3Vyc29yICVkXG4iLCBsZXZlbCwgZGlzcGxheV93bSwgZmJjX3dtLCBjdXJzb3Jfd20pOwotCi0JaWYgKGZiY193bSA+IFNOQl9GQkNfTUFYX1NSV00pIHsKLQkJRFJNX0RFQlVHX0tNUygiZmJjIHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4iLAotCQkJICAgICAgZmJjX3dtLCBTTkJfRkJDX01BWF9TUldNLCBsZXZlbCk7Ci0KLQkJLyogZmJjIGhhcyBpdCdzIG93biB3YXkgdG8gZGlzYWJsZSBGQkMgV00gKi8KLQkJSTkxNV9XUklURShESVNQX0FSQl9DVEwsCi0JCQkgICBJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKSB8IERJU1BfRkJDX1dNX0RJUyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKLQkJLyogZW5hYmxlIEZCQyBXTSAoZXhjZXB0IG9uIElMSywgd2hlcmUgaXQgbXVzdCByZW1haW4gb2ZmKSAqLwotCQlJOTE1X1dSSVRFKERJU1BfQVJCX0NUTCwKLQkJCSAgIEk5MTVfUkVBRChESVNQX0FSQl9DVEwpICYgfkRJU1BfRkJDX1dNX0RJUyk7Ci0JfQotCi0JaWYgKGRpc3BsYXlfd20gPiBkaXNwbGF5LT5tYXhfd20pIHsKLQkJRFJNX0RFQlVHX0tNUygiZGlzcGxheSB3YXRlcm1hcmsoJWQpIGlzIHRvbyBsYXJnZSglZCksIGRpc2FibGluZyB3bSVkK1xuIiwKLQkJCSAgICAgIGRpc3BsYXlfd20sIFNOQl9ESVNQTEFZX01BWF9TUldNLCBsZXZlbCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoY3Vyc29yX3dtID4gY3Vyc29yLT5tYXhfd20pIHsKLQkJRFJNX0RFQlVHX0tNUygiY3Vyc29yIHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4iLAotCQkJICAgICAgY3Vyc29yX3dtLCBTTkJfQ1VSU09SX01BWF9TUldNLCBsZXZlbCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoIShmYmNfd20gfHwgZGlzcGxheV93bSB8fCBjdXJzb3Jfd20pKSB7Ci0JCURSTV9ERUJVR19LTVMoImxhdGVuY3kgJWQgaXMgMCwgZGlzYWJsaW5nIHdtJWQrXG4iLCBsZXZlbCwgbGV2ZWwpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBDb21wdXRlIHdhdGVybWFyayB2YWx1ZXMgb2YgV01bMS0zXSwKLSAqLwotc3RhdGljIGJvb2wgaXJvbmxha2VfY29tcHV0ZV9zcndtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHBsYW5lLAotCQkJCSAgaW50IGxhdGVuY3lfbnMsCi0JCQkJICBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpjdXJzb3IsCi0JCQkJICBpbnQgKmZiY193bSwgaW50ICpkaXNwbGF5X3dtLCBpbnQgKmN1cnNvcl93bSkKLXsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Ci0JY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGU7Ci0JdW5zaWduZWQgbG9uZyBsaW5lX3RpbWVfdXM7Ci0JaW50IGhkaXNwbGF5LCBodG90YWwsIHBpeGVsX3NpemUsIGNsb2NrOwotCWludCBsaW5lX2NvdW50LCBsaW5lX3NpemU7Ci0JaW50IHNtYWxsLCBsYXJnZTsKLQlpbnQgZW50cmllczsKLQotCWlmICghbGF0ZW5jeV9ucykgewotCQkqZmJjX3dtID0gKmRpc3BsYXlfd20gPSAqY3Vyc29yX3dtID0gMDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mb3JfcGxhbmUoZGV2LCBwbGFuZSk7Ci0JYWRqdXN0ZWRfbW9kZSA9ICZ0b19pbnRlbF9jcnRjKGNydGMpLT5jb25maWcuYWRqdXN0ZWRfbW9kZTsKLQljbG9jayA9IGFkanVzdGVkX21vZGUtPmNydGNfY2xvY2s7Ci0JaHRvdGFsID0gYWRqdXN0ZWRfbW9kZS0+Y3J0Y19odG90YWw7Ci0JaGRpc3BsYXkgPSB0b19pbnRlbF9jcnRjKGNydGMpLT5jb25maWcucGlwZV9zcmNfdzsKLQlwaXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKLQotCWxpbmVfdGltZV91cyA9IChodG90YWwgKiAxMDAwKSAvIGNsb2NrOwotCWxpbmVfY291bnQgPSAobGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cyArIDEwMDApIC8gMTAwMDsKLQlsaW5lX3NpemUgPSBoZGlzcGxheSAqIHBpeGVsX3NpemU7Ci0KLQkvKiBVc2UgdGhlIG1pbmltdW0gb2YgdGhlIHNtYWxsIGFuZCBsYXJnZSBidWZmZXIgbWV0aG9kIGZvciBwcmltYXJ5ICovCi0Jc21hbGwgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogbGF0ZW5jeV9ucykgLyAxMDAwOwotCWxhcmdlID0gbGluZV9jb3VudCAqIGxpbmVfc2l6ZTsKLQotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAobWluKHNtYWxsLCBsYXJnZSksIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKLQkqZGlzcGxheV93bSA9IGVudHJpZXMgKyBkaXNwbGF5LT5ndWFyZF9zaXplOwotCi0JLyoKLQkgKiBTcGVjIHNheXM6Ci0JICogRkJDIFdNID0gKChGaW5hbCBQcmltYXJ5IFdNICogNjQpIC8gbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lKSArIDIKLQkgKi8KLQkqZmJjX3dtID0gRElWX1JPVU5EX1VQKCpkaXNwbGF5X3dtICogNjQsIGxpbmVfc2l6ZSkgKyAyOwotCi0JLyogY2FsY3VsYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrIGZvciBkaXNwbGF5IGN1cnNvciAqLwotCWVudHJpZXMgPSBsaW5lX2NvdW50ICogcGl4ZWxfc2l6ZSAqIDY0OwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSk7Ci0JKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7Ci0KLQlyZXR1cm4gaXJvbmxha2VfY2hlY2tfc3J3bShkZXYsIGxldmVsLAotCQkJCSAgICpmYmNfd20sICpkaXNwbGF5X3dtLCAqY3Vyc29yX3dtLAotCQkJCSAgIGRpc3BsYXksIGN1cnNvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlyb25sYWtlX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBmYmNfd20sIHBsYW5lX3dtLCBjdXJzb3Jfd207Ci0JdW5zaWduZWQgaW50IGVuYWJsZWQ7Ci0KLQllbmFibGVkID0gMDsKLQlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgUElQRV9BLAotCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCi0JCQkgICAgZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzBdICogMTAwLAotCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCSAgICBkZXZfcHJpdi0+d20uY3VyX2xhdGVuY3lbMF0gKiAxMDAsCi0JCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewotCQlJOTE1X1dSSVRFKFdNMF9QSVBFQV9JTEssCi0JCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKLQkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEEgLSIKLQkJCSAgICAgICIgcGxhbmUgJWQsICIgImN1cnNvcjogJWRcbiIsCi0JCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKLQkJZW5hYmxlZCB8PSAxIDw8IFBJUEVfQTsKLQl9Ci0KLQlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgUElQRV9CLAotCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCi0JCQkgICAgZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzBdICogMTAwLAotCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCSAgICBkZXZfcHJpdi0+d20uY3VyX2xhdGVuY3lbMF0gKiAxMDAsCi0JCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewotCQlJOTE1X1dSSVRFKFdNMF9QSVBFQl9JTEssCi0JCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKLQkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKLQkJCSAgICAgICIgcGxhbmUgJWQsIGN1cnNvcjogJWRcbiIsCi0JCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKLQkJZW5hYmxlZCB8PSAxIDw8IFBJUEVfQjsKLQl9Ci0KLQkvKgotCSAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrIG9ubHkgd2hlbiBvbmUKLQkgKiBkaXNwbGF5IHBsYW5lIGlzIHVzZWQuCi0JICovCi0JSTkxNV9XUklURShXTTNfTFBfSUxLLCAwKTsKLQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOwotCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgMCk7Ci0KLQlpZiAoIXNpbmdsZV9wbGFuZV9lbmFibGVkKGVuYWJsZWQpKQotCQlyZXR1cm47Ci0JZW5hYmxlZCA9IGZmcyhlbmFibGVkKSAtIDE7Ci0KLQkvKiBXTTEgKi8KLQlpZiAoIWlyb25sYWtlX2NvbXB1dGVfc3J3bShkZXYsIDEsIGVuYWJsZWQsCi0JCQkJICAgZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzFdICogNTAwLAotCQkJCSAgICZpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mbywKLQkJCQkgICAmaXJvbmxha2VfY3Vyc29yX3Nyd21faW5mbywKLQkJCQkgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQotCQlyZXR1cm47Ci0KLQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssCi0JCSAgIFdNMV9MUF9TUl9FTiB8Ci0JCSAgIChkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMV0gPDwgV00xX0xQX0xBVEVOQ1lfU0hJRlQpIHwKLQkJICAgKGZiY193bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8Ci0JCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKLQkJICAgY3Vyc29yX3dtKTsKLQotCS8qIFdNMiAqLwotCWlmICghaXJvbmxha2VfY29tcHV0ZV9zcndtKGRldiwgMiwgZW5hYmxlZCwKLQkJCQkgICBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMl0gKiA1MDAsCi0JCQkJICAgJmlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCSAgICZpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLAotCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCi0JCXJldHVybjsKLQotCUk5MTVfV1JJVEUoV00yX0xQX0lMSywKLQkJICAgV00yX0xQX0VOIHwKLQkJICAgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVsyXSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAotCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwKLQkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElGVCkgfAotCQkgICBjdXJzb3Jfd20pOwotCi0JLyoKLQkgKiBXTTMgaXMgdW5zdXBwb3J0ZWQgb24gSUxLLCBwcm9iYWJseSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgbGF0ZW5jeQotCSAqIGRhdGEgZm9yIHRoYXQgcG93ZXIgc3RhdGUKLQkgKi8KLX0KLQotc3RhdGljIHZvaWQgc2FuZHlicmlkZ2VfdXBkYXRlX3dtKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGxhdGVuY3kgPSBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMF0gKiAxMDA7CS8qIEluIHVuaXQgMC4xdXMgKi8KLQl1MzIgdmFsOwotCWludCBmYmNfd20sIHBsYW5lX3dtLCBjdXJzb3Jfd207Ci0JdW5zaWduZWQgaW50IGVuYWJsZWQ7Ci0KLQllbmFibGVkID0gMDsKLQlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgUElQRV9BLAotCQkJICAgICZzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8sIGxhdGVuY3ksCi0JCQkgICAgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAotCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKLQkJdmFsID0gSTkxNV9SRUFEKFdNMF9QSVBFQV9JTEspOwotCQl2YWwgJj0gfihXTTBfUElQRV9QTEFORV9NQVNLIHwgV00wX1BJUEVfQ1VSU09SX01BU0spOwotCQlJOTE1X1dSSVRFKFdNMF9QSVBFQV9JTEssIHZhbCB8Ci0JCQkgICAoKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSkpOwotCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgotCQkJICAgICAgIiBwbGFuZSAlZCwgIiAiY3Vyc29yOiAlZFxuIiwKLQkJCSAgICAgIHBsYW5lX3dtLCBjdXJzb3Jfd20pOwotCQllbmFibGVkIHw9IDEgPDwgUElQRV9BOwotCX0KLQotCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCBQSVBFX0IsCi0JCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKLQkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCi0JCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewotCQl2YWwgPSBJOTE1X1JFQUQoV00wX1BJUEVCX0lMSyk7Ci0JCXZhbCAmPSB+KFdNMF9QSVBFX1BMQU5FX01BU0sgfCBXTTBfUElQRV9DVVJTT1JfTUFTSyk7Ci0JCUk5MTVfV1JJVEUoV00wX1BJUEVCX0lMSywgdmFsIHwKLQkJCSAgICgocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKSk7Ci0JCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBCIC0iCi0JCQkgICAgICAiIHBsYW5lICVkLCBjdXJzb3I6ICVkXG4iLAotCQkJICAgICAgcGxhbmVfd20sIGN1cnNvcl93bSk7Ci0JCWVuYWJsZWQgfD0gMSA8PCBQSVBFX0I7Ci0JfQotCi0JLyoKLQkgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgc2VsZi1yZWZyZXNoIHdhdGVybWFyayBvbmx5IHdoZW4gb25lCi0JICogZGlzcGxheSBwbGFuZSBpcyB1c2VkLgotCSAqCi0JICogU05CIHN1cHBvcnQgMyBsZXZlbHMgb2Ygd2F0ZXJtYXJrLgotCSAqCi0JICogV00xL1dNMi9XTTIgd2F0ZXJtYXJrcyBoYXZlIHRvIGJlIGVuYWJsZWQgaW4gdGhlIGFzY2VuZGluZyBvcmRlciwKLQkgKiBhbmQgZGlzYWJsZWQgaW4gdGhlIGRlc2NlbmRpbmcgb3JkZXIKLQkgKgotCSAqLwotCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7Ci0JSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKLQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOwotCi0JaWYgKCFzaW5nbGVfcGxhbmVfZW5hYmxlZChlbmFibGVkKSB8fAotCSAgICBkZXZfcHJpdi0+c3ByaXRlX3NjYWxpbmdfZW5hYmxlZCkKLQkJcmV0dXJuOwotCWVuYWJsZWQgPSBmZnMoZW5hYmxlZCkgLSAxOwotCi0JLyogV00xICovCi0JaWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAxLCBlbmFibGVkLAotCQkJCSAgIGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVsxXSAqIDUwMCwKLQkJCQkgICAmc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8sCi0JCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8sCi0JCQkJICAgJmZiY193bSwgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkKLQkJcmV0dXJuOwotCi0JSTkxNV9XUklURShXTTFfTFBfSUxLLAotCQkgICBXTTFfTFBfU1JfRU4gfAotCQkgICAoZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzFdIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8Ci0JCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAotCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8Ci0JCSAgIGN1cnNvcl93bSk7Ci0KLQkvKiBXTTIgKi8KLQlpZiAoIWlyb25sYWtlX2NvbXB1dGVfc3J3bShkZXYsIDIsIGVuYWJsZWQsCi0JCQkJICAgZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzJdICogNTAwLAotCQkJCSAgICZzYW5keWJyaWRnZV9kaXNwbGF5X3Nyd21faW5mbywKLQkJCQkgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3Nyd21faW5mbywKLQkJCQkgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQotCQlyZXR1cm47Ci0KLQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssCi0JCSAgIFdNMl9MUF9FTiB8Ci0JCSAgIChkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMl0gPDwgV00xX0xQX0xBVEVOQ1lfU0hJRlQpIHwKLQkJICAgKGZiY193bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8Ci0JCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKLQkJICAgY3Vyc29yX3dtKTsKLQotCS8qIFdNMyAqLwotCWlmICghaXJvbmxha2VfY29tcHV0ZV9zcndtKGRldiwgMywgZW5hYmxlZCwKLQkJCQkgICBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbM10gKiA1MDAsCi0JCQkJICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCSAgICZzYW5keWJyaWRnZV9jdXJzb3Jfc3J3bV9pbmZvLAotCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCi0JCXJldHVybjsKLQotCUk5MTVfV1JJVEUoV00zX0xQX0lMSywKLQkJICAgV00zX0xQX0VOIHwKLQkJICAgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVszXSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAotCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwKLQkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElGVCkgfAotCQkgICBjdXJzb3Jfd20pOwotfQotCi1zdGF0aWMgdm9pZCBpdnlicmlkZ2VfdXBkYXRlX3dtKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGxhdGVuY3kgPSBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMF0gKiAxMDA7CS8qIEluIHVuaXQgMC4xdXMgKi8KLQl1MzIgdmFsOwotCWludCBmYmNfd20sIHBsYW5lX3dtLCBjdXJzb3Jfd207Ci0JaW50IGlnbm9yZV9mYmNfd20sIGlnbm9yZV9wbGFuZV93bSwgaWdub3JlX2N1cnNvcl93bTsKLQl1bnNpZ25lZCBpbnQgZW5hYmxlZDsKLQotCWVuYWJsZWQgPSAwOwotCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCBQSVBFX0EsCi0JCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKLQkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCi0JCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewotCQl2YWwgPSBJOTE1X1JFQUQoV00wX1BJUEVBX0lMSyk7Ci0JCXZhbCAmPSB+KFdNMF9QSVBFX1BMQU5FX01BU0sgfCBXTTBfUElQRV9DVVJTT1JfTUFTSyk7Ci0JCUk5MTVfV1JJVEUoV00wX1BJUEVBX0lMSywgdmFsIHwKLQkJCSAgICgocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKSk7Ci0JCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBBIC0iCi0JCQkgICAgICAiIHBsYW5lICVkLCAiICJjdXJzb3I6ICVkXG4iLAotCQkJICAgICAgcGxhbmVfd20sIGN1cnNvcl93bSk7Ci0JCWVuYWJsZWQgfD0gMSA8PCBQSVBFX0E7Ci0JfQotCi0JaWYgKGc0eF9jb21wdXRlX3dtMChkZXYsIFBJUEVfQiwKLQkJCSAgICAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAotCQkJICAgICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKLQkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7Ci0JCXZhbCA9IEk5MTVfUkVBRChXTTBfUElQRUJfSUxLKTsKLQkJdmFsICY9IH4oV00wX1BJUEVfUExBTkVfTUFTSyB8IFdNMF9QSVBFX0NVUlNPUl9NQVNLKTsKLQkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLCB2YWwgfAotCQkJICAgKChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pKTsKLQkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKLQkJCSAgICAgICIgcGxhbmUgJWQsIGN1cnNvcjogJWRcbiIsCi0JCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKLQkJZW5hYmxlZCB8PSAxIDw8IFBJUEVfQjsKLQl9Ci0KLQlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgUElQRV9DLAotCQkJICAgICZzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8sIGxhdGVuY3ksCi0JCQkgICAgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAotCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKLQkJdmFsID0gSTkxNV9SRUFEKFdNMF9QSVBFQ19JVkIpOwotCQl2YWwgJj0gfihXTTBfUElQRV9QTEFORV9NQVNLIHwgV00wX1BJUEVfQ1VSU09SX01BU0spOwotCQlJOTE1X1dSSVRFKFdNMF9QSVBFQ19JVkIsIHZhbCB8Ci0JCQkgICAoKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSkpOwotCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQyAtIgotCQkJICAgICAgIiBwbGFuZSAlZCwgY3Vyc29yOiAlZFxuIiwKLQkJCSAgICAgIHBsYW5lX3dtLCBjdXJzb3Jfd20pOwotCQllbmFibGVkIHw9IDEgPDwgUElQRV9DOwotCX0KLQotCS8qCi0JICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgb25seSB3aGVuIG9uZQotCSAqIGRpc3BsYXkgcGxhbmUgaXMgdXNlZC4KLQkgKgotCSAqIFNOQiBzdXBwb3J0IDMgbGV2ZWxzIG9mIHdhdGVybWFyay4KLQkgKgotCSAqIFdNMS9XTTIvV00yIHdhdGVybWFya3MgaGF2ZSB0byBiZSBlbmFibGVkIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIsCi0JICogYW5kIGRpc2FibGVkIGluIHRoZSBkZXNjZW5kaW5nIG9yZGVyCi0JICoKLQkgKi8KLQlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOwotCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7Ci0JSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKLQotCWlmICghc2luZ2xlX3BsYW5lX2VuYWJsZWQoZW5hYmxlZCkgfHwKLQkgICAgZGV2X3ByaXYtPnNwcml0ZV9zY2FsaW5nX2VuYWJsZWQpCi0JCXJldHVybjsKLQllbmFibGVkID0gZmZzKGVuYWJsZWQpIC0gMTsKLQotCS8qIFdNMSAqLwotCWlmICghaXJvbmxha2VfY29tcHV0ZV9zcndtKGRldiwgMSwgZW5hYmxlZCwKLQkJCQkgICBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMV0gKiA1MDAsCi0JCQkJICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCSAgICZzYW5keWJyaWRnZV9jdXJzb3Jfc3J3bV9pbmZvLAotCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCi0JCXJldHVybjsKLQotCUk5MTVfV1JJVEUoV00xX0xQX0lMSywKLQkJICAgV00xX0xQX1NSX0VOIHwKLQkJICAgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVsxXSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAotCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwKLQkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElGVCkgfAotCQkgICBjdXJzb3Jfd20pOwotCi0JLyogV00yICovCi0JaWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAyLCBlbmFibGVkLAotCQkJCSAgIGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVsyXSAqIDUwMCwKLQkJCQkgICAmc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8sCi0JCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8sCi0JCQkJICAgJmZiY193bSwgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkKLQkJcmV0dXJuOwotCi0JSTkxNV9XUklURShXTTJfTFBfSUxLLAotCQkgICBXTTJfTFBfRU4gfAotCQkgICAoZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzJdIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8Ci0JCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAotCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8Ci0JCSAgIGN1cnNvcl93bSk7Ci0KLQkvKiBXTTMsIG5vdGUgd2UgaGF2ZSB0byBjb3JyZWN0IHRoZSBjdXJzb3IgbGF0ZW5jeSAqLwotCWlmICghaXJvbmxha2VfY29tcHV0ZV9zcndtKGRldiwgMywgZW5hYmxlZCwKLQkJCQkgICBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbM10gKiA1MDAsCi0JCQkJICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCSAgICZzYW5keWJyaWRnZV9jdXJzb3Jfc3J3bV9pbmZvLAotCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmlnbm9yZV9jdXJzb3Jfd20pIHx8Ci0JICAgICFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAzLCBlbmFibGVkLAotCQkJCSAgIGRldl9wcml2LT53bS5jdXJfbGF0ZW5jeVszXSAqIDUwMCwKLQkJCQkgICAmc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8sCi0JCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8sCi0JCQkJICAgJmlnbm9yZV9mYmNfd20sICZpZ25vcmVfcGxhbmVfd20sICZjdXJzb3Jfd20pKQotCQlyZXR1cm47Ci0KLQlJOTE1X1dSSVRFKFdNM19MUF9JTEssCi0JCSAgIFdNM19MUF9FTiB8Ci0JCSAgIChkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbM10gPDwgV00xX0xQX0xBVEVOQ1lfU0hJRlQpIHwKLQkJICAgKGZiY193bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8Ci0JCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKLQkJICAgY3Vyc29yX3dtKTsKLX0KLQogc3RhdGljIHVpbnQzMl90IGlsa19waXBlX3BpeGVsX3JhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRybV9jcnRjICpjcnRjKQogewpAQCAtMjE4NSw3ICsxNzAxLDcgQEAKIAlyZXR1cm4gRElWX1JPVU5EX1VQKHByaV92YWwgKiA2NCwgaG9yaXpfcGl4ZWxzICogYnl0ZXNfcGVyX3BpeGVsKSArIDI7CiB9CiAKLXN0cnVjdCBoc3dfcGlwZV93bV9wYXJhbWV0ZXJzIHsKK3N0cnVjdCBpbGtfcGlwZV93bV9wYXJhbWV0ZXJzIHsKIAlib29sIGFjdGl2ZTsKIAl1aW50MzJfdCBwaXBlX2h0b3RhbDsKIAl1aW50MzJfdCBwaXhlbF9yYXRlOwpAQCAtMjE5NCw3ICsxNzEwLDcgQEAKIAlzdHJ1Y3QgaW50ZWxfcGxhbmVfd21fcGFyYW1ldGVycyBjdXI7CiB9OwogCi1zdHJ1Y3QgaHN3X3dtX21heGltdW1zIHsKK3N0cnVjdCBpbGtfd21fbWF4aW11bXMgewogCXVpbnQxNl90IHByaTsKIAl1aW50MTZfdCBzcHI7CiAJdWludDE2X3QgY3VyOwpAQCAtMjIxMiw3ICsxNzI4LDcgQEAKICAqIEZvciBib3RoIFdNX1BJUEUgYW5kIFdNX0xQLgogICogbWVtX3ZhbHVlIG11c3QgYmUgaW4gMC4xdXMgdW5pdHMuCiAgKi8KLXN0YXRpYyB1aW50MzJfdCBpbGtfY29tcHV0ZV9wcmlfd20oY29uc3Qgc3RydWN0IGhzd19waXBlX3dtX3BhcmFtZXRlcnMgKnBhcmFtcywKK3N0YXRpYyB1aW50MzJfdCBpbGtfY29tcHV0ZV9wcmlfd20oY29uc3Qgc3RydWN0IGlsa19waXBlX3dtX3BhcmFtZXRlcnMgKnBhcmFtcywKIAkJCQkgICB1aW50MzJfdCBtZW1fdmFsdWUsCiAJCQkJICAgYm9vbCBpc19scCkKIHsKQEAgLTIyNDEsNyArMTc1Nyw3IEBACiAgKiBGb3IgYm90aCBXTV9QSVBFIGFuZCBXTV9MUC4KICAqIG1lbV92YWx1ZSBtdXN0IGJlIGluIDAuMXVzIHVuaXRzLgogICovCi1zdGF0aWMgdWludDMyX3QgaWxrX2NvbXB1dGVfc3ByX3dtKGNvbnN0IHN0cnVjdCBoc3dfcGlwZV93bV9wYXJhbWV0ZXJzICpwYXJhbXMsCitzdGF0aWMgdWludDMyX3QgaWxrX2NvbXB1dGVfc3ByX3dtKGNvbnN0IHN0cnVjdCBpbGtfcGlwZV93bV9wYXJhbWV0ZXJzICpwYXJhbXMsCiAJCQkJICAgdWludDMyX3QgbWVtX3ZhbHVlKQogewogCXVpbnQzMl90IG1ldGhvZDEsIG1ldGhvZDI7CkBAIC0yMjY0LDcgKzE3ODAsNyBAQAogICogRm9yIGJvdGggV01fUElQRSBhbmQgV01fTFAuCiAgKiBtZW1fdmFsdWUgbXVzdCBiZSBpbiAwLjF1cyB1bml0cy4KICAqLwotc3RhdGljIHVpbnQzMl90IGlsa19jb21wdXRlX2N1cl93bShjb25zdCBzdHJ1Y3QgaHN3X3BpcGVfd21fcGFyYW1ldGVycyAqcGFyYW1zLAorc3RhdGljIHVpbnQzMl90IGlsa19jb21wdXRlX2N1cl93bShjb25zdCBzdHJ1Y3QgaWxrX3BpcGVfd21fcGFyYW1ldGVycyAqcGFyYW1zLAogCQkJCSAgIHVpbnQzMl90IG1lbV92YWx1ZSkKIHsKIAlpZiAoIXBhcmFtcy0+YWN0aXZlIHx8ICFwYXJhbXMtPmN1ci5lbmFibGVkKQpAQCAtMjI3OCw3ICsxNzk0LDcgQEAKIH0KIAogLyogT25seSBmb3IgV01fTFAuICovCi1zdGF0aWMgdWludDMyX3QgaWxrX2NvbXB1dGVfZmJjX3dtKGNvbnN0IHN0cnVjdCBoc3dfcGlwZV93bV9wYXJhbWV0ZXJzICpwYXJhbXMsCitzdGF0aWMgdWludDMyX3QgaWxrX2NvbXB1dGVfZmJjX3dtKGNvbnN0IHN0cnVjdCBpbGtfcGlwZV93bV9wYXJhbWV0ZXJzICpwYXJhbXMsCiAJCQkJICAgdWludDMyX3QgcHJpX3ZhbCkKIHsKIAlpZiAoIXBhcmFtcy0+YWN0aXZlIHx8ICFwYXJhbXMtPnByaS5lbmFibGVkKQpAQCAtMjM4Myw3ICsxODk5LDcgQEAKIAkJCQkgICAgaW50IGxldmVsLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfd21fY29uZmlnICpjb25maWcsCiAJCQkJICAgIGVudW0gaW50ZWxfZGRiX3BhcnRpdGlvbmluZyBkZGJfcGFydGl0aW9uaW5nLAotCQkJCSAgICBzdHJ1Y3QgaHN3X3dtX21heGltdW1zICptYXgpCisJCQkJICAgIHN0cnVjdCBpbGtfd21fbWF4aW11bXMgKm1heCkKIHsKIAltYXgtPnByaSA9IGlsa19wbGFuZV93bV9tYXgoZGV2LCBsZXZlbCwgY29uZmlnLCBkZGJfcGFydGl0aW9uaW5nLCBmYWxzZSk7CiAJbWF4LT5zcHIgPSBpbGtfcGxhbmVfd21fbWF4KGRldiwgbGV2ZWwsIGNvbmZpZywgZGRiX3BhcnRpdGlvbmluZywgdHJ1ZSk7CkBAIC0yMzkyLDcgKzE5MDgsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBpbGtfdmFsaWRhdGVfd21fbGV2ZWwoaW50IGxldmVsLAotCQkJCSAgY29uc3Qgc3RydWN0IGhzd193bV9tYXhpbXVtcyAqbWF4LAorCQkJCSAgY29uc3Qgc3RydWN0IGlsa193bV9tYXhpbXVtcyAqbWF4LAogCQkJCSAgc3RydWN0IGludGVsX3dtX2xldmVsICpyZXN1bHQpCiB7CiAJYm9vbCByZXQ7CkBAIC0yNDM0LDcgKzE5NTAsNyBAQAogCiBzdGF0aWMgdm9pZCBpbGtfY29tcHV0ZV93bV9sZXZlbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkJIGludCBsZXZlbCwKLQkJCQkgY29uc3Qgc3RydWN0IGhzd19waXBlX3dtX3BhcmFtZXRlcnMgKnAsCisJCQkJIGNvbnN0IHN0cnVjdCBpbGtfcGlwZV93bV9wYXJhbWV0ZXJzICpwLAogCQkJCSBzdHJ1Y3QgaW50ZWxfd21fbGV2ZWwgKnJlc3VsdCkKIHsKIAl1aW50MTZfdCBwcmlfbGF0ZW5jeSA9IGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVtsZXZlbF07CkBAIC0yNDgyLDcgKzE5OTgsNyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoSVNfSEFTV0VMTChkZXYpKSB7CisJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkgewogCQl1aW50NjRfdCBzc2twZCA9IEk5MTVfUkVBRDY0KE1DSF9TU0tQRCk7CiAKIAkJd21bMF0gPSAoc3NrcGQgPj4gNTYpICYgMHhGRjsKQEAgLTI1MzAsNyArMjA0Niw3IEBACiBzdGF0aWMgaW50IGlsa193bV9tYXhfbGV2ZWwoY29uc3Qgc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAkvKiBob3cgbWFueSBXTSBsZXZlbHMgYXJlIHdlIGV4cGVjdGluZyAqLwotCWlmIChJU19IQVNXRUxMKGRldikpCisJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkKIAkJcmV0dXJuIDQ7CiAJZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikKIAkJcmV0dXJuIDM7CkBAIC0yNTgyLDggKzIwOTgsOCBAQAogCWludGVsX3ByaW50X3dtX2xhdGVuY3koZGV2LCAiQ3Vyc29yIiwgZGV2X3ByaXYtPndtLmN1cl9sYXRlbmN5KTsKIH0KIAotc3RhdGljIHZvaWQgaHN3X2NvbXB1dGVfd21fcGFyYW1ldGVycyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJICAgICAgc3RydWN0IGhzd19waXBlX3dtX3BhcmFtZXRlcnMgKnAsCitzdGF0aWMgdm9pZCBpbGtfY29tcHV0ZV93bV9wYXJhbWV0ZXJzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgICBzdHJ1Y3QgaWxrX3BpcGVfd21fcGFyYW1ldGVycyAqcCwKIAkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfd21fY29uZmlnICpjb25maWcpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTI1OTMsNyArMjEwOSw3IEBACiAKIAlwLT5hY3RpdmUgPSBpbnRlbF9jcnRjX2FjdGl2ZShjcnRjKTsKIAlpZiAocC0+YWN0aXZlKSB7Ci0JCXAtPnBpcGVfaHRvdGFsID0gaW50ZWxfY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGUuaHRvdGFsOworCQlwLT5waXBlX2h0b3RhbCA9IGludGVsX2NydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlLmNydGNfaHRvdGFsOwogCQlwLT5waXhlbF9yYXRlID0gaWxrX3BpcGVfcGl4ZWxfcmF0ZShkZXYsIGNydGMpOwogCQlwLT5wcmkuYnl0ZXNfcGVyX3BpeGVsID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKIAkJcC0+Y3VyLmJ5dGVzX3Blcl9waXhlbCA9IDQ7CkBAIC0yNjIwLDcgKzIxMzYsNyBAQAogCiAvKiBDb21wdXRlIG5ldyB3YXRlcm1hcmtzIGZvciB0aGUgcGlwZSAqLwogc3RhdGljIGJvb2wgaW50ZWxfY29tcHV0ZV9waXBlX3dtKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgIGNvbnN0IHN0cnVjdCBoc3dfcGlwZV93bV9wYXJhbWV0ZXJzICpwYXJhbXMsCisJCQkJICBjb25zdCBzdHJ1Y3QgaWxrX3BpcGVfd21fcGFyYW1ldGVycyAqcGFyYW1zLAogCQkJCSAgc3RydWN0IGludGVsX3BpcGVfd20gKnBpcGVfd20pCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTI2MzIsMTYgKzIxNDgsMjUgQEAKIAkJLnNwcml0ZXNfZW5hYmxlZCA9IHBhcmFtcy0+c3ByLmVuYWJsZWQsCiAJCS5zcHJpdGVzX3NjYWxlZCA9IHBhcmFtcy0+c3ByLnNjYWxlZCwKIAl9OwotCXN0cnVjdCBoc3dfd21fbWF4aW11bXMgbWF4OworCXN0cnVjdCBpbGtfd21fbWF4aW11bXMgbWF4OwogCiAJLyogTFAwIHdhdGVybWFya3MgYWx3YXlzIHVzZSAxLzIgRERCIHBhcnRpdGlvbmluZyAqLwogCWlsa19jb21wdXRlX3dtX21heGltdW1zKGRldiwgMCwgJmNvbmZpZywgSU5URUxfRERCX1BBUlRfMV8yLCAmbWF4KTsKIAorCS8qIElMSy9TTkI6IExQMisgd2F0ZXJtYXJrcyBvbmx5IHcvbyBzcHJpdGVzICovCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDYgJiYgcGFyYW1zLT5zcHIuZW5hYmxlZCkKKwkJbWF4X2xldmVsID0gMTsKKworCS8qIElMSy9TTkIvSVZCOiBMUDErIHdhdGVybWFya3Mgb25seSB3L28gc2NhbGluZyAqLworCWlmIChwYXJhbXMtPnNwci5zY2FsZWQpCisJCW1heF9sZXZlbCA9IDA7CisKIAlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4X2xldmVsOyBsZXZlbCsrKQogCQlpbGtfY29tcHV0ZV93bV9sZXZlbChkZXZfcHJpdiwgbGV2ZWwsIHBhcmFtcywKIAkJCQkgICAgICZwaXBlX3dtLT53bVtsZXZlbF0pOwogCi0JcGlwZV93bS0+bGluZXRpbWUgPSBoc3dfY29tcHV0ZV9saW5ldGltZV93bShkZXYsIGNydGMpOworCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCisJCXBpcGVfd20tPmxpbmV0aW1lID0gaHN3X2NvbXB1dGVfbGluZXRpbWVfd20oZGV2LCBjcnRjKTsKIAogCS8qIEF0IGxlYXN0IExQMCBtdXN0IGJlIHZhbGlkICovCiAJcmV0dXJuIGlsa192YWxpZGF0ZV93bV9sZXZlbCgwLCAmbWF4LCAmcGlwZV93bS0+d21bMF0pOwpAQCAtMjY3NiwxMiArMjIwMSwxOSBAQAogICogTWVyZ2UgYWxsIGxvdyBwb3dlciB3YXRlcm1hcmtzIGZvciBhbGwgYWN0aXZlIHBpcGVzLgogICovCiBzdGF0aWMgdm9pZCBpbGtfd21fbWVyZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBjb25zdCBzdHJ1Y3QgaHN3X3dtX21heGltdW1zICptYXgsCisJCQkgY29uc3Qgc3RydWN0IGludGVsX3dtX2NvbmZpZyAqY29uZmlnLAorCQkJIGNvbnN0IHN0cnVjdCBpbGtfd21fbWF4aW11bXMgKm1heCwKIAkJCSBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqbWVyZ2VkKQogewogCWludCBsZXZlbCwgbWF4X2xldmVsID0gaWxrX3dtX21heF9sZXZlbChkZXYpOwogCi0JbWVyZ2VkLT5mYmNfd21fZW5hYmxlZCA9IHRydWU7CisJLyogSUxLL1NOQi9JVkI6IExQMSsgd2F0ZXJtYXJrcyBvbmx5IHcvIHNpbmdsZSBwaXBlICovCisJaWYgKChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA2IHx8IElTX0lWWUJSSURHRShkZXYpKSAmJgorCSAgICBjb25maWctPm51bV9waXBlc19hY3RpdmUgPiAxKQorCQlyZXR1cm47CisKKwkvKiBJTEs6IEZCQyBXTSBtdXN0IGJlIGRpc2FibGVkIGFsd2F5cyAqLworCW1lcmdlZC0+ZmJjX3dtX2VuYWJsZWQgPSBJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2OwogCiAJLyogbWVyZ2UgZWFjaCBXTTErIGxldmVsICovCiAJZm9yIChsZXZlbCA9IDE7IGxldmVsIDw9IG1heF9sZXZlbDsgbGV2ZWwrKykgewpAQCAtMjcwMSw2ICsyMjMzLDIwIEBACiAJCQl3bS0+ZmJjX3ZhbCA9IDA7CiAJCX0KIAl9CisKKwkvKiBJTEs6IExQMisgbXVzdCBiZSBkaXNhYmxlZCB3aGVuIEZCQyBXTSBpcyBkaXNhYmxlZCBidXQgRkJDIGVuYWJsZWQgKi8KKwkvKgorCSAqIEZJWE1FIHRoaXMgaXMgcmFjeS4gRkJDIG1pZ2h0IGdldCBlbmFibGVkIGxhdGVyLgorCSAqIFdoYXQgd2Ugc2hvdWxkIGNoZWNrIGhlcmUgaXMgd2hldGhlciBGQkMgY2FuIGJlCisJICogZW5hYmxlZCBzb21ldGltZSBsYXRlci4KKwkgKi8KKwlpZiAoSVNfR0VONShkZXYpICYmICFtZXJnZWQtPmZiY193bV9lbmFibGVkICYmIGludGVsX2ZiY19lbmFibGVkKGRldikpIHsKKwkJZm9yIChsZXZlbCA9IDI7IGxldmVsIDw9IG1heF9sZXZlbDsgbGV2ZWwrKykgeworCQkJc3RydWN0IGludGVsX3dtX2xldmVsICp3bSA9ICZtZXJnZWQtPndtW2xldmVsXTsKKworCQkJd20tPmVuYWJsZSA9IGZhbHNlOworCQl9CisJfQogfQogCiBzdGF0aWMgaW50IGlsa193bV9scF90b19sZXZlbChpbnQgd21fbHAsIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlX3dtICpwaXBlX3dtKQpAQCAtMjcwOSwxMCArMjI1NSwyMSBAQAogCXJldHVybiB3bV9scCArICh3bV9scCA+PSAyICYmIHBpcGVfd20tPndtWzRdLmVuYWJsZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGhzd19jb21wdXRlX3dtX3Jlc3VsdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKy8qIFRoZSB2YWx1ZSB3ZSBuZWVkIHRvIHByb2dyYW0gaW50byB0aGUgV01fTFB4IGxhdGVuY3kgZmllbGQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWxrX3dtX2xwX2xhdGVuY3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGxldmVsKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQorCQlyZXR1cm4gMiAqIGxldmVsOworCWVsc2UKKwkJcmV0dXJuIGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVtsZXZlbF07Cit9CisKK3N0YXRpYyB2b2lkIGlsa19jb21wdXRlX3dtX3Jlc3VsdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqbWVyZ2VkLAogCQkJCSAgIGVudW0gaW50ZWxfZGRiX3BhcnRpdGlvbmluZyBwYXJ0aXRpb25pbmcsCi0JCQkJICAgc3RydWN0IGhzd193bV92YWx1ZXMgKnJlc3VsdHMpCisJCQkJICAgc3RydWN0IGlsa193bV92YWx1ZXMgKnJlc3VsdHMpCiB7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CiAJaW50IGxldmVsLCB3bV9scDsKQEAgLTI3MzEsNyArMjI4OCw3IEBACiAJCQlicmVhazsKIAogCQlyZXN1bHRzLT53bV9scFt3bV9scCAtIDFdID0gV00zX0xQX0VOIHwKLQkJCSgobGV2ZWwgKiAyKSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAorCQkJKGlsa193bV9scF9sYXRlbmN5KGRldiwgbGV2ZWwpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CiAJCQkoci0+cHJpX3ZhbCA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKIAkJCXItPmN1cl92YWw7CiAKQEAgLTI3NDIsNyArMjI5OSwxMSBAQAogCQkJcmVzdWx0cy0+d21fbHBbd21fbHAgLSAxXSB8PQogCQkJCXItPmZiY192YWwgPDwgV00xX0xQX0ZCQ19TSElGVDsKIAotCQlyZXN1bHRzLT53bV9scF9zcHJbd21fbHAgLSAxXSA9IHItPnNwcl92YWw7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA2ICYmIHItPnNwcl92YWwpIHsKKwkJCVdBUk5fT04od21fbHAgIT0gMSk7CisJCQlyZXN1bHRzLT53bV9scF9zcHJbd21fbHAgLSAxXSA9IFdNMVNfTFBfRU4gfCByLT5zcHJfdmFsOworCQl9IGVsc2UKKwkJCXJlc3VsdHMtPndtX2xwX3Nwclt3bV9scCAtIDFdID0gci0+c3ByX3ZhbDsKIAl9CiAKIAkvKiBMUDAgcmVnaXN0ZXIgdmFsdWVzICovCkBAIC0yNzY1LDcgKzIzMjYsNyBAQAogCiAvKiBGaW5kIHRoZSByZXN1bHQgd2l0aCB0aGUgaGlnaGVzdCBsZXZlbCBlbmFibGVkLiBDaGVjayBmb3IgZW5hYmxlX2ZiY193bSBpbgogICogY2FzZSBib3RoIGFyZSBhdCB0aGUgc2FtZSBsZXZlbC4gUHJlZmVyIHIxIGluIGNhc2UgdGhleSdyZSB0aGUgc2FtZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqaHN3X2ZpbmRfYmVzdF9yZXN1bHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqaWxrX2ZpbmRfYmVzdF9yZXN1bHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJCSAgc3RydWN0IGludGVsX3BpcGVfd20gKnIxLAogCQkJCQkJICBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqcjIpCiB7CkBAIC0yODAwLDggKzIzNjEsOCBAQAogI2RlZmluZSBXTV9ESVJUWV9EREIgKDEgPDwgMjUpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaWxrX2NvbXB1dGVfd21fZGlydHkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBoc3dfd21fdmFsdWVzICpvbGQsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgaHN3X3dtX3ZhbHVlcyAqbmV3KQorCQkJCQkgY29uc3Qgc3RydWN0IGlsa193bV92YWx1ZXMgKm9sZCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBpbGtfd21fdmFsdWVzICpuZXcpCiB7CiAJdW5zaWduZWQgaW50IGRpcnR5ID0gMDsKIAllbnVtIHBpcGUgcGlwZTsKQEAgLTI4NTEsMjcgKzI0MTIsNTMgQEAKIAlyZXR1cm4gZGlydHk7CiB9CiAKK3N0YXRpYyBib29sIF9pbGtfZGlzYWJsZV9scF93bShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRpcnR5KQoreworCXN0cnVjdCBpbGtfd21fdmFsdWVzICpwcmV2aW91cyA9ICZkZXZfcHJpdi0+d20uaHc7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKwlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgzKSAmJiBwcmV2aW91cy0+d21fbHBbMl0gJiBXTTFfTFBfU1JfRU4pIHsKKwkJcHJldmlvdXMtPndtX2xwWzJdICY9IH5XTTFfTFBfU1JfRU47CisJCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgcHJldmlvdXMtPndtX2xwWzJdKTsKKwkJY2hhbmdlZCA9IHRydWU7CisJfQorCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDIpICYmIHByZXZpb3VzLT53bV9scFsxXSAmIFdNMV9MUF9TUl9FTikgeworCQlwcmV2aW91cy0+d21fbHBbMV0gJj0gfldNMV9MUF9TUl9FTjsKKwkJSTkxNV9XUklURShXTTJfTFBfSUxLLCBwcmV2aW91cy0+d21fbHBbMV0pOworCQljaGFuZ2VkID0gdHJ1ZTsKKwl9CisJaWYgKGRpcnR5ICYgV01fRElSVFlfTFAoMSkgJiYgcHJldmlvdXMtPndtX2xwWzBdICYgV00xX0xQX1NSX0VOKSB7CisJCXByZXZpb3VzLT53bV9scFswXSAmPSB+V00xX0xQX1NSX0VOOworCQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIHByZXZpb3VzLT53bV9scFswXSk7CisJCWNoYW5nZWQgPSB0cnVlOworCX0KKworCS8qCisJICogRG9uJ3QgdG91Y2ggV00xU19MUF9FTiBoZXJlLgorCSAqIERvaW5nIHNvIGNvdWxkIGNhdXNlIHVuZGVycnVucy4KKwkgKi8KKworCXJldHVybiBjaGFuZ2VkOworfQorCiAvKgogICogVGhlIHNwZWMgc2F5cyB3ZSBzaG91bGRuJ3Qgd3JpdGUgd2hlbiB3ZSBkb24ndCBuZWVkLCBiZWNhdXNlIGV2ZXJ5IHdyaXRlCiAgKiBjYXVzZXMgV01zIHRvIGJlIHJlLWV2YWx1YXRlZCwgZXhwZW5kaW5nIHNvbWUgcG93ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGhzd193cml0ZV93bV92YWx1ZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCXN0cnVjdCBoc3dfd21fdmFsdWVzICpyZXN1bHRzKQorc3RhdGljIHZvaWQgaWxrX3dyaXRlX3dtX3ZhbHVlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IGlsa193bV92YWx1ZXMgKnJlc3VsdHMpCiB7Ci0Jc3RydWN0IGhzd193bV92YWx1ZXMgKnByZXZpb3VzID0gJmRldl9wcml2LT53bS5odzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3QgaWxrX3dtX3ZhbHVlcyAqcHJldmlvdXMgPSAmZGV2X3ByaXYtPndtLmh3OwogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAl1aW50MzJfdCB2YWw7CiAKLQlkaXJ0eSA9IGlsa19jb21wdXRlX3dtX2RpcnR5KGRldl9wcml2LT5kZXYsIHByZXZpb3VzLCByZXN1bHRzKTsKKwlkaXJ0eSA9IGlsa19jb21wdXRlX3dtX2RpcnR5KGRldiwgcHJldmlvdXMsIHJlc3VsdHMpOwogCWlmICghZGlydHkpCiAJCXJldHVybjsKIAotCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDMpICYmIHByZXZpb3VzLT53bV9scFsyXSAhPSAwKQotCQlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOwotCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDIpICYmIHByZXZpb3VzLT53bV9scFsxXSAhPSAwKQotCQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOwotCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDEpICYmIHByZXZpb3VzLT53bV9scFswXSAhPSAwKQotCQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOworCV9pbGtfZGlzYWJsZV9scF93bShkZXZfcHJpdiwgZGlydHkpOwogCiAJaWYgKGRpcnR5ICYgV01fRElSVFlfUElQRShQSVBFX0EpKQogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQV9JTEssIHJlc3VsdHMtPndtX3BpcGVbMF0pOwpAQCAtMjg4OCwxMiArMjQ3NSwyMSBAQAogCQlJOTE1X1dSSVRFKFBJUEVfV01fTElORVRJTUUoUElQRV9DKSwgcmVzdWx0cy0+d21fbGluZXRpbWVbMl0pOwogCiAJaWYgKGRpcnR5ICYgV01fRElSVFlfRERCKSB7Ci0JCXZhbCA9IEk5MTVfUkVBRChXTV9NSVNDKTsKLQkJaWYgKHJlc3VsdHMtPnBhcnRpdGlvbmluZyA9PSBJTlRFTF9EREJfUEFSVF8xXzIpCi0JCQl2YWwgJj0gfldNX01JU0NfREFUQV9QQVJUSVRJT05fNV82OwotCQllbHNlCi0JCQl2YWwgfD0gV01fTUlTQ19EQVRBX1BBUlRJVElPTl81XzY7Ci0JCUk5MTVfV1JJVEUoV01fTUlTQywgdmFsKTsKKwkJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkgeworCQkJdmFsID0gSTkxNV9SRUFEKFdNX01JU0MpOworCQkJaWYgKHJlc3VsdHMtPnBhcnRpdGlvbmluZyA9PSBJTlRFTF9EREJfUEFSVF8xXzIpCisJCQkJdmFsICY9IH5XTV9NSVNDX0RBVEFfUEFSVElUSU9OXzVfNjsKKwkJCWVsc2UKKwkJCQl2YWwgfD0gV01fTUlTQ19EQVRBX1BBUlRJVElPTl81XzY7CisJCQlJOTE1X1dSSVRFKFdNX01JU0MsIHZhbCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBJOTE1X1JFQUQoRElTUF9BUkJfQ1RMMik7CisJCQlpZiAocmVzdWx0cy0+cGFydGl0aW9uaW5nID09IElOVEVMX0REQl9QQVJUXzFfMikKKwkJCQl2YWwgJj0gfkRJU1BfREFUQV9QQVJUSVRJT05fNV82OworCQkJZWxzZQorCQkJCXZhbCB8PSBESVNQX0RBVEFfUEFSVElUSU9OXzVfNjsKKwkJCUk5MTVfV1JJVEUoRElTUF9BUkJfQ1RMMiwgdmFsKTsKKwkJfQogCX0KIAogCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0ZCQykgewpAQCAtMjkwNSwzNyArMjUwMSw0OCBAQAogCQlJOTE1X1dSSVRFKERJU1BfQVJCX0NUTCwgdmFsKTsKIAl9CiAKLQlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgxKSAmJiBwcmV2aW91cy0+d21fbHBfc3ByWzBdICE9IHJlc3VsdHMtPndtX2xwX3NwclswXSkKKwlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgxKSAmJgorCSAgICBwcmV2aW91cy0+d21fbHBfc3ByWzBdICE9IHJlc3VsdHMtPndtX2xwX3NwclswXSkKIAkJSTkxNV9XUklURShXTTFTX0xQX0lMSywgcmVzdWx0cy0+d21fbHBfc3ByWzBdKTsKLQlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgyKSAmJiBwcmV2aW91cy0+d21fbHBfc3ByWzFdICE9IHJlc3VsdHMtPndtX2xwX3NwclsxXSkKLQkJSTkxNV9XUklURShXTTJTX0xQX0lWQiwgcmVzdWx0cy0+d21fbHBfc3ByWzFdKTsKLQlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgzKSAmJiBwcmV2aW91cy0+d21fbHBfc3ByWzJdICE9IHJlc3VsdHMtPndtX2xwX3NwclsyXSkKLQkJSTkxNV9XUklURShXTTNTX0xQX0lWQiwgcmVzdWx0cy0+d21fbHBfc3ByWzJdKTsKIAotCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDEpICYmIHJlc3VsdHMtPndtX2xwWzBdICE9IDApCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDcpIHsKKwkJaWYgKGRpcnR5ICYgV01fRElSVFlfTFAoMikgJiYgcHJldmlvdXMtPndtX2xwX3NwclsxXSAhPSByZXN1bHRzLT53bV9scF9zcHJbMV0pCisJCQlJOTE1X1dSSVRFKFdNMlNfTFBfSVZCLCByZXN1bHRzLT53bV9scF9zcHJbMV0pOworCQlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgzKSAmJiBwcmV2aW91cy0+d21fbHBfc3ByWzJdICE9IHJlc3VsdHMtPndtX2xwX3NwclsyXSkKKwkJCUk5MTVfV1JJVEUoV00zU19MUF9JVkIsIHJlc3VsdHMtPndtX2xwX3NwclsyXSk7CisJfQorCisJaWYgKGRpcnR5ICYgV01fRElSVFlfTFAoMSkgJiYgcHJldmlvdXMtPndtX2xwWzBdICE9IHJlc3VsdHMtPndtX2xwWzBdKQogCQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIHJlc3VsdHMtPndtX2xwWzBdKTsKLQlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgyKSAmJiByZXN1bHRzLT53bV9scFsxXSAhPSAwKQorCWlmIChkaXJ0eSAmIFdNX0RJUlRZX0xQKDIpICYmIHByZXZpb3VzLT53bV9scFsxXSAhPSByZXN1bHRzLT53bV9scFsxXSkKIAkJSTkxNV9XUklURShXTTJfTFBfSUxLLCByZXN1bHRzLT53bV9scFsxXSk7Ci0JaWYgKGRpcnR5ICYgV01fRElSVFlfTFAoMykgJiYgcmVzdWx0cy0+d21fbHBbMl0gIT0gMCkKKwlpZiAoZGlydHkgJiBXTV9ESVJUWV9MUCgzKSAmJiBwcmV2aW91cy0+d21fbHBbMl0gIT0gcmVzdWx0cy0+d21fbHBbMl0pCiAJCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgcmVzdWx0cy0+d21fbHBbMl0pOwogCiAJZGV2X3ByaXYtPndtLmh3ID0gKnJlc3VsdHM7CiB9CiAKLXN0YXRpYyB2b2lkIGhhc3dlbGxfdXBkYXRlX3dtKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyBib29sIGlsa19kaXNhYmxlX2xwX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiBfaWxrX2Rpc2FibGVfbHBfd20oZGV2X3ByaXYsIFdNX0RJUlRZX0xQX0FMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGlsa191cGRhdGVfd20oc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGhzd193bV9tYXhpbXVtcyBtYXg7Ci0Jc3RydWN0IGhzd19waXBlX3dtX3BhcmFtZXRlcnMgcGFyYW1zID0ge307Ci0Jc3RydWN0IGhzd193bV92YWx1ZXMgcmVzdWx0cyA9IHt9OworCXN0cnVjdCBpbGtfd21fbWF4aW11bXMgbWF4OworCXN0cnVjdCBpbGtfcGlwZV93bV9wYXJhbWV0ZXJzIHBhcmFtcyA9IHt9OworCXN0cnVjdCBpbGtfd21fdmFsdWVzIHJlc3VsdHMgPSB7fTsKIAllbnVtIGludGVsX2RkYl9wYXJ0aXRpb25pbmcgcGFydGl0aW9uaW5nOwogCXN0cnVjdCBpbnRlbF9waXBlX3dtIHBpcGVfd20gPSB7fTsKIAlzdHJ1Y3QgaW50ZWxfcGlwZV93bSBscF93bV8xXzIgPSB7fSwgbHBfd21fNV82ID0ge30sICpiZXN0X2xwX3dtOwogCXN0cnVjdCBpbnRlbF93bV9jb25maWcgY29uZmlnID0ge307CiAKLQloc3dfY29tcHV0ZV93bV9wYXJhbWV0ZXJzKGNydGMsICZwYXJhbXMsICZjb25maWcpOworCWlsa19jb21wdXRlX3dtX3BhcmFtZXRlcnMoY3J0YywgJnBhcmFtcywgJmNvbmZpZyk7CiAKIAlpbnRlbF9jb21wdXRlX3BpcGVfd20oY3J0YywgJnBhcmFtcywgJnBpcGVfd20pOwogCkBAIC0yOTQ1LDE1ICsyNTUyLDE1IEBACiAJaW50ZWxfY3J0Yy0+d20uYWN0aXZlID0gcGlwZV93bTsKIAogCWlsa19jb21wdXRlX3dtX21heGltdW1zKGRldiwgMSwgJmNvbmZpZywgSU5URUxfRERCX1BBUlRfMV8yLCAmbWF4KTsKLQlpbGtfd21fbWVyZ2UoZGV2LCAmbWF4LCAmbHBfd21fMV8yKTsKKwlpbGtfd21fbWVyZ2UoZGV2LCAmY29uZmlnLCAmbWF4LCAmbHBfd21fMV8yKTsKIAogCS8qIDUvNiBzcGxpdCBvbmx5IGluIHNpbmdsZSBwaXBlIGNvbmZpZyBvbiBJVkIrICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDcgJiYKIAkgICAgY29uZmlnLm51bV9waXBlc19hY3RpdmUgPT0gMSAmJiBjb25maWcuc3ByaXRlc19lbmFibGVkKSB7CiAJCWlsa19jb21wdXRlX3dtX21heGltdW1zKGRldiwgMSwgJmNvbmZpZywgSU5URUxfRERCX1BBUlRfNV82LCAmbWF4KTsKLQkJaWxrX3dtX21lcmdlKGRldiwgJm1heCwgJmxwX3dtXzVfNik7CisJCWlsa193bV9tZXJnZShkZXYsICZjb25maWcsICZtYXgsICZscF93bV81XzYpOwogCi0JCWJlc3RfbHBfd20gPSBoc3dfZmluZF9iZXN0X3Jlc3VsdChkZXYsICZscF93bV8xXzIsICZscF93bV81XzYpOworCQliZXN0X2xwX3dtID0gaWxrX2ZpbmRfYmVzdF9yZXN1bHQoZGV2LCAmbHBfd21fMV8yLCAmbHBfd21fNV82KTsKIAl9IGVsc2UgewogCQliZXN0X2xwX3dtID0gJmxwX3dtXzFfMjsKIAl9CkBAIC0yOTYxLDE2ICsyNTY4LDE3IEBACiAJcGFydGl0aW9uaW5nID0gKGJlc3RfbHBfd20gPT0gJmxwX3dtXzFfMikgPwogCQkgICAgICAgSU5URUxfRERCX1BBUlRfMV8yIDogSU5URUxfRERCX1BBUlRfNV82OwogCi0JaHN3X2NvbXB1dGVfd21fcmVzdWx0cyhkZXYsIGJlc3RfbHBfd20sIHBhcnRpdGlvbmluZywgJnJlc3VsdHMpOworCWlsa19jb21wdXRlX3dtX3Jlc3VsdHMoZGV2LCBiZXN0X2xwX3dtLCBwYXJ0aXRpb25pbmcsICZyZXN1bHRzKTsKIAotCWhzd193cml0ZV93bV92YWx1ZXMoZGV2X3ByaXYsICZyZXN1bHRzKTsKKwlpbGtfd3JpdGVfd21fdmFsdWVzKGRldl9wcml2LCAmcmVzdWx0cyk7CiB9CiAKLXN0YXRpYyB2b2lkIGhhc3dlbGxfdXBkYXRlX3Nwcml0ZV93bShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKK3N0YXRpYyB2b2lkIGlsa191cGRhdGVfc3ByaXRlX3dtKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAogCQkJCSAgICAgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJCSAgICAgdWludDMyX3Qgc3ByaXRlX3dpZHRoLCBpbnQgcGl4ZWxfc2l6ZSwKIAkJCQkgICAgIGJvb2wgZW5hYmxlZCwgYm9vbCBzY2FsZWQpCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBsYW5lLT5kZXY7CiAJc3RydWN0IGludGVsX3BsYW5lICppbnRlbF9wbGFuZSA9IHRvX2ludGVsX3BsYW5lKHBsYW5lKTsKIAogCWludGVsX3BsYW5lLT53bS5lbmFibGVkID0gZW5hYmxlZDsKQEAgLTI5NzgsMTc2ICsyNTg2LDI0IEBACiAJaW50ZWxfcGxhbmUtPndtLmhvcml6X3BpeGVscyA9IHNwcml0ZV93aWR0aDsKIAlpbnRlbF9wbGFuZS0+d20uYnl0ZXNfcGVyX3BpeGVsID0gcGl4ZWxfc2l6ZTsKIAotCWhhc3dlbGxfdXBkYXRlX3dtKGNydGMpOwotfQorCS8qCisJICogSVZCIHdvcmthcm91bmQ6IG11c3QgZGlzYWJsZSBsb3cgcG93ZXIgd2F0ZXJtYXJrcyBmb3IgYXQgbGVhc3QKKwkgKiBvbmUgZnJhbWUgYmVmb3JlIGVuYWJsaW5nIHNjYWxpbmcuICBMUCB3YXRlcm1hcmtzIGNhbiBiZSByZS1lbmFibGVkCisJICogd2hlbiBzY2FsaW5nIGlzIGRpc2FibGVkLgorCSAqCisJICogV2FDeFNSRGlzYWJsZWRGb3JTcHJpdGVTY2FsaW5nOml2YgorCSAqLworCWlmIChJU19JVllCUklER0UoZGV2KSAmJiBzY2FsZWQgJiYgaWxrX2Rpc2FibGVfbHBfd20oZGV2KSkKKwkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgaW50ZWxfcGxhbmUtPnBpcGUpOwogCi1zdGF0aWMgYm9vbAotc2FuZHlicmlkZ2VfY29tcHV0ZV9zcHJpdGVfd20oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lLAotCQkJICAgICAgdWludDMyX3Qgc3ByaXRlX3dpZHRoLCBpbnQgcGl4ZWxfc2l6ZSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAotCQkJICAgICAgaW50IGRpc3BsYXlfbGF0ZW5jeV9ucywgaW50ICpzcHJpdGVfd20pCi17Ci0Jc3RydWN0IGRybV9jcnRjICpjcnRjOwotCWludCBjbG9jazsKLQlpbnQgZW50cmllcywgdGxiX21pc3M7Ci0KLQljcnRjID0gaW50ZWxfZ2V0X2NydGNfZm9yX3BsYW5lKGRldiwgcGxhbmUpOwotCWlmICghaW50ZWxfY3J0Y19hY3RpdmUoY3J0YykpIHsKLQkJKnNwcml0ZV93bSA9IGRpc3BsYXktPmd1YXJkX3NpemU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQljbG9jayA9IHRvX2ludGVsX2NydGMoY3J0YyktPmNvbmZpZy5hZGp1c3RlZF9tb2RlLmNydGNfY2xvY2s7Ci0KLQkvKiBVc2UgdGhlIHNtYWxsIGJ1ZmZlciBtZXRob2QgdG8gY2FsY3VsYXRlIHRoZSBzcHJpdGUgd2F0ZXJtYXJrICovCi0JZW50cmllcyA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBkaXNwbGF5X2xhdGVuY3lfbnMpIC8gMTAwMDsKLQl0bGJfbWlzcyA9IGRpc3BsYXktPmZpZm9fc2l6ZSpkaXNwbGF5LT5jYWNoZWxpbmVfc2l6ZSAtCi0JCXNwcml0ZV93aWR0aCAqIDg7Ci0JaWYgKHRsYl9taXNzID4gMCkKLQkJZW50cmllcyArPSB0bGJfbWlzczsKLQllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKLQkqc3ByaXRlX3dtID0gZW50cmllcyArIGRpc3BsYXktPmd1YXJkX3NpemU7Ci0JaWYgKCpzcHJpdGVfd20gPiAoaW50KWRpc3BsYXktPm1heF93bSkKLQkJKnNwcml0ZV93bSA9IGRpc3BsYXktPm1heF93bTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2FuZHlicmlkZ2VfY29tcHV0ZV9zcHJpdGVfc3J3bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmUsCi0JCQkJdWludDMyX3Qgc3ByaXRlX3dpZHRoLCBpbnQgcGl4ZWxfc2l6ZSwKLQkJCQljb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKLQkJCQlpbnQgbGF0ZW5jeV9ucywgaW50ICpzcHJpdGVfd20pCi17Ci0Jc3RydWN0IGRybV9jcnRjICpjcnRjOwotCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3VzOwotCWludCBjbG9jazsKLQlpbnQgbGluZV9jb3VudCwgbGluZV9zaXplOwotCWludCBzbWFsbCwgbGFyZ2U7Ci0JaW50IGVudHJpZXM7Ci0KLQlpZiAoIWxhdGVuY3lfbnMpIHsKLQkJKnNwcml0ZV93bSA9IDA7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQljcnRjID0gaW50ZWxfZ2V0X2NydGNfZm9yX3BsYW5lKGRldiwgcGxhbmUpOwotCWNsb2NrID0gdG9faW50ZWxfY3J0YyhjcnRjKS0+Y29uZmlnLmFkanVzdGVkX21vZGUuY3J0Y19jbG9jazsKLQlpZiAoIWNsb2NrKSB7Ci0JCSpzcHJpdGVfd20gPSAwOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JbGluZV90aW1lX3VzID0gKHNwcml0ZV93aWR0aCAqIDEwMDApIC8gY2xvY2s7Ci0JaWYgKCFsaW5lX3RpbWVfdXMpIHsKLQkJKnNwcml0ZV93bSA9IDA7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlsaW5lX2NvdW50ID0gKGxhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKSAvIDEwMDA7Ci0JbGluZV9zaXplID0gc3ByaXRlX3dpZHRoICogcGl4ZWxfc2l6ZTsKLQotCS8qIFVzZSB0aGUgbWluaW11bSBvZiB0aGUgc21hbGwgYW5kIGxhcmdlIGJ1ZmZlciBtZXRob2QgZm9yIHByaW1hcnkgKi8KLQlzbWFsbCA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBsYXRlbmN5X25zKSAvIDEwMDA7Ci0JbGFyZ2UgPSBsaW5lX2NvdW50ICogbGluZV9zaXplOwotCi0JZW50cmllcyA9IERJVl9ST1VORF9VUChtaW4oc21hbGwsIGxhcmdlKSwgZGlzcGxheS0+Y2FjaGVsaW5lX3NpemUpOwotCSpzcHJpdGVfd20gPSBlbnRyaWVzICsgZGlzcGxheS0+Z3VhcmRfc2l6ZTsKLQotCXJldHVybiAqc3ByaXRlX3dtID4gMHgzZmYgPyBmYWxzZSA6IHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNhbmR5YnJpZGdlX3VwZGF0ZV9zcHJpdGVfd20oc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCi0JCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJCSB1aW50MzJfdCBzcHJpdGVfd2lkdGgsIGludCBwaXhlbF9zaXplLAotCQkJCQkgYm9vbCBlbmFibGVkLCBib29sIHNjYWxlZCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGxhbmUtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBwaXBlID0gdG9faW50ZWxfcGxhbmUocGxhbmUpLT5waXBlOwotCWludCBsYXRlbmN5ID0gZGV2X3ByaXYtPndtLnNwcl9sYXRlbmN5WzBdICogMTAwOwkvKiBJbiB1bml0IDAuMXVzICovCi0JdTMyIHZhbDsKLQlpbnQgc3ByaXRlX3dtLCByZWc7Ci0JaW50IHJldDsKLQotCWlmICghZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChwaXBlKSB7Ci0JY2FzZSAwOgotCQlyZWcgPSBXTTBfUElQRUFfSUxLOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXJlZyA9IFdNMF9QSVBFQl9JTEs7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJcmVnID0gV00wX1BJUEVDX0lWQjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOyAvKiBiYWQgcGlwZSAqLwotCX0KLQotCXJldCA9IHNhbmR5YnJpZGdlX2NvbXB1dGVfc3ByaXRlX3dtKGRldiwgcGlwZSwgc3ByaXRlX3dpZHRoLCBwaXhlbF9zaXplLAotCQkJCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywKLQkJCQkJICAgIGxhdGVuY3ksICZzcHJpdGVfd20pOwotCWlmICghcmV0KSB7Ci0JCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBjb21wdXRlIHNwcml0ZSB3bSBmb3IgcGlwZSAlY1xuIiwKLQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2YWwgPSBJOTE1X1JFQUQocmVnKTsKLQl2YWwgJj0gfldNMF9QSVBFX1NQUklURV9NQVNLOwotCUk5MTVfV1JJVEUocmVnLCB2YWwgfCAoc3ByaXRlX3dtIDw8IFdNMF9QSVBFX1NQUklURV9TSElGVCkpOwotCURSTV9ERUJVR19LTVMoInNwcml0ZSB3YXRlcm1hcmtzIEZvciBwaXBlICVjIC0gJWRcbiIsIHBpcGVfbmFtZShwaXBlKSwgc3ByaXRlX3dtKTsKLQotCi0JcmV0ID0gc2FuZHlicmlkZ2VfY29tcHV0ZV9zcHJpdGVfc3J3bShkZXYsIHBpcGUsIHNwcml0ZV93aWR0aCwKLQkJCQkJICAgICAgcGl4ZWxfc2l6ZSwKLQkJCQkJICAgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCQkgICAgICBkZXZfcHJpdi0+d20uc3ByX2xhdGVuY3lbMV0gKiA1MDAsCi0JCQkJCSAgICAgICZzcHJpdGVfd20pOwotCWlmICghcmV0KSB7Ci0JCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBjb21wdXRlIHNwcml0ZSBscDEgd20gb24gcGlwZSAlY1xuIiwKLQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7Ci0JCXJldHVybjsKLQl9Ci0JSTkxNV9XUklURShXTTFTX0xQX0lMSywgc3ByaXRlX3dtKTsKLQotCS8qIE9ubHkgSVZCIGhhcyB0d28gbW9yZSBMUCB3YXRlcm1hcmtzIGZvciBzcHJpdGUgKi8KLQlpZiAoIUlTX0lWWUJSSURHRShkZXYpKQotCQlyZXR1cm47Ci0KLQlyZXQgPSBzYW5keWJyaWRnZV9jb21wdXRlX3Nwcml0ZV9zcndtKGRldiwgcGlwZSwgc3ByaXRlX3dpZHRoLAotCQkJCQkgICAgICBwaXhlbF9zaXplLAotCQkJCQkgICAgICAmc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8sCi0JCQkJCSAgICAgIGRldl9wcml2LT53bS5zcHJfbGF0ZW5jeVsyXSAqIDUwMCwKLQkJCQkJICAgICAgJnNwcml0ZV93bSk7Ci0JaWYgKCFyZXQpIHsKLQkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIGNvbXB1dGUgc3ByaXRlIGxwMiB3bSBvbiBwaXBlICVjXG4iLAotCQkJICAgICAgcGlwZV9uYW1lKHBpcGUpKTsKLQkJcmV0dXJuOwotCX0KLQlJOTE1X1dSSVRFKFdNMlNfTFBfSVZCLCBzcHJpdGVfd20pOwotCi0JcmV0ID0gc2FuZHlicmlkZ2VfY29tcHV0ZV9zcHJpdGVfc3J3bShkZXYsIHBpcGUsIHNwcml0ZV93aWR0aCwKLQkJCQkJICAgICAgcGl4ZWxfc2l6ZSwKLQkJCQkJICAgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAotCQkJCQkgICAgICBkZXZfcHJpdi0+d20uc3ByX2xhdGVuY3lbM10gKiA1MDAsCi0JCQkJCSAgICAgICZzcHJpdGVfd20pOwotCWlmICghcmV0KSB7Ci0JCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBjb21wdXRlIHNwcml0ZSBscDMgd20gb24gcGlwZSAlY1xuIiwKLQkJCSAgICAgIHBpcGVfbmFtZShwaXBlKSk7Ci0JCXJldHVybjsKLQl9Ci0JSTkxNV9XUklURShXTTNTX0xQX0lWQiwgc3ByaXRlX3dtKTsKKwlpbGtfdXBkYXRlX3dtKGNydGMpOwogfQogCiBzdGF0aWMgdm9pZCBpbGtfcGlwZV93bV9nZXRfaHdfc3RhdGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaHN3X3dtX3ZhbHVlcyAqaHcgPSAmZGV2X3ByaXYtPndtLmh3OworCXN0cnVjdCBpbGtfd21fdmFsdWVzICpodyA9ICZkZXZfcHJpdi0+d20uaHc7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF9waXBlX3dtICphY3RpdmUgPSAmaW50ZWxfY3J0Yy0+d20uYWN0aXZlOwogCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKQEAgLTMxNTgsNyArMjYxNCw4IEBACiAJfTsKIAogCWh3LT53bV9waXBlW3BpcGVdID0gSTkxNV9SRUFEKHdtMF9waXBlX3JlZ1twaXBlXSk7Ci0JaHctPndtX2xpbmV0aW1lW3BpcGVdID0gSTkxNV9SRUFEKFBJUEVfV01fTElORVRJTUUocGlwZSkpOworCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCisJCWh3LT53bV9saW5ldGltZVtwaXBlXSA9IEk5MTVfUkVBRChQSVBFX1dNX0xJTkVUSU1FKHBpcGUpKTsKIAogCWlmIChpbnRlbF9jcnRjX2FjdGl2ZShjcnRjKSkgewogCQl1MzIgdG1wID0gaHctPndtX3BpcGVbcGlwZV07CkBAIC0zMTkwLDcgKzI2NDcsNyBAQAogdm9pZCBpbGtfd21fZ2V0X2h3X3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaHN3X3dtX3ZhbHVlcyAqaHcgPSAmZGV2X3ByaXYtPndtLmh3OworCXN0cnVjdCBpbGtfd21fdmFsdWVzICpodyA9ICZkZXZfcHJpdi0+d20uaHc7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCkBAIC0zMjA0LDggKzI2NjEsMTIgQEAKIAlody0+d21fbHBfc3ByWzFdID0gSTkxNV9SRUFEKFdNMlNfTFBfSVZCKTsKIAlody0+d21fbHBfc3ByWzJdID0gSTkxNV9SRUFEKFdNM1NfTFBfSVZCKTsKIAotCWh3LT5wYXJ0aXRpb25pbmcgPSAoSTkxNV9SRUFEKFdNX01JU0MpICYgV01fTUlTQ19EQVRBX1BBUlRJVElPTl81XzYpID8KLQkJSU5URUxfRERCX1BBUlRfNV82IDogSU5URUxfRERCX1BBUlRfMV8yOworCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCisJCWh3LT5wYXJ0aXRpb25pbmcgPSAoSTkxNV9SRUFEKFdNX01JU0MpICYgV01fTUlTQ19EQVRBX1BBUlRJVElPTl81XzYpID8KKwkJCUlOVEVMX0REQl9QQVJUXzVfNiA6IElOVEVMX0REQl9QQVJUXzFfMjsKKwllbHNlIGlmIChJU19JVllCUklER0UoZGV2KSkKKwkJaHctPnBhcnRpdGlvbmluZyA9IChJOTE1X1JFQUQoRElTUF9BUkJfQ1RMMikgJiBESVNQX0RBVEFfUEFSVElUSU9OXzVfNikgPworCQkJSU5URUxfRERCX1BBUlRfNV82IDogSU5URUxfRERCX1BBUlRfMV8yOwogCiAJaHctPmVuYWJsZV9mYmNfd20gPQogCQkhKEk5MTVfUkVBRChESVNQX0FSQl9DVEwpICYgRElTUF9GQkNfV01fRElTKTsKQEAgLTM0MzAsMjYgKzI4OTEsMTkgQEAKICAqIG91cnNlbHZlcywgaW5zdGVhZCBvZiBkb2luZyBhIHJtdyBjeWNsZSAod2hpY2ggbWlnaHQgcmVzdWx0IGluIHVzIGNsZWFyaW5nCiAgKiBhbGwgbGltaXRzIGFuZCB0aGUgZ3B1IHN0dWNrIGF0IHdoYXRldmVyIGZyZXF1ZW5jeSBpdCBpcyBhdCBhdG0pLgogICovCi1zdGF0aWMgdTMyIGdlbjZfcnBzX2xpbWl0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHU4ICp2YWwpCitzdGF0aWMgdTMyIGdlbjZfcnBzX2xpbWl0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHU4IHZhbCkKIHsKIAl1MzIgbGltaXRzOwogCi0JbGltaXRzID0gMDsKLQotCWlmICgqdmFsID49IGRldl9wcml2LT5ycHMubWF4X2RlbGF5KQotCQkqdmFsID0gZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXk7Ci0JbGltaXRzIHw9IGRldl9wcml2LT5ycHMubWF4X2RlbGF5IDw8IDI0OwotCiAJLyogT25seSBzZXQgdGhlIGRvd24gbGltaXQgd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBsb3dlc3QgbGV2ZWwgdG8gYXZvaWQKIAkgKiBnZXR0aW5nIG1vcmUgaW50ZXJydXB0cywgb3RoZXJ3aXNlIGxlYXZlIHRoaXMgY2xlYXIuIFRoaXMgcHJldmVudHMgYQogCSAqIHJhY2UgaW4gdGhlIGh3IHdoZW4gY29taW5nIG91dCBvZiByYzY6IFRoZXJlJ3MgYSB0aW55IHdpbmRvdyB3aGVyZQogCSAqIHRoZSBodyBydW5zIGF0IHRoZSBtaW5pbWFsIGNsb2NrIGJlZm9yZSBzZWxlY3RpbmcgdGhlIGRlc2lyZWQKIAkgKiBmcmVxdWVuY3ksIGlmIHRoZSBkb3duIHRocmVzaG9sZCBleHBpcmVzIGluIHRoYXQgd2luZG93IHdlIHdpbGwgbm90CiAJICogcmVjZWl2ZSBhIGRvd24gaW50ZXJydXB0LiAqLwotCWlmICgqdmFsIDw9IGRldl9wcml2LT5ycHMubWluX2RlbGF5KSB7Ci0JCSp2YWwgPSBkZXZfcHJpdi0+cnBzLm1pbl9kZWxheTsKKwlsaW1pdHMgPSBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSA8PCAyNDsKKwlpZiAodmFsIDw9IGRldl9wcml2LT5ycHMubWluX2RlbGF5KQogCQlsaW1pdHMgfD0gZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkgPDwgMTY7Ci0JfQogCiAJcmV0dXJuIGxpbWl0czsKIH0KQEAgLTM1NDksNyArMzAwMyw2IEBACiB2b2lkIGdlbjZfc2V0X3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgbGltaXRzID0gZ2VuNl9ycHNfbGltaXRzKGRldl9wcml2LCAmdmFsKTsKIAogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2X3ByaXYtPnJwcy5od19sb2NrKSk7CiAJV0FSTl9PTih2YWwgPiBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CkBAIC0zNTcyLDcgKzMwMjUsOCBAQAogCS8qIE1ha2Ugc3VyZSB3ZSBjb250aW51ZSB0byBnZXQgaW50ZXJydXB0cwogCSAqIHVudGlsIHdlIGhpdCB0aGUgbWluaW11bSBvciBtYXhpbXVtIGZyZXF1ZW5jaWVzLgogCSAqLwotCUk5MTVfV1JJVEUoR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTLCBsaW1pdHMpOworCUk5MTVfV1JJVEUoR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTLAorCQkgICBnZW42X3Jwc19saW1pdHMoZGV2X3ByaXYsIHZhbCkpOwogCiAJUE9TVElOR19SRUFEKEdFTjZfUlBOU1dSRVEpOwogCkBAIC0zNTgzLDkgKzMwMzcsMTEgQEAKIAogdm9pZCBnZW42X3Jwc19pZGxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwogCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAJaWYgKGRldl9wcml2LT5ycHMuZW5hYmxlZCkgewotCQlpZiAoZGV2X3ByaXYtPmluZm8tPmlzX3ZhbGxleXZpZXcpCisJCWlmIChJU19WQUxMRVlWSUVXKGRldikpCiAJCQl2YWxsZXl2aWV3X3NldF9ycHMoZGV2X3ByaXYtPmRldiwgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkpOwogCQllbHNlCiAJCQlnZW42X3NldF9ycHMoZGV2X3ByaXYtPmRldiwgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkpOwpAQCAtMzU5Niw5ICszMDUyLDExIEBACiAKIHZvaWQgZ2VuNl9ycHNfYm9vc3Qoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAlpZiAoZGV2X3ByaXYtPnJwcy5lbmFibGVkKSB7Ci0JCWlmIChkZXZfcHJpdi0+aW5mby0+aXNfdmFsbGV5dmlldykKKwkJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkKIAkJCXZhbGxleXZpZXdfc2V0X3JwcyhkZXZfcHJpdi0+ZGV2LCBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CiAJCWVsc2UKIAkJCWdlbjZfc2V0X3JwcyhkZXZfcHJpdi0+ZGV2LCBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CkBAIC0zNjA3LDQ4ICszMDY1LDE4IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogfQogCi0vKgotICogV2FpdCB1bnRpbCB0aGUgcHJldmlvdXMgZnJlcSBjaGFuZ2UgaGFzIGNvbXBsZXRlZCwKLSAqIG9yIHRoZSB0aW1lb3V0IGVsYXBzZWQsIGFuZCB0aGVuIHVwZGF0ZSBvdXIgbm90aW9uCi0gKiBvZiB0aGUgY3VycmVudCBHUFUgZnJlcXVlbmN5LgotICovCi1zdGF0aWMgdm9pZCB2bHZfdXBkYXRlX3Jwc19jdXJfZGVsYXkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXUzMiBwdmFsOwotCi0JV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spKTsKLQotCWlmICh3YWl0X2ZvcigoKHB2YWwgPSB2bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0dQVV9GUkVRX1NUUykpICYgR0VORlJFUVNUQVRVUykgPT0gMCwgMTApKQotCQlEUk1fREVCVUdfRFJJVkVSKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgUHVuaXRcbiIpOwotCi0JcHZhbCA+Pj0gODsKLQotCWlmIChwdmFsICE9IGRldl9wcml2LT5ycHMuY3VyX2RlbGF5KQotCQlEUk1fREVCVUdfRFJJVkVSKCJQdW5pdCBvdmVycm9kZSBHUFUgZnJlcTogJWQgTUh6ICgldSkgcmVxdWVzdGVkLCBidXQgZ290ICVkIE1oeiAoJXUpXG4iLAotCQkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLCBkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSksCi0JCQkJIGRldl9wcml2LT5ycHMuY3VyX2RlbGF5LAotCQkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLCBwdmFsKSwgcHZhbCk7Ci0KLQlkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSA9IHB2YWw7Ci19Ci0KIHZvaWQgdmFsbGV5dmlld19zZXRfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IHZhbCkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JZ2VuNl9ycHNfbGltaXRzKGRldl9wcml2LCAmdmFsKTsKLQogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2X3ByaXYtPnJwcy5od19sb2NrKSk7CiAJV0FSTl9PTih2YWwgPiBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSk7CiAJV0FSTl9PTih2YWwgPCBkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSk7CiAKLQl2bHZfdXBkYXRlX3Jwc19jdXJfZGVsYXkoZGV2X3ByaXYpOwotCiAJRFJNX0RFQlVHX0RSSVZFUigiR1BVIGZyZXEgcmVxdWVzdCBmcm9tICVkIE1IeiAoJXUpIHRvICVkIE1IeiAoJXUpXG4iLAotCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsCi0JCQkJICAgICAgZGV2X3ByaXYtPnJwcy5jdXJfZGVsYXkpLAorCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5jdXJfZGVsYXkpLAogCQkJIGRldl9wcml2LT5ycHMuY3VyX2RlbGF5LAotCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsIHZhbCksIHZhbCk7CisJCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCB2YWwpLCB2YWwpOwogCiAJaWYgKHZhbCA9PSBkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSkKIAkJcmV0dXJuOwpAQCAtMzY1Nyw3ICszMDg1LDcgQEAKIAogCWRldl9wcml2LT5ycHMuY3VyX2RlbGF5ID0gdmFsOwogCi0JdHJhY2VfaW50ZWxfZ3B1X2ZyZXFfY2hhbmdlKHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsIHZhbCkpOworCXRyYWNlX2ludGVsX2dwdV9mcmVxX2NoYW5nZSh2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIHZhbCkpOwogfQogCiBzdGF0aWMgdm9pZCBnZW42X2Rpc2FibGVfcnBzX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTM3NzUsNyArMzIwMyw3IEBACiAKIAkvKiAxYyAmIDFkOiBHZXQgZm9yY2V3YWtlIGR1cmluZyBwcm9ncmFtIHNlcXVlbmNlLiBBbHRob3VnaCB0aGUgZHJpdmVyCiAJICogaGFzbid0IGVuYWJsZWQgYSBzdGF0ZSB5ZXQgd2hlcmUgd2UgbmVlZCBmb3JjZXdha2UsIEJJT1MgbWF5IGhhdmUuKi8KLQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKwlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAogCS8qIDJhOiBEaXNhYmxlIFJDIHN0YXRlcy4gKi8KIAlJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwgMCk7CkBAIC0zODMyLDcgKzMyNjAsNyBAQAogCiAJZ2VuNl9lbmFibGVfcnBzX2ludGVycnVwdHMoZGV2KTsKIAotCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogfQogCiBzdGF0aWMgdm9pZCBnZW42X2VuYWJsZV9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTM4NjIsNyArMzI5MCw3IEBACiAJCUk5MTVfV1JJVEUoR1RGSUZPREJHLCBndGZpZm9kYmcpOwogCX0KIAotCWdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOworCWdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogCiAJcnBfc3RhdGVfY2FwID0gSTkxNV9SRUFEKEdFTjZfUlBfU1RBVEVfQ0FQKTsKIAlndF9wZXJmX3N0YXR1cyA9IEk5MTVfUkVBRChHRU42X0dUX1BFUkZfU1RBVFVTKTsKQEAgLTM5NTQsNyArMzM4Miw3IEBACiAJCQlEUk1fRVJST1IoIkNvdWxkbid0IGZpeCBpbmNvcnJlY3QgcmM2IHZvbHRhZ2VcbiIpOwogCX0KIAotCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogfQogCiB2b2lkIGdlbjZfdXBkYXRlX3JpbmdfZnJlcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtNDExNiw3ICszNTQ0LDggQEAKIAogCXZhbGxleXZpZXdfc2V0dXBfcGN0eChkZXYpOwogCi0JZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CisJLyogSWYgVkxWLCBGb3JjZXdha2UgYWxsIHdlbGxzLCBlbHNlIHJlLWRpcmVjdCB0byByZWd1bGFyIHBhdGggKi8KKwlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAogCUk5MTVfV1JJVEUoR0VONl9SUF9VUF9USFJFU0hPTEQsIDU5NDAwKTsKIAlJOTE1X1dSSVRFKEdFTjZfUlBfRE9XTl9USFJFU0hPTEQsIDI0NTAwMCk7CkBAIC00MTQwLDcgKzM1NjksNyBAQAogCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpCiAJCUk5MTVfV1JJVEUoUklOR19NQVhfSURMRShyaW5nLT5tbWlvX2Jhc2UpLCAxMCk7CiAKLQlJOTE1X1dSSVRFKEdFTjZfUkM2X1RIUkVTSE9MRCwgMHhjMzUwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkM2X1RIUkVTSE9MRCwgMHg1NTcpOwogCiAJLyogYWxsb3dzIFJDNiByZXNpZGVuY3kgY291bnRlciB0byB3b3JrICovCiAJSTkxNV9XUklURShWTFZfQ09VTlRFUl9DT05UUk9MLApAQCAtNDE0OCw2NSArMzU3Nyw0NyBAQAogCQkJCSAgICAgIFZMVl9NRURJQV9SQzZfQ09VTlRfRU4gfAogCQkJCSAgICAgIFZMVl9SRU5ERVJfUkM2X0NPVU5UX0VOKSk7CiAJaWYgKGludGVsX2VuYWJsZV9yYzYoZGV2KSAmIElOVEVMX1JDNl9FTkFCTEUpCi0JCXJjNl9tb2RlID0gR0VON19SQ19DVExfVE9fTU9ERTsKKwkJcmM2X21vZGUgPSBHRU43X1JDX0NUTF9UT19NT0RFIHwgVkxWX1JDX0NUTF9DVFhfUlNUX1BBUkFMTEVMOwogCiAJaW50ZWxfcHJpbnRfcmM2X2luZm8oZGV2LCByYzZfbW9kZSk7CiAKIAlJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwgcmM2X21vZGUpOwogCiAJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19HUFVfRlJFUV9TVFMpOwotCXN3aXRjaCAoKHZhbCA+PiA2KSAmIDMpIHsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCQlkZXZfcHJpdi0+bWVtX2ZyZXEgPSA4MDA7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGV2X3ByaXYtPm1lbV9mcmVxID0gMTA2NjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlkZXZfcHJpdi0+bWVtX2ZyZXEgPSAxMzMzOwotCQlicmVhazsKLQl9Ci0JRFJNX0RFQlVHX0RSSVZFUigiRERSIHNwZWVkOiAlZCBNSHoiLCBkZXZfcHJpdi0+bWVtX2ZyZXEpOwogCiAJRFJNX0RFQlVHX0RSSVZFUigiR1BMTCBlbmFibGVkPyAlc1xuIiwgdmFsICYgMHgxMCA/ICJ5ZXMiIDogIm5vIik7CiAJRFJNX0RFQlVHX0RSSVZFUigiR1BVIHN0YXR1czogMHglMDh4XG4iLCB2YWwpOwogCiAJZGV2X3ByaXYtPnJwcy5jdXJfZGVsYXkgPSAodmFsID4+IDgpICYgMHhmZjsKIAlEUk1fREVCVUdfRFJJVkVSKCJjdXJyZW50IEdQVSBmcmVxOiAlZCBNSHogKCV1KVxuIiwKLQkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLAotCQkJCSAgICAgIGRldl9wcml2LT5ycHMuY3VyX2RlbGF5KSwKKwkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIGRldl9wcml2LT5ycHMuY3VyX2RlbGF5KSwKIAkJCSBkZXZfcHJpdi0+cnBzLmN1cl9kZWxheSk7CiAKIAlkZXZfcHJpdi0+cnBzLm1heF9kZWxheSA9IHZhbGxleXZpZXdfcnBzX21heF9mcmVxKGRldl9wcml2KTsKIAlkZXZfcHJpdi0+cnBzLmh3X21heCA9IGRldl9wcml2LT5ycHMubWF4X2RlbGF5OwogCURSTV9ERUJVR19EUklWRVIoIm1heCBHUFUgZnJlcTogJWQgTUh6ICgldSlcbiIsCi0JCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LT5tZW1fZnJlcSwKLQkJCQkgICAgICBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSksCisJCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLm1heF9kZWxheSksCiAJCQkgZGV2X3ByaXYtPnJwcy5tYXhfZGVsYXkpOwogCiAJZGV2X3ByaXYtPnJwcy5ycGVfZGVsYXkgPSB2YWxsZXl2aWV3X3Jwc19ycGVfZnJlcShkZXZfcHJpdik7CiAJRFJNX0RFQlVHX0RSSVZFUigiUlBlIEdQVSBmcmVxOiAlZCBNSHogKCV1KVxuIiwKLQkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYtPm1lbV9mcmVxLAotCQkJCSAgICAgIGRldl9wcml2LT5ycHMucnBlX2RlbGF5KSwKKwkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIGRldl9wcml2LT5ycHMucnBlX2RlbGF5KSwKIAkJCSBkZXZfcHJpdi0+cnBzLnJwZV9kZWxheSk7CiAKIAlkZXZfcHJpdi0+cnBzLm1pbl9kZWxheSA9IHZhbGxleXZpZXdfcnBzX21pbl9mcmVxKGRldl9wcml2KTsKIAlEUk1fREVCVUdfRFJJVkVSKCJtaW4gR1BVIGZyZXE6ICVkIE1IeiAoJXUpXG4iLAotCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdi0+bWVtX2ZyZXEsCi0JCQkJICAgICAgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkpLAorCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5taW5fZGVsYXkpLAogCQkJIGRldl9wcml2LT5ycHMubWluX2RlbGF5KTsKIAogCURSTV9ERUJVR19EUklWRVIoInNldHRpbmcgR1BVIGZyZXEgdG8gJWQgTUh6ICgldSlcbiIsCi0JCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LT5tZW1fZnJlcSwKLQkJCQkgICAgICBkZXZfcHJpdi0+cnBzLnJwZV9kZWxheSksCisJCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLnJwZV9kZWxheSksCiAJCQkgZGV2X3ByaXYtPnJwcy5ycGVfZGVsYXkpOwogCiAJdmFsbGV5dmlld19zZXRfcnBzKGRldl9wcml2LT5kZXYsIGRldl9wcml2LT5ycHMucnBlX2RlbGF5KTsKIAogCWdlbjZfZW5hYmxlX3Jwc19pbnRlcnJ1cHRzKGRldik7CiAKLQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIH0KIAogdm9pZCBpcm9ubGFrZV90ZWFyZG93bl9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTUwMTksNiArNDQzMCwyMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaWxrX2luaXRfbHBfd2F0ZXJtYXJrcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFKFdNM19MUF9JTEssIEk5MTVfUkVBRChXTTNfTFBfSUxLKSAmIH5XTTFfTFBfU1JfRU4pOworCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgSTkxNV9SRUFEKFdNMl9MUF9JTEspICYgfldNMV9MUF9TUl9FTik7CisJSTkxNV9XUklURShXTTFfTFBfSUxLLCBJOTE1X1JFQUQoV00xX0xQX0lMSykgJiB+V00xX0xQX1NSX0VOKTsKKworCS8qCisJICogRG9uJ3QgdG91Y2ggV00xU19MUF9FTiBoZXJlLgorCSAqIERvaW5nIHNvIGNvdWxkIGNhdXNlIHVuZGVycnVucy4KKwkgKi8KK30KKwogc3RhdGljIHZvaWQgaXJvbmxha2VfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTA1Miw5ICs0NDc3LDggQEAKIAlJOTE1X1dSSVRFKERJU1BfQVJCX0NUTCwKIAkJICAgKEk5MTVfUkVBRChESVNQX0FSQl9DVEwpIHwKIAkJICAgIERJU1BfRkJDX1dNX0RJUykpOwotCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7Ci0JSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKLQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOworCisJaWxrX2luaXRfbHBfd2F0ZXJtYXJrcyhkZXYpOwogCiAJLyoKIAkgKiBCYXNlZCBvbiB0aGUgZG9jdW1lbnQgZnJvbSBoYXJkd2FyZSBndXlzIHRoZSBmb2xsb3dpbmcgYml0cwpAQCAtNTE2MSw5ICs0NTg1LDcgQEAKIAkJSTkxNV9XUklURShHRU42X0dUX01PREUsCiAJCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0VONl9URF9GT1VSX1JPV19ESVNQQVRDSF9ESVNBQkxFKSk7CiAKLQlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOwotCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7Ci0JSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKKwlpbGtfaW5pdF9scF93YXRlcm1hcmtzKGRldik7CiAKIAlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwKIAkJICAgX01BU0tFRF9CSVRfRElTQUJMRShDTTBfU1RDX0VWSUNUX0RJU0FCTEVfTFJBX1NOQikpOwpAQCAtNTMwNCwyOCArNDcyNiw0MCBAQAogCUk5MTVfV1JJVEUoR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAogCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0VON19TSU5HTEVfU1VCU0NBTl9ESVNQQVRDSF9FTkFCTEUpKTsKIAotCS8qIFdhU3dpdGNoU29sVmZGQXJiaXRyYXRpb25Qcmlvcml0eSAqLworCS8qIFdhU3dpdGNoU29sVmZGQXJiaXRyYXRpb25Qcmlvcml0eTpiZHcgKi8KIAlJOTE1X1dSSVRFKEdBTV9FQ09DSEssIEk5MTVfUkVBRChHQU1fRUNPQ0hLKSB8IEhTV19FQ09DSEtfQVJCX1BSSU9fU09MKTsKIAotCS8qIFdhUHNyRFBBTWFza1ZCbGFua0luU1JEICovCisJLyogV2FQc3JEUEFNYXNrVkJsYW5rSW5TUkQ6YmR3ICovCiAJSTkxNV9XUklURShDSElDS0VOX1BBUjFfMSwKIAkJICAgSTkxNV9SRUFEKENISUNLRU5fUEFSMV8xKSB8IERQQV9NQVNLX1ZCTEFOS19TUkQpOwogCi0JLyogV2FQc3JEUFJTVW5tYXNrVkJsYW5rSW5TUkQgKi8KKwkvKiBXYVBzckRQUlNVbm1hc2tWQmxhbmtJblNSRDpiZHcgKi8KIAlmb3JfZWFjaF9waXBlKGkpIHsKIAkJSTkxNV9XUklURShDSElDS0VOX1BJUEVTTF8xKGkpLAogCQkJICAgSTkxNV9SRUFEKENISUNLRU5fUElQRVNMXzEoaSkgfAogCQkJCSAgICAgRFBSU19NQVNLX1ZCTEFOS19TUkQpKTsKIAl9CisKKwkvKiBVc2UgRm9yY2UgTm9uLUNvaGVyZW50IHdoZW5ldmVyIGV4ZWN1dGluZyBhIDNEIGNvbnRleHQuIFRoaXMgaXMgYQorCSAqIHdvcmthcm91bmQgZm9yIGZvciBhIHBvc3NpYmxlIGhhbmcgaW4gdGhlIHVubGlrZWx5IGV2ZW50IGEgVExCCisJICogaW52YWxpZGF0aW9uIG9jY3VycyBkdXJpbmcgYSBQU0QgZmx1c2guCisJICovCisJSTkxNV9XUklURShIRENfQ0hJQ0tFTjAsCisJCSAgIEk5MTVfUkVBRChIRENfQ0hJQ0tFTjApIHwKKwkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEhEQ19GT1JDRV9OT05fQ09IRVJFTlQpKTsKKworCS8qIFdhVlNSZWZDb3VudEZ1bGxmb3JjZU1pc3NEaXNhYmxlOmJkdyAqLworCS8qIFdhRFNSZWZDb3VudEZ1bGxmb3JjZU1pc3NEaXNhYmxlOmJkdyAqLworCUk5MTVfV1JJVEUoR0VON19GRl9USFJFQURfTU9ERSwKKwkJICAgSTkxNV9SRUFEKEdFTjdfRkZfVEhSRUFEX01PREUpICYKKwkJICAgfihHRU44X0ZGX0RTX1JFRl9DTlRfRkZNRSB8IEdFTjdfRkZfVlNfUkVGX0NOVF9GRk1FKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhc3dlbGxfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JSTkxNV9XUklURShXTTNfTFBfSUxLLCAwKTsKLQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOwotCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgMCk7CisJaWxrX2luaXRfbHBfd2F0ZXJtYXJrcyhkZXYpOwogCiAJLyogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBiaXQgMTMgKFJDWlVOSVQpIG11c3QgYmUgc2V0IG9uIElWQi4KIAkgKiBUaGlzIGltcGxlbWVudHMgdGhlIFdhRGlzYWJsZVJDWlVuaXRDbG9ja0dhdGluZzpoc3cgd29ya2Fyb3VuZC4KQEAgLTUzNzQsOSArNDgwOCw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBzbnBjcjsKIAotCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7Ci0JSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKLQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOworCWlsa19pbml0X2xwX3dhdGVybWFya3MoZGV2KTsKIAogCUk5MTVfV1JJVEUoSUxLX0RTUENMS19HQVRFX0QsIElMS19WUkhVTklUX0NMT0NLX0dBVEVfRElTQUJMRSk7CiAKQEAgLTU0NjMsNiArNDg5NSwyNiBAQAogc3RhdGljIHZvaWQgdmFsbGV5dmlld19pbml0X2Nsb2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHZhbDsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19HUFVfRlJFUV9TVFMpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwlzd2l0Y2ggKCh2YWwgPj4gNikgJiAzKSB7CisJY2FzZSAwOgorCQlkZXZfcHJpdi0+bWVtX2ZyZXEgPSA4MDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGV2X3ByaXYtPm1lbV9mcmVxID0gMTA2NjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkZXZfcHJpdi0+bWVtX2ZyZXEgPSAxMzMzOworCQlicmVhazsKKwljYXNlIDM6CisJCWRldl9wcml2LT5tZW1fZnJlcSA9IDEzMzM7CisJCWJyZWFrOworCX0KKwlEUk1fREVCVUdfRFJJVkVSKCJERFIgc3BlZWQ6ICVkIE1IeiIsIGRldl9wcml2LT5tZW1fZnJlcSk7CiAKIAlJOTE1X1dSSVRFKERTUENMS19HQVRFX0QsIFZSSFVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKIApAQCAtNTY0Miw1MCArNTA5NCwxMzMgQEAKIAkJbHB0X3N1c3BlbmRfaHcoZGV2KTsKIH0KIAotc3RhdGljIGJvb2wgaXNfYWx3YXlzX29uX3Bvd2VyX2RvbWFpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIGVudW0gaW50ZWxfZGlzcGxheV9wb3dlcl9kb21haW4gZG9tYWluKQotewotCXVuc2lnbmVkIGxvbmcgYWx3YXlzX29uX2RvbWFpbnM7CisjZGVmaW5lIGZvcl9lYWNoX3Bvd2VyX3dlbGwoaSwgcG93ZXJfd2VsbCwgZG9tYWluX21hc2ssIHBvd2VyX2RvbWFpbnMpCVwKKwlmb3IgKGkgPSAwOwkJCQkJCQlcCisJICAgICBpIDwgKHBvd2VyX2RvbWFpbnMpLT5wb3dlcl93ZWxsX2NvdW50ICYmCQkJXAorCQkgKChwb3dlcl93ZWxsKSA9ICYocG93ZXJfZG9tYWlucyktPnBvd2VyX3dlbGxzW2ldKTsJXAorCSAgICAgaSsrKQkJCQkJCQlcCisJCWlmICgocG93ZXJfd2VsbCktPmRvbWFpbnMgJiAoZG9tYWluX21hc2spKQogCi0JQlVHX09OKEJJVChkb21haW4pICYgflBPV0VSX0RPTUFJTl9NQVNLKTsKLQotCWlmIChJU19CUk9BRFdFTEwoZGV2KSkgewotCQlhbHdheXNfb25fZG9tYWlucyA9IEJEV19BTFdBWVNfT05fUE9XRVJfRE9NQUlOUzsKLQl9IGVsc2UgaWYgKElTX0hBU1dFTEwoZGV2KSkgewotCQlhbHdheXNfb25fZG9tYWlucyA9IEhTV19BTFdBWVNfT05fUE9XRVJfRE9NQUlOUzsKLQl9IGVsc2UgewotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gQklUKGRvbWFpbikgJiBhbHdheXNfb25fZG9tYWluczsKLX0KKyNkZWZpbmUgZm9yX2VhY2hfcG93ZXJfd2VsbF9yZXYoaSwgcG93ZXJfd2VsbCwgZG9tYWluX21hc2ssIHBvd2VyX2RvbWFpbnMpIFwKKwlmb3IgKGkgPSAocG93ZXJfZG9tYWlucyktPnBvd2VyX3dlbGxfY291bnQgLSAxOwkJCSBcCisJICAgICBpID49IDAgJiYgKChwb3dlcl93ZWxsKSA9ICYocG93ZXJfZG9tYWlucyktPnBvd2VyX3dlbGxzW2ldKTtcCisJICAgICBpLS0pCQkJCQkJCSBcCisJCWlmICgocG93ZXJfd2VsbCktPmRvbWFpbnMgJiAoZG9tYWluX21hc2spKQogCiAvKioKICAqIFdlIHNob3VsZCBvbmx5IHVzZSB0aGUgcG93ZXIgd2VsbCBpZiB3ZSBleHBsaWNpdGx5IGFza2VkIHRoZSBoYXJkd2FyZSB0bwogICogZW5hYmxlIGl0LCBzbyBjaGVjayBpZiBpdCdzIGVuYWJsZWQgYW5kIGFsc28gY2hlY2sgaWYgd2UndmUgcmVxdWVzdGVkIGl0IHRvCiAgKiBiZSBlbmFibGVkLgogICovCi1ib29sIGludGVsX2Rpc3BsYXlfcG93ZXJfZW5hYmxlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSBlbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIGRvbWFpbikKK3N0YXRpYyBib29sIGhzd19wb3dlcl93ZWxsX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsICpwb3dlcl93ZWxsKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIUhBU19QT1dFUl9XRUxMKGRldikpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKGlzX2Fsd2F5c19vbl9wb3dlcl9kb21haW4oZGV2LCBkb21haW4pKQotCQlyZXR1cm4gdHJ1ZTsKLQogCXJldHVybiBJOTE1X1JFQUQoSFNXX1BXUl9XRUxMX0RSSVZFUikgPT0KIAkJICAgICAoSFNXX1BXUl9XRUxMX0VOQUJMRV9SRVFVRVNUIHwgSFNXX1BXUl9XRUxMX1NUQVRFX0VOQUJMRUQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2ludGVsX3NldF9wb3dlcl93ZWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQorYm9vbCBpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWRfc3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBkb21haW4pCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaTkxNV9wb3dlcl9kb21haW5zICpwb3dlcl9kb21haW5zOworCisJcG93ZXJfZG9tYWlucyA9ICZkZXZfcHJpdi0+cG93ZXJfZG9tYWluczsKKworCXJldHVybiBwb3dlcl9kb21haW5zLT5kb21haW5fdXNlX2NvdW50W2RvbWFpbl07Cit9CisKK2Jvb2wgaW50ZWxfZGlzcGxheV9wb3dlcl9lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIGVudW0gaW50ZWxfZGlzcGxheV9wb3dlcl9kb21haW4gZG9tYWluKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGk5MTVfcG93ZXJfZG9tYWlucyAqcG93ZXJfZG9tYWluczsKKwlzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsICpwb3dlcl93ZWxsOworCWJvb2wgaXNfZW5hYmxlZDsKKwlpbnQgaTsKKworCXBvd2VyX2RvbWFpbnMgPSAmZGV2X3ByaXYtPnBvd2VyX2RvbWFpbnM7CisKKwlpc19lbmFibGVkID0gdHJ1ZTsKKworCW11dGV4X2xvY2soJnBvd2VyX2RvbWFpbnMtPmxvY2spOworCWZvcl9lYWNoX3Bvd2VyX3dlbGxfcmV2KGksIHBvd2VyX3dlbGwsIEJJVChkb21haW4pLCBwb3dlcl9kb21haW5zKSB7CisJCWlmIChwb3dlcl93ZWxsLT5hbHdheXNfb24pCisJCQljb250aW51ZTsKKworCQlpZiAoIXBvd2VyX3dlbGwtPmlzX2VuYWJsZWQoZGV2LCBwb3dlcl93ZWxsKSkgeworCQkJaXNfZW5hYmxlZCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZwb3dlcl9kb21haW5zLT5sb2NrKTsKKworCXJldHVybiBpc19lbmFibGVkOworfQorCitzdGF0aWMgdm9pZCBoc3dfcG93ZXJfd2VsbF9wb3N0X2VuYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCS8qCisJICogQWZ0ZXIgd2UgcmUtZW5hYmxlIHRoZSBwb3dlciB3ZWxsLCBpZiB3ZSB0b3VjaCBWR0EgcmVnaXN0ZXIgMHgzZDUKKwkgKiB3ZSdsbCBnZXQgdW5jbGFpbWVkIHJlZ2lzdGVyIGludGVycnVwdHMuIFRoaXMgc3RvcHMgYWZ0ZXIgd2Ugd3JpdGUKKwkgKiBhbnl0aGluZyB0byB0aGUgVkdBIE1TUiByZWdpc3Rlci4gVGhlIHZnYWNvbiBtb2R1bGUgdXNlcyB0aGlzCisJICogcmVnaXN0ZXIgYWxsIHRoZSB0aW1lLCBzbyBpZiB3ZSB1bmJpbmQgb3VyIGRyaXZlciBhbmQsIGFzIGEKKwkgKiBjb25zZXF1ZW5jZSwgYmluZCB2Z2Fjb24sIHdlJ2xsIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIGF0CisJICogY29uc29sZV91bmxvY2soKS4gU28gbWFrZSBoZXJlIHdlIHRvdWNoIHRoZSBWR0EgTVNSIHJlZ2lzdGVyLCBtYWtpbmcKKwkgKiBzdXJlIHZnYWNvbiBjYW4ga2VlcCB3b3JraW5nIG5vcm1hbGx5IHdpdGhvdXQgdHJpZ2dlcmluZyBpbnRlcnJ1cHRzCisJICogYW5kIGVycm9yIG1lc3NhZ2VzLgorCSAqLworCXZnYV9nZXRfdW5pbnRlcnJ1cHRpYmxlKGRldi0+cGRldiwgVkdBX1JTUkNfTEVHQUNZX0lPKTsKKwlvdXRiKGluYihWR0FfTVNSX1JFQUQpLCBWR0FfTVNSX1dSSVRFKTsKKwl2Z2FfcHV0KGRldi0+cGRldiwgVkdBX1JTUkNfTEVHQUNZX0lPKTsKKworCWlmIChJU19CUk9BRFdFTEwoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJCUk5MTVfV1JJVEUoR0VOOF9ERV9QSVBFX0lNUihQSVBFX0IpLAorCQkJICAgZGV2X3ByaXYtPmRlX2lycV9tYXNrW1BJUEVfQl0pOworCQlJOTE1X1dSSVRFKEdFTjhfREVfUElQRV9JRVIoUElQRV9CKSwKKwkJCSAgIH5kZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9CXSB8CisJCQkgICBHRU44X1BJUEVfVkJMQU5LKTsKKwkJSTkxNV9XUklURShHRU44X0RFX1BJUEVfSU1SKFBJUEVfQyksCisJCQkgICBkZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9DXSk7CisJCUk5MTVfV1JJVEUoR0VOOF9ERV9QSVBFX0lFUihQSVBFX0MpLAorCQkJICAgfmRldl9wcml2LT5kZV9pcnFfbWFza1tQSVBFX0NdIHwKKwkJCSAgIEdFTjhfUElQRV9WQkxBTkspOworCQlQT1NUSU5HX1JFQUQoR0VOOF9ERV9QSVBFX0lFUihQSVBFX0MpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoc3dfcG93ZXJfd2VsbF9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWVudW0gcGlwZSBwOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwkvKgorCSAqIEFmdGVyIHRoaXMsIHRoZSByZWdpc3RlcnMgb24gdGhlIHBpcGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHBvd2VyCisJICogd2VsbCB3aWxsIGJlY29tZSB6ZXJvLCBzbyB3ZSBoYXZlIHRvIGFkanVzdCBvdXIgY291bnRlcnMgYWNjb3JkaW5nIHRvCisJICogdGhhdC4KKwkgKgorCSAqIEZJWE1FOiBTaG91bGQgd2UgZG8gdGhpcyBpbiBnZW5lcmFsIGluIGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0PworCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJZm9yX2VhY2hfcGlwZShwKQorCQlpZiAocCAhPSBQSVBFX0EpCisJCQlkZXYtPnZibGFua1twXS5sYXN0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19zZXRfcG93ZXJfd2VsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGwsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJYm9vbCBpc19lbmFibGVkLCBlbmFibGVfcmVxdWVzdGVkOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJdWludDMyX3QgdG1wOwogCiAJV0FSTl9PTihkZXZfcHJpdi0+cGM4LmVuYWJsZWQpOwpAQCAtNTcwNiw0MiArNTI0MSwxNCBAQAogCQkJCURSTV9FUlJPUigiVGltZW91dCBlbmFibGluZyBwb3dlciB3ZWxsXG4iKTsKIAkJfQogCi0JCWlmIChJU19CUk9BRFdFTEwoZGV2KSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwotCQkJSTkxNV9XUklURShHRU44X0RFX1BJUEVfSU1SKFBJUEVfQiksCi0JCQkJICAgZGV2X3ByaXYtPmRlX2lycV9tYXNrW1BJUEVfQl0pOwotCQkJSTkxNV9XUklURShHRU44X0RFX1BJUEVfSUVSKFBJUEVfQiksCi0JCQkJICAgfmRldl9wcml2LT5kZV9pcnFfbWFza1tQSVBFX0JdIHwKLQkJCQkgICBHRU44X1BJUEVfVkJMQU5LKTsKLQkJCUk5MTVfV1JJVEUoR0VOOF9ERV9QSVBFX0lNUihQSVBFX0MpLAotCQkJCSAgIGRldl9wcml2LT5kZV9pcnFfbWFza1tQSVBFX0NdKTsKLQkJCUk5MTVfV1JJVEUoR0VOOF9ERV9QSVBFX0lFUihQSVBFX0MpLAotCQkJCSAgIH5kZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9DXSB8Ci0JCQkJICAgR0VOOF9QSVBFX1ZCTEFOSyk7Ci0JCQlQT1NUSU5HX1JFQUQoR0VOOF9ERV9QSVBFX0lFUihQSVBFX0MpKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwotCQl9CisJCWhzd19wb3dlcl93ZWxsX3Bvc3RfZW5hYmxlKGRldl9wcml2KTsKIAl9IGVsc2UgewogCQlpZiAoZW5hYmxlX3JlcXVlc3RlZCkgewotCQkJZW51bSBwaXBlIHA7Ci0KIAkJCUk5MTVfV1JJVEUoSFNXX1BXUl9XRUxMX0RSSVZFUiwgMCk7CiAJCQlQT1NUSU5HX1JFQUQoSFNXX1BXUl9XRUxMX0RSSVZFUik7CiAJCQlEUk1fREVCVUdfS01TKCJSZXF1ZXN0aW5nIHRvIGRpc2FibGUgdGhlIHBvd2VyIHdlbGxcbiIpOwogCi0JCQkvKgotCQkJICogQWZ0ZXIgdGhpcywgdGhlIHJlZ2lzdGVycyBvbiB0aGUgcGlwZXMgdGhhdCBhcmUgcGFydAotCQkJICogb2YgdGhlIHBvd2VyIHdlbGwgd2lsbCBiZWNvbWUgemVybywgc28gd2UgaGF2ZSB0bwotCQkJICogYWRqdXN0IG91ciBjb3VudGVycyBhY2NvcmRpbmcgdG8gdGhhdC4KLQkJCSAqCi0JCQkgKiBGSVhNRTogU2hvdWxkIHdlIGRvIHRoaXMgaW4gZ2VuZXJhbCBpbgotCQkJICogZHJtX3ZibGFua19wb3N0X21vZGVzZXQ/Ci0JCQkgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7Ci0JCQlmb3JfZWFjaF9waXBlKHApCi0JCQkJaWYgKHAgIT0gUElQRV9BKQotCQkJCQlkZXYtPnZibGFua1twXS5sYXN0ID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKKwkJCWhzd19wb3dlcl93ZWxsX3Bvc3RfZGlzYWJsZShkZXZfcHJpdik7CiAJCX0KIAl9CiB9CkBAIC01NzUxLDkgKzUyNTgsOSBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIXBvd2VyX3dlbGwtPmNvdW50KyspIHsKKwlpZiAoIXBvd2VyX3dlbGwtPmNvdW50KysgJiYgcG93ZXJfd2VsbC0+c2V0KSB7CiAJCWhzd19kaXNhYmxlX3BhY2thZ2VfYzgoZGV2X3ByaXYpOwotCQlfX2ludGVsX3NldF9wb3dlcl93ZWxsKGRldiwgdHJ1ZSk7CisJCXBvd2VyX3dlbGwtPnNldChkZXYsIHBvd2VyX3dlbGwsIHRydWUpOwogCX0KIH0KIApAQCAtNTc2Myw4ICs1MjcwLDEwIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCVdBUk5fT04oIXBvd2VyX3dlbGwtPmNvdW50KTsKLQlpZiAoIS0tcG93ZXJfd2VsbC0+Y291bnQgJiYgaTkxNV9kaXNhYmxlX3Bvd2VyX3dlbGwpIHsKLQkJX19pbnRlbF9zZXRfcG93ZXJfd2VsbChkZXYsIGZhbHNlKTsKKworCWlmICghLS1wb3dlcl93ZWxsLT5jb3VudCAmJiBwb3dlcl93ZWxsLT5zZXQgJiYKKwkgICAgaTkxNV9kaXNhYmxlX3Bvd2VyX3dlbGwpIHsKKwkJcG93ZXJfd2VsbC0+c2V0KGRldiwgcG93ZXJfd2VsbCwgZmFsc2UpOwogCQloc3dfZW5hYmxlX3BhY2thZ2VfYzgoZGV2X3ByaXYpOwogCX0KIH0KQEAgLTU3NzQsMTcgKzUyODMsMTggQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgKnBvd2VyX2RvbWFpbnM7Ci0KLQlpZiAoIUhBU19QT1dFUl9XRUxMKGRldikpCi0JCXJldHVybjsKLQotCWlmIChpc19hbHdheXNfb25fcG93ZXJfZG9tYWluKGRldiwgZG9tYWluKSkKLQkJcmV0dXJuOworCXN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGw7CisJaW50IGk7CiAKIAlwb3dlcl9kb21haW5zID0gJmRldl9wcml2LT5wb3dlcl9kb21haW5zOwogCiAJbXV0ZXhfbG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7Ci0JX19pbnRlbF9wb3dlcl93ZWxsX2dldChkZXYsICZwb3dlcl9kb21haW5zLT5wb3dlcl93ZWxsc1swXSk7CisKKwlmb3JfZWFjaF9wb3dlcl93ZWxsKGksIHBvd2VyX3dlbGwsIEJJVChkb21haW4pLCBwb3dlcl9kb21haW5zKQorCQlfX2ludGVsX3Bvd2VyX3dlbGxfZ2V0KGRldiwgcG93ZXJfd2VsbCk7CisKKwlwb3dlcl9kb21haW5zLT5kb21haW5fdXNlX2NvdW50W2RvbWFpbl0rKzsKKwogCW11dGV4X3VubG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7CiB9CiAKQEAgLTU3OTMsMTcgKzUzMDMsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgKnBvd2VyX2RvbWFpbnM7Ci0KLQlpZiAoIUhBU19QT1dFUl9XRUxMKGRldikpCi0JCXJldHVybjsKLQotCWlmIChpc19hbHdheXNfb25fcG93ZXJfZG9tYWluKGRldiwgZG9tYWluKSkKLQkJcmV0dXJuOworCXN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGw7CisJaW50IGk7CiAKIAlwb3dlcl9kb21haW5zID0gJmRldl9wcml2LT5wb3dlcl9kb21haW5zOwogCiAJbXV0ZXhfbG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7Ci0JX19pbnRlbF9wb3dlcl93ZWxsX3B1dChkZXYsICZwb3dlcl9kb21haW5zLT5wb3dlcl93ZWxsc1swXSk7CisKKwlXQVJOX09OKCFwb3dlcl9kb21haW5zLT5kb21haW5fdXNlX2NvdW50W2RvbWFpbl0pOworCXBvd2VyX2RvbWFpbnMtPmRvbWFpbl91c2VfY291bnRbZG9tYWluXS0tOworCisJZm9yX2VhY2hfcG93ZXJfd2VsbF9yZXYoaSwgcG93ZXJfd2VsbCwgQklUKGRvbWFpbiksIHBvd2VyX2RvbWFpbnMpCisJCV9faW50ZWxfcG93ZXJfd2VsbF9wdXQoZGV2LCBwb3dlcl93ZWxsKTsKKwogCW11dGV4X3VubG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7CiB9CiAKQEAgLTU4MTksMTAgKzUzMzEsNyBAQAogCiAJZGV2X3ByaXYgPSBjb250YWluZXJfb2YoaHN3X3B3ciwgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUsCiAJCQkJcG93ZXJfZG9tYWlucyk7Ci0KLQltdXRleF9sb2NrKCZoc3dfcHdyLT5sb2NrKTsKLQlfX2ludGVsX3Bvd2VyX3dlbGxfZ2V0KGRldl9wcml2LT5kZXYsICZoc3dfcHdyLT5wb3dlcl93ZWxsc1swXSk7Ci0JbXV0ZXhfdW5sb2NrKCZoc3dfcHdyLT5sb2NrKTsKKwlpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChkZXZfcHJpdi0+ZGV2LCBQT1dFUl9ET01BSU5fQVVESU8pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaTkxNV9yZXF1ZXN0X3Bvd2VyX3dlbGwpOwogCkBAIC01ODM2LDI0ICs1MzQ1LDcxIEBACiAKIAlkZXZfcHJpdiA9IGNvbnRhaW5lcl9vZihoc3dfcHdyLCBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSwKIAkJCQlwb3dlcl9kb21haW5zKTsKLQotCW11dGV4X2xvY2soJmhzd19wd3ItPmxvY2spOwotCV9faW50ZWxfcG93ZXJfd2VsbF9wdXQoZGV2X3ByaXYtPmRldiwgJmhzd19wd3ItPnBvd2VyX3dlbGxzWzBdKTsKLQltdXRleF91bmxvY2soJmhzd19wd3ItPmxvY2spOworCWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9wcml2LT5kZXYsIFBPV0VSX0RPTUFJTl9BVURJTyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpOTE1X3JlbGVhc2VfcG93ZXJfd2VsbCk7CiAKK3N0YXRpYyBzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsIGk5eHhfYWx3YXlzX29uX3Bvd2VyX3dlbGxbXSA9IHsKKwl7CisJCS5uYW1lID0gImFsd2F5cy1vbiIsCisJCS5hbHdheXNfb24gPSAxLAorCQkuZG9tYWlucyA9IFBPV0VSX0RPTUFJTl9NQVNLLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGk5MTVfcG93ZXJfd2VsbCBoc3dfcG93ZXJfd2VsbHNbXSA9IHsKKwl7CisJCS5uYW1lID0gImFsd2F5cy1vbiIsCisJCS5hbHdheXNfb24gPSAxLAorCQkuZG9tYWlucyA9IEhTV19BTFdBWVNfT05fUE9XRVJfRE9NQUlOUywKKwl9LAorCXsKKwkJLm5hbWUgPSAiZGlzcGxheSIsCisJCS5kb21haW5zID0gUE9XRVJfRE9NQUlOX01BU0sgJiB+SFNXX0FMV0FZU19PTl9QT1dFUl9ET01BSU5TLAorCQkuaXNfZW5hYmxlZCA9IGhzd19wb3dlcl93ZWxsX2VuYWJsZWQsCisJCS5zZXQgPSBoc3dfc2V0X3Bvd2VyX3dlbGwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsIGJkd19wb3dlcl93ZWxsc1tdID0geworCXsKKwkJLm5hbWUgPSAiYWx3YXlzLW9uIiwKKwkJLmFsd2F5c19vbiA9IDEsCisJCS5kb21haW5zID0gQkRXX0FMV0FZU19PTl9QT1dFUl9ET01BSU5TLAorCX0sCisJeworCQkubmFtZSA9ICJkaXNwbGF5IiwKKwkJLmRvbWFpbnMgPSBQT1dFUl9ET01BSU5fTUFTSyAmIH5CRFdfQUxXQVlTX09OX1BPV0VSX0RPTUFJTlMsCisJCS5pc19lbmFibGVkID0gaHN3X3Bvd2VyX3dlbGxfZW5hYmxlZCwKKwkJLnNldCA9IGhzd19zZXRfcG93ZXJfd2VsbCwKKwl9LAorfTsKKworI2RlZmluZSBzZXRfcG93ZXJfd2VsbHMocG93ZXJfZG9tYWlucywgX19wb3dlcl93ZWxscykgKHsJCVwKKwkocG93ZXJfZG9tYWlucyktPnBvd2VyX3dlbGxzID0gKF9fcG93ZXJfd2VsbHMpOwkJCVwKKwkocG93ZXJfZG9tYWlucyktPnBvd2VyX3dlbGxfY291bnQgPSBBUlJBWV9TSVpFKF9fcG93ZXJfd2VsbHMpOwlcCit9KQorCiBpbnQgaW50ZWxfcG93ZXJfZG9tYWluc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaTkxNV9wb3dlcl9kb21haW5zICpwb3dlcl9kb21haW5zID0gJmRldl9wcml2LT5wb3dlcl9kb21haW5zOwotCXN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGw7CiAKIAltdXRleF9pbml0KCZwb3dlcl9kb21haW5zLT5sb2NrKTsKLQloc3dfcHdyID0gcG93ZXJfZG9tYWluczsKIAotCXBvd2VyX3dlbGwgPSAmcG93ZXJfZG9tYWlucy0+cG93ZXJfd2VsbHNbMF07Ci0JcG93ZXJfd2VsbC0+Y291bnQgPSAwOworCS8qCisJICogVGhlIGVuYWJsaW5nIG9yZGVyIHdpbGwgYmUgZnJvbSBsb3dlciB0byBoaWdoZXIgaW5kZXhlZCB3ZWxscywKKwkgKiB0aGUgZGlzYWJsaW5nIG9yZGVyIGlzIHJldmVyc2VkLgorCSAqLworCWlmIChJU19IQVNXRUxMKGRldikpIHsKKwkJc2V0X3Bvd2VyX3dlbGxzKHBvd2VyX2RvbWFpbnMsIGhzd19wb3dlcl93ZWxscyk7CisJCWhzd19wd3IgPSBwb3dlcl9kb21haW5zOworCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldikpIHsKKwkJc2V0X3Bvd2VyX3dlbGxzKHBvd2VyX2RvbWFpbnMsIGJkd19wb3dlcl93ZWxscyk7CisJCWhzd19wd3IgPSBwb3dlcl9kb21haW5zOworCX0gZWxzZSB7CisJCXNldF9wb3dlcl93ZWxscyhwb3dlcl9kb21haW5zLCBpOXh4X2Fsd2F5c19vbl9wb3dlcl93ZWxsKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU4NjgsMTUgKzU0MjQsMTMgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgKnBvd2VyX2RvbWFpbnMgPSAmZGV2X3ByaXYtPnBvd2VyX2RvbWFpbnM7CiAJc3RydWN0IGk5MTVfcG93ZXJfd2VsbCAqcG93ZXJfd2VsbDsKLQotCWlmICghSEFTX1BPV0VSX1dFTEwoZGV2KSkKLQkJcmV0dXJuOworCWludCBpOwogCiAJbXV0ZXhfbG9jaygmcG93ZXJfZG9tYWlucy0+bG9jayk7Ci0KLQlwb3dlcl93ZWxsID0gJnBvd2VyX2RvbWFpbnMtPnBvd2VyX3dlbGxzWzBdOwotCV9faW50ZWxfc2V0X3Bvd2VyX3dlbGwoZGV2LCBwb3dlcl93ZWxsLT5jb3VudCA+IDApOwotCisJZm9yX2VhY2hfcG93ZXJfd2VsbChpLCBwb3dlcl93ZWxsLCBQT1dFUl9ET01BSU5fTUFTSywgcG93ZXJfZG9tYWlucykgeworCQlpZiAocG93ZXJfd2VsbC0+c2V0KQorCQkJcG93ZXJfd2VsbC0+c2V0KGRldiwgcG93ZXJfd2VsbCwgcG93ZXJfd2VsbC0+Y291bnQgPiAwKTsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZwb3dlcl9kb21haW5zLT5sb2NrKTsKIH0KIApAQCAtNTg5MCwxMyArNTQ0NCwxMyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIUhBU19QT1dFUl9XRUxMKGRldikpCi0JCXJldHVybjsKLQogCS8qIEZvciBub3csIHdlIG5lZWQgdGhlIHBvd2VyIHdlbGwgdG8gYmUgYWx3YXlzIGVuYWJsZWQuICovCiAJaW50ZWxfZGlzcGxheV9zZXRfaW5pdF9wb3dlcihkZXYsIHRydWUpOwogCWludGVsX3Bvd2VyX2RvbWFpbnNfcmVzdW1lKGRldik7CiAKKwlpZiAoIShJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpKQorCQlyZXR1cm47CisKIAkvKiBXZSdyZSB0YWtpbmcgb3ZlciB0aGUgQklPUywgc28gY2xlYXIgYW55IHJlcXVlc3RzIG1hZGUgYnkgaXQgc2luY2UKIAkgKiB0aGUgZHJpdmVyIGlzIGluIGNoYXJnZSBub3cuICovCiAJaWYgKEk5MTVfUkVBRChIU1dfUFdSX1dFTExfQklPUykgJiBIU1dfUFdSX1dFTExfRU5BQkxFX1JFUVVFU1QpCkBAIC01OTE0LDMxICs1NDY4LDg2IEBACiAJaHN3X2VuYWJsZV9wYWNrYWdlX2M4KGRldl9wcml2KTsKIH0KIAordm9pZCBpbnRlbF9ydW50aW1lX3BtX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OworCisJaWYgKCFIQVNfUlVOVElNRV9QTShkZXYpKQorCQlyZXR1cm47CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldmljZSk7CisJV0FSTihkZXZfcHJpdi0+cG0uc3VzcGVuZGVkLCAiRGV2aWNlIHN0aWxsIHN1c3BlbmRlZC5cbiIpOworfQorCit2b2lkIGludGVsX3J1bnRpbWVfcG1fcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmZGV2LT5wZGV2LT5kZXY7CisKKwlpZiAoIUhBU19SVU5USU1FX1BNKGRldikpCisJCXJldHVybjsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2aWNlKTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXZpY2UpOworfQorCit2b2lkIGludGVsX2luaXRfcnVudGltZV9wbShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OworCisJZGV2X3ByaXYtPnBtLnN1c3BlbmRlZCA9IGZhbHNlOworCisJaWYgKCFIQVNfUlVOVElNRV9QTShkZXYpKQorCQlyZXR1cm47CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2aWNlKTsKKworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldmljZSwgMTAwMDApOyAvKiAxMHMgKi8KKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldmljZSk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2aWNlKTsKK30KKwordm9pZCBpbnRlbF9maW5pX3J1bnRpbWVfcG0oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZkZXYtPnBkZXYtPmRldjsKKworCWlmICghSEFTX1JVTlRJTUVfUE0oZGV2KSkKKwkJcmV0dXJuOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIG5vdCBzdXNwZW5kZWQgZmlyc3QuICovCisJcG1fcnVudGltZV9nZXRfc3luYyhkZXZpY2UpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXZpY2UpOworfQorCiAvKiBTZXQgdXAgY2hpcCBzcGVjaWZpYyBwb3dlciBtYW5hZ2VtZW50LXJlbGF0ZWQgZnVuY3Rpb25zICovCiB2b2lkIGludGVsX2luaXRfcG0oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKEk5MTVfSEFTX0ZCQyhkZXYpKSB7Ci0JCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwlpZiAoSEFTX0ZCQyhkZXYpKSB7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3KSB7CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5mYmNfZW5hYmxlZCA9IGlyb25sYWtlX2ZiY19lbmFibGVkOwotCQkJaWYgKElTX0lWWUJSSURHRShkZXYpIHx8IElTX0hBU1dFTEwoZGV2KSkKLQkJCQlkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfZmJjID0KLQkJCQkJZ2VuN19lbmFibGVfZmJjOwotCQkJZWxzZQotCQkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPQotCQkJCQlpcm9ubGFrZV9lbmFibGVfZmJjOworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyA9IGdlbjdfZW5hYmxlX2ZiYzsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjID0gaXJvbmxha2VfZGlzYWJsZV9mYmM7CisJCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSkgeworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgPSBpcm9ubGFrZV9mYmNfZW5hYmxlZDsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpcm9ubGFrZV9lbmFibGVfZmJjOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBpcm9ubGFrZV9kaXNhYmxlX2ZiYzsKIAkJfSBlbHNlIGlmIChJU19HTTQ1KGRldikpIHsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gZzR4X2ZiY19lbmFibGVkOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyA9IGc0eF9lbmFibGVfZmJjOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBnNHhfZGlzYWJsZV9mYmM7Ci0JCX0gZWxzZSBpZiAoSVNfQ1JFU1RMSU5FKGRldikpIHsKKwkJfSBlbHNlIHsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gaTh4eF9mYmNfZW5hYmxlZDsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpOHh4X2VuYWJsZV9mYmM7CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyA9IGk4eHhfZGlzYWJsZV9mYmM7CisKKwkJCS8qIFRoaXMgdmFsdWUgd2FzIHB1bGxlZCBvdXQgb2Ygc29tZW9uZSdzIGhhdCAqLworCQkJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgNTAwIDw8IEZCQ19DVExfSU5URVJWQUxfU0hJRlQpOwogCQl9Ci0JCS8qIDg1NUdNIG5lZWRzIHRlc3RpbmcgKi8KIAl9CiAKIAkvKiBGb3IgY3hzciAqLwpAQCAtNTk1MSw1OCArNTU2MCwyNyBAQAogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKIAkJaW50ZWxfc2V0dXBfd21fbGF0ZW5jeShkZXYpOwogCi0JCWlmIChJU19HRU41KGRldikpIHsKLQkJCWlmIChkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMV0gJiYKLQkJCSAgICBkZXZfcHJpdi0+d20uc3ByX2xhdGVuY3lbMV0gJiYKLQkJCSAgICBkZXZfcHJpdi0+d20uY3VyX2xhdGVuY3lbMV0pCi0JCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaXJvbmxha2VfdXBkYXRlX3dtOwotCQkJZWxzZSB7Ci0JCQkJRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRvIGdldCBwcm9wZXIgbGF0ZW5jeS4gIgotCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKLQkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwotCQkJfQorCQlpZiAoKElTX0dFTjUoZGV2KSAmJiBkZXZfcHJpdi0+d20ucHJpX2xhdGVuY3lbMV0gJiYKKwkJICAgICBkZXZfcHJpdi0+d20uc3ByX2xhdGVuY3lbMV0gJiYgZGV2X3ByaXYtPndtLmN1cl9sYXRlbmN5WzFdKSB8fAorCQkgICAgKCFJU19HRU41KGRldikgJiYgZGV2X3ByaXYtPndtLnByaV9sYXRlbmN5WzBdICYmCisJCSAgICAgZGV2X3ByaXYtPndtLnNwcl9sYXRlbmN5WzBdICYmIGRldl9wcml2LT53bS5jdXJfbGF0ZW5jeVswXSkpIHsKKwkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGlsa191cGRhdGVfd207CisJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfc3ByaXRlX3dtID0gaWxrX3VwZGF0ZV9zcHJpdGVfd207CisJCX0gZWxzZSB7CisJCQlEUk1fREVCVUdfS01TKCJGYWlsZWQgdG8gcmVhZCBkaXNwbGF5IHBsYW5lIGxhdGVuY3kuICIKKwkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKKwkJfQorCisJCWlmIChJU19HRU41KGRldikpCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGlyb25sYWtlX2luaXRfY2xvY2tfZ2F0aW5nOwotCQl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgewotCQkJaWYgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5zcHJfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5jdXJfbGF0ZW5jeVswXSkgewotCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IHNhbmR5YnJpZGdlX3VwZGF0ZV93bTsKLQkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfc3ByaXRlX3dtID0gc2FuZHlicmlkZ2VfdXBkYXRlX3Nwcml0ZV93bTsKLQkJCX0gZWxzZSB7Ci0JCQkJRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRvIHJlYWQgZGlzcGxheSBwbGFuZSBsYXRlbmN5LiAiCi0JCQkJCSAgICAgICJEaXNhYmxlIEN4U1JcbiIpOwotCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7Ci0JCQl9CisJCWVsc2UgaWYgKElTX0dFTjYoZGV2KSkKIAkJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gZ2VuNl9pbml0X2Nsb2NrX2dhdGluZzsKLQkJfSBlbHNlIGlmIChJU19JVllCUklER0UoZGV2KSkgewotCQkJaWYgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5zcHJfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5jdXJfbGF0ZW5jeVswXSkgewotCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGl2eWJyaWRnZV91cGRhdGVfd207Ci0JCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3Nwcml0ZV93bSA9IHNhbmR5YnJpZGdlX3VwZGF0ZV9zcHJpdGVfd207Ci0JCQl9IGVsc2UgewotCQkJCURSTV9ERUJVR19LTVMoIkZhaWxlZCB0byByZWFkIGRpc3BsYXkgcGxhbmUgbGF0ZW5jeS4gIgotCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKLQkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwotCQkJfQorCQllbHNlIGlmIChJU19JVllCUklER0UoZGV2KSkKIAkJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gaXZ5YnJpZGdlX2luaXRfY2xvY2tfZ2F0aW5nOwotCQl9IGVsc2UgaWYgKElTX0hBU1dFTEwoZGV2KSkgewotCQkJaWYgKGRldl9wcml2LT53bS5wcmlfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5zcHJfbGF0ZW5jeVswXSAmJgotCQkJICAgIGRldl9wcml2LT53bS5jdXJfbGF0ZW5jeVswXSkgewotCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGhhc3dlbGxfdXBkYXRlX3dtOwotCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV9zcHJpdGVfd20gPQotCQkJCQloYXN3ZWxsX3VwZGF0ZV9zcHJpdGVfd207Ci0JCQl9IGVsc2UgewotCQkJCURSTV9ERUJVR19LTVMoIkZhaWxlZCB0byByZWFkIGRpc3BsYXkgcGxhbmUgbGF0ZW5jeS4gIgotCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKLQkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwotCQkJfQorCQllbHNlIGlmIChJU19IQVNXRUxMKGRldikpCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGhhc3dlbGxfaW5pdF9jbG9ja19nYXRpbmc7Ci0JCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gOCkgeworCQllbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA4KQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnZW44X2luaXRfY2xvY2tfZ2F0aW5nOwotCQl9IGVsc2UKLQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gdmFsbGV5dmlld191cGRhdGVfd207CiAJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0KQEAgLTYwMzYsMjEgKzU2MTQsMjEgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaTl4eF91cGRhdGVfd207CiAJCWRldl9wcml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUgPSBpOXh4X2dldF9maWZvX3NpemU7CiAJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gZ2VuM19pbml0X2Nsb2NrX2dhdGluZzsKLQl9IGVsc2UgaWYgKElTX0k4NjVHKGRldikpIHsKLQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaTgzMF91cGRhdGVfd207Ci0JCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gaTg1eF9pbml0X2Nsb2NrX2dhdGluZzsKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk4MzBfZ2V0X2ZpZm9fc2l6ZTsKLQl9IGVsc2UgaWYgKElTX0k4NVgoZGV2KSkgewotCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBpOXh4X3VwZGF0ZV93bTsKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk4NXhfZ2V0X2ZpZm9fc2l6ZTsKLQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBpODV4X2luaXRfY2xvY2tfZ2F0aW5nOwotCX0gZWxzZSB7Ci0JCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGk4MzBfdXBkYXRlX3dtOwotCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGk4MzBfaW5pdF9jbG9ja19nYXRpbmc7Ci0JCWlmIChJU184NDVHKGRldikpCisJfSBlbHNlIGlmIChJU19HRU4yKGRldikpIHsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+bnVtX3BpcGVzID09IDEpIHsKKwkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGk4NDVfdXBkYXRlX3dtOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk4NDVfZ2V0X2ZpZm9fc2l6ZTsKLQkJZWxzZQorCQl9IGVsc2UgeworCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaTl4eF91cGRhdGVfd207CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTgzMF9nZXRfZmlmb19zaXplOworCQl9CisKKwkJaWYgKElTX0k4NVgoZGV2KSB8fCBJU19JODY1RyhkZXYpKQorCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBpODV4X2luaXRfY2xvY2tfZ2F0aW5nOworCQllbHNlCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGk4MzBfaW5pdF9jbG9ja19nYXRpbmc7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJ1bmV4cGVjdGVkIGZhbGwtdGhyb3VnaCBpbiBpbnRlbF9pbml0X3BtXG4iKTsKIAl9CiB9CiAKQEAgLTYxMDEsNTkgKzU2NzksNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZsdl9ncHVfZnJlcShpbnQgZGRyX2ZyZXEsIGludCB2YWwpCitpbnQgdmx2X2dwdV9mcmVxKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IHZhbCkKIHsKLQlpbnQgbXVsdCwgYmFzZTsKKwlpbnQgZGl2OwogCi0Jc3dpdGNoIChkZHJfZnJlcSkgeworCS8qIDQgeCBjemNsayAqLworCXN3aXRjaCAoZGV2X3ByaXYtPm1lbV9mcmVxKSB7CiAJY2FzZSA4MDA6Ci0JCW11bHQgPSAyMDsKLQkJYmFzZSA9IDEyMDsKKwkJZGl2ID0gMTA7CiAJCWJyZWFrOwogCWNhc2UgMTA2NjoKLQkJbXVsdCA9IDIyOwotCQliYXNlID0gMTMzOworCQlkaXYgPSAxMjsKIAkJYnJlYWs7CiAJY2FzZSAxMzMzOgotCQltdWx0ID0gMjE7Ci0JCWJhc2UgPSAxMjU7CisJCWRpdiA9IDE2OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dXJuICgodmFsIC0gMHhiZCkgKiBtdWx0KSArIGJhc2U7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5tZW1fZnJlcSAqICh2YWwgKyA2IC0gMHhiZCksIDQgKiBkaXYpOwogfQogCi1pbnQgdmx2X2ZyZXFfb3Bjb2RlKGludCBkZHJfZnJlcSwgaW50IHZhbCkKK2ludCB2bHZfZnJlcV9vcGNvZGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgdmFsKQogewotCWludCBtdWx0LCBiYXNlOworCWludCBtdWw7CiAKLQlzd2l0Y2ggKGRkcl9mcmVxKSB7CisJLyogNCB4IGN6Y2xrICovCisJc3dpdGNoIChkZXZfcHJpdi0+bWVtX2ZyZXEpIHsKIAljYXNlIDgwMDoKLQkJbXVsdCA9IDIwOwotCQliYXNlID0gMTIwOworCQltdWwgPSAxMDsKIAkJYnJlYWs7CiAJY2FzZSAxMDY2OgotCQltdWx0ID0gMjI7Ci0JCWJhc2UgPSAxMzM7CisJCW11bCA9IDEyOwogCQlicmVhazsKIAljYXNlIDEzMzM6Ci0JCW11bHQgPSAyMTsKLQkJYmFzZSA9IDEyNTsKKwkJbXVsID0gMTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKIAl9CiAKLQl2YWwgLz0gbXVsdDsKLQl2YWwgLT0gYmFzZSAvIG11bHQ7Ci0JdmFsICs9IDB4YmQ7Ci0KLQlpZiAodmFsID4gMHhlYSkKLQkJdmFsID0gMHhlYTsKLQotCXJldHVybiB2YWw7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKDQgKiBtdWwgKiB2YWwsIGRldl9wcml2LT5tZW1fZnJlcSkgKyAweGJkIC0gNjsKIH0KIAogdm9pZCBpbnRlbF9wbV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCmluZGV4IGMyZjA5ZDQ1Li5iN2YxNzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCkBAIC0yODUsMTQgKzI4NSwxNiBAQAogCWlmICghcmluZy0+ZmJjX2RpcnR5KQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKIAkvKiBXYUZiY051a2VPbjNEQmx0Oml2Yi9oc3cgKi8KIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTE9BRF9SRUdJU1RFUl9JTU0oMSkpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBNU0dfRkJDX1JFTkRfU1RBVEUpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCB2YWx1ZSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1NUT1JFX1JFR0lTVEVSX01FTSgxKSB8IE1JX1NSTV9MUk1fR0xPQkFMX0dUVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1TR19GQkNfUkVORF9TVEFURSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHJpbmctPnNjcmF0Y2guZ3R0X29mZnNldCArIDI1Nik7CiAJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCiAJcmluZy0+ZmJjX2RpcnR5ID0gZmFsc2U7CkBAIC0zNTQsNyArMzU2LDcgQEAKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CiAJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCi0JaWYgKGZsdXNoX2RvbWFpbnMpCisJaWYgKCFpbnZhbGlkYXRlX2RvbWFpbnMgJiYgZmx1c2hfZG9tYWlucykKIAkJcmV0dXJuIGdlbjdfcmluZ19mYmNfZmx1c2gocmluZywgRkJDX1JFTkRfTlVLRSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQzNiw3ICs0MzgsNyBAQAogCWludCByZXQgPSAwOwogCXUzMiBoZWFkOwogCi0JZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CisJZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAKIAlpZiAoSTkxNV9ORUVEX0dGWF9IV1MoZGV2KSkKIAkJaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShyaW5nKTsKQEAgLTUwOSw3ICs1MTEsNyBAQAogCW1lbXNldCgmcmluZy0+aGFuZ2NoZWNrLCAwLCBzaXplb2YocmluZy0+aGFuZ2NoZWNrKSk7CiAKIG91dDoKLQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02NjEsMTkgKzY2MywyMiBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnVzZWxlc3M7Ci0JaW50IGksIHJldDsKKwlpbnQgaSwgcmV0LCBudW1fZHdvcmRzID0gNDsKIAotCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgKChJOTE1X05VTV9SSU5HUy0xKSAqCi0JCQkJICAgICAgTUJPWF9VUERBVEVfRFdPUkRTKSArCi0JCQkJICAgICAgNCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAoaTkxNV9zZW1hcGhvcmVfaXNfZW5hYmxlZChkZXYpKQorCQludW1fZHdvcmRzICs9ICgoSTkxNV9OVU1fUklOR1MtMSkgKiBNQk9YX1VQREFURV9EV09SRFMpOwogI3VuZGVmIE1CT1hfVVBEQVRFX0RXT1JEUwogCi0JZm9yX2VhY2hfcmluZyh1c2VsZXNzLCBkZXZfcHJpdiwgaSkgewotCQl1MzIgbWJveF9yZWcgPSByaW5nLT5zaWduYWxfbWJveFtpXTsKLQkJaWYgKG1ib3hfcmVnICE9IEdFTjZfTk9TWU5DKQotCQkJdXBkYXRlX21ib3hlcyhyaW5nLCBtYm94X3JlZyk7CisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCBudW1fZHdvcmRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGk5MTVfc2VtYXBob3JlX2lzX2VuYWJsZWQoZGV2KSkgeworCQlmb3JfZWFjaF9yaW5nKHVzZWxlc3MsIGRldl9wcml2LCBpKSB7CisJCQl1MzIgbWJveF9yZWcgPSByaW5nLT5zaWduYWxfbWJveFtpXTsKKwkJCWlmIChtYm94X3JlZyAhPSBHRU42X05PU1lOQykKKwkJCQl1cGRhdGVfbWJveGVzKHJpbmcsIG1ib3hfcmVnKTsKKwkJfQogCX0KIAogCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7CkBAIC0xMDMwLDExICsxMDM1LDYgQEAKIAlpZiAoIWRldi0+aXJxX2VuYWJsZWQpCiAJICAgICAgIHJldHVybiBmYWxzZTsKIAotCS8qIEl0IGxvb2tzIGxpa2Ugd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBndCBmcm9tIHN1c3BlbmRpbmcgd2hpbGUgd2FpdGluZwotCSAqIGZvciBhbiBub3RpZml5IGlycSwgb3RoZXJ3aXNlIGlycXMgc2VlbSB0byBnZXQgbG9zdCBvbiBhdCBsZWFzdCB0aGUKLQkgKiBibHQvYnNkIHJpbmdzIG9uIGl2Yi4gKi8KLQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKIAlpZiAocmluZy0+aXJxX3JlZmNvdW50KysgPT0gMCkgewogCQlpZiAoSEFTX0wzX0RQRihkZXYpICYmIHJpbmctPmlkID09IFJDUykKQEAgLTEwNjYsOCArMTA2Niw2IEBACiAJCWlsa19kaXNhYmxlX2d0X2lycShkZXZfcHJpdiwgcmluZy0+aXJxX2VuYWJsZV9tYXNrKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBmbGFncyk7Ci0KLQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKIH0KIAogc3RhdGljIGJvb2wKQEAgLTE2MTEsOCArMTYwOSw4IEBACiAJcmV0dXJuIGk5MTVfZ2VtX2dldF9zZXFubyhyaW5nLT5kZXYsICZyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3NlcW5vKTsKIH0KIAotc3RhdGljIGludCBfX2ludGVsX3JpbmdfYmVnaW4oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJICAgICAgaW50IGJ5dGVzKQorc3RhdGljIGludCBfX2ludGVsX3JpbmdfcHJlcGFyZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJaW50IGJ5dGVzKQogewogCWludCByZXQ7CiAKQEAgLTE2MjgsNyArMTYyNiw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJpbmctPnNwYWNlIC09IGJ5dGVzOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQzLDEyICsxNjQwLDE3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IF9faW50ZWxfcmluZ19wcmVwYXJlKHJpbmcsIG51bV9kd29yZHMgKiBzaXplb2YodWludDMyX3QpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogUHJlYWxsb2NhdGUgdGhlIG9sciBiZWZvcmUgdG91Y2hpbmcgdGhlIHJpbmcgKi8KIAlyZXQgPSBpbnRlbF9yaW5nX2FsbG9jX3NlcW5vKHJpbmcpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gX19pbnRlbF9yaW5nX2JlZ2luKHJpbmcsIG51bV9kd29yZHMgKiBzaXplb2YodWludDMyX3QpKTsKKwlyaW5nLT5zcGFjZSAtPSBudW1fZHdvcmRzICogc2l6ZW9mKHVpbnQzMl90KTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBpbnRlbF9yaW5nX2luaXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pCkBAIC0xODM4LDcgKzE4NDAsNyBAQAogCX0KIAlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKLQlpZiAoSVNfR0VONyhkZXYpICYmIGZsdXNoKQorCWlmIChJU19HRU43KGRldikgJiYgIWludmFsaWRhdGUgJiYgZmx1c2gpCiAJCXJldHVybiBnZW43X3JpbmdfZmJjX2ZsdXNoKHJpbmcsIEZCQ19SRU5EX0NBQ0hFX0NMRUFOKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IGE1ODNlOGYuLjk1YmRmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTQxMywyMyArNDEzLDM0IEBACiBzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX2RlYnVnX3dyaXRlKHN0cnVjdCBpbnRlbF9zZHZvICppbnRlbF9zZHZvLCB1OCBjbWQsCiAJCQkJICAgY29uc3Qgdm9pZCAqYXJncywgaW50IGFyZ3NfbGVuKQogewotCWludCBpOworCWludCBpLCBwb3MgPSAwOworI2RlZmluZSBCVUZfTEVOIDI1NgorCWNoYXIgYnVmZmVyW0JVRl9MRU5dOwogCi0JRFJNX0RFQlVHX0tNUygiJXM6IFc6ICUwMlggIiwKLQkJCQlTRFZPX05BTUUoaW50ZWxfc2R2byksIGNtZCk7Ci0JZm9yIChpID0gMDsgaSA8IGFyZ3NfbGVuOyBpKyspCi0JCURSTV9MT0dfS01TKCIlMDJYICIsICgodTggKilhcmdzKVtpXSk7Ci0JZm9yICg7IGkgPCA4OyBpKyspCi0JCURSTV9MT0dfS01TKCIgICAiKTsKKyNkZWZpbmUgQlVGX1BSSU5UKGFyZ3MuLi4pIFwKKwlwb3MgKz0gc25wcmludGYoYnVmZmVyICsgcG9zLCBtYXhfdChpbnQsIEJVRl9MRU4gLSBwb3MsIDApLCBhcmdzKQorCisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnc19sZW47IGkrKykgeworCQlCVUZfUFJJTlQoIiUwMlggIiwgKCh1OCAqKWFyZ3MpW2ldKTsKKwl9CisJZm9yICg7IGkgPCA4OyBpKyspIHsKKwkJQlVGX1BSSU5UKCIgICAiKTsKKwl9CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2R2b19jbWRfbmFtZXMpOyBpKyspIHsKIAkJaWYgKGNtZCA9PSBzZHZvX2NtZF9uYW1lc1tpXS5jbWQpIHsKLQkJCURSTV9MT0dfS01TKCIoJXMpIiwgc2R2b19jbWRfbmFtZXNbaV0ubmFtZSk7CisJCQlCVUZfUFJJTlQoIiglcykiLCBzZHZvX2NtZF9uYW1lc1tpXS5uYW1lKTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChpID09IEFSUkFZX1NJWkUoc2R2b19jbWRfbmFtZXMpKQotCQlEUk1fTE9HX0tNUygiKCUwMlgpIiwgY21kKTsKLQlEUk1fTE9HX0tNUygiXG4iKTsKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHNkdm9fY21kX25hbWVzKSkgeworCQlCVUZfUFJJTlQoIiglMDJYKSIsIGNtZCk7CisJfQorCUJVR19PTihwb3MgPj0gQlVGX0xFTiAtIDEpOworI3VuZGVmIEJVRl9QUklOVAorI3VuZGVmIEJVRl9MRU4KKworCURSTV9ERUJVR19LTVMoIiVzOiBXOiAlMDJYICVzXG4iLCBTRFZPX05BTUUoaW50ZWxfc2R2byksIGNtZCwgYnVmZmVyKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9zdGF0dXNfbmFtZXNbXSA9IHsKQEAgLTUxMiw5ICs1MjMsMTAgQEAKIHsKIAl1OCByZXRyeSA9IDE1OyAvKiA1IHF1aWNrIGNoZWNrcywgZm9sbG93ZWQgYnkgMTAgbG9uZyBjaGVja3MgKi8KIAl1OCBzdGF0dXM7Ci0JaW50IGk7CisJaW50IGksIHBvcyA9IDA7CisjZGVmaW5lIEJVRl9MRU4gMjU2CisJY2hhciBidWZmZXJbQlVGX0xFTl07CiAKLQlEUk1fREVCVUdfS01TKCIlczogUjogIiwgU0RWT19OQU1FKGludGVsX3Nkdm8pKTsKIAogCS8qCiAJICogVGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgYWxsIGNvbW1hbmRzIHdpbGwgYmUKQEAgLTU1MSwxMCArNTYzLDEzIEBACiAJCQlnb3RvIGxvZ19mYWlsOwogCX0KIAorI2RlZmluZSBCVUZfUFJJTlQoYXJncy4uLikgXAorCXBvcyArPSBzbnByaW50ZihidWZmZXIgKyBwb3MsIG1heF90KGludCwgQlVGX0xFTiAtIHBvcywgMCksIGFyZ3MpCisKIAlpZiAoc3RhdHVzIDw9IFNEVk9fQ01EX1NUQVRVU19TQ0FMSU5HX05PVF9TVVBQKQotCQlEUk1fTE9HX0tNUygiKCVzKSIsIGNtZF9zdGF0dXNfbmFtZXNbc3RhdHVzXSk7CisJCUJVRl9QUklOVCgiKCVzKSIsIGNtZF9zdGF0dXNfbmFtZXNbc3RhdHVzXSk7CiAJZWxzZQotCQlEUk1fTE9HX0tNUygiKD8/PyAlZCkiLCBzdGF0dXMpOworCQlCVUZfUFJJTlQoIig/Pz8gJWQpIiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCiAJCWdvdG8gbG9nX2ZhaWw7CkBAIC01NjUsMTMgKzU4MCwxNyBAQAogCQkJCQkgIFNEVk9fSTJDX1JFVFVSTl8wICsgaSwKIAkJCQkJICAmKCh1OCAqKXJlc3BvbnNlKVtpXSkpCiAJCQlnb3RvIGxvZ19mYWlsOwotCQlEUk1fTE9HX0tNUygiICUwMlgiLCAoKHU4ICopcmVzcG9uc2UpW2ldKTsKKwkJQlVGX1BSSU5UKCIgJTAyWCIsICgodTggKilyZXNwb25zZSlbaV0pOwogCX0KLQlEUk1fTE9HX0tNUygiXG4iKTsKKwlCVUdfT04ocG9zID49IEJVRl9MRU4gLSAxKTsKKyN1bmRlZiBCVUZfUFJJTlQKKyN1bmRlZiBCVUZfTEVOCisKKwlEUk1fREVCVUdfS01TKCIlczogUjogJXNcbiIsIFNEVk9fTkFNRShpbnRlbF9zZHZvKSwgYnVmZmVyKTsKIAlyZXR1cm4gdHJ1ZTsKIAogbG9nX2ZhaWw6Ci0JRFJNX0xPR19LTVMoIi4uLiBmYWlsZWRcbiIpOworCURSTV9ERUJVR19LTVMoIiVzOiBSOiAuLi4gZmFpbGVkXG4iLCBTRFZPX05BTUUoaW50ZWxfc2R2bykpOwogCXJldHVybiBmYWxzZTsKIH0KIApAQCAtOTMzLDcgKzk1Miw3IEBACiAKIHN0YXRpYyBib29sIGludGVsX3Nkdm9fd3JpdGVfaW5mb2ZyYW1lKHN0cnVjdCBpbnRlbF9zZHZvICppbnRlbF9zZHZvLAogCQkJCSAgICAgICB1bnNpZ25lZCBpZl9pbmRleCwgdWludDhfdCB0eF9yYXRlLAotCQkJCSAgICAgICB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBsZW5ndGgpCisJCQkJICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGxlbmd0aCkKIHsKIAl1aW50OF90IHNldF9idWZfaW5kZXhbMl0gPSB7IGlmX2luZGV4LCAwIH07CiAJdWludDhfdCBoYnVmX3NpemUsIHRtcFs4XTsKQEAgLTE1MTcsOCArMTUzNiw5IEBACiAJaW50ZWxfbW9kZXNldF9jaGVja19zdGF0ZShjb25uZWN0b3ItPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfc2R2b19tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQorc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzCitpbnRlbF9zZHZvX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJc3RydWN0IGludGVsX3Nkdm8gKmludGVsX3Nkdm8gPSBpbnRlbF9hdHRhY2hlZF9zZHZvKGNvbm5lY3Rvcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm9fcmVncy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKaW5kZXggNzcwYmRkNi4uMmUyZDRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKQEAgLTU5LDcgKzU5LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RhbGxfc3VwcG9ydDoxOwogCXVuc2lnbmVkIGludCBwYWQ6MTsKIAl1MTYgb3V0cHV0X2ZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE5vdGU6IFNEVk8gZGV0YWlsZWQgdGltaW5nIGZsYWdzIG1hdGNoIEVESUQgbWlzYyBmbGFncy4gKi8KICNkZWZpbmUgRFREX0ZMQUdfSFNZTkNfUE9TSVRJVkUgKDEgPDwgMSkKQEAgLTk0LDEyICs5NCwxMiBAQAogCQl1OCB2X3N5bmNfb2ZmX2hpZ2g7CiAJCXU4IHJlc2VydmVkOwogCX0gcGFydDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGludGVsX3Nkdm9fcGl4ZWxfY2xvY2tfcmFuZ2UgewogCXUxNiBtaW47CS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCiAJdTE2IG1heDsJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaW50ZWxfc2R2b19wcmVmZXJyZWRfaW5wdXRfdGltaW5nX2FyZ3MgewogCXUxNiBjbG9jazsKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXU4CWludGVybGFjZToxOwogCXU4CXNjYWxlZDoxOwogCXU4CXBhZDo2OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEkyQyByZWdpc3RlcnMgZm9yIFNEVk8gKi8KICNkZWZpbmUgU0RWT19JMkNfQVJHXzAJCQkJMHgwNwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJdW5zaWduZWQgaW50IGlucHV0MF90cmFpbmVkOjE7CiAJdW5zaWduZWQgaW50IGlucHV0MV90cmFpbmVkOjE7CiAJdW5zaWduZWQgaW50IHBhZDo2OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKiBSZXR1cm5zIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzIG9mIGFjdGl2ZSBvdXRwdXRzLiAqLwogI2RlZmluZSBTRFZPX0NNRF9HRVRfQUNUSVZFX09VVFBVVFMJCQkweDA0CkBAIC0yMTksNyArMjE5LDcgQEAKIAl1bnNpZ25lZCBpbnQgYW1iaWVudF9saWdodF9pbnRlcnJ1cHQ6MTsKIAl1bnNpZ25lZCBpbnQgaGRtaV9hdWRpb19lbmNyeXB0X2NoYW5nZToxOwogCXVuc2lnbmVkIGludCBwYWQ6NjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIFNlbGVjdHMgd2hpY2ggaW5wdXQgaXMgYWZmZWN0ZWQgYnkgZnV0dXJlIGlucHV0IGNvbW1hbmRzLgpAQCAtMjMyLDcgKzIzMiw3IEBACiBzdHJ1Y3QgaW50ZWxfc2R2b19zZXRfdGFyZ2V0X2lucHV0X2FyZ3MgewogCXVuc2lnbmVkIGludCB0YXJnZXRfMToxOwogCXVuc2lnbmVkIGludCBwYWQ6NzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIFRha2VzIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzIG9mIHdoaWNoIG91dHB1dHMgYXJlIHRhcmdldGVkIGJ5CkBAIC0zNzAsNyArMzcwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MGlfNjA6MTsKIAl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MHBfNjA6MTsKIAl1bnNpZ25lZCBpbnQgcGFkOjM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfVFZfRk9STUFUCQkJCTB4MjgKIApAQCAtNDAxLDcgKzQwMSw3IEBACiAJdW5zaWduZWQgaW50IHNlY2FtX2w6MTsKIAl1bnNpZ25lZCBpbnQgc2VjYW1fNjA6MTsKIAl1bnNpZ25lZCBpbnQgcGFkOjU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGludGVsX3Nkdm9fc2R0dl9yZXNvbHV0aW9uX3JlcGx5IHsKIAl1bnNpZ25lZCBpbnQgcmVzXzMyMHgyMDA6MTsKQEAgLTQyNiw3ICs0MjYsNyBAQAogCXVuc2lnbmVkIGludCByZXNfMTAyNHg3Njg6MTsKIAl1bnNpZ25lZCBpbnQgcmVzXzEyODB4MTAyNDoxOwogCXVuc2lnbmVkIGludCBwYWQ6NTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBHZXQgc3VwcG9ydGVkIHJlc29sdXRpb24gd2l0aCBzcXVpcmUgcGl4ZWwgYXNwZWN0IHJhdGlvIHRoYXQgY2FuIGJlCiAgICBzY2FsZWQgZm9yIHRoZSByZXF1ZXN0ZWQgSERUViBmb3JtYXQgKi8KQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwaV82MDoxOwogCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwcF82MDoxOwogCXVuc2lnbmVkIGludCBwYWQ6NjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaW50ZWxfc2R2b19oZHR2X3Jlc29sdXRpb25fcmVwbHkgewogCXVuc2lnbmVkIGludCByZXNfNjQweDQ4MDoxOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAKIAl1bnNpZ25lZCBpbnQgcmVzXzEyODB4NzY4OjE7CiAJdW5zaWduZWQgaW50IHBhZDU6NzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBHZXQgc3VwcG9ydGVkIHBvd2VyIHN0YXRlIHJldHVybnMgaW5mbyBmb3IgZW5jb2RlciBhbmQgbW9uaXRvciwgcmVseSBvbgogICAgbGFzdCBTZXRUYXJnZXRJbnB1dCBhbmQgU2V0VGFyZ2V0T3V0cHV0IGNhbGxzICovCkBAIC01NTcsMTMgKzU1NywxMyBAQAogCiAJdW5zaWduZWQgaW50IHQ0X2hpZ2g6MjsKIAl1bnNpZ25lZCBpbnQgcGFkOjY7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfTUFYX0JBQ0tMSUdIVF9MRVZFTAkJMHgzMAogc3RydWN0IHNkdm9fbWF4X2JhY2tsaWdodF9yZXBseSB7CiAJdTggbWF4X3ZhbHVlOwogCXU4IGRlZmF1bHRfdmFsdWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfQkFDS0xJR0hUX0xFVkVMCQkJMHgzMQogI2RlZmluZSBTRFZPX0NNRF9TRVRfQkFDS0xJR0hUX0xFVkVMCQkJMHgzMgpAQCAtNTczLDE0ICs1NzMsMTQgQEAKIAl1MTYgdHJpcF9sb3c7CiAJdTE2IHRyaXBfaGlnaDsKIAl1MTYgdmFsdWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKICNkZWZpbmUgU0RWT19DTURfU0VUX0FNQklFTlRfTElHSFQJCQkweDM0CiBzdHJ1Y3Qgc2R2b19zZXRfYW1iaWVudF9saWdodF9yZXBseSB7CiAJdTE2IHRyaXBfbG93OwogCXUxNiB0cmlwX2hpZ2g7CiAJdW5zaWduZWQgaW50IGVuYWJsZToxOwogCXVuc2lnbmVkIGludCBwYWQ6NzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBTZXQgZGlzcGxheSBwb3dlciBzdGF0ZSAqLwogI2RlZmluZSBTRFZPX0NNRF9TRVRfRElTUExBWV9QT1dFUl9TVEFURQkJMHg3ZApAQCAtNjA4LDcgKzYwOCw3IEBACiAJdW5zaWduZWQgaW50IGRpdGhlcjoxOwogCXVuc2lnbmVkIGludCB0dl9jaHJvbWFfZmlsdGVyOjE7CiAJdW5zaWduZWQgaW50IHR2X2x1bWFfZmlsdGVyOjE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogUGljdHVyZSBlbmhhbmNlbWVudCBsaW1pdHMgYmVsb3cgYXJlIGRlcGVuZGVudCBvbiB0aGUgY3VycmVudCBUViBmb3JtYXQsCiAgKiBhbmQgdGh1cyBuZWVkIHRvIGJlIHF1ZXJpZWQgYW5kIHNldCBhZnRlciBpdC4KQEAgLTYzMCw3ICs2MzAsNyBAQAogc3RydWN0IGludGVsX3Nkdm9fZW5oYW5jZW1lbnRfbGltaXRzX3JlcGx5IHsKIAl1MTYgbWF4X3ZhbHVlOwogCXUxNiBkZWZhdWx0X3ZhbHVlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU0RWT19DTURfR0VUX0xWRFNfUEFORUxfSU5GT1JNQVRJT04JCTB4N2YKICNkZWZpbmUgU0RWT19DTURfU0VUX0xWRFNfUEFORUxfSU5GT1JNQVRJT04JCTB4ODAKQEAgLTY3MSw3ICs2NzEsNyBAQAogI2RlZmluZSBTRFZPX0NNRF9TRVRfVFZfTFVNQV9GSUxURVIJCQkweDc5CiBzdHJ1Y3QgaW50ZWxfc2R2b19lbmhhbmNlbWVudHNfYXJnIHsKIAl1MTYgdmFsdWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfRE9UX0NSQVdMCQkJCTB4NzAKICNkZWZpbmUgU0RWT19DTURfU0VUX0RPVF9DUkFXTAkJCQkweDcxCkBAIC03MjcsNCArNzI3LDQgQEAKIHN0cnVjdCBpbnRlbF9zZHZvX2VuY29kZSB7CiAJdTggZHZpX3JldjsKIAl1OCBoZG1pX3JldjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3NpZGViYW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zaWRlYmFuZC5jCmluZGV4IDk5NDRkODEuLjA5NTRmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3NpZGViYW5kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2lkZWJhbmQuYwpAQCAtOTAsNiArOTAsMjIgQEAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogfQogCit1MzIgdmx2X2J1bml0X3JlYWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnKQoreworCXUzMiB2YWwgPSAwOworCisJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBQQ0lfREVWRk4oMiwgMCksIElPU0ZfUE9SVF9CVU5JVCwKKwkJCVBVTklUX09QQ09ERV9SRUdfUkVBRCwgcmVnLCAmdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgdmx2X2J1bml0X3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIFBDSV9ERVZGTigyLCAwKSwgSU9TRl9QT1JUX0JVTklULAorCQkJUFVOSVRfT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKK30KKwogdTMyIHZsdl9uY19yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTggYWRkcikKIHsKIAl1MzIgdmFsID0gMDsKQEAgLTE2MCwyNyArMTc2LDE4IEBACiAJCQlQVU5JVF9PUENPREVfUkVHX1dSSVRFLCByZWcsICZ2YWwpOwogfQogCi1zdGF0aWMgdTMyIHZsdl9nZXRfcGh5X3BvcnQoZW51bSBwaXBlIHBpcGUpCi17Ci0JdTMyIHBvcnQgPSBJT1NGX1BPUlRfRFBJTzsKLQotCVdBUk5fT04gKChwaXBlICE9IFBJUEVfQSkgJiYgKHBpcGUgIT0gUElQRV9CKSk7Ci0KLQlyZXR1cm4gcG9ydDsKLX0KLQogdTMyIHZsdl9kcGlvX3JlYWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBlbnVtIHBpcGUgcGlwZSwgaW50IHJlZykKIHsKIAl1MzIgdmFsID0gMDsKIAotCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgRFBJT19ERVZGTiwgdmx2X2dldF9waHlfcG9ydChwaXBlKSwKKwl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIERQSU9fREVWRk4sIERQSU9fUEhZX0lPU0ZfUE9SVChEUElPX1BIWShwaXBlKSksCiAJCQlEUElPX09QQ09ERV9SRUdfUkVBRCwgcmVnLCAmdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCiB2b2lkIHZsdl9kcGlvX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgZW51bSBwaXBlIHBpcGUsIGludCByZWcsIHUzMiB2YWwpCiB7Ci0Jdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBEUElPX0RFVkZOLCB2bHZfZ2V0X3BoeV9wb3J0KHBpcGUpLAorCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgRFBJT19ERVZGTiwgRFBJT19QSFlfSU9TRl9QT1JUKERQSU9fUEhZKHBpcGUpKSwKIAkJCURQSU9fT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKIH0KIApAQCAtMjQyLDMgKzI0OSwxNyBAQAogCQlyZXR1cm47CiAJfQogfQorCit1MzIgdmx2X2ZsaXNkc2lfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpCit7CisJdTMyIHZhbCA9IDA7CisJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBEUElPX0RFVkZOLCBJT1NGX1BPUlRfRkxJU0RTSSwKKwkJCQkJRFBJT19PUENPREVfUkVHX1JFQUQsIHJlZywgJnZhbCk7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCB2bHZfZmxpc2RzaV93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBEUElPX0RFVkZOLCBJT1NGX1BPUlRfRkxJU0RTSSwKKwkJCQkJRFBJT19PUENPREVfUkVHX1dSSVRFLCByZWcsICZ2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc3ByaXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwppbmRleCBiOWZhYmY4Li43MTZhM2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwpAQCAtMTA0LDYgKzEwNCwxMiBAQAogCQlicmVhazsKIAl9CiAKKwkvKgorCSAqIEVuYWJsZSBnYW1tYSB0byBtYXRjaCBwcmltYXJ5L2N1cnNvciBwbGFuZSBiZWhhdmlvdXIuCisJICogRklYTUUgc2hvdWxkIGJlIHVzZXIgY29udHJvbGxhYmxlIHZpYSBwcm9wZXJ0aWVzYS4KKwkgKi8KKwlzcHJjdGwgfD0gU1BfR0FNTUFfRU5BQkxFOworCiAJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJc3ByY3RsIHw9IFNQX1RJTEVEOwogCkBAIC0xMzUsOCArMTQxLDggQEAKIAogCUk5MTVfV1JJVEUoU1BTSVpFKHBpcGUsIHBsYW5lKSwgKGNydGNfaCA8PCAxNikgfCBjcnRjX3cpOwogCUk5MTVfV1JJVEUoU1BDTlRSKHBpcGUsIHBsYW5lKSwgc3ByY3RsKTsKLQlJOTE1X01PRElGWV9ESVNQQkFTRShTUFNVUkYocGlwZSwgcGxhbmUpLCBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKSArCi0JCQkgICAgIHNwcnN1cmZfb2Zmc2V0KTsKKwlJOTE1X1dSSVRFKFNQU1VSRihwaXBlLCBwbGFuZSksIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsKKwkJICAgc3Byc3VyZl9vZmZzZXQpOwogCVBPU1RJTkdfUkVBRChTUFNVUkYocGlwZSwgcGxhbmUpKTsKIH0KIApAQCAtMTUyLDcgKzE1OCw3IEBACiAJSTkxNV9XUklURShTUENOVFIocGlwZSwgcGxhbmUpLCBJOTE1X1JFQUQoU1BDTlRSKHBpcGUsIHBsYW5lKSkgJgogCQkgICB+U1BfRU5BQkxFKTsKIAkvKiBBY3RpdmF0ZSBkb3VibGUgYnVmZmVyZWQgcmVnaXN0ZXIgdXBkYXRlICovCi0JSTkxNV9NT0RJRllfRElTUEJBU0UoU1BTVVJGKHBpcGUsIHBsYW5lKSwgMCk7CisJSTkxNV9XUklURShTUFNVUkYocGlwZSwgcGxhbmUpLCAwKTsKIAlQT1NUSU5HX1JFQUQoU1BTVVJGKHBpcGUsIHBsYW5lKSk7CiAKIAlpbnRlbF91cGRhdGVfc3ByaXRlX3dhdGVybWFya3MoZHBsYW5lLCBjcnRjLCAwLCAwLCBmYWxzZSwgZmFsc2UpOwpAQCAtMjI0LDcgKzIzMCw2IEBACiAJdTMyIHNwcmN0bCwgc3Byc2NhbGUgPSAwOwogCXVuc2lnbmVkIGxvbmcgc3Byc3VyZl9vZmZzZXQsIGxpbmVhcl9vZmZzZXQ7CiAJaW50IHBpeGVsX3NpemUgPSBkcm1fZm9ybWF0X3BsYW5lX2NwcChmYi0+cGl4ZWxfZm9ybWF0LCAwKTsKLQlib29sIHNjYWxpbmdfd2FzX2VuYWJsZWQgPSBkZXZfcHJpdi0+c3ByaXRlX3NjYWxpbmdfZW5hYmxlZDsKIAogCXNwcmN0bCA9IEk5MTVfUkVBRChTUFJDVEwocGlwZSkpOwogCkBAIC0yNTcsNiArMjYyLDEyIEBACiAJCUJVRygpOwogCX0KIAorCS8qCisJICogRW5hYmxlIGdhbW1hIHRvIG1hdGNoIHByaW1hcnkvY3Vyc29yIHBsYW5lIGJlaGF2aW91ci4KKwkgKiBGSVhNRSBzaG91bGQgYmUgdXNlciBjb250cm9sbGFibGUgdmlhIHByb3BlcnRpZXNhLgorCSAqLworCXNwcmN0bCB8PSBTUFJJVEVfR0FNTUFfRU5BQkxFOworCiAJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJc3ByY3RsIHw9IFNQUklURV9USUxFRDsKIApAQCAtMjc5LDIxICsyOTAsOCBAQAogCWNydGNfdy0tOwogCWNydGNfaC0tOwogCi0JLyoKLQkgKiBJVkIgd29ya2Fyb3VuZDogbXVzdCBkaXNhYmxlIGxvdyBwb3dlciB3YXRlcm1hcmtzIGZvciBhdCBsZWFzdAotCSAqIG9uZSBmcmFtZSBiZWZvcmUgZW5hYmxpbmcgc2NhbGluZy4gIExQIHdhdGVybWFya3MgY2FuIGJlIHJlLWVuYWJsZWQKLQkgKiB3aGVuIHNjYWxpbmcgaXMgZGlzYWJsZWQuCi0JICovCi0JaWYgKGNydGNfdyAhPSBzcmNfdyB8fCBjcnRjX2ggIT0gc3JjX2gpIHsKLQkJZGV2X3ByaXYtPnNwcml0ZV9zY2FsaW5nX2VuYWJsZWQgfD0gMSA8PCBwaXBlOwotCi0JCWlmICghc2NhbGluZ193YXNfZW5hYmxlZCkgewotCQkJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoY3J0Yyk7Ci0JCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBwaXBlKTsKLQkJfQorCWlmIChjcnRjX3cgIT0gc3JjX3cgfHwgY3J0Y19oICE9IHNyY19oKQogCQlzcHJzY2FsZSA9IFNQUklURV9TQ0FMRV9FTkFCTEUgfCAoc3JjX3cgPDwgMTYpIHwgc3JjX2g7Ci0JfSBlbHNlCi0JCWRldl9wcml2LT5zcHJpdGVfc2NhbGluZ19lbmFibGVkICY9IH4oMSA8PCBwaXBlKTsKIAogCUk5MTVfV1JJVEUoU1BSU1RSSURFKHBpcGUpLCBmYi0+cGl0Y2hlc1swXSk7CiAJSTkxNV9XUklURShTUFJQT1MocGlwZSksIChjcnRjX3kgPDwgMTYpIHwgY3J0Y194KTsKQEAgLTMxNywxMyArMzE1LDkgQEAKIAlpZiAoaW50ZWxfcGxhbmUtPmNhbl9zY2FsZSkKIAkJSTkxNV9XUklURShTUFJTQ0FMRShwaXBlKSwgc3Byc2NhbGUpOwogCUk5MTVfV1JJVEUoU1BSQ1RMKHBpcGUpLCBzcHJjdGwpOwotCUk5MTVfTU9ESUZZX0RJU1BCQVNFKFNQUlNVUkYocGlwZSksCi0JCQkgICAgIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgc3Byc3VyZl9vZmZzZXQpOworCUk5MTVfV1JJVEUoU1BSU1VSRihwaXBlKSwKKwkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBzcHJzdXJmX29mZnNldCk7CiAJUE9TVElOR19SRUFEKFNQUlNVUkYocGlwZSkpOwotCi0JLyogcG90ZW50aWFsbHkgcmUtZW5hYmxlIExQIHdhdGVybWFya3MgKi8KLQlpZiAoc2NhbGluZ193YXNfZW5hYmxlZCAmJiAhZGV2X3ByaXYtPnNwcml0ZV9zY2FsaW5nX2VuYWJsZWQpCi0JCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGNydGMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzMzLDIzICszMjcsMjIgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9wbGFuZSAqaW50ZWxfcGxhbmUgPSB0b19pbnRlbF9wbGFuZShwbGFuZSk7CiAJaW50IHBpcGUgPSBpbnRlbF9wbGFuZS0+cGlwZTsKLQlib29sIHNjYWxpbmdfd2FzX2VuYWJsZWQgPSBkZXZfcHJpdi0+c3ByaXRlX3NjYWxpbmdfZW5hYmxlZDsKIAogCUk5MTVfV1JJVEUoU1BSQ1RMKHBpcGUpLCBJOTE1X1JFQUQoU1BSQ1RMKHBpcGUpKSAmIH5TUFJJVEVfRU5BQkxFKTsKIAkvKiBDYW4ndCBsZWF2ZSB0aGUgc2NhbGVyIGVuYWJsZWQuLi4gKi8KIAlpZiAoaW50ZWxfcGxhbmUtPmNhbl9zY2FsZSkKIAkJSTkxNV9XUklURShTUFJTQ0FMRShwaXBlKSwgMCk7CiAJLyogQWN0aXZhdGUgZG91YmxlIGJ1ZmZlcmVkIHJlZ2lzdGVyIHVwZGF0ZSAqLwotCUk5MTVfTU9ESUZZX0RJU1BCQVNFKFNQUlNVUkYocGlwZSksIDApOworCUk5MTVfV1JJVEUoU1BSU1VSRihwaXBlKSwgMCk7CiAJUE9TVElOR19SRUFEKFNQUlNVUkYocGlwZSkpOwogCi0JZGV2X3ByaXYtPnNwcml0ZV9zY2FsaW5nX2VuYWJsZWQgJj0gfigxIDw8IHBpcGUpOworCS8qCisJICogQXZvaWQgdW5kZXJydW5zIHdoZW4gZGlzYWJsaW5nIHRoZSBzcHJpdGUuCisJICogRklYTUUgcmVtb3ZlIG9uY2Ugd2F0ZXJtYXJrIHVwZGF0ZXMgYXJlIGRvbmUgcHJvcGVybHkuCisJICovCisJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgcGlwZSk7CiAKIAlpbnRlbF91cGRhdGVfc3ByaXRlX3dhdGVybWFya3MocGxhbmUsIGNydGMsIDAsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBwb3RlbnRpYWxseSByZS1lbmFibGUgTFAgd2F0ZXJtYXJrcyAqLwotCWlmIChzY2FsaW5nX3dhc19lbmFibGVkICYmICFkZXZfcHJpdi0+c3ByaXRlX3NjYWxpbmdfZW5hYmxlZCkKLQkJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoY3J0Yyk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ1Myw2ICs0NDYsMTIgQEAKIAkJQlVHKCk7CiAJfQogCisJLyoKKwkgKiBFbmFibGUgZ2FtbWEgdG8gbWF0Y2ggcHJpbWFyeS9jdXJzb3IgcGxhbmUgYmVoYXZpb3VyLgorCSAqIEZJWE1FIHNob3VsZCBiZSB1c2VyIGNvbnRyb2xsYWJsZSB2aWEgcHJvcGVydGllc2EuCisJICovCisJZHZzY250ciB8PSBEVlNfR0FNTUFfRU5BQkxFOworCiAJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJZHZzY250ciB8PSBEVlNfVElMRUQ7CiAKQEAgLTQ3MCw3ICs0NjksNyBAQAogCWNydGNfaC0tOwogCiAJZHZzc2NhbGUgPSAwOwotCWlmIChJU19HRU41KGRldikgfHwgY3J0Y193ICE9IHNyY193IHx8IGNydGNfaCAhPSBzcmNfaCkKKwlpZiAoY3J0Y193ICE9IHNyY193IHx8IGNydGNfaCAhPSBzcmNfaCkKIAkJZHZzc2NhbGUgPSBEVlNfU0NBTEVfRU5BQkxFIHwgKHNyY193IDw8IDE2KSB8IHNyY19oOwogCiAJSTkxNV9XUklURShEVlNTVFJJREUocGlwZSksIGZiLT5waXRjaGVzWzBdKTsKQEAgLTQ5MCw4ICs0ODksOCBAQAogCUk5MTVfV1JJVEUoRFZTU0laRShwaXBlKSwgKGNydGNfaCA8PCAxNikgfCBjcnRjX3cpOwogCUk5MTVfV1JJVEUoRFZTU0NBTEUocGlwZSksIGR2c3NjYWxlKTsKIAlJOTE1X1dSSVRFKERWU0NOVFIocGlwZSksIGR2c2NudHIpOwotCUk5MTVfTU9ESUZZX0RJU1BCQVNFKERWU1NVUkYocGlwZSksCi0JCQkgICAgIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgZHZzc3VyZl9vZmZzZXQpOworCUk5MTVfV1JJVEUoRFZTU1VSRihwaXBlKSwKKwkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBkdnNzdXJmX29mZnNldCk7CiAJUE9TVElOR19SRUFEKERWU1NVUkYocGlwZSkpOwogfQogCkBAIC01MDcsOSArNTA2LDE1IEBACiAJLyogRGlzYWJsZSB0aGUgc2NhbGVyICovCiAJSTkxNV9XUklURShEVlNTQ0FMRShwaXBlKSwgMCk7CiAJLyogRmx1c2ggZG91YmxlIGJ1ZmZlcmVkIHJlZ2lzdGVyIHVwZGF0ZXMgKi8KLQlJOTE1X01PRElGWV9ESVNQQkFTRShEVlNTVVJGKHBpcGUpLCAwKTsKKwlJOTE1X1dSSVRFKERWU1NVUkYocGlwZSksIDApOwogCVBPU1RJTkdfUkVBRChEVlNTVVJGKHBpcGUpKTsKIAorCS8qCisJICogQXZvaWQgdW5kZXJydW5zIHdoZW4gZGlzYWJsaW5nIHRoZSBzcHJpdGUuCisJICogRklYTUUgcmVtb3ZlIG9uY2Ugd2F0ZXJtYXJrIHVwZGF0ZXMgYXJlIGRvbmUgcHJvcGVybHkuCisJICovCisJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgcGlwZSk7CisKIAlpbnRlbF91cGRhdGVfc3ByaXRlX3dhdGVybWFya3MocGxhbmUsIGNydGMsIDAsIDAsIGZhbHNlLCBmYWxzZSk7CiB9CiAKQEAgLTY0Myw2ICs2NDgsMTUgQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIGNvbG9ya2V5X2VuYWJsZWQoc3RydWN0IGludGVsX3BsYW5lICppbnRlbF9wbGFuZSkKK3sKKwlzdHJ1Y3QgZHJtX2ludGVsX3Nwcml0ZV9jb2xvcmtleSBrZXk7CisKKwlpbnRlbF9wbGFuZS0+Z2V0X2NvbG9ya2V5KCZpbnRlbF9wbGFuZS0+YmFzZSwgJmtleSk7CisKKwlyZXR1cm4ga2V5LmZsYWdzICE9IEk5MTVfU0VUX0NPTE9SS0VZX05PTkU7Cit9CisKIHN0YXRpYyBpbnQKIGludGVsX3VwZGF0ZV9wbGFuZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50IGNydGNfeCwgaW50IGNydGNfeSwKQEAgLTgyOCw3ICs4NDIsNyBAQAogCSAqIElmIHRoZSBzcHJpdGUgaXMgY29tcGxldGVseSBjb3ZlcmluZyB0aGUgcHJpbWFyeSBwbGFuZSwKIAkgKiB3ZSBjYW4gZGlzYWJsZSB0aGUgcHJpbWFyeSBhbmQgc2F2ZSBwb3dlci4KIAkgKi8KLQlkaXNhYmxlX3ByaW1hcnkgPSBkcm1fcmVjdF9lcXVhbHMoJmRzdCwgJmNsaXApOworCWRpc2FibGVfcHJpbWFyeSA9IGRybV9yZWN0X2VxdWFscygmZHN0LCAmY2xpcCkgJiYgIWNvbG9ya2V5X2VuYWJsZWQoaW50ZWxfcGxhbmUpOwogCVdBUk5fT04oZGlzYWJsZV9wcmltYXJ5ICYmICF2aXNpYmxlICYmIGludGVsX2NydGMtPmFjdGl2ZSk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91bmNvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCmluZGV4IDI1Y2JlMDcuLjg3ZGY2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCkBAIC02NCw3ICs2NCw4IEBACiAJX19yYXdfcG9zdGluZ19yZWFkKGRldl9wcml2LCBFQ09CVVMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorc3RhdGljIHZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJCQlpbnQgZndfZW5naW5lKQogewogCWlmICh3YWl0X2Zvcl9hdG9taWMoKF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBGT1JDRVdBS0VfQUNLKSAmIDEpID09IDAsCiAJCQkgICAgRk9SQ0VXQUtFX0FDS19USU1FT1VUX01TKSkKQEAgLTg5LDcgKzkwLDggQEAKIAlfX3Jhd19wb3N0aW5nX3JlYWQoZGV2X3ByaXYsIEVDT0JVUyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCitzdGF0aWMgdm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9tdF9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQkJCWludCBmd19lbmdpbmUpCiB7CiAJdTMyIGZvcmNld2FrZV9hY2s7CiAKQEAgLTEyMSwxMiArMTIzLDEyIEBACiAJdTMyIGd0Zmlmb2RiZzsKIAogCWd0Zmlmb2RiZyA9IF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBHVEZJRk9EQkcpOwotCWlmIChXQVJOKGd0Zmlmb2RiZyAmIEdUX0ZJRk9fQ1BVX0VSUk9SX01BU0ssCi0JICAgICAiTU1JTyByZWFkIG9yIHdyaXRlIGhhcyBiZWVuIGRyb3BwZWQgJXhcbiIsIGd0Zmlmb2RiZykpCi0JCV9fcmF3X2k5MTVfd3JpdGUzMihkZXZfcHJpdiwgR1RGSUZPREJHLCBHVF9GSUZPX0NQVV9FUlJPUl9NQVNLKTsKKwlpZiAoV0FSTihndGZpZm9kYmcsICJHVCB3YWtlIEZJRk8gZXJyb3IgMHgleFxuIiwgZ3RmaWZvZGJnKSkKKwkJX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBHVEZJRk9EQkcsIGd0Zmlmb2RiZyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCitzdGF0aWMgdm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQkJCWludCBmd19lbmdpbmUpCiB7CiAJX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0UsIDApOwogCS8qIHNvbWV0aGluZyBmcm9tIHNhbWUgY2FjaGVsaW5lLCBidXQgIUZPUkNFV0FLRSAqLwpAQCAtMTM0LDcgKzEzNiw4IEBACiAJZ2VuNl9ndF9jaGVja19maWZvZGJnKGRldl9wcml2KTsKIH0KIAotc3RhdGljIHZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfbXRfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIF9fZ2VuNl9ndF9mb3JjZV93YWtlX210X3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCQkJaW50IGZ3X2VuZ2luZSkKIHsKIAlfX3Jhd19pOTE1X3dyaXRlMzIoZGV2X3ByaXYsIEZPUkNFV0FLRV9NVCwKIAkJCSAgIF9NQVNLRURfQklUX0RJU0FCTEUoRk9SQ0VXQUtFX0tFUk5FTCkpOwpAQCAtMTQ3LDEyICsxNTAsMTkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAorCS8qIE9uIFZMViwgRklGTyB3aWxsIGJlIHNoYXJlZCBieSBib3RoIFNXIGFuZCBIVy4KKwkgKiBTbywgd2UgbmVlZCB0byByZWFkIHRoZSBGUkVFX0VOVFJJRVMgZXZlcnl0aW1lICovCisJaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYtPmRldikpCisJCWRldl9wcml2LT51bmNvcmUuZmlmb19jb3VudCA9CisJCQlfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgR1RGSUZPQ1RMKSAmCisJCQkJCQlHVF9GSUZPX0ZSRUVfRU5UUklFU19NQVNLOworCiAJaWYgKGRldl9wcml2LT51bmNvcmUuZmlmb19jb3VudCA8IEdUX0ZJRk9fTlVNX1JFU0VSVkVEX0VOVFJJRVMpIHsKIAkJaW50IGxvb3AgPSA1MDA7Ci0JCXUzMiBmaWZvID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIEdUX0ZJRk9fRlJFRV9FTlRSSUVTKTsKKwkJdTMyIGZpZm8gPSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgR1RGSUZPQ1RMKSAmIEdUX0ZJRk9fRlJFRV9FTlRSSUVTX01BU0s7CiAJCXdoaWxlIChmaWZvIDw9IEdUX0ZJRk9fTlVNX1JFU0VSVkVEX0VOVFJJRVMgJiYgbG9vcC0tKSB7CiAJCQl1ZGVsYXkoMTApOwotCQkJZmlmbyA9IF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBHVF9GSUZPX0ZSRUVfRU5UUklFUyk7CisJCQlmaWZvID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIEdURklGT0NUTCkgJiBHVF9GSUZPX0ZSRUVfRU5UUklFU19NQVNLOwogCQl9CiAJCWlmIChXQVJOX09OKGxvb3AgPCAwICYmIGZpZm8gPD0gR1RfRklGT19OVU1fUkVTRVJWRURfRU5UUklFUykpCiAJCQkrK3JldDsKQEAgLTE3MSwzOCArMTgxLDExMiBAQAogCV9fcmF3X3Bvc3RpbmdfcmVhZChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FDS19WTFYpOwogfQogCi1zdGF0aWMgdm9pZCB2bHZfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorc3RhdGljIHZvaWQgX192bHZfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQkJaW50IGZ3X2VuZ2luZSkKIHsKLQlpZiAod2FpdF9mb3JfYXRvbWljKChfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgRk9SQ0VXQUtFX0FDS19WTFYpICYgRk9SQ0VXQUtFX0tFUk5FTCkgPT0gMCwKLQkJCSAgICBGT1JDRVdBS0VfQUNLX1RJTUVPVVRfTVMpKQotCQlEUk1fRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBmb3JjZXdha2Ugb2xkIGFjayB0byBjbGVhci5cbiIpOworCS8qIENoZWNrIGZvciBSZW5kZXIgRW5naW5lICovCisJaWYgKEZPUkNFV0FLRV9SRU5ERVIgJiBmd19lbmdpbmUpIHsKKwkJaWYgKHdhaXRfZm9yX2F0b21pYygoX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsCisJCQkJCQlGT1JDRVdBS0VfQUNLX1ZMVikgJgorCQkJCQkJRk9SQ0VXQUtFX0tFUk5FTCkgPT0gMCwKKwkJCQkJRk9SQ0VXQUtFX0FDS19USU1FT1VUX01TKSkKKwkJCURSTV9FUlJPUigiVGltZWQgb3V0OiBSZW5kZXIgZm9yY2V3YWtlIG9sZCBhY2sgdG8gY2xlYXIuXG4iKTsKIAotCV9fcmF3X2k5MTVfd3JpdGUzMihkZXZfcHJpdiwgRk9SQ0VXQUtFX1ZMViwKLQkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShGT1JDRVdBS0VfS0VSTkVMKSk7Ci0JX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0VfTUVESUFfVkxWLAotCQkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEZPUkNFV0FLRV9LRVJORUwpKTsKKwkJX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0VfVkxWLAorCQkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShGT1JDRVdBS0VfS0VSTkVMKSk7CiAKLQlpZiAod2FpdF9mb3JfYXRvbWljKChfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgRk9SQ0VXQUtFX0FDS19WTFYpICYgRk9SQ0VXQUtFX0tFUk5FTCksCi0JCQkgICAgRk9SQ0VXQUtFX0FDS19USU1FT1VUX01TKSkKLQkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgR1QgdG8gYWNrIGZvcmNld2FrZSByZXF1ZXN0LlxuIik7CisJCWlmICh3YWl0X2Zvcl9hdG9taWMoKF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LAorCQkJCQkJRk9SQ0VXQUtFX0FDS19WTFYpICYKKwkJCQkJCUZPUkNFV0FLRV9LRVJORUwpLAorCQkJCQlGT1JDRVdBS0VfQUNLX1RJTUVPVVRfTVMpKQorCQkJRFJNX0VSUk9SKCJUaW1lZCBvdXQ6IHdhaXRpbmcgZm9yIFJlbmRlciB0byBhY2suXG4iKTsKKwl9CiAKLQlpZiAod2FpdF9mb3JfYXRvbWljKChfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgRk9SQ0VXQUtFX0FDS19NRURJQV9WTFYpICYKLQkJCSAgICAgRk9SQ0VXQUtFX0tFUk5FTCksCi0JCQkgICAgRk9SQ0VXQUtFX0FDS19USU1FT1VUX01TKSkKLQkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWVkaWEgdG8gYWNrIGZvcmNld2FrZSByZXF1ZXN0LlxuIik7CisJLyogQ2hlY2sgZm9yIE1lZGlhIEVuZ2luZSAqLworCWlmIChGT1JDRVdBS0VfTUVESUEgJiBmd19lbmdpbmUpIHsKKwkJaWYgKHdhaXRfZm9yX2F0b21pYygoX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsCisJCQkJCQlGT1JDRVdBS0VfQUNLX01FRElBX1ZMVikgJgorCQkJCQkJRk9SQ0VXQUtFX0tFUk5FTCkgPT0gMCwKKwkJCQkJRk9SQ0VXQUtFX0FDS19USU1FT1VUX01TKSkKKwkJCURSTV9FUlJPUigiVGltZWQgb3V0OiBNZWRpYSBmb3JjZXdha2Ugb2xkIGFjayB0byBjbGVhci5cbiIpOworCisJCV9fcmF3X2k5MTVfd3JpdGUzMihkZXZfcHJpdiwgRk9SQ0VXQUtFX01FRElBX1ZMViwKKwkJCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoRk9SQ0VXQUtFX0tFUk5FTCkpOworCisJCWlmICh3YWl0X2Zvcl9hdG9taWMoKF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LAorCQkJCQkJRk9SQ0VXQUtFX0FDS19NRURJQV9WTFYpICYKKwkJCQkJCUZPUkNFV0FLRV9LRVJORUwpLAorCQkJCQlGT1JDRVdBS0VfQUNLX1RJTUVPVVRfTVMpKQorCQkJRFJNX0VSUk9SKCJUaW1lZCBvdXQ6IHdhaXRpbmcgZm9yIG1lZGlhIHRvIGFjay5cbiIpOworCX0KIAogCS8qIFdhUnNGb3JjZXdha2VXYWl0VEMwOnZsdiAqLwogCV9fZ2VuNl9ndF93YWl0X2Zvcl90aHJlYWRfYzAoZGV2X3ByaXYpOworCiB9CiAKLXN0YXRpYyB2b2lkIHZsdl9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCitzdGF0aWMgdm9pZCBfX3Zsdl9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCWludCBmd19lbmdpbmUpCiB7Ci0JX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0VfVkxWLAotCQkJICAgX01BU0tFRF9CSVRfRElTQUJMRShGT1JDRVdBS0VfS0VSTkVMKSk7Ci0JX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0VfTUVESUFfVkxWLAotCQkJICAgX01BU0tFRF9CSVRfRElTQUJMRShGT1JDRVdBS0VfS0VSTkVMKSk7CisKKwkvKiBDaGVjayBmb3IgUmVuZGVyIEVuZ2luZSAqLworCWlmIChGT1JDRVdBS0VfUkVOREVSICYgZndfZW5naW5lKQorCQlfX3Jhd19pOTE1X3dyaXRlMzIoZGV2X3ByaXYsIEZPUkNFV0FLRV9WTFYsCisJCQkJCV9NQVNLRURfQklUX0RJU0FCTEUoRk9SQ0VXQUtFX0tFUk5FTCkpOworCisKKwkvKiBDaGVjayBmb3IgTWVkaWEgRW5naW5lICovCisJaWYgKEZPUkNFV0FLRV9NRURJQSAmIGZ3X2VuZ2luZSkKKwkJX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGT1JDRVdBS0VfTUVESUFfVkxWLAorCQkJCV9NQVNLRURfQklUX0RJU0FCTEUoRk9SQ0VXQUtFX0tFUk5FTCkpOworCiAJLyogVGhlIGJlbG93IGRvdWJsZXMgYXMgYSBQT1NUSU5HX1JFQUQgKi8KIAlnZW42X2d0X2NoZWNrX2ZpZm9kYmcoZGV2X3ByaXYpOworCit9CisKK3ZvaWQgdmx2X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJCWludCBmd19lbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsKKwlpZiAoRk9SQ0VXQUtFX1JFTkRFUiAmIGZ3X2VuZ2luZSkgeworCQlpZiAoZGV2X3ByaXYtPnVuY29yZS5md19yZW5kZXJjb3VudCsrID09IDApCisJCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KGRldl9wcml2LAorCQkJCQkJCUZPUkNFV0FLRV9SRU5ERVIpOworCX0KKwlpZiAoRk9SQ0VXQUtFX01FRElBICYgZndfZW5naW5lKSB7CisJCWlmIChkZXZfcHJpdi0+dW5jb3JlLmZ3X21lZGlhY291bnQrKyA9PSAwKQorCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX2dldChkZXZfcHJpdiwKKwkJCQkJCQlGT1JDRVdBS0VfTUVESUEpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOworfQorCit2b2lkIHZsdl9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCQlpbnQgZndfZW5naW5lKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncyk7CisKKwlpZiAoRk9SQ0VXQUtFX1JFTkRFUiAmIGZ3X2VuZ2luZSkgeworCQlXQVJOX09OKGRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQgPT0gMCk7CisJCWlmICgtLWRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQgPT0gMCkKKwkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYsCisJCQkJCQkJRk9SQ0VXQUtFX1JFTkRFUik7CisJfQorCisJaWYgKEZPUkNFV0FLRV9NRURJQSAmIGZ3X2VuZ2luZSkgeworCQlXQVJOX09OKGRldl9wcml2LT51bmNvcmUuZndfbWVkaWFjb3VudCA9PSAwKTsKKwkJaWYgKC0tZGV2X3ByaXYtPnVuY29yZS5md19tZWRpYWNvdW50ID09IDApCisJCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2LAorCQkJCQkJCUZPUkNFV0FLRV9NRURJQSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbjZfZm9yY2Vfd2FrZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTIxMyw3ICsyOTcsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOwogCWlmICgtLWRldl9wcml2LT51bmNvcmUuZm9yY2V3YWtlX2NvdW50ID09IDApCi0JCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsKIH0KIApAQCAtMjQ4LDYgKzMzMiwxMSBAQAogCQlEUk1fSU5GTygiRm91bmQgJXp1TUIgb2YgZUxMQ1xuIiwgZGV2X3ByaXYtPmVsbGNfc2l6ZSk7CiAJfQogCisJLyogY2xlYXIgb3V0IG9sZCBHVCBGSUZPIGVycm9ycyAqLworCWlmIChJU19HRU42KGRldikgfHwgSVNfR0VONyhkZXYpKQorCQlfX3Jhd19pOTE1X3dyaXRlMzIoZGV2X3ByaXYsIEdURklGT0RCRywKKwkJCQkgICBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgR1RGSUZPREJHKSk7CisKIAlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX3Jlc2V0KGRldik7CiB9CiAKQEAgLTI1Niw4ICszNDUsNiBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHJlZ192YWw7CiAKLQlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX3Jlc2V0KGRldik7Ci0KIAkvKiBCSU9TIG9mdGVuIGxlYXZlcyBSQzYgZW5hYmxlZCwgYnV0IGRpc2FibGUgaXQgZm9yIGh3IGluaXQgKi8KIAlpbnRlbF9kaXNhYmxlX2d0X3Bvd2Vyc2F2ZShkZXYpOwogCkBAIC0yODEsMjkgKzM2OCw0MCBAQAogICogYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0bwogICogZ2VuNl9ndF9mb3JjZV93YWtlX3B1dCgpIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLgogICovCi12b2lkIGdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQordm9pZCBnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGZ3X2VuZ2luZSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCiAJaWYgKCFkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KQogCQlyZXR1cm47CiAKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CisKKwkvKiBSZWRpcmVjdCB0byBWTFYgc3BlY2lmaWMgcm91dGluZSAqLworCWlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2LT5kZXYpKQorCQlyZXR1cm4gdmx2X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBmd19lbmdpbmUpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOwogCWlmIChkZXZfcHJpdi0+dW5jb3JlLmZvcmNld2FrZV9jb3VudCsrID09IDApCi0JCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOworCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsKIH0KIAogLyoKICAqIHNlZSBnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KCkKICAqLwotdm9pZCBnZW42X2d0X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3ZvaWQgZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBmd19lbmdpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAogCWlmICghZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX3B1dCkKIAkJcmV0dXJuOwogCisJLyogUmVkaXJlY3QgdG8gVkxWIHNwZWNpZmljIHJvdXRpbmUgKi8KKwlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdi0+ZGV2KSkKKwkJcmV0dXJuIHZsdl9mb3JjZV93YWtlX3B1dChkZXZfcHJpdiwgZndfZW5naW5lKTsKKworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOwogCWlmICgtLWRldl9wcml2LT51bmNvcmUuZm9yY2V3YWtlX2NvdW50ID09IDApIHsKIAkJZGV2X3ByaXYtPnVuY29yZS5mb3JjZXdha2VfY291bnQrKzsKQEAgLTMxMiw2ICs0MTAsOCBAQAogCQkJCSAxKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncyk7CisKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiB9CiAKIC8qIFdlIGdpdmUgZmFzdCBwYXRocyBmb3IgdGhlIHJlYWxseSBjb29sIHJlZ2lzdGVycyAqLwpAQCAtMzQ2LDYgKzQ0NiwxMyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK2Fzc2VydF9kZXZpY2Vfbm90X3N1c3BlbmRlZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJV0FSTihIQVNfUlVOVElNRV9QTShkZXZfcHJpdi0+ZGV2KSAmJiBkZXZfcHJpdi0+cG0uc3VzcGVuZGVkLAorCSAgICAgIkRldmljZSBzdXNwZW5kZWRcbiIpOworfQorCiAjZGVmaW5lIFJFR19SRUFEX0hFQURFUih4KSBcCiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsgXAogCXUjI3ggdmFsID0gMDsgXApAQCAtMzc5LDE2ICs0ODYsNTEgQEAKIAlSRUdfUkVBRF9IRUFERVIoeCk7IFwKIAlpZiAoTkVFRFNfRk9SQ0VfV0FLRSgoZGV2X3ByaXYpLCAocmVnKSkpIHsgXAogCQlpZiAoZGV2X3ByaXYtPnVuY29yZS5mb3JjZXdha2VfY291bnQgPT0gMCkgXAotCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX2dldChkZXZfcHJpdik7IFwKKwkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYsIFwKKwkJCQkJCQlGT1JDRVdBS0VfQUxMKTsgXAogCQl2YWwgPSBfX3Jhd19pOTE1X3JlYWQjI3goZGV2X3ByaXYsIHJlZyk7IFwKIAkJaWYgKGRldl9wcml2LT51bmNvcmUuZm9yY2V3YWtlX2NvdW50ID09IDApIFwKLQkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOyBcCisJCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBcCisJCQkJCQkJRk9SQ0VXQUtFX0FMTCk7IFwKIAl9IGVsc2UgeyBcCiAJCXZhbCA9IF9fcmF3X2k5MTVfcmVhZCMjeChkZXZfcHJpdiwgcmVnKTsgXAogCX0gXAogCVJFR19SRUFEX0ZPT1RFUjsgXAogfQogCisjZGVmaW5lIF9fdmx2X3JlYWQoeCkgXAorc3RhdGljIHUjI3ggXAordmx2X3JlYWQjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBvZmZfdCByZWcsIGJvb2wgdHJhY2UpIHsgXAorCXVuc2lnbmVkIGZ3ZW5naW5lID0gMDsgXAorCXVuc2lnbmVkICpmd2NvdW50OyBcCisJUkVHX1JFQURfSEVBREVSKHgpOyBcCisJaWYgKEZPUkNFV0FLRV9WTFZfUkVOREVSX1JBTkdFX09GRlNFVChyZWcpKSB7ICAgXAorCQlmd2VuZ2luZSA9IEZPUkNFV0FLRV9SRU5ERVI7ICAgICAgICAgICAgXAorCQlmd2NvdW50ID0gJmRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQ7ICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWxzZSBpZiAoRk9SQ0VXQUtFX1ZMVl9NRURJQV9SQU5HRV9PRkZTRVQocmVnKSkgeyAgICAgICBcCisJCWZ3ZW5naW5lID0gRk9SQ0VXQUtFX01FRElBOyAgICAgICAgICAgICBcCisJCWZ3Y291bnQgPSAmZGV2X3ByaXYtPnVuY29yZS5md19tZWRpYWNvdW50OyAgICAgXAorCX0gIFwKKwlpZiAoZndlbmdpbmUgIT0gMCkgewkJXAorCQlpZiAoKCpmd2NvdW50KSsrID09IDApIFwKKwkJCShkZXZfcHJpdiktPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX2dldChkZXZfcHJpdiwgXAorCQkJCQkJCQlmd2VuZ2luZSk7IFwKKwkJdmFsID0gX19yYXdfaTkxNV9yZWFkIyN4KGRldl9wcml2LCByZWcpOyBcCisJCWlmICgtLSgqZndjb3VudCkgPT0gMCkgXAorCQkJKGRldl9wcml2KS0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBcCisJCQkJCQkJZndlbmdpbmUpOyBcCisJfSBlbHNlIHsgXAorCQl2YWwgPSBfX3Jhd19pOTE1X3JlYWQjI3goZGV2X3ByaXYsIHJlZyk7IFwKKwl9IFwKKwlSRUdfUkVBRF9GT09URVI7IFwKK30KKworCitfX3Zsdl9yZWFkKDgpCitfX3Zsdl9yZWFkKDE2KQorX192bHZfcmVhZCgzMikKK19fdmx2X3JlYWQoNjQpCiBfX2dlbjZfcmVhZCg4KQogX19nZW42X3JlYWQoMTYpCiBfX2dlbjZfcmVhZCgzMikKQEAgLTQwMiw2ICs1NDQsNyBAQAogX19nZW40X3JlYWQoMzIpCiBfX2dlbjRfcmVhZCg2NCkKIAorI3VuZGVmIF9fdmx2X3JlYWQKICN1bmRlZiBfX2dlbjZfcmVhZAogI3VuZGVmIF9fZ2VuNV9yZWFkCiAjdW5kZWYgX19nZW40X3JlYWQKQEAgLTQxMywxMiArNTU2LDE1IEBACiAJdHJhY2VfaTkxNV9yZWdfcncodHJ1ZSwgcmVnLCB2YWwsIHNpemVvZih2YWwpLCB0cmFjZSk7IFwKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncykKIAorI2RlZmluZSBSRUdfV1JJVEVfRk9PVEVSIFwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKQorCiAjZGVmaW5lIF9fZ2VuNF93cml0ZSh4KSBcCiBzdGF0aWMgdm9pZCBcCiBnZW40X3dyaXRlIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgb2ZmX3QgcmVnLCB1IyN4IHZhbCwgYm9vbCB0cmFjZSkgeyBcCiAJUkVHX1dSSVRFX0hFQURFUjsgXAogCV9fcmF3X2k5MTVfd3JpdGUjI3goZGV2X3ByaXYsIHJlZywgdmFsKTsgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOyBcCisJUkVHX1dSSVRFX0ZPT1RFUjsgXAogfQogCiAjZGVmaW5lIF9fZ2VuNV93cml0ZSh4KSBcCkBAIC00MjcsNyArNTczLDcgQEAKIAlSRUdfV1JJVEVfSEVBREVSOyBcCiAJaWxrX2R1bW15X3dyaXRlKGRldl9wcml2KTsgXAogCV9fcmF3X2k5MTVfd3JpdGUjI3goZGV2X3ByaXYsIHJlZywgdmFsKTsgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOyBcCisJUkVHX1dSSVRFX0ZPT1RFUjsgXAogfQogCiAjZGVmaW5lIF9fZ2VuNl93cml0ZSh4KSBcCkBAIC00MzgsMTEgKzU4NCwxMiBAQAogCWlmIChORUVEU19GT1JDRV9XQUtFKChkZXZfcHJpdiksIChyZWcpKSkgeyBcCiAJCV9fZmlmb19yZXQgPSBfX2dlbjZfZ3Rfd2FpdF9mb3JfZmlmbyhkZXZfcHJpdik7IFwKIAl9IFwKKwlhc3NlcnRfZGV2aWNlX25vdF9zdXNwZW5kZWQoZGV2X3ByaXYpOyBcCiAJX19yYXdfaTkxNV93cml0ZSMjeChkZXZfcHJpdiwgcmVnLCB2YWwpOyBcCiAJaWYgKHVubGlrZWx5KF9fZmlmb19yZXQpKSB7IFwKIAkJZ2VuNl9ndF9jaGVja19maWZvZGJnKGRldl9wcml2KTsgXAogCX0gXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOyBcCisJUkVHX1dSSVRFX0ZPT1RFUjsgXAogfQogCiAjZGVmaW5lIF9faHN3X3dyaXRlKHgpIFwKQEAgLTQ1MywxMyArNjAwLDE0IEBACiAJaWYgKE5FRURTX0ZPUkNFX1dBS0UoKGRldl9wcml2KSwgKHJlZykpKSB7IFwKIAkJX19maWZvX3JldCA9IF9fZ2VuNl9ndF93YWl0X2Zvcl9maWZvKGRldl9wcml2KTsgXAogCX0gXAorCWFzc2VydF9kZXZpY2Vfbm90X3N1c3BlbmRlZChkZXZfcHJpdik7IFwKIAloc3dfdW5jbGFpbWVkX3JlZ19jbGVhcihkZXZfcHJpdiwgcmVnKTsgXAogCV9fcmF3X2k5MTVfd3JpdGUjI3goZGV2X3ByaXYsIHJlZywgdmFsKTsgXAogCWlmICh1bmxpa2VseShfX2ZpZm9fcmV0KSkgeyBcCiAJCWdlbjZfZ3RfY2hlY2tfZmlmb2RiZyhkZXZfcHJpdik7IFwKIAl9IFwKIAloc3dfdW5jbGFpbWVkX3JlZ19jaGVjayhkZXZfcHJpdiwgcmVnKTsgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOyBcCisJUkVHX1dSSVRFX0ZPT1RFUjsgXAogfQogCiBzdGF0aWMgY29uc3QgdTMyIGdlbjhfc2hhZG93ZWRfcmVnc1tdID0gewpAQCAtNDg2LDE2ICs2MzQsMTggQEAKICNkZWZpbmUgX19nZW44X3dyaXRlKHgpIFwKIHN0YXRpYyB2b2lkIFwKIGdlbjhfd3JpdGUjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBvZmZfdCByZWcsIHUjI3ggdmFsLCBib29sIHRyYWNlKSB7IFwKLQlib29sIF9fbmVlZHNfcHV0ID0gIWlzX2dlbjhfc2hhZG93ZWQoZGV2X3ByaXYsIHJlZyk7IFwKKwlib29sIF9fbmVlZHNfcHV0ID0gcmVnIDwgMHg0MDAwMCAmJiAhaXNfZ2VuOF9zaGFkb3dlZChkZXZfcHJpdiwgcmVnKTsgXAogCVJFR19XUklURV9IRUFERVI7IFwKIAlpZiAoX19uZWVkc19wdXQpIHsgXAotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsgXAorCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBcCisJCQkJCQkJRk9SQ0VXQUtFX0FMTCk7IFwKIAl9IFwKIAlfX3Jhd19pOTE1X3dyaXRlIyN4KGRldl9wcml2LCByZWcsIHZhbCk7IFwKIAlpZiAoX19uZWVkc19wdXQpIHsgXAotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsgXAorCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBcCisJCQkJCQkJRk9SQ0VXQUtFX0FMTCk7IFwKIAl9IFwKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsgXAorCVJFR19XUklURV9GT09URVI7IFwKIH0KIAogX19nZW44X3dyaXRlKDgpCkBAIC01MjQsNiArNjc0LDcgQEAKICN1bmRlZiBfX2dlbjZfd3JpdGUKICN1bmRlZiBfX2dlbjVfd3JpdGUKICN1bmRlZiBfX2dlbjRfd3JpdGUKKyN1bmRlZiBSRUdfV1JJVEVfRk9PVEVSCiAjdW5kZWYgUkVHX1dSSVRFX0hFQURFUgogCiB2b2lkIGludGVsX3VuY29yZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC01MzQsOCArNjg1LDggQEAKIAkJCSAgZ2VuNl9mb3JjZV93YWtlX3dvcmspOwogCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgewotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0ID0gdmx2X2ZvcmNlX3dha2VfZ2V0OwotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0ID0gdmx2X2ZvcmNlX3dha2VfcHV0OworCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0ID0gX192bHZfZm9yY2Vfd2FrZV9nZXQ7CisJCWRldl9wcml2LT51bmNvcmUuZnVuY3MuZm9yY2Vfd2FrZV9wdXQgPSBfX3Zsdl9mb3JjZV93YWtlX3B1dDsKIAl9IGVsc2UgaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19HRU44KGRldikpIHsKIAkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX2dldCA9IF9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldDsKIAkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX3B1dCA9IF9fZ2VuNl9ndF9mb3JjZV93YWtlX210X3B1dDsKQEAgLTU1Miw5ICs3MDMsOSBAQAogCQkgKiBmb3JjZXdha2UgYmVpbmcgZGlzYWJsZWQuCiAJCSAqLwogCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCV9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldChkZXZfcHJpdik7CisJCV9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAJCWVjb2J1cyA9IF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBFQ09CVVMpOwotCQlfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9tdF9wdXQoZGV2X3ByaXYpOworCQlfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9tdF9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCQlpZiAoZWNvYnVzICYgRk9SQ0VXQUtFX01UX0VOQUJMRSkgewpAQCAtNjAxLDEwICs3NTIsMTggQEAKIAkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MubW1pb193cml0ZWwgID0gZ2VuNl93cml0ZTMyOwogCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3dyaXRlcSAgPSBnZW42X3dyaXRlNjQ7CiAJCX0KLQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRiICA9IGdlbjZfcmVhZDg7Ci0JCWRldl9wcml2LT51bmNvcmUuZnVuY3MubW1pb19yZWFkdyAgPSBnZW42X3JlYWQxNjsKLQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRsICA9IGdlbjZfcmVhZDMyOwotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLm1taW9fcmVhZHEgID0gZ2VuNl9yZWFkNjQ7CisKKwkJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgeworCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRiICA9IHZsdl9yZWFkODsKKwkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MubW1pb19yZWFkdyAgPSB2bHZfcmVhZDE2OworCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRsICA9IHZsdl9yZWFkMzI7CisJCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLm1taW9fcmVhZHEgID0gdmx2X3JlYWQ2NDsKKwkJfSBlbHNlIHsKKwkJCWRldl9wcml2LT51bmNvcmUuZnVuY3MubW1pb19yZWFkYiAgPSBnZW42X3JlYWQ4OworCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWR3ICA9IGdlbjZfcmVhZDE2OworCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRsICA9IGdlbjZfcmVhZDMyOworCQkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3JlYWRxICA9IGdlbjZfcmVhZDY0OworCQl9CiAJCWJyZWFrOwogCWNhc2UgNToKIAkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5tbWlvX3dyaXRlYiAgPSBnZW41X3dyaXRlODsKQEAgLTY0Niw3ICs4MDUsNyBAQAogCXVpbnQzMl90IHNpemU7CiAJdWludDMyX3QgZ2VuX2JpdG1hc2s7IC8qIHN1cHBvcnQgZ2VucywgMHgxMCBmb3IgNCwgMHgzMCBmb3IgNCBhbmQgNSwgZXRjLiAqLwogfSB3aGl0ZWxpc3RbXSA9IHsKLQl7IFJJTkdfVElNRVNUQU1QKFJFTkRFUl9SSU5HX0JBU0UpLCA4LCAweEYwIH0sCisJeyBSSU5HX1RJTUVTVEFNUChSRU5ERVJfUklOR19CQVNFKSwgOCwgMHgxRjAgfSwKIH07CiAKIGludCBpOTE1X3JlZ19yZWFkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCkBAIC02ODcsNiArODQ2LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBpOTE1X2dldF9yZXNldF9zdGF0c19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cyAqYXJncyA9IGRhdGE7CisJc3RydWN0IGk5MTVfY3R4X2hhbmdfc3RhdHMgKmhzOworCWludCByZXQ7CisKKwlpZiAoYXJncy0+ZmxhZ3MgfHwgYXJncy0+cGFkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhcmdzLT5jdHhfaWQgPT0gREVGQVVMVF9DT05URVhUX0lEICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWhzID0gaTkxNV9nZW1fY29udGV4dF9nZXRfaGFuZ19zdGF0cyhkZXYsIGZpbGUsIGFyZ3MtPmN0eF9pZCk7CisJaWYgKElTX0VSUihocykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiBQVFJfRVJSKGhzKTsKKwl9CisKKwlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJYXJncy0+cmVzZXRfY291bnQgPSBpOTE1X3Jlc2V0X2NvdW50KCZkZXZfcHJpdi0+Z3B1X2Vycm9yKTsKKwllbHNlCisJCWFyZ3MtPnJlc2V0X2NvdW50ID0gMDsKKworCWFyZ3MtPmJhdGNoX2FjdGl2ZSA9IGhzLT5iYXRjaF9hY3RpdmU7CisJYXJncy0+YmF0Y2hfcGVuZGluZyA9IGhzLT5iYXRjaF9wZW5kaW5nOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpOTY1X3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJdTggZ2Ryc3Q7CkBAIC03NzAsMTIgKzk2NiwxMiBAQAogCiAJLyogSWYgcmVzZXQgd2l0aCBhIHVzZXIgZm9yY2V3YWtlLCB0cnkgdG8gcmVzdG9yZSwgb3RoZXJ3aXNlIHR1cm4gaXQgb2ZmICovCiAJaWYgKGRldl9wcml2LT51bmNvcmUuZm9yY2V3YWtlX2NvdW50KQotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKwkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAJZWxzZQotCQlkZXZfcHJpdi0+dW5jb3JlLmZ1bmNzLmZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwkJZGV2X3ByaXYtPnVuY29yZS5mdW5jcy5mb3JjZV93YWtlX3B1dChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CiAKIAkvKiBSZXN0b3JlIGZpZm8gY291bnQgKi8KLQlkZXZfcHJpdi0+dW5jb3JlLmZpZm9fY291bnQgPSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgR1RfRklGT19GUkVFX0VOVFJJRVMpOworCWRldl9wcml2LT51bmNvcmUuZmlmb19jb3VudCA9IF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBHVEZJRk9DVEwpICYgR1RfRklGT19GUkVFX0VOVFJJRVNfTUFTSzsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51bmNvcmUubG9jaywgaXJxZmxhZ3MpOwogCXJldHVybiByZXQ7CkBAIC03OTMsMTUgKzk4OSw2IEBACiAJfQogfQogCi12b2lkIGludGVsX3VuY29yZV9jbGVhcl9lcnJvcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JLyogWFhYIG5lZWRzIHNwaW5sb2NrIGFyb3VuZCBjYWxsZXIncyBncm91cGluZyAqLwotCWlmIChIQVNfRlBHQV9EQkdfVU5DTEFJTUVEKGRldikpCi0JCV9fcmF3X2k5MTVfd3JpdGUzMihkZXZfcHJpdiwgRlBHQV9EQkcsIEZQR0FfREJHX1JNX05PQ0xBSU0pOwotfQotCiB2b2lkIGludGVsX3VuY29yZV9jaGVja19lcnJvcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kbWEuYwppbmRleCAwODdkYjMzLi5jM2JmMDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kbWEuYwpAQCAtMTA3NSwxMCArMTA3NSwxMCBAQAogCiAJCWJ1Zi0+ZmlsZV9wcml2ID0gZmlsZV9wcml2OwogCi0JCWlmIChEUk1fQ09QWV9UT19VU0VSKCZkLT5yZXF1ZXN0X2luZGljZXNbaV0sCisJCWlmIChjb3B5X3RvX3VzZXIoJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwKIAkJCQkgICAgICZidWYtPmlkeCwgc2l6ZW9mKGJ1Zi0+aWR4KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKERSTV9DT1BZX1RPX1VTRVIoJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sCisJCWlmIChjb3B5X3RvX3VzZXIoJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sCiAJCQkJICAgICAmYnVmLT50b3RhbCwgc2l6ZW9mKGJ1Zi0+dG90YWwpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCmluZGV4IGNhNGJjNTQuLmZlNDUzMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCkBAIC0xODYsMTQgKzE4NiwxNCBAQAogZXh0ZXJuIHUzMiBtZ2FfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiBpbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotZXh0ZXJuIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZyk7CiBleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotI2RlZmluZSBtZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpCURSTV9XUklURU1FTU9SWUJBUlJJRVIoKQorI2RlZmluZSBtZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpCXdtYigpCiAKICNkZWZpbmUgTUdBX1JFQUQ4KHJlZykJCURSTV9SRUFEOChkZXZfcHJpdi0+bW1pbywgKHJlZykpCiAjZGVmaW5lIE1HQV9SRUFEKHJlZykJCURSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfaW9jMzIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lvYzMyLmMKaW5kZXggNzA5ZTkwZC4uODZiNGJiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfaW9jMzIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9pb2MzMi5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9tZ2FfZHJtLmg+CisjaW5jbHVkZSAibWdhX2Rydi5oIgogCiB0eXBlZGVmIHN0cnVjdCBkcm0zMl9tZ2FfaW5pdCB7CiAJaW50IGZ1bmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCmluZGV4IDJiMGNlYjguLjFiMDcxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIAotaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCU1HQV9XUklURShNR0FfUFJJTUVORCwgcHJpbV9lbmQpOwogCiAJCWF0b21pY19pbmMoJmRldl9wcml2LT5sYXN0X2ZlbmNlX3JldGlyZWQpOwotCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOworCQl3YWtlX3VwKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOwogCQloYW5kbGVkID0gMTsKIAl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCSAqIGJ5IGFib3V0IGEgZGF5IHJhdGhlciB0aGFuIHNoZSB3YW50cyB0byB3YWl0IGZvciB5ZWFycwogCSAqIHVzaW5nIGZlbmNlcy4KIAkgKi8KLQlEUk1fV0FJVF9PTihyZXQsIGRldl9wcml2LT5mZW5jZV9xdWV1ZSwgMyAqIERSTV9IWiwKKwlEUk1fV0FJVF9PTihyZXQsIGRldl9wcml2LT5mZW5jZV9xdWV1ZSwgMyAqIEhaLAogCQkgICAgKCgoY3VyX2ZlbmNlID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5sYXN0X2ZlbmNlX3JldGlyZWQpKQogCQkgICAgICAtICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCi0JRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSk7CiAKIAkvKiBUdXJuIG9uIHNvZnQgdHJhcCBpbnRlcnJ1cHQuICBWZXJ0aWNhbCBibGFuayBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkCiAJICogaW4gbWdhX2VuYWJsZV92YmxhbmsuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffc3RhdGUuYwppbmRleCAzN2NjMmZiLi4zMTQ2ODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3N0YXRlLmMKQEAgLTEwMjksNyArMTAyOSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChEUk1fQ09QWV9UT19VU0VSKHBhcmFtLT52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKKwlpZiAoY29weV90b191c2VyKHBhcmFtLT52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKIAkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX2N1cnNvci5jIGIvZHJpdmVycy9ncHUvZHJtL21nYWcyMDAvbWdhZzIwMF9jdXJzb3IuYwppbmRleCA4MDE3MzFhLi45Zjk3ODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX2N1cnNvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfY3Vyc29yLmMKQEAgLTIyLDggKzIyLDEwIEBACiB7CiAJV1JFRzgoTUdBX0NVUlBPU1hMLCAwKTsKIAlXUkVHOChNR0FfQ1VSUE9TWEgsIDApOwotCW1nYWcyMDBfYm9fdW5waW4obWRldi0+Y3Vyc29yLnBpeGVsc18xKTsKLQltZ2FnMjAwX2JvX3VucGluKG1kZXYtPmN1cnNvci5waXhlbHNfMik7CisJaWYgKG1kZXYtPmN1cnNvci5waXhlbHNfMS0+cGluX2NvdW50KQorCQltZ2FnMjAwX2JvX3VucGluKG1kZXYtPmN1cnNvci5waXhlbHNfMSk7CisJaWYgKG1kZXYtPmN1cnNvci5waXhlbHNfMi0+cGluX2NvdW50KQorCQltZ2FnMjAwX2JvX3VucGluKG1kZXYtPmN1cnNvci5waXhlbHNfMik7CiB9CiAKIGludCBtZ2FfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTMyLDcgKzM0LDcgQEAKIAkJCXVpbnQzMl90IHdpZHRoLAogCQkJdWludDMyX3QgaGVpZ2h0KQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilmaWxlX3ByaXYtPm1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgbWdhX2RldmljZSAqbWRldiA9IChzdHJ1Y3QgbWdhX2RldmljZSAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG1nYWcyMDBfYm8gKnBpeGVsc18xID0gbWRldi0+Y3Vyc29yLnBpeGVsc18xOwogCXN0cnVjdCBtZ2FnMjAwX2JvICpwaXhlbHNfMiA9IG1kZXYtPmN1cnNvci5waXhlbHNfMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfZmIuYwppbmRleCA5NjRmNThjLi4xM2I3ZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYWcyMDAvbWdhZzIwMF9mYi5jCkBAIC00MSw3ICs0MSw3IEBACiAJICogdGhlbiB0aGUgQk8gaXMgYmVpbmcgbW92ZWQgYW5kIHdlIHNob3VsZAogCSAqIHN0b3JlIHVwIHRoZSBkYW1hZ2UgdW50aWwgbGF0ZXIuCiAJICovCi0JaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwlpZiAoZHJtX2Nhbl9zbGVlcCgpKQogCQlyZXQgPSBtZ2FnMjAwX2JvX3Jlc2VydmUoYm8sIHRydWUpOwogCWlmIChyZXQpIHsKIAkJaWYgKHJldCAhPSAtRUJVU1kpCkBAIC0yODIsNiArMjgyLDExIEBACiB7CiAJc3RydWN0IG1nYV9mYmRldiAqbWZiZGV2OwogCWludCByZXQ7CisJaW50IGJwcF9zZWwgPSAzMjsKKworCS8qIHByZWZlciAxNmJwcCBvbiBsb3cgZW5kIGdwdXMgd2l0aCBsaW1pdGVkIFZSQU0gKi8KKwlpZiAoSVNfRzIwMF9TRShtZGV2KSAmJiBtZGV2LT5tYy52cmFtX3NpemUgPCAoMjA0OCoxMDI0KSkKKwkJYnBwX3NlbCA9IDE2OwogCiAJbWZiZGV2ID0gZGV2bV9remFsbG9jKG1kZXYtPmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG1nYV9mYmRldiksIEdGUF9LRVJORUwpOwogCWlmICghbWZiZGV2KQpAQCAtMzAxLDcgKzMwNiw3IEBACiAJLyogZGlzYWJsZSBhbGwgdGhlIHBvc3NpYmxlIG91dHB1dHMvY3J0Y3MgYmVmb3JlIGVudGVyaW5nIEtNUyBtb2RlICovCiAJZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMobWRldi0+ZGV2KTsKIAotCWRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoJm1mYmRldi0+aGVscGVyLCAzMik7CisJZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZygmbWZiZGV2LT5oZWxwZXIsIGJwcF9zZWwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX21haW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbWFpbi5jCmluZGV4IGIxMTIwY2IuLjI2ODY4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbWFpbi5jCkBAIC0yMTcsNyArMjE3LDEwIEBACiAKIAlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOwogCWRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAodm9pZCAqKSZtZ2FfbW9kZV9mdW5jczsKLQlkZXYtPm1vZGVfY29uZmlnLnByZWZlcnJlZF9kZXB0aCA9IDI0OworCWlmIChJU19HMjAwX1NFKG1kZXYpICYmIG1kZXYtPm1jLnZyYW1fc2l6ZSA8ICgyMDQ4KjEwMjQpKQorCQlkZXYtPm1vZGVfY29uZmlnLnByZWZlcnJlZF9kZXB0aCA9IDE2OworCWVsc2UKKwkJZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJyZWRfZGVwdGggPSAyNDsKIAlkZXYtPm1vZGVfY29uZmlnLnByZWZlcl9zaGFkb3cgPSAxOwogCiAJciA9IG1nYWcyMDBfbW9kZXNldF9pbml0KG1kZXYpOwpAQCAtMzEwLDcgKzMxMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWdhZzIwMF9ib191bnJlZihzdHJ1Y3QgbWdhZzIwMF9ibyAqKmJvKQorc3RhdGljIHZvaWQgbWdhZzIwMF9ib191bnJlZihzdHJ1Y3QgbWdhZzIwMF9ibyAqKmJvKQogewogCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqdGJvOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbW9kZS5jCmluZGV4IGVlNmVkNjMuLjk2ODM3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbW9kZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfbW9kZS5jCkBAIC02OTEsNyArNjkxLDcgQEAKICAgIENSVENFWFQwIGhhcyB0byBiZSBwcm9ncmFtbWVkIGxhc3QgdG8gdHJpZ2dlciBhbiB1cGRhdGUgYW5kIG1ha2UgdGhlCiAgICBuZXcgYWRkciB2YXJpYWJsZSB0YWtlIGVmZmVjdC4KICAqLwotdm9pZCBtZ2Ffc2V0X3N0YXJ0X2FkZHJlc3Moc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBvZmZzZXQpCitzdGF0aWMgdm9pZCBtZ2Ffc2V0X3N0YXJ0X2FkZHJlc3Moc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IG1nYV9kZXZpY2UgKm1kZXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCXUzMiBhZGRyOwpAQCAtMTM5OCw3ICsxMzk4LDcgQEAKIHsKIH0KIAotdm9pZCBtZ2FfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3N0YXRpYyB2b2lkIG1nYV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBtZ2FfZW5jb2RlciAqbWdhX2VuY29kZXIgPSB0b19tZ2FfZW5jb2RlcihlbmNvZGVyKTsKIAlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOwpAQCAtMTUxOSwxMSArMTUxOSwxMSBAQAogCQkobWdhX3ZnYV9jYWxjdWxhdGVfbW9kZV9iYW5kd2lkdGgobW9kZSwgYnBwKQogCQkJPiAoMzI3MDAgKiAxMDI0KSkpIHsKIAkJcmV0dXJuIE1PREVfQkFORFdJRFRIOwotCX0gZWxzZSBpZiAobW9kZS0+dHlwZSA9PSBHMjAwX0VIICYmCisJfSBlbHNlIGlmIChtZGV2LT50eXBlID09IEcyMDBfRUggJiYKIAkJKG1nYV92Z2FfY2FsY3VsYXRlX21vZGVfYmFuZHdpZHRoKG1vZGUsIGJwcCkKIAkJCT4gKDM3NTAwICogMTAyNCkpKSB7CiAJCXJldHVybiBNT0RFX0JBTkRXSURUSDsKLQl9IGVsc2UgaWYgKG1vZGUtPnR5cGUgPT0gRzIwMF9FUiAmJgorCX0gZWxzZSBpZiAobWRldi0+dHlwZSA9PSBHMjAwX0VSICYmCiAJCShtZ2FfdmdhX2NhbGN1bGF0ZV9tb2RlX2JhbmR3aWR0aChtb2RlLAogCQkJYnBwKSA+ICg1NTAwMCAqIDEwMjQpKSkgewogCQlyZXR1cm4gTU9ERV9CQU5EV0lEVEg7CkBAIC0xNTU4LDcgKzE1NTgsNyBAQAogCXJldHVybiBNT0RFX09LOwogfQogCi1zdHJ1Y3QgZHJtX2VuY29kZXIgKm1nYV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICptZ2FfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvcgogCQkJCQkJICAqY29ubmVjdG9yKQogewogCWludCBlbmNfaWQgPSBjb25uZWN0b3ItPmVuY29kZXJfaWRzWzBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYWcyMDAvbWdhZzIwMF90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2FnMjAwL21nYWcyMDBfdHRtLmMKaW5kZXggMDdiMTkyZi4uYWRiNTE2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYWcyMDAvbWdhZzIwMF90dG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX3R0bS5jCkBAIC04MCw3ICs4MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtZ2FnMjAwX3R0bV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgbWdhX2RldmljZSAqYXN0KQogewogCWlmIChhc3QtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID09IE5VTEwpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlrZnJlZShibyk7CiB9CiAKLWJvb2wgbWdhZzIwMF90dG1fYm9faXNfbWdhZzIwMF9ibyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQorc3RhdGljIGJvb2wgbWdhZzIwMF90dG1fYm9faXNfbWdhZzIwMF9ibyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewogCWlmIChiby0+ZGVzdHJveSA9PSAmbWdhZzIwMF9ib190dG1fZGVzdHJveSkKIAkJcmV0dXJuIHRydWU7CkBAIC0yMDgsNyArMjA4LDcgQEAKIH07CiAKIAotc3RydWN0IHR0bV90dCAqbWdhZzIwMF90dG1fdHRfY3JlYXRlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorc3RhdGljIHN0cnVjdCB0dG1fdHQgKm1nYWcyMDBfdHRtX3R0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKIAkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1aW50MzJfdCBwYWdlX2ZsYWdzLAogCQkJCSBzdHJ1Y3QgcGFnZSAqZHVtbXlfcmVhZF9wYWdlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnCmluZGV4IGYzOWFiNzUuLmM2OWQxZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25maWcKQEAgLTIsOCArMiw4IEBACiBjb25maWcgRFJNX01TTQogCXRyaXN0YXRlICJNU00gRFJNIgogCWRlcGVuZHMgb24gRFJNCi0JZGVwZW5kcyBvbiBBUkNIX01TTQotCWRlcGVuZHMgb24gQVJDSF9NU004OTYwCisJZGVwZW5kcyBvbiBNU01fSU9NTVUKKwlkZXBlbmRzIG9uIChBUkNIX01TTSAmJiBBUkNIX01TTTg5NjApIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQogCXNlbGVjdCBEUk1fS01TX0hFTFBFUgogCXNlbGVjdCBTSE1FTQogCXNlbGVjdCBUTVBGUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKaW5kZXggZTVmYTEyYi4uNGY5NzdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlCkBAIC0xMiwxOCArMTIsMjcgQEAKIAloZG1pL2hkbWlfaTJjLm8gXAogCWhkbWkvaGRtaV9waHlfODk2MC5vIFwKIAloZG1pL2hkbWlfcGh5Xzh4NjAubyBcCi0JbWRwNC9tZHA0X2NydGMubyBcCi0JbWRwNC9tZHA0X2R0dl9lbmNvZGVyLm8gXAotCW1kcDQvbWRwNF9mb3JtYXQubyBcCi0JbWRwNC9tZHA0X2lycS5vIFwKLQltZHA0L21kcDRfa21zLm8gXAotCW1kcDQvbWRwNF9wbGFuZS5vIFwKKwloZG1pL2hkbWlfcGh5Xzh4NzQubyBcCisJbWRwL21kcF9mb3JtYXQubyBcCisJbWRwL21kcF9rbXMubyBcCisJbWRwL21kcDQvbWRwNF9jcnRjLm8gXAorCW1kcC9tZHA0L21kcDRfZHR2X2VuY29kZXIubyBcCisJbWRwL21kcDQvbWRwNF9pcnEubyBcCisJbWRwL21kcDQvbWRwNF9rbXMubyBcCisJbWRwL21kcDQvbWRwNF9wbGFuZS5vIFwKKwltZHAvbWRwNS9tZHA1X2NydGMubyBcCisJbWRwL21kcDUvbWRwNV9lbmNvZGVyLm8gXAorCW1kcC9tZHA1L21kcDVfaXJxLm8gXAorCW1kcC9tZHA1L21kcDVfa21zLm8gXAorCW1kcC9tZHA1L21kcDVfcGxhbmUubyBcCisJbWRwL21kcDUvbWRwNV9zbXAubyBcCiAJbXNtX2Rydi5vIFwKIAltc21fZmIubyBcCiAJbXNtX2dlbS5vIFwKIAltc21fZ2VtX3ByaW1lLm8gXAogCW1zbV9nZW1fc3VibWl0Lm8gXAogCW1zbV9ncHUubyBcCisJbXNtX2lvbW11Lm8gXAogCW1zbV9yaW5nYnVmZmVyLm8KIAogbXNtLSQoQ09ORklHX0RSTV9NU01fRkJERVYpICs9IG1zbV9mYmRldi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL05PVEVTIGIvZHJpdmVycy9ncHUvZHJtL21zbS9OT1RFUwppbmRleCBlMDM2ZjZjMS4uOWM0MjU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9OT1RFUworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL05PVEVTCkBAIC00LDcgKzQsNyBAQAogZGlzcGxheSBjb250cm9sbGVyIGJsb2NrcyBhdCBwbGF5OgogICsgTURQMyAtID8/IHNlZW1zIHRvIGJlIHdoYXQgaXMgb24gZ2Vla3NwaG9uZSBwZWFrIGRldmljZQogICsgTURQNCAtIFMzIChBUFE4MDYwLCB0b3VjaHBhZCksIFM0LXBybyAoQVBRODA2NCwgbmV4dXM0ICYgaWZjNjQxMCkKLSArIE1EU1MgLSBzbmFwZHJhZ29uIDgwMAorICsgTURQNSAtIHNuYXBkcmFnb24gODAwCiAKIChJIGRvbid0IGhhdmUgYSBjb21wbGV0ZWx5IGNsZWFyIHBpY3R1cmUgb24gd2hpY2ggZGlzcGxheSBjb250cm9sbGVyCiBtYXBzIHRvIHdoaWNoIHBhcnQgIykKQEAgLTQ2LDYgKzQ2LDI0IEBACiBtYXkgaGF2ZSB0aGVpciBvd24gaXJxcyB3aGljaCB0aGV5IGluc3RhbGwgdGhlbXNlbHZlcy4gIEZvciB0aGlzIHJlYXNvbgogdGhlIGRpc3BsYXkgY29udHJvbGxlciBpcyB0aGUgIm1hc3RlciIgZGV2aWNlLgogCitGb3IgTURQNSwgdGhlIG1hcHBpbmcgaXM6CisKKyAgcGxhbmUgICAtPiBQSVBFe1JHQm4sVklHbn0gICAgICAgICAgICAgXAorICBjcnRjICAgIC0+IExNIChsYXllciBtaXhlcikgICAgICAgICAgICB8LT4gTURQICJkZXZpY2UiCisgIGVuY29kZXIgLT4gSU5URiAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgY29ubmVjdG9yIC0+IEhETUkvRFNJL2VEUC9ldGMgICAgICAgICAgLS0+IG90aGVyIGRldmljZShzKQorCitVbmxpa2UgTURQNCwgaXQgYXBwZWFycyB3ZSBjYW4gZ2V0IGJ5IHdpdGggYSBzaW5nbGUgZW5jb2RlciwgcmF0aGVyCit0aGFuIG5lZWRpbmcgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZm9yIERUViwgRFNJLCBldGMuICAoSWUuIHRoZQorcmVnaXN0ZXIgaW50ZXJmYWNlIGlzIHNhbWUsIGp1c3QgZGlmZmVyZW50IGJhc2VzLikKKworQWxzbyB1bmxpa2UgTURQNCwgd2l0aCBNRFA1IGFsbCB0aGUgSVJRcyBmb3Igb3RoZXIgYmxvY2tzIChIRE1JLCBEU0ksCitldGMpIGFyZSByb3V0ZWQgdGhyb3VnaCBNRFAuCisKK0FuZCBmaW5hbGx5LCBNRFA1IGhhcyB0aGlzICJTaGFyZWQgTWVtb3J5IFBvb2wiIChjYWxsZWQgIlNNUCIpLCBmcm9tCit3aGljaCBibG9ja3MgbmVlZCB0byBiZSBhbGxvY2F0ZWQgdG8gdGhlIGFjdGl2ZSBwaXBlcyBiYXNlZCBvbiBmZXRjaAorc3RyaWRlLgorCiBFYWNoIGNvbm5lY3RvciBwcm9iYWJseSBlbmRzIHVwIGJlaW5nIGEgc2VwYXJhdGUgZGV2aWNlLCBqdXN0IGZvciB0aGUKIGxvZ2lzdGljcyBvZiBmaW5kaW5nL21hcHBpbmcgaW8gcmVnaW9uLCBpcnEsIGV0Yy4gIElkZWFseSB3ZSB3b3VsZAogaGF2ZSBhIGJldHRlciB3YXkgdGhhbiBqdXN0IHN0YXNoaW5nIHRoZSBwbGF0Zm9ybSBkZXZpY2UgaW4gYSBnbG9iYWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EyeHgueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hMnh4LnhtbC5oCmluZGV4IDk1ODgwOTguLjg1ZDYxNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EyeHgueG1sLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTJ4eC54bWwuaApAQCAtOCwxMiArOCwxMyBAQAogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAogCiBUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6Ci0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby54bWwgICAgICAgICAgICAgICggICAgMzI3IGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2EyeHgvYTJ4eC54bWwgICAgICAgICAgICggIDMxMDAzIGJ5dGVzLCBmcm9tIDIwMTMtMDktMTkgMTg6NTA6MTYpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVub19jb21tb24ueG1sICAgICAgICggICA4OTgzIGJ5dGVzLCBmcm9tIDIwMTMtMDctMjQgMDE6Mzg6MzYpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVub19wbTQueG1sICAgICAgICAgICggICA5NzU5IGJ5dGVzLCBmcm9tIDIwMTMtMDktMTAgMDA6NTI6MzMpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2EzeHgvYTN4eC54bWwgICAgICAgICAgICggIDUxOTgzIGJ5dGVzLCBmcm9tIDIwMTMtMDktMTAgMDA6NTI6MzIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby54bWwgICAgICAgICAgICAgICAoICAgIDM2NCBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ3OjE1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9mcmVlZHJlbm9fY29weXJpZ2h0LnhtbCAgKCAgIDE0NTMgYnl0ZXMsIGZyb20gMjAxMy0wMy0zMSAxNjo1MToyNykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2EyeHgueG1sICAgICAgICAgICggIDMyODE0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDc6MzMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hZHJlbm9fY29tbW9uLnhtbCAoICAgODkwMCBieXRlcywgZnJvbSAyMDEzLTEwLTIyIDIzOjU3OjQ5KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYWRyZW5vX3BtNC54bWwgICAgKCAgMTA1NzQgYnl0ZXMsIGZyb20gMjAxMy0xMS0xMyAwNTo0NDo0NSkKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2EzeHgueG1sICAgICAgICAgICggIDUzNjQ0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDc6MzMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hNHh4LnhtbCAgICAgICAgICAoICAgODM0NCBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ5OjQ3KQogCiBDb3B5cmlnaHQgKEMpIDIwMTMgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgogLSBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+IChyb2JjbGFyaykKQEAgLTIwMiw2ICsyMDMsMTIgQEAKIAlTQU1QTEVfMDEyMyA9IDYsCiB9OwogCitlbnVtIGFkcmVub19tbXVfY2xudF9iZWggeworCUJFSF9ORVZSID0gMCwKKwlCRUhfVFJBTl9STkcgPSAxLAorCUJFSF9UUkFOX0ZMVCA9IDIsCit9OworCiBlbnVtIHNxX3RleF9jbGFtcCB7CiAJU1FfVEVYX1dSQVAgPSAwLAogCVNRX1RFWF9NSVJST1IgPSAxLApAQCAtMjM4LDYgKzI0NSw5MiBAQAogCiAjZGVmaW5lIFJFR19BMlhYX0NQX1BGUF9VQ09ERV9EQVRBCQkJCTB4MDAwMDAwYzEKIAorI2RlZmluZSBSRUdfQTJYWF9NSF9NTVVfQ09ORklHCQkJCQkweDAwMDAwMDQwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19NTVVfRU5BQkxFCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX1NQTElUX01PREVfRU5BQkxFCQkJMHgwMDAwMDAwMgorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfUkJfV19DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMDAwMDMwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19SQl9XX0NMTlRfQkVIQVZJT1JfX1NISUZUCQk0CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEyWFhfTUhfTU1VX0NPTkZJR19SQl9XX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IEEyWFhfTUhfTU1VX0NPTkZJR19SQl9XX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEEyWFhfTUhfTU1VX0NPTkZJR19SQl9XX0NMTlRfQkVIQVZJT1JfX01BU0s7Cit9CisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9XX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMDAwYzAKKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1dfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1dfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1dfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1dfQ0xOVF9CRUhBVklPUl9fTUFTSzsKK30KKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IwX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMDAzMDAKKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IwX0NMTlRfQkVIQVZJT1JfX1NISUZUCQk4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SMF9DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjBfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IwX0NMTlRfQkVIQVZJT1JfX01BU0s7Cit9CisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SMV9DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMDAwYzAwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SMV9DTE5UX0JFSEFWSU9SX19TSElGVAkJMTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IxX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SMV9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjFfQ0xOVF9CRUhBVklPUl9fTUFTSzsKK30KKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IyX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMDMwMDAKKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IyX0NMTlRfQkVIQVZJT1JfX1NISUZUCQkxMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjJfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IyX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SMl9DTE5UX0JFSEFWSU9SX19NQVNLOworfQorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjNfQ0xOVF9CRUhBVklPUl9fTUFTSwkJMHgwMDAwYzAwMAorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjNfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTE0CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SM19DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjNfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1IzX0NMTlRfQkVIQVZJT1JfX01BU0s7Cit9CisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SNF9DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMDMwMDAwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SNF9DTE5UX0JFSEFWSU9SX19TSElGVAkJMTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQTJYWF9NSF9NTVVfQ09ORklHX0NQX1I0X0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IEEyWFhfTUhfTU1VX0NPTkZJR19DUF9SNF9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBMlhYX01IX01NVV9DT05GSUdfQ1BfUjRfQ0xOVF9CRUhBVklPUl9fTUFTSzsKK30KKyNkZWZpbmUgQTJYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMF9DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMGMwMDAwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19WR1RfUjBfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTE4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEyWFhfTUhfTU1VX0NPTkZJR19WR1RfUjBfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgQTJYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMF9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBMlhYX01IX01NVV9DT05GSUdfVkdUX1IwX0NMTlRfQkVIQVZJT1JfX01BU0s7Cit9CisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19WR1RfUjFfQ0xOVF9CRUhBVklPUl9fTUFTSwkJMHgwMDMwMDAwMAorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfVkdUX1IxX0NMTlRfQkVIQVZJT1JfX1NISUZUCQkyMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBBMlhYX01IX01NVV9DT05GSUdfVkdUX1IxX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IEEyWFhfTUhfTU1VX0NPTkZJR19WR1RfUjFfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQTJYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMV9DTE5UX0JFSEFWSU9SX19NQVNLOworfQorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfVENfUl9DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwYzAwMDAwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19UQ19SX0NMTlRfQkVIQVZJT1JfX1NISUZUCQkyMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBBMlhYX01IX01NVV9DT05GSUdfVENfUl9DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBBMlhYX01IX01NVV9DT05GSUdfVENfUl9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBMlhYX01IX01NVV9DT05GSUdfVENfUl9DTE5UX0JFSEFWSU9SX19NQVNLOworfQorI2RlZmluZSBBMlhYX01IX01NVV9DT05GSUdfUEFfV19DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAzMDAwMDAwCisjZGVmaW5lIEEyWFhfTUhfTU1VX0NPTkZJR19QQV9XX0NMTlRfQkVIQVZJT1JfX1NISUZUCQkyNAorc3RhdGljIGlubGluZSB1aW50MzJfdCBBMlhYX01IX01NVV9DT05GSUdfUEFfV19DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBBMlhYX01IX01NVV9DT05GSUdfUEFfV19DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBMlhYX01IX01NVV9DT05GSUdfUEFfV19DTE5UX0JFSEFWSU9SX19NQVNLOworfQorCisjZGVmaW5lIFJFR19BMlhYX01IX01NVV9WQV9SQU5HRQkJCQkweDAwMDAwMDQxCisKKyNkZWZpbmUgUkVHX0EyWFhfTUhfTU1VX1BUX0JBU0UJCQkJCTB4MDAwMDAwNDIKKworI2RlZmluZSBSRUdfQTJYWF9NSF9NTVVfUEFHRV9GQVVMVAkJCQkweDAwMDAwMDQzCisKKyNkZWZpbmUgUkVHX0EyWFhfTUhfTU1VX1RSQU5fRVJST1IJCQkJMHgwMDAwMDA0NAorCisjZGVmaW5lIFJFR19BMlhYX01IX01NVV9JTlZBTElEQVRFCQkJCTB4MDAwMDAwNDUKKworI2RlZmluZSBSRUdfQTJYWF9NSF9NTVVfTVBVX0JBU0UJCQkJMHgwMDAwMDA0NgorCisjZGVmaW5lIFJFR19BMlhYX01IX01NVV9NUFVfRU5ECQkJCQkweDAwMDAwMDQ3CisKKyNkZWZpbmUgUkVHX0EyWFhfTlFXQUlUX1VOVElMCQkJCQkweDAwMDAwMzk0CisKICNkZWZpbmUgUkVHX0EyWFhfUkJCTV9QRVJGQ09VTlRFUjFfU0VMRUNUCQkJMHgwMDAwMDM5NQogCiAjZGVmaW5lIFJFR19BMlhYX1JCQk1fUEVSRkNPVU5URVIxX0xPCQkJCTB4MDAwMDAzOTcKQEAgLTI3NiwyMCArMzY5LDYgQEAKIAogI2RlZmluZSBSRUdfQTJYWF9DUF9QRVJGQ09VTlRFUl9ISQkJCQkweDAwMDAwNDQ3CiAKLSNkZWZpbmUgUkVHX0EyWFhfQ1BfU1RfQkFTRQkJCQkJMHgwMDAwMDQ0ZAotCi0jZGVmaW5lIFJFR19BMlhYX0NQX1NUX0JVRlNaCQkJCQkweDAwMDAwNDRlCi0KLSNkZWZpbmUgUkVHX0EyWFhfQ1BfSUIxX0JBU0UJCQkJCTB4MDAwMDA0NTgKLQotI2RlZmluZSBSRUdfQTJYWF9DUF9JQjFfQlVGU1oJCQkJCTB4MDAwMDA0NTkKLQotI2RlZmluZSBSRUdfQTJYWF9DUF9JQjJfQkFTRQkJCQkJMHgwMDAwMDQ1YQotCi0jZGVmaW5lIFJFR19BMlhYX0NQX0lCMl9CVUZTWgkJCQkJMHgwMDAwMDQ1YgotCi0jZGVmaW5lIFJFR19BMlhYX0NQX1NUQVQJCQkJCTB4MDAwMDA0N2YKLQogI2RlZmluZSBSRUdfQTJYWF9SQkJNX1NUQVRVUwkJCQkJMHgwMDAwMDVkMAogI2RlZmluZSBBMlhYX1JCQk1fU1RBVFVTX0NNREZJRk9fQVZBSUxfX01BU0sJCQkweDAwMDAwMDFmCiAjZGVmaW5lIEEyWFhfUkJCTV9TVEFUVVNfQ01ERklGT19BVkFJTF9fU0hJRlQJCQkwCkBAIC04MDgsNiArODg3LDEyIEBACiAKICNkZWZpbmUgUkVHX0EyWFhfU1FfVlNfUFJPR1JBTQkJCQkJMHgwMDAwMjFmNwogCisjZGVmaW5lIFJFR19BMlhYX1ZHVF9FVkVOVF9JTklUSUFUT1IJCQkJMHgwMDAwMjFmOQorCisjZGVmaW5lIFJFR19BMlhYX1ZHVF9EUkFXX0lOSVRJQVRPUgkJCQkweDAwMDAyMWZjCisKKyNkZWZpbmUgUkVHX0EyWFhfVkdUX0lNTUVEX0RBVEEJCQkJCTB4MDAwMDIxZmQKKwogI2RlZmluZSBSRUdfQTJYWF9SQl9ERVBUSENPTlRST0wJCQkJMHgwMDAwMjIwMAogI2RlZmluZSBBMlhYX1JCX0RFUFRIQ09OVFJPTF9TVEVOQ0lMX0VOQUJMRQkJCTB4MDAwMDAwMDEKICNkZWZpbmUgQTJYWF9SQl9ERVBUSENPTlRST0xfWl9FTkFCTEUJCQkJMHgwMDAwMDAwMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTN4eC54bWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHgueG1sLmgKaW5kZXggZDRhZmRmNi4uYTdiZTU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTN4eC54bWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4LnhtbC5oCkBAIC04LDEyICs4LDEzIEBACiBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVkcmVuby9lbnZ5dG9vbHMuZ2l0CiAKIFRoZSBydWxlcy1uZy1uZyBzb3VyY2UgZmlsZXMgdGhpcyBoZWFkZXIgd2FzIGdlbmVyYXRlZCBmcm9tIGFyZToKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vLnhtbCAgICAgICAgICAgICAgKCAgICAzMjcgYnl0ZXMsIGZyb20gMjAxMy0wNy0wNSAxOToyMToxMikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZnJlZWRyZW5vX2NvcHlyaWdodC54bWwgKCAgIDE0NTMgYnl0ZXMsIGZyb20gMjAxMy0wMy0zMSAxNjo1MToyNykKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYTJ4eC9hMnh4LnhtbCAgICAgICAgICAgKCAgMzEwMDMgYnl0ZXMsIGZyb20gMjAxMy0wOS0xOSAxODo1MDoxNikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vX2NvbW1vbi54bWwgICAgICAgKCAgIDg5ODMgYnl0ZXMsIGZyb20gMjAxMy0wNy0yNCAwMTozODozNikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vX3BtNC54bWwgICAgICAgICAgKCAgIDk3NTkgYnl0ZXMsIGZyb20gMjAxMy0wOS0xMCAwMDo1MjozMykKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYTN4eC9hM3h4LnhtbCAgICAgICAgICAgKCAgNTE5ODMgYnl0ZXMsIGZyb20gMjAxMy0wOS0xMCAwMDo1MjozMikKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vLnhtbCAgICAgICAgICAgICAgICggICAgMzY0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDc6MTUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICAoICAgMTQ1MyBieXRlcywgZnJvbSAyMDEzLTAzLTMxIDE2OjUxOjI3KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYTJ4eC54bWwgICAgICAgICAgKCAgMzI4MTQgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNTowNzozMykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2FkcmVub19jb21tb24ueG1sICggICA4OTAwIGJ5dGVzLCBmcm9tIDIwMTMtMTAtMjIgMjM6NTc6NDkpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hZHJlbm9fcG00LnhtbCAgICAoICAxMDU3NCBieXRlcywgZnJvbSAyMDEzLTExLTEzIDA1OjQ0OjQ1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYTN4eC54bWwgICAgICAgICAgKCAgNTM2NDQgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNTowNzozMykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2E0eHgueG1sICAgICAgICAgICggICA4MzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDk6NDcpCiAKIENvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CiAtIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQpAQCAtMjkyLDYgKzI5Myw4IEBACiAjZGVmaW5lIEEzWFhfUkJCTV9TVEFUVVNfR1BVX0JVU1lfTk9IQwkJCQkweDQwMDAwMDAwCiAjZGVmaW5lIEEzWFhfUkJCTV9TVEFUVVNfR1BVX0JVU1kJCQkJMHg4MDAwMDAwMAogCisjZGVmaW5lIFJFR19BM1hYX1JCQk1fTlFXQUlUX1VOVElMCQkJCTB4MDAwMDAwNDAKKwogI2RlZmluZSBSRUdfQTNYWF9SQkJNX1dBSVRfSURMRV9DTE9DS1NfQ1RMCQkJMHgwMDAwMDAzMwogCiAjZGVmaW5lIFJFR19BM1hYX1JCQk1fSU5URVJGQUNFX0hBTkdfSU5UX0NUTAkJCTB4MDAwMDAwNTAKQEAgLTMwNCw2ICszMDcsOCBAQAogCiAjZGVmaW5lIFJFR19BM1hYX1JCQk1fSU5URVJGQUNFX0hBTkdfTUFTS19DVEwzCQkJMHgwMDAwMDA1YQogCisjZGVmaW5lIFJFR19BM1hYX1JCQk1fSU5UX1NFVF9DTUQJCQkJMHgwMDAwMDA2MAorCiAjZGVmaW5lIFJFR19BM1hYX1JCQk1fSU5UX0NMRUFSX0NNRAkJCQkweDAwMDAwMDYxCiAKICNkZWZpbmUgUkVHX0EzWFhfUkJCTV9JTlRfMF9NQVNLCQkJCTB4MDAwMDAwNjMKQEAgLTkzNywxMyArOTQyLDEzIEBACiAJcmV0dXJuICgodXRpbF9mbG9hdF90b19oYWxmKHZhbCkpIDw8IEEzWFhfUkJfQkxFTkRfQUxQSEFfRkxPQVRfX1NISUZUKSAmIEEzWFhfUkJfQkxFTkRfQUxQSEFfRkxPQVRfX01BU0s7CiB9CiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8yMEU4CQkJCQkweDAwMDAyMGU4CisjZGVmaW5lIFJFR19BM1hYX1JCX0NMRUFSX0NPTE9SX0RXMAkJCQkweDAwMDAyMGU4CiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8yMEU5CQkJCQkweDAwMDAyMGU5CisjZGVmaW5lIFJFR19BM1hYX1JCX0NMRUFSX0NPTE9SX0RXMQkJCQkweDAwMDAyMGU5CiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8yMEVBCQkJCQkweDAwMDAyMGVhCisjZGVmaW5lIFJFR19BM1hYX1JCX0NMRUFSX0NPTE9SX0RXMgkJCQkweDAwMDAyMGVhCiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8yMEVCCQkJCQkweDAwMDAyMGViCisjZGVmaW5lIFJFR19BM1hYX1JCX0NMRUFSX0NPTE9SX0RXMwkJCQkweDAwMDAyMGViCiAKICNkZWZpbmUgUkVHX0EzWFhfUkJfQ09QWV9DT05UUk9MCQkJCTB4MDAwMDIwZWMKICNkZWZpbmUgQTNYWF9SQl9DT1BZX0NPTlRST0xfTVNBQV9SRVNPTFZFX19NQVNLCQkJMHgwMDAwMDAwMwpAQCAtMTAyNiw3ICsxMDMxLDcgQEAKICNkZWZpbmUgQTNYWF9SQl9ERVBUSF9DT05UUk9MX0JGX0VOQUJMRQkJCQkweDAwMDAwMDgwCiAjZGVmaW5lIEEzWFhfUkJfREVQVEhfQ09OVFJPTF9aX1RFU1RfRU5BQkxFCQkJMHg4MDAwMDAwMAogCi0jZGVmaW5lIFJFR19BM1hYX1VOS05PV05fMjEwMQkJCQkJMHgwMDAwMjEwMQorI2RlZmluZSBSRUdfQTNYWF9SQl9ERVBUSF9DTEVBUgkJCQkJMHgwMDAwMjEwMQogCiAjZGVmaW5lIFJFR19BM1hYX1JCX0RFUFRIX0lORk8JCQkJCTB4MDAwMDIxMDIKICNkZWZpbmUgQTNYWF9SQl9ERVBUSF9JTkZPX0RFUFRIX0ZPUk1BVF9fTUFTSwkJCTB4MDAwMDAwMDEKQEAgLTExMDMsMTEgKzExMDgsMTEgQEAKIAlyZXR1cm4gKCh2YWwpIDw8IEEzWFhfUkJfU1RFTkNJTF9DT05UUk9MX1pGQUlMX0JGX19TSElGVCkgJiBBM1hYX1JCX1NURU5DSUxfQ09OVFJPTF9aRkFJTF9CRl9fTUFTSzsKIH0KIAotI2RlZmluZSBSRUdfQTNYWF9VTktOT1dOXzIxMDUJCQkJCTB4MDAwMDIxMDUKKyNkZWZpbmUgUkVHX0EzWFhfUkJfU1RFTkNJTF9DTEVBUgkJCQkweDAwMDAyMTA1CiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8yMTA2CQkJCQkweDAwMDAyMTA2CisjZGVmaW5lIFJFR19BM1hYX1JCX1NURU5DSUxfQlVGX0lORk8JCQkJMHgwMDAwMjEwNgogCi0jZGVmaW5lIFJFR19BM1hYX1VOS05PV05fMjEwNwkJCQkJMHgwMDAwMjEwNworI2RlZmluZSBSRUdfQTNYWF9SQl9TVEVOQ0lMX0JVRl9QSVRDSAkJCQkweDAwMDAyMTA3CiAKICNkZWZpbmUgUkVHX0EzWFhfUkJfU1RFTkNJTFJFRk1BU0sJCQkJMHgwMDAwMjEwOAogI2RlZmluZSBBM1hYX1JCX1NURU5DSUxSRUZNQVNLX1NURU5DSUxSRUZfX01BU0sJCQkweDAwMDAwMGZmCkBAIC0xMTQ5LDIwICsxMTU0LDMxIEBACiAJcmV0dXJuICgodmFsKSA8PCBBM1hYX1JCX1NURU5DSUxSRUZNQVNLX0JGX1NURU5DSUxXUklURU1BU0tfX1NISUZUKSAmIEEzWFhfUkJfU1RFTkNJTFJFRk1BU0tfQkZfU1RFTkNJTFdSSVRFTUFTS19fTUFTSzsKIH0KIAotI2RlZmluZSBSRUdfQTNYWF9QQV9TQ19XSU5ET1dfT0ZGU0VUCQkJCTB4MDAwMDIxMGUKLSNkZWZpbmUgQTNYWF9QQV9TQ19XSU5ET1dfT0ZGU0VUX1hfX01BU0sJCQkweDAwMDBmZmZmCi0jZGVmaW5lIEEzWFhfUEFfU0NfV0lORE9XX09GRlNFVF9YX19TSElGVAkJCTAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQTNYWF9QQV9TQ19XSU5ET1dfT0ZGU0VUX1godWludDMyX3QgdmFsKQorI2RlZmluZSBSRUdfQTNYWF9SQl9MUlpfVlNDX0NPTlRST0wJCQkJMHgwMDAwMjEwYworI2RlZmluZSBBM1hYX1JCX0xSWl9WU0NfQ09OVFJPTF9CSU5OSU5HX0VOQUJMRQkJCTB4MDAwMDAwMDIKKworI2RlZmluZSBSRUdfQTNYWF9SQl9XSU5ET1dfT0ZGU0VUCQkJCTB4MDAwMDIxMGUKKyNkZWZpbmUgQTNYWF9SQl9XSU5ET1dfT0ZGU0VUX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBBM1hYX1JCX1dJTkRPV19PRkZTRVRfWF9fU0hJRlQJCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1JCX1dJTkRPV19PRkZTRVRfWCh1aW50MzJfdCB2YWwpCiB7Ci0JcmV0dXJuICgodmFsKSA8PCBBM1hYX1BBX1NDX1dJTkRPV19PRkZTRVRfWF9fU0hJRlQpICYgQTNYWF9QQV9TQ19XSU5ET1dfT0ZGU0VUX1hfX01BU0s7CisJcmV0dXJuICgodmFsKSA8PCBBM1hYX1JCX1dJTkRPV19PRkZTRVRfWF9fU0hJRlQpICYgQTNYWF9SQl9XSU5ET1dfT0ZGU0VUX1hfX01BU0s7CiB9Ci0jZGVmaW5lIEEzWFhfUEFfU0NfV0lORE9XX09GRlNFVF9ZX19NQVNLCQkJMHhmZmZmMDAwMAotI2RlZmluZSBBM1hYX1BBX1NDX1dJTkRPV19PRkZTRVRfWV9fU0hJRlQJCQkxNgotc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1BBX1NDX1dJTkRPV19PRkZTRVRfWSh1aW50MzJfdCB2YWwpCisjZGVmaW5lIEEzWFhfUkJfV0lORE9XX09GRlNFVF9ZX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgQTNYWF9SQl9XSU5ET1dfT0ZGU0VUX1lfX1NISUZUCQkJCTE2CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEzWFhfUkJfV0lORE9XX09GRlNFVF9ZKHVpbnQzMl90IHZhbCkKIHsKLQlyZXR1cm4gKCh2YWwpIDw8IEEzWFhfUEFfU0NfV0lORE9XX09GRlNFVF9ZX19TSElGVCkgJiBBM1hYX1BBX1NDX1dJTkRPV19PRkZTRVRfWV9fTUFTSzsKKwlyZXR1cm4gKCh2YWwpIDw8IEEzWFhfUkJfV0lORE9XX09GRlNFVF9ZX19TSElGVCkgJiBBM1hYX1JCX1dJTkRPV19PRkZTRVRfWV9fTUFTSzsKIH0KIAorI2RlZmluZSBSRUdfQTNYWF9SQl9TQU1QTEVfQ09VTlRfQ09OVFJPTAkJCTB4MDAwMDIxMTAKKworI2RlZmluZSBSRUdfQTNYWF9SQl9TQU1QTEVfQ09VTlRfQUREUgkJCQkweDAwMDAyMTExCisKKyNkZWZpbmUgUkVHX0EzWFhfUkJfWl9DTEFNUF9NSU4JCQkJCTB4MDAwMDIxMTQKKworI2RlZmluZSBSRUdfQTNYWF9SQl9aX0NMQU1QX01BWAkJCQkJMHgwMDAwMjExNQorCiAjZGVmaW5lIFJFR19BM1hYX1BDX1ZTVFJFQU1fQ09OVFJPTAkJCQkweDAwMDAyMWU0CiAKICNkZWZpbmUgUkVHX0EzWFhfUENfVkVSVEVYX1JFVVNFX0JMT0NLX0NOVEwJCQkweDAwMDAyMWVhCkBAIC0xMzA5LDYgKzEzMjUsOCBAQAogCiAjZGVmaW5lIFJFR19BM1hYX0hMU1FfQ0xfS0VSTkVMX0dST1VQX1hfUkVHCQkJMHgwMDAwMjIxNQogCisjZGVmaW5lIFJFR19BM1hYX0hMU1FfQ0xfS0VSTkVMX0dST1VQX1lfUkVHCQkJMHgwMDAwMjIxNgorCiAjZGVmaW5lIFJFR19BM1hYX0hMU1FfQ0xfS0VSTkVMX0dST1VQX1pfUkVHCQkJMHgwMDAwMjIxNwogCiAjZGVmaW5lIFJFR19BM1hYX0hMU1FfQ0xfV0dfT0ZGU0VUX1JFRwkJCQkweDAwMDAyMjFhCkBAIC0xNDkxLDEyICsxNTA5LDEzIEBACiAKICNkZWZpbmUgUkVHX0EzWFhfU1BfU1BfQ1RSTF9SRUcJCQkJCTB4MDAwMDIyYzAKICNkZWZpbmUgQTNYWF9TUF9TUF9DVFJMX1JFR19SRVNPTFZFCQkJCTB4MDAwMTAwMDAKLSNkZWZpbmUgQTNYWF9TUF9TUF9DVFJMX1JFR19DT05TVE1PREVfX01BU0sJCQkweDAwMGMwMDAwCisjZGVmaW5lIEEzWFhfU1BfU1BfQ1RSTF9SRUdfQ09OU1RNT0RFX19NQVNLCQkJMHgwMDA0MDAwMAogI2RlZmluZSBBM1hYX1NQX1NQX0NUUkxfUkVHX0NPTlNUTU9ERV9fU0hJRlQJCQkxOAogc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1NQX1NQX0NUUkxfUkVHX0NPTlNUTU9ERSh1aW50MzJfdCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBBM1hYX1NQX1NQX0NUUkxfUkVHX0NPTlNUTU9ERV9fU0hJRlQpICYgQTNYWF9TUF9TUF9DVFJMX1JFR19DT05TVE1PREVfX01BU0s7CiB9CisjZGVmaW5lIEEzWFhfU1BfU1BfQ1RSTF9SRUdfQklOTklORwkJCQkweDAwMDgwMDAwCiAjZGVmaW5lIEEzWFhfU1BfU1BfQ1RSTF9SRUdfU0xFRVBNT0RFX19NQVNLCQkJMHgwMDMwMDAwMAogI2RlZmluZSBBM1hYX1NQX1NQX0NUUkxfUkVHX1NMRUVQTU9ERV9fU0hJRlQJCQkyMAogc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1NQX1NQX0NUUkxfUkVHX1NMRUVQTU9ERSh1aW50MzJfdCB2YWwpCkBAIC0xNjY5LDcgKzE2ODgsNyBAQAogCiAjZGVmaW5lIFJFR19BM1hYX1NQX1ZTX09CSl9TVEFSVF9SRUcJCQkJMHgwMDAwMjJkNQogCi0jZGVmaW5lIFJFR19BM1hYX1NQX1ZTX1BWVF9NRU1fQ1RSTF9SRUcJCQkJMHgwMDAwMjJkNgorI2RlZmluZSBSRUdfQTNYWF9TUF9WU19QVlRfTUVNX1BBUkFNX1JFRwkJCTB4MDAwMDIyZDYKIAogI2RlZmluZSBSRUdfQTNYWF9TUF9WU19QVlRfTUVNX0FERFJfUkVHCQkJCTB4MDAwMDIyZDcKIApAQCAtMTc3Miw3ICsxNzkxLDcgQEAKIAogI2RlZmluZSBSRUdfQTNYWF9TUF9GU19PQkpfU1RBUlRfUkVHCQkJCTB4MDAwMDIyZTMKIAotI2RlZmluZSBSRUdfQTNYWF9TUF9GU19QVlRfTUVNX0NUUkxfUkVHCQkJCTB4MDAwMDIyZTQKKyNkZWZpbmUgUkVHX0EzWFhfU1BfRlNfUFZUX01FTV9QQVJBTV9SRUcJCQkweDAwMDAyMmU0CiAKICNkZWZpbmUgUkVHX0EzWFhfU1BfRlNfUFZUX01FTV9BRERSX1JFRwkJCQkweDAwMDAyMmU1CiAKQEAgLTE5NDMsNiArMTk2Miw5IEBACiAKIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX0EzWFhfVlNDX1BJUEVfREFUQV9MRU5HVEgodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDBjMDggKyAweDMqaTA7IH0KIAorI2RlZmluZSBSRUdfQTNYWF9WU0NfQklOX0NPTlRST0wJCQkJMHgwMDAwMGMzYworI2RlZmluZSBBM1hYX1ZTQ19CSU5fQ09OVFJPTF9CSU5OSU5HX0VOQUJMRQkJCTB4MDAwMDAwMDEKKwogI2RlZmluZSBSRUdfQTNYWF9VTktOT1dOXzBDM0QJCQkJCTB4MDAwMDBjM2QKIAogI2RlZmluZSBSRUdfQTNYWF9QQ19QRVJGQ09VTlRFUjBfU0VMRUNUCQkJCTB4MDAwMDBjNDgKQEAgLTE5NTMsNyArMTk3NSw3IEBACiAKICNkZWZpbmUgUkVHX0EzWFhfUENfUEVSRkNPVU5URVIzX1NFTEVDVAkJCQkweDAwMDAwYzRiCiAKLSNkZWZpbmUgUkVHX0EzWFhfVU5LTk9XTl8wQzgxCQkJCQkweDAwMDAwYzgxCisjZGVmaW5lIFJFR19BM1hYX0dSQVNfVFNFX0RFQlVHX0VDTwkJCQkweDAwMDAwYzgxCiAKICNkZWZpbmUgUkVHX0EzWFhfR1JBU19QRVJGQ09VTlRFUjBfU0VMRUNUCQkJMHgwMDAwMGM4OAogCkBAIC0xOTc1LDIyICsxOTk3LDI0IEBACiAKICNkZWZpbmUgUkVHX0EzWFhfUkJfR01FTV9CQVNFX0FERFIJCQkJMHgwMDAwMGNjMAogCisjZGVmaW5lIFJFR19BM1hYX1JCX0RFQlVHX0VDT19DT05UUk9MU19BRERSCQkJMHgwMDAwMGNjMQorCiAjZGVmaW5lIFJFR19BM1hYX1JCX1BFUkZDT1VOVEVSMF9TRUxFQ1QJCQkJMHgwMDAwMGNjNgogCiAjZGVmaW5lIFJFR19BM1hYX1JCX1BFUkZDT1VOVEVSMV9TRUxFQ1QJCQkJMHgwMDAwMGNjNwogCi0jZGVmaW5lIFJFR19BM1hYX1JCX1dJTkRPV19TSVpFCQkJCQkweDAwMDAwY2UwCi0jZGVmaW5lIEEzWFhfUkJfV0lORE9XX1NJWkVfV0lEVEhfX01BU0sJCQkJMHgwMDAwM2ZmZgotI2RlZmluZSBBM1hYX1JCX1dJTkRPV19TSVpFX1dJRFRIX19TSElGVAkJCTAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQTNYWF9SQl9XSU5ET1dfU0laRV9XSURUSCh1aW50MzJfdCB2YWwpCisjZGVmaW5lIFJFR19BM1hYX1JCX0ZSQU1FX0JVRkZFUl9ESU1FTlNJT04JCQkweDAwMDAwY2UwCisjZGVmaW5lIEEzWFhfUkJfRlJBTUVfQlVGRkVSX0RJTUVOU0lPTl9XSURUSF9fTUFTSwkJMHgwMDAwM2ZmZgorI2RlZmluZSBBM1hYX1JCX0ZSQU1FX0JVRkZFUl9ESU1FTlNJT05fV0lEVEhfX1NISUZUCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEzWFhfUkJfRlJBTUVfQlVGRkVSX0RJTUVOU0lPTl9XSURUSCh1aW50MzJfdCB2YWwpCiB7Ci0JcmV0dXJuICgodmFsKSA8PCBBM1hYX1JCX1dJTkRPV19TSVpFX1dJRFRIX19TSElGVCkgJiBBM1hYX1JCX1dJTkRPV19TSVpFX1dJRFRIX19NQVNLOworCXJldHVybiAoKHZhbCkgPDwgQTNYWF9SQl9GUkFNRV9CVUZGRVJfRElNRU5TSU9OX1dJRFRIX19TSElGVCkgJiBBM1hYX1JCX0ZSQU1FX0JVRkZFUl9ESU1FTlNJT05fV0lEVEhfX01BU0s7CiB9Ci0jZGVmaW5lIEEzWFhfUkJfV0lORE9XX1NJWkVfSEVJR0hUX19NQVNLCQkJMHgwZmZmYzAwMAotI2RlZmluZSBBM1hYX1JCX1dJTkRPV19TSVpFX0hFSUdIVF9fU0hJRlQJCQkxNAotc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1JCX1dJTkRPV19TSVpFX0hFSUdIVCh1aW50MzJfdCB2YWwpCisjZGVmaW5lIEEzWFhfUkJfRlJBTUVfQlVGRkVSX0RJTUVOU0lPTl9IRUlHSFRfX01BU0sJCTB4MGZmZmMwMDAKKyNkZWZpbmUgQTNYWF9SQl9GUkFNRV9CVUZGRVJfRElNRU5TSU9OX0hFSUdIVF9fU0hJRlQJCTE0CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEEzWFhfUkJfRlJBTUVfQlVGRkVSX0RJTUVOU0lPTl9IRUlHSFQodWludDMyX3QgdmFsKQogewotCXJldHVybiAoKHZhbCkgPDwgQTNYWF9SQl9XSU5ET1dfU0laRV9IRUlHSFRfX1NISUZUKSAmIEEzWFhfUkJfV0lORE9XX1NJWkVfSEVJR0hUX19NQVNLOworCXJldHVybiAoKHZhbCkgPDwgQTNYWF9SQl9GUkFNRV9CVUZGRVJfRElNRU5TSU9OX0hFSUdIVF9fU0hJRlQpICYgQTNYWF9SQl9GUkFNRV9CVUZGRVJfRElNRU5TSU9OX0hFSUdIVF9fTUFTSzsKIH0KIAogI2RlZmluZSBSRUdfQTNYWF9ITFNRX1BFUkZDT1VOVEVSMF9TRUxFQ1QJCQkweDAwMDAwZTAwCkBAIC0yMDg4LDYgKzIxMTIsMTQgQEAKIAogI2RlZmluZSBSRUdfQTNYWF9UUF9QRVJGQ09VTlRFUjVfU0VMRUNUCQkJCTB4MDAwMDBmMDkKIAorI2RlZmluZSBSRUdfQTNYWF9WR1RfQ0xfSU5JVElBVE9SCQkJCTB4MDAwMDIxZjAKKworI2RlZmluZSBSRUdfQTNYWF9WR1RfRVZFTlRfSU5JVElBVE9SCQkJCTB4MDAwMDIxZjkKKworI2RlZmluZSBSRUdfQTNYWF9WR1RfRFJBV19JTklUSUFUT1IJCQkJMHgwMDAwMjFmYworCisjZGVmaW5lIFJFR19BM1hYX1ZHVF9JTU1FRF9EQVRBCQkJCQkweDAwMDAyMWZkCisKICNkZWZpbmUgUkVHX0EzWFhfVEVYX1NBTVBfMAkJCQkJMHgwMDAwMDAwMAogI2RlZmluZSBBM1hYX1RFWF9TQU1QXzBfTUlQRklMVEVSX0xJTkVBUgkJCTB4MDAwMDAwMDIKICNkZWZpbmUgQTNYWF9URVhfU0FNUF8wX1hZX01BR19fTUFTSwkJCQkweDAwMDAwMDBjCkBAIC0yMTIzLDYgKzIxNTUsMTggQEAKICNkZWZpbmUgQTNYWF9URVhfU0FNUF8wX1VOTk9STV9DT09SRFMJCQkJMHg4MDAwMDAwMAogCiAjZGVmaW5lIFJFR19BM1hYX1RFWF9TQU1QXzEJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQTNYWF9URVhfU0FNUF8xX01BWF9MT0RfX01BU0sJCQkJMHgwMDNmZjAwMAorI2RlZmluZSBBM1hYX1RFWF9TQU1QXzFfTUFYX0xPRF9fU0hJRlQJCQkJMTIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQTNYWF9URVhfU0FNUF8xX01BWF9MT0QoZmxvYXQgdmFsKQoreworCXJldHVybiAoKCgodWludDMyX3QpKHZhbCAqIDEyLjApKSkgPDwgQTNYWF9URVhfU0FNUF8xX01BWF9MT0RfX1NISUZUKSAmIEEzWFhfVEVYX1NBTVBfMV9NQVhfTE9EX19NQVNLOworfQorI2RlZmluZSBBM1hYX1RFWF9TQU1QXzFfTUlOX0xPRF9fTUFTSwkJCQkweGZmYzAwMDAwCisjZGVmaW5lIEEzWFhfVEVYX1NBTVBfMV9NSU5fTE9EX19TSElGVAkJCQkyMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBBM1hYX1RFWF9TQU1QXzFfTUlOX0xPRChmbG9hdCB2YWwpCit7CisJcmV0dXJuICgoKCh1aW50MzJfdCkodmFsICogMTIuMCkpKSA8PCBBM1hYX1RFWF9TQU1QXzFfTUlOX0xPRF9fU0hJRlQpICYgQTNYWF9URVhfU0FNUF8xX01JTl9MT0RfX01BU0s7Cit9CiAKICNkZWZpbmUgUkVHX0EzWFhfVEVYX0NPTlNUXzAJCQkJCTB4MDAwMDAwMDAKICNkZWZpbmUgQTNYWF9URVhfQ09OU1RfMF9USUxFRAkJCQkJMHgwMDAwMDAwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTN4eF9ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHhfZ3B1LmMKaW5kZXggMDM1YmQxMy4uNDYxZGY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTN4eF9ncHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5jCkBAIC0xNSw2ICsxNSwxMCBAQAogICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpZmRlZiBDT05GSUdfTVNNX09DTUVNCisjICBpbmNsdWRlIDxtYWNoL29jbWVtLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgImEzeHhfZ3B1LmgiCiAKICNkZWZpbmUgQTNYWF9JTlQwX01BU0sgXApAQCAtNjMsNiArNjcsNyBAQAogc3RhdGljIGludCBhM3h4X2h3X2luaXQoc3RydWN0IG1zbV9ncHUgKmdwdSkKIHsKIAlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKKwlzdHJ1Y3QgYTN4eF9ncHUgKmEzeHhfZ3B1ID0gdG9fYTN4eF9ncHUoYWRyZW5vX2dwdSk7CiAJdWludDMyX3QgKnB0ciwgbGVuOwogCWludCBpLCByZXQ7CiAKQEAgLTEwNSw2ICsxMTAsMjEgQEAKIAkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVkJJRl9BQklUX1NPUlQsIDB4MDAwMDAwZmYpOwogCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX0FCSVRfU09SVF9DT05GLCAweDAwMDAwMGE0KTsKIAorCX0gZWxzZSBpZiAoYWRyZW5vX2lzX2EzMzB2MihhZHJlbm9fZ3B1KSkgeworCQkvKgorCQkgKiBNb3N0IG9mIHRoZSBWQklGIHJlZ2lzdGVycyBvbiA4OTc0djIgaGF2ZSB0aGUgY29ycmVjdAorCQkgKiB2YWx1ZXMgYXQgcG93ZXIgb24sIHNvIHdlIHdvbid0IG1vZGlmeSB0aG9zZSBpZiB3ZSBkb24ndAorCQkgKiBuZWVkIHRvCisJCSAqLworCQkvKiBFbmFibGUgMWsgc29ydDogKi8KKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVkJJRl9BQklUX1NPUlQsIDB4MDAwMTAwM2YpOworCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX0FCSVRfU09SVF9DT05GLCAweDAwMDAwMGE0KTsKKwkJLyogRW5hYmxlIFdSLVJFUTogKi8KKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVkJJRl9HQVRFX09GRl9XUlJFUV9FTiwgMHgwMDAwM2YpOworCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX0REUl9PVVRfTUFYX0JVUlNULCAweDAwMDAzMDMpOworCQkvKiBTZXQgdXAgVkJJRl9ST1VORF9ST0JJTl9RT1NfQVJCOiAqLworCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX1JPVU5EX1JPQklOX1FPU19BUkIsIDB4MDAwMyk7CisKIAl9IGVsc2UgaWYgKGFkcmVub19pc19hMzMwKGFkcmVub19ncHUpKSB7CiAJCS8qIFNldCB1cCAxNiBkZWVwIHJlYWQvd3JpdGUgcmVxdWVzdCBxdWV1ZXM6ICovCiAJCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1ZCSUZfSU5fUkRfTElNX0NPTkYwLCAweDE4MTgxODE4KTsKQEAgLTEyMSwxMCArMTQxLDEwIEBACiAJCS8qIFNldCB1cCBWQklGX1JPVU5EX1JPQklOX1FPU19BUkI6ICovCiAJCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1ZCSUZfUk9VTkRfUk9CSU5fUU9TX0FSQiwgMHgwMDAxKTsKIAkJLyogU2V0IHVwIEFPT086ICovCi0JCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1ZCSUZfT1VUX0FYSV9BT09PX0VOLCAweDAwMDBmZmZmKTsKLQkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVkJJRl9PVVRfQVhJX0FPT08sIDB4ZmZmZmZmZmYpOworCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX09VVF9BWElfQU9PT19FTiwgMHgwMDAwMDAzZik7CisJCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1ZCSUZfT1VUX0FYSV9BT09PLCAweDAwM2YwMDNmKTsKIAkJLyogRW5hYmxlIDFLIHNvcnQ6ICovCi0JCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1ZCSUZfQUJJVF9TT1JULCAweDAwMDFmZmZmKTsKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVkJJRl9BQklUX1NPUlQsIDB4MDAwMTAwM2YpOwogCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9WQklGX0FCSVRfU09SVF9DT05GLCAweDAwMDAwMGE0KTsKIAkJLyogRGlzYWJsZSBWQklGIGNsb2NrIGdhdGluZy4gVGhpcyBpcyB0byBlbmFibGUgQVhJIHJ1bm5pbmcKIAkJICogaGlnaGVyIGZyZXF1ZW5jeSB0aGFuIEdQVToKQEAgLTE2MiwxNCArMTgyLDIzIEBACiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfVUNIRV9DQUNIRV9NT0RFX0NPTlRST0xfUkVHLCAweDAwMDAwMDAxKTsKIAogCS8qIEVuYWJsZSBDbG9jayBnYXRpbmc6ICovCi0JZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9DTE9DS19DVEwsIDB4YmZmZmZmZmYpOworCWlmIChhZHJlbm9faXNfYTMyMChhZHJlbm9fZ3B1KSkKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9DTE9DS19DVEwsIDB4YmZmZmZmZmYpOworCWVsc2UgaWYgKGFkcmVub19pc19hMzMwdjIoYWRyZW5vX2dwdSkpCisJCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1JCQk1fQ0xPQ0tfQ1RMLCAweGFhYWFhYWFhKTsKKwllbHNlIGlmIChhZHJlbm9faXNfYTMzMChhZHJlbm9fZ3B1KSkKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9DTE9DS19DVEwsIDB4YmZmY2ZmZmYpOwogCi0JLyogU2V0IHRoZSBPQ01FTSBiYXNlIGFkZHJlc3MgZm9yIEEzMzAgKi8KLS8vVE9ETzoKLS8vCWlmIChhZHJlbm9faXNfYTMzMChhZHJlbm9fZ3B1KSkgewotLy8JCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1JCX0dNRU1fQkFTRV9BRERSLAotLy8JCQkodW5zaWduZWQgaW50KShhM3h4X2dwdS0+b2NtZW1fYmFzZSA+PiAxNCkpOwotLy8JfQorCWlmIChhZHJlbm9faXNfYTMzMHYyKGFkcmVub19ncHUpKQorCQlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9SQkJNX0dQUjBfQ1RMLCAweDA1NTE1NDU1KTsKKwllbHNlIGlmIChhZHJlbm9faXNfYTMzMChhZHJlbm9fZ3B1KSkKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9HUFIwX0NUTCwgMHgwMDAwMDAwMCk7CisKKwkvKiBTZXQgdGhlIE9DTUVNIGJhc2UgYWRkcmVzcyBmb3IgQTMzMCwgZXRjICovCisJaWYgKGEzeHhfZ3B1LT5vY21lbV9oZGwpIHsKKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJfR01FTV9CQVNFX0FERFIsCisJCQkodW5zaWduZWQgaW50KShhM3h4X2dwdS0+b2NtZW1fYmFzZSA+PiAxNCkpOworCX0KIAogCS8qIFR1cm4gb24gcGVyZm9ybWFuY2UgY291bnRlcnM6ICovCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9QRVJGQ1RSX0NUTCwgMHgwMSk7CkBAIC0yMTksNyArMjQ4LDcgQEAKIAkvKiBMb2FkIFBNNDogKi8KIAlwdHIgPSAodWludDMyX3QgKikoYWRyZW5vX2dwdS0+cG00LT5kYXRhKTsKIAlsZW4gPSBhZHJlbm9fZ3B1LT5wbTQtPnNpemUgLyA0OwotCURCRygibG9hZGluZyBQTTQgdWNvZGUgdmVyc2lvbjogJXUiLCBwdHJbMF0pOworCURCRygibG9hZGluZyBQTTQgdWNvZGUgdmVyc2lvbjogJXgiLCBwdHJbMV0pOwogCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0FYWFhfQ1BfREVCVUcsCiAJCQlBWFhYX0NQX0RFQlVHX0RZTkFNSUNfQ0xLX0RJU0FCTEUgfApAQCAtMjMxLDE5ICsyNjAsMjYgQEAKIAkvKiBMb2FkIFBGUDogKi8KIAlwdHIgPSAodWludDMyX3QgKikoYWRyZW5vX2dwdS0+cGZwLT5kYXRhKTsKIAlsZW4gPSBhZHJlbm9fZ3B1LT5wZnAtPnNpemUgLyA0OwotCURCRygibG9hZGluZyBQRlAgdWNvZGUgdmVyc2lvbjogJXUiLCBwdHJbMF0pOworCURCRygibG9hZGluZyBQRlAgdWNvZGUgdmVyc2lvbjogJXgiLCBwdHJbNV0pOwogCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfQ1BfUEZQX1VDT0RFX0FERFIsIDApOwogCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykKIAkJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfQ1BfUEZQX1VDT0RFX0RBVEEsIHB0cltpXSk7CiAKIAkvKiBDUCBST1EgcXVldWUgc2l6ZXMgKGJ5dGVzKSAtIFJCOjE2LCBTVDoxNiwgSUIxOjMyLCBJQjI6NjQgKi8KLQlpZiAoYWRyZW5vX2lzX2EzMDUoYWRyZW5vX2dwdSkgfHwgYWRyZW5vX2lzX2EzMjAoYWRyZW5vX2dwdSkpCisJaWYgKGFkcmVub19pc19hMzA1KGFkcmVub19ncHUpIHx8IGFkcmVub19pc19hMzIwKGFkcmVub19ncHUpKSB7CiAJCWdwdV93cml0ZShncHUsIFJFR19BWFhYX0NQX1FVRVVFX1RIUkVTSE9MRFMsCiAJCQkJQVhYWF9DUF9RVUVVRV9USFJFU0hPTERTX0NTUV9JQjFfU1RBUlQoMikgfAogCQkJCUFYWFhfQ1BfUVVFVUVfVEhSRVNIT0xEU19DU1FfSUIyX1NUQVJUKDYpIHwKIAkJCQlBWFhYX0NQX1FVRVVFX1RIUkVTSE9MRFNfQ1NRX1NUX1NUQVJUKDE0KSk7Ci0KKwl9IGVsc2UgaWYgKGFkcmVub19pc19hMzMwKGFkcmVub19ncHUpKSB7CisJCS8qIE5PVEU6IHRoaXMgKHZhbHVlIHRha2UgZnJvbSBkb3duc3RyZWFtIGFuZHJvaWQgZHJpdmVyKQorCQkgKiBpbmNsdWRlcyBzb21lIGJpdHMgb3V0c2lkZSBvZiB0aGUga25vd24gYml0ZmllbGRzLiAgQnV0CisJCSAqIEEzMzAgaGFzIHRoaXMgIk1FUkNJVSBxdWV1ZSIgdGhpbmcgdG9vLCB3aGljaCBtaWdodAorCQkgKiBleHBsYWluIGEgbmV3IGJpdGZpZWxkIG9yIHJlc2h1ZmZsaW5nOgorCQkgKi8KKwkJZ3B1X3dyaXRlKGdwdSwgUkVHX0FYWFhfQ1BfUVVFVUVfVEhSRVNIT0xEUywgMHgwMDNlMjAwOCk7CisJfQogCiAJLyogY2xlYXIgTUVfSEFMVCB0byBzdGFydCBtaWNybyBlbmdpbmUgKi8KIAlncHVfd3JpdGUoZ3B1LCBSRUdfQVhYWF9DUF9NRV9DTlRMLCAwKTsKQEAgLTI1Myw2ICsyODksMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYTN4eF9yZWNvdmVyKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9TV19SRVNFVF9DTUQsIDEpOworCWdwdV9yZWFkKGdwdSwgUkVHX0EzWFhfUkJCTV9TV19SRVNFVF9DTUQpOworCWdwdV93cml0ZShncHUsIFJFR19BM1hYX1JCQk1fU1dfUkVTRVRfQ01ELCAwKTsKKwlhZHJlbm9fcmVjb3ZlcihncHUpOworfQorCiBzdGF0aWMgdm9pZCBhM3h4X2Rlc3Ryb3koc3RydWN0IG1zbV9ncHUgKmdwdSkKIHsKIAlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dwdSA9IHRvX2FkcmVub19ncHUoZ3B1KTsKQEAgLTI2MSw2ICszMDUsMTIgQEAKIAlEQkcoIiVzIiwgZ3B1LT5uYW1lKTsKIAogCWFkcmVub19ncHVfY2xlYW51cChhZHJlbm9fZ3B1KTsKKworI2lmZGVmIENPTkZJR19NU01fT0NNRU0KKwlpZiAoYTN4eF9ncHUtPm9jbWVtX2Jhc2UpCisJCW9jbWVtX2ZyZWUoT0NNRU1fR1JBUEhJQ1MsIGEzeHhfZ3B1LT5vY21lbV9oZGwpOworI2VuZGlmCisKIAlwdXRfZGV2aWNlKCZhM3h4X2dwdS0+cGRldi0+ZGV2KTsKIAlrZnJlZShhM3h4X2dwdSk7CiB9CkBAIC0zNzEsNyArNDIxLDcgQEAKIAkJLmh3X2luaXQgPSBhM3h4X2h3X2luaXQsCiAJCS5wbV9zdXNwZW5kID0gbXNtX2dwdV9wbV9zdXNwZW5kLAogCQkucG1fcmVzdW1lID0gbXNtX2dwdV9wbV9yZXN1bWUsCi0JCS5yZWNvdmVyID0gYWRyZW5vX3JlY292ZXIsCisJCS5yZWNvdmVyID0gYTN4eF9yZWNvdmVyLAogCQkubGFzdF9mZW5jZSA9IGFkcmVub19sYXN0X2ZlbmNlLAogCQkuc3VibWl0ID0gYWRyZW5vX3N1Ym1pdCwKIAkJLmZsdXNoID0gYWRyZW5vX2ZsdXNoLApAQCAtMzg3LDYgKzQzNyw3IEBACiBzdHJ1Y3QgbXNtX2dwdSAqYTN4eF9ncHVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhM3h4X2dwdSAqYTN4eF9ncHUgPSBOVUxMOworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1OwogCXN0cnVjdCBtc21fZ3B1ICpncHU7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGEzeHhfcGRldjsKIAlzdHJ1Y3QgYWRyZW5vX3BsYXRmb3JtX2NvbmZpZyAqY29uZmlnOwpAQCAtNDA2LDcgKzQ1Nyw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlncHUgPSAmYTN4eF9ncHUtPmJhc2UuYmFzZTsKKwlhZHJlbm9fZ3B1ID0gJmEzeHhfZ3B1LT5iYXNlOworCWdwdSA9ICZhZHJlbm9fZ3B1LT5iYXNlOwogCiAJZ2V0X2RldmljZSgmcGRldi0+ZGV2KTsKIAlhM3h4X2dwdS0+cGRldiA9IHBkZXY7CkBAIC00MTQsMTYgKzQ2Niw0NiBAQAogCWdwdS0+ZmFzdF9yYXRlID0gY29uZmlnLT5mYXN0X3JhdGU7CiAJZ3B1LT5zbG93X3JhdGUgPSBjb25maWctPnNsb3dfcmF0ZTsKIAlncHUtPmJ1c19mcmVxICA9IGNvbmZpZy0+YnVzX2ZyZXE7CisjaWZkZWYgQ09ORklHX01TTV9CVVNfU0NBTElORworCWdwdS0+YnVzX3NjYWxlX3RhYmxlID0gY29uZmlnLT5idXNfc2NhbGVfdGFibGU7CisjZW5kaWYKIAogCURCRygiZmFzdF9yYXRlPSV1LCBzbG93X3JhdGU9JXUsIGJ1c19mcmVxPSV1IiwKIAkJCWdwdS0+ZmFzdF9yYXRlLCBncHUtPnNsb3dfcmF0ZSwgZ3B1LT5idXNfZnJlcSk7CiAKLQlyZXQgPSBhZHJlbm9fZ3B1X2luaXQoZGV2LCBwZGV2LCAmYTN4eF9ncHUtPmJhc2UsCi0JCQkmZnVuY3MsIGNvbmZpZy0+cmV2KTsKKwlyZXQgPSBhZHJlbm9fZ3B1X2luaXQoZGV2LCBwZGV2LCBhZHJlbm9fZ3B1LCAmZnVuY3MsIGNvbmZpZy0+cmV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKLQlyZXR1cm4gJmEzeHhfZ3B1LT5iYXNlLmJhc2U7CisJLyogaWYgbmVlZGVkLCBhbGxvY2F0ZSBnbWVtOiAqLworCWlmIChhZHJlbm9faXNfYTMzMChhZHJlbm9fZ3B1KSkgeworI2lmZGVmIENPTkZJR19NU01fT0NNRU0KKwkJLyogVE9ETyB0aGlzIGlzIGRpZmZlcmVudC9taXNzaW5nIHVwc3RyZWFtOiAqLworCQlzdHJ1Y3Qgb2NtZW1fYnVmICpvY21lbV9oZGwgPQorCQkJCW9jbWVtX2FsbG9jYXRlKE9DTUVNX0dSQVBISUNTLCBhZHJlbm9fZ3B1LT5nbWVtKTsKKworCQlhM3h4X2dwdS0+b2NtZW1faGRsID0gb2NtZW1faGRsOworCQlhM3h4X2dwdS0+b2NtZW1fYmFzZSA9IG9jbWVtX2hkbC0+YWRkcjsKKwkJYWRyZW5vX2dwdS0+Z21lbSA9IG9jbWVtX2hkbC0+bGVuOworCQlEQkcoInVzaW5nICVkSyBvZiBPQ01FTSBhdCAweCUwOHgiLCBhZHJlbm9fZ3B1LT5nbWVtIC8gMTAyNCwKKwkJCQlhM3h4X2dwdS0+b2NtZW1fYmFzZSk7CisjZW5kaWYKKwl9CisKKwlpZiAoIWdwdS0+bW11KSB7CisJCS8qIFRPRE8gd2UgdGhpbmsgaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBHUFUgdG8KKwkJICogcmVzdHJpY3QgYWNjZXNzIHRvIFZSQU0gY2FydmVvdXQuICBCdXQgdGhlIHJlcXVpcmVkCisJCSAqIHJlZ2lzdGVycyBhcmUgdW5rbm93bi4gIEZvciBub3cganVzdCBiYWlsIG91dCBhbmQKKwkJICogbGltcCBhbG9uZyB3aXRoIGp1c3QgbW9kZXNldHRpbmcuICBJZiBpdCB0dXJucyBvdXQKKwkJICogdG8gbm90IGJlIHBvc3NpYmxlIHRvIHJlc3RyaWN0IGFjY2VzcywgdGhlbiB3ZSBtdXN0CisJCSAqIGltcGxlbWVudCBhIGNtZHN0cmVhbSB2YWxpZGF0b3IuCisJCSAqLworCQlkZXZfZXJyKGRldi0+ZGV2LCAiTm8gbWVtb3J5IHByb3RlY3Rpb24gd2l0aG91dCBJT01NVVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBncHU7CiAKIGZhaWw6CiAJaWYgKGEzeHhfZ3B1KQpAQCAtNDM2LDE5ICs1MTgsNTkgQEAKICAqIFRoZSBhM3h4IGRldmljZToKICAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfTVNNX0JVU19TQ0FMSU5HKSAmJiAhZGVmaW5lZChDT05GSUdfT0YpCisjICBpbmNsdWRlIDxtYWNoL2tnc2wuaD4KKyNlbmRpZgorCiBzdGF0aWMgaW50IGEzeHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdGF0aWMgc3RydWN0IGFkcmVub19wbGF0Zm9ybV9jb25maWcgY29uZmlnID0ge307CiAjaWZkZWYgQ09ORklHX09GCi0JLyogVE9ETyAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInFjb20sY2hpcGlkIiwgJnZhbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCBjaGlwaWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNvbmZpZy5yZXYgPSBBRFJFTk9fUkVWKCh2YWwgPj4gMjQpICYgMHhmZiwKKwkJCSh2YWwgPj4gMTYpICYgMHhmZiwgKHZhbCA+PiA4KSAmIDB4ZmYsIHZhbCAmIDB4ZmYpOworCisJLyogZmluZCBjbG9jayByYXRlczogKi8KKwljb25maWcuZmFzdF9yYXRlID0gMDsKKwljb25maWcuc2xvd19yYXRlID0gfjA7CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBjaGlsZCkgeworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJxY29tLGdwdS1wd3JsZXZlbHMiKSkgeworCQkJc3RydWN0IGRldmljZV9ub2RlICpwd3Jsdmw7CisJCQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGNoaWxkLCBwd3JsdmwpIHsKKwkJCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwd3JsdmwsICJxY29tLGdwdS1mcmVxIiwgJnZhbCk7CisJCQkJaWYgKHJldCkgeworCQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCBncHUtZnJlcTogJWRcbiIsIHJldCk7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJCWNvbmZpZy5mYXN0X3JhdGUgPSBtYXgoY29uZmlnLmZhc3RfcmF0ZSwgdmFsKTsKKwkJCQljb25maWcuc2xvd19yYXRlID0gbWluKGNvbmZpZy5zbG93X3JhdGUsIHZhbCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWNvbmZpZy5mYXN0X3JhdGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGZpbmQgY2xrIHJhdGVzXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKICNlbHNlCisJc3RydWN0IGtnc2xfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJdWludDMyX3QgdmVyc2lvbiA9IHNvY2luZm9fZ2V0X3ZlcnNpb24oKTsKIAlpZiAoY3B1X2lzX2FwcTgwNjRhYigpKSB7CiAJCWNvbmZpZy5mYXN0X3JhdGUgPSA0NTAwMDAwMDA7CiAJCWNvbmZpZy5zbG93X3JhdGUgPSAyNzAwMDAwMDsKIAkJY29uZmlnLmJ1c19mcmVxICA9IDQ7CiAJCWNvbmZpZy5yZXYgPSBBRFJFTk9fUkVWKDMsIDIsIDEsIDApOwotCX0gZWxzZSBpZiAoY3B1X2lzX2FwcTgwNjQoKSB8fCBjcHVfaXNfbXNtODk2MGFiKCkpIHsKKwl9IGVsc2UgaWYgKGNwdV9pc19hcHE4MDY0KCkpIHsKIAkJY29uZmlnLmZhc3RfcmF0ZSA9IDQwMDAwMDAwMDsKIAkJY29uZmlnLnNsb3dfcmF0ZSA9IDI3MDAwMDAwOwogCQljb25maWcuYnVzX2ZyZXEgID0gNDsKQEAgLTQ2MSw2ICs1ODMsMTYgQEAKIAkJZWxzZQogCQkJY29uZmlnLnJldiA9IEFEUkVOT19SRVYoMywgMiwgMCwgMCk7CiAKKwl9IGVsc2UgaWYgKGNwdV9pc19tc204OTYwYWIoKSkgeworCQljb25maWcuZmFzdF9yYXRlID0gNDAwMDAwMDAwOworCQljb25maWcuc2xvd19yYXRlID0gMzIwMDAwMDAwOworCQljb25maWcuYnVzX2ZyZXEgID0gNDsKKworCQlpZiAoU09DSU5GT19WRVJTSU9OX01JTk9SKHZlcnNpb24pID09IDApCisJCQljb25maWcucmV2ID0gQURSRU5PX1JFVigzLCAyLCAxLCAwKTsKKwkJZWxzZQorCQkJY29uZmlnLnJldiA9IEFEUkVOT19SRVYoMywgMiwgMSwgMSk7CisKIAl9IGVsc2UgaWYgKGNwdV9pc19tc204OTMwKCkpIHsKIAkJY29uZmlnLmZhc3RfcmF0ZSA9IDQwMDAwMDAwMDsKIAkJY29uZmlnLnNsb3dfcmF0ZSA9IDI3MDAwMDAwOwpAQCAtNDczLDYgKzYwNSw5IEBACiAJCQljb25maWcucmV2ID0gQURSRU5PX1JFVigzLCAwLCA1LCAwKTsKIAogCX0KKyMgIGlmZGVmIENPTkZJR19NU01fQlVTX1NDQUxJTkcKKwljb25maWcuYnVzX3NjYWxlX3RhYmxlID0gcGRhdGEtPmJ1c19zY2FsZV90YWJsZTsKKyMgIGVuZGlmCiAjZW5kaWYKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZjb25maWc7CiAJYTN4eF9wZGV2ID0gcGRldjsKQEAgLTQ4NSwxMCArNjIwLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGR0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGtnc2wtM2QwIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZHRfbWF0Y2gpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhM3h4X2RyaXZlciA9IHsKIAkucHJvYmUgPSBhM3h4X3Byb2JlLAogCS5yZW1vdmUgPSBhM3h4X3JlbW92ZSwKLQkuZHJpdmVyLm5hbWUgPSAia2dzbC0zZDAiLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImtnc2wtM2QwIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZHRfbWF0Y2gsCisJfSwKIH07CiAKIHZvaWQgX19pbml0IGEzeHhfcmVnaXN0ZXIodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHhfZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5oCmluZGV4IDMyYzM5OGMuLmJiOWE4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHhfZ3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTN4eF9ncHUuaApAQCAtMjQsNiArMjQsMTAgQEAKIHN0cnVjdCBhM3h4X2dwdSB7CiAJc3RydWN0IGFkcmVub19ncHUgYmFzZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJLyogaWYgT0NNRU0gaXMgdXNlZCBmb3IgR01FTTogKi8KKwl1aW50MzJfdCBvY21lbV9iYXNlOworCXZvaWQgKm9jbWVtX2hkbDsKIH07CiAjZGVmaW5lIHRvX2EzeHhfZ3B1KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYTN4eF9ncHUsIGJhc2UpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19jb21tb24ueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fY29tbW9uLnhtbC5oCmluZGV4IDMzZGNjNjAuLmQ2ZTZjZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19jb21tb24ueG1sLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2NvbW1vbi54bWwuaApAQCAtOCwxMiArOCwxMyBAQAogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAogCiBUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6Ci0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby54bWwgICAgICAgICAgICAgICggICAgMzI3IGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2EyeHgvYTJ4eC54bWwgICAgICAgICAgICggIDMxMDAzIGJ5dGVzLCBmcm9tIDIwMTMtMDktMTkgMTg6NTA6MTYpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVub19jb21tb24ueG1sICAgICAgICggICA4OTgzIGJ5dGVzLCBmcm9tIDIwMTMtMDctMjQgMDE6Mzg6MzYpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVub19wbTQueG1sICAgICAgICAgICggICA5NzU5IGJ5dGVzLCBmcm9tIDIwMTMtMDktMTAgMDA6NTI6MzMpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2EzeHgvYTN4eC54bWwgICAgICAgICAgICggIDUxOTgzIGJ5dGVzLCBmcm9tIDIwMTMtMDktMTAgMDA6NTI6MzIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby54bWwgICAgICAgICAgICAgICAoICAgIDM2NCBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ3OjE1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9mcmVlZHJlbm9fY29weXJpZ2h0LnhtbCAgKCAgIDE0NTMgYnl0ZXMsIGZyb20gMjAxMy0wMy0zMSAxNjo1MToyNykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2EyeHgueG1sICAgICAgICAgICggIDMyODE0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDc6MzMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hZHJlbm9fY29tbW9uLnhtbCAoICAgODkwMCBieXRlcywgZnJvbSAyMDEzLTEwLTIyIDIzOjU3OjQ5KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYWRyZW5vX3BtNC54bWwgICAgKCAgMTA1NzQgYnl0ZXMsIGZyb20gMjAxMy0xMS0xMyAwNTo0NDo0NSkKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2EzeHgueG1sICAgICAgICAgICggIDUzNjQ0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDc6MzMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hNHh4LnhtbCAgICAgICAgICAoICAgODM0NCBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ5OjQ3KQogCiBDb3B5cmlnaHQgKEMpIDIwMTMgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgogLSBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+IChyb2JjbGFyaykKQEAgLTExNSw5NiArMTE2LDYgQEAKIAlERVBUSFhfMjRfOCA9IDEsCiB9OwogCi1lbnVtIGFkcmVub19tbXVfY2xudF9iZWggewotCUJFSF9ORVZSID0gMCwKLQlCRUhfVFJBTl9STkcgPSAxLAotCUJFSF9UUkFOX0ZMVCA9IDIsCi19OwotCi0jZGVmaW5lIFJFR19BWFhYX01IX01NVV9DT05GSUcJCQkJCTB4MDAwMDAwNDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX01NVV9FTkFCTEUJCQkJMHgwMDAwMDAwMQotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfU1BMSVRfTU9ERV9FTkFCTEUJCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19SQl9XX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMDAwMzAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX1JCX1dfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTQKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQVhYWF9NSF9NTVVfQ09ORklHX1JCX1dfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQotewotCXJldHVybiAoKHZhbCkgPDwgQVhYWF9NSF9NTVVfQ09ORklHX1JCX1dfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQVhYWF9NSF9NTVVfQ09ORklHX1JCX1dfQ0xOVF9CRUhBVklPUl9fTUFTSzsKLX0KLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1dfQ0xOVF9CRUhBVklPUl9fTUFTSwkJMHgwMDAwMDBjMAotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfQ1BfV19DTE5UX0JFSEFWSU9SX19TSElGVAkJNgotc3RhdGljIGlubGluZSB1aW50MzJfdCBBWFhYX01IX01NVV9DT05GSUdfQ1BfV19DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCi17Ci0JcmV0dXJuICgodmFsKSA8PCBBWFhYX01IX01NVV9DT05GSUdfQ1BfV19DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBWFhYX01IX01NVV9DT05GSUdfQ1BfV19DTE5UX0JFSEFWSU9SX19NQVNLOwotfQotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjBfQ0xOVF9CRUhBVklPUl9fTUFTSwkJMHgwMDAwMDMwMAotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjBfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTgKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IwX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKLXsKLQlyZXR1cm4gKCh2YWwpIDw8IEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SMF9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjBfQ0xOVF9CRUhBVklPUl9fTUFTSzsKLX0KLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IxX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMDBjMDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IxX0NMTlRfQkVIQVZJT1JfX1NISUZUCQkxMAotc3RhdGljIGlubGluZSB1aW50MzJfdCBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjFfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQotewotCXJldHVybiAoKHZhbCkgPDwgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IxX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SMV9DTE5UX0JFSEFWSU9SX19NQVNLOwotfQotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjJfQ0xOVF9CRUhBVklPUl9fTUFTSwkJMHgwMDAwMzAwMAotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjJfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTEyCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SMl9DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCi17Ci0JcmV0dXJuICgodmFsKSA8PCBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjJfQ0xOVF9CRUhBVklPUl9fU0hJRlQpICYgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IyX0NMTlRfQkVIQVZJT1JfX01BU0s7Ci19Ci0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SM19DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMDBjMDAwCi0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SM19DTE5UX0JFSEFWSU9SX19TSElGVAkJMTQKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1IzX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKLXsKLQlyZXR1cm4gKCh2YWwpIDw8IEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SM19DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjNfQ0xOVF9CRUhBVklPUl9fTUFTSzsKLX0KLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1I0X0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwMzAwMDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1I0X0NMTlRfQkVIQVZJT1JfX1NISUZUCQkxNgotc3RhdGljIGlubGluZSB1aW50MzJfdCBBWFhYX01IX01NVV9DT05GSUdfQ1BfUjRfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQotewotCXJldHVybiAoKHZhbCkgPDwgQVhYWF9NSF9NTVVfQ09ORklHX0NQX1I0X0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEFYWFhfTUhfTU1VX0NPTkZJR19DUF9SNF9DTE5UX0JFSEFWSU9SX19NQVNLOwotfQotI2RlZmluZSBBWFhYX01IX01NVV9DT05GSUdfVkdUX1IwX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDAwYzAwMDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMF9DTE5UX0JFSEFWSU9SX19TSElGVAkJMTgKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgQVhYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMF9DTE5UX0JFSEFWSU9SKGVudW0gYWRyZW5vX21tdV9jbG50X2JlaCB2YWwpCi17Ci0JcmV0dXJuICgodmFsKSA8PCBBWFhYX01IX01NVV9DT05GSUdfVkdUX1IwX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEFYWFhfTUhfTU1VX0NPTkZJR19WR1RfUjBfQ0xOVF9CRUhBVklPUl9fTUFTSzsKLX0KLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMV9DTE5UX0JFSEFWSU9SX19NQVNLCQkweDAwMzAwMDAwCi0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19WR1RfUjFfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTIwCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IEFYWFhfTUhfTU1VX0NPTkZJR19WR1RfUjFfQ0xOVF9CRUhBVklPUihlbnVtIGFkcmVub19tbXVfY2xudF9iZWggdmFsKQotewotCXJldHVybiAoKHZhbCkgPDwgQVhYWF9NSF9NTVVfQ09ORklHX1ZHVF9SMV9DTE5UX0JFSEFWSU9SX19TSElGVCkgJiBBWFhYX01IX01NVV9DT05GSUdfVkdUX1IxX0NMTlRfQkVIQVZJT1JfX01BU0s7Ci19Ci0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19UQ19SX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDBjMDAwMDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX1RDX1JfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTIyCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IEFYWFhfTUhfTU1VX0NPTkZJR19UQ19SX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKLXsKLQlyZXR1cm4gKCh2YWwpIDw8IEFYWFhfTUhfTU1VX0NPTkZJR19UQ19SX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEFYWFhfTUhfTU1VX0NPTkZJR19UQ19SX0NMTlRfQkVIQVZJT1JfX01BU0s7Ci19Ci0jZGVmaW5lIEFYWFhfTUhfTU1VX0NPTkZJR19QQV9XX0NMTlRfQkVIQVZJT1JfX01BU0sJCTB4MDMwMDAwMDAKLSNkZWZpbmUgQVhYWF9NSF9NTVVfQ09ORklHX1BBX1dfQ0xOVF9CRUhBVklPUl9fU0hJRlQJCTI0Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90IEFYWFhfTUhfTU1VX0NPTkZJR19QQV9XX0NMTlRfQkVIQVZJT1IoZW51bSBhZHJlbm9fbW11X2NsbnRfYmVoIHZhbCkKLXsKLQlyZXR1cm4gKCh2YWwpIDw8IEFYWFhfTUhfTU1VX0NPTkZJR19QQV9XX0NMTlRfQkVIQVZJT1JfX1NISUZUKSAmIEFYWFhfTUhfTU1VX0NPTkZJR19QQV9XX0NMTlRfQkVIQVZJT1JfX01BU0s7Ci19Ci0KLSNkZWZpbmUgUkVHX0FYWFhfTUhfTU1VX1ZBX1JBTkdFCQkJCTB4MDAwMDAwNDEKLQotI2RlZmluZSBSRUdfQVhYWF9NSF9NTVVfUFRfQkFTRQkJCQkJMHgwMDAwMDA0MgotCi0jZGVmaW5lIFJFR19BWFhYX01IX01NVV9QQUdFX0ZBVUxUCQkJCTB4MDAwMDAwNDMKLQotI2RlZmluZSBSRUdfQVhYWF9NSF9NTVVfVFJBTl9FUlJPUgkJCQkweDAwMDAwMDQ0Ci0KLSNkZWZpbmUgUkVHX0FYWFhfTUhfTU1VX0lOVkFMSURBVEUJCQkJMHgwMDAwMDA0NQotCi0jZGVmaW5lIFJFR19BWFhYX01IX01NVV9NUFVfQkFTRQkJCQkweDAwMDAwMDQ2Ci0KLSNkZWZpbmUgUkVHX0FYWFhfTUhfTU1VX01QVV9FTkQJCQkJCTB4MDAwMDAwNDcKLQogI2RlZmluZSBSRUdfQVhYWF9DUF9SQl9CQVNFCQkJCQkweDAwMDAwMWMwCiAKICNkZWZpbmUgUkVHX0FYWFhfQ1BfUkJfQ05UTAkJCQkJMHgwMDAwMDFjMQpAQCAtMjc1LDYgKzE4NiwxOCBAQAogfQogCiAjZGVmaW5lIFJFR19BWFhYX0NQX01FUV9USFJFU0hPTERTCQkJCTB4MDAwMDAxZDYKKyNkZWZpbmUgQVhYWF9DUF9NRVFfVEhSRVNIT0xEU19NRVFfRU5EX19NQVNLCQkJMHgwMDFmMDAwMAorI2RlZmluZSBBWFhYX0NQX01FUV9USFJFU0hPTERTX01FUV9FTkRfX1NISUZUCQkJMTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQVhYWF9DUF9NRVFfVEhSRVNIT0xEU19NRVFfRU5EKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IEFYWFhfQ1BfTUVRX1RIUkVTSE9MRFNfTUVRX0VORF9fU0hJRlQpICYgQVhYWF9DUF9NRVFfVEhSRVNIT0xEU19NRVFfRU5EX19NQVNLOworfQorI2RlZmluZSBBWFhYX0NQX01FUV9USFJFU0hPTERTX1JPUV9FTkRfX01BU0sJCQkweDFmMDAwMDAwCisjZGVmaW5lIEFYWFhfQ1BfTUVRX1RIUkVTSE9MRFNfUk9RX0VORF9fU0hJRlQJCQkyNAorc3RhdGljIGlubGluZSB1aW50MzJfdCBBWFhYX0NQX01FUV9USFJFU0hPTERTX1JPUV9FTkQodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgQVhYWF9DUF9NRVFfVEhSRVNIT0xEU19ST1FfRU5EX19TSElGVCkgJiBBWFhYX0NQX01FUV9USFJFU0hPTERTX1JPUV9FTkRfX01BU0s7Cit9CiAKICNkZWZpbmUgUkVHX0FYWFhfQ1BfQ1NRX0FWQUlMCQkJCQkweDAwMDAwMWQ3CiAjZGVmaW5lIEFYWFhfQ1BfQ1NRX0FWQUlMX1JJTkdfX01BU0sJCQkJMHgwMDAwMDA3ZgpAQCAtNDAyLDYgKzMyNSwzNiBAQAogCXJldHVybiAoKHZhbCkgPDwgQVhYWF9DUF9DU1FfSUIyX1NUQVRfV1BUUl9fU0hJRlQpICYgQVhYWF9DUF9DU1FfSUIyX1NUQVRfV1BUUl9fTUFTSzsKIH0KIAorI2RlZmluZSBSRUdfQVhYWF9DUF9OT05fUFJFRkVUQ0hfQ05UUlMJCQkJMHgwMDAwMDQ0MAorCisjZGVmaW5lIFJFR19BWFhYX0NQX1NUUV9TVF9TVEFUCQkJCQkweDAwMDAwNDQzCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfU1RfQkFTRQkJCQkJMHgwMDAwMDQ0ZAorCisjZGVmaW5lIFJFR19BWFhYX0NQX1NUX0JVRlNaCQkJCQkweDAwMDAwNDRlCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVRX1NUQVQJCQkJCTB4MDAwMDA0NGYKKworI2RlZmluZSBSRUdfQVhYWF9DUF9NSVVfVEFHX1NUQVQJCQkJMHgwMDAwMDQ1MgorCisjZGVmaW5lIFJFR19BWFhYX0NQX0JJTl9NQVNLX0xPCQkJCQkweDAwMDAwNDU0CisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfQklOX01BU0tfSEkJCQkJCTB4MDAwMDA0NTUKKworI2RlZmluZSBSRUdfQVhYWF9DUF9CSU5fU0VMRUNUX0xPCQkJCTB4MDAwMDA0NTYKKworI2RlZmluZSBSRUdfQVhYWF9DUF9CSU5fU0VMRUNUX0hJCQkJCTB4MDAwMDA0NTcKKworI2RlZmluZSBSRUdfQVhYWF9DUF9JQjFfQkFTRQkJCQkJMHgwMDAwMDQ1OAorCisjZGVmaW5lIFJFR19BWFhYX0NQX0lCMV9CVUZTWgkJCQkJMHgwMDAwMDQ1OQorCisjZGVmaW5lIFJFR19BWFhYX0NQX0lCMl9CQVNFCQkJCQkweDAwMDAwNDVhCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfSUIyX0JVRlNaCQkJCQkweDAwMDAwNDViCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfU1RBVAkJCQkJMHgwMDAwMDQ3ZgorCiAjZGVmaW5lIFJFR19BWFhYX0NQX1NDUkFUQ0hfUkVHMAkJCQkweDAwMDAwNTc4CiAKICNkZWZpbmUgUkVHX0FYWFhfQ1BfU0NSQVRDSF9SRUcxCQkJCTB4MDAwMDA1NzkKQEAgLTQxOCw2ICszNzEsMjYgQEAKIAogI2RlZmluZSBSRUdfQVhYWF9DUF9TQ1JBVENIX1JFRzcJCQkJMHgwMDAwMDU3ZgogCisjZGVmaW5lIFJFR19BWFhYX0NQX01FX1ZTX0VWRU5UX1NSQwkJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRVZFTlRfQUREUgkJCQkweDAwMDAwNjAxCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRVZFTlRfREFUQQkJCQkweDAwMDAwNjAyCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRVZFTlRfQUREUl9TV00JCQkweDAwMDAwNjAzCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRVZFTlRfREFUQV9TV00JCQkweDAwMDAwNjA0CisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfUFNfRVZFTlRfU1JDCQkJCTB4MDAwMDA2MDUKKworI2RlZmluZSBSRUdfQVhYWF9DUF9NRV9QU19FVkVOVF9BRERSCQkJCTB4MDAwMDA2MDYKKworI2RlZmluZSBSRUdfQVhYWF9DUF9NRV9QU19FVkVOVF9EQVRBCQkJCTB4MDAwMDA2MDcKKworI2RlZmluZSBSRUdfQVhYWF9DUF9NRV9QU19FVkVOVF9BRERSX1NXTQkJCTB4MDAwMDA2MDgKKworI2RlZmluZSBSRUdfQVhYWF9DUF9NRV9QU19FVkVOVF9EQVRBX1NXTQkJCTB4MDAwMDA2MDkKKwogI2RlZmluZSBSRUdfQVhYWF9DUF9NRV9DRl9FVkVOVF9TUkMJCQkJMHgwMDAwMDYwYQogCiAjZGVmaW5lIFJFR19BWFhYX0NQX01FX0NGX0VWRU5UX0FERFIJCQkJMHgwMDAwMDYwYgpAQCAtNDI4LDUgKzQwMSwxMSBAQAogCiAjZGVmaW5lIFJFR19BWFhYX0NQX01FX05SVF9EQVRBCQkJCQkweDAwMDAwNjBlCiAKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRkVUQ0hfRE9ORV9TUkMJCQkweDAwMDAwNjEyCisKKyNkZWZpbmUgUkVHX0FYWFhfQ1BfTUVfVlNfRkVUQ0hfRE9ORV9BRERSCQkJMHgwMDAwMDYxMworCisjZGVmaW5lIFJFR19BWFhYX0NQX01FX1ZTX0ZFVENIX0RPTkVfREFUQQkJCTB4MDAwMDA2MTQKKwogCiAjZW5kaWYgLyogQURSRU5PX0NPTU1PTl9YTUwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYwppbmRleCBhMGI5ZDhhLi5kMzIxMDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlICJhZHJlbm9fZ3B1LmgiCiAjaW5jbHVkZSAibXNtX2dlbS5oIgorI2luY2x1ZGUgIm1zbV9tbXUuaCIKIAogc3RydWN0IGFkcmVub19pbmZvIHsKIAlzdHJ1Y3QgYWRyZW5vX3JldiByZXY7CkBAIC00NCw3ICs0NSw3IEBACiAJCS5wZnBmdyA9ICJhMzAwX3BmcC5mdyIsCiAJCS5nbWVtICA9IFNaXzUxMkssCiAJfSwgewotCQkucmV2ICAgPSBBRFJFTk9fUkVWKDMsIDMsIDAsIDApLAorCQkucmV2ICAgPSBBRFJFTk9fUkVWKDMsIDMsIDAsIEFOWV9JRCksCiAJCS5yZXZuICA9IDMzMCwKIAkJLm5hbWUgID0gIkEzMzAiLAogCQkucG00ZncgPSAiYTMzMF9wbTQuZnciLApAQCAtNTMsNiArNTQsMTEgQEAKIAl9LAogfTsKIAorTU9EVUxFX0ZJUk1XQVJFKCJhMzAwX3BtNC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJhMzAwX3BmcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJhMzMwX3BtNC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJhMzMwX3BmcC5mdyIpOworCiAjZGVmaW5lIFJCX1NJWkUgICAgU1pfMzJLCiAjZGVmaW5lIFJCX0JMS1NJWkUgMTYKIApAQCAtNjUsNyArNzEsNyBAQAogCQkqdmFsdWUgPSBhZHJlbm9fZ3B1LT5pbmZvLT5yZXZuOwogCQlyZXR1cm4gMDsKIAljYXNlIE1TTV9QQVJBTV9HTUVNX1NJWkU6Ci0JCSp2YWx1ZSA9IGFkcmVub19ncHUtPmluZm8tPmdtZW07CisJCSp2YWx1ZSA9IGFkcmVub19ncHUtPmdtZW07CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCURCRygiJXM6IGludmFsaWQgcGFyYW06ICV1IiwgZ3B1LT5uYW1lLCBwYXJhbSk7CkBAIC04Niw3ICs5Miw3IEBACiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0FYWFhfQ1BfUkJfQ05UTCwKIAkJCS8qIHNpemUgaXMgbG9nMihxdWFkLXdvcmRzKTogKi8KIAkJCUFYWFhfQ1BfUkJfQ05UTF9CVUZTWihpbG9nMihncHUtPnJiLT5zaXplIC8gOCkpIHwKLQkJCUFYWFhfQ1BfUkJfQ05UTF9CTEtTWihSQl9CTEtTSVpFKSk7CisJCQlBWFhYX0NQX1JCX0NOVExfQkxLU1ooaWxvZzIoUkJfQkxLU0laRSAvIDgpKSk7CiAKIAkvKiBTZXR1cCByaW5nYnVmZmVyIGFkZHJlc3M6ICovCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0FYWFhfQ1BfUkJfQkFTRSwgZ3B1LT5yYl9pb3ZhKTsKQEAgLTI4Niw2ICsyOTIsNyBAQAogCQlzdHJ1Y3QgYWRyZW5vX2dwdSAqZ3B1LCBjb25zdCBzdHJ1Y3QgYWRyZW5vX2dwdV9mdW5jcyAqZnVuY3MsCiAJCXN0cnVjdCBhZHJlbm9fcmV2IHJldikKIHsKKwlzdHJ1Y3QgbXNtX21tdSAqbW11OwogCWludCBpLCByZXQ7CiAKIAkvKiBpZGVudGlmeSBncHU6ICovCkBAIC0zMTEsNiArMzE4LDcgQEAKIAkJCXJldi5jb3JlLCByZXYubWFqb3IsIHJldi5taW5vciwgcmV2LnBhdGNoaWQpOwogCiAJZ3B1LT5mdW5jcyA9IGZ1bmNzOworCWdwdS0+Z21lbSA9IGdwdS0+aW5mby0+Z21lbTsKIAlncHUtPnJldiA9IHJldjsKIAogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmdwdS0+cG00LCBncHUtPmluZm8tPnBtNGZ3LCBkcm0tPmRldik7CkBAIC0zMzMsMTAgKzM0MSwxMyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBtc21faW9tbXVfYXR0YWNoKGRybSwgZ3B1LT5iYXNlLmlvbW11LAotCQkJaW9tbXVfcG9ydHMsIEFSUkFZX1NJWkUoaW9tbXVfcG9ydHMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCW1tdSA9IGdwdS0+YmFzZS5tbXU7CisJaWYgKG1tdSkgeworCQlyZXQgPSBtbXUtPmZ1bmNzLT5hdHRhY2gobW11LCBpb21tdV9wb3J0cywKKwkJCQlBUlJBWV9TSVpFKGlvbW11X3BvcnRzKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCWdwdS0+bWVtcHRyc19ibyA9IG1zbV9nZW1fbmV3KGRybSwgc2l6ZW9mKCpncHUtPm1lbXB0cnMpLAogCQkJTVNNX0JPX1VOQ0FDSEVEKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaAppbmRleCBmNzNhYmZiLi5jYTExZWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oCkBAIC01MSw2ICs1MSw3IEBACiAJc3RydWN0IG1zbV9ncHUgYmFzZTsKIAlzdHJ1Y3QgYWRyZW5vX3JldiByZXY7CiAJY29uc3Qgc3RydWN0IGFkcmVub19pbmZvICppbmZvOworCXVpbnQzMl90IGdtZW07ICAvKiBhY3R1YWwgZ21lbSBzaXplICovCiAJdWludDMyX3QgcmV2bjsgIC8qIG51bWVyaWMgcmV2aXNpb24gbmFtZSAqLwogCWNvbnN0IHN0cnVjdCBhZHJlbm9fZ3B1X2Z1bmNzICpmdW5jczsKIApAQCAtNzAsNiArNzEsOSBAQAogc3RydWN0IGFkcmVub19wbGF0Zm9ybV9jb25maWcgewogCXN0cnVjdCBhZHJlbm9fcmV2IHJldjsKIAl1aW50MzJfdCBmYXN0X3JhdGUsIHNsb3dfcmF0ZSwgYnVzX2ZyZXE7CisjaWZkZWYgQ09ORklHX01TTV9CVVNfU0NBTElORworCXN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpidXNfc2NhbGVfdGFibGU7CisjZW5kaWYKIH07CiAKICNkZWZpbmUgQURSRU5PX0lETEVfVElNRU9VVCAoMjAgKiAxMDAwKQpAQCAtOTQsNiArOTgsMTEgQEAKIAlyZXR1cm4gZ3B1LT5yZXZuID09IDMzMDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGFkcmVub19pc19hMzMwdjIoc3RydWN0IGFkcmVub19ncHUgKmdwdSkKK3sKKwlyZXR1cm4gYWRyZW5vX2lzX2EzMzAoZ3B1KSAmJiAoZ3B1LT5yZXYucGF0Y2hpZCA+IDApOworfQorCiBpbnQgYWRyZW5vX2dldF9wYXJhbShzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCB1aW50MzJfdCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKTsKIGludCBhZHJlbm9faHdfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KTsKIHVpbnQzMl90IGFkcmVub19sYXN0X2ZlbmNlKHN0cnVjdCBtc21fZ3B1ICpncHUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX3BtNC54bWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19wbTQueG1sLmgKaW5kZXggMjU5YWQ3MC4uYWU5OTJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX3BtNC54bWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fcG00LnhtbC5oCkBAIC04LDEyICs4LDEzIEBACiBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVkcmVuby9lbnZ5dG9vbHMuZ2l0CiAKIFRoZSBydWxlcy1uZy1uZyBzb3VyY2UgZmlsZXMgdGhpcyBoZWFkZXIgd2FzIGdlbmVyYXRlZCBmcm9tIGFyZToKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vLnhtbCAgICAgICAgICAgICAgKCAgICAzMjcgYnl0ZXMsIGZyb20gMjAxMy0wNy0wNSAxOToyMToxMikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZnJlZWRyZW5vX2NvcHlyaWdodC54bWwgKCAgIDE0NTMgYnl0ZXMsIGZyb20gMjAxMy0wMy0zMSAxNjo1MToyNykKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYTJ4eC9hMnh4LnhtbCAgICAgICAgICAgKCAgMzEwMDMgYnl0ZXMsIGZyb20gMjAxMy0wOS0xOSAxODo1MDoxNikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vX2NvbW1vbi54bWwgICAgICAgKCAgIDg5ODMgYnl0ZXMsIGZyb20gMjAxMy0wNy0yNCAwMTozODozNikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vX3BtNC54bWwgICAgICAgICAgKCAgIDk3NTkgYnl0ZXMsIGZyb20gMjAxMy0wOS0xMCAwMDo1MjozMykKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYTN4eC9hM3h4LnhtbCAgICAgICAgICAgKCAgNTE5ODMgYnl0ZXMsIGZyb20gMjAxMy0wOS0xMCAwMDo1MjozMikKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vLnhtbCAgICAgICAgICAgICAgICggICAgMzY0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDc6MTUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICAoICAgMTQ1MyBieXRlcywgZnJvbSAyMDEzLTAzLTMxIDE2OjUxOjI3KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYTJ4eC54bWwgICAgICAgICAgKCAgMzI4MTQgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNTowNzozMykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2FkcmVub19jb21tb24ueG1sICggICA4OTAwIGJ5dGVzLCBmcm9tIDIwMTMtMTAtMjIgMjM6NTc6NDkpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2FkcmVuby9hZHJlbm9fcG00LnhtbCAgICAoICAxMDU3NCBieXRlcywgZnJvbSAyMDEzLTExLTEzIDA1OjQ0OjQ1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9hZHJlbm8vYTN4eC54bWwgICAgICAgICAgKCAgNTM2NDQgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNTowNzozMykKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvYWRyZW5vL2E0eHgueG1sICAgICAgICAgICggICA4MzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDk6NDcpCiAKIENvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CiAtIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQpAQCAtNjYsMTMgKzY3LDE1IEBACiAKIGVudW0gcGNfZGlfcHJpbXR5cGUgewogCURJX1BUX05PTkUgPSAwLAotCURJX1BUX1BPSU5UTElTVCA9IDEsCisJRElfUFRfUE9JTlRMSVNUX0EyWFggPSAxLAogCURJX1BUX0xJTkVMSVNUID0gMiwKIAlESV9QVF9MSU5FU1RSSVAgPSAzLAogCURJX1BUX1RSSUxJU1QgPSA0LAogCURJX1BUX1RSSUZBTiA9IDUsCiAJRElfUFRfVFJJU1RSSVAgPSA2LAorCURJX1BUX0xJTkVMT09QID0gNywKIAlESV9QVF9SRUNUTElTVCA9IDgsCisJRElfUFRfUE9JTlRMSVNUX0EzWFggPSA5LAogCURJX1BUX1FVQURMSVNUID0gMTMsCiAJRElfUFRfUVVBRFNUUklQID0gMTQsCiAJRElfUFRfUE9MWUdPTiA9IDE1LApAQCAtMTE5LDcgKzEyMiw3IEBACiAJQ1BfV0FJVF9GT1JfSURMRSA9IDM4LAogCUNQX1dBSVRfUkVHX01FTSA9IDYwLAogCUNQX1dBSVRfUkVHX0VRID0gODIsCi0JQ1BfV0FUX1JFR19HVEUgPSA4MywKKwlDUF9XQUlUX1JFR19HVEUgPSA4MywKIAlDUF9XQUlUX1VOVElMX1JFQUQgPSA5MiwKIAlDUF9XQUlUX0lCX1BGRF9DT01QTEVURSA9IDkzLAogCUNQX1JFR19STVcgPSAzMywKQEAgLTE1MSw3ICsxNTQsNiBAQAogCUNQX0NPTlRFWFRfVVBEQVRFID0gOTQsCiAJQ1BfSU5URVJSVVBUID0gNjQsCiAJQ1BfSU1fU1RPUkUgPSA0NCwKLQlDUF9TRVRfQklOX0JBU0VfT0ZGU0VUID0gNzUsCiAJQ1BfU0VUX0RSQVdfSU5JVF9GTEFHUyA9IDc1LAogCUNQX1NFVF9QUk9URUNURURfTU9ERSA9IDk1LAogCUNQX0xPQURfU1RBVEUgPSA0OCwKQEAgLTE1OSw2ICsxNjEsMTYgQEAKIAlDUF9DT05EX0lORElSRUNUX0JVRkZFUl9QRkQgPSA1MCwKIAlDUF9JTkRJUkVDVF9CVUZGRVJfUEZFID0gNjMsCiAJQ1BfU0VUX0JJTiA9IDc2LAorCUNQX1RFU1RfVFdPX01FTVMgPSAxMTMsCisJQ1BfV0FJVF9GT1JfTUUgPSAxOSwKKwlJTl9JQl9QUkVGRVRDSF9FTkQgPSAyMywKKwlJTl9TVUJCTEtfUFJFRkVUQ0ggPSAzMSwKKwlJTl9JTlNUUl9QUkVGRVRDSCA9IDMyLAorCUlOX0lOU1RSX01BVENIID0gNzEsCisJSU5fQ09OU1RfUFJFRkVUQ0ggPSA3MywKKwlJTl9JTkNSX1VQRFRfU1RBVEUgPSA4NSwKKwlJTl9JTkNSX1VQRFRfQ09OU1QgPSA4NiwKKwlJTl9JTkNSX1VQRFRfSU5TVFIgPSA4NywKIH07CiAKIGVudW0gYWRyZW5vX3N0YXRlX2Jsb2NrIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaS54bWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaS54bWwuaAppbmRleCA2ZDRjNjJiLi44N2JlNjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2kueG1sLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLnhtbC5oCkBAIC04LDE0ICs4LDE2IEBACiBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVkcmVuby9lbnZ5dG9vbHMuZ2l0CiAKIFRoZSBydWxlcy1uZy1uZyBzb3VyY2UgZmlsZXMgdGhpcyBoZWFkZXIgd2FzIGdlbmVyYXRlZCBmcm9tIGFyZToKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbXNtLnhtbCAgICAgICAgICAgICAgICAgKCAgICA1OTUgYnl0ZXMsIGZyb20gMjAxMy0wNy0wNSAxOToyMToxMikKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbXNtLnhtbCAgICAgICAgICAgICAgICAgKCAgICA2NDcgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNDo0NTozNSkKIC0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZnJlZWRyZW5vX2NvcHlyaWdodC54bWwgKCAgIDE0NTMgYnl0ZXMsIGZyb20gMjAxMy0wMy0zMSAxNjo1MToyNykKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbWRwNC9tZHA0LnhtbCAgICAgICAgICAgKCAgMTkzMzIgYnl0ZXMsIGZyb20gMjAxMy0xMC0wNyAxNjozNjo0OCkKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbWRwL21kcDQueG1sICAgICAgICAgICAgKCAgMTc5OTYgYnl0ZXMsIGZyb20gMjAxMy0xMi0wMSAxOToxMDozMSkKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbWRwL21kcF9jb21tb24ueG1sICAgICAgKCAgIDE2MTUgYnl0ZXMsIGZyb20gMjAxMy0xMS0zMCAxNTowMDo1MikKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvbWRwL21kcDUueG1sICAgICAgICAgICAgKCAgMjI1MTcgYnl0ZXMsIGZyb20gMjAxMy0xMi0wMyAyMDo1OToxMykKIC0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZHNpL2RzaS54bWwgICAgICAgICAgICAgKCAgMTE3MTIgYnl0ZXMsIGZyb20gMjAxMy0wOC0xNyAxNzoxMzo0MykKIC0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZHNpL3NmcGIueG1sICAgICAgICAgICAgKCAgICAzNDQgYnl0ZXMsIGZyb20gMjAxMy0wOC0xMSAxOToyNjozMikKIC0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvZHNpL21tc3NfY2MueG1sICAgICAgICAgKCAgIDE1NDQgYnl0ZXMsIGZyb20gMjAxMy0wOC0xNiAxOToxNzowNSkKIC0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvaGRtaS9xZnByb20ueG1sICAgICAgICAgKCAgICA2MDAgYnl0ZXMsIGZyb20gMjAxMy0wNy0wNSAxOToyMToxMikKLS0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvaGRtaS9oZG1pLnhtbCAgICAgICAgICAgKCAgMTkyODggYnl0ZXMsIGZyb20gMjAxMy0wOC0xMSAxODoxNDoxNSkKKy0gL2hvbWUvcm9iY2xhcmsvc3JjL2ZyZWVkcmVuby9lbnZ5dG9vbHMvcm5uZGIvaGRtaS9oZG1pLnhtbCAgICAgICAgICAgKCAgMjA5MzIgYnl0ZXMsIGZyb20gMjAxMy0xMi0wMSAxNToxMzowNCkKIAogQ29weXJpZ2h0IChDKSAyMDEzIGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKIC0gUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPiAocm9iY2xhcmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9tbXNzX2NjLnhtbC5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvbW1zc19jYy54bWwuaAppbmRleCBkMWRmMzhiLi43NDdhNmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9tbXNzX2NjLnhtbC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL21tc3NfY2MueG1sLmgKQEAgLTgsMTQgKzgsMTYgQEAKIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZnJlZWRyZW5vL2Vudnl0b29scy5naXQKIAogVGhlIHJ1bGVzLW5nLW5nIHNvdXJjZSBmaWxlcyB0aGlzIGhlYWRlciB3YXMgZ2VuZXJhdGVkIGZyb20gYXJlOgotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tc20ueG1sICAgICAgICAgICAgICAgICAoICAgIDU5NSBieXRlcywgZnJvbSAyMDEzLTA3LTA1IDE5OjIxOjEyKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tc20ueG1sICAgICAgICAgICAgICAgICAoICAgIDY0NyBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ1OjM1KQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9mcmVlZHJlbm9fY29weXJpZ2h0LnhtbCAoICAgMTQ1MyBieXRlcywgZnJvbSAyMDEzLTAzLTMxIDE2OjUxOjI3KQotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHA0L21kcDQueG1sICAgICAgICAgICAoICAxOTMzMiBieXRlcywgZnJvbSAyMDEzLTEwLTA3IDE2OjM2OjQ4KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwNC54bWwgICAgICAgICAgICAoICAxNzk5NiBieXRlcywgZnJvbSAyMDEzLTEyLTAxIDE5OjEwOjMxKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwX2NvbW1vbi54bWwgICAgICAoICAgMTYxNSBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE1OjAwOjUyKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwNS54bWwgICAgICAgICAgICAoICAyMjUxNyBieXRlcywgZnJvbSAyMDEzLTEyLTAzIDIwOjU5OjEzKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvZHNpLnhtbCAgICAgICAgICAgICAoICAxMTcxMiBieXRlcywgZnJvbSAyMDEzLTA4LTE3IDE3OjEzOjQzKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvc2ZwYi54bWwgICAgICAgICAgICAoICAgIDM0NCBieXRlcywgZnJvbSAyMDEzLTA4LTExIDE5OjI2OjMyKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvbW1zc19jYy54bWwgICAgICAgICAoICAgMTU0NCBieXRlcywgZnJvbSAyMDEzLTA4LTE2IDE5OjE3OjA1KQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL3FmcHJvbS54bWwgICAgICAgICAoICAgIDYwMCBieXRlcywgZnJvbSAyMDEzLTA3LTA1IDE5OjIxOjEyKQotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL2hkbWkueG1sICAgICAgICAgICAoICAxOTI4OCBieXRlcywgZnJvbSAyMDEzLTA4LTExIDE4OjE0OjE1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL2hkbWkueG1sICAgICAgICAgICAoICAyMDkzMiBieXRlcywgZnJvbSAyMDEzLTEyLTAxIDE1OjEzOjA0KQogCiBDb3B5cmlnaHQgKEMpIDIwMTMgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgogLSBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+IChyb2JjbGFyaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL3NmcGIueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9zZnBiLnhtbC5oCmluZGV4IDAwMzBhMTEuLjQ4ZTAzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL3NmcGIueG1sLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvc2ZwYi54bWwuaApAQCAtOCwxNCArOCwxNiBAQAogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAogCiBUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6Ci0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNTk1IGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNjQ3IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDU6MzUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcDQvbWRwNC54bWwgICAgICAgICAgICggIDE5MzMyIGJ5dGVzLCBmcm9tIDIwMTMtMTAtMDcgMTY6MzY6NDgpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA0LnhtbCAgICAgICAgICAgICggIDE3OTk2IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTk6MTA6MzEpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHBfY29tbW9uLnhtbCAgICAgICggICAxNjE1IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDA6NTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA1LnhtbCAgICAgICAgICAgICggIDIyNTE3IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDMgMjA6NTk6MTMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9kc2kueG1sICAgICAgICAgICAgICggIDExNzEyIGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTcgMTc6MTM6NDMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9zZnBiLnhtbCAgICAgICAgICAgICggICAgMzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTk6MjY6MzIpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9tbXNzX2NjLnhtbCAgICAgICAgICggICAxNTQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTYgMTk6MTc6MDUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvcWZwcm9tLnhtbCAgICAgICAgICggICAgNjAwIGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDE5Mjg4IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTg6MTQ6MTUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDIwOTMyIGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTU6MTM6MDQpCiAKIENvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CiAtIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmMKaW5kZXggNTBkMTFkZi4uNmYxNTg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS5jCkBAIC00MSw3ICs0MSw3IEBACiAJCQlwb3dlcl9vbiA/ICJFbmFibGUiIDogIkRpc2FibGUiLCBjdHJsKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGhkbWlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK2lycXJldHVybl90IGhkbWlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGRldl9pZDsKIApAQCAtNzEsMTMgKzcxLDEzIEBACiB9CiAKIC8qIGluaXRpYWxpemUgY29ubmVjdG9yICovCi1pbnQgaGRtaV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3N0cnVjdCBoZG1pICpoZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBoZG1pICpoZG1pID0gTlVMTDsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gaGRtaV9wZGV2OwogCXN0cnVjdCBoZG1pX3BsYXRmb3JtX2NvbmZpZyAqY29uZmlnOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCWlmICghcGRldikgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAibm8gaGRtaSBkZXZpY2VcbiIpOwpAQCAtOTksNiArOTksNyBAQAogCiAJaGRtaS0+ZGV2ID0gZGV2OwogCWhkbWktPnBkZXYgPSBwZGV2OworCWhkbWktPmNvbmZpZyA9IGNvbmZpZzsKIAloZG1pLT5lbmNvZGVyID0gZW5jb2RlcjsKIAogCS8qIG5vdCBzdXJlIGFib3V0IHdoaWNoIHBoeSBtYXBzIHRvIHdoaWNoIG1zbS4uIHByb2JhYmx5IEkgbWlzcyBzb21lICovCkBAIC0xMTQsNDQgKzExNSw3MCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaGRtaS0+bW1pbyA9IG1zbV9pb3JlbWFwKHBkZXYsICJoZG1pX21zbV9oZG1pX2FkZHIiLCAiSERNSSIpOworCWhkbWktPm1taW8gPSBtc21faW9yZW1hcChwZGV2LCBjb25maWctPm1taW9fbmFtZSwgIkhETUkiKTsKIAlpZiAoSVNfRVJSKGhkbWktPm1taW8pKSB7CiAJCXJldCA9IFBUUl9FUlIoaGRtaS0+bW1pbyk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQloZG1pLT5tdnMgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgIjg5MDFfaGRtaV9tdnMiKTsKLQlpZiAoSVNfRVJSKGhkbWktPm12cykpCi0JCWhkbWktPm12cyA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAiaGRtaV9tdnMiKTsKLQlpZiAoSVNfRVJSKGhkbWktPm12cykpIHsKLQkJcmV0ID0gUFRSX0VSUihoZG1pLT5tdnMpOwotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtdnMgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsOworCUJVR19PTihjb25maWctPmhwZF9yZWdfY250ID4gQVJSQVlfU0laRShoZG1pLT5ocGRfcmVncykpOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmhwZF9yZWdfY250OyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvciAqcmVnOworCisJCXJlZyA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCBjb25maWctPmhwZF9yZWdfbmFtZXNbaV0pOworCQlpZiAoSVNfRVJSKHJlZykpIHsKKwkJCXJldCA9IFBUUl9FUlIocmVnKTsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGhwZCByZWd1bGF0b3I6ICVzICglZClcbiIsCisJCQkJCWNvbmZpZy0+aHBkX3JlZ19uYW1lc1tpXSwgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWhkbWktPmhwZF9yZWdzW2ldID0gcmVnOwogCX0KIAotCWhkbWktPm1wcDAgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgIjg5MDFfbXBwMCIpOwotCWlmIChJU19FUlIoaGRtaS0+bXBwMCkpCi0JCWhkbWktPm1wcDAgPSBOVUxMOworCUJVR19PTihjb25maWctPnB3cl9yZWdfY250ID4gQVJSQVlfU0laRShoZG1pLT5wd3JfcmVncykpOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnB3cl9yZWdfY250OyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvciAqcmVnOwogCi0JaGRtaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJjb3JlX2NsayIpOwotCWlmIChJU19FUlIoaGRtaS0+Y2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGhkbWktPmNsayk7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0ICdjbGsnOiAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsOworCQlyZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgY29uZmlnLT5wd3JfcmVnX25hbWVzW2ldKTsKKwkJaWYgKElTX0VSUihyZWcpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHJlZyk7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwd3IgcmVndWxhdG9yOiAlcyAoJWQpXG4iLAorCQkJCQljb25maWctPnB3cl9yZWdfbmFtZXNbaV0sIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQloZG1pLT5wd3JfcmVnc1tpXSA9IHJlZzsKIAl9CiAKLQloZG1pLT5tX3BjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm1hc3Rlcl9pZmFjZV9jbGsiKTsKLQlpZiAoSVNfRVJSKGhkbWktPm1fcGNsaykpIHsKLQkJcmV0ID0gUFRSX0VSUihoZG1pLT5tX3BjbGspOwotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCAnbV9wY2xrJzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKKwlCVUdfT04oY29uZmlnLT5ocGRfY2xrX2NudCA+IEFSUkFZX1NJWkUoaGRtaS0+aHBkX2Nsa3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ocGRfY2xrX2NudDsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsazsKKworCQljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgY29uZmlnLT5ocGRfY2xrX25hbWVzW2ldKTsKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBocGQgY2xrOiAlcyAoJWQpXG4iLAorCQkJCQljb25maWctPmhwZF9jbGtfbmFtZXNbaV0sIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQloZG1pLT5ocGRfY2xrc1tpXSA9IGNsazsKIAl9CiAKLQloZG1pLT5zX3BjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInNsYXZlX2lmYWNlX2NsayIpOwotCWlmIChJU19FUlIoaGRtaS0+c19wY2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGhkbWktPnNfcGNsayk7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0ICdzX3BjbGsnOiAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsOworCUJVR19PTihjb25maWctPnB3cl9jbGtfY250ID4gQVJSQVlfU0laRShoZG1pLT5wd3JfY2xrcykpOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnB3cl9jbGtfY250OyBpKyspIHsKKwkJc3RydWN0IGNsayAqY2xrOworCisJCWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBjb25maWctPnB3cl9jbGtfbmFtZXNbaV0pOworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHB3ciBjbGs6ICVzICglZClcbiIsCisJCQkJCWNvbmZpZy0+cHdyX2Nsa19uYW1lc1tpXSwgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWhkbWktPnB3cl9jbGtzW2ldID0gY2xrOwogCX0KIAogCWhkbWktPmkyYyA9IGhkbWlfaTJjX2luaXQoaGRtaSk7CkBAIC0xNzgsMjAgKzIwNSwyMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaGRtaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaGRtaS0+aXJxIDwgMCkgewotCQlyZXQgPSBoZG1pLT5pcnE7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9CisJaWYgKCFjb25maWctPnNoYXJlZF9pcnEpIHsKKwkJaGRtaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJaWYgKGhkbWktPmlycSA8IDApIHsKKwkJCXJldCA9IGhkbWktPmlycTsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycTogJWRcbiIsIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KIAotCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaGRtaS0+aXJxLAotCQkJTlVMTCwgaGRtaV9pcnEsIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAotCQkJImhkbWlfaXNyIiwgaGRtaSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUSV1OiAlZFxuIiwKLQkJCQloZG1pLT5pcnEsIHJldCk7Ci0JCWdvdG8gZmFpbDsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBoZG1pLT5pcnEsCisJCQkJTlVMTCwgaGRtaV9pcnEsIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAorCQkJCSJoZG1pX2lzciIsIGhkbWkpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUSV1OiAlZFxuIiwKKwkJCQkJaGRtaS0+aXJxLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CiAJfQogCiAJZW5jb2Rlci0+YnJpZGdlID0gaGRtaS0+YnJpZGdlOwpAQCAtMTk5LDcgKzIyOCw3IEBACiAJcHJpdi0+YnJpZGdlc1twcml2LT5udW1fYnJpZGdlcysrXSAgICAgICA9IGhkbWktPmJyaWRnZTsKIAlwcml2LT5jb25uZWN0b3JzW3ByaXYtPm51bV9jb25uZWN0b3JzKytdID0gaGRtaS0+Y29ubmVjdG9yOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGhkbWk7CiAKIGZhaWw6CiAJaWYgKGhkbWkpIHsKQEAgLTIxMSwzNyArMjQwLDEwMCBAQAogCQloZG1pX2Rlc3Ryb3koJmhkbWktPnJlZmNvdW50KTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIC8qCiAgKiBUaGUgaGRtaSBkZXZpY2U6CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKwogc3RhdGljIGludCBoZG1pX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0YXRpYyBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgY29uZmlnID0ge307CiAjaWZkZWYgQ09ORklHX09GCi0JLyogVE9ETyAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJaW50IGdldF9ncGlvKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCQlpbnQgZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG9mX25vZGUsIG5hbWUsIDApOworCQlpZiAoZ3BpbyA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZ3BpbzogJXMgKCVkKVxuIiwKKwkJCQkJbmFtZSwgZ3Bpbyk7CisJCQlncGlvID0gLTE7CisJCX0KKwkJcmV0dXJuIGdwaW87CisJfQorCisJLyogVE9ETyBhY3R1YWxseSB1c2UgRFQuLiAqLworCXN0YXRpYyBjb25zdCBjaGFyICpocGRfcmVnX25hbWVzW10gPSB7ImhwZC1nZHNjIiwgImhwZC01diJ9OworCXN0YXRpYyBjb25zdCBjaGFyICpwd3JfcmVnX25hbWVzW10gPSB7ImNvcmUtdmRkYSIsICJjb3JlLXZjYyJ9OworCXN0YXRpYyBjb25zdCBjaGFyICpocGRfY2xrX25hbWVzW10gPSB7ImlmYWNlX2NsayIsICJjb3JlX2NsayIsICJtZHBfY29yZV9jbGsifTsKKwlzdGF0aWMgY29uc3QgY2hhciAqcHdyX2Nsa19uYW1lc1tdID0geyJleHRwX2NsayIsICJhbHRfaWZhY2VfY2xrIn07CisKKwljb25maWcucGh5X2luaXQgICAgICA9IGhkbWlfcGh5Xzh4NzRfaW5pdDsKKwljb25maWcubW1pb19uYW1lICAgICA9ICJjb3JlX3BoeXNpY2FsIjsKKwljb25maWcuaHBkX3JlZ19uYW1lcyA9IGhwZF9yZWdfbmFtZXM7CisJY29uZmlnLmhwZF9yZWdfY250ICAgPSBBUlJBWV9TSVpFKGhwZF9yZWdfbmFtZXMpOworCWNvbmZpZy5wd3JfcmVnX25hbWVzID0gcHdyX3JlZ19uYW1lczsKKwljb25maWcucHdyX3JlZ19jbnQgICA9IEFSUkFZX1NJWkUocHdyX3JlZ19uYW1lcyk7CisJY29uZmlnLmhwZF9jbGtfbmFtZXMgPSBocGRfY2xrX25hbWVzOworCWNvbmZpZy5ocGRfY2xrX2NudCAgID0gQVJSQVlfU0laRShocGRfY2xrX25hbWVzKTsKKwljb25maWcucHdyX2Nsa19uYW1lcyA9IHB3cl9jbGtfbmFtZXM7CisJY29uZmlnLnB3cl9jbGtfY250ICAgPSBBUlJBWV9TSVpFKHB3cl9jbGtfbmFtZXMpOworCWNvbmZpZy5kZGNfY2xrX2dwaW8gID0gZ2V0X2dwaW8oInFjb20saGRtaS10eC1kZGMtY2xrIik7CisJY29uZmlnLmRkY19kYXRhX2dwaW8gPSBnZXRfZ3BpbygicWNvbSxoZG1pLXR4LWRkYy1kYXRhIik7CisJY29uZmlnLmhwZF9ncGlvICAgICAgPSBnZXRfZ3BpbygicWNvbSxoZG1pLXR4LWhwZCIpOworCWNvbmZpZy5tdXhfZW5fZ3BpbyAgID0gZ2V0X2dwaW8oInFjb20saGRtaS10eC1tdXgtZW4iKTsKKwljb25maWcubXV4X3NlbF9ncGlvICA9IGdldF9ncGlvKCJxY29tLGhkbWktdHgtbXV4LXNlbCIpOworCWNvbmZpZy5zaGFyZWRfaXJxICAgID0gdHJ1ZTsKKwogI2Vsc2UKKwlzdGF0aWMgY29uc3QgY2hhciAqaHBkX2Nsa19uYW1lc1tdID0geworCQkJImNvcmVfY2xrIiwgIm1hc3Rlcl9pZmFjZV9jbGsiLCAic2xhdmVfaWZhY2VfY2xrIiwKKwl9OwogCWlmIChjcHVfaXNfYXBxODA2NCgpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpocGRfcmVnX25hbWVzW10gPSB7Ijg5MjFfaGRtaV9tdnMifTsKIAkJY29uZmlnLnBoeV9pbml0ICAgICAgPSBoZG1pX3BoeV84OTYwX2luaXQ7CisJCWNvbmZpZy5tbWlvX25hbWUgICAgID0gImhkbWlfbXNtX2hkbWlfYWRkciI7CisJCWNvbmZpZy5ocGRfcmVnX25hbWVzID0gaHBkX3JlZ19uYW1lczsKKwkJY29uZmlnLmhwZF9yZWdfY250ICAgPSBBUlJBWV9TSVpFKGhwZF9yZWdfbmFtZXMpOworCQljb25maWcuaHBkX2Nsa19uYW1lcyA9IGhwZF9jbGtfbmFtZXM7CisJCWNvbmZpZy5ocGRfY2xrX2NudCAgID0gQVJSQVlfU0laRShocGRfY2xrX25hbWVzKTsKIAkJY29uZmlnLmRkY19jbGtfZ3BpbyAgPSA3MDsKIAkJY29uZmlnLmRkY19kYXRhX2dwaW8gPSA3MTsKIAkJY29uZmlnLmhwZF9ncGlvICAgICAgPSA3MjsKLQkJY29uZmlnLnBtaWNfZ3BpbyAgICAgPSAxMyArIE5SX0dQSU9fSVJRUzsKLQl9IGVsc2UgaWYgKGNwdV9pc19tc204OTYwKCkpIHsKKwkJY29uZmlnLm11eF9lbl9ncGlvICAgPSAtMTsKKwkJY29uZmlnLm11eF9zZWxfZ3BpbyAgPSAxMyArIE5SX0dQSU9fSVJRUzsKKwl9IGVsc2UgaWYgKGNwdV9pc19tc204OTYwKCkgfHwgY3B1X2lzX21zbTg5NjBhYigpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpocGRfcmVnX25hbWVzW10gPSB7Ijg5MjFfaGRtaV9tdnMifTsKIAkJY29uZmlnLnBoeV9pbml0ICAgICAgPSBoZG1pX3BoeV84OTYwX2luaXQ7CisJCWNvbmZpZy5tbWlvX25hbWUgICAgID0gImhkbWlfbXNtX2hkbWlfYWRkciI7CisJCWNvbmZpZy5ocGRfcmVnX25hbWVzID0gaHBkX3JlZ19uYW1lczsKKwkJY29uZmlnLmhwZF9yZWdfY250ICAgPSBBUlJBWV9TSVpFKGhwZF9yZWdfbmFtZXMpOworCQljb25maWcuaHBkX2Nsa19uYW1lcyA9IGhwZF9jbGtfbmFtZXM7CisJCWNvbmZpZy5ocGRfY2xrX2NudCAgID0gQVJSQVlfU0laRShocGRfY2xrX25hbWVzKTsKIAkJY29uZmlnLmRkY19jbGtfZ3BpbyAgPSAxMDA7CiAJCWNvbmZpZy5kZGNfZGF0YV9ncGlvID0gMTAxOwogCQljb25maWcuaHBkX2dwaW8gICAgICA9IDEwMjsKLQkJY29uZmlnLnBtaWNfZ3BpbyAgICAgPSAtMTsKKwkJY29uZmlnLm11eF9lbl9ncGlvICAgPSAtMTsKKwkJY29uZmlnLm11eF9zZWxfZ3BpbyAgPSAtMTsKIAl9IGVsc2UgaWYgKGNwdV9pc19tc204eDYwKCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmhwZF9yZWdfbmFtZXNbXSA9IHsKKwkJCQkiODkwMV9oZG1pX212cyIsICI4OTAxX21wcDAiCisJCX07CiAJCWNvbmZpZy5waHlfaW5pdCAgICAgID0gaGRtaV9waHlfOHg2MF9pbml0OworCQljb25maWcubW1pb19uYW1lICAgICA9ICJoZG1pX21zbV9oZG1pX2FkZHIiOworCQljb25maWcuaHBkX3JlZ19uYW1lcyA9IGhwZF9yZWdfbmFtZXM7CisJCWNvbmZpZy5ocGRfcmVnX2NudCAgID0gQVJSQVlfU0laRShocGRfcmVnX25hbWVzKTsKKwkJY29uZmlnLmhwZF9jbGtfbmFtZXMgPSBocGRfY2xrX25hbWVzOworCQljb25maWcuaHBkX2Nsa19jbnQgICA9IEFSUkFZX1NJWkUoaHBkX2Nsa19uYW1lcyk7CiAJCWNvbmZpZy5kZGNfY2xrX2dwaW8gID0gMTcwOwogCQljb25maWcuZGRjX2RhdGFfZ3BpbyA9IDE3MTsKIAkJY29uZmlnLmhwZF9ncGlvICAgICAgPSAxNzI7Ci0JCWNvbmZpZy5wbWljX2dwaW8gICAgID0gLTE7CisJCWNvbmZpZy5tdXhfZW5fZ3BpbyAgID0gLTE7CisJCWNvbmZpZy5tdXhfc2VsX2dwaW8gID0gLTE7CiAJfQogI2VuZGlmCiAJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmY29uZmlnOwpAQCAtMjU1LDEwICszNDcsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20saGRtaS10eCIgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGR0X21hdGNoKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGRtaV9kcml2ZXIgPSB7CiAJLnByb2JlID0gaGRtaV9kZXZfcHJvYmUsCiAJLnJlbW92ZSA9IGhkbWlfZGV2X3JlbW92ZSwKLQkuZHJpdmVyLm5hbWUgPSAiaGRtaV9tc20iLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImhkbWlfbXNtIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZHRfbWF0Y2gsCisJfSwKIH07CiAKIHZvaWQgX19pbml0IGhkbWlfcmVnaXN0ZXIodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS5oCmluZGV4IDJjMmVjNTYuLjQxYjI5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuaApAQCAtMjgsNiArMjgsNyBAQAogCiAKIHN0cnVjdCBoZG1pX3BoeTsKK3N0cnVjdCBoZG1pX3BsYXRmb3JtX2NvbmZpZzsKIAogc3RydWN0IGhkbWkgewogCXN0cnVjdCBrcmVmIHJlZmNvdW50OwpAQCAtMzUsMTQgKzM2LDE0IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCisJY29uc3Qgc3RydWN0IGhkbWlfcGxhdGZvcm1fY29uZmlnICpjb25maWc7CisKIAl2b2lkIF9faW9tZW0gKm1taW87CiAKLQlzdHJ1Y3QgcmVndWxhdG9yICptdnM7ICAgICAgICAvKiBIRE1JXzVWICovCi0Jc3RydWN0IHJlZ3VsYXRvciAqbXBwMDsgICAgICAgLyogRXh0ZXJuYWwgNVYgKi8KLQotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgY2xrICptX3BjbGs7Ci0Jc3RydWN0IGNsayAqc19wY2xrOworCXN0cnVjdCByZWd1bGF0b3IgKmhwZF9yZWdzWzJdOworCXN0cnVjdCByZWd1bGF0b3IgKnB3cl9yZWdzWzJdOworCXN0cnVjdCBjbGsgKmhwZF9jbGtzWzNdOworCXN0cnVjdCBjbGsgKnB3cl9jbGtzWzJdOwogCiAJc3RydWN0IGhkbWlfcGh5ICpwaHk7CiAJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CkBAIC02MCw3ICs2MSwyOSBAQAogLyogcGxhdGZvcm0gY29uZmlnIGRhdGEgKGllLiBmcm9tIERULCBvciBwZGF0YSkgKi8KIHN0cnVjdCBoZG1pX3BsYXRmb3JtX2NvbmZpZyB7CiAJc3RydWN0IGhkbWlfcGh5ICooKnBoeV9pbml0KShzdHJ1Y3QgaGRtaSAqaGRtaSk7Ci0JaW50IGRkY19jbGtfZ3BpbywgZGRjX2RhdGFfZ3BpbywgaHBkX2dwaW8sIHBtaWNfZ3BpbzsKKwljb25zdCBjaGFyICptbWlvX25hbWU7CisKKwkvKiByZWd1bGF0b3JzIHRoYXQgbmVlZCB0byBiZSBvbiBmb3IgaHBkOiAqLworCWNvbnN0IGNoYXIgKipocGRfcmVnX25hbWVzOworCWludCBocGRfcmVnX2NudDsKKworCS8qIHJlZ3VsYXRvcnMgdGhhdCBuZWVkIHRvIGJlIG9uIGZvciBzY3JlZW4gcHdyOiAqLworCWNvbnN0IGNoYXIgKipwd3JfcmVnX25hbWVzOworCWludCBwd3JfcmVnX2NudDsKKworCS8qIGNsa3MgdGhhdCBuZWVkIHRvIGJlIG9uIGZvciBocGQ6ICovCisJY29uc3QgY2hhciAqKmhwZF9jbGtfbmFtZXM7CisJaW50IGhwZF9jbGtfY250OworCisJLyogY2xrcyB0aGF0IG5lZWQgdG8gYmUgb24gZm9yIHNjcmVlbiBwd3IgKGllIHBpeGVsIGNsayk6ICovCisJY29uc3QgY2hhciAqKnB3cl9jbGtfbmFtZXM7CisJaW50IHB3cl9jbGtfY250OworCisJLyogZ3BpbydzOiAqLworCWludCBkZGNfY2xrX2dwaW8sIGRkY19kYXRhX2dwaW8sIGhwZF9ncGlvLCBtdXhfZW5fZ3BpbywgbXV4X3NlbF9ncGlvOworCisJLyogb2xkZXIgZGV2aWNlcyBoYWQgdGhlaXIgb3duIGlycSwgbWRwNSsgaXQgaXMgc2hhcmVkIHcvIG1kcDogKi8KKwlib29sIHNoYXJlZF9pcnE7CiB9OwogCiB2b2lkIGhkbWlfc2V0X21vZGUoc3RydWN0IGhkbWkgKmhkbWksIGJvb2wgcG93ZXJfb24pOwpAQCAtMTA2LDYgKzEyOSw3IEBACiAKIHN0cnVjdCBoZG1pX3BoeSAqaGRtaV9waHlfODk2MF9pbml0KHN0cnVjdCBoZG1pICpoZG1pKTsKIHN0cnVjdCBoZG1pX3BoeSAqaGRtaV9waHlfOHg2MF9pbml0KHN0cnVjdCBoZG1pICpoZG1pKTsKK3N0cnVjdCBoZG1pX3BoeSAqaGRtaV9waHlfOHg3NF9pbml0KHN0cnVjdCBoZG1pICpoZG1pKTsKIAogLyoKICAqIGhkbWkgYnJpZGdlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS54bWwuaAppbmRleCA0ZTkzOWY4Li5lMjYzNjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS54bWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS54bWwuaApAQCAtOCwxNCArOCwxNiBAQAogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAogCiBUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6Ci0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNTk1IGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNjQ3IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDU6MzUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcDQvbWRwNC54bWwgICAgICAgICAgICggIDE5MzMyIGJ5dGVzLCBmcm9tIDIwMTMtMTAtMDcgMTY6MzY6NDgpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA0LnhtbCAgICAgICAgICAgICggIDE3OTk2IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTk6MTA6MzEpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHBfY29tbW9uLnhtbCAgICAgICggICAxNjE1IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDA6NTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA1LnhtbCAgICAgICAgICAgICggIDIyNTE3IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDMgMjA6NTk6MTMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9kc2kueG1sICAgICAgICAgICAgICggIDExNzEyIGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTcgMTc6MTM6NDMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9zZnBiLnhtbCAgICAgICAgICAgICggICAgMzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTk6MjY6MzIpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9tbXNzX2NjLnhtbCAgICAgICAgICggICAxNTQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTYgMTk6MTc6MDUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvcWZwcm9tLnhtbCAgICAgICAgICggICAgNjAwIGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDE5Mjg4IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTg6MTQ6MTUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDIwOTMyIGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTU6MTM6MDQpCiAKIENvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CiAtIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQpAQCAtMjEyLDYgKzIxNCwyMCBAQAogI2RlZmluZSBSRUdfSERNSV9IRENQX1JFU0VUCQkJCQkweDAwMDAwMTMwCiAjZGVmaW5lIEhETUlfSERDUF9SRVNFVF9MSU5LMF9ERUFVVEhFTlRJQ0FURQkJCTB4MDAwMDAwMDEKIAorI2RlZmluZSBSRUdfSERNSV9WRU5TUEVDX0lORk8wCQkJCQkweDAwMDAwMTZjCisKKyNkZWZpbmUgUkVHX0hETUlfVkVOU1BFQ19JTkZPMQkJCQkJMHgwMDAwMDE3MAorCisjZGVmaW5lIFJFR19IRE1JX1ZFTlNQRUNfSU5GTzIJCQkJCTB4MDAwMDAxNzQKKworI2RlZmluZSBSRUdfSERNSV9WRU5TUEVDX0lORk8zCQkJCQkweDAwMDAwMTc4CisKKyNkZWZpbmUgUkVHX0hETUlfVkVOU1BFQ19JTkZPNAkJCQkJMHgwMDAwMDE3YworCisjZGVmaW5lIFJFR19IRE1JX1ZFTlNQRUNfSU5GTzUJCQkJCTB4MDAwMDAxODAKKworI2RlZmluZSBSRUdfSERNSV9WRU5TUEVDX0lORk82CQkJCQkweDAwMDAwMTg0CisKICNkZWZpbmUgUkVHX0hETUlfQVVESU9fQ0ZHCQkJCQkweDAwMDAwMWQwCiAjZGVmaW5lIEhETUlfQVVESU9fQ0ZHX0VOR0lORV9FTkFCTEUJCQkJMHgwMDAwMDAwMQogI2RlZmluZSBIRE1JX0FVRElPX0NGR19GSUZPX1dBVEVSTUFSS19fTUFTSwkJCTB4MDAwMDAwZjAKQEAgLTIzNSw2ICsyNTEsOSBAQAogCXJldHVybiAoKHZhbCkgPDwgSERNSV9ERENfQ1RSTF9UUkFOU0FDVElPTl9DTlRfX1NISUZUKSAmIEhETUlfRERDX0NUUkxfVFJBTlNBQ1RJT05fQ05UX19NQVNLOwogfQogCisjZGVmaW5lIFJFR19IRE1JX0REQ19BUkJJVFJBVElPTgkJCQkweDAwMDAwMjEwCisjZGVmaW5lIEhETUlfRERDX0FSQklUUkFUSU9OX0hXX0FSQklUUkFUSU9OCQkJMHgwMDAwMDAxMAorCiAjZGVmaW5lIFJFR19IRE1JX0REQ19JTlRfQ1RSTAkJCQkJMHgwMDAwMDIxNAogI2RlZmluZSBIRE1JX0REQ19JTlRfQ1RSTF9TV19ET05FX0lOVAkJCQkweDAwMDAwMDAxCiAjZGVmaW5lIEhETUlfRERDX0lOVF9DVFJMX1NXX0RPTkVfQUNLCQkJCTB4MDAwMDAwMDIKQEAgLTM0MCw2ICszNTksMjAgQEAKIAlyZXR1cm4gKCh2YWwpIDw8IEhETUlfRERDX1JFRl9SRUZUSU1FUl9fU0hJRlQpICYgSERNSV9ERENfUkVGX1JFRlRJTUVSX19NQVNLOwogfQogCisjZGVmaW5lIFJFR19IRE1JX0NFQ19TVEFUVVMJCQkJCTB4MDAwMDAyOTgKKworI2RlZmluZSBSRUdfSERNSV9DRUNfSU5UCQkJCQkweDAwMDAwMjljCisKKyNkZWZpbmUgUkVHX0hETUlfQ0VDX0FERFIJCQkJCTB4MDAwMDAyYTAKKworI2RlZmluZSBSRUdfSERNSV9DRUNfVElNRQkJCQkJMHgwMDAwMDJhNAorCisjZGVmaW5lIFJFR19IRE1JX0NFQ19SRUZUSU1FUgkJCQkJMHgwMDAwMDJhOAorCisjZGVmaW5lIFJFR19IRE1JX0NFQ19SRF9EQVRBCQkJCQkweDAwMDAwMmFjCisKKyNkZWZpbmUgUkVHX0hETUlfQ0VDX1JEX0ZJTFRFUgkJCQkJMHgwMDAwMDJiMAorCiAjZGVmaW5lIFJFR19IRE1JX0FDVElWRV9IU1lOQwkJCQkJMHgwMDAwMDJiNAogI2RlZmluZSBIRE1JX0FDVElWRV9IU1lOQ19TVEFSVF9fTUFTSwkJCQkweDAwMDAwZmZmCiAjZGVmaW5lIEhETUlfQUNUSVZFX0hTWU5DX1NUQVJUX19TSElGVAkJCQkwCkBAIC00MTAsMTcgKzQ0MywzMyBAQAogI2RlZmluZSBIRE1JX0ZSQU1FX0NUUkxfSFNZTkNfTE9XCQkJCTB4MjAwMDAwMDAKICNkZWZpbmUgSERNSV9GUkFNRV9DVFJMX0lOVEVSTEFDRURfRU4JCQkJMHg4MDAwMDAwMAogCisjZGVmaW5lIFJFR19IRE1JX0FVRF9JTlQJCQkJCTB4MDAwMDAyY2MKKyNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9GSUZPX1VSVU5fSU5UCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9GSUZPX1VSQU5fTUFTSwkJCQkweDAwMDAwMDAyCisjZGVmaW5lIEhETUlfQVVEX0lOVF9BVURfU0FNX0RST1BfSU5UCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9TQU1fRFJPUF9NQVNLCQkJCTB4MDAwMDAwMDgKKwogI2RlZmluZSBSRUdfSERNSV9QSFlfQ1RSTAkJCQkJMHgwMDAwMDJkNAogI2RlZmluZSBIRE1JX1BIWV9DVFJMX1NXX1JFU0VUX1BMTAkJCQkweDAwMDAwMDAxCiAjZGVmaW5lIEhETUlfUEhZX0NUUkxfU1dfUkVTRVRfUExMX0xPVwkJCQkweDAwMDAwMDAyCiAjZGVmaW5lIEhETUlfUEhZX0NUUkxfU1dfUkVTRVQJCQkJCTB4MDAwMDAwMDQKICNkZWZpbmUgSERNSV9QSFlfQ1RSTF9TV19SRVNFVF9MT1cJCQkJMHgwMDAwMDAwOAogCi0jZGVmaW5lIFJFR19IRE1JX0FVRF9JTlQJCQkJCTB4MDAwMDAyY2MKLSNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9GSUZPX1VSVU5fSU5UCQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9GSUZPX1VSQU5fTUFTSwkJCQkweDAwMDAwMDAyCi0jZGVmaW5lIEhETUlfQVVEX0lOVF9BVURfU0FNX0RST1BfSU5UCQkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgSERNSV9BVURfSU5UX0FVRF9TQU1fRFJPUF9NQVNLCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUkVHX0hETUlfQ0VDX1dSX1JBTkdFCQkJCQkweDAwMDAwMmRjCisKKyNkZWZpbmUgUkVHX0hETUlfQ0VDX1JEX1JBTkdFCQkJCQkweDAwMDAwMmUwCisKKyNkZWZpbmUgUkVHX0hETUlfVkVSU0lPTgkJCQkJMHgwMDAwMDJlNAorCisjZGVmaW5lIFJFR19IRE1JX0NFQ19DT01QTF9DVEwJCQkJCTB4MDAwMDAzNjAKKworI2RlZmluZSBSRUdfSERNSV9DRUNfUkRfU1RBUlRfUkFOR0UJCQkJMHgwMDAwMDM2NAorCisjZGVmaW5lIFJFR19IRE1JX0NFQ19SRF9UT1RBTF9SQU5HRQkJCQkweDAwMDAwMzY4CisKKyNkZWZpbmUgUkVHX0hETUlfQ0VDX1JEX0VSUl9SRVNQX0xPCQkJCTB4MDAwMDAzNmMKKworI2RlZmluZSBSRUdfSERNSV9DRUNfV1JfQ0hFQ0tfQ09ORklHCQkJCTB4MDAwMDAzNzAKIAogI2RlZmluZSBSRUdfSERNSV84eDYwX1BIWV9SRUcwCQkJCQkweDAwMDAwMzAwCiAjZGVmaW5lIEhETUlfOHg2MF9QSFlfUkVHMF9ERVNFUl9ERUxfQ1RSTF9fTUFTSwkJCTB4MDAwMDAwMWMKQEAgLTUwNCw1ICs1NTMsMjMgQEAKIAogI2RlZmluZSBSRUdfSERNSV84OTYwX1BIWV9SRUcxMgkJCQkJMHgwMDAwMDQzMAogCisjZGVmaW5lIFJFR19IRE1JXzh4NzRfQU5BX0NGRzAJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBSRUdfSERNSV84eDc0X0FOQV9DRkcxCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgUkVHX0hETUlfOHg3NF9QRF9DVFJMMAkJCQkJMHgwMDAwMDAxMAorCisjZGVmaW5lIFJFR19IRE1JXzh4NzRfUERfQ1RSTDEJCQkJCTB4MDAwMDAwMTQKKworI2RlZmluZSBSRUdfSERNSV84eDc0X0JJU1RfQ0ZHMAkJCQkJMHgwMDAwMDAzNAorCisjZGVmaW5lIFJFR19IRE1JXzh4NzRfQklTVF9QQVROMAkJCQkweDAwMDAwMDNjCisKKyNkZWZpbmUgUkVHX0hETUlfOHg3NF9CSVNUX1BBVE4xCQkJCTB4MDAwMDAwNDAKKworI2RlZmluZSBSRUdfSERNSV84eDc0X0JJU1RfUEFUTjIJCQkJMHgwMDAwMDA0NAorCisjZGVmaW5lIFJFR19IRE1JXzh4NzRfQklTVF9QQVROMwkJCQkweDAwMDAwMDQ4CisKIAogI2VuZGlmIC8qIEhETUlfWE1MICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9icmlkZ2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jCmluZGV4IDVhOGVlMzQuLjdkMTBlNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAJc3RydWN0IGRybV9icmlkZ2UgYmFzZTsKIAogCXN0cnVjdCBoZG1pICpoZG1pOworCWJvb2wgcG93ZXJfb247CiAKIAl1bnNpZ25lZCBsb25nIGludCBwaXhjbG9jazsKIH07CkBAIC0zNCw2ICszNSw2NSBAQAogCWtmcmVlKGhkbWlfYnJpZGdlKTsKIH0KIAorc3RhdGljIHZvaWQgcG93ZXJfb24oc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYnJpZGdlLT5kZXY7CisJc3RydWN0IGhkbWlfYnJpZGdlICpoZG1pX2JyaWRnZSA9IHRvX2hkbWlfYnJpZGdlKGJyaWRnZSk7CisJc3RydWN0IGhkbWkgKmhkbWkgPSBoZG1pX2JyaWRnZS0+aGRtaTsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cHdyX3JlZ19jbnQ7IGkrKykgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGhkbWktPnB3cl9yZWdzW2ldKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcHdyIHJlZ3VsYXRvcjogJXMgKCVkKVxuIiwKKwkJCQkJY29uZmlnLT5wd3JfcmVnX25hbWVzW2ldLCByZXQpOworCQl9CisJfQorCisJaWYgKGNvbmZpZy0+cHdyX2Nsa19jbnQgPiAwKSB7CisJCURCRygicGl4Y2xvY2s6ICVsdSIsIGhkbWlfYnJpZGdlLT5waXhjbG9jayk7CisJCXJldCA9IGNsa19zZXRfcmF0ZShoZG1pLT5wd3JfY2xrc1swXSwgaGRtaV9icmlkZ2UtPnBpeGNsb2NrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBzZXQgcGl4ZWwgY2xrOiAlcyAoJWQpXG4iLAorCQkJCQljb25maWctPnB3cl9jbGtfbmFtZXNbMF0sIHJldCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5wd3JfY2xrX2NudDsgaSsrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShoZG1pLT5wd3JfY2xrc1tpXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHB3ciBjbGs6ICVzICglZClcbiIsCisJCQkJCWNvbmZpZy0+cHdyX2Nsa19uYW1lc1tpXSwgcmV0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcG93ZXJfb2ZmKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJyaWRnZS0+ZGV2OworCXN0cnVjdCBoZG1pX2JyaWRnZSAqaGRtaV9icmlkZ2UgPSB0b19oZG1pX2JyaWRnZShicmlkZ2UpOworCXN0cnVjdCBoZG1pICpoZG1pID0gaGRtaV9icmlkZ2UtPmhkbWk7CisJY29uc3Qgc3RydWN0IGhkbWlfcGxhdGZvcm1fY29uZmlnICpjb25maWcgPSBoZG1pLT5jb25maWc7CisJaW50IGksIHJldDsKKworCS8qIFRPRE8gZG8gd2UgbmVlZCB0byB3YWl0IGZvciBmaW5hbCB2Ymxhbmsgc29tZXdoZXJlIGJlZm9yZQorCSAqIGN1dHRpbmcgdGhlIGNsb2Nrcz8KKwkgKi8KKwltZGVsYXkoMTYgKyA0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnB3cl9jbGtfY250OyBpKyspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZG1pLT5wd3JfY2xrc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5wd3JfcmVnX2NudDsgaSsrKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGhkbWktPnB3cl9yZWdzW2ldKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIHB3ciByZWd1bGF0b3I6ICVzICglZClcbiIsCisJCQkJCWNvbmZpZy0+cHdyX3JlZ19uYW1lc1tpXSwgcmV0KTsKKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgaGRtaV9icmlkZ2VfcHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQogewogCXN0cnVjdCBoZG1pX2JyaWRnZSAqaGRtaV9icmlkZ2UgPSB0b19oZG1pX2JyaWRnZShicmlkZ2UpOwpAQCAtNDEsNiArMTAxLDEyIEBACiAJc3RydWN0IGhkbWlfcGh5ICpwaHkgPSBoZG1pLT5waHk7CiAKIAlEQkcoInBvd2VyIHVwIik7CisKKwlpZiAoIWhkbWlfYnJpZGdlLT5wb3dlcl9vbikgeworCQlwb3dlcl9vbihicmlkZ2UpOworCQloZG1pX2JyaWRnZS0+cG93ZXJfb24gPSB0cnVlOworCX0KKwogCXBoeS0+ZnVuY3MtPnBvd2VydXAocGh5LCBoZG1pX2JyaWRnZS0+cGl4Y2xvY2spOwogCWhkbWlfc2V0X21vZGUoaGRtaSwgdHJ1ZSk7CiB9CkBAIC02Miw2ICsxMjgsMTEgQEAKIAlEQkcoInBvd2VyIGRvd24iKTsKIAloZG1pX3NldF9tb2RlKGhkbWksIGZhbHNlKTsKIAlwaHktPmZ1bmNzLT5wb3dlcmRvd24ocGh5KTsKKworCWlmIChoZG1pX2JyaWRnZS0+cG93ZXJfb24pIHsKKwkJcG93ZXJfb2ZmKGJyaWRnZSk7CisJCWhkbWlfYnJpZGdlLT5wb3dlcl9vbiA9IGZhbHNlOworCX0KIH0KIAogc3RhdGljIHZvaWQgaGRtaV9icmlkZ2VfbW9kZV9zZXQoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKaW5kZXggODIzZWVlNS4uN2RlZGZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMKQEAgLTE3LDE5ICsxNywyMCBAQAogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCisjaW5jbHVkZSAibXNtX2ttcy5oIgogI2luY2x1ZGUgImhkbWkuaCIKIAogc3RydWN0IGhkbWlfY29ubmVjdG9yIHsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBiYXNlOwogCXN0cnVjdCBoZG1pICpoZG1pOworCXN0cnVjdCB3b3JrX3N0cnVjdCBocGRfd29yazsKIH07CiAjZGVmaW5lIHRvX2hkbWlfY29ubmVjdG9yKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaGRtaV9jb25uZWN0b3IsIGJhc2UpCiAKIHN0YXRpYyBpbnQgZ3Bpb19jb25maWcoc3RydWN0IGhkbWkgKmhkbWksIGJvb2wgb24pCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGhkbWktPmRldjsKLQlzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9Ci0JCQloZG1pLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKIAlpbnQgcmV0OwogCiAJaWYgKG9uKSB7CkBAIC0zOSwyNiArNDAsNDMgQEAKIAkJCQkiSERNSV9ERENfQ0xLIiwgY29uZmlnLT5kZGNfY2xrX2dwaW8sIHJldCk7CiAJCQlnb3RvIGVycm9yMTsKIAkJfQorCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChjb25maWctPmRkY19jbGtfZ3BpbywgMSk7CisKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNvbmZpZy0+ZGRjX2RhdGFfZ3BpbywgIkhETUlfRERDX0RBVEEiKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmRldiwgIiclcycoJWQpIGdwaW9fcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAogCQkJCSJIRE1JX0REQ19EQVRBIiwgY29uZmlnLT5kZGNfZGF0YV9ncGlvLCByZXQpOwogCQkJZ290byBlcnJvcjI7CiAJCX0KKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoY29uZmlnLT5kZGNfZGF0YV9ncGlvLCAxKTsKKwogCQlyZXQgPSBncGlvX3JlcXVlc3QoY29uZmlnLT5ocGRfZ3BpbywgIkhETUlfSFBEIik7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LT5kZXYsICInJXMnKCVkKSBncGlvX3JlcXVlc3QgZmFpbGVkOiAlZFxuIiwKIAkJCQkiSERNSV9IUEQiLCBjb25maWctPmhwZF9ncGlvLCByZXQpOwogCQkJZ290byBlcnJvcjM7CiAJCX0KLQkJaWYgKGNvbmZpZy0+cG1pY19ncGlvICE9IC0xKSB7Ci0JCQlyZXQgPSBncGlvX3JlcXVlc3QoY29uZmlnLT5wbWljX2dwaW8sICJQTUlDX0hETUlfTVVYX1NFTCIpOworCQlncGlvX2RpcmVjdGlvbl9pbnB1dChjb25maWctPmhwZF9ncGlvKTsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoY29uZmlnLT5ocGRfZ3BpbywgMSk7CisKKwkJaWYgKGNvbmZpZy0+bXV4X2VuX2dwaW8gIT0gLTEpIHsKKwkJCXJldCA9IGdwaW9fcmVxdWVzdChjb25maWctPm11eF9lbl9ncGlvLCAiSERNSV9NVVhfRU4iKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiJyVzJyglZCkgZ3Bpb19yZXF1ZXN0IGZhaWxlZDogJWRcbiIsCi0JCQkJCSJQTUlDX0hETUlfTVVYX1NFTCIsIGNvbmZpZy0+cG1pY19ncGlvLCByZXQpOworCQkJCQkiSERNSV9NVVhfU0VMIiwgY29uZmlnLT5tdXhfZW5fZ3BpbywgcmV0KTsKIAkJCQlnb3RvIGVycm9yNDsKIAkJCX0KLQkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGNvbmZpZy0+cG1pY19ncGlvLCAwKTsKKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGNvbmZpZy0+bXV4X2VuX2dwaW8sIDEpOworCQl9CisKKwkJaWYgKGNvbmZpZy0+bXV4X3NlbF9ncGlvICE9IC0xKSB7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QoY29uZmlnLT5tdXhfc2VsX2dwaW8sICJIRE1JX01VWF9TRUwiKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiJyVzJyglZCkgZ3Bpb19yZXF1ZXN0IGZhaWxlZDogJWRcbiIsCisJCQkJCSJIRE1JX01VWF9TRUwiLCBjb25maWctPm11eF9zZWxfZ3BpbywgcmV0KTsKKwkJCQlnb3RvIGVycm9yNTsKKwkJCX0KKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGNvbmZpZy0+bXV4X3NlbF9ncGlvLCAwKTsKIAkJfQogCQlEQkcoImdwaW8gb24iKTsKIAl9IGVsc2UgewpAQCAtNjYsMTUgKzg0LDIzIEBACiAJCWdwaW9fZnJlZShjb25maWctPmRkY19kYXRhX2dwaW8pOwogCQlncGlvX2ZyZWUoY29uZmlnLT5ocGRfZ3Bpbyk7CiAKLQkJaWYgKGNvbmZpZy0+cG1pY19ncGlvICE9IC0xKSB7Ci0JCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChjb25maWctPnBtaWNfZ3BpbywgMSk7Ci0JCQlncGlvX2ZyZWUoY29uZmlnLT5wbWljX2dwaW8pOworCQlpZiAoY29uZmlnLT5tdXhfZW5fZ3BpbyAhPSAtMSkgeworCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoY29uZmlnLT5tdXhfZW5fZ3BpbywgMCk7CisJCQlncGlvX2ZyZWUoY29uZmlnLT5tdXhfZW5fZ3Bpbyk7CisJCX0KKworCQlpZiAoY29uZmlnLT5tdXhfc2VsX2dwaW8gIT0gLTEpIHsKKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGNvbmZpZy0+bXV4X3NlbF9ncGlvLCAxKTsKKwkJCWdwaW9fZnJlZShjb25maWctPm11eF9zZWxfZ3Bpbyk7CiAJCX0KIAkJREJHKCJncGlvIG9mZiIpOwogCX0KIAogCXJldHVybiAwOwogCitlcnJvcjU6CisJaWYgKGNvbmZpZy0+bXV4X2VuX2dwaW8gIT0gLTEpCisJCWdwaW9fZnJlZShjb25maWctPm11eF9lbl9ncGlvKTsKIGVycm9yNDoKIAlncGlvX2ZyZWUoY29uZmlnLT5ocGRfZ3Bpbyk7CiBlcnJvcjM6CkBAIC04OCwxMCArMTE0LDExIEBACiBzdGF0aWMgaW50IGhwZF9lbmFibGUoc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkbWlfY29ubmVjdG9yLT5oZG1pOworCWNvbnN0IHN0cnVjdCBoZG1pX3BsYXRmb3JtX2NvbmZpZyAqY29uZmlnID0gaGRtaS0+Y29uZmlnOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZG1pX2Nvbm5lY3Rvci0+YmFzZS5kZXY7CiAJc3RydWN0IGhkbWlfcGh5ICpwaHkgPSBoZG1pLT5waHk7CiAJdWludDMyX3QgaHBkX2N0cmw7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJcmV0ID0gZ3Bpb19jb25maWcoaGRtaSwgdHJ1ZSk7CiAJaWYgKHJldCkgewpAQCAtOTksMzEgKzEyNiwyMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhkbWktPmNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAnY2xrJzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ocGRfY2xrX2NudDsgaSsrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShoZG1pLT5ocGRfY2xrc1tpXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGhwZCBjbGs6ICVzICglZClcbiIsCisJCQkJCWNvbmZpZy0+aHBkX2Nsa19uYW1lc1tpXSwgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQogCX0KIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShoZG1pLT5tX3BjbGspOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJ21fcGNsayc6ICVkXG4iLCByZXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhkbWktPnNfcGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAnc19wY2xrJzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoaGRtaS0+bXBwMCkKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShoZG1pLT5tcHAwKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShoZG1pLT5tdnMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yczogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ocGRfcmVnX2NudDsgaSsrKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoaGRtaS0+aHBkX3JlZ3NbaV0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBocGQgcmVndWxhdG9yOiAlcyAoJWQpXG4iLAorCQkJCQljb25maWctPmhwZF9yZWdfbmFtZXNbaV0sIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAKIAloZG1pX3NldF9tb2RlKGhkbWksIGZhbHNlKTsKQEAgLTE1NiwyNiArMTc0LDI2IEBACiBzdGF0aWMgaW50IGhkcF9kaXNhYmxlKHN0cnVjdCBoZG1pX2Nvbm5lY3RvciAqaGRtaV9jb25uZWN0b3IpCiB7CiAJc3RydWN0IGhkbWkgKmhkbWkgPSBoZG1pX2Nvbm5lY3Rvci0+aGRtaTsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGRtaV9jb25uZWN0b3ItPmJhc2UuZGV2OwotCWludCByZXQgPSAwOworCWludCBpLCByZXQgPSAwOwogCiAJLyogRGlzYWJsZSBIUEQgaW50ZXJydXB0ICovCiAJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9IUERfSU5UX0NUUkwsIDApOwogCiAJaGRtaV9zZXRfbW9kZShoZG1pLCBmYWxzZSk7CiAKLQlpZiAoaGRtaS0+bXBwMCkKLQkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUoaGRtaS0+bXBwMCk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGhkbWktPm12cyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3JzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmhwZF9yZWdfY250OyBpKyspIHsKKwkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUoaGRtaS0+aHBkX3JlZ3NbaV0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgaHBkIHJlZ3VsYXRvcjogJXMgKCVkKVxuIiwKKwkJCQkJY29uZmlnLT5ocGRfcmVnX25hbWVzW2ldLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CiAJfQogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmNsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPm1fcGNsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPnNfcGNsayk7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+aHBkX2Nsa19jbnQ7IGkrKykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmhwZF9jbGtzW2ldKTsKIAogCXJldCA9IGdwaW9fY29uZmlnKGhkbWksIGZhbHNlKTsKIAlpZiAocmV0KSB7CkBAIC0xODksOSArMjA3LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQKK2hvdHBsdWdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3RvciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGRtaV9jb25uZWN0b3IsIGhwZF93b3JrKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmhkbWlfY29ubmVjdG9yLT5iYXNlOworCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChjb25uZWN0b3ItPmRldik7Cit9CisKIHZvaWQgaGRtaV9jb25uZWN0b3JfaXJxKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3RvciA9IHRvX2hkbWlfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkbWlfY29ubmVjdG9yLT5oZG1pOwogCXVpbnQzMl90IGhwZF9pbnRfc3RhdHVzLCBocGRfaW50X2N0cmw7CiAKQEAgLTIwOSwxMyArMjM3LDEzIEBACiAJCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSFBEX0lOVF9DVFJMLAogCQkJCWhwZF9pbnRfY3RybCB8IEhETUlfSFBEX0lOVF9DVFJMX0lOVF9BQ0spOwogCi0JCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChjb25uZWN0b3ItPmRldik7Ci0KIAkJLyogZGV0ZWN0IGRpc2Nvbm5lY3QgaWYgd2UgYXJlIGNvbm5lY3RlZCBvciB2aXNhIHZlcnNhOiAqLwogCQlocGRfaW50X2N0cmwgPSBIRE1JX0hQRF9JTlRfQ1RSTF9JTlRfRU47CiAJCWlmICghZGV0ZWN0ZWQpCiAJCQlocGRfaW50X2N0cmwgfD0gSERNSV9IUERfSU5UX0NUUkxfSU5UX0NPTk5FQ1Q7CiAJCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfSFBEX0lOVF9DVFJMLCBocGRfaW50X2N0cmwpOworCisJCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZoZG1pX2Nvbm5lY3Rvci0+aHBkX3dvcmspOwogCX0KIH0KIApAQCAtMjI0LDYgKzI1Miw3IEBACiB7CiAJc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3RvciA9IHRvX2hkbWlfY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJc3RydWN0IGhkbWkgKmhkbWkgPSBoZG1pX2Nvbm5lY3Rvci0+aGRtaTsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKIAl1aW50MzJfdCBocGRfaW50X3N0YXR1czsKIAlpbnQgcmV0cnkgPSAyMDsKIApAQCAtMjMzLDYgKzI2MiwxNCBAQAogCSAqIGxldCB0aGF0IHRyaWNrIHVzIGludG8gdGhpbmtpbmcgdGhlIG1vbml0b3IgaXMgZ29uZToKIAkgKi8KIAl3aGlsZSAocmV0cnktLSAmJiAhKGhwZF9pbnRfc3RhdHVzICYgSERNSV9IUERfSU5UX1NUQVRVU19DQUJMRV9ERVRFQ1RFRCkpIHsKKwkJLyogaGRtaSBkZWJvdW5jZSBsb2dpYyBzZWVtcyB0byBnZXQgc3R1Y2sgc29tZXRpbWVzLAorCQkgKiByZWFkIGRpcmVjdGx5IHRoZSBncGlvIHRvIGdldCBhIHNlY29uZCBvcGluaW9uOgorCQkgKi8KKwkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGNvbmZpZy0+aHBkX2dwaW8pKSB7CisJCQlEQkcoImdwaW8gdGVsbHMgdXMgd2UgYXJlIGNvbm5lY3RlZCEiKTsKKwkJCWhwZF9pbnRfc3RhdHVzIHw9IEhETUlfSFBEX0lOVF9TVEFUVVNfQ0FCTEVfREVURUNURUQ7CisJCQlicmVhazsKKwkJfQogCQltZGVsYXkoMTApOwogCQlocGRfaW50X3N0YXR1cyA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IUERfSU5UX1NUQVRVUyk7CiAJCURCRygic3RhdHVzPSUwOHgiLCBocGRfaW50X3N0YXR1cyk7CkBAIC0yODUsNiArMzIyLDggQEAKIAkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJc3RydWN0IGhkbWlfY29ubmVjdG9yICpoZG1pX2Nvbm5lY3RvciA9IHRvX2hkbWlfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGhkbWkgKmhkbWkgPSBoZG1pX2Nvbm5lY3Rvci0+aGRtaTsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBtc21fa21zICprbXMgPSBwcml2LT5rbXM7CiAJbG9uZyBhY3R1YWwsIHJlcXVlc3RlZDsKQEAgLTI5Myw2ICszMzIsMTMgQEAKIAlhY3R1YWwgPSBrbXMtPmZ1bmNzLT5yb3VuZF9waXhjbGsoa21zLAogCQkJcmVxdWVzdGVkLCBoZG1pX2Nvbm5lY3Rvci0+aGRtaS0+ZW5jb2Rlcik7CiAKKwkvKiBmb3IgbWRwNS9hcHE4MDc0LCB3ZSBtYW5hZ2Ugb3VyIG93biBwaXhlbCBjbGsgKGFzIG9wcG9zZWQgdG8KKwkgKiBtZHA0L2R0diBzdHVmZiB3aGVyZSBwaXhlbCBjbGsgaXMgYXNzaWduZWQgdG8gbWRwL2VuY29kZXIKKwkgKiBpbnN0ZWFkKToKKwkgKi8KKwlpZiAoY29uZmlnLT5wd3JfY2xrX2NudCA+IDApCisJCWFjdHVhbCA9IGNsa19yb3VuZF9yYXRlKGhkbWktPnB3cl9jbGtzWzBdLCBhY3R1YWwpOworCiAJREJHKCJyZXF1ZXN0ZWQ9JWxkLCBhY3R1YWw9JWxkIiwgcmVxdWVzdGVkLCBhY3R1YWwpOwogCiAJaWYgKGFjdHVhbCAhPSByZXF1ZXN0ZWQpCkBAIC0zMzUsNiArMzgxLDcgQEAKIAl9CiAKIAloZG1pX2Nvbm5lY3Rvci0+aGRtaSA9IGhkbWlfcmVmZXJlbmNlKGhkbWkpOworCUlOSVRfV09SSygmaGRtaV9jb25uZWN0b3ItPmhwZF93b3JrLCBob3RwbHVnX3dvcmspOwogCiAJY29ubmVjdG9yID0gJmhkbWlfY29ubmVjdG9yLT5iYXNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9waHlfOHg3NC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfcGh5Xzh4NzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZhNmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfcGh5Xzh4NzQuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJoZG1pLmgiCisKK3N0cnVjdCBoZG1pX3BoeV84eDc0IHsKKwlzdHJ1Y3QgaGRtaV9waHkgYmFzZTsKKwlzdHJ1Y3QgaGRtaSAqaGRtaTsKKwl2b2lkIF9faW9tZW0gKm1taW87Cit9OworI2RlZmluZSB0b19oZG1pX3BoeV84eDc0KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaGRtaV9waHlfOHg3NCwgYmFzZSkKKworCitzdGF0aWMgdm9pZCBwaHlfd3JpdGUoc3RydWN0IGhkbWlfcGh5Xzh4NzQgKnBoeSwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJbXNtX3dyaXRlbChkYXRhLCBwaHktPm1taW8gKyByZWcpOworfQorCisvL3N0YXRpYyB1MzIgcGh5X3JlYWQoc3RydWN0IGhkbWlfcGh5Xzh4NzQgKnBoeSwgdTMyIHJlZykKKy8veworLy8JcmV0dXJuIG1zbV9yZWFkbChwaHktPm1taW8gKyByZWcpOworLy99CisKK3N0YXRpYyB2b2lkIGhkbWlfcGh5Xzh4NzRfZGVzdHJveShzdHJ1Y3QgaGRtaV9waHkgKnBoeSkKK3sKKwlzdHJ1Y3QgaGRtaV9waHlfOHg3NCAqcGh5Xzh4NzQgPSB0b19oZG1pX3BoeV84eDc0KHBoeSk7CisJa2ZyZWUocGh5Xzh4NzQpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3BoeV84eDc0X3Jlc2V0KHN0cnVjdCBoZG1pX3BoeSAqcGh5KQoreworCXN0cnVjdCBoZG1pX3BoeV84eDc0ICpwaHlfOHg3NCA9IHRvX2hkbWlfcGh5Xzh4NzQocGh5KTsKKwlzdHJ1Y3QgaGRtaSAqaGRtaSA9IHBoeV84eDc0LT5oZG1pOworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBOT1RFIHRoYXQgSERNSV9QSFlfQ1RMIGlzIGluIGNvcmUgbW1pbywgbm90IHBoeSBtbWlvOiAqLworCisJdmFsID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX1BIWV9DVFJMKTsKKworCWlmICh2YWwgJiBIRE1JX1BIWV9DVFJMX1NXX1JFU0VUX0xPVykgeworCQkvKiBwdWxsIGxvdyAqLworCQloZG1pX3dyaXRlKGhkbWksIFJFR19IRE1JX1BIWV9DVFJMLAorCQkJCXZhbCAmIH5IRE1JX1BIWV9DVFJMX1NXX1JFU0VUKTsKKwl9IGVsc2UgeworCQkvKiBwdWxsIGhpZ2ggKi8KKwkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9QSFlfQ1RSTCwKKwkJCQl2YWwgfCBIRE1JX1BIWV9DVFJMX1NXX1JFU0VUKTsKKwl9CisKKwlpZiAodmFsICYgSERNSV9QSFlfQ1RSTF9TV19SRVNFVF9QTExfTE9XKSB7CisJCS8qIHB1bGwgbG93ICovCisJCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfUEhZX0NUUkwsCisJCQkJdmFsICYgfkhETUlfUEhZX0NUUkxfU1dfUkVTRVRfUExMKTsKKwl9IGVsc2UgeworCQkvKiBwdWxsIGhpZ2ggKi8KKwkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9QSFlfQ1RSTCwKKwkJCQl2YWwgfCBIRE1JX1BIWV9DVFJMX1NXX1JFU0VUX1BMTCk7CisJfQorCisJbXNsZWVwKDEwMCk7CisKKwlpZiAodmFsICYgSERNSV9QSFlfQ1RSTF9TV19SRVNFVF9MT1cpIHsKKwkJLyogcHVsbCBoaWdoICovCisJCWhkbWlfd3JpdGUoaGRtaSwgUkVHX0hETUlfUEhZX0NUUkwsCisJCQkJdmFsIHwgSERNSV9QSFlfQ1RSTF9TV19SRVNFVCk7CisJfSBlbHNlIHsKKwkJLyogcHVsbCBsb3cgKi8KKwkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9QSFlfQ1RSTCwKKwkJCQl2YWwgJiB+SERNSV9QSFlfQ1RSTF9TV19SRVNFVCk7CisJfQorCisJaWYgKHZhbCAmIEhETUlfUEhZX0NUUkxfU1dfUkVTRVRfUExMX0xPVykgeworCQkvKiBwdWxsIGhpZ2ggKi8KKwkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9QSFlfQ1RSTCwKKwkJCQl2YWwgfCBIRE1JX1BIWV9DVFJMX1NXX1JFU0VUX1BMTCk7CisJfSBlbHNlIHsKKwkJLyogcHVsbCBsb3cgKi8KKwkJaGRtaV93cml0ZShoZG1pLCBSRUdfSERNSV9QSFlfQ1RSTCwKKwkJCQl2YWwgJiB+SERNSV9QSFlfQ1RSTF9TV19SRVNFVF9QTEwpOworCX0KK30KKworc3RhdGljIHZvaWQgaGRtaV9waHlfOHg3NF9wb3dlcnVwKHN0cnVjdCBoZG1pX3BoeSAqcGh5LAorCQl1bnNpZ25lZCBsb25nIGludCBwaXhjbG9jaykKK3sKKwlzdHJ1Y3QgaGRtaV9waHlfOHg3NCAqcGh5Xzh4NzQgPSB0b19oZG1pX3BoeV84eDc0KHBoeSk7CisKKwlwaHlfd3JpdGUocGh5Xzh4NzQsIFJFR19IRE1JXzh4NzRfQU5BX0NGRzAsICAgMHgxYik7CisJcGh5X3dyaXRlKHBoeV84eDc0LCBSRUdfSERNSV84eDc0X0FOQV9DRkcxLCAgIDB4ZjIpOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9CSVNUX0NGRzAsICAweDApOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9CSVNUX1BBVE4wLCAweDApOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9CSVNUX1BBVE4xLCAweDApOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9CSVNUX1BBVE4yLCAweDApOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9CSVNUX1BBVE4zLCAweDApOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9QRF9DVFJMMSwgICAweDIwKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV9waHlfOHg3NF9wb3dlcmRvd24oc3RydWN0IGhkbWlfcGh5ICpwaHkpCit7CisJc3RydWN0IGhkbWlfcGh5Xzh4NzQgKnBoeV84eDc0ID0gdG9faGRtaV9waHlfOHg3NChwaHkpOworCXBoeV93cml0ZShwaHlfOHg3NCwgUkVHX0hETUlfOHg3NF9QRF9DVFJMMCwgMHg3Zik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaV9waHlfZnVuY3MgaGRtaV9waHlfOHg3NF9mdW5jcyA9IHsKKwkJLmRlc3Ryb3kgPSBoZG1pX3BoeV84eDc0X2Rlc3Ryb3ksCisJCS5yZXNldCA9IGhkbWlfcGh5Xzh4NzRfcmVzZXQsCisJCS5wb3dlcnVwID0gaGRtaV9waHlfOHg3NF9wb3dlcnVwLAorCQkucG93ZXJkb3duID0gaGRtaV9waHlfOHg3NF9wb3dlcmRvd24sCit9OworCitzdHJ1Y3QgaGRtaV9waHkgKmhkbWlfcGh5Xzh4NzRfaW5pdChzdHJ1Y3QgaGRtaSAqaGRtaSkKK3sKKwlzdHJ1Y3QgaGRtaV9waHlfOHg3NCAqcGh5Xzh4NzQ7CisJc3RydWN0IGhkbWlfcGh5ICpwaHkgPSBOVUxMOworCWludCByZXQ7CisKKwlwaHlfOHg3NCA9IGt6YWxsb2Moc2l6ZW9mKCpwaHlfOHg3NCksIEdGUF9LRVJORUwpOworCWlmICghcGh5Xzh4NzQpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCXBoeSA9ICZwaHlfOHg3NC0+YmFzZTsKKworCXBoeS0+ZnVuY3MgPSAmaGRtaV9waHlfOHg3NF9mdW5jczsKKworCXBoeV84eDc0LT5oZG1pID0gaGRtaTsKKworCS8qIGZvciA4eDc0LCB0aGUgcGh5IG1taW8gaXMgbWFwcGVkIHNlcGFyYXRlbHk6ICovCisJcGh5Xzh4NzQtPm1taW8gPSBtc21faW9yZW1hcChoZG1pLT5wZGV2LAorCQkJInBoeV9waHlzaWNhbCIsICJIRE1JXzh4NzQiKTsKKwlpZiAoSVNfRVJSKHBoeV84eDc0LT5tbWlvKSkgeworCQlyZXQgPSBQVFJfRVJSKHBoeV84eDc0LT5tbWlvKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBwaHk7CisKK2ZhaWw6CisJaWYgKHBoeSkKKwkJaGRtaV9waHlfOHg3NF9kZXN0cm95KHBoeSk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9xZnByb20ueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvcWZwcm9tLnhtbC5oCmluZGV4IGRiZGU0ZjYuLmQ1OTE1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9xZnByb20ueG1sLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL3FmcHJvbS54bWwuaApAQCAtOCwxNCArOCwxNiBAQAogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAogCiBUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6Ci0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNTk1IGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNjQ3IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDU6MzUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcDQvbWRwNC54bWwgICAgICAgICAgICggIDE5MzMyIGJ5dGVzLCBmcm9tIDIwMTMtMTAtMDcgMTY6MzY6NDgpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA0LnhtbCAgICAgICAgICAgICggIDE3OTk2IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTk6MTA6MzEpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHBfY29tbW9uLnhtbCAgICAgICggICAxNjE1IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDA6NTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA1LnhtbCAgICAgICAgICAgICggIDIyNTE3IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDMgMjA6NTk6MTMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9kc2kueG1sICAgICAgICAgICAgICggIDExNzEyIGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTcgMTc6MTM6NDMpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9zZnBiLnhtbCAgICAgICAgICAgICggICAgMzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTk6MjY6MzIpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9tbXNzX2NjLnhtbCAgICAgICAgICggICAxNTQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTYgMTk6MTc6MDUpCiAtIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvcWZwcm9tLnhtbCAgICAgICAgICggICAgNjAwIGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCi0tIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDE5Mjg4IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTg6MTQ6MTUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDIwOTMyIGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTU6MTM6MDQpCiAKIENvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CiAtIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDQueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDQueG1sLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDQueG1sLmgKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDQvbWRwNC54bWwuaAppbmRleCA5OTA4ZmZlLi40MTZhMjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNC54bWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDQueG1sLmgKQEAgLTgsMTQgKzgsMTYgQEAKIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZnJlZWRyZW5vL2Vudnl0b29scy5naXQKIAogVGhlIHJ1bGVzLW5nLW5nIHNvdXJjZSBmaWxlcyB0aGlzIGhlYWRlciB3YXMgZ2VuZXJhdGVkIGZyb20gYXJlOgotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tc20ueG1sICAgICAgICAgICAgICAgICAoICAgIDU5NSBieXRlcywgZnJvbSAyMDEzLTA3LTA1IDE5OjIxOjEyKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tc20ueG1sICAgICAgICAgICAgICAgICAoICAgIDY0NyBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE0OjQ1OjM1KQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9mcmVlZHJlbm9fY29weXJpZ2h0LnhtbCAoICAgMTQ1MyBieXRlcywgZnJvbSAyMDEzLTAzLTMxIDE2OjUxOjI3KQotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHA0L21kcDQueG1sICAgICAgICAgICAoICAxOTMzMiBieXRlcywgZnJvbSAyMDEzLTEwLTA3IDE2OjM2OjQ4KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwNC54bWwgICAgICAgICAgICAoICAxNzk5NiBieXRlcywgZnJvbSAyMDEzLTEyLTAxIDE5OjEwOjMxKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwX2NvbW1vbi54bWwgICAgICAoICAgMTYxNSBieXRlcywgZnJvbSAyMDEzLTExLTMwIDE1OjAwOjUyKQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9tZHAvbWRwNS54bWwgICAgICAgICAgICAoICAyMjUxNyBieXRlcywgZnJvbSAyMDEzLTEyLTAzIDIwOjU5OjEzKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvZHNpLnhtbCAgICAgICAgICAgICAoICAxMTcxMiBieXRlcywgZnJvbSAyMDEzLTA4LTE3IDE3OjEzOjQzKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvc2ZwYi54bWwgICAgICAgICAgICAoICAgIDM0NCBieXRlcywgZnJvbSAyMDEzLTA4LTExIDE5OjI2OjMyKQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9kc2kvbW1zc19jYy54bWwgICAgICAgICAoICAgMTU0NCBieXRlcywgZnJvbSAyMDEzLTA4LTE2IDE5OjE3OjA1KQogLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL3FmcHJvbS54bWwgICAgICAgICAoICAgIDYwMCBieXRlcywgZnJvbSAyMDEzLTA3LTA1IDE5OjIxOjEyKQotLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL2hkbWkueG1sICAgICAgICAgICAoICAxOTI4OCBieXRlcywgZnJvbSAyMDEzLTA4LTExIDE4OjE0OjE1KQorLSAvaG9tZS9yb2JjbGFyay9zcmMvZnJlZWRyZW5vL2Vudnl0b29scy9ybm5kYi9oZG1pL2hkbWkueG1sICAgICAgICAgICAoICAyMDkzMiBieXRlcywgZnJvbSAyMDEzLTEyLTAxIDE1OjEzOjA0KQogCiBDb3B5cmlnaHQgKEMpIDIwMTMgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgogLSBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+IChyb2JjbGFyaykKQEAgLTQyLDI3ICs0NCw2IEBACiAqLwogCiAKLWVudW0gbWRwNF9icGMgewotCUJQQzEgPSAwLAotCUJQQzUgPSAxLAotCUJQQzYgPSAyLAotCUJQQzggPSAzLAotfTsKLQotZW51bSBtZHA0X2JwY19hbHBoYSB7Ci0JQlBDMUEgPSAwLAotCUJQQzRBID0gMSwKLQlCUEM2QSA9IDIsCi0JQlBDOEEgPSAzLAotfTsKLQotZW51bSBtZHA0X2FscGhhX3R5cGUgewotCUZHX0NPTlNUID0gMCwKLQlCR19DT05TVCA9IDEsCi0JRkdfUElYRUwgPSAyLAotCUJHX1BJWEVMID0gMywKLX07Ci0KIGVudW0gbWRwNF9waXBlIHsKIAlWRzEgPSAwLAogCVZHMiA9IDEsCkBAIC03OSwxNSArNjAsNiBAQAogCU1JWEVSMiA9IDIsCiB9OwogCi1lbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgewotCVNUQUdFX1VOVVNFRCA9IDAsCi0JU1RBR0VfQkFTRSA9IDEsCi0JU1RBR0UwID0gMiwKLQlTVEFHRTEgPSAzLAotCVNUQUdFMiA9IDQsCi0JU1RBR0UzID0gNSwKLX07Ci0KIGVudW0gbWRwNF9pbnRmIHsKIAlJTlRGX0xDRENfRFRWID0gMCwKIAlJTlRGX0RTSV9WSURFTyA9IDEsCkBAIC0xOTQsNTYgKzE2Niw1NiBAQAogI2RlZmluZSBSRUdfTURQNF9MQVlFUk1JWEVSMl9JTl9DRkcJCQkJMHgwMDAxMDBmMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMF9fTUFTSwkJCTB4MDAwMDAwMDcKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTBfX1NISUZUCQkJMAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMChlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMChlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMF9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTBfX01BU0s7CiB9CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUwX01JWEVSMQkJCTB4MDAwMDAwMDgKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTFfX01BU0sJCQkweDAwMDAwMDcwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUxX19TSElGVAkJCTQKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTEoZW51bSBtZHA0X21peGVyX3N0YWdlX2lkIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTEoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTFfX1NISUZUKSAmIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUxX19NQVNLOwogfQogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMV9NSVhFUjEJCQkweDAwMDAwMDgwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUyX19NQVNLCQkJMHgwMDAwMDcwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMl9fU0hJRlQJCQk4Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUyKGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUyKGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKIHsKIAlyZXR1cm4gKCh2YWwpIDw8IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUyX19TSElGVCkgJiBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFMl9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTJfTUlYRVIxCQkJMHgwMDAwMDgwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFM19fTUFTSwkJCTB4MDAwMDcwMDAKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTNfX1NISUZUCQkJMTIKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTMoZW51bSBtZHA0X21peGVyX3N0YWdlX2lkIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTMoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTNfX1NISUZUKSAmIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEUzX19NQVNLOwogfQogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFM19NSVhFUjEJCQkweDAwMDA4MDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU0X19NQVNLCQkJMHgwMDA3MDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNF9fU0hJRlQJCQkxNgotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNChlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNChlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNF9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTRfX01BU0s7CiB9CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU0X01JWEVSMQkJCTB4MDAwODAwMDAKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTVfX01BU0sJCQkweDAwNzAwMDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU1X19TSElGVAkJCTIwCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU1KGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU1KGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKIHsKIAlyZXR1cm4gKCh2YWwpIDw8IE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU1X19TSElGVCkgJiBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNV9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTVfTUlYRVIxCQkJMHgwMDgwMDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNl9fTUFTSwkJCTB4MDcwMDAwMDAKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTZfX1NISUZUCQkJMjQKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTYoZW51bSBtZHA0X21peGVyX3N0YWdlX2lkIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTYoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTZfX1NISUZUKSAmIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU2X19NQVNLOwogfQogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNl9NSVhFUjEJCQkweDA4MDAwMDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUjJfSU5fQ0ZHX1BJUEU3X19NQVNLCQkJMHg3MDAwMDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFN19fU0hJRlQJCQkyOAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNyhlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFNyhlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0xBWUVSTUlYRVIyX0lOX0NGR19QSVBFN19fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSMl9JTl9DRkdfUElQRTdfX01BU0s7CiB9CkBAIC0yNTQsNTYgKzIyNiw1NiBAQAogI2RlZmluZSBSRUdfTURQNF9MQVlFUk1JWEVSX0lOX0NGRwkJCQkweDAwMDEwMTAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTBfX01BU0sJCQkweDAwMDAwMDA3CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTBfX1NISUZUCQkJMAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEUwKGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTAoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMF9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMF9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMF9NSVhFUjEJCQkweDAwMDAwMDA4CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTFfX01BU0sJCQkweDAwMDAwMDcwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTFfX1NISUZUCQkJNAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEUxKGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTEoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMV9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMV9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMV9NSVhFUjEJCQkweDAwMDAwMDgwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTJfX01BU0sJCQkweDAwMDAwNzAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTJfX1NISUZUCQkJOAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEUyKGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTIoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMl9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMl9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMl9NSVhFUjEJCQkweDAwMDAwODAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTNfX01BU0sJCQkweDAwMDA3MDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTNfX1NISUZUCQkJMTIKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFMyhlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEUzKGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKIHsKIAlyZXR1cm4gKCh2YWwpIDw8IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTNfX1NISUZUKSAmIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTNfX01BU0s7CiB9CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTNfTUlYRVIxCQkJMHgwMDAwODAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU0X19NQVNLCQkJMHgwMDA3MDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU0X19TSElGVAkJCTE2Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTQoZW51bSBtZHA0X21peGVyX3N0YWdlX2lkIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNChlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU0X19TSElGVCkgJiBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU0X19NQVNLOwogfQogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU0X01JWEVSMQkJCTB4MDAwODAwMDAKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNV9fTUFTSwkJCTB4MDA3MDAwMDAKICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNV9fU0hJRlQJCQkyMAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU1KGVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTUoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNV9fU0hJRlQpICYgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNV9fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNV9NSVhFUjEJCQkweDAwODAwMDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTZfX01BU0sJCQkweDA3MDAwMDAwCiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTZfX1NISUZUCQkJMjQKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNihlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU2KGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKIHsKIAlyZXR1cm4gKCh2YWwpIDw8IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTZfX1NISUZUKSAmIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTZfX01BU0s7CiB9CiAjZGVmaW5lIE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTZfTUlYRVIxCQkJMHgwODAwMDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU3X19NQVNLCQkJMHg3MDAwMDAwMAogI2RlZmluZSBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU3X19TSElGVAkJCTI4Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfTEFZRVJNSVhFUl9JTl9DRkdfUElQRTcoZW51bSBtZHA0X21peGVyX3N0YWdlX2lkIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9MQVlFUk1JWEVSX0lOX0NGR19QSVBFNyhlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU3X19TSElGVCkgJiBNRFA0X0xBWUVSTUlYRVJfSU5fQ0ZHX1BJUEU3X19NQVNLOwogfQpAQCAtMzY5LDcgKzM0MSw3IEBACiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA0X09WTFBfU1RBR0VfT1AodWludDMyX3QgaTAsIHVpbnQzMl90IGkxKSB7IHJldHVybiAweDAwMDAwMDAwICsgX19vZmZzZXRfT1ZMUChpMCkgKyBfX29mZnNldF9TVEFHRShpMSk7IH0KICNkZWZpbmUgTURQNF9PVkxQX1NUQUdFX09QX0ZHX0FMUEhBX19NQVNLCQkJMHgwMDAwMDAwMwogI2RlZmluZSBNRFA0X09WTFBfU1RBR0VfT1BfRkdfQUxQSEFfX1NISUZUCQkJMAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X09WTFBfU1RBR0VfT1BfRkdfQUxQSEEoZW51bSBtZHA0X2FscGhhX3R5cGUgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X09WTFBfU1RBR0VfT1BfRkdfQUxQSEEoZW51bSBtZHBfYWxwaGFfdHlwZSB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X09WTFBfU1RBR0VfT1BfRkdfQUxQSEFfX1NISUZUKSAmIE1EUDRfT1ZMUF9TVEFHRV9PUF9GR19BTFBIQV9fTUFTSzsKIH0KQEAgLTM3Nyw3ICszNDksNyBAQAogI2RlZmluZSBNRFA0X09WTFBfU1RBR0VfT1BfRkdfTU9EX0FMUEhBCQkJCTB4MDAwMDAwMDgKICNkZWZpbmUgTURQNF9PVkxQX1NUQUdFX09QX0JHX0FMUEhBX19NQVNLCQkJMHgwMDAwMDAzMAogI2RlZmluZSBNRFA0X09WTFBfU1RBR0VfT1BfQkdfQUxQSEFfX1NISUZUCQkJNAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X09WTFBfU1RBR0VfT1BfQkdfQUxQSEEoZW51bSBtZHA0X2FscGhhX3R5cGUgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X09WTFBfU1RBR0VfT1BfQkdfQUxQSEEoZW51bSBtZHBfYWxwaGFfdHlwZSB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X09WTFBfU1RBR0VfT1BfQkdfQUxQSEFfX1NISUZUKSAmIE1EUDRfT1ZMUF9TVEFHRV9PUF9CR19BTFBIQV9fTUFTSzsKIH0KQEAgLTQ3MiwxOSArNDQ0LDE5IEBACiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA0X0RNQV9DT05GSUcoZW51bSBtZHA0X2RtYSBpMCkgeyByZXR1cm4gMHgwMDAwMDAwMCArIF9fb2Zmc2V0X0RNQShpMCk7IH0KICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX0dfQlBDX19NQVNLCQkJCTB4MDAwMDAwMDMKICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX0dfQlBDX19TSElGVAkJCQkwCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfRE1BX0NPTkZJR19HX0JQQyhlbnVtIG1kcDRfYnBjIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9ETUFfQ09ORklHX0dfQlBDKGVudW0gbWRwX2JwYyB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0RNQV9DT05GSUdfR19CUENfX1NISUZUKSAmIE1EUDRfRE1BX0NPTkZJR19HX0JQQ19fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX0JfQlBDX19NQVNLCQkJCTB4MDAwMDAwMGMKICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX0JfQlBDX19TSElGVAkJCQkyCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfRE1BX0NPTkZJR19CX0JQQyhlbnVtIG1kcDRfYnBjIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9ETUFfQ09ORklHX0JfQlBDKGVudW0gbWRwX2JwYyB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0RNQV9DT05GSUdfQl9CUENfX1NISUZUKSAmIE1EUDRfRE1BX0NPTkZJR19CX0JQQ19fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX1JfQlBDX19NQVNLCQkJCTB4MDAwMDAwMzAKICNkZWZpbmUgTURQNF9ETUFfQ09ORklHX1JfQlBDX19TSElGVAkJCQk0Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfRE1BX0NPTkZJR19SX0JQQyhlbnVtIG1kcDRfYnBjIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9ETUFfQ09ORklHX1JfQlBDKGVudW0gbWRwX2JwYyB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X0RNQV9DT05GSUdfUl9CUENfX1NISUZUKSAmIE1EUDRfRE1BX0NPTkZJR19SX0JQQ19fTUFTSzsKIH0KQEAgLTcxMCwyNSArNjgyLDI1IEBACiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA0X1BJUEVfU1JDX0ZPUk1BVChlbnVtIG1kcDRfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAyMDA1MCArIDB4MTAwMDAqaTA7IH0KICNkZWZpbmUgTURQNF9QSVBFX1NSQ19GT1JNQVRfR19CUENfX01BU0sJCQkweDAwMDAwMDAzCiAjZGVmaW5lIE1EUDRfUElQRV9TUkNfRk9STUFUX0dfQlBDX19TSElGVAkJCTAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9QSVBFX1NSQ19GT1JNQVRfR19CUEMoZW51bSBtZHA0X2JwYyB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfUElQRV9TUkNfRk9STUFUX0dfQlBDKGVudW0gbWRwX2JwYyB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9HX0JQQ19fU0hJRlQpICYgTURQNF9QSVBFX1NSQ19GT1JNQVRfR19CUENfX01BU0s7CiB9CiAjZGVmaW5lIE1EUDRfUElQRV9TUkNfRk9STUFUX0JfQlBDX19NQVNLCQkJMHgwMDAwMDAwYwogI2RlZmluZSBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9CX0JQQ19fU0hJRlQJCQkyCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfUElQRV9TUkNfRk9STUFUX0JfQlBDKGVudW0gbWRwNF9icGMgdmFsKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9CX0JQQyhlbnVtIG1kcF9icGMgdmFsKQogewogCXJldHVybiAoKHZhbCkgPDwgTURQNF9QSVBFX1NSQ19GT1JNQVRfQl9CUENfX1NISUZUKSAmIE1EUDRfUElQRV9TUkNfRk9STUFUX0JfQlBDX19NQVNLOwogfQogI2RlZmluZSBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQ19fTUFTSwkJCTB4MDAwMDAwMzAKICNkZWZpbmUgTURQNF9QSVBFX1NSQ19GT1JNQVRfUl9CUENfX1NISUZUCQkJNAotc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQyhlbnVtIG1kcDRfYnBjIHZhbCkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9QSVBFX1NSQ19GT1JNQVRfUl9CUEMoZW51bSBtZHBfYnBjIHZhbCkKIHsKIAlyZXR1cm4gKCh2YWwpIDw8IE1EUDRfUElQRV9TUkNfRk9STUFUX1JfQlBDX19TSElGVCkgJiBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQ19fTUFTSzsKIH0KICNkZWZpbmUgTURQNF9QSVBFX1NSQ19GT1JNQVRfQV9CUENfX01BU0sJCQkweDAwMDAwMGMwCiAjZGVmaW5lIE1EUDRfUElQRV9TUkNfRk9STUFUX0FfQlBDX19TSElGVAkJCTYKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNF9QSVBFX1NSQ19GT1JNQVRfQV9CUEMoZW51bSBtZHA0X2JwY19hbHBoYSB2YWwpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDRfUElQRV9TUkNfRk9STUFUX0FfQlBDKGVudW0gbWRwX2JwY19hbHBoYSB2YWwpCiB7CiAJcmV0dXJuICgodmFsKSA8PCBNRFA0X1BJUEVfU1JDX0ZPUk1BVF9BX0JQQ19fU0hJRlQpICYgTURQNF9QSVBFX1NSQ19GT1JNQVRfQV9CUENfX01BU0s7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfY3J0Yy5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZ3B1L2RybS9tc20vbWRwNC9tZHA0X2NydGMuYwpyZW5hbWUgdG8gZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2NydGMuYwppbmRleCAwMTlkNTMwLi4xOTY0ZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2NydGMuYwpAQCAtNjYsMTUgKzY2LDE1IEBACiAJLyogZm9yIHVucmVmJ2luZyBjdXJzb3IgYm8ncyBhZnRlciBzY2Fub3V0IGNvbXBsZXRlczogKi8KIAlzdHJ1Y3QgZHJtX2ZsaXBfd29yayB1bnJlZl9jdXJzb3Jfd29yazsKIAotCXN0cnVjdCBtZHA0X2lycSB2Ymxhbms7Ci0Jc3RydWN0IG1kcDRfaXJxIGVycjsKKwlzdHJ1Y3QgbWRwX2lycSB2Ymxhbms7CisJc3RydWN0IG1kcF9pcnEgZXJyOwogfTsKICNkZWZpbmUgdG9fbWRwNF9jcnRjKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgbWRwNF9jcnRjLCBiYXNlKQogCiBzdGF0aWMgc3RydWN0IG1kcDRfa21zICpnZXRfa21zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlyZXR1cm4gdG9fbWRwNF9rbXMocHJpdi0+a21zKTsKKwlyZXR1cm4gdG9fbWRwNF9rbXModG9fbWRwX2ttcyhwcml2LT5rbXMpKTsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2ZiKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgYm9vbCBhc3luYywKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWlmICghYXN5bmMpIHsKIAkJLyogZW5hYmxlIHZibGFuayB0byBwaWNrIHVwIHRoZSBvbGRfZmIgKi8KLQkJbWRwNF9pcnFfcmVnaXN0ZXIoZ2V0X2ttcyhjcnRjKSwgJm1kcDRfY3J0Yy0+dmJsYW5rKTsKKwkJbWRwX2lycV9yZWdpc3RlcigmZ2V0X2ttcyhjcnRjKS0+YmFzZSwgJm1kcDRfY3J0Yy0+dmJsYW5rKTsKIAl9CiB9CiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogCXN0cnVjdCBtZHA0X2NydGMgKm1kcDRfY3J0YyA9IHRvX21kcDRfY3J0YyhjcnRjKTsKIAogCWF0b21pY19vcihwZW5kaW5nLCAmbWRwNF9jcnRjLT5wZW5kaW5nKTsKLQltZHA0X2lycV9yZWdpc3RlcihnZXRfa21zKGNydGMpLCAmbWRwNF9jcnRjLT52YmxhbmspOworCW1kcF9pcnFfcmVnaXN0ZXIoJmdldF9rbXMoY3J0YyktPmJhc2UsICZtZHA0X2NydGMtPnZibGFuayk7CiB9CiAKIHN0YXRpYyB2b2lkIHBhZ2VmbGlwX2NiKHN0cnVjdCBtc21fZmVuY2VfY2IgKmNiKQpAQCAtMjEwLDkgKzIxMCw5IEBACiAJaWYgKGVuYWJsZWQgIT0gbWRwNF9jcnRjLT5lbmFibGVkKSB7CiAJCWlmIChlbmFibGVkKSB7CiAJCQltZHA0X2VuYWJsZShtZHA0X2ttcyk7Ci0JCQltZHA0X2lycV9yZWdpc3RlcihtZHA0X2ttcywgJm1kcDRfY3J0Yy0+ZXJyKTsKKwkJCW1kcF9pcnFfcmVnaXN0ZXIoJm1kcDRfa21zLT5iYXNlLCAmbWRwNF9jcnRjLT5lcnIpOwogCQl9IGVsc2UgewotCQkJbWRwNF9pcnFfdW5yZWdpc3RlcihtZHA0X2ttcywgJm1kcDRfY3J0Yy0+ZXJyKTsKKwkJCW1kcF9pcnFfdW5yZWdpc3RlcigmbWRwNF9rbXMtPmJhc2UsICZtZHA0X2NydGMtPmVycik7CiAJCQltZHA0X2Rpc2FibGUobWRwNF9rbXMpOwogCQl9CiAJCW1kcDRfY3J0Yy0+ZW5hYmxlZCA9IGVuYWJsZWQ7CkBAIC0yMzIsNyArMjMyLDcgQEAKIAlzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zID0gZ2V0X2ttcyhjcnRjKTsKIAlpbnQgaSwgb3ZscCA9IG1kcDRfY3J0Yy0+b3ZscDsKIAl1aW50MzJfdCBtaXhlcl9jZmcgPSAwOwotCXN0YXRpYyBjb25zdCBlbnVtIG1kcDRfbWl4ZXJfc3RhZ2VfaWQgc3RhZ2VzW10gPSB7CisJc3RhdGljIGNvbnN0IGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHN0YWdlc1tdID0gewogCQkJU1RBR0VfQkFTRSwgU1RBR0UwLCBTVEFHRTEsIFNUQUdFMiwgU1RBR0UzLAogCX07CiAJLyogc3RhdGljYWxseSAoZm9yIG5vdykgbWFwIHBsYW5lcyB0byBtaXhlciBzdGFnZSAoei1vcmRlcik6ICovCkBAIC0yNjIsOCArMjYyLDggQEAKIAkJCWVudW0gbWRwNF9waXBlIHBpcGVfaWQgPSBtZHA0X3BsYW5lX3BpcGUocGxhbmUpOwogCQkJaW50IGlkeCA9IGlkeHNbcGlwZV9pZF07CiAJCQlpZiAoaWR4ID4gMCkgewotCQkJCWNvbnN0IHN0cnVjdCBtZHA0X2Zvcm1hdCAqZm9ybWF0ID0KLQkJCQkJdG9fbWRwNF9mb3JtYXQobXNtX2ZyYW1lYnVmZmVyX2Zvcm1hdChwbGFuZS0+ZmIpKTsKKwkJCQljb25zdCBzdHJ1Y3QgbWRwX2Zvcm1hdCAqZm9ybWF0ID0KKwkJCQkJdG9fbWRwX2Zvcm1hdChtc21fZnJhbWVidWZmZXJfZm9ybWF0KHBsYW5lLT5mYikpOwogCQkJCWFscGhhW2lkeC0xXSA9IGZvcm1hdC0+YWxwaGFfZW5hYmxlOwogCQkJfQogCQkJbWl4ZXJfY2ZnIHw9IG1peGVyY2ZnKG1kcDRfY3J0Yy0+bWl4ZXIsIHBpcGVfaWQsIHN0YWdlc1tpZHhdKTsKQEAgLTU3MSwxNCArNTcxLDE0IEBACiAJLmxvYWRfbHV0ID0gbWRwNF9jcnRjX2xvYWRfbHV0LAogfTsKIAotc3RhdGljIHZvaWQgbWRwNF9jcnRjX3ZibGFua19pcnEoc3RydWN0IG1kcDRfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKK3N0YXRpYyB2b2lkIG1kcDRfY3J0Y192YmxhbmtfaXJxKHN0cnVjdCBtZHBfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKIHsKIAlzdHJ1Y3QgbWRwNF9jcnRjICptZHA0X2NydGMgPSBjb250YWluZXJfb2YoaXJxLCBzdHJ1Y3QgbWRwNF9jcnRjLCB2YmxhbmspOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZtZHA0X2NydGMtPmJhc2U7CiAJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgcGVuZGluZzsKIAotCW1kcDRfaXJxX3VucmVnaXN0ZXIoZ2V0X2ttcyhjcnRjKSwgJm1kcDRfY3J0Yy0+dmJsYW5rKTsKKwltZHBfaXJxX3VucmVnaXN0ZXIoJmdldF9rbXMoY3J0YyktPmJhc2UsICZtZHA0X2NydGMtPnZibGFuayk7CiAKIAlwZW5kaW5nID0gYXRvbWljX3hjaGcoJm1kcDRfY3J0Yy0+cGVuZGluZywgMCk7CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbWRwNF9jcnRjX2Vycl9pcnEoc3RydWN0IG1kcDRfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKK3N0YXRpYyB2b2lkIG1kcDRfY3J0Y19lcnJfaXJxKHN0cnVjdCBtZHBfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKIHsKIAlzdHJ1Y3QgbWRwNF9jcnRjICptZHA0X2NydGMgPSBjb250YWluZXJfb2YoaXJxLCBzdHJ1Y3QgbWRwNF9jcnRjLCBlcnIpOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZtZHA0X2NydGMtPmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2R0dl9lbmNvZGVyLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfZHR2X2VuY29kZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2R0dl9lbmNvZGVyLmMKaW5kZXggNWUwZGNhZS4uMDY3ZWQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfZHR2X2VuY29kZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfZHR2X2VuY29kZXIuYwpAQCAtMTUsOCArMTUsNiBAQAogICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotCiAjaW5jbHVkZSAibWRwNF9rbXMuaCIKIAogI2luY2x1ZGUgImRybV9jcnRjLmgiCkBAIC0zNyw3ICszNSw3IEBACiBzdGF0aWMgc3RydWN0IG1kcDRfa21zICpnZXRfa21zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlyZXR1cm4gdG9fbWRwNF9rbXMocHJpdi0+a21zKTsKKwlyZXR1cm4gdG9fbWRwNF9rbXModG9fbWRwX2ttcyhwcml2LT5rbXMpKTsKIH0KIAogI2lmZGVmIENPTkZJR19NU01fQlVTX1NDQUxJTkcKQEAgLTEzOSw3ICsxMzcsNyBAQAogCQkgKiB0aGUgc2V0dGluZ3MgY2hhbmdlcyBmb3IgdGhlIG5ldyBtb2Rlc2V0IChsaWtlIG5ldwogCQkgKiBzY2Fub3V0IGJ1ZmZlcikgZG9uJ3QgbGF0Y2ggcHJvcGVybHkuLgogCQkgKi8KLQkJbWRwNF9pcnFfd2FpdChtZHA0X2ttcywgTURQNF9JUlFfRVhURVJOQUxfVlNZTkMpOworCQltZHBfaXJxX3dhaXQoJm1kcDRfa21zLT5iYXNlLCBNRFA0X0lSUV9FWFRFUk5BTF9WU1lOQyk7CiAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1kcDRfZHR2X2VuY29kZXItPnNyY19jbGspOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUobWRwNF9kdHZfZW5jb2Rlci0+aGRtaV9jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDBjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfaXJxLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworI2luY2x1ZGUgIm1zbV9kcnYuaCIKKyNpbmNsdWRlICJtZHA0X2ttcy5oIgorCit2b2lkIG1kcDRfc2V0X2lycW1hc2soc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMsIHVpbnQzMl90IGlycW1hc2spCit7CisJbWRwNF93cml0ZSh0b19tZHA0X2ttcyhtZHBfa21zKSwgUkVHX01EUDRfSU5UUl9FTkFCTEUsIGlycW1hc2spOworfQorCitzdGF0aWMgdm9pZCBtZHA0X2lycV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBtZHBfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKK3sKKwlEUk1fRVJST1IoImVycm9yczogJTA4eFxuIiwgaXJxc3RhdHVzKTsKK30KKwordm9pZCBtZHA0X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBtc21fa21zICprbXMpCit7CisJc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKHRvX21kcF9rbXMoa21zKSk7CisJbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfSU5UUl9DTEVBUiwgMHhmZmZmZmZmZik7Cit9CisKK2ludCBtZHA0X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKQoreworCXN0cnVjdCBtZHBfa21zICptZHBfa21zID0gdG9fbWRwX2ttcyhrbXMpOworCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhtZHBfa21zKTsKKwlzdHJ1Y3QgbWRwX2lycSAqZXJyb3JfaGFuZGxlciA9ICZtZHA0X2ttcy0+ZXJyb3JfaGFuZGxlcjsKKworCWVycm9yX2hhbmRsZXItPmlycSA9IG1kcDRfaXJxX2Vycm9yX2hhbmRsZXI7CisJZXJyb3JfaGFuZGxlci0+aXJxbWFzayA9IE1EUDRfSVJRX1BSSU1BUllfSU5URl9VREVSUlVOIHwKKwkJCU1EUDRfSVJRX0VYVEVSTkFMX0lOVEZfVURFUlJVTjsKKworCW1kcF9pcnFfcmVnaXN0ZXIobWRwX2ttcywgZXJyb3JfaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZHA0X2lycV91bmluc3RhbGwoc3RydWN0IG1zbV9rbXMgKmttcykKK3sKKwlzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zID0gdG9fbWRwNF9rbXModG9fbWRwX2ttcyhrbXMpKTsKKwltZHA0X3dyaXRlKG1kcDRfa21zLCBSRUdfTURQNF9JTlRSX0VOQUJMRSwgMHgwMDAwMDAwMCk7Cit9CisKK2lycXJldHVybl90IG1kcDRfaXJxKHN0cnVjdCBtc21fa21zICprbXMpCit7CisJc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMgPSB0b19tZHBfa21zKGttcyk7CisJc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKG1kcF9rbXMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtZHA0X2ttcy0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBpZDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtZHA0X3JlYWQobWRwNF9rbXMsIFJFR19NRFA0X0lOVFJfU1RBVFVTKTsKKwltZHA0X3dyaXRlKG1kcDRfa21zLCBSRUdfTURQNF9JTlRSX0NMRUFSLCBzdGF0dXMpOworCisJVkVSQigic3RhdHVzPSUwOHgiLCBzdGF0dXMpOworCisJZm9yIChpZCA9IDA7IGlkIDwgcHJpdi0+bnVtX2NydGNzOyBpZCsrKQorCQlpZiAoc3RhdHVzICYgbWRwNF9jcnRjX3ZibGFuayhwcml2LT5jcnRjc1tpZF0pKQorCQkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBpZCk7CisKKwltZHBfZGlzcGF0Y2hfaXJxcyhtZHBfa21zLCBzdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgbWRwNF9lbmFibGVfdmJsYW5rKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwltZHBfdXBkYXRlX3ZibGFua19tYXNrKHRvX21kcF9rbXMoa21zKSwKKwkJCW1kcDRfY3J0Y192YmxhbmsoY3J0YyksIHRydWUpOworCXJldHVybiAwOworfQorCit2b2lkIG1kcDRfZGlzYWJsZV92Ymxhbmsoc3RydWN0IG1zbV9rbXMgKmttcywgc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCW1kcF91cGRhdGVfdmJsYW5rX21hc2sodG9fbWRwX2ttcyhrbXMpLAorCQkJbWRwNF9jcnRjX3ZibGFuayhjcnRjKSwgZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfa21zLmMKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfa21zLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDQvbWRwNF9rbXMuYwppbmRleCA4OTcyYWMzLi4yNzJlNzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfa21zLmMKQEAgLTE3LDEzICsxNywxNCBAQAogCiAKICNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibXNtX21tdS5oIgogI2luY2x1ZGUgIm1kcDRfa21zLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgbWRwNF9wbGF0Zm9ybV9jb25maWcgKm1kcDRfZ2V0X2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW50IG1kcDRfaHdfaW5pdChzdHJ1Y3QgbXNtX2ttcyAqa21zKQogewotCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhrbXMpOworCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyh0b19tZHBfa21zKGttcykpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtZHA0X2ttcy0+ZGV2OwogCXVpbnQzMl90IHZlcnNpb24sIG1ham9yLCBtaW5vciwgZG1hcF9jZmcsIHZnX2NmZzsKIAl1bnNpZ25lZCBsb25nIGNsazsKQEAgLTMxLDEyICszMiwxNCBAQAogCiAJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7CiAKKwltZHA0X2VuYWJsZShtZHA0X2ttcyk7CiAJdmVyc2lvbiA9IG1kcDRfcmVhZChtZHA0X2ttcywgUkVHX01EUDRfVkVSU0lPTik7CisJbWRwNF9kaXNhYmxlKG1kcDRfa21zKTsKIAogCW1ham9yID0gRklFTEQodmVyc2lvbiwgTURQNF9WRVJTSU9OX01BSk9SKTsKIAltaW5vciA9IEZJRUxEKHZlcnNpb24sIE1EUDRfVkVSU0lPTl9NSU5PUik7CiAKLQlEQkcoImZvdW5kIE1EUCB2ZXJzaW9uIHYlZC4lZCIsIG1ham9yLCBtaW5vcik7CisJREJHKCJmb3VuZCBNRFA0IHZlcnNpb24gdiVkLiVkIiwgbWFqb3IsIG1pbm9yKTsKIAogCWlmIChtYWpvciAhPSA0KSB7CiAJCWRldl9lcnIoZGV2LT5kZXYsICJ1bmV4cGVjdGVkIE1EUCB2ZXJzaW9uOiB2JWQuJWRcbiIsCkBAIC0xMzAsNyArMTMzLDcgQEAKIAogc3RhdGljIHZvaWQgbWRwNF9wcmVjbG9zZShzdHJ1Y3QgbXNtX2ttcyAqa21zLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKGttcyk7CisJc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKHRvX21kcF9rbXMoa21zKSk7CiAJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IG1kcDRfa21zLT5kZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGk7CiAKQEAgLTE0MCwxMSArMTQzLDEyIEBACiAKIHN0YXRpYyB2b2lkIG1kcDRfZGVzdHJveShzdHJ1Y3QgbXNtX2ttcyAqa21zKQogewotCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhrbXMpOworCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyh0b19tZHBfa21zKGttcykpOwogCWtmcmVlKG1kcDRfa21zKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fa21zX2Z1bmNzIGttc19mdW5jcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRwX2ttc19mdW5jcyBrbXNfZnVuY3MgPSB7CisJLmJhc2UgPSB7CiAJCS5od19pbml0ICAgICAgICAgPSBtZHA0X2h3X2luaXQsCiAJCS5pcnFfcHJlaW5zdGFsbCAgPSBtZHA0X2lycV9wcmVpbnN0YWxsLAogCQkuaXJxX3Bvc3RpbnN0YWxsID0gbWRwNF9pcnFfcG9zdGluc3RhbGwsCkBAIC0xNTIsMTAgKzE1NiwxMiBAQAogCQkuaXJxICAgICAgICAgICAgID0gbWRwNF9pcnEsCiAJCS5lbmFibGVfdmJsYW5rICAgPSBtZHA0X2VuYWJsZV92YmxhbmssCiAJCS5kaXNhYmxlX3ZibGFuayAgPSBtZHA0X2Rpc2FibGVfdmJsYW5rLAotCQkuZ2V0X2Zvcm1hdCAgICAgID0gbWRwNF9nZXRfZm9ybWF0LAorCQkuZ2V0X2Zvcm1hdCAgICAgID0gbWRwX2dldF9mb3JtYXQsCiAJCS5yb3VuZF9waXhjbGsgICAgPSBtZHA0X3JvdW5kX3BpeGNsaywKIAkJLnByZWNsb3NlICAgICAgICA9IG1kcDRfcHJlY2xvc2UsCiAJCS5kZXN0cm95ICAgICAgICAgPSBtZHA0X2Rlc3Ryb3ksCisJfSwKKwkuc2V0X2lycW1hc2sgICAgICAgICA9IG1kcDRfc2V0X2lycW1hc2ssCiB9OwogCiBpbnQgbWRwNF9kaXNhYmxlKHN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMpCkBAIC0xODksNiArMTk1LDcgQEAKIAlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZTsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBoZG1pICpoZG1pOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMjM4LDkgKzI0NSwxMCBAQAogCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgxOyAgICAgLyogRFRWIGNhbiBiZSBob29rZWQgdG8gRE1BX0UgKi8KIAlwcml2LT5lbmNvZGVyc1twcml2LT5udW1fZW5jb2RlcnMrK10gPSBlbmNvZGVyOwogCi0JcmV0ID0gaGRtaV9pbml0KGRldiwgZW5jb2Rlcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgSERNSVxuIik7CisJaGRtaSA9IGhkbWlfaW5pdChkZXYsIGVuY29kZXIpOworCWlmIChJU19FUlIoaGRtaSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoZG1pKTsKKwkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIEhETUk6ICVkXG4iLCByZXQpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC0yNjAsNiArMjY4LDcgQEAKIAlzdHJ1Y3QgbWRwNF9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IG1kcDRfZ2V0X2NvbmZpZyhwZGV2KTsKIAlzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zOwogCXN0cnVjdCBtc21fa21zICprbXMgPSBOVUxMOworCXN0cnVjdCBtc21fbW11ICptbXU7CiAJaW50IHJldDsKIAogCW1kcDRfa21zID0ga3phbGxvYyhzaXplb2YoKm1kcDRfa21zKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNjksOCArMjc4LDkgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCWttcyA9ICZtZHA0X2ttcy0+YmFzZTsKLQlrbXMtPmZ1bmNzID0gJmttc19mdW5jczsKKwltZHBfa21zX2luaXQoJm1kcDRfa21zLT5iYXNlLCAma21zX2Z1bmNzKTsKKworCWttcyA9ICZtZHA0X2ttcy0+YmFzZS5iYXNlOwogCiAJbWRwNF9rbXMtPmRldiA9IGRldjsKIApAQCAtMzIyLDI3ICszMzIsMzQgQEAKIAljbGtfc2V0X3JhdGUobWRwNF9rbXMtPmNsaywgY29uZmlnLT5tYXhfY2xrKTsKIAljbGtfc2V0X3JhdGUobWRwNF9rbXMtPmx1dF9jbGssIGNvbmZpZy0+bWF4X2Nsayk7CiAKLQlpZiAoIWNvbmZpZy0+aW9tbXUpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgIm5vIGlvbW11XG4iKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGZhaWw7Ci0JfQotCiAJLyogbWFrZSBzdXJlIHRoaW5ncyBhcmUgb2ZmIGJlZm9yZSBhdHRhY2hpbmcgaW9tbXUgKGJvb3Rsb2FkZXIgY291bGQKIAkgKiBoYXZlIGxlZnQgdGhpbmdzIG9uLCBpbiB3aGljaCBjYXNlIHdlJ2xsIHN0YXJ0IGdldHRpbmcgZmF1bHRzIGlmCiAJICogd2UgZG9uJ3QgZGlzYWJsZSk6CiAJICovCisJbWRwNF9lbmFibGUobWRwNF9rbXMpOwogCW1kcDRfd3JpdGUobWRwNF9rbXMsIFJFR19NRFA0X0RUVl9FTkFCTEUsIDApOwogCW1kcDRfd3JpdGUobWRwNF9rbXMsIFJFR19NRFA0X0xDRENfRU5BQkxFLCAwKTsKIAltZHA0X3dyaXRlKG1kcDRfa21zLCBSRUdfTURQNF9EU0lfRU5BQkxFLCAwKTsKKwltZHA0X2Rpc2FibGUobWRwNF9rbXMpOwogCW1kZWxheSgxNik7CiAKLQlyZXQgPSBtc21faW9tbXVfYXR0YWNoKGRldiwgY29uZmlnLT5pb21tdSwKLQkJCWlvbW11X3BvcnRzLCBBUlJBWV9TSVpFKGlvbW11X3BvcnRzKSk7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsOworCWlmIChjb25maWctPmlvbW11KSB7CisJCW1tdSA9IG1zbV9pb21tdV9uZXcoZGV2LCBjb25maWctPmlvbW11KTsKKwkJaWYgKElTX0VSUihtbXUpKSB7CisJCQlyZXQgPSBQVFJfRVJSKG1tdSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmV0ID0gbW11LT5mdW5jcy0+YXR0YWNoKG1tdSwgaW9tbXVfcG9ydHMsCisJCQkJQVJSQVlfU0laRShpb21tdV9wb3J0cykpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCWRldl9pbmZvKGRldi0+ZGV2LCAibm8gaW9tbXUsIGZhbGxiYWNrIHRvIHBoeXMgIgorCQkJCSJjb250aWcgYnVmZmVycyBmb3Igc2Nhbm91dFxuIik7CisJCW1tdSA9IE5VTEw7CisJfQogCi0JbWRwNF9rbXMtPmlkID0gbXNtX3JlZ2lzdGVyX2lvbW11KGRldiwgY29uZmlnLT5pb21tdSk7CisJbWRwNF9rbXMtPmlkID0gbXNtX3JlZ2lzdGVyX21tdShkZXYsIG1tdSk7CiAJaWYgKG1kcDRfa21zLT5pZCA8IDApIHsKIAkJcmV0ID0gbWRwNF9rbXMtPmlkOwogCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG1kcDQgaW9tbXU6ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfa21zLmgKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfa21zLmgKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDQvbWRwNF9rbXMuaAppbmRleCBlYjAxNWM4Li42NmE0ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9rbXMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfa21zLmgKQEAgLTE4LDI5ICsxOCwxMyBAQAogI2lmbmRlZiBfX01EUDRfS01TX0hfXwogI2RlZmluZSBfX01EUDRfS01TX0hfXwogCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0KICNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibXNtX2ttcy5oIgorI2luY2x1ZGUgIm1kcC9tZHBfa21zLmgiCiAjaW5jbHVkZSAibWRwNC54bWwuaCIKIAotCi0vKiBGb3IgdHJhbnNpZW50bHkgcmVnaXN0ZXJpbmcgZm9yIGRpZmZlcmVudCBNRFA0IGlycXMgdGhhdCB2YXJpb3VzIHBhcnRzCi0gKiBvZiB0aGUgS01TIGNvZGUgbmVlZCBkdXJpbmcgc2V0dXAvY29uZmlndXJhdGlvbi4gIFdlIHRoZXNlIGFyZSBub3QKLSAqIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHdoYXQgZHJtX3ZibGFua19nZXQvcHV0KCkgYXJlIHJlcXVlc3RpbmcsIGFuZAotICogdGhlIGh5c3RlcmVzaXMgaW4gZHJtX3ZibGFua19wdXQoKSBpcyBub3QgbmVjZXNzYXJpbHkgZGVzaXJhYmxlIGZvcgotICogaW50ZXJuYWwgaG91c2VrZWVwaW5nIHJlbGF0ZWQgaXJxIHVzYWdlLgotICovCi1zdHJ1Y3QgbWRwNF9pcnEgewotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLQl1aW50MzJfdCBpcnFtYXNrOwotCWJvb2wgcmVnaXN0ZXJlZDsKLQl2b2lkICgqaXJxKShzdHJ1Y3QgbWRwNF9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKTsKLX07Ci0KIHN0cnVjdCBtZHA0X2ttcyB7Ci0Jc3RydWN0IG1zbV9rbXMgYmFzZTsKKwlzdHJ1Y3QgbWRwX2ttcyBiYXNlOwogCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIApAQCAtNTksMTEgKzQzLDcgQEAKIAlzdHJ1Y3QgY2xrICpwY2xrOwogCXN0cnVjdCBjbGsgKmx1dF9jbGs7CiAKLQkvKiBpcnEgaGFuZGxpbmc6ICovCi0JYm9vbCBpbl9pcnE7Ci0Jc3RydWN0IGxpc3RfaGVhZCBpcnFfbGlzdDsgICAgLyogbGlzdCBvZiBtZHA0X2lycSAqLwotCXVpbnQzMl90IHZibGFua19tYXNrOyAgICAgICAgIC8qIGlycSBiaXRzIHNldCBmb3IgdXNlcnNwYWNlIHZibGFuayAqLwotCXN0cnVjdCBtZHA0X2lycSBlcnJvcl9oYW5kbGVyOworCXN0cnVjdCBtZHBfaXJxIGVycm9yX2hhbmRsZXI7CiB9OwogI2RlZmluZSB0b19tZHA0X2ttcyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IG1kcDRfa21zLCBiYXNlKQogCkBAIC03MywxNiArNTMsNiBAQAogCXVpbnQzMl90IG1heF9jbGs7CiB9OwogCi1zdHJ1Y3QgbWRwNF9mb3JtYXQgewotCXN0cnVjdCBtc21fZm9ybWF0IGJhc2U7Ci0JZW51bSBtZHA0X2JwYyBicGNfciwgYnBjX2csIGJwY19iOwotCWVudW0gbWRwNF9icGNfYWxwaGEgYnBjX2E7Ci0JdWludDhfdCB1bnBhY2tbNF07Ci0JYm9vbCBhbHBoYV9lbmFibGUsIHVucGFja190aWdodDsKLQl1aW50OF90IGNwcCwgdW5wYWNrX2NvdW50OwotfTsKLSNkZWZpbmUgdG9fbWRwNF9mb3JtYXQoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBtZHA0X2Zvcm1hdCwgYmFzZSkKLQogc3RhdGljIGlubGluZSB2b2lkIG1kcDRfd3JpdGUoc3RydWN0IG1kcDRfa21zICptZHA0X2ttcywgdTMyIHJlZywgdTMyIGRhdGEpCiB7CiAJbXNtX3dyaXRlbChkYXRhLCBtZHA0X2ttcy0+bW1pbyArIHJlZyk7CkBAIC0xMzQsNyArMTA0LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdCBtaXhlcmNmZyhpbnQgbWl4ZXIsIGVudW0gbWRwNF9waXBlIHBpcGUsCi0JCWVudW0gbWRwNF9taXhlcl9zdGFnZV9pZCBzdGFnZSkKKwkJZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgc3RhZ2UpCiB7CiAJdWludDMyX3QgbWl4ZXJfY2ZnID0gMDsKIApAQCAtMTc4LDE5ICsxNDgsMjMgQEAKIGludCBtZHA0X2Rpc2FibGUoc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyk7CiBpbnQgbWRwNF9lbmFibGUoc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyk7CiAKK3ZvaWQgbWRwNF9zZXRfaXJxbWFzayhzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgdWludDMyX3QgaXJxbWFzayk7CiB2b2lkIG1kcDRfaXJxX3ByZWluc3RhbGwoc3RydWN0IG1zbV9rbXMgKmttcyk7CiBpbnQgbWRwNF9pcnFfcG9zdGluc3RhbGwoc3RydWN0IG1zbV9rbXMgKmttcyk7CiB2b2lkIG1kcDRfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKIGlycXJldHVybl90IG1kcDRfaXJxKHN0cnVjdCBtc21fa21zICprbXMpOwotdm9pZCBtZHA0X2lycV93YWl0KHN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMsIHVpbnQzMl90IGlycW1hc2spOwotdm9pZCBtZHA0X2lycV9yZWdpc3RlcihzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zLCBzdHJ1Y3QgbWRwNF9pcnEgKmlycSk7Ci12b2lkIG1kcDRfaXJxX3VucmVnaXN0ZXIoc3RydWN0IG1kcDRfa21zICptZHA0X2ttcywgc3RydWN0IG1kcDRfaXJxICppcnEpOwogaW50IG1kcDRfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgbXNtX2ttcyAqa21zLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogdm9pZCBtZHA0X2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAKLXVpbnQzMl90IG1kcDRfZ2V0X2Zvcm1hdHMoZW51bSBtZHA0X3BpcGUgcGlwZV9pZCwgdWludDMyX3QgKmZvcm1hdHMsCi0JCXVpbnQzMl90IG1heF9mb3JtYXRzKTsKLWNvbnN0IHN0cnVjdCBtc21fZm9ybWF0ICptZHA0X2dldF9mb3JtYXQoc3RydWN0IG1zbV9rbXMgKmttcywgdWludDMyX3QgZm9ybWF0KTsKK3N0YXRpYyBpbmxpbmUKK3VpbnQzMl90IG1kcDRfZ2V0X2Zvcm1hdHMoZW51bSBtZHA0X3BpcGUgcGlwZV9pZCwgdWludDMyX3QgKnBpeGVsX2Zvcm1hdHMsCisJCXVpbnQzMl90IG1heF9mb3JtYXRzKQoreworCS8qIFRPRE8gd2hlbiB3ZSBoYXZlIFlVViwgd2UgbmVlZCB0byBmaWx0ZXIgc3VwcG9ydGVkIGZvcm1hdHMKKwkgKiBiYXNlZCBvbiBwaXBlX2lkLi4KKwkgKi8KKwlyZXR1cm4gbWRwX2dldF9mb3JtYXRzKHBpeGVsX2Zvcm1hdHMsIG1heF9mb3JtYXRzKTsKK30KIAogdm9pZCBtZHA0X3BsYW5lX2luc3RhbGxfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKIAkJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwNC9tZHA0X3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfcGxhbmUuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9wbGFuZS5jCnJlbmFtZSB0byBkcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfcGxhbmUuYwppbmRleCAwZjBhZjI0Li4yNDA2MDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcDQvbWRwNF9wbGFuZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDQvbWRwNF9wbGFuZS5jCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgc3RydWN0IG1kcDRfa21zICpnZXRfa21zKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQogewogCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBwbGFuZS0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlyZXR1cm4gdG9fbWRwNF9rbXMocHJpdi0+a21zKTsKKwlyZXR1cm4gdG9fbWRwNF9rbXModG9fbWRwX2ttcyhwcml2LT5rbXMpKTsKIH0KIAogc3RhdGljIGludCBtZHA0X3BsYW5lX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKQEAgLTEzMiw3ICsxMzIsNyBAQAogCXN0cnVjdCBtZHA0X3BsYW5lICptZHA0X3BsYW5lID0gdG9fbWRwNF9wbGFuZShwbGFuZSk7CiAJc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IGdldF9rbXMocGxhbmUpOwogCWVudW0gbWRwNF9waXBlIHBpcGUgPSBtZHA0X3BsYW5lLT5waXBlOwotCWNvbnN0IHN0cnVjdCBtZHA0X2Zvcm1hdCAqZm9ybWF0OworCWNvbnN0IHN0cnVjdCBtZHBfZm9ybWF0ICpmb3JtYXQ7CiAJdWludDMyX3Qgb3BfbW9kZSA9IDA7CiAJdWludDMyX3QgcGhhc2V4X3N0ZXAgPSBNRFA0X1ZHX1BIQVNFX1NURVBfREVGQVVMVDsKIAl1aW50MzJfdCBwaGFzZXlfc3RlcCA9IE1EUDRfVkdfUEhBU0VfU1RFUF9ERUZBVUxUOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKIAltZHA0X3BsYW5lX3NldF9zY2Fub3V0KHBsYW5lLCBmYik7CiAKLQlmb3JtYXQgPSB0b19tZHA0X2Zvcm1hdChtc21fZnJhbWVidWZmZXJfZm9ybWF0KGZiKSk7CisJZm9ybWF0ID0gdG9fbWRwX2Zvcm1hdChtc21fZnJhbWVidWZmZXJfZm9ybWF0KGZiKSk7CiAKIAltZHA0X3dyaXRlKG1kcDRfa21zLCBSRUdfTURQNF9QSVBFX1NSQ19GT1JNQVQocGlwZSksCiAJCQlNRFA0X1BJUEVfU1JDX0ZPUk1BVF9BX0JQQyhmb3JtYXQtPmJwY19hKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDUueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDUueG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhNTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNS54bWwuaApAQCAtMCwwICsxLDEwMzYgQEAKKyNpZm5kZWYgTURQNV9YTUwKKyNkZWZpbmUgTURQNV9YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAorCitUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6CistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNjQ3IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDU6MzUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA0LnhtbCAgICAgICAgICAgICggIDE3OTk2IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTk6MTA6MzEpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHBfY29tbW9uLnhtbCAgICAgICggICAxNjE1IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDA6NTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA1LnhtbCAgICAgICAgICAgICggIDIyNTE3IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDMgMjA6NTk6MTMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9kc2kueG1sICAgICAgICAgICAgICggIDExNzEyIGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTcgMTc6MTM6NDMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9zZnBiLnhtbCAgICAgICAgICAgICggICAgMzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTk6MjY6MzIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9tbXNzX2NjLnhtbCAgICAgICAgICggICAxNTQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTYgMTk6MTc6MDUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvcWZwcm9tLnhtbCAgICAgICAgICggICAgNjAwIGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDIwOTMyIGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTU6MTM6MDQpCisKK0NvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CistIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCitlbnVtIG1kcDVfaW50ZiB7CisJSU5URl9EU0kgPSAxLAorCUlOVEZfSERNSSA9IDMsCisJSU5URl9MQ0RDID0gNSwKKwlJTlRGX2VEUCA9IDksCit9OworCitlbnVtIG1kcDVfaW50Zm51bSB7CisJTk9fSU5URiA9IDAsCisJSU5URjAgPSAxLAorCUlOVEYxID0gMiwKKwlJTlRGMiA9IDMsCisJSU5URjMgPSA0LAorfTsKKworZW51bSBtZHA1X3BpcGUgeworCVNTUFBfVklHMCA9IDAsCisJU1NQUF9WSUcxID0gMSwKKwlTU1BQX1ZJRzIgPSAyLAorCVNTUFBfUkdCMCA9IDMsCisJU1NQUF9SR0IxID0gNCwKKwlTU1BQX1JHQjIgPSA1LAorCVNTUFBfRE1BMCA9IDYsCisJU1NQUF9ETUExID0gNywKK307CisKK2VudW0gbWRwNV9jdGxfbW9kZSB7CisJTU9ERV9OT05FID0gMCwKKwlNT0RFX1JPVDAgPSAxLAorCU1PREVfUk9UMSA9IDIsCisJTU9ERV9XQjAgPSAzLAorCU1PREVfV0IxID0gNCwKKwlNT0RFX1dGRCA9IDUsCit9OworCitlbnVtIG1kcDVfcGFja18zZCB7CisJUEFDS18zRF9GUkFNRV9JTlQgPSAwLAorCVBBQ0tfM0RfSF9ST1dfSU5UID0gMSwKKwlQQUNLXzNEX1ZfUk9XX0lOVCA9IDIsCisJUEFDS18zRF9DT0xfSU5UID0gMywKK307CisKK2VudW0gbWRwNV9jaHJvbWFfc2FtcF90eXBlIHsKKwlDSFJPTUFfUkdCID0gMCwKKwlDSFJPTUFfSDJWMSA9IDEsCisJQ0hST01BX0gxVjIgPSAyLAorCUNIUk9NQV80MjAgPSAzLAorfTsKKworZW51bSBtZHA1X3NjYWxlX2ZpbHRlciB7CisJU0NBTEVfRklMVEVSX05FQVJFU1QgPSAwLAorCVNDQUxFX0ZJTFRFUl9CSUwgPSAxLAorCVNDQUxFX0ZJTFRFUl9QQ01OID0gMiwKKwlTQ0FMRV9GSUxURVJfQ0EgPSAzLAorfTsKKworZW51bSBtZHA1X3BpcGVfYndjIHsKKwlCV0NfTE9TU0xFU1MgPSAwLAorCUJXQ19RX0hJR0ggPSAxLAorCUJXQ19RX01FRCA9IDIsCit9OworCitlbnVtIG1kcDVfY2xpZW50X2lkIHsKKwlDSURfVU5VU0VEID0gMCwKKwlDSURfVklHMF9ZID0gMSwKKwlDSURfVklHMF9DUiA9IDIsCisJQ0lEX1ZJRzBfQ0IgPSAzLAorCUNJRF9WSUcxX1kgPSA0LAorCUNJRF9WSUcxX0NSID0gNSwKKwlDSURfVklHMV9DQiA9IDYsCisJQ0lEX1ZJRzJfWSA9IDcsCisJQ0lEX1ZJRzJfQ1IgPSA4LAorCUNJRF9WSUcyX0NCID0gOSwKKwlDSURfRE1BMF9ZID0gMTAsCisJQ0lEX0RNQTBfQ1IgPSAxMSwKKwlDSURfRE1BMF9DQiA9IDEyLAorCUNJRF9ETUExX1kgPSAxMywKKwlDSURfRE1BMV9DUiA9IDE0LAorCUNJRF9ETUExX0NCID0gMTUsCisJQ0lEX1JHQjAgPSAxNiwKKwlDSURfUkdCMSA9IDE3LAorCUNJRF9SR0IyID0gMTgsCisJQ0lEX01BWCA9IDE5LAorfTsKKworZW51bSBtZHA1X2lnY190eXBlIHsKKwlJR0NfVklHID0gMCwKKwlJR0NfUkdCID0gMSwKKwlJR0NfRE1BID0gMiwKKwlJR0NfRFNQUCA9IDMsCit9OworCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYwX1dCX1JPVF9DT01QCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTURQNV9JUlFfSU5URjFfV0JfUk9UX0NPTVAJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRFA1X0lSUV9JTlRGMl9XQl9ST1RfQ09NUAkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1EUDVfSVJRX0lOVEYzX1dCX1JPVF9DT01QCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTURQNV9JUlFfSU5URjBfV0JfV0ZECQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYxX1dCX1dGRAkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGMl9XQl9XRkQJCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjNfV0JfV0ZECQkJCQkweDAwMDAwMDgwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYwX1BJTkdfUE9OR19DT01QCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjFfUElOR19QT05HX0NPTVAJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGMl9QSU5HX1BPTkdfQ09NUAkJCQkweDAwMDAwNDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYzX1BJTkdfUE9OR19DT01QCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjBfUElOR19QT05HX1JEX1BUUgkJCQkweDAwMDAxMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYxX1BJTkdfUE9OR19SRF9QVFIJCQkJMHgwMDAwMjAwMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGMl9QSU5HX1BPTkdfUkRfUFRSCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjNfUElOR19QT05HX1JEX1BUUgkJCQkweDAwMDA4MDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYwX1BJTkdfUE9OR19XUl9QVFIJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGMV9QSU5HX1BPTkdfV1JfUFRSCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjJfUElOR19QT05HX1dSX1BUUgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYzX1BJTkdfUE9OR19XUl9QVFIJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGMF9QSU5HX1BPTkdfQVVUT19SRUYJCQkweDAwMTAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYxX1BJTkdfUE9OR19BVVRPX1JFRgkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTURQNV9JUlFfSU5URjJfUElOR19QT05HX0FVVE9fUkVGCQkJMHgwMDQwMDAwMAorI2RlZmluZSBNRFA1X0lSUV9JTlRGM19QSU5HX1BPTkdfQVVUT19SRUYJCQkweDAwODAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYwX1VOREVSX1JVTgkJCQkweDAxMDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYwX1ZTWU5DCQkJCQkweDAyMDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYxX1VOREVSX1JVTgkJCQkweDA0MDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYxX1ZTWU5DCQkJCQkweDA4MDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYyX1VOREVSX1JVTgkJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYyX1ZTWU5DCQkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYzX1VOREVSX1JVTgkJCQkweDQwMDAwMDAwCisjZGVmaW5lIE1EUDVfSVJRX0lOVEYzX1ZTWU5DCQkJCQkweDgwMDAwMDAwCisjZGVmaW5lIFJFR19NRFA1X0hXX1ZFUlNJT04JCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBSRUdfTURQNV9IV19JTlRSX1NUQVRVUwkJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNRFA1X0hXX0lOVFJfU1RBVFVTX0lOVFJfTURQCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTURQNV9IV19JTlRSX1NUQVRVU19JTlRSX0RTSTAJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNRFA1X0hXX0lOVFJfU1RBVFVTX0lOVFJfRFNJMQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1EUDVfSFdfSU5UUl9TVEFUVVNfSU5UUl9IRE1JCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTURQNV9IV19JTlRSX1NUQVRVU19JTlRSX0VEUAkJCQkweDAwMDAxMDAwCisKKyNkZWZpbmUgUkVHX01EUDVfTURQX1ZFUlNJT04JCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTURQNV9NRFBfVkVSU0lPTl9NSU5PUl9fTUFTSwkJCQkweDAwZmYwMDAwCisjZGVmaW5lIE1EUDVfTURQX1ZFUlNJT05fTUlOT1JfX1NISUZUCQkJCTE2CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfTURQX1ZFUlNJT05fTUlOT1IodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9NRFBfVkVSU0lPTl9NSU5PUl9fU0hJRlQpICYgTURQNV9NRFBfVkVSU0lPTl9NSU5PUl9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9NRFBfVkVSU0lPTl9NQUpPUl9fTUFTSwkJCQkweGYwMDAwMDAwCisjZGVmaW5lIE1EUDVfTURQX1ZFUlNJT05fTUFKT1JfX1NISUZUCQkJCTI4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfTURQX1ZFUlNJT05fTUFKT1IodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9NRFBfVkVSU0lPTl9NQUpPUl9fU0hJRlQpICYgTURQNV9NRFBfVkVSU0lPTl9NQUpPUl9fTUFTSzsKK30KKworI2RlZmluZSBSRUdfTURQNV9ESVNQX0lOVEZfU0VMCQkJCQkweDAwMDAwMTA0CisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMF9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMF9fU0hJRlQJCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjAoZW51bSBtZHA1X2ludGYgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9ESVNQX0lOVEZfU0VMX0lOVEYwX19TSElGVCkgJiBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjBfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMV9fTUFTSwkJCQkweDAwMDBmZjAwCisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMV9fU0hJRlQJCQkJOAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjEoZW51bSBtZHA1X2ludGYgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9ESVNQX0lOVEZfU0VMX0lOVEYxX19TSElGVCkgJiBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjFfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMl9fTUFTSwkJCQkweDAwZmYwMDAwCisjZGVmaW5lIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMl9fU0hJRlQJCQkJMTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9ESVNQX0lOVEZfU0VMX0lOVEYyKGVudW0gbWRwNV9pbnRmIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMl9fU0hJRlQpICYgTURQNV9ESVNQX0lOVEZfU0VMX0lOVEYyX19NQVNLOworfQorI2RlZmluZSBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjNfX01BU0sJCQkJMHhmZjAwMDAwMAorI2RlZmluZSBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjNfX1NISUZUCQkJCTI0CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMyhlbnVtIG1kcDVfaW50ZiB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjNfX1NISUZUKSAmIE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGM19fTUFTSzsKK30KKworI2RlZmluZSBSRUdfTURQNV9JTlRSX0VOCQkJCQkweDAwMDAwMTEwCisKKyNkZWZpbmUgUkVHX01EUDVfSU5UUl9TVEFUVVMJCQkJCTB4MDAwMDAxMTQKKworI2RlZmluZSBSRUdfTURQNV9JTlRSX0NMRUFSCQkJCQkweDAwMDAwMTE4CisKKyNkZWZpbmUgUkVHX01EUDVfSElTVF9JTlRSX0VOCQkJCQkweDAwMDAwMTFjCisKKyNkZWZpbmUgUkVHX01EUDVfSElTVF9JTlRSX1NUQVRVUwkJCQkweDAwMDAwMTIwCisKKyNkZWZpbmUgUkVHX01EUDVfSElTVF9JTlRSX0NMRUFSCQkJCTB4MDAwMDAxMjQKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9TTVBfQUxMT0NfVyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDE4MCArIDB4NCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1NNUF9BTExPQ19XX1JFRyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDE4MCArIDB4NCppMDsgfQorI2RlZmluZSBNRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQwX19NQVNLCQkJMHgwMDAwMDBmZgorI2RlZmluZSBNRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQwX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMChlbnVtIG1kcDVfY2xpZW50X2lkIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDBfX1NISUZUKSAmIE1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDBfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDFfX01BU0sJCQkweDAwMDBmZjAwCisjZGVmaW5lIE1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDFfX1NISUZUCQkJOAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQxKGVudW0gbWRwNV9jbGllbnRfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMV9fU0hJRlQpICYgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMV9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMl9fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMl9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQyKGVudW0gbWRwNV9jbGllbnRfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMl9fU0hJRlQpICYgTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMl9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9TTVBfQUxMT0NfUih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDIzMCArIDB4NCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1NNUF9BTExPQ19SX1JFRyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDIzMCArIDB4NCppMDsgfQorI2RlZmluZSBNRFA1X1NNUF9BTExPQ19SX1JFR19DTElFTlQwX19NQVNLCQkJMHgwMDAwMDBmZgorI2RlZmluZSBNRFA1X1NNUF9BTExPQ19SX1JFR19DTElFTlQwX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMChlbnVtIG1kcDVfY2xpZW50X2lkIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfU01QX0FMTE9DX1JfUkVHX0NMSUVOVDBfX1NISUZUKSAmIE1EUDVfU01QX0FMTE9DX1JfUkVHX0NMSUVOVDBfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfU01QX0FMTE9DX1JfUkVHX0NMSUVOVDFfX01BU0sJCQkweDAwMDBmZjAwCisjZGVmaW5lIE1EUDVfU01QX0FMTE9DX1JfUkVHX0NMSUVOVDFfX1NISUZUCQkJOAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1NNUF9BTExPQ19SX1JFR19DTElFTlQxKGVudW0gbWRwNV9jbGllbnRfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMV9fU0hJRlQpICYgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMV9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMl9fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMl9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1NNUF9BTExPQ19SX1JFR19DTElFTlQyKGVudW0gbWRwNV9jbGllbnRfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMl9fU0hJRlQpICYgTURQNV9TTVBfQUxMT0NfUl9SRUdfQ0xJRU5UMl9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX29mZnNldF9JR0MoZW51bSBtZHA1X2lnY190eXBlIGlkeCkKK3sKKwlzd2l0Y2ggKGlkeCkgeworCQljYXNlIElHQ19WSUc6IHJldHVybiAweDAwMDAwMzAwOworCQljYXNlIElHQ19SR0I6IHJldHVybiAweDAwMDAwMzEwOworCQljYXNlIElHQ19ETUE6IHJldHVybiAweDAwMDAwMzIwOworCQljYXNlIElHQ19EU1BQOiByZXR1cm4gMHgwMDAwMDQwMDsKKwkJZGVmYXVsdDogcmV0dXJuIElOVkFMSURfSURYKGlkeCk7CisJfQorfQorc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JR0MoZW51bSBtZHA1X2lnY190eXBlIGkwKSB7IHJldHVybiAweDAwMDAwMDAwICsgX19vZmZzZXRfSUdDKGkwKTsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lHQ19MVVQoZW51bSBtZHA1X2lnY190eXBlIGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMDAwMCArIF9fb2Zmc2V0X0lHQyhpMCkgKyAweDQqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JR0NfTFVUX1JFRyhlbnVtIG1kcDVfaWdjX3R5cGUgaTAsIHVpbnQzMl90IGkxKSB7IHJldHVybiAweDAwMDAwMDAwICsgX19vZmZzZXRfSUdDKGkwKSArIDB4NCppMTsgfQorI2RlZmluZSBNRFA1X0lHQ19MVVRfUkVHX1ZBTF9fTUFTSwkJCQkweDAwMDAwZmZmCisjZGVmaW5lIE1EUDVfSUdDX0xVVF9SRUdfVkFMX19TSElGVAkJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfSUdDX0xVVF9SRUdfVkFMKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfSUdDX0xVVF9SRUdfVkFMX19TSElGVCkgJiBNRFA1X0lHQ19MVVRfUkVHX1ZBTF9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9JR0NfTFVUX1JFR19JTkRFWF9VUERBVEUJCQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRFA1X0lHQ19MVVRfUkVHX0RJU0FCTEVfUElQRV8wCQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTURQNV9JR0NfTFVUX1JFR19ESVNBQkxFX1BJUEVfMQkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE1EUDVfSUdDX0xVVF9SRUdfRElTQUJMRV9QSVBFXzIJCQkJMHg0MDAwMDAwMAorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0NUTCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDYwMCArIDB4MTAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQ1RMX0xBWUVSKHVpbnQzMl90IGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMDYwMCArIDB4MTAwKmkwICsgMHg0KmkxOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQ1RMX0xBWUVSX1JFRyh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDA2MDAgKyAweDEwMCppMCArIDB4NCppMTsgfQorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfVklHMF9fTUFTSwkJCQkweDAwMDAwMDA3CisjZGVmaW5lIE1EUDVfQ1RMX0xBWUVSX1JFR19WSUcwX19TSElGVAkJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfQ1RMX0xBWUVSX1JFR19WSUcwKGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfQ1RMX0xBWUVSX1JFR19WSUcwX19TSElGVCkgJiBNRFA1X0NUTF9MQVlFUl9SRUdfVklHMF9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX1ZJRzFfX01BU0sJCQkJMHgwMDAwMDAzOAorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfVklHMV9fU0hJRlQJCQkJMworc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0NUTF9MQVlFUl9SRUdfVklHMShlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0NUTF9MQVlFUl9SRUdfVklHMV9fU0hJRlQpICYgTURQNV9DVExfTEFZRVJfUkVHX1ZJRzFfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfQ1RMX0xBWUVSX1JFR19WSUcyX19NQVNLCQkJCTB4MDAwMDAxYzAKKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX1ZJRzJfX1NISUZUCQkJCTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9DVExfTEFZRVJfUkVHX1ZJRzIoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9DVExfTEFZRVJfUkVHX1ZJRzJfX1NISUZUKSAmIE1EUDVfQ1RMX0xBWUVSX1JFR19WSUcyX19NQVNLOworfQorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMF9fTUFTSwkJCQkweDAwMDAwZTAwCisjZGVmaW5lIE1EUDVfQ1RMX0xBWUVSX1JFR19SR0IwX19TSElGVAkJCQk5CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfQ1RMX0xBWUVSX1JFR19SR0IwKGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfQ1RMX0xBWUVSX1JFR19SR0IwX19TSElGVCkgJiBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMF9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX1JHQjFfX01BU0sJCQkJMHgwMDAwNzAwMAorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMV9fU0hJRlQJCQkJMTIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9DVExfTEFZRVJfUkVHX1JHQjEoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9DVExfTEFZRVJfUkVHX1JHQjFfX1NISUZUKSAmIE1EUDVfQ1RMX0xBWUVSX1JFR19SR0IxX19NQVNLOworfQorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMl9fTUFTSwkJCQkweDAwMDM4MDAwCisjZGVmaW5lIE1EUDVfQ1RMX0xBWUVSX1JFR19SR0IyX19TSElGVAkJCQkxNQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMihlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMl9fU0hJRlQpICYgTURQNV9DVExfTEFZRVJfUkVHX1JHQjJfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfQ1RMX0xBWUVSX1JFR19ETUEwX19NQVNLCQkJCTB4MDAxYzAwMDAKKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX0RNQTBfX1NISUZUCQkJCTE4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfQ1RMX0xBWUVSX1JFR19ETUEwKGVudW0gbWRwX21peGVyX3N0YWdlX2lkIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfQ1RMX0xBWUVSX1JFR19ETUEwX19TSElGVCkgJiBNRFA1X0NUTF9MQVlFUl9SRUdfRE1BMF9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX0RNQTFfX01BU0sJCQkJMHgwMGUwMDAwMAorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfRE1BMV9fU0hJRlQJCQkJMjEKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9DVExfTEFZRVJfUkVHX0RNQTEoZW51bSBtZHBfbWl4ZXJfc3RhZ2VfaWQgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9DVExfTEFZRVJfUkVHX0RNQTFfX1NISUZUKSAmIE1EUDVfQ1RMX0xBWUVSX1JFR19ETUExX19NQVNLOworfQorI2RlZmluZSBNRFA1X0NUTF9MQVlFUl9SRUdfQk9SREVSX0NPTE9SCQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTURQNV9DVExfTEFZRVJfUkVHX0NVUlNPUl9PVVQJCQkJMHgwMjAwMDAwMAorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0NUTF9PUCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDYxNCArIDB4MTAwKmkwOyB9CisjZGVmaW5lIE1EUDVfQ1RMX09QX01PREVfX01BU0sJCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgTURQNV9DVExfT1BfTU9ERV9fU0hJRlQJCQkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9DVExfT1BfTU9ERShlbnVtIG1kcDVfY3RsX21vZGUgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9DVExfT1BfTU9ERV9fU0hJRlQpICYgTURQNV9DVExfT1BfTU9ERV9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9DVExfT1BfSU5URl9OVU1fX01BU0sJCQkJMHgwMDAwMDA3MAorI2RlZmluZSBNRFA1X0NUTF9PUF9JTlRGX05VTV9fU0hJRlQJCQkJNAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0NUTF9PUF9JTlRGX05VTShlbnVtIG1kcDVfaW50Zm51bSB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0NUTF9PUF9JTlRGX05VTV9fU0hJRlQpICYgTURQNV9DVExfT1BfSU5URl9OVU1fX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfQ1RMX09QX0NNRF9NT0RFCQkJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1EUDVfQ1RMX09QX1BBQ0tfM0RfRU5BQkxFCQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTURQNV9DVExfT1BfUEFDS18zRF9fTUFTSwkJCQkweDAwMzAwMDAwCisjZGVmaW5lIE1EUDVfQ1RMX09QX1BBQ0tfM0RfX1NISUZUCQkJCTIwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfQ1RMX09QX1BBQ0tfM0QoZW51bSBtZHA1X3BhY2tfM2QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9DVExfT1BfUEFDS18zRF9fU0hJRlQpICYgTURQNV9DVExfT1BfUEFDS18zRF9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9DVExfRkxVU0godWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDA2MTggKyAweDEwMCppMDsgfQorI2RlZmluZSBNRFA1X0NUTF9GTFVTSF9WSUcwCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1EUDVfQ1RMX0ZMVVNIX1ZJRzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfVklHMgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRFA1X0NUTF9GTFVTSF9SR0IwCQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIE1EUDVfQ1RMX0ZMVVNIX1JHQjEJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfUkdCMgkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRFA1X0NUTF9GTFVTSF9MTTAJCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfTE0xCQkJCQkweDAwMDAwMDgwCisjZGVmaW5lIE1EUDVfQ1RMX0ZMVVNIX0xNMgkJCQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRFA1X0NUTF9GTFVTSF9ETUEwCQkJCQkweDAwMDAwODAwCisjZGVmaW5lIE1EUDVfQ1RMX0ZMVVNIX0RNQTEJCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfRFNQUDAJCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfRFNQUDEJCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfRFNQUDIJCQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgTURQNV9DVExfRkxVU0hfQ1RMCQkJCQkweDAwMDIwMDAwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQ1RMX1NUQVJUKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAwNjFjICsgMHgxMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9DVExfUEFDS18zRCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMDYyMCArIDB4MTAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIwMCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9ISVNUX0NUTF9CQVNFKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxNGM0ICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX0hJU1RfTFVUX0JBU0UoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDE0ZjAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfSElTVF9MVVRfU1dBUChlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTUwMCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfU0laRShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIwMCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfU0laRV9IRUlHSFRfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1NJWkVfSEVJR0hUX19TSElGVAkJCTE2CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfU0laRV9IRUlHSFQodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19TSVpFX0hFSUdIVF9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19TSVpFX0hFSUdIVF9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19TSVpFX1dJRFRIX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19TSVpFX1dJRFRIX19TSElGVAkJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfU0laRV9XSURUSCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1NJWkVfV0lEVEhfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfU0laRV9XSURUSF9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NSQ19JTUdfU0laRShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIwNCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfSU1HX1NJWkVfSEVJR0hUX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0lNR19TSVpFX0hFSUdIVF9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0lNR19TSVpFX0hFSUdIVCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX0lNR19TSVpFX0hFSUdIVF9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19JTUdfU0laRV9IRUlHSFRfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfSU1HX1NJWkVfV0lEVEhfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfSU1HX1NJWkVfV0lEVEhfX1NISUZUCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0lNR19TSVpFX1dJRFRIKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TUkNfSU1HX1NJWkVfV0lEVEhfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfSU1HX1NJWkVfV0lEVEhfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfWFkoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyMDggKyAweDQwMCppMDsgfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1hZX1lfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1hZX1lfX1NISUZUCQkJCTE2CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfWFlfWSh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1hZX1lfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfWFlfWV9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19YWV9YX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19YWV9YX19TSElGVAkJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfWFlfWCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1hZX1hfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfWFlfWF9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX09VVF9TSVpFKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjBjICsgMHg0MDAqaTA7IH0KKyNkZWZpbmUgTURQNV9QSVBFX09VVF9TSVpFX0hFSUdIVF9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIE1EUDVfUElQRV9PVVRfU0laRV9IRUlHSFRfX1NISUZUCQkJMTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX09VVF9TSVpFX0hFSUdIVCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfT1VUX1NJWkVfSEVJR0hUX19TSElGVCkgJiBNRFA1X1BJUEVfT1VUX1NJWkVfSEVJR0hUX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfT1VUX1NJWkVfV0lEVEhfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBNRFA1X1BJUEVfT1VUX1NJWkVfV0lEVEhfX1NISUZUCQkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX09VVF9TSVpFX1dJRFRIKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9PVVRfU0laRV9XSURUSF9fU0hJRlQpICYgTURQNV9QSVBFX09VVF9TSVpFX1dJRFRIX19NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfT1VUX1hZKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjEwICsgMHg0MDAqaTA7IH0KKyNkZWZpbmUgTURQNV9QSVBFX09VVF9YWV9ZX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX09VVF9YWV9ZX19TSElGVAkJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfT1VUX1hZX1kodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX09VVF9YWV9ZX19TSElGVCkgJiBNRFA1X1BJUEVfT1VUX1hZX1lfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9PVVRfWFlfWF9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIE1EUDVfUElQRV9PVVRfWFlfWF9fU0hJRlQJCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfT1VUX1hZX1godWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX09VVF9YWV9YX19TSElGVCkgJiBNRFA1X1BJUEVfT1VUX1hZX1hfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkMwX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyMTQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfU1JDMV9BRERSKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjE4ICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NSQzJfQUREUihlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIxYyArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkMzX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyMjAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfU1JDX1NUUklERV9BKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjI0ICsgMHg0MDAqaTA7IH0KKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19TVFJJREVfQV9QMF9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfU1RSSURFX0FfUDBfX1NISUZUCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX1NUUklERV9BX1AwKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TUkNfU1RSSURFX0FfUDBfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfU1RSSURFX0FfUDBfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfU1RSSURFX0FfUDFfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1NUUklERV9BX1AxX19TSElGVAkJCTE2CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfU1RSSURFX0FfUDEodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19TVFJJREVfQV9QMV9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19TVFJJREVfQV9QMV9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NSQ19TVFJJREVfQihlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIyOCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfU1RSSURFX0JfUDJfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1NUUklERV9CX1AyX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX1NSQ19TVFJJREVfQl9QMih1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1NUUklERV9CX1AyX19TSElGVCkgJiBNRFA1X1BJUEVfU1JDX1NUUklERV9CX1AyX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1NUUklERV9CX1AzX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19TVFJJREVfQl9QM19fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX1NUUklERV9CX1AzKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TUkNfU1RSSURFX0JfUDNfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfU1RSSURFX0JfUDNfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TVElMRV9GUkFNRV9TSVpFKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjJjICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NSQ19GT1JNQVQoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyMzAgKyAweDQwMCppMDsgfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9HX0JQQ19fTUFTSwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfR19CUENfX1NISUZUCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9HX0JQQyhlbnVtIG1kcF9icGMgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfR19CUENfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfRk9STUFUX0dfQlBDX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9CX0JQQ19fTUFTSwkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfQl9CUENfX1NISUZUCQkJMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9CX0JQQyhlbnVtIG1kcF9icGMgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfQl9CUENfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfRk9STUFUX0JfQlBDX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQ19fTUFTSwkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfUl9CUENfX1NISUZUCQkJNAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQyhlbnVtIG1kcF9icGMgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfUl9CUENfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfRk9STUFUX1JfQlBDX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9BX0JQQ19fTUFTSwkJCTB4MDAwMDAwYzAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfQV9CUENfX1NISUZUCQkJNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9BX0JQQyhlbnVtIG1kcF9icGNfYWxwaGEgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfQV9CUENfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfRk9STUFUX0FfQlBDX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9BTFBIQV9FTkFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfRk9STUFUX0NQUF9fTUFTSwkJCQkweDAwMDAwNjAwCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfRk9STUFUX0NQUF9fU0hJRlQJCQkJOQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9DUFAodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfQ1BQX19TSElGVCkgJiBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9DUFBfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfRk9STUFUX1JPVDkwCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfVU5QQUNLX0NPVU5UX19NQVNLCQkJMHgwMDAwMzAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9VTlBBQ0tfQ09VTlRfX1NISUZUCQkxMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9VTlBBQ0tfQ09VTlQodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19GT1JNQVRfVU5QQUNLX0NPVU5UX19TSElGVCkgJiBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9VTlBBQ0tfQ09VTlRfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfRk9STUFUX1VOUEFDS19USUdIVAkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfVU5QQUNLX0FMSUdOX01TQgkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfTlVNX1BMQU5FU19fTUFTSwkJCTB4MDA3ODAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19GT1JNQVRfTlVNX1BMQU5FU19fU0hJRlQJCQkxOQorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9OVU1fUExBTkVTKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TUkNfRk9STUFUX05VTV9QTEFORVNfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfRk9STUFUX05VTV9QTEFORVNfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfRk9STUFUX0NIUk9NQV9TQU1QX19NQVNLCQkJMHgwMTgwMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9DSFJPTUFfU0FNUF9fU0hJRlQJCQkyMworc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9DSFJPTUFfU0FNUChlbnVtIG1kcDVfY2hyb21hX3NhbXBfdHlwZSB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9DSFJPTUFfU0FNUF9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19GT1JNQVRfQ0hST01BX1NBTVBfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfVU5QQUNLKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjM0ICsgMHg0MDAqaTA7IH0KKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTBfX01BU0sJCQkweDAwMDAwMGZmCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfVU5QQUNLX0VMRU0wX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTAodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTBfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfVU5QQUNLX0VMRU0wX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMV9fTUFTSwkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTFfX1NISUZUCQkJOAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMSh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMV9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTFfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfVU5QQUNLX0VMRU0yX19NQVNLCQkJMHgwMGZmMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMl9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMih1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMl9fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTJfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfVU5QQUNLX0VMRU0zX19NQVNLCQkJMHhmZjAwMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNM19fU0hJRlQJCQkyNAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMyh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNM19fU0hJRlQpICYgTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTNfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfT1BfTU9ERShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTIzOCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfT1BfTU9ERV9CV0NfRU4JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRFA1X1BJUEVfU1JDX09QX01PREVfQldDX19NQVNLCQkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19PUF9NT0RFX0JXQ19fU0hJRlQJCQkxCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TUkNfT1BfTU9ERV9CV0MoZW51bSBtZHA1X3BpcGVfYndjIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TUkNfT1BfTU9ERV9CV0NfX1NISUZUKSAmIE1EUDVfUElQRV9TUkNfT1BfTU9ERV9CV0NfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TUkNfT1BfTU9ERV9GTElQX0xSCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19PUF9NT0RFX0ZMSVBfVUQJCQkJMHgwMDAwNDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX09QX01PREVfSUdDX0VOCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTURQNV9QSVBFX1NSQ19PUF9NT0RFX0lHQ19ST01fMAkJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfT1BfTU9ERV9JR0NfUk9NXzEJCQkJMHgwMDA0MDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU1JDX09QX01PREVfREVJTlRFUkxBQ0UJCQkweDAwNDAwMDAwCisjZGVmaW5lIE1EUDVfUElQRV9TUkNfT1BfTU9ERV9ERUlOVEVSTEFDRV9PREQJCQkweDAwODAwMDAwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfQ09OU1RBTlRfQ09MT1IoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyM2MgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfRkVUQ0hfQ09ORklHKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxMjQ4ICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1ZDMV9SQU5HRShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTI0YyArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9SRVFQUklPX0ZJRk9fV01fMChlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTI1MCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9SRVFQUklPX0ZJRk9fV01fMShlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTI1NCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9SRVFQUklPX0ZJRk9fV01fMihlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTI1OCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TUkNfQUREUl9TV19TVEFUVVMoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyNzAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfQ1VSUkVOVF9TUkMwX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyYTQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfQ1VSUkVOVF9TUkMxX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyYTggKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfQ1VSUkVOVF9TUkMyX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyYWMgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfQ1VSUkVOVF9TUkMzX0FERFIoZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDEyYjAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfREVDSU1BVElPTihlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTJiNCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9ERUNJTUFUSU9OX1ZFUlRfX01BU0sJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBNRFA1X1BJUEVfREVDSU1BVElPTl9WRVJUX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX0RFQ0lNQVRJT05fVkVSVCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfREVDSU1BVElPTl9WRVJUX19TSElGVCkgJiBNRFA1X1BJUEVfREVDSU1BVElPTl9WRVJUX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfREVDSU1BVElPTl9IT1JaX19NQVNLCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgTURQNV9QSVBFX0RFQ0lNQVRJT05fSE9SWl9fU0hJRlQJCQk4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9ERUNJTUFUSU9OX0hPUloodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX0RFQ0lNQVRJT05fSE9SWl9fU0hJRlQpICYgTURQNV9QSVBFX0RFQ0lNQVRJT05fSE9SWl9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NDQUxFX0NPTkZJRyhlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTQwNCArIDB4NDAwKmkwOyB9CisjZGVmaW5lIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVYX0VOCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWV9FTgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUlOX0ZJTFRFUl9fTUFTSwkJMHgwMDAwMDMwMAorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9NSU5fRklMVEVSX19TSElGVAkJOAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9NSU5fRklMVEVSKGVudW0gbWRwNV9zY2FsZV9maWx0ZXIgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUlOX0ZJTFRFUl9fU0hJRlQpICYgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUlOX0ZJTFRFUl9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfTUlOX0ZJTFRFUl9fTUFTSwkJMHgwMDAwMGMwMAorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWV9NSU5fRklMVEVSX19TSElGVAkJMTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfTUlOX0ZJTFRFUihlbnVtIG1kcDVfc2NhbGVfZmlsdGVyIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX01JTl9GSUxURVJfX1NISUZUKSAmIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX01JTl9GSUxURVJfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVYX0NSX0ZJTFRFUl9fTUFTSwkJMHgwMDAwMzAwMAorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9DUl9GSUxURVJfX1NISUZUCQkxMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9DUl9GSUxURVIoZW51bSBtZHA1X3NjYWxlX2ZpbHRlciB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9DUl9GSUxURVJfX1NISUZUKSAmIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVYX0NSX0ZJTFRFUl9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfQ1JfRklMVEVSX19NQVNLCQkweDAwMDBjMDAwCisjZGVmaW5lIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX0NSX0ZJTFRFUl9fU0hJRlQJCTE0CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX0NSX0ZJTFRFUihlbnVtIG1kcDVfc2NhbGVfZmlsdGVyIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX0NSX0ZJTFRFUl9fU0hJRlQpICYgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfQ1JfRklMVEVSX19NQVNLOworfQorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9NQVhfRklMVEVSX19NQVNLCQkweDAwMDMwMDAwCisjZGVmaW5lIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVYX01BWF9GSUxURVJfX1NISUZUCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9NQVhfRklMVEVSKGVudW0gbWRwNV9zY2FsZV9maWx0ZXIgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUFYX0ZJTFRFUl9fU0hJRlQpICYgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUFYX0ZJTFRFUl9fTUFTSzsKK30KKyNkZWZpbmUgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfTUFYX0ZJTFRFUl9fTUFTSwkJMHgwMDBjMDAwMAorI2RlZmluZSBNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWV9NQVhfRklMVEVSX19TSElGVAkJMTgKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfTUFYX0ZJTFRFUihlbnVtIG1kcDVfc2NhbGVfZmlsdGVyIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX01BWF9GSUxURVJfX1NISUZUKSAmIE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX01BWF9GSUxURVJfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TQ0FMRV9QSEFTRV9TVEVQX1goZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDE0MTAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X1BJUEVfU0NBTEVfUEhBU0VfU1RFUF9ZKGVudW0gbWRwNV9waXBlIGkwKSB7IHJldHVybiAweDAwMDAxNDE0ICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9QSVBFX1NDQUxFX0lOSVRfUEhBU0VfWChlbnVtIG1kcDVfcGlwZSBpMCkgeyByZXR1cm4gMHgwMDAwMTQyMCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfUElQRV9TQ0FMRV9JTklUX1BIQVNFX1koZW51bSBtZHA1X3BpcGUgaTApIHsgcmV0dXJuIDB4MDAwMDE0MjQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMjAwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9DT0xPUl9PVVQodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMyMDAgKyAweDQwMCppMDsgfQorI2RlZmluZSBNRFA1X0xNX0JMRU5EX0NPTE9SX09VVF9TVEFHRTBfRkdfQUxQSEEJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfQ09MT1JfT1VUX1NUQUdFMV9GR19BTFBIQQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTURQNV9MTV9CTEVORF9DT0xPUl9PVVRfU1RBR0UyX0ZHX0FMUEhBCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRFA1X0xNX0JMRU5EX0NPTE9SX09VVF9TVEFHRTNfRkdfQUxQSEEJCQkweDAwMDAwMDEwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fT1VUX1NJWkUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMyMDQgKyAweDQwMCppMDsgfQorI2RlZmluZSBNRFA1X0xNX09VVF9TSVpFX0hFSUdIVF9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIE1EUDVfTE1fT1VUX1NJWkVfSEVJR0hUX19TSElGVAkJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0xNX09VVF9TSVpFX0hFSUdIVCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0xNX09VVF9TSVpFX0hFSUdIVF9fU0hJRlQpICYgTURQNV9MTV9PVVRfU0laRV9IRUlHSFRfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfTE1fT1VUX1NJWkVfV0lEVEhfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBNRFA1X0xNX09VVF9TSVpFX1dJRFRIX19TSElGVAkJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfTE1fT1VUX1NJWkVfV0lEVEgodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9MTV9PVVRfU0laRV9XSURUSF9fU0hJRlQpICYgTURQNV9MTV9PVVRfU0laRV9XSURUSF9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CT1JERVJfQ09MT1JfMCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMzIwOCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fQk9SREVSX0NPTE9SXzEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMyMTAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0JMRU5EKHVpbnQzMl90IGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMzIyMCArIDB4NDAwKmkwICsgMHgzMCppMTsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0JMRU5EX09QX01PREUodWludDMyX3QgaTAsIHVpbnQzMl90IGkxKSB7IHJldHVybiAweDAwMDAzMjIwICsgMHg0MDAqaTAgKyAweDMwKmkxOyB9CisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9GR19BTFBIQV9fTUFTSwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgTURQNV9MTV9CTEVORF9PUF9NT0RFX0ZHX0FMUEhBX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9MTV9CTEVORF9PUF9NT0RFX0ZHX0FMUEhBKGVudW0gbWRwX2FscGhhX3R5cGUgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9MTV9CTEVORF9PUF9NT0RFX0ZHX0FMUEhBX19TSElGVCkgJiBNRFA1X0xNX0JMRU5EX09QX01PREVfRkdfQUxQSEFfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9GR19JTlZfQUxQSEEJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9GR19NT0RfQUxQSEEJCQkweDAwMDAwMDA4CisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9GR19JTlZfTU9EX0FMUEhBCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNRFA1X0xNX0JMRU5EX09QX01PREVfRkdfVFJBTlNQX0VOCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRFA1X0xNX0JMRU5EX09QX01PREVfQkdfQUxQSEFfX01BU0sJCQkweDAwMDAwMzAwCisjZGVmaW5lIE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9CR19BTFBIQV9fU0hJRlQJCQk4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9CR19BTFBIQShlbnVtIG1kcF9hbHBoYV90eXBlIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfTE1fQkxFTkRfT1BfTU9ERV9CR19BTFBIQV9fU0hJRlQpICYgTURQNV9MTV9CTEVORF9PUF9NT0RFX0JHX0FMUEhBX19NQVNLOworfQorI2RlZmluZSBNRFA1X0xNX0JMRU5EX09QX01PREVfQkdfSU5WX0FMUEhBCQkJMHgwMDAwMDQwMAorI2RlZmluZSBNRFA1X0xNX0JMRU5EX09QX01PREVfQkdfTU9EX0FMUEhBCQkJMHgwMDAwMDgwMAorI2RlZmluZSBNRFA1X0xNX0JMRU5EX09QX01PREVfQkdfSU5WX01PRF9BTFBIQQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTURQNV9MTV9CTEVORF9PUF9NT0RFX0JHX1RSQU5TUF9FTgkJCTB4MDAwMDIwMDAKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9GR19BTFBIQSh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDMyMjQgKyAweDQwMCppMCArIDB4MzAqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9CR19BTFBIQSh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDMyMjggKyAweDQwMCppMCArIDB4MzAqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9GR19UUkFOU1BfTE9XMCh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDMyMmMgKyAweDQwMCppMCArIDB4MzAqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9GR19UUkFOU1BfTE9XMSh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDMyMzAgKyAweDQwMCppMCArIDB4MzAqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9GR19UUkFOU1BfSElHSDAodWludDMyX3QgaTAsIHVpbnQzMl90IGkxKSB7IHJldHVybiAweDAwMDAzMjM0ICsgMHg0MDAqaTAgKyAweDMwKmkxOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fQkxFTkRfRkdfVFJBTlNQX0hJR0gxKHVpbnQzMl90IGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMzIzOCArIDB4NDAwKmkwICsgMHgzMCppMTsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0JMRU5EX0JHX1RSQU5TUF9MT1cwKHVpbnQzMl90IGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMzIzYyArIDB4NDAwKmkwICsgMHgzMCppMTsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0JMRU5EX0JHX1RSQU5TUF9MT1cxKHVpbnQzMl90IGkwLCB1aW50MzJfdCBpMSkgeyByZXR1cm4gMHgwMDAwMzI0MCArIDB4NDAwKmkwICsgMHgzMCppMTsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0JMRU5EX0JHX1RSQU5TUF9ISUdIMCh1aW50MzJfdCBpMCwgdWludDMyX3QgaTEpIHsgcmV0dXJuIDB4MDAwMDMyNDQgKyAweDQwMCppMCArIDB4MzAqaTE7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9CTEVORF9CR19UUkFOU1BfSElHSDEodWludDMyX3QgaTAsIHVpbnQzMl90IGkxKSB7IHJldHVybiAweDAwMDAzMjQ4ICsgMHg0MDAqaTAgKyAweDMwKmkxOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fQ1VSU09SX0lNR19TSVpFKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMmUwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfU0laRSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMzJlNCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fQ1VSU09SX1hZKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMmU4ICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfU1RSSURFKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMmRjICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfRk9STUFUKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMmVjICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfQkFTRV9BRERSKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMmYwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfU1RBUlRfWFkodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMyZjQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0NVUlNPUl9CTEVORF9DT05GSUcodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMyZjggKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0NVUlNPUl9CTEVORF9QQVJBTSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwMzJmYyArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfTE1fQ1VSU09SX0JMRU5EX1RSQU5TUF9MT1cwKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMzAwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9MTV9DVVJTT1JfQkxFTkRfVFJBTlNQX0xPVzEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMzMDQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0NVUlNPUl9CTEVORF9UUkFOU1BfSElHSDAodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMzMDggKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0NVUlNPUl9CTEVORF9UUkFOU1BfSElHSDEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDMzMGMgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0xNX0dDX0xVVF9CQVNFKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDAzMzEwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9EU1BQKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDA0NjAwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9EU1BQX09QX01PREUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDQ2MDAgKyAweDQwMCppMDsgfQorI2RlZmluZSBNRFA1X0RTUFBfT1BfTU9ERV9JR0NfTFVUX0VOCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTURQNV9EU1BQX09QX01PREVfSUdDX1RCTF9JRFhfX01BU0sJCQkweDAwMDAwMDBlCisjZGVmaW5lIE1EUDVfRFNQUF9PUF9NT0RFX0lHQ19UQkxfSURYX19TSElGVAkJCTEKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9EU1BQX09QX01PREVfSUdDX1RCTF9JRFgodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9EU1BQX09QX01PREVfSUdDX1RCTF9JRFhfX1NISUZUKSAmIE1EUDVfRFNQUF9PUF9NT0RFX0lHQ19UQkxfSURYX19NQVNLOworfQorI2RlZmluZSBNRFA1X0RTUFBfT1BfTU9ERV9QQ0NfRU4JCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNRFA1X0RTUFBfT1BfTU9ERV9ESVRIRVJfRU4JCQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRFA1X0RTUFBfT1BfTU9ERV9ISVNUX0VOCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTURQNV9EU1BQX09QX01PREVfQVVUT19DTEVBUgkJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1EUDVfRFNQUF9PUF9NT0RFX0hJU1RfTFVUX0VOCQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTURQNV9EU1BQX09QX01PREVfUEFfRU4JCQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTURQNV9EU1BQX09QX01PREVfR0FNVVRfRU4JCQkJMHgwMDgwMDAwMAorI2RlZmluZSBNRFA1X0RTUFBfT1BfTU9ERV9HQU1VVF9PUkRFUgkJCQkweDAxMDAwMDAwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfRFNQUF9QQ0NfQkFTRSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwNDYzMCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfRFNQUF9ESVRIRVJfREVQVEgodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDQ3NTAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0RTUFBfSElTVF9DVExfQkFTRSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwNDgxMCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfRFNQUF9ISVNUX0xVVF9CQVNFKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDA0ODMwICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9EU1BQX0hJU1RfTFVUX1NXQVAodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDQ4MzQgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0RTUFBfUEFfQkFTRSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAwNDgzOCArIDB4NDAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfRFNQUF9HQU1VVF9CQVNFKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDA0OGRjICsgMHg0MDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9EU1BQX0dDX0JBU0UodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMDQ4YjAgKyAweDQwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEYodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1MDAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVElNSU5HX0VOR0lORV9FTih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjUwMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9DT05GSUcodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1MDQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfSFNZTkNfQ1RMKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTA4ICsgMHgyMDAqaTA7IH0KKyNkZWZpbmUgTURQNV9JTlRGX0hTWU5DX0NUTF9QVUxTRVdfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIE1EUDVfSU5URl9IU1lOQ19DVExfUFVMU0VXX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9JTlRGX0hTWU5DX0NUTF9QVUxTRVcodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9JTlRGX0hTWU5DX0NUTF9QVUxTRVdfX1NISUZUKSAmIE1EUDVfSU5URl9IU1lOQ19DVExfUFVMU0VXX19NQVNLOworfQorI2RlZmluZSBNRFA1X0lOVEZfSFNZTkNfQ1RMX1BFUklPRF9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgTURQNV9JTlRGX0hTWU5DX0NUTF9QRVJJT0RfX1NISUZUCQkJMTYKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9JTlRGX0hTWU5DX0NUTF9QRVJJT0QodWludDMyX3QgdmFsKQoreworCXJldHVybiAoKHZhbCkgPDwgTURQNV9JTlRGX0hTWU5DX0NUTF9QRVJJT0RfX1NISUZUKSAmIE1EUDVfSU5URl9IU1lOQ19DVExfUEVSSU9EX19NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVlNZTkNfUEVSSU9EX0YwKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTBjICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1ZTWU5DX1BFUklPRF9GMSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjUxMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9WU1lOQ19MRU5fRjAodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1MTQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVlNZTkNfTEVOX0YxKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTE4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfVlNUQVJUX0YwKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTFjICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfVlNUQVJUX0YxKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTIwICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfVkVORF9GMCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjUyNCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9ESVNQTEFZX1ZFTkRfRjEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1MjggKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfQUNUSVZFX1ZTVEFSVF9GMCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjUyYyArIDB4MjAwKmkwOyB9CisjZGVmaW5lIE1EUDVfSU5URl9BQ1RJVkVfVlNUQVJUX0YwX1ZBTF9fTUFTSwkJCTB4N2ZmZmZmZmYKKyNkZWZpbmUgTURQNV9JTlRGX0FDVElWRV9WU1RBUlRfRjBfVkFMX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9JTlRGX0FDVElWRV9WU1RBUlRfRjBfVkFMKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfSU5URl9BQ1RJVkVfVlNUQVJUX0YwX1ZBTF9fU0hJRlQpICYgTURQNV9JTlRGX0FDVElWRV9WU1RBUlRfRjBfVkFMX19NQVNLOworfQorI2RlZmluZSBNRFA1X0lOVEZfQUNUSVZFX1ZTVEFSVF9GMF9BQ1RJVkVfVl9FTkFCTEUJCTB4ODAwMDAwMDAKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0FDVElWRV9WU1RBUlRfRjEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1MzAgKyAweDIwMCppMDsgfQorI2RlZmluZSBNRFA1X0lOVEZfQUNUSVZFX1ZTVEFSVF9GMV9WQUxfX01BU0sJCQkweDdmZmZmZmZmCisjZGVmaW5lIE1EUDVfSU5URl9BQ1RJVkVfVlNUQVJUX0YxX1ZBTF9fU0hJRlQJCQkwCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE1EUDVfSU5URl9BQ1RJVkVfVlNUQVJUX0YxX1ZBTCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0lOVEZfQUNUSVZFX1ZTVEFSVF9GMV9WQUxfX1NISUZUKSAmIE1EUDVfSU5URl9BQ1RJVkVfVlNUQVJUX0YxX1ZBTF9fTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0FDVElWRV9WRU5EX0YwKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTM0ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0FDVElWRV9WRU5EX0YxKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTM4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfSENUTCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjUzYyArIDB4MjAwKmkwOyB9CisjZGVmaW5lIE1EUDVfSU5URl9ESVNQTEFZX0hDVExfU1RBUlRfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIE1EUDVfSU5URl9ESVNQTEFZX0hDVExfU1RBUlRfX1NISUZUCQkJMAorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0lOVEZfRElTUExBWV9IQ1RMX1NUQVJUKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfSU5URl9ESVNQTEFZX0hDVExfU1RBUlRfX1NISUZUKSAmIE1EUDVfSU5URl9ESVNQTEFZX0hDVExfU1RBUlRfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfSU5URl9ESVNQTEFZX0hDVExfRU5EX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBNRFA1X0lOVEZfRElTUExBWV9IQ1RMX0VORF9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0lOVEZfRElTUExBWV9IQ1RMX0VORCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsKSA8PCBNRFA1X0lOVEZfRElTUExBWV9IQ1RMX0VORF9fU0hJRlQpICYgTURQNV9JTlRGX0RJU1BMQVlfSENUTF9FTkRfX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9BQ1RJVkVfSENUTCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjU0MCArIDB4MjAwKmkwOyB9CisjZGVmaW5lIE1EUDVfSU5URl9BQ1RJVkVfSENUTF9TVEFSVF9fTUFTSwkJCTB4MDAwMDdmZmYKKyNkZWZpbmUgTURQNV9JTlRGX0FDVElWRV9IQ1RMX1NUQVJUX19TSElGVAkJCTAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTURQNV9JTlRGX0FDVElWRV9IQ1RMX1NUQVJUKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfSU5URl9BQ1RJVkVfSENUTF9TVEFSVF9fU0hJRlQpICYgTURQNV9JTlRGX0FDVElWRV9IQ1RMX1NUQVJUX19NQVNLOworfQorI2RlZmluZSBNRFA1X0lOVEZfQUNUSVZFX0hDVExfRU5EX19NQVNLCQkJCTB4N2ZmZjAwMDAKKyNkZWZpbmUgTURQNV9JTlRGX0FDVElWRV9IQ1RMX0VORF9fU0hJRlQJCQkxNgorc3RhdGljIGlubGluZSB1aW50MzJfdCBNRFA1X0lOVEZfQUNUSVZFX0hDVExfRU5EKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpIDw8IE1EUDVfSU5URl9BQ1RJVkVfSENUTF9FTkRfX1NISUZUKSAmIE1EUDVfSU5URl9BQ1RJVkVfSENUTF9FTkRfX01BU0s7Cit9CisjZGVmaW5lIE1EUDVfSU5URl9BQ1RJVkVfSENUTF9BQ1RJVkVfSF9FTkFCTEUJCQkweDgwMDAwMDAwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9CT1JERVJfQ09MT1IodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1NDQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVU5ERVJGTE9XX0NPTE9SKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTQ4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0hTWU5DX1NLRVcodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1NGMgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfUE9MQVJJVFlfQ1RMKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTUwICsgMHgyMDAqaTA7IH0KKyNkZWZpbmUgTURQNV9JTlRGX1BPTEFSSVRZX0NUTF9IU1lOQ19MT1cJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1EUDVfSU5URl9QT0xBUklUWV9DVExfVlNZTkNfTE9XCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRFA1X0lOVEZfUE9MQVJJVFlfQ1RMX0RBVEFfRU5fTE9XCQkJMHgwMDAwMDAwNAorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVEVTVF9DVEwodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1NTQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVFBfQ09MT1IwKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNTU4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1RQX0NPTE9SMSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjU1YyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9EU0lfQ01EX01PREVfVFJJR0dFUl9FTih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjU4NCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9QQU5FTF9GT1JNQVQodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1OTAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfRlJBTUVfTElORV9DT1VOVF9FTih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjVhOCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9GUkFNRV9DT1VOVCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjVhYyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9MSU5FX0NPVU5UKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNWIwICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RFRkxJQ0tFUl9DT05GSUcodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI1ZjAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfREVGTElDS0VSX1NUUk5HX0NPRUZGKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNWY0ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX0RFRkxJQ0tFUl9XRUFLX0NPRUZGKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNWY4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1RQR19FTkFCTEUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI2MDAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVFBHX01BSU5fQ09OVFJPTCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjYwNCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfSU5URl9UUEdfVklERU9fQ09ORklHKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNjA4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1RQR19DT01QT05FTlRfTElNSVRTKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNjBjICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1RQR19SRUNUQU5HTEUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI2MTAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVFBHX0lOSVRJQUxfVkFMVUUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTI2MTQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0lOVEZfVFBHX0JMS19XSElURV9QQVRURVJOX0ZSQU1FKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEyNjE4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9JTlRGX1RQR19SR0JfTUFQUElORyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMjYxYyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQUQodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMDAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0JZUEFTUyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzEwMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQ1RSTF8wKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMTA0ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9DVFJMXzEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMDggKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0ZSQU1FX1NJWkUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMGMgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0NPTl9DVFJMXzAodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMTAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0NPTl9DVFJMXzEodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMTQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX1NUUl9NQU4odWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxMTggKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX1ZBUih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzExYyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfRElUSCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzEyMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfRElUSF9DVFJMKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMTI0ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9BTVBfTElNKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMTI4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9TTE9QRSh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzEyYyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQldfTFZMKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMTMwICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9MT0dPX1BPUyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzEzNCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfTFVUX0ZJKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMTM4ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9MVVRfQ0ModWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxN2MgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX1NUUl9MSU0odWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxYzggKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0NBTElCX0FCKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMWNjICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9DQUxJQl9DRCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFkMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfTU9ERV9TRUwodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxZDQgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX1RGSUxUX0NUUkwodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxZDggKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0JMX01JTk1BWCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFkYyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQkwodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxZTAgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0JMX01BWCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFlOCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQUwodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMxZWMgKyAweDIwMCppMDsgfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFJFR19NRFA1X0FEX0FMX01JTih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFmMCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQUxfRklMVCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFmNCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQ0ZHX0JVRih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzFmOCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfTFVUX0FMKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMjAwICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9UQVJHX1NUUih1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzI0NCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfU1RBUlRfQ0FMQyh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzI0OCArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfU1RSX09VVCh1aW50MzJfdCBpMCkgeyByZXR1cm4gMHgwMDAxMzI0YyArIDB4MjAwKmkwOyB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgUkVHX01EUDVfQURfQkxfT1VUKHVpbnQzMl90IGkwKSB7IHJldHVybiAweDAwMDEzMjU0ICsgMHgyMDAqaTA7IH0KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBSRUdfTURQNV9BRF9DQUxDX0RPTkUodWludDMyX3QgaTApIHsgcmV0dXJuIDB4MDAwMTMyNTggKyAweDIwMCppMDsgfQorCisKKyNlbmRpZiAvKiBNRFA1X1hNTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhM2IyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9jcnRjLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibWRwNV9rbXMuaCIKKworI2luY2x1ZGUgPGRybS9kcm1fbW9kZS5oPgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAiZHJtX2ZsaXBfd29yay5oIgorCitzdHJ1Y3QgbWRwNV9jcnRjIHsKKwlzdHJ1Y3QgZHJtX2NydGMgYmFzZTsKKwljaGFyIG5hbWVbOF07CisJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CisJc3RydWN0IGRybV9wbGFuZSAqcGxhbmVzWzhdOworCWludCBpZDsKKwlib29sIGVuYWJsZWQ7CisKKwkvKiB3aGljaCBtaXhlci9lbmNvZGVyIHdlIHJvdXRlIG91dHB1dCB0bzogKi8KKwlpbnQgbWl4ZXI7CisKKwkvKiBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgZmxpcCwgdGhlc2Ugd2lsbCBiZSBub24tbnVsbDogKi8KKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbXNtX2ZlbmNlX2NiIHBhZ2VmbGlwX2NiOworCisjZGVmaW5lIFBFTkRJTkdfQ1VSU09SIDB4MQorI2RlZmluZSBQRU5ESU5HX0ZMSVAgICAweDIKKwlhdG9taWNfdCBwZW5kaW5nOworCisJLyogdGhlIGZiIHRoYXQgd2UgbG9naWNhbGx5IChmcm9tIFBvViBvZiBLTVMgQVBJKSBob2xkIGEgcmVmCisJICogdG8uICBXaGljaCB3ZSBtYXkgbm90IHlldCBiZSBzY2FubmluZyBvdXQgKHdlIG1heSBzdGlsbAorCSAqIGJlIHNjYW5uaW5nIG91dCBwcmV2aW91cyBpbiBjYXNlIG9mIHBhZ2VfZmxpcCB3aGlsZSB3YWl0aW5nCisJICogZm9yIGdwdSByZW5kZXJpbmcgdG8gY29tcGxldGU6CisJICovCisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisKKwkvKiB0aGUgZmIgdGhhdCB3ZSBjdXJyZW50bHkgaG9sZCBhIHNjYW5vdXQgcmVmIHRvOiAqLworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKnNjYW5vdXRfZmI7CisKKwkvKiBmb3IgdW5yZWYnaW5nIGZyYW1lYnVmZmVycyBhZnRlciBzY2Fub3V0IGNvbXBsZXRlczogKi8KKwlzdHJ1Y3QgZHJtX2ZsaXBfd29yayB1bnJlZl9mYl93b3JrOworCisJc3RydWN0IG1kcF9pcnEgdmJsYW5rOworCXN0cnVjdCBtZHBfaXJxIGVycjsKK307CisjZGVmaW5lIHRvX21kcDVfY3J0Yyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IG1kcDVfY3J0YywgYmFzZSkKKworc3RhdGljIHN0cnVjdCBtZHA1X2ttcyAqZ2V0X2ttcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuIHRvX21kcDVfa21zKHRvX21kcF9rbXMocHJpdi0+a21zKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfcGVuZGluZyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVpbnQzMl90IHBlbmRpbmcpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCisJYXRvbWljX29yKHBlbmRpbmcsICZtZHA1X2NydGMtPnBlbmRpbmcpOworCW1kcF9pcnFfcmVnaXN0ZXIoJmdldF9rbXMoY3J0YyktPmJhc2UsICZtZHA1X2NydGMtPnZibGFuayk7Cit9CisKK3N0YXRpYyB2b2lkIGNydGNfZmx1c2goc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IHRvX21kcDVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gZ2V0X2ttcyhjcnRjKTsKKwlpbnQgaWQgPSBtZHA1X2NydGMtPmlkOworCXVpbnQzMl90IGksIGZsdXNoID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1kcDVfY3J0Yy0+cGxhbmVzKTsgaSsrKSB7CisJCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lID0gbWRwNV9jcnRjLT5wbGFuZXNbaV07CisJCWlmIChwbGFuZSkgeworCQkJZW51bSBtZHA1X3BpcGUgcGlwZSA9IG1kcDVfcGxhbmVfcGlwZShwbGFuZSk7CisJCQlmbHVzaCB8PSBwaXBlMmZsdXNoKHBpcGUpOworCQl9CisJfQorCWZsdXNoIHw9IG1peGVyMmZsdXNoKG1kcDVfY3J0Yy0+aWQpOworCWZsdXNoIHw9IE1EUDVfQ1RMX0ZMVVNIX0NUTDsKKworCURCRygiJXM6IGZsdXNoPSUwOHgiLCBtZHA1X2NydGMtPm5hbWUsIGZsdXNoKTsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9GTFVTSChpZCksIGZsdXNoKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2ZiKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqbmV3X2ZiKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IHRvX21kcDVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIgPSBtZHA1X2NydGMtPmZiOworCisJLyogZ3JhYiByZWZlcmVuY2UgdG8gaW5jb21pbmcgc2Nhbm91dCBmYjogKi8KKwlkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKG5ld19mYik7CisJbWRwNV9jcnRjLT5iYXNlLmZiID0gbmV3X2ZiOworCW1kcDVfY3J0Yy0+ZmIgPSBuZXdfZmI7CisKKwlpZiAob2xkX2ZiKQorCQlkcm1fZmxpcF93b3JrX3F1ZXVlKCZtZHA1X2NydGMtPnVucmVmX2ZiX3dvcmssIG9sZF9mYik7Cit9CisKKy8qIHVubGlrZSB1cGRhdGVfZmIoKSwgdGFrZSBhIHJlZiB0byB0aGUgbmV3IHNjYW5vdXQgZmIgKmJlZm9yZSogdXBkYXRpbmcKKyAqIHBsYW5lLCB0aGVuIGNhbGwgdGhpcy4gIE5lZWRlZCB0byBlbnN1cmUgd2UgZG9uJ3QgdW5yZWYgdGhlIGJ1ZmZlciB0aGF0CisgKiBpcyBhY3R1YWxseSBzdGlsbCBiZWluZyBzY2FubmVkIG91dC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyB3aG9sZSB0aGluZyBnb2VzIGF3YXkgd2l0aCBhdG9taWMuLiBzaW5jZSB3ZSBjYW4gZGVmZXIKKyAqIGNhbGxpbmcgaW50byBkcml2ZXIgdW50aWwgcmVuZGVyaW5nIGlzIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zY2Fub3V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCisJLyogZmx1c2ggdXBkYXRlcywgdG8gbWFrZSBzdXJlIGh3IGlzIHVwZGF0ZWQgdG8gbmV3IHNjYW5vdXQgZmIsCisJICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHF1ZXVlIHVucmVmIHRvIGN1cnJlbnQgZmIgKGllLiBuZXh0CisJICogdmJsYW5rIHdlIGtub3cgaHcgaXMgZG9uZSB3LyBwcmV2aW91cyBzY2Fub3V0X2ZiKS4KKwkgKi8KKwljcnRjX2ZsdXNoKGNydGMpOworCisJaWYgKG1kcDVfY3J0Yy0+c2Nhbm91dF9mYikKKwkJZHJtX2ZsaXBfd29ya19xdWV1ZSgmbWRwNV9jcnRjLT51bnJlZl9mYl93b3JrLAorCQkJCW1kcDVfY3J0Yy0+c2Nhbm91dF9mYik7CisKKwltZHA1X2NydGMtPnNjYW5vdXRfZmIgPSBmYjsKKworCS8qIGVuYWJsZSB2YmxhbmsgdG8gY29tcGxldGUgZmxpcDogKi8KKwlyZXF1ZXN0X3BlbmRpbmcoY3J0YywgUEVORElOR19GTElQKTsKK30KKworLyogaWYgZmlsZSE9TlVMTCwgdGhpcyBpcyBwcmVjbG9zZSBwb3RlbnRpYWwgY2FuY2VsLWZsaXAgcGF0aCAqLworc3RhdGljIHZvaWQgY29tcGxldGVfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGMgPSB0b19tZHA1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWV2ZW50ID0gbWRwNV9jcnRjLT5ldmVudDsKKwlpZiAoZXZlbnQpIHsKKwkJLyogaWYgcmVndWxhciB2YmxhbmsgY2FzZSAoIWZpbGUpIG9yIGlmIGNhbmNlbC1mbGlwIGZyb20KKwkJICogcHJlY2xvc2Ugb24gZmlsZSB0aGF0IHJlcXVlc3RlZCBmbGlwLCB0aGVuIHNlbmQgdGhlCisJCSAqIGV2ZW50OgorCQkgKi8KKwkJaWYgKCFmaWxlIHx8IChldmVudC0+YmFzZS5maWxlX3ByaXYgPT0gZmlsZSkpIHsKKwkJCW1kcDVfY3J0Yy0+ZXZlbnQgPSBOVUxMOworCQkJZHJtX3NlbmRfdmJsYW5rX2V2ZW50KGRldiwgbWRwNV9jcnRjLT5pZCwgZXZlbnQpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWRwNV9jcnRjLT5wbGFuZXMpOyBpKyspIHsKKwkJc3RydWN0IGRybV9wbGFuZSAqcGxhbmUgPSBtZHA1X2NydGMtPnBsYW5lc1tpXTsKKwkJaWYgKHBsYW5lKQorCQkJbWRwNV9wbGFuZV9jb21wbGV0ZV9mbGlwKHBsYW5lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VmbGlwX2NiKHN0cnVjdCBtc21fZmVuY2VfY2IgKmNiKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9CisJCWNvbnRhaW5lcl9vZihjYiwgc3RydWN0IG1kcDVfY3J0YywgcGFnZWZsaXBfY2IpOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZtZHA1X2NydGMtPmJhc2U7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBtZHA1X2NydGMtPmZiOworCisJaWYgKCFmYikKKwkJcmV0dXJuOworCisJZHJtX2ZyYW1lYnVmZmVyX3JlZmVyZW5jZShmYik7CisJbWRwNV9wbGFuZV9zZXRfc2Nhbm91dChtZHA1X2NydGMtPnBsYW5lLCBmYik7CisJdXBkYXRlX3NjYW5vdXQoY3J0YywgZmIpOworfQorCitzdGF0aWMgdm9pZCB1bnJlZl9mYl93b3JrZXIoc3RydWN0IGRybV9mbGlwX3dvcmsgKndvcmssIHZvaWQgKnZhbCkKK3sKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1kcDVfY3J0YywgdW5yZWZfZmJfd29yayk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1kcDVfY3J0Yy0+YmFzZS5kZXY7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fZnJhbWVidWZmZXJfdW5yZWZlcmVuY2UodmFsKTsKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBtZHA1X2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCisJbWRwNV9jcnRjLT5wbGFuZS0+ZnVuY3MtPmRlc3Ryb3kobWRwNV9jcnRjLT5wbGFuZSk7CisKKwlkcm1fY3J0Y19jbGVhbnVwKGNydGMpOworCWRybV9mbGlwX3dvcmtfY2xlYW51cCgmbWRwNV9jcnRjLT51bnJlZl9mYl93b3JrKTsKKworCWtmcmVlKG1kcDVfY3J0Yyk7Cit9CisKK3N0YXRpYyB2b2lkIG1kcDVfY3J0Y19kcG1zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IG1vZGUpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSBnZXRfa21zKGNydGMpOworCWJvb2wgZW5hYmxlZCA9IChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOworCisJREJHKCIlczogbW9kZT0lZCIsIG1kcDVfY3J0Yy0+bmFtZSwgbW9kZSk7CisKKwlpZiAoZW5hYmxlZCAhPSBtZHA1X2NydGMtPmVuYWJsZWQpIHsKKwkJaWYgKGVuYWJsZWQpIHsKKwkJCW1kcDVfZW5hYmxlKG1kcDVfa21zKTsKKwkJCW1kcF9pcnFfcmVnaXN0ZXIoJm1kcDVfa21zLT5iYXNlLCAmbWRwNV9jcnRjLT5lcnIpOworCQl9IGVsc2UgeworCQkJbWRwX2lycV91bnJlZ2lzdGVyKCZtZHA1X2ttcy0+YmFzZSwgJm1kcDVfY3J0Yy0+ZXJyKTsKKwkJCW1kcDVfZGlzYWJsZShtZHA1X2ttcyk7CisJCX0KKwkJbWRwNV9jcnRjLT5lbmFibGVkID0gZW5hYmxlZDsKKwl9Cit9CisKK3N0YXRpYyBib29sIG1kcDVfY3J0Y19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9zZXR1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSBnZXRfa21zKGNydGMpOworCWludCBpZCA9IG1kcDVfY3J0Yy0+aWQ7CisKKwkvKgorCSAqIEhhcmQtY29kZWQgc2V0dXAgZm9yIG5vdyB1bnRpbCBJIGZpZ3VyZSBvdXQgaG93IHRoZQorCSAqIGxheWVyLW1peGVyIHdvcmtzCisJICovCisKKwkvKiBMTVtpZF06ICovCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfTE1fQkxFTkRfQ09MT1JfT1VUKGlkKSwKKwkJCU1EUDVfTE1fQkxFTkRfQ09MT1JfT1VUX1NUQUdFMF9GR19BTFBIQSk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfTE1fQkxFTkRfT1BfTU9ERShpZCwgMCksCisJCQlNRFA1X0xNX0JMRU5EX09QX01PREVfRkdfQUxQSEEoRkdfQ09OU1QpIHwKKwkJCU1EUDVfTE1fQkxFTkRfT1BfTU9ERV9CR19BTFBIQShGR19QSVhFTCkgfAorCQkJTURQNV9MTV9CTEVORF9PUF9NT0RFX0JHX0lOVl9BTFBIQSk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfTE1fQkxFTkRfRkdfQUxQSEEoaWQsIDApLCAweGZmKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9MTV9CTEVORF9CR19BTFBIQShpZCwgMCksIDB4MDApOworCisJLyogTk9URTogc2VlbXMgdGhhdCBMTVtuXSBhbmQgQ1RMW21dLCB3ZSBkbyBub3QgbmVlZCBuPT1tLi4gYnV0CisJICogd2Ugd2FudCB0byBiZSBzZXR0aW5nIENUTFttXS5MQVlFUltuXS4gIE5vdCBzdXJlIHdoYXQgdGhlCisJICogcG9pbnQgb2YgaGF2aW5nIENUTFttXS5MQVlFUltvXSAoZm9yIG8hPW4pLi4gbWF5YmUgdGhhdCBpcworCSAqIHVzZWQgd2hlbiBjaGFpbmluZyB1cCBtaXhlcnMgZm9yIGhpZ2ggcmVzb2x1dGlvbiBkaXNwbGF5cz8KKwkgKi8KKworCS8qIENUTFtpZF06ICovCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfQ1RMX0xBWUVSX1JFRyhpZCwgMCksCisJCQlNRFA1X0NUTF9MQVlFUl9SRUdfUkdCMChTVEFHRTApIHwKKwkJCU1EUDVfQ1RMX0xBWUVSX1JFR19CT1JERVJfQ09MT1IpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9MQVlFUl9SRUcoaWQsIDEpLCAwKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9DVExfTEFZRVJfUkVHKGlkLCAyKSwgMCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfQ1RMX0xBWUVSX1JFRyhpZCwgMyksIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9MQVlFUl9SRUcoaWQsIDQpLCAwKTsKK30KKworc3RhdGljIGludCBtZHA1X2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsCisJCWludCB4LCBpbnQgeSwKKwkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IHRvX21kcDVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gZ2V0X2ttcyhjcnRjKTsKKwlpbnQgcmV0OworCisJbW9kZSA9IGFkanVzdGVkX21vZGU7CisKKwlEQkcoIiVzOiBzZXQgbW9kZTogJWQ6XCIlc1wiICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkIDB4JXggMHgleCIsCisJCQltZHA1X2NydGMtPm5hbWUsIG1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUsCisJCQltb2RlLT52cmVmcmVzaCwgbW9kZS0+Y2xvY2ssCisJCQltb2RlLT5oZGlzcGxheSwgbW9kZS0+aHN5bmNfc3RhcnQsCisJCQltb2RlLT5oc3luY19lbmQsIG1vZGUtPmh0b3RhbCwKKwkJCW1vZGUtPnZkaXNwbGF5LCBtb2RlLT52c3luY19zdGFydCwKKwkJCW1vZGUtPnZzeW5jX2VuZCwgbW9kZS0+dnRvdGFsLAorCQkJbW9kZS0+dHlwZSwgbW9kZS0+ZmxhZ3MpOworCisJLyogZ3JhYiBleHRyYSByZWYgZm9yIHVwZGF0ZV9zY2Fub3V0KCkgKi8KKwlkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKGNydGMtPmZiKTsKKworCXJldCA9IG1kcDVfcGxhbmVfbW9kZV9zZXQobWRwNV9jcnRjLT5wbGFuZSwgY3J0YywgY3J0Yy0+ZmIsCisJCQkwLCAwLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXksCisJCQl4IDw8IDE2LCB5IDw8IDE2LAorCQkJbW9kZS0+aGRpc3BsYXkgPDwgMTYsIG1vZGUtPnZkaXNwbGF5IDw8IDE2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3J0Yy0+ZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIHNldCBtb2RlIG9uIHBsYW5lOiAlZFxuIiwKKwkJCQltZHA1X2NydGMtPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfTE1fT1VUX1NJWkUobWRwNV9jcnRjLT5pZCksCisJCQlNRFA1X0xNX09VVF9TSVpFX1dJRFRIKG1vZGUtPmhkaXNwbGF5KSB8CisJCQlNRFA1X0xNX09VVF9TSVpFX0hFSUdIVChtb2RlLT52ZGlzcGxheSkpOworCisJdXBkYXRlX2ZiKGNydGMsIGNydGMtPmZiKTsKKwl1cGRhdGVfc2Nhbm91dChjcnRjLCBjcnRjLT5mYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWRwNV9jcnRjX3ByZXBhcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IHRvX21kcDVfY3J0YyhjcnRjKTsKKwlEQkcoIiVzIiwgbWRwNV9jcnRjLT5uYW1lKTsKKwkvKiBtYWtlIHN1cmUgd2UgaG9sZCBhIHJlZiB0byBtZHAgY2xrcyB3aGlsZSBzZXR0aW5nIHVwIG1vZGU6ICovCisJbWRwNV9lbmFibGUoZ2V0X2ttcyhjcnRjKSk7CisJbWRwNV9jcnRjX2RwbXMoY3J0YywgRFJNX01PREVfRFBNU19PRkYpOworfQorCitzdGF0aWMgdm9pZCBtZHA1X2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwltZHA1X2NydGNfZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKKwljcnRjX2ZsdXNoKGNydGMpOworCS8qIGRyb3AgdGhlIHJlZiB0byBtZHAgY2xrJ3MgdGhhdCB3ZSBnb3QgaW4gcHJlcGFyZTogKi8KKwltZHA1X2Rpc2FibGUoZ2V0X2ttcyhjcnRjKSk7Cit9CisKK3N0YXRpYyBpbnQgbWRwNV9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGMgPSB0b19tZHA1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9wbGFuZSAqcGxhbmUgPSBtZHA1X2NydGMtPnBsYW5lOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJmNydGMtPm1vZGU7CisJaW50IHJldDsKKworCS8qIGdyYWIgZXh0cmEgcmVmIGZvciB1cGRhdGVfc2Nhbm91dCgpICovCisJZHJtX2ZyYW1lYnVmZmVyX3JlZmVyZW5jZShjcnRjLT5mYik7CisKKwlyZXQgPSBtZHA1X3BsYW5lX21vZGVfc2V0KHBsYW5lLCBjcnRjLCBjcnRjLT5mYiwKKwkJCTAsIDAsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwKKwkJCXggPDwgMTYsIHkgPDwgMTYsCisJCQltb2RlLT5oZGlzcGxheSA8PCAxNiwgbW9kZS0+dmRpc3BsYXkgPDwgMTYpOworCisJdXBkYXRlX2ZiKGNydGMsIGNydGMtPmZiKTsKKwl1cGRhdGVfc2Nhbm91dChjcnRjLCBjcnRjLT5mYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtZHA1X2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworfQorCitzdGF0aWMgaW50IG1kcDVfY3J0Y19wYWdlX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpuZXdfZmIsCisJCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50LAorCQl1aW50MzJfdCBwYWdlX2ZsaXBfZmxhZ3MpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChtZHA1X2NydGMtPmV2ZW50KSB7CisJCWRldl9lcnIoZGV2LT5kZXYsICJhbHJlYWR5IHBlbmRpbmcgZmxpcCFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW9iaiA9IG1zbV9mcmFtZWJ1ZmZlcl9ibyhuZXdfZmIsIDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCW1kcDVfY3J0Yy0+ZXZlbnQgPSBldmVudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCXVwZGF0ZV9mYihjcnRjLCBuZXdfZmIpOworCisJcmV0dXJuIG1zbV9nZW1fcXVldWVfaW5hY3RpdmVfY2Iob2JqLCAmbWRwNV9jcnRjLT5wYWdlZmxpcF9jYik7Cit9CisKK3N0YXRpYyBpbnQgbWRwNV9jcnRjX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LCB1aW50NjRfdCB2YWwpCit7CisJLy8gWFhYCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgbWRwNV9jcnRjX2Z1bmNzID0geworCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCisJLmRlc3Ryb3kgPSBtZHA1X2NydGNfZGVzdHJveSwKKwkucGFnZV9mbGlwID0gbWRwNV9jcnRjX3BhZ2VfZmxpcCwKKwkuc2V0X3Byb3BlcnR5ID0gbWRwNV9jcnRjX3NldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIG1kcDVfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBtZHA1X2NydGNfZHBtcywKKwkubW9kZV9maXh1cCA9IG1kcDVfY3J0Y19tb2RlX2ZpeHVwLAorCS5tb2RlX3NldCA9IG1kcDVfY3J0Y19tb2RlX3NldCwKKwkucHJlcGFyZSA9IG1kcDVfY3J0Y19wcmVwYXJlLAorCS5jb21taXQgPSBtZHA1X2NydGNfY29tbWl0LAorCS5tb2RlX3NldF9iYXNlID0gbWRwNV9jcnRjX21vZGVfc2V0X2Jhc2UsCisJLmxvYWRfbHV0ID0gbWRwNV9jcnRjX2xvYWRfbHV0LAorfTsKKworc3RhdGljIHZvaWQgbWRwNV9jcnRjX3ZibGFua19pcnEoc3RydWN0IG1kcF9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IGNvbnRhaW5lcl9vZihpcnEsIHN0cnVjdCBtZHA1X2NydGMsIHZibGFuayk7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJm1kcDVfY3J0Yy0+YmFzZTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBwZW5kaW5nOworCisJbWRwX2lycV91bnJlZ2lzdGVyKCZnZXRfa21zKGNydGMpLT5iYXNlLCAmbWRwNV9jcnRjLT52YmxhbmspOworCisJcGVuZGluZyA9IGF0b21pY194Y2hnKCZtZHA1X2NydGMtPnBlbmRpbmcsIDApOworCisJaWYgKHBlbmRpbmcgJiBQRU5ESU5HX0ZMSVApIHsKKwkJY29tcGxldGVfZmxpcChjcnRjLCBOVUxMKTsKKwkJZHJtX2ZsaXBfd29ya19jb21taXQoJm1kcDVfY3J0Yy0+dW5yZWZfZmJfd29yaywgcHJpdi0+d3EpOworCX0KK30KKworc3RhdGljIHZvaWQgbWRwNV9jcnRjX2Vycl9pcnEoc3RydWN0IG1kcF9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKQoreworCXN0cnVjdCBtZHA1X2NydGMgKm1kcDVfY3J0YyA9IGNvbnRhaW5lcl9vZihpcnEsIHN0cnVjdCBtZHA1X2NydGMsIGVycik7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJm1kcDVfY3J0Yy0+YmFzZTsKKwlEQkcoIiVzOiBlcnJvcjogJTA4eCIsIG1kcDVfY3J0Yy0+bmFtZSwgaXJxc3RhdHVzKTsKKwljcnRjX2ZsdXNoKGNydGMpOworfQorCit1aW50MzJfdCBtZHA1X2NydGNfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGMgPSB0b19tZHA1X2NydGMoY3J0Yyk7CisJcmV0dXJuIG1kcDVfY3J0Yy0+dmJsYW5rLmlycW1hc2s7Cit9CisKK3ZvaWQgbWRwNV9jcnRjX2NhbmNlbF9wZW5kaW5nX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJREJHKCJjYW5jZWw6ICVwIiwgZmlsZSk7CisJY29tcGxldGVfZmxpcChjcnRjLCBmaWxlKTsKK30KKworLyogc2V0IGludGVyZmFjZSBmb3Igcm91dGluZyBjcnRjLT5lbmNvZGVyOiAqLwordm9pZCBtZHA1X2NydGNfc2V0X2ludGYoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgaW50ZiwKKwkJZW51bSBtZHA1X2ludGYgaW50Zl9pZCkKK3sKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGMgPSB0b19tZHA1X2NydGMoY3J0Yyk7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IGdldF9rbXMoY3J0Yyk7CisJc3RhdGljIGNvbnN0IGVudW0gbWRwNV9pbnRmbnVtIGludGZudW1bXSA9IHsKKwkJCUlOVEYwLCBJTlRGMSwgSU5URjIsIElOVEYzLAorCX07CisJdWludDMyX3QgaW50Zl9zZWw7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IHdoYXQgaXJxJ3Mgd2Ugd2FudDogKi8KKwltZHA1X2NydGMtPmVyci5pcnFtYXNrID0gaW50ZjJlcnIoaW50Zik7CisJbWRwNV9jcnRjLT52YmxhbmsuaXJxbWFzayA9IGludGYydmJsYW5rKGludGYpOworCisJLyogd2hlbiBjYWxsZWQgZnJvbSBtb2Rlc2V0X2luaXQoKSwgc2tpcCB0aGUgcmVzdCB1bnRpbCBsYXRlcjogKi8KKwlpZiAoIW1kcDVfa21zKQorCQlyZXR1cm47CisKKwlpbnRmX3NlbCA9IG1kcDVfcmVhZChtZHA1X2ttcywgUkVHX01EUDVfRElTUF9JTlRGX1NFTCk7CisKKwlzd2l0Y2ggKGludGYpIHsKKwljYXNlIDA6CisJCWludGZfc2VsICY9IH5NRFA1X0RJU1BfSU5URl9TRUxfSU5URjBfX01BU0s7CisJCWludGZfc2VsIHw9IE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMChpbnRmX2lkKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbnRmX3NlbCAmPSB+TURQNV9ESVNQX0lOVEZfU0VMX0lOVEYxX19NQVNLOworCQlpbnRmX3NlbCB8PSBNRFA1X0RJU1BfSU5URl9TRUxfSU5URjEoaW50Zl9pZCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW50Zl9zZWwgJj0gfk1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMl9fTUFTSzsKKwkJaW50Zl9zZWwgfD0gTURQNV9ESVNQX0lOVEZfU0VMX0lOVEYyKGludGZfaWQpOworCQlicmVhazsKKwljYXNlIDM6CisJCWludGZfc2VsICY9IH5NRFA1X0RJU1BfSU5URl9TRUxfSU5URjNfX01BU0s7CisJCWludGZfc2VsIHw9IE1EUDVfRElTUF9JTlRGX1NFTF9JTlRGMyhpbnRmX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCWJsZW5kX3NldHVwKGNydGMpOworCisJREJHKCIlczogaW50Zl9zZWw9JTA4eCIsIG1kcDVfY3J0Yy0+bmFtZSwgaW50Zl9zZWwpOworCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfRElTUF9JTlRGX1NFTCwgaW50Zl9zZWwpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9PUChtZHA1X2NydGMtPmlkKSwKKwkJCU1EUDVfQ1RMX09QX01PREUoTU9ERV9OT05FKSB8CisJCQlNRFA1X0NUTF9PUF9JTlRGX05VTShpbnRmbnVtW2ludGZdKSk7CisKKwljcnRjX2ZsdXNoKGNydGMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXR0YWNoKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgZW51bSBtZHA1X3BpcGUgcGlwZV9pZCwKKwkJc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOworCisJQlVHX09OKHBpcGVfaWQgPj0gQVJSQVlfU0laRShtZHA1X2NydGMtPnBsYW5lcykpOworCisJaWYgKG1kcDVfY3J0Yy0+cGxhbmVzW3BpcGVfaWRdID09IHBsYW5lKQorCQlyZXR1cm47CisKKwltZHA1X2NydGMtPnBsYW5lc1twaXBlX2lkXSA9IHBsYW5lOworCWJsZW5kX3NldHVwKGNydGMpOworCWlmIChtZHA1X2NydGMtPmVuYWJsZWQgJiYgKHBsYW5lICE9IG1kcDVfY3J0Yy0+cGxhbmUpKQorCQljcnRjX2ZsdXNoKGNydGMpOworfQorCit2b2lkIG1kcDVfY3J0Y19hdHRhY2goc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlzZXRfYXR0YWNoKGNydGMsIG1kcDVfcGxhbmVfcGlwZShwbGFuZSksIHBsYW5lKTsKK30KKwordm9pZCBtZHA1X2NydGNfZGV0YWNoKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc2V0X2F0dGFjaChjcnRjLCBtZHA1X3BsYW5lX3BpcGUocGxhbmUpLCBOVUxMKTsKK30KKworLyogaW5pdGlhbGl6ZSBjcnRjICovCitzdHJ1Y3QgZHJtX2NydGMgKm1kcDVfY3J0Y19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBpbnQgaWQpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gTlVMTDsKKwlzdHJ1Y3QgbWRwNV9jcnRjICptZHA1X2NydGM7CisJaW50IHJldDsKKworCW1kcDVfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCptZHA1X2NydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kcDVfY3J0YykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJY3J0YyA9ICZtZHA1X2NydGMtPmJhc2U7CisKKwltZHA1X2NydGMtPnBsYW5lID0gcGxhbmU7CisJbWRwNV9jcnRjLT5pZCA9IGlkOworCisJbWRwNV9jcnRjLT52YmxhbmsuaXJxID0gbWRwNV9jcnRjX3ZibGFua19pcnE7CisJbWRwNV9jcnRjLT5lcnIuaXJxID0gbWRwNV9jcnRjX2Vycl9pcnE7CisKKwlzbnByaW50ZihtZHA1X2NydGMtPm5hbWUsIHNpemVvZihtZHA1X2NydGMtPm5hbWUpLCAiJXM6JWQiLAorCQkJcGlwZTJuYW1lKG1kcDVfcGxhbmVfcGlwZShwbGFuZSkpLCBpZCk7CisKKwlyZXQgPSBkcm1fZmxpcF93b3JrX2luaXQoJm1kcDVfY3J0Yy0+dW5yZWZfZmJfd29yaywgMTYsCisJCQkidW5yZWYgZmIiLCB1bnJlZl9mYl93b3JrZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCUlOSVRfRkVOQ0VfQ0IoJm1kcDVfY3J0Yy0+cGFnZWZsaXBfY2IsIHBhZ2VmbGlwX2NiKTsKKworCWRybV9jcnRjX2luaXQoZGV2LCBjcnRjLCAmbWRwNV9jcnRjX2Z1bmNzKTsKKwlkcm1fY3J0Y19oZWxwZXJfYWRkKGNydGMsICZtZHA1X2NydGNfaGVscGVyX2Z1bmNzKTsKKworCW1kcDVfcGxhbmVfaW5zdGFsbF9wcm9wZXJ0aWVzKG1kcDVfY3J0Yy0+cGxhbmUsICZjcnRjLT5iYXNlKTsKKworCXJldHVybiBjcnRjOworCitmYWlsOgorCWlmIChjcnRjKQorCQltZHA1X2NydGNfZGVzdHJveShjcnRjKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVjN2JmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2VuY29kZXIuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtZHA1X2ttcy5oIgorCisjaW5jbHVkZSAiZHJtX2NydGMuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworc3RydWN0IG1kcDVfZW5jb2RlciB7CisJc3RydWN0IGRybV9lbmNvZGVyIGJhc2U7CisJaW50IGludGY7CisJZW51bSBtZHA1X2ludGYgaW50Zl9pZDsKKwlib29sIGVuYWJsZWQ7CisJdWludDMyX3QgYnNjOworfTsKKyNkZWZpbmUgdG9fbWRwNV9lbmNvZGVyKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgbWRwNV9lbmNvZGVyLCBiYXNlKQorCitzdGF0aWMgc3RydWN0IG1kcDVfa21zICpnZXRfa21zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhwcml2LT5rbXMpKTsKK30KKworI2lmZGVmIENPTkZJR19NU01fQlVTX1NDQUxJTkcKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9tc21fYnVzLmg+CisjaW5jbHVkZSA8bWFjaC9tc21fYnVzX2JvYXJkLmg+CisjZGVmaW5lIE1EUF9CVVNfVkVDVE9SX0VOVFJZKGFiX3ZhbCwgaWJfdmFsKQkJXAorCXsJCQkJCQlcCisJCS5zcmMgPSBNU01fQlVTX01BU1RFUl9NRFBfUE9SVDAsCVwKKwkJLmRzdCA9IE1TTV9CVVNfU0xBVkVfRUJJX0NIMCwJCVwKKwkJLmFiID0gKGFiX3ZhbCksCQkJCVwKKwkJLmliID0gKGliX3ZhbCksCQkJCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2J1c192ZWN0b3JzIG1kcF9idXNfdmVjdG9yc1tdID0geworCU1EUF9CVVNfVkVDVE9SX0VOVFJZKDAsIDApLAorCU1EUF9CVVNfVkVDVE9SX0VOVFJZKDIwMDAwMDAwMDAsIDIwMDAwMDAwMDApLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbXNtX2J1c19wYXRocyBtZHBfYnVzX3VzZWNhc2VzW10gPSB7IHsKKwkJLm51bV9wYXRocyA9IDEsCisJCS52ZWN0b3JzID0gJm1kcF9idXNfdmVjdG9yc1swXSwKK30sIHsKKwkJLm51bV9wYXRocyA9IDEsCisJCS52ZWN0b3JzID0gJm1kcF9idXNfdmVjdG9yc1sxXSwKK30gfTsKK3N0YXRpYyBzdHJ1Y3QgbXNtX2J1c19zY2FsZV9wZGF0YSBtZHBfYnVzX3NjYWxlX3RhYmxlID0geworCS51c2VjYXNlID0gbWRwX2J1c191c2VjYXNlcywKKwkubnVtX3VzZWNhc2VzID0gQVJSQVlfU0laRShtZHBfYnVzX3VzZWNhc2VzKSwKKwkubmFtZSA9ICJtZHNzX21kcCIsCit9OworCitzdGF0aWMgdm9pZCBic19pbml0KHN0cnVjdCBtZHA1X2VuY29kZXIgKm1kcDVfZW5jb2RlcikKK3sKKwltZHA1X2VuY29kZXItPmJzYyA9IG1zbV9idXNfc2NhbGVfcmVnaXN0ZXJfY2xpZW50KAorCQkJJm1kcF9idXNfc2NhbGVfdGFibGUpOworCURCRygiYnVzIHNjYWxlIGNsaWVudDogJTA4eCIsIG1kcDVfZW5jb2Rlci0+YnNjKTsKK30KKworc3RhdGljIHZvaWQgYnNfZmluaShzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXIpCit7CisJaWYgKG1kcDVfZW5jb2Rlci0+YnNjKSB7CisJCW1zbV9idXNfc2NhbGVfdW5yZWdpc3Rlcl9jbGllbnQobWRwNV9lbmNvZGVyLT5ic2MpOworCQltZHA1X2VuY29kZXItPmJzYyA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBic19zZXQoc3RydWN0IG1kcDVfZW5jb2RlciAqbWRwNV9lbmNvZGVyLCBpbnQgaWR4KQoreworCWlmIChtZHA1X2VuY29kZXItPmJzYykgeworCQlEQkcoInNldCBidXMgc2NhbGluZzogJWQiLCBpZHgpOworCQkvKiBIQUNLOiBzY2FsaW5nIGRvd24sIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGJhY2sgdXAKKwkJICogc2VlbXMgdG8gbGVhdmUgdGhpbmdzIGJyb2tlbiAodW5kZXJmbG93KS4uIHNvCisJCSAqIG5ldmVyIGRpc2FibGU6CisJCSAqLworCQlpZHggPSAxOworCQltc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChtZHA1X2VuY29kZXItPmJzYywgaWR4KTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgYnNfaW5pdChzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXIpIHt9CitzdGF0aWMgdm9pZCBic19maW5pKHN0cnVjdCBtZHA1X2VuY29kZXIgKm1kcDVfZW5jb2Rlcikge30KK3N0YXRpYyB2b2lkIGJzX3NldChzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXIsIGludCBpZHgpIHt9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbWRwNV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBtZHA1X2VuY29kZXIgKm1kcDVfZW5jb2RlciA9IHRvX21kcDVfZW5jb2RlcihlbmNvZGVyKTsKKwlic19maW5pKG1kcDVfZW5jb2Rlcik7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShtZHA1X2VuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG1kcDVfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG1kcDVfZW5jb2Rlcl9kZXN0cm95LAorfTsKKworc3RhdGljIHZvaWQgbWRwNV9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXIgPSB0b19tZHA1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IGdldF9rbXMoZW5jb2Rlcik7CisJaW50IGludGYgPSBtZHA1X2VuY29kZXItPmludGY7CisJYm9vbCBlbmFibGVkID0gKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7CisKKwlEQkcoIm1vZGU9JWQiLCBtb2RlKTsKKworCWlmIChlbmFibGVkID09IG1kcDVfZW5jb2Rlci0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKGVuYWJsZWQpIHsKKwkJYnNfc2V0KG1kcDVfZW5jb2RlciwgMSk7CisJCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfVElNSU5HX0VOR0lORV9FTihpbnRmKSwgMSk7CisJfSBlbHNlIHsKKwkJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfSU5URl9USU1JTkdfRU5HSU5FX0VOKGludGYpLCAwKTsKKwkJYnNfc2V0KG1kcDVfZW5jb2RlciwgMCk7CisJfQorCisJbWRwNV9lbmNvZGVyLT5lbmFibGVkID0gZW5hYmxlZDsKK30KKworc3RhdGljIGJvb2wgbWRwNV9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1kcDVfZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXIgPSB0b19tZHA1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IGdldF9rbXMoZW5jb2Rlcik7CisJaW50IGludGYgPSBtZHA1X2VuY29kZXItPmludGY7CisJdWludDMyX3QgZHR2X2hzeW5jX3NrZXcsIHZzeW5jX3BlcmlvZCwgdnN5bmNfbGVuLCBjdHJsX3BvbDsKKwl1aW50MzJfdCBkaXNwbGF5X3Zfc3RhcnQsIGRpc3BsYXlfdl9lbmQ7CisJdWludDMyX3QgaHN5bmNfc3RhcnRfeCwgaHN5bmNfZW5kX3g7CisJdWludDMyX3QgZm9ybWF0OworCisJbW9kZSA9IGFkanVzdGVkX21vZGU7CisKKwlEQkcoInNldCBtb2RlOiAlZDpcIiVzXCIgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleCAweCV4IiwKKwkJCW1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUsCisJCQltb2RlLT52cmVmcmVzaCwgbW9kZS0+Y2xvY2ssCisJCQltb2RlLT5oZGlzcGxheSwgbW9kZS0+aHN5bmNfc3RhcnQsCisJCQltb2RlLT5oc3luY19lbmQsIG1vZGUtPmh0b3RhbCwKKwkJCW1vZGUtPnZkaXNwbGF5LCBtb2RlLT52c3luY19zdGFydCwKKwkJCW1vZGUtPnZzeW5jX2VuZCwgbW9kZS0+dnRvdGFsLAorCQkJbW9kZS0+dHlwZSwgbW9kZS0+ZmxhZ3MpOworCisJY3RybF9wb2wgPSAwOworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKQorCQljdHJsX3BvbCB8PSBNRFA1X0lOVEZfUE9MQVJJVFlfQ1RMX0hTWU5DX0xPVzsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJY3RybF9wb2wgfD0gTURQNV9JTlRGX1BPTEFSSVRZX0NUTF9WU1lOQ19MT1c7CisJLyogcHJvYmFibHkgbmVlZCB0byBnZXQgREFUQV9FTiBwb2xhcml0eSBmcm9tIHBhbmVsLi4gKi8KKworCWR0dl9oc3luY19za2V3ID0gMDsgIC8qIGdldCB0aGlzIGZyb20gcGFuZWw/ICovCisJZm9ybWF0ID0gMHgyMTNmOyAgICAgLyogZ2V0IHRoaXMgZnJvbSBwYW5lbD8gKi8KKworCWhzeW5jX3N0YXJ0X3ggPSAobW9kZS0+aHRvdGFsIC0gbW9kZS0+aHN5bmNfc3RhcnQpOworCWhzeW5jX2VuZF94ID0gbW9kZS0+aHRvdGFsIC0gKG1vZGUtPmhzeW5jX3N0YXJ0IC0gbW9kZS0+aGRpc3BsYXkpIC0gMTsKKworCXZzeW5jX3BlcmlvZCA9IG1vZGUtPnZ0b3RhbCAqIG1vZGUtPmh0b3RhbDsKKwl2c3luY19sZW4gPSAobW9kZS0+dnN5bmNfZW5kIC0gbW9kZS0+dnN5bmNfc3RhcnQpICogbW9kZS0+aHRvdGFsOworCWRpc3BsYXlfdl9zdGFydCA9IChtb2RlLT52dG90YWwgLSBtb2RlLT52c3luY19zdGFydCkgKiBtb2RlLT5odG90YWwgKyBkdHZfaHN5bmNfc2tldzsKKwlkaXNwbGF5X3ZfZW5kID0gdnN5bmNfcGVyaW9kIC0gKChtb2RlLT52c3luY19zdGFydCAtIG1vZGUtPnZkaXNwbGF5KSAqIG1vZGUtPmh0b3RhbCkgKyBkdHZfaHN5bmNfc2tldyAtIDE7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX0hTWU5DX0NUTChpbnRmKSwKKwkJCU1EUDVfSU5URl9IU1lOQ19DVExfUFVMU0VXKG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0KSB8CisJCQlNRFA1X0lOVEZfSFNZTkNfQ1RMX1BFUklPRChtb2RlLT5odG90YWwpKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX1ZTWU5DX1BFUklPRF9GMChpbnRmKSwgdnN5bmNfcGVyaW9kKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX1ZTWU5DX0xFTl9GMChpbnRmKSwgdnN5bmNfbGVuKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfSENUTChpbnRmKSwKKwkJCU1EUDVfSU5URl9ESVNQTEFZX0hDVExfU1RBUlQoaHN5bmNfc3RhcnRfeCkgfAorCQkJTURQNV9JTlRGX0RJU1BMQVlfSENUTF9FTkQoaHN5bmNfZW5kX3gpKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX0RJU1BMQVlfVlNUQVJUX0YwKGludGYpLCBkaXNwbGF5X3Zfc3RhcnQpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfRElTUExBWV9WRU5EX0YwKGludGYpLCBkaXNwbGF5X3ZfZW5kKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX0JPUkRFUl9DT0xPUihpbnRmKSwgMCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfSU5URl9VTkRFUkZMT1dfQ09MT1IoaW50ZiksIDB4ZmYpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfSFNZTkNfU0tFVyhpbnRmKSwgZHR2X2hzeW5jX3NrZXcpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfUE9MQVJJVFlfQ1RMKGludGYpLCBjdHJsX3BvbCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfSU5URl9BQ1RJVkVfSENUTChpbnRmKSwKKwkJCU1EUDVfSU5URl9BQ1RJVkVfSENUTF9TVEFSVCgwKSB8CisJCQlNRFA1X0lOVEZfQUNUSVZFX0hDVExfRU5EKDApKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX0FDVElWRV9WU1RBUlRfRjAoaW50ZiksIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfQUNUSVZFX1ZFTkRfRjAoaW50ZiksIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfUEFORUxfRk9STUFUKGludGYpLCBmb3JtYXQpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfRlJBTUVfTElORV9DT1VOVF9FTihpbnRmKSwgMHgzKTsgIC8qIGZyYW1lK2xpbmU/ICovCit9CisKK3N0YXRpYyB2b2lkIG1kcDVfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwltZHA1X2VuY29kZXJfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7Cit9CisKK3N0YXRpYyB2b2lkIG1kcDVfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBtZHA1X2VuY29kZXIgKm1kcDVfZW5jb2RlciA9IHRvX21kcDVfZW5jb2RlcihlbmNvZGVyKTsKKwltZHA1X2NydGNfc2V0X2ludGYoZW5jb2Rlci0+Y3J0YywgbWRwNV9lbmNvZGVyLT5pbnRmLAorCQkJbWRwNV9lbmNvZGVyLT5pbnRmX2lkKTsKKwltZHA1X2VuY29kZXJfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbWRwNV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG1kcDVfZW5jb2Rlcl9kcG1zLAorCS5tb2RlX2ZpeHVwID0gbWRwNV9lbmNvZGVyX21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gbWRwNV9lbmNvZGVyX21vZGVfc2V0LAorCS5wcmVwYXJlID0gbWRwNV9lbmNvZGVyX3ByZXBhcmUsCisJLmNvbW1pdCA9IG1kcDVfZW5jb2Rlcl9jb21taXQsCit9OworCisvKiBpbml0aWFsaXplIGVuY29kZXIgKi8KK3N0cnVjdCBkcm1fZW5jb2RlciAqbWRwNV9lbmNvZGVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGludGYsCisJCWVudW0gbWRwNV9pbnRmIGludGZfaWQpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gTlVMTDsKKwlzdHJ1Y3QgbWRwNV9lbmNvZGVyICptZHA1X2VuY29kZXI7CisJaW50IHJldDsKKworCW1kcDVfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCptZHA1X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kcDVfZW5jb2RlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbWRwNV9lbmNvZGVyLT5pbnRmID0gaW50ZjsKKwltZHA1X2VuY29kZXItPmludGZfaWQgPSBpbnRmX2lkOworCWVuY29kZXIgPSAmbWRwNV9lbmNvZGVyLT5iYXNlOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZtZHA1X2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZtZHA1X2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKKworCWJzX2luaXQobWRwNV9lbmNvZGVyKTsKKworCXJldHVybiBlbmNvZGVyOworCitmYWlsOgorCWlmIChlbmNvZGVyKQorCQltZHA1X2VuY29kZXJfZGVzdHJveShlbmNvZGVyKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzZDQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9pcnEuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworI2luY2x1ZGUgIm1zbV9kcnYuaCIKKyNpbmNsdWRlICJtZHA1X2ttcy5oIgorCit2b2lkIG1kcDVfc2V0X2lycW1hc2soc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMsIHVpbnQzMl90IGlycW1hc2spCit7CisJbWRwNV93cml0ZSh0b19tZHA1X2ttcyhtZHBfa21zKSwgUkVHX01EUDVfSU5UUl9FTiwgaXJxbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIG1kcDVfaXJxX2Vycm9yX2hhbmRsZXIoc3RydWN0IG1kcF9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKQoreworCURSTV9FUlJPUigiZXJyb3JzOiAlMDh4XG4iLCBpcnFzdGF0dXMpOworfQorCit2b2lkIG1kcDVfaXJxX3ByZWluc3RhbGwoc3RydWN0IG1zbV9rbXMgKmttcykKK3sKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhrbXMpKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRSX0NMRUFSLCAweGZmZmZmZmZmKTsKK30KKworaW50IG1kcDVfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBtc21fa21zICprbXMpCit7CisJc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMgPSB0b19tZHBfa21zKGttcyk7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IHRvX21kcDVfa21zKG1kcF9rbXMpOworCXN0cnVjdCBtZHBfaXJxICplcnJvcl9oYW5kbGVyID0gJm1kcDVfa21zLT5lcnJvcl9oYW5kbGVyOworCisJZXJyb3JfaGFuZGxlci0+aXJxID0gbWRwNV9pcnFfZXJyb3JfaGFuZGxlcjsKKwllcnJvcl9oYW5kbGVyLT5pcnFtYXNrID0gTURQNV9JUlFfSU5URjBfVU5ERVJfUlVOIHwKKwkJCU1EUDVfSVJRX0lOVEYxX1VOREVSX1JVTiB8CisJCQlNRFA1X0lSUV9JTlRGMl9VTkRFUl9SVU4gfAorCQkJTURQNV9JUlFfSU5URjNfVU5ERVJfUlVOOworCisJbWRwX2lycV9yZWdpc3RlcihtZHBfa21zLCBlcnJvcl9oYW5kbGVyKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG1kcDVfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKQoreworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSB0b19tZHA1X2ttcyh0b19tZHBfa21zKGttcykpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVFJfRU4sIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZCBtZHA1X2lycV9tZHAoc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMpCit7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IHRvX21kcDVfa21zKG1kcF9rbXMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtZHA1X2ttcy0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBpZDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtZHA1X3JlYWQobWRwNV9rbXMsIFJFR19NRFA1X0lOVFJfU1RBVFVTKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRSX0NMRUFSLCBzdGF0dXMpOworCisJVkVSQigic3RhdHVzPSUwOHgiLCBzdGF0dXMpOworCisJZm9yIChpZCA9IDA7IGlkIDwgcHJpdi0+bnVtX2NydGNzOyBpZCsrKQorCQlpZiAoc3RhdHVzICYgbWRwNV9jcnRjX3ZibGFuayhwcml2LT5jcnRjc1tpZF0pKQorCQkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBpZCk7CisKKwltZHBfZGlzcGF0Y2hfaXJxcyhtZHBfa21zLCBzdGF0dXMpOworfQorCitpcnFyZXR1cm5fdCBtZHA1X2lycShzdHJ1Y3QgbXNtX2ttcyAqa21zKQoreworCXN0cnVjdCBtZHBfa21zICptZHBfa21zID0gdG9fbWRwX2ttcyhrbXMpOworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSB0b19tZHA1X2ttcyhtZHBfa21zKTsKKwl1aW50MzJfdCBpbnRyOworCisJaW50ciA9IG1kcDVfcmVhZChtZHA1X2ttcywgUkVHX01EUDVfSFdfSU5UUl9TVEFUVVMpOworCisJVkVSQigiaW50cj0lMDh4IiwgaW50cik7CisKKwlpZiAoaW50ciAmIE1EUDVfSFdfSU5UUl9TVEFUVVNfSU5UUl9NRFApCisJCW1kcDVfaXJxX21kcChtZHBfa21zKTsKKworCWlmIChpbnRyICYgTURQNV9IV19JTlRSX1NUQVRVU19JTlRSX0hETUkpCisJCWhkbWlfaXJxKDAsIG1kcDVfa21zLT5oZG1pKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IG1kcDVfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgbXNtX2ttcyAqa21zLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJbWRwX3VwZGF0ZV92YmxhbmtfbWFzayh0b19tZHBfa21zKGttcyksCisJCQltZHA1X2NydGNfdmJsYW5rKGNydGMpLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZHA1X2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwltZHBfdXBkYXRlX3ZibGFua19tYXNrKHRvX21kcF9rbXMoa21zKSwKKwkJCW1kcDVfY3J0Y192YmxhbmsoY3J0YyksIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9rbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg0NDZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2ttcy5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSAibXNtX2Rydi5oIgorI2luY2x1ZGUgIm1zbV9tbXUuaCIKKyNpbmNsdWRlICJtZHA1X2ttcy5oIgorCitzdGF0aWMgc3RydWN0IG1kcDVfcGxhdGZvcm1fY29uZmlnICptZHA1X2dldF9jb25maWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBtZHA1X2h3X2luaXQoc3RydWN0IG1zbV9rbXMgKmttcykKK3sKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhrbXMpKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbWRwNV9rbXMtPmRldjsKKwl1aW50MzJfdCB2ZXJzaW9uLCBtYWpvciwgbWlub3I7CisJaW50IHJldCA9IDA7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldi0+ZGV2KTsKKworCW1kcDVfZW5hYmxlKG1kcDVfa21zKTsKKwl2ZXJzaW9uID0gbWRwNV9yZWFkKG1kcDVfa21zLCBSRUdfTURQNV9NRFBfVkVSU0lPTik7CisJbWRwNV9kaXNhYmxlKG1kcDVfa21zKTsKKworCW1ham9yID0gRklFTEQodmVyc2lvbiwgTURQNV9NRFBfVkVSU0lPTl9NQUpPUik7CisJbWlub3IgPSBGSUVMRCh2ZXJzaW9uLCBNRFA1X01EUF9WRVJTSU9OX01JTk9SKTsKKworCURCRygiZm91bmQgTURQNSB2ZXJzaW9uIHYlZC4lZCIsIG1ham9yLCBtaW5vcik7CisKKwlpZiAoKG1ham9yICE9IDEpIHx8ICgobWlub3IgIT0gMCkgJiYgKG1pbm9yICE9IDIpKSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAidW5leHBlY3RlZCBNRFAgdmVyc2lvbjogdiVkLiVkXG4iLAorCQkJCW1ham9yLCBtaW5vcik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJbWRwNV9rbXMtPnJldiA9IG1pbm9yOworCisJLyogTWFnaWMgdW5rbm93biByZWdpc3RlciB3cml0ZXM6CisJICoKKwkgKiAgICBXIFZCSUY6MHgwMDQgMDAwMDAwMDEgICAgICAobWRzc19tZHAuYzo4MzkpCisJICogICAgVyBNRFA1OjB4MmUwIDB4ZTkgICAgICAgICAgKG1kc3NfbWRwLmM6ODM5KQorCSAqICAgIFcgTURQNToweDJlNCAweDU1ICAgICAgICAgIChtZHNzX21kcC5jOjgzOSkKKwkgKiAgICBXIE1EUDU6MHgzYWMgMHhjMDAwMGNjYyAgICAobWRzc19tZHAuYzo4MzkpCisJICogICAgVyBNRFA1OjB4M2I0IDB4YzAwMDBjY2MgICAgKG1kc3NfbWRwLmM6ODM5KQorCSAqICAgIFcgTURQNToweDNiYyAweGNjY2NjYyAgICAgIChtZHNzX21kcC5jOjgzOSkKKwkgKiAgICBXIE1EUDU6MHg0YTggMHhjY2NjMGMwICAgICAobWRzc19tZHAuYzo4MzkpCisJICogICAgVyBNRFA1OjB4NGIwIDB4Y2NjY2MwYzAgICAgKG1kc3NfbWRwLmM6ODM5KQorCSAqICAgIFcgTURQNToweDRiOCAweGNjY2NjMDAwICAgIChtZHNzX21kcC5jOjgzOSkKKwkgKgorCSAqIERvd25zdHJlYW0gZmJkZXYgZHJpdmVyIGdldHMgdGhlc2UgcmVnaXN0ZXIgb2Zmc2V0cy92YWx1ZXMKKwkgKiBmcm9tIERULi4gbm90IHJlYWxseSBzdXJlIHdoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBvciBpZgorCSAqIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGRpZmZlcmVudCBib2FyZHMvU29DJ3MsIGV0Yy4gIEkgZ3Vlc3MKKwkgKiB0aGV5IGFyZSB0aGUgZ29sZGVuIHJlZ2lzdGVycy4KKwkgKgorCSAqIE5vdCBzZXR0aW5nIHRoZXNlIGRvZXMgbm90IHNlZW0gdG8gY2F1c2UgYW55IHByb2JsZW0uICBCdXQKKwkgKiB3ZSBtYXkgYmUgZ2V0dGluZyBsdWNreSB3aXRoIHRoZSBib290bG9hZGVyIGluaXRpYWxpemluZworCSAqIHRoZW0gZm9yIHVzLiAgT1RPSCwgaWYgd2UgY2FuIGFsd2F5cyBjb3VudCBvbiB0aGUgYm9vdGxvYWRlcgorCSAqIHNldHRpbmcgdGhlIGdvbGRlbiByZWdpc3RlcnMsIHRoZW4gcGVyaGFwcyB3ZSBkb24ndCBuZWVkIHRvCisJICogY2FyZS4KKwkgKi8KKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0RJU1BfSU5URl9TRUwsIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9PUCgwKSwgMCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfQ1RMX09QKDEpLCAwKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9DVExfT1AoMiksIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0NUTF9PUCgzKSwgMCk7CisKK291dDoKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldi0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIG1kcDVfcm91bmRfcGl4Y2xrKHN0cnVjdCBtc21fa21zICprbXMsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgdm9pZCBtZHA1X3ByZWNsb3NlKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhrbXMpKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gbWRwNV9rbXMtPmRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fY3J0Y3M7IGkrKykKKwkJbWRwNV9jcnRjX2NhbmNlbF9wZW5kaW5nX2ZsaXAocHJpdi0+Y3J0Y3NbaV0sIGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBtZHA1X2Rlc3Ryb3koc3RydWN0IG1zbV9rbXMgKmttcykKK3sKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhrbXMpKTsKKwlrZnJlZShtZHA1X2ttcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRwX2ttc19mdW5jcyBrbXNfZnVuY3MgPSB7CisJLmJhc2UgPSB7CisJCS5od19pbml0ICAgICAgICAgPSBtZHA1X2h3X2luaXQsCisJCS5pcnFfcHJlaW5zdGFsbCAgPSBtZHA1X2lycV9wcmVpbnN0YWxsLAorCQkuaXJxX3Bvc3RpbnN0YWxsID0gbWRwNV9pcnFfcG9zdGluc3RhbGwsCisJCS5pcnFfdW5pbnN0YWxsICAgPSBtZHA1X2lycV91bmluc3RhbGwsCisJCS5pcnEgICAgICAgICAgICAgPSBtZHA1X2lycSwKKwkJLmVuYWJsZV92YmxhbmsgICA9IG1kcDVfZW5hYmxlX3ZibGFuaywKKwkJLmRpc2FibGVfdmJsYW5rICA9IG1kcDVfZGlzYWJsZV92YmxhbmssCisJCS5nZXRfZm9ybWF0ICAgICAgPSBtZHBfZ2V0X2Zvcm1hdCwKKwkJLnJvdW5kX3BpeGNsayAgICA9IG1kcDVfcm91bmRfcGl4Y2xrLAorCQkucHJlY2xvc2UgICAgICAgID0gbWRwNV9wcmVjbG9zZSwKKwkJLmRlc3Ryb3kgICAgICAgICA9IG1kcDVfZGVzdHJveSwKKwl9LAorCS5zZXRfaXJxbWFzayAgICAgICAgID0gbWRwNV9zZXRfaXJxbWFzaywKK307CisKK2ludCBtZHA1X2Rpc2FibGUoc3RydWN0IG1kcDVfa21zICptZHA1X2ttcykKK3sKKwlEQkcoIiIpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1kcDVfa21zLT5haGJfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobWRwNV9rbXMtPmF4aV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShtZHA1X2ttcy0+Y29yZV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShtZHA1X2ttcy0+bHV0X2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1kcDVfZW5hYmxlKHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMpCit7CisJREJHKCIiKTsKKworCWNsa19wcmVwYXJlX2VuYWJsZShtZHA1X2ttcy0+YWhiX2Nsayk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKG1kcDVfa21zLT5heGlfY2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUobWRwNV9rbXMtPmNvcmVfY2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUobWRwNV9rbXMtPmx1dF9jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9kZXNldF9pbml0KHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMpCit7CisJc3RhdGljIGNvbnN0IGVudW0gbWRwNV9waXBlIGNydGNzW10gPSB7CisJCQlTU1BQX1JHQjAsIFNTUFBfUkdCMSwgU1NQUF9SR0IyLAorCX07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1kcDVfa21zLT5kZXY7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWludCBpLCByZXQ7CisKKwkvKiBjb25zdHJ1Y3QgQ1JUQ3M6ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3J0Y3MpOyBpKyspIHsKKwkJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CisJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCQlwbGFuZSA9IG1kcDVfcGxhbmVfaW5pdChkZXYsIGNydGNzW2ldLCB0cnVlKTsKKwkJaWYgKElTX0VSUihwbGFuZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGxhbmUpOworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBjb25zdHJ1Y3QgcGxhbmUgZm9yICVzICglZClcbiIsCisJCQkJCXBpcGUybmFtZShjcnRjc1tpXSksIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQljcnRjICA9IG1kcDVfY3J0Y19pbml0KGRldiwgcGxhbmUsIGkpOworCQlpZiAoSVNfRVJSKGNydGMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNydGMpOworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBjb25zdHJ1Y3QgY3J0YyBmb3IgJXMgKCVkKVxuIiwKKwkJCQkJcGlwZTJuYW1lKGNydGNzW2ldKSwgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcml2LT5jcnRjc1twcml2LT5udW1fY3J0Y3MrK10gPSBjcnRjOworCX0KKworCS8qIENvbnN0cnVjdCBlbmNvZGVyIGZvciBIRE1JOiAqLworCWVuY29kZXIgPSBtZHA1X2VuY29kZXJfaW5pdChkZXYsIDMsIElOVEZfSERNSSk7CisJaWYgKElTX0VSUihlbmNvZGVyKSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvbnN0cnVjdCBlbmNvZGVyXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihlbmNvZGVyKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIE5PVEU6IHRoZSB2c3luYyBhbmQgZXJyb3IgaXJxJ3MgYXJlIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aAorCSAqIHRoZSBJTlRGL2VuY29kZXIuLiB0aGUgZWFzaWVzdCB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgKGllLiB3aGF0CisJICogd2UgZG8gbm93KSBpcyBhc3N1bWUgYSBmaXhlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjcnRjJ3MgYW5kCisJICogZW5jb2RlcnMuICBJJ20gbm90IHN1cmUgaWYgdGhlcmUgaXMgZXZlciBhIG5lZWQgdG8gbW9yZSBmcmVlbHkKKwkgKiBhc3NpZ24gY3J0Y3MgdG8gZW5jb2RlcnMsIGJ1dCBpZiB0aGVyZSBpcyB0aGVuIHdlIG5lZWQgdG8gdGFrZQorCSAqIGNhcmUgb2YgZXJyb3IgYW5kIHZibGFuayBpcnEncyB0aGF0IHRoZSBjcnRjIGhhcyByZWdpc3RlcmVkLAorCSAqIGFuZCBhbHNvIHVwZGF0ZSB1c2VyLXJlcXVlc3RlZCB2YmxhbmtfbWFzay4KKwkgKi8KKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IEJJVCgwKTsKKwltZHA1X2NydGNfc2V0X2ludGYocHJpdi0+Y3J0Y3NbMF0sIDMsIElOVEZfSERNSSk7CisKKwlwcml2LT5lbmNvZGVyc1twcml2LT5udW1fZW5jb2RlcnMrK10gPSBlbmNvZGVyOworCisJLyogQ29uc3RydWN0IGJyaWRnZS9jb25uZWN0b3IgZm9yIEhETUk6ICovCisJbWRwNV9rbXMtPmhkbWkgPSBoZG1pX2luaXQoZGV2LCBlbmNvZGVyKTsKKwlpZiAoSVNfRVJSKG1kcDVfa21zLT5oZG1pKSkgeworCQlyZXQgPSBQVFJfRVJSKG1kcDVfa21zLT5oZG1pKTsKKwkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIEhETUk6ICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlvbW11X3BvcnRzW10gPSB7CisJCSJtZHBfMCIsCit9OworCitzdGF0aWMgaW50IGdldF9jbGsoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqKmNsa3AsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgY2xrICpjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBuYW1lKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0ICVzICglbGQpXG4iLCBuYW1lLCBQVFJfRVJSKGNsaykpOworCQlyZXR1cm4gUFRSX0VSUihjbGspOworCX0KKwkqY2xrcCA9IGNsazsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zbV9rbXMgKm1kcDVfa21zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2LT5wbGF0Zm9ybWRldjsKKwlzdHJ1Y3QgbWRwNV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IG1kcDVfZ2V0X2NvbmZpZyhwZGV2KTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zOworCXN0cnVjdCBtc21fa21zICprbXMgPSBOVUxMOworCXN0cnVjdCBtc21fbW11ICptbXU7CisJaW50IHJldDsKKworCW1kcDVfa21zID0ga3phbGxvYyhzaXplb2YoKm1kcDVfa21zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZHA1X2ttcykgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGttc1xuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZHBfa21zX2luaXQoJm1kcDVfa21zLT5iYXNlLCAma21zX2Z1bmNzKTsKKworCWttcyA9ICZtZHA1X2ttcy0+YmFzZS5iYXNlOworCisJbWRwNV9rbXMtPmRldiA9IGRldjsKKwltZHA1X2ttcy0+c21wX2Jsa19jbnQgPSBjb25maWctPnNtcF9ibGtfY250OworCisJbWRwNV9rbXMtPm1taW8gPSBtc21faW9yZW1hcChwZGV2LCAibWRwX3BoeXMiLCAiTURQNSIpOworCWlmIChJU19FUlIobWRwNV9rbXMtPm1taW8pKSB7CisJCXJldCA9IFBUUl9FUlIobWRwNV9rbXMtPm1taW8pOworCQlnb3RvIGZhaWw7CisJfQorCisJbWRwNV9rbXMtPnZiaWYgPSBtc21faW9yZW1hcChwZGV2LCAidmJpZl9waHlzIiwgIlZCSUYiKTsKKwlpZiAoSVNfRVJSKG1kcDVfa21zLT52YmlmKSkgeworCQlyZXQgPSBQVFJfRVJSKG1kcDVfa21zLT52YmlmKTsKKwkJZ290byBmYWlsOworCX0KKworCW1kcDVfa21zLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZCIpOworCWlmIChJU19FUlIobWRwNV9rbXMtPnZkZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtZHA1X2ttcy0+dmRkKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUobWRwNV9rbXMtPnZkZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3IgdmRkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGdldF9jbGsocGRldiwgJm1kcDVfa21zLT5heGlfY2xrLCAiYnVzX2NsayIpIHx8CisJCQlnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+YWhiX2NsaywgImlmYWNlX2NsayIpIHx8CisJCQlnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+c3JjX2NsaywgImNvcmVfY2xrX3NyYyIpIHx8CisJCQlnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+Y29yZV9jbGssICJjb3JlX2NsayIpIHx8CisJCQlnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+bHV0X2NsaywgImx1dF9jbGsiKSB8fAorCQkJZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPnZzeW5jX2NsaywgInZzeW5jX2NsayIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShtZHA1X2ttcy0+c3JjX2NsaywgY29uZmlnLT5tYXhfY2xrKTsKKworCS8qIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIG9mZiBiZWZvcmUgYXR0YWNoaW5nIGlvbW11IChib290bG9hZGVyIGNvdWxkCisJICogaGF2ZSBsZWZ0IHRoaW5ncyBvbiwgaW4gd2hpY2ggY2FzZSB3ZSdsbCBzdGFydCBnZXR0aW5nIGZhdWx0cyBpZgorCSAqIHdlIGRvbid0IGRpc2FibGUpOgorCSAqLworCW1kcDVfZW5hYmxlKG1kcDVfa21zKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX1RJTUlOR19FTkdJTkVfRU4oMCksIDApOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X0lOVEZfVElNSU5HX0VOR0lORV9FTigxKSwgMCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfSU5URl9USU1JTkdfRU5HSU5FX0VOKDIpLCAwKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9JTlRGX1RJTUlOR19FTkdJTkVfRU4oMyksIDApOworCW1kcDVfZGlzYWJsZShtZHA1X2ttcyk7CisJbWRlbGF5KDE2KTsKKworCWlmIChjb25maWctPmlvbW11KSB7CisJCW1tdSA9IG1zbV9pb21tdV9uZXcoZGV2LCBjb25maWctPmlvbW11KTsKKwkJaWYgKElTX0VSUihtbXUpKSB7CisJCQlyZXQgPSBQVFJfRVJSKG1tdSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmV0ID0gbW11LT5mdW5jcy0+YXR0YWNoKG1tdSwgaW9tbXVfcG9ydHMsCisJCQkJQVJSQVlfU0laRShpb21tdV9wb3J0cykpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCWRldl9pbmZvKGRldi0+ZGV2LCAibm8gaW9tbXUsIGZhbGxiYWNrIHRvIHBoeXMgIgorCQkJCSJjb250aWcgYnVmZmVycyBmb3Igc2Nhbm91dFxuIik7CisJCW1tdSA9IE5VTEw7CisJfQorCisJbWRwNV9rbXMtPmlkID0gbXNtX3JlZ2lzdGVyX21tdShkZXYsIG1tdSk7CisJaWYgKG1kcDVfa21zLT5pZCA8IDApIHsKKwkJcmV0ID0gbWRwNV9rbXMtPmlkOworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG1kcDUgaW9tbXU6ICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gbW9kZXNldF9pbml0KG1kcDVfa21zKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LT5kZXYsICJtb2Rlc2V0X2luaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBrbXM7CisKK2ZhaWw6CisJaWYgKGttcykKKwkJbWRwNV9kZXN0cm95KGttcyk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHN0cnVjdCBtZHA1X3BsYXRmb3JtX2NvbmZpZyAqbWRwNV9nZXRfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgc3RydWN0IG1kcDVfcGxhdGZvcm1fY29uZmlnIGNvbmZpZyA9IHt9OworI2lmZGVmIENPTkZJR19PRgorCS8qIFRPRE8gKi8KKyNlbmRpZgorCXJldHVybiAmY29uZmlnOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2ttcy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2ttcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjFhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfa21zLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fTURQNV9LTVNfSF9fCisjZGVmaW5lIF9fTURQNV9LTVNfSF9fCisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibXNtX2ttcy5oIgorI2luY2x1ZGUgIm1kcC9tZHBfa21zLmgiCisjaW5jbHVkZSAibWRwNS54bWwuaCIKKyNpbmNsdWRlICJtZHA1X3NtcC5oIgorCitzdHJ1Y3QgbWRwNV9rbXMgeworCXN0cnVjdCBtZHBfa21zIGJhc2U7CisKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCisJaW50IHJldjsKKworCS8qIG1hcHBlci1pZCB1c2VkIHRvIHJlcXVlc3QgR0VNIGJ1ZmZlciBtYXBwZWQgZm9yIHNjYW5vdXQ6ICovCisJaW50IGlkOworCisJLyogZm9yIHRyYWNraW5nIHNtcCBhbGxvY2F0aW9uIGFtb25nc3QgcGlwZXM6ICovCisJbWRwNV9zbXBfc3RhdGVfdCBzbXBfc3RhdGU7CisJc3RydWN0IG1kcDVfY2xpZW50X3NtcF9zdGF0ZSBzbXBfY2xpZW50X3N0YXRlW0NJRF9NQVhdOworCWludCBzbXBfYmxrX2NudDsKKworCS8qIGlvL3JlZ2lzdGVyIHNwYWNlczogKi8KKwl2b2lkIF9faW9tZW0gKm1taW8sICp2YmlmOworCisJc3RydWN0IHJlZ3VsYXRvciAqdmRkOworCisJc3RydWN0IGNsayAqYXhpX2NsazsKKwlzdHJ1Y3QgY2xrICphaGJfY2xrOworCXN0cnVjdCBjbGsgKnNyY19jbGs7CisJc3RydWN0IGNsayAqY29yZV9jbGs7CisJc3RydWN0IGNsayAqbHV0X2NsazsKKwlzdHJ1Y3QgY2xrICp2c3luY19jbGs7CisKKwlzdHJ1Y3QgaGRtaSAqaGRtaTsKKworCXN0cnVjdCBtZHBfaXJxIGVycm9yX2hhbmRsZXI7Cit9OworI2RlZmluZSB0b19tZHA1X2ttcyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IG1kcDVfa21zLCBiYXNlKQorCisvKiBwbGF0Zm9ybSBjb25maWcgZGF0YSAoaWUuIGZyb20gRFQsIG9yIHBkYXRhKSAqLworc3RydWN0IG1kcDVfcGxhdGZvcm1fY29uZmlnIHsKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdTsKKwl1aW50MzJfdCBtYXhfY2xrOworCWludCBzbXBfYmxrX2NudDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZHA1X3dyaXRlKHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMsIHUzMiByZWcsIHUzMiBkYXRhKQoreworCW1zbV93cml0ZWwoZGF0YSwgbWRwNV9rbXMtPm1taW8gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtZHA1X3JlYWQoc3RydWN0IG1kcDVfa21zICptZHA1X2ttcywgdTMyIHJlZykKK3sKKwlyZXR1cm4gbXNtX3JlYWRsKG1kcDVfa21zLT5tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwaXBlMm5hbWUoZW51bSBtZHA1X3BpcGUgcGlwZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsKKyNkZWZpbmUgTkFNRShuKSBbU1NQUF8gIyMgbl0gPSAjbgorCQlOQU1FKFZJRzApLCBOQU1FKFZJRzEpLCBOQU1FKFZJRzIpLAorCQlOQU1FKFJHQjApLCBOQU1FKFJHQjEpLCBOQU1FKFJHQjIpLAorCQlOQU1FKERNQTApLCBOQU1FKERNQTEpLAorI3VuZGVmIE5BTUUKKwl9OworCXJldHVybiBuYW1lc1twaXBlXTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBwaXBlMmZsdXNoKGVudW0gbWRwNV9waXBlIHBpcGUpCit7CisJc3dpdGNoIChwaXBlKSB7CisJY2FzZSBTU1BQX1ZJRzA6IHJldHVybiBNRFA1X0NUTF9GTFVTSF9WSUcwOworCWNhc2UgU1NQUF9WSUcxOiByZXR1cm4gTURQNV9DVExfRkxVU0hfVklHMTsKKwljYXNlIFNTUFBfVklHMjogcmV0dXJuIE1EUDVfQ1RMX0ZMVVNIX1ZJRzI7CisJY2FzZSBTU1BQX1JHQjA6IHJldHVybiBNRFA1X0NUTF9GTFVTSF9SR0IwOworCWNhc2UgU1NQUF9SR0IxOiByZXR1cm4gTURQNV9DVExfRkxVU0hfUkdCMTsKKwljYXNlIFNTUFBfUkdCMjogcmV0dXJuIE1EUDVfQ1RMX0ZMVVNIX1JHQjI7CisJY2FzZSBTU1BQX0RNQTA6IHJldHVybiBNRFA1X0NUTF9GTFVTSF9ETUEwOworCWNhc2UgU1NQUF9ETUExOiByZXR1cm4gTURQNV9DVExfRkxVU0hfRE1BMTsKKwlkZWZhdWx0OiAgICAgICAgcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBwaXBlMm5jbGllbnRzKGVudW0gbWRwNV9waXBlIHBpcGUpCit7CisJc3dpdGNoIChwaXBlKSB7CisJY2FzZSBTU1BQX1JHQjA6CisJY2FzZSBTU1BQX1JHQjE6CisJY2FzZSBTU1BQX1JHQjI6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAzOworCX0KK30KKworc3RhdGljIGlubGluZSBlbnVtIG1kcDVfY2xpZW50X2lkIHBpcGUyY2xpZW50KGVudW0gbWRwNV9waXBlIHBpcGUsIGludCBwbGFuZSkKK3sKKwlXQVJOX09OKHBsYW5lID49IHBpcGUybmNsaWVudHMocGlwZSkpOworCXN3aXRjaCAocGlwZSkgeworCWNhc2UgU1NQUF9WSUcwOiByZXR1cm4gQ0lEX1ZJRzBfWSArIHBsYW5lOworCWNhc2UgU1NQUF9WSUcxOiByZXR1cm4gQ0lEX1ZJRzFfWSArIHBsYW5lOworCWNhc2UgU1NQUF9WSUcyOiByZXR1cm4gQ0lEX1ZJRzJfWSArIHBsYW5lOworCWNhc2UgU1NQUF9SR0IwOiByZXR1cm4gQ0lEX1JHQjA7CisJY2FzZSBTU1BQX1JHQjE6IHJldHVybiBDSURfUkdCMTsKKwljYXNlIFNTUFBfUkdCMjogcmV0dXJuIENJRF9SR0IyOworCWNhc2UgU1NQUF9ETUEwOiByZXR1cm4gQ0lEX0RNQTBfWSArIHBsYW5lOworCWNhc2UgU1NQUF9ETUExOiByZXR1cm4gQ0lEX0RNQTFfWSArIHBsYW5lOworCWRlZmF1bHQ6ICAgICAgICByZXR1cm4gQ0lEX1VOVVNFRDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbWl4ZXIyZmx1c2goaW50IGxtKQoreworCXN3aXRjaCAobG0pIHsKKwljYXNlIDA6ICByZXR1cm4gTURQNV9DVExfRkxVU0hfTE0wOworCWNhc2UgMTogIHJldHVybiBNRFA1X0NUTF9GTFVTSF9MTTE7CisJY2FzZSAyOiAgcmV0dXJuIE1EUDVfQ1RMX0ZMVVNIX0xNMjsKKwlkZWZhdWx0OiByZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW50ZjJlcnIoaW50IGludGYpCit7CisJc3dpdGNoIChpbnRmKSB7CisJY2FzZSAwOiAgcmV0dXJuIE1EUDVfSVJRX0lOVEYwX1VOREVSX1JVTjsKKwljYXNlIDE6ICByZXR1cm4gTURQNV9JUlFfSU5URjFfVU5ERVJfUlVOOworCWNhc2UgMjogIHJldHVybiBNRFA1X0lSUV9JTlRGMl9VTkRFUl9SVU47CisJY2FzZSAzOiAgcmV0dXJuIE1EUDVfSVJRX0lOVEYzX1VOREVSX1JVTjsKKwlkZWZhdWx0OiByZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW50ZjJ2YmxhbmsoaW50IGludGYpCit7CisJc3dpdGNoIChpbnRmKSB7CisJY2FzZSAwOiAgcmV0dXJuIE1EUDVfSVJRX0lOVEYwX1ZTWU5DOworCWNhc2UgMTogIHJldHVybiBNRFA1X0lSUV9JTlRGMV9WU1lOQzsKKwljYXNlIDI6ICByZXR1cm4gTURQNV9JUlFfSU5URjJfVlNZTkM7CisJY2FzZSAzOiAgcmV0dXJuIE1EUDVfSVJRX0lOVEYzX1ZTWU5DOworCWRlZmF1bHQ6IHJldHVybiAwOworCX0KK30KKworaW50IG1kcDVfZGlzYWJsZShzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zKTsKK2ludCBtZHA1X2VuYWJsZShzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zKTsKKwordm9pZCBtZHA1X3NldF9pcnFtYXNrKHN0cnVjdCBtZHBfa21zICptZHBfa21zLCB1aW50MzJfdCBpcnFtYXNrKTsKK3ZvaWQgbWRwNV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKK2ludCBtZHA1X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKK3ZvaWQgbWRwNV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBtc21fa21zICprbXMpOworaXJxcmV0dXJuX3QgbWRwNV9pcnEoc3RydWN0IG1zbV9rbXMgKmttcyk7CitpbnQgbWRwNV9lbmFibGVfdmJsYW5rKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Cit2b2lkIG1kcDVfZGlzYWJsZV92Ymxhbmsoc3RydWN0IG1zbV9rbXMgKmttcywgc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKworc3RhdGljIGlubGluZQordWludDMyX3QgbWRwNV9nZXRfZm9ybWF0cyhlbnVtIG1kcDVfcGlwZSBwaXBlLCB1aW50MzJfdCAqcGl4ZWxfZm9ybWF0cywKKwkJdWludDMyX3QgbWF4X2Zvcm1hdHMpCit7CisJLyogVE9ETyB3aGVuIHdlIGhhdmUgWVVWLCB3ZSBuZWVkIHRvIGZpbHRlciBzdXBwb3J0ZWQgZm9ybWF0cworCSAqIGJhc2VkIG9uIHBpcGUgaWQuLgorCSAqLworCXJldHVybiBtZHBfZ2V0X2Zvcm1hdHMocGl4ZWxfZm9ybWF0cywgbWF4X2Zvcm1hdHMpOworfQorCit2b2lkIG1kcDVfcGxhbmVfaW5zdGFsbF9wcm9wZXJ0aWVzKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmopOwordm9pZCBtZHA1X3BsYW5lX3NldF9zY2Fub3V0KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7CitpbnQgbWRwNV9wbGFuZV9tb2RlX3NldChzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJaW50IGNydGNfeCwgaW50IGNydGNfeSwKKwkJdW5zaWduZWQgaW50IGNydGNfdywgdW5zaWduZWQgaW50IGNydGNfaCwKKwkJdWludDMyX3Qgc3JjX3gsIHVpbnQzMl90IHNyY195LAorCQl1aW50MzJfdCBzcmNfdywgdWludDMyX3Qgc3JjX2gpOwordm9pZCBtZHA1X3BsYW5lX2NvbXBsZXRlX2ZsaXAoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpOworZW51bSBtZHA1X3BpcGUgbWRwNV9wbGFuZV9waXBlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKTsKK3N0cnVjdCBkcm1fcGxhbmUgKm1kcDVfcGxhbmVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQllbnVtIG1kcDVfcGlwZSBwaXBlLCBib29sIHByaXZhdGVfcGxhbmUpOworCit1aW50MzJfdCBtZHA1X2NydGNfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisKK3ZvaWQgbWRwNV9jcnRjX2NhbmNlbF9wZW5kaW5nX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOwordm9pZCBtZHA1X2NydGNfc2V0X2ludGYoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgaW50ZiwKKwkJZW51bSBtZHA1X2ludGYgaW50Zl9pZCk7Cit2b2lkIG1kcDVfY3J0Y19hdHRhY2goc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSk7Cit2b2lkIG1kcDVfY3J0Y19kZXRhY2goc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSk7CitzdHJ1Y3QgZHJtX2NydGMgKm1kcDVfY3J0Y19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBpbnQgaWQpOworCitzdHJ1Y3QgZHJtX2VuY29kZXIgKm1kcDVfZW5jb2Rlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbnRmLAorCQllbnVtIG1kcDVfaW50ZiBpbnRmX2lkKTsKKworI2VuZGlmIC8qIF9fTURQNV9LTVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfcGxhbmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9wbGFuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzhiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfcGxhbmUuYwpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtZHA1X2ttcy5oIgorCisKK3N0cnVjdCBtZHA1X3BsYW5lIHsKKwlzdHJ1Y3QgZHJtX3BsYW5lIGJhc2U7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWVudW0gbWRwNV9waXBlIHBpcGU7CisKKwl1aW50MzJfdCBuZm9ybWF0czsKKwl1aW50MzJfdCBmb3JtYXRzWzMyXTsKKworCWJvb2wgZW5hYmxlZDsKK307CisjZGVmaW5lIHRvX21kcDVfcGxhbmUoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBtZHA1X3BsYW5lLCBiYXNlKQorCitzdGF0aWMgc3RydWN0IG1kcDVfa21zICpnZXRfa21zKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQoreworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBwbGFuZS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gdG9fbWRwNV9rbXModG9fbWRwX2ttcyhwcml2LT5rbXMpKTsKK30KKworc3RhdGljIGludCBtZHA1X3BsYW5lX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJaW50IGNydGNfeCwgaW50IGNydGNfeSwKKwkJdW5zaWduZWQgaW50IGNydGNfdywgdW5zaWduZWQgaW50IGNydGNfaCwKKwkJdWludDMyX3Qgc3JjX3gsIHVpbnQzMl90IHNyY195LAorCQl1aW50MzJfdCBzcmNfdywgdWludDMyX3Qgc3JjX2gpCit7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKworCW1kcDVfcGxhbmUtPmVuYWJsZWQgPSB0cnVlOworCisJaWYgKHBsYW5lLT5mYikKKwkJZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKHBsYW5lLT5mYik7CisKKwlkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKGZiKTsKKworCXJldHVybiBtZHA1X3BsYW5lX21vZGVfc2V0KHBsYW5lLCBjcnRjLCBmYiwKKwkJCWNydGNfeCwgY3J0Y195LCBjcnRjX3csIGNydGNfaCwKKwkJCXNyY194LCBzcmNfeSwgc3JjX3csIHNyY19oKTsKK30KKworc3RhdGljIGludCBtZHA1X3BsYW5lX2Rpc2FibGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gZ2V0X2ttcyhwbGFuZSk7CisJZW51bSBtZHA1X3BpcGUgcGlwZSA9IG1kcDVfcGxhbmUtPnBpcGU7CisJaW50IGk7CisKKwlEQkcoIiVzOiBkaXNhYmxlIiwgbWRwNV9wbGFuZS0+bmFtZSk7CisKKwkvKiB1cGRhdGUgb3VyIFNNUCByZXF1ZXN0IHRvIHplcm8gKHJlbGVhc2UgYWxsIG91ciBibGtzKTogKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGlwZTJuY2xpZW50cyhwaXBlKTsgaSsrKQorCQltZHA1X3NtcF9yZXF1ZXN0KG1kcDVfa21zLCBwaXBlMmNsaWVudChwaXBlLCBpKSwgMCk7CisKKwkvKiBUT0RPIGRldGFjaGluZyBub3cgd2lsbCBjYXVzZSB1cyBub3QgdG8gZ2V0IHRoZSBsYXN0CisJICogdmJsYW5rIGFuZCBtZHA1X3NtcF9jb21taXQoKS4uIHNvIG90aGVyIHBsYW5lcyB3aWxsCisJICogc3RpbGwgc2VlIHNtcCBibG9ja3MgcHJldmlvdXNseSBhbGxvY2F0ZWQgdG8gdXMgYXMKKwkgKiBpbi11c2UuLgorCSAqLworCWlmIChwbGFuZS0+Y3J0YykKKwkJbWRwNV9jcnRjX2RldGFjaChwbGFuZS0+Y3J0YywgcGxhbmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1kcDVfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlzdHJ1Y3QgbWRwNV9wbGFuZSAqbWRwNV9wbGFuZSA9IHRvX21kcDVfcGxhbmUocGxhbmUpOworCisJbWRwNV9wbGFuZV9kaXNhYmxlKHBsYW5lKTsKKwlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7CisKKwlrZnJlZShtZHA1X3BsYW5lKTsKK30KKworLyogaGVscGVyIHRvIGluc3RhbGwgcHJvcGVydGllcyB3aGljaCBhcmUgY29tbW9uIHRvIHBsYW5lcyBhbmQgY3J0Y3MgKi8KK3ZvaWQgbWRwNV9wbGFuZV9pbnN0YWxsX3Byb3BlcnRpZXMoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCisJCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iaikKK3sKKwkvLyBYWFgKK30KKworaW50IG1kcDVfcGxhbmVfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwgdWludDY0X3QgdmFsKQoreworCS8vIFhYWAorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9mdW5jcyBtZHA1X3BsYW5lX2Z1bmNzID0geworCQkudXBkYXRlX3BsYW5lID0gbWRwNV9wbGFuZV91cGRhdGUsCisJCS5kaXNhYmxlX3BsYW5lID0gbWRwNV9wbGFuZV9kaXNhYmxlLAorCQkuZGVzdHJveSA9IG1kcDVfcGxhbmVfZGVzdHJveSwKKwkJLnNldF9wcm9wZXJ0eSA9IG1kcDVfcGxhbmVfc2V0X3Byb3BlcnR5LAorfTsKKwordm9pZCBtZHA1X3BsYW5lX3NldF9zY2Fub3V0KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlzdHJ1Y3QgbWRwNV9wbGFuZSAqbWRwNV9wbGFuZSA9IHRvX21kcDVfcGxhbmUocGxhbmUpOworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSBnZXRfa21zKHBsYW5lKTsKKwllbnVtIG1kcDVfcGlwZSBwaXBlID0gbWRwNV9wbGFuZS0+cGlwZTsKKwl1aW50MzJfdCBucGxhbmVzID0gZHJtX2Zvcm1hdF9udW1fcGxhbmVzKGZiLT5waXhlbF9mb3JtYXQpOworCXVpbnQzMl90IGlvdmFbNF07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBsYW5lczsgaSsrKSB7CisJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqYm8gPSBtc21fZnJhbWVidWZmZXJfYm8oZmIsIGkpOworCQltc21fZ2VtX2dldF9pb3ZhKGJvLCBtZHA1X2ttcy0+aWQsICZpb3ZhW2ldKTsKKwl9CisJZm9yICg7IGkgPCA0OyBpKyspCisJCWlvdmFbaV0gPSAwOworCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfUElQRV9TUkNfU1RSSURFX0EocGlwZSksCisJCQlNRFA1X1BJUEVfU1JDX1NUUklERV9BX1AwKGZiLT5waXRjaGVzWzBdKSB8CisJCQlNRFA1X1BJUEVfU1JDX1NUUklERV9BX1AxKGZiLT5waXRjaGVzWzFdKSk7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQ19TVFJJREVfQihwaXBlKSwKKwkJCU1EUDVfUElQRV9TUkNfU1RSSURFX0JfUDIoZmItPnBpdGNoZXNbMl0pIHwKKwkJCU1EUDVfUElQRV9TUkNfU1RSSURFX0JfUDMoZmItPnBpdGNoZXNbM10pKTsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfU1JDMF9BRERSKHBpcGUpLCBpb3ZhWzBdKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQzFfQUREUihwaXBlKSwgaW92YVsxXSk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfUElQRV9TUkMyX0FERFIocGlwZSksIGlvdmFbMl0pOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfU1JDM19BRERSKHBpcGUpLCBpb3ZhWzNdKTsKKworCXBsYW5lLT5mYiA9IGZiOworfQorCisvKiBOT1RFOiBsb29rcyBsaWtlIGlmIGhvcml6b250YWwgZGVjaW1hdGlvbiBpcyB1c2VkIChpZiB3ZSBzdXBwb3J0ZWQgdGhhdCkKKyAqIHRoZW4gdGhlIHdpZHRoIHVzZWQgdG8gY2FsY3VsYXRlIFNNUCBibG9jayByZXF1aXJlbWVudHMgaXMgdGhlIHBvc3QtCisgKiBkZWNpbWF0ZWQgd2lkdGguICBJZS4gU01QIGJ1ZmZlcmluZyBzaXRzIGRvd25zdHJlYW0gb2YgZGVjaW1hdGlvbiAod2hpY2gKKyAqIHByZXN1bWFibHkgaGFwcGVucyBkdXJpbmcgdGhlIGRtYSBmcm9tIHNjYW5vdXQgYnVmZmVyKS4KKyAqLworc3RhdGljIGludCByZXF1ZXN0X3NtcF9ibG9ja3Moc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsIHVpbnQzMl90IGZvcm1hdCwKKwkJdWludDMyX3QgbnBsYW5lcywgdWludDMyX3Qgd2lkdGgpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBsYW5lLT5kZXY7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gZ2V0X2ttcyhwbGFuZSk7CisJZW51bSBtZHA1X3BpcGUgcGlwZSA9IG1kcDVfcGxhbmUtPnBpcGU7CisJaW50IGksIGhzdWIsIG5saW5lcywgbmJsa3MsIHJldDsKKworCWhzdWIgPSBkcm1fZm9ybWF0X2hvcnpfY2hyb21hX3N1YnNhbXBsaW5nKGZvcm1hdCk7CisKKwkvKiBkaWZmZXJlbnQgaWYgQldDIChjb21wcmVzc2VkIGZyYW1lYnVmZmVyPykgZW5hYmxlZDogKi8KKwlubGluZXMgPSAyOworCisJZm9yIChpID0gMCwgbmJsa3MgPSAwOyBpIDwgbnBsYW5lczsgaSsrKSB7CisJCWludCBuLCBmZXRjaF9zdHJpZGUsIGNwcDsKKworCQljcHAgPSBkcm1fZm9ybWF0X3BsYW5lX2NwcChmb3JtYXQsIGkpOworCQlmZXRjaF9zdHJpZGUgPSB3aWR0aCAqIGNwcCAvIChpID8gaHN1YiA6IDEpOworCisJCW4gPSBESVZfUk9VTkRfVVAoZmV0Y2hfc3RyaWRlICogbmxpbmVzLCBTTVBfQkxLX1NJWkUpOworCisJCS8qIGZvciBodyByZXYgdjEuMDAgKi8KKwkJaWYgKG1kcDVfa21zLT5yZXYgPT0gMCkKKwkJCW4gPSByb3VuZHVwX3Bvd19vZl90d28obik7CisKKwkJREJHKCIlc1slZF06IHJlcXVlc3QgJWQgU01QIGJsb2NrcyIsIG1kcDVfcGxhbmUtPm5hbWUsIGksIG4pOworCQlyZXQgPSBtZHA1X3NtcF9yZXF1ZXN0KG1kcDVfa21zLCBwaXBlMmNsaWVudChwaXBlLCBpKSwgbik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgJWQgU01QIGJsb2NrczogJWRcbiIsCisJCQkJCW4sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbmJsa3MgKz0gbjsKKwl9CisKKwkvKiBpbiBzdWNjZXNzIGNhc2UsIHJldHVybiB0b3RhbCAjIG9mIGJsb2NrcyBhbGxvY2F0ZWQ6ICovCisJcmV0dXJuIG5ibGtzOworfQorCitzdGF0aWMgdm9pZCBzZXRfZmlmb190aHJlc2hvbGRzKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBpbnQgbmJsa3MpCit7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zID0gZ2V0X2ttcyhwbGFuZSk7CisJZW51bSBtZHA1X3BpcGUgcGlwZSA9IG1kcDVfcGxhbmUtPnBpcGU7CisJdWludDMyX3QgdmFsOworCisJLyogMS80IG9mIFNNUCBwb29sIHRoYXQgaXMgYmVpbmcgZmV0Y2hlZCAqLworCXZhbCA9IChuYmxrcyAqIFNNUF9FTlRSSUVTX1BFUl9CTEspIC8gNDsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfUkVRUFJJT19GSUZPX1dNXzAocGlwZSksIHZhbCAqIDEpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfUkVRUFJJT19GSUZPX1dNXzEocGlwZSksIHZhbCAqIDIpOworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfUkVRUFJJT19GSUZPX1dNXzIocGlwZSksIHZhbCAqIDMpOworCit9CisKK2ludCBtZHA1X3BsYW5lX21vZGVfc2V0KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQlpbnQgY3J0Y194LCBpbnQgY3J0Y195LAorCQl1bnNpZ25lZCBpbnQgY3J0Y193LCB1bnNpZ25lZCBpbnQgY3J0Y19oLAorCQl1aW50MzJfdCBzcmNfeCwgdWludDMyX3Qgc3JjX3ksCisJCXVpbnQzMl90IHNyY193LCB1aW50MzJfdCBzcmNfaCkKK3sKKwlzdHJ1Y3QgbWRwNV9wbGFuZSAqbWRwNV9wbGFuZSA9IHRvX21kcDVfcGxhbmUocGxhbmUpOworCXN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMgPSBnZXRfa21zKHBsYW5lKTsKKwllbnVtIG1kcDVfcGlwZSBwaXBlID0gbWRwNV9wbGFuZS0+cGlwZTsKKwljb25zdCBzdHJ1Y3QgbWRwX2Zvcm1hdCAqZm9ybWF0OworCXVpbnQzMl90IG5wbGFuZXMsIGNvbmZpZyA9IDA7CisJdWludDMyX3QgcGhhc2V4X3N0ZXAgPSAwLCBwaGFzZXlfc3RlcCA9IDA7CisJdWludDMyX3QgaGRlY20gPSAwLCB2ZGVjbSA9IDA7CisJaW50IGksIG5ibGtzOworCisJbnBsYW5lcyA9IGRybV9mb3JtYXRfbnVtX3BsYW5lcyhmYi0+cGl4ZWxfZm9ybWF0KTsKKworCS8qIGJhZCBmb3JtYXRzIHNob3VsZCBhbHJlYWR5IGJlIHJlamVjdGVkOiAqLworCWlmIChXQVJOX09OKG5wbGFuZXMgPiBwaXBlMm5jbGllbnRzKHBpcGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzcmMgdmFsdWVzIGFyZSBpbiBRMTYgZml4ZWQgcG9pbnQsIGNvbnZlcnQgdG8gaW50ZWdlcjogKi8KKwlzcmNfeCA9IHNyY194ID4+IDE2OworCXNyY195ID0gc3JjX3kgPj4gMTY7CisJc3JjX3cgPSBzcmNfdyA+PiAxNjsKKwlzcmNfaCA9IHNyY19oID4+IDE2OworCisJREJHKCIlczogRkJbJXVdICV1LCV1LCV1LCV1IC0+IENSVENbJXVdICVkLCVkLCV1LCV1IiwgbWRwNV9wbGFuZS0+bmFtZSwKKwkJCWZiLT5iYXNlLmlkLCBzcmNfeCwgc3JjX3ksIHNyY193LCBzcmNfaCwKKwkJCWNydGMtPmJhc2UuaWQsIGNydGNfeCwgY3J0Y195LCBjcnRjX3csIGNydGNfaCk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBhbmQgcmVxdWVzdCByZXF1aXJlZCAjIG9mIHNtcCBibG9ja3M6CisJICovCisJbmJsa3MgPSByZXF1ZXN0X3NtcF9ibG9ja3MocGxhbmUsIGZiLT5waXhlbF9mb3JtYXQsIG5wbGFuZXMsIHNyY193KTsKKwlpZiAobmJsa3MgPCAwKQorCQlyZXR1cm4gbmJsa3M7CisKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSB1cGRhdGUgdGhlIGh3IGZvciBhbGxvY2F0aW9ucy9yZXF1ZXN0cyBpbW1lZGlhdGVseSwKKwkgKiBidXQgb25jZSBhdG9taWMgbW9kZXNldC9wYWdlZmxpcCBpcyBpbiBwbGFjZSwgdGhlIGFsbG9jYXRpb24KKwkgKiB3b3VsZCBtb3ZlIGludG8gYXRvbWljLT5jaGVja19wbGFuZV9zdGF0ZSgpLCB3aGlsZSB1cGRhdGluZyB0aGUKKwkgKiBodyB3b3VsZCByZW1haW4gaGVyZToKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGlwZTJuY2xpZW50cyhwaXBlKTsgaSsrKQorCQltZHA1X3NtcF9jb25maWd1cmUobWRwNV9rbXMsIHBpcGUyY2xpZW50KHBpcGUsIGkpKTsKKworCWlmIChzcmNfdyAhPSBjcnRjX3cpIHsKKwkJY29uZmlnIHw9IE1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVYX0VOOworCQkvKiBUT0RPIGNhbGMgcGhhc2V4X3N0ZXAsIGhkZWNtICovCisJfQorCisJaWYgKHNyY19oICE9IGNydGNfaCkgeworCQljb25maWcgfD0gTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfRU47CisJCS8qIFRPRE8gY2FsYyBwaGFzZXlfc3RlcCwgdmRlY20gKi8KKwl9CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQ19JTUdfU0laRShwaXBlKSwKKwkJCU1EUDVfUElQRV9TUkNfSU1HX1NJWkVfV0lEVEgoc3JjX3cpIHwKKwkJCU1EUDVfUElQRV9TUkNfSU1HX1NJWkVfSEVJR0hUKHNyY19oKSk7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQ19TSVpFKHBpcGUpLAorCQkJTURQNV9QSVBFX1NSQ19TSVpFX1dJRFRIKHNyY193KSB8CisJCQlNRFA1X1BJUEVfU1JDX1NJWkVfSEVJR0hUKHNyY19oKSk7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQ19YWShwaXBlKSwKKwkJCU1EUDVfUElQRV9TUkNfWFlfWChzcmNfeCkgfAorCQkJTURQNV9QSVBFX1NSQ19YWV9ZKHNyY195KSk7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX09VVF9TSVpFKHBpcGUpLAorCQkJTURQNV9QSVBFX09VVF9TSVpFX1dJRFRIKGNydGNfdykgfAorCQkJTURQNV9QSVBFX09VVF9TSVpFX0hFSUdIVChjcnRjX2gpKTsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfT1VUX1hZKHBpcGUpLAorCQkJTURQNV9QSVBFX09VVF9YWV9YKGNydGNfeCkgfAorCQkJTURQNV9QSVBFX09VVF9YWV9ZKGNydGNfeSkpOworCisJbWRwNV9wbGFuZV9zZXRfc2Nhbm91dChwbGFuZSwgZmIpOworCisJZm9ybWF0ID0gdG9fbWRwX2Zvcm1hdChtc21fZnJhbWVidWZmZXJfZm9ybWF0KGZiKSk7CisKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX1NSQ19GT1JNQVQocGlwZSksCisJCQlNRFA1X1BJUEVfU1JDX0ZPUk1BVF9BX0JQQyhmb3JtYXQtPmJwY19hKSB8CisJCQlNRFA1X1BJUEVfU1JDX0ZPUk1BVF9SX0JQQyhmb3JtYXQtPmJwY19yKSB8CisJCQlNRFA1X1BJUEVfU1JDX0ZPUk1BVF9HX0JQQyhmb3JtYXQtPmJwY19nKSB8CisJCQlNRFA1X1BJUEVfU1JDX0ZPUk1BVF9CX0JQQyhmb3JtYXQtPmJwY19iKSB8CisJCQlDT05EKGZvcm1hdC0+YWxwaGFfZW5hYmxlLCBNRFA1X1BJUEVfU1JDX0ZPUk1BVF9BTFBIQV9FTkFCTEUpIHwKKwkJCU1EUDVfUElQRV9TUkNfRk9STUFUX0NQUChmb3JtYXQtPmNwcCAtIDEpIHwKKwkJCU1EUDVfUElQRV9TUkNfRk9STUFUX1VOUEFDS19DT1VOVChmb3JtYXQtPnVucGFja19jb3VudCAtIDEpIHwKKwkJCUNPTkQoZm9ybWF0LT51bnBhY2tfdGlnaHQsIE1EUDVfUElQRV9TUkNfRk9STUFUX1VOUEFDS19USUdIVCkgfAorCQkJTURQNV9QSVBFX1NSQ19GT1JNQVRfTlVNX1BMQU5FUyhucGxhbmVzIC0gMSkgfAorCQkJTURQNV9QSVBFX1NSQ19GT1JNQVRfQ0hST01BX1NBTVAoQ0hST01BX1JHQikpOworCisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfUElQRV9TUkNfVU5QQUNLKHBpcGUpLAorCQkJTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTAoZm9ybWF0LT51bnBhY2tbMF0pIHwKKwkJCU1EUDVfUElQRV9TUkNfVU5QQUNLX0VMRU0xKGZvcm1hdC0+dW5wYWNrWzFdKSB8CisJCQlNRFA1X1BJUEVfU1JDX1VOUEFDS19FTEVNMihmb3JtYXQtPnVucGFja1syXSkgfAorCQkJTURQNV9QSVBFX1NSQ19VTlBBQ0tfRUxFTTMoZm9ybWF0LT51bnBhY2tbM10pKTsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfU1JDX09QX01PREUocGlwZSksCisJCQlNRFA1X1BJUEVfU1JDX09QX01PREVfQldDKEJXQ19MT1NTTEVTUykpOworCisJLyogbm90IHVzaW5nIHNlY3VyZSBtb2RlOiAqLworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfU1JDX0FERFJfU1dfU1RBVFVTKHBpcGUpLCAwKTsKKworCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1BJUEVfU0NBTEVfUEhBU0VfU1RFUF9YKHBpcGUpLCBwaGFzZXhfc3RlcCk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfUElQRV9TQ0FMRV9QSEFTRV9TVEVQX1kocGlwZSksIHBoYXNleV9zdGVwKTsKKwltZHA1X3dyaXRlKG1kcDVfa21zLCBSRUdfTURQNV9QSVBFX0RFQ0lNQVRJT04ocGlwZSksCisJCQlNRFA1X1BJUEVfREVDSU1BVElPTl9WRVJUKHZkZWNtKSB8CisJCQlNRFA1X1BJUEVfREVDSU1BVElPTl9IT1JaKGhkZWNtKSk7CisJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfUElQRV9TQ0FMRV9DT05GSUcocGlwZSksCisJCQlNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9NSU5fRklMVEVSKFNDQUxFX0ZJTFRFUl9ORUFSRVNUKSB8CisJCQlNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWV9NSU5fRklMVEVSKFNDQUxFX0ZJTFRFUl9ORUFSRVNUKSB8CisJCQlNRFA1X1BJUEVfU0NBTEVfQ09ORklHX1NDQUxFWF9DUl9GSUxURVIoU0NBTEVfRklMVEVSX05FQVJFU1QpIHwKKwkJCU1EUDVfUElQRV9TQ0FMRV9DT05GSUdfU0NBTEVZX0NSX0ZJTFRFUihTQ0FMRV9GSUxURVJfTkVBUkVTVCkgfAorCQkJTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVhfTUFYX0ZJTFRFUihTQ0FMRV9GSUxURVJfTkVBUkVTVCkgfAorCQkJTURQNV9QSVBFX1NDQUxFX0NPTkZJR19TQ0FMRVlfTUFYX0ZJTFRFUihTQ0FMRV9GSUxURVJfTkVBUkVTVCkpOworCisJc2V0X2ZpZm9fdGhyZXNob2xkcyhwbGFuZSwgbmJsa3MpOworCisJLyogVE9ETyBkZXRhY2ggZnJvbSBvbGQgY3J0YyAoaWYgd2UgaGFkIG1vcmUgdGhhbiBvbmUpICovCisJbWRwNV9jcnRjX2F0dGFjaChjcnRjLCBwbGFuZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZHA1X3BsYW5lX2NvbXBsZXRlX2ZsaXAoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IG1kcDVfa21zICptZHA1X2ttcyA9IGdldF9rbXMocGxhbmUpOworCWVudW0gbWRwNV9waXBlIHBpcGUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKS0+cGlwZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwaXBlMm5jbGllbnRzKHBpcGUpOyBpKyspCisJCW1kcDVfc21wX2NvbW1pdChtZHA1X2ttcywgcGlwZTJjbGllbnQocGlwZSwgaSkpOworfQorCitlbnVtIG1kcDVfcGlwZSBtZHA1X3BsYW5lX3BpcGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKwlyZXR1cm4gbWRwNV9wbGFuZS0+cGlwZTsKK30KKworLyogaW5pdGlhbGl6ZSBwbGFuZSAqLworc3RydWN0IGRybV9wbGFuZSAqbWRwNV9wbGFuZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCWVudW0gbWRwNV9waXBlIHBpcGUsIGJvb2wgcHJpdmF0ZV9wbGFuZSkKK3sKKwlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSA9IE5VTEw7CisJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmU7CisJaW50IHJldDsKKworCW1kcDVfcGxhbmUgPSBremFsbG9jKHNpemVvZigqbWRwNV9wbGFuZSksIEdGUF9LRVJORUwpOworCWlmICghbWRwNV9wbGFuZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJcGxhbmUgPSAmbWRwNV9wbGFuZS0+YmFzZTsKKworCW1kcDVfcGxhbmUtPnBpcGUgPSBwaXBlOworCW1kcDVfcGxhbmUtPm5hbWUgPSBwaXBlMm5hbWUocGlwZSk7CisKKwltZHA1X3BsYW5lLT5uZm9ybWF0cyA9IG1kcDVfZ2V0X2Zvcm1hdHMocGlwZSwgbWRwNV9wbGFuZS0+Zm9ybWF0cywKKwkJCUFSUkFZX1NJWkUobWRwNV9wbGFuZS0+Zm9ybWF0cykpOworCisJZHJtX3BsYW5lX2luaXQoZGV2LCBwbGFuZSwgMHhmZiwgJm1kcDVfcGxhbmVfZnVuY3MsCisJCQltZHA1X3BsYW5lLT5mb3JtYXRzLCBtZHA1X3BsYW5lLT5uZm9ybWF0cywKKwkJCXByaXZhdGVfcGxhbmUpOworCisJbWRwNV9wbGFuZV9pbnN0YWxsX3Byb3BlcnRpZXMocGxhbmUsICZwbGFuZS0+YmFzZSk7CisKKwlyZXR1cm4gcGxhbmU7CisKK2ZhaWw6CisJaWYgKHBsYW5lKQorCQltZHA1X3BsYW5lX2Rlc3Ryb3kocGxhbmUpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9zbXAuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDAyMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X3NtcC5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSAibWRwNV9rbXMuaCIKKyNpbmNsdWRlICJtZHA1X3NtcC5oIgorCisKKy8qIFNNUCAtIFNoYXJlZCBNZW1vcnkgUG9vbAorICoKKyAqIFRoZXNlIGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlIGNsaWVudHMsIHdoZXJlIGVhY2ggcGxhbmUgaW4gYQorICogc2Nhbm91dCBidWZmZXIgaXMgYSBTTVAgY2xpZW50LiAgSWUuIHNjYW5vdXQgb2YgMyBwbGFuZSBJNDIwIG9uCisgKiBwaXBlIFZJRzAgPT4gMyBjbGllbnRzOiBWSUcwX1ksIFZJRzBfQ0IsIFZJRzBfQ1IuCisgKgorICogQmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGF0dGFjaGVkIHNjYW5vdXQgYnVmZmVyLCBhIGNlcnRhaW4gIyBvZgorICogYmxvY2tzIG11c3QgYmUgYWxsb2NhdGVkIHRvIHRoYXQgY2xpZW50IG91dCBvZiB0aGUgc2hhcmVkIHBvb2wuCisgKgorICogRm9yIGVhY2ggYmxvY2ssIGl0IGNhbiBiZSBlaXRoZXIgZnJlZSwgb3IgcGVuZGluZy9pbi11c2UgYnkgYQorICogY2xpZW50LiAgVGhlIHVwZGF0ZXMgaGFwcGVuIGluIHRocmVlIHN0ZXBzOgorICoKKyAqICAxKSBtZHA1X3NtcF9yZXF1ZXN0KCk6CisgKiAgICAgV2hlbiBwbGFuZSBzY2Fub3V0IGlzIHNldHVwLCBjYWxjdWxhdGUgcmVxdWlyZWQgbnVtYmVyIG9mCisgKiAgICAgYmxvY2tzIG5lZWRlZCBwZXIgY2xpZW50LCBhbmQgcmVxdWVzdC4gIEJsb2NrcyBub3QgaW51c2Ugb3IKKyAqICAgICBwZW5kaW5nIGJ5IGFueSBvdGhlciBjbGllbnQgYXJlIGFkZGVkIHRvIGNsaWVudCdzIHBlbmRpbmcKKyAqICAgICBzZXQuCisgKgorICogIDIpIG1kcDVfc21wX2NvbmZpZ3VyZSgpOgorICogICAgIEFzIGh3IGlzIHByb2dyYW1tZWQsIGJlZm9yZSBGTFVTSCwgTURQNV9TTVBfQUxMT0MgcmVnaXN0ZXJzCisgKiAgICAgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoZSB1bmlvbihwZW5kaW5nLCBpbnVzZSkKKyAqCisgKiAgMykgbWRwNV9zbXBfY29tbWl0KCk6CisgKiAgICAgQWZ0ZXIgbmV4dCB2YmxhbmssIGNvcHkgcGVuZGluZyAtPiBpbnVzZS4gIE9wdGlvbmFsbHkgdXBkYXRlCisgKiAgICAgTURQNV9TTVBfQUxMT0MgcmVnaXN0ZXJzIGlmIHRoZXJlIGFyZSBuZXdseSB1bnVzZWQgYmxvY2tzCisgKgorICogT24gdGhlIG5leHQgdmJsYW5rIGFmdGVyIGNoYW5nZXMgaGF2ZSBiZWVuIGNvbW1pdHRlZCB0byBodywgdGhlCisgKiBjbGllbnQncyBwZW5kaW5nIGJsb2NrcyBiZWNvbWUgaXQncyBpbi11c2UgYmxvY2tzIChhbmQgbm8tbG9uZ2VyCisgKiBpbi11c2UgYmxvY2tzIGJlY29tZSBhdmFpbGFibGUgdG8gb3RoZXIgY2xpZW50cykuCisgKgorICogYnR3LCBodXJyYXkgZm9yIGNvbmZ1c2luZyBvdmVybG9hZGVkIGFjcm9ueW1zISAgOi0vCisgKgorICogTk9URTogZm9yIGF0b21pYyBtb2Rlc2V0L3BhZ2VmbGlwIE5PTkJMT0NLIG9wZXJhdGlvbnMsIHN0ZXAgIzEKKyAqIHNob3VsZCBoYXBwZW4gYXQgKG9yIGJlZm9yZSk/IGF0b21pYy0+Y2hlY2soKS4gIEFuZCB3ZSdkIG5lZWQKKyAqIGFuIEFQSSB0byBkaXNjYXJkIHByZXZpb3VzIHJlcXVlc3RzIGlmIHVwZGF0ZSBpcyBhYm9ydGVkIG9yCisgKiAodGVzdC1vbmx5KS4KKyAqCisgKiBUT0RPIHdvdWxkIHBlcmhhcHMgYmUgbmljZSB0byBoYXZlIGRlYnVnZnMgdG8gZHVtcCBvdXQga2VybmVsCisgKiBpbnVzZSBhbmQgcGVuZGluZyBzdGF0ZSBvZiBhbGwgY2xpZW50cy4uCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhzbXBfbG9jayk7CisKKworLyogc3RlcCAjMTogdXBkYXRlICMgb2YgYmxvY2tzIHBlbmRpbmcgZm9yIHRoZSBjbGllbnQ6ICovCitpbnQgbWRwNV9zbXBfcmVxdWVzdChzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zLAorCQllbnVtIG1kcDVfY2xpZW50X2lkIGNpZCwgaW50IG5ibGtzKQoreworCXN0cnVjdCBtZHA1X2NsaWVudF9zbXBfc3RhdGUgKnBzID0gJm1kcDVfa21zLT5zbXBfY2xpZW50X3N0YXRlW2NpZF07CisJaW50IGksIHJldCwgYXZhaWwsIGN1cl9uYmxrcywgY250ID0gbWRwNV9rbXMtPnNtcF9ibGtfY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21wX2xvY2ssIGZsYWdzKTsKKworCWF2YWlsID0gY250IC0gYml0bWFwX3dlaWdodChtZHA1X2ttcy0+c21wX3N0YXRlLCBjbnQpOworCWlmIChuYmxrcyA+IGF2YWlsKSB7CisJCXJldCA9IC1FTk9TUEM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljdXJfbmJsa3MgPSBiaXRtYXBfd2VpZ2h0KHBzLT5wZW5kaW5nLCBjbnQpOworCWlmIChuYmxrcyA+IGN1cl9uYmxrcykgeworCQkvKiBncm93IHRoZSBleGlzdGluZyBwZW5kaW5nIHJlc2VydmF0aW9uOiAqLworCQlmb3IgKGkgPSBjdXJfbmJsa3M7IGkgPCBuYmxrczsgaSsrKSB7CisJCQlpbnQgYmxrID0gZmluZF9maXJzdF96ZXJvX2JpdChtZHA1X2ttcy0+c21wX3N0YXRlLCBjbnQpOworCQkJc2V0X2JpdChibGssIHBzLT5wZW5kaW5nKTsKKwkJCXNldF9iaXQoYmxrLCBtZHA1X2ttcy0+c21wX3N0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHNocmluayB0aGUgZXhpc3RpbmcgcGVuZGluZyByZXNlcnZhdGlvbjogKi8KKwkJZm9yIChpID0gY3VyX25ibGtzOyBpID4gbmJsa3M7IGktLSkgeworCQkJaW50IGJsayA9IGZpbmRfZmlyc3RfYml0KHBzLT5wZW5kaW5nLCBjbnQpOworCQkJY2xlYXJfYml0KGJsaywgcHMtPnBlbmRpbmcpOworCQkJLyogZG9uJ3QgY2xlYXIgaW4gZ2xvYmFsIHNtcF9zdGF0ZSB1bnRpbCBfY29tbWl0KCkgKi8KKwkJfQorCX0KKworZmFpbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc21wX3N0YXRlKHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMsCisJCWVudW0gbWRwNV9jbGllbnRfaWQgY2lkLCBtZHA1X3NtcF9zdGF0ZV90ICphc3NpZ25lZCkKK3sKKwlpbnQgY250ID0gbWRwNV9rbXMtPnNtcF9ibGtfY250OworCXVpbnQzMl90IGJsaywgdmFsOworCisJZm9yX2VhY2hfc2V0X2JpdChibGssICphc3NpZ25lZCwgY250KSB7CisJCWludCBpZHggPSBibGsgLyAzOworCQlpbnQgZmxkID0gYmxrICUgMzsKKworCQl2YWwgPSBtZHA1X3JlYWQobWRwNV9rbXMsIFJFR19NRFA1X1NNUF9BTExPQ19XX1JFRyhpZHgpKTsKKworCQlzd2l0Y2ggKGZsZCkgeworCQljYXNlIDA6CisJCQl2YWwgJj0gfk1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDBfX01BU0s7CisJCQl2YWwgfD0gTURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMChjaWQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZhbCAmPSB+TURQNV9TTVBfQUxMT0NfV19SRUdfQ0xJRU5UMV9fTUFTSzsKKwkJCXZhbCB8PSBNRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQxKGNpZCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmFsICY9IH5NRFA1X1NNUF9BTExPQ19XX1JFR19DTElFTlQyX19NQVNLOworCQkJdmFsIHw9IE1EUDVfU01QX0FMTE9DX1dfUkVHX0NMSUVOVDIoY2lkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWRwNV93cml0ZShtZHA1X2ttcywgUkVHX01EUDVfU01QX0FMTE9DX1dfUkVHKGlkeCksIHZhbCk7CisJCW1kcDVfd3JpdGUobWRwNV9rbXMsIFJFR19NRFA1X1NNUF9BTExPQ19SX1JFRyhpZHgpLCB2YWwpOworCX0KK30KKworLyogc3RlcCAjMjogY29uZmlndXJlIGh3IGZvciB1bmlvbihwZW5kaW5nLCBpbnVzZSk6ICovCit2b2lkIG1kcDVfc21wX2NvbmZpZ3VyZShzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zLCBlbnVtIG1kcDVfY2xpZW50X2lkIGNpZCkKK3sKKwlzdHJ1Y3QgbWRwNV9jbGllbnRfc21wX3N0YXRlICpwcyA9ICZtZHA1X2ttcy0+c21wX2NsaWVudF9zdGF0ZVtjaWRdOworCWludCBjbnQgPSBtZHA1X2ttcy0+c21wX2Jsa19jbnQ7CisJbWRwNV9zbXBfc3RhdGVfdCBhc3NpZ25lZDsKKworCWJpdG1hcF9vcihhc3NpZ25lZCwgcHMtPmludXNlLCBwcy0+cGVuZGluZywgY250KTsKKwl1cGRhdGVfc21wX3N0YXRlKG1kcDVfa21zLCBjaWQsICZhc3NpZ25lZCk7Cit9CisKKy8qIHN0ZXAgIzM6IGFmdGVyIHZibGFuaywgY29weSBwZW5kaW5nIC0+IGludXNlOiAqLwordm9pZCBtZHA1X3NtcF9jb21taXQoc3RydWN0IG1kcDVfa21zICptZHA1X2ttcywgZW51bSBtZHA1X2NsaWVudF9pZCBjaWQpCit7CisJc3RydWN0IG1kcDVfY2xpZW50X3NtcF9zdGF0ZSAqcHMgPSAmbWRwNV9rbXMtPnNtcF9jbGllbnRfc3RhdGVbY2lkXTsKKwlpbnQgY250ID0gbWRwNV9rbXMtPnNtcF9ibGtfY250OworCW1kcDVfc21wX3N0YXRlX3QgcmVsZWFzZWQ7CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIGFueSBibG9ja3Mgd2Ugd2hlcmUgcHJldmlvdXNseQorCSAqIHVzaW5nLCB3aGljaCBjYW4gYmUgcmVsZWFzZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVyCisJICogY2xpZW50czoKKwkgKi8KKwlpZiAoYml0bWFwX2FuZG5vdChyZWxlYXNlZCwgcHMtPmludXNlLCBwcy0+cGVuZGluZywgY250KSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfbG9jaywgZmxhZ3MpOworCQkvKiBjbGVhciByZWxlYXNlZCBibG9ja3M6ICovCisJCWJpdG1hcF9hbmRub3QobWRwNV9rbXMtPnNtcF9zdGF0ZSwgbWRwNV9rbXMtPnNtcF9zdGF0ZSwKKwkJCQlyZWxlYXNlZCwgY250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21wX2xvY2ssIGZsYWdzKTsKKworCQl1cGRhdGVfc21wX3N0YXRlKG1kcDVfa21zLCBDSURfVU5VU0VELCAmcmVsZWFzZWQpOworCX0KKworCWJpdG1hcF9jb3B5KHBzLT5pbnVzZSwgcHMtPnBlbmRpbmcsIGNudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfc21wLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiNzM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9zbXAuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX01EUDVfU01QX0hfXworI2RlZmluZSBfX01EUDVfU01QX0hfXworCisjaW5jbHVkZSAibXNtX2Rydi5oIgorCisjZGVmaW5lIE1BWF9TTVBfQkxPQ0tTICAyMgorI2RlZmluZSBTTVBfQkxLX1NJWkUgICAgNDA5NgorI2RlZmluZSBTTVBfRU5UUklFU19QRVJfQkxLIChTTVBfQkxLX1NJWkUgLyAxNikKKwordHlwZWRlZiBERUNMQVJFX0JJVE1BUChtZHA1X3NtcF9zdGF0ZV90LCBNQVhfU01QX0JMT0NLUyk7CisKK3N0cnVjdCBtZHA1X2NsaWVudF9zbXBfc3RhdGUgeworCW1kcDVfc21wX3N0YXRlX3QgaW51c2U7CisJbWRwNV9zbXBfc3RhdGVfdCBwZW5kaW5nOworfTsKKworc3RydWN0IG1kcDVfa21zOworCitpbnQgbWRwNV9zbXBfcmVxdWVzdChzdHJ1Y3QgbWRwNV9rbXMgKm1kcDVfa21zLCBlbnVtIG1kcDVfY2xpZW50X2lkIGNpZCwgaW50IG5ibGtzKTsKK3ZvaWQgbWRwNV9zbXBfY29uZmlndXJlKHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMsIGVudW0gbWRwNV9jbGllbnRfaWQgY2lkKTsKK3ZvaWQgbWRwNV9zbXBfY29tbWl0KHN0cnVjdCBtZHA1X2ttcyAqbWRwNV9rbXMsIGVudW0gbWRwNV9jbGllbnRfaWQgY2lkKTsKKworCisjZW5kaWYgLyogX19NRFA1X1NNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcF9jb21tb24ueG1sLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfY29tbW9uLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjI5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfY29tbW9uLnhtbC5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgTURQX0NPTU1PTl9YTUwKKyNkZWZpbmUgTURQX0NPTU1PTl9YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZHJlbm8vZW52eXRvb2xzLmdpdAorCitUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6CistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21zbS54bWwgICAgICAgICAgICAgICAgICggICAgNjQ3IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTQ6NDU6MzUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2ZyZWVkcmVub19jb3B5cmlnaHQueG1sICggICAxNDUzIGJ5dGVzLCBmcm9tIDIwMTMtMDMtMzEgMTY6NTE6MjcpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA0LnhtbCAgICAgICAgICAgICggIDE3OTk2IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTk6MTA6MzEpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHBfY29tbW9uLnhtbCAgICAgICggICAxNjE1IGJ5dGVzLCBmcm9tIDIwMTMtMTEtMzAgMTU6MDA6NTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL21kcC9tZHA1LnhtbCAgICAgICAgICAgICggIDIyNTE3IGJ5dGVzLCBmcm9tIDIwMTMtMTItMDMgMjA6NTk6MTMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9kc2kueG1sICAgICAgICAgICAgICggIDExNzEyIGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTcgMTc6MTM6NDMpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9zZnBiLnhtbCAgICAgICAgICAgICggICAgMzQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTEgMTk6MjY6MzIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2RzaS9tbXNzX2NjLnhtbCAgICAgICAgICggICAxNTQ0IGJ5dGVzLCBmcm9tIDIwMTMtMDgtMTYgMTk6MTc6MDUpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvcWZwcm9tLnhtbCAgICAgICAgICggICAgNjAwIGJ5dGVzLCBmcm9tIDIwMTMtMDctMDUgMTk6MjE6MTIpCistIC9ob21lL3JvYmNsYXJrL3NyYy9mcmVlZHJlbm8vZW52eXRvb2xzL3JubmRiL2hkbWkvaGRtaS54bWwgICAgICAgICAgICggIDIwOTMyIGJ5dGVzLCBmcm9tIDIwMTMtMTItMDEgMTU6MTM6MDQpCisKK0NvcHlyaWdodCAoQykgMjAxMyBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CistIFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4gKHJvYmNsYXJrKQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCitlbnVtIG1kcF9taXhlcl9zdGFnZV9pZCB7CisJU1RBR0VfVU5VU0VEID0gMCwKKwlTVEFHRV9CQVNFID0gMSwKKwlTVEFHRTAgPSAyLAorCVNUQUdFMSA9IDMsCisJU1RBR0UyID0gNCwKKwlTVEFHRTMgPSA1LAorfTsKKworZW51bSBtZHBfYWxwaGFfdHlwZSB7CisJRkdfQ09OU1QgPSAwLAorCUJHX0NPTlNUID0gMSwKKwlGR19QSVhFTCA9IDIsCisJQkdfUElYRUwgPSAzLAorfTsKKworZW51bSBtZHBfYnBjIHsKKwlCUEMxID0gMCwKKwlCUEM1ID0gMSwKKwlCUEM2ID0gMiwKKwlCUEM4ID0gMywKK307CisKK2VudW0gbWRwX2JwY19hbHBoYSB7CisJQlBDMUEgPSAwLAorCUJQQzRBID0gMSwKKwlCUEM2QSA9IDIsCisJQlBDOEEgPSAzLAorfTsKKworCisjZW5kaWYgLyogTURQX0NPTU1PTl9YTUwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwNC9tZHA0X2Zvcm1hdC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwX2Zvcm1hdC5jCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZ3B1L2RybS9tc20vbWRwNC9tZHA0X2Zvcm1hdC5jCnJlbmFtZSB0byBkcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfZm9ybWF0LmMKaW5kZXggMTczMzBiMC4uZTBhNmZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfZm9ybWF0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwX2Zvcm1hdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAKIAogI2luY2x1ZGUgIm1zbV9kcnYuaCIKLSNpbmNsdWRlICJtZHA0X2ttcy5oIgorI2luY2x1ZGUgIm1kcF9rbXMuaCIKIAogI2RlZmluZSBGTVQobmFtZSwgYSwgciwgZywgYiwgZTAsIGUxLCBlMiwgZTMsIGFscGhhLCB0aWdodCwgYywgY250KSB7IFwKIAkJLmJhc2UgPSB7IC5waXhlbF9mb3JtYXQgPSBEUk1fRk9STUFUXyAjIyBuYW1lIH0sIFwKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2RlZmluZSBCUEMwQSAwCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWRwNF9mb3JtYXQgZm9ybWF0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtZHBfZm9ybWF0IGZvcm1hdHNbXSA9IHsKIAkvKiAgbmFtZSAgICAgIGEgIHIgIGcgIGIgICBlMCBlMSBlMiBlMyAgYWxwaGEgICB0aWdodCAgY3BwIGNudCAqLwogCUZNVChBUkdCODg4OCwgOCwgOCwgOCwgOCwgIDEsIDAsIDIsIDMsICB0cnVlLCAgIHRydWUsICA0LCAgNCksCiAJRk1UKFhSR0I4ODg4LCA4LCA4LCA4LCA4LCAgMSwgMCwgMiwgMywgIGZhbHNlLCAgdHJ1ZSwgIDQsICA0KSwKQEAgLTQ0LDEyICs0NCwxMSBAQAogCUZNVChCR1I1NjUsICAgMCwgNSwgNiwgNSwgIDIsIDAsIDEsIDAsICBmYWxzZSwgIHRydWUsICAyLCAgMyksCiB9OwogCi11aW50MzJfdCBtZHA0X2dldF9mb3JtYXRzKGVudW0gbWRwNF9waXBlIHBpcGVfaWQsIHVpbnQzMl90ICpwaXhlbF9mb3JtYXRzLAotCQl1aW50MzJfdCBtYXhfZm9ybWF0cykKK3VpbnQzMl90IG1kcF9nZXRfZm9ybWF0cyh1aW50MzJfdCAqcGl4ZWxfZm9ybWF0cywgdWludDMyX3QgbWF4X2Zvcm1hdHMpCiB7CiAJdWludDMyX3QgaTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgaSsrKSB7Ci0JCWNvbnN0IHN0cnVjdCBtZHA0X2Zvcm1hdCAqZiA9ICZmb3JtYXRzW2ldOworCQljb25zdCBzdHJ1Y3QgbWRwX2Zvcm1hdCAqZiA9ICZmb3JtYXRzW2ldOwogCiAJCWlmIChpID09IG1heF9mb3JtYXRzKQogCQkJYnJlYWs7CkBAIC02MCwxMSArNTksMTEgQEAKIAlyZXR1cm4gaTsKIH0KIAotY29uc3Qgc3RydWN0IG1zbV9mb3JtYXQgKm1kcDRfZ2V0X2Zvcm1hdChzdHJ1Y3QgbXNtX2ttcyAqa21zLCB1aW50MzJfdCBmb3JtYXQpCitjb25zdCBzdHJ1Y3QgbXNtX2Zvcm1hdCAqbWRwX2dldF9mb3JtYXQoc3RydWN0IG1zbV9rbXMgKmttcywgdWludDMyX3QgZm9ybWF0KQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IG1kcDRfZm9ybWF0ICpmID0gJmZvcm1hdHNbaV07CisJCWNvbnN0IHN0cnVjdCBtZHBfZm9ybWF0ICpmID0gJmZvcm1hdHNbaV07CiAJCWlmIChmLT5iYXNlLnBpeGVsX2Zvcm1hdCA9PSBmb3JtYXQpCiAJCQlyZXR1cm4gJmYtPmJhc2U7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwX2ttcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTQ4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfa21zLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibWRwX2ttcy5oIgorCisKK3N0cnVjdCBtZHBfaXJxX3dhaXQgeworCXN0cnVjdCBtZHBfaXJxIGlycTsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdF9ldmVudCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGlzdF9sb2NrKTsKKworc3RhdGljIHZvaWQgdXBkYXRlX2lycShzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcykKK3sKKwlzdHJ1Y3QgbWRwX2lycSAqaXJxOworCXVpbnQzMl90IGlycW1hc2sgPSBtZHBfa21zLT52YmxhbmtfbWFzazsKKworCUJVR19PTighc3Bpbl9pc19sb2NrZWQoJmxpc3RfbG9jaykpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpcnEsICZtZHBfa21zLT5pcnFfbGlzdCwgbm9kZSkKKwkJaXJxbWFzayB8PSBpcnEtPmlycW1hc2s7CisKKwltZHBfa21zLT5mdW5jcy0+c2V0X2lycW1hc2sobWRwX2ttcywgaXJxbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9pcnFfdW5sb2NrZWQoc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJdXBkYXRlX2lycShtZHBfa21zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtZHBfZGlzcGF0Y2hfaXJxcyhzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgdWludDMyX3Qgc3RhdHVzKQoreworCXN0cnVjdCBtZHBfaXJxICpoYW5kbGVyLCAqbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCW1kcF9rbXMtPmluX2lycSA9IHRydWU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhhbmRsZXIsIG4sICZtZHBfa21zLT5pcnFfbGlzdCwgbm9kZSkgeworCQlpZiAoaGFuZGxlci0+aXJxbWFzayAmIHN0YXR1cykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJCQloYW5kbGVyLT5pcnEoaGFuZGxlciwgaGFuZGxlci0+aXJxbWFzayAmIHN0YXR1cyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJCX0KKwl9CisJbWRwX2ttcy0+aW5faXJxID0gZmFsc2U7CisJdXBkYXRlX2lycShtZHBfa21zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIG1kcF91cGRhdGVfdmJsYW5rX21hc2soc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMsIHVpbnQzMl90IG1hc2ssIGJvb2wgZW5hYmxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJaWYgKGVuYWJsZSkKKwkJbWRwX2ttcy0+dmJsYW5rX21hc2sgfD0gbWFzazsKKwllbHNlCisJCW1kcF9rbXMtPnZibGFua19tYXNrICY9IH5tYXNrOworCXVwZGF0ZV9pcnEobWRwX2ttcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfaXJxKHN0cnVjdCBtZHBfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKK3sKKwlzdHJ1Y3QgbWRwX2lycV93YWl0ICp3YWl0ID0KKwkJCWNvbnRhaW5lcl9vZihpcnEsIHN0cnVjdCBtZHBfaXJxX3dhaXQsIGlycSk7CisJd2FpdC0+Y291bnQtLTsKKwl3YWtlX3VwX2FsbCgmd2FpdF9ldmVudCk7Cit9CisKK3ZvaWQgbWRwX2lycV93YWl0KHN0cnVjdCBtZHBfa21zICptZHBfa21zLCB1aW50MzJfdCBpcnFtYXNrKQoreworCXN0cnVjdCBtZHBfaXJxX3dhaXQgd2FpdCA9IHsKKwkJLmlycSA9IHsKKwkJCS5pcnEgPSB3YWl0X2lycSwKKwkJCS5pcnFtYXNrID0gaXJxbWFzaywKKwkJfSwKKwkJLmNvdW50ID0gMSwKKwl9OworCW1kcF9pcnFfcmVnaXN0ZXIobWRwX2ttcywgJndhaXQuaXJxKTsKKwl3YWl0X2V2ZW50KHdhaXRfZXZlbnQsICh3YWl0LmNvdW50IDw9IDApKTsKKwltZHBfaXJxX3VucmVnaXN0ZXIobWRwX2ttcywgJndhaXQuaXJxKTsKK30KKwordm9pZCBtZHBfaXJxX3JlZ2lzdGVyKHN0cnVjdCBtZHBfa21zICptZHBfa21zLCBzdHJ1Y3QgbWRwX2lycSAqaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBuZWVkc191cGRhdGUgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICghaXJxLT5yZWdpc3RlcmVkKSB7CisJCWlycS0+cmVnaXN0ZXJlZCA9IHRydWU7CisJCWxpc3RfYWRkKCZpcnEtPm5vZGUsICZtZHBfa21zLT5pcnFfbGlzdCk7CisJCW5lZWRzX3VwZGF0ZSA9ICFtZHBfa21zLT5pbl9pcnE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAobmVlZHNfdXBkYXRlKQorCQl1cGRhdGVfaXJxX3VubG9ja2VkKG1kcF9rbXMpOworfQorCit2b2lkIG1kcF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgc3RydWN0IG1kcF9pcnEgKmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgbmVlZHNfdXBkYXRlID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoaXJxLT5yZWdpc3RlcmVkKSB7CisJCWlycS0+cmVnaXN0ZXJlZCA9IGZhbHNlOworCQlsaXN0X2RlbCgmaXJxLT5ub2RlKTsKKwkJbmVlZHNfdXBkYXRlID0gIW1kcF9rbXMtPmluX2lycTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKworCWlmIChuZWVkc191cGRhdGUpCisJCXVwZGF0ZV9pcnFfdW5sb2NrZWQobWRwX2ttcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHBfa21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcF9rbXMuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX01EUF9LTVNfSF9fCisjZGVmaW5lIF9fTURQX0tNU19IX18KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjaW5jbHVkZSAibXNtX2Rydi5oIgorI2luY2x1ZGUgIm1zbV9rbXMuaCIKKyNpbmNsdWRlICJtZHBfY29tbW9uLnhtbC5oIgorCitzdHJ1Y3QgbWRwX2ttczsKKworc3RydWN0IG1kcF9rbXNfZnVuY3MgeworCXN0cnVjdCBtc21fa21zX2Z1bmNzIGJhc2U7CisJdm9pZCAoKnNldF9pcnFtYXNrKShzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgdWludDMyX3QgaXJxbWFzayk7Cit9OworCitzdHJ1Y3QgbWRwX2ttcyB7CisJc3RydWN0IG1zbV9rbXMgYmFzZTsKKworCWNvbnN0IHN0cnVjdCBtZHBfa21zX2Z1bmNzICpmdW5jczsKKworCS8qIGlycSBoYW5kbGluZzogKi8KKwlib29sIGluX2lycTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlycV9saXN0OyAgICAvKiBsaXN0IG9mIG1kcDRfaXJxICovCisJdWludDMyX3QgdmJsYW5rX21hc2s7ICAgICAgICAgLyogaXJxIGJpdHMgc2V0IGZvciB1c2Vyc3BhY2UgdmJsYW5rICovCit9OworI2RlZmluZSB0b19tZHBfa21zKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgbWRwX2ttcywgYmFzZSkKKworc3RhdGljIGlubGluZSB2b2lkIG1kcF9rbXNfaW5pdChzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywKKwkJY29uc3Qgc3RydWN0IG1kcF9rbXNfZnVuY3MgKmZ1bmNzKQoreworCW1kcF9rbXMtPmZ1bmNzID0gZnVuY3M7CisJSU5JVF9MSVNUX0hFQUQoJm1kcF9rbXMtPmlycV9saXN0KTsKKwltc21fa21zX2luaXQoJm1kcF9rbXMtPmJhc2UsICZmdW5jcy0+YmFzZSk7Cit9CisKKy8qCisgKiBpcnEgaGVscGVyczoKKyAqLworCisvKiBGb3IgdHJhbnNpZW50bHkgcmVnaXN0ZXJpbmcgZm9yIGRpZmZlcmVudCBNRFAgaXJxcyB0aGF0IHZhcmlvdXMgcGFydHMKKyAqIG9mIHRoZSBLTVMgY29kZSBuZWVkIGR1cmluZyBzZXR1cC9jb25maWd1cmF0aW9uLiAgVGhlc2UgYXJlIG5vdAorICogbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgd2hhdCBkcm1fdmJsYW5rX2dldC9wdXQoKSBhcmUgcmVxdWVzdGluZywgYW5kCisgKiB0aGUgaHlzdGVyZXNpcyBpbiBkcm1fdmJsYW5rX3B1dCgpIGlzIG5vdCBuZWNlc3NhcmlseSBkZXNpcmFibGUgZm9yCisgKiBpbnRlcm5hbCBob3VzZWtlZXBpbmcgcmVsYXRlZCBpcnEgdXNhZ2UuCisgKi8KK3N0cnVjdCBtZHBfaXJxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJdWludDMyX3QgaXJxbWFzazsKKwlib29sIHJlZ2lzdGVyZWQ7CisJdm9pZCAoKmlycSkoc3RydWN0IG1kcF9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKTsKK307CisKK3ZvaWQgbWRwX2Rpc3BhdGNoX2lycXMoc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMsIHVpbnQzMl90IHN0YXR1cyk7Cit2b2lkIG1kcF91cGRhdGVfdmJsYW5rX21hc2soc3RydWN0IG1kcF9rbXMgKm1kcF9rbXMsIHVpbnQzMl90IG1hc2ssIGJvb2wgZW5hYmxlKTsKK3ZvaWQgbWRwX2lycV93YWl0KHN0cnVjdCBtZHBfa21zICptZHBfa21zLCB1aW50MzJfdCBpcnFtYXNrKTsKK3ZvaWQgbWRwX2lycV9yZWdpc3RlcihzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgc3RydWN0IG1kcF9pcnEgKmlycSk7Cit2b2lkIG1kcF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgbWRwX2ttcyAqbWRwX2ttcywgc3RydWN0IG1kcF9pcnEgKmlycSk7CisKKworLyoKKyAqIHBpeGVsIGZvcm1hdCBoZWxwZXJzOgorICovCisKK3N0cnVjdCBtZHBfZm9ybWF0IHsKKwlzdHJ1Y3QgbXNtX2Zvcm1hdCBiYXNlOworCWVudW0gbWRwX2JwYyBicGNfciwgYnBjX2csIGJwY19iOworCWVudW0gbWRwX2JwY19hbHBoYSBicGNfYTsKKwl1aW50OF90IHVucGFja1s0XTsKKwlib29sIGFscGhhX2VuYWJsZSwgdW5wYWNrX3RpZ2h0OworCXVpbnQ4X3QgY3BwLCB1bnBhY2tfY291bnQ7Cit9OworI2RlZmluZSB0b19tZHBfZm9ybWF0KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgbWRwX2Zvcm1hdCwgYmFzZSkKKwordWludDMyX3QgbWRwX2dldF9mb3JtYXRzKHVpbnQzMl90ICpmb3JtYXRzLCB1aW50MzJfdCBtYXhfZm9ybWF0cyk7Citjb25zdCBzdHJ1Y3QgbXNtX2Zvcm1hdCAqbWRwX2dldF9mb3JtYXQoc3RydWN0IG1zbV9rbXMgKmttcywgdWludDMyX3QgZm9ybWF0KTsKKworI2VuZGlmIC8qIF9fTURQX0tNU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwNC9tZHA0X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNmI3ZmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHA0L21kcDRfaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0Ci0gKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLQotI2luY2x1ZGUgIm1zbV9kcnYuaCIKLSNpbmNsdWRlICJtZHA0X2ttcy5oIgotCi0KLXN0cnVjdCBtZHA0X2lycV93YWl0IHsKLQlzdHJ1Y3QgbWRwNF9pcnEgaXJxOwotCWludCBjb3VudDsKLX07Ci0KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0X2V2ZW50KTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhsaXN0X2xvY2spOwotCi1zdGF0aWMgdm9pZCB1cGRhdGVfaXJxKHN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMpCi17Ci0Jc3RydWN0IG1kcDRfaXJxICppcnE7Ci0JdWludDMyX3QgaXJxbWFzayA9IG1kcDRfa21zLT52YmxhbmtfbWFzazsKLQotCUJVR19PTighc3Bpbl9pc19sb2NrZWQoJmxpc3RfbG9jaykpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpcnEsICZtZHA0X2ttcy0+aXJxX2xpc3QsIG5vZGUpCi0JCWlycW1hc2sgfD0gaXJxLT5pcnFtYXNrOwotCi0JbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfSU5UUl9FTkFCTEUsIGlycW1hc2spOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfaXJxX3VubG9ja2VkKHN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0JdXBkYXRlX2lycShtZHA0X2ttcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1kcDRfaXJxX2Vycm9yX2hhbmRsZXIoc3RydWN0IG1kcDRfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKLXsKLQlEUk1fRVJST1IoImVycm9yczogJTA4eFxuIiwgaXJxc3RhdHVzKTsKLX0KLQotdm9pZCBtZHA0X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBtc21fa21zICprbXMpCi17Ci0Jc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKGttcyk7Ci0JbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfSU5UUl9DTEVBUiwgMHhmZmZmZmZmZik7Ci19Ci0KLWludCBtZHA0X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKQotewotCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhrbXMpOwotCXN0cnVjdCBtZHA0X2lycSAqZXJyb3JfaGFuZGxlciA9ICZtZHA0X2ttcy0+ZXJyb3JfaGFuZGxlcjsKLQotCUlOSVRfTElTVF9IRUFEKCZtZHA0X2ttcy0+aXJxX2xpc3QpOwotCi0JZXJyb3JfaGFuZGxlci0+aXJxID0gbWRwNF9pcnFfZXJyb3JfaGFuZGxlcjsKLQllcnJvcl9oYW5kbGVyLT5pcnFtYXNrID0gTURQNF9JUlFfUFJJTUFSWV9JTlRGX1VERVJSVU4gfAotCQkJTURQNF9JUlFfRVhURVJOQUxfSU5URl9VREVSUlVOOwotCi0JbWRwNF9pcnFfcmVnaXN0ZXIobWRwNF9rbXMsIGVycm9yX2hhbmRsZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbWRwNF9pcnFfdW5pbnN0YWxsKHN0cnVjdCBtc21fa21zICprbXMpCi17Ci0Jc3RydWN0IG1kcDRfa21zICptZHA0X2ttcyA9IHRvX21kcDRfa21zKGttcyk7Ci0JbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfSU5UUl9FTkFCTEUsIDB4MDAwMDAwMDApOwotfQotCi1pcnFyZXR1cm5fdCBtZHA0X2lycShzdHJ1Y3QgbXNtX2ttcyAqa21zKQotewotCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhrbXMpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtZHA0X2ttcy0+ZGV2OwotCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBtZHA0X2lycSAqaGFuZGxlciwgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0JdWludDMyX3Qgc3RhdHVzOwotCi0Jc3RhdHVzID0gbWRwNF9yZWFkKG1kcDRfa21zLCBSRUdfTURQNF9JTlRSX1NUQVRVUyk7Ci0JbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfSU5UUl9DTEVBUiwgc3RhdHVzKTsKLQotCVZFUkIoInN0YXR1cz0lMDh4Iiwgc3RhdHVzKTsKLQotCWZvciAoaWQgPSAwOyBpZCA8IHByaXYtPm51bV9jcnRjczsgaWQrKykKLQkJaWYgKHN0YXR1cyAmIG1kcDRfY3J0Y192YmxhbmsocHJpdi0+Y3J0Y3NbaWRdKSkKLQkJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgaWQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCW1kcDRfa21zLT5pbl9pcnEgPSB0cnVlOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYW5kbGVyLCBuLCAmbWRwNF9rbXMtPmlycV9saXN0LCBub2RlKSB7Ci0JCWlmIChoYW5kbGVyLT5pcnFtYXNrICYgc3RhdHVzKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLQkJCWhhbmRsZXItPmlycShoYW5kbGVyLCBoYW5kbGVyLT5pcnFtYXNrICYgc3RhdHVzKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQltZHA0X2ttcy0+aW5faXJxID0gZmFsc2U7Ci0JdXBkYXRlX2lycShtZHA0X2ttcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBtZHA0X2VuYWJsZV92Ymxhbmsoc3RydWN0IG1zbV9rbXMgKmttcywgc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCXN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMgPSB0b19tZHA0X2ttcyhrbXMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0JbWRwNF9rbXMtPnZibGFua19tYXNrIHw9IG1kcDRfY3J0Y192YmxhbmsoY3J0Yyk7Ci0JdXBkYXRlX2lycShtZHA0X2ttcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtZHA0X2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zID0gdG9fbWRwNF9rbXMoa21zKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCW1kcDRfa21zLT52YmxhbmtfbWFzayAmPSB+bWRwNF9jcnRjX3ZibGFuayhjcnRjKTsKLQl1cGRhdGVfaXJxKG1kcDRfa21zKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgd2FpdF9pcnEoc3RydWN0IG1kcDRfaXJxICppcnEsIHVpbnQzMl90IGlycXN0YXR1cykKLXsKLQlzdHJ1Y3QgbWRwNF9pcnFfd2FpdCAqd2FpdCA9Ci0JCQljb250YWluZXJfb2YoaXJxLCBzdHJ1Y3QgbWRwNF9pcnFfd2FpdCwgaXJxKTsKLQl3YWl0LT5jb3VudC0tOwotCXdha2VfdXBfYWxsKCZ3YWl0X2V2ZW50KTsKLX0KLQotdm9pZCBtZHA0X2lycV93YWl0KHN0cnVjdCBtZHA0X2ttcyAqbWRwNF9rbXMsIHVpbnQzMl90IGlycW1hc2spCi17Ci0Jc3RydWN0IG1kcDRfaXJxX3dhaXQgd2FpdCA9IHsKLQkJLmlycSA9IHsKLQkJCS5pcnEgPSB3YWl0X2lycSwKLQkJCS5pcnFtYXNrID0gaXJxbWFzaywKLQkJfSwKLQkJLmNvdW50ID0gMSwKLQl9OwotCW1kcDRfaXJxX3JlZ2lzdGVyKG1kcDRfa21zLCAmd2FpdC5pcnEpOwotCXdhaXRfZXZlbnQod2FpdF9ldmVudCwgKHdhaXQuY291bnQgPD0gMCkpOwotCW1kcDRfaXJxX3VucmVnaXN0ZXIobWRwNF9rbXMsICZ3YWl0LmlycSk7Ci19Ci0KLXZvaWQgbWRwNF9pcnFfcmVnaXN0ZXIoc3RydWN0IG1kcDRfa21zICptZHA0X2ttcywgc3RydWN0IG1kcDRfaXJxICppcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIG5lZWRzX3VwZGF0ZSA9IGZhbHNlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFpcnEtPnJlZ2lzdGVyZWQpIHsKLQkJaXJxLT5yZWdpc3RlcmVkID0gdHJ1ZTsKLQkJbGlzdF9hZGQoJmlycS0+bm9kZSwgJm1kcDRfa21zLT5pcnFfbGlzdCk7Ci0JCW5lZWRzX3VwZGF0ZSA9ICFtZHA0X2ttcy0+aW5faXJxOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG5lZWRzX3VwZGF0ZSkKLQkJdXBkYXRlX2lycV91bmxvY2tlZChtZHA0X2ttcyk7Ci19Ci0KLXZvaWQgbWRwNF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgbWRwNF9rbXMgKm1kcDRfa21zLCBzdHJ1Y3QgbWRwNF9pcnEgKmlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgbmVlZHNfdXBkYXRlID0gZmFsc2U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaXJxLT5yZWdpc3RlcmVkKSB7Ci0JCWlycS0+cmVnaXN0ZXJlZCA9IGZhbHNlOwotCQlsaXN0X2RlbCgmaXJxLT5ub2RlKTsKLQkJbmVlZHNfdXBkYXRlID0gIW1kcDRfa21zLT5pbl9pcnE7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAobmVlZHNfdXBkYXRlKQotCQl1cGRhdGVfaXJxX3VubG9ja2VkKG1kcDRfa21zKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKaW5kZXggODY1Mzc2OS4uZTZhZGFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgIm1zbV9kcnYuaCIKICNpbmNsdWRlICJtc21fZ3B1LmgiCisjaW5jbHVkZSAibXNtX2ttcy5oIgogCiBzdGF0aWMgdm9pZCBtc21fZmJfb3V0cHV0X3BvbGxfY2hhbmdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMzAsNTAgKzMxLDE5IEBACiAJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBtc21fZmJfb3V0cHV0X3BvbGxfY2hhbmdlZCwKIH07CiAKLXN0YXRpYyBpbnQgbXNtX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGlvbW11X2RvbWFpbiAqaW9tbXUsIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdW5zaWduZWQgbG9uZyBpb3ZhLCBpbnQgZmxhZ3MsIHZvaWQgKmFyZykKLXsKLQlEQkcoIioqKiBmYXVsdDogaW92YT0lMDhseCwgZmxhZ3M9JWQiLCBpb3ZhLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fcmVnaXN0ZXJfaW9tbXUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGlvbW11X2RvbWFpbiAqaW9tbXUpCitpbnQgbXNtX3JlZ2lzdGVyX21tdShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbXNtX21tdSAqbW11KQogewogCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBpZHggPSBwcml2LT5udW1faW9tbXVzKys7CisJaW50IGlkeCA9IHByaXYtPm51bV9tbXVzKys7CiAKLQlpZiAoV0FSTl9PTihpZHggPj0gQVJSQVlfU0laRShwcml2LT5pb21tdXMpKSkKKwlpZiAoV0FSTl9PTihpZHggPj0gQVJSQVlfU0laRShwcml2LT5tbXVzKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpdi0+aW9tbXVzW2lkeF0gPSBpb21tdTsKLQotCWlvbW11X3NldF9mYXVsdF9oYW5kbGVyKGlvbW11LCBtc21fZmF1bHRfaGFuZGxlciwgZGV2KTsKLQotCS8qIG5lZWQgdG8gaW9tbXVfYXR0YWNoX2RldmljZSgpIHNvbWV3aGVyZT8/ICBvbiByZXN1bWU/PyAqLworCXByaXYtPm1tdXNbaWR4XSA9IG1tdTsKIAogCXJldHVybiBpZHg7CiB9CiAKLWludCBtc21faW9tbXVfYXR0YWNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11LAotCQljb25zdCBjaGFyICoqbmFtZXMsIGludCBjbnQpCi17Ci0JaW50IGksIHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQkvKiBUT0RPIG1heWJlIHNvbWUgZGF5IG1zbSBpb21tdSB3b24ndCByZXF1aXJlIHRoaXMgaGFjazogKi8KLQkJc3RydWN0IGRldmljZSAqbXNtX2lvbW11X2dldF9jdHgoY29uc3QgY2hhciAqY3R4X25hbWUpOwotCQlzdHJ1Y3QgZGV2aWNlICpjdHggPSBtc21faW9tbXVfZ2V0X2N0eChuYW1lc1tpXSk7Ci0JCWlmICghY3R4KQotCQkJY29udGludWU7Ci0JCXJldCA9IGlvbW11X2F0dGFjaF9kZXZpY2UoaW9tbXUsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl93YXJuKGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBpb21tdSB0byAlcyIsIG5hbWVzW2ldKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfRFJNX01TTV9SRUdJU1RFUl9MT0dHSU5HCiBzdGF0aWMgYm9vbCByZWdsb2cgPSBmYWxzZTsKIE1PRFVMRV9QQVJNX0RFU0MocmVnbG9nLCAiRW5hYmxlIHJlZ2lzdGVyIHJlYWQvd3JpdGUgbG9nZ2luZyIpOwpAQCAtODIsNiArNTIsMTAgQEAKICNkZWZpbmUgcmVnbG9nIDAKICNlbmRpZgogCitzdGF0aWMgY2hhciAqdnJhbTsKK01PRFVMRV9QQVJNX0RFU0ModnJhbSwgIkNvbmZpZ3VyZSBWUkFNIHNpemUgKGZvciBkZXZpY2VzIHdpdGhvdXQgSU9NTVUvR1BVTU1VIik7Cittb2R1bGVfcGFyYW0odnJhbSwgY2hhcnAsIDApOworCiB2b2lkIF9faW9tZW0gKm1zbV9pb3JlbWFwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IGNoYXIgKmRiZ25hbWUpCiB7CkBAIC0xNjEsNiArMTM1LDE0IEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCX0KIAorCWlmIChwcml2LT52cmFtLnBhZGRyKSB7CisJCURFRklORV9ETUFfQVRUUlMoYXR0cnMpOworCQlkbWFfc2V0X2F0dHIoRE1BX0FUVFJfTk9fS0VSTkVMX01BUFBJTkcsICZhdHRycyk7CisJCWRybV9tbV90YWtlZG93bigmcHJpdi0+dnJhbS5tbSk7CisJCWRtYV9mcmVlX2F0dHJzKGRldi0+ZGV2LCBwcml2LT52cmFtLnNpemUsIE5VTEwsCisJCQkJcHJpdi0+dnJhbS5wYWRkciwgJmF0dHJzKTsKKwl9CisKIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKIAogCWtmcmVlKHByaXYpOwpAQCAtMTY4LDYgKzE1MCwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdldF9tZHBfdmVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisjaWZkZWYgQ09ORklHX09GCisJY29uc3Qgc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbWF0Y2hfdHlwZXNbXSA9IHsgeworCQkuY29tcGF0aWJsZSA9ICJxY29tLG1kc3NfbWRwIiwKKwkJLmRhdGEJPSAodm9pZAkqKTUsCisJfSwgeworCQkvKiBlbmQgbm9kZSAqLworCX0gfTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtYXRjaF90eXBlcywgZGV2LT5vZl9ub2RlKTsKKwlpZiAobWF0Y2gpCisJCXJldHVybiAoaW50KW1hdGNoLT5kYXRhOworI2VuZGlmCisJcmV0dXJuIDQ7Cit9CisKIHN0YXRpYyBpbnQgbXNtX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2LT5wbGF0Zm9ybWRldjsKQEAgLTE5MSw3ICsxOTEsNTMgQEAKIAogCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CiAKLQlrbXMgPSBtZHA0X2ttc19pbml0KGRldik7CisJLyogaWYgd2UgaGF2ZSBubyBJT01NVSwgdGhlbiB3ZSBuZWVkIHRvIHVzZSBjYXJ2ZW91dCBhbGxvY2F0b3IuCisJICogR3JhYiB0aGUgZW50aXJlIENNQSBjaHVuayBjYXJ2ZWQgb3V0IGluIGVhcmx5IHN0YXJ0dXAgaW4KKwkgKiBtYWNoLW1zbToKKwkgKi8KKwlpZiAoIWlvbW11X3ByZXNlbnQoJnBsYXRmb3JtX2J1c190eXBlKSkgeworCQlERUZJTkVfRE1BX0FUVFJTKGF0dHJzKTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQl2b2lkICpwOworCisJCURCRygidXNpbmcgJXMgVlJBTSBjYXJ2ZW91dCIsIHZyYW0pOworCQlzaXplID0gbWVtcGFyc2UodnJhbSwgTlVMTCk7CisJCXByaXYtPnZyYW0uc2l6ZSA9IHNpemU7CisKKwkJZHJtX21tX2luaXQoJnByaXYtPnZyYW0ubW0sIDAsIChzaXplID4+IFBBR0VfU0hJRlQpIC0gMSk7CisKKwkJZG1hX3NldF9hdHRyKERNQV9BVFRSX05PX0tFUk5FTF9NQVBQSU5HLCAmYXR0cnMpOworCQlkbWFfc2V0X2F0dHIoRE1BX0FUVFJfV1JJVEVfQ09NQklORSwgJmF0dHJzKTsKKworCQkvKiBub3RlIHRoYXQgZm9yIG5vLWtlcm5lbC1tYXBwaW5nLCB0aGUgdmFkZHIgcmV0dXJuZWQKKwkJICogaXMgYm9ndXMsIGJ1dCBub24tbnVsbCBpZiBhbGxvY2F0aW9uIHN1Y2NlZWRlZDoKKwkJICovCisJCXAgPSBkbWFfYWxsb2NfYXR0cnMoZGV2LT5kZXYsIHNpemUsCisJCQkJJnByaXYtPnZyYW0ucGFkZHIsIDAsICZhdHRycyk7CisJCWlmICghcCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBWUkFNXG4iKTsKKwkJCXByaXYtPnZyYW0ucGFkZHIgPSAwOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWRldl9pbmZvKGRldi0+ZGV2LCAiVlJBTTogJTA4eC0+JTA4eFxuIiwKKwkJCQkodWludDMyX3QpcHJpdi0+dnJhbS5wYWRkciwKKwkJCQkodWludDMyX3QpKHByaXYtPnZyYW0ucGFkZHIgKyBzaXplKSk7CisJfQorCisJc3dpdGNoIChnZXRfbWRwX3ZlcihwZGV2KSkgeworCWNhc2UgNDoKKwkJa21zID0gbWRwNF9rbXNfaW5pdChkZXYpOworCQlicmVhazsKKwljYXNlIDU6CisJCWttcyA9IG1kcDVfa21zX2luaXQoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa21zID0gRVJSX1BUUigtRU5PREVWKTsKKwkJYnJlYWs7CisJfQorCiAJaWYgKElTX0VSUihrbXMpKSB7CiAJCS8qCiAJCSAqIE5PVEU6IG9uY2Ugd2UgaGF2ZSBHUFUgc3VwcG9ydCwgaGF2aW5nIG5vIGttcyBzaG91bGQgbm90CkBAIC0zMjYsNyArMzcyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBtc21faXJxKERSTV9JUlFfQVJHUykKK3N0YXRpYyBpcnFyZXR1cm5fdCBtc21faXJxKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXJnOwogCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNDE1LDcgKzQ2MSw3IEBACiAKIHN0YXRpYyBpbnQgbXNtX21tX3Nob3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICptKQogewotCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCBkZXYtPm1tX3ByaXZhdGUpOworCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCAmZGV2LT52bWFfb2Zmc2V0X21hbmFnZXItPnZtX2FkZHJfc3BhY2VfbW0pOwogfQogCiBzdGF0aWMgaW50IG1zbV9mYl9zaG93KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqbSkKQEAgLTc3OCwxMiArODI0LDEzIEBACiAKIHN0YXRpYyBpbnQgbXNtX3BkZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwogCXJldHVybiBkcm1fcGxhdGZvcm1faW5pdCgmbXNtX2RyaXZlciwgcGRldik7CiB9CiAKIHN0YXRpYyBpbnQgbXNtX3BkZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JZHJtX3BsYXRmb3JtX2V4aXQoJm1zbV9kcml2ZXIsIHBkZXYpOworCWRybV9wdXRfZGV2KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzkzLDEyICs4NDAsMTkgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGR0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG1kc3NfbWRwIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZHRfbWF0Y2gpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGxhdGZvcm1fZHJpdmVyID0gewogCS5wcm9iZSAgICAgID0gbXNtX3BkZXZfcHJvYmUsCiAJLnJlbW92ZSAgICAgPSBtc21fcGRldl9yZW1vdmUsCiAJLmRyaXZlciAgICAgPSB7CiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgICA9ICJtc20iLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBkdF9tYXRjaCwKIAkJLnBtICAgICA9ICZtc21fcG1fb3BzLAogCX0sCiAJLmlkX3RhYmxlICAgPSBtc21faWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGQzOWYwODYuLjNkNjMyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0zMSw2ICszMSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTVBJTEVfVEVTVCkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfTVNNKQorLyogc3R1YnMgd2UgbmVlZCBmb3IgY29tcGlsZS10ZXN0OiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICptc21faW9tbXVfZ2V0X2N0eChjb25zdCBjaGFyICpjdHhfbmFtZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAjaWZuZGVmIENPTkZJR19PRgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL3NvY2luZm8uaD4KQEAgLTQ0LDYgKzUzLDcgQEAKIAogc3RydWN0IG1zbV9rbXM7CiBzdHJ1Y3QgbXNtX2dwdTsKK3N0cnVjdCBtc21fbW11OwogCiAjZGVmaW5lIE5VTV9ET01BSU5TIDIgICAgLyogb25lIGZvciBLTVMsIHRoZW4gb25lIHBlciBncHUgY29yZSAoPykgKi8KIApAQCAtNzYsOSArODYsOSBAQAogCS8qIGNhbGxiYWNrcyBkZWZlcnJlZCB1bnRpbCBibyBpcyBpbmFjdGl2ZTogKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2NiczsKIAotCS8qIHJlZ2lzdGVyZWQgSU9NTVUgZG9tYWluczogKi8KLQl1bnNpZ25lZCBpbnQgbnVtX2lvbW11czsKLQlzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdXNbTlVNX0RPTUFJTlNdOworCS8qIHJlZ2lzdGVyZWQgTU1VczogKi8KKwl1bnNpZ25lZCBpbnQgbnVtX21tdXM7CisJc3RydWN0IG1zbV9tbXUgKm1tdXNbTlVNX0RPTUFJTlNdOwogCiAJdW5zaWduZWQgaW50IG51bV9wbGFuZXM7CiAJc3RydWN0IGRybV9wbGFuZSAqcGxhbmVzWzhdOwpAQCAtOTQsNiArMTA0LDE2IEBACiAKIAl1bnNpZ25lZCBpbnQgbnVtX2Nvbm5lY3RvcnM7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcnNbOF07CisKKwkvKiBWUkFNIGNhcnZlb3V0LCB1c2VkIHdoZW4gbm8gSU9NTVU6ICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQlkbWFfYWRkcl90IHBhZGRyOworCQkvKiBOT1RFOiBtbSBtYW5hZ2VkIGF0IHRoZSBwYWdlIGxldmVsLCBzaXplIGlzIGluICMgb2YgcGFnZXMKKwkJICogYW5kIHBvc2l0aW9uIG1tX25vZGUtPnN0YXJ0IGlzIGluICMgb2YgcGFnZXM6CisJCSAqLworCQlzdHJ1Y3QgZHJtX21tIG1tOworCX0gdnJhbTsKIH07CiAKIHN0cnVjdCBtc21fZm9ybWF0IHsKQEAgLTExNCwzOSArMTM0LDcgQEAKIAkJKF9jYiktPmZ1bmMgPSBfZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgXAogCX0gd2hpbGUgKDApCiAKLS8qIEFzIHRoZXJlIGFyZSBkaWZmZXJlbnQgZGlzcGxheSBjb250cm9sbGVyIGJsb2NrcyBkZXBlbmRpbmcgb24gdGhlCi0gKiBzbmFwZHJhZ29uIHZlcnNpb24sIHRoZSBrbXMgc3VwcG9ydCBpcyBzcGxpdCBvdXQgYW5kIHRoZSBhcHByb3ByaWF0ZQotICogaW1wbGVtZW50YXRpb24gaXMgbG9hZGVkIGF0IHJ1bnRpbWUuICBUaGUga21zIG1vZHVsZSBpcyByZXNwb25zaWJsZQotICogZm9yIGNvbnN0cnVjdGluZyB0aGUgYXBwcm9wcmlhdGUgcGxhbmVzL2NydGNzL2VuY29kZXJzL2Nvbm5lY3RvcnMuCi0gKi8KLXN0cnVjdCBtc21fa21zX2Z1bmNzIHsKLQkvKiBodyBpbml0aWFsaXphdGlvbjogKi8KLQlpbnQgKCpod19pbml0KShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKLQkvKiBpcnEgaGFuZGxpbmc6ICovCi0Jdm9pZCAoKmlycV9wcmVpbnN0YWxsKShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKLQlpbnQgKCppcnFfcG9zdGluc3RhbGwpKHN0cnVjdCBtc21fa21zICprbXMpOwotCXZvaWQgKCppcnFfdW5pbnN0YWxsKShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKLQlpcnFyZXR1cm5fdCAoKmlycSkoc3RydWN0IG1zbV9rbXMgKmttcyk7Ci0JaW50ICgqZW5hYmxlX3ZibGFuaykoc3RydWN0IG1zbV9rbXMgKmttcywgc3RydWN0IGRybV9jcnRjICpjcnRjKTsKLQl2b2lkICgqZGlzYWJsZV92YmxhbmspKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Ci0JLyogbWlzYzogKi8KLQljb25zdCBzdHJ1Y3QgbXNtX2Zvcm1hdCAqKCpnZXRfZm9ybWF0KShzdHJ1Y3QgbXNtX2ttcyAqa21zLCB1aW50MzJfdCBmb3JtYXQpOwotCWxvbmcgKCpyb3VuZF9waXhjbGspKHN0cnVjdCBtc21fa21zICprbXMsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Ci0JLyogY2xlYW51cDogKi8KLQl2b2lkICgqcHJlY2xvc2UpKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7Ci0Jdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBtc21fa21zICprbXMpOwotfTsKLQotc3RydWN0IG1zbV9rbXMgewotCWNvbnN0IHN0cnVjdCBtc21fa21zX2Z1bmNzICpmdW5jczsKLX07Ci0KLXN0cnVjdCBtc21fa21zICptZHA0X2ttc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCi1pbnQgbXNtX3JlZ2lzdGVyX2lvbW11KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11KTsKLWludCBtc21faW9tbXVfYXR0YWNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11LAotCQljb25zdCBjaGFyICoqbmFtZXMsIGludCBjbnQpOworaW50IG1zbV9yZWdpc3Rlcl9tbXUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG1zbV9tbXUgKm1tdSk7CiAKIGludCBtc21fd2FpdF9mZW5jZV9pbnRlcnJ1cHRhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGZlbmNlLAogCQlzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpOwpAQCAtMjAyLDcgKzE5MCw5IEBACiAKIHN0cnVjdCBkcm1fZmJfaGVscGVyICptc21fZmJkZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotaW50IGhkbWlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworc3RydWN0IGhkbWk7CitzdHJ1Y3QgaGRtaSAqaGRtaV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitpcnFyZXR1cm5fdCBoZG1pX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogdm9pZCBfX2luaXQgaGRtaV9yZWdpc3Rlcih2b2lkKTsKIHZvaWQgX19leGl0IGhkbWlfdW5yZWdpc3Rlcih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2ZiLmMKaW5kZXggMDI4NmMwZS4uODFiYWZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9mYi5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgIm1zbV9kcnYuaCIKKyNpbmNsdWRlICJtc21fa21zLmgiCiAKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYwppbmRleCBlNTg3ZDI1Li5kOGQ2MGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYwpAQCAtMjIsNyArMjIsNDUgQEAKICNpbmNsdWRlICJtc21fZHJ2LmgiCiAjaW5jbHVkZSAibXNtX2dlbS5oIgogI2luY2x1ZGUgIm1zbV9ncHUuaCIKKyNpbmNsdWRlICJtc21fbW11LmgiCiAKK3N0YXRpYyBkbWFfYWRkcl90IHBoeXNhZGRyKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBtc21fZ2VtX29iamVjdCAqbXNtX29iaiA9IHRvX21zbV9ibyhvYmopOworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBvYmotPmRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuICgoKGRtYV9hZGRyX3QpbXNtX29iai0+dnJhbV9ub2RlLT5zdGFydCkgPDwgUEFHRV9TSElGVCkgKworCQkJcHJpdi0+dnJhbS5wYWRkcjsKK30KKworLyogYWxsb2NhdGUgcGFnZXMgZnJvbSBWUkFNIGNhcnZlb3V0LCB1c2VkIHdoZW4gbm8gSU9NTVU6ICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKipnZXRfcGFnZXNfdnJhbShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKKwkJaW50IG5wYWdlcykKK3sKKwlzdHJ1Y3QgbXNtX2dlbV9vYmplY3QgKm1zbV9vYmogPSB0b19tc21fYm8ob2JqKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gb2JqLT5kZXYtPmRldl9wcml2YXRlOworCWRtYV9hZGRyX3QgcGFkZHI7CisJc3RydWN0IHBhZ2UgKipwOworCWludCByZXQsIGk7CisKKwlwID0gZHJtX21hbGxvY19hYihucGFnZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CisJaWYgKCFwKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJldCA9IGRybV9tbV9pbnNlcnRfbm9kZSgmcHJpdi0+dnJhbS5tbSwgbXNtX29iai0+dnJhbV9ub2RlLAorCQkJbnBhZ2VzLCAwLCBEUk1fTU1fU0VBUkNIX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZHJtX2ZyZWVfbGFyZ2UocCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJcGFkZHIgPSBwaHlzYWRkcihvYmopOworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlwW2ldID0gcGh5c190b19wYWdlKHBhZGRyKTsKKwkJcGFkZHIgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBwOworfQogCiAvKiBjYWxsZWQgd2l0aCBkZXYtPnN0cnVjdF9tdXRleCBoZWxkICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKipnZXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCkBAIC0zMSw5ICs2OSwxNCBAQAogCiAJaWYgKCFtc21fb2JqLT5wYWdlcykgewogCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0JCXN0cnVjdCBwYWdlICoqcCA9IGRybV9nZW1fZ2V0X3BhZ2VzKG9iaiwgMCk7CisJCXN0cnVjdCBwYWdlICoqcDsKIAkJaW50IG5wYWdlcyA9IG9iai0+c2l6ZSA+PiBQQUdFX1NISUZUOwogCisJCWlmIChpb21tdV9wcmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpCisJCQlwID0gZHJtX2dlbV9nZXRfcGFnZXMob2JqLCAwKTsKKwkJZWxzZQorCQkJcCA9IGdldF9wYWdlc192cmFtKG9iaiwgbnBhZ2VzKTsKKwogCQlpZiAoSVNfRVJSKHApKSB7CiAJCQlkZXZfZXJyKGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBwYWdlczogJWxkXG4iLAogCQkJCQlQVFJfRVJSKHApKTsKQEAgLTczLDcgKzExNiwxMSBAQAogCQlzZ19mcmVlX3RhYmxlKG1zbV9vYmotPnNndCk7CiAJCWtmcmVlKG1zbV9vYmotPnNndCk7CiAKLQkJZHJtX2dlbV9wdXRfcGFnZXMob2JqLCBtc21fb2JqLT5wYWdlcywgdHJ1ZSwgZmFsc2UpOworCQlpZiAoaW9tbXVfcHJlc2VudCgmcGxhdGZvcm1fYnVzX3R5cGUpKQorCQkJZHJtX2dlbV9wdXRfcGFnZXMob2JqLCBtc21fb2JqLT5wYWdlcywgdHJ1ZSwgZmFsc2UpOworCQllbHNlCisJCQlkcm1fbW1fcmVtb3ZlX25vZGUobXNtX29iai0+dnJhbV9ub2RlKTsKKwogCQltc21fb2JqLT5wYWdlcyA9IE5VTEw7CiAJfQogfQpAQCAtMTM4LDcgKzE4NSw2IEBACiBpbnQgbXNtX2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2dlbV9vYmplY3QgKm1zbV9vYmogPSB0b19tc21fYm8ob2JqKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAl1bnNpZ25lZCBsb25nIHBmbjsKQEAgLTE2Myw3ICsyMDksNyBAQAogCXBnb2ZmID0gKCh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzIC0KIAkJCXZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAKLQlwZm4gPSBwYWdlX3RvX3Bmbihtc21fb2JqLT5wYWdlc1twZ29mZl0pOworCXBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2VzW3Bnb2ZmXSk7CiAKIAlWRVJCKCJJbnNlcnRpbmcgJXAgcGZuICVseCwgcGEgJWx4Iiwgdm1mLT52aXJ0dWFsX2FkZHJlc3MsCiAJCQlwZm4sIHBmbiA8PCBQQUdFX1NISUZUKTsKQEAgLTIxOSw2NyArMjY1LDYgQEAKIAlyZXR1cm4gb2Zmc2V0OwogfQogCi0vKiBoZWxwZXJzIGZvciBkZWFsaW5nIHcvIGlvbW11OiAqLwotc3RhdGljIGludCBtYXBfcmFuZ2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgaW92YSwKLQkJc3RydWN0IHNnX3RhYmxlICpzZ3QsIHVuc2lnbmVkIGludCBsZW4sIGludCBwcm90KQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JdW5zaWduZWQgaW50IGRhID0gaW92YTsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQlpbnQgcmV0OwotCi0JaWYgKCFkb21haW4gfHwgIXNndCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIHNndC0+bmVudHMsIGkpIHsKLQkJdTMyIHBhID0gc2dfcGh5cyhzZykgLSBzZy0+b2Zmc2V0OwotCQlzaXplX3QgYnl0ZXMgPSBzZy0+bGVuZ3RoICsgc2ctPm9mZnNldDsKLQotCQlWRVJCKCJtYXBbJWRdOiAlMDh4ICUwOHgoJXgpIiwgaSwgaW92YSwgcGEsIGJ5dGVzKTsKLQotCQlyZXQgPSBpb21tdV9tYXAoZG9tYWluLCBkYSwgcGEsIGJ5dGVzLCBwcm90KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZmFpbDsKLQotCQlkYSArPSBieXRlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlkYSA9IGlvdmE7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIGksIGopIHsKLQkJc2l6ZV90IGJ5dGVzID0gc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQ7Ci0JCWlvbW11X3VubWFwKGRvbWFpbiwgZGEsIGJ5dGVzKTsKLQkJZGEgKz0gYnl0ZXM7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHVubWFwX3JhbmdlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgaW50IGlvdmEsCi0JCXN0cnVjdCBzZ190YWJsZSAqc2d0LCB1bnNpZ25lZCBpbnQgbGVuKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JdW5zaWduZWQgaW50IGRhID0gaW92YTsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgewotCQlzaXplX3QgYnl0ZXMgPSBzZy0+bGVuZ3RoICsgc2ctPm9mZnNldDsKLQkJc2l6ZV90IHVubWFwcGVkOwotCi0JCXVubWFwcGVkID0gaW9tbXVfdW5tYXAoZG9tYWluLCBkYSwgYnl0ZXMpOwotCQlpZiAodW5tYXBwZWQgPCBieXRlcykKLQkJCWJyZWFrOwotCi0JCVZFUkIoInVubWFwWyVkXTogJTA4eCgleCkiLCBpLCBpb3ZhLCBieXRlcyk7Ci0KLQkJQlVHX09OKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKTsKLQotCQlkYSArPSBieXRlczsKLQl9Ci19Ci0KIC8qIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgc3RydWN0X211dGV4Li4gYWx0aG91Z2ggaXQgY2FuIGJlIGNhbGxlZAogICogZnJvbSBhdG9taWMgY29udGV4dCB3aXRob3V0IHN0cnVjdF9tdXRleCB0byBhY3F1aXJlIGFuIGV4dHJhCiAgKiBpb3ZhIHJlZiBpZiB5b3Uga25vdyBvbmUgaXMgYWxyZWFkeSBoZWxkLgpAQCAtMjk1LDE1ICsyODAsMjAgQEAKIAogCWlmICghbXNtX29iai0+ZG9tYWluW2lkXS5pb3ZhKSB7CiAJCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBvYmotPmRldi0+ZGV2X3ByaXZhdGU7Ci0JCXVpbnQzMl90IG9mZnNldCA9ICh1aW50MzJfdCltbWFwX29mZnNldChvYmopOwotCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCQlwYWdlcyA9IGdldF9wYWdlcyhvYmopOworCQlzdHJ1Y3QgbXNtX21tdSAqbW11ID0gcHJpdi0+bW11c1tpZF07CisJCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBnZXRfcGFnZXMob2JqKTsKKwogCQlpZiAoSVNfRVJSKHBhZ2VzKSkKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2VzKTsKLQkJLy8gWFhYIGlkZWFsbHkgd2Ugd291bGQgbm90IG1hcCBidWZmZXJzIHdyaXRhYmxlIHdoZW4gbm90IG5lZWRlZC4uLgotCQlyZXQgPSBtYXBfcmFuZ2UocHJpdi0+aW9tbXVzW2lkXSwgb2Zmc2V0LCBtc21fb2JqLT5zZ3QsCi0JCQkJb2JqLT5zaXplLCBJT01NVV9SRUFEIHwgSU9NTVVfV1JJVEUpOwotCQltc21fb2JqLT5kb21haW5baWRdLmlvdmEgPSBvZmZzZXQ7CisKKwkJaWYgKGlvbW11X3ByZXNlbnQoJnBsYXRmb3JtX2J1c190eXBlKSkgeworCQkJdWludDMyX3Qgb2Zmc2V0ID0gKHVpbnQzMl90KW1tYXBfb2Zmc2V0KG9iaik7CisJCQlyZXQgPSBtbXUtPmZ1bmNzLT5tYXAobW11LCBvZmZzZXQsIG1zbV9vYmotPnNndCwKKwkJCQkJb2JqLT5zaXplLCBJT01NVV9SRUFEIHwgSU9NTVVfV1JJVEUpOworCQkJbXNtX29iai0+ZG9tYWluW2lkXS5pb3ZhID0gb2Zmc2V0OworCQl9IGVsc2UgeworCQkJbXNtX29iai0+ZG9tYWluW2lkXS5pb3ZhID0gcGh5c2FkZHIob2JqKTsKKwkJfQogCX0KIAogCWlmICghcmV0KQpAQCAtNTE0LDYgKzUwNCw3IEBACiB2b2lkIG1zbV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBvYmotPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG1zbV9nZW1fb2JqZWN0ICptc21fb2JqID0gdG9fbXNtX2JvKG9iaik7CiAJaW50IGlkOwogCkBAIC01MjUsMTEgKzUxNiwxMCBAQAogCWxpc3RfZGVsKCZtc21fb2JqLT5tbV9saXN0KTsKIAogCWZvciAoaWQgPSAwOyBpZCA8IEFSUkFZX1NJWkUobXNtX29iai0+ZG9tYWluKTsgaWQrKykgewotCQlpZiAobXNtX29iai0+ZG9tYWluW2lkXS5pb3ZhKSB7Ci0JCQlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gb2JqLT5kZXYtPmRldl9wcml2YXRlOworCQlzdHJ1Y3QgbXNtX21tdSAqbW11ID0gcHJpdi0+bW11c1tpZF07CisJCWlmIChtbXUgJiYgbXNtX29iai0+ZG9tYWluW2lkXS5pb3ZhKSB7CiAJCQl1aW50MzJfdCBvZmZzZXQgPSAodWludDMyX3QpbW1hcF9vZmZzZXQob2JqKTsKLQkJCXVubWFwX3JhbmdlKHByaXYtPmlvbW11c1tpZF0sIG9mZnNldCwKLQkJCQkJbXNtX29iai0+c2d0LCBvYmotPnNpemUpOworCQkJbW11LT5mdW5jcy0+dW5tYXAobW11LCBvZmZzZXQsIG1zbV9vYmotPnNndCwgb2JqLT5zaXplKTsKIAkJfQogCX0KIApAQCAtNTkxLDYgKzU4MSw3IEBACiB7CiAJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG1zbV9nZW1fb2JqZWN0ICptc21fb2JqOworCXVuc2lnbmVkIHN6OwogCiAJc3dpdGNoIChmbGFncyAmIE1TTV9CT19DQUNIRV9NQVNLKSB7CiAJY2FzZSBNU01fQk9fVU5DQUNIRUQ6CkBAIC02MDMsMTAgKzU5NCwxNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltc21fb2JqID0ga3phbGxvYyhzaXplb2YoKm1zbV9vYmopLCBHRlBfS0VSTkVMKTsKKwlzeiA9IHNpemVvZigqbXNtX29iaik7CisJaWYgKCFpb21tdV9wcmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpCisJCXN6ICs9IHNpemVvZihzdHJ1Y3QgZHJtX21tX25vZGUpOworCisJbXNtX29iaiA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwogCWlmICghbXNtX29iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoIWlvbW11X3ByZXNlbnQoJnBsYXRmb3JtX2J1c190eXBlKSkKKwkJbXNtX29iai0+dnJhbV9ub2RlID0gKHZvaWQgKikmbXNtX29ialsxXTsKKwogCW1zbV9vYmotPmZsYWdzID0gZmxhZ3M7CiAKIAltc21fb2JqLT5yZXN2ID0gJm1zbV9vYmotPl9yZXN2OwpAQCAtNjIzLDcgKzYyMSw3IEBACiBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm1zbV9nZW1fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGZsYWdzKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwpAQCAtNjM0LDkgKzYzMiwxMyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZmFpbDsKIAotCXJldCA9IGRybV9nZW1fb2JqZWN0X2luaXQoZGV2LCBvYmosIHNpemUpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKKwlpZiAoaW9tbXVfcHJlc2VudCgmcGxhdGZvcm1fYnVzX3R5cGUpKSB7CisJCXJldCA9IGRybV9nZW1fb2JqZWN0X2luaXQoZGV2LCBvYmosIHNpemUpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCWRybV9nZW1fcHJpdmF0ZV9vYmplY3RfaW5pdChkZXYsIG9iaiwgc2l6ZSk7CisJfQogCiAJcmV0dXJuIG9iajsKIApAQCAtNjU0LDYgKzY1NiwxMiBAQAogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQsIG5wYWdlczsKIAorCS8qIGlmIHdlIGRvbid0IGhhdmUgSU9NTVUsIGRvbid0IGJvdGhlciBwcmV0ZW5kaW5nIHdlIGNhbiBpbXBvcnQ6ICovCisJaWYgKCFpb21tdV9wcmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpIHsKKwkJZGV2X2VycihkZXYtPmRldiwgImNhbm5vdCBpbXBvcnQgd2l0aG91dCBJT01NVVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwogCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwogCiAJcmV0ID0gbXNtX2dlbV9uZXdfaW1wbChkZXYsIHNpemUsIE1TTV9CT19XQywgJm9iaik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCmluZGV4IGY0ZjIzYTUuLjMyNDZiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCkBAIC01Nyw2ICs1NywxMSBAQAogCS8qIG5vcm1hbGx5IChyZXN2ID09ICZfcmVzdikgZXhjZXB0IGZvciBpbXBvcnRlZCBibydzICovCiAJc3RydWN0IHJlc2VydmF0aW9uX29iamVjdCAqcmVzdjsKIAlzdHJ1Y3QgcmVzZXJ2YXRpb25fb2JqZWN0IF9yZXN2OworCisJLyogRm9yIHBoeXNpY2FsbHkgY29udGlndW91cyBidWZmZXJzLiAgVXNlZCB3aGVuIHdlIGRvbid0IGhhdmUKKwkgKiBhbiBJT01NVS4KKwkgKi8KKwlzdHJ1Y3QgZHJtX21tX25vZGUgKnZyYW1fbm9kZTsKIH07CiAjZGVmaW5lIHRvX21zbV9ibyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IG1zbV9nZW1fb2JqZWN0LCBiYXNlKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCmluZGV4IDQ1ODNkNjEuLjRlYmNlOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlICJtc21fZ3B1LmgiCiAjaW5jbHVkZSAibXNtX2dlbS5oIgorI2luY2x1ZGUgIm1zbV9tbXUuaCIKIAogCiAvKgpAQCAtMjUsMjAgKzI2LDEwIEBACiAKICNpZmRlZiBDT05GSUdfTVNNX0JVU19TQ0FMSU5HCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gva2dzbC5oPgotc3RhdGljIHZvaWQgYnNfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgYnNfaW5pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBncHUtPmRldjsKLQlzdHJ1Y3Qga2dzbF9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0KLQlpZiAoIXBkZXYpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIGR0diBwZGF0YVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YS0+YnVzX3NjYWxlX3RhYmxlKSB7Ci0JCWdwdS0+YnNjID0gbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQocGRhdGEtPmJ1c19zY2FsZV90YWJsZSk7CisJaWYgKGdwdS0+YnVzX3NjYWxlX3RhYmxlKSB7CisJCWdwdS0+YnNjID0gbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQoZ3B1LT5idXNfc2NhbGVfdGFibGUpOwogCQlEQkcoImJ1cyBzY2FsZSBjbGllbnQ6ICUwOHgiLCBncHUtPmJzYyk7CiAJfQogfQpAQCAtNTksNyArNTAsNyBAQAogCX0KIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBic19pbml0KHN0cnVjdCBtc21fZ3B1ICpncHUsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHt9CitzdGF0aWMgdm9pZCBic19pbml0KHN0cnVjdCBtc21fZ3B1ICpncHUpIHt9CiBzdGF0aWMgdm9pZCBic19maW5pKHN0cnVjdCBtc21fZ3B1ICpncHUpIHt9CiBzdGF0aWMgdm9pZCBic19zZXQoc3RydWN0IG1zbV9ncHUgKmdwdSwgaW50IGlkeCkge30KICNlbmRpZgpAQCAtMzYzLDYgKzM1NCw3IEBACiAJCXN0cnVjdCBtc21fZ3B1ICpncHUsIGNvbnN0IHN0cnVjdCBtc21fZ3B1X2Z1bmNzICpmdW5jcywKIAkJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaW9uYW1lLCBjb25zdCBjaGFyICppcnFuYW1lLCBpbnQgcmluZ3N6KQogeworCXN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11OwogCWludCBpLCByZXQ7CiAKIAlncHUtPmRldiA9IGRybTsKQEAgLTQyOCwxMyArNDIwLDE0IEBACiAJICogYW5kIGhhdmUgc2VwYXJhdGUgcGFnZSB0YWJsZXMgcGVyIGNvbnRleHQuICBGb3Igbm93LCB0byBrZWVwIHRoaW5ncwogCSAqIHNpbXBsZSBhbmQgdG8gZ2V0IHNvbWV0aGluZyB3b3JraW5nLCBqdXN0IHVzZSBhIHNpbmdsZSBhZGRyZXNzIHNwYWNlOgogCSAqLwotCWdwdS0+aW9tbXUgPSBpb21tdV9kb21haW5fYWxsb2MoJnBsYXRmb3JtX2J1c190eXBlKTsKLQlpZiAoIWdwdS0+aW9tbXUpIHsKLQkJZGV2X2Vycihkcm0tPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBJT01NVVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKKwlpb21tdSA9IGlvbW11X2RvbWFpbl9hbGxvYygmcGxhdGZvcm1fYnVzX3R5cGUpOworCWlmIChpb21tdSkgeworCQlkZXZfaW5mbyhkcm0tPmRldiwgIiVzOiB1c2luZyBJT01NVVxuIiwgbmFtZSk7CisJCWdwdS0+bW11ID0gbXNtX2lvbW11X25ldyhkcm0sIGlvbW11KTsKKwl9IGVsc2UgeworCQlkZXZfaW5mbyhkcm0tPmRldiwgIiVzOiBubyBJT01NVSwgZmFsbGJhY2sgdG8gVlJBTSBjYXJ2ZW91dCFcbiIsIG5hbWUpOwogCX0KLQlncHUtPmlkID0gbXNtX3JlZ2lzdGVyX2lvbW11KGRybSwgZ3B1LT5pb21tdSk7CisJZ3B1LT5pZCA9IG1zbV9yZWdpc3Rlcl9tbXUoZHJtLCBncHUtPm1tdSk7CiAKIAkvKiBDcmVhdGUgcmluZ2J1ZmZlcjogKi8KIAlncHUtPnJiID0gbXNtX3JpbmdidWZmZXJfbmV3KGdwdSwgcmluZ3N6KTsKQEAgLTQ1Miw3ICs0NDUsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JYnNfaW5pdChncHUsIHBkZXYpOworCWJzX2luaXQoZ3B1KTsKIAogCXJldHVybiAwOwogCkBAIC00NzQsNiArNDY3LDYgQEAKIAkJbXNtX3JpbmdidWZmZXJfZGVzdHJveShncHUtPnJiKTsKIAl9CiAKLQlpZiAoZ3B1LT5pb21tdSkKLQkJaW9tbXVfZG9tYWluX2ZyZWUoZ3B1LT5pb21tdSk7CisJaWYgKGdwdS0+bW11KQorCQlncHUtPm1tdS0+ZnVuY3MtPmRlc3Ryb3koZ3B1LT5tbXUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaAppbmRleCA4Y2Q4MjllLi40NThkYjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaApAQCAtNzgsMTQgKzc4LDE4IEBACiAJdm9pZCBfX2lvbWVtICptbWlvOwogCWludCBpcnE7CiAKLQlzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdTsKKwlzdHJ1Y3QgbXNtX21tdSAqbW11OwogCWludCBpZDsKIAogCS8qIFBvd2VyIENvbnRyb2w6ICovCiAJc3RydWN0IHJlZ3VsYXRvciAqZ3B1X3JlZywgKmdwdV9jeDsKIAlzdHJ1Y3QgY2xrICplYmkxX2NsaywgKmdycF9jbGtzWzVdOwogCXVpbnQzMl90IGZhc3RfcmF0ZSwgc2xvd19yYXRlLCBidXNfZnJlcTsKKworI2lmZGVmIENPTkZJR19NU01fQlVTX1NDQUxJTkcKKwlzdHJ1Y3QgbXNtX2J1c19zY2FsZV9wZGF0YSAqYnVzX3NjYWxlX3RhYmxlOwogCXVpbnQzMl90IGJzYzsKKyNlbmRpZgogCiAJLyogSGFuZyBEZXRjdGlvbjogKi8KICNkZWZpbmUgRFJNX01TTV9IQU5HQ0hFQ0tfUEVSSU9EIDUwMCAvKiBpbiBtcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21faW9tbXUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2lvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNzQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2lvbW11LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibXNtX2Rydi5oIgorI2luY2x1ZGUgIm1zbV9tbXUuaCIKKworc3RydWN0IG1zbV9pb21tdSB7CisJc3RydWN0IG1zbV9tbXUgYmFzZTsKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47Cit9OworI2RlZmluZSB0b19tc21faW9tbXUoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBtc21faW9tbXUsIGJhc2UpCisKK3N0YXRpYyBpbnQgbXNtX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGlvbW11X2RvbWFpbiAqaW9tbXUsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgbG9uZyBpb3ZhLCBpbnQgZmxhZ3MsIHZvaWQgKmFyZykKK3sKKwlEQkcoIioqKiBmYXVsdDogaW92YT0lMDhseCwgZmxhZ3M9JWQiLCBpb3ZhLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2lvbW11X2F0dGFjaChzdHJ1Y3QgbXNtX21tdSAqbW11LCBjb25zdCBjaGFyICoqbmFtZXMsIGludCBjbnQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1tdS0+ZGV2OworCXN0cnVjdCBtc21faW9tbXUgKmlvbW11ID0gdG9fbXNtX2lvbW11KG1tdSk7CisJaW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlzdHJ1Y3QgZGV2aWNlICptc21faW9tbXVfZ2V0X2N0eChjb25zdCBjaGFyICpjdHhfbmFtZSk7CisJCXN0cnVjdCBkZXZpY2UgKmN0eCA9IG1zbV9pb21tdV9nZXRfY3R4KG5hbWVzW2ldKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKGN0eCkpCisJCQljb250aW51ZTsKKwkJcmV0ID0gaW9tbXVfYXR0YWNoX2RldmljZShpb21tdS0+ZG9tYWluLCBjdHgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfd2FybihkZXYtPmRldiwgImNvdWxkIG5vdCBhdHRhY2ggaW9tbXUgdG8gJXMiLCBuYW1lc1tpXSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2lvbW11X21hcChzdHJ1Y3QgbXNtX21tdSAqbW11LCB1aW50MzJfdCBpb3ZhLAorCQlzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdW5zaWduZWQgbGVuLCBpbnQgcHJvdCkKK3sKKwlzdHJ1Y3QgbXNtX2lvbW11ICppb21tdSA9IHRvX21zbV9pb21tdShtbXUpOworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IGlvbW11LT5kb21haW47CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgZGEgPSBpb3ZhOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXQ7CisKKwlpZiAoIWRvbWFpbiB8fCAhc2d0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgeworCQl1MzIgcGEgPSBzZ19waHlzKHNnKSAtIHNnLT5vZmZzZXQ7CisJCXNpemVfdCBieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCVZFUkIoIm1hcFslZF06ICUwOHggJTA4eCgleCkiLCBpLCBpb3ZhLCBwYSwgYnl0ZXMpOworCisJCXJldCA9IGlvbW11X21hcChkb21haW4sIGRhLCBwYSwgYnl0ZXMsIHByb3QpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCisJCWRhICs9IGJ5dGVzOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCWRhID0gaW92YTsKKworCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgaSwgaikgeworCQlzaXplX3QgYnl0ZXMgPSBzZy0+bGVuZ3RoICsgc2ctPm9mZnNldDsKKwkJaW9tbXVfdW5tYXAoZG9tYWluLCBkYSwgYnl0ZXMpOworCQlkYSArPSBieXRlczsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21faW9tbXVfdW5tYXAoc3RydWN0IG1zbV9tbXUgKm1tdSwgdWludDMyX3QgaW92YSwKKwkJc3RydWN0IHNnX3RhYmxlICpzZ3QsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgbXNtX2lvbW11ICppb21tdSA9IHRvX21zbV9pb21tdShtbXUpOworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IGlvbW11LT5kb21haW47CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgZGEgPSBpb3ZhOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCQlzaXplX3QgdW5tYXBwZWQ7CisKKwkJdW5tYXBwZWQgPSBpb21tdV91bm1hcChkb21haW4sIGRhLCBieXRlcyk7CisJCWlmICh1bm1hcHBlZCA8IGJ5dGVzKQorCQkJcmV0dXJuIHVubWFwcGVkOworCisJCVZFUkIoInVubWFwWyVkXTogJTA4eCgleCkiLCBpLCBpb3ZhLCBieXRlcyk7CisKKwkJQlVHX09OKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKTsKKworCQlkYSArPSBieXRlczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2lvbW11X2Rlc3Ryb3koc3RydWN0IG1zbV9tbXUgKm1tdSkKK3sKKwlzdHJ1Y3QgbXNtX2lvbW11ICppb21tdSA9IHRvX21zbV9pb21tdShtbXUpOworCWlvbW11X2RvbWFpbl9mcmVlKGlvbW11LT5kb21haW4pOworCWtmcmVlKGlvbW11KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fbW11X2Z1bmNzIGZ1bmNzID0geworCQkuYXR0YWNoID0gbXNtX2lvbW11X2F0dGFjaCwKKwkJLm1hcCA9IG1zbV9pb21tdV9tYXAsCisJCS51bm1hcCA9IG1zbV9pb21tdV91bm1hcCwKKwkJLmRlc3Ryb3kgPSBtc21faW9tbXVfZGVzdHJveSwKK307CisKK3N0cnVjdCBtc21fbW11ICptc21faW9tbXVfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgbXNtX2lvbW11ICppb21tdTsKKworCWlvbW11ID0ga3phbGxvYyhzaXplb2YoKmlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpb21tdS0+ZG9tYWluID0gZG9tYWluOworCW1zbV9tbXVfaW5pdCgmaW9tbXUtPmJhc2UsIGRldiwgJmZ1bmNzKTsKKwlpb21tdV9zZXRfZmF1bHRfaGFuZGxlcihkb21haW4sIG1zbV9mYXVsdF9oYW5kbGVyLCBkZXYpOworCisJcmV0dXJuICZpb21tdS0+YmFzZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2ttcy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fa21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0Mzc3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2ttcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fTVNNX0tNU19IX18KKyNkZWZpbmUgX19NU01fS01TX0hfXworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisKKy8qIEFzIHRoZXJlIGFyZSBkaWZmZXJlbnQgZGlzcGxheSBjb250cm9sbGVyIGJsb2NrcyBkZXBlbmRpbmcgb24gdGhlCisgKiBzbmFwZHJhZ29uIHZlcnNpb24sIHRoZSBrbXMgc3VwcG9ydCBpcyBzcGxpdCBvdXQgYW5kIHRoZSBhcHByb3ByaWF0ZQorICogaW1wbGVtZW50YXRpb24gaXMgbG9hZGVkIGF0IHJ1bnRpbWUuICBUaGUga21zIG1vZHVsZSBpcyByZXNwb25zaWJsZQorICogZm9yIGNvbnN0cnVjdGluZyB0aGUgYXBwcm9wcmlhdGUgcGxhbmVzL2NydGNzL2VuY29kZXJzL2Nvbm5lY3RvcnMuCisgKi8KK3N0cnVjdCBtc21fa21zX2Z1bmNzIHsKKwkvKiBodyBpbml0aWFsaXphdGlvbjogKi8KKwlpbnQgKCpod19pbml0KShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKKwkvKiBpcnEgaGFuZGxpbmc6ICovCisJdm9pZCAoKmlycV9wcmVpbnN0YWxsKShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKKwlpbnQgKCppcnFfcG9zdGluc3RhbGwpKHN0cnVjdCBtc21fa21zICprbXMpOworCXZvaWQgKCppcnFfdW5pbnN0YWxsKShzdHJ1Y3QgbXNtX2ttcyAqa21zKTsKKwlpcnFyZXR1cm5fdCAoKmlycSkoc3RydWN0IG1zbV9rbXMgKmttcyk7CisJaW50ICgqZW5hYmxlX3ZibGFuaykoc3RydWN0IG1zbV9rbXMgKmttcywgc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKwl2b2lkICgqZGlzYWJsZV92YmxhbmspKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisJLyogbWlzYzogKi8KKwljb25zdCBzdHJ1Y3QgbXNtX2Zvcm1hdCAqKCpnZXRfZm9ybWF0KShzdHJ1Y3QgbXNtX2ttcyAqa21zLCB1aW50MzJfdCBmb3JtYXQpOworCWxvbmcgKCpyb3VuZF9waXhjbGspKHN0cnVjdCBtc21fa21zICprbXMsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CisJLyogY2xlYW51cDogKi8KKwl2b2lkICgqcHJlY2xvc2UpKHN0cnVjdCBtc21fa21zICprbXMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBtc21fa21zICprbXMpOworfTsKKworc3RydWN0IG1zbV9rbXMgeworCWNvbnN0IHN0cnVjdCBtc21fa21zX2Z1bmNzICpmdW5jczsKKworCS8qIGlycSBoYW5kbGluZzogKi8KKwlib29sIGluX2lycTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlycV9saXN0OyAgICAvKiBsaXN0IG9mIG1kcDRfaXJxICovCisJdWludDMyX3QgdmJsYW5rX21hc2s7ICAgICAgICAgLyogaXJxIGJpdHMgc2V0IGZvciB1c2Vyc3BhY2UgdmJsYW5rICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2ttc19pbml0KHN0cnVjdCBtc21fa21zICprbXMsCisJCWNvbnN0IHN0cnVjdCBtc21fa21zX2Z1bmNzICpmdW5jcykKK3sKKwlrbXMtPmZ1bmNzID0gZnVuY3M7Cit9CisKK3N0cnVjdCBtc21fa21zICptZHA0X2ttc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworc3RydWN0IG1zbV9rbXMgKm1kcDVfa21zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBfX01TTV9LTVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9tbXUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX21tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDMyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9tbXUuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX01TTV9NTVVfSF9fCisjZGVmaW5lIF9fTVNNX01NVV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CisKK3N0cnVjdCBtc21fbW11X2Z1bmNzIHsKKwlpbnQgKCphdHRhY2gpKHN0cnVjdCBtc21fbW11ICptbXUsIGNvbnN0IGNoYXIgKipuYW1lcywgaW50IGNudCk7CisJaW50ICgqbWFwKShzdHJ1Y3QgbXNtX21tdSAqbW11LCB1aW50MzJfdCBpb3ZhLCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwKKwkJCXVuc2lnbmVkIGxlbiwgaW50IHByb3QpOworCWludCAoKnVubWFwKShzdHJ1Y3QgbXNtX21tdSAqbW11LCB1aW50MzJfdCBpb3ZhLCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwKKwkJCXVuc2lnbmVkIGxlbik7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBtc21fbW11ICptbXUpOworfTsKKworc3RydWN0IG1zbV9tbXUgeworCWNvbnN0IHN0cnVjdCBtc21fbW11X2Z1bmNzICpmdW5jczsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9tbXVfaW5pdChzdHJ1Y3QgbXNtX21tdSAqbW11LCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQljb25zdCBzdHJ1Y3QgbXNtX21tdV9mdW5jcyAqZnVuY3MpCit7CisJbW11LT5kZXYgPSBkZXY7CisJbW11LT5mdW5jcyA9IGZ1bmNzOworfQorCitzdHJ1Y3QgbXNtX21tdSAqbXNtX2lvbW11X25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pOworc3RydWN0IG1zbV9tbXUgKm1zbV9ncHVtbXVfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBtc21fZ3B1ICpncHUpOworCisjZW5kaWYgLyogX19NU01fTU1VX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQppbmRleCBiM2ZhMWJhLi5lODgxNDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQpAQCAtNDEsNiArNDEsNyBAQAogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2Jpb3MvbXhtLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9iaW9zL3BlcmYubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2Jpb3MvcGxsLm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9iaW9zL3JhbWNmZy5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvYmlvcy9yYW1tYXAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2Jpb3MvdGltaW5nLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9iaW9zL3RoZXJtLm8KQEAgLTcxLDcgKzcyLDEwIEBACiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZGV2aW5pdC9udjFhLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9kZXZpbml0L252MjAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2RldmluaXQvbnY1MC5vCitub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZGV2aW5pdC9udjg0Lm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9kZXZpbml0L252OTgubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2RldmluaXQvbnZhMy5vCitub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZGV2aW5pdC9udmFmLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9kZXZpbml0L252YzAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2ZiL2Jhc2Uubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2ZiL252MDQubwpAQCAtMjMyLDYgKzIzNiw3IEBACiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZmlmby9udjg0Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9maWZvL252YzAubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2ZpZm8vbnZlMC5vCitub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZmlmby9udjEwOC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnY0MC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnY1MC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZjMC5vCkBAIC0yNDIsNiArMjQ3LDcgQEAKIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9jdHhudmQ5Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9jdHhudmU0Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9jdHhudmYwLm8KK25vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9jdHhudjEwOC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvbnYwNC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvbnYxMC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvbnYyMC5vCkBAIC0yNjAsNiArMjY2LDcgQEAKIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmQ5Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmU0Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmYwLm8KK25vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udjEwOC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvbXBlZy9udjMxLm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9tcGVnL252NDAubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL21wZWcvbnY0NC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2NvcmUvZW5naW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2NvcmUvZW5naW5lLmMKaW5kZXggYzhiZWQ0YS4uMWY2OTU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9jb3JlL2VuZ2luZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvY29yZS9lbmdpbmUuYwpAQCAtNDIsMTEgKzQyLDI0IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICggcGFyZW50ICYmCi0JICAgICFub3V2ZWF1X2Jvb2xvcHQobnZfZGV2aWNlKHBhcmVudCktPmNmZ29wdCwgaW5hbWUsIGVuYWJsZSkpIHsKLQkJaWYgKCFlbmFibGUpCi0JCQludl93YXJuKGVuZ2luZSwgImRpc2FibGVkLCAlcz0xIHRvIGVuYWJsZVxuIiwgaW5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGFyZW50KSB7CisJCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZfZGV2aWNlKHBhcmVudCk7CisJCWludCBlbmdpZHggPSBudl9lbmdpZHgobnZfb2JqZWN0KGVuZ2luZSkpOworCisJCWlmIChkZXZpY2UtPmRpc2FibGVfbWFzayAmICgxVUxMIDw8IGVuZ2lkeCkpIHsKKwkJCWlmICghbm91dmVhdV9ib29sb3B0KGRldmljZS0+Y2Znb3B0LCBpbmFtZSwgZmFsc2UpKSB7CisJCQkJbnZfZGVidWcoZW5naW5lLCAiZW5naW5lIGRpc2FibGVkIGJ5IGh3L2Z3XG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKworCQkJbnZfd2FybihlbmdpbmUsICJpZ25vcmluZyBody9mdyBlbmdpbmUgZGlzYWJsZVxuIik7CisJCX0KKworCQlpZiAoIW5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgaW5hbWUsIGVuYWJsZSkpIHsKKwkJCWlmICghZW5hYmxlKQorCQkJCW52X3dhcm4oZW5naW5lLCAiZGlzYWJsZWQsICVzPTEgdG8gZW5hYmxlXG4iLCBpbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZlbmdpbmUtPmNvbnRleHRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2NvcHkvbnZjMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvY29weS9udmMwLmMKaW5kZXggOTkzZGYwOS4uYWMzMjkxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvY29weS9udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvY29weS9udmMwLmMKQEAgLTEwNSw5ICsxMDUsNiBAQAogCXN0cnVjdCBudmMwX2NvcHlfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKG52X3JkMzIocGFyZW50LCAweDAyMjUwMCkgJiAweDAwMDAwMTAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IG5vdXZlYXVfZmFsY29uX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAweDEwNDAwMCwgdHJ1ZSwKIAkJCQkgICAgIlBDRTAiLCAiY29weTAiLCAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CkBAIC0xMzMsOSArMTMwLDYgQEAKIAlzdHJ1Y3QgbnZjMF9jb3B5X3ByaXYgKnByaXY7CiAJaW50IHJldDsKIAotCWlmIChudl9yZDMyKHBhcmVudCwgMHgwMjI1MDApICYgMHgwMDAwMDIwMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZXQgPSBub3V2ZWF1X2ZhbGNvbl9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgMHgxMDUwMDAsIHRydWUsCiAJCQkJICAgICJQQ0UxIiwgImNvcHkxIiwgJnByaXYpOwogCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvY29weS9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9jb3B5L252ZTAuYwppbmRleCAzMGYxZWYxLi43NDhhNjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9jb3B5L252ZTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9jb3B5L252ZTAuYwpAQCAtODgsOSArODgsNiBAQAogCXN0cnVjdCBudmUwX2NvcHlfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKG52X3JkMzIocGFyZW50LCAweDAyMjUwMCkgJiAweDAwMDAwMTAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IG5vdXZlYXVfZW5naW5lX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCB0cnVlLAogCQkJCSAgICAiUENFMCIsICJjb3B5MCIsICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKQEAgLTExMiw5ICsxMDksNiBAQAogCXN0cnVjdCBudmUwX2NvcHlfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKG52X3JkMzIocGFyZW50LCAweDAyMjUwMCkgJiAweDAwMDAwMjAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IG5vdXZlYXVfZW5naW5lX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCB0cnVlLAogCQkJCSAgICAiUENFMSIsICJjb3B5MSIsICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjA0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYwNC5jCmluZGV4IGRiZDJkZGUuLjMyMTEzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MDQuYwpAQCAtNDksMTIgKzQ5LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjA0X2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYwNF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjA0X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjA0X2ZpZm9fb2NsYXNzOwpAQCAtNjcsMTIgKzY3LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjA1X2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYwNV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjA0X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjA0X2ZpZm9fb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjEwLmMKaW5kZXggNmUwM2RkNi4uNzQ0ZjE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYxMC5jCkBAIC01MSwxMiArNTEsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MTBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjA0X2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52MTBfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnYwNF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52MDRfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52MDRfZG1hZW5nX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0dSICAgICBdID0gJm52MTBfZ3JhcGhfb2NsYXNzOwpAQCAtNjgsMTIgKzY4LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjEwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjEwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjEwX2ZpZm9fb2NsYXNzOwpAQCAtODcsMTIgKzg3LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjEwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjEwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjEwX2ZpZm9fb2NsYXNzOwpAQCAtMTA2LDEyICsxMDYsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MWFfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjA0X2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52MWFfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnYwNF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52MDRfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52MDRfZG1hZW5nX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0ZJRk8gICBdID0gIG52MTBfZmlmb19vY2xhc3M7CkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnYxMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MTBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52MDRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnYxMF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjA0X2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnYwNF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52MDRfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgbnYxMF9maWZvX29jbGFzczsKQEAgLTE0NCwxMiArMTQ0LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjEwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjEwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjE3X2ZpZm9fb2NsYXNzOwpAQCAtMTYzLDEyICsxNjMsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MWFfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjA0X2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52MWFfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnYwNF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52MDRfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52MDRfZG1hZW5nX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0ZJRk8gICBdID0gIG52MTdfZmlmb19vY2xhc3M7CkBAIC0xODIsMTIgKzE4MiwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnYxMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MTBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52MDRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnYxMF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjA0X2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnYwNF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52MDRfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgbnYxN19maWZvX29jbGFzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjIwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYyMC5jCmluZGV4IGRjZGU1M2IuLjI3YmE2MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MjAuYwpAQCAtNTIsMTIgKzUyLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjIwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYyMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjIwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjE3X2ZpZm9fb2NsYXNzOwpAQCAtNzEsMTIgKzcxLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjIwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYyMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjI1X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjE3X2ZpZm9fb2NsYXNzOwpAQCAtOTAsMTIgKzkwLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjIwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYyMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYwNF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjI1X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjE3X2ZpZm9fb2NsYXNzOwpAQCAtMTA5LDEyICsxMDksMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MjBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjIwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjA0X2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52MjVfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnYwNF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52MDRfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52MDRfZG1hZW5nX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0ZJRk8gICBdID0gIG52MTdfZmlmb19vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYzMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MzAuYwppbmRleCA3Yjg2NjJlLi5mZDQ3YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYzMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjMwLmMKQEAgLTUyLDEyICs1MiwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnYyMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52MDRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnYzMF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjA0X2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnYwNF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52MDRfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgbnYxN19maWZvX29jbGFzczsKQEAgLTcxLDEyICs3MSwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnYyMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52MDRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnYzNV9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjA0X2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnYwNF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52MDRfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgbnYxN19maWZvX29jbGFzczsKQEAgLTkwLDEyICs5MCwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnYyMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52MzFfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnYzMF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjA0X2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnYwNF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52MDRfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgbnYxN19maWZvX29jbGFzczsKQEAgLTExMCwxMiArMTEwLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjIwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYyMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjM2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52MDRfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjA0X2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjE3X2ZpZm9fb2NsYXNzOwpAQCAtMTMwLDEyICsxMzAsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MTBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjMxX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52MTBfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnYwNF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52MDRfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52MDRfZG1hZW5nX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0ZJRk8gICBdID0gIG52MTdfZmlmb19vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY0MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NDAuYwppbmRleCBjOGM0MWU5Li4xYjY1M2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY0MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjQwLmMKQEAgLTU3LDEyICs1NywxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52MWFfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnY0MF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjMxX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52NDBfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY0MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NDBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjA0X3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZPTFQgICBdID0gJm52NDBfdm9sdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudjA0X2RtYWVuZ19vY2xhc3M7CkBAIC04MCwxMiArODAsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQxX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMTAzLDEyICsxMDMsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQxX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMTI2LDEyICsxMjYsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQxX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMTQ5LDEyICsxNDksMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnYwNF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMTcyLDEyICsxNzIsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ3X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMTk1LDEyICsxOTUsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ5X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMjE4LDEyICsyMTgsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ5X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0MV92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMjQxLDEyICsyNDEsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ0X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMjY0LDEyICsyNjQsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMjg3LDEyICsyODcsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ0X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMzEwLDEyICszMTAsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMzMzLDEyICszMzMsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52NGVfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjRlX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMzU2LDEyICszNTYsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtMzc5LDEyICszNzksMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpAQCAtNDAyLDEyICs0MDIsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjFhX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NDRfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnYzMV9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjQ2X2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NDBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjQwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY0NF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnYwNF9kbWFlbmdfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjUwLmMKaW5kZXggZGIzZmM3Yi4uODFkNWMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY1MC5jCkBAIC02NSwxMiArNjUsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gIG52NTBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY1MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudjUwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnY1MF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52NTBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnY1MF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudjUwX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY1MF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudjUwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwpAQCAtOTAsMTIgKzkwLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjUwX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52NTBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTExOCwxMiArMTE4LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjUwX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52NTBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTE0NiwxMiArMTQ2LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjUwX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52NTBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTE3NCwxMiArMTc0LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTIwMiwxMiArMjAyLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk0X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTIzMCwxMiArMjMwLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52OThfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTI1OCwxMiArMjU4LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52ODRfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnY4NF9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTI4NiwxMiArMjg2LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudmFhX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52OThfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZhYV9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTMxNCwxMiArMzE0LDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudmFhX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnY1MF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52OThfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZhYV9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk9MVCAgIF0gPSAmbnY0MF92b2x0X29jbGFzczsKQEAgLTM0MiwxMiArMzQyLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmEzX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZhM19kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YTNfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZhM19mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZhM19wd3Jfb2NsYXNzOwpAQCAtMzcyLDEyICszNzIsMTIgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YTNfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmEzX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZhM19kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52OThfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnY5NF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmEzX2ZiX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnY1MF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudjUwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QV1IgICAgXSA9ICZudmEzX3B3cl9vY2xhc3M7CkBAIC00MDEsMTIgKzQwMSwxMiBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZhM19jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52YTNfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudmEzX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnY5OF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudjk0X2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52YTNfZmJfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudjUwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52NTBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52YTNfcHdyX29jbGFzczsKQEAgLTQzMCwxMiArNDMwLDEyIEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmEzX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZhM19kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YWZfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjk4X21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52OTRfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZhZl9mYl9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52NTBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnY1MF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZhM19wd3Jfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252YzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmMwLmMKaW5kZXggZGJjNWUzMy4uYjdkNjZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252YzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnZjMC5jCkBAIC02NSwxNCArNjUsMTQgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzBfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmMwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmMwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52YzBfcHdyX29jbGFzczsKQEAgLTk3LDE0ICs5NywxNCBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZjMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52YzBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudmMwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnZjMF9tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudmMwX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52YzBfZmJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTFRDRyAgIF0gPSAmbnZjMF9sdGNnX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lCVVMgICBdID0gJm52YzBfaWJ1c19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52YzBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnZjMF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZjMF9wd3Jfb2NsYXNzOwpAQCAtMTI5LDE0ICsxMjksMTQgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmMwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmMwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52YzBfcHdyX29jbGFzczsKQEAgLTE2MCwxNCArMTYwLDE0IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZjMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YzBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudmMwX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52YzBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZjMF9mYl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9MVENHICAgXSA9ICZudmMwX2x0Y2dfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmbnZjMF9pYnVzX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnZjMF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudmMwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QV1IgICAgXSA9ICZudmMwX3B3cl9vY2xhc3M7CkBAIC0xOTIsMTQgKzE5MiwxNCBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZjMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52YzBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudmMwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnZjM19tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudmMwX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52YzBfZmJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTFRDRyAgIF0gPSAmbnZjMF9sdGNnX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lCVVMgICBdID0gJm52YzBfaWJ1c19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52YzBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnZjMF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZjMF9wd3Jfb2NsYXNzOwpAQCAtMjI0LDE0ICsyMjQsMTQgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmMwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmMwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52YzBfcHdyX29jbGFzczsKQEAgLTI1NSwxNCArMjU1LDE0IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZjMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YzBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudmMwX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52YzBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZjMF9mYl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9MVENHICAgXSA9ICZudmMwX2x0Y2dfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmbnZjMF9pYnVzX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnZjMF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudmMwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QV1IgICAgXSA9ICZudmMwX3B3cl9vY2xhc3M7CkBAIC0yODcsMTQgKzI4NywxNCBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZjMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52YzBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudmMwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnZjM19tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudmMwX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52YzBfZmJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTFRDRyAgIF0gPSAmbnZjMF9sdGNnX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lCVVMgICBdID0gJm52YzBfaWJ1c19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52YzBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnZjMF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZkMF9wd3Jfb2NsYXNzOwpAQCAtMzE4LDE0ICszMTgsMTQgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZkMF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmMwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmMwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gJm52ZDBfZG1hZW5nX29jbGFzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnZlMC5jCmluZGV4IDM5MDAxMDQuLjk4N2VkYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252ZTAuYwpAQCAtNjUsMTQgKzY1LDE0IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmUwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ZDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZjMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YzBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudmMzX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52YzBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZlMF9mYl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9MVENHICAgXSA9ICZudmMwX2x0Y2dfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmbnZlMF9pYnVzX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnZjMF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudmMwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QV1IgICAgXSA9ICZudmQwX3B3cl9vY2xhc3M7CkBAIC05OCwxNCArOTgsMTQgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52ZTBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZkMF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmUwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmUwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52ZDBfcHdyX29jbGFzczsKQEAgLTEzMSwxNCArMTMxLDE0IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmUwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ZDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAmbnZjMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52YzBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudmMzX21jX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52YzBfYnVzX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJm52MDRfdGltZXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRkIgICAgIF0gPSAgbnZlMF9mYl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9MVENHICAgXSA9ICZudmMwX2x0Y2dfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmbnZlMF9pYnVzX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gJm52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnZjMF92bW1ncl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudmMwX2Jhcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QV1IgICAgXSA9ICZudmQwX3B3cl9vY2xhc3M7CkBAIC0xNjQsMTQgKzE2NCwxNCBAQAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gJm52YzBfZGV2aW5pdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudmMwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnZjM19tY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CVVMgICAgXSA9ICBudmMwX2J1c19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZudjA0X3RpbWVyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIG52ZTBfZmJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTFRDRyAgIF0gPSAmbnZjMF9sdGNnX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lCVVMgICBdID0gJm52ZTBfaWJ1c19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICZudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAgbnY1MF9pbnN0bWVtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZNICAgICBdID0gJm52YzBfdm1tZ3Jfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQkFSICAgIF0gPSAmbnZjMF9iYXJfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfUFdSICAgIF0gPSAmbnZkMF9wd3Jfb2NsYXNzOwpAQCAtMTk5LDI5ICsxOTksMjcgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52ZTBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZkMF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICZudmMwX2RldmluaXRfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmUwX2ZiX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gJm52YzBfbHRjZ19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JQlVTICAgXSA9ICZudmUwX2lidXNfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSAmbnY1MF9pbnN0bWVtX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52MTA4X3B3cl9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WT0xUICAgXSA9ICZudjQwX3ZvbHRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRE1BT0JKIF0gPSAmbnZkMF9kbWFlbmdfb2NsYXNzOwotI2lmIDAKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0ZJRk8gICBdID0gIG52ZTBfZmlmb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudjEwOF9maWZvX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1NXICAgICBdID0gIG52YzBfc29mdHdhcmVfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfR1IgICAgIF0gPSAgbnZmMF9ncmFwaF9vY2xhc3M7Ci0jZW5kaWYKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0dSICAgICBdID0gIG52MTA4X2dyYXBoX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RJU1AgICBdID0gJm52ZjBfZGlzcF9vY2xhc3M7Ci0jaWYgMAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ09QWTAgIF0gPSAmbnZlMF9jb3B5MF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9DT1BZMSAgXSA9ICZudmUwX2NvcHkxX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0NPUFkyICBdID0gJm52ZTBfY29weTJfb2NsYXNzOworI2lmIDAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0JTUCAgICBdID0gJm52ZTBfYnNwX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1ZQICAgICBdID0gJm52ZTBfdnBfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfUFBQICAgIF0gPSAmbnZjMF9wcHBfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjA0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252MDQuYwppbmRleCBhMGJjOGE4Li43Y2Y4YjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252MDQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252MDQuYwpAQCAtMzEsOSArMzEsNDUgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwIGJhc2U7CiB9OwogCitzdGF0aWMgaW50CitudjA0X2Rpc3Bfc2Nhbm91dHBvcyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTMyIG10aGQsCisJCSAgICAgdm9pZCAqZGF0YSwgdTMyIHNpemUpCit7CisJc3RydWN0IG52MDRfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3QtPmVuZ2luZTsKKwlzdHJ1Y3QgbnYwNF9kaXNwbGF5X3NjYW5vdXRwb3MgKmFyZ3MgPSBkYXRhOworCWNvbnN0IGludCBoZWFkID0gKG10aGQgJiBOVjA0X0RJU1BfTVRIRF9IRUFEKTsKKwl1MzIgbGluZTsKKworCWlmIChzaXplIDwgc2l6ZW9mKCphcmdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhcmdzLT52YmxhbmtzID0gbnZfcmQzMihwcml2LCAweDY4MDgwMCArIChoZWFkICogMHgyMDAwKSkgJiAweGZmZmY7CisJYXJncy0+dnRvdGFsICA9IG52X3JkMzIocHJpdiwgMHg2ODA4MDQgKyAoaGVhZCAqIDB4MjAwMCkpICYgMHhmZmZmOworCWFyZ3MtPnZibGFua2UgPSBhcmdzLT52dG90YWwgLSAxOworCisJYXJncy0+aGJsYW5rcyA9IG52X3JkMzIocHJpdiwgMHg2ODA4MjAgKyAoaGVhZCAqIDB4MjAwMCkpICYgMHhmZmZmOworCWFyZ3MtPmh0b3RhbCAgPSBudl9yZDMyKHByaXYsIDB4NjgwODI0ICsgKGhlYWQgKiAweDIwMDApKSAmIDB4ZmZmZjsKKwlhcmdzLT5oYmxhbmtlID0gYXJncy0+aHRvdGFsIC0gMTsKKworCWFyZ3MtPnRpbWVbMF0gPSBrdGltZV90b19ucyhrdGltZV9nZXQoKSk7CisJbGluZSA9IG52X3JkMzIocHJpdiwgMHg2MDA4NjggKyAoaGVhZCAqIDB4MjAwMCkpOworCWFyZ3MtPnRpbWVbMV0gPSBrdGltZV90b19ucyhrdGltZV9nZXQoKSk7CisJYXJncy0+aGxpbmUgPSAobGluZSAmIDB4ZmZmZjAwMDApID4+IDE2OworCWFyZ3MtPnZsaW5lID0gKGxpbmUgJiAweDAwMDBmZmZmKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIRUFEX01USEQobikgKG4pLCAobikgKyAweDAxCisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9vbXRoZHMKK252MDRfZGlzcF9vbXRoZHNbXSA9IHsKKwl7IEhFQURfTVRIRChOVjA0X0RJU1BfU0NBTk9VVFBPUyksIG52MDRfZGlzcF9zY2Fub3V0cG9zIH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKIG52MDRfZGlzcF9zY2xhc3NbXSA9IHsKLQl7IE5WMDRfRElTUF9DTEFTUywgJm5vdXZlYXVfb2JqZWN0X29mdW5jcyB9LAorCXsgTlYwNF9ESVNQX0NMQVNTLCAmbm91dmVhdV9vYmplY3Rfb2Z1bmNzLCBudjA0X2Rpc3Bfb210aGRzIH0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCmluZGV4IGMxNjhhZTMuLjk0MGVhYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCkBAIC01NDEsNiArNTQxLDM1IEBACiAgKiBCYXNlIGRpc3BsYXkgb2JqZWN0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitpbnQKK252NTBfZGlzcF9iYXNlX3NjYW5vdXRwb3Moc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIHUzMiBtdGhkLAorCQkJICB2b2lkICpkYXRhLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdC0+ZW5naW5lOworCXN0cnVjdCBudjA0X2Rpc3BsYXlfc2Nhbm91dHBvcyAqYXJncyA9IGRhdGE7CisJY29uc3QgaW50IGhlYWQgPSAobXRoZCAmIE5WNTBfRElTUF9NVEhEX0hFQUQpOworCXUzMiBibGFua2UsIGJsYW5rcywgdG90YWw7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqYXJncykgfHwgaGVhZCA+PSBwcml2LT5oZWFkLm5yKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlibGFua2UgPSBudl9yZDMyKHByaXYsIDB4NjEwYWVjICsgKGhlYWQgKiAweDU0MCkpOworCWJsYW5rcyA9IG52X3JkMzIocHJpdiwgMHg2MTBhZjQgKyAoaGVhZCAqIDB4NTQwKSk7CisJdG90YWwgID0gbnZfcmQzMihwcml2LCAweDYxMGFmYyArIChoZWFkICogMHg1NDApKTsKKworCWFyZ3MtPnZibGFua2UgPSAoYmxhbmtlICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJYXJncy0+aGJsYW5rZSA9IChibGFua2UgJiAweDAwMDBmZmZmKTsKKwlhcmdzLT52YmxhbmtzID0gKGJsYW5rcyAmIDB4ZmZmZjAwMDApID4+IDE2OworCWFyZ3MtPmhibGFua3MgPSAoYmxhbmtzICYgMHgwMDAwZmZmZik7CisJYXJncy0+dnRvdGFsICA9ICggdG90YWwgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwlhcmdzLT5odG90YWwgID0gKCB0b3RhbCAmIDB4MDAwMGZmZmYpOworCisJYXJncy0+dGltZVswXSA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlhcmdzLT52bGluZSAgID0gbnZfcmQzMihwcml2LCAweDYxNjM0MCArIChoZWFkICogMHg4MDApKSAmIDB4ZmZmZjsKKwlhcmdzLT50aW1lWzFdID0ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0KCkpOyAvKiB2bGluZSByZWFkIGxvY2tzIGhsaW5lICovCisJYXJncy0+aGxpbmUgICA9IG52X3JkMzIocHJpdiwgMHg2MTYzNDQgKyAoaGVhZCAqIDB4ODAwKSkgJiAweGZmZmY7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBudjUwX2Rpc3BfYmFzZV92YmxhbmtfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGhlYWQpCiB7CkBAIC02NzUsNiArNzA0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X29tdGhkcwogbnY1MF9kaXNwX2Jhc2Vfb210aGRzW10gPSB7CisJeyBIRUFEX01USEQoTlY1MF9ESVNQX1NDQU5PVVRQT1MpICAgICAsIG52NTBfZGlzcF9iYXNlX3NjYW5vdXRwb3MgfSwKIAl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfUFdSKSAgICAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY1MF9ESVNQX1NPUl9MVkRTX1NDUklQVCkgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBEQUNfTVRIRChOVjUwX0RJU1BfREFDX1BXUikgICAgICAgICAsIG52NTBfZGFjX210aGQgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjUwLmgKaW5kZXggMWFlNmNlYi4uZDMxZDQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjUwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjUwLmgKQEAgLTQzLDYgKzQzLDEwIEBACiAJfSBwaW9yOwogfTsKIAorI2RlZmluZSBIRUFEX01USEQobikgKG4pLCAobikgKyAweDAzCisKK2ludCBudjUwX2Rpc3BfYmFzZV9zY2Fub3V0cG9zKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCB1MzIsIHZvaWQgKiwgdTMyKTsKKwogI2RlZmluZSBEQUNfTVRIRChuKSAobiksIChuKSArIDB4MDMKIAogaW50IG52NTBfZGFjX210aGQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHUzMiwgdm9pZCAqLCB1MzIpOwpAQCAtMTMyLDEzICsxMzYsMTIgQEAKIAogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29tdGhkcyBudjg0X2Rpc3BfYmFzZV9vbXRoZHNbXTsKIAotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29tdGhkcyBudmEzX2Rpc3BfYmFzZV9vbXRoZHNbXTsKLQogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29mdW5jcyBudmQwX2Rpc3BfbWFzdF9vZnVuY3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2Z1bmNzIG52ZDBfZGlzcF9zeW5jX29mdW5jczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MgbnZkMF9kaXNwX292bHlfb2Z1bmNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29mdW5jcyBudmQwX2Rpc3Bfb2ltbV9vZnVuY3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2Z1bmNzIG52ZDBfZGlzcF9jdXJzX29mdW5jczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vbXRoZHMgbnZkMF9kaXNwX2Jhc2Vfb210aGRzW107CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2Z1bmNzIG52ZDBfZGlzcF9iYXNlX29mdW5jczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnZkMF9kaXNwX2NjbGFzczsKIHZvaWQgbnZkMF9kaXNwX2ludHJfc3VwZXJ2aXNvcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ODQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY4NC5jCmluZGV4IGQ4Yzc0YzAuLmVmOWNlMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY4NC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY4NC5jCkBAIC00MSw2ICs0MSw3IEBACiAKIHN0cnVjdCBub3V2ZWF1X29tdGhkcwogbnY4NF9kaXNwX2Jhc2Vfb210aGRzW10gPSB7CisJeyBIRUFEX01USEQoTlY1MF9ESVNQX1NDQU5PVVRQT1MpICAgICAsIG52NTBfZGlzcF9iYXNlX3NjYW5vdXRwb3MgfSwKIAl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfUFdSKSAgICAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY4NF9ESVNQX1NPUl9IRE1JX1BXUikgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUKSAsIG52NTBfc29yX210aGQgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY5NC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKaW5kZXggYTY2Zjk0OS4uYTUxODU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X29tdGhkcwogbnY5NF9kaXNwX2Jhc2Vfb210aGRzW10gPSB7CisJeyBIRUFEX01USEQoTlY1MF9ESVNQX1NDQU5PVVRQT1MpICAgICAsIG52NTBfZGlzcF9iYXNlX3NjYW5vdXRwb3MgfSwKIAl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfUFdSKSAgICAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY4NF9ESVNQX1NPUl9IRE1JX1BXUikgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUKSAsIG52NTBfc29yX210aGQgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnZhMy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKaW5kZXggYjc1NDEzMS4uNmFkNmRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKQEAgLTM5LDggKzM5LDkgQEAKIAl7fQogfTsKIAotc3RydWN0IG5vdXZlYXVfb210aGRzCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfb210aGRzCiBudmEzX2Rpc3BfYmFzZV9vbXRoZHNbXSA9IHsKKwl7IEhFQURfTVRIRChOVjUwX0RJU1BfU0NBTk9VVFBPUykgICAgICwgbnY1MF9kaXNwX2Jhc2Vfc2Nhbm91dHBvcyB9LAogCXsgU09SX01USEQoTlY1MF9ESVNQX1NPUl9QV1IpICAgICAgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVkEzX0RJU1BfU09SX0hEQV9FTEQpICAgICAsIG52NTBfc29yX210aGQgfSwKIAl7IFNPUl9NVEhEKE5WODRfRElTUF9TT1JfSERNSV9QV1IpICAgICwgbnY1MF9zb3JfbXRoZCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmQwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYwppbmRleCAzNzhhMDE1Li4xYzVlNGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYwpAQCAtNDQwLDYgKzQ0MCwzNiBAQAogICogQmFzZSBkaXNwbGF5IG9iamVjdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIGludAorbnZkMF9kaXNwX2Jhc2Vfc2Nhbm91dHBvcyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTMyIG10aGQsCisJCQkgIHZvaWQgKmRhdGEsIHUzMiBzaXplKQoreworCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0LT5lbmdpbmU7CisJc3RydWN0IG52MDRfZGlzcGxheV9zY2Fub3V0cG9zICphcmdzID0gZGF0YTsKKwljb25zdCBpbnQgaGVhZCA9IChtdGhkICYgTlY1MF9ESVNQX01USERfSEVBRCk7CisJdTMyIGJsYW5rZSwgYmxhbmtzLCB0b3RhbDsKKworCWlmIChzaXplIDwgc2l6ZW9mKCphcmdzKSB8fCBoZWFkID49IHByaXYtPmhlYWQubnIpCisJCXJldHVybiAtRUlOVkFMOworCisJdG90YWwgID0gbnZfcmQzMihwcml2LCAweDY0MDQxNCArIChoZWFkICogMHgzMDApKTsKKwlibGFua2UgPSBudl9yZDMyKHByaXYsIDB4NjQwNDFjICsgKGhlYWQgKiAweDMwMCkpOworCWJsYW5rcyA9IG52X3JkMzIocHJpdiwgMHg2NDA0MjAgKyAoaGVhZCAqIDB4MzAwKSk7CisKKwlhcmdzLT52YmxhbmtlID0gKGJsYW5rZSAmIDB4ZmZmZjAwMDApID4+IDE2OworCWFyZ3MtPmhibGFua2UgPSAoYmxhbmtlICYgMHgwMDAwZmZmZik7CisJYXJncy0+dmJsYW5rcyA9IChibGFua3MgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwlhcmdzLT5oYmxhbmtzID0gKGJsYW5rcyAmIDB4MDAwMGZmZmYpOworCWFyZ3MtPnZ0b3RhbCAgPSAoIHRvdGFsICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJYXJncy0+aHRvdGFsICA9ICggdG90YWwgJiAweDAwMDBmZmZmKTsKKworCWFyZ3MtPnRpbWVbMF0gPSBrdGltZV90b19ucyhrdGltZV9nZXQoKSk7CisJYXJncy0+dmxpbmUgICA9IG52X3JkMzIocHJpdiwgMHg2MTYzNDAgKyAoaGVhZCAqIDB4ODAwKSkgJiAweGZmZmY7CisJYXJncy0+dGltZVsxXSA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsgLyogdmxpbmUgcmVhZCBsb2NrcyBobGluZSAqLworCWFyZ3MtPmhsaW5lICAgPSBudl9yZDMyKHByaXYsIDB4NjE2MzQ0ICsgKGhlYWQgKiAweDgwMCkpICYgMHhmZmZmOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZAogbnZkMF9kaXNwX2Jhc2VfdmJsYW5rX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBoZWFkKQogewpAQCAtNTczLDkgKzYwMywyNCBAQAogCS5maW5pID0gbnZkMF9kaXNwX2Jhc2VfZmluaSwKIH07CiAKK3N0cnVjdCBub3V2ZWF1X29tdGhkcworbnZkMF9kaXNwX2Jhc2Vfb210aGRzW10gPSB7CisJeyBIRUFEX01USEQoTlY1MF9ESVNQX1NDQU5PVVRQT1MpICAgICAsIG52ZDBfZGlzcF9iYXNlX3NjYW5vdXRwb3MgfSwKKwl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfUFdSKSAgICAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAorCXsgU09SX01USEQoTlZBM19ESVNQX1NPUl9IREFfRUxEKSAgICAgLCBudjUwX3Nvcl9tdGhkIH0sCisJeyBTT1JfTVRIRChOVjg0X0RJU1BfU09SX0hETUlfUFdSKSAgICAsIG52NTBfc29yX210aGQgfSwKKwl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfTFZEU19TQ1JJUFQpICwgbnY1MF9zb3JfbXRoZCB9LAorCXsgREFDX01USEQoTlY1MF9ESVNQX0RBQ19QV1IpICAgICAgICAgLCBudjUwX2RhY19tdGhkIH0sCisJeyBEQUNfTVRIRChOVjUwX0RJU1BfREFDX0xPQUQpICAgICAgICAsIG52NTBfZGFjX210aGQgfSwKKwl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9QV1IpICAgICAgICwgbnY1MF9waW9yX210aGQgfSwKKwl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9UTURTX1BXUikgICwgbnY1MF9waW9yX210aGQgfSwKKwl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9EUF9QV1IpICAgICwgbnY1MF9waW9yX210aGQgfSwKKwl7fSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKIG52ZDBfZGlzcF9iYXNlX29jbGFzc1tdID0gewotCXsgTlZEMF9ESVNQX0NMQVNTLCAmbnZkMF9kaXNwX2Jhc2Vfb2Z1bmNzLCBudmEzX2Rpc3BfYmFzZV9vbXRoZHMgfSwKKwl7IE5WRDBfRElTUF9DTEFTUywgJm52ZDBfZGlzcF9iYXNlX29mdW5jcywgbnZkMF9kaXNwX2Jhc2Vfb210aGRzIH0sCiAJe30KIH07CiAKQEAgLTk2Nyw5ICsxMDEyLDYgQEAKIAlpbnQgaGVhZHMgPSBudl9yZDMyKHBhcmVudCwgMHgwMjI0NDgpOwogCWludCByZXQ7CiAKLQlpZiAobnZfcmQzMihwYXJlbnQsIDB4MDIyNTAwKSAmIDB4MDAwMDAwMDEpCi0JCXJldHVybiAtRU5PREVWOwotCiAJcmV0ID0gbm91dmVhdV9kaXNwX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBoZWFkcywKIAkJCQkgICJQRElTUCIsICJkaXNwbGF5IiwgJnByaXYpOwogCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYwppbmRleCBmYjFmZTZhLi5hYjYzZjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYwpAQCAtNDEsNyArNDEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5vdXZlYXVfb2NsYXNzCiBudmUwX2Rpc3BfYmFzZV9vY2xhc3NbXSA9IHsKLQl7IE5WRTBfRElTUF9DTEFTUywgJm52ZDBfZGlzcF9iYXNlX29mdW5jcywgbnZhM19kaXNwX2Jhc2Vfb210aGRzIH0sCisJeyBOVkUwX0RJU1BfQ0xBU1MsICZudmQwX2Rpc3BfYmFzZV9vZnVuY3MsIG52ZDBfZGlzcF9iYXNlX29tdGhkcyB9LAogCXt9CiB9OwogCkBAIC01NCw5ICs1NCw2IEBACiAJaW50IGhlYWRzID0gbnZfcmQzMihwYXJlbnQsIDB4MDIyNDQ4KTsKIAlpbnQgcmV0OwogCi0JaWYgKG52X3JkMzIocGFyZW50LCAweDAyMjUwMCkgJiAweDAwMDAwMDAxKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IG5vdXZlYXVfZGlzcF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgaGVhZHMsCiAJCQkJICAiUERJU1AiLCAiZGlzcGxheSIsICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnZmMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmYwLmMKaW5kZXggNDJhYTZiOS4uMDVmZWUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmYwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmYwLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X29jbGFzcwogbnZmMF9kaXNwX2Jhc2Vfb2NsYXNzW10gPSB7Ci0JeyBOVkYwX0RJU1BfQ0xBU1MsICZudmQwX2Rpc3BfYmFzZV9vZnVuY3MsIG52YTNfZGlzcF9iYXNlX29tdGhkcyB9LAorCXsgTlZGMF9ESVNQX0NMQVNTLCAmbnZkMF9kaXNwX2Jhc2Vfb2Z1bmNzLCBudmQwX2Rpc3BfYmFzZV9vbXRoZHMgfSwKIAl7fQogfTsKIApAQCAtNTQsOSArNTQsNiBAQAogCWludCBoZWFkcyA9IG52X3JkMzIocGFyZW50LCAweDAyMjQ0OCk7CiAJaW50IHJldDsKIAotCWlmIChudl9yZDMyKHBhcmVudCwgMHgwMjI1MDApICYgMHgwMDAwMDAwMSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZXQgPSBub3V2ZWF1X2Rpc3BfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIGhlYWRzLAogCQkJCSAgIlBESVNQIiwgImRpc3BsYXkiLCAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3ZnYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC92Z2EuYwppbmRleCA1YTFjNjg0Li44ODM2YzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3ZnYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvdmdhLmMKQEAgLTEzOCwxMCArMTM4LDE1IEBACiBib29sCiBudl9sb2NrdmdhYyh2b2lkICpvYmosIGJvb2wgbG9jaykKIHsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldiA9IG52X2RldmljZShvYmopOworCiAJYm9vbCBsb2NrZWQgPSAhbnZfcmR2Z2FjKG9iaiwgMCwgMHgxZik7CiAJdTggZGF0YSA9IGxvY2sgPyAweDk5IDogMHg1NzsKLQludl93cnZnYWMob2JqLCAwLCAweDFmLCBkYXRhKTsKLQlpZiAobnZfZGV2aWNlKG9iaiktPmNoaXBzZXQgPT0gMHgxMSkgeworCWlmIChkZXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQludl93cnZnYWMob2JqLCAwLCAweDFmLCBkYXRhKTsKKwllbHNlCisJCW52X3dydmdhYyhvYmosIDAsIDB4M2YsIGRhdGEpOworCWlmIChkZXYtPmNoaXBzZXQgPT0gMHgxMSkgewogCQlpZiAoIShudl9yZDMyKG9iaiwgMHgwMDEwODQpICYgMHgxMDAwMDAwMCkpCiAJCQludl93cnZnYWMob2JqLCAxLCAweDFmLCBkYXRhKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9mYWxjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZhbGNvbi5jCmluZGV4IGUwM2ZjOGUuLjVlMDc3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZhbGNvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZhbGNvbi5jCkBAIC01Niw2ICs1NiwxNiBAQAogCW52X3dyMzIoZmFsY29uLCBmYWxjb24tPmFkZHIgKyBhZGRyLCBkYXRhKTsKIH0KIAorc3RhdGljIHZvaWQgKgordm1lbWR1cChjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCit7CisJdm9pZCAqcCA9IHZtYWxsb2MobGVuKTsKKworCWlmIChwKQorCQltZW1jcHkocCwgc3JjLCBsZW4pOworCXJldHVybiBwOworfQorCiBpbnQKIF9ub3V2ZWF1X2ZhbGNvbl9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQogewpAQCAtMTExLDcgKzEyMSw3IEBACiAKIAkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZkZXZpY2UtPnBkZXYtPmRldik7CiAJCWlmIChyZXQgPT0gMCkgewotCQkJZmFsY29uLT5jb2RlLmRhdGEgPSBrbWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlmYWxjb24tPmNvZGUuZGF0YSA9IHZtZW1kdXAoZnctPmRhdGEsIGZ3LT5zaXplKTsKIAkJCWZhbGNvbi0+Y29kZS5zaXplID0gZnctPnNpemU7CiAJCQlmYWxjb24tPmRhdGEuZGF0YSA9IE5VTEw7CiAJCQlmYWxjb24tPmRhdGEuc2l6ZSA9IDA7CkBAIC0xMzQsNyArMTQ0LDcgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlmYWxjb24tPmRhdGEuZGF0YSA9IGttZW1kdXAoZnctPmRhdGEsIGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwkJZmFsY29uLT5kYXRhLmRhdGEgPSB2bWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CiAJCWZhbGNvbi0+ZGF0YS5zaXplID0gZnctPnNpemU7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCQlpZiAoIWZhbGNvbi0+ZGF0YS5kYXRhKQpAQCAtMTQ5LDcgKzE1OSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJZmFsY29uLT5jb2RlLmRhdGEgPSBrbWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWZhbGNvbi0+Y29kZS5kYXRhID0gdm1lbWR1cChmdy0+ZGF0YSwgZnctPnNpemUpOwogCQlmYWxjb24tPmNvZGUuc2l6ZSA9IGZ3LT5zaXplOwogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJaWYgKCFmYWxjb24tPmNvZGUuZGF0YSkKQEAgLTIzNSw4ICsyNDUsOCBAQAogCWlmICghc3VzcGVuZCkgewogCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmZhbGNvbi0+Y29yZSk7CiAJCWlmIChmYWxjb24tPmV4dGVybmFsKSB7Ci0JCQlrZnJlZShmYWxjb24tPmRhdGEuZGF0YSk7Ci0JCQlrZnJlZShmYWxjb24tPmNvZGUuZGF0YSk7CisJCQl2ZnJlZShmYWxjb24tPmRhdGEuZGF0YSk7CisJCQl2ZnJlZShmYWxjb24tPmNvZGUuZGF0YSk7CiAJCQlmYWxjb24tPmNvZGUuZGF0YSA9IE5VTEw7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252MTA4LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252MTA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzNjJhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnYxMDguYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJudmUwLmgiCisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjEwOF9maWZvX29jbGFzcyA9ICYoc3RydWN0IG52ZTBfZmlmb19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfRU5HSU5FKEZJRk8sIDB4MDgpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnZlMF9maWZvX2N0b3IsCisJCS5kdG9yID0gbnZlMF9maWZvX2R0b3IsCisJCS5pbml0ID0gbnZlMF9maWZvX2luaXQsCisJCS5maW5pID0gX25vdXZlYXVfZmlmb19maW5pLAorCX0sCisJLmNoYW5uZWxzID0gMTAyNCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZjMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKaW5kZXggOWFjOTRkNC4uYjIyYTMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPHN1YmRldi90aW1lci5oPgogI2luY2x1ZGUgPHN1YmRldi9iYXIuaD4KKyNpbmNsdWRlIDxzdWJkZXYvZmIuaD4KICNpbmNsdWRlIDxzdWJkZXYvdm0uaD4KIAogI2luY2x1ZGUgPGVuZ2luZS9kbWFvYmouaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmUwLmMKaW5kZXggMDRmNDEyOS4uOWE4NTBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmUwLmMKQEAgLTMzLDEwICszMywxMiBAQAogCiAjaW5jbHVkZSA8c3ViZGV2L3RpbWVyLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jhci5oPgorI2luY2x1ZGUgPHN1YmRldi9mYi5oPgogI2luY2x1ZGUgPHN1YmRldi92bS5oPgogCiAjaW5jbHVkZSA8ZW5naW5lL2RtYW9iai5oPgotI2luY2x1ZGUgPGVuZ2luZS9maWZvLmg+CisKKyNpbmNsdWRlICJudmUwLmgiCiAKICNkZWZpbmUgXyhhLGIpIHsgKGEpLCAoKDFVTEwgPDwgKGEpKSB8IChiKSkgfQogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC01Niw4ICs1OCw4IEBACiAjZGVmaW5lIEZJRk9fRU5HSU5FX05SIEFSUkFZX1NJWkUoZmlmb19lbmdpbmUpCiAKIHN0cnVjdCBudmUwX2ZpZm9fZW5nbiB7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwbGF5bGlzdFsyXTsKLQlpbnQgY3VyX3BsYXlsaXN0OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcnVubGlzdFsyXTsKKwlpbnQgY3VyX3J1bmxpc3Q7CiB9OwogCiBzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgewpAQCAtODYsNyArODgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLW52ZTBfZmlmb19wbGF5bGlzdF91cGRhdGUoc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2LCB1MzIgZW5naW5lKQorbnZlMF9maWZvX3J1bmxpc3RfdXBkYXRlKHN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiwgdTMyIGVuZ2luZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9iYXIgKmJhciA9IG5vdXZlYXVfYmFyKHByaXYpOwogCXN0cnVjdCBudmUwX2ZpZm9fZW5nbiAqZW5nbiA9ICZwcml2LT5lbmdpbmVbZW5naW5lXTsKQEAgLTk1LDggKzk3LDggQEAKIAlpbnQgaSwgcDsKIAogCW11dGV4X2xvY2soJm52X3N1YmRldihwcml2KS0+bXV0ZXgpOwotCWN1ciA9IGVuZ24tPnBsYXlsaXN0W2VuZ24tPmN1cl9wbGF5bGlzdF07Ci0JZW5nbi0+Y3VyX3BsYXlsaXN0ID0gIWVuZ24tPmN1cl9wbGF5bGlzdDsKKwljdXIgPSBlbmduLT5ydW5saXN0W2VuZ24tPmN1cl9ydW5saXN0XTsKKwllbmduLT5jdXJfcnVubGlzdCA9ICFlbmduLT5jdXJfcnVubGlzdDsKIAogCWZvciAoaSA9IDAsIHAgPSAwOyBpIDwgcHJpdi0+YmFzZS5tYXg7IGkrKykgewogCQl1MzIgY3RybCA9IG52X3JkMzIocHJpdiwgMHg4MDAwMDQgKyAoaSAqIDgpKSAmIDB4MDAxZjAwMDE7CkBAIC0xMTEsNyArMTEzLDcgQEAKIAludl93cjMyKHByaXYsIDB4MDAyMjcwLCBjdXItPmFkZHIgPj4gMTIpOwogCW52X3dyMzIocHJpdiwgMHgwMDIyNzQsIChlbmdpbmUgPDwgMjApIHwgKHAgPj4gMykpOwogCWlmICghbnZfd2FpdChwcml2LCAweDAwMjI4NCArIChlbmdpbmUgKiA0KSwgMHgwMDEwMDAwMCwgMHgwMDAwMDAwMCkpCi0JCW52X2Vycm9yKHByaXYsICJwbGF5bGlzdCAlZCB1cGRhdGUgdGltZW91dFxuIiwgZW5naW5lKTsKKwkJbnZfZXJyb3IocHJpdiwgInJ1bmxpc3QgJWQgdXBkYXRlIHRpbWVvdXRcbiIsIGVuZ2luZSk7CiAJbXV0ZXhfdW5sb2NrKCZudl9zdWJkZXYocHJpdiktPm11dGV4KTsKIH0KIApAQCAtMjc4LDcgKzI4MCw3IEBACiAJbnZfbWFzayhwcml2LCAweDgwMDAwNCArIChjaGlkICogOCksIDB4MDAwZjAwMDAsIGNoYW4tPmVuZ2luZSA8PCAxNik7CiAJbnZfd3IzMihwcml2LCAweDgwMDAwMCArIChjaGlkICogOCksIDB4ODAwMDAwMDAgfCBiYXNlLT5hZGRyID4+IDEyKTsKIAludl9tYXNrKHByaXYsIDB4ODAwMDA0ICsgKGNoaWQgKiA4KSwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMCk7Ci0JbnZlMF9maWZvX3BsYXlsaXN0X3VwZGF0ZShwcml2LCBjaGFuLT5lbmdpbmUpOworCW52ZTBfZmlmb19ydW5saXN0X3VwZGF0ZShwcml2LCBjaGFuLT5lbmdpbmUpOwogCW52X21hc2socHJpdiwgMHg4MDAwMDQgKyAoY2hpZCAqIDgpLCAweDAwMDAwNDAwLCAweDAwMDAwNDAwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI5MSw3ICsyOTMsNyBAQAogCXUzMiBjaGlkID0gY2hhbi0+YmFzZS5jaGlkOwogCiAJbnZfbWFzayhwcml2LCAweDgwMDAwNCArIChjaGlkICogOCksIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDApOwotCW52ZTBfZmlmb19wbGF5bGlzdF91cGRhdGUocHJpdiwgY2hhbi0+ZW5naW5lKTsKKwludmUwX2ZpZm9fcnVubGlzdF91cGRhdGUocHJpdiwgY2hhbi0+ZW5naW5lKTsKIAludl93cjMyKHByaXYsIDB4ODAwMDAwICsgKGNoaWQgKiA4KSwgMHgwMDAwMDAwMCk7CiAKIAlyZXR1cm4gbm91dmVhdV9maWZvX2NoYW5uZWxfZmluaSgmY2hhbi0+YmFzZSwgc3VzcGVuZCk7CkBAIC0zNzUsNTQgKzM3NywxODkgQEAKICAqIFBGSUZPIGVuZ2luZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2VudW0gbnZlMF9maWZvX2ZhdWx0X3VuaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtIG52ZTBfZmlmb19zY2hlZF9yZWFzb25bXSA9IHsKKwl7IDB4MGEsICJDVFhTV19USU1FT1VUIiB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bSBudmUwX2ZpZm9fZmF1bHRfZW5naW5lW10gPSB7CisJeyAweDAwLCAiR1IiLCBOVUxMLCBOVkRFVl9FTkdJTkVfR1IgfSwKKwl7IDB4MDMsICJJRkIiIH0sCisJeyAweDA0LCAiQkFSMSIsIE5VTEwsIE5WREVWX1NVQkRFVl9CQVIgfSwKKwl7IDB4MDUsICJCQVIzIiwgTlVMTCwgTlZERVZfU1VCREVWX0lOU1RNRU0gfSwKKwl7IDB4MDcsICJQQkRNQTAiLCBOVUxMLCBOVkRFVl9FTkdJTkVfRklGTyB9LAorCXsgMHgwOCwgIlBCRE1BMSIsIE5VTEwsIE5WREVWX0VOR0lORV9GSUZPIH0sCisJeyAweDA5LCAiUEJETUEyIiwgTlVMTCwgTlZERVZfRU5HSU5FX0ZJRk8gfSwKKwl7IDB4MTAsICJNU1ZMRCIsIE5VTEwsIE5WREVWX0VOR0lORV9CU1AgfSwKKwl7IDB4MTEsICJNU1BQUCIsIE5VTEwsIE5WREVWX0VOR0lORV9QUFAgfSwKKwl7IDB4MTMsICJQRVJGIiB9LAorCXsgMHgxNCwgIk1TUERFQyIsIE5VTEwsIE5WREVWX0VOR0lORV9WUCB9LAorCXsgMHgxNSwgIkNFMCIsIE5VTEwsIE5WREVWX0VOR0lORV9DT1BZMCB9LAorCXsgMHgxNiwgIkNFMSIsIE5VTEwsIE5WREVWX0VOR0lORV9DT1BZMSB9LAorCXsgMHgxNywgIlBNVSIgfSwKKwl7IDB4MTksICJNU0VOQyIsIE5VTEwsIE5WREVWX0VOR0lORV9WRU5DIH0sCisJeyAweDFiLCAiQ0UyIiwgTlVMTCwgTlZERVZfRU5HSU5FX0NPUFkyIH0sCiAJe30KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtIG52ZTBfZmlmb19mYXVsdF9yZWFzb25bXSA9IHsKLQl7IDB4MDAsICJQVF9OT1RfUFJFU0VOVCIgfSwKLQl7IDB4MDEsICJQVF9UT09fU0hPUlQiIH0sCi0JeyAweDAyLCAiUEFHRV9OT1RfUFJFU0VOVCIgfSwKLQl7IDB4MDMsICJWTV9MSU1JVF9FWENFRURFRCIgfSwKLQl7IDB4MDQsICJOT19DSEFOTkVMIiB9LAotCXsgMHgwNSwgIlBBR0VfU1lTVEVNX09OTFkiIH0sCi0JeyAweDA2LCAiUEFHRV9SRUFEX09OTFkiIH0sCi0JeyAweDBhLCAiQ09NUFJFU1NFRF9TWVNSQU0iIH0sCi0JeyAweDBjLCAiSU5WQUxJRF9TVE9SQUdFX1RZUEUiIH0sCisJeyAweDAwLCAiUERFIiB9LAorCXsgMHgwMSwgIlBERV9TSVpFIiB9LAorCXsgMHgwMiwgIlBURSIgfSwKKwl7IDB4MDMsICJWQV9MSU1JVF9WSU9MQVRJT04iIH0sCisJeyAweDA0LCAiVU5CT1VORF9JTlNUX0JMT0NLIiB9LAorCXsgMHgwNSwgIlBSSVZfVklPTEFUSU9OIiB9LAorCXsgMHgwNiwgIlJPX1ZJT0xBVElPTiIgfSwKKwl7IDB4MDcsICJXT19WSU9MQVRJT04iIH0sCisJeyAweDA4LCAiUElUQ0hfTUFTS19WSU9MQVRJT04iIH0sCisJeyAweDA5LCAiV09SS19DUkVBVElPTiIgfSwKKwl7IDB4MGEsICJVTlNVUFBPUlRFRF9BUEVSVFVSRSIgfSwKKwl7IDB4MGIsICJDT01QUkVTU0lPTl9GQUlMVVJFIiB9LAorCXsgMHgwYywgIlVOU1VQUE9SVEVEX0tJTkQiIH0sCisJeyAweDBkLCAiUkVHSU9OX1ZJT0xBVElPTiIgfSwKKwl7IDB4MGUsICJCT1RIX1BURVNfVkFMSUQiIH0sCisJeyAweDBmLCAiSU5GT19UWVBFX1BPSVNPTkVEIiB9LAogCXt9CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bSBudmUwX2ZpZm9fZmF1bHRfaHViY2xpZW50W10gPSB7CisJeyAweDAwLCAiVklQIiB9LAorCXsgMHgwMSwgIkNFMCIgfSwKKwl7IDB4MDIsICJDRTEiIH0sCisJeyAweDAzLCAiRE5JU08iIH0sCisJeyAweDA0LCAiRkUiIH0sCisJeyAweDA1LCAiRkVDUyIgfSwKKwl7IDB4MDYsICJIT1NUIiB9LAorCXsgMHgwNywgIkhPU1RfQ1BVIiB9LAorCXsgMHgwOCwgIkhPU1RfQ1BVX05CIiB9LAorCXsgMHgwOSwgIklTTyIgfSwKKwl7IDB4MGEsICJNTVUiIH0sCisJeyAweDBiLCAiTVNQREVDIiB9LAorCXsgMHgwYywgIk1TUFBQIiB9LAorCXsgMHgwZCwgIk1TVkxEIiB9LAorCXsgMHgwZSwgIk5JU08iIH0sCisJeyAweDBmLCAiUDJQIiB9LAorCXsgMHgxMCwgIlBEIiB9LAorCXsgMHgxMSwgIlBFUkYiIH0sCisJeyAweDEyLCAiUE1VIiB9LAorCXsgMHgxMywgIlJBU1RFUlRXT0QiIH0sCisJeyAweDE0LCAiU0NDIiB9LAorCXsgMHgxNSwgIlNDQ19OQiIgfSwKKwl7IDB4MTYsICJTRUMiIH0sCisJeyAweDE3LCAiU1NZTkMiIH0sCisJeyAweDE4LCAiR1JfQ09QWSIgfSwKKwl7IDB4MTksICJDRTIiIH0sCisJeyAweDFhLCAiWFYiIH0sCisJeyAweDFiLCAiTU1VX05CIiB9LAorCXsgMHgxYywgIk1TRU5DIiB9LAorCXsgMHgxZCwgIkRGQUxDT04iIH0sCisJeyAweDFlLCAiU0tFRCIgfSwKKwl7IDB4MWYsICJBRkFMQ09OIiB9LAogCXt9CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bSBudmUwX2ZpZm9fZmF1bHRfZ3BjY2xpZW50W10gPSB7CisJeyAweDAwLCAiTDFfMCIgfSwgeyAweDAxLCAiVDFfMCIgfSwgeyAweDAyLCAiUEVfMCIgfSwKKwl7IDB4MDMsICJMMV8xIiB9LCB7IDB4MDQsICJUMV8xIiB9LCB7IDB4MDUsICJQRV8xIiB9LAorCXsgMHgwNiwgIkwxXzIiIH0sIHsgMHgwNywgIlQxXzIiIH0sIHsgMHgwOCwgIlBFXzIiIH0sCisJeyAweDA5LCAiTDFfMyIgfSwgeyAweDBhLCAiVDFfMyIgfSwgeyAweDBiLCAiUEVfMyIgfSwKKwl7IDB4MGMsICJSQVNUIiB9LAorCXsgMHgwZCwgIkdDQyIgfSwKKwl7IDB4MGUsICJHUENDUyIgfSwKKwl7IDB4MGYsICJQUk9QXzAiIH0sCisJeyAweDEwLCAiUFJPUF8xIiB9LAorCXsgMHgxMSwgIlBST1BfMiIgfSwKKwl7IDB4MTIsICJQUk9QXzMiIH0sCisJeyAweDEzLCAiTDFfNCIgfSwgeyAweDE0LCAiVDFfNCIgfSwgeyAweDE1LCAiUEVfNCIgfSwKKwl7IDB4MTYsICJMMV81IiB9LCB7IDB4MTcsICJUMV81IiB9LCB7IDB4MTgsICJQRV81IiB9LAorCXsgMHgxOSwgIkwxXzYiIH0sIHsgMHgxYSwgIlQxXzYiIH0sIHsgMHgxYiwgIlBFXzYiIH0sCisJeyAweDFjLCAiTDFfNyIgfSwgeyAweDFkLCAiVDFfNyIgfSwgeyAweDFlLCAiUEVfNyIgfSwKKwl7IDB4MWYsICJHUE0iIH0sCisJeyAweDIwLCAiTFRQX1VUTEJfMCIgfSwKKwl7IDB4MjEsICJMVFBfVVRMQl8xIiB9LAorCXsgMHgyMiwgIkxUUF9VVExCXzIiIH0sCisJeyAweDIzLCAiTFRQX1VUTEJfMyIgfSwKKwl7IDB4MjQsICJHUENfUkdHX1VUTEIiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudmUwX2ZpZm9fc3ViZmlmb19pbnRyW10gPSB7Ci0JeyAweDAwMjAwMDAwLCAiSUxMRUdBTF9NVEhEIiB9LAotCXsgMHgwMDgwMDAwMCwgIkVNUFRZX1NVQkMiIH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnZlMF9maWZvX3BiZG1hX2ludHJbXSA9IHsKKwl7IDB4MDAwMDAwMDEsICJNRU1SRVEiIH0sCisJeyAweDAwMDAwMDAyLCAiTUVNQUNLX1RJTUVPVVQiIH0sCisJeyAweDAwMDAwMDA0LCAiTUVNQUNLX0VYVFJBIiB9LAorCXsgMHgwMDAwMDAwOCwgIk1FTURBVF9USU1FT1VUIiB9LAorCXsgMHgwMDAwMDAxMCwgIk1FTURBVF9FWFRSQSIgfSwKKwl7IDB4MDAwMDAwMjAsICJNRU1GTFVTSCIgfSwKKwl7IDB4MDAwMDAwNDAsICJNRU1PUCIgfSwKKwl7IDB4MDAwMDAwODAsICJMQkNPTk5FQ1QiIH0sCisJeyAweDAwMDAwMTAwLCAiTEJSRVEiIH0sCisJeyAweDAwMDAwMjAwLCAiTEJBQ0tfVElNRU9VVCIgfSwKKwl7IDB4MDAwMDA0MDAsICJMQkFDS19FWFRSQSIgfSwKKwl7IDB4MDAwMDA4MDAsICJMQkRBVF9USU1FT1VUIiB9LAorCXsgMHgwMDAwMTAwMCwgIkxCREFUX0VYVFJBIiB9LAorCXsgMHgwMDAwMjAwMCwgIkdQRklGTyIgfSwKKwl7IDB4MDAwMDQwMDAsICJHUFBUUiIgfSwKKwl7IDB4MDAwMDgwMDAsICJHUEVOVFJZIiB9LAorCXsgMHgwMDAxMDAwMCwgIkdQQ1JDIiB9LAorCXsgMHgwMDAyMDAwMCwgIlBCUFRSIiB9LAorCXsgMHgwMDA0MDAwMCwgIlBCRU5UUlkiIH0sCisJeyAweDAwMDgwMDAwLCAiUEJDUkMiIH0sCisJeyAweDAwMTAwMDAwLCAiWEJBUkNPTk5FQ1QiIH0sCisJeyAweDAwMjAwMDAwLCAiTUVUSE9EIiB9LAorCXsgMHgwMDQwMDAwMCwgIk1FVEhPRENSQyIgfSwKKwl7IDB4MDA4MDAwMDAsICJERVZJQ0UiIH0sCisJeyAweDAyMDAwMDAwLCAiU0VNQVBIT1JFIiB9LAorCXsgMHgwNDAwMDAwMCwgIkFDUVVJUkUiIH0sCisJeyAweDA4MDAwMDAwLCAiUFJJIiB9LAorCXsgMHgyMDAwMDAwMCwgIk5PX0NUWFNXX1NFRyIgfSwKKwl7IDB4NDAwMDAwMDAsICJQQlNFRyIgfSwKKwl7IDB4ODAwMDAwMDAsICJTSUdOQVRVUkUiIH0sCiAJe30KIH07CiAKIHN0YXRpYyB2b2lkCi1udmUwX2ZpZm9faXNyX3ZtX2ZhdWx0KHN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiwgaW50IHVuaXQpCitudmUwX2ZpZm9faW50cl9zY2hlZChzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXYpCit7CisJdTMyIGludHIgPSBudl9yZDMyKHByaXYsIDB4MDAyNTRjKTsKKwl1MzIgY29kZSA9IGludHIgJiAweDAwMDAwMGZmOworCW52X2Vycm9yKHByaXYsICJTQ0hFRF9FUlJPUiBbIik7CisJbm91dmVhdV9lbnVtX3ByaW50KG52ZTBfZmlmb19zY2hlZF9yZWFzb24sIGNvZGUpOworCXByX2NvbnQoIl1cbiIpOworfQorCitzdGF0aWMgdm9pZAorbnZlMF9maWZvX2ludHJfY2hzdyhzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXYpCit7CisJdTMyIHN0YXQgPSBudl9yZDMyKHByaXYsIDB4MDAyNTZjKTsKKwludl9lcnJvcihwcml2LCAiQ0hTV19FUlJPUiAweCUwOHhcbiIsIHN0YXQpOworCW52X3dyMzIocHJpdiwgMHgwMDI1NmMsIHN0YXQpOworfQorCitzdGF0aWMgdm9pZAorbnZlMF9maWZvX2ludHJfZHJvcHBlZF9mYXVsdChzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXYpCit7CisJdTMyIHN0YXQgPSBudl9yZDMyKHByaXYsIDB4MDAyNTljKTsKKwludl9lcnJvcihwcml2LCAiRFJPUFBFRF9NTVVfRkFVTFQgMHglMDh4XG4iLCBzdGF0KTsKK30KKworc3RhdGljIHZvaWQKK252ZTBfZmlmb19pbnRyX2ZhdWx0KHN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiwgaW50IHVuaXQpCiB7CiAJdTMyIGluc3QgPSBudl9yZDMyKHByaXYsIDB4MjgwMCArICh1bml0ICogMHgxMCkpOwogCXUzMiB2YWxvID0gbnZfcmQzMihwcml2LCAweDI4MDQgKyAodW5pdCAqIDB4MTApKTsKIAl1MzIgdmFoaSA9IG52X3JkMzIocHJpdiwgMHgyODA4ICsgKHVuaXQgKiAweDEwKSk7CiAJdTMyIHN0YXQgPSBudl9yZDMyKHByaXYsIDB4MjgwYyArICh1bml0ICogMHgxMCkpOwogCXUzMiBjbGllbnQgPSAoc3RhdCAmIDB4MDAwMDFmMDApID4+IDg7Ci0JY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bSAqZW47Ci0Jc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSBOVUxMOwogCXN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5nY3R4ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtICplbjsKKwljb25zdCBjaGFyICpuYW1lID0gInVua25vd24iOwogCiAJbnZfZXJyb3IocHJpdiwgIlBGSUZPOiAlcyBmYXVsdCBhdCAweCUwMTBsbHggWyIsIChzdGF0ICYgMHgwMDAwMDA4MCkgPwogCQkgICAgICAgIndyaXRlIiA6ICJyZWFkIiwgKHU2NCl2YWhpIDw8IDMyIHwgdmFsbyk7CiAJbm91dmVhdV9lbnVtX3ByaW50KG52ZTBfZmlmb19mYXVsdF9yZWFzb24sIHN0YXQgJiAweDAwMDAwMDBmKTsKIAlwcl9jb250KCJdIGZyb20gIik7Ci0JZW4gPSBub3V2ZWF1X2VudW1fcHJpbnQobnZlMF9maWZvX2ZhdWx0X3VuaXQsIHVuaXQpOworCWVuID0gbm91dmVhdV9lbnVtX3ByaW50KG52ZTBfZmlmb19mYXVsdF9lbmdpbmUsIHVuaXQpOwogCWlmIChzdGF0ICYgMHgwMDAwMDA0MCkgewogCQlwcl9jb250KCIvIik7CiAJCW5vdXZlYXVfZW51bV9wcmludChudmUwX2ZpZm9fZmF1bHRfaHViY2xpZW50LCBjbGllbnQpOwpAQCAtNDMyLDE0ICs1NjksMjIgQEAKIAl9CiAKIAlpZiAoZW4gJiYgZW4tPmRhdGEyKSB7Ci0JCWVuZ2luZSA9IG5vdXZlYXVfZW5naW5lKHByaXYsIGVuLT5kYXRhMik7Ci0JCWlmIChlbmdpbmUpCi0JCQllbmdjdHggPSBub3V2ZWF1X2VuZ2N0eF9nZXQoZW5naW5lLCBpbnN0KTsKLQorCQlpZiAoZW4tPmRhdGEyID09IE5WREVWX1NVQkRFVl9CQVIpIHsKKwkJCW52X21hc2socHJpdiwgMHgwMDE3MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCQkJbmFtZSA9ICJCQVIxIjsKKwkJfSBlbHNlCisJCWlmIChlbi0+ZGF0YTIgPT0gTlZERVZfU1VCREVWX0lOU1RNRU0pIHsKKwkJCW52X21hc2socHJpdiwgMHgwMDE3MTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCQkJbmFtZSA9ICJCQVIzIjsKKwkJfSBlbHNlIHsKKwkJCWVuZ2luZSA9IG5vdXZlYXVfZW5naW5lKHByaXYsIGVuLT5kYXRhMik7CisJCQlpZiAoZW5naW5lKSB7CisJCQkJZW5nY3R4ID0gbm91dmVhdV9lbmdjdHhfZ2V0KGVuZ2luZSwgaW5zdCk7CisJCQkJbmFtZSAgID0gbm91dmVhdV9jbGllbnRfbmFtZShlbmdjdHgpOworCQkJfQorCQl9CiAJfQotCi0JcHJfY29udCgiIG9uIGNoYW5uZWwgMHglMDEwbGx4IFslc11cbiIsICh1NjQpaW5zdCA8PCAxMiwKLQkJCW5vdXZlYXVfY2xpZW50X25hbWUoZW5nY3R4KSk7CisJcHJfY29udCgiIG9uIGNoYW5uZWwgMHglMDEwbGx4IFslc11cbiIsICh1NjQpaW5zdCA8PCAxMiwgbmFtZSk7CiAKIAlub3V2ZWF1X2VuZ2N0eF9wdXQoZW5nY3R4KTsKIH0KQEAgLTQ3MSw3ICs2MTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbnZlMF9maWZvX2lzcl9zdWJmaWZvX2ludHIoc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2LCBpbnQgdW5pdCkKK252ZTBfZmlmb19pbnRyX3BiZG1hKHN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiwgaW50IHVuaXQpCiB7CiAJdTMyIHN0YXQgPSBudl9yZDMyKHByaXYsIDB4MDQwMTA4ICsgKHVuaXQgKiAweDIwMDApKTsKIAl1MzIgYWRkciA9IG52X3JkMzIocHJpdiwgMHgwNDAwYzAgKyAodW5pdCAqIDB4MjAwMCkpOwpAQCAtNDg3LDExICs2MzIsMTEgQEAKIAl9CiAKIAlpZiAoc2hvdykgewotCQludl9lcnJvcihwcml2LCAiU1VCRklGTyVkOiIsIHVuaXQpOwotCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52ZTBfZmlmb19zdWJmaWZvX2ludHIsIHNob3cpOworCQludl9lcnJvcihwcml2LCAiUEJETUElZDoiLCB1bml0KTsKKwkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudmUwX2ZpZm9fcGJkbWFfaW50ciwgc2hvdyk7CiAJCXByX2NvbnQoIlxuIik7CiAJCW52X2Vycm9yKHByaXYsCi0JCQkgIlNVQkZJRk8lZDogY2ggJWQgWyVzXSBzdWJjICVkIG10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQkJICJQQkRNQSVkOiBjaCAlZCBbJXNdIHN1YmMgJWQgbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCiAJCQkgdW5pdCwgY2hpZCwKIAkJCSBub3V2ZWF1X2NsaWVudF9uYW1lX2Zvcl9maWZvX2NoaWQoJnByaXYtPmJhc2UsIGNoaWQpLAogCQkJIHN1YmMsIG10aGQsIGRhdGEpOwpAQCAtNTA4LDE5ICs2NTMsNTYgQEAKIAl1MzIgbWFzayA9IG52X3JkMzIocHJpdiwgMHgwMDIxNDApOwogCXUzMiBzdGF0ID0gbnZfcmQzMihwcml2LCAweDAwMjEwMCkgJiBtYXNrOwogCisJaWYgKHN0YXQgJiAweDAwMDAwMDAxKSB7CisJCXUzMiBzdGF0ID0gbnZfcmQzMihwcml2LCAweDAwMjUyYyk7CisJCW52X2Vycm9yKHByaXYsICJCSU5EX0VSUk9SIDB4JTA4eFxuIiwgc3RhdCk7CisJCW52X3dyMzIocHJpdiwgMHgwMDIxMDAsIDB4MDAwMDAwMDEpOworCQlzdGF0ICY9IH4weDAwMDAwMDAxOworCX0KKworCWlmIChzdGF0ICYgMHgwMDAwMDAxMCkgeworCQludl9lcnJvcihwcml2LCAiUElPX0VSUk9SXG4iKTsKKwkJbnZfd3IzMihwcml2LCAweDAwMjEwMCwgMHgwMDAwMDAxMCk7CisJCXN0YXQgJj0gfjB4MDAwMDAwMTA7CisJfQorCiAJaWYgKHN0YXQgJiAweDAwMDAwMTAwKSB7Ci0JCW52X3dhcm4ocHJpdiwgInVua25vd24gc3RhdHVzIDB4MDAwMDAxMDBcbiIpOworCQludmUwX2ZpZm9faW50cl9zY2hlZChwcml2KTsKIAkJbnZfd3IzMihwcml2LCAweDAwMjEwMCwgMHgwMDAwMDEwMCk7CiAJCXN0YXQgJj0gfjB4MDAwMDAxMDA7CiAJfQogCisJaWYgKHN0YXQgJiAweDAwMDEwMDAwKSB7CisJCW52ZTBfZmlmb19pbnRyX2Noc3cocHJpdik7CisJCW52X3dyMzIocHJpdiwgMHgwMDIxMDAsIDB4MDAwMTAwMDApOworCQlzdGF0ICY9IH4weDAwMDEwMDAwOworCX0KKworCWlmIChzdGF0ICYgMHgwMDgwMDAwMCkgeworCQludl9lcnJvcihwcml2LCAiRkJfRkxVU0hfVElNRU9VVFxuIik7CisJCW52X3dyMzIocHJpdiwgMHgwMDIxMDAsIDB4MDA4MDAwMDApOworCQlzdGF0ICY9IH4weDAwODAwMDAwOworCX0KKworCWlmIChzdGF0ICYgMHgwMTAwMDAwMCkgeworCQludl9lcnJvcihwcml2LCAiTEJfRVJST1JcbiIpOworCQludl93cjMyKHByaXYsIDB4MDAyMTAwLCAweDAxMDAwMDAwKTsKKwkJc3RhdCAmPSB+MHgwMTAwMDAwMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MDgwMDAwMDApIHsKKwkJbnZlMF9maWZvX2ludHJfZHJvcHBlZF9mYXVsdChwcml2KTsKKwkJbnZfd3IzMihwcml2LCAweDAwMjEwMCwgMHgwODAwMDAwMCk7CisJCXN0YXQgJj0gfjB4MDgwMDAwMDA7CisJfQorCiAJaWYgKHN0YXQgJiAweDEwMDAwMDAwKSB7CiAJCXUzMiB1bml0cyA9IG52X3JkMzIocHJpdiwgMHgwMDI1OWMpOwogCQl1MzIgdSA9IHVuaXRzOwogCiAJCXdoaWxlICh1KSB7CiAJCQlpbnQgaSA9IGZmcyh1KSAtIDE7Ci0JCQludmUwX2ZpZm9faXNyX3ZtX2ZhdWx0KHByaXYsIGkpOworCQkJbnZlMF9maWZvX2ludHJfZmF1bHQocHJpdiwgaSk7CiAJCQl1ICY9IH4oMSA8PCBpKTsKIAkJfQogCkBAIC01MjksMjIgKzcxMSwyOCBAQAogCX0KIAogCWlmIChzdGF0ICYgMHgyMDAwMDAwMCkgewotCQl1MzIgdW5pdHMgPSBudl9yZDMyKHByaXYsIDB4MDAyNWEwKTsKLQkJdTMyIHUgPSB1bml0czsKKwkJdTMyIG1hc2sgPSBudl9yZDMyKHByaXYsIDB4MDAyNWEwKTsKKwkJdTMyIHRlbXAgPSBtYXNrOwogCi0JCXdoaWxlICh1KSB7Ci0JCQlpbnQgaSA9IGZmcyh1KSAtIDE7Ci0JCQludmUwX2ZpZm9faXNyX3N1YmZpZm9faW50cihwcml2LCBpKTsKLQkJCXUgJj0gfigxIDw8IGkpOworCQl3aGlsZSAodGVtcCkgeworCQkJdTMyIHVuaXQgPSBmZnModGVtcCkgLSAxOworCQkJbnZlMF9maWZvX2ludHJfcGJkbWEocHJpdiwgdW5pdCk7CisJCQl0ZW1wICY9IH4oMSA8PCB1bml0KTsKIAkJfQogCi0JCW52X3dyMzIocHJpdiwgMHgwMDI1YTAsIHVuaXRzKTsKKwkJbnZfd3IzMihwcml2LCAweDAwMjVhMCwgbWFzayk7CiAJCXN0YXQgJj0gfjB4MjAwMDAwMDA7CiAJfQogCiAJaWYgKHN0YXQgJiAweDQwMDAwMDAwKSB7Ci0JCW52X3dhcm4ocHJpdiwgInVua25vd24gc3RhdHVzIDB4NDAwMDAwMDBcbiIpOwotCQludl9tYXNrKHByaXYsIDB4MDAyYTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwkJdTMyIG1hc2sgPSBudl9tYXNrKHByaXYsIDB4MDAyYTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKKworCQl3aGlsZSAobWFzaykgeworCQkJdTMyIGVuZ24gPSBmZnMobWFzaykgLSAxOworCQkJLyogcnVubGlzdCBldmVudCwgbm90IGN1cnJlbnRseSB1c2VkICovCisJCQltYXNrICY9IH4oMSA8PCBlbmduKTsKKwkJfQorCiAJCXN0YXQgJj0gfjB4NDAwMDAwMDA7CiAJfQogCkBAIC01NzUsMjcgKzc2Myw5MSBAQAogCW52X21hc2socHJpdiwgMHgwMDIxNDAsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOwogfQogCi1zdGF0aWMgaW50CitpbnQKK252ZTBfZmlmb19maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCit7CisJc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZmlmb19maW5pKCZwcml2LT5iYXNlLCBzdXNwZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogYWxsb3cgbW11IGZhdWx0IGludGVycnVwdHMsIGV2ZW4gd2hlbiB3ZSdyZSBub3QgdXNpbmcgZmlmbyAqLworCW52X21hc2socHJpdiwgMHgwMDIxNDAsIDB4MTAwMDAwMDAsIDB4MTAwMDAwMDApOworCXJldHVybiAwOworfQorCitpbnQKK252ZTBfZmlmb19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OworCWludCByZXQsIGk7CisKKwlyZXQgPSBub3V2ZWF1X2ZpZm9faW5pdCgmcHJpdi0+YmFzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGVuYWJsZSBhbGwgYXZhaWxhYmxlIFBCRE1BIHVuaXRzICovCisJbnZfd3IzMihwcml2LCAweDAwMDIwNCwgMHhmZmZmZmZmZik7CisJcHJpdi0+c3Bvb25fbnIgPSBod2VpZ2h0MzIobnZfcmQzMihwcml2LCAweDAwMDIwNCkpOworCW52X2RlYnVnKHByaXYsICIlZCBQQkRNQSB1bml0KHMpXG4iLCBwcml2LT5zcG9vbl9ucik7CisKKwkvKiBQQkRNQVtuXSAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zcG9vbl9ucjsgaSsrKSB7CisJCW52X21hc2socHJpdiwgMHgwNDAxM2MgKyAoaSAqIDB4MjAwMCksIDB4MTAwMDAxMDAsIDB4MDAwMDAwMDApOworCQludl93cjMyKHByaXYsIDB4MDQwMTA4ICsgKGkgKiAweDIwMDApLCAweGZmZmZmZmZmKTsgLyogSU5UUiAqLworCQludl93cjMyKHByaXYsIDB4MDQwMTBjICsgKGkgKiAweDIwMDApLCAweGZmZmZmZWZmKTsgLyogSU5UUkVOICovCisJfQorCisJbnZfd3IzMihwcml2LCAweDAwMjI1NCwgMHgxMDAwMDAwMCB8IHByaXYtPnVzZXIuYmFyLm9mZnNldCA+PiAxMik7CisKKwludl93cjMyKHByaXYsIDB4MDAyYTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKHByaXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKHByaXYsIDB4MDAyMTQwLCAweDNmZmZmZmZmKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnZlMF9maWZvX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCit7CisJc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CisJaW50IGk7CisKKwlub3V2ZWF1X2dwdW9ial91bm1hcCgmcHJpdi0+dXNlci5iYXIpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+dXNlci5tZW0pOworCisJZm9yIChpID0gMDsgaSA8IEZJRk9fRU5HSU5FX05SOyBpKyspIHsKKwkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5lbmdpbmVbaV0ucnVubGlzdFsxXSk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+ZW5naW5lW2ldLnJ1bmxpc3RbMF0pOworCX0KKworCW5vdXZlYXVfZmlmb19kZXN0cm95KCZwcml2LT5iYXNlKTsKK30KKworaW50CiBudmUwX2ZpZm9fY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCiAJICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKIAkgICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKIHsKKwlzdHJ1Y3QgbnZlMF9maWZvX2ltcGwgKmltcGwgPSAodm9pZCAqKW9jbGFzczsKIAlzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXY7CiAJaW50IHJldCwgaTsKIAotCXJldCA9IG5vdXZlYXVfZmlmb19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgMCwgNDA5NSwgJnByaXYpOworCXJldCA9IG5vdXZlYXVfZmlmb19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgMCwKKwkJCQkgIGltcGwtPmNoYW5uZWxzIC0gMSwgJnByaXYpOwogCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRklGT19FTkdJTkVfTlI7IGkrKykgewogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcobnZfb2JqZWN0KHByaXYpLCBOVUxMLCAweDgwMDAsIDB4MTAwMCwKLQkJCQkJIDAsICZwcml2LT5lbmdpbmVbaV0ucGxheWxpc3RbMF0pOworCQkJCQkgMCwgJnByaXYtPmVuZ2luZVtpXS5ydW5saXN0WzBdKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKIAkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KG52X29iamVjdChwcml2KSwgTlVMTCwgMHg4MDAwLCAweDEwMDAsCi0JCQkJCSAwLCAmcHJpdi0+ZW5naW5lW2ldLnBsYXlsaXN0WzFdKTsKKwkJCQkJIDAsICZwcml2LT5lbmdpbmVbaV0ucnVubGlzdFsxXSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTYyMSw2MCArODczLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1udmUwX2ZpZm9fZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlpbnQgaTsKLQotCW5vdXZlYXVfZ3B1b2JqX3VubWFwKCZwcml2LT51c2VyLmJhcik7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT51c2VyLm1lbSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRklGT19FTkdJTkVfTlI7IGkrKykgewotCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPmVuZ2luZVtpXS5wbGF5bGlzdFsxXSk7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+ZW5naW5lW2ldLnBsYXlsaXN0WzBdKTsKLQl9Ci0KLQlub3V2ZWF1X2ZpZm9fZGVzdHJveSgmcHJpdi0+YmFzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW52ZTBfZmlmb19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQotewotCXN0cnVjdCBudmUwX2ZpZm9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCWludCByZXQsIGk7Ci0KLQlyZXQgPSBub3V2ZWF1X2ZpZm9faW5pdCgmcHJpdi0+YmFzZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGVuYWJsZSBhbGwgYXZhaWxhYmxlIFBTVUJGSUZPcyAqLwotCW52X3dyMzIocHJpdiwgMHgwMDAyMDQsIDB4ZmZmZmZmZmYpOwotCXByaXYtPnNwb29uX25yID0gaHdlaWdodDMyKG52X3JkMzIocHJpdiwgMHgwMDAyMDQpKTsKLQludl9kZWJ1Zyhwcml2LCAiJWQgc3ViZmlmbyhzKVxuIiwgcHJpdi0+c3Bvb25fbnIpOwotCi0JLyogUFNVQkZJRk9bbl0gKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c3Bvb25fbnI7IGkrKykgewotCQludl9tYXNrKHByaXYsIDB4MDQwMTNjICsgKGkgKiAweDIwMDApLCAweDEwMDAwMTAwLCAweDAwMDAwMDAwKTsKLQkJbnZfd3IzMihwcml2LCAweDA0MDEwOCArIChpICogMHgyMDAwKSwgMHhmZmZmZmZmZik7IC8qIElOVFIgKi8KLQkJbnZfd3IzMihwcml2LCAweDA0MDEwYyArIChpICogMHgyMDAwKSwgMHhmZmZmZmVmZik7IC8qIElOVFJFTiAqLwotCX0KLQotCW52X3dyMzIocHJpdiwgMHgwMDIyNTQsIDB4MTAwMDAwMDAgfCBwcml2LT51c2VyLmJhci5vZmZzZXQgPj4gMTIpOwotCi0JbnZfd3IzMihwcml2LCAweDAwMmEwMCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihwcml2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihwcml2LCAweDAwMjE0MCwgMHgzZmZmZmZmZik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqCi1udmUwX2ZpZm9fb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MpIHsKLQkuaGFuZGxlID0gTlZfRU5HSU5FKEZJRk8sIDB4ZTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworbnZlMF9maWZvX29jbGFzcyA9ICYoc3RydWN0IG52ZTBfZmlmb19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfRU5HSU5FKEZJRk8sIDB4ZTApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CiAJCS5jdG9yID0gbnZlMF9maWZvX2N0b3IsCiAJCS5kdG9yID0gbnZlMF9maWZvX2R0b3IsCiAJCS5pbml0ID0gbnZlMF9maWZvX2luaXQsCi0JCS5maW5pID0gX25vdXZlYXVfZmlmb19maW5pLAorCQkuZmluaSA9IG52ZTBfZmlmb19maW5pLAogCX0sCi19OworCS5jaGFubmVscyA9IDQwOTYsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252ZTAuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDM0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252ZTAuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9fTlZLTV9GSUZPX05WRTBfSF9fCisjZGVmaW5lIF9fTlZLTV9GSUZPX05WRTBfSF9fCisKKyNpbmNsdWRlIDxlbmdpbmUvZmlmby5oPgorCitpbnQgIG52ZTBfZmlmb19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB2b2lkICosIHUzMiwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7Cit2b2lkIG52ZTBfZmlmb19kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgbnZlMF9maWZvX2luaXQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworCitzdHJ1Y3QgbnZlMF9maWZvX2ltcGwgeworCXN0cnVjdCBub3V2ZWF1X29jbGFzcyBiYXNlOworCXUzMiBjaGFubmVsczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnYxMDguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52MTA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YmQzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52MTA4LmMKQEAgLTAsMCArMSwxNDA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncyA8YnNrZWdnc0ByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlICJudmMwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmN0eF9pbml0X2ljbWRbXSA9IHsKKwl7IDB4MDAxMDAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDM5LCAgIDMsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMGE5LCAgIDEsIDB4MDEsIDB4MDAwMGZmZmYgfSwKKwl7IDB4MDAwMDM4LCAgIDEsIDB4MDEsIDB4MGZhYzY4ODEgfSwKKwl7IDB4MDAwMDNkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMGU4LCAgIDgsIDB4MDEsIDB4MDAwMDA0MDAgfSwKKwl7IDB4MDAwMDc4LCAgIDgsIDB4MDEsIDB4MDAwMDAzMDAgfSwKKwl7IDB4MDAwMDUwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTEgfSwKKwl7IDB4MDAwMDU4LCAgIDgsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwMjA4LCAgIDgsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMDgxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMDg1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDg4LCAgIDEsIDB4MDEsIDB4MDAwMDA0MDAgfSwKKwl7IDB4MDAwMDkwLCAgIDEsIDB4MDEsIDB4MDAwMDAzMDAgfSwKKwl7IDB4MDAwMDk4LCAgIDEsIDB4MDEsIDB4MDAwMDEwMDEgfSwKKwl7IDB4MDAwMGUzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMGRhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMGY4LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwMGZhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMDlmLCAgIDQsIDB4MDEsIDB4MDAwMGZmZmYgfSwKKwl7IDB4MDAwMGIxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMGFkLCAgIDEsIDB4MDEsIDB4MDAwMDAxM2UgfSwKKwl7IDB4MDAwMGUxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTAgfSwKKwl7IDB4MDAwMjkwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwM2IwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMmEwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNDIwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMmIwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNDMwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMmMwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNGQwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNzIwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwOGMwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwODkwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwOGUwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwOGEwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwOGYwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwOTRjLCAgIDEsIDB4MDEsIDB4MDAwMDAwZmYgfSwKKwl7IDB4MDAwOTRkLCAgIDEsIDB4MDEsIDB4ZmZmZmZmZmYgfSwKKwl7IDB4MDAwOTRlLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMmVjLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMmYyLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMmY1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMmY3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzAzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMmU2LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNDY2LCAgIDEsIDB4MDEsIDB4MDAwMDAwNTIgfSwKKwl7IDB4MDAwMzAxLCAgIDEsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwMzA0LCAgIDEsIDB4MDEsIDB4MzAyMDEwMDAgfSwKKwl7IDB4MDAwMzA1LCAgIDEsIDB4MDEsIDB4NzA2MDUwNDAgfSwKKwl7IDB4MDAwMzA2LCAgIDEsIDB4MDEsIDB4YjhhODk4ODggfSwKKwl7IDB4MDAwMzA3LCAgIDEsIDB4MDEsIDB4ZjhlOGQ4YzggfSwKKwl7IDB4MDAwMzBhLCAgIDEsIDB4MDEsIDB4MDBmZmZmMDAgfSwKKwl7IDB4MDAwMzBiLCAgIDEsIDB4MDEsIDB4MDAwMDAwMWEgfSwKKwl7IDB4MDAwMzBjLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzE4LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzQwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzc1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzdkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwM2EwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwM2FhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwM2E5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzgwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzgzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTEgfSwKKwl7IDB4MDAwMzYwLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwMzY2LCAgIDIsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzY4LCAgIDEsIDB4MDEsIDB4MDAwMDBmZmYgfSwKKwl7IDB4MDAwMzcwLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzcyLCAgIDEsIDB4MDEsIDB4MDAwZmZmZmYgfSwKKwl7IDB4MDAwMzdhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTIgfSwKKwl7IDB4MDAwNjE5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwODExLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwODEyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwODEzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwODE0LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwODE1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMGIgfSwKKwl7IDB4MDAwODAwLCAgIDYsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjMyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjMzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjM0LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwNjM1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwNjU0LCAgIDEsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwNjU3LCAgIDEsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwNjU1LCAgIDIsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwNmNkLCAgIDEsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwN2Y1LCAgIDEsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwN2RjLCAgIDEsIDB4MDEsIDB4MzkyOTE5MDkgfSwKKwl7IDB4MDAwN2RkLCAgIDEsIDB4MDEsIDB4Nzk2OTU5NDkgfSwKKwl7IDB4MDAwN2RlLCAgIDEsIDB4MDEsIDB4YjlhOTk5ODkgfSwKKwl7IDB4MDAwN2RmLCAgIDEsIDB4MDEsIDB4ZjllOWQ5YzkgfSwKKwl7IDB4MDAwN2U4LCAgIDEsIDB4MDEsIDB4MDAwMDMyMTAgfSwKKwl7IDB4MDAwN2U5LCAgIDEsIDB4MDEsIDB4MDAwMDc2NTQgfSwKKwl7IDB4MDAwN2VhLCAgIDEsIDB4MDEsIDB4MDAwMDAwOTggfSwKKwl7IDB4MDAwN2VjLCAgIDEsIDB4MDEsIDB4MzkyOTE5MDkgfSwKKwl7IDB4MDAwN2VkLCAgIDEsIDB4MDEsIDB4Nzk2OTU5NDkgfSwKKwl7IDB4MDAwN2VlLCAgIDEsIDB4MDEsIDB4YjlhOTk5ODkgfSwKKwl7IDB4MDAwN2VmLCAgIDEsIDB4MDEsIDB4ZjllOWQ5YzkgfSwKKwl7IDB4MDAwN2YwLCAgIDEsIDB4MDEsIDB4MDAwMDMyMTAgfSwKKwl7IDB4MDAwN2YxLCAgIDEsIDB4MDEsIDB4MDAwMDc2NTQgfSwKKwl7IDB4MDAwN2YyLCAgIDEsIDB4MDEsIDB4MDAwMDAwOTggfSwKKwl7IDB4MDAwNWE1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTgwLCAxMjgsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNDY4LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwNDZjLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNDcwLCAgOTYsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwNTEwLCAgMTYsIDB4MDEsIDB4M2Y4MDAwMDAgfSwKKwl7IDB4MDAwNTIwLCAgIDEsIDB4MDEsIDB4MDAwMDAyYjYgfSwKKwl7IDB4MDAwNTI5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNTMwLCAgMTYsIDB4MDEsIDB4ZmZmZjAwMDAgfSwKKwl7IDB4MDAwNTg1LCAgIDEsIDB4MDEsIDB4MDAwMDAwM2YgfSwKKwl7IDB4MDAwNTc2LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwNTdiLCAgIDEsIDB4MDEsIDB4MDAwMDAwNTkgfSwKKwl7IDB4MDAwNTg2LCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwNTgyLCAgIDIsIDB4MDEsIDB4MDAwMDAwODAgfSwKKwl7IDB4MDAwNWMyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjM4LCAgIDIsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjNhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjNiLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjNkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjNlLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOGI4LCAgIDgsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTAwLCAgIDgsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTA4LCAgIDgsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwOTEwLCAgMTYsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTIwLCAgIDgsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwOTI4LCAgIDgsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjYyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjQ4LCAgIDksIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNjU4LCAgIDEsIDB4MDEsIDB4MDAwMDAwMGYgfSwKKwl7IDB4MDAwN2ZmLCAgIDEsIDB4MDEsIDB4MDAwMDAwMGEgfSwKKwl7IDB4MDAwNjZhLCAgIDEsIDB4MDEsIDB4NDAwMDAwMDAgfSwKKwl7IDB4MDAwNjZiLCAgIDEsIDB4MDEsIDB4MTAwMDAwMDAgfSwKKwl7IDB4MDAwNjZjLCAgIDIsIDB4MDEsIDB4ZmZmZjAwMDAgfSwKKwl7IDB4MDAwN2FmLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwN2Y2LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwODBiLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNmIyLCAgIDEsIDB4MDEsIDB4MDAwMDAwNTUgfSwKKwl7IDB4MDAwN2FkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwOTM3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTcxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwOTcyLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwOTczLCAgIDEsIDB4MDEsIDB4MDAwMDAxMmMgfSwKKwl7IDB4MDAwOTdjLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwOTc5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwOTc1LCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwOTc2LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTc3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwOTc4LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwOTU3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwOTVlLCAgIDEsIDB4MDEsIDB4MjAxNjQwMTAgfSwKKwl7IDB4MDAwOTVmLCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwYTBkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwOTdkLCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwNjgzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwNjg1LCAgIDEsIDB4MDEsIDB4MDAzZmZmZmYgfSwKKwl7IDB4MDAwNjg3LCAgIDEsIDB4MDEsIDB4MDAzZmZmZmYgfSwKKwl7IDB4MDAwNmEwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDUgfSwKKwl7IDB4MDAwODQwLCAgIDEsIDB4MDEsIDB4MDA0MDAwMDggfSwKKwl7IDB4MDAwODQxLCAgIDEsIDB4MDEsIDB4MDgwMDAwODAgfSwKKwl7IDB4MDAwODQyLCAgIDEsIDB4MDEsIDB4MDA0MDAwMDggfSwKKwl7IDB4MDAwODQzLCAgIDEsIDB4MDEsIDB4MDgwMDAwODAgfSwKKwl7IDB4MDAwNmFhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNmFiLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNmFjLCAgIDEsIDB4MDEsIDB4MDAwMDAwODAgfSwKKwl7IDB4MDAwNmFkLCAgIDIsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwNmIxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTEgfSwKKwl7IDB4MDAwNmJiLCAgIDEsIDB4MDEsIDB4MDAwMDAwY2YgfSwKKwl7IDB4MDAwNmNlLCAgIDEsIDB4MDEsIDB4MmE3MTI0ODggfSwKKwl7IDB4MDAwNzM5LCAgIDEsIDB4MDEsIDB4NDA4NWMwMDAgfSwKKwl7IDB4MDAwNzNhLCAgIDEsIDB4MDEsIDB4MDAwMDAwODAgfSwKKwl7IDB4MDAwNzg2LCAgIDEsIDB4MDEsIDB4ODAwMDAxMDAgfSwKKwl7IDB4MDAwNzNjLCAgIDEsIDB4MDEsIDB4MDAwMTAxMDAgfSwKKwl7IDB4MDAwNzNkLCAgIDEsIDB4MDEsIDB4MDI4MDAwMDAgfSwKKwl7IDB4MDAwNzg3LCAgIDEsIDB4MDEsIDB4MDAwMDAwY2YgfSwKKwl7IDB4MDAwNzhjLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwNzkyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNzk0LCAgIDMsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNzk3LCAgIDEsIDB4MDEsIDB4MDAwMDAwY2YgfSwKKwl7IDB4MDAwODM2LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNzlhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwODMzLCAgIDEsIDB4MDEsIDB4MDQ0NDQ0ODAgfSwKKwl7IDB4MDAwN2ExLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwN2EzLCAgIDMsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwODMxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwYjA3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYjA4LCAgIDIsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwYjBhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwYTA0LCAgIDEsIDB4MDEsIDB4MDAwMDAwZmYgfSwKKwl7IDB4MDAwYTBiLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwOTdmLCAgIDEsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwYTAyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwODA5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDcgfSwKKwl7IDB4MDBjMjIxLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDBjMWIwLCAgIDgsIDB4MDEsIDB4MDAwMDAwMGYgfSwKKwl7IDB4MDBjMWI4LCAgIDEsIDB4MDEsIDB4MGZhYzY4ODEgfSwKKwl7IDB4MDBjMWI5LCAgIDEsIDB4MDEsIDB4MDBmYWM2ODggfSwKKwl7IDB4MDBjNDAxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDBjNDAyLCAgIDEsIDB4MDEsIDB4MDAwMTAwMDEgfSwKKwl7IDB4MDBjNDAzLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDBjNDBlLCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDBjNTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDFlMTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAxMDAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNmFhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNmFkLCAgIDIsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwNmIxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMTEgfSwKKwl7IDB4MDAwNzhjLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwNzkyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNzk0LCAgIDMsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwNzk3LCAgIDEsIDB4MDEsIDB4MDAwMDAwY2YgfSwKKwl7IDB4MDAwNzlhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwN2ExLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwN2EzLCAgIDMsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwODMxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDFlMTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAxMDAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwMDM5LCAgIDMsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzgwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwMzY2LCAgIDIsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzY4LCAgIDEsIDB4MDEsIDB4MDAwMDBmZmYgfSwKKwl7IDB4MDAwMzcwLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDAgfSwKKwl7IDB4MDAwMzcyLCAgIDEsIDB4MDEsIDB4MDAwZmZmZmYgfSwKKwl7IDB4MDAwODEzLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwODE0LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwOTU3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwYjA3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYjA4LCAgIDIsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwYjBhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwYTA0LCAgIDEsIDB4MDEsIDB4MDAwMDAwZmYgfSwKKwl7IDB4MDAwYTBiLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDAwOTdmLCAgIDEsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwYTAyLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwODA5LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDcgfSwKKwl7IDB4MDBjMjIxLCAgIDEsIDB4MDEsIDB4MDAwMDAwNDAgfSwKKwl7IDB4MDBjNDAxLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDBjNDAyLCAgIDEsIDB4MDEsIDB4MDAwMTAwMDEgfSwKKwl7IDB4MDBjNDAzLCAgIDIsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDBjNDBlLCAgIDEsIDB4MDEsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDBjNTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDFlMTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAxMDAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDAwYjA3LCAgIDEsIDB4MDEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYjA4LCAgIDIsIDB4MDEsIDB4MDAwMDAxMDAgfSwKKwl7IDB4MDAwYjBhLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7IDB4MDFlMTAwLCAgIDEsIDB4MDEsIDB4MDAwMDAwMDEgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyY3R4X2luaXRfYTE5N1tdID0geworCXsgMHgwMDA4MDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4NDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4ODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4YzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5MDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5NDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5ODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5YzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4MDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4NDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4ODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4YzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5MDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5NDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5ODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5YzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4MDgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA4NDgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA4ODgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA4YzgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA5MDgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA5NDgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA5ODgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA5YzgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDA4MGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA4NGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA4OGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA4Y2MsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA5MGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA5NGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA5OGMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA5Y2MsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDA4MTAsICAgMSwgMHgwNCwgMHgwMDAwMDBjZiB9LAorCXsgMHgwMDA4NTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4OTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4ZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5MTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5NTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5OTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5ZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4MTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA4NTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA4OTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA4ZDQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA5MTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA5NTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA5OTQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA5ZDQsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA4MTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA4NTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA4OTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA4ZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA5MTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA5NTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA5OTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA5ZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA4MWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4NWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4OWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4ZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5MWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5NWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5OWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5ZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4MjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4NjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4YTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA4ZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5MjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5NjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5YTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA5ZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjM2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjN2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjOWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjYmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFjZmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkM2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkN2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkOWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkYmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFkZmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmM2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmN2MsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmOWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFmZmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDIwNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAxMSB9LAorCXsgMHgwMDIwODAsICAgMSwgMHgwNCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDIwYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAzMCB9LAorCXsgMHgwMDIxMDAsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDIxNDAsICAgMSwgMHgwNCwgMHgwMDAwMDA1MSB9LAorCXsgMHgwMDIwMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIwNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIwOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIwY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIxMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIxNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIwMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDIwNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDIwOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDIwZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDIxMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDIxNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3MzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDI4MDAsIDEyOCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBhZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBiZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBjMGMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjMWMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjMmMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjM2MsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjNGMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjNWMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjNmMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjN2MsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjOGMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjOWMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjYWMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjYmMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjY2MsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjZGMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjZWMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBjZmMsICAgMSwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDBkMDAsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMDgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMTAsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMjAsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMjgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMzAsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMzgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMDQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMGMsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMWMsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMjQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMmMsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkMzQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkM2MsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBlMDQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMjQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMzQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNDQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNjQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNzQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlODQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlOTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYjQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYzQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZDQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZTQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZjQsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMDgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMjgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlMzgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNDgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNjgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlNzgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlODgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlOTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYjgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlYzgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZDgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZTgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBlZjgsICAgMSwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDBkNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFlMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlMjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlNDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlODgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlZjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDFlMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlYjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDFlZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDM0MDAsIDEyOCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE5NDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1MTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNjgsICAgMSwgMHgwNCwgMHgwMDAwZmZmZiB9LAorCXsgMHgwMDEyMWMsICAgMSwgMHgwNCwgMHgwZmFjNjg4MSB9LAorCXsgMHgwMDBmYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1MzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDBmZTAsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAxNCB9LAorCXsgMHgwMDBmZWMsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDBmZjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE3OWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyMjgsICAgMSwgMHgwNCwgMHgwMDAwMDQwMCB9LAorCXsgMHgwMDEyMmMsICAgMSwgMHgwNCwgMHgwMDAwMDMwMCB9LAorCXsgMHgwMDEyMzAsICAgMSwgMHgwNCwgMHgwMDAxMDAwMSB9LAorCXsgMHgwMDA3ZjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1YjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1Y2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1MzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1ZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1M2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2YjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDBmYmMsICAgNCwgMHgwNCwgMHgwMDAwZmZmZiB9LAorCXsgMHgwMDBkZjgsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE2MWMsICAgMSwgMHgwNCwgMHgwMDAwMDlmMCB9LAorCXsgMHgwMDBkY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDE2M2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1ZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDExNjAsICAzMiwgMHgwNCwgMHgyNWUwMDA0MCB9LAorCXsgMHgwMDE4ODAsICAzMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmODQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE3YzgsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE3ZDAsICAgMSwgMHgwNCwgMHgwMDAwMDBmZiB9LAorCXsgMHgwMDE3ZDQsICAgMSwgMHgwNCwgMHhmZmZmZmZmZiB9LAorCXsgMHgwMDE3ZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDE3ZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1ZjQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE0MzQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE2NDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3NDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2NDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyYTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDExMjAsICAgNCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDExMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2NGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2NTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5MTAsICAgMSwgMHgwNCwgMHgwMDAwMDI5MCB9LAorCXsgMHgwMDE1MTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2NWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1MjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2MDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1NzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzYjAsICAgMiwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDAyMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2NzAsICAgMSwgMHgwNCwgMHgzMDIwMTAwMCB9LAorCXsgMHgwMDE2NzQsICAgMSwgMHgwNCwgMHg3MDYwNTA0MCB9LAorCXsgMHgwMDE2NzgsICAgMSwgMHgwNCwgMHhiOGE4OTg4OCB9LAorCXsgMHgwMDE2N2MsICAgMSwgMHgwNCwgMHhmOGU4ZDhjOCB9LAorCXsgMHgwMDE2NmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2ODAsICAgMSwgMHgwNCwgMHgwMGZmZmYwMCB9LAorCXsgMHgwMDEyZDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDEyZDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDE2ODQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkYWMsICAgMiwgMHgwNCwgMHgwMDAwMWIwMiB9LAorCXsgMHgwMDBkYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2OGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1YmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1NmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE4N2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDExMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDBkYzAsICAgMywgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyMzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2OTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDAyYzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3OTAsICAgNSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3N2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEwMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDEwZmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAyMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDEyZDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDBkOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1NWMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1NjQsICAgMSwgMHgwNCwgMHgwMDAwMGZmZiB9LAorCXsgMHgwMDE1NzQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1N2MsICAgMSwgMHgwNCwgMHgwMDBmZmZmZiB9LAorCXsgMHgwMDEzNTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2MTAsICAgMSwgMHgwNCwgMHgwMDAwMDAxMiB9LAorCXsgMHgwMDE2MDgsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDI2MGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3YWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE2MmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDAyMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzMjQsICAgNiwgMHgwNCwgMHgzZjgwMDAwMCB9LAorCXsgMHgwMDA3NTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3NjAsICAgMSwgMHgwNCwgMHgzOTI5MTkwOSB9LAorCXsgMHgwMDA3NjQsICAgMSwgMHgwNCwgMHg3OTY5NTk0OSB9LAorCXsgMHgwMDA3NjgsICAgMSwgMHgwNCwgMHhiOWE5OTk4OSB9LAorCXsgMHgwMDA3NmMsICAgMSwgMHgwNCwgMHhmOWU5ZDljOSB9LAorCXsgMHgwMDA3NzAsICAgMSwgMHgwNCwgMHgzMDIwMTAwMCB9LAorCXsgMHgwMDA3NzQsICAgMSwgMHgwNCwgMHg3MDYwNTA0MCB9LAorCXsgMHgwMDA3NzgsICAgMSwgMHgwNCwgMHgwMDAwOTA4MCB9LAorCXsgMHgwMDA3ODAsICAgMSwgMHgwNCwgMHgzOTI5MTkwOSB9LAorCXsgMHgwMDA3ODQsICAgMSwgMHgwNCwgMHg3OTY5NTk0OSB9LAorCXsgMHgwMDA3ODgsICAgMSwgMHgwNCwgMHhiOWE5OTk4OSB9LAorCXsgMHgwMDA3OGMsICAgMSwgMHgwNCwgMHhmOWU5ZDljOSB9LAorCXsgMHgwMDA3ZDAsICAgMSwgMHgwNCwgMHgzMDIwMTAwMCB9LAorCXsgMHgwMDA3ZDQsICAgMSwgMHgwNCwgMHg3MDYwNTA0MCB9LAorCXsgMHgwMDA3ZDgsICAgMSwgMHgwNCwgMHgwMDAwOTA4MCB9LAorCXsgMHgwMDAzN2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDA3NDAsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDI2MDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5MTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5MWMsICAgMSwgMHgwNCwgMHgwMDAwMDkwMCB9LAorCXsgMHgwMDE5MjAsICAgMSwgMHgwNCwgMHgwMDAwMDQwNSB9LAorCXsgMHgwMDEzMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE5MjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzYWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5MmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE5M2MsICAgMSwgMHgwNCwgMHgwMDAwMmMxYyB9LAorCXsgMHgwMDBkN2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAyYzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1MTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmZjQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NGMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1OTAsICAgMSwgMHgwNCwgMHgwMDAwMDAzZiB9LAorCXsgMHgwMDA3ZTgsICAgNCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5NmMsICAgMSwgMHgwNCwgMHgwMDAwMDAxMSB9LAorCXsgMHgwMDAyZTQsICAgMSwgMHgwNCwgMHgwMDAwYjAwMSB9LAorCXsgMHgwMDAzNmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5N2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmY2MsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAyZDgsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDE5ODAsICAgMSwgMHgwNCwgMHgwMDAwMDA4MCB9LAorCXsgMHgwMDE1MDQsICAgMSwgMHgwNCwgMHgwMDAwMDA4MCB9LAorCXsgMHgwMDE5ODQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyZWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzODAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzODQsICAgNCwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzOTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzOWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1OTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1OTgsICAgNCwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDBmNTQsICAgMywgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5YmMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmOWMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyY2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEyZTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzNjAsICAgOCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzM2MsICAgMiwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDEzNDgsICAgMiwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEzNTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDEzNTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEyZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDEzMWMsICAgNCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5YzAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDExNDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5YzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5YzgsICAgMSwgMHgwNCwgMHgwMDAwMTUwMCB9LAorCXsgMHgwMDEzNWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE5ZTAsICAgOCwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE5Y2MsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE1YjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDFhMDAsICAgMSwgMHgwNCwgMHgwMDAwMTExMSB9LAorCXsgMHgwMDFhMDQsICAgNywgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkNmMsICAgMiwgMHgwNCwgMHhmZmZmMDAwMCB9LAorCXsgMHgwMDEwZjgsICAgMSwgMHgwNCwgMHgwMDAwMTAxMCB9LAorCXsgMHgwMDBkODAsICAgNSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3YTQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE1MDgsICAgMSwgMHgwNCwgMHg4MDAwMDAwMCB9LAorCXsgMHgwMDE1MGMsICAgMSwgMHgwNCwgMHg0MDAwMDAwMCB9LAorCXsgMHgwMDE2NjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzMTgsICAgMiwgMHgwNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDBkOWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDBkZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzNzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzNzgsICAgMSwgMHgwNCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDA3ZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDA3NGMsICAgMSwgMHgwNCwgMHgwMDAwMDA1NSB9LAorCXsgMHgwMDE0MjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDE3YmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDE3YzQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEwMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDEwMGMsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDEwMTAsICAgMSwgMHgwNCwgMHgwMDAwMDEyYyB9LAorCXsgMHgwMDBkNjAsICAgMSwgMHgwNCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDA3NWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDEwMTgsICAgMSwgMHgwNCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDEwMWMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDEwMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDEwMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDE0NDQsICAgMywgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAzNjAsICAgMSwgMHgwNCwgMHgyMDE2NDAxMCB9LAorCXsgMHgwMDAzNjQsICAgMSwgMHgwNCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDAzNjgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBkZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAyMDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAyMDgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDAyY2MsICAgMiwgMHgwNCwgMHgwMDNmZmZmZiB9LAorCXsgMHgwMDEyMjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDBmZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHgwMDBmOTgsICAgMSwgMHgwNCwgMHgwMDQwMDAwOCB9LAorCXsgMHgwMDEyODQsICAgMSwgMHgwNCwgMHgwODAwMDA4MCB9LAorCXsgMHgwMDE0NTAsICAgMSwgMHgwNCwgMHgwMDQwMDAwOCB9LAorCXsgMHgwMDE0NTQsICAgMSwgMHgwNCwgMHgwODAwMDA4MCB9LAorCXsgMHgwMDAyMTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorbnYxMDhfZ3JjdHhfaW5pdF91bms0MHh4W10gPSB7CisJeyAweDQwNDAwNCwgICA4LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDAyNCwgICAxLCAweDA0LCAweDAwMDBlMDAwIH0sCisJeyAweDQwNDAyOCwgICA4LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDBhOCwgICA4LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDBjOCwgICAxLCAweDA0LCAweGY4MDAwMDhmIH0sCisJeyAweDQwNDBkMCwgICA2LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDBlOCwgICAxLCAweDA0LCAweDAwMDAxMDAwIH0sCisJeyAweDQwNDBmOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDEwMCwgIDEwLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDEzMCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDEzOCwgICAxLCAweDA0LCAweDIwMDAwMDQwIH0sCisJeyAweDQwNDE1MCwgICAxLCAweDA0LCAweDAwMDAwMDJlIH0sCisJeyAweDQwNDE1NCwgICAxLCAweDA0LCAweDAwMDAwNDAwIH0sCisJeyAweDQwNDE1OCwgICAxLCAweDA0LCAweDAwMDAwMjAwIH0sCisJeyAweDQwNDE2NCwgICAxLCAweDA0LCAweDAwMDAwMDU1IH0sCisJeyAweDQwNDE3YywgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDE5NCwgICAxLCAweDA0LCAweDAxMDAwNzAwIH0sCisJeyAweDQwNDFhMCwgICA0LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQwNDIwMCwgICAxLCAweDA0LCAweDAwMDBhMTk3IH0sCisJeyAweDQwNDIwNCwgICAxLCAweDA0LCAweDAwMDBhMWMwIH0sCisJeyAweDQwNDIwOCwgICAxLCAweDA0LCAweDAwMDBhMTQwIH0sCisJeyAweDQwNDIwYywgICAxLCAweDA0LCAweDAwMDA5MDJkIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmN0eF9pbml0X3VuazU4eHhbXSA9IHsKKwl7IDB4NDA1ODAwLCAgIDEsIDB4MDQsIDB4MGY4MDAwYmYgfSwKKwl7IDB4NDA1ODMwLCAgIDEsIDB4MDQsIDB4MDIxODA2NDggfSwKKwl7IDB4NDA1ODM0LCAgIDEsIDB4MDQsIDB4MDgwMDAwMDAgfSwKKwl7IDB4NDA1ODM4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1ODU0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1ODcwLCAgIDQsIDB4MDQsIDB4MDAwMDAwMDEgfSwKKwl7IDB4NDA1YTAwLCAgIDIsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1YTE4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1YTFjLCAgIDEsIDB4MDQsIDB4MDAwMDAwZmYgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyY3R4X2luaXRfdW5rNjR4eFtdID0geworCXsgMHg0MDY0YTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDY0YWMsICAgMSwgMHgwNCwgMHgwMDAwM2ZmZiB9LAorCXsgMHg0MDY0YjAsICAgMywgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDY0YzAsICAgMSwgMHgwNCwgMHg4MDIwMDBmMCB9LAorCXsgMHg0MDY0YzQsICAgMSwgMHgwNCwgMHgwMTkyZmZmZiB9LAorCXsgMHg0MDY0YzgsICAgMSwgMHgwNCwgMHgwMGMyMDIwMCB9LAorCXsgMHg0MDY0Y2MsICAgOSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDY0ZmMsICAgMSwgMHgwNCwgMHgwMDAwMDIyYSB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorbnYxMDhfZ3JjdHhfaW5pdF91bms3OHh4W10gPSB7CisJeyAweDQwNzgwNCwgICAxLCAweDA0LCAweDAwMDAwMDYzIH0sCisJeyAweDQwNzgwYywgICAxLCAweDA0LCAweDBhNDE4ODIwIH0sCisJeyAweDQwNzgxMCwgICAxLCAweDA0LCAweDA2MjA4MGU2IH0sCisJeyAweDQwNzgxNCwgICAxLCAweDA0LCAweDAyMDM5OGE0IH0sCisJeyAweDQwNzgxOCwgICAxLCAweDA0LCAweDBlNjI5MDYyIH0sCisJeyAweDQwNzgxYywgICAxLCAweDA0LCAweDBhNDE4ODIwIH0sCisJeyAweDQwNzgyMCwgICAxLCAweDA0LCAweDAwMDAwMGU2IH0sCisJeyAweDQwNzhiYywgICAxLCAweDA0LCAweDAwMDAwMTAzIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmN0eF9pbml0X3Vuazg4eHhbXSA9IHsKKwl7IDB4NDA4ODAwLCAgIDEsIDB4MDQsIDB4MzI4MDJhM2MgfSwKKwl7IDB4NDA4ODA0LCAgIDEsIDB4MDQsIDB4MDAwMDAwNDAgfSwKKwl7IDB4NDA4ODA4LCAgIDEsIDB4MDQsIDB4MTAwM2UwMDUgfSwKKwl7IDB4NDA4ODQwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMGIgfSwKKwl7IDB4NDA4OTAwLCAgIDEsIDB4MDQsIDB4YjA4MGI4MDEgfSwKKwl7IDB4NDA4OTA0LCAgIDEsIDB4MDQsIDB4NjIwMDAwMDEgfSwKKwl7IDB4NDA4OTA4LCAgIDEsIDB4MDQsIDB4MDJjODEwMmYgfSwKKwl7IDB4NDA4OTgwLCAgIDEsIDB4MDQsIDB4MDAwMDAxMWQgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyY3R4X2luaXRfZ3BjXzBbXSA9IHsKKwl7IDB4NDE4MzgwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMTYgfSwKKwl7IDB4NDE4NDAwLCAgIDEsIDB4MDQsIDB4MzgwMDVlMDAgfSwKKwl7IDB4NDE4NDA0LCAgIDEsIDB4MDQsIDB4NzFlMGZmZmYgfSwKKwl7IDB4NDE4NDBjLCAgIDEsIDB4MDQsIDB4MDAwMDEwMDggfSwKKwl7IDB4NDE4NDEwLCAgIDEsIDB4MDQsIDB4MGZmZjBmZmYgfSwKKwl7IDB4NDE4NDE0LCAgIDEsIDB4MDQsIDB4MDIyMDBmZmYgfSwKKwl7IDB4NDE4NDUwLCAgIDYsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4NDY4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDEgfSwKKwl7IDB4NDE4NDZjLCAgIDIsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4NjAwLCAgIDEsIDB4MDQsIDB4MDAwMDAwN2YgfSwKKwl7IDB4NDE4Njg0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMWYgfSwKKwl7IDB4NDE4NzAwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4NDE4NzA0LCAgIDIsIDB4MDQsIDB4MDAwMDAwODAgfSwKKwl7IDB4NDE4NzBjLCAgIDIsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4ODAwLCAgIDEsIDB4MDQsIDB4NzAwNjg2M2EgfSwKKwl7IDB4NDE4ODA4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4ODBjLCAgIDEsIDB4MDQsIDB4MDAwMDAwMzAgfSwKKwl7IDB4NDE4ODEwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4ODI4LCAgIDEsIDB4MDQsIDB4MDAwMDAwNDQgfSwKKwl7IDB4NDE4ODMwLCAgIDEsIDB4MDQsIDB4MTAwMDAwMDEgfSwKKwl7IDB4NDE4OGQ4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDggfSwKKwl7IDB4NDE4OGUwLCAgIDEsIDB4MDQsIDB4MDEwMDAwMDAgfSwKKwl7IDB4NDE4OGU4LCAgIDUsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4OGZjLCAgIDEsIDB4MDQsIDB4MjAxMDAwNTggfSwKKwl7IDB4NDE4OTFjLCAgIDEsIDB4MDQsIDB4MDBmZjAwZmYgfSwKKwl7IDB4NDE4OTI0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4OTI4LCAgIDEsIDB4MDQsIDB4MDBmZmZmMDAgfSwKKwl7IDB4NDE4OTJjLCAgIDEsIDB4MDQsIDB4MDAwMGZmMDAgfSwKKwl7IDB4NDE4YjAwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMWUgfSwKKwl7IDB4NDE4YjA4LCAgIDEsIDB4MDQsIDB4MGE0MTg4MjAgfSwKKwl7IDB4NDE4YjBjLCAgIDEsIDB4MDQsIDB4MDYyMDgwZTYgfSwKKwl7IDB4NDE4YjEwLCAgIDEsIDB4MDQsIDB4MDIwMzk4YTQgfSwKKwl7IDB4NDE4YjE0LCAgIDEsIDB4MDQsIDB4MGU2MjkwNjIgfSwKKwl7IDB4NDE4YjE4LCAgIDEsIDB4MDQsIDB4MGE0MTg4MjAgfSwKKwl7IDB4NDE4YjFjLCAgIDEsIDB4MDQsIDB4MDAwMDAwZTYgfSwKKwl7IDB4NDE4YmI4LCAgIDEsIDB4MDQsIDB4MDAwMDAxMDMgfSwKKwl7IDB4NDE4YzA4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDEgfSwKKwl7IDB4NDE4YzEwLCAgIDgsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE4YzQwLCAgIDEsIDB4MDQsIDB4ZmZmZmZmZmYgfSwKKwl7IDB4NDE4YzZjLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDEgfSwKKwl7IDB4NDE4YzgwLCAgIDEsIDB4MDQsIDB4MjAyMDAwMGMgfSwKKwl7IDB4NDE4YzhjLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDEgfSwKKwl7IDB4NDE4ZDI0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE5MDAwLCAgIDEsIDB4MDQsIDB4MDAwMDA3ODAgfSwKKwl7IDB4NDE5MDA0LCAgIDIsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDE5MDE0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDQgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyY3R4X2luaXRfdHBjW10gPSB7CisJeyAweDQxOTg0OCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOTg2NCwgICAxLCAweDA0LCAweDAwMDAwMTI5IH0sCisJeyAweDQxOTg4OCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWEwMCwgICAxLCAweDA0LCAweDAwMDEwMGYwIH0sCisJeyAweDQxOWEwNCwgICAxLCAweDA0LCAweDAwMDAwMDAxIH0sCisJeyAweDQxOWEwOCwgICAxLCAweDA0LCAweDAwMDAwNDIxIH0sCisJeyAweDQxOWEwYywgICAxLCAweDA0LCAweDAwMTIwMDAwIH0sCisJeyAweDQxOWExMCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWExNCwgICAxLCAweDA0LCAweDAwMDAwMjAwIH0sCisJeyAweDQxOWExYywgICAxLCAweDA0LCAweDAwMDBjMDAwIH0sCisJeyAweDQxOWEyMCwgICAxLCAweDA0LCAweDAwMDAwODAwIH0sCisJeyAweDQxOWEzMCwgICAxLCAweDA0LCAweDAwMDAwMDAxIH0sCisJeyAweDQxOWFjNCwgICAxLCAweDA0LCAweDAwMzdmNDQwIH0sCisJeyAweDQxOWMwMCwgICAxLCAweDA0LCAweDAwMDAwMDFhIH0sCisJeyAweDQxOWMwNCwgICAxLCAweDA0LCAweDgwMDAwMDA2IH0sCisJeyAweDQxOWMwOCwgICAxLCAweDA0LCAweDAwMDAwMDAyIH0sCisJeyAweDQxOWMyMCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWMyNCwgICAxLCAweDA0LCAweDAwMDg0MjEwIH0sCisJeyAweDQxOWMyOCwgICAxLCAweDA0LCAweDNlZmJlZmJlIH0sCisJeyAweDQxOWNlOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWNmNCwgICAxLCAweDA0LCAweDAwMDAwMjAzIH0sCisJeyAweDQxOWUwNCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWUwOCwgICAxLCAweDA0LCAweDAwMDAwMDFkIH0sCisJeyAweDQxOWUwYywgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWUxMCwgICAxLCAweDA0LCAweDAwMDAxYzAyIH0sCisJeyAweDQxOWU0NCwgICAxLCAweDA0LCAweDAwMTNlZmYyIH0sCisJeyAweDQxOWU0OCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWU0YywgICAxLCAweDA0LCAweDAwMDAwMDdmIH0sCisJeyAweDQxOWU1MCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWU1OCwgICAxLCAweDA0LCAweDAwMDAwMDAxIH0sCisJeyAweDQxOWU1YywgICAzLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWU2OCwgICAxLCAweDA0LCAweDAwMDAwMDAyIH0sCisJeyAweDQxOWU2YywgIDEyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWVhYywgICAxLCAweDA0LCAweDAwMDAxZjhmIH0sCisJeyAweDQxOWViMCwgICAxLCAweDA0LCAweDBkYjAwZGEwIH0sCisJeyAweDQxOWViOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWVjOCwgICAxLCAweDA0LCAweDAwMDEzMDRmIH0sCisJeyAweDQxOWYzMCwgICA0LCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWY0MCwgICAxLCAweDA0LCAweDAwMDAwMDE4IH0sCisJeyAweDQxOWY0NCwgICAzLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWY1OCwgICAxLCAweDA0LCAweDAwMDAwMDIwIH0sCisJeyAweDQxOWY3MCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOWY3OCwgICAxLCAweDA0LCAweDAwMDAwMWViIH0sCisJeyAweDQxOWY3YywgICAxLCAweDA0LCAweDAwMDAwNDA0IH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmN0eF9pbml0X3Vua1tdID0geworCXsgMHg0MWJlMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwNiB9LAorCXsgMHg0MWJlYzAsICAgMSwgMHgwNCwgMHgxMDAwMDAwMCB9LAorCXsgMHg0MWJlYzQsICAgMSwgMHgwNCwgMHgwMDAzN2Y3ZiB9LAorCXsgMHg0MWJlZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MWJlZjAsICAgMSwgMHgwNCwgMHgwMDAwMDNmZiB9LAorCXsgMHg0MWJmMDAsICAgMSwgMHgwNCwgMHgwYTQxODgyMCB9LAorCXsgMHg0MWJmMDQsICAgMSwgMHgwNCwgMHgwNjIwODBlNiB9LAorCXsgMHg0MWJmMDgsICAgMSwgMHgwNCwgMHgwMjAzOThhNCB9LAorCXsgMHg0MWJmMGMsICAgMSwgMHgwNCwgMHgwZTYyOTA2MiB9LAorCXsgMHg0MWJmMTAsICAgMSwgMHgwNCwgMHgwYTQxODgyMCB9LAorCXsgMHg0MWJmMTQsICAgMSwgMHgwNCwgMHgwMDAwMDBlNiB9LAorCXsgMHg0MWJmZDAsICAgMSwgMHgwNCwgMHgwMDkwMDEwMyB9LAorCXsgMHg0MWJmZTAsICAgMSwgMHgwNCwgMHgwMDQwMDAwMSB9LAorCXsgMHg0MWJmZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXt9Cit9OworCitzdGF0aWMgdm9pZAorbnYxMDhfZ3JjdHhfZ2VuZXJhdGVfbW9kcyhzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2LCBzdHJ1Y3QgbnZjMF9ncmN0eCAqaW5mbykKK3sKKwl1MzIgbWFnaWNbR1BDX01BWF1bMl07CisJdTMyIG9mZnNldDsKKwlpbnQgZ3BjOworCisJbW1pb19kYXRhKDB4MDAzMDAwLCAweDAxMDAsIE5WX01FTV9BQ0NFU1NfUlcgfCBOVl9NRU1fQUNDRVNTX1NZUyk7CisJbW1pb19kYXRhKDB4MDA4MDAwLCAweDAxMDAsIE5WX01FTV9BQ0NFU1NfUlcgfCBOVl9NRU1fQUNDRVNTX1NZUyk7CisJbW1pb19kYXRhKDB4MDYwMDAwLCAweDEwMDAsIE5WX01FTV9BQ0NFU1NfUlcpOworCW1taW9fbGlzdCgweDQwODAwYywgMHgwMDAwMDAwMCwgIDgsIDEpOworCW1taW9fbGlzdCgweDQwODAxMCwgMHg4MDAwMDAwMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQxOTAwNCwgMHgwMDAwMDAwMCwgIDgsIDEpOworCW1taW9fbGlzdCgweDQxOTAwOCwgMHgwMDAwMDAwMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQwODAwNCwgMHgwMDAwMDAwMCwgIDgsIDApOworCW1taW9fbGlzdCgweDQwODAwOCwgMHg4MDAwMDAzMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQxODgwOCwgMHgwMDAwMDAwMCwgIDgsIDApOworCW1taW9fbGlzdCgweDQxODgwYywgMHg4MDAwMDAzMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQxODgxMCwgMHg4MDAwMDAwMCwgMTIsIDIpOworCW1taW9fbGlzdCgweDQxOTg0OCwgMHgxMDAwMDAwMCwgMTIsIDIpOworCisJbW1pb19saXN0KDB4NDA1ODMwLCAweDAyMTgwNjQ4LCAgMCwgMCk7CisJbW1pb19saXN0KDB4NDA2NGM0LCAweDAxOTJmZmZmLCAgMCwgMCk7CisKKwlmb3IgKGdwYyA9IDAsIG9mZnNldCA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJdTE2IG1hZ2ljMCA9IDB4MDIxOCAqIHByaXYtPnRwY19ucltncGNdOworCQl1MTYgbWFnaWMxID0gMHgwNjQ4ICogcHJpdi0+dHBjX25yW2dwY107CisJCW1hZ2ljW2dwY11bMF0gID0gMHgxMDAwMDAwMCB8IChtYWdpYzAgPDwgMTYpIHwgb2Zmc2V0OworCQltYWdpY1tncGNdWzFdICA9IDB4MDAwMDAwMDAgfCAobWFnaWMxIDw8IDE2KTsKKwkJb2Zmc2V0ICs9IDB4MDMyNCAqIHByaXYtPnRwY19ucltncGNdOworCX0KKworCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgeworCQltbWlvX2xpc3QoR1BDX1VOSVQoZ3BjLCAweDMwYzApLCBtYWdpY1tncGNdWzBdLCAwLCAwKTsKKwkJbW1pb19saXN0KEdQQ19VTklUKGdwYywgMHgzMGU0KSwgbWFnaWNbZ3BjXVsxXSB8IG9mZnNldCwgMCwgMCk7CisJCW9mZnNldCArPSAweDA3ZmYgKiBwcml2LT50cGNfbnJbZ3BjXTsKKwl9CisKKwltbWlvX2xpc3QoMHgxN2U5MWMsIDB4MGIwNDBhMGIsIDAsIDApOworCW1taW9fbGlzdCgweDE3ZTkyMCwgMHgwMDA5MGQwOCwgMCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0ICoKK252MTA4X2dyY3R4X2luaXRfaHViW10gPSB7CisJbnZjMF9ncmN0eF9pbml0X2Jhc2UsCisJbnYxMDhfZ3JjdHhfaW5pdF91bms0MHh4LAorCW52ZjBfZ3JjdHhfaW5pdF91bms0NHh4LAorCW52ZTRfZ3JjdHhfaW5pdF91bms0Nnh4LAorCW52ZTRfZ3JjdHhfaW5pdF91bms0N3h4LAorCW52MTA4X2dyY3R4X2luaXRfdW5rNTh4eCwKKwludmYwX2dyY3R4X2luaXRfdW5rNWJ4eCwKKwludmYwX2dyY3R4X2luaXRfdW5rNjB4eCwKKwludjEwOF9ncmN0eF9pbml0X3VuazY0eHgsCisJbnYxMDhfZ3JjdHhfaW5pdF91bms3OHh4LAorCW52ZTRfZ3JjdHhfaW5pdF91bms4MHh4LAorCW52MTA4X2dyY3R4X2luaXRfdW5rODh4eCwKKwlOVUxMCit9OworCitzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0ICoKK252MTA4X2dyY3R4X2luaXRfZ3BjW10gPSB7CisJbnYxMDhfZ3JjdHhfaW5pdF9ncGNfMCwKKwludmMwX2dyY3R4X2luaXRfZ3BjXzEsCisJbnYxMDhfZ3JjdHhfaW5pdF90cGMsCisJbnYxMDhfZ3JjdHhfaW5pdF91bmssCisJTlVMTAorfTsKKworc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorbnYxMDhfZ3JjdHhfaW5pdF9tdGhkX21hZ2ljW10gPSB7CisJeyAweDM0MTAsIDEsIDB4MDQsIDB4OGUwZTIwMDYgfSwKKwl7IDB4MzQxNCwgMSwgMHgwNCwgMHgwMDAwMDAzOCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfbXRoZAorbnYxMDhfZ3JjdHhfaW5pdF9tdGhkW10gPSB7CisJeyAweGExOTcsIG52MTA4X2dyY3R4X2luaXRfYTE5NywgfSwKKwl7IDB4OTAyZCwgbnZjMF9ncmN0eF9pbml0XzkwMmQsIH0sCisJeyAweDkwMmQsIG52MTA4X2dyY3R4X2luaXRfbXRoZF9tYWdpYywgfSwKKwl7fQorfTsKKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252MTA4X2dyY3R4X29jbGFzcyA9ICYoc3RydWN0IG52YzBfZ3JjdHhfb2NsYXNzKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfRU5HQ1RYKEdSLCAweDA4KSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52YzBfZ3JhcGhfY29udGV4dF9jdG9yLAorCQkuZHRvciA9IG52YzBfZ3JhcGhfY29udGV4dF9kdG9yLAorCQkuaW5pdCA9IF9ub3V2ZWF1X2dyYXBoX2NvbnRleHRfaW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9ncmFwaF9jb250ZXh0X2ZpbmksCisJCS5yZDMyID0gX25vdXZlYXVfZ3JhcGhfY29udGV4dF9yZDMyLAorCQkud3IzMiA9IF9ub3V2ZWF1X2dyYXBoX2NvbnRleHRfd3IzMiwKKwl9LAorCS5tYWluID0gbnZlNF9ncmN0eF9nZW5lcmF0ZV9tYWluLAorCS5tb2RzID0gbnYxMDhfZ3JjdHhfZ2VuZXJhdGVfbW9kcywKKwkudW5rbiA9IG52ZTRfZ3JjdHhfZ2VuZXJhdGVfdW5rbiwKKwkuaHViICA9IG52MTA4X2dyY3R4X2luaXRfaHViLAorCS5ncGMgID0gbnYxMDhfZ3JjdHhfaW5pdF9ncGMsCisJLmljbWQgPSBudjEwOF9ncmN0eF9pbml0X2ljbWQsCisJLm10aGQgPSBudjEwOF9ncmN0eF9pbml0X210aGQsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmYwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmYwLmMKaW5kZXggZGNiMmViYi4uNDQwMTJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZmMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52ZjAuYwpAQCAtNTAsNyArNTAsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorc3RydWN0IG52YzBfZ3JhcGhfaW5pdAogbnZmMF9ncmN0eF9pbml0X3VuazQ0eHhbXSA9IHsKIAl7IDB4NDA0NDA0LCAgMTIsIDB4MDQsIDB4MDAwMDAwMDAgfSwKIAl7IDB4NDA0NDM4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKQEAgLTYyLDcgKzYyLDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK3N0cnVjdCBudmMwX2dyYXBoX2luaXQKIG52ZjBfZ3JjdHhfaW5pdF91bms1Ynh4W10gPSB7CiAJeyAweDQwNWIwMCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCiAJeyAweDQwNWIxMCwgICAxLCAweDA0LCAweDAwMDAxMDAwIH0sCkBAIC03MCw3ICs3MCw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CiBudmYwX2dyY3R4X2luaXRfdW5rNjB4eFtdID0gewogCXsgMHg0MDYwMjAsICAgMSwgMHgwNCwgMHgwMzQxMDNjMSB9LAogCXsgMHg0MDYwMjgsICAgNCwgMHgwNCwgMHgwMDAwMDAwMSB9LApAQCAtMjg2LDcgKzI4Niw2IEBACiAJbnZmMF9ncmN0eF9pbml0X3VuazY0eHgsCiAJbnZlNF9ncmN0eF9pbml0X3VuazgweHgsCiAJbnZmMF9ncmN0eF9pbml0X3Vuazg4eHgsCi0JbnZkOV9ncmN0eF9pbml0X3JvcCwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvY29tLmZ1YyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9jb20uZnVjCmluZGV4IDVkMjRiNmQuLmUxNDg5NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9jb20uZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9jb20uZnVjCkBAIC0zOCw3ICszOCw3IEBACiAJY21wdSBiMzIgJHI4ICRyOQogCWJyYSBuZSAjcXVldWVfcHV0X25leHQKIAkJbW92ICRyMTUgRV9DTURfT1ZFUkZMT1cKLQkJY2FsbCAjZXJyb3IKKwkJY2FsbChlcnJvcikKIAkJcmV0CiAKIAkvLyBzdG9yZSBjbWQvZGF0YSBvbiBxdWV1ZQpAQCAtOTIsMTggKzkyLDE2IEBACiAvLyBPdXQ6ICRyMTUgdmFsdWUKIC8vCiBudl9yZDMyOgotCW1vdiAkcjExIDB4NzI4Ci0Jc2hsIGIzMiAkcjExIDYKIAltb3YgYjMyICRyMTIgJHIxNAogCWJzZXQgJHIxMiAzMQkJCS8vIE1NSU9fQ1RSTF9QRU5ESU5HCi0JaW93ciBJWyRyMTEgKyAweDAwMF0gJHIxMgkvLyBNTUlPX0NUUkwKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX01NSU9fQ1RSTCwgMCwgJHIxMikKIAludl9yZDMyX3dhaXQ6Ci0JCWlvcmQgJHIxMiBJWyRyMTEgKyAweDAwMF0KKwkJbnZfaW9yZCgkcjEyLCBOVl9QR1JBUEhfRkVDU19NTUlPX0NUUkwsIDApCiAJCXhiaXQgJHIxMiAkcjEyIDMxCiAJCWJyYSBuZSAjbnZfcmQzMl93YWl0CiAJbW92ICRyMTAgNgkJCS8vIERPTkVfTU1JT19SRAotCWNhbGwgI3dhaXRfZG9uZW8KLQlpb3JkICRyMTUgSVskcjExICsgMHgxMDBdCS8vIE1NSU9fUkRWQUwKKwljYWxsKHdhaXRfZG9uZW8pCisJbnZfaW9yZCgkcjE1LCBOVl9QR1JBUEhfRkVDU19NTUlPX1JEVkFMLCAwKQogCXJldAogCiAvLyBudl93cjMyIC0gd3JpdGUgMzItYml0IHZhbHVlIHRvIG52IHJlZ2lzdGVyCkBAIC0xMTIsMzcgKzExMCwxNyBAQAogLy8gICAgICAkcjE1IHZhbHVlCiAvLwogbnZfd3IzMjoKLQltb3YgJHIxMSAweDcyOAotCXNobCBiMzIgJHIxMSA2Ci0JaW93ciBJWyRyMTEgKyAweDIwMF0gJHIxNQkvLyBNTUlPX1dSVkFMCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NTUlPX1dSVkFMLCAwLCAkcjE1KQogCW1vdiBiMzIgJHIxMiAkcjE0CiAJYnNldCAkcjEyIDMxCQkJLy8gTU1JT19DVFJMX1BFTkRJTkcKIAlic2V0ICRyMTIgMzAJCQkvLyBNTUlPX0NUUkxfV1JJVEUKLQlpb3dyIElbJHIxMSArIDB4MDAwXSAkcjEyCS8vIE1NSU9fQ1RSTAorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTU1JT19DVFJMLCAwLCAkcjEyKQogCW52X3dyMzJfd2FpdDoKLQkJaW9yZCAkcjEyIElbJHIxMSArIDB4MDAwXQorCQludl9pb3JkKCRyMTIsIE5WX1BHUkFQSF9GRUNTX01NSU9fQ1RSTCwgMCkKIAkJeGJpdCAkcjEyICRyMTIgMzEKIAkJYnJhIG5lICNudl93cjMyX3dhaXQKIAlyZXQKIAotLy8gKHJlKXNldCB3YXRjaGRvZyB0aW1lcgotLy8KLS8vIEluIDogJHIxNSB0aW1lb3V0Ci0vLwotd2F0Y2hkb2dfcmVzZXQ6Ci0JbW92ICRyOCAweDQzMAotCXNobCBiMzIgJHI4IDYKLQlic2V0ICRyMTUgMzEKLQlpb3dyIElbJHI4ICsgMHgwMDBdICRyMTUKLQlyZXQKLQotLy8gY2xlYXIgd2F0Y2hkb2cgdGltZXIKLXdhdGNoZG9nX2NsZWFyOgotCW1vdiAkcjggMHg0MzAKLQlzaGwgYjMyICRyOCA2Ci0JaW93ciBJWyRyOCArIDB4MDAwXSAkcjAKLQlyZXQKLQogLy8gd2FpdF9kb25leiAtIHdhaXQgb24gRlVDX0RPTkUgYml0IHRvIGJlY29tZSBjbGVhcgogLy8KIC8vIEluIDogJHIxMCBiaXQgdG8gd2FpdCBvbgpAQCAtMTYzLDEzICsxNDEsOSBAQAogLy8KIHdhaXRfZG9uZW86CiAJdHJhY2Vfc2V0KFRfV0FJVCk7Ci0JbW92ICRyOCAweDgxOAotCXNobCBiMzIgJHI4IDYKLQlpb3dyIElbJHI4ICsgMHgwMDBdICRyMTAKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0NDX1NDUkFUQ0hfVkFMKDYpLCAwLCAkcjEwKQogCXdhaXRfZG9uZW9fZToKLQkJbW92ICRyOCAweDQwMAotCQlzaGwgYjMyICRyOCA2Ci0JCWlvcmQgJHI4IElbJHI4ICsgMHgwMDBdCisJCW52X2lvcmQoJHI4LCBOVl9QR1JBUEhfRkVDU19TSUdOQUwsIDApCiAJCXhiaXQgJHI4ICRyOCAkcjEwCiAJCWJyYSBlICN3YWl0X2RvbmVvX2UKIAl0cmFjZV9jbHIoVF9XQUlUKQpAQCAtMjA5LDIxICsxODMsMTggQEAKIC8vCiBtbWN0eF94ZmVyOgogCXRyYWNlX3NldChUX01NQ1RYKQotCW1vdiAkcjggMHg3MTAKLQlzaGwgYjMyICRyOCA2CiAJY2xlYXIgYjMyICRyOQogCW9yICRyMTEgJHIxMQogCWJyYSBlICNtbWN0eF9iYXNlX2Rpc2FibGVkCi0JCWlvd3IgSVskcjggKyAweDAwMF0gJHIxMQkvLyBNTUNUWF9CQVNFCisJCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTU1DVFhfQkFTRSwgMCwgJHIxMSkKIAkJYnNldCAkcjkgMAkJCS8vIEJBU0VfRU4KIAltbWN0eF9iYXNlX2Rpc2FibGVkOgogCW9yICRyMTQgJHIxNAogCWJyYSBlICNtbWN0eF9tdWx0aV9kaXNhYmxlZAotCQlpb3dyIElbJHI4ICsgMHgyMDBdICRyMTQgCS8vIE1NQ1RYX01VTFRJX1NUUklERQotCQlpb3dyIElbJHI4ICsgMHgzMDBdICRyMTUgCS8vIE1NQ1RYX01VTFRJX01BU0sKKwkJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NTUNUWF9NVUxUSV9TVFJJREUsIDAsICRyMTQpCisJCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTU1DVFhfTVVMVElfTUFTSywgMCwgJHIxNSkKIAkJYnNldCAkcjkgMQkJCS8vIE1VTFRJX0VOCiAJbW1jdHhfbXVsdGlfZGlzYWJsZWQ6Ci0JYWRkIGIzMiAkcjggMHgxMDAKIAogCXhiaXQgJHIxMSAkcjEwIDAKIAlzaGwgYjMyICRyMTEgMTYJCQkvLyBESVIKQEAgLTIzMSwyMCArMjAyLDIwIEBACiAJeGJpdCAkcjE0ICRyMTAgMQogCXNobCBiMzIgJHIxNCAxNwogCW9yICRyMTEgJHIxNAkJCS8vIFNUQVJUX1RSSUdHRVIKLQlpb3dyIElbJHI4ICsgMHgwMDBdICRyMTEJLy8gTU1DVFhfQ1RSTAorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTU1DVFhfQ1RSTCwgMCwgJHIxMSkKIAogCS8vIGxvb3Agb3ZlciB0aGUgbW1pbyBsaXN0LCBhbmQgc2VuZCByZXF1ZXN0cyB0byB0aGUgaHcKIAltbWN0eF9leGVjX2xvb3A6CiAJCS8vIHdhaXQgZm9yIHNwYWNlIGluIG1tY3R4IHF1ZXVlCiAJCW1tY3R4X3dhaXRfZnJlZToKLQkJCWlvcmQgJHIxNCBJWyRyOCArIDB4MDAwXSAvLyBNTUNUWF9DVFJMCisJCQludl9pb3JkKCRyMTQsIE5WX1BHUkFQSF9GRUNTX01NQ1RYX0NUUkwsIDApCiAJCQlhbmQgJHIxNCAweDFmCiAJCQlicmEgZSAjbW1jdHhfd2FpdF9mcmVlCiAKIAkJLy8gcXVldWUgdXAgYW4gZW50cnkKIAkJbGQgYjMyICRyMTQgRFskcjEyXQogCQlvciAkcjE0ICRyOQotCQlpb3dyIElbJHI4ICsgMHgzMDBdICRyMTQKKwkJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NTUNUWF9RVUVVRSwgMCwgJHIxNCkKIAkJYWRkIGIzMiAkcjEyIDQKIAkJY21wdSBiMzIgJHIxMiAkcjEzCiAJCWJyYSBuZSAjbW1jdHhfZXhlY19sb29wCkBAIC0yNTMsMjIgKzIyNCwyMiBAQAogCWJyYSBuZSAjbW1jdHhfc3RvcAogCQkvLyB3YWl0IGZvciBxdWV1ZSB0byBlbXB0eQogCQltbWN0eF9maW5pX3dhaXQ6Ci0JCQlpb3JkICRyMTEgSVskcjggKyAweDAwMF0JLy8gTU1DVFhfQ1RSTAorCQkJbnZfaW9yZCgkcjExLCBOVl9QR1JBUEhfRkVDU19NTUNUWF9DVFJMLCAwKQogCQkJYW5kICRyMTEgMHgxZgogCQkJY21wdSBiMzIgJHIxMSAweDEwCiAJCQlicmEgbmUgI21tY3R4X2Zpbmlfd2FpdAogCQltb3YgJHIxMCAyCQkJCS8vIERPTkVfTU1DVFgKLQkJY2FsbCAjd2FpdF9kb25legorCQljYWxsKHdhaXRfZG9uZXopCiAJCWJyYSAjbW1jdHhfZG9uZQogCW1tY3R4X3N0b3A6CiAJCXhiaXQgJHIxMSAkcjEwIDAKIAkJc2hsIGIzMiAkcjExIDE2CQkJLy8gRElSCiAJCWJzZXQgJHIxMSAxMgkJCS8vIFFMSU1JVCA9IDB4MTAKIAkJYnNldCAkcjExIDE4CQkJLy8gU1RPUF9UUklHR0VSCi0JCWlvd3IgSVskcjggKyAweDAwMF0gJHIxMQkvLyBNTUNUWF9DVFJMCisJCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTU1DVFhfQ1RSTCwgMCwgJHIxMSkKIAkJbW1jdHhfc3RvcF93YWl0OgogCQkJLy8gd2FpdCBmb3IgU1RPUF9UUklHR0VSIHRvIGNsZWFyCi0JCQlpb3JkICRyMTEgSVskcjggKyAweDAwMF0gLy8gTU1DVFhfQ1RSTAorCQkJbnZfaW9yZCgkcjExLCBOVl9QR1JBUEhfRkVDU19NTUNUWF9DVFJMLCAwKQogCQkJeGJpdCAkcjExICRyMTEgMTgKIAkJCWJyYSBuZSAjbW1jdHhfc3RvcF93YWl0CiAJbW1jdHhfZG9uZToKQEAgLTI4MCwyOCArMjUxLDI0IEBACiBzdHJhbmRfd2FpdDoKIAlwdXNoICRyMTAKIAltb3YgJHIxMCAyCi0JY2FsbCAjd2FpdF9kb25legorCWNhbGwod2FpdF9kb25leikKIAlwb3AgJHIxMAogCXJldAogCiAvLyB1bmtub3duIC0gY2FsbCBiZWZvcmUgaXNzdWluZyBzdHJhbmQgY29tbWFuZHMKIC8vCiBzdHJhbmRfcHJlOgotCW1vdiAkcjggMHg0YWZjCi0Jc2V0aGkgJHI4IDB4MjAwMDAKLQltb3YgJHI5IDB4YwotCWlvd3IgSVskcjhdICRyOQotCWNhbGwgI3N0cmFuZF93YWl0CisJbW92ICRyOSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0VOQUJMRQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0NNRCwgMHgzZiwgJHI5KQorCWNhbGwoc3RyYW5kX3dhaXQpCiAJcmV0CiAKIC8vIHVua25vd24gLSBjYWxsIGFmdGVyIGlzc3Vpbmcgc3RyYW5kIGNvbW1hbmRzCiAvLwogc3RyYW5kX3Bvc3Q6Ci0JbW92ICRyOCAweDRhZmMKLQlzZXRoaSAkcjggMHgyMDAwMAotCW1vdiAkcjkgMHhkCi0JaW93ciBJWyRyOF0gJHI5Ci0JY2FsbCAjc3RyYW5kX3dhaXQKKwltb3YgJHI5IE5WX1BHUkFQSF9GRUNTX1NUUkFORF9DTURfRElTQUJMRQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0NNRCwgMHgzZiwgJHI5KQorCWNhbGwoc3RyYW5kX3dhaXQpCiAJcmV0CiAKIC8vIFNlbGVjdHMgc3RyYW5kIHNldD8hCkBAIC0zMDksMTggKzI3NiwxNCBAQAogLy8gSW46ICRyMTQgaWQKIC8vCiBzdHJhbmRfc2V0OgotCW1vdiAkcjEwIDB4NGZmYwotCXNldGhpICRyMTAgMHgyMDAwMAotCXN1YiBiMzIgJHIxMSAkcjEwIDB4NTAwCiAJbW92ICRyMTIgMHhmCi0JaW93ciBJWyRyMTAgKyAweDAwMF0gJHIxMgkJLy8gMHg5M2MgPSAweGYKLQltb3YgJHIxMiAweGIKLQlpb3dyIElbJHIxMSArIDB4MDAwXSAkcjEyCQkvLyAweDkyOCA9IDB4YgotCWNhbGwgI3N0cmFuZF93YWl0Ci0JaW93ciBJWyRyMTAgKyAweDAwMF0gJHIxNAkJLy8gMHg5M2MgPSA8aWQ+Ci0JbW92ICRyMTIgMHhhCi0JaW93ciBJWyRyMTEgKyAweDAwMF0gJHIxMgkJLy8gMHg5MjggPSAweGEKLQljYWxsICNzdHJhbmRfd2FpdAorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0ZJTFRFUiwgMHgzZiwgJHIxMikKKwltb3YgJHIxMiBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0RFQUNUSVZBVEVfRklMVEVSCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01ELCAweDNmLCAkcjEyKQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0ZJTFRFUiwgMHgzZiwgJHIxNCkKKwltb3YgJHIxMiBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0FDVElWQVRFX0ZJTFRFUgorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0NNRCwgMHgzZiwgJHIxMikKKwljYWxsKHN0cmFuZF93YWl0KQogCXJldAogCiAvLyBJbml0aWFsaXNlIHN0cmFuZCBjb250ZXh0IGRhdGEKQEAgLTMzMiwzMCArMjk1LDI3IEBACiAvLwogc3RyYW5kX2N0eF9pbml0OgogCXRyYWNlX3NldChUX1NUUklOSVQpCi0JY2FsbCAjc3RyYW5kX3ByZQorCWNhbGwoc3RyYW5kX3ByZSkKIAltb3YgJHIxNCAzCi0JY2FsbCAjc3RyYW5kX3NldAotCW1vdiAkcjEwIDB4NDZmYwotCXNldGhpICRyMTAgMHgyMDAwMAotCWFkZCBiMzIgJHIxMSAkcjEwIDB4NDAwCi0JaW93ciBJWyRyMTAgKyAweDEwMF0gJHIwCS8vIFNUUkFORF9GSVJTVF9HRU5FID0gMAotCW1vdiAkcjEyIDEKLQlpb3dyIElbJHIxMSArIDB4MDAwXSAkcjEyCS8vIFNUUkFORF9DTUQgPSBMQVRDSF9GSVJTVF9HRU5FCi0JY2FsbCAjc3RyYW5kX3dhaXQKKwljYWxsKHN0cmFuZF9zZXQpCisKKwljbGVhciBiMzIgJHIxMgorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX1NFTEVDVCwgMHgzZiwgJHIxMikKKwltb3YgJHIxMiBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX1NFRUsKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX1NUUkFORF9DTUQsIDB4M2YsICRyMTIpCisJY2FsbChzdHJhbmRfd2FpdCkKIAlzdWIgYjMyICRyMTIgJHIwIDEKLQlpb3dyIElbJHIxMCArIDB4MDAwXSAkcjEyCS8vIFNUUkFORF9HRU5FX0NOVCA9IDB4ZmZmZmZmZmYKLQltb3YgJHIxMiAyCi0JaW93ciBJWyRyMTEgKyAweDAwMF0gJHIxMgkvLyBTVFJBTkRfQ01EID0gTEFUQ0hfR0VORV9DTlQKLQljYWxsICNzdHJhbmRfd2FpdAotCWNhbGwgI3N0cmFuZF9wb3N0CisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19TVFJBTkRfREFUQSwgMHgzZiwgJHIxMikKKwltb3YgJHIxMiBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0dFVF9JTkZPCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01ELCAweDNmLCAkcjEyKQorCWNhbGwoc3RyYW5kX3dhaXQpCisJY2FsbChzdHJhbmRfcG9zdCkKIAogCS8vIHJlYWQgdGhlIHNpemUgb2YgZWFjaCBzdHJhbmQsIHBva2UgdGhlIGNvbnRleHQgb2Zmc2V0IG9mCiAJLy8gZWFjaCBpbnRvIFNUUkFORF97U0FWRSxMT0FEfV9TV0JBU0Ugbm93LCBubyBuZWVkIHRvIHdvcnJ5CiAJLy8gYWJvdXQgaXQgbGF0ZXIgdGhlbi4KLQltb3YgJHI4IDB4ODgwCi0Jc2hsIGIzMiAkcjggNgotCWlvcmQgJHI5IElbJHI4ICsgMHgwMDBdCQkvLyBTVFJBTkRTCi0JYWRkIGIzMiAkcjggMHgyMjAwCisJbnZfbWtpbygkcjgsIE5WX1BHUkFQSF9GRUNTX1NUUkFORF9TQVZFX1NXQkFTRSwgMHgwMCkKKwludl9pb3JkKCRyOSwgTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EU19DTlQsIDB4MDApCiAJc2hyIGIzMiAkcjE0ICRyMTUgOAogCWN0eF9pbml0X3N0cmFuZF9sb29wOgogCQlpb3dyIElbJHI4ICsgMHgwMDBdICRyMTQJLy8gU1RSQU5EX1NBVkVfU1dCQVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjLmZ1YyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGMuZnVjCmluZGV4IDU1NDdjMWIuLjk2Y2JjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGMuZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGMuZnVjCkBAIC01OCwxMiArNTgsOSBAQAogLy8KIGVycm9yOgogCXB1c2ggJHIxNAotCW1vdiAkcjE0IC0weDY3ZWMgCS8vIDB4OTgxNAotCXNldGhpICRyMTQgMHg0MDAwMDAKLQljYWxsICNudl93cjMyCQkvLyBIVUJfQ1RYQ1RMX0NDX1NDUkFUQ0hbNV0gPSBlcnJvciBjb2RlCi0JYWRkIGIzMiAkcjE0IDB4NDFjCisJbnZfd3IzMihOVl9QR1JBUEhfRkVDU19DQ19TQ1JBVENIX1ZBTCg1KSwgJHIxNSkKIAltb3YgJHIxNSAxCi0JY2FsbCAjbnZfd3IzMgkJLy8gSFVCX0NUWENUTF9JTlRSX1VQX1NFVAorCW52X3dyMzIoTlZfUEdSQVBIX0ZFQ1NfSU5UUl9VUF9TRVQsICRyMTUpCiAJcG9wICRyMTQKIAlyZXQKIApAQCAtODQsNDYgKzgxLDQwIEBACiAJbW92ICRzcCAkcjAKIAogCS8vIGVuYWJsZSBmaWZvIGFjY2VzcwotCW1vdiAkcjEgMHgxMjAwCi0JbW92ICRyMiAyCi0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIEZJRk9fRU5BQkxFCisJbW92ICRyMiBOVl9QR1JBUEhfR1BDWF9HUENDU19BQ0NFU1NfRklGTworCW52X2lvd3IoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfQUNDRVNTLCAwLCAkcjIpCiAKIAkvLyBzZXR1cCBpMCBoYW5kbGVyLCBhbmQgcm91dGUgYWxsIGludGVycnVwdHMgdG8gaXQKIAltb3YgJHIxICNpaAogCW1vdiAkaXYwICRyMQotCW1vdiAkcjEgMHg0MDAKLQlpb3dyIElbJHIxICsgMHgzMDBdICRyMAkJLy8gSU5UUl9ESVNQQVRDSAorCW52X2lvd3IoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfSU5UUl9ST1VURSwgMCwgJHIwKQogCiAJLy8gZW5hYmxlIGZpZm8gaW50ZXJydXB0Ci0JbW92ICRyMiA0Ci0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIElOVFJfRU5fU0VUCisJbW92ICRyMiBOVl9QR1JBUEhfR1BDWF9HUENDU19JTlRSX0VOX1NFVF9GSUZPCisJbnZfaW93cihOVl9QR1JBUEhfR1BDWF9HUENDU19JTlRSX0VOX1NFVCwgMCwgJHIyKQogCiAJLy8gZW5hYmxlIGludGVycnVwdHMKIAlic2V0ICRmbGFncyBpZTAKIAogCS8vIGZpZ3VyZSBvdXQgd2hpY2ggR1BDIHdlIGFyZSwgYW5kIGhvdyBtYW55IFRQQ3Mgd2UgaGF2ZQotCW1vdiAkcjEgMHg2MDgKLQlzaGwgYjMyICRyMSA2Ci0JaW9yZCAkcjIgSVskcjEgKyAweDAwMF0JCS8vIFVOSVRTCisJbnZfaW9yZCgkcjIsIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1VOSVRTLCAwKQogCW1vdiAkcjMgMQogCWFuZCAkcjIgMHgxZgogCXNobCBiMzIgJHIzICRyMgogCXN1YiBiMzIgJHIzIDEKIAlzdCBiMzIgRFskcjAgKyAjdHBjX2NvdW50XSAkcjIKIAlzdCBiMzIgRFskcjAgKyAjdHBjX21hc2tdICRyMwotCWFkZCBiMzIgJHIxIDB4NDAwCi0JaW9yZCAkcjIgSVskcjEgKyAweDAwMF0JCS8vIE1ZSU5ERVgKKwludl9pb3JkKCRyMiwgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfTVlJTkRFWCwgMCkKIAlzdCBiMzIgRFskcjAgKyAjZ3BjX2lkXSAkcjIKIAogI2lmIE5WX1BHUkFQSF9HUENYX1VOS19fU0laRSA+IDAKIAkvLyBmaWd1cmUgb3V0IHdoaWNoLCBhbmQgaG93IG1hbnksIFVOS3MgYXJlIGFjdHVhbGx5IHByZXNlbnQKLQltb3YgJHIxNCAweDBjMzAKLQlzZXRoaSAkcjE0IDB4NTAwMDAwCisJaW1tMzIoJHIxNCwgMHg1MDBjMzApCiAJY2xlYXIgYjMyICRyMgogCWNsZWFyIGIzMiAkcjMKIAljbGVhciBiMzIgJHI0CiAJaW5pdF91bmtfbG9vcDoKLQkJY2FsbCAjbnZfcmQzMgorCQljYWxsKG52X3JkMzIpCiAJCWNtcCBiMzIgJHIxNSAwCiAJCWJyYSB6ICNpbml0X3Vua19uZXh0CiAJCQltb3YgJHIxNSAxCkBAIC0xNDYsMjMgKzEzNywyMSBAQAogCiAJLy8gc2V0IG1tY3R4IGJhc2UgYWRkcmVzc2VzIG5vdyBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGxhdGVyLAogCS8vIHRoZXkgZG9uJ3QgY3VycmVudGx5IGV2ZXIgY2hhbmdlCi0JbW92ICRyNCAweDcwMAotCXNobCBiMzIgJHI0IDYKIAlzaHIgYjMyICRyNSAkcjIgOAotCWlvd3IgSVskcjQgKyAweDAwMF0gJHI1CQkvLyBNTUNUWF9TQVZFX1NXQkFTRQotCWlvd3IgSVskcjQgKyAweDEwMF0gJHI1CQkvLyBNTUNUWF9MT0FEX1NXQkFTRQorCW52X2lvd3IoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfTU1DVFhfU0FWRV9TV0JBU0UsIDAsICRyNSkKKwludl9pb3dyKE5WX1BHUkFQSF9HUENYX0dQQ0NTX01NQ1RYX0xPQURfU1dCQVNFLCAwLCAkcjUpCiAKIAkvLyBjYWxjdWxhdGUgR1BDIG1taW8gY29udGV4dCBzaXplCiAJbGQgYjMyICRyMTQgRFskcjAgKyAjZ3BjX21taW9fbGlzdF9oZWFkXQogCWxkIGIzMiAkcjE1IERbJHIwICsgI2dwY19tbWlvX2xpc3RfdGFpbF0KLQljYWxsICNtbWN0eF9zaXplCisJY2FsbChtbWN0eF9zaXplKQogCWFkZCBiMzIgJHIyICRyMTUKIAlhZGQgYjMyICRyMyAkcjE1CiAKIAkvLyBjYWxjdWxhdGUgcGVyLVRQQyBtbWlvIGNvbnRleHQgc2l6ZQogCWxkIGIzMiAkcjE0IERbJHIwICsgI3RwY19tbWlvX2xpc3RfaGVhZF0KIAlsZCBiMzIgJHIxNSBEWyRyMCArICN0cGNfbW1pb19saXN0X3RhaWxdCi0JY2FsbCAjbW1jdHhfc2l6ZQorCWNhbGwobW1jdHhfc2l6ZSkKIAlsZCBiMzIgJHIxNCBEWyRyMCArICN0cGNfY291bnRdCiAJbXVsdSAkcjE0ICRyMTUKIAlhZGQgYjMyICRyMiAkcjE0CkBAIC0xNzIsNyArMTYxLDcgQEAKIAkvLyBjYWxjdWxhdGUgcGVyLVVOSyBtbWlvIGNvbnRleHQgc2l6ZQogCWxkIGIzMiAkcjE0IERbJHIwICsgI3Vua19tbWlvX2xpc3RfaGVhZF0KIAlsZCBiMzIgJHIxNSBEWyRyMCArICN1bmtfbW1pb19saXN0X3RhaWxdCi0JY2FsbCAjbW1jdHhfc2l6ZQorCWNhbGwobW1jdHhfc2l6ZSkKIAlsZCBiMzIgJHIxNCBEWyRyMCArICN1bmtfY291bnRdCiAJbXVsdSAkcjE0ICRyMTUKIAlhZGQgYjMyICRyMiAkcjE0CkBAIC0xODAsOSArMTY5LDggQEAKICNlbmRpZgogCiAJLy8gcm91bmQgdXAgYmFzZS9zaXplIHRvIDI1NiBieXRlIGJvdW5kYXJ5IChmb3Igc3RyYW5kIFNXQkFTRSkKLQlhZGQgYjMyICRyNCAweDEzMDAKIAlzaHIgYjMyICRyMyAyCi0JaW93ciBJWyRyNCArIDB4MDAwXSAkcjMJCS8vIE1NQ1RYX0xPQURfQ09VTlQsIHd0ZiBmb3I/IT8KKwludl9pb3dyKE5WX1BHUkFQSF9HUENYX0dQQ0NTX01NQ1RYX0xPQURfQ09VTlQsIDAsICRyMykgLy8gd3RmIGZvcj8hCiAJc2hyIGIzMiAkcjIgOAogCXNociBiMzIgJHIzIDYKIAlhZGQgYjMyICRyMiAxCkBAIC0xOTIsNyArMTgwLDcgQEAKIAogCS8vIGNhbGN1bGF0ZSBzaXplIG9mIHN0cmFuZCBjb250ZXh0IGRhdGEKIAltb3YgYjMyICRyMTUgJHIyCi0JY2FsbCAjc3RyYW5kX2N0eF9pbml0CisJY2FsbChzdHJhbmRfY3R4X2luaXQpCiAJYWRkIGIzMiAkcjMgJHIxNQogCiAJLy8gc2F2ZSBjb250ZXh0IHNpemUsIGFuZCB0ZWxsIEhVQiB3ZSdyZSBkb25lCkBAIC0yMDgsNyArMTk2LDcgQEAKIAlic2V0ICRmbGFncyAkcDAKIAlzbGVlcCAkcDAKIAltb3YgJHIxMyAjY21kX3F1ZXVlCi0JY2FsbCAjcXVldWVfZ2V0CisJY2FsbChxdWV1ZV9nZXQpCiAJYnJhICRwMSAjbWFpbgogCiAJLy8gMHgwMDAwLTB4MDAwMyBhcmUgYWxsIGNvbnRleHQgdHJhbnNmZXJzCkBAIC0yMjQsMTMgKzIxMiwxMyBAQAogCQlvciAkcjEgJHIxNAogCQltb3YgJGZsYWdzICRyMQogCQkvLyB0cmFuc2ZlciBjb250ZXh0IGRhdGEKLQkJY2FsbCAjY3R4X3hmZXIKKwkJY2FsbChjdHhfeGZlcikKIAkJYnJhICNtYWluCiAKIAltYWluX25vdF9jdHhfeGZlcjoKIAlzaGwgYjMyICRyMTUgJHIxNCAxNgogCW9yICRyMTUgRV9CQURfQ09NTUFORAotCWNhbGwgI2Vycm9yCisJY2FsbChlcnJvcikKIAlicmEgI21haW4KIAogLy8gaW50ZXJydXB0IGhhbmRsZXIKQEAgLTI0NywyMiArMjM1LDIwIEBACiAJY2xlYXIgYjMyICRyMAogCiAJLy8gaW5jb21pbmcgZmlmbyBjb21tYW5kPwotCWlvcmQgJHIxMCBJWyRyMCArIDB4MjAwXQkvLyBJTlRSCi0JYW5kICRyMTEgJHIxMCAweDAwMDAwMDA0CisJbnZfaW9yZCgkcjEwLCBOVl9QR1JBUEhfR1BDWF9HUENDU19JTlRSLCAwKQorCWFuZCAkcjExICRyMTAgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfSU5UUl9GSUZPCiAJYnJhIGUgI2loX25vX2ZpZm8KIAkJLy8gcXVldWUgaW5jb21pbmcgZmlmbyBjb21tYW5kIGZvciBsYXRlciBwcm9jZXNzaW5nCi0JCW1vdiAkcjExIDB4MTkwMAogCQltb3YgJHIxMyAjY21kX3F1ZXVlCi0JCWlvcmQgJHIxNCBJWyRyMTEgKyAweDEwMF0JLy8gRklGT19DTUQKLQkJaW9yZCAkcjE1IElbJHIxMSArIDB4MDAwXQkvLyBGSUZPX0RBVEEKLQkJY2FsbCAjcXVldWVfcHV0Ci0JCWFkZCBiMzIgJHIxMSAweDQwMAorCQludl9pb3JkKCRyMTQsIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fQ01ELCAwKQorCQludl9pb3JkKCRyMTUsIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fREFUQSwgMCkKKwkJY2FsbChxdWV1ZV9wdXQpCiAJCW1vdiAkcjE0IDEKLQkJaW93ciBJWyRyMTEgKyAweDAwMF0gJHIxNAkvLyBGSUZPX0FDSworCQludl9pb3dyKE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fQUNLLCAwLCAkcjE0KQogCiAJLy8gYWNrLCBhbmQgd2FrZSB1cCBtYWluKCkKIAlpaF9ub19maWZvOgotCWlvd3IgSVskcjAgKyAweDEwMF0gJHIxMAkvLyBJTlRSX0FDSworCW52X2lvd3IoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfSU5UUl9BQ0ssIDAsICRyMTApCiAKIAlwb3AgJHIxNQogCXBvcCAkcjE0CkBAIC0yODMsOSArMjY5LDcgQEAKIAltb3YgJHIxNSAxCiAJbGQgYjMyICRyMTQgRFskcjAgKyAjZ3BjX2lkXQogCXNobCBiMzIgJHIxNSAkcjE0Ci0JbW92ICRyMTQgLTB4NmJlOCAJLy8gMHg0MDk0MTggLSBIVUJfQkFSX1NFVAotCXNldGhpICRyMTQgMHg0MDAwMDAKLQljYWxsICNudl93cjMyCisJbnZfd3IzMigweDQwOTQxOCwgJHIxNSkJLy8gMHg0MDk0MTggLSBIVUJfQkFSX1NFVAogCXJldAogCiAvLyBEaXNhYmxlcyB2YXJpb3VzIHRoaW5ncywgd2FpdHMgYSBiaXQsIGFuZCByZS1lbmFibGVzIHRoZW0uLgpAQCAtMjk1LDE2ICsyNzksMTUgQEAKIC8vIGZ1bm55IHRoaW5ncyBoYXBwZW4uCiAvLwogY3R4X3JlZHN3aXRjaDoKLQltb3YgJHIxNCAweDYxNAotCXNobCBiMzIgJHIxNCA2Ci0JbW92ICRyMTUgMHgwMjAKLQlpb3dyIElbJHIxNF0gJHIxNQkvLyBHUENfUkVEX1NXSVRDSCA9IFBPV0VSCi0JbW92ICRyMTUgOAorCW1vdiAkcjE1IE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0hfUE9XRVIKKwludl9pb3dyKE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0gsIDAsICRyMTUpCisJbW92ICRyMTQgOAogCWN0eF9yZWRzd2l0Y2hfZGVsYXk6Ci0JCXN1YiBiMzIgJHIxNSAxCisJCXN1YiBiMzIgJHIxNCAxCiAJCWJyYSBuZSAjY3R4X3JlZHN3aXRjaF9kZWxheQotCW1vdiAkcjE1IDB4YTIwCi0JaW93ciBJWyRyMTRdICRyMTUJLy8gR1BDX1JFRF9TV0lUQ0ggPSBVTksxMSwgRU5BQkxFLCBQT1dFUgorCW9yICRyMTUgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfUkVEX1NXSVRDSF9VTksxMQorCW9yICRyMTUgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfUkVEX1NXSVRDSF9FTkFCTEUKKwludl9pb3dyKE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0gsIDAsICRyMTUpCiAJcmV0CiAKIC8vIFRyYW5zZmVyIEdQQyBjb250ZXh0IGRhdGEgYmV0d2VlbiBHUFUgYW5kIHN0b3JhZ2UgYXJlYQpAQCAtMzE3LDQ2ICszMDAsMzcgQEAKIC8vCiBjdHhfeGZlcjoKIAkvLyBzZXQgY29udGV4dCBiYXNlIGFkZHJlc3MKLQltb3YgJHIxIDB4YTA0Ci0Jc2hsIGIzMiAkcjEgNgotCWlvd3IgSVskcjEgKyAweDAwMF0gJHIxNS8vIE1FTV9CQVNFCisJbnZfaW93cihOVl9QR1JBUEhfR1BDWF9HUENDU19NRU1fQkFTRSwgMCwgJHIxNSkKIAlicmEgbm90ICRwMSAjY3R4X3hmZXJfbm90X2xvYWQKLQkJY2FsbCAjY3R4X3JlZHN3aXRjaAorCQljYWxsKGN0eF9yZWRzd2l0Y2gpCiAJY3R4X3hmZXJfbm90X2xvYWQ6CiAKIAkvLyBzdHJhbmRzCi0JbW92ICRyMSAweDRhZmMKLQlzZXRoaSAkcjEgMHgyMDAwMAotCW1vdiAkcjIgMHhjCi0JaW93ciBJWyRyMV0gJHIyCQkvLyBTVFJBTkRfQ01EKDB4M2YpID0gMHgwYwotCWNhbGwgI3N0cmFuZF93YWl0Ci0JbW92ICRyMiAweDQ3ZmMKLQlzZXRoaSAkcjIgMHgyMDAwMAotCWlvd3IgSVskcjJdICRyMAkJLy8gU1RSQU5EX0ZJUlNUX0dFTkUoMHgzZikgPSAweDAwCi0JeGJpdCAkcjIgJGZsYWdzICRwMQotCWFkZCBiMzIgJHIyIDMKLQlpb3dyIElbJHIxXSAkcjIJCS8vIFNUUkFORF9DTUQoMHgzZikgPSAweDAzLzB4MDQgKFNBVkUvTE9BRCkKKwljYWxsKHN0cmFuZF9wcmUpCisJY2xlYXIgYjMyICRyMgorCW52X2lvd3IoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfU1RSQU5EX1NFTEVDVCwgMHgzZiwgJHIyKQorCXhiaXQgJHIyICRmbGFncyAkcDEJLy8gU0FWRS9MT0FECisJYWRkIGIzMiAkcjIgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfU1RSQU5EX0NNRF9TQVZFCisJbnZfaW93cihOVl9QR1JBUEhfR1BDWF9HUENDU19TVFJBTkRfQ01ELCAweDNmLCAkcjIpCiAKIAkvLyBtbWlvIGNvbnRleHQKIAl4Yml0ICRyMTAgJGZsYWdzICRwMQkvLyBkaXJlY3Rpb24KIAlvciAkcjEwIDIJCS8vIGZpcnN0Ci0JbW92ICRyMTEgMHgwMDAwCi0Jc2V0aGkgJHIxMSAweDUwMDAwMAorCWltbTMyKCRyMTEsMHg1MDAwMDApCiAJbGQgYjMyICRyMTIgRFskcjAgKyAjZ3BjX2lkXQogCXNobCBiMzIgJHIxMiAxNQogCWFkZCBiMzIgJHIxMSAkcjEyCS8vIGJhc2UgPSBOVl9QR1JBUEhfR1BDbgogCWxkIGIzMiAkcjEyIERbJHIwICsgI2dwY19tbWlvX2xpc3RfaGVhZF0KIAlsZCBiMzIgJHIxMyBEWyRyMCArICNncGNfbW1pb19saXN0X3RhaWxdCiAJbW92ICRyMTQgMAkJLy8gbm90IG11bHRpCi0JY2FsbCAjbW1jdHhfeGZlcgorCWNhbGwobW1jdHhfeGZlcikKIAogCS8vIHBlci1UUEMgbW1pbyBjb250ZXh0CiAJeGJpdCAkcjEwICRmbGFncyAkcDEJLy8gZGlyZWN0aW9uCiAjaWYgIU5WX1BHUkFQSF9HUENYX1VOS19fU0laRQogCW9yICRyMTAgNAkJLy8gbGFzdAogI2VuZGlmCi0JbW92ICRyMTEgMHg0MDAwCi0Jc2V0aGkgJHIxMSAweDUwMDAwMAkvLyBiYXNlID0gTlZfUEdSQVBIX0dQQzBfVFBDMAorCWltbTMyKCRyMTEsIDB4NTA0MDAwKQogCWxkIGIzMiAkcjEyIERbJHIwICsgI2dwY19pZF0KIAlzaGwgYjMyICRyMTIgMTUKIAlhZGQgYjMyICRyMTEgJHIxMgkvLyBiYXNlID0gTlZfUEdSQVBIX0dQQ25fVFBDMApAQCAtMzY0LDE0ICszMzgsMTMgQEAKIAlsZCBiMzIgJHIxMyBEWyRyMCArICN0cGNfbW1pb19saXN0X3RhaWxdCiAJbGQgYjMyICRyMTUgRFskcjAgKyAjdHBjX21hc2tdCiAJbW92ICRyMTQgMHg4MDAJCS8vIHN0cmlkZSA9IDB4ODAwCi0JY2FsbCAjbW1jdHhfeGZlcgorCWNhbGwobW1jdHhfeGZlcikKIAogI2lmIE5WX1BHUkFQSF9HUENYX1VOS19fU0laRSA+IDAKIAkvLyBwZXItVU5LIG1taW8gY29udGV4dAogCXhiaXQgJHIxMCAkZmxhZ3MgJHAxCS8vIGRpcmVjdGlvbgogCW9yICRyMTAgNAkJLy8gbGFzdAotCW1vdiAkcjExIDB4MzAwMAotCXNldGhpICRyMTEgMHg1MDAwMDAJLy8gYmFzZSA9IE5WX1BHUkFQSF9HUEMwX1VOSzAKKwlpbW0zMigkcjExLCAweDUwMzAwMCkKIAlsZCBiMzIgJHIxMiBEWyRyMCArICNncGNfaWRdCiAJc2hsIGIzMiAkcjEyIDE1CiAJYWRkIGIzMiAkcjExICRyMTIJLy8gYmFzZSA9IE5WX1BHUkFQSF9HUENuX1VOSzAKQEAgLTM3OSwxMSArMzUyLDExIEBACiAJbGQgYjMyICRyMTMgRFskcjAgKyAjdW5rX21taW9fbGlzdF90YWlsXQogCWxkIGIzMiAkcjE1IERbJHIwICsgI3Vua19tYXNrXQogCW1vdiAkcjE0IDB4MjAwCQkvLyBzdHJpZGUgPSAweDIwMAotCWNhbGwgI21tY3R4X3hmZXIKKwljYWxsKG1tY3R4X3hmZXIpCiAjZW5kaWYKIAogCS8vIHdhaXQgZm9yIHN0cmFuZHMgdG8gZmluaXNoCi0JY2FsbCAjc3RyYW5kX3dhaXQKKwljYWxsKHN0cmFuZF93YWl0KQogCiAJLy8gaWYgbG9hZCwgb3IgYSBzYXZlIHdpdGhvdXQgYSBsb2FkIGZvbGxvd2luZywgZG8gc29tZQogCS8vIHVua25vd24gc3R1ZmYgdGhhdCdzIGRvbmUgYWZ0ZXIgZmluaXNoaW5nIGEgYmxvY2sgb2YKQEAgLTM5MSwxNCArMzY0LDEwIEBACiAJYnJhICRwMSAjY3R4X3hmZXJfcG9zdAogCWJyYSBub3QgJHAyICNjdHhfeGZlcl9kb25lCiAJY3R4X3hmZXJfcG9zdDoKLQkJbW92ICRyMSAweDRhZmMKLQkJc2V0aGkgJHIxIDB4MjAwMDAKLQkJbW92ICRyMiAweGQKLQkJaW93ciBJWyRyMV0gJHIyCQkvLyBTVFJBTkRfQ01EKDB4M2YpID0gMHgwZAotCQljYWxsICNzdHJhbmRfd2FpdAorCQljYWxsKHN0cmFuZF9wb3N0KQogCiAJLy8gbWFyayBjb21wbGV0aW9uIGluIEhVQidzIGJhcnJpZXIKIAljdHhfeGZlcl9kb25lOgotCWNhbGwgI2h1Yl9iYXJyaWVyX2RvbmUKKwljYWxsKGh1Yl9iYXJyaWVyX2RvbmUpCiAJcmV0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudjEwOC5mdWM1IGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2dwY252MTA4LmZ1YzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDI2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudjEwOC5mdWM1CkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzIDxic2tlZ2dzQHJlZGhhdC5jb20+CisgKi8KKworI2RlZmluZSBOVl9QR1JBUEhfR1BDWF9VTktfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIENISVBTRVQgR0syMDgKKyNpbmNsdWRlICJtYWNyb3MuZnVjIgorCisuc2VjdGlvbiAjbnYxMDhfZ3JncGNfZGF0YQorI2RlZmluZSBJTkNMVURFX0RBVEEKKyNpbmNsdWRlICJjb20uZnVjIgorI2luY2x1ZGUgImdwYy5mdWMiCisjdW5kZWYgSU5DTFVERV9EQVRBCisKKy5zZWN0aW9uICNudjEwOF9ncmdwY19jb2RlCisjZGVmaW5lIElOQ0xVREVfQ09ERQorYnJhICNpbml0CisjaW5jbHVkZSAiY29tLmZ1YyIKKyNpbmNsdWRlICJncGMuZnVjIgorLmFsaWduIDI1NgorI3VuZGVmIElOQ0xVREVfQ09ERQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2dwY252MTA4LmZ1YzUuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudjEwOC5mdWM1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkYzEyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudjEwOC5mdWM1LmgKQEAgLTAsMCArMSw0NzMgQEAKK3VpbnQzMl90IG52MTA4X2dyZ3BjX2RhdGFbXSA9IHsKKy8qIDB4MDAwMDogZ3BjX21taW9fbGlzdF9oZWFkICovCisJMHgwMDAwMDA2YywKKy8qIDB4MDAwNDogZ3BjX21taW9fbGlzdF90YWlsICovCisvKiAweDAwMDQ6IHRwY19tbWlvX2xpc3RfaGVhZCAqLworCTB4MDAwMDAwNmMsCisvKiAweDAwMDg6IHRwY19tbWlvX2xpc3RfdGFpbCAqLworLyogMHgwMDA4OiB1bmtfbW1pb19saXN0X2hlYWQgKi8KKwkweDAwMDAwMDZjLAorLyogMHgwMDBjOiB1bmtfbW1pb19saXN0X3RhaWwgKi8KKwkweDAwMDAwMDZjLAorLyogMHgwMDEwOiBncGNfaWQgKi8KKwkweDAwMDAwMDAwLAorLyogMHgwMDE0OiB0cGNfY291bnQgKi8KKwkweDAwMDAwMDAwLAorLyogMHgwMDE4OiB0cGNfbWFzayAqLworCTB4MDAwMDAwMDAsCisvKiAweDAwMWM6IHVua19jb3VudCAqLworCTB4MDAwMDAwMDAsCisvKiAweDAwMjA6IHVua19tYXNrICovCisJMHgwMDAwMDAwMCwKKy8qIDB4MDAyNDogY21kX3F1ZXVlICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCit1aW50MzJfdCBudjEwOF9ncmdwY19jb2RlW10gPSB7CisJMHgwMzE0MGVmNSwKKy8qIDB4MDAwNDogcXVldWVfcHV0ICovCisJMHg5ODAwZDg5OCwKKwkweDg2ZjAwMWQ5LAorCTB4ZjQ4OWE0MDgsCisJMHgwMjBmMGIxYiwKKwkweDAwMDJmODdlLAorLyogMHgwMDFhOiBxdWV1ZV9wdXRfbmV4dCAqLworCTB4OThjNDAwZjgsCisJMHgwMzg0YjYwNywKKwkweGI2MDA4ZGJiLAorCTB4OGViNTA4ODAsCisJMHgwMThmYjUwMCwKKwkweGYwMDE5MGI2LAorCTB4ZDliNTBmOTQsCisvKiAweDAwMzc6IHF1ZXVlX2dldCAqLworCTB4ZjQwMGY4MDEsCisJMHhkODk4MDEzMSwKKwkweDAxZDk5ODAwLAorCTB4MGJmNDg5YTQsCisJMHgwNzg5YzQyMSwKKwkweGJiMDM5NGI2LAorCTB4OTBiNjAwOWQsCisJMHgwMDllOTgwOCwKKwkweGI2MDE5Zjk4LAorCTB4ODRmMDAxODAsCisJMHgwMGQ4YjUwZiwKKy8qIDB4MDA2MzogcXVldWVfZ2V0X2RvbmUgKi8KKwkweGY4MDEzMmY0LAorLyogMHgwMDY1OiBudl9yZDMyICovCisJMHhmMGVjYjIwMCwKKwkweDAwODAxZmM5LAorCTB4MGNmNjAxY2EsCisvKiAweDAwNzM6IG52X3JkMzJfd2FpdCAqLworCTB4OGMwNGJkMDAsCisJMHhjZjAxY2EwMCwKKwkweGNjYzgwMGNjLAorCTB4ZjYxYmY0MWYsCisJMHhlYzdlMDYwYSwKKwkweDAwOGYwMDAwLAorCTB4ZmZjZjAxY2IsCisvKiAweDAwOGY6IG52X3dyMzIgKi8KKwkweDgwMDBmODAwLAorCTB4ZjYwMWNjMDAsCisJMHgwNGJkMDAwZiwKKwkweGM5ZjBlY2IyLAorCTB4MWVjOWYwMWYsCisJMHgwMWNhMDA4MCwKKwkweGJkMDAwY2Y2LAorLyogMHgwMGE5OiBudl93cjMyX3dhaXQgKi8KKwkweGNhMDA4YzA0LAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweDAwZjhmNjFiLAorLyogMHgwMGI4OiB3YWl0X2RvbmV6ICovCisJMHg5OWYwOTRiZCwKKwkweDM3MDA4MDAwLAorCTB4MDAwOWY2MDIsCisJMHgwMDgwMDRiZCwKKwkweDBhZjYwMjA2LAorLyogMHgwMGNmOiB3YWl0X2RvbmV6X25lICovCisJMHg4ODA0YmQwMCwKKwkweGNmMDEwMDAwLAorCTB4OGFmZjAwODgsCisJMHhmNjFiZjQ4OCwKKwkweDk5ZjA5NGJkLAorCTB4MTcwMDgwMDAsCisJMHgwMDA5ZjYwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMGVjOiB3YWl0X2RvbmVvICovCisJMHg5OWYwOTRiZCwKKwkweDM3MDA4MDAwLAorCTB4MDAwOWY2MDIsCisJMHgwMDgwMDRiZCwKKwkweDBhZjYwMjA2LAorLyogMHgwMTAzOiB3YWl0X2RvbmVvX2UgKi8KKwkweDg4MDRiZDAwLAorCTB4Y2YwMTAwMDAsCisJMHg4YWZmMDA4OCwKKwkweGY2MGJmNDg4LAorCTB4OTlmMDk0YmQsCisJMHgxNzAwODAwMCwKKwkweDAwMDlmNjAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxMjA6IG1tY3R4X3NpemUgKi8KKy8qIDB4MDEyMjogbnZfbW1jdHhfc2l6ZV9sb29wICovCisJMHhlODk4OTRiZCwKKwkweDFhODViNjAwLAorCTB4YjYwMTgwYjYsCisJMHg5OGJiMDI4NCwKKwkweDA0ZTBiNjAwLAorCTB4MWJmNGVmYTQsCisJMHhmODlmYjJlYywKKy8qIDB4MDEzZDogbW1jdHhfeGZlciAqLworCTB4ZjA5NGJkMDAsCisJMHgwMDgwMDE5OSwKKwkweDA5ZjYwMjM3LAorCTB4YmQwNGJkMDAsCisJMHgwNWJiZmQ5NCwKKwkweDgwMGYwYmY0LAorCTB4ZjYwMWM0MDAsCisJMHgwNGJkMDAwYiwKKy8qIDB4MDE1ZjogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLworCTB4ZmQwMDk5ZjAsCisJMHgwYmY0MDVlZSwKKwkweGM2MDA4MDE4LAorCTB4MDAwZWY2MDEsCisJMHgwMDgwMDRiZCwKKwkweDBmZjYwMWM3LAorCTB4ZjAwNGJkMDAsCisvKiAweDAxN2E6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCisJMHhhYmM4MDE5OSwKKwkweDEwYjRiNjAwLAorCTB4YzgwY2I5ZjAsCisJMHhlNGI2MDFhZSwKKwkweDA1YmVmZDExLAorCTB4MDFjNTAwODAsCisJMHhiZDAwMGJmNiwKKy8qIDB4MDE5NTogbW1jdHhfZXhlY19sb29wICovCisvKiAweDAxOTU6IG1tY3R4X3dhaXRfZnJlZSAqLworCTB4YzUwMDhlMDQsCisJMHgwMGVlY2YwMSwKKwkweGY0MWZlNGYwLAorCTB4Y2U5OGY2MGIsCisJMHgwNWU5ZmQwMCwKKwkweDAxYzgwMDgwLAorCTB4YmQwMDBlZjYsCisJMHgwNGMwYjYwNCwKKwkweDFiZjRjZGE0LAorCTB4MDJhYmM4ZGYsCisvKiAweDAxYmY6IG1tY3R4X2Zpbmlfd2FpdCAqLworCTB4OGIxYzFiZjQsCisJMHhjZjAxYzUwMCwKKwkweGI0ZjAwMGJiLAorCTB4MTBiNGIwMWYsCisJMHgwYWYzMWJmNCwKKwkweDAwYjg3ZTAyLAorCTB4MjUwZWY0MDAsCisvKiAweDAxZDg6IG1tY3R4X3N0b3AgKi8KKwkweGI2MDBhYmM4LAorCTB4YjlmMDEwYjQsCisJMHgxMmI5ZjAwYywKKwkweDAxYzUwMDgwLAorCTB4YmQwMDBiZjYsCisvKiAweDAxZWQ6IG1tY3R4X3N0b3Bfd2FpdCAqLworCTB4YzUwMDhiMDQsCisJMHgwMGJiY2YwMSwKKwkweGY0MTJiYmM4LAorLyogMHgwMWZhOiBtbWN0eF9kb25lICovCisJMHg5NGJkZjYxYiwKKwkweDgwMDE5OWYwLAorCTB4ZjYwMjE3MDAsCisJMHgwNGJkMDAwOSwKKy8qIDB4MDIwYTogc3RyYW5kX3dhaXQgKi8KKwkweGEwZjkwMGY4LAorCTB4Yjg3ZTAyMGEsCisJMHhhMGZjMDAwMCwKKy8qIDB4MDIxNjogc3RyYW5kX3ByZSAqLworCTB4MGMwOTAwZjgsCisJMHgwMjRhZmM4MCwKKwkweGJkMDAwOWY2LAorCTB4MDIwYTdlMDQsCisvKiAweDAyMjc6IHN0cmFuZF9wb3N0ICovCisJMHgwOTAwZjgwMCwKKwkweDRhZmM4MDBkLAorCTB4MDAwOWY2MDIsCisJMHgwYTdlMDRiZCwKKwkweDAwZjgwMDAyLAorLyogMHgwMjM4OiBzdHJhbmRfc2V0ICovCisJMHhmYzgwMGYwYywKKwkweDBjZjYwMjRmLAorCTB4MGMwNGJkMDAsCisJMHg0YWZjODAwYiwKKwkweDAwMGNmNjAyLAorCTB4ZmM4MDA0YmQsCisJMHgwZWY2MDI0ZiwKKwkweDBjMDRiZDAwLAorCTB4NGFmYzgwMGEsCisJMHgwMDBjZjYwMiwKKwkweDBhN2UwNGJkLAorCTB4MDBmODAwMDIsCisvKiAweDAyNjg6IHN0cmFuZF9jdHhfaW5pdCAqLworCTB4OTlmMDk0YmQsCisJMHgzNzAwODAwMywKKwkweDAwMDlmNjAyLAorCTB4MTY3ZTA0YmQsCisJMHgwMzBlMDAwMiwKKwkweDAwMDIzODdlLAorCTB4ZmM4MGM0YmQsCisJMHgwY2Y2MDI0NywKKwkweDBjMDRiZDAwLAorCTB4NGFmYzgwMDEsCisJMHgwMDBjZjYwMiwKKwkweDBhN2UwNGJkLAorCTB4MGM5MjAwMDIsCisJMHg0NmZjODAwMSwKKwkweDAwMGNmNjAyLAorCTB4MDIwYzA0YmQsCisJMHgwMjRhZmM4MCwKKwkweGJkMDAwY2Y2LAorCTB4MDIwYTdlMDQsCisJMHgwMjI3N2UwMCwKKwkweDQyMDA4ODAwLAorCTB4MjAwMDg5MDIsCisJMHgwMDk5Y2YwMiwKKy8qIDB4MDJjNzogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KKwkweGY2MDhmZTk1LAorCTB4OGVmNjAwOGUsCisJMHg4MDhhY2Y0MCwKKwkweGI2MDZhNWI2LAorCTB4ZWFiYjAxYTAsCisJMHgwNDgwYjYwMCwKKwkweGY0MDE5MmI2LAorCTB4ZTRiNmU4MWIsCisJMHhmMmVmYmMwOCwKKwkweDk5ZjA5NGJkLAorCTB4MTcwMDgwMDMsCisJMHgwMDA5ZjYwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMmY4OiBlcnJvciAqLworCTB4ZmZiMmUwZjksCisJMHg0MDk4MTQ4ZSwKKwkweDAwMDA4ZjdlLAorCTB4ZmZiMjAxMGYsCisJMHg0MDljMWM4ZSwKKwkweDAwMDA4ZjdlLAorCTB4MDBmOGUwZmMsCisvKiAweDAzMTQ6IGluaXQgKi8KKwkweDA0ZmUwNGJkLAorCTB4NDAwMjAyMDAsCisJMHgwMmY2MTIwMCwKKwkweDQxMDRiZDAwLAorCTB4MTBmZTA0NjUsCisJMHgwNzAwNDAwMCwKKwkweGJkMDAwMGY2LAorCTB4NDAwNDAyMDQsCisJMHgwMmY2MDQwMCwKKwkweGY0MDRiZDAwLAorCTB4MDA4MjEwMzEsCisJMHgyMmNmMDE4MiwKKwkweGYwMDEwMzAwLAorCTB4MzJiYjFmMjQsCisJMHgwMTMyYjYwNCwKKwkweGI1MDUwMmI1LAorCTB4MDA4MjA2MDMsCisJMHgyMmNmMDE4NiwKKwkweDA0MDJiNTAwLAorCTB4NTAwYzMwOGUsCisJMHgzNGJkMjRiZCwKKy8qIDB4MDM2YTogaW5pdF91bmtfbG9vcCAqLworCTB4NjU3ZTQ0YmQsCisJMHhmNmIwMDAwMCwKKwkweDBlMGJmNDAwLAorCTB4ZjJiYjAxMGYsCisJMHgwNTRmZmQwNCwKKy8qIDB4MDM3ZjogaW5pdF91bmtfbmV4dCAqLworCTB4YjYwMTMwYjYsCisJMHhlMGI2MDEyMCwKKwkweDAxMjZiMDA0LAorLyogMHgwMzhiOiBpbml0X3Vua19kb25lICovCisJMHhiNWUyMWJmNCwKKwkweDA0YjUwNzAzLAorCTB4MDEwMDgyMDgsCisJMHgwMDIyY2YwMiwKKwkweDI1OTUzNGJkLAorCTB4YzAwMDgwMDgsCisJMHgwMDA1ZjYwMSwKKwkweDAwODAwNGJkLAorCTB4MDVmNjAxYzEsCisJMHg5ODA0YmQwMCwKKwkweDBmOTgwMDBlLAorCTB4MDEyMDdlMDEsCisJMHgwMDJmYmIwMCwKKwkweDk4MDAzZmJiLAorCTB4MGY5ODAxMGUsCisJMHgwMTIwN2UwMiwKKwkweDA1MGU5ODAwLAorCTB4YmIwMGVmZmQsCisJMHgzZWJiMDAyZSwKKwkweDAyMGU5ODAwLAorCTB4N2UwMzBmOTgsCisJMHg5ODAwMDEyMCwKKwkweGVmZmQwNzBlLAorCTB4MDAyZWJiMDAsCisJMHhiNjAwM2ViYiwKKwkweDAwODAwMjM1LAorCTB4MDNmNjAxZDMsCisJMHhiNjA0YmQwMCwKKwkweDM1YjYwODI1LAorCTB4MDEyMGI2MDYsCisJMHhiNjAxMzBiNiwKKwkweDM0YjYwODI0LAorCTB4N2UyZmIyMDgsCisJMHhiYjAwMDI2OCwKKwkweDAwODAwMDNmLAorCTB4MDNmNjAyMDEsCisJMHhiZDA0YmQwMCwKKwkweDFmMjlmMDI0LAorCTB4MDIzMDAwODAsCisJMHhiZDAwMDJmNiwKKy8qIDB4MDQyOTogbWFpbiAqLworCTB4MDAzMWY0MDQsCisJMHgwZDAwMjhmNCwKKwkweDAwMzc3ZTI0LAorCTB4ZjQwMWY0MDAsCisJMHhmNDA0ZTRiMCwKKwkweDgxZmUxZDE4LAorCTB4YmQwNjAyMDEsCisJMHgwNDEyZmQyMCwKKwkweGZkMDFlNGI2LAorCTB4MThmZTA1MWUsCisJMHgwNGZjN2UwMCwKKwkweGQ0MGVmNDAwLAorLyogMHgwNDU4OiBtYWluX25vdF9jdHhfeGZlciAqLworCTB4ZjAxMGVmOTQsCisJMHhmODdlMDFmNSwKKwkweDBlZjQwMDAyLAorLyogMHgwNDY1OiBpaCAqLworCTB4ZmU4MGY5YzcsCisJMHg4MGY5MDE4OCwKKwkweGEwZjk5MGY5LAorCTB4ZDBmOWIwZjksCisJMHhmMGY5ZTBmOSwKKwkweDAwNGEwNGJkLAorCTB4MDBhYWNmMDIsCisJMHhmNDA0YWJjNCwKKwkweDI0MGQxZjBiLAorCTB4Y2YxYTAwNGUsCisJMHgwMDRmMDBlZSwKKwkweDAwZmZjZjE5LAorCTB4MDAwMDA0N2UsCisJMHgwMDQwMDEwZSwKKwkweDAwMGVmNjFkLAorLyogMHgwNGEyOiBpaF9ub19maWZvICovCisJMHgwMDQwMDRiZCwKKwkweDAwMGFmNjAxLAorCTB4ZjBmYzA0YmQsCisJMHhkMGZjZTBmYywKKwkweGEwZmNiMGZjLAorCTB4ODBmYzkwZmMsCisJMHhmYzAwODhmZSwKKwkweDAwMzJmNDgwLAorLyogMHgwNGMyOiBodWJfYmFycmllcl9kb25lICovCisJMHgwMTBmMDFmOCwKKwkweGJiMDQwZTk4LAorCTB4ZmZiMjA0ZmUsCisJMHg0MDk0MTg4ZSwKKwkweDAwMDA4ZjdlLAorLyogMHgwNGQ2OiBjdHhfcmVkc3dpdGNoICovCisJMHgyMDBmMDBmOCwKKwkweDAxODUwMDgwLAorCTB4YmQwMDBmZjYsCisvKiAweDA0ZTM6IGN0eF9yZWRzd2l0Y2hfZGVsYXkgKi8KKwkweGI2MDgwZTA0LAorCTB4MWJmNDAxZTIsCisJMHgwMGY1ZjFmZCwKKwkweDAwZjVmMTA4LAorCTB4ODUwMDgwMDIsCisJMHgwMDBmZjYwMSwKKwkweDAwZjgwNGJkLAorLyogMHgwNGZjOiBjdHhfeGZlciAqLworCTB4MDI4MTAwODAsCisJMHhiZDAwMGZmNiwKKwkweDA3MTFmNDA0LAorCTB4MDAwNGQ2N2UsCisvKiAweDA1MGM6IGN0eF94ZmVyX25vdF9sb2FkICovCisJMHgwMDAyMTY3ZSwKKwkweGZjODAyNGJkLAorCTB4MDJmNjAyNDcsCisJMHhmMDA0YmQwMCwKKwkweDIwYjYwMTJjLAorCTB4NGFmYzgwMDMsCisJMHgwMDAyZjYwMiwKKwkweGFjZjAwNGJkLAorCTB4MDJhNWYwMDEsCisJMHg1MDAwMDA4YiwKKwkweGI2MDQwYzk4LAorCTB4YmNiYjBmYzQsCisJMHgwMDBjOTgwMCwKKwkweDBlMDEwZDk4LAorCTB4MDEzZDdlMDAsCisJMHgwMWFjZjAwMCwKKwkweDUwNDAwMDhiLAorCTB4YjYwNDBjOTgsCisJMHhiY2JiMGZjNCwKKwkweDAxMGM5ODAwLAorCTB4OTgwMjBkOTgsCisJMHgwMDRlMDYwZiwKKwkweDAxM2Q3ZTA4LAorCTB4MDFhY2YwMDAsCisJMHg4YjA0YTVmMCwKKwkweDk4NTAzMDAwLAorCTB4YzRiNjA0MGMsCisJMHgwMGJjYmIwZiwKKwkweDk4MDIwYzk4LAorCTB4MGY5ODAzMGQsCisJMHgwMjAwNGUwOCwKKwkweDAwMDEzZDdlLAorCTB4MDAwMjBhN2UsCisJMHhmNDA2MDFmNCwKKy8qIDB4MDU5NjogY3R4X3hmZXJfcG9zdCAqLworCTB4Mjc3ZTA3MTIsCisvKiAweDA1OWE6IGN0eF94ZmVyX2RvbmUgKi8KKwkweGMyN2UwMDAyLAorCTB4MDBmODAwMDQsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2dwY252YzAuZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZjMC5mdWMuaAppbmRleCBmMmIwZGVhLi4wZTdiMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZjMC5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZjMC5mdWMuaApAQCAtMzcsMTQgKzM3LDE0IEBACiB9OwogCiB1aW50MzJfdCBudmMwX2dyZ3BjX2NvZGVbXSA9IHsKLQkweDAzMTgwZWY1LAorCTB4MDNhMTBlZjUsCiAvKiAweDAwMDQ6IHF1ZXVlX3B1dCAqLwogCTB4OTgwMGQ4OTgsCiAJMHg4NmYwMDFkOSwKIAkweDA0ODliODA4LAogCTB4ZjAwYzFiZjQsCiAJMHgyMWY1MDJmNywKLQkweDAwZjgwMmZlLAorCTB4MDBmODAzN2UsCiAvKiAweDAwMWM6IHF1ZXVlX3B1dF9uZXh0ICovCiAJMHhiNjA3OThjNCwKIAkweDhkYmIwMzg0LApAQCAtNjgsMTg0ICs2OCwyMTQgQEAKIC8qIDB4MDA2NjogcXVldWVfZ2V0X2RvbmUgKi8KIAkweDAwZjgwMTMyLAogLyogMHgwMDY4OiBudl9yZDMyICovCi0JMHgwNzI4YjdmMSwKLQkweGI5MDZiNGI2LAotCTB4YzlmMDAyZWMsCi0JMHgwMGJjZDAxZiwKLS8qIDB4MDA3ODogbnZfcmQzMl93YWl0ICovCi0JMHhjODAwYmNjZiwKLQkweDFiZjQxZmNjLAotCTB4MDZhN2YwZmEsCi0JMHgwMTA5MjFmNSwKLQkweGY4NDBiZmNmLAotLyogMHgwMDhkOiBudl93cjMyICovCi0JMHgyOGI3ZjEwMCwKLQkweDA2YjRiNjA3LAotCTB4Yjk4MGJmZDAsCi0JMHhjOWYwMDJlYywKLQkweDFlYzlmMDFmLAotLyogMHgwMGEzOiBudl93cjMyX3dhaXQgKi8KLQkweGNmMDBiY2QwLAotCTB4Y2NjODAwYmMsCi0JMHhmYTFiZjQxZiwKLS8qIDB4MDBhZTogd2F0Y2hkb2dfcmVzZXQgKi8KLQkweDg3ZjEwMGY4LAotCTB4ODRiNjA0MzAsCi0JMHgxZmY5ZjAwNiwKLQkweGY4MDA4ZmQwLAotLyogMHgwMGJkOiB3YXRjaGRvZ19jbGVhciAqLwotCTB4MzA4N2YxMDAsCi0JMHgwNjg0YjYwNCwKLQkweGY4MDA4MGQwLAotLyogMHgwMGM5OiB3YWl0X2RvbmV6ICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDA3ZjEwNGJkLAotCTB4MDNmMDA2MDAsCi0JMHgwMDBhZDAwMiwKLS8qIDB4MDBlNjogd2FpdF9kb25lel9uZSAqLwotCTB4ODdmMTA0YmQsCi0JMHg4M2YwMDAwMCwKLQkweDAwODhjZjAxLAotCTB4ZjQ4ODhhZmYsCi0JMHg5NGJkZjMxYiwKLQkweGYxMDA5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMTA5OiB3YWl0X2RvbmVvICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDg3ZjEwNGJkLAotCTB4ODRiNjA4MTgsCi0JMHgwMDhhZDAwNiwKLS8qIDB4MDEyNDogd2FpdF9kb25lb19lICovCi0JMHgwNDAwODdmMSwKLQkweGNmMDY4NGI2LAotCTB4OGFmZjAwODgsCi0JMHhmMzBiZjQ4OCwKKwkweGYwMDJlY2I5LAorCTB4MDdmMTFmYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMDdhOiBudl9yZDMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4YTdmMGYzMWIsCisJMHgxMDIxZjUwNiwKKwkweDAwZjdmMTAxLAorCTB4MDFmM2YwY2IsCisJMHhmODAwZmZjZiwKKy8qIDB4MDA5ZDogbnZfd3IzMiAqLworCTB4MDAwN2YxMDAsCisJMHgwMTAzZjBjYywKKwkweGJkMDAwZmQwLAorCTB4MDJlY2I5MDQsCisJMHhmMDFmYzlmMCwKKwkweDA3ZjExZWM5LAorCTB4MDNmMGNhMDAsCisJMHgwMDBjZDAwMSwKKy8qIDB4MDBiZTogbnZfd3IzMl93YWl0ICovCisJMHhjN2YxMDRiZCwKKwkweGMzZjBjYTAwLAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweDAwZjhmMzFiLAorLyogMHgwMGQwOiB3YWl0X2RvbmV6ICovCiAJMHg5OWYwOTRiZCwKIAkweDAwMDdmMTAwLAotCTB4MDIwM2YwMTcsCisJMHgwMjAzZjAwZiwKIAkweGJkMDAwOWQwLAotLyogMHgwMTQ3OiBtbWN0eF9zaXplICovCi0JMHhiZDAwZjgwNCwKLS8qIDB4MDE0OTogbnZfbW1jdHhfc2l6ZV9sb29wICovCi0JMHgwMGU4OTg5NCwKLQkweGI2MWE4NWI2LAotCTB4ODRiNjAxODAsCi0JMHgwMDk4YmIwMiwKLQkweGI4MDRlMGI2LAotCTB4MWJmNDA0ZWYsCi0JMHgwMjlmYjllYiwKLS8qIDB4MDE2NjogbW1jdHhfeGZlciAqLwotCTB4OTRiZDAwZjgsCi0JMHhmMTAxOTlmMCwKLQkweGYwMGYwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmMTA0YmQwMCwKLQkweGI2MDcxMDg3LAotCTB4OTRiZDA2ODQsCi0JMHhmNDA1YmJmZCwKLQkweDhiZDAwOTBiLAotCTB4MDA5OWYwMDAsCi0vKiAweDAxOGM6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KLQkweGY0MDVlZWZkLAotCTB4OGVkMDBjMGIsCi0JMHhjMDhmZDA4MCwKLS8qIDB4MDE5YjogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KLQkweGI3MDE5OWYwLAotCTB4YzgwMTAwODAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAwZWQ6IHdhaXRfZG9uZXpfbmUgKi8KKwkweDAwODdmMTA0LAorCTB4MDE4M2YwMDAsCisJMHhmZjAwODhjZiwKKwkweDFiZjQ4ODhhLAorCTB4ZjA5NGJkZjMsCisJMHgwN2YxMDA5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDExMDogd2FpdF9kb25lbyAqLworCTB4OTlmMDk0YmQsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDBmLAorCTB4YmQwMDA5ZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAxMmQ6IHdhaXRfZG9uZW9fZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MGJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTUwOiBtbWN0eF9zaXplICovCisvKiAweDAxNTI6IG52X21tY3R4X3NpemVfbG9vcCAqLworCTB4ZTg5ODk0YmQsCisJMHgxYTg1YjYwMCwKKwkweGI2MDE4MGI2LAorCTB4OThiYjAyODQsCisJMHgwNGUwYjYwMCwKKwkweGY0MDRlZmI4LAorCTB4OWZiOWViMWIsCisvKiAweDAxNmY6IG1tY3R4X3hmZXIgKi8KKwkweGJkMDBmODAyLAorCTB4MDE5OWYwOTQsCisJMHgwZjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHhiYmZkOTRiZCwKKwkweDEyMGJmNDA1LAorCTB4YzQwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBiLAorLyogMHgwMTk3OiBtbWN0eF9iYXNlX2Rpc2FibGVkICovCisJMHhmZDAwOTlmMCwKKwkweDBiZjQwNWVlLAorCTB4MDAwN2YxMWUsCisJMHgwMTAzZjBjNiwKKwkweGJkMDAwZWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMTAzZjBjNywKKwkweGJkMDAwZmQwLAorCTB4MDE5OWYwMDQsCisvKiAweDAxYjg6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCisJMHhiNjAwYWJjOCwKKwkweGI5ZjAxMGI0LAorCTB4MDFhZWM4MGMsCisJMHhmZDExZTRiNiwKKwkweDA3ZjEwNWJlLAorCTB4MDNmMGM1MDAsCisJMHgwMDBiZDAwMSwKKy8qIDB4MDFkNjogbW1jdHhfZXhlY19sb29wICovCisvKiAweDAxZDY6IG1tY3R4X3dhaXRfZnJlZSAqLworCTB4ZTdmMTA0YmQsCisJMHhlM2YwYzUwMCwKKwkweDAwZWVjZjAxLAorCTB4ZjQxZmU0ZjAsCisJMHhjZTk4ZjMwYiwKKwkweDA1ZTlmZDAwLAorCTB4YzgwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBlLAorCTB4YjgwNGMwYjYsCisJMHgxYmY0MDRjZCwKKwkweDAyYWJjOGQ4LAorLyogMHgwMjA3OiBtbWN0eF9maW5pX3dhaXQgKi8KKwkweGYxMWYxYmY0LAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDFmYjRmMDAwLAorCTB4ZjQxMGI0YjAsCisJMHhhN2YwZjAxYiwKKwkweGQwMjFmNDAyLAorLyogMHgwMjIzOiBtbWN0eF9zdG9wICovCisJMHhjODJiMGVmNCwKIAkweGI0YjYwMGFiLAogCTB4MGNiOWYwMTAsCi0JMHhiNjAxYWVjOCwKLQkweGJlZmQxMWU0LAotCTB4MDA4YmQwMDUsCi0vKiAweDAxYjQ6IG1tY3R4X2V4ZWNfbG9vcCAqLwotLyogMHgwMWI0OiBtbWN0eF93YWl0X2ZyZWUgKi8KLQkweGYwMDA4ZWNmLAotCTB4MGJmNDFmZTQsCi0JMHgwMGNlOThmYSwKLQkweGQwMDVlOWZkLAotCTB4YzBiNmMwOGUsCi0JMHgwNGNkYjgwNCwKLQkweGM4ZTgxYmY0LAotCTB4MWJmNDAyYWIsCi0vKiAweDAxZDU6IG1tY3R4X2Zpbmlfd2FpdCAqLwotCTB4MDA4YmNmMTgsCi0JMHhiMDFmYjRmMCwKLQkweDFiZjQxMGI0LAotCTB4MDJhN2YwZjcsCi0JMHhmNGM5MjFmNCwKLS8qIDB4MDFlYTogbW1jdHhfc3RvcCAqLwotCTB4YWJjODFiMGUsCi0JMHgxMGI0YjYwMCwKLQkweGYwMGNiOWYwLAotCTB4OGJkMDEyYjksCi0vKiAweDAxZjk6IG1tY3R4X3N0b3Bfd2FpdCAqLwotCTB4MDA4YmNmMDAsCi0JMHhmNDEyYmJjOCwKLS8qIDB4MDIwMjogbW1jdHhfZG9uZSAqLwotCTB4OTRiZGZhMWIsCi0JMHhmMTAxOTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDIxNTogc3RyYW5kX3dhaXQgKi8KLQkweGYwYTBmOTAwLAotCTB4MjFmNDAyYTcsCi0JMHhmOGEwZmNjOSwKLS8qIDB4MDIyMTogc3RyYW5kX3ByZSAqLwotCTB4ZmM4N2YxMDAsCi0JMHgwMjgzZjA0YSwKLQkweGQwMGM5N2YwLAotCTB4MjFmNTAwODksCi0JMHgwMGY4MDIxNSwKLS8qIDB4MDIzNDogc3RyYW5kX3Bvc3QgKi8KLQkweDRhZmM4N2YxLAotCTB4ZjAwMjgzZjAsCi0JMHg4OWQwMGQ5NywKLQkweDE1MjFmNTAwLAotLyogMHgwMjQ3OiBzdHJhbmRfc2V0ICovCi0JMHhmMTAwZjgwMiwKLQkweGYwNGZmY2E3LAotCTB4YWJhMjAyYTMsCi0JMHhjN2YwMDUwMCwKLQkweDAwYWNkMDBmLAotCTB4ZDAwYmM3ZjAsCi0JMHgyMWY1MDBiYywKLQkweGFlZDAwMjE1LAotCTB4MGFjN2YwMDAsCi0JMHhmNTAwYmNkMCwKLQkweGY4MDIxNTIxLAotLyogMHgwMjcxOiBzdHJhbmRfY3R4X2luaXQgKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAzOTksCi0JMHgwM2YwMGYwMCwKKwkweGYxMTJiOWYwLAorCTB4ZjBjNTAwMDcsCisJMHgwYmQwMDEwMywKKy8qIDB4MDIzYjogbW1jdHhfc3RvcF93YWl0ICovCisJMHhmMTA0YmQwMCwKKwkweGYwYzUwMGI3LAorCTB4YmJjZjAxYjMsCisJMHgxMmJiYzgwMCwKKy8qIDB4MDI0YjogbW1jdHhfZG9uZSAqLworCTB4YmRmMzFiZjQsCisJMHgwMTk5ZjA5NCwKKwkweDE3MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKy8qIDB4MDI1ZTogc3RyYW5kX3dhaXQgKi8KKwkweGEwZjkwMGY4LAorCTB4ZjQwMmE3ZjAsCisJMHhhMGZjZDAyMSwKKy8qIDB4MDI2YTogc3RyYW5kX3ByZSAqLworCTB4OTdmMDAwZjgsCisJMHhmYzA3ZjEwYywKKwkweDAyMDNmMDRhLAorCTB4YmQwMDA5ZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDI3Zjogc3RyYW5kX3Bvc3QgKi8KKwkweGYwMDBmODAyLAorCTB4MDdmMTBkOTcsCisJMHgwM2YwNGFmYywKIAkweDAwMDlkMDAyLAogCTB4MjFmNTA0YmQsCi0JMHhlN2YwMDIyMSwKLQkweDQ3MjFmNTAzLAotCTB4ZmNhN2YxMDIsCi0JMHgwMmEzZjA0NiwKLQkweDA0MDBhYmEwLAotCTB4ZjA0MGEwZDAsCi0JMHhiY2QwMDFjNywKLQkweDE1MjFmNTAwLAotCTB4MDEwYzkyMDIsCi0JMHhmMDAwYWNkMCwKLQkweGJjZDAwMmM3LAotCTB4MTUyMWY1MDAsCi0JMHgzNDIxZjUwMiwKLQkweDgwODdmMTAyLAotCTB4MDY4NGI2MDgsCi0JMHhiNzAwODljZiwKLQkweDk1MjIwMDgwLAotLyogMHgwMmNhOiBjdHhfaW5pdF9zdHJhbmRfbG9vcCAqLworCTB4MDBmODAyNWUsCisvKiAweDAyOTQ6IHN0cmFuZF9zZXQgKi8KKwkweGYxMGZjN2YwLAorCTB4ZjA0ZmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTBiYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwNGZmYywKKwkweDAwMGVkMDAyLAorCTB4YzdmMDA0YmQsCisJMHhmYzA3ZjEwYSwKKwkweDAyMDNmMDRhLAorCTB4YmQwMDBjZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDJkMzogc3RyYW5kX2N0eF9pbml0ICovCisJMHhiZDAwZjgwMiwKKwkweDAzOTlmMDk0LAorCTB4MGYwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorCTB4MDI2YTIxZjUsCisJMHhmNTAzZTdmMCwKKwkweGJkMDI5NDIxLAorCTB4ZmMwN2YxYzQsCisJMHgwMjAzZjA0NywKKwkweGJkMDAwY2QwLAorCTB4MDFjN2YwMDQsCisJMHg0YWZjMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMGMsCisJMHgwMjVlMjFmNSwKKwkweGYxMDEwYzkyLAorCTB4ZjA0NmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTAyYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MjFmNTA0YmQsCisJMHgyMWY1MDI1ZSwKKwkweDg3ZjEwMjdmLAorCTB4ODNmMDQyMDAsCisJMHgwMDk3ZjEwMiwKKwkweDAyOTNmMDIwLAorCTB4OTUwMDk5Y2YsCisvKiAweDAzNGE6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCiAJMHg4ZWQwMDhmZSwKIAkweDQwOGVkMDAwLAogCTB4YjY4MDhhY2YsCkBAIC0yNTksMTY3ICsyODksMTk5IEBACiAJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0vKiAweDAyZmU6IGVycm9yICovCisvKiAweDAzN2U6IGVycm9yICovCiAJMHhlMGY5MDBmOCwKLQkweDk4MTRlN2YxLAotCTB4ZjQ0MGUzZjAsCi0JMHhlMGI3OGQyMSwKLQkweGY3ZjAwNDFjLAotCTB4OGQyMWY0MDEsCi0JMHgwMGY4ZTBmYywKLS8qIDB4MDMxODogaW5pdCAqLwotCTB4MDRmZTA0YmQsCi0JMHgwMDE3ZjEwMCwKLQkweDAyMjdmMDEyLAotCTB4ZjEwMDEyZDAsCi0JMHhmZTA0MjYxNywKLQkweDE3ZjEwMDEwLAotCTB4MTBkMDA0MDAsCi0JMHgwNDI3ZjBjMCwKLQkweGY0MDAxMmQwLAotCTB4MTdmMTEwMzEsCi0JMHgxNGI2MDYwOCwKLQkweDAwMTJjZjA2LAorCTB4ZjEwMmZmYjksCisJMHhmMDk4MTRlNywKKwkweDIxZjQ0MGUzLAorCTB4MDFmN2YwOWQsCisJMHhmMTAyZmZiOSwKKwkweGYwOWMxY2U3LAorCTB4MjFmNDQwZTMsCisJMHhmOGUwZmM5ZCwKKy8qIDB4MDNhMTogaW5pdCAqLworCTB4ZmUwNGJkMDAsCisJMHgyN2YwMDAwNCwKKwkweDAwMDdmMTAyLAorCTB4MDAwM2YwMTIsCisJMHhiZDAwMDJkMCwKKwkweGQ1MTdmMTA0LAorCTB4MDAxMGZlMDQsCisJMHgwNzAwMDdmMSwKKwkweGQwMDAwM2YwLAorCTB4MDRiZDAwMDAsCisJMHhmMTA0MjdmMCwKKwkweGYwMDQwMDA3LAorCTB4MDJkMDAwMDMsCisJMHhmNDA0YmQwMCwKKwkweDI3ZjExMDMxLAorCTB4MjNmMDgyMDAsCisJMHgwMDIyY2YwMSwKIAkweGYwMDEzN2YwLAogCTB4MzJiYjFmMjQsCiAJMHgwMTMyYjYwNCwKIAkweDgwMDUwMjgwLAotCTB4MTBiNzA2MDMsCi0JMHgxMmNmMDQwMCwKLQkweDA0MDI4MDAwLAotCTB4MDEwMDI3ZjEsCi0JMHhjZjAyMjNmMCwKLQkweDM0YmQwMDIyLAotCTB4MDcwMDQ3ZjEsCi0JMHg5NTA2NDRiNiwKLQkweDQ1ZDAwODI1LAotCTB4NDA0NWQwMDAsCi0JMHg5ODAwMGU5OCwKLQkweDIxZjUwMTBmLAotCTB4MmZiYjAxNDcsCi0JMHgwMDNmYmIwMCwKLQkweDk4MDEwZTk4LAotCTB4MjFmNTAyMGYsCi0JMHgwZTk4MDE0NywKLQkweDAwZWZmZDA1LAotCTB4YmIwMDJlYmIsCi0JMHg0MGI3MDAzZSwKLQkweDM1YjYxMzAwLAotCTB4MDA0M2QwMDIsCi0JMHhiNjA4MjViNiwKLQkweDIwYjYwNjM1LAotCTB4MDEzMGI2MDEsCi0JMHhiNjA4MjRiNiwKLQkweDJmYjkwODM0LAotCTB4NzEyMWY1MDIsCi0JMHgwMDNmYmIwMiwKLQkweDAxMDAwN2YxLAorCTB4MjdmMTA2MDMsCisJMHgyM2YwODYwMCwKKwkweDAwMjJjZjAxLAorCTB4ZjEwNDAyODAsCisJMHhmMDAxMDAyNywKKwkweDIyY2YwMjIzLAorCTB4OTUzNGJkMDAsCisJMHgwN2YxMDgyNSwKKwkweDAzZjBjMDAwLAorCTB4MDAwNWQwMDEsCisJMHgwN2YxMDRiZCwKKwkweDAzZjBjMTAwLAorCTB4MDAwNWQwMDEsCisJMHgwZTk4MDRiZCwKKwkweDAxMGY5ODAwLAorCTB4MDE1MDIxZjUsCisJMHhiYjAwMmZiYiwKKwkweDBlOTgwMDNmLAorCTB4MDIwZjk4MDEsCisJMHgwMTUwMjFmNSwKKwkweGZkMDUwZTk4LAorCTB4MmViYjAwZWYsCisJMHgwMDNlYmIwMCwKKwkweGYxMDIzNWI2LAorCTB4ZjBkMzAwMDcsCisJMHgwM2QwMDEwMywKKwkweGI2MDRiZDAwLAorCTB4MzViNjA4MjUsCisJMHgwMTIwYjYwNiwKKwkweGI2MDEzMGI2LAorCTB4MzRiNjA4MjQsCisJMHgwMjJmYjkwOCwKKwkweDAyZDMyMWY1LAorCTB4ZjEwMDNmYmIsCisJMHhmMDAxMDAwNywKKwkweDAzZDAwMjAzLAorCTB4YmQwNGJkMDAsCisJMHgxZjI5ZjAyNCwKKwkweDA4MDAwN2YxLAogCTB4ZDAwMjAzZjAsCi0JMHgwNGJkMDAwMywKLQkweDI5ZjAyNGJkLAotCTB4MDAwN2YxMWYsCi0JMHgwMjAzZjAwOCwKLQkweGJkMDAwMmQwLAotLyogMHgwM2U5OiBtYWluICovCi0JMHgwMDMxZjQwNCwKLQkweGYwMDAyOGY0LAotCTB4MjFmNDFjZDcsCi0JMHhmNDAxZjQzOSwKLQkweGY0MDRlNGIwLAotCTB4ODFmZTFlMTgsCi0JMHgwNjI3ZjAwMSwKLQkweDEyZmQyMGJkLAotCTB4MDFlNGI2MDQsCi0JMHhmZTA1MWVmZCwKLQkweDIxZjUwMDE4LAotCTB4MGVmNDA0YWQsCi0vKiAweDA0MTk6IG1haW5fbm90X2N0eF94ZmVyICovCi0JMHgxMGVmOTRkMywKLQkweGY1MDFmNWYwLAotCTB4ZjQwMmZlMjEsCi0vKiAweDA0MjY6IGloICovCi0JMHg4MGY5YzYwZSwKLQkweGY5MDE4OGZlLAotCTB4Zjk5MGY5ODAsCi0JMHhmOWIwZjlhMCwKLQkweGY5ZTBmOWQwLAotCTB4Y2YwNGJkZjAsCi0JMHhhYmM0ODAwYSwKLQkweDFkMGJmNDA0LAotCTB4MTkwMGI3ZjEsCi0JMHhjZjFjZDdmMCwKLQkweGJmY2Y0MGJlLAorCTB4MDRiZDAwMDIsCisvKiAweDA0OTg6IG1haW4gKi8KKwkweGY0MDAzMWY0LAorCTB4ZDdmMDAwMjgsCisJMHgzOTIxZjQxYywKKwkweGIwZjQwMWY0LAorCTB4MThmNDA0ZTQsCisJMHgwMTgxZmUxZSwKKwkweGJkMDYyN2YwLAorCTB4MDQxMmZkMjAsCisJMHhmZDAxZTRiNiwKKwkweDE4ZmUwNTFlLAorCTB4OGQyMWY1MDAsCisJMHhkMzBlZjQwNSwKKy8qIDB4MDRjODogbWFpbl9ub3RfY3R4X3hmZXIgKi8KKwkweGYwMTBlZjk0LAorCTB4MjFmNTAxZjUsCisJMHgwZWY0MDM3ZSwKKy8qIDB4MDRkNTogaWggKi8KKwkweGZlODBmOWM2LAorCTB4ODBmOTAxODgsCisJMHhhMGY5OTBmOSwKKwkweGQwZjliMGY5LAorCTB4ZjBmOWUwZjksCisJMHhhN2YxMDRiZCwKKwkweGEzZjAwMjAwLAorCTB4MDBhYWNmMDAsCisJMHhmNDA0YWJjNCwKKwkweGQ3ZjAyYzBiLAorCTB4MDBlN2YxMWMsCisJMHgwMGUzZjAxYSwKKwkweGYxMDBlZWNmLAorCTB4ZjAxOTAwZjcsCisJMHhmZmNmMDBmMywKIAkweDA0MjFmNDAwLAotCTB4MDQwMGIwYjcsCi0JMHhkMDAxZTdmMCwKLS8qIDB4MDQ1ZTogaWhfbm9fZmlmbyAqLwotCTB4MGFkMDAwYmUsCi0JMHhmY2YwZmM0MCwKLQkweGZjZDBmY2UwLAotCTB4ZmNhMGZjYjAsCi0JMHhmZTgwZmM5MCwKLQkweDgwZmMwMDg4LAotCTB4ZjgwMDMyZjQsCi0vKiAweDA0Nzk6IGh1Yl9iYXJyaWVyX2RvbmUgKi8KLQkweDAxZjdmMDAxLAotCTB4YmIwNDBlOTgsCi0JMHhlN2YxMDRmZSwKLQkweGUzZjA5NDE4LAotCTB4OGQyMWY0NDAsCi0vKiAweDA0OGU6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweGU3ZjEwMGY4LAotCTB4ZTRiNjA2MTQsCi0JMHgyMGY3ZjAwNiwKLQkweGYwMDBlZmQwLAotLyogMHgwNDllOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHhmMmI2MDhmNywKLQkweGZkMWJmNDAxLAotCTB4MGEyMGY3ZjEsCi0JMHhmODAwZWZkMCwKLS8qIDB4MDRhZDogY3R4X3hmZXIgKi8KLQkweDA0MTdmMTAwLAotCTB4MDYxNGI2MGEsCi0JMHhmNDAwMWZkMCwKLQkweDIxZjUwNzExLAotLyogMHgwNGJlOiBjdHhfeGZlcl9ub3RfbG9hZCAqLwotCTB4MTdmMTA0OGUsCi0JMHgxM2YwNGFmYywKLQkweDBjMjdmMDAyLAotCTB4ZjUwMDEyZDAsCi0JMHhmMTAyMTUyMSwKLQkweGYwNDdmYzI3LAotCTB4MjBkMDAyMjMsCi0JMHgwMTJjZjAwMCwKLQkweGQwMDMyMGI2LAotCTB4YWNmMDAwMTIsCi0JMHgwMmE1ZjAwMSwKLQkweGYwMDBiN2YwLAotCTB4MGM5ODUwYjMsCi0JMHgwZmM0YjYwNCwKLQkweDk4MDBiY2JiLAotCTB4MGQ5ODAwMGMsCi0JMHgwMGU3ZjAwMSwKLQkweDAxNjYyMWY1LAorCTB4ZjEwMWU3ZjAsCisJMHhmMDFkMDAwNywKKwkweDBlZDAwMDAzLAorLyogMHgwNTIzOiBpaF9ub19maWZvICovCisJMHhmMTA0YmQwMCwKKwkweGYwMDEwMDA3LAorCTB4MGFkMDAwMDMsCisJMHhmYzA0YmQwMCwKKwkweGZjZTBmY2YwLAorCTB4ZmNiMGZjZDAsCisJMHhmYzkwZmNhMCwKKwkweDAwODhmZTgwLAorCTB4MzJmNDgwZmMsCisvKiAweDA1NDc6IGh1Yl9iYXJyaWVyX2RvbmUgKi8KKwkweGYwMDFmODAwLAorCTB4MGU5ODAxZjcsCisJMHgwNGZlYmIwNCwKKwkweGYxMDJmZmI5LAorCTB4ZjA5NDE4ZTcsCisJMHgyMWY0NDBlMywKKy8qIDB4MDU1ZjogY3R4X3JlZHN3aXRjaCAqLworCTB4ZjAwMGY4OWQsCisJMHgwN2YxMjBmNywKKwkweDAzZjA4NTAwLAorCTB4MDAwZmQwMDEsCisJMHhlN2YwMDRiZCwKKy8qIDB4MDU3MTogY3R4X3JlZHN3aXRjaF9kZWxheSAqLworCTB4MDFlMmI2MDgsCisJMHhmMWZkMWJmNCwKKwkweGYxMDgwMGY1LAorCTB4ZjEwMjAwZjUsCisJMHhmMDg1MDAwNywKKwkweDBmZDAwMTAzLAorCTB4ZjgwNGJkMDAsCisvKiAweDA1OGQ6IGN0eF94ZmVyICovCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDgxLAorCTB4YmQwMDBmZDAsCisJMHgwNzExZjQwNCwKKwkweDA1NWYyMWY1LAorLyogMHgwNWEwOiBjdHhfeGZlcl9ub3RfbG9hZCAqLworCTB4MDI2YTIxZjUsCisJMHgwN2YxMjRiZCwKKwkweDAzZjA0N2ZjLAorCTB4MDAwMmQwMDIsCisJMHgyY2YwMDRiZCwKKwkweDAzMjBiNjAxLAorCTB4NGFmYzA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDAyLAogCTB4ZjAwMWFjZjAsCi0JMHhiN2YxMDRhNSwKLQkweGIzZjA0MDAwLAorCTB4YjdmMTAyYTUsCisJMHhiM2YwMDAwMCwKIAkweDA0MGM5ODUwLAogCTB4YmIwZmM0YjYsCiAJMHgwYzk4MDBiYywKLQkweDAyMGQ5ODAxLAotCTB4ZjEwNjBmOTgsCi0JMHhmNTA4MDBlNywKLQkweGY1MDE2NjIxLAotCTB4ZjQwMjE1MjEsCi0JMHgxMmY0MDYwMSwKLS8qIDB4MDUzNTogY3R4X3hmZXJfcG9zdCAqLwotCTB4ZmMxN2YxMTQsCi0JMHgwMjEzZjA0YSwKLQkweGQwMGQyN2YwLAotCTB4MjFmNTAwMTIsCi0vKiAweDA1NDY6IGN0eF94ZmVyX2RvbmUgKi8KLQkweDIxZjUwMjE1LAotCTB4MDBmODA0NzksCisJMHgwMTBkOTgwMCwKKwkweGY1MDBlN2YwLAorCTB4ZjAwMTZmMjEsCisJMHhhNWYwMDFhYywKKwkweDAwYjdmMTA0LAorCTB4NTBiM2YwNDAsCisJMHhiNjA0MGM5OCwKKwkweGJjYmIwZmM0LAorCTB4MDEwYzk4MDAsCisJMHg5ODAyMGQ5OCwKKwkweGU3ZjEwNjBmLAorCTB4MjFmNTA4MDAsCisJMHgyMWY1MDE2ZiwKKwkweDAxZjQwMjVlLAorCTB4MDcxMmY0MDYsCisvKiAweDA2MTg6IGN0eF94ZmVyX3Bvc3QgKi8KKwkweDAyN2YyMWY1LAorLyogMHgwNjFjOiBjdHhfeGZlcl9kb25lICovCisJMHgwNTQ3MjFmNSwKKwkweDAwMDAwMGY4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZkNy5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmQ3LmZ1Yy5oCmluZGV4IGRkMzQ2YzIuLjg0ZGQzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmQ3LmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmQ3LmZ1Yy5oCkBAIC00MSwxNCArNDEsMTQgQEAKIH07CiAKIHVpbnQzMl90IG52ZDdfZ3JncGNfY29kZVtdID0gewotCTB4MDMxODBlZjUsCisJMHgwM2ExMGVmNSwKIC8qIDB4MDAwNDogcXVldWVfcHV0ICovCiAJMHg5ODAwZDg5OCwKIAkweDg2ZjAwMWQ5LAogCTB4MDQ4OWI4MDgsCiAJMHhmMDBjMWJmNCwKIAkweDIxZjUwMmY3LAotCTB4MDBmODAyZmUsCisJMHgwMGY4MDM3ZSwKIC8qIDB4MDAxYzogcXVldWVfcHV0X25leHQgKi8KIAkweGI2MDc5OGM0LAogCTB4OGRiYjAzODQsCkBAIC03MiwxODQgKzcyLDIxNCBAQAogLyogMHgwMDY2OiBxdWV1ZV9nZXRfZG9uZSAqLwogCTB4MDBmODAxMzIsCiAvKiAweDAwNjg6IG52X3JkMzIgKi8KLQkweDA3MjhiN2YxLAotCTB4YjkwNmI0YjYsCi0JMHhjOWYwMDJlYywKLQkweDAwYmNkMDFmLAotLyogMHgwMDc4OiBudl9yZDMyX3dhaXQgKi8KLQkweGM4MDBiY2NmLAotCTB4MWJmNDFmY2MsCi0JMHgwNmE3ZjBmYSwKLQkweDAxMDkyMWY1LAotCTB4Zjg0MGJmY2YsCi0vKiAweDAwOGQ6IG52X3dyMzIgKi8KLQkweDI4YjdmMTAwLAotCTB4MDZiNGI2MDcsCi0JMHhiOTgwYmZkMCwKLQkweGM5ZjAwMmVjLAotCTB4MWVjOWYwMWYsCi0vKiAweDAwYTM6IG52X3dyMzJfd2FpdCAqLwotCTB4Y2YwMGJjZDAsCi0JMHhjY2M4MDBiYywKLQkweGZhMWJmNDFmLAotLyogMHgwMGFlOiB3YXRjaGRvZ19yZXNldCAqLwotCTB4ODdmMTAwZjgsCi0JMHg4NGI2MDQzMCwKLQkweDFmZjlmMDA2LAotCTB4ZjgwMDhmZDAsCi0vKiAweDAwYmQ6IHdhdGNoZG9nX2NsZWFyICovCi0JMHgzMDg3ZjEwMCwKLQkweDA2ODRiNjA0LAotCTB4ZjgwMDgwZDAsCi0vKiAweDAwYzk6IHdhaXRfZG9uZXogKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMGYwMCwKLQkweDAwMDlkMDAyLAotCTB4MDdmMTA0YmQsCi0JMHgwM2YwMDYwMCwKLQkweDAwMGFkMDAyLAotLyogMHgwMGU2OiB3YWl0X2RvbmV6X25lICovCi0JMHg4N2YxMDRiZCwKLQkweDgzZjAwMDAwLAotCTB4MDA4OGNmMDEsCi0JMHhmNDg4OGFmZiwKLQkweDk0YmRmMzFiLAotCTB4ZjEwMDk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDAxMDk6IHdhaXRfZG9uZW8gKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMGYwMCwKLQkweDAwMDlkMDAyLAotCTB4ODdmMTA0YmQsCi0JMHg4NGI2MDgxOCwKLQkweDAwOGFkMDA2LAotLyogMHgwMTI0OiB3YWl0X2RvbmVvX2UgKi8KLQkweDA0MDA4N2YxLAotCTB4Y2YwNjg0YjYsCi0JMHg4YWZmMDA4OCwKLQkweGYzMGJmNDg4LAorCTB4ZjAwMmVjYjksCisJMHgwN2YxMWZjOSwKKwkweDAzZjBjYTAwLAorCTB4MDAwY2QwMDEsCisvKiAweDAwN2E6IG52X3JkMzJfd2FpdCAqLworCTB4YzdmMTA0YmQsCisJMHhjM2YwY2EwMCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHhhN2YwZjMxYiwKKwkweDEwMjFmNTA2LAorCTB4MDBmN2YxMDEsCisJMHgwMWYzZjBjYiwKKwkweGY4MDBmZmNmLAorLyogMHgwMDlkOiBudl93cjMyICovCisJMHgwMDA3ZjEwMCwKKwkweDAxMDNmMGNjLAorCTB4YmQwMDBmZDAsCisJMHgwMmVjYjkwNCwKKwkweGYwMWZjOWYwLAorCTB4MDdmMTFlYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMGJlOiBudl93cjMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4MDBmOGYzMWIsCisvKiAweDAwZDA6IHdhaXRfZG9uZXogKi8KIAkweDk5ZjA5NGJkLAogCTB4MDAwN2YxMDAsCi0JMHgwMjAzZjAxNywKKwkweDAyMDNmMDBmLAogCTB4YmQwMDA5ZDAsCi0vKiAweDAxNDc6IG1tY3R4X3NpemUgKi8KLQkweGJkMDBmODA0LAotLyogMHgwMTQ5OiBudl9tbWN0eF9zaXplX2xvb3AgKi8KLQkweDAwZTg5ODk0LAotCTB4YjYxYTg1YjYsCi0JMHg4NGI2MDE4MCwKLQkweDAwOThiYjAyLAotCTB4YjgwNGUwYjYsCi0JMHgxYmY0MDRlZiwKLQkweDAyOWZiOWViLAotLyogMHgwMTY2OiBtbWN0eF94ZmVyICovCi0JMHg5NGJkMDBmOCwKLQkweGYxMDE5OWYwLAotCTB4ZjAwZjAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGYxMDRiZDAwLAotCTB4YjYwNzEwODcsCi0JMHg5NGJkMDY4NCwKLQkweGY0MDViYmZkLAotCTB4OGJkMDA5MGIsCi0JMHgwMDk5ZjAwMCwKLS8qIDB4MDE4YzogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLwotCTB4ZjQwNWVlZmQsCi0JMHg4ZWQwMGMwYiwKLQkweGMwOGZkMDgwLAotLyogMHgwMTliOiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLwotCTB4YjcwMTk5ZjAsCi0JMHhjODAxMDA4MCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDBlZDogd2FpdF9kb25lel9uZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MWJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTEwOiB3YWl0X2RvbmVvICovCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTAwLAorCTB4MDIwM2YwMGYsCisJMHhiZDAwMDlkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDEyZDogd2FpdF9kb25lb19lICovCisJMHgwMDg3ZjEwNCwKKwkweDAxODNmMDAwLAorCTB4ZmYwMDg4Y2YsCisJMHgwYmY0ODg4YSwKKwkweGYwOTRiZGYzLAorCTB4MDdmMTAwOTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxNTA6IG1tY3R4X3NpemUgKi8KKy8qIDB4MDE1MjogbnZfbW1jdHhfc2l6ZV9sb29wICovCisJMHhlODk4OTRiZCwKKwkweDFhODViNjAwLAorCTB4YjYwMTgwYjYsCisJMHg5OGJiMDI4NCwKKwkweDA0ZTBiNjAwLAorCTB4ZjQwNGVmYjgsCisJMHg5ZmI5ZWIxYiwKKy8qIDB4MDE2ZjogbW1jdHhfeGZlciAqLworCTB4YmQwMGY4MDIsCisJMHgwMTk5ZjA5NCwKKwkweDBmMDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKwkweGJiZmQ5NGJkLAorCTB4MTIwYmY0MDUsCisJMHhjNDAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGIsCisvKiAweDAxOTc6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KKwkweGZkMDA5OWYwLAorCTB4MGJmNDA1ZWUsCisJMHgwMDA3ZjExZSwKKwkweDAxMDNmMGM2LAorCTB4YmQwMDBlZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAxMDNmMGM3LAorCTB4YmQwMDBmZDAsCisJMHgwMTk5ZjAwNCwKKy8qIDB4MDFiODogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KKwkweGI2MDBhYmM4LAorCTB4YjlmMDEwYjQsCisJMHgwMWFlYzgwYywKKwkweGZkMTFlNGI2LAorCTB4MDdmMTA1YmUsCisJMHgwM2YwYzUwMCwKKwkweDAwMGJkMDAxLAorLyogMHgwMWQ2OiBtbWN0eF9leGVjX2xvb3AgKi8KKy8qIDB4MDFkNjogbW1jdHhfd2FpdF9mcmVlICovCisJMHhlN2YxMDRiZCwKKwkweGUzZjBjNTAwLAorCTB4MDBlZWNmMDEsCisJMHhmNDFmZTRmMCwKKwkweGNlOThmMzBiLAorCTB4MDVlOWZkMDAsCisJMHhjODAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGUsCisJMHhiODA0YzBiNiwKKwkweDFiZjQwNGNkLAorCTB4MDJhYmM4ZDgsCisvKiAweDAyMDc6IG1tY3R4X2Zpbmlfd2FpdCAqLworCTB4ZjExZjFiZjQsCisJMHhmMGM1MDBiNywKKwkweGJiY2YwMWIzLAorCTB4MWZiNGYwMDAsCisJMHhmNDEwYjRiMCwKKwkweGE3ZjBmMDFiLAorCTB4ZDAyMWY0MDIsCisvKiAweDAyMjM6IG1tY3R4X3N0b3AgKi8KKwkweGM4MmIwZWY0LAogCTB4YjRiNjAwYWIsCiAJMHgwY2I5ZjAxMCwKLQkweGI2MDFhZWM4LAotCTB4YmVmZDExZTQsCi0JMHgwMDhiZDAwNSwKLS8qIDB4MDFiNDogbW1jdHhfZXhlY19sb29wICovCi0vKiAweDAxYjQ6IG1tY3R4X3dhaXRfZnJlZSAqLwotCTB4ZjAwMDhlY2YsCi0JMHgwYmY0MWZlNCwKLQkweDAwY2U5OGZhLAotCTB4ZDAwNWU5ZmQsCi0JMHhjMGI2YzA4ZSwKLQkweDA0Y2RiODA0LAotCTB4YzhlODFiZjQsCi0JMHgxYmY0MDJhYiwKLS8qIDB4MDFkNTogbW1jdHhfZmluaV93YWl0ICovCi0JMHgwMDhiY2YxOCwKLQkweGIwMWZiNGYwLAotCTB4MWJmNDEwYjQsCi0JMHgwMmE3ZjBmNywKLQkweGY0YzkyMWY0LAotLyogMHgwMWVhOiBtbWN0eF9zdG9wICovCi0JMHhhYmM4MWIwZSwKLQkweDEwYjRiNjAwLAotCTB4ZjAwY2I5ZjAsCi0JMHg4YmQwMTJiOSwKLS8qIDB4MDFmOTogbW1jdHhfc3RvcF93YWl0ICovCi0JMHgwMDhiY2YwMCwKLQkweGY0MTJiYmM4LAotLyogMHgwMjAyOiBtbWN0eF9kb25lICovCi0JMHg5NGJkZmExYiwKLQkweGYxMDE5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMjE1OiBzdHJhbmRfd2FpdCAqLwotCTB4ZjBhMGY5MDAsCi0JMHgyMWY0MDJhNywKLQkweGY4YTBmY2M5LAotLyogMHgwMjIxOiBzdHJhbmRfcHJlICovCi0JMHhmYzg3ZjEwMCwKLQkweDAyODNmMDRhLAotCTB4ZDAwYzk3ZjAsCi0JMHgyMWY1MDA4OSwKLQkweDAwZjgwMjE1LAotLyogMHgwMjM0OiBzdHJhbmRfcG9zdCAqLwotCTB4NGFmYzg3ZjEsCi0JMHhmMDAyODNmMCwKLQkweDg5ZDAwZDk3LAotCTB4MTUyMWY1MDAsCi0vKiAweDAyNDc6IHN0cmFuZF9zZXQgKi8KLQkweGYxMDBmODAyLAotCTB4ZjA0ZmZjYTcsCi0JMHhhYmEyMDJhMywKLQkweGM3ZjAwNTAwLAotCTB4MDBhY2QwMGYsCi0JMHhkMDBiYzdmMCwKLQkweDIxZjUwMGJjLAotCTB4YWVkMDAyMTUsCi0JMHgwYWM3ZjAwMCwKLQkweGY1MDBiY2QwLAotCTB4ZjgwMjE1MjEsCi0vKiAweDAyNzE6IHN0cmFuZF9jdHhfaW5pdCAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDM5OSwKLQkweDAzZjAwZjAwLAorCTB4ZjExMmI5ZjAsCisJMHhmMGM1MDAwNywKKwkweDBiZDAwMTAzLAorLyogMHgwMjNiOiBtbWN0eF9zdG9wX3dhaXQgKi8KKwkweGYxMDRiZDAwLAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDEyYmJjODAwLAorLyogMHgwMjRiOiBtbWN0eF9kb25lICovCisJMHhiZGYzMWJmNCwKKwkweDAxOTlmMDk0LAorCTB4MTcwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorLyogMHgwMjVlOiBzdHJhbmRfd2FpdCAqLworCTB4YTBmOTAwZjgsCisJMHhmNDAyYTdmMCwKKwkweGEwZmNkMDIxLAorLyogMHgwMjZhOiBzdHJhbmRfcHJlICovCisJMHg5N2YwMDBmOCwKKwkweGZjMDdmMTBjLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMDlkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMjdmOiBzdHJhbmRfcG9zdCAqLworCTB4ZjAwMGY4MDIsCisJMHgwN2YxMGQ5NywKKwkweDAzZjA0YWZjLAogCTB4MDAwOWQwMDIsCiAJMHgyMWY1MDRiZCwKLQkweGU3ZjAwMjIxLAotCTB4NDcyMWY1MDMsCi0JMHhmY2E3ZjEwMiwKLQkweDAyYTNmMDQ2LAotCTB4MDQwMGFiYTAsCi0JMHhmMDQwYTBkMCwKLQkweGJjZDAwMWM3LAotCTB4MTUyMWY1MDAsCi0JMHgwMTBjOTIwMiwKLQkweGYwMDBhY2QwLAotCTB4YmNkMDAyYzcsCi0JMHgxNTIxZjUwMCwKLQkweDM0MjFmNTAyLAotCTB4ODA4N2YxMDIsCi0JMHgwNjg0YjYwOCwKLQkweGI3MDA4OWNmLAotCTB4OTUyMjAwODAsCi0vKiAweDAyY2E6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCisJMHgwMGY4MDI1ZSwKKy8qIDB4MDI5NDogc3RyYW5kX3NldCAqLworCTB4ZjEwZmM3ZjAsCisJMHhmMDRmZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMGJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgwN2YxMDRiZCwKKwkweDAzZjA0ZmZjLAorCTB4MDAwZWQwMDIsCisJMHhjN2YwMDRiZCwKKwkweGZjMDdmMTBhLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMGNkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMmQzOiBzdHJhbmRfY3R4X2luaXQgKi8KKwkweGJkMDBmODAyLAorCTB4MDM5OWYwOTQsCisJMHgwZjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHgwMjZhMjFmNSwKKwkweGY1MDNlN2YwLAorCTB4YmQwMjk0MjEsCisJMHhmYzA3ZjFjNCwKKwkweDAyMDNmMDQ3LAorCTB4YmQwMDBjZDAsCisJMHgwMWM3ZjAwNCwKKwkweDRhZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwYywKKwkweDAyNWUyMWY1LAorCTB4ZjEwMTBjOTIsCisJMHhmMDQ2ZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMDJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgyMWY1MDRiZCwKKwkweDIxZjUwMjVlLAorCTB4ODdmMTAyN2YsCisJMHg4M2YwNDIwMCwKKwkweDAwOTdmMTAyLAorCTB4MDI5M2YwMjAsCisJMHg5NTAwOTljZiwKKy8qIDB4MDM0YTogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KIAkweDhlZDAwOGZlLAogCTB4NDA4ZWQwMDAsCiAJMHhiNjgwOGFjZiwKQEAgLTI2MywxOTggKzI5MywyMzAgQEAKIAkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLS8qIDB4MDJmZTogZXJyb3IgKi8KKy8qIDB4MDM3ZTogZXJyb3IgKi8KIAkweGUwZjkwMGY4LAotCTB4OTgxNGU3ZjEsCi0JMHhmNDQwZTNmMCwKLQkweGUwYjc4ZDIxLAotCTB4ZjdmMDA0MWMsCi0JMHg4ZDIxZjQwMSwKLQkweDAwZjhlMGZjLAotLyogMHgwMzE4OiBpbml0ICovCi0JMHgwNGZlMDRiZCwKLQkweDAwMTdmMTAwLAotCTB4MDIyN2YwMTIsCi0JMHhmMTAwMTJkMCwKLQkweGZlMDQ3MDE3LAotCTB4MTdmMTAwMTAsCi0JMHgxMGQwMDQwMCwKLQkweDA0MjdmMGMwLAotCTB4ZjQwMDEyZDAsCi0JMHgxN2YxMTAzMSwKLQkweDE0YjYwNjA4LAotCTB4MDAxMmNmMDYsCisJMHhmMTAyZmZiOSwKKwkweGYwOTgxNGU3LAorCTB4MjFmNDQwZTMsCisJMHgwMWY3ZjA5ZCwKKwkweGYxMDJmZmI5LAorCTB4ZjA5YzFjZTcsCisJMHgyMWY0NDBlMywKKwkweGY4ZTBmYzlkLAorLyogMHgwM2ExOiBpbml0ICovCisJMHhmZTA0YmQwMCwKKwkweDI3ZjAwMDA0LAorCTB4MDAwN2YxMDIsCisJMHgwMDAzZjAxMiwKKwkweGJkMDAwMmQwLAorCTB4MWYxN2YxMDQsCisJMHgwMDEwZmUwNSwKKwkweDA3MDAwN2YxLAorCTB4ZDAwMDAzZjAsCisJMHgwNGJkMDAwMCwKKwkweGYxMDQyN2YwLAorCTB4ZjAwNDAwMDcsCisJMHgwMmQwMDAwMywKKwkweGY0MDRiZDAwLAorCTB4MjdmMTEwMzEsCisJMHgyM2YwODIwMCwKKwkweDAwMjJjZjAxLAogCTB4ZjAwMTM3ZjAsCiAJMHgzMmJiMWYyNCwKIAkweDAxMzJiNjA0LAogCTB4ODAwNTAyODAsCi0JMHgxMGI3MDYwMywKLQkweDEyY2YwNDAwLAotCTB4MDQwMjgwMDAsCi0JMHgwYzMwZTdmMSwKLQkweGJkNTBlM2YwLAotCTB4YmQzNGJkMjQsCi0vKiAweDAzNzE6IGluaXRfdW5rX2xvb3AgKi8KLQkweDY4MjFmNDQ0LAotCTB4ZjQwMGY2YjAsCi0JMHhmN2YwMGYwYiwKLQkweDA0ZjJiYjAxLAotCTB4YjYwNTRmZmQsCi0vKiAweDAzODY6IGluaXRfdW5rX25leHQgKi8KLQkweDIwYjYwMTMwLAotCTB4MDRlMGI2MDEsCi0JMHhmNDAxMjZiMCwKLS8qIDB4MDM5MjogaW5pdF91bmtfZG9uZSAqLwotCTB4MDM4MGUyMWIsCi0JMHgwODA0ODAwNywKLQkweDAxMDAyN2YxLAotCTB4Y2YwMjIzZjAsCi0JMHgzNGJkMDAyMiwKLQkweDA3MDA0N2YxLAotCTB4OTUwNjQ0YjYsCi0JMHg0NWQwMDgyNSwKLQkweDQwNDVkMDAwLAotCTB4OTgwMDBlOTgsCi0JMHgyMWY1MDEwZiwKLQkweDJmYmIwMTQ3LAotCTB4MDAzZmJiMDAsCi0JMHg5ODAxMGU5OCwKLQkweDIxZjUwMjBmLAotCTB4MGU5ODAxNDcsCi0JMHgwMGVmZmQwNSwKLQkweGJiMDAyZWJiLAotCTB4MGU5ODAwM2UsCi0JMHgwMzBmOTgwMiwKLQkweDAxNDcyMWY1LAotCTB4ZmQwNzBlOTgsCisJMHgyN2YxMDYwMywKKwkweDIzZjA4NjAwLAorCTB4MDAyMmNmMDEsCisJMHhmMTA0MDI4MCwKKwkweGYwMGMzMGU3LAorCTB4MjRiZDUwZTMsCisJMHg0NGJkMzRiZCwKKy8qIDB4MDQxMDogaW5pdF91bmtfbG9vcCAqLworCTB4YjA2ODIxZjQsCisJMHgwYmY0MDBmNiwKKwkweDAxZjdmMDBmLAorCTB4ZmQwNGYyYmIsCisJMHgzMGI2MDU0ZiwKKy8qIDB4MDQyNTogaW5pdF91bmtfbmV4dCAqLworCTB4MDEyMGI2MDEsCisJMHhiMDA0ZTBiNiwKKwkweDFiZjQwMTI2LAorLyogMHgwNDMxOiBpbml0X3Vua19kb25lICovCisJMHgwNzAzODBlMiwKKwkweGYxMDgwNDgwLAorCTB4ZjAwMTAwMjcsCisJMHgyMmNmMDIyMywKKwkweDk1MzRiZDAwLAorCTB4MDdmMTA4MjUsCisJMHgwM2YwYzAwMCwKKwkweDAwMDVkMDAxLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwYzEwMCwKKwkweDAwMDVkMDAxLAorCTB4MGU5ODA0YmQsCisJMHgwMTBmOTgwMCwKKwkweDAxNTAyMWY1LAorCTB4YmIwMDJmYmIsCisJMHgwZTk4MDAzZiwKKwkweDAyMGY5ODAxLAorCTB4MDE1MDIxZjUsCisJMHhmZDA1MGU5OCwKIAkweDJlYmIwMGVmLAogCTB4MDAzZWJiMDAsCi0JMHgxMzAwNDBiNywKLQkweGQwMDIzNWI2LAotCTB4MjViNjAwNDMsCi0JMHgwNjM1YjYwOCwKLQkweGI2MDEyMGI2LAotCTB4MjRiNjAxMzAsCi0JMHgwODM0YjYwOCwKLQkweGY1MDIyZmI5LAotCTB4YmIwMjcxMjEsCi0JMHgwN2YxMDAzZiwKLQkweDAzZjAwMTAwLAotCTB4MDAwM2QwMDIsCi0JMHgyNGJkMDRiZCwKLQkweGYxMWYyOWYwLAotCTB4ZjAwODAwMDcsCi0JMHgwMmQwMDIwMywKLS8qIDB4MDQzMzogbWFpbiAqLworCTB4OTgwMjBlOTgsCisJMHgyMWY1MDMwZiwKKwkweDBlOTgwMTUwLAorCTB4MDBlZmZkMDcsCisJMHhiYjAwMmViYiwKKwkweDM1YjYwMDNlLAorCTB4MDAwN2YxMDIsCisJMHgwMTAzZjBkMywKKwkweGJkMDAwM2QwLAorCTB4MDgyNWI2MDQsCisJMHhiNjA2MzViNiwKKwkweDMwYjYwMTIwLAorCTB4MDgyNGI2MDEsCisJMHhiOTA4MzRiNiwKKwkweDIxZjUwMjJmLAorCTB4M2ZiYjAyZDMsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDAxLAorCTB4YmQwMDAzZDAsCisJMHhmMDI0YmQwNCwKKwkweDA3ZjExZjI5LAorCTB4MDNmMDA4MDAsCisJMHgwMDAyZDAwMiwKKy8qIDB4MDRlMjogbWFpbiAqLworCTB4MzFmNDA0YmQsCisJMHgwMDI4ZjQwMCwKKwkweGY0MjRkN2YwLAorCTB4MDFmNDM5MjEsCisJMHgwNGU0YjBmNCwKKwkweGZlMWUxOGY0LAorCTB4MjdmMDAxODEsCisJMHhmZDIwYmQwNiwKKwkweGU0YjYwNDEyLAorCTB4MDUxZWZkMDEsCisJMHhmNTAwMThmZSwKKwkweGY0MDVkNzIxLAorLyogMHgwNTEyOiBtYWluX25vdF9jdHhfeGZlciAqLworCTB4ZWY5NGQzMGUsCisJMHgwMWY1ZjAxMCwKKwkweDAzN2UyMWY1LAorLyogMHgwNTFmOiBpaCAqLworCTB4ZjljNjBlZjQsCisJMHgwMTg4ZmU4MCwKKwkweDkwZjk4MGY5LAorCTB4YjBmOWEwZjksCisJMHhlMGY5ZDBmOSwKKwkweDA0YmRmMGY5LAorCTB4MDIwMGE3ZjEsCisJMHhjZjAwYTNmMCwKKwkweGFiYzQwMGFhLAorCTB4MmMwYmY0MDQsCisJMHhmMTI0ZDdmMCwKKwkweGYwMWEwMGU3LAorCTB4ZWVjZjAwZTMsCisJMHgwMGY3ZjEwMCwKKwkweDAwZjNmMDE5LAorCTB4ZjQwMGZmY2YsCisJMHhlN2YwMDQyMSwKKwkweDAwMDdmMTAxLAorCTB4MDAwM2YwMWQsCisJMHhiZDAwMGVkMCwKKy8qIDB4MDU2ZDogaWhfbm9fZmlmbyAqLworCTB4MDAwN2YxMDQsCisJMHgwMDAzZjAwMSwKKwkweGJkMDAwYWQwLAorCTB4ZmNmMGZjMDQsCisJMHhmY2QwZmNlMCwKKwkweGZjYTBmY2IwLAorCTB4ZmU4MGZjOTAsCisJMHg4MGZjMDA4OCwKKwkweGY4MDAzMmY0LAorLyogMHgwNTkxOiBodWJfYmFycmllcl9kb25lICovCisJMHgwMWY3ZjAwMSwKKwkweGJiMDQwZTk4LAorCTB4ZmZiOTA0ZmUsCisJMHgxOGU3ZjEwMiwKKwkweDQwZTNmMDk0LAorCTB4Zjg5ZDIxZjQsCisvKiAweDA1YTk6IGN0eF9yZWRzd2l0Y2ggKi8KKwkweDIwZjdmMDAwLAorCTB4ODUwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBmLAorLyogMHgwNWJiOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhiNjA4ZTdmMCwKKwkweDFiZjQwMWUyLAorCTB4MDBmNWYxZmQsCisJMHgwMGY1ZjEwOCwKKwkweDAwMDdmMTAyLAorCTB4MDEwM2YwODUsCisJMHhiZDAwMGZkMCwKKy8qIDB4MDVkNzogY3R4X3hmZXIgKi8KKwkweGYxMDBmODA0LAorCTB4ZjA4MTAwMDcsCisJMHgwZmQwMDIwMywKIAkweGY0MDRiZDAwLAotCTB4MjhmNDAwMzEsCi0JMHgyNGQ3ZjAwMCwKLQkweGY0MzkyMWY0LAotCTB4ZTRiMGY0MDEsCi0JMHgxZTE4ZjQwNCwKLQkweGYwMDE4MWZlLAotCTB4MjBiZDA2MjcsCi0JMHhiNjA0MTJmZCwKLQkweDFlZmQwMWU0LAotCTB4MDAxOGZlMDUsCi0JMHgwNGY3MjFmNSwKLS8qIDB4MDQ2MzogbWFpbl9ub3RfY3R4X3hmZXIgKi8KLQkweDk0ZDMwZWY0LAotCTB4ZjVmMDEwZWYsCi0JMHhmZTIxZjUwMSwKLQkweGM2MGVmNDAyLAotLyogMHgwNDcwOiBpaCAqLwotCTB4ODhmZTgwZjksCi0JMHhmOTgwZjkwMSwKLQkweGY5YTBmOTkwLAotCTB4ZjlkMGY5YjAsCi0JMHhiZGYwZjllMCwKLQkweDgwMGFjZjA0LAotCTB4ZjQwNGFiYzQsCi0JMHhiN2YxMWQwYiwKLQkweGQ3ZjAxOTAwLAotCTB4NDBiZWNmMjQsCi0JMHhmNDAwYmZjZiwKLQkweGIwYjcwNDIxLAotCTB4ZTdmMDA0MDAsCi0JMHgwMGJlZDAwMSwKLS8qIDB4MDRhODogaWhfbm9fZmlmbyAqLwotCTB4ZmM0MDBhZDAsCi0JMHhmY2UwZmNmMCwKLQkweGZjYjBmY2QwLAotCTB4ZmM5MGZjYTAsCi0JMHgwMDg4ZmU4MCwKLQkweDMyZjQ4MGZjLAotLyogMHgwNGMzOiBodWJfYmFycmllcl9kb25lICovCi0JMHhmMDAxZjgwMCwKLQkweDBlOTgwMWY3LAotCTB4MDRmZWJiMDQsCi0JMHg5NDE4ZTdmMSwKLQkweGY0NDBlM2YwLAotCTB4MDBmODhkMjEsCi0vKiAweDA0ZDg6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweDA2MTRlN2YxLAotCTB4ZjAwNmU0YjYsCi0JMHhlZmQwMjBmNywKLQkweDA4ZjdmMDAwLAotLyogMHgwNGU4OiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHhmNDAxZjJiNiwKLQkweGY3ZjFmZDFiLAotCTB4ZWZkMDBhMjAsCi0vKiAweDA0Zjc6IGN0eF94ZmVyICovCi0JMHhmMTAwZjgwMCwKLQkweGI2MGEwNDE3LAotCTB4MWZkMDA2MTQsCi0JMHgwNzExZjQwMCwKLQkweDA0ZDgyMWY1LAotLyogMHgwNTA4OiBjdHhfeGZlcl9ub3RfbG9hZCAqLwotCTB4NGFmYzE3ZjEsCi0JMHhmMDAyMTNmMCwKLQkweDEyZDAwYzI3LAotCTB4MTUyMWY1MDAsCi0JMHhmYzI3ZjEwMiwKLQkweDAyMjNmMDQ3LAotCTB4ZjAwMDIwZDAsCi0JMHgyMGI2MDEyYywKLQkweDAwMTJkMDAzLAotCTB4ZjAwMWFjZjAsCi0JMHhiN2YwMDJhNSwKLQkweDUwYjNmMDAwLAotCTB4YjYwNDBjOTgsCi0JMHhiY2JiMGZjNCwKLQkweDAwMGM5ODAwLAotCTB4ZjAwMTBkOTgsCi0JMHgyMWY1MDBlNywKLQkweGFjZjAwMTY2LAotCTB4MDBiN2YxMDEsCi0JMHg1MGIzZjA0MCwKLQkweGI2MDQwYzk4LAotCTB4YmNiYjBmYzQsCi0JMHgwMTBjOTgwMCwKLQkweDk4MDIwZDk4LAotCTB4ZTdmMTA2MGYsCi0JMHgyMWY1MDgwMCwKLQkweGFjZjAwMTY2LAotCTB4MDRhNWYwMDEsCi0JMHgzMDAwYjdmMSwKKwkweDIxZjUwNzExLAorLyogMHgwNWVhOiBjdHhfeGZlcl9ub3RfbG9hZCAqLworCTB4MjFmNTA1YTksCisJMHgyNGJkMDI2YSwKKwkweDQ3ZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGI2MDEyY2YwLAorCTB4MDdmMTAzMjAsCisJMHgwM2YwNGFmYywKKwkweDAwMDJkMDAyLAorCTB4YWNmMDA0YmQsCisJMHgwMmE1ZjAwMSwKKwkweDAwMDBiN2YxLAogCTB4OTg1MGIzZjAsCiAJMHhjNGI2MDQwYywKIAkweDAwYmNiYjBmLAotCTB4OTgwMjBjOTgsCi0JMHgwZjk4MDMwZCwKLQkweDAwZTdmMTA4LAotCTB4NjYyMWY1MDIsCi0JMHgxNTIxZjUwMSwKLQkweDA2MDFmNDAyLAotLyogMHgwNWEzOiBjdHhfeGZlcl9wb3N0ICovCi0JMHhmMTE0MTJmNCwKLQkweGYwNGFmYzE3LAotCTB4MjdmMDAyMTMsCi0JMHgwMDEyZDAwZCwKLQkweDAyMTUyMWY1LAotLyogMHgwNWI0OiBjdHhfeGZlcl9kb25lICovCi0JMHgwNGMzMjFmNSwKLQkweDAwMDAwMGY4LAorCTB4OTgwMDBjOTgsCisJMHhlN2YwMDEwZCwKKwkweDZmMjFmNTAwLAorCTB4MDFhY2YwMDEsCisJMHg0MDAwYjdmMSwKKwkweDk4NTBiM2YwLAorCTB4YzRiNjA0MGMsCisJMHgwMGJjYmIwZiwKKwkweDk4MDEwYzk4LAorCTB4MGY5ODAyMGQsCisJMHgwMGU3ZjEwNiwKKwkweDZmMjFmNTA4LAorCTB4MDFhY2YwMDEsCisJMHhmMTA0YTVmMCwKKwkweGYwMzAwMGI3LAorCTB4MGM5ODUwYjMsCisJMHgwZmM0YjYwNCwKKwkweDk4MDBiY2JiLAorCTB4MGQ5ODAyMGMsCisJMHgwODBmOTgwMywKKwkweDAyMDBlN2YxLAorCTB4MDE2ZjIxZjUsCisJMHgwMjVlMjFmNSwKKwkweGY0MDYwMWY0LAorLyogMHgwNjg2OiBjdHhfeGZlcl9wb3N0ICovCisJMHgyMWY1MDcxMiwKKy8qIDB4MDY4YTogY3R4X3hmZXJfZG9uZSAqLworCTB4MjFmNTAyN2YsCisJMHgwMGY4MDU5MSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZlMC5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmUwLmZ1Yy5oCmluZGV4IDdmZjVlZjYuLmI2ZGE4MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmUwLmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmUwLmZ1Yy5oCkBAIC00MSwxNCArNDEsMTQgQEAKIH07CiAKIHVpbnQzMl90IG52ZTBfZ3JncGNfY29kZVtdID0gewotCTB4MDMxODBlZjUsCisJMHgwM2ExMGVmNSwKIC8qIDB4MDAwNDogcXVldWVfcHV0ICovCiAJMHg5ODAwZDg5OCwKIAkweDg2ZjAwMWQ5LAogCTB4MDQ4OWI4MDgsCiAJMHhmMDBjMWJmNCwKIAkweDIxZjUwMmY3LAotCTB4MDBmODAyZmUsCisJMHgwMGY4MDM3ZSwKIC8qIDB4MDAxYzogcXVldWVfcHV0X25leHQgKi8KIAkweGI2MDc5OGM0LAogCTB4OGRiYjAzODQsCkBAIC03MiwxODQgKzcyLDIxNCBAQAogLyogMHgwMDY2OiBxdWV1ZV9nZXRfZG9uZSAqLwogCTB4MDBmODAxMzIsCiAvKiAweDAwNjg6IG52X3JkMzIgKi8KLQkweDA3MjhiN2YxLAotCTB4YjkwNmI0YjYsCi0JMHhjOWYwMDJlYywKLQkweDAwYmNkMDFmLAotLyogMHgwMDc4OiBudl9yZDMyX3dhaXQgKi8KLQkweGM4MDBiY2NmLAotCTB4MWJmNDFmY2MsCi0JMHgwNmE3ZjBmYSwKLQkweDAxMDkyMWY1LAotCTB4Zjg0MGJmY2YsCi0vKiAweDAwOGQ6IG52X3dyMzIgKi8KLQkweDI4YjdmMTAwLAotCTB4MDZiNGI2MDcsCi0JMHhiOTgwYmZkMCwKLQkweGM5ZjAwMmVjLAotCTB4MWVjOWYwMWYsCi0vKiAweDAwYTM6IG52X3dyMzJfd2FpdCAqLwotCTB4Y2YwMGJjZDAsCi0JMHhjY2M4MDBiYywKLQkweGZhMWJmNDFmLAotLyogMHgwMGFlOiB3YXRjaGRvZ19yZXNldCAqLwotCTB4ODdmMTAwZjgsCi0JMHg4NGI2MDQzMCwKLQkweDFmZjlmMDA2LAotCTB4ZjgwMDhmZDAsCi0vKiAweDAwYmQ6IHdhdGNoZG9nX2NsZWFyICovCi0JMHgzMDg3ZjEwMCwKLQkweDA2ODRiNjA0LAotCTB4ZjgwMDgwZDAsCi0vKiAweDAwYzk6IHdhaXRfZG9uZXogKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMGYwMCwKLQkweDAwMDlkMDAyLAotCTB4MDdmMTA0YmQsCi0JMHgwM2YwMDYwMCwKLQkweDAwMGFkMDAyLAotLyogMHgwMGU2OiB3YWl0X2RvbmV6X25lICovCi0JMHg4N2YxMDRiZCwKLQkweDgzZjAwMDAwLAotCTB4MDA4OGNmMDEsCi0JMHhmNDg4OGFmZiwKLQkweDk0YmRmMzFiLAotCTB4ZjEwMDk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDAxMDk6IHdhaXRfZG9uZW8gKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMGYwMCwKLQkweDAwMDlkMDAyLAotCTB4ODdmMTA0YmQsCi0JMHg4NGI2MDgxOCwKLQkweDAwOGFkMDA2LAotLyogMHgwMTI0OiB3YWl0X2RvbmVvX2UgKi8KLQkweDA0MDA4N2YxLAotCTB4Y2YwNjg0YjYsCi0JMHg4YWZmMDA4OCwKLQkweGYzMGJmNDg4LAorCTB4ZjAwMmVjYjksCisJMHgwN2YxMWZjOSwKKwkweDAzZjBjYTAwLAorCTB4MDAwY2QwMDEsCisvKiAweDAwN2E6IG52X3JkMzJfd2FpdCAqLworCTB4YzdmMTA0YmQsCisJMHhjM2YwY2EwMCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHhhN2YwZjMxYiwKKwkweDEwMjFmNTA2LAorCTB4MDBmN2YxMDEsCisJMHgwMWYzZjBjYiwKKwkweGY4MDBmZmNmLAorLyogMHgwMDlkOiBudl93cjMyICovCisJMHgwMDA3ZjEwMCwKKwkweDAxMDNmMGNjLAorCTB4YmQwMDBmZDAsCisJMHgwMmVjYjkwNCwKKwkweGYwMWZjOWYwLAorCTB4MDdmMTFlYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMGJlOiBudl93cjMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4MDBmOGYzMWIsCisvKiAweDAwZDA6IHdhaXRfZG9uZXogKi8KIAkweDk5ZjA5NGJkLAogCTB4MDAwN2YxMDAsCi0JMHgwMjAzZjAxNywKKwkweDAyMDNmMDBmLAogCTB4YmQwMDA5ZDAsCi0vKiAweDAxNDc6IG1tY3R4X3NpemUgKi8KLQkweGJkMDBmODA0LAotLyogMHgwMTQ5OiBudl9tbWN0eF9zaXplX2xvb3AgKi8KLQkweDAwZTg5ODk0LAotCTB4YjYxYTg1YjYsCi0JMHg4NGI2MDE4MCwKLQkweDAwOThiYjAyLAotCTB4YjgwNGUwYjYsCi0JMHgxYmY0MDRlZiwKLQkweDAyOWZiOWViLAotLyogMHgwMTY2OiBtbWN0eF94ZmVyICovCi0JMHg5NGJkMDBmOCwKLQkweGYxMDE5OWYwLAotCTB4ZjAwZjAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGYxMDRiZDAwLAotCTB4YjYwNzEwODcsCi0JMHg5NGJkMDY4NCwKLQkweGY0MDViYmZkLAotCTB4OGJkMDA5MGIsCi0JMHgwMDk5ZjAwMCwKLS8qIDB4MDE4YzogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLwotCTB4ZjQwNWVlZmQsCi0JMHg4ZWQwMGMwYiwKLQkweGMwOGZkMDgwLAotLyogMHgwMTliOiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLwotCTB4YjcwMTk5ZjAsCi0JMHhjODAxMDA4MCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDBlZDogd2FpdF9kb25lel9uZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MWJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTEwOiB3YWl0X2RvbmVvICovCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTAwLAorCTB4MDIwM2YwMGYsCisJMHhiZDAwMDlkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDEyZDogd2FpdF9kb25lb19lICovCisJMHgwMDg3ZjEwNCwKKwkweDAxODNmMDAwLAorCTB4ZmYwMDg4Y2YsCisJMHgwYmY0ODg4YSwKKwkweGYwOTRiZGYzLAorCTB4MDdmMTAwOTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxNTA6IG1tY3R4X3NpemUgKi8KKy8qIDB4MDE1MjogbnZfbW1jdHhfc2l6ZV9sb29wICovCisJMHhlODk4OTRiZCwKKwkweDFhODViNjAwLAorCTB4YjYwMTgwYjYsCisJMHg5OGJiMDI4NCwKKwkweDA0ZTBiNjAwLAorCTB4ZjQwNGVmYjgsCisJMHg5ZmI5ZWIxYiwKKy8qIDB4MDE2ZjogbW1jdHhfeGZlciAqLworCTB4YmQwMGY4MDIsCisJMHgwMTk5ZjA5NCwKKwkweDBmMDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKwkweGJiZmQ5NGJkLAorCTB4MTIwYmY0MDUsCisJMHhjNDAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGIsCisvKiAweDAxOTc6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KKwkweGZkMDA5OWYwLAorCTB4MGJmNDA1ZWUsCisJMHgwMDA3ZjExZSwKKwkweDAxMDNmMGM2LAorCTB4YmQwMDBlZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAxMDNmMGM3LAorCTB4YmQwMDBmZDAsCisJMHgwMTk5ZjAwNCwKKy8qIDB4MDFiODogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KKwkweGI2MDBhYmM4LAorCTB4YjlmMDEwYjQsCisJMHgwMWFlYzgwYywKKwkweGZkMTFlNGI2LAorCTB4MDdmMTA1YmUsCisJMHgwM2YwYzUwMCwKKwkweDAwMGJkMDAxLAorLyogMHgwMWQ2OiBtbWN0eF9leGVjX2xvb3AgKi8KKy8qIDB4MDFkNjogbW1jdHhfd2FpdF9mcmVlICovCisJMHhlN2YxMDRiZCwKKwkweGUzZjBjNTAwLAorCTB4MDBlZWNmMDEsCisJMHhmNDFmZTRmMCwKKwkweGNlOThmMzBiLAorCTB4MDVlOWZkMDAsCisJMHhjODAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGUsCisJMHhiODA0YzBiNiwKKwkweDFiZjQwNGNkLAorCTB4MDJhYmM4ZDgsCisvKiAweDAyMDc6IG1tY3R4X2Zpbmlfd2FpdCAqLworCTB4ZjExZjFiZjQsCisJMHhmMGM1MDBiNywKKwkweGJiY2YwMWIzLAorCTB4MWZiNGYwMDAsCisJMHhmNDEwYjRiMCwKKwkweGE3ZjBmMDFiLAorCTB4ZDAyMWY0MDIsCisvKiAweDAyMjM6IG1tY3R4X3N0b3AgKi8KKwkweGM4MmIwZWY0LAogCTB4YjRiNjAwYWIsCiAJMHgwY2I5ZjAxMCwKLQkweGI2MDFhZWM4LAotCTB4YmVmZDExZTQsCi0JMHgwMDhiZDAwNSwKLS8qIDB4MDFiNDogbW1jdHhfZXhlY19sb29wICovCi0vKiAweDAxYjQ6IG1tY3R4X3dhaXRfZnJlZSAqLwotCTB4ZjAwMDhlY2YsCi0JMHgwYmY0MWZlNCwKLQkweDAwY2U5OGZhLAotCTB4ZDAwNWU5ZmQsCi0JMHhjMGI2YzA4ZSwKLQkweDA0Y2RiODA0LAotCTB4YzhlODFiZjQsCi0JMHgxYmY0MDJhYiwKLS8qIDB4MDFkNTogbW1jdHhfZmluaV93YWl0ICovCi0JMHgwMDhiY2YxOCwKLQkweGIwMWZiNGYwLAotCTB4MWJmNDEwYjQsCi0JMHgwMmE3ZjBmNywKLQkweGY0YzkyMWY0LAotLyogMHgwMWVhOiBtbWN0eF9zdG9wICovCi0JMHhhYmM4MWIwZSwKLQkweDEwYjRiNjAwLAotCTB4ZjAwY2I5ZjAsCi0JMHg4YmQwMTJiOSwKLS8qIDB4MDFmOTogbW1jdHhfc3RvcF93YWl0ICovCi0JMHgwMDhiY2YwMCwKLQkweGY0MTJiYmM4LAotLyogMHgwMjAyOiBtbWN0eF9kb25lICovCi0JMHg5NGJkZmExYiwKLQkweGYxMDE5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMjE1OiBzdHJhbmRfd2FpdCAqLwotCTB4ZjBhMGY5MDAsCi0JMHgyMWY0MDJhNywKLQkweGY4YTBmY2M5LAotLyogMHgwMjIxOiBzdHJhbmRfcHJlICovCi0JMHhmYzg3ZjEwMCwKLQkweDAyODNmMDRhLAotCTB4ZDAwYzk3ZjAsCi0JMHgyMWY1MDA4OSwKLQkweDAwZjgwMjE1LAotLyogMHgwMjM0OiBzdHJhbmRfcG9zdCAqLwotCTB4NGFmYzg3ZjEsCi0JMHhmMDAyODNmMCwKLQkweDg5ZDAwZDk3LAotCTB4MTUyMWY1MDAsCi0vKiAweDAyNDc6IHN0cmFuZF9zZXQgKi8KLQkweGYxMDBmODAyLAotCTB4ZjA0ZmZjYTcsCi0JMHhhYmEyMDJhMywKLQkweGM3ZjAwNTAwLAotCTB4MDBhY2QwMGYsCi0JMHhkMDBiYzdmMCwKLQkweDIxZjUwMGJjLAotCTB4YWVkMDAyMTUsCi0JMHgwYWM3ZjAwMCwKLQkweGY1MDBiY2QwLAotCTB4ZjgwMjE1MjEsCi0vKiAweDAyNzE6IHN0cmFuZF9jdHhfaW5pdCAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDM5OSwKLQkweDAzZjAwZjAwLAorCTB4ZjExMmI5ZjAsCisJMHhmMGM1MDAwNywKKwkweDBiZDAwMTAzLAorLyogMHgwMjNiOiBtbWN0eF9zdG9wX3dhaXQgKi8KKwkweGYxMDRiZDAwLAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDEyYmJjODAwLAorLyogMHgwMjRiOiBtbWN0eF9kb25lICovCisJMHhiZGYzMWJmNCwKKwkweDAxOTlmMDk0LAorCTB4MTcwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorLyogMHgwMjVlOiBzdHJhbmRfd2FpdCAqLworCTB4YTBmOTAwZjgsCisJMHhmNDAyYTdmMCwKKwkweGEwZmNkMDIxLAorLyogMHgwMjZhOiBzdHJhbmRfcHJlICovCisJMHg5N2YwMDBmOCwKKwkweGZjMDdmMTBjLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMDlkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMjdmOiBzdHJhbmRfcG9zdCAqLworCTB4ZjAwMGY4MDIsCisJMHgwN2YxMGQ5NywKKwkweDAzZjA0YWZjLAogCTB4MDAwOWQwMDIsCiAJMHgyMWY1MDRiZCwKLQkweGU3ZjAwMjIxLAotCTB4NDcyMWY1MDMsCi0JMHhmY2E3ZjEwMiwKLQkweDAyYTNmMDQ2LAotCTB4MDQwMGFiYTAsCi0JMHhmMDQwYTBkMCwKLQkweGJjZDAwMWM3LAotCTB4MTUyMWY1MDAsCi0JMHgwMTBjOTIwMiwKLQkweGYwMDBhY2QwLAotCTB4YmNkMDAyYzcsCi0JMHgxNTIxZjUwMCwKLQkweDM0MjFmNTAyLAotCTB4ODA4N2YxMDIsCi0JMHgwNjg0YjYwOCwKLQkweGI3MDA4OWNmLAotCTB4OTUyMjAwODAsCi0vKiAweDAyY2E6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCisJMHgwMGY4MDI1ZSwKKy8qIDB4MDI5NDogc3RyYW5kX3NldCAqLworCTB4ZjEwZmM3ZjAsCisJMHhmMDRmZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMGJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgwN2YxMDRiZCwKKwkweDAzZjA0ZmZjLAorCTB4MDAwZWQwMDIsCisJMHhjN2YwMDRiZCwKKwkweGZjMDdmMTBhLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMGNkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMmQzOiBzdHJhbmRfY3R4X2luaXQgKi8KKwkweGJkMDBmODAyLAorCTB4MDM5OWYwOTQsCisJMHgwZjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHgwMjZhMjFmNSwKKwkweGY1MDNlN2YwLAorCTB4YmQwMjk0MjEsCisJMHhmYzA3ZjFjNCwKKwkweDAyMDNmMDQ3LAorCTB4YmQwMDBjZDAsCisJMHgwMWM3ZjAwNCwKKwkweDRhZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwYywKKwkweDAyNWUyMWY1LAorCTB4ZjEwMTBjOTIsCisJMHhmMDQ2ZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMDJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgyMWY1MDRiZCwKKwkweDIxZjUwMjVlLAorCTB4ODdmMTAyN2YsCisJMHg4M2YwNDIwMCwKKwkweDAwOTdmMTAyLAorCTB4MDI5M2YwMjAsCisJMHg5NTAwOTljZiwKKy8qIDB4MDM0YTogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KIAkweDhlZDAwOGZlLAogCTB4NDA4ZWQwMDAsCiAJMHhiNjgwOGFjZiwKQEAgLTI2MywxOTggKzI5MywyMzAgQEAKIAkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLS8qIDB4MDJmZTogZXJyb3IgKi8KKy8qIDB4MDM3ZTogZXJyb3IgKi8KIAkweGUwZjkwMGY4LAotCTB4OTgxNGU3ZjEsCi0JMHhmNDQwZTNmMCwKLQkweGUwYjc4ZDIxLAotCTB4ZjdmMDA0MWMsCi0JMHg4ZDIxZjQwMSwKLQkweDAwZjhlMGZjLAotLyogMHgwMzE4OiBpbml0ICovCi0JMHgwNGZlMDRiZCwKLQkweDAwMTdmMTAwLAotCTB4MDIyN2YwMTIsCi0JMHhmMTAwMTJkMCwKLQkweGZlMDQ3MDE3LAotCTB4MTdmMTAwMTAsCi0JMHgxMGQwMDQwMCwKLQkweDA0MjdmMGMwLAotCTB4ZjQwMDEyZDAsCi0JMHgxN2YxMTAzMSwKLQkweDE0YjYwNjA4LAotCTB4MDAxMmNmMDYsCisJMHhmMTAyZmZiOSwKKwkweGYwOTgxNGU3LAorCTB4MjFmNDQwZTMsCisJMHgwMWY3ZjA5ZCwKKwkweGYxMDJmZmI5LAorCTB4ZjA5YzFjZTcsCisJMHgyMWY0NDBlMywKKwkweGY4ZTBmYzlkLAorLyogMHgwM2ExOiBpbml0ICovCisJMHhmZTA0YmQwMCwKKwkweDI3ZjAwMDA0LAorCTB4MDAwN2YxMDIsCisJMHgwMDAzZjAxMiwKKwkweGJkMDAwMmQwLAorCTB4MWYxN2YxMDQsCisJMHgwMDEwZmUwNSwKKwkweDA3MDAwN2YxLAorCTB4ZDAwMDAzZjAsCisJMHgwNGJkMDAwMCwKKwkweGYxMDQyN2YwLAorCTB4ZjAwNDAwMDcsCisJMHgwMmQwMDAwMywKKwkweGY0MDRiZDAwLAorCTB4MjdmMTEwMzEsCisJMHgyM2YwODIwMCwKKwkweDAwMjJjZjAxLAogCTB4ZjAwMTM3ZjAsCiAJMHgzMmJiMWYyNCwKIAkweDAxMzJiNjA0LAogCTB4ODAwNTAyODAsCi0JMHgxMGI3MDYwMywKLQkweDEyY2YwNDAwLAotCTB4MDQwMjgwMDAsCi0JMHgwYzMwZTdmMSwKLQkweGJkNTBlM2YwLAotCTB4YmQzNGJkMjQsCi0vKiAweDAzNzE6IGluaXRfdW5rX2xvb3AgKi8KLQkweDY4MjFmNDQ0LAotCTB4ZjQwMGY2YjAsCi0JMHhmN2YwMGYwYiwKLQkweDA0ZjJiYjAxLAotCTB4YjYwNTRmZmQsCi0vKiAweDAzODY6IGluaXRfdW5rX25leHQgKi8KLQkweDIwYjYwMTMwLAotCTB4MDRlMGI2MDEsCi0JMHhmNDAxMjZiMCwKLS8qIDB4MDM5MjogaW5pdF91bmtfZG9uZSAqLwotCTB4MDM4MGUyMWIsCi0JMHgwODA0ODAwNywKLQkweDAxMDAyN2YxLAotCTB4Y2YwMjIzZjAsCi0JMHgzNGJkMDAyMiwKLQkweDA3MDA0N2YxLAotCTB4OTUwNjQ0YjYsCi0JMHg0NWQwMDgyNSwKLQkweDQwNDVkMDAwLAotCTB4OTgwMDBlOTgsCi0JMHgyMWY1MDEwZiwKLQkweDJmYmIwMTQ3LAotCTB4MDAzZmJiMDAsCi0JMHg5ODAxMGU5OCwKLQkweDIxZjUwMjBmLAotCTB4MGU5ODAxNDcsCi0JMHgwMGVmZmQwNSwKLQkweGJiMDAyZWJiLAotCTB4MGU5ODAwM2UsCi0JMHgwMzBmOTgwMiwKLQkweDAxNDcyMWY1LAotCTB4ZmQwNzBlOTgsCisJMHgyN2YxMDYwMywKKwkweDIzZjA4NjAwLAorCTB4MDAyMmNmMDEsCisJMHhmMTA0MDI4MCwKKwkweGYwMGMzMGU3LAorCTB4MjRiZDUwZTMsCisJMHg0NGJkMzRiZCwKKy8qIDB4MDQxMDogaW5pdF91bmtfbG9vcCAqLworCTB4YjA2ODIxZjQsCisJMHgwYmY0MDBmNiwKKwkweDAxZjdmMDBmLAorCTB4ZmQwNGYyYmIsCisJMHgzMGI2MDU0ZiwKKy8qIDB4MDQyNTogaW5pdF91bmtfbmV4dCAqLworCTB4MDEyMGI2MDEsCisJMHhiMDA0ZTBiNiwKKwkweDFiZjQwMTI2LAorLyogMHgwNDMxOiBpbml0X3Vua19kb25lICovCisJMHgwNzAzODBlMiwKKwkweGYxMDgwNDgwLAorCTB4ZjAwMTAwMjcsCisJMHgyMmNmMDIyMywKKwkweDk1MzRiZDAwLAorCTB4MDdmMTA4MjUsCisJMHgwM2YwYzAwMCwKKwkweDAwMDVkMDAxLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwYzEwMCwKKwkweDAwMDVkMDAxLAorCTB4MGU5ODA0YmQsCisJMHgwMTBmOTgwMCwKKwkweDAxNTAyMWY1LAorCTB4YmIwMDJmYmIsCisJMHgwZTk4MDAzZiwKKwkweDAyMGY5ODAxLAorCTB4MDE1MDIxZjUsCisJMHhmZDA1MGU5OCwKIAkweDJlYmIwMGVmLAogCTB4MDAzZWJiMDAsCi0JMHgxMzAwNDBiNywKLQkweGQwMDIzNWI2LAotCTB4MjViNjAwNDMsCi0JMHgwNjM1YjYwOCwKLQkweGI2MDEyMGI2LAotCTB4MjRiNjAxMzAsCi0JMHgwODM0YjYwOCwKLQkweGY1MDIyZmI5LAotCTB4YmIwMjcxMjEsCi0JMHgwN2YxMDAzZiwKLQkweDAzZjAwMTAwLAotCTB4MDAwM2QwMDIsCi0JMHgyNGJkMDRiZCwKLQkweGYxMWYyOWYwLAotCTB4ZjAwODAwMDcsCi0JMHgwMmQwMDIwMywKLS8qIDB4MDQzMzogbWFpbiAqLworCTB4OTgwMjBlOTgsCisJMHgyMWY1MDMwZiwKKwkweDBlOTgwMTUwLAorCTB4MDBlZmZkMDcsCisJMHhiYjAwMmViYiwKKwkweDM1YjYwMDNlLAorCTB4MDAwN2YxMDIsCisJMHgwMTAzZjBkMywKKwkweGJkMDAwM2QwLAorCTB4MDgyNWI2MDQsCisJMHhiNjA2MzViNiwKKwkweDMwYjYwMTIwLAorCTB4MDgyNGI2MDEsCisJMHhiOTA4MzRiNiwKKwkweDIxZjUwMjJmLAorCTB4M2ZiYjAyZDMsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDAxLAorCTB4YmQwMDAzZDAsCisJMHhmMDI0YmQwNCwKKwkweDA3ZjExZjI5LAorCTB4MDNmMDA4MDAsCisJMHgwMDAyZDAwMiwKKy8qIDB4MDRlMjogbWFpbiAqLworCTB4MzFmNDA0YmQsCisJMHgwMDI4ZjQwMCwKKwkweGY0MjRkN2YwLAorCTB4MDFmNDM5MjEsCisJMHgwNGU0YjBmNCwKKwkweGZlMWUxOGY0LAorCTB4MjdmMDAxODEsCisJMHhmZDIwYmQwNiwKKwkweGU0YjYwNDEyLAorCTB4MDUxZWZkMDEsCisJMHhmNTAwMThmZSwKKwkweGY0MDVkNzIxLAorLyogMHgwNTEyOiBtYWluX25vdF9jdHhfeGZlciAqLworCTB4ZWY5NGQzMGUsCisJMHgwMWY1ZjAxMCwKKwkweDAzN2UyMWY1LAorLyogMHgwNTFmOiBpaCAqLworCTB4ZjljNjBlZjQsCisJMHgwMTg4ZmU4MCwKKwkweDkwZjk4MGY5LAorCTB4YjBmOWEwZjksCisJMHhlMGY5ZDBmOSwKKwkweDA0YmRmMGY5LAorCTB4MDIwMGE3ZjEsCisJMHhjZjAwYTNmMCwKKwkweGFiYzQwMGFhLAorCTB4MmMwYmY0MDQsCisJMHhmMTI0ZDdmMCwKKwkweGYwMWEwMGU3LAorCTB4ZWVjZjAwZTMsCisJMHgwMGY3ZjEwMCwKKwkweDAwZjNmMDE5LAorCTB4ZjQwMGZmY2YsCisJMHhlN2YwMDQyMSwKKwkweDAwMDdmMTAxLAorCTB4MDAwM2YwMWQsCisJMHhiZDAwMGVkMCwKKy8qIDB4MDU2ZDogaWhfbm9fZmlmbyAqLworCTB4MDAwN2YxMDQsCisJMHgwMDAzZjAwMSwKKwkweGJkMDAwYWQwLAorCTB4ZmNmMGZjMDQsCisJMHhmY2QwZmNlMCwKKwkweGZjYTBmY2IwLAorCTB4ZmU4MGZjOTAsCisJMHg4MGZjMDA4OCwKKwkweGY4MDAzMmY0LAorLyogMHgwNTkxOiBodWJfYmFycmllcl9kb25lICovCisJMHgwMWY3ZjAwMSwKKwkweGJiMDQwZTk4LAorCTB4ZmZiOTA0ZmUsCisJMHgxOGU3ZjEwMiwKKwkweDQwZTNmMDk0LAorCTB4Zjg5ZDIxZjQsCisvKiAweDA1YTk6IGN0eF9yZWRzd2l0Y2ggKi8KKwkweDIwZjdmMDAwLAorCTB4ODUwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBmLAorLyogMHgwNWJiOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhiNjA4ZTdmMCwKKwkweDFiZjQwMWUyLAorCTB4MDBmNWYxZmQsCisJMHgwMGY1ZjEwOCwKKwkweDAwMDdmMTAyLAorCTB4MDEwM2YwODUsCisJMHhiZDAwMGZkMCwKKy8qIDB4MDVkNzogY3R4X3hmZXIgKi8KKwkweGYxMDBmODA0LAorCTB4ZjA4MTAwMDcsCisJMHgwZmQwMDIwMywKIAkweGY0MDRiZDAwLAotCTB4MjhmNDAwMzEsCi0JMHgyNGQ3ZjAwMCwKLQkweGY0MzkyMWY0LAotCTB4ZTRiMGY0MDEsCi0JMHgxZTE4ZjQwNCwKLQkweGYwMDE4MWZlLAotCTB4MjBiZDA2MjcsCi0JMHhiNjA0MTJmZCwKLQkweDFlZmQwMWU0LAotCTB4MDAxOGZlMDUsCi0JMHgwNGY3MjFmNSwKLS8qIDB4MDQ2MzogbWFpbl9ub3RfY3R4X3hmZXIgKi8KLQkweDk0ZDMwZWY0LAotCTB4ZjVmMDEwZWYsCi0JMHhmZTIxZjUwMSwKLQkweGM2MGVmNDAyLAotLyogMHgwNDcwOiBpaCAqLwotCTB4ODhmZTgwZjksCi0JMHhmOTgwZjkwMSwKLQkweGY5YTBmOTkwLAotCTB4ZjlkMGY5YjAsCi0JMHhiZGYwZjllMCwKLQkweDgwMGFjZjA0LAotCTB4ZjQwNGFiYzQsCi0JMHhiN2YxMWQwYiwKLQkweGQ3ZjAxOTAwLAotCTB4NDBiZWNmMjQsCi0JMHhmNDAwYmZjZiwKLQkweGIwYjcwNDIxLAotCTB4ZTdmMDA0MDAsCi0JMHgwMGJlZDAwMSwKLS8qIDB4MDRhODogaWhfbm9fZmlmbyAqLwotCTB4ZmM0MDBhZDAsCi0JMHhmY2UwZmNmMCwKLQkweGZjYjBmY2QwLAotCTB4ZmM5MGZjYTAsCi0JMHgwMDg4ZmU4MCwKLQkweDMyZjQ4MGZjLAotLyogMHgwNGMzOiBodWJfYmFycmllcl9kb25lICovCi0JMHhmMDAxZjgwMCwKLQkweDBlOTgwMWY3LAotCTB4MDRmZWJiMDQsCi0JMHg5NDE4ZTdmMSwKLQkweGY0NDBlM2YwLAotCTB4MDBmODhkMjEsCi0vKiAweDA0ZDg6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweDA2MTRlN2YxLAotCTB4ZjAwNmU0YjYsCi0JMHhlZmQwMjBmNywKLQkweDA4ZjdmMDAwLAotLyogMHgwNGU4OiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHhmNDAxZjJiNiwKLQkweGY3ZjFmZDFiLAotCTB4ZWZkMDBhMjAsCi0vKiAweDA0Zjc6IGN0eF94ZmVyICovCi0JMHhmMTAwZjgwMCwKLQkweGI2MGEwNDE3LAotCTB4MWZkMDA2MTQsCi0JMHgwNzExZjQwMCwKLQkweDA0ZDgyMWY1LAotLyogMHgwNTA4OiBjdHhfeGZlcl9ub3RfbG9hZCAqLwotCTB4NGFmYzE3ZjEsCi0JMHhmMDAyMTNmMCwKLQkweDEyZDAwYzI3LAotCTB4MTUyMWY1MDAsCi0JMHhmYzI3ZjEwMiwKLQkweDAyMjNmMDQ3LAotCTB4ZjAwMDIwZDAsCi0JMHgyMGI2MDEyYywKLQkweDAwMTJkMDAzLAotCTB4ZjAwMWFjZjAsCi0JMHhiN2YwMDJhNSwKLQkweDUwYjNmMDAwLAotCTB4YjYwNDBjOTgsCi0JMHhiY2JiMGZjNCwKLQkweDAwMGM5ODAwLAotCTB4ZjAwMTBkOTgsCi0JMHgyMWY1MDBlNywKLQkweGFjZjAwMTY2LAotCTB4MDBiN2YxMDEsCi0JMHg1MGIzZjA0MCwKLQkweGI2MDQwYzk4LAotCTB4YmNiYjBmYzQsCi0JMHgwMTBjOTgwMCwKLQkweDk4MDIwZDk4LAotCTB4ZTdmMTA2MGYsCi0JMHgyMWY1MDgwMCwKLQkweGFjZjAwMTY2LAotCTB4MDRhNWYwMDEsCi0JMHgzMDAwYjdmMSwKKwkweDIxZjUwNzExLAorLyogMHgwNWVhOiBjdHhfeGZlcl9ub3RfbG9hZCAqLworCTB4MjFmNTA1YTksCisJMHgyNGJkMDI2YSwKKwkweDQ3ZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGI2MDEyY2YwLAorCTB4MDdmMTAzMjAsCisJMHgwM2YwNGFmYywKKwkweDAwMDJkMDAyLAorCTB4YWNmMDA0YmQsCisJMHgwMmE1ZjAwMSwKKwkweDAwMDBiN2YxLAogCTB4OTg1MGIzZjAsCiAJMHhjNGI2MDQwYywKIAkweDAwYmNiYjBmLAotCTB4OTgwMjBjOTgsCi0JMHgwZjk4MDMwZCwKLQkweDAwZTdmMTA4LAotCTB4NjYyMWY1MDIsCi0JMHgxNTIxZjUwMSwKLQkweDA2MDFmNDAyLAotLyogMHgwNWEzOiBjdHhfeGZlcl9wb3N0ICovCi0JMHhmMTE0MTJmNCwKLQkweGYwNGFmYzE3LAotCTB4MjdmMDAyMTMsCi0JMHgwMDEyZDAwZCwKLQkweDAyMTUyMWY1LAotLyogMHgwNWI0OiBjdHhfeGZlcl9kb25lICovCi0JMHgwNGMzMjFmNSwKLQkweDAwMDAwMGY4LAorCTB4OTgwMDBjOTgsCisJMHhlN2YwMDEwZCwKKwkweDZmMjFmNTAwLAorCTB4MDFhY2YwMDEsCisJMHg0MDAwYjdmMSwKKwkweDk4NTBiM2YwLAorCTB4YzRiNjA0MGMsCisJMHgwMGJjYmIwZiwKKwkweDk4MDEwYzk4LAorCTB4MGY5ODAyMGQsCisJMHgwMGU3ZjEwNiwKKwkweDZmMjFmNTA4LAorCTB4MDFhY2YwMDEsCisJMHhmMTA0YTVmMCwKKwkweGYwMzAwMGI3LAorCTB4MGM5ODUwYjMsCisJMHgwZmM0YjYwNCwKKwkweDk4MDBiY2JiLAorCTB4MGQ5ODAyMGMsCisJMHgwODBmOTgwMywKKwkweDAyMDBlN2YxLAorCTB4MDE2ZjIxZjUsCisJMHgwMjVlMjFmNSwKKwkweGY0MDYwMWY0LAorLyogMHgwNjg2OiBjdHhfeGZlcl9wb3N0ICovCisJMHgyMWY1MDcxMiwKKy8qIDB4MDY4YTogY3R4X3hmZXJfZG9uZSAqLworCTB4MjFmNTAyN2YsCisJMHgwMGY4MDU5MSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvZ3BjbnZmMC5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmYwLmZ1Yy5oCmluZGV4IGY4NzA1MDcuLjYzMTZlYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmYwLmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9ncGNudmYwLmZ1Yy5oCkBAIC00MSwxNCArNDEsMTQgQEAKIH07CiAKIHVpbnQzMl90IG52ZjBfZ3JncGNfY29kZVtdID0gewotCTB4MDMxODBlZjUsCisJMHgwM2ExMGVmNSwKIC8qIDB4MDAwNDogcXVldWVfcHV0ICovCiAJMHg5ODAwZDg5OCwKIAkweDg2ZjAwMWQ5LAogCTB4MDQ4OWI4MDgsCiAJMHhmMDBjMWJmNCwKIAkweDIxZjUwMmY3LAotCTB4MDBmODAyZmUsCisJMHgwMGY4MDM3ZSwKIC8qIDB4MDAxYzogcXVldWVfcHV0X25leHQgKi8KIAkweGI2MDc5OGM0LAogCTB4OGRiYjAzODQsCkBAIC03MiwxODQgKzcyLDIxNCBAQAogLyogMHgwMDY2OiBxdWV1ZV9nZXRfZG9uZSAqLwogCTB4MDBmODAxMzIsCiAvKiAweDAwNjg6IG52X3JkMzIgKi8KLQkweDA3MjhiN2YxLAotCTB4YjkwNmI0YjYsCi0JMHhjOWYwMDJlYywKLQkweDAwYmNkMDFmLAotLyogMHgwMDc4OiBudl9yZDMyX3dhaXQgKi8KLQkweGM4MDBiY2NmLAotCTB4MWJmNDFmY2MsCi0JMHgwNmE3ZjBmYSwKLQkweDAxMDkyMWY1LAotCTB4Zjg0MGJmY2YsCi0vKiAweDAwOGQ6IG52X3dyMzIgKi8KLQkweDI4YjdmMTAwLAotCTB4MDZiNGI2MDcsCi0JMHhiOTgwYmZkMCwKLQkweGM5ZjAwMmVjLAotCTB4MWVjOWYwMWYsCi0vKiAweDAwYTM6IG52X3dyMzJfd2FpdCAqLwotCTB4Y2YwMGJjZDAsCi0JMHhjY2M4MDBiYywKLQkweGZhMWJmNDFmLAotLyogMHgwMGFlOiB3YXRjaGRvZ19yZXNldCAqLwotCTB4ODdmMTAwZjgsCi0JMHg4NGI2MDQzMCwKLQkweDFmZjlmMDA2LAotCTB4ZjgwMDhmZDAsCi0vKiAweDAwYmQ6IHdhdGNoZG9nX2NsZWFyICovCi0JMHgzMDg3ZjEwMCwKLQkweDA2ODRiNjA0LAotCTB4ZjgwMDgwZDAsCi0vKiAweDAwYzk6IHdhaXRfZG9uZXogKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMzcwMCwKLQkweDAwMDlkMDAyLAotCTB4MDdmMTA0YmQsCi0JMHgwM2YwMDYwMCwKLQkweDAwMGFkMDAyLAotLyogMHgwMGU2OiB3YWl0X2RvbmV6X25lICovCi0JMHg4N2YxMDRiZCwKLQkweDgzZjAwMDAwLAotCTB4MDA4OGNmMDEsCi0JMHhmNDg4OGFmZiwKLQkweDk0YmRmMzFiLAotCTB4ZjEwMDk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDAxMDk6IHdhaXRfZG9uZW8gKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAwOTksCi0JMHgwM2YwMzcwMCwKLQkweDAwMDlkMDAyLAotCTB4ODdmMTA0YmQsCi0JMHg4NGI2MDgxOCwKLQkweDAwOGFkMDA2LAotLyogMHgwMTI0OiB3YWl0X2RvbmVvX2UgKi8KLQkweDA0MDA4N2YxLAotCTB4Y2YwNjg0YjYsCi0JMHg4YWZmMDA4OCwKLQkweGYzMGJmNDg4LAorCTB4ZjAwMmVjYjksCisJMHgwN2YxMWZjOSwKKwkweDAzZjBjYTAwLAorCTB4MDAwY2QwMDEsCisvKiAweDAwN2E6IG52X3JkMzJfd2FpdCAqLworCTB4YzdmMTA0YmQsCisJMHhjM2YwY2EwMCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHhhN2YwZjMxYiwKKwkweDEwMjFmNTA2LAorCTB4MDBmN2YxMDEsCisJMHgwMWYzZjBjYiwKKwkweGY4MDBmZmNmLAorLyogMHgwMDlkOiBudl93cjMyICovCisJMHgwMDA3ZjEwMCwKKwkweDAxMDNmMGNjLAorCTB4YmQwMDBmZDAsCisJMHgwMmVjYjkwNCwKKwkweGYwMWZjOWYwLAorCTB4MDdmMTFlYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMGJlOiBudl93cjMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4MDBmOGYzMWIsCisvKiAweDAwZDA6IHdhaXRfZG9uZXogKi8KIAkweDk5ZjA5NGJkLAogCTB4MDAwN2YxMDAsCi0JMHgwMjAzZjAxNywKKwkweDAyMDNmMDM3LAogCTB4YmQwMDA5ZDAsCi0vKiAweDAxNDc6IG1tY3R4X3NpemUgKi8KLQkweGJkMDBmODA0LAotLyogMHgwMTQ5OiBudl9tbWN0eF9zaXplX2xvb3AgKi8KLQkweDAwZTg5ODk0LAotCTB4YjYxYTg1YjYsCi0JMHg4NGI2MDE4MCwKLQkweDAwOThiYjAyLAotCTB4YjgwNGUwYjYsCi0JMHgxYmY0MDRlZiwKLQkweDAyOWZiOWViLAotLyogMHgwMTY2OiBtbWN0eF94ZmVyICovCi0JMHg5NGJkMDBmOCwKLQkweGYxMDE5OWYwLAotCTB4ZjAzNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGYxMDRiZDAwLAotCTB4YjYwNzEwODcsCi0JMHg5NGJkMDY4NCwKLQkweGY0MDViYmZkLAotCTB4OGJkMDA5MGIsCi0JMHgwMDk5ZjAwMCwKLS8qIDB4MDE4YzogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLwotCTB4ZjQwNWVlZmQsCi0JMHg4ZWQwMGMwYiwKLQkweGMwOGZkMDgwLAotLyogMHgwMTliOiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLwotCTB4YjcwMTk5ZjAsCi0JMHhjODAxMDA4MCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDBlZDogd2FpdF9kb25lel9uZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MWJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTEwOiB3YWl0X2RvbmVvICovCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTAwLAorCTB4MDIwM2YwMzcsCisJMHhiZDAwMDlkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwMDYsCisJMHhiZDAwMGFkMCwKKy8qIDB4MDEyZDogd2FpdF9kb25lb19lICovCisJMHgwMDg3ZjEwNCwKKwkweDAxODNmMDAwLAorCTB4ZmYwMDg4Y2YsCisJMHgwYmY0ODg4YSwKKwkweGYwOTRiZGYzLAorCTB4MDdmMTAwOTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxNTA6IG1tY3R4X3NpemUgKi8KKy8qIDB4MDE1MjogbnZfbW1jdHhfc2l6ZV9sb29wICovCisJMHhlODk4OTRiZCwKKwkweDFhODViNjAwLAorCTB4YjYwMTgwYjYsCisJMHg5OGJiMDI4NCwKKwkweDA0ZTBiNjAwLAorCTB4ZjQwNGVmYjgsCisJMHg5ZmI5ZWIxYiwKKy8qIDB4MDE2ZjogbW1jdHhfeGZlciAqLworCTB4YmQwMGY4MDIsCisJMHgwMTk5ZjA5NCwKKwkweDM3MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKwkweGJiZmQ5NGJkLAorCTB4MTIwYmY0MDUsCisJMHhjNDAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGIsCisvKiAweDAxOTc6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KKwkweGZkMDA5OWYwLAorCTB4MGJmNDA1ZWUsCisJMHgwMDA3ZjExZSwKKwkweDAxMDNmMGM2LAorCTB4YmQwMDBlZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAxMDNmMGM3LAorCTB4YmQwMDBmZDAsCisJMHgwMTk5ZjAwNCwKKy8qIDB4MDFiODogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KKwkweGI2MDBhYmM4LAorCTB4YjlmMDEwYjQsCisJMHgwMWFlYzgwYywKKwkweGZkMTFlNGI2LAorCTB4MDdmMTA1YmUsCisJMHgwM2YwYzUwMCwKKwkweDAwMGJkMDAxLAorLyogMHgwMWQ2OiBtbWN0eF9leGVjX2xvb3AgKi8KKy8qIDB4MDFkNjogbW1jdHhfd2FpdF9mcmVlICovCisJMHhlN2YxMDRiZCwKKwkweGUzZjBjNTAwLAorCTB4MDBlZWNmMDEsCisJMHhmNDFmZTRmMCwKKwkweGNlOThmMzBiLAorCTB4MDVlOWZkMDAsCisJMHhjODAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMGUsCisJMHhiODA0YzBiNiwKKwkweDFiZjQwNGNkLAorCTB4MDJhYmM4ZDgsCisvKiAweDAyMDc6IG1tY3R4X2Zpbmlfd2FpdCAqLworCTB4ZjExZjFiZjQsCisJMHhmMGM1MDBiNywKKwkweGJiY2YwMWIzLAorCTB4MWZiNGYwMDAsCisJMHhmNDEwYjRiMCwKKwkweGE3ZjBmMDFiLAorCTB4ZDAyMWY0MDIsCisvKiAweDAyMjM6IG1tY3R4X3N0b3AgKi8KKwkweGM4MmIwZWY0LAogCTB4YjRiNjAwYWIsCiAJMHgwY2I5ZjAxMCwKLQkweGI2MDFhZWM4LAotCTB4YmVmZDExZTQsCi0JMHgwMDhiZDAwNSwKLS8qIDB4MDFiNDogbW1jdHhfZXhlY19sb29wICovCi0vKiAweDAxYjQ6IG1tY3R4X3dhaXRfZnJlZSAqLwotCTB4ZjAwMDhlY2YsCi0JMHgwYmY0MWZlNCwKLQkweDAwY2U5OGZhLAotCTB4ZDAwNWU5ZmQsCi0JMHhjMGI2YzA4ZSwKLQkweDA0Y2RiODA0LAotCTB4YzhlODFiZjQsCi0JMHgxYmY0MDJhYiwKLS8qIDB4MDFkNTogbW1jdHhfZmluaV93YWl0ICovCi0JMHgwMDhiY2YxOCwKLQkweGIwMWZiNGYwLAotCTB4MWJmNDEwYjQsCi0JMHgwMmE3ZjBmNywKLQkweGY0YzkyMWY0LAotLyogMHgwMWVhOiBtbWN0eF9zdG9wICovCi0JMHhhYmM4MWIwZSwKLQkweDEwYjRiNjAwLAotCTB4ZjAwY2I5ZjAsCi0JMHg4YmQwMTJiOSwKLS8qIDB4MDFmOTogbW1jdHhfc3RvcF93YWl0ICovCi0JMHgwMDhiY2YwMCwKLQkweGY0MTJiYmM4LAotLyogMHgwMjAyOiBtbWN0eF9kb25lICovCi0JMHg5NGJkZmExYiwKLQkweGYxMDE5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMjE1OiBzdHJhbmRfd2FpdCAqLwotCTB4ZjBhMGY5MDAsCi0JMHgyMWY0MDJhNywKLQkweGY4YTBmY2M5LAotLyogMHgwMjIxOiBzdHJhbmRfcHJlICovCi0JMHhmYzg3ZjEwMCwKLQkweDAyODNmMDRhLAotCTB4ZDAwYzk3ZjAsCi0JMHgyMWY1MDA4OSwKLQkweDAwZjgwMjE1LAotLyogMHgwMjM0OiBzdHJhbmRfcG9zdCAqLwotCTB4NGFmYzg3ZjEsCi0JMHhmMDAyODNmMCwKLQkweDg5ZDAwZDk3LAotCTB4MTUyMWY1MDAsCi0vKiAweDAyNDc6IHN0cmFuZF9zZXQgKi8KLQkweGYxMDBmODAyLAotCTB4ZjA0ZmZjYTcsCi0JMHhhYmEyMDJhMywKLQkweGM3ZjAwNTAwLAotCTB4MDBhY2QwMGYsCi0JMHhkMDBiYzdmMCwKLQkweDIxZjUwMGJjLAotCTB4YWVkMDAyMTUsCi0JMHgwYWM3ZjAwMCwKLQkweGY1MDBiY2QwLAotCTB4ZjgwMjE1MjEsCi0vKiAweDAyNzE6IHN0cmFuZF9jdHhfaW5pdCAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDM5OSwKLQkweDAzZjAzNzAwLAorCTB4ZjExMmI5ZjAsCisJMHhmMGM1MDAwNywKKwkweDBiZDAwMTAzLAorLyogMHgwMjNiOiBtbWN0eF9zdG9wX3dhaXQgKi8KKwkweGYxMDRiZDAwLAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDEyYmJjODAwLAorLyogMHgwMjRiOiBtbWN0eF9kb25lICovCisJMHhiZGYzMWJmNCwKKwkweDAxOTlmMDk0LAorCTB4MTcwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorLyogMHgwMjVlOiBzdHJhbmRfd2FpdCAqLworCTB4YTBmOTAwZjgsCisJMHhmNDAyYTdmMCwKKwkweGEwZmNkMDIxLAorLyogMHgwMjZhOiBzdHJhbmRfcHJlICovCisJMHg5N2YwMDBmOCwKKwkweGZjMDdmMTBjLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMDlkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMjdmOiBzdHJhbmRfcG9zdCAqLworCTB4ZjAwMGY4MDIsCisJMHgwN2YxMGQ5NywKKwkweDAzZjA0YWZjLAogCTB4MDAwOWQwMDIsCiAJMHgyMWY1MDRiZCwKLQkweGU3ZjAwMjIxLAotCTB4NDcyMWY1MDMsCi0JMHhmY2E3ZjEwMiwKLQkweDAyYTNmMDQ2LAotCTB4MDQwMGFiYTAsCi0JMHhmMDQwYTBkMCwKLQkweGJjZDAwMWM3LAotCTB4MTUyMWY1MDAsCi0JMHgwMTBjOTIwMiwKLQkweGYwMDBhY2QwLAotCTB4YmNkMDAyYzcsCi0JMHgxNTIxZjUwMCwKLQkweDM0MjFmNTAyLAotCTB4ODA4N2YxMDIsCi0JMHgwNjg0YjYwOCwKLQkweGI3MDA4OWNmLAotCTB4OTUyMjAwODAsCi0vKiAweDAyY2E6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCisJMHgwMGY4MDI1ZSwKKy8qIDB4MDI5NDogc3RyYW5kX3NldCAqLworCTB4ZjEwZmM3ZjAsCisJMHhmMDRmZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMGJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgwN2YxMDRiZCwKKwkweDAzZjA0ZmZjLAorCTB4MDAwZWQwMDIsCisJMHhjN2YwMDRiZCwKKwkweGZjMDdmMTBhLAorCTB4MDIwM2YwNGEsCisJMHhiZDAwMGNkMCwKKwkweDVlMjFmNTA0LAorLyogMHgwMmQzOiBzdHJhbmRfY3R4X2luaXQgKi8KKwkweGJkMDBmODAyLAorCTB4MDM5OWYwOTQsCisJMHgzNzAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHgwMjZhMjFmNSwKKwkweGY1MDNlN2YwLAorCTB4YmQwMjk0MjEsCisJMHhmYzA3ZjFjNCwKKwkweDAyMDNmMDQ3LAorCTB4YmQwMDBjZDAsCisJMHgwMWM3ZjAwNCwKKwkweDRhZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwYywKKwkweDAyNWUyMWY1LAorCTB4ZjEwMTBjOTIsCisJMHhmMDQ2ZmMwNywKKwkweDBjZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgwN2YxMDJjNywKKwkweDAzZjA0YWZjLAorCTB4MDAwY2QwMDIsCisJMHgyMWY1MDRiZCwKKwkweDIxZjUwMjVlLAorCTB4ODdmMTAyN2YsCisJMHg4M2YwNDIwMCwKKwkweDAwOTdmMTAyLAorCTB4MDI5M2YwMjAsCisJMHg5NTAwOTljZiwKKy8qIDB4MDM0YTogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KIAkweDhlZDAwOGZlLAogCTB4NDA4ZWQwMDAsCiAJMHhiNjgwOGFjZiwKQEAgLTI2MywxOTggKzI5MywyMzAgQEAKIAkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLS8qIDB4MDJmZTogZXJyb3IgKi8KKy8qIDB4MDM3ZTogZXJyb3IgKi8KIAkweGUwZjkwMGY4LAotCTB4OTgxNGU3ZjEsCi0JMHhmNDQwZTNmMCwKLQkweGUwYjc4ZDIxLAotCTB4ZjdmMDA0MWMsCi0JMHg4ZDIxZjQwMSwKLQkweDAwZjhlMGZjLAotLyogMHgwMzE4OiBpbml0ICovCi0JMHgwNGZlMDRiZCwKLQkweDAwMTdmMTAwLAotCTB4MDIyN2YwMTIsCi0JMHhmMTAwMTJkMCwKLQkweGZlMDQ3MDE3LAotCTB4MTdmMTAwMTAsCi0JMHgxMGQwMDQwMCwKLQkweDA0MjdmMGMwLAotCTB4ZjQwMDEyZDAsCi0JMHgxN2YxMTAzMSwKLQkweDE0YjYwNjA4LAotCTB4MDAxMmNmMDYsCisJMHhmMTAyZmZiOSwKKwkweGYwOTgxNGU3LAorCTB4MjFmNDQwZTMsCisJMHgwMWY3ZjA5ZCwKKwkweGYxMDJmZmI5LAorCTB4ZjA5YzFjZTcsCisJMHgyMWY0NDBlMywKKwkweGY4ZTBmYzlkLAorLyogMHgwM2ExOiBpbml0ICovCisJMHhmZTA0YmQwMCwKKwkweDI3ZjAwMDA0LAorCTB4MDAwN2YxMDIsCisJMHgwMDAzZjAxMiwKKwkweGJkMDAwMmQwLAorCTB4MWYxN2YxMDQsCisJMHgwMDEwZmUwNSwKKwkweDA3MDAwN2YxLAorCTB4ZDAwMDAzZjAsCisJMHgwNGJkMDAwMCwKKwkweGYxMDQyN2YwLAorCTB4ZjAwNDAwMDcsCisJMHgwMmQwMDAwMywKKwkweGY0MDRiZDAwLAorCTB4MjdmMTEwMzEsCisJMHgyM2YwODIwMCwKKwkweDAwMjJjZjAxLAogCTB4ZjAwMTM3ZjAsCiAJMHgzMmJiMWYyNCwKIAkweDAxMzJiNjA0LAogCTB4ODAwNTAyODAsCi0JMHgxMGI3MDYwMywKLQkweDEyY2YwNDAwLAotCTB4MDQwMjgwMDAsCi0JMHgwYzMwZTdmMSwKLQkweGJkNTBlM2YwLAotCTB4YmQzNGJkMjQsCi0vKiAweDAzNzE6IGluaXRfdW5rX2xvb3AgKi8KLQkweDY4MjFmNDQ0LAotCTB4ZjQwMGY2YjAsCi0JMHhmN2YwMGYwYiwKLQkweDA0ZjJiYjAxLAotCTB4YjYwNTRmZmQsCi0vKiAweDAzODY6IGluaXRfdW5rX25leHQgKi8KLQkweDIwYjYwMTMwLAotCTB4MDRlMGI2MDEsCi0JMHhmNDAyMjZiMCwKLS8qIDB4MDM5MjogaW5pdF91bmtfZG9uZSAqLwotCTB4MDM4MGUyMWIsCi0JMHgwODA0ODAwNywKLQkweDAxMDAyN2YxLAotCTB4Y2YwMjIzZjAsCi0JMHgzNGJkMDAyMiwKLQkweDA3MDA0N2YxLAotCTB4OTUwNjQ0YjYsCi0JMHg0NWQwMDgyNSwKLQkweDQwNDVkMDAwLAotCTB4OTgwMDBlOTgsCi0JMHgyMWY1MDEwZiwKLQkweDJmYmIwMTQ3LAotCTB4MDAzZmJiMDAsCi0JMHg5ODAxMGU5OCwKLQkweDIxZjUwMjBmLAotCTB4MGU5ODAxNDcsCi0JMHgwMGVmZmQwNSwKLQkweGJiMDAyZWJiLAotCTB4MGU5ODAwM2UsCi0JMHgwMzBmOTgwMiwKLQkweDAxNDcyMWY1LAotCTB4ZmQwNzBlOTgsCisJMHgyN2YxMDYwMywKKwkweDIzZjA4NjAwLAorCTB4MDAyMmNmMDEsCisJMHhmMTA0MDI4MCwKKwkweGYwMGMzMGU3LAorCTB4MjRiZDUwZTMsCisJMHg0NGJkMzRiZCwKKy8qIDB4MDQxMDogaW5pdF91bmtfbG9vcCAqLworCTB4YjA2ODIxZjQsCisJMHgwYmY0MDBmNiwKKwkweDAxZjdmMDBmLAorCTB4ZmQwNGYyYmIsCisJMHgzMGI2MDU0ZiwKKy8qIDB4MDQyNTogaW5pdF91bmtfbmV4dCAqLworCTB4MDEyMGI2MDEsCisJMHhiMDA0ZTBiNiwKKwkweDFiZjQwMjI2LAorLyogMHgwNDMxOiBpbml0X3Vua19kb25lICovCisJMHgwNzAzODBlMiwKKwkweGYxMDgwNDgwLAorCTB4ZjAwMTAwMjcsCisJMHgyMmNmMDIyMywKKwkweDk1MzRiZDAwLAorCTB4MDdmMTA4MjUsCisJMHgwM2YwYzAwMCwKKwkweDAwMDVkMDAxLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwYzEwMCwKKwkweDAwMDVkMDAxLAorCTB4MGU5ODA0YmQsCisJMHgwMTBmOTgwMCwKKwkweDAxNTAyMWY1LAorCTB4YmIwMDJmYmIsCisJMHgwZTk4MDAzZiwKKwkweDAyMGY5ODAxLAorCTB4MDE1MDIxZjUsCisJMHhmZDA1MGU5OCwKIAkweDJlYmIwMGVmLAogCTB4MDAzZWJiMDAsCi0JMHgxMzAwNDBiNywKLQkweGQwMDIzNWI2LAotCTB4MjViNjAwNDMsCi0JMHgwNjM1YjYwOCwKLQkweGI2MDEyMGI2LAotCTB4MjRiNjAxMzAsCi0JMHgwODM0YjYwOCwKLQkweGY1MDIyZmI5LAotCTB4YmIwMjcxMjEsCi0JMHgwN2YxMDAzZiwKLQkweDAzZjAwMTAwLAotCTB4MDAwM2QwMDIsCi0JMHgyNGJkMDRiZCwKLQkweGYxMWYyOWYwLAotCTB4ZjAzMDAwMDcsCi0JMHgwMmQwMDIwMywKLS8qIDB4MDQzMzogbWFpbiAqLworCTB4OTgwMjBlOTgsCisJMHgyMWY1MDMwZiwKKwkweDBlOTgwMTUwLAorCTB4MDBlZmZkMDcsCisJMHhiYjAwMmViYiwKKwkweDM1YjYwMDNlLAorCTB4MDAwN2YxMDIsCisJMHgwMTAzZjBkMywKKwkweGJkMDAwM2QwLAorCTB4MDgyNWI2MDQsCisJMHhiNjA2MzViNiwKKwkweDMwYjYwMTIwLAorCTB4MDgyNGI2MDEsCisJMHhiOTA4MzRiNiwKKwkweDIxZjUwMjJmLAorCTB4M2ZiYjAyZDMsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDAxLAorCTB4YmQwMDAzZDAsCisJMHhmMDI0YmQwNCwKKwkweDA3ZjExZjI5LAorCTB4MDNmMDMwMDAsCisJMHgwMDAyZDAwMiwKKy8qIDB4MDRlMjogbWFpbiAqLworCTB4MzFmNDA0YmQsCisJMHgwMDI4ZjQwMCwKKwkweGY0MjRkN2YwLAorCTB4MDFmNDM5MjEsCisJMHgwNGU0YjBmNCwKKwkweGZlMWUxOGY0LAorCTB4MjdmMDAxODEsCisJMHhmZDIwYmQwNiwKKwkweGU0YjYwNDEyLAorCTB4MDUxZWZkMDEsCisJMHhmNTAwMThmZSwKKwkweGY0MDVkNzIxLAorLyogMHgwNTEyOiBtYWluX25vdF9jdHhfeGZlciAqLworCTB4ZWY5NGQzMGUsCisJMHgwMWY1ZjAxMCwKKwkweDAzN2UyMWY1LAorLyogMHgwNTFmOiBpaCAqLworCTB4ZjljNjBlZjQsCisJMHgwMTg4ZmU4MCwKKwkweDkwZjk4MGY5LAorCTB4YjBmOWEwZjksCisJMHhlMGY5ZDBmOSwKKwkweDA0YmRmMGY5LAorCTB4MDIwMGE3ZjEsCisJMHhjZjAwYTNmMCwKKwkweGFiYzQwMGFhLAorCTB4MmMwYmY0MDQsCisJMHhmMTI0ZDdmMCwKKwkweGYwMWEwMGU3LAorCTB4ZWVjZjAwZTMsCisJMHgwMGY3ZjEwMCwKKwkweDAwZjNmMDE5LAorCTB4ZjQwMGZmY2YsCisJMHhlN2YwMDQyMSwKKwkweDAwMDdmMTAxLAorCTB4MDAwM2YwMWQsCisJMHhiZDAwMGVkMCwKKy8qIDB4MDU2ZDogaWhfbm9fZmlmbyAqLworCTB4MDAwN2YxMDQsCisJMHgwMDAzZjAwMSwKKwkweGJkMDAwYWQwLAorCTB4ZmNmMGZjMDQsCisJMHhmY2QwZmNlMCwKKwkweGZjYTBmY2IwLAorCTB4ZmU4MGZjOTAsCisJMHg4MGZjMDA4OCwKKwkweGY4MDAzMmY0LAorLyogMHgwNTkxOiBodWJfYmFycmllcl9kb25lICovCisJMHgwMWY3ZjAwMSwKKwkweGJiMDQwZTk4LAorCTB4ZmZiOTA0ZmUsCisJMHgxOGU3ZjEwMiwKKwkweDQwZTNmMDk0LAorCTB4Zjg5ZDIxZjQsCisvKiAweDA1YTk6IGN0eF9yZWRzd2l0Y2ggKi8KKwkweDIwZjdmMDAwLAorCTB4ODUwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBmLAorLyogMHgwNWJiOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhiNjA4ZTdmMCwKKwkweDFiZjQwMWUyLAorCTB4MDBmNWYxZmQsCisJMHgwMGY1ZjEwOCwKKwkweDAwMDdmMTAyLAorCTB4MDEwM2YwODUsCisJMHhiZDAwMGZkMCwKKy8qIDB4MDVkNzogY3R4X3hmZXIgKi8KKwkweGYxMDBmODA0LAorCTB4ZjA4MTAwMDcsCisJMHgwZmQwMDIwMywKIAkweGY0MDRiZDAwLAotCTB4MjhmNDAwMzEsCi0JMHgyNGQ3ZjAwMCwKLQkweGY0MzkyMWY0LAotCTB4ZTRiMGY0MDEsCi0JMHgxZTE4ZjQwNCwKLQkweGYwMDE4MWZlLAotCTB4MjBiZDA2MjcsCi0JMHhiNjA0MTJmZCwKLQkweDFlZmQwMWU0LAotCTB4MDAxOGZlMDUsCi0JMHgwNGY3MjFmNSwKLS8qIDB4MDQ2MzogbWFpbl9ub3RfY3R4X3hmZXIgKi8KLQkweDk0ZDMwZWY0LAotCTB4ZjVmMDEwZWYsCi0JMHhmZTIxZjUwMSwKLQkweGM2MGVmNDAyLAotLyogMHgwNDcwOiBpaCAqLwotCTB4ODhmZTgwZjksCi0JMHhmOTgwZjkwMSwKLQkweGY5YTBmOTkwLAotCTB4ZjlkMGY5YjAsCi0JMHhiZGYwZjllMCwKLQkweDgwMGFjZjA0LAotCTB4ZjQwNGFiYzQsCi0JMHhiN2YxMWQwYiwKLQkweGQ3ZjAxOTAwLAotCTB4NDBiZWNmMjQsCi0JMHhmNDAwYmZjZiwKLQkweGIwYjcwNDIxLAotCTB4ZTdmMDA0MDAsCi0JMHgwMGJlZDAwMSwKLS8qIDB4MDRhODogaWhfbm9fZmlmbyAqLwotCTB4ZmM0MDBhZDAsCi0JMHhmY2UwZmNmMCwKLQkweGZjYjBmY2QwLAotCTB4ZmM5MGZjYTAsCi0JMHgwMDg4ZmU4MCwKLQkweDMyZjQ4MGZjLAotLyogMHgwNGMzOiBodWJfYmFycmllcl9kb25lICovCi0JMHhmMDAxZjgwMCwKLQkweDBlOTgwMWY3LAotCTB4MDRmZWJiMDQsCi0JMHg5NDE4ZTdmMSwKLQkweGY0NDBlM2YwLAotCTB4MDBmODhkMjEsCi0vKiAweDA0ZDg6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweDA2MTRlN2YxLAotCTB4ZjAwNmU0YjYsCi0JMHhlZmQwMjBmNywKLQkweDA4ZjdmMDAwLAotLyogMHgwNGU4OiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHhmNDAxZjJiNiwKLQkweGY3ZjFmZDFiLAotCTB4ZWZkMDBhMjAsCi0vKiAweDA0Zjc6IGN0eF94ZmVyICovCi0JMHhmMTAwZjgwMCwKLQkweGI2MGEwNDE3LAotCTB4MWZkMDA2MTQsCi0JMHgwNzExZjQwMCwKLQkweDA0ZDgyMWY1LAotLyogMHgwNTA4OiBjdHhfeGZlcl9ub3RfbG9hZCAqLwotCTB4NGFmYzE3ZjEsCi0JMHhmMDAyMTNmMCwKLQkweDEyZDAwYzI3LAotCTB4MTUyMWY1MDAsCi0JMHhmYzI3ZjEwMiwKLQkweDAyMjNmMDQ3LAotCTB4ZjAwMDIwZDAsCi0JMHgyMGI2MDEyYywKLQkweDAwMTJkMDAzLAotCTB4ZjAwMWFjZjAsCi0JMHhiN2YwMDJhNSwKLQkweDUwYjNmMDAwLAotCTB4YjYwNDBjOTgsCi0JMHhiY2JiMGZjNCwKLQkweDAwMGM5ODAwLAotCTB4ZjAwMTBkOTgsCi0JMHgyMWY1MDBlNywKLQkweGFjZjAwMTY2LAotCTB4MDBiN2YxMDEsCi0JMHg1MGIzZjA0MCwKLQkweGI2MDQwYzk4LAotCTB4YmNiYjBmYzQsCi0JMHgwMTBjOTgwMCwKLQkweDk4MDIwZDk4LAotCTB4ZTdmMTA2MGYsCi0JMHgyMWY1MDgwMCwKLQkweGFjZjAwMTY2LAotCTB4MDRhNWYwMDEsCi0JMHgzMDAwYjdmMSwKKwkweDIxZjUwNzExLAorLyogMHgwNWVhOiBjdHhfeGZlcl9ub3RfbG9hZCAqLworCTB4MjFmNTA1YTksCisJMHgyNGJkMDI2YSwKKwkweDQ3ZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGI2MDEyY2YwLAorCTB4MDdmMTAzMjAsCisJMHgwM2YwNGFmYywKKwkweDAwMDJkMDAyLAorCTB4YWNmMDA0YmQsCisJMHgwMmE1ZjAwMSwKKwkweDAwMDBiN2YxLAogCTB4OTg1MGIzZjAsCiAJMHhjNGI2MDQwYywKIAkweDAwYmNiYjBmLAotCTB4OTgwMjBjOTgsCi0JMHgwZjk4MDMwZCwKLQkweDAwZTdmMTA4LAotCTB4NjYyMWY1MDIsCi0JMHgxNTIxZjUwMSwKLQkweDA2MDFmNDAyLAotLyogMHgwNWEzOiBjdHhfeGZlcl9wb3N0ICovCi0JMHhmMTE0MTJmNCwKLQkweGYwNGFmYzE3LAotCTB4MjdmMDAyMTMsCi0JMHgwMDEyZDAwZCwKLQkweDAyMTUyMWY1LAotLyogMHgwNWI0OiBjdHhfeGZlcl9kb25lICovCi0JMHgwNGMzMjFmNSwKLQkweDAwMDAwMGY4LAorCTB4OTgwMDBjOTgsCisJMHhlN2YwMDEwZCwKKwkweDZmMjFmNTAwLAorCTB4MDFhY2YwMDEsCisJMHg0MDAwYjdmMSwKKwkweDk4NTBiM2YwLAorCTB4YzRiNjA0MGMsCisJMHgwMGJjYmIwZiwKKwkweDk4MDEwYzk4LAorCTB4MGY5ODAyMGQsCisJMHgwMGU3ZjEwNiwKKwkweDZmMjFmNTA4LAorCTB4MDFhY2YwMDEsCisJMHhmMTA0YTVmMCwKKwkweGYwMzAwMGI3LAorCTB4MGM5ODUwYjMsCisJMHgwZmM0YjYwNCwKKwkweDk4MDBiY2JiLAorCTB4MGQ5ODAyMGMsCisJMHgwODBmOTgwMywKKwkweDAyMDBlN2YxLAorCTB4MDE2ZjIxZjUsCisJMHgwMjVlMjFmNSwKKwkweGY0MDYwMWY0LAorLyogMHgwNjg2OiBjdHhfeGZlcl9wb3N0ICovCisJMHgyMWY1MDcxMiwKKy8qIDB4MDY4YTogY3R4X3hmZXJfZG9uZSAqLworCTB4MjFmNTAyN2YsCisJMHgwMGY4MDU5MSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHViLmZ1YyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWIuZnVjCmluZGV4IGI4MmQyYWUuLmM4ZGRiOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWIuZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWIuZnVjCkBAIC02OCw2MCArNjgsNTcgQEAKIC8vCiBpbml0OgogCWNsZWFyIGIzMiAkcjAKLQltb3YgJHNwICRyMAogCW1vdiAkeGRiYXNlICRyMAogCisJLy8gc2V0dXAgc3RhY2sKKwludl9pb3JkKCRyMSwgTlZfUEdSQVBIX0ZFQ1NfQ0FQUywgMCkKKwlleHRyICRyMSAkcjEgOToxNworCXNobCBiMzIgJHIxIDgKKwltb3YgJHNwICRyMQorCiAJLy8gZW5hYmxlIGZpZm8gYWNjZXNzCi0JbW92ICRyMSAweDEyMDAKLQltb3YgJHIyIDIKLQlpb3dyIElbJHIxICsgMHgwMDBdICRyMgkvLyBGSUZPX0VOQUJMRQorCW1vdiAkcjIgTlZfUEdSQVBIX0ZFQ1NfQUNDRVNTX0ZJRk8KKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0FDQ0VTUywgMCwgJHIyKQogCiAJLy8gc2V0dXAgaTAgaGFuZGxlciwgYW5kIHJvdXRlIGFsbCBpbnRlcnJ1cHRzIHRvIGl0CiAJbW92ICRyMSAjaWgKIAltb3YgJGl2MCAkcjEKLQltb3YgJHIxIDB4NDAwCi0JaW93ciBJWyRyMSArIDB4MzAwXSAkcjAJLy8gSU5UUl9ESVNQQVRDSAogCi0JLy8gcm91dGUgSFVCX0NIQU5ORUxfU1dJVENIIHRvIGZ1YyBpbnRlcnJ1cHQgOAotCW1vdiAkcjMgMHg0MDQKLQlzaGwgYjMyICRyMyA2Ci0JbW92ICRyMiAweDIwMDMJCS8vIHsgSFVCX0NIQU5ORUxfU1dJVENILCBaRVJPIH0gLT4gaW50ciA4Ci0JaW93ciBJWyRyMyArIDB4MDAwXSAkcjIKKwljbGVhciBiMzIgJHIyCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19JTlRSX1JPVVRFLCAwLCAkcjIpCisKKwkvLyByb3V0ZSBIVUJfQ0hTV19QVUxTRSB0byBmdWMgaW50ZXJydXB0IDgKKwltb3YgJHIyIDB4MjAwMwkJLy8geyBIVUJfQ0hTV19QVUxTRSwgWkVSTyB9IC0+IGludHIgOAorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSVJPVVRFLCAwLCAkcjIpCiAKIAkvLyBub3Qgc3VyZSB3aGF0IHRoZXNlIGFyZSwgcm91dGUgdGhlbSBiZWNhdXNlIE5WSURJQSBkb2VzLCBhbmQKIAkvLyB0aGUgSVJRIGhhbmRsZXIgd2lsbCBzaWduYWwgdGhlIGhvc3QgaWYgd2UgZXZlciBnZXQgb25lLi4gd2UKIAkvLyBtYXkgZmluZCBvdXQgaWYvd2h5IHdlIG5lZWQgdG8gaGFuZGxlIHRoZXNlIGlmIHNvLi4KIAkvLwotCW1vdiAkcjIgMHgyMDA0Ci0JaW93ciBJWyRyMyArIDB4MDA0XSAkcjIgLy8geyAweDA0LCBaRVJPIH0gLT4gaW50ciA5Ci0JbW92ICRyMiAweDIwMGIKLQlpb3dyIElbJHIzICsgMHgwMDhdICRyMiAvLyB7IDB4MGIsIFpFUk8gfSAtPiBpbnRyIDEwCi0JbW92ICRyMiAweDIwMGMKLQlpb3dyIElbJHIzICsgMHgwMWNdICRyMiAvLyB7IDB4MGMsIFpFUk8gfSAtPiBpbnRyIDE1CisJbW92ICRyMiAweDIwMDQJCS8vIHsgMHgwNCwgWkVSTyB9IC0+IGludHIgOQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSVJPVVRFLCAxLCAkcjIpCisJbW92ICRyMiAweDIwMGIJCS8vIHsgSFVCX0ZJUk1XQVJFX01USEQsIFpFUk8gfSAtPiBpbnRyIDEwCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19JUk9VVEUsIDIsICRyMikKKwltb3YgJHIyIDB4MjAwYwkJLy8geyAweDBjLCBaRVJPIH0gLT4gaW50ciAxNQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSVJPVVRFLCA3LCAkcjIpCiAKIAkvLyBlbmFibGUgYWxsIElOVFJfVVAgaW50ZXJydXB0cwotCW1vdiAkcjIgMHhjMjQKLQlzaGwgYjMyICRyMiA2Ci0Jbm90IGIzMiAkcjMgJHIwCi0JaW93ciBJWyRyMl0gJHIzCisJc3ViIGIzMiAkcjMgJHIwIDEKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0lOVFJfVVBfRU4sIDAsICRyMykKIAotCS8vIGVuYWJsZSBmaWZvLCBjdHhzdywgOSwgMTAsIDE1IGludGVycnVwdHMKLQltb3YgJHIyIC0weDc4ZmMJCS8vIDB4ODcwNAotCXNldGhpICRyMiAwCi0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJLy8gSU5UUl9FTl9TRVQKKwkvLyBlbmFibGUgZmlmbywgY3R4c3csIDksIGZ3bXRoZCwgMTUgaW50ZXJydXB0cworCWltbTMyKCRyMiwgMHg4NzA0KQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSU5UUl9FTl9TRVQsIDAsICRyMikKIAogCS8vIGZpZm8gbGV2ZWwgdHJpZ2dlcmVkLCByZXN0IGVkZ2UKLQlzdWIgYjMyICRyMSAweDEwMAotCW1vdiAkcjIgNAotCWlvd3IgSVskcjFdICRyMgorCW1vdiAkcjIgTlZfUEdSQVBIX0ZFQ1NfSU5UUl9NT0RFX0ZJRk9fTEVWRUwKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0lOVFJfTU9ERSwgMCwgJHIyKQogCiAJLy8gZW5hYmxlIGludGVycnVwdHMKIAlic2V0ICRmbGFncyBpZTAKIAogCS8vIGZldGNoIGVuYWJsZWQgR1BDL1JPUCBjb3VudHMKLQltb3YgJHIxNCAtMHg2OWZjCS8vIDB4NDA5NjA0Ci0Jc2V0aGkgJHIxNCAweDQwMDAwMAotCWNhbGwgI252X3JkMzIKKwludl9yZDMyKCRyMTQsIDB4NDA5NjA0KQogCWV4dHIgJHIxICRyMTUgMTY6MjAKIAlzdCBiMzIgRFskcjAgKyAjcm9wX2NvdW50XSAkcjEKIAlhbmQgJHIxNSAweDFmCkBAIC0xMzEsMzcgKzEyOCw0MCBAQAogCW1vdiAkcjEgMQogCXNobCBiMzIgJHIxICRyMTUKIAlzdWIgYjMyICRyMSAxCi0JbW92ICRyMiAweDQwYwotCXNobCBiMzIgJHIyIDYKLQlpb3dyIElbJHIyICsgMHgwMDBdICRyMQotCWlvd3IgSVskcjIgKyAweDEwMF0gJHIxCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19CQVJfTUFTSzAsIDAsICRyMSkKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0JBUl9NQVNLMSwgMCwgJHIxKQogCiAJLy8gY29udGV4dCBzaXplIGNhbGN1bGF0aW9uLCByZXNlcnZlIGZpcnN0IDI1NiBieXRlcyBmb3IgdXNlIGJ5IGZ1YwogCW1vdiAkcjEgMjU2CiAKKwkvLworCW1vdiAkcjE1IDIKKwljYWxsKGN0eF80MTcwcykKKwljYWxsKGN0eF80MTcwdykKKwltb3YgJHIxNSAweDEwCisJY2FsbChjdHhfODZjKQorCiAJLy8gY2FsY3VsYXRlIHNpemUgb2YgbW1pbyBjb250ZXh0IGRhdGEKIAlsZCBiMzIgJHIxNCBEWyRyMCArICNodWJfbW1pb19saXN0X2hlYWRdCiAJbGQgYjMyICRyMTUgRFskcjAgKyAjaHViX21taW9fbGlzdF90YWlsXQotCWNhbGwgI21tY3R4X3NpemUKKwljYWxsKG1tY3R4X3NpemUpCiAKIAkvLyBzZXQgbW1jdHggYmFzZSBhZGRyZXNzZXMgbm93IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgbGF0ZXIsCiAJLy8gdGhleSBkb24ndCAoY3VycmVudGx5KSBldmVyIGNoYW5nZQotCW1vdiAkcjMgMHg3MDAKLQlzaGwgYjMyICRyMyA2CiAJc2hyIGIzMiAkcjQgJHIxIDgKLQlpb3dyIElbJHIzICsgMHgwMDBdICRyNAkJLy8gTU1DVFhfU0FWRV9TV0JBU0UKLQlpb3dyIElbJHIzICsgMHgxMDBdICRyNAkJLy8gTU1DVFhfTE9BRF9TV0JBU0UKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX01NQ1RYX1NBVkVfU1dCQVNFLCAwLCAkcjQpCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX1NXQkFTRSwgMCwgJHI0KQogCWFkZCBiMzIgJHIzIDB4MTMwMAogCWFkZCBiMzIgJHIxICRyMTUKIAlzaHIgYjMyICRyMTUgMgotCWlvd3IgSVskcjMgKyAweDAwMF0gJHIxNQkvLyBNTUNUWF9MT0FEX0NPVU5ULCB3dGYgZm9yPyE/CisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX0NPVU5ULCAwLCAkcjE1KSAvLyB3dGY/PwogCiAJLy8gc3RyYW5kcywgYmFzZSBvZmZzZXQgbmVlZHMgdG8gYmUgYWxpZ25lZCB0byAyNTYgYnl0ZXMKIAlzaHIgYjMyICRyMSA4CiAJYWRkIGIzMiAkcjEgMQogCXNobCBiMzIgJHIxIDgKIAltb3YgYjMyICRyMTUgJHIxCi0JY2FsbCAjc3RyYW5kX2N0eF9pbml0CisJY2FsbChzdHJhbmRfY3R4X2luaXQpCiAJYWRkIGIzMiAkcjEgJHIxNQogCiAJLy8gaW5pdGlhbGlzZSBlYWNoIEdQQyBpbiBzZXF1ZW5jZSBieSBwYXNzaW5nIGluIHRoZSBvZmZzZXQgb2YgaXRzCkBAIC0xNzMsMzAgKzE3MywyOSBAQAogCS8vIGluIEdQQ25fQ0NfU0NSQVRDSFsxXQogCS8vCiAJbGQgYjMyICRyMyBEWyRyMCArICNncGNfY291bnRdCi0JbW92ICRyNCAweDIwMDAKLQlzZXRoaSAkcjQgMHg1MDAwMDAKKwlpbW0zMigkcjQsIDB4NTAyMDAwKQogCWluaXRfZ3BjOgogCQkvLyBzZXR1cCwgYW5kIHN0YXJ0IEdQQyB1Y29kZSBydW5uaW5nCiAJCWFkZCBiMzIgJHIxNCAkcjQgMHg4MDQKIAkJbW92IGIzMiAkcjE1ICRyMQotCQljYWxsICNudl93cjMyCQkJLy8gQ0NfU0NSQVRDSFsxXSA9IGN0eCBvZmZzZXQKKwkJY2FsbChudl93cjMyKQkJCS8vIENDX1NDUkFUQ0hbMV0gPSBjdHggb2Zmc2V0CiAJCWFkZCBiMzIgJHIxNCAkcjQgMHgxMGMKIAkJY2xlYXIgYjMyICRyMTUKLQkJY2FsbCAjbnZfd3IzMgorCQljYWxsKG52X3dyMzIpCiAJCWFkZCBiMzIgJHIxNCAkcjQgMHgxMDQKLQkJY2FsbCAjbnZfd3IzMgkJCS8vIEVOVFJZCisJCWNhbGwobnZfd3IzMikJCQkvLyBFTlRSWQogCQlhZGQgYjMyICRyMTQgJHI0IDB4MTAwCiAJCW1vdiAkcjE1IDIJCQkvLyBDVFJMX1NUQVJUX1RSSUdHRVIKLQkJY2FsbCAjbnZfd3IzMgkJCS8vIENUUkwKKwkJY2FsbChudl93cjMyKQkJCS8vIENUUkwKIAogCQkvLyB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSwgYW5kIGFkanVzdCBjb250ZXh0IHNpemUKIAkJYWRkIGIzMiAkcjE0ICRyNCAweDgwMAogCQlpbml0X2dwY193YWl0OgotCQkJY2FsbCAjbnZfcmQzMgorCQkJY2FsbChudl9yZDMyKQogCQkJeGJpdCAkcjE1ICRyMTUgMzEKIAkJCWJyYSBlICNpbml0X2dwY193YWl0CiAJCWFkZCBiMzIgJHIxNCAkcjQgMHg4MDQKLQkJY2FsbCAjbnZfcmQzMgorCQljYWxsKG52X3JkMzIpCiAJCWFkZCBiMzIgJHIxICRyMTUKIAogCQkvLyBuZXh0IQpAQCAtMjA0LDYgKzIwMywxMiBAQAogCQlzdWIgYjMyICRyMyAxCiAJCWJyYSBuZSAjaW5pdF9ncGMKIAorCS8vCisJbW92ICRyMTUgMAorCWNhbGwoY3R4Xzg2YykKKwltb3YgJHIxNSAwCisJY2FsbChjdHhfNDE3MHMpCisKIAkvLyBzYXZlIGNvbnRleHQgc2l6ZSwgYW5kIHRlbGwgaG9zdCB3ZSdyZSByZWFkeQogCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfQ0NfU0NSQVRDSF9WQUwoMSksIDAsICRyMSkKIAljbGVhciBiMzIgJHIxCkBAIC0yMTgsMTcgKzIyMywxNSBAQAogCWJzZXQgJGZsYWdzICRwMAogCXNsZWVwICRwMAogCW1vdiAkcjEzICNjbWRfcXVldWUKLQljYWxsICNxdWV1ZV9nZXQKKwljYWxsKHF1ZXVlX2dldCkKIAlicmEgJHAxICNtYWluCiAKIAkvLyBjb250ZXh0IHN3aXRjaCwgcmVxdWVzdGVkIGJ5IEdQVT8KIAljbXB1IGIzMiAkcjE0IDB4NDAwMQogCWJyYSBuZSAjbWFpbl9ub3RfY3R4X3N3aXRjaAogCQl0cmFjZV9zZXQoVF9BVVRPKQotCQltb3YgJHIxIDB4YjAwCi0JCXNobCBiMzIgJHIxIDYKLQkJaW9yZCAkcjIgSVskcjEgKyAweDEwMF0JCS8vIENIQU5fTkVYVAotCQlpb3JkICRyMSBJWyRyMSArIDB4MDAwXQkJLy8gQ0hBTl9DVVIKKwkJbnZfaW9yZCgkcjEsIE5WX1BHUkFQSF9GRUNTX0NIQU5fQUREUiwgMCkKKwkJbnZfaW9yZCgkcjIsIE5WX1BHUkFQSF9GRUNTX0NIQU5fTkVYVCwgMCkKIAogCQl4Yml0ICRyMyAkcjEgMzEKIAkJYnJhIGUgI2Noc3dfbm9fcHJldgpAQCAtMjM5LDEyICsyNDIsMTIgQEAKIAkJCQl0cmFjZV9zZXQoVF9TQVZFKQogCQkJCWJjbHIgJGZsYWdzICRwMQogCQkJCWJzZXQgJGZsYWdzICRwMgotCQkJCWNhbGwgI2N0eF94ZmVyCisJCQkJY2FsbChjdHhfeGZlcikKIAkJCQl0cmFjZV9jbHIoVF9TQVZFKTsKIAkJCQlwb3AgJHIyCiAJCQkJdHJhY2Vfc2V0KFRfTE9BRCk7CiAJCQkJYnNldCAkZmxhZ3MgJHAxCi0JCQkJY2FsbCAjY3R4X3hmZXIKKwkJCQljYWxsKGN0eF94ZmVyKQogCQkJCXRyYWNlX2NscihUX0xPQUQpOwogCQkJCWJyYSAjY2hzd19kb25lCiAJCQljaHN3X3ByZXZfbm9fbmV4dDoKQEAgLTI1MiwyNSArMjU1LDIxIEBACiAJCQkJbW92IGIzMiAkcjIgJHIxCiAJCQkJYmNsciAkZmxhZ3MgJHAxCiAJCQkJYmNsciAkZmxhZ3MgJHAyCi0JCQkJY2FsbCAjY3R4X3hmZXIKKwkJCQljYWxsKGN0eF94ZmVyKQogCQkJCXBvcCAkcjIKLQkJCQltb3YgJHIxIDB4YjAwCi0JCQkJc2hsIGIzMiAkcjEgNgotCQkJCWlvd3IgSVskcjFdICRyMgorCQkJCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfQ0hBTl9BRERSLCAwLCAkcjIpCiAJCQkJYnJhICNjaHN3X2RvbmUKIAkJY2hzd19ub19wcmV2OgogCQkJeGJpdCAkcjMgJHIyIDMxCiAJCQlicmEgZSAjY2hzd19kb25lCiAJCQkJYnNldCAkZmxhZ3MgJHAxCiAJCQkJYmNsciAkZmxhZ3MgJHAyCi0JCQkJY2FsbCAjY3R4X3hmZXIKKwkJCQljYWxsKGN0eF94ZmVyKQogCiAJCS8vIGFjayB0aGUgY29udGV4dCBzd2l0Y2ggcmVxdWVzdAogCQljaHN3X2RvbmU6Ci0JCW1vdiAkcjEgMHhiMGMKLQkJc2hsIGIzMiAkcjEgNgotCQltb3YgJHIyIDEKLQkJaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIDB4NDA5YjBjCisJCW1vdiAkcjIgTlZfUEdSQVBIX0ZFQ1NfQ0hTV19BQ0sKKwkJbnZfaW93cihOVl9QR1JBUEhfRkVDU19DSFNXLCAwLCAkcjIpCiAJCXRyYWNlX2NscihUX0FVVE8pCiAJCWJyYSAjbWFpbgogCkBAIC0yNzksNyArMjc4LDcgQEAKIAljbXB1IGIzMiAkcjE0IDB4MDAwMQogCWJyYSBuZSAjbWFpbl9ub3RfY3R4X2NoYW4KIAkJbW92IGIzMiAkcjIgJHIxNQotCQljYWxsICNjdHhfY2hhbgorCQljYWxsKGN0eF9jaGFuKQogCQlicmEgI21haW5fZG9uZQogCiAJLy8gcmVxdWVzdCB0byBzdG9yZSBjdXJyZW50IGNoYW5uZWwgY29udGV4dD8KQEAgLTI4OSwxNCArMjg4LDE0IEBACiAJCXRyYWNlX3NldChUX1NBVkUpCiAJCWJjbHIgJGZsYWdzICRwMQogCQliY2xyICRmbGFncyAkcDIKLQkJY2FsbCAjY3R4X3hmZXIKKwkJY2FsbChjdHhfeGZlcikKIAkJdHJhY2VfY2xyKFRfU0FWRSkKIAkJYnJhICNtYWluX2RvbmUKIAogCW1haW5fbm90X2N0eF9zYXZlOgogCQlzaGwgYjMyICRyMTUgJHIxNCAxNgogCQlvciAkcjE1IEVfQkFEX0NPTU1BTkQKLQkJY2FsbCAjZXJyb3IKKwkJY2FsbChlcnJvcikKIAkJYnJhICNtYWluCiAKIAltYWluX2RvbmU6CkBAIC0zMTksNDEgKzMxOCw0NiBAQAogCWNsZWFyIGIzMiAkcjAKIAogCS8vIGluY29taW5nIGZpZm8gY29tbWFuZD8KLQlpb3JkICRyMTAgSVskcjAgKyAweDIwMF0JLy8gSU5UUgotCWFuZCAkcjExICRyMTAgMHgwMDAwMDAwNAorCW52X2lvcmQoJHIxMCwgTlZfUEdSQVBIX0ZFQ1NfSU5UUiwgMCkKKwlhbmQgJHIxMSAkcjEwIE5WX1BHUkFQSF9GRUNTX0lOVFJfRklGTwogCWJyYSBlICNpaF9ub19maWZvCiAJCS8vIHF1ZXVlIGluY29taW5nIGZpZm8gY29tbWFuZCBmb3IgbGF0ZXIgcHJvY2Vzc2luZwotCQltb3YgJHIxMSAweDE5MDAKIAkJbW92ICRyMTMgI2NtZF9xdWV1ZQotCQlpb3JkICRyMTQgSVskcjExICsgMHgxMDBdCS8vIEZJRk9fQ01ECi0JCWlvcmQgJHIxNSBJWyRyMTEgKyAweDAwMF0JLy8gRklGT19EQVRBCi0JCWNhbGwgI3F1ZXVlX3B1dAorCQludl9pb3JkKCRyMTQsIE5WX1BHUkFQSF9GRUNTX0ZJRk9fQ01ELCAwKQorCQludl9pb3JkKCRyMTUsIE5WX1BHUkFQSF9GRUNTX0ZJRk9fREFUQSwgMCkKKwkJY2FsbChxdWV1ZV9wdXQpCiAJCWFkZCBiMzIgJHIxMSAweDQwMAogCQltb3YgJHIxNCAxCi0JCWlvd3IgSVskcjExICsgMHgwMDBdICRyMTQJLy8gRklGT19BQ0sKKwkJbnZfaW93cihOVl9QR1JBUEhfRkVDU19GSUZPX0FDSywgMCwgJHIxNCkKIAogCS8vIGNvbnRleHQgc3dpdGNoIHJlcXVlc3Q/CiAJaWhfbm9fZmlmbzoKLQlhbmQgJHIxMSAkcjEwIDB4MDAwMDAxMDAKKwlhbmQgJHIxMSAkcjEwIE5WX1BHUkFQSF9GRUNTX0lOVFJfQ0hTVwogCWJyYSBlICNpaF9ub19jdHhzdwogCQkvLyBlbnF1ZXVlIGEgY29udGV4dCBzd2l0Y2ggZm9yIGxhdGVyIHByb2Nlc3NpbmcKIAkJbW92ICRyMTMgI2NtZF9xdWV1ZQogCQltb3YgJHIxNCAweDQwMDEKLQkJY2FsbCAjcXVldWVfcHV0CisJCWNhbGwocXVldWVfcHV0KQorCisJLy8gZmlybXdhcmUgbWV0aG9kPworCWloX25vX2N0eHN3OgorCWFuZCAkcjExICRyMTAgTlZfUEdSQVBIX0ZFQ1NfSU5UUl9GV01USEQKKwlicmEgZSAjaWhfbm9fZndtdGhkCisJCS8vIG5vbmUgd2UgaGFuZGxlLCBhY2ssIGFuZCBmYWxsLXRocm91Z2ggdG8gdW5oYW5kbGVkCisJCW1vdiAkcjExIDB4MTAwCisJCW52X3dyMzIoMHg0MDAxNDQsICRyMTEpCiAKIAkvLyBhbnl0aGluZyB3ZSBkaWRuJ3QgaGFuZGxlLCBicmluZyBpdCB0byB0aGUgaG9zdCdzIGF0dGVudGlvbgotCWloX25vX2N0eHN3OgotCW1vdiAkcjExIDB4MTA0CisJaWhfbm9fZndtdGhkOgorCW1vdiAkcjExIDB4MTA0IC8vIEZJRk8gfCBDSFNXCiAJbm90IGIzMiAkcjExCiAJYW5kICRyMTEgJHIxMCAkcjExCiAJYnJhIGUgI2loX25vX290aGVyCi0JCW1vdiAkcjEwIDB4YzFjCi0JCXNobCBiMzIgJHIxMCA2Ci0JCWlvd3IgSVskcjEwXSAkcjExCS8vIElOVFJfVVBfU0VUCisJCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSU5UUl9VUF9TRVQsIDAsICRyMTEpCiAKIAkvLyBhY2ssIGFuZCB3YWtlIHVwIG1haW4oKQogCWloX25vX290aGVyOgotCWlvd3IgSVskcjAgKyAweDEwMF0gJHIxMAkvLyBJTlRSX0FDSworCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfSU5UUl9BQ0ssIDAsICRyMTApCiAKIAlwb3AgJHIxNQogCXBvcCAkcjE0CkBAIC0zNzAsMTIgKzM3NCwxMCBAQAogI2lmIENISVBTRVQgPCBHSzEwMAogLy8gTm90IHJlYWwgc3VyZSwgYnV0LCBNRU1fQ01EIDcgd2lsbCBoYW5nIGZvcmV2ZXIgaWYgdGhpcyBpc24ndCBkb25lCiBjdHhfNDE2MHM6Ci0JbW92ICRyMTQgMHg0MTYwCi0Jc2V0aGkgJHIxNCAweDQwMDAwMAogCW1vdiAkcjE1IDEKLQljYWxsICNudl93cjMyCisJbnZfd3IzMigweDQwNDE2MCwgJHIxNSkKIAljdHhfNDE2MHNfd2FpdDoKLQkJY2FsbCAjbnZfcmQzMgorCQludl9yZDMyKCRyMTUsIDB4NDA0MTYwKQogCQl4Yml0ICRyMTUgJHIxNSA0CiAJCWJyYSBlICNjdHhfNDE2MHNfd2FpdAogCXJldApAQCAtMzg0LDEwICszODYsOCBAQAogLy8gdG8gaGFuZyB3aXRoIFNUQVRVUz0weDAwMDAwMDA3IHVudGlsIGl0J3MgY2xlYXJlZC4uIGZiY29uIGNhbgogLy8gc3RpbGwgZnVuY3Rpb24gd2l0aCBpdCBzZXQgaG93ZXZlci4uLgogY3R4XzQxNjBjOgotCW1vdiAkcjE0IDB4NDE2MAotCXNldGhpICRyMTQgMHg0MDAwMDAKIAljbGVhciBiMzIgJHIxNQotCWNhbGwgI252X3dyMzIKKwludl93cjMyKDB4NDA0MTYwLCAkcjE1KQogCXJldAogI2VuZGlmCiAKQEAgLTM5NiwxOCArMzk2LDE0IEBACiAvLyBJbjogJHIxNSB2YWx1ZSB0byBzZXQgMHg0MDQxNzAgdG8KIC8vCiBjdHhfNDE3MHM6Ci0JbW92ICRyMTQgMHg0MTcwCi0Jc2V0aGkgJHIxNCAweDQwMDAwMAogCW9yICRyMTUgMHgxMAotCWNhbGwgI252X3dyMzIKKwludl93cjMyKDB4NDA0MTcwLCAkcjE1KQogCXJldAogCiAvLyBXYWl0cyBmb3IgYSBjdHhfNDE3MHMoKSBjYWxsIHRvIGNvbXBsZXRlCiAvLwogY3R4XzQxNzB3OgotCW1vdiAkcjE0IDB4NDE3MAotCXNldGhpICRyMTQgMHg0MDAwMDAKLQljYWxsICNudl9yZDMyCisJbnZfcmQzMigkcjE1LCAweDQwNDE3MCkKIAlhbmQgJHIxNSAweDEwCiAJYnJhIG5lICNjdHhfNDE3MHcKIAlyZXQKQEAgLTQxOSwxNiArNDE1LDE4IEBACiAvLyBmdW5ueSB0aGluZ3MgaGFwcGVuLgogLy8KIGN0eF9yZWRzd2l0Y2g6Ci0JbW92ICRyMTQgMHg2MTQKLQlzaGwgYjMyICRyMTQgNgotCW1vdiAkcjE1IDB4MjcwCi0JaW93ciBJWyRyMTRdICRyMTUJLy8gSFVCX1JFRF9TV0lUQ0ggPSBFTkFCTEVfR1BDLCBQT1dFUl9BTEwKKwltb3YgJHIxNCBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX0VOQUJMRV9HUEMKKwlvciAgJHIxNCBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BPV0VSX1JPUAorCW9yICAkcjE0IE5WX1BHUkFQSF9GRUNTX1JFRF9TV0lUQ0hfUE9XRVJfR1BDCisJb3IgICRyMTQgTlZfUEdSQVBIX0ZFQ1NfUkVEX1NXSVRDSF9QT1dFUl9NQUlOCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19SRURfU1dJVENILCAwLCAkcjE0KQogCW1vdiAkcjE1IDgKIAljdHhfcmVkc3dpdGNoX2RlbGF5OgogCQlzdWIgYjMyICRyMTUgMQogCQlicmEgbmUgI2N0eF9yZWRzd2l0Y2hfZGVsYXkKLQltb3YgJHIxNSAweDc3MAotCWlvd3IgSVskcjE0XSAkcjE1CS8vIEhVQl9SRURfU1dJVENIID0gRU5BQkxFX0FMTCwgUE9XRVJfQUxMCisJb3IgICRyMTQgTlZfUEdSQVBIX0ZFQ1NfUkVEX1NXSVRDSF9FTkFCTEVfUk9QCisJb3IgICRyMTQgTlZfUEdSQVBIX0ZFQ1NfUkVEX1NXSVRDSF9FTkFCTEVfTUFJTgorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfUkVEX1NXSVRDSCwgMCwgJHIxNCkKIAlyZXQKIAogLy8gTm90IGEgY2x1ZSB3aGF0IHRoaXMgaXMgZm9yLCBleGNlcHQgdGhhdCB1bmxlc3MgdGhlIHZhbHVlIGlzIDB4MTAsIHRoZQpAQCAtNDM3LDE1ICs0MzUsMTggQEAKIC8vIEluOiAkcjE1IHZhbHVlIHRvIHNldCB0byAoMHgwMC8weDEwIGFyZSB1c2VkKQogLy8KIGN0eF84NmM6Ci0JbW92ICRyMTQgMHg4NmMKLQlzaGwgYjMyICRyMTQgNgotCWlvd3IgSVskcjE0XSAkcjE1CS8vIEhVQigweDg2YykgPSB2YWwKLQltb3YgJHIxNCAtMHg3NWVjCi0Jc2V0aGkgJHIxNCAweDQwMDAwMAotCWNhbGwgI252X3dyMzIJCS8vIFJPUCgweGExNCkgPSB2YWwKLQltb3YgJHIxNCAtMHg1Nzk0Ci0Jc2V0aGkgJHIxNCAweDQxMDAwMAotCWNhbGwgI252X3dyMzIJCS8vIEdQQygweDg2YykgPSB2YWwKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX1VOSzg2QywgMCwgJHIxNSkKKwludl93cjMyKDB4NDA4YTE0LCAkcjE1KQorCW52X3dyMzIoTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfVU5LODZDLCAkcjE1KQorCXJldAorCisvLyBJbjogJHIxNSBOVl9QR1JBUEhfRkVDU19NRU1fQ01EXyoKK2N0eF9tZW06CisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NRU1fQ01ELCAwLCAkcjE1KQorCWN0eF9tZW1fd2FpdDoKKwkJbnZfaW9yZCgkcjE1LCBOVl9QR1JBUEhfRkVDU19NRU1fQ01ELCAwKQorCQlvciAkcjE1ICRyMTUKKwkJYnJhIG5lICNjdHhfbWVtX3dhaXQKIAlyZXQKIAogLy8gY3R4X2xvYWQgLSBsb2FkJ3MgYSBjaGFubmVsJ3MgY3R4Y3RsIGRhdGEsIGFuZCBzZWxlY3RzIGl0cyB2bQpAQCAtNDU3LDIzICs0NTgsMTQgQEAKIAogCS8vIHN3aXRjaCB0byBjaGFubmVsLCBzb21ld2hhdCBtYWdpYyBpbiBwYXJ0cy4uCiAJbW92ICRyMTAgMTIJCS8vIERPTkVfVU5LMTIKLQljYWxsICN3YWl0X2RvbmV6Ci0JbW92ICRyMSAweGEyNAotCXNobCBiMzIgJHIxIDYKLQlpb3dyIElbJHIxICsgMHgwMDBdICRyMAkvLyAweDQwOWEyNAotCW1vdiAkcjMgMHhiMDAKLQlzaGwgYjMyICRyMyA2Ci0JaW93ciBJWyRyMyArIDB4MTAwXSAkcjIJLy8gQ0hBTl9ORVhUCi0JbW92ICRyMSAweGEwYwotCXNobCBiMzIgJHIxIDYKLQltb3YgJHI0IDcKLQlpb3dyIElbJHIxICsgMHgwMDBdICRyMiAvLyBNRU1fQ0hBTgotCWlvd3IgSVskcjEgKyAweDEwMF0gJHI0CS8vIE1FTV9DTUQKLQljdHhfY2hhbl93YWl0XzA6Ci0JCWlvcmQgJHI0IElbJHIxICsgMHgxMDBdCi0JCWFuZCAkcjQgMHgxZgotCQlicmEgbmUgI2N0eF9jaGFuX3dhaXRfMAotCWlvd3IgSVskcjMgKyAweDAwMF0gJHIyCS8vIENIQU5fQ1VSCisJY2FsbCh3YWl0X2RvbmV6KQorCWNsZWFyIGIzMiAkcjE1CisJbnZfaW93cigweDQwOWEyNCwgMCwgJHIxNSkKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0NIQU5fTkVYVCwgMCwgJHIyKQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTUVNX0NIQU4sIDAsICRyMikKKwltb3YgJHIxNSBOVl9QR1JBUEhfRkVDU19NRU1fQ01EX0xPQURfQ0hBTgorCWNhbGwoY3R4X21lbSkKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX0NIQU5fQUREUiwgMCwgJHIyKQogCiAJLy8gbG9hZCBjaGFubmVsIGhlYWRlciwgZmV0Y2ggUEdSQVBIIGNvbnRleHQgcG9pbnRlcgogCW1vdiAkeHRhcmdldHMgJHIwCkBAIC00ODIsMTQgKzQ3NCwxMCBAQAogCWFkZCBiMzIgJHIyIDIKIAogCXRyYWNlX3NldChUX0xDSEFOKQotCW1vdiAkcjEgMHhhMDQKLQlzaGwgYjMyICRyMSA2Ci0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIE1FTV9CQVNFCi0JbW92ICRyMSAweGEyMAotCXNobCBiMzIgJHIxIDYKLQltb3YgJHIyIDB4MDAwMgotCXNldGhpICRyMiAweDgwMDAwMDAwCi0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIE1FTV9UQVJHRVQgPSB2cmFtCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NRU1fQkFTRSwgMCwgJHIyKQorCWltbTMyKCRyMiwgTlZfUEdSQVBIX0ZFQ1NfTUVNX1RBUkdFVF9VTkszMSkKKwlvciAgJHIyIE5WX1BHUkFQSF9GRUNTX01FTV9UQVJHRVRfQVNfVlJBTQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTUVNX1RBUkdFVCwgMCwgJHIyKQogCW1vdiAkcjEgMHgxMAkJCS8vIGNoYW4gKyAweDAyMTAKIAltb3YgJHIyICN4ZmVyX2RhdGEKIAlzZXRoaSAkcjIgMHgwMDAyMDAwMAkJLy8gMTYgYnl0ZXMKQEAgLTUwNywxMyArNDk1LDkgQEAKIAogCS8vIHNldCB0cmFuc2ZlciBiYXNlIHRvIHN0YXJ0IG9mIGNvbnRleHQsIGFuZCBmZXRjaCBjb250ZXh0IGhlYWRlcgogCXRyYWNlX3NldChUX0xDVFhIKQotCW1vdiAkcjIgMHhhMDQKLQlzaGwgYjMyICRyMiA2Ci0JaW93ciBJWyRyMiArIDB4MDAwXSAkcjEJCS8vIE1FTV9CQVNFCi0JbW92ICRyMiAxCi0JbW92ICRyMSAweGEyMAotCXNobCBiMzIgJHIxIDYKLQlpb3dyIElbJHIxICsgMHgwMDBdICRyMgkJLy8gTUVNX1RBUkdFVCA9IHZtCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19NRU1fQkFTRSwgMCwgJHIxKQorCW1vdiAkcjIgTlZfUEdSQVBIX0ZFQ1NfTUVNX1RBUkdFVF9BU19WTQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTUVNX1RBUkdFVCwgMCwgJHIyKQogCW1vdiAkcjEgI2NoYW5fZGF0YQogCXNldGhpICRyMSAweDAwMDYwMDAwCQkvLyAyNTYgYnl0ZXMKIAl4ZGxkICRyMCAkcjEKQEAgLTUzMiwyMSArNTE2LDE1IEBACiAvLwogY3R4X2NoYW46CiAjaWYgQ0hJUFNFVCA8IEdLMTAwCi0JY2FsbCAjY3R4XzQxNjBzCisJY2FsbChjdHhfNDE2MHMpCiAjZW5kaWYKLQljYWxsICNjdHhfbG9hZAorCWNhbGwoY3R4X2xvYWQpCiAJbW92ICRyMTAgMTIJCQkvLyBET05FX1VOSzEyCi0JY2FsbCAjd2FpdF9kb25legotCW1vdiAkcjEgMHhhMTAKLQlzaGwgYjMyICRyMSA2Ci0JbW92ICRyMiA1Ci0JaW93ciBJWyRyMSArIDB4MDAwXSAkcjIJCS8vIE1FTV9DTUQgPSA1ICg/Pz8pCi0JY3R4X2NoYW5fd2FpdDoKLQkJaW9yZCAkcjIgSVskcjEgKyAweDAwMF0KLQkJb3IgJHIyICRyMgotCQlicmEgbmUgI2N0eF9jaGFuX3dhaXQKKwljYWxsKHdhaXRfZG9uZXopCisJbW92ICRyMTUgNSAvLyBNRU1fQ01EIDUgPz8/CisJY2FsbChjdHhfbWVtKQogI2lmIENISVBTRVQgPCBHSzEwMAotCWNhbGwgI2N0eF80MTYwYworCWNhbGwoY3R4XzQxNjBjKQogI2VuZGlmCiAJcmV0CiAKQEAgLTU2Miw5ICs1NDAsNyBAQAogY3R4X21taW9fZXhlYzoKIAkvLyBzZXQgdHJhbnNmZXIgYmFzZSB0byBiZSB0aGUgbW1pbyBsaXN0CiAJbGQgYjMyICRyMyBEWyRyMCArICNjaGFuX21taW9fYWRkcmVzc10KLQltb3YgJHIyIDB4YTA0Ci0Jc2hsIGIzMiAkcjIgNgotCWlvd3IgSVskcjIgKyAweDAwMF0gJHIzCQkvLyBNRU1fQkFTRQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfTUVNX0JBU0UsIDAsICRyMykKIAogCWNsZWFyIGIzMiAkcjMKIAljdHhfbW1pb19sb29wOgpAQCAtNTgwLDcgKzU1Niw3IEBACiAJCWN0eF9tbWlvX3B1bGw6CiAJCWxkIGIzMiAkcjE0IERbJHI0ICsgI3hmZXJfZGF0YSArIDB4MDBdCiAJCWxkIGIzMiAkcjE1IERbJHI0ICsgI3hmZXJfZGF0YSArIDB4MDRdCi0JCWNhbGwgI252X3dyMzIKKwkJY2FsbChudl93cjMyKQogCiAJCS8vIG5leHQhCiAJCWFkZCBiMzIgJHIzIDgKQEAgLTU5MCw3ICs1NjYsNyBAQAogCS8vIHNldCB0cmFuc2ZlciBiYXNlIGJhY2sgdG8gdGhlIGN1cnJlbnQgY29udGV4dAogCWN0eF9tbWlvX2RvbmU6CiAJbGQgYjMyICRyMyBEWyRyMCArICNjdHhfY3VycmVudF0KLQlpb3dyIElbJHIyICsgMHgwMDBdICRyMwkJLy8gTUVNX0JBU0UKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX01FTV9CQVNFLCAwLCAkcjMpCiAKIAkvLyBkaXNhYmxlIHRoZSBtbWlvIGxpc3Qgbm93LCB3ZSBkb24ndCBuZWVkL3dhbnQgdG8gZXhlY3V0ZSBpdCBhZ2FpbgogCXN0IGIzMiBEWyRyMCArICNjaGFuX21taW9fY291bnRdICRyMApAQCAtNjEwLDEyICs1ODYsMTAgQEAKIC8vCiBjdHhfeGZlcjoKIAkvLyBhY2NvcmRpbmcgdG8gbXdrLCBzb21lIGtpbmQgb2Ygd2FpdCBmb3IgaWRsZQotCW1vdiAkcjE1IDB4YzAwCi0Jc2hsIGIzMiAkcjE1IDYKIAltb3YgJHIxNCA0Ci0JaW93ciBJWyRyMTUgKyAweDIwMF0gJHIxNAorCW52X2lvd3IoMHg0MDljMDgsIDAsICRyMTQpCiAJY3R4X3hmZXJfaWRsZToKLQkJaW9yZCAkcjE0IElbJHIxNSArIDB4MDAwXQorCQludl9pb3JkKCRyMTQsIDB4NDA5YzAwLCAwKQogCQlhbmQgJHIxNCAweDIwMDAKIAkJYnJhIG5lICNjdHhfeGZlcl9pZGxlCiAKQEAgLTYyMyw1MCArNTk3LDQyIEBACiAJYnJhICRwMiAjY3R4X3hmZXJfcHJlX2xvYWQKIAljdHhfeGZlcl9wcmU6CiAJCW1vdiAkcjE1IDB4MTAKLQkJY2FsbCAjY3R4Xzg2YworCQljYWxsKGN0eF84NmMpCiAjaWYgQ0hJUFNFVCA8IEdLMTAwCi0JCWNhbGwgI2N0eF80MTYwcworCQljYWxsKGN0eF80MTYwcykKICNlbmRpZgogCQlicmEgbm90ICRwMSAjY3R4X3hmZXJfZXhlYwogCiAJY3R4X3hmZXJfcHJlX2xvYWQ6CiAJCW1vdiAkcjE1IDIKLQkJY2FsbCAjY3R4XzQxNzBzCi0JCWNhbGwgI2N0eF80MTcwdwotCQljYWxsICNjdHhfcmVkc3dpdGNoCisJCWNhbGwoY3R4XzQxNzBzKQorCQljYWxsKGN0eF80MTcwdykKKwkJY2FsbChjdHhfcmVkc3dpdGNoKQogCQljbGVhciBiMzIgJHIxNQotCQljYWxsICNjdHhfNDE3MHMKLQkJY2FsbCAjY3R4X2xvYWQKKwkJY2FsbChjdHhfNDE3MHMpCisJCWNhbGwoY3R4X2xvYWQpCiAKIAkvLyBmZXRjaCBjb250ZXh0IHBvaW50ZXIsIGFuZCBpbml0aWF0ZSB4ZmVyIG9uIGFsbCBHUENzCiAJY3R4X3hmZXJfZXhlYzoKIAlsZCBiMzIgJHIxIERbJHIwICsgI2N0eF9jdXJyZW50XQotCW1vdiAkcjIgMHg0MTQKLQlzaGwgYjMyICRyMiA2Ci0JaW93ciBJWyRyMiArIDB4MDAwXSAkcjAJLy8gQkFSX1NUQVRVUyA9IHJlc2V0Ci0JbW92ICRyMTQgLTB4NWIwMAotCXNldGhpICRyMTQgMHg0MTAwMDAKLQltb3YgYjMyICRyMTUgJHIxCi0JY2FsbCAjbnZfd3IzMgkJLy8gR1BDX0JDQVNUX1dSQ01EX0RBVEEgPSBjdHggcG9pbnRlcgotCWFkZCBiMzIgJHIxNCA0CisKKwljbGVhciBiMzIgJHIyCisJbnZfaW93cihOVl9QR1JBUEhfRkVDU19CQVIsIDAsICRyMikKKworCW52X3dyMzIoMHg0MWE1MDAsICRyMSkJLy8gR1BDX0JDQVNUX1dSQ01EX0RBVEEgPSBjdHggcG9pbnRlcgogCXhiaXQgJHIxNSAkZmxhZ3MgJHAxCiAJeGJpdCAkcjIgJGZsYWdzICRwMgogCXNobCBiMzIgJHIyIDEKIAlvciAkcjE1ICRyMgotCWNhbGwgI252X3dyMzIJCS8vIEdQQ19CQ0FTVF9XUkNNRF9DTUQgPSBHUENfWEZFUih0eXBlKQorCW52X3dyMzIoMHg0MWE1MDQsICRyMTUpCS8vIEdQQ19CQ0FTVF9XUkNNRF9DTUQgPSBHUENfWEZFUih0eXBlKQogCiAJLy8gc3RyYW5kcwotCW1vdiAkcjEgMHg0YWZjCi0Jc2V0aGkgJHIxIDB4MjAwMDAKLQltb3YgJHIyIDB4YwotCWlvd3IgSVskcjFdICRyMgkJLy8gU1RSQU5EX0NNRCgweDNmKSA9IDB4MGMKLQljYWxsICNzdHJhbmRfd2FpdAotCW1vdiAkcjIgMHg0N2ZjCi0Jc2V0aGkgJHIyIDB4MjAwMDAKLQlpb3dyIElbJHIyXSAkcjAJCS8vIFNUUkFORF9GSVJTVF9HRU5FKDB4M2YpID0gMHgwMAotCXhiaXQgJHIyICRmbGFncyAkcDEKLQlhZGQgYjMyICRyMiAzCi0JaW93ciBJWyRyMV0gJHIyCQkvLyBTVFJBTkRfQ01EKDB4M2YpID0gMHgwMy8weDA0IChTQVZFL0xPQUQpCisJY2FsbChzdHJhbmRfcHJlKQorCWNsZWFyIGIzMiAkcjIKKwludl9pb3dyKE5WX1BHUkFQSF9GRUNTX1NUUkFORF9TRUxFQ1QsIDB4M2YsICRyMikKKwl4Yml0ICRyMiAkZmxhZ3MgJHAxCS8vIFNBVkUvTE9BRAorCWFkZCBiMzIgJHIyIE5WX1BHUkFQSF9GRUNTX1NUUkFORF9DTURfU0FWRQorCW52X2lvd3IoTlZfUEdSQVBIX0ZFQ1NfU1RSQU5EX0NNRCwgMHgzZiwgJHIyKQogCiAJLy8gbW1pbyBjb250ZXh0CiAJeGJpdCAkcjEwICRmbGFncyAkcDEJLy8gZGlyZWN0aW9uCkBAIC02NzUsNDggKzY0MSw0MiBAQAogCWxkIGIzMiAkcjEyIERbJHIwICsgI2h1Yl9tbWlvX2xpc3RfaGVhZF0KIAlsZCBiMzIgJHIxMyBEWyRyMCArICNodWJfbW1pb19saXN0X3RhaWxdCiAJbW92ICRyMTQgMAkJLy8gbm90IG11bHRpCi0JY2FsbCAjbW1jdHhfeGZlcgorCWNhbGwobW1jdHhfeGZlcikKIAogCS8vIHdhaXQgZm9yIEdQQ3MgdG8gYWxsIGNvbXBsZXRlCiAJbW92ICRyMTAgOAkJLy8gRE9ORV9CQVIKLQljYWxsICN3YWl0X2RvbmVvCisJY2FsbCh3YWl0X2RvbmVvKQogCiAJLy8gd2FpdCBmb3Igc3RyYW5kIHhmZXIgdG8gY29tcGxldGUKLQljYWxsICNzdHJhbmRfd2FpdAorCWNhbGwoc3RyYW5kX3dhaXQpCiAKIAkvLyBwb3N0LW9wCiAJYnJhICRwMSAjY3R4X3hmZXJfcG9zdAogCQltb3YgJHIxMCAxMgkJLy8gRE9ORV9VTksxMgotCQljYWxsICN3YWl0X2RvbmV6Ci0JCW1vdiAkcjEgMHhhMTAKLQkJc2hsIGIzMiAkcjEgNgotCQltb3YgJHIyIDUKLQkJaW93ciBJWyRyMV0gJHIyCQkvLyBNRU1fQ01ECi0JCWN0eF94ZmVyX3Bvc3Rfc2F2ZV93YWl0OgotCQkJaW9yZCAkcjIgSVskcjFdCi0JCQlvciAkcjIgJHIyCi0JCQlicmEgbmUgI2N0eF94ZmVyX3Bvc3Rfc2F2ZV93YWl0CisJCWNhbGwod2FpdF9kb25leikKKwkJbW92ICRyMTUgNSAvLyBNRU1fQ01EIDUgPz8/CisJCWNhbGwoY3R4X21lbSkKIAogCWJyYSAkcDIgI2N0eF94ZmVyX2RvbmUKIAljdHhfeGZlcl9wb3N0OgogCQltb3YgJHIxNSAyCi0JCWNhbGwgI2N0eF80MTcwcworCQljYWxsKGN0eF80MTcwcykKIAkJY2xlYXIgYjMyICRyMTUKLQkJY2FsbCAjY3R4Xzg2YwotCQljYWxsICNzdHJhbmRfcG9zdAotCQljYWxsICNjdHhfNDE3MHcKKwkJY2FsbChjdHhfODZjKQorCQljYWxsKHN0cmFuZF9wb3N0KQorCQljYWxsKGN0eF80MTcwdykKIAkJY2xlYXIgYjMyICRyMTUKLQkJY2FsbCAjY3R4XzQxNzBzCisJCWNhbGwoY3R4XzQxNzBzKQogCiAJCWJyYSBub3QgJHAxICNjdHhfeGZlcl9ub19wb3N0X21taW8KIAkJbGQgYjMyICRyMSBEWyRyMCArICNjaGFuX21taW9fY291bnRdCiAJCW9yICRyMSAkcjEKIAkJYnJhIGUgI2N0eF94ZmVyX25vX3Bvc3RfbW1pbwotCQkJY2FsbCAjY3R4X21taW9fZXhlYworCQkJY2FsbChjdHhfbW1pb19leGVjKQogCiAJCWN0eF94ZmVyX25vX3Bvc3RfbW1pbzoKICNpZiBDSElQU0VUIDwgR0sxMDAKLQkJY2FsbCAjY3R4XzQxNjBjCisJCWNhbGwoY3R4XzQxNjBjKQogI2VuZGlmCiAKIAljdHhfeGZlcl9kb25lOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52MTA4LmZ1YzUgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnYxMDguZnVjNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzVkMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52MTA4LmZ1YzUKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MgPGJza2VnZ3NAcmVkaGF0LmNvbT4KKyAqLworCisjZGVmaW5lIENISVBTRVQgR0syMDgKKyNpbmNsdWRlICJtYWNyb3MuZnVjIgorCisuc2VjdGlvbiAjbnYxMDhfZ3JodWJfZGF0YQorI2RlZmluZSBJTkNMVURFX0RBVEEKKyNpbmNsdWRlICJjb20uZnVjIgorI2luY2x1ZGUgImh1Yi5mdWMiCisjdW5kZWYgSU5DTFVERV9EQVRBCisKKy5zZWN0aW9uICNudjEwOF9ncmh1Yl9jb2RlCisjZGVmaW5lIElOQ0xVREVfQ09ERQorYnJhICNpbml0CisjaW5jbHVkZSAiY29tLmZ1YyIKKyNpbmNsdWRlICJodWIuZnVjIgorLmFsaWduIDI1NgorI3VuZGVmIElOQ0xVREVfQ09ERQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52MTA4LmZ1YzUuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudjEwOC5mdWM1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MDk4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudjEwOC5mdWM1LmgKQEAgLTAsMCArMSw5MTYgQEAKK3VpbnQzMl90IG52MTA4X2dyaHViX2RhdGFbXSA9IHsKKy8qIDB4MDAwMDogaHViX21taW9fbGlzdF9oZWFkICovCisJMHgwMDAwMDMwMCwKKy8qIDB4MDAwNDogaHViX21taW9fbGlzdF90YWlsICovCisJMHgwMDAwMDMwNCwKKy8qIDB4MDAwODogZ3BjX2NvdW50ICovCisJMHgwMDAwMDAwMCwKKy8qIDB4MDAwYzogcm9wX2NvdW50ICovCisJMHgwMDAwMDAwMCwKKy8qIDB4MDAxMDogY21kX3F1ZXVlICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisvKiAweDAwNTg6IGN0eF9jdXJyZW50ICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisvKiAweDAxMDA6IGNoYW5fZGF0YSAqLworLyogMHgwMTAwOiBjaGFuX21taW9fY291bnQgKi8KKwkweDAwMDAwMDAwLAorLyogMHgwMTA0OiBjaGFuX21taW9fYWRkcmVzcyAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorLyogMHgwMjAwOiB4ZmVyX2RhdGEgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorLyogMHgwMzAwOiBodWJfbW1pb19saXN0X2Jhc2UgKi8KKwkweDA0MTdlOTFjLAorfTsKKwordWludDMyX3QgbnYxMDhfZ3JodWJfY29kZVtdID0geworCTB4MDMwZTBlZjUsCisvKiAweDAwMDQ6IHF1ZXVlX3B1dCAqLworCTB4OTgwMGQ4OTgsCisJMHg4NmYwMDFkOSwKKwkweGY0ODlhNDA4LAorCTB4MDIwZjBiMWIsCisJMHgwMDAyZjg3ZSwKKy8qIDB4MDAxYTogcXVldWVfcHV0X25leHQgKi8KKwkweDk4YzQwMGY4LAorCTB4MDM4NGI2MDcsCisJMHhiNjAwOGRiYiwKKwkweDhlYjUwODgwLAorCTB4MDE4ZmI1MDAsCisJMHhmMDAxOTBiNiwKKwkweGQ5YjUwZjk0LAorLyogMHgwMDM3OiBxdWV1ZV9nZXQgKi8KKwkweGY0MDBmODAxLAorCTB4ZDg5ODAxMzEsCisJMHgwMWQ5OTgwMCwKKwkweDBiZjQ4OWE0LAorCTB4MDc4OWM0MjEsCisJMHhiYjAzOTRiNiwKKwkweDkwYjYwMDlkLAorCTB4MDA5ZTk4MDgsCisJMHhiNjAxOWY5OCwKKwkweDg0ZjAwMTgwLAorCTB4MDBkOGI1MGYsCisvKiAweDAwNjM6IHF1ZXVlX2dldF9kb25lICovCisJMHhmODAxMzJmNCwKKy8qIDB4MDA2NTogbnZfcmQzMiAqLworCTB4ZjBlY2IyMDAsCisJMHgwMDgwMWZjOSwKKwkweDBjZjYwMWNhLAorLyogMHgwMDczOiBudl9yZDMyX3dhaXQgKi8KKwkweDhjMDRiZDAwLAorCTB4Y2YwMWNhMDAsCisJMHhjY2M4MDBjYywKKwkweGY2MWJmNDFmLAorCTB4ZWM3ZTA2MGEsCisJMHgwMDhmMDAwMCwKKwkweGZmY2YwMWNiLAorLyogMHgwMDhmOiBudl93cjMyICovCisJMHg4MDAwZjgwMCwKKwkweGY2MDFjYzAwLAorCTB4MDRiZDAwMGYsCisJMHhjOWYwZWNiMiwKKwkweDFlYzlmMDFmLAorCTB4MDFjYTAwODAsCisJMHhiZDAwMGNmNiwKKy8qIDB4MDBhOTogbnZfd3IzMl93YWl0ICovCisJMHhjYTAwOGMwNCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHgwMGY4ZjYxYiwKKy8qIDB4MDBiODogd2FpdF9kb25leiAqLworCTB4OTlmMDk0YmQsCisJMHgzNzAwODAwMCwKKwkweDAwMDlmNjAyLAorCTB4MDA4MDA0YmQsCisJMHgwYWY2MDIwNiwKKy8qIDB4MDBjZjogd2FpdF9kb25lel9uZSAqLworCTB4ODgwNGJkMDAsCisJMHhjZjAxMDAwMCwKKwkweDhhZmYwMDg4LAorCTB4ZjYxYmY0ODgsCisJMHg5OWYwOTRiZCwKKwkweDE3MDA4MDAwLAorCTB4MDAwOWY2MDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDBlYzogd2FpdF9kb25lbyAqLworCTB4OTlmMDk0YmQsCisJMHgzNzAwODAwMCwKKwkweDAwMDlmNjAyLAorCTB4MDA4MDA0YmQsCisJMHgwYWY2MDIwNiwKKy8qIDB4MDEwMzogd2FpdF9kb25lb19lICovCisJMHg4ODA0YmQwMCwKKwkweGNmMDEwMDAwLAorCTB4OGFmZjAwODgsCisJMHhmNjBiZjQ4OCwKKwkweDk5ZjA5NGJkLAorCTB4MTcwMDgwMDAsCisJMHgwMDA5ZjYwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTIwOiBtbWN0eF9zaXplICovCisvKiAweDAxMjI6IG52X21tY3R4X3NpemVfbG9vcCAqLworCTB4ZTg5ODk0YmQsCisJMHgxYTg1YjYwMCwKKwkweGI2MDE4MGI2LAorCTB4OThiYjAyODQsCisJMHgwNGUwYjYwMCwKKwkweDFiZjRlZmE0LAorCTB4Zjg5ZmIyZWMsCisvKiAweDAxM2Q6IG1tY3R4X3hmZXIgKi8KKwkweGYwOTRiZDAwLAorCTB4MDA4MDAxOTksCisJMHgwOWY2MDIzNywKKwkweGJkMDRiZDAwLAorCTB4MDViYmZkOTQsCisJMHg4MDBmMGJmNCwKKwkweGY2MDFjNDAwLAorCTB4MDRiZDAwMGIsCisvKiAweDAxNWY6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KKwkweGZkMDA5OWYwLAorCTB4MGJmNDA1ZWUsCisJMHhjNjAwODAxOCwKKwkweDAwMGVmNjAxLAorCTB4MDA4MDA0YmQsCisJMHgwZmY2MDFjNywKKwkweGYwMDRiZDAwLAorLyogMHgwMTdhOiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLworCTB4YWJjODAxOTksCisJMHgxMGI0YjYwMCwKKwkweGM4MGNiOWYwLAorCTB4ZTRiNjAxYWUsCisJMHgwNWJlZmQxMSwKKwkweDAxYzUwMDgwLAorCTB4YmQwMDBiZjYsCisvKiAweDAxOTU6IG1tY3R4X2V4ZWNfbG9vcCAqLworLyogMHgwMTk1OiBtbWN0eF93YWl0X2ZyZWUgKi8KKwkweGM1MDA4ZTA0LAorCTB4MDBlZWNmMDEsCisJMHhmNDFmZTRmMCwKKwkweGNlOThmNjBiLAorCTB4MDVlOWZkMDAsCisJMHgwMWM4MDA4MCwKKwkweGJkMDAwZWY2LAorCTB4MDRjMGI2MDQsCisJMHgxYmY0Y2RhNCwKKwkweDAyYWJjOGRmLAorLyogMHgwMWJmOiBtbWN0eF9maW5pX3dhaXQgKi8KKwkweDhiMWMxYmY0LAorCTB4Y2YwMWM1MDAsCisJMHhiNGYwMDBiYiwKKwkweDEwYjRiMDFmLAorCTB4MGFmMzFiZjQsCisJMHgwMGI4N2UwMiwKKwkweDI1MGVmNDAwLAorLyogMHgwMWQ4OiBtbWN0eF9zdG9wICovCisJMHhiNjAwYWJjOCwKKwkweGI5ZjAxMGI0LAorCTB4MTJiOWYwMGMsCisJMHgwMWM1MDA4MCwKKwkweGJkMDAwYmY2LAorLyogMHgwMWVkOiBtbWN0eF9zdG9wX3dhaXQgKi8KKwkweGM1MDA4YjA0LAorCTB4MDBiYmNmMDEsCisJMHhmNDEyYmJjOCwKKy8qIDB4MDFmYTogbW1jdHhfZG9uZSAqLworCTB4OTRiZGY2MWIsCisJMHg4MDAxOTlmMCwKKwkweGY2MDIxNzAwLAorCTB4MDRiZDAwMDksCisvKiAweDAyMGE6IHN0cmFuZF93YWl0ICovCisJMHhhMGY5MDBmOCwKKwkweGI4N2UwMjBhLAorCTB4YTBmYzAwMDAsCisvKiAweDAyMTY6IHN0cmFuZF9wcmUgKi8KKwkweDBjMDkwMGY4LAorCTB4MDI0YWZjODAsCisJMHhiZDAwMDlmNiwKKwkweDAyMGE3ZTA0LAorLyogMHgwMjI3OiBzdHJhbmRfcG9zdCAqLworCTB4MDkwMGY4MDAsCisJMHg0YWZjODAwZCwKKwkweDAwMDlmNjAyLAorCTB4MGE3ZTA0YmQsCisJMHgwMGY4MDAwMiwKKy8qIDB4MDIzODogc3RyYW5kX3NldCAqLworCTB4ZmM4MDBmMGMsCisJMHgwY2Y2MDI0ZiwKKwkweDBjMDRiZDAwLAorCTB4NGFmYzgwMGIsCisJMHgwMDBjZjYwMiwKKwkweGZjODAwNGJkLAorCTB4MGVmNjAyNGYsCisJMHgwYzA0YmQwMCwKKwkweDRhZmM4MDBhLAorCTB4MDAwY2Y2MDIsCisJMHgwYTdlMDRiZCwKKwkweDAwZjgwMDAyLAorLyogMHgwMjY4OiBzdHJhbmRfY3R4X2luaXQgKi8KKwkweDk5ZjA5NGJkLAorCTB4MzcwMDgwMDMsCisJMHgwMDA5ZjYwMiwKKwkweDE2N2UwNGJkLAorCTB4MDMwZTAwMDIsCisJMHgwMDAyMzg3ZSwKKwkweGZjODBjNGJkLAorCTB4MGNmNjAyNDcsCisJMHgwYzA0YmQwMCwKKwkweDRhZmM4MDAxLAorCTB4MDAwY2Y2MDIsCisJMHgwYTdlMDRiZCwKKwkweDBjOTIwMDAyLAorCTB4NDZmYzgwMDEsCisJMHgwMDBjZjYwMiwKKwkweDAyMGMwNGJkLAorCTB4MDI0YWZjODAsCisJMHhiZDAwMGNmNiwKKwkweDAyMGE3ZTA0LAorCTB4MDIyNzdlMDAsCisJMHg0MjAwODgwMCwKKwkweDIwMDA4OTAyLAorCTB4MDA5OWNmMDIsCisvKiAweDAyYzc6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCisJMHhmNjA4ZmU5NSwKKwkweDhlZjYwMDhlLAorCTB4ODA4YWNmNDAsCisJMHhiNjA2YTViNiwKKwkweGVhYmIwMWEwLAorCTB4MDQ4MGI2MDAsCisJMHhmNDAxOTJiNiwKKwkweGU0YjZlODFiLAorCTB4ZjJlZmJjMDgsCisJMHg5OWYwOTRiZCwKKwkweDE3MDA4MDAzLAorCTB4MDAwOWY2MDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDJmODogZXJyb3IgKi8KKwkweDAyMDUwMDgwLAorCTB4YmQwMDBmZjYsCisJMHg4MDAxMGYwNCwKKwkweGY2MDMwNzAwLAorCTB4MDRiZDAwMGYsCisvKiAweDAzMGU6IGluaXQgKi8KKwkweDA0YmQwMGY4LAorCTB4NDEwMDA3ZmUsCisJMHgxMWNmNDIwMCwKKwkweDA5MTFlNzAwLAorCTB4MDgxNGI2MDEsCisJMHgwMjAwMTRmZSwKKwkweDEyMDA0MDAyLAorCTB4YmQwMDAyZjYsCisJMHgwNWM5NDEwNCwKKwkweGJkMDAxMGZlLAorCTB4MDcwMDQwMjQsCisJMHhiZDAwMDJmNiwKKwkweDIwMDM0MjA0LAorCTB4MDEwMTAwODAsCisJMHhiZDAwMDJmNiwKKwkweDIwMDQ0MjA0LAorCTB4MDEwMTA0ODAsCisJMHhiZDAwMDJmNiwKKwkweDIwMGI0MjA0LAorCTB4MDEwMTA4ODAsCisJMHhiZDAwMDJmNiwKKwkweDIwMGM0MjA0LAorCTB4MDEwMTFjODAsCisJMHhiZDAwMDJmNiwKKwkweDAxMDM5MjA0LAorCTB4MDMwOTAwODAsCisJMHhiZDAwMDNmNiwKKwkweDg3MDQ0MjA0LAorCTB4ZjYwNDAwNDAsCisJMHgwNGJkMDAwMiwKKwkweDAwNDAwNDAyLAorCTB4MDAwMmY2MDMsCisJMHgzMWY0MDRiZCwKKwkweDk2MDQ4ZTEwLAorCTB4MDA2NTdlNDAsCisJMHhjN2ZlYjIwMCwKKwkweDAxYjU5MGYxLAorCTB4MWZmNGYwMDMsCisJMHgwMTAyMGZiNSwKKwkweDA0MWZiYjAxLAorCTB4ODAwMTEyYjYsCisJMHhmNjAxMDMwMCwKKwkweDA0YmQwMDAxLAorCTB4MDEwNDAwODAsCisJMHhiZDAwMDFmNiwKKwkweDAxMDA0MTA0LAorCTB4NjI3ZTAyMGYsCisJMHg3MTdlMDAwNiwKKwkweDEwMGYwMDA2LAorCTB4MDAwNmIzN2UsCisJMHg5ODAwMGU5OCwKKwkweDIwN2UwMTBmLAorCTB4MTQ5NTAwMDEsCisJMHhjMDAwODAwOCwKKwkweDAwMDRmNjAxLAorCTB4MDA4MDA0YmQsCisJMHgwNGY2MDFjMSwKKwkweGI3MDRiZDAwLAorCTB4YmIxMzAwMzAsCisJMHhmNWI2MDAxZiwKKwkweGQzMDA4MDAyLAorCTB4MDAwZmY2MDEsCisJMHgxNWI2MDRiZCwKKwkweDAxMTBiNjA4LAorCTB4YjIwODE0YjYsCisJMHgwMjY4N2UxZiwKKwkweDAwMWZiYjAwLAorCTB4ODQwMjAzOTgsCisvKiAweDA0MWY6IGluaXRfZ3BjICovCisJMHhiODUwMjAwMCwKKwkweDAwMDgwNDRlLAorCTB4OGY3ZTFmYjIsCisJMHg0ZWI4MDAwMCwKKwkweGJkMDAwMTBjLAorCTB4MDA4ZjdlZjQsCisJMHgwNDRlYjgwMCwKKwkweDhmN2UwMDAxLAorCTB4NGViODAwMDAsCisJMHgwZjAwMDEwMCwKKwkweDAwOGY3ZTAyLAorCTB4MDA0ZWI4MDAsCisvKiAweDA0NGU6IGluaXRfZ3BjX3dhaXQgKi8KKwkweDY1N2UwMDA4LAorCTB4ZmZjODAwMDAsCisJMHhmOTBiZjQxZiwKKwkweDA4MDQ0ZWI4LAorCTB4MDA2NTdlMDAsCisJMHgwMDFmYmIwMCwKKwkweDgwMDA0MGI3LAorCTB4ZjQwMTMyYjYsCisJMHgwMDBmYjQxYiwKKwkweDAwMDZiMzdlLAorCTB4NjI3ZTAwMGYsCisJMHgwMDgwMDAwNiwKKwkweDAxZjYwMjAxLAorCTB4YmQwNGJkMDAsCisJMHgxZjE5ZjAxNCwKKwkweDAyMzAwMDgwLAorCTB4YmQwMDAxZjYsCisvKiAweDA0OTE6IG1haW4gKi8KKwkweDAwMzFmNDA0LAorCTB4MGQwMDI4ZjQsCisJMHgwMDM3N2UxMCwKKwkweGY0MDFmNDAwLAorCTB4NDAwMWU0YjEsCisJMHgwMGM3MWJmNSwKKwkweDk5ZjA5NGJkLAorCTB4MzcwMDgwMDQsCisJMHgwMDA5ZjYwMiwKKwkweDAwODEwNGJkLAorCTB4MTFjZjAyYzAsCisJMHhjMTAwODIwMCwKKwkweDAwMjJjZjAyLAorCTB4ZjQxZjEzYzgsCisJMHgyM2M4NzcwYiwKKwkweDU1MGJmNDFmLAorCTB4MTJiMjIwZjksCisJMHg5OWYwOTRiZCwKKwkweDM3MDA4MDA3LAorCTB4MDAwOWY2MDIsCisJMHgzMmY0MDRiZCwKKwkweDAyMzFmNDAxLAorCTB4MDAwODM2N2UsCisJMHg5OWYwOTRiZCwKKwkweDE3MDA4MDA3LAorCTB4MDAwOWY2MDIsCisJMHgyMGZjMDRiZCwKKwkweDk5ZjA5NGJkLAorCTB4MzcwMDgwMDYsCisJMHgwMDA5ZjYwMiwKKwkweDMxZjQwNGJkLAorCTB4MDgzNjdlMDEsCisJMHhmMDk0YmQwMCwKKwkweDAwODAwNjk5LAorCTB4MDlmNjAyMTcsCisJMHhmNDA0YmQwMCwKKy8qIDB4MDUyMjogY2hzd19wcmV2X25vX25leHQgKi8KKwkweDIwZjkyZjBlLAorCTB4MzJmNDEyYjIsCisJMHgwMjMyZjQwMSwKKwkweDAwMDgzNjdlLAorCTB4MDA4MDIwZmMsCisJMHgwMmY2MDJjMCwKKwkweGY0MDRiZDAwLAorLyogMHgwNTNlOiBjaHN3X25vX3ByZXYgKi8KKwkweDIzYzgxMzBlLAorCTB4MGQwYmY0MWYsCisJMHhmNDAxMzFmNCwKKwkweDM2N2UwMjMyLAorLyogMHgwNTRlOiBjaHN3X2RvbmUgKi8KKwkweDAxMDIwMDA4LAorCTB4MDJjMzAwODAsCisJMHhiZDAwMDJmNiwKKwkweGYwOTRiZDA0LAorCTB4MDA4MDA0OTksCisJMHgwOWY2MDIxNywKKwkweGY1MDRiZDAwLAorLyogMHgwNTZiOiBtYWluX25vdF9jdHhfc3dpdGNoICovCisJMHhiMGZmMmEwZSwKKwkweDFiZjQwMWU0LAorCTB4N2VmMmIyMGMsCisJMHhmNDAwMDdkNiwKKy8qIDB4MDU3YTogbWFpbl9ub3RfY3R4X2NoYW4gKi8KKwkweGU0YjA0MDBlLAorCTB4MmMxYmY0MDIsCisJMHg5OWYwOTRiZCwKKwkweDM3MDA4MDA3LAorCTB4MDAwOWY2MDIsCisJMHgzMmY0MDRiZCwKKwkweDAyMzJmNDAxLAorCTB4MDAwODM2N2UsCisJMHg5OWYwOTRiZCwKKwkweDE3MDA4MDA3LAorCTB4MDAwOWY2MDIsCisJMHgwZWY0MDRiZCwKKy8qIDB4MDVhOTogbWFpbl9ub3RfY3R4X3NhdmUgKi8KKwkweDEwZWY5NDExLAorCTB4N2UwMWY1ZjAsCisJMHhmNTAwMDJmOCwKKy8qIDB4MDViNzogbWFpbl9kb25lICovCisJMHhiZGZlZGUwZSwKKwkweDFmMjlmMDI0LAorCTB4MDIzMDAwODAsCisJMHhiZDAwMDJmNiwKKwkweGNjMGVmNTA0LAorLyogMHgwNWM5OiBpaCAqLworCTB4ZmU4MGY5ZmUsCisJMHg4MGY5MDE4OCwKKwkweGEwZjk5MGY5LAorCTB4ZDBmOWIwZjksCisJMHhmMGY5ZTBmOSwKKwkweDAwNGEwNGJkLAorCTB4MDBhYWNmMDIsCisJMHhmNDA0YWJjNCwKKwkweDEwMGQyMzBiLAorCTB4Y2YxYTAwNGUsCisJMHgwMDRmMDBlZSwKKwkweDAwZmZjZjE5LAorCTB4MDAwMDA0N2UsCisJMHgwNDAwYjBiNywKKwkweDAwNDAwMTBlLAorCTB4MDAwZWY2MWQsCisvKiAweDA2MGE6IGloX25vX2ZpZm8gKi8KKwkweGFiZTQwNGJkLAorCTB4MGJmNDAxMDAsCisJMHg0ZTEwMGQwYywKKwkweDA0N2U0MDAxLAorLyogMHgwNjFhOiBpaF9ub19jdHhzdyAqLworCTB4YWJlNDAwMDAsCisJMHgwYmY0MDQwMCwKKwkweDAxMDA0YjEwLAorCTB4NDQ4ZWJmYjIsCisJMHg4ZjdlNDAwMSwKKy8qIDB4MDYyZTogaWhfbm9fZndtdGhkICovCisJMHgwNDRiMDAwMCwKKwkweGZmYjBiZDAxLAorCTB4MGJmNGI0YWIsCisJMHgwNzAwODAwYywKKwkweDAwMGJmNjAzLAorLyogMHgwNjQyOiBpaF9ub19vdGhlciAqLworCTB4MDA0MDA0YmQsCisJMHgwMDBhZjYwMSwKKwkweGYwZmMwNGJkLAorCTB4ZDBmY2UwZmMsCisJMHhhMGZjYjBmYywKKwkweDgwZmM5MGZjLAorCTB4ZmMwMDg4ZmUsCisJMHgwMDMyZjQ4MCwKKy8qIDB4MDY2MjogY3R4XzQxNzBzICovCisJMHhmNWYwMDFmOCwKKwkweDhlZmZiMjEwLAorCTB4N2U0MDQxNzAsCisJMHhmODAwMDA4ZiwKKy8qIDB4MDY3MTogY3R4XzQxNzB3ICovCisJMHg0MTcwOGUwMCwKKwkweDAwNjU3ZTQwLAorCTB4ZjBmZmIyMDAsCisJMHgxYmY0MTBmNCwKKy8qIDB4MDY4MzogY3R4X3JlZHN3aXRjaCAqLworCTB4NGUwMGY4ZjMsCisJMHhlNWYwMDIwMCwKKwkweDIwZTVmMDQwLAorCTB4ODAxMGU1ZjAsCisJMHhmNjAxODUwMCwKKwkweDA0YmQwMDBlLAorLyogMHgwNjlhOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhmMmI2MDgwZiwKKwkweGZkMWJmNDAxLAorCTB4MDQwMGU1ZjEsCisJMHgwMTAwZTVmMSwKKwkweDAxODUwMDgwLAorCTB4YmQwMDBlZjYsCisvKiAweDA2YjM6IGN0eF84NmMgKi8KKwkweDgwMDBmODA0LAorCTB4ZjYwMjIzMDAsCisJMHgwNGJkMDAwZiwKKwkweDE0OGVmZmIyLAorCTB4OGY3ZTQwOGEsCisJMHhmZmIyMDAwMCwKKwkweDQxYTg4YzhlLAorCTB4MDAwMDhmN2UsCisvKiAweDA2ZDI6IGN0eF9tZW0gKi8KKwkweDAwODAwMGY4LAorCTB4MGZmNjAyODQsCisvKiAweDA2ZGI6IGN0eF9tZW1fd2FpdCAqLworCTB4OGYwNGJkMDAsCisJMHhjZjAyODQwMCwKKwkweGZmZmQwMGZmLAorCTB4ZjYxYmY0MDUsCisvKiAweDA2ZWE6IGN0eF9sb2FkICovCisJMHg5NGJkMDBmOCwKKwkweDgwMDU5OWYwLAorCTB4ZjYwMjM3MDAsCisJMHgwNGJkMDAwOSwKKwkweGI4N2UwYzBhLAorCTB4ZjRiZDAwMDAsCisJMHgwMjg5MDA4MCwKKwkweGJkMDAwZmY2LAorCTB4YzEwMDgwMDQsCisJMHgwMDAyZjYwMiwKKwkweDAwODAwNGJkLAorCTB4MDJmNjAyODMsCisJMHgwZjA0YmQwMCwKKwkweDA2ZDI3ZTA3LAorCTB4YzAwMDgwMDAsCisJMHgwMDAyZjYwMiwKKwkweDBiZmUwNGJkLAorCTB4MWYyYWYwMDAsCisJMHhiNjA0MjRiNiwKKwkweDk0YmQwMjIwLAorCTB4ODAwODk5ZjAsCisJMHhmNjAyMzcwMCwKKwkweDA0YmQwMDA5LAorCTB4MDI4MTAwODAsCisJMHhiZDAwMDJmNiwKKwkweDAwMDBkMjA0LAorCTB4MjVmMDgwMDAsCisJMHg4ODAwODAwMiwKKwkweDAwMDJmNjAyLAorCTB4MTAwMTA0YmQsCisJMHhmMDAyMDA0MiwKKwkweDEyZmEwMjIzLAorCTB4YmQwM2Y4MDUsCisJMHgwODk5ZjA5NCwKKwkweDAyMTcwMDgwLAorCTB4YmQwMDA5ZjYsCisJMHg4MTAxOTgwNCwKKwkweDk4MTgxNGI2LAorCTB4MjViNjgwMDIsCisJMHgwNTEyZmQwOCwKKwkweGJkMTYwMWI1LAorCTB4MDk5OWYwOTQsCisJMHgwMjM3MDA4MCwKKwkweGJkMDAwOWY2LAorCTB4ODEwMDgwMDQsCisJMHgwMDAxZjYwMiwKKwkweDAxMDIwNGJkLAorCTB4MDI4ODAwODAsCisJMHhiZDAwMDJmNiwKKwkweDAxMDA0MTA0LAorCTB4ZmEwNjEzZjAsCisJMHgwM2Y4MDUwMSwKKwkweDk5ZjA5NGJkLAorCTB4MTcwMDgwMDksCisJMHgwMDA5ZjYwMiwKKwkweDk0YmQwNGJkLAorCTB4ODAwNTk5ZjAsCisJMHhmNjAyMTcwMCwKKwkweDA0YmQwMDA5LAorLyogMHgwN2Q2OiBjdHhfY2hhbiAqLworCTB4ZWE3ZTAwZjgsCisJMHgwYzBhMDAwNiwKKwkweDAwMDBiODdlLAorCTB4ZDI3ZTA1MGYsCisJMHgwMGY4MDAwNiwKKy8qIDB4MDdlODogY3R4X21taW9fZXhlYyAqLworCTB4ODA0MTAzOTgsCisJMHhmNjAyODEwMCwKKwkweDA0YmQwMDAzLAorLyogMHgwN2Y2OiBjdHhfbW1pb19sb29wICovCisJMHgzNGM0MzRiZCwKKwkweDBlMWJmNGZmLAorCTB4ZjAwMjAwNDUsCisJMHgzNWZhMDY1MywKKy8qIDB4MDgwNzogY3R4X21taW9fcHVsbCAqLworCTB4OTgwM2Y4MDUsCisJMHg0Zjk4ODA0ZSwKKwkweDAwOGY3ZTgxLAorCTB4MDgzMGI2MDAsCisJMHhmNDAxMTJiNiwKKy8qIDB4MDgxYTogY3R4X21taW9fZG9uZSAqLworCTB4MDM5OGRmMWIsCisJMHg4MTAwODAxNiwKKwkweDAwMDNmNjAyLAorCTB4MDBiNTA0YmQsCisJMHgwMTAwNDE0MCwKKwkweGZhMDYxM2YwLAorCTB4MDNmODA2MDEsCisvKiAweDA4MzY6IGN0eF94ZmVyICovCisJMHgwNDBlMDBmOCwKKwkweDAzMDIwMDgwLAorCTB4YmQwMDBlZjYsCisvKiAweDA4NDE6IGN0eF94ZmVyX2lkbGUgKi8KKwkweDAwMDA4ZTA0LAorCTB4MDBlZWNmMDMsCisJMHgyMDAwZTRmMSwKKwkweGY0ZjUxYmY0LAorCTB4MDJmNDA2MTEsCisvKiAweDA4NTU6IGN0eF94ZmVyX3ByZSAqLworCTB4N2UxMDBmMGMsCisJMHhmNDAwMDZiMywKKy8qIDB4MDg1ZTogY3R4X3hmZXJfcHJlX2xvYWQgKi8KKwkweDAyMGYxYjExLAorCTB4MDAwNjYyN2UsCisJMHgwMDA2NzE3ZSwKKwkweDAwMDY4MzdlLAorCTB4NjI3ZWY0YmQsCisJMHhlYTdlMDAwNiwKKy8qIDB4MDg3NjogY3R4X3hmZXJfZXhlYyAqLworCTB4MDE5ODAwMDYsCisJMHg4MDI0YmQxNiwKKwkweGY2MDEwNTAwLAorCTB4MDRiZDAwMDIsCisJMHgwMDhlMWZiMiwKKwkweDhmN2U0MWE1LAorCTB4ZmNmMDAwMDAsCisJMHgwMjJjZjAwMSwKKwkweGZkMDEyNGI2LAorCTB4ZmZiMjA1ZjIsCisJMHg0MWE1MDQ4ZSwKKwkweDAwMDA4ZjdlLAorCTB4MDAwMjE2N2UsCisJMHhmYzgwMjRiZCwKKwkweDAyZjYwMjQ3LAorCTB4ZjAwNGJkMDAsCisJMHgyMGI2MDEyYywKKwkweDRhZmM4MDAzLAorCTB4MDAwMmY2MDIsCisJMHhhY2YwMDRiZCwKKwkweDA2YTVmMDAxLAorCTB4MGM5ODAwMGIsCisJMHgwMTBkOTgwMCwKKwkweDNkN2UwMDBlLAorCTB4MDgwYTAwMDEsCisJMHgwMDAwZWM3ZSwKKwkweDAwMDIwYTdlLAorCTB4MGExMjAxZjQsCisJMHgwMGI4N2UwYywKKwkweDdlMDUwZjAwLAorCTB4ZjQwMDA2ZDIsCisvKiAweDA4ZjI6IGN0eF94ZmVyX3Bvc3QgKi8KKwkweDAyMGYyZDAyLAorCTB4MDAwNjYyN2UsCisJMHhiMzdlZjRiZCwKKwkweDI3N2UwMDA2LAorCTB4NzE3ZTAwMDIsCisJMHhmNGJkMDAwNiwKKwkweDAwMDY2MjdlLAorCTB4OTgxMDExZjQsCisJMHgxMWZkNDAwMSwKKwkweDA3MGJmNDA1LAorCTB4MDAwN2U4N2UsCisvKiAweDA5MWM6IGN0eF94ZmVyX25vX3Bvc3RfbW1pbyAqLworLyogMHgwOTFjOiBjdHhfeGZlcl9kb25lICovCisJMHgwMDAwMDBmOCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52YzAuZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZjMC5mdWMuaAppbmRleCBiNTlmNjk0Li4xMzJmNjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZjMC5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZjMC5mdWMuaApAQCAtMjA2LDE0ICsyMDYsMTQgQEAKIH07CiAKIHVpbnQzMl90IG52YzBfZ3JodWJfY29kZVtdID0gewotCTB4MDMxYjBlZjUsCisJMHgwMzliMGVmNSwKIC8qIDB4MDAwNDogcXVldWVfcHV0ICovCiAJMHg5ODAwZDg5OCwKIAkweDg2ZjAwMWQ5LAogCTB4MDQ4OWI4MDgsCiAJMHhmMDBjMWJmNCwKIAkweDIxZjUwMmY3LAotCTB4MDBmODAyZmUsCisJMHgwMGY4MDM3ZSwKIC8qIDB4MDAxYzogcXVldWVfcHV0X25leHQgKi8KIAkweGI2MDc5OGM0LAogCTB4OGRiYjAzODQsCkBAIC0yMzcsMTg0ICsyMzcsMjE0IEBACiAvKiAweDAwNjY6IHF1ZXVlX2dldF9kb25lICovCiAJMHgwMGY4MDEzMiwKIC8qIDB4MDA2ODogbnZfcmQzMiAqLwotCTB4MDcyOGI3ZjEsCi0JMHhiOTA2YjRiNiwKLQkweGM5ZjAwMmVjLAotCTB4MDBiY2QwMWYsCi0vKiAweDAwNzg6IG52X3JkMzJfd2FpdCAqLwotCTB4YzgwMGJjY2YsCi0JMHgxYmY0MWZjYywKLQkweDA2YTdmMGZhLAotCTB4MDEwOTIxZjUsCi0JMHhmODQwYmZjZiwKLS8qIDB4MDA4ZDogbnZfd3IzMiAqLwotCTB4MjhiN2YxMDAsCi0JMHgwNmI0YjYwNywKLQkweGI5ODBiZmQwLAotCTB4YzlmMDAyZWMsCi0JMHgxZWM5ZjAxZiwKLS8qIDB4MDBhMzogbnZfd3IzMl93YWl0ICovCi0JMHhjZjAwYmNkMCwKLQkweGNjYzgwMGJjLAotCTB4ZmExYmY0MWYsCi0vKiAweDAwYWU6IHdhdGNoZG9nX3Jlc2V0ICovCi0JMHg4N2YxMDBmOCwKLQkweDg0YjYwNDMwLAotCTB4MWZmOWYwMDYsCi0JMHhmODAwOGZkMCwKLS8qIDB4MDBiZDogd2F0Y2hkb2dfY2xlYXIgKi8KLQkweDMwODdmMTAwLAotCTB4MDY4NGI2MDQsCi0JMHhmODAwODBkMCwKLS8qIDB4MDBjOTogd2FpdF9kb25leiAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDA5OSwKLQkweDAzZjAwZjAwLAotCTB4MDAwOWQwMDIsCi0JMHgwN2YxMDRiZCwKLQkweDAzZjAwNjAwLAotCTB4MDAwYWQwMDIsCi0vKiAweDAwZTY6IHdhaXRfZG9uZXpfbmUgKi8KLQkweDg3ZjEwNGJkLAotCTB4ODNmMDAwMDAsCi0JMHgwMDg4Y2YwMSwKLQkweGY0ODg4YWZmLAotCTB4OTRiZGYzMWIsCi0JMHhmMTAwOTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDEwOTogd2FpdF9kb25lbyAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDA5OSwKLQkweDAzZjAwZjAwLAotCTB4MDAwOWQwMDIsCi0JMHg4N2YxMDRiZCwKLQkweDg0YjYwODE4LAotCTB4MDA4YWQwMDYsCi0vKiAweDAxMjQ6IHdhaXRfZG9uZW9fZSAqLwotCTB4MDQwMDg3ZjEsCi0JMHhjZjA2ODRiNiwKLQkweDhhZmYwMDg4LAotCTB4ZjMwYmY0ODgsCisJMHhmMDAyZWNiOSwKKwkweDA3ZjExZmM5LAorCTB4MDNmMGNhMDAsCisJMHgwMDBjZDAwMSwKKy8qIDB4MDA3YTogbnZfcmQzMl93YWl0ICovCisJMHhjN2YxMDRiZCwKKwkweGMzZjBjYTAwLAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweGE3ZjBmMzFiLAorCTB4MTAyMWY1MDYsCisJMHgwMGY3ZjEwMSwKKwkweDAxZjNmMGNiLAorCTB4ZjgwMGZmY2YsCisvKiAweDAwOWQ6IG52X3dyMzIgKi8KKwkweDAwMDdmMTAwLAorCTB4MDEwM2YwY2MsCisJMHhiZDAwMGZkMCwKKwkweDAyZWNiOTA0LAorCTB4ZjAxZmM5ZjAsCisJMHgwN2YxMWVjOSwKKwkweDAzZjBjYTAwLAorCTB4MDAwY2QwMDEsCisvKiAweDAwYmU6IG52X3dyMzJfd2FpdCAqLworCTB4YzdmMTA0YmQsCisJMHhjM2YwY2EwMCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHgwMGY4ZjMxYiwKKy8qIDB4MDBkMDogd2FpdF9kb25leiAqLwogCTB4OTlmMDk0YmQsCiAJMHgwMDA3ZjEwMCwKLQkweDAyMDNmMDE3LAorCTB4MDIwM2YwMGYsCiAJMHhiZDAwMDlkMCwKLS8qIDB4MDE0NzogbW1jdHhfc2l6ZSAqLwotCTB4YmQwMGY4MDQsCi0vKiAweDAxNDk6IG52X21tY3R4X3NpemVfbG9vcCAqLwotCTB4MDBlODk4OTQsCi0JMHhiNjFhODViNiwKLQkweDg0YjYwMTgwLAotCTB4MDA5OGJiMDIsCi0JMHhiODA0ZTBiNiwKLQkweDFiZjQwNGVmLAotCTB4MDI5ZmI5ZWIsCi0vKiAweDAxNjY6IG1tY3R4X3hmZXIgKi8KLQkweDk0YmQwMGY4LAotCTB4ZjEwMTk5ZjAsCi0JMHhmMDBmMDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjEwNGJkMDAsCi0JMHhiNjA3MTA4NywKLQkweDk0YmQwNjg0LAotCTB4ZjQwNWJiZmQsCi0JMHg4YmQwMDkwYiwKLQkweDAwOTlmMDAwLAotLyogMHgwMThjOiBtbWN0eF9iYXNlX2Rpc2FibGVkICovCi0JMHhmNDA1ZWVmZCwKLQkweDhlZDAwYzBiLAotCTB4YzA4ZmQwODAsCi0vKiAweDAxOWI6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCi0JMHhiNzAxOTlmMCwKLQkweGM4MDEwMDgwLAorCTB4MDAwN2YxMDQsCisJMHgwMjAzZjAwNiwKKwkweGJkMDAwYWQwLAorLyogMHgwMGVkOiB3YWl0X2RvbmV6X25lICovCisJMHgwMDg3ZjEwNCwKKwkweDAxODNmMDAwLAorCTB4ZmYwMDg4Y2YsCisJMHgxYmY0ODg4YSwKKwkweGYwOTRiZGYzLAorCTB4MDdmMTAwOTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxMTA6IHdhaXRfZG9uZW8gKi8KKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDAsCisJMHgwMjAzZjAwZiwKKwkweGJkMDAwOWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMjAzZjAwNiwKKwkweGJkMDAwYWQwLAorLyogMHgwMTJkOiB3YWl0X2RvbmVvX2UgKi8KKwkweDAwODdmMTA0LAorCTB4MDE4M2YwMDAsCisJMHhmZjAwODhjZiwKKwkweDBiZjQ4ODhhLAorCTB4ZjA5NGJkZjMsCisJMHgwN2YxMDA5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDE1MDogbW1jdHhfc2l6ZSAqLworLyogMHgwMTUyOiBudl9tbWN0eF9zaXplX2xvb3AgKi8KKwkweGU4OTg5NGJkLAorCTB4MWE4NWI2MDAsCisJMHhiNjAxODBiNiwKKwkweDk4YmIwMjg0LAorCTB4MDRlMGI2MDAsCisJMHhmNDA0ZWZiOCwKKwkweDlmYjllYjFiLAorLyogMHgwMTZmOiBtbWN0eF94ZmVyICovCisJMHhiZDAwZjgwMiwKKwkweDAxOTlmMDk0LAorCTB4MGYwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorCTB4YmJmZDk0YmQsCisJMHgxMjBiZjQwNSwKKwkweGM0MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwYiwKKy8qIDB4MDE5NzogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLworCTB4ZmQwMDk5ZjAsCisJMHgwYmY0MDVlZSwKKwkweDAwMDdmMTFlLAorCTB4MDEwM2YwYzYsCisJMHhiZDAwMGVkMCwKKwkweDAwMDdmMTA0LAorCTB4MDEwM2YwYzcsCisJMHhiZDAwMGZkMCwKKwkweDAxOTlmMDA0LAorLyogMHgwMWI4OiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLworCTB4YjYwMGFiYzgsCisJMHhiOWYwMTBiNCwKKwkweDAxYWVjODBjLAorCTB4ZmQxMWU0YjYsCisJMHgwN2YxMDViZSwKKwkweDAzZjBjNTAwLAorCTB4MDAwYmQwMDEsCisvKiAweDAxZDY6IG1tY3R4X2V4ZWNfbG9vcCAqLworLyogMHgwMWQ2OiBtbWN0eF93YWl0X2ZyZWUgKi8KKwkweGU3ZjEwNGJkLAorCTB4ZTNmMGM1MDAsCisJMHgwMGVlY2YwMSwKKwkweGY0MWZlNGYwLAorCTB4Y2U5OGYzMGIsCisJMHgwNWU5ZmQwMCwKKwkweGM4MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwZSwKKwkweGI4MDRjMGI2LAorCTB4MWJmNDA0Y2QsCisJMHgwMmFiYzhkOCwKKy8qIDB4MDIwNzogbW1jdHhfZmluaV93YWl0ICovCisJMHhmMTFmMWJmNCwKKwkweGYwYzUwMGI3LAorCTB4YmJjZjAxYjMsCisJMHgxZmI0ZjAwMCwKKwkweGY0MTBiNGIwLAorCTB4YTdmMGYwMWIsCisJMHhkMDIxZjQwMiwKKy8qIDB4MDIyMzogbW1jdHhfc3RvcCAqLworCTB4YzgyYjBlZjQsCiAJMHhiNGI2MDBhYiwKIAkweDBjYjlmMDEwLAotCTB4YjYwMWFlYzgsCi0JMHhiZWZkMTFlNCwKLQkweDAwOGJkMDA1LAotLyogMHgwMWI0OiBtbWN0eF9leGVjX2xvb3AgKi8KLS8qIDB4MDFiNDogbW1jdHhfd2FpdF9mcmVlICovCi0JMHhmMDAwOGVjZiwKLQkweDBiZjQxZmU0LAotCTB4MDBjZTk4ZmEsCi0JMHhkMDA1ZTlmZCwKLQkweGMwYjZjMDhlLAotCTB4MDRjZGI4MDQsCi0JMHhjOGU4MWJmNCwKLQkweDFiZjQwMmFiLAotLyogMHgwMWQ1OiBtbWN0eF9maW5pX3dhaXQgKi8KLQkweDAwOGJjZjE4LAotCTB4YjAxZmI0ZjAsCi0JMHgxYmY0MTBiNCwKLQkweDAyYTdmMGY3LAotCTB4ZjRjOTIxZjQsCi0vKiAweDAxZWE6IG1tY3R4X3N0b3AgKi8KLQkweGFiYzgxYjBlLAotCTB4MTBiNGI2MDAsCi0JMHhmMDBjYjlmMCwKLQkweDhiZDAxMmI5LAotLyogMHgwMWY5OiBtbWN0eF9zdG9wX3dhaXQgKi8KLQkweDAwOGJjZjAwLAotCTB4ZjQxMmJiYzgsCi0vKiAweDAyMDI6IG1tY3R4X2RvbmUgKi8KLQkweDk0YmRmYTFiLAotCTB4ZjEwMTk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDAyMTU6IHN0cmFuZF93YWl0ICovCi0JMHhmMGEwZjkwMCwKLQkweDIxZjQwMmE3LAotCTB4ZjhhMGZjYzksCi0vKiAweDAyMjE6IHN0cmFuZF9wcmUgKi8KLQkweGZjODdmMTAwLAotCTB4MDI4M2YwNGEsCi0JMHhkMDBjOTdmMCwKLQkweDIxZjUwMDg5LAotCTB4MDBmODAyMTUsCi0vKiAweDAyMzQ6IHN0cmFuZF9wb3N0ICovCi0JMHg0YWZjODdmMSwKLQkweGYwMDI4M2YwLAotCTB4ODlkMDBkOTcsCi0JMHgxNTIxZjUwMCwKLS8qIDB4MDI0Nzogc3RyYW5kX3NldCAqLwotCTB4ZjEwMGY4MDIsCi0JMHhmMDRmZmNhNywKLQkweGFiYTIwMmEzLAotCTB4YzdmMDA1MDAsCi0JMHgwMGFjZDAwZiwKLQkweGQwMGJjN2YwLAotCTB4MjFmNTAwYmMsCi0JMHhhZWQwMDIxNSwKLQkweDBhYzdmMDAwLAotCTB4ZjUwMGJjZDAsCi0JMHhmODAyMTUyMSwKLS8qIDB4MDI3MTogc3RyYW5kX2N0eF9pbml0ICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMzk5LAotCTB4MDNmMDBmMDAsCisJMHhmMTEyYjlmMCwKKwkweGYwYzUwMDA3LAorCTB4MGJkMDAxMDMsCisvKiAweDAyM2I6IG1tY3R4X3N0b3Bfd2FpdCAqLworCTB4ZjEwNGJkMDAsCisJMHhmMGM1MDBiNywKKwkweGJiY2YwMWIzLAorCTB4MTJiYmM4MDAsCisvKiAweDAyNGI6IG1tY3R4X2RvbmUgKi8KKwkweGJkZjMxYmY0LAorCTB4MDE5OWYwOTQsCisJMHgxNzAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisvKiAweDAyNWU6IHN0cmFuZF93YWl0ICovCisJMHhhMGY5MDBmOCwKKwkweGY0MDJhN2YwLAorCTB4YTBmY2QwMjEsCisvKiAweDAyNmE6IHN0cmFuZF9wcmUgKi8KKwkweDk3ZjAwMGY4LAorCTB4ZmMwN2YxMGMsCisJMHgwMjAzZjA0YSwKKwkweGJkMDAwOWQwLAorCTB4NWUyMWY1MDQsCisvKiAweDAyN2Y6IHN0cmFuZF9wb3N0ICovCisJMHhmMDAwZjgwMiwKKwkweDA3ZjEwZDk3LAorCTB4MDNmMDRhZmMsCiAJMHgwMDA5ZDAwMiwKIAkweDIxZjUwNGJkLAotCTB4ZTdmMDAyMjEsCi0JMHg0NzIxZjUwMywKLQkweGZjYTdmMTAyLAotCTB4MDJhM2YwNDYsCi0JMHgwNDAwYWJhMCwKLQkweGYwNDBhMGQwLAotCTB4YmNkMDAxYzcsCi0JMHgxNTIxZjUwMCwKLQkweDAxMGM5MjAyLAotCTB4ZjAwMGFjZDAsCi0JMHhiY2QwMDJjNywKLQkweDE1MjFmNTAwLAotCTB4MzQyMWY1MDIsCi0JMHg4MDg3ZjEwMiwKLQkweDA2ODRiNjA4LAotCTB4YjcwMDg5Y2YsCi0JMHg5NTIyMDA4MCwKLS8qIDB4MDJjYTogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KKwkweDAwZjgwMjVlLAorLyogMHgwMjk0OiBzdHJhbmRfc2V0ICovCisJMHhmMTBmYzdmMCwKKwkweGYwNGZmYzA3LAorCTB4MGNkMDAyMDMsCisJMHhmMDA0YmQwMCwKKwkweDA3ZjEwYmM3LAorCTB4MDNmMDRhZmMsCisJMHgwMDBjZDAwMiwKKwkweDA3ZjEwNGJkLAorCTB4MDNmMDRmZmMsCisJMHgwMDBlZDAwMiwKKwkweGM3ZjAwNGJkLAorCTB4ZmMwN2YxMGEsCisJMHgwMjAzZjA0YSwKKwkweGJkMDAwY2QwLAorCTB4NWUyMWY1MDQsCisvKiAweDAyZDM6IHN0cmFuZF9jdHhfaW5pdCAqLworCTB4YmQwMGY4MDIsCisJMHgwMzk5ZjA5NCwKKwkweDBmMDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKwkweDAyNmEyMWY1LAorCTB4ZjUwM2U3ZjAsCisJMHhiZDAyOTQyMSwKKwkweGZjMDdmMWM0LAorCTB4MDIwM2YwNDcsCisJMHhiZDAwMGNkMCwKKwkweDAxYzdmMDA0LAorCTB4NGFmYzA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDBjLAorCTB4MDI1ZTIxZjUsCisJMHhmMTAxMGM5MiwKKwkweGYwNDZmYzA3LAorCTB4MGNkMDAyMDMsCisJMHhmMDA0YmQwMCwKKwkweDA3ZjEwMmM3LAorCTB4MDNmMDRhZmMsCisJMHgwMDBjZDAwMiwKKwkweDIxZjUwNGJkLAorCTB4MjFmNTAyNWUsCisJMHg4N2YxMDI3ZiwKKwkweDgzZjA0MjAwLAorCTB4MDA5N2YxMDIsCisJMHgwMjkzZjAyMCwKKwkweDk1MDA5OWNmLAorLyogMHgwMzRhOiBjdHhfaW5pdF9zdHJhbmRfbG9vcCAqLwogCTB4OGVkMDA4ZmUsCiAJMHg0MDhlZDAwMCwKIAkweGI2ODA4YWNmLApAQCAtNDI4LDcgKzQ1OCw3IEBACiAJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0vKiAweDAyZmU6IGVycm9yICovCisvKiAweDAzN2U6IGVycm9yICovCiAJMHgwN2YxMDBmOCwKIAkweDAzZjAwNTAwLAogCTB4MDAwZmQwMDIsCkBAIC00MzYsODIgKzQ2NiwxMTcgQEAKIAkweDAwMDdmMTAxLAogCTB4MDMwM2YwMDcsCiAJMHhiZDAwMGZkMCwKLS8qIDB4MDMxYjogaW5pdCAqLworLyogMHgwMzliOiBpbml0ICovCiAJMHhiZDAwZjgwNCwKLQkweDAwMDRmZTA0LAotCTB4ZjEwMDA3ZmUsCi0JMHhmMDEyMDAxNywKLQkweDEyZDAwMjI3LAotCTB4YjExN2YxMDAsCi0JMHgwMDEwZmUwNSwKLQkweDA0MDAxN2YxLAotCTB4ZjFjMDEwZDAsCi0JMHhiNjA0MDQzNywKLQkweDI3ZjEwNjM0LAotCTB4MzJkMDIwMDMsCi0JMHgwNDI3ZjEwMCwKLQkweDAxMzJkMDIwLAorCTB4MDAwN2ZlMDQsCisJMHg0MjAwMTdmMSwKKwkweGNmMDAxM2YwLAorCTB4MTFlNzAwMTEsCisJMHgxNGI2MDEwOSwKKwkweDAwMTRmZTA4LAorCTB4ZjEwMjI3ZjAsCisJMHhmMDEyMDAwNywKKwkweDAyZDAwMDAzLAorCTB4ZjEwNGJkMDAsCisJMHhmZTA2YzgxNywKKwkweDI0YmQwMDEwLAorCTB4MDcwMDA3ZjEsCisJMHhkMDAwMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4MjAwMzI3ZjEsCisJMHgwMTAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDA0MjdmMSwKKwkweDAxMDQwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKIAkweDIwMGIyN2YxLAotCTB4ZjEwMjMyZDAsCi0JMHhkMDIwMGMyNywKLQkweDI3ZjEwNzMyLAotCTB4MjRiNjBjMjQsCi0JMHgwMDAzYjkwNiwKLQkweGYxMDAyM2QwLAorCTB4MDEwODA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4MjAwYzI3ZjEsCisJMHgwMTFjMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHhmMTAxMDM5MiwKKwkweGYwMDkwMDA3LAorCTB4MDNkMDAzMDMsCisJMHhmMTA0YmQwMCwKIAkweGYwODcwNDI3LAotCTB4MTJkMDAwMjMsCi0JMHgwMDEyYjcwMCwKLQkweDA0MjdmMDAxLAotCTB4ZjQwMDEyZDAsCi0JMHhlN2YxMTAzMSwKLQkweGUzZjA5NjA0LAotCTB4NjgyMWY0NDAsCi0JMHg4MDkwZjFjNywKLQkweGY0ZjAwMzAxLAotCTB4MDIwZjgwMWYsCi0JMHhiYjAxMTdmMCwKLQkweDEyYjYwNDFmLAotCTB4MGMyN2YxMDEsCi0JMHgwNjI0YjYwNCwKLQkweGQwMDAyMWQwLAotCTB4MTdmMTQwMjEsCi0JMHgwZTk4MDEwMCwKLQkweDAxMGY5ODAwLAotCTB4MDE0NzIxZjUsCi0JMHgwNzAwMzdmMSwKLQkweDk1MDYzNGI2LAotCTB4MzRkMDA4MTQsCi0JMHg0MDM0ZDAwMCwKLQkweDEzMDAzMGI3LAotCTB4YjYwMDFmYmIsCi0JMHgzZmQwMDJmNSwKLQkweDA4MTViNjAwLAotCTB4YjYwMTEwYjYsCi0JMHgxZmI5MDgxNCwKLQkweDcxMjFmNTAyLAotCTB4MDAxZmJiMDIsCi0JMHhmMTAyMDM5OCwKLQkweGYwMjAwMDQ3LAotLyogMHgwM2Y2OiBpbml0X2dwYyAqLwotCTB4NGVhMDUwNDMsCi0JMHgxZmI5MDgwNCwKLQkweDhkMjFmNDAyLAotCTB4MDEwYzRlYTAsCi0JMHgyMWY0ZjRiZCwKLQkweDA0NGVhMDhkLAotCTB4OGQyMWY0MDEsCi0JMHgwMTAwNGVhMCwKLQkweGY0MDJmN2YwLAotCTB4NGVhMDhkMjEsCi0vKiAweDA0MWU6IGluaXRfZ3BjX3dhaXQgKi8KLQkweDIxZjQwODAwLAotCTB4MWZmZmM4NjgsCi0JMHhhMGZhMGJmNCwKLQkweGY0MDgwNDRlLAotCTB4MWZiYjY4MjEsCi0JMHgwMDQwYjcwMCwKLQkweDAxMzJiNjgwLAotCTB4ZjFiZTFiZjQsCisJMHgwN2YxMDAyMywKKwkweDAzZjAwNDAwLAorCTB4MDAwMmQwMDAsCisJMHgyN2YwMDRiZCwKKwkweDAwMDdmMTA0LAorCTB4MDAwM2YwMDMsCisJMHhiZDAwMDJkMCwKKwkweDEwMzFmNDA0LAorCTB4OTYwNGU3ZjEsCisJMHhmNDQwZTNmMCwKKwkweGZlYjk2ODIxLAorCTB4OTBmMWM3MDIsCisJMHhmMDAzMDE4MCwKKwkweDBmODAxZmY0LAorCTB4MDExN2YwMDIsCisJMHhiNjA0MWZiYiwKKwkweDA3ZjEwMTEyLAorCTB4MDNmMDAzMDAsCisJMHgwMDAxZDAwMSwKKwkweDA3ZjEwNGJkLAorCTB4MDNmMDA0MDAsCisJMHgwMDAxZDAwMSwKKwkweDE3ZjEwNGJkLAorCTB4ZjdmMDAxMDAsCisJMHhiNTIxZjUwMiwKKwkweGM3MjFmNTA3LAorCTB4MTBmN2YwMDcsCisJMHgwODE0MjFmNSwKKwkweDk4MDAwZTk4LAorCTB4MjFmNTAxMGYsCisJMHgxNDk1MDE1MCwKKwkweDAwMDdmMTA4LAorCTB4MDEwM2YwYzAsCisJMHhiZDAwMDRkMCwKKwkweDAwMDdmMTA0LAorCTB4MDEwM2YwYzEsCisJMHhiZDAwMDRkMCwKKwkweDAwMzBiNzA0LAorCTB4MDAxZmJiMTMsCisJMHhmMTAyZjViNiwKKwkweGYwZDMwMDA3LAorCTB4MGZkMDAxMDMsCisJMHhiNjA0YmQwMCwKKwkweDEwYjYwODE1LAorCTB4MDgxNGI2MDEsCisJMHhmNTAyMWZiOSwKKwkweGJiMDJkMzIxLAorCTB4MDM5ODAwMWYsCisJMHgwMDQ3ZjEwMiwKKwkweDUwNDNmMDIwLAorLyogMHgwNGY0OiBpbml0X2dwYyAqLworCTB4MDgwNDRlYTAsCisJMHhmNDAyMWZiOSwKKwkweDRlYTA5ZDIxLAorCTB4ZjRiZDAxMGMsCisJMHhhMDlkMjFmNCwKKwkweGY0MDEwNDRlLAorCTB4NGVhMDlkMjEsCisJMHhmN2YwMDEwMCwKKwkweDlkMjFmNDAyLAorCTB4MDgwMDRlYTAsCisvKiAweDA1MWM6IGluaXRfZ3BjX3dhaXQgKi8KKwkweGM4NjgyMWY0LAorCTB4MGJmNDFmZmYsCisJMHgwNDRlYTBmYSwKKwkweDY4MjFmNDA4LAorCTB4YjcwMDFmYmIsCisJMHhiNjgwMDA0MCwKKwkweDFiZjQwMTMyLAorCTB4MDBmN2YwYmUsCisJMHgwODE0MjFmNSwKKwkweGY1MDBmN2YwLAorCTB4ZjEwN2I1MjEsCiAJMHhmMDAxMDAwNywKIAkweDAxZDAwMjAzLAogCTB4YmQwNGJkMDAsCkBAIC01MTksNDAyICs1ODQsMzk5IEBACiAJMHgwODAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDEsCi0vKiAweDA0NTg6IG1haW4gKi8KKy8qIDB4MDU2NDogbWFpbiAqLwogCTB4ZjQwMDMxZjQsCiAJMHhkN2YwMDAyOCwKIAkweDM5MjFmNDEwLAogCTB4YjFmNDAxZjQsCiAJMHhmNTQwMDFlNCwKLQkweGJkMDBkZTFiLAorCTB4YmQwMGU5MWIsCiAJMHgwNDk5ZjA5NCwKIAkweDBmMDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLQkweDBiMDAxN2YxLAotCTB4Y2YwNjE0YjYsCi0JMHgxMWNmNDAxMiwKLQkweDFmMTNjODAwLAotCTB4MDA4NzBiZjUsCisJMHhjMDAwMTdmMSwKKwkweGNmMDIxM2YwLAorCTB4MjdmMTAwMTEsCisJMHgyM2YwYzEwMCwKKwkweDAwMjJjZjAyLAorCTB4ZjUxZjEzYzgsCisJMHhjODAwODkwYiwKKwkweDBiZjQxZjIzLAorCTB4YjkyMGY5NjIsCisJMHg5NGJkMDIxMiwKKwkweGYxMDc5OWYwLAorCTB4ZjAwZjAwMDcsCisJMHgwOWQwMDIwMywKKwkweGY0MDRiZDAwLAorCTB4MzFmNDAxMzIsCisJMHhlODIxZjUwMiwKKwkweGYwOTRiZDA5LAorCTB4MDdmMTA3OTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MjBmYzA0YmQsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA2LAorCTB4MDIwM2YwMGYsCisJMHhiZDAwMDlkMCwKKwkweDAxMzFmNDA0LAorCTB4MDllODIxZjUsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA2LAorCTB4MDIwM2YwMTcsCisJMHhiZDAwMDlkMCwKKwkweDMzMGVmNDA0LAorLyogMHgwNjBjOiBjaHN3X3ByZXZfbm9fbmV4dCAqLworCTB4MTJiOTIwZjksCisJMHgwMTMyZjQwMiwKKwkweGY1MDIzMmY0LAorCTB4ZmMwOWU4MjEsCisJMHgwMDA3ZjEyMCwKKwkweDAyMDNmMGMwLAorCTB4YmQwMDAyZDAsCisJMHgxMzBlZjQwNCwKKy8qIDB4MDYyYzogY2hzd19ub19wcmV2ICovCiAJMHhmNDFmMjNjOCwKLQkweDIwZjk2MjBiLAotCTB4YmQwMjEyYjksCi0JMHgwNzk5ZjA5NCwKLQkweDBmMDAwN2YxLAorCTB4MzFmNDBkMGIsCisJMHgwMjMyZjQwMSwKKwkweDA5ZTgyMWY1LAorLyogMHgwNjNjOiBjaHN3X2RvbmUgKi8KKwkweGYxMDEyN2YwLAorCTB4ZjBjMzAwMDcsCisJMHgwMmQwMDIwMywKKwkweGJkMDRiZDAwLAorCTB4MDQ5OWYwOTQsCisJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0JMHhmNDAxMzJmNCwKLQkweDIxZjUwMjMxLAotCTB4OTRiZDA4MmYsCisJMHhmZjA4MGVmNSwKKy8qIDB4MDY2MDogbWFpbl9ub3RfY3R4X3N3aXRjaCAqLworCTB4ZjQwMWU0YjAsCisJMHhmMmI5MGQxYiwKKwkweDc4MjFmNTAyLAorCTB4NDYwZWY0MDksCisvKiAweDA2NzA6IG1haW5fbm90X2N0eF9jaGFuICovCisJMHhmNDAyZTRiMCwKKwkweDk0YmQzMjFiLAogCTB4ZjEwNzk5ZjAsCi0JMHhmMDE3MDAwNywKKwkweGYwMGYwMDA3LAogCTB4MDlkMDAyMDMsCi0JMHhmYzA0YmQwMCwKLQkweGYwOTRiZDIwLAotCTB4MDdmMTA2OTksCi0JMHgwM2YwMGYwMCwKLQkweDAwMDlkMDAyLAotCTB4MzFmNDA0YmQsCi0JMHgyZjIxZjUwMSwKLQkweGYwOTRiZDA4LAotCTB4MDdmMTA2OTksCisJMHhmNDA0YmQwMCwKKwkweDMyZjQwMTMyLAorCTB4ZTgyMWY1MDIsCisJMHhmMDk0YmQwOSwKKwkweDA3ZjEwNzk5LAogCTB4MDNmMDE3MDAsCiAJMHgwMDA5ZDAwMiwKIAkweDBlZjQwNGJkLAotLyogMHgwNGY5OiBjaHN3X3ByZXZfbm9fbmV4dCAqLwotCTB4YjkyMGY5MzEsCi0JMHgzMmY0MDIxMiwKLQkweDAyMzJmNDAxLAotCTB4MDgyZjIxZjUsCi0JMHgxN2YxMjBmYywKLQkweDE0YjYwYjAwLAotCTB4MDAxMmQwMDYsCi0vKiAweDA1MTc6IGNoc3dfbm9fcHJldiAqLwotCTB4YzgxMzBlZjQsCi0JMHgwYmY0MWYyMywKLQkweDAxMzFmNDBkLAotCTB4ZjUwMjMyZjQsCi0vKiAweDA1Mjc6IGNoc3dfZG9uZSAqLwotCTB4ZjEwODJmMjEsCi0JMHhiNjBiMGMxNywKLQkweDI3ZjAwNjE0LAotCTB4MDAxMmQwMDEsCi0JMHg5OWYwOTRiZCwKLQkweDAwMDdmMTA0LAotCTB4MDIwM2YwMTcsCi0JMHhiZDAwMDlkMCwKLQkweDEzMGVmNTA0LAotLyogMHgwNTQ5OiBtYWluX25vdF9jdHhfc3dpdGNoICovCi0JMHgwMWU0YjBmZiwKLQkweGI5MGQxYmY0LAotCTB4MjFmNTAyZjIsCi0JMHgwZWY0MDdiYiwKLS8qIDB4MDU1OTogbWFpbl9ub3RfY3R4X2NoYW4gKi8KLQkweDAyZTRiMDQ2LAotCTB4YmQzMjFiZjQsCi0JMHgwNzk5ZjA5NCwKLQkweDBmMDAwN2YxLAorLyogMHgwNmE1OiBtYWluX25vdF9jdHhfc2F2ZSAqLworCTB4MTBlZjk0MTEsCisJMHhmNTAxZjVmMCwKKwkweGY1MDM3ZTIxLAorLyogMHgwNmIzOiBtYWluX2RvbmUgKi8KKwkweGJkZmViNTBlLAorCTB4MWYyOWYwMjQsCisJMHgwODAwMDdmMSwKIAkweGQwMDIwM2YwLAotCTB4MDRiZDAwMDksCi0JMHhmNDAxMzJmNCwKLQkweDIxZjUwMjMyLAotCTB4OTRiZDA4MmYsCi0JMHhmMTA3OTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmNDA0YmQwMCwKLS8qIDB4MDU4ZTogbWFpbl9ub3RfY3R4X3NhdmUgKi8KLQkweGVmOTQxMTBlLAotCTB4MDFmNWYwMTAsCi0JMHgwMmZlMjFmNSwKLQkweGZlYzAwZWY1LAotLyogMHgwNTljOiBtYWluX2RvbmUgKi8KLQkweDI5ZjAyNGJkLAotCTB4MDAwN2YxMWYsCi0JMHgwMjAzZjAwOCwKLQkweGJkMDAwMmQwLAotCTB4YWIwZWY1MDQsCi0vKiAweDA1YjE6IGloICovCi0JMHhmZTgwZjlmZSwKLQkweDgwZjkwMTg4LAotCTB4YTBmOTkwZjksCi0JMHhkMGY5YjBmOSwKLQkweGYwZjllMGY5LAotCTB4MGFjZjA0YmQsCi0JMHgwNGFiYzQ4MCwKLQkweGYxMWQwYmY0LAotCTB4ZjAxOTAwYjcsCi0JMHhiZWNmMTBkNywKLQkweDAwYmZjZjQwLAorCTB4MDRiZDAwMDIsCisJMHhmZWEwMGVmNSwKKy8qIDB4MDZjODogaWggKi8KKwkweDg4ZmU4MGY5LAorCTB4Zjk4MGY5MDEsCisJMHhmOWEwZjk5MCwKKwkweGY5ZDBmOWIwLAorCTB4YmRmMGY5ZTAsCisJMHgwMGE3ZjEwNCwKKwkweDAwYTNmMDAyLAorCTB4YzQwMGFhY2YsCisJMHgwYmY0MDRhYiwKKwkweDEwZDdmMDMwLAorCTB4MWEwMGU3ZjEsCisJMHhjZjAwZTNmMCwKKwkweGY3ZjEwMGVlLAorCTB4ZjNmMDE5MDAsCisJMHgwMGZmY2YwMCwKIAkweGI3MDQyMWY0LAogCTB4ZjAwNDAwYjAsCi0JMHhiZWQwMDFlNywKLS8qIDB4MDVlOTogaWhfbm9fZmlmbyAqLwotCTB4MDBhYmU0MDAsCi0JMHgwZDBiZjQwMSwKLQkweGYxMTBkN2YwLAotCTB4ZjQ0MDAxZTcsCi0vKiAweDA1ZmE6IGloX25vX2N0eHN3ICovCi0JMHhiN2YxMDQyMSwKLQkweGIwYmQwMTA0LAotCTB4ZjRiNGFiZmYsCi0JMHhhN2YxMGQwYiwKLQkweGE0YjYwYzFjLAotCTB4MDBhYmQwMDYsCi0vKiAweDA2MTA6IGloX25vX290aGVyICovCi0JMHhmYzQwMGFkMCwKKwkweDA3ZjEwMWU3LAorCTB4MDNmMDFkMDAsCisJMHgwMDBlZDAwMCwKKy8qIDB4MDcxYTogaWhfbm9fZmlmbyAqLworCTB4YWJlNDA0YmQsCisJMHgwYmY0MDEwMCwKKwkweDEwZDdmMDBkLAorCTB4NDAwMWU3ZjEsCisvKiAweDA3MmI6IGloX25vX2N0eHN3ICovCisJMHhlNDA0MjFmNCwKKwkweGY0MDQwMGFiLAorCTB4YjdmMTE0MGIsCisJMHhiZmI5MDEwMCwKKwkweDQ0ZTdmMTAyLAorCTB4NDBlM2YwMDEsCisvKiAweDA3NDM6IGloX25vX2Z3bXRoZCAqLworCTB4ZjE5ZDIxZjQsCisJMHhiZDAxMDRiNywKKwkweGI0YWJmZmIwLAorCTB4ZjEwZjBiZjQsCisJMHhmMDA3MDAwNywKKwkweDBiZDAwMzAzLAorLyogMHgwNzViOiBpaF9ub19vdGhlciAqLworCTB4ZjEwNGJkMDAsCisJMHhmMDAxMDAwNywKKwkweDBhZDAwMDAzLAorCTB4ZmMwNGJkMDAsCiAJMHhmY2UwZmNmMCwKIAkweGZjYjBmY2QwLAogCTB4ZmM5MGZjYTAsCiAJMHgwMDg4ZmU4MCwKIAkweDMyZjQ4MGZjLAotLyogMHgwNjJiOiBjdHhfNDE2MHMgKi8KLQkweGYxMDFmODAwLAotCTB4ZjA0MTYwZTcsCi0JMHhmN2YwNDBlMywKLQkweDhkMjFmNDAxLAotLyogMHgwNjM4OiBjdHhfNDE2MHNfd2FpdCAqLwotCTB4Yzg2ODIxZjQsCi0JMHgwYmY0MDRmZiwKLS8qIDB4MDY0MzogY3R4XzQxNjBjICovCi0JMHhmMTAwZjhmYSwKLQkweGYwNDE2MGU3LAotCTB4ZjRiZDQwZTMsCi0JMHhmODhkMjFmNCwKLS8qIDB4MDY1MTogY3R4XzQxNzBzICovCi0JMHg3MGU3ZjEwMCwKKy8qIDB4MDc3ZjogY3R4XzQxNjBzICovCisJMHhmMDAxZjgwMCwKKwkweGZmYjkwMWY3LAorCTB4NjBlN2YxMDIsCiAJMHg0MGUzZjA0MSwKLQkweGY0MTBmNWYwLAotCTB4MDBmODhkMjEsCi0vKiAweDA2NjA6IGN0eF80MTcwdyAqLwotCTB4NDE3MGU3ZjEsCi0JMHhmNDQwZTNmMCwKLQkweGY0ZjA2ODIxLAotCTB4ZjMxYmY0MTAsCi0vKiAweDA2NzI6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweGU3ZjEwMGY4LAotCTB4ZTRiNjA2MTQsCi0JMHg3MGY3ZjEwNiwKLQkweDAwZWZkMDAyLAotLyogMHgwNjgzOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHhiNjA4ZjdmMCwKLQkweDFiZjQwMWYyLAotCTB4NzBmN2YxZmQsCi0JMHgwMGVmZDAwNywKLS8qIDB4MDY5MjogY3R4Xzg2YyAqLwotCTB4ZTdmMTAwZjgsCi0JMHhlNGI2MDg2YywKLQkweDAwZWZkMDA2LAotCTB4OGExNGU3ZjEsCi0JMHhmNDQwZTNmMCwKLQkweGU3ZjE4ZDIxLAotCTB4ZTNmMGE4NmMsCi0JMHg4ZDIxZjQ0MSwKLS8qIDB4MDZiMjogY3R4X2xvYWQgKi8KKy8qIDB4MDc4ZjogY3R4XzQxNjBzX3dhaXQgKi8KKwkweGYxOWQyMWY0LAorCTB4ZjA0MTYwZTcsCisJMHgyMWY0NDBlMywKKwkweDAyZmZiOTY4LAorCTB4ZjQwNGZmYzgsCisJMHgwMGY4ZjAwYiwKKy8qIDB4MDdhNDogY3R4XzQxNjBjICovCisJMHhmZmI5ZjRiZCwKKwkweDYwZTdmMTAyLAorCTB4NDBlM2YwNDEsCisJMHhmODlkMjFmNCwKKy8qIDB4MDdiNTogY3R4XzQxNzBzICovCisJMHgxMGY1ZjAwMCwKKwkweGYxMDJmZmI5LAorCTB4ZjA0MTcwZTcsCisJMHgyMWY0NDBlMywKKy8qIDB4MDdjNzogY3R4XzQxNzB3ICovCisJMHhmMTAwZjg5ZCwKKwkweGYwNDE3MGU3LAorCTB4MjFmNDQwZTMsCisJMHgwMmZmYjk2OCwKKwkweGY0MTBmNGYwLAorCTB4MDBmOGYwMWIsCisvKiAweDA3ZGM6IGN0eF9yZWRzd2l0Y2ggKi8KKwkweDAyMDBlN2YxLAorCTB4ZjA0MGU1ZjAsCisJMHhlNWYwMjBlNSwKKwkweDAwMDdmMTEwLAorCTB4MDEwM2YwODUsCisJMHhiZDAwMGVkMCwKKwkweDA4ZjdmMDA0LAorLyogMHgwN2Y4OiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhmNDAxZjJiNiwKKwkweGU1ZjFmZDFiLAorCTB4ZTVmMTA0MDAsCisJMHgwN2YxMDEwMCwKKwkweDAzZjA4NTAwLAorCTB4MDAwZWQwMDEsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDgxNDogY3R4Xzg2YyAqLworCTB4MWIwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDBmLAorCTB4ZjEwMmZmYjksCisJMHhmMDhhMTRlNywKKwkweDIxZjQ0MGUzLAorCTB4MDJmZmI5OWQsCisJMHhhODZjZTdmMSwKKwkweGY0NDFlM2YwLAorCTB4MDBmODlkMjEsCisvKiAweDA4M2M6IGN0eF9tZW0gKi8KKwkweDg0MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwZiwKKy8qIDB4MDg0ODogY3R4X21lbV93YWl0ICovCisJMHg4NDAwZjdmMSwKKwkweGNmMDJmM2YwLAorCTB4ZmZmZDAwZmYsCisJMHhmMzFiZjQwNSwKKy8qIDB4MDg1YTogY3R4X2xvYWQgKi8KIAkweDk0YmQwMGY4LAogCTB4ZjEwNTk5ZjAsCiAJMHhmMDBmMDAwNywKIAkweDA5ZDAwMjAzLAogCTB4ZjAwNGJkMDAsCiAJMHgyMWY0MGNhNywKLQkweDI0MTdmMWM5LAotCTB4MDYxNGI2MGEsCi0JMHhmMTAwMTBkMCwKLQkweGI2MGIwMDM3LAotCTB4MzJkMDA2MzQsCi0JMHgwYzE3ZjE0MCwKLQkweDA2MTRiNjBhLAotCTB4ZDAwNzQ3ZjAsCi0JMHgxNGQwMDAxMiwKLS8qIDB4MDZlZDogY3R4X2NoYW5fd2FpdF8wICovCi0JMHg0MDE0Y2Y0MCwKLQkweGY0MWY0NGYwLAotCTB4MzJkMGZhMWIsCi0JMHgwMDBiZmUwMCwKLQkweGI2MWYyYWYwLAotCTB4MjBiNjA0MjQsCi0JMHhmMDk0YmQwMiwKKwkweGYxZjRiZGQwLAorCTB4ZjA4OTAwMDcsCisJMHgwZmQwMDIwMywKKwkweGYxMDRiZDAwLAorCTB4ZjBjMTAwMDcsCisJMHgwMmQwMDIwMywKKwkweGYxMDRiZDAwLAorCTB4ZjA4MzAwMDcsCisJMHgwMmQwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MjFmNTA3ZjcsCisJMHgwN2YxMDgzYywKKwkweDAzZjBjMDAwLAorCTB4MDAwMmQwMDIsCisJMHgwYmZlMDRiZCwKKwkweDFmMmFmMDAwLAorCTB4YjYwNDI0YjYsCisJMHg5NGJkMDIyMCwKKwkweGYxMDg5OWYwLAorCTB4ZjAwZjAwMDcsCisJMHgwOWQwMDIwMywKKwkweGYxMDRiZDAwLAorCTB4ZjA4MTAwMDcsCisJMHgwMmQwMDIwMywKKwkweGYxMDRiZDAwLAorCTB4ZjEwMDAwMjcsCisJMHhmMDgwMDAyMywKKwkweDA3ZjEwMjI1LAorCTB4MDNmMDg4MDAsCisJMHgwMDAyZDAwMiwKKwkweDE3ZjAwNGJkLAorCTB4MDAyN2YxMTAsCisJMHgwMjIzZjAwMiwKKwkweGY4MDUxMmZhLAorCTB4ZjA5NGJkMDMsCiAJMHgwN2YxMDg5OSwKLQkweDAzZjAwZjAwLAorCTB4MDNmMDE3MDAsCiAJMHgwMDA5ZDAwMiwKLQkweDE3ZjEwNGJkLAotCTB4MTRiNjBhMDQsCi0JMHgwMDEyZDAwNiwKLQkweDBhMjAxN2YxLAotCTB4ZjAwNjE0YjYsCi0JMHgyM2YxMDIyNywKLQkweDEyZDA4MDAwLAotCTB4MTAxN2YwMDAsCi0JMHgwMjAwMjdmMSwKLQkweGZhMDIyM2YwLAotCTB4MDNmODA1MTIsCisJMHgwMTk4MDRiZCwKKwkweDE4MTRiNjgxLAorCTB4YjY4MDAyOTgsCisJMHgxMmZkMDgyNSwKKwkweDE2MDE4MDA1LAogCTB4OTlmMDk0YmQsCi0JMHgwMDA3ZjEwOCwKKwkweDAwMDdmMTA5LAorCTB4MDIwM2YwMGYsCisJMHhiZDAwMDlkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwODEsCisJMHhiZDAwMDFkMCwKKwkweDAxMjdmMDA0LAorCTB4ODgwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4MDEwMDE3ZjEsCisJMHhmYTA2MTNmMCwKKwkweDAzZjgwNTAxLAorCTB4OTlmMDk0YmQsCisJMHgwMDA3ZjEwOSwKIAkweDAyMDNmMDE3LAogCTB4YmQwMDA5ZDAsCi0JMHg4MTAxOTgwNCwKLQkweDk4MTgxNGI2LAotCTB4MjViNjgwMDIsCi0JMHgwNTEyZmQwOCwKLQkweGJkMTYwMTgwLAotCTB4MDk5OWYwOTQsCi0JMHgwZjAwMDdmMSwKLQkweGQwMDIwM2YwLAotCTB4MDRiZDAwMDksCi0JMHgwYTA0MjdmMSwKLQkweGQwMDYyNGI2LAotCTB4MjdmMDAwMjEsCi0JMHgyMDE3ZjEwMSwKLQkweDA2MTRiNjBhLAotCTB4ZjEwMDEyZDAsCi0JMHhmMDAxMDAxNywKLQkweDAxZmEwNjEzLAotCTB4YmQwM2Y4MDUsCi0JMHgwOTk5ZjA5NCwKLQkweDE3MDAwN2YxLAotCTB4ZDAwMjAzZjAsCi0JMHgwNGJkMDAwOSwKLQkweDk5ZjA5NGJkLAotCTB4MDAwN2YxMDUsCi0JMHgwMjAzZjAxNywKLQkweGJkMDAwOWQwLAotLyogMHgwN2JiOiBjdHhfY2hhbiAqLwotCTB4ZjUwMGY4MDQsCi0JMHhmNTA2MmIyMSwKLQkweGYwMDZiMjIxLAotCTB4MjFmNDBjYTcsCi0JMHgxMDE3ZjFjOSwKLQkweDA2MTRiNjBhLAotCTB4ZDAwNTI3ZjAsCi0vKiAweDA3ZDY6IGN0eF9jaGFuX3dhaXQgKi8KLQkweDEyY2YwMDEyLAotCTB4MDUyMmZkMDAsCi0JMHhmNWZhMWJmNCwKLQkweGY4MDY0MzIxLAotLyogMHgwN2U1OiBjdHhfbW1pb19leGVjICovCi0JMHg0MTAzOTgwMCwKLQkweDBhMDQyN2YxLAotCTB4ZDAwNjI0YjYsCi0JMHgzNGJkMDAyMywKLS8qIDB4MDdmNDogY3R4X21taW9fbG9vcCAqLworCTB4ZjA5NGJkMDQsCisJMHgwN2YxMDU5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDk3ODogY3R4X2NoYW4gKi8KKwkweDA3N2YyMWY1LAorCTB4MDg1YTIxZjUsCisJMHhmNDBjYTdmMCwKKwkweGY3ZjBkMDIxLAorCTB4M2MyMWY1MDUsCisJMHhhNDIxZjUwOCwKKy8qIDB4MDk5MzogY3R4X21taW9fZXhlYyAqLworCTB4OTgwMGY4MDcsCisJMHgwN2YxNDEwMywKKwkweDAzZjA4MTAwLAorCTB4MDAwM2QwMDIsCisJMHgzNGJkMDRiZCwKKy8qIDB4MDlhNDogY3R4X21taW9fbG9vcCAqLwogCTB4ZjRmZjM0YzQsCiAJMHg1N2YxMGYxYiwKIAkweDUzZjAwMjAwLAogCTB4MDUzNWZhMDYsCi0vKiAweDA4MDY6IGN0eF9tbWlvX3B1bGwgKi8KKy8qIDB4MDliNjogY3R4X21taW9fcHVsbCAqLwogCTB4NGU5ODAzZjgsCiAJMHg4MTRmOTg4MCwKLQkweGI2OGQyMWY0LAorCTB4YjY5ZDIxZjQsCiAJMHgxMmI2MDgzMCwKIAkweGRmMWJmNDAxLAotLyogMHgwODE4OiBjdHhfbW1pb19kb25lICovCi0JMHhkMDE2MDM5OCwKLQkweDAwODAwMDIzLAotCTB4MDAxN2YxNDAsCi0JMHgwNjEzZjAwMSwKLQkweGY4MDYwMWZhLAotLyogMHgwODJmOiBjdHhfeGZlciAqLwotCTB4ZjEwMGY4MDMsCi0JMHhiNjBjMDBmNywKLQkweGU3ZjAwNmY0LAotCTB4ODBmZWQwMDQsCi0vKiAweDA4M2M6IGN0eF94ZmVyX2lkbGUgKi8KLQkweGYxMDBmZWNmLAotCTB4ZjQyMDAwZTQsCi0JMHgxMWY0ZjkxYiwKLQkweDExMDJmNDA2LAotLyogMHgwODRjOiBjdHhfeGZlcl9wcmUgKi8KLQkweGY1MTBmN2YwLAotCTB4ZjUwNjkyMjEsCi0JMHhmNDA2MmIyMSwKLS8qIDB4MDg1YTogY3R4X3hmZXJfcHJlX2xvYWQgKi8KLQkweGY3ZjAxYzExLAotCTB4NTEyMWY1MDIsCi0JMHg2MDIxZjUwNiwKLQkweDcyMjFmNTA2LAotCTB4ZjVmNGJkMDYsCi0JMHhmNTA2NTEyMSwKLS8qIDB4MDg3MzogY3R4X3hmZXJfZXhlYyAqLwotCTB4OTgwNmIyMjEsCi0JMHgyN2YxMTYwMSwKLQkweDI0YjYwNDE0LAotCTB4MDAyMGQwMDYsCi0JMHhhNTAwZTdmMSwKLQkweGI5NDFlM2YwLAotCTB4MjFmNDAyMWYsCi0JMHgwNGUwYjY4ZCwKLQkweGYwMDFmY2YwLAotCTB4MjRiNjAyMmMsCi0JMHgwNWYyZmQwMSwKLQkweGYxOGQyMWY0LAotCTB4ZjA0YWZjMTcsCi0JMHgyN2YwMDIxMywKLQkweDAwMTJkMDBjLAotCTB4MDIxNTIxZjUsCi0JMHg0N2ZjMjdmMSwKLQkweGQwMDIyM2YwLAotCTB4MmNmMDAwMjAsCisvKiAweDA5Yzg6IGN0eF9tbWlvX2RvbmUgKi8KKwkweGYxMTYwMzk4LAorCTB4ZjA4MTAwMDcsCisJMHgwM2QwMDIwMywKKwkweDgwMDRiZDAwLAorCTB4MTdmMTQwMDAsCisJMHgxM2YwMDEwMCwKKwkweDA2MDFmYTA2LAorCTB4MDBmODAzZjgsCisvKiAweDA5ZTg6IGN0eF94ZmVyICovCisJMHhmMTA0ZTdmMCwKKwkweGYwMDIwMDA3LAorCTB4MGVkMDAzMDMsCisvKiAweDA5Zjc6IGN0eF94ZmVyX2lkbGUgKi8KKwkweGYxMDRiZDAwLAorCTB4ZjAwMDAwZTcsCisJMHhlZWNmMDNlMywKKwkweDAwZTRmMTAwLAorCTB4ZjIxYmY0MjAsCisJMHhmNDA2MTFmNCwKKy8qIDB4MGEwZTogY3R4X3hmZXJfcHJlICovCisJMHhmN2YwMTEwMiwKKwkweDE0MjFmNTEwLAorCTB4N2YyMWY1MDgsCisJMHgxYzExZjQwNywKKy8qIDB4MGExYzogY3R4X3hmZXJfcHJlX2xvYWQgKi8KKwkweGY1MDJmN2YwLAorCTB4ZjUwN2I1MjEsCisJMHhmNTA3YzcyMSwKKwkweGJkMDdkYzIxLAorCTB4YjUyMWY1ZjQsCisJMHg1YTIxZjUwNywKKy8qIDB4MGEzNTogY3R4X3hmZXJfZXhlYyAqLworCTB4MTYwMTk4MDgsCisJMHgwN2YxMjRiZCwKKwkweDAzZjAwNTAwLAorCTB4MDAwMmQwMDEsCisJMHgxZmI5MDRiZCwKKwkweDAwZTdmMTAyLAorCTB4NDFlM2YwYTUsCisJMHhmMDlkMjFmNCwKKwkweDJjZjAwMWZjLAorCTB4MDEyNGI2MDIsCisJMHhiOTA1ZjJmZCwKKwkweGU3ZjEwMmZmLAorCTB4ZTNmMGE1MDQsCisJMHg5ZDIxZjQ0MSwKKwkweDAyNmEyMWY1LAorCTB4MDdmMTI0YmQsCisJMHgwM2YwNDdmYywKKwkweDAwMDJkMDAyLAorCTB4MmNmMDA0YmQsCiAJMHgwMzIwYjYwMSwKLQkweGYwMDAxMmQwLAotCTB4YTVmMDAxYWMsCi0JMHgwMGI3ZjAwNiwKLQkweDk4MDAwYzk4LAotCTB4ZTdmMDAxMGQsCi0JMHg2NjIxZjUwMCwKLQkweDA4YTdmMDAxLAotCTB4MDEwOTIxZjUsCi0JMHgwMjE1MjFmNSwKLQkweGYwMjIwMWY0LAotCTB4MjFmNDBjYTcsCi0JMHgxMDE3ZjFjOSwKLQkweDA2MTRiNjBhLAotCTB4ZDAwNTI3ZjAsCi0vKiAweDA4ZmE6IGN0eF94ZmVyX3Bvc3Rfc2F2ZV93YWl0ICovCi0JMHgxMmNmMDAxMiwKLQkweDA1MjJmZDAwLAotCTB4ZjRmYTFiZjQsCi0vKiAweDA5MDY6IGN0eF94ZmVyX3Bvc3QgKi8KLQkweGY3ZjAzMjAyLAotCTB4NTEyMWY1MDIsCi0JMHhmNWY0YmQwNiwKLQkweGY1MDY5MjIxLAotCTB4ZjUwMjM0MjEsCi0JMHhiZDA2NjAyMSwKLQkweDUxMjFmNWY0LAotCTB4MTAxMWY0MDYsCi0JMHhmZDQwMDE5OCwKLQkweDBiZjQwNTExLAotCTB4ZTUyMWY1MDcsCi0vKiAweDA5MzE6IGN0eF94ZmVyX25vX3Bvc3RfbW1pbyAqLwotCTB4NDMyMWY1MDcsCi0vKiAweDA5MzU6IGN0eF94ZmVyX2RvbmUgKi8KLQkweDAwMDBmODA2LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKKwkweDRhZmMwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGYwMDFhY2YwLAorCTB4YjdmMDA2YTUsCisJMHgwMDBjOTgwMCwKKwkweGYwMDEwZDk4LAorCTB4MjFmNTAwZTcsCisJMHhhN2YwMDE2ZiwKKwkweDEwMjFmNTA4LAorCTB4NWUyMWY1MDEsCisJMHgxMzAxZjQwMiwKKwkweGY0MGNhN2YwLAorCTB4ZjdmMGQwMjEsCisJMHgzYzIxZjUwNSwKKwkweDMyMDJmNDA4LAorLyogMHgwYWM0OiBjdHhfeGZlcl9wb3N0ICovCisJMHhmNTAyZjdmMCwKKwkweGJkMDdiNTIxLAorCTB4MTQyMWY1ZjQsCisJMHg3ZjIxZjUwOCwKKwkweGM3MjFmNTAyLAorCTB4ZjVmNGJkMDcsCisJMHhmNDA3YjUyMSwKKwkweDAxOTgxMDExLAorCTB4MDUxMWZkNDAsCisJMHhmNTA3MGJmNCwKKy8qIDB4MGFlZjogY3R4X3hmZXJfbm9fcG9zdF9tbWlvICovCisJMHhmNTA5OTMyMSwKKy8qIDB4MGFmMzogY3R4X3hmZXJfZG9uZSAqLworCTB4ZjgwN2E0MjEsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZkNy5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmQ3LmZ1Yy5oCmluZGV4IGExYjlmNzYuLjg0YWY4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmQ3LmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmQ3LmZ1Yy5oCkBAIC0yMDYsMTQgKzIwNiwxNCBAQAogfTsKIAogdWludDMyX3QgbnZkN19ncmh1Yl9jb2RlW10gPSB7Ci0JMHgwMzFiMGVmNSwKKwkweDAzOWIwZWY1LAogLyogMHgwMDA0OiBxdWV1ZV9wdXQgKi8KIAkweDk4MDBkODk4LAogCTB4ODZmMDAxZDksCiAJMHgwNDg5YjgwOCwKIAkweGYwMGMxYmY0LAogCTB4MjFmNTAyZjcsCi0JMHgwMGY4MDJmZSwKKwkweDAwZjgwMzdlLAogLyogMHgwMDFjOiBxdWV1ZV9wdXRfbmV4dCAqLwogCTB4YjYwNzk4YzQsCiAJMHg4ZGJiMDM4NCwKQEAgLTIzNywxODQgKzIzNywyMTQgQEAKIC8qIDB4MDA2NjogcXVldWVfZ2V0X2RvbmUgKi8KIAkweDAwZjgwMTMyLAogLyogMHgwMDY4OiBudl9yZDMyICovCi0JMHgwNzI4YjdmMSwKLQkweGI5MDZiNGI2LAotCTB4YzlmMDAyZWMsCi0JMHgwMGJjZDAxZiwKLS8qIDB4MDA3ODogbnZfcmQzMl93YWl0ICovCi0JMHhjODAwYmNjZiwKLQkweDFiZjQxZmNjLAotCTB4MDZhN2YwZmEsCi0JMHgwMTA5MjFmNSwKLQkweGY4NDBiZmNmLAotLyogMHgwMDhkOiBudl93cjMyICovCi0JMHgyOGI3ZjEwMCwKLQkweDA2YjRiNjA3LAotCTB4Yjk4MGJmZDAsCi0JMHhjOWYwMDJlYywKLQkweDFlYzlmMDFmLAotLyogMHgwMGEzOiBudl93cjMyX3dhaXQgKi8KLQkweGNmMDBiY2QwLAotCTB4Y2NjODAwYmMsCi0JMHhmYTFiZjQxZiwKLS8qIDB4MDBhZTogd2F0Y2hkb2dfcmVzZXQgKi8KLQkweDg3ZjEwMGY4LAotCTB4ODRiNjA0MzAsCi0JMHgxZmY5ZjAwNiwKLQkweGY4MDA4ZmQwLAotLyogMHgwMGJkOiB3YXRjaGRvZ19jbGVhciAqLwotCTB4MzA4N2YxMDAsCi0JMHgwNjg0YjYwNCwKLQkweGY4MDA4MGQwLAotLyogMHgwMGM5OiB3YWl0X2RvbmV6ICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDA3ZjEwNGJkLAotCTB4MDNmMDA2MDAsCi0JMHgwMDBhZDAwMiwKLS8qIDB4MDBlNjogd2FpdF9kb25lel9uZSAqLwotCTB4ODdmMTA0YmQsCi0JMHg4M2YwMDAwMCwKLQkweDAwODhjZjAxLAotCTB4ZjQ4ODhhZmYsCi0JMHg5NGJkZjMxYiwKLQkweGYxMDA5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMTA5OiB3YWl0X2RvbmVvICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDg3ZjEwNGJkLAotCTB4ODRiNjA4MTgsCi0JMHgwMDhhZDAwNiwKLS8qIDB4MDEyNDogd2FpdF9kb25lb19lICovCi0JMHgwNDAwODdmMSwKLQkweGNmMDY4NGI2LAotCTB4OGFmZjAwODgsCi0JMHhmMzBiZjQ4OCwKKwkweGYwMDJlY2I5LAorCTB4MDdmMTFmYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMDdhOiBudl9yZDMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4YTdmMGYzMWIsCisJMHgxMDIxZjUwNiwKKwkweDAwZjdmMTAxLAorCTB4MDFmM2YwY2IsCisJMHhmODAwZmZjZiwKKy8qIDB4MDA5ZDogbnZfd3IzMiAqLworCTB4MDAwN2YxMDAsCisJMHgwMTAzZjBjYywKKwkweGJkMDAwZmQwLAorCTB4MDJlY2I5MDQsCisJMHhmMDFmYzlmMCwKKwkweDA3ZjExZWM5LAorCTB4MDNmMGNhMDAsCisJMHgwMDBjZDAwMSwKKy8qIDB4MDBiZTogbnZfd3IzMl93YWl0ICovCisJMHhjN2YxMDRiZCwKKwkweGMzZjBjYTAwLAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweDAwZjhmMzFiLAorLyogMHgwMGQwOiB3YWl0X2RvbmV6ICovCiAJMHg5OWYwOTRiZCwKIAkweDAwMDdmMTAwLAotCTB4MDIwM2YwMTcsCisJMHgwMjAzZjAwZiwKIAkweGJkMDAwOWQwLAotLyogMHgwMTQ3OiBtbWN0eF9zaXplICovCi0JMHhiZDAwZjgwNCwKLS8qIDB4MDE0OTogbnZfbW1jdHhfc2l6ZV9sb29wICovCi0JMHgwMGU4OTg5NCwKLQkweGI2MWE4NWI2LAotCTB4ODRiNjAxODAsCi0JMHgwMDk4YmIwMiwKLQkweGI4MDRlMGI2LAotCTB4MWJmNDA0ZWYsCi0JMHgwMjlmYjllYiwKLS8qIDB4MDE2NjogbW1jdHhfeGZlciAqLwotCTB4OTRiZDAwZjgsCi0JMHhmMTAxOTlmMCwKLQkweGYwMGYwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmMTA0YmQwMCwKLQkweGI2MDcxMDg3LAotCTB4OTRiZDA2ODQsCi0JMHhmNDA1YmJmZCwKLQkweDhiZDAwOTBiLAotCTB4MDA5OWYwMDAsCi0vKiAweDAxOGM6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KLQkweGY0MDVlZWZkLAotCTB4OGVkMDBjMGIsCi0JMHhjMDhmZDA4MCwKLS8qIDB4MDE5YjogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KLQkweGI3MDE5OWYwLAotCTB4YzgwMTAwODAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAwZWQ6IHdhaXRfZG9uZXpfbmUgKi8KKwkweDAwODdmMTA0LAorCTB4MDE4M2YwMDAsCisJMHhmZjAwODhjZiwKKwkweDFiZjQ4ODhhLAorCTB4ZjA5NGJkZjMsCisJMHgwN2YxMDA5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDExMDogd2FpdF9kb25lbyAqLworCTB4OTlmMDk0YmQsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDBmLAorCTB4YmQwMDA5ZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAxMmQ6IHdhaXRfZG9uZW9fZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MGJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTUwOiBtbWN0eF9zaXplICovCisvKiAweDAxNTI6IG52X21tY3R4X3NpemVfbG9vcCAqLworCTB4ZTg5ODk0YmQsCisJMHgxYTg1YjYwMCwKKwkweGI2MDE4MGI2LAorCTB4OThiYjAyODQsCisJMHgwNGUwYjYwMCwKKwkweGY0MDRlZmI4LAorCTB4OWZiOWViMWIsCisvKiAweDAxNmY6IG1tY3R4X3hmZXIgKi8KKwkweGJkMDBmODAyLAorCTB4MDE5OWYwOTQsCisJMHgwZjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHhiYmZkOTRiZCwKKwkweDEyMGJmNDA1LAorCTB4YzQwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBiLAorLyogMHgwMTk3OiBtbWN0eF9iYXNlX2Rpc2FibGVkICovCisJMHhmZDAwOTlmMCwKKwkweDBiZjQwNWVlLAorCTB4MDAwN2YxMWUsCisJMHgwMTAzZjBjNiwKKwkweGJkMDAwZWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMTAzZjBjNywKKwkweGJkMDAwZmQwLAorCTB4MDE5OWYwMDQsCisvKiAweDAxYjg6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCisJMHhiNjAwYWJjOCwKKwkweGI5ZjAxMGI0LAorCTB4MDFhZWM4MGMsCisJMHhmZDExZTRiNiwKKwkweDA3ZjEwNWJlLAorCTB4MDNmMGM1MDAsCisJMHgwMDBiZDAwMSwKKy8qIDB4MDFkNjogbW1jdHhfZXhlY19sb29wICovCisvKiAweDAxZDY6IG1tY3R4X3dhaXRfZnJlZSAqLworCTB4ZTdmMTA0YmQsCisJMHhlM2YwYzUwMCwKKwkweDAwZWVjZjAxLAorCTB4ZjQxZmU0ZjAsCisJMHhjZTk4ZjMwYiwKKwkweDA1ZTlmZDAwLAorCTB4YzgwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBlLAorCTB4YjgwNGMwYjYsCisJMHgxYmY0MDRjZCwKKwkweDAyYWJjOGQ4LAorLyogMHgwMjA3OiBtbWN0eF9maW5pX3dhaXQgKi8KKwkweGYxMWYxYmY0LAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDFmYjRmMDAwLAorCTB4ZjQxMGI0YjAsCisJMHhhN2YwZjAxYiwKKwkweGQwMjFmNDAyLAorLyogMHgwMjIzOiBtbWN0eF9zdG9wICovCisJMHhjODJiMGVmNCwKIAkweGI0YjYwMGFiLAogCTB4MGNiOWYwMTAsCi0JMHhiNjAxYWVjOCwKLQkweGJlZmQxMWU0LAotCTB4MDA4YmQwMDUsCi0vKiAweDAxYjQ6IG1tY3R4X2V4ZWNfbG9vcCAqLwotLyogMHgwMWI0OiBtbWN0eF93YWl0X2ZyZWUgKi8KLQkweGYwMDA4ZWNmLAotCTB4MGJmNDFmZTQsCi0JMHgwMGNlOThmYSwKLQkweGQwMDVlOWZkLAotCTB4YzBiNmMwOGUsCi0JMHgwNGNkYjgwNCwKLQkweGM4ZTgxYmY0LAotCTB4MWJmNDAyYWIsCi0vKiAweDAxZDU6IG1tY3R4X2Zpbmlfd2FpdCAqLwotCTB4MDA4YmNmMTgsCi0JMHhiMDFmYjRmMCwKLQkweDFiZjQxMGI0LAotCTB4MDJhN2YwZjcsCi0JMHhmNGM5MjFmNCwKLS8qIDB4MDFlYTogbW1jdHhfc3RvcCAqLwotCTB4YWJjODFiMGUsCi0JMHgxMGI0YjYwMCwKLQkweGYwMGNiOWYwLAotCTB4OGJkMDEyYjksCi0vKiAweDAxZjk6IG1tY3R4X3N0b3Bfd2FpdCAqLwotCTB4MDA4YmNmMDAsCi0JMHhmNDEyYmJjOCwKLS8qIDB4MDIwMjogbW1jdHhfZG9uZSAqLwotCTB4OTRiZGZhMWIsCi0JMHhmMTAxOTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDIxNTogc3RyYW5kX3dhaXQgKi8KLQkweGYwYTBmOTAwLAotCTB4MjFmNDAyYTcsCi0JMHhmOGEwZmNjOSwKLS8qIDB4MDIyMTogc3RyYW5kX3ByZSAqLwotCTB4ZmM4N2YxMDAsCi0JMHgwMjgzZjA0YSwKLQkweGQwMGM5N2YwLAotCTB4MjFmNTAwODksCi0JMHgwMGY4MDIxNSwKLS8qIDB4MDIzNDogc3RyYW5kX3Bvc3QgKi8KLQkweDRhZmM4N2YxLAotCTB4ZjAwMjgzZjAsCi0JMHg4OWQwMGQ5NywKLQkweDE1MjFmNTAwLAotLyogMHgwMjQ3OiBzdHJhbmRfc2V0ICovCi0JMHhmMTAwZjgwMiwKLQkweGYwNGZmY2E3LAotCTB4YWJhMjAyYTMsCi0JMHhjN2YwMDUwMCwKLQkweDAwYWNkMDBmLAotCTB4ZDAwYmM3ZjAsCi0JMHgyMWY1MDBiYywKLQkweGFlZDAwMjE1LAotCTB4MGFjN2YwMDAsCi0JMHhmNTAwYmNkMCwKLQkweGY4MDIxNTIxLAotLyogMHgwMjcxOiBzdHJhbmRfY3R4X2luaXQgKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAzOTksCi0JMHgwM2YwMGYwMCwKKwkweGYxMTJiOWYwLAorCTB4ZjBjNTAwMDcsCisJMHgwYmQwMDEwMywKKy8qIDB4MDIzYjogbW1jdHhfc3RvcF93YWl0ICovCisJMHhmMTA0YmQwMCwKKwkweGYwYzUwMGI3LAorCTB4YmJjZjAxYjMsCisJMHgxMmJiYzgwMCwKKy8qIDB4MDI0YjogbW1jdHhfZG9uZSAqLworCTB4YmRmMzFiZjQsCisJMHgwMTk5ZjA5NCwKKwkweDE3MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKy8qIDB4MDI1ZTogc3RyYW5kX3dhaXQgKi8KKwkweGEwZjkwMGY4LAorCTB4ZjQwMmE3ZjAsCisJMHhhMGZjZDAyMSwKKy8qIDB4MDI2YTogc3RyYW5kX3ByZSAqLworCTB4OTdmMDAwZjgsCisJMHhmYzA3ZjEwYywKKwkweDAyMDNmMDRhLAorCTB4YmQwMDA5ZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDI3Zjogc3RyYW5kX3Bvc3QgKi8KKwkweGYwMDBmODAyLAorCTB4MDdmMTBkOTcsCisJMHgwM2YwNGFmYywKIAkweDAwMDlkMDAyLAogCTB4MjFmNTA0YmQsCi0JMHhlN2YwMDIyMSwKLQkweDQ3MjFmNTAzLAotCTB4ZmNhN2YxMDIsCi0JMHgwMmEzZjA0NiwKLQkweDA0MDBhYmEwLAotCTB4ZjA0MGEwZDAsCi0JMHhiY2QwMDFjNywKLQkweDE1MjFmNTAwLAotCTB4MDEwYzkyMDIsCi0JMHhmMDAwYWNkMCwKLQkweGJjZDAwMmM3LAotCTB4MTUyMWY1MDAsCi0JMHgzNDIxZjUwMiwKLQkweDgwODdmMTAyLAotCTB4MDY4NGI2MDgsCi0JMHhiNzAwODljZiwKLQkweDk1MjIwMDgwLAotLyogMHgwMmNhOiBjdHhfaW5pdF9zdHJhbmRfbG9vcCAqLworCTB4MDBmODAyNWUsCisvKiAweDAyOTQ6IHN0cmFuZF9zZXQgKi8KKwkweGYxMGZjN2YwLAorCTB4ZjA0ZmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTBiYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwNGZmYywKKwkweDAwMGVkMDAyLAorCTB4YzdmMDA0YmQsCisJMHhmYzA3ZjEwYSwKKwkweDAyMDNmMDRhLAorCTB4YmQwMDBjZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDJkMzogc3RyYW5kX2N0eF9pbml0ICovCisJMHhiZDAwZjgwMiwKKwkweDAzOTlmMDk0LAorCTB4MGYwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorCTB4MDI2YTIxZjUsCisJMHhmNTAzZTdmMCwKKwkweGJkMDI5NDIxLAorCTB4ZmMwN2YxYzQsCisJMHgwMjAzZjA0NywKKwkweGJkMDAwY2QwLAorCTB4MDFjN2YwMDQsCisJMHg0YWZjMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMGMsCisJMHgwMjVlMjFmNSwKKwkweGYxMDEwYzkyLAorCTB4ZjA0NmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTAyYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MjFmNTA0YmQsCisJMHgyMWY1MDI1ZSwKKwkweDg3ZjEwMjdmLAorCTB4ODNmMDQyMDAsCisJMHgwMDk3ZjEwMiwKKwkweDAyOTNmMDIwLAorCTB4OTUwMDk5Y2YsCisvKiAweDAzNGE6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCiAJMHg4ZWQwMDhmZSwKIAkweDQwOGVkMDAwLAogCTB4YjY4MDhhY2YsCkBAIC00MjgsNyArNDU4LDcgQEAKIAkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLS8qIDB4MDJmZTogZXJyb3IgKi8KKy8qIDB4MDM3ZTogZXJyb3IgKi8KIAkweDA3ZjEwMGY4LAogCTB4MDNmMDA1MDAsCiAJMHgwMDBmZDAwMiwKQEAgLTQzNiw4MiArNDY2LDExNyBAQAogCTB4MDAwN2YxMDEsCiAJMHgwMzAzZjAwNywKIAkweGJkMDAwZmQwLAotLyogMHgwMzFiOiBpbml0ICovCisvKiAweDAzOWI6IGluaXQgKi8KIAkweGJkMDBmODA0LAotCTB4MDAwNGZlMDQsCi0JMHhmMTAwMDdmZSwKLQkweGYwMTIwMDE3LAotCTB4MTJkMDAyMjcsCi0JMHhiMTE3ZjEwMCwKLQkweDAwMTBmZTA1LAotCTB4MDQwMDE3ZjEsCi0JMHhmMWMwMTBkMCwKLQkweGI2MDQwNDM3LAotCTB4MjdmMTA2MzQsCi0JMHgzMmQwMjAwMywKLQkweDA0MjdmMTAwLAotCTB4MDEzMmQwMjAsCisJMHgwMDA3ZmUwNCwKKwkweDQyMDAxN2YxLAorCTB4Y2YwMDEzZjAsCisJMHgxMWU3MDAxMSwKKwkweDE0YjYwMTA5LAorCTB4MDAxNGZlMDgsCisJMHhmMTAyMjdmMCwKKwkweGYwMTIwMDA3LAorCTB4MDJkMDAwMDMsCisJMHhmMTA0YmQwMCwKKwkweGZlMDZjODE3LAorCTB4MjRiZDAwMTAsCisJMHgwNzAwMDdmMSwKKwkweGQwMDAwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDAzMjdmMSwKKwkweDAxMDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKKwkweDIwMDQyN2YxLAorCTB4MDEwNDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDAyLAogCTB4MjAwYjI3ZjEsCi0JMHhmMTAyMzJkMCwKLQkweGQwMjAwYzI3LAotCTB4MjdmMTA3MzIsCi0JMHgyNGI2MGMyNCwKLQkweDAwMDNiOTA2LAotCTB4ZjEwMDIzZDAsCisJMHgwMTA4MDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDBjMjdmMSwKKwkweDAxMWMwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGYxMDEwMzkyLAorCTB4ZjAwOTAwMDcsCisJMHgwM2QwMDMwMywKKwkweGYxMDRiZDAwLAogCTB4ZjA4NzA0MjcsCi0JMHgxMmQwMDAyMywKLQkweDAwMTJiNzAwLAotCTB4MDQyN2YwMDEsCi0JMHhmNDAwMTJkMCwKLQkweGU3ZjExMDMxLAotCTB4ZTNmMDk2MDQsCi0JMHg2ODIxZjQ0MCwKLQkweDgwOTBmMWM3LAotCTB4ZjRmMDAzMDEsCi0JMHgwMjBmODAxZiwKLQkweGJiMDExN2YwLAotCTB4MTJiNjA0MWYsCi0JMHgwYzI3ZjEwMSwKLQkweDA2MjRiNjA0LAotCTB4ZDAwMDIxZDAsCi0JMHgxN2YxNDAyMSwKLQkweDBlOTgwMTAwLAotCTB4MDEwZjk4MDAsCi0JMHgwMTQ3MjFmNSwKLQkweDA3MDAzN2YxLAotCTB4OTUwNjM0YjYsCi0JMHgzNGQwMDgxNCwKLQkweDQwMzRkMDAwLAotCTB4MTMwMDMwYjcsCi0JMHhiNjAwMWZiYiwKLQkweDNmZDAwMmY1LAotCTB4MDgxNWI2MDAsCi0JMHhiNjAxMTBiNiwKLQkweDFmYjkwODE0LAotCTB4NzEyMWY1MDIsCi0JMHgwMDFmYmIwMiwKLQkweGYxMDIwMzk4LAotCTB4ZjAyMDAwNDcsCi0vKiAweDAzZjY6IGluaXRfZ3BjICovCi0JMHg0ZWEwNTA0MywKLQkweDFmYjkwODA0LAotCTB4OGQyMWY0MDIsCi0JMHgwMTBjNGVhMCwKLQkweDIxZjRmNGJkLAotCTB4MDQ0ZWEwOGQsCi0JMHg4ZDIxZjQwMSwKLQkweDAxMDA0ZWEwLAotCTB4ZjQwMmY3ZjAsCi0JMHg0ZWEwOGQyMSwKLS8qIDB4MDQxZTogaW5pdF9ncGNfd2FpdCAqLwotCTB4MjFmNDA4MDAsCi0JMHgxZmZmYzg2OCwKLQkweGEwZmEwYmY0LAotCTB4ZjQwODA0NGUsCi0JMHgxZmJiNjgyMSwKLQkweDAwNDBiNzAwLAotCTB4MDEzMmI2ODAsCi0JMHhmMWJlMWJmNCwKKwkweDA3ZjEwMDIzLAorCTB4MDNmMDA0MDAsCisJMHgwMDAyZDAwMCwKKwkweDI3ZjAwNGJkLAorCTB4MDAwN2YxMDQsCisJMHgwMDAzZjAwMywKKwkweGJkMDAwMmQwLAorCTB4MTAzMWY0MDQsCisJMHg5NjA0ZTdmMSwKKwkweGY0NDBlM2YwLAorCTB4ZmViOTY4MjEsCisJMHg5MGYxYzcwMiwKKwkweGYwMDMwMTgwLAorCTB4MGY4MDFmZjQsCisJMHgwMTE3ZjAwMiwKKwkweGI2MDQxZmJiLAorCTB4MDdmMTAxMTIsCisJMHgwM2YwMDMwMCwKKwkweDAwMDFkMDAxLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwMDQwMCwKKwkweDAwMDFkMDAxLAorCTB4MTdmMTA0YmQsCisJMHhmN2YwMDEwMCwKKwkweGI1MjFmNTAyLAorCTB4YzcyMWY1MDcsCisJMHgxMGY3ZjAwNywKKwkweDA4MTQyMWY1LAorCTB4OTgwMDBlOTgsCisJMHgyMWY1MDEwZiwKKwkweDE0OTUwMTUwLAorCTB4MDAwN2YxMDgsCisJMHgwMTAzZjBjMCwKKwkweGJkMDAwNGQwLAorCTB4MDAwN2YxMDQsCisJMHgwMTAzZjBjMSwKKwkweGJkMDAwNGQwLAorCTB4MDAzMGI3MDQsCisJMHgwMDFmYmIxMywKKwkweGYxMDJmNWI2LAorCTB4ZjBkMzAwMDcsCisJMHgwZmQwMDEwMywKKwkweGI2MDRiZDAwLAorCTB4MTBiNjA4MTUsCisJMHgwODE0YjYwMSwKKwkweGY1MDIxZmI5LAorCTB4YmIwMmQzMjEsCisJMHgwMzk4MDAxZiwKKwkweDAwNDdmMTAyLAorCTB4NTA0M2YwMjAsCisvKiAweDA0ZjQ6IGluaXRfZ3BjICovCisJMHgwODA0NGVhMCwKKwkweGY0MDIxZmI5LAorCTB4NGVhMDlkMjEsCisJMHhmNGJkMDEwYywKKwkweGEwOWQyMWY0LAorCTB4ZjQwMTA0NGUsCisJMHg0ZWEwOWQyMSwKKwkweGY3ZjAwMTAwLAorCTB4OWQyMWY0MDIsCisJMHgwODAwNGVhMCwKKy8qIDB4MDUxYzogaW5pdF9ncGNfd2FpdCAqLworCTB4Yzg2ODIxZjQsCisJMHgwYmY0MWZmZiwKKwkweDA0NGVhMGZhLAorCTB4NjgyMWY0MDgsCisJMHhiNzAwMWZiYiwKKwkweGI2ODAwMDQwLAorCTB4MWJmNDAxMzIsCisJMHgwMGY3ZjBiZSwKKwkweDA4MTQyMWY1LAorCTB4ZjUwMGY3ZjAsCisJMHhmMTA3YjUyMSwKIAkweGYwMDEwMDA3LAogCTB4MDFkMDAyMDMsCiAJMHhiZDA0YmQwMCwKQEAgLTUxOSw0MDIgKzU4NCwzOTkgQEAKIAkweDA4MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwMSwKLS8qIDB4MDQ1ODogbWFpbiAqLworLyogMHgwNTY0OiBtYWluICovCiAJMHhmNDAwMzFmNCwKIAkweGQ3ZjAwMDI4LAogCTB4MzkyMWY0MTAsCiAJMHhiMWY0MDFmNCwKIAkweGY1NDAwMWU0LAotCTB4YmQwMGRlMWIsCisJMHhiZDAwZTkxYiwKIAkweDA0OTlmMDk0LAogCTB4MGYwMDA3ZjEsCiAJMHhkMDAyMDNmMCwKIAkweDA0YmQwMDA5LAotCTB4MGIwMDE3ZjEsCi0JMHhjZjA2MTRiNiwKLQkweDExY2Y0MDEyLAotCTB4MWYxM2M4MDAsCi0JMHgwMDg3MGJmNSwKKwkweGMwMDAxN2YxLAorCTB4Y2YwMjEzZjAsCisJMHgyN2YxMDAxMSwKKwkweDIzZjBjMTAwLAorCTB4MDAyMmNmMDIsCisJMHhmNTFmMTNjOCwKKwkweGM4MDA4OTBiLAorCTB4MGJmNDFmMjMsCisJMHhiOTIwZjk2MiwKKwkweDk0YmQwMjEyLAorCTB4ZjEwNzk5ZjAsCisJMHhmMDBmMDAwNywKKwkweDA5ZDAwMjAzLAorCTB4ZjQwNGJkMDAsCisJMHgzMWY0MDEzMiwKKwkweGU4MjFmNTAyLAorCTB4ZjA5NGJkMDksCisJMHgwN2YxMDc5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgyMGZjMDRiZCwKKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDYsCisJMHgwMjAzZjAwZiwKKwkweGJkMDAwOWQwLAorCTB4MDEzMWY0MDQsCisJMHgwOWU4MjFmNSwKKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDYsCisJMHgwMjAzZjAxNywKKwkweGJkMDAwOWQwLAorCTB4MzMwZWY0MDQsCisvKiAweDA2MGM6IGNoc3dfcHJldl9ub19uZXh0ICovCisJMHgxMmI5MjBmOSwKKwkweDAxMzJmNDAyLAorCTB4ZjUwMjMyZjQsCisJMHhmYzA5ZTgyMSwKKwkweDAwMDdmMTIwLAorCTB4MDIwM2YwYzAsCisJMHhiZDAwMDJkMCwKKwkweDEzMGVmNDA0LAorLyogMHgwNjJjOiBjaHN3X25vX3ByZXYgKi8KIAkweGY0MWYyM2M4LAotCTB4MjBmOTYyMGIsCi0JMHhiZDAyMTJiOSwKLQkweDA3OTlmMDk0LAotCTB4MGYwMDA3ZjEsCisJMHgzMWY0MGQwYiwKKwkweDAyMzJmNDAxLAorCTB4MDllODIxZjUsCisvKiAweDA2M2M6IGNoc3dfZG9uZSAqLworCTB4ZjEwMTI3ZjAsCisJMHhmMGMzMDAwNywKKwkweDAyZDAwMjAzLAorCTB4YmQwNGJkMDAsCisJMHgwNDk5ZjA5NCwKKwkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLQkweGY0MDEzMmY0LAotCTB4MjFmNTAyMzEsCi0JMHg5NGJkMDgyZiwKKwkweGZmMDgwZWY1LAorLyogMHgwNjYwOiBtYWluX25vdF9jdHhfc3dpdGNoICovCisJMHhmNDAxZTRiMCwKKwkweGYyYjkwZDFiLAorCTB4NzgyMWY1MDIsCisJMHg0NjBlZjQwOSwKKy8qIDB4MDY3MDogbWFpbl9ub3RfY3R4X2NoYW4gKi8KKwkweGY0MDJlNGIwLAorCTB4OTRiZDMyMWIsCiAJMHhmMTA3OTlmMCwKLQkweGYwMTcwMDA3LAorCTB4ZjAwZjAwMDcsCiAJMHgwOWQwMDIwMywKLQkweGZjMDRiZDAwLAotCTB4ZjA5NGJkMjAsCi0JMHgwN2YxMDY5OSwKLQkweDAzZjAwZjAwLAotCTB4MDAwOWQwMDIsCi0JMHgzMWY0MDRiZCwKLQkweDJmMjFmNTAxLAotCTB4ZjA5NGJkMDgsCi0JMHgwN2YxMDY5OSwKKwkweGY0MDRiZDAwLAorCTB4MzJmNDAxMzIsCisJMHhlODIxZjUwMiwKKwkweGYwOTRiZDA5LAorCTB4MDdmMTA3OTksCiAJMHgwM2YwMTcwMCwKIAkweDAwMDlkMDAyLAogCTB4MGVmNDA0YmQsCi0vKiAweDA0Zjk6IGNoc3dfcHJldl9ub19uZXh0ICovCi0JMHhiOTIwZjkzMSwKLQkweDMyZjQwMjEyLAotCTB4MDIzMmY0MDEsCi0JMHgwODJmMjFmNSwKLQkweDE3ZjEyMGZjLAotCTB4MTRiNjBiMDAsCi0JMHgwMDEyZDAwNiwKLS8qIDB4MDUxNzogY2hzd19ub19wcmV2ICovCi0JMHhjODEzMGVmNCwKLQkweDBiZjQxZjIzLAotCTB4MDEzMWY0MGQsCi0JMHhmNTAyMzJmNCwKLS8qIDB4MDUyNzogY2hzd19kb25lICovCi0JMHhmMTA4MmYyMSwKLQkweGI2MGIwYzE3LAotCTB4MjdmMDA2MTQsCi0JMHgwMDEyZDAwMSwKLQkweDk5ZjA5NGJkLAotCTB4MDAwN2YxMDQsCi0JMHgwMjAzZjAxNywKLQkweGJkMDAwOWQwLAotCTB4MTMwZWY1MDQsCi0vKiAweDA1NDk6IG1haW5fbm90X2N0eF9zd2l0Y2ggKi8KLQkweDAxZTRiMGZmLAotCTB4YjkwZDFiZjQsCi0JMHgyMWY1MDJmMiwKLQkweDBlZjQwN2JiLAotLyogMHgwNTU5OiBtYWluX25vdF9jdHhfY2hhbiAqLwotCTB4MDJlNGIwNDYsCi0JMHhiZDMyMWJmNCwKLQkweDA3OTlmMDk0LAotCTB4MGYwMDA3ZjEsCisvKiAweDA2YTU6IG1haW5fbm90X2N0eF9zYXZlICovCisJMHgxMGVmOTQxMSwKKwkweGY1MDFmNWYwLAorCTB4ZjUwMzdlMjEsCisvKiAweDA2YjM6IG1haW5fZG9uZSAqLworCTB4YmRmZWI1MGUsCisJMHgxZjI5ZjAyNCwKKwkweDA4MDAwN2YxLAogCTB4ZDAwMjAzZjAsCi0JMHgwNGJkMDAwOSwKLQkweGY0MDEzMmY0LAotCTB4MjFmNTAyMzIsCi0JMHg5NGJkMDgyZiwKLQkweGYxMDc5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY0MDRiZDAwLAotLyogMHgwNThlOiBtYWluX25vdF9jdHhfc2F2ZSAqLwotCTB4ZWY5NDExMGUsCi0JMHgwMWY1ZjAxMCwKLQkweDAyZmUyMWY1LAotCTB4ZmVjMDBlZjUsCi0vKiAweDA1OWM6IG1haW5fZG9uZSAqLwotCTB4MjlmMDI0YmQsCi0JMHgwMDA3ZjExZiwKLQkweDAyMDNmMDA4LAotCTB4YmQwMDAyZDAsCi0JMHhhYjBlZjUwNCwKLS8qIDB4MDViMTogaWggKi8KLQkweGZlODBmOWZlLAotCTB4ODBmOTAxODgsCi0JMHhhMGY5OTBmOSwKLQkweGQwZjliMGY5LAotCTB4ZjBmOWUwZjksCi0JMHgwYWNmMDRiZCwKLQkweDA0YWJjNDgwLAotCTB4ZjExZDBiZjQsCi0JMHhmMDE5MDBiNywKLQkweGJlY2YxMGQ3LAotCTB4MDBiZmNmNDAsCisJMHgwNGJkMDAwMiwKKwkweGZlYTAwZWY1LAorLyogMHgwNmM4OiBpaCAqLworCTB4ODhmZTgwZjksCisJMHhmOTgwZjkwMSwKKwkweGY5YTBmOTkwLAorCTB4ZjlkMGY5YjAsCisJMHhiZGYwZjllMCwKKwkweDAwYTdmMTA0LAorCTB4MDBhM2YwMDIsCisJMHhjNDAwYWFjZiwKKwkweDBiZjQwNGFiLAorCTB4MTBkN2YwMzAsCisJMHgxYTAwZTdmMSwKKwkweGNmMDBlM2YwLAorCTB4ZjdmMTAwZWUsCisJMHhmM2YwMTkwMCwKKwkweDAwZmZjZjAwLAogCTB4YjcwNDIxZjQsCiAJMHhmMDA0MDBiMCwKLQkweGJlZDAwMWU3LAotLyogMHgwNWU5OiBpaF9ub19maWZvICovCi0JMHgwMGFiZTQwMCwKLQkweDBkMGJmNDAxLAotCTB4ZjExMGQ3ZjAsCi0JMHhmNDQwMDFlNywKLS8qIDB4MDVmYTogaWhfbm9fY3R4c3cgKi8KLQkweGI3ZjEwNDIxLAotCTB4YjBiZDAxMDQsCi0JMHhmNGI0YWJmZiwKLQkweGE3ZjEwZDBiLAotCTB4YTRiNjBjMWMsCi0JMHgwMGFiZDAwNiwKLS8qIDB4MDYxMDogaWhfbm9fb3RoZXIgKi8KLQkweGZjNDAwYWQwLAorCTB4MDdmMTAxZTcsCisJMHgwM2YwMWQwMCwKKwkweDAwMGVkMDAwLAorLyogMHgwNzFhOiBpaF9ub19maWZvICovCisJMHhhYmU0MDRiZCwKKwkweDBiZjQwMTAwLAorCTB4MTBkN2YwMGQsCisJMHg0MDAxZTdmMSwKKy8qIDB4MDcyYjogaWhfbm9fY3R4c3cgKi8KKwkweGU0MDQyMWY0LAorCTB4ZjQwNDAwYWIsCisJMHhiN2YxMTQwYiwKKwkweGJmYjkwMTAwLAorCTB4NDRlN2YxMDIsCisJMHg0MGUzZjAwMSwKKy8qIDB4MDc0MzogaWhfbm9fZndtdGhkICovCisJMHhmMTlkMjFmNCwKKwkweGJkMDEwNGI3LAorCTB4YjRhYmZmYjAsCisJMHhmMTBmMGJmNCwKKwkweGYwMDcwMDA3LAorCTB4MGJkMDAzMDMsCisvKiAweDA3NWI6IGloX25vX290aGVyICovCisJMHhmMTA0YmQwMCwKKwkweGYwMDEwMDA3LAorCTB4MGFkMDAwMDMsCisJMHhmYzA0YmQwMCwKIAkweGZjZTBmY2YwLAogCTB4ZmNiMGZjZDAsCiAJMHhmYzkwZmNhMCwKIAkweDAwODhmZTgwLAogCTB4MzJmNDgwZmMsCi0vKiAweDA2MmI6IGN0eF80MTYwcyAqLwotCTB4ZjEwMWY4MDAsCi0JMHhmMDQxNjBlNywKLQkweGY3ZjA0MGUzLAotCTB4OGQyMWY0MDEsCi0vKiAweDA2Mzg6IGN0eF80MTYwc193YWl0ICovCi0JMHhjODY4MjFmNCwKLQkweDBiZjQwNGZmLAotLyogMHgwNjQzOiBjdHhfNDE2MGMgKi8KLQkweGYxMDBmOGZhLAotCTB4ZjA0MTYwZTcsCi0JMHhmNGJkNDBlMywKLQkweGY4OGQyMWY0LAotLyogMHgwNjUxOiBjdHhfNDE3MHMgKi8KLQkweDcwZTdmMTAwLAorLyogMHgwNzdmOiBjdHhfNDE2MHMgKi8KKwkweGYwMDFmODAwLAorCTB4ZmZiOTAxZjcsCisJMHg2MGU3ZjEwMiwKIAkweDQwZTNmMDQxLAotCTB4ZjQxMGY1ZjAsCi0JMHgwMGY4OGQyMSwKLS8qIDB4MDY2MDogY3R4XzQxNzB3ICovCi0JMHg0MTcwZTdmMSwKLQkweGY0NDBlM2YwLAotCTB4ZjRmMDY4MjEsCi0JMHhmMzFiZjQxMCwKLS8qIDB4MDY3MjogY3R4X3JlZHN3aXRjaCAqLwotCTB4ZTdmMTAwZjgsCi0JMHhlNGI2MDYxNCwKLQkweDcwZjdmMTA2LAotCTB4MDBlZmQwMDIsCi0vKiAweDA2ODM6IGN0eF9yZWRzd2l0Y2hfZGVsYXkgKi8KLQkweGI2MDhmN2YwLAotCTB4MWJmNDAxZjIsCi0JMHg3MGY3ZjFmZCwKLQkweDAwZWZkMDA3LAotLyogMHgwNjkyOiBjdHhfODZjICovCi0JMHhlN2YxMDBmOCwKLQkweGU0YjYwODZjLAotCTB4MDBlZmQwMDYsCi0JMHg4YTE0ZTdmMSwKLQkweGY0NDBlM2YwLAotCTB4ZTdmMThkMjEsCi0JMHhlM2YwYTg2YywKLQkweDhkMjFmNDQxLAotLyogMHgwNmIyOiBjdHhfbG9hZCAqLworLyogMHgwNzhmOiBjdHhfNDE2MHNfd2FpdCAqLworCTB4ZjE5ZDIxZjQsCisJMHhmMDQxNjBlNywKKwkweDIxZjQ0MGUzLAorCTB4MDJmZmI5NjgsCisJMHhmNDA0ZmZjOCwKKwkweDAwZjhmMDBiLAorLyogMHgwN2E0OiBjdHhfNDE2MGMgKi8KKwkweGZmYjlmNGJkLAorCTB4NjBlN2YxMDIsCisJMHg0MGUzZjA0MSwKKwkweGY4OWQyMWY0LAorLyogMHgwN2I1OiBjdHhfNDE3MHMgKi8KKwkweDEwZjVmMDAwLAorCTB4ZjEwMmZmYjksCisJMHhmMDQxNzBlNywKKwkweDIxZjQ0MGUzLAorLyogMHgwN2M3OiBjdHhfNDE3MHcgKi8KKwkweGYxMDBmODlkLAorCTB4ZjA0MTcwZTcsCisJMHgyMWY0NDBlMywKKwkweDAyZmZiOTY4LAorCTB4ZjQxMGY0ZjAsCisJMHgwMGY4ZjAxYiwKKy8qIDB4MDdkYzogY3R4X3JlZHN3aXRjaCAqLworCTB4MDIwMGU3ZjEsCisJMHhmMDQwZTVmMCwKKwkweGU1ZjAyMGU1LAorCTB4MDAwN2YxMTAsCisJMHgwMTAzZjA4NSwKKwkweGJkMDAwZWQwLAorCTB4MDhmN2YwMDQsCisvKiAweDA3Zjg6IGN0eF9yZWRzd2l0Y2hfZGVsYXkgKi8KKwkweGY0MDFmMmI2LAorCTB4ZTVmMWZkMWIsCisJMHhlNWYxMDQwMCwKKwkweDA3ZjEwMTAwLAorCTB4MDNmMDg1MDAsCisJMHgwMDBlZDAwMSwKKwkweDAwZjgwNGJkLAorLyogMHgwODE0OiBjdHhfODZjICovCisJMHgxYjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMGYsCisJMHhmMTAyZmZiOSwKKwkweGYwOGExNGU3LAorCTB4MjFmNDQwZTMsCisJMHgwMmZmYjk5ZCwKKwkweGE4NmNlN2YxLAorCTB4ZjQ0MWUzZjAsCisJMHgwMGY4OWQyMSwKKy8qIDB4MDgzYzogY3R4X21lbSAqLworCTB4ODQwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDBmLAorLyogMHgwODQ4OiBjdHhfbWVtX3dhaXQgKi8KKwkweDg0MDBmN2YxLAorCTB4Y2YwMmYzZjAsCisJMHhmZmZkMDBmZiwKKwkweGYzMWJmNDA1LAorLyogMHgwODVhOiBjdHhfbG9hZCAqLwogCTB4OTRiZDAwZjgsCiAJMHhmMTA1OTlmMCwKIAkweGYwMGYwMDA3LAogCTB4MDlkMDAyMDMsCiAJMHhmMDA0YmQwMCwKIAkweDIxZjQwY2E3LAotCTB4MjQxN2YxYzksCi0JMHgwNjE0YjYwYSwKLQkweGYxMDAxMGQwLAotCTB4YjYwYjAwMzcsCi0JMHgzMmQwMDYzNCwKLQkweDBjMTdmMTQwLAotCTB4MDYxNGI2MGEsCi0JMHhkMDA3NDdmMCwKLQkweDE0ZDAwMDEyLAotLyogMHgwNmVkOiBjdHhfY2hhbl93YWl0XzAgKi8KLQkweDQwMTRjZjQwLAotCTB4ZjQxZjQ0ZjAsCi0JMHgzMmQwZmExYiwKLQkweDAwMGJmZTAwLAotCTB4YjYxZjJhZjAsCi0JMHgyMGI2MDQyNCwKLQkweGYwOTRiZDAyLAorCTB4ZjFmNGJkZDAsCisJMHhmMDg5MDAwNywKKwkweDBmZDAwMjAzLAorCTB4ZjEwNGJkMDAsCisJMHhmMGMxMDAwNywKKwkweDAyZDAwMjAzLAorCTB4ZjEwNGJkMDAsCisJMHhmMDgzMDAwNywKKwkweDAyZDAwMjAzLAorCTB4ZjAwNGJkMDAsCisJMHgyMWY1MDdmNywKKwkweDA3ZjEwODNjLAorCTB4MDNmMGMwMDAsCisJMHgwMDAyZDAwMiwKKwkweDBiZmUwNGJkLAorCTB4MWYyYWYwMDAsCisJMHhiNjA0MjRiNiwKKwkweDk0YmQwMjIwLAorCTB4ZjEwODk5ZjAsCisJMHhmMDBmMDAwNywKKwkweDA5ZDAwMjAzLAorCTB4ZjEwNGJkMDAsCisJMHhmMDgxMDAwNywKKwkweDAyZDAwMjAzLAorCTB4ZjEwNGJkMDAsCisJMHhmMTAwMDAyNywKKwkweGYwODAwMDIzLAorCTB4MDdmMTAyMjUsCisJMHgwM2YwODgwMCwKKwkweDAwMDJkMDAyLAorCTB4MTdmMDA0YmQsCisJMHgwMDI3ZjExMCwKKwkweDAyMjNmMDAyLAorCTB4ZjgwNTEyZmEsCisJMHhmMDk0YmQwMywKIAkweDA3ZjEwODk5LAotCTB4MDNmMDBmMDAsCisJMHgwM2YwMTcwMCwKIAkweDAwMDlkMDAyLAotCTB4MTdmMTA0YmQsCi0JMHgxNGI2MGEwNCwKLQkweDAwMTJkMDA2LAotCTB4MGEyMDE3ZjEsCi0JMHhmMDA2MTRiNiwKLQkweDIzZjEwMjI3LAotCTB4MTJkMDgwMDAsCi0JMHgxMDE3ZjAwMCwKLQkweDAyMDAyN2YxLAotCTB4ZmEwMjIzZjAsCi0JMHgwM2Y4MDUxMiwKKwkweDAxOTgwNGJkLAorCTB4MTgxNGI2ODEsCisJMHhiNjgwMDI5OCwKKwkweDEyZmQwODI1LAorCTB4MTYwMTgwMDUsCiAJMHg5OWYwOTRiZCwKLQkweDAwMDdmMTA4LAorCTB4MDAwN2YxMDksCisJMHgwMjAzZjAwZiwKKwkweGJkMDAwOWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMjAzZjA4MSwKKwkweGJkMDAwMWQwLAorCTB4MDEyN2YwMDQsCisJMHg4ODAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgwMTAwMTdmMSwKKwkweGZhMDYxM2YwLAorCTB4MDNmODA1MDEsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA5LAogCTB4MDIwM2YwMTcsCiAJMHhiZDAwMDlkMCwKLQkweDgxMDE5ODA0LAotCTB4OTgxODE0YjYsCi0JMHgyNWI2ODAwMiwKLQkweDA1MTJmZDA4LAotCTB4YmQxNjAxODAsCi0JMHgwOTk5ZjA5NCwKLQkweDBmMDAwN2YxLAotCTB4ZDAwMjAzZjAsCi0JMHgwNGJkMDAwOSwKLQkweDBhMDQyN2YxLAotCTB4ZDAwNjI0YjYsCi0JMHgyN2YwMDAyMSwKLQkweDIwMTdmMTAxLAotCTB4MDYxNGI2MGEsCi0JMHhmMTAwMTJkMCwKLQkweGYwMDEwMDE3LAotCTB4MDFmYTA2MTMsCi0JMHhiZDAzZjgwNSwKLQkweDA5OTlmMDk0LAotCTB4MTcwMDA3ZjEsCi0JMHhkMDAyMDNmMCwKLQkweDA0YmQwMDA5LAotCTB4OTlmMDk0YmQsCi0JMHgwMDA3ZjEwNSwKLQkweDAyMDNmMDE3LAotCTB4YmQwMDA5ZDAsCi0vKiAweDA3YmI6IGN0eF9jaGFuICovCi0JMHhmNTAwZjgwNCwKLQkweGY1MDYyYjIxLAotCTB4ZjAwNmIyMjEsCi0JMHgyMWY0MGNhNywKLQkweDEwMTdmMWM5LAotCTB4MDYxNGI2MGEsCi0JMHhkMDA1MjdmMCwKLS8qIDB4MDdkNjogY3R4X2NoYW5fd2FpdCAqLwotCTB4MTJjZjAwMTIsCi0JMHgwNTIyZmQwMCwKLQkweGY1ZmExYmY0LAotCTB4ZjgwNjQzMjEsCi0vKiAweDA3ZTU6IGN0eF9tbWlvX2V4ZWMgKi8KLQkweDQxMDM5ODAwLAotCTB4MGEwNDI3ZjEsCi0JMHhkMDA2MjRiNiwKLQkweDM0YmQwMDIzLAotLyogMHgwN2Y0OiBjdHhfbW1pb19sb29wICovCisJMHhmMDk0YmQwNCwKKwkweDA3ZjEwNTk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwOTc4OiBjdHhfY2hhbiAqLworCTB4MDc3ZjIxZjUsCisJMHgwODVhMjFmNSwKKwkweGY0MGNhN2YwLAorCTB4ZjdmMGQwMjEsCisJMHgzYzIxZjUwNSwKKwkweGE0MjFmNTA4LAorLyogMHgwOTkzOiBjdHhfbW1pb19leGVjICovCisJMHg5ODAwZjgwNywKKwkweDA3ZjE0MTAzLAorCTB4MDNmMDgxMDAsCisJMHgwMDAzZDAwMiwKKwkweDM0YmQwNGJkLAorLyogMHgwOWE0OiBjdHhfbW1pb19sb29wICovCiAJMHhmNGZmMzRjNCwKIAkweDU3ZjEwZjFiLAogCTB4NTNmMDAyMDAsCiAJMHgwNTM1ZmEwNiwKLS8qIDB4MDgwNjogY3R4X21taW9fcHVsbCAqLworLyogMHgwOWI2OiBjdHhfbW1pb19wdWxsICovCiAJMHg0ZTk4MDNmOCwKIAkweDgxNGY5ODgwLAotCTB4YjY4ZDIxZjQsCisJMHhiNjlkMjFmNCwKIAkweDEyYjYwODMwLAogCTB4ZGYxYmY0MDEsCi0vKiAweDA4MTg6IGN0eF9tbWlvX2RvbmUgKi8KLQkweGQwMTYwMzk4LAotCTB4MDA4MDAwMjMsCi0JMHgwMDE3ZjE0MCwKLQkweDA2MTNmMDAxLAotCTB4ZjgwNjAxZmEsCi0vKiAweDA4MmY6IGN0eF94ZmVyICovCi0JMHhmMTAwZjgwMywKLQkweGI2MGMwMGY3LAotCTB4ZTdmMDA2ZjQsCi0JMHg4MGZlZDAwNCwKLS8qIDB4MDgzYzogY3R4X3hmZXJfaWRsZSAqLwotCTB4ZjEwMGZlY2YsCi0JMHhmNDIwMDBlNCwKLQkweDExZjRmOTFiLAotCTB4MTEwMmY0MDYsCi0vKiAweDA4NGM6IGN0eF94ZmVyX3ByZSAqLwotCTB4ZjUxMGY3ZjAsCi0JMHhmNTA2OTIyMSwKLQkweGY0MDYyYjIxLAotLyogMHgwODVhOiBjdHhfeGZlcl9wcmVfbG9hZCAqLwotCTB4ZjdmMDFjMTEsCi0JMHg1MTIxZjUwMiwKLQkweDYwMjFmNTA2LAotCTB4NzIyMWY1MDYsCi0JMHhmNWY0YmQwNiwKLQkweGY1MDY1MTIxLAotLyogMHgwODczOiBjdHhfeGZlcl9leGVjICovCi0JMHg5ODA2YjIyMSwKLQkweDI3ZjExNjAxLAotCTB4MjRiNjA0MTQsCi0JMHgwMDIwZDAwNiwKLQkweGE1MDBlN2YxLAotCTB4Yjk0MWUzZjAsCi0JMHgyMWY0MDIxZiwKLQkweDA0ZTBiNjhkLAotCTB4ZjAwMWZjZjAsCi0JMHgyNGI2MDIyYywKLQkweDA1ZjJmZDAxLAotCTB4ZjE4ZDIxZjQsCi0JMHhmMDRhZmMxNywKLQkweDI3ZjAwMjEzLAotCTB4MDAxMmQwMGMsCi0JMHgwMjE1MjFmNSwKLQkweDQ3ZmMyN2YxLAotCTB4ZDAwMjIzZjAsCi0JMHgyY2YwMDAyMCwKKy8qIDB4MDljODogY3R4X21taW9fZG9uZSAqLworCTB4ZjExNjAzOTgsCisJMHhmMDgxMDAwNywKKwkweDAzZDAwMjAzLAorCTB4ODAwNGJkMDAsCisJMHgxN2YxNDAwMCwKKwkweDEzZjAwMTAwLAorCTB4MDYwMWZhMDYsCisJMHgwMGY4MDNmOCwKKy8qIDB4MDllODogY3R4X3hmZXIgKi8KKwkweGYxMDRlN2YwLAorCTB4ZjAwMjAwMDcsCisJMHgwZWQwMDMwMywKKy8qIDB4MDlmNzogY3R4X3hmZXJfaWRsZSAqLworCTB4ZjEwNGJkMDAsCisJMHhmMDAwMDBlNywKKwkweGVlY2YwM2UzLAorCTB4MDBlNGYxMDAsCisJMHhmMjFiZjQyMCwKKwkweGY0MDYxMWY0LAorLyogMHgwYTBlOiBjdHhfeGZlcl9wcmUgKi8KKwkweGY3ZjAxMTAyLAorCTB4MTQyMWY1MTAsCisJMHg3ZjIxZjUwOCwKKwkweDFjMTFmNDA3LAorLyogMHgwYTFjOiBjdHhfeGZlcl9wcmVfbG9hZCAqLworCTB4ZjUwMmY3ZjAsCisJMHhmNTA3YjUyMSwKKwkweGY1MDdjNzIxLAorCTB4YmQwN2RjMjEsCisJMHhiNTIxZjVmNCwKKwkweDVhMjFmNTA3LAorLyogMHgwYTM1OiBjdHhfeGZlcl9leGVjICovCisJMHgxNjAxOTgwOCwKKwkweDA3ZjEyNGJkLAorCTB4MDNmMDA1MDAsCisJMHgwMDAyZDAwMSwKKwkweDFmYjkwNGJkLAorCTB4MDBlN2YxMDIsCisJMHg0MWUzZjBhNSwKKwkweGYwOWQyMWY0LAorCTB4MmNmMDAxZmMsCisJMHgwMTI0YjYwMiwKKwkweGI5MDVmMmZkLAorCTB4ZTdmMTAyZmYsCisJMHhlM2YwYTUwNCwKKwkweDlkMjFmNDQxLAorCTB4MDI2YTIxZjUsCisJMHgwN2YxMjRiZCwKKwkweDAzZjA0N2ZjLAorCTB4MDAwMmQwMDIsCisJMHgyY2YwMDRiZCwKIAkweDAzMjBiNjAxLAotCTB4ZjAwMDEyZDAsCi0JMHhhNWYwMDFhYywKLQkweDAwYjdmMDA2LAotCTB4OTgwMDBjOTgsCi0JMHhlN2YwMDEwZCwKLQkweDY2MjFmNTAwLAotCTB4MDhhN2YwMDEsCi0JMHgwMTA5MjFmNSwKLQkweDAyMTUyMWY1LAotCTB4ZjAyMjAxZjQsCi0JMHgyMWY0MGNhNywKLQkweDEwMTdmMWM5LAotCTB4MDYxNGI2MGEsCi0JMHhkMDA1MjdmMCwKLS8qIDB4MDhmYTogY3R4X3hmZXJfcG9zdF9zYXZlX3dhaXQgKi8KLQkweDEyY2YwMDEyLAotCTB4MDUyMmZkMDAsCi0JMHhmNGZhMWJmNCwKLS8qIDB4MDkwNjogY3R4X3hmZXJfcG9zdCAqLwotCTB4ZjdmMDMyMDIsCi0JMHg1MTIxZjUwMiwKLQkweGY1ZjRiZDA2LAotCTB4ZjUwNjkyMjEsCi0JMHhmNTAyMzQyMSwKLQkweGJkMDY2MDIxLAotCTB4NTEyMWY1ZjQsCi0JMHgxMDExZjQwNiwKLQkweGZkNDAwMTk4LAotCTB4MGJmNDA1MTEsCi0JMHhlNTIxZjUwNywKLS8qIDB4MDkzMTogY3R4X3hmZXJfbm9fcG9zdF9tbWlvICovCi0JMHg0MzIxZjUwNywKLS8qIDB4MDkzNTogY3R4X3hmZXJfZG9uZSAqLwotCTB4MDAwMGY4MDYsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorCTB4NGFmYzA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4ZjAwMWFjZjAsCisJMHhiN2YwMDZhNSwKKwkweDAwMGM5ODAwLAorCTB4ZjAwMTBkOTgsCisJMHgyMWY1MDBlNywKKwkweGE3ZjAwMTZmLAorCTB4MTAyMWY1MDgsCisJMHg1ZTIxZjUwMSwKKwkweDEzMDFmNDAyLAorCTB4ZjQwY2E3ZjAsCisJMHhmN2YwZDAyMSwKKwkweDNjMjFmNTA1LAorCTB4MzIwMmY0MDgsCisvKiAweDBhYzQ6IGN0eF94ZmVyX3Bvc3QgKi8KKwkweGY1MDJmN2YwLAorCTB4YmQwN2I1MjEsCisJMHgxNDIxZjVmNCwKKwkweDdmMjFmNTA4LAorCTB4YzcyMWY1MDIsCisJMHhmNWY0YmQwNywKKwkweGY0MDdiNTIxLAorCTB4MDE5ODEwMTEsCisJMHgwNTExZmQ0MCwKKwkweGY1MDcwYmY0LAorLyogMHgwYWVmOiBjdHhfeGZlcl9ub19wb3N0X21taW8gKi8KKwkweGY1MDk5MzIxLAorLyogMHgwYWYzOiBjdHhfeGZlcl9kb25lICovCisJMHhmODA3YTQyMSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmUwLmZ1Yy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52ZTAuZnVjLmgKaW5kZXggZWI3YmMwZS4uMWMxNzliZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmUwLmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9odWJudmUwLmZ1Yy5oCkBAIC0yMDYsMTQgKzIwNiwxNCBAQAogfTsKIAogdWludDMyX3QgbnZlMF9ncmh1Yl9jb2RlW10gPSB7Ci0JMHgwMzFiMGVmNSwKKwkweDAzOWIwZWY1LAogLyogMHgwMDA0OiBxdWV1ZV9wdXQgKi8KIAkweDk4MDBkODk4LAogCTB4ODZmMDAxZDksCiAJMHgwNDg5YjgwOCwKIAkweGYwMGMxYmY0LAogCTB4MjFmNTAyZjcsCi0JMHgwMGY4MDJmZSwKKwkweDAwZjgwMzdlLAogLyogMHgwMDFjOiBxdWV1ZV9wdXRfbmV4dCAqLwogCTB4YjYwNzk4YzQsCiAJMHg4ZGJiMDM4NCwKQEAgLTIzNywxODQgKzIzNywyMTQgQEAKIC8qIDB4MDA2NjogcXVldWVfZ2V0X2RvbmUgKi8KIAkweDAwZjgwMTMyLAogLyogMHgwMDY4OiBudl9yZDMyICovCi0JMHgwNzI4YjdmMSwKLQkweGI5MDZiNGI2LAotCTB4YzlmMDAyZWMsCi0JMHgwMGJjZDAxZiwKLS8qIDB4MDA3ODogbnZfcmQzMl93YWl0ICovCi0JMHhjODAwYmNjZiwKLQkweDFiZjQxZmNjLAotCTB4MDZhN2YwZmEsCi0JMHgwMTA5MjFmNSwKLQkweGY4NDBiZmNmLAotLyogMHgwMDhkOiBudl93cjMyICovCi0JMHgyOGI3ZjEwMCwKLQkweDA2YjRiNjA3LAotCTB4Yjk4MGJmZDAsCi0JMHhjOWYwMDJlYywKLQkweDFlYzlmMDFmLAotLyogMHgwMGEzOiBudl93cjMyX3dhaXQgKi8KLQkweGNmMDBiY2QwLAotCTB4Y2NjODAwYmMsCi0JMHhmYTFiZjQxZiwKLS8qIDB4MDBhZTogd2F0Y2hkb2dfcmVzZXQgKi8KLQkweDg3ZjEwMGY4LAotCTB4ODRiNjA0MzAsCi0JMHgxZmY5ZjAwNiwKLQkweGY4MDA4ZmQwLAotLyogMHgwMGJkOiB3YXRjaGRvZ19jbGVhciAqLwotCTB4MzA4N2YxMDAsCi0JMHgwNjg0YjYwNCwKLQkweGY4MDA4MGQwLAotLyogMHgwMGM5OiB3YWl0X2RvbmV6ICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDA3ZjEwNGJkLAotCTB4MDNmMDA2MDAsCi0JMHgwMDBhZDAwMiwKLS8qIDB4MDBlNjogd2FpdF9kb25lel9uZSAqLwotCTB4ODdmMTA0YmQsCi0JMHg4M2YwMDAwMCwKLQkweDAwODhjZjAxLAotCTB4ZjQ4ODhhZmYsCi0JMHg5NGJkZjMxYiwKLQkweGYxMDA5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY4MDRiZDAwLAotLyogMHgwMTA5OiB3YWl0X2RvbmVvICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMDk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDg3ZjEwNGJkLAotCTB4ODRiNjA4MTgsCi0JMHgwMDhhZDAwNiwKLS8qIDB4MDEyNDogd2FpdF9kb25lb19lICovCi0JMHgwNDAwODdmMSwKLQkweGNmMDY4NGI2LAotCTB4OGFmZjAwODgsCi0JMHhmMzBiZjQ4OCwKKwkweGYwMDJlY2I5LAorCTB4MDdmMTFmYzksCisJMHgwM2YwY2EwMCwKKwkweDAwMGNkMDAxLAorLyogMHgwMDdhOiBudl9yZDMyX3dhaXQgKi8KKwkweGM3ZjEwNGJkLAorCTB4YzNmMGNhMDAsCisJMHgwMGNjY2YwMSwKKwkweGY0MWZjY2M4LAorCTB4YTdmMGYzMWIsCisJMHgxMDIxZjUwNiwKKwkweDAwZjdmMTAxLAorCTB4MDFmM2YwY2IsCisJMHhmODAwZmZjZiwKKy8qIDB4MDA5ZDogbnZfd3IzMiAqLworCTB4MDAwN2YxMDAsCisJMHgwMTAzZjBjYywKKwkweGJkMDAwZmQwLAorCTB4MDJlY2I5MDQsCisJMHhmMDFmYzlmMCwKKwkweDA3ZjExZWM5LAorCTB4MDNmMGNhMDAsCisJMHgwMDBjZDAwMSwKKy8qIDB4MDBiZTogbnZfd3IzMl93YWl0ICovCisJMHhjN2YxMDRiZCwKKwkweGMzZjBjYTAwLAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweDAwZjhmMzFiLAorLyogMHgwMGQwOiB3YWl0X2RvbmV6ICovCiAJMHg5OWYwOTRiZCwKIAkweDAwMDdmMTAwLAotCTB4MDIwM2YwMTcsCisJMHgwMjAzZjAwZiwKIAkweGJkMDAwOWQwLAotLyogMHgwMTQ3OiBtbWN0eF9zaXplICovCi0JMHhiZDAwZjgwNCwKLS8qIDB4MDE0OTogbnZfbW1jdHhfc2l6ZV9sb29wICovCi0JMHgwMGU4OTg5NCwKLQkweGI2MWE4NWI2LAotCTB4ODRiNjAxODAsCi0JMHgwMDk4YmIwMiwKLQkweGI4MDRlMGI2LAotCTB4MWJmNDA0ZWYsCi0JMHgwMjlmYjllYiwKLS8qIDB4MDE2NjogbW1jdHhfeGZlciAqLwotCTB4OTRiZDAwZjgsCi0JMHhmMTAxOTlmMCwKLQkweGYwMGYwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmMTA0YmQwMCwKLQkweGI2MDcxMDg3LAotCTB4OTRiZDA2ODQsCi0JMHhmNDA1YmJmZCwKLQkweDhiZDAwOTBiLAotCTB4MDA5OWYwMDAsCi0vKiAweDAxOGM6IG1tY3R4X2Jhc2VfZGlzYWJsZWQgKi8KLQkweGY0MDVlZWZkLAotCTB4OGVkMDBjMGIsCi0JMHhjMDhmZDA4MCwKLS8qIDB4MDE5YjogbW1jdHhfbXVsdGlfZGlzYWJsZWQgKi8KLQkweGI3MDE5OWYwLAotCTB4YzgwMTAwODAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAwZWQ6IHdhaXRfZG9uZXpfbmUgKi8KKwkweDAwODdmMTA0LAorCTB4MDE4M2YwMDAsCisJMHhmZjAwODhjZiwKKwkweDFiZjQ4ODhhLAorCTB4ZjA5NGJkZjMsCisJMHgwN2YxMDA5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDExMDogd2FpdF9kb25lbyAqLworCTB4OTlmMDk0YmQsCisJMHgwMDA3ZjEwMCwKKwkweDAyMDNmMDBmLAorCTB4YmQwMDA5ZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDA2LAorCTB4YmQwMDBhZDAsCisvKiAweDAxMmQ6IHdhaXRfZG9uZW9fZSAqLworCTB4MDA4N2YxMDQsCisJMHgwMTgzZjAwMCwKKwkweGZmMDA4OGNmLAorCTB4MGJmNDg4OGEsCisJMHhmMDk0YmRmMywKKwkweDA3ZjEwMDk5LAorCTB4MDNmMDE3MDAsCisJMHgwMDA5ZDAwMiwKKwkweDAwZjgwNGJkLAorLyogMHgwMTUwOiBtbWN0eF9zaXplICovCisvKiAweDAxNTI6IG52X21tY3R4X3NpemVfbG9vcCAqLworCTB4ZTg5ODk0YmQsCisJMHgxYTg1YjYwMCwKKwkweGI2MDE4MGI2LAorCTB4OThiYjAyODQsCisJMHgwNGUwYjYwMCwKKwkweGY0MDRlZmI4LAorCTB4OWZiOWViMWIsCisvKiAweDAxNmY6IG1tY3R4X3hmZXIgKi8KKwkweGJkMDBmODAyLAorCTB4MDE5OWYwOTQsCisJMHgwZjAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisJMHhiYmZkOTRiZCwKKwkweDEyMGJmNDA1LAorCTB4YzQwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBiLAorLyogMHgwMTk3OiBtbWN0eF9iYXNlX2Rpc2FibGVkICovCisJMHhmZDAwOTlmMCwKKwkweDBiZjQwNWVlLAorCTB4MDAwN2YxMWUsCisJMHgwMTAzZjBjNiwKKwkweGJkMDAwZWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMTAzZjBjNywKKwkweGJkMDAwZmQwLAorCTB4MDE5OWYwMDQsCisvKiAweDAxYjg6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCisJMHhiNjAwYWJjOCwKKwkweGI5ZjAxMGI0LAorCTB4MDFhZWM4MGMsCisJMHhmZDExZTRiNiwKKwkweDA3ZjEwNWJlLAorCTB4MDNmMGM1MDAsCisJMHgwMDBiZDAwMSwKKy8qIDB4MDFkNjogbW1jdHhfZXhlY19sb29wICovCisvKiAweDAxZDY6IG1tY3R4X3dhaXRfZnJlZSAqLworCTB4ZTdmMTA0YmQsCisJMHhlM2YwYzUwMCwKKwkweDAwZWVjZjAxLAorCTB4ZjQxZmU0ZjAsCisJMHhjZTk4ZjMwYiwKKwkweDA1ZTlmZDAwLAorCTB4YzgwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBlLAorCTB4YjgwNGMwYjYsCisJMHgxYmY0MDRjZCwKKwkweDAyYWJjOGQ4LAorLyogMHgwMjA3OiBtbWN0eF9maW5pX3dhaXQgKi8KKwkweGYxMWYxYmY0LAorCTB4ZjBjNTAwYjcsCisJMHhiYmNmMDFiMywKKwkweDFmYjRmMDAwLAorCTB4ZjQxMGI0YjAsCisJMHhhN2YwZjAxYiwKKwkweGQwMjFmNDAyLAorLyogMHgwMjIzOiBtbWN0eF9zdG9wICovCisJMHhjODJiMGVmNCwKIAkweGI0YjYwMGFiLAogCTB4MGNiOWYwMTAsCi0JMHhiNjAxYWVjOCwKLQkweGJlZmQxMWU0LAotCTB4MDA4YmQwMDUsCi0vKiAweDAxYjQ6IG1tY3R4X2V4ZWNfbG9vcCAqLwotLyogMHgwMWI0OiBtbWN0eF93YWl0X2ZyZWUgKi8KLQkweGYwMDA4ZWNmLAotCTB4MGJmNDFmZTQsCi0JMHgwMGNlOThmYSwKLQkweGQwMDVlOWZkLAotCTB4YzBiNmMwOGUsCi0JMHgwNGNkYjgwNCwKLQkweGM4ZTgxYmY0LAotCTB4MWJmNDAyYWIsCi0vKiAweDAxZDU6IG1tY3R4X2Zpbmlfd2FpdCAqLwotCTB4MDA4YmNmMTgsCi0JMHhiMDFmYjRmMCwKLQkweDFiZjQxMGI0LAotCTB4MDJhN2YwZjcsCi0JMHhmNGM5MjFmNCwKLS8qIDB4MDFlYTogbW1jdHhfc3RvcCAqLwotCTB4YWJjODFiMGUsCi0JMHgxMGI0YjYwMCwKLQkweGYwMGNiOWYwLAotCTB4OGJkMDEyYjksCi0vKiAweDAxZjk6IG1tY3R4X3N0b3Bfd2FpdCAqLwotCTB4MDA4YmNmMDAsCi0JMHhmNDEyYmJjOCwKLS8qIDB4MDIwMjogbW1jdHhfZG9uZSAqLwotCTB4OTRiZGZhMWIsCi0JMHhmMTAxOTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDIxNTogc3RyYW5kX3dhaXQgKi8KLQkweGYwYTBmOTAwLAotCTB4MjFmNDAyYTcsCi0JMHhmOGEwZmNjOSwKLS8qIDB4MDIyMTogc3RyYW5kX3ByZSAqLwotCTB4ZmM4N2YxMDAsCi0JMHgwMjgzZjA0YSwKLQkweGQwMGM5N2YwLAotCTB4MjFmNTAwODksCi0JMHgwMGY4MDIxNSwKLS8qIDB4MDIzNDogc3RyYW5kX3Bvc3QgKi8KLQkweDRhZmM4N2YxLAotCTB4ZjAwMjgzZjAsCi0JMHg4OWQwMGQ5NywKLQkweDE1MjFmNTAwLAotLyogMHgwMjQ3OiBzdHJhbmRfc2V0ICovCi0JMHhmMTAwZjgwMiwKLQkweGYwNGZmY2E3LAotCTB4YWJhMjAyYTMsCi0JMHhjN2YwMDUwMCwKLQkweDAwYWNkMDBmLAotCTB4ZDAwYmM3ZjAsCi0JMHgyMWY1MDBiYywKLQkweGFlZDAwMjE1LAotCTB4MGFjN2YwMDAsCi0JMHhmNTAwYmNkMCwKLQkweGY4MDIxNTIxLAotLyogMHgwMjcxOiBzdHJhbmRfY3R4X2luaXQgKi8KLQkweGYwOTRiZDAwLAotCTB4MDdmMTAzOTksCi0JMHgwM2YwMGYwMCwKKwkweGYxMTJiOWYwLAorCTB4ZjBjNTAwMDcsCisJMHgwYmQwMDEwMywKKy8qIDB4MDIzYjogbW1jdHhfc3RvcF93YWl0ICovCisJMHhmMTA0YmQwMCwKKwkweGYwYzUwMGI3LAorCTB4YmJjZjAxYjMsCisJMHgxMmJiYzgwMCwKKy8qIDB4MDI0YjogbW1jdHhfZG9uZSAqLworCTB4YmRmMzFiZjQsCisJMHgwMTk5ZjA5NCwKKwkweDE3MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKy8qIDB4MDI1ZTogc3RyYW5kX3dhaXQgKi8KKwkweGEwZjkwMGY4LAorCTB4ZjQwMmE3ZjAsCisJMHhhMGZjZDAyMSwKKy8qIDB4MDI2YTogc3RyYW5kX3ByZSAqLworCTB4OTdmMDAwZjgsCisJMHhmYzA3ZjEwYywKKwkweDAyMDNmMDRhLAorCTB4YmQwMDA5ZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDI3Zjogc3RyYW5kX3Bvc3QgKi8KKwkweGYwMDBmODAyLAorCTB4MDdmMTBkOTcsCisJMHgwM2YwNGFmYywKIAkweDAwMDlkMDAyLAogCTB4MjFmNTA0YmQsCi0JMHhlN2YwMDIyMSwKLQkweDQ3MjFmNTAzLAotCTB4ZmNhN2YxMDIsCi0JMHgwMmEzZjA0NiwKLQkweDA0MDBhYmEwLAotCTB4ZjA0MGEwZDAsCi0JMHhiY2QwMDFjNywKLQkweDE1MjFmNTAwLAotCTB4MDEwYzkyMDIsCi0JMHhmMDAwYWNkMCwKLQkweGJjZDAwMmM3LAotCTB4MTUyMWY1MDAsCi0JMHgzNDIxZjUwMiwKLQkweDgwODdmMTAyLAotCTB4MDY4NGI2MDgsCi0JMHhiNzAwODljZiwKLQkweDk1MjIwMDgwLAotLyogMHgwMmNhOiBjdHhfaW5pdF9zdHJhbmRfbG9vcCAqLworCTB4MDBmODAyNWUsCisvKiAweDAyOTQ6IHN0cmFuZF9zZXQgKi8KKwkweGYxMGZjN2YwLAorCTB4ZjA0ZmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTBiYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwNGZmYywKKwkweDAwMGVkMDAyLAorCTB4YzdmMDA0YmQsCisJMHhmYzA3ZjEwYSwKKwkweDAyMDNmMDRhLAorCTB4YmQwMDBjZDAsCisJMHg1ZTIxZjUwNCwKKy8qIDB4MDJkMzogc3RyYW5kX2N0eF9pbml0ICovCisJMHhiZDAwZjgwMiwKKwkweDAzOTlmMDk0LAorCTB4MGYwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorCTB4MDI2YTIxZjUsCisJMHhmNTAzZTdmMCwKKwkweGJkMDI5NDIxLAorCTB4ZmMwN2YxYzQsCisJMHgwMjAzZjA0NywKKwkweGJkMDAwY2QwLAorCTB4MDFjN2YwMDQsCisJMHg0YWZjMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMGMsCisJMHgwMjVlMjFmNSwKKwkweGYxMDEwYzkyLAorCTB4ZjA0NmZjMDcsCisJMHgwY2QwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTAyYzcsCisJMHgwM2YwNGFmYywKKwkweDAwMGNkMDAyLAorCTB4MjFmNTA0YmQsCisJMHgyMWY1MDI1ZSwKKwkweDg3ZjEwMjdmLAorCTB4ODNmMDQyMDAsCisJMHgwMDk3ZjEwMiwKKwkweDAyOTNmMDIwLAorCTB4OTUwMDk5Y2YsCisvKiAweDAzNGE6IGN0eF9pbml0X3N0cmFuZF9sb29wICovCiAJMHg4ZWQwMDhmZSwKIAkweDQwOGVkMDAwLAogCTB4YjY4MDhhY2YsCkBAIC00MjgsNyArNDU4LDcgQEAKIAkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLS8qIDB4MDJmZTogZXJyb3IgKi8KKy8qIDB4MDM3ZTogZXJyb3IgKi8KIAkweDA3ZjEwMGY4LAogCTB4MDNmMDA1MDAsCiAJMHgwMDBmZDAwMiwKQEAgLTQzNiw4MiArNDY2LDExNyBAQAogCTB4MDAwN2YxMDEsCiAJMHgwMzAzZjAwNywKIAkweGJkMDAwZmQwLAotLyogMHgwMzFiOiBpbml0ICovCisvKiAweDAzOWI6IGluaXQgKi8KIAkweGJkMDBmODA0LAotCTB4MDAwNGZlMDQsCi0JMHhmMTAwMDdmZSwKLQkweGYwMTIwMDE3LAotCTB4MTJkMDAyMjcsCi0JMHhiMTE3ZjEwMCwKLQkweDAwMTBmZTA1LAotCTB4MDQwMDE3ZjEsCi0JMHhmMWMwMTBkMCwKLQkweGI2MDQwNDM3LAotCTB4MjdmMTA2MzQsCi0JMHgzMmQwMjAwMywKLQkweDA0MjdmMTAwLAotCTB4MDEzMmQwMjAsCisJMHgwMDA3ZmUwNCwKKwkweDQyMDAxN2YxLAorCTB4Y2YwMDEzZjAsCisJMHgxMWU3MDAxMSwKKwkweDE0YjYwMTA5LAorCTB4MDAxNGZlMDgsCisJMHhmMTAyMjdmMCwKKwkweGYwMTIwMDA3LAorCTB4MDJkMDAwMDMsCisJMHhmMTA0YmQwMCwKKwkweGZlMDZjODE3LAorCTB4MjRiZDAwMTAsCisJMHgwNzAwMDdmMSwKKwkweGQwMDAwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDAzMjdmMSwKKwkweDAxMDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKKwkweDIwMDQyN2YxLAorCTB4MDEwNDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDAyLAogCTB4MjAwYjI3ZjEsCi0JMHhmMTAyMzJkMCwKLQkweGQwMjAwYzI3LAotCTB4MjdmMTA3MzIsCi0JMHgyNGI2MGMyNCwKLQkweDAwMDNiOTA2LAotCTB4ZjEwMDIzZDAsCisJMHgwMTA4MDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDBjMjdmMSwKKwkweDAxMWMwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGYxMDEwMzkyLAorCTB4ZjAwOTAwMDcsCisJMHgwM2QwMDMwMywKKwkweGYxMDRiZDAwLAogCTB4ZjA4NzA0MjcsCi0JMHgxMmQwMDAyMywKLQkweDAwMTJiNzAwLAotCTB4MDQyN2YwMDEsCi0JMHhmNDAwMTJkMCwKLQkweGU3ZjExMDMxLAotCTB4ZTNmMDk2MDQsCi0JMHg2ODIxZjQ0MCwKLQkweDgwOTBmMWM3LAotCTB4ZjRmMDAzMDEsCi0JMHgwMjBmODAxZiwKLQkweGJiMDExN2YwLAotCTB4MTJiNjA0MWYsCi0JMHgwYzI3ZjEwMSwKLQkweDA2MjRiNjA0LAotCTB4ZDAwMDIxZDAsCi0JMHgxN2YxNDAyMSwKLQkweDBlOTgwMTAwLAotCTB4MDEwZjk4MDAsCi0JMHgwMTQ3MjFmNSwKLQkweDA3MDAzN2YxLAotCTB4OTUwNjM0YjYsCi0JMHgzNGQwMDgxNCwKLQkweDQwMzRkMDAwLAotCTB4MTMwMDMwYjcsCi0JMHhiNjAwMWZiYiwKLQkweDNmZDAwMmY1LAotCTB4MDgxNWI2MDAsCi0JMHhiNjAxMTBiNiwKLQkweDFmYjkwODE0LAotCTB4NzEyMWY1MDIsCi0JMHgwMDFmYmIwMiwKLQkweGYxMDIwMzk4LAotCTB4ZjAyMDAwNDcsCi0vKiAweDAzZjY6IGluaXRfZ3BjICovCi0JMHg0ZWEwNTA0MywKLQkweDFmYjkwODA0LAotCTB4OGQyMWY0MDIsCi0JMHgwMTBjNGVhMCwKLQkweDIxZjRmNGJkLAotCTB4MDQ0ZWEwOGQsCi0JMHg4ZDIxZjQwMSwKLQkweDAxMDA0ZWEwLAotCTB4ZjQwMmY3ZjAsCi0JMHg0ZWEwOGQyMSwKLS8qIDB4MDQxZTogaW5pdF9ncGNfd2FpdCAqLwotCTB4MjFmNDA4MDAsCi0JMHgxZmZmYzg2OCwKLQkweGEwZmEwYmY0LAotCTB4ZjQwODA0NGUsCi0JMHgxZmJiNjgyMSwKLQkweDAwNDBiNzAwLAotCTB4MDEzMmI2ODAsCi0JMHhmMWJlMWJmNCwKKwkweDA3ZjEwMDIzLAorCTB4MDNmMDA0MDAsCisJMHgwMDAyZDAwMCwKKwkweDI3ZjAwNGJkLAorCTB4MDAwN2YxMDQsCisJMHgwMDAzZjAwMywKKwkweGJkMDAwMmQwLAorCTB4MTAzMWY0MDQsCisJMHg5NjA0ZTdmMSwKKwkweGY0NDBlM2YwLAorCTB4ZmViOTY4MjEsCisJMHg5MGYxYzcwMiwKKwkweGYwMDMwMTgwLAorCTB4MGY4MDFmZjQsCisJMHgwMTE3ZjAwMiwKKwkweGI2MDQxZmJiLAorCTB4MDdmMTAxMTIsCisJMHgwM2YwMDMwMCwKKwkweDAwMDFkMDAxLAorCTB4MDdmMTA0YmQsCisJMHgwM2YwMDQwMCwKKwkweDAwMDFkMDAxLAorCTB4MTdmMTA0YmQsCisJMHhmN2YwMDEwMCwKKwkweDdmMjFmNTAyLAorCTB4OTEyMWY1MDcsCisJMHgxMGY3ZjAwNywKKwkweDA3ZGUyMWY1LAorCTB4OTgwMDBlOTgsCisJMHgyMWY1MDEwZiwKKwkweDE0OTUwMTUwLAorCTB4MDAwN2YxMDgsCisJMHgwMTAzZjBjMCwKKwkweGJkMDAwNGQwLAorCTB4MDAwN2YxMDQsCisJMHgwMTAzZjBjMSwKKwkweGJkMDAwNGQwLAorCTB4MDAzMGI3MDQsCisJMHgwMDFmYmIxMywKKwkweGYxMDJmNWI2LAorCTB4ZjBkMzAwMDcsCisJMHgwZmQwMDEwMywKKwkweGI2MDRiZDAwLAorCTB4MTBiNjA4MTUsCisJMHgwODE0YjYwMSwKKwkweGY1MDIxZmI5LAorCTB4YmIwMmQzMjEsCisJMHgwMzk4MDAxZiwKKwkweDAwNDdmMTAyLAorCTB4NTA0M2YwMjAsCisvKiAweDA0ZjQ6IGluaXRfZ3BjICovCisJMHgwODA0NGVhMCwKKwkweGY0MDIxZmI5LAorCTB4NGVhMDlkMjEsCisJMHhmNGJkMDEwYywKKwkweGEwOWQyMWY0LAorCTB4ZjQwMTA0NGUsCisJMHg0ZWEwOWQyMSwKKwkweGY3ZjAwMTAwLAorCTB4OWQyMWY0MDIsCisJMHgwODAwNGVhMCwKKy8qIDB4MDUxYzogaW5pdF9ncGNfd2FpdCAqLworCTB4Yzg2ODIxZjQsCisJMHgwYmY0MWZmZiwKKwkweDA0NGVhMGZhLAorCTB4NjgyMWY0MDgsCisJMHhiNzAwMWZiYiwKKwkweGI2ODAwMDQwLAorCTB4MWJmNDAxMzIsCisJMHgwMGY3ZjBiZSwKKwkweDA3ZGUyMWY1LAorCTB4ZjUwMGY3ZjAsCisJMHhmMTA3N2YyMSwKIAkweGYwMDEwMDA3LAogCTB4MDFkMDAyMDMsCiAJMHhiZDA0YmQwMCwKQEAgLTUxOSwzODIgKzU4NCwzNzkgQEAKIAkweDA4MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwMSwKLS8qIDB4MDQ1ODogbWFpbiAqLworLyogMHgwNTY0OiBtYWluICovCiAJMHhmNDAwMzFmNCwKIAkweGQ3ZjAwMDI4LAogCTB4MzkyMWY0MTAsCiAJMHhiMWY0MDFmNCwKIAkweGY1NDAwMWU0LAotCTB4YmQwMGRlMWIsCisJMHhiZDAwZTkxYiwKIAkweDA0OTlmMDk0LAogCTB4MGYwMDA3ZjEsCiAJMHhkMDAyMDNmMCwKIAkweDA0YmQwMDA5LAotCTB4MGIwMDE3ZjEsCi0JMHhjZjA2MTRiNiwKLQkweDExY2Y0MDEyLAotCTB4MWYxM2M4MDAsCi0JMHgwMDg3MGJmNSwKKwkweGMwMDAxN2YxLAorCTB4Y2YwMjEzZjAsCisJMHgyN2YxMDAxMSwKKwkweDIzZjBjMTAwLAorCTB4MDAyMmNmMDIsCisJMHhmNTFmMTNjOCwKKwkweGM4MDA4OTBiLAorCTB4MGJmNDFmMjMsCisJMHhiOTIwZjk2MiwKKwkweDk0YmQwMjEyLAorCTB4ZjEwNzk5ZjAsCisJMHhmMDBmMDAwNywKKwkweDA5ZDAwMjAzLAorCTB4ZjQwNGJkMDAsCisJMHgzMWY0MDEzMiwKKwkweGFhMjFmNTAyLAorCTB4ZjA5NGJkMDksCisJMHgwN2YxMDc5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgyMGZjMDRiZCwKKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDYsCisJMHgwMjAzZjAwZiwKKwkweGJkMDAwOWQwLAorCTB4MDEzMWY0MDQsCisJMHgwOWFhMjFmNSwKKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDYsCisJMHgwMjAzZjAxNywKKwkweGJkMDAwOWQwLAorCTB4MzMwZWY0MDQsCisvKiAweDA2MGM6IGNoc3dfcHJldl9ub19uZXh0ICovCisJMHgxMmI5MjBmOSwKKwkweDAxMzJmNDAyLAorCTB4ZjUwMjMyZjQsCisJMHhmYzA5YWEyMSwKKwkweDAwMDdmMTIwLAorCTB4MDIwM2YwYzAsCisJMHhiZDAwMDJkMCwKKwkweDEzMGVmNDA0LAorLyogMHgwNjJjOiBjaHN3X25vX3ByZXYgKi8KIAkweGY0MWYyM2M4LAotCTB4MjBmOTYyMGIsCi0JMHhiZDAyMTJiOSwKLQkweDA3OTlmMDk0LAotCTB4MGYwMDA3ZjEsCisJMHgzMWY0MGQwYiwKKwkweDAyMzJmNDAxLAorCTB4MDlhYTIxZjUsCisvKiAweDA2M2M6IGNoc3dfZG9uZSAqLworCTB4ZjEwMTI3ZjAsCisJMHhmMGMzMDAwNywKKwkweDAyZDAwMjAzLAorCTB4YmQwNGJkMDAsCisJMHgwNDk5ZjA5NCwKKwkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLQkweGY0MDEzMmY0LAotCTB4MjFmNTAyMzEsCi0JMHg5NGJkMDgwMSwKKwkweGZmMDgwZWY1LAorLyogMHgwNjYwOiBtYWluX25vdF9jdHhfc3dpdGNoICovCisJMHhmNDAxZTRiMCwKKwkweGYyYjkwZDFiLAorCTB4NDIyMWY1MDIsCisJMHg0NjBlZjQwOSwKKy8qIDB4MDY3MDogbWFpbl9ub3RfY3R4X2NoYW4gKi8KKwkweGY0MDJlNGIwLAorCTB4OTRiZDMyMWIsCiAJMHhmMTA3OTlmMCwKLQkweGYwMTcwMDA3LAorCTB4ZjAwZjAwMDcsCiAJMHgwOWQwMDIwMywKLQkweGZjMDRiZDAwLAotCTB4ZjA5NGJkMjAsCi0JMHgwN2YxMDY5OSwKLQkweDAzZjAwZjAwLAotCTB4MDAwOWQwMDIsCi0JMHgzMWY0MDRiZCwKLQkweDAxMjFmNTAxLAotCTB4ZjA5NGJkMDgsCi0JMHgwN2YxMDY5OSwKKwkweGY0MDRiZDAwLAorCTB4MzJmNDAxMzIsCisJMHhhYTIxZjUwMiwKKwkweGYwOTRiZDA5LAorCTB4MDdmMTA3OTksCiAJMHgwM2YwMTcwMCwKIAkweDAwMDlkMDAyLAogCTB4MGVmNDA0YmQsCi0vKiAweDA0Zjk6IGNoc3dfcHJldl9ub19uZXh0ICovCi0JMHhiOTIwZjkzMSwKLQkweDMyZjQwMjEyLAotCTB4MDIzMmY0MDEsCi0JMHgwODAxMjFmNSwKLQkweDE3ZjEyMGZjLAotCTB4MTRiNjBiMDAsCi0JMHgwMDEyZDAwNiwKLS8qIDB4MDUxNzogY2hzd19ub19wcmV2ICovCi0JMHhjODEzMGVmNCwKLQkweDBiZjQxZjIzLAotCTB4MDEzMWY0MGQsCi0JMHhmNTAyMzJmNCwKLS8qIDB4MDUyNzogY2hzd19kb25lICovCi0JMHhmMTA4MDEyMSwKLQkweGI2MGIwYzE3LAotCTB4MjdmMDA2MTQsCi0JMHgwMDEyZDAwMSwKLQkweDk5ZjA5NGJkLAotCTB4MDAwN2YxMDQsCi0JMHgwMjAzZjAxNywKLQkweGJkMDAwOWQwLAotCTB4MTMwZWY1MDQsCi0vKiAweDA1NDk6IG1haW5fbm90X2N0eF9zd2l0Y2ggKi8KLQkweDAxZTRiMGZmLAotCTB4YjkwZDFiZjQsCi0JMHgyMWY1MDJmMiwKLQkweDBlZjQwNzk1LAotLyogMHgwNTU5OiBtYWluX25vdF9jdHhfY2hhbiAqLwotCTB4MDJlNGIwNDYsCi0JMHhiZDMyMWJmNCwKLQkweDA3OTlmMDk0LAotCTB4MGYwMDA3ZjEsCisvKiAweDA2YTU6IG1haW5fbm90X2N0eF9zYXZlICovCisJMHgxMGVmOTQxMSwKKwkweGY1MDFmNWYwLAorCTB4ZjUwMzdlMjEsCisvKiAweDA2YjM6IG1haW5fZG9uZSAqLworCTB4YmRmZWI1MGUsCisJMHgxZjI5ZjAyNCwKKwkweDA4MDAwN2YxLAogCTB4ZDAwMjAzZjAsCi0JMHgwNGJkMDAwOSwKLQkweGY0MDEzMmY0LAotCTB4MjFmNTAyMzIsCi0JMHg5NGJkMDgwMSwKLQkweGYxMDc5OWYwLAotCTB4ZjAxNzAwMDcsCi0JMHgwOWQwMDIwMywKLQkweGY0MDRiZDAwLAotLyogMHgwNThlOiBtYWluX25vdF9jdHhfc2F2ZSAqLwotCTB4ZWY5NDExMGUsCi0JMHgwMWY1ZjAxMCwKLQkweDAyZmUyMWY1LAotCTB4ZmVjMDBlZjUsCi0vKiAweDA1OWM6IG1haW5fZG9uZSAqLwotCTB4MjlmMDI0YmQsCi0JMHgwMDA3ZjExZiwKLQkweDAyMDNmMDA4LAotCTB4YmQwMDAyZDAsCi0JMHhhYjBlZjUwNCwKLS8qIDB4MDViMTogaWggKi8KLQkweGZlODBmOWZlLAotCTB4ODBmOTAxODgsCi0JMHhhMGY5OTBmOSwKLQkweGQwZjliMGY5LAotCTB4ZjBmOWUwZjksCi0JMHgwYWNmMDRiZCwKLQkweDA0YWJjNDgwLAotCTB4ZjExZDBiZjQsCi0JMHhmMDE5MDBiNywKLQkweGJlY2YxMGQ3LAotCTB4MDBiZmNmNDAsCisJMHgwNGJkMDAwMiwKKwkweGZlYTAwZWY1LAorLyogMHgwNmM4OiBpaCAqLworCTB4ODhmZTgwZjksCisJMHhmOTgwZjkwMSwKKwkweGY5YTBmOTkwLAorCTB4ZjlkMGY5YjAsCisJMHhiZGYwZjllMCwKKwkweDAwYTdmMTA0LAorCTB4MDBhM2YwMDIsCisJMHhjNDAwYWFjZiwKKwkweDBiZjQwNGFiLAorCTB4MTBkN2YwMzAsCisJMHgxYTAwZTdmMSwKKwkweGNmMDBlM2YwLAorCTB4ZjdmMTAwZWUsCisJMHhmM2YwMTkwMCwKKwkweDAwZmZjZjAwLAogCTB4YjcwNDIxZjQsCiAJMHhmMDA0MDBiMCwKLQkweGJlZDAwMWU3LAotLyogMHgwNWU5OiBpaF9ub19maWZvICovCi0JMHgwMGFiZTQwMCwKLQkweDBkMGJmNDAxLAotCTB4ZjExMGQ3ZjAsCi0JMHhmNDQwMDFlNywKLS8qIDB4MDVmYTogaWhfbm9fY3R4c3cgKi8KLQkweGI3ZjEwNDIxLAotCTB4YjBiZDAxMDQsCi0JMHhmNGI0YWJmZiwKLQkweGE3ZjEwZDBiLAotCTB4YTRiNjBjMWMsCi0JMHgwMGFiZDAwNiwKLS8qIDB4MDYxMDogaWhfbm9fb3RoZXIgKi8KLQkweGZjNDAwYWQwLAorCTB4MDdmMTAxZTcsCisJMHgwM2YwMWQwMCwKKwkweDAwMGVkMDAwLAorLyogMHgwNzFhOiBpaF9ub19maWZvICovCisJMHhhYmU0MDRiZCwKKwkweDBiZjQwMTAwLAorCTB4MTBkN2YwMGQsCisJMHg0MDAxZTdmMSwKKy8qIDB4MDcyYjogaWhfbm9fY3R4c3cgKi8KKwkweGU0MDQyMWY0LAorCTB4ZjQwNDAwYWIsCisJMHhiN2YxMTQwYiwKKwkweGJmYjkwMTAwLAorCTB4NDRlN2YxMDIsCisJMHg0MGUzZjAwMSwKKy8qIDB4MDc0MzogaWhfbm9fZndtdGhkICovCisJMHhmMTlkMjFmNCwKKwkweGJkMDEwNGI3LAorCTB4YjRhYmZmYjAsCisJMHhmMTBmMGJmNCwKKwkweGYwMDcwMDA3LAorCTB4MGJkMDAzMDMsCisvKiAweDA3NWI6IGloX25vX290aGVyICovCisJMHhmMTA0YmQwMCwKKwkweGYwMDEwMDA3LAorCTB4MGFkMDAwMDMsCisJMHhmYzA0YmQwMCwKIAkweGZjZTBmY2YwLAogCTB4ZmNiMGZjZDAsCiAJMHhmYzkwZmNhMCwKIAkweDAwODhmZTgwLAogCTB4MzJmNDgwZmMsCi0vKiAweDA2MmI6IGN0eF80MTcwcyAqLwotCTB4ZjEwMWY4MDAsCi0JMHhmMDQxNzBlNywKLQkweGY1ZjA0MGUzLAotCTB4OGQyMWY0MTAsCi0vKiAweDA2M2E6IGN0eF80MTcwdyAqLworLyogMHgwNzdmOiBjdHhfNDE3MHMgKi8KKwkweGYwMDFmODAwLAorCTB4ZmZiOTEwZjUsCisJMHg3MGU3ZjEwMiwKKwkweDQwZTNmMDQxLAorCTB4Zjg5ZDIxZjQsCisvKiAweDA3OTE6IGN0eF80MTcwdyAqLworCTB4NzBlN2YxMDAsCisJMHg0MGUzZjA0MSwKKwkweGI5NjgyMWY0LAorCTB4ZjRmMDAyZmYsCisJMHhmMDFiZjQxMCwKKy8qIDB4MDdhNjogY3R4X3JlZHN3aXRjaCAqLwogCTB4ZTdmMTAwZjgsCi0JMHhlM2YwNDE3MCwKLQkweDY4MjFmNDQwLAotCTB4ZjQxMGY0ZjAsCisJMHhlNWYwMDIwMCwKKwkweDIwZTVmMDQwLAorCTB4ZjExMGU1ZjAsCisJMHhmMDg1MDAwNywKKwkweDBlZDAwMTAzLAorCTB4ZjAwNGJkMDAsCisvKiAweDA3YzI6IGN0eF9yZWRzd2l0Y2hfZGVsYXkgKi8KKwkweGYyYjYwOGY3LAorCTB4ZmQxYmY0MDEsCisJMHgwNDAwZTVmMSwKKwkweDAxMDBlNWYxLAorCTB4ODUwMDA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDBlLAorLyogMHgwN2RlOiBjdHhfODZjICovCisJMHgwN2YxMDBmOCwKKwkweDAzZjAxYjAwLAorCTB4MDAwZmQwMDIsCisJMHhmZmI5MDRiZCwKKwkweDE0ZTdmMTAyLAorCTB4NDBlM2YwOGEsCisJMHhiOTlkMjFmNCwKKwkweGU3ZjEwMmZmLAorCTB4ZTNmMGE4NmMsCisJMHg5ZDIxZjQ0MSwKKy8qIDB4MDgwNjogY3R4X21lbSAqLworCTB4MDdmMTAwZjgsCisJMHgwM2YwODQwMCwKKwkweDAwMGZkMDAyLAorLyogMHgwODEyOiBjdHhfbWVtX3dhaXQgKi8KKwkweGY3ZjEwNGJkLAorCTB4ZjNmMDg0MDAsCisJMHgwMGZmY2YwMiwKKwkweGY0MDVmZmZkLAogCTB4MDBmOGYzMWIsCi0vKiAweDA2NGM6IGN0eF9yZWRzd2l0Y2ggKi8KLQkweDA2MTRlN2YxLAotCTB4ZjEwNmU0YjYsCi0JMHhkMDAyNzBmNywKLQkweGY3ZjAwMGVmLAotLyogMHgwNjVkOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCi0JMHgwMWYyYjYwOCwKLQkweGYxZmQxYmY0LAotCTB4ZDAwNzcwZjcsCi0JMHgwMGY4MDBlZiwKLS8qIDB4MDY2YzogY3R4Xzg2YyAqLwotCTB4MDg2Y2U3ZjEsCi0JMHhkMDA2ZTRiNiwKLQkweGU3ZjEwMGVmLAotCTB4ZTNmMDhhMTQsCi0JMHg4ZDIxZjQ0MCwKLQkweGE4NmNlN2YxLAotCTB4ZjQ0MWUzZjAsCi0JMHgwMGY4OGQyMSwKLS8qIDB4MDY4YzogY3R4X2xvYWQgKi8KKy8qIDB4MDgyNDogY3R4X2xvYWQgKi8KIAkweDk5ZjA5NGJkLAogCTB4MDAwN2YxMDUsCiAJMHgwMjAzZjAwZiwKIAkweGJkMDAwOWQwLAogCTB4MGNhN2YwMDQsCi0JMHhmMWM5MjFmNCwKLQkweGI2MGEyNDE3LAotCTB4MTBkMDA2MTQsCi0JMHgwMDM3ZjEwMCwKLQkweDA2MzRiNjBiLAotCTB4ZjE0MDMyZDAsCi0JMHhiNjBhMGMxNywKLQkweDQ3ZjAwNjE0LAotCTB4MDAxMmQwMDcsCi0vKiAweDA2Yzc6IGN0eF9jaGFuX3dhaXRfMCAqLwotCTB4Y2Y0MDE0ZDAsCi0JMHg0NGYwNDAxNCwKLQkweGZhMWJmNDFmLAotCTB4ZmUwMDMyZDAsCi0JMHgyYWYwMDAwYiwKLQkweDA0MjRiNjFmLAotCTB4YmQwMjIwYjYsCisJMHhiZGQwMjFmNCwKKwkweDAwMDdmMWY0LAorCTB4MDIwM2YwODksCisJMHhiZDAwMGZkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwYzEsCisJMHhiZDAwMDJkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwODMsCisJMHhiZDAwMDJkMCwKKwkweDA3ZjdmMDA0LAorCTB4MDgwNjIxZjUsCisJMHhjMDAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDIsCisJMHhmMDAwMGJmZSwKKwkweDI0YjYxZjJhLAorCTB4MDIyMGI2MDQsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA4LAorCTB4MDIwM2YwMGYsCisJMHhiZDAwMDlkMCwKKwkweDAwMDdmMTA0LAorCTB4MDIwM2YwODEsCisJMHhiZDAwMDJkMCwKKwkweDAwMjdmMTA0LAorCTB4MDAyM2YxMDAsCisJMHgwMjI1ZjA4MCwKKwkweDg4MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGYxMTAxN2YwLAorCTB4ZjAwMjAwMjcsCisJMHgxMmZhMDIyMywKKwkweGJkMDNmODA1LAogCTB4MDg5OWYwOTQsCi0JMHgwZjAwMDdmMSwKKwkweDE3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLQkweDBhMDQxN2YxLAotCTB4ZDAwNjE0YjYsCi0JMHgxN2YxMDAxMiwKLQkweDE0YjYwYTIwLAotCTB4MDIyN2YwMDYsCi0JMHg4MDAwMjNmMSwKLQkweGYwMDAxMmQwLAotCTB4MjdmMTEwMTcsCi0JMHgyM2YwMDIwMCwKLQkweDA1MTJmYTAyLAorCTB4YjY4MTAxOTgsCisJMHgwMjk4MTgxNCwKKwkweDA4MjViNjgwLAorCTB4ODAwNTEyZmQsCisJMHg5NGJkMTYwMSwKKwkweGYxMDk5OWYwLAorCTB4ZjAwZjAwMDcsCisJMHgwOWQwMDIwMywKKwkweGYxMDRiZDAwLAorCTB4ZjA4MTAwMDcsCisJMHgwMWQwMDIwMywKKwkweGYwMDRiZDAwLAorCTB4MDdmMTAxMjcsCisJMHgwM2YwODgwMCwKKwkweDAwMDJkMDAyLAorCTB4MTdmMTA0YmQsCisJMHgxM2YwMDEwMCwKKwkweDA1MDFmYTA2LAogCTB4OTRiZDAzZjgsCi0JMHhmMTA4OTlmMCwKKwkweGYxMDk5OWYwLAogCTB4ZjAxNzAwMDcsCiAJMHgwOWQwMDIwMywKLQkweDk4MDRiZDAwLAotCTB4MTRiNjgxMDEsCi0JMHg4MDAyOTgxOCwKLQkweGZkMDgyNWI2LAotCTB4MDE4MDA1MTIsCi0JMHhmMDk0YmQxNiwKLQkweDA3ZjEwOTk5LAotCTB4MDNmMDBmMDAsCi0JMHgwMDA5ZDAwMiwKLQkweDI3ZjEwNGJkLAotCTB4MjRiNjBhMDQsCi0JMHgwMDIxZDAwNiwKLQkweGYxMDEyN2YwLAotCTB4YjYwYTIwMTcsCi0JMHgxMmQwMDYxNCwKLQkweDAwMTdmMTAwLAotCTB4MDYxM2YwMDEsCi0JMHhmODA1MDFmYSwKLQkweGYwOTRiZDAzLAotCTB4MDdmMTA5OTksCi0JMHgwM2YwMTcwMCwKLQkweDAwMDlkMDAyLAotCTB4OTRiZDA0YmQsCi0JMHhmMTA1OTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDc5NTogY3R4X2NoYW4gKi8KLQkweDhjMjFmNTAwLAotCTB4MGNhN2YwMDYsCi0JMHhmMWM5MjFmNCwKLQkweGI2MGExMDE3LAotCTB4MjdmMDA2MTQsCi0JMHgwMDEyZDAwNSwKLS8qIDB4MDdhYzogY3R4X2NoYW5fd2FpdCAqLwotCTB4ZmQwMDEyY2YsCi0JMHgxYmY0MDUyMiwKLS8qIDB4MDdiNzogY3R4X21taW9fZXhlYyAqLwotCTB4OTgwMGY4ZmEsCi0JMHgyN2YxNDEwMywKLQkweDI0YjYwYTA0LAotCTB4MDAyM2QwMDYsCi0vKiAweDA3YzY6IGN0eF9tbWlvX2xvb3AgKi8KKwkweGJkMDRiZDAwLAorCTB4MDU5OWYwOTQsCisJMHgxNzAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisvKiAweDA5NDI6IGN0eF9jaGFuICovCisJMHgyMWY1MDBmOCwKKwkweGE3ZjAwODI0LAorCTB4ZDAyMWY0MGMsCisJMHhmNTA1ZjdmMCwKKwkweGY4MDgwNjIxLAorLyogMHgwOTU1OiBjdHhfbW1pb19leGVjICovCisJMHg0MTAzOTgwMCwKKwkweDgxMDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwMywKKy8qIDB4MDk2NjogY3R4X21taW9fbG9vcCAqLwogCTB4MzRjNDM0YmQsCiAJMHgwZjFiZjRmZiwKIAkweDAyMDA1N2YxLAogCTB4ZmEwNjUzZjAsCiAJMHgwM2Y4MDUzNSwKLS8qIDB4MDdkODogY3R4X21taW9fcHVsbCAqLworLyogMHgwOTc4OiBjdHhfbW1pb19wdWxsICovCiAJMHg5ODgwNGU5OCwKIAkweDIxZjQ4MTRmLAotCTB4MDgzMGI2OGQsCisJMHgwODMwYjY5ZCwKIAkweGY0MDExMmI2LAotLyogMHgwN2VhOiBjdHhfbW1pb19kb25lICovCisvKiAweDA5OGE6IGN0eF9tbWlvX2RvbmUgKi8KIAkweDAzOThkZjFiLAotCTB4MDAyM2QwMTYsCi0JMHhmMTQwMDA4MCwKLQkweGYwMDEwMDE3LAotCTB4MDFmYTA2MTMsCi0JMHhmODAzZjgwNiwKLS8qIDB4MDgwMTogY3R4X3hmZXIgKi8KLQkweDAwZjdmMTAwLAotCTB4MDZmNGI2MGMsCi0JMHhkMDA0ZTdmMCwKLS8qIDB4MDgwZTogY3R4X3hmZXJfaWRsZSAqLwotCTB4ZmVjZjgwZmUsCi0JMHgwMGU0ZjEwMCwKLQkweGY5MWJmNDIwLAotCTB4ZjQwNjExZjQsCi0vKiAweDA4MWU6IGN0eF94ZmVyX3ByZSAqLwotCTB4ZjdmMDBkMDIsCi0JMHg2YzIxZjUxMCwKLQkweDFjMTFmNDA2LAotLyogMHgwODI4OiBjdHhfeGZlcl9wcmVfbG9hZCAqLwotCTB4ZjUwMmY3ZjAsCi0JMHhmNTA2MmIyMSwKLQkweGY1MDYzYTIxLAotCTB4YmQwNjRjMjEsCi0JMHgyYjIxZjVmNCwKLQkweDhjMjFmNTA2LAotLyogMHgwODQxOiBjdHhfeGZlcl9leGVjICovCi0JMHgxNjAxOTgwNiwKLQkweDA0MTQyN2YxLAotCTB4ZDAwNjI0YjYsCi0JMHhlN2YxMDAyMCwKLQkweGUzZjBhNTAwLAotCTB4MDIxZmI5NDEsCi0JMHhiNjhkMjFmNCwKLQkweGZjZjAwNGUwLAotCTB4MDIyY2YwMDEsCi0JMHhmZDAxMjRiNiwKLQkweDIxZjQwNWYyLAotCTB4ZmMxN2YxOGQsCi0JMHgwMjEzZjA0YSwKLQkweGQwMGMyN2YwLAotCTB4MjFmNTAwMTIsCi0JMHgyN2YxMDIxNSwKLQkweDIzZjA0N2ZjLAotCTB4MDAyMGQwMDIsCisJMHgwMDA3ZjExNiwKKwkweDAyMDNmMDgxLAorCTB4YmQwMDAzZDAsCisJMHg0MDAwODAwNCwKKwkweDAxMDAxN2YxLAorCTB4ZmEwNjEzZjAsCisJMHgwM2Y4MDYwMSwKKy8qIDB4MDlhYTogY3R4X3hmZXIgKi8KKwkweGU3ZjAwMGY4LAorCTB4MDAwN2YxMDQsCisJMHgwMzAzZjAwMiwKKwkweGJkMDAwZWQwLAorLyogMHgwOWI5OiBjdHhfeGZlcl9pZGxlICovCisJMHgwMGU3ZjEwNCwKKwkweDAzZTNmMDAwLAorCTB4ZjEwMGVlY2YsCisJMHhmNDIwMDBlNCwKKwkweDExZjRmMjFiLAorCTB4MGQwMmY0MDYsCisvKiAweDA5ZDA6IGN0eF94ZmVyX3ByZSAqLworCTB4ZjUxMGY3ZjAsCisJMHhmNDA3ZGUyMSwKKy8qIDB4MDlkYTogY3R4X3hmZXJfcHJlX2xvYWQgKi8KKwkweGY3ZjAxYzExLAorCTB4N2YyMWY1MDIsCisJMHg5MTIxZjUwNywKKwkweGE2MjFmNTA3LAorCTB4ZjVmNGJkMDcsCisJMHhmNTA3N2YyMSwKKy8qIDB4MDlmMzogY3R4X3hmZXJfZXhlYyAqLworCTB4OTgwODI0MjEsCisJMHgyNGJkMTYwMSwKKwkweDA1MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKKwkweGYxMDIxZmI5LAorCTB4ZjBhNTAwZTcsCisJMHgyMWY0NDFlMywKKwkweDAxZmNmMDlkLAorCTB4YjYwMjJjZjAsCisJMHhmMmZkMDEyNCwKKwkweDAyZmZiOTA1LAorCTB4YTUwNGU3ZjEsCisJMHhmNDQxZTNmMCwKKwkweDIxZjU5ZDIxLAorCTB4MjRiZDAyNmEsCisJMHg0N2ZjMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDIsCiAJMHhiNjAxMmNmMCwKLQkweDEyZDAwMzIwLAotCTB4MDFhY2YwMDAsCi0JMHhmMDA2YTVmMCwKLQkweDBjOTgwMGI3LAotCTB4MDEwZDk4MDAsCi0JMHhmNTAwZTdmMCwKLQkweGYwMDE2NjIxLAotCTB4MjFmNTA4YTcsCi0JMHgyMWY1MDEwOSwKLQkweDAxZjQwMjE1LAotCTB4MGNhN2YwMjIsCi0JMHhmMWM5MjFmNCwKLQkweGI2MGExMDE3LAotCTB4MjdmMDA2MTQsCi0JMHgwMDEyZDAwNSwKLS8qIDB4MDhjODogY3R4X3hmZXJfcG9zdF9zYXZlX3dhaXQgKi8KLQkweGZkMDAxMmNmLAotCTB4MWJmNDA1MjIsCi0JMHgyZTAyZjRmYSwKLS8qIDB4MDhkNDogY3R4X3hmZXJfcG9zdCAqLwotCTB4ZjUwMmY3ZjAsCi0JMHhiZDA2MmIyMSwKLQkweDZjMjFmNWY0LAotCTB4MzQyMWY1MDYsCi0JMHgzYTIxZjUwMiwKLQkweGY1ZjRiZDA2LAotCTB4ZjQwNjJiMjEsCi0JMHgwMTk4MTAxMSwKLQkweDA1MTFmZDQwLAotCTB4ZjUwNzBiZjQsCi0vKiAweDA4ZmY6IGN0eF94ZmVyX25vX3Bvc3RfbW1pbyAqLwotLyogMHgwOGZmOiBjdHhfeGZlcl9kb25lICovCi0JMHhmODA3YjcyMSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCisJMHgwN2YxMDMyMCwKKwkweDAzZjA0YWZjLAorCTB4MDAwMmQwMDIsCisJMHhhY2YwMDRiZCwKKwkweDA2YTVmMDAxLAorCTB4OTgwMGI3ZjAsCisJMHgwZDk4MDAwYywKKwkweDAwZTdmMDAxLAorCTB4MDE2ZjIxZjUsCisJMHhmNTA4YTdmMCwKKwkweGY1MDExMDIxLAorCTB4ZjQwMjVlMjEsCisJMHhhN2YwMTMwMSwKKwkweGQwMjFmNDBjLAorCTB4ZjUwNWY3ZjAsCisJMHhmNDA4MDYyMSwKKy8qIDB4MGE4MjogY3R4X3hmZXJfcG9zdCAqLworCTB4ZjdmMDJlMDIsCisJMHg3ZjIxZjUwMiwKKwkweGY1ZjRiZDA3LAorCTB4ZjUwN2RlMjEsCisJMHhmNTAyN2YyMSwKKwkweGJkMDc5MTIxLAorCTB4N2YyMWY1ZjQsCisJMHgxMDExZjQwNywKKwkweGZkNDAwMTk4LAorCTB4MGJmNDA1MTEsCisJMHg1NTIxZjUwNywKKy8qIDB4MGFhZDogY3R4X3hmZXJfbm9fcG9zdF9tbWlvICovCisvKiAweDBhYWQ6IGN0eF94ZmVyX2RvbmUgKi8KKwkweDAwMDBmODA5LAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL2h1Ym52ZjAuZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZmMC5mdWMuaAppbmRleCA0Mzg1MDZkLi4yMjljMGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZmMC5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9mdWMvaHVibnZmMC5mdWMuaApAQCAtMjA2LDE0ICsyMDYsMTQgQEAKIH07CiAKIHVpbnQzMl90IG52ZjBfZ3JodWJfY29kZVtdID0gewotCTB4MDMxYjBlZjUsCisJMHgwMzliMGVmNSwKIC8qIDB4MDAwNDogcXVldWVfcHV0ICovCiAJMHg5ODAwZDg5OCwKIAkweDg2ZjAwMWQ5LAogCTB4MDQ4OWI4MDgsCiAJMHhmMDBjMWJmNCwKIAkweDIxZjUwMmY3LAotCTB4MDBmODAyZmUsCisJMHgwMGY4MDM3ZSwKIC8qIDB4MDAxYzogcXVldWVfcHV0X25leHQgKi8KIAkweGI2MDc5OGM0LAogCTB4OGRiYjAzODQsCkBAIC0yMzcsMTg0ICsyMzcsMjE0IEBACiAvKiAweDAwNjY6IHF1ZXVlX2dldF9kb25lICovCiAJMHgwMGY4MDEzMiwKIC8qIDB4MDA2ODogbnZfcmQzMiAqLwotCTB4MDcyOGI3ZjEsCi0JMHhiOTA2YjRiNiwKLQkweGM5ZjAwMmVjLAotCTB4MDBiY2QwMWYsCi0vKiAweDAwNzg6IG52X3JkMzJfd2FpdCAqLwotCTB4YzgwMGJjY2YsCi0JMHgxYmY0MWZjYywKLQkweDA2YTdmMGZhLAotCTB4MDEwOTIxZjUsCi0JMHhmODQwYmZjZiwKLS8qIDB4MDA4ZDogbnZfd3IzMiAqLwotCTB4MjhiN2YxMDAsCi0JMHgwNmI0YjYwNywKLQkweGI5ODBiZmQwLAotCTB4YzlmMDAyZWMsCi0JMHgxZWM5ZjAxZiwKLS8qIDB4MDBhMzogbnZfd3IzMl93YWl0ICovCi0JMHhjZjAwYmNkMCwKLQkweGNjYzgwMGJjLAotCTB4ZmExYmY0MWYsCi0vKiAweDAwYWU6IHdhdGNoZG9nX3Jlc2V0ICovCi0JMHg4N2YxMDBmOCwKLQkweDg0YjYwNDMwLAotCTB4MWZmOWYwMDYsCi0JMHhmODAwOGZkMCwKLS8qIDB4MDBiZDogd2F0Y2hkb2dfY2xlYXIgKi8KLQkweDMwODdmMTAwLAotCTB4MDY4NGI2MDQsCi0JMHhmODAwODBkMCwKLS8qIDB4MDBjOTogd2FpdF9kb25leiAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDA5OSwKLQkweDAzZjAzNzAwLAotCTB4MDAwOWQwMDIsCi0JMHgwN2YxMDRiZCwKLQkweDAzZjAwNjAwLAotCTB4MDAwYWQwMDIsCi0vKiAweDAwZTY6IHdhaXRfZG9uZXpfbmUgKi8KLQkweDg3ZjEwNGJkLAotCTB4ODNmMDAwMDAsCi0JMHgwMDg4Y2YwMSwKLQkweGY0ODg4YWZmLAotCTB4OTRiZGYzMWIsCi0JMHhmMTAwOTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmODA0YmQwMCwKLS8qIDB4MDEwOTogd2FpdF9kb25lbyAqLwotCTB4ZjA5NGJkMDAsCi0JMHgwN2YxMDA5OSwKLQkweDAzZjAzNzAwLAotCTB4MDAwOWQwMDIsCi0JMHg4N2YxMDRiZCwKLQkweDg0YjYwODE4LAotCTB4MDA4YWQwMDYsCi0vKiAweDAxMjQ6IHdhaXRfZG9uZW9fZSAqLwotCTB4MDQwMDg3ZjEsCi0JMHhjZjA2ODRiNiwKLQkweDhhZmYwMDg4LAotCTB4ZjMwYmY0ODgsCisJMHhmMDAyZWNiOSwKKwkweDA3ZjExZmM5LAorCTB4MDNmMGNhMDAsCisJMHgwMDBjZDAwMSwKKy8qIDB4MDA3YTogbnZfcmQzMl93YWl0ICovCisJMHhjN2YxMDRiZCwKKwkweGMzZjBjYTAwLAorCTB4MDBjY2NmMDEsCisJMHhmNDFmY2NjOCwKKwkweGE3ZjBmMzFiLAorCTB4MTAyMWY1MDYsCisJMHgwMGY3ZjEwMSwKKwkweDAxZjNmMGNiLAorCTB4ZjgwMGZmY2YsCisvKiAweDAwOWQ6IG52X3dyMzIgKi8KKwkweDAwMDdmMTAwLAorCTB4MDEwM2YwY2MsCisJMHhiZDAwMGZkMCwKKwkweDAyZWNiOTA0LAorCTB4ZjAxZmM5ZjAsCisJMHgwN2YxMWVjOSwKKwkweDAzZjBjYTAwLAorCTB4MDAwY2QwMDEsCisvKiAweDAwYmU6IG52X3dyMzJfd2FpdCAqLworCTB4YzdmMTA0YmQsCisJMHhjM2YwY2EwMCwKKwkweDAwY2NjZjAxLAorCTB4ZjQxZmNjYzgsCisJMHgwMGY4ZjMxYiwKKy8qIDB4MDBkMDogd2FpdF9kb25leiAqLwogCTB4OTlmMDk0YmQsCiAJMHgwMDA3ZjEwMCwKLQkweDAyMDNmMDE3LAorCTB4MDIwM2YwMzcsCiAJMHhiZDAwMDlkMCwKLS8qIDB4MDE0NzogbW1jdHhfc2l6ZSAqLwotCTB4YmQwMGY4MDQsCi0vKiAweDAxNDk6IG52X21tY3R4X3NpemVfbG9vcCAqLwotCTB4MDBlODk4OTQsCi0JMHhiNjFhODViNiwKLQkweDg0YjYwMTgwLAotCTB4MDA5OGJiMDIsCi0JMHhiODA0ZTBiNiwKLQkweDFiZjQwNGVmLAotCTB4MDI5ZmI5ZWIsCi0vKiAweDAxNjY6IG1tY3R4X3hmZXIgKi8KLQkweDk0YmQwMGY4LAotCTB4ZjEwMTk5ZjAsCi0JMHhmMDM3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjEwNGJkMDAsCi0JMHhiNjA3MTA4NywKLQkweDk0YmQwNjg0LAotCTB4ZjQwNWJiZmQsCi0JMHg4YmQwMDkwYiwKLQkweDAwOTlmMDAwLAotLyogMHgwMThjOiBtbWN0eF9iYXNlX2Rpc2FibGVkICovCi0JMHhmNDA1ZWVmZCwKLQkweDhlZDAwYzBiLAotCTB4YzA4ZmQwODAsCi0vKiAweDAxOWI6IG1tY3R4X211bHRpX2Rpc2FibGVkICovCi0JMHhiNzAxOTlmMCwKLQkweGM4MDEwMDgwLAorCTB4MDAwN2YxMDQsCisJMHgwMjAzZjAwNiwKKwkweGJkMDAwYWQwLAorLyogMHgwMGVkOiB3YWl0X2RvbmV6X25lICovCisJMHgwMDg3ZjEwNCwKKwkweDAxODNmMDAwLAorCTB4ZmYwMDg4Y2YsCisJMHgxYmY0ODg4YSwKKwkweGYwOTRiZGYzLAorCTB4MDdmMTAwOTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MDBmODA0YmQsCisvKiAweDAxMTA6IHdhaXRfZG9uZW8gKi8KKwkweDk5ZjA5NGJkLAorCTB4MDAwN2YxMDAsCisJMHgwMjAzZjAzNywKKwkweGJkMDAwOWQwLAorCTB4MDAwN2YxMDQsCisJMHgwMjAzZjAwNiwKKwkweGJkMDAwYWQwLAorLyogMHgwMTJkOiB3YWl0X2RvbmVvX2UgKi8KKwkweDAwODdmMTA0LAorCTB4MDE4M2YwMDAsCisJMHhmZjAwODhjZiwKKwkweDBiZjQ4ODhhLAorCTB4ZjA5NGJkZjMsCisJMHgwN2YxMDA5OSwKKwkweDAzZjAxNzAwLAorCTB4MDAwOWQwMDIsCisJMHgwMGY4MDRiZCwKKy8qIDB4MDE1MDogbW1jdHhfc2l6ZSAqLworLyogMHgwMTUyOiBudl9tbWN0eF9zaXplX2xvb3AgKi8KKwkweGU4OTg5NGJkLAorCTB4MWE4NWI2MDAsCisJMHhiNjAxODBiNiwKKwkweDk4YmIwMjg0LAorCTB4MDRlMGI2MDAsCisJMHhmNDA0ZWZiOCwKKwkweDlmYjllYjFiLAorLyogMHgwMTZmOiBtbWN0eF94ZmVyICovCisJMHhiZDAwZjgwMiwKKwkweDAxOTlmMDk0LAorCTB4MzcwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorCTB4YmJmZDk0YmQsCisJMHgxMjBiZjQwNSwKKwkweGM0MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwYiwKKy8qIDB4MDE5NzogbW1jdHhfYmFzZV9kaXNhYmxlZCAqLworCTB4ZmQwMDk5ZjAsCisJMHgwYmY0MDVlZSwKKwkweDAwMDdmMTFlLAorCTB4MDEwM2YwYzYsCisJMHhiZDAwMGVkMCwKKwkweDAwMDdmMTA0LAorCTB4MDEwM2YwYzcsCisJMHhiZDAwMGZkMCwKKwkweDAxOTlmMDA0LAorLyogMHgwMWI4OiBtbWN0eF9tdWx0aV9kaXNhYmxlZCAqLworCTB4YjYwMGFiYzgsCisJMHhiOWYwMTBiNCwKKwkweDAxYWVjODBjLAorCTB4ZmQxMWU0YjYsCisJMHgwN2YxMDViZSwKKwkweDAzZjBjNTAwLAorCTB4MDAwYmQwMDEsCisvKiAweDAxZDY6IG1tY3R4X2V4ZWNfbG9vcCAqLworLyogMHgwMWQ2OiBtbWN0eF93YWl0X2ZyZWUgKi8KKwkweGU3ZjEwNGJkLAorCTB4ZTNmMGM1MDAsCisJMHgwMGVlY2YwMSwKKwkweGY0MWZlNGYwLAorCTB4Y2U5OGYzMGIsCisJMHgwNWU5ZmQwMCwKKwkweGM4MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwZSwKKwkweGI4MDRjMGI2LAorCTB4MWJmNDA0Y2QsCisJMHgwMmFiYzhkOCwKKy8qIDB4MDIwNzogbW1jdHhfZmluaV93YWl0ICovCisJMHhmMTFmMWJmNCwKKwkweGYwYzUwMGI3LAorCTB4YmJjZjAxYjMsCisJMHgxZmI0ZjAwMCwKKwkweGY0MTBiNGIwLAorCTB4YTdmMGYwMWIsCisJMHhkMDIxZjQwMiwKKy8qIDB4MDIyMzogbW1jdHhfc3RvcCAqLworCTB4YzgyYjBlZjQsCiAJMHhiNGI2MDBhYiwKIAkweDBjYjlmMDEwLAotCTB4YjYwMWFlYzgsCi0JMHhiZWZkMTFlNCwKLQkweDAwOGJkMDA1LAotLyogMHgwMWI0OiBtbWN0eF9leGVjX2xvb3AgKi8KLS8qIDB4MDFiNDogbW1jdHhfd2FpdF9mcmVlICovCi0JMHhmMDAwOGVjZiwKLQkweDBiZjQxZmU0LAotCTB4MDBjZTk4ZmEsCi0JMHhkMDA1ZTlmZCwKLQkweGMwYjZjMDhlLAotCTB4MDRjZGI4MDQsCi0JMHhjOGU4MWJmNCwKLQkweDFiZjQwMmFiLAotLyogMHgwMWQ1OiBtbWN0eF9maW5pX3dhaXQgKi8KLQkweDAwOGJjZjE4LAotCTB4YjAxZmI0ZjAsCi0JMHgxYmY0MTBiNCwKLQkweDAyYTdmMGY3LAotCTB4ZjRjOTIxZjQsCi0vKiAweDAxZWE6IG1tY3R4X3N0b3AgKi8KLQkweGFiYzgxYjBlLAotCTB4MTBiNGI2MDAsCi0JMHhmMDBjYjlmMCwKLQkweDhiZDAxMmI5LAotLyogMHgwMWY5OiBtbWN0eF9zdG9wX3dhaXQgKi8KLQkweDAwOGJjZjAwLAotCTB4ZjQxMmJiYzgsCi0vKiAweDAyMDI6IG1tY3R4X2RvbmUgKi8KLQkweDk0YmRmYTFiLAotCTB4ZjEwMTk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDAyMTU6IHN0cmFuZF93YWl0ICovCi0JMHhmMGEwZjkwMCwKLQkweDIxZjQwMmE3LAotCTB4ZjhhMGZjYzksCi0vKiAweDAyMjE6IHN0cmFuZF9wcmUgKi8KLQkweGZjODdmMTAwLAotCTB4MDI4M2YwNGEsCi0JMHhkMDBjOTdmMCwKLQkweDIxZjUwMDg5LAotCTB4MDBmODAyMTUsCi0vKiAweDAyMzQ6IHN0cmFuZF9wb3N0ICovCi0JMHg0YWZjODdmMSwKLQkweGYwMDI4M2YwLAotCTB4ODlkMDBkOTcsCi0JMHgxNTIxZjUwMCwKLS8qIDB4MDI0Nzogc3RyYW5kX3NldCAqLwotCTB4ZjEwMGY4MDIsCi0JMHhmMDRmZmNhNywKLQkweGFiYTIwMmEzLAotCTB4YzdmMDA1MDAsCi0JMHgwMGFjZDAwZiwKLQkweGQwMGJjN2YwLAotCTB4MjFmNTAwYmMsCi0JMHhhZWQwMDIxNSwKLQkweDBhYzdmMDAwLAotCTB4ZjUwMGJjZDAsCi0JMHhmODAyMTUyMSwKLS8qIDB4MDI3MTogc3RyYW5kX2N0eF9pbml0ICovCi0JMHhmMDk0YmQwMCwKLQkweDA3ZjEwMzk5LAotCTB4MDNmMDM3MDAsCisJMHhmMTEyYjlmMCwKKwkweGYwYzUwMDA3LAorCTB4MGJkMDAxMDMsCisvKiAweDAyM2I6IG1tY3R4X3N0b3Bfd2FpdCAqLworCTB4ZjEwNGJkMDAsCisJMHhmMGM1MDBiNywKKwkweGJiY2YwMWIzLAorCTB4MTJiYmM4MDAsCisvKiAweDAyNGI6IG1tY3R4X2RvbmUgKi8KKwkweGJkZjMxYmY0LAorCTB4MDE5OWYwOTQsCisJMHgxNzAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDksCisvKiAweDAyNWU6IHN0cmFuZF93YWl0ICovCisJMHhhMGY5MDBmOCwKKwkweGY0MDJhN2YwLAorCTB4YTBmY2QwMjEsCisvKiAweDAyNmE6IHN0cmFuZF9wcmUgKi8KKwkweDk3ZjAwMGY4LAorCTB4ZmMwN2YxMGMsCisJMHgwMjAzZjA0YSwKKwkweGJkMDAwOWQwLAorCTB4NWUyMWY1MDQsCisvKiAweDAyN2Y6IHN0cmFuZF9wb3N0ICovCisJMHhmMDAwZjgwMiwKKwkweDA3ZjEwZDk3LAorCTB4MDNmMDRhZmMsCiAJMHgwMDA5ZDAwMiwKIAkweDIxZjUwNGJkLAotCTB4ZTdmMDAyMjEsCi0JMHg0NzIxZjUwMywKLQkweGZjYTdmMTAyLAotCTB4MDJhM2YwNDYsCi0JMHgwNDAwYWJhMCwKLQkweGYwNDBhMGQwLAotCTB4YmNkMDAxYzcsCi0JMHgxNTIxZjUwMCwKLQkweDAxMGM5MjAyLAotCTB4ZjAwMGFjZDAsCi0JMHhiY2QwMDJjNywKLQkweDE1MjFmNTAwLAotCTB4MzQyMWY1MDIsCi0JMHg4MDg3ZjEwMiwKLQkweDA2ODRiNjA4LAotCTB4YjcwMDg5Y2YsCi0JMHg5NTIyMDA4MCwKLS8qIDB4MDJjYTogY3R4X2luaXRfc3RyYW5kX2xvb3AgKi8KKwkweDAwZjgwMjVlLAorLyogMHgwMjk0OiBzdHJhbmRfc2V0ICovCisJMHhmMTBmYzdmMCwKKwkweGYwNGZmYzA3LAorCTB4MGNkMDAyMDMsCisJMHhmMDA0YmQwMCwKKwkweDA3ZjEwYmM3LAorCTB4MDNmMDRhZmMsCisJMHgwMDBjZDAwMiwKKwkweDA3ZjEwNGJkLAorCTB4MDNmMDRmZmMsCisJMHgwMDBlZDAwMiwKKwkweGM3ZjAwNGJkLAorCTB4ZmMwN2YxMGEsCisJMHgwMjAzZjA0YSwKKwkweGJkMDAwY2QwLAorCTB4NWUyMWY1MDQsCisvKiAweDAyZDM6IHN0cmFuZF9jdHhfaW5pdCAqLworCTB4YmQwMGY4MDIsCisJMHgwMzk5ZjA5NCwKKwkweDM3MDAwN2YxLAorCTB4ZDAwMjAzZjAsCisJMHgwNGJkMDAwOSwKKwkweDAyNmEyMWY1LAorCTB4ZjUwM2U3ZjAsCisJMHhiZDAyOTQyMSwKKwkweGZjMDdmMWM0LAorCTB4MDIwM2YwNDcsCisJMHhiZDAwMGNkMCwKKwkweDAxYzdmMDA0LAorCTB4NGFmYzA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDBjLAorCTB4MDI1ZTIxZjUsCisJMHhmMTAxMGM5MiwKKwkweGYwNDZmYzA3LAorCTB4MGNkMDAyMDMsCisJMHhmMDA0YmQwMCwKKwkweDA3ZjEwMmM3LAorCTB4MDNmMDRhZmMsCisJMHgwMDBjZDAwMiwKKwkweDIxZjUwNGJkLAorCTB4MjFmNTAyNWUsCisJMHg4N2YxMDI3ZiwKKwkweDgzZjA0MjAwLAorCTB4MDA5N2YxMDIsCisJMHgwMjkzZjAyMCwKKwkweDk1MDA5OWNmLAorLyogMHgwMzRhOiBjdHhfaW5pdF9zdHJhbmRfbG9vcCAqLwogCTB4OGVkMDA4ZmUsCiAJMHg0MDhlZDAwMCwKIAkweGI2ODA4YWNmLApAQCAtNDI4LDcgKzQ1OCw3IEBACiAJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0vKiAweDAyZmU6IGVycm9yICovCisvKiAweDAzN2U6IGVycm9yICovCiAJMHgwN2YxMDBmOCwKIAkweDAzZjAwNTAwLAogCTB4MDAwZmQwMDIsCkBAIC00MzYsODIgKzQ2NiwxMTcgQEAKIAkweDAwMDdmMTAxLAogCTB4MDMwM2YwMDcsCiAJMHhiZDAwMGZkMCwKLS8qIDB4MDMxYjogaW5pdCAqLworLyogMHgwMzliOiBpbml0ICovCiAJMHhiZDAwZjgwNCwKLQkweDAwMDRmZTA0LAotCTB4ZjEwMDA3ZmUsCi0JMHhmMDEyMDAxNywKLQkweDEyZDAwMjI3LAotCTB4YjExN2YxMDAsCi0JMHgwMDEwZmUwNSwKLQkweDA0MDAxN2YxLAotCTB4ZjFjMDEwZDAsCi0JMHhiNjA0MDQzNywKLQkweDI3ZjEwNjM0LAotCTB4MzJkMDIwMDMsCi0JMHgwNDI3ZjEwMCwKLQkweDAxMzJkMDIwLAorCTB4MDAwN2ZlMDQsCisJMHg0MjAwMTdmMSwKKwkweGNmMDAxM2YwLAorCTB4MTFlNzAwMTEsCisJMHgxNGI2MDEwOSwKKwkweDAwMTRmZTA4LAorCTB4ZjEwMjI3ZjAsCisJMHhmMDEyMDAwNywKKwkweDAyZDAwMDAzLAorCTB4ZjEwNGJkMDAsCisJMHhmZTA2YzgxNywKKwkweDI0YmQwMDEwLAorCTB4MDcwMDA3ZjEsCisJMHhkMDAwMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4MjAwMzI3ZjEsCisJMHgwMTAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHgyMDA0MjdmMSwKKwkweDAxMDQwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwMiwKIAkweDIwMGIyN2YxLAotCTB4ZjEwMjMyZDAsCi0JMHhkMDIwMGMyNywKLQkweDI3ZjEwNzMyLAotCTB4MjRiNjBjMjQsCi0JMHgwMDAzYjkwNiwKLQkweGYxMDAyM2QwLAorCTB4MDEwODA3ZjEsCisJMHhkMDAxMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4MjAwYzI3ZjEsCisJMHgwMTFjMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHhmMTAxMDM5MiwKKwkweGYwMDkwMDA3LAorCTB4MDNkMDAzMDMsCisJMHhmMTA0YmQwMCwKIAkweGYwODcwNDI3LAotCTB4MTJkMDAwMjMsCi0JMHgwMDEyYjcwMCwKLQkweDA0MjdmMDAxLAotCTB4ZjQwMDEyZDAsCi0JMHhlN2YxMTAzMSwKLQkweGUzZjA5NjA0LAotCTB4NjgyMWY0NDAsCi0JMHg4MDkwZjFjNywKLQkweGY0ZjAwMzAxLAotCTB4MDIwZjgwMWYsCi0JMHhiYjAxMTdmMCwKLQkweDEyYjYwNDFmLAotCTB4MGMyN2YxMDEsCi0JMHgwNjI0YjYwNCwKLQkweGQwMDAyMWQwLAotCTB4MTdmMTQwMjEsCi0JMHgwZTk4MDEwMCwKLQkweDAxMGY5ODAwLAotCTB4MDE0NzIxZjUsCi0JMHgwNzAwMzdmMSwKLQkweDk1MDYzNGI2LAotCTB4MzRkMDA4MTQsCi0JMHg0MDM0ZDAwMCwKLQkweDEzMDAzMGI3LAotCTB4YjYwMDFmYmIsCi0JMHgzZmQwMDJmNSwKLQkweDA4MTViNjAwLAotCTB4YjYwMTEwYjYsCi0JMHgxZmI5MDgxNCwKLQkweDcxMjFmNTAyLAotCTB4MDAxZmJiMDIsCi0JMHhmMTAyMDM5OCwKLQkweGYwMjAwMDQ3LAotLyogMHgwM2Y2OiBpbml0X2dwYyAqLwotCTB4NGVhMDUwNDMsCi0JMHgxZmI5MDgwNCwKLQkweDhkMjFmNDAyLAotCTB4MDEwYzRlYTAsCi0JMHgyMWY0ZjRiZCwKLQkweDA0NGVhMDhkLAotCTB4OGQyMWY0MDEsCi0JMHgwMTAwNGVhMCwKLQkweGY0MDJmN2YwLAotCTB4NGVhMDhkMjEsCi0vKiAweDA0MWU6IGluaXRfZ3BjX3dhaXQgKi8KLQkweDIxZjQwODAwLAotCTB4MWZmZmM4NjgsCi0JMHhhMGZhMGJmNCwKLQkweGY0MDgwNDRlLAotCTB4MWZiYjY4MjEsCi0JMHgwMDQwYjcwMCwKLQkweDAxMzJiNjgwLAotCTB4ZjFiZTFiZjQsCisJMHgwN2YxMDAyMywKKwkweDAzZjAwNDAwLAorCTB4MDAwMmQwMDAsCisJMHgyN2YwMDRiZCwKKwkweDAwMDdmMTA0LAorCTB4MDAwM2YwMDMsCisJMHhiZDAwMDJkMCwKKwkweDEwMzFmNDA0LAorCTB4OTYwNGU3ZjEsCisJMHhmNDQwZTNmMCwKKwkweGZlYjk2ODIxLAorCTB4OTBmMWM3MDIsCisJMHhmMDAzMDE4MCwKKwkweDBmODAxZmY0LAorCTB4MDExN2YwMDIsCisJMHhiNjA0MWZiYiwKKwkweDA3ZjEwMTEyLAorCTB4MDNmMDAzMDAsCisJMHgwMDAxZDAwMSwKKwkweDA3ZjEwNGJkLAorCTB4MDNmMDA0MDAsCisJMHgwMDAxZDAwMSwKKwkweDE3ZjEwNGJkLAorCTB4ZjdmMDAxMDAsCisJMHg3ZjIxZjUwMiwKKwkweDkxMjFmNTA3LAorCTB4MTBmN2YwMDcsCisJMHgwN2RlMjFmNSwKKwkweDk4MDAwZTk4LAorCTB4MjFmNTAxMGYsCisJMHgxNDk1MDE1MCwKKwkweDAwMDdmMTA4LAorCTB4MDEwM2YwYzAsCisJMHhiZDAwMDRkMCwKKwkweDAwMDdmMTA0LAorCTB4MDEwM2YwYzEsCisJMHhiZDAwMDRkMCwKKwkweDAwMzBiNzA0LAorCTB4MDAxZmJiMTMsCisJMHhmMTAyZjViNiwKKwkweGYwZDMwMDA3LAorCTB4MGZkMDAxMDMsCisJMHhiNjA0YmQwMCwKKwkweDEwYjYwODE1LAorCTB4MDgxNGI2MDEsCisJMHhmNTAyMWZiOSwKKwkweGJiMDJkMzIxLAorCTB4MDM5ODAwMWYsCisJMHgwMDQ3ZjEwMiwKKwkweDUwNDNmMDIwLAorLyogMHgwNGY0OiBpbml0X2dwYyAqLworCTB4MDgwNDRlYTAsCisJMHhmNDAyMWZiOSwKKwkweDRlYTA5ZDIxLAorCTB4ZjRiZDAxMGMsCisJMHhhMDlkMjFmNCwKKwkweGY0MDEwNDRlLAorCTB4NGVhMDlkMjEsCisJMHhmN2YwMDEwMCwKKwkweDlkMjFmNDAyLAorCTB4MDgwMDRlYTAsCisvKiAweDA1MWM6IGluaXRfZ3BjX3dhaXQgKi8KKwkweGM4NjgyMWY0LAorCTB4MGJmNDFmZmYsCisJMHgwNDRlYTBmYSwKKwkweDY4MjFmNDA4LAorCTB4YjcwMDFmYmIsCisJMHhiNjgwMDA0MCwKKwkweDFiZjQwMTMyLAorCTB4MDBmN2YwYmUsCisJMHgwN2RlMjFmNSwKKwkweGY1MDBmN2YwLAorCTB4ZjEwNzdmMjEsCiAJMHhmMDAxMDAwNywKIAkweDAxZDAwMjAzLAogCTB4YmQwNGJkMDAsCkBAIC01MTksMzgyICs1ODQsMzc5IEBACiAJMHgzMDAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDEsCi0vKiAweDA0NTg6IG1haW4gKi8KKy8qIDB4MDU2NDogbWFpbiAqLwogCTB4ZjQwMDMxZjQsCiAJMHhkN2YwMDAyOCwKIAkweDM5MjFmNDEwLAogCTB4YjFmNDAxZjQsCiAJMHhmNTQwMDFlNCwKLQkweGJkMDBkZTFiLAorCTB4YmQwMGU5MWIsCiAJMHgwNDk5ZjA5NCwKIAkweDM3MDAwN2YxLAogCTB4ZDAwMjAzZjAsCiAJMHgwNGJkMDAwOSwKLQkweDBiMDAxN2YxLAotCTB4Y2YwNjE0YjYsCi0JMHgxMWNmNDAxMiwKLQkweDFmMTNjODAwLAotCTB4MDA4NzBiZjUsCisJMHhjMDAwMTdmMSwKKwkweGNmMDIxM2YwLAorCTB4MjdmMTAwMTEsCisJMHgyM2YwYzEwMCwKKwkweDAwMjJjZjAyLAorCTB4ZjUxZjEzYzgsCisJMHhjODAwODkwYiwKKwkweDBiZjQxZjIzLAorCTB4YjkyMGY5NjIsCisJMHg5NGJkMDIxMiwKKwkweGYxMDc5OWYwLAorCTB4ZjAzNzAwMDcsCisJMHgwOWQwMDIwMywKKwkweGY0MDRiZDAwLAorCTB4MzFmNDAxMzIsCisJMHhhYTIxZjUwMiwKKwkweGYwOTRiZDA5LAorCTB4MDdmMTA3OTksCisJMHgwM2YwMTcwMCwKKwkweDAwMDlkMDAyLAorCTB4MjBmYzA0YmQsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA2LAorCTB4MDIwM2YwMzcsCisJMHhiZDAwMDlkMCwKKwkweDAxMzFmNDA0LAorCTB4MDlhYTIxZjUsCisJMHg5OWYwOTRiZCwKKwkweDAwMDdmMTA2LAorCTB4MDIwM2YwMTcsCisJMHhiZDAwMDlkMCwKKwkweDMzMGVmNDA0LAorLyogMHgwNjBjOiBjaHN3X3ByZXZfbm9fbmV4dCAqLworCTB4MTJiOTIwZjksCisJMHgwMTMyZjQwMiwKKwkweGY1MDIzMmY0LAorCTB4ZmMwOWFhMjEsCisJMHgwMDA3ZjEyMCwKKwkweDAyMDNmMGMwLAorCTB4YmQwMDAyZDAsCisJMHgxMzBlZjQwNCwKKy8qIDB4MDYyYzogY2hzd19ub19wcmV2ICovCiAJMHhmNDFmMjNjOCwKLQkweDIwZjk2MjBiLAotCTB4YmQwMjEyYjksCi0JMHgwNzk5ZjA5NCwKLQkweDM3MDAwN2YxLAorCTB4MzFmNDBkMGIsCisJMHgwMjMyZjQwMSwKKwkweDA5YWEyMWY1LAorLyogMHgwNjNjOiBjaHN3X2RvbmUgKi8KKwkweGYxMDEyN2YwLAorCTB4ZjBjMzAwMDcsCisJMHgwMmQwMDIwMywKKwkweGJkMDRiZDAwLAorCTB4MDQ5OWYwOTQsCisJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0JMHhmNDAxMzJmNCwKLQkweDIxZjUwMjMxLAotCTB4OTRiZDA4MDEsCisJMHhmZjA4MGVmNSwKKy8qIDB4MDY2MDogbWFpbl9ub3RfY3R4X3N3aXRjaCAqLworCTB4ZjQwMWU0YjAsCisJMHhmMmI5MGQxYiwKKwkweDQyMjFmNTAyLAorCTB4NDYwZWY0MDksCisvKiAweDA2NzA6IG1haW5fbm90X2N0eF9jaGFuICovCisJMHhmNDAyZTRiMCwKKwkweDk0YmQzMjFiLAogCTB4ZjEwNzk5ZjAsCi0JMHhmMDE3MDAwNywKKwkweGYwMzcwMDA3LAogCTB4MDlkMDAyMDMsCi0JMHhmYzA0YmQwMCwKLQkweGYwOTRiZDIwLAotCTB4MDdmMTA2OTksCi0JMHgwM2YwMzcwMCwKLQkweDAwMDlkMDAyLAotCTB4MzFmNDA0YmQsCi0JMHgwMTIxZjUwMSwKLQkweGYwOTRiZDA4LAotCTB4MDdmMTA2OTksCisJMHhmNDA0YmQwMCwKKwkweDMyZjQwMTMyLAorCTB4YWEyMWY1MDIsCisJMHhmMDk0YmQwOSwKKwkweDA3ZjEwNzk5LAogCTB4MDNmMDE3MDAsCiAJMHgwMDA5ZDAwMiwKIAkweDBlZjQwNGJkLAotLyogMHgwNGY5OiBjaHN3X3ByZXZfbm9fbmV4dCAqLwotCTB4YjkyMGY5MzEsCi0JMHgzMmY0MDIxMiwKLQkweDAyMzJmNDAxLAotCTB4MDgwMTIxZjUsCi0JMHgxN2YxMjBmYywKLQkweDE0YjYwYjAwLAotCTB4MDAxMmQwMDYsCi0vKiAweDA1MTc6IGNoc3dfbm9fcHJldiAqLwotCTB4YzgxMzBlZjQsCi0JMHgwYmY0MWYyMywKLQkweDAxMzFmNDBkLAotCTB4ZjUwMjMyZjQsCi0vKiAweDA1Mjc6IGNoc3dfZG9uZSAqLwotCTB4ZjEwODAxMjEsCi0JMHhiNjBiMGMxNywKLQkweDI3ZjAwNjE0LAotCTB4MDAxMmQwMDEsCi0JMHg5OWYwOTRiZCwKLQkweDAwMDdmMTA0LAotCTB4MDIwM2YwMTcsCi0JMHhiZDAwMDlkMCwKLQkweDEzMGVmNTA0LAotLyogMHgwNTQ5OiBtYWluX25vdF9jdHhfc3dpdGNoICovCi0JMHgwMWU0YjBmZiwKLQkweGI5MGQxYmY0LAotCTB4MjFmNTAyZjIsCi0JMHgwZWY0MDc5NSwKLS8qIDB4MDU1OTogbWFpbl9ub3RfY3R4X2NoYW4gKi8KLQkweDAyZTRiMDQ2LAotCTB4YmQzMjFiZjQsCi0JMHgwNzk5ZjA5NCwKLQkweDM3MDAwN2YxLAorLyogMHgwNmE1OiBtYWluX25vdF9jdHhfc2F2ZSAqLworCTB4MTBlZjk0MTEsCisJMHhmNTAxZjVmMCwKKwkweGY1MDM3ZTIxLAorLyogMHgwNmIzOiBtYWluX2RvbmUgKi8KKwkweGJkZmViNTBlLAorCTB4MWYyOWYwMjQsCisJMHgzMDAwMDdmMSwKIAkweGQwMDIwM2YwLAotCTB4MDRiZDAwMDksCi0JMHhmNDAxMzJmNCwKLQkweDIxZjUwMjMyLAotCTB4OTRiZDA4MDEsCi0JMHhmMTA3OTlmMCwKLQkweGYwMTcwMDA3LAotCTB4MDlkMDAyMDMsCi0JMHhmNDA0YmQwMCwKLS8qIDB4MDU4ZTogbWFpbl9ub3RfY3R4X3NhdmUgKi8KLQkweGVmOTQxMTBlLAotCTB4MDFmNWYwMTAsCi0JMHgwMmZlMjFmNSwKLQkweGZlYzAwZWY1LAotLyogMHgwNTljOiBtYWluX2RvbmUgKi8KLQkweDI5ZjAyNGJkLAotCTB4MDAwN2YxMWYsCi0JMHgwMjAzZjAzMCwKLQkweGJkMDAwMmQwLAotCTB4YWIwZWY1MDQsCi0vKiAweDA1YjE6IGloICovCi0JMHhmZTgwZjlmZSwKLQkweDgwZjkwMTg4LAotCTB4YTBmOTkwZjksCi0JMHhkMGY5YjBmOSwKLQkweGYwZjllMGY5LAotCTB4MGFjZjA0YmQsCi0JMHgwNGFiYzQ4MCwKLQkweGYxMWQwYmY0LAotCTB4ZjAxOTAwYjcsCi0JMHhiZWNmMTBkNywKLQkweDAwYmZjZjQwLAorCTB4MDRiZDAwMDIsCisJMHhmZWEwMGVmNSwKKy8qIDB4MDZjODogaWggKi8KKwkweDg4ZmU4MGY5LAorCTB4Zjk4MGY5MDEsCisJMHhmOWEwZjk5MCwKKwkweGY5ZDBmOWIwLAorCTB4YmRmMGY5ZTAsCisJMHgwMGE3ZjEwNCwKKwkweDAwYTNmMDAyLAorCTB4YzQwMGFhY2YsCisJMHgwYmY0MDRhYiwKKwkweDEwZDdmMDMwLAorCTB4MWEwMGU3ZjEsCisJMHhjZjAwZTNmMCwKKwkweGY3ZjEwMGVlLAorCTB4ZjNmMDE5MDAsCisJMHgwMGZmY2YwMCwKIAkweGI3MDQyMWY0LAogCTB4ZjAwNDAwYjAsCi0JMHhiZWQwMDFlNywKLS8qIDB4MDVlOTogaWhfbm9fZmlmbyAqLwotCTB4MDBhYmU0MDAsCi0JMHgwZDBiZjQwMSwKLQkweGYxMTBkN2YwLAotCTB4ZjQ0MDAxZTcsCi0vKiAweDA1ZmE6IGloX25vX2N0eHN3ICovCi0JMHhiN2YxMDQyMSwKLQkweGIwYmQwMTA0LAotCTB4ZjRiNGFiZmYsCi0JMHhhN2YxMGQwYiwKLQkweGE0YjYwYzFjLAotCTB4MDBhYmQwMDYsCi0vKiAweDA2MTA6IGloX25vX290aGVyICovCi0JMHhmYzQwMGFkMCwKKwkweDA3ZjEwMWU3LAorCTB4MDNmMDFkMDAsCisJMHgwMDBlZDAwMCwKKy8qIDB4MDcxYTogaWhfbm9fZmlmbyAqLworCTB4YWJlNDA0YmQsCisJMHgwYmY0MDEwMCwKKwkweDEwZDdmMDBkLAorCTB4NDAwMWU3ZjEsCisvKiAweDA3MmI6IGloX25vX2N0eHN3ICovCisJMHhlNDA0MjFmNCwKKwkweGY0MDQwMGFiLAorCTB4YjdmMTE0MGIsCisJMHhiZmI5MDEwMCwKKwkweDQ0ZTdmMTAyLAorCTB4NDBlM2YwMDEsCisvKiAweDA3NDM6IGloX25vX2Z3bXRoZCAqLworCTB4ZjE5ZDIxZjQsCisJMHhiZDAxMDRiNywKKwkweGI0YWJmZmIwLAorCTB4ZjEwZjBiZjQsCisJMHhmMDA3MDAwNywKKwkweDBiZDAwMzAzLAorLyogMHgwNzViOiBpaF9ub19vdGhlciAqLworCTB4ZjEwNGJkMDAsCisJMHhmMDAxMDAwNywKKwkweDBhZDAwMDAzLAorCTB4ZmMwNGJkMDAsCiAJMHhmY2UwZmNmMCwKIAkweGZjYjBmY2QwLAogCTB4ZmM5MGZjYTAsCiAJMHgwMDg4ZmU4MCwKIAkweDMyZjQ4MGZjLAotLyogMHgwNjJiOiBjdHhfNDE3MHMgKi8KLQkweGYxMDFmODAwLAotCTB4ZjA0MTcwZTcsCi0JMHhmNWYwNDBlMywKLQkweDhkMjFmNDEwLAotLyogMHgwNjNhOiBjdHhfNDE3MHcgKi8KKy8qIDB4MDc3ZjogY3R4XzQxNzBzICovCisJMHhmMDAxZjgwMCwKKwkweGZmYjkxMGY1LAorCTB4NzBlN2YxMDIsCisJMHg0MGUzZjA0MSwKKwkweGY4OWQyMWY0LAorLyogMHgwNzkxOiBjdHhfNDE3MHcgKi8KKwkweDcwZTdmMTAwLAorCTB4NDBlM2YwNDEsCisJMHhiOTY4MjFmNCwKKwkweGY0ZjAwMmZmLAorCTB4ZjAxYmY0MTAsCisvKiAweDA3YTY6IGN0eF9yZWRzd2l0Y2ggKi8KIAkweGU3ZjEwMGY4LAotCTB4ZTNmMDQxNzAsCi0JMHg2ODIxZjQ0MCwKLQkweGY0MTBmNGYwLAorCTB4ZTVmMDAyMDAsCisJMHgyMGU1ZjA0MCwKKwkweGYxMTBlNWYwLAorCTB4ZjA4NTAwMDcsCisJMHgwZWQwMDEwMywKKwkweGYwMDRiZDAwLAorLyogMHgwN2MyOiBjdHhfcmVkc3dpdGNoX2RlbGF5ICovCisJMHhmMmI2MDhmNywKKwkweGZkMWJmNDAxLAorCTB4MDQwMGU1ZjEsCisJMHgwMTAwZTVmMSwKKwkweDg1MDAwN2YxLAorCTB4ZDAwMTAzZjAsCisJMHgwNGJkMDAwZSwKKy8qIDB4MDdkZTogY3R4Xzg2YyAqLworCTB4MDdmMTAwZjgsCisJMHgwM2YwMjMwMCwKKwkweDAwMGZkMDAyLAorCTB4ZmZiOTA0YmQsCisJMHgxNGU3ZjEwMiwKKwkweDQwZTNmMDhhLAorCTB4Yjk5ZDIxZjQsCisJMHhlN2YxMDJmZiwKKwkweGUzZjBhODhjLAorCTB4OWQyMWY0NDEsCisvKiAweDA4MDY6IGN0eF9tZW0gKi8KKwkweDA3ZjEwMGY4LAorCTB4MDNmMDg0MDAsCisJMHgwMDBmZDAwMiwKKy8qIDB4MDgxMjogY3R4X21lbV93YWl0ICovCisJMHhmN2YxMDRiZCwKKwkweGYzZjA4NDAwLAorCTB4MDBmZmNmMDIsCisJMHhmNDA1ZmZmZCwKIAkweDAwZjhmMzFiLAotLyogMHgwNjRjOiBjdHhfcmVkc3dpdGNoICovCi0JMHgwNjE0ZTdmMSwKLQkweGYxMDZlNGI2LAotCTB4ZDAwMjcwZjcsCi0JMHhmN2YwMDBlZiwKLS8qIDB4MDY1ZDogY3R4X3JlZHN3aXRjaF9kZWxheSAqLwotCTB4MDFmMmI2MDgsCi0JMHhmMWZkMWJmNCwKLQkweGQwMDc3MGY3LAotCTB4MDBmODAwZWYsCi0vKiAweDA2NmM6IGN0eF84NmMgKi8KLQkweDA4NmNlN2YxLAotCTB4ZDAwNmU0YjYsCi0JMHhlN2YxMDBlZiwKLQkweGUzZjA4YTE0LAotCTB4OGQyMWY0NDAsCi0JMHhhODZjZTdmMSwKLQkweGY0NDFlM2YwLAotCTB4MDBmODhkMjEsCi0vKiAweDA2OGM6IGN0eF9sb2FkICovCisvKiAweDA4MjQ6IGN0eF9sb2FkICovCiAJMHg5OWYwOTRiZCwKIAkweDAwMDdmMTA1LAogCTB4MDIwM2YwMzcsCiAJMHhiZDAwMDlkMCwKIAkweDBjYTdmMDA0LAotCTB4ZjFjOTIxZjQsCi0JMHhiNjBhMjQxNywKLQkweDEwZDAwNjE0LAotCTB4MDAzN2YxMDAsCi0JMHgwNjM0YjYwYiwKLQkweGYxNDAzMmQwLAotCTB4YjYwYTBjMTcsCi0JMHg0N2YwMDYxNCwKLQkweDAwMTJkMDA3LAotLyogMHgwNmM3OiBjdHhfY2hhbl93YWl0XzAgKi8KLQkweGNmNDAxNGQwLAotCTB4NDRmMDQwMTQsCi0JMHhmYTFiZjQxZiwKLQkweGZlMDAzMmQwLAotCTB4MmFmMDAwMGIsCi0JMHgwNDI0YjYxZiwKLQkweGJkMDIyMGI2LAorCTB4YmRkMDIxZjQsCisJMHgwMDA3ZjFmNCwKKwkweDAyMDNmMDg5LAorCTB4YmQwMDBmZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMGMxLAorCTB4YmQwMDAyZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDgzLAorCTB4YmQwMDAyZDAsCisJMHgwN2Y3ZjAwNCwKKwkweDA4MDYyMWY1LAorCTB4YzAwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDAyLAorCTB4ZjAwMDBiZmUsCisJMHgyNGI2MWYyYSwKKwkweDAyMjBiNjA0LAorCTB4OTlmMDk0YmQsCisJMHgwMDA3ZjEwOCwKKwkweDAyMDNmMDM3LAorCTB4YmQwMDA5ZDAsCisJMHgwMDA3ZjEwNCwKKwkweDAyMDNmMDgxLAorCTB4YmQwMDAyZDAsCisJMHgwMDI3ZjEwNCwKKwkweDAwMjNmMTAwLAorCTB4MDIyNWYwODAsCisJMHg4ODAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDIsCisJMHhmMTEwMTdmMCwKKwkweGYwMDIwMDI3LAorCTB4MTJmYTAyMjMsCisJMHhiZDAzZjgwNSwKIAkweDA4OTlmMDk0LAotCTB4MzcwMDA3ZjEsCisJMHgxNzAwMDdmMSwKIAkweGQwMDIwM2YwLAogCTB4MDRiZDAwMDksCi0JMHgwYTA0MTdmMSwKLQkweGQwMDYxNGI2LAotCTB4MTdmMTAwMTIsCi0JMHgxNGI2MGEyMCwKLQkweDAyMjdmMDA2LAotCTB4ODAwMDIzZjEsCi0JMHhmMDAwMTJkMCwKLQkweDI3ZjExMDE3LAotCTB4MjNmMDAyMDAsCi0JMHgwNTEyZmEwMiwKKwkweGI2ODEwMTk4LAorCTB4MDI5ODE4MTQsCisJMHgwODI1YjY4MCwKKwkweDgwMDUxMmZkLAorCTB4OTRiZDE2MDEsCisJMHhmMTA5OTlmMCwKKwkweGYwMzcwMDA3LAorCTB4MDlkMDAyMDMsCisJMHhmMTA0YmQwMCwKKwkweGYwODEwMDA3LAorCTB4MDFkMDAyMDMsCisJMHhmMDA0YmQwMCwKKwkweDA3ZjEwMTI3LAorCTB4MDNmMDg4MDAsCisJMHgwMDAyZDAwMiwKKwkweDE3ZjEwNGJkLAorCTB4MTNmMDAxMDAsCisJMHgwNTAxZmEwNiwKIAkweDk0YmQwM2Y4LAotCTB4ZjEwODk5ZjAsCisJMHhmMTA5OTlmMCwKIAkweGYwMTcwMDA3LAogCTB4MDlkMDAyMDMsCi0JMHg5ODA0YmQwMCwKLQkweDE0YjY4MTAxLAotCTB4ODAwMjk4MTgsCi0JMHhmZDA4MjViNiwKLQkweDAxODAwNTEyLAotCTB4ZjA5NGJkMTYsCi0JMHgwN2YxMDk5OSwKLQkweDAzZjAzNzAwLAotCTB4MDAwOWQwMDIsCi0JMHgyN2YxMDRiZCwKLQkweDI0YjYwYTA0LAotCTB4MDAyMWQwMDYsCi0JMHhmMTAxMjdmMCwKLQkweGI2MGEyMDE3LAotCTB4MTJkMDA2MTQsCi0JMHgwMDE3ZjEwMCwKLQkweDA2MTNmMDAxLAotCTB4ZjgwNTAxZmEsCi0JMHhmMDk0YmQwMywKLQkweDA3ZjEwOTk5LAotCTB4MDNmMDE3MDAsCi0JMHgwMDA5ZDAwMiwKLQkweDk0YmQwNGJkLAotCTB4ZjEwNTk5ZjAsCi0JMHhmMDE3MDAwNywKLQkweDA5ZDAwMjAzLAotCTB4ZjgwNGJkMDAsCi0vKiAweDA3OTU6IGN0eF9jaGFuICovCi0JMHg4YzIxZjUwMCwKLQkweDBjYTdmMDA2LAotCTB4ZjFjOTIxZjQsCi0JMHhiNjBhMTAxNywKLQkweDI3ZjAwNjE0LAotCTB4MDAxMmQwMDUsCi0vKiAweDA3YWM6IGN0eF9jaGFuX3dhaXQgKi8KLQkweGZkMDAxMmNmLAotCTB4MWJmNDA1MjIsCi0vKiAweDA3Yjc6IGN0eF9tbWlvX2V4ZWMgKi8KLQkweDk4MDBmOGZhLAotCTB4MjdmMTQxMDMsCi0JMHgyNGI2MGEwNCwKLQkweDAwMjNkMDA2LAotLyogMHgwN2M2OiBjdHhfbW1pb19sb29wICovCisJMHhiZDA0YmQwMCwKKwkweDA1OTlmMDk0LAorCTB4MTcwMDA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDA5LAorLyogMHgwOTQyOiBjdHhfY2hhbiAqLworCTB4MjFmNTAwZjgsCisJMHhhN2YwMDgyNCwKKwkweGQwMjFmNDBjLAorCTB4ZjUwNWY3ZjAsCisJMHhmODA4MDYyMSwKKy8qIDB4MDk1NTogY3R4X21taW9fZXhlYyAqLworCTB4NDEwMzk4MDAsCisJMHg4MTAwMDdmMSwKKwkweGQwMDIwM2YwLAorCTB4MDRiZDAwMDMsCisvKiAweDA5NjY6IGN0eF9tbWlvX2xvb3AgKi8KIAkweDM0YzQzNGJkLAogCTB4MGYxYmY0ZmYsCiAJMHgwMjAwNTdmMSwKIAkweGZhMDY1M2YwLAogCTB4MDNmODA1MzUsCi0vKiAweDA3ZDg6IGN0eF9tbWlvX3B1bGwgKi8KKy8qIDB4MDk3ODogY3R4X21taW9fcHVsbCAqLwogCTB4OTg4MDRlOTgsCiAJMHgyMWY0ODE0ZiwKLQkweDA4MzBiNjhkLAorCTB4MDgzMGI2OWQsCiAJMHhmNDAxMTJiNiwKLS8qIDB4MDdlYTogY3R4X21taW9fZG9uZSAqLworLyogMHgwOThhOiBjdHhfbW1pb19kb25lICovCiAJMHgwMzk4ZGYxYiwKLQkweDAwMjNkMDE2LAotCTB4ZjE0MDAwODAsCi0JMHhmMDAxMDAxNywKLQkweDAxZmEwNjEzLAotCTB4ZjgwM2Y4MDYsCi0vKiAweDA4MDE6IGN0eF94ZmVyICovCi0JMHgwMGY3ZjEwMCwKLQkweDA2ZjRiNjBjLAotCTB4ZDAwNGU3ZjAsCi0vKiAweDA4MGU6IGN0eF94ZmVyX2lkbGUgKi8KLQkweGZlY2Y4MGZlLAotCTB4MDBlNGYxMDAsCi0JMHhmOTFiZjQyMCwKLQkweGY0MDYxMWY0LAotLyogMHgwODFlOiBjdHhfeGZlcl9wcmUgKi8KLQkweGY3ZjAwZDAyLAotCTB4NmMyMWY1MTAsCi0JMHgxYzExZjQwNiwKLS8qIDB4MDgyODogY3R4X3hmZXJfcHJlX2xvYWQgKi8KLQkweGY1MDJmN2YwLAotCTB4ZjUwNjJiMjEsCi0JMHhmNTA2M2EyMSwKLQkweGJkMDY0YzIxLAotCTB4MmIyMWY1ZjQsCi0JMHg4YzIxZjUwNiwKLS8qIDB4MDg0MTogY3R4X3hmZXJfZXhlYyAqLwotCTB4MTYwMTk4MDYsCi0JMHgwNDE0MjdmMSwKLQkweGQwMDYyNGI2LAotCTB4ZTdmMTAwMjAsCi0JMHhlM2YwYTUwMCwKLQkweDAyMWZiOTQxLAotCTB4YjY4ZDIxZjQsCi0JMHhmY2YwMDRlMCwKLQkweDAyMmNmMDAxLAotCTB4ZmQwMTI0YjYsCi0JMHgyMWY0MDVmMiwKLQkweGZjMTdmMThkLAotCTB4MDIxM2YwNGEsCi0JMHhkMDBjMjdmMCwKLQkweDIxZjUwMDEyLAotCTB4MjdmMTAyMTUsCi0JMHgyM2YwNDdmYywKLQkweDAwMjBkMDAyLAorCTB4MDAwN2YxMTYsCisJMHgwMjAzZjA4MSwKKwkweGJkMDAwM2QwLAorCTB4NDAwMDgwMDQsCisJMHgwMTAwMTdmMSwKKwkweGZhMDYxM2YwLAorCTB4MDNmODA2MDEsCisvKiAweDA5YWE6IGN0eF94ZmVyICovCisJMHhlN2YwMDBmOCwKKwkweDAwMDdmMTA0LAorCTB4MDMwM2YwMDIsCisJMHhiZDAwMGVkMCwKKy8qIDB4MDliOTogY3R4X3hmZXJfaWRsZSAqLworCTB4MDBlN2YxMDQsCisJMHgwM2UzZjAwMCwKKwkweGYxMDBlZWNmLAorCTB4ZjQyMDAwZTQsCisJMHgxMWY0ZjIxYiwKKwkweDBkMDJmNDA2LAorLyogMHgwOWQwOiBjdHhfeGZlcl9wcmUgKi8KKwkweGY1MTBmN2YwLAorCTB4ZjQwN2RlMjEsCisvKiAweDA5ZGE6IGN0eF94ZmVyX3ByZV9sb2FkICovCisJMHhmN2YwMWMxMSwKKwkweDdmMjFmNTAyLAorCTB4OTEyMWY1MDcsCisJMHhhNjIxZjUwNywKKwkweGY1ZjRiZDA3LAorCTB4ZjUwNzdmMjEsCisvKiAweDA5ZjM6IGN0eF94ZmVyX2V4ZWMgKi8KKwkweDk4MDgyNDIxLAorCTB4MjRiZDE2MDEsCisJMHgwNTAwMDdmMSwKKwkweGQwMDEwM2YwLAorCTB4MDRiZDAwMDIsCisJMHhmMTAyMWZiOSwKKwkweGYwYTUwMGU3LAorCTB4MjFmNDQxZTMsCisJMHgwMWZjZjA5ZCwKKwkweGI2MDIyY2YwLAorCTB4ZjJmZDAxMjQsCisJMHgwMmZmYjkwNSwKKwkweGE1MDRlN2YxLAorCTB4ZjQ0MWUzZjAsCisJMHgyMWY1OWQyMSwKKwkweDI0YmQwMjZhLAorCTB4NDdmYzA3ZjEsCisJMHhkMDAyMDNmMCwKKwkweDA0YmQwMDAyLAogCTB4YjYwMTJjZjAsCi0JMHgxMmQwMDMyMCwKLQkweDAxYWNmMDAwLAotCTB4ZjAwNmE1ZjAsCi0JMHgwYzk4MDBiNywKLQkweDAxMGQ5ODAwLAotCTB4ZjUwMGU3ZjAsCi0JMHhmMDAxNjYyMSwKLQkweDIxZjUwOGE3LAotCTB4MjFmNTAxMDksCi0JMHgwMWY0MDIxNSwKLQkweDBjYTdmMDIyLAotCTB4ZjFjOTIxZjQsCi0JMHhiNjBhMTAxNywKLQkweDI3ZjAwNjE0LAotCTB4MDAxMmQwMDUsCi0vKiAweDA4Yzg6IGN0eF94ZmVyX3Bvc3Rfc2F2ZV93YWl0ICovCi0JMHhmZDAwMTJjZiwKLQkweDFiZjQwNTIyLAotCTB4MmUwMmY0ZmEsCi0vKiAweDA4ZDQ6IGN0eF94ZmVyX3Bvc3QgKi8KLQkweGY1MDJmN2YwLAotCTB4YmQwNjJiMjEsCi0JMHg2YzIxZjVmNCwKLQkweDM0MjFmNTA2LAotCTB4M2EyMWY1MDIsCi0JMHhmNWY0YmQwNiwKLQkweGY0MDYyYjIxLAotCTB4MDE5ODEwMTEsCi0JMHgwNTExZmQ0MCwKLQkweGY1MDcwYmY0LAotLyogMHgwOGZmOiBjdHhfeGZlcl9ub19wb3N0X21taW8gKi8KLS8qIDB4MDhmZjogY3R4X3hmZXJfZG9uZSAqLwotCTB4ZjgwN2I3MjEsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorCTB4MDdmMTAzMjAsCisJMHgwM2YwNGFmYywKKwkweDAwMDJkMDAyLAorCTB4YWNmMDA0YmQsCisJMHgwNmE1ZjAwMSwKKwkweDk4MDBiN2YwLAorCTB4MGQ5ODAwMGMsCisJMHgwMGU3ZjAwMSwKKwkweDAxNmYyMWY1LAorCTB4ZjUwOGE3ZjAsCisJMHhmNTAxMTAyMSwKKwkweGY0MDI1ZTIxLAorCTB4YTdmMDEzMDEsCisJMHhkMDIxZjQwYywKKwkweGY1MDVmN2YwLAorCTB4ZjQwODA2MjEsCisvKiAweDBhODI6IGN0eF94ZmVyX3Bvc3QgKi8KKwkweGY3ZjAyZTAyLAorCTB4N2YyMWY1MDIsCisJMHhmNWY0YmQwNywKKwkweGY1MDdkZTIxLAorCTB4ZjUwMjdmMjEsCisJMHhiZDA3OTEyMSwKKwkweDdmMjFmNWY0LAorCTB4MTAxMWY0MDcsCisJMHhmZDQwMDE5OCwKKwkweDBiZjQwNTExLAorCTB4NTUyMWY1MDcsCisvKiAweDBhYWQ6IGN0eF94ZmVyX25vX3Bvc3RfbW1pbyAqLworLyogMHgwYWFkOiBjdHhfeGZlcl9kb25lICovCisJMHgwMDAwZjgwOSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2Z1Yy9tYWNyb3MuZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL21hY3Jvcy5mdWMKaW5kZXggMzNhNWE4Mi4uNmZmZTI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL21hY3Jvcy5mdWMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZnVjL21hY3Jvcy5mdWMKQEAgLTI4LDI4ICsyOCwxMzUgQEAKICNkZWZpbmUgR0YxMTcgMHhkNwogI2RlZmluZSBHSzEwMCAweGUwCiAjZGVmaW5lIEdLMTEwIDB4ZjAKKyNkZWZpbmUgR0syMDggMHgxMDgKIAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTAwOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0ZXTVRIRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0NIU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTAwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX01PREVfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX01PREVfRklGT19MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX01PREVfRklGT19FREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0VOX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTAxMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX0VOX1NFVF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX1JPVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTAxYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTA0OAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19BQ0NFU1NfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19GSUZPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTA2NAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19GSUZPX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTA2OAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19GSUZPX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTA3NAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DQVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTEwOAogI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TSUdOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JUk9VVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19CQVJfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19CQVJfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQxMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19CQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQxNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19CQVJfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTQxOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTYxNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX0VOQUJMRV9ST1AgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX0VOQUJMRV9HUEMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX0VOQUJMRV9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BPV0VSX1JPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BPV0VSX0dQQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BPV0VSX01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BBVVNFX0dQQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19SRURfU1dJVENIX1BBVVNFX01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9TQVZFX1NXQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX1NXQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTc0YworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9TQVZFX1NXQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX1NXQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcxMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcxNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9NVUxUSV9TVFJJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcxOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9NVUxUSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcxYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcyMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUlPX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcyOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUlPX1JEVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTcyYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUlPX1dSVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTczMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NTUNUWF9MT0FEX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTc0YwogI2lmIENISVBTRVQgPCBHSzExMAogI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DQ19TQ1JBVENIX1ZBTChuKSAgICAgICAgICAgICAgICAgICAgKChuKSAqIDQgKyAweDQwOTgwMCkKICNkZWZpbmUgTlZfUEdSQVBIX0ZFQ1NfQ0NfU0NSQVRDSF9TRVQobikgICAgICAgICAgICAgICAgICAgICgobikgKiA0ICsgMHg0MDk4MjApCiAjZGVmaW5lIE5WX1BHUkFQSF9GRUNTX0NDX1NDUkFUQ0hfQ0xSKG4pICAgICAgICAgICAgICAgICAgICAoKG4pICogNCArIDB4NDA5ODQwKQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19VTks4NkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTg2YwogI2Vsc2UKICNkZWZpbmUgTlZfUEdSQVBIX0ZFQ1NfQ0NfU0NSQVRDSF9WQUwobikgICAgICAgICAgICAgICAgICAgICgobikgKiA0ICsgMHg0MDk4MDApCiAjZGVmaW5lIE5WX1BHUkFQSF9GRUNTX0NDX1NDUkFUQ0hfQ0xSKG4pICAgICAgICAgICAgICAgICAgICAoKG4pICogNCArIDB4NDA5ODQwKQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19VTks4NkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTg4YwogI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DQ19TQ1JBVENIX1NFVChuKSAgICAgICAgICAgICAgICAgICAgKChuKSAqIDQgKyAweDQwOThjMCkKICNlbmRpZgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRTX0NOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTg4MAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfU0FWRV9TV0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkwOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfTE9BRF9TV0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkxMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkxOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkxYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkyOAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX1NFRUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX1NBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0xPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0FDVElWQVRFX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0RFQUNUSVZBVEVfRklMVEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfQ01EX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19TVFJBTkRfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOTkzYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWEwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fQ0hBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWEwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWExMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fQ01EX0xPQURfQ0hBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fVEFSR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWEyMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fVEFSR0VUX1VOSzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fVEFSR0VUX0FTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fVEFSR0VUX0FTX1ZNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19NRU1fVEFSR0VUX0FTX1ZSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DSEFOX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWIwMAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DSEFOX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWIwNAorI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DSFNXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWIwYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19DSFNXX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX1VQX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWMxYworI2RlZmluZSBOVl9QR1JBUEhfRkVDU19JTlRSX1VQX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwOWMyNAogCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFJfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDA0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDA4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFJfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFJfRU5fU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDEwCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFJfRU5fU0VUX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0lOVFJfUk9VVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDFjCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDQ4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0FDQ0VTU19GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDY0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDY4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0ZJRk9fQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhMDc0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1VOSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNjA4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNjE0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0hfVU5LMTEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0hfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0hfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1JFRF9TV0lUQ0hfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX01ZSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNjE4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX01NQ1RYX1NBVkVfU1dCQVNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNzAwCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX01NQ1RYX0xPQURfU1dCQVNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNzA0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX01NQ1RYX0xPQURfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhNzRjCiAjaWYgQ0hJUFNFVCA8IEdLMTEwCiAjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0NDX1NDUkFUQ0hfVkFMKG4pICAgICAgICAgICAgICAoKG4pICogNCArIDB4NDFhODAwKQogI2RlZmluZSBOVl9QR1JBUEhfR1BDWF9HUENDU19DQ19TQ1JBVENIX1NFVChuKSAgICAgICAgICAgICAgKChuKSAqIDQgKyAweDQxYTgyMCkKICNkZWZpbmUgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfQ0NfU0NSQVRDSF9DTFIobikgICAgICAgICAgICAgICgobikgKiA0ICsgMHg0MWE4NDApCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1VOSzg2QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhODZjCiAjZWxzZQogI2RlZmluZSBOVl9QR1JBUEhfR1BDWF9HUENDU19DQ19TQ1JBVENIX1ZBTChuKSAgICAgICAgICAgICAgKChuKSAqIDQgKyAweDQxYTgwMCkKICNkZWZpbmUgTlZfUEdSQVBIX0dQQ1hfR1BDQ1NfQ0NfU0NSQVRDSF9DTFIobikgICAgICAgICAgICAgICgobikgKiA0ICsgMHg0MWE4NDApCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1VOSzg2QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhODhjCiAjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX0NDX1NDUkFUQ0hfU0VUKG4pICAgICAgICAgICAgICAoKG4pICogNCArIDB4NDFhOGMwKQogI2VuZGlmCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1NUUkFORF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhOTFjCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1NUUkFORF9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhOTI4CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1NUUkFORF9DTURfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX1NUUkFORF9DTURfTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5WX1BHUkFQSF9HUENYX0dQQ0NTX01FTV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFhYTA0CiAKICNkZWZpbmUgbW1jdHhfZGF0YShyLGMpIC5iMzIgKCgoYyAtIDEpIDw8IDI2KSB8IHIpCiAjZGVmaW5lIHF1ZXVlX2luaXQgICAgICAuc2tpcCA3MiAvLyAoMiAqIDQpICsgKCg4ICogNCkgKiAyKQpAQCAtNjUsMjQgKzE3Miw1MCBAQAogI2RlZmluZSBUX0xDSEFOICAgOAogI2RlZmluZSBUX0xDVFhIICAgOQogCi0jZGVmaW5lIG52X21rbW0ocnYscikgLyoKLSovCW1vdncgcnYgICgocikgJiAweDAwMDBmZmZjKSAvKgotKi8Jc2V0aGkgcnYgKChyKSAmIDB4MDBmZjAwMDApCisjaWYgQ0hJUFNFVCA8IEdLMjA4CisjZGVmaW5lIGltbTMyKHJlZyx2YWwpIC8qCisqLwltb3Z3IHJlZyAgKCh2YWwpICYgMHgwMDAwZmZmZikgLyoKKyovCXNldGhpIHJlZyAoKHZhbCkgJiAweGZmZmYwMDAwKQorI2Vsc2UKKyNkZWZpbmUgaW1tMzIocmVnLHZhbCkgLyoKKyovCW1vdiByZWcgKHZhbCkKKyNlbmRpZgorCiAjZGVmaW5lIG52X21raW8ocnYscixpKSAvKgotKi8JbnZfbWttbShydiwgKCgocikgJiAweGZmYykgPDwgNikgfCAoKGkpIDw8IDIpKQorKi8JaW1tMzIocnYsICgoKHIpICYgMHhmZmMpIDw8IDYpIHwgKChpKSA8PCAyKSkKKworI2RlZmluZSBoYXNoICMKKyNkZWZpbmUgZm4oYSkgYQorI2lmIENISVBTRVQgPCBHSzIwOAorI2RlZmluZSBjYWxsKGEpIGNhbGwgZm4oaGFzaClhCisjZWxzZQorI2RlZmluZSBjYWxsKGEpIGxjYWxsIGZuKGhhc2gpYQorI2VuZGlmCiAKICNkZWZpbmUgbnZfaW9yZChydixyLGkpIC8qCiAqLwludl9ta2lvKHJ2LHIsaSkgLyoKICovCWlvcmQgcnYgSVtydl0KKwogI2RlZmluZSBudl9pb3dyKHIsaSxydikgLyoKICovCW52X21raW8oJHIwLHIsaSkgLyoKICovCWlvd3IgSVskcjBdIHJ2IC8qCiAqLwljbGVhciBiMzIgJHIwCiAKKyNkZWZpbmUgbnZfcmQzMihyZWcsYWRkcikgLyoKKyovCWltbTMyKCRyMTQsIGFkZHIpIC8qCisqLwljYWxsKG52X3JkMzIpIC8qCisqLwltb3YgYjMyIHJlZyAkcjE1CisKKyNkZWZpbmUgbnZfd3IzMihhZGRyLHJlZykgLyoKKyovCW1vdiBiMzIgJHIxNSByZWcgLyoKKyovCWltbTMyKCRyMTQsIGFkZHIpIC8qCisqLwljYWxsKG52X3dyMzIpCisKICNkZWZpbmUgdHJhY2Vfc2V0KGJpdCkgLyoKICovCWNsZWFyIGIzMiAkcjkgLyoKICovCWJzZXQgJHI5IGJpdCAvKgogKi8JbnZfaW93cihOVl9QR1JBUEhfRkVDU19DQ19TQ1JBVENIX1NFVCg3KSwgMCwgJHI5KQorCiAjZGVmaW5lIHRyYWNlX2NscihiaXQpIC8qCiAqLwljbGVhciBiMzIgJHI5IC8qCiAqLwlic2V0ICRyOSBiaXQgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252MTA4LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udjEwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWY2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udjEwOC5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncyA8YnNrZWdnc0ByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlICJudmMwLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHcmFwaGljcyBvYmplY3QgY2xhc3NlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X29jbGFzcworbnYxMDhfZ3JhcGhfc2NsYXNzW10gPSB7CisJeyAweDkwMmQsICZub3V2ZWF1X29iamVjdF9vZnVuY3MgfSwKKwl7IDB4YTE0MCwgJm5vdXZlYXVfb2JqZWN0X29mdW5jcyB9LAorCXsgMHhhMTk3LCAmbm91dmVhdV9vYmplY3Rfb2Z1bmNzIH0sCisJeyAweGExYzAsICZub3V2ZWF1X29iamVjdF9vZnVuY3MgfSwKKwl7fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBHUkFQSCBlbmdpbmUvc3ViZGV2IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyYXBoX2luaXRfcmVnc1tdID0geworCXsgMHg0MDAwODAsICAgMSwgMHgwNCwgMHgwMDMwODNjMiB9LAorCXsgMHg0MDAwODgsICAgMSwgMHgwNCwgMHgwMDAxYmZlNyB9LAorCXsgMHg0MDAwOGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDAwOTAsICAgMSwgMHgwNCwgMHgwMDAwMDAzMCB9LAorCXsgMHg0MDAxM2MsICAgMSwgMHgwNCwgMHgwMDM5MDFmNyB9LAorCXsgMHg0MDAxNDAsICAgMSwgMHgwNCwgMHgwMDAwMDEwMCB9LAorCXsgMHg0MDAxNDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDAxNDgsICAgMSwgMHgwNCwgMHgwMDAwMDExMCB9LAorCXsgMHg0MDAxMzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDAxMzAsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MDAxMjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMiB9LAorCXt9Cit9OworCitzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmFwaF9pbml0X3VuazU4eHhbXSA9IHsKKwl7IDB4NDA1ODQ0LCAgIDEsIDB4MDQsIDB4MDBmZmZmZmYgfSwKKwl7IDB4NDA1ODUwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1OTAwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1OTA4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1OTI4LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7IDB4NDA1OTJjLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK252MTA4X2dyYXBoX2luaXRfZ3BjW10gPSB7CisJeyAweDQxODQwOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODRhMCwgICAzLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODYwNCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODY4MCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODcxNCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODM4NCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODgxNCwgICAzLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGIwNCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODhjOCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxODhkMCwgICAxLCAweDA0LCAweDAwMDEwMDAwIH0sCisJeyAweDQxODhkNCwgICAxLCAweDA0LCAweDAwMDAwMjAxIH0sCisJeyAweDQxODkxMCwgICAxLCAweDA0LCAweDAwMDEwMDAxIH0sCisJeyAweDQxODkxNCwgICAxLCAweDA0LCAweDAwMDAwMzAxIH0sCisJeyAweDQxODkxOCwgICAxLCAweDA0LCAweDAwODAwMDAwIH0sCisJeyAweDQxODk4MCwgICAxLCAweDA0LCAweDc3Nzc3NzcwIH0sCisJeyAweDQxODk4NCwgICAzLCAweDA0LCAweDc3Nzc3Nzc3IH0sCisJeyAweDQxOGMwNCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGM2NCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGM4OCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGNiNCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGQwMCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGQyOCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGYwMCwgICAxLCAweDA0LCAweDAwMDAwNDAwIH0sCisJeyAweDQxOGYwOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGYyMCwgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGUwMCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGUwOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOGUxYywgICAyLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOTAwYywgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJeyAweDQxOTAxOCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitudjEwOF9ncmFwaF9pbml0X3RwY1tdID0geworCXsgMHg0MTlkMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlkMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAxNCB9LAorCXsgMHg0MTlhYjAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlhYzgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlhYjgsICAgMSwgMHgwNCwgMHgwMDAwMDBlNyB9LAorCXsgMHg0MTlhYmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlhYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlhYTgsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTk4MGMsICAgMSwgMHgwNCwgMHgwMDAwMDAxMCB9LAorCXsgMHg0MTk4NDQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTk4NTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MTk4NTQsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljOTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljYjAsICAgMSwgMHgwNCwgMHgwMTAwMDAwMCB9LAorCXsgMHg0MTljYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljYjgsICAgMSwgMHgwNCwgMHgwMGIwOGJlYSB9LAorCXsgMHg0MTljODQsICAgMSwgMHgwNCwgMHgwMDAxMDM4NCB9LAorCXsgMHg0MTljYmMsICAgMSwgMHgwNCwgMHgyODFiMzY0NiB9LAorCXsgMHg0MTljYzAsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljODAsICAgMSwgMHgwNCwgMHgwMDAwMDIzMCB9LAorCXsgMHg0MTljY2MsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTljMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllMDAsICAgMSwgMHgwNCwgMHgwMDAwMDA4MCB9LAorCXsgMHg0MTllYTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllZTQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllYTQsICAgMSwgMHgwNCwgMHgwMDAwMDEwMCB9LAorCXsgMHg0MTllYTgsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllYjQsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllYmMsICAgMiwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllZGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTlmMDAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXsgMHg0MTllZDAsICAgMSwgMHgwNCwgMHgwMDAwMzIzNCB9LAorCXsgMHg0MTlmNzQsICAgMSwgMHgwNCwgMHgwMDAxNTU1NSB9LAorCXsgMHg0MTlmODAsICAgNCwgMHgwNCwgMHgwMDAwMDAwMCB9LAorCXt9Cit9OworCitzdGF0aWMgaW50CitudjEwOF9ncmFwaF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCit7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1MzIgYWRkcjsKKwkJdTMyIGRhdGE7CisJfSBtYWdpY1tdID0geworCQl7IDB4MDIwNTIwLCAweGZmZmZmZmZjIH0sCisJCXsgMHgwMjA1MjQsIDB4ZmZmZmZmZmUgfSwKKwkJeyAweDAyMDUyNCwgMHhmZmZmZmZmYyB9LAorCQl7IDB4MDIwNTI0LCAweGZmZmZmZmY4IH0sCisJCXsgMHgwMjA1MjQsIDB4ZmZmZmZmZTAgfSwKKwkJeyAweDAyMDUzMCwgMHhmZmZmZmZmZSB9LAorCQl7IDB4MDIwNTJjLCAweGZmZmZmZmZhIH0sCisJCXsgMHgwMjA1MmMsIDB4ZmZmZmZmZjAgfSwKKwkJeyAweDAyMDUyYywgMHhmZmZmZmZjMCB9LAorCQl7IDB4MDIwNTJjLCAweGZmZmZmZjAwIH0sCisJCXsgMHgwMjA1MmMsIDB4ZmZmZmZjMDAgfSwKKwkJeyAweDAyMDUyYywgMHhmZmZjZmMwMCB9LAorCQl7IDB4MDIwNTJjLCAweGZmZjBmYzAwIH0sCisJCXsgMHgwMjA1MmMsIDB4ZmY4MGZjMDAgfSwKKwkJeyAweDAyMDUyOCwgMHhmZmZmZmZmZSB9LAorCQl7IDB4MDIwNTI4LCAweGZmZmZmZmZjIH0sCisJfTsKKwlpbnQgaTsKKworCW52X21hc2socHJpdiwgMHgwMDAyMDAsIDB4MDgwMDEwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2socHJpdiwgMHgwMjA2YjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hZ2ljKTsgaSsrKSB7CisJCW52X3dyMzIocHJpdiwgbWFnaWNbaV0uYWRkciwgbWFnaWNbaV0uZGF0YSk7CisJCW52X3dhaXQocHJpdiwgbWFnaWNbaV0uYWRkciwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJfQorCisJcmV0dXJuIG5vdXZlYXVfZ3JhcGhfZmluaSgmcHJpdi0+YmFzZSwgc3VzcGVuZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0ICoKK252MTA4X2dyYXBoX2luaXRfbW1pb1tdID0geworCW52MTA4X2dyYXBoX2luaXRfcmVncywKKwludmYwX2dyYXBoX2luaXRfdW5rNDB4eCwKKwludmMwX2dyYXBoX2luaXRfdW5rNDR4eCwKKwludmMwX2dyYXBoX2luaXRfdW5rNzh4eCwKKwludmMwX2dyYXBoX2luaXRfdW5rNjB4eCwKKwludmQ5X2dyYXBoX2luaXRfdW5rNjR4eCwKKwludjEwOF9ncmFwaF9pbml0X3VuazU4eHgsCisJbnZjMF9ncmFwaF9pbml0X3VuazgweHgsCisJbnZmMF9ncmFwaF9pbml0X3VuazcweHgsCisJbnZmMF9ncmFwaF9pbml0X3VuazVieHgsCisJbnYxMDhfZ3JhcGhfaW5pdF9ncGMsCisJbnYxMDhfZ3JhcGhfaW5pdF90cGMsCisJbnZlNF9ncmFwaF9pbml0X3VuaywKKwludmU0X2dyYXBoX2luaXRfdW5rODh4eCwKKwlOVUxMCit9OworCisjaW5jbHVkZSAiZnVjL2h1Ym52MTA4LmZ1YzUuaCIKKworc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX3Vjb2RlCitudjEwOF9ncmFwaF9mZWNzX3Vjb2RlID0geworCS5jb2RlLmRhdGEgPSBudjEwOF9ncmh1Yl9jb2RlLAorCS5jb2RlLnNpemUgPSBzaXplb2YobnYxMDhfZ3JodWJfY29kZSksCisJLmRhdGEuZGF0YSA9IG52MTA4X2dyaHViX2RhdGEsCisJLmRhdGEuc2l6ZSA9IHNpemVvZihudjEwOF9ncmh1Yl9kYXRhKSwKK307CisKKyNpbmNsdWRlICJmdWMvZ3BjbnYxMDguZnVjNS5oIgorCitzdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfdWNvZGUKK252MTA4X2dyYXBoX2dwY2NzX3Vjb2RlID0geworCS5jb2RlLmRhdGEgPSBudjEwOF9ncmdwY19jb2RlLAorCS5jb2RlLnNpemUgPSBzaXplb2YobnYxMDhfZ3JncGNfY29kZSksCisJLmRhdGEuZGF0YSA9IG52MTA4X2dyZ3BjX2RhdGEsCisJLmRhdGEuc2l6ZSA9IHNpemVvZihudjEwOF9ncmdwY19kYXRhKSwKK307CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjEwOF9ncmFwaF9vY2xhc3MgPSAmKHN0cnVjdCBudmMwX2dyYXBoX29jbGFzcykgeworCS5iYXNlLmhhbmRsZSA9IE5WX0VOR0lORShHUiwgMHgwOCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBudmMwX2dyYXBoX2N0b3IsCisJCS5kdG9yID0gbnZjMF9ncmFwaF9kdG9yLAorCQkuaW5pdCA9IG52ZTRfZ3JhcGhfaW5pdCwKKwkJLmZpbmkgPSBudjEwOF9ncmFwaF9maW5pLAorCX0sCisJLmNjbGFzcyA9ICZudjEwOF9ncmN0eF9vY2xhc3MsCisJLnNjbGFzcyA9ICBudjEwOF9ncmFwaF9zY2xhc3MsCisJLm1taW8gPSBudjEwOF9ncmFwaF9pbml0X21taW8sCisJLmZlY3MudWNvZGUgPSAmbnYxMDhfZ3JhcGhfZmVjc191Y29kZSwKKwkuZ3BjY3MudWNvZGUgPSAmbnYxMDhfZ3JhcGhfZ3BjY3NfdWNvZGUsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udjUwLmMKaW5kZXggMDNkZTUxNy4uMzBlZDE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252NTAuYwpAQCAtMzA0LDEyICszMDQsMjggQEAKIAlyZXR1cm4gdGltZW91dCA/IC1FQlVTWSA6IDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtIG52NTBfbXBfZXhlY19lcnJvcl9uYW1lc1tdID0gewotCXsgMywgIlNUQUNLX1VOREVSRkxPVyIsIE5VTEwgfSwKLQl7IDQsICJRVUFET05fQUNUSVZFIiwgTlVMTCB9LAotCXsgOCwgIlRJTUVPVVQiLCBOVUxMIH0sCi0JeyAweDEwLCAiSU5WQUxJRF9PUENPREUiLCBOVUxMIH0sCi0JeyAweDQwLCAiQlJFQUtQT0lOVCIsIE5VTEwgfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudjUwX21wX2V4ZWNfZXJyb3JzW10gPSB7CisJeyAweDAxLCAiU1RBQ0tfVU5ERVJGTE9XIiB9LAorCXsgMHgwMiwgIlNUQUNLX01JU01BVENIIiB9LAorCXsgMHgwNCwgIlFVQURPTl9BQ1RJVkUiIH0sCisJeyAweDA4LCAiVElNRU9VVCIgfSwKKwl7IDB4MTAsICJJTlZBTElEX09QQ09ERSIgfSwKKwl7IDB4MjAsICJQTV9PVkVSRkxPVyIgfSwKKwl7IDB4NDAsICJCUkVBS1BPSU5UIiB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnY1MF9tcGNfdHJhcHNbXSA9IHsKKwl7IDB4MDAwMDAwMSwgIkxPQ0FMX0xJTUlUX1JFQUQiIH0sCisJeyAweDAwMDAwMTAsICJMT0NBTF9MSU1JVF9XUklURSIgfSwKKwl7IDB4MDAwMDA0MCwgIlNUQUNLX0xJTUlUIiB9LAorCXsgMHgwMDAwMTAwLCAiR0xPQkFMX0xJTUlUX1JFQUQiIH0sCisJeyAweDAwMDEwMDAsICJHTE9CQUxfTElNSVRfV1JJVEUiIH0sCisJeyAweDAwMTAwMDAsICJNUDAiIH0sCisJeyAweDAwMjAwMDAsICJNUDEiIH0sCisJeyAweDAwNDAwMDAsICJHTE9CQUxfTElNSVRfUkVEIiB9LAorCXsgMHgwNDAwMDAwLCAiR0xPQkFMX0xJTUlUX0FUT00iIH0sCisJeyAweDQwMDAwMDAsICJNUDIiIH0sCiAJe30KIH07CiAKQEAgLTM5Niw2ICs0MTIsNjAgQEAKIAl7fQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfdHJhcF9wcm9wW10gPSB7CisJeyAweDAwMDAwMDA0LCAiU1VSRl9XSURUSF9PVkVSUlVOIiB9LAorCXsgMHgwMDAwMDAwOCwgIlNVUkZfSEVJR0hUX09WRVJSVU4iIH0sCisJeyAweDAwMDAwMDEwLCAiRFNUMkRfRkFVTFQiIH0sCisJeyAweDAwMDAwMDIwLCAiWkVUQV9GQVVMVCIgfSwKKwl7IDB4MDAwMDAwNDAsICJSVF9GQVVMVCIgfSwKKwl7IDB4MDAwMDAwODAsICJDVURBX0ZBVUxUIiB9LAorCXsgMHgwMDAwMDEwMCwgIkRTVDJEX1NUT1JBR0VfVFlQRV9NSVNNQVRDSCIgfSwKKwl7IDB4MDAwMDAyMDAsICJaRVRBX1NUT1JBR0VfVFlQRV9NSVNNQVRDSCIgfSwKKwl7IDB4MDAwMDA0MDAsICJSVF9TVE9SQUdFX1RZUEVfTUlTTUFUQ0giIH0sCisJeyAweDAwMDAwODAwLCAiRFNUMkRfTElORUFSX01JU01BVENIIiB9LAorCXsgMHgwMDAwMTAwMCwgIlJUX0xJTkVBUl9NSVNNQVRDSCIgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQKK252NTBfcHJpdl9wcm9wX3RyYXAoc3RydWN0IG52NTBfZ3JhcGhfcHJpdiAqcHJpdiwKKwkJICAgIHUzMiB1c3RhdHVzX2FkZHIsIHUzMiB1c3RhdHVzLCB1MzIgdHApCit7CisJdTMyIGUwYyA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgwNCk7CisJdTMyIGUxMCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgwOCk7CisJdTMyIGUxNCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgwYyk7CisJdTMyIGUxOCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgxMCk7CisJdTMyIGUxYyA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgxNCk7CisJdTMyIGUyMCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgxOCk7CisJdTMyIGUyNCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgxYyk7CisKKwkvKiBDVURBIG1lbW9yeTogbFtdLCBnW10gb3Igc3RhY2suICovCisJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDgwKSB7CisJCWlmIChlMTggJiAweDgwMDAwMDAwKSB7CisJCQkvKiBnW10gcmVhZCBmYXVsdD8gKi8KKwkJCW52X2Vycm9yKHByaXYsICJUUkFQX1BST1AgLSBUUCAlZCAtIENVREFfRkFVTFQgLSBHbG9iYWwgcmVhZCBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCQkgdHAsIGUxNCwgZTEwIHwgKChlMTggPj4gMjQpICYgMHgxZikpOworCQkJZTE4ICY9IH4weDFmMDAwMDAwOworCQl9IGVsc2UgaWYgKGUxOCAmIDB4YykgeworCQkJLyogZ1tdIHdyaXRlIGZhdWx0PyAqLworCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfUFJPUCAtIFRQICVkIC0gQ1VEQV9GQVVMVCAtIEdsb2JhbCB3cml0ZSBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCSB0cCwgZTE0LCBlMTAgfCAoKGUxOCA+PiA3KSAmIDB4MWYpKTsKKwkJCWUxOCAmPSB+MHgwMDAwMGY4MDsKKwkJfSBlbHNlIHsKKwkJCW52X2Vycm9yKHByaXYsICJUUkFQX1BST1AgLSBUUCAlZCAtIFVua25vd24gQ1VEQSBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCSB0cCwgZTE0LCBlMTApOworCQl9CisJCXVzdGF0dXMgJj0gfjB4MDAwMDAwODA7CisJfQorCWlmICh1c3RhdHVzKSB7CisJCW52X2Vycm9yKHByaXYsICJUUkFQX1BST1AgLSBUUCAlZCAtIiwgdHApOworCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfdHJhcF9wcm9wLCB1c3RhdHVzKTsKKwkJcHJfY29udCgiIC0gQWRkcmVzcyAlMDJ4JTA4eFxuIiwgZTE0LCBlMTApOworCX0KKwludl9lcnJvcihwcml2LCAiVFJBUF9QUk9QIC0gVFAgJWQgLSBlMGM6ICUwOHgsIGUxODogJTA4eCwgZTFjOiAlMDh4LCBlMjA6ICUwOHgsIGUyNDogJTA4eFxuIiwKKwkJIHRwLCBlMGMsIGUxOCwgZTFjLCBlMjAsIGUyNCk7Cit9CisKIHN0YXRpYyB2b2lkCiBudjUwX3ByaXZfbXBfdHJhcChzdHJ1Y3QgbnY1MF9ncmFwaF9wcml2ICpwcml2LCBpbnQgdHBpZCwgaW50IGRpc3BsYXkpCiB7CkBAIC00MjAsOCArNDkwLDggQEAKIAkJCW9wbG93ID0gbnZfcmQzMihwcml2LCBhZGRyICsgMHg3MCk7CiAJCQlvcGhpZ2ggPSBudl9yZDMyKHByaXYsIGFkZHIgKyAweDc0KTsKIAkJCW52X2Vycm9yKHByaXYsICJUUkFQX01QX0VYRUMgLSAiCi0JCQkJCSJUUCAlZCBNUCAlZDogIiwgdHBpZCwgaSk7Ci0JCQlub3V2ZWF1X2VudW1fcHJpbnQobnY1MF9tcF9leGVjX2Vycm9yX25hbWVzLCBzdGF0dXMpOworCQkJCQkiVFAgJWQgTVAgJWQ6IiwgdHBpZCwgaSk7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfbXBfZXhlY19lcnJvcnMsIHN0YXR1cyk7CiAJCQlwcl9jb250KCIgYXQgJTA2eCB3YXJwICVkLCBvcGNvZGUgJTA4eCAlMDh4XG4iLAogCQkJCQlwYyYweGZmZmZmZiwgcGMgPj4gMjQsCiAJCQkJCW9wbG93LCBvcGhpZ2gpOwpAQCAtNDY4LDU5ICs1MzgsMTggQEAKIAkJCQludjUwX3ByaXZfbXBfdHJhcChwcml2LCBpLCBkaXNwbGF5KTsKIAkJCQl1c3RhdHVzICY9IH4weDA0MDMwMDAwOwogCQkJfQorCQkJaWYgKHVzdGF0dXMgJiYgZGlzcGxheSkgeworCQkJCW52X2Vycm9yKCIlcyAtIFRQJWQ6IiwgbmFtZSwgaSk7CisJCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjUwX21wY190cmFwcywgdXN0YXR1cyk7CisJCQkJcHJfY29udCgiXG4iKTsKKwkJCQl1c3RhdHVzID0gMDsKKwkJCX0KIAkJCWJyZWFrOwotCQljYXNlIDg6IC8qIFRQRE1BIGVycm9yICovCi0JCQl7Ci0JCQl1MzIgZTBjID0gbnZfcmQzMihwcml2LCB1c3RhdHVzX2FkZHIgKyA0KTsKLQkJCXUzMiBlMTAgPSBudl9yZDMyKHByaXYsIHVzdGF0dXNfYWRkciArIDgpOwotCQkJdTMyIGUxNCA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHhjKTsKLQkJCXUzMiBlMTggPSBudl9yZDMyKHByaXYsIHVzdGF0dXNfYWRkciArIDB4MTApOwotCQkJdTMyIGUxYyA9IG52X3JkMzIocHJpdiwgdXN0YXR1c19hZGRyICsgMHgxNCk7Ci0JCQl1MzIgZTIwID0gbnZfcmQzMihwcml2LCB1c3RhdHVzX2FkZHIgKyAweDE4KTsKLQkJCXUzMiBlMjQgPSBudl9yZDMyKHByaXYsIHVzdGF0dXNfYWRkciArIDB4MWMpOwotCQkJLyogMmQgZW5naW5lIGRlc3RpbmF0aW9uICovCi0JCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMTApIHsKLQkJCQlpZiAoZGlzcGxheSkgewotCQkJCQludl9lcnJvcihwcml2LCAiVFJBUF9UUERNQV8yRCAtIFRQICVkIC0gVW5rbm93biBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAotCQkJCQkJCWksIGUxNCwgZTEwKTsKLQkJCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfVFBETUFfMkQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKLQkJCX0KLQkJCS8qIFJlbmRlciB0YXJnZXQgKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA0MCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCW52X2Vycm9yKHByaXYsICJUUkFQX1RQRE1BX1JUIC0gVFAgJWQgLSBVbmtub3duIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJaSwgZTE0LCBlMTApOwotCQkJCQludl9lcnJvcihwcml2LCAiVFJBUF9UUERNQV9SVCAtIFRQICVkIC0gZTBjOiAlMDh4LCBlMTg6ICUwOHgsIGUxYzogJTA4eCwgZTIwOiAlMDh4LCBlMjQ6ICUwOHhcbiIsCi0JCQkJCQkJaSwgZTBjLCBlMTgsIGUxYywgZTIwLCBlMjQpOwotCQkJCX0KLQkJCQl1c3RhdHVzICY9IH4weDAwMDAwMDQwOwotCQkJfQotCQkJLyogQ1VEQSBtZW1vcnk6IGxbXSwgZ1tdIG9yIHN0YWNrLiAqLwotCQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDgwKSB7Ci0JCQkJaWYgKGRpc3BsYXkpIHsKLQkJCQkJaWYgKGUxOCAmIDB4ODAwMDAwMDApIHsKLQkJCQkJCS8qIGdbXSByZWFkIGZhdWx0PyAqLwotCQkJCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfVFBETUEgLSBUUCAlZCAtIEdsb2JhbCByZWFkIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gMjQpICYgMHgxZikpOwotCQkJCQkJZTE4ICY9IH4weDFmMDAwMDAwOwotCQkJCQl9IGVsc2UgaWYgKGUxOCAmIDB4YykgewotCQkJCQkJLyogZ1tdIHdyaXRlIGZhdWx0PyAqLwotCQkJCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfVFBETUEgLSBUUCAlZCAtIEdsb2JhbCB3cml0ZSBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAotCQkJCQkJCQlpLCBlMTQsIGUxMCB8ICgoZTE4ID4+IDcpICYgMHgxZikpOwotCQkJCQkJZTE4ICY9IH4weDAwMDAwZjgwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfVFBETUEgLSBUUCAlZCAtIFVua25vd24gQ1VEQSBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAotCQkJCQkJCQlpLCBlMTQsIGUxMCk7Ci0JCQkJCX0KLQkJCQkJbnZfZXJyb3IocHJpdiwgIlRSQVBfVFBETUEgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA4MDsKLQkJCX0KLQkJCX0KKwkJY2FzZSA4OiAvKiBQUk9QIGVycm9yICovCisJCQlpZiAoZGlzcGxheSkKKwkJCQludjUwX3ByaXZfcHJvcF90cmFwKAorCQkJCQkJcHJpdiwgdXN0YXR1c19hZGRyLCB1c3RhdHVzLCBpKTsKKwkJCXVzdGF0dXMgPSAwOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHVzdGF0dXMpIHsKQEAgLTcyNywxMSArNzU2LDExIEBACiAJCXN0YXR1cyAmPSB+MHgwODA7CiAJfQogCi0JLyogVFBETUE6ICBIYW5kbGVzIFRQLWluaXRpYXRlZCB1bmNhY2hlZCBtZW1vcnkgYWNjZXNzZXM6CisJLyogUFJPUDogIEhhbmRsZXMgVFAtaW5pdGlhdGVkIHVuY2FjaGVkIG1lbW9yeSBhY2Nlc3NlczoKIAkgKiBsW10sIGdbXSwgc3RhY2ssIDJkIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cy4gKi8KIAlpZiAoc3RhdHVzICYgMHgxMDApIHsKIAkJbnY1MF9wcml2X3RwX3RyYXAocHJpdiwgOCwgMHg0MDhlMDgsIDB4NDA4NzA4LCBkaXNwbGF5LAotCQkJCSAgICAiVFJBUF9UUERNQSIpOworCQkJCSAgICAiVFJBUF9QUk9QIik7CiAJCW52X3dyMzIocHJpdiwgMHg0MDAxMDgsIDB4MTAwKTsKIAkJc3RhdHVzICY9IH4weDEwMDsKIAl9CkBAIC03NjAsNyArNzg5LDcgQEAKIAl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CiAJdTMyIGRhdGEgPSBudl9yZDMyKHByaXYsIDB4NDAwNzA4KTsKIAl1MzIgY2xhc3MgPSBudl9yZDMyKHByaXYsIDB4NDAwODE0KTsKLQl1MzIgc2hvdyA9IHN0YXQ7CisJdTMyIHNob3cgPSBzdGF0LCBzaG93X2JpdGZpZWxkID0gc3RhdDsKIAlpbnQgY2hpZDsKIAogCWVuZ2N0eCA9IG5vdXZlYXVfZW5nY3R4X2dldChlbmdpbmUsIGluc3QpOwpAQCAtNzc4LDIxICs4MDcsMjYgQEAKIAkJbnZfZXJyb3IocHJpdiwgIkRBVEFfRVJST1IgIik7CiAJCW5vdXZlYXVfZW51bV9wcmludChudjUwX2RhdGFfZXJyb3JfbmFtZXMsIGVjb2RlKTsKIAkJcHJfY29udCgiXG4iKTsKKwkJc2hvd19iaXRmaWVsZCAmPSB+MHgwMDEwMDAwMDsKIAl9CiAKIAlpZiAoc3RhdCAmIDB4MDAyMDAwMDApIHsKIAkJaWYgKCFudjUwX2dyYXBoX3RyYXBfaGFuZGxlcihwcml2LCBzaG93LCBjaGlkLCAodTY0KWluc3QgPDwgMTIsCiAJCQkJZW5nY3R4KSkKIAkJCXNob3cgJj0gfjB4MDAyMDAwMDA7CisJCXNob3dfYml0ZmllbGQgJj0gfjB4MDAyMDAwMDA7CiAJfQogCiAJbnZfd3IzMihwcml2LCAweDQwMDEwMCwgc3RhdCk7CiAJbnZfd3IzMihwcml2LCAweDQwMDUwMCwgMHgwMDAxMDAwMSk7CiAKIAlpZiAoc2hvdykgewotCQludl9lcnJvcihwcml2LCAiJXMiLCAiIik7Ci0JCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnY1MF9ncmFwaF9pbnRyX25hbWUsIHNob3cpOwotCQlwcl9jb250KCJcbiIpOworCQlzaG93ICY9IHNob3dfYml0ZmllbGQ7CisJCWlmIChzaG93KSB7CisJCQludl9lcnJvcihwcml2LCAiJXMiLCAiIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfaW50cl9uYW1lLCBzaG93KTsKKwkJCXByX2NvbnQoIlxuIik7CisJCX0KIAkJbnZfZXJyb3IocHJpdiwKIAkJCSAiY2ggJWQgWzB4JTAxMGxseCAlc10gc3ViYyAlZCBjbGFzcyAweCUwNHggbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCiAJCQkgY2hpZCwgKHU2NClpbnN0IDw8IDEyLCBub3V2ZWF1X2NsaWVudF9uYW1lKGVuZ2N0eCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmMKaW5kZXggNWM4YTYzZC4uYTczYWIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252YzAuYwpAQCAtOTAxLDYgKzkwMSw5IEBACiAJCX0KIAogCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwlpZiAoIW9jbGFzcy0+ZmVjcy51Y29kZSkgeworCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKIAkvKiBsb2FkIEhVQiBtaWNyb2NvZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252YzAuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252YzAuaAppbmRleCBlYTE3YTgwLi5iMGFiNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZjMC5oCkBAIC0yMDUsNiArMjA1LDExIEBACiBleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmU0X2dyYXBoX2luaXRfdW5rW107CiBleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmU0X2dyYXBoX2luaXRfdW5rODh4eFtdOwogCitleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmYwX2dyYXBoX2luaXRfdW5rNDB4eFtdOworZXh0ZXJuIHN0cnVjdCBudmMwX2dyYXBoX2luaXQgbnZmMF9ncmFwaF9pbml0X3VuazcweHhbXTsKK2V4dGVybiBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0IG52ZjBfZ3JhcGhfaW5pdF91bms1Ynh4W107CitleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmYwX2dyYXBoX2luaXRfdHBjW107CisKIGludCAgbnZjMF9ncmN0eF9nZW5lcmF0ZShzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICopOwogdm9pZCBudmMwX2dyY3R4X2dlbmVyYXRlX21haW4oc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqLCBzdHJ1Y3QgbnZjMF9ncmN0eCAqKTsKIHZvaWQgbnZjMF9ncmN0eF9nZW5lcmF0ZV9tb2RzKHN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKiwgc3RydWN0IG52YzBfZ3JjdHggKik7CkBAIC0yNjYsNiArMjcxLDExIEBACiBleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmU0X2dyY3R4X2luaXRfdW5rOTB4eFtdOwogCiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmYwX2dyY3R4X29jbGFzczsKK2V4dGVybiBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0IG52ZjBfZ3JjdHhfaW5pdF91bms0NHh4W107CitleHRlcm4gc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmYwX2dyY3R4X2luaXRfdW5rNWJ4eFtdOworZXh0ZXJuIHN0cnVjdCBudmMwX2dyYXBoX2luaXQgbnZmMF9ncmN0eF9pbml0X3VuazYweHhbXTsKKworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYxMDhfZ3JjdHhfb2NsYXNzOwogCiAjZGVmaW5lIG1taW9fZGF0YShzLGEscCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWluZm8tPmJ1ZmZlcltpbmZvLT5idWZmZXJfbnJdID0gcm91bmRfdXAoaW5mby0+YWRkciwgKGEpKTsgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZmMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZmMC5jCmluZGV4IDJmMGFjNzguLmIxYWNiOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252ZjAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmYwLmMKQEAgLTQxLDcgKzQxLDcgQEAKICAqIFBHUkFQSCBlbmdpbmUvc3ViZGV2IGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBudmMwX2dyYXBoX2luaXQKK3N0cnVjdCBudmMwX2dyYXBoX2luaXQKIG52ZjBfZ3JhcGhfaW5pdF91bms0MHh4W10gPSB7CiAJeyAweDQwNDE1YywgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCiAJeyAweDQwNDE3MCwgICAxLCAweDA0LCAweDAwMDAwMDAwIH0sCkBAIC02MCw3ICs2MCw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CitzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CiBudmYwX2dyYXBoX2luaXRfdW5rNzB4eFtdID0gewogCXsgMHg0MDcwMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAogCXsgMHg0MDcwNDAsICAgMSwgMHgwNCwgMHg4MDQ0MDQyNCB9LApAQCAtNjgsNyArNjgsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorc3RydWN0IG52YzBfZ3JhcGhfaW5pdAogbnZmMF9ncmFwaF9pbml0X3VuazVieHhbXSA9IHsKIAl7IDB4NDA1YjQ0LCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKIAl7IDB4NDA1YjUwLCAgIDEsIDB4MDQsIDB4MDAwMDAwMDAgfSwKQEAgLTExNCw3ICsxMTQsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IG52YzBfZ3JhcGhfaW5pdAorc3RydWN0IG52YzBfZ3JhcGhfaW5pdAogbnZmMF9ncmFwaF9pbml0X3RwY1tdID0gewogCXsgMHg0MTlkMGMsICAgMSwgMHgwNCwgMHgwMDAwMDAwMCB9LAogCXsgMHg0MTlkMTAsICAgMSwgMHgwNCwgMHgwMDAwMDAxNCB9LApAQCAtMjQzLDYgKzI0Myw2IEBACiAJLmNjbGFzcyA9ICZudmYwX2dyY3R4X29jbGFzcywKIAkuc2NsYXNzID0gIG52ZjBfZ3JhcGhfc2NsYXNzLAogCS5tbWlvID0gbnZmMF9ncmFwaF9pbml0X21taW8sCi0JLmZlY3MudWNvZGUgPSAwID8gJm52ZjBfZ3JhcGhfZmVjc191Y29kZSA6IE5VTEwsCisJLmZlY3MudWNvZGUgPSAmbnZmMF9ncmFwaF9mZWNzX3Vjb2RlLAogCS5ncGNjcy51Y29kZSA9ICZudmYwX2dyYXBoX2dwY2NzX3Vjb2RlLAogfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvY2xhc3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9jb3JlL2NsYXNzLmgKaW5kZXggNTYwYzM1OS4uZTcxYTQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvY2xhc3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvY29yZS9jbGFzcy5oCkBAIC0yMzAsOSArMjMwLDI2IEBACiAKICNkZWZpbmUgTlYwNF9ESVNQX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDYKIAorI2RlZmluZSBOVjA0X0RJU1BfTVRIRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjA0X0RJU1BfTVRIRF9IRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIE5WMDRfRElTUF9TQ0FOT1VUUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisKIHN0cnVjdCBudjA0X2Rpc3BsYXlfY2xhc3MgewogfTsKIAorc3RydWN0IG52MDRfZGlzcGxheV9zY2Fub3V0cG9zIHsKKwlzNjQgdGltZVsyXTsKKwl1MzIgdmJsYW5rczsKKwl1MzIgdmJsYW5rZTsKKwl1MzIgdnRvdGFsOworCXUzMiB2bGluZTsKKwl1MzIgaGJsYW5rczsKKwl1MzIgaGJsYW5rZTsKKwl1MzIgaHRvdGFsOworCXUzMiBobGluZTsKK307CisKIC8qIDUwNzA6IE5WNTBfRElTUAogICogODI3MDogTlY4NF9ESVNQCiAgKiA4MzcwOiBOVkEwX0RJU1AKQEAgLTI1Miw2ICsyNjksMTEgQEAKICNkZWZpbmUgTlZFMF9ESVNQX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkxNzAKICNkZWZpbmUgTlZGMF9ESVNQX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkyNzAKIAorI2RlZmluZSBOVjUwX0RJU1BfTVRIRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0RJU1BfTVRIRF9IRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCisjZGVmaW5lIE5WNTBfRElTUF9TQ0FOT1VUUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisKICNkZWZpbmUgTlY1MF9ESVNQX1NPUl9NVEhEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKICNkZWZpbmUgTlY1MF9ESVNQX1NPUl9NVEhEX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGYwMDAKICNkZWZpbmUgTlY1MF9ESVNQX1NPUl9NVEhEX0hFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9jb3JlL2RldmljZS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvZGV2aWNlLmgKaW5kZXggYWMyODgxZC4uN2I4ZWEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvZGV2aWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvZGV2aWNlLmgKQEAgLTM4LDcgKzM4LDggQEAKIAlOVkRFVl9TVUJERVZfVEhFUk0sCiAJTlZERVZfU1VCREVWX0NMT0NLLAogCi0JTlZERVZfRU5HSU5FX0RNQU9CSiwKKwlOVkRFVl9FTkdJTkVfRklSU1QsCisJTlZERVZfRU5HSU5FX0RNQU9CSiA9IE5WREVWX0VOR0lORV9GSVJTVCwKIAlOVkRFVl9FTkdJTkVfRklGTywKIAlOVkRFVl9FTkdJTkVfU1csCiAJTlZERVZfRU5HSU5FX0dSLApAQCAtNzAsNiArNzEsNyBAQAogCWNvbnN0IGNoYXIgKmRiZ29wdDsKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKmNuYW1lOworCXU2NCBkaXNhYmxlX21hc2s7CiAKIAllbnVtIHsKIAkJTlZfMDQgICAgPSAweDA0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9maWZvLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2ZpZm8uaAppbmRleCA4YzMyY2Y0Li4yNmI2YjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2ZpZm8uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2ZpZm8uaApAQCAtMTA5LDYgKzEwOSw3IEBACiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjg0X2ZpZm9fb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZjMF9maWZvX29jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZTBfZmlmb19vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjEwOF9maWZvX29jbGFzczsKIAogdm9pZCBudjA0X2ZpZm9faW50cihzdHJ1Y3Qgbm91dmVhdV9zdWJkZXYgKik7CiBpbnQgIG52MDRfZmlmb19jb250ZXh0X2F0dGFjaChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9ncmFwaC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9ncmFwaC5oCmluZGV4IDhlMWI1MjMuLjk3NzA1NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9lbmdpbmUvZ3JhcGguaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2dyYXBoLmgKQEAgLTY5LDYgKzY5LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZDlfZ3JhcGhfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZlNF9ncmFwaF9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmYwX2dyYXBoX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52MTA4X2dyYXBoX29jbGFzczsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52MDRfZ3JhcGhfbnNvdXJjZVtdOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29mdW5jcyBudjA0X2dyYXBoX29mdW5jczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmFyLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jhci5oCmluZGV4IDRmNGZmNDUuLjlmYWE5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmFyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9iYXIuaApAQCAtNCw4ICs0LDcgQEAKICNpbmNsdWRlIDxjb3JlL3N1YmRldi5oPgogI2luY2x1ZGUgPGNvcmUvZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxzdWJkZXYvZmIuaD4KLQorc3RydWN0IG5vdXZlYXVfbWVtOwogc3RydWN0IG5vdXZlYXVfdm1hOwogCiBzdHJ1Y3Qgbm91dmVhdV9iYXIgewpAQCAtMjksMjcgKzI4LDcgQEAKIAlyZXR1cm4gKHZvaWQgKiludl9kZXZpY2Uob2JqKS0+c3ViZGV2W05WREVWX1NVQkRFVl9CQVJdOwogfQogCi0jZGVmaW5lIG5vdXZlYXVfYmFyX2NyZWF0ZShwLGUsbyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfYmFyX2NyZWF0ZV8oKHApLCAoZSksIChvKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCi0jZGVmaW5lIG5vdXZlYXVfYmFyX2luaXQocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfc3ViZGV2X2luaXQoJihwKS0+YmFzZSkKLSNkZWZpbmUgbm91dmVhdV9iYXJfZmluaShwLHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9zdWJkZXZfZmluaSgmKHApLT5iYXNlLCAocykpCi0KLWludCBub3V2ZWF1X2Jhcl9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKLQkJCXN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCBpbnQsIHZvaWQgKiopOwotdm9pZCBub3V2ZWF1X2Jhcl9kZXN0cm95KHN0cnVjdCBub3V2ZWF1X2JhciAqKTsKLQotdm9pZCBfbm91dmVhdV9iYXJfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci0jZGVmaW5lIF9ub3V2ZWF1X2Jhcl9pbml0IF9ub3V2ZWF1X3N1YmRldl9pbml0Ci0jZGVmaW5lIF9ub3V2ZWF1X2Jhcl9maW5pIF9ub3V2ZWF1X3N1YmRldl9maW5pCi0KIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnY1MF9iYXJfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudmMwX2Jhcl9vY2xhc3M7CiAKLWludCBub3V2ZWF1X2Jhcl9hbGxvYyhzdHJ1Y3Qgbm91dmVhdV9iYXIgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCi0JCSAgICAgIHN0cnVjdCBub3V2ZWF1X21lbSAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiopOwotCi12b2lkIG52ODRfYmFyX2ZsdXNoKHN0cnVjdCBub3V2ZWF1X2JhciAqKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvcmFtY2ZnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvcmFtY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlNmQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9yYW1jZmcuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9fTlZCSU9TX1JBTUNGR19IX18KKyNkZWZpbmUgX19OVkJJT1NfUkFNQ0ZHX0hfXworCitzdHJ1Y3Qgbm91dmVhdV9iaW9zOworCitzdHJ1Y3QgbnZiaW9zX3JhbWNmZyB7CisJdW5zaWduZWQgcmFtbWFwXzExXzA4XzAxOjE7CisJdW5zaWduZWQgcmFtbWFwXzExXzA4XzBjOjI7CisJdW5zaWduZWQgcmFtbWFwXzExXzA4XzEwOjE7CisJdW5zaWduZWQgcmFtbWFwXzExXzExXzBjOjI7CisKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMDE6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMDI6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMDQ6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMDg6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMTA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfMjA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfNDA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDFfODA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfMDM6MjsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfMDQ6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfMDg6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfMTA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfNDA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDJfODA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDNfMGY6NDsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDNfMzA6MjsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDNfYzA6MjsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDNfZjA6NDsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDQ6ODsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDY6ODsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfMDI6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfMDQ6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfMDg6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfMTA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfNDA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDdfODA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMDE6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMDI6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMDQ6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMDg6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMTA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDhfMjA6MTsKKwl1bnNpZ25lZCByYW1jZmdfMTFfMDk6ODsKKworCXVuc2lnbmVkIHRpbWluZ1sxMV07CisJdW5zaWduZWQgdGltaW5nXzIwXzJlXzAzOjI7CisJdW5zaWduZWQgdGltaW5nXzIwXzJlXzMwOjI7CisJdW5zaWduZWQgdGltaW5nXzIwXzJlX2MwOjI7CisJdW5zaWduZWQgdGltaW5nXzIwXzJmXzAzOjI7CisJdW5zaWduZWQgdGltaW5nXzIwXzJjXzAwM2Y6NjsKKwl1bnNpZ25lZCB0aW1pbmdfMjBfMmNfMWZjMDo3OworCXVuc2lnbmVkIHRpbWluZ18yMF8zMF9mODo1OworCXVuc2lnbmVkIHRpbWluZ18yMF8zMF8wNzozOworCXVuc2lnbmVkIHRpbWluZ18yMF8zMV8wMDA3OjM7CisJdW5zaWduZWQgdGltaW5nXzIwXzMxXzAwNzg6NDsKKwl1bnNpZ25lZCB0aW1pbmdfMjBfMzFfMDc4MDo0OworCXVuc2lnbmVkIHRpbWluZ18yMF8zMV8wODAwOjE7CisJdW5zaWduZWQgdGltaW5nXzIwXzMxXzcwMDA6MzsKKwl1bnNpZ25lZCB0aW1pbmdfMjBfMzFfODAwMDoxOworfTsKKwordTggbnZiaW9zX3JhbWNmZ19jb3VudChzdHJ1Y3Qgbm91dmVhdV9iaW9zICopOwordTggbnZiaW9zX3JhbWNmZ19pbmRleChzdHJ1Y3Qgbm91dmVhdV9iaW9zICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9yYW1tYXAuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9yYW1tYXAuaAppbmRleCBiYzE1ZTAzLi41YmRmOGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvcmFtbWFwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9iaW9zL3JhbW1hcC5oCkBAIC0xLDExICsxLDI1IEBACiAjaWZuZGVmIF9fTlZCSU9TX1JBTU1BUF9IX18KICNkZWZpbmUgX19OVkJJT1NfUkFNTUFQX0hfXwogCi11MTYgbnZiaW9zX3JhbW1hcF90YWJsZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosIHU4ICp2ZXIsIHU4ICpoZHIsCi0JCQl1OCAqY250LCB1OCAqbGVuLCB1OCAqc25yLCB1OCAqc3N6KTsKLXUxNiBudmJpb3NfcmFtbWFwX2VudHJ5KHN0cnVjdCBub3V2ZWF1X2Jpb3MgKiwgaW50IGlkeCwKLQkJCXU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4pOwotdTE2IG52Ymlvc19yYW1tYXBfbWF0Y2goc3RydWN0IG5vdXZlYXVfYmlvcyAqLCB1MTYga2h6LAotCQkJdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbik7CitzdHJ1Y3QgbnZiaW9zX3JhbWNmZzsKKwordTMyIG52Ymlvc19yYW1tYXBUZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosIHU4ICp2ZXIsIHU4ICpoZHIsCisJCSAgICB1OCAqY250LCB1OCAqbGVuLCB1OCAqc25yLCB1OCAqc3N6KTsKKwordTMyIG52Ymlvc19yYW1tYXBFZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosIGludCBpZHgsCisJCSAgICB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKTsKK3UzMiBudmJpb3NfcmFtbWFwRW0oc3RydWN0IG5vdXZlYXVfYmlvcyAqLCB1MTYgbWh6LAorCQkgICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbik7Cit1MzIgbnZiaW9zX3JhbW1hcEVwKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKiwgdTE2IG1oeiwKKwkJICAgIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4sCisJCSAgICBzdHJ1Y3QgbnZiaW9zX3JhbWNmZyAqKTsKKwordTMyIG52Ymlvc19yYW1tYXBTZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosIHUzMiBkYXRhLAorCQkgICAgdTggZXZlciwgdTggZWhkciwgdTggZWNudCwgdTggZWxlbiwgaW50IGlkeCwKKwkJICAgIHU4ICp2ZXIsIHU4ICpoZHIpOwordTMyIG52Ymlvc19yYW1tYXBTcChzdHJ1Y3Qgbm91dmVhdV9iaW9zICosIHUzMiBkYXRhLAorCQkgICAgdTggZXZlciwgdTggZWhkciwgdTggZWNudCwgdTggZWxlbiwgaW50IGlkeCwKKwkJICAgIHU4ICp2ZXIsIHU4ICpoZHIsCisJCSAgICBzdHJ1Y3QgbnZiaW9zX3JhbWNmZyAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvdGltaW5nLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvdGltaW5nLmgKaW5kZXggOTYzNjk0Yi4uNzZkOTE0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9iaW9zL3RpbWluZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy90aW1pbmcuaApAQCAtMSw4ICsxLDE0IEBACiAjaWZuZGVmIF9fTlZCSU9TX1RJTUlOR19IX18KICNkZWZpbmUgX19OVkJJT1NfVElNSU5HX0hfXwogCi11MTYgbnZiaW9zX3RpbWluZ190YWJsZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosCi0JCQl1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKTsKLXUxNiBudmJpb3NfdGltaW5nX2VudHJ5KHN0cnVjdCBub3V2ZWF1X2Jpb3MgKiwgaW50IGlkeCwgdTggKnZlciwgdTggKmhkcik7CitzdHJ1Y3QgbnZiaW9zX3JhbWNmZzsKKwordTE2IG52Ymlvc190aW1pbmdUZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICosCisJCSAgICB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuLCB1OCAqc25yLCB1OCAqc3N6KTsKK3UxNiBudmJpb3NfdGltaW5nRWUoc3RydWN0IG5vdXZlYXVfYmlvcyAqLCBpbnQgaWR4LAorCQkgICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbik7Cit1MTYgbnZiaW9zX3RpbWluZ0VwKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKiwgaW50IGlkeCwKKwkJICAgIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4sCisJCSAgICBzdHJ1Y3QgbnZiaW9zX3JhbWNmZyAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2RldmluaXQuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZGV2aW5pdC5oCmluZGV4IDY4NWM5YjEuLmVkMWFjNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZGV2aW5pdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZGV2aW5pdC5oCkBAIC05LDcgKzksNiBAQAogCWJvb2wgcG9zdDsKIAl2b2lkICgqbWVtaW5pdCkoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqKTsKIAlpbnQgICgqcGxsX3NldCkoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqLCB1MzIgdHlwZSwgdTMyIGZyZXEpOwotCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKgpAQCAtMTgsMzIgKzE3LDE2IEBACiAJcmV0dXJuICh2b2lkICopbnZfZGV2aWNlKG9iaiktPnN1YmRldltOVkRFVl9TVUJERVZfREVWSU5JVF07CiB9CiAKLSNkZWZpbmUgbm91dmVhdV9kZXZpbml0X2NyZWF0ZShwLGUsbyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9kZXZpbml0X2NyZWF0ZV8oKHApLCAoZSksIChvKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCi0jZGVmaW5lIG5vdXZlYXVfZGV2aW5pdF9kZXN0cm95KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfc3ViZGV2X2Rlc3Ryb3koJihwKS0+YmFzZSkKLSNkZWZpbmUgbm91dmVhdV9kZXZpbml0X2luaXQocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZCA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX25vdXZlYXVfZGV2aW5pdF9pbml0KG52X29iamVjdChkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19KQotI2RlZmluZSBub3V2ZWF1X2RldmluaXRfZmluaShwLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfbm91dmVhdV9kZXZpbml0X2ZpbmkobnZfb2JqZWN0KGQpLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0KLWludCBub3V2ZWF1X2RldmluaXRfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCi0JCQkgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIGludCwgdm9pZCAqKik7Ci0jZGVmaW5lIF9ub3V2ZWF1X2RldmluaXRfZHRvciBfbm91dmVhdV9zdWJkZXZfZHRvcgotaW50IF9ub3V2ZWF1X2RldmluaXRfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci1pbnQgX25vdXZlYXVfZGV2aW5pdF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sIHN1c3BlbmQpOwotCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MDRfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MDVfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MTBfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MWFfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MjBfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52NTBfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52YTNfZGV2aW5pdF9vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52YzBfZGV2aW5pdF9vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjA0X2RldmluaXRfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYwNV9kZXZpbml0X29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52MTBfZGV2aW5pdF9vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjFhX2RldmluaXRfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYyMF9kZXZpbml0X29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NTBfZGV2aW5pdF9vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjg0X2RldmluaXRfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnY5OF9kZXZpbml0X29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52YTNfZGV2aW5pdF9vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmFmX2RldmluaXRfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZjMF9kZXZpbml0X29jbGFzczsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2ZiLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2ZiLmgKaW5kZXggZDg5ZGJkZi4uZDdlY2FmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9mYi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZmIuaApAQCAtMTA2LDYgKzEwNiwxMyBAQAogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZjMF9mYl9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmUwX2ZiX29jbGFzczsKIAorI2luY2x1ZGUgPHN1YmRldi9iaW9zL3JhbWNmZy5oPgorCitzdHJ1Y3Qgbm91dmVhdV9yYW1fZGF0YSB7CisJc3RydWN0IG52Ymlvc19yYW1jZmcgYmlvczsKKwl1MzIgZnJlcTsKK307CisKIHN0cnVjdCBub3V2ZWF1X3JhbSB7CiAJc3RydWN0IG5vdXZlYXVfb2JqZWN0IGJhc2U7CiAJZW51bSB7CkBAIC0xNDIsNiArMTQ5LDEyIEBACiAJfSByYW1tYXAsIHJhbWNmZywgdGltaW5nOwogCXUzMiBmcmVxOwogCXUzMiBtclsxNl07CisJdTMyIG1yMV9udXRzOworCisJc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgKm5leHQ7CisJc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgZm9ybWVyOworCXN0cnVjdCBub3V2ZWF1X3JhbV9kYXRhIHhpdGlvbjsKKwlzdHJ1Y3Qgbm91dmVhdV9yYW1fZGF0YSB0YXJnZXQ7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvaW5zdG1lbS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pbnN0bWVtLmgKaW5kZXggNGFjYTMzOC4uYzFkZjI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pbnN0bWVtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pbnN0bWVtLmgKQEAgLTIzLDIxICsyMyw2IEBACiAJcmV0dXJuIG9iajsKIH0KIAotI2RlZmluZSBub3V2ZWF1X2luc3RvYmpfY3JlYXRlKHAsZSxvLGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlub3V2ZWF1X2luc3RvYmpfY3JlYXRlXygocCksIChlKSwgKG8pLCBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKLSNkZWZpbmUgbm91dmVhdV9pbnN0b2JqX2luaXQocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9vYmplY3RfaW5pdCgmKHApLT5iYXNlKQotI2RlZmluZSBub3V2ZWF1X2luc3RvYmpfZmluaShwLHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlub3V2ZWF1X29iamVjdF9maW5pKCYocCktPmJhc2UsIChzKSkKLQotaW50ICBub3V2ZWF1X2luc3RvYmpfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCi0JCQkgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCBpbnQsIHZvaWQgKiopOwotdm9pZCBub3V2ZWF1X2luc3RvYmpfZGVzdHJveShzdHJ1Y3Qgbm91dmVhdV9pbnN0b2JqICopOwotCi12b2lkIF9ub3V2ZWF1X2luc3RvYmpfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci0jZGVmaW5lIF9ub3V2ZWF1X2luc3RvYmpfaW5pdCBub3V2ZWF1X29iamVjdF9pbml0Ci0jZGVmaW5lIF9ub3V2ZWF1X2luc3RvYmpfZmluaSBub3V2ZWF1X29iamVjdF9maW5pCi0KIHN0cnVjdCBub3V2ZWF1X2luc3RtZW0gewogCXN0cnVjdCBub3V2ZWF1X3N1YmRldiBiYXNlOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTYwLDIxICs0NSw4IEBACiAJcmV0dXJuICh2b2lkICopbnZfZGV2aWNlKG9iaiktPnN1YmRldltOVkRFVl9TVUJERVZfSU5TVE1FTV07CiB9CiAKLSNkZWZpbmUgbm91dmVhdV9pbnN0bWVtX2NyZWF0ZShwLGUsbyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9pbnN0bWVtX2NyZWF0ZV8oKHApLCAoZSksIChvKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCi0jZGVmaW5lIG5vdXZlYXVfaW5zdG1lbV9kZXN0cm95KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfc3ViZGV2X2Rlc3Ryb3koJihwKS0+YmFzZSkKLWludCBub3V2ZWF1X2luc3RtZW1fY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCi0JCQkgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIGludCwgdm9pZCAqKik7Ci1pbnQgbm91dmVhdV9pbnN0bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfaW5zdG1lbSAqKTsKLWludCBub3V2ZWF1X2luc3RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICosIGJvb2wpOwotCi0jZGVmaW5lIF9ub3V2ZWF1X2luc3RtZW1fZHRvciBfbm91dmVhdV9zdWJkZXZfZHRvcgotaW50IF9ub3V2ZWF1X2luc3RtZW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci1pbnQgX25vdXZlYXVfaW5zdG1lbV9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKLQotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjA0X2luc3RtZW1fb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjQwX2luc3RtZW1fb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjUwX2luc3RtZW1fb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYwNF9pbnN0bWVtX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NDBfaW5zdG1lbV9vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjUwX2luc3RtZW1fb2NsYXNzOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvdm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvdm0uaAppbmRleCBmY2Y1N2ZhLi5jOTUwOTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L3ZtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi92bS5oCkBAIC0xMzEsOSArMTMxLDUgQEAKIHZvaWQgbm91dmVhdV92bV9tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICosIHU2NCBvZmZzZXQsIHN0cnVjdCBub3V2ZWF1X21lbSAqKTsKIHZvaWQgbm91dmVhdV92bV91bm1hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKik7CiB2b2lkIG5vdXZlYXVfdm1fdW5tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICosIHU2NCBvZmZzZXQsIHU2NCBsZW5ndGgpOwotdm9pZCBub3V2ZWF1X3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCwKLQkJICAgICAgIHN0cnVjdCBub3V2ZWF1X21lbSAqKTsKLXZvaWQgbm91dmVhdV92bV9tYXBfc2dfdGFibGUoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHU2NCBkZWx0YSwgdTY0IGxlbmd0aCwKLQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9tZW0gKm1lbSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9iYXNlLmMKaW5kZXggZDcwYmEzNC4uNzA5OGRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvYmFzZS5jCkBAIC0yMyw3ICsyMywxMSBAQAogICovCiAKICNpbmNsdWRlIDxjb3JlL29iamVjdC5oPgotI2luY2x1ZGUgPHN1YmRldi9iYXIuaD4KKworI2luY2x1ZGUgPHN1YmRldi9mYi5oPgorI2luY2x1ZGUgPHN1YmRldi92bS5oPgorCisjaW5jbHVkZSAicHJpdi5oIgogCiBzdHJ1Y3Qgbm91dmVhdV9iYXJvYmogewogCXN0cnVjdCBub3V2ZWF1X29iamVjdCBiYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9udjUwLmMKaW5kZXggMTYwZDI3Zi4uMDkwZDU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvbnY1MC5jCkBAIC0yNSwxMCArMjUsMTEgQEAKICNpbmNsdWRlIDxjb3JlL2dwdW9iai5oPgogCiAjaW5jbHVkZSA8c3ViZGV2L3RpbWVyLmg+Ci0jaW5jbHVkZSA8c3ViZGV2L2Jhci5oPgogI2luY2x1ZGUgPHN1YmRldi9mYi5oPgogI2luY2x1ZGUgPHN1YmRldi92bS5oPgogCisjaW5jbHVkZSAicHJpdi5oIgorCiBzdHJ1Y3QgbnY1MF9iYXJfcHJpdiB7CiAJc3RydWN0IG5vdXZlYXVfYmFyIGJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL252YzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9udmMwLmMKaW5kZXggYjJlYzc0MS4uYmFjNWU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL252YzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvbnZjMC5jCkBAIC0yNSwxMCArMjUsMTEgQEAKICNpbmNsdWRlIDxjb3JlL2dwdW9iai5oPgogCiAjaW5jbHVkZSA8c3ViZGV2L3RpbWVyLmg+Ci0jaW5jbHVkZSA8c3ViZGV2L2Jhci5oPgogI2luY2x1ZGUgPHN1YmRldi9mYi5oPgogI2luY2x1ZGUgPHN1YmRldi92bS5oPgogCisjaW5jbHVkZSAicHJpdi5oIgorCiBzdHJ1Y3QgbnZjMF9iYXJfcHJpdiB7CiAJc3RydWN0IG5vdXZlYXVfYmFyIGJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL3ByaXYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhZDhmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9wcml2LmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfX05WS01fQkFSX1BSSVZfSF9fCisjZGVmaW5lIF9fTlZLTV9CQVJfUFJJVl9IX18KKworI2luY2x1ZGUgPHN1YmRldi9iYXIuaD4KKworI2RlZmluZSBub3V2ZWF1X2Jhcl9jcmVhdGUocCxlLG8sZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X2Jhcl9jcmVhdGVfKChwKSwgKGUpLCAobyksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQorI2RlZmluZSBub3V2ZWF1X2Jhcl9pbml0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X3N1YmRldl9pbml0KCYocCktPmJhc2UpCisjZGVmaW5lIG5vdXZlYXVfYmFyX2ZpbmkocCxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfc3ViZGV2X2ZpbmkoJihwKS0+YmFzZSwgKHMpKQorCitpbnQgbm91dmVhdV9iYXJfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCisJCQlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50LCB2b2lkICoqKTsKK3ZvaWQgbm91dmVhdV9iYXJfZGVzdHJveShzdHJ1Y3Qgbm91dmVhdV9iYXIgKik7CisKK3ZvaWQgX25vdXZlYXVfYmFyX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworI2RlZmluZSBfbm91dmVhdV9iYXJfaW5pdCBfbm91dmVhdV9zdWJkZXZfaW5pdAorI2RlZmluZSBfbm91dmVhdV9iYXJfZmluaSBfbm91dmVhdV9zdWJkZXZfZmluaQorCitpbnQgIG5vdXZlYXVfYmFyX2FsbG9jKHN0cnVjdCBub3V2ZWF1X2JhciAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X21lbSAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiopOworCit2b2lkIG52ODRfYmFyX2ZsdXNoKHN0cnVjdCBub3V2ZWF1X2JhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2luaXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvaW5pdC5jCmluZGV4IGRmMWIxYjQuLmRlMjAxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvaW5pdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvaW5pdC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2RwLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZ3Bpby5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2luaXQuaD4KKyNpbmNsdWRlIDxzdWJkZXYvYmlvcy9yYW1jZmcuaD4KICNpbmNsdWRlIDxzdWJkZXYvZGV2aW5pdC5oPgogI2luY2x1ZGUgPHN1YmRldi9pMmMuaD4KICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CkBAIC0zOTEsNDMgKzM5MiwxNCBAQAogCXJldHVybiAweDAwMDA7CiB9CiAKLXN0YXRpYyB1MTYKLWluaXRfcmFtX3Jlc3RyaWN0X3RhYmxlKHN0cnVjdCBudmJpb3NfaW5pdCAqaW5pdCkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gaW5pdC0+YmlvczsKLQlzdHJ1Y3QgYml0X2VudHJ5IGJpdF9NOwotCXUxNiBkYXRhID0gMHgwMDAwOwotCi0JaWYgKCFiaXRfZW50cnkoYmlvcywgJ00nLCAmYml0X00pKSB7Ci0JCWlmIChiaXRfTS52ZXJzaW9uID09IDEgJiYgYml0X00ubGVuZ3RoID49IDUpCi0JCQlkYXRhID0gbnZfcm8xNihiaW9zLCBiaXRfTS5vZmZzZXQgKyAzKTsKLQkJaWYgKGJpdF9NLnZlcnNpb24gPT0gMiAmJiBiaXRfTS5sZW5ndGggPj0gMykKLQkJCWRhdGEgPSBudl9ybzE2KGJpb3MsIGJpdF9NLm9mZnNldCArIDEpOwotCX0KLQotCWlmIChkYXRhID09IDB4MDAwMCkKLQkJd2FybigicmFtIHJlc3RyaWN0IHRhYmxlIG5vdCBmb3VuZFxuIik7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KIHN0YXRpYyB1OAogaW5pdF9yYW1fcmVzdHJpY3RfZ3JvdXBfY291bnQoc3RydWN0IG52Ymlvc19pbml0ICppbml0KQogewotCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBpbml0LT5iaW9zOwotCXN0cnVjdCBiaXRfZW50cnkgYml0X007Ci0KLQlpZiAoIWJpdF9lbnRyeShiaW9zLCAnTScsICZiaXRfTSkpIHsKLQkJaWYgKGJpdF9NLnZlcnNpb24gPT0gMSAmJiBiaXRfTS5sZW5ndGggPj0gNSkKLQkJCXJldHVybiBudl9ybzA4KGJpb3MsIGJpdF9NLm9mZnNldCArIDIpOwotCQlpZiAoYml0X00udmVyc2lvbiA9PSAyICYmIGJpdF9NLmxlbmd0aCA+PSAzKQotCQkJcmV0dXJuIG52X3JvMDgoYmlvcywgYml0X00ub2Zmc2V0ICsgMCk7Ci0JfQotCi0JcmV0dXJuIDB4MDA7CisJcmV0dXJuIG52Ymlvc19yYW1jZmdfY291bnQoaW5pdC0+Ymlvcyk7CiB9CiAKIHN0YXRpYyB1OAotaW5pdF9yYW1fcmVzdHJpY3Rfc3RyYXAoc3RydWN0IG52Ymlvc19pbml0ICppbml0KQoraW5pdF9yYW1fcmVzdHJpY3Qoc3RydWN0IG52Ymlvc19pbml0ICppbml0KQogewogCS8qIFRoaXMgYXBwZWFycyB0byBiZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBWQklPUyBwYXJzZXIsIGFuZCAqaXMqCiAJICogaW1wb3J0YW50IHRvIGNhY2hlIHRoZSBOVl9QRVhUREVWX0JPT1QwIG9uIGxhdGVyIGNoaXBzZXRzIHRvCkBAIC00MzgsMTggKzQxMCw4IEBACiAJICogaW4gY2FzZSAqbm90KiByZS1yZWFkaW5nIHRoZSBzdHJhcCBjYXVzZXMgc2ltaWxhciBicmVha2FnZS4KIAkgKi8KIAlpZiAoIWluaXQtPnJhbWNmZyB8fCBpbml0LT5iaW9zLT52ZXJzaW9uLm1ham9yIDwgMHg3MCkKLQkJaW5pdC0+cmFtY2ZnID0gaW5pdF9yZDMyKGluaXQsIDB4MTAxMDAwKTsKLQlyZXR1cm4gKGluaXQtPnJhbWNmZyAmIDB4MDAwMDAwMDNjKSA+PiAyOwotfQotCi1zdGF0aWMgdTgKLWluaXRfcmFtX3Jlc3RyaWN0KHN0cnVjdCBudmJpb3NfaW5pdCAqaW5pdCkKLXsKLQl1OCAgc3RyYXAgPSBpbml0X3JhbV9yZXN0cmljdF9zdHJhcChpbml0KTsKLQl1MTYgdGFibGUgPSBpbml0X3JhbV9yZXN0cmljdF90YWJsZShpbml0KTsKLQlpZiAodGFibGUpCi0JCXJldHVybiBudl9ybzA4KGluaXQtPmJpb3MsIHRhYmxlICsgc3RyYXApOwotCXJldHVybiAweDAwOworCQlpbml0LT5yYW1jZmcgPSAweDgwMDAwMDAwIHwgbnZiaW9zX3JhbWNmZ19pbmRleChpbml0LT5iaW9zKTsKKwlyZXR1cm4gKGluaXQtPnJhbWNmZyAmIDB4N2ZmZmZmZmYpOwogfQogCiBzdGF0aWMgdTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvcmFtY2ZnLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL3JhbWNmZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWFlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL3JhbWNmZy5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzIDxic2tlZ2dzQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CisjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvYml0Lmg+CisjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvcmFtY2ZnLmg+CisKK3N0YXRpYyB1OAorbnZiaW9zX3JhbWNmZ19zdHJhcChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zKQoreworCXJldHVybiAobnZfcmQzMihiaW9zLCAweDEwMTAwMCkgJiAweDAwMDAwMDNjKSA+PiAyOworfQorCit1OAorbnZiaW9zX3JhbWNmZ19jb3VudChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zKQoreworCXN0cnVjdCBiaXRfZW50cnkgYml0X007CisKKwlpZiAoIWJpdF9lbnRyeShiaW9zLCAnTScsICZiaXRfTSkpIHsKKwkJaWYgKGJpdF9NLnZlcnNpb24gPT0gMSAmJiBiaXRfTS5sZW5ndGggPj0gNSkKKwkJCXJldHVybiBudl9ybzA4KGJpb3MsIGJpdF9NLm9mZnNldCArIDIpOworCQlpZiAoYml0X00udmVyc2lvbiA9PSAyICYmIGJpdF9NLmxlbmd0aCA+PSAzKQorCQkJcmV0dXJuIG52X3JvMDgoYmlvcywgYml0X00ub2Zmc2V0ICsgMCk7CisJfQorCisJcmV0dXJuIDB4MDA7Cit9CisKK3U4CitudmJpb3NfcmFtY2ZnX2luZGV4KHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MpCit7CisJdTggc3RyYXAgPSBudmJpb3NfcmFtY2ZnX3N0cmFwKGJpb3MpOworCXUzMiB4bGF0ID0gMHgwMDAwMDAwMDsKKwlzdHJ1Y3QgYml0X2VudHJ5IGJpdF9NOworCisJaWYgKCFiaXRfZW50cnkoYmlvcywgJ00nLCAmYml0X00pKSB7CisJCWlmIChiaXRfTS52ZXJzaW9uID09IDEgJiYgYml0X00ubGVuZ3RoID49IDUpCisJCQl4bGF0ID0gbnZfcm8xNihiaW9zLCBiaXRfTS5vZmZzZXQgKyAzKTsKKwkJaWYgKGJpdF9NLnZlcnNpb24gPT0gMiAmJiBiaXRfTS5sZW5ndGggPj0gMykKKwkJCXhsYXQgPSBudl9ybzE2KGJpb3MsIGJpdF9NLm9mZnNldCArIDEpOworCX0KKworCWlmICh4bGF0KQorCQlzdHJhcCA9IG52X3JvMDgoYmlvcywgeGxhdCArIHN0cmFwKTsKKwlyZXR1cm4gc3RyYXA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL3JhbW1hcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9yYW1tYXAuYwppbmRleCA5MTZmYTlkLi4xODExYjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL3JhbW1hcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvcmFtbWFwLmMKQEAgLTI0LDExICsyNCwxMiBAQAogCiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9iaXQuaD4KKyNpbmNsdWRlIDxzdWJkZXYvYmlvcy9yYW1jZmcuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9yYW1tYXAuaD4KIAotdTE2Ci1udmJpb3NfcmFtbWFwX3RhYmxlKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHU4ICp2ZXIsIHU4ICpoZHIsCi0JCSAgICB1OCAqY250LCB1OCAqbGVuLCB1OCAqc25yLCB1OCAqc3N6KQordTMyCitudmJpb3NfcmFtbWFwVGUoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgdTggKnZlciwgdTggKmhkciwKKwkJdTggKmNudCwgdTggKmxlbiwgdTggKnNuciwgdTggKnNzeikKIHsKIAlzdHJ1Y3QgYml0X2VudHJ5IGJpdF9QOwogCXUxNiByYW1tYXAgPSAweDAwMDA7CkBAIC01NywxMiArNTgsMTIgQEAKIAlyZXR1cm4gMHgwMDAwOwogfQogCi11MTYKLW52Ymlvc19yYW1tYXBfZW50cnkoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgaW50IGlkeCwKLQkJICAgIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4pCit1MzIKK252Ymlvc19yYW1tYXBFZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCBpbnQgaWR4LAorCQl1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKQogewogCXU4ICBzbnIsIHNzejsKLQl1MTYgcmFtbWFwID0gbnZiaW9zX3JhbW1hcF90YWJsZShiaW9zLCB2ZXIsIGhkciwgY250LCBsZW4sICZzbnIsICZzc3opOworCXUxNiByYW1tYXAgPSBudmJpb3NfcmFtbWFwVGUoYmlvcywgdmVyLCBoZHIsIGNudCwgbGVuLCAmc25yLCAmc3N6KTsKIAlpZiAocmFtbWFwICYmIGlkeCA8ICpjbnQpIHsKIAkJcmFtbWFwID0gcmFtbWFwICsgKmhkciArIChpZHggKiAoKmxlbiArIChzbnIgKiBzc3opKSk7CiAJCSpoZHIgPSAqbGVuOwpAQCAtNzMsMTYgKzc0LDEwMCBAQAogCXJldHVybiAweDAwMDA7CiB9CiAKLXUxNgotbnZiaW9zX3JhbW1hcF9tYXRjaChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1MTYga2h6LAotCQkgICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbikKK3UzMgorbnZiaW9zX3JhbW1hcEVtKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHUxNiBraHosCisJCXU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4pCiB7CiAJaW50IGlkeCA9IDA7CiAJdTMyIGRhdGE7Ci0Jd2hpbGUgKChkYXRhID0gbnZiaW9zX3JhbW1hcF9lbnRyeShiaW9zLCBpZHgrKywgdmVyLCBoZHIsIGNudCwgbGVuKSkpIHsKKwl3aGlsZSAoKGRhdGEgPSBudmJpb3NfcmFtbWFwRWUoYmlvcywgaWR4KyssIHZlciwgaGRyLCBjbnQsIGxlbikpKSB7CiAJCWlmIChraHogPj0gbnZfcm8xNihiaW9zLCBkYXRhICsgMHgwMCkgJiYKIAkJICAgIGtoeiA8PSBudl9ybzE2KGJpb3MsIGRhdGEgKyAweDAyKSkKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm4gZGF0YTsKIH0KKwordTMyCitudmJpb3NfcmFtbWFwRXAoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgdTE2IGtoeiwKKwkJdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwKKwkJc3RydWN0IG52Ymlvc19yYW1jZmcgKnApCit7CisJdTMyIGRhdGEgPSBudmJpb3NfcmFtbWFwRW0oYmlvcywga2h6LCB2ZXIsIGhkciwgY250LCBsZW4pOworCW1lbXNldChwLCAweDAwLCBzaXplb2YoKnApKTsKKwlzd2l0Y2ggKCEhZGF0YSAqICp2ZXIpIHsKKwljYXNlIDB4MTE6CisJCXAtPnJhbW1hcF8xMV8wOF8wMSA9IChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDA4KSAmIDB4MDEpID4+IDA7CisJCXAtPnJhbW1hcF8xMV8wOF8wYyA9IChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDA4KSAmIDB4MGMpID4+IDI7CisJCXAtPnJhbW1hcF8xMV8wOF8xMCA9IChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDA4KSAmIDB4MTApID4+IDQ7CisJCXAtPnJhbW1hcF8xMV8xMV8wYyA9IChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDExKSAmIDB4MGMpID4+IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGEgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKK3UzMgorbnZiaW9zX3JhbW1hcFNlKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHUzMiBkYXRhLAorCQl1OCBldmVyLCB1OCBlaGRyLCB1OCBlY250LCB1OCBlbGVuLCBpbnQgaWR4LAorCQl1OCAqdmVyLCB1OCAqaGRyKQoreworCWlmIChpZHggPCBlY250KSB7CisJCWRhdGEgPSBkYXRhICsgZWhkciArIChpZHggKiBlbGVuKTsKKwkJKnZlciA9IGV2ZXI7CisJCSpoZHIgPSBlbGVuOworCQlyZXR1cm4gZGF0YTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3UzMgorbnZiaW9zX3JhbW1hcFNwKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHUzMiBkYXRhLAorCQl1OCBldmVyLCB1OCBlaGRyLCB1OCBlY250LCB1OCBlbGVuLCBpbnQgaWR4LAorCQl1OCAqdmVyLCB1OCAqaGRyLCBzdHJ1Y3QgbnZiaW9zX3JhbWNmZyAqcCkKK3sKKwlkYXRhID0gbnZiaW9zX3JhbW1hcFNlKGJpb3MsIGRhdGEsIGV2ZXIsIGVoZHIsIGVjbnQsIGVsZW4sIGlkeCwgdmVyLCBoZHIpOworCXN3aXRjaCAoISFkYXRhICogKnZlcikgeworCWNhc2UgMHgxMToKKwkJcC0+cmFtY2ZnXzExXzAxXzAxID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgwMSkgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzAxXzAyID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgwMikgPj4gMTsKKwkJcC0+cmFtY2ZnXzExXzAxXzA0ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgwNCkgPj4gMjsKKwkJcC0+cmFtY2ZnXzExXzAxXzA4ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgwOCkgPj4gMzsKKwkJcC0+cmFtY2ZnXzExXzAxXzEwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgxMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzAxXzIwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgyMCkgPj4gNTsKKwkJcC0+cmFtY2ZnXzExXzAxXzQwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHg0MCkgPj4gNjsKKwkJcC0+cmFtY2ZnXzExXzAxXzgwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHg4MCkgPj4gNzsKKwkJcC0+cmFtY2ZnXzExXzAyXzAzID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHgwMykgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzAyXzA0ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHgwNCkgPj4gMjsKKwkJcC0+cmFtY2ZnXzExXzAyXzA4ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHgwOCkgPj4gMzsKKwkJcC0+cmFtY2ZnXzExXzAyXzEwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHgxMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzAyXzQwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHg0MCkgPj4gNjsKKwkJcC0+cmFtY2ZnXzExXzAyXzgwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHg4MCkgPj4gNzsKKwkJcC0+cmFtY2ZnXzExXzAzXzBmID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpICYgMHgwZikgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzAzXzMwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpICYgMHgzMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzAzX2MwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpICYgMHhjMCkgPj4gNjsKKwkJcC0+cmFtY2ZnXzExXzAzX2YwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpICYgMHhmMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzA0ICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDQpICYgMHhmZikgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzA2ICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDYpICYgMHhmZikgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzA3XzAyID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHgwMikgPj4gMTsKKwkJcC0+cmFtY2ZnXzExXzA3XzA0ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHgwNCkgPj4gMjsKKwkJcC0+cmFtY2ZnXzExXzA3XzA4ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHgwOCkgPj4gMzsKKwkJcC0+cmFtY2ZnXzExXzA3XzEwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHgxMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzA3XzQwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHg0MCkgPj4gNjsKKwkJcC0+cmFtY2ZnXzExXzA3XzgwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDcpICYgMHg4MCkgPj4gNzsKKwkJcC0+cmFtY2ZnXzExXzA4XzAxID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgwMSkgPj4gMDsKKwkJcC0+cmFtY2ZnXzExXzA4XzAyID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgwMikgPj4gMTsKKwkJcC0+cmFtY2ZnXzExXzA4XzA0ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgwNCkgPj4gMjsKKwkJcC0+cmFtY2ZnXzExXzA4XzA4ID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgwOCkgPj4gMzsKKwkJcC0+cmFtY2ZnXzExXzA4XzEwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgxMCkgPj4gNDsKKwkJcC0+cmFtY2ZnXzExXzA4XzIwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDgpICYgMHgyMCkgPj4gNTsKKwkJcC0+cmFtY2ZnXzExXzA5ICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDkpICYgMHhmZikgPj4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YSA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZGF0YTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvdGltaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL3RpbWluZy5jCmluZGV4IDE1MWMyZDYuLjM1MGQ0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvdGltaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy90aW1pbmcuYwpAQCAtMjQsMTEgKzI0LDEyIEBACiAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2JpdC5oPgorI2luY2x1ZGUgPHN1YmRldi9iaW9zL3JhbWNmZy5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3RpbWluZy5oPgogCiB1MTYKLW52Ymlvc190aW1pbmdfdGFibGUoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywKLQkJICAgIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4pCitudmJpb3NfdGltaW5nVGUoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywKKwkJdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwgdTggKnNuciwgdTggKnNzeikKIHsKIAlzdHJ1Y3QgYml0X2VudHJ5IGJpdF9QOwogCXUxNiB0aW1pbmcgPSAweDAwMDA7CkBAIC00NywxMSArNDgsMTUgQEAKIAkJCQkqaGRyID0gbnZfcm8wOChiaW9zLCB0aW1pbmcgKyAxKTsKIAkJCQkqY250ID0gbnZfcm8wOChiaW9zLCB0aW1pbmcgKyAyKTsKIAkJCQkqbGVuID0gbnZfcm8wOChiaW9zLCB0aW1pbmcgKyAzKTsKKwkJCQkqc25yID0gMDsKKwkJCQkqc3N6ID0gMDsKIAkJCQlyZXR1cm4gdGltaW5nOwogCQkJY2FzZSAweDIwOgogCQkJCSpoZHIgPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDEpOwotCQkJCSpjbnQgPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDMpOworCQkJCSpjbnQgPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDUpOwogCQkJCSpsZW4gPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDIpOworCQkJCSpzbnIgPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDQpOworCQkJCSpzc3ogPSBudl9ybzA4KGJpb3MsIHRpbWluZyArIDMpOwogCQkJCXJldHVybiB0aW1pbmc7CiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwpAQCAtNjMsMTEgKzY4LDYwIEBACiB9CiAKIHUxNgotbnZiaW9zX3RpbWluZ19lbnRyeShzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCBpbnQgaWR4LCB1OCAqdmVyLCB1OCAqbGVuKQorbnZiaW9zX3RpbWluZ0VlKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIGludCBpZHgsCisJCXU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4pCiB7Ci0JdTggIGhkciwgY250OwotCXUxNiB0aW1pbmcgPSBudmJpb3NfdGltaW5nX3RhYmxlKGJpb3MsIHZlciwgJmhkciwgJmNudCwgbGVuKTsKLQlpZiAodGltaW5nICYmIGlkeCA8IGNudCkKLQkJcmV0dXJuIHRpbWluZyArIGhkciArIChpZHggKiAqbGVuKTsKKwl1OCAgc25yLCBzc3o7CisJdTE2IHRpbWluZyA9IG52Ymlvc190aW1pbmdUZShiaW9zLCB2ZXIsIGhkciwgY250LCBsZW4sICZzbnIsICZzc3opOworCWlmICh0aW1pbmcgJiYgaWR4IDwgKmNudCkgeworCQl0aW1pbmcgKz0gKmhkciArIGlkeCAqICgqbGVuICsgKHNuciAqIHNzeikpOworCQkqaGRyID0gKmxlbjsKKwkJKmNudCA9IHNucjsKKwkJKmxlbiA9IHNzejsKKwkJcmV0dXJuIHRpbWluZzsKKwl9CiAJcmV0dXJuIDB4MDAwMDsKIH0KKwordTE2CitudmJpb3NfdGltaW5nRXAoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgaW50IGlkeCwKKwkJdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwKKwkJc3RydWN0IG52Ymlvc19yYW1jZmcgKnApCit7CisJdTE2IGRhdGEgPSBudmJpb3NfdGltaW5nRWUoYmlvcywgaWR4LCB2ZXIsIGhkciwgY250LCBsZW4pLCB0ZW1wOworCXN3aXRjaCAoISFkYXRhICogKnZlcikgeworCWNhc2UgMHgyMDoKKwkJcC0+dGltaW5nWzBdID0gbnZfcm8zMihiaW9zLCBkYXRhICsgMHgwMCk7CisJCXAtPnRpbWluZ1sxXSA9IG52X3JvMzIoYmlvcywgZGF0YSArIDB4MDQpOworCQlwLT50aW1pbmdbMl0gPSBudl9ybzMyKGJpb3MsIGRhdGEgKyAweDA4KTsKKwkJcC0+dGltaW5nWzNdID0gbnZfcm8zMihiaW9zLCBkYXRhICsgMHgwYyk7CisJCXAtPnRpbWluZ1s0XSA9IG52X3JvMzIoYmlvcywgZGF0YSArIDB4MTApOworCQlwLT50aW1pbmdbNV0gPSBudl9ybzMyKGJpb3MsIGRhdGEgKyAweDE0KTsKKwkJcC0+dGltaW5nWzZdID0gbnZfcm8zMihiaW9zLCBkYXRhICsgMHgxOCk7CisJCXAtPnRpbWluZ1s3XSA9IG52X3JvMzIoYmlvcywgZGF0YSArIDB4MWMpOworCQlwLT50aW1pbmdbOF0gPSBudl9ybzMyKGJpb3MsIGRhdGEgKyAweDIwKTsKKwkJcC0+dGltaW5nWzldID0gbnZfcm8zMihiaW9zLCBkYXRhICsgMHgyNCk7CisJCXAtPnRpbWluZ1sxMF0gPSBudl9ybzMyKGJpb3MsIGRhdGEgKyAweDI4KTsKKwkJcC0+dGltaW5nXzIwXzJlXzAzID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MmUpICYgMHgwMykgPj4gMDsKKwkJcC0+dGltaW5nXzIwXzJlXzMwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MmUpICYgMHgzMCkgPj4gNDsKKwkJcC0+dGltaW5nXzIwXzJlX2MwID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MmUpICYgMHhjMCkgPj4gNjsKKwkJcC0+dGltaW5nXzIwXzJmXzAzID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MmYpICYgMHgwMykgPj4gMDsKKwkJdGVtcCA9IG52X3JvMTYoYmlvcywgZGF0YSArIDB4MmMpOworCQlwLT50aW1pbmdfMjBfMmNfMDAzZiA9ICh0ZW1wICYgMHgwMDNmKSA+PiAwOworCQlwLT50aW1pbmdfMjBfMmNfMWZjMCA9ICh0ZW1wICYgMHgxZmMwKSA+PiA2OworCQlwLT50aW1pbmdfMjBfMzBfMDcgPSAobnZfcm8wOChiaW9zLCBkYXRhICsgMHgzMCkgJiAweDA3KSA+PiAwOworCQlwLT50aW1pbmdfMjBfMzBfZjggPSAobnZfcm8wOChiaW9zLCBkYXRhICsgMHgzMCkgJiAweGY4KSA+PiAzOworCQl0ZW1wID0gbnZfcm8xNihiaW9zLCBkYXRhICsgMHgzMSk7CisJCXAtPnRpbWluZ18yMF8zMV8wMDA3ID0gKHRlbXAgJiAweDAwMDcpID4+IDA7CisJCXAtPnRpbWluZ18yMF8zMV8wMDc4ID0gKHRlbXAgJiAweDAwNzgpID4+IDM7CisJCXAtPnRpbWluZ18yMF8zMV8wNzgwID0gKHRlbXAgJiAweDA3ODApID4+IDc7CisJCXAtPnRpbWluZ18yMF8zMV8wODAwID0gKHRlbXAgJiAweDA4MDApID4+IDExOworCQlwLT50aW1pbmdfMjBfMzFfNzAwMCA9ICh0ZW1wICYgMHg3MDAwKSA+PiAxMjsKKwkJcC0+dGltaW5nXzIwXzMxXzgwMDAgPSAodGVtcCAmIDB4ODAwMCkgPj4gMTU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGEgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9iYXNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9iYXNlLmMKaW5kZXggZTI5MzhhMi4uZGQ2MmJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svYmFzZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL2Jhc2UuYwpAQCAtMTgyLDkgKzE4MiwxMiBAQAogCWNsay0+cHN0YXRlID0gcHN0YXRlaTsKIAogCWlmIChwZmItPnJhbS0+Y2FsYykgewotCQlyZXQgPSBwZmItPnJhbS0+Y2FsYyhwZmIsIHBzdGF0ZS0+YmFzZS5kb21haW5bbnZfY2xrX3NyY19tZW1dKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gcGZiLT5yYW0tPnByb2cocGZiKTsKKwkJaW50IGtoeiA9IHBzdGF0ZS0+YmFzZS5kb21haW5bbnZfY2xrX3NyY19tZW1dOworCQlkbyB7CisJCQlyZXQgPSBwZmItPnJhbS0+Y2FsYyhwZmIsIGtoeik7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0ID0gcGZiLT5yYW0tPnByb2cocGZiKTsKKwkJfSB3aGlsZSAocmV0ID4gMCk7CiAJCXBmYi0+cmFtLT50aWR5KHBmYik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udjA0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udjA0LmMKaW5kZXggMzBjMWYzYS4uYjc0ZGI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252MDQuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvcGxsLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8c3ViZGV2L2RldmluaXQvcHJpdi5oPgorI2luY2x1ZGUgPHN1YmRldi9kZXZpbml0L252MDQuaD4KIAogI2luY2x1ZGUgInBsbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmUwLmMKaW5kZXggNGM2MmU4NC4uZDNjMzdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZlMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252ZTAuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAJeyBudl9jbGtfc3JjX2dwYyAgICAsIDB4MDAsIE5WS01fQ0xLX0RPTV9GTEFHX0NPUkUsICJjb3JlIiwgMjAwMCB9LAogCXsgbnZfY2xrX3NyY19odWJrMDcgLCAweDAxLCBOVktNX0NMS19ET01fRkxBR19DT1JFIH0sCiAJeyBudl9jbGtfc3JjX3JvcCAgICAsIDB4MDIsIE5WS01fQ0xLX0RPTV9GTEFHX0NPUkUgfSwKLQl7IG52X2Nsa19zcmNfbWVtICAgICwgMHgwMywgMCwgIm1lbW9yeSIsIDEwMDAgfSwKKwl7IG52X2Nsa19zcmNfbWVtICAgICwgMHgwMywgMCwgIm1lbW9yeSIsIDUwMCB9LAogCXsgbnZfY2xrX3NyY19odWJrMDYgLCAweDA0LCBOVktNX0NMS19ET01fRkxBR19DT1JFIH0sCiAJeyBudl9jbGtfc3JjX2h1YmswMSAsIDB4MDUgfSwKIAl7IG52X2Nsa19zcmNfdmRlYyAgICwgMHgwNiB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9iYXNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L2Jhc2UuYwppbmRleCA3OWM4MWQzLi44ZmEzNGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L2Jhc2UuYwpAQCAtMjQsOSArMjQsMTEgQEAKIAogI2luY2x1ZGUgPGNvcmUvb3B0aW9uLmg+CiAKLSNpbmNsdWRlIDxzdWJkZXYvZGV2aW5pdC5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvaW5pdC5oPgorI2luY2x1ZGUgPHN1YmRldi92Z2EuaD4KKworI2luY2x1ZGUgInByaXYuaCIKIAogaW50CiBfbm91dmVhdV9kZXZpbml0X2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKQEAgLTM3LDE4ICszOSw0MSBAQAogCWlmIChzdXNwZW5kKQogCQlkZXZpbml0LT5wb3N0ID0gdHJ1ZTsKIAorCS8qIHVubG9jayB0aGUgZXh0ZW5kZWQgdmdhIGNydGMgcmVncyAqLworCW52X2xvY2t2Z2FjKGRldmluaXQsIGZhbHNlKTsKKwogCXJldHVybiBub3V2ZWF1X3N1YmRldl9maW5pKCZkZXZpbml0LT5iYXNlLCBzdXNwZW5kKTsKIH0KIAogaW50CiBfbm91dmVhdV9kZXZpbml0X2luaXQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCiB7CisJc3RydWN0IG5vdXZlYXVfZGV2aW5pdF9pbXBsICppbXBsID0gKHZvaWQgKilvYmplY3QtPm9jbGFzczsKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0ID0gKHZvaWQgKilvYmplY3Q7Ci0JaW50IHJldCA9IG5vdXZlYXVfc3ViZGV2X2luaXQoJmRldmluaXQtPmJhc2UpOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X3N1YmRldl9pbml0KCZkZXZpbml0LT5iYXNlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIG52Ymlvc19pbml0KCZkZXZpbml0LT5iYXNlLCBkZXZpbml0LT5wb3N0KTsKKwlyZXQgPSBudmJpb3NfaW5pdCgmZGV2aW5pdC0+YmFzZSwgZGV2aW5pdC0+cG9zdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbXBsLT5kaXNhYmxlKQorCQludl9kZXZpY2UoZGV2aW5pdCktPmRpc2FibGVfbWFzayB8PSBpbXBsLT5kaXNhYmxlKGRldmluaXQpOworCXJldHVybiAwOworfQorCit2b2lkCitfbm91dmVhdV9kZXZpbml0X2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCit7CisJc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdCA9ICh2b2lkICopb2JqZWN0OworCisJLyogbG9jayBjcnRjIHJlZ3MgKi8KKwludl9sb2NrdmdhYyhkZXZpbml0LCB0cnVlKTsKKworCW5vdXZlYXVfc3ViZGV2X2Rlc3Ryb3koJmRldmluaXQtPmJhc2UpOwogfQogCiBpbnQKQEAgLTU3LDYgKzgyLDcgQEAKIAkJCXN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLAogCQkJaW50IHNpemUsIHZvaWQgKipwb2JqZWN0KQogeworCXN0cnVjdCBub3V2ZWF1X2RldmluaXRfaW1wbCAqaW1wbCA9ICh2b2lkICopb2NsYXNzOwogCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZfZGV2aWNlKHBhcmVudCk7CiAJc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdDsKIAlpbnQgcmV0OwpAQCAtNjgsNSArOTQsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJZGV2aW5pdC0+cG9zdCA9IG5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52Rm9yY2VQb3N0IiwgZmFsc2UpOworCWRldmluaXQtPm1lbWluaXQgPSBpbXBsLT5tZW1pbml0OworCWRldmluaXQtPnBsbF9zZXQgPSBpbXBsLT5wbGxfc2V0OwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjA0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDQuYwppbmRleCAyN2M4MjM1Li43MDM3ZWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDQuYwpAQCAtMjcsMTIgKzI3LDcgQEAKICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CiAKICNpbmNsdWRlICJmYm1lbS5oIgotI2luY2x1ZGUgInByaXYuaCIKLQotc3RydWN0IG52MDRfZGV2aW5pdF9wcml2IHsKLQlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0IGJhc2U7Ci0JaW50IG93bmVyOwotfTsKKyNpbmNsdWRlICJudjA0LmgiCiAKIHN0YXRpYyB2b2lkCiBudjA0X2RldmluaXRfbWVtaW5pdChzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0KQpAQCAtMzkzLDE3ICszODgsMjEgQEAKIG52MDRfZGV2aW5pdF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCiB7CiAJc3RydWN0IG52MDRfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CisJaW50IHJldDsKIAogCS8qIG1ha2UgaTJjIGJ1c3NlcyBhY2Nlc3NpYmxlICovCiAJbnZfbWFzayhwcml2LCAweDAwMDIwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CiAKLQkvKiB1bmxvY2sgZXh0ZW5kZWQgdmdhIGNydGMgcmVncywgYW5kIHVuc2xhdmUgY3J0Y3MgKi8KLQludl9sb2NrdmdhYyhwcml2LCBmYWxzZSk7CisJcmV0ID0gbm91dmVhdV9kZXZpbml0X2ZpbmkoJnByaXYtPmJhc2UsIHN1c3BlbmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB1bnNsYXZlIGNydGNzICovCiAJaWYgKHByaXYtPm93bmVyIDwgMCkKIAkJcHJpdi0+b3duZXIgPSBudl9yZHZnYW93bmVyKHByaXYpOwogCW52X3dydmdhb3duZXIocHJpdiwgMCk7CiAKLQlyZXR1cm4gbm91dmVhdV9kZXZpbml0X2ZpbmkoJnByaXYtPmJhc2UsIHN1c3BlbmQpOworCXJldHVybiAwOwogfQogCiBpbnQKQEAgLTQzMSwxNCArNDMwLDEzIEBACiB7CiAJc3RydWN0IG52MDRfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CiAKLQkvKiByZXN0b3JlIHZnYSBvd25lciBzYXZlZCBhdCBmaXJzdCBpbml0LCBhbmQgbG9jayBjcnRjIHJlZ3MgICovCisJLyogcmVzdG9yZSB2Z2Egb3duZXIgc2F2ZWQgYXQgZmlyc3QgaW5pdCAqLwogCW52X3dydmdhb3duZXIocHJpdiwgcHJpdi0+b3duZXIpOwotCW52X2xvY2t2Z2FjKHByaXYsIHRydWUpOwogCiAJbm91dmVhdV9kZXZpbml0X2Rlc3Ryb3koJnByaXYtPmJhc2UpOwogfQogCi1zdGF0aWMgaW50CitpbnQKIG52MDRfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKIAkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCiAJCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKQEAgLTQ1MSwxOSArNDQ5LDE5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXByaXYtPmJhc2UubWVtaW5pdCA9IG52MDRfZGV2aW5pdF9tZW1pbml0OwotCXByaXYtPmJhc2UucGxsX3NldCA9IG52MDRfZGV2aW5pdF9wbGxfc2V0OwogCXByaXYtPm93bmVyID0gLTE7CiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnYwNF9kZXZpbml0X29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4MDQpLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252MDRfZGV2aW5pdF9vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2RldmluaXRfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweDA0KSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewogCQkuY3RvciA9IG52MDRfZGV2aW5pdF9jdG9yLAogCQkuZHRvciA9IG52MDRfZGV2aW5pdF9kdG9yLAogCQkuaW5pdCA9IG52MDRfZGV2aW5pdF9pbml0LAogCQkuZmluaSA9IG52MDRfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5tZW1pbml0ID0gbnYwNF9kZXZpbml0X21lbWluaXQsCisJLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYwNC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjA0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0NzBhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYwNC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19OVktNX0RFVklOSVRfTlYwNF9IX18KKyNkZWZpbmUgX19OVktNX0RFVklOSVRfTlYwNF9IX18KKworI2luY2x1ZGUgInByaXYuaCIKKworc3RydWN0IG52MDRfZGV2aW5pdF9wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0IGJhc2U7CisJdTggb3duZXI7Cit9OworCitpbnQgIG52MDRfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB2b2lkICosIHUzMiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7Cit2b2lkIG52MDRfZGV2aW5pdF9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgbnYwNF9kZXZpbml0X2luaXQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworaW50ICBudjA0X2RldmluaXRfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgYm9vbCk7CitpbnQgIG52MDRfZGV2aW5pdF9wbGxfc2V0KHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKiwgdTMyLCB1MzIpOworCit2b2lkIHNldFBMTF9zaW5nbGUoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqLCB1MzIsIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICopOwordm9pZCBzZXRQTExfZG91YmxlX2hpZ2hyZWdzKHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKiwgdTMyLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqKTsKK3ZvaWQgc2V0UExMX2RvdWJsZV9sb3dyZWdzKHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKiwgdTMyLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYwNS5jCmluZGV4IGIxOTEyYThhLi45OGI3ZTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252MDUuYwpAQCAtMjksMTIgKzI5LDcgQEAKICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CiAKICNpbmNsdWRlICJmYm1lbS5oIgotI2luY2x1ZGUgInByaXYuaCIKLQotc3RydWN0IG52MDVfZGV2aW5pdF9wcml2IHsKLQlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0IGJhc2U7Ci0JdTggb3duZXI7Ci19OworI2luY2x1ZGUgIm52MDQuaCIKIAogc3RhdGljIHZvaWQKIG52MDVfZGV2aW5pdF9tZW1pbml0KHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKmRldmluaXQpCkBAIC00OSw3ICs0NCw3IEBACiAJCXsgMHgwNiwgMHgwMCB9LAogCQl7IDB4MDAsIDB4MDAgfQogCX07Ci0Jc3RydWN0IG52MDVfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilkZXZpbml0OworCXN0cnVjdCBudjA0X2RldmluaXRfcHJpdiAqcHJpdiA9ICh2b2lkICopZGV2aW5pdDsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHByaXYpOwogCXN0cnVjdCBpb19tYXBwaW5nICpmYjsKIAl1MzIgcGF0dCA9IDB4ZGVhZGJlZWY7CkBAIC0xMzAsMzEgKzEyNSwxNSBAQAogCWZibWVtX2ZpbmkoZmIpOwogfQogCi1zdGF0aWMgaW50Ci1udjA1X2RldmluaXRfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCi0JCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBzaXplLAotCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCi17Ci0Jc3RydWN0IG52MDVfZGV2aW5pdF9wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2RldmluaXRfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsICZwcml2KTsKLQkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHJpdi0+YmFzZS5tZW1pbml0ID0gbnYwNV9kZXZpbml0X21lbWluaXQ7Ci0JcHJpdi0+YmFzZS5wbGxfc2V0ID0gbnYwNF9kZXZpbml0X3BsbF9zZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnYwNV9kZXZpbml0X29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4MDUpLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52MDVfZGV2aW5pdF9jdG9yLAorc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252MDVfZGV2aW5pdF9vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2RldmluaXRfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweDA1KSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52MDRfZGV2aW5pdF9jdG9yLAogCQkuZHRvciA9IG52MDRfZGV2aW5pdF9kdG9yLAogCQkuaW5pdCA9IG52MDRfZGV2aW5pdF9pbml0LAogCQkuZmluaSA9IG52MDRfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5tZW1pbml0ID0gbnYwNV9kZXZpbml0X21lbWluaXQsCisJLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYxMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjEwLmMKaW5kZXggOGQyNzRkYi4uMzJiM2QyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjEwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjEwLmMKQEAgLTI3LDE3ICsyNywxMiBAQAogI2luY2x1ZGUgPHN1YmRldi92Z2EuaD4KIAogI2luY2x1ZGUgImZibWVtLmgiCi0jaW5jbHVkZSAicHJpdi5oIgotCi1zdHJ1Y3QgbnYxMF9kZXZpbml0X3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2RldmluaXQgYmFzZTsKLQl1OCBvd25lcjsKLX07CisjaW5jbHVkZSAibnYwNC5oIgogCiBzdGF0aWMgdm9pZAogbnYxMF9kZXZpbml0X21lbWluaXQoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdCkKIHsKLQlzdHJ1Y3QgbnYxMF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CisJc3RydWN0IG52MDRfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilkZXZpbml0OwogCXN0YXRpYyBjb25zdCBpbnQgbWVtX3dpZHRoW10gPSB7IDB4MTAsIDB4MDAsIDB4MjAgfTsKIAlpbnQgbWVtX3dpZHRoX2NvdW50OwogCXVpbnQzMl90IHBhdHQgPSAweGRlYWRiZWVmOwpAQCAtMTAxLDMxICs5NiwxNSBAQAogCWZibWVtX2ZpbmkoZmIpOwogfQogCi1zdGF0aWMgaW50Ci1udjEwX2RldmluaXRfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCi0JCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBzaXplLAotCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCi17Ci0Jc3RydWN0IG52MTBfZGV2aW5pdF9wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2RldmluaXRfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsICZwcml2KTsKLQkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHJpdi0+YmFzZS5tZW1pbml0ID0gbnYxMF9kZXZpbml0X21lbWluaXQ7Ci0JcHJpdi0+YmFzZS5wbGxfc2V0ID0gbnYwNF9kZXZpbml0X3BsbF9zZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnYxMF9kZXZpbml0X29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4MTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52MTBfZGV2aW5pdF9jdG9yLAorc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252MTBfZGV2aW5pdF9vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2RldmluaXRfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweDEwKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52MDRfZGV2aW5pdF9jdG9yLAogCQkuZHRvciA9IG52MDRfZGV2aW5pdF9kdG9yLAogCQkuaW5pdCA9IG52MDRfZGV2aW5pdF9pbml0LAogCQkuZmluaSA9IG52MDRfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5tZW1pbml0ID0gbnYxMF9kZXZpbml0X21lbWluaXQsCisJLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYxYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjFhLmMKaW5kZXggZTk3NDNjZC4uNTI2ZDBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjFhLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjFhLmMKQEAgLTIyLDM3ICsyMiwxNiBAQAogICogQXV0aG9yczogQmVuIFNrZWdncwogICovCiAKLSNpbmNsdWRlICJwcml2LmgiCisjaW5jbHVkZSAibnYwNC5oIgogCi1zdHJ1Y3QgbnYxYV9kZXZpbml0X3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2RldmluaXQgYmFzZTsKLQl1OCBvd25lcjsKLX07Ci0KLXN0YXRpYyBpbnQKLW52MWFfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnYxYV9kZXZpbml0X3ByaXYgKnByaXY7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZGV2aW5pdF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwcml2LT5iYXNlLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjFhX2RldmluaXRfb2NsYXNzID0gewotCS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHgxYSksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7Ci0JCS5jdG9yID0gbnYxYV9kZXZpbml0X2N0b3IsCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnYxYV9kZXZpbml0X29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfZGV2aW5pdF9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4MWEpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnYwNF9kZXZpbml0X2N0b3IsCiAJCS5kdG9yID0gbnYwNF9kZXZpbml0X2R0b3IsCiAJCS5pbml0ID0gbnYwNF9kZXZpbml0X2luaXQsCiAJCS5maW5pID0gbnYwNF9kZXZpbml0X2ZpbmksCiAJfSwKLX07CisJLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnYyMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjIwLmMKaW5kZXggNmNjNjA4MC4uNDY4OWJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjIwLmMKQEAgLTI0LDE4ICsyNCwxMyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAicHJpdi5oIgorI2luY2x1ZGUgIm52MDQuaCIKICNpbmNsdWRlICJmYm1lbS5oIgogCi1zdHJ1Y3QgbnYyMF9kZXZpbml0X3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2RldmluaXQgYmFzZTsKLQl1OCBvd25lcjsKLX07Ci0KIHN0YXRpYyB2b2lkCiBudjIwX2RldmluaXRfbWVtaW5pdChzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0KQogewotCXN0cnVjdCBudjIwX2RldmluaXRfcHJpdiAqcHJpdiA9ICh2b2lkICopZGV2aW5pdDsKKwlzdHJ1Y3QgbnYwNF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CiAJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXZpY2UgPSBudl9kZXZpY2UocHJpdik7CiAJdWludDMyX3QgbWFzayA9IChkZXZpY2UtPmNoaXBzZXQgPj0gMHgyNSA/IDB4MzAwIDogMHg5MDApOwogCXVpbnQzMl90IGFtb3VudCwgb2ZmOwpAQCAtNjUsMzEgKzYwLDE1IEBACiAJZmJtZW1fZmluaShmYik7CiB9CiAKLXN0YXRpYyBpbnQKLW52MjBfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnYyMF9kZXZpbml0X3ByaXYgKnByaXY7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZGV2aW5pdF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwcml2LT5iYXNlLm1lbWluaXQgPSBudjIwX2RldmluaXRfbWVtaW5pdDsKLQlwcml2LT5iYXNlLnBsbF9zZXQgPSBudjA0X2RldmluaXRfcGxsX3NldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjIwX2RldmluaXRfb2NsYXNzID0gewotCS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHgyMCksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7Ci0JCS5jdG9yID0gbnYyMF9kZXZpbml0X2N0b3IsCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnYyMF9kZXZpbml0X29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfZGV2aW5pdF9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4MjApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnYwNF9kZXZpbml0X2N0b3IsCiAJCS5kdG9yID0gbnYwNF9kZXZpbml0X2R0b3IsCiAJCS5pbml0ID0gbnYwNF9kZXZpbml0X2luaXQsCiAJCS5maW5pID0gbnYwNF9kZXZpbml0X2ZpbmksCiAJfSwKLX07CisJLm1lbWluaXQgPSBudjIwX2RldmluaXRfbWVtaW5pdCwKKwkucGxsX3NldCA9IG52MDRfZGV2aW5pdF9wbGxfc2V0LAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252NTAuYwppbmRleCA2ZGY3MjI0Li5iNDZjNjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252NTAuYwpAQCAtMjgsOSArMjgsOSBAQAogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2luaXQuaD4KICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CiAKLSNpbmNsdWRlICJwcml2LmgiCisjaW5jbHVkZSAibnY1MC5oIgogCi1zdGF0aWMgaW50CitpbnQKIG52NTBfZGV2aW5pdF9wbGxfc2V0KHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKmRldmluaXQsIHUzMiB0eXBlLCB1MzIgZnJlcSkKIHsKIAlzdHJ1Y3QgbnY1MF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CkBAIC03NCw2ICs3NCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTY0CitudjUwX2RldmluaXRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0KQoreworCXN0cnVjdCBudjUwX2RldmluaXRfcHJpdiAqcHJpdiA9ICh2b2lkICopZGV2aW5pdDsKKwl1MzIgcjAwMTU0MCA9IG52X3JkMzIocHJpdiwgMHgwMDE1NDApOworCXU2NCBkaXNhYmxlID0gMFVMTDsKKworCWlmICghKHIwMDE1NDAgJiAweDQwMDAwMDAwKSkKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfTVBFRyk7CisKKwlyZXR1cm4gZGlzYWJsZTsKK30KKwogaW50CiBudjUwX2RldmluaXRfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKIHsKQEAgLTEyMCw3ICsxMzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50CitpbnQKIG52NTBfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKIAkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCiAJCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKQEAgLTEzMywxNyArMTQ2LDE4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXByaXYtPmJhc2UucGxsX3NldCA9IG52NTBfZGV2aW5pdF9wbGxfc2V0OwogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52NTBfZGV2aW5pdF9vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweDUwKSwKLQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjUwX2RldmluaXRfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0X2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHg1MCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKIAkJLmN0b3IgPSBudjUwX2RldmluaXRfY3RvciwKIAkJLmR0b3IgPSBfbm91dmVhdV9kZXZpbml0X2R0b3IsCiAJCS5pbml0ID0gbnY1MF9kZXZpbml0X2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5wbGxfc2V0ID0gbnY1MF9kZXZpbml0X3BsbF9zZXQsCisJLmRpc2FibGUgPSBudjUwX2RldmluaXRfZGlzYWJsZSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnY1MC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxYzI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnY1MC5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19OVktNX0RFVklOSVRfTlY1MF9IX18KKyNkZWZpbmUgX19OVktNX0RFVklOSVRfTlY1MF9IX18KKworI2luY2x1ZGUgInByaXYuaCIKKworc3RydWN0IG52NTBfZGV2aW5pdF9wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0IGJhc2U7Cit9OworCitpbnQgIG52NTBfZGV2aW5pdF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB2b2lkICosIHUzMiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7CitpbnQgIG52NTBfZGV2aW5pdF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgbnY1MF9kZXZpbml0X3BsbF9zZXQoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqLCB1MzIsIHUzMik7CisKK2ludCAgbnZhM19kZXZpbml0X3BsbF9zZXQoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqLCB1MzIsIHUzMik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjg0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252ODQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODc0MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjg0LmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAibnY1MC5oIgorCitzdGF0aWMgdTY0Citudjg0X2RldmluaXRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0KQoreworCXN0cnVjdCBudjUwX2RldmluaXRfcHJpdiAqcHJpdiA9ICh2b2lkICopZGV2aW5pdDsKKwl1MzIgcjAwMTU0MCA9IG52X3JkMzIocHJpdiwgMHgwMDE1NDApOworCXUzMiByMDAxNTRjID0gbnZfcmQzMihwcml2LCAweDAwMTU0Yyk7CisJdTY0IGRpc2FibGUgPSAwVUxMOworCisJaWYgKCEocjAwMTU0MCAmIDB4NDAwMDAwMDApKSB7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX01QRUcpOworCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9WUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0JTUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0NSWVBUKTsKKwl9CisKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDAwNCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0RJU1ApOworCWlmICghKHIwMDE1NGMgJiAweDAwMDAwMDIwKSkKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfQlNQKTsKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDA0MCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0NSWVBUKTsKKworCXJldHVybiBkaXNhYmxlOworfQorCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnY4NF9kZXZpbml0X29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfZGV2aW5pdF9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKERFVklOSVQsIDB4ODQpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnY1MF9kZXZpbml0X2N0b3IsCisJCS5kdG9yID0gX25vdXZlYXVfZGV2aW5pdF9kdG9yLAorCQkuaW5pdCA9IG52NTBfZGV2aW5pdF9pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2RldmluaXRfZmluaSwKKwl9LAorCS5wbGxfc2V0ID0gbnY1MF9kZXZpbml0X3BsbF9zZXQsCisJLmRpc2FibGUgPSBudjg0X2RldmluaXRfZGlzYWJsZSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnY5OC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udjk4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwZTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnY5OC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgIm52NTAuaCIKKworc3RhdGljIHU2NAorbnY5OF9kZXZpbml0X2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdCkKK3sKKwlzdHJ1Y3QgbnY1MF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CisJdTMyIHIwMDE1NDAgPSBudl9yZDMyKHByaXYsIDB4MDAxNTQwKTsKKwl1MzIgcjAwMTU0YyA9IG52X3JkMzIocHJpdiwgMHgwMDE1NGMpOworCXU2NCBkaXNhYmxlID0gMFVMTDsKKworCWlmICghKHIwMDE1NDAgJiAweDQwMDAwMDAwKSkgeworCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9WUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0JTUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX1BQUCk7CisJfQorCisJaWYgKCEocjAwMTU0YyAmIDB4MDAwMDAwMDQpKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9ESVNQKTsKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDAyMCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0JTUCk7CisJaWYgKCEocjAwMTU0YyAmIDB4MDAwMDAwNDApKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9DUllQVCk7CisKKwlyZXR1cm4gZGlzYWJsZTsKK30KKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252OThfZGV2aW5pdF9vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2RldmluaXRfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweDk4KSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52NTBfZGV2aW5pdF9jdG9yLAorCQkuZHRvciA9IF9ub3V2ZWF1X2RldmluaXRfZHRvciwKKwkJLmluaXQgPSBudjUwX2RldmluaXRfaW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9kZXZpbml0X2ZpbmksCisJfSwKKwkucGxsX3NldCA9IG52NTBfZGV2aW5pdF9wbGxfc2V0LAorCS5kaXNhYmxlID0gbnY5OF9kZXZpbml0X2Rpc2FibGUsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252YTMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnZhMy5jCmluZGV4IDc2YTY4YjIuLjZkZWRmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnZhMy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnZhMy5jCkBAIC0yMiwxMiArMjIsMTIgQEAKICAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKICAqLwogCi0jaW5jbHVkZSAicHJpdi5oIgorI2luY2x1ZGUgIm52NTAuaCIKIAotc3RhdGljIGludAoraW50CiBudmEzX2RldmluaXRfcGxsX3NldChzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkZXZpbml0LCB1MzIgdHlwZSwgdTMyIGZyZXEpCiB7Ci0Jc3RydWN0IG52YTNfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilkZXZpbml0OworCXN0cnVjdCBudjUwX2RldmluaXRfcHJpdiAqcHJpdiA9ICh2b2lkICopZGV2aW5pdDsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHByaXYpOwogCXN0cnVjdCBudmJpb3NfcGxsIGluZm87CiAJaW50IE4sIGZOLCBNLCBQOwpAQCAtNTgsMzAgKzU4LDM4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludAotbnZhM19kZXZpbml0X2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKLQkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQorc3RhdGljIHU2NAorbnZhM19kZXZpbml0X2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdCkKIHsKLQlzdHJ1Y3QgbnY1MF9kZXZpbml0X3ByaXYgKnByaXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbnY1MF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CisJdTMyIHIwMDE1NDAgPSBudl9yZDMyKHByaXYsIDB4MDAxNTQwKTsKKwl1MzIgcjAwMTU0YyA9IG52X3JkMzIocHJpdiwgMHgwMDE1NGMpOworCXU2NCBkaXNhYmxlID0gMFVMTDsKIAotCXJldCA9IG5vdXZlYXVfZGV2aW5pdF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaWYgKCEocjAwMTU0MCAmIDB4NDAwMDAwMDApKSB7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX1ZQKTsKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfUFBQKTsKKwl9CiAKLQlwcml2LT5iYXNlLnBsbF9zZXQgPSBudmEzX2RldmluaXRfcGxsX3NldDsKLQlyZXR1cm4gMDsKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDAwNCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0RJU1ApOworCWlmICghKHIwMDE1NGMgJiAweDAwMDAwMDIwKSkKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfQlNQKTsKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDIwMCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0NPUFkwKTsKKworCXJldHVybiBkaXNhYmxlOwogfQogCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52YTNfZGV2aW5pdF9vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweGEzKSwKLQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKLQkJLmN0b3IgPSBudmEzX2RldmluaXRfY3RvciwKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmEzX2RldmluaXRfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0X2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHhhMyksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBudjUwX2RldmluaXRfY3RvciwKIAkJLmR0b3IgPSBfbm91dmVhdV9kZXZpbml0X2R0b3IsCiAJCS5pbml0ID0gbnY1MF9kZXZpbml0X2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5wbGxfc2V0ID0gbnZhM19kZXZpbml0X3BsbF9zZXQsCisJLmRpc2FibGUgPSBudmEzX2RldmluaXRfZGlzYWJsZSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnZhZi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udmFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjNjhkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvbnZhZi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgIm52NTAuaCIKKworc3RhdGljIHU2NAorbnZhZl9kZXZpbml0X2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZGV2aW5pdCkKK3sKKwlzdHJ1Y3QgbnY1MF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CisJdTMyIHIwMDE1NDAgPSBudl9yZDMyKHByaXYsIDB4MDAxNTQwKTsKKwl1MzIgcjAwMTU0YyA9IG52X3JkMzIocHJpdiwgMHgwMDE1NGMpOworCXU2NCBkaXNhYmxlID0gMDsKKworCWlmICghKHIwMDE1NDAgJiAweDQwMDAwMDAwKSkgeworCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9WUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX1BQUCk7CisJfQorCisJaWYgKCEocjAwMTU0YyAmIDB4MDAwMDAwMDQpKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9ESVNQKTsKKwlpZiAoIShyMDAxNTRjICYgMHgwMDAwMDAyMCkpCisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX0JTUCk7CisJaWYgKCEocjAwMTU0YyAmIDB4MDAwMDAwNDApKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9WSUMpOworCWlmICghKHIwMDE1NGMgJiAweDAwMDAwMjAwKSkKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfQ09QWTApOworCisJcmV0dXJuIGRpc2FibGU7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmFmX2RldmluaXRfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0X2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHhhZiksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBudjUwX2RldmluaXRfY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9kZXZpbml0X2R0b3IsCisJCS5pbml0ID0gbnY1MF9kZXZpbml0X2luaXQsCisJCS5maW5pID0gX25vdXZlYXVfZGV2aW5pdF9maW5pLAorCX0sCisJLnBsbF9zZXQgPSBudmEzX2RldmluaXRfcGxsX3NldCwKKwkuZGlzYWJsZSA9IG52YWZfZGV2aW5pdF9kaXNhYmxlLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252YzAuYwppbmRleCAxOWUyNjViLi5mYTdlNjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252YzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9kZXZpbml0L252YzAuYwpAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAotI2luY2x1ZGUgInByaXYuaCIKKyNpbmNsdWRlICJudjUwLmgiCiAKIHN0YXRpYyBpbnQKIG52YzBfZGV2aW5pdF9wbGxfc2V0KHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKmRldmluaXQsIHUzMiB0eXBlLCB1MzIgZnJlcSkKIHsKLQlzdHJ1Y3QgbnZjMF9kZXZpbml0X3ByaXYgKnByaXYgPSAodm9pZCAqKWRldmluaXQ7CisJc3RydWN0IG52NTBfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilkZXZpbml0OwogCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MocHJpdik7CiAJc3RydWN0IG52Ymlvc19wbGwgaW5mbzsKIAlpbnQgTiwgZk4sIE0sIFA7CkBAIC01OSw2ICs1OSwzMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB1NjQKK252YzBfZGV2aW5pdF9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKmRldmluaXQpCit7CisJc3RydWN0IG52NTBfZGV2aW5pdF9wcml2ICpwcml2ID0gKHZvaWQgKilkZXZpbml0OworCXUzMiByMDIyNTAwID0gbnZfcmQzMihwcml2LCAweDAyMjUwMCk7CisJdTY0IGRpc2FibGUgPSAwVUxMOworCisJaWYgKHIwMjI1MDAgJiAweDAwMDAwMDAxKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9ESVNQKTsKKworCWlmIChyMDIyNTAwICYgMHgwMDAwMDAwMikgeworCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9WUCk7CisJCWRpc2FibGUgfD0gKDFVTEwgPDwgTlZERVZfRU5HSU5FX1BQUCk7CisJfQorCisJaWYgKHIwMjI1MDAgJiAweDAwMDAwMDA0KQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9CU1ApOworCWlmIChyMDIyNTAwICYgMHgwMDAwMDAwOCkKKwkJZGlzYWJsZSB8PSAoMVVMTCA8PCBOVkRFVl9FTkdJTkVfVkVOQyk7CisJaWYgKHIwMjI1MDAgJiAweDAwMDAwMTAwKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9DT1BZMCk7CisJaWYgKHIwMjI1MDAgJiAweDAwMDAwMjAwKQorCQlkaXNhYmxlIHw9ICgxVUxMIDw8IE5WREVWX0VOR0lORV9DT1BZMSk7CisKKwlyZXR1cm4gZGlzYWJsZTsKK30KKwogc3RhdGljIGludAogbnZjMF9kZXZpbml0X2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAogCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKQEAgLTcyLDE5ICs5OSwyMCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlwcml2LT5iYXNlLnBsbF9zZXQgPSBudmMwX2RldmluaXRfcGxsX3NldDsKIAlpZiAobnZfcmQzMihwcml2LCAweDAyMjUwMCkgJiAweDAwMDAwMDAxKQogCQlwcml2LT5iYXNlLnBvc3QgPSB0cnVlOwogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52YzBfZGV2aW5pdF9vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihERVZJTklULCAweGMwKSwKLQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmMwX2RldmluaXRfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0X2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoREVWSU5JVCwgMHhjMCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKIAkJLmN0b3IgPSBudmMwX2RldmluaXRfY3RvciwKIAkJLmR0b3IgPSBfbm91dmVhdV9kZXZpbml0X2R0b3IsCiAJCS5pbml0ID0gbnY1MF9kZXZpbml0X2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfZGV2aW5pdF9maW5pLAogCX0sCi19OworCS5wbGxfc2V0ID0gbnZjMF9kZXZpbml0X3BsbF9zZXQsCisJLmRpc2FibGUgPSBudmMwX2RldmluaXRfZGlzYWJsZSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2RldmluaXQvcHJpdi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9wcml2LmgKaW5kZXggN2Q2MjJlMi4uODIyYTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9wcml2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZGV2aW5pdC9wcml2LmgKQEAgLTYsMjAgKzYsMzIgQEAKICNpbmNsdWRlIDxzdWJkZXYvY2xvY2svcGxsLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2RldmluaXQuaD4KIAotdm9pZCBudjA0X2RldmluaXRfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci1pbnQgIG52MDRfZGV2aW5pdF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKLWludCAgbnYwNF9kZXZpbml0X2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIGJvb2wpOwotaW50ICBudjA0X2RldmluaXRfcGxsX3NldChzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICosIHUzMiwgdTMyKTsKLQotdm9pZCBzZXRQTExfc2luZ2xlKHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKiwgdTMyLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqKTsKLXZvaWQgc2V0UExMX2RvdWJsZV9oaWdocmVncyhzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICosIHUzMiwgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKik7Ci12b2lkIHNldFBMTF9kb3VibGVfbG93cmVncyhzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICosIHUzMiwgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKik7Ci0KLQotc3RydWN0IG52NTBfZGV2aW5pdF9wcml2IHsKLQlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0IGJhc2U7CitzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0X2ltcGwgeworCXN0cnVjdCBub3V2ZWF1X29jbGFzcyBiYXNlOworCXZvaWQgKCptZW1pbml0KShzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICopOworCWludCAgKCpwbGxfc2V0KShzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICosIHUzMiB0eXBlLCB1MzIgZnJlcSk7CisJdTY0ICAoKmRpc2FibGUpKHN0cnVjdCBub3V2ZWF1X2RldmluaXQgKik7CiB9OwogCi1pbnQgIG52NTBfZGV2aW5pdF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKKyNkZWZpbmUgbm91dmVhdV9kZXZpbml0X2NyZWF0ZShwLGUsbyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbm91dmVhdV9kZXZpbml0X2NyZWF0ZV8oKHApLCAoZSksIChvKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCisjZGVmaW5lIG5vdXZlYXVfZGV2aW5pdF9kZXN0cm95KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2RldmluaXQgKmQgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2RldmluaXRfZHRvcihudl9vYmplY3QoZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9kZXZpbml0X2luaXQocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG5vdXZlYXVfZGV2aW5pdCAqZCA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX25vdXZlYXVfZGV2aW5pdF9pbml0KG52X29iamVjdChkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBub3V2ZWF1X2RldmluaXRfZmluaShwLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpbml0ICpkID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbm91dmVhdV9kZXZpbml0X2ZpbmkobnZfb2JqZWN0KGQpLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKK2ludCBub3V2ZWF1X2RldmluaXRfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCisJCQkgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIGludCwgdm9pZCAqKik7Cit2b2lkIF9ub3V2ZWF1X2RldmluaXRfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgX25vdXZlYXVfZGV2aW5pdF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCBfbm91dmVhdV9kZXZpbml0X2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIGJvb2wgc3VzcGVuZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvZ2RkcjUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL2dkZHI1LmMKaW5kZXggMzRmOTYwNS4uNjZmZTk1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvZ2RkcjUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9nZGRyNS5jCkBAIC0yNSwzNSArMjUsNDQgQEAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgogI2luY2x1ZGUgInByaXYuaCIKIAorLyogYmluYXJ5IGRyaXZlciBvbmx5IGV4ZWN1dGVzIHRoaXMgcGF0aCBpZiB0aGUgY29uZGl0aW9uIChhKSBpcyB0cnVlCisgKiBmb3IgYW55IGNvbmZpZ3VyYXRpb24gKGNvbWJpbmF0aW9uIG9mIHJhbW1hcCtyYW1jZmcrdGltaW5nKSB0aGF0CisgKiBjYW4gYmUgcmVhY2hlZCBvbiBhIGdpdmVuIGNhcmQuICBmb3Igbm93LCB3ZSB3aWxsIGV4ZWN1dGUgdGhlIGJyYW5jaAorICogdW5jb25kaXRpb25hbGx5IGluIHRoZSBob3BlIHRoYXQgYSAiZmFsc2UgZXZlcnl3aGVyZSIgaW4gdGhlIGJpb3MKKyAqIHRhYmxlcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gImRvbid0IHRvdWNoIHRoaXMiLgorICovCisjZGVmaW5lIE5PVEUwMChhKSAxCisKIGludAotbm91dmVhdV9nZGRyNV9jYWxjKHN0cnVjdCBub3V2ZWF1X3JhbSAqcmFtKQorbm91dmVhdV9nZGRyNV9jYWxjKHN0cnVjdCBub3V2ZWF1X3JhbSAqcmFtLCBib29sIG51dHMpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhyYW0pOwotCWludCBwZCwgbGYsIHhkLCB2aCwgdnIsIHZvOwotCWludCBXTCwgQ0wsIFdSLCBhdCwgZHQsIGRzOworCWludCBwZCwgbGYsIHhkLCB2aCwgdnIsIHZvLCBsMzsKKwlpbnQgV0wsIENMLCBXUiwgYXRbMl0sIGR0LCBkczsKIAlpbnQgcnEgPSByYW0tPmZyZXEgPCAxMDAwMDAwOyAvKiBYWFggKi8KIAotCXN3aXRjaCAoISFyYW0tPnJhbWNmZy5kYXRhICogcmFtLT5yYW1jZmcudmVyc2lvbikgeworCXN3aXRjaCAocmFtLT5yYW1jZmcudmVyc2lvbikgewogCWNhc2UgMHgxMToKLQkJcGQgPSAgKG52X3JvMDgoYmlvcywgcmFtLT5yYW1jZmcuZGF0YSArIDB4MDEpICYgMHg4MCkgPj4gNzsKLQkJbGYgPSAgKG52X3JvMDgoYmlvcywgcmFtLT5yYW1jZmcuZGF0YSArIDB4MDEpICYgMHg0MCkgPj4gNjsKLQkJeGQgPSAhKG52X3JvMDgoYmlvcywgcmFtLT5yYW1jZmcuZGF0YSArIDB4MDEpICYgMHgyMCk7Ci0JCXZoID0gIChudl9ybzA4KGJpb3MsIHJhbS0+cmFtY2ZnLmRhdGEgKyAweDAyKSAmIDB4MTApID4+IDQ7Ci0JCXZyID0gIChudl9ybzA4KGJpb3MsIHJhbS0+cmFtY2ZnLmRhdGEgKyAweDAyKSAmIDB4MDQpID4+IDI7Ci0JCXZvID0gICBudl9ybzA4KGJpb3MsIHJhbS0+cmFtY2ZnLmRhdGEgKyAweDA2KSAmIDB4ZmY7CisJCXBkID0gIHJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfODA7CisJCWxmID0gIHJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfNDA7CisJCXhkID0gIXJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMjA7CisJCXZoID0gIHJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDJfMTA7CisJCXZyID0gIHJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDJfMDQ7CisJCXZvID0gIHJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDY7CisJCWwzID0gIXJhbS0+bmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfMDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PU1lTOwogCX0KIAotCXN3aXRjaCAoISFyYW0tPnRpbWluZy5kYXRhICogcmFtLT50aW1pbmcudmVyc2lvbikgeworCXN3aXRjaCAocmFtLT50aW1pbmcudmVyc2lvbikgewogCWNhc2UgMHgyMDoKLQkJV0wgPSAobnZfcm8xNihiaW9zLCByYW0tPnRpbWluZy5kYXRhICsgMHgwNCkgJiAweDBmODApID4+IDc7Ci0JCUNMID0gIG52X3JvMDgoYmlvcywgcmFtLT50aW1pbmcuZGF0YSArIDB4MDQpICYgMHgxZjsKLQkJV1IgPSAgbnZfcm8wOChiaW9zLCByYW0tPnRpbWluZy5kYXRhICsgMHgwYSkgJiAweDdmOwotCQlhdCA9IChudl9ybzA4KGJpb3MsIHJhbS0+dGltaW5nLmRhdGEgKyAweDJlKSAmIDB4YzApID4+IDY7Ci0JCWR0ID0gIG52X3JvMDgoYmlvcywgcmFtLT50aW1pbmcuZGF0YSArIDB4MmUpICYgMHgwMzsKLQkJZHMgPSAgbnZfcm8wOChiaW9zLCByYW0tPnRpbWluZy5kYXRhICsgMHgyZikgJiAweDAzOworCQlXTCA9IChyYW0tPm5leHQtPmJpb3MudGltaW5nWzFdICYgMHgwMDAwMGY4MCkgPj4gNzsKKwkJQ0wgPSAocmFtLT5uZXh0LT5iaW9zLnRpbWluZ1sxXSAmIDB4MDAwMDAwMWYpOworCQlXUiA9IChyYW0tPm5leHQtPmJpb3MudGltaW5nWzJdICYgMHgwMDdmMDAwMCkgPj4gMTY7CisJCWF0WzBdID0gcmFtLT5uZXh0LT5iaW9zLnRpbWluZ18yMF8yZV9jMDsKKwkJYXRbMV0gPSByYW0tPm5leHQtPmJpb3MudGltaW5nXzIwXzJlXzMwOworCQlkdCA9ICByYW0tPm5leHQtPmJpb3MudGltaW5nXzIwXzJlXzAzOworCQlkcyA9ICByYW0tPm5leHQtPmJpb3MudGltaW5nXzIwXzJmXzAzOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1NZUzsKQEAgLTcxLDEzICs4MCwyNSBAQAogCiAJcmFtLT5tclsxXSAmPSB+MHgwYmY7CiAJcmFtLT5tclsxXSB8PSAoeGQgJiAweDAxKSA8PCA3OwotCXJhbS0+bXJbMV0gfD0gKGF0ICYgMHgwMykgPDwgNDsKKwlyYW0tPm1yWzFdIHw9IChhdFswXSAmIDB4MDMpIDw8IDQ7CiAJcmFtLT5tclsxXSB8PSAoZHQgJiAweDAzKSA8PCAyOwogCXJhbS0+bXJbMV0gfD0gKGRzICYgMHgwMykgPDwgMDsKIAorCS8qIHRoaXMgc2VlbXMgd3JvbmcsIGFsdGVybmF0ZSBmaWVsZCB1c2VkIGZvciB0aGUgYnJvYWRjYXN0CisJICogb24gbnV0cyB2cyBub24tbnV0cyBjb25maWdzLi4gIG1laCwgaXQgbWF0Y2hlcyBmb3Igbm93LgorCSAqLworCXJhbS0+bXIxX251dHMgPSByYW0tPm1yWzFdOworCWlmIChudXRzKSB7CisJCXJhbS0+bXJbMV0gJj0gfjB4MDMwOworCQlyYW0tPm1yWzFdIHw9IChhdFsxXSAmIDB4MDMpIDw8IDQ7CisJfQorCiAJcmFtLT5tclszXSAmPSB+MHgwMjA7CiAJcmFtLT5tclszXSB8PSAocnEgJiAweDAxKSA8PCA1OwogCisJcmFtLT5tcls1XSAmPSB+MHgwMDQ7CisJcmFtLT5tcls1XSB8PSAobDMgPDwgMik7CisKIAlpZiAoIXZvKQogCQl2byA9IChyYW0tPm1yWzZdICYgMHhmZjApID4+IDQ7CiAJaWYgKHJhbS0+bXJbNl0gJiAweDAwMSkKQEAgLTg2LDExICsxMDcsMTYgQEAKIAlyYW0tPm1yWzZdIHw9ICh2byAmIDB4ZmYpIDw8IDQ7CiAJcmFtLT5tcls2XSB8PSAocGQgJiAweDAxKSA8PCAwOwogCi0JaWYgKCEocmFtLT5tcls3XSAmIDB4MTAwKSkKLQkJdnIgPSAwOyAvKiBiaW5hcnkgZHJpdmVyIGRvZXMgdGhpcy4uIGJ1Zz8gKi8KLQlyYW0tPm1yWzddICY9IH4weDE4ODsKLQlyYW0tPm1yWzddIHw9ICh2ciAmIDB4MDEpIDw8IDg7CisJaWYgKE5PVEUwMCh2cikpIHsKKwkJcmFtLT5tcls3XSAmPSB+MHgzMDA7CisJCXJhbS0+bXJbN10gfD0gKHZyICYgMHgwMykgPDwgODsKKwl9CisJcmFtLT5tcls3XSAmPSB+MHgwODg7CiAJcmFtLT5tcls3XSB8PSAodmggJiAweDAxKSA8PCA3OwogCXJhbS0+bXJbN10gfD0gKGxmICYgMHgwMSkgPDwgMzsKKworCXJhbS0+bXJbOF0gJj0gfjB4MDAzOworCXJhbS0+bXJbOF0gfD0gKFdSICYgMHgxMCkgPj4gMzsKKwlyYW0tPm1yWzhdIHw9IChDTCAmIDB4MTApID4+IDQ7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9udmMwLmMKaW5kZXggZTVmYzM3Yy4uNDU0NzBlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL252YzAuYwpAQCAtMzMsNiArMzMsMjEgQEAKIAlyZXR1cm4gbGlrZWx5KChudmMwX3B0ZV9zdG9yYWdlX3R5cGVfbWFwW21lbXR5cGVdICE9IDB4ZmYpKTsKIH0KIAorc3RhdGljIHZvaWQKK252YzBfZmJfaW50cihzdHJ1Y3Qgbm91dmVhdV9zdWJkZXYgKnN1YmRldikKK3sKKwlzdHJ1Y3QgbnZjMF9mYl9wcml2ICpwcml2ID0gKHZvaWQgKilzdWJkZXY7CisJdTMyIGludHIgPSBudl9yZDMyKHByaXYsIDB4MDAwMTAwKTsKKwlpZiAoaW50ciAmIDB4MDgwMDAwMDApIHsKKwkJbnZfZGVidWcocHJpdiwgIlBGRkIgaW50clxuIik7CisJCWludHIgJj0gfjB4MDgwMDAwMDA7CisJfQorCWlmIChpbnRyICYgMHgwMDAwMjAwMCkgeworCQludl9kZWJ1Zyhwcml2LCAiUEJGQiBpbnRyXG4iKTsKKwkJaW50ciAmPSB+MHgwMDAwMjAwMDsKKwl9Cit9CisKIGludAogbnZjMF9mYl9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQogewpAQCAtODYsNiArMTAxLDcgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCW52X3N1YmRldihwcml2KS0+aW50ciA9IG52YzBfZmJfaW50cjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcHJpdi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcHJpdi5oCmluZGV4IDQ5MzEyNTIuLmVkYWY5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3ByaXYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9wcml2LmgKQEAgLTM0LDcgKzM0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnZlMF9yYW1fb2NsYXNzOwogCiBpbnQgbm91dmVhdV9zZGRyM19jYWxjKHN0cnVjdCBub3V2ZWF1X3JhbSAqcmFtKTsKLWludCBub3V2ZWF1X2dkZHI1X2NhbGMoc3RydWN0IG5vdXZlYXVfcmFtICpyYW0pOworaW50IG5vdXZlYXVfZ2RkcjVfY2FsYyhzdHJ1Y3Qgbm91dmVhdV9yYW0gKnJhbSwgYm9vbCBudXRzKTsKIAogI2RlZmluZSBub3V2ZWF1X2ZiX2NyZWF0ZShwLGUsYyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlub3V2ZWF1X2ZiX2NyZWF0ZV8oKHApLCAoZSksIChjKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udjUwLmMKaW5kZXggNzY3NjJhMS4uYzdmZGIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52NTAuYwpAQCAtNzAsMTMgKzcwLDExIEBACiAJc3RydWN0IG52NTBfcmFtc2VxICpod3NxID0gJnJhbS0+aHdzcTsKIAlzdHJ1Y3QgbnZiaW9zX3BlcmZFIHBlcmZFOwogCXN0cnVjdCBudmJpb3NfcGxsIG1wbGw7Ci0Jc3RydWN0IGJpdF9lbnRyeSBNOwogCXN0cnVjdCB7CiAJCXUzMiBkYXRhOwogCQl1OCAgc2l6ZTsKIAl9IHJhbWNmZywgdGltaW5nOwotCXU4ICB2ZXIsIGhkciwgY250LCBzdHJhcDsKLQl1MzIgZGF0YTsKKwl1OCAgdmVyLCBoZHIsIGNudCwgbGVuLCBzdHJhcDsKIAlpbnQgTjEsIE0xLCBOMiwgTTIsIFA7CiAJaW50IHJldCwgaTsKIApAQCAtOTMsMTYgKzkxLDcgQEAKIAl9IHdoaWxlIChwZXJmRS5tZW1vcnkgPCBmcmVxKTsKIAogCS8qIGxvY2F0ZSBzcGVjaWZpYyBkYXRhIHNldCBmb3IgdGhlIGF0dGFjaGVkIG1lbW9yeSAqLwotCWlmIChiaXRfZW50cnkoYmlvcywgJ00nLCAmTSkgfHwgTS52ZXJzaW9uICE9IDEgfHwgTS5sZW5ndGggPCA1KSB7Ci0JCW52X2Vycm9yKHBmYiwgImludmFsaWQvbWlzc2luZyBtZW1vcnkgdGFibGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdHJhcCA9IChudl9yZDMyKHBmYiwgMHgxMDEwMDApICYgMHgwMDAwMDAzYykgPj4gMjsKLQlkYXRhID0gbnZfcm8xNihiaW9zLCBNLm9mZnNldCArIDMpOwotCWlmIChkYXRhKQotCQlzdHJhcCA9IG52X3JvMDgoYmlvcywgZGF0YSArIHN0cmFwKTsKLQorCXN0cmFwID0gbnZiaW9zX3JhbWNmZ19pbmRleChiaW9zKTsKIAlpZiAoc3RyYXAgPj0gY250KSB7CiAJCW52X2Vycm9yKHBmYiwgImludmFsaWQgcmFtY2ZnIHN0cmFwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTMsNyArMTAyLDggQEAKIAkvKiBsb29rdXAgbWVtb3J5IHRpbWluZ3MsIGlmIGJpb3Mgc2F5cyB0aGV5J3JlIHByZXNlbnQgKi8KIAlzdHJhcCA9IG52X3JvMDgoYmlvcywgcmFtY2ZnLmRhdGEgKyAweDAxKTsKIAlpZiAoc3RyYXAgIT0gMHhmZikgewotCQl0aW1pbmcuZGF0YSA9IG52Ymlvc190aW1pbmdfZW50cnkoYmlvcywgc3RyYXAsICZ2ZXIsICZoZHIpOworCQl0aW1pbmcuZGF0YSA9IG52Ymlvc190aW1pbmdFZShiaW9zLCBzdHJhcCwgJnZlciwgJmhkciwKKwkJCQkJICAgICAmY250LCAmbGVuKTsKIAkJaWYgKCF0aW1pbmcuZGF0YSB8fCB2ZXIgIT0gMHgxMCB8fCBoZHIgPCAweDEyKSB7CiAJCQludl9lcnJvcihwZmIsICJpbnZhbGlkL21pc3NpbmcgdGltaW5nIGVudHJ5ICIKIAkJCQkgIiUwMnggJTA0eCAlMDJ4ICUwMnhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmEzLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmEzLmMKaW5kZXggZjYyOTJjZC4uZjRhZThhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZhMy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YTMuYwpAQCAtNzksOCArNzksNyBAQAogCXN0cnVjdCBudmEzX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnZhM19yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKIAlzdHJ1Y3QgbnZhM19jbG9ja19pbmZvIG1jbGs7Ci0Jc3RydWN0IGJpdF9lbnRyeSBNOwotCXU4ICB2ZXIsIGNudCwgc3RyYXA7CisJdTggIHZlciwgY250LCBsZW4sIHN0cmFwOwogCXUzMiBkYXRhOwogCXN0cnVjdCB7CiAJCXUzMiBkYXRhOwpAQCAtOTEsMjQgKzkwLDE1IEBACiAJaW50IHJldDsKIAogCS8qIGxvb2t1cCBtZW1vcnkgY29uZmlnIGRhdGEgcmVsZXZhbnQgdG8gdGhlIHRhcmdldCBmcmVxdWVuY3kgKi8KLQlyYW1tYXAuZGF0YSA9IG52Ymlvc19yYW1tYXBfbWF0Y2goYmlvcywgZnJlcSAvIDEwMDAsICZ2ZXIsICZyYW1tYXAuc2l6ZSwKLQkJCQkJICZjbnQsICZyYW1jZmcuc2l6ZSk7CisJcmFtbWFwLmRhdGEgPSBudmJpb3NfcmFtbWFwRW0oYmlvcywgZnJlcSAvIDEwMDAsICZ2ZXIsICZyYW1tYXAuc2l6ZSwKKwkJCQkgICAgICZjbnQsICZyYW1jZmcuc2l6ZSk7CiAJaWYgKCFyYW1tYXAuZGF0YSB8fCB2ZXIgIT0gMHgxMCB8fCByYW1tYXAuc2l6ZSA8IDB4MGUpIHsKIAkJbnZfZXJyb3IocGZiLCAiaW52YWxpZC9taXNzaW5nIHJhbW1hcCBlbnRyeVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGxvY2F0ZSBzcGVjaWZpYyBkYXRhIHNldCBmb3IgdGhlIGF0dGFjaGVkIG1lbW9yeSAqLwotCWlmIChiaXRfZW50cnkoYmlvcywgJ00nLCAmTSkgfHwgTS52ZXJzaW9uICE9IDIgfHwgTS5sZW5ndGggPCAzKSB7Ci0JCW52X2Vycm9yKHBmYiwgImludmFsaWQvbWlzc2luZyBtZW1vcnkgdGFibGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdHJhcCA9IChudl9yZDMyKHBmYiwgMHgxMDEwMDApICYgMHgwMDAwMDAzYykgPj4gMjsKLQlkYXRhID0gbnZfcm8xNihiaW9zLCBNLm9mZnNldCArIDEpOwotCWlmIChkYXRhKQotCQlzdHJhcCA9IG52X3JvMDgoYmlvcywgZGF0YSArIHN0cmFwKTsKLQorCXN0cmFwID0gbnZiaW9zX3JhbWNmZ19pbmRleChiaW9zKTsKIAlpZiAoc3RyYXAgPj0gY250KSB7CiAJCW52X2Vycm9yKHBmYiwgImludmFsaWQgcmFtY2ZnIHN0cmFwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjMsOCArMTEzLDggQEAKIAkvKiBsb29rdXAgbWVtb3J5IHRpbWluZ3MsIGlmIGJpb3Mgc2F5cyB0aGV5J3JlIHByZXNlbnQgKi8KIAlzdHJhcCA9IG52X3JvMDgoYmlvcywgcmFtY2ZnLmRhdGEgKyAweDAxKTsKIAlpZiAoc3RyYXAgIT0gMHhmZikgewotCQl0aW1pbmcuZGF0YSA9IG52Ymlvc190aW1pbmdfZW50cnkoYmlvcywgc3RyYXAsICZ2ZXIsCi0JCQkJCQkgJnRpbWluZy5zaXplKTsKKwkJdGltaW5nLmRhdGEgPSBudmJpb3NfdGltaW5nRWUoYmlvcywgc3RyYXAsICZ2ZXIsICZ0aW1pbmcuc2l6ZSwKKwkJCQkJICAgICAmY250LCAmbGVuKTsKIAkJaWYgKCF0aW1pbmcuZGF0YSB8fCB2ZXIgIT0gMHgxMCB8fCB0aW1pbmcuc2l6ZSA8IDB4MTkpIHsKIAkJCW52X2Vycm9yKHBmYiwgImludmFsaWQvbWlzc2luZyB0aW1pbmcgZW50cnlcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmMwLmMKaW5kZXggZjQ2NDU0Ny4uMDM5MWI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YzAuYwpAQCAtMjMsNyArMjMsNiBAQAogICovCiAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgotI2luY2x1ZGUgPHN1YmRldi9iaW9zL2JpdC5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3BsbC5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3JhbW1hcC5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3RpbWluZy5oPgpAQCAtMTM0LDkgKzEzMyw3IEBACiAJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwZmIpOwogCXN0cnVjdCBudmMwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnZjMF9yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKLQlzdHJ1Y3QgYml0X2VudHJ5IE07Ci0JdTggIHZlciwgY250LCBzdHJhcDsKLQl1MzIgZGF0YTsKKwl1OCAgdmVyLCBjbnQsIGxlbiwgc3RyYXA7CiAJc3RydWN0IHsKIAkJdTMyIGRhdGE7CiAJCXU4ICBzaXplOwpAQCAtMTQ3LDI0ICsxNDQsMTUgQEAKIAlpbnQgcmV0OwogCiAJLyogbG9va3VwIG1lbW9yeSBjb25maWcgZGF0YSByZWxldmFudCB0byB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSAqLwotCXJhbW1hcC5kYXRhID0gbnZiaW9zX3JhbW1hcF9tYXRjaChiaW9zLCBmcmVxIC8gMTAwMCwgJnZlciwgJnJhbW1hcC5zaXplLAotCQkJCQkgJmNudCwgJnJhbWNmZy5zaXplKTsKKwlyYW1tYXAuZGF0YSA9IG52Ymlvc19yYW1tYXBFbShiaW9zLCBmcmVxIC8gMTAwMCwgJnZlciwgJnJhbW1hcC5zaXplLAorCQkJCSAgICAgJmNudCwgJnJhbWNmZy5zaXplKTsKIAlpZiAoIXJhbW1hcC5kYXRhIHx8IHZlciAhPSAweDEwIHx8IHJhbW1hcC5zaXplIDwgMHgwZSkgewogCQludl9lcnJvcihwZmIsICJpbnZhbGlkL21pc3NpbmcgcmFtbWFwIGVudHJ5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogbG9jYXRlIHNwZWNpZmljIGRhdGEgc2V0IGZvciB0aGUgYXR0YWNoZWQgbWVtb3J5ICovCi0JaWYgKGJpdF9lbnRyeShiaW9zLCAnTScsICZNKSB8fCBNLnZlcnNpb24gIT0gMiB8fCBNLmxlbmd0aCA8IDMpIHsKLQkJbnZfZXJyb3IocGZiLCAiaW52YWxpZC9taXNzaW5nIG1lbW9yeSB0YWJsZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmFwID0gKG52X3JkMzIocGZiLCAweDEwMTAwMCkgJiAweDAwMDAwMDNjKSA+PiAyOwotCWRhdGEgPSBudl9ybzE2KGJpb3MsIE0ub2Zmc2V0ICsgMSk7Ci0JaWYgKGRhdGEpCi0JCXN0cmFwID0gbnZfcm8wOChiaW9zLCBkYXRhICsgc3RyYXApOwotCisJc3RyYXAgPSBudmJpb3NfcmFtY2ZnX2luZGV4KGJpb3MpOwogCWlmIChzdHJhcCA+PSBjbnQpIHsKIAkJbnZfZXJyb3IocGZiLCAiaW52YWxpZCByYW1jZmcgc3RyYXBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3OSw4ICsxNjcsOCBAQAogCS8qIGxvb2t1cCBtZW1vcnkgdGltaW5ncywgaWYgYmlvcyBzYXlzIHRoZXkncmUgcHJlc2VudCAqLwogCXN0cmFwID0gbnZfcm8wOChiaW9zLCByYW1jZmcuZGF0YSArIDB4MDEpOwogCWlmIChzdHJhcCAhPSAweGZmKSB7Ci0JCXRpbWluZy5kYXRhID0gbnZiaW9zX3RpbWluZ19lbnRyeShiaW9zLCBzdHJhcCwgJnZlciwKLQkJCQkJCSAmdGltaW5nLnNpemUpOworCQl0aW1pbmcuZGF0YSA9IG52Ymlvc190aW1pbmdFZShiaW9zLCBzdHJhcCwgJnZlciwgJnRpbWluZy5zaXplLAorCQkJCQkgICAgICZjbnQsICZsZW4pOwogCQlpZiAoIXRpbWluZy5kYXRhIHx8IHZlciAhPSAweDEwIHx8IHRpbWluZy5zaXplIDwgMHgxOSkgewogCQkJbnZfZXJyb3IocGZiLCAiaW52YWxpZC9taXNzaW5nIHRpbWluZyBlbnRyeVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52ZTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52ZTAuYwppbmRleCBiYzg2Y2ZkLi4zMjU3YzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZlMC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8c3ViZGV2L2dwaW8uaD4KIAogI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+Ci0jaW5jbHVkZSA8c3ViZGV2L2Jpb3MvYml0Lmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvcGxsLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvaW5pdC5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3JhbW1hcC5oPgpAQCAtNDIsNiArNDEsMTQgQEAKIAogI2luY2x1ZGUgInJhbWZ1Yy5oIgogCisvKiBiaW5hcnkgZHJpdmVyIG9ubHkgZXhlY3V0ZXMgdGhpcyBwYXRoIGlmIHRoZSBjb25kaXRpb24gKGEpIGlzIHRydWUKKyAqIGZvciBhbnkgY29uZmlndXJhdGlvbiAoY29tYmluYXRpb24gb2YgcmFtbWFwK3JhbWNmZyt0aW1pbmcpIHRoYXQKKyAqIGNhbiBiZSByZWFjaGVkIG9uIGEgZ2l2ZW4gY2FyZC4gIGZvciBub3csIHdlIHdpbGwgZXhlY3V0ZSB0aGUgYnJhbmNoCisgKiB1bmNvbmRpdGlvbmFsbHkgaW4gdGhlIGhvcGUgdGhhdCBhICJmYWxzZSBldmVyeXdoZXJlIiBpbiB0aGUgYmlvcworICogdGFibGVzIGRvZXNuJ3QgYWN0dWFsbHkgbWVhbiAiZG9uJ3QgdG91Y2ggdGhpcyIuCisgKi8KKyNkZWZpbmUgTk9URTAwKGEpIDEKKwogc3RydWN0IG52ZTBfcmFtZnVjIHsKIAlzdHJ1Y3QgcmFtZnVjIGJhc2U7CiAKQEAgLTEwNCw3ICsxMTEsOSBAQAogCXN0cnVjdCByYW1mdWNfcmVnIHJfbXJbMTZdOyAvKiBNUjAgLSBNUjgsIE1SMTUgKi8KIAogCXN0cnVjdCByYW1mdWNfcmVnIHJfMHg2MmMwMDA7CisKIAlzdHJ1Y3QgcmFtZnVjX3JlZyByXzB4MTBmMjAwOworCiAJc3RydWN0IHJhbWZ1Y19yZWcgcl8weDEwZjIxMDsKIAlzdHJ1Y3QgcmFtZnVjX3JlZyByXzB4MTBmMzEwOwogCXN0cnVjdCByYW1mdWNfcmVnIHJfMHgxMGYzMTQ7CkBAIC0xMTgsMTIgKzEyNywxNyBAQAogCXN0cnVjdCByYW1mdWNfcmVnIHJfMHgxMGY2NWM7CiAJc3RydWN0IHJhbWZ1Y19yZWcgcl8weDEwZjZiYzsKIAlzdHJ1Y3QgcmFtZnVjX3JlZyByXzB4MTAwNzEwOwotCXN0cnVjdCByYW1mdWNfcmVnIHJfMHgxMGY3NTA7CisJc3RydWN0IHJhbWZ1Y19yZWcgcl8weDEwMDc1MDsKIH07CiAKIHN0cnVjdCBudmUwX3JhbSB7CiAJc3RydWN0IG5vdXZlYXVfcmFtIGJhc2U7CiAJc3RydWN0IG52ZTBfcmFtZnVjIGZ1YzsKKworCXUzMiBwYXJ0czsKKwl1MzIgcG1hc2s7CisJdTMyIHBudXRzOworCiAJaW50IGZyb207CiAJaW50IG1vZGU7CiAJaW50IE4xLCBmTjEsIE0xLCBQMTsKQEAgLTEzNCwxNyArMTQ4LDE3IEBACiAgKiBHRERSNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkCi10cmFpbihzdHJ1Y3QgbnZlMF9yYW1mdWMgKmZ1YywgdTMyIG1hZ2ljKQorbnZlMF9yYW1fdHJhaW4oc3RydWN0IG52ZTBfcmFtZnVjICpmdWMsIHUzMiBtYXNrLCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgbnZlMF9yYW0gKnJhbSA9IGNvbnRhaW5lcl9vZihmdWMsIHR5cGVvZigqcmFtKSwgZnVjKTsKLQlzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiID0gbm91dmVhdV9mYihyYW0pOwotCWNvbnN0IGludCBtYyA9IG52X3JkMzIocGZiLCAweDAyMjQzYyk7Ci0JaW50IGk7CisJdTMyIGFkZHIgPSAweDExMDk3NCwgaTsKIAotCXJhbV9tYXNrKGZ1YywgMHgxMGY5MTAsIDB4YmMwZTAwMDAsIG1hZ2ljKTsKLQlyYW1fbWFzayhmdWMsIDB4MTBmOTE0LCAweGJjMGUwMDAwLCBtYWdpYyk7Ci0JZm9yIChpID0gMDsgaSA8IG1jOyBpKyspIHsKLQkJY29uc3QgdTMyIGFkZHIgPSAweDExMDk3NCArIChpICogMHgxMDAwKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmOTEwLCBtYXNrLCBkYXRhKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmOTE0LCBtYXNrLCBkYXRhKTsKKworCWZvciAoaSA9IDA7IChkYXRhICYgMHg4MDAwMDAwMCkgJiYgaSA8IHJhbS0+cGFydHM7IGFkZHIgKz0gMHgxMDAwLCBpKyspIHsKKwkJaWYgKHJhbS0+cG1hc2sgJiAoMSA8PCBpKSkKKwkJCWNvbnRpbnVlOwogCQlyYW1fd2FpdChmdWMsIGFkZHIsIDB4MDAwMDAwMGYsIDB4MDAwMDAwMDAsIDUwMDAwMCk7CiAJfQogfQpAQCAtMTk5LDEyICsyMTMsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLXIxMzczZjRfZmluaShzdHJ1Y3QgbnZlMF9yYW1mdWMgKmZ1YywgdTMyIHJhbWNmZykKK3IxMzczZjRfZmluaShzdHJ1Y3QgbnZlMF9yYW1mdWMgKmZ1YykKIHsKIAlzdHJ1Y3QgbnZlMF9yYW0gKnJhbSA9IGNvbnRhaW5lcl9vZihmdWMsIHR5cGVvZigqcmFtKSwgZnVjKTsKLQlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHJhbSk7Ci0JdTggdjAgPSAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4YzApID4+IDY7Ci0JdTggdjEgPSAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4MzApID4+IDQ7CisJc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgKm5leHQgPSByYW0tPmJhc2UubmV4dDsKKwl1OCB2MCA9IG5leHQtPmJpb3MucmFtY2ZnXzExXzAzX2MwOworCXU4IHYxID0gbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfMzA7CiAJdTMyIHRtcDsKIAogCXRtcCA9IHJhbV9yZDMyKGZ1YywgMHgxMzczZWMpICYgfjB4MDAwMzAwMDA7CkBAIC0yMjAsMjUgKzIzNCw0NiBAQAogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MDAsIDB4MDAwMDAwMzAsICh2MCBeIHYxKSA8PCA0KTsKIH0KIAorc3RhdGljIHZvaWQKK252ZTBfcmFtX251dHMoc3RydWN0IG52ZTBfcmFtICpyYW0sIHN0cnVjdCByYW1mdWNfcmVnICpyZWcsCisJICAgICAgdTMyIF9tYXNrLCB1MzIgX2RhdGEsIHUzMiBfY29weSkKK3sKKwlzdHJ1Y3QgbnZlMF9mYl9wcml2ICpwcml2ID0gKHZvaWQgKilub3V2ZWF1X2ZiKHJhbSk7CisJc3RydWN0IHJhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjLmJhc2U7CisJdTMyIGFkZHIgPSAweDExMDAwMCArIChyZWctPmFkZHJbMF0gJiAweGZmZik7CisJdTMyIG1hc2sgPSBfbWFzayB8IF9jb3B5OworCXUzMiBkYXRhID0gKF9kYXRhICYgX21hc2spIHwgKHJlZy0+ZGF0YSAmIF9jb3B5KTsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCBhZGRyICs9IDB4MTAwMCkgeworCQlpZiAocmFtLT5wbnV0cyAmICgxIDw8IGkpKSB7CisJCQl1MzIgcHJldiA9IG52X3JkMzIocHJpdiwgYWRkcik7CisJCQl1MzIgbmV4dCA9IChwcmV2ICYgfm1hc2spIHwgZGF0YTsKKwkJCW5vdXZlYXVfbWVteF93cjMyKGZ1Yy0+bWVteCwgYWRkciwgbmV4dCk7CisJCX0KKwl9Cit9CisjZGVmaW5lIHJhbV9udXRzKHMscixtLGQsYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW52ZTBfcmFtX251dHMoKHMpLCAmKHMpLT5mdWMucl8jI3IsIChtKSwgKGQpLCAoYykpCisKIHN0YXRpYyBpbnQKIG52ZTBfcmFtX2NhbGNfZ2RkcjUoc3RydWN0IG5vdXZlYXVfZmIgKnBmYiwgdTMyIGZyZXEpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwZmIpOwogCXN0cnVjdCBudmUwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnZlMF9yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKLQljb25zdCB1MzIgcmFtbWFwID0gcmFtLT5iYXNlLnJhbW1hcC5kYXRhOwotCWNvbnN0IHUzMiByYW1jZmcgPSByYW0tPmJhc2UucmFtY2ZnLmRhdGE7Ci0JY29uc3QgdTMyIHRpbWluZyA9IHJhbS0+YmFzZS50aW1pbmcuZGF0YTsKLQlpbnQgdmMgPSAhKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDA4KTsKLQlpbnQgbXYgPSAxOyAvKlhYWCovCisJc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgKm5leHQgPSByYW0tPmJhc2UubmV4dDsKKwlpbnQgdmMgPSAhKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzA4KTsKKwlpbnQgbXYgPSAhKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzA0KTsKIAl1MzIgbWFzaywgZGF0YTsKIAogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MDgsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDApOwogCXJhbV93cjMyKGZ1YywgMHg2MmMwMDAsIDB4MGYwZjAwMDApOwogCiAJLyogTVIxOiB0dXJuIHRlcm1pbmF0aW9uIG9uIGVhcmx5LCBmb3Igc29tZSByZWFzb24uLiAqLwotCWlmICgocmFtLT5iYXNlLm1yWzFdICYgMHgwM2MpICE9IDB4MDMwKQorCWlmICgocmFtLT5iYXNlLm1yWzFdICYgMHgwM2MpICE9IDB4MDMwKSB7CiAJCXJhbV9tYXNrKGZ1YywgbXJbMV0sIDB4MDNjLCByYW0tPmJhc2UubXJbMV0gJiAweDAzYyk7CisJCXJhbV9udXRzKHJhbSwgbXJbMV0sIDB4MDNjLCByYW0tPmJhc2UubXIxX251dHMgJiAweDAzYywgMHgwMDApOworCX0KIAogCWlmICh2YyA9PSAxICYmIHJhbV9oYXZlKGZ1YywgZ3BpbzJFKSkgewogCQl1MzIgdGVtcCAgPSByYW1fbWFzayhmdWMsIGdwaW8yRSwgMHgzMDAwLCBmdWMtPnJfZnVuYzJFWzFdKTsKQEAgLTI1MCw4ICsyODUsNyBAQAogCiAJcmFtX21hc2soZnVjLCAweDEwZjIwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMCk7CiAKLQlyYW1fbWFzayhmdWMsIDB4MTBmOTE0LCAweDAxMDIwMDAwLCAweDAwMGMwMDAwKTsKLQlyYW1fbWFzayhmdWMsIDB4MTBmOTEwLCAweDAxMDIwMDAwLCAweDAwMGMwMDAwKTsKKwludmUwX3JhbV90cmFpbihmdWMsIDB4MDEwMjAwMDAsIDB4MDAwYzAwMDApOwogCiAJcmFtX3dyMzIoZnVjLCAweDEwZjIxMCwgMHgwMDAwMDAwMCk7IC8qIFJFRlJFU0hfQVVUTyA9IDAgKi8KIAlyYW1fbnNlYyhmdWMsIDEwMDApOwpAQCAtMjgwLDI4ICszMTQsMjggQEAKIAogCWlmICgxKSB7CiAJCWRhdGEgfD0gMHg4MDA4MDdlMDsKLQkJc3dpdGNoIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDMpICYgMHhjMCkgewotCQljYXNlIDB4YzA6IGRhdGEgJj0gfjB4MDAwMDAwNDA7IGJyZWFrOwotCQljYXNlIDB4ODA6IGRhdGEgJj0gfjB4MDAwMDAxMDA7IGJyZWFrOwotCQljYXNlIDB4NDA6IGRhdGEgJj0gfjB4ODAwMDAwMDA7IGJyZWFrOwotCQljYXNlIDB4MDA6IGRhdGEgJj0gfjB4MDAwMDA0MDA7IGJyZWFrOworCQlzd2l0Y2ggKG5leHQtPmJpb3MucmFtY2ZnXzExXzAzX2MwKSB7CisJCWNhc2UgMzogZGF0YSAmPSB+MHgwMDAwMDA0MDsgYnJlYWs7CisJCWNhc2UgMjogZGF0YSAmPSB+MHgwMDAwMDEwMDsgYnJlYWs7CisJCWNhc2UgMTogZGF0YSAmPSB+MHg4MDAwMDAwMDsgYnJlYWs7CisJCWNhc2UgMDogZGF0YSAmPSB+MHgwMDAwMDQwMDsgYnJlYWs7CiAJCX0KIAotCQlzd2l0Y2ggKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMykgJiAweDMwKSB7Ci0JCWNhc2UgMHgzMDogZGF0YSAmPSB+MHgwMDAwMDAyMDsgYnJlYWs7Ci0JCWNhc2UgMHgyMDogZGF0YSAmPSB+MHgwMDAwMDA4MDsgYnJlYWs7Ci0JCWNhc2UgMHgxMDogZGF0YSAmPSB+MHgwMDA4MDAwMDsgYnJlYWs7Ci0JCWNhc2UgMHgwMDogZGF0YSAmPSB+MHgwMDAwMDIwMDsgYnJlYWs7CisJCXN3aXRjaCAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfMzApIHsKKwkJY2FzZSAzOiBkYXRhICY9IH4weDAwMDAwMDIwOyBicmVhazsKKwkJY2FzZSAyOiBkYXRhICY9IH4weDAwMDAwMDgwOyBicmVhazsKKwkJY2FzZSAxOiBkYXRhICY9IH4weDAwMDgwMDAwOyBicmVhazsKKwkJY2FzZSAwOiBkYXRhICY9IH4weDAwMDAwMjAwOyBicmVhazsKIAkJfQogCX0KIAotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDIpICYgMHg4MCkKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDJfODApCiAJCW1hc2sgfD0gMHgwMzAwMDAwMDsKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAyKSAmIDB4NDApCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzQwKQogCQltYXNrIHw9IDB4MDAwMDIwMDA7Ci0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDEwKQorCWlmIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18xMCkKIAkJbWFzayB8PSAweDAwMDA0MDAwOwotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHgwOCkKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfMDgpCiAJCW1hc2sgfD0gMHgwMDAwMDAwMzsKIAllbHNlIHsKIAkJbWFzayB8PSAweDM0MDAwMDAwOwpAQCAtMzE0LDE4ICszNDgsMTggQEAKIAogCWlmIChyYW0tPmZyb20gPT0gMiAmJiByYW0tPm1vZGUgIT0gMikgewogCQlyYW1fbWFzayhmdWMsIDB4MTBmODA4LCAweDAwMDgwMDAwLCAweDAwMDAwMDAwKTsKLQkJcmFtX21hc2soZnVjLCAweDEwZjIwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCk7CisJCXJhbV9tYXNrKGZ1YywgMHgxMGYyMDAsIDB4MTgwMDgwMDAsIDB4MDAwMDgwMDApOwogCQlyYW1fbWFzayhmdWMsIDB4MTBmODAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDA0KTsKIAkJcmFtX21hc2soZnVjLCAweDEwZjgzMCwgMHgwMDAwODAwMCwgMHgwMTA0MDAxMCk7CiAJCXJhbV9tYXNrKGZ1YywgMHgxMGY4MzAsIDB4MDEwMDAwMDAsIDB4MDAwMDAwMDApOwogCQlyMTM3M2Y0X2luaXQoZnVjKTsKIAkJcmFtX21hc2soZnVjLCAweDEzNzNmMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMSk7Ci0JCXIxMzczZjRfZmluaShmdWMsIHJhbWNmZyk7CisJCXIxMzczZjRfZmluaShmdWMpOwogCQlyYW1fbWFzayhmdWMsIDB4MTBmODMwLCAweDAwYzAwMDAwLCAweDAwMjQwMDAxKTsKIAl9IGVsc2UKIAlpZiAocmFtLT5mcm9tICE9IDIgJiYgcmFtLT5tb2RlICE9IDIpIHsKIAkJcjEzNzNmNF9pbml0KGZ1Yyk7Ci0JCXIxMzczZjRfZmluaShmdWMsIHJhbWNmZyk7CisJCXIxMzczZjRfZmluaShmdWMpOwogCX0KIAogCWlmIChyYW1faGF2ZShmdWMsIGdwaW9NVikpIHsKQEAgLTMzNiw0OSArMzcwLDU0IEBACiAJCX0KIAl9CiAKLQlpZiAoIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDIpICYgMHg0MCkgfHwKLQkgICAgIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHgxMCkpIHsKKwlpZiAoIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl80MCkgfHwKKwkgICAgIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18xMCkpIHsKIAkJcmFtX21hc2soZnVjLCAweDEzMjA0MCwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCk7CiAJCXJhbV9uc2VjKGZ1YywgMjAwMDApOwogCX0KIAogCWlmIChyYW0tPmZyb20gIT0gMiAmJiByYW0tPm1vZGUgPT0gMikgeworCQlpZiAoMCAvKlhYWDogVGl0YW4gKi8pCisJCQlyYW1fbWFzayhmdWMsIDB4MTBmMjAwLCAweDE4MDAwMDAwLCAweDE4MDAwMDAwKTsKIAkJcmFtX21hc2soZnVjLCAweDEwZjgwMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMCk7CiAJCXJhbV9tYXNrKGZ1YywgMHgxMzczZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIpOwogCQlyYW1fbWFzayhmdWMsIDB4MTBmODMwLCAweDAwODAwMDAxLCAweDAwNDA4MDEwKTsKIAkJcjEzNzNmNF9pbml0KGZ1Yyk7Ci0JCXIxMzczZjRfZmluaShmdWMsIHJhbWNmZyk7CisJCXIxMzczZjRfZmluaShmdWMpOwogCQlyYW1fbWFzayhmdWMsIDB4MTBmODA4LCAweDAwMDAwMDAwLCAweDAwMDgwMDAwKTsKIAkJcmFtX21hc2soZnVjLCAweDEwZjIwMCwgMHgwMDgwODAwMCwgMHgwMDgwMDAwMCk7CiAJfSBlbHNlCiAJaWYgKHJhbS0+ZnJvbSA9PSAyICYmIHJhbS0+bW9kZSA9PSAyKSB7CiAJCXJhbV9tYXNrKGZ1YywgMHgxMGY4MDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDApOwogCQlyMTM3M2Y0X2luaXQoZnVjKTsKLQkJcjEzNzNmNF9maW5pKGZ1YywgcmFtY2ZnKTsKKwkJcjEzNzNmNF9maW5pKGZ1Yyk7CiAJfQogCiAJaWYgKHJhbS0+bW9kZSAhPSAyKSAvKlhYWCovIHsKLQkJaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDQwKQorCQlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfNDApCiAJCQlyYW1fbWFzayhmdWMsIDB4MTBmNjcwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKTsKIAl9CiAKLQlkYXRhID0gKG52X3JvMDgoYmlvcywgcmFtbWFwICsgMHgxMSkgJiAweDBjKSA+PiAyOwotCXJhbV93cjMyKGZ1YywgMHgxMGY2NWMsIDB4MDAwMDAwMTEgKiBkYXRhKTsKLQlyYW1fd3IzMihmdWMsIDB4MTBmNmI4LCAweDAxMDEwMTAxICogbnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA5KSk7Ci0JcmFtX3dyMzIoZnVjLCAweDEwZjZiYywgMHgwMTAxMDEwMSAqIG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwOSkpOworCXJhbV93cjMyKGZ1YywgMHgxMGY2NWMsIDB4MDAwMDAwMTEgKiBuZXh0LT5iaW9zLnJhbW1hcF8xMV8xMV8wYyk7CisJcmFtX3dyMzIoZnVjLCAweDEwZjZiOCwgMHgwMTAxMDEwMSAqIG5leHQtPmJpb3MucmFtY2ZnXzExXzA5KTsKKwlyYW1fd3IzMihmdWMsIDB4MTBmNmJjLCAweDAxMDEwMTAxICogbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDkpOwogCi0JZGF0YSA9IG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNCk7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MDgpKSB7Ci0JCXJhbV93cjMyKGZ1YywgMHgxMGY2OTgsIDB4MDEwMTAxMDEgKiBkYXRhKTsKLQkJcmFtX3dyMzIoZnVjLCAweDEwZjY5YywgMHgwMTAxMDEwMSAqIGRhdGEpOworCWlmICghbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfMDggJiYgIW5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzA0KSB7CisJCXJhbV93cjMyKGZ1YywgMHgxMGY2OTgsIDB4MDEwMTAxMDEgKiBuZXh0LT5iaW9zLnJhbWNmZ18xMV8wNCk7CisJCXJhbV93cjMyKGZ1YywgMHgxMGY2OWMsIDB4MDEwMTAxMDEgKiBuZXh0LT5iaW9zLnJhbWNmZ18xMV8wNCk7CisJfSBlbHNlCisJaWYgKCFuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18wOCkgeworCQlyYW1fd3IzMihmdWMsIDB4MTBmNjk4LCAweDAwMDAwMDAwKTsKKwkJcmFtX3dyMzIoZnVjLCAweDEwZjY5YywgMHgwMDAwMDAwMCk7CiAJfQogCiAJaWYgKHJhbS0+bW9kZSAhPSAyKSB7Ci0JCXUzMiB0ZW1wID0gcmFtX3JkMzIoZnVjLCAweDEwZjY5NCkgJiB+MHhmZjAwZmYwMDsKLQkJcmFtX3dyMzIoZnVjLCAweDEwZjY5NCwgdGVtcCB8ICgweDAxMDAwMTAwICogZGF0YSkpOworCQl1MzIgZGF0YSA9IDB4MDEwMDAxMDAgKiBuZXh0LT5iaW9zLnJhbWNmZ18xMV8wNDsKKwkJcmFtX251a2UoZnVjLCAweDEwZjY5NCk7CisJCXJhbV9tYXNrKGZ1YywgMHgxMGY2OTQsIDB4ZmYwMGZmMDAsIGRhdGEpOwogCX0KIAotCWlmIChyYW0tPm1vZGUgPT0gMiAmJiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA4KSAmIDB4MTApKQorCWlmIChyYW0tPm1vZGUgPT0gMiAmJiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDhfMTApKQogCQlkYXRhID0gMHgwMDAwMDA4MDsKIAllbHNlCiAJCWRhdGEgPSAweDAwMDAwMDAwOwpAQCAtMzg2LDE5ICs0MjUsMTkgQEAKIAogCW1hc2sgPSAweDAwMDcwMDAwOwogCWRhdGEgPSAweDAwMDAwMDAwOwotCWlmICghKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDgwKSkKKwlpZiAoIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl84MCkpCiAJCWRhdGEgfD0gMHgwMzAwMDAwMDsKLQlpZiAoIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDIpICYgMHg0MCkpCisJaWYgKCEobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDJfNDApKQogCQlkYXRhIHw9IDB4MDAwMDIwMDA7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MTApKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzEwKSkKIAkJZGF0YSB8PSAweDAwMDA0MDAwOwotCWlmICghKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDA4KSkKKwlpZiAoIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18wOCkpCiAJCWRhdGEgfD0gMHgwMDAwMDAwMzsKIAllbHNlCiAJCWRhdGEgfD0gMHg3NDAwMDAwMDsKIAlyYW1fbWFzayhmdWMsIDB4MTBmODI0LCBtYXNrLCBkYXRhKTsKIAotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDEpICYgMHgwOCkKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMDgpCiAJCWRhdGEgPSAweDAwMDAwMDAwOwogCWVsc2UKIAkJZGF0YSA9IDB4MDAwMDEwMDA7CkBAIC00MDksNjEgKzQ0OCw5MCBAQAogCQlyYW1fbWFzayhmdWMsIDB4MTBmNjcwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKIAl9CiAKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA4KSAmIDB4MDEpCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA4XzAxKQogCQlkYXRhID0gMHgwMDEwMDAwMDsKIAllbHNlCiAJCWRhdGEgPSAweDAwMDAwMDAwOwogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MmMsIDB4MDAxMDAwMDAsIGRhdGEpOwogCiAJZGF0YSA9IDB4MDAwMDAwMDA7Ci0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwOCkgJiAweDA4KQorCWlmIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wOF8wOCkKIAkJZGF0YSB8PSAweDAwMDAyMDAwOwotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDgpICYgMHgwNCkKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDhfMDQpCiAJCWRhdGEgfD0gMHgwMDAwMTAwMDsKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA4KSAmIDB4MDIpCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA4XzAyKQogCQlkYXRhIHw9IDB4MDAwMDQwMDA7CiAJcmFtX21hc2soZnVjLCAweDEwZjgzMCwgMHgwMDAwNzAwMCwgZGF0YSk7CiAKIAkvKiBQRkIgdGltaW5nICovCi0JcmFtX21hc2soZnVjLCAweDEwZjI0OCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDI4KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI5MCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDAwKSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI5NCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDA0KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI5OCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDA4KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI5YywgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDBjKSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJhMCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDEwKSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJhNCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDE0KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJhOCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDE4KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJhYywgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDFjKSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJjYywgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDIwKSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjJlOCwgMHhmZmZmZmZmZiwgbnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDI0KSk7CisJcmFtX21hc2soZnVjLCAweDEwZjI0OCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbMTBdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjkwLCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1swXSk7CisJcmFtX21hc2soZnVjLCAweDEwZjI5NCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbMV0pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyOTgsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzJdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjljLCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1szXSk7CisJcmFtX21hc2soZnVjLCAweDEwZjJhMCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbNF0pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyYTQsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzVdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMmE4LCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1s2XSk7CisJcmFtX21hc2soZnVjLCAweDEwZjJhYywgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbN10pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyY2MsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzhdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMmU4LCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1s5XSk7CiAKLQlkYXRhID0gKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDAzKSA8PCA4OwotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDEpICYgMHgxMCkKLQkJZGF0YSB8PSAweDcwMDAwMDAwOwotCXJhbV9tYXNrKGZ1YywgMHgxMGY2MDQsIDB4NzAwMDAzMDAsIGRhdGEpOworCWRhdGEgPSBtYXNrID0gMHgwMDAwMDAwMDsKKwlpZiAoTk9URTAwKHJhbWNmZ18wOF8yMCkpIHsKKwkJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA4XzIwKQorCQkJZGF0YSB8PSAweDAxMDAwMDAwOworCQltYXNrIHw9IDB4MDEwMDAwMDA7CisJfQorCXJhbV9tYXNrKGZ1YywgMHgxMGYyMDAsIG1hc2ssIGRhdGEpOwogCi0JZGF0YSA9IChudl9ybzA4KGJpb3MsIHRpbWluZyArIDB4MzApICYgMHgwNykgPDwgMjg7Ci0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMSkgJiAweDAxKQotCQlkYXRhIHw9IDB4MDAwMDAxMDA7Ci0JcmFtX21hc2soZnVjLCAweDEwZjYxNCwgMHg3MDAwMDAwMCwgZGF0YSk7CisJZGF0YSA9IG1hc2sgPSAweDAwMDAwMDAwOworCWlmIChOT1RFMDAocmFtY2ZnXzAyXzAzICE9IDApKSB7CisJCWRhdGEgfD0gKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzAzKSA8PCA4OworCQltYXNrIHw9IDB4MDAwMDAzMDA7CisJfQorCWlmIChOT1RFMDAocmFtY2ZnXzAxXzEwKSkgeworCQlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMTApCisJCQlkYXRhIHw9IDB4NzAwMDAwMDA7CisJCW1hc2sgfD0gMHg3MDAwMDAwMDsKKwl9CisJcmFtX21hc2soZnVjLCAweDEwZjYwNCwgbWFzaywgZGF0YSk7CiAKLQlkYXRhID0gKG52X3JvMDgoYmlvcywgdGltaW5nICsgMHgzMCkgJiAweDA3KSA8PCAyODsKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAxKSAmIDB4MDIpCi0JCWRhdGEgfD0gMHgwMDAwMDEwMDsKLQlyYW1fbWFzayhmdWMsIDB4MTBmNjEwLCAweDcwMDAwMDAwLCBkYXRhKTsKKwlkYXRhID0gbWFzayA9IDB4MDAwMDAwMDA7CisJaWYgKE5PVEUwMCh0aW1pbmdfMzBfMDcgIT0gMCkpIHsKKwkJZGF0YSB8PSAobmV4dC0+Ymlvcy50aW1pbmdfMjBfMzBfMDcpIDw8IDI4OworCQltYXNrIHw9IDB4NzAwMDAwMDA7CisJfQorCWlmIChOT1RFMDAocmFtY2ZnXzAxXzAxKSkgeworCQlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMDEpCisJCQlkYXRhIHw9IDB4MDAwMDAxMDA7CisJCW1hc2sgfD0gMHgwMDAwMDEwMDsKKwl9CisJcmFtX21hc2soZnVjLCAweDEwZjYxNCwgbWFzaywgZGF0YSk7CisKKwlkYXRhID0gbWFzayA9IDB4MDAwMDAwMDA7CisJaWYgKE5PVEUwMCh0aW1pbmdfMzBfMDcgIT0gMCkpIHsKKwkJZGF0YSB8PSAobmV4dC0+Ymlvcy50aW1pbmdfMjBfMzBfMDcpIDw8IDI4OworCQltYXNrIHw9IDB4NzAwMDAwMDA7CisJfQorCWlmIChOT1RFMDAocmFtY2ZnXzAxXzAyKSkgeworCQlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMDIpCisJCQlkYXRhIHw9IDB4MDAwMDAxMDA7CisJCW1hc2sgfD0gMHgwMDAwMDEwMDsKKwl9CisJcmFtX21hc2soZnVjLCAweDEwZjYxMCwgbWFzaywgZGF0YSk7CiAKIAltYXNrID0gMHgzM2YwMDAwMDsKIAlkYXRhID0gMHgwMDAwMDAwMDsKLQlpZiAoIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDEpICYgMHgwNCkpCisJaWYgKCEobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMDQpKQogCQlkYXRhIHw9IDB4MjAyMDAwMDA7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4ODApKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzgwKSkKIAkJZGF0YSB8PSAweDEyODAwMDAwOwogCS8qWFhYOiBzZWUgbm90ZSBhYm92ZSBhYm91dCB0aGVyZSBwcm9iYWJseSBiZWluZyBzb21lIGNvbmRpdGlvbgogCSAqICAgICBmb3IgdGhlIDEwZjgyNCBzdHVmZiB0aGF0IHVzZXMgcmFtY2ZnIDMuLi4KIAkgKi8KLQlpZiAoIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDMpICYgMHhmMCkpIHsKLQkJaWYgKG52X3JvMDgoYmlvcywgcmFtbWFwICsgMHgwOCkgJiAweDBjKSB7Ci0JCQlpZiAoIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHg4MCkpCisJaWYgKCAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfZjApKSB7CisJCWlmIChuZXh0LT5iaW9zLnJhbW1hcF8xMV8wOF8wYykgeworCQkJaWYgKCEobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfODApKQogCQkJCW1hc2sgfD0gMHgwMDAwMDAyMDsKIAkJCWVsc2UKIAkJCQlkYXRhIHw9IDB4MDAwMDAwMjA7CkBAIC00NzYsNDkgKzU0NCw1MyBAQAogCiAJcmFtX21hc2soZnVjLCAweDEwZjgwOCwgbWFzaywgZGF0YSk7CiAKLQlkYXRhID0gbnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4MGY7Ci0JcmFtX3dyMzIoZnVjLCAweDEwZjg3MCwgMHgxMTExMTExMSAqIGRhdGEpOworCXJhbV93cjMyKGZ1YywgMHgxMGY4NzAsIDB4MTExMTExMTEgKiBuZXh0LT5iaW9zLnJhbWNmZ18xMV8wM18wZik7CiAKLQlkYXRhID0gbnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAyKSAmIDB4MDM7Ci0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMSkgJiAweDEwKQotCQlkYXRhIHw9IDB4MDAwMDAwMDQ7Ci0JaWYgKChudl9yZDMyKGJpb3MsIDB4MTAwNzcwKSAmIDB4MDAwMDAwMDQpICE9IChkYXRhICYgMHgwMDAwMDAwNCkpIHsKLQkJcmFtX3dyMzIoZnVjLCAweDEwZjc1MCwgMHgwNDAwMDAwOSk7CisJZGF0YSA9IG1hc2sgPSAweDAwMDAwMDAwOworCWlmIChOT1RFMDAocmFtY2ZnXzAyXzAzICE9IDApKSB7CisJCWRhdGEgfD0gbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDJfMDM7CisJCW1hc2sgfD0gMHgwMDAwMDAwMzsKKwl9CisJaWYgKE5PVEUwMChyYW1jZmdfMDFfMTApKSB7CisJCWlmIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMV8xMCkKKwkJCWRhdGEgfD0gMHgwMDAwMDAwNDsKKwkJbWFzayB8PSAweDAwMDAwMDA0OworCX0KKworCWlmICgocmFtX21hc2soZnVjLCAweDEwMDc3MCwgbWFzaywgZGF0YSkgJiBtYXNrICYgNCkgIT0gKGRhdGEgJiA0KSkgeworCQlyYW1fbWFzayhmdWMsIDB4MTAwNzUwLCAweDAwMDAwMDA4LCAweDAwMDAwMDA4KTsKIAkJcmFtX3dyMzIoZnVjLCAweDEwMDcxMCwgMHgwMDAwMDAwMCk7CiAJCXJhbV93YWl0KGZ1YywgMHgxMDA3MTAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDIwMDAwMCk7CiAJfQotCXJhbV9tYXNrKGZ1YywgMHgxMDA3NzAsIDB4MDAwMDAwMDcsIGRhdGEpOwogCi0JZGF0YSA9IChudl9ybzA4KGJpb3MsIHRpbWluZyArIDB4MzApICYgMHgwNykgPDwgODsKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAxKSAmIDB4MDEpCisJZGF0YSA9IChuZXh0LT5iaW9zLnRpbWluZ18yMF8zMF8wNykgPDwgODsKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDFfMDEpCiAJCWRhdGEgfD0gMHg4MDAwMDAwMDsKIAlyYW1fbWFzayhmdWMsIDB4MTAwNzc4LCAweDAwMDAwNzAwLCBkYXRhKTsKIAotCWRhdGEgPSBudl9ybzE2KGJpb3MsIHRpbWluZyArIDB4MmMpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyNTAsIDB4MDAwMDAzZjAsIChkYXRhICYgMHgwMDNmKSA8PCAgNCk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI0YywgMHg3ZjAwMDAwMCwgKGRhdGEgJiAweDFmYzApIDw8IDE4KTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjUwLCAweDAwMDAwM2YwLCBuZXh0LT5iaW9zLnRpbWluZ18yMF8yY18wMDNmIDw8IDQpOworCWRhdGEgPSAobmV4dC0+Ymlvcy50aW1pbmdbMTBdICYgMHg3ZjAwMDAwMCkgPj4gMjQ7CisJaWYgKGRhdGEgPCBuZXh0LT5iaW9zLnRpbWluZ18yMF8yY18xZmMwKQorCQlkYXRhID0gbmV4dC0+Ymlvcy50aW1pbmdfMjBfMmNfMWZjMDsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjRjLCAweDdmMDAwMDAwLCBkYXRhIDw8IDI0KTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjI0LCAweDAwMWYwMDAwLCBuZXh0LT5iaW9zLnRpbWluZ18yMF8zMF9mOCA8PCAxNik7CiAKLQlkYXRhID0gbnZfcm8wOChiaW9zLCB0aW1pbmcgKyAweDMwKTsKLQlyYW1fbWFzayhmdWMsIDB4MTBmMjI0LCAweDAwMWYwMDAwLCAoZGF0YSAmIDB4ZjgpIDw8IDEzKTsKLQotCWRhdGEgPSBudl9ybzE2KGJpb3MsIHRpbWluZyArIDB4MzEpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGZlYzQsIDB4MDQxZTBmMDcsIChkYXRhICYgMHgwODAwKSA8PCAxNSB8Ci0JCQkJCSAgICAoZGF0YSAmIDB4MDc4MCkgPDwgMTAgfAotCQkJCQkgICAgKGRhdGEgJiAweDAwNzgpIDw8ICA1IHwKLQkJCQkJICAgIChkYXRhICYgMHgwMDA3KSk7Ci0JcmFtX21hc2soZnVjLCAweDEwZmVjOCwgMHgwMDAwMDAyNywgKGRhdGEgJiAweDgwMDApID4+IDEwIHwKLQkJCQkJICAgIChkYXRhICYgMHg3MDAwKSA+PiAxMik7CisJcmFtX21hc2soZnVjLCAweDEwZmVjNCwgMHgwNDFlMGYwNywgbmV4dC0+Ymlvcy50aW1pbmdfMjBfMzFfMDgwMCA8PCAyNiB8CisJCQkJCSAgICBuZXh0LT5iaW9zLnRpbWluZ18yMF8zMV8wNzgwIDw8IDE3IHwKKwkJCQkJICAgIG5leHQtPmJpb3MudGltaW5nXzIwXzMxXzAwNzggPDwgOCB8CisJCQkJCSAgICBuZXh0LT5iaW9zLnRpbWluZ18yMF8zMV8wMDA3KTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmZWM4LCAweDAwMDAwMDI3LCBuZXh0LT5iaW9zLnRpbWluZ18yMF8zMV84MDAwIDw8IDUgfAorCQkJCQkgICAgbmV4dC0+Ymlvcy50aW1pbmdfMjBfMzFfNzAwMCk7CiAKIAlyYW1fd3IzMihmdWMsIDB4MTBmMDkwLCAweDQwMDAwMDdlKTsKLQlyYW1fbnNlYyhmdWMsIDEwMDApOworCXJhbV9uc2VjKGZ1YywgMjAwMCk7CiAJcmFtX3dyMzIoZnVjLCAweDEwZjMxNCwgMHgwMDAwMDAwMSk7IC8qIFBSRUNIQVJHRSAqLwogCXJhbV93cjMyKGZ1YywgMHgxMGYzMTAsIDB4MDAwMDAwMDEpOyAvKiBSRUZSRVNIICovCi0JcmFtX25zZWMoZnVjLCAyMDAwKTsKIAlyYW1fd3IzMihmdWMsIDB4MTBmMjEwLCAweDgwMDAwMDAwKTsgLyogUkVGUkVTSF9BVVRPID0gMSAqLwogCi0JaWYgKChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDgpICYgMHgxMCkgJiYgKHJhbS0+bW9kZSA9PSAyKSAvKlhYWCovKSB7CisJaWYgKChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wOF8xMCkgJiYgKHJhbS0+bW9kZSA9PSAyKSAvKlhYWCovKSB7CiAJCXUzMiB0ZW1wID0gcmFtX21hc2soZnVjLCAweDEwZjI5NCwgMHhmZjAwMDAwMCwgMHgyNDAwMDAwMCk7Ci0JCXRyYWluKGZ1YywgMHhhNDAxMDAwMCk7IC8qWFhYKi8KKwkJbnZlMF9yYW1fdHJhaW4oZnVjLCAweGJjMGUwMDAwLCAweGE0MDEwMDAwKTsgLypYWFgqLwogCQlyYW1fbnNlYyhmdWMsIDEwMDApOwogCQlyYW1fd3IzMihmdWMsIDB4MTBmMjk0LCB0ZW1wKTsKIAl9CkBAIC01MjgsNyArNjAwLDcgQEAKIAlyYW1fbWFzayhmdWMsIG1yWzhdLCAweGZmZiwgcmFtLT5iYXNlLm1yWzhdKTsKIAlyYW1fbnNlYyhmdWMsIDEwMDApOwogCXJhbV9tYXNrKGZ1YywgbXJbMV0sIDB4ZmZmLCByYW0tPmJhc2UubXJbMV0pOwotCXJhbV9tYXNrKGZ1YywgbXJbNV0sIDB4ZmZmLCByYW0tPmJhc2UubXJbNV0pOworCXJhbV9tYXNrKGZ1YywgbXJbNV0sIDB4ZmZmLCByYW0tPmJhc2UubXJbNV0gJiB+MHgwMDQpOyAvKiBMUDMgbGF0ZXIgKi8KIAlyYW1fbWFzayhmdWMsIG1yWzZdLCAweGZmZiwgcmFtLT5iYXNlLm1yWzZdKTsKIAlyYW1fbWFzayhmdWMsIG1yWzddLCAweGZmZiwgcmFtLT5iYXNlLm1yWzddKTsKIApAQCAtNTQ0LDEyICs2MTYsMTMgQEAKIAlyYW1fd3IzMihmdWMsIDB4MTBmMzE4LCAweDAwMDAwMDAxKTsgLyogTk9QPyAqLwogCXJhbV9tYXNrKGZ1YywgMHgxMGYyMDAsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOwogCXJhbV9uc2VjKGZ1YywgMTAwMCk7CisJcmFtX251dHMocmFtLCAweDEwZjIwMCwgMHgxODgwODgwMCwgMHgwMDAwMDAwMCwgMHgxODgwODgwMCk7CiAKIAlkYXRhICA9IHJhbV9yZDMyKGZ1YywgMHgxMGY5NzgpOwogCWRhdGEgJj0gfjB4MDAwNDYxNDQ7CiAJZGF0YSB8PSAgMHgwMDAwMDAwYjsKLQlpZiAoIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHgwOCkpIHsKLQkJaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MDQpKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzA4KSkgeworCQlpZiAoIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18wNCkpCiAJCQlkYXRhIHw9IDB4MDAwMDIwMGM7CiAJCWVsc2UKIAkJCWRhdGEgfD0gMHgwMDAwMDAwMDsKQEAgLTU2Myw0NCArNjM2LDQzIEBACiAJCXJhbV93cjMyKGZ1YywgMHgxMGY4MzAsIGRhdGEpOwogCX0KIAotCWlmICghKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDA4KSkgeworCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzA4KSkgewogCQlkYXRhID0gMHg4ODAyMDAwMDsKLQkJaWYgKCAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MDQpKQorCQlpZiAoIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN18wNCkpCiAJCQlkYXRhIHw9IDB4MTAwMDAwMDA7Ci0JCWlmICghKG52X3JvMDgoYmlvcywgcmFtbWFwICsgMHgwOCkgJiAweDEwKSkKKwkJaWYgKCEobmV4dC0+Ymlvcy5yYW1tYXBfMTFfMDhfMTApKQogCQkJZGF0YSB8PSAweDAwMDgwMDAwOwogCX0gZWxzZSB7CiAJCWRhdGEgPSAweGE0MGUwMDAwOwogCX0KLQl0cmFpbihmdWMsIGRhdGEpOwotCXJhbV9uc2VjKGZ1YywgMTAwMCk7CisJbnZlMF9yYW1fdHJhaW4oZnVjLCAweGJjMGYwMDAwLCBkYXRhKTsKKwlpZiAoMSkgLyogWFhYOiBub3QgYWx3YXlzPyAqLworCQlyYW1fbnNlYyhmdWMsIDEwMDApOwogCiAJaWYgKHJhbS0+bW9kZSA9PSAyKSB7IC8qWFhYKi8KIAkJcmFtX21hc2soZnVjLCAweDEwZjgwMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCk7CiAJfQogCi0JLyogTVI1OiAocmUpZW5hYmxlIExQMyBpZiBuZWNlc3NhcnkKLQkgKiBYWFg6IG5lZWQgdG8gZmluZCB0aGUgc3dpdGNoLCBrZWVwaW5nIG9mZiBmb3Igbm93Ci0JICovCi0JcmFtX21hc2soZnVjLCBtcls1XSwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMCk7CisJLyogTFAzICovCisJaWYgKHJhbV9tYXNrKGZ1YywgbXJbNV0sIDB4MDA0LCByYW0tPmJhc2UubXJbNV0pICE9IHJhbS0+YmFzZS5tcls1XSkKKwkJcmFtX25zZWMoZnVjLCAxMDAwKTsKIAogCWlmIChyYW0tPm1vZGUgIT0gMikgewogCQlyYW1fbWFzayhmdWMsIDB4MTBmODMwLCAweDAxMDAwMDAwLCAweDAxMDAwMDAwKTsKIAkJcmFtX21hc2soZnVjLCAweDEwZjgzMCwgMHgwMTAwMDAwMCwgMHgwMDAwMDAwMCk7CiAJfQogCi0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDAyKSB7Ci0JCXJhbV9tYXNrKGZ1YywgMHgxMGY5MTAsIDB4ODAwMjAwMDAsIDB4MDEwMDAwMDApOwotCQlyYW1fbWFzayhmdWMsIDB4MTBmOTE0LCAweDgwMDIwMDAwLCAweDAxMDAwMDAwKTsKLQl9CisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzAyKQorCQludmUwX3JhbV90cmFpbihmdWMsIDB4ODAwMjAwMDAsIDB4MDEwMDAwMDApOwogCiAJcmFtX3dyMzIoZnVjLCAweDYyYzAwMCwgMHgwZjBmMGYwMCk7CiAKLQlpZiAobnZfcm8wOChiaW9zLCByYW1tYXAgKyAweDA4KSAmIDB4MDEpCisJaWYgKG5leHQtPmJpb3MucmFtbWFwXzExXzA4XzAxKQogCQlkYXRhID0gMHgwMDAwMDgwMDsKIAllbHNlCiAJCWRhdGEgPSAweDAwMDAwMDAwOwogCXJhbV9tYXNrKGZ1YywgMHgxMGYyMDAsIDB4MDAwMDA4MDAsIGRhdGEpOworCXJhbV9udXRzKHJhbSwgMHgxMGYyMDAsIDB4MTg4MDg4MDAsIGRhdGEsIDB4MTg4MDg4MDApOwogCXJldHVybiAwOwogfQogCkBAIC02MTEsMTcgKzY4MywxNCBAQAogc3RhdGljIGludAogbnZlMF9yYW1fY2FsY19zZGRyMyhzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiLCB1MzIgZnJlcSkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHBmYik7CiAJc3RydWN0IG52ZTBfcmFtICpyYW0gPSAodm9pZCAqKXBmYi0+cmFtOwogCXN0cnVjdCBudmUwX3JhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjOwogCWNvbnN0IHUzMiByY29lZiA9ICgoICByYW0tPlAxIDw8IDE2KSB8IChyYW0tPk4xIDw8IDgpIHwgcmFtLT5NMSk7CiAJY29uc3QgdTMyIHJ1bmswID0gcmFtLT5mTjEgPDwgMTY7CiAJY29uc3QgdTMyIHJ1bmsxID0gcmFtLT5mTjE7Ci0JY29uc3QgdTMyIHJhbW1hcCA9IHJhbS0+YmFzZS5yYW1tYXAuZGF0YTsKLQljb25zdCB1MzIgcmFtY2ZnID0gcmFtLT5iYXNlLnJhbWNmZy5kYXRhOwotCWNvbnN0IHUzMiB0aW1pbmcgPSByYW0tPmJhc2UudGltaW5nLmRhdGE7Ci0JaW50IHZjID0gIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDIpICYgMHgwOCk7Ci0JaW50IG12ID0gMTsgLypYWFgqLworCXN0cnVjdCBub3V2ZWF1X3JhbV9kYXRhICpuZXh0ID0gcmFtLT5iYXNlLm5leHQ7CisJaW50IHZjID0gIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl8wOCk7CisJaW50IG12ID0gIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl8wNCk7CiAJdTMyIG1hc2ssIGRhdGE7CiAKIAlyYW1fbWFzayhmdWMsIDB4MTBmODA4LCAweDQwMDAwMDAwLCAweDQwMDAwMDAwKTsKQEAgLTYzNiw3ICs3MDUsNyBAQAogCX0KIAogCXJhbV9tYXNrKGZ1YywgMHgxMGYyMDAsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMDApOwotCWlmICgobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4ZjApKQorCWlmICgobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfZjApKQogCQlyYW1fbWFzayhmdWMsIDB4MTBmODA4LCAweDA0MDAwMDAwLCAweDA0MDAwMDAwKTsKIAogCXJhbV93cjMyKGZ1YywgMHgxMGYzMTQsIDB4MDAwMDAwMDEpOyAvKiBQUkVDSEFSR0UgKi8KQEAgLTY2MSwyOCArNzMwLDI4IEBACiAJaWYgKDEpIHsKIAkJbWFzayB8PSAweDgwMDgwN2UwOwogCQlkYXRhIHw9IDB4ODAwODA3ZTA7Ci0JCXN3aXRjaCAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4YzApIHsKLQkJY2FzZSAweGMwOiBkYXRhICY9IH4weDAwMDAwMDQwOyBicmVhazsKLQkJY2FzZSAweDgwOiBkYXRhICY9IH4weDAwMDAwMTAwOyBicmVhazsKLQkJY2FzZSAweDQwOiBkYXRhICY9IH4weDgwMDAwMDAwOyBicmVhazsKLQkJY2FzZSAweDAwOiBkYXRhICY9IH4weDAwMDAwNDAwOyBicmVhazsKKwkJc3dpdGNoIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wM19jMCkgeworCQljYXNlIDM6IGRhdGEgJj0gfjB4MDAwMDAwNDA7IGJyZWFrOworCQljYXNlIDI6IGRhdGEgJj0gfjB4MDAwMDAxMDA7IGJyZWFrOworCQljYXNlIDE6IGRhdGEgJj0gfjB4ODAwMDAwMDA7IGJyZWFrOworCQljYXNlIDA6IGRhdGEgJj0gfjB4MDAwMDA0MDA7IGJyZWFrOwogCQl9CiAKLQkJc3dpdGNoIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDMpICYgMHgzMCkgewotCQljYXNlIDB4MzA6IGRhdGEgJj0gfjB4MDAwMDAwMjA7IGJyZWFrOwotCQljYXNlIDB4MjA6IGRhdGEgJj0gfjB4MDAwMDAwODA7IGJyZWFrOwotCQljYXNlIDB4MTA6IGRhdGEgJj0gfjB4MDAwODAwMDA7IGJyZWFrOwotCQljYXNlIDB4MDA6IGRhdGEgJj0gfjB4MDAwMDAyMDA7IGJyZWFrOworCQlzd2l0Y2ggKG5leHQtPmJpb3MucmFtY2ZnXzExXzAzXzMwKSB7CisJCWNhc2UgMzogZGF0YSAmPSB+MHgwMDAwMDAyMDsgYnJlYWs7CisJCWNhc2UgMjogZGF0YSAmPSB+MHgwMDAwMDA4MDsgYnJlYWs7CisJCWNhc2UgMTogZGF0YSAmPSB+MHgwMDA4MDAwMDsgYnJlYWs7CisJCWNhc2UgMDogZGF0YSAmPSB+MHgwMDAwMDIwMDsgYnJlYWs7CiAJCX0KIAl9CiAKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAyKSAmIDB4ODApCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzgwKQogCQltYXNrIHw9IDB4MDMwMDAwMDA7Ci0JaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDQwKQorCWlmIChuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl80MCkKIAkJbWFzayB8PSAweDAwMDAyMDAwOwotCWlmIChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHgxMCkKKwlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfMTApCiAJCW1hc2sgfD0gMHgwMDAwNDAwMDsKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MDgpCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzA4KQogCQltYXNrIHw9IDB4MDAwMDAwMDM7CiAJZWxzZQogCQltYXNrIHw9IDB4MTQwMDAwMDA7CkBAIC02OTIsNyArNzYxLDcgQEAKIAogCXJhbV9tYXNrKGZ1YywgMHgxMzczZjQsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMTApOwogCWRhdGEgID0gcmFtX3JkMzIoZnVjLCAweDEzNzNlYykgJiB+MHgwMDAzMDAwMDsKLQlkYXRhIHw9IChudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDMpICYgMHgzMCkgPDwgMTI7CisJZGF0YSB8PSAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfMzApIDw8IDEyOwogCXJhbV93cjMyKGZ1YywgMHgxMzczZWMsIGRhdGEpOwogCXJhbV9tYXNrKGZ1YywgMHgxMzczZjQsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDApOwogCXJhbV9tYXNrKGZ1YywgMHgxMzczZjQsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDApOwpAQCAtNzI0LDY4ICs3OTMsNjcgQEAKIAkJfQogCX0KIAotCWlmICggKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDQwKSB8fAotCSAgICAgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDEwKSkgeworCWlmICggKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzQwKSB8fAorCSAgICAgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzEwKSkgewogCQlyYW1fbWFzayhmdWMsIDB4MTMyMDQwLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwKTsKIAkJcmFtX25zZWMoZnVjLCAyMDAwMCk7CiAJfQogCiAJaWYgKHJhbS0+bW9kZSAhPSAyKSAvKlhYWCovIHsKLQkJaWYgKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDQwKQorCQlpZiAobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfNDApCiAJCQlyYW1fbWFzayhmdWMsIDB4MTBmNjcwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKTsKIAl9CiAKLQlkYXRhID0gKG52X3JvMDgoYmlvcywgcmFtbWFwICsgMHgxMSkgJiAweDBjKSA+PiAyOwotCXJhbV93cjMyKGZ1YywgMHgxMGY2NWMsIDB4MDAwMDAwMTEgKiBkYXRhKTsKLQlyYW1fd3IzMihmdWMsIDB4MTBmNmI4LCAweDAxMDEwMTAxICogbnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA5KSk7Ci0JcmFtX3dyMzIoZnVjLCAweDEwZjZiYywgMHgwMTAxMDEwMSAqIG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwOSkpOworCXJhbV93cjMyKGZ1YywgMHgxMGY2NWMsIDB4MDAwMDAwMTEgKiBuZXh0LT5iaW9zLnJhbW1hcF8xMV8xMV8wYyk7CisJcmFtX3dyMzIoZnVjLCAweDEwZjZiOCwgMHgwMTAxMDEwMSAqIG5leHQtPmJpb3MucmFtY2ZnXzExXzA5KTsKKwlyYW1fd3IzMihmdWMsIDB4MTBmNmJjLCAweDAxMDEwMTAxICogbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDkpOwogCiAJbWFzayA9IDB4MDAwMTAwMDA7CiAJZGF0YSA9IDB4MDAwMDAwMDA7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAyKSAmIDB4ODApKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzAyXzgwKSkKIAkJZGF0YSB8PSAweDAzMDAwMDAwOwotCWlmICghKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMikgJiAweDQwKSkKKwlpZiAoIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wMl80MCkpCiAJCWRhdGEgfD0gMHgwMDAwMjAwMDsKLQlpZiAoIShudl9ybzA4KGJpb3MsIHJhbWNmZyArIDB4MDcpICYgMHgxMCkpCisJaWYgKCEobmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDdfMTApKQogCQlkYXRhIHw9IDB4MDAwMDQwMDA7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4MDgpKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzA4KSkKIAkJZGF0YSB8PSAweDAwMDAwMDAzOwogCWVsc2UKIAkJZGF0YSB8PSAweDE0MDAwMDAwOwogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MjQsIG1hc2ssIGRhdGEpOwogCXJhbV9uc2VjKGZ1YywgMTAwMCk7CiAKLQlpZiAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA4KSAmIDB4MDEpCisJaWYgKG5leHQtPmJpb3MucmFtY2ZnXzExXzA4XzAxKQogCQlkYXRhID0gMHgwMDEwMDAwMDsKIAllbHNlCiAJCWRhdGEgPSAweDAwMDAwMDAwOwogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MmMsIDB4MDAxMDAwMDAsIGRhdGEpOwogCiAJLyogUEZCIHRpbWluZyAqLwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyNDgsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgyOCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyOTAsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgwMCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyOTQsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgwNCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyOTgsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgwOCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyOWMsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgwYykpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyYTAsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgxMCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyYTQsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgxNCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyYTgsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgxOCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyYWMsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgxYykpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyY2MsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgyMCkpOwotCXJhbV9tYXNrKGZ1YywgMHgxMGYyZTgsIDB4ZmZmZmZmZmYsIG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgyNCkpOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyNDgsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzEwXSk7CisJcmFtX21hc2soZnVjLCAweDEwZjI5MCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbMF0pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyOTQsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzFdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjk4LCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1syXSk7CisJcmFtX21hc2soZnVjLCAweDEwZjI5YywgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbM10pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyYTAsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzRdKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMmE0LCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1s1XSk7CisJcmFtX21hc2soZnVjLCAweDEwZjJhOCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbNl0pOworCXJhbV9tYXNrKGZ1YywgMHgxMGYyYWMsIDB4ZmZmZmZmZmYsIG5leHQtPmJpb3MudGltaW5nWzddKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMmNjLCAweGZmZmZmZmZmLCBuZXh0LT5iaW9zLnRpbWluZ1s4XSk7CisJcmFtX21hc2soZnVjLCAweDEwZjJlOCwgMHhmZmZmZmZmZiwgbmV4dC0+Ymlvcy50aW1pbmdbOV0pOwogCiAJbWFzayA9IDB4MzNmMDAwMDA7CiAJZGF0YSA9IDB4MDAwMDAwMDA7Ci0JaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAxKSAmIDB4MDQpKQorCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzAxXzA0KSkKIAkJZGF0YSB8PSAweDIwMjAwMDAwOwotCWlmICghKG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwNykgJiAweDgwKSkKKwlpZiAoIShuZXh0LT5iaW9zLnJhbWNmZ18xMV8wN184MCkpCiAJCWRhdGEgfD0gMHgxMjgwMDAwMDsKIAkvKlhYWDogc2VlIG5vdGUgYWJvdmUgYWJvdXQgdGhlcmUgcHJvYmFibHkgYmVpbmcgc29tZSBjb25kaXRpb24KIAkgKiAgICAgZm9yIHRoZSAxMGY4MjQgc3R1ZmYgdGhhdCB1c2VzIHJhbWNmZyAzLi4uCiAJICovCi0JaWYgKCAobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDAzKSAmIDB4ZjApKSB7Ci0JCWlmIChudl9ybzA4KGJpb3MsIHJhbW1hcCArIDB4MDgpICYgMHgwYykgewotCQkJaWYgKCEobnZfcm8wOChiaW9zLCByYW1jZmcgKyAweDA3KSAmIDB4ODApKQorCWlmICggKG5leHQtPmJpb3MucmFtY2ZnXzExXzAzX2YwKSkgeworCQlpZiAobmV4dC0+Ymlvcy5yYW1tYXBfMTFfMDhfMGMpIHsKKwkJCWlmICghKG5leHQtPmJpb3MucmFtY2ZnXzExXzA3XzgwKSkKIAkJCQltYXNrIHw9IDB4MDAwMDAwMjA7CiAJCQllbHNlCiAJCQkJZGF0YSB8PSAweDAwMDAwMDIwOwpAQCAtNzk5LDIxICs4NjcsMTYgQEAKIAogCXJhbV9tYXNrKGZ1YywgMHgxMGY4MDgsIG1hc2ssIGRhdGEpOwogCi0JZGF0YSA9IG52X3JvMDgoYmlvcywgcmFtY2ZnICsgMHgwMykgJiAweDBmOwotCXJhbV93cjMyKGZ1YywgMHgxMGY4NzAsIDB4MTExMTExMTEgKiBkYXRhKTsKKwlyYW1fd3IzMihmdWMsIDB4MTBmODcwLCAweDExMTExMTExICogbmV4dC0+Ymlvcy5yYW1jZmdfMTFfMDNfMGYpOwogCi0JZGF0YSA9IG52X3JvMTYoYmlvcywgdGltaW5nICsgMHgyYyk7Ci0JcmFtX21hc2soZnVjLCAweDEwZjI1MCwgMHgwMDAwMDNmMCwgKGRhdGEgJiAweDAwM2YpIDw8ICA0KTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjUwLCAweDAwMDAwM2YwLCBuZXh0LT5iaW9zLnRpbWluZ18yMF8yY18wMDNmIDw8IDQpOwogCi0JaWYgKCgobnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDJjKSAmIDB4MDAwMDFmYzApID4+ICA2KSA+Ci0JICAgICgobnZfcm8zMihiaW9zLCB0aW1pbmcgKyAweDI4KSAmIDB4N2YwMDAwMDApID4+IDI0KSkKLQkJZGF0YSA9IChudl9ybzMyKGJpb3MsIHRpbWluZyArIDB4MmMpICYgMHgwMDAwMWZjMCkgPj4gIDY7Ci0JZWxzZQotCQlkYXRhID0gKG52X3JvMzIoYmlvcywgdGltaW5nICsgMHgyOCkgJiAweDFmMDAwMDAwKSA+PiAyNDsKKwlkYXRhID0gKG5leHQtPmJpb3MudGltaW5nWzEwXSAmIDB4N2YwMDAwMDApID4+IDI0OworCWlmIChkYXRhIDwgbmV4dC0+Ymlvcy50aW1pbmdfMjBfMmNfMWZjMCkKKwkJZGF0YSA9IG5leHQtPmJpb3MudGltaW5nXzIwXzJjXzFmYzA7CiAJcmFtX21hc2soZnVjLCAweDEwZjI0YywgMHg3ZjAwMDAwMCwgZGF0YSA8PCAyNCk7CiAKLQlkYXRhID0gbnZfcm8wOChiaW9zLCB0aW1pbmcgKyAweDMwKTsKLQlyYW1fbWFzayhmdWMsIDB4MTBmMjI0LCAweDAwMWYwMDAwLCAoZGF0YSAmIDB4ZjgpIDw8IDEzKTsKKwlyYW1fbWFzayhmdWMsIDB4MTBmMjI0LCAweDAwMWYwMDAwLCBuZXh0LT5iaW9zLnRpbWluZ18yMF8zMF9mOCk7CiAKIAlyYW1fd3IzMihmdWMsIDB4MTBmMDkwLCAweDQwMDAwMDdmKTsKIAlyYW1fbnNlYyhmdWMsIDEwMDApOwpAQCAtODU1LDcgKzkxOCw3IEBACiAKIAlyYW1fd3IzMihmdWMsIDB4NjJjMDAwLCAweDBmMGYwZjAwKTsKIAotCWlmIChudl9ybzA4KGJpb3MsIHJhbW1hcCArIDB4MDgpICYgMHgwMSkKKwlpZiAobmV4dC0+Ymlvcy5yYW1tYXBfMTFfMDhfMDEpCiAJCWRhdGEgPSAweDAwMDAwODAwOwogCWVsc2UKIAkJZGF0YSA9IDB4MDAwMDAwMDA7CkBAIC04NjgsMjEgKzkzMSwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludAotbnZlMF9yYW1fY2FsYyhzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiLCB1MzIgZnJlcSkKK252ZTBfcmFtX2NhbGNfZGF0YShzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiLCB1MzIgZnJlcSwKKwkJICAgc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwZmIpOwogCXN0cnVjdCBudmUwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKLQlzdHJ1Y3QgbnZlMF9yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKLQlzdHJ1Y3QgYml0X2VudHJ5IE07Ci0JaW50IHJldCwgcmVmY2xrLCBzdHJhcCwgaTsKLQl1MzIgZGF0YTsKLQl1OCAgY250OworCXU4IHN0cmFwLCBjbnQsIGxlbjsKIAogCS8qIGxvb2t1cCBtZW1vcnkgY29uZmlnIGRhdGEgcmVsZXZhbnQgdG8gdGhlIHRhcmdldCBmcmVxdWVuY3kgKi8KLQlyYW0tPmJhc2UucmFtbWFwLmRhdGEgPSBudmJpb3NfcmFtbWFwX21hdGNoKGJpb3MsIGZyZXEgLyAxMDAwLAotCQkJCQkJICAgJnJhbS0+YmFzZS5yYW1tYXAudmVyc2lvbiwKLQkJCQkJCSAgICZyYW0tPmJhc2UucmFtbWFwLnNpemUsICZjbnQsCi0JCQkJCQkgICAmcmFtLT5iYXNlLnJhbWNmZy5zaXplKTsKKwlyYW0tPmJhc2UucmFtbWFwLmRhdGEgPSBudmJpb3NfcmFtbWFwRXAoYmlvcywgZnJlcSAvIDEwMDAsCisJCQkJCSAgICAgICAmcmFtLT5iYXNlLnJhbW1hcC52ZXJzaW9uLAorCQkJCQkgICAgICAgJnJhbS0+YmFzZS5yYW1tYXAuc2l6ZSwKKwkJCQkJICAgICAgICZjbnQsICZsZW4sICZkYXRhLT5iaW9zKTsKIAlpZiAoIXJhbS0+YmFzZS5yYW1tYXAuZGF0YSB8fCByYW0tPmJhc2UucmFtbWFwLnZlcnNpb24gIT0gMHgxMSB8fAogCSAgICAgcmFtLT5iYXNlLnJhbW1hcC5zaXplIDwgMHgwOSkgewogCQludl9lcnJvcihwZmIsICJpbnZhbGlkL21pc3NpbmcgcmFtbWFwIGVudHJ5XG4iKTsKQEAgLTg5MCwyNCArOTUwLDEzIEBACiAJfQogCiAJLyogbG9jYXRlIHNwZWNpZmljIGRhdGEgc2V0IGZvciB0aGUgYXR0YWNoZWQgbWVtb3J5ICovCi0JaWYgKGJpdF9lbnRyeShiaW9zLCAnTScsICZNKSB8fCBNLnZlcnNpb24gIT0gMiB8fCBNLmxlbmd0aCA8IDMpIHsKLQkJbnZfZXJyb3IocGZiLCAiaW52YWxpZC9taXNzaW5nIG1lbW9yeSB0YWJsZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmFwID0gKG52X3JkMzIocGZiLCAweDEwMTAwMCkgJiAweDAwMDAwMDNjKSA+PiAyOwotCWRhdGEgPSBudl9ybzE2KGJpb3MsIE0ub2Zmc2V0ICsgMSk7Ci0JaWYgKGRhdGEpCi0JCXN0cmFwID0gbnZfcm8wOChiaW9zLCBkYXRhICsgc3RyYXApOwotCi0JaWYgKHN0cmFwID49IGNudCkgewotCQludl9lcnJvcihwZmIsICJpbnZhbGlkIHJhbWNmZyBzdHJhcFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJhbS0+YmFzZS5yYW1jZmcudmVyc2lvbiA9IHJhbS0+YmFzZS5yYW1tYXAudmVyc2lvbjsKLQlyYW0tPmJhc2UucmFtY2ZnLmRhdGEgPSByYW0tPmJhc2UucmFtbWFwLmRhdGEgKyByYW0tPmJhc2UucmFtbWFwLnNpemUgKwotCQkJICAgICAgIChyYW0tPmJhc2UucmFtY2ZnLnNpemUgKiBzdHJhcCk7CisJcmFtLT5iYXNlLnJhbWNmZy5kYXRhID0gbnZiaW9zX3JhbW1hcFNwKGJpb3MsIHJhbS0+YmFzZS5yYW1tYXAuZGF0YSwKKwkJCQkJCXJhbS0+YmFzZS5yYW1tYXAudmVyc2lvbiwKKwkJCQkJCXJhbS0+YmFzZS5yYW1tYXAuc2l6ZSwgY250LCBsZW4sCisJCQkJCQludmJpb3NfcmFtY2ZnX2luZGV4KGJpb3MpLAorCQkJCQkJJnJhbS0+YmFzZS5yYW1jZmcudmVyc2lvbiwKKwkJCQkJCSZyYW0tPmJhc2UucmFtY2ZnLnNpemUsCisJCQkJCQkmZGF0YS0+Ymlvcyk7CiAJaWYgKCFyYW0tPmJhc2UucmFtY2ZnLmRhdGEgfHwgcmFtLT5iYXNlLnJhbWNmZy52ZXJzaW9uICE9IDB4MTEgfHwKIAkgICAgIHJhbS0+YmFzZS5yYW1jZmcuc2l6ZSA8IDB4MDgpIHsKIAkJbnZfZXJyb3IocGZiLCAiaW52YWxpZC9taXNzaW5nIHJhbWNmZyBlbnRyeVxuIik7CkBAIC05MTgsOSArOTY3LDkgQEAKIAlzdHJhcCA9IG52X3JvMDgoYmlvcywgcmFtLT5iYXNlLnJhbWNmZy5kYXRhICsgMHgwMCk7CiAJaWYgKHN0cmFwICE9IDB4ZmYpIHsKIAkJcmFtLT5iYXNlLnRpbWluZy5kYXRhID0KLQkJCW52Ymlvc190aW1pbmdfZW50cnkoYmlvcywgc3RyYXAsCi0JCQkJCSAgICZyYW0tPmJhc2UudGltaW5nLnZlcnNpb24sCi0JCQkJCSAgICZyYW0tPmJhc2UudGltaW5nLnNpemUpOworCQkJbnZiaW9zX3RpbWluZ0VwKGJpb3MsIHN0cmFwLCAmcmFtLT5iYXNlLnRpbWluZy52ZXJzaW9uLAorCQkJCSAgICAgICAmcmFtLT5iYXNlLnRpbWluZy5zaXplLCAmY250LCAmbGVuLAorCQkJCSAgICAgICAmZGF0YS0+Ymlvcyk7CiAJCWlmICghcmFtLT5iYXNlLnRpbWluZy5kYXRhIHx8CiAJCSAgICAgcmFtLT5iYXNlLnRpbWluZy52ZXJzaW9uICE9IDB4MjAgfHwKIAkJICAgICByYW0tPmJhc2UudGltaW5nLnNpemUgPCAweDMzKSB7CkBAIC05MzEsMTEgKzk4MCwyMyBAQAogCQlyYW0tPmJhc2UudGltaW5nLmRhdGEgPSAwOwogCX0KIAorCWRhdGEtPmZyZXEgPSBmcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudmUwX3JhbV9jYWxjX3hpdHMoc3RydWN0IG5vdXZlYXVfZmIgKnBmYiwgc3RydWN0IG5vdXZlYXVfcmFtX2RhdGEgKm5leHQpCit7CisJc3RydWN0IG52ZTBfcmFtICpyYW0gPSAodm9pZCAqKXBmYi0+cmFtOworCXN0cnVjdCBudmUwX3JhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjOworCWludCByZWZjbGssIGk7CisJaW50IHJldDsKKwogCXJldCA9IHJhbV9pbml0KGZ1YywgcGZiKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmFtLT5tb2RlID0gKGZyZXEgPiBmdWMtPnJlZnBsbC52Y28xLm1heF9mcmVxKSA/IDIgOiAxOworCXJhbS0+bW9kZSA9IChuZXh0LT5mcmVxID4gZnVjLT5yZWZwbGwudmNvMS5tYXhfZnJlcSkgPyAyIDogMTsKIAlyYW0tPmZyb20gPSByYW1fcmQzMihmdWMsIDB4MTM3M2Y0KSAmIDB4MDAwMDAwMGY7CiAKIAkvKiBYWFg6IHRoaXMgaXMgKm5vdCogd2hhdCBudmlkaWEgZG8uICBvbiBmZXJtaSBudmlkaWEgZ2VuZXJhbGx5CkBAIC05NDYsNyArMTAwNyw3IEBACiAJICogc28gZmFyLCBpJ3ZlIHNlZW4gdmVyeSB3ZWlyZCB2YWx1ZXMgYmVpbmcgY2hvc2VuIGJ5IG52aWRpYSBvbgogCSAqIGtlcGxlciBib2FyZHMsIG5vIGlkZWEgaG93L3doeSB0aGV5J3JlIGNob3Nlbi4KIAkgKi8KLQlyZWZjbGsgPSBmcmVxOworCXJlZmNsayA9IG5leHQtPmZyZXE7CiAJaWYgKHJhbS0+bW9kZSA9PSAyKQogCQlyZWZjbGsgPSBmdWMtPm1lbXBsbC5yZWZjbGs7CiAKQEAgLTk2OCw3ICsxMDI5LDcgQEAKIAkJZnVjLT5tZW1wbGwubWluX3AgPSAxOwogCQlmdWMtPm1lbXBsbC5tYXhfcCA9IDI7CiAKLQkJcmV0ID0gbnZhM19wbGxfY2FsYyhudl9zdWJkZXYocGZiKSwgJmZ1Yy0+bWVtcGxsLCBmcmVxLAorCQlyZXQgPSBudmEzX3BsbF9jYWxjKG52X3N1YmRldihwZmIpLCAmZnVjLT5tZW1wbGwsIG5leHQtPmZyZXEsCiAJCQkJICAgJnJhbS0+TjIsIE5VTEwsICZyYW0tPk0yLCAmcmFtLT5QMik7CiAJCWlmIChyZXQgPD0gMCkgewogCQkJbnZfZXJyb3IocGZiLCAidW5hYmxlIHRvIGNhbGMgbWVtcGxsXG4iKTsKQEAgLTk4MCwxNyArMTA0MSwxOCBAQAogCQlpZiAocmFtX2hhdmUoZnVjLCBtcltpXSkpCiAJCQlyYW0tPmJhc2UubXJbaV0gPSByYW1fcmQzMihmdWMsIG1yW2ldKTsKIAl9CisJcmFtLT5iYXNlLmZyZXEgPSBuZXh0LT5mcmVxOwogCiAJc3dpdGNoIChyYW0tPmJhc2UudHlwZSkgewogCWNhc2UgTlZfTUVNX1RZUEVfRERSMzoKIAkJcmV0ID0gbm91dmVhdV9zZGRyM19jYWxjKCZyYW0tPmJhc2UpOwogCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBudmUwX3JhbV9jYWxjX3NkZHIzKHBmYiwgZnJlcSk7CisJCQlyZXQgPSBudmUwX3JhbV9jYWxjX3NkZHIzKHBmYiwgbmV4dC0+ZnJlcSk7CiAJCWJyZWFrOwogCWNhc2UgTlZfTUVNX1RZUEVfR0REUjU6Ci0JCXJldCA9IG5vdXZlYXVfZ2RkcjVfY2FsYygmcmFtLT5iYXNlKTsKKwkJcmV0ID0gbm91dmVhdV9nZGRyNV9jYWxjKCZyYW0tPmJhc2UsIHJhbS0+cG51dHMgIT0gMCk7CiAJCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IG52ZTBfcmFtX2NhbGNfZ2RkcjUocGZiLCBmcmVxKTsKKwkJCXJldCA9IG52ZTBfcmFtX2NhbGNfZ2RkcjUocGZiLCBuZXh0LT5mcmVxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1NZUzsKQEAgLTEwMDEsMTMgKzEwNjMsNTUgQEAKIH0KIAogc3RhdGljIGludAorbnZlMF9yYW1fY2FsYyhzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiLCB1MzIgZnJlcSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jbG9jayAqY2xrID0gbm91dmVhdV9jbG9jayhwZmIpOworCXN0cnVjdCBudmUwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKKwlzdHJ1Y3Qgbm91dmVhdV9yYW1fZGF0YSAqeGl0cyA9ICZyYW0tPmJhc2UueGl0aW9uOworCXN0cnVjdCBub3V2ZWF1X3JhbV9kYXRhICpjb3B5OworCWludCByZXQ7CisKKwlpZiAocmFtLT5iYXNlLm5leHQgPT0gTlVMTCkgeworCQlyZXQgPSBudmUwX3JhbV9jYWxjX2RhdGEocGZiLCBjbGstPnJlYWQoY2xrLCBudl9jbGtfc3JjX21lbSksCisJCQkJCSZyYW0tPmJhc2UuZm9ybWVyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gbnZlMF9yYW1fY2FsY19kYXRhKHBmYiwgZnJlcSwgJnJhbS0+YmFzZS50YXJnZXQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAocmFtLT5iYXNlLnRhcmdldC5mcmVxIDwgcmFtLT5iYXNlLmZvcm1lci5mcmVxKSB7CisJCQkqeGl0cyA9IHJhbS0+YmFzZS50YXJnZXQ7CisJCQljb3B5ID0gJnJhbS0+YmFzZS5mb3JtZXI7CisJCX0gZWxzZSB7CisJCQkqeGl0cyA9IHJhbS0+YmFzZS5mb3JtZXI7CisJCQljb3B5ID0gJnJhbS0+YmFzZS50YXJnZXQ7CisJCX0KKworCQl4aXRzLT5iaW9zLnJhbWNmZ18xMV8wMl8wNCA9IGNvcHktPmJpb3MucmFtY2ZnXzExXzAyXzA0OworCQl4aXRzLT5iaW9zLnJhbWNmZ18xMV8wMl8wMyA9IGNvcHktPmJpb3MucmFtY2ZnXzExXzAyXzAzOworCQl4aXRzLT5iaW9zLnRpbWluZ18yMF8zMF8wNyA9IGNvcHktPmJpb3MudGltaW5nXzIwXzMwXzA3OworCisJCXJhbS0+YmFzZS5uZXh0ID0gJnJhbS0+YmFzZS50YXJnZXQ7CisJCWlmIChtZW1jbXAoeGl0cywgJnJhbS0+YmFzZS5mb3JtZXIsIHNpemVvZih4aXRzLT5iaW9zKSkpCisJCQlyYW0tPmJhc2UubmV4dCA9ICZyYW0tPmJhc2UueGl0aW9uOworCX0gZWxzZSB7CisJCUJVR19PTihyYW0tPmJhc2UubmV4dCAhPSAmcmFtLT5iYXNlLnhpdGlvbik7CisJCXJhbS0+YmFzZS5uZXh0ID0gJnJhbS0+YmFzZS50YXJnZXQ7CisJfQorCisJcmV0dXJuIG52ZTBfcmFtX2NhbGNfeGl0cyhwZmIsIHJhbS0+YmFzZS5uZXh0KTsKK30KKworc3RhdGljIGludAogbnZlMF9yYW1fcHJvZyhzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiKQogewogCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZfZGV2aWNlKHBmYik7CiAJc3RydWN0IG52ZTBfcmFtICpyYW0gPSAodm9pZCAqKXBmYi0+cmFtOwogCXN0cnVjdCBudmUwX3JhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjOwogCXJhbV9leGVjKGZ1Yywgbm91dmVhdV9ib29sb3B0KGRldmljZS0+Y2Znb3B0LCAiTnZNZW1FeGVjIiwgZmFsc2UpKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gKHJhbS0+YmFzZS5uZXh0ID09ICZyYW0tPmJhc2UueGl0aW9uKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwMTUsNiArMTExOSw3IEBACiB7CiAJc3RydWN0IG52ZTBfcmFtICpyYW0gPSAodm9pZCAqKXBmYi0+cmFtOwogCXN0cnVjdCBudmUwX3JhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjOworCXJhbS0+YmFzZS5uZXh0ID0gTlVMTDsKIAlyYW1fZXhlYyhmdWMsIGZhbHNlKTsKIH0KIApAQCAtMTA1NSw3ICsxMTYwLDcgQEAKIAkgKiBiaW5hcnkgZHJpdmVyIHNraXBzIHRoZSBvbmUgdGhhdCdzIGFscmVhZHkgYmVlbiBzZXR1cCBieQogCSAqIHRoZSBpbml0IHRhYmxlcy4KIAkgKi8KLQlkYXRhID0gbnZiaW9zX3JhbW1hcF90YWJsZShiaW9zLCAmdmVyLCAmaGRyLCAmY250LCAmbGVuLCAmc25yLCAmc3N6KTsKKwlkYXRhID0gbnZiaW9zX3JhbW1hcFRlKGJpb3MsICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZzbnIsICZzc3opOwogCWlmICghZGF0YSB8fCBoZHIgPCAweDE1KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTA3Myw2ICsxMTc4LDcgQEAKIAkJZGF0YSArPSA0OwogCX0KIAludl93cjMyKHBmYiwgMHgxMGY2NWMsIHNhdmUpOworCW52X21hc2socGZiLCAweDEwZjU4NCwgMHgxMTAwMDAwMCwgMHgwMDAwMDAwMCk7CiAKIAlzd2l0Y2ggKHJhbS0+YmFzZS50eXBlKSB7CiAJY2FzZSBOVl9NRU1fVFlQRV9HRERSNToKQEAgLTExMTcsNyArMTIyMyw4IEBACiAJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9IG5vdXZlYXVfZ3BpbyhwZmIpOwogCXN0cnVjdCBkY2JfZ3Bpb19mdW5jIGZ1bmM7CiAJc3RydWN0IG52ZTBfcmFtICpyYW07Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOworCXUzMiB0bXA7CiAKIAlyZXQgPSBudmMwX3JhbV9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnJhbSk7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocmFtKTsKQEAgLTExMzYsNiArMTI0MywyNSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBjYWxjdWxhdGUgYSBtYXNrIG9mIGRpZmZlcmVudGx5IGNvbmZpZ3VyZWQgbWVtb3J5IHBhcnRpdGlvbnMsCisJICogYmVjYXVzZSwgb2YgY291cnNlIHJlY2xvY2tpbmcgd2Fzbid0IGNvbXBsaWNhdGVkIGVub3VnaAorCSAqIGFscmVhZHkgd2l0aG91dCBoYXZpbmcgdG8gdHJlYXQgc29tZSBvZiB0aGVtIGRpZmZlcmVudGx5IHRvCisJICogdGhlIG90aGVycy4uLi4KKwkgKi8KKwlyYW0tPnBhcnRzID0gbnZfcmQzMihwZmIsIDB4MDIyNDM4KTsKKwlyYW0tPnBtYXNrID0gbnZfcmQzMihwZmIsIDB4MDIyNTU0KTsKKwlyYW0tPnBudXRzID0gMDsKKwlmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgcmFtLT5wYXJ0czsgaSsrKSB7CisJCWlmICghKHJhbS0+cG1hc2sgJiAoMSA8PCBpKSkpIHsKKwkJCXUzMiBjZmcxID0gbnZfcmQzMihwZmIsIDB4MTEwMjA0ICsgKGkgKiAweDEwMDApKTsKKwkJCWlmICh0bXAgJiYgdG1wICE9IGNmZzEpIHsKKwkJCQlyYW0tPnBudXRzIHw9ICgxIDw8IGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdG1wID0gY2ZnMTsKKwkJfQorCX0KKwogCS8vIHBhcnNlIGJpb3MgZGF0YSBmb3IgYm90aCBwbGwncwogCXJldCA9IG52Ymlvc19wbGxfcGFyc2UoYmlvcywgMHgwYywgJnJhbS0+ZnVjLnJlZnBsbCk7CiAJaWYgKHJldCkgewpAQCAtMTI0OCw3ICsxMzc0LDcgQEAKIAlyYW0tPmZ1Yy5yXzB4MTBmNjVjID0gcmFtZnVjX3JlZygweDEwZjY1Yyk7CiAJcmFtLT5mdWMucl8weDEwZjZiYyA9IHJhbWZ1Y19yZWcoMHgxMGY2YmMpOwogCXJhbS0+ZnVjLnJfMHgxMDA3MTAgPSByYW1mdWNfcmVnKDB4MTAwNzEwKTsKLQlyYW0tPmZ1Yy5yXzB4MTBmNzUwID0gcmFtZnVjX3JlZygweDEwZjc1MCk7CisJcmFtLT5mdWMucl8weDEwMDc1MCA9IHJhbWZ1Y19yZWcoMHgxMDA3NTApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vYmFzZS5jCmluZGV4IDY1NjVmM2QuLjE0NzA2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vYmFzZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vYmFzZS5jCkBAIC0yMiw3ICsyMiwyNCBAQAogICogQXV0aG9yczogQmVuIFNrZWdncwogICovCiAKLSNpbmNsdWRlIDxzdWJkZXYvaW5zdG1lbS5oPgorI2luY2x1ZGUgInByaXYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5zdG1lbSBvYmplY3QgYmFzZSBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitfbm91dmVhdV9pbnN0b2JqX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCit7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbSAqaW1lbSA9ICh2b2lkICopb2JqZWN0LT5lbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG9iaiAqaW9iaiA9ICh2b2lkICopb2JqZWN0OworCisJbXV0ZXhfbG9jaygmbnZfc3ViZGV2KGltZW0pLT5tdXRleCk7CisJbGlzdF9kZWwoJmlvYmotPmhlYWQpOworCW11dGV4X3VubG9jaygmbnZfc3ViZGV2KGltZW0pLT5tdXRleCk7CisKKwlyZXR1cm4gbm91dmVhdV9vYmplY3RfZGVzdHJveSgmaW9iai0+YmFzZSk7Cit9CiAKIGludAogbm91dmVhdV9pbnN0b2JqX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCkBAIC00Niw3MyArNjMsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAotbm91dmVhdV9pbnN0b2JqX2Rlc3Ryb3koc3RydWN0IG5vdXZlYXVfaW5zdG9iaiAqaW9iaikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluc3RtZW0gc3ViZGV2IGJhc2UgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorbm91dmVhdV9pbnN0bWVtX2FsbG9jKHN0cnVjdCBub3V2ZWF1X2luc3RtZW0gKmltZW0sCisJCSAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCB1MzIgc2l6ZSwgdTMyIGFsaWduLAorCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQogewotCXN0cnVjdCBub3V2ZWF1X3N1YmRldiAqc3ViZGV2ID0gbnZfc3ViZGV2KGlvYmotPmJhc2UuZW5naW5lKTsKLQotCW11dGV4X2xvY2soJnN1YmRldi0+bXV0ZXgpOwotCWxpc3RfZGVsKCZpb2JqLT5oZWFkKTsKLQltdXRleF91bmxvY2soJnN1YmRldi0+bXV0ZXgpOwotCi0JcmV0dXJuIG5vdXZlYXVfb2JqZWN0X2Rlc3Ryb3koJmlvYmotPmJhc2UpOwotfQotCi12b2lkCi1fbm91dmVhdV9pbnN0b2JqX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCi17Ci0Jc3RydWN0IG5vdXZlYXVfaW5zdG9iaiAqaW9iaiA9ICh2b2lkICopb2JqZWN0OwotCXJldHVybiBub3V2ZWF1X2luc3RvYmpfZGVzdHJveShpb2JqKTsKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSA9IG52X29iamVjdChpbWVtKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2ltcGwgKmltcGwgPSAodm9pZCAqKWVuZ2luZS0+b2NsYXNzOworCXN0cnVjdCBub3V2ZWF1X2luc3RvYmpfYXJncyBhcmdzID0geyAuc2l6ZSA9IHNpemUsIC5hbGlnbiA9IGFsaWduIH07CisJcmV0dXJuIG5vdXZlYXVfb2JqZWN0X2N0b3IocGFyZW50LCBlbmdpbmUsIGltcGwtPmluc3RvYmosICZhcmdzLAorCQkJCSAgIHNpemVvZihhcmdzKSwgcG9iamVjdCk7CiB9CiAKIGludAotbm91dmVhdV9pbnN0bWVtX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCi0JCQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkJCXN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLAotCQkJaW50IGxlbmd0aCwgdm9pZCAqKnBvYmplY3QpCitfbm91dmVhdV9pbnN0bWVtX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtOwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3N1YmRldl9jcmVhdGVfKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIDAsCi0JCQkJICAgICAiSU5TVE1FTSIsICJpbnN0bWVtIiwgbGVuZ3RoLCBwb2JqZWN0KTsKLQlpbWVtID0gKnBvYmplY3Q7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCUlOSVRfTElTVF9IRUFEKCZpbWVtLT5saXN0KTsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1ub3V2ZWF1X2luc3RtZW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtKQotewotCXN0cnVjdCBub3V2ZWF1X2luc3RvYmogKmlvYmo7Ci0JaW50IHJldCwgaTsKLQotCXJldCA9IG5vdXZlYXVfc3ViZGV2X2luaXQoJmltZW0tPmJhc2UpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltdXRleF9sb2NrKCZpbWVtLT5iYXNlLm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9iaiwgJmltZW0tPmxpc3QsIGhlYWQpIHsKLQkJaWYgKGlvYmotPnN1c3BlbmQpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBpb2JqLT5zaXplOyBpICs9IDQpCi0JCQkJbnZfd28zMihpb2JqLCBpLCBpb2JqLT5zdXNwZW5kW2kgLyA0XSk7Ci0JCQl2ZnJlZShpb2JqLT5zdXNwZW5kKTsKLQkJCWlvYmotPnN1c3BlbmQgPSBOVUxMOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZpbWVtLT5iYXNlLm11dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLW5vdXZlYXVfaW5zdG1lbV9maW5pKHN0cnVjdCBub3V2ZWF1X2luc3RtZW0gKmltZW0sIGJvb2wgc3VzcGVuZCkKLXsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtID0gKHZvaWQgKilvYmplY3Q7CiAJc3RydWN0IG5vdXZlYXVfaW5zdG9iaiAqaW9iajsKIAlpbnQgaSwgcmV0ID0gMDsKIApAQCAtMTQzLDEyICsxMTMsNDUgQEAKIF9ub3V2ZWF1X2luc3RtZW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtID0gKHZvaWQgKilvYmplY3Q7Ci0JcmV0dXJuIG5vdXZlYXVfaW5zdG1lbV9pbml0KGltZW0pOworCXN0cnVjdCBub3V2ZWF1X2luc3RvYmogKmlvYmo7CisJaW50IHJldCwgaTsKKworCXJldCA9IG5vdXZlYXVfc3ViZGV2X2luaXQoJmltZW0tPmJhc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbWVtLT5iYXNlLm11dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9iaiwgJmltZW0tPmxpc3QsIGhlYWQpIHsKKwkJaWYgKGlvYmotPnN1c3BlbmQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBpb2JqLT5zaXplOyBpICs9IDQpCisJCQkJbnZfd28zMihpb2JqLCBpLCBpb2JqLT5zdXNwZW5kW2kgLyA0XSk7CisJCQl2ZnJlZShpb2JqLT5zdXNwZW5kKTsKKwkJCWlvYmotPnN1c3BlbmQgPSBOVUxMOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbWVtLT5iYXNlLm11dGV4KTsKKworCXJldHVybiAwOwogfQogCiBpbnQKLV9ub3V2ZWF1X2luc3RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQorbm91dmVhdV9pbnN0bWVtX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCisJCQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJCXN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLAorCQkJaW50IGxlbmd0aCwgdm9pZCAqKnBvYmplY3QpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfaW5zdG1lbSAqaW1lbSA9ICh2b2lkICopb2JqZWN0OwotCXJldHVybiBub3V2ZWF1X2luc3RtZW1fZmluaShpbWVtLCBzdXNwZW5kKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X3N1YmRldl9jcmVhdGVfKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIDAsCisJCQkJICAgICAiSU5TVE1FTSIsICJpbnN0bWVtIiwgbGVuZ3RoLCBwb2JqZWN0KTsKKwlpbWVtID0gKnBvYmplY3Q7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCUlOSVRfTElTVF9IRUFEKCZpbWVtLT5saXN0KTsKKwlpbWVtLT5hbGxvYyA9IG5vdXZlYXVfaW5zdG1lbV9hbGxvYzsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjA0LmMKaW5kZXggNzk1MzkzZC4uN2I2NGJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjA0LmMKQEAgLTIyLDQ1ICsyMiwxMSBAQAogICogQXV0aG9yczogQmVuIFNrZWdncwogICovCiAKLSNpbmNsdWRlIDxzdWJkZXYvZmIuaD4KLQogI2luY2x1ZGUgIm52MDQuaCIKIAotc3RhdGljIGludAotbnYwNF9pbnN0b2JqX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKLQkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQotewotCXN0cnVjdCBudjA0X2luc3RtZW1fcHJpdiAqcHJpdiA9ICh2b2lkICopZW5naW5lOwotCXN0cnVjdCBudjA0X2luc3RvYmpfcHJpdiAqbm9kZTsKLQlpbnQgcmV0LCBhbGlnbjsKLQotCWFsaWduID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKLQlpZiAoIWFsaWduKQotCQlhbGlnbiA9IDE7Ci0KLQlyZXQgPSBub3V2ZWF1X2luc3RvYmpfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsICZub2RlKTsKLQkqcG9iamVjdCA9IG52X29iamVjdChub2RlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbm91dmVhdV9tbV9oZWFkKCZwcml2LT5oZWFwLCAxLCBzaXplLCBzaXplLCBhbGlnbiwgJm5vZGUtPm1lbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW5vZGUtPmJhc2UuYWRkciA9IG5vZGUtPm1lbS0+b2Zmc2V0OwotCW5vZGUtPmJhc2Uuc2l6ZSA9IG5vZGUtPm1lbS0+bGVuZ3RoOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbnYwNF9pbnN0b2JqX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCi17Ci0Jc3RydWN0IG52MDRfaW5zdG1lbV9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3QtPmVuZ2luZTsKLQlzdHJ1Y3QgbnYwNF9pbnN0b2JqX3ByaXYgKm5vZGUgPSAodm9pZCAqKW9iamVjdDsKLQlub3V2ZWF1X21tX2ZyZWUoJnByaXYtPmhlYXAsICZub2RlLT5tZW0pOwotCW5vdXZlYXVfaW5zdG9ial9kZXN0cm95KCZub2RlLT5iYXNlKTsKLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluc3RtZW0gb2JqZWN0IGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB1MzIKIG52MDRfaW5zdG9ial9yZDMyKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1NjQgYWRkcikKQEAgLTc2LDkgKzQyLDQ2IEBACiAJbnZfd28zMihvYmplY3QtPmVuZ2luZSwgbm9kZS0+bWVtLT5vZmZzZXQgKyBhZGRyLCBkYXRhKTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3V2ZWF1X29jbGFzcworc3RhdGljIHZvaWQKK252MDRfaW5zdG9ial9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudjA0X2luc3RtZW1fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0LT5lbmdpbmU7CisJc3RydWN0IG52MDRfaW5zdG9ial9wcml2ICpub2RlID0gKHZvaWQgKilvYmplY3Q7CisJbm91dmVhdV9tbV9mcmVlKCZwcml2LT5oZWFwLCAmbm9kZS0+bWVtKTsKKwlub3V2ZWF1X2luc3RvYmpfZGVzdHJveSgmbm9kZS0+YmFzZSk7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfaW5zdG9ial9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCisJCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKK3sKKwlzdHJ1Y3QgbnYwNF9pbnN0bWVtX3ByaXYgKnByaXYgPSAodm9pZCAqKWVuZ2luZTsKKwlzdHJ1Y3QgbnYwNF9pbnN0b2JqX3ByaXYgKm5vZGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG9ial9hcmdzICphcmdzID0gZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFhcmdzLT5hbGlnbikKKwkJYXJncy0+YWxpZ24gPSAxOworCisJcmV0ID0gbm91dmVhdV9pbnN0b2JqX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAmbm9kZSk7CisJKnBvYmplY3QgPSBudl9vYmplY3Qobm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfbW1faGVhZCgmcHJpdi0+aGVhcCwgMSwgYXJncy0+c2l6ZSwgYXJncy0+c2l6ZSwKKwkJCSAgICAgIGFyZ3MtPmFsaWduLCAmbm9kZS0+bWVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbm9kZS0+YmFzZS5hZGRyID0gbm9kZS0+bWVtLT5vZmZzZXQ7CisJbm9kZS0+YmFzZS5zaXplID0gbm9kZS0+bWVtLT5sZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2luc3RvYmpfaW1wbAogbnYwNF9pbnN0b2JqX29jbGFzcyA9IHsKLQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewogCQkuY3RvciA9IG52MDRfaW5zdG9ial9jdG9yLAogCQkuZHRvciA9IG52MDRfaW5zdG9ial9kdG9yLAogCQkuaW5pdCA9IF9ub3V2ZWF1X2luc3RvYmpfaW5pdCwKQEAgLTg4LDE5ICs5MSwzNCBAQAogCX0sCiB9OwogCi1pbnQKLW52MDRfaW5zdG1lbV9hbGxvYyhzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtICppbWVtLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwKLQkJICAgdTMyIHNpemUsIHUzMiBhbGlnbiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluc3RtZW0gc3ViZGV2IGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIKK252MDRfaW5zdG1lbV9yZDMyKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1NjQgYWRkcikKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSA9IG52X29iamVjdChpbWVtKTsKLQlpbnQgcmV0OworCXJldHVybiBudl9yZDMyKG9iamVjdCwgMHg3MDAwMDAgKyBhZGRyKTsKK30KIAotCXJldCA9IG5vdXZlYXVfb2JqZWN0X2N0b3IocGFyZW50LCBlbmdpbmUsICZudjA0X2luc3RvYmpfb2NsYXNzLAotCQkJCSAgKHZvaWQgKikodW5zaWduZWQgbG9uZylhbGlnbiwgc2l6ZSwgcG9iamVjdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKK3N0YXRpYyB2b2lkCitudjA0X2luc3RtZW1fd3IzMihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTY0IGFkZHIsIHUzMiBkYXRhKQoreworCXJldHVybiBudl93cjMyKG9iamVjdCwgMHg3MDAwMDAgKyBhZGRyLCBkYXRhKTsKK30KIAotCXJldHVybiAwOwordm9pZAorbnYwNF9pbnN0bWVtX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCit7CisJc3RydWN0IG52MDRfaW5zdG1lbV9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5yYW1mYyk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5yYW1ybyk7CisJbm91dmVhdV9yYW1odF9yZWYoTlVMTCwgJnByaXYtPnJhbWh0KTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnZiaW9zKTsKKwlub3V2ZWF1X21tX2ZpbmkoJnByaXYtPmhlYXApOworCWlmIChwcml2LT5pb21lbSkKKwkJaW91bm1hcChwcml2LT5pb21lbSk7CisJbm91dmVhdV9pbnN0bWVtX2Rlc3Ryb3koJnByaXYtPmJhc2UpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMTgsNyArMTM2LDYgQEAKIAogCS8qIFBSQU1JTiBhcGVydHVyZSBtYXBzIG92ZXIgdGhlIGVuZCBvZiBWUkFNLCByZXNlcnZlIGl0ICovCiAJcHJpdi0+YmFzZS5yZXNlcnZlZCA9IDUxMiAqIDEwMjQ7Ci0JcHJpdi0+YmFzZS5hbGxvYyAgICA9IG52MDRfaW5zdG1lbV9hbGxvYzsKIAogCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmcHJpdi0+aGVhcCwgMCwgcHJpdi0+YmFzZS5yZXNlcnZlZCwgMSk7CiAJaWYgKHJldCkKQEAgLTE1MCwzNiArMTY3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLW52MDRfaW5zdG1lbV9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQotewotCXN0cnVjdCBudjA0X2luc3RtZW1fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+cmFtZmMpOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+cmFtcm8pOwotCW5vdXZlYXVfcmFtaHRfcmVmKE5VTEwsICZwcml2LT5yYW1odCk7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT52Ymlvcyk7Ci0Jbm91dmVhdV9tbV9maW5pKCZwcml2LT5oZWFwKTsKLQlpZiAocHJpdi0+aW9tZW0pCi0JCWlvdW5tYXAocHJpdi0+aW9tZW0pOwotCW5vdXZlYXVfaW5zdG1lbV9kZXN0cm95KCZwcml2LT5iYXNlKTsKLX0KLQotc3RhdGljIHUzMgotbnYwNF9pbnN0bWVtX3JkMzIoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIHU2NCBhZGRyKQotewotCXJldHVybiBudl9yZDMyKG9iamVjdCwgMHg3MDAwMDAgKyBhZGRyKTsKLX0KLQotc3RhdGljIHZvaWQKLW52MDRfaW5zdG1lbV93cjMyKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1NjQgYWRkciwgdTMyIGRhdGEpCi17Ci0JcmV0dXJuIG52X3dyMzIob2JqZWN0LCAweDcwMDAwMCArIGFkZHIsIGRhdGEpOwotfQotCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52MDRfaW5zdG1lbV9vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihJTlNUTUVNLCAweDA0KSwKLQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjA0X2luc3RtZW1fb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoSU5TVE1FTSwgMHgwNCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKIAkJLmN0b3IgPSBudjA0X2luc3RtZW1fY3RvciwKIAkJLmR0b3IgPSBudjA0X2luc3RtZW1fZHRvciwKIAkJLmluaXQgPSBfbm91dmVhdV9pbnN0bWVtX2luaXQsCkBAIC0xODcsNCArMTc4LDUgQEAKIAkJLnJkMzIgPSBudjA0X2luc3RtZW1fcmQzMiwKIAkJLndyMzIgPSBudjA0X2luc3RtZW1fd3IzMiwKIAl9LAotfTsKKwkuaW5zdG9iaiA9ICZudjA0X2luc3RvYmpfb2NsYXNzLmJhc2UsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL252MDQuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vbnYwNC5oCmluZGV4IGIxNWI2MTMuLjA5NWZiYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vbnYwNC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vbnYwNC5oCkBAIC01LDcgKzUsOSBAQAogI2luY2x1ZGUgPGNvcmUvcmFtaHQuaD4KICNpbmNsdWRlIDxjb3JlL21tLmg+CiAKLSNpbmNsdWRlIDxzdWJkZXYvaW5zdG1lbS5oPgorI2luY2x1ZGUgInByaXYuaCIKKworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2luc3RvYmpfaW1wbCBudjA0X2luc3RvYmpfb2NsYXNzOwogCiBzdHJ1Y3QgbnYwNF9pbnN0bWVtX3ByaXYgewogCXN0cnVjdCBub3V2ZWF1X2luc3RtZW0gYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vbnY0MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjQwLmMKaW5kZXggYjEwYTE0My4uZWMwYjk2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjQwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjQwLmMKQEAgLTI2LDYgKzI2LDI0IEBACiAKICNpbmNsdWRlICJudjA0LmgiCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluc3RtZW0gc3ViZGV2IGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIKK252NDBfaW5zdG1lbV9yZDMyKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgbnYwNF9pbnN0bWVtX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKKwlyZXR1cm4gaW9yZWFkMzJfbmF0aXZlKHByaXYtPmlvbWVtICsgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX2luc3RtZW1fd3IzMihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTY0IGFkZHIsIHUzMiBkYXRhKQoreworCXN0cnVjdCBudjA0X2luc3RtZW1fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OworCWlvd3JpdGUzMl9uYXRpdmUoZGF0YSwgcHJpdi0+aW9tZW0gKyBhZGRyKTsKK30KKwogc3RhdGljIGludAogbnY0MF9pbnN0bWVtX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAogCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKQEAgLTY5LDcgKzg3LDYgQEAKIAlwcml2LT5iYXNlLnJlc2VydmVkICs9IDUxMiAqIDEwMjQ7CS8qIG9iamVjdCBzdG9yYWdlICovCiAKIAlwcml2LT5iYXNlLnJlc2VydmVkID0gcm91bmRfdXAocHJpdi0+YmFzZS5yZXNlcnZlZCwgNDA5Nik7Ci0JcHJpdi0+YmFzZS5hbGxvYyAgICA9IG52MDRfaW5zdG1lbV9hbGxvYzsKIAogCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmcHJpdi0+aGVhcCwgMCwgcHJpdi0+YmFzZS5yZXNlcnZlZCwgMSk7CiAJaWYgKHJldCkKQEAgLTEwNiwyNCArMTIzLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIKLW52NDBfaW5zdG1lbV9yZDMyKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1NjQgYWRkcikKLXsKLQlzdHJ1Y3QgbnYwNF9pbnN0bWVtX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlyZXR1cm4gaW9yZWFkMzJfbmF0aXZlKHByaXYtPmlvbWVtICsgYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjQwX2luc3RtZW1fd3IzMihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTY0IGFkZHIsIHUzMiBkYXRhKQotewotCXN0cnVjdCBudjA0X2luc3RtZW1fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCWlvd3JpdGUzMl9uYXRpdmUoZGF0YSwgcHJpdi0+aW9tZW0gKyBhZGRyKTsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjQwX2luc3RtZW1fb2NsYXNzID0gewotCS5oYW5kbGUgPSBOVl9TVUJERVYoSU5TVE1FTSwgMHg0MCksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnY0MF9pbnN0bWVtX29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKElOU1RNRU0sIDB4NDApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CiAJCS5jdG9yID0gbnY0MF9pbnN0bWVtX2N0b3IsCiAJCS5kdG9yID0gbnYwNF9pbnN0bWVtX2R0b3IsCiAJCS5pbml0ID0gX25vdXZlYXVfaW5zdG1lbV9pbml0LApAQCAtMTMxLDQgKzEzNCw1IEBACiAJCS5yZDMyID0gbnY0MF9pbnN0bWVtX3JkMzIsCiAJCS53cjMyID0gbnY0MF9pbnN0bWVtX3dyMzIsCiAJfSwKLX07CisJLmluc3RvYmogPSAmbnYwNF9pbnN0b2JqX29jbGFzcy5iYXNlLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaW5zdG1lbS9udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL252NTAuYwppbmRleCA5N2JjNWRmLi43Y2IzYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL252NTAuYwpAQCAtMjIsMTEgKzIyLDExIEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAotI2luY2x1ZGUgPHN1YmRldi9pbnN0bWVtLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2ZiLmg+Ci0KICNpbmNsdWRlIDxjb3JlL21tLmg+CiAKKyNpbmNsdWRlICJwcml2LmgiCisKIHN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiB7CiAJc3RydWN0IG5vdXZlYXVfaW5zdG1lbSBiYXNlOwogCXNwaW5sb2NrX3QgbG9jazsKQEAgLTM4LDQyICszOCw5IEBACiAJc3RydWN0IG5vdXZlYXVfbWVtICptZW07CiB9OwogCi1zdGF0aWMgaW50Ci1udjUwX2luc3RvYmpfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCi0JCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBzaXplLAotCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCi17Ci0Jc3RydWN0IG5vdXZlYXVfZmIgKnBmYiA9IG5vdXZlYXVfZmIocGFyZW50KTsKLQlzdHJ1Y3QgbnY1MF9pbnN0b2JqX3ByaXYgKm5vZGU7Ci0JdTMyIGFsaWduID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKLQlpbnQgcmV0OwotCi0Jc2l6ZSAgPSBtYXgoKHNpemUgICsgNDA5NSkgJiB+NDA5NSwgKHUzMik0MDk2KTsKLQlhbGlnbiA9IG1heCgoYWxpZ24gKyA0MDk1KSAmIH40MDk1LCAodTMyKTQwOTYpOwotCi0JcmV0ID0gbm91dmVhdV9pbnN0b2JqX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAmbm9kZSk7Ci0JKnBvYmplY3QgPSBudl9vYmplY3Qobm9kZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHBmYi0+cmFtLT5nZXQocGZiLCBzaXplLCBhbGlnbiwgMCwgMHg4MDAsICZub2RlLT5tZW0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlub2RlLT5iYXNlLmFkZHIgPSBub2RlLT5tZW0tPm9mZnNldDsKLQlub2RlLT5iYXNlLnNpemUgPSBub2RlLT5tZW0tPnNpemUgPDwgMTI7Ci0Jbm9kZS0+bWVtLT5wYWdlX3NoaWZ0ID0gMTI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjUwX2luc3RvYmpfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgbnY1MF9pbnN0b2JqX3ByaXYgKm5vZGUgPSAodm9pZCAqKW9iamVjdDsKLQlzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiID0gbm91dmVhdV9mYihvYmplY3QpOwotCXBmYi0+cmFtLT5wdXQocGZiLCAmbm9kZS0+bWVtKTsKLQlub3V2ZWF1X2luc3RvYmpfZGVzdHJveSgmbm9kZS0+YmFzZSk7Ci19CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnN0bWVtIG9iamVjdCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdTMyCiBudjUwX2luc3RvYmpfcmQzMihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgdTY0IG9mZnNldCkKQEAgLTExMyw5ICs4MCw0NiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3V2ZWF1X29jbGFzcworc3RhdGljIHZvaWQKK252NTBfaW5zdG9ial9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudjUwX2luc3RvYmpfcHJpdiAqbm9kZSA9ICh2b2lkICopb2JqZWN0OworCXN0cnVjdCBub3V2ZWF1X2ZiICpwZmIgPSBub3V2ZWF1X2ZiKG9iamVjdCk7CisJcGZiLT5yYW0tPnB1dChwZmIsICZub2RlLT5tZW0pOworCW5vdXZlYXVfaW5zdG9ial9kZXN0cm95KCZub2RlLT5iYXNlKTsKK30KKworc3RhdGljIGludAorbnY1MF9pbnN0b2JqX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAorCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2ZiICpwZmIgPSBub3V2ZWF1X2ZiKHBhcmVudCk7CisJc3RydWN0IG5vdXZlYXVfaW5zdG9ial9hcmdzICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgbnY1MF9pbnN0b2JqX3ByaXYgKm5vZGU7CisJaW50IHJldDsKKworCWFyZ3MtPnNpemUgID0gbWF4KChhcmdzLT5zaXplICArIDQwOTUpICYgfjQwOTUsICh1MzIpNDA5Nik7CisJYXJncy0+YWxpZ24gPSBtYXgoKGFyZ3MtPmFsaWduICsgNDA5NSkgJiB+NDA5NSwgKHUzMik0MDk2KTsKKworCXJldCA9IG5vdXZlYXVfaW5zdG9ial9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJm5vZGUpOworCSpwb2JqZWN0ID0gbnZfb2JqZWN0KG5vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwZmItPnJhbS0+Z2V0KHBmYiwgYXJncy0+c2l6ZSwgYXJncy0+YWxpZ24sIDAsIDB4ODAwLCAmbm9kZS0+bWVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbm9kZS0+YmFzZS5hZGRyID0gbm9kZS0+bWVtLT5vZmZzZXQ7CisJbm9kZS0+YmFzZS5zaXplID0gbm9kZS0+bWVtLT5zaXplIDw8IDEyOworCW5vZGUtPm1lbS0+cGFnZV9zaGlmdCA9IDEyOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfaW5zdG9ial9pbXBsCiBudjUwX2luc3RvYmpfb2NsYXNzID0gewotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CiAJCS5jdG9yID0gbnY1MF9pbnN0b2JqX2N0b3IsCiAJCS5kdG9yID0gbnY1MF9pbnN0b2JqX2R0b3IsCiAJCS5pbml0ID0gX25vdXZlYXVfaW5zdG9ial9pbml0LApAQCAtMTI1LDEzICsxMjksMTYgQEAKIAl9LAogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5zdG1lbSBzdWJkZXYgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogc3RhdGljIGludAotbnY1MF9pbnN0bWVtX2FsbG9jKHN0cnVjdCBub3V2ZWF1X2luc3RtZW0gKmltZW0sIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAotCQkgICB1MzIgc2l6ZSwgdTMyIGFsaWduLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQorbnY1MF9pbnN0bWVtX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSA9IG52X29iamVjdChpbWVtKTsKLQlyZXR1cm4gbm91dmVhdV9vYmplY3RfY3RvcihwYXJlbnQsIGVuZ2luZSwgJm52NTBfaW5zdG9ial9vY2xhc3MsCi0JCQkJICAgKHZvaWQgKikodW5zaWduZWQgbG9uZylhbGlnbiwgc2l6ZSwgcG9iamVjdCk7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7CisJcHJpdi0+YWRkciA9IH4wVUxMOworCXJldHVybiBub3V2ZWF1X2luc3RtZW1fZmluaSgmcHJpdi0+YmFzZSwgc3VzcGVuZCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE0OCwyNSArMTU1LDE3IEBACiAJCXJldHVybiByZXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7Ci0JcHJpdi0+YmFzZS5hbGxvYyA9IG52NTBfaW5zdG1lbV9hbGxvYzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotbnY1MF9pbnN0bWVtX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKLXsKLQlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlwcml2LT5hZGRyID0gfjBVTEw7Ci0JcmV0dXJuIG5vdXZlYXVfaW5zdG1lbV9maW5pKCZwcml2LT5iYXNlLCBzdXNwZW5kKTsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjUwX2luc3RtZW1fb2NsYXNzID0gewotCS5oYW5kbGUgPSBOVl9TVUJERVYoSU5TVE1FTSwgMHg1MCksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnY1MF9pbnN0bWVtX29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKElOU1RNRU0sIDB4NTApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CiAJCS5jdG9yID0gbnY1MF9pbnN0bWVtX2N0b3IsCiAJCS5kdG9yID0gX25vdXZlYXVfaW5zdG1lbV9kdG9yLAogCQkuaW5pdCA9IF9ub3V2ZWF1X2luc3RtZW1faW5pdCwKIAkJLmZpbmkgPSBudjUwX2luc3RtZW1fZmluaSwKIAl9LAotfTsKKwkuaW5zdG9iaiA9ICZudjUwX2luc3RvYmpfb2NsYXNzLmJhc2UsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL3ByaXYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2luc3RtZW0vcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjdkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pbnN0bWVtL3ByaXYuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9fTlZLTV9JTlNUTUVNX1BSSVZfSF9fCisjZGVmaW5lIF9fTlZLTV9JTlNUTUVNX1BSSVZfSF9fCisKKyNpbmNsdWRlIDxzdWJkZXYvaW5zdG1lbS5oPgorCitzdHJ1Y3Qgbm91dmVhdV9pbnN0b2JqX2ltcGwgeworCXN0cnVjdCBub3V2ZWF1X29jbGFzcyBiYXNlOworfTsKKworc3RydWN0IG5vdXZlYXVfaW5zdG9ial9hcmdzIHsKKwl1MzIgc2l6ZTsKKwl1MzIgYWxpZ247Cit9OworCisjZGVmaW5lIG5vdXZlYXVfaW5zdG9ial9jcmVhdGUocCxlLG8sZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfaW5zdG9ial9jcmVhdGVfKChwKSwgKGUpLCAobyksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQorI2RlZmluZSBub3V2ZWF1X2luc3RvYmpfZGVzdHJveShwKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0b2JqICppb2JqID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbm91dmVhdV9pbnN0b2JqX2R0b3IobnZfb2JqZWN0KGlvYmopKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG5vdXZlYXVfaW5zdG9ial9pbml0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfb2JqZWN0X2luaXQoJihwKS0+YmFzZSkKKyNkZWZpbmUgbm91dmVhdV9pbnN0b2JqX2ZpbmkocCxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbm91dmVhdV9vYmplY3RfZmluaSgmKHApLT5iYXNlLCAocykpCisKK2ludCAgbm91dmVhdV9pbnN0b2JqX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50LCB2b2lkICoqKTsKK3ZvaWQgX25vdXZlYXVfaW5zdG9ial9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKKyNkZWZpbmUgX25vdXZlYXVfaW5zdG9ial9pbml0IG5vdXZlYXVfb2JqZWN0X2luaXQKKyNkZWZpbmUgX25vdXZlYXVfaW5zdG9ial9maW5pIG5vdXZlYXVfb2JqZWN0X2ZpbmkKKworc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9pbXBsIHsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgYmFzZTsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKmluc3RvYmo7Cit9OworCisjZGVmaW5lIG5vdXZlYXVfaW5zdG1lbV9jcmVhdGUocCxlLG8sZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfaW5zdG1lbV9jcmVhdGVfKChwKSwgKGUpLCAobyksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQorI2RlZmluZSBub3V2ZWF1X2luc3RtZW1fZGVzdHJveShwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X3N1YmRldl9kZXN0cm95KCYocCktPmJhc2UpCisjZGVmaW5lIG5vdXZlYXVfaW5zdG1lbV9pbml0KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2luc3RtZW0gKmltZW0gPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2luc3RtZW1faW5pdChudl9vYmplY3QoaW1lbSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9pbnN0bWVtX2ZpbmkocCxzKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbSAqaW1lbSA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX25vdXZlYXVfaW5zdG1lbV9maW5pKG52X29iamVjdChpbWVtKSwgKHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCitpbnQgbm91dmVhdV9pbnN0bWVtX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCBpbnQsIHZvaWQgKiopOworI2RlZmluZSBfbm91dmVhdV9pbnN0bWVtX2R0b3IgX25vdXZlYXVfc3ViZGV2X2R0b3IKK2ludCBfbm91dmVhdV9pbnN0bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworaW50IF9ub3V2ZWF1X2luc3RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgYm9vbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvbWMvbnZjMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvbWMvbnZjMC5jCmluZGV4IGMwMmI0NzYuLjM0NDcyZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvbWMvbnZjMC5jCkBAIC0zMiw2ICszMiw3IEBACiAJeyAweDAwMDAwMDgwLCBOVkRFVl9FTkdJTkVfQ09QWTIgfSwKIAl7IDB4MDAwMDAxMDAsIE5WREVWX0VOR0lORV9GSUZPIH0sCiAJeyAweDAwMDAxMDAwLCBOVkRFVl9FTkdJTkVfR1IgfSwKKwl7IDB4MDAwMDIwMDAsIE5WREVWX1NVQkRFVl9GQiB9LAogCXsgMHgwMDAwODAwMCwgTlZERVZfRU5HSU5FX0JTUCB9LAogCXsgMHgwMDA0MDAwMCwgTlZERVZfU1VCREVWX1RIRVJNIH0sCiAJeyAweDAwMDIwMDAwLCBOVkRFVl9FTkdJTkVfVlAgfSwKQEAgLTQwLDYgKzQxLDcgQEAKIAl7IDB4MDEwMDAwMDAsIE5WREVWX1NVQkRFVl9QV1IgfSwKIAl7IDB4MDIwMDAwMDAsIE5WREVWX1NVQkRFVl9MVENHIH0sCiAJeyAweDA0MDAwMDAwLCBOVkRFVl9FTkdJTkVfRElTUCB9LAorCXsgMHgwODAwMDAwMCwgTlZERVZfU1VCREVWX0ZCIH0sCiAJeyAweDEwMDAwMDAwLCBOVkRFVl9TVUJERVZfQlVTIH0sCiAJeyAweDQwMDAwMDAwLCBOVkRFVl9TVUJERVZfSUJVUyB9LAogCXsgMHg4MDAwMDAwMCwgTlZERVZfRU5HSU5FX1NXIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL2kyY18uZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9pMmNfLmZ1YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdkZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9pMmNfLmZ1YwpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjZGVmaW5lIFRfVElNRU9VVCAgMjIwMDAwMAorI2RlZmluZSBUX1JJU0VGQUxMIDEwMDAKKyNkZWZpbmUgVF9IT0xEICAgICA1MDAwCisKKyNpZmRlZiBJTkNMVURFX1BST0MKK3Byb2Nlc3MoUFJPQ19JMkNfLCAjaTJjX2luaXQsICNpMmNfcmVjdikKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJMkNfIGRhdGEgc2VnbWVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIElOQ0xVREVfREFUQQoraTJjX3NjbF9tYXA6CisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ18wX1NDTAorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfMV9TQ0wKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzJfU0NMCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ18zX1NDTAorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfNF9TQ0wKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzVfU0NMCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ182X1NDTAorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfN19TQ0wKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzhfU0NMCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ185X1NDTAoraTJjX3NkYV9tYXA6CisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ18wX1NEQQorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfMV9TREEKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzJfU0RBCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ18zX1NEQQorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfNF9TREEKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzVfU0RBCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ182X1NEQQorLmIzMiBOVl9QUFdSX09VVFBVVF9JMkNfN19TREEKKy5iMzIgTlZfUFBXUl9PVVRQVVRfSTJDXzhfU0RBCisuYjMyIE5WX1BQV1JfT1VUUFVUX0kyQ185X1NEQQorI2lmIE5WS01fUFBXUl9DSElQU0VUIDwgR0YxMTkKK2kyY19jdHJsOgorLmIzMiAweDAwZTEzOAorLmIzMiAweDAwZTE1MAorLmIzMiAweDAwZTE2OAorLmIzMiAweDAwZTE4MAorLmIzMiAweDAwZTI1NAorLmIzMiAweDAwZTI3NAorLmIzMiAweDAwZTc2NAorLmIzMiAweDAwZTc4MAorLmIzMiAweDAwZTc5YworLmIzMiAweDAwZTdiOAorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSTJDXyBjb2RlIHNlZ21lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBJTkNMVURFX0NPREUKKworLy8gJHIzICAtIHZhbHVlCisvLyAkcjIgIC0gc2RhIGxpbmUKKy8vICRyMSAgLSBzY2wgbGluZQorLy8gJHIwICAtIHplcm8KK2kyY19kcml2ZV9zY2w6CisJY21wIGIzMiAkcjMgMAorCWJyYSBlICNpMmNfZHJpdmVfc2NsX2xvCisJbnZfaW93cihOVl9QUFdSX09VVFBVVF9TRVQsICRyMSkKKwlyZXQKKwlpMmNfZHJpdmVfc2NsX2xvOgorCW52X2lvd3IoTlZfUFBXUl9PVVRQVVRfQ0xSLCAkcjEpCisJcmV0CisKK2kyY19kcml2ZV9zZGE6CisJY21wIGIzMiAkcjMgMAorCWJyYSBlICNpMmNfZHJpdmVfc2RhX2xvCisJbnZfaW93cihOVl9QUFdSX09VVFBVVF9TRVQsICRyMikKKwlyZXQKKwlpMmNfZHJpdmVfc2RhX2xvOgorCW52X2lvd3IoTlZfUFBXUl9PVVRQVVRfQ0xSLCAkcjIpCisJcmV0CisKK2kyY19zZW5zZV9zY2w6CisJYmNsciAkZmxhZ3MgJHAxCisJbnZfaW9yZCgkcjMsIE5WX1BQV1JfSU5QVVQpCisJYW5kICRyMyAkcjEKKwlicmEgeiAjaTJjX3NlbnNlX3NjbF9kb25lCisJCWJzZXQgJGZsYWdzICRwMQorCWkyY19zZW5zZV9zY2xfZG9uZToKKwlyZXQKKworaTJjX3NlbnNlX3NkYToKKwliY2xyICRmbGFncyAkcDEKKwludl9pb3JkKCRyMywgTlZfUFBXUl9JTlBVVCkKKwlhbmQgJHIzICRyMgorCWJyYSB6ICNpMmNfc2Vuc2Vfc2RhX2RvbmUKKwkJYnNldCAkZmxhZ3MgJHAxCisJaTJjX3NlbnNlX3NkYV9kb25lOgorCXJldAorCisjZGVmaW5lIGkyY19kcml2ZV9zY2wodikgLyoKKyovCW1vdiAkcjMgKHYpIC8qCisqLwljYWxsKGkyY19kcml2ZV9zY2wpCisjZGVmaW5lIGkyY19kcml2ZV9zZGEodikgLyoKKyovCW1vdiAkcjMgKHYpIC8qCisqLwljYWxsKGkyY19kcml2ZV9zZGEpCisjZGVmaW5lIGkyY19zZW5zZV9zY2woKSAvKgorKi8JY2FsbChpMmNfc2Vuc2Vfc2NsKQorI2RlZmluZSBpMmNfc2Vuc2Vfc2RhKCkgLyoKKyovCWNhbGwoaTJjX3NlbnNlX3NkYSkKKyNkZWZpbmUgaTJjX2RlbGF5KHYpIC8qCisqLwltb3YgJHIxNCAodikgLyoKKyovCWNhbGwobnNlYykKKworI2RlZmluZSBpMmNfdHJhY2VfaW5pdCgpIC8qCisqLwlpbW0zMigkcjYsIDB4MTAwMDAwMDApIC8qCisqLwlzdWIgYjMyICRyNyAkcjYgMSAvKgorKi8KKyNkZWZpbmUgaTJjX3RyYWNlX2Rvd24oKSAvKgorKi8Jc2hyIGIzMiAkcjYgNCAvKgorKi8JcHVzaCAkcjUgLyoKKyovCXNobCBiMzIgJHI1ICRyNiA0IC8qCisqLwlzdWIgYjMyICRyNSAkcjYgLyoKKyovCW5vdCBiMzIgJHI1IC8qCisqLwlhbmQgJHI3ICRyNSAvKgorKi8JcG9wICRyNSAvKgorKi8KKyNkZWZpbmUgaTJjX3RyYWNlX2V4aXQoKSAvKgorKi8Jc2hsIGIzMiAkcjYgNCAvKgorKi8KKyNkZWZpbmUgaTJjX3RyYWNlX25leHQoKSAvKgorKi8JYWRkIGIzMiAkcjcgJHI2IC8qCisqLworI2RlZmluZSBpMmNfdHJhY2VfY2FsbChmdW5jKSAvKgorKi8JaTJjX3RyYWNlX25leHQoKSAvKgorKi8JaTJjX3RyYWNlX2Rvd24oKSAvKgorKi8JY2FsbChmdW5jKSAvKgorKi8JaTJjX3RyYWNlX2V4aXQoKSAvKgorKi8KKworaTJjX3JhaXNlX3NjbDoKKwlwdXNoICRyNAorCW1vdiAkcjQgKFRfVElNRU9VVCAvIFRfUklTRUZBTEwpCisJaTJjX2RyaXZlX3NjbCgxKQorCWkyY19yYWlzZV9zY2xfd2FpdDoKKwkJaTJjX2RlbGF5KFRfUklTRUZBTEwpCisJCWkyY19zZW5zZV9zY2woKQorCQlicmEgJHAxICNpMmNfcmFpc2Vfc2NsX2RvbmUKKwkJc3ViIGIzMiAkcjQgMQorCQlicmEgbnogI2kyY19yYWlzZV9zY2xfd2FpdAorCWkyY19yYWlzZV9zY2xfZG9uZToKKwlwb3AgJHI0CisJcmV0CisKK2kyY19zdGFydDoKKwlpMmNfc2Vuc2Vfc2NsKCkKKwlicmEgbm90ICRwMSAjaTJjX3N0YXJ0X3JlcAorCWkyY19zZW5zZV9zZGEoKQorCWJyYSBub3QgJHAxICNpMmNfc3RhcnRfcmVwCisJYnJhICNpMmNfc3RhcnRfc2VuZAorCWkyY19zdGFydF9yZXA6CisJCWkyY19kcml2ZV9zY2woMCkKKwkJaTJjX2RyaXZlX3NkYSgxKQorCQlpMmNfdHJhY2VfY2FsbChpMmNfcmFpc2Vfc2NsKQorCQlicmEgbm90ICRwMSAjaTJjX3N0YXJ0X291dAorCWkyY19zdGFydF9zZW5kOgorCWkyY19kcml2ZV9zZGEoMCkKKwlpMmNfZGVsYXkoVF9IT0xEKQorCWkyY19kcml2ZV9zY2woMCkKKwlpMmNfZGVsYXkoVF9IT0xEKQorCWkyY19zdGFydF9vdXQ6CisJcmV0CisKK2kyY19zdG9wOgorCWkyY19kcml2ZV9zY2woMCkKKwlpMmNfZHJpdmVfc2RhKDApCisJaTJjX2RlbGF5KFRfUklTRUZBTEwpCisJaTJjX2RyaXZlX3NjbCgxKQorCWkyY19kZWxheShUX0hPTEQpCisJaTJjX2RyaXZlX3NkYSgxKQorCWkyY19kZWxheShUX0hPTEQpCisJcmV0CisKKy8vICRyMyAgLSB2YWx1ZQorLy8gJHIyICAtIHNkYSBsaW5lCisvLyAkcjEgIC0gc2NsIGxpbmUKKy8vICRyMCAgLSB6ZXJvCitpMmNfYml0dzoKKwljYWxsKGkyY19kcml2ZV9zZGEpCisJaTJjX2RlbGF5KFRfUklTRUZBTEwpCisJaTJjX3RyYWNlX2NhbGwoaTJjX3JhaXNlX3NjbCkKKwlicmEgbm90ICRwMSAjaTJjX2JpdHdfb3V0CisJaTJjX2RlbGF5KFRfSE9MRCkKKwlpMmNfZHJpdmVfc2NsKDApCisJaTJjX2RlbGF5KFRfSE9MRCkKKwlpMmNfYml0d19vdXQ6CisJcmV0CisKKy8vICRyMyAgLSB2YWx1ZSAob3V0KQorLy8gJHIyICAtIHNkYSBsaW5lCisvLyAkcjEgIC0gc2NsIGxpbmUKKy8vICRyMCAgLSB6ZXJvCitpMmNfYml0cjoKKwlpMmNfZHJpdmVfc2RhKDEpCisJaTJjX2RlbGF5KFRfUklTRUZBTEwpCisJaTJjX3RyYWNlX2NhbGwoaTJjX3JhaXNlX3NjbCkKKwlicmEgbm90ICRwMSAjaTJjX2JpdHJfZG9uZQorCWkyY19zZW5zZV9zZGEoKQorCWkyY19kcml2ZV9zY2woMCkKKwlpMmNfZGVsYXkoVF9IT0xEKQorCXhiaXQgJHIzICRmbGFncyAkcDEKKwlic2V0ICRmbGFncyAkcDEKKwlpMmNfYml0cl9kb25lOgorCXJldAorCitpMmNfZ2V0X2J5dGU6CisJbW92ICRyNSAwCisJbW92ICRyNCA4CisJaTJjX2dldF9ieXRlX25leHQ6CisJCXNobCBiMzIgJHI1IDEKKwkJaTJjX3RyYWNlX2NhbGwoaTJjX2JpdHIpCisJCWJyYSBub3QgJHAxICNpMmNfZ2V0X2J5dGVfZG9uZQorCQlvciAkcjUgJHIzCisJCXN1YiBiMzIgJHI0IDEKKwkJYnJhIG56ICNpMmNfZ2V0X2J5dGVfbmV4dAorCW1vdiAkcjMgMQorCWkyY190cmFjZV9jYWxsKGkyY19iaXR3KQorCWkyY19nZXRfYnl0ZV9kb25lOgorCXJldAorCitpMmNfcHV0X2J5dGU6CisJbW92ICRyNCA4CisJaTJjX3B1dF9ieXRlX25leHQ6CisJCXN1YiBiMzIgJHI0IDEKKwkJeGJpdCAkcjMgJHI1ICRyNAorCQlpMmNfdHJhY2VfY2FsbChpMmNfYml0dykKKwkJYnJhIG5vdCAkcDEgI2kyY19wdXRfYnl0ZV9kb25lCisJCWNtcCBiMzIgJHI0IDAKKwkJYnJhIG5lICNpMmNfcHV0X2J5dGVfbmV4dAorCWkyY190cmFjZV9jYWxsKGkyY19iaXRyKQorCWJyYSBub3QgJHAxICNpMmNfcHV0X2J5dGVfZG9uZQorCWkyY190cmFjZV9uZXh0KCkKKwljbXAgYjMyICRyMyAxCisJYnJhIG5lICNpMmNfcHV0X2J5dGVfZG9uZQorCWJjbHIgJGZsYWdzICRwMQkvLyBuYWNrCisJaTJjX3B1dF9ieXRlX2RvbmU6CisJcmV0CisKK2kyY19hZGRyOgorCWkyY190cmFjZV9jYWxsKGkyY19zdGFydCkKKwlicmEgbm90ICRwMSAjaTJjX2FkZHJfZG9uZQorCWV4dHIgJHIzICRyMTIgSTJDX19NU0dfREFUQTBfQUREUgorCXNobCBiMzIgJHIzIDEKKwlvciAkcjUgJHIzCisJaTJjX3RyYWNlX2NhbGwoaTJjX3B1dF9ieXRlKQorCWkyY19hZGRyX2RvbmU6CisJcmV0CisKK2kyY19hY3F1aXJlX2FkZHI6CisJZXh0ciAkcjE0ICRyMTIgSTJDX19NU0dfREFUQTBfUE9SVAorI2lmIE5WS01fUFBXUl9DSElQU0VUIDwgR0YxMTkKKwlzaGwgYjMyICRyMTQgMgorCWFkZCBiMzIgJHIxNCAjaTJjX2N0cmwKKwlsZCBiMzIgJHIxNCBEWyRyMTRdCisjZWxzZQorCXNobCBiMzIgJHIxNCA1CisJYWRkIGIzMiAkcjE0IDB4MDBkMDE0CisjZW5kaWYKKwlyZXQKKworaTJjX2FjcXVpcmU6CisJY2FsbChpMmNfYWNxdWlyZV9hZGRyKQorCWNhbGwocmQzMikKKwlic2V0ICRyMTMgMworCWNhbGwod3IzMikKKwlyZXQKKworaTJjX3JlbGVhc2U6CisJY2FsbChpMmNfYWNxdWlyZV9hZGRyKQorCWNhbGwocmQzMikKKwliY2xyICRyMTMgMworCWNhbGwod3IzMikKKwlyZXQKKworLy8gZGVzY3JpcHRpb24KKy8vCisvLyAkcjE1IC0gY3VycmVudCAoaTJjKQorLy8gJHIxNCAtIHNlbmRlciBwcm9jZXNzIG5hbWUKKy8vICRyMTMgLSBtZXNzYWdlCisvLyAkcjEyIC0gZGF0YTAKKy8vICRyMTEgLSBkYXRhMQorLy8gJHIwICAtIHplcm8KK2kyY19yZWN2OgorCWJjbHIgJGZsYWdzICRwMQorCWV4dHIgJHIxICRyMTIgSTJDX19NU0dfREFUQTBfUE9SVAorCXNobCBiMzIgJHIxIDIKKwljbXAgYjMyICRyMSAoI2kyY19zZGFfbWFwIC0gI2kyY19zY2xfbWFwKQorCWJyYSBnZSAjaTJjX3JlY3ZfZG9uZQorCWFkZCBiMzIgJHIzICRyMSAjaTJjX3NkYV9tYXAKKwlsZCBiMzIgJHIyIERbJHIzXQorCWFkZCBiMzIgJHIzICRyMSAjaTJjX3NjbF9tYXAKKwlsZCBiMzIgJHIxIERbJHIzXQorCisJYnNldCAkZmxhZ3MgJHAyCisJcHVzaCAkcjEzCisJcHVzaCAkcjE0CisKKwlwdXNoICRyMTMKKwlpMmNfdHJhY2VfaW5pdCgpCisJaTJjX3RyYWNlX2NhbGwoaTJjX2FjcXVpcmUpCisJcG9wICRyMTMKKworCWNtcCBiMzIgJHIxMyBJMkNfX01TR19SRDA4CisJYnJhIG5lICNpMmNfcmVjdl9ub3RfcmQwOAorCQltb3YgJHI1IDAKKwkJaTJjX3RyYWNlX2NhbGwoaTJjX2FkZHIpCisJCWJyYSBub3QgJHAxICNpMmNfcmVjdl9kb25lCisJCWV4dHIgJHI1ICRyMTIgSTJDX19NU0dfREFUQTBfUkQwOF9SRUcKKwkJaTJjX3RyYWNlX2NhbGwoaTJjX3B1dF9ieXRlKQorCQlicmEgbm90ICRwMSAjaTJjX3JlY3ZfZG9uZQorCQltb3YgJHI1IDEKKwkJaTJjX3RyYWNlX2NhbGwoaTJjX2FkZHIpCisJCWJyYSBub3QgJHAxICNpMmNfcmVjdl9kb25lCisJCWkyY190cmFjZV9jYWxsKGkyY19nZXRfYnl0ZSkKKwkJYnJhIG5vdCAkcDEgI2kyY19yZWN2X2RvbmUKKwkJaW5zICRyMTEgJHI1IEkyQ19fTVNHX0RBVEExX1JEMDhfVkFMCisJCWkyY190cmFjZV9jYWxsKGkyY19zdG9wKQorCQltb3YgYjMyICRyMTEgJHI1CisJCWNsZWFyIGIzMiAkcjcKKwkJYnJhICNpMmNfcmVjdl9kb25lCisKKwlpMmNfcmVjdl9ub3RfcmQwODoKKwljbXAgYjMyICRyMTMgSTJDX19NU0dfV1IwOAorCWJyYSBuZSAjaTJjX3JlY3Zfbm90X3dyMDgKKwkJbW92ICRyNSAwCisJCWNhbGwoaTJjX2FkZHIpCisJCWJyYSBub3QgJHAxICNpMmNfcmVjdl9kb25lCisJCWV4dHIgJHI1ICRyMTIgSTJDX19NU0dfREFUQTBfV1IwOF9SRUcKKwkJY2FsbChpMmNfcHV0X2J5dGUpCisJCWJyYSBub3QgJHAxICNpMmNfcmVjdl9kb25lCisJCW1vdiAkcjUgMAorCQljYWxsKGkyY19hZGRyKQorCQlicmEgbm90ICRwMSAjaTJjX3JlY3ZfZG9uZQorCQlleHRyICRyNSAkcjExIEkyQ19fTVNHX0RBVEExX1dSMDhfVkFMCisJCWNhbGwoaTJjX3B1dF9ieXRlKQorCQlicmEgbm90ICRwMSAjaTJjX3JlY3ZfZG9uZQorCQljYWxsKGkyY19zdG9wKQorCQljbGVhciBiMzIgJHI3CisJCWV4dHIgJHI1ICRyMTIgSTJDX19NU0dfREFUQTBfV1IwOF9TWU5DCisJCWJyYSBueiAjaTJjX3JlY3ZfZG9uZQorCQliY2xyICRmbGFncyAkcDIKKwkJYnJhICNpMmNfcmVjdl9kb25lCisKKwlpMmNfcmVjdl9ub3Rfd3IwODoKKworCWkyY19yZWN2X2RvbmU6CisJZXh0ciAkcjE0ICRyMTIgSTJDX19NU0dfREFUQTBfUE9SVAorCWNhbGwoaTJjX3JlbGVhc2UpCisKKwlwb3AgJHIxNAorCXBvcCAkcjEzCisJYnJhIG5vdCAkcDIgI2kyY19yZWN2X2V4aXQKKwltb3YgYjMyICRyMTIgJHI3CisJY2FsbChzZW5kKQorCisJaTJjX3JlY3ZfZXhpdDoKKwlyZXQKKworLy8gZGVzY3JpcHRpb24KKy8vCisvLyAkcjE1IC0gY3VycmVudCAoaTJjKQorLy8gJHIwICAtIHplcm8KK2kyY19pbml0OgorCXJldAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL2tlcm5lbC5mdWMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL2tlcm5lbC5mdWMKaW5kZXggMGE3YjA1Zi4uOGYyOWJhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9rZXJuZWwuZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMva2VybmVsLmZ1YwpAQCAtNTEsMTIgKzUxLDEyIEBACiAvLyAkcjAgIC0gemVybwogcmQzMjoKIAludl9pb3dyKE5WX1BQV1JfTU1JT19BRERSLCAkcjE0KQotCW1vdiAkcjE0IE5WX1BQV1JfTU1JT19DVFJMX09QX1JECi0Jc2V0aGkgJHIxNCBOVl9QUFdSX01NSU9fQ1RSTF9UUklHR0VSCi0JbnZfaW93cihOVl9QUFdSX01NSU9fQ1RSTCwgJHIxNCkKKwltb3YgJHIxMyBOVl9QUFdSX01NSU9fQ1RSTF9PUF9SRAorCXNldGhpICRyMTMgTlZfUFBXUl9NTUlPX0NUUkxfVFJJR0dFUgorCW52X2lvd3IoTlZfUFBXUl9NTUlPX0NUUkwsICRyMTMpCiAJcmQzMl93YWl0OgotCQludl9pb3JkKCRyMTQsIE5WX1BQV1JfTU1JT19DVFJMKQotCQlhbmQgJHIxNCBOVl9QUFdSX01NSU9fQ1RSTF9TVEFUVVMKKwkJbnZfaW9yZCgkcjEzLCBOVl9QUFdSX01NSU9fQ1RSTCkKKwkJYW5kICRyMTMgTlZfUFBXUl9NTUlPX0NUUkxfU1RBVFVTCiAJCWJyYSBueiAjcmQzMl93YWl0CiAJbnZfaW9yZCgkcjEzLCBOVl9QUFdSX01NSU9fREFUQSkKIAlyZXQKQEAgLTcwLDIzICs3MCwyNSBAQAogd3IzMjoKIAludl9pb3dyKE5WX1BQV1JfTU1JT19BRERSLCAkcjE0KQogCW52X2lvd3IoTlZfUFBXUl9NTUlPX0RBVEEsICRyMTMpCi0JbW92ICRyMTQgTlZfUFBXUl9NTUlPX0NUUkxfT1BfV1IKLQlvciAkcjE0IE5WX1BQV1JfTU1JT19DVFJMX01BU0tfQjMyXzAKLQlzZXRoaSAkcjE0IE5WX1BQV1JfTU1JT19DVFJMX1RSSUdHRVIKKwltb3YgJHIxMyBOVl9QUFdSX01NSU9fQ1RSTF9PUF9XUgorCW9yICRyMTMgTlZfUFBXUl9NTUlPX0NUUkxfTUFTS19CMzJfMAorCXNldGhpICRyMTMgTlZfUFBXUl9NTUlPX0NUUkxfVFJJR0dFUgogCiAjaWZkZWYgTlZLTV9GQUxDT05fTU1JT19UUkFQCi0JbW92ICRyOCBOVl9QUFdSX0lOVFJfVFJJR0dFUl9VU0VSMQotCW52X2lvd3IoTlZfUFBXUl9JTlRSX1RSSUdHRVIsICRyOCkKKwlwdXNoICRyMTMKKwltb3YgJHIxMyBOVl9QUFdSX0lOVFJfVFJJR0dFUl9VU0VSMQorCW52X2lvd3IoTlZfUFBXUl9JTlRSX1RSSUdHRVIsICRyMTMpCiAJd3IzMl9ob3N0OgotCQludl9pb3JkKCRyOCwgTlZfUFBXUl9JTlRSKQotCQlhbmQgJHI4IE5WX1BQV1JfSU5UUl9VU0VSMQorCQludl9pb3JkKCRyMTMsIE5WX1BQV1JfSU5UUikKKwkJYW5kICRyMTMgTlZfUFBXUl9JTlRSX1VTRVIxCiAJCWJyYSBueiAjd3IzMl9ob3N0CisJcG9wICRyMTMKICNlbmRpZgogCi0JbnZfaW93cihOVl9QUFdSX01NSU9fQ1RSTCwgJHIxNCkKKwludl9pb3dyKE5WX1BQV1JfTU1JT19DVFJMLCAkcjEzKQogCXdyMzJfd2FpdDoKLQkJbnZfaW9yZCgkcjE0LCBOVl9QUFdSX01NSU9fQ1RSTCkKLQkJYW5kICRyMTQgTlZfUFBXUl9NTUlPX0NUUkxfU1RBVFVTCisJCW52X2lvcmQoJHIxMywgTlZfUFBXUl9NTUlPX0NUUkwpCisJCWFuZCAkcjEzIE5WX1BQV1JfTU1JT19DVFJMX1NUQVRVUwogCQlicmEgbnogI3dyMzJfd2FpdAogCXJldAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL21hY3Jvcy5mdWMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL21hY3Jvcy5mdWMKaW5kZXggMmE3NGVhOS4uZTJhNjNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9tYWNyb3MuZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbWFjcm9zLmZ1YwpAQCAtODMsNiArODMsNTAgQEAKICNkZWZpbmUgTlZfUFBXUl9NTUlPX0NUUkxfT1BfV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgTlZfUFBXUl9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3YzAKICNkZWZpbmUgTlZfUFBXUl9PVVRQVVRfRkJfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNpZiBOVktNX1BQV1JfQ0hJUFNFVCA8IEdGMTE5CisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18zX1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18zX1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18wX1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18wX1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18xX1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18xX1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18yX1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ18yX1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ180X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ180X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ181X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ181X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ182X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ182X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ183X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ183X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ184X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ184X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ185X1NDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0kyQ185X1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZWxzZQorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMF9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMV9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMl9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfM19TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNF9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNV9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNl9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfN19TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfOF9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfOV9TQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMF9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMV9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfMl9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfM19TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNF9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNV9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfNl9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfN19TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfOF9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBOVl9QUFdSX09VVFBVVF9JMkNfOV9TREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisjZGVmaW5lIE5WX1BQV1JfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2M0CiAjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2UwCiAjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX1NFVF9GQl9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lIE5WX1BQV1JfT1VUUFVUX0NMUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2U0CkBAIC0xMjUsNiArMTY5LDE1IEBACiAqLwkuYjMyIDAgLyoKICovCS5za2lwIDY0CiAKKyNpZiBOVl9QUFdSX0NISVBTRVQgPCBHSzIwOAorI2RlZmluZSBpbW0zMihyZWcsdmFsKSAvKgorKi8JbW92dyByZWcgICgodmFsKSAmIDB4MDAwMGZmZmYpIC8qCisqLwlzZXRoaSByZWcgKCh2YWwpICYgMHhmZmZmMDAwMCkKKyNlbHNlCisjZGVmaW5lIGltbTMyKHJlZyx2YWwpIC8qCisqLwltb3YgcmVnICh2YWwpCisjZW5kaWYKKwogI2lmbmRlZiBOVktNX0ZBTENPTl9VTlNISUZURURfSU8KICNkZWZpbmUgbnZfaW9yZChyZWcsaW9yKSAvKgogKi8JbW92IHJlZyBpb3IgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnYxMDguZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udjEwOC5mdWMKaW5kZXggOTQ3YmU1My4uMTdhOGEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udjEwOC5mdWMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udjEwOC5mdWMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX1BST0MKQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX0RBVEEKQEAgLTU3LDYgKzU5LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX0NPREUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnYxMDguZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252MTA4LmZ1Yy5oCmluZGV4IDkzNDJlMmQuLjRiZDQzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnYxMDguZnVjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udjEwOC5mdWMuaApAQCAtODksOSArODksMzEgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKKwkweDVmNDMzMjQ5LAorCTB4MDAwMDA4NzcsCisJMHgwMDAwMDcxZSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAogCTB4NTQ1MzQ1NTQsCi0JMHgwMDAwMDQ5NCwKLQkweDAwMDAwNDc1LAorCTB4MDAwMDA4OTgsCisJMHgwMDAwMDg3OSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTExMiw4ICsxMzQsOCBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDQ1NGM0NDQ5LAotCTB4MDAwMDA0OWYsCi0JMHgwMDAwMDQ5ZCwKKwkweDAwMDAwOGEzLAorCTB4MDAwMDA4YTEsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0xMzMsMTIgKzE1NSwxMiBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwMjEwOiBwcm9jX2xpc3RfdGFpbCAqLwotLyogMHgwMjEwOiB0aW1lX3ByZXYgKi8KKy8qIDB4MDI2ODogcHJvY19saXN0X3RhaWwgKi8KKy8qIDB4MDI2ODogdGltZV9wcmV2ICovCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDIxNDogdGltZV9uZXh0ICovCisvKiAweDAyNmM6IHRpbWVfbmV4dCAqLwogCTB4MDAwMDAwMDAsCi0vKiAweDAyMTg6IGZpZm9fcXVldWUgKi8KKy8qIDB4MDI3MDogZmlmb19xdWV1ZSAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtMTcxLDcgKzE5Myw3IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0vKiAweDAyOTg6IHJmaWZvX3F1ZXVlICovCisvKiAweDAyZjA6IHJmaWZvX3F1ZXVlICovCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0yMDQsMTEgKzIyNiwxMSBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwMzE4OiBtZW14X2Z1bmNfaGVhZCAqLworLyogMHgwMzcwOiBtZW14X2Z1bmNfaGVhZCAqLwogCTB4MDAwMTAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwM2E5LAotLyogMHgwMzI0OiBtZW14X2Z1bmNfbmV4dCAqLworLyogMHgwMzdjOiBtZW14X2Z1bmNfbmV4dCAqLwogCTB4MDAwMDAwMDEsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwM2M3LApAQCAtMjIxLDggKzI0Myw4IEBACiAJMHgwMDAxMDAwNCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDA0MjEsCi0vKiAweDAzNTQ6IG1lbXhfZnVuY190YWlsICovCi0vKiAweDAzNTQ6IG1lbXhfZGF0YV9oZWFkICovCisvKiAweDAzYWM6IG1lbXhfZnVuY190YWlsICovCisvKiAweDAzYWM6IG1lbXhfZGF0YV9oZWFkICovCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC03MzUsNDkgKzc1NywyOSBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwYjU0OiBtZW14X2RhdGFfdGFpbCAqLwotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorLyogMHgwYmFjOiBtZW14X2RhdGFfdGFpbCAqLworLyogMHgwYmFjOiBpMmNfc2NsX21hcCAqLworCTB4MDAwMDA0MDAsCisJMHgwMDAwMDgwMCwKKwkweDAwMDAxMDAwLAorCTB4MDAwMDIwMDAsCisJMHgwMDAwNDAwMCwKKwkweDAwMDA4MDAwLAorCTB4MDAwMTAwMDAsCisJMHgwMDAyMDAwMCwKKwkweDAwMDQwMDAwLAorCTB4MDAwODAwMDAsCisvKiAweDBiZDQ6IGkyY19zZGFfbWFwICovCisJMHgwMDEwMDAwMCwKKwkweDAwMjAwMDAwLAorCTB4MDA0MDAwMDAsCisJMHgwMDgwMDAwMCwKKwkweDAxMDAwMDAwLAorCTB4MDIwMDAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDA4MDAwMDAwLAorCTB4MTAwMDAwMDAsCisJMHgyMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogfTsKIApAQCAtNzg2LDEzICs3ODgsMTMgQEAKIC8qIDB4MDAwNDogcmQzMiAqLwogCTB4ZjYwN2EwNDAsCiAJMHgwNGJkMDAwZSwKLQkweGUzZjAwMTBlLAorCTB4ZDNmMDAxMGQsCiAJMHgwN2FjNDAwMSwKLQkweGJkMDAwZWY2LAorCTB4YmQwMDBkZjYsCiAvKiAweDAwMTk6IHJkMzJfd2FpdCAqLwotCTB4MDdhYzRlMDQsCi0JMHhmMTAwZWVjZiwKLQkweGY0NzAwMGU0LAorCTB4MDdhYzRkMDQsCisJMHhmMTAwZGRjZiwKKwkweGY0NzAwMGQ0LAogCTB4YTQ0ZGY2MWIsCiAJMHgwMGRkY2YwNywKIC8qIDB4MDAyZTogd3IzMiAqLwpAQCAtODAwLDE0ICs4MDIsMTQgQEAKIAkweDAwMGVmNjA3LAogCTB4YTQ0MDA0YmQsCiAJMHgwMDBkZjYwNywKLQkweDAyMGUwNGJkLAotCTB4ZjBmMGU1ZjAsCi0JMHhhYzQwMDFlMywKLQkweDAwMGVmNjA3LAorCTB4MDIwZDA0YmQsCisJMHhmMGYwZDVmMCwKKwkweGFjNDAwMWQzLAorCTB4MDAwZGY2MDcsCiAvKiAweDAwNGU6IHdyMzJfd2FpdCAqLwotCTB4YWM0ZTA0YmQsCi0JMHgwMGVlY2YwNywKLQkweDcwMDBlNGYxLAorCTB4YWM0ZDA0YmQsCisJMHgwMGRkY2YwNywKKwkweDcwMDBkNGYxLAogCTB4ZjhmNjFiZjQsCiAvKiAweDAwNWQ6IG5zZWMgKi8KIAkweGNmMmMwODAwLApAQCAtODMyLDIwICs4MzQsMjAgQEAKIAkweDAzZTk5ODAwLAogCTB4ZjQwMDk2YjAsCiAJMHgwYTk4MjgwYiwKLQkweDAyOWFiYjg0LAorCTB4MDI5YWJiOWEsCiAJMHgwZDBlMWNmNCwKIAkweDAxZGU3ZTAxLAogCTB4ZjQ5NGJkMDAsCiAvKiAweDAwYjI6IGludHJfd2F0Y2hkb2dfbmV4dF90aW1lICovCiAJMHgwYTk4MTQwZSwKLQkweDAwYTZiMDg1LAorCTB4MDBhNmIwOWIsCiAJMHhhNjA4MGJmNCwKIAkweDA2MWNmNDlhLAogLyogMHgwMGMwOiBpbnRyX3dhdGNoZG9nX25leHRfdGltZV9zZXQgKi8KIC8qIDB4MDBjMzogaW50cl93YXRjaGRvZ19uZXh0X3Byb2MgKi8KLQkweGI1ODUwOWI1LAorCTB4YjU5YjA5YjUsCiAJMHhlMGI2MDNlOSwKLQkweDEwZTZiMTU4LAorCTB4NjhlNmIxNTgsCiAJMHhjODFiZjQwMiwKIC8qIDB4MDBkMjogaW50ciAqLwogCTB4MDBmOTAwZjgsCkBAIC04NjIsMTUgKzg2NCwxNSBAQAogCTB4MDgwODA0YmQsCiAJMHhjNDAwODhjZiwKIAkweDBiZjQwMjg5LAotCTB4ODUwMGI1MWYsCisJMHg5YjAwYjUxZiwKIAkweDk1N2U1ODBlLAogCTB4MDk5ODAwMDAsCi0JMHgwMDk2YjA4NSwKKwkweDAwOTZiMDliLAogCTB4MDAwZDBiZjQsCiAJMHgwMDA5ZjYzNCwKIAkweDA5YjUwNGJkLAogLyogMHgwMTI1OiBpbnRyX3NraXBfd2F0Y2hkb2cgKi8KLQkweDAwODllNDg0LAorCTB4MDA4OWU0OWEsCiAJMHgzNjBiZjQwOCwKIAkweGNmMDY4ODQ5LAogCTB4OWFjNDAwOTksCkBAIC05MTgsNyArOTIwLDcgQEAKIC8qIDB4MDFjNjogdGltZXJfcmVzZXQgKi8KIAkweDM0MDAxNjFlLAogCTB4YmQwMDBlZjYsCi0JMHg4NDBlYjUwNCwKKwkweDlhMGViNTA0LAogLyogMHgwMWQwOiB0aW1lcl9lbmFibGUgKi8KIAkweDM4MDAwMTA4LAogCTB4YmQwMDA4ZjYsCkBAIC05NDksNyArOTUxLDcgQEAKIAkweGE2MDA4YTk4LAogCTB4MTAwYmY0YWUsCiAJMHhiMTU4ODBiNiwKLQkweGY0MDIxMDg2LAorCTB4ZjQwMjY4ODYsCiAJMHgzMmY0ZjExYiwKIC8qIDB4MDIzOTogZmluZF9kb25lICovCiAJMHhmYzhlYjIwMSwKQEAgLTEwMDksNyArMTAxMSw3IEBACiAJMHgwYmY0MTJhNiwKIAkweDA3MWVjNDJlLAogCTB4YjcwNGVlOTQsCi0JMHg5ODAyMThlMCwKKwkweDk4MDI3MGUwLAogCTB4ZWM5ODAzZWIsCiAJMHgwMWVkOTgwMiwKIAkweDdlMDBlZTk4LApAQCAtMTAzMSw3ICsxMDMzLDcgQEAKIAkweGY0MTJhNjA4LAogCTB4MjNjNGVmMGIsCiAJMHgwNDM0YjYwNywKLQkweDAyOTgzMGI3LAorCTB4MDJmMDMwYjcsCiAJMHhiNTAzM2JiNSwKIAkweDNkYjUwMjNjLAogCTB4MDAzZWI1MDEsCkBAIC0xMDQ0LDExICsxMDQ2LDExIEBACiAvKiAweDAzNzk6IGhvc3RfaW5pdCAqLwogCTB4MDA4MDQxMDAsCiAJMHhmMTEwMTRiNiwKLQkweDQwMDIxODE1LAorCTB4NDAwMjcwMTUsCiAJMHgwMWY2MDRkMCwKIAkweDQxMDRiZDAwLAogCTB4MTRiNjAwODAsCi0JMHg5ODE1ZjExMCwKKwkweGYwMTVmMTEwLAogCTB4MDRkYzQwMDIsCiAJMHhiZDAwMDFmNiwKIAkweDQwMDEwMTA0LApAQCAtMTEwMSwxMyArMTEwMywxMyBAQAogCTB4MDAxMzk4YjIsCiAJMHg5NTA0MTBiNiwKIAkweDMwZjAxMDM0LAotCTB4YzgzNTk4MGMsCisJMHhkZTM1OTgwYywKIAkweDEyYTY1NWY5LAogCTB4ZmNlZDFlZjQsCiAJMHg3ZWUwZmNkMCwKIAkweGY4MDAwMjNmLAogLyogMHgwNDU1OiBtZW14X2luZm8gKi8KLQkweDAzNTQ0YzAwLAorCTB4MDNhYzRjMDAsCiAJMHg3ZTA4MDA0YiwKIAkweGY4MDAwMjNmLAogLyogMHgwNDYxOiBtZW14X3JlY3YgKi8KQEAgLTExMTksNyArMTEyMSwzMDEgQEAKIC8qIDB4MDQ3MTogcGVyZl9yZWN2ICovCiAvKiAweDA0NzM6IHBlcmZfaW5pdCAqLwogCTB4ZjgwMGY4MDAsCi0vKiAweDA0NzU6IHRlc3RfcmVjdiAqLworLyogMHgwNDc1OiBpMmNfZHJpdmVfc2NsICovCisJMHgwMDM2YjAwMCwKKwkweDQwMGQwYmY0LAorCTB4MDFmNjA3ZTAsCisJMHhmODA0YmQwMCwKKy8qIDB4MDQ4NTogaTJjX2RyaXZlX3NjbF9sbyAqLworCTB4MDdlNDQwMDAsCisJMHhiZDAwMDFmNiwKKy8qIDB4MDQ4ZjogaTJjX2RyaXZlX3NkYSAqLworCTB4YjAwMGY4MDQsCisJMHgwYmY0MDAzNiwKKwkweDA3ZTA0MDBkLAorCTB4YmQwMDAyZjYsCisvKiAweDA0OWY6IGkyY19kcml2ZV9zZGFfbG8gKi8KKwkweDQwMDBmODA0LAorCTB4MDJmNjA3ZTQsCisJMHhmODA0YmQwMCwKKy8qIDB4MDRhOTogaTJjX3NlbnNlX3NjbCAqLworCTB4MDEzMmY0MDAsCisJMHhjZjA3YzQ0MywKKwkweDMxZmQwMDMzLAorCTB4MDYwYmY0MDQsCisvKiAweDA0YmI6IGkyY19zZW5zZV9zY2xfZG9uZSAqLworCTB4ZjgwMTMxZjQsCisvKiAweDA0YmQ6IGkyY19zZW5zZV9zZGEgKi8KKwkweDAxMzJmNDAwLAorCTB4Y2YwN2M0NDMsCisJMHgzMmZkMDAzMywKKwkweDA2MGJmNDA0LAorLyogMHgwNGNmOiBpMmNfc2Vuc2Vfc2RhX2RvbmUgKi8KKwkweGY4MDEzMWY0LAorLyogMHgwNGQxOiBpMmNfcmFpc2Vfc2NsICovCisJMHg0NDQwZjkwMCwKKwkweDAxMDMwODk4LAorCTB4MDAwNDc1N2UsCisvKiAweDA0ZGM6IGkyY19yYWlzZV9zY2xfd2FpdCAqLworCTB4N2UwM2U4NGUsCisJMHg3ZTAwMDA1ZCwKKwkweGY0MDAwNGE5LAorCTB4NDJiNjA5MDEsCisJMHhlZjFiZjQwMSwKKy8qIDB4MDRmMDogaTJjX3JhaXNlX3NjbF9kb25lICovCisJMHgwMGY4NDBmYywKKy8qIDB4MDRmNDogaTJjX3N0YXJ0ICovCisJMHgwMDA0YTk3ZSwKKwkweDdlMGQxMWY0LAorCTB4ZjQwMDA0YmQsCisJMHgwZWY0MDYxMSwKKy8qIDB4MDUwNTogaTJjX3N0YXJ0X3JlcCAqLworCTB4N2UwMDAzMmUsCisJMHgwMzAwMDQ3NSwKKwkweDA0OGY3ZTAxLAorCTB4MDA3NmJiMDAsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweGQxN2U1MGZjLAorCTB4NjRiNjAwMDQsCisJMHgxZDExZjQwNCwKKy8qIDB4MDUzMDogaTJjX3N0YXJ0X3NlbmQgKi8KKwkweDhmN2UwMDAzLAorCTB4ODg0ZTAwMDQsCisJMHgwMDVkN2UxMywKKwkweDdlMDAwMzAwLAorCTB4NGUwMDA0NzUsCisJMHg1ZDdlMTM4OCwKKy8qIDB4MDU0YTogaTJjX3N0YXJ0X291dCAqLworCTB4MDBmODAwMDAsCisvKiAweDA1NGM6IGkyY19zdG9wICovCisJMHg3NTdlMDAwMywKKwkweDAwMDMwMDA0LAorCTB4MDAwNDhmN2UsCisJMHg3ZTAzZTg0ZSwKKwkweDAzMDAwMDVkLAorCTB4MDQ3NTdlMDEsCisJMHgxMzg4NGUwMCwKKwkweDAwMDA1ZDdlLAorCTB4OGY3ZTAxMDMsCisJMHg4ODRlMDAwNCwKKwkweDAwNWQ3ZTEzLAorLyogMHgwNTdiOiBpMmNfYml0dyAqLworCTB4N2UwMGY4MDAsCisJMHg0ZTAwMDQ4ZiwKKwkweDVkN2UwM2U4LAorCTB4NzZiYjAwMDAsCisJMHgwNDY1YjYwMCwKKwkweDY1OTQ1MGY5LAorCTB4MDI1NmJiMDQsCisJMHg3NWZkNTBiZCwKKwkweDdlNTBmYzA0LAorCTB4YjYwMDA0ZDEsCisJMHgxMWY0MDQ2NCwKKwkweDEzODg0ZTE3LAorCTB4MDAwMDVkN2UsCisJMHg3NTdlMDAwMywKKwkweDg4NGUwMDA0LAorCTB4MDA1ZDdlMTMsCisvKiAweDA1Yjk6IGkyY19iaXR3X291dCAqLworLyogMHgwNWJiOiBpMmNfYml0ciAqLworCTB4MDMwMGY4MDAsCisJMHgwNDhmN2UwMSwKKwkweDAzZTg0ZTAwLAorCTB4MDAwMDVkN2UsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4MDRkMTdlNTAsCisJMHgwNDY0YjYwMCwKKwkweDdlMWExMWY0LAorCTB4MDMwMDA0YmQsCisJMHgwNDc1N2UwMCwKKwkweDEzODg0ZTAwLAorCTB4MDAwMDVkN2UsCisJMHhmNDAxM2NmMCwKKy8qIDB4MDVmZTogaTJjX2JpdHJfZG9uZSAqLworCTB4MDBmODAxMzEsCisvKiAweDA2MDA6IGkyY19nZXRfYnl0ZSAqLworCTB4MDgwNDAwMDUsCisvKiAweDA2MDQ6IGkyY19nZXRfYnl0ZV9uZXh0ICovCisJMHhiYjAxNTRiNiwKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwMDA1YmI3ZSwKKwkweGY0MDQ2NGI2LAorCTB4NTNmZDJhMTEsCisJMHgwMTQyYjYwNSwKKwkweDAzZDgxYmY0LAorCTB4MDA3NmJiMDEsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweDdiN2U1MGZjLAorCTB4NjRiNjAwMDUsCisvKiAweDA2NGQ6IGkyY19nZXRfYnl0ZV9kb25lICovCisvKiAweDA2NGY6IGkyY19wdXRfYnl0ZSAqLworCTB4MDQwMGY4MDQsCisvKiAweDA2NTE6IGkyY19wdXRfYnl0ZV9uZXh0ICovCisJMHgwMTQyYjYwOCwKKwkweGJiMzg1NGZmLAorCTB4NjViNjAwNzYsCisJMHg5NDUwZjkwNCwKKwkweDU2YmIwNDY1LAorCTB4ZmQ1MGJkMDIsCisJMHg1MGZjMDQ3NSwKKwkweDAwMDU3YjdlLAorCTB4ZjQwNDY0YjYsCisJMHg0NmIwMzQxMSwKKwkweGQ4MWJmNDAwLAorCTB4YjYwMDc2YmIsCisJMHg1MGY5MDQ2NSwKKwkweGJiMDQ2NTk0LAorCTB4NTBiZDAyNTYsCisJMHhmYzA0NzVmZCwKKwkweDA1YmI3ZTUwLAorCTB4MDQ2NGI2MDAsCisJMHhiYjBmMTFmNCwKKwkweDM2YjAwMDc2LAorCTB4MDYxYmY0MDEsCisvKiAweDA2YTc6IGkyY19wdXRfYnl0ZV9kb25lICovCisJMHhmODAxMzJmNCwKKy8qIDB4MDZhOTogaTJjX2FkZHIgKi8KKwkweDAwNzZiYjAwLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHhmNDdlNTBmYywKKwkweDY0YjYwMDA0LAorCTB4MjkxMWY0MDQsCisJMHgwMTJlYzNlNywKKwkweGZkMDEzNGI2LAorCTB4NzZiYjA1NTMsCisJMHgwNDY1YjYwMCwKKwkweDY1OTQ1MGY5LAorCTB4MDI1NmJiMDQsCisJMHg3NWZkNTBiZCwKKwkweDdlNTBmYzA0LAorCTB4YjYwMDA2NGYsCisvKiAweDA2ZWU6IGkyY19hZGRyX2RvbmUgKi8KKwkweDAwZjgwNDY0LAorLyogMHgwNmYwOiBpMmNfYWNxdWlyZV9hZGRyICovCisJMHhiNmY4Y2VjNywKKwkweGUwYjcwNWU0LAorCTB4MDBmOGQwMTQsCisvKiAweDA2ZmM6IGkyY19hY3F1aXJlICovCisJMHgwMDA2ZjA3ZSwKKwkweDAwMDAwNDdlLAorCTB4N2UwM2Q5ZjAsCisJMHhmODAwMDAyZSwKKy8qIDB4MDcwZDogaTJjX3JlbGVhc2UgKi8KKwkweDA2ZjA3ZTAwLAorCTB4MDAwNDdlMDAsCisJMHgwM2RhZjAwMCwKKwkweDAwMDAyZTdlLAorLyogMHgwNzFlOiBpMmNfcmVjdiAqLworCTB4MzJmNDAwZjgsCisJMHhmOGMxYzcwMSwKKwkweGIwMDIxNGI2LAorCTB4MWZmNTI4MTYsCisJMHgxM2I4MDEzNywKKwkweDk4MDAwYmQ0LAorCTB4MTNiODAwMzIsCisJMHg5ODAwMGJhYywKKwkweDMxZjQwMDMxLAorCTB4ZjlkMGY5MDIsCisJMHhmMWQwZjllMCwKKwkweGYxMDAwMDY3LAorCTB4OTIxMDAwNjMsCisJMHg3NmJiMDE2NywKKwkweDA0NjViNjAwLAorCTB4NjU5NDUwZjksCisJMHgwMjU2YmIwNCwKKwkweDc1ZmQ1MGJkLAorCTB4N2U1MGZjMDQsCisJMHhiNjAwMDZmYywKKwkweGQwZmMwNDY0LAorCTB4ZjUwMGQ2YjAsCisJMHgwNTAwYjAxYiwKKwkweDAwNzZiYjAwLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHhhOTdlNTBmYywKKwkweDY0YjYwMDA2LAorCTB4Y2MxMWY1MDQsCisJMHhlMGM1YzcwMCwKKwkweGI2MDA3NmJiLAorCTB4NTBmOTA0NjUsCisJMHhiYjA0NjU5NCwKKwkweDUwYmQwMjU2LAorCTB4ZmMwNDc1ZmQsCisJMHgwNjRmN2U1MCwKKwkweDA0NjRiNjAwLAorCTB4MDBhOTExZjUsCisJMHg3NmJiMDEwNSwKKwkweDA0NjViNjAwLAorCTB4NjU5NDUwZjksCisJMHgwMjU2YmIwNCwKKwkweDc1ZmQ1MGJkLAorCTB4N2U1MGZjMDQsCisJMHhiNjAwMDZhOSwKKwkweDExZjUwNDY0LAorCTB4NzZiYjAwODcsCisJMHgwNDY1YjYwMCwKKwkweDY1OTQ1MGY5LAorCTB4MDI1NmJiMDQsCisJMHg3NWZkNTBiZCwKKwkweDdlNTBmYzA0LAorCTB4YjYwMDA2MDAsCisJMHgxMWY0MDQ2NCwKKwkweGUwNWJjYjY3LAorCTB4YjYwMDc2YmIsCisJMHg1MGY5MDQ2NSwKKwkweGJiMDQ2NTk0LAorCTB4NTBiZDAyNTYsCisJMHhmYzA0NzVmZCwKKwkweDA1NGM3ZTUwLAorCTB4MDQ2NGI2MDAsCisJMHg3NGJkNWJiMiwKKy8qIDB4MDgyMzogaTJjX3JlY3Zfbm90X3JkMDggKi8KKwkweGIwNDEwZWY0LAorCTB4MWJmNDAxZDYsCisJMHg3ZTAwMDUzYiwKKwkweGY0MDAwNmE5LAorCTB4YzVjNzMyMTEsCisJMHgwNjRmN2VlMCwKKwkweDI4MTFmNDAwLAorCTB4YTk3ZTAwMDUsCisJMHgxMWY0MDAwNiwKKwkweGUwYjVjNzFmLAorCTB4MDAwNjRmN2UsCisJMHg3ZTE1MTFmNCwKKwkweGJkMDAwNTRjLAorCTB4MDhjNWM3NzQsCisJMHhmNDA5MWJmNCwKKwkweDBlZjQwMjMyLAorLyogMHgwODYxOiBpMmNfcmVjdl9ub3Rfd3IwOCAqLworLyogMHgwODYxOiBpMmNfcmVjdl9kb25lICovCisJMHhmOGNlYzcwMywKKwkweDAwMDcwZDdlLAorCTB4ZDBmY2UwZmMsCisJMHhiMjA5MTJmNCwKKwkweDAyM2Y3ZTdjLAorLyogMHgwODc1OiBpMmNfcmVjdl9leGl0ICovCisvKiAweDA4Nzc6IGkyY19pbml0ICovCisJMHhmODAwZjgwMCwKKy8qIDB4MDg3OTogdGVzdF9yZWN2ICovCiAJMHgwNDU4NDEwMCwKIAkweGI2MDAxMWNmLAogCTB4NTg0MDAxMTAsCkBAIC0xMTI4LDI2ICsxNDI0LDI2IEBACiAJMHhlM2YxZDkwMCwKIAkweDk2N2UxMzRmLAogCTB4MDBmODAwMDEsCi0vKiAweDA0OTQ6IHRlc3RfaW5pdCAqLworLyogMHgwODk4OiB0ZXN0X2luaXQgKi8KIAkweDdlMDgwMDRlLAogCTB4ZjgwMDAxOTYsCi0vKiAweDA0OWQ6IGlkbGVfcmVjdiAqLwotLyogMHgwNDlmOiBpZGxlICovCisvKiAweDA4YTE6IGlkbGVfcmVjdiAqLworLyogMHgwOGEzOiBpZGxlICovCiAJMHhmNDAwZjgwMCwKIAkweDU0NDEwMDMxLAogCTB4MDAxMWNmMDQsCiAJMHg0MDAxMTBiNiwKIAkweDAxZjYwNDU0LAotLyogMHgwNGIzOiBpZGxlX2xvb3AgKi8KKy8qIDB4MDhiNzogaWRsZV9sb29wICovCiAJMHgwMTA0YmQwMCwKIAkweDAyMzJmNDU4LAotLyogMHgwNGI4OiBpZGxlX3Byb2MgKi8KLS8qIDB4MDRiODogaWRsZV9wcm9jX2V4ZWMgKi8KKy8qIDB4MDhiYzogaWRsZV9wcm9jICovCisvKiAweDA4YmM6IGlkbGVfcHJvY19leGVjICovCiAJMHgxZWIyMTBmOSwKIAkweDAwMDI0ODdlLAogCTB4MTFmNDEwZmMsCiAJMHgwMjMxZjQwOSwKLS8qIDB4MDRjYjogaWRsZV9wcm9jX25leHQgKi8KKy8qIDB4MDhjZjogaWRsZV9wcm9jX25leHQgKi8KIAkweGI2ZjAwZWY0LAogCTB4MWZhNjU4MTAsCiAJMHhmNGU4MWJmNCwKQEAgLTExNjEsNSArMTQ1Nyw0IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252YTMuZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmEzLmZ1YwppbmRleCA2ZmRlMGI4Li42NzQ0ZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252YTMuZnVjCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZhMy5mdWMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX1BST0MKQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX0RBVEEKQEAgLTU3LDYgKzU5LDcgQEAKICNpbmNsdWRlICJob3N0LmZ1YyIKICNpbmNsdWRlICJtZW14LmZ1YyIKICNpbmNsdWRlICJwZXJmLmZ1YyIKKyNpbmNsdWRlICJpMmNfLmZ1YyIKICNpbmNsdWRlICJ0ZXN0LmZ1YyIKICNpbmNsdWRlICJpZGxlLmZ1YyIKICN1bmRlZiBJTkNMVURFX0NPREUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZhMy5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZhMy5mdWMuaAppbmRleCAwZmE0ZDdkLi41YTczZmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252YTMuZnVjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmEzLmZ1Yy5oCkBAIC04OSw5ICs4OSwzMSBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAorCTB4NWY0MzMyNDksCisJMHgwMDAwMDk4MiwKKwkweDAwMDAwODI1LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCiAJMHg1NDUzNDU1NCwKLQkweDAwMDAwNTdiLAotCTB4MDAwMDA1NTQsCisJMHgwMDAwMDlhYiwKKwkweDAwMDAwOTg0LAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtMTEyLDggKzEzNCw4IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4NDU0YzQ0NDksCi0JMHgwMDAwMDU4NywKLQkweDAwMDAwNTg1LAorCTB4MDAwMDA5YjcsCisJMHgwMDAwMDliNSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTEzMywxMiArMTU1LDEyIEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0vKiAweDAyMTA6IHByb2NfbGlzdF90YWlsICovCi0vKiAweDAyMTA6IHRpbWVfcHJldiAqLworLyogMHgwMjY4OiBwcm9jX2xpc3RfdGFpbCAqLworLyogMHgwMjY4OiB0aW1lX3ByZXYgKi8KIAkweDAwMDAwMDAwLAotLyogMHgwMjE0OiB0aW1lX25leHQgKi8KKy8qIDB4MDI2YzogdGltZV9uZXh0ICovCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDIxODogZmlmb19xdWV1ZSAqLworLyogMHgwMjcwOiBmaWZvX3F1ZXVlICovCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0xNzEsNyArMTkzLDcgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDI5ODogcmZpZm9fcXVldWUgKi8KKy8qIDB4MDJmMDogcmZpZm9fcXVldWUgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTIwNCwxMSArMjI2LDExIEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0vKiAweDAzMTg6IG1lbXhfZnVuY19oZWFkICovCisvKiAweDAzNzA6IG1lbXhfZnVuY19oZWFkICovCiAJMHgwMDAxMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDA0NmYsCi0vKiAweDAzMjQ6IG1lbXhfZnVuY19uZXh0ICovCisvKiAweDAzN2M6IG1lbXhfZnVuY19uZXh0ICovCiAJMHgwMDAwMDAwMSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDA0OTYsCkBAIC0yMjEsOCArMjQzLDggQEAKIAkweDAwMDEwMDA0LAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDRmYywKLS8qIDB4MDM1NDogbWVteF9mdW5jX3RhaWwgKi8KLS8qIDB4MDM1NDogbWVteF9kYXRhX2hlYWQgKi8KKy8qIDB4MDNhYzogbWVteF9mdW5jX3RhaWwgKi8KKy8qIDB4MDNhYzogbWVteF9kYXRhX2hlYWQgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTczNSw3ICs3NTcsNTIgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKKy8qIDB4MGJhYzogbWVteF9kYXRhX3RhaWwgKi8KKy8qIDB4MGJhYzogaTJjX3NjbF9tYXAgKi8KKwkweDAwMDAxMDAwLAorCTB4MDAwMDQwMDAsCisJMHgwMDAxMDAwMCwKKwkweDAwMDAwMTAwLAorCTB4MDAwNDAwMDAsCisJMHgwMDEwMDAwMCwKKwkweDAwNDAwMDAwLAorCTB4MDEwMDAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDEwMDAwMDAwLAorLyogMHgwYmQ0OiBpMmNfc2RhX21hcCAqLworCTB4MDAwMDIwMDAsCisJMHgwMDAwODAwMCwKKwkweDAwMDIwMDAwLAorCTB4MDAwMDAyMDAsCisJMHgwMDA4MDAwMCwKKwkweDAwMjAwMDAwLAorCTB4MDA4MDAwMDAsCisJMHgwMjAwMDAwMCwKKwkweDA4MDAwMDAwLAorCTB4MjAwMDAwMDAsCisvKiAweDBiZmM6IGkyY19jdHJsICovCisJMHgwMDAwZTEzOCwKKwkweDAwMDBlMTUwLAorCTB4MDAwMGUxNjgsCisJMHgwMDAwZTE4MCwKKwkweDAwMDBlMjU0LAorCTB4MDAwMGUyNzQsCisJMHgwMDAwZTc2NCwKKwkweDAwMDBlNzgwLAorCTB4MDAwMGU3OWMsCisJMHgwMDAwZTdiOCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKLS8qIDB4MGI1NDogbWVteF9kYXRhX3RhaWwgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTc4NywxNSArODU0LDE1IEBACiAJMHgwN2EwMDdmMSwKIAkweGQwMDYwNGI2LAogCTB4MDRiZDAwMGUsCi0JMHhmMDAxZTdmMCwKLQkweDA3ZjEwMWUzLAorCTB4ZjAwMWQ3ZjAsCisJMHgwN2YxMDFkMywKIAkweDA0YjYwN2FjLAotCTB4MDAwZWQwMDYsCisJMHgwMDBkZDAwNiwKIC8qIDB4MDAyMjogcmQzMl93YWl0ICovCi0JMHhlN2YxMDRiZCwKLQkweGU0YjYwN2FjLAotCTB4MDBlZWNmMDYsCi0JMHg3MDAwZTRmMSwKKwkweGQ3ZjEwNGJkLAorCTB4ZDRiNjA3YWMsCisJMHgwMGRkY2YwNiwKKwkweDcwMDBkNGYxLAogCTB4ZjFmMjFiZjQsCiAJMHhiNjA3YTRkNywKIAkweGRkY2YwNmQ0LApAQCAtODA3LDE1ICs4NzQsMTUgQEAKIAkweGI2MDdhNDA3LAogCTB4MGRkMDA2MDQsCiAJMHhmMDA0YmQwMCwKLQkweGU1ZjAwMmU3LAotCTB4MDFlM2YwZjAsCisJMHhkNWYwMDJkNywKKwkweDAxZDNmMGYwLAogCTB4MDdhYzA3ZjEsCiAJMHhkMDA2MDRiNiwKLQkweDA0YmQwMDBlLAorCTB4MDRiZDAwMGQsCiAvKiAweDAwNmM6IHdyMzJfd2FpdCAqLwotCTB4MDdhY2U3ZjEsCi0JMHhjZjA2ZTRiNiwKLQkweGU0ZjEwMGVlLAorCTB4MDdhY2Q3ZjEsCisJMHhjZjA2ZDRiNiwKKwkweGQ0ZjEwMGRkLAogCTB4MWJmNDcwMDAsCiAvKiAweDAwN2Y6IG5zZWMgKi8KIAkweGYwMDBmOGYyLApAQCAtODQ1LDIxICs5MTIsMjEgQEAKIAkweDk4MDBmOGRmLAogCTB4OTZiMDAzZTksCiAJMHgyYTBiZjQwMCwKLQkweGJiODQwYTk4LAorCTB4YmI5YTBhOTgsCiAJMHgxY2Y0MDI5YSwKIAkweDAxZDdmMDBmLAogCTB4MDI1NDIxZjUsCiAJMHgwZWY0OTRiZCwKIC8qIDB4MDBlOTogaW50cl93YXRjaGRvZ19uZXh0X3RpbWUgKi8KLQkweDg1MGE5ODE1LAorCTB4OWIwYTk4MTUsCiAJMHhmNDAwYTZiMCwKIAkweDlhYjgwOTBiLAogCTB4MDYxY2Y0MDYsCiAvKiAweDAwZjg6IGludHJfd2F0Y2hkb2dfbmV4dF90aW1lX3NldCAqLwogLyogMHgwMGZiOiBpbnRyX3dhdGNoZG9nX25leHRfcHJvYyAqLwotCTB4ODA4NTA5ODAsCisJMHg4MDliMDk4MCwKIAkweGUwYjYwM2U5LAotCTB4MTBlNmIxNTgsCisJMHg2OGU2YjE1OCwKIAkweGM2MWJmNDAyLAogLyogMHgwMTBhOiBpbnRyICovCiAJMHgwMGY5MDBmOCwKQEAgLTg4MCwxNSArOTQ3LDE1IEBACiAJMHgwMDg4Y2YwNiwKIAkweGY0MDI4OWM0LAogCTB4MDA4MDIzMGIsCi0JMHg1OGU3ZjA4NSwKKwkweDU4ZTdmMDliLAogCTB4OThjYjIxZjQsCi0JMHg5NmIwODUwOSwKKwkweDk2YjA5YjA5LAogCTB4MTEwYmY0MDAsCiAJMHhiNjM0MDdmMCwKIAkweDA5ZDAwNjA0LAogCTB4ODAwNGJkMDAsCiAvKiAweDAxNmU6IGludHJfc2tpcF93YXRjaGRvZyAqLwotCTB4ODllNDg0MDksCisJMHg4OWU0OWEwOSwKIAkweDBiZjQwODAwLAogCTB4ODg5N2YxNDgsCiAJMHgwNjk0YjYwNiwKQEAgLTk0OCw3ICsxMDE1LDcgQEAKIAkweDAwMGVkMDA2LAogCTB4MGU4MDA0YmQsCiAvKiAweDAyNDE6IHRpbWVyX2VuYWJsZSAqLwotCTB4MDE4N2YwODQsCisJMHgwMTg3ZjA5YSwKIAkweGI2MzgwN2YwLAogCTB4MDhkMDA2MDQsCiAvKiAweDAyNGY6IHRpbWVyX2RvbmUgKi8KQEAgLTk3OSw3ICsxMDQ2LDcgQEAKIAkweGI4MDA4YTk4LAogCTB4MGJmNDA2YWUsCiAJMHg1ODgwYjYxMCwKLQkweDAyMTA4NmIxLAorCTB4MDI2ODg2YjEsCiAJMHhmNGYwMWJmNCwKIC8qIDB4MDJiMjogZmluZF9kb25lICovCiAJMHg4ZWI5MDEzMiwKQEAgLTEwNDksNyArMTExNiw3IEBACiAJMHgzMjBiZjQwNiwKIAkweDk0MDcxZWM0LAogCTB4ZTBiNzA0ZWUsCi0JMHhlYjk4MDIxOCwKKwkweGViOTgwMjcwLAogCTB4MDJlYzk4MDMsCiAJMHg5ODAxZWQ5OCwKIAkweDIxZjUwMGVlLApAQCAtMTA3NSw3ICsxMTQyLDcgQEAKIAkweGU2MGJmNDA2LAogCTB4YjYwNzIzYzQsCiAJMHgzMGI3MDQzNCwKLQkweDNiODAwMjk4LAorCTB4M2I4MDAyZjAsCiAJMHgwMjNjODAwMywKIAkweDgwMDEzZDgwLAogCTB4MjBiNjAwM2UsCkBAIC0xMDkwLDEzICsxMTU3LDEzIEBACiAvKiAweDA0MzA6IGhvc3RfaW5pdCAqLwogCTB4MDA4MDE3ZjEsCiAJMHhmMTEwMTRiNiwKLQkweGYxMDIxODE1LAorCTB4ZjEwMjcwMTUsCiAJMHhiNjA0ZDAwNywKIAkweDAxZDAwNjA0LAogCTB4ZjEwNGJkMDAsCiAJMHhiNjAwODAxNywKIAkweDE1ZjExMDE0LAotCTB4MDdmMTAyOTgsCisJMHgwN2YxMDJmMCwKIAkweDA0YjYwNGRjLAogCTB4MDAwMWQwMDYsCiAJMHgxN2YwMDRiZCwKQEAgLTExNTYsMTQgKzEyMjMsMTQgQEAKIAkweDAwMTM5ODAyLAogCTB4OTUwNDEwYjYsCiAJMHgzMGYwMTAzNCwKLQkweGM4MzU5ODBjLAorCTB4ZGUzNTk4MGMsCiAJMHgxMmI4NTVmOSwKIAkweGVjMWVmNDA2LAogCTB4ZTBmY2QwZmMsCiAJMHgwMmI5MjFmNSwKIC8qIDB4MDUzMjogbWVteF9pbmZvICovCiAJMHhjN2YxMDBmOCwKLQkweGI3ZjEwMzU0LAorCTB4YjdmMTAzYWMsCiAJMHgyMWY1MDgwMCwKIAkweDAwZjgwMmI5LAogLyogMHgwNTQwOiBtZW14X3JlY3YgKi8KQEAgLTExNzUsNyArMTI0MiwzMTIgQEAKIC8qIDB4MDU1MDogcGVyZl9yZWN2ICovCiAvKiAweDA1NTI6IHBlcmZfaW5pdCAqLwogCTB4MDBmODAwZjgsCi0vKiAweDA1NTQ6IHRlc3RfcmVjdiAqLworLyogMHgwNTU0OiBpMmNfZHJpdmVfc2NsICovCisJMHhmNDAwMzZiMCwKKwkweDA3ZjExMTBiLAorCTB4MDRiNjA3ZTAsCisJMHgwMDAxZDAwNiwKKwkweDAwZjgwNGJkLAorLyogMHgwNTY4OiBpMmNfZHJpdmVfc2NsX2xvICovCisJMHgwN2U0MDdmMSwKKwkweGQwMDYwNGI2LAorCTB4MDRiZDAwMDEsCisvKiAweDA1NzY6IGkyY19kcml2ZV9zZGEgKi8KKwkweDM2YjAwMGY4LAorCTB4MTEwYmY0MDAsCisJMHgwN2UwMDdmMSwKKwkweGQwMDYwNGI2LAorCTB4MDRiZDAwMDIsCisvKiAweDA1OGE6IGkyY19kcml2ZV9zZGFfbG8gKi8KKwkweDA3ZjEwMGY4LAorCTB4MDRiNjA3ZTQsCisJMHgwMDAyZDAwNiwKKwkweDAwZjgwNGJkLAorLyogMHgwNTk4OiBpMmNfc2Vuc2Vfc2NsICovCisJMHhmMTAxMzJmNCwKKwkweGI2MDdjNDM3LAorCTB4MzNjZjA2MzQsCisJMHgwNDMxZmQwMCwKKwkweGY0MDYwYmY0LAorLyogMHgwNWFlOiBpMmNfc2Vuc2Vfc2NsX2RvbmUgKi8KKwkweDAwZjgwMTMxLAorLyogMHgwNWIwOiBpMmNfc2Vuc2Vfc2RhICovCisJMHhmMTAxMzJmNCwKKwkweGI2MDdjNDM3LAorCTB4MzNjZjA2MzQsCisJMHgwNDMyZmQwMCwKKwkweGY0MDYwYmY0LAorLyogMHgwNWM2OiBpMmNfc2Vuc2Vfc2RhX2RvbmUgKi8KKwkweDAwZjgwMTMxLAorLyogMHgwNWM4OiBpMmNfcmFpc2Vfc2NsICovCisJMHg0N2YxNDBmOSwKKwkweDM3ZjAwODk4LAorCTB4NTQyMWY1MDEsCisvKiAweDA1ZDU6IGkyY19yYWlzZV9zY2xfd2FpdCAqLworCTB4ZThlN2YxMDUsCisJMHg3ZjIxZjQwMywKKwkweDA1OTgyMWY1LAorCTB4YjYwOTAxZjQsCisJMHgxYmY0MDE0MiwKKy8qIDB4MDVlOTogaTJjX3JhaXNlX3NjbF9kb25lICovCisJMHhmODQwZmNlZiwKKy8qIDB4MDVlZDogaTJjX3N0YXJ0ICovCisJMHg5ODIxZjUwMCwKKwkweDBkMTFmNDA1LAorCTB4MDViMDIxZjUsCisJMHhmNDA2MTFmNCwKKy8qIDB4MDVmZTogaTJjX3N0YXJ0X3JlcCAqLworCTB4MzdmMDMwMGUsCisJMHg1NDIxZjUwMCwKKwkweDAxMzdmMDA1LAorCTB4MDU3NjIxZjUsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4YzgyMWY1NTAsCisJMHgwNDY0YjYwNSwKKy8qIDB4MDYyYjogaTJjX3N0YXJ0X3NlbmQgKi8KKwkweGYwMWYxMWY0LAorCTB4MjFmNTAwMzcsCisJMHhlN2YxMDU3NiwKKwkweDIxZjQxMzg4LAorCTB4MDAzN2YwN2YsCisJMHgwNTU0MjFmNSwKKwkweDEzODhlN2YxLAorLyogMHgwNjQ3OiBpMmNfc3RhcnRfb3V0ICovCisJMHhmODdmMjFmNCwKKy8qIDB4MDY0OTogaTJjX3N0b3AgKi8KKwkweDAwMzdmMDAwLAorCTB4MDU1NDIxZjUsCisJMHhmNTAwMzdmMCwKKwkweGYxMDU3NjIxLAorCTB4ZjQwM2U4ZTcsCisJMHgzN2YwN2YyMSwKKwkweDU0MjFmNTAxLAorCTB4ODhlN2YxMDUsCisJMHg3ZjIxZjQxMywKKwkweGY1MDEzN2YwLAorCTB4ZjEwNTc2MjEsCisJMHhmNDEzODhlNywKKwkweDAwZjg3ZjIxLAorLyogMHgwNjdjOiBpMmNfYml0dyAqLworCTB4MDU3NjIxZjUsCisJMHgwM2U4ZTdmMSwKKwkweGJiN2YyMWY0LAorCTB4NjViNjAwNzYsCisJMHg5NDUwZjkwNCwKKwkweDU2YmIwNDY1LAorCTB4ZmQ1MGJkMDIsCisJMHg1MGZjMDQ3NSwKKwkweDA1YzgyMWY1LAorCTB4ZjQwNDY0YjYsCisJMHhlN2YxMTgxMSwKKwkweDIxZjQxMzg4LAorCTB4MDAzN2YwN2YsCisJMHgwNTU0MjFmNSwKKwkweDEzODhlN2YxLAorLyogMHgwNmJiOiBpMmNfYml0d19vdXQgKi8KKwkweGY4N2YyMWY0LAorLyogMHgwNmJkOiBpMmNfYml0ciAqLworCTB4MDEzN2YwMDAsCisJMHgwNTc2MjFmNSwKKwkweDAzZThlN2YxLAorCTB4YmI3ZjIxZjQsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDVjODIxZjUsCisJMHhmNDA0NjRiNiwKKwkweDIxZjUxYjExLAorCTB4MzdmMDA1YjAsCisJMHg1NDIxZjUwMCwKKwkweDg4ZTdmMTA1LAorCTB4N2YyMWY0MTMsCisJMHhmNDAxM2NmMCwKKy8qIDB4MDcwMjogaTJjX2JpdHJfZG9uZSAqLworCTB4MDBmODAxMzEsCisvKiAweDA3MDQ6IGkyY19nZXRfYnl0ZSAqLworCTB4ZjAwMDU3ZjAsCisvKiAweDA3MGE6IGkyY19nZXRfYnl0ZV9uZXh0ICovCisJMHg1NGI2MDg0NywKKwkweDAwNzZiYjAxLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHgyMWY1NTBmYywKKwkweDY0YjYwNmJkLAorCTB4MmIxMWY0MDQsCisJMHhiNjA1NTNmZCwKKwkweDFiZjQwMTQyLAorCTB4MDEzN2YwZDgsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4N2MyMWY1NTAsCisJMHgwNDY0YjYwNiwKKy8qIDB4MDc1NDogaTJjX2dldF9ieXRlX2RvbmUgKi8KKy8qIDB4MDc1NjogaTJjX3B1dF9ieXRlICovCisJMHg0N2YwMDBmOCwKKy8qIDB4MDc1OTogaTJjX3B1dF9ieXRlX25leHQgKi8KKwkweDAxNDJiNjA4LAorCTB4YmIzODU0ZmYsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDY3YzIxZjUsCisJMHhmNDA0NjRiNiwKKwkweDQ2YjAzNDExLAorCTB4ZDgxYmY0MDAsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4YmQyMWY1NTAsCisJMHgwNDY0YjYwNiwKKwkweGJiMGYxMWY0LAorCTB4MzZiMDAwNzYsCisJMHgwNjFiZjQwMSwKKy8qIDB4MDdhZjogaTJjX3B1dF9ieXRlX2RvbmUgKi8KKwkweGY4MDEzMmY0LAorLyogMHgwN2IxOiBpMmNfYWRkciAqLworCTB4MDA3NmJiMDAsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweDIxZjU1MGZjLAorCTB4NjRiNjA1ZWQsCisJMHgyOTExZjQwNCwKKwkweDAxMmVjM2U3LAorCTB4ZmQwMTM0YjYsCisJMHg3NmJiMDU1MywKKwkweDA0NjViNjAwLAorCTB4NjU5NDUwZjksCisJMHgwMjU2YmIwNCwKKwkweDc1ZmQ1MGJkLAorCTB4ZjU1MGZjMDQsCisJMHhiNjA3NTYyMSwKKy8qIDB4MDdmNjogaTJjX2FkZHJfZG9uZSAqLworCTB4MDBmODA0NjQsCisvKiAweDA3Zjg6IGkyY19hY3F1aXJlX2FkZHIgKi8KKwkweGI2ZjhjZWM3LAorCTB4ZTBiNzAyZTQsCisJMHhlZTk4MGJmYywKKy8qIDB4MDgwNzogaTJjX2FjcXVpcmUgKi8KKwkweGY1MDBmODAwLAorCTB4ZjQwN2Y4MjEsCisJMHhkOWYwMDQyMSwKKwkweDNmMjFmNDAzLAorLyogMHgwODE2OiBpMmNfcmVsZWFzZSAqLworCTB4MjFmNTAwZjgsCisJMHgyMWY0MDdmOCwKKwkweDAzZGFmMDA0LAorCTB4ZjgzZjIxZjQsCisvKiAweDA4MjU6IGkyY19yZWN2ICovCisJMHgwMTMyZjQwMCwKKwkweGI2ZjhjMWM3LAorCTB4MTZiMDAyMTQsCisJMHgzYTFmZjUyOCwKKwkweGQ0MTNhMDAxLAorCTB4MDAzMjk4MGIsCisJMHgwYmFjMTNhMCwKKwkweGY0MDAzMTk4LAorCTB4ZDBmOTAyMzEsCisJMHhkMGY5ZTBmOSwKKwkweDAwMDA2N2YxLAorCTB4MTAwMDYzZjEsCisJMHhiYjAxNjc5MiwKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwODA3MjFmNSwKKwkweGZjMDQ2NGI2LAorCTB4MDBkNmIwZDAsCisJMHgwMGIzMWJmNSwKKwkweGJiMDA1N2YwLAorCTB4NjViNjAwNzYsCisJMHg5NDUwZjkwNCwKKwkweDU2YmIwNDY1LAorCTB4ZmQ1MGJkMDIsCisJMHg1MGZjMDQ3NSwKKwkweDA3YjEyMWY1LAorCTB4ZjUwNDY0YjYsCisJMHhjNzAwZDAxMSwKKwkweDc2YmJlMGM1LAorCTB4MDQ2NWI2MDAsCisJMHg2NTk0NTBmOSwKKwkweDAyNTZiYjA0LAorCTB4NzVmZDUwYmQsCisJMHhmNTUwZmMwNCwKKwkweGI2MDc1NjIxLAorCTB4MTFmNTA0NjQsCisJMHg1N2YwMDBhZCwKKwkweDAwNzZiYjAxLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHgyMWY1NTBmYywKKwkweDY0YjYwN2IxLAorCTB4OGExMWY1MDQsCisJMHgwMDc2YmIwMCwKKwkweGY5MDQ2NWI2LAorCTB4MDQ2NTk0NTAsCisJMHhiZDAyNTZiYiwKKwkweDA0NzVmZDUwLAorCTB4MjFmNTUwZmMsCisJMHg2NGI2MDcwNCwKKwkweDZhMTFmNDA0LAorCTB4YmJlMDViY2IsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDY0OTIxZjUsCisJMHhiOTA0NjRiNiwKKwkweDc0YmQwMjViLAorLyogMHgwOTJiOiBpMmNfcmVjdl9ub3RfcmQwOCAqLworCTB4YjA0MzBlZjQsCisJMHgxYmY0MDFkNiwKKwkweDAwNTdmMDNkLAorCTB4MDdiMTIxZjUsCisJMHhjNzMzMTFmNCwKKwkweDIxZjVlMGM1LAorCTB4MTFmNDA3NTYsCisJMHgwMDU3ZjAyOSwKKwkweDA3YjEyMWY1LAorCTB4YzcxZjExZjQsCisJMHgyMWY1ZTBiNSwKKwkweDExZjQwNzU2LAorCTB4NDkyMWY1MTUsCisJMHhjNzc0YmQwNiwKKwkweDFiZjQwOGM1LAorCTB4MDIzMmY0MDksCisvKiAweDA5NmI6IGkyY19yZWN2X25vdF93cjA4ICovCisvKiAweDA5NmI6IGkyY19yZWN2X2RvbmUgKi8KKwkweGM3MDMwZWY0LAorCTB4MjFmNWY4Y2UsCisJMHhlMGZjMDgxNiwKKwkweDEyZjRkMGZjLAorCTB4MDI3Y2I5MGEsCisJMHgwMmI5MjFmNSwKKy8qIDB4MDk4MDogaTJjX3JlY3ZfZXhpdCAqLworLyogMHgwOTgyOiBpMmNfaW5pdCAqLworCTB4MDBmODAwZjgsCisvKiAweDA5ODQ6IHRlc3RfcmVjdiAqLwogCTB4MDVkODE3ZjEsCiAJMHhjZjA2MTRiNiwKIAkweDEwYjYwMDExLApAQCAtMTE4NSwxMiArMTU1NywxMiBAQAogCTB4MDBlN2YxMDQsCiAJMHg0ZmUzZjFkOSwKIAkweGY1MjFmNTEzLAotLyogMHgwNTdiOiB0ZXN0X2luaXQgKi8KKy8qIDB4MDlhYjogdGVzdF9pbml0ICovCiAJMHhmMTAwZjgwMSwKIAkweGY1MDgwMGU3LAogCTB4ZjgwMWY1MjEsCi0vKiAweDA1ODU6IGlkbGVfcmVjdiAqLwotLyogMHgwNTg3OiBpZGxlICovCisvKiAweDA5YjU6IGlkbGVfcmVjdiAqLworLyogMHgwOWI3OiBpZGxlICovCiAJMHhmNDAwZjgwMCwKIAkweDE3ZjEwMDMxLAogCTB4MTRiNjA1ZDQsCkBAIC0xMTk4LDMyICsxNTcwLDIwIEBACiAJMHhmMTAxMTBiNiwKIAkweGI2MDVkNDA3LAogCTB4MDFkMDA2MDQsCi0vKiAweDA1YTM6IGlkbGVfbG9vcCAqLworLyogMHgwOWQzOiBpZGxlX2xvb3AgKi8KIAkweGYwMDRiZDAwLAogCTB4MzJmNDU4MTcsCi0vKiAweDA1YTk6IGlkbGVfcHJvYyAqLwotLyogMHgwNWE5OiBpZGxlX3Byb2NfZXhlYyAqLworLyogMHgwOWQ5OiBpZGxlX3Byb2MgKi8KKy8qIDB4MDlkOTogaWRsZV9wcm9jX2V4ZWMgKi8KIAkweGI5MTBmOTAyLAogCTB4MjFmNTAyMWUsCiAJMHgxMGZjMDJjMiwKIAkweGY0MDkxMWY0LAogCTB4MGVmNDAyMzEsCi0vKiAweDA1YmQ6IGlkbGVfcHJvY19uZXh0ICovCisvKiAweDA5ZWQ6IGlkbGVfcHJvY19uZXh0ICovCiAJMHg1ODEwYjZlZiwKIAkweGY0MDYxZmI4LAogCTB4MDJmNGU2MWIsCiAJMHgwMDI4ZjRkZCwKIAkweDAwYmIwZWY0LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZjMC5mdWMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252YzAuZnVjCmluZGV4IGVhYTY0ZGEuLjQ4Zjc5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZjMC5mdWMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmMwLmZ1YwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImhvc3QuZnVjIgogI2luY2x1ZGUgIm1lbXguZnVjIgogI2luY2x1ZGUgInBlcmYuZnVjIgorI2luY2x1ZGUgImkyY18uZnVjIgogI2luY2x1ZGUgInRlc3QuZnVjIgogI2luY2x1ZGUgImlkbGUuZnVjIgogI3VuZGVmIElOQ0xVREVfUFJPQwpAQCAtNDYsNiArNDcsNyBAQAogI2luY2x1ZGUgImhvc3QuZnVjIgogI2luY2x1ZGUgIm1lbXguZnVjIgogI2luY2x1ZGUgInBlcmYuZnVjIgorI2luY2x1ZGUgImkyY18uZnVjIgogI2luY2x1ZGUgInRlc3QuZnVjIgogI2luY2x1ZGUgImlkbGUuZnVjIgogI3VuZGVmIElOQ0xVREVfREFUQQpAQCAtNTcsNiArNTksNyBAQAogI2luY2x1ZGUgImhvc3QuZnVjIgogI2luY2x1ZGUgIm1lbXguZnVjIgogI2luY2x1ZGUgInBlcmYuZnVjIgorI2luY2x1ZGUgImkyY18uZnVjIgogI2luY2x1ZGUgInRlc3QuZnVjIgogI2luY2x1ZGUgImlkbGUuZnVjIgogI3VuZGVmIElOQ0xVREVfQ09ERQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmMwLmZ1Yy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmMwLmZ1Yy5oCmluZGV4IDgyYzhlOGIuLjRkYmEwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZjMC5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252YzAuZnVjLmgKQEAgLTg5LDkgKzg5LDMxIEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCisJMHg1ZjQzMzI0OSwKKwkweDAwMDAwOTgyLAorCTB4MDAwMDA4MjUsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKIAkweDU0NTM0NTU0LAotCTB4MDAwMDA1N2IsCi0JMHgwMDAwMDU1NCwKKwkweDAwMDAwOWFiLAorCTB4MDAwMDA5ODQsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0xMTIsOCArMTM0LDggQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHg0NTRjNDQ0OSwKLQkweDAwMDAwNTg3LAotCTB4MDAwMDA1ODUsCisJMHgwMDAwMDliNywKKwkweDAwMDAwOWI1LAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtMTMzLDEyICsxNTUsMTIgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDIxMDogcHJvY19saXN0X3RhaWwgKi8KLS8qIDB4MDIxMDogdGltZV9wcmV2ICovCisvKiAweDAyNjg6IHByb2NfbGlzdF90YWlsICovCisvKiAweDAyNjg6IHRpbWVfcHJldiAqLwogCTB4MDAwMDAwMDAsCi0vKiAweDAyMTQ6IHRpbWVfbmV4dCAqLworLyogMHgwMjZjOiB0aW1lX25leHQgKi8KIAkweDAwMDAwMDAwLAotLyogMHgwMjE4OiBmaWZvX3F1ZXVlICovCisvKiAweDAyNzA6IGZpZm9fcXVldWUgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTE3MSw3ICsxOTMsNyBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwMjk4OiByZmlmb19xdWV1ZSAqLworLyogMHgwMmYwOiByZmlmb19xdWV1ZSAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtMjA0LDExICsyMjYsMTEgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDMxODogbWVteF9mdW5jX2hlYWQgKi8KKy8qIDB4MDM3MDogbWVteF9mdW5jX2hlYWQgKi8KIAkweDAwMDEwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDQ2ZiwKLS8qIDB4MDMyNDogbWVteF9mdW5jX25leHQgKi8KKy8qIDB4MDM3YzogbWVteF9mdW5jX25leHQgKi8KIAkweDAwMDAwMDAxLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDQ5NiwKQEAgLTIyMSw4ICsyNDMsOCBAQAogCTB4MDAwMTAwMDQsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwNGZjLAotLyogMHgwMzU0OiBtZW14X2Z1bmNfdGFpbCAqLwotLyogMHgwMzU0OiBtZW14X2RhdGFfaGVhZCAqLworLyogMHgwM2FjOiBtZW14X2Z1bmNfdGFpbCAqLworLyogMHgwM2FjOiBtZW14X2RhdGFfaGVhZCAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtNzM1LDcgKzc1Nyw1MiBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAorLyogMHgwYmFjOiBtZW14X2RhdGFfdGFpbCAqLworLyogMHgwYmFjOiBpMmNfc2NsX21hcCAqLworCTB4MDAwMDEwMDAsCisJMHgwMDAwNDAwMCwKKwkweDAwMDEwMDAwLAorCTB4MDAwMDAxMDAsCisJMHgwMDA0MDAwMCwKKwkweDAwMTAwMDAwLAorCTB4MDA0MDAwMDAsCisJMHgwMTAwMDAwMCwKKwkweDA0MDAwMDAwLAorCTB4MTAwMDAwMDAsCisvKiAweDBiZDQ6IGkyY19zZGFfbWFwICovCisJMHgwMDAwMjAwMCwKKwkweDAwMDA4MDAwLAorCTB4MDAwMjAwMDAsCisJMHgwMDAwMDIwMCwKKwkweDAwMDgwMDAwLAorCTB4MDAyMDAwMDAsCisJMHgwMDgwMDAwMCwKKwkweDAyMDAwMDAwLAorCTB4MDgwMDAwMDAsCisJMHgyMDAwMDAwMCwKKy8qIDB4MGJmYzogaTJjX2N0cmwgKi8KKwkweDAwMDBlMTM4LAorCTB4MDAwMGUxNTAsCisJMHgwMDAwZTE2OCwKKwkweDAwMDBlMTgwLAorCTB4MDAwMGUyNTQsCisJMHgwMDAwZTI3NCwKKwkweDAwMDBlNzY0LAorCTB4MDAwMGU3ODAsCisJMHgwMDAwZTc5YywKKwkweDAwMDBlN2I4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAotLyogMHgwYjU0OiBtZW14X2RhdGFfdGFpbCAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtNzg3LDE1ICs4NTQsMTUgQEAKIAkweDA3YTAwN2YxLAogCTB4ZDAwNjA0YjYsCiAJMHgwNGJkMDAwZSwKLQkweGYwMDFlN2YwLAotCTB4MDdmMTAxZTMsCisJMHhmMDAxZDdmMCwKKwkweDA3ZjEwMWQzLAogCTB4MDRiNjA3YWMsCi0JMHgwMDBlZDAwNiwKKwkweDAwMGRkMDA2LAogLyogMHgwMDIyOiByZDMyX3dhaXQgKi8KLQkweGU3ZjEwNGJkLAotCTB4ZTRiNjA3YWMsCi0JMHgwMGVlY2YwNiwKLQkweDcwMDBlNGYxLAorCTB4ZDdmMTA0YmQsCisJMHhkNGI2MDdhYywKKwkweDAwZGRjZjA2LAorCTB4NzAwMGQ0ZjEsCiAJMHhmMWYyMWJmNCwKIAkweGI2MDdhNGQ3LAogCTB4ZGRjZjA2ZDQsCkBAIC04MDcsMTUgKzg3NCwxNSBAQAogCTB4YjYwN2E0MDcsCiAJMHgwZGQwMDYwNCwKIAkweGYwMDRiZDAwLAotCTB4ZTVmMDAyZTcsCi0JMHgwMWUzZjBmMCwKKwkweGQ1ZjAwMmQ3LAorCTB4MDFkM2YwZjAsCiAJMHgwN2FjMDdmMSwKIAkweGQwMDYwNGI2LAotCTB4MDRiZDAwMGUsCisJMHgwNGJkMDAwZCwKIC8qIDB4MDA2Yzogd3IzMl93YWl0ICovCi0JMHgwN2FjZTdmMSwKLQkweGNmMDZlNGI2LAotCTB4ZTRmMTAwZWUsCisJMHgwN2FjZDdmMSwKKwkweGNmMDZkNGI2LAorCTB4ZDRmMTAwZGQsCiAJMHgxYmY0NzAwMCwKIC8qIDB4MDA3ZjogbnNlYyAqLwogCTB4ZjAwMGY4ZjIsCkBAIC04NDUsMjEgKzkxMiwyMSBAQAogCTB4OTgwMGY4ZGYsCiAJMHg5NmIwMDNlOSwKIAkweDJhMGJmNDAwLAotCTB4YmI4NDBhOTgsCisJMHhiYjlhMGE5OCwKIAkweDFjZjQwMjlhLAogCTB4MDFkN2YwMGYsCiAJMHgwMjU0MjFmNSwKIAkweDBlZjQ5NGJkLAogLyogMHgwMGU5OiBpbnRyX3dhdGNoZG9nX25leHRfdGltZSAqLwotCTB4ODUwYTk4MTUsCisJMHg5YjBhOTgxNSwKIAkweGY0MDBhNmIwLAogCTB4OWFiODA5MGIsCiAJMHgwNjFjZjQwNiwKIC8qIDB4MDBmODogaW50cl93YXRjaGRvZ19uZXh0X3RpbWVfc2V0ICovCiAvKiAweDAwZmI6IGludHJfd2F0Y2hkb2dfbmV4dF9wcm9jICovCi0JMHg4MDg1MDk4MCwKKwkweDgwOWIwOTgwLAogCTB4ZTBiNjAzZTksCi0JMHgxMGU2YjE1OCwKKwkweDY4ZTZiMTU4LAogCTB4YzYxYmY0MDIsCiAvKiAweDAxMGE6IGludHIgKi8KIAkweDAwZjkwMGY4LApAQCAtODgwLDE1ICs5NDcsMTUgQEAKIAkweDAwODhjZjA2LAogCTB4ZjQwMjg5YzQsCiAJMHgwMDgwMjMwYiwKLQkweDU4ZTdmMDg1LAorCTB4NThlN2YwOWIsCiAJMHg5OGNiMjFmNCwKLQkweDk2YjA4NTA5LAorCTB4OTZiMDliMDksCiAJMHgxMTBiZjQwMCwKIAkweGI2MzQwN2YwLAogCTB4MDlkMDA2MDQsCiAJMHg4MDA0YmQwMCwKIC8qIDB4MDE2ZTogaW50cl9za2lwX3dhdGNoZG9nICovCi0JMHg4OWU0ODQwOSwKKwkweDg5ZTQ5YTA5LAogCTB4MGJmNDA4MDAsCiAJMHg4ODk3ZjE0OCwKIAkweDA2OTRiNjA2LApAQCAtOTQ4LDcgKzEwMTUsNyBAQAogCTB4MDAwZWQwMDYsCiAJMHgwZTgwMDRiZCwKIC8qIDB4MDI0MTogdGltZXJfZW5hYmxlICovCi0JMHgwMTg3ZjA4NCwKKwkweDAxODdmMDlhLAogCTB4YjYzODA3ZjAsCiAJMHgwOGQwMDYwNCwKIC8qIDB4MDI0ZjogdGltZXJfZG9uZSAqLwpAQCAtOTc5LDcgKzEwNDYsNyBAQAogCTB4YjgwMDhhOTgsCiAJMHgwYmY0MDZhZSwKIAkweDU4ODBiNjEwLAotCTB4MDIxMDg2YjEsCisJMHgwMjY4ODZiMSwKIAkweGY0ZjAxYmY0LAogLyogMHgwMmIyOiBmaW5kX2RvbmUgKi8KIAkweDhlYjkwMTMyLApAQCAtMTA0OSw3ICsxMTE2LDcgQEAKIAkweDMyMGJmNDA2LAogCTB4OTQwNzFlYzQsCiAJMHhlMGI3MDRlZSwKLQkweGViOTgwMjE4LAorCTB4ZWI5ODAyNzAsCiAJMHgwMmVjOTgwMywKIAkweDk4MDFlZDk4LAogCTB4MjFmNTAwZWUsCkBAIC0xMDc1LDcgKzExNDIsNyBAQAogCTB4ZTYwYmY0MDYsCiAJMHhiNjA3MjNjNCwKIAkweDMwYjcwNDM0LAotCTB4M2I4MDAyOTgsCisJMHgzYjgwMDJmMCwKIAkweDAyM2M4MDAzLAogCTB4ODAwMTNkODAsCiAJMHgyMGI2MDAzZSwKQEAgLTEwOTAsMTMgKzExNTcsMTMgQEAKIC8qIDB4MDQzMDogaG9zdF9pbml0ICovCiAJMHgwMDgwMTdmMSwKIAkweGYxMTAxNGI2LAotCTB4ZjEwMjE4MTUsCisJMHhmMTAyNzAxNSwKIAkweGI2MDRkMDA3LAogCTB4MDFkMDA2MDQsCiAJMHhmMTA0YmQwMCwKIAkweGI2MDA4MDE3LAogCTB4MTVmMTEwMTQsCi0JMHgwN2YxMDI5OCwKKwkweDA3ZjEwMmYwLAogCTB4MDRiNjA0ZGMsCiAJMHgwMDAxZDAwNiwKIAkweDE3ZjAwNGJkLApAQCAtMTE1NiwxNCArMTIyMywxNCBAQAogCTB4MDAxMzk4MDIsCiAJMHg5NTA0MTBiNiwKIAkweDMwZjAxMDM0LAotCTB4YzgzNTk4MGMsCisJMHhkZTM1OTgwYywKIAkweDEyYjg1NWY5LAogCTB4ZWMxZWY0MDYsCiAJMHhlMGZjZDBmYywKIAkweDAyYjkyMWY1LAogLyogMHgwNTMyOiBtZW14X2luZm8gKi8KIAkweGM3ZjEwMGY4LAotCTB4YjdmMTAzNTQsCisJMHhiN2YxMDNhYywKIAkweDIxZjUwODAwLAogCTB4MDBmODAyYjksCiAvKiAweDA1NDA6IG1lbXhfcmVjdiAqLwpAQCAtMTE3NSw3ICsxMjQyLDMxMiBAQAogLyogMHgwNTUwOiBwZXJmX3JlY3YgKi8KIC8qIDB4MDU1MjogcGVyZl9pbml0ICovCiAJMHgwMGY4MDBmOCwKLS8qIDB4MDU1NDogdGVzdF9yZWN2ICovCisvKiAweDA1NTQ6IGkyY19kcml2ZV9zY2wgKi8KKwkweGY0MDAzNmIwLAorCTB4MDdmMTExMGIsCisJMHgwNGI2MDdlMCwKKwkweDAwMDFkMDA2LAorCTB4MDBmODA0YmQsCisvKiAweDA1Njg6IGkyY19kcml2ZV9zY2xfbG8gKi8KKwkweDA3ZTQwN2YxLAorCTB4ZDAwNjA0YjYsCisJMHgwNGJkMDAwMSwKKy8qIDB4MDU3NjogaTJjX2RyaXZlX3NkYSAqLworCTB4MzZiMDAwZjgsCisJMHgxMTBiZjQwMCwKKwkweDA3ZTAwN2YxLAorCTB4ZDAwNjA0YjYsCisJMHgwNGJkMDAwMiwKKy8qIDB4MDU4YTogaTJjX2RyaXZlX3NkYV9sbyAqLworCTB4MDdmMTAwZjgsCisJMHgwNGI2MDdlNCwKKwkweDAwMDJkMDA2LAorCTB4MDBmODA0YmQsCisvKiAweDA1OTg6IGkyY19zZW5zZV9zY2wgKi8KKwkweGYxMDEzMmY0LAorCTB4YjYwN2M0MzcsCisJMHgzM2NmMDYzNCwKKwkweDA0MzFmZDAwLAorCTB4ZjQwNjBiZjQsCisvKiAweDA1YWU6IGkyY19zZW5zZV9zY2xfZG9uZSAqLworCTB4MDBmODAxMzEsCisvKiAweDA1YjA6IGkyY19zZW5zZV9zZGEgKi8KKwkweGYxMDEzMmY0LAorCTB4YjYwN2M0MzcsCisJMHgzM2NmMDYzNCwKKwkweDA0MzJmZDAwLAorCTB4ZjQwNjBiZjQsCisvKiAweDA1YzY6IGkyY19zZW5zZV9zZGFfZG9uZSAqLworCTB4MDBmODAxMzEsCisvKiAweDA1Yzg6IGkyY19yYWlzZV9zY2wgKi8KKwkweDQ3ZjE0MGY5LAorCTB4MzdmMDA4OTgsCisJMHg1NDIxZjUwMSwKKy8qIDB4MDVkNTogaTJjX3JhaXNlX3NjbF93YWl0ICovCisJMHhlOGU3ZjEwNSwKKwkweDdmMjFmNDAzLAorCTB4MDU5ODIxZjUsCisJMHhiNjA5MDFmNCwKKwkweDFiZjQwMTQyLAorLyogMHgwNWU5OiBpMmNfcmFpc2Vfc2NsX2RvbmUgKi8KKwkweGY4NDBmY2VmLAorLyogMHgwNWVkOiBpMmNfc3RhcnQgKi8KKwkweDk4MjFmNTAwLAorCTB4MGQxMWY0MDUsCisJMHgwNWIwMjFmNSwKKwkweGY0MDYxMWY0LAorLyogMHgwNWZlOiBpMmNfc3RhcnRfcmVwICovCisJMHgzN2YwMzAwZSwKKwkweDU0MjFmNTAwLAorCTB4MDEzN2YwMDUsCisJMHgwNTc2MjFmNSwKKwkweGI2MDA3NmJiLAorCTB4NTBmOTA0NjUsCisJMHhiYjA0NjU5NCwKKwkweDUwYmQwMjU2LAorCTB4ZmMwNDc1ZmQsCisJMHhjODIxZjU1MCwKKwkweDA0NjRiNjA1LAorLyogMHgwNjJiOiBpMmNfc3RhcnRfc2VuZCAqLworCTB4ZjAxZjExZjQsCisJMHgyMWY1MDAzNywKKwkweGU3ZjEwNTc2LAorCTB4MjFmNDEzODgsCisJMHgwMDM3ZjA3ZiwKKwkweDA1NTQyMWY1LAorCTB4MTM4OGU3ZjEsCisvKiAweDA2NDc6IGkyY19zdGFydF9vdXQgKi8KKwkweGY4N2YyMWY0LAorLyogMHgwNjQ5OiBpMmNfc3RvcCAqLworCTB4MDAzN2YwMDAsCisJMHgwNTU0MjFmNSwKKwkweGY1MDAzN2YwLAorCTB4ZjEwNTc2MjEsCisJMHhmNDAzZThlNywKKwkweDM3ZjA3ZjIxLAorCTB4NTQyMWY1MDEsCisJMHg4OGU3ZjEwNSwKKwkweDdmMjFmNDEzLAorCTB4ZjUwMTM3ZjAsCisJMHhmMTA1NzYyMSwKKwkweGY0MTM4OGU3LAorCTB4MDBmODdmMjEsCisvKiAweDA2N2M6IGkyY19iaXR3ICovCisJMHgwNTc2MjFmNSwKKwkweDAzZThlN2YxLAorCTB4YmI3ZjIxZjQsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDVjODIxZjUsCisJMHhmNDA0NjRiNiwKKwkweGU3ZjExODExLAorCTB4MjFmNDEzODgsCisJMHgwMDM3ZjA3ZiwKKwkweDA1NTQyMWY1LAorCTB4MTM4OGU3ZjEsCisvKiAweDA2YmI6IGkyY19iaXR3X291dCAqLworCTB4Zjg3ZjIxZjQsCisvKiAweDA2YmQ6IGkyY19iaXRyICovCisJMHgwMTM3ZjAwMCwKKwkweDA1NzYyMWY1LAorCTB4MDNlOGU3ZjEsCisJMHhiYjdmMjFmNCwKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwNWM4MjFmNSwKKwkweGY0MDQ2NGI2LAorCTB4MjFmNTFiMTEsCisJMHgzN2YwMDViMCwKKwkweDU0MjFmNTAwLAorCTB4ODhlN2YxMDUsCisJMHg3ZjIxZjQxMywKKwkweGY0MDEzY2YwLAorLyogMHgwNzAyOiBpMmNfYml0cl9kb25lICovCisJMHgwMGY4MDEzMSwKKy8qIDB4MDcwNDogaTJjX2dldF9ieXRlICovCisJMHhmMDAwNTdmMCwKKy8qIDB4MDcwYTogaTJjX2dldF9ieXRlX25leHQgKi8KKwkweDU0YjYwODQ3LAorCTB4MDA3NmJiMDEsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweDIxZjU1MGZjLAorCTB4NjRiNjA2YmQsCisJMHgyYjExZjQwNCwKKwkweGI2MDU1M2ZkLAorCTB4MWJmNDAxNDIsCisJMHgwMTM3ZjBkOCwKKwkweGI2MDA3NmJiLAorCTB4NTBmOTA0NjUsCisJMHhiYjA0NjU5NCwKKwkweDUwYmQwMjU2LAorCTB4ZmMwNDc1ZmQsCisJMHg3YzIxZjU1MCwKKwkweDA0NjRiNjA2LAorLyogMHgwNzU0OiBpMmNfZ2V0X2J5dGVfZG9uZSAqLworLyogMHgwNzU2OiBpMmNfcHV0X2J5dGUgKi8KKwkweDQ3ZjAwMGY4LAorLyogMHgwNzU5OiBpMmNfcHV0X2J5dGVfbmV4dCAqLworCTB4MDE0MmI2MDgsCisJMHhiYjM4NTRmZiwKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwNjdjMjFmNSwKKwkweGY0MDQ2NGI2LAorCTB4NDZiMDM0MTEsCisJMHhkODFiZjQwMCwKKwkweGI2MDA3NmJiLAorCTB4NTBmOTA0NjUsCisJMHhiYjA0NjU5NCwKKwkweDUwYmQwMjU2LAorCTB4ZmMwNDc1ZmQsCisJMHhiZDIxZjU1MCwKKwkweDA0NjRiNjA2LAorCTB4YmIwZjExZjQsCisJMHgzNmIwMDA3NiwKKwkweDA2MWJmNDAxLAorLyogMHgwN2FmOiBpMmNfcHV0X2J5dGVfZG9uZSAqLworCTB4ZjgwMTMyZjQsCisvKiAweDA3YjE6IGkyY19hZGRyICovCisJMHgwMDc2YmIwMCwKKwkweGY5MDQ2NWI2LAorCTB4MDQ2NTk0NTAsCisJMHhiZDAyNTZiYiwKKwkweDA0NzVmZDUwLAorCTB4MjFmNTUwZmMsCisJMHg2NGI2MDVlZCwKKwkweDI5MTFmNDA0LAorCTB4MDEyZWMzZTcsCisJMHhmZDAxMzRiNiwKKwkweDc2YmIwNTUzLAorCTB4MDQ2NWI2MDAsCisJMHg2NTk0NTBmOSwKKwkweDAyNTZiYjA0LAorCTB4NzVmZDUwYmQsCisJMHhmNTUwZmMwNCwKKwkweGI2MDc1NjIxLAorLyogMHgwN2Y2OiBpMmNfYWRkcl9kb25lICovCisJMHgwMGY4MDQ2NCwKKy8qIDB4MDdmODogaTJjX2FjcXVpcmVfYWRkciAqLworCTB4YjZmOGNlYzcsCisJMHhlMGI3MDJlNCwKKwkweGVlOTgwYmZjLAorLyogMHgwODA3OiBpMmNfYWNxdWlyZSAqLworCTB4ZjUwMGY4MDAsCisJMHhmNDA3ZjgyMSwKKwkweGQ5ZjAwNDIxLAorCTB4M2YyMWY0MDMsCisvKiAweDA4MTY6IGkyY19yZWxlYXNlICovCisJMHgyMWY1MDBmOCwKKwkweDIxZjQwN2Y4LAorCTB4MDNkYWYwMDQsCisJMHhmODNmMjFmNCwKKy8qIDB4MDgyNTogaTJjX3JlY3YgKi8KKwkweDAxMzJmNDAwLAorCTB4YjZmOGMxYzcsCisJMHgxNmIwMDIxNCwKKwkweDNhMWZmNTI4LAorCTB4ZDQxM2EwMDEsCisJMHgwMDMyOTgwYiwKKwkweDBiYWMxM2EwLAorCTB4ZjQwMDMxOTgsCisJMHhkMGY5MDIzMSwKKwkweGQwZjllMGY5LAorCTB4MDAwMDY3ZjEsCisJMHgxMDAwNjNmMSwKKwkweGJiMDE2NzkyLAorCTB4NjViNjAwNzYsCisJMHg5NDUwZjkwNCwKKwkweDU2YmIwNDY1LAorCTB4ZmQ1MGJkMDIsCisJMHg1MGZjMDQ3NSwKKwkweDA4MDcyMWY1LAorCTB4ZmMwNDY0YjYsCisJMHgwMGQ2YjBkMCwKKwkweDAwYjMxYmY1LAorCTB4YmIwMDU3ZjAsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDdiMTIxZjUsCisJMHhmNTA0NjRiNiwKKwkweGM3MDBkMDExLAorCTB4NzZiYmUwYzUsCisJMHgwNDY1YjYwMCwKKwkweDY1OTQ1MGY5LAorCTB4MDI1NmJiMDQsCisJMHg3NWZkNTBiZCwKKwkweGY1NTBmYzA0LAorCTB4YjYwNzU2MjEsCisJMHgxMWY1MDQ2NCwKKwkweDU3ZjAwMGFkLAorCTB4MDA3NmJiMDEsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweDIxZjU1MGZjLAorCTB4NjRiNjA3YjEsCisJMHg4YTExZjUwNCwKKwkweDAwNzZiYjAwLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHgyMWY1NTBmYywKKwkweDY0YjYwNzA0LAorCTB4NmExMWY0MDQsCisJMHhiYmUwNWJjYiwKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwNjQ5MjFmNSwKKwkweGI5MDQ2NGI2LAorCTB4NzRiZDAyNWIsCisvKiAweDA5MmI6IGkyY19yZWN2X25vdF9yZDA4ICovCisJMHhiMDQzMGVmNCwKKwkweDFiZjQwMWQ2LAorCTB4MDA1N2YwM2QsCisJMHgwN2IxMjFmNSwKKwkweGM3MzMxMWY0LAorCTB4MjFmNWUwYzUsCisJMHgxMWY0MDc1NiwKKwkweDAwNTdmMDI5LAorCTB4MDdiMTIxZjUsCisJMHhjNzFmMTFmNCwKKwkweDIxZjVlMGI1LAorCTB4MTFmNDA3NTYsCisJMHg0OTIxZjUxNSwKKwkweGM3NzRiZDA2LAorCTB4MWJmNDA4YzUsCisJMHgwMjMyZjQwOSwKKy8qIDB4MDk2YjogaTJjX3JlY3Zfbm90X3dyMDggKi8KKy8qIDB4MDk2YjogaTJjX3JlY3ZfZG9uZSAqLworCTB4YzcwMzBlZjQsCisJMHgyMWY1ZjhjZSwKKwkweGUwZmMwODE2LAorCTB4MTJmNGQwZmMsCisJMHgwMjdjYjkwYSwKKwkweDAyYjkyMWY1LAorLyogMHgwOTgwOiBpMmNfcmVjdl9leGl0ICovCisvKiAweDA5ODI6IGkyY19pbml0ICovCisJMHgwMGY4MDBmOCwKKy8qIDB4MDk4NDogdGVzdF9yZWN2ICovCiAJMHgwNWQ4MTdmMSwKIAkweGNmMDYxNGI2LAogCTB4MTBiNjAwMTEsCkBAIC0xMTg1LDEyICsxNTU3LDEyIEBACiAJMHgwMGU3ZjEwNCwKIAkweDRmZTNmMWQ5LAogCTB4ZjUyMWY1MTMsCi0vKiAweDA1N2I6IHRlc3RfaW5pdCAqLworLyogMHgwOWFiOiB0ZXN0X2luaXQgKi8KIAkweGYxMDBmODAxLAogCTB4ZjUwODAwZTcsCiAJMHhmODAxZjUyMSwKLS8qIDB4MDU4NTogaWRsZV9yZWN2ICovCi0vKiAweDA1ODc6IGlkbGUgKi8KKy8qIDB4MDliNTogaWRsZV9yZWN2ICovCisvKiAweDA5Yjc6IGlkbGUgKi8KIAkweGY0MDBmODAwLAogCTB4MTdmMTAwMzEsCiAJMHgxNGI2MDVkNCwKQEAgLTExOTgsMzIgKzE1NzAsMjAgQEAKIAkweGYxMDExMGI2LAogCTB4YjYwNWQ0MDcsCiAJMHgwMWQwMDYwNCwKLS8qIDB4MDVhMzogaWRsZV9sb29wICovCisvKiAweDA5ZDM6IGlkbGVfbG9vcCAqLwogCTB4ZjAwNGJkMDAsCiAJMHgzMmY0NTgxNywKLS8qIDB4MDVhOTogaWRsZV9wcm9jICovCi0vKiAweDA1YTk6IGlkbGVfcHJvY19leGVjICovCisvKiAweDA5ZDk6IGlkbGVfcHJvYyAqLworLyogMHgwOWQ5OiBpZGxlX3Byb2NfZXhlYyAqLwogCTB4YjkxMGY5MDIsCiAJMHgyMWY1MDIxZSwKIAkweDEwZmMwMmMyLAogCTB4ZjQwOTExZjQsCiAJMHgwZWY0MDIzMSwKLS8qIDB4MDViZDogaWRsZV9wcm9jX25leHQgKi8KKy8qIDB4MDllZDogaWRsZV9wcm9jX25leHQgKi8KIAkweDU4MTBiNmVmLAogCTB4ZjQwNjFmYjgsCiAJMHgwMmY0ZTYxYiwKIAkweDAwMjhmNGRkLAogCTB4MDBiYjBlZjQsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmQwLmZ1YyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZkMC5mdWMKaW5kZXggMzJkNjVlYS4uOGE4OWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmQwLmZ1YworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252ZDAuZnVjCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiaG9zdC5mdWMiCiAjaW5jbHVkZSAibWVteC5mdWMiCiAjaW5jbHVkZSAicGVyZi5mdWMiCisjaW5jbHVkZSAiaTJjXy5mdWMiCiAjaW5jbHVkZSAidGVzdC5mdWMiCiAjaW5jbHVkZSAiaWRsZS5mdWMiCiAjdW5kZWYgSU5DTFVERV9QUk9DCkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSAiaG9zdC5mdWMiCiAjaW5jbHVkZSAibWVteC5mdWMiCiAjaW5jbHVkZSAicGVyZi5mdWMiCisjaW5jbHVkZSAiaTJjXy5mdWMiCiAjaW5jbHVkZSAidGVzdC5mdWMiCiAjaW5jbHVkZSAiaWRsZS5mdWMiCiAjdW5kZWYgSU5DTFVERV9EQVRBCkBAIC01Nyw2ICs1OSw3IEBACiAjaW5jbHVkZSAiaG9zdC5mdWMiCiAjaW5jbHVkZSAibWVteC5mdWMiCiAjaW5jbHVkZSAicGVyZi5mdWMiCisjaW5jbHVkZSAiaTJjXy5mdWMiCiAjaW5jbHVkZSAidGVzdC5mdWMiCiAjaW5jbHVkZSAiaWRsZS5mdWMiCiAjdW5kZWYgSU5DTFVERV9DT0RFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252ZDAuZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL252ZDAuZnVjLmgKaW5kZXggY2U2NWUyYS4uNWUyNGM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9udmQwLmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvbnZkMC5mdWMuaApAQCAtODksOSArODksMzEgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKKwkweDVmNDMzMjQ5LAorCTB4MDAwMDA4ZTMsCisJMHgwMDAwMDc4NiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAogCTB4NTQ1MzQ1NTQsCi0JMHgwMDAwMDRlYiwKLQkweDAwMDAwNGNhLAorCTB4MDAwMDA5MDYsCisJMHgwMDAwMDhlNSwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTExMiw4ICsxMzQsOCBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDQ1NGM0NDQ5LAotCTB4MDAwMDA0ZjcsCi0JMHgwMDAwMDRmNSwKKwkweDAwMDAwOTEyLAorCTB4MDAwMDA5MTAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0xMzMsMTIgKzE1NSwxMiBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwMjEwOiBwcm9jX2xpc3RfdGFpbCAqLwotLyogMHgwMjEwOiB0aW1lX3ByZXYgKi8KKy8qIDB4MDI2ODogcHJvY19saXN0X3RhaWwgKi8KKy8qIDB4MDI2ODogdGltZV9wcmV2ICovCiAJMHgwMDAwMDAwMCwKLS8qIDB4MDIxNDogdGltZV9uZXh0ICovCisvKiAweDAyNmM6IHRpbWVfbmV4dCAqLwogCTB4MDAwMDAwMDAsCi0vKiAweDAyMTg6IGZpZm9fcXVldWUgKi8KKy8qIDB4MDI3MDogZmlmb19xdWV1ZSAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApAQCAtMTcxLDcgKzE5Myw3IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0vKiAweDAyOTg6IHJmaWZvX3F1ZXVlICovCisvKiAweDAyZjA6IHJmaWZvX3F1ZXVlICovCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC0yMDQsMTEgKzIyNiwxMSBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwMzE4OiBtZW14X2Z1bmNfaGVhZCAqLworLyogMHgwMzcwOiBtZW14X2Z1bmNfaGVhZCAqLwogCTB4MDAwMTAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwM2Y0LAotLyogMHgwMzI0OiBtZW14X2Z1bmNfbmV4dCAqLworLyogMHgwMzdjOiBtZW14X2Z1bmNfbmV4dCAqLwogCTB4MDAwMDAwMDEsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwNDE1LApAQCAtMjIxLDggKzI0Myw4IEBACiAJMHgwMDAxMDAwNCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDA0NzIsCi0vKiAweDAzNTQ6IG1lbXhfZnVuY190YWlsICovCi0vKiAweDAzNTQ6IG1lbXhfZGF0YV9oZWFkICovCisvKiAweDAzYWM6IG1lbXhfZnVuY190YWlsICovCisvKiAweDAzYWM6IG1lbXhfZGF0YV9oZWFkICovCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCkBAIC03MzUsNDkgKzc1NywyOSBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotLyogMHgwYjU0OiBtZW14X2RhdGFfdGFpbCAqLwotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorLyogMHgwYmFjOiBtZW14X2RhdGFfdGFpbCAqLworLyogMHgwYmFjOiBpMmNfc2NsX21hcCAqLworCTB4MDAwMDA0MDAsCisJMHgwMDAwMDgwMCwKKwkweDAwMDAxMDAwLAorCTB4MDAwMDIwMDAsCisJMHgwMDAwNDAwMCwKKwkweDAwMDA4MDAwLAorCTB4MDAwMTAwMDAsCisJMHgwMDAyMDAwMCwKKwkweDAwMDQwMDAwLAorCTB4MDAwODAwMDAsCisvKiAweDBiZDQ6IGkyY19zZGFfbWFwICovCisJMHgwMDEwMDAwMCwKKwkweDAwMjAwMDAwLAorCTB4MDA0MDAwMDAsCisJMHgwMDgwMDAwMCwKKwkweDAxMDAwMDAwLAorCTB4MDIwMDAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDA4MDAwMDAwLAorCTB4MTAwMDAwMDAsCisJMHgyMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogfTsKIApAQCAtNzg2LDE0ICs3ODgsMTQgQEAKIC8qIDB4MDAwNDogcmQzMiAqLwogCTB4MDdhMDA3ZjEsCiAJMHhiZDAwMGVkMCwKLQkweDAxZTdmMDA0LAotCTB4ZjEwMWUzZjAsCisJMHgwMWQ3ZjAwNCwKKwkweGYxMDFkM2YwLAogCTB4ZDAwN2FjMDcsCi0JMHgwNGJkMDAwZSwKKwkweDA0YmQwMDBkLAogLyogMHgwMDFjOiByZDMyX3dhaXQgKi8KLQkweDA3YWNlN2YxLAotCTB4ZjEwMGVlY2YsCi0JMHhmNDcwMDBlNCwKKwkweDA3YWNkN2YxLAorCTB4ZjEwMGRkY2YsCisJMHhmNDcwMDBkNCwKIAkweGQ3ZjFmNTFiLAogCTB4ZGRjZjA3YTQsCiAvKiAweDAwMzM6IHdyMzIgKi8KQEAgLTgwMiwxNCArODA0LDE0IEBACiAJMHgwNGJkMDAwZSwKIAkweDA3YTQwN2YxLAogCTB4YmQwMDBkZDAsCi0JMHgwMmU3ZjAwNCwKLQkweGYwZjBlNWYwLAotCTB4MDdmMTAxZTMsCi0JMHgwZWQwMDdhYywKKwkweDAyZDdmMDA0LAorCTB4ZjBmMGQ1ZjAsCisJMHgwN2YxMDFkMywKKwkweDBkZDAwN2FjLAogLyogMHgwMDU3OiB3cjMyX3dhaXQgKi8KIAkweGYxMDRiZDAwLAotCTB4Y2YwN2FjZTcsCi0JMHhlNGYxMDBlZSwKKwkweGNmMDdhY2Q3LAorCTB4ZDRmMTAwZGQsCiAJMHgxYmY0NzAwMCwKIC8qIDB4MDA2NzogbnNlYyAqLwogCTB4ZjAwMGY4ZjUsCkBAIC04MzYsMjEgKzgzOCwyMSBAQAogCTB4OTgwMGY4ZTIsCiAJMHg5NmIwMDNlOSwKIAkweDJhMGJmNDAwLAotCTB4YmI4NDBhOTgsCisJMHhiYjlhMGE5OCwKIAkweDFjZjQwMjlhLAogCTB4MDFkN2YwMGYsCiAJMHgwMjA2MjFmNSwKIAkweDBlZjQ5NGJkLAogLyogMHgwMGM1OiBpbnRyX3dhdGNoZG9nX25leHRfdGltZSAqLwotCTB4ODUwYTk4MTUsCisJMHg5YjBhOTgxNSwKIAkweGY0MDBhNmIwLAogCTB4OWFiODA5MGIsCiAJMHgwNjFjZjQwNiwKIC8qIDB4MDBkNDogaW50cl93YXRjaGRvZ19uZXh0X3RpbWVfc2V0ICovCiAvKiAweDAwZDc6IGludHJfd2F0Y2hkb2dfbmV4dF9wcm9jICovCi0JMHg4MDg1MDk4MCwKKwkweDgwOWIwOTgwLAogCTB4ZTBiNjAzZTksCi0JMHgxMGU2YjE1OCwKKwkweDY4ZTZiMTU4LAogCTB4YzYxYmY0MDIsCiAvKiAweDAwZTY6IGludHIgKi8KIAkweDAwZjkwMGY4LApAQCAtODY4LDE1ICs4NzAsMTUgQEAKIAkweDA4ODdmMDA0LAogCTB4YzQwMDg4Y2YsCiAJMHgwYmY0MDI4OSwKLQkweDg1MDA4MDIwLAorCTB4OWIwMDgwMjAsCiAJMHhmNDU4ZTdmMCwKIAkweDA5OThhNzIxLAotCTB4MDA5NmIwODUsCisJMHgwMDk2YjA5YiwKIAkweGYwMGUwYmY0LAogCTB4MDlkMDM0MDcsCiAJMHg4MDA0YmQwMCwKIC8qIDB4MDEzZTogaW50cl9za2lwX3dhdGNoZG9nICovCi0JMHg4OWU0ODQwOSwKKwkweDg5ZTQ5YTA5LAogCTB4MGJmNDA4MDAsCiAJMHg4ODk3ZjEzYywKIAkweDAwOTljZjA2LApAQCAtOTI5LDcgKzkzMSw3IEBACiAJMHgwZWQwMzQwNywKIAkweDgwMDRiZDAwLAogLyogMHgwMWY2OiB0aW1lcl9lbmFibGUgKi8KLQkweDg3ZjA4NDBlLAorCTB4ODdmMDlhMGUsCiAJMHgzODA3ZjAwMSwKIAkweGJkMDAwOGQwLAogLyogMHgwMjAxOiB0aW1lcl9kb25lICovCkBAIC05NjAsNyArOTYyLDcgQEAKIAkweDA2YWViODAwLAogCTB4YjYxMDBiZjQsCiAJMHg4NmIxNTg4MCwKLQkweDFiZjQwMjEwLAorCTB4MWJmNDAyNjgsCiAJMHgwMTMyZjRmMCwKIC8qIDB4MDI2NDogZmluZF9kb25lICovCiAJMHhmYzAyOGViOSwKQEAgLTEwMjQsNyArMTAyNiw3IEBACiAJMHgwYmY0MDYxMiwKIAkweDA3MWVjNDJmLAogCTB4YjcwNGVlOTQsCi0JMHg5ODAyMThlMCwKKwkweDk4MDI3MGUwLAogCTB4ZWM5ODAzZWIsCiAJMHgwMWVkOTgwMiwKIAkweGY1MDBlZTk4LApAQCAtMTA0OCw3ICsxMDUwLDcgQEAKIAkweGVjMGJmNDA2LAogCTB4YjYwNzIzYzQsCiAJMHgzMGI3MDQzNCwKLQkweDNiODAwMjk4LAorCTB4M2I4MDAyZjAsCiAJMHgwMjNjODAwMywKIAkweDgwMDEzZDgwLAogCTB4MjBiNjAwM2UsCkBAIC0xMDYxLDEyICsxMDYzLDEyIEBACiAvKiAweDAzYmU6IGhvc3RfaW5pdCAqLwogCTB4MTdmMTAwZjgsCiAJMHgxNGI2MDA4MCwKLQkweDE4MTVmMTEwLAorCTB4NzAxNWYxMTAsCiAJMHhkMDA3ZjEwMiwKIAkweDAwMDFkMDA0LAogCTB4MTdmMTA0YmQsCiAJMHgxNGI2MDA4MCwKLQkweDk4MTVmMTEwLAorCTB4ZjAxNWYxMTAsCiAJMHhkYzA3ZjEwMiwKIAkweDAwMDFkMDA0LAogCTB4MTdmMDA0YmQsCkBAIC0xMTIyLDEzICsxMTI0LDEzIEBACiAJMHgxMGI2MDAxMywKIAkweDEwMzQ5NTA0LAogCTB4OTgwYzMwZjAsCi0JMHg1NWY5YzgzNSwKKwkweDU1ZjlkZTM1LAogCTB4ZjQwNjEyYjgsCiAJMHhkMGZjZWMxZSwKIAkweDIxZjVlMGZjLAogCTB4MDBmODAyNmIsCiAvKiAweDA0YTg6IG1lbXhfaW5mbyAqLwotCTB4MDM1NGM3ZjEsCisJMHgwM2FjYzdmMSwKIAkweDA4MDBiN2YxLAogCTB4MDI2YjIxZjUsCiAvKiAweDA0YjY6IG1lbXhfcmVjdiAqLwpAQCAtMTE0MCw0OSArMTE0MiwzNDIgQEAKIC8qIDB4MDRjNjogcGVyZl9yZWN2ICovCiAJMHgwMGY4MDBmOCwKIC8qIDB4MDRjODogcGVyZl9pbml0ICovCi0vKiAweDA0Y2E6IHRlc3RfcmVjdiAqLwotCTB4MTdmMTAwZjgsCi0JMHgxMWNmMDVkOCwKLQkweDAxMTBiNjAwLAotCTB4MDVkODA3ZjEsCisvKiAweDA0Y2E6IGkyY19kcml2ZV9zY2wgKi8KKwkweDM2YjAwMGY4LAorCTB4MGUwYmY0MDAsCisJMHgwN2UwMDdmMSwKIAkweGJkMDAwMWQwLAotCTB4MDBlN2YxMDQsCi0JMHg0ZmUzZjFkOSwKLQkweGI2MjFmNTEzLAotLyogMHgwNGViOiB0ZXN0X2luaXQgKi8KLQkweGYxMDBmODAxLAotCTB4ZjUwODAwZTcsCi0JMHhmODAxYjYyMSwKLS8qIDB4MDRmNTogaWRsZV9yZWN2ICovCi0vKiAweDA0Zjc6IGlkbGUgKi8KLQkweGY0MDBmODAwLAotCTB4MTdmMTAwMzEsCi0JMHgxMWNmMDVkNCwKLQkweDAxMTBiNjAwLAotCTB4MDVkNDA3ZjEsCi0JMHhiZDAwMDFkMCwKLS8qIDB4MDUwZDogaWRsZV9sb29wICovCi0JMHg1ODE3ZjAwNCwKLS8qIDB4MDUxMzogaWRsZV9wcm9jICovCi0vKiAweDA1MTM6IGlkbGVfcHJvY19leGVjICovCi0JMHhmOTAyMzJmNCwKLQkweDAyMWViOTEwLAotCTB4MDI3NDIxZjUsCi0JMHgxMWY0MTBmYywKLQkweDAyMzFmNDA5LAotLyogMHgwNTI3OiBpZGxlX3Byb2NfbmV4dCAqLwotCTB4YjZlZjBlZjQsCi0JMHgxZmI4NTgxMCwKLQkweGU2MWJmNDA2LAotCTB4ZjRkZDAyZjQsCi0JMHgwZWY0MDAyOCwKLQkweDAwMDAwMGMxLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorLyogMHgwNGRiOiBpMmNfZHJpdmVfc2NsX2xvICovCisJMHhmMTAwZjgwNCwKKwkweGQwMDdlNDA3LAorCTB4MDRiZDAwMDEsCisvKiAweDA0ZTY6IGkyY19kcml2ZV9zZGEgKi8KKwkweDM2YjAwMGY4LAorCTB4MGUwYmY0MDAsCisJMHgwN2UwMDdmMSwKKwkweGJkMDAwMmQwLAorLyogMHgwNGY3OiBpMmNfZHJpdmVfc2RhX2xvICovCisJMHhmMTAwZjgwNCwKKwkweGQwMDdlNDA3LAorCTB4MDRiZDAwMDIsCisvKiAweDA1MDI6IGkyY19zZW5zZV9zY2wgKi8KKwkweDMyZjQwMGY4LAorCTB4YzQzN2YxMDEsCisJMHgwMDMzY2YwNywKKwkweGY0MDQzMWZkLAorCTB4MzFmNDA2MGIsCisvKiAweDA1MTU6IGkyY19zZW5zZV9zY2xfZG9uZSAqLworLyogMHgwNTE3OiBpMmNfc2Vuc2Vfc2RhICovCisJMHhmNDAwZjgwMSwKKwkweDM3ZjEwMTMyLAorCTB4MzNjZjA3YzQsCisJMHgwNDMyZmQwMCwKKwkweGY0MDYwYmY0LAorLyogMHgwNTJhOiBpMmNfc2Vuc2Vfc2RhX2RvbmUgKi8KKwkweDAwZjgwMTMxLAorLyogMHgwNTJjOiBpMmNfcmFpc2Vfc2NsICovCisJMHg0N2YxNDBmOSwKKwkweDM3ZjAwODk4LAorCTB4Y2EyMWY1MDEsCisvKiAweDA1Mzk6IGkyY19yYWlzZV9zY2xfd2FpdCAqLworCTB4ZThlN2YxMDQsCisJMHg2NzIxZjQwMywKKwkweDA1MDIyMWY1LAorCTB4YjYwOTAxZjQsCisJMHgxYmY0MDE0MiwKKy8qIDB4MDU0ZDogaTJjX3JhaXNlX3NjbF9kb25lICovCisJMHhmODQwZmNlZiwKKy8qIDB4MDU1MTogaTJjX3N0YXJ0ICovCisJMHgwMjIxZjUwMCwKKwkweDBkMTFmNDA1LAorCTB4MDUxNzIxZjUsCisJMHhmNDA2MTFmNCwKKy8qIDB4MDU2MjogaTJjX3N0YXJ0X3JlcCAqLworCTB4MzdmMDMwMGUsCisJMHhjYTIxZjUwMCwKKwkweDAxMzdmMDA0LAorCTB4MDRlNjIxZjUsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4MmMyMWY1NTAsCisJMHgwNDY0YjYwNSwKKy8qIDB4MDU4ZjogaTJjX3N0YXJ0X3NlbmQgKi8KKwkweGYwMWYxMWY0LAorCTB4MjFmNTAwMzcsCisJMHhlN2YxMDRlNiwKKwkweDIxZjQxMzg4LAorCTB4MDAzN2YwNjcsCisJMHgwNGNhMjFmNSwKKwkweDEzODhlN2YxLAorLyogMHgwNWFiOiBpMmNfc3RhcnRfb3V0ICovCisJMHhmODY3MjFmNCwKKy8qIDB4MDVhZDogaTJjX3N0b3AgKi8KKwkweDAwMzdmMDAwLAorCTB4MDRjYTIxZjUsCisJMHhmNTAwMzdmMCwKKwkweGYxMDRlNjIxLAorCTB4ZjQwM2U4ZTcsCisJMHgzN2YwNjcyMSwKKwkweGNhMjFmNTAxLAorCTB4ODhlN2YxMDQsCisJMHg2NzIxZjQxMywKKwkweGY1MDEzN2YwLAorCTB4ZjEwNGU2MjEsCisJMHhmNDEzODhlNywKKwkweDAwZjg2NzIxLAorLyogMHgwNWUwOiBpMmNfYml0dyAqLworCTB4MDRlNjIxZjUsCisJMHgwM2U4ZTdmMSwKKwkweGJiNjcyMWY0LAorCTB4NjViNjAwNzYsCisJMHg5NDUwZjkwNCwKKwkweDU2YmIwNDY1LAorCTB4ZmQ1MGJkMDIsCisJMHg1MGZjMDQ3NSwKKwkweDA1MmMyMWY1LAorCTB4ZjQwNDY0YjYsCisJMHhlN2YxMTgxMSwKKwkweDIxZjQxMzg4LAorCTB4MDAzN2YwNjcsCisJMHgwNGNhMjFmNSwKKwkweDEzODhlN2YxLAorLyogMHgwNjFmOiBpMmNfYml0d19vdXQgKi8KKwkweGY4NjcyMWY0LAorLyogMHgwNjIxOiBpMmNfYml0ciAqLworCTB4MDEzN2YwMDAsCisJMHgwNGU2MjFmNSwKKwkweDAzZThlN2YxLAorCTB4YmI2NzIxZjQsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDUyYzIxZjUsCisJMHhmNDA0NjRiNiwKKwkweDIxZjUxYjExLAorCTB4MzdmMDA1MTcsCisJMHhjYTIxZjUwMCwKKwkweDg4ZTdmMTA0LAorCTB4NjcyMWY0MTMsCisJMHhmNDAxM2NmMCwKKy8qIDB4MDY2NjogaTJjX2JpdHJfZG9uZSAqLworCTB4MDBmODAxMzEsCisvKiAweDA2Njg6IGkyY19nZXRfYnl0ZSAqLworCTB4ZjAwMDU3ZjAsCisvKiAweDA2NmU6IGkyY19nZXRfYnl0ZV9uZXh0ICovCisJMHg1NGI2MDg0NywKKwkweDAwNzZiYjAxLAorCTB4ZjkwNDY1YjYsCisJMHgwNDY1OTQ1MCwKKwkweGJkMDI1NmJiLAorCTB4MDQ3NWZkNTAsCisJMHgyMWY1NTBmYywKKwkweDY0YjYwNjIxLAorCTB4MmIxMWY0MDQsCisJMHhiNjA1NTNmZCwKKwkweDFiZjQwMTQyLAorCTB4MDEzN2YwZDgsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4ZTAyMWY1NTAsCisJMHgwNDY0YjYwNSwKKy8qIDB4MDZiODogaTJjX2dldF9ieXRlX2RvbmUgKi8KKy8qIDB4MDZiYTogaTJjX3B1dF9ieXRlICovCisJMHg0N2YwMDBmOCwKKy8qIDB4MDZiZDogaTJjX3B1dF9ieXRlX25leHQgKi8KKwkweDAxNDJiNjA4LAorCTB4YmIzODU0ZmYsCisJMHg2NWI2MDA3NiwKKwkweDk0NTBmOTA0LAorCTB4NTZiYjA0NjUsCisJMHhmZDUwYmQwMiwKKwkweDUwZmMwNDc1LAorCTB4MDVlMDIxZjUsCisJMHhmNDA0NjRiNiwKKwkweDQ2YjAzNDExLAorCTB4ZDgxYmY0MDAsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4MjEyMWY1NTAsCisJMHgwNDY0YjYwNiwKKwkweGJiMGYxMWY0LAorCTB4MzZiMDAwNzYsCisJMHgwNjFiZjQwMSwKKy8qIDB4MDcxMzogaTJjX3B1dF9ieXRlX2RvbmUgKi8KKwkweGY4MDEzMmY0LAorLyogMHgwNzE1OiBpMmNfYWRkciAqLworCTB4MDA3NmJiMDAsCisJMHhmOTA0NjViNiwKKwkweDA0NjU5NDUwLAorCTB4YmQwMjU2YmIsCisJMHgwNDc1ZmQ1MCwKKwkweDIxZjU1MGZjLAorCTB4NjRiNjA1NTEsCisJMHgyOTExZjQwNCwKKwkweDAxMmVjM2U3LAorCTB4ZmQwMTM0YjYsCisJMHg3NmJiMDU1MywKKwkweDA0NjViNjAwLAorCTB4NjU5NDUwZjksCisJMHgwMjU2YmIwNCwKKwkweDc1ZmQ1MGJkLAorCTB4ZjU1MGZjMDQsCisJMHhiNjA2YmEyMSwKKy8qIDB4MDc1YTogaTJjX2FkZHJfZG9uZSAqLworCTB4MDBmODA0NjQsCisvKiAweDA3NWM6IGkyY19hY3F1aXJlX2FkZHIgKi8KKwkweGI2ZjhjZWM3LAorCTB4ZTBiNzA1ZTQsCisJMHgwMGY4ZDAxNCwKKy8qIDB4MDc2ODogaTJjX2FjcXVpcmUgKi8KKwkweDA3NWMyMWY1LAorCTB4ZjAwNDIxZjQsCisJMHgyMWY0MDNkOSwKKy8qIDB4MDc3NzogaTJjX3JlbGVhc2UgKi8KKwkweGY1MDBmODMzLAorCTB4ZjQwNzVjMjEsCisJMHhkYWYwMDQyMSwKKwkweDMzMjFmNDAzLAorLyogMHgwNzg2OiBpMmNfcmVjdiAqLworCTB4MzJmNDAwZjgsCisJMHhmOGMxYzcwMSwKKwkweGIwMDIxNGI2LAorCTB4MWZmNTI4MTYsCisJMHgxM2EwMDEzYSwKKwkweDMyOTgwYmQ0LAorCTB4YWMxM2EwMDAsCisJMHgwMDMxOTgwYiwKKwkweGY5MDIzMWY0LAorCTB4ZjllMGY5ZDAsCisJMHgwMDY3ZjFkMCwKKwkweDAwNjNmMTAwLAorCTB4MDE2NzkyMTAsCisJMHhiNjAwNzZiYiwKKwkweDUwZjkwNDY1LAorCTB4YmIwNDY1OTQsCisJMHg1MGJkMDI1NiwKKwkweGZjMDQ3NWZkLAorCTB4NjgyMWY1NTAsCisJMHgwNDY0YjYwNywKKwkweGQ2YjBkMGZjLAorCTB4YjMxYmY1MDAsCisJMHgwMDU3ZjAwMCwKKwkweGI2MDA3NmJiLAorCTB4NTBmOTA0NjUsCisJMHhiYjA0NjU5NCwKKwkweDUwYmQwMjU2LAorCTB4ZmMwNDc1ZmQsCisJMHgxNTIxZjU1MCwKKwkweDA0NjRiNjA3LAorCTB4MDBkMDExZjUsCisJMHhiYmUwYzVjNywKKwkweDY1YjYwMDc2LAorCTB4OTQ1MGY5MDQsCisJMHg1NmJiMDQ2NSwKKwkweGZkNTBiZDAyLAorCTB4NTBmYzA0NzUsCisJMHgwNmJhMjFmNSwKKwkweGY1MDQ2NGI2LAorCTB4ZjAwMGFkMTEsCisJMHg3NmJiMDE1NywKKwkweDA0NjViNjAwLAorCTB4NjU5NDUwZjksCisJMHgwMjU2YmIwNCwKKwkweDc1ZmQ1MGJkLAorCTB4ZjU1MGZjMDQsCisJMHhiNjA3MTUyMSwKKwkweDExZjUwNDY0LAorCTB4NzZiYjAwOGEsCisJMHgwNDY1YjYwMCwKKwkweDY1OTQ1MGY5LAorCTB4MDI1NmJiMDQsCisJMHg3NWZkNTBiZCwKKwkweGY1NTBmYzA0LAorCTB4YjYwNjY4MjEsCisJMHgxMWY0MDQ2NCwKKwkweGUwNWJjYjZhLAorCTB4YjYwMDc2YmIsCisJMHg1MGY5MDQ2NSwKKwkweGJiMDQ2NTk0LAorCTB4NTBiZDAyNTYsCisJMHhmYzA0NzVmZCwKKwkweGFkMjFmNTUwLAorCTB4MDQ2NGI2MDUsCisJMHhiZDAyNWJiOSwKKwkweDQzMGVmNDc0LAorLyogMHgwODhjOiBpMmNfcmVjdl9ub3RfcmQwOCAqLworCTB4ZjQwMWQ2YjAsCisJMHg1N2YwM2QxYiwKKwkweDE1MjFmNTAwLAorCTB4MzMxMWY0MDcsCisJMHhmNWUwYzVjNywKKwkweGY0MDZiYTIxLAorCTB4NTdmMDI5MTEsCisJMHgxNTIxZjUwMCwKKwkweDFmMTFmNDA3LAorCTB4ZjVlMGI1YzcsCisJMHhmNDA2YmEyMSwKKwkweDIxZjUxNTExLAorCTB4NzRiZDA1YWQsCisJMHhmNDA4YzVjNywKKwkweDMyZjQwOTFiLAorCTB4MDMwZWY0MDIsCisvKiAweDA4Y2M6IGkyY19yZWN2X25vdF93cjA4ICovCisvKiAweDA4Y2M6IGkyY19yZWN2X2RvbmUgKi8KKwkweGY1ZjhjZWM3LAorCTB4ZmMwNzc3MjEsCisJMHhmNGQwZmNlMCwKKwkweDdjYjkwYTEyLAorCTB4NmIyMWY1MDIsCisvKiAweDA4ZTE6IGkyY19yZWN2X2V4aXQgKi8KKy8qIDB4MDhlMzogaTJjX2luaXQgKi8KKwkweGY4MDBmODAyLAorLyogMHgwOGU1OiB0ZXN0X3JlY3YgKi8KKwkweGQ4MTdmMTAwLAorCTB4MDAxMWNmMDUsCisJMHhmMTAxMTBiNiwKKwkweGQwMDVkODA3LAorCTB4MDRiZDAwMDEsCisJMHhkOTAwZTdmMSwKKwkweDEzNGZlM2YxLAorCTB4MDFiNjIxZjUsCisvKiAweDA5MDY6IHRlc3RfaW5pdCAqLworCTB4ZTdmMTAwZjgsCisJMHgyMWY1MDgwMCwKKwkweDAwZjgwMWI2LAorLyogMHgwOTEwOiBpZGxlX3JlY3YgKi8KKy8qIDB4MDkxMjogaWRsZSAqLworCTB4MzFmNDAwZjgsCisJMHhkNDE3ZjEwMCwKKwkweDAwMTFjZjA1LAorCTB4ZjEwMTEwYjYsCisJMHhkMDA1ZDQwNywKKwkweDA0YmQwMDAxLAorLyogMHgwOTI4OiBpZGxlX2xvb3AgKi8KKwkweGY0NTgxN2YwLAorLyogMHgwOTJlOiBpZGxlX3Byb2MgKi8KKy8qIDB4MDkyZTogaWRsZV9wcm9jX2V4ZWMgKi8KKwkweDEwZjkwMjMyLAorCTB4ZjUwMjFlYjksCisJMHhmYzAyNzQyMSwKKwkweDA5MTFmNDEwLAorCTB4ZjQwMjMxZjQsCisvKiAweDA5NDI6IGlkbGVfcHJvY19uZXh0ICovCisJMHgxMGI2ZWYwZSwKKwkweDA2MWZiODU4LAorCTB4ZjRlNjFiZjQsCisJMHgyOGY0ZGQwMiwKKwkweGMxMGVmNDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9vcy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvcHdyL2Z1Yy9vcy5oCmluZGV4IDVmYjBjY2MuLjU3NGFjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3B3ci9mdWMvb3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9wd3IvZnVjL29zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIFBST0NfSE9TVCAweDU0NTM0ZjQ4CiAjZGVmaW5lIFBST0NfTUVNWCAweDU4NGQ0NTRkCiAjZGVmaW5lIFBST0NfUEVSRiAweDQ2NTI0NTUwCisjZGVmaW5lIFBST0NfSTJDXyAweDVmNDMzMjQ5CiAjZGVmaW5lIFBST0NfVEVTVCAweDU0NTM0NTU0CiAKIC8qIEtFUk46IG1lc3NhZ2UgaWRlbnRpZmllcnMgKi8KQEAgLTI0LDQgKzI1LDIyIEBACiAjZGVmaW5lIE1FTVhfV0FJVCAgIDMKICNkZWZpbmUgTUVNWF9ERUxBWSAgNAogCisvKiBJMkNfOiBtZXNzYWdlIGlkZW50aWZpZXJzICovCisjZGVmaW5lIEkyQ19fTVNHX1JEMDggMAorI2RlZmluZSBJMkNfX01TR19XUjA4IDEKKworI2RlZmluZSBJMkNfX01TR19EQVRBMF9QT1JUIDI0OjMxCisjZGVmaW5lIEkyQ19fTVNHX0RBVEEwX0FERFIgMTQ6MjMKKworI2RlZmluZSBJMkNfX01TR19EQVRBMF9SRDA4X1BPUlQgSTJDX19NU0dfREFUQTBfUE9SVAorI2RlZmluZSBJMkNfX01TR19EQVRBMF9SRDA4X0FERFIgSTJDX19NU0dfREFUQTBfQUREUgorI2RlZmluZSBJMkNfX01TR19EQVRBMF9SRDA4X1JFRyAwOjcKKyNkZWZpbmUgSTJDX19NU0dfREFUQTFfUkQwOF9WQUwgMDo3CisKKyNkZWZpbmUgSTJDX19NU0dfREFUQTBfV1IwOF9QT1JUIEkyQ19fTVNHX0RBVEEwX1BPUlQKKyNkZWZpbmUgSTJDX19NU0dfREFUQTBfV1IwOF9BRERSIEkyQ19fTVNHX0RBVEEwX0FERFIKKyNkZWZpbmUgSTJDX19NU0dfREFUQTBfV1IwOF9TWU5DIDg6OAorI2RlZmluZSBJMkNfX01TR19EQVRBMF9XUjA4X1JFRyAwOjcKKyNkZWZpbmUgSTJDX19NU0dfREFUQTFfV1IwOF9WQUwgMDo3CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvdm0vYmFzZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvdm0vYmFzZS5jCmluZGV4IGVmMzEzM2UuLjdkZDY4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3ZtL2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi92bS9iYXNlLmMKQEAgLTcyLDEzICs3Miw3IEBACiAJdm1tLT5mbHVzaCh2bSk7CiB9CiAKLXZvaWQKLW5vdXZlYXVfdm1fbWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCBzdHJ1Y3Qgbm91dmVhdV9tZW0gKm5vZGUpCi17Ci0Jbm91dmVhdV92bV9tYXBfYXQodm1hLCAwLCBub2RlKTsKLX0KLQotdm9pZAorc3RhdGljIHZvaWQKIG5vdXZlYXVfdm1fbWFwX3NnX3RhYmxlKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCB1NjQgZGVsdGEsIHU2NCBsZW5ndGgsCiAJCQlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm1lbSkKIHsKQEAgLTEzNiw3ICsxMzAsNyBAQAogCXZtbS0+Zmx1c2godm0pOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbm91dmVhdV92bV9tYXBfc2coc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHU2NCBkZWx0YSwgdTY0IGxlbmd0aCwKIAkJICBzdHJ1Y3Qgbm91dmVhdV9tZW0gKm1lbSkKIHsKQEAgLTE3NSw2ICsxNjksMTggQEAKIH0KIAogdm9pZAorbm91dmVhdV92bV9tYXAoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHN0cnVjdCBub3V2ZWF1X21lbSAqbm9kZSkKK3sKKwlpZiAobm9kZS0+c2cpCisJCW5vdXZlYXVfdm1fbWFwX3NnX3RhYmxlKHZtYSwgMCwgbm9kZS0+c2l6ZSA8PCAxMiwgbm9kZSk7CisJZWxzZQorCWlmIChub2RlLT5wYWdlcykKKwkJbm91dmVhdV92bV9tYXBfc2codm1hLCAwLCBub2RlLT5zaXplIDw8IDEyLCBub2RlKTsKKwllbHNlCisJCW5vdXZlYXVfdm1fbWFwX2F0KHZtYSwgMCwgbm9kZSk7Cit9CisKK3ZvaWQKIG5vdXZlYXVfdm1fdW5tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHU2NCBkZWx0YSwgdTY0IGxlbmd0aCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSB2bWEtPnZtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGlzcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGlzcC5jCmluZGV4IGIxM2ZmMGYuLjJmMWVkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L2Rpc3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kaXNwLmMKQEAgLTc3LDExICs3Nyw2IEBACiAKIAlub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKGRldiwgMSk7CiAKLQlyZXQgPSBub3V2ZWF1X29iamVjdF9uZXcobnZfb2JqZWN0KGRybSksIE5WRFJNX0RFVklDRSwgMHhkMTUwMDAwMCwKLQkJCQkgTlYwNF9ESVNQX0NMQVNTLCBOVUxMLCAwLCAmZGlzcC0+Y29yZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAwKTsKIAlpZiAobnZfdHdvX2hlYWRzKGRldikpCiAJCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L2Rpc3AuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L2Rpc3AuaAppbmRleCA1NmEyOGRiLi40MjQ1ZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kaXNwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGlzcC5oCkBAIC04MCw3ICs4MCw2IEBACiAJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSBzYXZlZF9yZWc7CiAJdWludDMyX3Qgc2F2ZWRfdmdhX2ZvbnRbNF1bMTYzODRdOwogCXVpbnQzMl90IGRhY191c2Vyc1s0XTsKLQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmNvcmU7CiAJc3RydWN0IG5vdXZlYXVfYm8gKmltYWdlWzJdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvb3ZlcmxheS5jCmluZGV4IDMyZTcwNjQuLmFiMDNmNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9vdmVybGF5LmMKQEAgLTU1LDkgKzU1LDEyIEBACiAJaW50IGh1ZTsKIAlpbnQgc2F0dXJhdGlvbjsKIAlpbnQgaXR1cmJ0XzcwOTsKKworCXZvaWQgKCpzZXRfcGFyYW1zKShzdHJ1Y3Qgbm91dmVhdV9wbGFuZSAqKTsKIH07CiAKIHN0YXRpYyB1aW50MzJfdCBmb3JtYXRzW10gPSB7CisJRFJNX0ZPUk1BVF9ZVVlWLAogCURSTV9GT1JNQVRfVVlWWSwKIAlEUk1fRk9STUFUX05WMTIsCiB9OwpAQCAtMTQwLDEwICsxNDMsMTAgQEAKIAludl93cjMyKGRldiwgTlZfUFZJREVPX1BPSU5UX09VVChmbGlwKSwgY3J0Y195IDw8IDE2IHwgY3J0Y194KTsKIAludl93cjMyKGRldiwgTlZfUFZJREVPX1NJWkVfT1VUKGZsaXApLCBjcnRjX2ggPDwgMTYgfCBjcnRjX3cpOwogCi0JaWYgKGZiLT5waXhlbF9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9OVjEyKSB7CisJaWYgKGZiLT5waXhlbF9mb3JtYXQgIT0gRFJNX0ZPUk1BVF9VWVZZKQogCQlmb3JtYXQgfD0gTlZfUFZJREVPX0ZPUk1BVF9DT0xPUl9MRV9DUjhZQjhDQjhZQTg7CisJaWYgKGZiLT5waXhlbF9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9OVjEyKQogCQlmb3JtYXQgfD0gTlZfUFZJREVPX0ZPUk1BVF9QTEFOQVI7Ci0JfQogCWlmIChudl9wbGFuZS0+aXR1cmJ0XzcwOSkKIAkJZm9ybWF0IHw9IE5WX1BWSURFT19GT1JNQVRfTUFUUklYX0lUVVJCVDcwOTsKIAlpZiAobnZfcGxhbmUtPmNvbG9ya2V5ICYgKDEgPDwgMjQpKQpAQCAtMTgyLDkgKzE4NSw5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1udjEwX2Rlc3Ryb3lfcGxhbmUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCitudl9kZXN0cm95X3BsYW5lKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQogewotCW52MTBfZGlzYWJsZV9wbGFuZShwbGFuZSk7CisJcGxhbmUtPmZ1bmNzLT5kaXNhYmxlX3BsYW5lKHBsYW5lKTsKIAlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7CiAJa2ZyZWUocGxhbmUpOwogfQpAQCAtMjE3LDkgKzIyMCw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MTBfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAotCQkgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAotCQkgIHVpbnQ2NF90IHZhbHVlKQorbnZfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwKKwkJdWludDY0X3QgdmFsdWUpCiB7CiAJc3RydWN0IG5vdXZlYXVfcGxhbmUgKm52X3BsYW5lID0gKHN0cnVjdCBub3V2ZWF1X3BsYW5lICopcGxhbmU7CiAKQEAgLTIzOCwxNSArMjQxLDE2IEBACiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW52MTBfc2V0X3BhcmFtcyhudl9wbGFuZSk7CisJaWYgKG52X3BsYW5lLT5zZXRfcGFyYW1zKQorCQludl9wbGFuZS0+c2V0X3BhcmFtcyhudl9wbGFuZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIG52MTBfcGxhbmVfZnVuY3MgPSB7CiAJLnVwZGF0ZV9wbGFuZSA9IG52MTBfdXBkYXRlX3BsYW5lLAogCS5kaXNhYmxlX3BsYW5lID0gbnYxMF9kaXNhYmxlX3BsYW5lLAotCS5zZXRfcHJvcGVydHkgPSBudjEwX3NldF9wcm9wZXJ0eSwKLQkuZGVzdHJveSA9IG52MTBfZGVzdHJveV9wbGFuZSwKKwkuc2V0X3Byb3BlcnR5ID0gbnZfc2V0X3Byb3BlcnR5LAorCS5kZXN0cm95ID0gbnZfZGVzdHJveV9wbGFuZSwKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC0yNjYsNyArMjcwLDcgQEAKIAljYXNlIDB4MTU6CiAJY2FzZSAweDFhOgogCWNhc2UgMHgyMDoKLQkJbnVtX2Zvcm1hdHMgPSAxOworCQludW1fZm9ybWF0cyA9IDI7CiAJCWJyZWFrOwogCX0KIApAQCAtMzIxLDggKzMyNSwxNTkgQEAKIAlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmcGxhbmUtPmJhc2UuYmFzZSwKIAkJCQkgICBwbGFuZS0+cHJvcHMuaXR1cmJ0XzcwOSwgcGxhbmUtPml0dXJidF83MDkpOwogCisJcGxhbmUtPnNldF9wYXJhbXMgPSBudjEwX3NldF9wYXJhbXM7CiAJbnYxMF9zZXRfcGFyYW1zKHBsYW5lKTsKLQludl93cjMyKGRldiwgTlZfUFZJREVPX1NUT1AsIDEpOworCW52MTBfZGlzYWJsZV9wbGFuZSgmcGxhbmUtPmJhc2UpOworCXJldHVybjsKK2NsZWFudXA6CisJZHJtX3BsYW5lX2NsZWFudXAoJnBsYW5lLT5iYXNlKTsKK2VycjoKKwlrZnJlZShwbGFuZSk7CisJbnZfZXJyb3IoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBwbGFuZVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfdXBkYXRlX3BsYW5lKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCBjcnRjX3gsIGludCBjcnRjX3ksCisJCSAgdW5zaWduZWQgaW50IGNydGNfdywgdW5zaWduZWQgaW50IGNydGNfaCwKKwkJICB1aW50MzJfdCBzcmNfeCwgdWludDMyX3Qgc3JjX3ksCisJCSAgdWludDMyX3Qgc3JjX3csIHVpbnQzMl90IHNyY19oKQoreworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2ID0gbm91dmVhdV9kZXYocGxhbmUtPmRldik7CisJc3RydWN0IG5vdXZlYXVfcGxhbmUgKm52X3BsYW5lID0gKHN0cnVjdCBub3V2ZWF1X3BsYW5lICopcGxhbmU7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm52X2ZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihmYik7CisJc3RydWN0IG5vdXZlYXVfYm8gKmN1ciA9IG52X3BsYW5lLT5jdXI7CisJdWludDMyX3Qgb3ZlcmxheSA9IDE7CisJaW50IGJyaWdodG5lc3MgPSAobnZfcGxhbmUtPmJyaWdodG5lc3MgLSA1MTIpICogNjIgLyA1MTI7CisJaW50IHBpdGNoLCByZXQsIGk7CisKKwkvKiBTb3VyY2UgcGFyYW1ldGVycyBnaXZlbiBpbiAxNi4xNiBmaXhlZCBwb2ludCwgaWdub3JlIGZyYWN0aW9uYWwuICovCisJc3JjX3ggPj49IDE2OworCXNyY195ID4+PSAxNjsKKwlzcmNfdyA+Pj0gMTY7CisJc3JjX2ggPj49IDE2OworCisJcGl0Y2ggPSBBTElHTihzcmNfdyAqIDQsIDB4MTAwKTsKKworCWlmIChwaXRjaCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkvKiBUT0RPOiBDb21wdXRlIGFuIG9mZnNldD8gTm90IHN1cmUgaG93IHRvIGRvIHRoaXMgZm9yIFlVWVYuICovCisJaWYgKHNyY194ICE9IDAgfHwgc3JjX3kgIT0gMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAoY3J0Y193IDwgc3JjX3cgfHwgY3J0Y19oIDwgc3JjX2gpCisJCXJldHVybiAtRVJBTkdFOworCisJcmV0ID0gbm91dmVhdV9ib19waW4obnZfZmItPm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludl9wbGFuZS0+Y3VyID0gbnZfZmItPm52Ym87CisKKwludl93cjMyKGRldiwgTlZfUFZJREVPX09FX1NUQVRFLCAwKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX1NVX1NUQVRFLCAwKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX1JNX1NUQVRFLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WX1BWSURFT19CVUZGMF9TVEFSVF9BRERSRVNTICsgNCAqIGksCisJCQludl9mYi0+bnZiby0+Ym8ub2Zmc2V0KTsKKwkJbnZfd3IzMihkZXYsIE5WX1BWSURFT19CVUZGMF9QSVRDSF9MRU5HVEggKyA0ICogaSwgcGl0Y2gpOworCQludl93cjMyKGRldiwgTlZfUFZJREVPX0JVRkYwX09GRlNFVCArIDQgKiBpLCAwKTsKKwl9CisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19XSU5ET1dfU1RBUlQsIGNydGNfeSA8PCAxNiB8IGNydGNfeCk7CisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19XSU5ET1dfU0laRSwgY3J0Y19oIDw8IDE2IHwgY3J0Y193KTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX1NURVBfU0laRSwKKwkJKHVpbnQzMl90KSgoKHNyY19oIC0gMSkgPDwgMTEpIC8gKGNydGNfaCAtIDEpKSA8PCAxNiB8ICh1aW50MzJfdCkoKChzcmNfdyAtIDEpIDw8IDExKSAvIChjcnRjX3cgLSAxKSkpOworCisJLyogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNvbnZlcnQgaHVlL2NvbnRyYXN0IHRvIHRoaXMgKi8KKwludl93cjMyKGRldiwgTlZfUFZJREVPX1JFRF9DU0NfT0ZGU0VULCAweDY5IC0gYnJpZ2h0bmVzcyk7CisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19HUkVFTl9DU0NfT0ZGU0VULCAweDNlICsgYnJpZ2h0bmVzcyk7CisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19CTFVFX0NTQ19PRkZTRVQsIDB4ODkgLSBicmlnaHRuZXNzKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX0NTQ19BREpVU1QsIDApOworCisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19DT05UUk9MX1ksIDB4MDAxKTsgLyogKEJMVVJfT04sIExJTkVfSEFMRikgKi8KKwludl93cjMyKGRldiwgTlZfUFZJREVPX0NPTlRST0xfWCwgMHgxMTEpOyAvKiAoV0VJR0hUX0hFQVZZLCBTSEFSUEVOSU5HX09OLCBTTU9PVEhJTkdfT04pICovCisKKwludl93cjMyKGRldiwgTlZfUFZJREVPX0ZJRk9fQlVSU1RfTEVOR1RILCAweDAzKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX0ZJRk9fVEhSRVNfU0laRSwgMHgzOCk7CisKKwludl93cjMyKGRldiwgTlZfUFZJREVPX0tFWSwgbnZfcGxhbmUtPmNvbG9ya2V5KTsKKworCWlmIChudl9wbGFuZS0+Y29sb3JrZXkgJiAoMSA8PCAyNCkpCisJCW92ZXJsYXkgfD0gMHgxMDsKKwlpZiAoZmItPnBpeGVsX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lVWVYpCisJCW92ZXJsYXkgfD0gMHgxMDA7CisKKwludl93cjMyKGRldiwgTlZfUFZJREVPX09WRVJMQVksIG92ZXJsYXkpOworCisJbnZfd3IzMihkZXYsIE5WX1BWSURFT19TVV9TVEFURSwgbnZfcmQzMihkZXYsIE5WX1BWSURFT19TVV9TVEFURSkgXiAoMSA8PCAxNikpOworCisJaWYgKGN1cikKKwkJbm91dmVhdV9ib191bnBpbihjdXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfZGlzYWJsZV9wbGFuZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldiA9IG5vdXZlYXVfZGV2KHBsYW5lLT5kZXYpOworCXN0cnVjdCBub3V2ZWF1X3BsYW5lICpudl9wbGFuZSA9IChzdHJ1Y3Qgbm91dmVhdV9wbGFuZSAqKXBsYW5lOworCisJbnZfbWFzayhkZXYsIE5WX1BWSURFT19PVkVSTEFZLCAxLCAwKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX09FX1NUQVRFLCAwKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX1NVX1NUQVRFLCAwKTsKKwludl93cjMyKGRldiwgTlZfUFZJREVPX1JNX1NUQVRFLCAwKTsKKwlpZiAobnZfcGxhbmUtPmN1cikgeworCQlub3V2ZWF1X2JvX3VucGluKG52X3BsYW5lLT5jdXIpOworCQludl9wbGFuZS0+Y3VyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfZnVuY3MgbnYwNF9wbGFuZV9mdW5jcyA9IHsKKwkudXBkYXRlX3BsYW5lID0gbnYwNF91cGRhdGVfcGxhbmUsCisJLmRpc2FibGVfcGxhbmUgPSBudjA0X2Rpc2FibGVfcGxhbmUsCisJLnNldF9wcm9wZXJ0eSA9IG52X3NldF9wcm9wZXJ0eSwKKwkuZGVzdHJveSA9IG52X2Rlc3Ryb3lfcGxhbmUsCit9OworCitzdGF0aWMgdm9pZAorbnYwNF9vdmVybGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldiA9IG5vdXZlYXVfZGV2KGRldmljZSk7CisJc3RydWN0IG5vdXZlYXVfcGxhbmUgKnBsYW5lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfcGxhbmUpLCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJaWYgKCFwbGFuZSkKKwkJcmV0dXJuOworCisJcmV0ID0gZHJtX3BsYW5lX2luaXQoZGV2aWNlLCAmcGxhbmUtPmJhc2UsIDEgLyogc2luZ2xlIGNydGMgKi8sCisJCQkgICAgICZudjA0X3BsYW5lX2Z1bmNzLAorCQkJICAgICBmb3JtYXRzLCAyLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBTZXQgdXAgdGhlIHBsYW5lIHByb3BlcnRpZXMgKi8KKwlwbGFuZS0+cHJvcHMuY29sb3JrZXkgPSBkcm1fcHJvcGVydHlfY3JlYXRlX3JhbmdlKAorCQkJZGV2aWNlLCAwLCAiY29sb3JrZXkiLCAwLCAweDAxZmZmZmZmKTsKKwlwbGFuZS0+cHJvcHMuYnJpZ2h0bmVzcyA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfcmFuZ2UoCisJCQlkZXZpY2UsIDAsICJicmlnaHRuZXNzIiwgMCwgMTAyNCk7CisJaWYgKCFwbGFuZS0+cHJvcHMuY29sb3JrZXkgfHwKKwkgICAgIXBsYW5lLT5wcm9wcy5icmlnaHRuZXNzKQorCQlnb3RvIGNsZWFudXA7CisKKwlwbGFuZS0+Y29sb3JrZXkgPSAwOworCWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5KCZwbGFuZS0+YmFzZS5iYXNlLAorCQkJCSAgIHBsYW5lLT5wcm9wcy5jb2xvcmtleSwgcGxhbmUtPmNvbG9ya2V5KTsKKworCXBsYW5lLT5icmlnaHRuZXNzID0gNTEyOworCWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5KCZwbGFuZS0+YmFzZS5iYXNlLAorCQkJCSAgIHBsYW5lLT5wcm9wcy5icmlnaHRuZXNzLCBwbGFuZS0+YnJpZ2h0bmVzcyk7CisKKwludjA0X2Rpc2FibGVfcGxhbmUoJnBsYW5lLT5iYXNlKTsKIAlyZXR1cm47CiBjbGVhbnVwOgogCWRybV9wbGFuZV9jbGVhbnVwKCZwbGFuZS0+YmFzZSk7CkBAIC0zMzUsNiArNDkwLDggQEAKIG5vdXZlYXVfb3ZlcmxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYgPSBub3V2ZWF1X2RldihkZXZpY2UpOwotCWlmIChkZXYtPmNoaXBzZXQgPj0gMHgxMCAmJiBkZXYtPmNoaXBzZXQgPD0gMHg0MCkKKwlpZiAoZGV2LT5jaGlwc2V0IDwgMHgxMCkKKwkJbnYwNF9vdmVybGF5X2luaXQoZGV2aWNlKTsKKwllbHNlIGlmIChkZXYtPmNoaXBzZXQgPD0gMHg0MCkKIAkJbnYxMF9vdmVybGF5X2luaXQoZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKaW5kZXggM2MxNDk2MS4uNGVmODNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNkZWZpbmUgTk9VVkVBVV9EU01fSEFTX01VWCAweDEKICNkZWZpbmUgTk9VVkVBVV9EU01fSEFTX09QVCAweDIKIAorI2lmZGVmIENPTkZJR19WR0FfU1dJVENIRVJPTwogc3RhdGljIGNvbnN0IGNoYXIgbm91dmVhdV9kc21fbXVpZFtdID0gewogCTB4QTAsIDB4QTAsIDB4OTUsIDB4OUQsIDB4NjAsIDB4MDAsIDB4NDgsIDB4NEQsCiAJMHhCMywgMHg0RCwgMHg3RSwgMHg1RiwgMHhFQSwgMHgxMiwgMHg5RiwgMHhENCwKQEAgLTMyNiw2ICszMjcsMTEgQEAKIAlpZiAobm91dmVhdV9kc21fcHJpdi5vcHRpbXVzX2RldGVjdGVkIHx8IG5vdXZlYXVfZHNtX3ByaXYuZHNtX2RldGVjdGVkKQogCQl2Z2Ffc3dpdGNoZXJvb191bnJlZ2lzdGVyX2hhbmRsZXIoKTsKIH0KKyNlbHNlCit2b2lkIG5vdXZlYXVfcmVnaXN0ZXJfZHNtX2hhbmRsZXIodm9pZCkge30KK3ZvaWQgbm91dmVhdV91bnJlZ2lzdGVyX2RzbV9oYW5kbGVyKHZvaWQpIHt9Cit2b2lkIG5vdXZlYXVfc3dpdGNoZXJvb19vcHRpbXVzX2RzbSh2b2lkKSB7fQorI2VuZGlmCiAKIC8qIHJldHJpZXZlIHRoZSBST00gaW4gNGsgYmxvY2tzICovCiBzdGF0aWMgaW50IG5vdXZlYXVfcm9tX2NhbGwoYWNwaV9oYW5kbGUgcm9tX2hhbmRsZSwgdWludDhfdCAqYmlvcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwppbmRleCBjMGZkZTZiLi40ODg2ODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCkBAIC01NjAsMjggKzU2MCw2IEBACiB9CiAKIAotLyogR1BVLWFzc2lzdGVkIGNvcHkgdXNpbmcgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQsIGNhbiBhY2Nlc3MKLSAqIFRUTV9QTF97VlJBTSxUVH0gZGlyZWN0bHkuCi0gKi8KLQotc3RhdGljIGludAotbm91dmVhdV9ib19tb3ZlX2FjY2VsX2NsZWFudXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKLQkJCSAgICAgIHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCBib29sIGV2aWN0LAotCQkJICAgICAgYm9vbCBub193YWl0X2dwdSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQotewotCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sIGZhbHNlLCAmZmVuY2UpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKCZudmJvLT5ibywgZmVuY2UsIGV2aWN0LAotCQkJCQlub193YWl0X2dwdSwgbmV3X21lbSk7Ci0Jbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQKIG52ZTBfYm9fbW92ZV9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHUzMiBoYW5kbGUpCiB7CkBAIC03OTgsMjUgKzc3NiwyNSBAQAogCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQogewogCXN0cnVjdCBub3V2ZWF1X21lbSAqbm9kZSA9IG9sZF9tZW0tPm1tX25vZGU7Ci0Jc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKIAl1NjQgbGVuZ3RoID0gKG5ld19tZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIAl1NjQgc3JjX29mZnNldCA9IG5vZGUtPnZtYVswXS5vZmZzZXQ7CiAJdTY0IGRzdF9vZmZzZXQgPSBub2RlLT52bWFbMV0ub2Zmc2V0OworCWludCBzcmNfdGlsZWQgPSAhIW5vZGUtPm1lbXR5cGU7CisJaW50IGRzdF90aWxlZCA9ICEhKChzdHJ1Y3Qgbm91dmVhdV9tZW0gKiluZXdfbWVtLT5tbV9ub2RlKS0+bWVtdHlwZTsKIAlpbnQgcmV0OwogCiAJd2hpbGUgKGxlbmd0aCkgewogCQl1MzIgYW1vdW50LCBzdHJpZGUsIGhlaWdodDsKIAorCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDE4ICsgNiAqIChzcmNfdGlsZWQgKyBkc3RfdGlsZWQpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJYW1vdW50ICA9IG1pbihsZW5ndGgsICh1NjQpKDQgKiAxMDI0ICogMTAyNCkpOwogCQlzdHJpZGUgID0gMTYgKiA0OwogCQloZWlnaHQgID0gYW1vdW50IC8gc3RyaWRlOwogCi0JCWlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSAmJgotCQkgICAgbm91dmVhdV9ib190aWxlX2xheW91dChudmJvKSkgewotCQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA4KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQorCQlpZiAoc3JjX3RpbGVkKSB7CiAJCQlCRUdJTl9OVjA0KGNoYW4sIE52U3ViQ29weSwgMHgwMjAwLCA3KTsKIAkJCU9VVF9SSU5HICAoY2hhbiwgMCk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDApOwpAQCAtODI2LDE5ICs4MDQsMTAgQEAKIAkJCU9VVF9SSU5HICAoY2hhbiwgMCk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDApOwogCQl9IGVsc2UgewotCQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQogCQkJQkVHSU5fTlYwNChjaGFuLCBOdlN1YkNvcHksIDB4MDIwMCwgMSk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDEpOwogCQl9Ci0JCWlmIChuZXdfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSAmJgotCQkgICAgbm91dmVhdV9ib190aWxlX2xheW91dChudmJvKSkgewotCQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA4KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQorCQlpZiAoZHN0X3RpbGVkKSB7CiAJCQlCRUdJTl9OVjA0KGNoYW4sIE52U3ViQ29weSwgMHgwMjFjLCA3KTsKIAkJCU9VVF9SSU5HICAoY2hhbiwgMCk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDApOwpAQCAtODQ4LDE4ICs4MTcsMTAgQEAKIAkJCU9VVF9SSU5HICAoY2hhbiwgMCk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDApOwogCQl9IGVsc2UgewotCQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQogCQkJQkVHSU5fTlYwNChjaGFuLCBOdlN1YkNvcHksIDB4MDIxYywgMSk7CiAJCQlPVVRfUklORyAgKGNoYW4sIDEpOwogCQl9CiAKLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAxNCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCiAJCUJFR0lOX05WMDQoY2hhbiwgTnZTdWJDb3B5LCAweDAyMzgsIDIpOwogCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCkpOwogCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMoZHN0X29mZnNldCkpOwpAQCAtOTUzLDIzICs5MTQsMjggQEAKIH0KIAogc3RhdGljIGludAotbm91dmVhdV92bWFfZ2V0bWFwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLAotCQkgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSwgc3RydWN0IG5vdXZlYXVfdm1hICp2bWEpCitub3V2ZWF1X2JvX21vdmVfcHJlcChzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSwgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJICAgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm5vZGUgPSBtZW0tPm1tX25vZGU7CisJc3RydWN0IG5vdXZlYXVfbWVtICpvbGRfbm9kZSA9IGJvLT5tZW0ubW1fbm9kZTsKKwlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm5ld19ub2RlID0gbWVtLT5tbV9ub2RlOworCXU2NCBzaXplID0gKHU2NCltZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZUOwogCWludCByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X3ZtX2dldChudl9jbGllbnQoY2hhbi0+Y2xpKS0+dm0sIG1lbS0+bnVtX3BhZ2VzIDw8Ci0JCQkgICAgIFBBR0VfU0hJRlQsIG5vZGUtPnBhZ2Vfc2hpZnQsCi0JCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcsIHZtYSk7CisJcmV0ID0gbm91dmVhdV92bV9nZXQobnZfY2xpZW50KGRybSktPnZtLCBzaXplLCBvbGRfbm9kZS0+cGFnZV9zaGlmdCwKKwkJCSAgICAgTlZfTUVNX0FDQ0VTU19SVywgJm9sZF9ub2RlLT52bWFbMF0pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAobWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKLQkJbm91dmVhdV92bV9tYXAodm1hLCBub2RlKTsKLQllbHNlCi0JCW5vdXZlYXVfdm1fbWFwX3NnKHZtYSwgMCwgbWVtLT5udW1fcGFnZXMgPDwgUEFHRV9TSElGVCwgbm9kZSk7CisJcmV0ID0gbm91dmVhdV92bV9nZXQobnZfY2xpZW50KGRybSktPnZtLCBzaXplLCBuZXdfbm9kZS0+cGFnZV9zaGlmdCwKKwkJCSAgICAgTlZfTUVNX0FDQ0VTU19SVywgJm9sZF9ub2RlLT52bWFbMV0pOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV92bV9wdXQoJm9sZF9ub2RlLT52bWFbMF0pOworCQlyZXR1cm4gcmV0OworCX0KIAorCW5vdXZlYXVfdm1fbWFwKCZvbGRfbm9kZS0+dm1hWzBdLCBvbGRfbm9kZSk7CisJbm91dmVhdV92bV9tYXAoJm9sZF9ub2RlLT52bWFbMV0sIG5ld19ub2RlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTc5LDM1ICs5NDUsMzQgQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRybS0+dHRtLmNoYW47Ci0Jc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKLQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm9sZF9tZW0gPSAmYm8tPm1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2U7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2tfbmVzdGVkKCZjaGFuLT5jbGktPm11dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0KIAkvKiBjcmVhdGUgdGVtcG9yYXJ5IHZtYXMgZm9yIHRoZSB0cmFuc2ZlciBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlCiAJICogb2xkIG5vdXZlYXVfbWVtIG5vZGUsIHRoZXNlIHdpbGwgZ2V0IGNsZWFuZWQgdXAgYWZ0ZXIgdHRtIGhhcwogCSAqIGRlc3Ryb3llZCB0aGUgdHRtX21lbV9yZWcKIAkgKi8KIAlpZiAobnZfZGV2aWNlKGRybS0+ZGV2aWNlKS0+Y2FyZF90eXBlID49IE5WXzUwKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X21lbSAqbm9kZSA9IG9sZF9tZW0tPm1tX25vZGU7Ci0KLQkJcmV0ID0gbm91dmVhdV92bWFfZ2V0bWFwKGNoYW4sIG52Ym8sIG9sZF9tZW0sICZub2RlLT52bWFbMF0pOworCQlyZXQgPSBub3V2ZWF1X2JvX21vdmVfcHJlcChkcm0sIGJvLCBuZXdfbWVtKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCXJldCA9IG5vdXZlYXVfdm1hX2dldG1hcChjaGFuLCBudmJvLCBuZXdfbWVtLCAmbm9kZS0+dm1hWzFdKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkcm0tPnR0bS5tb3ZlKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmNoYW4tPmNsaS0+bXV0ZXgsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwlyZXQgPSBub3V2ZWF1X2ZlbmNlX3N5bmMoYm8tPnN5bmNfb2JqLCBjaGFuKTsKIAlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gbm91dmVhdV9ib19tb3ZlX2FjY2VsX2NsZWFudXAoY2hhbiwgbnZibywgZXZpY3QsCi0JCQkJCQkgICAgbm9fd2FpdF9ncHUsIG5ld19tZW0pOworCQlyZXQgPSBkcm0tPnR0bS5tb3ZlKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gbm91dmVhdV9mZW5jZV9uZXcoY2hhbiwgZmFsc2UsICZmZW5jZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGJvLCBmZW5jZSwKKwkJCQkJCQkJZXZpY3QsCisJCQkJCQkJCW5vX3dhaXRfZ3B1LAorCQkJCQkJCQluZXdfbWVtKTsKKwkJCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7CisJCQl9CisJCX0KIAl9Ci0KLW91dDoKIAltdXRleF91bmxvY2soJmNoYW4tPmNsaS0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMTQ3LDE5ICsxMTEyLDEwIEBACiAJCXJldHVybjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCAmbnZiby0+dm1hX2xpc3QsIGhlYWQpIHsKLQkJaWYgKG5ld19tZW0gJiYgbmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pIHsKKwkJaWYgKG5ld19tZW0gJiYgbmV3X21lbS0+bWVtX3R5cGUgIT0gVFRNX1BMX1NZU1RFTSAmJgorCQkJICAgICAgKG5ld19tZW0tPm1lbV90eXBlID09IFRUTV9QTF9WUkFNIHx8CisJCQkgICAgICAgbnZiby0+cGFnZV9zaGlmdCAhPSB2bWEtPnZtLT52bW0tPmxwZ19zaGlmdCkpIHsKIAkJCW5vdXZlYXVfdm1fbWFwKHZtYSwgbmV3X21lbS0+bW1fbm9kZSk7Ci0JCX0gZWxzZQotCQlpZiAobmV3X21lbSAmJiBuZXdfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVFQgJiYKLQkJICAgIG52Ym8tPnBhZ2Vfc2hpZnQgPT0gdm1hLT52bS0+dm1tLT5zcGdfc2hpZnQpIHsKLQkJCWlmICgoKHN0cnVjdCBub3V2ZWF1X21lbSAqKW5ld19tZW0tPm1tX25vZGUpLT5zZykKLQkJCQlub3V2ZWF1X3ZtX21hcF9zZ190YWJsZSh2bWEsIDAsIG5ld19tZW0tPgotCQkJCQkJICBudW1fcGFnZXMgPDwgUEFHRV9TSElGVCwKLQkJCQkJCSAgbmV3X21lbS0+bW1fbm9kZSk7Ci0JCQllbHNlCi0JCQkJbm91dmVhdV92bV9tYXBfc2codm1hLCAwLCBuZXdfbWVtLT4KLQkJCQkJCSAgbnVtX3BhZ2VzIDw8IFBBR0VfU0hJRlQsCi0JCQkJCQkgIG5ld19tZW0tPm1tX25vZGUpOwogCQl9IGVsc2UgewogCQkJbm91dmVhdV92bV91bm1hcCh2bWEpOwogCQl9CkBAIC0xMjI0LDI4ICsxMTgwLDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIENQVSBjb3B5IGlmIHdlIGhhdmUgbm8gYWNjZWxlcmF0ZWQgbWV0aG9kIGF2YWlsYWJsZSAqLwotCWlmICghZHJtLT50dG0ubW92ZSkgewotCQlyZXQgPSB0dG1fYm9fbW92ZV9tZW1jcHkoYm8sIGV2aWN0LCBub193YWl0X2dwdSwgbmV3X21lbSk7Ci0JCWdvdG8gb3V0OworCS8qIEhhcmR3YXJlIGFzc2lzdGVkIGNvcHkuICovCisJaWYgKGRybS0+dHRtLm1vdmUpIHsKKwkJaWYgKG5ld19tZW0tPm1lbV90eXBlID09IFRUTV9QTF9TWVNURU0pCisJCQlyZXQgPSBub3V2ZWF1X2JvX21vdmVfZmxpcGQoYm8sIGV2aWN0LCBpbnRyLAorCQkJCQkJICAgIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKKwkJZWxzZSBpZiAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkKKwkJCXJldCA9IG5vdXZlYXVfYm9fbW92ZV9mbGlwcyhibywgZXZpY3QsIGludHIsCisJCQkJCQkgICAgbm9fd2FpdF9ncHUsIG5ld19tZW0pOworCQllbHNlCisJCQlyZXQgPSBub3V2ZWF1X2JvX21vdmVfbTJtZihibywgZXZpY3QsIGludHIsCisJCQkJCQkgICBub193YWl0X2dwdSwgbmV3X21lbSk7CisJCWlmICghcmV0KQorCQkJZ290byBvdXQ7CiAJfQogCi0JLyogSGFyZHdhcmUgYXNzaXN0ZWQgY29weS4gKi8KLQlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkKLQkJcmV0ID0gbm91dmVhdV9ib19tb3ZlX2ZsaXBkKGJvLCBldmljdCwgaW50ciwKLQkJCQkJICAgIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKLQllbHNlIGlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfU1lTVEVNKQotCQlyZXQgPSBub3V2ZWF1X2JvX21vdmVfZmxpcHMoYm8sIGV2aWN0LCBpbnRyLAotCQkJCQkgICAgbm9fd2FpdF9ncHUsIG5ld19tZW0pOwotCWVsc2UKLQkJcmV0ID0gbm91dmVhdV9ib19tb3ZlX20ybWYoYm8sIGV2aWN0LCBpbnRyLAotCQkJCQkgICBub193YWl0X2dwdSwgbmV3X21lbSk7Ci0KLQlpZiAoIXJldCkKLQkJZ290byBvdXQ7Ci0KIAkvKiBGYWxsYmFjayB0byBzb2Z0d2FyZSBjb3B5LiAqLwotCXJldCA9IHR0bV9ib19tb3ZlX21lbWNweShibywgZXZpY3QsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKKwlzcGluX2xvY2soJmJvLT5iZGV2LT5mZW5jZV9sb2NrKTsKKwlyZXQgPSB0dG1fYm9fd2FpdChibywgdHJ1ZSwgaW50ciwgbm9fd2FpdF9ncHUpOworCXNwaW5fdW5sb2NrKCZiby0+YmRldi0+ZmVuY2VfbG9jayk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSB0dG1fYm9fbW92ZV9tZW1jcHkoYm8sIGV2aWN0LCBub193YWl0X2dwdSwgbmV3X21lbSk7CiAKIG91dDoKIAlpZiAobnZfZGV2aWNlKGRybS0+ZGV2aWNlKS0+Y2FyZF90eXBlIDwgTlZfNTApIHsKQEAgLTEyNzEsNiArMTIyNiw3IEBACiB7CiAJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW21lbS0+bWVtX3R5cGVdOwogCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9iZGV2KGJkZXYpOworCXN0cnVjdCBub3V2ZWF1X21lbSAqbm9kZSA9IG1lbS0+bW1fbm9kZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZHJtLT5kZXY7CiAJaW50IHJldDsKIApAQCAtMTI5MywxNCArMTI0OSwxNiBAQAogCQkJbWVtLT5idXMuaXNfaW9tZW0gPSAhZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlOwogCQl9CiAjZW5kaWYKLQkJYnJlYWs7CisJCWlmICghbm9kZS0+bWVtdHlwZSkKKwkJCS8qIHVudGlsZWQgKi8KKwkJCWJyZWFrOworCQkvKiBmYWxsdGhyb3VnaCwgdGlsZWQgbWVtb3J5ICovCiAJY2FzZSBUVE1fUExfVlJBTToKIAkJbWVtLT5idXMub2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOwogCQltZW0tPmJ1cy5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CiAJCW1lbS0+YnVzLmlzX2lvbWVtID0gdHJ1ZTsKIAkJaWYgKG52X2RldmljZShkcm0tPmRldmljZSktPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQkJc3RydWN0IG5vdXZlYXVfYmFyICpiYXIgPSBub3V2ZWF1X2Jhcihkcm0tPmRldmljZSk7Ci0JCQlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm5vZGUgPSBtZW0tPm1tX25vZGU7CiAKIAkJCXJldCA9IGJhci0+dW1hcChiYXIsIG5vZGUsIE5WX01FTV9BQ0NFU1NfUlcsCiAJCQkJCSZub2RlLT5iYXJfdm1hKTsKQEAgLTEzMzYsNiArMTI5NCw3IEBACiAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShkcm0tPmRldmljZSk7CiAJdTMyIG1hcHBhYmxlID0gcGNpX3Jlc291cmNlX2xlbihkZXZpY2UtPnBkZXYsIDEpID4+IFBBR0VfU0hJRlQ7CisJaW50IHJldDsKIAogCS8qIGFzIGxvbmcgYXMgdGhlIGJvIGlzbid0IGluIHZyYW0sIGFuZCBpc24ndCB0aWxlZCwgd2UndmUgZ290CiAJICogbm90aGluZyB0byBkbyBoZXJlLgpAQCAtMTM0NCwxMCArMTMwMywyMCBAQAogCQlpZiAobnZfZGV2aWNlKGRybS0+ZGV2aWNlKS0+Y2FyZF90eXBlIDwgTlZfNTAgfHwKIAkJICAgICFub3V2ZWF1X2JvX3RpbGVfbGF5b3V0KG52Ym8pKQogCQkJcmV0dXJuIDA7CisKKwkJaWYgKGJvLT5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkgeworCQkJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIFRUTV9QTF9UVCwgMCk7CisKKwkJCXJldCA9IG5vdXZlYXVfYm9fdmFsaWRhdGUobnZibywgZmFsc2UsIGZhbHNlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBtYWtlIHN1cmUgYm8gaXMgaW4gbWFwcGFibGUgdnJhbSAqLwotCWlmIChiby0+bWVtLnN0YXJ0ICsgYm8tPm1lbS5udW1fcGFnZXMgPCBtYXBwYWJsZSkKKwlpZiAobnZfZGV2aWNlKGRybS0+ZGV2aWNlKS0+Y2FyZF90eXBlID49IE5WXzUwIHx8CisJICAgIGJvLT5tZW0uc3RhcnQgKyBiby0+bWVtLm51bV9wYWdlcyA8IG1hcHBhYmxlKQogCQlyZXR1cm4gMDsKIAogCkBAIC0xNTM1LDcgKzE1MDQsNiBAQAogCQkgICBzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSkKIHsKIAljb25zdCB1MzIgc2l6ZSA9IG52Ym8tPmJvLm1lbS5udW1fcGFnZXMgPDwgUEFHRV9TSElGVDsKLQlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm5vZGUgPSBudmJvLT5iby5tZW0ubW1fbm9kZTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gbm91dmVhdV92bV9nZXQodm0sIHNpemUsIG52Ym8tPnBhZ2Vfc2hpZnQsCkBAIC0xNTQzLDE1ICsxNTExLDEwIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChudmJvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJaWYgKCBudmJvLT5iby5tZW0ubWVtX3R5cGUgIT0gVFRNX1BMX1NZU1RFTSAmJgorCSAgICAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNIHx8CisJICAgICBudmJvLT5wYWdlX3NoaWZ0ICE9IHZtYS0+dm0tPnZtbS0+bHBnX3NoaWZ0KSkKIAkJbm91dmVhdV92bV9tYXAodm1hLCBudmJvLT5iby5tZW0ubW1fbm9kZSk7Ci0JZWxzZSBpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCAmJgotCQkgbnZiby0+cGFnZV9zaGlmdCA9PSB2bWEtPnZtLT52bW0tPnNwZ19zaGlmdCkgewotCQlpZiAobm9kZS0+c2cpCi0JCQlub3V2ZWF1X3ZtX21hcF9zZ190YWJsZSh2bWEsIDAsIHNpemUsIG5vZGUpOwotCQllbHNlCi0JCQlub3V2ZWF1X3ZtX21hcF9zZyh2bWEsIDAsIHNpemUsIG5vZGUpOwotCX0KIAogCWxpc3RfYWRkX3RhaWwoJnZtYS0+aGVhZCwgJm52Ym8tPnZtYV9saXN0KTsKIAl2bWEtPnJlZmNvdW50ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKaW5kZXggMjVlYTgyZi4uMjQwMTE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKQEAgLTY4LDIwICs2OCwxMDAgQEAKIAkJbm91dmVhdV9ldmVudF9wdXQoZGlzcC0+dmJsYW5rW2hlYWRdKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2NhbGMoaW50IGJsYW5rcywgaW50IGJsYW5rZSwgaW50IHRvdGFsLCBpbnQgbGluZSkKK3sKKwlpZiAoYmxhbmtlID49IGJsYW5rcykgeworCQlpZiAobGluZSA+PSBibGFua3MpCisJCQlsaW5lIC09IHRvdGFsOworCX0gZWxzZSB7CisJCWlmIChsaW5lID49IGJsYW5rcykKKwkJCWxpbmUgLT0gdG90YWw7CisJCWxpbmUgLT0gYmxhbmtlICsgMTsKKwl9CisJcmV0dXJuIGxpbmU7Cit9CisKK2ludAorbm91dmVhdV9kaXNwbGF5X3NjYW5vdXRwb3NfaGVhZChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCAqdnBvcywgaW50ICpocG9zLAorCQkJCWt0aW1lX3QgKnN0aW1lLCBrdGltZV90ICpldGltZSkKK3sKKwljb25zdCB1MzIgbXRoZCA9IE5WMDRfRElTUF9TQ0FOT1VUUE9TICsgbm91dmVhdV9jcnRjKGNydGMpLT5pbmRleDsKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5ICpkaXNwID0gbm91dmVhdV9kaXNwbGF5KGNydGMtPmRldik7CisJc3RydWN0IG52MDRfZGlzcGxheV9zY2Fub3V0cG9zIGFyZ3M7CisJaW50IHJldCwgcmV0cnkgPSAxOworCisJZG8geworCQlyZXQgPSBudl9leGVjKGRpc3AtPmNvcmUsIG10aGQsICZhcmdzLCBzaXplb2YoYXJncykpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gMDsKKworCQlpZiAoYXJncy52bGluZSkgeworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX0FDQ1VSQVRFOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmV0cnkpIG5kZWxheShjcnRjLT5saW5lZHVyX25zKTsKKwl9IHdoaWxlIChyZXRyeS0tKTsKKworCSpocG9zID0gY2FsYyhhcmdzLmhibGFua3MsIGFyZ3MuaGJsYW5rZSwgYXJncy5odG90YWwsIGFyZ3MuaGxpbmUpOworCSp2cG9zID0gY2FsYyhhcmdzLnZibGFua3MsIGFyZ3MudmJsYW5rZSwgYXJncy52dG90YWwsIGFyZ3MudmxpbmUpOworCWlmIChzdGltZSkgKnN0aW1lID0gbnNfdG9fa3RpbWUoYXJncy50aW1lWzBdKTsKKwlpZiAoZXRpbWUpICpldGltZSA9IG5zX3RvX2t0aW1lKGFyZ3MudGltZVsxXSk7CisKKwlpZiAoKnZwb3MgPCAwKQorCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfSU5WQkw7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2Rpc3BsYXlfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJICAgaW50ICp2cG9zLCBpbnQgKmhwb3MsIGt0aW1lX3QgKnN0aW1lLCBrdGltZV90ICpldGltZSkKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAobm91dmVhdV9jcnRjKGNydGMpLT5pbmRleCA9PSBoZWFkKSB7CisJCQlyZXR1cm4gbm91dmVhdV9kaXNwbGF5X3NjYW5vdXRwb3NfaGVhZChjcnRjLCB2cG9zLCBocG9zLAorCQkJCQkJCSAgICAgICBzdGltZSwgZXRpbWUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9kaXNwbGF5X3ZibHN0YW1wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBpbnQgKm1heF9lcnJvciwKKwkJCSBzdHJ1Y3QgdGltZXZhbCAqdGltZSwgdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKG5vdXZlYXVfY3J0YyhjcnRjKS0+aW5kZXggPT0gaGVhZCkgeworCQkJcmV0dXJuIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoZGV2LAorCQkJCQloZWFkLCBtYXhfZXJyb3IsIHRpbWUsIGZsYWdzLCBjcnRjLAorCQkJCQkmY3J0Yy0+aHdtb2RlKTsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgdm9pZAogbm91dmVhdV9kaXNwbGF5X3ZibGFua19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5vdXZlYXVfZGlzcGxheSAqZGlzcCA9IG5vdXZlYXVfZGlzcGxheShkZXYpOwogCWludCBpOwogCisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CisKIAlpZiAoZGlzcC0+dmJsYW5rKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjOyBpKyspCiAJCQlub3V2ZWF1X2V2ZW50X3JlZihOVUxMLCAmZGlzcC0+dmJsYW5rW2ldKTsKIAkJa2ZyZWUoZGlzcC0+dmJsYW5rKTsKIAkJZGlzcC0+dmJsYW5rID0gTlVMTDsKIAl9Ci0KLQlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIH0KIAogc3RhdGljIGludApAQCAtNDA3LDEwICs0ODcsMzEgQEAKIAlkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZGV2KTsKIAogCWlmIChkcm0tPnZiaW9zLmRjYi5lbnRyaWVzKSB7Ci0JCWlmIChudl9kZXZpY2UoZHJtLT5kZXZpY2UpLT5jYXJkX3R5cGUgPCBOVl81MCkKLQkJCXJldCA9IG52MDRfZGlzcGxheV9jcmVhdGUoZGV2KTsKLQkJZWxzZQotCQkJcmV0ID0gbnY1MF9kaXNwbGF5X2NyZWF0ZShkZXYpOworCQlzdGF0aWMgY29uc3QgdTE2IG9jbGFzc1tdID0geworCQkJTlZGMF9ESVNQX0NMQVNTLAorCQkJTlZFMF9ESVNQX0NMQVNTLAorCQkJTlZEMF9ESVNQX0NMQVNTLAorCQkJTlZBM19ESVNQX0NMQVNTLAorCQkJTlY5NF9ESVNQX0NMQVNTLAorCQkJTlZBMF9ESVNQX0NMQVNTLAorCQkJTlY4NF9ESVNQX0NMQVNTLAorCQkJTlY1MF9ESVNQX0NMQVNTLAorCQkJTlYwNF9ESVNQX0NMQVNTLAorCQl9OworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwLCByZXQgPSAtRU5PREVWOyByZXQgJiYgaSA8IEFSUkFZX1NJWkUob2NsYXNzKTsgaSsrKSB7CisJCQlyZXQgPSBub3V2ZWF1X29iamVjdF9uZXcobnZfb2JqZWN0KGRybSksIE5WRFJNX0RFVklDRSwKKwkJCQkJCSBOVkRSTV9ESVNQTEFZLCBvY2xhc3NbaV0sCisJCQkJCQkgTlVMTCwgMCwgJmRpc3AtPmNvcmUpOworCQl9CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlpZiAobnZfbWNsYXNzKGRpc3AtPmNvcmUpIDwgTlY1MF9ESVNQX0NMQVNTKQorCQkJCXJldCA9IG52MDRfZGlzcGxheV9jcmVhdGUoZGV2KTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBudjUwX2Rpc3BsYXlfY3JlYXRlKGRldik7CisJCX0KIAl9IGVsc2UgewogCQlyZXQgPSAwOwogCX0KQEAgLTQzOSw2ICs1NDAsNyBAQAogbm91dmVhdV9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5ICpkaXNwID0gbm91dmVhdV9kaXNwbGF5KGRldik7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShkZXYpOwogCiAJbm91dmVhdV9iYWNrbGlnaHRfZXhpdChkZXYpOwogCW5vdXZlYXVfZGlzcGxheV92YmxhbmtfZmluaShkZXYpOwpAQCAtNDQ5LDYgKzU1MSw4IEBACiAJaWYgKGRpc3AtPmR0b3IpCiAJCWRpc3AtPmR0b3IoZGV2KTsKIAorCW5vdXZlYXVfb2JqZWN0X2RlbChudl9vYmplY3QoZHJtKSwgTlZEUk1fREVWSUNFLCBOVkRSTV9ESVNQTEFZKTsKKwogCW5vdXZlYXVfZHJtKGRldiktPmRpc3BsYXkgPSBOVUxMOwogCWtmcmVlKGRpc3ApOwogfQpAQCAtNjAzLDE1ICs3MDcsNiBAQAogCWlmICghcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBzeW5jaHJvbmlzZSByZW5kZXJpbmcgY2hhbm5lbCB3aXRoIHRoZSBrZXJuZWwncyBjaGFubmVsICovCi0Jc3Bpbl9sb2NrKCZuZXdfYm8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOwotCWZlbmNlID0gbm91dmVhdV9mZW5jZV9yZWYobmV3X2JvLT5iby5zeW5jX29iaik7Ci0Jc3Bpbl91bmxvY2soJm5ld19iby0+Ym8uYmRldi0+ZmVuY2VfbG9jayk7Ci0JcmV0ID0gbm91dmVhdV9mZW5jZV9zeW5jKGZlbmNlLCBjaGFuKTsKLQlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsX2ZyZWU7Ci0KIAlpZiAobmV3X2JvICE9IG9sZF9ibykgewogCQlyZXQgPSBub3V2ZWF1X2JvX3BpbihuZXdfYm8sIFRUTV9QTF9GTEFHX1ZSQU0pOwogCQlpZiAocmV0KQpAQCAtNjE5LDYgKzcxNCwxNiBAQAogCX0KIAogCW11dGV4X2xvY2soJmNoYW4tPmNsaS0+bXV0ZXgpOworCisJLyogc3luY2hyb25pc2UgcmVuZGVyaW5nIGNoYW5uZWwgd2l0aCB0aGUga2VybmVsJ3MgY2hhbm5lbCAqLworCXNwaW5fbG9jaygmbmV3X2JvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKKwlmZW5jZSA9IG5vdXZlYXVfZmVuY2VfcmVmKG5ld19iby0+Ym8uc3luY19vYmopOworCXNwaW5fdW5sb2NrKCZuZXdfYm8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOworCXJldCA9IG5vdXZlYXVfZmVuY2Vfc3luYyhmZW5jZSwgY2hhbik7CisJbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF91bnBpbjsKKwogCXJldCA9IHR0bV9ib19yZXNlcnZlKCZvbGRfYm8tPmJvLCB0cnVlLCBmYWxzZSwgZmFsc2UsIE5VTEwpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbF91bnBpbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmgKaW5kZXggOGJjOGJhYi4uYTcxY2Y3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmgKQEAgLTM2LDYgKzM2LDcgQEAKIAlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJdm9pZCAoKmZpbmkpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpjb3JlOwogCXN0cnVjdCBub3V2ZWF1X2V2ZW50aCAqKnZibGFuazsKIAogCXN0cnVjdCBkcm1fcHJvcGVydHkgKmRpdGhlcmluZ19tb2RlOwpAQCAtNjMsNiArNjQsMTAgQEAKIHZvaWQgbm91dmVhdV9kaXNwbGF5X3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCAgbm91dmVhdV9kaXNwbGF5X3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50KTsKIHZvaWQgbm91dmVhdV9kaXNwbGF5X3ZibGFua19kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCk7CitpbnQgIG5vdXZlYXVfZGlzcGxheV9zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCwgdW5zaWduZWQgaW50LAorCQkJCWludCAqLCBpbnQgKiwga3RpbWVfdCAqLCBrdGltZV90ICopOworaW50ICBub3V2ZWF1X2Rpc3BsYXlfdmJsc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCBpbnQgKiwKKwkJCSAgICAgIHN0cnVjdCB0aW1ldmFsICosIHVuc2lnbmVkKTsKIAogaW50ICBub3V2ZWF1X2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkgICAgc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYwppbmRleCA0MGY5MWUxLi5jMTc3MjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAJY2hhbi0+ZG1hLmliX3B1dCA9IChjaGFuLT5kbWEuaWJfcHV0ICsgMSkgJiBjaGFuLT5kbWEuaWJfbWF4OwogCi0JRFJNX01FTU9SWUJBUlJJRVIoKTsKKwltYigpOwogCS8qIEZsdXNoIHdyaXRlcy4gKi8KIAlub3V2ZWF1X2JvX3JkMzIocGIsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaAppbmRleCA5ODQwMDRkLi5kYzBlMGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogfQogCiAjZGVmaW5lIFdSSVRFX1BVVCh2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCURSTV9NRU1PUllCQVJSSUVSKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW1iKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCW5vdXZlYXVfYm9fcmQzMihjaGFuLT5wdXNoLmJ1ZmZlciwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCW52X3dvMzIoY2hhbi0+b2JqZWN0LCBjaGFuLT51c2VyX3B1dCwgKCh2YWwpIDw8IDIpICsgY2hhbi0+cHVzaC52bWEub2Zmc2V0KTsgIFwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uYwppbmRleCA5OGEyMmU2Li43OGM4ZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmMKQEAgLTUwMywxOSArNTAzLDIxIEBACiAJaWYgKGRybS0+Y2VjaGFuKSB7CiAJCXJldCA9IG5vdXZlYXVfY2hhbm5lbF9pZGxlKGRybS0+Y2VjaGFuKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGZhaWxfZGlzcGxheTsKIAl9CiAKIAlpZiAoZHJtLT5jaGFubmVsKSB7CiAJCXJldCA9IG5vdXZlYXVfY2hhbm5lbF9pZGxlKGRybS0+Y2hhbm5lbCk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBmYWlsX2Rpc3BsYXk7CiAJfQogCiAJTlZfSU5GTyhkcm0sICJzdXNwZW5kaW5nIGNsaWVudCBvYmplY3QgdHJlZXMuLi5cbiIpOwogCWlmIChkcm0tPmZlbmNlICYmIG5vdXZlYXVfZmVuY2UoZHJtKS0+c3VzcGVuZCkgewotCQlpZiAoIW5vdXZlYXVfZmVuY2UoZHJtKS0+c3VzcGVuZChkcm0pKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghbm91dmVhdV9mZW5jZShkcm0pLT5zdXNwZW5kKGRybSkpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWxfZGlzcGxheTsKKwkJfQogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xpLCAmZHJtLT5jbGllbnRzLCBoZWFkKSB7CkBAIC01MzcsNiArNTM5LDEwIEBACiAJCW5vdXZlYXVfY2xpZW50X2luaXQoJmNsaS0+YmFzZSk7CiAJfQogCisJaWYgKGRybS0+ZmVuY2UgJiYgbm91dmVhdV9mZW5jZShkcm0pLT5yZXN1bWUpCisJCW5vdXZlYXVfZmVuY2UoZHJtKS0+cmVzdW1lKGRybSk7CisKK2ZhaWxfZGlzcGxheToKIAlpZiAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YykgewogCQlOVl9JTkZPKGRybSwgInJlc3VtaW5nIGRpc3BsYXkuLi5cbiIpOwogCQlub3V2ZWF1X2Rpc3BsYXlfcmVzdW1lKGRldik7CkBAIC03OTgsNiArODA0LDggQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gZHJtX3ZibGFua19jb3VudCwKIAkuZW5hYmxlX3ZibGFuayA9IG5vdXZlYXVfZGlzcGxheV92YmxhbmtfZW5hYmxlLAogCS5kaXNhYmxlX3ZibGFuayA9IG5vdXZlYXVfZGlzcGxheV92YmxhbmtfZGlzYWJsZSwKKwkuZ2V0X3NjYW5vdXRfcG9zaXRpb24gPSBub3V2ZWF1X2Rpc3BsYXlfc2Nhbm91dHBvcywKKwkuZ2V0X3ZibGFua190aW1lc3RhbXAgPSBub3V2ZWF1X2Rpc3BsYXlfdmJsc3RhbXAsCiAKIAkuaW9jdGxzID0gbm91dmVhdV9pb2N0bHMsCiAJLm51bV9pb2N0bHMgPSBBUlJBWV9TSVpFKG5vdXZlYXVfaW9jdGxzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5oCmluZGV4IDRiMGZiNmMuLjIzY2E3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uaApAQCAtNTQsNiArNTQsNyBAQAogCU5WRFJNX0NMSUVOVCAgPSAweGZmZmZmZmZmLAogCU5WRFJNX0RFVklDRSAgPSAweGRkZGRkZGRkLAogCU5WRFJNX0NPTlRST0wgPSAweGRkZGRkZGRjLAorCU5WRFJNX0RJU1BMQVkgPSAweGQxNTAwMDAwLAogCU5WRFJNX1BVU0ggICAgPSAweGJiYmIwMDAwLCAvKiB8PSBjbGllbnQgY2hpZCAqLwogCU5WRFJNX0NIQU4gICAgPSAweGNjY2MwMDAwLCAvKiB8PSBjbGllbnQgY2hpZCAqLwogCU5WRFJNX05WU1cgICAgPSAweDU1NTUwMDAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCmluZGV4IDQwY2Y1MmUuLjkwMDc0ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCWludCByZXQ7CiAKIAlmZW5jZS0+Y2hhbm5lbCAgPSBjaGFuOwotCWZlbmNlLT50aW1lb3V0ICA9IGppZmZpZXMgKyAoMTUgKiBEUk1fSFopOworCWZlbmNlLT50aW1lb3V0ICA9IGppZmZpZXMgKyAoMTUgKiBIWik7CiAJZmVuY2UtPnNlcXVlbmNlID0gKytmY3R4LT5zZXF1ZW5jZTsKIAogCXJldCA9IGZjdHgtPmVtaXQoZmVuY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKaW5kZXggNzhhMjdmOC4uMjdjM2ZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jCkBAIC00NjMsMTIgKzQ2Myw2IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShudmJvLCBsaXN0LCBlbnRyeSkgewogCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmIgPSAmcGJib1tudmJvLT5wYmJvX2luZGV4XTsKIAotCQlyZXQgPSB2YWxpZGF0ZV9zeW5jKGNoYW4sIG52Ym8pOwotCQlpZiAodW5saWtlbHkocmV0KSkgewotCQkJTlZfRVJST1IoY2xpLCAiZmFpbCBwcmUtdmFsaWRhdGUgc3luY1xuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KIAkJcmV0ID0gbm91dmVhdV9nZW1fc2V0X2RvbWFpbigmbnZiby0+Z2VtLCBiLT5yZWFkX2RvbWFpbnMsCiAJCQkJCSAgICAgYi0+d3JpdGVfZG9tYWlucywKIAkJCQkJICAgICBiLT52YWxpZF9kb21haW5zKTsKQEAgLTUwNiw3ICs1MDAsNyBAQAogCQkJYi0+cHJlc3VtZWQudmFsaWQgPSAwOwogCQkJcmVsb2NzKys7CiAKLQkJCWlmIChEUk1fQ09QWV9UT19VU0VSKCZ1cGJib1tudmJvLT5wYmJvX2luZGV4XS5wcmVzdW1lZCwKKwkJCWlmIChjb3B5X3RvX3VzZXIoJnVwYmJvW252Ym8tPnBiYm9faW5kZXhdLnByZXN1bWVkLAogCQkJCQkgICAgICZiLT5wcmVzdW1lZCwgc2l6ZW9mKGItPnByZXN1bWVkKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTU5Myw3ICs1ODcsNyBAQAogCWlmICghbWVtKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIobWVtLCB1c2VycHRyLCBzaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcihtZW0sIHVzZXJwdHIsIHNpemUpKSB7CiAJCXVfZnJlZShtZW0pOwogCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKaW5kZXggMDg0M2ViYy4uYTRkMjJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtMzEsMTYgKzMxLDE3IEBACiB7CiAJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKil0dG07CiAJc3RydWN0IG5vdXZlYXVfbWVtICpub2RlID0gbWVtLT5tbV9ub2RlOwotCXU2NCBzaXplID0gbWVtLT5udW1fcGFnZXMgPDwgMTI7CiAKIAlpZiAodHRtLT5zZykgewotCQlub2RlLT5zZyA9IHR0bS0+c2c7Ci0JCW5vdXZlYXVfdm1fbWFwX3NnX3RhYmxlKCZub2RlLT52bWFbMF0sIDAsIHNpemUsIG5vZGUpOworCQlub2RlLT5zZyAgICA9IHR0bS0+c2c7CisJCW5vZGUtPnBhZ2VzID0gTlVMTDsKIAl9IGVsc2UgeworCQlub2RlLT5zZyAgICA9IE5VTEw7CiAJCW5vZGUtPnBhZ2VzID0gbnZiZS0+dHRtLmRtYV9hZGRyZXNzOwotCQlub3V2ZWF1X3ZtX21hcF9zZygmbm9kZS0+dm1hWzBdLCAwLCBzaXplLCBub2RlKTsKIAl9CisJbm9kZS0+c2l6ZSA9IChtZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZUKSA+PiAxMjsKIAorCW5vdXZlYXVfdm1fbWFwKCZub2RlLT52bWFbMF0sIG5vZGUpOwogCW52YmUtPm5vZGUgPSBub2RlOwogCXJldHVybiAwOwogfQpAQCAtNjcsOSArNjgsMTMgQEAKIAogCS8qIG5vb3A6IGJvdW5kIGluIG1vdmVfbm90aWZ5KCkgKi8KIAlpZiAodHRtLT5zZykgewotCQlub2RlLT5zZyA9IHR0bS0+c2c7Ci0JfSBlbHNlCisJCW5vZGUtPnNnICAgID0gdHRtLT5zZzsKKwkJbm9kZS0+cGFnZXMgPSBOVUxMOworCX0gZWxzZSB7CisJCW5vZGUtPnNnICAgID0gTlVMTDsKIAkJbm9kZS0+cGFnZXMgPSBudmJlLT50dG0uZG1hX2FkZHJlc3M7CisJfQorCW5vZGUtPnNpemUgPSAobWVtLT5udW1fcGFnZXMgPDwgUEFHRV9TSElGVCkgPj4gMTI7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3R0bS5jCmluZGV4IDE5ZTM3NTcuLmQ0NWQ1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYwpAQCAtMTcxLDYgKzE3MSw3IEBACiAJbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLUVOT01FTTsKKwogCW5vZGUtPnBhZ2Vfc2hpZnQgPSAxMjsKIAogCXN3aXRjaCAobnZfZGV2aWNlKGRybS0+ZGV2aWNlKS0+Y2FyZF90eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCmluZGV4IDRlMzg0YTIuLjJkY2NhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCkBAIC0xMDM1LDYgKzEwMzUsNyBAQAogbnY1MF9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKKwlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oYWRqdXN0ZWRfbW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTIxOTksMTYgKzIyMDAsNiBAQAogaW50CiBudjUwX2Rpc3BsYXlfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RhdGljIGNvbnN0IHUxNiBvY2xhc3NbXSA9IHsKLQkJTlZGMF9ESVNQX0NMQVNTLAotCQlOVkUwX0RJU1BfQ0xBU1MsCi0JCU5WRDBfRElTUF9DTEFTUywKLQkJTlZBM19ESVNQX0NMQVNTLAotCQlOVjk0X0RJU1BfQ0xBU1MsCi0JCU5WQTBfRElTUF9DTEFTUywKLQkJTlY4NF9ESVNQX0NMQVNTLAotCQlOVjUwX0RJU1BfQ0xBU1MsCi0JfTsKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG5vdXZlYXVfZGV2KGRldik7CiAJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShkZXYpOwogCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZkcm0tPnZiaW9zLmRjYjsKQEAgLTIyMjUsNiArMjIxNiw3IEBACiAJbm91dmVhdV9kaXNwbGF5KGRldiktPmR0b3IgPSBudjUwX2Rpc3BsYXlfZGVzdHJveTsKIAlub3V2ZWF1X2Rpc3BsYXkoZGV2KS0+aW5pdCA9IG52NTBfZGlzcGxheV9pbml0OwogCW5vdXZlYXVfZGlzcGxheShkZXYpLT5maW5pID0gbnY1MF9kaXNwbGF5X2Zpbmk7CisJZGlzcC0+Y29yZSA9IG5vdXZlYXVfZGlzcGxheShkZXYpLT5jb3JlOwogCiAJLyogc21hbGwgc2hhcmVkIG1lbW9yeSBhcmVhIHdlIHVzZSBmb3Igbm90aWZpZXJzIGFuZCBzZW1hcGhvcmVzICovCiAJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCA0MDk2LCAweDEwMDAsIFRUTV9QTF9GTEFHX1ZSQU0sCkBAIC0yMjQzLDE3ICsyMjM1LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCS8qIGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBzdXBwb3J0ZWQgZXZvIGRpc3BsYXkgY2xhc3MgKi8KLQlyZXQgPSAtRU5PREVWOwotCWZvciAoaSA9IDA7IHJldCAmJiBpIDwgQVJSQVlfU0laRShvY2xhc3MpOyBpKyspIHsKLQkJcmV0ID0gbm91dmVhdV9vYmplY3RfbmV3KG52X29iamVjdChkcm0pLCBOVkRSTV9ERVZJQ0UsCi0JCQkJCSAweGQxNTAwMDAwLCBvY2xhc3NbaV0sIE5VTEwsIDAsCi0JCQkJCSAmZGlzcC0+Y29yZSk7Ci0JfQotCi0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAkvKiBhbGxvY2F0ZSBtYXN0ZXIgZXZvIGNoYW5uZWwgKi8KIAlyZXQgPSBudjUwX2RtYWNfY3JlYXRlKGRpc3AtPmNvcmUsIE5WNTBfRElTUF9NQVNUX0NMQVNTLCAwLAogCQkJICAgICAgJihzdHJ1Y3QgbnY1MF9kaXNwbGF5X21hc3RfY2xhc3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKaW5kZXggMGZkMmViMS4uNDMxM2JiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKQEAgLTQxMSw3ICs0MTEsNyBAQAogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZvbWFwX2NydGMtPmJhc2U7CiAJRFJNX0VSUk9SKCIlczogZXJyb3JzOiAlMDh4XG4iLCBvbWFwX2NydGMtPm5hbWUsIGlycXN0YXR1cyk7CiAJLyogYXZvaWQgZ2V0dGluZyBpbiBhIGZsb29kLCB1bnJlZ2lzdGVyIHRoZSBpcnEgdW50aWwgbmV4dCB2YmxhbmsgKi8KLQlvbWFwX2lycV91bnJlZ2lzdGVyKGNydGMtPmRldiwgJm9tYXBfY3J0Yy0+ZXJyb3JfaXJxKTsKKwlfX29tYXBfaXJxX3VucmVnaXN0ZXIoY3J0Yy0+ZGV2LCAmb21hcF9jcnRjLT5lcnJvcl9pcnEpOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwX2NydGNfYXBwbHlfaXJxKHN0cnVjdCBvbWFwX2RybV9pcnEgKmlycSwgdWludDMyX3QgaXJxc3RhdHVzKQpAQCAtNDIxLDEzICs0MjEsMTMgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmb21hcF9jcnRjLT5iYXNlOwogCiAJaWYgKCFvbWFwX2NydGMtPmVycm9yX2lycS5yZWdpc3RlcmVkKQotCQlvbWFwX2lycV9yZWdpc3RlcihjcnRjLT5kZXYsICZvbWFwX2NydGMtPmVycm9yX2lycSk7CisJCV9fb21hcF9pcnFfcmVnaXN0ZXIoY3J0Yy0+ZGV2LCAmb21hcF9jcnRjLT5lcnJvcl9pcnEpOwogCiAJaWYgKCFkaXNwY19tZ3JfZ29fYnVzeShvbWFwX2NydGMtPmNoYW5uZWwpKSB7CiAJCXN0cnVjdCBvbWFwX2RybV9wcml2YXRlICpwcml2ID0KIAkJCQljcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCQlEQkcoIiVzOiBhcHBseSBkb25lIiwgb21hcF9jcnRjLT5uYW1lKTsKLQkJb21hcF9pcnFfdW5yZWdpc3RlcihjcnRjLT5kZXYsICZvbWFwX2NydGMtPmFwcGx5X2lycSk7CisJCV9fb21hcF9pcnFfdW5yZWdpc3RlcihjcnRjLT5kZXYsICZvbWFwX2NydGMtPmFwcGx5X2lycSk7CiAJCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZvbWFwX2NydGMtPmFwcGx5X3dvcmspOwogCX0KIH0KQEAgLTYyMyw2ICs2MjMsMTEgQEAKIAlkc3NfaW5zdGFsbF9tZ3Jfb3BzKCZtZ3Jfb3BzKTsKIH0KIAordm9pZCBvbWFwX2NydGNfcHJlX3VuaW5pdCh2b2lkKQoreworCWRzc191bmluc3RhbGxfbWdyX29wcygpOworfQorCiAvKiBpbml0aWFsaXplIGNydGMgKi8KIHN0cnVjdCBkcm1fY3J0YyAqb21hcF9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCBpZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kZWJ1Z2ZzLmMKaW5kZXggYzI3ZjU5ZC4uZDRjMDRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kZWJ1Z2ZzLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwotCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCBkZXYtPm1tX3ByaXZhdGUpOworCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCAmZGV2LT52bWFfb2Zmc2V0X21hbmFnZXItPnZtX2FkZHJfc3BhY2VfbW0pOwogfQogCiBzdGF0aWMgaW50IGZiX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICphcmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2RtbV90aWxlci5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kbW1fdGlsZXIuYwppbmRleCA3MDFjNGMxLi5mOTI2YjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2RtbV90aWxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZG1tX3RpbGVyLmMKQEAgLTk2OSwxMiArOTY5LDIxIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRtbV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDQtZG1tIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLG9tYXA1LWRtbSIsIH0sCisJe30sCit9OworI2VuZGlmCisKIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kbW1fZHJpdmVyID0gewogCS5wcm9iZSA9IG9tYXBfZG1tX3Byb2JlLAogCS5yZW1vdmUgPSBvbWFwX2RtbV9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lID0gRE1NX0RSSVZFUl9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZG1tX29mX21hdGNoKSwKICNpZmRlZiBDT05GSUdfUE0KIAkJLnBtID0gJm9tYXBfZG1tX3BtX29wcywKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZHJ2LmMKaW5kZXggZTdmYTNjZC4uYmYzOWZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Rydi5jCkBAIC04Niw2ICs4Niw0NyBAQAogCiAJcmV0dXJuIGZhbHNlOwogfQorc3RhdGljIHZvaWQgb21hcF9kaXNjb25uZWN0X2Rzc2RldnModm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBOVUxMOworCisJZm9yX2VhY2hfZHNzX2Rldihkc3NkZXYpCisJCWRzc2Rldi0+ZHJpdmVyLT5kaXNjb25uZWN0KGRzc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9jb25uZWN0X2Rzc2RldnModm9pZCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBOVUxMOworCWJvb2wgbm9fZGlzcGxheXMgPSB0cnVlOworCisJZm9yX2VhY2hfZHNzX2Rldihkc3NkZXYpIHsKKwkJciA9IGRzc2Rldi0+ZHJpdmVyLT5jb25uZWN0KGRzc2Rldik7CisJCWlmIChyID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCW9tYXBfZHNzX3B1dF9kZXZpY2UoZHNzZGV2KTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfSBlbHNlIGlmIChyKSB7CisJCQlkZXZfd2Fybihkc3NkZXYtPmRldiwgImNvdWxkIG5vdCBjb25uZWN0IGRpc3BsYXk6ICVzXG4iLAorCQkJCWRzc2Rldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlub19kaXNwbGF5cyA9IGZhbHNlOworCQl9CisJfQorCisJaWYgKG5vX2Rpc3BsYXlzKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCXJldHVybiAwOworCitjbGVhbnVwOgorCS8qCisJICogaWYgd2UgYXJlIGRlZmVycmluZyBwcm9iZSwgd2UgZGlzY29ubmVjdCB0aGUgZGV2aWNlcyB3ZSBwcmV2aW91c2x5CisJICogY29ubmVjdGVkCisJICovCisJb21hcF9kaXNjb25uZWN0X2Rzc2RldnMoKTsKKworCXJldHVybiByOworfQogCiBzdGF0aWMgaW50IG9tYXBfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC05NSw5ICsxMzYsNiBAQAogCWludCBudW1fbWdycyA9IGRzc19mZWF0X2dldF9udW1fbWdycygpOwogCWludCBudW1fY3J0Y3M7CiAJaW50IGksIGlkID0gMDsKLQlpbnQgcjsKLQotCW9tYXBfY3J0Y19wcmVfaW5pdCgpOwogCiAJZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKIApAQCAtMTE5LDI2ICsxNTcsOCBAQAogCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsOwogCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKIAotCQlpZiAoIWRzc2Rldi0+ZHJpdmVyKSB7Ci0JCQlkZXZfd2FybihkZXYtPmRldiwgIiVzIGhhcyBubyBkcml2ZXIuLiBza2lwcGluZyBpdFxuIiwKLQkJCQkJZHNzZGV2LT5uYW1lKTsKKwkJaWYgKCFvbWFwZHNzX2RldmljZV9pc19jb25uZWN0ZWQoZHNzZGV2KSkKIAkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCEoZHNzZGV2LT5kcml2ZXItPmdldF90aW1pbmdzIHx8Ci0JCQkJCWRzc2Rldi0+ZHJpdmVyLT5yZWFkX2VkaWQpKSB7Ci0JCQlkZXZfd2FybihkZXYtPmRldiwgIiVzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0ICIKLQkJCQkiZ2V0X3RpbWluZ3Mgb3IgcmVhZF9lZGlkLi4gc2tpcHBpbmcgaXQhXG4iLAotCQkJCWRzc2Rldi0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXIgPSBkc3NkZXYtPmRyaXZlci0+Y29ubmVjdChkc3NkZXYpOwotCQlpZiAocikgewotCQkJZGV2X2VycihkZXYtPmRldiwgImNvdWxkIG5vdCBjb25uZWN0IGRpc3BsYXk6ICVzXG4iLAotCQkJCQlkc3NkZXYtPm5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KIAogCQllbmNvZGVyID0gb21hcF9lbmNvZGVyX2luaXQoZGV2LCBkc3NkZXYpOwogCkBAIC00OTcsMTYgKzUxNywxNiBAQAogCURCRygidW5sb2FkOiBkZXY9JXAiLCBkZXYpOwogCiAJZHJtX2ttc19oZWxwZXJfcG9sbF9maW5pKGRldik7Ci0JZHJtX3ZibGFua19jbGVhbnVwKGRldik7Ci0Jb21hcF9kcm1faXJxX3VuaW5zdGFsbChkZXYpOwogCiAJb21hcF9mYmRldl9mcmVlKGRldik7CiAJb21hcF9tb2Rlc2V0X2ZyZWUoZGV2KTsKIAlvbWFwX2dlbV9kZWluaXQoZGV2KTsKIAotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53cSk7CiAJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d3EpOwogCisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CisJb21hcF9kcm1faXJxX3VuaW5zdGFsbChkZXYpOworCiAJa2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSk7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CiAKQEAgLTY1NSw5ICs2NzUsMTkgQEAKIAogc3RhdGljIGludCBwZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKIHsKKwlpbnQgcjsKKwogCWlmIChvbWFwZHNzX2lzX2luaXRpYWxpemVkKCkgPT0gZmFsc2UpCiAJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCisJb21hcF9jcnRjX3ByZV9pbml0KCk7CisKKwlyID0gb21hcF9jb25uZWN0X2Rzc2RldnMoKTsKKwlpZiAocikgeworCQlvbWFwX2NydGNfcHJlX3VuaW5pdCgpOworCQlyZXR1cm4gcjsKKwl9CisKIAlEQkcoIiVzIiwgZGV2aWNlLT5uYW1lKTsKIAlyZXR1cm4gZHJtX3BsYXRmb3JtX2luaXQoJm9tYXBfZHJtX2RyaXZlciwgZGV2aWNlKTsKIH0KQEAgLTY2NSw5ICs2OTUsMTEgQEAKIHN0YXRpYyBpbnQgcGRldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQogewogCURCRygiIik7Ci0JZHJtX3BsYXRmb3JtX2V4aXQoJm9tYXBfZHJtX2RyaXZlciwgZGV2aWNlKTsKIAotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwX2RtbV9kcml2ZXIpOworCW9tYXBfZGlzY29ubmVjdF9kc3NkZXZzKCk7CisJb21hcF9jcnRjX3ByZV91bmluaXQoKTsKKworCWRybV9wdXRfZGV2KHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuaAppbmRleCAwNzg0NzY5Li40MjhiMjk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Rydi5oCkBAIC0xNDEsMTAgKzE0MSwxMiBAQAogCiBpbnQgb21hcF9pcnFfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Y19pZCk7CiB2b2lkIG9tYXBfaXJxX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjX2lkKTsKLWlycXJldHVybl90IG9tYXBfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2lycXJldHVybl90IG9tYXBfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKTsKIHZvaWQgb21hcF9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBvbWFwX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgb21hcF9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBfX29tYXBfaXJxX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBvbWFwX2RybV9pcnEgKmlycSk7Cit2b2lkIF9fb21hcF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgb21hcF9kcm1faXJxICppcnEpOwogdm9pZCBvbWFwX2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgb21hcF9kcm1faXJxICppcnEpOwogdm9pZCBvbWFwX2lycV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBvbWFwX2RybV9pcnEgKmlycSk7CiBpbnQgb21hcF9kcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTE1OCw2ICsxNjAsNyBAQAogaW50IG9tYXBfY3J0Y19hcHBseShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCXN0cnVjdCBvbWFwX2RybV9hcHBseSAqYXBwbHkpOwogdm9pZCBvbWFwX2NydGNfcHJlX2luaXQodm9pZCk7Cit2b2lkIG9tYXBfY3J0Y19wcmVfdW5pbml0KHZvaWQpOwogc3RydWN0IGRybV9jcnRjICpvbWFwX2NydGNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgaW50IGlkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9lbmNvZGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2VuY29kZXIuYwppbmRleCA2YTEyZTg5Li41MjkwYTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2VuY29kZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2VuY29kZXIuYwpAQCAtNTEsNiArNTEsOSBAQAogc3RhdGljIHZvaWQgb21hcF9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBvbWFwX2VuY29kZXIgKm9tYXBfZW5jb2RlciA9IHRvX29tYXBfZW5jb2RlcihlbmNvZGVyKTsKKworCW9tYXBfZW5jb2Rlcl9zZXRfZW5hYmxlZChlbmNvZGVyLCBmYWxzZSk7CisKIAlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOwogCWtmcmVlKG9tYXBfZW5jb2Rlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2ZiLmMKaW5kZXggZjJiOGYwNi4uZjQ2NmM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZmIuYwpAQCAtMTIzLDEyICsxMjMsMTYgQEAKIHsKIAlpbnQgaTsKIAorCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGZiLT5kZXYpOworCiAJZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrKSB7CiAJCW9tYXBfZnJhbWVidWZmZXJfZmx1c2goZmIsIGNsaXBzW2ldLngxLCBjbGlwc1tpXS55MSwKIAkJCQkJY2xpcHNbaV0ueDIgLSBjbGlwc1tpXS54MSwKIAkJCQkJY2xpcHNbaV0ueTIgLSBjbGlwc1tpXS55MSk7CiAJfQogCisJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChmYi0+ZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9pcnEuYwppbmRleCBjYjg1ODYwLi5mMDM1ZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfaXJxLmMKQEAgLTQ1LDEyICs0NSwxMSBAQAogCWRpc3BjX3JlYWRfaXJxZW5hYmxlKCk7ICAgICAgICAvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KIH0KIAotdm9pZCBvbWFwX2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgb21hcF9kcm1faXJxICppcnEpCit2b2lkIF9fb21hcF9pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG9tYXBfZHJtX2lycSAqaXJxKQogewogCXN0cnVjdCBvbWFwX2RybV9wcml2YXRlICpwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGlzcGNfcnVudGltZV9nZXQoKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIVdBUk5fT04oaXJxLT5yZWdpc3RlcmVkKSkgewpAQCAtNjAsMTQgKzU5LDIxIEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgb21hcF9pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG9tYXBfZHJtX2lycSAqaXJxKQoreworCWRpc3BjX3J1bnRpbWVfZ2V0KCk7CisKKwlfX29tYXBfaXJxX3JlZ2lzdGVyKGRldiwgaXJxKTsKKwogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiB9CiAKLXZvaWQgb21hcF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgb21hcF9kcm1faXJxICppcnEpCit2b2lkIF9fb21hcF9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgb21hcF9kcm1faXJxICppcnEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRpc3BjX3J1bnRpbWVfZ2V0KCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFXQVJOX09OKCFpcnEtPnJlZ2lzdGVyZWQpKSB7CkBAIC03Nyw2ICs4MywxNCBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG9tYXBfaXJxX3VucmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG9tYXBfZHJtX2lycSAqaXJxKQoreworCWRpc3BjX3J1bnRpbWVfZ2V0KCk7CisKKwlfX29tYXBfaXJxX3VucmVnaXN0ZXIoZGV2LCBpcnEpOworCiAJZGlzcGNfcnVudGltZV9wdXQoKTsKIH0KIApAQCAtMTczLDcgKzE4Nyw3IEBACiAJZGlzcGNfcnVudGltZV9wdXQoKTsKIH0KIAotaXJxcmV0dXJuX3Qgb21hcF9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitpcnFyZXR1cm5fdCBvbWFwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlzdHJ1Y3Qgb21hcF9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMDgsNyArMzIyLDcgQEAKIAlpZiAoZGV2LT5udW1fY3J0Y3MpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIAkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2NydGNzOyBpKyspIHsKLQkJCURSTV9XQUtFVVAoJmRldi0+dmJsYW5rW2ldLnF1ZXVlKTsKKwkJCXdha2VfdXAoJmRldi0+dmJsYW5rW2ldLnF1ZXVlKTsKIAkJCWRldi0+dmJsYW5rW2ldLmVuYWJsZWQgPSBmYWxzZTsKIAkJCWRldi0+dmJsYW5rW2ldLmxhc3QgPQogCQkJCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZjEzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKK2NvbmZpZyBEUk1fUEFORUwKKwlib29sCisJZGVwZW5kcyBvbiBEUk0KKwloZWxwCisJICBQYW5lbCByZWdpc3RyYXRpb24gYW5kIGxvb2t1cCBmcmFtZXdvcmsuCisKK21lbnUgIkRpc3BsYXkgUGFuZWxzIgorCWRlcGVuZHMgb24gRFJNX1BBTkVMCisKK2NvbmZpZyBEUk1fUEFORUxfU0lNUExFCisJdHJpc3RhdGUgInN1cHBvcnQgZm9yIHNpbXBsZSBwYW5lbHMiCisJZGVwZW5kcyBvbiBPRgorCWhlbHAKKwkgIERSTSBwYW5lbCBkcml2ZXIgZm9yIGR1bWIgcGFuZWxzIHRoYXQgbmVlZCBhdCBtb3N0IGEgcmVndWxhdG9yIGFuZAorCSAgYSBHUElPIHRvIGJlIHBvd2VyZWQgdXAuIE9wdGlvbmFsbHkgYSBiYWNrbGlnaHQgY2FuIGJlIGF0dGFjaGVkIHNvCisJICB0aGF0IGl0IGNhbiBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgcGFuZWwgZ29lcyBpbnRvIGEKKwkgIGxvdyBwb3dlciBzdGF0ZS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3BhbmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWRmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0RSTV9QQU5FTF9TSU1QTEUpICs9IHBhbmVsLXNpbXBsZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2ltcGxlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2ltcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkNTJjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zaW1wbGUuYwpAQCAtMCwwICsxLDU0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgTlZJRElBIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgorI2luY2x1ZGUgPGRybS9kcm1fbWlwaV9kc2kuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+CisKK3N0cnVjdCBwYW5lbF9kZXNjIHsKKwljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZXM7CisJdW5zaWduZWQgaW50IG51bV9tb2RlczsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCB3aWR0aDsKKwkJdW5zaWduZWQgaW50IGhlaWdodDsKKwl9IHNpemU7Cit9OworCisvKiBUT0RPOiBjb252ZXJ0IHRvIGdwaW9kXyooKSBBUEkgb25jZSBpdCdzIGJlZW4gbWVyZ2VkICovCisjZGVmaW5lIEdQSU9fQUNUSVZFX0xPVwkoMSA8PCAwKQorCitzdHJ1Y3QgcGFuZWxfc2ltcGxlIHsKKwlzdHJ1Y3QgZHJtX3BhbmVsIGJhc2U7CisJYm9vbCBlbmFibGVkOworCisJY29uc3Qgc3RydWN0IHBhbmVsX2Rlc2MgKmRlc2M7CisKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0OworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRkYzsKKworCXVuc2lnbmVkIGxvbmcgZW5hYmxlX2dwaW9fZmxhZ3M7CisJaW50IGVuYWJsZV9ncGlvOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFuZWxfc2ltcGxlICp0b19wYW5lbF9zaW1wbGUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihwYW5lbCwgc3RydWN0IHBhbmVsX3NpbXBsZSwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfc2ltcGxlX2dldF9maXhlZF9tb2RlcyhzdHJ1Y3QgcGFuZWxfc2ltcGxlICpwYW5lbCkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcGFuZWwtPmJhc2UuY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBwYW5lbC0+YmFzZS5kcm07CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJdW5zaWduZWQgaW50IGksIG51bSA9IDA7CisKKwlpZiAoIXBhbmVsLT5kZXNjKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwYW5lbC0+ZGVzYy0+bnVtX21vZGVzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm0gPSAmcGFuZWwtPmRlc2MtPm1vZGVzW2ldOworCisJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZHJtLCBtKTsKKwkJaWYgKCFtb2RlKSB7CisJCQlkZXZfZXJyKGRybS0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBtb2RlICV1eCV1QCV1XG4iLAorCQkJCW0tPmhkaXNwbGF5LCBtLT52ZGlzcGxheSwgbS0+dnJlZnJlc2gpOworCQkJY29udGludWU7CisJCX0KKworCQlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKKworCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisJCW51bSsrOworCX0KKworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tID0gcGFuZWwtPmRlc2MtPnNpemUud2lkdGg7CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVpZ2h0X21tID0gcGFuZWwtPmRlc2MtPnNpemUuaGVpZ2h0OworCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludCBwYW5lbF9zaW1wbGVfZGlzYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3QgcGFuZWxfc2ltcGxlICpwID0gdG9fcGFuZWxfc2ltcGxlKHBhbmVsKTsKKworCWlmICghcC0+ZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocC0+YmFja2xpZ2h0KSB7CisJCXAtPmJhY2tsaWdodC0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKHAtPmJhY2tsaWdodCk7CisJfQorCisJaWYgKGdwaW9faXNfdmFsaWQocC0+ZW5hYmxlX2dwaW8pKSB7CisJCWlmIChwLT5lbmFibGVfZ3Bpb19mbGFncyAmIEdQSU9fQUNUSVZFX0xPVykKKwkJCWdwaW9fc2V0X3ZhbHVlKHAtPmVuYWJsZV9ncGlvLCAxKTsKKwkJZWxzZQorCQkJZ3Bpb19zZXRfdmFsdWUocC0+ZW5hYmxlX2dwaW8sIDApOworCX0KKworCXJlZ3VsYXRvcl9kaXNhYmxlKHAtPnN1cHBseSk7CisJcC0+ZW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfc2ltcGxlX2VuYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3QgcGFuZWxfc2ltcGxlICpwID0gdG9fcGFuZWxfc2ltcGxlKHBhbmVsKTsKKwlpbnQgZXJyOworCisJaWYgKHAtPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwLT5zdXBwbHkpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIocGFuZWwtPmRldiwgImZhaWxlZCB0byBlbmFibGUgc3VwcGx5OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwLT5lbmFibGVfZ3BpbykpIHsKKwkJaWYgKHAtPmVuYWJsZV9ncGlvX2ZsYWdzICYgR1BJT19BQ1RJVkVfTE9XKQorCQkJZ3Bpb19zZXRfdmFsdWUocC0+ZW5hYmxlX2dwaW8sIDApOworCQllbHNlCisJCQlncGlvX3NldF92YWx1ZShwLT5lbmFibGVfZ3BpbywgMSk7CisJfQorCisJaWYgKHAtPmJhY2tsaWdodCkgeworCQlwLT5iYWNrbGlnaHQtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMocC0+YmFja2xpZ2h0KTsKKwl9CisKKwlwLT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbmVsX3NpbXBsZV9nZXRfbW9kZXMoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJc3RydWN0IHBhbmVsX3NpbXBsZSAqcCA9IHRvX3BhbmVsX3NpbXBsZShwYW5lbCk7CisJaW50IG51bSA9IDA7CisKKwkvKiBwcm9iZSBFRElEIGlmIGEgRERDIGJ1cyBpcyBhdmFpbGFibGUgKi8KKwlpZiAocC0+ZGRjKSB7CisJCXN0cnVjdCBlZGlkICplZGlkID0gZHJtX2dldF9lZGlkKHBhbmVsLT5jb25uZWN0b3IsIHAtPmRkYyk7CisJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShwYW5lbC0+Y29ubmVjdG9yLCBlZGlkKTsKKwkJaWYgKGVkaWQpIHsKKwkJCW51bSArPSBkcm1fYWRkX2VkaWRfbW9kZXMocGFuZWwtPmNvbm5lY3RvciwgZWRpZCk7CisJCQlrZnJlZShlZGlkKTsKKwkJfQorCX0KKworCS8qIGFkZCBoYXJkLWNvZGVkIHBhbmVsIG1vZGVzICovCisJbnVtICs9IHBhbmVsX3NpbXBsZV9nZXRfZml4ZWRfbW9kZXMocCk7CisKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wYW5lbF9mdW5jcyBwYW5lbF9zaW1wbGVfZnVuY3MgPSB7CisJLmRpc2FibGUgPSBwYW5lbF9zaW1wbGVfZGlzYWJsZSwKKwkuZW5hYmxlID0gcGFuZWxfc2ltcGxlX2VuYWJsZSwKKwkuZ2V0X21vZGVzID0gcGFuZWxfc2ltcGxlX2dldF9tb2RlcywKK307CisKK3N0YXRpYyBpbnQgcGFuZWxfc2ltcGxlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHBhbmVsX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpiYWNrbGlnaHQsICpkZGM7CisJc3RydWN0IHBhbmVsX3NpbXBsZSAqcGFuZWw7CisJZW51bSBvZl9ncGlvX2ZsYWdzIGZsYWdzOworCWludCBlcnI7CisKKwlwYW5lbCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGFuZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhbmVsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhbmVsLT5lbmFibGVkID0gZmFsc2U7CisJcGFuZWwtPmRlc2MgPSBkZXNjOworCisJcGFuZWwtPnN1cHBseSA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJwb3dlciIpOworCWlmIChJU19FUlIocGFuZWwtPnN1cHBseSkpCisJCXJldHVybiBQVFJfRVJSKHBhbmVsLT5zdXBwbHkpOworCisJcGFuZWwtPmVuYWJsZV9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MoZGV2LT5vZl9ub2RlLAorCQkJCQkJICAgICAiZW5hYmxlLWdwaW9zIiwgMCwKKwkJCQkJCSAgICAgJmZsYWdzKTsKKwlpZiAoZ3Bpb19pc192YWxpZChwYW5lbC0+ZW5hYmxlX2dwaW8pKSB7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCQlpZiAoZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCisJCQlwYW5lbC0+ZW5hYmxlX2dwaW9fZmxhZ3MgfD0gR1BJT19BQ1RJVkVfTE9XOworCisJCWVyciA9IGdwaW9fcmVxdWVzdChwYW5lbC0+ZW5hYmxlX2dwaW8sICJlbmFibGUiKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyMldTogJWRcbiIsCisJCQkJcGFuZWwtPmVuYWJsZV9ncGlvLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXZhbHVlID0gKHBhbmVsLT5lbmFibGVfZ3Bpb19mbGFncyAmIEdQSU9fQUNUSVZFX0xPVykgIT0gMDsKKworCQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGFuZWwtPmVuYWJsZV9ncGlvLCB2YWx1ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXR1cCBHUElPJXU6ICVkXG4iLAorCQkJCXBhbmVsLT5lbmFibGVfZ3BpbywgZXJyKTsKKwkJCWdvdG8gZnJlZV9ncGlvOworCQl9CisJfQorCisJYmFja2xpZ2h0ID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsICJiYWNrbGlnaHQiLCAwKTsKKwlpZiAoYmFja2xpZ2h0KSB7CisJCXBhbmVsLT5iYWNrbGlnaHQgPSBvZl9maW5kX2JhY2tsaWdodF9ieV9ub2RlKGJhY2tsaWdodCk7CisJCW9mX25vZGVfcHV0KGJhY2tsaWdodCk7CisKKwkJaWYgKCFwYW5lbC0+YmFja2xpZ2h0KSB7CisJCQllcnIgPSAtRVBST0JFX0RFRkVSOworCQkJZ290byBmcmVlX2dwaW87CisJCX0KKwl9CisKKwlkZGMgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImRkYy1pMmMtYnVzIiwgMCk7CisJaWYgKGRkYykgeworCQlwYW5lbC0+ZGRjID0gb2ZfZmluZF9pMmNfYWRhcHRlcl9ieV9ub2RlKGRkYyk7CisJCW9mX25vZGVfcHV0KGRkYyk7CisKKwkJaWYgKCFwYW5lbC0+ZGRjKSB7CisJCQllcnIgPSAtRVBST0JFX0RFRkVSOworCQkJZ290byBmcmVlX2JhY2tsaWdodDsKKwkJfQorCX0KKworCWRybV9wYW5lbF9pbml0KCZwYW5lbC0+YmFzZSk7CisJcGFuZWwtPmJhc2UuZGV2ID0gZGV2OworCXBhbmVsLT5iYXNlLmZ1bmNzID0gJnBhbmVsX3NpbXBsZV9mdW5jczsKKworCWVyciA9IGRybV9wYW5lbF9hZGQoJnBhbmVsLT5iYXNlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmcmVlX2RkYzsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBhbmVsKTsKKworCXJldHVybiAwOworCitmcmVlX2RkYzoKKwlpZiAocGFuZWwtPmRkYykKKwkJcHV0X2RldmljZSgmcGFuZWwtPmRkYy0+ZGV2KTsKK2ZyZWVfYmFja2xpZ2h0OgorCWlmIChwYW5lbC0+YmFja2xpZ2h0KQorCQlwdXRfZGV2aWNlKCZwYW5lbC0+YmFja2xpZ2h0LT5kZXYpOworZnJlZV9ncGlvOgorCWlmIChncGlvX2lzX3ZhbGlkKHBhbmVsLT5lbmFibGVfZ3BpbykpCisJCWdwaW9fZnJlZShwYW5lbC0+ZW5hYmxlX2dwaW8pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwYW5lbF9zaW1wbGVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFuZWxfc2ltcGxlICpwYW5lbCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZHJtX3BhbmVsX2RldGFjaCgmcGFuZWwtPmJhc2UpOworCWRybV9wYW5lbF9yZW1vdmUoJnBhbmVsLT5iYXNlKTsKKworCXBhbmVsX3NpbXBsZV9kaXNhYmxlKCZwYW5lbC0+YmFzZSk7CisKKwlpZiAocGFuZWwtPmRkYykKKwkJcHV0X2RldmljZSgmcGFuZWwtPmRkYy0+ZGV2KTsKKworCWlmIChwYW5lbC0+YmFja2xpZ2h0KQorCQlwdXRfZGV2aWNlKCZwYW5lbC0+YmFja2xpZ2h0LT5kZXYpOworCisJaWYgKGdwaW9faXNfdmFsaWQocGFuZWwtPmVuYWJsZV9ncGlvKSkKKwkJZ3Bpb19mcmVlKHBhbmVsLT5lbmFibGVfZ3Bpbyk7CisKKwlyZWd1bGF0b3JfZGlzYWJsZShwYW5lbC0+c3VwcGx5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgYXVvX2IxMDFhdzAzX21vZGUgPSB7CisJLmNsb2NrID0gNTE0NTAsCisJLmhkaXNwbGF5ID0gMTAyNCwKKwkuaHN5bmNfc3RhcnQgPSAxMDI0ICsgMTU2LAorCS5oc3luY19lbmQgPSAxMDI0ICsgMTU2ICsgOCwKKwkuaHRvdGFsID0gMTAyNCArIDE1NiArIDggKyAxNTYsCisJLnZkaXNwbGF5ID0gNjAwLAorCS52c3luY19zdGFydCA9IDYwMCArIDE2LAorCS52c3luY19lbmQgPSA2MDAgKyAxNiArIDYsCisJLnZ0b3RhbCA9IDYwMCArIDE2ICsgNiArIDE2LAorCS52cmVmcmVzaCA9IDYwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYW5lbF9kZXNjIGF1b19iMTAxYXcwMyA9IHsKKwkubW9kZXMgPSAmYXVvX2IxMDFhdzAzX21vZGUsCisJLm51bV9tb2RlcyA9IDEsCisJLnNpemUgPSB7CisJCS53aWR0aCA9IDIyMywKKwkJLmhlaWdodCA9IDEyNSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGNodW5naHdhX2NsYWExMDF3YTAxYV9tb2RlID0geworCS5jbG9jayA9IDcyMDcwLAorCS5oZGlzcGxheSA9IDEzNjYsCisJLmhzeW5jX3N0YXJ0ID0gMTM2NiArIDU4LAorCS5oc3luY19lbmQgPSAxMzY2ICsgNTggKyA1OCwKKwkuaHRvdGFsID0gMTM2NiArIDU4ICsgNTggKyA1OCwKKwkudmRpc3BsYXkgPSA3NjgsCisJLnZzeW5jX3N0YXJ0ID0gNzY4ICsgNCwKKwkudnN5bmNfZW5kID0gNzY4ICsgNCArIDQsCisJLnZ0b3RhbCA9IDc2OCArIDQgKyA0ICsgNCwKKwkudnJlZnJlc2ggPSA2MCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFuZWxfZGVzYyBjaHVuZ2h3YV9jbGFhMTAxd2EwMWEgPSB7CisJLm1vZGVzID0gJmNodW5naHdhX2NsYWExMDF3YTAxYV9tb2RlLAorCS5udW1fbW9kZXMgPSAxLAorCS5zaXplID0geworCQkud2lkdGggPSAyMjAsCisJCS5oZWlnaHQgPSAxMjAsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBjaHVuZ2h3YV9jbGFhMTAxd2IwMV9tb2RlID0geworCS5jbG9jayA9IDY5MzAwLAorCS5oZGlzcGxheSA9IDEzNjYsCisJLmhzeW5jX3N0YXJ0ID0gMTM2NiArIDQ4LAorCS5oc3luY19lbmQgPSAxMzY2ICsgNDggKyAzMiwKKwkuaHRvdGFsID0gMTM2NiArIDQ4ICsgMzIgKyAyMCwKKwkudmRpc3BsYXkgPSA3NjgsCisJLnZzeW5jX3N0YXJ0ID0gNzY4ICsgMTYsCisJLnZzeW5jX2VuZCA9IDc2OCArIDE2ICsgOCwKKwkudnRvdGFsID0gNzY4ICsgMTYgKyA4ICsgMTYsCisJLnZyZWZyZXNoID0gNjAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhbmVsX2Rlc2MgY2h1bmdod2FfY2xhYTEwMXdiMDEgPSB7CisJLm1vZGVzID0gJmNodW5naHdhX2NsYWExMDF3YjAxX21vZGUsCisJLm51bV9tb2RlcyA9IDEsCisJLnNpemUgPSB7CisJCS53aWR0aCA9IDIyMywKKwkJLmhlaWdodCA9IDEyNSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIHNhbXN1bmdfbHRuMTAxbnQwNV9tb2RlID0geworCS5jbG9jayA9IDU0MDMwLAorCS5oZGlzcGxheSA9IDEwMjQsCisJLmhzeW5jX3N0YXJ0ID0gMTAyNCArIDI0LAorCS5oc3luY19lbmQgPSAxMDI0ICsgMjQgKyAxMzYsCisJLmh0b3RhbCA9IDEwMjQgKyAyNCArIDEzNiArIDE2MCwKKwkudmRpc3BsYXkgPSA2MDAsCisJLnZzeW5jX3N0YXJ0ID0gNjAwICsgMywKKwkudnN5bmNfZW5kID0gNjAwICsgMyArIDYsCisJLnZ0b3RhbCA9IDYwMCArIDMgKyA2ICsgNjEsCisJLnZyZWZyZXNoID0gNjAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhbmVsX2Rlc2Mgc2Ftc3VuZ19sdG4xMDFudDA1ID0geworCS5tb2RlcyA9ICZzYW1zdW5nX2x0bjEwMW50MDVfbW9kZSwKKwkubnVtX21vZGVzID0gMSwKKwkuc2l6ZSA9IHsKKwkJLndpZHRoID0gMTAyNCwKKwkJLmhlaWdodCA9IDYwMCwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGxhdGZvcm1fb2ZfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImF1byxiMTAxYXcwMyIsCisJCS5kYXRhID0gJmF1b19iMTAxYXcwMywKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gImNodW5naHdhLGNsYWExMDF3YTAxYSIsCisJCS5kYXRhID0gJmNodW5naHdhX2NsYWExMDF3YTAxYQorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAiY2h1bmdod2EsY2xhYTEwMXdiMDEiLAorCQkuZGF0YSA9ICZjaHVuZ2h3YV9jbGFhMTAxd2IwMQorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxsdG4xMDFudDA1IiwKKwkJLmRhdGEgPSAmc2Ftc3VuZ19sdG4xMDFudDA1LAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2ltcGxlLXBhbmVsIiwKKwl9LCB7CisJCS8qIHNlbnRpbmVsICovCisJfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBsYXRmb3JtX29mX21hdGNoKTsKKworc3RhdGljIGludCBwYW5lbF9zaW1wbGVfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKKworCWlkID0gb2ZfbWF0Y2hfbm9kZShwbGF0Zm9ybV9vZl9tYXRjaCwgcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICghaWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBhbmVsX3NpbXBsZV9wcm9iZSgmcGRldi0+ZGV2LCBpZC0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfc2ltcGxlX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBwYW5lbF9zaW1wbGVfcmVtb3ZlKCZwZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYW5lbF9zaW1wbGVfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBhbmVsLXNpbXBsZSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBwbGF0Zm9ybV9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHBhbmVsX3NpbXBsZV9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlID0gcGFuZWxfc2ltcGxlX3BsYXRmb3JtX3JlbW92ZSwKK307CisKK3N0cnVjdCBwYW5lbF9kZXNjX2RzaSB7CisJc3RydWN0IHBhbmVsX2Rlc2MgZGVzYzsKKworCWVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgbGFuZXM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgcGFuYXNvbmljX3Z2eDEwZjAwNGIwMF9tb2RlID0geworCS5jbG9jayA9IDE1NzIwMCwKKwkuaGRpc3BsYXkgPSAxOTIwLAorCS5oc3luY19zdGFydCA9IDE5MjAgKyAxNTQsCisJLmhzeW5jX2VuZCA9IDE5MjAgKyAxNTQgKyAxNiwKKwkuaHRvdGFsID0gMTkyMCArIDE1NCArIDE2ICsgMzIsCisJLnZkaXNwbGF5ID0gMTIwMCwKKwkudnN5bmNfc3RhcnQgPSAxMjAwICsgMTcsCisJLnZzeW5jX2VuZCA9IDEyMDAgKyAxNyArIDIsCisJLnZ0b3RhbCA9IDEyMDAgKyAxNyArIDIgKyAxNiwKKwkudnJlZnJlc2ggPSA2MCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFuZWxfZGVzY19kc2kgcGFuYXNvbmljX3Z2eDEwZjAwNGIwMCA9IHsKKwkuZGVzYyA9IHsKKwkJLm1vZGVzID0gJnBhbmFzb25pY192dngxMGYwMDRiMDBfbW9kZSwKKwkJLm51bV9tb2RlcyA9IDEsCisJCS5zaXplID0geworCQkJLndpZHRoID0gMjE3LAorCQkJLmhlaWdodCA9IDEzNiwKKwkJfSwKKwl9LAorCS5mb3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4LAorCS5sYW5lcyA9IDQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkc2lfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInBhbmFzb25pYyx2dngxMGYwMDRiMDAiLAorCQkuZGF0YSA9ICZwYW5hc29uaWNfdnZ4MTBmMDA0YjAwCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBkc2lfb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHBhbmVsX3NpbXBsZV9kc2lfcHJvYmUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQoreworCWNvbnN0IHN0cnVjdCBwYW5lbF9kZXNjX2RzaSAqZGVzYzsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKKwlpbnQgZXJyOworCisJaWQgPSBvZl9tYXRjaF9ub2RlKGRzaV9vZl9tYXRjaCwgZHNpLT5kZXYub2Zfbm9kZSk7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXNjID0gaWQtPmRhdGE7CisKKwllcnIgPSBwYW5lbF9zaW1wbGVfcHJvYmUoJmRzaS0+ZGV2LCAmZGVzYy0+ZGVzYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlkc2ktPmZvcm1hdCA9IGRlc2MtPmZvcm1hdDsKKwlkc2ktPmxhbmVzID0gZGVzYy0+bGFuZXM7CisKKwlyZXR1cm4gbWlwaV9kc2lfYXR0YWNoKGRzaSk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfc2ltcGxlX2RzaV9yZW1vdmUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQoreworCWludCBlcnI7CisKKwllcnIgPSBtaXBpX2RzaV9kZXRhY2goZHNpKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2VycigmZHNpLT5kZXYsICJmYWlsZWQgdG8gZGV0YWNoIGZyb20gRFNJIGhvc3Q6ICVkXG4iLCBlcnIpOworCisJcmV0dXJuIHBhbmVsX3NpbXBsZV9yZW1vdmUoJmRzaS0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgcGFuZWxfc2ltcGxlX2RzaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicGFuZWwtc2ltcGxlLWRzaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBkc2lfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBwYW5lbF9zaW1wbGVfZHNpX3Byb2JlLAorCS5yZW1vdmUgPSBwYW5lbF9zaW1wbGVfZHNpX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBhbmVsX3NpbXBsZV9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFuZWxfc2ltcGxlX3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfRFJNX01JUElfRFNJKSkgeworCQllcnIgPSBtaXBpX2RzaV9kcml2ZXJfcmVnaXN0ZXIoJnBhbmVsX3NpbXBsZV9kc2lfZHJpdmVyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQocGFuZWxfc2ltcGxlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGFuZWxfc2ltcGxlX2V4aXQodm9pZCkKK3sKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfRFJNX01JUElfRFNJKSkKKwkJbWlwaV9kc2lfZHJpdmVyX3VucmVnaXN0ZXIoJnBhbmVsX3NpbXBsZV9kc2lfZHJpdmVyKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYW5lbF9zaW1wbGVfcGxhdGZvcm1fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBhbmVsX3NpbXBsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRFJNIERyaXZlciBmb3IgU2ltcGxlIFBhbmVscyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2Rpc3BsYXkuYwppbmRleCBkNzBhYWZiLi43OThiZGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZGlzcGxheS5jCkBAIC0zOTksMTAgKzM5OSwxNCBAQAogCXN0cnVjdCBxeGxfYm8gKnFvYmo7CiAJaW50IGluYyA9IDE7CiAKKwlkcm1fbW9kZXNldF9sb2NrX2FsbChmYi0+ZGV2KTsKKwogCXFvYmogPSBnZW1fdG9fcXhsX2JvKHF4bF9mYi0+b2JqKTsKIAkvKiBpZiB3ZSBhcmVuJ3QgcHJpbWFyeSBzdXJmYWNlIGlnbm9yZSB0aGlzICovCi0JaWYgKCFxb2JqLT5pc19wcmltYXJ5KQorCWlmICghcW9iai0+aXNfcHJpbWFyeSkgeworCQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGZiLT5kZXYpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoIW51bV9jbGlwcykgewogCQludW1fY2xpcHMgPSAxOwpAQCAtNDE3LDYgKzQyMSw5IEBACiAKIAlxeGxfZHJhd19kaXJ0eV9mYihxZGV2LCBxeGxfZmIsIHFvYmosIGZsYWdzLCBjb2xvciwKIAkJCSAgY2xpcHMsIG51bV9jbGlwcywgaW5jKTsKKworCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZmItPmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kcnYuaAppbmRleCA3YmRhMzJmLi4zNmVkNDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kcnYuaApAQCAtNTM0LDcgKzUzNCw3IEBACiAKIC8qIHF4bF9pcnEuYyAqLwogaW50IHF4bF9pcnFfaW5pdChzdHJ1Y3QgcXhsX2RldmljZSAqcWRldik7Ci1pcnFyZXR1cm5fdCBxeGxfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2lycXJldHVybl90IHF4bF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpOwogCiAvKiBxeGxfZmIuYyAqLwogaW50IHF4bF9mYl9pbml0KHN0cnVjdCBxeGxfZGV2aWNlICpxZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lvY3RsLmMgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9pb2N0bC5jCmluZGV4IDdiOTVjNzUuLjBiYjg2ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaW9jdGwuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGNtZC0+cmVsb2NzX251bTsgKytpKSB7CiAJCXN0cnVjdCBkcm1fcXhsX3JlbG9jIHJlbG9jOwogCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJnJlbG9jLAorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlbG9jLAogCQkJCSAgICAgICAmKChzdHJ1Y3QgZHJtX3F4bF9yZWxvYyAqKSh1aW50cHRyX3QpY21kLT5yZWxvY3MpW2ldLAogCQkJCSAgICAgICBzaXplb2YocmVsb2MpKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQlzdHJ1Y3QgZHJtX3F4bF9jb21tYW5kICpjb21tYW5kcyA9CiAJCQkoc3RydWN0IGRybV9xeGxfY29tbWFuZCAqKSh1aW50cHRyX3QpZXhlY2J1ZmZlci0+Y29tbWFuZHM7CiAKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmdXNlcl9jbWQsICZjb21tYW5kc1tjbWRfbnVtXSwKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2NtZCwgJmNvbW1hbmRzW2NtZF9udW1dLAogCQkJCSAgICAgICBzaXplb2YodXNlcl9jbWQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lycS5jCmluZGV4IDIxMzkzZGMuLjI4Zjg0YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lycS5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlICJxeGxfZHJ2LmgiCiAKLWlycXJldHVybl90IHF4bF9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitpcnFyZXR1cm5fdCBxeGxfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCXN0cnVjdCBxeGxfZGV2aWNlICpxZGV2ID0gKHN0cnVjdCBxeGxfZGV2aWNlICopZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfa21zLmMKaW5kZXggZTVjYTQ5OC4uZmQ4OGViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfa21zLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCXF4bF9nYXJiYWdlX2NvbGxlY3QocWRldik7CiB9CiAKLWludCBxeGxfZGV2aWNlX2luaXQoc3RydWN0IHF4bF9kZXZpY2UgKnFkZXYsCitzdGF0aWMgaW50IHF4bF9kZXZpY2VfaW5pdChzdHJ1Y3QgcXhsX2RldmljZSAqcWRldiwKIAkJICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZGV2LAogCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfY2NlLmMKaW5kZXggYzQ1MTI1Ny4uNTk0NTlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2NjZS5jCkBAIC04OTIsMTAgKzg5MiwxMCBAQAogCiAJCWJ1Zi0+ZmlsZV9wcml2ID0gZmlsZV9wcml2OwogCi0JCWlmIChEUk1fQ09QWV9UT19VU0VSKCZkLT5yZXF1ZXN0X2luZGljZXNbaV0sICZidWYtPmlkeCwKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLCAmYnVmLT5pZHgsCiAJCQkJICAgICBzaXplb2YoYnVmLT5pZHgpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoRFJNX0NPUFlfVE9fVVNFUigmZC0+cmVxdWVzdF9zaXplc1tpXSwgJmJ1Zi0+dG90YWwsCisJCWlmIChjb3B5X3RvX3VzZXIoJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sICZidWYtPnRvdGFsLAogCQkJCSAgICAgc2l6ZW9mKGJ1Zi0+dG90YWwpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuaAppbmRleCA1NmViNWUzLi41YmYzZjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmgKQEAgLTE1NCw3ICsxNTQsNyBAQAogZXh0ZXJuIGludCByMTI4X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgcjEyOF9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdTMyIHIxMjhfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKLWV4dGVybiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIGlycXJldHVybl90IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZyk7CiBleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCWlmIChSMTI4X1ZFUkJPU0UpCQkJCQkJXAogCQlEUk1fSU5GTygiQ09NTUlUX1JJTkcoKSB0YWlsPTB4JTA2eFxuIiwJCQlcCiAJCQkgZGV2X3ByaXYtPnJpbmcudGFpbCk7CQkJCVwKLQlEUk1fTUVNT1JZQkFSUklFUigpOwkJCQkJCVwKKwltYigpOwkJCQkJCVwKIAlSMTI4X1dSSVRFKFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSLCBkZXZfcHJpdi0+cmluZy50YWlsKTsJXAogCVIxMjhfUkVBRChSMTI4X1BNNF9CVUZGRVJfRExfV1BUUik7CQkJCVwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lvYzMyLmMKaW5kZXggYTk1NGM1NC4uYjBkMGZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfaW9jMzIuYwpAQCAtMzMsNiArMzMsNyBAQAogCiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KICNpbmNsdWRlIDxkcm0vcjEyOF9kcm0uaD4KKyNpbmNsdWRlICJyMTI4X2Rydi5oIgogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbml0MzIgewogCWludCBmdW5jOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfaXJxLmMKaW5kZXggMmVhNGYwOS4uYzJhZTQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lycS5jCkBAIC00NCw3ICs0NCw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+dmJsX3JlY2VpdmVkKTsKIH0KIAotaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQoraXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X3N0YXRlLmMKaW5kZXggMDFkZDlhZS4uZTgwNmRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfc3RhdGUuYwpAQCAtODk1LDMxICs4OTUsMjIgQEAKIAlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJngsIGRlcHRoLT54LCBzaXplb2YoeCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJnksIGRlcHRoLT55LCBzaXplb2YoeSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWJ1ZmZlcl9zaXplID0gZGVwdGgtPm4gKiBzaXplb2YodTMyKTsKLQlidWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkZXB0aC0+YnVmZmVyLCBidWZmZXJfc2l6ZSkpIHsKLQkJa2ZyZWUoYnVmZmVyKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCWJ1ZmZlciA9IG1lbWR1cF91c2VyKGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwlpZiAoSVNfRVJSKGJ1ZmZlcikpCisJCXJldHVybiBQVFJfRVJSKGJ1ZmZlcik7CiAKIAltYXNrX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1OCk7CiAJaWYgKGRlcHRoLT5tYXNrKSB7Ci0JCW1hc2sgPSBrbWFsbG9jKG1hc2tfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChtYXNrID09IE5VTEwpIHsKKwkJbWFzayA9IG1lbWR1cF91c2VyKGRlcHRoLT5tYXNrLCBtYXNrX3NpemUpOworCQlpZiAoSVNfRVJSKG1hc2spKSB7CiAJCQlrZnJlZShidWZmZXIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihtYXNrLCBkZXB0aC0+bWFzaywgbWFza19zaXplKSkgewotCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCWtmcmVlKG1hc2spOwotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gUFRSX0VSUihtYXNrKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCB4KyspIHsKQEAgLTk5OSw0NiArOTkwLDMzIEBACiAJCWtmcmVlKHgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUih4LCBkZXB0aC0+eCwgeGJ1Zl9zaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcih4LCBkZXB0aC0+eCwgeGJ1Zl9zaXplKSkgewogCQlrZnJlZSh4KTsKIAkJa2ZyZWUoeSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHksIGRlcHRoLT55LCB4YnVmX3NpemUpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKHksIGRlcHRoLT55LCB4YnVmX3NpemUpKSB7CiAJCWtmcmVlKHgpOwogCQlrZnJlZSh5KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJYnVmZmVyX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1MzIpOwotCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChidWZmZXIgPT0gTlVMTCkgeworCWJ1ZmZlciA9IG1lbWR1cF91c2VyKGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwlpZiAoSVNfRVJSKGJ1ZmZlcikpIHsKIAkJa2ZyZWUoeCk7CiAJCWtmcmVlKHkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplKSkgewotCQlrZnJlZSh4KTsKLQkJa2ZyZWUoeSk7Ci0JCWtmcmVlKGJ1ZmZlcik7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gUFRSX0VSUihidWZmZXIpOwogCX0KIAogCWlmIChkZXB0aC0+bWFzaykgewogCQltYXNrX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1OCk7Ci0JCW1hc2sgPSBrbWFsbG9jKG1hc2tfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChtYXNrID09IE5VTEwpIHsKKwkJbWFzayA9IG1lbWR1cF91c2VyKGRlcHRoLT5tYXNrLCBtYXNrX3NpemUpOworCQlpZiAoSVNfRVJSKG1hc2spKSB7CiAJCQlrZnJlZSh4KTsKIAkJCWtmcmVlKHkpOwogCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIobWFzaywgZGVwdGgtPm1hc2ssIG1hc2tfc2l6ZSkpIHsKLQkJCWtmcmVlKHgpOwotCQkJa2ZyZWUoeSk7Ci0JCQlrZnJlZShidWZmZXIpOwotCQkJa2ZyZWUobWFzayk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBQVFJfRVJSKG1hc2spOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTExMDcsOSArMTA4NSw5IEBACiAJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmeCwgZGVwdGgtPngsIHNpemVvZih4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmeSwgZGVwdGgtPnksIHNpemVvZih5KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlCRUdJTl9SSU5HKDcpOwpAQCAtMTE2MiwxMiArMTE0MCwxMiBAQAogCQlrZnJlZSh4KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoeCwgZGVwdGgtPngsIHhidWZfc2l6ZSkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIoeCwgZGVwdGgtPngsIHhidWZfc2l6ZSkpIHsKIAkJa2ZyZWUoeCk7CiAJCWtmcmVlKHkpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUih5LCBkZXB0aC0+eSwgeWJ1Zl9zaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcih5LCBkZXB0aC0+eSwgeWJ1Zl9zaXplKSkgewogCQlrZnJlZSh4KTsKIAkJa2ZyZWUoeSk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTUyNCw3ICsxNTAyLDcgQEAKIAogCURFVl9JTklUX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwogCi0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmbWFzaywgc3RpcHBsZS0+bWFzaywgMzIgKiBzaXplb2YodTMyKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtYXNrLCBzdGlwcGxlLT5tYXNrLCAzMiAqIHNpemVvZih1MzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwpAQCAtMTYyMiw3ICsxNjAwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKERSTV9DT1BZX1RPX1VTRVIocGFyYW0tPnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpKSkgeworCWlmIChjb3B5X3RvX3VzZXIocGFyYW0tPnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpKSkgewogCQlEUk1fRVJST1IoImNvcHlfdG9fdXNlclxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggMGI5NjIxYy4uYTkzMzhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTIwOSw2ICsyMDksMTYgQEAKIAlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiB2Z2FfY29udHJvbF9yZWdzWzZdID0KK3sKKwlBVklWT19EMVZHQV9DT05UUk9MLAorCUFWSVZPX0QyVkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsCisJRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsCit9OworCiBzdGF0aWMgdm9pZCBhdG9tYmlvc19ibGFua19jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHN0YXRlKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKQEAgLTIxNiwxMyArMjI2LDIzIEBACiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEJsYW5rQ1JUQyk7CiAJQkxBTktfQ1JUQ19QU19BTExPQ0FUSU9OIGFyZ3M7CisJdTMyIHZnYV9jb250cm9sID0gMDsKIAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAorCWlmIChBU0lDX0lTX0RDRTgocmRldikpIHsKKwkJdmdhX2NvbnRyb2wgPSBSUkVHMzIodmdhX2NvbnRyb2xfcmVnc1tyYWRlb25fY3J0Yy0+Y3J0Y19pZF0pOworCQlXUkVHMzIodmdhX2NvbnRyb2xfcmVnc1tyYWRlb25fY3J0Yy0+Y3J0Y19pZF0sIHZnYV9jb250cm9sIHwgMSk7CisJfQorCiAJYXJncy51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKIAlhcmdzLnVjQmxhbmtpbmcgPSBzdGF0ZTsKIAogCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCisJaWYgKEFTSUNfSVNfRENFOChyZGV2KSkgeworCQlXUkVHMzIodmdhX2NvbnRyb2xfcmVnc1tyYWRlb25fY3J0Yy0+Y3J0Y19pZF0sIHZnYV9jb250cm9sKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0b21iaW9zX3Bvd2VyZ2F0ZV9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHN0YXRlKQpAQCAtNDIzLDcgKzQ0MywxNyBAQAogCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEVuYWJsZVNwcmVhZFNwZWN0cnVtT25QUExMKTsKIAl1bmlvbiBhdG9tX2VuYWJsZV9zcyBhcmdzOwogCi0JaWYgKCFlbmFibGUpIHsKKwlpZiAoZW5hYmxlKSB7CisJCS8qIERvbid0IG1lc3Mgd2l0aCBTUyBpZiBwZXJjZW50YWdlIGlzIDAgb3IgZXh0ZXJuYWwgc3MuCisJCSAqIFNTIGlzIGFscmVhZHkgZGlzYWJsZWQgcHJldmlvdXNseSwgYW5kIGRpc2FibGluZyBpdAorCQkgKiBhZ2FpbiBjYW4gY2F1c2UgZGlzcGxheSBwcm9ibGVtcyBpZiB0aGUgcGxsIGlzIGFscmVhZHkKKwkJICogcHJvZ3JhbW1lZC4KKwkJICovCisJCWlmIChzcy0+cGVyY2VudGFnZSA9PSAwKQorCQkJcmV0dXJuOworCQlpZiAoc3MtPnR5cGUgJiBBVE9NX0VYVEVSTkFMX1NTX01BU0spCisJCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IHJkZXYtPm51bV9jcnRjOyBpKyspIHsKIAkJCWlmIChyZGV2LT5tb2RlX2luZm8uY3J0Y3NbaV0gJiYKIAkJCSAgICByZGV2LT5tb2RlX2luZm8uY3J0Y3NbaV0tPmVuYWJsZWQgJiYKQEAgLTQ1OSw4ICs0ODksNiBAQAogCQlhcmdzLnYzLnVzU3ByZWFkU3BlY3RydW1BbW91bnQgPSBjcHVfdG9fbGUxNihzcy0+YW1vdW50KTsKIAkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtU3RlcCA9IGNwdV90b19sZTE2KHNzLT5zdGVwKTsKIAkJYXJncy52My51Y0VuYWJsZSA9IGVuYWJsZTsKLQkJaWYgKChzcy0+cGVyY2VudGFnZSA9PSAwKSB8fCAoc3MtPnR5cGUgJiBBVE9NX0VYVEVSTkFMX1NTX01BU0spIHx8IEFTSUNfSVNfRENFNjEocmRldikpCi0JCQlhcmdzLnYzLnVjRW5hYmxlID0gQVRPTV9ESVNBQkxFOwogCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CiAJCWFyZ3MudjIudXNTcHJlYWRTcGVjdHJ1bVBlcmNlbnRhZ2UgPSBjcHVfdG9fbGUxNihzcy0+cGVyY2VudGFnZSk7CiAJCWFyZ3MudjIudWNTcHJlYWRTcGVjdHJ1bVR5cGUgPSBzcy0+dHlwZSAmIEFUT01fU1NfQ0VOVFJFX1NQUkVBRF9NT0RFX01BU0s7CkBAIC00ODAsOCArNTA4LDYgQEAKIAkJYXJncy52Mi51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gY3B1X3RvX2xlMTYoc3MtPmFtb3VudCk7CiAJCWFyZ3MudjIudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSBjcHVfdG9fbGUxNihzcy0+c3RlcCk7CiAJCWFyZ3MudjIudWNFbmFibGUgPSBlbmFibGU7Ci0JCWlmICgoc3MtPnBlcmNlbnRhZ2UgPT0gMCkgfHwgKHNzLT50eXBlICYgQVRPTV9FWFRFUk5BTF9TU19NQVNLKSB8fCBBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJYXJncy52Mi51Y0VuYWJsZSA9IEFUT01fRElTQUJMRTsKIAl9IGVsc2UgaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewogCQlhcmdzLnYxLnVzU3ByZWFkU3BlY3RydW1QZXJjZW50YWdlID0gY3B1X3RvX2xlMTYoc3MtPnBlcmNlbnRhZ2UpOwogCQlhcmdzLnYxLnVjU3ByZWFkU3BlY3RydW1UeXBlID0gc3MtPnR5cGUgJiBBVE9NX1NTX0NFTlRSRV9TUFJFQURfTU9ERV9NQVNLOwpAQCAtNTAzLDggKzUyOSw3IEBACiAJCWFyZ3MubHZkc19zc18yLnVjU3ByZWFkU3BlY3RydW1SYW5nZSA9IHNzLT5yYW5nZTsKIAkJYXJncy5sdmRzX3NzXzIudWNFbmFibGUgPSBlbmFibGU7CiAJfSBlbHNlIHsKLQkJaWYgKChlbmFibGUgPT0gQVRPTV9ESVNBQkxFKSB8fCAoc3MtPnBlcmNlbnRhZ2UgPT0gMCkgfHwKLQkJICAgIChzcy0+dHlwZSAmIEFUT01fRVhURVJOQUxfU1NfTUFTSykpIHsKKwkJaWYgKGVuYWJsZSA9PSBBVE9NX0RJU0FCTEUpIHsKIAkJCWF0b21iaW9zX2Rpc2FibGVfc3MocmRldiwgcGxsX2lkKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtOTM4LDExICs5NjMsMTQgQEAKIAkJCQkJCQlyYWRlb25fYXRvbWJpb3NfZ2V0X3BwbGxfc3NfaW5mbyhyZGV2LAogCQkJCQkJCQkJCQkgJnJhZGVvbl9jcnRjLT5zcywKIAkJCQkJCQkJCQkJIEFUT01fRFBfU1NfSUQxKTsKLQkJCQl9IGVsc2UKKwkJCQl9IGVsc2UgewogCQkJCQlyYWRlb25fY3J0Yy0+c3NfZW5hYmxlZCA9CiAJCQkJCQlyYWRlb25fYXRvbWJpb3NfZ2V0X3BwbGxfc3NfaW5mbyhyZGV2LAogCQkJCQkJCQkJCSAmcmFkZW9uX2NydGMtPnNzLAogCQkJCQkJCQkJCSBBVE9NX0RQX1NTX0lEMSk7CisJCQkJfQorCQkJCS8qIGRpc2FibGUgc3ByZWFkIHNwZWN0cnVtIG9uIERDRTMgRFAgKi8KKwkJCQlyYWRlb25fY3J0Yy0+c3NfZW5hYmxlZCA9IGZhbHNlOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQVRPTV9FTkNPREVSX01PREVfTFZEUzoKQEAgLTEwMzksMTUgKzEwNjcsMTcgQEAKIAkJLyogY2FsY3VsYXRlIHNzIGFtb3VudCBhbmQgc3RlcCBzaXplICovCiAJCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKIAkJCXUzMiBzdGVwX3NpemU7Ci0JCQl1MzIgYW1vdW50ID0gKCgoZmJfZGl2ICogMTApICsgZnJhY19mYl9kaXYpICogcmFkZW9uX2NydGMtPnNzLnBlcmNlbnRhZ2UpIC8gMTAwMDA7CisJCQl1MzIgYW1vdW50ID0gKCgoZmJfZGl2ICogMTApICsgZnJhY19mYl9kaXYpICoKKwkJCQkgICAgICAodTMyKXJhZGVvbl9jcnRjLT5zcy5wZXJjZW50YWdlKSAvCisJCQkJKDEwMCAqICh1MzIpcmFkZW9uX2NydGMtPnNzLnBlcmNlbnRhZ2VfZGl2aWRlcik7CiAJCQlyYWRlb25fY3J0Yy0+c3MuYW1vdW50ID0gKGFtb3VudCAvIDEwKSAmIEFUT01fUFBMTF9TU19BTU9VTlRfVjJfRkJESVZfTUFTSzsKIAkJCXJhZGVvbl9jcnRjLT5zcy5hbW91bnQgfD0gKChhbW91bnQgLSAoYW1vdW50IC8gMTApKSA8PCBBVE9NX1BQTExfU1NfQU1PVU5UX1YyX05GUkFDX1NISUZUKSAmCiAJCQkJQVRPTV9QUExMX1NTX0FNT1VOVF9WMl9ORlJBQ19NQVNLOwogCQkJaWYgKHJhZGVvbl9jcnRjLT5zcy50eXBlICYgQVRPTV9QUExMX1NTX1RZUEVfVjJfQ0VOVFJFX1NQUkVBRCkKLQkJCQlzdGVwX3NpemUgPSAoNCAqIGFtb3VudCAqIHJlZl9kaXYgKiAocmFkZW9uX2NydGMtPnNzLnJhdGUgKiAyMDQ4KSkgLworCQkJCXN0ZXBfc2l6ZSA9ICg0ICogYW1vdW50ICogcmVmX2RpdiAqICgodTMyKXJhZGVvbl9jcnRjLT5zcy5yYXRlICogMjA0OCkpIC8KIAkJCQkJKDEyNSAqIDI1ICogcGxsLT5yZWZlcmVuY2VfZnJlcSAvIDEwMCk7CiAJCQllbHNlCi0JCQkJc3RlcF9zaXplID0gKDIgKiBhbW91bnQgKiByZWZfZGl2ICogKHJhZGVvbl9jcnRjLT5zcy5yYXRlICogMjA0OCkpIC8KKwkJCQlzdGVwX3NpemUgPSAoMiAqIGFtb3VudCAqIHJlZl9kaXYgKiAoKHUzMilyYWRlb25fY3J0Yy0+c3MucmF0ZSAqIDIwNDgpKSAvCiAJCQkJCSgxMjUgKiAyNSAqIHBsbC0+cmVmZXJlbmNlX2ZyZXEgLyAxMDApOwogCQkJcmFkZW9uX2NydGMtPnNzLnN0ZXAgPSBzdGVwX3NpemU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYwppbmRleCBmYjNhZTA3Li40YWQ3NjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCkBAIC0xNTcsMjEgKzE1NywyMiBAQAogCiAJbXNnWzBdID0gYWRkcmVzczsKIAltc2dbMV0gPSBhZGRyZXNzID4+IDg7Ci0JbXNnWzJdID0gQVVYX05BVElWRV9XUklURSA8PCA0OworCW1zZ1syXSA9IERQX0FVWF9OQVRJVkVfV1JJVEUgPDwgNDsKIAltc2dbM10gPSAobXNnX2J5dGVzIDw8IDQpIHwgKHNlbmRfYnl0ZXMgLSAxKTsKIAltZW1jcHkoJm1zZ1s0XSwgc2VuZCwgc2VuZF9ieXRlcyk7CiAKLQlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCA0OyByZXRyeSsrKSB7CisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgNzsgcmV0cnkrKykgewogCQlyZXQgPSByYWRlb25fcHJvY2Vzc19hdXhfY2goZGlnX2Nvbm5lY3Rvci0+ZHBfaTJjX2J1cywKIAkJCQkJICAgIG1zZywgbXNnX2J5dGVzLCBOVUxMLCAwLCBkZWxheSwgJmFjayk7CiAJCWlmIChyZXQgPT0gLUVCVVNZKQogCQkJY29udGludWU7CiAJCWVsc2UgaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlpZiAoKGFjayAmIEFVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gQVVYX05BVElWRV9SRVBMWV9BQ0spCisJCWFjayA+Pj0gNDsKKwkJaWYgKChhY2sgJiBEUF9BVVhfTkFUSVZFX1JFUExZX01BU0spID09IERQX0FVWF9OQVRJVkVfUkVQTFlfQUNLKQogCQkJcmV0dXJuIHNlbmRfYnl0ZXM7Ci0JCWVsc2UgaWYgKChhY2sgJiBBVVhfTkFUSVZFX1JFUExZX01BU0spID09IEFVWF9OQVRJVkVfUkVQTFlfREVGRVIpCi0JCQl1ZGVsYXkoNDAwKTsKKwkJZWxzZSBpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9ERUZFUikKKwkJCXVzbGVlcF9yYW5nZSg0MDAsIDUwMCk7CiAJCWVsc2UKIAkJCXJldHVybiAtRUlPOwogCX0KQEAgLTE5MSwyMCArMTkyLDIxIEBACiAKIAltc2dbMF0gPSBhZGRyZXNzOwogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKLQltc2dbMl0gPSBBVVhfTkFUSVZFX1JFQUQgPDwgNDsKKwltc2dbMl0gPSBEUF9BVVhfTkFUSVZFX1JFQUQgPDwgNDsKIAltc2dbM10gPSAobXNnX2J5dGVzIDw8IDQpIHwgKHJlY3ZfYnl0ZXMgLSAxKTsKIAotCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDQ7IHJldHJ5KyspIHsKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCA3OyByZXRyeSsrKSB7CiAJCXJldCA9IHJhZGVvbl9wcm9jZXNzX2F1eF9jaChkaWdfY29ubmVjdG9yLT5kcF9pMmNfYnVzLAogCQkJCQkgICAgbXNnLCBtc2dfYnl0ZXMsIHJlY3YsIHJlY3ZfYnl0ZXMsIGRlbGF5LCAmYWNrKTsKIAkJaWYgKHJldCA9PSAtRUJVU1kpCiAJCQljb250aW51ZTsKIAkJZWxzZSBpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0FDSykKKwkJYWNrID4+PSA0OworCQlpZiAoKGFjayAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgPT0gRFBfQVVYX05BVElWRV9SRVBMWV9BQ0spCiAJCQlyZXR1cm4gcmV0OwotCQllbHNlIGlmICgoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSA9PSBBVVhfTkFUSVZFX1JFUExZX0RFRkVSKQotCQkJdWRlbGF5KDQwMCk7CisJCWVsc2UgaWYgKChhY2sgJiBEUF9BVVhfTkFUSVZFX1JFUExZX01BU0spID09IERQX0FVWF9OQVRJVkVfUkVQTFlfREVGRVIpCisJCQl1c2xlZXBfcmFuZ2UoNDAwLCA1MDApOwogCQllbHNlIGlmIChyZXQgPT0gMCkKIAkJCXJldHVybiAtRVBST1RPOwogCQllbHNlCkBAIC0yNDYsMTIgKzI0OCwxMiBAQAogCiAJLyogU2V0IHVwIHRoZSBjb21tYW5kIGJ5dGUgKi8KIAlpZiAobW9kZSAmIE1PREVfSTJDX1JFQUQpCi0JCW1zZ1syXSA9IEFVWF9JMkNfUkVBRCA8PCA0OworCQltc2dbMl0gPSBEUF9BVVhfSTJDX1JFQUQgPDwgNDsKIAllbHNlCi0JCW1zZ1syXSA9IEFVWF9JMkNfV1JJVEUgPDwgNDsKKwkJbXNnWzJdID0gRFBfQVVYX0kyQ19XUklURSA8PCA0OwogCiAJaWYgKCEobW9kZSAmIE1PREVfSTJDX1NUT1ApKQotCQltc2dbMl0gfD0gQVVYX0kyQ19NT1QgPDwgNDsKKwkJbXNnWzJdIHw9IERQX0FVWF9JMkNfTU9UIDw8IDQ7CiAKIAltc2dbMF0gPSBhZGRyZXNzOwogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKQEAgLTI3Miw3ICsyNzQsNyBAQAogCQlicmVhazsKIAl9CiAKLQlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCA0OyByZXRyeSsrKSB7CisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgNzsgcmV0cnkrKykgewogCQlyZXQgPSByYWRlb25fcHJvY2Vzc19hdXhfY2goYXV4Y2gsCiAJCQkJCSAgICBtc2csIG1zZ19ieXRlcywgcmVwbHksIHJlcGx5X2J5dGVzLCAwLCAmYWNrKTsKIAkJaWYgKHJldCA9PSAtRUJVU1kpCkBAIC0yODIsMzUgKzI4NCwzNSBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCXN3aXRjaCAoYWNrICYgQVVYX05BVElWRV9SRVBMWV9NQVNLKSB7Ci0JCWNhc2UgQVVYX05BVElWRV9SRVBMWV9BQ0s6CisJCXN3aXRjaCAoKGFjayA+PiA0KSAmIERQX0FVWF9OQVRJVkVfUkVQTFlfTUFTSykgeworCQljYXNlIERQX0FVWF9OQVRJVkVfUkVQTFlfQUNLOgogCQkJLyogSTJDLW92ZXItQVVYIFJlcGx5IGZpZWxkIGlzIG9ubHkgdmFsaWQKIAkJCSAqIHdoZW4gcGFpcmVkIHdpdGggQVVYIEFDSy4KIAkJCSAqLwogCQkJYnJlYWs7Ci0JCWNhc2UgQVVYX05BVElWRV9SRVBMWV9OQUNLOgorCQljYXNlIERQX0FVWF9OQVRJVkVfUkVQTFlfTkFDSzoKIAkJCURSTV9ERUJVR19LTVMoImF1eF9jaCBuYXRpdmUgbmFja1xuIik7CiAJCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJY2FzZSBBVVhfTkFUSVZFX1JFUExZX0RFRkVSOgorCQljYXNlIERQX0FVWF9OQVRJVkVfUkVQTFlfREVGRVI6CiAJCQlEUk1fREVCVUdfS01TKCJhdXhfY2ggbmF0aXZlIGRlZmVyXG4iKTsKLQkJCXVkZWxheSg0MDApOworCQkJdXNsZWVwX3JhbmdlKDUwMCwgNjAwKTsKIAkJCWNvbnRpbnVlOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJhdXhfY2ggaW52YWxpZCBuYXRpdmUgcmVwbHkgMHglMDJ4XG4iLCBhY2spOwogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJCX0KIAotCQlzd2l0Y2ggKGFjayAmIEFVWF9JMkNfUkVQTFlfTUFTSykgewotCQljYXNlIEFVWF9JMkNfUkVQTFlfQUNLOgorCQlzd2l0Y2ggKChhY2sgPj4gNCkgJiBEUF9BVVhfSTJDX1JFUExZX01BU0spIHsKKwkJY2FzZSBEUF9BVVhfSTJDX1JFUExZX0FDSzoKIAkJCWlmIChtb2RlID09IE1PREVfSTJDX1JFQUQpCiAJCQkJKnJlYWRfYnl0ZSA9IHJlcGx5WzBdOwogCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX05BQ0s6CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9OQUNLOgogCQkJRFJNX0RFQlVHX0tNUygiYXV4X2kyYyBuYWNrXG4iKTsKIAkJCXJldHVybiAtRVJFTU9URUlPOwotCQljYXNlIEFVWF9JMkNfUkVQTFlfREVGRVI6CisJCWNhc2UgRFBfQVVYX0kyQ19SRVBMWV9ERUZFUjoKIAkJCURSTV9ERUJVR19LTVMoImF1eF9pMmMgZGVmZXJcbiIpOwotCQkJdWRlbGF5KDQwMCk7CisJCQl1c2xlZXBfcmFuZ2UoNDAwLCA1MDApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlEUk1fRVJST1IoImF1eF9pMmMgaW52YWxpZCByZXBseSAweCUwMnhcbiIsIGFjayk7CkBAIC02NzEsOSArNjczLDExIEBACiAJdTggdG1wOwogCiAJLyogcG93ZXIgdXAgdGhlIHNpbmsgKi8KLQlpZiAoZHBfaW5mby0+ZHBjZFswXSA+PSAweDExKQorCWlmIChkcF9pbmZvLT5kcGNkWzBdID49IDB4MTEpIHsKIAkJcmFkZW9uX3dyaXRlX2RwY2RfcmVnKGRwX2luZm8tPnJhZGVvbl9jb25uZWN0b3IsCiAJCQkJICAgICAgRFBfU0VUX1BPV0VSLCBEUF9TRVRfUE9XRVJfRDApOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQogCiAJLyogcG9zc2libHkgZW5hYmxlIGRvd25zcHJlYWQgb24gdGhlIHNpbmsgKi8KIAlpZiAoZHBfaW5mby0+ZHBjZFszXSAmIDB4MSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2kyYy5jCmluZGV4IGY2ODUwMzVkYmUuLmI1MTYyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfaTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19pMmMuYwpAQCAtMjcsOCArMjcsNiBAQAogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgImF0b20uaCIKIAotZXh0ZXJuIHZvaWQgcmFkZW9uX2F0b21fY29weV9zd2FwKHU4ICpkc3QsIHU4ICpzcmMsIHU4IG51bV9ieXRlcywgYm9vbCB0b19sZSk7Ci0KICNkZWZpbmUgVEFSR0VUX0hXX0kyQ19DTE9DSyA1MAogCiAvKiB0aGVzZSBhcmUgYSBsaW1pdGF0aW9uIG9mIFByb2Nlc3NJMmNDaGFubmVsVHJhbnNhY3Rpb24gbm90IHRoZSBodyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9idGNfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2J0Y19kcG0uYwppbmRleCA5YjY5NTBkLi4wZmJkMzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2J0Y19kcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2J0Y19kcG0uYwpAQCAtNDksNiArNDksNyBAQAogc3RydWN0IHJ2N3h4X3Bvd2VyX2luZm8gKnJ2NzcwX2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdHJ1Y3QgZXZlcmdyZWVuX3Bvd2VyX2luZm8gKmV2ZXJncmVlbl9nZXRfcGkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCitleHRlcm4gaW50IG5pX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLy8qKioqKioqKiogQkFSVFMgKioqKioqKioqKioqKiovLwogc3RhdGljIGNvbnN0IHUzMiBiYXJ0c19jZ2NnX2NnbHNfZGVmYXVsdFtdID0KQEAgLTI1MTAsMjEgKzI1MTEsNiBAQAogCWlmIChlZ19waS0+bHNfY2xvY2tfZ2F0aW5nKQogCQlidGNfbHNfY2xvY2tfZ2F0aW5nX2VuYWJsZShyZGV2LCB0cnVlKTsKIAotCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkICYmCi0JICAgIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IocmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSkpIHsKLQkJUFBTTUNfUmVzdWx0IHJlc3VsdDsKLQotCQlyZXQgPSBydjc3MF9zZXRfdGhlcm1hbF90ZW1wZXJhdHVyZV9yYW5nZShyZGV2LCBSNjAwX1RFTVBfUkFOR0VfTUlOLCBSNjAwX1RFTVBfUkFOR0VfTUFYKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJkZXYtPmlycS5kcG1fdGhlcm1hbCA9IHRydWU7Ci0JCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwotCQlyZXN1bHQgPSBydjc3MF9zZW5kX21zZ190b19zbWMocmRldiwgUFBTTUNfTVNHX0VuYWJsZVRoZXJtYWxJbnRlcnJ1cHQpOwotCi0JCWlmIChyZXN1bHQgIT0gUFBTTUNfUmVzdWx0X09LKQotCQkJRFJNX0RFQlVHX0tNUygiQ291bGQgbm90IGVuYWJsZSB0aGVybWFsIGludGVycnVwdHMuXG4iKTsKLQl9Ci0KIAlydjc3MF9lbmFibGVfYXV0b190aHJvdHRsZV9zb3VyY2UocmRldiwgUkFERU9OX0RQTV9BVVRPX1RIUk9UVExFX1NSQ19USEVSTUFMLCB0cnVlKTsKIAogCWJ0Y19pbml0X3N0dXR0ZXJfbW9kZShyZGV2KTsKQEAgLTI1NzYsNyArMjU2MiwxMSBAQAogdm9pZCBidGNfZHBtX3NldHVwX2FzaWMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IGV2ZXJncmVlbl9wb3dlcl9pbmZvICplZ19waSA9IGV2ZXJncmVlbl9nZXRfcGkocmRldik7CisJaW50IHI7CiAKKwlyID0gbmlfbWNfbG9hZF9taWNyb2NvZGUocmRldik7CisJaWYgKHIpCisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKIAlydjc3MF9nZXRfbWVtb3J5X3R5cGUocmRldik7CiAJcnY3NDBfcmVhZF9jbG9ja19yZWdpc3RlcnMocmRldik7CiAJYnRjX3JlYWRfYXJiX3JlZ2lzdGVycyhyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NpX2RwbS5jCmluZGV4IDFlZDQ3OTkuLjhkNDkxMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaV9kcG0uYwpAQCAtMTcxLDggKzE3MSw3IEBACiAJCQkJCQkgICAgIHN0cnVjdCBhdG9tX3ZvbHRhZ2VfdGFibGUgKnZvbHRhZ2VfdGFibGUpOwogZXh0ZXJuIHZvaWQgY2lrX2VudGVyX3JsY19zYWZlX21vZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgY2lrX2V4aXRfcmxjX3NhZmVfbW9kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBjaWtfdXBkYXRlX2NnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICB1MzIgYmxvY2ssIGJvb2wgZW5hYmxlKTsKK2V4dGVybiBpbnQgY2lfbWNfbG9hZF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiBzdGF0aWMgaW50IGNpX2dldF9zdGRfdm9sdGFnZV92YWx1ZV9zaWRkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJCQkgc3RydWN0IGF0b21fdm9sdGFnZV90YWJsZV9lbnRyeSAqdm9sdGFnZV90YWJsZSwKQEAgLTQ1MDMsOCArNDUwMiw4IEBACiAKIH0KIAotdm9pZCBjaV91cGRhdGVfY3VycmVudF9wcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSAgc3RydWN0IHJhZGVvbl9wcyAqcnBzKQorc3RhdGljIHZvaWQgY2lfdXBkYXRlX2N1cnJlbnRfcHMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJIHN0cnVjdCByYWRlb25fcHMgKnJwcykKIHsKIAlzdHJ1Y3QgY2lfcHMgKm5ld19wcyA9IGNpX2dldF9wcyhycHMpOwogCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShyZGV2KTsKQEAgLTQ1MTQsOCArNDUxMyw4IEBACiAJcGktPmN1cnJlbnRfcnBzLnBzX3ByaXYgPSAmcGktPmN1cnJlbnRfcHM7CiB9CiAKLXZvaWQgY2lfdXBkYXRlX3JlcXVlc3RlZF9wcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSAgICBzdHJ1Y3QgcmFkZW9uX3BzICpycHMpCitzdGF0aWMgdm9pZCBjaV91cGRhdGVfcmVxdWVzdGVkX3BzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCSAgIHN0cnVjdCByYWRlb25fcHMgKnJwcykKIHsKIAlzdHJ1Y3QgY2lfcHMgKm5ld19wcyA9IGNpX2dldF9wcyhycHMpOwogCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShyZGV2KTsKQEAgLTQ1NDksNiArNDU0OCwxMSBAQAogCiB2b2lkIGNpX2RwbV9zZXR1cF9hc2ljKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCByOworCisJciA9IGNpX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOworCWlmIChyKQorCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIE1DIGZpcm13YXJlIVxuIik7CiAJY2lfcmVhZF9jbG9ja19yZWdpc3RlcnMocmRldik7CiAJY2lfZ2V0X21lbW9yeV90eXBlKHJkZXYpOwogCWNpX2VuYWJsZV9hY3BpX3Bvd2VyX21hbmFnZW1lbnQocmRldik7CkBAIC00NTYxLDEzICs0NTY1LDYgQEAKIAlzdHJ1Y3QgcmFkZW9uX3BzICpib290X3BzID0gcmRldi0+cG0uZHBtLmJvb3RfcHM7CiAJaW50IHJldDsKIAotCWNpa191cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19CSUYgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIGZhbHNlKTsKLQogCWlmIChjaV9pc19zbWNfcnVubmluZyhyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBpLT52b2x0YWdlX2NvbnRyb2wgIT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX05PTkUpIHsKQEAgLTQ2NjUsNiArNDY2MiwxOCBAQAogCQlEUk1fRVJST1IoImNpX2VuYWJsZV9wb3dlcl9jb250YWlubWVudCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KKworCWNpX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOworCisJY2lfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgYm9vdF9wcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNpX2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcmV0OworCiAJaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQgJiYKIAkgICAgcjYwMF9pc19pbnRlcm5hbF90aGVybWFsX3NlbnNvcihyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlKSkgewogI2lmIDAKQEAgLTQ2ODUsMTkgKzQ2OTQsOCBAQAogI2VuZGlmCiAJfQogCi0JY2lfZW5hYmxlX2F1dG9fdGhyb3R0bGVfc291cmNlKHJkZXYsIFJBREVPTl9EUE1fQVVUT19USFJPVFRMRV9TUkNfVEhFUk1BTCwgdHJ1ZSk7Ci0KIAljaV9kcG1fcG93ZXJnYXRlX3V2ZChyZGV2LCB0cnVlKTsKIAotCWNpa191cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19CSUYgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIHRydWUpOwotCi0JY2lfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgYm9vdF9wcyk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDcwNiwxMiArNDcwNCw2IEBACiAJc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKHJkZXYpOwogCXN0cnVjdCByYWRlb25fcHMgKmJvb3RfcHMgPSByZGV2LT5wbS5kcG0uYm9vdF9wczsKIAotCWNpa191cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19VVkQgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfSERQKSwgZmFsc2UpOwotCiAJY2lfZHBtX3Bvd2VyZ2F0ZV91dmQocmRldiwgZmFsc2UpOwogCiAJaWYgKCFjaV9pc19zbWNfcnVubmluZyhyZGV2KSkKQEAgLTQ3NDIsMTMgKzQ3MzQsNiBAQAogCXN0cnVjdCByYWRlb25fcHMgKm9sZF9wcyA9ICZwaS0+Y3VycmVudF9ycHM7CiAJaW50IHJldDsKIAotCWNpa191cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19CSUYgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIGZhbHNlKTsKLQogCWNpX2ZpbmRfZHBtX3N0YXRlc19jbG9ja3NfaW5fZHBtX3RhYmxlKHJkZXYsIG5ld19wcyk7CiAJaWYgKHBpLT5wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3QpCiAJCWNpX3JlcXVlc3RfbGlua19zcGVlZF9jaGFuZ2VfYmVmb3JlX3N0YXRlX2NoYW5nZShyZGV2LCBuZXdfcHMsIG9sZF9wcyk7CkBAIC00ODA0LDEzICs0Nzg5LDYgQEAKIAlpZiAocGktPnBjaWVfcGVyZm9ybWFuY2VfcmVxdWVzdCkKIAkJY2lfbm90aWZ5X2xpbmtfc3BlZWRfY2hhbmdlX2FmdGVyX3N0YXRlX2NoYW5nZShyZGV2LCBuZXdfcHMsIG9sZF9wcyk7CiAKLQljaWtfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX01DIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1VWRCB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19IRFApLCB0cnVlKTsKLQogCXJldHVybiAwOwogfQogCkBAIC01MDIzLDggKzUwMDEsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY2lfZ2V0X3ZiaW9zX2Jvb3RfdmFsdWVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICAgICBzdHJ1Y3QgY2lfdmJpb3NfYm9vdF9zdGF0ZSAqYm9vdF9zdGF0ZSkKK3N0YXRpYyBpbnQgY2lfZ2V0X3ZiaW9zX2Jvb3RfdmFsdWVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCSAgICBzdHJ1Y3QgY2lfdmJpb3NfYm9vdF9zdGF0ZSAqYm9vdF9zdGF0ZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKIAlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBGaXJtd2FyZUluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaV9zbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lfc21jLmMKaW5kZXggOWM3NDVkZC4uOGRlYmM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaV9zbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NpX3NtYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiY2lrZC5oIgogI2luY2x1ZGUgInBwc21jLmgiCiAjaW5jbHVkZSAicmFkZW9uX3Vjb2RlLmgiCisjaW5jbHVkZSAiY2lfZHBtLmgiCiAKIHN0YXRpYyBpbnQgY2lfc2V0X3NtY19zcmFtX2FkZHJlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJICAgdTMyIHNtY19hZGRyZXNzLCB1MzIgbGltaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npay5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWsuYwppbmRleCBlOTUwZmFiLi5lNjQxOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npay5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrLmMKQEAgLTE2OTcsNyArMTY5Nyw3IEBACiAgKiBMb2FkIHRoZSBHRERSIE1DIHVjb2RlIGludG8gdGhlIGh3IChDSUspLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgY2lfbWNfbG9hZF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitpbnQgY2lfbWNfbG9hZF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJY29uc3QgX19iZTMyICpmd19kYXRhOwogCXUzMiBydW5uaW5nLCBibGFja291dCA9IDA7CkBAIC0zNDg3LDYgKzM0ODcsNTEgQEAKIH0KIAogLyoqCisgKiBjaWtfaGRwX2ZsdXNoX2NwX3JpbmdfZW1pdCAtIGVtaXQgYW4gaGRwIGZsdXNoIG9uIHRoZSBjcAorICoKKyAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKKyAqIEByaWR4OiByYWRlb24gcmluZyBpbmRleAorICoKKyAqIEVtaXRzIGFuIGhkcCBmbHVzaCBvbiB0aGUgY3AuCisgKi8KK3N0YXRpYyB2b2lkIGNpa19oZHBfZmx1c2hfY3BfcmluZ19lbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCSAgICAgICBpbnQgcmlkeCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcgPSAmcmRldi0+cmluZ1tyaWR4XTsKKwl1MzIgcmVmX2FuZF9tYXNrOworCisJc3dpdGNoIChyaW5nLT5pZHgpIHsKKwljYXNlIENBWU1BTl9SSU5HX1RZUEVfQ1AxX0lOREVYOgorCWNhc2UgQ0FZTUFOX1JJTkdfVFlQRV9DUDJfSU5ERVg6CisJZGVmYXVsdDoKKwkJc3dpdGNoIChyaW5nLT5tZSkgeworCQljYXNlIDA6CisJCQlyZWZfYW5kX21hc2sgPSBDUDIgPDwgcmluZy0+cGlwZTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyZWZfYW5kX21hc2sgPSBDUDYgPDwgcmluZy0+cGlwZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVg6CisJCXJlZl9hbmRfbWFzayA9IENQMDsKKwkJYnJlYWs7CisJfQorCisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX1dBSVRfUkVHX01FTSwgNSkpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIChXQUlUX1JFR19NRU1fT1BFUkFUSU9OKDEpIHwgLyogd3JpdGUsIHdhaXQsIHdyaXRlICovCisJCQkJIFdBSVRfUkVHX01FTV9GVU5DVElPTigzKSB8ICAvKiA9PSAqLworCQkJCSBXQUlUX1JFR19NRU1fRU5HSU5FKDEpKSk7ICAgLyogcGZwICovCisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgR1BVX0hEUF9GTFVTSF9SRVEgPj4gMik7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgR1BVX0hEUF9GTFVTSF9ET05FID4+IDIpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHJlZl9hbmRfbWFzayk7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgcmVmX2FuZF9tYXNrKTsKKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCAweDIwKTsgLyogcG9sbCBpbnRlcnZhbCAqLworfQorCisvKioKICAqIGNpa19mZW5jZV9nZnhfcmluZ19lbWl0IC0gZW1pdCBhIGZlbmNlIG9uIHRoZSBnZnggcmluZwogICoKICAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKQEAgLTM1MTIsMTUgKzM1NTcsNyBAQAogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGZlbmNlLT5zZXEpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOwogCS8qIEhEUCBmbHVzaCAqLwotCS8qIFdlIHNob3VsZCBiZSB1c2luZyB0aGUgbmV3IFdBSVRfUkVHX01FTSBzcGVjaWFsIG9wIHBhY2tldCBoZXJlCi0JICogYnV0IGl0IGNhdXNlcyB0aGUgQ1AgdG8gaGFuZwotCSAqLwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDMoUEFDS0VUM19XUklURV9EQVRBLCAzKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKFdSSVRFX0RBVEFfRU5HSU5FX1NFTCgwKSB8Ci0JCQkJIFdSSVRFX0RBVEFfRFNUX1NFTCgwKSkpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIEhEUF9NRU1fQ09IRVJFTkNZX0ZMVVNIX0NOVEwgPj4gMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7CisJY2lrX2hkcF9mbHVzaF9jcF9yaW5nX2VtaXQocmRldiwgZmVuY2UtPnJpbmcpOwogfQogCiAvKioKQEAgLTM1NTAsMTUgKzM1ODcsNyBAQAogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGZlbmNlLT5zZXEpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOwogCS8qIEhEUCBmbHVzaCAqLwotCS8qIFdlIHNob3VsZCBiZSB1c2luZyB0aGUgbmV3IFdBSVRfUkVHX01FTSBzcGVjaWFsIG9wIHBhY2tldCBoZXJlCi0JICogYnV0IGl0IGNhdXNlcyB0aGUgQ1AgdG8gaGFuZwotCSAqLwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDMoUEFDS0VUM19XUklURV9EQVRBLCAzKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKFdSSVRFX0RBVEFfRU5HSU5FX1NFTCgwKSB8Ci0JCQkJIFdSSVRFX0RBVEFfRFNUX1NFTCgwKSkpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIEhEUF9NRU1fQ09IRVJFTkNZX0ZMVVNIX0NOVEwgPj4gMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7CisJY2lrX2hkcF9mbHVzaF9jcF9yaW5nX2VtaXQocmRldiwgZmVuY2UtPnJpbmcpOwogfQogCiBib29sIGNpa19zZW1hcGhvcmVfcmluZ19lbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LApAQCAtMzU2Niw4ICszNTk1LDYgQEAKIAkJCSAgICAgc3RydWN0IHJhZGVvbl9zZW1hcGhvcmUgKnNlbWFwaG9yZSwKIAkJCSAgICAgYm9vbCBlbWl0X3dhaXQpCiB7Ci0vKiBUT0RPOiBmaWd1cmUgb3V0IHdoeSBzZW1hcGhvcmUgY2F1c2UgbG9ja3VwcyAqLwotI2lmIDAKIAl1aW50NjRfdCBhZGRyID0gc2VtYXBob3JlLT5ncHVfYWRkcjsKIAl1bnNpZ25lZCBzZWwgPSBlbWl0X3dhaXQgPyBQQUNLRVQzX1NFTV9TRUxfV0FJVCA6IFBBQ0tFVDNfU0VNX1NFTF9TSUdOQUw7CiAKQEAgLTM1NzYsOSArMzYwMyw2IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmZmYpIHwgc2VsKTsKIAogCXJldHVybiB0cnVlOwotI2Vsc2UKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKIH0KIAogLyoqCkBAIC0zODE2LDYgKzM4NDAsOCBAQAogCWlmIChlbmFibGUpCiAJCVdSRUczMihDUF9NRV9DTlRMLCAwKTsKIAllbHNlIHsKKwkJaWYgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFJBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYKQorCQkJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CiAJCVdSRUczMihDUF9NRV9DTlRMLCAoQ1BfTUVfSEFMVCB8IENQX1BGUF9IQUxUIHwgQ1BfQ0VfSEFMVCkpOwogCQlyZGV2LT5yaW5nW1JBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYXS5yZWFkeSA9IGZhbHNlOwogCX0KQEAgLTQwMTQsMTggKzQwNDAsNTAgQEAKIAkJcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF0ucmVhZHkgPSBmYWxzZTsKIAkJcmV0dXJuIHI7CiAJfQorCisJaWYgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFJBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKKwogCXJldHVybiAwOwogfQogCi11MzIgY2lrX2NvbXB1dGVfcmluZ19nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3UzMiBjaWtfZ2Z4X2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKIHsKIAl1MzIgcnB0cjsKIAorCWlmIChyZGV2LT53Yi5lbmFibGVkKQorCQlycHRyID0gcmRldi0+d2Iud2JbcmluZy0+cnB0cl9vZmZzLzRdOworCWVsc2UKKwkJcnB0ciA9IFJSRUczMihDUF9SQjBfUlBUUik7CiAKKwlyZXR1cm4gcnB0cjsKK30KKwordTMyIGNpa19nZnhfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiB3cHRyOworCisJd3B0ciA9IFJSRUczMihDUF9SQjBfV1BUUik7CisKKwlyZXR1cm4gd3B0cjsKK30KKwordm9pZCBjaWtfZ2Z4X3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCit7CisJV1JFRzMyKENQX1JCMF9XUFRSLCByaW5nLT53cHRyKTsKKwkodm9pZClSUkVHMzIoQ1BfUkIwX1dQVFIpOworfQorCit1MzIgY2lrX2NvbXB1dGVfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiBycHRyOwogCiAJaWYgKHJkZXYtPndiLmVuYWJsZWQpIHsKLQkJcnB0ciA9IGxlMzJfdG9fY3B1KHJkZXYtPndiLndiW3JpbmctPnJwdHJfb2Zmcy80XSk7CisJCXJwdHIgPSByZGV2LT53Yi53YltyaW5nLT5ycHRyX29mZnMvNF07CiAJfSBlbHNlIHsKIAkJbXV0ZXhfbG9jaygmcmRldi0+c3JibV9tdXRleCk7CiAJCWNpa19zcmJtX3NlbGVjdChyZGV2LCByaW5nLT5tZSwgcmluZy0+cGlwZSwgcmluZy0+cXVldWUsIDApOwpAQCAtNDAzNywxMyArNDA5NSwxNCBAQAogCXJldHVybiBycHRyOwogfQogCi11MzIgY2lrX2NvbXB1dGVfcmluZ19nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3UzMiBjaWtfY29tcHV0ZV9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCiB7CiAJdTMyIHdwdHI7CiAKIAlpZiAocmRldi0+d2IuZW5hYmxlZCkgewotCQl3cHRyID0gbGUzMl90b19jcHUocmRldi0+d2Iud2JbcmluZy0+d3B0cl9vZmZzLzRdKTsKKwkJLyogWFhYIGNoZWNrIGlmIHN3YXBwaW5nIGlzIG5lY2Vzc2FyeSBvbiBCRSAqLworCQl3cHRyID0gcmRldi0+d2Iud2JbcmluZy0+d3B0cl9vZmZzLzRdOwogCX0gZWxzZSB7CiAJCW11dGV4X2xvY2soJnJkZXYtPnNyYm1fbXV0ZXgpOwogCQljaWtfc3JibV9zZWxlY3QocmRldiwgcmluZy0+bWUsIHJpbmctPnBpcGUsIHJpbmctPnF1ZXVlLCAwKTsKQEAgLTQwNTUsMTAgKzQxMTQsMTEgQEAKIAlyZXR1cm4gd3B0cjsKIH0KIAotdm9pZCBjaWtfY29tcHV0ZV9yaW5nX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3ZvaWQgY2lrX2NvbXB1dGVfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKIHsKLQlyZGV2LT53Yi53YltyaW5nLT53cHRyX29mZnMvNF0gPSBjcHVfdG9fbGUzMihyaW5nLT53cHRyKTsKKwkvKiBYWFggY2hlY2sgaWYgc3dhcHBpbmcgaXMgbmVjZXNzYXJ5IG9uIEJFICovCisJcmRldi0+d2Iud2JbcmluZy0+d3B0cl9vZmZzLzRdID0gcmluZy0+d3B0cjsKIAlXRE9PUkJFTEwzMihyaW5nLT5kb29yYmVsbF9pbmRleCwgcmluZy0+d3B0cik7CiB9CiAKQEAgLTQ4NTIsNiArNDkxMiwxNjAgQEAKIAljaWtfcHJpbnRfZ3B1X3N0YXR1c19yZWdzKHJkZXYpOwogfQogCitzdHJ1Y3Qga3ZfcmVzZXRfc2F2ZV9yZWdzIHsKKwl1MzIgZ21jb25fcmVuZ19leGVjdXRlOworCXUzMiBnbWNvbl9taXNjOworCXUzMiBnbWNvbl9taXNjMzsKK307CisKK3N0YXRpYyB2b2lkIGt2X3NhdmVfcmVnc19mb3JfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJICAgc3RydWN0IGt2X3Jlc2V0X3NhdmVfcmVncyAqc2F2ZSkKK3sKKwlzYXZlLT5nbWNvbl9yZW5nX2V4ZWN1dGUgPSBSUkVHMzIoR01DT05fUkVOR19FWEVDVVRFKTsKKwlzYXZlLT5nbWNvbl9taXNjID0gUlJFRzMyKEdNQ09OX01JU0MpOworCXNhdmUtPmdtY29uX21pc2MzID0gUlJFRzMyKEdNQ09OX01JU0MzKTsKKworCVdSRUczMihHTUNPTl9SRU5HX0VYRUNVVEUsIHNhdmUtPmdtY29uX3JlbmdfZXhlY3V0ZSAmIH5SRU5HX0VYRUNVVEVfT05fUFdSX1VQKTsKKwlXUkVHMzIoR01DT05fTUlTQywgc2F2ZS0+Z21jb25fbWlzYyAmIH4oUkVOR19FWEVDVVRFX09OX1JFR19VUERBVEUgfAorCQkJCQkJU1RDVFJMX1NUVVRURVJfRU4pKTsKK30KKworc3RhdGljIHZvaWQga3ZfcmVzdG9yZV9yZWdzX2Zvcl9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQkgICAgICBzdHJ1Y3Qga3ZfcmVzZXRfc2F2ZV9yZWdzICpzYXZlKQoreworCWludCBpOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAwKTsKKwlXUkVHMzIoR01DT05fUEdGU01fQ09ORklHLCAweDIwMDAxMGZmKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCVdSRUczMihHTUNPTl9QR0ZTTV9XUklURSwgMCk7CisKKwlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCVdSRUczMihHTUNPTl9QR0ZTTV9DT05GSUcsIDB4MzAwMDEwZmYpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAwKTsKKworCVdSRUczMihHTUNPTl9QR0ZTTV9XUklURSwgMHgyMTAwMDApOworCVdSRUczMihHTUNPTl9QR0ZTTV9DT05GSUcsIDB4YTAwMDEwZmYpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAwKTsKKworCVdSRUczMihHTUNPTl9QR0ZTTV9XUklURSwgMHgyMTAwMyk7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHhiMDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDJiMDApOworCVdSRUczMihHTUNPTl9QR0ZTTV9DT05GSUcsIDB4YzAwMDEwZmYpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAwKTsKKworCVdSRUczMihHTUNPTl9QR0ZTTV9XUklURSwgMCk7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHhkMDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDQyMDAwMCk7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHgxMDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDEyMDIwMik7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHg1MDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDNlM2UzNik7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHg2MDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDM3M2YzZSk7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHg3MDAwMTBmZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlXUkVHMzIoR01DT05fUEdGU01fV1JJVEUsIDApOworCisJV1JFRzMyKEdNQ09OX1BHRlNNX1dSSVRFLCAweDNlMTMzMik7CisJV1JFRzMyKEdNQ09OX1BHRlNNX0NPTkZJRywgMHhlMDAwMTBmZik7CisKKwlXUkVHMzIoR01DT05fTUlTQzMsIHNhdmUtPmdtY29uX21pc2MzKTsKKwlXUkVHMzIoR01DT05fTUlTQywgc2F2ZS0+Z21jb25fbWlzYyk7CisJV1JFRzMyKEdNQ09OX1JFTkdfRVhFQ1VURSwgc2F2ZS0+Z21jb25fcmVuZ19leGVjdXRlKTsKK30KKworc3RhdGljIHZvaWQgY2lrX2dwdV9wY2lfY29uZmlnX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBldmVyZ3JlZW5fbWNfc2F2ZSBzYXZlOworCXN0cnVjdCBrdl9yZXNldF9zYXZlX3JlZ3Mga3Zfc2F2ZSA9IHsgMCB9OworCXUzMiB0bXAsIGk7CisKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICJHUFUgcGNpIGNvbmZpZyByZXNldFxuIik7CisKKwkvKiBkaXNhYmxlIGRwbT8gKi8KKworCS8qIGRpc2FibGUgY2cvcGcgKi8KKwljaWtfZmluaV9wZyhyZGV2KTsKKwljaWtfZmluaV9jZyhyZGV2KTsKKworCS8qIERpc2FibGUgR0ZYIHBhcnNpbmcvcHJlZmV0Y2hpbmcgKi8KKwlXUkVHMzIoQ1BfTUVfQ05UTCwgQ1BfTUVfSEFMVCB8IENQX1BGUF9IQUxUIHwgQ1BfQ0VfSEFMVCk7CisKKwkvKiBEaXNhYmxlIE1FQyBwYXJzaW5nL3ByZWZldGNoaW5nICovCisJV1JFRzMyKENQX01FQ19DTlRMLCBNRUNfTUUxX0hBTFQgfCBNRUNfTUUyX0hBTFQpOworCisJLyogc2RtYTAgKi8KKwl0bXAgPSBSUkVHMzIoU0RNQTBfTUVfQ05UTCArIFNETUEwX1JFR0lTVEVSX09GRlNFVCk7CisJdG1wIHw9IFNETUFfSEFMVDsKKwlXUkVHMzIoU0RNQTBfTUVfQ05UTCArIFNETUEwX1JFR0lTVEVSX09GRlNFVCwgdG1wKTsKKwkvKiBzZG1hMSAqLworCXRtcCA9IFJSRUczMihTRE1BMF9NRV9DTlRMICsgU0RNQTFfUkVHSVNURVJfT0ZGU0VUKTsKKwl0bXAgfD0gU0RNQV9IQUxUOworCVdSRUczMihTRE1BMF9NRV9DTlRMICsgU0RNQTFfUkVHSVNURVJfT0ZGU0VULCB0bXApOworCS8qIFhYWCBvdGhlciBlbmdpbmVzPyAqLworCisJLyogaGFsdCB0aGUgcmxjLCBkaXNhYmxlIGNwIGludGVybmFsIGludHMgKi8KKwljaWtfcmxjX3N0b3AocmRldik7CisKKwl1ZGVsYXkoNTApOworCisJLyogZGlzYWJsZSBtZW0gYWNjZXNzICovCisJZXZlcmdyZWVuX21jX3N0b3AocmRldiwgJnNhdmUpOworCWlmIChldmVyZ3JlZW5fbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IGZvciBNQyBpZGxlIHRpbWVkIG91dCAhXG4iKTsKKwl9CisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQorCQlrdl9zYXZlX3JlZ3NfZm9yX3Jlc2V0KHJkZXYsICZrdl9zYXZlKTsKKworCS8qIGRpc2FibGUgQk0gKi8KKwlwY2lfY2xlYXJfbWFzdGVyKHJkZXYtPnBkZXYpOworCS8qIHJlc2V0ICovCisJcmFkZW9uX3BjaV9jb25maWdfcmVzZXQocmRldik7CisKKwl1ZGVsYXkoMTAwKTsKKworCS8qIHdhaXQgZm9yIGFzaWMgdG8gY29tZSBvdXQgb2YgcmVzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKKwkJaWYgKFJSRUczMihDT05GSUdfTUVNU0laRSkgIT0gMHhmZmZmZmZmZikKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJLyogZG9lcyBhc2ljIGluaXQgbmVlZCB0byBiZSBydW4gZmlyc3Q/Pz8gKi8KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQorCQlrdl9yZXN0b3JlX3JlZ3NfZm9yX3Jlc2V0KHJkZXYsICZrdl9zYXZlKTsKK30KKwogLyoqCiAgKiBjaWtfYXNpY19yZXNldCAtIHNvZnQgcmVzZXQgR1BVCiAgKgpAQCAtNDg3MCwxMCArNTA4NCwxNyBAQAogCWlmIChyZXNldF9tYXNrKQogCQlyNjAwX3NldF9iaW9zX3NjcmF0Y2hfZW5naW5lX2h1bmcocmRldiwgdHJ1ZSk7CiAKKwkvKiB0cnkgc29mdCByZXNldCAqLwogCWNpa19ncHVfc29mdF9yZXNldChyZGV2LCByZXNldF9tYXNrKTsKIAogCXJlc2V0X21hc2sgPSBjaWtfZ3B1X2NoZWNrX3NvZnRfcmVzZXQocmRldik7CiAKKwkvKiB0cnkgcGNpIGNvbmZpZyByZXNldCAqLworCWlmIChyZXNldF9tYXNrICYmIHJhZGVvbl9oYXJkX3Jlc2V0KQorCQljaWtfZ3B1X3BjaV9jb25maWdfcmVzZXQocmRldik7CisKKwlyZXNldF9tYXNrID0gY2lrX2dwdV9jaGVja19zb2Z0X3Jlc2V0KHJkZXYpOworCiAJaWYgKCFyZXNldF9tYXNrKQogCQlyNjAwX3NldF9iaW9zX3NjcmF0Y2hfZW5naW5lX2h1bmcocmRldiwgZmFsc2UpOwogCkBAIC01MTM4LDIwICs1MzU5LDYgQEAKIAkJCQlXUklURV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9JTlRFUlJVUFQgfAogCQkJCVdSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQpOwogCi0JLyogVEMgY2FjaGUgc2V0dXAgPz8/ICovCi0JV1JFRzMyKFRDX0NGR19MMV9MT0FEX1BPTElDWTAsIDApOwotCVdSRUczMihUQ19DRkdfTDFfTE9BRF9QT0xJQ1kxLCAwKTsKLQlXUkVHMzIoVENfQ0ZHX0wxX1NUT1JFX1BPTElDWSwgMCk7Ci0KLQlXUkVHMzIoVENfQ0ZHX0wyX0xPQURfUE9MSUNZMCwgMCk7Ci0JV1JFRzMyKFRDX0NGR19MMl9MT0FEX1BPTElDWTEsIDApOwotCVdSRUczMihUQ19DRkdfTDJfU1RPUkVfUE9MSUNZMCwgMCk7Ci0JV1JFRzMyKFRDX0NGR19MMl9TVE9SRV9QT0xJQ1kxLCAwKTsKLQlXUkVHMzIoVENfQ0ZHX0wyX0FUT01JQ19QT0xJQ1ksIDApOwotCi0JV1JFRzMyKFRDX0NGR19MMV9WT0xBVElMRSwgMCk7Ci0JV1JFRzMyKFRDX0NGR19MMl9WT0xBVElMRSwgMCk7Ci0KIAlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfS0FWRVJJKSB7CiAJCXUzMiB0bXAgPSBSUkVHMzIoQ0hVQl9DT05UUk9MKTsKIAkJdG1wICY9IH5CWVBBU1NfVk07CkBAIC01MzY3LDE2ICs1NTc0LDcgQEAKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBWTUlEKDApKTsKIAogCS8qIEhEUCBmbHVzaCAqLwotCS8qIFdlIHNob3VsZCBiZSB1c2luZyB0aGUgV0FJVF9SRUdfTUVNIHBhY2tldCBoZXJlIGxpa2UgaW4KLQkgKiBjaWtfZmVuY2VfcmluZ19lbWl0KCksIGJ1dCBpdCBjYXVzZXMgdGhlIENQIHRvIGhhbmcgaW4gdGhpcwotCSAqIGNvbnRleHQuLi4KLQkgKi8KLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfV1JJVEVfREFUQSwgMykpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIChXUklURV9EQVRBX0VOR0lORV9TRUwoMCkgfAotCQkJCSBXUklURV9EQVRBX0RTVF9TRUwoMCkpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBIRFBfTUVNX0NPSEVSRU5DWV9GTFVTSF9DTlRMID4+IDIpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOworCWNpa19oZHBfZmx1c2hfY3BfcmluZ19lbWl0KHJkZXYsIHJpZHgpOwogCiAJLyogYml0cyAwLTE1IGFyZSB0aGUgVk0gY29udGV4dHMwLTE1ICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX1dSSVRFX0RBVEEsIDMpKTsKQEAgLTc1MDMsMjYgKzc3MDEsNyBAQAogCiAJY2lrX21jX3Byb2dyYW0ocmRldik7CiAKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7Ci0JCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+Y2VfZncgfHwKLQkJICAgICFyZGV2LT5tZWNfZncgfHwgIXJkZXYtPnNkbWFfZncgfHwgIXJkZXYtPnJsY19mdykgewotCQkJciA9IGNpa19pbml0X21pY3JvY29kZShyZGV2KTsKLQkJCWlmIChyKSB7Ci0JCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOwotCQkJCXJldHVybiByOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5jZV9mdyB8fAotCQkgICAgIXJkZXYtPm1lY19mdyB8fCAhcmRldi0+c2RtYV9mdyB8fCAhcmRldi0+cmxjX2Z3IHx8Ci0JCSAgICAhcmRldi0+bWNfZncpIHsKLQkJCXIgPSBjaWtfaW5pdF9taWNyb2NvZGUocmRldik7Ci0JCQlpZiAocikgewotCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQotCisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSAmJiAhcmRldi0+cG0uZHBtX2VuYWJsZWQpIHsKIAkJciA9IGNpX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOwogCQlpZiAocikgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBNQyBmaXJtd2FyZSFcbiIpOwpAQCAtNzYyNyw3ICs3ODA2LDYgQEAKIAogCXJpbmcgPSAmcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF07CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZy0+cmluZ19zaXplLCBSQURFT05fV0JfQ1BfUlBUUl9PRkZTRVQsCi0JCQkgICAgIENQX1JCMF9SUFRSLCBDUF9SQjBfV1BUUiwKIAkJCSAgICAgUEFDS0VUMyhQQUNLRVQzX05PUCwgMHgzRkZGKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtNzYzNiw3ICs3ODE0LDYgQEAKIAkvKiB0eXBlLTIgcGFja2V0cyBhcmUgZGVwcmVjYXRlZCBvbiBNRUMsIHVzZSB0eXBlLTMgaW5zdGVhZCAqLwogCXJpbmcgPSAmcmRldi0+cmluZ1tDQVlNQU5fUklOR19UWVBFX0NQMV9JTkRFWF07CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZy0+cmluZ19zaXplLCBSQURFT05fV0JfQ1AxX1JQVFJfT0ZGU0VULAotCQkJICAgICBDUF9IUURfUFFfUlBUUiwgQ1BfSFFEX1BRX1dQVFIsCiAJCQkgICAgIFBBQ0tFVDMoUEFDS0VUM19OT1AsIDB4M0ZGRikpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTc2NDgsNyArNzgyNSw2IEBACiAJLyogdHlwZS0yIHBhY2tldHMgYXJlIGRlcHJlY2F0ZWQgb24gTUVDLCB1c2UgdHlwZS0zIGluc3RlYWQgKi8KIAlyaW5nID0gJnJkZXYtPnJpbmdbQ0FZTUFOX1JJTkdfVFlQRV9DUDJfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUkFERU9OX1dCX0NQMl9SUFRSX09GRlNFVCwKLQkJCSAgICAgQ1BfSFFEX1BRX1JQVFIsIENQX0hRRF9QUV9XUFRSLAogCQkJICAgICBQQUNLRVQzKFBBQ0tFVDNfTk9QLCAweDNGRkYpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CkBAIC03NjYwLDE2ICs3ODM2LDEyIEBACiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYXTsKIAlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIFI2MDBfV0JfRE1BX1JQVFJfT0ZGU0VULAotCQkJICAgICBTRE1BMF9HRlhfUkJfUlBUUiArIFNETUEwX1JFR0lTVEVSX09GRlNFVCwKLQkJCSAgICAgU0RNQTBfR0ZYX1JCX1dQVFIgKyBTRE1BMF9SRUdJU1RFUl9PRkZTRVQsCiAJCQkgICAgIFNETUFfUEFDS0VUKFNETUFfT1BDT0RFX05PUCwgMCwgMCkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCXJpbmcgPSAmcmRldi0+cmluZ1tDQVlNQU5fUklOR19UWVBFX0RNQTFfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgQ0FZTUFOX1dCX0RNQTFfUlBUUl9PRkZTRVQsCi0JCQkgICAgIFNETUEwX0dGWF9SQl9SUFRSICsgU0RNQTFfUkVHSVNURVJfT0ZGU0VULAotCQkJICAgICBTRE1BMF9HRlhfUkJfV1BUUiArIFNETUExX1JFR0lTVEVSX09GRlNFVCwKIAkJCSAgICAgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfTk9QLCAwLCAwKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtNzY4NSw3ICs3ODU3LDYgQEAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUjYwMF9SSU5HX1RZUEVfVVZEX0lOREVYXTsKIAlpZiAocmluZy0+cmluZ19zaXplKSB7CiAJCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgMCwKLQkJCQkgICAgIFVWRF9SQkNfUkJfUlBUUiwgVVZEX1JCQ19SQl9XUFRSLAogCQkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCQlpZiAoIXIpCiAJCQlyID0gdXZkX3YxXzBfaW5pdChyZGV2KTsKQEAgLTc3MzEsNiArNzkwMiw4IEBACiAJLyogaW5pdCBnb2xkZW4gcmVnaXN0ZXJzICovCiAJY2lrX2luaXRfZ29sZGVuX3JlZ2lzdGVycyhyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gY2lrX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTc3NTQsNiArNzkyNyw3IEBACiAgKi8KIGludCBjaWtfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fc3VzcGVuZChyZGV2KTsKIAlkY2U2X2F1ZGlvX2ZpbmkocmRldik7CiAJcmFkZW9uX3ZtX21hbmFnZXJfZmluaShyZGV2KTsKIAljaWtfY3BfZW5hYmxlKHJkZXYsIGZhbHNlKTsKQEAgLTc4MzUsNiArODAwOSwzMCBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAorCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKKwkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5jZV9mdyB8fAorCQkgICAgIXJkZXYtPm1lY19mdyB8fCAhcmRldi0+c2RtYV9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7CisJCQlyID0gY2lrX2luaXRfbWljcm9jb2RlKHJkZXYpOworCQkJaWYgKHIpIHsKKwkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPmNlX2Z3IHx8CisJCSAgICAhcmRldi0+bWVjX2Z3IHx8ICFyZGV2LT5zZG1hX2Z3IHx8ICFyZGV2LT5ybGNfZncgfHwKKwkJICAgICFyZGV2LT5tY19mdykgeworCQkJciA9IGNpa19pbml0X21pY3JvY29kZShyZGV2KTsKKwkJCWlmIChyKSB7CisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCisJcmFkZW9uX3BtX2luaXQocmRldik7CisKIAlyaW5nID0gJnJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdOwogCXJpbmctPnJpbmdfb2JqID0gTlVMTDsKIAlyNjAwX3JpbmdfaW5pdChyZGV2LCByaW5nLCAxMDI0ICogMTAyNCk7CkBAIC03OTE1LDYgKzgxMTMsNyBAQAogICovCiB2b2lkIGNpa19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9maW5pKHJkZXYpOwogCWNpa19jcF9maW5pKHJkZXYpOwogCWNpa19zZG1hX2ZpbmkocmRldik7CiAJY2lrX2ZpbmlfcGcocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa19zZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa19zZG1hLmMKaW5kZXggZDA4YjgzYy4uMWVjYjNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWtfc2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrX3NkbWEuYwpAQCAtNTIsNiArNTIsNzUgQEAKICAqLwogCiAvKioKKyAqIGNpa19zZG1hX2dldF9ycHRyIC0gZ2V0IHRoZSBjdXJyZW50IHJlYWQgcG9pbnRlcgorICoKKyAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKKyAqIEByaW5nOiByYWRlb24gcmluZyBwb2ludGVyCisgKgorICogR2V0IHRoZSBjdXJyZW50IHJwdHIgZnJvbSB0aGUgaGFyZHdhcmUgKENJSyspLgorICovCit1aW50MzJfdCBjaWtfc2RtYV9nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwl1MzIgcnB0ciwgcmVnOworCisJaWYgKHJkZXYtPndiLmVuYWJsZWQpIHsKKwkJcnB0ciA9IHJkZXYtPndiLndiW3JpbmctPnJwdHJfb2Zmcy80XTsKKwl9IGVsc2UgeworCQlpZiAocmluZy0+aWR4ID09IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCkKKwkJCXJlZyA9IFNETUEwX0dGWF9SQl9SUFRSICsgU0RNQTBfUkVHSVNURVJfT0ZGU0VUOworCQllbHNlCisJCQlyZWcgPSBTRE1BMF9HRlhfUkJfUlBUUiArIFNETUExX1JFR0lTVEVSX09GRlNFVDsKKworCQlycHRyID0gUlJFRzMyKHJlZyk7CisJfQorCisJcmV0dXJuIChycHRyICYgMHgzZmZmYykgPj4gMjsKK30KKworLyoqCisgKiBjaWtfc2RtYV9nZXRfd3B0ciAtIGdldCB0aGUgY3VycmVudCB3cml0ZSBwb2ludGVyCisgKgorICogQHJkZXY6IHJhZGVvbl9kZXZpY2UgcG9pbnRlcgorICogQHJpbmc6IHJhZGVvbiByaW5nIHBvaW50ZXIKKyAqCisgKiBHZXQgdGhlIGN1cnJlbnQgd3B0ciBmcm9tIHRoZSBoYXJkd2FyZSAoQ0lLKykuCisgKi8KK3VpbnQzMl90IGNpa19zZG1hX2dldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiByZWc7CisKKwlpZiAocmluZy0+aWR4ID09IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCkKKwkJcmVnID0gU0RNQTBfR0ZYX1JCX1dQVFIgKyBTRE1BMF9SRUdJU1RFUl9PRkZTRVQ7CisJZWxzZQorCQlyZWcgPSBTRE1BMF9HRlhfUkJfV1BUUiArIFNETUExX1JFR0lTVEVSX09GRlNFVDsKKworCXJldHVybiAoUlJFRzMyKHJlZykgJiAweDNmZmZjKSA+PiAyOworfQorCisvKioKKyAqIGNpa19zZG1hX3NldF93cHRyIC0gY29tbWl0IHRoZSB3cml0ZSBwb2ludGVyCisgKgorICogQHJkZXY6IHJhZGVvbl9kZXZpY2UgcG9pbnRlcgorICogQHJpbmc6IHJhZGVvbiByaW5nIHBvaW50ZXIKKyAqCisgKiBXcml0ZSB0aGUgd3B0ciBiYWNrIHRvIHRoZSBoYXJkd2FyZSAoQ0lLKykuCisgKi8KK3ZvaWQgY2lrX3NkbWFfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCit7CisJdTMyIHJlZzsKKworCWlmIChyaW5nLT5pZHggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKQorCQlyZWcgPSBTRE1BMF9HRlhfUkJfV1BUUiArIFNETUEwX1JFR0lTVEVSX09GRlNFVDsKKwllbHNlCisJCXJlZyA9IFNETUEwX0dGWF9SQl9XUFRSICsgU0RNQTFfUkVHSVNURVJfT0ZGU0VUOworCisJV1JFRzMyKHJlZywgKHJpbmctPndwdHIgPDwgMikgJiAweDNmZmZjKTsKK30KKworLyoqCiAgKiBjaWtfc2RtYV9yaW5nX2liX2V4ZWN1dGUgLSBTY2hlZHVsZSBhbiBJQiBvbiB0aGUgRE1BIGVuZ2luZQogICoKICAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKQEAgLTg4LDYgKzE1NywzNSBAQAogfQogCiAvKioKKyAqIGNpa19zZG1hX2hkcF9mbHVzaF9yaW5nX2VtaXQgLSBlbWl0IGFuIGhkcCBmbHVzaCBvbiB0aGUgRE1BIHJpbmcKKyAqCisgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCisgKiBAcmlkeDogcmFkZW9uIHJpbmcgaW5kZXgKKyAqCisgKiBFbWl0IGFuIGhkcCBmbHVzaCBwYWNrZXQgb24gdGhlIHJlcXVlc3RlZCBETUEgcmluZy4KKyAqLworc3RhdGljIHZvaWQgY2lrX3NkbWFfaGRwX2ZsdXNoX3JpbmdfZW1pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQkJIGludCByaWR4KQoreworCXN0cnVjdCByYWRlb25fcmluZyAqcmluZyA9ICZyZGV2LT5yaW5nW3JpZHhdOworCXUzMiBleHRyYV9iaXRzID0gKFNETUFfUE9MTF9SRUdfTUVNX0VYVFJBX09QKDEpIHwKKwkJCSAgU0RNQV9QT0xMX1JFR19NRU1fRVhUUkFfRlVOQygzKSk7IC8qID09ICovCisJdTMyIHJlZl9hbmRfbWFzazsKKworCWlmIChyaWR4ID09IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCkKKwkJcmVmX2FuZF9tYXNrID0gU0RNQTA7CisJZWxzZQorCQlyZWZfYW5kX21hc2sgPSBTRE1BMTsKKworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFNETUFfUEFDS0VUKFNETUFfT1BDT0RFX1BPTExfUkVHX01FTSwgMCwgZXh0cmFfYml0cykpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIEdQVV9IRFBfRkxVU0hfRE9ORSk7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgR1BVX0hEUF9GTFVTSF9SRVEpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHJlZl9hbmRfbWFzayk7IC8qIHJlZmVyZW5jZSAqLworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHJlZl9hbmRfbWFzayk7IC8qIG1hc2sgKi8KKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCAoMHhmZmYgPDwgMTYpIHwgMTApOyAvKiByZXRyeSBjb3VudCwgcG9sbCBpbnRlcnZhbCAqLworfQorCisvKioKICAqIGNpa19zZG1hX2ZlbmNlX3JpbmdfZW1pdCAtIGVtaXQgYSBmZW5jZSBvbiB0aGUgRE1BIHJpbmcKICAqCiAgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCkBAIC0xMTEsMTIgKzIwOSw3IEBACiAJLyogZ2VuZXJhdGUgYW4gaW50ZXJydXB0ICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfVFJBUCwgMCwgMCkpOwogCS8qIGZsdXNoIEhEUCAqLwotCS8qIFdlIHNob3VsZCBiZSB1c2luZyB0aGUgbmV3IFBPTExfUkVHX01FTSBzcGVjaWFsIG9wIHBhY2tldCBoZXJlCi0JICogYnV0IGl0IGNhdXNlcyBzRE1BIHRvIGhhbmcgc29tZXRpbWVzCi0JICovCi0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfU1JCTV9XUklURSwgMCwgMHhmMDAwKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgSERQX01FTV9DT0hFUkVOQ1lfRkxVU0hfQ05UTCA+PiAyKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAwKTsKKwljaWtfc2RtYV9oZHBfZmx1c2hfcmluZ19lbWl0KHJkZXYsIGZlbmNlLT5yaW5nKTsKIH0KIAogLyoqCkBAIC0xNTcsNyArMjUwLDkgQEAKIAl1MzIgcmJfY250bCwgcmVnX29mZnNldDsKIAlpbnQgaTsKIAotCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUpOworCWlmICgocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKSB8fAorCSAgICAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gQ0FZTUFOX1JJTkdfVFlQRV9ETUExX0lOREVYKSkKKwkJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCWlmIChpID09IDApCkBAIC0yODgsNyArMzgzLDkgQEAKIAkJfQogCX0KIAotCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMucmVhbF92cmFtX3NpemUpOworCWlmICgocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKSB8fAorCSAgICAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gQ0FZTUFOX1JJTkdfVFlQRV9ETUExX0lOREVYKSkKKwkJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NywxMiArODQ0LDcgQEAKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBWTUlEKDApKTsKIAogCS8qIGZsdXNoIEhEUCAqLwotCS8qIFdlIHNob3VsZCBiZSB1c2luZyB0aGUgbmV3IFBPTExfUkVHX01FTSBzcGVjaWFsIG9wIHBhY2tldCBoZXJlCi0JICogYnV0IGl0IGNhdXNlcyBzRE1BIHRvIGhhbmcgc29tZXRpbWVzCi0JICovCi0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfU1JCTV9XUklURSwgMCwgMHhmMDAwKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgSERQX01FTV9DT0hFUkVOQ1lfRkxVU0hfQ05UTCA+PiAyKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAwKTsKKwljaWtfc2RtYV9oZHBfZmx1c2hfcmluZ19lbWl0KHJkZXYsIHJpZHgpOwogCiAJLyogZmx1c2ggVExCICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfU1JCTV9XUklURSwgMCwgMHhmMDAwKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa2QuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrZC5oCmluZGV4IDU5NjRhZjUuLjk4YmFlOWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa2QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa2QuaApAQCAtNzI0LDYgKzcyNCwxNyBAQAogCiAjZGVmaW5lIEFUQ19NSVNDX0NHICAgICAgICAgICAJCQkJMHgzMzUwCiAKKyNkZWZpbmUgR01DT05fUkVOR19FWEVDVVRFCQkJCTB4MzUwOAorI2RlZmluZSAJUkVOR19FWEVDVVRFX09OX1BXUl9VUAkJCSgxIDw8IDApCisjZGVmaW5lIEdNQ09OX01JU0MJCQkJCTB4MzUwYworI2RlZmluZSAJUkVOR19FWEVDVVRFX09OX1JFR19VUERBVEUJCSgxIDw8IDExKQorI2RlZmluZSAJU1RDVFJMX1NUVVRURVJfRU4JCQkoMSA8PCAxNikKKworI2RlZmluZSBHTUNPTl9QR0ZTTV9DT05GSUcJCQkJMHgzNTM4CisjZGVmaW5lIEdNQ09OX1BHRlNNX1dSSVRFCQkJCTB4MzUzYworI2RlZmluZSBHTUNPTl9QR0ZTTV9SRUFECQkJCTB4MzU0MAorI2RlZmluZSBHTUNPTl9NSVNDMwkJCQkJMHgzNTQ0CisKICNkZWZpbmUgTUNfU0VRX0NOVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MDAKICMgICAgICAgZGVmaW5lIENBQ19FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMSkKICNkZWZpbmUgTUNfU0VRX0c1UERYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY3lwcmVzc19kcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY3lwcmVzc19kcG0uYwppbmRleCA5MjBlMWU0Li5jZjc4M2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2N5cHJlc3NfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jeXByZXNzX2RwbS5jCkBAIC0xOTA1LDIxICsxOTA1LDYgQEAKIAlpZiAocGktPm1nX2Nsb2NrX2dhdGluZykKIAkJY3lwcmVzc19tZ19jbG9ja19nYXRpbmdfZW5hYmxlKHJkZXYsIHRydWUpOwogCi0JaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQgJiYKLQkgICAgcjYwMF9pc19pbnRlcm5hbF90aGVybWFsX3NlbnNvcihyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlKSkgewotCQlQUFNNQ19SZXN1bHQgcmVzdWx0OwotCi0JCXJldCA9IHJ2NzcwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHJkZXYsIFI2MDBfVEVNUF9SQU5HRV9NSU4sIFI2MDBfVEVNUF9SQU5HRV9NQVgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJcmRldi0+aXJxLmRwbV90aGVybWFsID0gdHJ1ZTsKLQkJcmFkZW9uX2lycV9zZXQocmRldik7Ci0JCXJlc3VsdCA9IHJ2NzcwX3NlbmRfbXNnX3RvX3NtYyhyZGV2LCBQUFNNQ19NU0dfRW5hYmxlVGhlcm1hbEludGVycnVwdCk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCQlEUk1fREVCVUdfS01TKCJDb3VsZCBub3QgZW5hYmxlIHRoZXJtYWwgaW50ZXJydXB0cy5cbiIpOwotCX0KLQogCXJ2NzcwX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwppbmRleCA5NzAyZTU1Li5mMmI5ZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKQEAgLTE0Niw2ICsxNDYsNyBAQAogZXh0ZXJuIHZvaWQgc2lfZ2V0X2NzYl9idWZmZXIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHZvbGF0aWxlIHUzMiAqYnVmZmVyKTsKIGV4dGVybiB1MzIgY2lrX2dldF9jc2Jfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBjaWtfZ2V0X2NzYl9idWZmZXIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHZvbGF0aWxlIHUzMiAqYnVmZmVyKTsKK2V4dGVybiB2b2lkIHJ2NzcwX3NldF9jbGtfYnlwYXNzX21vZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiBzdGF0aWMgY29uc3QgdTMyIGV2ZXJncmVlbl9nb2xkZW5fcmVnaXN0ZXJzW10gPQogewpAQCAtMzg2Nyw2ICszODY4LDQ4IEBACiAJZXZlcmdyZWVuX3ByaW50X2dwdV9zdGF0dXNfcmVncyhyZGV2KTsKIH0KIAordm9pZCBldmVyZ3JlZW5fZ3B1X3BjaV9jb25maWdfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGV2ZXJncmVlbl9tY19zYXZlIHNhdmU7CisJdTMyIHRtcCwgaTsKKworCWRldl9pbmZvKHJkZXYtPmRldiwgIkdQVSBwY2kgY29uZmlnIHJlc2V0XG4iKTsKKworCS8qIGRpc2FibGUgZHBtPyAqLworCisJLyogRGlzYWJsZSBDUCBwYXJzaW5nL3ByZWZldGNoaW5nICovCisJV1JFRzMyKENQX01FX0NOVEwsIENQX01FX0hBTFQgfCBDUF9QRlBfSEFMVCk7CisJdWRlbGF5KDUwKTsKKwkvKiBEaXNhYmxlIERNQSAqLworCXRtcCA9IFJSRUczMihETUFfUkJfQ05UTCk7CisJdG1wICY9IH5ETUFfUkJfRU5BQkxFOworCVdSRUczMihETUFfUkJfQ05UTCwgdG1wKTsKKwkvKiBYWFggb3RoZXIgZW5naW5lcz8gKi8KKworCS8qIGhhbHQgdGhlIHJsYyAqLworCXI2MDBfcmxjX3N0b3AocmRldik7CisKKwl1ZGVsYXkoNTApOworCisJLyogc2V0IG1jbGsvc2NsayB0byBieXBhc3MgKi8KKwlydjc3MF9zZXRfY2xrX2J5cGFzc19tb2RlKHJkZXYpOworCS8qIGRpc2FibGUgQk0gKi8KKwlwY2lfY2xlYXJfbWFzdGVyKHJkZXYtPnBkZXYpOworCS8qIGRpc2FibGUgbWVtIGFjY2VzcyAqLworCWV2ZXJncmVlbl9tY19zdG9wKHJkZXYsICZzYXZlKTsKKwlpZiAoZXZlcmdyZWVuX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBmb3IgTUMgaWRsZSB0aW1lZCBvdXQgIVxuIik7CisJfQorCS8qIHJlc2V0ICovCisJcmFkZW9uX3BjaV9jb25maWdfcmVzZXQocmRldik7CisJLyogd2FpdCBmb3IgYXNpYyB0byBjb21lIG91dCBvZiByZXNldCAqLworCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoUlJFRzMyKENPTkZJR19NRU1TSVpFKSAhPSAweGZmZmZmZmZmKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9Cit9CisKIGludCBldmVyZ3JlZW5fYXNpY19yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgcmVzZXRfbWFzazsKQEAgLTM4NzYsMTAgKzM5MTksMTcgQEAKIAlpZiAocmVzZXRfbWFzaykKIAkJcjYwMF9zZXRfYmlvc19zY3JhdGNoX2VuZ2luZV9odW5nKHJkZXYsIHRydWUpOwogCisJLyogdHJ5IHNvZnQgcmVzZXQgKi8KIAlldmVyZ3JlZW5fZ3B1X3NvZnRfcmVzZXQocmRldiwgcmVzZXRfbWFzayk7CiAKIAlyZXNldF9tYXNrID0gZXZlcmdyZWVuX2dwdV9jaGVja19zb2Z0X3Jlc2V0KHJkZXYpOwogCisJLyogdHJ5IHBjaSBjb25maWcgcmVzZXQgKi8KKwlpZiAocmVzZXRfbWFzayAmJiByYWRlb25faGFyZF9yZXNldCkKKwkJZXZlcmdyZWVuX2dwdV9wY2lfY29uZmlnX3Jlc2V0KHJkZXYpOworCisJcmVzZXRfbWFzayA9IGV2ZXJncmVlbl9ncHVfY2hlY2tfc29mdF9yZXNldChyZGV2KTsKKwogCWlmICghcmVzZXRfbWFzaykKIAkJcjYwMF9zZXRfYmlvc19zY3JhdGNoX2VuZ2luZV9odW5nKHJkZXYsIGZhbHNlKTsKIApAQCAtNDI5OCw4ICs0MzQ4LDggQEAKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CiAKLQkvKiBvbmx5IG9uZSBEQUMgb24gRENFNiAqLwotCWlmICghQVNJQ19JU19EQ0U2KHJkZXYpKQorCS8qIG9ubHkgb25lIERBQyBvbiBEQ0U1ICovCisJaWYgKCFBU0lDX0lTX0RDRTUocmRldikpCiAJCVdSRUczMihEQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwogCVdSRUczMihEQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwogCkBAIC01MTA5LDI3ICs1MTU5LDEyIEBACiAKIAlldmVyZ3JlZW5fbWNfcHJvZ3JhbShyZGV2KTsKIAotCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKLQkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7Ci0JCQlyID0gbmlfaW5pdF9taWNyb2NvZGUocmRldik7Ci0JCQlpZiAocikgewotCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQorCWlmIChBU0lDX0lTX0RDRTUocmRldikgJiYgIXJkZXYtPnBtLmRwbV9lbmFibGVkKSB7CiAJCXIgPSBuaV9tY19sb2FkX21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKIAkJCXJldHVybiByOwogCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKLQkJCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOwotCQkJaWYgKHIpIHsKLQkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7Ci0JCQkJcmV0dXJuIHI7Ci0JCQl9Ci0JCX0KIAl9CiAKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CkBAIC01MTk5LDE0ICs1MjM0LDEyIEBACiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUkFERU9OX1dCX0NQX1JQVFJfT0ZGU0VULAotCQkJICAgICBSNjAwX0NQX1JCX1JQVFIsIFI2MDBfQ1BfUkJfV1BUUiwKIAkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCXJpbmcgPSAmcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUjYwMF9XQl9ETUFfUlBUUl9PRkZTRVQsCi0JCQkgICAgIERNQV9SQl9SUFRSLCBETUFfUkJfV1BUUiwKIAkJCSAgICAgRE1BX1BBQ0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTUyMjQsNyArNTI1Nyw2IEBACiAJcmluZyA9ICZyZGV2LT5yaW5nW1I2MDBfUklOR19UWVBFX1VWRF9JTkRFWF07CiAJaWYgKHJpbmctPnJpbmdfc2l6ZSkgewogCQlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIDAsCi0JCQkJICAgICBVVkRfUkJDX1JCX1JQVFIsIFVWRF9SQkNfUkJfV1BUUiwKIAkJCQkgICAgIFJBREVPTl9DUF9QQUNLRVQyKTsKIAkJaWYgKCFyKQogCQkJciA9IHV2ZF92MV8wX2luaXQocmRldik7CkBAIC01MjY3LDYgKzUyOTksOCBAQAogCS8qIGluaXQgZ29sZGVuIHJlZ2lzdGVycyAqLwogCWV2ZXJncmVlbl9pbml0X2dvbGRlbl9yZWdpc3RlcnMocmRldik7CiAKKwlyYWRlb25fcG1fcmVzdW1lKHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IGV2ZXJncmVlbl9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC01MjgxLDYgKzUzMTUsNyBAQAogCiBpbnQgZXZlcmdyZWVuX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX3N1c3BlbmQocmRldik7CiAJcjYwMF9hdWRpb19maW5pKHJkZXYpOwogCXV2ZF92MV8wX2ZpbmkocmRldik7CiAJcmFkZW9uX3V2ZF9zdXNwZW5kKHJkZXYpOwpAQCAtNTM1Nyw2ICs1MzkyLDI3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdyB8fCAhcmRldi0+bWNfZncpIHsKKwkJCXIgPSBuaV9pbml0X21pY3JvY29kZShyZGV2KTsKKwkJCWlmIChyKSB7CisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKKwkJCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOworCQkJaWYgKHIpIHsKKwkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlyYWRlb25fcG1faW5pdChyZGV2KTsKKwogCXJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdLnJpbmdfb2JqID0gTlVMTDsKIAlyNjAwX3JpbmdfaW5pdChyZGV2LCAmcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF0sIDEwMjQgKiAxMDI0KTsKIApAQCAtNTQwOSw2ICs1NDY1LDcgQEAKIAogdm9pZCBldmVyZ3JlZW5fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fZmluaShyZGV2KTsKIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJcjcwMF9jcF9maW5pKHJkZXYpOwogCXI2MDBfZG1hX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYwppbmRleCBlYjhhYzMxLi5jN2NhYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2NzLmMKQEAgLTk2Nyw3ICs5NjcsMTAgQEAKIAlpZiAodHJhY2stPmNiX2RpcnR5KSB7CiAJCXRtcCA9IHRyYWNrLT5jYl90YXJnZXRfbWFzazsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJaWYgKCh0bXAgPj4gKGkgKiA0KSkgJiAweEYpIHsKKwkJCXUzMiBmb3JtYXQgPSBHXzAyOEM3MF9GT1JNQVQodHJhY2stPmNiX2NvbG9yX2luZm9baV0pOworCisJCQlpZiAoZm9ybWF0ICE9IFZfMDI4QzcwX0NPTE9SX0lOVkFMSUQgJiYKKwkJCSAgICAodG1wID4+IChpICogNCkpICYgMHhGKSB7CiAJCQkJLyogYXQgbGVhc3Qgb25lIGNvbXBvbmVudCBpcyBlbmFibGVkICovCiAJCQkJaWYgKHRyYWNrLT5jYl9jb2xvcl9ib1tpXSA9PSBOVUxMKSB7CiAJCQkJCWRldl93YXJuKHAtPmRldiwgIiVzOiVkIG1hc2sgMHglMDhYIHwgMHglMDhYIG5vIGNiIGZvciAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKaW5kZXggOGE0ZTY0MS4uYTBmNjNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNkZWZpbmUgRVZFUkdSRUVOX1BJRl9QSFkwX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMHhjCiAjZGVmaW5lIEVWRVJHUkVFTl9QSUZfUEhZMV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKICNkZWZpbmUgRVZFUkdSRUVOX1BJRl9QSFkxX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBFVkVSR1JFRU5fTU1fSU5ERVhfSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4CiAKICNkZWZpbmUgRVZFUkdSRUVOX1ZHQV9NRU1PUllfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgMHgzMTAKICNkZWZpbmUgRVZFUkdSRUVOX1ZHQV9NRU1PUllfQkFTRV9BRERSRVNTX0hJR0ggICAgICAgICAgMHgzMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKaW5kZXggMTdmOTkwNy4uZjljNzk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKQEAgLTgyLDEyICs4MiwxNiBAQAogI2RlZmluZQlDR19TUExMX0ZVTkNfQ05UTF8yCQkJCTB4NjA0CiAjZGVmaW5lCQlTQ0xLX01VWF9TRUwoeCkJCQkJKCh4KSA8PCAwKQogI2RlZmluZQkJU0NMS19NVVhfU0VMX01BU0sJCQkoMHgxZmYgPDwgMCkKKyNkZWZpbmUJCVNDTEtfTVVYX1VQREFURQkJCQkoMSA8PCAyNikKICNkZWZpbmUJQ0dfU1BMTF9GVU5DX0NOVExfMwkJCQkweDYwOAogI2RlZmluZQkJU1BMTF9GQl9ESVYoeCkJCQkJKCh4KSA8PCAwKQogI2RlZmluZQkJU1BMTF9GQl9ESVZfTUFTSwkJCSgweDNmZmZmZmYgPDwgMCkKICNkZWZpbmUJCVNQTExfRElUSEVOCQkJCSgxIDw8IDI4KQorI2RlZmluZQlDR19TUExMX1NUQVRVUwkJCQkJMHg2MGMKKyNkZWZpbmUJCVNQTExfQ0hHX1NUQVRVUwkJCQkoMSA8PCAxKQogCiAjZGVmaW5lIE1QTExfQ05UTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjFjCisjICAgICAgIGRlZmluZSBNUExMX01DTEtfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQogIyAgICAgICBkZWZpbmUgU1NfU1NFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNCkKICMgICAgICAgZGVmaW5lIFNTX0RTTU9ERV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24va3ZfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2t2X2RwbS5jCmluZGV4IGI0MTkwNTUuLmI2ZTAxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24va3ZfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9rdl9kcG0uYwpAQCAtMTEyNiwxMSArMTEyNiw2IEBACiAJc3RydWN0IGt2X3Bvd2VyX2luZm8gKnBpID0ga3ZfZ2V0X3BpKHJkZXYpOwogCWludCByZXQ7CiAKLQljaWtfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIGZhbHNlKTsKLQogCXJldCA9IGt2X3Byb2Nlc3NfZmlybXdhcmVfaGVhZGVyKHJkZXYpOwogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJrdl9wcm9jZXNzX2Zpcm13YXJlX2hlYWRlciBmYWlsZWRcbiIpOwpAQCAtMTIxNSw2ICsxMjEwLDIxIEBACiAKIAlrdl9yZXNldF9hY3BfYm9vdF9sZXZlbChyZGV2KTsKIAorCXJldCA9IGt2X3NtY19iYXBtX2VuYWJsZShyZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImt2X3NtY19iYXBtX2VuYWJsZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWt2X3VwZGF0ZV9jdXJyZW50X3BzKHJkZXYsIHJkZXYtPnBtLmRwbS5ib290X3BzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBrdl9kcG1fbGF0ZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHJldDsKKwogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkICYmCiAJICAgIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IocmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSkpIHsKIAkJcmV0ID0ga3Zfc2V0X3RoZXJtYWxfdGVtcGVyYXR1cmVfcmFuZ2UocmRldiwgUjYwMF9URU1QX1JBTkdFX01JTiwgUjYwMF9URU1QX1JBTkdFX01BWCk7CkBAIC0xMjI2LDM1ICsxMjM2LDE3IEBACiAJCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwogCX0KIAotCXJldCA9IGt2X3NtY19iYXBtX2VuYWJsZShyZGV2LCBmYWxzZSk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImt2X3NtY19iYXBtX2VuYWJsZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIHBvd2VyZG93biB1bnVzZWQgYmxvY2tzIGZvciBub3cgKi8KIAlrdl9kcG1fcG93ZXJnYXRlX2FjcChyZGV2LCB0cnVlKTsKIAlrdl9kcG1fcG93ZXJnYXRlX3NhbXUocmRldiwgdHJ1ZSk7CiAJa3ZfZHBtX3Bvd2VyZ2F0ZV92Y2UocmRldiwgdHJ1ZSk7CiAJa3ZfZHBtX3Bvd2VyZ2F0ZV91dmQocmRldiwgdHJ1ZSk7CiAKLQljaWtfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIHRydWUpOwotCi0Ja3ZfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgcmRldi0+cG0uZHBtLmJvb3RfcHMpOwotCiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBrdl9kcG1fZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQljaWtfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIGZhbHNlKTsKLQogCWt2X3NtY19iYXBtX2VuYWJsZShyZGV2LCBmYWxzZSk7CiAKIAkvKiBwb3dlcnVwIGJsb2NrcyAqLwpAQCAtMTc3OSwxMSArMTc3MSw2IEBACiAJLypzdHJ1Y3QgcmFkZW9uX3BzICpvbGRfcHMgPSAmcGktPmN1cnJlbnRfcnBzOyovCiAJaW50IHJldDsKIAotCWNpa191cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgIFJBREVPTl9DR19CTE9DS19CSUYgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfSERQKSwgZmFsc2UpOwotCiAJaWYgKHBpLT5iYXBtX2VuYWJsZSkgewogCQlyZXQgPSBrdl9zbWNfYmFwbV9lbmFibGUocmRldiwgcmRldi0+cG0uZHBtLmFjX3Bvd2VyKTsKIAkJaWYgKHJldCkgewpAQCAtMTg0OSwxMSArMTgzNiw2IEBACiAJCX0KIAl9CiAKLQljaWtfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIHRydWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwppbmRleCBmNTlhOWU5Li5lYTkzMmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCkBAIC0xNzQsNiArMTc0LDcgQEAKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wcm9ncmFtX2FzcG0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgc3Vtb19ybGNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHN1bW9fcmxjX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX2dwdV9wY2lfY29uZmlnX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyogRmlybXdhcmUgTmFtZXMgKi8KIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0JBUlRTX3BmcC5iaW4iKTsKQEAgLTEzMzAsMTMgKzEzMzEsMTIgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcgPSAmcmRldi0+cmluZ1tmZW5jZS0+cmluZ107CiAJdTY0IGFkZHIgPSByZGV2LT5mZW5jZV9kcnZbZmVuY2UtPnJpbmddLmdwdV9hZGRyOworCXUzMiBjcF9jb2hlcl9jbnRsID0gUEFDS0VUM19GVUxMX0NBQ0hFX0VOQSB8IFBBQ0tFVDNfVENfQUNUSU9OX0VOQSB8CisJCVBBQ0tFVDNfU0hfQUNUSU9OX0VOQTsKIAogCS8qIGZsdXNoIHJlYWQgY2FjaGUgb3ZlciBnYXJ0IGZvciB0aGlzIHZtaWQgKi8KLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDEpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAoQ1BfQ09IRVJfQ05UTDIgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAwKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfU1VSRkFDRV9TWU5DLCAzKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUM19UQ19BQ1RJT05fRU5BIHwgUEFDS0VUM19TSF9BQ1RJT05fRU5BKTsKKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzX0VOR0lORV9NRSB8IGNwX2NvaGVyX2NudGwpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDB4RkZGRkZGRkYpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDEwKTsgLyogcG9sbCBpbnRlcnZhbCAqLwpAQCAtMTM1Miw2ICsxMzUyLDggQEAKIHZvaWQgY2F5bWFuX3JpbmdfaWJfZXhlY3V0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9pYiAqaWIpCiB7CiAJc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nID0gJnJkZXYtPnJpbmdbaWItPnJpbmddOworCXUzMiBjcF9jb2hlcl9jbnRsID0gUEFDS0VUM19GVUxMX0NBQ0hFX0VOQSB8IFBBQ0tFVDNfVENfQUNUSU9OX0VOQSB8CisJCVBBQ0tFVDNfU0hfQUNUSU9OX0VOQTsKIAogCS8qIHNldCB0byBEWDEwLzExIG1vZGUgKi8KIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfTU9ERV9DT05UUk9MLCAwKSk7CkBAIC0xMzc2LDE0ICsxMzc4LDExIEBACiAJCQkgIChpYi0+dm0gPyAoaWItPnZtLT5pZCA8PCAyNCkgOiAwKSk7CiAKIAkvKiBmbHVzaCByZWFkIGNhY2hlIG92ZXIgZ2FydCBmb3IgdGhpcyB2bWlkICovCi0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX1NFVF9DT05GSUdfUkVHLCAxKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKENQX0NPSEVSX0NOVEwyIC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgaWItPnZtID8gaWItPnZtLT5pZCA6IDApOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDMoUEFDS0VUM19TVVJGQUNFX1NZTkMsIDMpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzX1RDX0FDVElPTl9FTkEgfCBQQUNLRVQzX1NIX0FDVElPTl9FTkEpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDNfRU5HSU5FX01FIHwgY3BfY29oZXJfY250bCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMHhGRkZGRkZGRik7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMTApOyAvKiBwb2xsIGludGVydmFsICovCisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKChpYi0+dm0gPyBpYi0+dm0tPmlkIDogMCkgPDwgMjQpIHwgMTApOyAvKiBwb2xsIGludGVydmFsICovCiB9CiAKIHN0YXRpYyB2b2lkIGNheW1hbl9jcF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGJvb2wgZW5hYmxlKQpAQCAtMTM5MSwxMyArMTM5MCw2MyBAQAogCWlmIChlbmFibGUpCiAJCVdSRUczMihDUF9NRV9DTlRMLCAwKTsKIAllbHNlIHsKLQkJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CisJCWlmIChyZGV2LT5hc2ljLT5jb3B5LmNvcHlfcmluZ19pbmRleCA9PSBSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWCkKKwkJCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUpOwogCQlXUkVHMzIoQ1BfTUVfQ05UTCwgKENQX01FX0hBTFQgfCBDUF9QRlBfSEFMVCkpOwogCQlXUkVHMzIoU0NSQVRDSF9VTVNLLCAwKTsKIAkJcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF0ucmVhZHkgPSBmYWxzZTsKIAl9CiB9CiAKK3UzMiBjYXltYW5fZ2Z4X2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiBycHRyOworCisJaWYgKHJkZXYtPndiLmVuYWJsZWQpCisJCXJwdHIgPSByZGV2LT53Yi53YltyaW5nLT5ycHRyX29mZnMvNF07CisJZWxzZSB7CisJCWlmIChyaW5nLT5pZHggPT0gUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVgpCisJCQlycHRyID0gUlJFRzMyKENQX1JCMF9SUFRSKTsKKwkJZWxzZSBpZiAocmluZy0+aWR4ID09IENBWU1BTl9SSU5HX1RZUEVfQ1AxX0lOREVYKQorCQkJcnB0ciA9IFJSRUczMihDUF9SQjFfUlBUUik7CisJCWVsc2UKKwkJCXJwdHIgPSBSUkVHMzIoQ1BfUkIyX1JQVFIpOworCX0KKworCXJldHVybiBycHRyOworfQorCit1MzIgY2F5bWFuX2dmeF9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCXN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwl1MzIgd3B0cjsKKworCWlmIChyaW5nLT5pZHggPT0gUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVgpCisJCXdwdHIgPSBSUkVHMzIoQ1BfUkIwX1dQVFIpOworCWVsc2UgaWYgKHJpbmctPmlkeCA9PSBDQVlNQU5fUklOR19UWVBFX0NQMV9JTkRFWCkKKwkJd3B0ciA9IFJSRUczMihDUF9SQjFfV1BUUik7CisJZWxzZQorCQl3cHRyID0gUlJFRzMyKENQX1JCMl9XUFRSKTsKKworCXJldHVybiB3cHRyOworfQorCit2b2lkIGNheW1hbl9nZnhfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCWlmIChyaW5nLT5pZHggPT0gUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVgpIHsKKwkJV1JFRzMyKENQX1JCMF9XUFRSLCByaW5nLT53cHRyKTsKKwkJKHZvaWQpUlJFRzMyKENQX1JCMF9XUFRSKTsKKwl9IGVsc2UgaWYgKHJpbmctPmlkeCA9PSBDQVlNQU5fUklOR19UWVBFX0NQMV9JTkRFWCkgeworCQlXUkVHMzIoQ1BfUkIxX1dQVFIsIHJpbmctPndwdHIpOworCQkodm9pZClSUkVHMzIoQ1BfUkIxX1dQVFIpOworCX0gZWxzZSB7CisJCVdSRUczMihDUF9SQjJfV1BUUiwgcmluZy0+d3B0cik7CisJCSh2b2lkKVJSRUczMihDUF9SQjJfV1BUUik7CisJfQorfQorCiBzdGF0aWMgaW50IGNheW1hbl9jcF9sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CkBAIC0xNTI2LDYgKzE1NzUsMTYgQEAKIAkJQ1BfUkIxX0JBU0UsCiAJCUNQX1JCMl9CQVNFCiAJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY3BfcmJfcnB0cltdID0geworCQlDUF9SQjBfUlBUUiwKKwkJQ1BfUkIxX1JQVFIsCisJCUNQX1JCMl9SUFRSCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY3BfcmJfd3B0cltdID0geworCQlDUF9SQjBfV1BUUiwKKwkJQ1BfUkIxX1dQVFIsCisJCUNQX1JCMl9XUFRSCisJfTsKIAlzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmc7CiAJaW50IGksIHI7CiAKQEAgLTE1ODQsOCArMTY0Myw4IEBACiAJCVdSRUczMl9QKGNwX3JiX2NudGxbaV0sIFJCX1JQVFJfV1JfRU5BLCB+UkJfUlBUUl9XUl9FTkEpOwogCiAJCXJpbmctPnJwdHIgPSByaW5nLT53cHRyID0gMDsKLQkJV1JFRzMyKHJpbmctPnJwdHJfcmVnLCByaW5nLT5ycHRyKTsKLQkJV1JFRzMyKHJpbmctPndwdHJfcmVnLCByaW5nLT53cHRyKTsKKwkJV1JFRzMyKGNwX3JiX3JwdHJbaV0sIHJpbmctPnJwdHIpOworCQlXUkVHMzIoY3BfcmJfd3B0cltpXSwgcmluZy0+d3B0cik7CiAKIAkJbWRlbGF5KDEpOwogCQlXUkVHMzJfUChjcF9yYl9jbnRsW2ldLCAwLCB+UkJfUlBUUl9XUl9FTkEpOwpAQCAtMTYwNSw2ICsxNjY0LDkgQEAKIAkJcmV0dXJuIHI7CiAJfQogCisJaWYgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFJBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODMxLDggKzE4OTMsMTAgQEAKIAogCXJlc2V0X21hc2sgPSBjYXltYW5fZ3B1X2NoZWNrX3NvZnRfcmVzZXQocmRldik7CiAKLQlpZiAoIXJlc2V0X21hc2spCi0JCXI2MDBfc2V0X2Jpb3Nfc2NyYXRjaF9lbmdpbmVfaHVuZyhyZGV2LCBmYWxzZSk7CisJaWYgKHJlc2V0X21hc2spCisJCWV2ZXJncmVlbl9ncHVfcGNpX2NvbmZpZ19yZXNldChyZGV2KTsKKworCXI2MDBfc2V0X2Jpb3Nfc2NyYXRjaF9lbmdpbmVfaHVuZyhyZGV2LCBmYWxzZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NzgsMjMgKzE5NDIsNyBAQAogCiAJZXZlcmdyZWVuX21jX3Byb2dyYW0ocmRldik7CiAKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7Ci0JCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7Ci0JCQlyID0gbmlfaW5pdF9taWNyb2NvZGUocmRldik7Ci0JCQlpZiAocikgewotCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3IHx8ICFyZGV2LT5tY19mdykgewotCQkJciA9IG5pX2luaXRfbWljcm9jb2RlKHJkZXYpOwotCQkJaWYgKHIpIHsKLQkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7Ci0JCQkJcmV0dXJuIHI7Ci0JCQl9Ci0JCX0KLQorCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgJiYgIXJkZXYtPnBtLmRwbV9lbmFibGVkKSB7CiAJCXIgPSBuaV9tY19sb2FkX21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKQEAgLTE5ODEsMjMgKzIwMjksMTggQEAKIAlldmVyZ3JlZW5faXJxX3NldChyZGV2KTsKIAogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUkFERU9OX1dCX0NQX1JQVFJfT0ZGU0VULAotCQkJICAgICBDUF9SQjBfUlBUUiwgQ1BfUkIwX1dQVFIsCiAJCQkgICAgIFJBREVPTl9DUF9QQUNLRVQyKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYXTsKIAlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIFI2MDBfV0JfRE1BX1JQVFJfT0ZGU0VULAotCQkJICAgICBETUFfUkJfUlBUUiArIERNQTBfUkVHSVNURVJfT0ZGU0VULAotCQkJICAgICBETUFfUkJfV1BUUiArIERNQTBfUkVHSVNURVJfT0ZGU0VULAogCQkJICAgICBETUFfUEFDS0VUKERNQV9QQUNLRVRfTk9QLCAwLCAwLCAwKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCiAJcmluZyA9ICZyZGV2LT5yaW5nW0NBWU1BTl9SSU5HX1RZUEVfRE1BMV9JTkRFWF07CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZy0+cmluZ19zaXplLCBDQVlNQU5fV0JfRE1BMV9SUFRSX09GRlNFVCwKLQkJCSAgICAgRE1BX1JCX1JQVFIgKyBETUExX1JFR0lTVEVSX09GRlNFVCwKLQkJCSAgICAgRE1BX1JCX1dQVFIgKyBETUExX1JFR0lTVEVSX09GRlNFVCwKIAkJCSAgICAgRE1BX1BBQ0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCwgMCkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTIwMTYsNyArMjA1OSw2IEBACiAJcmluZyA9ICZyZGV2LT5yaW5nW1I2MDBfUklOR19UWVBFX1VWRF9JTkRFWF07CiAJaWYgKHJpbmctPnJpbmdfc2l6ZSkgewogCQlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIDAsCi0JCQkJICAgICBVVkRfUkJDX1JCX1JQVFIsIFVWRF9SQkNfUkJfV1BUUiwKIAkJCQkgICAgIFJBREVPTl9DUF9QQUNLRVQyKTsKIAkJaWYgKCFyKQogCQkJciA9IHV2ZF92MV8wX2luaXQocmRldik7CkBAIC0yMDYzLDYgKzIxMDUsOCBAQAogCS8qIGluaXQgZ29sZGVuIHJlZ2lzdGVycyAqLwogCW5pX2luaXRfZ29sZGVuX3JlZ2lzdGVycyhyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gY2F5bWFuX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTIwNzUsNiArMjExOSw3IEBACiAKIGludCBjYXltYW5fc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fc3VzcGVuZChyZGV2KTsKIAlpZiAoQVNJQ19JU19EQ0U2KHJkZXYpKQogCQlkY2U2X2F1ZGlvX2ZpbmkocmRldik7CiAJZWxzZQpAQCAtMjE0NSw2ICsyMTkwLDI3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgeworCQkJciA9IG5pX2luaXRfbWljcm9jb2RlKHJkZXYpOworCQkJaWYgKHIpIHsKKwkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdyB8fCAhcmRldi0+bWNfZncpIHsKKwkJCXIgPSBuaV9pbml0X21pY3JvY29kZShyZGV2KTsKKwkJCWlmIChyKSB7CisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCisJcmFkZW9uX3BtX2luaXQocmRldik7CisKIAlyaW5nLT5yaW5nX29iaiA9IE5VTEw7CiAJcjYwMF9yaW5nX2luaXQocmRldiwgcmluZywgMTAyNCAqIDEwMjQpOwogCkBAIC0yMjA0LDYgKzIyNzAsNyBAQAogCiB2b2lkIGNheW1hbl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9maW5pKHJkZXYpOwogCWNheW1hbl9jcF9maW5pKHJkZXYpOwogCWNheW1hbl9kbWFfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlfZG1hLmMKaW5kZXggYmRlYjY1ZS4uN2NmOTZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pX2RtYS5jCkBAIC00Myw2ICs0Myw3NSBAQAogICovCiAKIC8qKgorICogY2F5bWFuX2RtYV9nZXRfcnB0ciAtIGdldCB0aGUgY3VycmVudCByZWFkIHBvaW50ZXIKKyAqCisgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCisgKiBAcmluZzogcmFkZW9uIHJpbmcgcG9pbnRlcgorICoKKyAqIEdldCB0aGUgY3VycmVudCBycHRyIGZyb20gdGhlIGhhcmR3YXJlIChjYXltYW4rKS4KKyAqLwordWludDMyX3QgY2F5bWFuX2RtYV9nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiBycHRyLCByZWc7CisKKwlpZiAocmRldi0+d2IuZW5hYmxlZCkgeworCQlycHRyID0gcmRldi0+d2Iud2JbcmluZy0+cnB0cl9vZmZzLzRdOworCX0gZWxzZSB7CisJCWlmIChyaW5nLT5pZHggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKQorCQkJcmVnID0gRE1BX1JCX1JQVFIgKyBETUEwX1JFR0lTVEVSX09GRlNFVDsKKwkJZWxzZQorCQkJcmVnID0gRE1BX1JCX1JQVFIgKyBETUExX1JFR0lTVEVSX09GRlNFVDsKKworCQlycHRyID0gUlJFRzMyKHJlZyk7CisJfQorCisJcmV0dXJuIChycHRyICYgMHgzZmZmYykgPj4gMjsKK30KKworLyoqCisgKiBjYXltYW5fZG1hX2dldF93cHRyIC0gZ2V0IHRoZSBjdXJyZW50IHdyaXRlIHBvaW50ZXIKKyAqCisgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCisgKiBAcmluZzogcmFkZW9uIHJpbmcgcG9pbnRlcgorICoKKyAqIEdldCB0aGUgY3VycmVudCB3cHRyIGZyb20gdGhlIGhhcmR3YXJlIChjYXltYW4rKS4KKyAqLwordWludDMyX3QgY2F5bWFuX2RtYV9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwl1MzIgcmVnOworCisJaWYgKHJpbmctPmlkeCA9PSBSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVgpCisJCXJlZyA9IERNQV9SQl9XUFRSICsgRE1BMF9SRUdJU1RFUl9PRkZTRVQ7CisJZWxzZQorCQlyZWcgPSBETUFfUkJfV1BUUiArIERNQTFfUkVHSVNURVJfT0ZGU0VUOworCisJcmV0dXJuIChSUkVHMzIocmVnKSAmIDB4M2ZmZmMpID4+IDI7Cit9CisKKy8qKgorICogY2F5bWFuX2RtYV9zZXRfd3B0ciAtIGNvbW1pdCB0aGUgd3JpdGUgcG9pbnRlcgorICoKKyAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKKyAqIEByaW5nOiByYWRlb24gcmluZyBwb2ludGVyCisgKgorICogV3JpdGUgdGhlIHdwdHIgYmFjayB0byB0aGUgaGFyZHdhcmUgKGNheW1hbispLgorICovCit2b2lkIGNheW1hbl9kbWFfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiByZWc7CisKKwlpZiAocmluZy0+aWR4ID09IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCkKKwkJcmVnID0gRE1BX1JCX1dQVFIgKyBETUEwX1JFR0lTVEVSX09GRlNFVDsKKwllbHNlCisJCXJlZyA9IERNQV9SQl9XUFRSICsgRE1BMV9SRUdJU1RFUl9PRkZTRVQ7CisKKwlXUkVHMzIocmVnLCAocmluZy0+d3B0ciA8PCAyKSAmIDB4M2ZmZmMpOworfQorCisvKioKICAqIGNheW1hbl9kbWFfcmluZ19pYl9leGVjdXRlIC0gU2NoZWR1bGUgYW4gSUIgb24gdGhlIERNQSBlbmdpbmUKICAqCiAgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCkBAIC04OCw3ICsxNTcsOSBAQAogewogCXUzMiByYl9jbnRsOwogCi0JcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CisJaWYgKChyZGV2LT5hc2ljLT5jb3B5LmNvcHlfcmluZ19pbmRleCA9PSBSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVgpIHx8CisJICAgIChyZGV2LT5hc2ljLT5jb3B5LmNvcHlfcmluZ19pbmRleCA9PSBDQVlNQU5fUklOR19UWVBFX0RNQTFfSU5ERVgpKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplKTsKIAogCS8qIGRtYTAgKi8KIAlyYl9jbnRsID0gUlJFRzMyKERNQV9SQl9DTlRMICsgRE1BMF9SRUdJU1RFUl9PRkZTRVQpOwpAQCAtMTkwLDcgKzI2MSw5IEBACiAJCX0KIAl9CiAKLQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKKwlpZiAoKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCkgfHwKKwkgICAgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IENBWU1BTl9SSU5HX1RZUEVfRE1BMV9JTkRFWCkpCisJCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMucmVhbF92cmFtX3NpemUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pX2RwbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9kcG0uYwppbmRleCA0OWM0ZDQ4Li5jMzUxMjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pX2RwbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlfZHBtLmMKQEAgLTcyMCw2ICs3MjAsOCBAQAogc3RydWN0IHJ2N3h4X3Bvd2VyX2luZm8gKnJ2NzcwX2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdHJ1Y3QgZXZlcmdyZWVuX3Bvd2VyX2luZm8gKmV2ZXJncmVlbl9nZXRfcGkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCitleHRlcm4gaW50IG5pX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwogc3RydWN0IG5pX3Bvd2VyX2luZm8gKm5pX2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKICAgICAgICAgc3RydWN0IG5pX3Bvd2VyX2luZm8gKnBpID0gcmRldi0+cG0uZHBtLnByaXY7CkBAIC0zNTY1LDcgKzM1NjcsMTEgQEAKIHZvaWQgbmlfZHBtX3NldHVwX2FzaWMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IGV2ZXJncmVlbl9wb3dlcl9pbmZvICplZ19waSA9IGV2ZXJncmVlbl9nZXRfcGkocmRldik7CisJaW50IHI7CiAKKwlyID0gbmlfbWNfbG9hZF9taWNyb2NvZGUocmRldik7CisJaWYgKHIpCisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKIAluaV9yZWFkX2Nsb2NrX3JlZ2lzdGVycyhyZGV2KTsKIAlidGNfcmVhZF9hcmJfcmVnaXN0ZXJzKHJkZXYpOwogCXJ2NzcwX2dldF9tZW1vcnlfdHlwZShyZGV2KTsKQEAgLTM3MTAsMjEgKzM3MTYsNiBAQAogCWlmIChlZ19waS0+bHNfY2xvY2tfZ2F0aW5nKQogCQluaV9sc19jbG9ja2dhdGluZ19lbmFibGUocmRldiwgdHJ1ZSk7CiAKLQlpZiAocmRldi0+aXJxLmluc3RhbGxlZCAmJgotCSAgICByNjAwX2lzX2ludGVybmFsX3RoZXJtYWxfc2Vuc29yKHJkZXYtPnBtLmludF90aGVybWFsX3R5cGUpKSB7Ci0JCVBQU01DX1Jlc3VsdCByZXN1bHQ7Ci0KLQkJcmV0ID0gcnY3NzBfc2V0X3RoZXJtYWxfdGVtcGVyYXR1cmVfcmFuZ2UocmRldiwgUjYwMF9URU1QX1JBTkdFX01JTiwgMHhmZiAqIDEwMDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJcmRldi0+aXJxLmRwbV90aGVybWFsID0gdHJ1ZTsKLQkJcmFkZW9uX2lycV9zZXQocmRldik7Ci0JCXJlc3VsdCA9IHJ2NzcwX3NlbmRfbXNnX3RvX3NtYyhyZGV2LCBQUFNNQ19NU0dfRW5hYmxlVGhlcm1hbEludGVycnVwdCk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCQlEUk1fREVCVUdfS01TKCJDb3VsZCBub3QgZW5hYmxlIHRoZXJtYWwgaW50ZXJydXB0cy5cbiIpOwotCX0KLQogCXJ2NzcwX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOwogCiAJbmlfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgYm9vdF9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaAppbmRleCAyMjQyMWJjLi5kOTk2MDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKQEAgLTExNTQsNiArMTE1NCw3IEBACiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19EQl9BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyNikKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX1NIX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI3KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfU1hfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjgpCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19FTkdJTkVfTUUgICAgICAgICAgICAoMSA8PCAzMSkKICNkZWZpbmUJUEFDS0VUM19NRV9JTklUSUFMSVpFCQkJCTB4NDQKICNkZWZpbmUJCVBBQ0tFVDNfTUVfSU5JVElBTElaRV9ERVZJQ0VfSUQoeCkgKCh4KSA8PCAxNikKICNkZWZpbmUJUEFDS0VUM19DT05EX1dSSVRFCQkJCTB4NDUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcHB0YWJsZS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9wcHRhYmxlLmgKaW5kZXggZGE0M2FiMy4uMmQ1MzI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9wcHRhYmxlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9wcHRhYmxlLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpZm5kZWYgX1BQVEFCTEVfSAogI2RlZmluZSBfUFBUQUJMRV9ICiAKLSNwcmFnbWEgcGFjayhwdXNoLCAxKQorI3ByYWdtYSBwYWNrKDEpCiAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1BQTElCX1RIRVJNQUxDT05UUk9MTEVSCiAKQEAgLTY3Nyw2ICs2NzcsNiBAQAogICAgICAgVUxPTkcgIHVsVGptYXg7CiB9IEFUT01fUFBMSUJfUFBNX1RhYmxlOwogCi0jcHJhZ21hIHBhY2socG9wKQorI3ByYWdtYSBwYWNrKCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCmluZGV4IDEwYWJjNGQuLmVmMDI0Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCkBAIC0xMDUwLDYgKzEwNTAsMzYgQEAKIAlyZXR1cm4gZXJyOwogfQogCit1MzIgcjEwMF9nZnhfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwl1MzIgcnB0cjsKKworCWlmIChyZGV2LT53Yi5lbmFibGVkKQorCQlycHRyID0gbGUzMl90b19jcHUocmRldi0+d2Iud2JbcmluZy0+cnB0cl9vZmZzLzRdKTsKKwllbHNlCisJCXJwdHIgPSBSUkVHMzIoUkFERU9OX0NQX1JCX1JQVFIpOworCisJcmV0dXJuIHJwdHI7Cit9CisKK3UzMiByMTAwX2dmeF9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiB3cHRyOworCisJd3B0ciA9IFJSRUczMihSQURFT05fQ1BfUkJfV1BUUik7CisKKwlyZXR1cm4gd3B0cjsKK30KKwordm9pZCByMTAwX2dmeF9zZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwlXUkVHMzIoUkFERU9OX0NQX1JCX1dQVFIsIHJpbmctPndwdHIpOworCSh2b2lkKVJSRUczMihSQURFT05fQ1BfUkJfV1BUUik7Cit9CisKIHN0YXRpYyB2b2lkIHIxMDBfY3BfbG9hZF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJY29uc3QgX19iZTMyICpmd19kYXRhOwpAQCAtMTEwMiw3ICsxMTMyLDYgQEAKIAlyaW5nX3NpemUgPSAoMSA8PCAocmJfYnVmc3ogKyAxKSkgKiA0OwogCXIxMDBfY3BfbG9hZF9taWNyb2NvZGUocmRldik7CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZ19zaXplLCBSQURFT05fV0JfQ1BfUlBUUl9PRkZTRVQsCi0JCQkgICAgIFJBREVPTl9DUF9SQl9SUFRSLCBSQURFT05fQ1BfUkJfV1BUUiwKIAkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCWlmIChyKSB7CiAJCXJldHVybiByOwpAQCAtMzkxMyw2ICszOTQyLDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjEwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC0zOTIzLDYgKzM5NTQsNyBAQAogCiBpbnQgcjEwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlyMTAwX2lycV9kaXNhYmxlKHJkZXYpOwpAQCAtMzkzMyw2ICszOTY1LDcgQEAKIAogdm9pZCByMTAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX2ZpbmkocmRldik7CiAJcjEwMF9jcF9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOwogCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CkBAIC00MDM5LDYgKzQwNzIsOSBAQAogCX0KIAlyMTAwX3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKIAorCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHIxMDBfc3RhcnR1cChyZGV2KTsKIAlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwppbmRleCBkOGRkMjY5Li43YzYzZWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwpAQCAtMTQzMCw2ICsxNDMwLDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjMwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC0xNDQwLDYgKzE0NDIsNyBAQAogCiBpbnQgcjMwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlyMTAwX2lycV9kaXNhYmxlKHJkZXYpOwpAQCAtMTQ1Miw2ICsxNDU1LDcgQEAKIAogdm9pZCByMzAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX2ZpbmkocmRldik7CiAJcjEwMF9jcF9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOwogCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CkBAIC0xNTM4LDYgKzE1NDIsOSBAQAogCX0KIAlyMzAwX3NldF9yZWdfc2FmZShyZGV2KTsKIAorCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHIzMDBfc3RhcnR1cChyZGV2KTsKIAlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwX2NtZGJ1Zi5jCmluZGV4IDYwMTcwZWEuLjg0YjFkNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMF9jbWRidWYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSMzAwX1JFX0NMSVBSRUNUX1RMXzAsIG5yICogMiAtIDEpKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnI7ICsraSkgewotCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgorCQkJaWYgKGNvcHlfZnJvbV91c2VyCiAJCQkgICAgKCZib3gsICZjbWRidWYtPmJveGVzW24gKyBpXSwgc2l6ZW9mKGJveCkpKSB7CiAJCQkJRFJNX0VSUk9SKCJjb3B5IGNsaXByZWN0IGZhdWx0ZWRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtOTI4LDEyICs5MjgsMTIgQEAKIAkJYnVmX2lkeCA9IGRybV9idWZmZXJfcG9pbnRlcl90b19kd29yZChjbWRidWYtPmJ1ZmZlciwgMCk7CiAJCSpidWZfaWR4ICo9IDI7IC8qIDggYnl0ZXMgcGVyIGJ1ZiAqLwogCi0JCWlmIChEUk1fQ09QWV9UT19VU0VSKHJlZl9hZ2VfYmFzZSArICpidWZfaWR4LAorCQlpZiAoY29weV90b191c2VyKHJlZl9hZ2VfYmFzZSArICpidWZfaWR4LAogCQkJCSZkZXZfcHJpdi0+c2NyYXRjaF9hZ2VzW2hlYWRlci5zY3JhdGNoLnJlZ10sCiAJCQkJc2l6ZW9mKHUzMikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmaF9wZW5kaW5nLAorCQlpZiAoY29weV9mcm9tX3VzZXIoJmhfcGVuZGluZywKIAkJCQlyZWZfYWdlX2Jhc2UgKyAqYnVmX2lkeCArIDEsCiAJCQkJc2l6ZW9mKHUzMikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC05NDMsNyArOTQzLDcgQEAKIAogCQloX3BlbmRpbmctLTsKIAotCQlpZiAoRFJNX0NPUFlfVE9fVVNFUihyZWZfYWdlX2Jhc2UgKyAqYnVmX2lkeCArIDEsCisJCWlmIChjb3B5X3RvX3VzZXIocmVmX2FnZV9iYXNlICsgKmJ1Zl9pZHggKyAxLAogCQkJCQkmaF9wZW5kaW5nLAogCQkJCQlzaXplb2YodTMyKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjQyMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKaW5kZXggNmVkZjJiMy4uMzc2OGFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKQEAgLTMyNSw2ICszMjUsOCBAQAogCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KIAlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCisJcmFkZW9uX3BtX3Jlc3VtZShyZGV2KTsKKwogCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOwogCXIgPSByNDIwX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTMzNSw2ICszMzcsNyBAQAogCiBpbnQgcjQyMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCXI0MjBfY3BfZXJyYXRhX2ZpbmkocmRldik7CiAJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwpAQCAtMzQ4LDYgKzM1MSw3IEBACiAKIHZvaWQgcjQyMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9maW5pKHJkZXYpOwogCXIxMDBfY3BfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKIAlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwpAQCAtNDQ0LDYgKzQ0OCw5IEBACiAJfQogCXI0MjBfc2V0X3JlZ19zYWZlKHJkZXYpOwogCisJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCisJcmFkZW9uX3BtX2luaXQocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjQyMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MjAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCmluZGV4IGUxYWVjZTcuLmUyMDllYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCkBAIC0yNDAsNiArMjQwLDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjUyMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC0zMTIsNiArMzE0LDkgQEAKIAkJcmV0dXJuIHI7CiAJcnY1MTVfc2V0X3NhZmVfcmVnaXN0ZXJzKHJkZXYpOwogCisJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCisJcmFkZW9uX3BtX2luaXQocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjUyMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCmluZGV4IDlhZDA2NzMuLjU2MTQwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIHZvaWQgcjYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdGF0aWMgdm9pZCByNjAwX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBldmVyZ3JlZW5fcmxjX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBydjc3MF9zZXRfY2xrX2J5cGFzc19tb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyoqCiAgKiByNjAwX2dldF94Y2xrIC0gZ2V0IHRoZSB4Y2xrCkBAIC0xNjQ0LDYgKzE2NDUsNjcgQEAKIAlyNjAwX3ByaW50X2dwdV9zdGF0dXNfcmVncyhyZGV2KTsKIH0KIAorc3RhdGljIHZvaWQgcjYwMF9ncHVfcGNpX2NvbmZpZ19yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSBzYXZlOworCXUzMiB0bXAsIGk7CisKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICJHUFUgcGNpIGNvbmZpZyByZXNldFxuIik7CisKKwkvKiBkaXNhYmxlIGRwbT8gKi8KKworCS8qIERpc2FibGUgQ1AgcGFyc2luZy9wcmVmZXRjaGluZyAqLworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkKKwkJV1JFRzMyKFJfMDA4NkQ4X0NQX01FX0NOVEwsIFNfMDA4NkQ4X0NQX01FX0hBTFQoMSkgfCBTXzAwODZEOF9DUF9QRlBfSEFMVCgxKSk7CisJZWxzZQorCQlXUkVHMzIoUl8wMDg2RDhfQ1BfTUVfQ05UTCwgU18wMDg2RDhfQ1BfTUVfSEFMVCgxKSk7CisKKwkvKiBkaXNhYmxlIHRoZSBSTEMgKi8KKwlXUkVHMzIoUkxDX0NOVEwsIDApOworCisJLyogRGlzYWJsZSBETUEgKi8KKwl0bXAgPSBSUkVHMzIoRE1BX1JCX0NOVEwpOworCXRtcCAmPSB+RE1BX1JCX0VOQUJMRTsKKwlXUkVHMzIoRE1BX1JCX0NOVEwsIHRtcCk7CisKKwltZGVsYXkoNTApOworCisJLyogc2V0IG1jbGsvc2NsayB0byBieXBhc3MgKi8KKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCisJCXJ2NzcwX3NldF9jbGtfYnlwYXNzX21vZGUocmRldik7CisJLyogZGlzYWJsZSBCTSAqLworCXBjaV9jbGVhcl9tYXN0ZXIocmRldi0+cGRldik7CisJLyogZGlzYWJsZSBtZW0gYWNjZXNzICovCisJcnY1MTVfbWNfc3RvcChyZGV2LCAmc2F2ZSk7CisJaWYgKHI2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IGZvciBNQyBpZGxlIHRpbWVkb3V0ICFcbiIpOworCX0KKworCS8qIEJJRiByZXNldCB3b3JrYXJvdW5kLiAgTm90IHN1cmUgaWYgdGhpcyBpcyBuZWVkZWQgb24gNnh4ICovCisJdG1wID0gUlJFRzMyKEJVU19DTlRMKTsKKwl0bXAgfD0gVkdBX0NPSEVfU1BFQ19USU1FUl9ESVM7CisJV1JFRzMyKEJVU19DTlRMLCB0bXApOworCisJdG1wID0gUlJFRzMyKEJJRl9TQ1JBVENIMCk7CisKKwkvKiByZXNldCAqLworCXJhZGVvbl9wY2lfY29uZmlnX3Jlc2V0KHJkZXYpOworCW1kZWxheSgxKTsKKworCS8qIEJJRiByZXNldCB3b3JrYXJvdW5kLiAgTm90IHN1cmUgaWYgdGhpcyBpcyBuZWVkZWQgb24gNnh4ICovCisJdG1wID0gU09GVF9SRVNFVF9CSUY7CisJV1JFRzMyKFNSQk1fU09GVF9SRVNFVCwgdG1wKTsKKwltZGVsYXkoMSk7CisJV1JFRzMyKFNSQk1fU09GVF9SRVNFVCwgMCk7CisKKwkvKiB3YWl0IGZvciBhc2ljIHRvIGNvbWUgb3V0IG9mIHJlc2V0ICovCisJZm9yIChpID0gMDsgaSA8IHJkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCWlmIChSUkVHMzIoQ09ORklHX01FTVNJWkUpICE9IDB4ZmZmZmZmZmYpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KK30KKwogaW50IHI2MDBfYXNpY19yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgcmVzZXRfbWFzazsKQEAgLTE2NTMsMTAgKzE3MTUsMTcgQEAKIAlpZiAocmVzZXRfbWFzaykKIAkJcjYwMF9zZXRfYmlvc19zY3JhdGNoX2VuZ2luZV9odW5nKHJkZXYsIHRydWUpOwogCisJLyogdHJ5IHNvZnQgcmVzZXQgKi8KIAlyNjAwX2dwdV9zb2Z0X3Jlc2V0KHJkZXYsIHJlc2V0X21hc2spOwogCiAJcmVzZXRfbWFzayA9IHI2MDBfZ3B1X2NoZWNrX3NvZnRfcmVzZXQocmRldik7CiAKKwkvKiB0cnkgcGNpIGNvbmZpZyByZXNldCAqLworCWlmIChyZXNldF9tYXNrICYmIHJhZGVvbl9oYXJkX3Jlc2V0KQorCQlyNjAwX2dwdV9wY2lfY29uZmlnX3Jlc2V0KHJkZXYpOworCisJcmVzZXRfbWFzayA9IHI2MDBfZ3B1X2NoZWNrX3NvZnRfcmVzZXQocmRldik7CisKIAlpZiAoIXJlc2V0X21hc2spCiAJCXI2MDBfc2V0X2Jpb3Nfc2NyYXRjaF9lbmdpbmVfaHVuZyhyZGV2LCBmYWxzZSk7CiAKQEAgLTIxODUsNyArMjI1NCw4IEBACiAgKi8KIHZvaWQgcjYwMF9jcF9zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUpOworCWlmIChyZGV2LT5hc2ljLT5jb3B5LmNvcHlfcmluZ19pbmRleCA9PSBSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWCkKKwkJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CiAJV1JFRzMyKFJfMDA4NkQ4X0NQX01FX0NOVEwsIFNfMDA4NkQ4X0NQX01FX0hBTFQoMSkpOwogCVdSRUczMihTQ1JBVENIX1VNU0ssIDApOwogCXJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdLnJlYWR5ID0gZmFsc2U7CkBAIC0yMzgyLDYgKzI0NTIsMzYgQEAKIAlyZXR1cm4gZXJyOwogfQogCit1MzIgcjYwMF9nZnhfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZykKK3sKKwl1MzIgcnB0cjsKKworCWlmIChyZGV2LT53Yi5lbmFibGVkKQorCQlycHRyID0gcmRldi0+d2Iud2JbcmluZy0+cnB0cl9vZmZzLzRdOworCWVsc2UKKwkJcnB0ciA9IFJSRUczMihSNjAwX0NQX1JCX1JQVFIpOworCisJcmV0dXJuIHJwdHI7Cit9CisKK3UzMiByNjAwX2dmeF9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQoreworCXUzMiB3cHRyOworCisJd3B0ciA9IFJSRUczMihSNjAwX0NQX1JCX1dQVFIpOworCisJcmV0dXJuIHdwdHI7Cit9CisKK3ZvaWQgcjYwMF9nZnhfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCit7CisJV1JFRzMyKFI2MDBfQ1BfUkJfV1BUUiwgcmluZy0+d3B0cik7CisJKHZvaWQpUlJFRzMyKFI2MDBfQ1BfUkJfV1BUUik7Cit9CisKIHN0YXRpYyBpbnQgcjYwMF9jcF9sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CkBAIC0yNTEzLDYgKzI2MTMsMTAgQEAKIAkJcmluZy0+cmVhZHkgPSBmYWxzZTsKIAkJcmV0dXJuIHI7CiAJfQorCisJaWYgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFJBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNjA3LDE0ICsyNzExLDE3IEBACiAJCQkgIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQogewogCXN0cnVjdCByYWRlb25fcmluZyAqcmluZyA9ICZyZGV2LT5yaW5nW2ZlbmNlLT5yaW5nXTsKKwl1MzIgY3BfY29oZXJfY250bCA9IFBBQ0tFVDNfVENfQUNUSU9OX0VOQSB8IFBBQ0tFVDNfVkNfQUNUSU9OX0VOQSB8CisJCVBBQ0tFVDNfU0hfQUNUSU9OX0VOQTsKKworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkKKwkJY3BfY29oZXJfY250bCB8PSBQQUNLRVQzX0ZVTExfQ0FDSEVfRU5BOwogCiAJaWYgKHJkZXYtPndiLnVzZV9ldmVudCkgewogCQl1NjQgYWRkciA9IHJkZXYtPmZlbmNlX2RydltmZW5jZS0+cmluZ10uZ3B1X2FkZHI7CiAJCS8qIGZsdXNoIHJlYWQgY2FjaGUgb3ZlciBnYXJ0ICovCiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDMoUEFDS0VUM19TVVJGQUNFX1NZTkMsIDMpKTsKLQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUM19UQ19BQ1RJT05fRU5BIHwKLQkJCQkJUEFDS0VUM19WQ19BQ1RJT05fRU5BIHwKLQkJCQkJUEFDS0VUM19TSF9BQ1RJT05fRU5BKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgY3BfY29oZXJfY250bCk7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDB4RkZGRkZGRkYpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAwKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMTApOyAvKiBwb2xsIGludGVydmFsICovCkBAIC0yNjI4LDkgKzI3MzUsNyBAQAogCX0gZWxzZSB7CiAJCS8qIGZsdXNoIHJlYWQgY2FjaGUgb3ZlciBnYXJ0ICovCiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDMoUEFDS0VUM19TVVJGQUNFX1NZTkMsIDMpKTsKLQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUM19UQ19BQ1RJT05fRU5BIHwKLQkJCQkJUEFDS0VUM19WQ19BQ1RJT05fRU5BIHwKLQkJCQkJUEFDS0VUM19TSF9BQ1RJT05fRU5BKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgY3BfY29oZXJfY250bCk7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDB4RkZGRkZGRkYpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAwKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMTApOyAvKiBwb2xsIGludGVydmFsICovCkBAIC0yNzc1LDE0ICsyODgwLDYgQEAKIAogCXI2MDBfbWNfcHJvZ3JhbShyZGV2KTsKIAotCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7Ci0JCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOwotCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQl9Ci0KIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXI2MDBfYWdwX2VuYWJsZShyZGV2KTsKIAl9IGVsc2UgewpAQCAtMjgwMywxMiArMjkwMCw2IEBACiAJCXJldHVybiByOwogCX0KIAotCXIgPSByYWRlb25fZmVuY2VfZHJpdmVyX3N0YXJ0X3JpbmcocmRldiwgUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKTsKLQlpZiAocikgewotCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxlZCBpbml0aWFsaXppbmcgRE1BIGZlbmNlcyAoJWQpLlxuIiwgcik7Ci0JCXJldHVybiByOwotCX0KLQogCS8qIEVuYWJsZSBJUlEgKi8KIAlpZiAoIXJkZXYtPmlycS5pbnN0YWxsZWQpIHsKIAkJciA9IHJhZGVvbl9pcnFfa21zX2luaXQocmRldik7CkBAIC0yODI2LDE4ICsyOTE3LDEwIEBACiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUkFERU9OX1dCX0NQX1JQVFJfT0ZGU0VULAotCQkJICAgICBSNjAwX0NQX1JCX1JQVFIsIFI2MDBfQ1BfUkJfV1BUUiwKIAkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXJpbmcgPSAmcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVhdOwotCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUjYwMF9XQl9ETUFfUlBUUl9PRkZTRVQsCi0JCQkgICAgIERNQV9SQl9SUFRSLCBETUFfUkJfV1BUUiwKLQkJCSAgICAgRE1BX1BBQ0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCwgMCkpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQogCXIgPSByNjAwX2NwX2xvYWRfbWljcm9jb2RlKHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTI4NDUsMTAgKzI5MjgsNiBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXIgPSByNjAwX2RtYV9yZXN1bWUocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCiAJciA9IHJhZGVvbl9pYl9wb29sX2luaXQocmRldik7CiAJaWYgKHIpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJJQiBpbml0aWFsaXphdGlvbiBmYWlsZWQgKCVkKS5cbiIsIHIpOwpAQCAtMjg4OSw2ICsyOTY4LDggQEAKIAkvKiBwb3N0IGNhcmQgKi8KIAlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjYwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC0yOTAyLDkgKzI5ODMsOSBAQAogCiBpbnQgcjYwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAlyNjAwX2NwX3N0b3AocmRldik7Ci0JcjYwMF9kbWFfc3RvcChyZGV2KTsKIAlyNjAwX2lycV9zdXNwZW5kKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CkBAIC0yOTcwLDEyICszMDUxLDIwIEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKKwkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF0ucmluZ19vYmogPSBOVUxMOwogCXI2MDBfcmluZ19pbml0KHJkZXYsICZyZGV2LT5yaW5nW1JBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYXSwgMTAyNCAqIDEwMjQpOwogCi0JcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVhdLnJpbmdfb2JqID0gTlVMTDsKLQlyNjAwX3JpbmdfaW5pdChyZGV2LCAmcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVhdLCA2NCAqIDEwMjQpOwotCiAJcmRldi0+aWgucmluZ19vYmogPSBOVUxMOwogCXI2MDBfaWhfcmluZ19pbml0KHJkZXYsIDY0ICogMTAyNCk7CiAKQEAgLTI5ODgsNyArMzA3Nyw2IEBACiAJaWYgKHIpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJkaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CiAJCXI2MDBfY3BfZmluaShyZGV2KTsKLQkJcjYwMF9kbWFfZmluaShyZGV2KTsKIAkJcjYwMF9pcnFfZmluaShyZGV2KTsKIAkJcmFkZW9uX3diX2ZpbmkocmRldik7CiAJCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CkBAIC0zMDAyLDkgKzMwOTAsOSBAQAogCiB2b2lkIHI2MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fZmluaShyZGV2KTsKIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJcjYwMF9jcF9maW5pKHJkZXYpOwotCXI2MDBfZG1hX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKIAlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3AuYwppbmRleCBkOGViNDhiLi44YzliN2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3AuYwpAQCAtMjUxNSw3ICsyNTE1LDcgQEAKIAkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldChkZXYpOwogCQlpZiAoIWJ1ZikgewogCQkJRFJNX0RFQlVHKCJFQUdBSU5cbiIpOwotCQkJaWYgKERSTV9DT1BZX1RPX1VTRVIodGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpKSkKKwkJCWlmIChjb3B5X3RvX3VzZXIodGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CkBAIC0yNTI4LDcgKzI1MjgsNyBAQAogCQlidWZmZXIgPQogCQkgICAgKHUzMiAqKSAoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKyBidWYtPm9mZnNldCk7CiAKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHBhc3Nfc2l6ZSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgZGF0YSwgcGFzc19zaXplKSkgewogCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwgcGFzc19zaXplKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCmluZGV4IDVkY2VlYTYuLjI4MTJjN2QxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKQEAgLTc0OSw3ICs3NDksMTAgQEAKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWlmICgodG1wID4+IChpICogNCkpICYgMHhGKSB7CisJCQl1MzIgZm9ybWF0ID0gR18wMjgwQTBfRk9STUFUKHRyYWNrLT5jYl9jb2xvcl9pbmZvW2ldKTsKKworCQkJaWYgKGZvcm1hdCAhPSBWXzAyODBBMF9DT0xPUl9JTlZBTElEICYmCisJCQkgICAgKHRtcCA+PiAoaSAqIDQpKSAmIDB4RikgewogCQkJCS8qIGF0IGxlYXN0IG9uZSBjb21wb25lbnQgaXMgZW5hYmxlZCAqLwogCQkJCWlmICh0cmFjay0+Y2JfY29sb3JfYm9baV0gPT0gTlVMTCkgewogCQkJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCBtYXNrIDB4JTA4WCB8IDB4JTA4WCBubyBjYiBmb3IgJWRcbiIsCkBAIC0xMDA0LDggKzEwMDcsMjIgQEAKIAljYXNlIFJfMDA4QzY0X1NRX1ZTVE1QX1JJTkdfU0laRToKIAljYXNlIFJfMDI4OEM4X1NRX0dTX1ZFUlRfSVRFTVNJWkU6CiAJCS8qIGdldCB2YWx1ZSB0byBwb3B1bGF0ZSB0aGUgSUIgZG9uJ3QgcmVtb3ZlICovCi0JCXRtcCA9cmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwotCQlpYltpZHhdID0gMDsKKwkJLyp0bXAgPXJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwkJICBpYltpZHhdID0gMDsqLworCQlicmVhazsKKwljYXNlIFNRX0VTR1NfUklOR19CQVNFOgorCWNhc2UgU1FfR1NWU19SSU5HX0JBU0U6CisJY2FzZSBTUV9FU1RNUF9SSU5HX0JBU0U6CisJY2FzZSBTUV9HU1RNUF9SSU5HX0JBU0U6CisJY2FzZSBTUV9QU1RNUF9SSU5HX0JBU0U6CisJY2FzZSBTUV9WU1RNUF9SSU5HX0JBU0U6CisJCXIgPSByYWRlb25fY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jLCAwKTsKKwkJaWYgKHIpIHsKKwkJCWRldl93YXJuKHAtPmRldiwgImJhZCBTRVRfQ09OVEVYVF9SRUcgIgorCQkJCQkiMHglMDRYXG4iLCByZWcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWJbaWR4XSArPSAodTMyKSgocmVsb2MtPmxvYmouZ3B1X29mZnNldCA+PiA4KSAmIDB4ZmZmZmZmZmYpOwogCQlicmVhazsKIAljYXNlIFNRX0NPTkZJRzoKIAkJdHJhY2stPnNxX2NvbmZpZyA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKQEAgLTIzODYsNyArMjQwMyw3IEBACiAJaWJfY2h1bmsgPSAmcGFyc2VyLmNodW5rc1twYXJzZXIuY2h1bmtfaWJfaWR4XTsKIAlwYXJzZXIuaWIubGVuZ3RoX2R3ID0gaWJfY2h1bmstPmxlbmd0aF9kdzsKIAkqbCA9IHBhcnNlci5pYi5sZW5ndGhfZHc7Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUihpYiwgaWJfY2h1bmstPnVzZXJfcHRyLCBpYl9jaHVuay0+bGVuZ3RoX2R3ICogNCkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIoaWIsIGliX2NodW5rLT51c2VyX3B0ciwgaWJfY2h1bmstPmxlbmd0aF9kdyAqIDQpKSB7CiAJCXIgPSAtRUZBVUxUOwogCQlyNjAwX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwogCQlyZXR1cm4gcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9kbWEuYwppbmRleCA3ODQ0ZDE1Li5iMmQ0YzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2RtYS5jCkBAIC01MSw3ICs1MSwxNCBAQAogdWludDMyX3QgcjYwMF9kbWFfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCiB7Ci0JcmV0dXJuIChyYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyKHJkZXYsIHJpbmcpICYgMHgzZmZmYykgPj4gMjsKKwl1MzIgcnB0cjsKKworCWlmIChyZGV2LT53Yi5lbmFibGVkKQorCQlycHRyID0gcmRldi0+d2Iud2JbcmluZy0+cnB0cl9vZmZzLzRdOworCWVsc2UKKwkJcnB0ciA9IFJSRUczMihETUFfUkJfUlBUUik7CisKKwlyZXR1cm4gKHJwdHIgJiAweDNmZmZjKSA+PiAyOwogfQogCiAvKioKQEAgLTY1LDcgKzcyLDcgQEAKIHVpbnQzMl90IHI2MDBfZG1hX2dldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQogewotCXJldHVybiAoUlJFRzMyKHJpbmctPndwdHJfcmVnKSAmIDB4M2ZmZmMpID4+IDI7CisJcmV0dXJuIChSUkVHMzIoRE1BX1JCX1dQVFIpICYgMHgzZmZmYykgPj4gMjsKIH0KIAogLyoqCkBAIC03OSw3ICs4Niw3IEBACiB2b2lkIHI2MDBfZG1hX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkgICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQogewotCVdSRUczMihyaW5nLT53cHRyX3JlZywgKHJpbmctPndwdHIgPDwgMikgJiAweDNmZmZjKTsKKwlXUkVHMzIoRE1BX1JCX1dQVFIsIChyaW5nLT53cHRyIDw8IDIpICYgMHgzZmZmYyk7CiB9CiAKIC8qKgpAQCAtOTMsNyArMTAwLDggQEAKIHsKIAl1MzIgcmJfY250bCA9IFJSRUczMihETUFfUkJfQ05UTCk7CiAKLQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplKTsKKwlpZiAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplKTsKIAogCXJiX2NudGwgJj0gfkRNQV9SQl9FTkFCTEU7CiAJV1JFRzMyKERNQV9SQl9DTlRMLCByYl9jbnRsKTsKQEAgLTE4MCw3ICsxODgsOCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKKwlpZiAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2RwbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2RwbS5jCmluZGV4IDU1MTNkOGYuLmU0Y2M5YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9kcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfZHBtLmMKQEAgLTcyOSw4ICs3MjksOCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotaW50IHI2MDBfc2V0X3RoZXJtYWxfdGVtcGVyYXR1cmVfcmFuZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJICAgICAgIGludCBtaW5fdGVtcCwgaW50IG1heF90ZW1wKQorc3RhdGljIGludCByNjAwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkgICAgICBpbnQgbWluX3RlbXAsIGludCBtYXhfdGVtcCkKIHsKIAlpbnQgbG93X3RlbXAgPSAwICogMTAwMDsKIAlpbnQgaGlnaF90ZW1wID0gMjU1ICogMTAwMDsKQEAgLTc3Nyw2ICs3NzcsMjIgQEAKIAl9CiB9CiAKK2ludCByNjAwX2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcmV0OworCisJaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQgJiYKKwkgICAgcjYwMF9pc19pbnRlcm5hbF90aGVybWFsX3NlbnNvcihyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlKSkgeworCQlyZXQgPSByNjAwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHJkZXYsIFI2MDBfVEVNUF9SQU5HRV9NSU4sIFI2MDBfVEVNUF9SQU5HRV9NQVgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmRldi0+aXJxLmRwbV90aGVybWFsID0gdHJ1ZTsKKwkJcmFkZW9uX2lycV9zZXQocmRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHVuaW9uIHBvd2VyX2luZm8gewogCXN0cnVjdCBfQVRPTV9QT1dFUlBMQVlfSU5GTyBpbmZvOwogCXN0cnVjdCBfQVRPTV9QT1dFUlBMQVlfSU5GT19WMiBpbmZvXzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfZHBtLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfZHBtLmgKaW5kZXggMTAwMGJmOS4uMDdlYWIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2RwbS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9kcG0uaApAQCAtMjEzLDggKzIxMyw2IEBACiB2b2lkIHI2MDBfc3RhcnRfZHBtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjYwMF9zdG9wX2RwbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKLWludCByNjAwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJCSAgICAgICBpbnQgbWluX3RlbXAsIGludCBtYXhfdGVtcCk7CiBib29sIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IoZW51bSByYWRlb25faW50X3RoZXJtYWxfdHlwZSBzZW5zb3IpOwogCiBpbnQgcjYwMF9wYXJzZV9leHRlbmRlZF9wb3dlcl90YWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2hkbWkuYwppbmRleCBiN2QzZWNiLi4zMDE2ZmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfaGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9oZG1pLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQkgdmFsdWUsIH5IRE1JMF9BVURJT19URVNUX0VOKTsKIH0KIAotdm9pZCByNjAwX2F1ZGlvX3NldF9kdG8oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgY2xvY2spCitzdGF0aWMgdm9pZCByNjAwX2F1ZGlvX3NldF9kdG8oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgY2xvY2spCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKaW5kZXggZWJlMzg3Mi4uMzc0NTVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaApAQCAtNzAxLDExICs3MDEsMTggQEAKICNkZWZpbmUgUkxDX1VDT0RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNmMzAKIAogI2RlZmluZSBTUkJNX1NPRlRfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTYwCisjICAgICAgIGRlZmluZSBTT0ZUX1JFU0VUX0JJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKICMgICAgICAgZGVmaW5lIFNPRlRfUkVTRVRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFNPRlRfUkVTRVRfUkxDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMykKICMgICAgICAgZGVmaW5lIFNPRlRfUkVTRVRfVVZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkKICMgICAgICAgZGVmaW5lIFJWNzcwX1NPRlRfUkVTRVRfRE1BICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkKIAorI2RlZmluZSBCSUZfU0NSQVRDSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQzOAorCisjZGVmaW5lIEJVU19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NDIwCisjICAgICAgIGRlZmluZSBCSU9TX1JPTV9ESVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIFZHQV9DT0hFX1NQRUNfVElNRVJfRElTICAgICAgICAgICAgICAgICAgICAoMSA8PCA5KQorCiAjZGVmaW5lIENQX0lOVF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMTI0CiAjICAgICAgIGRlZmluZSBDTlRYX0JVU1lfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTkpCiAjICAgICAgIGRlZmluZSBDTlRYX0VNUFRZX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCkBAIC0xNTc1LDYgKzE1ODIsNyBAQAogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfQ1BfRE1BX0NNRF9EQUlDICAgICAgKDEgPDwgMjkpCiAjZGVmaW5lCVBBQ0tFVDNfU1VSRkFDRV9TWU5DCQkJCTB4NDMKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCMF9ERVNUX0JBU0VfRU5BICAgICgxIDw8IDYpCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19GVUxMX0NBQ0hFX0VOQSAgICAgICAoMSA8PCAyMCkgLyogcjd4eCsgb25seSAqLwogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjMpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19WQ19BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyNCkKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKaW5kZXggNDVlMWY0NC4uNGE4YWMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCkBAIC05OSw2ICs5OSw3IEBACiBleHRlcm4gaW50IHJhZGVvbl9kcG07CiBleHRlcm4gaW50IHJhZGVvbl9hc3BtOwogZXh0ZXJuIGludCByYWRlb25fcnVudGltZV9wbTsKK2V4dGVybiBpbnQgcmFkZW9uX2hhcmRfcmVzZXQ7CiAKIC8qCiAgKiBDb3B5IGZyb20gcmFkZW9uX2Rydi5oIHNvIHdlIGRvbid0IGhhdmUgdG8gaW5jbHVkZSBib3RoIGFuZCBoYXZlIGNvbmZsaWN0aW5nCkBAIC0xMzksNiArMTQwLDkgQEAKICNkZWZpbmUgUkFERU9OX1ZBX1JFU0VSVkVEX1NJWkUJCQkoOCA8PCAyMCkKICNkZWZpbmUgUkFERU9OX0lCX1ZNX01BWF9TSVpFCQkJKDY0IDw8IDEwKQogCisvKiBoYXJkIHJlc2V0IGRhdGEgKi8KKyNkZWZpbmUgUkFERU9OX0FTSUNfUkVTRVRfREFUQSAgICAgICAgICAgICAgICAgIDB4MzlkNWU4NmIKKwogLyogcmVzZXQgZmxhZ3MgKi8KICNkZWZpbmUgUkFERU9OX1JFU0VUX0dGWAkJCSgxIDw8IDApCiAjZGVmaW5lIFJBREVPTl9SRVNFVF9DT01QVVRFCQkJKDEgPDwgMSkKQEAgLTI1Miw2ICsyNTYsNyBAQAogICogUG93ZXIgbWFuYWdlbWVudAogICovCiBpbnQgcmFkZW9uX3BtX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHJhZGVvbl9wbV9sYXRlX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fcG1fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9wbV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTQxMyw2ICs0MTgsMTEgQEAKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZQkJYmRldjsKIAlib29sCQkJCW1lbV9nbG9iYWxfcmVmZXJlbmNlZDsKIAlib29sCQkJCWluaXRpYWxpemVkOworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCisJc3RydWN0IGRlbnRyeQkJCSp2cmFtOworCXN0cnVjdCBkZW50cnkJCQkqZ3R0OworI2VuZGlmCiB9OwogCiAvKiBibyB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyB2bSAqLwpAQCAtNzc5LDEzICs3ODksMTEgQEAKIAl2b2xhdGlsZSB1aW50MzJfdAkqcmluZzsKIAl1bnNpZ25lZAkJcnB0cjsKIAl1bnNpZ25lZAkJcnB0cl9vZmZzOwotCXVuc2lnbmVkCQlycHRyX3JlZzsKIAl1bnNpZ25lZAkJcnB0cl9zYXZlX3JlZzsKIAl1NjQJCQluZXh0X3JwdHJfZ3B1X2FkZHI7CiAJdm9sYXRpbGUgdTMyCQkqbmV4dF9ycHRyX2NwdV9hZGRyOwogCXVuc2lnbmVkCQl3cHRyOwogCXVuc2lnbmVkCQl3cHRyX29sZDsKLQl1bnNpZ25lZAkJd3B0cl9yZWc7CiAJdW5zaWduZWQJCXJpbmdfc2l6ZTsKIAl1bnNpZ25lZAkJcmluZ19mcmVlX2R3OwogCWludAkJCWNvdW50X2R3OwpAQCAtODU5LDYgKzg2Nyw4IEBACiAJc3RydWN0IHJhZGVvbl9mZW5jZQkJKmZlbmNlOwogCS8qIGxhc3QgZmx1c2ggb3IgTlVMTCBpZiB3ZSBzdGlsbCBuZWVkIHRvIGZsdXNoICovCiAJc3RydWN0IHJhZGVvbl9mZW5jZQkJKmxhc3RfZmx1c2g7CisJLyogbGFzdCB1c2Ugb2Ygdm1pZCAqLworCXN0cnVjdCByYWRlb25fZmVuY2UJCSpsYXN0X2lkX3VzZTsKIH07CiAKIHN0cnVjdCByYWRlb25fdm1fbWFuYWdlciB7CkBAIC05NDksNyArOTU5LDcgQEAKIGludCByYWRlb25fcmluZ19yZXN0b3JlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcsCiAJCQl1bnNpZ25lZCBzaXplLCB1aW50MzJfdCAqZGF0YSk7CiBpbnQgcmFkZW9uX3JpbmdfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9yaW5nICpjcCwgdW5zaWduZWQgcmluZ19zaXplLAotCQkgICAgIHVuc2lnbmVkIHJwdHJfb2ZmcywgdW5zaWduZWQgcnB0cl9yZWcsIHVuc2lnbmVkIHdwdHJfcmVnLCB1MzIgbm9wKTsKKwkJICAgICB1bnNpZ25lZCBycHRyX29mZnMsIHUzMiBub3ApOwogdm9pZCByYWRlb25fcmluZ19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX3JpbmcgKmNwKTsKIAogCkBAIC0xNzc1LDYgKzE3ODUsNyBAQAogCQlpbnQgKCppbml0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJCXZvaWQgKCpzZXR1cF9hc2ljKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJCWludCAoKmVuYWJsZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCQlpbnQgKCpsYXRlX2VuYWJsZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCQl2b2lkICgqZGlzYWJsZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCQlpbnQgKCpwcmVfc2V0X3Bvd2VyX3N0YXRlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJCWludCAoKnNldF9wb3dlcl9zdGF0ZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMjY1MCw2ICsyNjYxLDcgQEAKICNkZWZpbmUgcmFkZW9uX2RwbV9pbml0KHJkZXYpIHJkZXYtPmFzaWMtPmRwbS5pbml0KChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2RwbV9zZXR1cF9hc2ljKHJkZXYpIHJkZXYtPmFzaWMtPmRwbS5zZXR1cF9hc2ljKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2RwbV9lbmFibGUocmRldikgcmRldi0+YXNpYy0+ZHBtLmVuYWJsZSgocmRldikpCisjZGVmaW5lIHJhZGVvbl9kcG1fbGF0ZV9lbmFibGUocmRldikgcmRldi0+YXNpYy0+ZHBtLmxhdGVfZW5hYmxlKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2RwbV9kaXNhYmxlKHJkZXYpIHJkZXYtPmFzaWMtPmRwbS5kaXNhYmxlKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlKHJkZXYpIHJkZXYtPmFzaWMtPmRwbS5wcmVfc2V0X3Bvd2VyX3N0YXRlKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2RwbV9zZXRfcG93ZXJfc3RhdGUocmRldikgcmRldi0+YXNpYy0+ZHBtLnNldF9wb3dlcl9zdGF0ZSgocmRldikpCkBAIC0yNjY4LDYgKzI2ODAsNyBAQAogLyogQ29tbW9uIGZ1bmN0aW9ucyAqLwogLyogQUdQICovCiBleHRlcm4gaW50IHJhZGVvbl9ncHVfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX3BjaV9jb25maWdfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjYwMF9zZXRfYmlvc19zY3JhdGNoX2VuZ2luZV9odW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBib29sIGh1bmcpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX2FncF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX21vZGVzZXRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKaW5kZXggYzA0MjViYi4uZjc0ZGI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwpAQCAtMTgyLDkgKzE4Miw5IEBACiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkuaWJfdGVzdCA9ICZyMTAwX2liX3Rlc3QsCiAJLmlzX2xvY2t1cCA9ICZyMTAwX2dwdV9pc19sb2NrdXAsCi0JLmdldF9ycHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfZ2V0X3JwdHIsCi0JLmdldF93cHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfZ2V0X3dwdHIsCi0JLnNldF93cHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfc2V0X3dwdHIsCisJLmdldF9ycHRyID0gJnIxMDBfZ2Z4X2dldF9ycHRyLAorCS5nZXRfd3B0ciA9ICZyMTAwX2dmeF9nZXRfd3B0ciwKKwkuc2V0X3dwdHIgPSAmcjEwMF9nZnhfc2V0X3dwdHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHIxMDBfYXNpYyA9IHsKQEAgLTMzMCw5ICszMzAsOSBAQAogCS5yaW5nX3Rlc3QgPSAmcjEwMF9yaW5nX3Rlc3QsCiAJLmliX3Rlc3QgPSAmcjEwMF9pYl90ZXN0LAogCS5pc19sb2NrdXAgPSAmcjEwMF9ncHVfaXNfbG9ja3VwLAotCS5nZXRfcnB0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyLAotCS5nZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF93cHRyLAotCS5zZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX3NldF93cHRyLAorCS5nZXRfcnB0ciA9ICZyMTAwX2dmeF9nZXRfcnB0ciwKKwkuZ2V0X3dwdHIgPSAmcjEwMF9nZnhfZ2V0X3dwdHIsCisJLnNldF93cHRyID0gJnIxMDBfZ2Z4X3NldF93cHRyLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByMzAwX2FzaWMgPSB7CkBAIC04ODMsOSArODgzLDkgQEAKIAkucmluZ190ZXN0ID0gJnI2MDBfcmluZ190ZXN0LAogCS5pYl90ZXN0ID0gJnI2MDBfaWJfdGVzdCwKIAkuaXNfbG9ja3VwID0gJnI2MDBfZ2Z4X2lzX2xvY2t1cCwKLQkuZ2V0X3JwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19nZXRfcnB0ciwKLQkuZ2V0X3dwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19nZXRfd3B0ciwKLQkuc2V0X3dwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19zZXRfd3B0ciwKKwkuZ2V0X3JwdHIgPSAmcjYwMF9nZnhfZ2V0X3JwdHIsCisJLmdldF93cHRyID0gJnI2MDBfZ2Z4X2dldF93cHRyLAorCS5zZXRfd3B0ciA9ICZyNjAwX2dmeF9zZXRfd3B0ciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWNfcmluZyByNjAwX2RtYV9yaW5nID0gewpAQCAtMTA0NSw2ICsxMDQ1LDcgQEAKIAkJLmluaXQgPSAmcnY2eHhfZHBtX2luaXQsCiAJCS5zZXR1cF9hc2ljID0gJnJ2Nnh4X3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmcnY2eHhfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJnI2MDBfZHBtX2xhdGVfZW5hYmxlLAogCQkuZGlzYWJsZSA9ICZydjZ4eF9kcG1fZGlzYWJsZSwKIAkJLnByZV9zZXRfcG93ZXJfc3RhdGUgPSAmcjYwMF9kcG1fcHJlX3NldF9wb3dlcl9zdGF0ZSwKIAkJLnNldF9wb3dlcl9zdGF0ZSA9ICZydjZ4eF9kcG1fc2V0X3Bvd2VyX3N0YXRlLApAQCAtMTEzNSw2ICsxMTM2LDcgQEAKIAkJLmluaXQgPSAmcnM3ODBfZHBtX2luaXQsCiAJCS5zZXR1cF9hc2ljID0gJnJzNzgwX2RwbV9zZXR1cF9hc2ljLAogCQkuZW5hYmxlID0gJnJzNzgwX2RwbV9lbmFibGUsCisJCS5sYXRlX2VuYWJsZSA9ICZyNjAwX2RwbV9sYXRlX2VuYWJsZSwKIAkJLmRpc2FibGUgPSAmcnM3ODBfZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJnI2MDBfZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUsCiAJCS5zZXRfcG93ZXJfc3RhdGUgPSAmcnM3ODBfZHBtX3NldF9wb3dlcl9zdGF0ZSwKQEAgLTEyMzksNiArMTI0MSw3IEBACiAJCS5pbml0ID0gJnJ2NzcwX2RwbV9pbml0LAogCQkuc2V0dXBfYXNpYyA9ICZydjc3MF9kcG1fc2V0dXBfYXNpYywKIAkJLmVuYWJsZSA9ICZydjc3MF9kcG1fZW5hYmxlLAorCQkubGF0ZV9lbmFibGUgPSAmcnY3NzBfZHBtX2xhdGVfZW5hYmxlLAogCQkuZGlzYWJsZSA9ICZydjc3MF9kcG1fZGlzYWJsZSwKIAkJLnByZV9zZXRfcG93ZXJfc3RhdGUgPSAmcjYwMF9kcG1fcHJlX3NldF9wb3dlcl9zdGF0ZSwKIAkJLnNldF9wb3dlcl9zdGF0ZSA9ICZydjc3MF9kcG1fc2V0X3Bvd2VyX3N0YXRlLApAQCAtMTI2Nyw5ICsxMjcwLDkgQEAKIAkucmluZ190ZXN0ID0gJnI2MDBfcmluZ190ZXN0LAogCS5pYl90ZXN0ID0gJnI2MDBfaWJfdGVzdCwKIAkuaXNfbG9ja3VwID0gJmV2ZXJncmVlbl9nZnhfaXNfbG9ja3VwLAotCS5nZXRfcnB0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyLAotCS5nZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF93cHRyLAotCS5zZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX3NldF93cHRyLAorCS5nZXRfcnB0ciA9ICZyNjAwX2dmeF9nZXRfcnB0ciwKKwkuZ2V0X3dwdHIgPSAmcjYwMF9nZnhfZ2V0X3dwdHIsCisJLnNldF93cHRyID0gJnI2MDBfZ2Z4X3NldF93cHRyLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpY19yaW5nIGV2ZXJncmVlbl9kbWFfcmluZyA9IHsKQEAgLTEzNTcsNiArMTM2MCw3IEBACiAJCS5pbml0ID0gJmN5cHJlc3NfZHBtX2luaXQsCiAJCS5zZXR1cF9hc2ljID0gJmN5cHJlc3NfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmY3lwcmVzc19kcG1fZW5hYmxlLAorCQkubGF0ZV9lbmFibGUgPSAmcnY3NzBfZHBtX2xhdGVfZW5hYmxlLAogCQkuZGlzYWJsZSA9ICZjeXByZXNzX2RwbV9kaXNhYmxlLAogCQkucHJlX3NldF9wb3dlcl9zdGF0ZSA9ICZyNjAwX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJmN5cHJlc3NfZHBtX3NldF9wb3dlcl9zdGF0ZSwKQEAgLTE0NDksNiArMTQ1Myw3IEBACiAJCS5pbml0ID0gJnN1bW9fZHBtX2luaXQsCiAJCS5zZXR1cF9hc2ljID0gJnN1bW9fZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmc3Vtb19kcG1fZW5hYmxlLAorCQkubGF0ZV9lbmFibGUgPSAmc3Vtb19kcG1fbGF0ZV9lbmFibGUsCiAJCS5kaXNhYmxlID0gJnN1bW9fZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJnN1bW9fZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUsCiAJCS5zZXRfcG93ZXJfc3RhdGUgPSAmc3Vtb19kcG1fc2V0X3Bvd2VyX3N0YXRlLApAQCAtMTU0MCw2ICsxNTQ1LDcgQEAKIAkJLmluaXQgPSAmYnRjX2RwbV9pbml0LAogCQkuc2V0dXBfYXNpYyA9ICZidGNfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmYnRjX2RwbV9lbmFibGUsCisJCS5sYXRlX2VuYWJsZSA9ICZydjc3MF9kcG1fbGF0ZV9lbmFibGUsCiAJCS5kaXNhYmxlID0gJmJ0Y19kcG1fZGlzYWJsZSwKIAkJLnByZV9zZXRfcG93ZXJfc3RhdGUgPSAmYnRjX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJmJ0Y19kcG1fc2V0X3Bvd2VyX3N0YXRlLApAQCAtMTU3MCw5ICsxNTc2LDkgQEAKIAkuaWJfdGVzdCA9ICZyNjAwX2liX3Rlc3QsCiAJLmlzX2xvY2t1cCA9ICZjYXltYW5fZ2Z4X2lzX2xvY2t1cCwKIAkudm1fZmx1c2ggPSAmY2F5bWFuX3ZtX2ZsdXNoLAotCS5nZXRfcnB0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyLAotCS5nZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX2dldF93cHRyLAotCS5zZXRfd3B0ciA9ICZyYWRlb25fcmluZ19nZW5lcmljX3NldF93cHRyLAorCS5nZXRfcnB0ciA9ICZjYXltYW5fZ2Z4X2dldF9ycHRyLAorCS5nZXRfd3B0ciA9ICZjYXltYW5fZ2Z4X2dldF93cHRyLAorCS5zZXRfd3B0ciA9ICZjYXltYW5fZ2Z4X3NldF93cHRyLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpY19yaW5nIGNheW1hbl9kbWFfcmluZyA9IHsKQEAgLTE1ODUsOSArMTU5MSw5IEBACiAJLmliX3Rlc3QgPSAmcjYwMF9kbWFfaWJfdGVzdCwKIAkuaXNfbG9ja3VwID0gJmNheW1hbl9kbWFfaXNfbG9ja3VwLAogCS52bV9mbHVzaCA9ICZjYXltYW5fZG1hX3ZtX2ZsdXNoLAotCS5nZXRfcnB0ciA9ICZyNjAwX2RtYV9nZXRfcnB0ciwKLQkuZ2V0X3dwdHIgPSAmcjYwMF9kbWFfZ2V0X3dwdHIsCi0JLnNldF93cHRyID0gJnI2MDBfZG1hX3NldF93cHRyCisJLmdldF9ycHRyID0gJmNheW1hbl9kbWFfZ2V0X3JwdHIsCisJLmdldF93cHRyID0gJmNheW1hbl9kbWFfZ2V0X3dwdHIsCisJLnNldF93cHRyID0gJmNheW1hbl9kbWFfc2V0X3dwdHIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWNfcmluZyBjYXltYW5fdXZkX3JpbmcgPSB7CkBAIC0xNjgzLDYgKzE2ODksNyBAQAogCQkuaW5pdCA9ICZuaV9kcG1faW5pdCwKIAkJLnNldHVwX2FzaWMgPSAmbmlfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmbmlfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJnJ2NzcwX2RwbV9sYXRlX2VuYWJsZSwKIAkJLmRpc2FibGUgPSAmbmlfZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJm5pX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJm5pX2RwbV9zZXRfcG93ZXJfc3RhdGUsCkBAIC0xNzgzLDYgKzE3OTAsNyBAQAogCQkuaW5pdCA9ICZ0cmluaXR5X2RwbV9pbml0LAogCQkuc2V0dXBfYXNpYyA9ICZ0cmluaXR5X2RwbV9zZXR1cF9hc2ljLAogCQkuZW5hYmxlID0gJnRyaW5pdHlfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJnRyaW5pdHlfZHBtX2xhdGVfZW5hYmxlLAogCQkuZGlzYWJsZSA9ICZ0cmluaXR5X2RwbV9kaXNhYmxlLAogCQkucHJlX3NldF9wb3dlcl9zdGF0ZSA9ICZ0cmluaXR5X2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJnRyaW5pdHlfZHBtX3NldF9wb3dlcl9zdGF0ZSwKQEAgLTE4MTMsOSArMTgyMSw5IEBACiAJLmliX3Rlc3QgPSAmcjYwMF9pYl90ZXN0LAogCS5pc19sb2NrdXAgPSAmc2lfZ2Z4X2lzX2xvY2t1cCwKIAkudm1fZmx1c2ggPSAmc2lfdm1fZmx1c2gsCi0JLmdldF9ycHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfZ2V0X3JwdHIsCi0JLmdldF93cHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfZ2V0X3dwdHIsCi0JLnNldF93cHRyID0gJnJhZGVvbl9yaW5nX2dlbmVyaWNfc2V0X3dwdHIsCisJLmdldF9ycHRyID0gJmNheW1hbl9nZnhfZ2V0X3JwdHIsCisJLmdldF93cHRyID0gJmNheW1hbl9nZnhfZ2V0X3dwdHIsCisJLnNldF93cHRyID0gJmNheW1hbl9nZnhfc2V0X3dwdHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljX3Jpbmcgc2lfZG1hX3JpbmcgPSB7CkBAIC0xODI4LDkgKzE4MzYsOSBAQAogCS5pYl90ZXN0ID0gJnI2MDBfZG1hX2liX3Rlc3QsCiAJLmlzX2xvY2t1cCA9ICZzaV9kbWFfaXNfbG9ja3VwLAogCS52bV9mbHVzaCA9ICZzaV9kbWFfdm1fZmx1c2gsCi0JLmdldF9ycHRyID0gJnI2MDBfZG1hX2dldF9ycHRyLAotCS5nZXRfd3B0ciA9ICZyNjAwX2RtYV9nZXRfd3B0ciwKLQkuc2V0X3dwdHIgPSAmcjYwMF9kbWFfc2V0X3dwdHIsCisJLmdldF9ycHRyID0gJmNheW1hbl9kbWFfZ2V0X3JwdHIsCisJLmdldF93cHRyID0gJmNheW1hbl9kbWFfZ2V0X3dwdHIsCisJLnNldF93cHRyID0gJmNheW1hbl9kbWFfc2V0X3dwdHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHNpX2FzaWMgPSB7CkBAIC0xOTEzLDYgKzE5MjEsNyBAQAogCQkuaW5pdCA9ICZzaV9kcG1faW5pdCwKIAkJLnNldHVwX2FzaWMgPSAmc2lfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmc2lfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJnNpX2RwbV9sYXRlX2VuYWJsZSwKIAkJLmRpc2FibGUgPSAmc2lfZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJnNpX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJnNpX2RwbV9zZXRfcG93ZXJfc3RhdGUsCkBAIC0xOTQzLDkgKzE5NTIsOSBAQAogCS5pYl90ZXN0ID0gJmNpa19pYl90ZXN0LAogCS5pc19sb2NrdXAgPSAmY2lrX2dmeF9pc19sb2NrdXAsCiAJLnZtX2ZsdXNoID0gJmNpa192bV9mbHVzaCwKLQkuZ2V0X3JwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19nZXRfcnB0ciwKLQkuZ2V0X3dwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19nZXRfd3B0ciwKLQkuc2V0X3dwdHIgPSAmcmFkZW9uX3JpbmdfZ2VuZXJpY19zZXRfd3B0ciwKKwkuZ2V0X3JwdHIgPSAmY2lrX2dmeF9nZXRfcnB0ciwKKwkuZ2V0X3dwdHIgPSAmY2lrX2dmeF9nZXRfd3B0ciwKKwkuc2V0X3dwdHIgPSAmY2lrX2dmeF9zZXRfd3B0ciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWNfcmluZyBjaV9jcF9yaW5nID0gewpAQCAtMTk1OCw5ICsxOTY3LDkgQEAKIAkuaWJfdGVzdCA9ICZjaWtfaWJfdGVzdCwKIAkuaXNfbG9ja3VwID0gJmNpa19nZnhfaXNfbG9ja3VwLAogCS52bV9mbHVzaCA9ICZjaWtfdm1fZmx1c2gsCi0JLmdldF9ycHRyID0gJmNpa19jb21wdXRlX3JpbmdfZ2V0X3JwdHIsCi0JLmdldF93cHRyID0gJmNpa19jb21wdXRlX3JpbmdfZ2V0X3dwdHIsCi0JLnNldF93cHRyID0gJmNpa19jb21wdXRlX3Jpbmdfc2V0X3dwdHIsCisJLmdldF9ycHRyID0gJmNpa19jb21wdXRlX2dldF9ycHRyLAorCS5nZXRfd3B0ciA9ICZjaWtfY29tcHV0ZV9nZXRfd3B0ciwKKwkuc2V0X3dwdHIgPSAmY2lrX2NvbXB1dGVfc2V0X3dwdHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljX3JpbmcgY2lfZG1hX3JpbmcgPSB7CkBAIC0xOTczLDkgKzE5ODIsOSBAQAogCS5pYl90ZXN0ID0gJmNpa19zZG1hX2liX3Rlc3QsCiAJLmlzX2xvY2t1cCA9ICZjaWtfc2RtYV9pc19sb2NrdXAsCiAJLnZtX2ZsdXNoID0gJmNpa19kbWFfdm1fZmx1c2gsCi0JLmdldF9ycHRyID0gJnI2MDBfZG1hX2dldF9ycHRyLAotCS5nZXRfd3B0ciA9ICZyNjAwX2RtYV9nZXRfd3B0ciwKLQkuc2V0X3dwdHIgPSAmcjYwMF9kbWFfc2V0X3dwdHIsCisJLmdldF9ycHRyID0gJmNpa19zZG1hX2dldF9ycHRyLAorCS5nZXRfd3B0ciA9ICZjaWtfc2RtYV9nZXRfd3B0ciwKKwkuc2V0X3dwdHIgPSAmY2lrX3NkbWFfc2V0X3dwdHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIGNpX2FzaWMgPSB7CkBAIC0yMDU4LDYgKzIwNjcsNyBAQAogCQkuaW5pdCA9ICZjaV9kcG1faW5pdCwKIAkJLnNldHVwX2FzaWMgPSAmY2lfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAmY2lfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJmNpX2RwbV9sYXRlX2VuYWJsZSwKIAkJLmRpc2FibGUgPSAmY2lfZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJmNpX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJmNpX2RwbV9zZXRfcG93ZXJfc3RhdGUsCkBAIC0yMTU5LDYgKzIxNjksNyBAQAogCQkuaW5pdCA9ICZrdl9kcG1faW5pdCwKIAkJLnNldHVwX2FzaWMgPSAma3ZfZHBtX3NldHVwX2FzaWMsCiAJCS5lbmFibGUgPSAma3ZfZHBtX2VuYWJsZSwKKwkJLmxhdGVfZW5hYmxlID0gJmt2X2RwbV9sYXRlX2VuYWJsZSwKIAkJLmRpc2FibGUgPSAma3ZfZHBtX2Rpc2FibGUsCiAJCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJmt2X2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAogCQkuc2V0X3Bvd2VyX3N0YXRlID0gJmt2X2RwbV9zZXRfcG93ZXJfc3RhdGUsCkBAIC0yNDQ5LDcgKzI0NjAsNyBAQAogCQkJcmRldi0+Y2dfZmxhZ3MgPQogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9NR0NHIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfTUdMUyB8Ci0JCQkJLypSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dDRyB8Ki8KKwkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dDRyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHTFMgfAogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9DR1RTIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dUU19MUyB8CkBAIC0yNDY4LDcgKzI0NzksNyBAQAogCQkJcmRldi0+Y2dfZmxhZ3MgPQogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9NR0NHIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfTUdMUyB8Ci0JCQkJLypSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dDRyB8Ki8KKwkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dDRyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHTFMgfAogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9DR1RTIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ1BfTFMgfApAQCAtMjQ5Myw3ICsyNTA0LDcgQEAKIAkJCXJkZXYtPmNnX2ZsYWdzID0KIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfTUdDRyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX01HTFMgfAotCQkJCS8qUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHQ0cgfCovCisJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHQ0cgfAogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9DR0xTIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dUUyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHVFNfTFMgfApAQCAtMjUyMSw3ICsyNTMyLDcgQEAKIAkJCXJkZXYtPmNnX2ZsYWdzID0KIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfTUdDRyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX01HTFMgfAotCQkJCS8qUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHQ0cgfCovCisJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHQ0cgfAogCQkJCVJBREVPTl9DR19TVVBQT1JUX0dGWF9DR0xTIHwKIAkJCQlSQURFT05fQ0dfU1VQUE9SVF9HRlhfQ0dUUyB8CiAJCQkJUkFERU9OX0NHX1NVUFBPUlRfR0ZYX0NHVFNfTFMgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCmluZGV4IGM5ZmQ5N2IuLmIzYmM0MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKQEAgLTQ3LDEzICs0Nyw2IEBACiB2b2lkIHJhZGVvbl9sZWdhY3lfc2V0X2JhY2tsaWdodF9sZXZlbChzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyLCB1OCBsZXZlbCk7CiB1OCByYWRlb25fbGVnYWN5X2dldF9iYWNrbGlnaHRfbGV2ZWwoc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2Rlcik7CiAKLXUzMiByYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJCSBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwotdTMyIHJhZGVvbl9yaW5nX2dlbmVyaWNfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Ci12b2lkIHJhZGVvbl9yaW5nX2dlbmVyaWNfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwotCiAvKgogICogcjEwMCxydjEwMCxyczEwMCxydjIwMCxyczIwMAogICovCkBAIC0xNDgsNiArMTQxLDEzIEBACiBleHRlcm4gdm9pZCByMTAwX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogZXh0ZXJuIGludCByMTAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCit1MzIgcjEwMF9nZnhfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit1MzIgcjEwMF9nZnhfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit2b2lkIHIxMDBfZ2Z4X3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKKwogLyoKICAqIHIyMDAscnYyNTAscnMzMDAscnYyODAKICAqLwpAQCAtMzY4LDYgKzM2OCwxMiBAQAogaW50IHI2MDBfcGNpZV9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByNjAwX3NjcmF0Y2hfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcjYwMF9pbml0X21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit1MzIgcjYwMF9nZnhfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit1MzIgcjYwMF9nZnhfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit2b2lkIHI2MDBfZ2Z4X3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKIC8qIHI2MDAgaXJxICovCiBpbnQgcjYwMF9pcnFfcHJvY2VzcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcjYwMF9pcnFfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC0zOTIsNiArMzk4LDcgQEAKIGludCByNjAwX3NldF91dmRfY2xvY2tzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgdmNsaywgdTMyIGRjbGspOwogaW50IHI2MDBfZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByNjAwX2RwbV9wb3N0X3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQgcjYwMF9kcG1fbGF0ZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogLyogcjYwMCBkbWEgKi8KIHVpbnQzMl90IHI2MDBfZG1hX2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKQEAgLTQ1NCw2ICs0NjEsNyBAQAogLyogcnY3eHggcG0gKi8KIGludCBydjc3MF9kcG1faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnY3NzBfZHBtX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQgcnY3NzBfZHBtX2xhdGVfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcnY3NzBfZHBtX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJ2NzcwX2RwbV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBydjc3MF9kcG1fc2V0dXBfYXNpYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC01NDUsNiArNTUzLDcgQEAKIGJvb2wgYnRjX2RwbV92YmxhbmtfdG9vX3Nob3J0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBzdW1vX2RwbV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBzdW1vX2RwbV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHN1bW9fZHBtX2xhdGVfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgc3Vtb19kcG1fZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgc3Vtb19kcG1fcHJlX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgc3Vtb19kcG1fc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTU5MSw2ICs2MDAsMTkgQEAKIAogdm9pZCBjYXltYW5fZG1hX3ZtX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgcmlkeCwgc3RydWN0IHJhZGVvbl92bSAqdm0pOwogCit1MzIgY2F5bWFuX2dmeF9nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCXN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit1MzIgY2F5bWFuX2dmeF9nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCXN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit2b2lkIGNheW1hbl9nZnhfc2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKK3VpbnQzMl90IGNheW1hbl9kbWFfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit1aW50MzJfdCBjYXltYW5fZG1hX2dldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordm9pZCBjYXltYW5fZG1hX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7CisKIGludCBuaV9kcG1faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIG5pX2RwbV9zZXR1cF9hc2ljKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBuaV9kcG1fZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTYxMCw2ICs2MzIsNyBAQAogYm9vbCBuaV9kcG1fdmJsYW5rX3Rvb19zaG9ydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgdHJpbml0eV9kcG1faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgdHJpbml0eV9kcG1fZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCB0cmluaXR5X2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHRyaW5pdHlfZHBtX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHRyaW5pdHlfZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHRyaW5pdHlfZHBtX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC02NjksNiArNjkyLDcgQEAKIGludCBzaV9kcG1faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHNpX2RwbV9zZXR1cF9hc2ljKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBzaV9kcG1fZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCBzaV9kcG1fbGF0ZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBzaV9kcG1fZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgc2lfZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHNpX2RwbV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtNzM5LDE3ICs3NjMsMzAgQEAKIAkJCSAgdWludDMyX3QgaW5jciwgdWludDMyX3QgZmxhZ3MpOwogdm9pZCBjaWtfZG1hX3ZtX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgcmlkeCwgc3RydWN0IHJhZGVvbl92bSAqdm0pOwogaW50IGNpa19pYl9wYXJzZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9pYiAqaWIpOwotdTMyIGNpa19jb21wdXRlX3JpbmdfZ2V0X3JwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwotdTMyIGNpa19jb21wdXRlX3JpbmdfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwotdm9pZCBjaWtfY29tcHV0ZV9yaW5nX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit1MzIgY2lrX2dmeF9nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordTMyIGNpa19nZnhfZ2V0X3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCSAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKK3ZvaWQgY2lrX2dmeF9zZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKK3UzMiBjaWtfY29tcHV0ZV9nZXRfcnB0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordTMyIGNpa19jb21wdXRlX2dldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7Cit2b2lkIGNpa19jb21wdXRlX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordTMyIGNpa19zZG1hX2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordTMyIGNpa19zZG1hX2dldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkgICAgICBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpOwordm9pZCBjaWtfc2RtYV9zZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJICAgICAgIHN0cnVjdCByYWRlb25fcmluZyAqcmluZyk7CiBpbnQgY2lfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IGt2X2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogaW50IGNpX2RwbV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBjaV9kcG1fZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCBjaV9kcG1fbGF0ZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBjaV9kcG1fZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgY2lfZHBtX3ByZV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IGNpX2RwbV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtNzcwLDYgKzgwNyw3IEBACiAKIGludCBrdl9kcG1faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQga3ZfZHBtX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQga3ZfZHBtX2xhdGVfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQga3ZfZHBtX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IGt2X2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBrdl9kcG1fc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IDVjMzliZjcuLjMwODQ0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtMzAsMjcgKzMwLDEwIEBACiAjaW5jbHVkZSAiYXRvbS5oIgogI2luY2x1ZGUgImF0b20tYml0cy5oIgogCi0vKiBmcm9tIHJhZGVvbl9lbmNvZGVyLmMgKi8KLWV4dGVybiB1aW50MzJfdAotcmFkZW9uX2dldF9lbmNvZGVyX2VudW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSwKLQkJCXVpbnQ4X3QgZGFjKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9saW5rX2VuY29kZXJfY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQKIHJhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGVuY29kZXJfZW51bSwKIAkJCXVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsIHUxNiBjYXBzKTsKIAotLyogZnJvbSByYWRlb25fY29ubmVjdG9yLmMgKi8KLWV4dGVybiB2b2lkCi1yYWRlb25fYWRkX2F0b21fY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCwKLQkJCSAgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSwKLQkJCSAgaW50IGNvbm5lY3Rvcl90eXBlLAotCQkJICBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICppMmNfYnVzLAotCQkJICB1aW50MzJfdCBpZ3BfbGFuZV9pbmZvLAotCQkJICB1aW50MTZfdCBjb25uZWN0b3Jfb2JqZWN0X2lkLAotCQkJICBzdHJ1Y3QgcmFkZW9uX2hwZCAqaHBkLAotCQkJICBzdHJ1Y3QgcmFkZW9uX3JvdXRlciAqcm91dGVyKTsKLQogLyogZnJvbSByYWRlb25fbGVnYWN5X2VuY29kZXIuYyAqLwogZXh0ZXJuIHZvaWQKIHJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZW5jb2Rlcl9lbnVtLApAQCAtMTUyOCw2ICsxNTExLDcgQEAKIAkJCQkJCWxlMTZfdG9fY3B1KHNzX2Fzc2lnbi0+djEudXNTcHJlYWRTcGVjdHJ1bVBlcmNlbnRhZ2UpOwogCQkJCQlzcy0+dHlwZSA9IHNzX2Fzc2lnbi0+djEudWNTcHJlYWRTcGVjdHJ1bU1vZGU7CiAJCQkJCXNzLT5yYXRlID0gbGUxNl90b19jcHUoc3NfYXNzaWduLT52MS51c1NwcmVhZFJhdGVJbktoeik7CisJCQkJCXNzLT5wZXJjZW50YWdlX2RpdmlkZXIgPSAxMDA7CiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCQlzc19hc3NpZ24gPSAodW5pb24gYXNpY19zc19hc3NpZ25tZW50ICopCkBAIC0xNTQ1LDYgKzE1MjksNyBAQAogCQkJCQkJbGUxNl90b19jcHUoc3NfYXNzaWduLT52Mi51c1NwcmVhZFNwZWN0cnVtUGVyY2VudGFnZSk7CiAJCQkJCXNzLT50eXBlID0gc3NfYXNzaWduLT52Mi51Y1NwcmVhZFNwZWN0cnVtTW9kZTsKIAkJCQkJc3MtPnJhdGUgPSBsZTE2X3RvX2NwdShzc19hc3NpZ24tPnYyLnVzU3ByZWFkUmF0ZUluMTBIeik7CisJCQkJCXNzLT5wZXJjZW50YWdlX2RpdmlkZXIgPSAxMDA7CiAJCQkJCWlmICgoY3JldiA9PSAyKSAmJgogCQkJCQkgICAgKChpZCA9PSBBU0lDX0lOVEVSTkFMX0VOR0lORV9TUykgfHwKIAkJCQkJICAgICAoaWQgPT0gQVNJQ19JTlRFUk5BTF9NRU1PUllfU1MpKSkKQEAgLTE1NjYsNiArMTU1MSwxMSBAQAogCQkJCQkJbGUxNl90b19jcHUoc3NfYXNzaWduLT52My51c1NwcmVhZFNwZWN0cnVtUGVyY2VudGFnZSk7CiAJCQkJCXNzLT50eXBlID0gc3NfYXNzaWduLT52My51Y1NwcmVhZFNwZWN0cnVtTW9kZTsKIAkJCQkJc3MtPnJhdGUgPSBsZTE2X3RvX2NwdShzc19hc3NpZ24tPnYzLnVzU3ByZWFkUmF0ZUluMTBIeik7CisJCQkJCWlmIChzc19hc3NpZ24tPnYzLnVjU3ByZWFkU3BlY3RydW1Nb2RlICYKKwkJCQkJICAgIFNTX01PREVfVjNfUEVSQ0VOVEFHRV9ESVZfQllfMTAwMF9NQVNLKQorCQkJCQkJc3MtPnBlcmNlbnRhZ2VfZGl2aWRlciA9IDEwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXNzLT5wZXJjZW50YWdlX2RpdmlkZXIgPSAxMDA7CiAJCQkJCWlmICgoaWQgPT0gQVNJQ19JTlRFUk5BTF9FTkdJTkVfU1MpIHx8CiAJCQkJCSAgICAoaWQgPT0gQVNJQ19JTlRFUk5BTF9NRU1PUllfU1MpKQogCQkJCQkJc3MtPnJhdGUgLz0gMTAwOwpAQCAtMTgwOSw3ICsxNzk5LDggQEAKIAkJaWYgKG1pc2MgJiBBVE9NX0RPVUJMRV9DTE9DS19NT0RFKQogCQkJbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19EQkxTQ0FOOwogCi0JCW1vZGUtPmNsb2NrID0gbGUxNl90b19jcHUodHZfaW5mby0+YU1vZGVUaW1pbmdzW2luZGV4XS51c1BpeGVsQ2xvY2spICogMTA7CisJCW1vZGUtPmNydGNfY2xvY2sgPSBtb2RlLT5jbG9jayA9CisJCQlsZTE2X3RvX2NwdSh0dl9pbmZvLT5hTW9kZVRpbWluZ3NbaW5kZXhdLnVzUGl4ZWxDbG9jaykgKiAxMDsKIAogCQlpZiAoaW5kZXggPT0gMSkgewogCQkJLyogUEFMIHRpbWluZ3MgYXBwZWFyIHRvIGhhdmUgd3JvbmcgdmFsdWVzIGZvciB0b3RhbHMgKi8KQEAgLTE4NTIsNyArMTg0Myw4IEBACiAJCWlmIChtaXNjICYgQVRPTV9ET1VCTEVfQ0xPQ0tfTU9ERSkKIAkJCW1vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfREJMU0NBTjsKIAotCQltb2RlLT5jbG9jayA9IGxlMTZfdG9fY3B1KGR0ZF90aW1pbmdzLT51c1BpeENsaykgKiAxMDsKKwkJbW9kZS0+Y3J0Y19jbG9jayA9IG1vZGUtPmNsb2NrID0KKwkJCWxlMTZfdG9fY3B1KGR0ZF90aW1pbmdzLT51c1BpeENsaykgKiAxMDsKIAkJYnJlYWs7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtMzg4NCwxNiArMzg3NiwxOCBAQAogCQkJCQkJCSgodTggKilmb3JtYXQgKyBzaXplb2YoQVRPTV9JTklUX1JFR19JTkRFWF9GT1JNQVQpKTsKIAkJCQkJfQogCQkJCQlyZWdfdGFibGUtPmxhc3QgPSBpOwotCQkJCQl3aGlsZSAoKCoodTMyICopcmVnX2RhdGEgIT0gRU5EX09GX1JFR19EQVRBX0JMT0NLKSAmJgorCQkJCQl3aGlsZSAoKGxlMzJfdG9fY3B1KCoodTMyICopcmVnX2RhdGEpICE9IEVORF9PRl9SRUdfREFUQV9CTE9DSykgJiYKIAkJCQkJICAgICAgIChudW1fcmFuZ2VzIDwgVkJJT1NfTUFYX0FDX1RJTUlOR19FTlRSSUVTKSkgewotCQkJCQkJdF9tZW1faWQgPSAodTgpKCgqKHUzMiAqKXJlZ19kYXRhICYgTUVNX0lEX01BU0spID4+IE1FTV9JRF9TSElGVCk7CisJCQkJCQl0X21lbV9pZCA9ICh1OCkoKGxlMzJfdG9fY3B1KCoodTMyICopcmVnX2RhdGEpICYgTUVNX0lEX01BU0spCisJCQkJCQkJCT4+IE1FTV9JRF9TSElGVCk7CiAJCQkJCQlpZiAobW9kdWxlX2luZGV4ID09IHRfbWVtX2lkKSB7CiAJCQkJCQkJcmVnX3RhYmxlLT5tY19yZWdfdGFibGVfZW50cnlbbnVtX3Jhbmdlc10ubWNsa19tYXggPQotCQkJCQkJCQkodTMyKSgoKih1MzIgKilyZWdfZGF0YSAmIENMT0NLX1JBTkdFX01BU0spID4+IENMT0NLX1JBTkdFX1NISUZUKTsKKwkJCQkJCQkJKHUzMikoKGxlMzJfdG9fY3B1KCoodTMyICopcmVnX2RhdGEpICYgQ0xPQ0tfUkFOR0VfTUFTSykKKwkJCQkJCQkJICAgICAgPj4gQ0xPQ0tfUkFOR0VfU0hJRlQpOwogCQkJCQkJCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgcmVnX3RhYmxlLT5sYXN0OyBpKyspIHsKIAkJCQkJCQkJaWYgKChyZWdfdGFibGUtPm1jX3JlZ19hZGRyZXNzW2ldLnByZV9yZWdfZGF0YSAmIExPV19OSUJCTEVfTUFTSykgPT0gREFUQV9GUk9NX1RBQkxFKSB7CiAJCQkJCQkJCQlyZWdfdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtudW1fcmFuZ2VzXS5tY19kYXRhW2ldID0KLQkJCQkJCQkJCQkodTMyKSooKHUzMiAqKXJlZ19kYXRhICsgaik7CisJCQkJCQkJCQkJKHUzMilsZTMyX3RvX2NwdSgqKCh1MzIgKilyZWdfZGF0YSArIGopKTsKIAkJCQkJCQkJCWorKzsKIAkJCQkJCQkJfSBlbHNlIGlmICgocmVnX3RhYmxlLT5tY19yZWdfYWRkcmVzc1tpXS5wcmVfcmVnX2RhdGEgJiBMT1dfTklCQkxFX01BU0spID09IERBVEFfRVFVX1BSRVYpIHsKIAkJCQkJCQkJCXJlZ190YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W251bV9yYW5nZXNdLm1jX2RhdGFbaV0gPQpAQCAtMzkwNSw3ICszODk5LDcgQEAKIAkJCQkJCXJlZ19kYXRhID0gKEFUT01fTUVNT1JZX1NFVFRJTkdfREFUQV9CTE9DSyAqKQogCQkJCQkJCSgodTggKilyZWdfZGF0YSArIGxlMTZfdG9fY3B1KHJlZ19ibG9jay0+dXNSZWdEYXRhQmxrU2l6ZSkpOwogCQkJCQl9Ci0JCQkJCWlmICgqKHUzMiAqKXJlZ19kYXRhICE9IEVORF9PRl9SRUdfREFUQV9CTE9DSykKKwkJCQkJaWYgKGxlMzJfdG9fY3B1KCoodTMyICopcmVnX2RhdGEpICE9IEVORF9PRl9SRUdfREFUQV9CTE9DSykKIAkJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCQlyZWdfdGFibGUtPm51bV9lbnRyaWVzID0gbnVtX3JhbmdlczsKIAkJCQl9IGVsc2UKQEAgLTM5NDQsNiArMzkzOCwxMCBAQAogCS8qIHRlbGwgdGhlIGJpb3Mgbm90IHRvIGhhbmRsZSBtb2RlIHN3aXRjaGluZyAqLwogCWJpb3NfNl9zY3JhdGNoIHw9IEFUT01fUzZfQUNDX0JMT0NLX0RJU1BMQVlfU1dJVENIOwogCisJLyogY2xlYXIgdGhlIHZiaW9zIGRwbXMgc3RhdGUgKi8KKwlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQliaW9zXzJfc2NyYXRjaCAmPSB+QVRPTV9TMl9ERVZJQ0VfRFBNU19TVEFURTsKKwogCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKSB7CiAJCVdSRUczMihSNjAwX0JJT1NfMl9TQ1JBVENILCBiaW9zXzJfc2NyYXRjaCk7CiAJCVdSRUczMihSNjAwX0JJT1NfNl9TQ1JBVENILCBiaW9zXzZfc2NyYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKaW5kZXggNjhjZTM2MC4uNjY1MTE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwpAQCAtMzcsMjIgKzM3LDYgQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCi0vKiBmcm9tIHJhZGVvbl9lbmNvZGVyLmMgKi8KLWV4dGVybiB1aW50MzJfdAotcmFkZW9uX2dldF9lbmNvZGVyX2VudW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSwKLQkJCXVpbnQ4X3QgZGFjKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9saW5rX2VuY29kZXJfY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCi0vKiBmcm9tIHJhZGVvbl9jb25uZWN0b3IuYyAqLwotZXh0ZXJuIHZvaWQKLXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCwKLQkJCSAgICB1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAotCQkJICAgIGludCBjb25uZWN0b3JfdHlwZSwKLQkJCSAgICBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICppMmNfYnVzLAotCQkJICAgIHVpbnQxNl90IGNvbm5lY3Rvcl9vYmplY3RfaWQsCi0JCQkgICAgc3RydWN0IHJhZGVvbl9ocGQgKmhwZCk7Ci0KIC8qIGZyb20gcmFkZW9uX2xlZ2FjeV9lbmNvZGVyLmMgKi8KIGV4dGVybiB2b2lkCiByYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGVuY29kZXJfZW51bSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCAyMGE3NjhhLi44MmQ0Zjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC0zMywxNSArMzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCi1leHRlcm4gdm9pZAotcmFkZW9uX2NvbWJpb3NfY29ubmVjdGVkX3NjcmF0Y2hfcmVncyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCSAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkgICAgICBib29sIGNvbm5lY3RlZCk7Ci1leHRlcm4gdm9pZAotcmFkZW9uX2F0b21iaW9zX2Nvbm5lY3RlZF9zY3JhdGNoX3JlZ3Moc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkgICAgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQkJCSAgICAgICBib29sIGNvbm5lY3RlZCk7Ci0KIHZvaWQgcmFkZW9uX2Nvbm5lY3Rvcl9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKaW5kZXggM2NhZTJiYi4uYmIwZDVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCkBAIC0yMDIwLDEwICsyMDIwLDEwIEBACiAKIAkJYnVmLT5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CiAKLQkJaWYgKERSTV9DT1BZX1RPX1VTRVIoJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwgJmJ1Zi0+aWR4LAorCQlpZiAoY29weV90b191c2VyKCZkLT5yZXF1ZXN0X2luZGljZXNbaV0sICZidWYtPmlkeCwKIAkJCQkgICAgIHNpemVvZihidWYtPmlkeCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChEUk1fQ09QWV9UT19VU0VSKCZkLT5yZXF1ZXN0X3NpemVzW2ldLCAmYnVmLT50b3RhbCwKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9zaXplc1tpXSwgJmJ1Zi0+dG90YWwsCiAJCQkJICAgICBzaXplb2YoYnVmLT50b3RhbCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTIyMjgsNyArMjIyOCw3IEBACiAKIAlkZXZfcHJpdi0+cmluZy50YWlsICY9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsKIAotCURSTV9NRU1PUllCQVJSSUVSKCk7CisJbWIoKTsKIAlHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOwogCiAJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID49IENISVBfUjYwMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggMGIzNjYxNi4uZGZiNWExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJCQlwLT5yaW5nID0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYOwogCQkJZWxzZQogCQkJCXAtPnJpbmcgPSBDQVlNQU5fUklOR19UWVBFX0RNQTFfSU5ERVg7Ci0JCX0gZWxzZSBpZiAocC0+cmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkgeworCQl9IGVsc2UgaWYgKHAtPnJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKSB7CiAJCQlwLT5yaW5nID0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWNodW5rX2FycmF5X3B0ciA9ICh1aW50NjRfdCAqKSh1bnNpZ25lZCBsb25nKShjcy0+Y2h1bmtzKTsKLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHAtPmNodW5rc19hcnJheSwgY2h1bmtfYXJyYXlfcHRyLAorCWlmIChjb3B5X2Zyb21fdXNlcihwLT5jaHVua3NfYXJyYXksIGNodW5rX2FycmF5X3B0ciwKIAkJCSAgICAgICBzaXplb2YodWludDY0X3QpKmNzLT5udW1fY2h1bmtzKSkgewogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJdWludDMyX3QgX191c2VyICpjZGF0YTsKIAogCQljaHVua19wdHIgPSAodm9pZCBfX3VzZXIqKSh1bnNpZ25lZCBsb25nKXAtPmNodW5rc19hcnJheVtpXTsKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmdXNlcl9jaHVuaywgY2h1bmtfcHRyLAorCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfY2h1bmssIGNodW5rX3B0ciwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fcmFkZW9uX2NzX2NodW5rKSkpIHsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CkBAIC0yNTIsNyArMjUyLDcgQEAKIAkJaWYgKHAtPmNodW5rc1tpXS5rZGF0YSA9PSBOVUxMKSB7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHAtPmNodW5rc1tpXS5rZGF0YSwgY2RhdGEsIHNpemUpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihwLT5jaHVua3NbaV0ua2RhdGEsIGNkYXRhLCBzaXplKSkgewogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJaWYgKHAtPmNodW5rc1tpXS5jaHVua19pZCA9PSBSQURFT05fQ0hVTktfSURfRkxBR1MpIHsKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQkJfQogCQkJcGFyc2VyLT5jb25zdF9pYi5pc19jb25zdF9pYiA9IHRydWU7CiAJCQlwYXJzZXItPmNvbnN0X2liLmxlbmd0aF9kdyA9IGliX2NodW5rLT5sZW5ndGhfZHc7Ci0JCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHBhcnNlci0+Y29uc3RfaWIucHRyLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcnNlci0+Y29uc3RfaWIucHRyLAogCQkJCQkgICAgICAgaWJfY2h1bmstPnVzZXJfcHRyLAogCQkJCQkgICAgICAgaWJfY2h1bmstPmxlbmd0aF9kdyAqIDQpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJcGFyc2VyLT5pYi5sZW5ndGhfZHcgPSBpYl9jaHVuay0+bGVuZ3RoX2R3OwogCWlmIChpYl9jaHVuay0+a2RhdGEpCiAJCW1lbWNweShwYXJzZXItPmliLnB0ciwgaWJfY2h1bmstPmtkYXRhLCBpYl9jaHVuay0+bGVuZ3RoX2R3ICogNCk7Ci0JZWxzZSBpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHBhcnNlci0+aWIucHRyLCBpYl9jaHVuay0+dXNlcl9wdHIsIGliX2NodW5rLT5sZW5ndGhfZHcgKiA0KSkKKwllbHNlIGlmIChjb3B5X2Zyb21fdXNlcihwYXJzZXItPmliLnB0ciwgaWJfY2h1bmstPnVzZXJfcHRyLCBpYl9jaHVuay0+bGVuZ3RoX2R3ICogNCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwppbmRleCAzOWIwMzNiLi5iMDEyY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwpAQCAtMTQ0LDYgKzE0NCwxMSBAQAogCX0KIH0KIAordm9pZCByYWRlb25fcGNpX2NvbmZpZ19yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHJkZXYtPnBkZXYsIDB4N2MsIFJBREVPTl9BU0lDX1JFU0VUX0RBVEEpOworfQorCiAvKioKICAqIHJhZGVvbl9zdXJmYWNlX2luaXQgLSBDbGVhciBHUFUgc3VyZmFjZSByZWdpc3RlcnMuCiAgKgpAQCAtMjQ5LDcgKzI1NCw3IEBACiAgKiBJbml0IGRvb3JiZWxsIGRyaXZlciBpbmZvcm1hdGlvbiAoQ0lLKQogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUuCiAgKi8KLWludCByYWRlb25fZG9vcmJlbGxfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2Rvb3JiZWxsX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJLyogZG9vcmJlbGwgYmFyIG1hcHBpbmcgKi8KIAlyZGV2LT5kb29yYmVsbC5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHJkZXYtPnBkZXYsIDIpOwpAQCAtMjc4LDcgKzI4Myw3IEBACiAgKgogICogVGVhciBkb3duIGRvb3JiZWxsIGRyaXZlciBpbmZvcm1hdGlvbiAoQ0lLKQogICovCi12b2lkIHJhZGVvbl9kb29yYmVsbF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorc3RhdGljIHZvaWQgcmFkZW9uX2Rvb3JiZWxsX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW91bm1hcChyZGV2LT5kb29yYmVsbC5wdHIpOwogCXJkZXYtPmRvb3JiZWxsLnB0ciA9IE5VTEw7CkBAIC0xMzMwLDYgKzEzMzUsNyBAQAogCQlpZiAocikKIAkJCXJldHVybiByOwogCX0KKwogCWlmICgocmFkZW9uX3Rlc3RpbmcgJiAxKSkgewogCQlpZiAocmRldi0+YWNjZWxfd29ya2luZykKIAkJCXJhZGVvbl90ZXN0X21vdmVzKHJkZXYpOwpAQCAtMTQ1NSw3ICsxNDYxLDYgQEAKIAogCXJhZGVvbl9zYXZlX2Jpb3Nfc2NyYXRjaF9yZWdzKHJkZXYpOwogCi0JcmFkZW9uX3BtX3N1c3BlbmQocmRldik7CiAJcmFkZW9uX3N1c3BlbmQocmRldik7CiAJcmFkZW9uX2hwZF9maW5pKHJkZXYpOwogCS8qIGV2aWN0IHJlbWFpbmluZyB2cmFtIG1lbW9yeSAqLwpAQCAtMTUxNiwxNCArMTUyMSwyMiBAQAogCWlmIChyKQogCQlEUk1fRVJST1IoImliIHJpbmcgdGVzdCBmYWlsZWQgKCVkKS5cbiIsIHIpOwogCi0JcmFkZW9uX3BtX3Jlc3VtZShyZGV2KTsKKwlpZiAocmRldi0+cG0uZHBtX2VuYWJsZWQpIHsKKwkJLyogZG8gZHBtIGxhdGUgaW5pdCAqLworCQlyID0gcmFkZW9uX3BtX2xhdGVfaW5pdChyZGV2KTsKKwkJaWYgKHIpIHsKKwkJCXJkZXYtPnBtLmRwbV9lbmFibGVkID0gZmFsc2U7CisJCQlEUk1fRVJST1IoInJhZGVvbl9wbV9sYXRlX2luaXQgZmFpbGVkLCBkaXNhYmxpbmcgZHBtXG4iKTsKKwkJfQorCX0KKwogCXJhZGVvbl9yZXN0b3JlX2Jpb3Nfc2NyYXRjaF9yZWdzKHJkZXYpOwogCiAJaWYgKGZiY29uKSB7CiAJCXJhZGVvbl9mYmRldl9zZXRfc3VzcGVuZChyZGV2LCAwKTsKIAkJY29uc29sZV91bmxvY2soKTsKIAl9Ci0gICAgICAgCisKIAkvKiBpbml0IGRpZyBQSFlzLCBkaXNwIGVuZyBwbGwgKi8KIAlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7CiAJCXJhZGVvbl9hdG9tX2VuY29kZXJfaW5pdChyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwppbmRleCA3YjI1MzgxLi5kNjgwNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkgKiB0byBjb21wbGV0ZSBpbiB0aGlzIHZibGFuaz8KIAkgKi8KIAlpZiAodXBkYXRlX3BlbmRpbmcgJiYKLQkgICAgKERSTV9TQ0FOT1VUUE9TX1ZBTElEICYgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0Y19pZCwKKwkgICAgKERSTV9TQ0FOT1VUUE9TX1ZBTElEICYgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0Y19pZCwgMCwKIAkJCQkJCQkgICAgICAgJnZwb3MsICZocG9zLCBOVUxMLCBOVUxMKSkgJiYKIAkgICAgKCh2cG9zID49ICg5OSAqIHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXS0+YmFzZS5od21vZGUuY3J0Y192ZGlzcGxheSkvMTAwKSB8fAogCSAgICAgKHZwb3MgPCAwICYmICFBU0lDX0lTX0FWSVZPKHJkZXYpKSkpIHsKQEAgLTE0NjQsMTIgKzE0NjQsMjIgQEAKIAkvKiBzZXR1cCBhZm10ICovCiAJcmFkZW9uX2FmbXRfaW5pdChyZGV2KTsKIAotCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLwotCXJhZGVvbl9wbV9pbml0KHJkZXYpOwotCiAJcmFkZW9uX2ZiZGV2X2luaXQocmRldik7CiAJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KHJkZXYtPmRkZXYpOwogCisJaWYgKHJkZXYtPnBtLmRwbV9lbmFibGVkKSB7CisJCS8qIGRvIGRwbSBsYXRlIGluaXQgKi8KKwkJcmV0ID0gcmFkZW9uX3BtX2xhdGVfaW5pdChyZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcmRldi0+cG0uZHBtX2VuYWJsZWQgPSBmYWxzZTsKKwkJCURSTV9FUlJPUigicmFkZW9uX3BtX2xhdGVfaW5pdCBmYWlsZWQsIGRpc2FibGluZyBkcG1cbiIpOworCQl9CisJCS8qIHNldCB0aGUgZHBtIHN0YXRlIGZvciBQWCBzaW5jZSB0aGVyZSB3b24ndCBiZQorCQkgKiBhIG1vZGVzZXQgdG8gY2FsbCB0aGlzLgorCQkgKi8KKwkJcmFkZW9uX3BtX2NvbXB1dGVfY2xvY2tzKHJkZXYpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNDc3LDcgKzE0ODcsNiBAQAogewogCXJhZGVvbl9mYmRldl9maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPm1vZGVfaW5mby5iaW9zX2hhcmRjb2RlZF9lZGlkKTsKLQlyYWRlb25fcG1fZmluaShyZGV2KTsKIAogCWlmIChyZGV2LT5tb2RlX2luZm8ubW9kZV9jb25maWdfaW5pdGlhbGl6ZWQpIHsKIAkJcmFkZW9uX2FmbXRfZmluaShyZGV2KTsKQEAgLTE2MDEsNiArMTYxMCw3IEBACiAgKgogICogXHBhcmFtIGRldiBEZXZpY2UgdG8gcXVlcnkuCiAgKiBccGFyYW0gY3J0YyBDcnRjIHRvIHF1ZXJ5LgorICogXHBhcmFtIGZsYWdzIEZsYWdzIGZyb20gY2FsbGVyIChEUk1fQ0FMTEVEX0ZST01fVkJMSVJRIG9yIDApLgogICogXHBhcmFtICp2cG9zIExvY2F0aW9uIHdoZXJlIHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24gc2hvdWxkIGJlIHN0b3JlZC4KICAqIFxwYXJhbSAqaHBvcyBMb2NhdGlvbiB3aGVyZSBob3Jpem9udGFsIHNjYW5vdXQgcG9zaXRpb24gc2hvdWxkIGdvLgogICogXHBhcmFtICpzdGltZSBUYXJnZXQgbG9jYXRpb24gZm9yIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUKQEAgLTE2MjIsOCArMTYzMiw4IEBACiAgKiB1bmtub3duIHNtYWxsIG51bWJlciBvZiBzY2FubGluZXMgd3J0LiByZWFsIHNjYW5vdXQgcG9zaXRpb24uCiAgKgogICovCi1pbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsIGludCAqdnBvcywgaW50ICpocG9zLAotCQkJICAgICAgIGt0aW1lX3QgKnN0aW1lLCBrdGltZV90ICpldGltZSkKK2ludCByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJICAgICAgIGludCAqdnBvcywgaW50ICpocG9zLCBrdGltZV90ICpzdGltZSwga3RpbWVfdCAqZXRpbWUpCiB7CiAJdTMyIHN0YXRfY3J0YyA9IDAsIHZibCA9IDAsIHBvc2l0aW9uID0gMDsKIAlpbnQgdmJsX3N0YXJ0LCB2YmxfZW5kLCB2dG90YWwsIHJldCA9IDA7CkBAIC0xNzY1LDUgKzE3NzUsMjcgQEAKIAlpZiAoaW5fdmJsKQogCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfSU5WQkw7CiAKKwkvKiBJcyB2cG9zIG91dHNpZGUgbm9taW5hbCB2YmxhbmsgYXJlYSwgYnV0IGxlc3MgdGhhbgorCSAqIDEvMTAwIG9mIGEgZnJhbWUgaGVpZ2h0IGF3YXkgZnJvbSBzdGFydCBvZiB2Ymxhbms/CisJICogSWYgc28sIGFzc3VtZSB0aGlzIGlzbid0IGEgbWFzc2l2ZWx5IGRlbGF5ZWQgdmJsYW5rCisJICogaW50ZXJydXB0LCBidXQgYSB2YmxhbmsgaW50ZXJydXB0IHRoYXQgZmlyZWQgYSBmZXcKKwkgKiBtaWNyb3NlY29uZHMgYmVmb3JlIHRydWUgc3RhcnQgb2YgdmJsYW5rLiBDb21wZW5zYXRlCisJICogYnkgYWRkaW5nIGEgZnVsbCBmcmFtZSBkdXJhdGlvbiB0byB0aGUgZmluYWwgdGltZXN0YW1wLgorCSAqIEhhcHBlbnMsIGUuZy4sIG9uIEFUSSBSNTAwLCBSNjAwLgorCSAqCisJICogV2Ugb25seSBkbyB0aGlzIGlmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEuCisJICovCisJaWYgKChmbGFncyAmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEpICYmICFpbl92YmwpIHsKKwkJdmJsX3N0YXJ0ID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdLT5iYXNlLmh3bW9kZS5jcnRjX3ZkaXNwbGF5OworCQl2dG90YWwgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y10tPmJhc2UuaHdtb2RlLmNydGNfdnRvdGFsOworCisJCWlmICh2Ymxfc3RhcnQgLSAqdnBvcyA8IHZ0b3RhbCAvIDEwMCkgeworCQkJKnZwb3MgLT0gdnRvdGFsOworCisJCQkvKiBTaWduYWwgdGhpcyBjb3JyZWN0aW9uIGFzICJhcHBsaWVkIi4gKi8KKwkJCXJldCB8PSAweDg7CisJCX0KKwl9CisKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwppbmRleCBkYjM5ZWEzLi44NGExYmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTc4LDkgKzc4LDEwIEBACiAgKiAgIDIuMzQuMCAtIEFkZCBDSUsgdGlsaW5nIG1vZGUgYXJyYXkgcXVlcnkKICAqICAgMi4zNS4wIC0gQWRkIENJSyBtYWNyb3RpbGUgbW9kZSBhcnJheSBxdWVyeQogICogICAyLjM2LjAgLSBGaXggQ0lLIERDRSB0aWxpbmcgc2V0dXAKKyAqICAgMi4zNy4wIC0gYWxsb3cgR1MgcmluZyBzZXR1cCBvbiByNnh4L3I3eHgKICAqLwogI2RlZmluZSBLTVNfRFJJVkVSX01BSk9SCTIKLSNkZWZpbmUgS01TX0RSSVZFUl9NSU5PUgkzNgorI2RlZmluZSBLTVNfRFJJVkVSX01JTk9SCTM3CiAjZGVmaW5lIEtNU19EUklWRVJfUEFUQ0hMRVZFTAkwCiBpbnQgcmFkZW9uX2RyaXZlcl9sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGludCByYWRlb25fZHJpdmVyX3VubG9hZF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMDIsMTMgKzEwMywxNCBAQAogdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pcnFyZXR1cm5fdCByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyX2ttcyhEUk1fSVJRX0FSR1MpOworaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcl9rbXMoaW50IGlycSwgdm9pZCAqYXJnKTsKIHZvaWQgcmFkZW9uX2dlbV9vYmplY3RfZnJlZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiBpbnQgcmFkZW9uX2dlbV9vYmplY3Rfb3BlbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiB2b2lkIHJhZGVvbl9nZW1fb2JqZWN0X2Nsb3NlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAogCQkJCSAgICAgIGludCAqdnBvcywgaW50ICpocG9zLCBrdGltZV90ICpzdGltZSwKIAkJCQkgICAgICBrdGltZV90ICpldGltZSk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGRybV9pb2N0bF9kZXNjIHJhZGVvbl9pb2N0bHNfa21zW107CkBAIC0xNjgsNiArMTcwLDcgQEAKIGludCByYWRlb25fZHBtID0gLTE7CiBpbnQgcmFkZW9uX2FzcG0gPSAtMTsKIGludCByYWRlb25fcnVudGltZV9wbSA9IC0xOworaW50IHJhZGVvbl9oYXJkX3Jlc2V0ID0gMDsKIAogTU9EVUxFX1BBUk1fREVTQyhub193YiwgIkRpc2FibGUgQUdQIHdyaXRlYmFjayBmb3Igc2NyYXRjaCByZWdpc3RlcnMiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChub193YiwgcmFkZW9uX25vX3diLCBpbnQsIDA0NDQpOwpAQCAtMjMyLDYgKzIzNSw5IEBACiBNT0RVTEVfUEFSTV9ERVNDKHJ1bnBtLCAiUFggcnVudGltZSBwbSAoMSA9IGZvcmNlIGVuYWJsZSwgMCA9IGRpc2FibGUsIC0xID0gUFggb25seSBkZWZhdWx0KSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHJ1bnBtLCByYWRlb25fcnVudGltZV9wbSwgaW50LCAwNDQ0KTsKIAorTU9EVUxFX1BBUk1fREVTQyhoYXJkX3Jlc2V0LCAiUENJIGNvbmZpZyByZXNldCAoMSA9IGZvcmNlIGVuYWJsZSwgMCA9IGRpc2FibGUgKGRlZmF1bHQpKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKGhhcmRfcmVzZXQsIHJhZGVvbl9oYXJkX3Jlc2V0LCBpbnQsIDA0NDQpOworCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJcmFkZW9uX1BDSV9JRFMKIH07CkBAIC00MDAsNiArNDA2LDkgQEAKIAlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gLTEgJiYgIXJhZGVvbl9pc19weCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWRybV9kZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfQ0hBTkdJTkc7CiAJZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRybV9kZXYpOwogCXZnYV9zd2l0Y2hlcm9vX3NldF9keW5hbWljX3N3aXRjaChwZGV2LCBWR0FfU1dJVENIRVJPT19PRkYpOwpAQCAtNDIyLDYgKzQzMSw5IEBACiAJaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IC0xICYmICFyYWRlb25faXNfcHgoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlkcm1fZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuaAppbmRleCAwMGUwZDQ0Li5kYWZkODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuaApAQCAtNDA1LDcgKzQwNSw3IEBACiBleHRlcm4gdTMyIHJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIGludCByYWRlb25fZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCByYWRlb25fZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiBpcnFyZXR1cm5fdCByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZyk7CiBleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKaW5kZXggZDNhODZlNC4uYzM3Y2I3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkoKmZlbmNlKS0+c2VxID0gKytyZGV2LT5mZW5jZV9kcnZbcmluZ10uc3luY19zZXFbcmluZ107CiAJKCpmZW5jZSktPnJpbmcgPSByaW5nOwogCXJhZGVvbl9mZW5jZV9yaW5nX2VtaXQocmRldiwgcmluZywgKmZlbmNlKTsKLQl0cmFjZV9yYWRlb25fZmVuY2VfZW1pdChyZGV2LT5kZGV2LCAoKmZlbmNlKS0+c2VxKTsKKwl0cmFjZV9yYWRlb25fZmVuY2VfZW1pdChyZGV2LT5kZGV2LCByaW5nLCAoKmZlbmNlKS0+c2VxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzEzLDcgKzMxMyw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCWxhc3Rfc2VxW2ldID0gYXRvbWljNjRfcmVhZCgmcmRldi0+ZmVuY2VfZHJ2W2ldLmxhc3Rfc2VxKTsKLQkJCXRyYWNlX3JhZGVvbl9mZW5jZV93YWl0X2JlZ2luKHJkZXYtPmRkZXYsIHRhcmdldF9zZXFbaV0pOworCQkJdHJhY2VfcmFkZW9uX2ZlbmNlX3dhaXRfYmVnaW4ocmRldi0+ZGRldiwgaSwgdGFyZ2V0X3NlcVtpXSk7CiAJCQlyYWRlb25faXJxX2ttc19zd19pcnFfZ2V0KHJkZXYsIGkpOwogCQl9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlyYWRlb25faXJxX2ttc19zd19pcnFfcHV0KHJkZXYsIGkpOwotCQkJdHJhY2VfcmFkZW9uX2ZlbmNlX3dhaXRfZW5kKHJkZXYtPmRkZXYsIHRhcmdldF9zZXFbaV0pOworCQkJdHJhY2VfcmFkZW9uX2ZlbmNlX3dhaXRfZW5kKHJkZXYtPmRkZXYsIGksIHRhcmdldF9zZXFbaV0pOwogCQl9CiAKIAkJaWYgKHVubGlrZWx5KHIgPCAwKSkKQEAgLTg0MSw2ICs4NDEsOCBAQAogCQlpZiAoIXJkZXYtPmZlbmNlX2RydltpXS5pbml0aWFsaXplZCkKIAkJCWNvbnRpbnVlOwogCisJCXJhZGVvbl9mZW5jZV9wcm9jZXNzKHJkZXYsIGkpOworCiAJCXNlcV9wcmludGYobSwgIi0tLSByaW5nICVkIC0tLVxuIiwgaSk7CiAJCXNlcV9wcmludGYobSwgIkxhc3Qgc2lnbmFsZWQgZmVuY2UgMHglMDE2bGx4XG4iLAogCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdG9taWM2NF9yZWFkKCZyZGV2LT5mZW5jZV9kcnZbaV0ubGFzdF9zZXEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2dhcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2dhcnQuYwppbmRleCA5NmU0NDAwLi5hOGY5YjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nYXJ0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jCkBAIC03MTMsNyArNzEzLDcgQEAKIAl1bnNpZ25lZCBpOwogCiAJLyogY2hlY2sgaWYgdGhlIGlkIGlzIHN0aWxsIHZhbGlkICovCi0JaWYgKHZtLT5mZW5jZSAmJiB2bS0+ZmVuY2UgPT0gcmRldi0+dm1fbWFuYWdlci5hY3RpdmVbdm0tPmlkXSkKKwlpZiAodm0tPmxhc3RfaWRfdXNlICYmIHZtLT5sYXN0X2lkX3VzZSA9PSByZGV2LT52bV9tYW5hZ2VyLmFjdGl2ZVt2bS0+aWRdKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIHdlIGRlZmluYXRlbHkgbmVlZCB0byBmbHVzaCAqLwpAQCAtNzI2LDYgKzcyNiw3IEBACiAJCWlmIChmZW5jZSA9PSBOVUxMKSB7CiAJCQkvKiBmb3VuZCBhIGZyZWUgb25lICovCiAJCQl2bS0+aWQgPSBpOworCQkJdHJhY2VfcmFkZW9uX3ZtX2dyYWJfaWQodm0tPmlkLCByaW5nKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTc2OSw2ICs3NzAsOSBAQAogCiAJcmFkZW9uX2ZlbmNlX3VucmVmKCZ2bS0+ZmVuY2UpOwogCXZtLT5mZW5jZSA9IHJhZGVvbl9mZW5jZV9yZWYoZmVuY2UpOworCisJcmFkZW9uX2ZlbmNlX3VucmVmKCZ2bS0+bGFzdF9pZF91c2UpOworCXZtLT5sYXN0X2lkX3VzZSA9IHJhZGVvbl9mZW5jZV9yZWYoZmVuY2UpOwogfQogCiAvKioKQEAgLTEzMDMsNiArMTMwNyw4IEBACiB7CiAJdm0tPmlkID0gMDsKIAl2bS0+ZmVuY2UgPSBOVUxMOworCXZtLT5sYXN0X2ZsdXNoID0gTlVMTDsKKwl2bS0+bGFzdF9pZF91c2UgPSBOVUxMOwogCW11dGV4X2luaXQoJnZtLT5tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJnZtLT5saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdm0tPnZhKTsKQEAgLTEzNDEsNSArMTM0Nyw2IEBACiAJfQogCXJhZGVvbl9mZW5jZV91bnJlZigmdm0tPmZlbmNlKTsKIAlyYWRlb25fZmVuY2VfdW5yZWYoJnZtLT5sYXN0X2ZsdXNoKTsKKwlyYWRlb25fZmVuY2VfdW5yZWYoJnZtLT5sYXN0X2lkX3VzZSk7CiAJbXV0ZXhfdW5sb2NrKCZ2bS0+bXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYwppbmRleCA4MDVjNWU1Li5iOTZjODE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYwpAQCAtODYsNyArODYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcmFkZW9uX2dlbV9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iaiwKK3N0YXRpYyBpbnQgcmFkZW9uX2dlbV9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iaiwKIAkJCSAgdWludDMyX3QgcmRvbWFpbiwgdWludDMyX3Qgd2RvbWFpbikKIHsKIAlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYwppbmRleCBmYzYwYjc0Li5lMjRjYTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYwpAQCAtMTAyMCw2ICsxMDIwLDkgQEAKIC8qIEFkZCB0aGUgZGVmYXVsdCBidXNlcyAqLwogdm9pZCByYWRlb25faTJjX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJaWYgKHJhZGVvbl9od19pMmMpCisJCURSTV9JTkZPKCJod19pMmMgZm9yY2VkIG9uLCB5b3UgbWF5IGV4cGVyaWVuY2UgZGlzcGxheSBkZXRlY3Rpb24gcHJvYmxlbXMhXG4iKTsKKwogCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpCiAJCXJhZGVvbl9hdG9tYmlvc19pMmNfaW5pdChyZGV2KTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycS5jCmluZGV4IDhkNjhlOTcuLjI0NGIxOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycS5jCkBAIC0xODEsNyArMTgxLDcgQEAKICAqIHRpZWQgdG8gZG1hIGF0IGFsbCwgdGhpcyBpcyBqdXN0IGEgaGFuZ292ZXIgZnJvbSBkcmkgcHJlaGlzdG9yeS4KICAqLwogCi1pcnFyZXR1cm5fdCByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKK2lycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogCS8qIFNXIGludGVycnVwdCAqLwogCWlmIChzdGF0ICYgUkFERU9OX1NXX0lOVF9URVNUKQotCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+c3dpX3F1ZXVlKTsKKwkJd2FrZV91cCgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAKIAkvKiBWQkxBTksgaW50ZXJydXB0ICovCiAJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID49IENISVBfUlM2MDApIHsKQEAgLTI0OSw3ICsyNDksNyBAQAogCiAJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOwogCi0JRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+c3dpX3F1ZXVlLCAzICogRFJNX0haLAorCURSTV9XQUlUX09OKHJldCwgZGV2X3ByaXYtPnN3aV9xdWV1ZSwgMyAqIEhaLAogCQkgICAgUkFERU9OX1JFQUQoUkFERU9OX0xBU1RfU1dJX1JFRykgPj0gc3dpX25yKTsKIAogCXJldHVybiByZXQ7CkBAIC0zMDIsNyArMzAyLDcgQEAKIAogCXJlc3VsdCA9IHJhZGVvbl9lbWl0X2lycShkZXYpOwogCi0JaWYgKERSTV9DT1BZX1RPX1VTRVIoZW1pdC0+aXJxX3NlcSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKSB7CisJaWYgKGNvcHlfdG9fdXNlcihlbWl0LT5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpIHsKIAkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0zNTQsNyArMzU0LDcgQEAKIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlhdG9taWNfc2V0KCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQsIDApOwotCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAKIAlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweDAwMWZmZmZmOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKaW5kZXggZWM2MjQwYi4uMDg5YzlmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYwpAQCAtMzksMTMgKzM5LDEzIEBACiAvKioKICAqIHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXJfa21zIC0gaXJxIGhhbmRsZXIgZm9yIEtNUwogICoKLSAqIEBEUk1fSVJRX0FSR1M6IGFyZ3MKKyAqIEBpbnQgaXJxLCB2b2lkICphcmc6IGFyZ3MKICAqCiAgKiBUaGlzIGlzIHRoZSBpcnEgaGFuZGxlciBmb3IgdGhlIHJhZGVvbiBLTVMgZHJpdmVyIChhbGwgYXNpY3MpLgogICogcmFkZW9uX2lycV9wcm9jZXNzIGlzIGEgbWFjcm8gdGhhdCBwb2ludHMgdG8gdGhlIHBlci1hc2ljCiAgKiBpcnEgaGFuZGxlciBjYWxsYmFjay4KICAqLwotaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcl9rbXMoRFJNX0lSUV9BUkdTKQoraXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcl9rbXMoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKaW5kZXggMjFkNTkzYy4uMTE0ZDE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogICogZXRjLiAoYWxsIGFzaWNzKS4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGZhaWx1cmUuCiAgKi8KLWludCByYWRlb25faW5mb19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHApCitzdGF0aWMgaW50IHJhZGVvbl9pbmZvX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9yYWRlb25faW5mbyAqaW5mbyA9IGRhdGE7CkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJCSp2YWx1ZSA9IHJkZXYtPmFjY2VsX3dvcmtpbmc7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX0lORk9fQ1JUQ19GUk9NX0lEOgotCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHZhbHVlLCB2YWx1ZV9wdHIsIHNpemVvZih1aW50MzJfdCkpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih2YWx1ZSwgdmFsdWVfcHRyLCBzaXplb2YodWludDMyX3QpKSkgewogCQkJRFJNX0VSUk9SKCJjb3B5X2Zyb21fdXNlciAlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CkBAIC0yNjksNyArMjY5LDcgQEAKIAkJICoKIAkJICogV2hlbiByZXR1cm5pbmcsIHRoZSB2YWx1ZSBpcyAxIGlmIGZpbHAgb3ducyBoeXBlci16IGFjY2VzcywKIAkJICogMCBvdGhlcndpc2UuICovCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIodmFsdWUsIHZhbHVlX3B0ciwgc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHZhbHVlLCB2YWx1ZV9wdHIsIHNpemVvZih1aW50MzJfdCkpKSB7CiAJCQlEUk1fRVJST1IoImNvcHlfZnJvbV91c2VyICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTI4MSw3ICsyODEsNyBAQAogCQlicmVhazsKIAljYXNlIFJBREVPTl9JTkZPX1dBTlRfQ01BU0s6CiAJCS8qIFRoZSBzYW1lIGxvZ2ljIGFzIEh5cGVyLVouICovCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIodmFsdWUsIHZhbHVlX3B0ciwgc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHZhbHVlLCB2YWx1ZV9wdHIsIHNpemVvZih1aW50MzJfdCkpKSB7CiAJCQlEUk1fRVJST1IoImNvcHlfZnJvbV91c2VyICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTQxNyw3ICs0MTcsNyBAQAogCQkqdmFsdWUgPSByZGV2LT5mYXN0ZmJfd29ya2luZzsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fSU5GT19SSU5HX1dPUktJTkc6Ci0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIodmFsdWUsIHZhbHVlX3B0ciwgc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHZhbHVlLCB2YWx1ZV9wdHIsIHNpemVvZih1aW50MzJfdCkpKSB7CiAJCQlEUk1fRVJST1IoImNvcHlfZnJvbV91c2VyICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTQ3MCwxMSArNDcwLDE4IEBACiAJCQlEUk1fREVCVUdfS01TKCJCQUNLRU5EX0VOQUJMRURfTUFTSyBpcyBzaSsgb25seSFcbiIpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX0lORk9fTUFYX1NDTEs6CisJCWlmICgocmRldi0+cG0ucG1fbWV0aG9kID09IFBNX01FVEhPRF9EUE0pICYmCisJCSAgICByZGV2LT5wbS5kcG1fZW5hYmxlZCkKKwkJCSp2YWx1ZSA9IHJkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMuc2NsayAqIDEwOworCQllbHNlCisJCQkqdmFsdWUgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGsgKiAxMDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0tNUygiSW52YWxpZCByZXF1ZXN0ICVkXG4iLCBpbmZvLT5yZXF1ZXN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChEUk1fQ09QWV9UT19VU0VSKHZhbHVlX3B0ciwgKGNoYXIqKXZhbHVlLCB2YWx1ZV9zaXplKSkgeworCWlmIChjb3B5X3RvX3VzZXIodmFsdWVfcHRyLCAoY2hhciopdmFsdWUsIHZhbHVlX3NpemUpKSB7CiAJCURSTV9FUlJPUigiY29weV90b191c2VyICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC03MTIsMTEgKzcxOSwxMiBAQAogCS8qIEhlbHBlciByb3V0aW5lIGluIERSTSBjb3JlIGRvZXMgYWxsIHRoZSB3b3JrOiAqLwogCXJldHVybiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKGRldiwgY3J0YywgbWF4X2Vycm9yLAogCQkJCQkJICAgICB2YmxhbmtfdGltZSwgZmxhZ3MsCi0JCQkJCQkgICAgIGRybWNydGMpOworCQkJCQkJICAgICBkcm1jcnRjLCAmZHJtY3J0Yy0+aHdtb2RlKTsKIH0KIAogI2RlZmluZSBLTVNfSU5WQUxJRF9JT0NUTChuYW1lKQkJCQkJCVwKLWludCBuYW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KVwKK3N0YXRpYyBpbnQgbmFtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUJXAorCQkqZmlsZV9wcml2KQkJCQkJCVwKIHsJCQkJCQkJCQlcCiAJRFJNX0VSUk9SKCJpbnZhbGlkIGlvY3RsIHdpdGgga21zICVzXG4iLCBfX2Z1bmNfXyk7CQlcCiAJcmV0dXJuIC1FSU5WQUw7CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbWVtLmMKaW5kZXggZDU0ZDJkNy4uMTQ2ZDI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbWVtLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCWlmICghYmxvY2spCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKERSTV9DT1BZX1RPX1VTRVIoYWxsb2MtPnJlZ2lvbl9vZmZzZXQsICZibG9jay0+c3RhcnQsCisJaWYgKGNvcHlfdG9fdXNlcihhbGxvYy0+cmVnaW9uX29mZnNldCwgJmJsb2NrLT5zdGFydCwKIAkJCSAgICAgc2l6ZW9mKGludCkpKSB7CiAJCURSTV9FUlJPUigiY29weV90b191c2VyXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKaW5kZXggM2YwZGQ2Ni4uNDAyZGJlMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKQEAgLTI5MSw2ICsyOTEsNyBAQAogCiBzdHJ1Y3QgcmFkZW9uX2F0b21fc3MgewogCXVpbnQxNl90IHBlcmNlbnRhZ2U7CisJdWludDE2X3QgcGVyY2VudGFnZV9kaXZpZGVyOwogCXVpbnQ4X3QgdHlwZTsKIAl1aW50MTZfdCBzdGVwOwogCXVpbnQ4X3QgZGVsYXk7CkBAIC02MjQsNiArNjI1LDMwIEBACiAJc3RydWN0IGF0b21fdm9sdGFnZV90YWJsZV9lbnRyeSBlbnRyaWVzW01BWF9WT0xUQUdFX0VOVFJJRVNdOwogfTsKIAorCitleHRlcm4gdm9pZAorcmFkZW9uX2FkZF9hdG9tX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICB1aW50MzJfdCBjb25uZWN0b3JfaWQsCisJCQkgIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCisJCQkgIGludCBjb25uZWN0b3JfdHlwZSwKKwkJCSAgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqaTJjX2J1cywKKwkJCSAgdWludDMyX3QgaWdwX2xhbmVfaW5mbywKKwkJCSAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCSAgc3RydWN0IHJhZGVvbl9ocGQgKmhwZCwKKwkJCSAgc3RydWN0IHJhZGVvbl9yb3V0ZXIgKnJvdXRlcik7CitleHRlcm4gdm9pZAorcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgdWludDMyX3QgY29ubmVjdG9yX2lkLAorCQkJICAgIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCisJCQkgICAgaW50IGNvbm5lY3Rvcl90eXBlLAorCQkJICAgIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKmkyY19idXMsCisJCQkgICAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCSAgICBzdHJ1Y3QgcmFkZW9uX2hwZCAqaHBkKTsKK2V4dGVybiB1aW50MzJfdAorcmFkZW9uX2dldF9lbmNvZGVyX2VudW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSwKKwkJCXVpbnQ4X3QgZGFjKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9saW5rX2VuY29kZXJfY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCiByYWRlb25fY29tYmlvc19nZXRfdHZfaW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCkBAIC02MzEsNiArNjU2LDE1IEBACiBleHRlcm4gdm9pZCByYWRlb25fYXRvbWJpb3NfZ2V0X2RlZmF1bHRfdm9sdGFnZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJCQkgdTE2ICp2ZGRjLCB1MTYgKnZkZGNpLCB1MTYgKm12ZGQpOwogCitleHRlcm4gdm9pZAorcmFkZW9uX2NvbWJpb3NfY29ubmVjdGVkX3NjcmF0Y2hfcmVncyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICBib29sIGNvbm5lY3RlZCk7CitleHRlcm4gdm9pZAorcmFkZW9uX2F0b21iaW9zX2Nvbm5lY3RlZF9zY3JhdGNoX3JlZ3Moc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgICBib29sIGNvbm5lY3RlZCk7CisKIGV4dGVybiBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCiByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIHN0cnVjdCBkcm1fY29ubmVjdG9yICoKQEAgLTY2Niw2ICs3MDAsNyBAQAogZXh0ZXJuIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gaW50IHJhZGVvbl9kcF9pMmNfYXV4X2NoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCiAJCQkJdTggd3JpdGVfYnl0ZSwgdTggKnJlYWRfYnl0ZSk7Cit2b2lkIHJhZGVvbl9hdG9tX2NvcHlfc3dhcCh1OCAqZHN0LCB1OCAqc3JjLCB1OCBudW1fYnl0ZXMsIGJvb2wgdG9fbGUpOwogCiBleHRlcm4gdm9pZCByYWRlb25faTJjX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX2kyY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTc2Niw2ICs4MDEsNyBAQAogCQkJCSAgIGludCB4LCBpbnQgeSk7CiAKIGV4dGVybiBpbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAogCQkJCSAgICAgIGludCAqdnBvcywgaW50ICpocG9zLCBrdGltZV90ICpzdGltZSwKIAkJCQkgICAgICBrdGltZV90ICpldGltZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKaW5kZXggYzBmYTRhYS4uMDg1OTVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICAqIGZ1bmN0aW9uIGFyZSBjYWxsaW5nIGl0LgogICovCiAKLXZvaWQgcmFkZW9uX2JvX2NsZWFyX3ZhKHN0cnVjdCByYWRlb25fYm8gKmJvKQorc3RhdGljIHZvaWQgcmFkZW9uX2JvX2NsZWFyX3ZhKHN0cnVjdCByYWRlb25fYm8gKmJvKQogewogCXN0cnVjdCByYWRlb25fYm9fdmEgKmJvX3ZhLCAqdG1wOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwppbmRleCA5ODQwOTdiLi44ZTgxNTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKQEAgLTkyNCw2ICs5MjQsMTAgQEAKIAogCWlmIChyZGV2LT5hc2ljLT5kcG0ucG93ZXJnYXRlX3V2ZCkgewogCQltdXRleF9sb2NrKCZyZGV2LT5wbS5tdXRleCk7CisJCS8qIGRvbid0IHBvd2VyZ2F0ZSBhbnl0aGluZyBpZiB3ZQorCQkgICBoYXZlIGFjdGl2ZSBidXQgcGF1c2Ugc3RyZWFtcyAqLworCQllbmFibGUgfD0gcmRldi0+cG0uZHBtLnNkID4gMDsKKwkJZW5hYmxlIHw9IHJkZXYtPnBtLmRwbS5oZCA+IDA7CiAJCS8qIGVuYWJsZS9kaXNhYmxlIFVWRCAqLwogCQlyYWRlb25fZHBtX3Bvd2VyZ2F0ZV91dmQocmRldiwgIWVuYWJsZSk7CiAJCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwpAQCAtMTAxMCw4ICsxMDE0LDEwIEBACiAJcmRldi0+cG0uY3VycmVudF9jbG9ja19tb2RlX2luZGV4ID0gMDsKIAlyZGV2LT5wbS5jdXJyZW50X3NjbGsgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGs7CiAJcmRldi0+cG0uY3VycmVudF9tY2xrID0gcmRldi0+cG0uZGVmYXVsdF9tY2xrOwotCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52b2x0YWdlOwotCXJkZXYtPnBtLmN1cnJlbnRfdmRkY2kgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY2k7CisJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlKSB7CisJCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52b2x0YWdlOworCQlyZGV2LT5wbS5jdXJyZW50X3ZkZGNpID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNpOworCX0KIAlpZiAocmRldi0+cG0ucG1fbWV0aG9kID09IFBNX01FVEhPRF9EWU5QTQogCSAgICAmJiByZGV2LT5wbS5keW5wbV9zdGF0ZSA9PSBEWU5QTV9TVEFURV9TVVNQRU5ERUQpIHsKIAkJcmRldi0+cG0uZHlucG1fc3RhdGUgPSBEWU5QTV9TVEFURV9BQ1RJVkU7CkBAIC0xMDMyLDI1ICsxMDM4LDI3IEBACiAJcmFkZW9uX2RwbV9zZXR1cF9hc2ljKHJkZXYpOwogCXJldCA9IHJhZGVvbl9kcG1fZW5hYmxlKHJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJyYWRlb246IGRwbSByZXN1bWUgZmFpbGVkXG4iKTsKLQkJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9CQVJUUykgJiYKLQkJICAgIChyZGV2LT5mYW1pbHkgPD0gQ0hJUF9DQVlNQU4pICYmCi0JCSAgICByZGV2LT5tY19mdykgewotCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkYykKLQkJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMsCi0JCQkJCQkJU0VUX1ZPTFRBR0VfVFlQRV9BU0lDX1ZEREMpOwotCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkY2kpCi0JCQkJcmFkZW9uX2F0b21fc2V0X3ZvbHRhZ2UocmRldiwgcmRldi0+cG0uZGVmYXVsdF92ZGRjaSwKLQkJCQkJCQlTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQ0kpOwotCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKLQkJCQlyYWRlb25fc2V0X2VuZ2luZV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOwotCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfbWNsaykKLQkJCQlyYWRlb25fc2V0X21lbW9yeV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X21jbGspOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmRldi0+cG0uZHBtX2VuYWJsZWQgPSB0cnVlOwotCQlyYWRlb25fcG1fY29tcHV0ZV9jbG9ja3MocmRldik7CisJaWYgKHJldCkKKwkJZ290byBkcG1fcmVzdW1lX2ZhaWw7CisJcmRldi0+cG0uZHBtX2VuYWJsZWQgPSB0cnVlOworCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKKwlyZXR1cm47CisKK2RwbV9yZXN1bWVfZmFpbDoKKwlEUk1fRVJST1IoInJhZGVvbjogZHBtIHJlc3VtZSBmYWlsZWRcbiIpOworCWlmICgocmRldi0+ZmFtaWx5ID49IENISVBfQkFSVFMpICYmCisJICAgIChyZGV2LT5mYW1pbHkgPD0gQ0hJUF9DQVlNQU4pICYmCisJICAgIHJkZXYtPm1jX2Z3KSB7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3ZkZGMpCisJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMsCisJCQkJCQlTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQyk7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3ZkZGNpKQorCQkJcmFkZW9uX2F0b21fc2V0X3ZvbHRhZ2UocmRldiwgcmRldi0+cG0uZGVmYXVsdF92ZGRjaSwKKwkJCQkJCVNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDSSk7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3NjbGspCisJCQlyYWRlb25fc2V0X2VuZ2luZV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOworCQlpZiAocmRldi0+cG0uZGVmYXVsdF9tY2xrKQorCQkJcmFkZW9uX3NldF9tZW1vcnlfY2xvY2socmRldiwgcmRldi0+cG0uZGVmYXVsdF9tY2xrKTsKIAl9CiB9CiAKQEAgLTExNzAsNTEgKzExNzgsNTAgQEAKIAlyYWRlb25fZHBtX3NldHVwX2FzaWMocmRldik7CiAJcmV0ID0gcmFkZW9uX2RwbV9lbmFibGUocmRldik7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5wbS5tdXRleCk7Ci0JaWYgKHJldCkgewotCQlyZGV2LT5wbS5kcG1fZW5hYmxlZCA9IGZhbHNlOwotCQlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX0JBUlRTKSAmJgotCQkgICAgKHJkZXYtPmZhbWlseSA8PSBDSElQX0NBWU1BTikgJiYKLQkJICAgIHJkZXYtPm1jX2Z3KSB7Ci0JCQlpZiAocmRldi0+cG0uZGVmYXVsdF92ZGRjKQotCQkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfdmRkYywKLQkJCQkJCQlTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQyk7Ci0JCQlpZiAocmRldi0+cG0uZGVmYXVsdF92ZGRjaSkKLQkJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGNpLAotCQkJCQkJCVNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDSSk7Ci0JCQlpZiAocmRldi0+cG0uZGVmYXVsdF9zY2xrKQotCQkJCXJhZGVvbl9zZXRfZW5naW5lX2Nsb2NrKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfc2Nsayk7Ci0JCQlpZiAocmRldi0+cG0uZGVmYXVsdF9tY2xrKQotCQkJCXJhZGVvbl9zZXRfbWVtb3J5X2Nsb2NrKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfbWNsayk7Ci0JCX0KLQkJRFJNX0VSUk9SKCJyYWRlb246IGRwbSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0KQorCQlnb3RvIGRwbV9mYWlsZWQ7CiAJcmRldi0+cG0uZHBtX2VuYWJsZWQgPSB0cnVlOwotCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKIAotCWlmIChyZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzID4gMSkgewotCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocmRldi0+ZGV2LCAmZGV2X2F0dHJfcG93ZXJfZHBtX3N0YXRlKTsKLQkJaWYgKHJldCkKLQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgZmlsZSBmb3IgZHBtIHN0YXRlXG4iKTsKLQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKHJkZXYtPmRldiwgJmRldl9hdHRyX3Bvd2VyX2RwbV9mb3JjZV9wZXJmb3JtYW5jZV9sZXZlbCk7Ci0JCWlmIChyZXQpCi0JCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGZpbGUgZm9yIGRwbSBzdGF0ZVxuIik7Ci0JCS8qIFhYWDogdGhlc2UgYXJlIG5vb3BzIGZvciBkcG0gYnV0IGFyZSBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0ICovCi0JCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9wcm9maWxlKTsKLQkJaWYgKHJldCkKLQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgZmlsZSBmb3IgcG93ZXIgcHJvZmlsZVxuIik7Ci0JCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9tZXRob2QpOwotCQlpZiAocmV0KQotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBmaWxlIGZvciBwb3dlciBtZXRob2RcbiIpOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9kcG1fc3RhdGUpOworCWlmIChyZXQpCisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgZmlsZSBmb3IgZHBtIHN0YXRlXG4iKTsKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocmRldi0+ZGV2LCAmZGV2X2F0dHJfcG93ZXJfZHBtX2ZvcmNlX3BlcmZvcm1hbmNlX2xldmVsKTsKKwlpZiAocmV0KQorCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGZpbGUgZm9yIGRwbSBzdGF0ZVxuIik7CisJLyogWFhYOiB0aGVzZSBhcmUgbm9vcHMgZm9yIGRwbSBidXQgYXJlIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXQgKi8KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocmRldi0+ZGV2LCAmZGV2X2F0dHJfcG93ZXJfcHJvZmlsZSk7CisJaWYgKHJldCkKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBmaWxlIGZvciBwb3dlciBwcm9maWxlXG4iKTsKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocmRldi0+ZGV2LCAmZGV2X2F0dHJfcG93ZXJfbWV0aG9kKTsKKwlpZiAocmV0KQorCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGZpbGUgZm9yIHBvd2VyIG1ldGhvZFxuIik7CiAKLQkJaWYgKHJhZGVvbl9kZWJ1Z2ZzX3BtX2luaXQocmRldikpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgZHBtIVxuIik7Ci0JCX0KLQotCQlEUk1fSU5GTygicmFkZW9uOiBkcG0gaW5pdGlhbGl6ZWRcbiIpOworCWlmIChyYWRlb25fZGVidWdmc19wbV9pbml0KHJkZXYpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgZHBtIVxuIik7CiAJfQogCisJRFJNX0lORk8oInJhZGVvbjogZHBtIGluaXRpYWxpemVkXG4iKTsKKwogCXJldHVybiAwOworCitkcG1fZmFpbGVkOgorCXJkZXYtPnBtLmRwbV9lbmFibGVkID0gZmFsc2U7CisJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9CQVJUUykgJiYKKwkgICAgKHJkZXYtPmZhbWlseSA8PSBDSElQX0NBWU1BTikgJiYKKwkgICAgcmRldi0+bWNfZncpIHsKKwkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkYykKKwkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfdmRkYywKKwkJCQkJCVNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDKTsKKwkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkY2kpCisJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGNpLAorCQkJCQkJU0VUX1ZPTFRBR0VfVFlQRV9BU0lDX1ZERENJKTsKKwkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKKwkJCXJhZGVvbl9zZXRfZW5naW5lX2Nsb2NrKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfc2Nsayk7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X21jbGspCisJCQlyYWRlb25fc2V0X21lbW9yeV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X21jbGspOworCX0KKwlEUk1fRVJST1IoInJhZGVvbjogZHBtIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IHJhZGVvbl9wbV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTIyOCwxMSArMTIzNSwxMCBAQAogCWNhc2UgQ0hJUF9SVjY3MDoKIAljYXNlIENISVBfUlM3ODA6CiAJY2FzZSBDSElQX1JTODgwOgorCWNhc2UgQ0hJUF9CQVJUUzoKKwljYXNlIENISVBfVFVSS1M6CisJY2FzZSBDSElQX0NBSUNPUzoKIAljYXNlIENISVBfQ0FZTUFOOgotCWNhc2UgQ0hJUF9CT05BSVJFOgotCWNhc2UgQ0hJUF9LQUJJTkk6Ci0JY2FzZSBDSElQX0tBVkVSSToKLQljYXNlIENISVBfSEFXQUlJOgogCQkvKiBEUE0gcmVxdWlyZXMgdGhlIFJMQywgUlY3NzArIGRHUFUgcmVxdWlyZXMgU01DICovCiAJCWlmICghcmRldi0+cmxjX2Z3KQogCQkJcmRldi0+cG0ucG1fbWV0aG9kID0gUE1fTUVUSE9EX1BST0ZJTEU7CkBAIC0xMjU3LDE1ICsxMjYzLDE2IEBACiAJY2FzZSBDSElQX1BBTE06CiAJY2FzZSBDSElQX1NVTU86CiAJY2FzZSBDSElQX1NVTU8yOgotCWNhc2UgQ0hJUF9CQVJUUzoKLQljYXNlIENISVBfVFVSS1M6Ci0JY2FzZSBDSElQX0NBSUNPUzoKIAljYXNlIENISVBfQVJVQkE6CiAJY2FzZSBDSElQX1RBSElUSToKIAljYXNlIENISVBfUElUQ0FJUk46CiAJY2FzZSBDSElQX1ZFUkRFOgogCWNhc2UgQ0hJUF9PTEFORDoKIAljYXNlIENISVBfSEFJTkFOOgorCWNhc2UgQ0hJUF9CT05BSVJFOgorCWNhc2UgQ0hJUF9LQUJJTkk6CisJY2FzZSBDSElQX0tBVkVSSToKKwljYXNlIENISVBfSEFXQUlJOgogCQkvKiBEUE0gcmVxdWlyZXMgdGhlIFJMQywgUlY3NzArIGRHUFUgcmVxdWlyZXMgU01DICovCiAJCWlmICghcmRldi0+cmxjX2Z3KQogCQkJcmRldi0+cG0ucG1fbWV0aG9kID0gUE1fTUVUSE9EX1BST0ZJTEU7CkBAIC0xMjkwLDYgKzEyOTcsMTggQEAKIAkJcmV0dXJuIHJhZGVvbl9wbV9pbml0X29sZChyZGV2KTsKIH0KIAoraW50IHJhZGVvbl9wbV9sYXRlX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocmRldi0+cG0ucG1fbWV0aG9kID09IFBNX01FVEhPRF9EUE0pIHsKKwkJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOworCQlyZXQgPSByYWRlb25fZHBtX2xhdGVfZW5hYmxlKHJkZXYpOworCQltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgcmFkZW9uX3BtX2Zpbmlfb2xkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWlmIChyZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzID4gMSkgewpAQCAtMTQyMCw2ICsxNDM5LDkgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YzsKIAorCWlmICghcmRldi0+cG0uZHBtX2VuYWJsZWQpCisJCXJldHVybjsKKwogCW11dGV4X2xvY2soJnJkZXYtPnBtLm11dGV4KTsKIAogCS8qIHVwZGF0ZSBhY3RpdmUgY3J0YyBjb3VudHMgKi8KQEAgLTE0NjQsNyArMTQ4Niw3IEBACiAJICovCiAJZm9yIChjcnRjID0gMDsgKGNydGMgPCByZGV2LT5udW1fY3J0YykgJiYgaW5fdmJsOyBjcnRjKyspIHsKIAkJaWYgKHJkZXYtPnBtLmFjdGl2ZV9jcnRjcyAmICgxIDw8IGNydGMpKSB7Ci0JCQl2Ymxfc3RhdHVzID0gcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0YywgJnZwb3MsICZocG9zLCBOVUxMLCBOVUxMKTsKKwkJCXZibF9zdGF0dXMgPSByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhyZGV2LT5kZGV2LCBjcnRjLCAwLCAmdnBvcywgJmhwb3MsIE5VTEwsIE5VTEwpOwogCQkJaWYgKCh2Ymxfc3RhdHVzICYgRFJNX1NDQU5PVVRQT1NfVkFMSUQpICYmCiAJCQkgICAgISh2Ymxfc3RhdHVzICYgRFJNX1NDQU5PVVRQT1NfSU5WQkwpKQogCQkJCWluX3ZibCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jCmluZGV4IDkyMTQ0MDMuLjFiNzgzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMKQEAgLTMzMiwzNiArMzMyLDYgQEAKIAl9CiB9CiAKLXUzMiByYWRlb25fcmluZ19nZW5lcmljX2dldF9ycHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJCSBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcpCi17Ci0JdTMyIHJwdHI7Ci0KLQlpZiAocmRldi0+d2IuZW5hYmxlZCkKLQkJcnB0ciA9IGxlMzJfdG9fY3B1KHJkZXYtPndiLndiW3JpbmctPnJwdHJfb2Zmcy80XSk7Ci0JZWxzZQotCQlycHRyID0gUlJFRzMyKHJpbmctPnJwdHJfcmVnKTsKLQotCXJldHVybiBycHRyOwotfQotCi11MzIgcmFkZW9uX3JpbmdfZ2VuZXJpY19nZXRfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQotewotCXUzMiB3cHRyOwotCi0Jd3B0ciA9IFJSRUczMihyaW5nLT53cHRyX3JlZyk7Ci0KLQlyZXR1cm4gd3B0cjsKLX0KLQotdm9pZCByYWRlb25fcmluZ19nZW5lcmljX3NldF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJCSAgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKQotewotCVdSRUczMihyaW5nLT53cHRyX3JlZywgcmluZy0+d3B0cik7Ci0JKHZvaWQpUlJFRzMyKHJpbmctPndwdHJfcmVnKTsKLX0KLQogLyoqCiAgKiByYWRlb25fcmluZ19mcmVlX3NpemUgLSB1cGRhdGUgdGhlIGZyZWUgc2l6ZQogICoKQEAgLTQ2Myw3ICs0MzMsNyBAQAogCXdoaWxlIChyaW5nLT53cHRyICYgcmluZy0+YWxpZ25fbWFzaykgewogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCByaW5nLT5ub3ApOwogCX0KLQlEUk1fTUVNT1JZQkFSUklFUigpOworCW1iKCk7CiAJcmFkZW9uX3Jpbmdfc2V0X3dwdHIocmRldiwgcmluZyk7CiB9CiAKQEAgLTY4OSwyMiArNjU5LDE4IEBACiAgKiBAcmluZzogcmFkZW9uX3Jpbmcgc3RydWN0dXJlIGhvbGRpbmcgcmluZyBpbmZvcm1hdGlvbgogICogQHJpbmdfc2l6ZTogc2l6ZSBvZiB0aGUgcmluZwogICogQHJwdHJfb2Zmczogb2Zmc2V0IG9mIHRoZSBycHRyIHdyaXRlYmFjayBsb2NhdGlvbiBpbiB0aGUgV0IgYnVmZmVyCi0gKiBAcnB0cl9yZWc6IE1NSU8gb2Zmc2V0IG9mIHRoZSBycHRyIHJlZ2lzdGVyCi0gKiBAd3B0cl9yZWc6IE1NSU8gb2Zmc2V0IG9mIHRoZSB3cHRyIHJlZ2lzdGVyCiAgKiBAbm9wOiBub3AgcGFja2V0IGZvciB0aGlzIHJpbmcKICAqCiAgKiBJbml0aWFsaXplIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzZWxlY3RlZCByaW5nIChhbGwgYXNpY3MpLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUuCiAgKi8KIGludCByYWRlb25fcmluZ19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX3JpbmcgKnJpbmcsIHVuc2lnbmVkIHJpbmdfc2l6ZSwKLQkJICAgICB1bnNpZ25lZCBycHRyX29mZnMsIHVuc2lnbmVkIHJwdHJfcmVnLCB1bnNpZ25lZCB3cHRyX3JlZywgdTMyIG5vcCkKKwkJICAgICB1bnNpZ25lZCBycHRyX29mZnMsIHUzMiBub3ApCiB7CiAJaW50IHI7CiAKIAlyaW5nLT5yaW5nX3NpemUgPSByaW5nX3NpemU7CiAJcmluZy0+cnB0cl9vZmZzID0gcnB0cl9vZmZzOwotCXJpbmctPnJwdHJfcmVnID0gcnB0cl9yZWc7Ci0JcmluZy0+d3B0cl9yZWcgPSB3cHRyX3JlZzsKIAlyaW5nLT5ub3AgPSBub3A7CiAJLyogQWxsb2NhdGUgcmluZyBidWZmZXIgKi8KIAlpZiAocmluZy0+cmluZ19vYmogPT0gTlVMTCkgewpAQCAtNzkwLDM0ICs3NTYsNTQgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJpZHggPSAqKGludCopbm9kZS0+aW5mb19lbnQtPmRhdGE7CiAJc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nID0gJnJkZXYtPnJpbmdbcmlkeF07CisKKwl1aW50MzJfdCBycHRyLCB3cHRyLCBycHRyX25leHQ7CiAJdW5zaWduZWQgY291bnQsIGksIGo7Ci0JdTMyIHRtcDsKIAogCXJhZGVvbl9yaW5nX2ZyZWVfc2l6ZShyZGV2LCByaW5nKTsKIAljb3VudCA9IChyaW5nLT5yaW5nX3NpemUgLyA0KSAtIHJpbmctPnJpbmdfZnJlZV9kdzsKLQl0bXAgPSByYWRlb25fcmluZ19nZXRfd3B0cihyZGV2LCByaW5nKTsKLQlzZXFfcHJpbnRmKG0sICJ3cHRyKDB4JTA0eCk6IDB4JTA4eCBbJTVkXVxuIiwgcmluZy0+d3B0cl9yZWcsIHRtcCwgdG1wKTsKLQl0bXAgPSByYWRlb25fcmluZ19nZXRfcnB0cihyZGV2LCByaW5nKTsKLQlzZXFfcHJpbnRmKG0sICJycHRyKDB4JTA0eCk6IDB4JTA4eCBbJTVkXVxuIiwgcmluZy0+cnB0cl9yZWcsIHRtcCwgdG1wKTsKKworCXdwdHIgPSByYWRlb25fcmluZ19nZXRfd3B0cihyZGV2LCByaW5nKTsKKwlzZXFfcHJpbnRmKG0sICJ3cHRyOiAweCUwOHggWyU1ZF1cbiIsCisJCSAgIHdwdHIsIHdwdHIpOworCisJcnB0ciA9IHJhZGVvbl9yaW5nX2dldF9ycHRyKHJkZXYsIHJpbmcpOworCXNlcV9wcmludGYobSwgInJwdHI6IDB4JTA4eCBbJTVkXVxuIiwKKwkJICAgcnB0ciwgcnB0cik7CisKIAlpZiAocmluZy0+cnB0cl9zYXZlX3JlZykgewotCQlzZXFfcHJpbnRmKG0sICJycHRyIG5leHQoMHglMDR4KTogMHglMDh4XG4iLCByaW5nLT5ycHRyX3NhdmVfcmVnLAotCQkJICAgUlJFRzMyKHJpbmctPnJwdHJfc2F2ZV9yZWcpKTsKLQl9Ci0Jc2VxX3ByaW50ZihtLCAiZHJpdmVyJ3MgY29weSBvZiB0aGUgd3B0cjogMHglMDh4IFslNWRdXG4iLCByaW5nLT53cHRyLCByaW5nLT53cHRyKTsKLQlzZXFfcHJpbnRmKG0sICJkcml2ZXIncyBjb3B5IG9mIHRoZSBycHRyOiAweCUwOHggWyU1ZF1cbiIsIHJpbmctPnJwdHIsIHJpbmctPnJwdHIpOwotCXNlcV9wcmludGYobSwgImxhc3Qgc2VtYXBob3JlIHNpZ25hbCBhZGRyIDogMHglMDE2bGx4XG4iLCByaW5nLT5sYXN0X3NlbWFwaG9yZV9zaWduYWxfYWRkcik7Ci0Jc2VxX3ByaW50ZihtLCAibGFzdCBzZW1hcGhvcmUgd2FpdCBhZGRyICAgOiAweCUwMTZsbHhcbiIsIHJpbmctPmxhc3Rfc2VtYXBob3JlX3dhaXRfYWRkcik7CisJCXJwdHJfbmV4dCA9IFJSRUczMihyaW5nLT5ycHRyX3NhdmVfcmVnKTsKKwkJc2VxX3ByaW50ZihtLCAicnB0ciBuZXh0KDB4JTA0eCk6IDB4JTA4eCBbJTVkXVxuIiwKKwkJCSAgIHJpbmctPnJwdHJfc2F2ZV9yZWcsIHJwdHJfbmV4dCwgcnB0cl9uZXh0KTsKKwl9IGVsc2UKKwkJcnB0cl9uZXh0ID0gfjA7CisKKwlzZXFfcHJpbnRmKG0sICJkcml2ZXIncyBjb3B5IG9mIHRoZSB3cHRyOiAweCUwOHggWyU1ZF1cbiIsCisJCSAgIHJpbmctPndwdHIsIHJpbmctPndwdHIpOworCXNlcV9wcmludGYobSwgImRyaXZlcidzIGNvcHkgb2YgdGhlIHJwdHI6IDB4JTA4eCBbJTVkXVxuIiwKKwkJICAgcmluZy0+cnB0ciwgcmluZy0+cnB0cik7CisJc2VxX3ByaW50ZihtLCAibGFzdCBzZW1hcGhvcmUgc2lnbmFsIGFkZHIgOiAweCUwMTZsbHhcbiIsCisJCSAgIHJpbmctPmxhc3Rfc2VtYXBob3JlX3NpZ25hbF9hZGRyKTsKKwlzZXFfcHJpbnRmKG0sICJsYXN0IHNlbWFwaG9yZSB3YWl0IGFkZHIgICA6IDB4JTAxNmxseFxuIiwKKwkJICAgcmluZy0+bGFzdF9zZW1hcGhvcmVfd2FpdF9hZGRyKTsKIAlzZXFfcHJpbnRmKG0sICIldSBmcmVlIGR3b3JkcyBpbiByaW5nXG4iLCByaW5nLT5yaW5nX2ZyZWVfZHcpOwogCXNlcV9wcmludGYobSwgIiV1IGR3b3JkcyBpbiByaW5nXG4iLCBjb3VudCk7CisKKwlpZiAoIXJpbmctPnJlYWR5KQorCQlyZXR1cm4gMDsKKwogCS8qIHByaW50IDggZHcgYmVmb3JlIGN1cnJlbnQgcnB0ciBhcyBvZnRlbiBpdCdzIHRoZSBsYXN0IGV4ZWN1dGVkCiAJICogcGFja2V0IHRoYXQgaXMgdGhlIHJvb3QgaXNzdWUKIAkgKi8KLQlpID0gKHJpbmctPnJwdHIgKyByaW5nLT5wdHJfbWFzayArIDEgLSAzMikgJiByaW5nLT5wdHJfbWFzazsKLQlpZiAocmluZy0+cmVhZHkpIHsKLQkJZm9yIChqID0gMDsgaiA8PSAoY291bnQgKyAzMik7IGorKykgewotCQkJc2VxX3ByaW50ZihtLCAiclslNWRdPTB4JTA4eFxuIiwgaSwgcmluZy0+cmluZ1tpXSk7Ci0JCQlpID0gKGkgKyAxKSAmIHJpbmctPnB0cl9tYXNrOwotCQl9CisJaSA9IChycHRyICsgcmluZy0+cHRyX21hc2sgKyAxIC0gMzIpICYgcmluZy0+cHRyX21hc2s7CisJZm9yIChqID0gMDsgaiA8PSAoY291bnQgKyAzMik7IGorKykgeworCQlzZXFfcHJpbnRmKG0sICJyWyU1ZF09MHglMDh4IiwgaSwgcmluZy0+cmluZ1tpXSk7CisJCWlmIChycHRyID09IGkpCisJCQlzZXFfcHV0cyhtLCAiICoiKTsKKwkJaWYgKHJwdHJfbmV4dCA9PSBpKQorCQkJc2VxX3B1dHMobSwgIiAjIik7CisJCXNlcV9wdXRzKG0sICJcbiIpOworCQlpID0gKGkgKyAxKSAmIHJpbmctPnB0cl9tYXNrOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3NhLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zYS5jCmluZGV4IGYwYmFjNjguLmMwNjI1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3NhLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc2EuYwpAQCAtNDAyLDEzICs0MDIsMTUgQEAKIAogCXNwaW5fbG9jaygmc2FfbWFuYWdlci0+d3EubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmc2FfbWFuYWdlci0+b2xpc3QsIG9saXN0KSB7CisJCXVpbnQ2NF90IHNvZmZzZXQgPSBpLT5zb2Zmc2V0ICsgc2FfbWFuYWdlci0+Z3B1X2FkZHI7CisJCXVpbnQ2NF90IGVvZmZzZXQgPSBpLT5lb2Zmc2V0ICsgc2FfbWFuYWdlci0+Z3B1X2FkZHI7CiAJCWlmICgmaS0+b2xpc3QgPT0gc2FfbWFuYWdlci0+aG9sZSkgewogCQkJc2VxX3ByaW50ZihtLCAiPiIpOwogCQl9IGVsc2UgewogCQkJc2VxX3ByaW50ZihtLCAiICIpOwogCQl9Ci0JCXNlcV9wcmludGYobSwgIlsweCUwOHggMHglMDh4XSBzaXplICU4ZCIsCi0JCQkgICBpLT5zb2Zmc2V0LCBpLT5lb2Zmc2V0LCBpLT5lb2Zmc2V0IC0gaS0+c29mZnNldCk7CisJCXNlcV9wcmludGYobSwgIlsweCUwMTBsbHggMHglMDEwbGx4XSBzaXplICU4bGxkIiwKKwkJCSAgIHNvZmZzZXQsIGVvZmZzZXQsIGVvZmZzZXQgLSBzb2Zmc2V0KTsKIAkJaWYgKGktPmZlbmNlKSB7CiAJCQlzZXFfcHJpbnRmKG0sICIgcHJvdGVjdGVkIGJ5IDB4JTAxNmxseCBvbiByaW5nICVkIiwKIAkJCQkgICBpLT5mZW5jZS0+c2VxLCBpLT5mZW5jZS0+cmluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYwppbmRleCA0ZDIwOTEwLi45NTZhYjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKQEAgLTE4MTAsNyArMTgxMCw3IEBACiAJCX0KIAkJaWYgKCFidWYpIHsKIAkJCURSTV9ERUJVRygiRUFHQUlOXG4iKTsKLQkJCWlmIChEUk1fQ09QWV9UT19VU0VSKHRleC0+aW1hZ2UsIGltYWdlLCBzaXplb2YoKmltYWdlKSkpCisJCQlpZiAoY29weV90b191c2VyKHRleC0+aW1hZ2UsIGltYWdlLCBzaXplb2YoKmltYWdlKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQpAQCAtMTgyMyw3ICsxODIzLDcgQEAKIAogI2RlZmluZSBSQURFT05fQ09QWV9NVChfYnVmLCBfZGF0YSwgX3dpZHRoKSBcCiAJZG8geyBcCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoX2J1ZiwgX2RhdGEsIChfd2lkdGgpKSkge1wKKwkJaWYgKGNvcHlfZnJvbV91c2VyKF9idWYsIF9kYXRhLCAoX3dpZHRoKSkpIHtcCiAJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLCAoX3dpZHRoKSk7IFwKIAkJCXJldHVybiAtRUZBVUxUOyBcCiAJCX0gXApAQCAtMjE2OCw3ICsyMTY4LDcgQEAKIAlpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCiAJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOwogCi0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmZGVwdGhfYm94ZXMsIGNsZWFyLT5kZXB0aF9ib3hlcywKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRlcHRoX2JveGVzLCBjbGVhci0+ZGVwdGhfYm94ZXMsCiAJCQkgICAgICAgc2FyZWFfcHJpdi0+bmJveCAqIHNpemVvZihkZXB0aF9ib3hlc1swXSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMjQzNiw3ICsyNDM2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmaW1hZ2UsCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbWFnZSwKIAkJCSAgICAgICAoZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKikgdGV4LT5pbWFnZSwKIAkJCSAgICAgICBzaXplb2YoaW1hZ2UpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNDYwLDcgKzI0NjAsNyBAQAogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJm1hc2ssIHN0aXBwbGUtPm1hc2ssIDMyICogc2l6ZW9mKHUzMikpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbWFzaywgc3RpcHBsZS0+bWFzaywgMzIgKiBzaXplb2YodTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKQEAgLTI1ODUsMTMgKzI1ODUsMTMgQEAKIAkJZHJtX3JhZGVvbl9wcmltX3QgcHJpbTsKIAkJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHRjbHByaW07CiAKLQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmcHJpbSwgJnZlcnRleC0+cHJpbVtpXSwgc2l6ZW9mKHByaW0pKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwcmltLCAmdmVydGV4LT5wcmltW2ldLCBzaXplb2YocHJpbSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKHByaW0uc3RhdGVpZHggIT0gbGFzdHN0YXRlKSB7CiAJCQlkcm1fcmFkZW9uX3N0YXRlX3Qgc3RhdGU7CiAKLQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJnN0YXRlLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGF0ZSwKIAkJCQkJICAgICAgICZ2ZXJ0ZXgtPnN0YXRlW3ByaW0uc3RhdGVpZHhdLAogCQkJCQkgICAgICAgc2l6ZW9mKHN0YXRlKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNzk5LDcgKzI3OTksNyBAQAogCiAJZG8gewogCQlpZiAoaSA8IGNtZGJ1Zi0+bmJveCkgewotCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpKSkKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCS8qIEZJWE1FIFRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgdGltZXMgcm91bmQKIAkJCSAqIHRoaXMgbG9vcCwgc2VuZCBhIFdBSVRfVU5USUxfM0RfSURMRSBiZWZvcmUKQEAgLTMxMTYsNyArMzExNiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChEUk1fQ09QWV9UT19VU0VSKHBhcmFtLT52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKKwlpZiAoY29weV90b191c2VyKHBhcmFtLT52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKIAkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHJhY2UuaAppbmRleCAwNDczMjU3Li5mNzQ5ZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlLmgKQEAgLTEwNiw0MiArMTA2LDQ1IEBACiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MocmFkZW9uX2ZlbmNlX3JlcXVlc3QsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJpbmcsIHUzMiBzZXFubyksCiAKLQkgICAgVFBfQVJHUyhkZXYsIHNlcW5vKSwKKwkgICAgVFBfQVJHUyhkZXYsIHJpbmcsIHNlcW5vKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAogCQkJICAgICBfX2ZpZWxkKHUzMiwgZGV2KQorCQkJICAgICBfX2ZpZWxkKGludCwgcmluZykKIAkJCSAgICAgX19maWVsZCh1MzIsIHNlcW5vKQogCQkJICAgICApLAogCiAJICAgIFRQX2Zhc3RfYXNzaWduKAogCQkJICAgX19lbnRyeS0+ZGV2ID0gZGV2LT5wcmltYXJ5LT5pbmRleDsKKwkJCSAgIF9fZW50cnktPnJpbmcgPSByaW5nOwogCQkJICAgX19lbnRyeS0+c2Vxbm8gPSBzZXFubzsKIAkJCSAgICksCiAKLQkgICAgVFBfcHJpbnRrKCJkZXY9JXUsIHNlcW5vPSV1IiwgX19lbnRyeS0+ZGV2LCBfX2VudHJ5LT5zZXFubykKKwkgICAgVFBfcHJpbnRrKCJkZXY9JXUsIHJpbmc9JWQsIHNlcW5vPSV1IiwKKwkJICAgICAgX19lbnRyeS0+ZGV2LCBfX2VudHJ5LT5yaW5nLCBfX2VudHJ5LT5zZXFubykKICk7CiAKIERFRklORV9FVkVOVChyYWRlb25fZmVuY2VfcmVxdWVzdCwgcmFkZW9uX2ZlbmNlX2VtaXQsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJpbmcsIHUzMiBzZXFubyksCiAKLQkgICAgVFBfQVJHUyhkZXYsIHNlcW5vKQorCSAgICBUUF9BUkdTKGRldiwgcmluZywgc2Vxbm8pCiApOwogCiBERUZJTkVfRVZFTlQocmFkZW9uX2ZlbmNlX3JlcXVlc3QsIHJhZGVvbl9mZW5jZV93YWl0X2JlZ2luLAogCi0JICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzZXFubyksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByaW5nLCB1MzIgc2Vxbm8pLAogCi0JICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKwkgICAgVFBfQVJHUyhkZXYsIHJpbmcsIHNlcW5vKQogKTsKIAogREVGSU5FX0VWRU5UKHJhZGVvbl9mZW5jZV9yZXF1ZXN0LCByYWRlb25fZmVuY2Vfd2FpdF9lbmQsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJpbmcsIHUzMiBzZXFubyksCiAKLQkgICAgVFBfQVJHUyhkZXYsIHNlcW5vKQorCSAgICBUUF9BUkdTKGRldiwgcmluZywgc2Vxbm8pCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHJhZGVvbl9zZW1hcGhvcmVfcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKaW5kZXggNzEyNDVkNi4uNzdmNWIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKQEAgLTM5LDEyICszOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgogCiAjZGVmaW5lIERSTV9GSUxFX1BBR0VfT0ZGU0VUICgweDEwMDAwMDAwMFVMTCA+PiBQQUdFX1NISUZUKQogCiBzdGF0aWMgaW50IHJhZGVvbl90dG1fZGVidWdmc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3N0YXRpYyB2b2lkIHJhZGVvbl90dG1fZGVidWdmc19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fZGV2aWNlICpyYWRlb25fZ2V0X3JkZXYoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYpCiB7CkBAIC0xNDIsNyArMTQ0LDcgQEAKIAkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfCBUVE1fTUVNVFlQRV9GTEFHX0NNQTsKICNpZiBfX09TX0hBU19BR1AKIAkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewotCQkJaWYgKCEoZHJtX2NvcmVfaGFzX0FHUChyZGV2LT5kZGV2KSAmJiByZGV2LT5kZGV2LT5hZ3ApKSB7CisJCQlpZiAoIXJkZXYtPmRkZXYtPmFncCkgewogCQkJCURSTV9FUlJPUigiQUdQIGlzIG5vdCBlbmFibGVkIGZvciBtZW1vcnkgdHlwZSAldVxuIiwKIAkJCQkJICAodW5zaWduZWQpdHlwZSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NTMsNiArNzU1LDcgQEAKIAogCWlmICghcmRldi0+bW1hbi5pbml0aWFsaXplZCkKIAkJcmV0dXJuOworCXJhZGVvbl90dG1fZGVidWdmc19maW5pKHJkZXYpOwogCWlmIChyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpIHsKIAkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSwgZmFsc2UpOwogCQlpZiAociA9PSAwKSB7CkBAIC04MzIsMTYgKzgzNSwxNSBAQAogCXJldHVybiAwOwogfQogCi0KLSNkZWZpbmUgUkFERU9OX0RFQlVHRlNfTUVNX1RZUEVTIDIKLQogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorCiBzdGF0aWMgaW50IHJhZGVvbl9tbV9kdW1wX3RhYmxlKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKW0tPnByaXZhdGU7Ci0Jc3RydWN0IGRybV9tbSAqbW0gPSAoc3RydWN0IGRybV9tbSAqKW5vZGUtPmluZm9fZW50LT5kYXRhOworCXVuc2lnbmVkIHR0bV9wbCA9ICooaW50ICopbm9kZS0+aW5mb19lbnQtPmRhdGE7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbW0gKm1tID0gKHN0cnVjdCBkcm1fbW0gKilyZGV2LT5tbWFuLmJkZXYubWFuW3R0bV9wbF0ucHJpdjsKIAlpbnQgcmV0OwogCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gcmRldi0+bW1hbi5iZGV2Lmdsb2I7CiAKQEAgLTg1MCw0NiArODUyLDE2OSBAQAogCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGludCB0dG1fcGxfdnJhbSA9IFRUTV9QTF9WUkFNOworc3RhdGljIGludCB0dG1fcGxfdHQgPSBUVE1fUExfVFQ7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCByYWRlb25fdHRtX2RlYnVnZnNfbGlzdFtdID0geworCXsicmFkZW9uX3ZyYW1fbW0iLCByYWRlb25fbW1fZHVtcF90YWJsZSwgMCwgJnR0bV9wbF92cmFtfSwKKwl7InJhZGVvbl9ndHRfbW0iLCByYWRlb25fbW1fZHVtcF90YWJsZSwgMCwgJnR0bV9wbF90dH0sCisJeyJ0dG1fcGFnZV9wb29sIiwgdHRtX3BhZ2VfYWxsb2NfZGVidWdmcywgMCwgTlVMTH0sCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKKwl7InR0bV9kbWFfcGFnZV9wb29sIiwgdHRtX2RtYV9wYWdlX2FsbG9jX2RlYnVnZnMsIDAsIE5VTEx9CisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgcmFkZW9uX3R0bV92cmFtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSk7CisJZmlsZXAtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJhZGVvbl90dG1fdnJhbV9yZWFkKHN0cnVjdCBmaWxlICpmLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBmLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXN1bHQgPSAwOworCWludCByOworCisJaWYgKHNpemUgJiAweDMgfHwgKnBvcyAmIDB4MykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1aW50MzJfdCB2YWx1ZTsKKworCQlpZiAoKnBvcyA+PSByZGV2LT5tYy5tY192cmFtX3NpemUpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5tbWlvX2lkeF9sb2NrLCBmbGFncyk7CisJCVdSRUczMihSQURFT05fTU1fSU5ERVgsICgodWludDMyX3QpKnBvcykgfCAweDgwMDAwMDAwKTsKKwkJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0NFREFSKQorCQkJV1JFRzMyKEVWRVJHUkVFTl9NTV9JTkRFWF9ISSwgKnBvcyA+PiAzMSk7CisJCXZhbHVlID0gUlJFRzMyKFJBREVPTl9NTV9EQVRBKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+bW1pb19pZHhfbG9jaywgZmxhZ3MpOworCisJCXIgPSBwdXRfdXNlcih2YWx1ZSwgKHVpbnQzMl90ICopYnVmKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyZXN1bHQgKz0gNDsKKwkJYnVmICs9IDQ7CisJCSpwb3MgKz0gNDsKKwkJc2l6ZSAtPSA0OworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhZGVvbl90dG1fdnJhbV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcmFkZW9uX3R0bV92cmFtX29wZW4sCisJLnJlYWQgPSByYWRlb25fdHRtX3ZyYW1fcmVhZCwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWsKK307CisKK3N0YXRpYyBpbnQgcmFkZW9uX3R0bV9ndHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBpbm9kZS0+aV9wcml2YXRlOworCWlfc2l6ZV93cml0ZShpbm9kZSwgcmRldi0+bWMuZ3R0X3NpemUpOworCWZpbGVwLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCByYWRlb25fdHRtX2d0dF9yZWFkKHN0cnVjdCBmaWxlICpmLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGYtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlc3VsdCA9IDA7CisJaW50IHI7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlsb2ZmX3QgcCA9ICpwb3MgLyBQQUdFX1NJWkU7CisJCXVuc2lnbmVkIG9mZiA9ICpwb3MgJiB+UEFHRV9NQVNLOworCQlzc2l6ZV90IGN1cl9zaXplID0gbWluKHNpemUsIFBBR0VfU0laRSAtIG9mZik7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQl2b2lkICpwdHI7CisKKwkJaWYgKHAgPj0gcmRldi0+Z2FydC5udW1fY3B1X3BhZ2VzKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQlwYWdlID0gcmRldi0+Z2FydC5wYWdlc1twXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXB0ciA9IGttYXAocGFnZSk7CisJCQlwdHIgKz0gb2ZmOworCisJCQlyID0gY29weV90b191c2VyKGJ1ZiwgcHRyLCBjdXJfc2l6ZSk7CisJCQlrdW5tYXAocmRldi0+Z2FydC5wYWdlc1twXSk7CisJCX0gZWxzZQorCQkJciA9IGNsZWFyX3VzZXIoYnVmLCBjdXJfc2l6ZSk7CisKKwkJaWYgKHIpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXN1bHQgKz0gY3VyX3NpemU7CisJCWJ1ZiArPSBjdXJfc2l6ZTsKKwkJKnBvcyArPSBjdXJfc2l6ZTsKKwkJc2l6ZSAtPSBjdXJfc2l6ZTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYWRlb25fdHRtX2d0dF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcmFkZW9uX3R0bV9ndHRfb3BlbiwKKwkucmVhZCA9IHJhZGVvbl90dG1fZ3R0X3JlYWQsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrCit9OworCiAjZW5kaWYKIAogc3RhdGljIGludCByYWRlb25fdHRtX2RlYnVnZnNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKLQlzdGF0aWMgc3RydWN0IGRybV9pbmZvX2xpc3QgcmFkZW9uX21lbV90eXBlc19saXN0W1JBREVPTl9ERUJVR0ZTX01FTV9UWVBFUysyXTsKLQlzdGF0aWMgY2hhciByYWRlb25fbWVtX3R5cGVzX25hbWVzW1JBREVPTl9ERUJVR0ZTX01FTV9UWVBFUysyXVszMl07Ci0JdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBjb3VudDsKIAotCWZvciAoaSA9IDA7IGkgPCBSQURFT05fREVCVUdGU19NRU1fVFlQRVM7IGkrKykgewotCQlpZiAoaSA9PSAwKQotCQkJc3ByaW50ZihyYWRlb25fbWVtX3R5cGVzX25hbWVzW2ldLCAicmFkZW9uX3ZyYW1fbW0iKTsKLQkJZWxzZQotCQkJc3ByaW50ZihyYWRlb25fbWVtX3R5cGVzX25hbWVzW2ldLCAicmFkZW9uX2d0dF9tbSIpOwotCQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaV0ubmFtZSA9IHJhZGVvbl9tZW1fdHlwZXNfbmFtZXNbaV07Ci0JCXJhZGVvbl9tZW1fdHlwZXNfbGlzdFtpXS5zaG93ID0gJnJhZGVvbl9tbV9kdW1wX3RhYmxlOwotCQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaV0uZHJpdmVyX2ZlYXR1cmVzID0gMDsKLQkJaWYgKGkgPT0gMCkKLQkJCXJhZGVvbl9tZW1fdHlwZXNfbGlzdFtpXS5kYXRhID0gcmRldi0+bW1hbi5iZGV2Lm1hbltUVE1fUExfVlJBTV0ucHJpdjsKLQkJZWxzZQotCQkJcmFkZW9uX21lbV90eXBlc19saXN0W2ldLmRhdGEgPSByZGV2LT5tbWFuLmJkZXYubWFuW1RUTV9QTF9UVF0ucHJpdjsKKwlzdHJ1Y3QgZHJtX21pbm9yICptaW5vciA9IHJkZXYtPmRkZXYtPnByaW1hcnk7CisJc3RydWN0IGRlbnRyeSAqZW50LCAqcm9vdCA9IG1pbm9yLT5kZWJ1Z2ZzX3Jvb3Q7CiAKLQl9Ci0JLyogQWRkIHR0bSBwYWdlIHBvb2wgdG8gZGVidWdmcyAqLwotCXNwcmludGYocmFkZW9uX21lbV90eXBlc19uYW1lc1tpXSwgInR0bV9wYWdlX3Bvb2wiKTsKLQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaV0ubmFtZSA9IHJhZGVvbl9tZW1fdHlwZXNfbmFtZXNbaV07Ci0JcmFkZW9uX21lbV90eXBlc19saXN0W2ldLnNob3cgPSAmdHRtX3BhZ2VfYWxsb2NfZGVidWdmczsKLQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaV0uZHJpdmVyX2ZlYXR1cmVzID0gMDsKLQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaSsrXS5kYXRhID0gTlVMTDsKKwllbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYWRlb25fdnJhbSIsIFNfSUZSRUcgfCBTX0lSVUdPLCByb290LAorCQkJCSAgcmRldiwgJnJhZGVvbl90dG1fdnJhbV9mb3BzKTsKKwlpZiAoSVNfRVJSKGVudCkpCisJCXJldHVybiBQVFJfRVJSKGVudCk7CisJcmRldi0+bW1hbi52cmFtID0gZW50OworCisJZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmFkZW9uX2d0dCIsIFNfSUZSRUcgfCBTX0lSVUdPLCByb290LAorCQkJCSAgcmRldiwgJnJhZGVvbl90dG1fZ3R0X2ZvcHMpOworCWlmIChJU19FUlIoZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50KTsKKwlyZGV2LT5tbWFuLmd0dCA9IGVudDsKKworCWNvdW50ID0gQVJSQVlfU0laRShyYWRlb25fdHRtX2RlYnVnZnNfbGlzdCk7CisKICNpZmRlZiBDT05GSUdfU1dJT1RMQgotCWlmIChzd2lvdGxiX25yX3RibCgpKSB7Ci0JCXNwcmludGYocmFkZW9uX21lbV90eXBlc19uYW1lc1tpXSwgInR0bV9kbWFfcGFnZV9wb29sIik7Ci0JCXJhZGVvbl9tZW1fdHlwZXNfbGlzdFtpXS5uYW1lID0gcmFkZW9uX21lbV90eXBlc19uYW1lc1tpXTsKLQkJcmFkZW9uX21lbV90eXBlc19saXN0W2ldLnNob3cgPSAmdHRtX2RtYV9wYWdlX2FsbG9jX2RlYnVnZnM7Ci0JCXJhZGVvbl9tZW1fdHlwZXNfbGlzdFtpXS5kcml2ZXJfZmVhdHVyZXMgPSAwOwotCQlyYWRlb25fbWVtX3R5cGVzX2xpc3RbaSsrXS5kYXRhID0gTlVMTDsKLQl9CisJaWYgKCFzd2lvdGxiX25yX3RibCgpKQorCQktLWNvdW50OwogI2VuZGlmCi0JcmV0dXJuIHJhZGVvbl9kZWJ1Z2ZzX2FkZF9maWxlcyhyZGV2LCByYWRlb25fbWVtX3R5cGVzX2xpc3QsIGkpOwogCi0jZW5kaWYKKwlyZXR1cm4gcmFkZW9uX2RlYnVnZnNfYWRkX2ZpbGVzKHJkZXYsIHJhZGVvbl90dG1fZGVidWdmc19saXN0LCBjb3VudCk7CisjZWxzZQorCiAJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX3R0bV9kZWJ1Z2ZzX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCisKKwlkZWJ1Z2ZzX3JlbW92ZShyZGV2LT5tbWFuLnZyYW0pOworCXJkZXYtPm1tYW4udnJhbSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShyZGV2LT5tbWFuLmd0dCk7CisJcmRldi0+bW1hbi5ndHQgPSBOVUxMOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl91dmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCmluZGV4IGI5YzA1MjkuLjY3ODFmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCkBAIC05MSw2ICs5MSw3IEBACiAJY2FzZSBDSElQX1ZFUkRFOgogCWNhc2UgQ0hJUF9QSVRDQUlSTjoKIAljYXNlIENISVBfQVJVQkE6CisJY2FzZSBDSElQX09MQU5EOgogCQlmd19uYW1lID0gRklSTVdBUkVfVEFISVRJOwogCQlicmVhazsKIApAQCAtNzc4LDYgKzc3OSw4IEBACiAKIAlpZiAocmFkZW9uX2ZlbmNlX2NvdW50X2VtaXR0ZWQocmRldiwgUjYwMF9SSU5HX1RZUEVfVVZEX0lOREVYKSA9PSAwKSB7CiAJCWlmICgocmRldi0+cG0ucG1fbWV0aG9kID09IFBNX01FVEhPRF9EUE0pICYmIHJkZXYtPnBtLmRwbV9lbmFibGVkKSB7CisJCQlyYWRlb25fdXZkX2NvdW50X2hhbmRsZXMocmRldiwgJnJkZXYtPnBtLmRwbS5zZCwKKwkJCQkJCSAmcmRldi0+cG0uZHBtLmhkKTsKIAkJCXJhZGVvbl9kcG1fZW5hYmxlX3V2ZChyZGV2LCBmYWxzZSk7CiAJCX0gZWxzZSB7CiAJCQlyYWRlb25fc2V0X3V2ZF9jbG9ja3MocmRldiwgMCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I2MDAgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I2MDAKaW5kZXggMjBiZmJkYS4uZWMwYzY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjYwMApAQCAtMTgsNiArMTgsNyBAQAogMHgwMDAyOEEzQyBWR1RfR1JPVVBfVkVDVF8xX0ZNVF9DTlRMCiAweDAwMDI4QTQwIFZHVF9HU19NT0RFCiAweDAwMDI4QTZDIFZHVF9HU19PVVRfUFJJTV9UWVBFCisweDAwMDI4QjM4IFZHVF9HU19NQVhfVkVSVF9PVVQKIDB4MDAwMDg4QzggVkdUX0dTX1BFUl9FUwogMHgwMDAwODhFOCBWR1RfR1NfUEVSX1ZTCiAweDAwMDA4OEQ0IFZHVF9HU19WRVJURVhfUkVVU0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwppbmRleCA5NTY2YjU5Li5iNWMyMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCkBAIC00NzQsNiArNDc0LDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcnM0MDBfc3RhcnR1cChyZGV2KTsKIAlpZiAocikgewpAQCAtNDg0LDYgKzQ4Niw3IEBACiAKIGludCByczQwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlyMTAwX2lycV9kaXNhYmxlKHJkZXYpOwpAQCAtNDkzLDYgKzQ5Niw3IEBACiAKIHZvaWQgcnM0MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fZmluaShyZGV2KTsKIAlyMTAwX2NwX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CiAJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKQEAgLTU2MCw2ICs1NjQsOSBAQAogCQlyZXR1cm4gcjsKIAlyMzAwX3NldF9yZWdfc2FmZShyZGV2KTsKIAorCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHJzNDAwX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwppbmRleCA3NmNjOGQzLi5mZGNkZTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCkBAIC0xMDQ4LDYgKzEwNDgsOCBAQAogCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KIAlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCisJcmFkZW9uX3BtX3Jlc3VtZShyZGV2KTsKKwogCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOwogCXIgPSByczYwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CkBAIC0xMDU4LDYgKzEwNjAsNyBAQAogCiBpbnQgcnM2MDBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fc3VzcGVuZChyZGV2KTsKIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwpAQCAtMTA2OCw2ICsxMDcxLDcgQEAKIAogdm9pZCByczYwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9maW5pKHJkZXYpOwogCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAlyMTAwX2NwX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CkBAIC0xMTM2LDYgKzExNDAsOSBAQAogCQlyZXR1cm4gcjsKIAlyczYwMF9zZXRfc2FmZV9yZWdpc3RlcnMocmRldik7CiAKKwkvKiBJbml0aWFsaXplIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlyYWRlb25fcG1faW5pdChyZGV2KTsKKwogCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOwogCXIgPSByczYwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwLmMKaW5kZXggZTdkYWIwNi4uMzU5NTA3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYwpAQCAtNzU2LDYgKzc1Niw4IEBACiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CiAKKwlyYWRlb25fcG1fcmVzdW1lKHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHJzNjkwX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTc2Niw2ICs3NjgsNyBAQAogCiBpbnQgcnM2OTBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fc3VzcGVuZChyZGV2KTsKIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwpAQCAtNzc2LDYgKzc3OSw3IEBACiAKIHZvaWQgcnM2OTBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fZmluaShyZGV2KTsKIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJcjEwMF9jcF9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOwpAQCAtODQ1LDYgKzg0OSw5IEBACiAJCXJldHVybiByOwogCXJzNjAwX3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKIAorCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHJzNjkwX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM3ODBfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNzgwX2RwbS5jCmluZGV4IDZhZjg1MDUuLjg1MTIwODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM3ODBfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczc4MF9kcG0uYwpAQCAtNjIzLDE0ICs2MjMsNiBAQAogCWlmIChwaS0+Z2Z4X2Nsb2NrX2dhdGluZykKIAkJcjYwMF9nZnhfY2xvY2tnYXRpbmdfZW5hYmxlKHJkZXYsIHRydWUpOwogCi0JaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQgJiYgKHJkZXYtPnBtLmludF90aGVybWFsX3R5cGUgPT0gVEhFUk1BTF9UWVBFX1JWNlhYKSkgewotCQlyZXQgPSByNjAwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHJkZXYsIFI2MDBfVEVNUF9SQU5HRV9NSU4sIFI2MDBfVEVNUF9SQU5HRV9NQVgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJcmRldi0+aXJxLmRwbV90aGVybWFsID0gdHJ1ZTsKLQkJcmFkZW9uX2lycV9zZXQocmRldik7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYwppbmRleCA1ZDFjMzE2Li45OGU4MTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjUxNS5jCkBAIC01ODYsNiArNTg2LDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gIHJ2NTE1X3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTU5Niw2ICs1OTgsNyBAQAogCiBpbnQgcnY1MTVfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlyYWRlb25fcG1fc3VzcGVuZChyZGV2KTsKIAlyMTAwX2NwX2Rpc2FibGUocmRldik7CiAJcmFkZW9uX3diX2Rpc2FibGUocmRldik7CiAJcnM2MDBfaXJxX2Rpc2FibGUocmRldik7CkBAIC02MTIsNiArNjE1LDcgQEAKIAogdm9pZCBydjUxNV9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9maW5pKHJkZXYpOwogCXIxMDBfY3BfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKIAlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwpAQCAtNjg1LDYgKzY4OSw5IEBACiAJCXJldHVybiByOwogCXJ2NTE1X3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKIAorCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHJ2NTE1X3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY2eHhfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2Nnh4X2RwbS5jCmluZGV4IDI2NjMzYTAuLmJlYmYzMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY2eHhfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjZ4eF9kcG0uYwpAQCAtMTU0Niw3ICsxNTQ2LDYgQEAKIHsKIAlzdHJ1Y3QgcnY2eHhfcG93ZXJfaW5mbyAqcGkgPSBydjZ4eF9nZXRfcGkocmRldik7CiAJc3RydWN0IHJhZGVvbl9wcyAqYm9vdF9wcyA9IHJkZXYtPnBtLmRwbS5ib290X3BzOwotCWludCByZXQ7CiAKIAlpZiAocjYwMF9keW5hbWljcG1fZW5hYmxlZChyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTk0LDE1ICsxNTkzLDYgQEAKIAlyNjAwX3Bvd2VyX2xldmVsX2VuYWJsZShyZGV2LCBSNjAwX1BPV0VSX0xFVkVMX01FRElVTSwgdHJ1ZSk7CiAJcjYwMF9wb3dlcl9sZXZlbF9lbmFibGUocmRldiwgUjYwMF9QT1dFUl9MRVZFTF9ISUdILCB0cnVlKTsKIAotCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkICYmCi0JICAgIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IocmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSkpIHsKLQkJcmV0ID0gcjYwMF9zZXRfdGhlcm1hbF90ZW1wZXJhdHVyZV9yYW5nZShyZGV2LCBSNjAwX1RFTVBfUkFOR0VfTUlOLCBSNjAwX1RFTVBfUkFOR0VfTUFYKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJkZXYtPmlycS5kcG1fdGhlcm1hbCA9IHRydWU7Ci0JCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwotCX0KLQogCXJ2Nnh4X2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOwogCiAJcjYwMF9zdGFydF9kcG0ocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggOWY1ODQ2Ny4uNmM3NzJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwpAQCAtMTA3MSw3ICsxMDcxLDggQEAKICAqLwogdm9pZCByNzAwX2NwX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7CisJaWYgKHJkZXYtPmFzaWMtPmNvcHkuY29weV9yaW5nX2luZGV4ID09IFJBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYKQorCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplKTsKIAlXUkVHMzIoQ1BfTUVfQ05UTCwgKENQX01FX0hBTFQgfCBDUF9QRlBfSEFMVCkpOwogCVdSRUczMihTQ1JBVENIX1VNU0ssIDApOwogCXJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdLnJlYWR5ID0gZmFsc2U7CkBAIC0xMTIzLDYgKzExMjQsMzUgQEAKIAlyYWRlb25fc2NyYXRjaF9mcmVlKHJkZXYsIHJpbmctPnJwdHJfc2F2ZV9yZWcpOwogfQogCit2b2lkIHJ2NzcwX3NldF9jbGtfYnlwYXNzX21vZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHRtcCwgaTsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCXRtcCA9IFJSRUczMihDR19TUExMX0ZVTkNfQ05UTF8yKTsKKwl0bXAgJj0gU0NMS19NVVhfU0VMX01BU0s7CisJdG1wIHw9IFNDTEtfTVVYX1NFTCgxKSB8IFNDTEtfTVVYX1VQREFURTsKKwlXUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVExfMiwgdG1wKTsKKworCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoUlJFRzMyKENHX1NQTExfU1RBVFVTKSAmIFNQTExfQ0hHX1NUQVRVUykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJdG1wICY9IH5TQ0xLX01VWF9VUERBVEU7CisJV1JFRzMyKENHX1NQTExfRlVOQ19DTlRMXzIsIHRtcCk7CisKKwl0bXAgPSBSUkVHMzIoTVBMTF9DTlRMX01PREUpOworCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjczMCkpCisJCXRtcCAmPSB+UlY3MzBfTVBMTF9NQ0xLX1NFTDsKKwllbHNlCisJCXRtcCAmPSB+TVBMTF9NQ0xLX1NFTDsKKwlXUkVHMzIoTVBMTF9DTlRMX01PREUsIHRtcCk7Cit9CisKIC8qCiAgKiBDb3JlIGZ1bmN0aW9ucwogICovCkBAIC0xNjY1LDE0ICsxNjk1LDYgQEAKIAogCXJ2NzcwX21jX3Byb2dyYW0ocmRldik7CiAKLQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgewotCQlyID0gcjYwMF9pbml0X21pY3JvY29kZShyZGV2KTsKLQkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKLQkJCXJldHVybiByOwotCQl9Ci0JfQotCiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlydjc3MF9hZ3BfZW5hYmxlKHJkZXYpOwogCX0gZWxzZSB7CkBAIC0xNzI4LDE0ICsxNzUwLDEyIEBACiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUkFERU9OX1dCX0NQX1JQVFJfT0ZGU0VULAotCQkJICAgICBSNjAwX0NQX1JCX1JQVFIsIFI2MDBfQ1BfUkJfV1BUUiwKIAkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCXJpbmcgPSAmcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9ETUFfSU5ERVhdOwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJpbmcsIHJpbmctPnJpbmdfc2l6ZSwgUjYwMF9XQl9ETUFfUlBUUl9PRkZTRVQsCi0JCQkgICAgIERNQV9SQl9SUFRSLCBETUFfUkJfV1BUUiwKIAkJCSAgICAgRE1BX1BBQ0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCwgMCkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTE3NTQsNyArMTc3NCw2IEBACiAJcmluZyA9ICZyZGV2LT5yaW5nW1I2MDBfUklOR19UWVBFX1VWRF9JTkRFWF07CiAJaWYgKHJpbmctPnJpbmdfc2l6ZSkgewogCQlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIDAsCi0JCQkJICAgICBVVkRfUkJDX1JCX1JQVFIsIFVWRF9SQkNfUkJfV1BUUiwKIAkJCQkgICAgIFJBREVPTl9DUF9QQUNLRVQyKTsKIAkJaWYgKCFyKQogCQkJciA9IHV2ZF92MV8wX2luaXQocmRldik7CkBAIC0xNzkyLDYgKzE4MTEsOCBAQAogCS8qIGluaXQgZ29sZGVuIHJlZ2lzdGVycyAqLwogCXJ2NzcwX2luaXRfZ29sZGVuX3JlZ2lzdGVycyhyZGV2KTsKIAorCXJhZGVvbl9wbV9yZXN1bWUocmRldik7CisKIAlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcnY3NzBfc3RhcnR1cChyZGV2KTsKIAlpZiAocikgewpAQCAtMTgwNiw2ICsxODI3LDcgQEAKIAogaW50IHJ2NzcwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX3N1c3BlbmQocmRldik7CiAJcjYwMF9hdWRpb19maW5pKHJkZXYpOwogCXV2ZF92MV8wX2ZpbmkocmRldik7CiAJcmFkZW9uX3V2ZF9zdXNwZW5kKHJkZXYpOwpAQCAtMTg3Niw2ICsxODk4LDE3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKKwkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLworCXJhZGVvbl9wbV9pbml0KHJkZXYpOworCiAJcmRldi0+cmluZ1tSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWF0ucmluZ19vYmogPSBOVUxMOwogCXI2MDBfcmluZ19pbml0KHJkZXYsICZyZGV2LT5yaW5nW1JBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYXSwgMTAyNCAqIDEwMjQpOwogCkBAIC0xOTE1LDYgKzE5NDgsNyBAQAogCiB2b2lkIHJ2NzcwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX2ZpbmkocmRldik7CiAJcjcwMF9jcF9maW5pKHJkZXYpOwogCXI2MDBfZG1hX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwX2RwbS5jCmluZGV4IDM3NDQ5OWQuLjgwYzU5NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MF9kcG0uYwpAQCAtMTg2Myw4ICsxODYzLDggQEAKIAl9CiB9CiAKLWludCBydjc3MF9zZXRfdGhlcm1hbF90ZW1wZXJhdHVyZV9yYW5nZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkJaW50IG1pbl90ZW1wLCBpbnQgbWF4X3RlbXApCitzdGF0aWMgaW50IHJ2NzcwX3NldF90aGVybWFsX3RlbXBlcmF0dXJlX3JhbmdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkgICAgICAgaW50IG1pbl90ZW1wLCBpbnQgbWF4X3RlbXApCiB7CiAJaW50IGxvd190ZW1wID0gMCAqIDEwMDA7CiAJaW50IGhpZ2hfdGVtcCA9IDI1NSAqIDEwMDA7CkBAIC0xOTY2LDYgKzE5NjYsMTUgQEAKIAlpZiAocGktPm1nX2Nsb2NrX2dhdGluZykKIAkJcnY3NzBfbWdfY2xvY2tfZ2F0aW5nX2VuYWJsZShyZGV2LCB0cnVlKTsKIAorCXJ2NzcwX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydjc3MF9kcG1fbGF0ZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHJldDsKKwogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkICYmCiAJICAgIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IocmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSkpIHsKIAkJUFBTTUNfUmVzdWx0IHJlc3VsdDsKQEAgLTE5ODEsOCArMTk5MCw2IEBACiAJCQlEUk1fREVCVUdfS01TKCJDb3VsZCBub3QgZW5hYmxlIHRoZXJtYWwgaW50ZXJydXB0cy5cbiIpOwogCX0KIAotCXJ2NzcwX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNDQsMTQgKzIyNTEsMTIgQEAKIAkJcGwtPnZkZGNpID0gdmRkY2k7CiAJfQogCi0JaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0JBUlRTKSB7Ci0JCWlmICgocnBzLT5jbGFzcyAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTUFTSykgPT0KLQkJICAgIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfUEVSRk9STUFOQ0UpIHsKLQkJCXJkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMuc2NsayA9IHBsLT5zY2xrOwotCQkJcmRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy5tY2xrID0gcGwtPm1jbGs7Ci0JCQlyZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGMgPSBwbC0+dmRkYzsKLQkJCXJkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMudmRkY2kgPSBwbC0+dmRkY2k7Ci0JCX0KKwlpZiAoKHJwcy0+Y2xhc3MgJiBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX01BU0spID09CisJICAgIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfUEVSRk9STUFOQ0UpIHsKKwkJcmRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy5zY2xrID0gcGwtPnNjbGs7CisJCXJkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMubWNsayA9IHBsLT5tY2xrOworCQlyZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGMgPSBwbC0+dmRkYzsKKwkJcmRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYy52ZGRjaSA9IHBsLT52ZGRjaTsKIAl9CiB9CiAKQEAgLTI1MzEsNiArMjUzNiwxMiBAQAogCSAgICAocmRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDFjNDIpKQogCQlzd2l0Y2hfbGltaXQgPSAyMDA7CiAKKwkvKiBSVjc3MCAqLworCS8qIG1jbGsgc3dpdGNoaW5nIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHJlbGlhYmx5IG9uIGRlc2t0b3AgUlY3NzBzICovCisJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjc3MCkgJiYKKwkgICAgIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkpCisJCXN3aXRjaF9saW1pdCA9IDB4ZmZmZmZmZmY7IC8qIGRpc2FibGUgbWNsayBzd2l0Y2hpbmcgKi8KKwogCWlmICh2YmxhbmtfdGltZSA8IHN3aXRjaF9saW1pdCkKIAkJcmV0dXJuIHRydWU7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MF9kcG0uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBfZHBtLmgKaW5kZXggOTI0NGVmZi4uZjc3NjYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MF9kcG0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwX2RwbS5oCkBAIC0yODMsOCArMjgzLDQgQEAKIGludCBydjc3MF93cml0ZV9zbWNfc29mdF9yZWdpc3RlcihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCQkgIHUxNiByZWdfb2Zmc2V0LCB1MzIgdmFsdWUpOwogCi0vKiB0aGVybWFsICovCi1pbnQgcnY3NzBfc2V0X3RoZXJtYWxfdGVtcGVyYXR1cmVfcmFuZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJCWludCBtaW5fdGVtcCwgaW50IG1heF90ZW1wKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MGQuaAppbmRleCAxYWUyNzcxLi4zY2YxZTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBkLmgKQEAgLTEwMCwxNCArMTAwLDIxIEBACiAjZGVmaW5lCUNHX1NQTExfRlVOQ19DTlRMXzIJCQkJMHg2MDQKICNkZWZpbmUJCVNDTEtfTVVYX1NFTCh4KQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQlTQ0xLX01VWF9TRUxfTUFTSwkJCSgweDFmZiA8PCAwKQorI2RlZmluZQkJU0NMS19NVVhfVVBEQVRFCQkJCSgxIDw8IDI2KQogI2RlZmluZQlDR19TUExMX0ZVTkNfQ05UTF8zCQkJCTB4NjA4CiAjZGVmaW5lCQlTUExMX0ZCX0RJVih4KQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQlTUExMX0ZCX0RJVl9NQVNLCQkJKDB4M2ZmZmZmZiA8PCAwKQogI2RlZmluZQkJU1BMTF9ESVRIRU4JCQkJKDEgPDwgMjgpCisjZGVmaW5lCUNHX1NQTExfU1RBVFVTCQkJCQkweDYwYworI2RlZmluZQkJU1BMTF9DSEdfU1RBVFVTCQkJCSgxIDw8IDEpCiAKICNkZWZpbmUJU1BMTF9DTlRMX01PREUJCQkJCTB4NjEwCiAjZGVmaW5lCQlTUExMX0RJVl9TWU5DCQkJCSgxIDw8IDUpCiAKKyNkZWZpbmUgTVBMTF9DTlRMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MWMKKyMgICAgICAgZGVmaW5lIE1QTExfTUNMS19TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBSVjczMF9NUExMX01DTEtfU0VMICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI1KQorCiAjZGVmaW5lCU1QTExfQURfRlVOQ19DTlRMCQkJCTB4NjI0CiAjZGVmaW5lCQlDTEtGKHgpCQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQlDTEtGX01BU0sJCQkJKDB4N2YgPDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2kuYwppbmRleCA4NWUxZWRmLi4wOWVjNGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaS5jCkBAIC04MCw2ICs4MCw4IEBACiBleHRlcm4gYm9vbCBldmVyZ3JlZW5faXNfZGlzcGxheV9odW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHN0YXRpYyB2b2lkIHNpX2VuYWJsZV9ndWlfaWRsZV9pbnRlcnJ1cHQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJCSBib29sIGVuYWJsZSk7CitzdGF0aWMgdm9pZCBzaV9pbml0X3BnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3N0YXRpYyB2b2lkIHNpX2luaXRfY2coc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogc3RhdGljIHZvaWQgc2lfZmluaV9wZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdGF0aWMgdm9pZCBzaV9maW5pX2NnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHN0YXRpYyB2b2lkIHNpX3JsY19zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE0NjAsNyArMTQ2Miw3IEBACiB9OwogCiAvKiB1Y29kZSBsb2FkaW5nICovCi1zdGF0aWMgaW50IHNpX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoraW50IHNpX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWNvbnN0IF9fYmUzMiAqZndfZGF0YTsKIAl1MzIgcnVubmluZywgYmxhY2tvdXQgPSAwOwpAQCAtMzI0Nyw3ICszMjQ5LDggQEAKIAlpZiAoZW5hYmxlKQogCQlXUkVHMzIoQ1BfTUVfQ05UTCwgMCk7CiAJZWxzZSB7Ci0JCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUpOworCQlpZiAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVgpCisJCQlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplKTsKIAkJV1JFRzMyKENQX01FX0NOVEwsIChDUF9NRV9IQUxUIHwgQ1BfUEZQX0hBTFQgfCBDUF9DRV9IQUxUKSk7CiAJCVdSRUczMihTQ1JBVENIX1VNU0ssIDApOwogCQlyZGV2LT5yaW5nW1JBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYXS5yZWFkeSA9IGZhbHNlOwpAQCAtMzUwOCw2ICszNTExLDkgQEAKIAogCXNpX2VuYWJsZV9ndWlfaWRsZV9pbnRlcnJ1cHQocmRldiwgdHJ1ZSk7CiAKKwlpZiAocmRldi0+YXNpYy0+Y29weS5jb3B5X3JpbmdfaW5kZXggPT0gUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVgpCisJCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMucmVhbF92cmFtX3NpemUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3MjQsNiArMzczMCwxMDYgQEAKIAlldmVyZ3JlZW5fcHJpbnRfZ3B1X3N0YXR1c19yZWdzKHJkZXYpOwogfQogCitzdGF0aWMgdm9pZCBzaV9zZXRfY2xrX2J5cGFzc19tb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0bXAsIGk7CisKKwl0bXAgPSBSUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVEwpOworCXRtcCB8PSBTUExMX0JZUEFTU19FTjsKKwlXUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVEwsIHRtcCk7CisKKwl0bXAgPSBSUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVExfMik7CisJdG1wIHw9IFNQTExfQ1RMUkVRX0NIRzsKKwlXUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVExfMiwgdG1wKTsKKworCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoUlJFRzMyKFNQTExfU1RBVFVTKSAmIFNQTExfQ0hHX1NUQVRVUykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJdG1wID0gUlJFRzMyKENHX1NQTExfRlVOQ19DTlRMXzIpOworCXRtcCAmPSB+KFNQTExfQ1RMUkVRX0NIRyB8IFNDTEtfTVVYX1VQREFURSk7CisJV1JFRzMyKENHX1NQTExfRlVOQ19DTlRMXzIsIHRtcCk7CisKKwl0bXAgPSBSUkVHMzIoTVBMTF9DTlRMX01PREUpOworCXRtcCAmPSB+TVBMTF9NQ0xLX1NFTDsKKwlXUkVHMzIoTVBMTF9DTlRMX01PREUsIHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpX3NwbGxfcG93ZXJkb3duKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBSUkVHMzIoU1BMTF9DTlRMX01PREUpOworCXRtcCB8PSBTUExMX1NXX0RJUl9DT05UUk9MOworCVdSRUczMihTUExMX0NOVExfTU9ERSwgdG1wKTsKKworCXRtcCA9IFJSRUczMihDR19TUExMX0ZVTkNfQ05UTCk7CisJdG1wIHw9IFNQTExfUkVTRVQ7CisJV1JFRzMyKENHX1NQTExfRlVOQ19DTlRMLCB0bXApOworCisJdG1wID0gUlJFRzMyKENHX1NQTExfRlVOQ19DTlRMKTsKKwl0bXAgfD0gU1BMTF9TTEVFUDsKKwlXUkVHMzIoQ0dfU1BMTF9GVU5DX0NOVEwsIHRtcCk7CisKKwl0bXAgPSBSUkVHMzIoU1BMTF9DTlRMX01PREUpOworCXRtcCAmPSB+U1BMTF9TV19ESVJfQ09OVFJPTDsKKwlXUkVHMzIoU1BMTF9DTlRMX01PREUsIHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpX2dwdV9wY2lfY29uZmlnX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBldmVyZ3JlZW5fbWNfc2F2ZSBzYXZlOworCXUzMiB0bXAsIGk7CisKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICJHUFUgcGNpIGNvbmZpZyByZXNldFxuIik7CisKKwkvKiBkaXNhYmxlIGRwbT8gKi8KKworCS8qIGRpc2FibGUgY2cvcGcgKi8KKwlzaV9maW5pX3BnKHJkZXYpOworCXNpX2ZpbmlfY2cocmRldik7CisKKwkvKiBEaXNhYmxlIENQIHBhcnNpbmcvcHJlZmV0Y2hpbmcgKi8KKwlXUkVHMzIoQ1BfTUVfQ05UTCwgQ1BfTUVfSEFMVCB8IENQX1BGUF9IQUxUIHwgQ1BfQ0VfSEFMVCk7CisJLyogZG1hMCAqLworCXRtcCA9IFJSRUczMihETUFfUkJfQ05UTCArIERNQTBfUkVHSVNURVJfT0ZGU0VUKTsKKwl0bXAgJj0gfkRNQV9SQl9FTkFCTEU7CisJV1JFRzMyKERNQV9SQl9DTlRMICsgRE1BMF9SRUdJU1RFUl9PRkZTRVQsIHRtcCk7CisJLyogZG1hMSAqLworCXRtcCA9IFJSRUczMihETUFfUkJfQ05UTCArIERNQTFfUkVHSVNURVJfT0ZGU0VUKTsKKwl0bXAgJj0gfkRNQV9SQl9FTkFCTEU7CisJV1JFRzMyKERNQV9SQl9DTlRMICsgRE1BMV9SRUdJU1RFUl9PRkZTRVQsIHRtcCk7CisJLyogWFhYIG90aGVyIGVuZ2luZXM/ICovCisKKwkvKiBoYWx0IHRoZSBybGMsIGRpc2FibGUgY3AgaW50ZXJuYWwgaW50cyAqLworCXNpX3JsY19zdG9wKHJkZXYpOworCisJdWRlbGF5KDUwKTsKKworCS8qIGRpc2FibGUgbWVtIGFjY2VzcyAqLworCWV2ZXJncmVlbl9tY19zdG9wKHJkZXYsICZzYXZlKTsKKwlpZiAoZXZlcmdyZWVuX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBmb3IgTUMgaWRsZSB0aW1lZCBvdXQgIVxuIik7CisJfQorCisJLyogc2V0IG1jbGsvc2NsayB0byBieXBhc3MgKi8KKwlzaV9zZXRfY2xrX2J5cGFzc19tb2RlKHJkZXYpOworCS8qIHBvd2VyZG93biBzcGxsICovCisJc2lfc3BsbF9wb3dlcmRvd24ocmRldik7CisJLyogZGlzYWJsZSBCTSAqLworCXBjaV9jbGVhcl9tYXN0ZXIocmRldi0+cGRldik7CisJLyogcmVzZXQgKi8KKwlyYWRlb25fcGNpX2NvbmZpZ19yZXNldChyZGV2KTsKKwkvKiB3YWl0IGZvciBhc2ljIHRvIGNvbWUgb3V0IG9mIHJlc2V0ICovCisJZm9yIChpID0gMDsgaSA8IHJkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCWlmIChSUkVHMzIoQ09ORklHX01FTVNJWkUpICE9IDB4ZmZmZmZmZmYpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KK30KKwogaW50IHNpX2FzaWNfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHJlc2V0X21hc2s7CkBAIC0zNzMzLDEwICszODM5LDE3IEBACiAJaWYgKHJlc2V0X21hc2spCiAJCXI2MDBfc2V0X2Jpb3Nfc2NyYXRjaF9lbmdpbmVfaHVuZyhyZGV2LCB0cnVlKTsKIAorCS8qIHRyeSBzb2Z0IHJlc2V0ICovCiAJc2lfZ3B1X3NvZnRfcmVzZXQocmRldiwgcmVzZXRfbWFzayk7CiAKIAlyZXNldF9tYXNrID0gc2lfZ3B1X2NoZWNrX3NvZnRfcmVzZXQocmRldik7CiAKKwkvKiB0cnkgcGNpIGNvbmZpZyByZXNldCAqLworCWlmIChyZXNldF9tYXNrICYmIHJhZGVvbl9oYXJkX3Jlc2V0KQorCQlzaV9ncHVfcGNpX2NvbmZpZ19yZXNldChyZGV2KTsKKworCXJlc2V0X21hc2sgPSBzaV9ncHVfY2hlY2tfc29mdF9yZXNldChyZGV2KTsKKwogCWlmICghcmVzZXRfbWFzaykKIAkJcjYwMF9zZXRfYmlvc19zY3JhdGNoX2VuZ2luZV9odW5nKHJkZXYsIGZhbHNlKTsKIApAQCAtNTIxMiw4ICs1MzI1LDggQEAKIAkJV1JFRzMyKEhEUF9NRU1fUE9XRVJfTFMsIGRhdGEpOwogfQogCi12b2lkIHNpX3VwZGF0ZV9jZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJICB1MzIgYmxvY2ssIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgc2lfdXBkYXRlX2NnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJIHUzMiBibG9jaywgYm9vbCBlbmFibGUpCiB7CiAJaWYgKGJsb2NrICYgUkFERU9OX0NHX0JMT0NLX0dGWCkgewogCQlzaV9lbmFibGVfZ3VpX2lkbGVfaW50ZXJydXB0KHJkZXYsIGZhbHNlKTsKQEAgLTUzNzksNiArNTQ5Miw5IEBACiAJCXNpX2luaXRfYW9fY3VfbWFzayhyZGV2KTsKIAkJaWYgKHJkZXYtPnBnX2ZsYWdzICYgUkFERU9OX1BHX1NVUFBPUlRfR0ZYX1BHKSB7CiAJCQlzaV9pbml0X2dmeF9jZ3BnKHJkZXYpOworCQl9IGVsc2UgeworCQkJV1JFRzMyKFJMQ19TQVZFX0FORF9SRVNUT1JFX0JBU0UsIHJkZXYtPnJsYy5zYXZlX3Jlc3RvcmVfZ3B1X2FkZHIgPj4gOCk7CisJCQlXUkVHMzIoUkxDX0NMRUFSX1NUQVRFX1JFU1RPUkVfQkFTRSwgcmRldi0+cmxjLmNsZWFyX3N0YXRlX2dwdV9hZGRyID4+IDgpOwogCQl9CiAJCXNpX2VuYWJsZV9kbWFfcGcocmRldiwgdHJ1ZSk7CiAJCXNpX2VuYWJsZV9nZnhfY2dwZyhyZGV2LCB0cnVlKTsKQEAgLTU1NjYsNyArNTY4Miw3IEBACiAJfQogCiAJaWYgKCFBU0lDX0lTX05PRENFKHJkZXYpKSB7Ci0JCVdSRUczMihEQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOworCQlXUkVHMzIoREFDX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwogCiAJCXRtcCA9IFJSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MKSAmIERDX0hQRHhfSU5UX1BPTEFSSVRZOwogCQlXUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCwgdG1wKTsKQEAgLTYzMjQsMjEgKzY0NDAsMTQgQEAKIAogCXNpX21jX3Byb2dyYW0ocmRldik7CiAKLQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPmNlX2Z3IHx8Ci0JICAgICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7Ci0JCXIgPSBzaV9pbml0X21pY3JvY29kZShyZGV2KTsKKwlpZiAoIXJkZXYtPnBtLmRwbV9lbmFibGVkKSB7CisJCXIgPSBzaV9tY19sb2FkX21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKIAkJCXJldHVybiByOwogCQl9CiAJfQogCi0JciA9IHNpX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOwotCWlmIChyKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgTUMgZmlybXdhcmUhXG4iKTsKLQkJcmV0dXJuIHI7Ci0JfQotCiAJciA9IHNpX3BjaWVfZ2FydF9lbmFibGUocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtNjQyMSwzNyArNjUzMCwzMCBAQAogCiAJcmluZyA9ICZyZGV2LT5yaW5nW1JBREVPTl9SSU5HX1RZUEVfR0ZYX0lOREVYXTsKIAlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIFJBREVPTl9XQl9DUF9SUFRSX09GRlNFVCwKLQkJCSAgICAgQ1BfUkIwX1JQVFIsIENQX1JCMF9XUFRSLAogCQkJICAgICBSQURFT05fQ1BfUEFDS0VUMik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCiAJcmluZyA9ICZyZGV2LT5yaW5nW0NBWU1BTl9SSU5HX1RZUEVfQ1AxX0lOREVYXTsKIAlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIFJBREVPTl9XQl9DUDFfUlBUUl9PRkZTRVQsCi0JCQkgICAgIENQX1JCMV9SUFRSLCBDUF9SQjFfV1BUUiwKIAkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCXJpbmcgPSAmcmRldi0+cmluZ1tDQVlNQU5fUklOR19UWVBFX0NQMl9JTkRFWF07CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZy0+cmluZ19zaXplLCBSQURFT05fV0JfQ1AyX1JQVFJfT0ZGU0VULAotCQkJICAgICBDUF9SQjJfUlBUUiwgQ1BfUkIyX1dQVFIsCiAJCQkgICAgIFJBREVPTl9DUF9QQUNLRVQyKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKIAlyaW5nID0gJnJkZXYtPnJpbmdbUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYXTsKIAlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIFI2MDBfV0JfRE1BX1JQVFJfT0ZGU0VULAotCQkJICAgICBETUFfUkJfUlBUUiArIERNQTBfUkVHSVNURVJfT0ZGU0VULAotCQkJICAgICBETUFfUkJfV1BUUiArIERNQTBfUkVHSVNURVJfT0ZGU0VULAogCQkJICAgICBETUFfUEFDS0VUKERNQV9QQUNLRVRfTk9QLCAwLCAwLCAwLCAwKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCiAJcmluZyA9ICZyZGV2LT5yaW5nW0NBWU1BTl9SSU5HX1RZUEVfRE1BMV9JTkRFWF07CiAJciA9IHJhZGVvbl9yaW5nX2luaXQocmRldiwgcmluZywgcmluZy0+cmluZ19zaXplLCBDQVlNQU5fV0JfRE1BMV9SUFRSX09GRlNFVCwKLQkJCSAgICAgRE1BX1JCX1JQVFIgKyBETUExX1JFR0lTVEVSX09GRlNFVCwKLQkJCSAgICAgRE1BX1JCX1dQVFIgKyBETUExX1JFR0lTVEVSX09GRlNFVCwKIAkJCSAgICAgRE1BX1BBQ0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCwgMCwgMCkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTY0NzEsNyArNjU3Myw2IEBACiAJCXJpbmcgPSAmcmRldi0+cmluZ1tSNjAwX1JJTkdfVFlQRV9VVkRfSU5ERVhdOwogCQlpZiAocmluZy0+cmluZ19zaXplKSB7CiAJCQlyID0gcmFkZW9uX3JpbmdfaW5pdChyZGV2LCByaW5nLCByaW5nLT5yaW5nX3NpemUsIDAsCi0JCQkJCSAgICAgVVZEX1JCQ19SQl9SUFRSLCBVVkRfUkJDX1JCX1dQVFIsCiAJCQkJCSAgICAgUkFERU9OX0NQX1BBQ0tFVDIpOwogCQkJaWYgKCFyKQogCQkJCXIgPSB1dmRfdjFfMF9pbml0KHJkZXYpOwpAQCAtNjUxMyw2ICs2NjE0LDggQEAKIAkvKiBpbml0IGdvbGRlbiByZWdpc3RlcnMgKi8KIAlzaV9pbml0X2dvbGRlbl9yZWdpc3RlcnMocmRldik7CiAKKwlyYWRlb25fcG1fcmVzdW1lKHJkZXYpOworCiAJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHNpX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKQEAgLTY1MjcsNiArNjYzMCw3IEBACiAKIGludCBzaV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXJhZGVvbl9wbV9zdXNwZW5kKHJkZXYpOwogCWRjZTZfYXVkaW9fZmluaShyZGV2KTsKIAlyYWRlb25fdm1fbWFuYWdlcl9maW5pKHJkZXYpOwogCXNpX2NwX2VuYWJsZShyZGV2LCBmYWxzZSk7CkBAIC02NjAwLDYgKzY3MDQsMTggQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKKwlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPmNlX2Z3IHx8CisJICAgICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7CisJCXIgPSBzaV9pbml0X21pY3JvY29kZShyZGV2KTsKKwkJaWYgKHIpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCisJcmFkZW9uX3BtX2luaXQocmRldik7CisKIAlyaW5nID0gJnJkZXYtPnJpbmdbUkFERU9OX1JJTkdfVFlQRV9HRlhfSU5ERVhdOwogCXJpbmctPnJpbmdfb2JqID0gTlVMTDsKIAlyNjAwX3JpbmdfaW5pdChyZGV2LCByaW5nLCAxMDI0ICogMTAyNCk7CkBAIC02NjY2LDYgKzY3ODIsNyBAQAogCiB2b2lkIHNpX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcmFkZW9uX3BtX2ZpbmkocmRldik7CiAJc2lfY3BfZmluaShyZGV2KTsKIAljYXltYW5fZG1hX2ZpbmkocmRldik7CiAJc2lfZmluaV9wZyhyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RwbS5jCmluZGV4IDBiMDBjNzkuLjA0NzE1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kcG0uYwpAQCAtMTczOCw2ICsxNzM4LDggQEAKIHN0cnVjdCBuaV9wb3dlcl9pbmZvICpuaV9nZXRfcGkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogc3RydWN0IG5pX3BzICpuaV9nZXRfcHMoc3RydWN0IHJhZGVvbl9wcyAqcnBzKTsKIAorZXh0ZXJuIGludCBzaV9tY19sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKIHN0YXRpYyBpbnQgc2lfcG9wdWxhdGVfdm9sdGFnZV92YWx1ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdG9tX3ZvbHRhZ2VfdGFibGUgKnRhYmxlLAogCQkJCSAgICAgdTE2IHZhbHVlLCBTSVNMQU5EU19TTUNfVk9MVEFHRV9WQUxVRSAqdm9sdGFnZSk7CkBAIC0xNzUzLDkgKzE3NTUsNiBAQAogCQkJCSAgICB1MzIgZW5naW5lX2Nsb2NrLAogCQkJCSAgICBTSVNMQU5EU19TTUNfU0NMS19WQUxVRSAqc2Nsayk7CiAKLWV4dGVybiB2b2lkIHNpX3VwZGF0ZV9jZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSB1MzIgYmxvY2ssIGJvb2wgZW5hYmxlKTsKLQogc3RhdGljIHN0cnVjdCBzaV9wb3dlcl9pbmZvICpzaV9nZXRfcGkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAgICAgICAgIHN0cnVjdCBzaV9wb3dlcl9pbmZvICpwaSA9IHJkZXYtPnBtLmRwbS5wcml2OwpAQCAtMjM5Niw3ICsyMzk1LDcgQEAKIAlpZiAoU0lTTEFORFNfRFBNMl9TUV9SQU1QX1NUSV9TSVpFID4gKFNUSV9TSVpFX01BU0sgPj4gU1RJX1NJWkVfU0hJRlQpKQogCQllbmFibGVfc3FfcmFtcGluZyA9IGZhbHNlOwogCi0JaWYgKE5JU0xBTkRTX0RQTTJfU1FfUkFNUF9MVElfUkFUSU8gPD0gKExUSV9SQVRJT19NQVNLID4+IExUSV9SQVRJT19TSElGVCkpCisJaWYgKFNJU0xBTkRTX0RQTTJfU1FfUkFNUF9MVElfUkFUSU8gPD0gKExUSV9SQVRJT19NQVNLID4+IExUSV9SQVRJT19TSElGVCkpCiAJCWVuYWJsZV9zcV9yYW1waW5nID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50OyBpKyspIHsKQEAgLTM1OTEsMTAgKzM1OTAsOSBAQAogCiAJLyogU2V0dGluZyB0aGlzIHRvIGZhbHNlIGZvcmNlcyB0aGUgcGVyZm9ybWFuY2Ugc3RhdGUgdG8gbG93IGlmIHRoZSBjcnRjcyBhcmUgZGlzYWJsZWQuCiAJICogVGhpcyBjYW4gYmUgYSBwcm9ibGVtIG9uIFBvd2VyWHByZXNzIHN5c3RlbXMgb3IgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBjYXJkCi0JICogZm9yIG9mZnNjcmVlbiByZW5kZXJpbmcgb3IgY29tcHV0ZSBpZiB0aGVyZSBhcmUgbm8gY3J0Y3MgZW5hYmxlZC4gIFNldCBpdCB0bwotCSAqIHRydWUgZm9yIG5vdyBzbyB0aGF0IHBlcmZvcm1hbmNlIHNjYWxlcyBldmVuIGlmIHRoZSBkaXNwbGF5cyBhcmUgb2ZmLgorCSAqIGZvciBvZmZzY3JlZW4gcmVuZGVyaW5nIG9yIGNvbXB1dGUgaWYgdGhlcmUgYXJlIG5vIGNydGNzIGVuYWJsZWQuCiAJICovCi0Jc2lfbm90aWZ5X3NtY19kaXNwbGF5X2NoYW5nZShyZGV2LCB0cnVlIC8qcmRldi0+cG0uZHBtLm5ld19hY3RpdmVfY3J0Y19jb3VudCA+IDAqLyk7CisJc2lfbm90aWZ5X3NtY19kaXNwbGF5X2NoYW5nZShyZGV2LCByZGV2LT5wbS5kcG0ubmV3X2FjdGl2ZV9jcnRjX2NvdW50ID4gMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNpX2VuYWJsZV9zcHJlYWRfc3BlY3RydW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGJvb2wgZW5hYmxlKQpAQCAtNTQxNCw3ICs1NDEyLDcgQEAKIAogCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgc2lfcGktPm1jX3JlZ190YWJsZS5sYXN0OyBqKyspIHsKIAkJaWYgKHNpX3BpLT5tY19yZWdfdGFibGUudmFsaWRfZmxhZyAmICgxIDw8IGopKSB7Ci0JCQlpZiAoaSA+PSBTTUNfTklTTEFORFNfTUNfUkVHSVNURVJfQVJSQVlfU0laRSkKKwkJCWlmIChpID49IFNNQ19TSVNMQU5EU19NQ19SRUdJU1RFUl9BUlJBWV9TSVpFKQogCQkJCWJyZWFrOwogCQkJbWNfcmVnX3RhYmxlLT5hZGRyZXNzW2ldLnMwID0KIAkJCQljcHVfdG9fYmUxNihzaV9waS0+bWNfcmVnX3RhYmxlLm1jX3JlZ19hZGRyZXNzW2pdLnMwKTsKQEAgLTU3NTQsNiArNTc1MiwxMSBAQAogCiB2b2lkIHNpX2RwbV9zZXR1cF9hc2ljKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCByOworCisJciA9IHNpX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOworCWlmIChyKQorCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIE1DIGZpcm13YXJlIVxuIik7CiAJcnY3NzBfZ2V0X21lbW9yeV90eXBlKHJkZXYpOwogCXNpX3JlYWRfY2xvY2tfcmVnaXN0ZXJzKHJkZXYpOwogCXNpX2VuYWJsZV9hY3BpX3Bvd2VyX21hbmFnZW1lbnQocmRldik7CkBAIC01NzkxLDEzICs1Nzk0LDYgQEAKIAlzdHJ1Y3QgcmFkZW9uX3BzICpib290X3BzID0gcmRldi0+cG0uZHBtLmJvb3RfcHM7CiAJaW50IHJldDsKIAotCXNpX3VwZGF0ZV9jZyhyZGV2LCAoUkFERU9OX0NHX0JMT0NLX0dGWCB8Ci0JCQkgICAgUkFERU9OX0NHX0JMT0NLX01DIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfU0RNQSB8Ci0JCQkgICAgUkFERU9OX0NHX0JMT0NLX0JJRiB8Ci0JCQkgICAgUkFERU9OX0NHX0JMT0NLX1VWRCB8Ci0JCQkgICAgUkFERU9OX0NHX0JMT0NLX0hEUCksIGZhbHNlKTsKLQogCWlmIChzaV9pc19zbWNfcnVubmluZyhyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBpLT52b2x0YWdlX2NvbnRyb2wpCkBAIC01OTAwLDYgKzU4OTYsMTcgQEAKIAlzaV9lbmFibGVfc2Nsa19jb250cm9sKHJkZXYsIHRydWUpOwogCXNpX3N0YXJ0X2RwbShyZGV2KTsKIAorCXNpX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOworCisJbmlfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgYm9vdF9wcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNpX2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcmV0OworCiAJaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQgJiYKIAkgICAgcjYwMF9pc19pbnRlcm5hbF90aGVybWFsX3NlbnNvcihyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlKSkgewogCQlQUFNNQ19SZXN1bHQgcmVzdWx0OwpAQCAtNTkxNSwxNyArNTkyMiw2IEBACiAJCQlEUk1fREVCVUdfS01TKCJDb3VsZCBub3QgZW5hYmxlIHRoZXJtYWwgaW50ZXJydXB0cy5cbiIpOwogCX0KIAotCXNpX2VuYWJsZV9hdXRvX3Rocm90dGxlX3NvdXJjZShyZGV2LCBSQURFT05fRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwsIHRydWUpOwotCi0Jc2lfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19TRE1BIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfSERQKSwgdHJ1ZSk7Ci0KLQluaV91cGRhdGVfY3VycmVudF9wcyhyZGV2LCBib290X3BzKTsKLQogCXJldHVybiAwOwogfQogCkBAIC01OTM0LDEzICs1OTMwLDYgQEAKIAlzdHJ1Y3QgcnY3eHhfcG93ZXJfaW5mbyAqcGkgPSBydjc3MF9nZXRfcGkocmRldik7CiAJc3RydWN0IHJhZGVvbl9wcyAqYm9vdF9wcyA9IHJkZXYtPnBtLmRwbS5ib290X3BzOwogCi0Jc2lfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19TRE1BIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfSERQKSwgZmFsc2UpOwotCiAJaWYgKCFzaV9pc19zbWNfcnVubmluZyhyZGV2KSkKIAkJcmV0dXJuOwogCXNpX2Rpc2FibGVfdWx2KHJkZXYpOwpAQCAtNjAwNSwxMyArNTk5NCw2IEBACiAJc3RydWN0IHJhZGVvbl9wcyAqb2xkX3BzID0gJmVnX3BpLT5jdXJyZW50X3JwczsKIAlpbnQgcmV0OwogCi0Jc2lfdXBkYXRlX2NnKHJkZXYsIChSQURFT05fQ0dfQkxPQ0tfR0ZYIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfTUMgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19TRE1BIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfQklGIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfVVZEIHwKLQkJCSAgICBSQURFT05fQ0dfQkxPQ0tfSERQKSwgZmFsc2UpOwotCiAJcmV0ID0gc2lfZGlzYWJsZV91bHYocmRldik7CiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoInNpX2Rpc2FibGVfdWx2IGZhaWxlZFxuIik7CkBAIC02MTA0LDEzICs2MDg2LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlzaV91cGRhdGVfY2cocmRldiwgKFJBREVPTl9DR19CTE9DS19HRlggfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19NQyB8Ci0JCQkgICAgUkFERU9OX0NHX0JMT0NLX1NETUEgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19CSUYgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19VVkQgfAotCQkJICAgIFJBREVPTl9DR19CTE9DS19IRFApLCB0cnVlKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX3NtYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9zbWMuYwppbmRleCBkNDIyYTFjLi5lODBlZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX3NtYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfc21jLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJzaWQuaCIKICNpbmNsdWRlICJwcHNtYy5oIgogI2luY2x1ZGUgInJhZGVvbl91Y29kZS5oIgorI2luY2x1ZGUgInNpc2xhbmRzX3NtYy5oIgogCiBzdGF0aWMgaW50IHNpX3NldF9zbWNfc3JhbV9hZGRyZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJCSAgIHUzMiBzbWNfYWRkcmVzcywgdTMyIGxpbWl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaWQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lkLmgKaW5kZXggYjMyMmFjYy4uOTIzOWE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaWQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpZC5oCkBAIC05NCw2ICs5NCw4IEBACiAjZGVmaW5lCUNHX1NQTExfRlVOQ19DTlRMXzIJCQkJMHg2MDQKICNkZWZpbmUJCVNDTEtfTVVYX1NFTCh4KQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQlTQ0xLX01VWF9TRUxfTUFTSwkJCSgweDFmZiA8PCAwKQorI2RlZmluZQkJU1BMTF9DVExSRVFfQ0hHCQkJCSgxIDw8IDIzKQorI2RlZmluZQkJU0NMS19NVVhfVVBEQVRFCQkJCSgxIDw8IDI2KQogI2RlZmluZQlDR19TUExMX0ZVTkNfQ05UTF8zCQkJCTB4NjA4CiAjZGVmaW5lCQlTUExMX0ZCX0RJVih4KQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQlTUExMX0ZCX0RJVl9NQVNLCQkJKDB4M2ZmZmZmZiA8PCAwKQpAQCAtMTAxLDcgKzEwMywxMCBAQAogI2RlZmluZQkJU1BMTF9ESVRIRU4JCQkJKDEgPDwgMjgpCiAjZGVmaW5lCUNHX1NQTExfRlVOQ19DTlRMXzQJCQkJMHg2MGMKIAorI2RlZmluZQlTUExMX1NUQVRVUwkJCQkJMHg2MTQKKyNkZWZpbmUJCVNQTExfQ0hHX1NUQVRVUwkJCQkoMSA8PCAxKQogI2RlZmluZQlTUExMX0NOVExfTU9ERQkJCQkJMHg2MTgKKyNkZWZpbmUJCVNQTExfU1dfRElSX0NPTlRST0wJCQkoMSA8PCAwKQogIwlkZWZpbmUgU1BMTF9SRUZDTEtfU0VMKHgpCQkJKCh4KSA8PCA4KQogIwlkZWZpbmUgU1BMTF9SRUZDTEtfU0VMX01BU0sJCQkweEZGMDAKIApAQCAtNTU5LDYgKzU2NCw4IEBACiAjICAgICAgIGRlZmluZSBNUkRDSzBfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KQogIyAgICAgICBkZWZpbmUgTVJEQ0sxX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNSkKIAorI2RlZmluZQlNUExMX0NOVExfTU9ERQkJCQkJMHgyYmIwCisjICAgICAgIGRlZmluZSBNUExMX01DTEtfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQogI2RlZmluZQlNUExMX0ZVTkNfQ05UTAkJCQkJMHgyYmI0CiAjZGVmaW5lCQlCV0NUUkwoeCkJCQkJKCh4KSA8PCAyMCkKICNkZWZpbmUJCUJXQ1RSTF9NQVNLCQkJCSgweGZmIDw8IDIwKQpAQCAtODE1LDcgKzgyMiw3IEBACiAjICAgICAgIGRlZmluZSBHUlBIX1BGTElQX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBHUlBIX1BGTElQX0lOVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCiAKLSNkZWZpbmUJREFDQV9BVVRPREVURUNUX0lOVF9DT05UUk9MCQkJMHg2NmM4CisjZGVmaW5lCURBQ19BVVRPREVURUNUX0lOVF9DT05UUk9MCQkJMHg2N2M4CiAKICNkZWZpbmUgRENfSFBEMV9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDFjCiAjZGVmaW5lIERDX0hQRDJfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAyOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaXNsYW5kc19zbWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lzbGFuZHNfc21jLmgKaW5kZXggNTU3OGU5OC4uMTBlOTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaXNsYW5kc19zbWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3Npc2xhbmRzX3NtYy5oCkBAIC0zNzQsOCArMzc0LDYgQEAKIAogI3ByYWdtYSBwYWNrKHBvcCkKIAotaW50IHNpX3NldF9zbWNfc3JhbV9hZGRyZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICAgIHUzMiBzbWNfYWRkcmVzcywgdTMyIGxpbWl0KTsKIGludCBzaV9jb3B5X2J5dGVzX3RvX3NtYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCSB1MzIgc21jX3N0YXJ0X2FkZHJlc3MsCiAJCQkgY29uc3QgdTggKnNyYywgdTMyIGJ5dGVfY291bnQsIHUzMiBsaW1pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3N1bW9fZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3N1bW9fZHBtLmMKaW5kZXggOTZlYTZkYjguLmYxMjFlZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc3Vtb19kcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3N1bW9fZHBtLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAlTVU1PX0RUQ19ERkxUXzE0LAogfTsKIAotc3RydWN0IHN1bW9fcHMgKnN1bW9fZ2V0X3BzKHN0cnVjdCByYWRlb25fcHMgKnJwcykKK3N0YXRpYyBzdHJ1Y3Qgc3Vtb19wcyAqc3Vtb19nZXRfcHMoc3RydWN0IHJhZGVvbl9wcyAqcnBzKQogewogCXN0cnVjdCBzdW1vX3BzICpwcyA9IHJwcy0+cHNfcHJpdjsKIApAQCAtMTIwMiwxNCArMTIwMiwxMCBAQAogaW50IHN1bW9fZHBtX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3Qgc3Vtb19wb3dlcl9pbmZvICpwaSA9IHN1bW9fZ2V0X3BpKHJkZXYpOwotCWludCByZXQ7CiAKIAlpZiAoc3Vtb19kcG1fZW5hYmxlZChyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBzdW1vX2VuYWJsZV9jbG9ja19wb3dlcl9nYXRpbmcocmRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAlzdW1vX3Byb2dyYW1fYm9vdHVwX3N0YXRlKHJkZXYpOwogCXN1bW9faW5pdF9ic3AocmRldik7CiAJc3Vtb19yZXNldF9hbShyZGV2KTsKQEAgLTEyMzMsNiArMTIyOSwxOSBAQAogCWlmIChwaS0+ZW5hYmxlX2Jvb3N0KQogCQlzdW1vX2VuYWJsZV9ib29zdF90aW1lcihyZGV2KTsKIAorCXN1bW9fdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgcmRldi0+cG0uZHBtLmJvb3RfcHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzdW1vX2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3Vtb19lbmFibGVfY2xvY2tfcG93ZXJfZ2F0aW5nKHJkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAocmRldi0+aXJxLmluc3RhbGxlZCAmJgogCSAgICByNjAwX2lzX2ludGVybmFsX3RoZXJtYWxfc2Vuc29yKHJkZXYtPnBtLmludF90aGVybWFsX3R5cGUpKSB7CiAJCXJldCA9IHN1bW9fc2V0X3RoZXJtYWxfdGVtcGVyYXR1cmVfcmFuZ2UocmRldiwgUjYwMF9URU1QX1JBTkdFX01JTiwgUjYwMF9URU1QX1JBTkdFX01BWCk7CkBAIC0xMjQyLDggKzEyNTEsNiBAQAogCQlyYWRlb25faXJxX3NldChyZGV2KTsKIAl9CiAKLQlzdW1vX3VwZGF0ZV9jdXJyZW50X3BzKHJkZXYsIHJkZXYtPnBtLmRwbS5ib290X3BzKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3N1bW9fc21jLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3N1bW9fc21jLmMKaW5kZXggMThhYmJhNS4uZmIwODFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zdW1vX3NtYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc3Vtb19zbWMuYwpAQCAtMzEsNyArMzEsNiBAQAogI2RlZmluZSBTVU1PX1NNVV9TRVJWSUNFX1JPVVRJTkVfQUxUVkRETkJfTk9USUZZICAyNwogI2RlZmluZSBTVU1PX1NNVV9TRVJWSUNFX1JPVVRJTkVfR0ZYX1NSVl9JRF8yMCAgMjAKIAotc3RydWN0IHN1bW9fcHMgKnN1bW9fZ2V0X3BzKHN0cnVjdCByYWRlb25fcHMgKnJwcyk7CiBzdHJ1Y3Qgc3Vtb19wb3dlcl9pbmZvICpzdW1vX2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIHN0YXRpYyB2b2lkIHN1bW9fc2VuZF9tc2dfdG9fc211KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3RyaW5pdHlfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3RyaW5pdHlfZHBtLmMKaW5kZXggZDcwMDY5OC4uMmQ0NDcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi90cmluaXR5X2RwbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdHJpbml0eV9kcG0uYwpAQCAtMzQyLDE0ICszNDIsMTQgQEAKIAkJCQkJICAgICBzdHJ1Y3QgcmFkZW9uX3BzICpuZXdfcnBzLAogCQkJCQkgICAgIHN0cnVjdCByYWRlb25fcHMgKm9sZF9ycHMpOwogCi1zdHJ1Y3QgdHJpbml0eV9wcyAqdHJpbml0eV9nZXRfcHMoc3RydWN0IHJhZGVvbl9wcyAqcnBzKQorc3RhdGljIHN0cnVjdCB0cmluaXR5X3BzICp0cmluaXR5X2dldF9wcyhzdHJ1Y3QgcmFkZW9uX3BzICpycHMpCiB7CiAJc3RydWN0IHRyaW5pdHlfcHMgKnBzID0gcnBzLT5wc19wcml2OwogCiAJcmV0dXJuIHBzOwogfQogCi1zdHJ1Y3QgdHJpbml0eV9wb3dlcl9pbmZvICp0cmluaXR5X2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBzdHJ1Y3QgdHJpbml0eV9wb3dlcl9pbmZvICp0cmluaXR5X2dldF9waShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3QgdHJpbml0eV9wb3dlcl9pbmZvICpwaSA9IHJkZXYtPnBtLmRwbS5wcml2OwogCkBAIC0xMDgyLDcgKzEwODIsNiBAQAogaW50IHRyaW5pdHlfZHBtX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3QgdHJpbml0eV9wb3dlcl9pbmZvICpwaSA9IHRyaW5pdHlfZ2V0X3BpKHJkZXYpOwotCWludCByZXQ7CiAKIAl0cmluaXR5X2FjcXVpcmVfbXV0ZXgocmRldik7CiAKQEAgLTEwOTEsNyArMTA5MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXRyaW5pdHlfZW5hYmxlX2Nsb2NrX3Bvd2VyX2dhdGluZyhyZGV2KTsKIAl0cmluaXR5X3Byb2dyYW1fYm9vdHVwX3N0YXRlKHJkZXYpOwogCXN1bW9fcHJvZ3JhbV92YyhyZGV2LCAweDAwQzAwMDMzKTsKIAl0cmluaXR5X3N0YXJ0X2FtKHJkZXYpOwpAQCAtMTEwNSw2ICsxMTAzLDE4IEBACiAJdHJpbml0eV9kcG1fYmFwbV9lbmFibGUocmRldiwgZmFsc2UpOwogCXRyaW5pdHlfcmVsZWFzZV9tdXRleChyZGV2KTsKIAorCXRyaW5pdHlfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgcmRldi0+cG0uZHBtLmJvb3RfcHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmluaXR5X2RwbV9sYXRlX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcmV0OworCisJdHJpbml0eV9hY3F1aXJlX211dGV4KHJkZXYpOworCXRyaW5pdHlfZW5hYmxlX2Nsb2NrX3Bvd2VyX2dhdGluZyhyZGV2KTsKKwogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkICYmCiAJICAgIHI2MDBfaXNfaW50ZXJuYWxfdGhlcm1hbF9zZW5zb3IocmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSkpIHsKIAkJcmV0ID0gdHJpbml0eV9zZXRfdGhlcm1hbF90ZW1wZXJhdHVyZV9yYW5nZShyZGV2LCBSNjAwX1RFTVBfUkFOR0VfTUlOLCBSNjAwX1RFTVBfUkFOR0VfTUFYKTsKQEAgLTExMTUsOCArMTEyNSw3IEBACiAJCXJkZXYtPmlycS5kcG1fdGhlcm1hbCA9IHRydWU7CiAJCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwogCX0KLQotCXRyaW5pdHlfdXBkYXRlX2N1cnJlbnRfcHMocmRldiwgcmRldi0+cG0uZHBtLmJvb3RfcHMpOworCXRyaW5pdHlfcmVsZWFzZV9tdXRleChyZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi90cmluaXR5X3NtYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi90cmluaXR5X3NtYy5jCmluZGV4IDk2NzJiY2IuLjk5ZGQwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdHJpbml0eV9zbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3RyaW5pdHlfc21jLmMKQEAgLTI3LDkgKzI3LDYgQEAKICNpbmNsdWRlICJ0cmluaXR5X2RwbS5oIgogI2luY2x1ZGUgInBwc21jLmgiCiAKLXN0cnVjdCB0cmluaXR5X3BzICp0cmluaXR5X2dldF9wcyhzdHJ1Y3QgcmFkZW9uX3BzICpycHMpOwotc3RydWN0IHRyaW5pdHlfcG93ZXJfaW5mbyAqdHJpbml0eV9nZXRfcGkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCiBzdGF0aWMgaW50IHRyaW5pdHlfbm90aWZ5X21lc3NhZ2VfdG9fc211KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgaWQpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3V2ZF92Ml8yLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3V2ZF92Ml8yLmMKaW5kZXggYjE5ZWY0OS4uODI0NTUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi91dmRfdjJfMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdXZkX3YyXzIuYwpAQCAtMTUzLDYgKzE1Myw3IEBACiAJCWNoaXBfaWQgPSAweDAxMDAwMDE1OwogCQlicmVhazsKIAljYXNlIENISVBfUElUQ0FJUk46CisJY2FzZSBDSElQX09MQU5EOgogCQljaGlwX2lkID0gMHgwMTAwMDAxNjsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0FSVUJBOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYwppbmRleCBhOWQyNGU0Li5mYmY0YmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYwpAQCAtMzcxLDcgKzM3MSw2IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlyY3J0Yy0+cGxhbmUtPmZvcm1hdCA9IGZvcm1hdDsKLQlyY3J0Yy0+cGxhbmUtPnBpdGNoID0gY3J0Yy0+ZmItPnBpdGNoZXNbMF07CiAKIAlyY3J0Yy0+cGxhbmUtPnNyY194ID0geDsKIAlyY3J0Yy0+cGxhbmUtPnNyY195ID0geTsKQEAgLTQxMyw3ICs0MTIsNyBAQAogCXJjcnRjLT5wbGFuZS0+c3JjX3ggPSB4OwogCXJjcnRjLT5wbGFuZS0+c3JjX3kgPSB5OwogCi0JcmNhcl9kdV9jcnRjX3VwZGF0ZV9iYXNlKHRvX3JjYXJfY3J0YyhjcnRjKSk7CisJcmNhcl9kdV9jcnRjX3VwZGF0ZV9iYXNlKHJjcnRjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfZHJ2LmMKaW5kZXggMDAyM2Y5Ny4uNzkyZmQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2Rydi5jCkBAIC0yMjQsNyArMjI0LDkgQEAKIAogc3RhdGljIGludCByY2FyX2R1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWRybV9wbGF0Zm9ybV9leGl0KCZyY2FyX2R1X2RyaXZlciwgcGRldik7CisJc3RydWN0IHJjYXJfZHVfZGV2aWNlICpyY2R1ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkcm1fcHV0X2RldihyY2R1LT5kZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ5LDggKzI1MSw4IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJjYXJfZHVfZGV2aWNlX2luZm8gcmNhcl9kdV9yOGE3NzkwX2luZm8gPSB7Ci0JLmZlYXR1cmVzID0gUkNBUl9EVV9GRUFUVVJFX0NSVENfSVJRX0NMT0NLIHwgUkNBUl9EVV9GRUFUVVJFX0FMSUdOXzEyOEIKLQkJICB8IFJDQVJfRFVfRkVBVFVSRV9ERUZSOCwKKwkuZmVhdHVyZXMgPSBSQ0FSX0RVX0ZFQVRVUkVfQ1JUQ19JUlFfQ0xPQ0sgfCBSQ0FSX0RVX0ZFQVRVUkVfREVGUjgsCisJLnF1aXJrcyA9IFJDQVJfRFVfUVVJUktfQUxJR05fMTI4QiB8IFJDQVJfRFVfUVVJUktfTFZEU19MQU5FUywKIAkubnVtX2NydGNzID0gMywKIAkucm91dGVzID0gewogCQkvKiBSOEE3NzkwIGhhcyBvbmUgUkdCIG91dHB1dCwgdHdvIExWRFMgb3V0cHV0cyBhbmQgb25lCkBAIC0yNzIsOSArMjc0LDI5IEBACiAJLm51bV9sdmRzID0gMiwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmNhcl9kdV9kZXZpY2VfaW5mbyByY2FyX2R1X3I4YTc3OTFfaW5mbyA9IHsKKwkuZmVhdHVyZXMgPSBSQ0FSX0RVX0ZFQVRVUkVfQ1JUQ19JUlFfQ0xPQ0sgfCBSQ0FSX0RVX0ZFQVRVUkVfREVGUjgsCisJLm51bV9jcnRjcyA9IDIsCisJLnJvdXRlcyA9IHsKKwkJLyogUjhBNzc5MSBoYXMgb25lIFJHQiBvdXRwdXQsIG9uZSBMVkRTIG91dHB1dCBhbmQgb25lCisJCSAqIChjdXJyZW50bHkgdW5zdXBwb3J0ZWQpIFRDT04gb3V0cHV0LgorCQkgKi8KKwkJW1JDQVJfRFVfT1VUUFVUX0RQQUQwXSA9IHsKKwkJCS5wb3NzaWJsZV9jcnRjcyA9IEJJVCgxKSwKKwkJCS5lbmNvZGVyX3R5cGUgPSBEUk1fTU9ERV9FTkNPREVSX05PTkUsCisJCX0sCisJCVtSQ0FSX0RVX09VVFBVVF9MVkRTMF0gPSB7CisJCQkucG9zc2libGVfY3J0Y3MgPSBCSVQoMCksCisJCQkuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTLAorCQl9LAorCX0sCisJLm51bV9sdmRzID0gMSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHJjYXJfZHVfaWRfdGFibGVbXSA9IHsKIAl7ICJyY2FyLWR1LXI4YTc3NzkiLCAoa2VybmVsX3Vsb25nX3QpJnJjYXJfZHVfcjhhNzc3OV9pbmZvIH0sCiAJeyAicmNhci1kdS1yOGE3NzkwIiwgKGtlcm5lbF91bG9uZ190KSZyY2FyX2R1X3I4YTc3OTBfaW5mbyB9LAorCXsgInJjYXItZHUtcjhhNzc5MSIsIChrZXJuZWxfdWxvbmdfdCkmcmNhcl9kdV9yOGE3NzkxX2luZm8gfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2Rydi5oCmluZGV4IDY1ZDJkNjMuLmUzMWI3MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9kcnYuaApAQCAtMjgsOCArMjgsMTAgQEAKIHN0cnVjdCByY2FyX2R1X2x2ZHNlbmM7CiAKICNkZWZpbmUgUkNBUl9EVV9GRUFUVVJFX0NSVENfSVJRX0NMT0NLCSgxIDw8IDApCS8qIFBlci1DUlRDIElSUSBhbmQgY2xvY2sgKi8KLSNkZWZpbmUgUkNBUl9EVV9GRUFUVVJFX0FMSUdOXzEyOEIJKDEgPDwgMSkJLyogQWxpZ24gcGl0Y2hlcyB0byAxMjggYnl0ZXMgKi8KLSNkZWZpbmUgUkNBUl9EVV9GRUFUVVJFX0RFRlI4CQkoMSA8PCAyKQkvKiBIYXMgREVGUjggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNBUl9EVV9GRUFUVVJFX0RFRlI4CQkoMSA8PCAxKQkvKiBIYXMgREVGUjggcmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQ0FSX0RVX1FVSVJLX0FMSUdOXzEyOEIJKDEgPDwgMCkJLyogQWxpZ24gcGl0Y2hlcyB0byAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgUkNBUl9EVV9RVUlSS19MVkRTX0xBTkVTCSgxIDw8IDEpCS8qIExWRFMgbGFuZXMgMSBhbmQgMyBpbnZlcnRlZCAqLwogCiAvKgogICogc3RydWN0IHJjYXJfZHVfb3V0cHV0X3JvdXRpbmcgLSBPdXRwdXQgcm91dGluZyBzcGVjaWZpY2F0aW9uCkBAIC00OCwxMiArNTAsMTQgQEAKIC8qCiAgKiBzdHJ1Y3QgcmNhcl9kdV9kZXZpY2VfaW5mbyAtIERVIG1vZGVsLXNwZWNpZmljIGluZm9ybWF0aW9uCiAgKiBAZmVhdHVyZXM6IGRldmljZSBmZWF0dXJlcyAoUkNBUl9EVV9GRUFUVVJFXyopCisgKiBAcXVpcmtzOiBkZXZpY2UgcXVpcmtzIChSQ0FSX0RVX1FVSVJLXyopCiAgKiBAbnVtX2NydGNzOiB0b3RhbCBudW1iZXIgb2YgQ1JUQ3MKICAqIEByb3V0ZXM6IGFycmF5IG9mIENSVEMgdG8gb3V0cHV0IHJvdXRlcywgaW5kZXhlZCBieSBvdXRwdXQgKFJDQVJfRFVfT1VUUFVUXyopCiAgKiBAbnVtX2x2ZHM6IG51bWJlciBvZiBpbnRlcm5hbCBMVkRTIGVuY29kZXJzCiAgKi8KIHN0cnVjdCByY2FyX2R1X2RldmljZV9pbmZvIHsKIAl1bnNpZ25lZCBpbnQgZmVhdHVyZXM7CisJdW5zaWduZWQgaW50IHF1aXJrczsKIAl1bnNpZ25lZCBpbnQgbnVtX2NydGNzOwogCXN0cnVjdCByY2FyX2R1X291dHB1dF9yb3V0aW5nIHJvdXRlc1tSQ0FSX0RVX09VVFBVVF9NQVhdOwogCXVuc2lnbmVkIGludCBudW1fbHZkczsKQEAgLTg0LDYgKzg4LDEyIEBACiAJcmV0dXJuIHJjZHUtPmluZm8tPmZlYXR1cmVzICYgZmVhdHVyZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHJjYXJfZHVfbmVlZHMoc3RydWN0IHJjYXJfZHVfZGV2aWNlICpyY2R1LAorCQkJCSB1bnNpZ25lZCBpbnQgcXVpcmspCit7CisJcmV0dXJuIHJjZHUtPmluZm8tPnF1aXJrcyAmIHF1aXJrOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiByY2FyX2R1X3JlYWQoc3RydWN0IHJjYXJfZHVfZGV2aWNlICpyY2R1LCB1MzIgcmVnKQogewogCXJldHVybiBpb3JlYWQzMihyY2R1LT5tbWlvICsgcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2ttcy5jCmluZGV4IGIzMWFjMDguLmZiZWFiZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9rbXMuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJLyogVGhlIFI4QTc3NzkgRFUgcmVxdWlyZXMgYSAxNiBwaXhlbHMgcGl0Y2ggYWxpZ25tZW50IGFzIGRvY3VtZW50ZWQsCiAJICogYnV0IHRoZSBSOEE3NzkwIERVIHNlZW1zIHRvIHJlcXVpcmUgYSAxMjggYnl0ZXMgcGl0Y2ggYWxpZ25tZW50LgogCSAqLwotCWlmIChyY2FyX2R1X2hhcyhyY2R1LCBSQ0FSX0RVX0ZFQVRVUkVfQUxJR05fMTI4QikpCisJaWYgKHJjYXJfZHVfbmVlZHMocmNkdSwgUkNBUl9EVV9RVUlSS19BTElHTl8xMjhCKSkKIAkJYWxpZ24gPSAxMjg7CiAJZWxzZQogCQlhbGlnbiA9IDE2ICogYXJncy0+YnBwIC8gODsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQlpZiAocmNhcl9kdV9oYXMocmNkdSwgUkNBUl9EVV9GRUFUVVJFX0FMSUdOXzEyOEIpKQorCWlmIChyY2FyX2R1X25lZWRzKHJjZHUsIFJDQVJfRFVfUVVJUktfQUxJR05fMTI4QikpCiAJCWFsaWduID0gMTI4OwogCWVsc2UKIAkJYWxpZ24gPSAxNiAqIGZvcm1hdC0+YnBwIC8gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfbHZkc2VuYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9sdmRzZW5jLmMKaW5kZXggYTBmNmExNy4uZGYzMGEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9sdmRzZW5jLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9sdmRzZW5jLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZyY3J0Yy0+Y3J0Yy5tb2RlOwogCXVuc2lnbmVkIGludCBmcmVxID0gbW9kZS0+Y2xvY2s7CiAJdTMyIGx2ZGNyMDsKKwl1MzIgbHZkaGNyOwogCXUzMiBwbGxjcjsKIAlpbnQgcmV0OwogCkBAIC03MiwxNSArNzMsMTkgQEAKIAkgKiBWU1lOQyAtPiBDVFJMMQogCSAqIERJU1AgIC0+IENUUkwyCiAJICogMCAgICAgLT4gQ1RSTDMKLQkgKgotCSAqIENoYW5uZWxzIDEgYW5kIDMgYXJlIHN3aXRjaGVkIG9uIEVTMS4KIAkgKi8KIAlyY2FyX2x2ZHNfd3JpdGUobHZkcywgTFZEQ1RSQ1IsIExWRENUUkNSX0NUUjNTRUxfWkVSTyB8CiAJCQlMVkRDVFJDUl9DVFIyU0VMX0RJU1AgfCBMVkRDVFJDUl9DVFIxU0VMX1ZTWU5DIHwKIAkJCUxWRENUUkNSX0NUUjBTRUxfSFNZTkMpOwotCXJjYXJfbHZkc193cml0ZShsdmRzLCBMVkRDSENSLAotCQkJTFZEQ0hDUl9DSFNFTF9DSCgwLCAwKSB8IExWRENIQ1JfQ0hTRUxfQ0goMSwgMykgfAotCQkJTFZEQ0hDUl9DSFNFTF9DSCgyLCAyKSB8IExWRENIQ1JfQ0hTRUxfQ0goMywgMSkpOworCisJaWYgKHJjYXJfZHVfbmVlZHMobHZkcy0+ZGV2LCBSQ0FSX0RVX1FVSVJLX0xWRFNfTEFORVMpKQorCQlsdmRoY3IgPSBMVkRDSENSX0NIU0VMX0NIKDAsIDApIHwgTFZEQ0hDUl9DSFNFTF9DSCgxLCAzKQorCQkgICAgICAgfCBMVkRDSENSX0NIU0VMX0NIKDIsIDIpIHwgTFZEQ0hDUl9DSFNFTF9DSCgzLCAxKTsKKwllbHNlCisJCWx2ZGhjciA9IExWRENIQ1JfQ0hTRUxfQ0goMCwgMCkgfCBMVkRDSENSX0NIU0VMX0NIKDEsIDEpCisJCSAgICAgICB8IExWRENIQ1JfQ0hTRUxfQ0goMiwgMikgfCBMVkRDSENSX0NIU0VMX0NIKDMsIDMpOworCisJcmNhcl9sdmRzX3dyaXRlKGx2ZHMsIExWRENIQ1IsIGx2ZGhjcik7CiAKIAkvKiBTZWxlY3QgdGhlIGlucHV0LCBoYXJkY29kZSBtb2RlIDAsIGVuYWJsZSBMVkRTIG9wZXJhdGlvbiBhbmQgdHVybgogCSAqIGJpYXMgY2lyY3VpdHJ5IG9uLgpAQCAtMTQ0LDE4ICsxNDksOSBAQAogCXNwcmludGYobmFtZSwgImx2ZHMuJXUiLCBsdmRzLT5pbmRleCk7CiAKIAltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKLQlpZiAobWVtID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVzb3VyY2UgZm9yICVzXG4iLAotCQkJbmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWx2ZHMtPm1taW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKLQlpZiAobHZkcy0+bW1pbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBtZW1vcnkgcmVzb3VyY2UgZm9yICVzXG4iLAotCQkJbmFtZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoSVNfRVJSKGx2ZHMtPm1taW8pKQorCQlyZXR1cm4gUFRSX0VSUihsdmRzLT5tbWlvKTsKIAogCWx2ZHMtPmNsb2NrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIG5hbWUpOwogCWlmIChJU19FUlIobHZkcy0+Y2xvY2spKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X3BsYW5lLmMKaW5kZXggNTMwMDA2NC4uM2ZiNjlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9wbGFuZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfcGxhbmUuYwpAQCAtMTA0LDYgKzEwNCwxNSBAQAogewogCXN0cnVjdCByY2FyX2R1X2dyb3VwICpyZ3JwID0gcGxhbmUtPmdyb3VwOwogCXVuc2lnbmVkIGludCBpbmRleCA9IHBsYW5lLT5od2luZGV4OworCXUzMiBtd3I7CisKKwkvKiBNZW1vcnkgcGl0Y2ggKGV4cHJlc3NlZCBpbiBwaXhlbHMpICovCisJaWYgKHBsYW5lLT5mb3JtYXQtPnBsYW5lcyA9PSAyKQorCQltd3IgPSBwbGFuZS0+cGl0Y2g7CisJZWxzZQorCQltd3IgPSBwbGFuZS0+cGl0Y2ggKiA4IC8gcGxhbmUtPmZvcm1hdC0+YnBwOworCisJcmNhcl9kdV9wbGFuZV93cml0ZShyZ3JwLCBpbmRleCwgUG5NV1IsIG13cik7CiAKIAkvKiBUaGUgWSBwb3NpdGlvbiBpcyBleHByZXNzZWQgaW4gcmFzdGVyIGxpbmUgdW5pdHMgYW5kIG11c3QgYmUgZG91YmxlZAogCSAqIGZvciAzMmJwcCBmb3JtYXRzLCBhY2NvcmRpbmcgdG8gdGhlIFI4QTc3OTAgZGF0YXNoZWV0LiBObyBtZW50aW9uIG9mCkBAIC0xMzMsNiArMTQyLDggQEAKIHsKIAlzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICpnZW07CiAKKwlwbGFuZS0+cGl0Y2ggPSBmYi0+cGl0Y2hlc1swXTsKKwogCWdlbSA9IGRybV9mYl9jbWFfZ2V0X2dlbV9vYmooZmIsIDApOwogCXBsYW5lLT5kbWFbMF0gPSBnZW0tPnBhZGRyICsgZmItPm9mZnNldHNbMF07CiAKQEAgLTIwOSw3ICsyMjAsNiBAQAogCXN0cnVjdCByY2FyX2R1X2dyb3VwICpyZ3JwID0gcGxhbmUtPmdyb3VwOwogCXUzMiBkZGNyMiA9IFBuRERDUjJfQ09ERTsKIAl1MzIgZGRjcjQ7Ci0JdTMyIG13cjsKIAogCS8qIERhdGEgZm9ybWF0CiAJICoKQEAgLTI0MCwxNCArMjUwLDYgQEAKIAlyY2FyX2R1X3BsYW5lX3dyaXRlKHJncnAsIGluZGV4LCBQbkREQ1IyLCBkZGNyMik7CiAJcmNhcl9kdV9wbGFuZV93cml0ZShyZ3JwLCBpbmRleCwgUG5ERENSNCwgZGRjcjQpOwogCi0JLyogTWVtb3J5IHBpdGNoIChleHByZXNzZWQgaW4gcGl4ZWxzKSAqLwotCWlmIChwbGFuZS0+Zm9ybWF0LT5wbGFuZXMgPT0gMikKLQkJbXdyID0gcGxhbmUtPnBpdGNoOwotCWVsc2UKLQkJbXdyID0gcGxhbmUtPnBpdGNoICogOCAvIHBsYW5lLT5mb3JtYXQtPmJwcDsKLQotCXJjYXJfZHVfcGxhbmVfd3JpdGUocmdycCwgaW5kZXgsIFBuTVdSLCBtd3IpOwotCiAJLyogRGVzdGluYXRpb24gcG9zaXRpb24gYW5kIHNpemUgKi8KIAlyY2FyX2R1X3BsYW5lX3dyaXRlKHJncnAsIGluZGV4LCBQbkRTWFIsIHBsYW5lLT53aWR0aCk7CiAJcmNhcl9kdV9wbGFuZV93cml0ZShyZ3JwLCBpbmRleCwgUG5EU1lSLCBwbGFuZS0+aGVpZ2h0KTsKQEAgLTMwOSw3ICszMTEsNiBAQAogCiAJcnBsYW5lLT5jcnRjID0gY3J0YzsKIAlycGxhbmUtPmZvcm1hdCA9IGZvcm1hdDsKLQlycGxhbmUtPnBpdGNoID0gZmItPnBpdGNoZXNbMF07CiAKIAlycGxhbmUtPnNyY194ID0gc3JjX3ggPj4gMTY7CiAJcnBsYW5lLT5zcmNfeSA9IHNyY195ID4+IDE2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYwppbmRleCBiMTdkMDcxLi5kMmIyZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYwpAQCAtNDksNyArNDksNyBAQAogI2VuZGlmCiAKIAlmb3IgKGkgPSAwOyBpIDwgU0FWQUdFX0RFRkFVTFRfVVNFQ19USU1FT1VUOyBpKyspIHsKLQkJRFJNX01FTU9SWUJBUlJJRVIoKTsKKwkJbWIoKTsKIAkJc3RhdHVzID0gZGV2X3ByaXYtPnN0YXR1c19wdHJbMF07CiAJCWlmICgoc3RhdHVzICYgbWFzaykgPCB0aHJlc2hvbGQpCiAJCQlyZXR1cm4gMDsKQEAgLTEyMyw3ICsxMjMsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IFNBVkFHRV9FVkVOVF9VU0VDX1RJTUVPVVQ7IGkrKykgewotCQlEUk1fTUVNT1JZQkFSUklFUigpOworCQltYigpOwogCQlzdGF0dXMgPSBkZXZfcHJpdi0+c3RhdHVzX3B0clsxXTsKIAkJaWYgKCgoKHN0YXR1cyAmIDB4ZmZmZikgLSBlKSAmIDB4ZmZmZikgPD0gMHg3ZmZmIHx8CiAJCSAgICAoc3RhdHVzICYgMHhmZmZmKSA9PSAwKQpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJCX0KIAl9CiAKLQlEUk1fTUVNT1JZQkFSUklFUigpOworCW1iKCk7CiAKIAkvKiBkbyBmbHVzaCAuLi4gKi8KIAlwaHlzX2FkZHIgPSBkZXZfcHJpdi0+Y21kX2RtYS0+b2Zmc2V0ICsKQEAgLTk5MCwxMCArOTkwLDEwIEBACiAKIAkJYnVmLT5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CiAKLQkJaWYgKERSTV9DT1BZX1RPX1VTRVIoJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLAogCQkJCSAgICAgJmJ1Zi0+aWR4LCBzaXplb2YoYnVmLT5pZHgpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoRFJNX0NPUFlfVE9fVVNFUigmZC0+cmVxdWVzdF9zaXplc1tpXSwKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9zaXplc1tpXSwKIAkJCQkgICAgICZidWYtPnRvdGFsLCBzaXplb2YoYnVmLT50b3RhbCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9zdGF0ZS5jCmluZGV4IGIzNWU3NWUuLmMwMWFkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2Vfc3RhdGUuYwpAQCAtOTkyLDcgKzk5Miw3IEBACiAJCWlmIChrY21kX2FkZHIgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2NtZF9hZGRyLCBjbWRidWYtPmNtZF9hZGRyLAorCQlpZiAoY29weV9mcm9tX3VzZXIoa2NtZF9hZGRyLCBjbWRidWYtPmNtZF9hZGRyLAogCQkJCSAgICAgICBjbWRidWYtPnNpemUgKiA4KSkKIAkJewogCQkJa2ZyZWUoa2NtZF9hZGRyKTsKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAotCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGt2Yl9hZGRyLCBjbWRidWYtPnZiX2FkZHIsCisJCWlmIChjb3B5X2Zyb21fdXNlcihrdmJfYWRkciwgY21kYnVmLT52Yl9hZGRyLAogCQkJCSAgICAgICBjbWRidWYtPnZiX3NpemUpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBkb25lOwpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2JveF9hZGRyLCBjbWRidWYtPmJveF9hZGRyLAorCQlpZiAoY29weV9mcm9tX3VzZXIoa2JveF9hZGRyLCBjbWRidWYtPmJveF9hZGRyLAogCQkJCSAgICAgICBjbWRidWYtPm5ib3ggKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gZG9uZTsKQEAgLTEwMzIsNyArMTAzMiw3IEBACiAKIAkvKiBNYWtlIHN1cmUgd3JpdGVzIHRvIERNQSBidWZmZXJzIGFyZSBmaW5pc2hlZCBiZWZvcmUgc2VuZGluZwogCSAqIERNQSBjb21tYW5kcyB0byB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUuICovCi0JRFJNX01FTU9SWUJBUlJJRVIoKTsKKwltYigpOwogCiAJLyogQ29taW5nIGZyb20gdXNlciBzcGFjZS4gRG9uJ3Qga25vdyBpZiB0aGUgWHNlcnZlciBoYXMKIAkgKiBlbWl0dGVkIHdhaXQgY29tbWFuZHMuIEFzc3VtaW5nIHRoZSB3b3JzdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9jcnRjLmMKaW5kZXggNTYyZjlhNC4uMDQyODA3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9jcnRjLmMKQEAgLTM3LDE0ICszNywyMSBAQAogICogQ2xvY2sgbWFuYWdlbWVudAogICovCiAKLXN0YXRpYyB2b2lkIHNobW9iX2RybV9jbGtfb24oc3RydWN0IHNobW9iX2RybV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IHNobW9iX2RybV9jbGtfb24oc3RydWN0IHNobW9iX2RybV9kZXZpY2UgKnNkZXYpCiB7Ci0JaWYgKHNkZXYtPmNsb2NrKQotCQljbGtfcHJlcGFyZV9lbmFibGUoc2Rldi0+Y2xvY2spOworCWludCByZXQ7CisKKwlpZiAoc2Rldi0+Y2xvY2spIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNkZXYtPmNsb2NrKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KICNpZiAwCiAJaWYgKHNkZXYtPm1lcmFtX2RldiAmJiBzZGV2LT5tZXJhbV9kZXYtPnBkZXYpCiAJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNkZXYtPm1lcmFtX2Rldi0+cGRldi0+ZGV2KTsKICNlbmRpZgorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNobW9iX2RybV9jbGtfb2ZmKHN0cnVjdCBzaG1vYl9kcm1fZGV2aWNlICpzZGV2KQpAQCAtMTYxLDYgKzE2OCw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHNkZXYtPmRkZXY7CiAJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CiAJdTMyIHZhbHVlOworCWludCByZXQ7CiAKIAlpZiAoc2NydGMtPnN0YXJ0ZWQpCiAJCXJldHVybjsKQEAgLTE3MCw3ICsxNzgsOSBAQAogCQlyZXR1cm47CiAKIAkvKiBFbmFibGUgY2xvY2tzIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGhhcmR3YXJlLiAqLwotCXNobW9iX2RybV9jbGtfb24oc2Rldik7CisJcmV0ID0gc2htb2JfZHJtX2Nsa19vbihzZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOwogCiAJLyogUmVzZXQgYW5kIGVuYWJsZSB0aGUgTENEQy4gKi8KIAlsY2RjX3dyaXRlKHNkZXYsIExEQ05UMlIsIGxjZGNfcmVhZChzZGV2LCBMRENOVDJSKSB8IExEQ05UMlJfQlIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fZHJ2LmMKaW5kZXggMDE1NTUxOC4uYzgzOWM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vc2htb2JpbGUvc2htb2JfZHJtX2Rydi5jCkBAIC0zMzYsNyArMzM2LDkgQEAKIAogc3RhdGljIGludCBzaG1vYl9kcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JZHJtX3BsYXRmb3JtX2V4aXQoJnNobW9iX2RybV9kcml2ZXIsIHBkZXYpOworCXN0cnVjdCBzaG1vYl9kcm1fZGV2aWNlICpzZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkcm1fcHV0X2RldihzZGV2LT5kZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19kcnYuYwppbmRleCA0MzgzYjc0Li43NTZmNzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19kcnYuYwpAQCAtOTQsNyArOTQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHNpc19kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3N0YXRpYyB2b2lkIHNpc19kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2lzX2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19tbS5jCmluZGV4IDAxODU3ZDguLjA1NzNiZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfbW0uYwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJICogYmVjYXVzZSBpdHMgcG9sbGluZyBmcmVxdWVuY3kgaXMgdG9vIGxvdy4KIAkgKi8KIAotCWVuZCA9IGppZmZpZXMgKyAoRFJNX0haICogMyk7CisJZW5kID0gamlmZmllcyArIChIWiAqIDMpOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogCQlkbyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9LY29uZmlnCmluZGV4IDhkYjliM2IuLjM1NGRkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9LY29uZmlnCkBAIC0xLDE0ICsxLDEyIEBACiBjb25maWcgRFJNX1RFR1JBCi0JYm9vbCAiTlZJRElBIFRlZ3JhIERSTSIKLQlkZXBlbmRzIG9uIEFSQ0hfVEVHUkEgfHwgQVJDSF9NVUxUSVBMQVRGT1JNCisJdHJpc3RhdGUgIk5WSURJQSBUZWdyYSBEUk0iCisJZGVwZW5kcyBvbiBBUkNIX1RFR1JBIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQogCWRlcGVuZHMgb24gRFJNCiAJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCi0Jc2VsZWN0IFRFR1JBX0hPU1QxWAogCXNlbGVjdCBEUk1fS01TX0hFTFBFUgotCXNlbGVjdCBEUk1fS01TX0ZCX0hFTFBFUgotCXNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKLQlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCi0Jc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKKwlzZWxlY3QgRFJNX01JUElfRFNJCisJc2VsZWN0IERSTV9QQU5FTAorCXNlbGVjdCBURUdSQV9IT1NUMVgKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gTlZJRElBIFRlZ3JhIFNvQy4KIApAQCAtMTcsNiArMTUsMTggQEAKIAogaWYgRFJNX1RFR1JBCiAKK2NvbmZpZyBEUk1fVEVHUkFfRkJERVYKKwlib29sICJFbmFibGUgbGVnYWN5IGZiZGV2IHN1cHBvcnQiCisJc2VsZWN0IERSTV9LTVNfRkJfSEVMUEVSCisJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAorCXNlbGVjdCBGQl9TWVNfQ09QWUFSRUEKKwlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIG5lZWQgZm9yIHRoZSBsZWdhY3kgZmJkZXYgc3VwcG9ydC4KKwkgIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgYWxzbyBwcm92aWRlcyB0aGUgTGludXggY29uc29sZSBvbiB0b3Agb2YKKwkgIHRoZSBUZWdyYSBtb2Rlc2V0dGluZyBkcml2ZXIuCisKIGNvbmZpZyBEUk1fVEVHUkFfREVCVUcKIAlib29sICJOVklESUEgVGVncmEgRFJNIGRlYnVnIHN1cHBvcnQiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL01ha2VmaWxlCmluZGV4IGVkYzc2YWIuLjhkMjIwYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvTWFrZWZpbGUKQEAgLTksNiArOSw4IEBACiAJb3V0cHV0Lm8gXAogCXJnYi5vIFwKIAloZG1pLm8gXAorCW1pcGktcGh5Lm8gXAorCWRzaS5vIFwKIAlncjJkLm8gXAogCWdyM2QubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvYnVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvYnVzLmMKaW5kZXggNTY1ZjhmNy4uZTM4ZTU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2J1cy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9idXMuYwpAQCAtNDYsNyArNDYsNiBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07CiAJaW50IHJldDsKIAotCUlOSVRfTElTVF9IRUFEKCZkcml2ZXItPmRldmljZV9saXN0KTsKIAlkcml2ZXItPmJ1cyA9ICZkcm1faG9zdDF4X2J1czsKIAogCWRybSA9IGRybV9kZXZfYWxsb2MoZHJpdmVyLCAmZGV2aWNlLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZGMuYwppbmRleCBjZDdmMWU0Li45MzM2MDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZGMuYwpAQCAtMTUsNiArMTUsMTAgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJnZW0uaCIKIAorc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHsKKwlib29sIHN1cHBvcnRzX2ludGVybGFjaW5nOworfTsKKwogc3RydWN0IHRlZ3JhX3BsYW5lIHsKIAlzdHJ1Y3QgZHJtX3BsYW5lIGJhc2U7CiAJdW5zaWduZWQgaW50IGluZGV4OwpAQCAtNjU4LDE5ICs2NjIsMTIgQEAKIAkvKiBwcm9ncmFtIGRpc3BsYXkgbW9kZSAqLwogCXRlZ3JhX2RjX3NldF90aW1pbmdzKGRjLCBtb2RlKTsKIAotCXZhbHVlID0gREVfU0VMRUNUX0FDVElWRSB8IERFX0NPTlRST0xfTk9STUFMOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfREFUQV9FTkFCTEVfT1BUSU9OUyk7Ci0KLQl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19DT01fUElOX09VVFBVVF9QT0xBUklUWSgxKSk7Ci0JdmFsdWUgJj0gfkxWU19PVVRQVVRfUE9MQVJJVFlfTE9XOwotCXZhbHVlICY9IH5MSFNfT1VUUFVUX1BPTEFSSVRZX0xPVzsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DT01fUElOX09VVFBVVF9QT0xBUklUWSgxKSk7Ci0KLQl2YWx1ZSA9IERJU1BfREFUQV9GT1JNQVRfREYxUDFDIHwgRElTUF9BTElHTk1FTlRfTVNCIHwKLQkJRElTUF9PUkRFUl9SRURfQkxVRTsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0RJU1BfSU5URVJGQUNFX0NPTlRST0wpOwotCi0JdGVncmFfZGNfd3JpdGVsKGRjLCAweDAwMDEwMDAxLCBEQ19ESVNQX1NISUZUX0NMT0NLX09QVElPTlMpOworCS8qIGludGVybGFjaW5nIGlzbid0IHN1cHBvcnRlZCB5ZXQsIHNvIGRpc2FibGUgaXQgKi8KKwlpZiAoZGMtPnNvYy0+c3VwcG9ydHNfaW50ZXJsYWNpbmcpIHsKKwkJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfRElTUF9JTlRFUkxBQ0VfQ09OVFJPTCk7CisJCXZhbHVlICY9IH5JTlRFUkxBQ0VfRU5BQkxFOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0lOVEVSTEFDRV9DT05UUk9MKTsKKwl9CiAKIAl2YWx1ZSA9IFNISUZUX0NMS19ESVZJREVSKGRpdikgfCBQSVhFTF9DTEtfRElWSURFUl9QQ0QxOwogCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfRElTUF9DTE9DS19DT05UUk9MKTsKQEAgLTczNSwxMCArNzMyLDYgQEAKIAkJUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFOwogCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOwogCi0JdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7Ci0JdmFsdWUgfD0gRElTUF9DVFJMX01PREVfQ19ESVNQTEFZOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX0NPTU1BTkQpOwotCiAJLyogaW5pdGlhbGl6ZSB0aW1lciAqLwogCXZhbHVlID0gQ1VSU09SX1RIUkVTSE9MRCgwKSB8IFdJTkRPV19BX1RIUkVTSE9MRCgweDIwKSB8CiAJCVdJTkRPV19CX1RIUkVTSE9MRCgweDIwKSB8IFdJTkRPV19DX1RIUkVTSE9MRCgweDIwKTsKQEAgLTExMDcsOCArMTEwMCw2IEBACiAJc3RydWN0IHRlZ3JhX2RjICpkYyA9IGhvc3QxeF9jbGllbnRfdG9fZGMoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JZGMtPnBpcGUgPSB0ZWdyYS0+ZHJtLT5tb2RlX2NvbmZpZy5udW1fY3J0YzsKLQogCWRybV9jcnRjX2luaXQodGVncmEtPmRybSwgJmRjLT5iYXNlLCAmdGVncmFfY3J0Y19mdW5jcyk7CiAJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZSgmZGMtPmJhc2UsIDI1Nik7CiAJZHJtX2NydGNfaGVscGVyX2FkZCgmZGMtPmJhc2UsICZ0ZWdyYV9jcnRjX2hlbHBlcl9mdW5jcyk7CkBAIC0xMTY3LDggKzExNTgsNzEgQEAKIAkuZXhpdCA9IHRlZ3JhX2RjX2V4aXQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHRlZ3JhMjBfZGNfc29jX2luZm8gPSB7CisJLnN1cHBvcnRzX2ludGVybGFjaW5nID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHRlZ3JhMzBfZGNfc29jX2luZm8gPSB7CisJLnN1cHBvcnRzX2ludGVybGFjaW5nID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHRlZ3JhMTI0X2RjX3NvY19pbmZvID0geworCS5zdXBwb3J0c19pbnRlcmxhY2luZyA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9kY19vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LWRjIiwKKwkJLmRhdGEgPSAmdGVncmExMjRfZGNfc29jX2luZm8sCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC1kYyIsCisJCS5kYXRhID0gJnRlZ3JhMzBfZGNfc29jX2luZm8sCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1kYyIsCisJCS5kYXRhID0gJnRlZ3JhMjBfZGNfc29jX2luZm8sCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CisKK3N0YXRpYyBpbnQgdGVncmFfZGNfcGFyc2VfZHQoc3RydWN0IHRlZ3JhX2RjICpkYykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXUzMiB2YWx1ZSA9IDA7CisJaW50IGVycjsKKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRjLT5kZXYtPm9mX25vZGUsICJudmlkaWEsaGVhZCIsICZ2YWx1ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihkYy0+ZGV2LCAibWlzc2luZyBcIm52aWRpYSxoZWFkXCIgcHJvcGVydHlcbiIpOworCisJCS8qCisJCSAqIElmIHRoZSBudmlkaWEsaGVhZCBwcm9wZXJ0eSBpc24ndCBwcmVzZW50LCB0cnkgdG8gZmluZCB0aGUKKwkJICogY29ycmVjdCBoZWFkIG51bWJlciBieSBsb29raW5nIHVwIHRoZSBwb3NpdGlvbiBvZiB0aGlzCisJCSAqIGRpc3BsYXkgY29udHJvbGxlcidzIG5vZGUgd2l0aGluIHRoZSBkZXZpY2UgdHJlZS4gQXNzdW1pbmcKKwkJICogdGhhdCB0aGUgbm9kZXMgYXJlIG9yZGVyZWQgcHJvcGVybHkgaW4gdGhlIERUUyBmaWxlIGFuZAorCQkgKiB0aGF0IHRoZSB0cmFuc2xhdGlvbiBpbnRvIGEgZmxhdHRlbmVkIGRldmljZSB0cmVlIGJsb2IKKwkJICogcHJlc2VydmVzIHRoYXQgb3JkZXJpbmcgdGhpcyB3aWxsIGFjdHVhbGx5IHlpZWxkIHRoZSByaWdodAorCQkgKiBoZWFkIG51bWJlci4KKwkJICoKKwkJICogSWYgdGhvc2UgYXNzdW1wdGlvbnMgZG9uJ3QgaG9sZCwgdGhpcyB3aWxsIHN0aWxsIHdvcmsgZm9yCisJCSAqIGNhc2VzIHdoZXJlIG9ubHkgYSBzaW5nbGUgZGlzcGxheSBjb250cm9sbGVyIGlzIHVzZWQuCisJCSAqLworCQlmb3JfZWFjaF9tYXRjaGluZ19ub2RlKG5wLCB0ZWdyYV9kY19vZl9tYXRjaCkgeworCQkJaWYgKG5wID09IGRjLT5kZXYtPm9mX25vZGUpCisJCQkJYnJlYWs7CisKKwkJCXZhbHVlKys7CisJCX0KKwl9CisKKwlkYy0+cGlwZSA9IHZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdGVncmFfZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CiAJc3RydWN0IHRlZ3JhX2RjICpkYzsKIAlpbnQgZXJyOwpAQCAtMTE3Nyw5ICsxMjMxLDE4IEBACiAJaWYgKCFkYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZCA9IG9mX21hdGNoX25vZGUodGVncmFfZGNfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXNwaW5fbG9ja19pbml0KCZkYy0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmRjLT5saXN0KTsKIAlkYy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkYy0+c29jID0gaWQtPmRhdGE7CisKKwllcnIgPSB0ZWdyYV9kY19wYXJzZV9kdChkYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAlkYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoZGMtPmNsaykpIHsKQEAgLTEyNTMsMTIgKzEzMTYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9kY19vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtZGMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZGMiLCB9LAotCXsgfSwKLX07Ci0KIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfZGNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInRlZ3JhLWRjIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kYy5oIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKaW5kZXggOTFiYmRhMi4uM2MyYzBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgRElTUF9DVFJMX01PREVfU1RPUCAoMCA8PCA1KQogI2RlZmluZSBESVNQX0NUUkxfTU9ERV9DX0RJU1BMQVkgKDEgPDwgNSkKICNkZWZpbmUgRElTUF9DVFJMX01PREVfTkNfRElTUExBWSAoMiA8PCA1KQorI2RlZmluZSBESVNQX0NUUkxfTU9ERV9NQVNLICgzIDw8IDUpCiAjZGVmaW5lIERDX0NNRF9TSUdOQUxfUkFJU0UJCQkweDAzMwogI2RlZmluZSBEQ19DTURfRElTUExBWV9QT1dFUl9DT05UUk9MCQkweDAzNgogI2RlZmluZSBQVzBfRU5BQkxFICgxIDw8ICAwKQpAQCAtMTE2LDYgKzExNyw3IEBACiAKICNkZWZpbmUgRENfRElTUF9ESVNQX1dJTl9PUFRJT05TCQkweDQwMgogI2RlZmluZSBIRE1JX0VOQUJMRSAoMSA8PCAzMCkKKyNkZWZpbmUgRFNJX0VOQUJMRSAgKDEgPDwgMjkpCiAKICNkZWZpbmUgRENfRElTUF9ESVNQX01FTV9ISUdIX1BSSU9SSVRZCQkweDQwMwogI2RlZmluZSBDVVJTT1JfVEhSRVNIT0xEKHgpICAgKCgoeCkgJiAweDAzKSA8PCAyNCkKQEAgLTIzOCw2ICsyNDAsOCBAQAogI2RlZmluZSBESVRIRVJfQ09OVFJPTF9FUlJESUZGICgzIDw8IDgpCiAKICNkZWZpbmUgRENfRElTUF9TSElGVF9DTE9DS19PUFRJT05TCQkweDQzMQorI2RlZmluZSAgU0MxX0hfUVVBTElGSUVSX05PTkUJKDEgPDwgMTYpCisjZGVmaW5lICBTQzBfSF9RVUFMSUZJRVJfTk9ORQkoMSA8PCAgMCkKIAogI2RlZmluZSBEQ19ESVNQX0RBVEFfRU5BQkxFX09QVElPTlMJCTB4NDMyCiAjZGVmaW5lIERFX1NFTEVDVF9BQ1RJVkVfQkxBTksgICgwIDw8IDApCkBAIC0yOTIsNiArMjk2LDExIEBACiAjZGVmaW5lIERDX0RJU1BfU0RfSFdfS19WQUxVRVMJCQkweDRkZAogI2RlZmluZSBEQ19ESVNQX1NEX01BTl9LX1ZBTFVFUwkJCTB4NGRlCiAKKyNkZWZpbmUgRENfRElTUF9JTlRFUkxBQ0VfQ09OVFJPTAkJMHg0ZTUKKyNkZWZpbmUgIElOVEVSTEFDRV9TVEFUVVMgKDEgPDwgMikKKyNkZWZpbmUgIElOVEVSTEFDRV9TVEFSVCAgKDEgPDwgMSkKKyNkZWZpbmUgIElOVEVSTEFDRV9FTkFCTEUgKDEgPDwgMCkKKwogI2RlZmluZSBEQ19XSU5fQ1NDX1lPRgkJCQkweDYxMQogI2RlZmluZSBEQ19XSU5fQ1NDX0tZUkdCCQkJMHg2MTIKICNkZWZpbmUgRENfV0lOX0NTQ19LVVIJCQkJMHg2MTMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uYwppbmRleCAwN2ViYTU5Li44OGE1MjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHJtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RybS5jCkBAIC0xMDQsOSArMTA0LDExIEBACiAKIHN0YXRpYyB2b2lkIHRlZ3JhX2RybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKKyNpZmRlZiBDT05GSUdfVEVHUkFfRFJNX0ZCREVWCiAJc3RydWN0IHRlZ3JhX2RybSAqdGVncmEgPSBkcm0tPmRldl9wcml2YXRlOwogCiAJdGVncmFfZmJkZXZfcmVzdG9yZV9tb2RlKHRlZ3JhLT5mYmRldik7CisjZW5kaWYKIH0KIAogc3RhdGljIHN0cnVjdCBob3N0MXhfYm8gKgpAQCAtNTc4LDcgKzU4MCw3IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIHRlZ3JhX2RybV9kcml2ZXIgPSB7Ci0JLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9NT0RFU0VUIHwgRFJJVkVSX0dFTSwKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX01PREVTRVQgfCBEUklWRVJfR0VNIHwgRFJJVkVSX1BSSU1FLAogCS5sb2FkID0gdGVncmFfZHJtX2xvYWQsCiAJLnVubG9hZCA9IHRlZ3JhX2RybV91bmxvYWQsCiAJLm9wZW4gPSB0ZWdyYV9kcm1fb3BlbiwKQEAgLTU5Niw2ICs1OTgsMTIgQEAKIAogCS5nZW1fZnJlZV9vYmplY3QgPSB0ZWdyYV9ib19mcmVlX29iamVjdCwKIAkuZ2VtX3ZtX29wcyA9ICZ0ZWdyYV9ib192bV9vcHMsCisKKwkucHJpbWVfaGFuZGxlX3RvX2ZkID0gZHJtX2dlbV9wcmltZV9oYW5kbGVfdG9fZmQsCisJLnByaW1lX2ZkX3RvX2hhbmRsZSA9IGRybV9nZW1fcHJpbWVfZmRfdG9faGFuZGxlLAorCS5nZW1fcHJpbWVfZXhwb3J0ID0gdGVncmFfZ2VtX3ByaW1lX2V4cG9ydCwKKwkuZ2VtX3ByaW1lX2ltcG9ydCA9IHRlZ3JhX2dlbV9wcmltZV9pbXBvcnQsCisKIAkuZHVtYl9jcmVhdGUgPSB0ZWdyYV9ib19kdW1iX2NyZWF0ZSwKIAkuZHVtYl9tYXBfb2Zmc2V0ID0gdGVncmFfYm9fZHVtYl9tYXBfb2Zmc2V0LAogCS5kdW1iX2Rlc3Ryb3kgPSBkcm1fZ2VtX2R1bWJfZGVzdHJveSwKQEAgLTY1Myw4ICs2NjEsMTAgQEAKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTMwLWhkbWkiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtZ3IyZCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC1ncjNkIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1kc2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LWhkbWkiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LWdyM2QiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LWRjIiwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiAKQEAgLTY3NywxMCArNjg3LDE0IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gdW5yZWdpc3Rlcl9ob3N0MXg7CiAKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX2hkbWlfZHJpdmVyKTsKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX2RzaV9kcml2ZXIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIHVucmVnaXN0ZXJfZGM7CiAKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX2hkbWlfZHJpdmVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bnJlZ2lzdGVyX2RzaTsKKwogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVncmFfZ3IyZF9kcml2ZXIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIHVucmVnaXN0ZXJfaGRtaTsKQEAgLTY5NSw2ICs3MDksOCBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9ncjJkX2RyaXZlcik7CiB1bnJlZ2lzdGVyX2hkbWk6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRlZ3JhX2hkbWlfZHJpdmVyKTsKK3VucmVnaXN0ZXJfZHNpOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9kc2lfZHJpdmVyKTsKIHVucmVnaXN0ZXJfZGM6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRlZ3JhX2RjX2RyaXZlcik7CiB1bnJlZ2lzdGVyX2hvc3QxeDoKQEAgLTcwOCw2ICs3MjQsNyBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9ncjNkX2RyaXZlcik7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRlZ3JhX2dyMmRfZHJpdmVyKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGVncmFfaGRtaV9kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9kc2lfZHJpdmVyKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGVncmFfZGNfZHJpdmVyKTsKIAlob3N0MXhfZHJpdmVyX3VucmVnaXN0ZXIoJmhvc3QxeF9kcm1fZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uaCBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uaAppbmRleCAyNjZhYWUwLi5iZjFjYWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHJtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RybS5oCkBAIC0yNywxMCArMjcsMTIgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX3BsYW5lczsKIH07CiAKKyNpZmRlZiBDT05GSUdfRFJNX1RFR1JBX0ZCREVWCiBzdHJ1Y3QgdGVncmFfZmJkZXYgewogCXN0cnVjdCBkcm1fZmJfaGVscGVyIGJhc2U7CiAJc3RydWN0IHRlZ3JhX2ZiICpmYjsKIH07CisjZW5kaWYKIAogc3RydWN0IHRlZ3JhX2RybSB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRybTsKQEAgLTM4LDcgKzQwLDkgQEAKIAlzdHJ1Y3QgbXV0ZXggY2xpZW50c19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50czsKIAorI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIAlzdHJ1Y3QgdGVncmFfZmJkZXYgKmZiZGV2OworI2VuZGlmCiB9OwogCiBzdHJ1Y3QgdGVncmFfZHJtX2NsaWVudDsKQEAgLTg0LDYgKzg4LDcgQEAKIGV4dGVybiBpbnQgdGVncmFfZHJtX2luaXQoc3RydWN0IHRlZ3JhX2RybSAqdGVncmEsIHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pOwogZXh0ZXJuIGludCB0ZWdyYV9kcm1fZXhpdChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSk7CiAKK3N0cnVjdCB0ZWdyYV9kY19zb2NfaW5mbzsKIHN0cnVjdCB0ZWdyYV9vdXRwdXQ7CiAKIHN0cnVjdCB0ZWdyYV9kYyB7CkBAIC0xMDksNiArMTE0LDggQEAKIAogCS8qIHBhZ2UtZmxpcCBoYW5kbGluZyAqLwogCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50OworCisJY29uc3Qgc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvICpzb2M7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV9kYyAqCkBAIC0xNzcsNiArMTg0LDcgQEAKIGVudW0gdGVncmFfb3V0cHV0X3R5cGUgewogCVRFR1JBX09VVFBVVF9SR0IsCiAJVEVHUkFfT1VUUFVUX0hETUksCisJVEVHUkFfT1VUUFVUX0RTSSwKIH07CiAKIHN0cnVjdCB0ZWdyYV9vdXRwdXQgewpAQCAtMTg2LDYgKzE5NCw3IEBACiAJY29uc3Qgc3RydWN0IHRlZ3JhX291dHB1dF9vcHMgKm9wczsKIAllbnVtIHRlZ3JhX291dHB1dF90eXBlIHR5cGU7CiAKKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRkYzsKIAljb25zdCBzdHJ1Y3QgZWRpZCAqZWRpZDsKIAl1bnNpZ25lZCBpbnQgaHBkX2lycTsKQEAgLTI2Myw5ICsyNzIsMTIgQEAKIGJvb2wgdGVncmFfZmJfaXNfdGlsZWQoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIpOwogZXh0ZXJuIGludCB0ZWdyYV9kcm1fZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKTsKIGV4dGVybiB2b2lkIHRlZ3JhX2RybV9mYl9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pOworI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIGV4dGVybiB2b2lkIHRlZ3JhX2ZiZGV2X3Jlc3RvcmVfbW9kZShzdHJ1Y3QgdGVncmFfZmJkZXYgKmZiZGV2KTsKKyNlbmRpZgogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9kY19kcml2ZXI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9kc2lfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfaGRtaV9kcml2ZXI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9ncjJkX2RyaXZlcjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX2dyM2RfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTJmYWFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jCkBAIC0wLDAgKzEsOTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ob3N0MXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtX21pcGlfZHNpLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgorCisjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CisKKyNpbmNsdWRlICJkYy5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRzaS5oIgorI2luY2x1ZGUgIm1pcGktcGh5LmgiCisKKyNkZWZpbmUgRFNJX1ZJREVPX0ZJRk9fREVQVEggKDE5MjAgLyA0KQorI2RlZmluZSBEU0lfSE9TVF9GSUZPX0RFUFRIIDY0CisKK3N0cnVjdCB0ZWdyYV9kc2kgeworCXN0cnVjdCBob3N0MXhfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgdGVncmFfb3V0cHV0IG91dHB1dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0OworCXN0cnVjdCBjbGsgKmNsa19wYXJlbnQ7CisJc3RydWN0IGNsayAqY2xrX2xwOworCXN0cnVjdCBjbGsgKmNsazsKKworCXN0cnVjdCBkcm1faW5mb19saXN0ICpkZWJ1Z2ZzX2ZpbGVzOworCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7CisKKwllbnVtIG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBmb3JtYXQ7CisJdW5zaWduZWQgaW50IGxhbmVzOworCisJc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICptaXBpOworCXN0cnVjdCBtaXBpX2RzaV9ob3N0IGhvc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV9kc2kgKgoraG9zdDF4X2NsaWVudF90b19kc2koc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNsaWVudCwgc3RydWN0IHRlZ3JhX2RzaSwgY2xpZW50KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGVncmFfZHNpICpob3N0X3RvX3RlZ3JhKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQoreworCXJldHVybiBjb250YWluZXJfb2YoaG9zdCwgc3RydWN0IHRlZ3JhX2RzaSwgaG9zdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX2RzaSAqdG9fZHNpKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG91dHB1dCwgc3RydWN0IHRlZ3JhX2RzaSwgb3V0cHV0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRlZ3JhX2RzaV9yZWFkbChzdHJ1Y3QgdGVncmFfZHNpICpkc2ksCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoZHNpLT5yZWdzICsgKHJlZyA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZWdyYV9kc2lfd3JpdGVsKHN0cnVjdCB0ZWdyYV9kc2kgKmRzaSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZWcpCit7CisJd3JpdGVsKHZhbHVlLCBkc2ktPnJlZ3MgKyAocmVnIDw8IDIpKTsKK30KKworc3RhdGljIGludCB0ZWdyYV9kc2lfc2hvd19yZWdzKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IHMtPnByaXZhdGU7CisJc3RydWN0IHRlZ3JhX2RzaSAqZHNpID0gbm9kZS0+aW5mb19lbnQtPmRhdGE7CisKKyNkZWZpbmUgRFVNUF9SRUcobmFtZSkJCQkJCQlcCisJc2VxX3ByaW50ZihzLCAiJS0zMnMgJSMwNXggJTA4bHhcbiIsICNuYW1lLCBuYW1lLAlcCisJCSAgIHRlZ3JhX2RzaV9yZWFkbChkc2ksIG5hbWUpKQorCisJRFVNUF9SRUcoRFNJX0lOQ1JfU1lOQ1BUKTsKKwlEVU1QX1JFRyhEU0lfSU5DUl9TWU5DUFRfQ09OVFJPTCk7CisJRFVNUF9SRUcoRFNJX0lOQ1JfU1lOQ1BUX0VSUk9SKTsKKwlEVU1QX1JFRyhEU0lfQ1RYU1cpOworCURVTVBfUkVHKERTSV9SRF9EQVRBKTsKKwlEVU1QX1JFRyhEU0lfV1JfREFUQSk7CisJRFVNUF9SRUcoRFNJX1BPV0VSX0NPTlRST0wpOworCURVTVBfUkVHKERTSV9JTlRfRU5BQkxFKTsKKwlEVU1QX1JFRyhEU0lfSU5UX1NUQVRVUyk7CisJRFVNUF9SRUcoRFNJX0lOVF9NQVNLKTsKKwlEVU1QX1JFRyhEU0lfSE9TVF9DT05UUk9MKTsKKwlEVU1QX1JFRyhEU0lfQ09OVFJPTCk7CisJRFVNUF9SRUcoRFNJX1NPTF9ERUxBWSk7CisJRFVNUF9SRUcoRFNJX01BWF9USFJFU0hPTEQpOworCURVTVBfUkVHKERTSV9UUklHR0VSKTsKKwlEVU1QX1JFRyhEU0lfVFhfQ1JDKTsKKwlEVU1QX1JFRyhEU0lfU1RBVFVTKTsKKworCURVTVBfUkVHKERTSV9JTklUX1NFUV9DT05UUk9MKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8wKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8xKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8yKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8zKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV80KTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV81KTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV82KTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV83KTsKKworCURVTVBfUkVHKERTSV9QS1RfU0VRXzBfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzBfSEkpOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzFfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzFfSEkpOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzJfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzJfSEkpOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzNfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzNfSEkpOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzRfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzRfSEkpOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzVfTE8pOworCURVTVBfUkVHKERTSV9QS1RfU0VRXzVfSEkpOworCisJRFVNUF9SRUcoRFNJX0RDU19DTURTKTsKKworCURVTVBfUkVHKERTSV9QS1RfTEVOXzBfMSk7CisJRFVNUF9SRUcoRFNJX1BLVF9MRU5fMl8zKTsKKwlEVU1QX1JFRyhEU0lfUEtUX0xFTl80XzUpOworCURVTVBfUkVHKERTSV9QS1RfTEVOXzZfNyk7CisKKwlEVU1QX1JFRyhEU0lfUEhZX1RJTUlOR18wKTsKKwlEVU1QX1JFRyhEU0lfUEhZX1RJTUlOR18xKTsKKwlEVU1QX1JFRyhEU0lfUEhZX1RJTUlOR18yKTsKKwlEVU1QX1JFRyhEU0lfQlRBX1RJTUlORyk7CisKKwlEVU1QX1JFRyhEU0lfVElNRU9VVF8wKTsKKwlEVU1QX1JFRyhEU0lfVElNRU9VVF8xKTsKKwlEVU1QX1JFRyhEU0lfVE9fVEFMTFkpOworCisJRFVNUF9SRUcoRFNJX1BBRF9DT05UUk9MXzApOworCURVTVBfUkVHKERTSV9QQURfQ09OVFJPTF9DRCk7CisJRFVNUF9SRUcoRFNJX1BBRF9DRF9TVEFUVVMpOworCURVTVBfUkVHKERTSV9WSURFT19NT0RFX0NPTlRST0wpOworCURVTVBfUkVHKERTSV9QQURfQ09OVFJPTF8xKTsKKwlEVU1QX1JFRyhEU0lfUEFEX0NPTlRST0xfMik7CisJRFVNUF9SRUcoRFNJX1BBRF9DT05UUk9MXzMpOworCURVTVBfUkVHKERTSV9QQURfQ09OVFJPTF80KTsKKworCURVTVBfUkVHKERTSV9HQU5HRURfTU9ERV9DT05UUk9MKTsKKwlEVU1QX1JFRyhEU0lfR0FOR0VEX01PREVfU1RBUlQpOworCURVTVBfUkVHKERTSV9HQU5HRURfTU9ERV9TSVpFKTsKKworCURVTVBfUkVHKERTSV9SQVdfREFUQV9CWVRFX0NPVU5UKTsKKwlEVU1QX1JFRyhEU0lfVUxUUkFfTE9XX1BPV0VSX0NPTlRST0wpOworCisJRFVNUF9SRUcoRFNJX0lOSVRfU0VRX0RBVEFfOCk7CisJRFVNUF9SRUcoRFNJX0lOSVRfU0VRX0RBVEFfOSk7CisJRFVNUF9SRUcoRFNJX0lOSVRfU0VRX0RBVEFfMTApOworCURVTVBfUkVHKERTSV9JTklUX1NFUV9EQVRBXzExKTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8xMik7CisJRFVNUF9SRUcoRFNJX0lOSVRfU0VRX0RBVEFfMTMpOworCURVTVBfUkVHKERTSV9JTklUX1NFUV9EQVRBXzE0KTsKKwlEVU1QX1JFRyhEU0lfSU5JVF9TRVFfREFUQV8xNSk7CisKKyN1bmRlZiBEVU1QX1JFRworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCBkZWJ1Z2ZzX2ZpbGVzW10gPSB7CisJeyAicmVncyIsIHRlZ3JhX2RzaV9zaG93X3JlZ3MsIDAsIE5VTEwgfSwKK307CisKK3N0YXRpYyBpbnQgdGVncmFfZHNpX2RlYnVnZnNfaW5pdChzdHJ1Y3QgdGVncmFfZHNpICpkc2ksCisJCQkJICBzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGV2X25hbWUoZHNpLT5kZXYpOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlkc2ktPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgbWlub3ItPmRlYnVnZnNfcm9vdCk7CisJaWYgKCFkc2ktPmRlYnVnZnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZHNpLT5kZWJ1Z2ZzX2ZpbGVzID0ga21lbWR1cChkZWJ1Z2ZzX2ZpbGVzLCBzaXplb2YoZGVidWdmc19maWxlcyksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzaS0+ZGVidWdmc19maWxlcykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJlbW92ZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z2ZzX2ZpbGVzKTsgaSsrKQorCQlkc2ktPmRlYnVnZnNfZmlsZXNbaV0uZGF0YSA9IGRzaTsKKworCWVyciA9IGRybV9kZWJ1Z2ZzX2NyZWF0ZV9maWxlcyhkc2ktPmRlYnVnZnNfZmlsZXMsCisJCQkJICAgICAgIEFSUkFZX1NJWkUoZGVidWdmc19maWxlcyksCisJCQkJICAgICAgIGRzaS0+ZGVidWdmcywgbWlub3IpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZyZWU7CisKKwlkc2ktPm1pbm9yID0gbWlub3I7CisKKwlyZXR1cm4gMDsKKworZnJlZToKKwlrZnJlZShkc2ktPmRlYnVnZnNfZmlsZXMpOworCWRzaS0+ZGVidWdmc19maWxlcyA9IE5VTEw7CityZW1vdmU6CisJZGVidWdmc19yZW1vdmUoZHNpLT5kZWJ1Z2ZzKTsKKwlkc2ktPmRlYnVnZnMgPSBOVUxMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWdyYV9kc2lfZGVidWdmc19leGl0KHN0cnVjdCB0ZWdyYV9kc2kgKmRzaSkKK3sKKwlkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMoZHNpLT5kZWJ1Z2ZzX2ZpbGVzLCBBUlJBWV9TSVpFKGRlYnVnZnNfZmlsZXMpLAorCQkJCSBkc2ktPm1pbm9yKTsKKwlkc2ktPm1pbm9yID0gTlVMTDsKKworCWtmcmVlKGRzaS0+ZGVidWdmc19maWxlcyk7CisJZHNpLT5kZWJ1Z2ZzX2ZpbGVzID0gTlVMTDsKKworCWRlYnVnZnNfcmVtb3ZlKGRzaS0+ZGVidWdmcyk7CisJZHNpLT5kZWJ1Z2ZzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBLVF9JRDAoaWQpCSgoKChpZCkgJiAweDNmKSA8PCAgMykgfCAoMSA8PCAgOSkpCisjZGVmaW5lIFBLVF9MRU4wKGxlbikJKCgobGVuKSAmIDB4MDcpIDw8ICAwKQorI2RlZmluZSBQS1RfSUQxKGlkKQkoKCgoaWQpICYgMHgzZikgPDwgMTMpIHwgKDEgPDwgMTkpKQorI2RlZmluZSBQS1RfTEVOMShsZW4pCSgoKGxlbikgJiAweDA3KSA8PCAxMCkKKyNkZWZpbmUgUEtUX0lEMihpZCkJKCgoKGlkKSAmIDB4M2YpIDw8IDIzKSB8ICgxIDw8IDI5KSkKKyNkZWZpbmUgUEtUX0xFTjIobGVuKQkoKChsZW4pICYgMHgwNykgPDwgMjApCisKKyNkZWZpbmUgUEtUX0xQCQkoMSA8PCAzMCkKKyNkZWZpbmUgTlVNX1BLVF9TRVEJMTIKKworLyogbm9uLWJ1cnN0IG1vZGUgd2l0aCBzeW5jLWVuZCAqLworc3RhdGljIGNvbnN0IHUzMiBwa3Rfc2VxX3ZuYl9zeW5lW05VTV9QS1RfU0VRXSA9IHsKKwlbIDBdID0gUEtUX0lEMChNSVBJX0RTSV9WX1NZTkNfU1RBUlQpIHwgUEtUX0xFTjAoMCkgfAorCSAgICAgICBQS1RfSUQxKE1JUElfRFNJX0JMQU5LSU5HX1BBQ0tFVCkgfCBQS1RfTEVOMSgxKSB8CisJICAgICAgIFBLVF9JRDIoTUlQSV9EU0lfSF9TWU5DX0VORCkgfCBQS1RfTEVOMigwKSB8CisJICAgICAgIFBLVF9MUCwKKwlbIDFdID0gMCwKKwlbIDJdID0gUEtUX0lEMChNSVBJX0RTSV9WX1NZTkNfRU5EKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCkgfAorCSAgICAgICBQS1RfTFAsCisJWyAzXSA9IDAsCisJWyA0XSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCkgfAorCSAgICAgICBQS1RfTFAsCisJWyA1XSA9IDAsCisJWyA2XSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCksCisJWyA3XSA9IFBLVF9JRDAoTUlQSV9EU0lfQkxBTktJTkdfUEFDS0VUKSB8IFBLVF9MRU4wKDIpIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9QQUNLRURfUElYRUxfU1RSRUFNXzI0KSB8IFBLVF9MRU4xKDMpIHwKKwkgICAgICAgUEtUX0lEMihNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjIoNCksCisJWyA4XSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCkgfAorCSAgICAgICBQS1RfTFAsCisJWyA5XSA9IDAsCisJWzEwXSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCksCisJWzExXSA9IFBLVF9JRDAoTUlQSV9EU0lfQkxBTktJTkdfUEFDS0VUKSB8IFBLVF9MRU4wKDIpIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9QQUNLRURfUElYRUxfU1RSRUFNXzI0KSB8IFBLVF9MRU4xKDMpIHwKKwkgICAgICAgUEtUX0lEMihNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjIoNCksCit9OworCitzdGF0aWMgaW50IHRlZ3JhX2RzaV9zZXRfcGh5X3RpbWluZyhzdHJ1Y3QgdGVncmFfZHNpICpkc2kpCit7CisJc3RydWN0IG1pcGlfZHBoeV90aW1pbmcgdGltaW5nOworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHBlcmlvZDsKKwlsb25nIHJhdGU7CisJaW50IGVycjsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUoZHNpLT5jbGspOworCWlmIChyYXRlIDwgMCkKKwkJcmV0dXJuIHJhdGU7CisKKwlwZXJpb2QgPSBESVZfUk9VTkRfQ0xPU0VTVCgxMDAwMDAwMDAwVUwsIHJhdGUgKiAyKTsKKworCWVyciA9IG1pcGlfZHBoeV90aW1pbmdfZ2V0X2RlZmF1bHQoJnRpbWluZywgcGVyaW9kKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG1pcGlfZHBoeV90aW1pbmdfdmFsaWRhdGUoJnRpbWluZywgcGVyaW9kKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRzaS0+ZGV2LCAiZmFpbGVkIHRvIHZhbGlkYXRlIEQtUEhZIHRpbWluZzogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBUaGUgRC1QSFkgdGltaW5nIGZpZWxkcyBiZWxvdyBhcmUgZXhwcmVzc2VkIGluIGJ5dGUtY2xvY2sgY3ljbGVzLAorCSAqIHNvIG11bHRpcGx5IHRoZSBwZXJpb2QgYnkgOC4KKwkgKi8KKwlwZXJpb2QgKj0gODsKKworCXZhbHVlID0gRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcuaHNleGl0LCBwZXJpb2QsIDEpIDw8IDI0IHwKKwkJRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcuaHN0cmFpbCwgcGVyaW9kLCAwKSA8PCAxNiB8CisJCURTSV9USU1JTkdfRklFTEQodGltaW5nLmhzemVybywgcGVyaW9kLCAzKSA8PCA4IHwKKwkJRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcuaHNwcmVwYXJlLCBwZXJpb2QsIDEpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCB2YWx1ZSwgRFNJX1BIWV9USU1JTkdfMCk7CisKKwl2YWx1ZSA9IERTSV9USU1JTkdfRklFTEQodGltaW5nLmNsa3RyYWlsLCBwZXJpb2QsIDEpIDw8IDI0IHwKKwkJRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcuY2xrcG9zdCwgcGVyaW9kLCAxKSA8PCAxNiB8CisJCURTSV9USU1JTkdfRklFTEQodGltaW5nLmNsa3plcm8sIHBlcmlvZCwgMSkgPDwgOCB8CisJCURTSV9USU1JTkdfRklFTEQodGltaW5nLmxweCwgcGVyaW9kLCAxKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QSFlfVElNSU5HXzEpOworCisJdmFsdWUgPSBEU0lfVElNSU5HX0ZJRUxEKHRpbWluZy5jbGtwcmVwYXJlLCBwZXJpb2QsIDEpIDw8IDE2IHwKKwkJRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcuY2xrcHJlLCBwZXJpb2QsIDEpIDw8IDggfAorCQlEU0lfVElNSU5HX0ZJRUxEKDB4ZmYgKiBwZXJpb2QsIHBlcmlvZCwgMCkgPDwgMDsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QSFlfVElNSU5HXzIpOworCisJdmFsdWUgPSBEU0lfVElNSU5HX0ZJRUxEKHRpbWluZy50YWdldCwgcGVyaW9kLCAxKSA8PCAxNiB8CisJCURTSV9USU1JTkdfRklFTEQodGltaW5nLnRhc3VyZSwgcGVyaW9kLCAxKSA8PCA4IHwKKwkJRFNJX1RJTUlOR19GSUVMRCh0aW1pbmcudGFnbywgcGVyaW9kLCAxKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9CVEFfVElNSU5HKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX2RzaV9nZXRfbXVsZGl2KGVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IGZvcm1hdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm11bHAsIHVuc2lnbmVkIGludCAqZGl2cCkKK3sKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCODg4OgorCQkqbXVscCA9IDM7CisJCSpkaXZwID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CisJCSptdWxwID0gMjsKKwkJKmRpdnAgPSAxOworCQlicmVhazsKKworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2NjoKKwkJKm11bHAgPSA5OworCQkqZGl2cCA9IDQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfb3V0cHV0X2RzaV9lbmFibGUoc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhvdXRwdXQtPmVuY29kZXIuY3J0Yyk7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmZGMtPmJhc2UubW9kZTsKKwl1bnNpZ25lZCBpbnQgaGFjdCwgaHN3LCBoYnAsIGhmcCwgaSwgbXVsLCBkaXY7CisJc3RydWN0IHRlZ3JhX2RzaSAqZHNpID0gdG9fZHNpKG91dHB1dCk7CisJLyogRklYTUU6IGRvbid0IGhhcmRjb2RlIHRoaXMgKi8KKwljb25zdCB1MzIgKnBrdF9zZXEgPSBwa3Rfc2VxX3ZuYl9zeW5lOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IGVycjsKKworCWVyciA9IHRlZ3JhX2RzaV9nZXRfbXVsZGl2KGRzaS0+Zm9ybWF0LCAmbXVsLCAmZGl2KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGNsa19lbmFibGUoZHNpLT5jbGspOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmVzZXRfY29udHJvbF9kZWFzc2VydChkc2ktPnJzdCk7CisKKwl2YWx1ZSA9IERTSV9DT05UUk9MX0NIQU5ORUwoMCkgfCBEU0lfQ09OVFJPTF9GT1JNQVQoZHNpLT5mb3JtYXQpIHwKKwkJRFNJX0NPTlRST0xfTEFORVMoZHNpLT5sYW5lcyAtIDEpIHwKKwkJRFNJX0NPTlRST0xfU09VUkNFKGRjLT5waXBlKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9DT05UUk9MKTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCBEU0lfVklERU9fRklGT19ERVBUSCwgRFNJX01BWF9USFJFU0hPTEQpOworCisJdmFsdWUgPSBEU0lfSE9TVF9DT05UUk9MX0hTIHwgRFNJX0hPU1RfQ09OVFJPTF9DUyB8CisJCURTSV9IT1NUX0NPTlRST0xfRUNDOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCB2YWx1ZSwgRFNJX0hPU1RfQ09OVFJPTCk7CisKKwl2YWx1ZSA9IHRlZ3JhX2RzaV9yZWFkbChkc2ksIERTSV9DT05UUk9MKTsKKwl2YWx1ZSB8PSBEU0lfQ09OVFJPTF9IU19DTEtfQ1RSTDsKKwl2YWx1ZSAmPSB+RFNJX0NPTlRST0xfVFhfVFJJRygzKTsKKwl2YWx1ZSAmPSB+RFNJX0NPTlRST0xfRENTX0VOQUJMRTsKKwl2YWx1ZSB8PSBEU0lfQ09OVFJPTF9WSURFT19FTkFCTEU7CisJdmFsdWUgJj0gfkRTSV9DT05UUk9MX0hPU1RfRU5BQkxFOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCB2YWx1ZSwgRFNJX0NPTlRST0wpOworCisJZXJyID0gdGVncmFfZHNpX3NldF9waHlfdGltaW5nKGRzaSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1BLVF9TRVE7IGkrKykKKwkJdGVncmFfZHNpX3dyaXRlbChkc2ksIHBrdF9zZXFbaV0sIERTSV9QS1RfU0VRXzBfTE8gKyBpKTsKKworCS8qIGhvcml6b250YWwgYWN0aXZlIHBpeGVscyAqLworCWhhY3QgPSBtb2RlLT5oZGlzcGxheSAqIG11bCAvIGRpdjsKKworCS8qIGhvcml6b250YWwgc3luYyB3aWR0aCAqLworCWhzdyA9IChtb2RlLT5oc3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydCkgKiBtdWwgLyBkaXY7CisJaHN3IC09IDEwOworCisJLyogaG9yaXpvbnRhbCBiYWNrIHBvcmNoICovCisJaGJwID0gKG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX2VuZCkgKiBtdWwgLyBkaXY7CisJaGJwIC09IDE0OworCisJLyogaG9yaXpvbnRhbCBmcm9udCBwb3JjaCAqLworCWhmcCA9IChtb2RlLT5oc3luY19zdGFydCAgLSBtb2RlLT5oZGlzcGxheSkgKiBtdWwgLyBkaXY7CisJaGZwIC09IDg7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgaHN3IDw8IDE2IHwgMCwgRFNJX1BLVF9MRU5fMF8xKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgaGFjdCA8PCAxNiB8IGhicCwgRFNJX1BLVF9MRU5fMl8zKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgaGZwLCBEU0lfUEtUX0xFTl80XzUpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAweDBmMGYgPDwgMTYsIERTSV9QS1RfTEVOXzZfNyk7CisKKwkvKiBzZXQgU09MIGRlbGF5ICovCisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDggKiBtdWwgLyBkaXYsIERTSV9TT0xfREVMQVkpOworCisJLyogZW5hYmxlIGRpc3BsYXkgY29udHJvbGxlciAqLworCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX0RJU1BfRElTUF9XSU5fT1BUSU9OUyk7CisJdmFsdWUgfD0gRFNJX0VOQUJMRTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOworCisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJdmFsdWUgJj0gfkRJU1BfQ1RSTF9NT0RFX01BU0s7CisJdmFsdWUgfD0gRElTUF9DVFJMX01PREVfQ19ESVNQTEFZOworCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX0NPTU1BTkQpOworCisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisJdmFsdWUgfD0gUFcwX0VOQUJMRSB8IFBXMV9FTkFCTEUgfCBQVzJfRU5BQkxFIHwgUFczX0VOQUJMRSB8CisJCSBQVzRfRU5BQkxFIHwgUE0wX0VOQUJMRSB8IFBNMV9FTkFCTEU7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisKKwl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCBHRU5FUkFMX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKKworCS8qIGVuYWJsZSBEU0kgY29udHJvbGxlciAqLworCXZhbHVlID0gdGVncmFfZHNpX3JlYWRsKGRzaSwgRFNJX1BPV0VSX0NPTlRST0wpOworCXZhbHVlIHw9IERTSV9QT1dFUl9DT05UUk9MX0VOQUJMRTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QT1dFUl9DT05UUk9MKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX291dHB1dF9kc2lfZGlzYWJsZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCit7CisJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKG91dHB1dC0+ZW5jb2Rlci5jcnRjKTsKKwlzdHJ1Y3QgdGVncmFfZHNpICpkc2kgPSB0b19kc2kob3V0cHV0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJLyogZGlzYWJsZSBEU0kgY29udHJvbGxlciAqLworCXZhbHVlID0gdGVncmFfZHNpX3JlYWRsKGRzaSwgRFNJX1BPV0VSX0NPTlRST0wpOworCXZhbHVlICY9IERTSV9QT1dFUl9DT05UUk9MX0VOQUJMRTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QT1dFUl9DT05UUk9MKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBhY2Nlc3NlcyByZWdpc3RlcnMgb2YgdGhlIGRpc3BsYXkgY29udHJvbGxlciwgc28gbWFrZQorCSAqIHN1cmUgaXQncyBvbmx5IGV4ZWN1dGVkIHdoZW4gdGhlIG91dHB1dCBpcyBhdHRhY2hlZCB0byBvbmUuCisJICovCisJaWYgKGRjKSB7CisJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOworCQl2YWx1ZSAmPSB+KFBXMF9FTkFCTEUgfCBQVzFfRU5BQkxFIHwgUFcyX0VOQUJMRSB8IFBXM19FTkFCTEUgfAorCQkJICAgUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFKTsKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisKKwkJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJCXZhbHVlICY9IH5ESVNQX0NUUkxfTU9ERV9NQVNLOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9DT01NQU5EKTsKKworCQl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOworCQl2YWx1ZSAmPSB+RFNJX0VOQUJMRTsKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9ESVNQX1dJTl9PUFRJT05TKTsKKworCQl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJCXRlZ3JhX2RjX3dyaXRlbChkYywgR0VORVJBTF9BQ1RfUkVRLCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJfQorCisJY2xrX2Rpc2FibGUoZHNpLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfb3V0cHV0X2RzaV9zZXR1cF9jbG9jayhzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQsCisJCQkJCXN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBwY2xrKQoreworCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhvdXRwdXQtPmVuY29kZXIuY3J0Yyk7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmZGMtPmJhc2UubW9kZTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCwgbXVsLCBkaXYsIHZyZWZyZXNoOworCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IHRvX2RzaShvdXRwdXQpOworCXVuc2lnbmVkIGxvbmcgYmNsaywgcGxsZCwgdmFsdWU7CisJc3RydWN0IGNsayAqYmFzZTsKKwlpbnQgZXJyOworCisJZXJyID0gdGVncmFfZHNpX2dldF9tdWxkaXYoZHNpLT5mb3JtYXQsICZtdWwsICZkaXYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJdnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKKworCXBjbGsgPSBtb2RlLT5odG90YWwgKiBtb2RlLT52dG90YWwgKiB2cmVmcmVzaDsKKwliY2xrID0gKHBjbGsgKiBtdWwpIC8gKGRpdiAqIGRzaS0+bGFuZXMpOworCXBsbGQgPSBESVZfUk9VTkRfVVAoYmNsayAqIDgsIDEwMDAwMDApOworCXBjbGsgPSAocGxsZCAqIDEwMDAwMDApIC8gMjsKKworCWVyciA9IGNsa19zZXRfcGFyZW50KGNsaywgZHNpLT5jbGtfcGFyZW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRzaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBwYXJlbnQgY2xvY2s6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWJhc2UgPSBjbGtfZ2V0X3BhcmVudChkc2ktPmNsa19wYXJlbnQpOworCisJLyoKKwkgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcGFyZW50IGNsb2NrIGlzIHBsbF9kX291dDAgb3IgcGxsX2QyX291dAorCSAqIHJlc3BlY3RpdmVseSwgZWFjaCBvZiB3aGljaCBkaXZpZGVzIHRoZSBiYXNlIHBsbF9kIGJ5IDIuCisJICovCisJZXJyID0gY2xrX3NldF9yYXRlKGJhc2UsIHBjbGsgKiAyKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRzaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBiYXNlIGNsb2NrIHJhdGUgdG8gJWx1IEh6XG4iLAorCQkJcGNsayAqIDIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogWFhYOiBNb3ZlIHRoZSBiZWxvdyBzb21ld2hlcmUgZWxzZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gaGF2ZQorCSAqIGFjY2VzcyB0byB0aGUgdnJlZnJlc2ggaW4gdGhpcyBmdW5jdGlvbj8KKwkgKi8KKworCS8qIG9uZSBmcmFtZSBoaWdoLXNwZWVkIHRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCisJdGltZW91dCA9IChiY2xrIC8gdnJlZnJlc2gpIC8gNTEyOworCXZhbHVlID0gRFNJX1RJTUVPVVRfTFJYKDB4MjAwMCkgfCBEU0lfVElNRU9VVF9IVFgodGltZW91dCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIHZhbHVlLCBEU0lfVElNRU9VVF8wKTsKKworCS8qIDIgbXMgcGVyaXBoZXJhbCB0aW1lb3V0IGZvciBwYW5lbCAqLworCXRpbWVvdXQgPSAyICogYmNsayAvIDUxMiAqIDEwMDA7CisJdmFsdWUgPSBEU0lfVElNRU9VVF9QUih0aW1lb3V0KSB8IERTSV9USU1FT1VUX1RBKDB4MjAwMCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIHZhbHVlLCBEU0lfVElNRU9VVF8xKTsKKworCXZhbHVlID0gRFNJX1RBTExZX1RBKDApIHwgRFNJX1RBTExZX0xSWCgwKSB8IERTSV9UQUxMWV9IVFgoMCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIHZhbHVlLCBEU0lfVE9fVEFMTFkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfb3V0cHV0X2RzaV9jaGVja19tb2RlKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgICAgIGVudW0gZHJtX21vZGVfc3RhdHVzICpzdGF0dXMpCit7CisJLyoKKwkgKiBGSVhNRTogRm9yIG5vdywgYWx3YXlzIGFzc3VtZSB0aGF0IHRoZSBtb2RlIGlzIG9rYXkuCisJICovCisKKwkqc3RhdHVzID0gTU9ERV9PSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX291dHB1dF9vcHMgZHNpX29wcyA9IHsKKwkuZW5hYmxlID0gdGVncmFfb3V0cHV0X2RzaV9lbmFibGUsCisJLmRpc2FibGUgPSB0ZWdyYV9vdXRwdXRfZHNpX2Rpc2FibGUsCisJLnNldHVwX2Nsb2NrID0gdGVncmFfb3V0cHV0X2RzaV9zZXR1cF9jbG9jaywKKwkuY2hlY2tfbW9kZSA9IHRlZ3JhX291dHB1dF9kc2lfY2hlY2tfbW9kZSwKK307CisKK3N0YXRpYyBpbnQgdGVncmFfZHNpX3BhZF9lbmFibGUoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl2YWx1ZSA9IERTSV9QQURfQ09OVFJPTF9WUzFfUFVMTEROKDApIHwgRFNJX1BBRF9DT05UUk9MX1ZTMV9QRElPKDApOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCB2YWx1ZSwgRFNJX1BBRF9DT05UUk9MXzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZHNpX3BhZF9jYWxpYnJhdGUoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MXzApOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEFEX0NPTlRST0xfMSk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF8yKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MXzMpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEFEX0NPTlRST0xfNCk7CisKKwkvKiBzdGFydCBjYWxpYnJhdGlvbiAqLworCXRlZ3JhX2RzaV9wYWRfZW5hYmxlKGRzaSk7CisKKwl2YWx1ZSA9IERTSV9QQURfU0xFV19VUCgweDcpIHwgRFNJX1BBRF9TTEVXX0ROKDB4NykgfAorCQlEU0lfUEFEX0xQX1VQKDB4MSkgfCBEU0lfUEFEX0xQX0ROKDB4MSkgfAorCQlEU0lfUEFEX09VVF9DTEsoMHgwKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QQURfQ09OVFJPTF8yKTsKKworCXJldHVybiB0ZWdyYV9taXBpX2NhbGlicmF0ZShkc2ktPm1pcGkpOworfQorCitzdGF0aWMgaW50IHRlZ3JhX2RzaV9pbml0KHN0cnVjdCBob3N0MXhfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRlZ3JhX2RybSAqdGVncmEgPSBkZXZfZ2V0X2RydmRhdGEoY2xpZW50LT5wYXJlbnQpOworCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IGhvc3QxeF9jbGllbnRfdG9fZHNpKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZSwgaTsKKwlpbnQgZXJyOworCisJZHNpLT5vdXRwdXQudHlwZSA9IFRFR1JBX09VVFBVVF9EU0k7CisJZHNpLT5vdXRwdXQuZGV2ID0gY2xpZW50LT5kZXY7CisJZHNpLT5vdXRwdXQub3BzID0gJmRzaV9vcHM7CisKKwllcnIgPSB0ZWdyYV9vdXRwdXRfaW5pdCh0ZWdyYS0+ZHJtLCAmZHNpLT5vdXRwdXQpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoY2xpZW50LT5kZXYsICJvdXRwdXQgc2V0dXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfREVCVUdfRlMpKSB7CisJCWVyciA9IHRlZ3JhX2RzaV9kZWJ1Z2ZzX2luaXQoZHNpLCB0ZWdyYS0+ZHJtLT5wcmltYXJ5KTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZXJyKGRzaS0+ZGV2LCAiZGVidWdmcyBzZXR1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCX0KKworCS8qCisJICogZW5hYmxlIGhpZ2gtc3BlZWQgbW9kZSwgY2hlY2tzdW0gZ2VuZXJhdGlvbiwgRUNDIGdlbmVyYXRpb24gYW5kCisJICogZGlzYWJsZSByYXcgbW9kZQorCSAqLworCXZhbHVlID0gdGVncmFfZHNpX3JlYWRsKGRzaSwgRFNJX0hPU1RfQ09OVFJPTCk7CisJdmFsdWUgfD0gRFNJX0hPU1RfQ09OVFJPTF9FQ0MgfCBEU0lfSE9TVF9DT05UUk9MX0NTIHwKKwkJIERTSV9IT1NUX0NPTlRST0xfSFM7CisJdmFsdWUgJj0gfkRTSV9IT1NUX0NPTlRST0xfUkFXOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCB2YWx1ZSwgRFNJX0hPU1RfQ09OVFJPTCk7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1NPTF9ERUxBWSk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9NQVhfVEhSRVNIT0xEKTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfQ09OVFJPTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfREFUQV8wICsgaSk7CisJCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfREFUQV84ICsgaSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEtUX1NFUV8wX0xPICsgaSk7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0RDU19DTURTKTsKKworCWVyciA9IHRlZ3JhX2RzaV9wYWRfY2FsaWJyYXRlKGRzaSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycihkc2ktPmRldiwgIk1JUEkgY2FsaWJyYXRpb24gZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgRFNJX1BPV0VSX0NPTlRST0xfRU5BQkxFLCBEU0lfUE9XRVJfQ09OVFJPTCk7CisJdXNsZWVwX3JhbmdlKDMwMCwgMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV9kc2lfZXhpdChzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IGhvc3QxeF9jbGllbnRfdG9fZHNpKGNsaWVudCk7CisJaW50IGVycjsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpIHsKKwkJZXJyID0gdGVncmFfZHNpX2RlYnVnZnNfZXhpdChkc2kpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9lcnIoZHNpLT5kZXYsICJkZWJ1Z2ZzIGNsZWFudXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwl9CisKKwllcnIgPSB0ZWdyYV9vdXRwdXRfZGlzYWJsZSgmZHNpLT5vdXRwdXQpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoY2xpZW50LT5kZXYsICJvdXRwdXQgZmFpbGVkIHRvIGRpc2FibGU6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHRlZ3JhX291dHB1dF9leGl0KCZkc2ktPm91dHB1dCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihjbGllbnQtPmRldiwgIm91dHB1dCBjbGVhbnVwIGZhaWxlZDogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaG9zdDF4X2NsaWVudF9vcHMgZHNpX2NsaWVudF9vcHMgPSB7CisJLmluaXQgPSB0ZWdyYV9kc2lfaW5pdCwKKwkuZXhpdCA9IHRlZ3JhX2RzaV9leGl0LAorfTsKKworc3RhdGljIGludCB0ZWdyYV9kc2lfc2V0dXBfY2xvY2tzKHN0cnVjdCB0ZWdyYV9kc2kgKmRzaSkKK3sKKwlzdHJ1Y3QgY2xrICpwYXJlbnQ7CisJaW50IGVycjsKKworCXBhcmVudCA9IGNsa19nZXRfcGFyZW50KGRzaS0+Y2xrKTsKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBjbGtfc2V0X3BhcmVudChwYXJlbnQsIGRzaS0+Y2xrX3BhcmVudCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZHNpX2luaXRpYWxpemUoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQoreworCXVuc2lnbmVkIGludCBpOworCisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QT1dFUl9DT05UUk9MKTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5UX0VOQUJMRSk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9JTlRfU1RBVFVTKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0lOVF9NQVNLKTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSE9TVF9DT05UUk9MKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0NPTlRST0wpOworCisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9TT0xfREVMQVkpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfTUFYX1RIUkVTSE9MRCk7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0lOSVRfU0VRX0NPTlRST0wpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0lOSVRfU0VRX0RBVEFfMCArIGkpOworCQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0lOSVRfU0VRX0RBVEFfOCArIGkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BLVF9TRVFfMF9MTyArIGkpOworCisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9EQ1NfQ01EUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BLVF9MRU5fMF8xICsgaSk7CisKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMHgwMDAwMDAwMCwgRFNJX1BIWV9USU1JTkdfMCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDB4MDAwMDAwMDAsIERTSV9QSFlfVElNSU5HXzEpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAweDAwMDAwMGZmLCBEU0lfUEhZX1RJTUlOR18yKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMHgwMDAwMDAwMCwgRFNJX0JUQV9USU1JTkcpOworCisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9USU1FT1VUXzApOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfVElNRU9VVF8xKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1RPX1RBTExZKTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEFEX0NPTlRST0xfMCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF9DRCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ0RfU1RBVFVTKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1ZJREVPX01PREVfQ09OVFJPTCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF8xKTsKKwl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MXzIpOworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEFEX0NPTlRST0xfMyk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF80KTsKKworCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfR0FOR0VEX01PREVfQ09OVFJPTCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9HQU5HRURfTU9ERV9TVEFSVCk7CisJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9HQU5HRURfTU9ERV9TSVpFKTsKK30KKworc3RhdGljIGludCB0ZWdyYV9kc2lfaG9zdF9hdHRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkJIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgdGVncmFfZHNpICpkc2kgPSBob3N0X3RvX3RlZ3JhKGhvc3QpOworCXN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCA9ICZkc2ktPm91dHB1dDsKKworCWRzaS0+Zm9ybWF0ID0gZGV2aWNlLT5mb3JtYXQ7CisJZHNpLT5sYW5lcyA9IGRldmljZS0+bGFuZXM7CisKKwlvdXRwdXQtPnBhbmVsID0gb2ZfZHJtX2ZpbmRfcGFuZWwoZGV2aWNlLT5kZXYub2Zfbm9kZSk7CisJaWYgKG91dHB1dC0+cGFuZWwpIHsKKwkJaWYgKG91dHB1dC0+Y29ubmVjdG9yLmRldikKKwkJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChvdXRwdXQtPmNvbm5lY3Rvci5kZXYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX2RzaV9ob3N0X2RldGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJCQkgc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IGhvc3RfdG9fdGVncmEoaG9zdCk7CisJc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0ID0gJmRzaS0+b3V0cHV0OworCisJaWYgKG91dHB1dC0+cGFuZWwgJiYgJmRldmljZS0+ZGV2ID09IG91dHB1dC0+cGFuZWwtPmRldikgeworCQlpZiAob3V0cHV0LT5jb25uZWN0b3IuZGV2KQorCQkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KG91dHB1dC0+Y29ubmVjdG9yLmRldik7CisKKwkJb3V0cHV0LT5wYW5lbCA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfaG9zdF9vcHMgdGVncmFfZHNpX2hvc3Rfb3BzID0geworCS5hdHRhY2ggPSB0ZWdyYV9kc2lfaG9zdF9hdHRhY2gsCisJLmRldGFjaCA9IHRlZ3JhX2RzaV9ob3N0X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgdGVncmFfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX2RzaSAqZHNpOworCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKKwlpbnQgZXJyOworCisJZHNpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkc2kpCisJCXJldHVybiAtRU5PTUVNOworCisJZHNpLT5vdXRwdXQuZGV2ID0gZHNpLT5kZXYgPSAmcGRldi0+ZGV2OworCisJZXJyID0gdGVncmFfb3V0cHV0X3Byb2JlKCZkc2ktPm91dHB1dCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIEFzc3VtZSB0aGVzZSB2YWx1ZXMgYnkgZGVmYXVsdC4gV2hlbiBhIERTSSBwZXJpcGhlcmFsIGRyaXZlcgorCSAqIGF0dGFjaGVzIHRvIHRoZSBEU0kgaG9zdCwgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSB0YWtlbiBmcm9tCisJICogdGhlIGF0dGFjaGVkIGRldmljZS4KKwkgKi8KKwlkc2ktPmZvcm1hdCA9IE1JUElfRFNJX0ZNVF9SR0I4ODg7CisJZHNpLT5sYW5lcyA9IDQ7CisKKwlkc2ktPnJzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgImRzaSIpOworCWlmIChJU19FUlIoZHNpLT5yc3QpKQorCQlyZXR1cm4gUFRSX0VSUihkc2ktPnJzdCk7CisKKwlkc2ktPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGRzaS0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IERTSSBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRzaS0+Y2xrKTsKKwl9CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNpLT5jbGspOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBlbmFibGUgRFNJIGNsb2NrXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkc2ktPmNsa19scCA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibHAiKTsKKwlpZiAoSVNfRVJSKGRzaS0+Y2xrX2xwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGxvdy1wb3dlciBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRzaS0+Y2xrX2xwKTsKKwl9CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNpLT5jbGtfbHApOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBlbmFibGUgbG93LXBvd2VyIGNsb2NrXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkc2ktPmNsa19wYXJlbnQgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBhcmVudCIpOworCWlmIChJU19FUlIoZHNpLT5jbGtfcGFyZW50KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IHBhcmVudCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRzaS0+Y2xrX3BhcmVudCk7CisJfQorCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRzaS0+Y2xrX3BhcmVudCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGVuYWJsZSBwYXJlbnQgY2xvY2tcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHRlZ3JhX2RzaV9zZXR1cF9jbG9ja3MoZHNpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3Qgc2V0dXAgY2xvY2tzXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlkc2ktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVncyk7CisJaWYgKElTX0VSUihkc2ktPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihkc2ktPnJlZ3MpOworCisJdGVncmFfZHNpX2luaXRpYWxpemUoZHNpKTsKKworCWRzaS0+bWlwaSA9IHRlZ3JhX21pcGlfcmVxdWVzdCgmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRzaS0+bWlwaSkpCisJCXJldHVybiBQVFJfRVJSKGRzaS0+bWlwaSk7CisKKwlkc2ktPmhvc3Qub3BzID0gJnRlZ3JhX2RzaV9ob3N0X29wczsKKwlkc2ktPmhvc3QuZGV2ID0gJnBkZXYtPmRldjsKKworCWVyciA9IG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoJmRzaS0+aG9zdCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIERTSSBob3N0OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmZHNpLT5jbGllbnQubGlzdCk7CisJZHNpLT5jbGllbnQub3BzID0gJmRzaV9jbGllbnRfb3BzOworCWRzaS0+Y2xpZW50LmRldiA9ICZwZGV2LT5kZXY7CisKKwllcnIgPSBob3N0MXhfY2xpZW50X3JlZ2lzdGVyKCZkc2ktPmNsaWVudCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGhvc3QxeCBjbGllbnQ6ICVkXG4iLAorCQkJZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkc2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZHNpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnI7CisKKwllcnIgPSBob3N0MXhfY2xpZW50X3VucmVnaXN0ZXIoJmRzaS0+Y2xpZW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gdW5yZWdpc3RlciBob3N0MXggY2xpZW50OiAlZFxuIiwKKwkJCWVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJbWlwaV9kc2lfaG9zdF91bnJlZ2lzdGVyKCZkc2ktPmhvc3QpOworCXRlZ3JhX21pcGlfZnJlZShkc2ktPm1pcGkpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRzaS0+Y2xrX3BhcmVudCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRzaS0+Y2xrX2xwKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHNpLT5jbGspOworCisJZXJyID0gdGVncmFfb3V0cHV0X3JlbW92ZSgmZHNpLT5vdXRwdXQpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1vdmUgb3V0cHV0OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZHNpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMTQtZHNpIiwgfSwKKwl7IH0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX2RzaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGVncmEtZHNpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdGVncmFfZHNpX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gdGVncmFfZHNpX3Byb2JlLAorCS5yZW1vdmUgPSB0ZWdyYV9kc2lfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuaCBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU3OWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBEUk1fVEVHUkFfRFNJX0gKKyNkZWZpbmUgRFJNX1RFR1JBX0RTSV9ICisKKyNkZWZpbmUgRFNJX0lOQ1JfU1lOQ1BUCQkJMHgwMAorI2RlZmluZSBEU0lfSU5DUl9TWU5DUFRfQ09OVFJPTAkJMHgwMQorI2RlZmluZSBEU0lfSU5DUl9TWU5DUFRfRVJST1IJCTB4MDIKKyNkZWZpbmUgRFNJX0NUWFNXCQkJMHgwOAorI2RlZmluZSBEU0lfUkRfREFUQQkJCTB4MDkKKyNkZWZpbmUgRFNJX1dSX0RBVEEJCQkweDBhCisjZGVmaW5lIERTSV9QT1dFUl9DT05UUk9MCQkweDBiCisjZGVmaW5lIERTSV9QT1dFUl9DT05UUk9MX0VOQUJMRQkoMSA8PCAwKQorI2RlZmluZSBEU0lfSU5UX0VOQUJMRQkJCTB4MGMKKyNkZWZpbmUgRFNJX0lOVF9TVEFUVVMJCQkweDBkCisjZGVmaW5lIERTSV9JTlRfTUFTSwkJCTB4MGUKKyNkZWZpbmUgRFNJX0hPU1RfQ09OVFJPTAkJMHgwZgorI2RlZmluZSBEU0lfSE9TVF9DT05UUk9MX1JBVwkJKDEgPDwgNikKKyNkZWZpbmUgRFNJX0hPU1RfQ09OVFJPTF9IUwkJKDEgPDwgNSkKKyNkZWZpbmUgRFNJX0hPU1RfQ09OVFJPTF9CVEEJCSgxIDw8IDIpCisjZGVmaW5lIERTSV9IT1NUX0NPTlRST0xfQ1MJCSgxIDw8IDEpCisjZGVmaW5lIERTSV9IT1NUX0NPTlRST0xfRUNDCQkoMSA8PCAwKQorI2RlZmluZSBEU0lfQ09OVFJPTAkJCTB4MTAKKyNkZWZpbmUgRFNJX0NPTlRST0xfSFNfQ0xLX0NUUkwJCSgxIDw8IDIwKQorI2RlZmluZSBEU0lfQ09OVFJPTF9DSEFOTkVMKGMpCQkoKChjKSAmIDB4MykgPDwgMTYpCisjZGVmaW5lIERTSV9DT05UUk9MX0ZPUk1BVChmKQkJKCgoZikgJiAweDMpIDw8IDEyKQorI2RlZmluZSBEU0lfQ09OVFJPTF9UWF9UUklHKHgpCQkoKCh4KSAmIDB4MykgPDwgIDgpCisjZGVmaW5lIERTSV9DT05UUk9MX0xBTkVTKG4pCQkoKChuKSAmIDB4MykgPDwgIDQpCisjZGVmaW5lIERTSV9DT05UUk9MX0RDU19FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIERTSV9DT05UUk9MX1NPVVJDRShzKQkJKCgocykgJiAweDEpIDw8ICAyKQorI2RlZmluZSBEU0lfQ09OVFJPTF9WSURFT19FTkFCTEUJKDEgPDwgMSkKKyNkZWZpbmUgRFNJX0NPTlRST0xfSE9TVF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIERTSV9TT0xfREVMQVkJCQkweDExCisjZGVmaW5lIERTSV9NQVhfVEhSRVNIT0xECQkweDEyCisjZGVmaW5lIERTSV9UUklHR0VSCQkJMHgxMworI2RlZmluZSBEU0lfVFhfQ1JDCQkJMHgxNAorI2RlZmluZSBEU0lfU1RBVFVTCQkJMHgxNQorI2RlZmluZSBEU0lfU1RBVFVTX0lETEUJCQkoMSA8PCAxMCkKKyNkZWZpbmUgRFNJX0lOSVRfU0VRX0NPTlRST0wJCTB4MWEKKyNkZWZpbmUgRFNJX0lOSVRfU0VRX0RBVEFfMAkJMHgxYgorI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV8xCQkweDFjCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzIJCTB4MWQKKyNkZWZpbmUgRFNJX0lOSVRfU0VRX0RBVEFfMwkJMHgxZQorI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV80CQkweDFmCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzUJCTB4MjAKKyNkZWZpbmUgRFNJX0lOSVRfU0VRX0RBVEFfNgkJMHgyMQorI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV83CQkweDIyCisjZGVmaW5lIERTSV9QS1RfU0VRXzBfTE8JCTB4MjMKKyNkZWZpbmUgRFNJX1BLVF9TRVFfMF9ISQkJMHgyNAorI2RlZmluZSBEU0lfUEtUX1NFUV8xX0xPCQkweDI1CisjZGVmaW5lIERTSV9QS1RfU0VRXzFfSEkJCTB4MjYKKyNkZWZpbmUgRFNJX1BLVF9TRVFfMl9MTwkJMHgyNworI2RlZmluZSBEU0lfUEtUX1NFUV8yX0hJCQkweDI4CisjZGVmaW5lIERTSV9QS1RfU0VRXzNfTE8JCTB4MjkKKyNkZWZpbmUgRFNJX1BLVF9TRVFfM19ISQkJMHgyYQorI2RlZmluZSBEU0lfUEtUX1NFUV80X0xPCQkweDJiCisjZGVmaW5lIERTSV9QS1RfU0VRXzRfSEkJCTB4MmMKKyNkZWZpbmUgRFNJX1BLVF9TRVFfNV9MTwkJMHgyZAorI2RlZmluZSBEU0lfUEtUX1NFUV81X0hJCQkweDJlCisjZGVmaW5lIERTSV9EQ1NfQ01EUwkJCTB4MzMKKyNkZWZpbmUgRFNJX1BLVF9MRU5fMF8xCQkJMHgzNAorI2RlZmluZSBEU0lfUEtUX0xFTl8yXzMJCQkweDM1CisjZGVmaW5lIERTSV9QS1RfTEVOXzRfNQkJCTB4MzYKKyNkZWZpbmUgRFNJX1BLVF9MRU5fNl83CQkJMHgzNworI2RlZmluZSBEU0lfUEhZX1RJTUlOR18wCQkweDNjCisjZGVmaW5lIERTSV9QSFlfVElNSU5HXzEJCTB4M2QKKyNkZWZpbmUgRFNJX1BIWV9USU1JTkdfMgkJMHgzZQorI2RlZmluZSBEU0lfQlRBX1RJTUlORwkJCTB4M2YKKworI2RlZmluZSBEU0lfVElNSU5HX0ZJRUxEKHZhbHVlLCBwZXJpb2QsIGh3aW5jKSBcCisJKChESVZfUk9VTkRfQ0xPU0VTVCh2YWx1ZSwgcGVyaW9kKSAtIChod2luYykpICYgMHhmZikKKworI2RlZmluZSBEU0lfVElNRU9VVF8wCQkJMHg0NAorI2RlZmluZSBEU0lfVElNRU9VVF9MUlgoeCkJCSgoKHgpICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgRFNJX1RJTUVPVVRfSFRYKHgpCQkoKCh4KSAmIDB4ZmZmZikgPDwgIDApCisjZGVmaW5lIERTSV9USU1FT1VUXzEJCQkweDQ1CisjZGVmaW5lIERTSV9USU1FT1VUX1BSKHgpCQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIERTSV9USU1FT1VUX1RBKHgpCQkoKCh4KSAmIDB4ZmZmZikgPDwgIDApCisjZGVmaW5lIERTSV9UT19UQUxMWQkJCTB4NDYKKyNkZWZpbmUgRFNJX1RBTExZX1RBKHgpCQkJKCgoeCkgJiAweGZmKSA8PCAxNikKKyNkZWZpbmUgRFNJX1RBTExZX0xSWCh4KQkJKCgoeCkgJiAweGZmKSA8PCAgOCkKKyNkZWZpbmUgRFNJX1RBTExZX0hUWCh4KQkJKCgoeCkgJiAweGZmKSA8PCAgMCkKKyNkZWZpbmUgRFNJX1BBRF9DT05UUk9MXzAJCTB4NGIKKyNkZWZpbmUgRFNJX1BBRF9DT05UUk9MX1ZTMV9QRElPKHgpCSgoKHgpICYgMHhmKSA8PCAgMCkKKyNkZWZpbmUgRFNJX1BBRF9DT05UUk9MX1ZTMV9QRElPX0NMSwkoMSA8PCAgOCkKKyNkZWZpbmUgRFNJX1BBRF9DT05UUk9MX1ZTMV9QVUxMRE4oeCkJKCgoeCkgJiAweGYpIDw8IDE2KQorI2RlZmluZSBEU0lfUEFEX0NPTlRST0xfVlMxX1BVTExETl9DTEsJKDEgPDwgMjQpCisjZGVmaW5lIERTSV9QQURfQ09OVFJPTF9DRAkJMHg0YworI2RlZmluZSBEU0lfUEFEX0NEX1NUQVRVUwkJMHg0ZAorI2RlZmluZSBEU0lfVklERU9fTU9ERV9DT05UUk9MCQkweDRlCisjZGVmaW5lIERTSV9QQURfQ09OVFJPTF8xCQkweDRmCisjZGVmaW5lIERTSV9QQURfQ09OVFJPTF8yCQkweDUwCisjZGVmaW5lIERTSV9QQURfT1VUX0NMSyh4KQkJKCgoeCkgJiAweDcpIDw8ICAwKQorI2RlZmluZSBEU0lfUEFEX0xQX0ROKHgpCQkoKCh4KSAmIDB4NykgPDwgIDQpCisjZGVmaW5lIERTSV9QQURfTFBfVVAoeCkJCSgoKHgpICYgMHg3KSA8PCAgOCkKKyNkZWZpbmUgRFNJX1BBRF9TTEVXX0ROKHgpCQkoKCh4KSAmIDB4NykgPDwgMTIpCisjZGVmaW5lIERTSV9QQURfU0xFV19VUCh4KQkJKCgoeCkgJiAweDcpIDw8IDE2KQorI2RlZmluZSBEU0lfUEFEX0NPTlRST0xfMwkJMHg1MQorI2RlZmluZSBEU0lfUEFEX0NPTlRST0xfNAkJMHg1MgorI2RlZmluZSBEU0lfR0FOR0VEX01PREVfQ09OVFJPTAkJMHg1MworI2RlZmluZSBEU0lfR0FOR0VEX01PREVfU1RBUlQJCTB4NTQKKyNkZWZpbmUgRFNJX0dBTkdFRF9NT0RFX1NJWkUJCTB4NTUKKyNkZWZpbmUgRFNJX1JBV19EQVRBX0JZVEVfQ09VTlQJCTB4NTYKKyNkZWZpbmUgRFNJX1VMVFJBX0xPV19QT1dFUl9DT05UUk9MCTB4NTcKKyNkZWZpbmUgRFNJX0lOSVRfU0VRX0RBVEFfOAkJMHg1OAorI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV85CQkweDU5CisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzEwCQkweDVhCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzExCQkweDViCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzEyCQkweDVjCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzEzCQkweDVkCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzE0CQkweDVlCisjZGVmaW5lIERTSV9JTklUX1NFUV9EQVRBXzE1CQkweDVmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYwppbmRleCBhMzgzNWU3Li5mN2ZjYTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYwpAQCAtMTgsMTAgKzE4LDEyIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IHRlZ3JhX2ZiLCBiYXNlKTsKIH0KIAorI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX2ZiZGV2ICp0b190ZWdyYV9mYmRldihzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyKQogewogCXJldHVybiBjb250YWluZXJfb2YoaGVscGVyLCBzdHJ1Y3QgdGVncmFfZmJkZXYsIGJhc2UpOwogfQorI2VuZGlmCiAKIHN0cnVjdCB0ZWdyYV9ibyAqdGVncmFfZmJfZ2V0X3BsYW5lKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCkBAIC05OCw4ICsxMDAsMTAgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmYi0+cGxhbmVzID0ga3phbGxvYyhudW1fcGxhbmVzICogc2l6ZW9mKCpwbGFuZXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZiLT5wbGFuZXMpCisJaWYgKCFmYi0+cGxhbmVzKSB7CisJCWtmcmVlKGZiKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJZmItPm51bV9wbGFuZXMgPSBudW1fcGxhbmVzOwogCkBAIC0xNzIsNiArMTc2LDcgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCisjaWZkZWYgQ09ORklHX0RSTV9URUdSQV9GQkRFVgogc3RhdGljIHN0cnVjdCBmYl9vcHMgdGVncmFfZmJfb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5mYl9maWxscmVjdCA9IHN5c19maWxscmVjdCwKQEAgLTMzOSw2ICszNDQsMTUgQEAKIAlrZnJlZShmYmRldik7CiB9CiAKK3ZvaWQgdGVncmFfZmJkZXZfcmVzdG9yZV9tb2RlKHN0cnVjdCB0ZWdyYV9mYmRldiAqZmJkZXYpCit7CisJaWYgKGZiZGV2KSB7CisJCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGZiZGV2LT5iYXNlLmRldik7CisJCWRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlKCZmYmRldi0+YmFzZSk7CisJCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZmJkZXYtPmJhc2UuZGV2KTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHRlZ3JhX2ZiX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKIAlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRybS0+ZGV2X3ByaXZhdGU7CkBAIC0zNDYsMTYgKzM2MCwyMCBAQAogCWlmICh0ZWdyYS0+ZmJkZXYpCiAJCWRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudCgmdGVncmEtPmZiZGV2LT5iYXNlKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyB0ZWdyYV9kcm1fbW9kZV9mdW5jcyA9IHsKIAkuZmJfY3JlYXRlID0gdGVncmFfZmJfY3JlYXRlLAorI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIAkub3V0cHV0X3BvbGxfY2hhbmdlZCA9IHRlZ3JhX2ZiX291dHB1dF9wb2xsX2NoYW5nZWQsCisjZW5kaWYKIH07CiAKIGludCB0ZWdyYV9kcm1fZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogeworI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIAlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRybS0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHRlZ3JhX2ZiZGV2ICpmYmRldjsKKyNlbmRpZgogCiAJZHJtLT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSAwOwogCWRybS0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7CkBAIC0zNjUsMjggKzM4MywyMSBAQAogCiAJZHJtLT5tb2RlX2NvbmZpZy5mdW5jcyA9ICZ0ZWdyYV9kcm1fbW9kZV9mdW5jczsKIAotCWZiZGV2ID0gdGVncmFfZmJkZXZfY3JlYXRlKGRybSwgMzIsIGRybS0+bW9kZV9jb25maWcubnVtX2NydGMsCi0JCQkJICAgZHJtLT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yKTsKLQlpZiAoSVNfRVJSKGZiZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIoZmJkZXYpOwotCi0JdGVncmEtPmZiZGV2ID0gZmJkZXY7CisjaWZkZWYgQ09ORklHX0RSTV9URUdSQV9GQkRFVgorCXRlZ3JhLT5mYmRldiA9IHRlZ3JhX2ZiZGV2X2NyZWF0ZShkcm0sIDMyLCBkcm0tPm1vZGVfY29uZmlnLm51bV9jcnRjLAorCQkJCQkgIGRybS0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3Rvcik7CisJaWYgKElTX0VSUih0ZWdyYS0+ZmJkZXYpKQorCQlyZXR1cm4gUFRSX0VSUih0ZWdyYS0+ZmJkZXYpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCB0ZWdyYV9kcm1fZmJfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogeworI2lmZGVmIENPTkZJR19EUk1fVEVHUkFfRkJERVYKIAlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRybS0+ZGV2X3ByaXZhdGU7CiAKIAl0ZWdyYV9mYmRldl9mcmVlKHRlZ3JhLT5mYmRldik7Ci19Ci0KLXZvaWQgdGVncmFfZmJkZXZfcmVzdG9yZV9tb2RlKHN0cnVjdCB0ZWdyYV9mYmRldiAqZmJkZXYpCi17Ci0JaWYgKGZiZGV2KSB7Ci0JCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGZiZGV2LT5iYXNlLmRldik7Ci0JCWRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlKCZmYmRldi0+YmFzZSk7Ci0JCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZmJkZXYtPmJhc2UuZGV2KTsKLQl9CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uYwppbmRleCAyOGE5Y2JjLi5lZjg1M2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dlbS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+CiAjaW5jbHVkZSA8ZHJtL3RlZ3JhX2RybS5oPgogCiAjaW5jbHVkZSAiZ2VtLmgiCkBAIC04Myw3ICs4NCw3IEBACiAJcmV0dXJuIGJvOwogfQogCi1jb25zdCBzdHJ1Y3QgaG9zdDF4X2JvX29wcyB0ZWdyYV9ib19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhvc3QxeF9ib19vcHMgdGVncmFfYm9fb3BzID0gewogCS5nZXQgPSB0ZWdyYV9ib19nZXQsCiAJLnB1dCA9IHRlZ3JhX2JvX3B1dCwKIAkucGluID0gdGVncmFfYm9fcGluLApAQCAtMTQ1LDcgKzE0Niw2IEBACiAJa2ZyZWUoYm8pOwogCiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQogfQogCiBzdHJ1Y3QgdGVncmFfYm8gKnRlZ3JhX2JvX2NyZWF0ZV93aXRoX2hhbmRsZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCkBAIC0xNzQsMTMgKzE3NCw4NyBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKK3N0cnVjdCB0ZWdyYV9ibyAqdGVncmFfYm9faW1wb3J0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBkbWFfYnVmICpidWYpCit7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoOworCXN0cnVjdCB0ZWdyYV9ibyAqYm87CisJc3NpemVfdCBzaXplOworCWludCBlcnI7CisKKwlibyA9IGt6YWxsb2Moc2l6ZW9mKCpibyksIEdGUF9LRVJORUwpOworCWlmICghYm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaG9zdDF4X2JvX2luaXQoJmJvLT5iYXNlLCAmdGVncmFfYm9fb3BzKTsKKwlzaXplID0gcm91bmRfdXAoYnVmLT5zaXplLCBQQUdFX1NJWkUpOworCisJZXJyID0gZHJtX2dlbV9vYmplY3RfaW5pdChkcm0sICZiby0+Z2VtLCBzaXplKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmcmVlOworCisJZXJyID0gZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoJmJvLT5nZW0pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHJlbGVhc2U7CisKKwlhdHRhY2ggPSBkbWFfYnVmX2F0dGFjaChidWYsIGRybS0+ZGV2KTsKKwlpZiAoSVNfRVJSKGF0dGFjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihhdHRhY2gpOworCQlnb3RvIGZyZWVfbW1hcDsKKwl9CisKKwlnZXRfZG1hX2J1ZihidWYpOworCisJYm8tPnNndCA9IGRtYV9idWZfbWFwX2F0dGFjaG1lbnQoYXR0YWNoLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoIWJvLT5zZ3QpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkZXRhY2g7CisJfQorCisJaWYgKElTX0VSUihiby0+c2d0KSkgeworCQllcnIgPSBQVFJfRVJSKGJvLT5zZ3QpOworCQlnb3RvIGRldGFjaDsKKwl9CisKKwlpZiAoYm8tPnNndC0+bmVudHMgPiAxKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZGV0YWNoOworCX0KKworCWJvLT5wYWRkciA9IHNnX2RtYV9hZGRyZXNzKGJvLT5zZ3QtPnNnbCk7CisJYm8tPmdlbS5pbXBvcnRfYXR0YWNoID0gYXR0YWNoOworCisJcmV0dXJuIGJvOworCitkZXRhY2g6CisJaWYgKCFJU19FUlJfT1JfTlVMTChiby0+c2d0KSkKKwkJZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGF0dGFjaCwgYm8tPnNndCwgRE1BX1RPX0RFVklDRSk7CisKKwlkbWFfYnVmX2RldGFjaChidWYsIGF0dGFjaCk7CisJZG1hX2J1Zl9wdXQoYnVmKTsKK2ZyZWVfbW1hcDoKKwlkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoJmJvLT5nZW0pOworcmVsZWFzZToKKwlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKCZiby0+Z2VtKTsKK2ZyZWU6CisJa2ZyZWUoYm8pOworCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKwogdm9pZCB0ZWdyYV9ib19mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbSkKIHsKIAlzdHJ1Y3QgdGVncmFfYm8gKmJvID0gdG9fdGVncmFfYm8oZ2VtKTsKIAorCWlmIChnZW0tPmltcG9ydF9hdHRhY2gpIHsKKwkJZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGdlbS0+aW1wb3J0X2F0dGFjaCwgYm8tPnNndCwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlkcm1fcHJpbWVfZ2VtX2Rlc3Ryb3koZ2VtLCBOVUxMKTsKKwl9IGVsc2UgeworCQl0ZWdyYV9ib19kZXN0cm95KGdlbS0+ZGV2LCBibyk7CisJfQorCiAJZHJtX2dlbV9mcmVlX21tYXBfb2Zmc2V0KGdlbSk7CiAJZHJtX2dlbV9vYmplY3RfcmVsZWFzZShnZW0pOwotCXRlZ3JhX2JvX2Rlc3Ryb3koZ2VtLT5kZXYsIGJvKTsKIAogCWtmcmVlKGJvKTsKIH0KQEAgLTI1NiwzICszMzAsMTA2IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitzdGF0aWMgc3RydWN0IHNnX3RhYmxlICoKK3RlZ3JhX2dlbV9wcmltZV9tYXBfZG1hX2J1ZihzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2gsCisJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtID0gYXR0YWNoLT5kbWFidWYtPnByaXY7CisJc3RydWN0IHRlZ3JhX2JvICpibyA9IHRvX3RlZ3JhX2JvKGdlbSk7CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisKKwlzZ3QgPSBrbWFsbG9jKHNpemVvZigqc2d0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZ3QpCisJCXJldHVybiBOVUxMOworCisJaWYgKHNnX2FsbG9jX3RhYmxlKHNndCwgMSwgR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUoc2d0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2dfZG1hX2FkZHJlc3Moc2d0LT5zZ2wpID0gYm8tPnBhZGRyOworCXNnX2RtYV9sZW4oc2d0LT5zZ2wpID0gZ2VtLT5zaXplOworCisJcmV0dXJuIHNndDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ2VtX3ByaW1lX3VubWFwX2RtYV9idWYoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoLAorCQkJCQkgIHN0cnVjdCBzZ190YWJsZSAqc2d0LAorCQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzZ19mcmVlX3RhYmxlKHNndCk7CisJa2ZyZWUoc2d0KTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ2VtX3ByaW1lX3JlbGVhc2Uoc3RydWN0IGRtYV9idWYgKmJ1ZikKK3sKKwlkcm1fZ2VtX2RtYWJ1Zl9yZWxlYXNlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkICp0ZWdyYV9nZW1fcHJpbWVfa21hcF9hdG9taWMoc3RydWN0IGRtYV9idWYgKmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ2VtX3ByaW1lX2t1bm1hcF9hdG9taWMoc3RydWN0IGRtYV9idWYgKmJ1ZiwKKwkJCQkJICB1bnNpZ25lZCBsb25nIHBhZ2UsCisJCQkJCSAgdm9pZCAqYWRkcikKK3sKK30KKworc3RhdGljIHZvaWQgKnRlZ3JhX2dlbV9wcmltZV9rbWFwKHN0cnVjdCBkbWFfYnVmICpidWYsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ2VtX3ByaW1lX2t1bm1hcChzdHJ1Y3QgZG1hX2J1ZiAqYnVmLCB1bnNpZ25lZCBsb25nIHBhZ2UsCisJCQkJICAgdm9pZCAqYWRkcikKK3sKK30KKworc3RhdGljIGludCB0ZWdyYV9nZW1fcHJpbWVfbW1hcChzdHJ1Y3QgZG1hX2J1ZiAqYnVmLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWFfYnVmX29wcyB0ZWdyYV9nZW1fcHJpbWVfZG1hYnVmX29wcyA9IHsKKwkubWFwX2RtYV9idWYgPSB0ZWdyYV9nZW1fcHJpbWVfbWFwX2RtYV9idWYsCisJLnVubWFwX2RtYV9idWYgPSB0ZWdyYV9nZW1fcHJpbWVfdW5tYXBfZG1hX2J1ZiwKKwkucmVsZWFzZSA9IHRlZ3JhX2dlbV9wcmltZV9yZWxlYXNlLAorCS5rbWFwX2F0b21pYyA9IHRlZ3JhX2dlbV9wcmltZV9rbWFwX2F0b21pYywKKwkua3VubWFwX2F0b21pYyA9IHRlZ3JhX2dlbV9wcmltZV9rdW5tYXBfYXRvbWljLAorCS5rbWFwID0gdGVncmFfZ2VtX3ByaW1lX2ttYXAsCisJLmt1bm1hcCA9IHRlZ3JhX2dlbV9wcmltZV9rdW5tYXAsCisJLm1tYXAgPSB0ZWdyYV9nZW1fcHJpbWVfbW1hcCwKK307CisKK3N0cnVjdCBkbWFfYnVmICp0ZWdyYV9nZW1fcHJpbWVfZXhwb3J0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtLAorCQkJCSAgICAgICBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGRtYV9idWZfZXhwb3J0KGdlbSwgJnRlZ3JhX2dlbV9wcmltZV9kbWFidWZfb3BzLCBnZW0tPnNpemUsCisJCQkgICAgICBmbGFncyk7Cit9CisKK3N0cnVjdCBkcm1fZ2VtX29iamVjdCAqdGVncmFfZ2VtX3ByaW1lX2ltcG9ydChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAorCQkJCQkgICAgICBzdHJ1Y3QgZG1hX2J1ZiAqYnVmKQoreworCXN0cnVjdCB0ZWdyYV9ibyAqYm87CisKKwlpZiAoYnVmLT5vcHMgPT0gJnRlZ3JhX2dlbV9wcmltZV9kbWFidWZfb3BzKSB7CisJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtID0gYnVmLT5wcml2OworCisJCWlmIChnZW0tPmRldiA9PSBkcm0pIHsKKwkJCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZShnZW0pOworCQkJcmV0dXJuIGdlbTsKKwkJfQorCX0KKworCWJvID0gdGVncmFfYm9faW1wb3J0KGRybSwgYnVmKTsKKwlpZiAoSVNfRVJSKGJvKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGJvKTsKKworCXJldHVybiAmYm8tPmdlbTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uaAppbmRleCA3Njc0MDAwLi5mZmQ0Zjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ2VtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dlbS5oCkBAIC0zMSw2ICszMSw3IEBACiAJc3RydWN0IGRybV9nZW1fb2JqZWN0IGdlbTsKIAlzdHJ1Y3QgaG9zdDF4X2JvIGJhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKIAlkbWFfYWRkcl90IHBhZGRyOwogCXZvaWQgKnZhZGRyOwogfTsKQEAgLTQwLDggKzQxLDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGdlbSwgc3RydWN0IHRlZ3JhX2JvLCBnZW0pOwogfQogCi1leHRlcm4gY29uc3Qgc3RydWN0IGhvc3QxeF9ib19vcHMgdGVncmFfYm9fb3BzOwotCiBzdHJ1Y3QgdGVncmFfYm8gKnRlZ3JhX2JvX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBzdHJ1Y3QgdGVncmFfYm8gKnRlZ3JhX2JvX2NyZWF0ZV93aXRoX2hhbmRsZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCkBAIC01OSw0ICs1OCwxMCBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHRlZ3JhX2JvX3ZtX29wczsKIAorc3RydWN0IGRtYV9idWYgKnRlZ3JhX2dlbV9wcmltZV9leHBvcnQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwkJCQkgICAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0sCisJCQkJICAgICAgIGludCBmbGFncyk7CitzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnRlZ3JhX2dlbV9wcmltZV9pbXBvcnQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwkJCQkJICAgICAgc3RydWN0IGRtYV9idWYgKmJ1Zik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9oZG1pLmMKaW5kZXggN2Y2MjUzZS4uNjkyODAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvaGRtaS5jCkBAIC00MCw2ICs0MCw3IEBACiAJc3RydWN0IGhvc3QxeF9jbGllbnQgY2xpZW50OwogCXN0cnVjdCB0ZWdyYV9vdXRwdXQgb3V0cHV0OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlib29sIGVuYWJsZWQ7CiAKIAlzdHJ1Y3QgcmVndWxhdG9yICp2ZGQ7CiAJc3RydWN0IHJlZ3VsYXRvciAqcGxsOwpAQCAtMzc5LDcgKzM4MCw3IEBACiAKIAkJaWYgKGYgPiA5NjAwMCkKIAkJCWRlbHRhID0gMjsKLQkJZWxzZSBpZiAoZiA+IDQ4MDAwMCkKKwkJZWxzZSBpZiAoZiA+IDQ4MDAwKQogCQkJZGVsdGEgPSA2OwogCQllbHNlCiAJCQlkZWx0YSA9IDk7CkBAIC02OTksNiArNzAwLDkgQEAKIAlpbnQgcmV0cmllcyA9IDEwMDA7CiAJaW50IGVycjsKIAorCWlmIChoZG1pLT5lbmFibGVkKQorCQlyZXR1cm4gMDsKKwogCWhkbWktPmR2aSA9ICF0ZWdyYV9vdXRwdXRfaXNfaGRtaShvdXRwdXQpOwogCiAJcGNsayA9IG1vZGUtPmNsb2NrICogMTAwMDsKQEAgLTgzOSwxMCArODQzLDYgQEAKIAl2YWx1ZSB8PSBTT1JfQ1NUTV9ST1RDTEsoMik7CiAJdGVncmFfaGRtaV93cml0ZWwoaGRtaSwgdmFsdWUsIEhETUlfTlZfUERJU1BfU09SX0NTVE0pOwogCi0JdGVncmFfZGNfd3JpdGVsKGRjLCBESVNQX0NUUkxfTU9ERV9TVE9QLCBEQ19DTURfRElTUExBWV9DT01NQU5EKTsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCBHRU5FUkFMX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKLQogCS8qIHN0YXJ0IFNPUiAqLwogCXRlZ3JhX2hkbWlfd3JpdGVsKGhkbWksCiAJCQkgIFNPUl9QV1JfTk9STUFMX1NUQVRFX1BVIHwKQEAgLTg5MiwzMSArODkyLDY3IEBACiAJCQkgIEhETUlfTlZfUERJU1BfU09SX1NUQVRFMSk7CiAJdGVncmFfaGRtaV93cml0ZWwoaGRtaSwgMCwgSERNSV9OVl9QRElTUF9TT1JfU1RBVEUwKTsKIAotCXRlZ3JhX2RjX3dyaXRlbChkYywgSERNSV9FTkFCTEUsIERDX0RJU1BfRElTUF9XSU5fT1BUSU9OUyk7CisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfRElTUF9ESVNQX1dJTl9PUFRJT05TKTsKKwl2YWx1ZSB8PSBIRE1JX0VOQUJMRTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOwogCi0JdmFsdWUgPSBQVzBfRU5BQkxFIHwgUFcxX0VOQUJMRSB8IFBXMl9FTkFCTEUgfCBQVzNfRU5BQkxFIHwKLQkJUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOwotCi0JdmFsdWUgPSBESVNQX0NUUkxfTU9ERV9DX0RJU1BMQVk7CisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJdmFsdWUgJj0gfkRJU1BfQ1RSTF9NT0RFX01BU0s7CisJdmFsdWUgfD0gRElTUF9DVFJMX01PREVfQ19ESVNQTEFZOwogCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX0NPTU1BTkQpOwogCisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisJdmFsdWUgfD0gUFcwX0VOQUJMRSB8IFBXMV9FTkFCTEUgfCBQVzJfRU5BQkxFIHwgUFczX0VOQUJMRSB8CisJCSBQVzRfRU5BQkxFIHwgUE0wX0VOQUJMRSB8IFBNMV9FTkFCTEU7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisKIAl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CiAJdGVncmFfZGNfd3JpdGVsKGRjLCBHRU5FUkFMX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKIAogCS8qIFRPRE86IGFkZCBIRENQIHN1cHBvcnQgKi8KIAorCWhkbWktPmVuYWJsZWQgPSB0cnVlOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGVncmFfb3V0cHV0X2hkbWlfZGlzYWJsZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCiB7CisJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKG91dHB1dC0+ZW5jb2Rlci5jcnRjKTsKIAlzdHJ1Y3QgdGVncmFfaGRtaSAqaGRtaSA9IHRvX2hkbWkob3V0cHV0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJaWYgKCFoZG1pLT5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBhY2Nlc3NlcyByZWdpc3RlcnMgb2YgdGhlIGRpc3BsYXkgY29udHJvbGxlciwgc28gbWFrZQorCSAqIHN1cmUgaXQncyBvbmx5IGV4ZWN1dGVkIHdoZW4gdGhlIG91dHB1dCBpcyBhdHRhY2hlZCB0byBvbmUuCisJICovCisJaWYgKGRjKSB7CisJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOworCQl2YWx1ZSAmPSB+KFBXMF9FTkFCTEUgfCBQVzFfRU5BQkxFIHwgUFcyX0VOQUJMRSB8IFBXM19FTkFCTEUgfAorCQkJICAgUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFKTsKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisKKwkJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJCXZhbHVlICY9IH5ESVNQX0NUUkxfTU9ERV9NQVNLOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9DT01NQU5EKTsKKworCQl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOworCQl2YWx1ZSAmPSB+SERNSV9FTkFCTEU7CisJCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfRElTUF9XSU5fT1BUSU9OUyk7CisKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCBHRU5FUkFMX0FDVF9SRVEgPDwgOCwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCX0KIAogCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhkbWktPnJzdCk7CiAJY2xrX2Rpc2FibGUoaGRtaS0+Y2xrKTsKIAlyZWd1bGF0b3JfZGlzYWJsZShoZG1pLT5wbGwpOwogCisJaGRtaS0+ZW5hYmxlZCA9IGZhbHNlOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MCw3ICs5OTYsNyBAQAogCXBhcmVudCA9IGNsa19nZXRfcGFyZW50KGhkbWktPmNsa19wYXJlbnQpOwogCiAJZXJyID0gY2xrX3JvdW5kX3JhdGUocGFyZW50LCBwY2xrICogNCk7Ci0JaWYgKGVyciA8IDApCisJaWYgKGVyciA8PSAwKQogCQkqc3RhdHVzID0gTU9ERV9OT0NMT0NLOwogCWVsc2UKIAkJKnN0YXR1cyA9IE1PREVfT0s7CkBAIC0xMzgyLDkgKzE0MTgsNiBAQAogCQlyZXR1cm4gZXJyOwogCiAJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZWdzKQotCQlyZXR1cm4gLUVOWElPOwotCiAJaGRtaS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZWdzKTsKIAlpZiAoSVNfRVJSKGhkbWktPnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihoZG1pLT5yZWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9taXBpLXBoeS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL21pcGktcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjNGFlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9taXBpLXBoeS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJtaXBpLXBoeS5oIgorCisvKgorICogRGVmYXVsdCBELVBIWSB0aW1pbmdzIGJhc2VkIG9uIE1JUEkgRC1QSFkgc3BlY2lmaWNhdGlvbi4gRGVyaXZlZCBmcm9tCisgKiB0aGUgdmFsaWQgcmFuZ2VzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDUuOSBvZiB0aGUgRC1QSFkgc3BlY2lmaWNhdGlvbgorICogd2l0aCBtaW5vciBhZGp1c3RtZW50cy4KKyAqLworaW50IG1pcGlfZHBoeV90aW1pbmdfZ2V0X2RlZmF1bHQoc3RydWN0IG1pcGlfZHBoeV90aW1pbmcgKnRpbWluZywKKwkJCQkgdW5zaWduZWQgbG9uZyBwZXJpb2QpCit7CisJdGltaW5nLT5jbGttaXNzID0gMDsKKwl0aW1pbmctPmNsa3Bvc3QgPSA3MCArIDUyICogcGVyaW9kOworCXRpbWluZy0+Y2xrcHJlID0gODsKKwl0aW1pbmctPmNsa3ByZXBhcmUgPSA2NTsKKwl0aW1pbmctPmNsa3NldHRsZSA9IDk1OworCXRpbWluZy0+Y2xrdGVybWVuID0gMDsKKwl0aW1pbmctPmNsa3RyYWlsID0gODA7CisJdGltaW5nLT5jbGt6ZXJvID0gMjYwOworCXRpbWluZy0+ZHRlcm1lbiA9IDA7CisJdGltaW5nLT5lb3QgPSAwOworCXRpbWluZy0+aHNleGl0ID0gMTIwOworCXRpbWluZy0+aHNwcmVwYXJlID0gNjUgKyA1ICogcGVyaW9kOworCXRpbWluZy0+aHN6ZXJvID0gMTQ1ICsgNSAqIHBlcmlvZDsKKwl0aW1pbmctPmhzc2V0dGxlID0gODUgKyA2ICogcGVyaW9kOworCXRpbWluZy0+aHNza2lwID0gNDA7CisJdGltaW5nLT5oc3RyYWlsID0gbWF4KDggKiBwZXJpb2QsIDYwICsgNCAqIHBlcmlvZCk7CisJdGltaW5nLT5pbml0ID0gMTAwMDAwOworCXRpbWluZy0+bHB4ID0gNjA7CisJdGltaW5nLT50YWdldCA9IDUgKiB0aW1pbmctPmxweDsKKwl0aW1pbmctPnRhZ28gPSA0ICogdGltaW5nLT5scHg7CisJdGltaW5nLT50YXN1cmUgPSAyICogdGltaW5nLT5scHg7CisJdGltaW5nLT53YWtldXAgPSAxMDAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSBELVBIWSB0aW1pbmcgYWNjb3JkaW5nIHRvIE1JUEkgQWxsaWFuY2UgU3BlY2lmaWNhdGlvbiBmb3IgRC1QSFksCisgKiBTZWN0aW9uIDUuOSAiR2xvYmFsIE9wZXJhdGlvbiBUaW1pbmcgUGFyYW1ldGVycyIuCisgKi8KK2ludCBtaXBpX2RwaHlfdGltaW5nX3ZhbGlkYXRlKHN0cnVjdCBtaXBpX2RwaHlfdGltaW5nICp0aW1pbmcsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHBlcmlvZCkKK3sKKwlpZiAodGltaW5nLT5jbGttaXNzID4gNjApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+Y2xrcG9zdCA8ICg2MCArIDUyICogcGVyaW9kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5jbGtwcmUgPCA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aW1pbmctPmNsa3ByZXBhcmUgPCAzOCB8fCB0aW1pbmctPmNsa3ByZXBhcmUgPiA5NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5jbGtzZXR0bGUgPCA5NSB8fCB0aW1pbmctPmNsa3NldHRsZSA+IDMwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5jbGt0ZXJtZW4gPiAzOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5jbGt0cmFpbCA8IDYwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aW1pbmctPmNsa3ByZXBhcmUgKyB0aW1pbmctPmNsa3plcm8gPCAzMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+ZHRlcm1lbiA+IDM1ICsgNCAqIHBlcmlvZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5lb3QgPiAxMDUgKyAxMiAqIHBlcmlvZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5oc2V4aXQgPCAxMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+aHNwcmVwYXJlIDwgNDAgKyA0ICogcGVyaW9kIHx8CisJICAgIHRpbWluZy0+aHNwcmVwYXJlID4gODUgKyA2ICogcGVyaW9kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aW1pbmctPmhzcHJlcGFyZSArIHRpbWluZy0+aHN6ZXJvIDwgMTQ1ICsgMTAgKiBwZXJpb2QpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh0aW1pbmctPmhzc2V0dGxlIDwgODUgKyA2ICogcGVyaW9kKSB8fAorCSAgICAodGltaW5nLT5oc3NldHRsZSA+IDE0NSArIDEwICogcGVyaW9kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5oc3NraXAgPCA0MCB8fCB0aW1pbmctPmhzc2tpcCA+IDU1ICsgNCAqIHBlcmlvZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5oc3RyYWlsIDwgbWF4KDggKiBwZXJpb2QsIDYwICsgNCAqIHBlcmlvZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+aW5pdCA8IDEwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT5scHggPCA1MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltaW5nLT50YWdldCAhPSA1ICogdGltaW5nLT5scHgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+dGFnbyAhPSA0ICogdGltaW5nLT5scHgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+dGFzdXJlIDwgdGltaW5nLT5scHggfHwgdGltaW5nLT50YXN1cmUgPiAyICogdGltaW5nLT5scHgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZy0+d2FrZXVwIDwgMTAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9taXBpLXBoeS5oIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL21pcGktcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1OTE2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9taXBpLXBoeS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTlZJRElBIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAorICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIERSTV9URUdSQV9NSVBJX1BIWV9ICisjZGVmaW5lIERSTV9URUdSQV9NSVBJX1BIWV9ICisKKy8qCisgKiBELVBIWSB0aW1pbmcgcGFyYW1ldGVycworICoKKyAqIEEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgZm91bmQgaW4gdGhlICBNSVBJCisgKiBBbGxpYW5jZSBTcGVjaWZpY2F0aW9uIGZvciBELVBIWSwgU2VjdGlvbiA1LjkgIkdsb2JhbCBPcGVyYXRpb24gVGltaW5nCisgKiBQYXJhbWV0ZXJzIi4KKyAqCisgKiBBbGwgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGluIG5hbm9zZWNvbmRzLgorICovCitzdHJ1Y3QgbWlwaV9kcGh5X3RpbWluZyB7CisJdW5zaWduZWQgaW50IGNsa21pc3M7CisJdW5zaWduZWQgaW50IGNsa3Bvc3Q7CisJdW5zaWduZWQgaW50IGNsa3ByZTsKKwl1bnNpZ25lZCBpbnQgY2xrcHJlcGFyZTsKKwl1bnNpZ25lZCBpbnQgY2xrc2V0dGxlOworCXVuc2lnbmVkIGludCBjbGt0ZXJtZW47CisJdW5zaWduZWQgaW50IGNsa3RyYWlsOworCXVuc2lnbmVkIGludCBjbGt6ZXJvOworCXVuc2lnbmVkIGludCBkdGVybWVuOworCXVuc2lnbmVkIGludCBlb3Q7CisJdW5zaWduZWQgaW50IGhzZXhpdDsKKwl1bnNpZ25lZCBpbnQgaHNwcmVwYXJlOworCXVuc2lnbmVkIGludCBoc3plcm87CisJdW5zaWduZWQgaW50IGhzc2V0dGxlOworCXVuc2lnbmVkIGludCBoc3NraXA7CisJdW5zaWduZWQgaW50IGhzdHJhaWw7CisJdW5zaWduZWQgaW50IGluaXQ7CisJdW5zaWduZWQgaW50IGxweDsKKwl1bnNpZ25lZCBpbnQgdGFnZXQ7CisJdW5zaWduZWQgaW50IHRhZ287CisJdW5zaWduZWQgaW50IHRhc3VyZTsKKwl1bnNpZ25lZCBpbnQgd2FrZXVwOworfTsKKworaW50IG1pcGlfZHBoeV90aW1pbmdfZ2V0X2RlZmF1bHQoc3RydWN0IG1pcGlfZHBoeV90aW1pbmcgKnRpbWluZywKKwkJCQkgdW5zaWduZWQgbG9uZyBwZXJpb2QpOworaW50IG1pcGlfZHBoeV90aW1pbmdfdmFsaWRhdGUoc3RydWN0IG1pcGlfZHBoeV90aW1pbmcgKnRpbWluZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGVyaW9kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvb3V0cHV0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvb3V0cHV0LmMKaW5kZXggMmNiMDA2NS4uNTdjZWNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL291dHB1dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9vdXRwdXQuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KIAorI2luY2x1ZGUgPGRybS9kcm1fcGFuZWwuaD4KICNpbmNsdWRlICJkcm0uaCIKIAogc3RhdGljIGludCB0ZWdyYV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xNyw2ICsxOCwxNiBAQAogCXN0cnVjdCBlZGlkICplZGlkID0gTlVMTDsKIAlpbnQgZXJyID0gMDsKIAorCS8qCisJICogSWYgdGhlIHBhbmVsIHByb3ZpZGVzIG9uZSBvciBtb3JlIG1vZGVzLCB1c2UgdGhlbSBleGNsdXNpdmVseSBhbmQKKwkgKiBpZ25vcmUgYW55IG90aGVyIG1lYW5zIG9mIG9idGFpbmluZyBhIG1vZGUuCisJICovCisJaWYgKG91dHB1dC0+cGFuZWwpIHsKKwkJZXJyID0gb3V0cHV0LT5wYW5lbC0+ZnVuY3MtPmdldF9tb2RlcyhvdXRwdXQtPnBhbmVsKTsKKwkJaWYgKGVyciA+IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWlmIChvdXRwdXQtPmVkaWQpCiAJCWVkaWQgPSBrbWVtZHVwKG91dHB1dC0+ZWRpZCwgc2l6ZW9mKCplZGlkKSwgR0ZQX0tFUk5FTCk7CiAJZWxzZSBpZiAob3V0cHV0LT5kZGMpCkBAIC03Miw2ICs4MywxMSBAQAogCQllbHNlCiAJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAl9IGVsc2UgeworCQlpZiAoIW91dHB1dC0+cGFuZWwpCisJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJZWxzZQorCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisKIAkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpCiAJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAl9CkBAIC0xMTUsNiArMTMxLDE2IEBACiAKIHN0YXRpYyB2b2lkIHRlZ3JhX2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQogeworCXN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCA9IGVuY29kZXJfdG9fb3V0cHV0KGVuY29kZXIpOworCXN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsID0gb3V0cHV0LT5wYW5lbDsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJZHJtX3BhbmVsX2Rpc2FibGUocGFuZWwpOworCQl0ZWdyYV9vdXRwdXRfZGlzYWJsZShvdXRwdXQpOworCX0gZWxzZSB7CisJCXRlZ3JhX291dHB1dF9lbmFibGUob3V0cHV0KTsKKwkJZHJtX3BhbmVsX2VuYWJsZShwYW5lbCk7CisJfQogfQogCiBzdGF0aWMgYm9vbCB0ZWdyYV9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLApAQCAtMTYzLDE0ICsxODksMjIgQEAKIAogaW50IHRlZ3JhX291dHB1dF9wcm9iZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkZGMsICpwYW5lbDsKIAllbnVtIG9mX2dwaW9fZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkZGM7Ci0Jc2l6ZV90IHNpemU7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBzaXplOwogCiAJaWYgKCFvdXRwdXQtPm9mX25vZGUpCiAJCW91dHB1dC0+b2Zfbm9kZSA9IG91dHB1dC0+ZGV2LT5vZl9ub2RlOwogCisJcGFuZWwgPSBvZl9wYXJzZV9waGFuZGxlKG91dHB1dC0+b2Zfbm9kZSwgIm52aWRpYSxwYW5lbCIsIDApOworCWlmIChwYW5lbCkgeworCQlvdXRwdXQtPnBhbmVsID0gb2ZfZHJtX2ZpbmRfcGFuZWwocGFuZWwpOworCQlpZiAoIW91dHB1dC0+cGFuZWwpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCQlvZl9ub2RlX3B1dChwYW5lbCk7CisJfQorCiAJb3V0cHV0LT5lZGlkID0gb2ZfZ2V0X3Byb3BlcnR5KG91dHB1dC0+b2Zfbm9kZSwgIm52aWRpYSxlZGlkIiwgJnNpemUpOwogCiAJZGRjID0gb2ZfcGFyc2VfcGhhbmRsZShvdXRwdXQtPm9mX25vZGUsICJudmlkaWEsZGRjLWkyYy1idXMiLCAwKTsKQEAgLTE4NSw5ICsyMTksNiBAQAogCQlvZl9ub2RlX3B1dChkZGMpOwogCX0KIAotCWlmICghb3V0cHV0LT5lZGlkICYmICFvdXRwdXQtPmRkYykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlvdXRwdXQtPmhwZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3Mob3V0cHV0LT5vZl9ub2RlLAogCQkJCQkJICAgIm52aWRpYSxocGQtZ3BpbyIsIDAsCiAJCQkJCQkgICAmZmxhZ3MpOwpAQCAtMjU2LDYgKzI4NywxMSBAQAogCQllbmNvZGVyID0gRFJNX01PREVfRU5DT0RFUl9UTURTOwogCQlicmVhazsKIAorCWNhc2UgVEVHUkFfT1VUUFVUX0RTSToKKwkJY29ubmVjdG9yID0gRFJNX01PREVfQ09OTkVDVE9SX0RTSTsKKwkJZW5jb2RlciA9IERSTV9NT0RFX0VOQ09ERVJfRFNJOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWNvbm5lY3RvciA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOwogCQllbmNvZGVyID0gRFJNX01PREVfRU5DT0RFUl9OT05FOwpAQCAtMjY3LDYgKzMwMyw5IEBACiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZvdXRwdXQtPmNvbm5lY3RvciwgJmNvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwogCW91dHB1dC0+Y29ubmVjdG9yLmRwbXMgPSBEUk1fTU9ERV9EUE1TX09GRjsKIAorCWlmIChvdXRwdXQtPnBhbmVsKQorCQlkcm1fcGFuZWxfYXR0YWNoKG91dHB1dC0+cGFuZWwsICZvdXRwdXQtPmNvbm5lY3Rvcik7CisKIAlkcm1fZW5jb2Rlcl9pbml0KGRybSwgJm91dHB1dC0+ZW5jb2RlciwgJmVuY29kZXJfZnVuY3MsIGVuY29kZXIpOwogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJm91dHB1dC0+ZW5jb2RlciwgJmVuY29kZXJfaGVscGVyX2Z1bmNzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3JnYi5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3JnYi5jCmluZGV4IDNiMjkwMTguLjMzOGY3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9yZ2IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvcmdiLmMKQEAgLTg3LDE1ICs4Nyw2MCBAQAogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfcmdiX2VuYWJsZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCiB7CiAJc3RydWN0IHRlZ3JhX3JnYiAqcmdiID0gdG9fcmdiKG91dHB1dCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAogCXRlZ3JhX2RjX3dyaXRlX3JlZ3MocmdiLT5kYywgcmdiX2VuYWJsZSwgQVJSQVlfU0laRShyZ2JfZW5hYmxlKSk7CiAKKwl2YWx1ZSA9IERFX1NFTEVDVF9BQ1RJVkUgfCBERV9DT05UUk9MX05PUk1BTDsKKwl0ZWdyYV9kY193cml0ZWwocmdiLT5kYywgdmFsdWUsIERDX0RJU1BfREFUQV9FTkFCTEVfT1BUSU9OUyk7CisKKwkvKiBYWFg6IHBhcmFtZXRlcml6ZT8gKi8KKwl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKHJnYi0+ZGMsIERDX0NPTV9QSU5fT1VUUFVUX1BPTEFSSVRZKDEpKTsKKwl2YWx1ZSAmPSB+TFZTX09VVFBVVF9QT0xBUklUWV9MT1c7CisJdmFsdWUgJj0gfkxIU19PVVRQVVRfUE9MQVJJVFlfTE9XOworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCB2YWx1ZSwgRENfQ09NX1BJTl9PVVRQVVRfUE9MQVJJVFkoMSkpOworCisJLyogWFhYOiBwYXJhbWV0ZXJpemU/ICovCisJdmFsdWUgPSBESVNQX0RBVEFfRk9STUFUX0RGMVAxQyB8IERJU1BfQUxJR05NRU5UX01TQiB8CisJCURJU1BfT1JERVJfUkVEX0JMVUU7CisJdGVncmFfZGNfd3JpdGVsKHJnYi0+ZGMsIHZhbHVlLCBEQ19ESVNQX0RJU1BfSU5URVJGQUNFX0NPTlRST0wpOworCisJLyogWFhYOiBwYXJhbWV0ZXJpemU/ICovCisJdmFsdWUgPSBTQzBfSF9RVUFMSUZJRVJfTk9ORSB8IFNDMV9IX1FVQUxJRklFUl9OT05FOworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCB2YWx1ZSwgRENfRElTUF9TSElGVF9DTE9DS19PUFRJT05TKTsKKworCXZhbHVlID0gdGVncmFfZGNfcmVhZGwocmdiLT5kYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJdmFsdWUgJj0gfkRJU1BfQ1RSTF9NT0RFX01BU0s7CisJdmFsdWUgfD0gRElTUF9DVFJMX01PREVfQ19ESVNQTEFZOworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisKKwl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKHJnYi0+ZGMsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOworCXZhbHVlIHw9IFBXMF9FTkFCTEUgfCBQVzFfRU5BQkxFIHwgUFcyX0VOQUJMRSB8IFBXM19FTkFCTEUgfAorCQkgUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFOworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisKKwl0ZWdyYV9kY193cml0ZWwocmdiLT5kYywgR0VORVJBTF9BQ1RfUkVRIDw8IDgsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKKwl0ZWdyYV9kY193cml0ZWwocmdiLT5kYywgR0VORVJBTF9BQ1RfUkVRLCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfcmdiX2Rpc2FibGUoc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0KQogewogCXN0cnVjdCB0ZWdyYV9yZ2IgKnJnYiA9IHRvX3JnYihvdXRwdXQpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKHJnYi0+ZGMsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOworCXZhbHVlICY9IH4oUFcwX0VOQUJMRSB8IFBXMV9FTkFCTEUgfCBQVzJfRU5BQkxFIHwgUFczX0VOQUJMRSB8CisJCSAgIFBXNF9FTkFCTEUgfCBQTTBfRU5BQkxFIHwgUE0xX0VOQUJMRSk7CisJdGVncmFfZGNfd3JpdGVsKHJnYi0+ZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9QT1dFUl9DT05UUk9MKTsKKworCXZhbHVlID0gdGVncmFfZGNfcmVhZGwocmdiLT5kYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CisJdmFsdWUgJj0gfkRJU1BfQ1RSTF9NT0RFX01BU0s7CisJdGVncmFfZGNfd3JpdGVsKHJnYi0+ZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9DT01NQU5EKTsKKworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCBHRU5FUkFMX0FDVF9SRVEgPDwgOCwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCXRlZ3JhX2RjX3dyaXRlbChyZ2ItPmRjLCBHRU5FUkFMX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKIAogCXRlZ3JhX2RjX3dyaXRlX3JlZ3MocmdiLT5kYywgcmdiX2Rpc2FibGUsIEFSUkFZX1NJWkUocmdiX2Rpc2FibGUpKTsKIApAQCAtMjEzLDcgKzI1OCw3IEBACiAJICogUkdCIG91dHB1dHMgYXJlIGFuIGV4Y2VwdGlvbiwgc28gd2UgbWFrZSBzdXJlIHRoZXkgY2FuIGJlIGF0dGFjaGVkCiAJICogdG8gb25seSB0aGVpciBwYXJlbnQgZGlzcGxheSBjb250cm9sbGVyLgogCSAqLwotCXJnYi0+b3V0cHV0LmVuY29kZXIucG9zc2libGVfY3J0Y3MgPSAxIDw8IGRjLT5waXBlOworCXJnYi0+b3V0cHV0LmVuY29kZXIucG9zc2libGVfY3J0Y3MgPSBkcm1fY3J0Y19tYXNrKCZkYy0+YmFzZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90aWxjZGMvdGlsY2RjX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3RpbGNkYy90aWxjZGNfZHJ2LmMKaW5kZXggMTE2ZGExOS4uMTcxYTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RpbGNkYy90aWxjZGNfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RpbGNkYy90aWxjZGNfZHJ2LmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCWRybV9mYmRldl9jbWFfcmVzdG9yZV9tb2RlKHByaXYtPmZiZGV2KTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHRpbGNkY19pcnEoRFJNX0lSUV9BUkdTKQorc3RhdGljIGlycXJldHVybl90IHRpbGNkY19pcnEoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhcmc7CiAJc3RydWN0IHRpbGNkY19kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC00NDQsNyArNDQ0LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwotCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCBkZXYtPm1tX3ByaXZhdGUpOworCXJldHVybiBkcm1fbW1fZHVtcF90YWJsZShtLCAmZGV2LT52bWFfb2Zmc2V0X21hbmFnZXItPnZtX2FkZHJfc3BhY2VfbW0pOwogfQogCiBzdGF0aWMgc3RydWN0IGRybV9pbmZvX2xpc3QgdGlsY2RjX2RlYnVnZnNfbGlzdFtdID0gewpAQCAtNTk0LDcgKzU5NCw3IEBACiAKIHN0YXRpYyBpbnQgdGlsY2RjX3BkZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JZHJtX3BsYXRmb3JtX2V4aXQoJnRpbGNkY19kcml2ZXIsIHBkZXYpOworCWRybV9wdXRfZGV2KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKaW5kZXggMDdlMDJjNC4uYTA2NjUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCkBAIC05NTcsNyArOTU3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wodHRtX2JvX21lbV9zcGFjZSk7CiAKLWludCB0dG1fYm9fbW92ZV9idWZmZXIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKK3N0YXRpYyBpbnQgdHRtX2JvX21vdmVfYnVmZmVyKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCiAJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAogCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLAogCQkJYm9vbCBub193YWl0X2dwdSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwppbmRleCA0MDYxNTIxLi4xZGY4NTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAl9CiB9CiAKLWludCB0dG1fbWVtX3JlZ19pb3JlbWFwKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSwKK3N0YXRpYyBpbnQgdHRtX21lbV9yZWdfaW9yZW1hcChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCiAJCQl2b2lkICoqdmlydHVhbCkKIHsKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtLT5tZW1fdHlwZV07CkBAIC0yMTksNyArMjE5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB0dG1fbWVtX3JlZ19pb3VubWFwKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSwKK3N0YXRpYyB2b2lkIHR0bV9tZW1fcmVnX2lvdW5tYXAoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtLAogCQkJIHZvaWQgKnZpcnR1YWwpCiB7CiAJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW47CkBAIC01OTQsNyArNTk0LDcgQEAKIAlpZiAoc3RhcnRfcGFnZSA+IGJvLT5udW1fcGFnZXMpCiAJCXJldHVybiAtRUlOVkFMOwogI2lmIDAKLQlpZiAobnVtX3BhZ2VzID4gMSAmJiAhRFJNX1NVU0VSKERSTV9DVVJQUk9DKSkKKwlpZiAobnVtX3BhZ2VzID4gMSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKICNlbmRpZgogCSh2b2lkKSB0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYwppbmRleCA2NDQwZWVhLi44MDEyMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMKQEAgLTEzMiw2ICsxMzIsMTUgQEAKIAkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKIAl9CiAKKwkvKgorCSAqIFJlZnVzZSB0byBmYXVsdCBpbXBvcnRlZCBwYWdlcy4gVGhpcyBzaG91bGQgYmUgaGFuZGxlZAorCSAqIChpZiBhdCBhbGwpIGJ5IHJlZGlyZWN0aW5nIG1tYXAgdG8gdGhlIGV4cG9ydGVyLgorCSAqLworCWlmIChiby0+dHRtICYmIChiby0+dHRtLT5wYWdlX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19TRykpIHsKKwkJcmV0dmFsID0gVk1fRkFVTFRfU0lHQlVTOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJaWYgKGJkZXYtPmRyaXZlci0+ZmF1bHRfcmVzZXJ2ZV9ub3RpZnkpIHsKIAkJcmV0ID0gYmRldi0+ZHJpdmVyLT5mYXVsdF9yZXNlcnZlX25vdGlmeShibyk7CiAJCXN3aXRjaCAocmV0KSB7CkBAIC0yMTcsMTAgKzIyNiwxNyBAQAogCQkJfSBlbHNlIGlmICh1bmxpa2VseSghcGFnZSkpIHsKIAkJCQlicmVhazsKIAkJCX0KKwkJCXBhZ2UtPm1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZzsKKwkJCXBhZ2UtPmluZGV4ID0gZHJtX3ZtYV9ub2RlX3N0YXJ0KCZiby0+dm1hX25vZGUpICsKKwkJCQlwYWdlX29mZnNldDsKIAkJCXBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UpOwogCQl9CiAKLQkJcmV0ID0gdm1faW5zZXJ0X21peGVkKCZjdm1hLCBhZGRyZXNzLCBwZm4pOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01JWEVETUFQKQorCQkJcmV0ID0gdm1faW5zZXJ0X21peGVkKCZjdm1hLCBhZGRyZXNzLCBwZm4pOworCQllbHNlCisJCQlyZXQgPSB2bV9pbnNlcnRfcGZuKCZjdm1hLCBhZGRyZXNzLCBwZm4pOworCiAJCS8qCiAJCSAqIFNvbWVib2R5IGJlYXQgdXMgdG8gdGhpcyBQVEUgb3IgcHJlZmF1bHRpbmcgdG8KIAkJICogYW4gYWxyZWFkeSBwb3B1bGF0ZWQgUFRFLCBvciBwcmVmYXVsdGluZyBlcnJvci4KQEAgLTI1MCw2ICsyNjYsOCBAQAogCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPQogCSAgICAoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICopdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKKwlXQVJOX09OKGJvLT5iZGV2LT5kZXZfbWFwcGluZyAhPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZyk7CisKIAkodm9pZCl0dG1fYm9fcmVmZXJlbmNlKGJvKTsKIH0KIApAQCAtMzE5LDcgKzMzNywxNCBAQAogCSAqLwogCiAJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBibzsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fTUlYRURNQVAgfCBWTV9ET05URVhQQU5EIHwgVk1fRE9OVERVTVA7CisKKwkvKgorCSAqIFBGTk1BUCBpcyBmYXN0ZXIgdGhhbiBNSVhFRE1BUCBkdWUgdG8gcmVkdWNlZCBwYWdlCisJICogYWRtaW5pc3RyYXRpb24uIFNvIHVzZSBNSVhFRE1BUCBvbmx5IGlmIHByaXZhdGUgVk1BLCB3aGVyZQorCSAqIHdlIG5lZWQgdG8gc3VwcG9ydCBDT1cuCisJICovCisJdm1hLT52bV9mbGFncyB8PSAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgPyBWTV9QRk5NQVAgOiBWTV9NSVhFRE1BUDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fRE9OVEVYUEFORCB8IFZNX0RPTlREVU1QOwogCXJldHVybiAwOwogb3V0X3VucmVmOgogCXR0bV9ib191bnJlZigmYm8pOwpAQCAtMzM0LDcgKzM1OSw4IEBACiAKIAl2bWEtPnZtX29wcyA9ICZ0dG1fYm9fdm1fb3BzOwogCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdHRtX2JvX3JlZmVyZW5jZShibyk7Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX01JWEVETUFQIHwgVk1fRE9OVEVYUEFORDsKKwl2bWEtPnZtX2ZsYWdzIHw9ICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSA/IFZNX1BGTk1BUCA6IFZNX01JWEVETUFQOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9ET05URVhQQU5EOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh0dG1fZmJkZXZfbW1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9sb2NrLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9sb2NrLmMKaW5kZXggM2RhYTlhMy4uNmE5NTQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fbG9jay5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2xvY2suYwpAQCAtMTg2LDE0ICsxODYsNiBAQAogfQogRVhQT1JUX1NZTUJPTCh0dG1fd3JpdGVfbG9jayk7CiAKLXZvaWQgdHRtX3dyaXRlX2xvY2tfZG93bmdyYWRlKHN0cnVjdCB0dG1fbG9jayAqbG9jaykKLXsKLQlzcGluX2xvY2soJmxvY2stPmxvY2spOwotCWxvY2stPnJ3ID0gMTsKLQl3YWtlX3VwX2FsbCgmbG9jay0+cXVldWUpOwotCXNwaW5fdW5sb2NrKCZsb2NrLT5sb2NrKTsKLX0KLQogc3RhdGljIGludCBfX3R0bV92dF91bmxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKQogewogCWludCByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9vYmplY3QuYwppbmRleCA2ZmU3YjkyLi41M2I1MWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9vYmplY3QuYwpAQCAtNjgsNyArNjgsNyBAQAogCiBzdHJ1Y3QgdHRtX29iamVjdF9maWxlIHsKIAlzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UgKnRkZXY7Ci0Jcndsb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCByZWZfbGlzdDsKIAlzdHJ1Y3QgZHJtX29wZW5faGFzaCByZWZfaGFzaFtUVE1fUkVGX05VTV07CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CkBAIC0xMTgsNiArMTE4LDcgQEAKICAqLwogCiBzdHJ1Y3QgdHRtX3JlZl9vYmplY3QgeworCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKIAlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwpAQCAtMjEwLDEwICsyMTEsOSBAQAogCSAqIGNhbGxfcmN1KCkgb3IgdHRtX2Jhc2Vfb2JqZWN0X2tmcmVlKCkuCiAJICovCiAKLQlpZiAoYmFzZS0+cmVmY291bnRfcmVsZWFzZSkgewotCQl0dG1fb2JqZWN0X2ZpbGVfdW5yZWYoJmJhc2UtPnRmaWxlKTsKKwl0dG1fb2JqZWN0X2ZpbGVfdW5yZWYoJmJhc2UtPnRmaWxlKTsKKwlpZiAoYmFzZS0+cmVmY291bnRfcmVsZWFzZSkKIAkJYmFzZS0+cmVmY291bnRfcmVsZWFzZSgmYmFzZSk7Ci0JfQogfQogCiB2b2lkIHR0bV9iYXNlX29iamVjdF91bnJlZihzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoqcF9iYXNlKQpAQCAtMjI5LDMzICsyMjksNDcgQEAKIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKnR0bV9iYXNlX29iamVjdF9sb29rdXAoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCiAJCQkJCSAgICAgICB1aW50MzJfdCBrZXkpCiB7Ci0Jc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICp0ZGV2ID0gdGZpbGUtPnRkZXY7Ci0Jc3RydWN0IHR0bV9iYXNlX29iamVjdCAqdW5pbml0aWFsaXplZF92YXIoYmFzZSk7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSA9IE5VTEw7CiAJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0ID0gJnRmaWxlLT5yZWZfaGFzaFtUVE1fUkVGX1VTQUdFXTsKIAlpbnQgcmV0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXJldCA9IGRybV9odF9maW5kX2l0ZW1fcmN1KCZ0ZGV2LT5vYmplY3RfaGFzaCwga2V5LCAmaGFzaCk7CisJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbV9yY3UoaHQsIGtleSwgJmhhc2gpOwogCiAJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKLQkJYmFzZSA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QsIGhhc2gpOwotCQlyZXQgPSBrcmVmX2dldF91bmxlc3NfemVybygmYmFzZS0+cmVmY291bnQpID8gMCA6IC1FSU5WQUw7CisJCWJhc2UgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgdHRtX3JlZl9vYmplY3QsIGhhc2gpLT5vYmo7CisJCWlmICgha3JlZl9nZXRfdW5sZXNzX3plcm8oJmJhc2UtPnJlZmNvdW50KSkKKwkJCWJhc2UgPSBOVUxMOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKHRmaWxlICE9IGJhc2UtPnRmaWxlICYmICFiYXNlLT5zaGFyZWFibGUpIHsKLQkJcHJfZXJyKCJBdHRlbXB0ZWQgYWNjZXNzIG9mIG5vbi1zaGFyZWFibGUgb2JqZWN0XG4iKTsKLQkJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZiYXNlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJcmV0dXJuIGJhc2U7CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9iYXNlX29iamVjdF9sb29rdXApOwogCitzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoKK3R0bV9iYXNlX29iamVjdF9sb29rdXBfZm9yX3JlZihzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UgKnRkZXYsIHVpbnQzMl90IGtleSkKK3sKKwlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQgPSAmdGRldi0+b2JqZWN0X2hhc2g7CisJaW50IHJldDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXQgPSBkcm1faHRfZmluZF9pdGVtX3JjdShodCwga2V5LCAmaGFzaCk7CisKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQliYXNlID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IHR0bV9iYXNlX29iamVjdCwgaGFzaCk7CisJCWlmICgha3JlZl9nZXRfdW5sZXNzX3plcm8oJmJhc2UtPnJlZmNvdW50KSkKKwkJCWJhc2UgPSBOVUxMOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBiYXNlOworfQorRVhQT1JUX1NZTUJPTCh0dG1fYmFzZV9vYmplY3RfbG9va3VwX2Zvcl9yZWYpOworCiBpbnQgdHRtX3JlZl9vYmplY3RfYWRkKHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkgICAgICAgc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSwKIAkJICAgICAgIGVudW0gdHRtX3JlZl90eXBlIHJlZl90eXBlLCBib29sICpleGlzdGVkKQpAQCAtMjY2LDIxICsyODAsMjUgQEAKIAlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gdGZpbGUtPnRkZXYtPm1lbV9nbG9iOwogCWludCByZXQgPSAtRUlOVkFMOwogCisJaWYgKGJhc2UtPnRmaWxlICE9IHRmaWxlICYmICFiYXNlLT5zaGFyZWFibGUpCisJCXJldHVybiAtRVBFUk07CisKIAlpZiAoZXhpc3RlZCAhPSBOVUxMKQogCQkqZXhpc3RlZCA9IHRydWU7CiAKIAl3aGlsZSAocmV0ID09IC1FSU5WQUwpIHsKLQkJcmVhZF9sb2NrKCZ0ZmlsZS0+bG9jayk7Ci0JCXJldCA9IGRybV9odF9maW5kX2l0ZW0oaHQsIGJhc2UtPmhhc2gua2V5LCAmaGFzaCk7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbV9yY3UoaHQsIGJhc2UtPmhhc2gua2V5LCAmaGFzaCk7CiAKIAkJaWYgKHJldCA9PSAwKSB7CiAJCQlyZWYgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgdHRtX3JlZl9vYmplY3QsIGhhc2gpOwotCQkJa3JlZl9nZXQoJnJlZi0+a3JlZik7Ci0JCQlyZWFkX3VubG9jaygmdGZpbGUtPmxvY2spOwotCQkJYnJlYWs7CisJCQlpZiAoa3JlZl9nZXRfdW5sZXNzX3plcm8oJnJlZi0+a3JlZikpIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCi0JCXJlYWRfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXQgPSB0dG1fbWVtX2dsb2JhbF9hbGxvYyhtZW1fZ2xvYiwgc2l6ZW9mKCpyZWYpLAogCQkJCQkgICBmYWxzZSwgZmFsc2UpOwogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMjk3LDE5ICszMTUsMTkgQEAKIAkJcmVmLT5yZWZfdHlwZSA9IHJlZl90eXBlOwogCQlrcmVmX2luaXQoJnJlZi0+a3JlZik7CiAKLQkJd3JpdGVfbG9jaygmdGZpbGUtPmxvY2spOwotCQlyZXQgPSBkcm1faHRfaW5zZXJ0X2l0ZW0oaHQsICZyZWYtPmhhc2gpOworCQlzcGluX2xvY2soJnRmaWxlLT5sb2NrKTsKKwkJcmV0ID0gZHJtX2h0X2luc2VydF9pdGVtX3JjdShodCwgJnJlZi0+aGFzaCk7CiAKIAkJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKIAkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+aGVhZCwgJnRmaWxlLT5yZWZfbGlzdCk7CiAJCQlrcmVmX2dldCgmYmFzZS0+cmVmY291bnQpOwotCQkJd3JpdGVfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisJCQlzcGluX3VubG9jaygmdGZpbGUtPmxvY2spOwogCQkJaWYgKGV4aXN0ZWQgIT0gTlVMTCkKIAkJCQkqZXhpc3RlZCA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIAotCQl3cml0ZV91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnRmaWxlLT5sb2NrKTsKIAkJQlVHX09OKHJldCAhPSAtRUlOVkFMKTsKIAogCQl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBzaXplb2YoKnJlZikpOwpAQCAtMzMwLDE3ICszNDgsMTcgQEAKIAlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gdGZpbGUtPnRkZXYtPm1lbV9nbG9iOwogCiAJaHQgPSAmdGZpbGUtPnJlZl9oYXNoW3JlZi0+cmVmX3R5cGVdOwotCSh2b2lkKWRybV9odF9yZW1vdmVfaXRlbShodCwgJnJlZi0+aGFzaCk7CisJKHZvaWQpZHJtX2h0X3JlbW92ZV9pdGVtX3JjdShodCwgJnJlZi0+aGFzaCk7CiAJbGlzdF9kZWwoJnJlZi0+aGVhZCk7Ci0Jd3JpdGVfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnRmaWxlLT5sb2NrKTsKIAogCWlmIChyZWYtPnJlZl90eXBlICE9IFRUTV9SRUZfVVNBR0UgJiYgYmFzZS0+cmVmX29ial9yZWxlYXNlKQogCQliYXNlLT5yZWZfb2JqX3JlbGVhc2UoYmFzZSwgcmVmLT5yZWZfdHlwZSk7CiAKIAl0dG1fYmFzZV9vYmplY3RfdW5yZWYoJnJlZi0+b2JqKTsKIAl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBzaXplb2YoKnJlZikpOwotCWtmcmVlKHJlZik7Ci0Jd3JpdGVfbG9jaygmdGZpbGUtPmxvY2spOworCWtmcmVlX3JjdShyZWYsIHJjdV9oZWFkKTsKKwlzcGluX2xvY2soJnRmaWxlLT5sb2NrKTsKIH0KIAogaW50IHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCkBAIC0zNTEsMTUgKzM2OSwxNSBAQAogCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCWludCByZXQ7CiAKLQl3cml0ZV9sb2NrKCZ0ZmlsZS0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0ZmlsZS0+bG9jayk7CiAJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbShodCwga2V5LCAmaGFzaCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQl3cml0ZV91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnRmaWxlLT5sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJlZiA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCB0dG1fcmVmX29iamVjdCwgaGFzaCk7CiAJa3JlZl9wdXQoJnJlZi0+a3JlZiwgdHRtX3JlZl9vYmplY3RfcmVsZWFzZSk7Ci0Jd3JpdGVfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnRmaWxlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZik7CkBAIC0zNzIsNyArMzkwLDcgQEAKIAlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9ICpwX3RmaWxlOwogCiAJKnBfdGZpbGUgPSBOVUxMOwotCXdyaXRlX2xvY2soJnRmaWxlLT5sb2NrKTsKKwlzcGluX2xvY2soJnRmaWxlLT5sb2NrKTsKIAogCS8qCiAJICogU2luY2Ugd2UgcmVsZWFzZSB0aGUgbG9jayB3aXRoaW4gdGhlIGxvb3AsIHdlIGhhdmUgdG8KQEAgLTM4OCw3ICs0MDYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBUVE1fUkVGX05VTTsgKytpKQogCQlkcm1faHRfcmVtb3ZlKCZ0ZmlsZS0+cmVmX2hhc2hbaV0pOwogCi0Jd3JpdGVfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnRmaWxlLT5sb2NrKTsKIAl0dG1fb2JqZWN0X2ZpbGVfdW5yZWYoJnRmaWxlKTsKIH0KIEVYUE9SVF9TWU1CT0wodHRtX29iamVjdF9maWxlX3JlbGVhc2UpOwpAQCAtNDA0LDcgKzQyMiw3IEBACiAJaWYgKHVubGlrZWx5KHRmaWxlID09IE5VTEwpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJ3bG9ja19pbml0KCZ0ZmlsZS0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRmaWxlLT5sb2NrKTsKIAl0ZmlsZS0+dGRldiA9IHRkZXY7CiAJa3JlZl9pbml0KCZ0ZmlsZS0+cmVmY291bnQpOwogCUlOSVRfTElTVF9IRUFEKCZ0ZmlsZS0+cmVmX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKaW5kZXggMjEwZDUwMy4uNzVmMzE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCkBAIC0xNzAsOSArMTcwLDggQEAKIAkJdHRtX3R0X3VuYmluZCh0dG0pOwogCX0KIAotCWlmICh0dG0tPnN0YXRlID09IHR0X3VuYm91bmQpIHsKLQkJdHRtLT5iZGV2LT5kcml2ZXItPnR0bV90dF91bnBvcHVsYXRlKHR0bSk7Ci0JfQorCWlmICh0dG0tPnN0YXRlID09IHR0X3VuYm91bmQpCisJCXR0bV90dF91bnBvcHVsYXRlKHR0bSk7CiAKIAlpZiAoISh0dG0tPnBhZ2VfZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX1BFUlNJU1RFTlRfU1dBUCkgJiYKIAkgICAgdHRtLT5zd2FwX3N0b3JhZ2UpCkBAIC0zNjIsNyArMzYxLDcgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHRvX3BhZ2UpOwogCX0KIAotCXR0bS0+YmRldi0+ZHJpdmVyLT50dG1fdHRfdW5wb3B1bGF0ZSh0dG0pOworCXR0bV90dF91bnBvcHVsYXRlKHR0bSk7CiAJdHRtLT5zd2FwX3N0b3JhZ2UgPSBzd2FwX3N0b3JhZ2U7CiAJdHRtLT5wYWdlX2ZsYWdzIHw9IFRUTV9QQUdFX0ZMQUdfU1dBUFBFRDsKIAlpZiAocGVyc2lzdGVudF9zd2FwX3N0b3JhZ2UpCkBAIC0zNzUsMyArMzc0LDI2IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitzdGF0aWMgdm9pZCB0dG1fdHRfY2xlYXJfbWFwcGluZyhzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7CisJcGdvZmZfdCBpOworCXN0cnVjdCBwYWdlICoqcGFnZSA9IHR0bS0+cGFnZXM7CisKKwlpZiAodHRtLT5wYWdlX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19TRykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHR0bS0+bnVtX3BhZ2VzOyArK2kpIHsKKwkJKCpwYWdlKS0+bWFwcGluZyA9IE5VTEw7CisJCSgqcGFnZSsrKS0+aW5kZXggPSAwOworCX0KK30KKwordm9pZCB0dG1fdHRfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7CisJaWYgKHR0bS0+c3RhdGUgPT0gdHRfdW5wb3B1bGF0ZWQpCisJCXJldHVybjsKKworCXR0bV90dF9jbGVhcl9tYXBwaW5nKHR0bSk7CisJdHRtLT5iZGV2LT5kcml2ZXItPnR0bV90dF91bnBvcHVsYXRlKHR0bSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYwppbmRleCA5N2U5ZDYxLi5kYmFkZDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKQEAgLTQwMywxNSArNDAzLDE3IEBACiAJaW50IGk7CiAJaW50IHJldCA9IDA7CiAKKwlkcm1fbW9kZXNldF9sb2NrX2FsbChmYi0+ZGV2KTsKKwogCWlmICghdWZiLT5hY3RpdmVfMTYpCi0JCXJldHVybiAwOworCQlnb3RvIHVubG9jazsKIAogCWlmICh1ZmItPm9iai0+YmFzZS5pbXBvcnRfYXR0YWNoKSB7CiAJCXJldCA9IGRtYV9idWZfYmVnaW5fY3B1X2FjY2Vzcyh1ZmItPm9iai0+YmFzZS5pbXBvcnRfYXR0YWNoLT5kbWFidWYsCiAJCQkJCSAgICAgICAwLCB1ZmItPm9iai0+YmFzZS5zaXplLAogCQkJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIHVubG9jazsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsaXBzOyBpKyspIHsKQEAgLTQxOSw3ICs0MjEsNyBAQAogCQkJCSAgY2xpcHNbaV0ueDIgLSBjbGlwc1tpXS54MSwKIAkJCQkgIGNsaXBzW2ldLnkyIC0gY2xpcHNbaV0ueTEpOwogCQlpZiAocmV0KQotCQkJYnJlYWs7CisJCQlnb3RvIHVubG9jazsKIAl9CiAKIAlpZiAodWZiLT5vYmotPmJhc2UuaW1wb3J0X2F0dGFjaCkgewpAQCAtNDI3LDYgKzQyOSwxMCBAQAogCQkJCSAgICAgICAwLCB1ZmItPm9iai0+YmFzZS5zaXplLAogCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCX0KKworIHVubG9jazoKKwlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGZiLT5kZXYpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWEuYwppbmRleCA2NTJmOWI0Li5hMTg0NzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWEuYwpAQCAtNjAsNyArNjAsNyBAQAogCWRldl9wcml2LT5kbWFfbG93ICs9IDg7CQkJCQlcCiB9CiAKLSNkZWZpbmUgdmlhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKSBEUk1fTUVNT1JZQkFSUklFUigpCisjZGVmaW5lIHZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCkgbWIoKQogCiAjZGVmaW5lIFZJQV9PVVRfUklOR19RVyh3MSwgdzIpCWRvIHsJCVwKIAkqdmIrKyA9ICh3MSk7CQkJCVwKQEAgLTIzNCwxMyArMjM0LDEzIEBACiAKIAlzd2l0Y2ggKGluaXQtPmZ1bmMpIHsKIAljYXNlIFZJQV9JTklUX0RNQToKLQkJaWYgKCFEUk1fU1VTRVIoRFJNX0NVUlBST0MpKQorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXRjb2RlID0gLUVQRVJNOwogCQllbHNlCiAJCQlyZXRjb2RlID0gdmlhX2luaXRpYWxpemUoZGV2LCBkZXZfcHJpdiwgaW5pdCk7CiAJCWJyZWFrOwogCWNhc2UgVklBX0NMRUFOVVBfRE1BOgotCQlpZiAoIURSTV9TVVNFUihEUk1fQ1VSUFJPQykpCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldGNvZGUgPSAtRVBFUk07CiAJCWVsc2UKIAkJCXJldGNvZGUgPSB2aWFfZG1hX2NsZWFudXAoZGV2KTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+YnVmLCBjbWQtPnNpemUpKQorCWlmIChjb3B5X2Zyb21fdXNlcihkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5idWYsIGNtZC0+c2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJLyoKQEAgLTM0Niw3ICszNDYsNyBAQAogCiAJaWYgKGNtZC0+c2l6ZSA+IFZJQV9QQ0lfQlVGX1NJWkUpCiAJCXJldHVybiAtRU5PTUVNOwotCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+YnVmLCBjbWQtPnNpemUpKQorCWlmIChjb3B5X2Zyb21fdXNlcihkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5idWYsIGNtZC0+c2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKChyZXQgPQpAQCAtNTQzLDcgKzU0Myw3IEBACiAKIAlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfaGkpOwogCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgcGF1c2VfYWRkcl9sbyk7Ci0JRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOworCXdtYigpOwogCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgY29tbWFuZCB8IEhDX0hBR1BDTU5UX01BU0spOwogCVZJQV9SRUFEKFZJQV9SRUdfVFJBTlNQQUNFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hYmxpdC5jIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hYmxpdC5jCmluZGV4IDhiMGYyNTkuLmJhMzNjZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYWJsaXQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWFibGl0LmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCVZJQV9XUklURShWSUFfUENJX0RNQV9NUjAgICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfTVJfQ00gfCBWSUFfRE1BX01SX1RESUUpOwogCVZJQV9XUklURShWSUFfUENJX0RNQV9CQ1IwICsgZW5naW5lKjB4MTAsIDApOwogCVZJQV9XUklURShWSUFfUENJX0RNQV9EUFIwICsgZW5naW5lKjB4MTAsIHZzZy0+Y2hhaW5fc3RhcnQpOwotCURSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsKKwl3bWIoKTsKIAlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9ERSB8IFZJQV9ETUFfQ1NSX1RTKTsKIAlWSUFfUkVBRChWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQpOwogfQpAQCAtMzM4LDcgKzMzOCw3IEBACiAKIAkJYmxpdHEtPmJsaXRzW2N1cl0tPmFib3J0ZWQgPSBibGl0cS0+YWJvcnRpbmc7CiAJCWJsaXRxLT5kb25lX2JsaXRfaGFuZGxlKys7Ci0JCURSTV9XQUtFVVAoYmxpdHEtPmJsaXRfcXVldWUgKyBjdXIpOworCQl3YWtlX3VwKGJsaXRxLT5ibGl0X3F1ZXVlICsgY3VyKTsKIAogCQljdXIrKzsKIAkJaWYgKGN1ciA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpCkBAIC0zNjMsNyArMzYzLDcgQEAKIAogCQl2aWFfYWJvcnRfZG1hYmxpdChkZXYsIGVuZ2luZSk7CiAJCWJsaXRxLT5hYm9ydGluZyA9IDE7Ci0JCWJsaXRxLT5lbmQgPSBqaWZmaWVzICsgRFJNX0haOworCQlibGl0cS0+ZW5kID0gamlmZmllcyArIEhaOwogCX0KIAogCWlmICghYmxpdHEtPmlzX2FjdGl2ZSkgewpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCQlibGl0cS0+aXNfYWN0aXZlID0gMTsKIAkJCWJsaXRxLT5jdXIgPSBjdXI7CiAJCQlibGl0cS0+bnVtX291dHN0YW5kaW5nLS07Ci0JCQlibGl0cS0+ZW5kID0gamlmZmllcyArIERSTV9IWjsKKwkJCWJsaXRxLT5lbmQgPSBqaWZmaWVzICsgSFo7CiAJCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmJsaXRxLT5wb2xsX3RpbWVyKSkKIAkJCQltb2RfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyLCBqaWZmaWVzICsgMSk7CiAJCX0gZWxzZSB7CkBAIC00MzYsNyArNDM2LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICh2aWFfZG1hYmxpdF9hY3RpdmUoYmxpdHEsIGVuZ2luZSwgaGFuZGxlLCAmcXVldWUpKSB7Ci0JCURSTV9XQUlUX09OKHJldCwgKnF1ZXVlLCAzICogRFJNX0haLAorCQlEUk1fV0FJVF9PTihyZXQsICpxdWV1ZSwgMyAqIEhaLAogCQkJICAgICF2aWFfZG1hYmxpdF9hY3RpdmUoYmxpdHEsIGVuZ2luZSwgaGFuZGxlLCBOVUxMKSk7CiAJfQogCURSTV9ERUJVRygiRE1BIGJsaXQgc3luYyBoYW5kbGUgMHgleCBlbmdpbmUgJWQgcmV0dXJuZWQgJWRcbiIsCkBAIC01MjEsNyArNTIxLDcgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAotCQlEUk1fV0FLRVVQKCZibGl0cS0+YnVzeV9xdWV1ZSk7CisJCXdha2VfdXAoJmJsaXRxLT5idXN5X3F1ZXVlKTsKIAogCQl2aWFfZnJlZV9zZ19pbmZvKGRldi0+cGRldiwgY3VyX3NnKTsKIAkJa2ZyZWUoY3VyX3NnKTsKQEAgLTU2MSw4ICs1NjEsOCBAQAogCQlibGl0cS0+YWJvcnRpbmcgPSAwOwogCQlzcGluX2xvY2tfaW5pdCgmYmxpdHEtPmJsaXRfbG9jayk7CiAJCWZvciAoaiA9IDA7IGogPCBWSUFfTlVNX0JMSVRfU0xPVFM7ICsraikKLQkJCURSTV9JTklUX1dBSVRRVUVVRShibGl0cS0+YmxpdF9xdWV1ZSArIGopOwotCQlEUk1fSU5JVF9XQUlUUVVFVUUoJmJsaXRxLT5idXN5X3F1ZXVlKTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoYmxpdHEtPmJsaXRfcXVldWUgKyBqKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmYmxpdHEtPmJ1c3lfcXVldWUpOwogCQlJTklUX1dPUksoJmJsaXRxLT53cSwgdmlhX2RtYWJsaXRfd29ya3F1ZXVlKTsKIAkJc2V0dXBfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyLCB2aWFfZG1hYmxpdF90aW1lciwKIAkJCQkodW5zaWduZWQgbG9uZylibGl0cSk7CkBAIC02ODgsNyArNjg4LDcgQEAKIAl3aGlsZSAoYmxpdHEtPm51bV9mcmVlID09IDApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CiAKLQkJRFJNX1dBSVRfT04ocmV0LCBibGl0cS0+YnVzeV9xdWV1ZSwgRFJNX0haLCBibGl0cS0+bnVtX2ZyZWUgPiAwKTsKKwkJRFJNX1dBSVRfT04ocmV0LCBibGl0cS0+YnVzeV9xdWV1ZSwgSFosIGJsaXRxLT5udW1fZnJlZSA+IDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuICgtRUlOVFIgPT0gcmV0KSA/IC1FQUdBSU4gOiByZXQ7CiAKQEAgLTcxMyw3ICs3MTMsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAlibGl0cS0+bnVtX2ZyZWUrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKLQlEUk1fV0FLRVVQKCZibGl0cS0+YnVzeV9xdWV1ZSk7CisJd2FrZV91cCgmYmxpdHEtPmJ1c3lfcXVldWUpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYwppbmRleCA5MjY4NGE5Li41MGFiYzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYwpAQCAtNDYsNyArNDYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHZpYV9kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3N0YXRpYyB2b2lkIHZpYV9kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgdmlhX2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZHJ2LmgKaW5kZXggYTgxMWVmMi4uYWQwMjczMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZHJ2LmgKQEAgLTEzOCw3ICsxMzgsNyBAQAogZXh0ZXJuIGludCB2aWFfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCB2aWFfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogCi1leHRlcm4gaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIGlycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKTsKIGV4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYwppbmRleCBhYzk4OTY0Li4xMzE5NDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+dmJsX3JlY2VpdmVkKTsKIH0KIAotaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+bnVtX2lycXM7ICsraSkgewogCQlpZiAoc3RhdHVzICYgY3VyX2lycS0+cGVuZGluZ19tYXNrKSB7CiAJCQlhdG9taWNfaW5jKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpOwotCQkJRFJNX1dBS0VVUCgmY3VyX2lycS0+aXJxX3F1ZXVlKTsKKwkJCXdha2VfdXAoJmN1cl9pcnEtPmlycV9xdWV1ZSk7CiAJCQloYW5kbGVkID0gMTsKIAkJCWlmIChkZXZfcHJpdi0+aXJxX21hcFtkcm1fdmlhX2lycV9kbWEwX3RkXSA9PSBpKQogCQkJCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCAwLCAxKTsKQEAgLTIzOSwxMiArMjM5LDEyIEBACiAJY3VyX2lycSA9IGRldl9wcml2LT52aWFfaXJxcyArIHJlYWxfaXJxOwogCiAJaWYgKG1hc2tzW3JlYWxfaXJxXVsyXSAmJiAhZm9yY2Vfc2VxdWVuY2UpIHsKLQkJRFJNX1dBSVRfT04ocmV0LCBjdXJfaXJxLT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCisJCURSTV9XQUlUX09OKHJldCwgY3VyX2lycS0+aXJxX3F1ZXVlLCAzICogSFosCiAJCQkgICAgKChWSUFfUkVBRChtYXNrc1tpcnFdWzJdKSAmIG1hc2tzW2lycV1bM10pID09CiAJCQkgICAgIG1hc2tzW2lycV1bNF0pKTsKIAkJY3VyX2lycV9zZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpOwogCX0gZWxzZSB7Ci0JCURSTV9XQUlUX09OKHJldCwgY3VyX2lycS0+aXJxX3F1ZXVlLCAzICogRFJNX0haLAorCQlEUk1fV0FJVF9PTihyZXQsIGN1cl9pcnEtPmlycV9xdWV1ZSwgMyAqIEhaLAogCQkJICAgICgoKGN1cl9pcnFfc2VxdWVuY2UgPQogCQkJICAgICAgIGF0b21pY19yZWFkKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpKSAtCiAJCQkgICAgICAqc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkpOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJCQlhdG9taWNfc2V0KCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQsIDApOwogCQkJY3VyX2lycS0+ZW5hYmxlX21hc2sgPSBkZXZfcHJpdi0+aXJxX21hc2tzW2ldWzBdOwogCQkJY3VyX2lycS0+cGVuZGluZ19tYXNrID0gZGV2X3ByaXYtPmlycV9tYXNrc1tpXVsxXTsKLQkJCURSTV9JTklUX1dBSVRRVUVVRSgmY3VyX2lycS0+aXJxX3F1ZXVlKTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN1cl9pcnEtPmlycV9xdWV1ZSk7CiAJCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrIHw9IGN1cl9pcnEtPmVuYWJsZV9tYXNrOwogCQkJZGV2X3ByaXYtPmlycV9wZW5kaW5nX21hc2sgfD0gY3VyX2lycS0+cGVuZGluZ19tYXNrOwogCQkJY3VyX2lycSsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmlkZW8uYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX3ZpZGVvLmMKaW5kZXggNjU2OWVmYS4uYTlmZmJhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmlkZW8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV92aWRlby5jCkBAIC0zNiw3ICszNiw3IEBACiAJRFJNX0RFQlVHKCJcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFZJQV9OUl9YVk1DX0xPQ0tTOyArK2kpIHsKLQkJRFJNX0lOSVRfV0FJVFFVRVVFKCYoZGV2X3ByaXYtPmRlY29kZXJfcXVldWVbaV0pKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmKGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2ldKSk7CiAJCVhWTUNMT0NLUFRSKGRldl9wcml2LT5zYXJlYV9wcml2LCBpKS0+bG9jayA9IDA7CiAJfQogfQpAQCAtNTgsNyArNTgsNyBAQAogCQlpZiAoKF9EUk1fTE9DS0lOR19DT05URVhUKCpsb2NrKSA9PSBjb250ZXh0KSkgewogCQkJaWYgKF9EUk1fTE9DS19JU19IRUxEKCpsb2NrKQogCQkJICAgICYmICgqbG9jayAmIF9EUk1fTE9DS19DT05UKSkgewotCQkJCURSTV9XQUtFVVAoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtpXSkpOworCQkJCXdha2VfdXAoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtpXSkpOwogCQkJfQogCQkJKmxvY2sgPSAwOwogCQl9CkBAIC04MywxMCArODMsMTAgQEAKIAlzd2l0Y2ggKGZ4LT5mdW5jKSB7CiAJY2FzZSBWSUFfRlVURVhfV0FJVDoKIAkJRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtmeC0+bG9ja10sCi0JCQkgICAgKGZ4LT5tcyAvIDEwKSAqIChEUk1fSFogLyAxMDApLCAqbG9jayAhPSBmeC0+dmFsKTsKKwkJCSAgICAoZngtPm1zIC8gMTApICogKEhaIC8gMTAwKSwgKmxvY2sgIT0gZngtPnZhbCk7CiAJCXJldHVybiByZXQ7CiAJY2FzZSBWSUFfRlVURVhfV0FLRToKLQkJRFJNX1dBS0VVUCgmKGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2Z4LT5sb2NrXSkpOworCQl3YWtlX3VwKCYoZGV2X3ByaXYtPmRlY29kZXJfcXVldWVbZngtPmxvY2tdKSk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L01ha2VmaWxlCmluZGV4IDlmOGI2OTAuLjQ1OGNkZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9NYWtlZmlsZQpAQCAtNiw2ICs2LDYgQEAKIAkgICAgdm13Z2Z4X2ZpZm8ubyB2bXdnZnhfaXJxLm8gdm13Z2Z4X2xkdS5vIHZtd2dmeF90dG1fZ2x1ZS5vIFwKIAkgICAgdm13Z2Z4X292ZXJsYXkubyB2bXdnZnhfbWFya2VyLm8gdm13Z2Z4X2dtcmlkX21hbmFnZXIubyBcCiAJICAgIHZtd2dmeF9mZW5jZS5vIHZtd2dmeF9kbWFidWYubyB2bXdnZnhfc2Nybi5vIHZtd2dmeF9jb250ZXh0Lm8gXAotCSAgICB2bXdnZnhfc3VyZmFjZS5vIHZtd2dmeF9wcmltZS5vCisJICAgIHZtd2dmeF9zdXJmYWNlLm8gdm13Z2Z4X3ByaW1lLm8gdm13Z2Z4X21vYi5vIHZtd2dmeF9zaGFkZXIubwogCiBvYmotJChDT05GSUdfRFJNX1ZNV0dGWCkgOj0gdm13Z2Z4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYTNkX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKaW5kZXggZDBlMDg1ZS4uYjY0NTY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKQEAgLTM0LDYgKzM0LDggQEAKIAogI2luY2x1ZGUgInN2Z2FfcmVnLmgiCiAKK3R5cGVkZWYgdWludDMyIFBQTjsKK3R5cGVkZWYgX19sZTY0IFBQTjY0OwogCiAvKgogICogM0QgSGFyZHdhcmUgVmVyc2lvbgpAQCAtNzEsNiArNzMsOSBAQAogI2RlZmluZSBTVkdBM0RfTUFYX0NPTlRFWFRfSURTICAgICAgICAgICAgICAgICAgMjU2CiAjZGVmaW5lIFNWR0EzRF9NQVhfU1VSRkFDRV9JRFMgICAgICAgICAgICAgICAgICAoMzIgKiAxMDI0KQogCisjZGVmaW5lIFNWR0EzRF9OVU1fVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBTVkdBM0RfTlVNX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgOAorCiAvKgogICogU3VyZmFjZSBmb3JtYXRzLgogICoKQEAgLTgxLDYgKzg2LDcgQEAKICAqLwogCiB0eXBlZGVmIGVudW0gU1ZHQTNkU3VyZmFjZUZvcm1hdCB7CisgICBTVkdBM0RfRk9STUFUX01JTiAgICAgICAgICAgICAgICAgICA9IDAsCiAgICBTVkdBM0RfRk9STUFUX0lOVkFMSUQgICAgICAgICAgICAgICA9IDAsCiAKICAgIFNWR0EzRF9YOFI4RzhCOCAgICAgICAgICAgICAgICAgICAgID0gMSwKQEAgLTEzNCwxMiArMTQwLDYgQEAKICAgIFNWR0EzRF9SR19TMTBFNSAgICAgICAgICAgICAgICAgICAgID0gMzUsCiAgICBTVkdBM0RfUkdfUzIzRTggICAgICAgICAgICAgICAgICAgICA9IDM2LAogCi0gICAvKgotICAgICogQW55IHN1cmZhY2UgY2FuIGJlIHVzZWQgYXMgYSBidWZmZXIgb2JqZWN0LCBidXQgU1ZHQTNEX0JVRkZFUiBpcwotICAgICogdGhlIG1vc3QgZWZmaWNpZW50IGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgc3VyZmFjZXMKLSAgICAqIGV4cHJlc3NseSBmb3IgaW5kZXggb3IgdmVydGV4IGRhdGEuCi0gICAgKi8KLQogICAgU1ZHQTNEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgPSAzNywKIAogICAgU1ZHQTNEX1pfRDI0WDggICAgICAgICAgICAgICAgICAgICAgPSAzOCwKQEAgLTE1OSwxNSArMTU5LDExNCBAQAogICAgLyogVmlkZW8gZm9ybWF0IHdpdGggYWxwaGEgKi8KICAgIFNWR0EzRF9BWVVWICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUsCiAKKyAgIFNWR0EzRF9SMzJHMzJCMzJBMzJfVFlQRUxFU1MgICAgICAgID0gNDYsCisgICBTVkdBM0RfUjMyRzMyQjMyQTMyX0ZMT0FUICAgICAgICAgICA9IDI1LAorICAgU1ZHQTNEX1IzMkczMkIzMkEzMl9VSU5UICAgICAgICAgICAgPSA0NywKKyAgIFNWR0EzRF9SMzJHMzJCMzJBMzJfU0lOVCAgICAgICAgICAgID0gNDgsCisgICBTVkdBM0RfUjMyRzMyQjMyX1RZUEVMRVNTICAgICAgICAgICA9IDQ5LAorICAgU1ZHQTNEX1IzMkczMkIzMl9GTE9BVCAgICAgICAgICAgICAgPSA1MCwKKyAgIFNWR0EzRF9SMzJHMzJCMzJfVUlOVCAgICAgICAgICAgICAgID0gNTEsCisgICBTVkdBM0RfUjMyRzMyQjMyX1NJTlQgICAgICAgICAgICAgICA9IDUyLAorICAgU1ZHQTNEX1IxNkcxNkIxNkExNl9UWVBFTEVTUyAgICAgICAgPSA1MywKKyAgIFNWR0EzRF9SMTZHMTZCMTZBMTZfRkxPQVQgICAgICAgICAgID0gMjQsCisgICBTVkdBM0RfUjE2RzE2QjE2QTE2X1VOT1JNICAgICAgICAgICA9IDQxLAorICAgU1ZHQTNEX1IxNkcxNkIxNkExNl9VSU5UICAgICAgICAgICAgPSA1NCwKKyAgIFNWR0EzRF9SMTZHMTZCMTZBMTZfU05PUk0gICAgICAgICAgID0gNTUsCisgICBTVkdBM0RfUjE2RzE2QjE2QTE2X1NJTlQgICAgICAgICAgICA9IDU2LAorICAgU1ZHQTNEX1IzMkczMl9UWVBFTEVTUyAgICAgICAgICAgICAgPSA1NywKKyAgIFNWR0EzRF9SMzJHMzJfRkxPQVQgICAgICAgICAgICAgICAgID0gMzYsCisgICBTVkdBM0RfUjMyRzMyX1VJTlQgICAgICAgICAgICAgICAgICA9IDU4LAorICAgU1ZHQTNEX1IzMkczMl9TSU5UICAgICAgICAgICAgICAgICAgPSA1OSwKKyAgIFNWR0EzRF9SMzJHOFgyNF9UWVBFTEVTUyAgICAgICAgICAgID0gNjAsCisgICBTVkdBM0RfRDMyX0ZMT0FUX1M4WDI0X1VJTlQgICAgICAgICA9IDYxLAorICAgU1ZHQTNEX1IzMl9GTE9BVF9YOFgyNF9UWVBFTEVTUyAgICAgPSA2MiwKKyAgIFNWR0EzRF9YMzJfVFlQRUxFU1NfRzhYMjRfVUlOVCAgICAgID0gNjMsCisgICBTVkdBM0RfUjEwRzEwQjEwQTJfVFlQRUxFU1MgICAgICAgICA9IDY0LAorICAgU1ZHQTNEX1IxMEcxMEIxMEEyX1VOT1JNICAgICAgICAgICAgPSAyNiwKKyAgIFNWR0EzRF9SMTBHMTBCMTBBMl9VSU5UICAgICAgICAgICAgID0gNjUsCisgICBTVkdBM0RfUjExRzExQjEwX0ZMT0FUICAgICAgICAgICAgICA9IDY2LAorICAgU1ZHQTNEX1I4RzhCOEE4X1RZUEVMRVNTICAgICAgICAgICAgPSA2NywKKyAgIFNWR0EzRF9SOEc4QjhBOF9VTk9STSAgICAgICAgICAgICAgID0gNjgsCisgICBTVkdBM0RfUjhHOEI4QThfVU5PUk1fU1JHQiAgICAgICAgICA9IDY5LAorICAgU1ZHQTNEX1I4RzhCOEE4X1VJTlQgICAgICAgICAgICAgICAgPSA3MCwKKyAgIFNWR0EzRF9SOEc4QjhBOF9TTk9STSAgICAgICAgICAgICAgID0gMjgsCisgICBTVkdBM0RfUjhHOEI4QThfU0lOVCAgICAgICAgICAgICAgICA9IDcxLAorICAgU1ZHQTNEX1IxNkcxNl9UWVBFTEVTUyAgICAgICAgICAgICAgPSA3MiwKKyAgIFNWR0EzRF9SMTZHMTZfRkxPQVQgICAgICAgICAgICAgICAgID0gMzUsCisgICBTVkdBM0RfUjE2RzE2X1VOT1JNICAgICAgICAgICAgICAgICA9IDQwLAorICAgU1ZHQTNEX1IxNkcxNl9VSU5UICAgICAgICAgICAgICAgICAgPSA3MywKKyAgIFNWR0EzRF9SMTZHMTZfU05PUk0gICAgICAgICAgICAgICAgID0gMzksCisgICBTVkdBM0RfUjE2RzE2X1NJTlQgICAgICAgICAgICAgICAgICA9IDc0LAorICAgU1ZHQTNEX1IzMl9UWVBFTEVTUyAgICAgICAgICAgICAgICAgPSA3NSwKKyAgIFNWR0EzRF9EMzJfRkxPQVQgICAgICAgICAgICAgICAgICAgID0gNzYsCisgICBTVkdBM0RfUjMyX0ZMT0FUICAgICAgICAgICAgICAgICAgICA9IDM0LAorICAgU1ZHQTNEX1IzMl9VSU5UICAgICAgICAgICAgICAgICAgICAgPSA3NywKKyAgIFNWR0EzRF9SMzJfU0lOVCAgICAgICAgICAgICAgICAgICAgID0gNzgsCisgICBTVkdBM0RfUjI0RzhfVFlQRUxFU1MgICAgICAgICAgICAgICA9IDc5LAorICAgU1ZHQTNEX0QyNF9VTk9STV9TOF9VSU5UICAgICAgICAgICAgPSA4MCwKKyAgIFNWR0EzRF9SMjRfVU5PUk1fWDhfVFlQRUxFU1MgICAgICAgID0gODEsCisgICBTVkdBM0RfWDI0X1RZUEVMRVNTX0c4X1VJTlQgICAgICAgICA9IDgyLAorICAgU1ZHQTNEX1I4RzhfVFlQRUxFU1MgICAgICAgICAgICAgICAgPSA4MywKKyAgIFNWR0EzRF9SOEc4X1VOT1JNICAgICAgICAgICAgICAgICAgID0gODQsCisgICBTVkdBM0RfUjhHOF9VSU5UICAgICAgICAgICAgICAgICAgICA9IDg1LAorICAgU1ZHQTNEX1I4RzhfU05PUk0gICAgICAgICAgICAgICAgICAgPSAyNywKKyAgIFNWR0EzRF9SOEc4X1NJTlQgICAgICAgICAgICAgICAgICAgID0gODYsCisgICBTVkdBM0RfUjE2X1RZUEVMRVNTICAgICAgICAgICAgICAgICA9IDg3LAorICAgU1ZHQTNEX1IxNl9GTE9BVCAgICAgICAgICAgICAgICAgICAgPSAzMywKKyAgIFNWR0EzRF9EMTZfVU5PUk0gICAgICAgICAgICAgICAgICAgID0gOCwKKyAgIFNWR0EzRF9SMTZfVU5PUk0gICAgICAgICAgICAgICAgICAgID0gODgsCisgICBTVkdBM0RfUjE2X1VJTlQgICAgICAgICAgICAgICAgICAgICA9IDg5LAorICAgU1ZHQTNEX1IxNl9TTk9STSAgICAgICAgICAgICAgICAgICAgPSA5MCwKKyAgIFNWR0EzRF9SMTZfU0lOVCAgICAgICAgICAgICAgICAgICAgID0gOTEsCisgICBTVkdBM0RfUjhfVFlQRUxFU1MgICAgICAgICAgICAgICAgICA9IDkyLAorICAgU1ZHQTNEX1I4X1VOT1JNICAgICAgICAgICAgICAgICAgICAgPSA5MywKKyAgIFNWR0EzRF9SOF9VSU5UICAgICAgICAgICAgICAgICAgICAgID0gOTQsCisgICBTVkdBM0RfUjhfU05PUk0gICAgICAgICAgICAgICAgICAgICA9IDk1LAorICAgU1ZHQTNEX1I4X1NJTlQgICAgICAgICAgICAgICAgICAgICAgPSA5NiwKKyAgIFNWR0EzRF9BOF9VTk9STSAgICAgICAgICAgICAgICAgICAgID0gMzIsCisgICBTVkdBM0RfUjFfVU5PUk0gICAgICAgICAgICAgICAgICAgICA9IDk3LAorICAgU1ZHQTNEX1I5RzlCOUU1X1NIQVJFREVYUCAgICAgICAgICAgPSA5OCwKKyAgIFNWR0EzRF9SOEc4X0I4RzhfVU5PUk0gICAgICAgICAgICAgID0gOTksCisgICBTVkdBM0RfRzhSOF9HOEI4X1VOT1JNICAgICAgICAgICAgICA9IDEwMCwKKyAgIFNWR0EzRF9CQzFfVFlQRUxFU1MgICAgICAgICAgICAgICAgID0gMTAxLAorICAgU1ZHQTNEX0JDMV9VTk9STSAgICAgICAgICAgICAgICAgICAgPSAxNSwKKyAgIFNWR0EzRF9CQzFfVU5PUk1fU1JHQiAgICAgICAgICAgICAgID0gMTAyLAorICAgU1ZHQTNEX0JDMl9UWVBFTEVTUyAgICAgICAgICAgICAgICAgPSAxMDMsCisgICBTVkdBM0RfQkMyX1VOT1JNICAgICAgICAgICAgICAgICAgICA9IDE3LAorICAgU1ZHQTNEX0JDMl9VTk9STV9TUkdCICAgICAgICAgICAgICAgPSAxMDQsCisgICBTVkdBM0RfQkMzX1RZUEVMRVNTICAgICAgICAgICAgICAgICA9IDEwNSwKKyAgIFNWR0EzRF9CQzNfVU5PUk0gICAgICAgICAgICAgICAgICAgID0gMTksCisgICBTVkdBM0RfQkMzX1VOT1JNX1NSR0IgICAgICAgICAgICAgICA9IDEwNiwKKyAgIFNWR0EzRF9CQzRfVFlQRUxFU1MgICAgICAgICAgICAgICAgID0gMTA3LAogICAgU1ZHQTNEX0JDNF9VTk9STSAgICAgICAgICAgICAgICAgICAgPSAxMDgsCisgICBTVkdBM0RfQkM0X1NOT1JNICAgICAgICAgICAgICAgICAgICA9IDEwOSwKKyAgIFNWR0EzRF9CQzVfVFlQRUxFU1MgICAgICAgICAgICAgICAgID0gMTEwLAogICAgU1ZHQTNEX0JDNV9VTk9STSAgICAgICAgICAgICAgICAgICAgPSAxMTEsCisgICBTVkdBM0RfQkM1X1NOT1JNICAgICAgICAgICAgICAgICAgICA9IDExMiwKKyAgIFNWR0EzRF9CNUc2UjVfVU5PUk0gICAgICAgICAgICAgICAgID0gMywKKyAgIFNWR0EzRF9CNUc1UjVBMV9VTk9STSAgICAgICAgICAgICAgID0gNSwKKyAgIFNWR0EzRF9COEc4UjhBOF9VTk9STSAgICAgICAgICAgICAgID0gMiwKKyAgIFNWR0EzRF9COEc4UjhYOF9VTk9STSAgICAgICAgICAgICAgID0gMSwKKyAgIFNWR0EzRF9SMTBHMTBCMTBfWFJfQklBU19BMl9VTk9STSAgID0gMTEzLAorICAgU1ZHQTNEX0I4RzhSOEE4X1RZUEVMRVNTICAgICAgICAgICAgPSAxMTQsCisgICBTVkdBM0RfQjhHOFI4QThfVU5PUk1fU1JHQiAgICAgICAgICA9IDExNSwKKyAgIFNWR0EzRF9COEc4UjhYOF9UWVBFTEVTUyAgICAgICAgICAgID0gMTE2LAorICAgU1ZHQTNEX0I4RzhSOFg4X1VOT1JNX1NSR0IgICAgICAgICAgPSAxMTcsCiAKICAgIC8qIEFkdmFuY2VkIEQzRDkgZGVwdGggZm9ybWF0cy4gKi8KICAgIFNWR0EzRF9aX0RGMTYgICAgICAgICAgICAgICAgICAgICAgID0gMTE4LAogICAgU1ZHQTNEX1pfREYyNCAgICAgICAgICAgICAgICAgICAgICAgPSAxMTksCiAgICBTVkdBM0RfWl9EMjRTOF9JTlQgICAgICAgICAgICAgICAgICA9IDEyMCwKIAotICAgU1ZHQTNEX0ZPUk1BVF9NQVgKKyAgIC8qIFBsYW5hciB2aWRlbyBmb3JtYXRzLiAqLworICAgU1ZHQTNEX1lWMTIgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjEsCisKKyAgIC8qIFNoYWRlciBjb25zdGFudCBmb3JtYXRzLiAqLworICAgU1ZHQTNEX1NVUkZBQ0VfU0hBREVSQ09OU1RfRkxPQVQgICAgPSAxMjIsCisgICBTVkdBM0RfU1VSRkFDRV9TSEFERVJDT05TVF9JTlQgICAgICA9IDEyMywKKyAgIFNWR0EzRF9TVVJGQUNFX1NIQURFUkNPTlNUX0JPT0wgICAgID0gMTI0LAorCisgICBTVkdBM0RfRk9STUFUX01BWCAgICAgICAgICAgICAgICAgICA9IDEyNSwKIH0gU1ZHQTNkU3VyZmFjZUZvcm1hdDsKIAogdHlwZWRlZiB1aW50MzIgU1ZHQTNkQ29sb3I7IC8qIGEsIHIsIGcsIGIgKi8KQEAgLTk1NywxNSArMTA1NiwyMSBAQAogfSBTVkdBM2RDdWJlRmFjZTsKIAogdHlwZWRlZiBlbnVtIHsKKyAgIFNWR0EzRF9TSEFERVJUWVBFX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgIFNWR0EzRF9TSEFERVJUWVBFX01JTiAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKICAgIFNWR0EzRF9TSEFERVJUWVBFX1ZTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKICAgIFNWR0EzRF9TSEFERVJUWVBFX1BTICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKLSAgIFNWR0EzRF9TSEFERVJUWVBFX01BWAorICAgU1ZHQTNEX1NIQURFUlRZUEVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgPSAzLAorICAgU1ZHQTNEX1NIQURFUlRZUEVfR1MgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLAogfSBTVkdBM2RTaGFkZXJUeXBlOwogCisjZGVmaW5lIFNWR0EzRF9OVU1fU0hBREVSVFlQRSAoU1ZHQTNEX1NIQURFUlRZUEVfTUFYIC0gU1ZHQTNEX1NIQURFUlRZUEVfTUlOKQorCiB0eXBlZGVmIGVudW0gewogICAgU1ZHQTNEX0NPTlNUX1RZUEVfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgPSAwLAogICAgU1ZHQTNEX0NPTlNUX1RZUEVfSU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAogICAgU1ZHQTNEX0NPTlNUX1RZUEVfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorICAgU1ZHQTNEX0NPTlNUX1RZUEVfTUFYCiB9IFNWR0EzZFNoYWRlckNvbnN0VHlwZTsKIAogI2RlZmluZSBTVkdBM0RfTUFYX1NVUkZBQ0VfRkFDRVMgICAgICAgICAgICAgICAgNgpAQCAtMTA1Niw5ICsxMTYxLDc0IEBACiAjZGVmaW5lIFNWR0FfM0RfQ01EX0dFTkVSQVRFX01JUE1BUFMgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDMxCiAjZGVmaW5lIFNWR0FfM0RfQ01EX0FDVElWQVRFX1NVUkZBQ0UgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDQwCiAjZGVmaW5lIFNWR0FfM0RfQ01EX0RFQUNUSVZBVEVfU1VSRkFDRSAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDQxCi0jZGVmaW5lIFNWR0FfM0RfQ01EX01BWCAgICAgICAgICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDQyCisjZGVmaW5lIFNWR0FfM0RfQ01EX1NDUkVFTl9ETUEgICAgICAgICAgICAgICAxMDgyCisjZGVmaW5lIFNWR0FfM0RfQ01EX1NFVF9VTklUWV9TVVJGQUNFX0NPT0tJRSAxMDgzCisjZGVmaW5lIFNWR0FfM0RfQ01EX09QRU5fQ09OVEVYVF9TVVJGQUNFICAgICAxMDg0CiAKLSNkZWZpbmUgU1ZHQV8zRF9DTURfRlVUVVJFX01BWCAgICAgICAgICAgICAyMDAwCisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX0JJVEJMVCAgICAgICAgICAxMDg1CisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX1RSQU5TQkxUICAgICAgICAxMDg2CisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX1NUUkVUQ0hCTFQgICAgICAxMDg3CisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX0NPTE9SRklMTCAgICAgICAxMDg4CisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX0FMUEhBQkxFTkQgICAgICAxMDg5CisjZGVmaW5lIFNWR0FfM0RfQ01EX0xPR0lDT1BTX0NMRUFSVFlQRUJMRU5EICAxMDkwCisKKyNkZWZpbmUgU1ZHQV8zRF9DTURfU0VUX09UQUJMRV9CQVNFICAgICAgICAgIDEwOTEKKyNkZWZpbmUgU1ZHQV8zRF9DTURfUkVBREJBQ0tfT1RBQkxFICAgICAgICAgIDEwOTIKKworI2RlZmluZSBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfTU9CICAgICAgICAgICAgMTA5MworI2RlZmluZSBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX01PQiAgICAgICAgICAgMTA5NAorI2RlZmluZSBTVkdBXzNEX0NNRF9SRURFRklORV9HQl9NT0IgICAgICAgICAgMTA5NQorI2RlZmluZSBTVkdBXzNEX0NNRF9VUERBVEVfR0JfTU9CX01BUFBJTkcgICAgMTA5NgorCisjZGVmaW5lIFNWR0FfM0RfQ01EX0RFRklORV9HQl9TVVJGQUNFICAgICAgICAxMDk3CisjZGVmaW5lIFNWR0FfM0RfQ01EX0RFU1RST1lfR0JfU1VSRkFDRSAgICAgICAxMDk4CisjZGVmaW5lIFNWR0FfM0RfQ01EX0JJTkRfR0JfU1VSRkFDRSAgICAgICAgICAxMDk5CisjZGVmaW5lIFNWR0FfM0RfQ01EX0NPTkRfQklORF9HQl9TVVJGQUNFICAgICAxMTAwCisjZGVmaW5lIFNWR0FfM0RfQ01EX1VQREFURV9HQl9JTUFHRSAgICAgICAgICAxMTAxCisjZGVmaW5lIFNWR0FfM0RfQ01EX1VQREFURV9HQl9TVVJGQUNFICAgICAgICAxMTAyCisjZGVmaW5lIFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX0lNQUdFICAgICAgICAxMTAzCisjZGVmaW5lIFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX1NVUkZBQ0UgICAgICAxMTA0CisjZGVmaW5lIFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfSU1BR0UgICAgICAxMTA1CisjZGVmaW5lIFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfU1VSRkFDRSAgICAxMTA2CisKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVGSU5FX0dCX0NPTlRFWFQgICAgICAgIDExMDcKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9DT05URVhUICAgICAgIDExMDgKKyNkZWZpbmUgU1ZHQV8zRF9DTURfQklORF9HQl9DT05URVhUICAgICAgICAgIDExMDkKKyNkZWZpbmUgU1ZHQV8zRF9DTURfUkVBREJBQ0tfR0JfQ09OVEVYVCAgICAgIDExMTAKKyNkZWZpbmUgU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9DT05URVhUICAgIDExMTEKKworI2RlZmluZSBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfU0hBREVSICAgICAgICAgMTExMgorI2RlZmluZSBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX1NIQURFUiAgICAgICAgMTExMworI2RlZmluZSBTVkdBXzNEX0NNRF9CSU5EX0dCX1NIQURFUiAgICAgICAgICAgMTExNAorCisjZGVmaW5lIFNWR0FfM0RfQ01EX1NFVF9PVEFCTEVfQkFTRTY0ICAgICAgICAxMTE1CisKKyNkZWZpbmUgU1ZHQV8zRF9DTURfQkVHSU5fR0JfUVVFUlkgICAgICAgICAgIDExMTYKKyNkZWZpbmUgU1ZHQV8zRF9DTURfRU5EX0dCX1FVRVJZICAgICAgICAgICAgIDExMTcKKyNkZWZpbmUgU1ZHQV8zRF9DTURfV0FJVF9GT1JfR0JfUVVFUlkgICAgICAgIDExMTgKKworI2RlZmluZSBTVkdBXzNEX0NNRF9OT1AgICAgICAgICAgICAgICAgICAgICAgMTExOQorCisjZGVmaW5lIFNWR0FfM0RfQ01EX0VOQUJMRV9HQVJUICAgICAgICAgICAgICAxMTIwCisjZGVmaW5lIFNWR0FfM0RfQ01EX0RJU0FCTEVfR0FSVCAgICAgICAgICAgICAxMTIxCisjZGVmaW5lIFNWR0FfM0RfQ01EX01BUF9NT0JfSU5UT19HQVJUICAgICAgICAxMTIyCisjZGVmaW5lIFNWR0FfM0RfQ01EX1VOTUFQX0dBUlRfUkFOR0UgICAgICAgICAxMTIzCisKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVGSU5FX0dCX1NDUkVFTlRBUkdFVCAgIDExMjQKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9TQ1JFRU5UQVJHRVQgIDExMjUKKyNkZWZpbmUgU1ZHQV8zRF9DTURfQklORF9HQl9TQ1JFRU5UQVJHRVQgICAgIDExMjYKKyNkZWZpbmUgU1ZHQV8zRF9DTURfVVBEQVRFX0dCX1NDUkVFTlRBUkdFVCAgIDExMjcKKworI2RlZmluZSBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9JTUFHRV9QQVJUSUFMICAgMTEyOAorI2RlZmluZSBTVkdBXzNEX0NNRF9JTlZBTElEQVRFX0dCX0lNQUdFX1BBUlRJQUwgMTEyOQorCisjZGVmaW5lIFNWR0FfM0RfQ01EX1NFVF9HQl9TSEFERVJDT05TVFNfSU5MSU5FICAxMTMwCisKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVGSU5FX0dCX01PQjY0ICAgICAgICAgIDExMzUKKyNkZWZpbmUgU1ZHQV8zRF9DTURfUkVERUZJTkVfR0JfTU9CNjQgICAgICAgIDExMzYKKworI2RlZmluZSBTVkdBXzNEX0NNRF9NQVggICAgICAgICAgICAgICAgICAgICAgMTE0MgorI2RlZmluZSBTVkdBXzNEX0NNRF9GVVRVUkVfTUFYICAgICAgICAgICAgICAgMzAwMAogCiAvKgogICogQ29tbW9uIHN1YnN0cnVjdHVyZXMgdXNlZCBpbiBtdWx0aXBsZSBGSUZPIGNvbW1hbmRzOgpAQCAtMTc1MCw2ICsxOTIwLDQ5NSBAQAogCiAKIC8qCisgKiBHdWVzdC1iYWNrZWQgc3VyZmFjZSBkZWZpbml0aW9ucy4KKyAqLworCit0eXBlZGVmIHVpbnQzMiBTVkdBTW9iSWQ7CisKK3R5cGVkZWYgZW51bSBTVkdBTW9iRm9ybWF0IHsKKyAgIFNWR0EzRF9NT0JGTVRfSU5WQUxJRCA9IFNWR0EzRF9JTlZBTElEX0lELAorICAgU1ZHQTNEX01PQkZNVF9QVERFUFRIXzAgPSAwLAorICAgU1ZHQTNEX01PQkZNVF9QVERFUFRIXzEgPSAxLAorICAgU1ZHQTNEX01PQkZNVF9QVERFUFRIXzIgPSAyLAorICAgU1ZHQTNEX01PQkZNVF9SQU5HRSAgICAgPSAzLAorICAgU1ZHQTNEX01PQkZNVF9QVERFUFRINjRfMCA9IDQsCisgICBTVkdBM0RfTU9CRk1UX1BUREVQVEg2NF8xID0gNSwKKyAgIFNWR0EzRF9NT0JGTVRfUFRERVBUSDY0XzIgPSA2LAorICAgU1ZHQTNEX01PQkZNVF9NQVgsCit9IFNWR0FNb2JGb3JtYXQ7CisKKy8qCisgKiBTaXplcyBvZiBvcGFxdWUgdHlwZXMuCisgKi8KKworI2RlZmluZSBTVkdBM0RfT1RBQkxFX01PQl9FTlRSWV9TSVpFIDE2CisjZGVmaW5lIFNWR0EzRF9PVEFCTEVfQ09OVEVYVF9FTlRSWV9TSVpFIDgKKyNkZWZpbmUgU1ZHQTNEX09UQUJMRV9TVVJGQUNFX0VOVFJZX1NJWkUgNjQKKyNkZWZpbmUgU1ZHQTNEX09UQUJMRV9TSEFERVJfRU5UUllfU0laRSAxNgorI2RlZmluZSBTVkdBM0RfT1RBQkxFX1NDUkVFTl9UQVJHRVRfRU5UUllfU0laRSA2NAorI2RlZmluZSBTVkdBM0RfQ09OVEVYVF9EQVRBX1NJWkUgMTYzODQKKworLyoKKyAqIFNWR0EzZENtZFNldE9UYWJsZUJhc2UgLS0KKyAqCisgKiBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBndWVzdCB0byBzcGVjaWZ5IHRoZSBiYXNlIFBQTiBvZiB0aGUKKyAqIHNwZWNpZmllZCBvYmplY3QgdGFibGUuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgIFNWR0FfT1RBQkxFX01PQiAgICAgICAgICAgPSAwLAorICAgU1ZHQV9PVEFCTEVfTUlOICAgICAgICAgICA9IDAsCisgICBTVkdBX09UQUJMRV9TVVJGQUNFICAgICAgID0gMSwKKyAgIFNWR0FfT1RBQkxFX0NPTlRFWFQgICAgICAgPSAyLAorICAgU1ZHQV9PVEFCTEVfU0hBREVSICAgICAgICA9IDMsCisgICBTVkdBX09UQUJMRV9TQ1JFRU5fVEFSR0VUID0gNCwKKyAgIFNWR0FfT1RBQkxFX0RYOV9NQVggICAgICAgPSA1LAorICAgU1ZHQV9PVEFCTEVfTUFYICAgICAgICAgICA9IDgKK30gU1ZHQU9UYWJsZVR5cGU7CisKK3R5cGVkZWYKK3N0cnVjdCB7CisgICBTVkdBT1RhYmxlVHlwZSB0eXBlOworICAgUFBOIGJhc2VBZGRyZXNzOworICAgdWludDMyIHNpemVJbkJ5dGVzOworICAgdWludDMyIHZhbGlkU2l6ZUluQnl0ZXM7CisgICBTVkdBTW9iRm9ybWF0IHB0RGVwdGg7Cit9CitfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKK1NWR0EzZENtZFNldE9UYWJsZUJhc2U7ICAvKiBTVkdBXzNEX0NNRF9TRVRfT1RBQkxFX0JBU0UgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIFNWR0FPVGFibGVUeXBlIHR5cGU7CisgICBQUE42NCBiYXNlQWRkcmVzczsKKyAgIHVpbnQzMiBzaXplSW5CeXRlczsKKyAgIHVpbnQzMiB2YWxpZFNpemVJbkJ5dGVzOworICAgU1ZHQU1vYkZvcm1hdCBwdERlcHRoOworfQorX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpCitTVkdBM2RDbWRTZXRPVGFibGVCYXNlNjQ7ICAvKiBTVkdBXzNEX0NNRF9TRVRfT1RBQkxFX0JBU0U2NCAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgU1ZHQU9UYWJsZVR5cGUgdHlwZTsKK30KK19fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorU1ZHQTNkQ21kUmVhZGJhY2tPVGFibGU7ICAvKiBTVkdBXzNEX0NNRF9SRUFEQkFDS19PVEFCTEUgKi8KKworLyoKKyAqIERlZmluZSBhIG1lbW9yeSBvYmplY3QgKE1vYikgaW4gdGhlIE9UYWJsZS4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kRGVmaW5lR0JNb2IgeworICAgU1ZHQU1vYklkIG1vYmlkOworICAgU1ZHQU1vYkZvcm1hdCBwdERlcHRoOworICAgUFBOIGJhc2U7CisgICB1aW50MzIgc2l6ZUluQnl0ZXM7Cit9CitfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKK1NWR0EzZENtZERlZmluZUdCTW9iOyAgIC8qIFNWR0FfM0RfQ01EX0RFRklORV9HQl9NT0IgKi8KKworCisvKgorICogRGVzdHJveXMgYW4gb2JqZWN0IGluIHRoZSBPVGFibGUuCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZERlc3Ryb3lHQk1vYiB7CisgICBTVkdBTW9iSWQgbW9iaWQ7Cit9CitfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKK1NWR0EzZENtZERlc3Ryb3lHQk1vYjsgICAvKiBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX01PQiAqLworCisvKgorICogUmVkZWZpbmUgYW4gb2JqZWN0IGluIHRoZSBPVGFibGUuCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZFJlZGVmaW5lR0JNb2IgeworICAgU1ZHQU1vYklkIG1vYmlkOworICAgU1ZHQU1vYkZvcm1hdCBwdERlcHRoOworICAgUFBOIGJhc2U7CisgICB1aW50MzIgc2l6ZUluQnl0ZXM7Cit9CitfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKK1NWR0EzZENtZFJlZGVmaW5lR0JNb2I7ICAgLyogU1ZHQV8zRF9DTURfUkVERUZJTkVfR0JfTU9CICovCisKKy8qCisgKiBEZWZpbmUgYSBtZW1vcnkgb2JqZWN0IChNb2IpIGluIHRoZSBPVGFibGUgd2l0aCBhIFBQTjY0IGJhc2UuCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZERlZmluZUdCTW9iNjQgeworICAgU1ZHQU1vYklkIG1vYmlkOworICAgU1ZHQU1vYkZvcm1hdCBwdERlcHRoOworICAgUFBONjQgYmFzZTsKKyAgIHVpbnQzMiBzaXplSW5CeXRlczsKK30KK19fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorU1ZHQTNkQ21kRGVmaW5lR0JNb2I2NDsgICAvKiBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfTU9CNjQgKi8KKworLyoKKyAqIFJlZGVmaW5lIGFuIG9iamVjdCBpbiB0aGUgT1RhYmxlIHdpdGggUFBONjQgYmFzZS4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kUmVkZWZpbmVHQk1vYjY0IHsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKKyAgIFNWR0FNb2JGb3JtYXQgcHREZXB0aDsKKyAgIFBQTjY0IGJhc2U7CisgICB1aW50MzIgc2l6ZUluQnl0ZXM7Cit9CitfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKK1NWR0EzZENtZFJlZGVmaW5lR0JNb2I2NDsgICAvKiBTVkdBXzNEX0NNRF9SRURFRklORV9HQl9NT0I2NCAqLworCisvKgorICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIHBhZ2UgdGFibGVzIGhhdmUgYmVlbiBtb2RpZmllZC4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kVXBkYXRlR0JNb2JNYXBwaW5nIHsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKK30KK19fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorU1ZHQTNkQ21kVXBkYXRlR0JNb2JNYXBwaW5nOyAgIC8qIFNWR0FfM0RfQ01EX1VQREFURV9HQl9NT0JfTUFQUElORyAqLworCisvKgorICogRGVmaW5lIGEgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZERlZmluZUdCU3VyZmFjZSB7CisgICB1aW50MzIgc2lkOworICAgU1ZHQTNkU3VyZmFjZUZsYWdzIHN1cmZhY2VGbGFnczsKKyAgIFNWR0EzZFN1cmZhY2VGb3JtYXQgZm9ybWF0OworICAgdWludDMyIG51bU1pcExldmVsczsKKyAgIHVpbnQzMiBtdWx0aXNhbXBsZUNvdW50OworICAgU1ZHQTNkVGV4dHVyZUZpbHRlciBhdXRvZ2VuRmlsdGVyOworICAgU1ZHQTNkU2l6ZSBzaXplOworfSBTVkdBM2RDbWREZWZpbmVHQlN1cmZhY2U7ICAgLyogU1ZHQV8zRF9DTURfREVGSU5FX0dCX1NVUkZBQ0UgKi8KKworLyoKKyAqIERlc3Ryb3kgYSBndWVzdC1iYWNrZWQgc3VyZmFjZS4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kRGVzdHJveUdCU3VyZmFjZSB7CisgICB1aW50MzIgc2lkOworfSBTVkdBM2RDbWREZXN0cm95R0JTdXJmYWNlOyAgIC8qIFNWR0FfM0RfQ01EX0RFU1RST1lfR0JfU1VSRkFDRSAqLworCisvKgorICogQmluZCBhIGd1ZXN0LWJhY2tlZCBzdXJmYWNlIHRvIGFuIG9iamVjdC4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kQmluZEdCU3VyZmFjZSB7CisgICB1aW50MzIgc2lkOworICAgU1ZHQU1vYklkIG1vYmlkOworfSBTVkdBM2RDbWRCaW5kR0JTdXJmYWNlOyAgIC8qIFNWR0FfM0RfQ01EX0JJTkRfR0JfU1VSRkFDRSAqLworCisvKgorICogQ29uZGl0aW9uYWxseSBiaW5kIGEgbW9iIHRvIGEgZ3Vlc3QgYmFja2VkIHN1cmZhY2UgaWYgdGVzdE1vYmlkCisgKiBtYXRjaGVzIHRoZSBjdXJyZW50bHkgYm91bmQgbW9iLiAgT3B0aW9uYWxseSBpc3N1ZSBhIHJlYWRiYWNrIG9uCisgKiB0aGUgc3VyZmFjZSB3aGlsZSBpdCBpcyBzdGlsbCBib3VuZCB0byB0aGUgb2xkIG1vYmlkIGlmIHRoZSBtb2JpZAorICogaXMgY2hhbmdlZCBieSB0aGlzIGNvbW1hbmQuCisgKi8KKworI2RlZmluZSBTVkdBM0RfQ09ORF9CSU5EX0dCX1NVUkZBQ0VfRkxBR19SRUFEQkFDSyAoMSA8PCAwKQorCit0eXBlZGVmCitzdHJ1Y3R7CisgICB1aW50MzIgc2lkOworICAgU1ZHQU1vYklkIHRlc3RNb2JpZDsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKKyAgIHVpbnQzMiBmbGFnczsKK30KK1NWR0EzZENtZENvbmRCaW5kR0JTdXJmYWNlOyAgICAgICAgICAvKiBTVkdBXzNEX0NNRF9DT05EX0JJTkRfR0JfU1VSRkFDRSAqLworCisvKgorICogVXBkYXRlIGFuIGltYWdlIGluIGEgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKiAoSW5mb3JtIHRoZSBkZXZpY2UgdGhhdCB0aGUgZ3Vlc3QtY29udGVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQuKQorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRVcGRhdGVHQkltYWdlIHsKKyAgIFNWR0EzZFN1cmZhY2VJbWFnZUlkIGltYWdlOworICAgU1ZHQTNkQm94IGJveDsKK30gU1ZHQTNkQ21kVXBkYXRlR0JJbWFnZTsgICAvKiBTVkdBXzNEX0NNRF9VUERBVEVfR0JfSU1BR0UgKi8KKworLyoKKyAqIFVwZGF0ZSBhbiBlbnRpcmUgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKiAoSW5mb3JtIHRoZSBkZXZpY2UgdGhhdCB0aGUgZ3Vlc3QtY29udGVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQuKQorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRVcGRhdGVHQlN1cmZhY2UgeworICAgdWludDMyIHNpZDsKK30gU1ZHQTNkQ21kVXBkYXRlR0JTdXJmYWNlOyAgIC8qIFNWR0FfM0RfQ01EX1VQREFURV9HQl9TVVJGQUNFICovCisKKy8qCisgKiBSZWFkYmFjayBhbiBpbWFnZSBpbiBhIGd1ZXN0LWJhY2tlZCBzdXJmYWNlLgorICogKFJlcXVlc3QgdGhlIGRldmljZSB0byBmbHVzaCB0aGUgZGlydHkgY29udGVudHMgaW50byB0aGUgZ3Vlc3QuKQorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRSZWFkYmFja0dCSW1hZ2UgeworICAgU1ZHQTNkU3VyZmFjZUltYWdlSWQgaW1hZ2U7Cit9IFNWR0EzZENtZFJlYWRiYWNrR0JJbWFnZTsgICAvKiBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9JTUFHRSovCisKKy8qCisgKiBSZWFkYmFjayBhbiBlbnRpcmUgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKiAoUmVxdWVzdCB0aGUgZGV2aWNlIHRvIGZsdXNoIHRoZSBkaXJ0eSBjb250ZW50cyBpbnRvIHRoZSBndWVzdC4pCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZFJlYWRiYWNrR0JTdXJmYWNlIHsKKyAgIHVpbnQzMiBzaWQ7Cit9IFNWR0EzZENtZFJlYWRiYWNrR0JTdXJmYWNlOyAgIC8qIFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX1NVUkZBQ0UgKi8KKworLyoKKyAqIFJlYWRiYWNrIGEgc3ViIHJlY3Qgb2YgYW4gaW1hZ2UgaW4gYSBndWVzdC1iYWNrZWQgc3VyZmFjZS4gIEFmdGVyCisgKiBpc3N1aW5nIHRoaXMgY29tbWFuZCB0aGUgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIGlzc3VlIGFuIHVwZGF0ZSBjYWxsCisgKiBvZiB0aGUgc2FtZSByZWdpb24gYmVmb3JlIGlzc3VpbmcgYW55IG90aGVyIGNvbW1hbmRzIHRoYXQgcmVmZXJlbmNlCisgKiB0aGlzIHN1cmZhY2Ugb3IgcmVuZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkLgorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRSZWFkYmFja0dCSW1hZ2VQYXJ0aWFsIHsKKyAgIFNWR0EzZFN1cmZhY2VJbWFnZUlkIGltYWdlOworICAgU1ZHQTNkQm94IGJveDsKKyAgIHVpbnQzMiBpbnZlcnRCb3g7Cit9CitTVkdBM2RDbWRSZWFkYmFja0dCSW1hZ2VQYXJ0aWFsOyAvKiBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9JTUFHRV9QQVJUSUFMICovCisKKy8qCisgKiBJbnZhbGlkYXRlIGFuIGltYWdlIGluIGEgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKiAoTm90aWZ5IHRoZSBkZXZpY2UgdGhhdCB0aGUgY29udGVudHMgY2FuIGJlIGxvc3QuKQorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRJbnZhbGlkYXRlR0JJbWFnZSB7CisgICBTVkdBM2RTdXJmYWNlSW1hZ2VJZCBpbWFnZTsKK30gU1ZHQTNkQ21kSW52YWxpZGF0ZUdCSW1hZ2U7ICAgLyogU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9JTUFHRSAqLworCisvKgorICogSW52YWxpZGF0ZSBhbiBlbnRpcmUgZ3Vlc3QtYmFja2VkIHN1cmZhY2UuCisgKiAoTm90aWZ5IHRoZSBkZXZpY2UgdGhhdCB0aGUgY29udGVudHMgaWYgYWxsIGltYWdlcyBjYW4gYmUgbG9zdC4pCisgKi8KKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENtZEludmFsaWRhdGVHQlN1cmZhY2UgeworICAgdWludDMyIHNpZDsKK30gU1ZHQTNkQ21kSW52YWxpZGF0ZUdCU3VyZmFjZTsgLyogU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9TVVJGQUNFICovCisKKy8qCisgKiBJbnZhbGlkYXRlIGEgc3ViIHJlY3Qgb2YgYW4gaW1hZ2UgaW4gYSBndWVzdC1iYWNrZWQgc3VyZmFjZS4gIEFmdGVyCisgKiBpc3N1aW5nIHRoaXMgY29tbWFuZCB0aGUgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIGlzc3VlIGFuIHVwZGF0ZSBjYWxsCisgKiBvZiB0aGUgc2FtZSByZWdpb24gYmVmb3JlIGlzc3VpbmcgYW55IG90aGVyIGNvbW1hbmRzIHRoYXQgcmVmZXJlbmNlCisgKiB0aGlzIHN1cmZhY2Ugb3IgcmVuZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkLgorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWRJbnZhbGlkYXRlR0JJbWFnZVBhcnRpYWwgeworICAgU1ZHQTNkU3VyZmFjZUltYWdlSWQgaW1hZ2U7CisgICBTVkdBM2RCb3ggYm94OworICAgdWludDMyIGludmVydEJveDsKK30KK1NWR0EzZENtZEludmFsaWRhdGVHQkltYWdlUGFydGlhbDsgLyogU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9JTUFHRV9QQVJUSUFMICovCisKKy8qCisgKiBEZWZpbmUgYSBndWVzdC1iYWNrZWQgY29udGV4dC4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kRGVmaW5lR0JDb250ZXh0IHsKKyAgIHVpbnQzMiBjaWQ7Cit9IFNWR0EzZENtZERlZmluZUdCQ29udGV4dDsgICAvKiBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfQ09OVEVYVCAqLworCisvKgorICogRGVzdHJveSBhIGd1ZXN0LWJhY2tlZCBjb250ZXh0LgorICovCisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDbWREZXN0cm95R0JDb250ZXh0IHsKKyAgIHVpbnQzMiBjaWQ7Cit9IFNWR0EzZENtZERlc3Ryb3lHQkNvbnRleHQ7ICAgLyogU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9DT05URVhUICovCisKKy8qCisgKiBCaW5kIGEgZ3Vlc3QtYmFja2VkIGNvbnRleHQuCisgKgorICogdmFsaWRDb250ZW50cyBzaG91bGQgYmUgc2V0IHRvIDAgZm9yIG5ldyBjb250ZXh0cywKKyAqIGFuZCAxIGlmIHRoaXMgaXMgYW4gb2xkIGNvbnRleHQgd2hpY2ggaXMgZ2V0dGluZyBwYWdlZAorICogYmFjayBvbiB0byB0aGUgZGV2aWNlLgorICoKKyAqIEZvciBuZXcgY29udGV4dHMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGRyaXZlcgorICogaXNzdWUgY29tbWFuZHMgdG8gaW5pdGlhbGl6ZSBhbGwgaW50ZXJlc3Rpbmcgc3RhdGUKKyAqIHByaW9yIHRvIHJlbmRlcmluZy4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kQmluZEdCQ29udGV4dCB7CisgICB1aW50MzIgY2lkOworICAgU1ZHQU1vYklkIG1vYmlkOworICAgdWludDMyIHZhbGlkQ29udGVudHM7Cit9IFNWR0EzZENtZEJpbmRHQkNvbnRleHQ7ICAgLyogU1ZHQV8zRF9DTURfQklORF9HQl9DT05URVhUICovCisKKy8qCisgKiBSZWFkYmFjayBhIGd1ZXN0LWJhY2tlZCBjb250ZXh0LgorICogKFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGZsdXNoIHRoZSBjb250ZW50cyBiYWNrIGludG8gZ3Vlc3QgbWVtb3J5LikKKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kUmVhZGJhY2tHQkNvbnRleHQgeworICAgdWludDMyIGNpZDsKK30gU1ZHQTNkQ21kUmVhZGJhY2tHQkNvbnRleHQ7ICAgLyogU1ZHQV8zRF9DTURfUkVBREJBQ0tfR0JfQ09OVEVYVCAqLworCisvKgorICogSW52YWxpZGF0ZSBhIGd1ZXN0LWJhY2tlZCBjb250ZXh0LgorICovCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kSW52YWxpZGF0ZUdCQ29udGV4dCB7CisgICB1aW50MzIgY2lkOworfSBTVkdBM2RDbWRJbnZhbGlkYXRlR0JDb250ZXh0OyAgIC8qIFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfQ09OVEVYVCAqLworCisvKgorICogRGVmaW5lIGEgZ3Vlc3QtYmFja2VkIHNoYWRlci4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQTNkQ21kRGVmaW5lR0JTaGFkZXIgeworICAgdWludDMyIHNoaWQ7CisgICBTVkdBM2RTaGFkZXJUeXBlIHR5cGU7CisgICB1aW50MzIgc2l6ZUluQnl0ZXM7Cit9IFNWR0EzZENtZERlZmluZUdCU2hhZGVyOyAgIC8qIFNWR0FfM0RfQ01EX0RFRklORV9HQl9TSEFERVIgKi8KKworLyoKKyAqIEJpbmQgYSBndWVzdC1iYWNrZWQgc2hhZGVyLgorICovCisKK3R5cGVkZWYgc3RydWN0IFNWR0EzZENtZEJpbmRHQlNoYWRlciB7CisgICB1aW50MzIgc2hpZDsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKKyAgIHVpbnQzMiBvZmZzZXRJbkJ5dGVzOworfSBTVkdBM2RDbWRCaW5kR0JTaGFkZXI7ICAgLyogU1ZHQV8zRF9DTURfQklORF9HQl9TSEFERVIgKi8KKworLyoKKyAqIERlc3Ryb3kgYSBndWVzdC1iYWNrZWQgc2hhZGVyLgorICovCisKK3R5cGVkZWYgc3RydWN0IFNWR0EzZENtZERlc3Ryb3lHQlNoYWRlciB7CisgICB1aW50MzIgc2hpZDsKK30gU1ZHQTNkQ21kRGVzdHJveUdCU2hhZGVyOyAgIC8qIFNWR0FfM0RfQ01EX0RFU1RST1lfR0JfU0hBREVSICovCisKK3R5cGVkZWYKK3N0cnVjdCB7CisgICB1aW50MzIgICAgICAgICAgICAgICAgICBjaWQ7CisgICB1aW50MzIgICAgICAgICAgICAgICAgICByZWdTdGFydDsKKyAgIFNWR0EzZFNoYWRlclR5cGUgICAgICAgIHNoYWRlclR5cGU7CisgICBTVkdBM2RTaGFkZXJDb25zdFR5cGUgICBjb25zdFR5cGU7CisKKyAgIC8qCisgICAgKiBGb2xsb3dlZCBieSBhIHZhcmlhYmxlIG51bWJlciBvZiBzaGFkZXIgY29uc3RhbnRzLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCBGTE9BVCBhbmQgSU5UIGNvbnN0YW50cyBhcmUgNC1kd29yZHMgaW4gbGVuZ3RoLCB3aGlsZQorICAgICogQk9PTCBjb25zdGFudHMgYXJlIDEtZHdvcmQgaW4gbGVuZ3RoLgorICAgICovCit9IFNWR0EzZENtZFNldEdCU2hhZGVyQ29uc3RJbmxpbmU7CisvKiBTVkdBXzNEX0NNRF9TRVRfR0JfU0hBREVSQ09OU1RTX0lOTElORSAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgdWludDMyICAgICAgICAgICAgICAgY2lkOworICAgU1ZHQTNkUXVlcnlUeXBlICAgICAgdHlwZTsKK30gU1ZHQTNkQ21kQmVnaW5HQlF1ZXJ5OyAgICAgICAgICAgLyogU1ZHQV8zRF9DTURfQkVHSU5fR0JfUVVFUlkgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiAgICAgICAgICAgICAgIGNpZDsKKyAgIFNWR0EzZFF1ZXJ5VHlwZSAgICAgIHR5cGU7CisgICBTVkdBTW9iSWQgbW9iaWQ7CisgICB1aW50MzIgb2Zmc2V0OworfSBTVkdBM2RDbWRFbmRHQlF1ZXJ5OyAgICAgICAgICAgICAgICAgIC8qIFNWR0FfM0RfQ01EX0VORF9HQl9RVUVSWSAqLworCisKKy8qCisgKiBTVkdBXzNEX0NNRF9XQUlUX0ZPUl9HQl9RVUVSWSAtLQorICoKKyAqICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBjb21tYW5kIGFyZSBpZGVudGljYWwgdG8gdGhlCisgKiAgICBTVkdBXzNEX0NNRF9XQUlUX0ZPUl9RVUVSWSBleGNlcHQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgd3JpdHRlbgorICogICAgdG8gYSBNb2IgaW5zdGVhZCBvZiBhIEdNUi4KKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgdWludDMyICAgICAgICAgICAgICAgY2lkOworICAgU1ZHQTNkUXVlcnlUeXBlICAgICAgdHlwZTsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKKyAgIHVpbnQzMiBvZmZzZXQ7Cit9IFNWR0EzZENtZFdhaXRGb3JHQlF1ZXJ5OyAgICAgICAgICAvKiBTVkdBXzNEX0NNRF9XQUlUX0ZPUl9HQl9RVUVSWSAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgU1ZHQU1vYklkIG1vYmlkOworICAgdWludDMyIGZiT2Zmc2V0OworICAgdWludDMyIGluaXRhbGl6ZWQ7Cit9CitTVkdBM2RDbWRFbmFibGVHYXJ0OyAgICAgICAgICAgICAgLyogU1ZHQV8zRF9DTURfRU5BQkxFX0dBUlQgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIFNWR0FNb2JJZCBtb2JpZDsKKyAgIHVpbnQzMiBnYXJ0T2Zmc2V0OworfQorU1ZHQTNkQ21kTWFwTW9iSW50b0dhcnQ7ICAgICAgICAgIC8qIFNWR0FfM0RfQ01EX01BUF9NT0JfSU5UT19HQVJUICovCisKKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiBnYXJ0T2Zmc2V0OworICAgdWludDMyIG51bVBhZ2VzOworfQorU1ZHQTNkQ21kVW5tYXBHYXJ0UmFuZ2U7ICAgICAgICAgIC8qIFNWR0FfM0RfQ01EX1VOTUFQX0dBUlRfUkFOR0UgKi8KKworCisvKgorICogU2NyZWVuIFRhcmdldHMKKyAqLworI2RlZmluZSBTVkdBX1NURkxBR19QUklNQVJZICgxIDw8IDApCisKK3R5cGVkZWYKK3N0cnVjdCB7CisgICB1aW50MzIgc3RpZDsKKyAgIHVpbnQzMiB3aWR0aDsKKyAgIHVpbnQzMiBoZWlnaHQ7CisgICBpbnQzMiB4Um9vdDsKKyAgIGludDMyIHlSb290OworICAgdWludDMyIGZsYWdzOworfQorU1ZHQTNkQ21kRGVmaW5lR0JTY3JlZW5UYXJnZXQ7ICAgIC8qIFNWR0FfM0RfQ01EX0RFRklORV9HQl9TQ1JFRU5UQVJHRVQgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiBzdGlkOworfQorU1ZHQTNkQ21kRGVzdHJveUdCU2NyZWVuVGFyZ2V0OyAgLyogU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9TQ1JFRU5UQVJHRVQgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiBzdGlkOworICAgU1ZHQTNkU3VyZmFjZUltYWdlSWQgaW1hZ2U7Cit9CitTVkdBM2RDbWRCaW5kR0JTY3JlZW5UYXJnZXQ7ICAvKiBTVkdBXzNEX0NNRF9CSU5EX0dCX1NDUkVFTlRBUkdFVCAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgdWludDMyIHN0aWQ7CisgICBTVkdBM2RCb3ggYm94OworfQorU1ZHQTNkQ21kVXBkYXRlR0JTY3JlZW5UYXJnZXQ7ICAvKiBTVkdBXzNEX0NNRF9VUERBVEVfR0JfU0NSRUVOVEFSR0VUICovCisKKy8qCiAgKiBDYXBhYmlsaXR5IHF1ZXJ5IGluZGV4LgogICoKICAqIE5vdGVzOgpAQCAtMTg3OSwxMCArMjUzOCw0MSBAQAogICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX0JDNV9VTk9STSAgICAgICAgICAgICAgPSA4MywKIAogICAgLyoKLSAgICAqIERvbid0IGFkZCBuZXcgY2FwcyBpbnRvIHRoZSBwcmV2aW91cyBzZWN0aW9uOyB0aGUgdmFsdWVzIGluIHRoaXMKLSAgICAqIGVudW1lcmF0aW9uIG11c3Qgbm90IGNoYW5nZS4gWW91IGNhbiBwdXQgbmV3IHZhbHVlcyByaWdodCBiZWZvcmUKLSAgICAqIFNWR0EzRF9ERVZDQVBfTUFYLgorICAgICogRGVwcmVjYXRlZC4KICAgICAqLworICAgU1ZHQTNEX0RFVkNBUF9WR1BVMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwKKworICAgLyoKKyAgICAqIFRoaXMgY29udGFpbnMgc2V2ZXJhbCBTVkdBXzNEX0NBUFNfVklERU9fREVDT0RFIGVsZW1lbnRzCisgICAgKiBvcmVkIHRvZ2V0aGVyLCBvbmUgZm9yIGV2ZXJ5IHR5cGUgb2YgdmlkZW8gZGVjb2Rpbmcgc3VwcG9ydGVkLgorICAgICovCisgICBTVkdBM0RfREVWQ0FQX1ZJREVPX0RFQ09ERSAgICAgICAgICAgICAgICAgICAgICA9IDg1LAorCisgICAvKgorICAgICogVGhpcyBjb250YWlucyBzZXZlcmFsIFNWR0FfM0RfQ0FQU19WSURFT19QUk9DRVNTIGVsZW1lbnRzCisgICAgKiBvcmVkIHRvZ2V0aGVyLCBvbmUgZm9yIGV2ZXJ5IHR5cGUgb2YgdmlkZW8gcHJvY2Vzc2luZyBzdXBwb3J0ZWQuCisgICAgKi8KKyAgIFNWR0EzRF9ERVZDQVBfVklERU9fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgID0gODYsCisKKyAgIFNWR0EzRF9ERVZDQVBfTElORV9BQSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODcsICAvKiBib29sZWFuICovCisgICBTVkdBM0RfREVWQ0FQX0xJTkVfU1RJUFBMRSAgICAgICAgICAgICAgICAgICAgICA9IDg4LCAgLyogYm9vbGVhbiAqLworICAgU1ZHQTNEX0RFVkNBUF9NQVhfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgPSA4OSwgIC8qIGZsb2F0ICovCisgICBTVkdBM0RfREVWQ0FQX01BWF9BQV9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICA9IDkwLCAgLyogZmxvYXQgKi8KKworICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX1lWMTIgICAgICAgICAgICAgICAgICAgPSA5MSwKKworICAgLyoKKyAgICAqIERvZXMgdGhlIGhvc3Qgc3VwcG9ydCB0aGUgU1ZHQSBsb2dpYyBvcHMgY29tbWFuZHM/CisgICAgKi8KKyAgIFNWR0EzRF9ERVZDQVBfTE9HSUNPUFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTIsCisKKyAgIC8qCisgICAgKiBXaGF0IHN1cHBvcnQgZG9lcyB0aGUgaG9zdCBoYXZlIGZvciBzY3JlZW4gdGFyZ2V0cz8KKyAgICAqCisgICAgKiBTZWUgdGhlIFNWR0EzRF9TQ1JFRU5UQVJHRVRfQ0FQIGJpdHMgYmVsb3cuCisgICAgKi8KKyAgIFNWR0EzRF9ERVZDQVBfU0NSRUVOVEFSR0VUUyAgICAgICAgICAgICAgICAgICAgID0gOTMsCisKICAgIFNWR0EzRF9ERVZDQVBfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpbmRleC4gKi8KIH0gU1ZHQTNkRGV2Q2FwSW5kZXg7CiAKQEAgLTE4OTMsNCArMjU4MywyOCBAQAogICAgZmxvYXQgIGY7CiB9IFNWR0EzZERldkNhcFJlc3VsdDsKIAordHlwZWRlZiBlbnVtIHsKKyAgIFNWR0EzRENBUFNfUkVDT1JEX1VOS05PV04gICAgICAgID0gMCwKKyAgIFNWR0EzRENBUFNfUkVDT1JEX0RFVkNBUFNfTUlOICAgID0gMHgxMDAsCisgICBTVkdBM0RDQVBTX1JFQ09SRF9ERVZDQVBTICAgICAgICA9IDB4MTAwLAorICAgU1ZHQTNEQ0FQU19SRUNPUkRfREVWQ0FQU19NQVggICAgPSAweDFmZiwKK30gU1ZHQTNkQ2Fwc1JlY29yZFR5cGU7CisKK3R5cGVkZWYKK3N0cnVjdCBTVkdBM2RDYXBzUmVjb3JkSGVhZGVyIHsKKyAgIHVpbnQzMiBsZW5ndGg7CisgICBTVkdBM2RDYXBzUmVjb3JkVHlwZSB0eXBlOworfQorU1ZHQTNkQ2Fwc1JlY29yZEhlYWRlcjsKKwordHlwZWRlZgorc3RydWN0IFNWR0EzZENhcHNSZWNvcmQgeworICAgU1ZHQTNkQ2Fwc1JlY29yZEhlYWRlciBoZWFkZXI7CisgICB1aW50MzIgZGF0YVsxXTsKK30KK1NWR0EzZENhcHNSZWNvcmQ7CisKKwordHlwZWRlZiB1aW50MzIgU1ZHQTNkQ2FwUGFpclsyXTsKKwogI2VuZGlmIC8qIF9TVkdBM0RfUkVHX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfcmVnLmgKaW5kZXggMDFmNjNjYi4uNzFkZWZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9yZWcuaApAQCAtMTY5LDcgKzE2OSwxMCBAQAogICAgU1ZHQV9SRUdfVFJBQ0VTID0gNDUsICAgICAgICAgICAgLyogRW5hYmxlIHRyYWNlLWJhc2VkIHVwZGF0ZXMgZXZlbiB3aGVuIEZJRk8gaXMgb24gKi8KICAgIFNWR0FfUkVHX0dNUlNfTUFYX1BBR0VTID0gNDYsICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIDRLQiBwYWdlcyBmb3IgYWxsIEdNUnMgKi8KICAgIFNWR0FfUkVHX01FTU9SWV9TSVpFID0gNDcsICAgICAgIC8qIFRvdGFsIGRlZGljYXRlZCBkZXZpY2UgbWVtb3J5IGV4Y2x1ZGluZyBGSUZPICovCi0gICBTVkdBX1JFR19UT1AgPSA0OCwgICAgICAgICAgICAgICAvKiBNdXN0IGJlIDEgbW9yZSB0aGFuIHRoZSBsYXN0IHJlZ2lzdGVyICovCisgICBTVkdBX1JFR19NQVhfUFJJTUFSWV9CT1VORElOR19CT1hfTUVNID0gNTAsICAgLyogTWF4IHByaW1hcnkgbWVtb3J5ICovCisgICBTVkdBX1JFR19TVUdHRVNURURfR0JPQkpFQ1RfTUVNX1NJWkVfS0IgPSA1MSwgLyogU3VnZ2VzdGVkIGxpbWl0IG9uIG1vYiBtZW0gKi8KKyAgIFNWR0FfUkVHX0RFVl9DQVAgPSA1MiwgICAgICAgICAgIC8qIFdyaXRlIGRldiBjYXAgaW5kZXgsIHJlYWQgdmFsdWUgKi8KKyAgIFNWR0FfUkVHX1RPUCA9IDUzLCAgICAgICAgICAgICAgIC8qIE11c3QgYmUgMSBtb3JlIHRoYW4gdGhlIGxhc3QgcmVnaXN0ZXIgKi8KIAogICAgU1ZHQV9QQUxFVFRFX0JBU0UgPSAxMDI0LCAgICAgICAgLyogQmFzZSBvZiBTVkdBIGNvbG9yIG1hcCAqLwogICAgLyogTmV4dCA3NjggKD09IDI1NiozKSByZWdpc3RlcnMgZXhpc3QgZm9yIGNvbG9ybWFwICovCkBAIC00MzEsNyArNDM0LDEwIEBACiAjZGVmaW5lIFNWR0FfQ0FQX1RSQUNFUyAgICAgICAgICAgICAweDAwMjAwMDAwCiAjZGVmaW5lIFNWR0FfQ0FQX0dNUjIgICAgICAgICAgICAgICAweDAwNDAwMDAwCiAjZGVmaW5lIFNWR0FfQ0FQX1NDUkVFTl9PQkpFQ1RfMiAgICAweDAwODAwMDAwCi0KKyNkZWZpbmUgU1ZHQV9DQVBfQ09NTUFORF9CVUZGRVJTICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgU1ZHQV9DQVBfREVBRDEgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgU1ZHQV9DQVBfQ01EX0JVRkZFUlNfMiAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgU1ZHQV9DQVBfR0JPQkpFQ1RTICAgICAgICAgIDB4MDgwMDAwMDAKIAogLyoKICAqIEZJRk8gcmVnaXN0ZXIgaW5kaWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKaW5kZXggMDQ4OWM2MS4uNjMyN2NmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKQEAgLTQwLDYgKzQwLDEwIEBACiBzdGF0aWMgdWludDMyX3Qgc3lzX3BsYWNlbWVudF9mbGFncyA9IFRUTV9QTF9GTEFHX1NZU1RFTSB8CiAJVFRNX1BMX0ZMQUdfQ0FDSEVEOwogCitzdGF0aWMgdWludDMyX3Qgc3lzX25lX3BsYWNlbWVudF9mbGFncyA9IFRUTV9QTF9GTEFHX1NZU1RFTSB8CisJVFRNX1BMX0ZMQUdfQ0FDSEVEIHwKKwlUVE1fUExfRkxBR19OT19FVklDVDsKKwogc3RhdGljIHVpbnQzMl90IGdtcl9wbGFjZW1lbnRfZmxhZ3MgPSBWTVdfUExfRkxBR19HTVIgfAogCVRUTV9QTF9GTEFHX0NBQ0hFRDsKIApAQCAtNDcsNiArNTEsOSBAQAogCVRUTV9QTF9GTEFHX0NBQ0hFRCB8CiAJVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CiAKK3N0YXRpYyB1aW50MzJfdCBtb2JfcGxhY2VtZW50X2ZsYWdzID0gVk1XX1BMX0ZMQUdfTU9CIHwKKwlUVE1fUExfRkxBR19DQUNIRUQ7CisKIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX3BsYWNlbWVudCA9IHsKIAkuZnBmbiA9IDAsCiAJLmxwZm4gPSAwLApAQCAtMTE2LDE2ICsxMjMsMjYgQEAKIAkuYnVzeV9wbGFjZW1lbnQgPSAmc3lzX3BsYWNlbWVudF9mbGFncwogfTsKIAorc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3N5c19uZV9wbGFjZW1lbnQgPSB7CisJLmZwZm4gPSAwLAorCS5scGZuID0gMCwKKwkubnVtX3BsYWNlbWVudCA9IDEsCisJLnBsYWNlbWVudCA9ICZzeXNfbmVfcGxhY2VtZW50X2ZsYWdzLAorCS5udW1fYnVzeV9wbGFjZW1lbnQgPSAxLAorCS5idXN5X3BsYWNlbWVudCA9ICZzeXNfbmVfcGxhY2VtZW50X2ZsYWdzCit9OworCiBzdGF0aWMgdWludDMyX3QgZXZpY3RhYmxlX3BsYWNlbWVudF9mbGFnc1tdID0gewogCVRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9GTEFHX0NBQ0hFRCwKIAlUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVELAotCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRAorCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRCwKKwlWTVdfUExfRkxBR19NT0IgfCBUVE1fUExfRkxBR19DQUNIRUQKIH07CiAKIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19ldmljdGFibGVfcGxhY2VtZW50ID0gewogCS5mcGZuID0gMCwKIAkubHBmbiA9IDAsCi0JLm51bV9wbGFjZW1lbnQgPSAzLAorCS5udW1fcGxhY2VtZW50ID0gNCwKIAkucGxhY2VtZW50ID0gZXZpY3RhYmxlX3BsYWNlbWVudF9mbGFncywKIAkubnVtX2J1c3lfcGxhY2VtZW50ID0gMSwKIAkuYnVzeV9wbGFjZW1lbnQgPSAmc3lzX3BsYWNlbWVudF9mbGFncwpAQCAtMTQwLDEwICsxNTcsMjEgQEAKIAkuYnVzeV9wbGFjZW1lbnQgPSBnbXJfdnJhbV9wbGFjZW1lbnRfZmxhZ3MKIH07CiAKK3N0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19tb2JfcGxhY2VtZW50ID0geworCS5mcGZuID0gMCwKKwkubHBmbiA9IDAsCisJLm51bV9wbGFjZW1lbnQgPSAxLAorCS5udW1fYnVzeV9wbGFjZW1lbnQgPSAxLAorCS5wbGFjZW1lbnQgPSAmbW9iX3BsYWNlbWVudF9mbGFncywKKwkuYnVzeV9wbGFjZW1lbnQgPSAmbW9iX3BsYWNlbWVudF9mbGFncworfTsKKwogc3RydWN0IHZtd190dG1fdHQgewogCXN0cnVjdCB0dG1fZG1hX3R0IGRtYV90dG07CiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdjsKIAlpbnQgZ21yX2lkOworCXN0cnVjdCB2bXdfbW9iICptb2I7CisJaW50IG1lbV90eXBlOwogCXN0cnVjdCBzZ190YWJsZSBzZ3Q7CiAJc3RydWN0IHZtd19zZ190YWJsZSB2c2d0OwogCXVpbnQ2NF90IHNnX2FsbG9jX3NpemU7CkBAIC0yNDQsNiArMjcyLDcgQEAKIAkJdml0ZXItPmRtYV9hZGRyZXNzID0gJl9fdm13X3BpdGVyX2RtYV9hZGRyOwogCQl2aXRlci0+cGFnZSA9ICZfX3Ztd19waXRlcl9ub25fc2dfcGFnZTsKIAkJdml0ZXItPmFkZHJzID0gdnNndC0+YWRkcnM7CisJCXZpdGVyLT5wYWdlcyA9IHZzZ3QtPnBhZ2VzOwogCQlicmVhazsKIAljYXNlIHZtd19kbWFfbWFwX3BvcHVsYXRlOgogCWNhc2Ugdm13X2RtYV9tYXBfYmluZDoKQEAgLTQyNCw2ICs0NTMsNjMgQEAKIAl2bXdfdHQtPm1hcHBlZCA9IGZhbHNlOwogfQogCisKKy8qKgorICogdm13X2JvX21hcF9kbWEgLSBNYWtlIHN1cmUgYnVmZmVyIG9iamVjdCBwYWdlcyBhcmUgdmlzaWJsZSB0byB0aGUgZGV2aWNlCisgKgorICogQGJvOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0CisgKgorICogV3JhcHBlciBhcm91bmQgdm13X3R0bV9tYXBfZG1hLCB0aGF0IHRha2VzIGEgVFRNIGJ1ZmZlciBvYmplY3QgcG9pbnRlcgorICogaW5zdGVhZCBvZiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3R0bV9iYWNrZW5kIGFzIGFyZ3VtZW50LgorICogTm90ZSB0aGF0IHRoZSBidWZmZXIgb2JqZWN0IG11c3QgYmUgZWl0aGVyIHBpbm5lZCBvciByZXNlcnZlZCBiZWZvcmUKKyAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IHZtd19ib19tYXBfZG1hKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHZtd190dG1fdHQgKnZtd190dCA9CisJCWNvbnRhaW5lcl9vZihiby0+dHRtLCBzdHJ1Y3Qgdm13X3R0bV90dCwgZG1hX3R0bS50dG0pOworCisJcmV0dXJuIHZtd190dG1fbWFwX2RtYSh2bXdfdHQpOworfQorCisKKy8qKgorICogdm13X2JvX3VubWFwX2RtYSAtIE1ha2Ugc3VyZSBidWZmZXIgb2JqZWN0IHBhZ2VzIGFyZSB2aXNpYmxlIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBAYm86IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QKKyAqCisgKiBXcmFwcGVyIGFyb3VuZCB2bXdfdHRtX3VubWFwX2RtYSwgdGhhdCB0YWtlcyBhIFRUTSBidWZmZXIgb2JqZWN0IHBvaW50ZXIKKyAqIGluc3RlYWQgb2YgYSBwb2ludGVyIHRvIGEgc3RydWN0IHZtd190dG1fYmFja2VuZCBhcyBhcmd1bWVudC4KKyAqLwordm9pZCB2bXdfYm9fdW5tYXBfZG1hKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHZtd190dG1fdHQgKnZtd190dCA9CisJCWNvbnRhaW5lcl9vZihiby0+dHRtLCBzdHJ1Y3Qgdm13X3R0bV90dCwgZG1hX3R0bS50dG0pOworCisJdm13X3R0bV91bm1hcF9kbWEodm13X3R0KTsKK30KKworCisvKioKKyAqIHZtd19ib19zZ190YWJsZSAtIFJldHVybiBhIHN0cnVjdCB2bXdfc2dfdGFibGUgb2JqZWN0IGZvciBhCisgKiBUVE0gYnVmZmVyIG9iamVjdAorICoKKyAqIEBibzogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHZtd19zZ190YWJsZSBvYmplY3QuIFRoZSBvYmplY3Qgc2hvdWxkCisgKiBub3QgYmUgZnJlZWQgYWZ0ZXIgdXNlLgorICogTm90ZSB0aGF0IGZvciB0aGUgZGV2aWNlIGFkZHJlc3NlcyB0byBiZSB2YWxpZCwgdGhlIGJ1ZmZlciBvYmplY3QgbXVzdAorICogZWl0aGVyIGJlIHJlc2VydmVkIG9yIHBpbm5lZC4KKyAqLworY29uc3Qgc3RydWN0IHZtd19zZ190YWJsZSAqdm13X2JvX3NnX3RhYmxlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHZtd190dG1fdHQgKnZtd190dCA9CisJCWNvbnRhaW5lcl9vZihiby0+dHRtLCBzdHJ1Y3Qgdm13X3R0bV90dCwgZG1hX3R0bS50dG0pOworCisJcmV0dXJuICZ2bXdfdHQtPnZzZ3Q7Cit9CisKKwogc3RhdGljIGludCB2bXdfdHRtX2JpbmQoc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1Y3QgdHRtX21lbV9yZWcgKmJvX21lbSkKIHsKIAlzdHJ1Y3Qgdm13X3R0bV90dCAqdm13X2JlID0KQEAgLTQzNSw5ICs1MjEsMjcgQEAKIAkJcmV0dXJuIHJldDsKIAogCXZtd19iZS0+Z21yX2lkID0gYm9fbWVtLT5zdGFydDsKKwl2bXdfYmUtPm1lbV90eXBlID0gYm9fbWVtLT5tZW1fdHlwZTsKIAotCXJldHVybiB2bXdfZ21yX2JpbmQodm13X2JlLT5kZXZfcHJpdiwgJnZtd19iZS0+dnNndCwKLQkJCSAgICB0dG0tPm51bV9wYWdlcywgdm13X2JlLT5nbXJfaWQpOworCXN3aXRjaCAoYm9fbWVtLT5tZW1fdHlwZSkgeworCWNhc2UgVk1XX1BMX0dNUjoKKwkJcmV0dXJuIHZtd19nbXJfYmluZCh2bXdfYmUtPmRldl9wcml2LCAmdm13X2JlLT52c2d0LAorCQkJCSAgICB0dG0tPm51bV9wYWdlcywgdm13X2JlLT5nbXJfaWQpOworCWNhc2UgVk1XX1BMX01PQjoKKwkJaWYgKHVubGlrZWx5KHZtd19iZS0+bW9iID09IE5VTEwpKSB7CisJCQl2bXdfYmUtPm1vYiA9CisJCQkJdm13X21vYl9jcmVhdGUodHRtLT5udW1fcGFnZXMpOworCQkJaWYgKHVubGlrZWx5KHZtd19iZS0+bW9iID09IE5VTEwpKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcmV0dXJuIHZtd19tb2JfYmluZCh2bXdfYmUtPmRldl9wcml2LCB2bXdfYmUtPm1vYiwKKwkJCQkgICAgJnZtd19iZS0+dnNndCwgdHRtLT5udW1fcGFnZXMsCisJCQkJICAgIHZtd19iZS0+Z21yX2lkKTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdm13X3R0bV91bmJpbmQoc3RydWN0IHR0bV90dCAqdHRtKQpAQCAtNDQ1LDcgKzU0OSwxNiBAQAogCXN0cnVjdCB2bXdfdHRtX3R0ICp2bXdfYmUgPQogCQljb250YWluZXJfb2YodHRtLCBzdHJ1Y3Qgdm13X3R0bV90dCwgZG1hX3R0bS50dG0pOwogCi0Jdm13X2dtcl91bmJpbmQodm13X2JlLT5kZXZfcHJpdiwgdm13X2JlLT5nbXJfaWQpOworCXN3aXRjaCAodm13X2JlLT5tZW1fdHlwZSkgeworCWNhc2UgVk1XX1BMX0dNUjoKKwkJdm13X2dtcl91bmJpbmQodm13X2JlLT5kZXZfcHJpdiwgdm13X2JlLT5nbXJfaWQpOworCQlicmVhazsKKwljYXNlIFZNV19QTF9NT0I6CisJCXZtd19tb2JfdW5iaW5kKHZtd19iZS0+ZGV2X3ByaXYsIHZtd19iZS0+bW9iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQogCiAJaWYgKHZtd19iZS0+ZGV2X3ByaXYtPm1hcF9tb2RlID09IHZtd19kbWFfbWFwX2JpbmQpCiAJCXZtd190dG1fdW5tYXBfZG1hKHZtd19iZSk7CkBAIC00NTMsNiArNTY2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZCB2bXdfdHRtX2Rlc3Ryb3koc3RydWN0IHR0bV90dCAqdHRtKQogewogCXN0cnVjdCB2bXdfdHRtX3R0ICp2bXdfYmUgPQpAQCAtNDYzLDkgKzU3NywxNCBAQAogCQl0dG1fZG1hX3R0X2ZpbmkoJnZtd19iZS0+ZG1hX3R0bSk7CiAJZWxzZQogCQl0dG1fdHRfZmluaSh0dG0pOworCisJaWYgKHZtd19iZS0+bW9iKQorCQl2bXdfbW9iX2Rlc3Ryb3kodm13X2JlLT5tb2IpOworCiAJa2ZyZWUodm13X2JlKTsKIH0KIAorCiBzdGF0aWMgaW50IHZtd190dG1fcG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtKQogewogCXN0cnVjdCB2bXdfdHRtX3R0ICp2bXdfdHQgPQpAQCAtNTAwLDYgKzYxOSwxMiBAQAogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfdHQtPmRldl9wcml2OwogCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqZ2xvYiA9IHZtd19tZW1fZ2xvYihkZXZfcHJpdik7CiAKKworCWlmICh2bXdfdHQtPm1vYikgeworCQl2bXdfbW9iX2Rlc3Ryb3kodm13X3R0LT5tb2IpOworCQl2bXdfdHQtPm1vYiA9IE5VTEw7CisJfQorCiAJdm13X3R0bV91bm1hcF9kbWEodm13X3R0KTsKIAlpZiAoZGV2X3ByaXYtPm1hcF9tb2RlID09IHZtd19kbWFfYWxsb2NfY29oZXJlbnQpIHsKIAkJc2l6ZV90IHNpemUgPQpAQCAtNTE3LDcgKzY0Miw3IEBACiAJLmRlc3Ryb3kgPSB2bXdfdHRtX2Rlc3Ryb3ksCiB9OwogCi1zdHJ1Y3QgdHRtX3R0ICp2bXdfdHRtX3R0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKK3N0YXRpYyBzdHJ1Y3QgdHRtX3R0ICp2bXdfdHRtX3R0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKIAkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1aW50MzJfdCBwYWdlX2ZsYWdzLAogCQkJCSBzdHJ1Y3QgcGFnZSAqZHVtbXlfcmVhZF9wYWdlKQogewpAQCAtNTMwLDYgKzY1NSw3IEBACiAKIAl2bXdfYmUtPmRtYV90dG0udHRtLmZ1bmMgPSAmdm13X3R0bV9mdW5jOwogCXZtd19iZS0+ZGV2X3ByaXYgPSBjb250YWluZXJfb2YoYmRldiwgc3RydWN0IHZtd19wcml2YXRlLCBiZGV2KTsKKwl2bXdfYmUtPm1vYiA9IE5VTEw7CiAKIAlpZiAodm13X2JlLT5kZXZfcHJpdi0+bWFwX21vZGUgPT0gdm13X2RtYV9hbGxvY19jb2hlcmVudCkKIAkJcmV0ID0gdHRtX2RtYV90dF9pbml0KCZ2bXdfYmUtPmRtYV90dG0sIGJkZXYsIHNpemUsIHBhZ2VfZmxhZ3MsCkBAIC01NDYsMTIgKzY3MiwxMiBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgdm13X2ludmFsaWRhdGVfY2FjaGVzKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCB1aW50MzJfdCBmbGFncykKK3N0YXRpYyBpbnQgdm13X2ludmFsaWRhdGVfY2FjaGVzKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCB1aW50MzJfdCBmbGFncykKIHsKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZtd19pbml0X21lbV90eXBlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCB1aW50MzJfdCB0eXBlLAorc3RhdGljIGludCB2bXdfaW5pdF9tZW1fdHlwZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdWludDMyX3QgdHlwZSwKIAkJICAgICAgc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCiB7CiAJc3dpdGNoICh0eXBlKSB7CkBAIC01NzEsNiArNjk3LDcgQEAKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CiAJCWJyZWFrOwogCWNhc2UgVk1XX1BMX0dNUjoKKwljYXNlIFZNV19QTF9NT0I6CiAJCS8qCiAJCSAqICJHdWVzdCBNZW1vcnkgUmVnaW9ucyIgaXMgYW4gYXBlcnR1cmUgbGlrZSBmZWF0dXJlIHdpdGgKIAkJICogIG9uZSBzbG90IHBlciBiby4gVGhlcmUgaXMgYW4gdXBwZXIgbGltaXQgb2YgdGhlIG51bWJlciBvZgpAQCAtNTg5LDcgKzcxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdm13X2V2aWN0X2ZsYWdzKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCitzdGF0aWMgdm9pZCB2bXdfZXZpY3RfZmxhZ3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJICAgICBzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50KQogewogCSpwbGFjZW1lbnQgPSB2bXdfc3lzX3BsYWNlbWVudDsKQEAgLTYxOCw2ICs3NDUsNyBAQAogCXN3aXRjaCAobWVtLT5tZW1fdHlwZSkgewogCWNhc2UgVFRNX1BMX1NZU1RFTToKIAljYXNlIFZNV19QTF9HTVI6CisJY2FzZSBWTVdfUExfTU9COgogCQlyZXR1cm4gMDsKIAljYXNlIFRUTV9QTF9WUkFNOgogCQltZW0tPmJ1cy5vZmZzZXQgPSBtZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CkBAIC02NzcsNiArODA1LDM4IEBACiAJCQkJICBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUKTsKIH0KIAorLyoqCisgKiB2bXdfbW92ZV9ub3RpZnkgLSBUVE0gbW92ZV9ub3RpZnlfY2FsbGJhY2sKKyAqCisgKiBAYm86ICAgICAgICAgICAgIFRoZSBUVE0gYnVmZmVyIG9iamVjdCBhYm91dCB0byBtb3ZlLgorICogQG1lbTogICAgICAgICAgICBUaGUgdHJ1Y3QgdHRtX21lbV9yZWcgaW5kaWNhdGluZyB0byB3aGF0IG1lbW9yeQorICogICAgICAgICAgICAgICAgICByZWdpb24gdGhlIG1vdmUgaXMgdGFraW5nIHBsYWNlLgorICoKKyAqIENhbGxzIG1vdmVfbm90aWZ5IGZvciBhbGwgc3Vic3lzdGVtcyBuZWVkaW5nIGl0LgorICogKGN1cnJlbnRseSBvbmx5IHJlc291cmNlcykuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19tb3ZlX25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCXZtd19yZXNvdXJjZV9tb3ZlX25vdGlmeShibywgbWVtKTsKK30KKworCisvKioKKyAqIHZtd19zd2FwX25vdGlmeSAtIFRUTSBtb3ZlX25vdGlmeV9jYWxsYmFjaworICoKKyAqIEBibzogICAgICAgICAgICAgVGhlIFRUTSBidWZmZXIgb2JqZWN0IGFib3V0IHRvIGJlIHN3YXBwZWQgb3V0LgorICovCitzdGF0aWMgdm9pZCB2bXdfc3dhcF9ub3RpZnkoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3sKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OworCisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKKwl0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOworfQorCisKIHN0cnVjdCB0dG1fYm9fZHJpdmVyIHZtd19ib19kcml2ZXIgPSB7CiAJLnR0bV90dF9jcmVhdGUgPSAmdm13X3R0bV90dF9jcmVhdGUsCiAJLnR0bV90dF9wb3B1bGF0ZSA9ICZ2bXdfdHRtX3BvcHVsYXRlLApAQCAtNjkxLDggKzg1MSw4IEBACiAJLnN5bmNfb2JqX2ZsdXNoID0gdm13X3N5bmNfb2JqX2ZsdXNoLAogCS5zeW5jX29ial91bnJlZiA9IHZtd19zeW5jX29ial91bnJlZiwKIAkuc3luY19vYmpfcmVmID0gdm13X3N5bmNfb2JqX3JlZiwKLQkubW92ZV9ub3RpZnkgPSBOVUxMLAotCS5zd2FwX25vdGlmeSA9IE5VTEwsCisJLm1vdmVfbm90aWZ5ID0gdm13X21vdmVfbm90aWZ5LAorCS5zd2FwX25vdGlmeSA9IHZtd19zd2FwX25vdGlmeSwKIAkuZmF1bHRfcmVzZXJ2ZV9ub3RpZnkgPSAmdm13X3R0bV9mYXVsdF9yZXNlcnZlX25vdGlmeSwKIAkuaW9fbWVtX3Jlc2VydmUgPSAmdm13X3R0bV9pb19tZW1fcmVzZXJ2ZSwKIAkuaW9fbWVtX2ZyZWUgPSAmdm13X3R0bV9pb19tZW1fZnJlZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2NvbnRleHQuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2NvbnRleHQuYwppbmRleCAwMGFlMDkyLi45NDI2YzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9jb250ZXh0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfY29udGV4dC5jCkBAIC0zMiwxMiArMzIsMzAgQEAKIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0IHsKIAlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0IGJhc2U7CiAJc3RydWN0IHZtd19yZXNvdXJjZSByZXM7CisJc3RydWN0IHZtd19jdHhfYmluZGluZ19zdGF0ZSBjYnM7CiB9OwogCisKKwordHlwZWRlZiBpbnQgKCp2bXdfc2NydWJfZnVuYykoc3RydWN0IHZtd19jdHhfYmluZGluZm8gKiwgYm9vbCk7CisKIHN0YXRpYyB2b2lkIHZtd191c2VyX2NvbnRleHRfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwogc3RhdGljIHN0cnVjdCB2bXdfcmVzb3VyY2UgKgogdm13X3VzZXJfY29udGV4dF9iYXNlX3RvX3JlcyhzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlKTsKIAorc3RhdGljIGludCB2bXdfZ2JfY29udGV4dF9jcmVhdGUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKK3N0YXRpYyBpbnQgdm13X2diX2NvbnRleHRfYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkgICAgICAgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWYpOworc3RhdGljIGludCB2bXdfZ2JfY29udGV4dF91bmJpbmQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJCSBib29sIHJlYWRiYWNrLAorCQkJCSBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1Zik7CitzdGF0aWMgaW50IHZtd19nYl9jb250ZXh0X2Rlc3Ryb3koc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKK3N0YXRpYyBpbnQgdm13X2NvbnRleHRfc2NydWJfc2hhZGVyKHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSwgYm9vbCByZWJpbmQpOworc3RhdGljIGludCB2bXdfY29udGV4dF9zY3J1Yl9yZW5kZXJfdGFyZ2V0KHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSwKKwkJCQkJICAgYm9vbCByZWJpbmQpOworc3RhdGljIGludCB2bXdfY29udGV4dF9zY3J1Yl90ZXh0dXJlKHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSwgYm9vbCByZWJpbmQpOworc3RhdGljIHZvaWQgdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV9zY3J1YihzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nX3N0YXRlICpjYnMpOworc3RhdGljIHZvaWQgdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV9raWxsKHN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgKmNicyk7CiBzdGF0aWMgdWludDY0X3Qgdm13X3VzZXJfY29udGV4dF9zaXplOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYgdXNlcl9jb250ZXh0X2NvbnYgPSB7CkBAIC02Miw2ICs4MCwyMyBAQAogCS51bmJpbmQgPSBOVUxMCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHZtd19yZXNfZnVuYyB2bXdfZ2JfY29udGV4dF9mdW5jID0geworCS5yZXNfdHlwZSA9IHZtd19yZXNfY29udGV4dCwKKwkubmVlZHNfYmFja3VwID0gdHJ1ZSwKKwkubWF5X2V2aWN0ID0gdHJ1ZSwKKwkudHlwZV9uYW1lID0gImd1ZXN0IGJhY2tlZCBjb250ZXh0cyIsCisJLmJhY2t1cF9wbGFjZW1lbnQgPSAmdm13X21vYl9wbGFjZW1lbnQsCisJLmNyZWF0ZSA9IHZtd19nYl9jb250ZXh0X2NyZWF0ZSwKKwkuZGVzdHJveSA9IHZtd19nYl9jb250ZXh0X2Rlc3Ryb3ksCisJLmJpbmQgPSB2bXdfZ2JfY29udGV4dF9iaW5kLAorCS51bmJpbmQgPSB2bXdfZ2JfY29udGV4dF91bmJpbmQKK307CisKK3N0YXRpYyBjb25zdCB2bXdfc2NydWJfZnVuYyB2bXdfc2NydWJfZnVuY3Nbdm13X2N0eF9iaW5kaW5nX21heF0gPSB7CisJW3Ztd19jdHhfYmluZGluZ19zaGFkZXJdID0gdm13X2NvbnRleHRfc2NydWJfc2hhZGVyLAorCVt2bXdfY3R4X2JpbmRpbmdfcnRdID0gdm13X2NvbnRleHRfc2NydWJfcmVuZGVyX3RhcmdldCwKKwlbdm13X2N0eF9iaW5kaW5nX3RleF0gPSB2bXdfY29udGV4dF9zY3J1Yl90ZXh0dXJlIH07CisKIC8qKgogICogQ29udGV4dCBtYW5hZ2VtZW50OgogICovCkBAIC03Niw2ICsxMTEsMjAgQEAKIAl9ICpjbWQ7CiAKIAorCWlmIChyZXMtPmZ1bmMtPmRlc3Ryb3kgPT0gdm13X2diX2NvbnRleHRfZGVzdHJveSkgeworCQltdXRleF9sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCQkodm9pZCkgdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV9raWxsCisJCQkoJmNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0LCByZXMpLT5jYnMpOworCQkodm9pZCkgdm13X2diX2NvbnRleHRfZGVzdHJveShyZXMpOworCQlpZiAoZGV2X3ByaXYtPnBpbm5lZF9ibyAhPSBOVUxMICYmCisJCSAgICAhZGV2X3ByaXYtPnF1ZXJ5X2NpZF92YWxpZCkKKwkJCV9fdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIE5VTEwpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwkJcmV0dXJuOworCX0KKwogCXZtd19leGVjYnVmX3JlbGVhc2VfcGlubmVkX2JvKGRldl9wcml2KTsKIAljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwogCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKQEAgLTkyLDYgKzE0MSwzMyBAQAogCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKIH0KIAorc3RhdGljIGludCB2bXdfZ2JfY29udGV4dF9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJICAgICAgIHZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCAqdWN0eCA9CisJCWNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0LCByZXMpOworCisJcmV0ID0gdm13X3Jlc291cmNlX2luaXQoZGV2X3ByaXYsIHJlcywgdHJ1ZSwKKwkJCQlyZXNfZnJlZSwgJnZtd19nYl9jb250ZXh0X2Z1bmMpOworCXJlcy0+YmFja3VwX3NpemUgPSBTVkdBM0RfQ09OVEVYVF9EQVRBX1NJWkU7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWlmIChyZXNfZnJlZSkKKwkJCXJlc19mcmVlKHJlcyk7CisJCWVsc2UKKwkJCWtmcmVlKHJlcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KCZ1Y3R4LT5jYnMsIDAsIHNpemVvZih1Y3R4LT5jYnMpKTsKKwlJTklUX0xJU1RfSEVBRCgmdWN0eC0+Y2JzLmxpc3QpOworCisJdm13X3Jlc291cmNlX2FjdGl2YXRlKHJlcywgdm13X2h3X2NvbnRleHRfZGVzdHJveSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdm13X2NvbnRleHRfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywKIAkJCSAgICB2b2lkICgqcmVzX2ZyZWUpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpKQpAQCAtMTAzLDYgKzE3OSw5IEBACiAJCVNWR0EzZENtZERlZmluZUNvbnRleHQgYm9keTsKIAl9ICpjbWQ7CiAKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IpCisJCXJldHVybiB2bXdfZ2JfY29udGV4dF9pbml0KGRldl9wcml2LCByZXMsIHJlc19mcmVlKTsKKwogCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsIGZhbHNlLAogCQkJCXJlc19mcmVlLCAmdm13X2xlZ2FjeV9jb250ZXh0X2Z1bmMpOwogCkBAIC0xNTQsNiArMjMzLDE4MCBAQAogCXJldHVybiAocmV0ID09IDApID8gcmVzIDogTlVMTDsKIH0KIAorCitzdGF0aWMgaW50IHZtd19nYl9jb250ZXh0X2NyZWF0ZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHJlcy0+ZGV2X3ByaXY7CisJaW50IHJldDsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWREZWZpbmVHQkNvbnRleHQgYm9keTsKKwl9ICpjbWQ7CisKKwlpZiAobGlrZWx5KHJlcy0+aWQgIT0gLTEpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHZtd19yZXNvdXJjZV9hbGxvY19pZChyZXMpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBjb250ZXh0IGlkLlxuIik7CisJCWdvdG8gb3V0X25vX2lkOworCX0KKworCWlmICh1bmxpa2VseShyZXMtPmlkID49IFZNV0dGWF9OVU1fR0JfQ09OVEVYVCkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9ub19maWZvOworCX0KKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3IgY29udGV4dCAiCisJCQkgICJjcmVhdGlvbi5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19maWZvOworCX0KKworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfREVGSU5FX0dCX0NPTlRFWFQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5jaWQgPSByZXMtPmlkOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOworCisJcmV0dXJuIDA7CisKK291dF9ub19maWZvOgorCXZtd19yZXNvdXJjZV9yZWxlYXNlX2lkKHJlcyk7CitvdXRfbm9faWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bXdfZ2JfY29udGV4dF9iaW5kKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywKKwkJCSAgICAgICBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1ZikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRCaW5kR0JDb250ZXh0IGJvZHk7CisJfSAqY21kOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSB2YWxfYnVmLT5ibzsKKworCUJVR19PTihiby0+bWVtLm1lbV90eXBlICE9IFZNV19QTF9NT0IpOworCisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBjb250ZXh0ICIKKwkJCSAgImJpbmRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9CSU5EX0dCX0NPTlRFWFQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5jaWQgPSByZXMtPmlkOworCWNtZC0+Ym9keS5tb2JpZCA9IGJvLT5tZW0uc3RhcnQ7CisJY21kLT5ib2R5LnZhbGlkQ29udGVudHMgPSByZXMtPmJhY2t1cF9kaXJ0eTsKKwlyZXMtPmJhY2t1cF9kaXJ0eSA9IGZhbHNlOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtd19nYl9jb250ZXh0X3VuYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkJIGJvb2wgcmVhZGJhY2ssCisJCQkJIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICp2YWxfYnVmKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSB2YWxfYnVmLT5ibzsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisJc3RydWN0IHZtd191c2VyX2NvbnRleHQgKnVjdHggPQorCQljb250YWluZXJfb2YocmVzLCBzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCwgcmVzKTsKKworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFJlYWRiYWNrR0JDb250ZXh0IGJvZHk7CisJfSAqY21kMTsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRCaW5kR0JDb250ZXh0IGJvZHk7CisJfSAqY21kMjsKKwl1aW50MzJfdCBzdWJtaXRfc2l6ZTsKKwl1aW50OF90ICpjbWQ7CisKKworCUJVR19PTihiby0+bWVtLm1lbV90eXBlICE9IFZNV19QTF9NT0IpOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCXZtd19jb250ZXh0X2JpbmRpbmdfc3RhdGVfc2NydWIoJnVjdHgtPmNicyk7CisKKwlzdWJtaXRfc2l6ZSA9IHNpemVvZigqY21kMikgKyAocmVhZGJhY2sgPyBzaXplb2YoKmNtZDEpIDogMCk7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3IgY29udGV4dCAiCisJCQkgICJ1bmJpbmRpbmcuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+YmluZGluZ19tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNtZDIgPSAodm9pZCAqKSBjbWQ7CisJaWYgKHJlYWRiYWNrKSB7CisJCWNtZDEgPSAodm9pZCAqKSBjbWQ7CisJCWNtZDEtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX0NPTlRFWFQ7CisJCWNtZDEtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZDEtPmJvZHkpOworCQljbWQxLT5ib2R5LmNpZCA9IHJlcy0+aWQ7CisJCWNtZDIgPSAodm9pZCAqKSAoJmNtZDFbMV0pOworCX0KKwljbWQyLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9CSU5EX0dCX0NPTlRFWFQ7CisJY21kMi0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kMi0+Ym9keSk7CisJY21kMi0+Ym9keS5jaWQgPSByZXMtPmlkOworCWNtZDItPmJvZHkubW9iaWQgPSBTVkdBM0RfSU5WQUxJRF9JRDsKKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc3VibWl0X3NpemUpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCisJLyoKKwkgKiBDcmVhdGUgYSBmZW5jZSBvYmplY3QgYW5kIGZlbmNlIHRoZSBiYWNrdXAgYnVmZmVyLgorCSAqLworCisJKHZvaWQpIHZtd19leGVjYnVmX2ZlbmNlX2NvbW1hbmRzKE5VTEwsIGRldl9wcml2LAorCQkJCQkgICZmZW5jZSwgTlVMTCk7CisKKwl2bXdfZmVuY2Vfc2luZ2xlX2JvKGJvLCBmZW5jZSk7CisKKwlpZiAobGlrZWx5KGZlbmNlICE9IE5VTEwpKQorCQl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXdfZ2JfY29udGV4dF9kZXN0cm95KHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWREZXN0cm95R0JDb250ZXh0IGJvZHk7CisJfSAqY21kOworCisJaWYgKGxpa2VseShyZXMtPmlkID09IC0xKSkKKwkJcmV0dXJuIDA7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIGNvbnRleHQgIgorCQkJICAiZGVzdHJ1Y3Rpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX0NPTlRFWFQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5jaWQgPSByZXMtPmlkOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoZGV2X3ByaXYtPnF1ZXJ5X2NpZCA9PSByZXMtPmlkKQorCQlkZXZfcHJpdi0+cXVlcnlfY2lkX3ZhbGlkID0gZmFsc2U7CisJdm13X3Jlc291cmNlX3JlbGVhc2VfaWQocmVzKTsKKwl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBVc2VyLXNwYWNlIGNvbnRleHQgbWFuYWdlbWVudDoKICAqLwpAQCAtMjcyLDMgKzUyNSwzODMgQEAKIAlyZXR1cm4gcmV0OwogCiB9CisKKy8qKgorICogdm13X2NvbnRleHRfc2NydWJfc2hhZGVyIC0gc2NydWIgYSBzaGFkZXIgYmluZGluZyBmcm9tIGEgY29udGV4dC4KKyAqCisgKiBAYmk6IHNpbmdsZSBiaW5kaW5nIGluZm9ybWF0aW9uLgorICogQHJlYmluZDogV2hldGhlciB0byBpc3N1ZSBhIGJpbmQgaW5zdGVhZCBvZiBzY3J1YiBjb21tYW5kLgorICovCitzdGF0aWMgaW50IHZtd19jb250ZXh0X3NjcnViX3NoYWRlcihzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5mbyAqYmksIGJvb2wgcmViaW5kKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaS0+Y3R4LT5kZXZfcHJpdjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRTZXRTaGFkZXIgYm9keTsKKwl9ICpjbWQ7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIHNoYWRlciAiCisJCQkgICJ1bmJpbmRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9TRVRfU0hBREVSOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuY2lkID0gYmktPmN0eC0+aWQ7CisJY21kLT5ib2R5LnR5cGUgPSBiaS0+aTEuc2hhZGVyX3R5cGU7CisJY21kLT5ib2R5LnNoaWQgPQorCQljcHVfdG9fbGUzMigocmViaW5kKSA/IGJpLT5yZXMtPmlkIDogU1ZHQTNEX0lOVkFMSURfSUQpOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19jb250ZXh0X3NjcnViX3JlbmRlcl90YXJnZXQgLSBzY3J1YiBhIHJlbmRlciB0YXJnZXQgYmluZGluZworICogZnJvbSBhIGNvbnRleHQuCisgKgorICogQGJpOiBzaW5nbGUgYmluZGluZyBpbmZvcm1hdGlvbi4KKyAqIEByZWJpbmQ6IFdoZXRoZXIgdG8gaXNzdWUgYSBiaW5kIGluc3RlYWQgb2Ygc2NydWIgY29tbWFuZC4KKyAqLworc3RhdGljIGludCB2bXdfY29udGV4dF9zY3J1Yl9yZW5kZXJfdGFyZ2V0KHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSwKKwkJCQkJICAgYm9vbCByZWJpbmQpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IGJpLT5jdHgtPmRldl9wcml2OworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFNldFJlbmRlclRhcmdldCBib2R5OworCX0gKmNtZDsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3IgcmVuZGVyIHRhcmdldCAiCisJCQkgICJ1bmJpbmRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9TRVRSRU5ERVJUQVJHRVQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5jaWQgPSBiaS0+Y3R4LT5pZDsKKwljbWQtPmJvZHkudHlwZSA9IGJpLT5pMS5ydF90eXBlOworCWNtZC0+Ym9keS50YXJnZXQuc2lkID0KKwkJY3B1X3RvX2xlMzIoKHJlYmluZCkgPyBiaS0+cmVzLT5pZCA6IFNWR0EzRF9JTlZBTElEX0lEKTsKKwljbWQtPmJvZHkudGFyZ2V0LmZhY2UgPSAwOworCWNtZC0+Ym9keS50YXJnZXQubWlwbWFwID0gMDsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY29udGV4dF9zY3J1Yl90ZXh0dXJlIC0gc2NydWIgYSB0ZXh0dXJlIGJpbmRpbmcgZnJvbSBhIGNvbnRleHQuCisgKgorICogQGJpOiBzaW5nbGUgYmluZGluZyBpbmZvcm1hdGlvbi4KKyAqIEByZWJpbmQ6IFdoZXRoZXIgdG8gaXNzdWUgYSBiaW5kIGluc3RlYWQgb2Ygc2NydWIgY29tbWFuZC4KKyAqCisgKiBUT0RPOiBQb3NzaWJseSBjb21wbGVtZW50IHRoaXMgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMKKyAqIGEgbGlzdCBvZiB0ZXh0dXJlIGJpbmRpbmdzIGFuZCBjb21iaW5lcyB0aGVtIHRvIGEgc2luZ2xlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgdm13X2NvbnRleHRfc2NydWJfdGV4dHVyZShzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5mbyAqYmksCisJCQkJICAgICBib29sIHJlYmluZCkKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gYmktPmN0eC0+ZGV2X3ByaXY7CisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJc3RydWN0IHsKKwkJCVNWR0EzZENtZFNldFRleHR1cmVTdGF0ZSBjOworCQkJU1ZHQTNkVGV4dHVyZVN0YXRlIHMxOworCQl9IGJvZHk7CisJfSAqY21kOworCisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciB0ZXh0dXJlICIKKwkJCSAgInVuYmluZGluZy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfU0VUVEVYVFVSRVNUQVRFOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuYy5jaWQgPSBiaS0+Y3R4LT5pZDsKKwljbWQtPmJvZHkuczEuc3RhZ2UgPSBiaS0+aTEudGV4dHVyZV9zdGFnZTsKKwljbWQtPmJvZHkuczEubmFtZSA9IFNWR0EzRF9UU19CSU5EX1RFWFRVUkU7CisJY21kLT5ib2R5LnMxLnZhbHVlID0KKwkJY3B1X3RvX2xlMzIoKHJlYmluZCkgPyBiaS0+cmVzLT5pZCA6IFNWR0EzRF9JTlZBTElEX0lEKTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY29udGV4dF9iaW5kaW5nX2Ryb3A6IFN0b3AgdHJhY2tpbmcgYSBjb250ZXh0IGJpbmRpbmcKKyAqCisgKiBAY2I6IFBvaW50ZXIgdG8gYmluZGluZyB0cmFja2VyIHN0b3JhZ2UuCisgKgorICogU3RvcHMgdHJhY2tpbmcgYSBjb250ZXh0IGJpbmRpbmcsIGFuZCByZS1pbml0aWFsaXplcyBpdHMgc3RvcmFnZS4KKyAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIGNvbnRleHQgYmluZGluZyBpcyByZXBsYWNlZCB3aXRoIGEgYmluZGluZyB0bworICogYW5vdGhlciAob3IgdGhlIHNhbWUsIGZvciB0aGF0IG1hdHRlcikgcmVzb3VyY2UuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19jb250ZXh0X2JpbmRpbmdfZHJvcChzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nICpjYikKK3sKKwlsaXN0X2RlbCgmY2ItPmN0eF9saXN0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNiLT5yZXNfbGlzdCkpCisJCWxpc3RfZGVsKCZjYi0+cmVzX2xpc3QpOworCWNiLT5iaS5jdHggPSBOVUxMOworfQorCisvKioKKyAqIHZtd19jb250ZXh0X2JpbmRpbmdfYWRkOiBTdGFydCB0cmFja2luZyBhIGNvbnRleHQgYmluZGluZworICoKKyAqIEBjYnM6IFBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYmluZGluZyBzdGF0ZSB0cmFja2VyLgorICogQGJpOiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmluZGluZyB0byB0cmFjay4KKyAqCisgKiBQZXJmb3JtcyBiYXNpYyBjaGVja3Mgb24gdGhlIGJpbmRpbmcgdG8gbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgd2l0aGluCisgKiBib3VuZHMgYW5kIHRoZW4gc3RhcnRzIHRyYWNraW5nIHRoZSBiaW5kaW5nIGluIHRoZSBjb250ZXh0IGJpbmRpbmcKKyAqIHN0YXRlIHN0cnVjdHVyZSBAY2JzLgorICovCitpbnQgdm13X2NvbnRleHRfYmluZGluZ19hZGQoc3RydWN0IHZtd19jdHhfYmluZGluZ19zdGF0ZSAqY2JzLAorCQkJICAgIGNvbnN0IHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSkKK3sKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nICpsb2M7CisKKwlzd2l0Y2ggKGJpLT5idCkgeworCWNhc2Ugdm13X2N0eF9iaW5kaW5nX3J0OgorCQlpZiAodW5saWtlbHkoKHVuc2lnbmVkKWJpLT5pMS5ydF90eXBlID49IFNWR0EzRF9SVF9NQVgpKSB7CisJCQlEUk1fRVJST1IoIklsbGVnYWwgcmVuZGVyIHRhcmdldCB0eXBlICV1LlxuIiwKKwkJCQkgICh1bnNpZ25lZCkgYmktPmkxLnJ0X3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbG9jID0gJmNicy0+cmVuZGVyX3RhcmdldHNbYmktPmkxLnJ0X3R5cGVdOworCQlicmVhazsKKwljYXNlIHZtd19jdHhfYmluZGluZ190ZXg6CisJCWlmICh1bmxpa2VseSgodW5zaWduZWQpYmktPmkxLnRleHR1cmVfc3RhZ2UgPj0KKwkJCSAgICAgU1ZHQTNEX05VTV9URVhUVVJFX1VOSVRTKSkgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIHRleHR1cmUvc2FtcGxlciB1bml0ICV1LlxuIiwKKwkJCQkgICh1bnNpZ25lZCkgYmktPmkxLnRleHR1cmVfc3RhZ2UpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbG9jID0gJmNicy0+dGV4dHVyZV91bml0c1tiaS0+aTEudGV4dHVyZV9zdGFnZV07CisJCWJyZWFrOworCWNhc2Ugdm13X2N0eF9iaW5kaW5nX3NoYWRlcjoKKwkJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCliaS0+aTEuc2hhZGVyX3R5cGUgPj0KKwkJCSAgICAgU1ZHQTNEX1NIQURFUlRZUEVfTUFYKSkgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIHNoYWRlciB0eXBlICV1LlxuIiwKKwkJCQkgICh1bnNpZ25lZCkgYmktPmkxLnNoYWRlcl90eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWxvYyA9ICZjYnMtPnNoYWRlcnNbYmktPmkxLnNoYWRlcl90eXBlXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJaWYgKGxvYy0+YmkuY3R4ICE9IE5VTEwpCisJCXZtd19jb250ZXh0X2JpbmRpbmdfZHJvcChsb2MpOworCisJbG9jLT5iaSA9ICpiaTsKKwlsb2MtPmJpLnNjcnViYmVkID0gZmFsc2U7CisJbGlzdF9hZGRfdGFpbCgmbG9jLT5jdHhfbGlzdCwgJmNicy0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmxvYy0+cmVzX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdm13X2NvbnRleHRfYmluZGluZ190cmFuc2ZlcjogVHJhbnNmZXIgYSBjb250ZXh0IGJpbmRpbmcgdHJhY2tpbmcgZW50cnkuCisgKgorICogQGNiczogUG9pbnRlciB0byB0aGUgcGVyc2lzdGVudCBjb250ZXh0IGJpbmRpbmcgc3RhdGUgdHJhY2tlci4KKyAqIEBiaTogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpbmRpbmcgdG8gdHJhY2suCisgKgorICovCitzdGF0aWMgdm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX3RyYW5zZmVyKHN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgKmNicywKKwkJCQkJIGNvbnN0IHN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvICpiaSkKK3sKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nICpsb2M7CisKKwlzd2l0Y2ggKGJpLT5idCkgeworCWNhc2Ugdm13X2N0eF9iaW5kaW5nX3J0OgorCQlsb2MgPSAmY2JzLT5yZW5kZXJfdGFyZ2V0c1tiaS0+aTEucnRfdHlwZV07CisJCWJyZWFrOworCWNhc2Ugdm13X2N0eF9iaW5kaW5nX3RleDoKKwkJbG9jID0gJmNicy0+dGV4dHVyZV91bml0c1tiaS0+aTEudGV4dHVyZV9zdGFnZV07CisJCWJyZWFrOworCWNhc2Ugdm13X2N0eF9iaW5kaW5nX3NoYWRlcjoKKwkJbG9jID0gJmNicy0+c2hhZGVyc1tiaS0+aTEuc2hhZGVyX3R5cGVdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAobG9jLT5iaS5jdHggIT0gTlVMTCkKKwkJdm13X2NvbnRleHRfYmluZGluZ19kcm9wKGxvYyk7CisKKwlpZiAoYmktPnJlcyAhPSBOVUxMKSB7CisJCWxvYy0+YmkgPSAqYmk7CisJCWxpc3RfYWRkX3RhaWwoJmxvYy0+Y3R4X2xpc3QsICZjYnMtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZsb2MtPnJlc19saXN0LCAmYmktPnJlcy0+YmluZGluZ19oZWFkKTsKKwl9Cit9CisKKy8qKgorICogdm13X2NvbnRleHRfYmluZGluZ19raWxsIC0gS2lsbCBhIGJpbmRpbmcgb24gdGhlIGRldmljZQorICogYW5kIHN0b3AgdHJhY2tpbmcgaXQuCisgKgorICogQGNiOiBQb2ludGVyIHRvIGJpbmRpbmcgdHJhY2tlciBzdG9yYWdlLgorICoKKyAqIEVtaXRzIEZJRk8gY29tbWFuZHMgdG8gc2NydWIgYSBiaW5kaW5nIHJlcHJlc2VudGVkIGJ5IEBjYi4KKyAqIFRoZW4gc3RvcHMgdHJhY2tpbmcgdGhlIGJpbmRpbmcgYW5kIHJlLWluaXRpYWxpemVzIGl0cyBzdG9yYWdlLgorICovCitzdGF0aWMgdm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX2tpbGwoc3RydWN0IHZtd19jdHhfYmluZGluZyAqY2IpCit7CisJaWYgKCFjYi0+Ymkuc2NydWJiZWQpIHsKKwkJKHZvaWQpIHZtd19zY3J1Yl9mdW5jc1tjYi0+YmkuYnRdKCZjYi0+YmksIGZhbHNlKTsKKwkJY2ItPmJpLnNjcnViYmVkID0gdHJ1ZTsKKwl9CisJdm13X2NvbnRleHRfYmluZGluZ19kcm9wKGNiKTsKK30KKworLyoqCisgKiB2bXdfY29udGV4dF9iaW5kaW5nX3N0YXRlX2tpbGwgLSBLaWxsIGFsbCBiaW5kaW5ncyBhc3NvY2lhdGVkIHdpdGggYQorICogc3RydWN0IHZtd19jdHhfYmluZGluZyBzdGF0ZSBzdHJ1Y3R1cmUsIGFuZCByZS1pbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogQGNiczogUG9pbnRlciB0byB0aGUgY29udGV4dCBiaW5kaW5nIHN0YXRlIHRyYWNrZXIuCisgKgorICogRW1pdHMgY29tbWFuZHMgdG8gc2NydWIgYWxsIGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGNvbnRleHQgYmluZGluZyBzdGF0ZSB0cmFja2VyLiBUaGVuIHJlLWluaXRpYWxpemVzIHRoZSB3aG9sZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19jb250ZXh0X2JpbmRpbmdfc3RhdGVfa2lsbChzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nX3N0YXRlICpjYnMpCit7CisJc3RydWN0IHZtd19jdHhfYmluZGluZyAqZW50cnksICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmY2JzLT5saXN0LCBjdHhfbGlzdCkKKwkJdm13X2NvbnRleHRfYmluZGluZ19raWxsKGVudHJ5KTsKK30KKworLyoqCisgKiB2bXdfY29udGV4dF9iaW5kaW5nX3N0YXRlX3NjcnViIC0gU2NydWIgYWxsIGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCBhCisgKiBzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nIHN0YXRlIHN0cnVjdHVyZS4KKyAqCisgKiBAY2JzOiBQb2ludGVyIHRvIHRoZSBjb250ZXh0IGJpbmRpbmcgc3RhdGUgdHJhY2tlci4KKyAqCisgKiBFbWl0cyBjb21tYW5kcyB0byBzY3J1YiBhbGwgYmluZGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY29udGV4dCBiaW5kaW5nIHN0YXRlIHRyYWNrZXIuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19jb250ZXh0X2JpbmRpbmdfc3RhdGVfc2NydWIoc3RydWN0IHZtd19jdHhfYmluZGluZ19zdGF0ZSAqY2JzKQoreworCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmNicy0+bGlzdCwgY3R4X2xpc3QpIHsKKwkJaWYgKCFlbnRyeS0+Ymkuc2NydWJiZWQpIHsKKwkJCSh2b2lkKSB2bXdfc2NydWJfZnVuY3NbZW50cnktPmJpLmJ0XSgmZW50cnktPmJpLCBmYWxzZSk7CisJCQllbnRyeS0+Ymkuc2NydWJiZWQgPSB0cnVlOworCQl9CisJfQorfQorCisvKioKKyAqIHZtd19jb250ZXh0X2JpbmRpbmdfcmVzX2xpc3Rfa2lsbCAtIEtpbGwgYWxsIGJpbmRpbmdzIG9uIGEKKyAqIHJlc291cmNlIGJpbmRpbmcgbGlzdAorICoKKyAqIEBoZWFkOiBsaXN0IGhlYWQgb2YgcmVzb3VyY2UgYmluZGluZyBsaXN0CisgKgorICogS2lsbHMgYWxsIGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHJlc291cmNlLiBUeXBpY2FsbHkKKyAqIGNhbGxlZCBiZWZvcmUgdGhlIHJlc291cmNlIGlzIGRlc3Ryb3llZC4KKyAqLwordm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X2tpbGwoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nICplbnRyeSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsIGhlYWQsIHJlc19saXN0KQorCQl2bXdfY29udGV4dF9iaW5kaW5nX2tpbGwoZW50cnkpOworfQorCisvKioKKyAqIHZtd19jb250ZXh0X2JpbmRpbmdfcmVzX2xpc3Rfc2NydWIgLSBTY3J1YiBhbGwgYmluZGluZ3Mgb24gYQorICogcmVzb3VyY2UgYmluZGluZyBsaXN0CisgKgorICogQGhlYWQ6IGxpc3QgaGVhZCBvZiByZXNvdXJjZSBiaW5kaW5nIGxpc3QKKyAqCisgKiBTY3J1YiBhbGwgYmluZGluZ3MgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcmVzb3VyY2UuIFR5cGljYWxseQorICogY2FsbGVkIGJlZm9yZSB0aGUgcmVzb3VyY2UgaXMgZXZpY3RlZC4KKyAqLwordm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X3NjcnViKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IHZtd19jdHhfYmluZGluZyAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBoZWFkLCByZXNfbGlzdCkgeworCQlpZiAoIWVudHJ5LT5iaS5zY3J1YmJlZCkgeworCQkJKHZvaWQpIHZtd19zY3J1Yl9mdW5jc1tlbnRyeS0+YmkuYnRdKCZlbnRyeS0+YmksIGZhbHNlKTsKKwkJCWVudHJ5LT5iaS5zY3J1YmJlZCA9IHRydWU7CisJCX0KKwl9Cit9CisKKy8qKgorICogdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV90cmFuc2ZlciAtIENvbW1pdCBzdGFnZWQgYmluZGluZyBpbmZvCisgKgorICogQGN0eDogUG9pbnRlciB0byBjb250ZXh0IHRvIGNvbW1pdCB0aGUgc3RhZ2VkIGJpbmRpbmcgaW5mbyB0by4KKyAqIEBmcm9tOiBTdGFnZWQgYmluZGluZyBpbmZvIGJ1aWx0IGR1cmluZyBleGVjYnVmLgorICoKKyAqIFRyYW5zZmVycyBiaW5kaW5nIGluZm8gZnJvbSBhIHRlbXBvcmFyeSBzdHJ1Y3R1cmUgdG8gdGhlIHBlcnNpc3RlbnQKKyAqIHN0cnVjdHVyZSBpbiB0aGUgY29udGV4dC4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIGNvbW1hbmRzCisgKi8KK3ZvaWQgdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV90cmFuc2ZlcihzdHJ1Y3Qgdm13X3Jlc291cmNlICpjdHgsCisJCQkJCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgKmZyb20pCit7CisJc3RydWN0IHZtd191c2VyX2NvbnRleHQgKnVjdHggPQorCQljb250YWluZXJfb2YoY3R4LCBzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCwgcmVzKTsKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nICplbnRyeSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZmcm9tLT5saXN0LCBjdHhfbGlzdCkKKwkJdm13X2NvbnRleHRfYmluZGluZ190cmFuc2ZlcigmdWN0eC0+Y2JzLCAmZW50cnktPmJpKTsKK30KKworLyoqCisgKiB2bXdfY29udGV4dF9yZWJpbmRfYWxsIC0gUmViaW5kIGFsbCBzY3J1YmJlZCBiaW5kaW5ncyBvZiBhIGNvbnRleHQKKyAqCisgKiBAY3R4OiBUaGUgY29udGV4dCByZXNvdXJjZQorICoKKyAqIFdhbGtzIHRocm91Z2ggdGhlIGNvbnRleHQgYmluZGluZyBsaXN0IGFuZCByZWJpbmRzIGFsbCBzY3J1YmJlZAorICogcmVzb3VyY2VzLgorICovCitpbnQgdm13X2NvbnRleHRfcmViaW5kX2FsbChzdHJ1Y3Qgdm13X3Jlc291cmNlICpjdHgpCit7CisJc3RydWN0IHZtd19jdHhfYmluZGluZyAqZW50cnk7CisJc3RydWN0IHZtd191c2VyX2NvbnRleHQgKnVjdHggPQorCQljb250YWluZXJfb2YoY3R4LCBzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCwgcmVzKTsKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nX3N0YXRlICpjYnMgPSAmdWN0eC0+Y2JzOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmY2JzLT5saXN0LCBjdHhfbGlzdCkgeworCQlpZiAobGlrZWx5KCFlbnRyeS0+Ymkuc2NydWJiZWQpKQorCQkJY29udGludWU7CisKKwkJaWYgKFdBUk5fT04oZW50cnktPmJpLnJlcyA9PSBOVUxMIHx8IGVudHJ5LT5iaS5yZXMtPmlkID09CisJCQkgICAgU1ZHQTNEX0lOVkFMSURfSUQpKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gdm13X3NjcnViX2Z1bmNzW2VudHJ5LT5iaS5idF0oJmVudHJ5LT5iaSwgdHJ1ZSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCWVudHJ5LT5iaS5zY3J1YmJlZCA9IGZhbHNlOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19jb250ZXh0X2JpbmRpbmdfbGlzdCAtIFJldHVybiBhIGxpc3Qgb2YgY29udGV4dCBiaW5kaW5ncworICoKKyAqIEBjdHg6IFRoZSBjb250ZXh0IHJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCBsaXN0IG9mIGJpbmRpbmdzIG9mIHRoZSBnaXZlbiBjb250ZXh0LiBOb3RlIHRoYXQKKyAqIHRoaXMgbGlzdCBiZWNvbWVzIHN0YWxlIGFzIHNvb24gYXMgdGhlIGRldl9wcml2OjpiaW5kaW5nX211dGV4IGlzIHVubG9ja2VkLgorICovCitzdHJ1Y3QgbGlzdF9oZWFkICp2bXdfY29udGV4dF9iaW5kaW5nX2xpc3Qoc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4KQoreworCXJldHVybiAmKGNvbnRhaW5lcl9vZihjdHgsIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0LCByZXMpLT5jYnMubGlzdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kbWFidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jCmluZGV4IGQ0ZTU0ZmMuLmE3NTg0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jCkBAIC0yOTAsOCArMjkwLDcgQEAKIC8qKgogICogdm13X2JvX3BpbiAtIFBpbiBvciB1bnBpbiBhIGJ1ZmZlciBvYmplY3Qgd2l0aG91dCBtb3ZpbmcgaXQuCiAgKgotICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdC4gTXVzdCBiZSByZXNlcnZlZCwgYW5kIHByZXNlbnQgZWl0aGVyIGluIFZSQU0KLSAqIG9yIEdNUiBtZW1vcnkuCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0LiBNdXN0IGJlIHJlc2VydmVkLgogICogQHBpbjogV2hldGhlciB0byBwaW4gb3IgdW5waW4uCiAgKgogICovCkBAIC0zMDMsMTAgKzMwMiw5IEBACiAJaW50IHJldDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmJvLT5yZXN2LT5sb2NrLmJhc2UpOwotCUJVR19PTihvbGRfbWVtX3R5cGUgIT0gVFRNX1BMX1ZSQU0gJiYKLQkgICAgICAgb2xkX21lbV90eXBlICE9IFZNV19QTF9HTVIpOwogCi0JcGxfZmxhZ3MgPSBUVE1fUExfRkxBR19WUkFNIHwgVk1XX1BMX0ZMQUdfR01SIHwgVFRNX1BMX0ZMQUdfQ0FDSEVEOworCXBsX2ZsYWdzID0gVFRNX1BMX0ZMQUdfVlJBTSB8IFZNV19QTF9GTEFHX0dNUiB8IFZNV19QTF9GTEFHX01PQgorCQl8IFRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9GTEFHX0NBQ0hFRDsKIAlpZiAocGluKQogCQlwbF9mbGFncyB8PSBUVE1fUExfRkxBR19OT19FVklDVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwppbmRleCBjN2E1NDk2Li4zYmRjMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwpAQCAtMTEyLDYgKzExMiwyMSBAQAogI2RlZmluZSBEUk1fSU9DVExfVk1XX1VQREFURV9MQVlPVVQJCQkJXAogCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfVVBEQVRFX0xBWU9VVCwJXAogCQkgc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcpCisjZGVmaW5lIERSTV9JT0NUTF9WTVdfQ1JFQVRFX1NIQURFUgkJCQlcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfQ1JFQVRFX1NIQURFUiwJXAorCQkgc3RydWN0IGRybV92bXdfc2hhZGVyX2NyZWF0ZV9hcmcpCisjZGVmaW5lIERSTV9JT0NUTF9WTVdfVU5SRUZfU0hBREVSCQkJCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX1VOUkVGX1NIQURFUiwJXAorCQkgc3RydWN0IGRybV92bXdfc2hhZGVyX2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19HQl9TVVJGQUNFX0NSRUFURQkJCQlcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfR0JfU1VSRkFDRV9DUkVBVEUsCVwKKwkJIHVuaW9uIGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX0dCX1NVUkZBQ0VfUkVGCQkJCVwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiwJXAorCQkgdW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9hcmcpCisjZGVmaW5lIERSTV9JT0NUTF9WTVdfU1lOQ0NQVQkJCQkJXAorCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfU1lOQ0NQVSwJCVwKKwkJIHN0cnVjdCBkcm1fdm13X3N5bmNjcHVfYXJnKQogCiAvKioKICAqIFRoZSBjb3JlIERSTSB2ZXJzaW9uIG9mIHRoaXMgbWFjcm8gZG9lc24ndCBhY2NvdW50IGZvcgpAQCAtMTc3LDYgKzE5MiwyMSBAQAogCVZNV19JT0NUTF9ERUYoVk1XX1VQREFURV9MQVlPVVQsCiAJCSAgICAgIHZtd19rbXNfdXBkYXRlX2xheW91dF9pb2N0bCwKIAkJICAgICAgRFJNX01BU1RFUiB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfQ1JFQVRFX1NIQURFUiwKKwkJICAgICAgdm13X3NoYWRlcl9kZWZpbmVfaW9jdGwsCisJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKKwlWTVdfSU9DVExfREVGKFZNV19VTlJFRl9TSEFERVIsCisJCSAgICAgIHZtd19zaGFkZXJfZGVzdHJveV9pb2N0bCwKKwkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAorCVZNV19JT0NUTF9ERUYoVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFLAorCQkgICAgICB2bXdfZ2Jfc3VyZmFjZV9kZWZpbmVfaW9jdGwsCisJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKKwlWTVdfSU9DVExfREVGKFZNV19HQl9TVVJGQUNFX1JFRiwKKwkJICAgICAgdm13X2diX3N1cmZhY2VfcmVmZXJlbmNlX2lvY3RsLAorCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfU1lOQ0NQVSwKKwkJICAgICAgdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfaW9jdGwsCisJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2bXdfcGNpX2lkX2xpc3RbXSA9IHsKQEAgLTE4OSw2ICsyMTksNyBAQAogc3RhdGljIGludCB2bXdfZm9yY2VfaW9tbXU7CiBzdGF0aWMgaW50IHZtd19yZXN0cmljdF9pb21tdTsKIHN0YXRpYyBpbnQgdm13X2ZvcmNlX2NvaGVyZW50Oworc3RhdGljIGludCB2bXdfcmVzdHJpY3RfZG1hX21hc2s7CiAKIHN0YXRpYyBpbnQgdm13X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOwogc3RhdGljIHZvaWQgdm13X21hc3Rlcl9pbml0KHN0cnVjdCB2bXdfbWFzdGVyICopOwpAQCAtMjAzLDYgKzIzNCw4IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVzdHJpY3RfaW9tbXUsIHZtd19yZXN0cmljdF9pb21tdSwgaW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfY29oZXJlbnQsICJGb3JjZSBjb2hlcmVudCBUVE0gcGFnZXMiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChmb3JjZV9jb2hlcmVudCwgdm13X2ZvcmNlX2NvaGVyZW50LCBpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhyZXN0cmljdF9kbWFfbWFzaywgIlJlc3RyaWN0IERNQSBtYXNrIHRvIDQ0IGJpdHMgd2l0aCBJT01NVSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHJlc3RyaWN0X2RtYV9tYXNrLCB2bXdfcmVzdHJpY3RfZG1hX21hc2ssIGludCwgMDYwMCk7CiAKIAogc3RhdGljIHZvaWQgdm13X3ByaW50X2NhcGFiaWxpdGllcyh1aW50MzJfdCBjYXBhYmlsaXRpZXMpCkBAIC0yNDAsNTIgKzI3MywxNCBAQAogCQlEUk1fSU5GTygiICBHTVIyLlxuIik7CiAJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX1NDUkVFTl9PQkpFQ1RfMikKIAkJRFJNX0lORk8oIiAgU2NyZWVuIE9iamVjdCAyLlxuIik7CisJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0NPTU1BTkRfQlVGRkVSUykKKwkJRFJNX0lORk8oIiAgQ29tbWFuZCBCdWZmZXJzLlxuIik7CisJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0NNRF9CVUZGRVJTXzIpCisJCURSTV9JTkZPKCIgIENvbW1hbmQgQnVmZmVycyAyLlxuIik7CisJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dCT0JKRUNUUykKKwkJRFJNX0lORk8oIiAgR3Vlc3QgQmFja2VkIFJlc291cmNlcy5cbiIpOwogfQogCi0KLS8qKgotICogdm13X2V4ZWNidWZfcHJlcGFyZV9kdW1teV9xdWVyeSAtIEluaXRpYWxpemUgYSBxdWVyeSByZXN1bHQgc3RydWN0dXJlIGF0Ci0gKiB0aGUgc3RhcnQgb2YgYSBidWZmZXIgb2JqZWN0LgotICoKLSAqIEBkZXZfcHJpdjogVGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaWRsZSB0aGUgYnVmZmVyIHVzaW5nIGFuIHVuaW50ZXJydXB0aWJsZSB3YWl0LCB0aGVuCi0gKiBtYXAgdGhlIGZpcnN0IHBhZ2UgYW5kIGluaXRpYWxpemUgYSBwZW5kaW5nIG9jY2x1c2lvbiBxdWVyeSByZXN1bHQgc3RydWN0dXJlLAotICogRmluYWxseSBpdCB3aWxsIHVubWFwIHRoZSBidWZmZXIuCi0gKgotICogVE9ETzogU2luY2Ugd2UncmUgb25seSBtYXBwaW5nIGEgc2luZ2xlIHBhZ2UsIHdlIHNob3VsZCBvcHRpbWl6ZSB0aGUgbWFwCi0gKiB0byB1c2Uga21hcF9hdG9taWMgLyBpb21hcF9hdG9taWMuCi0gKi8KLXN0YXRpYyB2b2lkIHZtd19kdW1teV9xdWVyeV9ib19wcmVwYXJlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHR0bV9ib19rbWFwX29iaiBtYXA7Ci0Jdm9sYXRpbGUgU1ZHQTNkUXVlcnlSZXN1bHQgKnJlc3VsdDsKLQlib29sIGR1bW15OwotCWludCByZXQ7Ci0Jc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSAmZGV2X3ByaXYtPmJkZXY7Ci0Jc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGRldl9wcml2LT5kdW1teV9xdWVyeV9ibzsKLQotCXR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKLQlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwotCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJKHZvaWQpIHZtd19mYWxsYmFja193YWl0KGRldl9wcml2LCBmYWxzZSwgdHJ1ZSwgMCwgZmFsc2UsCi0JCQkJCSAxMCpIWik7Ci0KLQlyZXQgPSB0dG1fYm9fa21hcChibywgMCwgMSwgJm1hcCk7Ci0JaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKLQkJcmVzdWx0ID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm1hcCwgJmR1bW15KTsKLQkJcmVzdWx0LT50b3RhbFNpemUgPSBzaXplb2YoKnJlc3VsdCk7Ci0JCXJlc3VsdC0+c3RhdGUgPSBTVkdBM0RfUVVFUllTVEFURV9QRU5ESU5HOwotCQlyZXN1bHQtPnJlc3VsdDMyID0gMHhmZjsKLQkJdHRtX2JvX2t1bm1hcCgmbWFwKTsKLQl9IGVsc2UKLQkJRFJNX0VSUk9SKCJEdW1teSBxdWVyeSBidWZmZXIgbWFwIGZhaWxlZC5cbiIpOwotCXR0bV9ib191bnJlc2VydmUoYm8pOwotfQotCi0KIC8qKgogICogdm13X2R1bW15X3F1ZXJ5X2JvX2NyZWF0ZSAtIGNyZWF0ZSBhIGJvIHRvIGhvbGQgYSBkdW1teSBxdWVyeSByZXN1bHQKICAqCkBAIC0yOTMsMjAgKzI4OCw1NyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHNtYWxsIGJ1ZmZlciBvYmplY3QgdGhhdCBob2xkcyB0aGUgcXVlcnkKICAqIHJlc3VsdCBmb3IgZHVtbXkgcXVlcmllcyBlbWl0dGVkIGFzIHF1ZXJ5IGJhcnJpZXJzLgorICogVGhlIGZ1bmN0aW9uIHdpbGwgdGhlbiBtYXAgdGhlIGZpcnN0IHBhZ2UgYW5kIGluaXRpYWxpemUgYSBwZW5kaW5nCisgKiBvY2NsdXNpb24gcXVlcnkgcmVzdWx0IHN0cnVjdHVyZSwgRmluYWxseSBpdCB3aWxsIHVubWFwIHRoZSBidWZmZXIuCiAgKiBObyBpbnRlcnJ1cHRpYmxlIHdhaXRzIGFyZSBkb25lIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLgogICoKLSAqIFJldHVybnMgYW4gZXJyb3IgaWYgYm8gY3JlYXRpb24gZmFpbHMuCisgKiBSZXR1cm5zIGFuIGVycm9yIGlmIGJvIGNyZWF0aW9uIG9yIGluaXRpYWxpemF0aW9uIGZhaWxzLgogICovCiBzdGF0aWMgaW50IHZtd19kdW1teV9xdWVyeV9ib19jcmVhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKLQlyZXR1cm4gdHRtX2JvX2NyZWF0ZSgmZGV2X3ByaXYtPmJkZXYsCi0JCQkgICAgIFBBR0VfU0laRSwKLQkJCSAgICAgdHRtX2JvX3R5cGVfZGV2aWNlLAotCQkJICAgICAmdm13X3ZyYW1fc3lzX3BsYWNlbWVudCwKLQkJCSAgICAgMCwgZmFsc2UsIE5VTEwsCi0JCQkgICAgICZkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8pOwotfQorCWludCByZXQ7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKKwlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqIG1hcDsKKwl2b2xhdGlsZSBTVkdBM2RRdWVyeVJlc3VsdCAqcmVzdWx0OworCWJvb2wgZHVtbXk7CiAKKwkvKgorCSAqIENyZWF0ZSB0aGUgYm8gYXMgcGlubmVkLCBzbyB0aGF0IGEgdHJ5cmVzZXJ2ZSB3aWxsCisJICogaW1tZWRpYXRlbHkgc3VjY2VlZC4gVGhpcyBpcyBiZWNhdXNlIHdlJ3JlIHRoZSBvbmx5CisJICogdXNlciBvZiB0aGUgYm8gY3VycmVudGx5LgorCSAqLworCXJldCA9IHR0bV9ib19jcmVhdGUoJmRldl9wcml2LT5iZGV2LAorCQkJICAgIFBBR0VfU0laRSwKKwkJCSAgICB0dG1fYm9fdHlwZV9kZXZpY2UsCisJCQkgICAgJnZtd19zeXNfbmVfcGxhY2VtZW50LAorCQkJICAgIDAsIGZhbHNlLCBOVUxMLAorCQkJICAgICZibyk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCB0cnVlLCBmYWxzZSwgMCk7CisJQlVHX09OKHJldCAhPSAwKTsKKworCXJldCA9IHR0bV9ib19rbWFwKGJvLCAwLCAxLCAmbWFwKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQlyZXN1bHQgPSB0dG1fa21hcF9vYmpfdmlydHVhbCgmbWFwLCAmZHVtbXkpOworCQlyZXN1bHQtPnRvdGFsU2l6ZSA9IHNpemVvZigqcmVzdWx0KTsKKwkJcmVzdWx0LT5zdGF0ZSA9IFNWR0EzRF9RVUVSWVNUQVRFX1BFTkRJTkc7CisJCXJlc3VsdC0+cmVzdWx0MzIgPSAweGZmOworCQl0dG1fYm9fa3VubWFwKCZtYXApOworCX0KKwl2bXdfYm9fcGluKGJvLCBmYWxzZSk7CisJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCURSTV9FUlJPUigiRHVtbXkgcXVlcnkgYnVmZmVyIG1hcCBmYWlsZWQuXG4iKTsKKwkJdHRtX2JvX3VucmVmKCZibyk7CisJfSBlbHNlCisJCWRldl9wcml2LT5kdW1teV9xdWVyeV9ibyA9IGJvOworCisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIGludCB2bXdfcmVxdWVzdF9kZXZpY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKQEAgLTMxOCwxNCArMzUwLDI0IEBACiAJCXJldHVybiByZXQ7CiAJfQogCXZtd19mZW5jZV9maWZvX3VwKGRldl9wcml2LT5mbWFuKTsKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IpIHsKKwkJcmV0ID0gdm13X290YWJsZXNfc2V0dXAoZGV2X3ByaXYpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCQlEUk1fRVJST1IoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJCQkgICJndWVzdCBNZW1vcnkgT0JqZWN0cy5cbiIpOworCQkJZ290byBvdXRfbm9fbW9iOworCQl9CisJfQogCXJldCA9IHZtd19kdW1teV9xdWVyeV9ib19jcmVhdGUoZGV2X3ByaXYpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X25vX3F1ZXJ5X2JvOwotCXZtd19kdW1teV9xdWVyeV9ib19wcmVwYXJlKGRldl9wcml2KTsKIAogCXJldHVybiAwOwogCiBvdXRfbm9fcXVlcnlfYm86CisJaWYgKGRldl9wcml2LT5oYXNfbW9iKQorCQl2bXdfb3RhYmxlc190YWtlZG93bihkZXZfcHJpdik7CitvdXRfbm9fbW9iOgogCXZtd19mZW5jZV9maWZvX2Rvd24oZGV2X3ByaXYtPmZtYW4pOwogCXZtd19maWZvX3JlbGVhc2UoZGV2X3ByaXYsICZkZXZfcHJpdi0+Zmlmbyk7CiAJcmV0dXJuIHJldDsKQEAgLTM0MSwxMCArMzgzLDEzIEBACiAJQlVHX09OKGRldl9wcml2LT5waW5uZWRfYm8gIT0gTlVMTCk7CiAKIAl0dG1fYm9fdW5yZWYoJmRldl9wcml2LT5kdW1teV9xdWVyeV9ibyk7CisJaWYgKGRldl9wcml2LT5oYXNfbW9iKQorCQl2bXdfb3RhYmxlc190YWtlZG93bihkZXZfcHJpdik7CiAJdm13X2ZlbmNlX2ZpZm9fZG93bihkZXZfcHJpdi0+Zm1hbik7CiAJdm13X2ZpZm9fcmVsZWFzZShkZXZfcHJpdiwgJmRldl9wcml2LT5maWZvKTsKIH0KIAorCiAvKioKICAqIEluY3JlYXNlIHRoZSAzZCByZXNvdXJjZSByZWZjb3VudC4KICAqIElmIHRoZSBjb3VudCB3YXMgcHJldm91c2x5IHplcm8sIGluaXRpYWxpemUgdGhlIGZpZm8sIHN3aXRjaGluZyB0byBzdmdhCkBAIC01MTAsNiArNTU1LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogdm13X2RtYV9tYXNrcyAtIHNldCByZXF1aXJlZCBwYWdlLSBhbmQgZG1hIG1hc2tzCisgKgorICogQGRldjogUG9pbnRlciB0byBzdHJ1Y3QgZHJtLWRldmljZQorICoKKyAqIFdpdGggMzItYml0IHdlIGNhbiBvbmx5IGhhbmRsZSAzMiBiaXQgUEZOcy4gT3B0aW9uYWxseSBzZXQgdGhhdAorICogcmVzdHJpY3Rpb24gYWxzbyBmb3IgNjQtYml0IHN5c3RlbXMuCisgKi8KKyNpZmRlZiBDT05GSUdfSU5URUxfSU9NTVUKK3N0YXRpYyBpbnQgdm13X2RtYV9tYXNrcyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJaWYgKGludGVsX2lvbW11X2VuYWJsZWQgJiYKKwkgICAgKHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA0IHx8IHZtd19yZXN0cmljdF9kbWFfbWFzaykpIHsKKwkJRFJNX0lORk8oIlJlc3RyaWN0aW5nIERNQSBhZGRyZXNzZXMgdG8gNDQgYml0cy5cbiIpOworCQlyZXR1cm4gZG1hX3NldF9tYXNrKGRldi0+ZGV2LCBETUFfQklUX01BU0soNDQpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCB2bXdfZG1hX21hc2tzKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCB2bXdfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXY7CkBAIC01MzIsNiArNjA0LDcgQEAKIAltdXRleF9pbml0KCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldl9wcml2LT5yZWxlYXNlX211dGV4KTsKKwltdXRleF9pbml0KCZkZXZfcHJpdi0+YmluZGluZ19tdXRleCk7CiAJcndsb2NrX2luaXQoJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKIAogCWZvciAoaSA9IHZtd19yZXNfY29udGV4dDsgaSA8IHZtd19yZXNfbWF4OyArK2kpIHsKQEAgLTU3OCwxNCArNjUxLDkgQEAKIAogCXZtd19nZXRfaW5pdGlhbF9zaXplKGRldl9wcml2KTsKIAotCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SKSB7Ci0JCWRldl9wcml2LT5tYXhfZ21yX2Rlc2NyaXB0b3JzID0KLQkJCXZtd19yZWFkKGRldl9wcml2LAotCQkJCSBTVkdBX1JFR19HTVJfTUFYX0RFU0NSSVBUT1JfTEVOR1RIKTsKKwlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUjIpIHsKIAkJZGV2X3ByaXYtPm1heF9nbXJfaWRzID0KIAkJCXZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19HTVJfTUFYX0lEUyk7Ci0JfQotCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikgewogCQlkZXZfcHJpdi0+bWF4X2dtcl9wYWdlcyA9CiAJCQl2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfR01SU19NQVhfUEFHRVMpOwogCQlkZXZfcHJpdi0+bWVtb3J5X3NpemUgPQpAQCAtNTk4LDIzICs2NjYsNDIgQEAKIAkJICovCiAJCWRldl9wcml2LT5tZW1vcnlfc2l6ZSA9IDUxMioxMDI0KjEwMjQ7CiAJfQorCWRldl9wcml2LT5tYXhfbW9iX3BhZ2VzID0gMDsKKwlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dCT0JKRUNUUykgeworCQl1aW50NjRfdCBtZW1fc2l6ZSA9CisJCQl2bXdfcmVhZChkZXZfcHJpdiwKKwkJCQkgU1ZHQV9SRUdfU1VHR0VTVEVEX0dCT0JKRUNUX01FTV9TSVpFX0tCKTsKKworCQlkZXZfcHJpdi0+bWF4X21vYl9wYWdlcyA9IG1lbV9zaXplICogMTAyNCAvIFBBR0VfU0laRTsKKwkJZGV2X3ByaXYtPnByaW1fYmJfbWVtID0KKwkJCXZtd19yZWFkKGRldl9wcml2LAorCQkJCSBTVkdBX1JFR19NQVhfUFJJTUFSWV9CT1VORElOR19CT1hfTUVNKTsKKwl9IGVsc2UKKwkJZGV2X3ByaXYtPnByaW1fYmJfbWVtID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKKworCXJldCA9IHZtd19kbWFfbWFza3MoZGV2X3ByaXYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCQlnb3RvIG91dF9lcnIwOworCX0KKworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+cHJpbV9iYl9tZW0gPCBkZXZfcHJpdi0+dnJhbV9zaXplKSkKKwkJZGV2X3ByaXYtPnByaW1fYmJfbWVtID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKIAogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIAogCXZtd19wcmludF9jYXBhYmlsaXRpZXMoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUikgeworCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikgewogCQlEUk1fSU5GTygiTWF4IEdNUiBpZHMgaXMgJXVcbiIsCiAJCQkgKHVuc2lnbmVkKWRldl9wcml2LT5tYXhfZ21yX2lkcyk7Ci0JCURSTV9JTkZPKCJNYXggR01SIGRlc2NyaXB0b3JzIGlzICV1XG4iLAotCQkJICh1bnNpZ25lZClkZXZfcHJpdi0+bWF4X2dtcl9kZXNjcmlwdG9ycyk7Ci0JfQotCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikgewogCQlEUk1fSU5GTygiTWF4IG51bWJlciBvZiBHTVIgcGFnZXMgaXMgJXVcbiIsCiAJCQkgKHVuc2lnbmVkKWRldl9wcml2LT5tYXhfZ21yX3BhZ2VzKTsKIAkJRFJNX0lORk8oIk1heCBkZWRpY2F0ZWQgaHlwZXJ2aXNvciBzdXJmYWNlIG1lbW9yeSBpcyAldSBraUJcbiIsCiAJCQkgKHVuc2lnbmVkKWRldl9wcml2LT5tZW1vcnlfc2l6ZSAvIDEwMjQpOwogCX0KKwlEUk1fSU5GTygiTWF4aW11bSBkaXNwbGF5IG1lbW9yeSBzaXplIGlzICV1IGtpQlxuIiwKKwkJIGRldl9wcml2LT5wcmltX2JiX21lbSAvIDEwMjQpOwogCURSTV9JTkZPKCJWUkFNIGF0IDB4JTA4eCBzaXplIGlzICV1IGtpQlxuIiwKIAkJIGRldl9wcml2LT52cmFtX3N0YXJ0LCBkZXZfcHJpdi0+dnJhbV9zaXplIC8gMTAyNCk7CiAJRFJNX0lORk8oIk1NSU8gYXQgMHglMDh4IHNpemUgaXMgJXUga2lCXG4iLApAQCAtNjQ5LDEyICs3MzYsMjIgQEAKIAlkZXZfcHJpdi0+aGFzX2dtciA9IHRydWU7CiAJaWYgKCgoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIChTVkdBX0NBUF9HTVIgfCBTVkdBX0NBUF9HTVIyKSkgPT0gMCkgfHwKIAkgICAgcmVmdXNlX2RtYSB8fCB0dG1fYm9faW5pdF9tbSgmZGV2X3ByaXYtPmJkZXYsIFZNV19QTF9HTVIsCi0JCQkJCSBkZXZfcHJpdi0+bWF4X2dtcl9pZHMpICE9IDApIHsKKwkJCQkJIFZNV19QTF9HTVIpICE9IDApIHsKIAkJRFJNX0lORk8oIk5vIEdNUiBtZW1vcnkgYXZhaWxhYmxlLiAiCiAJCQkgIkdyYXBoaWNzIG1lbW9yeSByZXNvdXJjZXMgYXJlIHZlcnkgbGltaXRlZC5cbiIpOwogCQlkZXZfcHJpdi0+aGFzX2dtciA9IGZhbHNlOwogCX0KIAorCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR0JPQkpFQ1RTKSB7CisJCWRldl9wcml2LT5oYXNfbW9iID0gdHJ1ZTsKKwkJaWYgKHR0bV9ib19pbml0X21tKCZkZXZfcHJpdi0+YmRldiwgVk1XX1BMX01PQiwKKwkJCQkgICBWTVdfUExfTU9CKSAhPSAwKSB7CisJCQlEUk1fSU5GTygiTm8gTU9CIG1lbW9yeSBhdmFpbGFibGUuICIKKwkJCQkgIjNEIHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKwkJCWRldl9wcml2LT5oYXNfbW9iID0gZmFsc2U7CisJCX0KKwl9CisKIAlkZXZfcHJpdi0+bW1pb19tdHJyID0gYXJjaF9waHlzX3djX2FkZChkZXZfcHJpdi0+bW1pb19zdGFydCwKIAkJCQkJICAgICAgIGRldl9wcml2LT5tbWlvX3NpemUpOwogCkBAIC03NTcsNiArODU0LDggQEAKIAlpb3VubWFwKGRldl9wcml2LT5tbWlvX3ZpcnQpOwogb3V0X2VycjM6CiAJYXJjaF9waHlzX3djX2RlbChkZXZfcHJpdi0+bW1pb19tdHJyKTsKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IpCisJCSh2b2lkKSB0dG1fYm9fY2xlYW5fbW0oJmRldl9wcml2LT5iZGV2LCBWTVdfUExfTU9CKTsKIAlpZiAoZGV2X3ByaXYtPmhhc19nbXIpCiAJCSh2b2lkKSB0dG1fYm9fY2xlYW5fbW0oJmRldl9wcml2LT5iZGV2LCBWTVdfUExfR01SKTsKIAkodm9pZCl0dG1fYm9fY2xlYW5fbW0oJmRldl9wcml2LT5iZGV2LCBUVE1fUExfVlJBTSk7CkBAIC04MDEsNiArOTAwLDggQEAKIAl0dG1fb2JqZWN0X2RldmljZV9yZWxlYXNlKCZkZXZfcHJpdi0+dGRldik7CiAJaW91bm1hcChkZXZfcHJpdi0+bW1pb192aXJ0KTsKIAlhcmNoX3BoeXNfd2NfZGVsKGRldl9wcml2LT5tbWlvX210cnIpOworCWlmIChkZXZfcHJpdi0+aGFzX21vYikKKwkJKHZvaWQpIHR0bV9ib19jbGVhbl9tbSgmZGV2X3ByaXYtPmJkZXYsIFZNV19QTF9NT0IpOwogCWlmIChkZXZfcHJpdi0+aGFzX2dtcikKIAkJKHZvaWQpdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+YmRldiwgVk1XX1BMX0dNUik7CiAJKHZvaWQpdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+YmRldiwgVFRNX1BMX1ZSQU0pOwpAQCAtODQwLDYgKzk0MSw3IEBACiAJCWRybV9tYXN0ZXJfcHV0KCZ2bXdfZnAtPmxvY2tlZF9tYXN0ZXIpOwogCX0KIAorCXZtd19jb21wYXRfc2hhZGVyX21hbl9kZXN0cm95KHZtd19mcC0+c2htYW4pOwogCXR0bV9vYmplY3RfZmlsZV9yZWxlYXNlKCZ2bXdfZnAtPnRmaWxlKTsKIAlrZnJlZSh2bXdfZnApOwogfQpAQCAtODU5LDExICs5NjEsMTcgQEAKIAlpZiAodW5saWtlbHkodm13X2ZwLT50ZmlsZSA9PSBOVUxMKSkKIAkJZ290byBvdXRfbm9fdGZpbGU7CiAKKwl2bXdfZnAtPnNobWFuID0gdm13X2NvbXBhdF9zaGFkZXJfbWFuX2NyZWF0ZShkZXZfcHJpdik7CisJaWYgKElTX0VSUih2bXdfZnAtPnNobWFuKSkKKwkJZ290byBvdXRfbm9fc2htYW47CisKIAlmaWxlX3ByaXYtPmRyaXZlcl9wcml2ID0gdm13X2ZwOwogCWRldl9wcml2LT5iZGV2LmRldl9tYXBwaW5nID0gZGV2LT5kZXZfbWFwcGluZzsKIAogCXJldHVybiAwOwogCitvdXRfbm9fc2htYW46CisJdHRtX29iamVjdF9maWxlX3JlbGVhc2UoJnZtd19mcC0+dGZpbGUpOwogb3V0X25vX3RmaWxlOgogCWtmcmVlKHZtd19mcCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKaW5kZXggMjA4OTBhZC4uZWNhYTMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKQEAgLTQwLDkgKzQwLDkgQEAKICNpbmNsdWRlIDxkcm0vdHRtL3R0bV9tb2R1bGUuaD4KICNpbmNsdWRlICJ2bXdnZnhfZmVuY2UuaCIKIAotI2RlZmluZSBWTVdHRlhfRFJJVkVSX0RBVEUgIjIwMTIwMjA5IgorI2RlZmluZSBWTVdHRlhfRFJJVkVSX0RBVEUgIjIwMTIxMTE0IgogI2RlZmluZSBWTVdHRlhfRFJJVkVSX01BSk9SIDIKLSNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9NSU5PUiA0CisjZGVmaW5lIFZNV0dGWF9EUklWRVJfTUlOT1IgNQogI2RlZmluZSBWTVdHRlhfRFJJVkVSX1BBVENITEVWRUwgMAogI2RlZmluZSBWTVdHRlhfRklMRV9QQUdFX09GRlNFVCAweDAwMTAwMDAwCiAjZGVmaW5lIFZNV0dGWF9GSUZPX1NUQVRJQ19TSVpFICgxMDI0KjEwMjQpCkBAIC01MCwxOSArNTAsMzkgQEAKICNkZWZpbmUgVk1XR0ZYX01BWF9WQUxJREFUSU9OUyAyMDQ4CiAjZGVmaW5lIFZNV0dGWF9NQVhfRElTUExBWVMgMTYKICNkZWZpbmUgVk1XR0ZYX0NNRF9CT1VOQ0VfSU5JVF9TSVpFIDMyNzY4CisjZGVmaW5lIFZNV0dGWF9FTkFCTEVfU0NSRUVOX1RBUkdFVF9PVEFCTEUgMAorCisvKgorICogUGVyaGFwcyB3ZSBzaG91bGQgaGF2ZSBzeXNmcyBlbnRyaWVzIGZvciB0aGVzZS4KKyAqLworI2RlZmluZSBWTVdHRlhfTlVNX0dCX0NPTlRFWFQgMjU2CisjZGVmaW5lIFZNV0dGWF9OVU1fR0JfU0hBREVSIDIwMDAwCisjZGVmaW5lIFZNV0dGWF9OVU1fR0JfU1VSRkFDRSAzMjc2OAorI2RlZmluZSBWTVdHRlhfTlVNX0dCX1NDUkVFTl9UQVJHRVQgVk1XR0ZYX01BWF9ESVNQTEFZUworI2RlZmluZSBWTVdHRlhfTlVNX01PQiAoVk1XR0ZYX05VTV9HQl9DT05URVhUICtcCisJCQlWTVdHRlhfTlVNX0dCX1NIQURFUiArXAorCQkJVk1XR0ZYX05VTV9HQl9TVVJGQUNFICtcCisJCQlWTVdHRlhfTlVNX0dCX1NDUkVFTl9UQVJHRVQpCiAKICNkZWZpbmUgVk1XX1BMX0dNUiBUVE1fUExfUFJJVjAKICNkZWZpbmUgVk1XX1BMX0ZMQUdfR01SIFRUTV9QTF9GTEFHX1BSSVYwCisjZGVmaW5lIFZNV19QTF9NT0IgVFRNX1BMX1BSSVYxCisjZGVmaW5lIFZNV19QTF9GTEFHX01PQiBUVE1fUExfRkxBR19QUklWMQogCiAjZGVmaW5lIFZNV19SRVNfQ09OVEVYVCB0dG1fZHJpdmVyX3R5cGUwCiAjZGVmaW5lIFZNV19SRVNfU1VSRkFDRSB0dG1fZHJpdmVyX3R5cGUxCiAjZGVmaW5lIFZNV19SRVNfU1RSRUFNIHR0bV9kcml2ZXJfdHlwZTIKICNkZWZpbmUgVk1XX1JFU19GRU5DRSB0dG1fZHJpdmVyX3R5cGUzCisjZGVmaW5lIFZNV19SRVNfU0hBREVSIHR0bV9kcml2ZXJfdHlwZTQKKworc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXI7CiAKIHN0cnVjdCB2bXdfZnByaXYgewogCXN0cnVjdCBkcm1fbWFzdGVyICpsb2NrZWRfbWFzdGVyOwogCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlOwogCXN0cnVjdCBsaXN0X2hlYWQgZmVuY2VfZXZlbnRzOworCWJvb2wgZ2JfYXdhcmU7CisJc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgKnNobWFuOwogfTsKIAogc3RydWN0IHZtd19kbWFfYnVmZmVyIHsKQEAgLTgyLDYgKzEwMiw3IEBACiBzdHJ1Y3Qgdm13X3ZhbGlkYXRlX2J1ZmZlciB7CiAJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgYmFzZTsKIAlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoOworCWJvb2wgdmFsaWRhdGVfYXNfbW9iOwogfTsKIAogc3RydWN0IHZtd19yZXNfZnVuYzsKQEAgLTk4LDYgKzExOSw3IEBACiAJY29uc3Qgc3RydWN0IHZtd19yZXNfZnVuYyAqZnVuYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9oZWFkOyAvKiBQcm90ZWN0ZWQgYnkgdGhlIHJlc291cmNlIGxvY2sgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1vYl9oZWFkOyAvKiBQcm90ZWN0ZWQgYnkgQGJhY2t1cCByZXNlcnZlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYmluZGluZ19oZWFkOyAvKiBQcm90ZWN0ZWQgYnkgYmluZGluZ19tdXRleCAqLwogCXZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CiAJdm9pZCAoKmh3X2Rlc3Ryb3kpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwogfTsKQEAgLTEwNiw2ICsxMjgsNyBAQAogCXZtd19yZXNfY29udGV4dCwKIAl2bXdfcmVzX3N1cmZhY2UsCiAJdm13X3Jlc19zdHJlYW0sCisJdm13X3Jlc19zaGFkZXIsCiAJdm13X3Jlc19tYXgKIH07CiAKQEAgLTE1NCw2ICsxNzcsNyBAQAogfTsKIAogc3RydWN0IHZtd19yZWxvY2F0aW9uIHsKKwlTVkdBTW9iSWQgKm1vYl9sb2M7CiAJU1ZHQUd1ZXN0UHRyICpsb2NhdGlvbjsKIAl1aW50MzJfdCBpbmRleDsKIH07CkBAIC0yMjksMTEgKzI1Myw3NyBAQAogCXN0cnVjdCBwYWdlICooKnBhZ2UpKHN0cnVjdCB2bXdfcGl0ZXIgKik7CiB9OwogCisvKgorICogZW51bSB2bXdfY3R4X2JpbmRpbmdfdHlwZSAtIGFic3RyYWN0IHJlc291cmNlIHRvIGNvbnRleHQgYmluZGluZyB0eXBlcworICovCitlbnVtIHZtd19jdHhfYmluZGluZ190eXBlIHsKKwl2bXdfY3R4X2JpbmRpbmdfc2hhZGVyLAorCXZtd19jdHhfYmluZGluZ19ydCwKKwl2bXdfY3R4X2JpbmRpbmdfdGV4LAorCXZtd19jdHhfYmluZGluZ19tYXgKK307CisKKy8qKgorICogc3RydWN0IHZtd19jdHhfYmluZGluZm8gLSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNvbnRleHQgYmluZGluZworICoKKyAqIEBjdHg6IFBvaW50ZXIgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLiBOVUxMIG1lYW5zIHRoZSBiaW5kaW5nIGlzIG5vdAorICogYWN0aXZlLgorICogQHJlczogTm9uIHJlZi1jb3VudGVkIHBvaW50ZXIgdG8gdGhlIGJvdW5kIHJlc291cmNlLgorICogQGJ0OiBUaGUgYmluZGluZyB0eXBlLgorICogQGkxOiBVbmlvbiBvZiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gdW5iaW5kLgorICovCitzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5mbyB7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4OworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKKwllbnVtIHZtd19jdHhfYmluZGluZ190eXBlIGJ0OworCWJvb2wgc2NydWJiZWQ7CisJdW5pb24geworCQlTVkdBM2RTaGFkZXJUeXBlIHNoYWRlcl90eXBlOworCQlTVkdBM2RSZW5kZXJUYXJnZXRUeXBlIHJ0X3R5cGU7CisJCXVpbnQzMiB0ZXh0dXJlX3N0YWdlOworCX0gaTE7Cit9OworCisvKioKKyAqIHN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgLSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNvbnRleHQgYmluZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAtIHN1aXRhYmxlIGZvciB0cmFja2luZyBpbiBhIGNvbnRleHQKKyAqCisgKiBAY3R4X2xpc3Q6IExpc3QgaGVhZCBmb3IgY29udGV4dC4KKyAqIEByZXNfbGlzdDogTGlzdCBoZWFkIGZvciBib3VuZCByZXNvdXJjZS4KKyAqIEBiaTogQmluZGluZyBpbmZvCisgKi8KK3N0cnVjdCB2bXdfY3R4X2JpbmRpbmcgeworCXN0cnVjdCBsaXN0X2hlYWQgY3R4X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCByZXNfbGlzdDsKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5mbyBiaTsKK307CisKKworLyoqCisgKiBzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nX3N0YXRlIC0gY29udGV4dCBiaW5kaW5nIHN0YXRlCisgKgorICogQGxpc3Q6IGxpbmtlZCBsaXN0IG9mIGluZGl2aWR1YWwgYmluZGluZ3MuCisgKiBAcmVuZGVyX3RhcmdldHM6IFJlbmRlciB0YXJnZXQgYmluZGluZ3MuCisgKiBAdGV4dHVyZV91bml0czogVGV4dHVyZSB1bml0cy9zYW1wbGVycyBiaW5kaW5ncy4KKyAqIEBzaGFkZXJzOiBTaGFkZXIgYmluZGluZ3MuCisgKgorICogTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGFsc28gcHJvdmlkZXMgc3RvcmFnZSBzcGFjZSBmb3IgdGhlIGluZGl2aWR1YWwKKyAqIHN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgb2JqZWN0cywgc28gdGhhdCBubyBkeW5hbWljIGFsbG9jYXRpb24gaXMgbmVlZGVkCisgKiBmb3IgaW5kaXZpZHVhbCBiaW5kaW5ncy4KKyAqCisgKi8KK3N0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nIHJlbmRlcl90YXJnZXRzW1NWR0EzRF9SVF9NQVhdOworCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgdGV4dHVyZV91bml0c1tTVkdBM0RfTlVNX1RFWFRVUkVfVU5JVFNdOworCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgc2hhZGVyc1tTVkdBM0RfU0hBREVSVFlQRV9NQVhdOworfTsKKwogc3RydWN0IHZtd19zd19jb250ZXh0ewogCXN0cnVjdCBkcm1fb3Blbl9oYXNoIHJlc19odDsKIAlib29sIHJlc19odF9pbml0aWFsaXplZDsKIAlib29sIGtlcm5lbDsgLyoqPCBpcyB0aGUgY2FsbGVkIG1hZGUgZnJvbSB0aGUga2VybmVsICovCi0Jc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGU7CisJc3RydWN0IHZtd19mcHJpdiAqZnA7CiAJc3RydWN0IGxpc3RfaGVhZCB2YWxpZGF0ZV9ub2RlczsKIAlzdHJ1Y3Qgdm13X3JlbG9jYXRpb24gcmVsb2NzW1ZNV0dGWF9NQVhfUkVMT0NBVElPTlNdOwogCXVpbnQzMl90IGN1cl9yZWxvYzsKQEAgLTI1MCw2ICszNDAsOCBAQAogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmxhc3RfcXVlcnlfY3R4OwogCWJvb2wgbmVlZHNfcG9zdF9xdWVyeV9iYXJyaWVyOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmVycm9yX3Jlc291cmNlOworCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgc3RhZ2VkX2JpbmRpbmdzOworCXN0cnVjdCBsaXN0X2hlYWQgc3RhZ2VkX3NoYWRlcnM7CiB9OwogCiBzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5OwpAQCAtMjgxLDYgKzM3Myw3IEBACiAJdW5zaWduZWQgaW50IGlvX3N0YXJ0OwogCXVpbnQzMl90IHZyYW1fc3RhcnQ7CiAJdWludDMyX3QgdnJhbV9zaXplOworCXVpbnQzMl90IHByaW1fYmJfbWVtOwogCXVpbnQzMl90IG1taW9fc3RhcnQ7CiAJdWludDMyX3QgbW1pb19zaXplOwogCXVpbnQzMl90IGZiX21heF93aWR0aDsKQEAgLTI5MCwxMSArMzgzLDEyIEBACiAJX19sZTMyIF9faW9tZW0gKm1taW9fdmlydDsKIAlpbnQgbW1pb19tdHJyOwogCXVpbnQzMl90IGNhcGFiaWxpdGllczsKLQl1aW50MzJfdCBtYXhfZ21yX2Rlc2NyaXB0b3JzOwogCXVpbnQzMl90IG1heF9nbXJfaWRzOwogCXVpbnQzMl90IG1heF9nbXJfcGFnZXM7CisJdWludDMyX3QgbWF4X21vYl9wYWdlczsKIAl1aW50MzJfdCBtZW1vcnlfc2l6ZTsKIAlib29sIGhhc19nbXI7CisJYm9vbCBoYXNfbW9iOwogCXN0cnVjdCBtdXRleCBod19tdXRleDsKIAogCS8qCkBAIC0zNzAsNiArNDY0LDcgQEAKIAogCXN0cnVjdCB2bXdfc3dfY29udGV4dCBjdHg7CiAJc3RydWN0IG11dGV4IGNtZGJ1Zl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggYmluZGluZ19tdXRleDsKIAogCS8qKgogCSAqIE9wZXJhdGluZyBtb2RlLgpAQCAtNDE1LDYgKzUxMCwxMiBAQAogCSAqIERNQSBtYXBwaW5nIHN0dWZmLgogCSAqLwogCWVudW0gdm13X2RtYV9tYXBfbW9kZSBtYXBfbW9kZTsKKworCS8qCisJICogR3Vlc3QgQmFja2VkIHN0dWZmCisJICovCisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpvdGFibGVfYm87CisJc3RydWN0IHZtd19vdGFibGUgKm90YWJsZXM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2bXdfc3VyZmFjZSAqdm13X3Jlc190b19zcmYoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQpAQCAtNDcxLDIzICs1NzIsMTQgQEAKICAqIFJlc291cmNlIHV0aWxpdGllcyAtIHZtd2dmeF9yZXNvdXJjZS5jCiAgKi8KIHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252ICp1c2VyX3N1cmZhY2VfY29udmVydGVyOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252ICp1c2VyX2NvbnRleHRfY29udmVydGVyOwogCi1leHRlcm4gc3RydWN0IHZtd19yZXNvdXJjZSAqdm13X2NvbnRleHRfYWxsb2Moc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CiBleHRlcm4gdm9pZCB2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2Uoc3RydWN0IHZtd19yZXNvdXJjZSAqKnBfcmVzKTsKIGV4dGVybiBzdHJ1Y3Qgdm13X3Jlc291cmNlICp2bXdfcmVzb3VyY2VfcmVmZXJlbmNlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CitleHRlcm4gc3RydWN0IHZtd19yZXNvdXJjZSAqCit2bXdfcmVzb3VyY2VfcmVmZXJlbmNlX3VubGVzc19kb29tZWQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKIGV4dGVybiBpbnQgdm13X3Jlc291cmNlX3ZhbGlkYXRlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CiBleHRlcm4gaW50IHZtd19yZXNvdXJjZV9yZXNlcnZlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywgYm9vbCBub19iYWNrdXApOwogZXh0ZXJuIGJvb2wgdm13X3Jlc291cmNlX25lZWRzX2JhY2t1cChjb25zdCBzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwotZXh0ZXJuIGludCB2bXdfY29udGV4dF9kZXN0cm95X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZtd19jb250ZXh0X2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZtd19jb250ZXh0X2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAotCQkJICAgICBpbnQgaWQsCi0JCQkgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3Jlcyk7CiBleHRlcm4gaW50IHZtd191c2VyX2xvb2t1cF9oYW5kbGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkJCSAgdWludDMyX3QgaGFuZGxlLApAQCAtNDk5LDE4ICs1OTEsNiBAQAogCXVpbnQzMl90IGhhbmRsZSwKIAljb25zdCBzdHJ1Y3Qgdm13X3VzZXJfcmVzb3VyY2VfY29udiAqY29udmVydGVyLAogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3Jlcyk7Ci1leHRlcm4gdm9pZCB2bXdfc3VyZmFjZV9yZXNfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwotZXh0ZXJuIGludCB2bXdfc3VyZmFjZV9kZXN0cm95X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZtd19zdXJmYWNlX2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZtd19zdXJmYWNlX3JlZmVyZW5jZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZtd19zdXJmYWNlX2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAotCQkJICAgICB1aW50MzJfdCBoYW5kbGUsIGludCAqaWQpOwotZXh0ZXJuIGludCB2bXdfc3VyZmFjZV92YWxpZGF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKTsKIGV4dGVybiB2b2lkIHZtd19kbWFidWZfYm9fZnJlZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKIGV4dGVybiBpbnQgdm13X2RtYWJ1Zl9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKnZtd19ibywKQEAgLTUxOSwxMCArNTk5LDIxIEBACiAJCQkgICB2b2lkICgqYm9fZnJlZSkgKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pKTsKIGV4dGVybiBpbnQgdm13X3VzZXJfZG1hYnVmX3ZlcmlmeV9hY2Nlc3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJCQkgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlKTsKK2V4dGVybiBpbnQgdm13X3VzZXJfZG1hYnVmX2FsbG9jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAorCQkJCSB1aW50MzJfdCBzaXplLAorCQkJCSBib29sIHNoYXJlYWJsZSwKKwkJCQkgdWludDMyX3QgKmhhbmRsZSwKKwkJCQkgc3RydWN0IHZtd19kbWFfYnVmZmVyICoqcF9kbWFfYnVmKTsKK2V4dGVybiBpbnQgdm13X3VzZXJfZG1hYnVmX3JlZmVyZW5jZShzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJCQkgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqZG1hX2J1ZiwKKwkJCQkgICAgIHVpbnQzMl90ICpoYW5kbGUpOwogZXh0ZXJuIGludCB2bXdfZG1hYnVmX2FsbG9jX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IHZtd19kbWFidWZfdW5yZWZfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiB1aW50MzJfdCB2bXdfZG1hYnVmX3ZhbGlkYXRlX25vZGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJCQkJIHVpbnQzMl90IGN1cl92YWxpZGF0ZV9ub2RlKTsKIGV4dGVybiB2b2lkIHZtd19kbWFidWZfdmFsaWRhdGVfY2xlYXIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CkBAIC02MjIsMTAgKzcxMywxNiBAQAogZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX2dtcl9wbGFjZW1lbnQ7CiBleHRlcm4gc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fZ21yX25lX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfc3lzX3BsYWNlbWVudDsKK2V4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfc3lzX25lX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfZXZpY3RhYmxlX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfc3JmX3BsYWNlbWVudDsKK2V4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfbW9iX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX2JvX2RyaXZlciB2bXdfYm9fZHJpdmVyOwogZXh0ZXJuIGludCB2bXdfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdm13X2JvX21hcF9kbWEoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CitleHRlcm4gdm9pZCB2bXdfYm9fdW5tYXBfZG1hKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2bXdfc2dfdGFibGUgKgordm13X2JvX3NnX3RhYmxlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOwogZXh0ZXJuIHZvaWQgdm13X3BpdGVyX3N0YXJ0KHN0cnVjdCB2bXdfcGl0ZXIgKnZpdGVyLAogCQkJICAgIGNvbnN0IHN0cnVjdCB2bXdfc2dfdGFibGUgKnZzZ3QsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBwX29mZnMpOwpAQCAtNzAxLDcgKzc5OCw3IEBACiAgKiBJUlFzIGFuZCB3YXRpbmcgLSB2bXdnZnhfaXJxLmMKICAqLwogCi1leHRlcm4gaXJxcmV0dXJuX3Qgdm13X2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitleHRlcm4gaXJxcmV0dXJuX3Qgdm13X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZyk7CiBleHRlcm4gaW50IHZtd193YWl0X3NlcW5vKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgbGF6eSwKIAkJCSAgICAgdWludDMyX3Qgc2Vxbm8sIGJvb2wgaW50ZXJydXB0aWJsZSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKQEAgLTgzMiw2ICs5MjksMTAxIEBACiAJCQkJICB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGZsYWdzLAogCQkJCSAgaW50ICpwcmltZV9mZCk7CiAKKy8qCisgKiBNZW1vcnlPQmplY3QgbWFuYWdlbWVudCAtICB2bXdnZnhfbW9iLmMKKyAqLworc3RydWN0IHZtd19tb2I7CitleHRlcm4gaW50IHZtd19tb2JfYmluZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCBzdHJ1Y3Qgdm13X21vYiAqbW9iLAorCQkJY29uc3Qgc3RydWN0IHZtd19zZ190YWJsZSAqdnNndCwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RhdGFfcGFnZXMsIGludDMyX3QgbW9iX2lkKTsKK2V4dGVybiB2b2lkIHZtd19tb2JfdW5iaW5kKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICBzdHJ1Y3Qgdm13X21vYiAqbW9iKTsKK2V4dGVybiB2b2lkIHZtd19tb2JfZGVzdHJveShzdHJ1Y3Qgdm13X21vYiAqbW9iKTsKK2V4dGVybiBzdHJ1Y3Qgdm13X21vYiAqdm13X21vYl9jcmVhdGUodW5zaWduZWQgbG9uZyBkYXRhX3BhZ2VzKTsKK2V4dGVybiBpbnQgdm13X290YWJsZXNfc2V0dXAoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2bXdfb3RhYmxlc190YWtlZG93bihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKKworLyoKKyAqIENvbnRleHQgbWFuYWdlbWVudCAtIHZtd2dmeF9jb250ZXh0LmMKKyAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYgKnVzZXJfY29udGV4dF9jb252ZXJ0ZXI7CisKK2V4dGVybiBzdHJ1Y3Qgdm13X3Jlc291cmNlICp2bXdfY29udGV4dF9hbGxvYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKKworZXh0ZXJuIGludCB2bXdfY29udGV4dF9jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJCSAgICAgaW50IGlkLAorCQkJICAgICBzdHJ1Y3Qgdm13X3Jlc291cmNlICoqcF9yZXMpOworZXh0ZXJuIGludCB2bXdfY29udGV4dF9kZWZpbmVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCB2bXdfY29udGV4dF9kZXN0cm95X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19jb250ZXh0X2JpbmRpbmdfYWRkKHN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgKmNicywKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5mbyAqY2kpOworZXh0ZXJuIHZvaWQKK3Ztd19jb250ZXh0X2JpbmRpbmdfc3RhdGVfdHJhbnNmZXIoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJCSAgIHN0cnVjdCB2bXdfY3R4X2JpbmRpbmdfc3RhdGUgKmNicyk7CitleHRlcm4gdm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X2tpbGwoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitleHRlcm4gdm9pZCB2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X3NjcnViKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworZXh0ZXJuIGludCB2bXdfY29udGV4dF9yZWJpbmRfYWxsKHN0cnVjdCB2bXdfcmVzb3VyY2UgKmN0eCk7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCAqdm13X2NvbnRleHRfYmluZGluZ19saXN0KHN0cnVjdCB2bXdfcmVzb3VyY2UgKmN0eCk7CisKKy8qCisgKiBTdXJmYWNlIG1hbmFnZW1lbnQgLSB2bXdnZnhfc3VyZmFjZS5jCisgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252ICp1c2VyX3N1cmZhY2VfY29udmVydGVyOworCitleHRlcm4gdm9pZCB2bXdfc3VyZmFjZV9yZXNfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOworZXh0ZXJuIGludCB2bXdfc3VyZmFjZV9kZXN0cm95X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19zdXJmYWNlX2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19zdXJmYWNlX3JlZmVyZW5jZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19nYl9zdXJmYWNlX2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X3N1cmZhY2VfY2hlY2soc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkgICAgIHVpbnQzMl90IGhhbmRsZSwgaW50ICppZCk7CitleHRlcm4gaW50IHZtd19zdXJmYWNlX3ZhbGlkYXRlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IHZtd19zdXJmYWNlICpzcmYpOworCisvKgorICogU2hhZGVyIG1hbmFnZW1lbnQgLSB2bXdnZnhfc2hhZGVyLmMKKyAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYgKnVzZXJfc2hhZGVyX2NvbnZlcnRlcjsKKworZXh0ZXJuIGludCB2bXdfc2hhZGVyX2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X3NoYWRlcl9kZXN0cm95X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X2NvbXBhdF9zaGFkZXJfbG9va3VwKHN0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICptYW4sCisJCQkJICAgIFNWR0EzZFNoYWRlclR5cGUgc2hhZGVyX3R5cGUsCisJCQkJICAgIHUzMiAqdXNlcl9rZXkpOworZXh0ZXJuIHZvaWQgdm13X2NvbXBhdF9zaGFkZXJzX2NvbW1pdChzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworZXh0ZXJuIHZvaWQgdm13X2NvbXBhdF9zaGFkZXJzX3JldmVydChzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworZXh0ZXJuIGludCB2bXdfY29tcGF0X3NoYWRlcl9yZW1vdmUoc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgKm1hbiwKKwkJCQkgICAgdTMyIHVzZXJfa2V5LAorCQkJCSAgICBTVkdBM2RTaGFkZXJUeXBlIHNoYWRlcl90eXBlLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK2V4dGVybiBpbnQgdm13X2NvbXBhdF9zaGFkZXJfYWRkKHN0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICptYW4sCisJCQkJIHUzMiB1c2VyX2tleSwgY29uc3Qgdm9pZCAqYnl0ZWNvZGUsCisJCQkJIFNWR0EzZFNoYWRlclR5cGUgc2hhZGVyX3R5cGUsCisJCQkJIHNpemVfdCBzaXplLAorCQkJCSBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJCQkgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CitleHRlcm4gc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgKgordm13X2NvbXBhdF9zaGFkZXJfbWFuX2NyZWF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkCit2bXdfY29tcGF0X3NoYWRlcl9tYW5fZGVzdHJveShzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuKTsKKwogCiAvKioKICAqIElubGluZSBoZWxwZXIgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKaW5kZXggNTk5ZjY0Ni4uMjY5Yjg1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYwpAQCAtNTQsNiArNTQsOCBAQAogICogQHJlczogUmVmLWNvdW50ZWQgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UuCiAgKiBAc3dpdGNoX2JhY2t1cDogQm9vbGVhbiB3aGV0aGVyIHRvIHN3aXRjaCBiYWNrdXAgYnVmZmVyIG9uIHVucmVzZXJ2ZS4KICAqIEBuZXdfYmFja3VwOiBSZWZjb3VudGVkIHBvaW50ZXIgdG8gdGhlIG5ldyBiYWNrdXAgYnVmZmVyLgorICogQHN0YWdlZF9iaW5kaW5nczogSWYgQHJlcyBpcyBhIGNvbnRleHQsIHRyYWNrcyBiaW5kaW5ncyBzZXQgdXAgZHVyaW5nCisgKiB0aGUgY29tbWFuZCBiYXRjaC4gT3RoZXJ3aXNlIE5VTEwuCiAgKiBAbmV3X2JhY2t1cF9vZmZzZXQ6IE5ldyBiYWNrdXAgYnVmZmVyIG9mZnNldCBpZiBAbmV3X2JhY2t1cCBpcyBub24tTlVsbC4KICAqIEBmaXJzdF91c2FnZTogU2V0IHRvIHRydWUgdGhlIGZpcnN0IHRpbWUgdGhlIHJlc291cmNlIGlzIHJlZmVyZW5jZWQgaW4KICAqIHRoZSBjb21tYW5kIHN0cmVhbS4KQEAgLTY1LDEyICs2NywzMiBAQAogCXN0cnVjdCBkcm1faGFzaF9pdGVtIGhhc2g7CiAJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqbmV3X2JhY2t1cDsKKwlzdHJ1Y3Qgdm13X2N0eF9iaW5kaW5nX3N0YXRlICpzdGFnZWRfYmluZGluZ3M7CiAJdW5zaWduZWQgbG9uZyBuZXdfYmFja3VwX29mZnNldDsKIAlib29sIGZpcnN0X3VzYWdlOwogCWJvb2wgbm9fYnVmZmVyX25lZWRlZDsKIH07CiAKIC8qKgorICogc3RydWN0IHZtd19jbWRfZW50cnkgLSBEZXNjcmliZSBhIGNvbW1hbmQgZm9yIHRoZSB2ZXJpZmllcgorICoKKyAqIEB1c2VyX2FsbG93OiBXaGV0aGVyIGFsbG93ZWQgZnJvbSB0aGUgZXhlY2J1ZiBpb2N0bC4KKyAqIEBnYl9kaXNhYmxlOiBXaGV0aGVyIGRpc2FibGVkIGlmIGd1ZXN0LWJhY2tlZCBvYmplY3RzIGFyZSBhdmFpbGFibGUuCisgKiBAZ2JfZW5hYmxlOiBXaGV0aGVyIGVuYWJsZWQgaWZmIGd1ZXN0LWJhY2tlZCBvYmplY3RzIGFyZSBhdmFpbGFibGUuCisgKi8KK3N0cnVjdCB2bXdfY21kX2VudHJ5IHsKKwlpbnQgKCpmdW5jKSAoc3RydWN0IHZtd19wcml2YXRlICosIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqLAorCQkgICAgIFNWR0EzZENtZEhlYWRlciAqKTsKKwlib29sIHVzZXJfYWxsb3c7CisJYm9vbCBnYl9kaXNhYmxlOworCWJvb2wgZ2JfZW5hYmxlOworfTsKKworI2RlZmluZSBWTVdfQ01EX0RFRihfY21kLCBfZnVuYywgX3VzZXJfYWxsb3csIF9nYl9kaXNhYmxlLCBfZ2JfZW5hYmxlKQlcCisJWyhfY21kKSAtIFNWR0FfM0RfQ01EX0JBU0VdID0geyhfZnVuYyksIChfdXNlcl9hbGxvdyksXAorCQkJCSAgICAgICAoX2diX2Rpc2FibGUpLCAoX2diX2VuYWJsZSl9CisKKy8qKgogICogdm13X3Jlc291cmNlX3VucmVzZXJ2ZSAtIHVucmVzZXJ2ZSByZXNvdXJjZXMgcHJldmlvdXNseSByZXNlcnZlZCBmb3IKICAqIGNvbW1hbmQgc3VibWlzc2lvbi4KICAqCkBAIC04Nyw2ICsxMDksMTggQEAKIAkJc3RydWN0IHZtd19kbWFfYnVmZmVyICpuZXdfYmFja3VwID0KIAkJCWJhY2tvZmYgPyBOVUxMIDogdmFsLT5uZXdfYmFja3VwOwogCisJCS8qCisJCSAqIFRyYW5zZmVyIHN0YWdlZCBjb250ZXh0IGJpbmRpbmdzIHRvIHRoZQorCQkgKiBwZXJzaXN0ZW50IGNvbnRleHQgYmluZGluZyB0cmFja2VyLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHZhbC0+c3RhZ2VkX2JpbmRpbmdzKSkgeworCQkJaWYgKCFiYWNrb2ZmKSB7CisJCQkJdm13X2NvbnRleHRfYmluZGluZ19zdGF0ZV90cmFuc2ZlcgorCQkJCQkodmFsLT5yZXMsIHZhbC0+c3RhZ2VkX2JpbmRpbmdzKTsKKwkJCX0KKwkJCWtmcmVlKHZhbC0+c3RhZ2VkX2JpbmRpbmdzKTsKKwkJCXZhbC0+c3RhZ2VkX2JpbmRpbmdzID0gTlVMTDsKKwkJfQogCQl2bXdfcmVzb3VyY2VfdW5yZXNlcnZlKHJlcywgbmV3X2JhY2t1cCwKIAkJCXZhbC0+bmV3X2JhY2t1cF9vZmZzZXQpOwogCQl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2YWwtPm5ld19iYWNrdXApOwpAQCAtMTQ2LDYgKzE4MCw0NCBAQAogfQogCiAvKioKKyAqIHZtd19yZXNvdXJjZV9jb250ZXh0X3Jlc19hZGQgLSBQdXQgcmVzb3VyY2VzIHByZXZpb3VzbHkgYm91bmQgdG8gYSBjb250ZXh0IG9uCisgKiB0aGUgdmFsaWRhdGlvbiBsaXN0CisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlCisgKiBAc3dfY29udGV4dDogUG9pbnRlciB0byBhIHNvZnR3YXJlIGNvbnRleHQgdXNlZCBmb3IgdGhpcyBjb21tYW5kIHN1Ym1pc3Npb24KKyAqIEBjdHg6IFBvaW50ZXIgdG8gdGhlIGNvbnRleHQgcmVzb3VyY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHB1dHMgYWxsIHJlc291cmNlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBib3VuZCB0byBAY3R4IG9uCisgKiB0aGUgcmVzb3VyY2UgdmFsaWRhdGlvbiBsaXN0LiBUaGlzIGlzIHBhcnQgb2YgdGhlIGNvbnRleHQgc3RhdGUgcmVlbWlzc2lvbgorICovCitzdGF0aWMgaW50IHZtd19yZXNvdXJjZV9jb250ZXh0X3Jlc19hZGQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCQlzdHJ1Y3Qgdm13X3Jlc291cmNlICpjdHgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqYmluZGluZ19saXN0OworCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmcgKmVudHJ5OworCWludCByZXQgPSAwOworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwliaW5kaW5nX2xpc3QgPSB2bXdfY29udGV4dF9iaW5kaW5nX2xpc3QoY3R4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGJpbmRpbmdfbGlzdCwgY3R4X2xpc3QpIHsKKwkJcmVzID0gdm13X3Jlc291cmNlX3JlZmVyZW5jZV91bmxlc3NfZG9vbWVkKGVudHJ5LT5iaS5yZXMpOworCQlpZiAodW5saWtlbHkocmVzID09IE5VTEwpKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gdm13X3Jlc291cmNlX3ZhbF9hZGQoc3dfY29udGV4dCwgZW50cnktPmJpLnJlcywgTlVMTCk7CisJCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogdm13X3Jlc291cmNlX3JlbG9jYXRpb25fYWRkIC0gQWRkIGEgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2NhdGlvbiBsaXN0CiAgKgogICogQGxpc3Q6IFBvaW50ZXIgdG8gaGVhZCBvZiByZWxvY2F0aW9uIGxpc3QuCkBAIC0yMDEsOCArMjczLDEyIEBACiB7CiAJc3RydWN0IHZtd19yZXNvdXJjZV9yZWxvY2F0aW9uICpyZWw7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlbCwgbGlzdCwgaGVhZCkKLQkJY2JbcmVsLT5vZmZzZXRdID0gcmVsLT5yZXMtPmlkOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVsLCBsaXN0LCBoZWFkKSB7CisJCWlmIChsaWtlbHkocmVsLT5yZXMgIT0gTlVMTCkpCisJCQljYltyZWwtPm9mZnNldF0gPSByZWwtPnJlcy0+aWQ7CisJCWVsc2UKKwkJCWNiW3JlbC0+b2Zmc2V0XSA9IFNWR0FfM0RfQ01EX05PUDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdm13X2NtZF9pbnZhbGlkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC0yMjQsNiArMzAwLDcgQEAKICAqCiAgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgdXNlZCBmb3IgdGhpcyBjb21tYW5kIHN1Ym1pc3Npb24gYmF0Y2guCiAgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0IHRvIGFkZC4KKyAqIEB2YWxpZGF0ZV9hc19tb2I6IFZhbGlkYXRlIHRoaXMgYnVmZmVyIGFzIGEgTU9CLgogICogQHBfdmFsX25vZGU6IElmIG5vbi1OVUxMIFdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWxpZGF0ZSBub2RlIG51bWJlcgogICogb24gcmV0dXJuLgogICoKQEAgLTIzMiw2ICszMDksNyBAQAogICovCiBzdGF0aWMgaW50IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKIAkJCQkgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCSAgIGJvb2wgdmFsaWRhdGVfYXNfbW9iLAogCQkJCSAgIHVpbnQzMl90ICpwX3ZhbF9ub2RlKQogewogCXVpbnQzMl90IHZhbF9ub2RlOwpAQCAtMjQ0LDYgKzMyMiwxMCBAQAogCQkJCSAgICAmaGFzaCkgPT0gMCkpIHsKIAkJdnZhbF9idWYgPSBjb250YWluZXJfb2YoaGFzaCwgc3RydWN0IHZtd192YWxpZGF0ZV9idWZmZXIsCiAJCQkJCWhhc2gpOworCQlpZiAodW5saWtlbHkodnZhbF9idWYtPnZhbGlkYXRlX2FzX21vYiAhPSB2YWxpZGF0ZV9hc19tb2IpKSB7CisJCQlEUk1fRVJST1IoIkluY29uc2lzdGVudCBidWZmZXIgdXNhZ2UuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCXZhbF9idWYgPSAmdnZhbF9idWYtPmJhc2U7CiAJCXZhbF9ub2RlID0gdnZhbF9idWYgLSBzd19jb250ZXh0LT52YWxfYnVmczsKIAl9IGVsc2UgewpAQCAtMjY2LDYgKzM0OCw3IEBACiAJCXZhbF9idWYtPmJvID0gdHRtX2JvX3JlZmVyZW5jZShibyk7CiAJCXZhbF9idWYtPnJlc2VydmVkID0gZmFsc2U7CiAJCWxpc3RfYWRkX3RhaWwoJnZhbF9idWYtPmhlYWQsICZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2Rlcyk7CisJCXZ2YWxfYnVmLT52YWxpZGF0ZV9hc19tb2IgPSB2YWxpZGF0ZV9hc19tb2I7CiAJfQogCiAJc3dfY29udGV4dC0+ZmVuY2VfZmxhZ3MgfD0gRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUM7CkBAIC0zMDIsNyArMzg1LDggQEAKIAkJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmcmVzLT5iYWNrdXAtPmJhc2U7CiAKIAkJCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0Ci0JCQkJKHN3X2NvbnRleHQsIGJvLCBOVUxMKTsKKwkJCQkoc3dfY29udGV4dCwgYm8sCisJCQkJIHZtd19yZXNvdXJjZV9uZWVkc19iYWNrdXAocmVzKSwgTlVMTCk7CiAKIAkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTMzOSwyMiArNDIzLDI3IEBACiB9CiAKIC8qKgotICogdm13X2NtZF9yZXNfY2hlY2sgLSBDaGVjayB0aGF0IGEgcmVzb3VyY2UgaXMgcHJlc2VudCBhbmQgaWYgc28sIHB1dCBpdAorICogdm13X2NtZF9jb21wYXRfcmVzX2NoZWNrIC0gQ2hlY2sgdGhhdCBhIHJlc291cmNlIGlzIHByZXNlbnQgYW5kIGlmIHNvLCBwdXQgaXQKICAqIG9uIHRoZSByZXNvdXJjZSB2YWxpZGF0ZSBsaXN0IHVubGVzcyBpdCdzIGFscmVhZHkgdGhlcmUuCiAgKgogICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgogICogQHN3X2NvbnRleHQ6IFBvaW50ZXIgdG8gdGhlIHNvZnR3YXJlIGNvbnRleHQuCiAgKiBAcmVzX3R5cGU6IFJlc291cmNlIHR5cGUuCiAgKiBAY29udmVydGVyOiBVc2VyLXNwYWNlIHZpc2lzYmxlIHR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gKiBAaWQ6IFBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBjb21tYW5kIGJ1ZmZlciBjdXJyZW50bHkgYmVpbmcKKyAqIEBpZDogdXNlci1zcGFjZSByZXNvdXJjZSBpZCBoYW5kbGUuCisgKiBAaWRfbG9jOiBQb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgY29tbWFuZCBidWZmZXIgY3VycmVudGx5IGJlaW5nCiAgKiBwYXJzZWQgZnJvbSB3aGVyZSB0aGUgdXNlci1zcGFjZSByZXNvdXJjZSBpZCBoYW5kbGUgaXMgbG9jYXRlZC4KKyAqIEBwX3ZhbDogUG9pbnRlciB0byBwb2ludGVyIHRvIHJlc291cmNlIHZhbGlkYWxpZGF0aW9uIG5vZGUuIFBvcHVsYXRlZAorICogb24gZXhpdC4KICAqLwotc3RhdGljIGludCB2bXdfY21kX3Jlc19jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCi0JCQkgICAgIGVudW0gdm13X3Jlc190eXBlIHJlc190eXBlLAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgdm13X3VzZXJfcmVzb3VyY2VfY29udiAqY29udmVydGVyLAotCQkJICAgICB1aW50MzJfdCAqaWQsCi0JCQkgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKipwX3ZhbCkKK3N0YXRpYyBpbnQKK3Ztd19jbWRfY29tcGF0X3Jlc19jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCSBlbnVtIHZtd19yZXNfdHlwZSByZXNfdHlwZSwKKwkJCSBjb25zdCBzdHJ1Y3Qgdm13X3VzZXJfcmVzb3VyY2VfY29udiAqY29udmVydGVyLAorCQkJIHVpbnQzMl90IGlkLAorCQkJIHVpbnQzMl90ICppZF9sb2MsCisJCQkgc3RydWN0IHZtd19yZXNvdXJjZV92YWxfbm9kZSAqKnBfdmFsKQogewogCXN0cnVjdCB2bXdfcmVzX2NhY2hlX2VudHJ5ICpyY2FjaGUgPQogCQkmc3dfY29udGV4dC0+cmVzX2NhY2hlW3Jlc190eXBlXTsKQEAgLTM2MiwxNSArNDUxLDIyIEBACiAJc3RydWN0IHZtd19yZXNvdXJjZV92YWxfbm9kZSAqbm9kZTsKIAlpbnQgcmV0OwogCi0JaWYgKCppZCA9PSBTVkdBM0RfSU5WQUxJRF9JRCkKKwlpZiAoaWQgPT0gU1ZHQTNEX0lOVkFMSURfSUQpIHsKKwkJaWYgKHBfdmFsKQorCQkJKnBfdmFsID0gTlVMTDsKKwkJaWYgKHJlc190eXBlID09IHZtd19yZXNfY29udGV4dCkgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIGNvbnRleHQgaW52YWxpZCBpZC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJcmV0dXJuIDA7CisJfQogCiAJLyoKIAkgKiBGYXN0cGF0aCBpbiBjYXNlIG9mIHJlcGVhdGVkIGNvbW1hbmRzIHJlZmVyZW5jaW5nIHRoZSBzYW1lCiAJICogcmVzb3VyY2UKIAkgKi8KIAotCWlmIChsaWtlbHkocmNhY2hlLT52YWxpZCAmJiAqaWQgPT0gcmNhY2hlLT5oYW5kbGUpKSB7CisJaWYgKGxpa2VseShyY2FjaGUtPnZhbGlkICYmIGlkID09IHJjYWNoZS0+aGFuZGxlKSkgewogCQljb25zdCBzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMgPSByY2FjaGUtPnJlczsKIAogCQlyY2FjaGUtPm5vZGUtPmZpcnN0X3VzYWdlID0gZmFsc2U7CkBAIC0zNzksMjggKzQ3NSwyOCBAQAogCiAJCXJldHVybiB2bXdfcmVzb3VyY2VfcmVsb2NhdGlvbl9hZGQKIAkJCSgmc3dfY29udGV4dC0+cmVzX3JlbG9jYXRpb25zLCByZXMsCi0JCQkgaWQgLSBzd19jb250ZXh0LT5idWZfc3RhcnQpOworCQkJIGlkX2xvYyAtIHN3X2NvbnRleHQtPmJ1Zl9zdGFydCk7CiAJfQogCiAJcmV0ID0gdm13X3VzZXJfcmVzb3VyY2VfbG9va3VwX2hhbmRsZShkZXZfcHJpdiwKLQkJCQkJICAgICAgc3dfY29udGV4dC0+dGZpbGUsCi0JCQkJCSAgICAgICppZCwKKwkJCQkJICAgICAgc3dfY29udGV4dC0+ZnAtPnRmaWxlLAorCQkJCQkgICAgICBpZCwKIAkJCQkJICAgICAgY29udmVydGVyLAogCQkJCQkgICAgICAmcmVzKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiQ291bGQgbm90IGZpbmQgb3IgdXNlIHJlc291cmNlIDB4JTA4eC5cbiIsCi0JCQkgICh1bnNpZ25lZCkgKmlkKTsKKwkJCSAgKHVuc2lnbmVkKSBpZCk7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyY2FjaGUtPnZhbGlkID0gdHJ1ZTsKIAlyY2FjaGUtPnJlcyA9IHJlczsKLQlyY2FjaGUtPmhhbmRsZSA9ICppZDsKKwlyY2FjaGUtPmhhbmRsZSA9IGlkOwogCiAJcmV0ID0gdm13X3Jlc291cmNlX3JlbG9jYXRpb25fYWRkKCZzd19jb250ZXh0LT5yZXNfcmVsb2NhdGlvbnMsCiAJCQkJCSAgcmVzLAotCQkJCQkgIGlkIC0gc3dfY29udGV4dC0+YnVmX3N0YXJ0KTsKKwkJCQkJICBpZF9sb2MgLSBzd19jb250ZXh0LT5idWZfc3RhcnQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X25vX3JlbG9jOwogCkBAIC00MTEsNiArNTA3LDIyIEBACiAJcmNhY2hlLT5ub2RlID0gbm9kZTsKIAlpZiAocF92YWwpCiAJCSpwX3ZhbCA9IG5vZGU7CisKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IgJiYgbm9kZS0+Zmlyc3RfdXNhZ2UgJiYKKwkgICAgcmVzX3R5cGUgPT0gdm13X3Jlc19jb250ZXh0KSB7CisJCXJldCA9IHZtd19yZXNvdXJjZV9jb250ZXh0X3Jlc19hZGQoZGV2X3ByaXYsIHN3X2NvbnRleHQsIHJlcyk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9ub19yZWxvYzsKKwkJbm9kZS0+c3RhZ2VkX2JpbmRpbmdzID0KKwkJCWt6YWxsb2Moc2l6ZW9mKCpub2RlLT5zdGFnZWRfYmluZGluZ3MpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5vZGUtPnN0YWdlZF9iaW5kaW5ncyA9PSBOVUxMKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjb250ZXh0IGJpbmRpbmcgIgorCQkJCSAgImluZm9ybWF0aW9uLlxuIik7CisJCQlnb3RvIG91dF9ub19yZWxvYzsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmbm9kZS0+c3RhZ2VkX2JpbmRpbmdzLT5saXN0KTsKKwl9CisKIAl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CiAJcmV0dXJuIDA7CiAKQEAgLTQyMiw2ICs1MzQsNTkgQEAKIH0KIAogLyoqCisgKiB2bXdfY21kX3Jlc19jaGVjayAtIENoZWNrIHRoYXQgYSByZXNvdXJjZSBpcyBwcmVzZW50IGFuZCBpZiBzbywgcHV0IGl0CisgKiBvbiB0aGUgcmVzb3VyY2UgdmFsaWRhdGUgbGlzdCB1bmxlc3MgaXQncyBhbHJlYWR5IHRoZXJlLgorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEBzd19jb250ZXh0OiBQb2ludGVyIHRvIHRoZSBzb2Z0d2FyZSBjb250ZXh0LgorICogQHJlc190eXBlOiBSZXNvdXJjZSB0eXBlLgorICogQGNvbnZlcnRlcjogVXNlci1zcGFjZSB2aXNpc2JsZSB0eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICogQGlkX2xvYzogUG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGNvbW1hbmQgYnVmZmVyIGN1cnJlbnRseSBiZWluZworICogcGFyc2VkIGZyb20gd2hlcmUgdGhlIHVzZXItc3BhY2UgcmVzb3VyY2UgaWQgaGFuZGxlIGlzIGxvY2F0ZWQuCisgKiBAcF92YWw6IFBvaW50ZXIgdG8gcG9pbnRlciB0byByZXNvdXJjZSB2YWxpZGFsaWRhdGlvbiBub2RlLiBQb3B1bGF0ZWQKKyAqIG9uIGV4aXQuCisgKi8KK3N0YXRpYyBpbnQKK3Ztd19jbWRfcmVzX2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkgIGVudW0gdm13X3Jlc190eXBlIHJlc190eXBlLAorCQkgIGNvbnN0IHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252ICpjb252ZXJ0ZXIsCisJCSAgdWludDMyX3QgKmlkX2xvYywKKwkJICBzdHJ1Y3Qgdm13X3Jlc291cmNlX3ZhbF9ub2RlICoqcF92YWwpCit7CisJcmV0dXJuIHZtd19jbWRfY29tcGF0X3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgcmVzX3R5cGUsCisJCQkJCWNvbnZlcnRlciwgKmlkX2xvYywgaWRfbG9jLCBwX3ZhbCk7Cit9CisKKy8qKgorICogdm13X3JlYmluZF9jb250ZXh0cyAtIFJlYmluZCBhbGwgcmVzb3VyY2VzIHByZXZpb3VzbHkgYm91bmQgdG8KKyAqIHJlZmVyZW5jZWQgY29udGV4dHMuCisgKgorICogQHN3X2NvbnRleHQ6IFBvaW50ZXIgdG8gdGhlIHNvZnR3YXJlIGNvbnRleHQuCisgKgorICogUmViaW5kIGNvbnRleHQgYmluZGluZyBwb2ludHMgdGhhdCBoYXZlIGJlZW4gc2NydWJiZWQgYmVjYXVzZSBvZiBldmljdGlvbi4KKyAqLworc3RhdGljIGludCB2bXdfcmViaW5kX2NvbnRleHRzKHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCkKK3sKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlX3ZhbF9ub2RlICp2YWw7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmFsLCAmc3dfY29udGV4dC0+cmVzb3VyY2VfbGlzdCwgaGVhZCkgeworCQlpZiAobGlrZWx5KCF2YWwtPnN0YWdlZF9iaW5kaW5ncykpCisJCQljb250aW51ZTsKKworCQlyZXQgPSB2bXdfY29udGV4dF9yZWJpbmRfYWxsKHZhbC0+cmVzKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmViaW5kIGNvbnRleHQuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiB2bXdfY21kX2NpZF9jaGVjayAtIENoZWNrIGEgY29tbWFuZCBoZWFkZXIgZm9yIHZhbGlkIGNvbnRleHQgaW5mb3JtYXRpb24uCiAgKgogICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgpAQCAtNDUzLDE3ICs2MTgsMzUgQEAKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJU1ZHQTNkQ21kU2V0UmVuZGVyVGFyZ2V0IGJvZHk7CiAJfSAqY21kOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKmN0eF9ub2RlOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKnJlc19ub2RlOwogCWludCByZXQ7CiAKLQlyZXQgPSB2bXdfY21kX2NpZF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3NpZF9jbWQsIGhlYWRlcik7CisKKwlyZXQgPSB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19jb250ZXh0LAorCQkJCXVzZXJfY29udGV4dF9jb252ZXJ0ZXIsICZjbWQtPmJvZHkuY2lkLAorCQkJCSZjdHhfbm9kZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIAotCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfc2lkX2NtZCwgaGVhZGVyKTsKIAlyZXQgPSB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19zdXJmYWNlLAogCQkJCXVzZXJfc3VyZmFjZV9jb252ZXJ0ZXIsCi0JCQkJJmNtZC0+Ym9keS50YXJnZXQuc2lkLCBOVUxMKTsKLQlyZXR1cm4gcmV0OworCQkJCSZjbWQtPmJvZHkudGFyZ2V0LnNpZCwgJnJlc19ub2RlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRldl9wcml2LT5oYXNfbW9iKSB7CisJCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvIGJpOworCisJCWJpLmN0eCA9IGN0eF9ub2RlLT5yZXM7CisJCWJpLnJlcyA9IHJlc19ub2RlID8gcmVzX25vZGUtPnJlcyA6IE5VTEw7CisJCWJpLmJ0ID0gdm13X2N0eF9iaW5kaW5nX3J0OworCQliaS5pMS5ydF90eXBlID0gY21kLT5ib2R5LnR5cGU7CisJCXJldHVybiB2bXdfY29udGV4dF9iaW5kaW5nX2FkZChjdHhfbm9kZS0+c3RhZ2VkX2JpbmRpbmdzLCAmYmkpOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZtd19jbWRfc3VyZmFjZV9jb3B5X2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC01MTksMTEgKzcwMiw2IEBACiAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3NpZF9jbWQsIGhlYWRlcik7CiAKLQlpZiAodW5saWtlbHkoIXN3X2NvbnRleHQtPmtlcm5lbCkpIHsKLQkJRFJNX0VSUk9SKCJLZXJuZWwgb25seSBTVkdBM2QgY29tbWFuZDogJXUuXG4iLCBjbWQtPmhlYWRlci5pZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCiAJcmV0dXJuIHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX3N1cmZhY2UsCiAJCQkJIHVzZXJfc3VyZmFjZV9jb252ZXJ0ZXIsCiAJCQkJICZjbWQtPmJvZHkuc3JjSW1hZ2Uuc2lkLCBOVUxMKTsKQEAgLTU0MSwxMSArNzE5LDYgQEAKIAogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfc2lkX2NtZCwgaGVhZGVyKTsKIAotCWlmICh1bmxpa2VseSghc3dfY29udGV4dC0+a2VybmVsKSkgewotCQlEUk1fRVJST1IoIktlcm5lbCBvbmx5IFNWR0EzZCBjb21tYW5kOiAldS5cbiIsIGNtZC0+aGVhZGVyLmlkKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KIAlyZXR1cm4gdm13X2NtZF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIHZtd19yZXNfc3VyZmFjZSwKIAkJCQkgdXNlcl9zdXJmYWNlX2NvbnZlcnRlciwgJmNtZC0+Ym9keS5zaWQsCiAJCQkJIE5VTEwpOwpAQCAtNTg2LDcgKzc1OSw3IEBACiAJCQlzd19jb250ZXh0LT5uZWVkc19wb3N0X3F1ZXJ5X2JhcnJpZXIgPSB0cnVlOwogCQkJcmV0ID0gdm13X2JvX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwKIAkJCQkJCSAgICAgIHN3X2NvbnRleHQtPmN1cl9xdWVyeV9ibywKLQkJCQkJCSAgICAgIE5VTEwpOworCQkJCQkJICAgICAgZGV2X3ByaXYtPmhhc19tb2IsIE5VTEwpOwogCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC01OTQsNyArNzY3LDcgQEAKIAogCQlyZXQgPSB2bXdfYm9fdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LAogCQkJCQkgICAgICBkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8sCi0JCQkJCSAgICAgIE5VTEwpOworCQkJCQkgICAgICBkZXZfcHJpdi0+aGFzX21vYiwgTlVMTCk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC02NzIsNiArODQ1LDY2IEBACiB9CiAKIC8qKgorICogdm13X3RyYW5zbGF0ZV9tb2JfcG9pbnRlciAtIFByZXBhcmUgdG8gdHJhbnNsYXRlIGEgdXNlci1zcGFjZSBidWZmZXIKKyAqIGhhbmRsZSB0byBhIE1PQiBpZC4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgdXNlZCBmb3IgdGhpcyBjb21tYW5kIGJhdGNoIHZhbGlkYXRpb24uCisgKiBAaWQ6IFBvaW50ZXIgdG8gdGhlIHVzZXItc3BhY2UgaGFuZGxlIHRvIGJlIHRyYW5zbGF0ZWQuCisgKiBAdm13X2JvX3A6IFBvaW50cyB0byBhIGxvY2F0aW9uIHRoYXQsIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHdpbGwgY2FycnkKKyAqIGEgcmVmZXJlbmNlLWNvdW50ZWQgcG9pbnRlciB0byB0aGUgRE1BIGJ1ZmZlciBpZGVudGlmaWVkIGJ5IHRoZQorICogdXNlci1zcGFjZSBoYW5kbGUgaW4gQGlkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2F2ZXMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHRyYW5zbGF0ZSBhIHVzZXItc3BhY2UgYnVmZmVyCisgKiBoYW5kbGUgdG8gYSBNT0IgaWQuIFRoZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LCBidXQKKyAqIGR1cmluZyBhIGNhbGwgdG8gdm13X2FwcGx5X3JlbG9jYXRpb25zKCkuIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgcmVsb2NhdGlvbgorICogbGlzdCBhbmQgYSBsaXN0IG9mIGJ1ZmZlcnMgdG8gdmFsaWRhdGUuIFRoZSBmb3JtZXIgbmVlZHMgdG8gYmUgZnJlZWQgdXNpbmcKKyAqIGVpdGhlciB2bXdfYXBwbHlfcmVsb2NhdGlvbnMoKSBvciB2bXdfZnJlZV9yZWxvY2F0aW9ucygpLiBUaGUgbGF0dGVyCisgKiBuZWVkcyB0byBiZSBmcmVlZCB1c2luZyB2bXdfY2xlYXJfdmFsaWRhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgdm13X3RyYW5zbGF0ZV9tb2JfcHRyKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgU1ZHQU1vYklkICppZCwKKwkJCQkgc3RydWN0IHZtd19kbWFfYnVmZmVyICoqdm13X2JvX3ApCit7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICp2bXdfYm8gPSBOVUxMOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87CisJdWludDMyX3QgaGFuZGxlID0gKmlkOworCXN0cnVjdCB2bXdfcmVsb2NhdGlvbiAqcmVsb2M7CisJaW50IHJldDsKKworCXJldCA9IHZtd191c2VyX2RtYWJ1Zl9sb29rdXAoc3dfY29udGV4dC0+ZnAtPnRmaWxlLCBoYW5kbGUsICZ2bXdfYm8pOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBub3QgZmluZCBvciB1c2UgTU9CIGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYm8gPSAmdm13X2JvLT5iYXNlOworCisJaWYgKHVubGlrZWx5KHN3X2NvbnRleHQtPmN1cl9yZWxvYyA+PSBWTVdHRlhfTUFYX1JFTE9DQVRJT05TKSkgeworCQlEUk1fRVJST1IoIk1heCBudW1iZXIgcmVsb2NhdGlvbnMgcGVyIHN1Ym1pc3Npb24iCisJCQkgICIgZXhjZWVkZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub19yZWxvYzsKKwl9CisKKwlyZWxvYyA9ICZzd19jb250ZXh0LT5yZWxvY3Nbc3dfY29udGV4dC0+Y3VyX3JlbG9jKytdOworCXJlbG9jLT5tb2JfbG9jID0gaWQ7CisJcmVsb2MtPmxvY2F0aW9uID0gTlVMTDsKKworCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN3X2NvbnRleHQsIGJvLCB0cnVlLCAmcmVsb2MtPmluZGV4KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9ub19yZWxvYzsKKworCSp2bXdfYm9fcCA9IHZtd19ibzsKKwlyZXR1cm4gMDsKKworb3V0X25vX3JlbG9jOgorCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7CisJdm13X2JvX3AgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogdm13X3RyYW5zbGF0ZV9ndWVzdF9wb2ludGVyIC0gUHJlcGFyZSB0byB0cmFuc2xhdGUgYSB1c2VyLXNwYWNlIGJ1ZmZlcgogICogaGFuZGxlIHRvIGEgdmFsaWQgU1ZHQUd1ZXN0UHRyCiAgKgpAQCAtNzAxLDcgKzkzNCw3IEBACiAJc3RydWN0IHZtd19yZWxvY2F0aW9uICpyZWxvYzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gdm13X3VzZXJfZG1hYnVmX2xvb2t1cChzd19jb250ZXh0LT50ZmlsZSwgaGFuZGxlLCAmdm13X2JvKTsKKwlyZXQgPSB2bXdfdXNlcl9kbWFidWZfbG9va3VwKHN3X2NvbnRleHQtPmZwLT50ZmlsZSwgaGFuZGxlLCAmdm13X2JvKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiQ291bGQgbm90IGZpbmQgb3IgdXNlIEdNUiByZWdpb24uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MTgsNyArOTUxLDcgQEAKIAlyZWxvYyA9ICZzd19jb250ZXh0LT5yZWxvY3Nbc3dfY29udGV4dC0+Y3VyX3JlbG9jKytdOwogCXJlbG9jLT5sb2NhdGlvbiA9IHB0cjsKIAotCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN3X2NvbnRleHQsIGJvLCAmcmVsb2MtPmluZGV4KTsKKwlyZXQgPSB2bXdfYm9fdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LCBibywgZmFsc2UsICZyZWxvYy0+aW5kZXgpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X25vX3JlbG9jOwogCkBAIC03MzIsNiArOTY1LDMwIEBACiB9CiAKIC8qKgorICogdm13X2NtZF9iZWdpbl9nYl9xdWVyeSAtIHZhbGlkYXRlIGEgIFNWR0FfM0RfQ01EX0JFR0lOX0dCX1FVRVJZIGNvbW1hbmQuCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IHVzZWQgZm9yIHRoaXMgY29tbWFuZCBzdWJtaXNzaW9uLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfYmVnaW5fZ2JfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfYmVnaW5fZ2JfcXVlcnlfY21kIHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kQmVnaW5HQlF1ZXJ5IHE7CisJfSAqY21kOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19iZWdpbl9nYl9xdWVyeV9jbWQsCisJCQkgICBoZWFkZXIpOworCisJcmV0dXJuIHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX2NvbnRleHQsCisJCQkJIHVzZXJfY29udGV4dF9jb252ZXJ0ZXIsICZjbWQtPnEuY2lkLAorCQkJCSBOVUxMKTsKK30KKworLyoqCiAgKiB2bXdfY21kX2JlZ2luX3F1ZXJ5IC0gdmFsaWRhdGUgYSAgU1ZHQV8zRF9DTURfQkVHSU5fUVVFUlkgY29tbWFuZC4KICAqCiAgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCkBAIC03NTAsMTIgKzEwMDcsNjQgQEAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X2JlZ2luX3F1ZXJ5X2NtZCwKIAkJCSAgIGhlYWRlcik7CiAKKwlpZiAodW5saWtlbHkoZGV2X3ByaXYtPmhhc19tb2IpKSB7CisJCXN0cnVjdCB7CisJCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQkJU1ZHQTNkQ21kQmVnaW5HQlF1ZXJ5IHE7CisJCX0gZ2JfY21kOworCisJCUJVR19PTihzaXplb2YoZ2JfY21kKSAhPSBzaXplb2YoKmNtZCkpOworCisJCWdiX2NtZC5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9CRUdJTl9HQl9RVUVSWTsKKwkJZ2JfY21kLmhlYWRlci5zaXplID0gY21kLT5oZWFkZXIuc2l6ZTsKKwkJZ2JfY21kLnEuY2lkID0gY21kLT5xLmNpZDsKKwkJZ2JfY21kLnEudHlwZSA9IGNtZC0+cS50eXBlOworCisJCW1lbWNweShjbWQsICZnYl9jbWQsIHNpemVvZigqY21kKSk7CisJCXJldHVybiB2bXdfY21kX2JlZ2luX2diX3F1ZXJ5KGRldl9wcml2LCBzd19jb250ZXh0LCBoZWFkZXIpOworCX0KKwogCXJldHVybiB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19jb250ZXh0LAogCQkJCSB1c2VyX2NvbnRleHRfY29udmVydGVyLCAmY21kLT5xLmNpZCwKIAkJCQkgTlVMTCk7CiB9CiAKIC8qKgorICogdm13X2NtZF9lbmRfZ2JfcXVlcnkgLSB2YWxpZGF0ZSBhICBTVkdBXzNEX0NNRF9FTkRfR0JfUVVFUlkgY29tbWFuZC4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgdXNlZCBmb3IgdGhpcyBjb21tYW5kIHN1Ym1pc3Npb24uCisgKiBAaGVhZGVyOiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGhlYWRlciBpbiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X2NtZF9lbmRfZ2JfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQlzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICp2bXdfYm87CisJc3RydWN0IHZtd19xdWVyeV9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRFbmRHQlF1ZXJ5IHE7CisJfSAqY21kOworCWludCByZXQ7CisKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3F1ZXJ5X2NtZCwgaGVhZGVyKTsKKwlyZXQgPSB2bXdfY21kX2NpZF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdm13X3RyYW5zbGF0ZV9tb2JfcHRyKGRldl9wcml2LCBzd19jb250ZXh0LAorCQkJCSAgICAmY21kLT5xLm1vYmlkLAorCQkJCSAgICAmdm13X2JvKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdm13X3F1ZXJ5X2JvX3N3aXRjaF9wcmVwYXJlKGRldl9wcml2LCAmdm13X2JvLT5iYXNlLCBzd19jb250ZXh0KTsKKworCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCiAgKiB2bXdfY21kX2VuZF9xdWVyeSAtIHZhbGlkYXRlIGEgIFNWR0FfM0RfQ01EX0VORF9RVUVSWSBjb21tYW5kLgogICoKICAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KQEAgLTc3NCw2ICsxMDgzLDI1IEBACiAJaW50IHJldDsKIAogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfcXVlcnlfY21kLCBoZWFkZXIpOworCWlmIChkZXZfcHJpdi0+aGFzX21vYikgeworCQlzdHJ1Y3QgeworCQkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJCVNWR0EzZENtZEVuZEdCUXVlcnkgcTsKKwkJfSBnYl9jbWQ7CisKKwkJQlVHX09OKHNpemVvZihnYl9jbWQpICE9IHNpemVvZigqY21kKSk7CisKKwkJZ2JfY21kLmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX0VORF9HQl9RVUVSWTsKKwkJZ2JfY21kLmhlYWRlci5zaXplID0gY21kLT5oZWFkZXIuc2l6ZTsKKwkJZ2JfY21kLnEuY2lkID0gY21kLT5xLmNpZDsKKwkJZ2JfY21kLnEudHlwZSA9IGNtZC0+cS50eXBlOworCQlnYl9jbWQucS5tb2JpZCA9IGNtZC0+cS5ndWVzdFJlc3VsdC5nbXJJZDsKKwkJZ2JfY21kLnEub2Zmc2V0ID0gY21kLT5xLmd1ZXN0UmVzdWx0Lm9mZnNldDsKKworCQltZW1jcHkoY21kLCAmZ2JfY21kLCBzaXplb2YoKmNtZCkpOworCQlyZXR1cm4gdm13X2NtZF9lbmRfZ2JfcXVlcnkoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGhlYWRlcik7CisJfQorCiAJcmV0ID0gdm13X2NtZF9jaWRfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIGhlYWRlcik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKQEAgLTc5MCw3ICsxMTE4LDQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKKy8qKgorICogdm13X2NtZF93YWl0X2diX3F1ZXJ5IC0gdmFsaWRhdGUgYSAgU1ZHQV8zRF9DTURfV0FJVF9HQl9RVUVSWSBjb21tYW5kLgorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCB1c2VkIGZvciB0aGlzIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqIEBoZWFkZXI6IFBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgaGVhZGVyIGluIHRoZSBjb21tYW5kIHN0cmVhbS4KKyAqLworc3RhdGljIGludCB2bXdfY21kX3dhaXRfZ2JfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSBTVkdBM2RDbWRIZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKnZtd19ibzsKKwlzdHJ1Y3Qgdm13X3F1ZXJ5X2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFdhaXRGb3JHQlF1ZXJ5IHE7CisJfSAqY21kOworCWludCByZXQ7CisKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3F1ZXJ5X2NtZCwgaGVhZGVyKTsKKwlyZXQgPSB2bXdfY21kX2NpZF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdm13X3RyYW5zbGF0ZV9tb2JfcHRyKGRldl9wcml2LCBzd19jb250ZXh0LAorCQkJCSAgICAmY21kLT5xLm1vYmlkLAorCQkJCSAgICAmdm13X2JvKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJdm13X2RtYWJ1Zl91bnJlZmVyZW5jZSgmdm13X2JvKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiB2bXdfY21kX3dhaXRfcXVlcnkgLSB2YWxpZGF0ZSBhICBTVkdBXzNEX0NNRF9XQUlUX1FVRVJZIGNvbW1hbmQuCiAgKgogICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgpAQCAtODA5LDYgKzExNzAsMjUgQEAKIAlpbnQgcmV0OwogCiAJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19xdWVyeV9jbWQsIGhlYWRlcik7CisJaWYgKGRldl9wcml2LT5oYXNfbW9iKSB7CisJCXN0cnVjdCB7CisJCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQkJU1ZHQTNkQ21kV2FpdEZvckdCUXVlcnkgcTsKKwkJfSBnYl9jbWQ7CisKKwkJQlVHX09OKHNpemVvZihnYl9jbWQpICE9IHNpemVvZigqY21kKSk7CisKKwkJZ2JfY21kLmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX1dBSVRfRk9SX0dCX1FVRVJZOworCQlnYl9jbWQuaGVhZGVyLnNpemUgPSBjbWQtPmhlYWRlci5zaXplOworCQlnYl9jbWQucS5jaWQgPSBjbWQtPnEuY2lkOworCQlnYl9jbWQucS50eXBlID0gY21kLT5xLnR5cGU7CisJCWdiX2NtZC5xLm1vYmlkID0gY21kLT5xLmd1ZXN0UmVzdWx0LmdtcklkOworCQlnYl9jbWQucS5vZmZzZXQgPSBjbWQtPnEuZ3Vlc3RSZXN1bHQub2Zmc2V0OworCisJCW1lbWNweShjbWQsICZnYl9jbWQsIHNpemVvZigqY21kKSk7CisJCXJldHVybiB2bXdfY21kX3dhaXRfZ2JfcXVlcnkoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGhlYWRlcik7CisJfQorCiAJcmV0ID0gdm13X2NtZF9jaWRfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIGhlYWRlcik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKQEAgLTg1Myw3ICsxMjMzLDggQEAKIAogCXNyZiA9IHZtd19yZXNfdG9fc3JmKHN3X2NvbnRleHQtPnJlc19jYWNoZVt2bXdfcmVzX3N1cmZhY2VdLnJlcyk7CiAKLQl2bXdfa21zX2N1cnNvcl9zbm9vcChzcmYsIHN3X2NvbnRleHQtPnRmaWxlLCAmdm13X2JvLT5iYXNlLCBoZWFkZXIpOworCXZtd19rbXNfY3Vyc29yX3Nub29wKHNyZiwgc3dfY29udGV4dC0+ZnAtPnRmaWxlLCAmdm13X2JvLT5iYXNlLAorCQkJICAgICBoZWFkZXIpOwogCiBvdXRfbm9fc3VyZmFjZToKIAl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2bXdfYm8pOwpAQCAtOTIxLDE1ICsxMzAyLDIyIEBACiAJc3RydWN0IHZtd190ZXhfc3RhdGVfY21kIHsKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJU1ZHQTNkQ21kU2V0VGV4dHVyZVN0YXRlIHN0YXRlOwotCX07CisJfSAqY21kOwogCiAJU1ZHQTNkVGV4dHVyZVN0YXRlICpsYXN0X3N0YXRlID0gKFNWR0EzZFRleHR1cmVTdGF0ZSAqKQogCSAgKCh1bnNpZ25lZCBsb25nKSBoZWFkZXIgKyBoZWFkZXItPnNpemUgKyBzaXplb2YoaGVhZGVyKSk7CiAJU1ZHQTNkVGV4dHVyZVN0YXRlICpjdXJfc3RhdGUgPSAoU1ZHQTNkVGV4dHVyZVN0YXRlICopCiAJCSgodW5zaWduZWQgbG9uZykgaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCB2bXdfdGV4X3N0YXRlX2NtZCkpOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKmN0eF9ub2RlOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKnJlc19ub2RlOwogCWludCByZXQ7CiAKLQlyZXQgPSB2bXdfY21kX2NpZF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3RleF9zdGF0ZV9jbWQsCisJCQkgICBoZWFkZXIpOworCisJcmV0ID0gdm13X2NtZF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIHZtd19yZXNfY29udGV4dCwKKwkJCQl1c2VyX2NvbnRleHRfY29udmVydGVyLCAmY21kLT5zdGF0ZS5jaWQsCisJCQkJJmN0eF9ub2RlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlyZXR1cm4gcmV0OwogCkBAIC05MzksOSArMTMyNywyMCBAQAogCiAJCXJldCA9IHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX3N1cmZhY2UsCiAJCQkJCXVzZXJfc3VyZmFjZV9jb252ZXJ0ZXIsCi0JCQkJCSZjdXJfc3RhdGUtPnZhbHVlLCBOVUxMKTsKKwkJCQkJJmN1cl9zdGF0ZS0+dmFsdWUsICZyZXNfbm9kZSk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQlyZXR1cm4gcmV0OworCisJCWlmIChkZXZfcHJpdi0+aGFzX21vYikgeworCQkJc3RydWN0IHZtd19jdHhfYmluZGluZm8gYmk7CisKKwkJCWJpLmN0eCA9IGN0eF9ub2RlLT5yZXM7CisJCQliaS5yZXMgPSByZXNfbm9kZSA/IHJlc19ub2RlLT5yZXMgOiBOVUxMOworCQkJYmkuYnQgPSB2bXdfY3R4X2JpbmRpbmdfdGV4OworCQkJYmkuaTEudGV4dHVyZV9zdGFnZSA9IGN1cl9zdGF0ZS0+c3RhZ2U7CisJCQl2bXdfY29udGV4dF9iaW5kaW5nX2FkZChjdHhfbm9kZS0+c3RhZ2VkX2JpbmRpbmdzLAorCQkJCQkJJmJpKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtOTcxLDYgKzEzNzAsMzE0IEBACiB9CiAKIC8qKgorICogdm13X2NtZF9zd2l0Y2hfYmFja3VwIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBoYW5kbGUgYmFja3VwIGJ1ZmZlciBzd2l0Y2hpbmcKKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgYmVpbmcgdXNlZCBmb3IgdGhpcyBiYXRjaC4KKyAqIEByZXNfdHlwZTogVGhlIHJlc291cmNlIHR5cGUuCisgKiBAY29udmVydGVyOiBJbmZvcm1hdGlvbiBhYm91dCB1c2VyLXNwYWNlIGJpbmRpbmcgZm9yIHRoaXMgcmVzb3VyY2UgdHlwZS4KKyAqIEByZXNfaWQ6IFBvaW50ZXIgdG8gdGhlIHVzZXItc3BhY2UgcmVzb3VyY2UgaGFuZGxlIGluIHRoZSBjb21tYW5kIHN0cmVhbS4KKyAqIEBidWZfaWQ6IFBvaW50ZXIgdG8gdGhlIHVzZXItc3BhY2UgYmFja3VwIGJ1ZmZlciBoYW5kbGUgaW4gdGhlIGNvbW1hbmQKKyAqIHN0cmVhbS4KKyAqIEBiYWNrdXBfb2Zmc2V0OiBPZmZzZXQgb2YgYmFja3VwIGludG8gTU9CLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgZm9yIHJlZ2lzdGVyaW5nIGEgc3dpdGNoIG9mIGJhY2t1cCBidWZmZXJzCisgKiBpbiB0aGUgcmVzb3VyY2UgbWV0YWRhdGEganVzdCBwcmlvciB0byB1bnJlc2VydmluZy4KKyAqLworc3RhdGljIGludCB2bXdfY21kX3N3aXRjaF9iYWNrdXAoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSBlbnVtIHZtd19yZXNfdHlwZSByZXNfdHlwZSwKKwkJCQkgY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYKKwkJCQkgKmNvbnZlcnRlciwKKwkJCQkgdWludDMyX3QgKnJlc19pZCwKKwkJCQkgdWludDMyX3QgKmJ1Zl9pZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBiYWNrdXBfb2Zmc2V0KQoreworCWludCByZXQ7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICpkbWFfYnVmOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKnZhbF9ub2RlOworCisJcmV0ID0gdm13X2NtZF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIHJlc190eXBlLAorCQkJCWNvbnZlcnRlciwgcmVzX2lkLCAmdmFsX25vZGUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2bXdfdHJhbnNsYXRlX21vYl9wdHIoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGJ1Zl9pZCwgJmRtYV9idWYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsX25vZGUtPmZpcnN0X3VzYWdlKQorCQl2YWxfbm9kZS0+bm9fYnVmZmVyX25lZWRlZCA9IHRydWU7CisKKwl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2YWxfbm9kZS0+bmV3X2JhY2t1cCk7CisJdmFsX25vZGUtPm5ld19iYWNrdXAgPSBkbWFfYnVmOworCXZhbF9ub2RlLT5uZXdfYmFja3VwX29mZnNldCA9IGJhY2t1cF9vZmZzZXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY21kX2JpbmRfZ2Jfc3VyZmFjZSAtIFZhbGlkYXRlIGFuIFNWR0FfM0RfQ01EX0JJTkRfR0JfU1VSRkFDRQorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfYmluZF9nYl9zdXJmYWNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfYmluZF9nYl9zdXJmYWNlX2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZEJpbmRHQlN1cmZhY2UgYm9keTsKKwl9ICpjbWQ7CisKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X2JpbmRfZ2Jfc3VyZmFjZV9jbWQsIGhlYWRlcik7CisKKwlyZXR1cm4gdm13X2NtZF9zd2l0Y2hfYmFja3VwKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX3N1cmZhY2UsCisJCQkJICAgICB1c2VyX3N1cmZhY2VfY29udmVydGVyLAorCQkJCSAgICAgJmNtZC0+Ym9keS5zaWQsICZjbWQtPmJvZHkubW9iaWQsCisJCQkJICAgICAwKTsKK30KKworLyoqCisgKiB2bXdfY21kX3VwZGF0ZV9nYl9pbWFnZSAtIFZhbGlkYXRlIGFuIFNWR0FfM0RfQ01EX1VQREFURV9HQl9JTUFHRQorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfdXBkYXRlX2diX2ltYWdlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRVcGRhdGVHQkltYWdlIGJvZHk7CisJfSAqY21kOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19nYl9zdXJmYWNlX2NtZCwgaGVhZGVyKTsKKworCXJldHVybiB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19zdXJmYWNlLAorCQkJCSB1c2VyX3N1cmZhY2VfY29udmVydGVyLAorCQkJCSAmY21kLT5ib2R5LmltYWdlLnNpZCwgTlVMTCk7Cit9CisKKy8qKgorICogdm13X2NtZF91cGRhdGVfZ2Jfc3VyZmFjZSAtIFZhbGlkYXRlIGFuIFNWR0FfM0RfQ01EX1VQREFURV9HQl9TVVJGQUNFCisgKiBjb21tYW5kCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IGJlaW5nIHVzZWQgZm9yIHRoaXMgYmF0Y2guCisgKiBAaGVhZGVyOiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGhlYWRlciBpbiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X2NtZF91cGRhdGVfZ2Jfc3VyZmFjZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSAgICAgU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHZtd19nYl9zdXJmYWNlX2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFVwZGF0ZUdCU3VyZmFjZSBib2R5OworCX0gKmNtZDsKKworCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQsIGhlYWRlcik7CisKKwlyZXR1cm4gdm13X2NtZF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIHZtd19yZXNfc3VyZmFjZSwKKwkJCQkgdXNlcl9zdXJmYWNlX2NvbnZlcnRlciwKKwkJCQkgJmNtZC0+Ym9keS5zaWQsIE5VTEwpOworfQorCisvKioKKyAqIHZtd19jbWRfcmVhZGJhY2tfZ2JfaW1hZ2UgLSBWYWxpZGF0ZSBhbiBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9JTUFHRQorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfcmVhZGJhY2tfZ2JfaW1hZ2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgICAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRSZWFkYmFja0dCSW1hZ2UgYm9keTsKKwl9ICpjbWQ7CisKKwljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X2diX3N1cmZhY2VfY21kLCBoZWFkZXIpOworCisJcmV0dXJuIHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX3N1cmZhY2UsCisJCQkJIHVzZXJfc3VyZmFjZV9jb252ZXJ0ZXIsCisJCQkJICZjbWQtPmJvZHkuaW1hZ2Uuc2lkLCBOVUxMKTsKK30KKworLyoqCisgKiB2bXdfY21kX3JlYWRiYWNrX2diX3N1cmZhY2UgLSBWYWxpZGF0ZSBhbiBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9TVVJGQUNFCisgKiBjb21tYW5kCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IGJlaW5nIHVzZWQgZm9yIHRoaXMgYmF0Y2guCisgKiBAaGVhZGVyOiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGhlYWRlciBpbiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X2NtZF9yZWFkYmFja19nYl9zdXJmYWNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgICAgICAgU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHZtd19nYl9zdXJmYWNlX2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFJlYWRiYWNrR0JTdXJmYWNlIGJvZHk7CisJfSAqY21kOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19nYl9zdXJmYWNlX2NtZCwgaGVhZGVyKTsKKworCXJldHVybiB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19zdXJmYWNlLAorCQkJCSB1c2VyX3N1cmZhY2VfY29udmVydGVyLAorCQkJCSAmY21kLT5ib2R5LnNpZCwgTlVMTCk7Cit9CisKKy8qKgorICogdm13X2NtZF9pbnZhbGlkYXRlX2diX2ltYWdlIC0gVmFsaWRhdGUgYW4gU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9JTUFHRQorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfaW52YWxpZGF0ZV9nYl9pbWFnZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJICAgICAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRJbnZhbGlkYXRlR0JJbWFnZSBib2R5OworCX0gKmNtZDsKKworCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQsIGhlYWRlcik7CisKKwlyZXR1cm4gdm13X2NtZF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIHZtd19yZXNfc3VyZmFjZSwKKwkJCQkgdXNlcl9zdXJmYWNlX2NvbnZlcnRlciwKKwkJCQkgJmNtZC0+Ym9keS5pbWFnZS5zaWQsIE5VTEwpOworfQorCisvKioKKyAqIHZtd19jbWRfaW52YWxpZGF0ZV9nYl9zdXJmYWNlIC0gVmFsaWRhdGUgYW4KKyAqIFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfU1VSRkFDRSBjb21tYW5kCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IGJlaW5nIHVzZWQgZm9yIHRoaXMgYmF0Y2guCisgKiBAaGVhZGVyOiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGhlYWRlciBpbiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X2NtZF9pbnZhbGlkYXRlX2diX3N1cmZhY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkJIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfZ2Jfc3VyZmFjZV9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRJbnZhbGlkYXRlR0JTdXJmYWNlIGJvZHk7CisJfSAqY21kOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19nYl9zdXJmYWNlX2NtZCwgaGVhZGVyKTsKKworCXJldHVybiB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19zdXJmYWNlLAorCQkJCSB1c2VyX3N1cmZhY2VfY29udmVydGVyLAorCQkJCSAmY21kLT5ib2R5LnNpZCwgTlVMTCk7Cit9CisKKworLyoqCisgKiB2bXdfY21kX3NoYWRlcl9kZWZpbmUgLSBWYWxpZGF0ZSBhbiBTVkdBXzNEX0NNRF9TSEFERVJfREVGSU5FCisgKiBjb21tYW5kCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IGJlaW5nIHVzZWQgZm9yIHRoaXMgYmF0Y2guCisgKiBAaGVhZGVyOiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGhlYWRlciBpbiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X2NtZF9zaGFkZXJfZGVmaW5lKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHZtd19zaGFkZXJfZGVmaW5lX2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZERlZmluZVNoYWRlciBib2R5OworCX0gKmNtZDsKKwlpbnQgcmV0OworCXNpemVfdCBzaXplOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19zaGFkZXJfZGVmaW5lX2NtZCwKKwkJCSAgIGhlYWRlcik7CisKKwlyZXQgPSB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19jb250ZXh0LAorCQkJCXVzZXJfY29udGV4dF9jb252ZXJ0ZXIsICZjbWQtPmJvZHkuY2lkLAorCQkJCU5VTEwpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAodW5saWtlbHkoIWRldl9wcml2LT5oYXNfbW9iKSkKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gY21kLT5oZWFkZXIuc2l6ZSAtIHNpemVvZihjbWQtPmJvZHkpOworCXJldCA9IHZtd19jb21wYXRfc2hhZGVyX2FkZChzd19jb250ZXh0LT5mcC0+c2htYW4sCisJCQkJICAgIGNtZC0+Ym9keS5zaGlkLCBjbWQgKyAxLAorCQkJCSAgICBjbWQtPmJvZHkudHlwZSwgc2l6ZSwKKwkJCQkgICAgc3dfY29udGV4dC0+ZnAtPnRmaWxlLAorCQkJCSAgICAmc3dfY29udGV4dC0+c3RhZ2VkX3NoYWRlcnMpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdm13X3Jlc291cmNlX3JlbG9jYXRpb25fYWRkKCZzd19jb250ZXh0LT5yZXNfcmVsb2NhdGlvbnMsCisJCQkJCSAgIE5VTEwsICZjbWQtPmhlYWRlci5pZCAtCisJCQkJCSAgIHN3X2NvbnRleHQtPmJ1Zl9zdGFydCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY21kX3NoYWRlcl9kZXN0cm95IC0gVmFsaWRhdGUgYW4gU1ZHQV8zRF9DTURfU0hBREVSX0RFU1RST1kKKyAqIGNvbW1hbmQKKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgYmVpbmcgdXNlZCBmb3IgdGhpcyBiYXRjaC4KKyAqIEBoZWFkZXI6IFBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgaGVhZGVyIGluIHRoZSBjb21tYW5kIHN0cmVhbS4KKyAqLworc3RhdGljIGludCB2bXdfY21kX3NoYWRlcl9kZXN0cm95KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJICBTVkdBM2RDbWRIZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgdm13X3NoYWRlcl9kZXN0cm95X2NtZCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZERlc3Ryb3lTaGFkZXIgYm9keTsKKwl9ICpjbWQ7CisJaW50IHJldDsKKworCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfc2hhZGVyX2Rlc3Ryb3lfY21kLAorCQkJICAgaGVhZGVyKTsKKworCXJldCA9IHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX2NvbnRleHQsCisJCQkJdXNlcl9jb250ZXh0X2NvbnZlcnRlciwgJmNtZC0+Ym9keS5jaWQsCisJCQkJTlVMTCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCWlmICh1bmxpa2VseSghZGV2X3ByaXYtPmhhc19tb2IpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHZtd19jb21wYXRfc2hhZGVyX3JlbW92ZShzd19jb250ZXh0LT5mcC0+c2htYW4sCisJCQkJICAgICAgIGNtZC0+Ym9keS5zaGlkLAorCQkJCSAgICAgICBjbWQtPmJvZHkudHlwZSwKKwkJCQkgICAgICAgJnN3X2NvbnRleHQtPnN0YWdlZF9zaGFkZXJzKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZtd19yZXNvdXJjZV9yZWxvY2F0aW9uX2FkZCgmc3dfY29udGV4dC0+cmVzX3JlbG9jYXRpb25zLAorCQkJCQkgICBOVUxMLCAmY21kLT5oZWFkZXIuaWQgLQorCQkJCQkgICBzd19jb250ZXh0LT5idWZfc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogdm13X2NtZF9zZXRfc2hhZGVyIC0gVmFsaWRhdGUgYW4gU1ZHQV8zRF9DTURfU0VUX1NIQURFUgogICogY29tbWFuZAogICoKQEAgLTk4NiwxOCArMTY5MywxMDUgQEAKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJU1ZHQTNkQ21kU2V0U2hhZGVyIGJvZHk7CiAJfSAqY21kOworCXN0cnVjdCB2bXdfcmVzb3VyY2VfdmFsX25vZGUgKmN0eF9ub2RlOwogCWludCByZXQ7CiAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3NldF9zaGFkZXJfY21kLAogCQkJICAgaGVhZGVyKTsKIAotCXJldCA9IHZtd19jbWRfY2lkX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCBoZWFkZXIpOworCXJldCA9IHZtd19jbWRfcmVzX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCB2bXdfcmVzX2NvbnRleHQsCisJCQkJdXNlcl9jb250ZXh0X2NvbnZlcnRlciwgJmNtZC0+Ym9keS5jaWQsCisJCQkJJmN0eF9ub2RlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlyZXR1cm4gcmV0OwogCisJaWYgKGRldl9wcml2LT5oYXNfbW9iKSB7CisJCXN0cnVjdCB2bXdfY3R4X2JpbmRpbmZvIGJpOworCQlzdHJ1Y3Qgdm13X3Jlc291cmNlX3ZhbF9ub2RlICpyZXNfbm9kZTsKKwkJdTMyIHNoaWQgPSBjbWQtPmJvZHkuc2hpZDsKKworCQlpZiAoc2hpZCAhPSBTVkdBM0RfSU5WQUxJRF9JRCkKKwkJCSh2b2lkKSB2bXdfY29tcGF0X3NoYWRlcl9sb29rdXAoc3dfY29udGV4dC0+ZnAtPnNobWFuLAorCQkJCQkJCWNtZC0+Ym9keS50eXBlLAorCQkJCQkJCSZzaGlkKTsKKworCQlyZXQgPSB2bXdfY21kX2NvbXBhdF9yZXNfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsCisJCQkJCSAgICAgICB2bXdfcmVzX3NoYWRlciwKKwkJCQkJICAgICAgIHVzZXJfc2hhZGVyX2NvbnZlcnRlciwKKwkJCQkJICAgICAgIHNoaWQsCisJCQkJCSAgICAgICAmY21kLT5ib2R5LnNoaWQsICZyZXNfbm9kZSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCWJpLmN0eCA9IGN0eF9ub2RlLT5yZXM7CisJCWJpLnJlcyA9IHJlc19ub2RlID8gcmVzX25vZGUtPnJlcyA6IE5VTEw7CisJCWJpLmJ0ID0gdm13X2N0eF9iaW5kaW5nX3NoYWRlcjsKKwkJYmkuaTEuc2hhZGVyX3R5cGUgPSBjbWQtPmJvZHkudHlwZTsKKwkJcmV0dXJuIHZtd19jb250ZXh0X2JpbmRpbmdfYWRkKGN0eF9ub2RlLT5zdGFnZWRfYmluZGluZ3MsICZiaSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogdm13X2NtZF9zZXRfc2hhZGVyX2NvbnN0IC0gVmFsaWRhdGUgYW4gU1ZHQV8zRF9DTURfU0VUX1NIQURFUl9DT05TVAorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfc2V0X3NoYWRlcl9jb25zdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJICAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfc2V0X3NoYWRlcl9jb25zdF9jbWQgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRTZXRTaGFkZXJDb25zdCBib2R5OworCX0gKmNtZDsKKwlpbnQgcmV0OworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19zZXRfc2hhZGVyX2NvbnN0X2NtZCwKKwkJCSAgIGhlYWRlcik7CisKKwlyZXQgPSB2bXdfY21kX3Jlc19jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19jb250ZXh0LAorCQkJCXVzZXJfY29udGV4dF9jb252ZXJ0ZXIsICZjbWQtPmJvZHkuY2lkLAorCQkJCU5VTEwpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IpCisJCWhlYWRlci0+aWQgPSBTVkdBXzNEX0NNRF9TRVRfR0JfU0hBREVSQ09OU1RTX0lOTElORTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19jbWRfYmluZF9nYl9zaGFkZXIgLSBWYWxpZGF0ZSBhbiBTVkdBXzNEX0NNRF9CSU5EX0dCX1NIQURFUgorICogY29tbWFuZAorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdC4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCBiZWluZyB1c2VkIGZvciB0aGlzIGJhdGNoLgorICogQGhlYWRlcjogUG9pbnRlciB0byB0aGUgY29tbWFuZCBoZWFkZXIgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLgorICovCitzdGF0aWMgaW50IHZtd19jbWRfYmluZF9nYl9zaGFkZXIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB2bXdfYmluZF9nYl9zaGFkZXJfY21kIHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kQmluZEdCU2hhZGVyIGJvZHk7CisJfSAqY21kOworCisJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19iaW5kX2diX3NoYWRlcl9jbWQsCisJCQkgICBoZWFkZXIpOworCisJcmV0dXJuIHZtd19jbWRfc3dpdGNoX2JhY2t1cChkZXZfcHJpdiwgc3dfY29udGV4dCwgdm13X3Jlc19zaGFkZXIsCisJCQkJICAgICB1c2VyX3NoYWRlcl9jb252ZXJ0ZXIsCisJCQkJICAgICAmY21kLT5ib2R5LnNoaWQsICZjbWQtPmJvZHkubW9iaWQsCisJCQkJICAgICBjbWQtPmJvZHkub2Zmc2V0SW5CeXRlcyk7Cit9CisKIHN0YXRpYyBpbnQgdm13X2NtZF9jaGVja19ub3RfM2Qoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQlzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCiAJCQkJdm9pZCAqYnVmLCB1aW50MzJfdCAqc2l6ZSkKQEAgLTEwNDEsNTAgKzE4MzUsMTczIEBACiAJcmV0dXJuIDA7CiB9CiAKLXR5cGVkZWYgaW50ICgqdm13X2NtZF9mdW5jKSAoc3RydWN0IHZtd19wcml2YXRlICosCi0JCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqLAotCQkJICAgICBTVkdBM2RDbWRIZWFkZXIgKik7Ci0KLSNkZWZpbmUgVk1XX0NNRF9ERUYoY21kLCBmdW5jKSBcCi0JW2NtZCAtIFNWR0FfM0RfQ01EX0JBU0VdID0gZnVuYwotCi1zdGF0aWMgdm13X2NtZF9mdW5jIHZtd19jbWRfZnVuY3NbU1ZHQV8zRF9DTURfTUFYXSA9IHsKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORSwgJnZtd19jbWRfaW52YWxpZCksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU1VSRkFDRV9ERVNUUk9ZLCAmdm13X2NtZF9pbnZhbGlkKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX0NPUFksICZ2bXdfY21kX3N1cmZhY2VfY29weV9jaGVjayksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU1VSRkFDRV9TVFJFVENIQkxULCAmdm13X2NtZF9zdHJldGNoX2JsdF9jaGVjayksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU1VSRkFDRV9ETUEsICZ2bXdfY21kX2RtYSksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQ09OVEVYVF9ERUZJTkUsICZ2bXdfY21kX2ludmFsaWQpLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0NPTlRFWFRfREVTVFJPWSwgJnZtd19jbWRfaW52YWxpZCksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUVFJBTlNGT1JNLCAmdm13X2NtZF9jaWRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVFpSQU5HRSwgJnZtd19jbWRfY2lkX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRSRU5ERVJTVEFURSwgJnZtd19jbWRfY2lkX2NoZWNrKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm13X2NtZF9lbnRyeSBjb25zdCB2bXdfY21kX2VudHJpZXNbU1ZHQV8zRF9DTURfTUFYXSA9IHsKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVTVFJPWSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NVUkZBQ0VfQ09QWSwgJnZtd19jbWRfc3VyZmFjZV9jb3B5X2NoZWNrLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX1NUUkVUQ0hCTFQsICZ2bXdfY21kX3N0cmV0Y2hfYmx0X2NoZWNrLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX0RNQSwgJnZtd19jbWRfZG1hLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9DT05URVhUX0RFRklORSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0NPTlRFWFRfREVTVFJPWSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVFRSQU5TRk9STSwgJnZtd19jbWRfY2lkX2NoZWNrLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRaUkFOR0UsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUUkVOREVSU1RBVEUsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCiAJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUUkVOREVSVEFSR0VULAotCQkgICAgJnZtd19jbWRfc2V0X3JlbmRlcl90YXJnZXRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVFRFWFRVUkVTVEFURSwgJnZtd19jbWRfdGV4X3N0YXRlKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRNQVRFUklBTCwgJnZtd19jbWRfY2lkX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRMSUdIVERBVEEsICZ2bXdfY21kX2NpZF9jaGVjayksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUTElHSFRFTkFCTEVELCAmdm13X2NtZF9jaWRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVFZJRVdQT1JULCAmdm13X2NtZF9jaWRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVENMSVBQTEFORSwgJnZtd19jbWRfY2lkX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9DTEVBUiwgJnZtd19jbWRfY2lkX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9QUkVTRU5ULCAmdm13X2NtZF9wcmVzZW50X2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TSEFERVJfREVGSU5FLCAmdm13X2NtZF9jaWRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NIQURFUl9ERVNUUk9ZLCAmdm13X2NtZF9jaWRfY2hlY2spLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVF9TSEFERVIsICZ2bXdfY21kX3NldF9zaGFkZXIpLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVF9TSEFERVJfQ09OU1QsICZ2bXdfY21kX2NpZF9jaGVjayksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfRFJBV19QUklNSVRJVkVTLCAmdm13X2NtZF9kcmF3KSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRTQ0lTU09SUkVDVCwgJnZtd19jbWRfY2lkX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9CRUdJTl9RVUVSWSwgJnZtd19jbWRfYmVnaW5fcXVlcnkpLAotCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0VORF9RVUVSWSwgJnZtd19jbWRfZW5kX3F1ZXJ5KSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9XQUlUX0ZPUl9RVUVSWSwgJnZtd19jbWRfd2FpdF9xdWVyeSksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfUFJFU0VOVF9SRUFEQkFDSywgJnZtd19jbWRfb2spLAorCQkgICAgJnZtd19jbWRfc2V0X3JlbmRlcl90YXJnZXRfY2hlY2ssIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUVEVYVFVSRVNUQVRFLCAmdm13X2NtZF90ZXhfc3RhdGUsCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVE1BVEVSSUFMLCAmdm13X2NtZF9jaWRfY2hlY2ssCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVExJR0hUREFUQSwgJnZtd19jbWRfY2lkX2NoZWNrLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRMSUdIVEVOQUJMRUQsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUVklFV1BPUlQsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUQ0xJUFBMQU5FLCAmdm13X2NtZF9jaWRfY2hlY2ssCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0NMRUFSLCAmdm13X2NtZF9jaWRfY2hlY2ssCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1BSRVNFTlQsICZ2bXdfY21kX3ByZXNlbnRfY2hlY2ssCisJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TSEFERVJfREVGSU5FLCAmdm13X2NtZF9zaGFkZXJfZGVmaW5lLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TSEFERVJfREVTVFJPWSwgJnZtd19jbWRfc2hhZGVyX2Rlc3Ryb3ksCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVF9TSEFERVIsICZ2bXdfY21kX3NldF9zaGFkZXIsCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVF9TSEFERVJfQ09OU1QsICZ2bXdfY21kX3NldF9zaGFkZXJfY29uc3QsCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0RSQVdfUFJJTUlUSVZFUywgJnZtd19jbWRfZHJhdywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUU0NJU1NPUlJFQ1QsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQkVHSU5fUVVFUlksICZ2bXdfY21kX2JlZ2luX3F1ZXJ5LAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9FTkRfUVVFUlksICZ2bXdfY21kX2VuZF9xdWVyeSwKKwkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfV0FJVF9GT1JfUVVFUlksICZ2bXdfY21kX3dhaXRfcXVlcnksCisJCSAgICB0cnVlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1BSRVNFTlRfUkVBREJBQ0ssICZ2bXdfY21kX29rLAorCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSwKIAlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOLAotCQkgICAgJnZtd19jbWRfYmx0X3N1cmZfc2NyZWVuX2NoZWNrKSwKLQlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORV9WMiwgJnZtd19jbWRfaW52YWxpZCksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfR0VORVJBVEVfTUlQTUFQUywgJnZtd19jbWRfaW52YWxpZCksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQUNUSVZBVEVfU1VSRkFDRSwgJnZtd19jbWRfaW52YWxpZCksCi0JVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfREVBQ1RJVkFURV9TVVJGQUNFLCAmdm13X2NtZF9pbnZhbGlkKSwKKwkJICAgICZ2bXdfY21kX2JsdF9zdXJmX3NjcmVlbl9jaGVjaywgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkVfVjIsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9HRU5FUkFURV9NSVBNQVBTLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQUNUSVZBVEVfU1VSRkFDRSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0RFQUNUSVZBVEVfU1VSRkFDRSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NDUkVFTl9ETUEsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRfVU5JVFlfU1VSRkFDRV9DT09LSUUsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9PUEVOX0NPTlRFWFRfU1VSRkFDRSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0xPR0lDT1BTX0JJVEJMVCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0xPR0lDT1BTX1RSQU5TQkxULCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfTE9HSUNPUFNfU1RSRVRDSEJMVCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0xPR0lDT1BTX0NPTE9SRklMTCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0xPR0lDT1BTX0FMUEhBQkxFTkQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9MT0dJQ09QU19DTEVBUlRZUEVCTEVORCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1NFVF9PVEFCTEVfQkFTRSwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfUkVBREJBQ0tfT1RBQkxFLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERUZJTkVfR0JfTU9CLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX01PQiwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfUkVERUZJTkVfR0JfTU9CLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9VUERBVEVfR0JfTU9CX01BUFBJTkcsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0RFRklORV9HQl9TVVJGQUNFLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX1NVUkZBQ0UsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0JJTkRfR0JfU1VSRkFDRSwgJnZtd19jbWRfYmluZF9nYl9zdXJmYWNlLAorCQkgICAgdHJ1ZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0NPTkRfQklORF9HQl9TVVJGQUNFLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9VUERBVEVfR0JfSU1BR0UsICZ2bXdfY21kX3VwZGF0ZV9nYl9pbWFnZSwKKwkJICAgIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9VUERBVEVfR0JfU1VSRkFDRSwKKwkJICAgICZ2bXdfY21kX3VwZGF0ZV9nYl9zdXJmYWNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfUkVBREJBQ0tfR0JfSU1BR0UsCisJCSAgICAmdm13X2NtZF9yZWFkYmFja19nYl9pbWFnZSwgdHJ1ZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX1NVUkZBQ0UsCisJCSAgICAmdm13X2NtZF9yZWFkYmFja19nYl9zdXJmYWNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9JTUFHRSwKKwkJICAgICZ2bXdfY21kX2ludmFsaWRhdGVfZ2JfaW1hZ2UsIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9JTlZBTElEQVRFX0dCX1NVUkZBQ0UsCisJCSAgICAmdm13X2NtZF9pbnZhbGlkYXRlX2diX3N1cmZhY2UsIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERUZJTkVfR0JfQ09OVEVYVCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9DT05URVhULCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9CSU5EX0dCX0NPTlRFWFQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX0NPTlRFWFQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfQ09OVEVYVCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfREVGSU5FX0dCX1NIQURFUiwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQklORF9HQl9TSEFERVIsICZ2bXdfY21kX2JpbmRfZ2Jfc2hhZGVyLAorCQkgICAgdHJ1ZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0RFU1RST1lfR0JfU0hBREVSLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9TRVRfT1RBQkxFX0JBU0U2NCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0JFR0lOX0dCX1FVRVJZLCAmdm13X2NtZF9iZWdpbl9nYl9xdWVyeSwKKwkJICAgIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9FTkRfR0JfUVVFUlksICZ2bXdfY21kX2VuZF9nYl9xdWVyeSwKKwkJICAgIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9XQUlUX0ZPUl9HQl9RVUVSWSwgJnZtd19jbWRfd2FpdF9nYl9xdWVyeSwKKwkJICAgIHRydWUsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9OT1AsICZ2bXdfY21kX29rLAorCQkgICAgdHJ1ZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0VOQUJMRV9HQVJULCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ESVNBQkxFX0dBUlQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX01BUF9NT0JfSU5UT19HQVJULCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9VTk1BUF9HQVJUX1JBTkdFLCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERUZJTkVfR0JfU0NSRUVOVEFSR0VULCAmdm13X2NtZF9pbnZhbGlkLAorCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKwlWTVdfQ01EX0RFRihTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX1NDUkVFTlRBUkdFVCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfQklORF9HQl9TQ1JFRU5UQVJHRVQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1VQREFURV9HQl9TQ1JFRU5UQVJHRVQsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX1JFQURCQUNLX0dCX0lNQUdFX1BBUlRJQUwsICZ2bXdfY21kX2ludmFsaWQsCisJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpLAorCVZNV19DTURfREVGKFNWR0FfM0RfQ01EX0lOVkFMSURBVEVfR0JfSU1BR0VfUEFSVElBTCwgJnZtd19jbWRfaW52YWxpZCwKKwkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisJVk1XX0NNRF9ERUYoU1ZHQV8zRF9DTURfU0VUX0dCX1NIQURFUkNPTlNUU19JTkxJTkUsICZ2bXdfY21kX2NpZF9jaGVjaywKKwkJICAgIHRydWUsIGZhbHNlLCB0cnVlKQogfTsKIAogc3RhdGljIGludCB2bXdfY21kX2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC0xMDk1LDYgKzIwMTIsOCBAQAogCXVpbnQzMl90IHNpemVfcmVtYWluaW5nID0gKnNpemU7CiAJU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIgPSAoU1ZHQTNkQ21kSGVhZGVyICopIGJ1ZjsKIAlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCB2bXdfY21kX2VudHJ5ICplbnRyeTsKKwlib29sIGdiID0gZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dCT0JKRUNUUzsKIAogCWNtZF9pZCA9IGxlMzJfdG9fY3B1KCgodWludDMyX3QgKilidWYpWzBdKTsKIAkvKiBIYW5kbGUgYW55IG5vbmUgM0QgY29tbWFuZHMgKi8KQEAgLTExMDcsMTggKzIwMjYsNDAgQEAKIAogCWNtZF9pZCAtPSBTVkdBXzNEX0NNRF9CQVNFOwogCWlmICh1bmxpa2VseSgqc2l6ZSA+IHNpemVfcmVtYWluaW5nKSkKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dF9pbnZhbGlkOwogCiAJaWYgKHVubGlrZWx5KGNtZF9pZCA+PSBTVkdBXzNEX0NNRF9NQVggLSBTVkdBXzNEX0NNRF9CQVNFKSkKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dF9pbnZhbGlkOwogCi0JcmV0ID0gdm13X2NtZF9mdW5jc1tjbWRfaWRdKGRldl9wcml2LCBzd19jb250ZXh0LCBoZWFkZXIpOworCWVudHJ5ID0gJnZtd19jbWRfZW50cmllc1tjbWRfaWRdOworCWlmICh1bmxpa2VseSghZW50cnktPnVzZXJfYWxsb3cgJiYgIXN3X2NvbnRleHQtPmtlcm5lbCkpCisJCWdvdG8gb3V0X3ByaXZpbGVnZWQ7CisKKwlpZiAodW5saWtlbHkoZW50cnktPmdiX2Rpc2FibGUgJiYgZ2IpKQorCQlnb3RvIG91dF9vbGQ7CisKKwlpZiAodW5saWtlbHkoZW50cnktPmdiX2VuYWJsZSAmJiAhZ2IpKQorCQlnb3RvIG91dF9uZXc7CisKKwlyZXQgPSBlbnRyeS0+ZnVuYyhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIG91dF9lcnI7CisJCWdvdG8gb3V0X2ludmFsaWQ7CiAKIAlyZXR1cm4gMDsKLW91dF9lcnI6Ci0JRFJNX0VSUk9SKCJJbGxlZ2FsIC8gSW52YWxpZCBTVkdBM0QgY29tbWFuZDogJWRcbiIsCitvdXRfaW52YWxpZDoKKwlEUk1fRVJST1IoIkludmFsaWQgU1ZHQTNEIGNvbW1hbmQ6ICVkXG4iLAorCQkgIGNtZF9pZCArIFNWR0FfM0RfQ01EX0JBU0UpOworCXJldHVybiAtRUlOVkFMOworb3V0X3ByaXZpbGVnZWQ6CisJRFJNX0VSUk9SKCJQcml2aWxlZ2VkIFNWR0EzRCBjb21tYW5kOiAlZFxuIiwKKwkJICBjbWRfaWQgKyBTVkdBXzNEX0NNRF9CQVNFKTsKKwlyZXR1cm4gLUVQRVJNOworb3V0X29sZDoKKwlEUk1fRVJST1IoIkRlcHJlY2F0ZWQgKGRpc2FsbG93ZWQpIFNWR0EzRCBjb21tYW5kOiAlZFxuIiwKKwkJICBjbWRfaWQgKyBTVkdBXzNEX0NNRF9CQVNFKTsKKwlyZXR1cm4gLUVJTlZBTDsKK291dF9uZXc6CisJRFJNX0VSUk9SKCJTVkdBM0QgY29tbWFuZDogJWQgbm90IHN1cHBvcnRlZCBieSB2aXJ0dWFsIGhhcmR3YXJlLlxuIiwKIAkJICBjbWRfaWQgKyBTVkdBXzNEX0NNRF9CQVNFKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KQEAgLTExNzQsNiArMjExNSw5IEBACiAJCWNhc2UgVk1XX1BMX0dNUjoKIAkJCXJlbG9jLT5sb2NhdGlvbi0+Z21ySWQgPSBiby0+bWVtLnN0YXJ0OwogCQkJYnJlYWs7CisJCWNhc2UgVk1XX1BMX01PQjoKKwkJCSpyZWxvYy0+bW9iX2xvYyA9IGJvLT5tZW0uc3RhcnQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CkBAIC0xMTk4LDYgKzIxNDIsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2YWwsIHZhbF9uZXh0LCBsaXN0LCBoZWFkKSB7CiAJCWxpc3RfZGVsX2luaXQoJnZhbC0+aGVhZCk7CiAJCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmdmFsLT5yZXMpOworCQlpZiAodW5saWtlbHkodmFsLT5zdGFnZWRfYmluZGluZ3MpKQorCQkJa2ZyZWUodmFsLT5zdGFnZWRfYmluZGluZ3MpOwogCQlrZnJlZSh2YWwpOwogCX0KIH0KQEAgLTEyMjQsNyArMjE3MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgdm13X3ZhbGlkYXRlX3NpbmdsZV9idWZmZXIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQorCQkJCSAgICAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkJICAgICAgYm9vbCB2YWxpZGF0ZV9hc19tb2IpCiB7CiAJaW50IHJldDsKIApAQCAtMTIzOCw2ICsyMTg1LDkgQEAKIAkgICAgIGRldl9wcml2LT5kdW1teV9xdWVyeV9ib19waW5uZWQpKQogCQlyZXR1cm4gMDsKIAorCWlmICh2YWxpZGF0ZV9hc19tb2IpCisJCXJldHVybiB0dG1fYm9fdmFsaWRhdGUoYm8sICZ2bXdfbW9iX3BsYWNlbWVudCwgdHJ1ZSwgZmFsc2UpOworCiAJLyoqCiAJICogUHV0IEJPIGluIFZSQU0gaWYgdGhlcmUgaXMgc3BhY2UsIG90aGVyd2lzZSBhcyBhIEdNUi4KIAkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBpbiBWUkFNIGFuZCBHTVIgaWRzIGFyZSBhbGwgdXNlZCB1cCwKQEAgLTEyNTksNyArMjIwOSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgaW50IHZtd192YWxpZGF0ZV9idWZmZXJzKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkJc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0KQogewpAQCAtMTI2Nyw3ICsyMjE2LDggQEAKIAlpbnQgcmV0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzLCBiYXNlLmhlYWQpIHsKLQkJcmV0ID0gdm13X3ZhbGlkYXRlX3NpbmdsZV9idWZmZXIoZGV2X3ByaXYsIGVudHJ5LT5iYXNlLmJvKTsKKwkJcmV0ID0gdm13X3ZhbGlkYXRlX3NpbmdsZV9idWZmZXIoZGV2X3ByaXYsIGVudHJ5LT5iYXNlLmJvLAorCQkJCQkJIGVudHJ5LT52YWxpZGF0ZV9hc19tb2IpOwogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNDYxLDcgKzI0MTEsNyBAQAogCX0gZWxzZQogCQlzd19jb250ZXh0LT5rZXJuZWwgPSB0cnVlOwogCi0Jc3dfY29udGV4dC0+dGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJc3dfY29udGV4dC0+ZnAgPSB2bXdfZnByaXYoZmlsZV9wcml2KTsKIAlzd19jb250ZXh0LT5jdXJfcmVsb2MgPSAwOwogCXN3X2NvbnRleHQtPmN1cl92YWxfYnVmID0gMDsKIAlzd19jb250ZXh0LT5mZW5jZV9mbGFncyA9IDA7CkBAIC0xNDc4LDE2ICsyNDI4LDE3IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCXN3X2NvbnRleHQtPnJlc19odF9pbml0aWFsaXplZCA9IHRydWU7CiAJfQorCUlOSVRfTElTVF9IRUFEKCZzd19jb250ZXh0LT5zdGFnZWRfc2hhZGVycyk7CiAKIAlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2VfbGlzdCk7CiAJcmV0ID0gdm13X2NtZF9jaGVja19hbGwoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGtlcm5lbF9jb21tYW5kcywKIAkJCQljb21tYW5kX3NpemUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0X2VycjsKKwkJZ290byBvdXRfZXJyX25vcmVzOwogCiAJcmV0ID0gdm13X3Jlc291cmNlc19yZXNlcnZlKHN3X2NvbnRleHQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0X2VycjsKKwkJZ290byBvdXRfZXJyX25vcmVzOwogCiAJcmV0ID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycygmdGlja2V0LCAmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xNTA5LDExICsyNDYwLDIzIEBACiAJCQlnb3RvIG91dF9lcnI7CiAJfQogCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXZfcHJpdi0+YmluZGluZ19tdXRleCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmhhc19tb2IpIHsKKwkJcmV0ID0gdm13X3JlYmluZF9jb250ZXh0cyhzd19jb250ZXh0KTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKIAljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBjb21tYW5kX3NpemUpOwogCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIGZpZm8gc3BhY2UgZm9yIGNvbW1hbmRzLlxuIik7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2VycjsKKwkJZ290byBvdXRfdW5sb2NrX2JpbmRpbmc7CiAJfQogCiAJdm13X2FwcGx5X3JlbG9jYXRpb25zKHN3X2NvbnRleHQpOwpAQCAtMTUzOCw2ICsyNTAxLDggQEAKIAkJRFJNX0VSUk9SKCJGZW5jZSBzdWJtaXNzaW9uIGVycm9yLiBTeW5jaW5nLlxuIik7CiAKIAl2bXdfcmVzb3VyY2VfbGlzdF91bnJlc2VydmUoJnN3X2NvbnRleHQtPnJlc291cmNlX2xpc3QsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwogCXR0bV9ldV9mZW5jZV9idWZmZXJfb2JqZWN0cygmdGlja2V0LCAmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMsCiAJCQkJICAgICh2b2lkICopIGZlbmNlKTsKIApAQCAtMTU1OCw2ICsyNTIzLDggQEAKIAl9CiAKIAlsaXN0X3NwbGljZV9pbml0KCZzd19jb250ZXh0LT5yZXNvdXJjZV9saXN0LCAmcmVzb3VyY2VfbGlzdCk7CisJdm13X2NvbXBhdF9zaGFkZXJzX2NvbW1pdChzd19jb250ZXh0LT5mcC0+c2htYW4sCisJCQkJICAmc3dfY29udGV4dC0+c3RhZ2VkX3NoYWRlcnMpOwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7CiAKIAkvKgpAQCAtMTU2OCwxMSArMjUzNSwxNCBAQAogCiAJcmV0dXJuIDA7CiAKK291dF91bmxvY2tfYmluZGluZzoKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKIG91dF9lcnI6CisJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24oJnRpY2tldCwgJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzKTsKK291dF9lcnJfbm9yZXM6CisJdm13X3Jlc291cmNlX2xpc3RfdW5yZXNlcnZlKCZzd19jb250ZXh0LT5yZXNvdXJjZV9saXN0LCB0cnVlKTsKIAl2bXdfcmVzb3VyY2VfcmVsb2NhdGlvbnNfZnJlZSgmc3dfY29udGV4dC0+cmVzX3JlbG9jYXRpb25zKTsKIAl2bXdfZnJlZV9yZWxvY2F0aW9ucyhzd19jb250ZXh0KTsKLQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigmdGlja2V0LCAmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOwotCXZtd19yZXNvdXJjZV9saXN0X3VucmVzZXJ2ZSgmc3dfY29udGV4dC0+cmVzb3VyY2VfbGlzdCwgdHJ1ZSk7CiAJdm13X2NsZWFyX3ZhbGlkYXRpb25zKHN3X2NvbnRleHQpOwogCWlmICh1bmxpa2VseShkZXZfcHJpdi0+cGlubmVkX2JvICE9IE5VTEwgJiYKIAkJICAgICAhZGV2X3ByaXYtPnF1ZXJ5X2NpZF92YWxpZCkpCkBAIC0xNTgxLDYgKzI1NTEsOCBAQAogCWxpc3Rfc3BsaWNlX2luaXQoJnN3X2NvbnRleHQtPnJlc291cmNlX2xpc3QsICZyZXNvdXJjZV9saXN0KTsKIAllcnJvcl9yZXNvdXJjZSA9IHN3X2NvbnRleHQtPmVycm9yX3Jlc291cmNlOwogCXN3X2NvbnRleHQtPmVycm9yX3Jlc291cmNlID0gTlVMTDsKKwl2bXdfY29tcGF0X3NoYWRlcnNfcmV2ZXJ0KHN3X2NvbnRleHQtPmZwLT5zaG1hbiwKKwkJCQkgICZzd19jb250ZXh0LT5zdGFnZWRfc2hhZGVycyk7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmVuY2UuYwppbmRleCBjNjJkMjBlLi40MzZiMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7CiB9CiAKLXZvaWQgdm13X2ZlbmNlc19wZXJmb3JtX2FjdGlvbnMoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorc3RhdGljIHZvaWQgdm13X2ZlbmNlc19wZXJmb3JtX2FjdGlvbnMoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAogCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gKmFjdGlvbiwgKm5leHRfYWN0aW9uOwpAQCAtODk3LDcgKzg5Nyw3IEBACiAgKiBOb3RlIHRoYXQgdGhlIGFjdGlvbiBjYWxsYmFja3MgbWF5IGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCiAgKiByZXR1cm5zLgogICovCi12b2lkIHZtd19mZW5jZV9vYmpfYWRkX2FjdGlvbihzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsCitzdGF0aWMgdm9pZCB2bXdfZmVuY2Vfb2JqX2FkZF9hY3Rpb24oc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAogCQkJICAgICAgc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gKmFjdGlvbikKIHsKIAlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBmZW5jZS0+Zm1hbjsKQEAgLTk5Myw3ICs5OTMsNyBAQAogCXN0cnVjdCBkcm1fdm13X2V2ZW50X2ZlbmNlIGV2ZW50OwogfTsKIAotaW50IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorc3RhdGljIGludCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKIAkJCQkgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKIAkJCQkgIHVpbnQzMl90IGZsYWdzLAogCQkJCSAgdWludDY0X3QgdXNlcl9kYXRhLApAQCAtMTA4MCw3ICsxMDgwLDggQEAKIAkgKi8KIAlpZiAoYXJnLT5oYW5kbGUpIHsKIAkJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSA9Ci0JCQl0dG1fYmFzZV9vYmplY3RfbG9va3VwKHZtd19mcC0+dGZpbGUsIGFyZy0+aGFuZGxlKTsKKwkJCXR0bV9iYXNlX29iamVjdF9sb29rdXBfZm9yX3JlZihkZXZfcHJpdi0+dGRldiwKKwkJCQkJCSAgICAgICBhcmctPmhhbmRsZSk7CiAKIAkJaWYgKHVubGlrZWx5KGJhc2UgPT0gTlVMTCkpIHsKIAkJCURSTV9FUlJPUigiRmVuY2UgZXZlbnQgaW52YWxpZCBmZW5jZSBvYmplY3QgaGFuZGxlICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZpZm8uYwppbmRleCAzZWIxNDg2Li42Y2NkOTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jCkBAIC0zNSw2ICszNSwyMyBAQAogCXVpbnQzMl90IGZpZm9fbWluLCBod3ZlcnNpb247CiAJY29uc3Qgc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvID0gJmRldl9wcml2LT5maWZvOwogCisJaWYgKCEoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQXzNEKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HQk9CSkVDVFMpIHsKKwkJdWludDMyX3QgcmVzdWx0OworCisJCWlmICghZGV2X3ByaXYtPmhhc19tb2IpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19ERVZfQ0FQLCBTVkdBM0RfREVWQ0FQXzNEKTsKKwkJcmVzdWx0ID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0RFVl9DQVApOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CisKKwkJcmV0dXJuIChyZXN1bHQgIT0gMCk7CisJfQorCiAJaWYgKCEoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0VYVEVOREVEX0ZJRk8pKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTUxMSwyNCArNTI4LDE2IEBACiB9CiAKIC8qKgotICogdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeSAtIGVtaXRzIGEgZHVtbXkgcXVlcnkgdG8gdGhlIGZpZm8uCisgKiB2bXdfZmlmb19lbWl0X2R1bW15X2xlZ2FjeV9xdWVyeSAtIGVtaXRzIGEgZHVtbXkgcXVlcnkgdG8gdGhlIGZpZm8gdXNpbmcKKyAqIGxlZ2FjeSBxdWVyeSBjb21tYW5kcy4KICAqCiAgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCiAgKiBAY2lkOiBUaGUgaGFyZHdhcmUgY29udGV4dCBpZCB1c2VkIGZvciB0aGUgcXVlcnkuCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVtaXQgYSBkdW1teSBvY2NsdXNpb24gcXVlcnkgd2l0aAotICogbm8gcHJpbWl0aXZlcyByZW5kZXJlZCBiZXR3ZWVuIHF1ZXJ5IGJlZ2luIGFuZCBxdWVyeSBlbmQuCi0gKiBJdCdzIHVzZWQgdG8gcHJvdmlkZSBhIHF1ZXJ5IGJhcnJpZXIsIGluIG9yZGVyIHRvIGtub3cgdGhhdCB3aGVuCi0gKiB0aGlzIHF1ZXJ5IGlzIGZpbmlzaGVkLCBhbGwgcHJlY2VkaW5nIHF1ZXJpZXMgYXJlIGFsc28gZmluaXNoZWQuCi0gKgotICogQSBRdWVyeSByZXN1bHRzIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGF0IHRoZSBzdGFydAotICogb2YgdGhlIGRldl9wcml2LT5kdW1teV9xdWVyeV9ibyBidWZmZXIgb2JqZWN0LiBBbmQgdGhhdCBidWZmZXIgb2JqZWN0Ci0gKiBtdXN0IGFsc28gYmUgZWl0aGVyIHJlc2VydmVkIG9yIHBpbm5lZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgotICoKLSAqIFJldHVybnMgLUVOT01FTSBvbiBmYWlsdXJlIHRvIHJlc2VydmUgZmlmbyBzcGFjZS4KKyAqIFNlZSB0aGUgdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeSBkb2N1bWVudGF0aW9uLgogICovCi1pbnQgdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgdWludDMyX3QgY2lkKQorc3RhdGljIGludCB2bXdfZmlmb19lbWl0X2R1bW15X2xlZ2FjeV9xdWVyeShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQkgICAgdWludDMyX3QgY2lkKQogewogCS8qCiAJICogQSBxdWVyeSB3YWl0IHdpdGhvdXQgYSBwcmVjZWRpbmcgcXVlcnkgZW5kIHdpbGwKQEAgLTU2NiwzICs1NzUsNzUgQEAKIAogCXJldHVybiAwOwogfQorCisvKioKKyAqIHZtd19maWZvX2VtaXRfZHVtbXlfZ2JfcXVlcnkgLSBlbWl0cyBhIGR1bW15IHF1ZXJ5IHRvIHRoZSBmaWZvIHVzaW5nCisgKiBndWVzdC1iYWNrZWQgcmVzb3VyY2UgcXVlcnkgY29tbWFuZHMuCisgKgorICogQGRldl9wcml2OiBUaGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICogQGNpZDogVGhlIGhhcmR3YXJlIGNvbnRleHQgaWQgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorICoKKyAqIFNlZSB0aGUgdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeSBkb2N1bWVudGF0aW9uLgorICovCitzdGF0aWMgaW50IHZtd19maWZvX2VtaXRfZHVtbXlfZ2JfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJdWludDMyX3QgY2lkKQoreworCS8qCisJICogQSBxdWVyeSB3YWl0IHdpdGhvdXQgYSBwcmVjZWRpbmcgcXVlcnkgZW5kIHdpbGwKKwkgKiBhY3R1YWxseSBmaW5pc2ggYWxsIHF1ZXJpZXMgZm9yIHRoaXMgY2lkCisJICogd2l0aG91dCB3cml0aW5nIHRvIHRoZSBxdWVyeSByZXN1bHQgc3RydWN0dXJlLgorCSAqLworCisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGRldl9wcml2LT5kdW1teV9xdWVyeV9ibzsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRXYWl0Rm9yR0JRdWVyeSBib2R5OworCX0gKmNtZDsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiT3V0IG9mIGZpZm8gc3BhY2UgZm9yIGR1bW15IHF1ZXJ5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfV0FJVF9GT1JfR0JfUVVFUlk7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5jaWQgPSBjaWQ7CisJY21kLT5ib2R5LnR5cGUgPSBTVkdBM0RfUVVFUllUWVBFX09DQ0xVU0lPTjsKKwlCVUdfT04oYm8tPm1lbS5tZW1fdHlwZSAhPSBWTVdfUExfTU9CKTsKKwljbWQtPmJvZHkubW9iaWQgPSBiby0+bWVtLnN0YXJ0OworCWNtZC0+Ym9keS5vZmZzZXQgPSAwOworCisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB2bXdfZmlmb19lbWl0X2R1bW15X2diX3F1ZXJ5IC0gZW1pdHMgYSBkdW1teSBxdWVyeSB0byB0aGUgZmlmbyB1c2luZworICogYXBwcm9wcmlhdGUgcmVzb3VyY2UgcXVlcnkgY29tbWFuZHMuCisgKgorICogQGRldl9wcml2OiBUaGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICogQGNpZDogVGhlIGhhcmR3YXJlIGNvbnRleHQgaWQgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlbWl0IGEgZHVtbXkgb2NjbHVzaW9uIHF1ZXJ5IHdpdGgKKyAqIG5vIHByaW1pdGl2ZXMgcmVuZGVyZWQgYmV0d2VlbiBxdWVyeSBiZWdpbiBhbmQgcXVlcnkgZW5kLgorICogSXQncyB1c2VkIHRvIHByb3ZpZGUgYSBxdWVyeSBiYXJyaWVyLCBpbiBvcmRlciB0byBrbm93IHRoYXQgd2hlbgorICogdGhpcyBxdWVyeSBpcyBmaW5pc2hlZCwgYWxsIHByZWNlZGluZyBxdWVyaWVzIGFyZSBhbHNvIGZpbmlzaGVkLgorICoKKyAqIEEgUXVlcnkgcmVzdWx0cyBzdHJ1Y3R1cmUgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCBhdCB0aGUgc3RhcnQKKyAqIG9mIHRoZSBkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8gYnVmZmVyIG9iamVjdC4gQW5kIHRoYXQgYnVmZmVyIG9iamVjdAorICogbXVzdCBhbHNvIGJlIGVpdGhlciByZXNlcnZlZCBvciBwaW5uZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCisgKiBSZXR1cm5zIC1FTk9NRU0gb24gZmFpbHVyZSB0byByZXNlcnZlIGZpZm8gc3BhY2UuCisgKi8KK2ludCB2bXdfZmlmb19lbWl0X2R1bW15X3F1ZXJ5KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICB1aW50MzJfdCBjaWQpCit7CisJaWYgKGRldl9wcml2LT5oYXNfbW9iKQorCQlyZXR1cm4gdm13X2ZpZm9fZW1pdF9kdW1teV9nYl9xdWVyeShkZXZfcHJpdiwgY2lkKTsKKworCXJldHVybiB2bXdfZmlmb19lbWl0X2R1bW15X2xlZ2FjeV9xdWVyeShkZXZfcHJpdiwgY2lkKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKaW5kZXggNmVmMGIwMy4uNjFkOGQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKQEAgLTEyNSwxODEgKzEyNSwyNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHZtd19nbXJfZnJlZV9kZXNjcmlwdG9ycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZGVzY19kbWEsCi0JCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXNjX3BhZ2VzKQotewotCXN0cnVjdCBwYWdlICpwYWdlLCAqbmV4dDsKLQlzdHJ1Y3Qgc3ZnYV9ndWVzdF9tZW1fZGVzY3JpcHRvciAqcGFnZV92aXJ0dWFsOwotCXVuc2lnbmVkIGludCBkZXNjX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8KLQkJc2l6ZW9mKHN0cnVjdCBzdmdhX2d1ZXN0X21lbV9kZXNjcmlwdG9yKSAtIDE7Ci0KLQlpZiAobGlzdF9lbXB0eShkZXNjX3BhZ2VzKSkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIG5leHQsIGRlc2NfcGFnZXMsIGxydSkgewotCQlsaXN0X2RlbF9pbml0KCZwYWdlLT5scnUpOwotCi0JCWlmIChsaWtlbHkoZGVzY19kbWEgIT0gRE1BX0FERFJfSU5WQUxJRCkpIHsKLQkJCWRtYV91bm1hcF9wYWdlKGRldiwgZGVzY19kbWEsIFBBR0VfU0laRSwKLQkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7Ci0JCX0KLQotCQlwYWdlX3ZpcnR1YWwgPSBrbWFwX2F0b21pYyhwYWdlKTsKLQkJZGVzY19kbWEgPSAoZG1hX2FkZHJfdCkKLQkJCWxlMzJfdG9fY3B1KHBhZ2VfdmlydHVhbFtkZXNjX3Blcl9wYWdlXS5wcG4pIDw8Ci0JCQlQQUdFX1NISUZUOwotCQlrdW5tYXBfYXRvbWljKHBhZ2VfdmlydHVhbCk7Ci0KLQkJX19mcmVlX3BhZ2UocGFnZSk7Ci0JfQotfQotCi0vKioKLSAqIEZJWE1FOiBBZGp1c3QgdG8gdGhlIHR0bSBsb3dtZW0gLyBoaWdobWVtIHN0b3JhZ2UgdG8gbWluaW1pemUKLSAqIHRoZSBudW1iZXIgb2YgdXNlZCBkZXNjcmlwdG9ycy4KLSAqCi0gKi8KLQotc3RhdGljIGludCB2bXdfZ21yX2J1aWxkX2Rlc2NyaXB0b3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRlc2NfcGFnZXMsCi0JCQkJICAgICBzdHJ1Y3Qgdm13X3BpdGVyICppdGVyLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsCi0JCQkJICAgICBkbWFfYWRkcl90ICpmaXJzdF9kbWEpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHN2Z2FfZ3Vlc3RfbWVtX2Rlc2NyaXB0b3IgKnBhZ2VfdmlydHVhbCA9IE5VTEw7Ci0Jc3RydWN0IHN2Z2FfZ3Vlc3RfbWVtX2Rlc2NyaXB0b3IgKmRlc2NfdmlydHVhbCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGRlc2NfcGVyX3BhZ2U7Ci0JdW5zaWduZWQgbG9uZyBwcmV2X3BmbjsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQlpbnQgcmV0OwotCWRtYV9hZGRyX3QgZGVzY19kbWE7Ci0KLQlkZXNjX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8KLQkgICAgc2l6ZW9mKHN0cnVjdCBzdmdhX2d1ZXN0X21lbV9kZXNjcmlwdG9yKSAtIDE7Ci0KLQl3aGlsZSAobGlrZWx5KG51bV9wYWdlcyAhPSAwKSkgewotCQlwYWdlID0gYWxsb2NfcGFnZShfX0dGUF9ISUdITUVNKTsKLQkJaWYgKHVubGlrZWx5KHBhZ2UgPT0gTlVMTCkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9lcnI7Ci0JCX0KLQotCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsIGRlc2NfcGFnZXMpOwotCQlwYWdlX3ZpcnR1YWwgPSBrbWFwX2F0b21pYyhwYWdlKTsKLQkJZGVzY192aXJ0dWFsID0gcGFnZV92aXJ0dWFsIC0gMTsKLQkJcHJldl9wZm4gPSB+KDBVTCk7Ci0KLQkJd2hpbGUgKGxpa2VseShudW1fcGFnZXMgIT0gMCkpIHsKLQkJCXBmbiA9IHZtd19waXRlcl9kbWFfYWRkcihpdGVyKSA+PiBQQUdFX1NISUZUOwotCi0JCQlpZiAocGZuICE9IHByZXZfcGZuICsgMSkgewotCi0JCQkJaWYgKGRlc2NfdmlydHVhbCAtIHBhZ2VfdmlydHVhbCA9PQotCQkJCSAgICBkZXNjX3Blcl9wYWdlIC0gMSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkoKytkZXNjX3ZpcnR1YWwpLT5wcG4gPSBjcHVfdG9fbGUzMihwZm4pOwotCQkJCWRlc2NfdmlydHVhbC0+bnVtX3BhZ2VzID0gY3B1X3RvX2xlMzIoMSk7Ci0JCQl9IGVsc2UgewotCQkJCXVpbnQzMl90IHRtcCA9Ci0JCQkJICAgIGxlMzJfdG9fY3B1KGRlc2NfdmlydHVhbC0+bnVtX3BhZ2VzKTsKLQkJCQlkZXNjX3ZpcnR1YWwtPm51bV9wYWdlcyA9IGNwdV90b19sZTMyKHRtcCArIDEpOwotCQkJfQotCQkJcHJldl9wZm4gPSBwZm47Ci0JCQktLW51bV9wYWdlczsKLQkJCXZtd19waXRlcl9uZXh0KGl0ZXIpOwotCQl9Ci0KLQkJKCsrZGVzY192aXJ0dWFsKS0+cHBuID0gRE1BX1BBR0VfSU5WQUxJRDsKLQkJZGVzY192aXJ0dWFsLT5udW1fcGFnZXMgPSBjcHVfdG9fbGUzMigwKTsKLQkJa3VubWFwX2F0b21pYyhwYWdlX3ZpcnR1YWwpOwotCX0KLQotCWRlc2NfZG1hID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocGFnZSwgZGVzY19wYWdlcywgbHJ1KSB7Ci0JCXBhZ2VfdmlydHVhbCA9IGttYXBfYXRvbWljKHBhZ2UpOwotCQlwYWdlX3ZpcnR1YWxbZGVzY19wZXJfcGFnZV0ucHBuID0gY3B1X3RvX2xlMzIKLQkJCShkZXNjX2RtYSA+PiBQQUdFX1NISUZUKTsKLQkJa3VubWFwX2F0b21pYyhwYWdlX3ZpcnR1YWwpOwotCQlkZXNjX2RtYSA9IGRtYV9tYXBfcGFnZShkZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKLQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0KLQkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZGVzY19kbWEpKSkKLQkJCWdvdG8gb3V0X2VycjsKLQl9Ci0JKmZpcnN0X2RtYSA9IGRlc2NfZG1hOwotCi0JcmV0dXJuIDA7Ci1vdXRfZXJyOgotCXZtd19nbXJfZnJlZV9kZXNjcmlwdG9ycyhkZXYsIERNQV9BRERSX0lOVkFMSUQsIGRlc2NfcGFnZXMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZtd19nbXJfZmlyZV9kZXNjcmlwdG9ycyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCSAgICAgaW50IGdtcl9pZCwgZG1hX2FkZHJfdCBkZXNjX2RtYSkKLXsKLQltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwotCi0Jdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19HTVJfSUQsIGdtcl9pZCk7Ci0Jd21iKCk7Ci0Jdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19HTVJfREVTQ1JJUFRPUiwgZGVzY19kbWEgPj4gUEFHRV9TSElGVCk7Ci0JbWIoKTsKLQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQotfQotCiBpbnQgdm13X2dtcl9iaW5kKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCSBjb25zdCBzdHJ1Y3Qgdm13X3NnX3RhYmxlICp2c2d0LAogCQkgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsCiAJCSBpbnQgZ21yX2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgZGVzY19wYWdlczsKLQlkbWFfYWRkcl90IGRlc2NfZG1hID0gMDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2LT5kZXY7CiAJc3RydWN0IHZtd19waXRlciBkYXRhX2l0ZXI7Ci0JaW50IHJldDsKIAogCXZtd19waXRlcl9zdGFydCgmZGF0YV9pdGVyLCB2c2d0LCAwKTsKIAogCWlmICh1bmxpa2VseSghdm13X3BpdGVyX25leHQoJmRhdGFfaXRlcikpKQogCQlyZXR1cm4gMDsKIAotCWlmIChsaWtlbHkoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUjIpKQotCQlyZXR1cm4gdm13X2dtcjJfYmluZChkZXZfcHJpdiwgJmRhdGFfaXRlciwgbnVtX3BhZ2VzLCBnbXJfaWQpOwotCi0JaWYgKHVubGlrZWx5KCEoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUikpKQorCWlmICh1bmxpa2VseSghKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHZzZ3QtPm51bV9yZWdpb25zID4gZGV2X3ByaXYtPm1heF9nbXJfZGVzY3JpcHRvcnMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JSU5JVF9MSVNUX0hFQUQoJmRlc2NfcGFnZXMpOwotCi0JcmV0ID0gdm13X2dtcl9idWlsZF9kZXNjcmlwdG9ycyhkZXYsICZkZXNjX3BhZ2VzLCAmZGF0YV9pdGVyLAotCQkJCQludW1fcGFnZXMsICZkZXNjX2RtYSk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXZtd19nbXJfZmlyZV9kZXNjcmlwdG9ycyhkZXZfcHJpdiwgZ21yX2lkLCBkZXNjX2RtYSk7Ci0Jdm13X2dtcl9mcmVlX2Rlc2NyaXB0b3JzKGRldiwgZGVzY19kbWEsICZkZXNjX3BhZ2VzKTsKLQotCXJldHVybiAwOworCXJldHVybiB2bXdfZ21yMl9iaW5kKGRldl9wcml2LCAmZGF0YV9pdGVyLCBudW1fcGFnZXMsIGdtcl9pZCk7CiB9CiAKIAogdm9pZCB2bXdfZ21yX3VuYmluZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgZ21yX2lkKQogewotCWlmIChsaWtlbHkoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUjIpKSB7CisJaWYgKGxpa2VseShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikpCiAJCXZtd19nbXIyX3VuYmluZChkZXZfcHJpdiwgZ21yX2lkKTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7Ci0Jdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19HTVJfSUQsIGdtcl9pZCk7Ci0Jd21iKCk7Ci0Jdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19HTVJfREVTQ1JJUFRPUiwgMCk7Ci0JbWIoKTsKLQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXJpZF9tYW5hZ2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXJpZF9tYW5hZ2VyLmMKaW5kZXggYzVjMDU0YS4uYjEyNzNlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yaWRfbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtcmlkX21hbmFnZXIuYwpAQCAtMTI1LDEwICsxMjUsMjEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaW5pdCgmZ21hbi0+bG9jayk7Ci0JZ21hbi0+bWF4X2dtcl9wYWdlcyA9IGRldl9wcml2LT5tYXhfZ21yX3BhZ2VzOwogCWdtYW4tPnVzZWRfZ21yX3BhZ2VzID0gMDsKIAlpZGFfaW5pdCgmZ21hbi0+Z21yX2lkYSk7Ci0JZ21hbi0+bWF4X2dtcl9pZHMgPSBwX3NpemU7CisKKwlzd2l0Y2ggKHBfc2l6ZSkgeworCWNhc2UgVk1XX1BMX0dNUjoKKwkJZ21hbi0+bWF4X2dtcl9pZHMgPSBkZXZfcHJpdi0+bWF4X2dtcl9pZHM7CisJCWdtYW4tPm1heF9nbXJfcGFnZXMgPSBkZXZfcHJpdi0+bWF4X2dtcl9wYWdlczsKKwkJYnJlYWs7CisJY2FzZSBWTVdfUExfTU9COgorCQlnbWFuLT5tYXhfZ21yX2lkcyA9IFZNV0dGWF9OVU1fTU9COworCQlnbWFuLT5tYXhfZ21yX3BhZ2VzID0gZGV2X3ByaXYtPm1heF9tb2JfcGFnZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KIAltYW4tPnByaXYgPSAodm9pZCAqKSBnbWFuOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lvY3RsLmMKaW5kZXggNDVkNWI1YS4uZjk4ODFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pb2N0bC5jCkBAIC0yOSwxMiArMjksMTggQEAKICNpbmNsdWRlIDxkcm0vdm13Z2Z4X2RybS5oPgogI2luY2x1ZGUgInZtd2dmeF9rbXMuaCIKIAorc3RydWN0IHN2Z2FfM2RfY29tcGF0X2NhcCB7CisJU1ZHQTNkQ2Fwc1JlY29yZEhlYWRlciBoZWFkZXI7CisJU1ZHQTNkQ2FwUGFpciBwYWlyc1tTVkdBM0RfREVWQ0FQX01BWF07Cit9OworCiBpbnQgdm13X2dldHBhcmFtX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHJtX3Ztd19nZXRwYXJhbV9hcmcgKnBhcmFtID0KIAkgICAgKHN0cnVjdCBkcm1fdm13X2dldHBhcmFtX2FyZyAqKWRhdGE7CisJc3RydWN0IHZtd19mcHJpdiAqdm13X2ZwID0gdm13X2Zwcml2KGZpbGVfcHJpdik7CiAKIAlzd2l0Y2ggKHBhcmFtLT5wYXJhbSkgewogCWNhc2UgRFJNX1ZNV19QQVJBTV9OVU1fU1RSRUFNUzoKQEAgLTUzLDEzICs1OSwxOCBAQAogCQlwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+Zmlmby5jYXBhYmlsaXRpZXM7CiAJCWJyZWFrOwogCWNhc2UgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRToKLQkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKKwkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPnByaW1fYmJfbWVtOwogCQlicmVhazsKIAljYXNlIERSTV9WTVdfUEFSQU1fRklGT19IV19WRVJTSU9OOgogCXsKIAkJX19sZTMyIF9faW9tZW0gKmZpZm9fbWVtID0gZGV2X3ByaXYtPm1taW9fdmlydDsKIAkJY29uc3Qgc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvID0gJmRldl9wcml2LT5maWZvOwogCisJCWlmICgoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dCT0JKRUNUUykpIHsKKwkJCXBhcmFtLT52YWx1ZSA9IFNWR0EzRF9IV1ZFUlNJT05fV1M4X0IxOworCQkJYnJlYWs7CisJCX0KKwogCQlwYXJhbS0+dmFsdWUgPQogCQkJaW9yZWFkMzIoZmlmb19tZW0gKwogCQkJCSAoKGZpZm8tPmNhcGFiaWxpdGllcyAmCkBAIC02OSw3ICs4MCwyNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBEUk1fVk1XX1BBUkFNX01BWF9TVVJGX01FTU9SWToKLQkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPm1lbW9yeV9zaXplOworCQlpZiAoKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HQk9CSkVDVFMpICYmCisJCSAgICAhdm13X2ZwLT5nYl9hd2FyZSkKKwkJCXBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5tYXhfbW9iX3BhZ2VzICogUEFHRV9TSVpFIC8gMjsKKwkJZWxzZQorCQkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPm1lbW9yeV9zaXplOworCQlicmVhazsKKwljYXNlIERSTV9WTVdfUEFSQU1fM0RfQ0FQU19TSVpFOgorCQlpZiAoKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HQk9CSkVDVFMpICYmCisJCSAgICB2bXdfZnAtPmdiX2F3YXJlKQorCQkJcGFyYW0tPnZhbHVlID0gU1ZHQTNEX0RFVkNBUF9NQVggKiBzaXplb2YodWludDMyX3QpOworCQllbHNlIGlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR0JPQkpFQ1RTKQorCQkJcGFyYW0tPnZhbHVlID0gc2l6ZW9mKHN0cnVjdCBzdmdhXzNkX2NvbXBhdF9jYXApICsKKwkJCQlzaXplb2YodWludDMyX3QpOworCQllbHNlCisJCQlwYXJhbS0+dmFsdWUgPSAoU1ZHQV9GSUZPXzNEX0NBUFNfTEFTVCAtCisJCQkJCVNWR0FfRklGT18zRF9DQVBTICsgMSkgKgorCQkJCXNpemVvZih1aW50MzJfdCk7CisJCWJyZWFrOworCWNhc2UgRFJNX1ZNV19QQVJBTV9NQVhfTU9CX01FTU9SWToKKwkJdm13X2ZwLT5nYl9hd2FyZSA9IHRydWU7CisJCXBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5tYXhfbW9iX3BhZ2VzICogUEFHRV9TSVpFOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoIklsbGVnYWwgdm13Z2Z4IGdldCBwYXJhbSByZXF1ZXN0OiAlZFxuIiwKQEAgLTgwLDYgKzExMSwzOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZtd19maWxsX2NvbXBhdF9jYXAoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdm9pZCAqYm91bmNlLAorCQkJICAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBzdmdhXzNkX2NvbXBhdF9jYXAgKmNvbXBhdF9jYXAgPQorCQkoc3RydWN0IHN2Z2FfM2RfY29tcGF0X2NhcCAqKSBib3VuY2U7CisJdW5zaWduZWQgaW50IGk7CisJc2l6ZV90IHBhaXJfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHN2Z2FfM2RfY29tcGF0X2NhcCwgcGFpcnMpOworCXVuc2lnbmVkIGludCBtYXhfc2l6ZTsKKworCWlmIChzaXplIDwgcGFpcl9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWF4X3NpemUgPSAoc2l6ZSAtIHBhaXJfb2Zmc2V0KSAvIHNpemVvZihTVkdBM2RDYXBQYWlyKTsKKworCWlmIChtYXhfc2l6ZSA+IFNWR0EzRF9ERVZDQVBfTUFYKQorCQltYXhfc2l6ZSA9IFNWR0EzRF9ERVZDQVBfTUFYOworCisJY29tcGF0X2NhcC0+aGVhZGVyLmxlbmd0aCA9CisJCShwYWlyX29mZnNldCArIG1heF9zaXplICogc2l6ZW9mKFNWR0EzZENhcFBhaXIpKSAvIHNpemVvZih1MzIpOworCWNvbXBhdF9jYXAtPmhlYWRlci50eXBlID0gU1ZHQTNEQ0FQU19SRUNPUkRfREVWQ0FQUzsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IG1heF9zaXplOyArK2kpIHsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19ERVZfQ0FQLCBpKTsKKwkJY29tcGF0X2NhcC0+cGFpcnNbaV1bMF0gPSBpOworCQljb21wYXRfY2FwLT5wYWlyc1tpXVsxXSA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19ERVZfQ0FQKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKIAogaW50IHZtd19nZXRfY2FwXzNkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC05MiwyOSArMTU1LDU4IEBACiAJdm9pZCBfX3VzZXIgKmJ1ZmZlciA9ICh2b2lkIF9fdXNlciAqKSgodW5zaWduZWQgbG9uZykoYXJnLT5idWZmZXIpKTsKIAl2b2lkICpib3VuY2U7CiAJaW50IHJldDsKKwlib29sIGdiX29iamVjdHMgPSAhIShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR0JPQkpFQ1RTKTsKKwlzdHJ1Y3Qgdm13X2Zwcml2ICp2bXdfZnAgPSB2bXdfZnByaXYoZmlsZV9wcml2KTsKIAogCWlmICh1bmxpa2VseShhcmctPnBhZDY0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiSWxsZWdhbCBHRVRfM0RfQ0FQIGFyZ3VtZW50LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNpemUgPSAoU1ZHQV9GSUZPXzNEX0NBUFNfTEFTVCAtIFNWR0FfRklGT18zRF9DQVBTICsgMSkgPDwgMjsKKwlpZiAoZ2Jfb2JqZWN0cyAmJiB2bXdfZnAtPmdiX2F3YXJlKQorCQlzaXplID0gU1ZHQTNEX0RFVkNBUF9NQVggKiBzaXplb2YodWludDMyX3QpOworCWVsc2UgaWYgKGdiX29iamVjdHMpCisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHN2Z2FfM2RfY29tcGF0X2NhcCkgKyBzaXplb2YodWludDMyX3QpOworCWVsc2UKKwkJc2l6ZSA9IChTVkdBX0ZJRk9fM0RfQ0FQU19MQVNUIC0gU1ZHQV9GSUZPXzNEX0NBUFMgKyAxKSAqCisJCQlzaXplb2YodWludDMyX3QpOwogCiAJaWYgKGFyZy0+bWF4X3NpemUgPCBzaXplKQogCQlzaXplID0gYXJnLT5tYXhfc2l6ZTsKIAotCWJvdW5jZSA9IHZtYWxsb2Moc2l6ZSk7CisJYm91bmNlID0gdnphbGxvYyhzaXplKTsKIAlpZiAodW5saWtlbHkoYm91bmNlID09IE5VTEwpKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGJvdW5jZSBidWZmZXIgZm9yIDNEIGNhcHMuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZmlmb19tZW0gPSBkZXZfcHJpdi0+bW1pb192aXJ0OwotCW1lbWNweV9mcm9taW8oYm91bmNlLCAmZmlmb19tZW1bU1ZHQV9GSUZPXzNEX0NBUFNdLCBzaXplKTsKKwlpZiAoZ2Jfb2JqZWN0cyAmJiB2bXdfZnAtPmdiX2F3YXJlKSB7CisJCWludCBpLCBudW07CisJCXVpbnQzMl90ICpib3VuY2UzMiA9ICh1aW50MzJfdCAqKSBib3VuY2U7CisKKwkJbnVtID0gc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CisJCWlmIChudW0gPiBTVkdBM0RfREVWQ0FQX01BWCkKKwkJCW51bSA9IFNWR0EzRF9ERVZDQVBfTUFYOworCisJCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworCQkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19ERVZfQ0FQLCBpKTsKKwkJCSpib3VuY2UzMisrID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0RFVl9DQVApOworCQl9CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwl9IGVsc2UgaWYgKGdiX29iamVjdHMpIHsKKwkJcmV0ID0gdm13X2ZpbGxfY29tcGF0X2NhcChkZXZfcHJpdiwgYm91bmNlLCBzaXplKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9IGVsc2UgeworCQlmaWZvX21lbSA9IGRldl9wcml2LT5tbWlvX3ZpcnQ7CisJCW1lbWNweV9mcm9taW8oYm91bmNlLCAmZmlmb19tZW1bU1ZHQV9GSUZPXzNEX0NBUFNdLCBzaXplKTsKKwl9CiAKIAlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCBib3VuY2UsIHNpemUpOwogCWlmIChyZXQpCiAJCXJldCA9IC1FRkFVTFQ7CitvdXRfZXJyOgogCXZmcmVlKGJvdW5jZSk7CiAKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYwppbmRleCA0NjQwYWRiLi4wYzQyMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIFZNV19GRU5DRV9XUkFQICgxIDw8IDI0KQogCi1pcnFyZXR1cm5fdCB2bXdfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQoraXJxcmV0dXJuX3Qgdm13X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopYXJnOwogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwppbmRleCAwM2YxYzIwLi44YTY1MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwpAQCAtNDAsNyArNDAsNyBAQAogICogQ2xpcCBAbnVtX3JlY3RzIG51bWJlciBvZiBAcmVjdHMgYWdhaW5zdCBAY2xpcCBzdG9yaW5nIHRoZQogICogcmVzdWx0cyBpbiBAb3V0X3JlY3RzIGFuZCB0aGUgbnVtYmVyIG9mIHBhc3NlZCByZWN0cyBpbiBAb3V0X251bS4KICAqLwotdm9pZCB2bXdfY2xpcF9jbGlwcmVjdHMoc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzLAorc3RhdGljIHZvaWQgdm13X2NsaXBfY2xpcHJlY3RzKHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0cywKIAkJCWludCBudW1fcmVjdHMsCiAJCQlzdHJ1Y3Qgdm13X2NsaXBfcmVjdCBjbGlwLAogCQkJU1ZHQVNpZ25lZFJlY3QgKm91dF9yZWN0cywKQEAgLTQyMyw3ICs0MjMsNyBAQAogCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7CiB9OwogCi12b2lkIHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlX2Rlc3Ryb3koc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIpCitzdGF0aWMgdm9pZCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZV9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKQogewogCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSAqdmZicyA9CiAJCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJzKGZyYW1lYnVmZmVyKTsKQEAgLTU4OSw3ICs1ODksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZV9kaXJ0eShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKK3N0YXRpYyBpbnQgdm13X2ZyYW1lYnVmZmVyX3N1cmZhY2VfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKIAkJCQkgIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBjb2xvciwKIAkJCQkgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKQEAgLTYwOSw5ICs2MDksMTMgQEAKIAlpZiAoIWRldl9wcml2LT5zb3VfcHJpdikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXZfcHJpdi0+ZGV2KTsKKwogCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldl9wcml2LT5kZXYpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCWlmICghbnVtX2NsaXBzKSB7CiAJCW51bV9jbGlwcyA9IDE7CkBAIC02MjksNiArNjMzLDkgQEAKIAkJCQkgICBjbGlwcywgbnVtX2NsaXBzLCBpbmMsIE5VTEwpOwogCiAJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKKworCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2X3ByaXYtPmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjY1LDkgKzY3Miw5IEBACiAKIAlpZiAodW5saWtlbHkoc3VyZmFjZS0+bWlwX2xldmVsc1swXSAhPSAxIHx8CiAJCSAgICAgc3VyZmFjZS0+bnVtX3NpemVzICE9IDEgfHwKLQkJICAgICBzdXJmYWNlLT5zaXplc1swXS53aWR0aCA8IG1vZGVfY21kLT53aWR0aCB8fAotCQkgICAgIHN1cmZhY2UtPnNpemVzWzBdLmhlaWdodCA8IG1vZGVfY21kLT5oZWlnaHQgfHwKLQkJICAgICBzdXJmYWNlLT5zaXplc1swXS5kZXB0aCAhPSAxKSkgeworCQkgICAgIHN1cmZhY2UtPmJhc2Vfc2l6ZS53aWR0aCA8IG1vZGVfY21kLT53aWR0aCB8fAorCQkgICAgIHN1cmZhY2UtPmJhc2Vfc2l6ZS5oZWlnaHQgPCBtb2RlX2NtZC0+aGVpZ2h0IHx8CisJCSAgICAgc3VyZmFjZS0+YmFzZV9zaXplLmRlcHRoICE9IDEpKSB7CiAJCURSTV9FUlJPUigiSW5jb21wYXRpYmxlIHN1cmZhY2UgZGltZW5zaW9ucyAiCiAJCQkgICJmb3IgcmVxdWVzdGVkIG1vZGUuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NTQsNyArNzYxLDcgQEAKIAlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZmZlcjsKIH07CiAKLXZvaWQgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKQorc3RhdGljIHZvaWQgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKQogewogCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfZG1hYnVmICp2ZmJkID0KIAkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYmQoZnJhbWVidWZmZXIpOwpAQCAtOTQwLDcgKzk0Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCitzdGF0aWMgaW50IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCiAJCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkJCSB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCiAJCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKQEAgLTk1Myw5ICs5NjAsMTMgQEAKIAlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBub3JlY3Q7CiAJaW50IHJldCwgaW5jcmVtZW50ID0gMTsKIAorCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldl9wcml2LT5kZXYpOworCiAJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2X3ByaXYtPmRldik7CiAJCXJldHVybiByZXQ7CisJfQogCiAJaWYgKCFudW1fY2xpcHMpIHsKIAkJbnVtX2NsaXBzID0gMTsKQEAgLTk3OSw2ICs5OTAsOSBAQAogCX0KIAogCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CisKKwlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldl9wcml2LT5kZXYpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTYzMSw3ICsxNjQ1LDcgQEAKIAkJCQl1aW50MzJfdCBwaXRjaCwKIAkJCQl1aW50MzJfdCBoZWlnaHQpCiB7Ci0JcmV0dXJuICgodTY0KSBwaXRjaCAqICh1NjQpIGhlaWdodCkgPCAodTY0KSBkZXZfcHJpdi0+dnJhbV9zaXplOworCXJldHVybiAoKHU2NCkgcGl0Y2ggKiAodTY0KSBoZWlnaHQpIDwgKHU2NCkgZGV2X3ByaXYtPnByaW1fYmJfbWVtOwogfQogCiAKQEAgLTE2NjMsNyArMTY3Nyw3IEBACiAgKiBTbWFsbCBzaGFyZWQga21zIGZ1bmN0aW9ucy4KICAqLwogCi1pbnQgdm13X2R1X3VwZGF0ZV9sYXlvdXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdW5zaWduZWQgbnVtLAorc3RhdGljIGludCB2bXdfZHVfdXBkYXRlX2xheW91dChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCBudW0sCiAJCQkgc3RydWN0IGRybV92bXdfcmVjdCAqcmVjdHMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9tb2IuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X21vYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTVhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9tb2IuYwpAQCAtMCwwICsxLDY1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTIgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCisKKy8qCisgKiBJZiB3ZSBzZXQgdXAgdGhlIHNjcmVlbiB0YXJnZXQgb3RhYmxlLCBzY3JlZW4gb2JqZWN0cyBzdG9wIHdvcmtpbmcuCisgKi8KKworI2RlZmluZSBWTVdfT1RBQkxFX1NFVFVQX1NVQiAoKFZNV0dGWF9FTkFCTEVfU0NSRUVOX1RBUkdFVF9PVEFCTEUpID8gMCA6IDEpCisKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgVk1XX1BQTl9TSVpFIDgKKyNkZWZpbmUgVk1XX01PQkZNVF9QVERFUFRIXzAgU1ZHQTNEX01PQkZNVF9QVERFUFRINjRfMAorI2RlZmluZSBWTVdfTU9CRk1UX1BUREVQVEhfMSBTVkdBM0RfTU9CRk1UX1BUREVQVEg2NF8xCisjZGVmaW5lIFZNV19NT0JGTVRfUFRERVBUSF8yIFNWR0EzRF9NT0JGTVRfUFRERVBUSDY0XzIKKyNlbHNlCisjZGVmaW5lIFZNV19QUE5fU0laRSA0CisjZGVmaW5lIFZNV19NT0JGTVRfUFRERVBUSF8wIFNWR0EzRF9NT0JGTVRfUFRERVBUSF8wCisjZGVmaW5lIFZNV19NT0JGTVRfUFRERVBUSF8xIFNWR0EzRF9NT0JGTVRfUFRERVBUSF8xCisjZGVmaW5lIFZNV19NT0JGTVRfUFRERVBUSF8yIFNWR0EzRF9NT0JGTVRfUFRERVBUSF8yCisjZW5kaWYKKworLyoKKyAqIHN0cnVjdCB2bXdfbW9iIC0gU3RydWN0dXJlIGNvbnRhaW5pbmcgcGFnZSB0YWJsZSBhbmQgbWV0YWRhdGEgZm9yIGEKKyAqIEd1ZXN0IE1lbW9yeSBPQmplY3QuCisgKgorICogQG51bV9wYWdlcyAgICAgICBOdW1iZXIgb2YgcGFnZXMgdGhhdCBtYWtlIHVwIHRoZSBwYWdlIHRhYmxlLgorICogQHB0X2xldmVsICAgICAgICBUaGUgaW5kaXJlY3Rpb24gbGV2ZWwgb2YgdGhlIHBhZ2UgdGFibGUuIDAtMi4KKyAqIEBwdF9yb290X3BhZ2UgICAgRE1BIGFkZHJlc3Mgb2YgdGhlIGxldmVsIDAgcGFnZSBvZiB0aGUgcGFnZSB0YWJsZS4KKyAqLworc3RydWN0IHZtd19tb2IgeworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqcHRfYm87CisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7CisJdW5zaWduZWQgcHRfbGV2ZWw7CisJZG1hX2FkZHJfdCBwdF9yb290X3BhZ2U7CisJdWludDMyX3QgaWQ7Cit9OworCisvKgorICogc3RydWN0IHZtd19vdGFibGUgLSBHdWVzdCBNZW1vcnkgT0JqZWN0IHRhYmxlIG1ldGFkYXRhCisgKgorICogQHNpemU6ICAgICAgICAgICBTaXplIG9mIHRoZSB0YWJsZSAocGFnZS1hbGlnbmVkKS4KKyAqIEBwYWdlX3RhYmxlOiAgICAgUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfbW9iIGhvbGRpbmcgdGhlIHBhZ2UgdGFibGUuCisgKi8KK3N0cnVjdCB2bXdfb3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IHZtd19tb2IgKnBhZ2VfdGFibGU7Cit9OworCitzdGF0aWMgaW50IHZtd19tb2JfcHRfcG9wdWxhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X21vYiAqbW9iKTsKK3N0YXRpYyB2b2lkIHZtd19tb2JfcHRfc2V0dXAoc3RydWN0IHZtd19tb2IgKm1vYiwKKwkJCSAgICAgc3RydWN0IHZtd19waXRlciBkYXRhX2l0ZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RhdGFfcGFnZXMpOworCisvKgorICogdm13X3NldHVwX290YWJsZV9iYXNlIC0gSXNzdWUgYW4gb2JqZWN0IHRhYmxlIGJhc2Ugc2V0dXAgY29tbWFuZCB0bworICogdGhlIGRldmljZQorICoKKyAqIEBkZXZfcHJpdjogICAgICAgUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZQorICogQHR5cGU6ICAgICAgICAgICBUeXBlIG9mIG9iamVjdCB0YWJsZSBiYXNlCisgKiBAb2Zmc2V0ICAgICAgICAgIFN0YXJ0IG9mIHRhYmxlIG9mZnNldCBpbnRvIGRldl9wcml2OjpvdGFibGVfYm8KKyAqIEBvdGFibGUgICAgICAgICAgUG9pbnRlciB0byBvdGFibGUgbWV0YWRhdGE7CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FTk9NRU0gaWYgaXQgZmFpbHMgdG8gcmVzZXJ2ZSBmaWZvIHNwYWNlLAorICogYW5kIG1heSBibG9jayB3YWl0aW5nIGZvciBmaWZvIHNwYWNlLgorICovCitzdGF0aWMgaW50IHZtd19zZXR1cF9vdGFibGVfYmFzZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSBTVkdBT1RhYmxlVHlwZSB0eXBlLAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgc3RydWN0IHZtd19vdGFibGUgKm90YWJsZSkKK3sKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRTZXRPVGFibGVCYXNlNjQgYm9keTsKKwl9ICpjbWQ7CisJc3RydWN0IHZtd19tb2IgKm1vYjsKKwljb25zdCBzdHJ1Y3Qgdm13X3NnX3RhYmxlICp2c2d0OworCXN0cnVjdCB2bXdfcGl0ZXIgaXRlcjsKKwlpbnQgcmV0OworCisJQlVHX09OKG90YWJsZS0+cGFnZV90YWJsZSAhPSBOVUxMKTsKKworCXZzZ3QgPSB2bXdfYm9fc2dfdGFibGUoZGV2X3ByaXYtPm90YWJsZV9ibyk7CisJdm13X3BpdGVyX3N0YXJ0KCZpdGVyLCB2c2d0LCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJV0FSTl9PTighdm13X3BpdGVyX25leHQoJml0ZXIpKTsKKworCW1vYiA9IHZtd19tb2JfY3JlYXRlKG90YWJsZS0+c2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAodW5saWtlbHkobW9iID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIGNyZWF0aW5nIE9UYWJsZSBwYWdlIHRhYmxlLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChvdGFibGUtPnNpemUgPD0gUEFHRV9TSVpFKSB7CisJCW1vYi0+cHRfbGV2ZWwgPSBWTVdfTU9CRk1UX1BUREVQVEhfMDsKKwkJbW9iLT5wdF9yb290X3BhZ2UgPSB2bXdfcGl0ZXJfZG1hX2FkZHIoJml0ZXIpOworCX0gZWxzZSBpZiAodnNndC0+bnVtX3JlZ2lvbnMgPT0gMSkgeworCQltb2ItPnB0X2xldmVsID0gU1ZHQTNEX01PQkZNVF9SQU5HRTsKKwkJbW9iLT5wdF9yb290X3BhZ2UgPSB2bXdfcGl0ZXJfZG1hX2FkZHIoJml0ZXIpOworCX0gZWxzZSB7CisJCXJldCA9IHZtd19tb2JfcHRfcG9wdWxhdGUoZGV2X3ByaXYsIG1vYik7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9ub19wb3B1bGF0ZTsKKworCQl2bXdfbW9iX3B0X3NldHVwKG1vYiwgaXRlciwgb3RhYmxlLT5zaXplID4+IFBBR0VfU0hJRlQpOworCQltb2ItPnB0X2xldmVsICs9IFZNV19NT0JGTVRfUFRERVBUSF8xIC0gU1ZHQTNEX01PQkZNVF9QVERFUFRIXzE7CisJfQorCisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBPVGFibGUgc2V0dXAuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fZmlmbzsKKwl9CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfU0VUX09UQUJMRV9CQVNFNjQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS50eXBlID0gdHlwZTsKKwljbWQtPmJvZHkuYmFzZUFkZHJlc3MgPSBjcHVfdG9fbGU2NChtb2ItPnB0X3Jvb3RfcGFnZSA+PiBQQUdFX1NISUZUKTsKKwljbWQtPmJvZHkuc2l6ZUluQnl0ZXMgPSBvdGFibGUtPnNpemU7CisJY21kLT5ib2R5LnZhbGlkU2l6ZUluQnl0ZXMgPSAwOworCWNtZC0+Ym9keS5wdERlcHRoID0gbW9iLT5wdF9sZXZlbDsKKworCS8qCisJICogVGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgQnV0IHRoZSBvdGFibGUgc2l6ZSBpcworCSAqIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLCBzbyB0aGlzIEJVRyBzaG91bGRuJ3QgdHJpZ2dlcgorCSAqIHJhbmRvbWx5LgorCSAqLworCUJVR19PTihtb2ItPnB0X2xldmVsID09IFZNV19NT0JGTVRfUFRERVBUSF8yKTsKKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlvdGFibGUtPnBhZ2VfdGFibGUgPSBtb2I7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX2ZpZm86CitvdXRfbm9fcG9wdWxhdGU6CisJdm13X21vYl9kZXN0cm95KG1vYik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHZtd190YWtlZG93bl9vdGFibGVfYmFzZSAtIElzc3VlIGFuIG9iamVjdCB0YWJsZSBiYXNlIHRha2Vkb3duIGNvbW1hbmQKKyAqIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBAZGV2X3ByaXY6ICAgICAgIFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqIEB0eXBlOiAgICAgICAgICAgVHlwZSBvZiBvYmplY3QgdGFibGUgYmFzZQorICoKKyAqLworc3RhdGljIHZvaWQgdm13X3Rha2Vkb3duX290YWJsZV9iYXNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgICBTVkdBT1RhYmxlVHlwZSB0eXBlLAorCQkJCSAgICAgc3RydWN0IHZtd19vdGFibGUgKm90YWJsZSkKK3sKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRTZXRPVGFibGVCYXNlIGJvZHk7CisJfSAqY21kOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87CisKKwlpZiAob3RhYmxlLT5wYWdlX3RhYmxlID09IE5VTEwpCisJCXJldHVybjsKKworCWJvID0gb3RhYmxlLT5wYWdlX3RhYmxlLT5wdF9ibzsKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpCisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBPVGFibGUgc2V0dXAuXG4iKTsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9TRVRfT1RBQkxFX0JBU0U7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS50eXBlID0gdHlwZTsKKwljbWQtPmJvZHkuYmFzZUFkZHJlc3MgPSAwOworCWNtZC0+Ym9keS5zaXplSW5CeXRlcyA9IDA7CisJY21kLT5ib2R5LnZhbGlkU2l6ZUluQnl0ZXMgPSAwOworCWNtZC0+Ym9keS5wdERlcHRoID0gU1ZHQTNEX01PQkZNVF9JTlZBTElEOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKworCWlmIChibykgeworCQlpbnQgcmV0OworCisJCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIE5VTEwpOworCQlCVUdfT04ocmV0ICE9IDApOworCisJCXZtd19mZW5jZV9zaW5nbGVfYm8oYm8sIE5VTEwpOworCQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKwl9CisKKwl2bXdfbW9iX2Rlc3Ryb3kob3RhYmxlLT5wYWdlX3RhYmxlKTsKKwlvdGFibGUtPnBhZ2VfdGFibGUgPSBOVUxMOworfQorCisvKgorICogdm13X290YWJsZXNfc2V0dXAgLSBTZXQgdXAgZ3Vlc3QgYmFja2VkIG1lbW9yeSBvYmplY3QgdGFibGVzCisgKgorICogQGRldl9wcml2OiAgICAgICBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogVGFrZXMgY2FyZSBvZiB0aGUgZGV2aWNlIGd1ZXN0IGJhY2tlZCBzdXJmYWNlCisgKiBpbml0aWFsaXphdGlvbiwgYnkgc2V0dGluZyB1cCB0aGUgZ3Vlc3QgYmFja2VkIG1lbW9yeSBvYmplY3QgdGFibGVzLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIHZhcmlvdXMgZXJyb3IgY29kZXMgb24gZmFpbHVyZS4gQSBzdWNjZXNmdWwgcmV0dXJuCisgKiBtZWFucyB0aGUgb2JqZWN0IHRhYmxlcyBjYW4gYmUgdGFrZW4gZG93biB1c2luZyB0aGUgdm13X290YWJsZXNfdGFrZWRvd24KKyAqIGZ1bmN0aW9uLgorICovCitpbnQgdm13X290YWJsZXNfc2V0dXAoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJvX3NpemU7CisJc3RydWN0IHZtd19vdGFibGUgKm90YWJsZXM7CisJU1ZHQU9UYWJsZVR5cGUgaTsKKwlpbnQgcmV0OworCisJb3RhYmxlcyA9IGt6YWxsb2MoU1ZHQV9PVEFCTEVfRFg5X01BWCAqIHNpemVvZigqb3RhYmxlcyksCisJCQkgIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShvdGFibGVzID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBvdGFibGUgIgorCQkJICAibWV0YWRhdGEuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb3RhYmxlc1tTVkdBX09UQUJMRV9NT0JdLnNpemUgPQorCQlWTVdHRlhfTlVNX01PQiAqIFNWR0EzRF9PVEFCTEVfTU9CX0VOVFJZX1NJWkU7CisJb3RhYmxlc1tTVkdBX09UQUJMRV9TVVJGQUNFXS5zaXplID0KKwkJVk1XR0ZYX05VTV9HQl9TVVJGQUNFICogU1ZHQTNEX09UQUJMRV9TVVJGQUNFX0VOVFJZX1NJWkU7CisJb3RhYmxlc1tTVkdBX09UQUJMRV9DT05URVhUXS5zaXplID0KKwkJVk1XR0ZYX05VTV9HQl9DT05URVhUICogU1ZHQTNEX09UQUJMRV9DT05URVhUX0VOVFJZX1NJWkU7CisJb3RhYmxlc1tTVkdBX09UQUJMRV9TSEFERVJdLnNpemUgPQorCQlWTVdHRlhfTlVNX0dCX1NIQURFUiAqIFNWR0EzRF9PVEFCTEVfU0hBREVSX0VOVFJZX1NJWkU7CisJb3RhYmxlc1tTVkdBX09UQUJMRV9TQ1JFRU5fVEFSR0VUXS5zaXplID0KKwkJVk1XR0ZYX05VTV9HQl9TQ1JFRU5fVEFSR0VUICoKKwkJU1ZHQTNEX09UQUJMRV9TQ1JFRU5fVEFSR0VUX0VOVFJZX1NJWkU7CisKKwlib19zaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU1ZHQV9PVEFCTEVfRFg5X01BWDsgKytpKSB7CisJCW90YWJsZXNbaV0uc2l6ZSA9CisJCQkob3RhYmxlc1tpXS5zaXplICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CisJCWJvX3NpemUgKz0gb3RhYmxlc1tpXS5zaXplOworCX0KKworCXJldCA9IHR0bV9ib19jcmVhdGUoJmRldl9wcml2LT5iZGV2LCBib19zaXplLAorCQkJICAgIHR0bV9ib190eXBlX2RldmljZSwKKwkJCSAgICAmdm13X3N5c19uZV9wbGFjZW1lbnQsCisJCQkgICAgMCwgZmFsc2UsIE5VTEwsCisJCQkgICAgJmRldl9wcml2LT5vdGFibGVfYm8pOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfbm9fYm87CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShkZXZfcHJpdi0+b3RhYmxlX2JvLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIE5VTEwpOworCUJVR19PTihyZXQgIT0gMCk7CisJcmV0ID0gdm13X2JvX2RyaXZlci50dG1fdHRfcG9wdWxhdGUoZGV2X3ByaXYtPm90YWJsZV9iby0+dHRtKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF91bnJlc2VydmU7CisJcmV0ID0gdm13X2JvX21hcF9kbWEoZGV2X3ByaXYtPm90YWJsZV9ibyk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfdW5yZXNlcnZlOworCisJdHRtX2JvX3VucmVzZXJ2ZShkZXZfcHJpdi0+b3RhYmxlX2JvKTsKKworCW9mZnNldCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFNWR0FfT1RBQkxFX0RYOV9NQVggLSBWTVdfT1RBQkxFX1NFVFVQX1NVQjsgKytpKSB7CisJCXJldCA9IHZtd19zZXR1cF9vdGFibGVfYmFzZShkZXZfcHJpdiwgaSwgb2Zmc2V0LAorCQkJCQkgICAgJm90YWJsZXNbaV0pOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJZ290byBvdXRfbm9fc2V0dXA7CisJCW9mZnNldCArPSBvdGFibGVzW2ldLnNpemU7CisJfQorCisJZGV2X3ByaXYtPm90YWJsZXMgPSBvdGFibGVzOworCXJldHVybiAwOworCitvdXRfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUoZGV2X3ByaXYtPm90YWJsZV9ibyk7CitvdXRfbm9fc2V0dXA6CisJZm9yIChpID0gMDsgaSA8IFNWR0FfT1RBQkxFX0RYOV9NQVggLSBWTVdfT1RBQkxFX1NFVFVQX1NVQjsgKytpKQorCQl2bXdfdGFrZWRvd25fb3RhYmxlX2Jhc2UoZGV2X3ByaXYsIGksICZvdGFibGVzW2ldKTsKKworCXR0bV9ib191bnJlZigmZGV2X3ByaXYtPm90YWJsZV9ibyk7CitvdXRfbm9fYm86CisJa2ZyZWUob3RhYmxlcyk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogdm13X290YWJsZXNfdGFrZWRvd24gLSBUYWtlIGRvd24gZ3Vlc3QgYmFja2VkIG1lbW9yeSBvYmplY3QgdGFibGVzCisgKgorICogQGRldl9wcml2OiAgICAgICBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogVGFrZSBkb3duIHRoZSBHdWVzdCBNZW1vcnkgT2JqZWN0IHRhYmxlcy4KKyAqLwordm9pZCB2bXdfb3RhYmxlc190YWtlZG93bihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCVNWR0FPVGFibGVUeXBlIGk7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGRldl9wcml2LT5vdGFibGVfYm87CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBTVkdBX09UQUJMRV9EWDlfTUFYIC0gVk1XX09UQUJMRV9TRVRVUF9TVUI7ICsraSkKKwkJdm13X3Rha2Vkb3duX290YWJsZV9iYXNlKGRldl9wcml2LCBpLAorCQkJCQkgJmRldl9wcml2LT5vdGFibGVzW2ldKTsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIE5VTEwpOworCUJVR19PTihyZXQgIT0gMCk7CisKKwl2bXdfZmVuY2Vfc2luZ2xlX2JvKGJvLCBOVUxMKTsKKwl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKworCXR0bV9ib191bnJlZigmZGV2X3ByaXYtPm90YWJsZV9ibyk7CisJa2ZyZWUoZGV2X3ByaXYtPm90YWJsZXMpOworCWRldl9wcml2LT5vdGFibGVzID0gTlVMTDsKK30KKworCisvKgorICogdm13X21vYl9jYWxjdWxhdGVfcHRfcGFnZXMgLSBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlIHRhYmxlIHBhZ2VzCisgKiBuZWVkZWQgZm9yIGEgZ3Vlc3QgYmFja2VkIG1lbW9yeSBvYmplY3QuCisgKgorICogQGRhdGFfcGFnZXM6ICBOdW1iZXIgb2YgZGF0YSBwYWdlcyBpbiB0aGUgbWVtb3J5IG9iamVjdCBidWZmZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtd19tb2JfY2FsY3VsYXRlX3B0X3BhZ2VzKHVuc2lnbmVkIGxvbmcgZGF0YV9wYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSA9IGRhdGFfcGFnZXMgKiBQQUdFX1NJWkU7CisJdW5zaWduZWQgbG9uZyB0b3Rfc2l6ZSA9IDA7CisKKwl3aGlsZSAobGlrZWx5KGRhdGFfc2l6ZSA+IFBBR0VfU0laRSkpIHsKKwkJZGF0YV9zaXplID0gRElWX1JPVU5EX1VQKGRhdGFfc2l6ZSwgUEFHRV9TSVpFKTsKKwkJZGF0YV9zaXplICo9IFZNV19QUE5fU0laRTsKKwkJdG90X3NpemUgKz0gKGRhdGFfc2l6ZSArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLOworCX0KKworCXJldHVybiB0b3Rfc2l6ZSA+PiBQQUdFX1NISUZUOworfQorCisvKgorICogdm13X21vYl9jcmVhdGUgLSBDcmVhdGUgYSBtb2IsIGJ1dCBkb24ndCBwb3B1bGF0ZSBpdC4KKyAqCisgKiBAZGF0YV9wYWdlczogIE51bWJlciBvZiBkYXRhIHBhZ2VzIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBvYmplY3QuCisgKi8KK3N0cnVjdCB2bXdfbW9iICp2bXdfbW9iX2NyZWF0ZSh1bnNpZ25lZCBsb25nIGRhdGFfcGFnZXMpCit7CisJc3RydWN0IHZtd19tb2IgKm1vYiA9IGt6YWxsb2Moc2l6ZW9mKCptb2IpLCBHRlBfS0VSTkVMKTsKKworCWlmICh1bmxpa2VseShtb2IgPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJbW9iLT5udW1fcGFnZXMgPSB2bXdfbW9iX2NhbGN1bGF0ZV9wdF9wYWdlcyhkYXRhX3BhZ2VzKTsKKworCXJldHVybiBtb2I7Cit9CisKKy8qCisgKiB2bXdfbW9iX3B0X3BvcHVsYXRlIC0gUG9wdWxhdGUgdGhlIG1vYiBwYWdldGFibGUKKyAqCisgKiBAbW9iOiAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1vYiB0aGUgcGFnZXRhYmxlIG9mIHdoaWNoIHdlIHdhbnQgdG8KKyAqICAgICAgICAgICAgICAgcG9wdWxhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIHRoZSBwYWdldGFibGUsIGFuZAorICogYWRqdXN0cyBUVE0gbWVtb3J5IGFjY291bnRpbmcgYWNjb3JkaW5nbHkuIFJldHVybnMgRU5PTUVNIGlmCisgKiBtZW1vcnkgcmVzb3VyY2VzIGFyZW4ndCBzdWZmaWNpZW50IGFuZCBtYXkgY2F1c2UgVFRNIGJ1ZmZlciBvYmplY3RzCisgKiB0byBiZSBzd2FwcGVkIG91dCBieSB1c2luZyB0aGUgVFRNIG1lbW9yeSBhY2NvdW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHZtd19tb2JfcHRfcG9wdWxhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X21vYiAqbW9iKQoreworCWludCByZXQ7CisJQlVHX09OKG1vYi0+cHRfYm8gIT0gTlVMTCk7CisKKwlyZXQgPSB0dG1fYm9fY3JlYXRlKCZkZXZfcHJpdi0+YmRldiwgbW9iLT5udW1fcGFnZXMgKiBQQUdFX1NJWkUsCisJCQkgICAgdHRtX2JvX3R5cGVfZGV2aWNlLAorCQkJICAgICZ2bXdfc3lzX25lX3BsYWNlbWVudCwKKwkJCSAgICAwLCBmYWxzZSwgTlVMTCwgJm1vYi0+cHRfYm8pOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShtb2ItPnB0X2JvLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIE5VTEwpOworCisJQlVHX09OKHJldCAhPSAwKTsKKwlyZXQgPSB2bXdfYm9fZHJpdmVyLnR0bV90dF9wb3B1bGF0ZShtb2ItPnB0X2JvLT50dG0pOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X3VucmVzZXJ2ZTsKKwlyZXQgPSB2bXdfYm9fbWFwX2RtYShtb2ItPnB0X2JvKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF91bnJlc2VydmU7CisKKwl0dG1fYm9fdW5yZXNlcnZlKG1vYi0+cHRfYm8pOworCQorCXJldHVybiAwOworCitvdXRfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUobW9iLT5wdF9ibyk7CisJdHRtX2JvX3VucmVmKCZtb2ItPnB0X2JvKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X21vYl9hc3NpZ25fcHBuIC0gQXNzaWduIGEgdmFsdWUgdG8gYSBwYWdlIHRhYmxlIGVudHJ5CisgKgorICogQGFkZHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBwYWdlIHRhYmxlIGVudHJ5LgorICogQHZhbDogVGhlIHBhZ2UgdGFibGUgZW50cnkKKyAqCisgKiBBc3NpZ25zIGEgdmFsdWUgdG8gYSBwYWdlIHRhYmxlIGVudHJ5IHBvaW50ZWQgdG8gYnkgKkBhZGRyIGFuZCBpbmNyZW1lbnRzCisgKiAqQGFkZHIgYWNjb3JkaW5nIHRvIHRoZSBwYWdlIHRhYmxlIGVudHJ5IHNpemUuCisgKi8KKyNpZiAoVk1XX1BQTl9TSVpFID09IDgpCitzdGF0aWMgdm9pZCB2bXdfbW9iX2Fzc2lnbl9wcG4oX19sZTMyICoqYWRkciwgZG1hX2FkZHJfdCB2YWwpCit7CisJKigoX19sZTY0ICopICphZGRyKSA9IGNwdV90b19sZTY0KHZhbCA+PiBQQUdFX1NISUZUKTsKKwkqYWRkciArPSAyOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHZtd19tb2JfYXNzaWduX3BwbihfX2xlMzIgKiphZGRyLCBkbWFfYWRkcl90IHZhbCkKK3sKKwkqKCphZGRyKSsrID0gY3B1X3RvX2xlMzIodmFsID4+IFBBR0VfU0hJRlQpOworfQorI2VuZGlmCisKKy8qCisgKiB2bXdfbW9iX2J1aWxkX3B0IC0gQnVpbGQgYSBwYWdldGFibGUKKyAqCisgKiBAZGF0YV9hZGRyOiAgICAgIEFycmF5IG9mIERNQSBhZGRyZXNzZXMgdG8gdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgIG9iamVjdCdzIGRhdGEgcGFnZXMuCisgKiBAbnVtX2RhdGFfcGFnZXM6IE51bWJlciBvZiBidWZmZXIgb2JqZWN0IGRhdGEgcGFnZXMuCisgKiBAcHRfcGFnZXM6ICAgICAgIEFycmF5IG9mIHBhZ2UgcG9pbnRlcnMgdG8gdGhlIHBhZ2UgdGFibGUgcGFnZXMuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2UgdGFibGUgcGFnZXMgYWN0dWFsbHkgdXNlZC4KKyAqIFVzZXMgYXRvbWljIGttYXBzIG9mIGhpZ2htZW0gcGFnZXMgdG8gYXZvaWQgVExCIHRocmFzaGluZy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdm13X21vYl9idWlsZF9wdChzdHJ1Y3Qgdm13X3BpdGVyICpkYXRhX2l0ZXIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBudW1fZGF0YV9wYWdlcywKKwkJCQkgICAgICBzdHJ1Y3Qgdm13X3BpdGVyICpwdF9pdGVyKQoreworCXVuc2lnbmVkIGxvbmcgcHRfc2l6ZSA9IG51bV9kYXRhX3BhZ2VzICogVk1XX1BQTl9TSVpFOworCXVuc2lnbmVkIGxvbmcgbnVtX3B0X3BhZ2VzID0gRElWX1JPVU5EX1VQKHB0X3NpemUsIFBBR0VfU0laRSk7CisJdW5zaWduZWQgbG9uZyBwdF9wYWdlOworCV9fbGUzMiAqYWRkciwgKnNhdmVfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlmb3IgKHB0X3BhZ2UgPSAwOyBwdF9wYWdlIDwgbnVtX3B0X3BhZ2VzOyArK3B0X3BhZ2UpIHsKKwkJcGFnZSA9IHZtd19waXRlcl9wYWdlKHB0X2l0ZXIpOworCisJCXNhdmVfYWRkciA9IGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gVk1XX1BQTl9TSVpFOyArK2kpIHsKKwkJCXZtd19tb2JfYXNzaWduX3BwbigmYWRkciwKKwkJCQkJICAgdm13X3BpdGVyX2RtYV9hZGRyKGRhdGFfaXRlcikpOworCQkJaWYgKHVubGlrZWx5KC0tbnVtX2RhdGFfcGFnZXMgPT0gMCkpCisJCQkJYnJlYWs7CisJCQlXQVJOX09OKCF2bXdfcGl0ZXJfbmV4dChkYXRhX2l0ZXIpKTsKKwkJfQorCQlrdW5tYXBfYXRvbWljKHNhdmVfYWRkcik7CisJCXZtd19waXRlcl9uZXh0KHB0X2l0ZXIpOworCX0KKworCXJldHVybiBudW1fcHRfcGFnZXM7Cit9CisKKy8qCisgKiB2bXdfbW9iX2J1aWxkX3B0IC0gU2V0IHVwIGEgbXVsdGlsZXZlbCBtb2IgcGFnZXRhYmxlCisgKgorICogQG1vYjogICAgICAgICAgICBQb2ludGVyIHRvIGEgbW9iIHdob3NlIHBhZ2UgdGFibGUgbmVlZHMgc2V0dGluZyB1cC4KKyAqIEBkYXRhX2FkZHIgICAgICAgQXJyYXkgb2YgRE1BIGFkZHJlc3NlcyB0byB0aGUgYnVmZmVyIG9iamVjdCdzIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgcGFnZXMuCisgKiBAbnVtX2RhdGFfcGFnZXM6IE51bWJlciBvZiBidWZmZXIgb2JqZWN0IGRhdGEgcGFnZXMuCisgKgorICogVXNlcyB0YWlsIHJlY3Vyc2lvbiB0byBzZXQgdXAgYSBtdWx0aWxldmVsIG1vYiBwYWdlIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCB2bXdfbW9iX3B0X3NldHVwKHN0cnVjdCB2bXdfbW9iICptb2IsCisJCQkgICAgIHN0cnVjdCB2bXdfcGl0ZXIgZGF0YV9pdGVyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIG51bV9kYXRhX3BhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgbnVtX3B0X3BhZ2VzID0gMDsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gbW9iLT5wdF9ibzsKKwlzdHJ1Y3Qgdm13X3BpdGVyIHNhdmVfcHRfaXRlcjsKKwlzdHJ1Y3Qgdm13X3BpdGVyIHB0X2l0ZXI7CisJY29uc3Qgc3RydWN0IHZtd19zZ190YWJsZSAqdnNndDsKKwlpbnQgcmV0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCB0cnVlLCBmYWxzZSwgTlVMTCk7CisJQlVHX09OKHJldCAhPSAwKTsKKworCXZzZ3QgPSB2bXdfYm9fc2dfdGFibGUoYm8pOworCXZtd19waXRlcl9zdGFydCgmcHRfaXRlciwgdnNndCwgMCk7CisJQlVHX09OKCF2bXdfcGl0ZXJfbmV4dCgmcHRfaXRlcikpOworCW1vYi0+cHRfbGV2ZWwgPSAwOworCXdoaWxlIChsaWtlbHkobnVtX2RhdGFfcGFnZXMgPiAxKSkgeworCQkrK21vYi0+cHRfbGV2ZWw7CisJCUJVR19PTihtb2ItPnB0X2xldmVsID4gMik7CisJCXNhdmVfcHRfaXRlciA9IHB0X2l0ZXI7CisJCW51bV9wdF9wYWdlcyA9IHZtd19tb2JfYnVpbGRfcHQoJmRhdGFfaXRlciwgbnVtX2RhdGFfcGFnZXMsCisJCQkJCQkmcHRfaXRlcik7CisJCWRhdGFfaXRlciA9IHNhdmVfcHRfaXRlcjsKKwkJbnVtX2RhdGFfcGFnZXMgPSBudW1fcHRfcGFnZXM7CisJfQorCisJbW9iLT5wdF9yb290X3BhZ2UgPSB2bXdfcGl0ZXJfZG1hX2FkZHIoJnNhdmVfcHRfaXRlcik7CisJdHRtX2JvX3VucmVzZXJ2ZShibyk7Cit9CisKKy8qCisgKiB2bXdfbW9iX2Rlc3Ryb3kgLSBEZXN0cm95IGEgbW9iLCB1bnBvcHVsYXRpbmcgZmlyc3QgaWYgbmVjZXNzYXJ5LgorICoKKyAqIEBtb2I6ICAgICAgICAgICAgUG9pbnRlciB0byBhIG1vYiB0byBkZXN0cm95LgorICovCit2b2lkIHZtd19tb2JfZGVzdHJveShzdHJ1Y3Qgdm13X21vYiAqbW9iKQoreworCWlmIChtb2ItPnB0X2JvKQorCQl0dG1fYm9fdW5yZWYoJm1vYi0+cHRfYm8pOworCWtmcmVlKG1vYik7Cit9CisKKy8qCisgKiB2bXdfbW9iX3VuYmluZCAtIEhpZGUgYSBtb2IgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEBkZXZfcHJpdjogICAgICAgUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlLgorICogQG1vYl9pZDogICAgICAgICBEZXZpY2UgaWQgb2YgdGhlIG1vYiB0byB1bmJpbmQuCisgKi8KK3ZvaWQgdm13X21vYl91bmJpbmQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgIHN0cnVjdCB2bXdfbW9iICptb2IpCit7CisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kRGVzdHJveUdCTW9iIGJvZHk7CisJfSAqY21kOworCWludCByZXQ7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IG1vYi0+cHRfYm87CisKKwlpZiAoYm8pIHsKKwkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCB0cnVlLCBmYWxzZSwgTlVMTCk7CisJCS8qCisJCSAqIE5vb25lIGVsc2Ugc2hvdWxkIGJlIHVzaW5nIHRoaXMgYnVmZmVyLgorCQkgKi8KKwkJQlVHX09OKHJldCAhPSAwKTsKKwl9CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIE1lbW9yeSAiCisJCQkgICJPYmplY3QgdW5iaW5kaW5nLlxuIik7CisJfQorCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfREVTVFJPWV9HQl9NT0I7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5tb2JpZCA9IG1vYi0+aWQ7CisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmIChibykgeworCQl2bXdfZmVuY2Vfc2luZ2xlX2JvKGJvLCBOVUxMKTsKKwkJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisJfQorCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKK30KKworLyoKKyAqIHZtd19tb2JfYmluZCAtIE1ha2UgYSBtb2IgdmlzaWJsZSB0byB0aGUgZGV2aWNlIGFmdGVyIGZpcnN0CisgKiAgICAgICAgICAgICAgICBwb3B1bGF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBAZGV2X3ByaXY6ICAgICAgIFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZS4KKyAqIEBtb2I6ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbW9iIHdlJ3JlIG1ha2luZyB2aXNpYmxlLgorICogQGRhdGFfYWRkcjogICAgICBBcnJheSBvZiBETUEgYWRkcmVzc2VzIHRvIHRoZSBkYXRhIHBhZ2VzIG9mIHRoZSB1bmRlcmx5aW5nCisgKiAgICAgICAgICAgICAgICAgIGJ1ZmZlciBvYmplY3QuCisgKiBAbnVtX2RhdGFfcGFnZXM6IE51bWJlciBvZiBkYXRhIHBhZ2VzIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICBvYmplY3QuCisgKiBAbW9iX2lkOiAgICAgICAgIERldmljZSBpZCBvZiB0aGUgbW9iIHRvIGJpbmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGludGVyZmFjZWQgd2l0aCB0aGUgdHRtX3R0IGJhY2tlbmQKKyAqIGNvZGUuCisgKi8KK2ludCB2bXdfbW9iX2JpbmQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJIHN0cnVjdCB2bXdfbW9iICptb2IsCisJCSBjb25zdCBzdHJ1Y3Qgdm13X3NnX3RhYmxlICp2c2d0LAorCQkgdW5zaWduZWQgbG9uZyBudW1fZGF0YV9wYWdlcywKKwkJIGludDMyX3QgbW9iX2lkKQoreworCWludCByZXQ7CisJYm9vbCBwdF9zZXRfdXAgPSBmYWxzZTsKKwlzdHJ1Y3Qgdm13X3BpdGVyIGRhdGFfaXRlcjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWREZWZpbmVHQk1vYjY0IGJvZHk7CisJfSAqY21kOworCisJbW9iLT5pZCA9IG1vYl9pZDsKKwl2bXdfcGl0ZXJfc3RhcnQoJmRhdGFfaXRlciwgdnNndCwgMCk7CisJaWYgKHVubGlrZWx5KCF2bXdfcGl0ZXJfbmV4dCgmZGF0YV9pdGVyKSkpCisJCXJldHVybiAwOworCisJaWYgKGxpa2VseShudW1fZGF0YV9wYWdlcyA9PSAxKSkgeworCQltb2ItPnB0X2xldmVsID0gVk1XX01PQkZNVF9QVERFUFRIXzA7CisJCW1vYi0+cHRfcm9vdF9wYWdlID0gdm13X3BpdGVyX2RtYV9hZGRyKCZkYXRhX2l0ZXIpOworCX0gZWxzZSBpZiAodnNndC0+bnVtX3JlZ2lvbnMgPT0gMSkgeworCQltb2ItPnB0X2xldmVsID0gU1ZHQTNEX01PQkZNVF9SQU5HRTsKKwkJbW9iLT5wdF9yb290X3BhZ2UgPSB2bXdfcGl0ZXJfZG1hX2FkZHIoJmRhdGFfaXRlcik7CisJfSBlbHNlIGlmICh1bmxpa2VseShtb2ItPnB0X2JvID09IE5VTEwpKSB7CisJCXJldCA9IHZtd19tb2JfcHRfcG9wdWxhdGUoZGV2X3ByaXYsIG1vYik7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCXZtd19tb2JfcHRfc2V0dXAobW9iLCBkYXRhX2l0ZXIsIG51bV9kYXRhX3BhZ2VzKTsKKwkJcHRfc2V0X3VwID0gdHJ1ZTsKKwkJbW9iLT5wdF9sZXZlbCArPSBWTVdfTU9CRk1UX1BUREVQVEhfMSAtIFNWR0EzRF9NT0JGTVRfUFRERVBUSF8xOworCX0KKworCSh2b2lkKSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2LCBmYWxzZSk7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIE1lbW9yeSAiCisJCQkgICJPYmplY3QgYmluZGluZy5cbiIpOworCQlnb3RvIG91dF9ub19jbWRfc3BhY2U7CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfTU9CNjQ7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5tb2JpZCA9IG1vYl9pZDsKKwljbWQtPmJvZHkucHREZXB0aCA9IG1vYi0+cHRfbGV2ZWw7CisJY21kLT5ib2R5LmJhc2UgPSBjcHVfdG9fbGU2NChtb2ItPnB0X3Jvb3RfcGFnZSA+PiBQQUdFX1NISUZUKTsKKwljbWQtPmJvZHkuc2l6ZUluQnl0ZXMgPSBudW1fZGF0YV9wYWdlcyAqIFBBR0VfU0laRTsKKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKworCXJldHVybiAwOworCitvdXRfbm9fY21kX3NwYWNlOgorCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAocHRfc2V0X3VwKQorCQl0dG1fYm9fdW5yZWYoJm1vYi0+cHRfYm8pOworCisJcmV0dXJuIC1FTk9NRU07Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYwppbmRleCA5YjVlYTJhLi4yYWE0YmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKQEAgLTg4LDYgKzg4LDExIEBACiAJcmV0dXJuIHJlczsKIH0KIAorc3RydWN0IHZtd19yZXNvdXJjZSAqCit2bXdfcmVzb3VyY2VfcmVmZXJlbmNlX3VubGVzc19kb29tZWQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQoreworCXJldHVybiBrcmVmX2dldF91bmxlc3NfemVybygmcmVzLT5rcmVmKSA/IHJlcyA6IE5VTEw7Cit9CiAKIC8qKgogICogdm13X3Jlc291cmNlX3JlbGVhc2VfaWQgLSByZWxlYXNlIGEgcmVzb3VyY2UgaWQgdG8gdGhlIGlkIG1hbmFnZXIuCkBAIC0xMzYsOCArMTQxLDEyIEBACiAJCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnJlcy0+YmFja3VwKTsKIAl9CiAKLQlpZiAobGlrZWx5KHJlcy0+aHdfZGVzdHJveSAhPSBOVUxMKSkKKwlpZiAobGlrZWx5KHJlcy0+aHdfZGVzdHJveSAhPSBOVUxMKSkgewogCQlyZXMtPmh3X2Rlc3Ryb3kocmVzKTsKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCQl2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X2tpbGwoJnJlcy0+YmluZGluZ19oZWFkKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+YmluZGluZ19tdXRleCk7CisJfQogCiAJaWQgPSByZXMtPmlkOwogCWlmIChyZXMtPnJlc19mcmVlICE9IE5VTEwpCkBAIC0yMTUsNiArMjI0LDcgQEAKIAlyZXMtPmZ1bmMgPSBmdW5jOwogCUlOSVRfTElTVF9IRUFEKCZyZXMtPmxydV9oZWFkKTsKIAlJTklUX0xJU1RfSEVBRCgmcmVzLT5tb2JfaGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+YmluZGluZ19oZWFkKTsKIAlyZXMtPmlkID0gLTE7CiAJcmVzLT5iYWNrdXAgPSBOVUxMOwogCXJlcy0+YmFja3VwX29mZnNldCA9IDA7CkBAIC00NDEsNiArNDUxLDIxIEBACiAJdHRtX2JvX3VucmVmKCZibyk7CiB9CiAKK3N0YXRpYyB2b2lkIHZtd191c2VyX2RtYWJ1Zl9yZWZfb2JqX3JlbGVhc2Uoc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSwKKwkJCQkJICAgIGVudW0gdHRtX3JlZl90eXBlIHJlZl90eXBlKQoreworCXN0cnVjdCB2bXdfdXNlcl9kbWFfYnVmZmVyICp1c2VyX2JvOworCXVzZXJfYm8gPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIsIHByaW1lLmJhc2UpOworCisJc3dpdGNoIChyZWZfdHlwZSkgeworCWNhc2UgVFRNX1JFRl9TWU5DQ1BVX1dSSVRFOgorCQl0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKCZ1c2VyX2JvLT5kbWEuYmFzZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKwogLyoqCiAgKiB2bXdfdXNlcl9kbWFidWZfYWxsb2MgLSBBbGxvY2F0ZSBhIHVzZXIgZG1hIGJ1ZmZlcgogICoKQEAgLTQ3MSw2ICs0OTYsOCBAQAogCX0KIAogCXJldCA9IHZtd19kbWFidWZfaW5pdChkZXZfcHJpdiwgJnVzZXJfYm8tPmRtYSwgc2l6ZSwKKwkJCSAgICAgIChkZXZfcHJpdi0+aGFzX21vYikgPworCQkJICAgICAgJnZtd19zeXNfcGxhY2VtZW50IDoKIAkJCSAgICAgICZ2bXdfdnJhbV9zeXNfcGxhY2VtZW50LCB0cnVlLAogCQkJICAgICAgJnZtd191c2VyX2RtYWJ1Zl9kZXN0cm95KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtNDgyLDcgKzUwOSw4IEBACiAJCQkJICAgICZ1c2VyX2JvLT5wcmltZSwKIAkJCQkgICAgc2hhcmVhYmxlLAogCQkJCSAgICB0dG1fYnVmZmVyX3R5cGUsCi0JCQkJICAgICZ2bXdfdXNlcl9kbWFidWZfcmVsZWFzZSwgTlVMTCk7CisJCQkJICAgICZ2bXdfdXNlcl9kbWFidWZfcmVsZWFzZSwKKwkJCQkgICAgJnZtd191c2VyX2RtYWJ1Zl9yZWZfb2JqX3JlbGVhc2UpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJdHRtX2JvX3VucmVmKCZ0bXApOwogCQlnb3RvIG91dF9ub19iYXNlX29iamVjdDsKQEAgLTUxNSw2ICs1NDMsMTMwIEBACiAJCXZtd191c2VyX2JvLT5wcmltZS5iYXNlLnNoYXJlYWJsZSkgPyAwIDogLUVQRVJNOwogfQogCisvKioKKyAqIHZtd191c2VyX2RtYWJ1Zl9zeW5jY3B1X2dyYWIgLSBHcmFiIGEgc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIgZm9yIGNwdQorICogYWNjZXNzLCBpZGxpbmcgcHJldmlvdXMgR1BVIG9wZXJhdGlvbnMgb24gdGhlIGJ1ZmZlciBhbmQgb3B0aW9uYWxseQorICogYmxvY2tpbmcgaXQgZm9yIGZ1cnRoZXIgY29tbWFuZCBzdWJtaXNzaW9ucy4KKyAqCisgKiBAdXNlcl9ibzogUG9pbnRlciB0byB0aGUgYnVmZmVyIG9iamVjdCBiZWluZyBncmFiYmVkIGZvciBDUFUgYWNjZXNzCisgKiBAdGZpbGU6IElkZW50aWZ5aW5nIHRoZSBjYWxsZXIuCisgKiBAZmxhZ3M6IEZsYWdzIGluZGljYXRpbmcgaG93IHRoZSBncmFiIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKgorICogQSBibG9ja2luZyBncmFiIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWxlYXNlZCB3aGVuIEB0ZmlsZSBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyBpbnQgdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfZ3JhYihzdHJ1Y3Qgdm13X3VzZXJfZG1hX2J1ZmZlciAqdXNlcl9ibywKKwkJCQkJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkJCXVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmdXNlcl9iby0+ZG1hLmJhc2U7CisJYm9vbCBleGlzdGVkOworCWludCByZXQ7CisKKwlpZiAoZmxhZ3MgJiBkcm1fdm13X3N5bmNjcHVfYWxsb3dfY3MpIHsKKwkJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKKworCQlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCQlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIHRydWUsCisJCQkJICAhIShmbGFncyAmIGRybV92bXdfc3luY2NwdV9kb250YmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHR0bV9ib19zeW5jY3B1X3dyaXRlX2dyYWIKKwkJKGJvLCAhIShmbGFncyAmIGRybV92bXdfc3luY2NwdV9kb250YmxvY2spKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX3JlZl9vYmplY3RfYWRkKHRmaWxlLCAmdXNlcl9iby0+cHJpbWUuYmFzZSwKKwkJCQkgVFRNX1JFRl9TWU5DQ1BVX1dSSVRFLCAmZXhpc3RlZCk7CisJaWYgKHJldCAhPSAwIHx8IGV4aXN0ZWQpCisJCXR0bV9ib19zeW5jY3B1X3dyaXRlX3JlbGVhc2UoJnVzZXJfYm8tPmRtYS5iYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfcmVsZWFzZSAtIFJlbGVhc2UgYSBwcmV2aW91cyBncmFiIGZvciBDUFUgYWNjZXNzLAorICogYW5kIHVuYmxvY2sgY29tbWFuZCBzdWJtaXNzaW9uIG9uIHRoZSBidWZmZXIgaWYgYmxvY2tlZC4KKyAqCisgKiBAaGFuZGxlOiBIYW5kbGUgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciBvYmplY3QuCisgKiBAdGZpbGU6IElkZW50aWZ5aW5nIHRoZSBjYWxsZXIuCisgKiBAZmxhZ3M6IEZsYWdzIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgcmVsZWFzZS4KKyAqLworc3RhdGljIGludCB2bXdfdXNlcl9kbWFidWZfc3luY2NwdV9yZWxlYXNlKHVpbnQzMl90IGhhbmRsZSwKKwkJCQkJICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkJCSAgIHVpbnQzMl90IGZsYWdzKQoreworCWlmICghKGZsYWdzICYgZHJtX3Ztd19zeW5jY3B1X2FsbG93X2NzKSkKKwkJcmV0dXJuIHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodGZpbGUsIGhhbmRsZSwKKwkJCQkJCSBUVE1fUkVGX1NZTkNDUFVfV1JJVEUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfcmVsZWFzZSAtIGlvY3RsIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgc3luY2NwdQorICogZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAZGV2OiBJZGVudGlmaWVzIHRoZSBkcm0gZGV2aWNlLgorICogQGRhdGE6IFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50LgorICogQGZpbGVfcHJpdjogSWRlbnRpZmllcyB0aGUgY2FsbGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBpb2N0bCBhcmd1bWVudHMgZm9yIHZhbGlkaXR5IGFuZCBjYWxscyB0aGUKKyAqIHJlbGV2YW50IHN5bmNjcHUgZnVuY3Rpb25zLgorICovCitpbnQgdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fdm13X3N5bmNjcHVfYXJnICphcmcgPQorCQkoc3RydWN0IGRybV92bXdfc3luY2NwdV9hcmcgKikgZGF0YTsKKwlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmRtYV9idWY7CisJc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIgKnVzZXJfYm87CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJaW50IHJldDsKKworCWlmICgoYXJnLT5mbGFncyAmIChkcm1fdm13X3N5bmNjcHVfcmVhZCB8IGRybV92bXdfc3luY2NwdV93cml0ZSkpID09IDAKKwkgICAgfHwgKGFyZy0+ZmxhZ3MgJiB+KGRybV92bXdfc3luY2NwdV9yZWFkIHwgZHJtX3Ztd19zeW5jY3B1X3dyaXRlIHwKKwkJCSAgICAgICBkcm1fdm13X3N5bmNjcHVfZG9udGJsb2NrIHwKKwkJCSAgICAgICBkcm1fdm13X3N5bmNjcHVfYWxsb3dfY3MpKSAhPSAwKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCBzeW5jY3B1IGZsYWdzLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoYXJnLT5vcCkgeworCWNhc2UgZHJtX3Ztd19zeW5jY3B1X2dyYWI6CisJCXJldCA9IHZtd191c2VyX2RtYWJ1Zl9sb29rdXAodGZpbGUsIGFyZy0+aGFuZGxlLCAmZG1hX2J1Zik7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCXVzZXJfYm8gPSBjb250YWluZXJfb2YoZG1hX2J1Ziwgc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIsCisJCQkJICAgICAgIGRtYSk7CisJCXJldCA9IHZtd191c2VyX2RtYWJ1Zl9zeW5jY3B1X2dyYWIodXNlcl9ibywgdGZpbGUsIGFyZy0+ZmxhZ3MpOworCQl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZkbWFfYnVmKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwICYmIHJldCAhPSAtRVJFU1RBUlRTWVMgJiYKKwkJCSAgICAgcmV0ICE9IC1FQlVTWSkpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHN5bmNjcHUgZ3JhYiBvbiBoYW5kbGUgMHglMDh4LlxuIiwKKwkJCQkgICh1bnNpZ25lZCBpbnQpIGFyZy0+aGFuZGxlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkcm1fdm13X3N5bmNjcHVfcmVsZWFzZToKKwkJcmV0ID0gdm13X3VzZXJfZG1hYnVmX3N5bmNjcHVfcmVsZWFzZShhcmctPmhhbmRsZSwgdGZpbGUsCisJCQkJCQkgICAgICBhcmctPmZsYWdzKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJRFJNX0VSUk9SKCJGYWlsZWQgc3luY2NwdSByZWxlYXNlIG9uIGhhbmRsZSAweCUwOHguXG4iLAorCQkJCSAgKHVuc2lnbmVkIGludCkgYXJnLT5oYW5kbGUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkludmFsaWQgc3luY2NwdSBvcGVyYXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGludCB2bXdfZG1hYnVmX2FsbG9jX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKQEAgLTU5MSw3ICs3NDMsOCBAQAogfQogCiBpbnQgdm13X3VzZXJfZG1hYnVmX3JlZmVyZW5jZShzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKLQkJCSAgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqZG1hX2J1ZikKKwkJCSAgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqZG1hX2J1ZiwKKwkJCSAgICAgIHVpbnQzMl90ICpoYW5kbGUpCiB7CiAJc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIgKnVzZXJfYm87CiAKQEAgLTU5OSw2ICs3NTIsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXVzZXJfYm8gPSBjb250YWluZXJfb2YoZG1hX2J1Ziwgc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIsIGRtYSk7CisKKwkqaGFuZGxlID0gdXNlcl9iby0+cHJpbWUuYmFzZS5oYXNoLmtleTsKIAlyZXR1cm4gdHRtX3JlZl9vYmplY3RfYWRkKHRmaWxlLCAmdXNlcl9iby0+cHJpbWUuYmFzZSwKIAkJCQkgIFRUTV9SRUZfVVNBR0UsIE5VTEwpOwogfQpAQCAtMTI5MSwxMSArMTQ0Niw1NCBAQAogICogQG1lbTogICAgICAgICAgICBUaGUgdHJ1Y3QgdHRtX21lbV9yZWcgaW5kaWNhdGluZyB0byB3aGF0IG1lbW9yeQogICogICAgICAgICAgICAgICAgICByZWdpb24gdGhlIG1vdmUgaXMgdGFraW5nIHBsYWNlLgogICoKLSAqIEZvciBub3cgZG9lcyBub3RoaW5nLgorICogRXZpY3RzIHRoZSBHdWVzdCBCYWNrZWQgaGFyZHdhcmUgcmVzb3VyY2UgaWYgdGhlIGJhY2t1cAorICogYnVmZmVyIGlzIGJlaW5nIG1vdmVkIG91dCBvZiBNT0IgbWVtb3J5LgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCByYWNlIHdpdGggdGhlIHJlc291cmNlCisgKiB2YWxpZGF0aW9uIGNvZGUgYXMgbG9uZyBhcyBpdCBhY2Nlc3NlcyBvbmx5IG1lbWJlcnMgb2Ygc3RydWN0CisgKiByZXNvdXJjZSB0aGF0IHJlbWFpbiBzdGF0aWMgd2hpbGUgYm86OnJlcyBpcyAhTlVMTCBhbmQKKyAqIHdoaWxlIHdlIGhhdmUgQGJvIHJlc2VydmVkLiBzdHJ1Y3QgcmVzb3VyY2U6OmJhY2t1cCBpcyAqbm90KiBhCisgKiBzdGF0aWMgbWVtYmVyLiBUaGUgcmVzb3VyY2UgdmFsaWRhdGlvbiBjb2RlIHdpbGwgdGFrZSBjYXJlCisgKiB0byBzZXQgQGJvOjpyZXMgdG8gTlVMTCwgd2hpbGUgaGF2aW5nIEBibyByZXNlcnZlZCB3aGVuIHRoZQorICogYnVmZmVyIGlzIG5vIGxvbmdlciBib3VuZCB0byB0aGUgcmVzb3VyY2UsIHNvIEBibzpyZXMgY2FuIGJlCisgKiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgbmVlZCB0byB1bmJpbmQgYW5kIHdoZXRoZXIKKyAqIGl0IGlzIHNhZmUgdG8gdW5iaW5kLgogICovCiB2b2lkIHZtd19yZXNvdXJjZV9tb3ZlX25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkJICAgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCiB7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICpkbWFfYnVmOworCisJaWYgKG1lbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoYm8tPmRlc3Ryb3kgIT0gdm13X2RtYWJ1Zl9ib19mcmVlICYmCisJICAgIGJvLT5kZXN0cm95ICE9IHZtd191c2VyX2RtYWJ1Zl9kZXN0cm95KQorCQlyZXR1cm47CisKKwlkbWFfYnVmID0gY29udGFpbmVyX29mKGJvLCBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIsIGJhc2UpOworCisJaWYgKG1lbS0+bWVtX3R5cGUgIT0gVk1XX1BMX01PQikgeworCQlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsICpuOworCQlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OworCQlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciB2YWxfYnVmOworCisJCXZhbF9idWYuYm8gPSBibzsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuLCAmZG1hX2J1Zi0+cmVzX2xpc3QsIG1vYl9oZWFkKSB7CisKKwkJCWlmICh1bmxpa2VseShyZXMtPmZ1bmMtPnVuYmluZCA9PSBOVUxMKSkKKwkJCQljb250aW51ZTsKKworCQkJKHZvaWQpIHJlcy0+ZnVuYy0+dW5iaW5kKHJlcywgdHJ1ZSwgJnZhbF9idWYpOworCQkJcmVzLT5iYWNrdXBfZGlydHkgPSB0cnVlOworCQkJcmVzLT5yZXNfZGlydHkgPSBmYWxzZTsKKwkJCWxpc3RfZGVsX2luaXQoJnJlcy0+bW9iX2hlYWQpOworCQl9CisKKwkJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKKwkJKHZvaWQpIHR0bV9ib193YWl0KGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCX0KIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9zaGFkZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3NoYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2Q5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9zaGFkZXIuYwpAQCAtMCwwICsxLDgxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDktMjAxMiBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInZtd2dmeF9kcnYuaCIKKyNpbmNsdWRlICJ2bXdnZnhfcmVzb3VyY2VfcHJpdi5oIgorI2luY2x1ZGUgInR0bS90dG1fcGxhY2VtZW50LmgiCisKKyNkZWZpbmUgVk1XX0NPTVBBVF9TSEFERVJfSFRfT1JERVIgMTIKKworc3RydWN0IHZtd19zaGFkZXIgeworCXN0cnVjdCB2bXdfcmVzb3VyY2UgcmVzOworCVNWR0EzZFNoYWRlclR5cGUgdHlwZTsKKwl1aW50MzJfdCBzaXplOworfTsKKworc3RydWN0IHZtd191c2VyX3NoYWRlciB7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCBiYXNlOworCXN0cnVjdCB2bXdfc2hhZGVyIHNoYWRlcjsKK307CisKKy8qKgorICogZW51bSB2bXdfY29tcGF0X3NoYWRlcl9zdGF0ZSAtIFN0YWdpbmcgc3RhdGUgZm9yIGNvbXBhdCBzaGFkZXJzCisgKi8KK2VudW0gdm13X2NvbXBhdF9zaGFkZXJfc3RhdGUgeworCVZNV19DT01QQVRfQ09NTUlURUQsCisJVk1XX0NPTVBBVF9BREQsCisJVk1XX0NPTVBBVF9ERUwKK307CisKKy8qKgorICogc3RydWN0IHZtd19jb21wYXRfc2hhZGVyIC0gTWV0YWRhdGEgZm9yIGNvbXBhdCBzaGFkZXJzLgorICoKKyAqIEBoYW5kbGU6IFRoZSBUVE0gaGFuZGxlIG9mIHRoZSBndWVzdCBiYWNrZWQgc2hhZGVyLgorICogQHRmaWxlOiBUaGUgc3RydWN0IHR0bV9vYmplY3RfZmlsZSB0aGUgZ3Vlc3QgYmFja2VkIHNoYWRlciBpcyByZWdpc3RlcmVkCisgKiB3aXRoLgorICogQGhhc2g6IEhhc2ggaXRlbSBmb3IgbG9va3VwLgorICogQGhlYWQ6IExpc3QgaGVhZCBmb3Igc3RhZ2luZyBsaXN0cyBvciB0aGUgY29tcGF0IHNoYWRlciBtYW5hZ2VyIGxpc3QuCisgKiBAc3RhdGU6IFN0YWdpbmcgc3RhdGUuCisgKgorICogVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlIGNtZGJ1ZiBsb2NrLgorICovCitzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXIgeworCXUzMiBoYW5kbGU7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGU7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gaGFzaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJZW51bSB2bXdfY29tcGF0X3NoYWRlcl9zdGF0ZSBzdGF0ZTsKK307CisKKy8qKgorICogc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgLSBDb21wYXQgc2hhZGVyIG1hbmFnZXIuCisgKgorICogQHNoYWRlcnM6IEhhc2ggdGFibGUgY29udGFpbmluZyBzdGFnZWQgYW5kIGNvbW1pdGVkIGNvbXBhdCBzaGFkZXJzCisgKiBAbGlzdDogTGlzdCBvZiBjb21taXRlZCBzaGFkZXJzLgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICoKKyAqIEBzaGFkZXJzIGFuZCBAbGlzdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBjbWRidWYgbXV0ZXggZm9yIG5vdy4KKyAqLworc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgeworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIHNoYWRlcnM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXY7Cit9OworCitzdGF0aWMgdm9pZCB2bXdfdXNlcl9zaGFkZXJfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOworc3RhdGljIHN0cnVjdCB2bXdfcmVzb3VyY2UgKgordm13X3VzZXJfc2hhZGVyX2Jhc2VfdG9fcmVzKHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UpOworCitzdGF0aWMgaW50IHZtd19nYl9zaGFkZXJfY3JlYXRlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CitzdGF0aWMgaW50IHZtd19nYl9zaGFkZXJfYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkgICAgICAgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWYpOworc3RhdGljIGludCB2bXdfZ2Jfc2hhZGVyX3VuYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkJIGJvb2wgcmVhZGJhY2ssCisJCQkJIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICp2YWxfYnVmKTsKK3N0YXRpYyBpbnQgdm13X2diX3NoYWRlcl9kZXN0cm95KHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CisKK3N0YXRpYyB1aW50NjRfdCB2bXdfdXNlcl9zaGFkZXJfc2l6ZTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2bXdfdXNlcl9yZXNvdXJjZV9jb252IHVzZXJfc2hhZGVyX2NvbnYgPSB7CisJLm9iamVjdF90eXBlID0gVk1XX1JFU19TSEFERVIsCisJLmJhc2Vfb2JqX3RvX3JlcyA9IHZtd191c2VyX3NoYWRlcl9iYXNlX3RvX3JlcywKKwkucmVzX2ZyZWUgPSB2bXdfdXNlcl9zaGFkZXJfZnJlZQorfTsKKworY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYgKnVzZXJfc2hhZGVyX2NvbnZlcnRlciA9CisJJnVzZXJfc2hhZGVyX2NvbnY7CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2bXdfcmVzX2Z1bmMgdm13X2diX3NoYWRlcl9mdW5jID0geworCS5yZXNfdHlwZSA9IHZtd19yZXNfc2hhZGVyLAorCS5uZWVkc19iYWNrdXAgPSB0cnVlLAorCS5tYXlfZXZpY3QgPSB0cnVlLAorCS50eXBlX25hbWUgPSAiZ3Vlc3QgYmFja2VkIHNoYWRlcnMiLAorCS5iYWNrdXBfcGxhY2VtZW50ID0gJnZtd19tb2JfcGxhY2VtZW50LAorCS5jcmVhdGUgPSB2bXdfZ2Jfc2hhZGVyX2NyZWF0ZSwKKwkuZGVzdHJveSA9IHZtd19nYl9zaGFkZXJfZGVzdHJveSwKKwkuYmluZCA9IHZtd19nYl9zaGFkZXJfYmluZCwKKwkudW5iaW5kID0gdm13X2diX3NoYWRlcl91bmJpbmQKK307CisKKy8qKgorICogU2hhZGVyIG1hbmFnZW1lbnQ6CisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm13X3NoYWRlciAqCit2bXdfcmVzX3RvX3NoYWRlcihzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfc2hhZGVyLCByZXMpOworfQorCitzdGF0aWMgdm9pZCB2bXdfaHdfc2hhZGVyX2Rlc3Ryb3koc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQoreworCSh2b2lkKSB2bXdfZ2Jfc2hhZGVyX2Rlc3Ryb3kocmVzKTsKK30KKworc3RhdGljIGludCB2bXdfZ2Jfc2hhZGVyX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywKKwkJCSAgICAgIHVpbnQzMl90IHNpemUsCisJCQkgICAgICB1aW50NjRfdCBvZmZzZXQsCisJCQkgICAgICBTVkdBM2RTaGFkZXJUeXBlIHR5cGUsCisJCQkgICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ5dGVfY29kZSwKKwkJCSAgICAgIHZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykpCit7CisJc3RydWN0IHZtd19zaGFkZXIgKnNoYWRlciA9IHZtd19yZXNfdG9fc2hhZGVyKHJlcyk7CisJaW50IHJldDsKKworCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsIHRydWUsCisJCQkJcmVzX2ZyZWUsICZ2bXdfZ2Jfc2hhZGVyX2Z1bmMpOworCisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWlmIChyZXNfZnJlZSkKKwkJCXJlc19mcmVlKHJlcyk7CisJCWVsc2UKKwkJCWtmcmVlKHJlcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVzLT5iYWNrdXBfc2l6ZSA9IHNpemU7CisJaWYgKGJ5dGVfY29kZSkgeworCQlyZXMtPmJhY2t1cCA9IHZtd19kbWFidWZfcmVmZXJlbmNlKGJ5dGVfY29kZSk7CisJCXJlcy0+YmFja3VwX29mZnNldCA9IG9mZnNldDsKKwl9CisJc2hhZGVyLT5zaXplID0gc2l6ZTsKKwlzaGFkZXItPnR5cGUgPSB0eXBlOworCisJdm13X3Jlc291cmNlX2FjdGl2YXRlKHJlcywgdm13X2h3X3NoYWRlcl9kZXN0cm95KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXdfZ2Jfc2hhZGVyX2NyZWF0ZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHJlcy0+ZGV2X3ByaXY7CisJc3RydWN0IHZtd19zaGFkZXIgKnNoYWRlciA9IHZtd19yZXNfdG9fc2hhZGVyKHJlcyk7CisJaW50IHJldDsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWREZWZpbmVHQlNoYWRlciBib2R5OworCX0gKmNtZDsKKworCWlmIChsaWtlbHkocmVzLT5pZCAhPSAtMSkpCisJCXJldHVybiAwOworCisJcmV0ID0gdm13X3Jlc291cmNlX2FsbG9jX2lkKHJlcyk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIHNoYWRlciBpZC5cbiIpOworCQlnb3RvIG91dF9ub19pZDsKKwl9CisKKwlpZiAodW5saWtlbHkocmVzLT5pZCA+PSBWTVdHRlhfTlVNX0dCX1NIQURFUikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9ub19maWZvOworCX0KKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc2hhZGVyICIKKwkJCSAgImNyZWF0aW9uLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX2ZpZm87CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9ERUZJTkVfR0JfU0hBREVSOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuc2hpZCA9IHJlcy0+aWQ7CisJY21kLT5ib2R5LnR5cGUgPSBzaGFkZXItPnR5cGU7CisJY21kLT5ib2R5LnNpemVJbkJ5dGVzID0gc2hhZGVyLT5zaXplOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOworCisJcmV0dXJuIDA7CisKK291dF9ub19maWZvOgorCXZtd19yZXNvdXJjZV9yZWxlYXNlX2lkKHJlcyk7CitvdXRfbm9faWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bXdfZ2Jfc2hhZGVyX2JpbmQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJICAgICAgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWYpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHJlcy0+ZGV2X3ByaXY7CisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kQmluZEdCU2hhZGVyIGJvZHk7CisJfSAqY21kOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSB2YWxfYnVmLT5ibzsKKworCUJVR19PTihiby0+bWVtLm1lbV90eXBlICE9IFZNV19QTF9NT0IpOworCisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzaGFkZXIgIgorCQkJICAiYmluZGluZy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX0JJTkRfR0JfU0hBREVSOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuc2hpZCA9IHJlcy0+aWQ7CisJY21kLT5ib2R5Lm1vYmlkID0gYm8tPm1lbS5zdGFydDsKKwljbWQtPmJvZHkub2Zmc2V0SW5CeXRlcyA9IDA7CisJcmVzLT5iYWNrdXBfZGlydHkgPSBmYWxzZTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXdfZ2Jfc2hhZGVyX3VuYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkJYm9vbCByZWFkYmFjaywKKwkJCQlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1ZikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRCaW5kR0JTaGFkZXIgYm9keTsKKwl9ICpjbWQ7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCisJQlVHX09OKHJlcy0+YmFja3VwLT5iYXNlLm1lbS5tZW1fdHlwZSAhPSBWTVdfUExfTU9CKTsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc2hhZGVyICIKKwkJCSAgInVuYmluZGluZy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX0JJTkRfR0JfU0hBREVSOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuc2hpZCA9IHJlcy0+aWQ7CisJY21kLT5ib2R5Lm1vYmlkID0gU1ZHQTNEX0lOVkFMSURfSUQ7CisJY21kLT5ib2R5Lm9mZnNldEluQnl0ZXMgPSAwOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKworCS8qCisJICogQ3JlYXRlIGEgZmVuY2Ugb2JqZWN0IGFuZCBmZW5jZSB0aGUgYmFja3VwIGJ1ZmZlci4KKwkgKi8KKworCSh2b2lkKSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhOVUxMLCBkZXZfcHJpdiwKKwkJCQkJICAmZmVuY2UsIE5VTEwpOworCisJdm13X2ZlbmNlX3NpbmdsZV9ibyh2YWxfYnVmLT5ibywgZmVuY2UpOworCisJaWYgKGxpa2VseShmZW5jZSAhPSBOVUxMKSkKKwkJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm13X2diX3NoYWRlcl9kZXN0cm95KHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWREZXN0cm95R0JTaGFkZXIgYm9keTsKKwl9ICpjbWQ7CisKKwlpZiAobGlrZWx5KHJlcy0+aWQgPT0gLTEpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwl2bXdfY29udGV4dF9iaW5kaW5nX3Jlc19saXN0X3NjcnViKCZyZXMtPmJpbmRpbmdfaGVhZCk7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIHNoYWRlciAiCisJCQkgICJkZXN0cnVjdGlvbi5cbiIpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX1NIQURFUjsKKwljbWQtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZC0+Ym9keSk7CisJY21kLT5ib2R5LnNoaWQgPSByZXMtPmlkOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwl2bXdfcmVzb3VyY2VfcmVsZWFzZV9pZChyZXMpOworCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFVzZXItc3BhY2Ugc2hhZGVyIG1hbmFnZW1lbnQ6CisgKi8KKworc3RhdGljIHN0cnVjdCB2bXdfcmVzb3VyY2UgKgordm13X3VzZXJfc2hhZGVyX2Jhc2VfdG9fcmVzKHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UpCit7CisJcmV0dXJuICYoY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCB2bXdfdXNlcl9zaGFkZXIsIGJhc2UpLT4KKwkJIHNoYWRlci5yZXMpOworfQorCitzdGF0aWMgdm9pZCB2bXdfdXNlcl9zaGFkZXJfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd191c2VyX3NoYWRlciAqdXNoYWRlciA9CisJCWNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9zaGFkZXIsIHNoYWRlci5yZXMpOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCisJdHRtX2Jhc2Vfb2JqZWN0X2tmcmVlKHVzaGFkZXIsIGJhc2UpOworCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGRldl9wcml2KSwKKwkJCSAgICB2bXdfdXNlcl9zaGFkZXJfc2l6ZSk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB1c2VyIHNwYWNlIGhhcyBubyBtb3JlIHJlZmVyZW5jZXMgb24gdGhlCisgKiBiYXNlIG9iamVjdC4gSXQgcmVsZWFzZXMgdGhlIGJhc2Utb2JqZWN0J3MgcmVmZXJlbmNlIG9uIHRoZSByZXNvdXJjZSBvYmplY3QuCisgKi8KKworc3RhdGljIHZvaWQgdm13X3VzZXJfc2hhZGVyX2Jhc2VfcmVsZWFzZShzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoqcF9iYXNlKQoreworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UgPSAqcF9iYXNlOworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9IHZtd191c2VyX3NoYWRlcl9iYXNlX3RvX3JlcyhiYXNlKTsKKworCSpwX2Jhc2UgPSBOVUxMOworCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKK30KKworaW50IHZtd19zaGFkZXJfZGVzdHJveV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV92bXdfc2hhZGVyX2FyZyAqYXJnID0gKHN0cnVjdCBkcm1fdm13X3NoYWRlcl9hcmcgKilkYXRhOworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOworCisJcmV0dXJuIHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodGZpbGUsIGFyZy0+aGFuZGxlLAorCQkJCQkgVFRNX1JFRl9VU0FHRSk7Cit9CisKK2ludCB2bXdfc2hhZGVyX2FsbG9jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWZmZXIsCisJCSAgICAgc2l6ZV90IHNoYWRlcl9zaXplLAorCQkgICAgIHNpemVfdCBvZmZzZXQsCisJCSAgICAgU1ZHQTNkU2hhZGVyVHlwZSBzaGFkZXJfdHlwZSwKKwkJICAgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJICAgICB1MzIgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgdm13X3VzZXJfc2hhZGVyICp1c2hhZGVyOworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywgKnRtcDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBBcHByb3hpbWF0ZSBpZHIgbWVtb3J5IHVzYWdlIHdpdGggMTI4IGJ5dGVzLiBJdCB3aWxsIGJlIGxpbWl0ZWQKKwkgKiBieSBtYXhpbXVtIG51bWJlcl9vZiBzaGFkZXJzIGFueXdheS4KKwkgKi8KKwlpZiAodW5saWtlbHkodm13X3VzZXJfc2hhZGVyX3NpemUgPT0gMCkpCisJCXZtd191c2VyX3NoYWRlcl9zaXplID0KKwkJCXR0bV9yb3VuZF9wb3Qoc2l6ZW9mKHN0cnVjdCB2bXdfdXNlcl9zaGFkZXIpKSArIDEyODsKKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkJICAgdm13X3VzZXJfc2hhZGVyX3NpemUsCisJCQkJICAgZmFsc2UsIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIk91dCBvZiBncmFwaGljcyBtZW1vcnkgZm9yIHNoYWRlciAiCisJCQkJICAiY3JlYXRpb24uXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdXNoYWRlciA9IGt6YWxsb2Moc2l6ZW9mKCp1c2hhZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHVzaGFkZXIgPT0gTlVMTCkpIHsKKwkJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJCSAgICB2bXdfdXNlcl9zaGFkZXJfc2l6ZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJlcyA9ICZ1c2hhZGVyLT5zaGFkZXIucmVzOworCXVzaGFkZXItPmJhc2Uuc2hhcmVhYmxlID0gZmFsc2U7CisJdXNoYWRlci0+YmFzZS50ZmlsZSA9IE5VTEw7CisKKwkvKgorCSAqIEZyb20gaGVyZSBvbiwgdGhlIGRlc3RydWN0b3IgdGFrZXMgb3ZlciByZXNvdXJjZSBmcmVlaW5nLgorCSAqLworCisJcmV0ID0gdm13X2diX3NoYWRlcl9pbml0KGRldl9wcml2LCByZXMsIHNoYWRlcl9zaXplLAorCQkJCSBvZmZzZXQsIHNoYWRlcl90eXBlLCBidWZmZXIsCisJCQkJIHZtd191c2VyX3NoYWRlcl9mcmVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dDsKKworCXRtcCA9IHZtd19yZXNvdXJjZV9yZWZlcmVuY2UocmVzKTsKKwlyZXQgPSB0dG1fYmFzZV9vYmplY3RfaW5pdCh0ZmlsZSwgJnVzaGFkZXItPmJhc2UsIGZhbHNlLAorCQkJCSAgIFZNV19SRVNfU0hBREVSLAorCQkJCSAgICZ2bXdfdXNlcl9zaGFkZXJfYmFzZV9yZWxlYXNlLCBOVUxMKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZ0bXApOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKGhhbmRsZSkKKwkJKmhhbmRsZSA9IHVzaGFkZXItPmJhc2UuaGFzaC5rZXk7CitvdXRfZXJyOgorCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCB2bXdfc2hhZGVyX2RlZmluZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfY3JlYXRlX2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X3NoYWRlcl9jcmVhdGVfYXJnICopZGF0YTsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOworCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmZmVyID0gTlVMTDsKKwlTVkdBM2RTaGFkZXJUeXBlIHNoYWRlcl90eXBlOworCWludCByZXQ7CisKKwlpZiAoYXJnLT5idWZmZXJfaGFuZGxlICE9IFNWR0EzRF9JTlZBTElEX0lEKSB7CisJCXJldCA9IHZtd191c2VyX2RtYWJ1Zl9sb29rdXAodGZpbGUsIGFyZy0+YnVmZmVyX2hhbmRsZSwKKwkJCQkJICAgICAmYnVmZmVyKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJRFJNX0VSUk9SKCJDb3VsZCBub3QgZmluZCBidWZmZXIgZm9yIHNoYWRlciAiCisJCQkJICAiY3JlYXRpb24uXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoKHU2NClidWZmZXItPmJhc2UubnVtX3BhZ2VzICogUEFHRV9TSVpFIDwKKwkJICAgICh1NjQpYXJnLT5zaXplICsgKHU2NClhcmctPm9mZnNldCkgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIGJ1ZmZlci0gb3Igc2hhZGVyIHNpemUuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9iYWRfYXJnOworCQl9CisJfQorCisJc3dpdGNoIChhcmctPnNoYWRlcl90eXBlKSB7CisJY2FzZSBkcm1fdm13X3NoYWRlcl90eXBlX3ZzOgorCQlzaGFkZXJfdHlwZSA9IFNWR0EzRF9TSEFERVJUWVBFX1ZTOworCQlicmVhazsKKwljYXNlIGRybV92bXdfc2hhZGVyX3R5cGVfcHM6CisJCXNoYWRlcl90eXBlID0gU1ZHQTNEX1NIQURFUlRZUEVfUFM7CisJCWJyZWFrOworCWNhc2UgZHJtX3Ztd19zaGFkZXJfdHlwZV9nczoKKwkJc2hhZGVyX3R5cGUgPSBTVkdBM0RfU0hBREVSVFlQRV9HUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIHNoYWRlciB0eXBlLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2JhZF9hcmc7CisJfQorCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfYmFkX2FyZzsKKworCXJldCA9IHZtd19zaGFkZXJfYWxsb2MoZGV2X3ByaXYsIGJ1ZmZlciwgYXJnLT5zaXplLCBhcmctPm9mZnNldCwKKwkJCSAgICAgICBzaGFkZXJfdHlwZSwgdGZpbGUsICZhcmctPnNoYWRlcl9oYW5kbGUpOworCisJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKK291dF9iYWRfYXJnOgorCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJmJ1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2bXdfY29tcGF0X3NoYWRlcl9sb29rdXAgLSBMb29rIHVwIGEgY29tcGF0IHNoYWRlcgorICoKKyAqIEBtYW46IFBvaW50ZXIgdG8gdGhlIGNvbXBhdCBzaGFkZXIgbWFuYWdlci4KKyAqIEBzaGFkZXJfdHlwZTogVGhlIHNoYWRlciB0eXBlLCB0aGF0IGNvbWJpbmVkIHdpdGggdGhlIHVzZXJfa2V5IGlkZW50aWZpZXMKKyAqIHRoZSBzaGFkZXIuCisgKiBAdXNlcl9rZXk6IE9uIGVudHJ5LCB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gdGhlIHVzZXJfa2V5LgorICogT24gc3VjY2Vzc2Z1bCBleGl0LCBpdCB3aWxsIGNvbnRhaW4gdGhlIGd1ZXN0LWJhY2tlZCBzaGFkZXIncyBUVE0gaGFuZGxlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBmYWlsdXJlLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwb2ludGVkCisgKiB0byBieSBAdXNlcl9rZXkgaXMgdW5tb2RpZmllZC4KKyAqLworaW50IHZtd19jb21wYXRfc2hhZGVyX2xvb2t1cChzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuLAorCQkJICAgICBTVkdBM2RTaGFkZXJUeXBlIHNoYWRlcl90eXBlLAorCQkJICAgICB1MzIgKnVzZXJfa2V5KQoreworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBrZXkgPSAqdXNlcl9rZXkgfCAoc2hhZGVyX3R5cGUgPDwgMjQpOworCisJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbSgmbWFuLT5zaGFkZXJzLCBrZXksICZoYXNoKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJKnVzZXJfa2V5ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IHZtd19jb21wYXRfc2hhZGVyLAorCQkJCSAgIGhhc2gpLT5oYW5kbGU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY29tcGF0X3NoYWRlcl9mcmVlIC0gRnJlZSBhIGNvbXBhdCBzaGFkZXIuCisgKgorICogQG1hbjogUG9pbnRlciB0byB0aGUgY29tcGF0IHNoYWRlciBtYW5hZ2VyLgorICogQGVudHJ5OiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19jb21wYXRfc2hhZGVyLgorICoKKyAqIEZyZWVzIGEgc3RydWN0IHZtd19jb21wYXRfc2hkZXIgZW50cnkgYW5kIGRyb3BzIGl0cyByZWZlcmVuY2UgdG8gdGhlCisgKiBndWVzdCBiYWNrZWQgc2hhZGVyLgorICovCitzdGF0aWMgdm9pZCB2bXdfY29tcGF0X3NoYWRlcl9mcmVlKHN0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICptYW4sCisJCQkJICAgc3RydWN0IHZtd19jb21wYXRfc2hhZGVyICplbnRyeSkKK3sKKwlsaXN0X2RlbCgmZW50cnktPmhlYWQpOworCVdBUk5fT04oZHJtX2h0X3JlbW92ZV9pdGVtKCZtYW4tPnNoYWRlcnMsICZlbnRyeS0+aGFzaCkpOworCVdBUk5fT04odHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZihlbnRyeS0+dGZpbGUsIGVudHJ5LT5oYW5kbGUsCisJCQkJCSAgVFRNX1JFRl9VU0FHRSkpOworCWtmcmVlKGVudHJ5KTsKK30KKworLyoqCisgKiB2bXdfY29tcGF0X3NoYWRlcnNfY29tbWl0IC0gQ29tbWl0IGEgbGlzdCBvZiBjb21wYXQgc2hhZGVyIGFjdGlvbnMuCisgKgorICogQG1hbjogUG9pbnRlciB0byB0aGUgY29tcGF0IHNoYWRlciBtYW5hZ2VyLgorICogQGxpc3Q6IENhbGxlcidzIGxpc3Qgb2YgY29tcGF0IHNoYWRlciBhY3Rpb25zLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29tbWl0cyBhIGxpc3Qgb2YgY29tcGF0IHNoYWRlciBhZGRpdGlvbnMgb3IgcmVtb3ZhbHMuCisgKiBJdCBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gdGhlIGV4ZWNidWYgaW9jdGwgY2FsbCB0cmlnZ2VyaW5nIHRoZXNlCisgKiBhY3Rpb25zIGhhcyBjb21taXRlZCB0aGUgZmlmbyBjb250ZW50cyB0byB0aGUgZGV2aWNlLgorICovCit2b2lkIHZtd19jb21wYXRfc2hhZGVyc19jb21taXQoc3RydWN0IHZtd19jb21wYXRfc2hhZGVyX21hbmFnZXIgKm1hbiwKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCB2bXdfY29tcGF0X3NoYWRlciAqZW50cnksICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCBsaXN0LCBoZWFkKSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CisJCXN3aXRjaCAoZW50cnktPnN0YXRlKSB7CisJCWNhc2UgVk1XX0NPTVBBVF9BREQ6CisJCQllbnRyeS0+c3RhdGUgPSBWTVdfQ09NUEFUX0NPTU1JVEVEOworCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmhlYWQsICZtYW4tPmxpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgVk1XX0NPTVBBVF9ERUw6CisJCQl0dG1fcmVmX29iamVjdF9iYXNlX3VucmVmKGVudHJ5LT50ZmlsZSwgZW50cnktPmhhbmRsZSwKKwkJCQkJCSAgVFRNX1JFRl9VU0FHRSk7CisJCQlrZnJlZShlbnRyeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICogdm13X2NvbXBhdF9zaGFkZXJzX3JldmVydCAtIFJldmVydCBhIGxpc3Qgb2YgY29tcGF0IHNoYWRlciBhY3Rpb25zCisgKgorICogQG1hbjogUG9pbnRlciB0byB0aGUgY29tcGF0IHNoYWRlciBtYW5hZ2VyLgorICogQGxpc3Q6IENhbGxlcidzIGxpc3Qgb2YgY29tcGF0IHNoYWRlciBhY3Rpb25zLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV2ZXJ0cyBhIGxpc3Qgb2YgY29tcGF0IHNoYWRlciBhZGRpdGlvbnMgb3IgcmVtb3ZhbHMuCisgKiBJdCBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gdGhlIGV4ZWNidWYgaW9jdGwgY2FsbCB0cmlnZ2VyaW5nIHRoZXNlCisgKiBhY3Rpb25zIGZhaWxlZCBmb3Igc29tZSByZWFzb24sIGFuZCB0aGUgY29tbWFuZCBzdHJlYW0gd2FzIG5ldmVyCisgKiBzdWJtaXR0ZWQuCisgKi8KK3ZvaWQgdm13X2NvbXBhdF9zaGFkZXJzX3JldmVydChzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuLAorCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHZtd19jb21wYXRfc2hhZGVyICplbnRyeSwgKm5leHQ7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgbGlzdCwgaGVhZCkgeworCQlzd2l0Y2ggKGVudHJ5LT5zdGF0ZSkgeworCQljYXNlIFZNV19DT01QQVRfQUREOgorCQkJdm13X2NvbXBhdF9zaGFkZXJfZnJlZShtYW4sIGVudHJ5KTsKKwkJCWJyZWFrOworCQljYXNlIFZNV19DT01QQVRfREVMOgorCQkJcmV0ID0gZHJtX2h0X2luc2VydF9pdGVtKCZtYW4tPnNoYWRlcnMsICZlbnRyeS0+aGFzaCk7CisJCQlsaXN0X2RlbCgmZW50cnktPmhlYWQpOworCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmhlYWQsICZtYW4tPmxpc3QpOworCQkJZW50cnktPnN0YXRlID0gVk1XX0NPTVBBVF9DT01NSVRFRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiB2bXdfY29tcGF0X3NoYWRlcl9yZW1vdmUgLSBTdGFnZSBhIGNvbXBhdCBzaGFkZXIgZm9yIHJlbW92YWwuCisgKgorICogQG1hbjogUG9pbnRlciB0byB0aGUgY29tcGF0IHNoYWRlciBtYW5hZ2VyCisgKiBAdXNlcl9rZXk6IFRoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzaGFkZXIuIFRoZSBrZXkgaXMKKyAqIHVuaXF1ZSB0byB0aGUgc2hhZGVyIHR5cGUuCisgKiBAc2hhZGVyX3R5cGU6IFNoYWRlciB0eXBlLgorICogQGxpc3Q6IENhbGxlcidzIGxpc3Qgb2Ygc3RhZ2VkIHNoYWRlciBhY3Rpb25zLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhZ2VzIGEgY29tcGF0IHNoYWRlciBmb3IgcmVtb3ZhbCBhbmQgcmVtb3ZlcyB0aGUga2V5IGZyb20KKyAqIHRoZSBzaGFkZXIgbWFuYWdlcidzIGhhc2ggdGFibGUuIElmIHRoZSBzaGFkZXIgd2FzIHByZXZpb3VzbHkgb25seSBzdGFnZWQKKyAqIGZvciBhZGRpdGlvbiBpdCBpcyBjb21wbGV0ZWx5IHJlbW92ZWQgKEJ1dCB0aGUgZXhlY2J1ZiBjb2RlIG1heSBrZWVwIGEKKyAqIHJlZmVyZW5jZSBpZiBpdCB3YXMgYm91bmQgdG8gYSBjb250ZXh0IGJldHdlZW4gYWRkaXRpb24gYW5kIHJlbW92YWwpLiBJZgorICogaXQgd2FzIHByZXZpb3VzbHkgY29tbWl0ZWQgdG8gdGhlIG1hbmFnZXIsIGl0IGlzIHN0YWdlZCBmb3IgcmVtb3ZhbC4KKyAqLworaW50IHZtd19jb21wYXRfc2hhZGVyX3JlbW92ZShzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuLAorCQkJICAgICB1MzIgdXNlcl9rZXksIFNWR0EzZFNoYWRlclR5cGUgc2hhZGVyX3R5cGUsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHZtd19jb21wYXRfc2hhZGVyICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbSgmbWFuLT5zaGFkZXJzLCB1c2VyX2tleSB8IChzaGFkZXJfdHlwZSA8PCAyNCksCisJCQkgICAgICAgJmhhc2gpOworCWlmIChsaWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVudHJ5ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IHZtd19jb21wYXRfc2hhZGVyLCBoYXNoKTsKKworCXN3aXRjaCAoZW50cnktPnN0YXRlKSB7CisJY2FzZSBWTVdfQ09NUEFUX0FERDoKKwkJdm13X2NvbXBhdF9zaGFkZXJfZnJlZShtYW4sIGVudHJ5KTsKKwkJYnJlYWs7CisJY2FzZSBWTVdfQ09NUEFUX0NPTU1JVEVEOgorCQkodm9pZCkgZHJtX2h0X3JlbW92ZV9pdGVtKCZtYW4tPnNoYWRlcnMsICZlbnRyeS0+aGFzaCk7CisJCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CisJCWVudHJ5LT5zdGF0ZSA9IFZNV19DT01QQVRfREVMOworCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+aGVhZCwgbGlzdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfY29tcGF0X3NoYWRlcl9hZGQgLSBDcmVhdGUgYSBjb21wYXQgc2hhZGVyIGFuZCBhZGQgdGhlCisgKiBrZXkgdG8gdGhlIG1hbmFnZXIKKyAqCisgKiBAbWFuOiBQb2ludGVyIHRvIHRoZSBjb21wYXQgc2hhZGVyIG1hbmFnZXIKKyAqIEB1c2VyX2tleTogVGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHNoYWRlci4gVGhlIGtleSBpcworICogdW5pcXVlIHRvIHRoZSBzaGFkZXIgdHlwZS4KKyAqIEBieXRlY29kZTogUG9pbnRlciB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIHNoYWRlci4KKyAqIEBzaGFkZXJfdHlwZTogU2hhZGVyIHR5cGUuCisgKiBAdGZpbGU6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX29iamVjdF9maWxlIHRoYXQgdGhlIGd1ZXN0LWJhY2tlZCBzaGFkZXIgaXMKKyAqIHRvIGJlIGNyZWF0ZWQgd2l0aC4KKyAqIEBsaXN0OiBDYWxsZXIncyBsaXN0IG9mIHN0YWdlZCBzaGFkZXIgYWN0aW9ucy4KKyAqCisgKiBOb3RlIHRoYXQgb25seSB0aGUga2V5IGlzIGFkZGVkIHRvIHRoZSBzaGFkZXIgbWFuYWdlcidzIGhhc2ggdGFibGUuCisgKiBUaGUgc2hhZGVyIGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHNoYWRlciBtYW5hZ2VyJ3MgbGlzdCBvZiBzaGFkZXJzLgorICovCitpbnQgdm13X2NvbXBhdF9zaGFkZXJfYWRkKHN0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICptYW4sCisJCQkgIHUzMiB1c2VyX2tleSwgY29uc3Qgdm9pZCAqYnl0ZWNvZGUsCisJCQkgIFNWR0EzZFNoYWRlclR5cGUgc2hhZGVyX3R5cGUsCisJCQkgIHNpemVfdCBzaXplLAorCQkJICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJCSAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqIG1hcDsKKwlib29sIGlzX2lvbWVtOworCXN0cnVjdCB2bXdfY29tcGF0X3NoYWRlciAqY29tcGF0OworCXUzMiBoYW5kbGU7CisJaW50IHJldDsKKworCWlmICh1c2VyX2tleSA+ICgoMSA8PCAyNCkgLSAxKSB8fCAodW5zaWduZWQpIHNoYWRlcl90eXBlID4gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2NhdGUgYW5kIHBpbiBhIERNQSBidWZmZXIgKi8KKwlidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGJ1ZiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSB2bXdfZG1hYnVmX2luaXQobWFuLT5kZXZfcHJpdiwgYnVmLCBzaXplLCAmdm13X3N5c19uZV9wbGFjZW1lbnQsCisJCQkgICAgICB0cnVlLCB2bXdfZG1hYnVmX2JvX2ZyZWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJmJ1Zi0+YmFzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG5vX3Jlc2VydmU7CisKKwkvKiBNYXAgYW5kIGNvcHkgc2hhZGVyIGJ5dGVjb2RlLiAqLworCXJldCA9IHR0bV9ib19rbWFwKCZidWYtPmJhc2UsIDAsIFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCwKKwkJCSAgJm1hcCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQl0dG1fYm9fdW5yZXNlcnZlKCZidWYtPmJhc2UpOworCQlnb3RvIG5vX3Jlc2VydmU7CisJfQorCisJbWVtY3B5KHR0bV9rbWFwX29ial92aXJ0dWFsKCZtYXAsICZpc19pb21lbSksIGJ5dGVjb2RlLCBzaXplKTsKKwlXQVJOX09OKGlzX2lvbWVtKTsKKworCXR0bV9ib19rdW5tYXAoJm1hcCk7CisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKCZidWYtPmJhc2UsICZ2bXdfc3lzX3BsYWNlbWVudCwgZmFsc2UsIHRydWUpOworCVdBUk5fT04ocmV0ICE9IDApOworCXR0bV9ib191bnJlc2VydmUoJmJ1Zi0+YmFzZSk7CisKKwkvKiBDcmVhdGUgYSBndWVzdC1iYWNrZWQgc2hhZGVyIGNvbnRhaW5lciBiYWNrZWQgYnkgdGhlIGRtYSBidWZmZXIgKi8KKwlyZXQgPSB2bXdfc2hhZGVyX2FsbG9jKG1hbi0+ZGV2X3ByaXYsIGJ1Ziwgc2l6ZSwgMCwgc2hhZGVyX3R5cGUsCisJCQkgICAgICAgdGZpbGUsICZoYW5kbGUpOworCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJmJ1Zik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBub19yZXNlcnZlOworCS8qCisJICogQ3JlYXRlIGEgY29tcGF0IHNoYWRlciBzdHJ1Y3R1cmUgYW5kIHN0YWdlIGl0IGZvciBpbnNlcnRpb24KKwkgKiBpbiB0aGUgbWFuYWdlcgorCSAqLworCWNvbXBhdCA9IGt6YWxsb2Moc2l6ZW9mKCpjb21wYXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29tcGF0ID09IE5VTEwpCisJCWdvdG8gbm9fY29tcGF0OworCisJY29tcGF0LT5oYXNoLmtleSA9IHVzZXJfa2V5IHwgIChzaGFkZXJfdHlwZSA8PCAyNCk7CisJcmV0ID0gZHJtX2h0X2luc2VydF9pdGVtKCZtYW4tPnNoYWRlcnMsICZjb21wYXQtPmhhc2gpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X2ludmFsaWRfa2V5OworCisJY29tcGF0LT5zdGF0ZSA9IFZNV19DT01QQVRfQUREOworCWNvbXBhdC0+aGFuZGxlID0gaGFuZGxlOworCWNvbXBhdC0+dGZpbGUgPSB0ZmlsZTsKKwlsaXN0X2FkZF90YWlsKCZjb21wYXQtPmhlYWQsIGxpc3QpOworCisJcmV0dXJuIDA7CisKK291dF9pbnZhbGlkX2tleToKKwlrZnJlZShjb21wYXQpOworbm9fY29tcGF0OgorCXR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodGZpbGUsIGhhbmRsZSwgVFRNX1JFRl9VU0FHRSk7Citub19yZXNlcnZlOgorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X2NvbXBhdF9zaGFkZXJfbWFuX2NyZWF0ZSAtIENyZWF0ZSBhIGNvbXBhdCBzaGFkZXIgbWFuYWdlcgorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqCisgKiBUeXBpY2FsbHkgZG9uZSBhdCBmaWxlIG9wZW4gdGltZS4gSWYgc3VjY2Vzc2Z1bCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgKiBjb21wYXQgc2hhZGVyIG1hbmFnZXIuIE90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIuCisgKi8KK3N0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICoKK3Ztd19jb21wYXRfc2hhZGVyX21hbl9jcmVhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3Qgdm13X2NvbXBhdF9zaGFkZXJfbWFuYWdlciAqbWFuOworCWludCByZXQ7CisKKwltYW4gPSBremFsbG9jKHNpemVvZigqbWFuKSwgR0ZQX0tFUk5FTCk7CisKKwltYW4tPmRldl9wcml2ID0gZGV2X3ByaXY7CisJSU5JVF9MSVNUX0hFQUQoJm1hbi0+bGlzdCk7CisJcmV0ID0gZHJtX2h0X2NyZWF0ZSgmbWFuLT5zaGFkZXJzLCBWTVdfQ09NUEFUX1NIQURFUl9IVF9PUkRFUik7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gbWFuOworCisJa2ZyZWUobWFuKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKioKKyAqIHZtd19jb21wYXRfc2hhZGVyX21hbl9kZXN0cm95IC0gRGVzdHJveSBhIGNvbXBhdCBzaGFkZXIgbWFuYWdlcgorICoKKyAqIEBtYW46IFBvaW50ZXIgdG8gdGhlIHNoYWRlciBtYW5hZ2VyIHRvIGRlc3Ryb3kuCisgKgorICogVHlwaWNhbGx5IGRvbmUgYXQgZmlsZSBjbG9zZSB0aW1lLgorICovCit2b2lkIHZtd19jb21wYXRfc2hhZGVyX21hbl9kZXN0cm95KHN0cnVjdCB2bXdfY29tcGF0X3NoYWRlcl9tYW5hZ2VyICptYW4pCit7CisJc3RydWN0IHZtd19jb21wYXRfc2hhZGVyICplbnRyeSwgKm5leHQ7CisKKwltdXRleF9sb2NrKCZtYW4tPmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJm1hbi0+bGlzdCwgaGVhZCkKKwkJdm13X2NvbXBhdF9zaGFkZXJfZnJlZShtYW4sIGVudHJ5KTsKKworCW11dGV4X3VubG9jaygmbWFuLT5kZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwlrZnJlZShtYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfc3VyZmFjZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfc3VyZmFjZS5jCmluZGV4IDdkZTJlYTguLjgyNDY4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3N1cmZhY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9zdXJmYWNlLmMKQEAgLTQxLDcgKzQxLDYgQEAKIAlzdHJ1Y3QgdHRtX3ByaW1lX29iamVjdCBwcmltZTsKIAlzdHJ1Y3Qgdm13X3N1cmZhY2Ugc3JmOwogCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgYmFja3VwX2hhbmRsZTsKIH07CiAKIC8qKgpAQCAtNjgsNiArNjcsMTQgQEAKIAkJCQkgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWYpOwogc3RhdGljIGludCB2bXdfbGVnYWN5X3NyZl9jcmVhdGUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKIHN0YXRpYyBpbnQgdm13X2xlZ2FjeV9zcmZfZGVzdHJveShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOworc3RhdGljIGludCB2bXdfZ2Jfc3VyZmFjZV9jcmVhdGUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKK3N0YXRpYyBpbnQgdm13X2diX3N1cmZhY2VfYmluZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkgICAgICAgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWYpOworc3RhdGljIGludCB2bXdfZ2Jfc3VyZmFjZV91bmJpbmQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJCSBib29sIHJlYWRiYWNrLAorCQkJCSBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1Zik7CitzdGF0aWMgaW50IHZtd19nYl9zdXJmYWNlX2Rlc3Ryb3koc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKKwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtd191c2VyX3Jlc291cmNlX2NvbnYgdXNlcl9zdXJmYWNlX2NvbnYgPSB7CiAJLm9iamVjdF90eXBlID0gVk1XX1JFU19TVVJGQUNFLApAQCAtOTMsNiArMTAwLDE4IEBACiAJLnVuYmluZCA9ICZ2bXdfbGVnYWN5X3NyZl91bmJpbmQKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm13X3Jlc19mdW5jIHZtd19nYl9zdXJmYWNlX2Z1bmMgPSB7CisJLnJlc190eXBlID0gdm13X3Jlc19zdXJmYWNlLAorCS5uZWVkc19iYWNrdXAgPSB0cnVlLAorCS5tYXlfZXZpY3QgPSB0cnVlLAorCS50eXBlX25hbWUgPSAiZ3Vlc3QgYmFja2VkIHN1cmZhY2VzIiwKKwkuYmFja3VwX3BsYWNlbWVudCA9ICZ2bXdfbW9iX3BsYWNlbWVudCwKKwkuY3JlYXRlID0gdm13X2diX3N1cmZhY2VfY3JlYXRlLAorCS5kZXN0cm95ID0gdm13X2diX3N1cmZhY2VfZGVzdHJveSwKKwkuYmluZCA9IHZtd19nYl9zdXJmYWNlX2JpbmQsCisJLnVuYmluZCA9IHZtd19nYl9zdXJmYWNlX3VuYmluZAorfTsKKwogLyoqCiAgKiBzdHJ1Y3Qgdm13X3N1cmZhY2VfZG1hIC0gU1ZHQTNEIERNQSBjb21tYW5kCiAgKi8KQEAgLTI5MSw2ICszMTAsMTEgQEAKIAlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZjsKIAl2b2lkICpjbWQ7CiAKKwlpZiAocmVzLT5mdW5jLT5kZXN0cm95ID09IHZtd19nYl9zdXJmYWNlX2Rlc3Ryb3kpIHsKKwkJKHZvaWQpIHZtd19nYl9zdXJmYWNlX2Rlc3Ryb3kocmVzKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChyZXMtPmlkICE9IC0xKSB7CiAKIAkJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgdm13X3N1cmZhY2VfZGVzdHJveV9zaXplKCkpOwpAQCAtNTQ5LDEyICs1NzMsMTUgQEAKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMgPSAmc3JmLT5yZXM7CiAKIAlCVUdfT04ocmVzX2ZyZWUgPT0gTlVMTCk7Ci0JKHZvaWQpIHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoIWRldl9wcml2LT5oYXNfbW9iKQorCQkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOwogCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsIHRydWUsIHJlc19mcmVlLAorCQkJCShkZXZfcHJpdi0+aGFzX21vYikgPyAmdm13X2diX3N1cmZhY2VfZnVuYyA6CiAJCQkJJnZtd19sZWdhY3lfc3VyZmFjZV9mdW5jKTsKIAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgZmFsc2UpOworCQlpZiAoIWRldl9wcml2LT5oYXNfbW9iKQorCQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgZmFsc2UpOwogCQlyZXNfZnJlZShyZXMpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTc1MCw3ICs3NzcsNyBAQAogCiAJc3JmLT5iYXNlX3NpemUgPSAqc3JmLT5zaXplczsKIAlzcmYtPmF1dG9nZW5fZmlsdGVyID0gU1ZHQTNEX1RFWF9GSUxURVJfTk9ORTsKLQlzcmYtPm11bHRpc2FtcGxlX2NvdW50ID0gMTsKKwlzcmYtPm11bHRpc2FtcGxlX2NvdW50ID0gMDsKIAogCWN1cl9ib19vZmZzZXQgPSAwOwogCWN1cl9vZmZzZXQgPSBzcmYtPm9mZnNldHM7CkBAIC04NDMsNiArODcwLDcgQEAKIGludCB2bXdfc3VyZmFjZV9yZWZlcmVuY2VfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKIAl1bmlvbiBkcm1fdm13X3N1cmZhY2VfcmVmZXJlbmNlX2FyZyAqYXJnID0KIAkgICAgKHVuaW9uIGRybV92bXdfc3VyZmFjZV9yZWZlcmVuY2VfYXJnICopZGF0YTsKIAlzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2FyZyAqcmVxID0gJmFyZy0+cmVxOwpAQCAtODU0LDcgKzg4Miw3IEBACiAJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAotCWJhc2UgPSB0dG1fYmFzZV9vYmplY3RfbG9va3VwKHRmaWxlLCByZXEtPnNpZCk7CisJYmFzZSA9IHR0bV9iYXNlX29iamVjdF9sb29rdXBfZm9yX3JlZihkZXZfcHJpdi0+dGRldiwgcmVxLT5zaWQpOwogCWlmICh1bmxpa2VseShiYXNlID09IE5VTEwpKSB7CiAJCURSTV9FUlJPUigiQ291bGQgbm90IGZpbmQgc3VyZmFjZSB0byByZWZlcmVuY2UuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04ODAsOCArOTA4LDggQEAKIAkgICAgcmVwLT5zaXplX2FkZHI7CiAKIAlpZiAodXNlcl9zaXplcykKLQkJcmV0ID0gY29weV90b191c2VyKHVzZXJfc2l6ZXMsIHNyZi0+c2l6ZXMsCi0JCQkJICAgc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoKnNyZi0+c2l6ZXMpKTsKKwkJcmV0ID0gY29weV90b191c2VyKHVzZXJfc2l6ZXMsICZzcmYtPmJhc2Vfc2l6ZSwKKwkJCQkgICBzaXplb2Yoc3JmLT5iYXNlX3NpemUpKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiY29weV90b191c2VyIGZhaWxlZCAlcCAldVxuIiwKIAkJCSAgdXNlcl9zaXplcywgc3JmLT5udW1fc2l6ZXMpOwpAQCAtODkzLDMgKzkyMSw0MzYgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKy8qKgorICogdm13X3N1cmZhY2VfZGVmaW5lX2VuY29kZSAtIEVuY29kZSBhIHN1cmZhY2VfZGVmaW5lIGNvbW1hbmQuCisgKgorICogQHNyZjogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfc3VyZmFjZSBvYmplY3QuCisgKiBAY21kX3NwYWNlOiBQb2ludGVyIHRvIG1lbW9yeSBhcmVhIGluIHdoaWNoIHRoZSBjb21tYW5kcyBzaG91bGQgYmUgZW5jb2RlZC4KKyAqLworc3RhdGljIGludCB2bXdfZ2Jfc3VyZmFjZV9jcmVhdGUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmID0gdm13X3Jlc190b19zcmYocmVzKTsKKwl1aW50MzJfdCBjbWRfbGVuLCBzdWJtaXRfbGVuOworCWludCByZXQ7CisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kRGVmaW5lR0JTdXJmYWNlIGJvZHk7CisJfSAqY21kOworCisJaWYgKGxpa2VseShyZXMtPmlkICE9IC0xKSkKKwkJcmV0dXJuIDA7CisKKwkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOworCXJldCA9IHZtd19yZXNvdXJjZV9hbGxvY19pZChyZXMpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBzdXJmYWNlIGlkLlxuIik7CisJCWdvdG8gb3V0X25vX2lkOworCX0KKworCWlmICh1bmxpa2VseShyZXMtPmlkID49IFZNV0dGWF9OVU1fR0JfU1VSRkFDRSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9ub19maWZvOworCX0KKworCWNtZF9sZW4gPSBzaXplb2YoY21kLT5ib2R5KTsKKwlzdWJtaXRfbGVuID0gc2l6ZW9mKCpjbWQpOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHN1Ym1pdF9sZW4pOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIHN1cmZhY2UgIgorCQkJICAiY3JlYXRpb24uXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fZmlmbzsKKwl9CisKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX0RFRklORV9HQl9TVVJGQUNFOworCWNtZC0+aGVhZGVyLnNpemUgPSBjbWRfbGVuOworCWNtZC0+Ym9keS5zaWQgPSBzcmYtPnJlcy5pZDsKKwljbWQtPmJvZHkuc3VyZmFjZUZsYWdzID0gc3JmLT5mbGFnczsKKwljbWQtPmJvZHkuZm9ybWF0ID0gY3B1X3RvX2xlMzIoc3JmLT5mb3JtYXQpOworCWNtZC0+Ym9keS5udW1NaXBMZXZlbHMgPSBzcmYtPm1pcF9sZXZlbHNbMF07CisJY21kLT5ib2R5Lm11bHRpc2FtcGxlQ291bnQgPSBzcmYtPm11bHRpc2FtcGxlX2NvdW50OworCWNtZC0+Ym9keS5hdXRvZ2VuRmlsdGVyID0gc3JmLT5hdXRvZ2VuX2ZpbHRlcjsKKwljbWQtPmJvZHkuc2l6ZS53aWR0aCA9IHNyZi0+YmFzZV9zaXplLndpZHRoOworCWNtZC0+Ym9keS5zaXplLmhlaWdodCA9IHNyZi0+YmFzZV9zaXplLmhlaWdodDsKKwljbWQtPmJvZHkuc2l6ZS5kZXB0aCA9IHNyZi0+YmFzZV9zaXplLmRlcHRoOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc3VibWl0X2xlbik7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX2ZpZm86CisJdm13X3Jlc291cmNlX3JlbGVhc2VfaWQocmVzKTsKK291dF9ub19pZDoKKwl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCBmYWxzZSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHZtd19nYl9zdXJmYWNlX2JpbmQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJICAgICAgIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICp2YWxfYnVmKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZEJpbmRHQlN1cmZhY2UgYm9keTsKKwl9ICpjbWQxOworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFVwZGF0ZUdCU3VyZmFjZSBib2R5OworCX0gKmNtZDI7CisJdWludDMyX3Qgc3VibWl0X3NpemU7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IHZhbF9idWYtPmJvOworCisJQlVHX09OKGJvLT5tZW0ubWVtX3R5cGUgIT0gVk1XX1BMX01PQik7CisKKwlzdWJtaXRfc2l6ZSA9IHNpemVvZigqY21kMSkgKyAocmVzLT5iYWNrdXBfZGlydHkgPyBzaXplb2YoKmNtZDIpIDogMCk7CisKKwljbWQxID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc3VibWl0X3NpemUpOworCWlmICh1bmxpa2VseShjbWQxID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKKwkJCSAgImJpbmRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kMS0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfQklORF9HQl9TVVJGQUNFOworCWNtZDEtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZDEtPmJvZHkpOworCWNtZDEtPmJvZHkuc2lkID0gcmVzLT5pZDsKKwljbWQxLT5ib2R5Lm1vYmlkID0gYm8tPm1lbS5zdGFydDsKKwlpZiAocmVzLT5iYWNrdXBfZGlydHkpIHsKKwkJY21kMiA9ICh2b2lkICopICZjbWQxWzFdOworCQljbWQyLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9VUERBVEVfR0JfU1VSRkFDRTsKKwkJY21kMi0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kMi0+Ym9keSk7CisJCWNtZDItPmJvZHkuc2lkID0gcmVzLT5pZDsKKwkJcmVzLT5iYWNrdXBfZGlydHkgPSBmYWxzZTsKKwl9CisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXdfZ2Jfc3VyZmFjZV91bmJpbmQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAorCQkJCSBib29sIHJlYWRiYWNrLAorCQkJCSBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1ZikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gdmFsX2J1Zi0+Ym87CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kUmVhZGJhY2tHQlN1cmZhY2UgYm9keTsKKwl9ICpjbWQxOworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZEludmFsaWRhdGVHQlN1cmZhY2UgYm9keTsKKwl9ICpjbWQyOworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZEJpbmRHQlN1cmZhY2UgYm9keTsKKwl9ICpjbWQzOworCXVpbnQzMl90IHN1Ym1pdF9zaXplOworCXVpbnQ4X3QgKmNtZDsKKworCisJQlVHX09OKGJvLT5tZW0ubWVtX3R5cGUgIT0gVk1XX1BMX01PQik7CisKKwlzdWJtaXRfc2l6ZSA9IHNpemVvZigqY21kMykgKyAocmVhZGJhY2sgPyBzaXplb2YoKmNtZDEpIDogc2l6ZW9mKCpjbWQyKSk7CisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc3VibWl0X3NpemUpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIHN1cmZhY2UgIgorCQkJICAidW5iaW5kaW5nLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChyZWFkYmFjaykgeworCQljbWQxID0gKHZvaWQgKikgY21kOworCQljbWQxLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9SRUFEQkFDS19HQl9TVVJGQUNFOworCQljbWQxLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQxLT5ib2R5KTsKKwkJY21kMS0+Ym9keS5zaWQgPSByZXMtPmlkOworCQljbWQzID0gKHZvaWQgKikgJmNtZDFbMV07CisJfSBlbHNlIHsKKwkJY21kMiA9ICh2b2lkICopIGNtZDsKKwkJY21kMi0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfSU5WQUxJREFURV9HQl9TVVJGQUNFOworCQljbWQyLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQyLT5ib2R5KTsKKwkJY21kMi0+Ym9keS5zaWQgPSByZXMtPmlkOworCQljbWQzID0gKHZvaWQgKikgJmNtZDJbMV07CisJfQorCisJY21kMy0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfQklORF9HQl9TVVJGQUNFOworCWNtZDMtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZDMtPmJvZHkpOworCWNtZDMtPmJvZHkuc2lkID0gcmVzLT5pZDsKKwljbWQzLT5ib2R5Lm1vYmlkID0gU1ZHQTNEX0lOVkFMSURfSUQ7CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKKworCS8qCisJICogQ3JlYXRlIGEgZmVuY2Ugb2JqZWN0IGFuZCBmZW5jZSB0aGUgYmFja3VwIGJ1ZmZlci4KKwkgKi8KKworCSh2b2lkKSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhOVUxMLCBkZXZfcHJpdiwKKwkJCQkJICAmZmVuY2UsIE5VTEwpOworCisJdm13X2ZlbmNlX3NpbmdsZV9ibyh2YWxfYnVmLT5ibywgZmVuY2UpOworCisJaWYgKGxpa2VseShmZW5jZSAhPSBOVUxMKSkKKwkJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm13X2diX3N1cmZhY2VfZGVzdHJveShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHJlcy0+ZGV2X3ByaXY7CisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kRGVzdHJveUdCU3VyZmFjZSBib2R5OworCX0gKmNtZDsKKworCWlmIChsaWtlbHkocmVzLT5pZCA9PSAtMSkpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmJpbmRpbmdfbXV0ZXgpOworCXZtd19jb250ZXh0X2JpbmRpbmdfcmVzX2xpc3Rfc2NydWIoJnJlcy0+YmluZGluZ19oZWFkKTsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc3VyZmFjZSAiCisJCQkgICJkZXN0cnVjdGlvbi5cbiIpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9ERVNUUk9ZX0dCX1NVUkZBQ0U7CisJY21kLT5oZWFkZXIuc2l6ZSA9IHNpemVvZihjbWQtPmJvZHkpOworCWNtZC0+Ym9keS5zaWQgPSByZXMtPmlkOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5iaW5kaW5nX211dGV4KTsKKwl2bXdfcmVzb3VyY2VfcmVsZWFzZV9pZChyZXMpOworCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19nYl9zdXJmYWNlX2RlZmluZV9pb2N0bCAtIElvY3RsIGZ1bmN0aW9uIGltcGxlbWVudGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgc3VyZmFjZSBkZWZpbmUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAZGV2OiAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX2RldmljZS4KKyAqIEBkYXRhOiAgICAgICAgICAgUG9pbnRlciB0byBkYXRhIGNvcGllZCBmcm9tIC8gdG8gdXNlci1zcGFjZS4KKyAqIEBmaWxlX3ByaXY6ICAgICAgUG9pbnRlciB0byBhIGRybSBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgorICovCitpbnQgdm13X2diX3N1cmZhY2VfZGVmaW5lX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7CisJc3RydWN0IHZtd191c2VyX3N1cmZhY2UgKnVzZXJfc3JmOworCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmOworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICp0bXA7CisJdW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9hcmcgKmFyZyA9CisJICAgICh1bmlvbiBkcm1fdm13X2diX3N1cmZhY2VfY3JlYXRlX2FyZyAqKWRhdGE7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVxICpyZXEgPSAmYXJnLT5yZXE7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwICpyZXAgPSAmYXJnLT5yZXA7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJaW50IHJldDsKKwl1aW50MzJfdCBzaXplOworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CisJY29uc3Qgc3RydWN0IHN2Z2EzZF9zdXJmYWNlX2Rlc2MgKmRlc2M7CisJdWludDMyX3QgYmFja3VwX2hhbmRsZTsKKworCWlmICh1bmxpa2VseSh2bXdfdXNlcl9zdXJmYWNlX3NpemUgPT0gMCkpCisJCXZtd191c2VyX3N1cmZhY2Vfc2l6ZSA9IHR0bV9yb3VuZF9wb3Qoc2l6ZW9mKCp1c2VyX3NyZikpICsKKwkJCTEyODsKKworCXNpemUgPSB2bXdfdXNlcl9zdXJmYWNlX3NpemUgKyAxMjg7CisKKwlkZXNjID0gc3ZnYTNkc3VyZmFjZV9nZXRfZGVzYyhyZXEtPmZvcm1hdCk7CisJaWYgKHVubGlrZWx5KGRlc2MtPmJsb2NrX2Rlc2MgPT0gU1ZHQTNEQkxPQ0tERVNDX05PTkUpKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBzdXJmYWNlIGZvcm1hdCBmb3Igc3VyZmFjZSBjcmVhdGlvbi5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2Modm13X21lbV9nbG9iKGRldl9wcml2KSwKKwkJCQkgICBzaXplLCBmYWxzZSwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiT3V0IG9mIGdyYXBoaWNzIG1lbW9yeSBmb3Igc3VyZmFjZSIKKwkJCQkgICIgY3JlYXRpb24uXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXVzZXJfc3JmID0ga3phbGxvYyhzaXplb2YoKnVzZXJfc3JmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHVzZXJfc3JmID09IE5VTEwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3VzZXJfc3JmOworCX0KKworCXNyZiA9ICZ1c2VyX3NyZi0+c3JmOworCXJlcyA9ICZzcmYtPnJlczsKKworCXNyZi0+ZmxhZ3MgPSByZXEtPnN2Z2EzZF9mbGFnczsKKwlzcmYtPmZvcm1hdCA9IHJlcS0+Zm9ybWF0OworCXNyZi0+c2Nhbm91dCA9IHJlcS0+ZHJtX3N1cmZhY2VfZmxhZ3MgJiBkcm1fdm13X3N1cmZhY2VfZmxhZ19zY2Fub3V0OworCXNyZi0+bWlwX2xldmVsc1swXSA9IHJlcS0+bWlwX2xldmVsczsKKwlzcmYtPm51bV9zaXplcyA9IDE7CisJc3JmLT5zaXplcyA9IE5VTEw7CisJc3JmLT5vZmZzZXRzID0gTlVMTDsKKwl1c2VyX3NyZi0+c2l6ZSA9IHNpemU7CisJc3JmLT5iYXNlX3NpemUgPSByZXEtPmJhc2Vfc2l6ZTsKKwlzcmYtPmF1dG9nZW5fZmlsdGVyID0gU1ZHQTNEX1RFWF9GSUxURVJfTk9ORTsKKwlzcmYtPm11bHRpc2FtcGxlX2NvdW50ID0gcmVxLT5tdWx0aXNhbXBsZV9jb3VudDsKKwlyZXMtPmJhY2t1cF9zaXplID0gc3ZnYTNkc3VyZmFjZV9nZXRfc2VyaWFsaXplZF9zaXplCisJICAoc3JmLT5mb3JtYXQsIHNyZi0+YmFzZV9zaXplLCBzcmYtPm1pcF9sZXZlbHNbMF0sCisJICAgc3JmLT5mbGFncyAmIFNWR0EzRF9TVVJGQUNFX0NVQkVNQVApOworCisJdXNlcl9zcmYtPnByaW1lLmJhc2Uuc2hhcmVhYmxlID0gZmFsc2U7CisJdXNlcl9zcmYtPnByaW1lLmJhc2UudGZpbGUgPSBOVUxMOworCisJLyoqCisJICogRnJvbSB0aGlzIHBvaW50LCB0aGUgZ2VuZXJpYyByZXNvdXJjZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucworCSAqIGRlc3Ryb3kgdGhlIG9iamVjdCBvbiBmYWlsdXJlLgorCSAqLworCisJcmV0ID0gdm13X3N1cmZhY2VfaW5pdChkZXZfcHJpdiwgc3JmLCB2bXdfdXNlcl9zdXJmYWNlX2ZyZWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChyZXEtPmJ1ZmZlcl9oYW5kbGUgIT0gU1ZHQTNEX0lOVkFMSURfSUQpIHsKKwkJcmV0ID0gdm13X3VzZXJfZG1hYnVmX2xvb2t1cCh0ZmlsZSwgcmVxLT5idWZmZXJfaGFuZGxlLAorCQkJCQkgICAgICZyZXMtPmJhY2t1cCk7CisJfSBlbHNlIGlmIChyZXEtPmRybV9zdXJmYWNlX2ZsYWdzICYKKwkJICAgZHJtX3Ztd19zdXJmYWNlX2ZsYWdfY3JlYXRlX2J1ZmZlcikKKwkJcmV0ID0gdm13X3VzZXJfZG1hYnVmX2FsbG9jKGRldl9wcml2LCB0ZmlsZSwKKwkJCQkJICAgIHJlcy0+YmFja3VwX3NpemUsCisJCQkJCSAgICByZXEtPmRybV9zdXJmYWNlX2ZsYWdzICYKKwkJCQkJICAgIGRybV92bXdfc3VyZmFjZV9mbGFnX3NoYXJlYWJsZSwKKwkJCQkJICAgICZiYWNrdXBfaGFuZGxlLAorCQkJCQkgICAgJnJlcy0+YmFja3VwKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJdG1wID0gdm13X3Jlc291cmNlX3JlZmVyZW5jZSgmc3JmLT5yZXMpOworCXJldCA9IHR0bV9wcmltZV9vYmplY3RfaW5pdCh0ZmlsZSwgcmVzLT5iYWNrdXBfc2l6ZSwgJnVzZXJfc3JmLT5wcmltZSwKKwkJCQkgICAgcmVxLT5kcm1fc3VyZmFjZV9mbGFncyAmCisJCQkJICAgIGRybV92bXdfc3VyZmFjZV9mbGFnX3NoYXJlYWJsZSwKKwkJCQkgICAgVk1XX1JFU19TVVJGQUNFLAorCQkJCSAgICAmdm13X3VzZXJfc3VyZmFjZV9iYXNlX3JlbGVhc2UsIE5VTEwpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnRtcCk7CisJCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXJlcC0+aGFuZGxlID0gdXNlcl9zcmYtPnByaW1lLmJhc2UuaGFzaC5rZXk7CisJcmVwLT5iYWNrdXBfc2l6ZSA9IHJlcy0+YmFja3VwX3NpemU7CisJaWYgKHJlcy0+YmFja3VwKSB7CisJCXJlcC0+YnVmZmVyX21hcF9oYW5kbGUgPQorCQkJZHJtX3ZtYV9ub2RlX29mZnNldF9hZGRyKCZyZXMtPmJhY2t1cC0+YmFzZS52bWFfbm9kZSk7CisJCXJlcC0+YnVmZmVyX3NpemUgPSByZXMtPmJhY2t1cC0+YmFzZS5udW1fcGFnZXMgKiBQQUdFX1NJWkU7CisJCXJlcC0+YnVmZmVyX2hhbmRsZSA9IGJhY2t1cF9oYW5kbGU7CisJfSBlbHNlIHsKKwkJcmVwLT5idWZmZXJfbWFwX2hhbmRsZSA9IDA7CisJCXJlcC0+YnVmZmVyX3NpemUgPSAwOworCQlyZXAtPmJ1ZmZlcl9oYW5kbGUgPSBTVkdBM0RfSU5WQUxJRF9JRDsKKwl9CisKKwl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CisKKwl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOworCXJldHVybiAwOworb3V0X25vX3VzZXJfc3JmOgorCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGRldl9wcml2KSwgc2l6ZSk7CitvdXRfdW5sb2NrOgorCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2bXdfZ2Jfc3VyZmFjZV9yZWZlcmVuY2VfaW9jdGwgLSBJb2N0bCBmdW5jdGlvbiBpbXBsZW1lbnRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIHN1cmZhY2UgcmVmZXJlbmNlIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGRldjogICAgICAgICAgICBQb2ludGVyIHRvIGEgc3RydWN0IGRybV9kZXZpY2UuCisgKiBAZGF0YTogICAgICAgICAgIFBvaW50ZXIgdG8gZGF0YSBjb3BpZWQgZnJvbSAvIHRvIHVzZXItc3BhY2UuCisgKiBAZmlsZV9wcml2OiAgICAgIFBvaW50ZXIgdG8gYSBkcm0gZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqLworaW50IHZtd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXVuaW9uIGRybV92bXdfZ2Jfc3VyZmFjZV9yZWZlcmVuY2VfYXJnICphcmcgPQorCSAgICAodW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9hcmcgKilkYXRhOworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnICpyZXEgPSAmYXJnLT5yZXE7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9yZWZfcmVwICpyZXAgPSAmYXJnLT5yZXA7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJc3RydWN0IHZtd19zdXJmYWNlICpzcmY7CisJc3RydWN0IHZtd191c2VyX3N1cmZhY2UgKnVzZXJfc3JmOworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2U7CisJdWludDMyX3QgYmFja3VwX2hhbmRsZTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWJhc2UgPSB0dG1fYmFzZV9vYmplY3RfbG9va3VwX2Zvcl9yZWYoZGV2X3ByaXYtPnRkZXYsIHJlcS0+c2lkKTsKKwlpZiAodW5saWtlbHkoYmFzZSA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBmaW5kIHN1cmZhY2UgdG8gcmVmZXJlbmNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh1bmxpa2VseSh0dG1fYmFzZV9vYmplY3RfdHlwZShiYXNlKSAhPSBWTVdfUkVTX1NVUkZBQ0UpKQorCQlnb3RvIG91dF9iYWRfcmVzb3VyY2U7CisKKwl1c2VyX3NyZiA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgdm13X3VzZXJfc3VyZmFjZSwgcHJpbWUuYmFzZSk7CisJc3JmID0gJnVzZXJfc3JmLT5zcmY7CisJaWYgKHNyZi0+cmVzLmJhY2t1cCA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiU2hhcmVkIEdCIHN1cmZhY2UgaXMgbWlzc2luZyBhIGJhY2t1cCBidWZmZXIuXG4iKTsKKwkJZ290byBvdXRfYmFkX3Jlc291cmNlOworCX0KKworCXJldCA9IHR0bV9yZWZfb2JqZWN0X2FkZCh0ZmlsZSwgJnVzZXJfc3JmLT5wcmltZS5iYXNlLAorCQkJCSBUVE1fUkVGX1VTQUdFLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCURSTV9FUlJPUigiQ291bGQgbm90IGFkZCBhIHJlZmVyZW5jZSB0byBhIEdCIHN1cmZhY2UuXG4iKTsKKwkJZ290byBvdXRfYmFkX3Jlc291cmNlOworCX0KKworCW11dGV4X2xvY2soJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOyAvKiBQcm90ZWN0IHJlcy0+YmFja3VwICovCisJcmV0ID0gdm13X3VzZXJfZG1hYnVmX3JlZmVyZW5jZSh0ZmlsZSwgc3JmLT5yZXMuYmFja3VwLAorCQkJCQkmYmFja3VwX2hhbmRsZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBub3QgYWRkIGEgcmVmZXJlbmNlIHRvIGEgR0Igc3VyZmFjZSAiCisJCQkgICJiYWNrdXAgYnVmZmVyLlxuIik7CisJCSh2b2lkKSB0dG1fcmVmX29iamVjdF9iYXNlX3VucmVmKHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZSwKKwkJCQkJCSByZXEtPnNpZCwKKwkJCQkJCSBUVE1fUkVGX1VTQUdFKTsKKwkJZ290byBvdXRfYmFkX3Jlc291cmNlOworCX0KKworCXJlcC0+Y3JlcS5zdmdhM2RfZmxhZ3MgPSBzcmYtPmZsYWdzOworCXJlcC0+Y3JlcS5mb3JtYXQgPSBzcmYtPmZvcm1hdDsKKwlyZXAtPmNyZXEubWlwX2xldmVscyA9IHNyZi0+bWlwX2xldmVsc1swXTsKKwlyZXAtPmNyZXEuZHJtX3N1cmZhY2VfZmxhZ3MgPSAwOworCXJlcC0+Y3JlcS5tdWx0aXNhbXBsZV9jb3VudCA9IHNyZi0+bXVsdGlzYW1wbGVfY291bnQ7CisJcmVwLT5jcmVxLmF1dG9nZW5fZmlsdGVyID0gc3JmLT5hdXRvZ2VuX2ZpbHRlcjsKKwlyZXAtPmNyZXEuYnVmZmVyX2hhbmRsZSA9IGJhY2t1cF9oYW5kbGU7CisJcmVwLT5jcmVxLmJhc2Vfc2l6ZSA9IHNyZi0+YmFzZV9zaXplOworCXJlcC0+Y3JlcC5oYW5kbGUgPSB1c2VyX3NyZi0+cHJpbWUuYmFzZS5oYXNoLmtleTsKKwlyZXAtPmNyZXAuYmFja3VwX3NpemUgPSBzcmYtPnJlcy5iYWNrdXBfc2l6ZTsKKwlyZXAtPmNyZXAuYnVmZmVyX2hhbmRsZSA9IGJhY2t1cF9oYW5kbGU7CisJcmVwLT5jcmVwLmJ1ZmZlcl9tYXBfaGFuZGxlID0KKwkJZHJtX3ZtYV9ub2RlX29mZnNldF9hZGRyKCZzcmYtPnJlcy5iYWNrdXAtPmJhc2Uudm1hX25vZGUpOworCXJlcC0+Y3JlcC5idWZmZXJfc2l6ZSA9IHNyZi0+cmVzLmJhY2t1cC0+YmFzZS5udW1fcGFnZXMgKiBQQUdFX1NJWkU7CisKK291dF9iYWRfcmVzb3VyY2U6CisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZiYXNlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9LY29uZmlnCmluZGV4IDdkNmJlZDIuLmIyZmQwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFRFR1JBX0hPU1QxWAogCXRyaXN0YXRlICJOVklESUEgVGVncmEgaG9zdDF4IGRyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfVEVHUkEgfHwgQVJDSF9NVUxUSVBMQVRGT1JNCisJZGVwZW5kcyBvbiBBUkNIX1RFR1JBIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIE5WSURJQSBUZWdyYSBob3N0MXggaGFyZHdhcmUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9NYWtlZmlsZQppbmRleCBhZmExZTllLi5jMTE4OWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L01ha2VmaWxlCkBAIC03LDcgKzcsOSBAQAogCWNoYW5uZWwubyBcCiAJam9iLm8gXAogCWRlYnVnLm8gXAorCW1pcGkubyBcCiAJaHcvaG9zdDF4MDEubyBcCi0JaHcvaG9zdDF4MDIubworCWh3L2hvc3QxeDAyLm8gXAorCWh3L2hvc3QxeDA0Lm8KIAogb2JqLSQoQ09ORklHX1RFR1JBX0hPU1QxWCkgKz0gaG9zdDF4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9idXMuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9idXMuYwppbmRleCA2YTkyOTU5Li5jY2RkMmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvYnVzLmMKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2J1cy5jCkBAIC0xODgsNiArMTg4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfZGV2aWNlX2luaXQpOwogCiBpbnQgaG9zdDF4X2RldmljZV9leGl0KHN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXZpY2UpCiB7CkBAIC0yMTMsNiArMjE0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfZGV2aWNlX2V4aXQpOwogCiBzdGF0aWMgaW50IGhvc3QxeF9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IGhvc3QxeCAqaG9zdDF4LAogCQkJCSAgc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9jaGFubmVsLmMgYi9kcml2ZXJzL2dwdS9ob3N0MXgvY2hhbm5lbC5jCmluZGV4IDgzZWE1MWIuLmI0YWUzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2NoYW5uZWwuYwpAQCAtNDMsNiArNDMsNyBAQAogCiAJcmV0dXJuIGhvc3QxeF9od19jaGFubmVsX3N1Ym1pdChob3N0LCBqb2IpOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfam9iX3N1Ym1pdCk7CiAKIHN0cnVjdCBob3N0MXhfY2hhbm5lbCAqaG9zdDF4X2NoYW5uZWxfZ2V0KHN0cnVjdCBob3N0MXhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKQEAgLTYwLDYgKzYxLDcgQEAKIAogCXJldHVybiBlcnIgPyBOVUxMIDogY2hhbm5lbDsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X2NoYW5uZWxfZ2V0KTsKIAogdm9pZCBob3N0MXhfY2hhbm5lbF9wdXQoc3RydWN0IGhvc3QxeF9jaGFubmVsICpjaGFubmVsKQogewpAQCAtNzYsNiArNzgsNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZjaGFubmVsLT5yZWZsb2NrKTsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X2NoYW5uZWxfcHV0KTsKIAogc3RydWN0IGhvc3QxeF9jaGFubmVsICpob3N0MXhfY2hhbm5lbF9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTExNSw2ICsxMTgsNyBAQAogCW11dGV4X3VubG9jaygmaG9zdC0+Y2hsaXN0X211dGV4KTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X2NoYW5uZWxfcmVxdWVzdCk7CiAKIHZvaWQgaG9zdDF4X2NoYW5uZWxfZnJlZShzdHJ1Y3QgaG9zdDF4X2NoYW5uZWwgKmNoYW5uZWwpCiB7CkBAIC0xMjQsMyArMTI4LDQgQEAKIAlsaXN0X2RlbCgmY2hhbm5lbC0+bGlzdCk7CiAJa2ZyZWUoY2hhbm5lbCk7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9jaGFubmVsX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L2RlYnVnLmMgYi9kcml2ZXJzL2dwdS9ob3N0MXgvZGVidWcuYwppbmRleCAzZWM3ZDc3Li5lZTNkMTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvZGVidWcuYworKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvZGVidWcuYwpAQCAtOTYsNyArOTYsNiBAQAogCQlzaG93X2NoYW5uZWxzKGNoLCBvLCB0cnVlKTsKIH0KIAotI2lmZGVmIENPTkZJR19ERUJVR19GUwogc3RhdGljIHZvaWQgc2hvd19hbGxfbm9fZmlmbyhzdHJ1Y3QgaG9zdDF4ICpob3N0MXgsIHN0cnVjdCBvdXRwdXQgKm8pCiB7CiAJc3RydWN0IGhvc3QxeF9jaGFubmVsICpjaDsKQEAgLTE1Myw3ICsxNTIsNyBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi12b2lkIGhvc3QxeF9kZWJ1Z19pbml0KHN0cnVjdCBob3N0MXggKmhvc3QxeCkKK3N0YXRpYyB2b2lkIGhvc3QxeF9kZWJ1Z2ZzX2luaXQoc3RydWN0IGhvc3QxeCAqaG9zdDF4KQogewogCXN0cnVjdCBkZW50cnkgKmRlID0gZGVidWdmc19jcmVhdGVfZGlyKCJ0ZWdyYS1ob3N0MXgiLCBOVUxMKTsKIApAQCAtMTgwLDE4ICsxNzksMjIgQEAKIAkJCSAgICZob3N0MXhfZGVidWdfZm9yY2VfdGltZW91dF9jaGFubmVsKTsKIH0KIAotdm9pZCBob3N0MXhfZGVidWdfZGVpbml0KHN0cnVjdCBob3N0MXggKmhvc3QxeCkKK3N0YXRpYyB2b2lkIGhvc3QxeF9kZWJ1Z2ZzX2V4aXQoc3RydWN0IGhvc3QxeCAqaG9zdDF4KQogewogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShob3N0MXgtPmRlYnVnZnMpOwogfQotI2Vsc2UKKwogdm9pZCBob3N0MXhfZGVidWdfaW5pdChzdHJ1Y3QgaG9zdDF4ICpob3N0MXgpCiB7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0ZTKSkKKwkJaG9zdDF4X2RlYnVnZnNfaW5pdChob3N0MXgpOwogfQorCiB2b2lkIGhvc3QxeF9kZWJ1Z19kZWluaXQoc3RydWN0IGhvc3QxeCAqaG9zdDF4KQogeworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpCisJCWhvc3QxeF9kZWJ1Z2ZzX2V4aXQoaG9zdDF4KTsKIH0KLSNlbmRpZgogCiB2b2lkIGhvc3QxeF9kZWJ1Z19kdW1wKHN0cnVjdCBob3N0MXggKmhvc3QxeCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9kZXYuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9kZXYuYwppbmRleCA4MGRhMDAzLi4yNTI5OTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvZGV2LmMKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2Rldi5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJody9ob3N0MXgwMS5oIgogI2luY2x1ZGUgImh3L2hvc3QxeDAyLmgiCisjaW5jbHVkZSAiaHcvaG9zdDF4MDQuaCIKIAogdm9pZCBob3N0MXhfc3luY193cml0ZWwoc3RydWN0IGhvc3QxeCAqaG9zdDF4LCB1MzIgdiwgdTMyIHIpCiB7CkBAIC03Nyw3ICs3OCwxNyBAQAogCS5zeW5jX29mZnNldCA9IDB4MzAwMCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaG9zdDF4X2luZm8gaG9zdDF4MDRfaW5mbyA9IHsKKwkubmJfY2hhbm5lbHMgPSAxMiwKKwkubmJfcHRzID0gMTkyLAorCS5uYl9tbG9ja3MgPSAxNiwKKwkubmJfYmFzZXMgPSA2NCwKKwkuaW5pdCA9IGhvc3QxeDA0X2luaXQsCisJLnN5bmNfb2Zmc2V0ID0gMHgyMTAwLAorfTsKKwogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaG9zdDF4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaG9zdDF4IiwgLmRhdGEgPSAmaG9zdDF4MDRfaW5mbywgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1ob3N0MXgiLCAuZGF0YSA9ICZob3N0MXgwMl9pbmZvLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtaG9zdDF4IiwgLmRhdGEgPSAmaG9zdDF4MDFfaW5mbywgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWhvc3QxeCIsIC5kYXRhID0gJmhvc3QxeDAxX2luZm8sIH0sCkBAIC0yMTAsMTcgKzIyMSwyNiBAQAogCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0ZWdyYV9ob3N0MXhfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkgewotCQlob3N0MXhfYnVzX2V4aXQoKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5yZWdpc3Rlcl9idXM7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX21pcGlfZHJpdmVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bnJlZ2lzdGVyX2hvc3QxeDsKIAogCXJldHVybiAwOworCit1bnJlZ2lzdGVyX2hvc3QxeDoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGVncmFfaG9zdDF4X2RyaXZlcik7Cit1bnJlZ2lzdGVyX2J1czoKKwlob3N0MXhfYnVzX2V4aXQoKTsKKwlyZXR1cm4gZXJyOwogfQogbW9kdWxlX2luaXQodGVncmFfaG9zdDF4X2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdGVncmFfaG9zdDF4X2V4aXQodm9pZCkKIHsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGVncmFfbWlwaV9kcml2ZXIpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9ob3N0MXhfZHJpdmVyKTsKIAlob3N0MXhfYnVzX2V4aXQoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9kZXYuaCBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9kZXYuaAppbmRleCBhNjFhOTc2Li4wYjZlOGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvZGV2LmgKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2Rldi5oCkBAIC0zMDYsNCArMzA2LDYgQEAKIAlob3N0LT5kZWJ1Z19vcC0+c2hvd19tbG9ja3MoaG9zdCwgbyk7CiB9CiAKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX21pcGlfZHJpdmVyOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwMi5jIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2hvc3QxeDAyLmMKaW5kZXggZTk4Y2FjYS4uOTI4OTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2hvc3QxeDAyLmMKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2hvc3QxeDAyLmMKQEAgLTE3LDggKzE3LDggQEAKICAqLwogCiAvKiBpbmNsdWRlIGh3IHNwZWNpZmljYXRpb24gKi8KLSNpbmNsdWRlICJob3N0MXgwMS5oIgotI2luY2x1ZGUgImhvc3QxeDAxX2hhcmR3YXJlLmgiCisjaW5jbHVkZSAiaG9zdDF4MDIuaCIKKyNpbmNsdWRlICJob3N0MXgwMl9oYXJkd2FyZS5oIgogCiAvKiBpbmNsdWRlIGNvZGUgKi8KICNpbmNsdWRlICJjZG1hX2h3LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaG9zdDF4MDJfaGFyZHdhcmUuaCBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwMl9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDkwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaG9zdDF4MDJfaGFyZHdhcmUuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIFRlZ3JhIGhvc3QxeCBSZWdpc3RlciBPZmZzZXRzIGZvciBUZWdyYTExNAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19IT1NUMVhfSE9TVDFYMDJfSEFSRFdBUkVfSAorI2RlZmluZSBfX0hPU1QxWF9IT1NUMVgwMl9IQVJEV0FSRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSAiaHdfaG9zdDF4MDJfY2hhbm5lbC5oIgorI2luY2x1ZGUgImh3X2hvc3QxeDAyX3N5bmMuaCIKKyNpbmNsdWRlICJod19ob3N0MXgwMl91Y2xhc3MuaCIKKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NsYXNzX2hvc3Rfd2FpdF9zeW5jcHQoCisJdW5zaWduZWQgaW5keCwgdW5zaWduZWQgdGhyZXNob2xkKQoreworCXJldHVybiBob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2luZHhfZihpbmR4KQorCQl8IGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfdGhyZXNoX2YodGhyZXNob2xkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NsYXNzX2hvc3RfbG9hZF9zeW5jcHRfYmFzZSgKKwl1bnNpZ25lZCBpbmR4LCB1bnNpZ25lZCB0aHJlc2hvbGQpCit7CisJcmV0dXJuIGhvc3QxeF91Y2xhc3NfbG9hZF9zeW5jcHRfYmFzZV9iYXNlX2luZHhfZihpbmR4KQorCQl8IGhvc3QxeF91Y2xhc3NfbG9hZF9zeW5jcHRfYmFzZV92YWx1ZV9mKHRocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jbGFzc19ob3N0X3dhaXRfc3luY3B0X2Jhc2UoCisJdW5zaWduZWQgaW5keCwgdW5zaWduZWQgYmFzZV9pbmR4LCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfYmFzZV9pbmR4X2YoaW5keCkKKwkJfCBob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2VfYmFzZV9pbmR4X2YoYmFzZV9pbmR4KQorCQl8IGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfYmFzZV9vZmZzZXRfZihvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF9pbmNyX3N5bmNwdF9iYXNlKAorCXVuc2lnbmVkIGJhc2VfaW5keCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2Jhc2VfYmFzZV9pbmR4X2YoYmFzZV9pbmR4KQorCQl8IGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfYmFzZV9vZmZzZXRfZihvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF9pbmNyX3N5bmNwdCgKKwl1bnNpZ25lZCBjb25kLCB1bnNpZ25lZCBpbmR4KQoreworCXJldHVybiBob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2NvbmRfZihjb25kKQorCQl8IGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfaW5keF9mKGluZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF9pbmRvZmZfcmVnX3dyaXRlKAorCXVuc2lnbmVkIG1vZF9pZCwgdW5zaWduZWQgb2Zmc2V0LCBib29sIGF1dG9faW5jKQoreworCXUzMiB2ID0gaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kYmVfZigweGYpCisJCXwgaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kbW9kaWRfZihtb2RfaWQpCisJCXwgaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kcm9mZnNldF9mKG9mZnNldCk7CisJaWYgKGF1dG9faW5jKQorCQl2IHw9IGhvc3QxeF91Y2xhc3NfaW5kb2ZmX2F1dG9pbmNfZigxKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NsYXNzX2hvc3RfaW5kb2ZmX3JlZ19yZWFkKAorCXVuc2lnbmVkIG1vZF9pZCwgdW5zaWduZWQgb2Zmc2V0LCBib29sIGF1dG9faW5jKQoreworCXUzMiB2ID0gaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kbW9kaWRfZihtb2RfaWQpCisJCXwgaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kcm9mZnNldF9mKG9mZnNldCkKKwkJfCBob3N0MXhfdWNsYXNzX2luZG9mZl9yd25fcmVhZF92KCk7CisJaWYgKGF1dG9faW5jKQorCQl2IHw9IGhvc3QxeF91Y2xhc3NfaW5kb2ZmX2F1dG9pbmNfZigxKTsKKwlyZXR1cm4gdjsKK30KKworLyogY2RtYSBvcGNvZGVzICovCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX3NldGNsYXNzKAorCXVuc2lnbmVkIGNsYXNzX2lkLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG1hc2spCit7CisJcmV0dXJuICgwIDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgKGNsYXNzX2lkIDw8IDYpIHwgbWFzazsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9pbmNyKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgY291bnQpCit7CisJcmV0dXJuICgxIDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfbm9uaW5jcih1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGNvdW50KQoreworCXJldHVybiAoMiA8PCAyOCkgfCAob2Zmc2V0IDw8IDE2KSB8IGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX21hc2sodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBtYXNrKQoreworCXJldHVybiAoMyA8PCAyOCkgfCAob2Zmc2V0IDw8IDE2KSB8IG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfaW1tKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdmFsdWUpCit7CisJcmV0dXJuICg0IDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfaW1tX2luY3Jfc3luY3B0KHVuc2lnbmVkIGNvbmQsIHVuc2lnbmVkIGluZHgpCit7CisJcmV0dXJuIGhvc3QxeF9vcGNvZGVfaW1tKGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfcigpLAorCQlob3N0MXhfY2xhc3NfaG9zdF9pbmNyX3N5bmNwdChjb25kLCBpbmR4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfcmVzdGFydCh1bnNpZ25lZCBhZGRyZXNzKQoreworCXJldHVybiAoNSA8PCAyOCkgfCAoYWRkcmVzcyA+PiA0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9nYXRoZXIodW5zaWduZWQgY291bnQpCit7CisJcmV0dXJuICg2IDw8IDI4KSB8IGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX2dhdGhlcl9ub25pbmNyKHVuc2lnbmVkIG9mZnNldCwJdW5zaWduZWQgY291bnQpCit7CisJcmV0dXJuICg2IDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgQklUKDE1KSB8IGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX2dhdGhlcl9pbmNyKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgY291bnQpCit7CisJcmV0dXJuICg2IDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgQklUKDE1KSB8IEJJVCgxNCkgfCBjb3VudDsKK30KKworI2RlZmluZSBIT1NUMVhfT1BDT0RFX05PUCBob3N0MXhfb3Bjb2RlX25vbmluY3IoMCwgMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaG9zdDF4MDQuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDdjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaG9zdDF4MDQuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogSG9zdDF4IGluaXQgZm9yIFRlZ3JhMTI0IFNvQ3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTlZJRElBIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogaW5jbHVkZSBodyBzcGVjaWZpY2F0aW9uICovCisjaW5jbHVkZSAiaG9zdDF4MDQuaCIKKyNpbmNsdWRlICJob3N0MXgwNF9oYXJkd2FyZS5oIgorCisvKiBpbmNsdWRlIGNvZGUgKi8KKyNpbmNsdWRlICJjZG1hX2h3LmMiCisjaW5jbHVkZSAiY2hhbm5lbF9ody5jIgorI2luY2x1ZGUgImRlYnVnX2h3LmMiCisjaW5jbHVkZSAiaW50cl9ody5jIgorI2luY2x1ZGUgInN5bmNwdF9ody5jIgorCisjaW5jbHVkZSAiLi4vZGV2LmgiCisKK2ludCBob3N0MXgwNF9pbml0KHN0cnVjdCBob3N0MXggKmhvc3QpCit7CisJaG9zdC0+Y2hhbm5lbF9vcCA9ICZob3N0MXhfY2hhbm5lbF9vcHM7CisJaG9zdC0+Y2RtYV9vcCA9ICZob3N0MXhfY2RtYV9vcHM7CisJaG9zdC0+Y2RtYV9wYl9vcCA9ICZob3N0MXhfcHVzaGJ1ZmZlcl9vcHM7CisJaG9zdC0+c3luY3B0X29wID0gJmhvc3QxeF9zeW5jcHRfb3BzOworCWhvc3QtPmludHJfb3AgPSAmaG9zdDF4X2ludHJfb3BzOworCWhvc3QtPmRlYnVnX29wID0gJmhvc3QxeF9kZWJ1Z19vcHM7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwNC5oIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2hvc3QxeDA0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhYjc0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwNC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBIb3N0MXggaW5pdCBmb3IgVGVncmExMjQgU29DcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBOVklESUEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEhPU1QxWF9IT1NUMVgwNF9ICisjZGVmaW5lIEhPU1QxWF9IT1NUMVgwNF9ICisKK3N0cnVjdCBob3N0MXg7CisKK2ludCBob3N0MXgwNF9pbml0KHN0cnVjdCBob3N0MXggKmhvc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwNF9oYXJkd2FyZS5oIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2hvc3QxeDA0X2hhcmR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYTM4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9ob3N0MXgwNF9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogVGVncmEgaG9zdDF4IFJlZ2lzdGVyIE9mZnNldHMgZm9yIFRlZ3JhMTI0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgTlZJRElBIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0hPU1QxWF9IT1NUMVgwNF9IQVJEV0FSRV9ICisjZGVmaW5lIF9fSE9TVDFYX0hPU1QxWDA0X0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlICJod19ob3N0MXgwNF9jaGFubmVsLmgiCisjaW5jbHVkZSAiaHdfaG9zdDF4MDRfc3luYy5oIgorI2luY2x1ZGUgImh3X2hvc3QxeDA0X3VjbGFzcy5oIgorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF93YWl0X3N5bmNwdCgKKwl1bnNpZ25lZCBpbmR4LCB1bnNpZ25lZCB0aHJlc2hvbGQpCit7CisJcmV0dXJuIGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfaW5keF9mKGluZHgpCisJCXwgaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF90aHJlc2hfZih0aHJlc2hvbGQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF9sb2FkX3N5bmNwdF9iYXNlKAorCXVuc2lnbmVkIGluZHgsIHVuc2lnbmVkIHRocmVzaG9sZCkKK3sKKwlyZXR1cm4gaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX2Jhc2VfaW5keF9mKGluZHgpCisJCXwgaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX3ZhbHVlX2YodGhyZXNob2xkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NsYXNzX2hvc3Rfd2FpdF9zeW5jcHRfYmFzZSgKKwl1bnNpZ25lZCBpbmR4LCB1bnNpZ25lZCBiYXNlX2luZHgsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9iYXNlX2luZHhfZihpbmR4KQorCQl8IGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfYmFzZV9iYXNlX2luZHhfZihiYXNlX2luZHgpCisJCXwgaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9iYXNlX29mZnNldF9mKG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jbGFzc19ob3N0X2luY3Jfc3luY3B0X2Jhc2UoCisJdW5zaWduZWQgYmFzZV9pbmR4LCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfYmFzZV9iYXNlX2luZHhfZihiYXNlX2luZHgpCisJCXwgaG9zdDF4X3VjbGFzc19pbmNyX3N5bmNwdF9iYXNlX29mZnNldF9mKG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jbGFzc19ob3N0X2luY3Jfc3luY3B0KAorCXVuc2lnbmVkIGNvbmQsIHVuc2lnbmVkIGluZHgpCit7CisJcmV0dXJuIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfY29uZF9mKGNvbmQpCisJCXwgaG9zdDF4X3VjbGFzc19pbmNyX3N5bmNwdF9pbmR4X2YoaW5keCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jbGFzc19ob3N0X2luZG9mZl9yZWdfd3JpdGUoCisJdW5zaWduZWQgbW9kX2lkLCB1bnNpZ25lZCBvZmZzZXQsIGJvb2wgYXV0b19pbmMpCit7CisJdTMyIHYgPSBob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRiZV9mKDB4ZikKKwkJfCBob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRtb2RpZF9mKG1vZF9pZCkKKwkJfCBob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRyb2Zmc2V0X2Yob2Zmc2V0KTsKKwlpZiAoYXV0b19pbmMpCisJCXYgfD0gaG9zdDF4X3VjbGFzc19pbmRvZmZfYXV0b2luY19mKDEpOworCXJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2xhc3NfaG9zdF9pbmRvZmZfcmVnX3JlYWQoCisJdW5zaWduZWQgbW9kX2lkLCB1bnNpZ25lZCBvZmZzZXQsIGJvb2wgYXV0b19pbmMpCit7CisJdTMyIHYgPSBob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRtb2RpZF9mKG1vZF9pZCkKKwkJfCBob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRyb2Zmc2V0X2Yob2Zmc2V0KQorCQl8IGhvc3QxeF91Y2xhc3NfaW5kb2ZmX3J3bl9yZWFkX3YoKTsKKwlpZiAoYXV0b19pbmMpCisJCXYgfD0gaG9zdDF4X3VjbGFzc19pbmRvZmZfYXV0b2luY19mKDEpOworCXJldHVybiB2OworfQorCisvKiBjZG1hIG9wY29kZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfc2V0Y2xhc3MoCisJdW5zaWduZWQgY2xhc3NfaWQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbWFzaykKK3sKKwlyZXR1cm4gKDAgPDwgMjgpIHwgKG9mZnNldCA8PCAxNikgfCAoY2xhc3NfaWQgPDwgNikgfCBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX2luY3IodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBjb3VudCkKK3sKKwlyZXR1cm4gKDEgPDwgMjgpIHwgKG9mZnNldCA8PCAxNikgfCBjb3VudDsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9ub25pbmNyKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgY291bnQpCit7CisJcmV0dXJuICgyIDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfbWFzayh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG1hc2spCit7CisJcmV0dXJuICgzIDw8IDI4KSB8IChvZmZzZXQgPDwgMTYpIHwgbWFzazsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9pbW0odW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwlyZXR1cm4gKDQgPDwgMjgpIHwgKG9mZnNldCA8PCAxNikgfCB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9pbW1faW5jcl9zeW5jcHQodW5zaWduZWQgY29uZCwgdW5zaWduZWQgaW5keCkKK3sKKwlyZXR1cm4gaG9zdDF4X29wY29kZV9pbW0oaG9zdDF4X3VjbGFzc19pbmNyX3N5bmNwdF9yKCksCisJCWhvc3QxeF9jbGFzc19ob3N0X2luY3Jfc3luY3B0KGNvbmQsIGluZHgpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X29wY29kZV9yZXN0YXJ0KHVuc2lnbmVkIGFkZHJlc3MpCit7CisJcmV0dXJuICg1IDw8IDI4KSB8IChhZGRyZXNzID4+IDQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfb3Bjb2RlX2dhdGhlcih1bnNpZ25lZCBjb3VudCkKK3sKKwlyZXR1cm4gKDYgPDwgMjgpIHwgY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfZ2F0aGVyX25vbmluY3IodW5zaWduZWQgb2Zmc2V0LAl1bnNpZ25lZCBjb3VudCkKK3sKKwlyZXR1cm4gKDYgPDwgMjgpIHwgKG9mZnNldCA8PCAxNikgfCBCSVQoMTUpIHwgY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9vcGNvZGVfZ2F0aGVyX2luY3IodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBjb3VudCkKK3sKKwlyZXR1cm4gKDYgPDwgMjgpIHwgKG9mZnNldCA8PCAxNikgfCBCSVQoMTUpIHwgQklUKDE0KSB8IGNvdW50OworfQorCisjZGVmaW5lIEhPU1QxWF9PUENPREVfTk9QIGhvc3QxeF9vcGNvZGVfbm9uaW5jcigwLCAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwMl91Y2xhc3MuaCBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwMl91Y2xhc3MuaAppbmRleCBhM2IzYzk4Li4wMjhlNDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaHdfaG9zdDF4MDJfdWNsYXNzLmgKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2h3X2hvc3QxeDAyX3VjbGFzcy5oCkBAIC0xMTEsNiArMTExLDEyIEBACiB9CiAjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfV0FJVF9TWU5DUFRfQkFTRV9PRkZTRVRfRih2KSBcCiAJaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9iYXNlX29mZnNldF9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX2xvYWRfc3luY3B0X2Jhc2Vfcih2b2lkKQoreworCXJldHVybiAweGI7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfTE9BRF9TWU5DUFRfQkFTRSBcCisJaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX3IoKQogc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX2Jhc2VfaW5keF9mKHUzMiB2KQogewogCXJldHVybiAodiAmIDB4ZmYpIDw8IDI0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2h3X2hvc3QxeDA0X2NoYW5uZWwuaCBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwNF9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNmY5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwNF9jaGFubmVsLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTlZJRElBIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICovCisKKyAvKgorICAqIEZ1bmN0aW9uIG5hbWluZyBkZXRlcm1pbmVzIGludGVuZGVkIHVzZToKKyAgKgorICAqICAgICA8eD5fcih2b2lkKSA6IFJldHVybnMgdGhlIG9mZnNldCBmb3IgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl93KHZvaWQpIDogUmV0dXJucyB0aGUgd29yZCBvZmZzZXQgZm9yIHdvcmQgKDQgYnl0ZSkgZWxlbWVudCA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl9zKHZvaWQpIDogUmV0dXJucyBzaXplIG9mIGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4gaW4gYml0cy4KKyAgKgorICAqICAgICA8eD5fPHk+X2YodTMyIHYpIDogUmV0dXJucyBhIHZhbHVlIGJhc2VkIG9uICd2JyB3aGljaCBoYXMgYmVlbiBzaGlmdGVkCisgICogICAgICAgICBhbmQgbWFza2VkIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlCisgICogICAgICAgICBjYW4gYmUgfCdkIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvcgorICAqICAgICAgICAgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl88eT5fbSh2b2lkKSA6IFJldHVybnMgYSBtYXNrIGZvciBmaWVsZCA8eT4gb2YgcmVnaXN0ZXIgPHg+LiAgVGhpcworICAqICAgICAgICAgdmFsdWUgY2FuIGJlIH4nZCBhbmQgdGhlbiAmJ2QgdG8gY2xlYXIgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmb3IKKyAgKiAgICAgICAgIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl9mKHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgPHo+IGFmdGVyIGJlaW5nIHNoaWZ0ZWQKKyAgKiAgICAgICAgIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlIGNhbiBiZSB8J2QKKyAgKiAgICAgICAgIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvciA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl92KHUzMiByKSA6IFJldHVybnMgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmcm9tIGEgZnVsbCByZWdpc3RlcgorICAqICAgICAgICAgPHg+IHZhbHVlICdyJyBhZnRlciBiZWluZyBzaGlmdGVkIHRvIHBsYWNlIGl0cyBMU0IgYXQgYml0IDAuCisgICogICAgICAgICBUaGlzIHZhbHVlIGlzIHN1aXRhYmxlIGZvciBkaXJlY3QgY29tcGFyaXNvbiB3aXRoIG90aGVyIHVuc2hpZnRlZAorICAqICAgICAgICAgdmFsdWVzIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl92KHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIDx6PiBkZWZpbmVkIGZvcgorICAqICAgICAgICAgZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4gIFRoaXMgdmFsdWUgaXMgc3VpdGFibGUgZm9yIGRpcmVjdAorICAqICAgICAgICAgY29tcGFyaXNvbiB3aXRoIHVuc2hpZnRlZCB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBmaWVsZCA8eT4KKyAgKiAgICAgICAgIG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKi8KKworI2lmbmRlZiBIT1NUMVhfSFdfSE9TVDFYMDRfQ0hBTk5FTF9ICisjZGVmaW5lIEhPU1QxWF9IV19IT1NUMVgwNF9DSEFOTkVMX0gKKworc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NoYW5uZWxfZmlmb3N0YXRfcih2b2lkKQoreworCXJldHVybiAweDA7Cit9CisjZGVmaW5lIEhPU1QxWF9DSEFOTkVMX0ZJRk9TVEFUIFwKKwlob3N0MXhfY2hhbm5lbF9maWZvc3RhdF9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jaGFubmVsX2ZpZm9zdGF0X2NmZW1wdHlfdih1MzIgcikKK3sKKwlyZXR1cm4gKHIgPj4gMTEpICYgMHgxOworfQorI2RlZmluZSBIT1NUMVhfQ0hBTk5FTF9GSUZPU1RBVF9DRkVNUFRZX1YocikgXAorCWhvc3QxeF9jaGFubmVsX2ZpZm9zdGF0X2NmZW1wdHlfdihyKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NoYW5uZWxfZG1hc3RhcnRfcih2b2lkKQoreworCXJldHVybiAweDE0OworfQorI2RlZmluZSBIT1NUMVhfQ0hBTk5FTF9ETUFTVEFSVCBcCisJaG9zdDF4X2NoYW5uZWxfZG1hc3RhcnRfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2hhbm5lbF9kbWFwdXRfcih2b2lkKQoreworCXJldHVybiAweDE4OworfQorI2RlZmluZSBIT1NUMVhfQ0hBTk5FTF9ETUFQVVQgXAorCWhvc3QxeF9jaGFubmVsX2RtYXB1dF9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jaGFubmVsX2RtYWdldF9yKHZvaWQpCit7CisJcmV0dXJuIDB4MWM7Cit9CisjZGVmaW5lIEhPU1QxWF9DSEFOTkVMX0RNQUdFVCBcCisJaG9zdDF4X2NoYW5uZWxfZG1hZ2V0X3IoKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X2NoYW5uZWxfZG1hZW5kX3Iodm9pZCkKK3sKKwlyZXR1cm4gMHgyMDsKK30KKyNkZWZpbmUgSE9TVDFYX0NIQU5ORUxfRE1BRU5EIFwKKwlob3N0MXhfY2hhbm5lbF9kbWFlbmRfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2hhbm5lbF9kbWFjdHJsX3Iodm9pZCkKK3sKKwlyZXR1cm4gMHgyNDsKK30KKyNkZWZpbmUgSE9TVDFYX0NIQU5ORUxfRE1BQ1RSTCBcCisJaG9zdDF4X2NoYW5uZWxfZG1hY3RybF9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jaGFubmVsX2RtYWN0cmxfZG1hc3RvcCh2b2lkKQoreworCXJldHVybiAxIDw8IDA7Cit9CisjZGVmaW5lIEhPU1QxWF9DSEFOTkVMX0RNQUNUUkxfRE1BU1RPUCBcCisJaG9zdDF4X2NoYW5uZWxfZG1hY3RybF9kbWFzdG9wKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9jaGFubmVsX2RtYWN0cmxfZG1hc3RvcF92KHUzMiByKQoreworCXJldHVybiAociA+PiAwKSAmIDB4MTsKK30KKyNkZWZpbmUgSE9TVDFYX0NIQU5ORUxfRE1BQ1RSTF9ETUFTVE9QX1YocikgXAorCWhvc3QxeF9jaGFubmVsX2RtYWN0cmxfZG1hc3RvcF92KHIpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2hhbm5lbF9kbWFjdHJsX2RtYWdldHJzdCh2b2lkKQoreworCXJldHVybiAxIDw8IDE7Cit9CisjZGVmaW5lIEhPU1QxWF9DSEFOTkVMX0RNQUNUUkxfRE1BR0VUUlNUIFwKKwlob3N0MXhfY2hhbm5lbF9kbWFjdHJsX2RtYWdldHJzdCgpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfY2hhbm5lbF9kbWFjdHJsX2RtYWluaXRnZXQodm9pZCkKK3sKKwlyZXR1cm4gMSA8PCAyOworfQorI2RlZmluZSBIT1NUMVhfQ0hBTk5FTF9ETUFDVFJMX0RNQUlOSVRHRVQgXAorCWhvc3QxeF9jaGFubmVsX2RtYWN0cmxfZG1haW5pdGdldCgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2h3X2hvc3QxeDA0X3N5bmMuaCBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwNF9zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMjc1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9od19ob3N0MXgwNF9zeW5jLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTlZJRElBIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICovCisKKyAvKgorICAqIEZ1bmN0aW9uIG5hbWluZyBkZXRlcm1pbmVzIGludGVuZGVkIHVzZToKKyAgKgorICAqICAgICA8eD5fcih2b2lkKSA6IFJldHVybnMgdGhlIG9mZnNldCBmb3IgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl93KHZvaWQpIDogUmV0dXJucyB0aGUgd29yZCBvZmZzZXQgZm9yIHdvcmQgKDQgYnl0ZSkgZWxlbWVudCA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl9zKHZvaWQpIDogUmV0dXJucyBzaXplIG9mIGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4gaW4gYml0cy4KKyAgKgorICAqICAgICA8eD5fPHk+X2YodTMyIHYpIDogUmV0dXJucyBhIHZhbHVlIGJhc2VkIG9uICd2JyB3aGljaCBoYXMgYmVlbiBzaGlmdGVkCisgICogICAgICAgICBhbmQgbWFza2VkIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlCisgICogICAgICAgICBjYW4gYmUgfCdkIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvcgorICAqICAgICAgICAgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl88eT5fbSh2b2lkKSA6IFJldHVybnMgYSBtYXNrIGZvciBmaWVsZCA8eT4gb2YgcmVnaXN0ZXIgPHg+LiAgVGhpcworICAqICAgICAgICAgdmFsdWUgY2FuIGJlIH4nZCBhbmQgdGhlbiAmJ2QgdG8gY2xlYXIgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmb3IKKyAgKiAgICAgICAgIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl9mKHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgPHo+IGFmdGVyIGJlaW5nIHNoaWZ0ZWQKKyAgKiAgICAgICAgIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlIGNhbiBiZSB8J2QKKyAgKiAgICAgICAgIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvciA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl92KHUzMiByKSA6IFJldHVybnMgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmcm9tIGEgZnVsbCByZWdpc3RlcgorICAqICAgICAgICAgPHg+IHZhbHVlICdyJyBhZnRlciBiZWluZyBzaGlmdGVkIHRvIHBsYWNlIGl0cyBMU0IgYXQgYml0IDAuCisgICogICAgICAgICBUaGlzIHZhbHVlIGlzIHN1aXRhYmxlIGZvciBkaXJlY3QgY29tcGFyaXNvbiB3aXRoIG90aGVyIHVuc2hpZnRlZAorICAqICAgICAgICAgdmFsdWVzIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl92KHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIDx6PiBkZWZpbmVkIGZvcgorICAqICAgICAgICAgZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4gIFRoaXMgdmFsdWUgaXMgc3VpdGFibGUgZm9yIGRpcmVjdAorICAqICAgICAgICAgY29tcGFyaXNvbiB3aXRoIHVuc2hpZnRlZCB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBmaWVsZCA8eT4KKyAgKiAgICAgICAgIG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKi8KKworI2lmbmRlZiBIT1NUMVhfSFdfSE9TVDFYMDRfU1lOQ19ICisjZGVmaW5lIEhPU1QxWF9IV19IT1NUMVgwNF9TWU5DX0gKKworI2RlZmluZSBSRUdJU1RFUl9TVFJJREUJNAorCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19zeW5jcHRfcih1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIDB4ZjgwICsgaWQgKiBSRUdJU1RFUl9TVFJJREU7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX1NZTkNQVChpZCkgXAorCWhvc3QxeF9zeW5jX3N5bmNwdF9yKGlkKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfc3luY3B0X3RocmVzaF9jcHUwX2ludF9zdGF0dXNfcih1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIDB4ZTgwICsgaWQgKiBSRUdJU1RFUl9TVFJJREU7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX1NZTkNQVF9USFJFU0hfQ1BVMF9JTlRfU1RBVFVTKGlkKSBcCisJaG9zdDF4X3N5bmNfc3luY3B0X3RocmVzaF9jcHUwX2ludF9zdGF0dXNfcihpZCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX3N5bmNwdF90aHJlc2hfaW50X2Rpc2FibGVfcih1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIDB4ZjAwICsgaWQgKiBSRUdJU1RFUl9TVFJJREU7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX1NZTkNQVF9USFJFU0hfSU5UX0RJU0FCTEUoaWQpIFwKKwlob3N0MXhfc3luY19zeW5jcHRfdGhyZXNoX2ludF9kaXNhYmxlX3IoaWQpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19zeW5jcHRfdGhyZXNoX2ludF9lbmFibGVfY3B1MF9yKHVuc2lnbmVkIGludCBpZCkKK3sKKwlyZXR1cm4gMHhmMjAgKyBpZCAqIFJFR0lTVEVSX1NUUklERTsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfU1lOQ1BUX1RIUkVTSF9JTlRfRU5BQkxFX0NQVTAoaWQpIFwKKwlob3N0MXhfc3luY19zeW5jcHRfdGhyZXNoX2ludF9lbmFibGVfY3B1MF9yKGlkKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2Zfc2V0dXBfcih1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gMHhjMDAgKyBjaGFubmVsICogUkVHSVNURVJfU1RSSURFOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DRl9TRVRVUChjaGFubmVsKSBcCisJaG9zdDF4X3N5bmNfY2Zfc2V0dXBfcihjaGFubmVsKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2Zfc2V0dXBfYmFzZV92KHUzMiByKQoreworCXJldHVybiAociA+PiAwKSAmIDB4M2ZmOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DRl9TRVRVUF9CQVNFX1YocikgXAorCWhvc3QxeF9zeW5jX2NmX3NldHVwX2Jhc2VfdihyKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2Zfc2V0dXBfbGltaXRfdih1MzIgcikKK3sKKwlyZXR1cm4gKHIgPj4gMTYpICYgMHgzZmY7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NGX1NFVFVQX0xJTUlUX1YocikgXAorCWhvc3QxeF9zeW5jX2NmX3NldHVwX2xpbWl0X3YocikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2NtZHByb2Nfc3RvcF9yKHZvaWQpCit7CisJcmV0dXJuIDB4YWM7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NNRFBST0NfU1RPUCBcCisJaG9zdDF4X3N5bmNfY21kcHJvY19zdG9wX3IoKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2hfdGVhcmRvd25fcih2b2lkKQoreworCXJldHVybiAweGIwOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DSF9URUFSRE9XTiBcCisJaG9zdDF4X3N5bmNfY2hfdGVhcmRvd25fcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY191c2VjX2Nsa19yKHZvaWQpCit7CisJcmV0dXJuIDB4MWE0OworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19VU0VDX0NMSyBcCisJaG9zdDF4X3N5bmNfdXNlY19jbGtfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19jdHhzd190aW1lb3V0X2NmZ19yKHZvaWQpCit7CisJcmV0dXJuIDB4MWE4OworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DVFhTV19USU1FT1VUX0NGRyBcCisJaG9zdDF4X3N5bmNfY3R4c3dfdGltZW91dF9jZmdfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19pcF9idXN5X3RpbWVvdXRfcih2b2lkKQoreworCXJldHVybiAweDFiYzsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfSVBfQlVTWV9USU1FT1VUIFwKKwlob3N0MXhfc3luY19pcF9idXN5X3RpbWVvdXRfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19tbG9ja19vd25lcl9yKHVuc2lnbmVkIGludCBpZCkKK3sKKwlyZXR1cm4gMHgzNDAgKyBpZCAqIFJFR0lTVEVSX1NUUklERTsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfTUxPQ0tfT1dORVIoaWQpIFwKKwlob3N0MXhfc3luY19tbG9ja19vd25lcl9yKGlkKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfbWxvY2tfb3duZXJfY2hpZF9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZikgPDwgODsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfTUxPQ0tfT1dORVJfQ0hJRF9GKHYpIFwKKwlob3N0MXhfc3luY19tbG9ja19vd25lcl9jaGlkX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX21sb2NrX293bmVyX2NwdV9vd25zX3YodTMyIHIpCit7CisJcmV0dXJuIChyID4+IDEpICYgMHgxOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19NTE9DS19PV05FUl9DUFVfT1dOU19WKHIpIFwKKwlob3N0MXhfc3luY19tbG9ja19vd25lcl9jcHVfb3duc192KHIpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19tbG9ja19vd25lcl9jaF9vd25zX3YodTMyIHIpCit7CisJcmV0dXJuIChyID4+IDApICYgMHgxOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19NTE9DS19PV05FUl9DSF9PV05TX1YocikgXAorCWhvc3QxeF9zeW5jX21sb2NrX293bmVyX2NoX293bnNfdihyKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfc3luY3B0X2ludF90aHJlc2hfcih1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIDB4MTM4MCArIGlkICogUkVHSVNURVJfU1RSSURFOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19TWU5DUFRfSU5UX1RIUkVTSChpZCkgXAorCWhvc3QxeF9zeW5jX3N5bmNwdF9pbnRfdGhyZXNoX3IoaWQpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19zeW5jcHRfYmFzZV9yKHVuc2lnbmVkIGludCBpZCkKK3sKKwlyZXR1cm4gMHg2MDAgKyBpZCAqIFJFR0lTVEVSX1NUUklERTsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfU1lOQ1BUX0JBU0UoaWQpIFwKKwlob3N0MXhfc3luY19zeW5jcHRfYmFzZV9yKGlkKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfc3luY3B0X2NwdV9pbmNyX3IodW5zaWduZWQgaW50IGlkKQoreworCXJldHVybiAweGY2MCArIGlkICogUkVHSVNURVJfU1RSSURFOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19TWU5DUFRfQ1BVX0lOQ1IoaWQpIFwKKwlob3N0MXhfc3luY19zeW5jcHRfY3B1X2luY3JfcihpZCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2NicmVhZF9yKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiAweGM4MCArIGNoYW5uZWwgKiBSRUdJU1RFUl9TVFJJREU7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NCUkVBRChjaGFubmVsKSBcCisJaG9zdDF4X3N5bmNfY2JyZWFkX3IoY2hhbm5lbCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2NmcGVla19jdHJsX3Iodm9pZCkKK3sKKwlyZXR1cm4gMHg3NGM7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NGUEVFS19DVFJMIFwKKwlob3N0MXhfc3luY19jZnBlZWtfY3RybF9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2NmcGVla19jdHJsX2FkZHJfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweDNmZikgPDwgMDsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfQ0ZQRUVLX0NUUkxfQUREUl9GKHYpIFwKKwlob3N0MXhfc3luY19jZnBlZWtfY3RybF9hZGRyX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2NmcGVla19jdHJsX2NoYW5ucl9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZikgPDwgMTY7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NGUEVFS19DVFJMX0NIQU5OUl9GKHYpIFwKKwlob3N0MXhfc3luY19jZnBlZWtfY3RybF9jaGFubnJfZih2KQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2ZwZWVrX2N0cmxfZW5hX2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHgxKSA8PCAzMTsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfQ0ZQRUVLX0NUUkxfRU5BX0YodikgXAorCWhvc3QxeF9zeW5jX2NmcGVla19jdHJsX2VuYV9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19jZnBlZWtfcmVhZF9yKHZvaWQpCit7CisJcmV0dXJuIDB4NzUwOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DRlBFRUtfUkVBRCBcCisJaG9zdDF4X3N5bmNfY2ZwZWVrX3JlYWRfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19jZnBlZWtfcHRyc19yKHZvaWQpCit7CisJcmV0dXJuIDB4NzU0OworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DRlBFRUtfUFRSUyBcCisJaG9zdDF4X3N5bmNfY2ZwZWVrX3B0cnNfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19jZnBlZWtfcHRyc19jZl9yZF9wdHJfdih1MzIgcikKK3sKKwlyZXR1cm4gKHIgPj4gMCkgJiAweDNmZjsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfQ0ZQRUVLX1BUUlNfQ0ZfUkRfUFRSX1YocikgXAorCWhvc3QxeF9zeW5jX2NmcGVla19wdHJzX2NmX3JkX3B0cl92KHIpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfc3luY19jZnBlZWtfcHRyc19jZl93cl9wdHJfdih1MzIgcikKK3sKKwlyZXR1cm4gKHIgPj4gMTYpICYgMHgzZmY7Cit9CisjZGVmaW5lIEhPU1QxWF9TWU5DX0NGUEVFS19QVFJTX0NGX1dSX1BUUl9WKHIpIFwKKwlob3N0MXhfc3luY19jZnBlZWtfcHRyc19jZl93cl9wdHJfdihyKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2JzdGF0X3IodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIDB4Y2MwICsgY2hhbm5lbCAqIFJFR0lTVEVSX1NUUklERTsKK30KKyNkZWZpbmUgSE9TVDFYX1NZTkNfQ0JTVEFUKGNoYW5uZWwpIFwKKwlob3N0MXhfc3luY19jYnN0YXRfcihjaGFubmVsKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3N5bmNfY2JzdGF0X2Nib2Zmc2V0X3YodTMyIHIpCit7CisJcmV0dXJuIChyID4+IDApICYgMHhmZmZmOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DQlNUQVRfQ0JPRkZTRVRfVihyKSBcCisJaG9zdDF4X3N5bmNfY2JzdGF0X2Nib2Zmc2V0X3YocikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF9zeW5jX2Nic3RhdF9jYmNsYXNzX3YodTMyIHIpCit7CisJcmV0dXJuIChyID4+IDE2KSAmIDB4M2ZmOworfQorI2RlZmluZSBIT1NUMVhfU1lOQ19DQlNUQVRfQ0JDTEFTU19WKHIpIFwKKwlob3N0MXhfc3luY19jYnN0YXRfY2JjbGFzc192KHIpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2h3X2hvc3QxeDA0X3VjbGFzcy5oIGIvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2h3X2hvc3QxeDA0X3VjbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDYwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaHdfaG9zdDF4MDRfdWNsYXNzLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTlZJRElBIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICovCisKKyAvKgorICAqIEZ1bmN0aW9uIG5hbWluZyBkZXRlcm1pbmVzIGludGVuZGVkIHVzZToKKyAgKgorICAqICAgICA8eD5fcih2b2lkKSA6IFJldHVybnMgdGhlIG9mZnNldCBmb3IgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl93KHZvaWQpIDogUmV0dXJucyB0aGUgd29yZCBvZmZzZXQgZm9yIHdvcmQgKDQgYnl0ZSkgZWxlbWVudCA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl9zKHZvaWQpIDogUmV0dXJucyBzaXplIG9mIGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4gaW4gYml0cy4KKyAgKgorICAqICAgICA8eD5fPHk+X2YodTMyIHYpIDogUmV0dXJucyBhIHZhbHVlIGJhc2VkIG9uICd2JyB3aGljaCBoYXMgYmVlbiBzaGlmdGVkCisgICogICAgICAgICBhbmQgbWFza2VkIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlCisgICogICAgICAgICBjYW4gYmUgfCdkIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvcgorICAqICAgICAgICAgcmVnaXN0ZXIgPHg+LgorICAqCisgICogICAgIDx4Pl88eT5fbSh2b2lkKSA6IFJldHVybnMgYSBtYXNrIGZvciBmaWVsZCA8eT4gb2YgcmVnaXN0ZXIgPHg+LiAgVGhpcworICAqICAgICAgICAgdmFsdWUgY2FuIGJlIH4nZCBhbmQgdGhlbiAmJ2QgdG8gY2xlYXIgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmb3IKKyAgKiAgICAgICAgIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl9mKHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgPHo+IGFmdGVyIGJlaW5nIHNoaWZ0ZWQKKyAgKiAgICAgICAgIHRvIHBsYWNlIGl0IGF0IGZpZWxkIDx5PiBvZiByZWdpc3RlciA8eD4uICBUaGlzIHZhbHVlIGNhbiBiZSB8J2QKKyAgKiAgICAgICAgIHdpdGggb3RoZXJzIHRvIHByb2R1Y2UgYSBmdWxsIHJlZ2lzdGVyIHZhbHVlIGZvciA8eD4uCisgICoKKyAgKiAgICAgPHg+Xzx5Pl92KHUzMiByKSA6IFJldHVybnMgdGhlIHZhbHVlIG9mIGZpZWxkIDx5PiBmcm9tIGEgZnVsbCByZWdpc3RlcgorICAqICAgICAgICAgPHg+IHZhbHVlICdyJyBhZnRlciBiZWluZyBzaGlmdGVkIHRvIHBsYWNlIGl0cyBMU0IgYXQgYml0IDAuCisgICogICAgICAgICBUaGlzIHZhbHVlIGlzIHN1aXRhYmxlIGZvciBkaXJlY3QgY29tcGFyaXNvbiB3aXRoIG90aGVyIHVuc2hpZnRlZAorICAqICAgICAgICAgdmFsdWVzIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKgorICAqICAgICA8eD5fPHk+Xzx6Pl92KHZvaWQpIDogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIDx6PiBkZWZpbmVkIGZvcgorICAqICAgICAgICAgZmllbGQgPHk+IG9mIHJlZ2lzdGVyIDx4Pi4gIFRoaXMgdmFsdWUgaXMgc3VpdGFibGUgZm9yIGRpcmVjdAorICAqICAgICAgICAgY29tcGFyaXNvbiB3aXRoIHVuc2hpZnRlZCB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBmaWVsZCA8eT4KKyAgKiAgICAgICAgIG9mIHJlZ2lzdGVyIDx4Pi4KKyAgKi8KKworI2lmbmRlZiBIT1NUMVhfSFdfSE9TVDFYMDRfVUNMQVNTX0gKKyNkZWZpbmUgSE9TVDFYX0hXX0hPU1QxWDA0X1VDTEFTU19ICisKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfcih2b2lkKQoreworCXJldHVybiAweDA7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfSU5DUl9TWU5DUFQgXAorCWhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2NvbmRfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGZmKSA8PCA4OworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX0lOQ1JfU1lOQ1BUX0NPTkRfRih2KSBcCisJaG9zdDF4X3VjbGFzc19pbmNyX3N5bmNwdF9jb25kX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfaW5keF9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZmYpIDw8IDA7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfSU5DUl9TWU5DUFRfSU5EWF9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2luZHhfZih2KQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9yKHZvaWQpCit7CisJcmV0dXJuIDB4ODsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19XQUlUX1NZTkNQVCBcCisJaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfaW5keF9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZmYpIDw8IDI0OworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX1dBSVRfU1lOQ1BUX0lORFhfRih2KSBcCisJaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9pbmR4X2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfdGhyZXNoX2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHhmZmZmZmYpIDw8IDA7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfV0FJVF9TWU5DUFRfVEhSRVNIX0YodikgXAorCWhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfdGhyZXNoX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfYmFzZV9yKHZvaWQpCit7CisJcmV0dXJuIDB4OTsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19XQUlUX1NZTkNQVF9CQVNFIFwKKwlob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2VfcigpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2VfaW5keF9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZmYpIDw8IDI0OworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX1dBSVRfU1lOQ1BUX0JBU0VfSU5EWF9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2VfaW5keF9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2VfYmFzZV9pbmR4X2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHhmZikgPDwgMTY7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfV0FJVF9TWU5DUFRfQkFTRV9CQVNFX0lORFhfRih2KSBcCisJaG9zdDF4X3VjbGFzc193YWl0X3N5bmNwdF9iYXNlX2Jhc2VfaW5keF9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX3dhaXRfc3luY3B0X2Jhc2Vfb2Zmc2V0X2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHhmZmZmKSA8PCAwOworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX1dBSVRfU1lOQ1BUX0JBU0VfT0ZGU0VUX0YodikgXAorCWhvc3QxeF91Y2xhc3Nfd2FpdF9zeW5jcHRfYmFzZV9vZmZzZXRfZih2KQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX3Iodm9pZCkKK3sKKwlyZXR1cm4gMHhiOworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX0xPQURfU1lOQ1BUX0JBU0UgXAorCWhvc3QxeF91Y2xhc3NfbG9hZF9zeW5jcHRfYmFzZV9yKCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfbG9hZF9zeW5jcHRfYmFzZV9iYXNlX2luZHhfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGZmKSA8PCAyNDsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19MT0FEX1NZTkNQVF9CQVNFX0JBU0VfSU5EWF9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2xvYWRfc3luY3B0X2Jhc2VfYmFzZV9pbmR4X2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfbG9hZF9zeW5jcHRfYmFzZV92YWx1ZV9mKHUzMiB2KQoreworCXJldHVybiAodiAmIDB4ZmZmZmZmKSA8PCAwOworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX0xPQURfU1lOQ1BUX0JBU0VfVkFMVUVfRih2KSBcCisJaG9zdDF4X3VjbGFzc19sb2FkX3N5bmNwdF9iYXNlX3ZhbHVlX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfYmFzZV9iYXNlX2luZHhfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGZmKSA8PCAyNDsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19JTkNSX1NZTkNQVF9CQVNFX0JBU0VfSU5EWF9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2Jhc2VfYmFzZV9pbmR4X2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5jcl9zeW5jcHRfYmFzZV9vZmZzZXRfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGZmZmZmZikgPDwgMDsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19JTkNSX1NZTkNQVF9CQVNFX09GRlNFVF9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2luY3Jfc3luY3B0X2Jhc2Vfb2Zmc2V0X2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5kb2ZmX3Iodm9pZCkKK3sKKwlyZXR1cm4gMHgyZDsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19JTkRPRkYgXAorCWhvc3QxeF91Y2xhc3NfaW5kb2ZmX3IoKQorc3RhdGljIGlubGluZSB1MzIgaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kYmVfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGYpIDw8IDI4OworfQorI2RlZmluZSBIT1NUMVhfVUNMQVNTX0lORE9GRl9JTkRCRV9GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2luZG9mZl9pbmRiZV9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX2luZG9mZl9hdXRvaW5jX2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHgxKSA8PCAyNzsKK30KKyNkZWZpbmUgSE9TVDFYX1VDTEFTU19JTkRPRkZfQVVUT0lOQ19GKHYpIFwKKwlob3N0MXhfdWNsYXNzX2luZG9mZl9hdXRvaW5jX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5kb2ZmX2luZG1vZGlkX2YodTMyIHYpCit7CisJcmV0dXJuICh2ICYgMHhmZikgPDwgMTg7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfSU5ET0ZGX0lORE1PRElEX0YodikgXAorCWhvc3QxeF91Y2xhc3NfaW5kb2ZmX2luZG1vZGlkX2YodikKK3N0YXRpYyBpbmxpbmUgdTMyIGhvc3QxeF91Y2xhc3NfaW5kb2ZmX2luZHJvZmZzZXRfZih1MzIgdikKK3sKKwlyZXR1cm4gKHYgJiAweGZmZmYpIDw8IDI7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfSU5ET0ZGX0lORFJPRkZTRVRfRih2KSBcCisJaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kcm9mZnNldF9mKHYpCitzdGF0aWMgaW5saW5lIHUzMiBob3N0MXhfdWNsYXNzX2luZG9mZl9yd25fcmVhZF92KHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisjZGVmaW5lIEhPU1QxWF9VQ0xBU1NfSU5ET0ZGX0lORFJPRkZTRVRfRih2KSBcCisJaG9zdDF4X3VjbGFzc19pbmRvZmZfaW5kcm9mZnNldF9mKHYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2ludHJfaHcuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9ody9pbnRyX2h3LmMKaW5kZXggYjI2ZGNjOC4uZGI5MDE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L2h3L2ludHJfaHcuYworKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvaHcvaW50cl9ody5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgIi4uL2ludHIuaCIKICNpbmNsdWRlICIuLi9kZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2hvc3QxeC9qb2IuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9qb2IuYwppbmRleCBkZTVlYzMzLi4xMTQ2ZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9ob3N0MXgvam9iLmMKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L2pvYi5jCkBAIC03NSwxMiArNzUsMTQgQEAKIAogCXJldHVybiBqb2I7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9qb2JfYWxsb2MpOwogCiBzdHJ1Y3QgaG9zdDF4X2pvYiAqaG9zdDF4X2pvYl9nZXQoc3RydWN0IGhvc3QxeF9qb2IgKmpvYikKIHsKIAlrcmVmX2dldCgmam9iLT5yZWYpOwogCXJldHVybiBqb2I7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9qb2JfZ2V0KTsKIAogc3RhdGljIHZvaWQgam9iX2ZyZWUoc3RydWN0IGtyZWYgKnJlZikKIHsKQEAgLTkzLDYgKzk1LDcgQEAKIHsKIAlrcmVmX3B1dCgmam9iLT5yZWYsIGpvYl9mcmVlKTsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X2pvYl9wdXQpOwogCiB2b2lkIGhvc3QxeF9qb2JfYWRkX2dhdGhlcihzdHJ1Y3QgaG9zdDF4X2pvYiAqam9iLCBzdHJ1Y3QgaG9zdDF4X2JvICpibywKIAkJCSAgIHUzMiB3b3JkcywgdTMyIG9mZnNldCkKQEAgLTEwNCw2ICsxMDcsNyBAQAogCWN1cl9nYXRoZXItPm9mZnNldCA9IG9mZnNldDsKIAlqb2ItPm51bV9nYXRoZXJzKys7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9qb2JfYWRkX2dhdGhlcik7CiAKIC8qCiAgKiBOVUxMIGFuIGFscmVhZHkgc2F0aXNmaWVkIFdBSVRfU1lOQ1BUIGhvc3QgbWV0aG9kLCBieSBwYXRjaGluZyBpdHMKQEAgLTU2MCw2ICs1NjQsNyBAQAogCiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X2pvYl9waW4pOwogCiB2b2lkIGhvc3QxeF9qb2JfdW5waW4oc3RydWN0IGhvc3QxeF9qb2IgKmpvYikKIHsKQEAgLTU3Nyw2ICs1ODIsNyBAQAogCQkJCSAgICAgIGpvYi0+Z2F0aGVyX2NvcHlfbWFwcGVkLAogCQkJCSAgICAgIGpvYi0+Z2F0aGVyX2NvcHkpOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfam9iX3VucGluKTsKIAogLyoKICAqIERlYnVnIHJvdXRpbmUgdXNlZCB0byBkdW1wIGpvYiBlbnRyaWVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvbWlwaS5jIGIvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODgyZWExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kCisgKiB0aGF0IHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGNvcHlyaWdodCBob2xkZXJzIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMKKyAqIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hvc3QxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJkZXYuaCIKKworI2RlZmluZSBNSVBJX0NBTF9DVFJMCQkJMHgwMAorI2RlZmluZSBNSVBJX0NBTF9DVFJMX1NUQVJUCQkoMSA8PCAwKQorCisjZGVmaW5lIE1JUElfQ0FMX0FVVE9DQUxfQ1RSTAkJMHgwMQorCisjZGVmaW5lIE1JUElfQ0FMX1NUQVRVUwkJCTB4MDIKKyNkZWZpbmUgTUlQSV9DQUxfU1RBVFVTX0RPTkUJCSgxIDw8IDE2KQorI2RlZmluZSBNSVBJX0NBTF9TVEFUVVNfQUNUSVZFCQkoMSA8PCAgMCkKKworI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfQ1NJQQkJMHgwNQorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfQ1NJQgkJMHgwNgorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfQ1NJQwkJMHgwNworI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfQ1NJRAkJMHgwOAorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfQ1NJRQkJMHgwOQorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfRFNJQQkJMHgwZQorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfRFNJQgkJMHgwZgorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfRFNJQwkJMHgxMAorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfRFNJRAkJMHgxMQorCisjZGVmaW5lIE1JUElfQ0FMX0NPTkZJR19TRUxFQ1QJCSgxIDw8IDIxKQorI2RlZmluZSBNSVBJX0NBTF9DT05GSUdfSFNQRE9TKHgpCSgoKHgpICYgMHgxZikgPDwgMTYpCisjZGVmaW5lIE1JUElfQ0FMX0NPTkZJR19IU1BVT1MoeCkJKCgoeCkgJiAweDFmKSA8PCAgOCkKKyNkZWZpbmUgTUlQSV9DQUxfQ09ORklHX1RFUk1PUyh4KQkoKCh4KSAmIDB4MWYpIDw8ICAwKQorCisjZGVmaW5lIE1JUElfQ0FMX0JJQVNfUEFEX0NGRzAJCTB4MTYKKyNkZWZpbmUgTUlQSV9DQUxfQklBU19QQURfUERWQ0xBTVAJKDEgPDwgMSkKKyNkZWZpbmUgTUlQSV9DQUxfQklBU19QQURfRV9WQ0xBTVBfUkVGCSgxIDw8IDApCisKKyNkZWZpbmUgTUlQSV9DQUxfQklBU19QQURfQ0ZHMQkJMHgxNworCisjZGVmaW5lIE1JUElfQ0FMX0JJQVNfUEFEX0NGRzIJCTB4MTgKKyNkZWZpbmUgTUlQSV9DQUxfQklBU19QQURfUERWUkVHCSgxIDw8IDEpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW9kdWxlIHsKKwl1bnNpZ25lZCBsb25nIHJlZzsKK30gbW9kdWxlc1tdID0geworCXsgLnJlZyA9IE1JUElfQ0FMX0NPTkZJR19DU0lBIH0sCisJeyAucmVnID0gTUlQSV9DQUxfQ09ORklHX0NTSUIgfSwKKwl7IC5yZWcgPSBNSVBJX0NBTF9DT05GSUdfQ1NJQyB9LAorCXsgLnJlZyA9IE1JUElfQ0FMX0NPTkZJR19DU0lEIH0sCisJeyAucmVnID0gTUlQSV9DQUxfQ09ORklHX0NTSUUgfSwKKwl7IC5yZWcgPSBNSVBJX0NBTF9DT05GSUdfRFNJQSB9LAorCXsgLnJlZyA9IE1JUElfQ0FMX0NPTkZJR19EU0lCIH0sCisJeyAucmVnID0gTUlQSV9DQUxfQ09ORklHX0RTSUMgfSwKKwl7IC5yZWcgPSBNSVBJX0NBTF9DT05GSUdfRFNJRCB9LAorfTsKKworc3RydWN0IHRlZ3JhX21pcGkgeworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgY2xrICpjbGs7Cit9OworCitzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHRlZ3JhX21pcGkgKm1pcGk7CisJc3RydWN0IGRldmljZSAqZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgcGFkczsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0ZWdyYV9taXBpX3JlYWRsKHN0cnVjdCB0ZWdyYV9taXBpICptaXBpLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXJldHVybiByZWFkbChtaXBpLT5yZWdzICsgKHJlZyA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZWdyYV9taXBpX3dyaXRlbChzdHJ1Y3QgdGVncmFfbWlwaSAqbWlwaSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXdyaXRlbCh2YWx1ZSwgbWlwaS0+cmVncyArIChyZWcgPDwgMikpOworfQorCitzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKnRlZ3JhX21pcGlfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldmljZS0+b2Zfbm9kZTsKKwlzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CisJaW50IGVycjsKKworCWVyciA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAibnZpZGlhLG1pcGktY2FsaWJyYXRlIiwKKwkJCQkJICIjbnZpZGlhLG1pcGktY2FsaWJyYXRlLWNlbGxzIiwgMCwKKwkJCQkJICZhcmdzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlvZl9ub2RlX3B1dChhcmdzLm5wKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2LT5wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShhcmdzLm5wKTsKKwlpZiAoIWRldi0+cGRldikgeworCQlvZl9ub2RlX3B1dChhcmdzLm5wKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlOworCX0KKworCW9mX25vZGVfcHV0KGFyZ3MubnApOworCisJZGV2LT5taXBpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2LT5wZGV2KTsKKwlpZiAoIWRldi0+bWlwaSkgeworCQllcnIgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIHBkZXZfcHV0OworCX0KKworCWRldi0+cGFkcyA9IGFyZ3MuYXJnc1swXTsKKwlkZXYtPmRldmljZSA9IGRldmljZTsKKworCXJldHVybiBkZXY7CisKK3BkZXZfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQoZGV2LT5wZGV2KTsKK2ZyZWU6CisJa2ZyZWUoZGV2KTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTCh0ZWdyYV9taXBpX3JlcXVlc3QpOworCit2b2lkIHRlZ3JhX21pcGlfZnJlZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGRldmljZS0+cGRldik7CisJa2ZyZWUoZGV2aWNlKTsKK30KK0VYUE9SVF9TWU1CT0wodGVncmFfbWlwaV9mcmVlKTsKKworc3RhdGljIGludCB0ZWdyYV9taXBpX3dhaXQoc3RydWN0IHRlZ3JhX21pcGkgKm1pcGkpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXZhbHVlID0gdGVncmFfbWlwaV9yZWFkbChtaXBpLCBNSVBJX0NBTF9TVEFUVVMpOworCQlpZiAoKHZhbHVlICYgTUlQSV9DQUxfU1RBVFVTX0FDVElWRSkgPT0gMCAmJgorCQkgICAgKHZhbHVlICYgTUlQSV9DQUxfU1RBVFVTX0RPTkUpICE9IDApCisJCQlyZXR1cm4gMDsKKworCQl1c2xlZXBfcmFuZ2UoMTAsIDUwKTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworaW50IHRlZ3JhX21pcGlfY2FsaWJyYXRlKHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWVyciA9IGNsa19lbmFibGUoZGV2aWNlLT5taXBpLT5jbGspOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmZGV2aWNlLT5taXBpLT5sb2NrKTsKKworCXZhbHVlID0gdGVncmFfbWlwaV9yZWFkbChkZXZpY2UtPm1pcGksIE1JUElfQ0FMX0JJQVNfUEFEX0NGRzApOworCXZhbHVlICY9IH5NSVBJX0NBTF9CSUFTX1BBRF9QRFZDTEFNUDsKKwl2YWx1ZSB8PSBNSVBJX0NBTF9CSUFTX1BBRF9FX1ZDTEFNUF9SRUY7CisJdGVncmFfbWlwaV93cml0ZWwoZGV2aWNlLT5taXBpLCB2YWx1ZSwgTUlQSV9DQUxfQklBU19QQURfQ0ZHMCk7CisKKwl2YWx1ZSA9IHRlZ3JhX21pcGlfcmVhZGwoZGV2aWNlLT5taXBpLCBNSVBJX0NBTF9CSUFTX1BBRF9DRkcyKTsKKwl2YWx1ZSAmPSB+TUlQSV9DQUxfQklBU19QQURfUERWUkVHOworCXRlZ3JhX21pcGlfd3JpdGVsKGRldmljZS0+bWlwaSwgdmFsdWUsIE1JUElfQ0FMX0JJQVNfUEFEX0NGRzIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kdWxlcyk7IGkrKykgeworCQlpZiAoZGV2aWNlLT5wYWRzICYgQklUKGkpKQorCQkJdmFsdWUgPSBNSVBJX0NBTF9DT05GSUdfU0VMRUNUIHwKKwkJCQlNSVBJX0NBTF9DT05GSUdfSFNQRE9TKDApIHwKKwkJCQlNSVBJX0NBTF9DT05GSUdfSFNQVU9TKDQpIHwKKwkJCQlNSVBJX0NBTF9DT05GSUdfVEVSTU9TKDUpOworCQllbHNlCisJCQl2YWx1ZSA9IDA7CisKKwkJdGVncmFfbWlwaV93cml0ZWwoZGV2aWNlLT5taXBpLCB2YWx1ZSwgbW9kdWxlc1tpXS5yZWcpOworCX0KKworCXRlZ3JhX21pcGlfd3JpdGVsKGRldmljZS0+bWlwaSwgTUlQSV9DQUxfQ1RSTF9TVEFSVCwgTUlQSV9DQUxfQ1RSTCk7CisKKwllcnIgPSB0ZWdyYV9taXBpX3dhaXQoZGV2aWNlLT5taXBpKTsKKworCW11dGV4X3VubG9jaygmZGV2aWNlLT5taXBpLT5sb2NrKTsKKwljbGtfZGlzYWJsZShkZXZpY2UtPm1pcGktPmNsayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh0ZWdyYV9taXBpX2NhbGlicmF0ZSk7CisKK3N0YXRpYyBpbnQgdGVncmFfbWlwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV9taXBpICptaXBpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnI7CisKKwltaXBpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWlwaSksIEdGUF9LRVJORUwpOworCWlmICghbWlwaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1pcGktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1pcGktPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihtaXBpLT5yZWdzKTsKKworCW11dGV4X2luaXQoJm1pcGktPmxvY2spOworCisJbWlwaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIobWlwaS0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWlwaS0+Y2xrKTsKKwl9CisKKwllcnIgPSBjbGtfcHJlcGFyZShtaXBpLT5jbGspOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWlwaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV9taXBpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV9taXBpICptaXBpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljbGtfdW5wcmVwYXJlKG1pcGktPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfbWlwaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LW1pcGkiLCB9LAorCXsgfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfbWlwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGVncmEtbWlwaSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRlZ3JhX21pcGlfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB0ZWdyYV9taXBpX3Byb2JlLAorCS5yZW1vdmUgPSB0ZWdyYV9taXBpX3JlbW92ZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvc3luY3B0LmMgYi9kcml2ZXJzL2dwdS9ob3N0MXgvc3luY3B0LmMKaW5kZXggMTU5YzQ3OS4uYmZiMDlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L3N5bmNwdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9zeW5jcHQuYwpAQCAtOTMsNiArOTMsNyBAQAogewogCXJldHVybiBzcC0+aWQ7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9zeW5jcHRfaWQpOwogCiAvKgogICogVXBkYXRlcyB0aGUgdmFsdWUgc2VudCB0byBoYXJkd2FyZS4KQEAgLTE2OCw2ICsxNjksNyBAQAogewogCXJldHVybiBob3N0MXhfaHdfc3luY3B0X2NwdV9pbmNyKHNwLT5ob3N0LCBzcCk7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9zeW5jcHRfaW5jcik7CiAKIC8qCiAgKiBVcGRhdGVkIHN5bmMgcG9pbnQgZm9ybSBoYXJkd2FyZSwgYW5kIHJldHVybnMgdHJ1ZSBpZiBzeW5jcG9pbnQgaXMgZXhwaXJlZCwKQEAgLTM3Nyw2ICszNzksNyBAQAogCXN0cnVjdCBob3N0MXggKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwogCXJldHVybiBob3N0MXhfc3luY3B0X2FsbG9jKGhvc3QsIGRldiwgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfc3luY3B0X3JlcXVlc3QpOwogCiB2b2lkIGhvc3QxeF9zeW5jcHRfZnJlZShzdHJ1Y3QgaG9zdDF4X3N5bmNwdCAqc3ApCiB7CkBAIC0zOTAsNiArMzkzLDcgQEAKIAlzcC0+bmFtZSA9IE5VTEw7CiAJc3AtPmNsaWVudF9tYW5hZ2VkID0gZmFsc2U7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9zeW5jcHRfZnJlZSk7CiAKIHZvaWQgaG9zdDF4X3N5bmNwdF9kZWluaXQoc3RydWN0IGhvc3QxeCAqaG9zdCkKIHsKQEAgLTQwOCw2ICs0MTIsNyBAQAogCXNtcF9ybWIoKTsKIAlyZXR1cm4gKHUzMilhdG9taWNfcmVhZCgmc3AtPm1heF92YWwpOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfc3luY3B0X3JlYWRfbWF4KTsKIAogLyoKICAqIFJlYWQgbWluLCB3aGljaCBpcyBhIHNoYWRvdyBvZiB0aGUgY3VycmVudCBzeW5jIHBvaW50IHZhbHVlIGluIGhhcmR3YXJlLgpAQCAtNDE3LDYgKzQyMiw3IEBACiAJc21wX3JtYigpOwogCXJldHVybiAodTMyKWF0b21pY19yZWFkKCZzcC0+bWluX3ZhbCk7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9zeW5jcHRfcmVhZF9taW4pOwogCiBpbnQgaG9zdDF4X3N5bmNwdF9uYl9wdHMoc3RydWN0IGhvc3QxeCAqaG9zdCkKIHsKQEAgLTQzOSwxMyArNDQ1LDE2IEBACiAJCXJldHVybiBOVUxMOwogCXJldHVybiBob3N0LT5zeW5jcHQgKyBpZDsKIH0KK0VYUE9SVF9TWU1CT0woaG9zdDF4X3N5bmNwdF9nZXQpOwogCiBzdHJ1Y3QgaG9zdDF4X3N5bmNwdF9iYXNlICpob3N0MXhfc3luY3B0X2dldF9iYXNlKHN0cnVjdCBob3N0MXhfc3luY3B0ICpzcCkKIHsKIAlyZXR1cm4gc3AgPyBzcC0+YmFzZSA6IE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKGhvc3QxeF9zeW5jcHRfZ2V0X2Jhc2UpOwogCiB1MzIgaG9zdDF4X3N5bmNwdF9iYXNlX2lkKHN0cnVjdCBob3N0MXhfc3luY3B0X2Jhc2UgKmJhc2UpCiB7CiAJcmV0dXJuIGJhc2UtPmlkOwogfQorRVhQT1JUX1NZTUJPTChob3N0MXhfc3luY3B0X2Jhc2VfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggMDI2YWIwZi4uM2JmYWMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0yMTE4LDYgKzIxMTgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NJREMsIDB4MDEwMykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lHTkFMLCBVU0JfREVWSUNFX0lEX0NZR05BTF9SQURJT19TSTQ3MFgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZR05BTCwgVVNCX0RFVklDRV9JRF9DWUdOQUxfUkFESU9fU0k0NzEzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IDkyYjQwYzAuLjVhNTI0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTI0MSw2ICsyNDEsOCBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NZR05BTAkJMHgxMGM0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lHTkFMX1JBRElPX1NJNDcwWAkweDgxOGEKIAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZR05BTF9SQURJT19TSTQ3MTMgICAgICAgMHg4MjQ0CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTCQkweDA0YjQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFCTB4MDAwMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfSElEQ09NCTB4NTUwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9jaGFubmVsLmMgYi9kcml2ZXJzL2h2L2NoYW5uZWwuYwppbmRleCBjZWE2MjNjLi42OWVhMzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2NoYW5uZWwuYworKysgYi9kcml2ZXJzL2h2L2NoYW5uZWwuYwpAQCAtMjA5LDcgKzIwOSw2IEBACiB7CiAJaW50IGk7CiAJaW50IHBhZ2Vjb3VudDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcGZuOwogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqZ3BhZGxfaGVhZGVyOwogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKmdwYWRsX2JvZHk7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqbXNnaGVhZGVyOwpAQCAtMjE5LDcgKzIxOCw2IEBACiAJaW50IHBmbnN1bSwgcGZuY291bnQsIHBmbmxlZnQsIHBmbmN1cnIsIHBmbnNpemU7CiAKIAlwYWdlY291bnQgPSBzaXplID4+IFBBR0VfU0hJRlQ7Ci0JcGZuID0gdmlydF90b19waHlzKGtidWZmZXIpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKiBkbyB3ZSBuZWVkIGEgZ3BhZGwgYm9keSBtc2cgKi8KIAlwZm5zaXplID0gTUFYX1NJWkVfQ0hBTk5FTF9NRVNTQUdFIC0KQEAgLTI0OCw3ICsyNDYsOCBAQAogCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLmJ5dGVfb2Zmc2V0ID0gMDsKIAkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5ieXRlX2NvdW50ID0gc2l6ZTsKIAkJZm9yIChpID0gMDsgaSA8IHBmbmNvdW50OyBpKyspCi0JCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLnBmbl9hcnJheVtpXSA9IHBmbitpOworCQkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5wZm5fYXJyYXlbaV0gPSBzbG93X3ZpcnRfdG9fcGh5cygKKwkJCQlrYnVmZmVyICsgUEFHRV9TSVpFICogaSkgPj4gUEFHRV9TSElGVDsKIAkJKm1zZ2luZm8gPSBtc2doZWFkZXI7CiAJCSptZXNzYWdlY291bnQgPSAxOwogCkBAIC0zMDEsNyArMzAwLDkgQEAKIAkJCSAqIHNvIHRoZSBoeXBlcnZpc29yIGd1cmFudGVlcyB0aGF0IHRoaXMgaXMgb2suCiAJCQkgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBwZm5jdXJyOyBpKyspCi0JCQkJZ3BhZGxfYm9keS0+cGZuW2ldID0gcGZuICsgcGZuc3VtICsgaTsKKwkJCQlncGFkbF9ib2R5LT5wZm5baV0gPSBzbG93X3ZpcnRfdG9fcGh5cygKKwkJCQkJa2J1ZmZlciArIFBBR0VfU0laRSAqIChwZm5zdW0gKyBpKSkgPj4KKwkJCQkJUEFHRV9TSElGVDsKIAogCQkJLyogYWRkIHRvIG1zZyBoZWFkZXIgKi8KIAkJCWxpc3RfYWRkX3RhaWwoJm1zZ2JvZHktPm1zZ2xpc3RlbnRyeSwKQEAgLTMyNyw3ICszMjgsOCBAQAogCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLmJ5dGVfb2Zmc2V0ID0gMDsKIAkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5ieXRlX2NvdW50ID0gc2l6ZTsKIAkJZm9yIChpID0gMDsgaSA8IHBhZ2Vjb3VudDsgaSsrKQotCQkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5wZm5fYXJyYXlbaV0gPSBwZm4raTsKKwkJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0ucGZuX2FycmF5W2ldID0gc2xvd192aXJ0X3RvX3BoeXMoCisJCQkJa2J1ZmZlciArIFBBR0VfU0laRSAqIGkpID4+IFBBR0VfU0hJRlQ7CiAKIAkJKm1zZ2luZm8gPSBtc2doZWFkZXI7CiAJCSptZXNzYWdlY291bnQgPSAxOwpAQCAtMzQ0LDcgKzM0Niw3IEBACiAgKiB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwgLSBFc3RhYmlzaCBhIEdQQURMIGZvciB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgogICoKICAqIEBjaGFubmVsOiBhIGNoYW5uZWwKLSAqIEBrYnVmZmVyOiBmcm9tIGttYWxsb2MKKyAqIEBrYnVmZmVyOiBmcm9tIGttYWxsb2Mgb3Igdm1hbGxvYwogICogQHNpemU6IHBhZ2Utc2l6ZSBtdWx0aXBsZQogICogQGdwYWRsX2hhbmRsZTogc29tZSBmdW5reSB0aGluZwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggNTJkNTQ4Zi4uNWNlNDNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtNTczLDggKzU3Myw4IEBACiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3MDVGLCBJVDg3MTJGLAogCSAgSVQ4NzE2RiwgSVQ4NzE4RiwgSVQ4NzIwRiwgSVQ4NzIxRiwgSVQ4NzI2RiwgSVQ4NzI4RiwgSVQ4NzU4RSwKLQkgIElUODc3MUUsIElUODc3MkUsIElUODc4MkYsIGFuZCBJVDg3ODNFL0Ygc2Vuc29yIGNoaXBzLCBhbmQgdGhlCi0JICBTaVM5NTAgY2xvbmUuCisJICBJVDg3NzFFLCBJVDg3NzJFLCBJVDg3ODJGLCBJVDg3ODNFL0YgYW5kIElUODYwM0Ugc2Vuc29yIGNoaXBzLAorCSAgYW5kIHRoZSBTaVM5NTAgY2xvbmUuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGl0ODcuCkBAIC02NTAsNiArNjUwLDcgQEAKIGNvbmZpZyBTRU5TT1JTX0xNNzUKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEkyQworCWRlcGVuZHMgb24gVEhFUk1BTCB8fCAhVEhFUk1BTF9PRgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBvbmUgY29tbW9uIHR5cGUgb2YKIAkgIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwLCB3aXRoIG1vZGVscyBpbmNsdWRpbmc6CkBAIC0xMjg1LDYgKzEyODYsNyBAQAogY29uZmlnIFNFTlNPUlNfVE1QMTAyCiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRNUDEwMiIKIAlkZXBlbmRzIG9uIEkyQworCWRlcGVuZHMgb24gVEhFUk1BTCB8fCAhVEhFUk1BTF9PRgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDIKIAkgIHNlbnNvciBjaGlwcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtMTAyNS5jIGIvZHJpdmVycy9od21vbi9hZG0xMDI1LmMKaW5kZXggN2UxNmU1ZC4uOWZmYzRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG0xMDI1LmMKKysrIGIvZHJpdmVycy9od21vbi9hZG0xMDI1LmMKQEAgLTIsNyArMiw3IEBACiAgKiBhZG0xMDI1LmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgICAgICAgQ2hlbi1ZdWFuIFd1IDxnd3VAZXNvZnQuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBUaGUgQURNMTAyNSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgQW5hbG9nIERldmljZXMuIEl0IHJlcG9ydHMgdXAgdG8gNgogICogdm9sdGFnZXMgKGluY2x1ZGluZyBpdHMgb3duIHBvd2VyIHNvdXJjZSkgYW5kIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMKQEAgLTYxNSw2ICs2MTUsNiBAQAogCiBtb2R1bGVfaTJjX2RyaXZlcihhZG0xMDI1X2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE0xMDI1IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDI5LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYwppbmRleCA5ZWU1ZTA2Li5kMTljNzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29yZW50aW4gTEFCQkUgPGNvcmVudGluLmxhYmJlQGdlb21hdHlzLmZyPgogICoKLSAqIEJhc2VkIG9uIExNODMgRHJpdmVyIGJ5IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQmFzZWQgb24gTE04MyBEcml2ZXIgYnkgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIEdpdmUgb25seSBwcm9jZXNzb3IsIG1vdGhlcmJvYXJkIHRlbXBlcmF0dXJlcyBhbmQgZmFuIHRhY2hzCiAgKiBWZXJ5IHJhcmUgY2hpcCBwbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91IHVzZSBpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDMxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwppbmRleCAyNTNlYTM5Li5hOGE1NDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEJhc2VkIG9uIGxtNzUuYyBhbmQgbG04NS5jCiAgKiBTdXBwb3J0cyBhZG0xMDMwIC8gYWRtMTAzMQogICogQ29weXJpZ2h0IChDKSAyMDA0IEFsZXhhbmRyZSBkJ0FsdG9uIDxhbGV4QGFsZXhkYWx0b24ub3JnPgotICogUmV3b3JrZWQgYnkgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBSZXdvcmtlZCBieSBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzUuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3NS5jCmluZGV4IDIyZDAwOGIuLjNjZWZkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3NS5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDgsIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwOCBKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogRGVyaXZlZCBmcm9tIHRoZSBsbTgzIGRyaXZlciBieSBKZWFuIERlbHZhcmUKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RhOTA1NS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kYTkwNTUtaHdtb24uYwppbmRleCAwMjllY2FiLi43M2IzODY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2RhOTA1NS1od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vZGE5MDU1LWh3bW9uLmMKQEAgLTI3OCwxMCArMjc4LDYgQEAKIAlpZiAoaHdtb25faXJxIDwgMCkKIAkJcmV0dXJuIGh3bW9uX2lycTsKIAotCWh3bW9uX2lycSA9IHJlZ21hcF9pcnFfZ2V0X3ZpcnEoaHdtb24tPmRhOTA1NS0+aXJxX2RhdGEsIGh3bW9uX2lycSk7Ci0JaWYgKGh3bW9uX2lycSA8IDApCi0JCXJldHVybiBod21vbl9pcnE7Ci0KIAlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsIGh3bW9uX2lycSwKIAkJCQkJTlVMTCwgZGE5MDU1X2F1eGFkY19pcnEsCiAJCQkJCUlSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kczE2MjEuYyBiL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMKaW5kZXggODcyZDc2Ny4uZmM2ZjVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kczE2MjEuYworKysgYi9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCkBAIC00LDcgKzQsNyBAQAogICogQ2hyaXN0aWFuIFcuIFp1Y2tzY2h3ZXJkdCAgPHphbnlAdHJpcS5uZXQ+ICAyMDAwLTExLTIzCiAgKiBiYXNlZCBvbiBsbTc1LmMgYnkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgogICogUG9ydGVkIHRvIExpbnV4IDIuNiBieSBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+IHdpdGgKLSAqIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoZSBEUzE2MjEgZGV2aWNlIGlzIGEgZGlnaXRhbCB0ZW1wZXJhdHVyZS90aGVybW9tZXRlciB3aXRoIDktYml0CiAgKiByZXNvbHV0aW9uLCBhIHRoZXJtYWwgYWxhcm0gb3V0cHV0IChUb3V0KSwgYW5kIHVzZXItZGVmaW5lZCBtaW5pbXVtCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMgYi9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMKaW5kZXggODJlNjYxZS4uZjc2YTc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9lbWM2dzIwMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZW1jNncyMDEuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBlbWM2dzIwMS5jIC0gSGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIgZm9yIHRoZSBTTVNDIEVNQzZXMjAxCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDExICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01NDgsNiArNTQ4LDYgQEAKIAogbW9kdWxlX2kyY19kcml2ZXIoZW1jNncyMDFfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgRU1DNlcyMDEgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKaW5kZXggMTViN2Y1Mi4uMWE4YWExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogZjcxODA1Zi5jIC0gZHJpdmVyIGZvciB0aGUgRmludGVrIEY3MTgwNUYvRkcgYW5kIEY3MTg3MkYvRkcgU3VwZXItSS9PCiAgKiAgICAgICAgICAgICBjaGlwcyBpbnRlZ3JhdGVkIGhhcmR3YXJlIG1vbml0b3JpbmcgZmVhdHVyZXMKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhlIEY3MTgwNUYvRkcgaXMgYSBMUEMgU3VwZXItSS9PIGNoaXAgbWFkZSBieSBGaW50ZWsuIEl0IGludGVncmF0ZXMKICAqIGNvbXBsZXRlIGhhcmR3YXJlIG1vbml0b3JpbmcgZmVhdHVyZXM6IHZvbHRhZ2UsIGZhbiBhbmQgdGVtcGVyYXR1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKaW5kZXggOTUyNTdhNS4uMWU5ODMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQKICAqIEt5b3N0aSBNYWxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICogQ29weXJpZ2h0IChDKSAyMDA0IEhvbmctR3VubiBDaGV3IDxoZ2xpbnV4QGd1bm5ldC5vcmc+IGFuZAotICogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2l0ODcuYyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCmluZGV4IDI5ZmZhMjcuLjcwNzQ5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCkBAIC0xMCw3ICsxMCw4IEBACiAgKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgb25seSB0aGUgRW52aXJvbm1lbnQgQ29udHJvbGxlciBpbiB0aGUgSVQ4NzA1RiBhbmQKICAqICBzaW1pbGFyIHBhcnRzLiAgVGhlIG90aGVyIGRldmljZXMgYXJlIHN1cHBvcnRlZCBieSBkaWZmZXJlbnQgZHJpdmVycy4KICAqCi0gKiAgU3VwcG9ydHM6IElUODcwNUYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQorICogIFN1cHBvcnRzOiBJVDg2MDNFICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgSVQ4NzA1RiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgKiAgICAgICAgICAgIElUODcxMkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICogICAgICAgICAgICBJVDg3MTZGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKICAqICAgICAgICAgICAgSVQ4NzE4RiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCkBAIC0yNiw3ICsyNyw3IEBACiAgKiAgICAgICAgICAgIFNpczk1MCAgIEEgY2xvbmUgb2YgdGhlIElUODcwNUYKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzIEdhdXRocm9uCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02NCw3ICs2NSw3IEBACiAjZGVmaW5lIERSVk5BTUUgIml0ODciCiAKIGVudW0gY2hpcHMgeyBpdDg3LCBpdDg3MTIsIGl0ODcxNiwgaXQ4NzE4LCBpdDg3MjAsIGl0ODcyMSwgaXQ4NzI4LCBpdDg3NzEsCi0JICAgICBpdDg3NzIsIGl0ODc4MiwgaXQ4NzgzIH07CisJICAgICBpdDg3NzIsIGl0ODc4MiwgaXQ4NzgzLCBpdDg2MDMgfTsKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOwogbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAjZGVmaW5lIElUODc3MkVfREVWSUQgMHg4NzcyCiAjZGVmaW5lIElUODc4MkZfREVWSUQgMHg4NzgyCiAjZGVmaW5lIElUODc4M0VfREVWSUQgMHg4NzgzCisjZGVmaW5lIElUODMwNkVfREVWSUQgMHg4NjAzCiAjZGVmaW5lIElUODdfQUNUX1JFRyAgMHgzMAogI2RlZmluZSBJVDg3X0JBU0VfUkVHIDB4NjAKIApAQCAtMzE1LDYgKzMxNywxMiBAQAogCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJLAogCQkub2xkX3BlY2lfbWFzayA9IDB4NCwKIAl9LAorCVtpdDg2MDNdID0geworCQkubmFtZSA9ICJpdDg2MDMiLAorCQkuZmVhdHVyZXMgPSBGRUFUX05FV0VSX0FVVE9QV00gfCBGRUFUXzEyTVZfQURDIHwgRkVBVF8xNkJJVF9GQU5TCisJCSAgfCBGRUFUX1RFTVBfT0ZGU0VUIHwgRkVBVF9URU1QX1BFQ0ksCisJCS5wZWNpX21hc2sgPSAweDA3LAorCX0sCiB9OwogCiAjZGVmaW5lIGhhc18xNmJpdF9mYW5zKGRhdGEpCSgoZGF0YSktPmZlYXR1cmVzICYgRkVBVF8xNkJJVF9GQU5TKQpAQCAtMzYxLDcgKzM2OSw3IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KIAogCXUxNiBpbl9zY2FsZWQ7CQkvKiBJbnRlcm5hbCB2b2x0YWdlIHNlbnNvcnMgYXJlIHNjYWxlZCAqLwotCXU4IGluWzldWzNdOwkJLyogW25yXVswXT1pbiwgWzFdPW1pbiwgWzJdPW1heCAqLworCXU4IGluWzEwXVszXTsJCS8qIFtucl1bMF09aW4sIFsxXT1taW4sIFsyXT1tYXggKi8KIAl1OCBoYXNfZmFuOwkJLyogQml0ZmllbGQsIGZhbnMgZW5hYmxlZCAqLwogCXUxNiBmYW5bNV1bMl07CQkvKiBSZWdpc3RlciB2YWx1ZXMsIFtucl1bMF09ZmFuLCBbMV09bWluICovCiAJdTggaGFzX3RlbXA7CQkvKiBCaXRmaWVsZCwgdGVtcCBzZW5zb3JzIGVuYWJsZWQgKi8KQEAgLTU3OCw2ICs1ODYsNyBAQAogCQkJICAgIDcsIDIpOwogCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA4LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjlfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDksIDApOwogCiAvKiAzIHRlbXBlcmF0dXJlcyAqLwogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC03MzQsNyArNzQzLDcgQEAKIHsKIAlpbnQgY3RybCA9IGRhdGEtPmZhbl9tYWluX2N0cmwgJiAoMSA8PCBucik7CiAKLQlpZiAoY3RybCA9PSAwKQkJCQkJLyogRnVsbCBzcGVlZCAqLworCWlmIChjdHJsID09IDAgJiYgZGF0YS0+dHlwZSAhPSBpdDg2MDMpCQkvKiBGdWxsIHNwZWVkICovCiAJCXJldHVybiAwOwogCWlmIChkYXRhLT5wd21fY3RybFtucl0gJiAweDgwKQkJCS8qIEF1dG9tYXRpYyBtb2RlICovCiAJCXJldHVybiAyOwpAQCAtOTI5LDYgKzkzOCwxMCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogSVQ4NjAzRSBkb2VzIG5vdCBoYXZlIG9uL29mZiBtb2RlICovCisJaWYgKHZhbCA9PSAwICYmIGRhdGEtPnR5cGUgPT0gaXQ4NjAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCWlmICh2YWwgPT0gMCkgewpAQCAtOTQ4LDEwICs5NjEsMTMgQEAKIAkJZWxzZQkJCQkJLyogQXV0b21hdGljIG1vZGUgKi8KIAkJCWRhdGEtPnB3bV9jdHJsW25yXSA9IDB4ODAgfCBkYXRhLT5wd21fdGVtcF9tYXBbbnJdOwogCQlpdDg3X3dyaXRlX3ZhbHVlKGRhdGEsIElUODdfUkVHX1BXTShuciksIGRhdGEtPnB3bV9jdHJsW25yXSk7Ci0JCS8qIHNldCBTbWFydEd1YXJkaWFuIG1vZGUgKi8KLQkJZGF0YS0+ZmFuX21haW5fY3RybCB8PSAoMSA8PCBucik7Ci0JCWl0ODdfd3JpdGVfdmFsdWUoZGF0YSwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCwKLQkJCQkgZGF0YS0+ZmFuX21haW5fY3RybCk7CisKKwkJaWYgKGRhdGEtPnR5cGUgIT0gaXQ4NjAzKSB7CisJCQkvKiBzZXQgU21hcnRHdWFyZGlhbiBtb2RlICovCisJCQlkYXRhLT5mYW5fbWFpbl9jdHJsIHw9ICgxIDw8IG5yKTsKKwkJCWl0ODdfd3JpdGVfdmFsdWUoZGF0YSwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCwKKwkJCQkJIGRhdGEtPmZhbl9tYWluX2N0cmwpOworCQl9CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CkBAIC0xNDE1LDYgKzE0MzEsOCBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfbGFiZWwsIFNfSVJVR08sIHNob3dfbGFiZWwsIE5VTEwsIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjdfbGFiZWwsIFNfSVJVR08sIHNob3dfbGFiZWwsIE5VTEwsIDEpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfbGFiZWwsIFNfSVJVR08sIHNob3dfbGFiZWwsIE5VTEwsIDIpOworLyogc3BlY2lhbCBBVkNDMyBJVDgzMDZFIGluOSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjlfbGFiZWwsIFNfSVJVR08sIHNob3dfbGFiZWwsIE5VTEwsIDApOwogCiBzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQogCQkJICpkZXZhdHRyLCBjaGFyICpidWYpCkBAIC0xNDI0LDcgKzE0NDIsNyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppdDg3X2F0dHJpYnV0ZXNfaW5bOV1bNV0gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXQ4N19hdHRyaWJ1dGVzX2luWzEwXVs1XSA9IHsKIHsKIAkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21pbi5kZXZfYXR0ci5hdHRyLApAQCAtMTQ3Niw5ICsxNDk0LDEyIEBACiB9LCB7CiAJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCit9LCB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCiB9IH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGl0ODdfZ3JvdXBfaW5bOV0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpdDg3X2dyb3VwX2luWzEwXSA9IHsKIAl7IC5hdHRycyA9IGl0ODdfYXR0cmlidXRlc19pblswXSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2luWzFdIH0sCiAJeyAuYXR0cnMgPSBpdDg3X2F0dHJpYnV0ZXNfaW5bMl0gfSwKQEAgLTE0ODgsNiArMTUwOSw3IEBACiAJeyAuYXR0cnMgPSBpdDg3X2F0dHJpYnV0ZXNfaW5bNl0gfSwKIAl7IC5hdHRycyA9IGl0ODdfYXR0cmlidXRlc19pbls3XSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2luWzhdIH0sCisJeyAuYXR0cnMgPSBpdDg3X2F0dHJpYnV0ZXNfaW5bOV0gfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppdDg3X2F0dHJpYnV0ZXNfdGVtcFszXVs2XSA9IHsKQEAgLTE1NDYsNyArMTU2OCw4IEBACiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYmVlcC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW42X2JlZXAuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19iZWVwLmRldl9hdHRyLmF0dHIsCi0JTlVMTAorCU5VTEwsCisJTlVMTCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppdDg3X2F0dHJpYnV0ZXNfdGVtcF9iZWVwW10gPSB7CkBAIC0xNjg1LDYgKzE3MDgsNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2xhYmVsLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjdfbGFiZWwuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW45X2xhYmVsLmRldl9hdHRyLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtMTc0Miw2ICsxNzY2LDkgQEAKIAljYXNlIElUODc4M0VfREVWSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gaXQ4NzgzOwogCQlicmVhazsKKwljYXNlIElUODMwNkVfREVWSUQ6CisJCXNpb19kYXRhLT50eXBlID0gaXQ4NjAzOworCQlicmVhazsKIAljYXNlIDB4ZmZmZjoJLyogTm8gZGV2aWNlIGF0IGFsbCAqLwogCQlnb3RvIGV4aXQ7CiAJZGVmYXVsdDoKQEAgLTE3NjMsMTEgKzE3OTAsMTYgQEAKIAogCWVyciA9IDA7CiAJc2lvX2RhdGEtPnJldmlzaW9uID0gc3VwZXJpb19pbmIoREVWUkVWKSAmIDB4MGY7Ci0JcHJfaW5mbygiRm91bmQgSVQlMDR4RiBjaGlwIGF0IDB4JXgsIHJldmlzaW9uICVkXG4iLAotCQljaGlwX3R5cGUsICphZGRyZXNzLCBzaW9fZGF0YS0+cmV2aXNpb24pOworCXByX2luZm8oIkZvdW5kIElUJTA0eCVjIGNoaXAgYXQgMHgleCwgcmV2aXNpb24gJWRcbiIsIGNoaXBfdHlwZSwKKwkJY2hpcF90eXBlID09IDB4ODc3MSB8fCBjaGlwX3R5cGUgPT0gMHg4NzcyIHx8CisJCWNoaXBfdHlwZSA9PSAweDg2MDMgPyAnRScgOiAnRicsICphZGRyZXNzLAorCQlzaW9fZGF0YS0+cmV2aXNpb24pOwogCiAJLyogaW44IChWYmF0KSBpcyBhbHdheXMgaW50ZXJuYWwgKi8KIAlzaW9fZGF0YS0+aW50ZXJuYWwgPSAoMSA8PCAyKTsKKwkvKiBPbmx5IHRoZSBJVDg2MDNFIGhhcyBpbjkgKi8KKwlpZiAoc2lvX2RhdGEtPnR5cGUgIT0gaXQ4NjAzKQorCQlzaW9fZGF0YS0+c2tpcF9pbiB8PSAoMSA8PCA5KTsKIAogCS8qIFJlYWQgR1BJTyBjb25maWcgYW5kIFZJRCB2YWx1ZSBmcm9tIExETiA3IChHUElPKSAqLwogCWlmIChzaW9fZGF0YS0+dHlwZSA9PSBpdDg3KSB7CkBAIC0xODQ0LDcgKzE4NzYsMzggQEAKIAkJCXNpb19kYXRhLT5pbnRlcm5hbCB8PSAoMSA8PCAxKTsKIAogCQlzaW9fZGF0YS0+YmVlcF9waW4gPSBzdXBlcmlvX2luYihJVDg3X1NJT19CRUVQX1BJTl9SRUcpICYgMHgzZjsKKwl9IGVsc2UgaWYgKHNpb19kYXRhLT50eXBlID09IGl0ODYwMykgeworCQlpbnQgcmVnMjcsIHJlZzI5OwogCisJCXNpb19kYXRhLT5za2lwX3ZpZCA9IDE7CS8qIE5vIFZJRCAqLworCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKKworCQlyZWcyNyA9IHN1cGVyaW9faW5iKElUODdfU0lPX0dQSU8zX1JFRyk7CisKKwkJLyogQ2hlY2sgaWYgZmFuMyBpcyB0aGVyZSBvciBub3QgKi8KKwkJaWYgKHJlZzI3ICYgKDEgPDwgNikpCisJCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMik7CisJCWlmIChyZWcyNyAmICgxIDw8IDcpKQorCQkJc2lvX2RhdGEtPnNraXBfZmFuIHw9ICgxIDw8IDIpOworCisJCS8qIENoZWNrIGlmIGZhbjIgaXMgdGhlcmUgb3Igbm90ICovCisJCXJlZzI5ID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fR1BJTzVfUkVHKTsKKwkJaWYgKHJlZzI5ICYgKDEgPDwgMSkpCisJCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMSk7CisJCWlmIChyZWcyOSAmICgxIDw8IDIpKQorCQkJc2lvX2RhdGEtPnNraXBfZmFuIHw9ICgxIDw8IDEpOworCisJCXNpb19kYXRhLT5za2lwX2luIHw9ICgxIDw8IDUpOyAvKiBObyBWSU41ICovCisJCXNpb19kYXRhLT5za2lwX2luIHw9ICgxIDw8IDYpOyAvKiBObyBWSU42ICovCisKKwkJLyogbm8gZmFuNCAqLworCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMyk7CisJCXNpb19kYXRhLT5za2lwX2ZhbiB8PSAoMSA8PCAzKTsKKworCQlzaW9fZGF0YS0+aW50ZXJuYWwgfD0gKDEgPDwgMSk7IC8qIGluNyBpcyBWU0IgKi8KKwkJc2lvX2RhdGEtPmludGVybmFsIHw9ICgxIDw8IDMpOyAvKiBpbjkgaXMgQVZDQyAqLworCisJCXNpb19kYXRhLT5iZWVwX3BpbiA9IHN1cGVyaW9faW5iKElUODdfU0lPX0JFRVBfUElOX1JFRykgJiAweDNmOwogCX0gZWxzZSB7CiAJCWludCByZWc7CiAJCWJvb2wgdWFydDY7CkBAIC0xOTY2LDcgKzIwMjksNyBAQAogCWludCBpOwogCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZpdDg3X2dyb3VwKTsKLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJaWYgKHNpb19kYXRhLT5za2lwX2luICYgKDEgPDwgaSkpCiAJCQljb250aW51ZTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZpdDg3X2dyb3VwX2luW2ldKTsKQEAgLTIwODAsNiArMjE0Myw4IEBACiAJCQlkYXRhLT5pbl9zY2FsZWQgfD0gKDEgPDwgNyk7CS8qIGluNyBpcyBWU0IgKi8KIAkJaWYgKHNpb19kYXRhLT5pbnRlcm5hbCAmICgxIDw8IDIpKQogCQkJZGF0YS0+aW5fc2NhbGVkIHw9ICgxIDw8IDgpOwkvKiBpbjggaXMgVmJhdCAqLworCQlpZiAoc2lvX2RhdGEtPmludGVybmFsICYgKDEgPDwgMykpCisJCQlkYXRhLT5pbl9zY2FsZWQgfD0gKDEgPDwgOSk7CS8qIGluOSBpcyBBVkNDICovCiAJfSBlbHNlIGlmIChzaW9fZGF0YS0+dHlwZSA9PSBpdDg3ODIgfHwgc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzgzKSB7CiAJCWlmIChzaW9fZGF0YS0+aW50ZXJuYWwgJiAoMSA8PCAwKSkKIAkJCWRhdGEtPmluX3NjYWxlZCB8PSAoMSA8PCAzKTsJLyogaW4zIGlzIFZDQzVWICovCkBAIC0yMTAyLDcgKzIxNjcsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJaWYgKHNpb19kYXRhLT5za2lwX2luICYgKDEgPDwgaSkpCiAJCQljb250aW51ZTsKIAkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZpdDg3X2dyb3VwX2luW2ldKTsKQEAgLTIyMDIsNyArMjI2Nyw3IEBACiAJfQogCiAJLyogRXhwb3J0IGxhYmVscyBmb3IgaW50ZXJuYWwgc2Vuc29ycyAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmICghKHNpb19kYXRhLT5pbnRlcm5hbCAmICgxIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGV2LT5rb2JqLApAQCAtMjM4Myw4ICsyNDQ4LDkgQEAKIAl9CiAJZGF0YS0+aGFzX2ZhbiA9IChkYXRhLT5mYW5fbWFpbl9jdHJsID4+IDQpICYgMHgwNzsKIAotCS8qIFNldCB0YWNob21ldGVycyB0byAxNi1iaXQgbW9kZSBpZiBuZWVkZWQgKi8KLQlpZiAoaGFzXzE2Yml0X2ZhbnMoZGF0YSkpIHsKKwkvKiBTZXQgdGFjaG9tZXRlcnMgdG8gMTYtYml0IG1vZGUgaWYgbmVlZGVkLCBJVDg2MDNFIChhbmQgSVQ4NzI4Rj8pCisJICogaGFzIGl0IGJ5IGRlZmF1bHQgKi8KKwlpZiAoaGFzXzE2Yml0X2ZhbnMoZGF0YSkgJiYgZGF0YS0+dHlwZSAhPSBpdDg2MDMpIHsKIAkJdG1wID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX0ZBTl8xNkJJVCk7CiAJCWlmICh+dG1wICYgMHgwNyAmIGRhdGEtPmhhc19mYW4pIHsKIAkJCWRldl9kYmcoJnBkZXYtPmRldiwKQEAgLTI0NjQsNiArMjUzMCw4IEBACiAJCX0KIAkJLyogaW44IChiYXR0ZXJ5KSBoYXMgbm8gbGltaXQgcmVnaXN0ZXJzICovCiAJCWRhdGEtPmluWzhdWzBdID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1ZJTig4KSk7CisJCWlmIChkYXRhLT50eXBlID09IGl0ODYwMykKKwkJCWRhdGEtPmluWzldWzBdID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIDB4MmYpOwogCiAJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJCS8qIFNraXAgZGlzYWJsZWQgZmFucyAqLwpAQCAtMjYyMCw3ICsyNjg4LDcgQEAKIH0KIAogCi1NT0RVTEVfQVVUSE9SKCJDaHJpcyBHYXV0aHJvbiwgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJDaHJpcyBHYXV0aHJvbiwgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDg3MDVGL0lUODcxeEYvSVQ4NzJ4RiBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciIpOwogbW9kdWxlX3BhcmFtKHVwZGF0ZV92YmF0LCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModXBkYXRlX3ZiYXQsICJVcGRhdGUgdmJhdCBpZiBzZXQgZWxzZSByZXR1cm4gcG93ZXJ1cCB2YWx1ZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTYzLmMgYi9kcml2ZXJzL2h3bW9uL2xtNjMuYwppbmRleCBkMGRlZjUwLi5iNGFkNTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNjMuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNjMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsbTYzLmMgLSBkcml2ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMgdGVtcGVyYXR1cmUgc2Vuc29yCiAgKiAgICAgICAgICB3aXRoIGludGVncmF0ZWQgZmFuIGNvbnRyb2wKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4ICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKiBCYXNlZCBvbiB0aGUgbG05MCBkcml2ZXIuCiAgKgogICogVGhlIExNNjMgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IG1lYXN1cmVzCkBAIC0xMjAyLDYgKzEyMDIsNiBAQAogCiBtb2R1bGVfaTJjX2RyaXZlcihsbTYzX2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTYzIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwppbmRleCBhMmYzYjRhLi45ZWZhZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzguYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpAQCAtMiw3ICsyLDcgQEAKICAqIGxtNzguYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgKgkgICAgbW9uaXRvcmluZwogICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMTA4LDcgKzExMDgsNyBAQAogCWkyY19kZWxfZHJpdmVyKCZsbTc4X2RyaXZlcik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCwgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQsIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTE03OC9MTTc5IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODMuYyBiL2RyaXZlcnMvaHdtb24vbG04My5jCmluZGV4IGU5OTgwMzQuLmFiZDI3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG04My5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG04My5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGxtODMuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgKiAgICAgICAgICBtb25pdG9yaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIEhlYXZpbHkgaW5zcGlyZWQgZnJvbSB0aGUgbG03OCwgbG03NSBhbmQgYWRtMTAyMSBkcml2ZXJzLiBUaGUgTE04MyBpcwogICogYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IHJlcG9ydHMgdXAgdG8gZm91cgpAQCAtNDI3LDYgKzQyNyw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKGxtODNfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkxNODMgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODUuYyBiL2RyaXZlcnMvaHdtb24vbG04NS5jCmluZGV4IDM4OTRjNDAuLmJlZDRhZjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtODUuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwpAQCAtNSw3ICs1LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyAgUGhpbGlwIFBva29ybnkgPHBwb2tvcm55QHBlbmd1aW5jb21wdXRpbmcuY29tPgogICogQ29weXJpZ2h0IChjKSAyMDAzICAgICAgICBNYXJnaXQgU2NodWJlcnQtV2hpbGUgPG1hcmdpdHN3QHQtb25saW5lLmRlPgogICogQ29weXJpZ2h0IChjKSAyMDA0ICAgICAgICBKdXN0aW4gVGhpZXNzZW4gPGp0aGllc3NlbkBwZW5ndWluY29tcHV0aW5nLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0tMjAwOSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctLTIwMDkgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBDaGlwIGRldGFpbHMgYXQJICAgICAgPGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzL0xNL0xNODUucGRmPgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKaW5kZXggMzMzMDkyYy4uNGM1ZjIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTg3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTg3LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgogICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoZW4gUm91c3NldCA8c3RlcGhlbi5yb3Vzc2V0QHJvY2tldGxvZ2l4LmNvbT4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIE9yaWdpbmFsIHBvcnQgdG8gTGludXggMi42IGJ5IEplZmYgT2xpdmVyLgogICoKQEAgLTEwMTEsNiArMTAxMSw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKGxtODdfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+IGFuZCBvdGhlcnMiKTsKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4gYW5kIG90aGVycyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTg3IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCA4YjhmM2FhLi43MDFlOTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsbTkwLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQogICogICAgICAgICAgbW9uaXRvcmluZwotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBCYXNlZCBvbiB0aGUgbG04MyBkcml2ZXIuIFRoZSBMTTkwIGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBOYXRpb25hbAogICogU2VtaWNvbmR1Y3Rvci4gSXQgcmVwb3J0cyB1cCB0byB0d28gdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgdXAgdG8KQEAgLTE2NzksNiArMTY3OSw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKGxtOTBfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkxNOTAvQURNMTAzMiBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05Mi5jIGIvZHJpdmVycy9od21vbi9sbTkyLmMKaW5kZXggNzE2MjZmMy4uOWQwZTg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTkyLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTkyLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogbG05MiAtIEhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIEJhc2VkIG9uIHRoZSBsbTkwIGRyaXZlciwgd2l0aCBzb21lIGlkZWFzIHRha2VuIGZyb20gdGhlIGxtX3NlbnNvcnMKICAqIGxtOTIgZHJpdmVyIGFzIHdlbGwuCkBAIC00NDAsNiArNDQwLDYgQEAKIAogbW9kdWxlX2kyY19kcml2ZXIobG05Ml9kcml2ZXIpOwogCi1NT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTE05Mi9NQVg2NjM1IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkzLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTMuYwppbmRleCBhNmY0NjA1Li42ZjFjNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTMuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTMuYwpAQCAtMTIsNyArMTIsNyBAQAogICoJQ29weXJpZ2h0IChjKSAyMDAzICAgICAgIE1hcmdpdCBTY2h1YmVydC1XaGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+CiAgKgogICogZGVyaXZlZCBpbiBwYXJ0IGZyb20gdzgzbDc4NXRzLmM6Ci0gKglDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCUNvcHlyaWdodCAoYykgMjAwMy0yMDA0IEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEVyaWMgSi4gQm93ZXJzb3ggPGVyaWNiQGFzcHN5cy5jb20+CiAgKglDb3B5cmlnaHQgKGMpIDIwMDUgQXNwZW4gU3lzdGVtcywgSW5jLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjE5LmMgYi9kcml2ZXJzL2h3bW9uL21heDE2MTkuYwppbmRleCA0NDVlNWQ0Li42NjM4ZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDE2MTkuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDE2MTkuYwpAQCAtMiw3ICsyLDcgQEAKICAqIG1heDE2MTkuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgKiAgICAgICAgICAgICBtb25pdG9yaW5nCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgotICogICAgICAgICAgICAgICAgICAgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogQmFzZWQgb24gdGhlIGxtOTAgZHJpdmVyLiBUaGUgTUFYMTYxOSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTWF4aW0uCiAgKiBJdCByZXBvcnRzIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0bwpAQCAtMzU3LDcgKzM1Nyw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKG1heDE2MTlfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiT2xla3NpaiBSZW1wZWwgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4gYW5kICIKLQkiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PiwgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVgxNjE5IHNlbnNvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4NjY0Mi5jIGIvZHJpdmVycy9od21vbi9tYXg2NjQyLmMKaW5kZXggODMyNmZiZC4uNjUyMGJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg2NjQyLmMKKysrIGIvZHJpdmVycy9od21vbi9tYXg2NjQyLmMKQEAgLTgsNyArOCw3IEBACiAgKgogICogIEJhc2VkIG9uIHRoZSBtYXgxNjE5IGRyaXZlci4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBUaGUgTUFYNjY0MiBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTWF4aW0uCiAgKiBJdCByZXBvcnRzIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMgYi9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYwppbmRleCA4Njg2ZTk2Li4zOGQ1YTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYworKysgYi9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYwpAQCAtNSw3ICs1LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAxMiAgR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgogICoKICAqIERlcml2ZWQgZnJvbSB3ODM2MjdlaGYgZHJpdmVyCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICogQ29weXJpZ2h0IChDKSAyMDA2ICBZdWFuIE11IChXaW5ib25kKSwKICAqCQkgICAgICAgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KICAqCQkgICAgICAgRGF2aWQgSHViYmFyZCA8ZGF2aWQuYy5odWJiYXJkQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggYWE2MTViYS4uMzMwZmUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIHBjODczNjAuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKICAqICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwotICogIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNyBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDcgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqICBDb3BpZWQgZnJvbSBzbXNjNDdtMS5jOgogICogIENvcHlyaWdodCAoQykgMjAwMiBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CkBAIC0xODA4LDcgKzE4MDgsNyBAQAogfQogCiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJQQzg3MzZ4IGhhcmR3YXJlIG1vbml0b3IiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wYzg3NDI3LmMgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwppbmRleCA2ZTZlYTQ0Li5kODQ3ZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYworKysgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgcGM4NzQyNy5jIC0gaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIgZm9yIHRoZQogICogICAgICAgICAgICAgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzQyNyBTdXBlci1JL08gY2hpcAotICogIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOCwgMjAxMCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LCAyMDEwICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTEzNDcsNyArMTM0Nyw3IEBACiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjODc0MjdfZHJpdmVyKTsKIH0KIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlBDODc0MjcgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wY2Y4NTkxLmMgYi9kcml2ZXJzL2h3bW9uL3BjZjg1OTEuYwppbmRleCA4MjU4ODNkLi41NzQwODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BjZjg1OTEuYworKysgYi9kcml2ZXJzL2h3bW9uL3BjZjg1OTEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CiAgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4gd2l0aAotICogdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXNfY29yZS5jCmluZGV4IDNjYmY2NmUuLjI5MWQxMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXNfY29yZS5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXNfY29yZS5jCkBAIC05MCw3ICs5MCw4IEBACiAKIAl1MzIgZmxhZ3M7CQkvKiBmcm9tIHBsYXRmb3JtIGRhdGEgKi8KIAotCWludCBleHBvbmVudDsJCS8qIGxpbmVhciBtb2RlOiBleHBvbmVudCBmb3Igb3V0cHV0IHZvbHRhZ2VzICovCisJaW50IGV4cG9uZW50W1BNQlVTX1BBR0VTXTsKKwkJCQkvKiBsaW5lYXIgbW9kZTogZXhwb25lbnQgZm9yIG91dHB1dCB2b2x0YWdlcyAqLwogCiAJY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvOwogCkBAIC00MTAsNyArNDExLDcgQEAKIAlsb25nIHZhbDsKIAogCWlmIChzZW5zb3ItPmNsYXNzID09IFBTQ19WT0xUQUdFX09VVCkgewkvKiBMSU5FQVIxNiAqLwotCQlleHBvbmVudCA9IGRhdGEtPmV4cG9uZW50OworCQlleHBvbmVudCA9IGRhdGEtPmV4cG9uZW50W3NlbnNvci0+cGFnZV07CiAJCW1hbnRpc3NhID0gKHUxNikgc2Vuc29yLT5kYXRhOwogCX0gZWxzZSB7CQkJCS8qIExJTkVBUjExICovCiAJCWV4cG9uZW50ID0gKChzMTYpc2Vuc29yLT5kYXRhKSA+PiAxMTsKQEAgLTUxNiw3ICs1MTcsNyBAQAogI2RlZmluZSBNSU5fTUFOVElTU0EJKDUxMSAqIDEwMDApCiAKIHN0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWdfbGluZWFyKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAotCQkJCSBlbnVtIHBtYnVzX3NlbnNvcl9jbGFzc2VzIGNsYXNzLCBsb25nIHZhbCkKKwkJCQkgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yLCBsb25nIHZhbCkKIHsKIAlzMTYgZXhwb25lbnQgPSAwLCBtYW50aXNzYTsKIAlib29sIG5lZ2F0aXZlID0gZmFsc2U7CkBAIC01MjUsNyArNTI2LDcgQEAKIAlpZiAodmFsID09IDApCiAJCXJldHVybiAwOwogCi0JaWYgKGNsYXNzID09IFBTQ19WT0xUQUdFX09VVCkgeworCWlmIChzZW5zb3ItPmNsYXNzID09IFBTQ19WT0xUQUdFX09VVCkgewogCQkvKiBMSU5FQVIxNiBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIHZvbHRhZ2VzICovCiAJCWlmICh2YWwgPCAwKQogCQkJcmV0dXJuIDA7CkBAIC01MzQsMTAgKzUzNSwxMCBAQAogCQkgKiBGb3IgYSBzdGF0aWMgZXhwb25lbnRzLCB3ZSBkb24ndCBoYXZlIGEgY2hvaWNlCiAJCSAqIGJ1dCB0byBhZGp1c3QgdGhlIHZhbHVlIHRvIGl0LgogCQkgKi8KLQkJaWYgKGRhdGEtPmV4cG9uZW50IDwgMCkKLQkJCXZhbCA8PD0gLWRhdGEtPmV4cG9uZW50OworCQlpZiAoZGF0YS0+ZXhwb25lbnRbc2Vuc29yLT5wYWdlXSA8IDApCisJCQl2YWwgPDw9IC1kYXRhLT5leHBvbmVudFtzZW5zb3ItPnBhZ2VdOwogCQllbHNlCi0JCQl2YWwgPj49IGRhdGEtPmV4cG9uZW50OworCQkJdmFsID4+PSBkYXRhLT5leHBvbmVudFtzZW5zb3ItPnBhZ2VdOwogCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDEwMDApOwogCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KQEAgLTU0OCwxNCArNTQ5LDE0IEBACiAJfQogCiAJLyogUG93ZXIgaXMgaW4gdVcuIENvbnZlcnQgdG8gbVcgYmVmb3JlIGNvbnZlcnRpbmcuICovCi0JaWYgKGNsYXNzID09IFBTQ19QT1dFUikKKwlpZiAoc2Vuc29yLT5jbGFzcyA9PSBQU0NfUE9XRVIpCiAJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMTAwMEwpOwogCiAJLyoKIAkgKiBGb3Igc2ltcGxpY2l0eSwgY29udmVydCBmYW4gZGF0YSB0byBtaWxsaS11bml0cwogCSAqIGJlZm9yZSBjYWxjdWxhdGluZyB0aGUgZXhwb25lbnQuCiAJICovCi0JaWYgKGNsYXNzID09IFBTQ19GQU4pCisJaWYgKHNlbnNvci0+Y2xhc3MgPT0gUFNDX0ZBTikKIAkJdmFsID0gdmFsICogMTAwMDsKIAogCS8qIFJlZHVjZSBsYXJnZSBtYW50aXNzYSB1bnRpbCBpdCBmaXRzIGludG8gMTAgYml0ICovCkBAIC01ODUsMjIgKzU4NiwyMiBAQAogfQogCiBzdGF0aWMgdTE2IHBtYnVzX2RhdGEycmVnX2RpcmVjdChzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKLQkJCQkgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCisJCQkJIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvciwgbG9uZyB2YWwpCiB7CiAJbG9uZyBtLCBiLCBSOwogCi0JbSA9IGRhdGEtPmluZm8tPm1bY2xhc3NdOwotCWIgPSBkYXRhLT5pbmZvLT5iW2NsYXNzXTsKLQlSID0gZGF0YS0+aW5mby0+UltjbGFzc107CisJbSA9IGRhdGEtPmluZm8tPm1bc2Vuc29yLT5jbGFzc107CisJYiA9IGRhdGEtPmluZm8tPmJbc2Vuc29yLT5jbGFzc107CisJUiA9IGRhdGEtPmluZm8tPlJbc2Vuc29yLT5jbGFzc107CiAKIAkvKiBQb3dlciBpcyBpbiB1Vy4gQWRqdXN0IFIgYW5kIGIuICovCi0JaWYgKGNsYXNzID09IFBTQ19QT1dFUikgeworCWlmIChzZW5zb3ItPmNsYXNzID09IFBTQ19QT1dFUikgewogCQlSIC09IDM7CiAJCWIgKj0gMTAwMDsKIAl9CiAKIAkvKiBDYWxjdWxhdGUgWSA9IChtICogWCArIGIpICogMTBeUiAqLwotCWlmIChjbGFzcyAhPSBQU0NfRkFOKSB7CisJaWYgKHNlbnNvci0+Y2xhc3MgIT0gUFNDX0ZBTikgewogCQlSIC09IDM7CQkvKiBBZGp1c3QgUiBhbmQgYiBmb3IgZGF0YSBpbiBtaWxsaS11bml0cyAqLwogCQliICo9IDEwMDA7CiAJfQpAQCAtNjE5LDcgKzYyMCw3IEBACiB9CiAKIHN0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWdfdmlkKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAotCQkJICAgICAgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCisJCQkgICAgICBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IsIGxvbmcgdmFsKQogewogCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIDUwMCwgMTYwMCk7CiAKQEAgLTYyNywyMCArNjI4LDIwIEBACiB9CiAKIHN0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWcoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCi0JCQkgIGVudW0gcG1idXNfc2Vuc29yX2NsYXNzZXMgY2xhc3MsIGxvbmcgdmFsKQorCQkJICBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IsIGxvbmcgdmFsKQogewogCXUxNiByZWd2YWw7CiAKLQlzd2l0Y2ggKGRhdGEtPmluZm8tPmZvcm1hdFtjbGFzc10pIHsKKwlzd2l0Y2ggKGRhdGEtPmluZm8tPmZvcm1hdFtzZW5zb3ItPmNsYXNzXSkgewogCWNhc2UgZGlyZWN0OgotCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ19kaXJlY3QoZGF0YSwgY2xhc3MsIHZhbCk7CisJCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnX2RpcmVjdChkYXRhLCBzZW5zb3IsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgdmlkOgotCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ192aWQoZGF0YSwgY2xhc3MsIHZhbCk7CisJCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnX3ZpZChkYXRhLCBzZW5zb3IsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgbGluZWFyOgogCWRlZmF1bHQ6Ci0JCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnX2xpbmVhcihkYXRhLCBjbGFzcywgdmFsKTsKKwkJcmVndmFsID0gcG1idXNfZGF0YTJyZWdfbGluZWFyKGRhdGEsIHNlbnNvciwgdmFsKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiByZWd2YWw7CkBAIC03NDYsNyArNzQ3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmVndmFsID0gcG1idXNfZGF0YTJyZWcoZGF0YSwgc2Vuc29yLT5jbGFzcywgdmFsKTsKKwlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZyhkYXRhLCBzZW5zb3IsIHZhbCk7CiAJcmV0ID0gX3BtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHNlbnNvci0+cGFnZSwgc2Vuc29yLT5yZWcsIHJlZ3ZhbCk7CiAJaWYgKHJldCA8IDApCiAJCXJ2ID0gcmV0OwpAQCAtMTY0MywxMiArMTY0NCwxMyBAQAogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGFsbCBjaGlwcy4KICAqLwogc3RhdGljIGludCBwbWJ1c19pZGVudGlmeV9jb21tb24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEpCisJCQkJIHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLCBpbnQgcGFnZSkKIHsKIAlpbnQgdm91dF9tb2RlID0gLTE7CiAKLQlpZiAocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1ZPVVRfTU9ERSkpCi0JCXZvdXRfbW9kZSA9IF9wbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDAsIFBNQlVTX1ZPVVRfTU9ERSk7CisJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCBwYWdlLCBQTUJVU19WT1VUX01PREUpKQorCQl2b3V0X21vZGUgPSBfcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkJICBQTUJVU19WT1VUX01PREUpOwogCWlmICh2b3V0X21vZGUgPj0gMCAmJiB2b3V0X21vZGUgIT0gMHhmZikgewogCQkvKgogCQkgKiBOb3QgYWxsIGNoaXBzIHN1cHBvcnQgdGhlIFZPVVRfTU9ERSBjb21tYW5kLApAQCAtMTY1OSw3ICsxNjYxLDcgQEAKIAkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSBsaW5lYXIpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJCWRhdGEtPmV4cG9uZW50ID0gKChzOCkodm91dF9tb2RlIDw8IDMpKSA+PiAzOworCQkJZGF0YS0+ZXhwb25lbnRbcGFnZV0gPSAoKHM4KSh2b3V0X21vZGUgPDwgMykpID4+IDM7CiAJCQlicmVhazsKIAkJY2FzZSAxOiAvKiBWSUQgbW9kZSAgICAgICAgICovCiAJCQlpZiAoZGF0YS0+aW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gIT0gdmlkKQpAQCAtMTY3NCw3ICsxNjc2LDcgQEAKIAkJfQogCX0KIAotCXBtYnVzX2NsZWFyX2ZhdWx0X3BhZ2UoY2xpZW50LCAwKTsKKwlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgcGFnZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2ODIsNyArMTY4NCw3IEBACiAJCQkgICAgIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Ci0JaW50IHJldDsKKwlpbnQgcGFnZSwgcmV0OwogCiAJLyoKIAkgKiBTb21lIFBNQnVzIGNoaXBzIGRvbid0IHN1cHBvcnQgUE1CVVNfU1RBVFVTX0JZVEUsIHNvIHRyeQpAQCAtMTcxNSwxMCArMTcxNywxMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZXQgPSBwbWJ1c19pZGVudGlmeV9jb21tb24oY2xpZW50LCBkYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpZGVudGlmeSBjaGlwIGNhcGFiaWxpdGllc1xuIik7Ci0JCXJldHVybiByZXQ7CisJZm9yIChwYWdlID0gMDsgcGFnZSA8IGluZm8tPnBhZ2VzOyBwYWdlKyspIHsKKwkJcmV0ID0gcG1idXNfaWRlbnRpZnlfY29tbW9uKGNsaWVudCwgZGF0YSwgcGFnZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpZGVudGlmeSBjaGlwIGNhcGFiaWxpdGllc1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCBlNzRiZDdlLi4zNTMyMDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNiw3ICs2LDcgQEAKICAqCQkJICAgICBLecO2c3RpIE3DpGxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgYW5kCiAgKgkJCSAgICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgogICogUG9ydGVkIHRvIExpbnV4IDIuNiBieSBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+IHdpdGgKLSAqIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCA4MTM0OGZhLi5iZDg5ZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBkZXJpdmVkIGluIHBhcnQgZnJvbSBzbXNjNDdtMS5jOgogICogQ29weXJpZ2h0IChDKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggMDVjYjgxNC4uMjNhMjJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtNyw3ICs3LDcgQEAKICAqIFN1cGVyLUkvTyBjaGlwcy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEdhYnJpZWxlIEdvcmxhIDxnb3JsaWtAeWFob28uY29tPgogICoJCQlhbmQgSmVhbiBEZWx2YXJlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggMjNmZjIxMC4uZjBhYjYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICB3ODM2MjdlaGYgLSBEcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGZ1bmN0aW9uYWxpdHkgb2YKICAqCQl0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTIgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFl1YW4gTXUgKFdpbmJvbmQpLAogICoJCQlSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgogICoJCQlEYXZpZCBIdWJiYXJkIDxkYXZpZC5jLmh1YmJhcmRAZ21haWwuY29tPgpAQCAtMjg4OSw3ICsyODg5LDcgQEAKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdzgzNjI3ZWhmX2RyaXZlcik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJXODM2MjdFSEYgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCBjYjljZDMyLi5jMTcyNmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC01LDcgKzUsNyBAQAogICoJCQkgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAogICoJCQkgICAgICBhbmQgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgogICogUG9ydGVkIHRvIDIuNiBieSBCZXJuaGFyZCBDLiBTY2hyZW5rIDxjbGVteUBjbGVteS5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgLSAxMDEyICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNyAtIDEwMTIgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKaW5kZXggZjlkNTEzOS4uODQ5MTE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAxICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAogICoJCQkgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAogICoJCQkgICAgICBhbmQgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA3IC0gMjAwOCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgLSAyMDA4ICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5NS5jIGIvZHJpdmVycy9od21vbi93ODM3OTUuYwppbmRleCA5MDgyMDlkLi4yMTg5NDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzk1LmMKQEAgLTIsNyArMiw3IEBACiAgKiAgdzgzNzk1LmMgLSBMaW51eCBrZXJuZWwgZHJpdmVyIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE51dm90b24gVGVjaG5vbG9neSBDb3JwLgogICogICAgICAgICAgICAgICAgV2VpIFNvbmcKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjI4Miw2ICsyMjgyLDYgQEAKIAogbW9kdWxlX2kyY19kcml2ZXIodzgzNzk1X2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIldlaSBTb25nLCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIldlaSBTb25nLCBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlc4Mzc5NUcvQURHIGhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jIGIvZHJpdmVycy9od21vbi93ODNsNzg1dHMuYwppbmRleCAzOWRiZTk5Li42Mzg0YjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogdzgzbDc4NXRzLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQogICogICAgICAgICAgICAgICBtb25pdG9yaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIEluc3BpcmVkIGZyb20gdGhlIGxtODMgZHJpdmVyLiBUaGUgVzgzTDc4NVRTLVMgaXMgYSBzZW5zb3IgY2hpcCBtYWRlCiAgKiBieSBXaW5ib25kLiBJdCByZXBvcnRzIGEgc2luZ2xlIGV4dGVybmFsIHRlbXBlcmF0dXJlIHdpdGggYSAxIGRlZwpAQCAtMTAsNyArMTAsNyBAQAogICogICBodHRwOi8vd3d3LndpbmJvbmQtdXNhLmNvbS9wcm9kdWN0cy93aW5ib25kX3Byb2R1Y3RzL3BkZnMvUENJQy9XODNMNzg1VFMtUy5wZGYKICAqCiAgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IFdvbGZnYW5nIFppZWdsZXIgPG51cHBsYUBnbXguYXQ+IGFuZCBKZWFuIERlbHZhcmUKLSAqIDxraGFsaUBsaW51eC1mci5vcmc+LgorICogPGpkZWx2YXJlQHN1c2UuZGU+LgogICoKICAqIFRoYW5rcyB0byBKYW1lcyBCb2x0IDxqYW1lc0BldmlscGVuZ3Vpbi5jb20+IGZvciBiZW5jaG1hcmtpbmcgdGhlIHJlYWQKICAqIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbS4KQEAgLTI5OSw2ICsyOTksNiBAQAogCiBtb2R1bGVfaTJjX2RyaXZlcih3ODNsNzg1dHNfZHJpdmVyKTsKIAotTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlc4M0w3ODVUUy1TIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYwppbmRleCBmYWQyMmIwLi42NWVmOTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYwpAQCAtMjAsMTIgKzIwLDExIEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgS3nDtnN0aSBNw6Rsa2tpCi0gICA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gKi8KKyAgIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4gKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKaW5kZXggZjg5MmE0Mi4uOGIxMGY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjYS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYwppbmRleCA1YzIzNzk1Li4zNDM3MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tcGNmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCmluZGV4IDZiY2RlYTUuLmY1ZWQwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCkBAIC0xNTIsNiArMTUyLDcgQEAKIAkgICAgQVRJIFNCNzAwL1NQNTEwMAogCSAgICBBVEkgU0I4MDAKIAkgICAgQU1EIEh1ZHNvbi0yCisJICAgIEFNRCBNTAogCSAgICBBTUQgQ1oKIAkgICAgU2VydmVyd29ya3MgT1NCNAogCSAgICBTZXJ2ZXJ3b3JrcyBDU0I1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFjb3JuLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFjb3JuLmMKaW5kZXggZWQ5ZjQ4ZC4uOWQ3YmU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hY29ybi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWNvcm4uYwpAQCAtMTIsNyArMTIsNyBAQAogICogIE9uIEFjb3JuIG1hY2hpbmVzLCB0aGUgZm9sbG93aW5nIGkyYyBkZXZpY2VzIGFyZSBvbiB0aGUgYnVzOgogICoJLSBQQ0Y4NTgzIHJlYWwgdGltZSBjbG9jayAmIHN0YXRpYyBSQU0KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTM1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYwppbmRleCAzZjQ5MTgxLi43ZDYwZDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYwpAQCAtNTgsNyArNTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCmluZGV4IDg0Y2NkOTQuLjQ2MTFlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjZGVmaW5lIEFMSTE1NjNfTUFYX1RJTUVPVVQJNTAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTV4My5jCmluZGV4IDI2YmNjNjEuLjQ4MjMyMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTV4My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTV4My5jCkBAIC02NSw3ICs2NSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni1zNDg4Mi5jCmluZGV4IDA3ZjAxYWMuLjQxZmM2ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBpMmMtYW1kNzU2LXM0ODgyLmMgLSBpMmMtYW1kNzU2IGV4dHJhcyBmb3IgdGhlIFR5YW4gUzQ4ODIgbW90aGVyYm9hcmQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCSAgICAgICAiUGh5c2ljYWwgYnVzIHJlc3RvcmF0aW9uIGZhaWxlZFxuIik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTNDg4MiBTTUJ1cyBtdWx0aXBsZXhpbmciKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKaW5kZXggZTEzZTJhYS4uODE5ZDNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCmluZGV4IGE0NGU2ZTcuLmYzZDRkNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKaW5kZXggYjViODkyMy4uODc2MjQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jYnVzLWdwaW8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2J1cy1ncGlvLmMKaW5kZXggY2U3ZmZiYS4uYmRmMDQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jYnVzLWdwaW8uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNidXMtZ3Bpby5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYwppbmRleCAzZTVlYTJjLi5iZTdmMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCBmZjE1YWU5Li5lMDhlNDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1leHlub3M1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWV4eW5vczUuYwppbmRleCAwNDRmODViLi45ZmQ3MTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWV4eW5vczUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWV4eW5vczUuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwppbmRleCA0MzZiMGYyLi41MTJmY2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwpAQCAtMTIsNyArMTIsNiBAQAogICogb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMKaW5kZXggNzljM2Q5MC4uZTI0ODI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oeWRyYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaHlkcmEuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2h5ZHJhLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKaW5kZXggNzM3ZTI5OC4uMzQ5YzJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTIsNyArMiw3IEBACiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCBhbmQgTWFyayBELiBTdHVkZWJha2VyCiAgICAgPG1kc3h5ejEyM0B5YWhvby5jb20+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDA3IC0gMjAxMiAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3IC0gMjAxMiAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICAgIENvcHlyaWdodCAoQykgMjAxMCAgICAgICAgIEludGVsIENvcnBvcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KIApAQCAtMTMxMiw4ICsxMzEyLDcgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk4MDFfZHJpdmVyKTsKIH0KIAotTU9EVUxFX0FVVEhPUigiTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwgIgotCSAgICAgICJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTgwMSBTTUJ1cyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pYm1faWljLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwppbmRleCBmNzQ0NDEwLi4yNzQzMTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5jCmluZGV4IGRkMjRhYTAuLjNkMTZjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2NoLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYwppbmRleCBhZjIxMzA0Li5jZjk5ZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc210LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYwppbmRleCBiYjEzMmVhLi44Y2U0ZjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYwpAQCAtNjIsNyArNjIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwppbmRleCBiNmE3NDFjLi5mNTM5MTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi1zNDk4NS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLXM0OTg1LmMKaW5kZXggMmNhMjY4ZC4uYjE3MGJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLXM0OTg1LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLXM0OTg1LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogaTJjLW5mb3JjZTItczQ5ODUuYyAtIGkyYy1uZm9yY2UyIGV4dHJhcyBmb3IgdGhlIFR5YW4gUzQ5ODUgbW90aGVyYm9hcmQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJCSAgICAgICAiUGh5c2ljYWwgYnVzIHJlc3RvcmF0aW9uIGZhaWxlZFxuIik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTNDk4NSBTTUJ1cyBtdWx0aXBsZXhpbmciKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwppbmRleCBhYzg4ZjQwLi4wMDM4YzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwpAQCAtNTEsNyArNTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKaW5kZXggYzYxZjM3YS4uODBlMDZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rlb24uYwppbmRleCBiOTI5YmEyLi44MTA0MmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCmluZGV4IGFhOTU3NzguLjYyZjU1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCkBAIC0xLDcgKzEsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAqIGkyYy1wYXJwb3J0LWxpZ2h0LmMgSTJDIGJ1cyBvdmVyIHBhcmFsbGVsIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKICAgIEJhc2VkIG9uIG9sZGVyIGkyYy12ZWxsZW1hbi5jIGRyaXZlcgogICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbApAQCAtMjczLDcgKzI3Myw3IEBACiAJcmVsZWFzZV9yZWdpb24oYmFzZSwgMyk7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAobGlnaHQpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LmMKaW5kZXggODFkODg3OC4uYTI3YWFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LmMKQEAgLTEsNyArMSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogICogaTJjLXBhcnBvcnQuYyBJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDExIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KIAogICAgQmFzZWQgb24gb2xkZXIgaTJjLXBoaWxpcHMtcGFyLmMgZHJpdmVyCiAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCkBAIC0yOTgsNyArMjk4LDcgQEAKIAlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfcGFycG9ydF9kcml2ZXIpOwogfQogCi1NT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTJDIGJ1cyBvdmVyIHBhcmFsbGVsIHBvcnQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LmggYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuaAppbmRleCAzZmU2NTIzLi5lNTcyZjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuaAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuaApAQCAtMSw3ICsxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAgKiBpMmMtcGFycG9ydC5oIEkyQyBidXMgb3ZlciBwYXJhbGxlbCBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKLSAgIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLXBsYXRmb3JtLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBjYS1wbGF0Zm9ybS5jCmluZGV4IDM5ZTI3NTUuLjg0NWYxMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLXBsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtcGxhdGZvcm0uYwpAQCAtMTIsNyArMTIsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYwppbmRleCBhMDI4NjE3Li4zOWRkOGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCkBAIC0yMiw3ICsyMiw3IEBACiAJSW50ZWwgUElJWDQsIDQ0ME1YCiAJU2VydmVyd29ya3MgT1NCNCwgQ1NCNSwgQ1NCNiwgSFQtMTAwMCwgSFQtMTEwMAogCUFUSSBJWFAyMDAsIElYUDMwMCwgSVhQNDAwLCBTQjYwMCwgU0I3MDAvU1A1MTAwLCBTQjgwMAotCUFNRCBIdWRzb24tMiwgQ1oKKwlBTUQgSHVkc29uLTIsIE1MLCBDWgogCVNNU0MgVmljdG9yeTY2CiAKICAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBvciBtb3JlCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTIwOCwxNiArMjA3LDE2IEBACiAJCQkJICAgIldBUk5JTkc6IFNNQnVzIGludGVyZmFjZSBoYXMgYmVlbiBGT1JDRUZVTExZIEVOQUJMRUQhXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LAotCQkJCSJIb3N0IFNNQnVzIGNvbnRyb2xsZXIgbm90IGVuYWJsZWQhXG4iKTsKKwkJCQkiU01CdXMgSG9zdCBDb250cm9sbGVyIG5vdCBlbmFibGVkIVxuIik7CiAJCQlyZWxlYXNlX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKIAlpZiAoKCh0ZW1wICYgMHgwRSkgPT0gOCkgfHwgKCh0ZW1wICYgMHgwRSkgPT0gMikpCi0JCWRldl9kYmcoJlBJSVg0X2Rldi0+ZGV2LCAiVXNpbmcgSW50ZXJydXB0IDkgZm9yIFNNQnVzLlxuIik7CisJCWRldl9kYmcoJlBJSVg0X2Rldi0+ZGV2LCAiVXNpbmcgSVJRIGZvciBTTUJ1c1xuIik7CiAJZWxzZSBpZiAoKHRlbXAgJiAweDBFKSA9PSAwKQotCQlkZXZfZGJnKCZQSUlYNF9kZXYtPmRldiwgIlVzaW5nIEludGVycnVwdCBTTUkjIGZvciBTTUJ1cy5cbiIpOworCQlkZXZfZGJnKCZQSUlYNF9kZXYtPmRldiwgIlVzaW5nIFNNSSMgZm9yIFNNQnVzXG4iKTsKIAllbHNlCiAJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiSWxsZWdhbCBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiAiCiAJCQkiKG9yIGNvZGUgb3V0IG9mIGRhdGUpIVxuIik7CkBAIC0yMzUsNyArMjM0LDggQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBwaWl4NF9zbWJhOwogCXVuc2lnbmVkIHNob3J0IHNtYmFfaWR4ID0gMHhjZDY7Ci0JdTggc21iYV9lbl9sbywgc21iYV9lbl9oaSwgaTJjY2ZnLCBpMmNjZmdfb2Zmc2V0ID0gMHgxMCwgc21iX2VuOworCXU4IHNtYmFfZW5fbG8sIHNtYmFfZW5faGksIHNtYl9lbiwgc21iX2VuX3N0YXR1czsKKwl1OCBpMmNjZmcsIGkyY2NmZ19vZmZzZXQgPSAweDEwOwogCiAJLyogU0I4MDAgYW5kIGxhdGVyIFNNQnVzIGRvZXMgbm90IHN1cHBvcnQgZm9yY2luZyBhZGRyZXNzICovCiAJaWYgKGZvcmNlIHx8IGZvcmNlX2FkZHIpIHsKQEAgLTI0NSw3ICsyNDUsMTUgQEAKIAl9CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWFzICovCi0Jc21iX2VuID0gKGF1eCkgPyAweDI4IDogMHgyYzsKKwlpZiAoKFBJSVg0X2Rldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCisJICAgICBQSUlYNF9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX1NNQlVTICYmCisJICAgICBQSUlYNF9kZXYtPnJldmlzaW9uID49IDB4NDEpIHx8CisJICAgIChQSUlYNF9kZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJgorCSAgICAgUElJWDRfZGV2LT5kZXZpY2UgPT0gMHg3OTBiICYmCisJICAgICBQSUlYNF9kZXYtPnJldmlzaW9uID49IDB4NDkpKQorCQlzbWJfZW4gPSAweDAwOworCWVsc2UKKwkJc21iX2VuID0gKGF1eCkgPyAweDI4IDogMHgyYzsKIAogCWlmICghcmVxdWVzdF9yZWdpb24oc21iYV9pZHgsIDIsICJzbWJhX2lkeCIpKSB7CiAJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIGluZGV4IHJlZ2lvbiAiCkBAIC0yNTgsMTMgKzI2NiwyMiBAQAogCXNtYmFfZW5faGkgPSBpbmJfcChzbWJhX2lkeCArIDEpOwogCXJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAyKTsKIAotCWlmICgoc21iYV9lbl9sbyAmIDEpID09IDApIHsKKwlpZiAoIXNtYl9lbikgeworCQlzbWJfZW5fc3RhdHVzID0gc21iYV9lbl9sbyAmIDB4MTA7CisJCXBpaXg0X3NtYmEgPSBzbWJhX2VuX2hpIDw8IDg7CisJCWlmIChhdXgpCisJCQlwaWl4NF9zbWJhIHw9IDB4MjA7CisJfSBlbHNlIHsKKwkJc21iX2VuX3N0YXR1cyA9IHNtYmFfZW5fbG8gJiAweDAxOworCQlwaWl4NF9zbWJhID0gKChzbWJhX2VuX2hpIDw8IDgpIHwgc21iYV9lbl9sbykgJiAweGZmZTA7CisJfQorCisJaWYgKCFzbWJfZW5fc3RhdHVzKSB7CiAJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LAotCQkJIkhvc3QgU01CdXMgY29udHJvbGxlciBub3QgZW5hYmxlZCFcbiIpOworCQkJIlNNQnVzIEhvc3QgQ29udHJvbGxlciBub3QgZW5hYmxlZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlwaWl4NF9zbWJhID0gKChzbWJhX2VuX2hpIDw8IDgpIHwgc21iYV9lbl9sbykgJiAweGZmZTA7CiAJaWYgKGFjcGlfY2hlY2tfcmVnaW9uKHBpaXg0X3NtYmEsIFNNQklPU0laRSwgcGlpeDRfZHJpdmVyLm5hbWUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMjc3LDcgKzI5NCw4IEBACiAJLyogQXV4IFNNQnVzIGRvZXMgbm90IHN1cHBvcnQgSVJRIGluZm9ybWF0aW9uICovCiAJaWYgKGF1eCkgewogCQlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsCi0JCQkgIlNNQnVzIEhvc3QgQ29udHJvbGxlciBhdCAweCV4XG4iLCBwaWl4NF9zbWJhKTsKKwkJCSAiQXV4aWxpYXJ5IFNNQnVzIEhvc3QgQ29udHJvbGxlciBhdCAweCV4XG4iLAorCQkJIHBpaXg0X3NtYmEpOwogCQlyZXR1cm4gcGlpeDRfc21iYTsKIAl9CiAKQEAgLTI5Miw5ICszMTAsOSBAQAogCXJlbGVhc2VfcmVnaW9uKHBpaXg0X3NtYmEgKyBpMmNjZmdfb2Zmc2V0LCAxKTsKIAogCWlmIChpMmNjZmcgJiAxKQotCQlkZXZfZGJnKCZQSUlYNF9kZXYtPmRldiwgIlVzaW5nIElSUSBmb3IgU01CdXMuXG4iKTsKKwkJZGV2X2RiZygmUElJWDRfZGV2LT5kZXYsICJVc2luZyBJUlEgZm9yIFNNQnVzXG4iKTsKIAllbHNlCi0JCWRldl9kYmcoJlBJSVg0X2Rldi0+ZGV2LCAiVXNpbmcgU01JIyBmb3IgU01CdXMuXG4iKTsKKwkJZGV2X2RiZygmUElJWDRfZGV2LT5kZXYsICJVc2luZyBTTUkjIGZvciBTTUJ1c1xuIik7CiAKIAlkZXZfaW5mbygmUElJWDRfZGV2LT5kZXYsCiAJCSAiU01CdXMgSG9zdCBDb250cm9sbGVyIGF0IDB4JXgsIHJldmlzaW9uICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKaW5kZXggZjYzODllMi4uODU2NDc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBvd2VybWFjLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBvd2VybWFjLmMKaW5kZXggOGM4N2Y0YS4uMDFlOTY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wdXYzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB1djMuYwppbmRleCBhYzgwMTk5Li5jODNmYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB1djMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB1djMuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yY2FyLmMKaW5kZXggMmMyZmQ3Yy4uMDI4MmQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yY2FyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yY2FyLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtMTExLDYgKzExMCw3IEBACiAJdm9pZCBfX2lvbWVtICppbzsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcDsKIAlzdHJ1Y3QgaTJjX21zZwkqbXNnOworCXN0cnVjdCBjbGsgKmNsazsKIAogCXNwaW5sb2NrX3QgbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwpAQCAtMjI3LDE4ICsyMjcsMTIgQEAKIAkJCQkgICAgdTMyIGJ1c19zcGVlZCwKIAkJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBjbGsgKmNsa3AgPSBjbGtfZ2V0KGRldiwgTlVMTCk7CiAJdTMyIHNjZ2QsIGNkZjsKIAl1MzIgcm91bmQsIGljazsKIAl1MzIgc2NsOwogCXUzMiBjZGZfd2lkdGg7CiAJdW5zaWduZWQgbG9uZyByYXRlOwogCi0JaWYgKElTX0VSUihjbGtwKSkgewotCQlkZXZfZXJyKGRldiwgImNvdWxkbid0IGdldCBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsa3ApOwotCX0KLQogCXN3aXRjaCAocHJpdi0+ZGV2dHlwZSkgewogCWNhc2UgSTJDX1JDQVJfR0VOMToKIAkJY2RmX3dpZHRoID0gMjsKQEAgLTI2Niw3ICsyNjAsNyBAQAogCSAqIGNsa3AgOiBwZXJpcGhlcmFsX2NsawogCSAqIEZbXSAgOiBpbnRlZ2VyIHVwLXZhbHVhdGlvbgogCSAqLwotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrcCk7CisJcmF0ZSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOwogCWNkZiA9IHJhdGUgLyAyMDAwMDAwMDsKIAlpZiAoY2RmID49IDEgPDwgY2RmX3dpZHRoKSB7CiAJCWRldl9lcnIoZGV2LCAiSW5wdXQgY2xvY2sgJWx1IHRvbyBoaWdoXG4iLCByYXRlKTsKQEAgLTMwOCw3ICszMDIsNyBAQAogCiBzY2dkX2ZpbmQ6CiAJZGV2X2RiZyhkZXYsICJjbGsgJWQvJWQoJWx1KSwgcm91bmQgJXUsIENERjoweCV4LCBTQ0dEOiAweCV4XG4iLAotCQlzY2wsIGJ1c19zcGVlZCwgY2xrX2dldF9yYXRlKGNsa3ApLCByb3VuZCwgY2RmLCBzY2dkKTsKKwkJc2NsLCBidXNfc3BlZWQsIGNsa19nZXRfcmF0ZShwcml2LT5jbGspLCByb3VuZCwgY2RmLCBzY2dkKTsKIAogCS8qCiAJICoga2VlcCBpY2NjciB2YWx1ZQpAQCAtNjA0LDcgKzU5OCw3IEBACiAJCSAqIGVycm9yIGhhbmRsaW5nCiAJCSAqLwogCQlpZiAocmNhcl9pMmNfZmxhZ3NfaGFzKHByaXYsIElEX05BQ0spKSB7Ci0JCQlyZXQgPSAtRVJFTU9URUlPOworCQkJcmV0ID0gLUVOWElPOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjIzLDcgKzYxNyw3IEBACiAKIAlwbV9ydW50aW1lX3B1dChkZXYpOwogCi0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTlhJTykKIAkJZGV2X2VycihkZXYsICJlcnJvciAlZCA6ICV4XG4iLCByZXQsIHByaXYtPmZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC02NjQsNiArNjU4LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXByaXYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBnZXQgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwcml2LT5jbGspOworCX0KKwogCWJ1c19zcGVlZCA9IDEwMDAwMDsgLyogZGVmYXVsdCAxMDAga0h6ICovCiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJmJ1c19zcGVlZCk7CiAJaWYgKHJldCA8IDAgJiYgcGRhdGEgJiYgcGRhdGEtPmJ1c19zcGVlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2NtaS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zY21pLmMKaW5kZXggNTk5MjM1NS4uZGZjOThkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zY21pLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zY21pLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKaW5kZXggNWU4ZjEzNi4uZDc2ZjNkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpbXRlYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaW10ZWMuYwppbmRleCA0ZmM4N2U3Li4yOTRjODBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpbXRlYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2ltdGVjLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCmluZGV4IDM2YTk1NTYuLjE5Yjg1MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzOTZ4LmMKaW5kZXggYjlmYWY5Yi4uZjhhYTBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMKaW5kZXggNmZmYTU2ZTAuLjA1NzYwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGFvcy1ldm0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMKQEAgLTMsNyArMyw3IEBACiAgKiBUaGVzZSBkZXZpY2VzIGluY2x1ZGUgYW4gSTJDIG1hc3RlciB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBvdmVyIHRoZQogICogc2VyaWFsIHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTMyMSw3ICszMjEsNyBAQAogCXNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ0YW9zX2Rydik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQU9TIGV2YWx1YXRpb24gbW9kdWxlIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWEuYwppbmRleCBiZTY2MjUxLi40OWQ3ZjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCmluZGV4IGIyZDkwZTEuLjQwZDM2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYwpAQCAtMiw3ICsyLDcgQEAKICAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAyICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAogICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sIEt5w7ZzdGkgTcOkbGtraSA8a21hbGtraUBjYy5odXQuZmk+LAogICAgIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4ICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01MDMsNyArNTAzLDcgQEAKIAogTU9EVUxFX0FVVEhPUigiS3lvc3RpIE1hbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCiAJICAgICAgIk1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4gYW5kICIKLQkgICAgICAiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CisJICAgICAgIkplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigidnQ4MmM1OTYgU01CdXMgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14aWljLmMKaW5kZXggNmY5OTE4Zi4uMjgxMDc1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14aWljLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14aWljLmMKQEAgLTMwLDcgKzMwLDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhsci5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHIuYwppbmRleCA3OTQ1YjA1Li4xN2Y3MzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhsci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGxyLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfaTJjLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jCmluZGV4IGFlMTI1OGIuLjhlYWRmMGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfaTJjLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggYzRjNTU4OC4uNWZiODBiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAvKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt5w7ZzdGkgTcOkbGtraSA8a21hbGtraUBjYy5odXQuZmk+LgogICAgQWxsIFNNQnVzLXJlbGF0ZWQgdGhpbmdzIGFyZSB3cml0dGVuIGJ5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KICAgIFNNQnVzIDIuMCBzdXBwb3J0IGJ5IE1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4gYW5kCi0gICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAgIE11eCBzdXBwb3J0IGJ5IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4gYW5kCiAgICBNaWNoYWVsIExhd25pY2sgPG1pY2hhZWwubGF3bmljay5leHRAbnNuLmNvbT4KICAgIE9GIHN1cHBvcnQgaXMgY29weXJpZ2h0IChjKSAyMDA4IEpvY2hlbiBGcmllZHJpY2ggPGpvY2hlbkBzY3JhbS5kZT4KQEAgLTI2MSwxMCArMjYxLDkgQEAKIAogCWFjcGlfZGV2X3BtX2F0dGFjaCgmY2xpZW50LT5kZXYsIHRydWUpOwogCXN0YXR1cyA9IGRyaXZlci0+cHJvYmUoY2xpZW50LCBpMmNfbWF0Y2hfaWQoZHJpdmVyLT5pZF90YWJsZSwgY2xpZW50KSk7Ci0JaWYgKHN0YXR1cykgewotCQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlpZiAoc3RhdHVzKQogCQlhY3BpX2Rldl9wbV9kZXRhY2goJmNsaWVudC0+ZGV2LCB0cnVlKTsKLQl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNzIsNyArMjcxLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50ID0gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgaTJjX2RyaXZlcgkqZHJpdmVyOwotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzID0gMDsKIAogCWlmICghY2xpZW50IHx8ICFkZXYtPmRyaXZlcikKIAkJcmV0dXJuIDA7CkBAIC0yODEsMTIgKzI4MCw4IEBACiAJaWYgKGRyaXZlci0+cmVtb3ZlKSB7CiAJCWRldl9kYmcoZGV2LCAicmVtb3ZlXG4iKTsKIAkJc3RhdHVzID0gZHJpdmVyLT5yZW1vdmUoY2xpZW50KTsKLQl9IGVsc2UgewotCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCXN0YXR1cyA9IDA7CiAJfQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisKIAlhY3BpX2Rldl9wbV9kZXRhY2goJmNsaWVudC0+ZGV2LCB0cnVlKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLXNtYnVzLmMgYi9kcml2ZXJzL2kyYy9pMmMtc21idXMuYwppbmRleCBjOTliMjI5Li5mYzk5ZjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtc21idXMuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtc21idXMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGkyYy1zbWJ1cy5jIC0gU01CdXMgZXh0ZW5zaW9ucyB0byB0aGUgSTJDIHByb3RvY29sCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIEJyb3duZWxsCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjQ2LDYgKzI0Niw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKHNtYmFsZXJ0X2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUJ1cyBwcm90b2NvbCBleHRlbnNpb25zIHN1cHBvcnQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1zdHViLmMgYi9kcml2ZXJzL2kyYy9pMmMtc3R1Yi5jCmluZGV4IGQwYTljNTkuLjc3ZTQ4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1zdHViLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLXN0dWIuYwpAQCAtMiw3ICsyLDcgQEAKICAgICBpMmMtc3R1Yi5jIC0gSTJDL1NNQnVzIGNoaXAgZW11bGF0b3IKIAogICAgIENvcHlyaWdodCAoYykgMjAwNCBNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDEyIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNywgMjAxMiBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtYXJiLWdwaW8tY2hhbGxlbmdlLmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtYXJiLWdwaW8tY2hhbGxlbmdlLmMKaW5kZXggYzU4ZTA5My4uNjlhZmZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWFyYi1ncGlvLWNoYWxsZW5nZS5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1hcmItZ3Bpby1jaGFsbGVuZ2UuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1tdXguaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1ncGlvLmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYwppbmRleCA4YThjNTZmLi5kODk4OWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1tdXguaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtbXV4LWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0MS5jIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTQxLmMKaW5kZXggYzRmMDhhZC4uY2I3NzI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTQxLmMKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTQxLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0eC5jIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMKaW5kZXggZTgzNTMwNC4uNTUwYmQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMKQEAgLTI4LDcgKzI4LDcgQEAKICAqIEJhc2VkIG9uOgogICoJaTJjLXZpcnR1YWxfY2IuYyBmcm9tIEJyaWFuIEt1c2NoYWsgPGJrdXNjaGFrQHlhaG9vLmNvbT4KICAqIGFuZAotICoJcGNhOTU0MC5jIGZyb20gSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+LgorICoJcGNhOTU0MC5jIGZyb20gSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPi4KICAqCiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1tdXguaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvcGNhOTU0eC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1waW5jdHJsLmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBpbmN0cmwuYwppbmRleCBkNzk3OGRjLi40ZmYwZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBpbmN0cmwuYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBpbmN0cmwuYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLW11eC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLW11eC1waW5jdHJsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2RfdmVyYm9zZS5jIGIvZHJpdmVycy9pZGUvaWRlLWNkX3ZlcmJvc2UuYwppbmRleCA2NDkwYTJkLi5mMDc5Y2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2RfdmVyYm9zZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZF92ZXJib3NlLmMKQEAgLTksNyArOSw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlICJpZGUtY2QuaCIKIAogI2lmbmRlZiBDT05GSUdfQkxLX0RFVl9JREVDRF9WRVJCT1NFX0VSUk9SUwogdm9pZCBpZGVfY2RfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXF1ZXN0ICpmYWlsZWRfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1waW8tYmxhY2tsaXN0LmMgYi9kcml2ZXJzL2lkZS9pZGUtcGlvLWJsYWNrbGlzdC5jCmluZGV4IGE4YzJjOGY4Li40MGU2ODNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcGlvLWJsYWNrbGlzdC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1waW8tYmxhY2tsaXN0LmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCiBzdGF0aWMgc3RydWN0IGlkZV9waW9faW5mbyB7CiAJY29uc3QgY2hhcgkqbmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYwppbmRleCA5ODA0ZmNhLi4yYjE2MWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jCkBAIC00NywxMCArNDcsMTAgQEAKIGlzZXJ0X21hcF9yZG1hKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kICpjbWQsCiAJICAgICAgIHN0cnVjdCBpc2VydF9yZG1hX3dyICp3cik7CiBzdGF0aWMgdm9pZAotaXNlcnRfdW5yZWdfcmRtYV9mcndyKHN0cnVjdCBpc2VydF9jbWQgKmlzZXJ0X2NtZCwgc3RydWN0IGlzZXJ0X2Nvbm4gKmlzZXJ0X2Nvbm4pOworaXNlcnRfdW5yZWdfcmRtYShzdHJ1Y3QgaXNlcnRfY21kICppc2VydF9jbWQsIHN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uKTsKIHN0YXRpYyBpbnQKLWlzZXJ0X3JlZ19yZG1hX2Zyd3Ioc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9jbWQgKmNtZCwKLQkJICAgIHN0cnVjdCBpc2VydF9yZG1hX3dyICp3cik7Citpc2VydF9yZWdfcmRtYShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2NtZCAqY21kLAorCSAgICAgICBzdHJ1Y3QgaXNlcnRfcmRtYV93ciAqd3IpOwogCiBzdGF0aWMgdm9pZAogaXNlcnRfcXBfZXZlbnRfY2FsbGJhY2soc3RydWN0IGliX2V2ZW50ICplLCB2b2lkICpjb250ZXh0KQpAQCAtMjI3LDExICsyMjcsMTEgQEAKIAogCS8qIGFzaWduIGZ1bmN0aW9uIGhhbmRsZXJzICovCiAJaWYgKGRldl9hdHRyLT5kZXZpY2VfY2FwX2ZsYWdzICYgSUJfREVWSUNFX01FTV9NR1RfRVhURU5TSU9OUykgewotCQlkZXZpY2UtPnVzZV9mcndyID0gMTsKLQkJZGV2aWNlLT5yZWdfcmRtYV9tZW0gPSBpc2VydF9yZWdfcmRtYV9mcndyOwotCQlkZXZpY2UtPnVucmVnX3JkbWFfbWVtID0gaXNlcnRfdW5yZWdfcmRtYV9mcndyOworCQlkZXZpY2UtPnVzZV9mYXN0cmVnID0gMTsKKwkJZGV2aWNlLT5yZWdfcmRtYV9tZW0gPSBpc2VydF9yZWdfcmRtYTsKKwkJZGV2aWNlLT51bnJlZ19yZG1hX21lbSA9IGlzZXJ0X3VucmVnX3JkbWE7CiAJfSBlbHNlIHsKLQkJZGV2aWNlLT51c2VfZnJ3ciA9IDA7CisJCWRldmljZS0+dXNlX2Zhc3RyZWcgPSAwOwogCQlkZXZpY2UtPnJlZ19yZG1hX21lbSA9IGlzZXJ0X21hcF9yZG1hOwogCQlkZXZpY2UtPnVucmVnX3JkbWFfbWVtID0gaXNlcnRfdW5tYXBfY21kOwogCX0KQEAgLTIzOSw5ICsyMzksMTAgQEAKIAlkZXZpY2UtPmNxc191c2VkID0gbWluX3QoaW50LCBudW1fb25saW5lX2NwdXMoKSwKIAkJCQkgZGV2aWNlLT5pYl9kZXZpY2UtPm51bV9jb21wX3ZlY3RvcnMpOwogCWRldmljZS0+Y3FzX3VzZWQgPSBtaW4oSVNFUlRfTUFYX0NRLCBkZXZpY2UtPmNxc191c2VkKTsKLQlwcl9kZWJ1ZygiVXNpbmcgJWQgQ1FzLCBkZXZpY2UgJXMgc3VwcG9ydHMgJWQgdmVjdG9ycyBzdXBwb3J0IEZSV1IgJWRcbiIsCisJcHJfZGVidWcoIlVzaW5nICVkIENRcywgZGV2aWNlICVzIHN1cHBvcnRzICVkIHZlY3RvcnMgc3VwcG9ydCAiCisJCSAiRmFzdCByZWdpc3RyYXRpb24gJWRcbiIsCiAJCSBkZXZpY2UtPmNxc191c2VkLCBkZXZpY2UtPmliX2RldmljZS0+bmFtZSwKLQkJIGRldmljZS0+aWJfZGV2aWNlLT5udW1fY29tcF92ZWN0b3JzLCBkZXZpY2UtPnVzZV9mcndyKTsKKwkJIGRldmljZS0+aWJfZGV2aWNlLT5udW1fY29tcF92ZWN0b3JzLCBkZXZpY2UtPnVzZV9mYXN0cmVnKTsKIAlkZXZpY2UtPmNxX2Rlc2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXNlcnRfY3FfZGVzYykgKgogCQkJCWRldmljZS0+Y3FzX3VzZWQsIEdGUF9LRVJORUwpOwogCWlmICghZGV2aWNlLT5jcV9kZXNjKSB7CkBAIC0yNTAsMTMgKzI1MSw2IEBACiAJfQogCWNxX2Rlc2MgPSBkZXZpY2UtPmNxX2Rlc2M7CiAKLQlkZXZpY2UtPmRldl9wZCA9IGliX2FsbG9jX3BkKGliX2Rldik7Ci0JaWYgKElTX0VSUihkZXZpY2UtPmRldl9wZCkpIHsKLQkJcmV0ID0gUFRSX0VSUihkZXZpY2UtPmRldl9wZCk7Ci0JCXByX2VycigiaWJfYWxsb2NfcGQgZmFpbGVkIGZvciBkZXZfcGQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9jcV9kZXNjOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPmNxc191c2VkOyBpKyspIHsKIAkJY3FfZGVzY1tpXS5kZXZpY2UgPSBkZXZpY2U7CiAJCWNxX2Rlc2NbaV0uY3FfaW5kZXggPSBpOwpAQCAtMjk0LDEzICsyODgsNiBAQAogCQkJZ290byBvdXRfY3E7CiAJfQogCi0JZGV2aWNlLT5kZXZfbXIgPSBpYl9nZXRfZG1hX21yKGRldmljZS0+ZGV2X3BkLCBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUpOwotCWlmIChJU19FUlIoZGV2aWNlLT5kZXZfbXIpKSB7Ci0JCXJldCA9IFBUUl9FUlIoZGV2aWNlLT5kZXZfbXIpOwotCQlwcl9lcnIoImliX2dldF9kbWFfbXIgZmFpbGVkIGZvciBkZXZfbXI6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9jcTsKLQl9Ci0KIAlyZXR1cm4gMDsKIAogb3V0X2NxOgpAQCAtMzE2LDkgKzMwMyw2IEBACiAJCQlpYl9kZXN0cm95X2NxKGRldmljZS0+ZGV2X3R4X2NxW2pdKTsKIAkJfQogCX0KLQlpYl9kZWFsbG9jX3BkKGRldmljZS0+ZGV2X3BkKTsKLQotb3V0X2NxX2Rlc2M6CiAJa2ZyZWUoZGV2aWNlLT5jcV9kZXNjKTsKIAogCXJldHVybiByZXQ7CkBAIC0zNDEsOCArMzI1LDYgQEAKIAkJZGV2aWNlLT5kZXZfdHhfY3FbaV0gPSBOVUxMOwogCX0KIAotCWliX2RlcmVnX21yKGRldmljZS0+ZGV2X21yKTsKLQlpYl9kZWFsbG9jX3BkKGRldmljZS0+ZGV2X3BkKTsKIAlrZnJlZShkZXZpY2UtPmNxX2Rlc2MpOwogfQogCkBAIC0zOTgsMTggKzM4MCwxOCBAQAogfQogCiBzdGF0aWMgdm9pZAotaXNlcnRfY29ubl9mcmVlX2Zyd3JfcG9vbChzdHJ1Y3QgaXNlcnRfY29ubiAqaXNlcnRfY29ubikKK2lzZXJ0X2Nvbm5fZnJlZV9mYXN0cmVnX3Bvb2woc3RydWN0IGlzZXJ0X2Nvbm4gKmlzZXJ0X2Nvbm4pCiB7CiAJc3RydWN0IGZhc3RfcmVnX2Rlc2NyaXB0b3IgKmZyX2Rlc2MsICp0bXA7CiAJaW50IGkgPSAwOwogCi0JaWYgKGxpc3RfZW1wdHkoJmlzZXJ0X2Nvbm4tPmNvbm5fZnJ3cl9wb29sKSkKKwlpZiAobGlzdF9lbXB0eSgmaXNlcnRfY29ubi0+Y29ubl9mcl9wb29sKSkKIAkJcmV0dXJuOwogCi0JcHJfZGVidWcoIkZyZWVpbmcgY29ubiAlcCBmcndyIHBvb2wiLCBpc2VydF9jb25uKTsKKwlwcl9kZWJ1ZygiRnJlZWluZyBjb25uICVwIGZhc3RyZWcgcG9vbCIsIGlzZXJ0X2Nvbm4pOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZyX2Rlc2MsIHRtcCwKLQkJCQkgJmlzZXJ0X2Nvbm4tPmNvbm5fZnJ3cl9wb29sLCBsaXN0KSB7CisJCQkJICZpc2VydF9jb25uLT5jb25uX2ZyX3Bvb2wsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmZyX2Rlc2MtPmxpc3QpOwogCQlpYl9mcmVlX2Zhc3RfcmVnX3BhZ2VfbGlzdChmcl9kZXNjLT5kYXRhX2ZycGwpOwogCQlpYl9kZXJlZ19tcihmcl9kZXNjLT5kYXRhX21yKTsKQEAgLTQxNywyMCArMzk5LDQ3IEBACiAJCSsraTsKIAl9CiAKLQlpZiAoaSA8IGlzZXJ0X2Nvbm4tPmNvbm5fZnJ3cl9wb29sX3NpemUpCisJaWYgKGkgPCBpc2VydF9jb25uLT5jb25uX2ZyX3Bvb2xfc2l6ZSkKIAkJcHJfd2FybigiUG9vbCBzdGlsbCBoYXMgJWQgcmVnaW9ucyByZWdpc3RlcmVkXG4iLAotCQkJaXNlcnRfY29ubi0+Y29ubl9mcndyX3Bvb2xfc2l6ZSAtIGkpOworCQkJaXNlcnRfY29ubi0+Y29ubl9mcl9wb29sX3NpemUgLSBpKTsKIH0KIAogc3RhdGljIGludAotaXNlcnRfY29ubl9jcmVhdGVfZnJ3cl9wb29sKHN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uKQoraXNlcnRfY3JlYXRlX2ZyX2Rlc2Moc3RydWN0IGliX2RldmljZSAqaWJfZGV2aWNlLCBzdHJ1Y3QgaWJfcGQgKnBkLAorCQkgICAgIHN0cnVjdCBmYXN0X3JlZ19kZXNjcmlwdG9yICpmcl9kZXNjKQoreworCWZyX2Rlc2MtPmRhdGFfZnJwbCA9IGliX2FsbG9jX2Zhc3RfcmVnX3BhZ2VfbGlzdChpYl9kZXZpY2UsCisJCQkJCQkJIElTQ1NJX0lTRVJfU0dfVEFCTEVTSVpFKTsKKwlpZiAoSVNfRVJSKGZyX2Rlc2MtPmRhdGFfZnJwbCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBmcnBsIGVycj0lbGRcbiIsCisJCSAgICAgICBQVFJfRVJSKGZyX2Rlc2MtPmRhdGFfZnJwbCkpOworCQlyZXR1cm4gUFRSX0VSUihmcl9kZXNjLT5kYXRhX2ZycGwpOworCX0KKworCWZyX2Rlc2MtPmRhdGFfbXIgPSBpYl9hbGxvY19mYXN0X3JlZ19tcihwZCwgSVNDU0lfSVNFUl9TR19UQUJMRVNJWkUpOworCWlmIChJU19FUlIoZnJfZGVzYy0+ZGF0YV9tcikpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBmcm1yIGVycj0lbGRcbiIsCisJCSAgICAgICBQVFJfRVJSKGZyX2Rlc2MtPmRhdGFfbXIpKTsKKwkJaWJfZnJlZV9mYXN0X3JlZ19wYWdlX2xpc3QoZnJfZGVzYy0+ZGF0YV9mcnBsKTsKKwkJcmV0dXJuIFBUUl9FUlIoZnJfZGVzYy0+ZGF0YV9tcik7CisJfQorCXByX2RlYnVnKCJDcmVhdGUgZnJfZGVzYyAlcCBwYWdlX2xpc3QgJXBcbiIsCisJCSBmcl9kZXNjLCBmcl9kZXNjLT5kYXRhX2ZycGwtPnBhZ2VfbGlzdCk7CisKKwlmcl9kZXNjLT52YWxpZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNlcnRfY29ubl9jcmVhdGVfZmFzdHJlZ19wb29sKHN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uKQogewogCXN0cnVjdCBmYXN0X3JlZ19kZXNjcmlwdG9yICpmcl9kZXNjOwogCXN0cnVjdCBpc2VydF9kZXZpY2UgKmRldmljZSA9IGlzZXJ0X2Nvbm4tPmNvbm5fZGV2aWNlOwogCWludCBpLCByZXQ7CiAKLQlJTklUX0xJU1RfSEVBRCgmaXNlcnRfY29ubi0+Y29ubl9mcndyX3Bvb2wpOwotCWlzZXJ0X2Nvbm4tPmNvbm5fZnJ3cl9wb29sX3NpemUgPSAwOworCUlOSVRfTElTVF9IRUFEKCZpc2VydF9jb25uLT5jb25uX2ZyX3Bvb2wpOworCWlzZXJ0X2Nvbm4tPmNvbm5fZnJfcG9vbF9zaXplID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgSVNDU0lfREVGX1hNSVRfQ01EU19NQVg7IGkrKykgewogCQlmcl9kZXNjID0ga3phbGxvYyhzaXplb2YoKmZyX2Rlc2MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFmcl9kZXNjKSB7CkBAIC00MzksNDAgKzQ0OCwyNSBAQAogCQkJZ290byBlcnI7CiAJCX0KIAotCQlmcl9kZXNjLT5kYXRhX2ZycGwgPQotCQkJaWJfYWxsb2NfZmFzdF9yZWdfcGFnZV9saXN0KGRldmljZS0+aWJfZGV2aWNlLAotCQkJCQkJICAgIElTQ1NJX0lTRVJfU0dfVEFCTEVTSVpFKTsKLQkJaWYgKElTX0VSUihmcl9kZXNjLT5kYXRhX2ZycGwpKSB7Ci0JCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBmcl9wZ19saXN0IGVycj0lbGRcbiIsCi0JCQkgICAgICAgUFRSX0VSUihmcl9kZXNjLT5kYXRhX2ZycGwpKTsKLQkJCXJldCA9IFBUUl9FUlIoZnJfZGVzYy0+ZGF0YV9mcnBsKTsKKwkJcmV0ID0gaXNlcnRfY3JlYXRlX2ZyX2Rlc2MoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQkJCSAgIGlzZXJ0X2Nvbm4tPmNvbm5fcGQsIGZyX2Rlc2MpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgZmFzdHJlZyBkZXNjcmlwdG9yIGVycj0lZFxuIiwKKwkJCSAgICAgICByZXQpOwogCQkJZ290byBlcnI7CiAJCX0KIAotCQlmcl9kZXNjLT5kYXRhX21yID0gaWJfYWxsb2NfZmFzdF9yZWdfbXIoZGV2aWNlLT5kZXZfcGQsCi0JCQkJCUlTQ1NJX0lTRVJfU0dfVEFCTEVTSVpFKTsKLQkJaWYgKElTX0VSUihmcl9kZXNjLT5kYXRhX21yKSkgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJtciBlcnI9JWxkXG4iLAotCQkJICAgICAgIFBUUl9FUlIoZnJfZGVzYy0+ZGF0YV9tcikpOwotCQkJcmV0ID0gUFRSX0VSUihmcl9kZXNjLT5kYXRhX21yKTsKLQkJCWliX2ZyZWVfZmFzdF9yZWdfcGFnZV9saXN0KGZyX2Rlc2MtPmRhdGFfZnJwbCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlwcl9kZWJ1ZygiQ3JlYXRlIGZyX2Rlc2MgJXAgcGFnZV9saXN0ICVwXG4iLAotCQkJIGZyX2Rlc2MsIGZyX2Rlc2MtPmRhdGFfZnJwbC0+cGFnZV9saXN0KTsKLQotCQlmcl9kZXNjLT52YWxpZCA9IHRydWU7Ci0JCWxpc3RfYWRkX3RhaWwoJmZyX2Rlc2MtPmxpc3QsICZpc2VydF9jb25uLT5jb25uX2Zyd3JfcG9vbCk7Ci0JCWlzZXJ0X2Nvbm4tPmNvbm5fZnJ3cl9wb29sX3NpemUrKzsKKwkJbGlzdF9hZGRfdGFpbCgmZnJfZGVzYy0+bGlzdCwgJmlzZXJ0X2Nvbm4tPmNvbm5fZnJfcG9vbCk7CisJCWlzZXJ0X2Nvbm4tPmNvbm5fZnJfcG9vbF9zaXplKys7CiAJfQogCi0JcHJfZGVidWcoIkNyZWF0aW5nIGNvbm4gJXAgZnJ3ciBwb29sIHNpemU9JWQiLAotCQkgaXNlcnRfY29ubiwgaXNlcnRfY29ubi0+Y29ubl9mcndyX3Bvb2xfc2l6ZSk7CisJcHJfZGVidWcoIkNyZWF0aW5nIGNvbm4gJXAgZmFzdHJlZyBwb29sIHNpemU9JWQiLAorCQkgaXNlcnRfY29ubiwgaXNlcnRfY29ubi0+Y29ubl9mcl9wb29sX3NpemUpOwogCiAJcmV0dXJuIDA7CiAKIGVycjoKLQlpc2VydF9jb25uX2ZyZWVfZnJ3cl9wb29sKGlzZXJ0X2Nvbm4pOworCWlzZXJ0X2Nvbm5fZnJlZV9mYXN0cmVnX3Bvb2woaXNlcnRfY29ubik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTU4LDE0ICs1NTIsMjkgQEAKIAl9CiAKIAlpc2VydF9jb25uLT5jb25uX2RldmljZSA9IGRldmljZTsKLQlpc2VydF9jb25uLT5jb25uX3BkID0gZGV2aWNlLT5kZXZfcGQ7Ci0JaXNlcnRfY29ubi0+Y29ubl9tciA9IGRldmljZS0+ZGV2X21yOworCWlzZXJ0X2Nvbm4tPmNvbm5fcGQgPSBpYl9hbGxvY19wZChpc2VydF9jb25uLT5jb25uX2RldmljZS0+aWJfZGV2aWNlKTsKKwlpZiAoSVNfRVJSKGlzZXJ0X2Nvbm4tPmNvbm5fcGQpKSB7CisJCXJldCA9IFBUUl9FUlIoaXNlcnRfY29ubi0+Y29ubl9wZCk7CisJCXByX2VycigiaWJfYWxsb2NfcGQgZmFpbGVkIGZvciBjb25uICVwOiByZXQ9JWRcbiIsCisJCSAgICAgICBpc2VydF9jb25uLCByZXQpOworCQlnb3RvIG91dF9wZDsKKwl9CiAKLQlpZiAoZGV2aWNlLT51c2VfZnJ3cikgewotCQlyZXQgPSBpc2VydF9jb25uX2NyZWF0ZV9mcndyX3Bvb2woaXNlcnRfY29ubik7CisJaXNlcnRfY29ubi0+Y29ubl9tciA9IGliX2dldF9kbWFfbXIoaXNlcnRfY29ubi0+Y29ubl9wZCwKKwkJCQkJICAgSUJfQUNDRVNTX0xPQ0FMX1dSSVRFKTsKKwlpZiAoSVNfRVJSKGlzZXJ0X2Nvbm4tPmNvbm5fbXIpKSB7CisJCXJldCA9IFBUUl9FUlIoaXNlcnRfY29ubi0+Y29ubl9tcik7CisJCXByX2VycigiaWJfZ2V0X2RtYV9tciBmYWlsZWQgZm9yIGNvbm4gJXA6IHJldD0lZFxuIiwKKwkJICAgICAgIGlzZXJ0X2Nvbm4sIHJldCk7CisJCWdvdG8gb3V0X21yOworCX0KKworCWlmIChkZXZpY2UtPnVzZV9mYXN0cmVnKSB7CisJCXJldCA9IGlzZXJ0X2Nvbm5fY3JlYXRlX2Zhc3RyZWdfcG9vbChpc2VydF9jb25uKTsKIAkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJDb25uOiAlcCBmYWlsZWQgdG8gY3JlYXRlIGZyd3JfcG9vbFxuIiwgaXNlcnRfY29ubik7Ci0JCQlnb3RvIG91dF9mcndyOworCQkJcHJfZXJyKCJDb25uOiAlcCBmYWlsZWQgdG8gY3JlYXRlIGZhc3RyZWcgcG9vbFxuIiwKKwkJCSAgICAgICBpc2VydF9jb25uKTsKKwkJCWdvdG8gb3V0X2Zhc3RyZWc7CiAJCX0KIAl9CiAKQEAgLTU4Miw5ICs1OTEsMTMgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2Nvbm5fZGV2OgotCWlmIChkZXZpY2UtPnVzZV9mcndyKQotCQlpc2VydF9jb25uX2ZyZWVfZnJ3cl9wb29sKGlzZXJ0X2Nvbm4pOwotb3V0X2Zyd3I6CisJaWYgKGRldmljZS0+dXNlX2Zhc3RyZWcpCisJCWlzZXJ0X2Nvbm5fZnJlZV9mYXN0cmVnX3Bvb2woaXNlcnRfY29ubik7CitvdXRfZmFzdHJlZzoKKwlpYl9kZXJlZ19tcihpc2VydF9jb25uLT5jb25uX21yKTsKK291dF9tcjoKKwlpYl9kZWFsbG9jX3BkKGlzZXJ0X2Nvbm4tPmNvbm5fcGQpOworb3V0X3BkOgogCWlzZXJ0X2RldmljZV90cnlfcmVsZWFzZShkZXZpY2UpOwogb3V0X3JzcF9kbWFfbWFwOgogCWliX2RtYV91bm1hcF9zaW5nbGUoaWJfZGV2LCBpc2VydF9jb25uLT5sb2dpbl9yc3BfZG1hLApAQCAtNjA4LDggKzYyMSw4IEBACiAKIAlwcl9kZWJ1ZygiRW50ZXJpbmcgaXNlcnRfY29ubmVjdF9yZWxlYXNlKCk6ID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIik7CiAKLQlpZiAoZGV2aWNlICYmIGRldmljZS0+dXNlX2Zyd3IpCi0JCWlzZXJ0X2Nvbm5fZnJlZV9mcndyX3Bvb2woaXNlcnRfY29ubik7CisJaWYgKGRldmljZSAmJiBkZXZpY2UtPnVzZV9mYXN0cmVnKQorCQlpc2VydF9jb25uX2ZyZWVfZmFzdHJlZ19wb29sKGlzZXJ0X2Nvbm4pOwogCiAJaWYgKGlzZXJ0X2Nvbm4tPmNvbm5fcXApIHsKIAkJY3FfaW5kZXggPSAoKHN0cnVjdCBpc2VydF9jcV9kZXNjICopCkBAIC02MjMsNiArNjM2LDkgQEAKIAlpc2VydF9mcmVlX3J4X2Rlc2NyaXB0b3JzKGlzZXJ0X2Nvbm4pOwogCXJkbWFfZGVzdHJveV9pZChpc2VydF9jb25uLT5jb25uX2NtX2lkKTsKIAorCWliX2RlcmVnX21yKGlzZXJ0X2Nvbm4tPmNvbm5fbXIpOworCWliX2RlYWxsb2NfcGQoaXNlcnRfY29ubi0+Y29ubl9wZCk7CisKIAlpZiAoaXNlcnRfY29ubi0+bG9naW5fYnVmKSB7CiAJCWliX2RtYV91bm1hcF9zaW5nbGUoaWJfZGV2LCBpc2VydF9jb25uLT5sb2dpbl9yc3BfZG1hLAogCQkJCSAgICBJU0VSX1JYX0xPR0lOX1NJWkUsIERNQV9UT19ERVZJQ0UpOwpAQCAtMTAyNCwxMyArMTA0MCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlzY3NpX2NtZAotKmlzZXJ0X2FsbG9jYXRlX2NtZChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgZ2ZwX3QgZ2ZwKQorKmlzZXJ0X2FsbG9jYXRlX2NtZChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKIHsKIAlzdHJ1Y3QgaXNlcnRfY29ubiAqaXNlcnRfY29ubiA9IChzdHJ1Y3QgaXNlcnRfY29ubiAqKWNvbm4tPmNvbnRleHQ7CiAJc3RydWN0IGlzZXJ0X2NtZCAqaXNlcnRfY21kOwogCXN0cnVjdCBpc2NzaV9jbWQgKmNtZDsKIAotCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgZ2ZwKTsKKwljbWQgPSBpc2NzaXRfYWxsb2NhdGVfY21kKGNvbm4sIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJaWYgKCFjbWQpIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgaXNjc2lfY21kICsgaXNlcnRfY21kXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMjE5LDcgKzEyMzUsNyBAQAogCiAJc3dpdGNoIChvcGNvZGUpIHsKIAljYXNlIElTQ1NJX09QX1NDU0lfQ01EOgotCQljbWQgPSBpc2VydF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJCWNtZCA9IGlzZXJ0X2FsbG9jYXRlX2NtZChjb25uKTsKIAkJaWYgKCFjbWQpCiAJCQlicmVhazsKIApAQCAtMTIzMyw3ICsxMjQ5LDcgQEAKIAkJCQkJcnhfZGVzYywgKHVuc2lnbmVkIGNoYXIgKiloZHIpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX09QX05PT1BfT1VUOgotCQljbWQgPSBpc2VydF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJCWNtZCA9IGlzZXJ0X2FsbG9jYXRlX2NtZChjb25uKTsKIAkJaWYgKCFjbWQpCiAJCQlicmVhazsKIApAQCAtMTI0Niw3ICsxMjYyLDcgQEAKIAkJCQkJCSh1bnNpZ25lZCBjaGFyICopaGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9TQ1NJX1RNRlVOQzoKLQkJY21kID0gaXNlcnRfYWxsb2NhdGVfY21kKGNvbm4sIEdGUF9LRVJORUwpOworCQljbWQgPSBpc2VydF9hbGxvY2F0ZV9jbWQoY29ubik7CiAJCWlmICghY21kKQogCQkJYnJlYWs7CiAKQEAgLTEyNTQsNyArMTI3MCw3IEBACiAJCQkJCQkodW5zaWduZWQgY2hhciAqKWhkcik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfTE9HT1VUOgotCQljbWQgPSBpc2VydF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJCWNtZCA9IGlzZXJ0X2FsbG9jYXRlX2NtZChjb25uKTsKIAkJaWYgKCFjbWQpCiAJCQlicmVhazsKIApAQCAtMTI2NSw3ICsxMjgxLDcgQEAKIAkJCQkJCSAgICBIWik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfVEVYVDoKLQkJY21kID0gaXNlcnRfYWxsb2NhdGVfY21kKGNvbm4sIEdGUF9LRVJORUwpOworCQljbWQgPSBpc2VydF9hbGxvY2F0ZV9jbWQoY29ubik7CiAJCWlmICghY21kKQogCQkJYnJlYWs7CiAKQEAgLTE0MDQsMjUgKzE0MjAsMjUgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlzZXJ0X3VucmVnX3JkbWFfZnJ3cihzdHJ1Y3QgaXNlcnRfY21kICppc2VydF9jbWQsIHN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uKQoraXNlcnRfdW5yZWdfcmRtYShzdHJ1Y3QgaXNlcnRfY21kICppc2VydF9jbWQsIHN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uKQogewogCXN0cnVjdCBpc2VydF9yZG1hX3dyICp3ciA9ICZpc2VydF9jbWQtPnJkbWFfd3I7CiAJc3RydWN0IGliX2RldmljZSAqaWJfZGV2ID0gaXNlcnRfY29ubi0+Y29ubl9jbV9pZC0+ZGV2aWNlOwogCUxJU1RfSEVBRCh1bm1hcF9saXN0KTsKIAotCXByX2RlYnVnKCJ1bnJlZ19mcndyX2NtZDogJXBcbiIsIGlzZXJ0X2NtZCk7CisJcHJfZGVidWcoInVucmVnX2Zhc3RyZWdfY21kOiAlcFxuIiwgaXNlcnRfY21kKTsKIAogCWlmICh3ci0+ZnJfZGVzYykgewotCQlwcl9kZWJ1ZygidW5yZWdfZnJ3cl9jbWQ6ICVwIGZyZWUgZnJfZGVzYyAlcFxuIiwKKwkJcHJfZGVidWcoInVucmVnX2Zhc3RyZWdfY21kOiAlcCBmcmVlIGZyX2Rlc2MgJXBcbiIsCiAJCQkgaXNlcnRfY21kLCB3ci0+ZnJfZGVzYyk7CiAJCXNwaW5fbG9ja19iaCgmaXNlcnRfY29ubi0+Y29ubl9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmd3ItPmZyX2Rlc2MtPmxpc3QsICZpc2VydF9jb25uLT5jb25uX2Zyd3JfcG9vbCk7CisJCWxpc3RfYWRkX3RhaWwoJndyLT5mcl9kZXNjLT5saXN0LCAmaXNlcnRfY29ubi0+Y29ubl9mcl9wb29sKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlzZXJ0X2Nvbm4tPmNvbm5fbG9jayk7CiAJCXdyLT5mcl9kZXNjID0gTlVMTDsKIAl9CiAKIAlpZiAod3ItPnNnZSkgewotCQlwcl9kZWJ1ZygidW5yZWdfZnJ3cl9jbWQ6ICVwIHVubWFwX3NnIG9wXG4iLCBpc2VydF9jbWQpOworCQlwcl9kZWJ1ZygidW5yZWdfZmFzdHJlZ19jbWQ6ICVwIHVubWFwX3NnIG9wXG4iLCBpc2VydF9jbWQpOwogCQlpYl9kbWFfdW5tYXBfc2coaWJfZGV2LCB3ci0+c2dlLCB3ci0+bnVtX3NnZSwKIAkJCQkod3ItPmlzZXJfaWJfb3AgPT0gSVNFUl9JQl9SRE1BX1dSSVRFKSA/CiAJCQkJRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CkBAIC0yMTYzLDI2ICsyMTc5LDIyIEBACiAKIHN0YXRpYyBpbnQKIGlzZXJ0X2Zhc3RfcmVnX21yKHN0cnVjdCBmYXN0X3JlZ19kZXNjcmlwdG9yICpmcl9kZXNjLAotCQkgIHN0cnVjdCBpc2VydF9jbWQgKmlzZXJ0X2NtZCwgc3RydWN0IGlzZXJ0X2Nvbm4gKmlzZXJ0X2Nvbm4sCi0JCSAgc3RydWN0IGliX3NnZSAqaWJfc2dlLCB1MzIgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgZGF0YV9sZW4pCisJCSAgc3RydWN0IGlzZXJ0X2Nvbm4gKmlzZXJ0X2Nvbm4sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfc3RhcnQsCisJCSAgc3RydWN0IGliX3NnZSAqaWJfc2dlLCB1MzIgc2dfbmVudHMsIHUzMiBvZmZzZXQsCisJCSAgdW5zaWduZWQgaW50IGRhdGFfbGVuKQogewotCXN0cnVjdCBpc2NzaV9jbWQgKmNtZCA9IGlzZXJ0X2NtZC0+aXNjc2lfY21kOwogCXN0cnVjdCBpYl9kZXZpY2UgKmliX2RldiA9IGlzZXJ0X2Nvbm4tPmNvbm5fY21faWQtPmRldmljZTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3N0YXJ0OwotCXUzMiBzZ19vZmYsIHBhZ2Vfb2ZmOwogCXN0cnVjdCBpYl9zZW5kX3dyIGZyX3dyLCBpbnZfd3I7CiAJc3RydWN0IGliX3NlbmRfd3IgKmJhZF93ciwgKndyID0gTlVMTDsKKwlpbnQgcmV0LCBwYWdlbGlzdF9sZW47CisJdTMyIHBhZ2Vfb2ZmOwogCXU4IGtleTsKLQlpbnQgcmV0LCBzZ19uZW50cywgcGFnZWxpc3RfbGVuOwogCi0Jc2dfb2ZmID0gb2Zmc2V0IC8gUEFHRV9TSVpFOwotCXNnX3N0YXJ0ID0gJmNtZC0+c2VfY21kLnRfZGF0YV9zZ1tzZ19vZmZdOwotCXNnX25lbnRzID0gbWluX3QodW5zaWduZWQgaW50LCBjbWQtPnNlX2NtZC50X2RhdGFfbmVudHMgLSBzZ19vZmYsCi0JCQkgSVNDU0lfSVNFUl9TR19UQUJMRVNJWkUpOworCXNnX25lbnRzID0gbWluX3QodW5zaWduZWQgaW50LCBzZ19uZW50cywgSVNDU0lfSVNFUl9TR19UQUJMRVNJWkUpOwogCXBhZ2Vfb2ZmID0gb2Zmc2V0ICUgUEFHRV9TSVpFOwogCi0JcHJfZGVidWcoIkNtZDogJXAgdXNlIGZyX2Rlc2MgJXAgc2dfbmVudHMgJWQgc2dfb2ZmICVkIG9mZnNldCAldVxuIiwKLQkJIGlzZXJ0X2NtZCwgZnJfZGVzYywgc2dfbmVudHMsIHNnX29mZiwgb2Zmc2V0KTsKKwlwcl9kZWJ1ZygiVXNlIGZyX2Rlc2MgJXAgc2dfbmVudHMgJWQgb2Zmc2V0ICV1XG4iLAorCQkgZnJfZGVzYywgc2dfbmVudHMsIG9mZnNldCk7CiAKIAlwYWdlbGlzdF9sZW4gPSBpc2VydF9tYXBfZnJfcGFnZWxpc3QoaWJfZGV2LCBzZ19zdGFydCwgc2dfbmVudHMsCiAJCQkJCSAgICAgJmZyX2Rlc2MtPmRhdGFfZnJwbC0+cGFnZV9saXN0WzBdKTsKQEAgLTIyMzIsOCArMjI0NCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWlzZXJ0X3JlZ19yZG1hX2Zyd3Ioc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9jbWQgKmNtZCwKLQkJICAgIHN0cnVjdCBpc2VydF9yZG1hX3dyICp3cikKK2lzZXJ0X3JlZ19yZG1hKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kICpjbWQsCisJICAgICAgIHN0cnVjdCBpc2VydF9yZG1hX3dyICp3cikKIHsKIAlzdHJ1Y3Qgc2VfY21kICpzZV9jbWQgPSAmY21kLT5zZV9jbWQ7CiAJc3RydWN0IGlzZXJ0X2NtZCAqaXNlcnRfY21kID0gaXNjc2l0X3ByaXZfY21kKGNtZCk7CkBAIC0yMjUxLDkgKzIyNjMsOSBAQAogCWlmICh3ci0+aXNlcl9pYl9vcCA9PSBJU0VSX0lCX1JETUFfV1JJVEUpIHsKIAkJZGF0YV9sZWZ0ID0gc2VfY21kLT5kYXRhX2xlbmd0aDsKIAl9IGVsc2UgewotCQlzZ19vZmYgPSBjbWQtPndyaXRlX2RhdGFfZG9uZSAvIFBBR0VfU0laRTsKLQkJZGF0YV9sZWZ0ID0gc2VfY21kLT5kYXRhX2xlbmd0aCAtIGNtZC0+d3JpdGVfZGF0YV9kb25lOwogCQlvZmZzZXQgPSBjbWQtPndyaXRlX2RhdGFfZG9uZTsKKwkJc2dfb2ZmID0gb2Zmc2V0IC8gUEFHRV9TSVpFOworCQlkYXRhX2xlZnQgPSBzZV9jbWQtPmRhdGFfbGVuZ3RoIC0gY21kLT53cml0ZV9kYXRhX2RvbmU7CiAJCWlzZXJ0X2NtZC0+dHhfZGVzYy5pc2VydF9jbWQgPSBpc2VydF9jbWQ7CiAJfQogCkBAIC0yMzExLDE2ICsyMzIzLDE2IEBACiAJCXdyLT5mcl9kZXNjID0gTlVMTDsKIAl9IGVsc2UgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNlcnRfY29ubi0+Y29ubl9sb2NrLCBmbGFncyk7Ci0JCWZyX2Rlc2MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpc2VydF9jb25uLT5jb25uX2Zyd3JfcG9vbCwKKwkJZnJfZGVzYyA9IGxpc3RfZmlyc3RfZW50cnkoJmlzZXJ0X2Nvbm4tPmNvbm5fZnJfcG9vbCwKIAkJCQkJICAgc3RydWN0IGZhc3RfcmVnX2Rlc2NyaXB0b3IsIGxpc3QpOwogCQlsaXN0X2RlbCgmZnJfZGVzYy0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzZXJ0X2Nvbm4tPmNvbm5fbG9jaywgZmxhZ3MpOwogCQl3ci0+ZnJfZGVzYyA9IGZyX2Rlc2M7CiAKLQkJcmV0ID0gaXNlcnRfZmFzdF9yZWdfbXIoZnJfZGVzYywgaXNlcnRfY21kLCBpc2VydF9jb25uLAotCQkJCSAgaWJfc2dlLCBvZmZzZXQsIGRhdGFfbGVuKTsKKwkJcmV0ID0gaXNlcnRfZmFzdF9yZWdfbXIoZnJfZGVzYywgaXNlcnRfY29ubiwgc2dfc3RhcnQsCisJCQkJCWliX3NnZSwgc2dfbmVudHMsIG9mZnNldCwgZGF0YV9sZW4pOwogCQlpZiAocmV0KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZmcl9kZXNjLT5saXN0LCAmaXNlcnRfY29ubi0+Y29ubl9mcndyX3Bvb2wpOworCQkJbGlzdF9hZGRfdGFpbCgmZnJfZGVzYy0+bGlzdCwgJmlzZXJ0X2Nvbm4tPmNvbm5fZnJfcG9vbCk7CiAJCQlnb3RvIHVubWFwX3NnOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oCmluZGV4IDY5MWY5MGYuLjcwOGEwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmgKQEAgLTExOSw5ICsxMTksOSBAQAogCXdhaXRfcXVldWVfaGVhZF90CWNvbm5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAljb25uX3dhaXRfY29tcF9lcnI7CiAJc3RydWN0IGtyZWYJCWNvbm5fa3JlZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWNvbm5fZnJ3cl9wb29sOwotCWludAkJCWNvbm5fZnJ3cl9wb29sX3NpemU7Ci0JLyogbG9jayB0byBwcm90ZWN0IGZyd3JfcG9vbCAqLworCXN0cnVjdCBsaXN0X2hlYWQJY29ubl9mcl9wb29sOworCWludAkJCWNvbm5fZnJfcG9vbF9zaXplOworCS8qIGxvY2sgdG8gcHJvdGVjdCBmYXN0cmVnIHBvb2wgKi8KIAlzcGlubG9ja190CQljb25uX2xvY2s7CiAjZGVmaW5lIElTRVJUX0NPTVBfQkFUQ0hfQ09VTlQJOAogCWludAkJCWNvbm5fY29tcF9iYXRjaDsKQEAgLTEzOSwxMyArMTM5LDExIEBACiB9OwogCiBzdHJ1Y3QgaXNlcnRfZGV2aWNlIHsKLQlpbnQJCQl1c2VfZnJ3cjsKKwlpbnQJCQl1c2VfZmFzdHJlZzsKIAlpbnQJCQljcXNfdXNlZDsKIAlpbnQJCQlyZWZjb3VudDsKIAlpbnQJCQljcV9hY3RpdmVfcXBzW0lTRVJUX01BWF9DUV07CiAJc3RydWN0IGliX2RldmljZQkqaWJfZGV2aWNlOwotCXN0cnVjdCBpYl9wZAkJKmRldl9wZDsKLQlzdHJ1Y3QgaWJfbXIJCSpkZXZfbXI7CiAJc3RydWN0IGliX2NxCQkqZGV2X3J4X2NxW0lTRVJUX01BWF9DUV07CiAJc3RydWN0IGliX2NxCQkqZGV2X3R4X2NxW0lTRVJUX01BWF9DUV07CiAJc3RydWN0IGlzZXJ0X2NxX2Rlc2MJKmNxX2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L0tjb25maWcgYi9kcml2ZXJzL2lvbW11L0tjb25maWcKaW5kZXggM2U3ZmRiYi4uNzliYmMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwpAQCAtMjA3LDYgKzIwNyw3IEBACiAJYm9vbCAiSU9NTVUgZm9yIFJlbmVzYXMgSVBNTVUvSVBNTVVJIgogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gQVJNCisJZGVwZW5kcyBvbiBTSF9NT0JJTEUgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IElPTU1VX0FQSQogCXNlbGVjdCBBUk1fRE1BX1VTRV9JT01NVQogCXNlbGVjdCBTSE1PQklMRV9JUE1NVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKaW5kZXggNzI1MzFmMC4uZmFmMGRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCkBAIC0yNDgsOCArMjQ4LDggQEAKIAlpZiAoIWRldiB8fCAhZGV2LT5kbWFfbWFzaykKIAkJcmV0dXJuIGZhbHNlOwogCi0JLyogTm8gZGV2aWNlIG9yIG5vIFBDSSBkZXZpY2UgKi8KLQlpZiAoZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSkKKwkvKiBObyBQQ0kgZGV2aWNlICovCisJaWYgKCFkZXZfaXNfcGNpKGRldikpCiAJCXJldHVybiBmYWxzZTsKIAogCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jIGIvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jCmluZGV4IGU0NmE4ODcuLjg5MTE4NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqCS0gdjcvdjggbG9uZy1kZXNjcmlwdG9yIGZvcm1hdAogICoJLSBOb24tc2VjdXJlIGFjY2VzcyB0byB0aGUgU01NVQogICoJLSA0ayBhbmQgNjRrIHBhZ2VzLCB3aXRoIGNvbnRpZ3VvdXMgcHRlIGhpbnRzLgotICoJLSBVcCB0byAzOS1iaXQgYWRkcmVzc2luZworICoJLSBVcCB0byA0Mi1iaXQgYWRkcmVzc2luZyAoZGVwZW5kZW50IG9uIFZBX0JJVFMpCiAgKgktIENvbnRleHQgZmF1bHQgcmVwb3J0aW5nCiAgKi8KIApAQCAtNjEsMTIgKzYxLDEzIEBACiAjZGVmaW5lIEFSTV9TTU1VX0dSMShzbW11KQkJKChzbW11KS0+YmFzZSArIChzbW11KS0+cGFnZXNpemUpCiAKIC8qIFBhZ2UgdGFibGUgYml0cyAqLwotI2RlZmluZSBBUk1fU01NVV9QVEVfUEFHRQkJKCgocHRldmFsX3QpMykgPDwgMCkKKyNkZWZpbmUgQVJNX1NNTVVfUFRFX1hOCQkJKCgocHRldmFsX3QpMykgPDwgNTMpCiAjZGVmaW5lIEFSTV9TTU1VX1BURV9DT05UCQkoKChwdGV2YWxfdCkxKSA8PCA1MikKICNkZWZpbmUgQVJNX1NNTVVfUFRFX0FGCQkJKCgocHRldmFsX3QpMSkgPDwgMTApCiAjZGVmaW5lIEFSTV9TTU1VX1BURV9TSF9OUwkJKCgocHRldmFsX3QpMCkgPDwgOCkKICNkZWZpbmUgQVJNX1NNTVVfUFRFX1NIX09TCQkoKChwdGV2YWxfdCkyKSA8PCA4KQogI2RlZmluZSBBUk1fU01NVV9QVEVfU0hfSVMJCSgoKHB0ZXZhbF90KTMpIDw8IDgpCisjZGVmaW5lIEFSTV9TTU1VX1BURV9QQUdFCQkoKChwdGV2YWxfdCkzKSA8PCAwKQogCiAjaWYgUEFHRV9TSVpFID09IFNaXzRLCiAjZGVmaW5lIEFSTV9TTU1VX1BURV9DT05UX0VOVFJJRVMJMTYKQEAgLTEyMDUsNyArMTIwNiw3IEBACiAJCQkJICAgdW5zaWduZWQgbG9uZyBwZm4sIGludCBmbGFncywgaW50IHN0YWdlKQogewogCXB0ZV90ICpwdGUsICpzdGFydDsKLQlwdGV2YWxfdCBwdGV2YWwgPSBBUk1fU01NVV9QVEVfUEFHRSB8IEFSTV9TTU1VX1BURV9BRjsKKwlwdGV2YWxfdCBwdGV2YWwgPSBBUk1fU01NVV9QVEVfUEFHRSB8IEFSTV9TTU1VX1BURV9BRiB8IEFSTV9TTU1VX1BURV9YTjsKIAogCWlmIChwbWRfbm9uZSgqcG1kKSkgewogCQkvKiBBbGxvY2F0ZSBhIG5ldyBzZXQgb2YgdGFibGVzICovCkBAIC0xMjQ0LDcgKzEyNDUsOSBAQAogCX0KIAogCS8qIElmIG5vIGFjY2VzcywgY3JlYXRlIGEgZmF1bHRpbmcgZW50cnkgdG8gYXZvaWQgVExCIGZpbGxzICovCi0JaWYgKCEoZmxhZ3MgJiAoSU9NTVVfUkVBRCB8IElPTU1VX1dSSVRFKSkpCisJaWYgKGZsYWdzICYgSU9NTVVfRVhFQykKKwkJcHRldmFsICY9IH5BUk1fU01NVV9QVEVfWE47CisJZWxzZSBpZiAoIShmbGFncyAmIChJT01NVV9SRUFEIHwgSU9NTVVfV1JJVEUpKSkKIAkJcHRldmFsICY9IH5BUk1fU01NVV9QVEVfUEFHRTsKIAogCXB0ZXZhbCB8PSBBUk1fU01NVV9QVEVfU0hfSVM7CkBAIC0xNDk0LDYgKzE0OTcsMTMgQEAKIHsKIAlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpjaGlsZCwgKnBhcmVudCwgKnNtbXU7CiAJc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyID0gTlVMTDsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwOworCWludCByZXQ7CisKKwlpZiAoZGV2LT5hcmNoZGF0YS5pb21tdSkgeworCQlkZXZfd2FybihkZXYsICJJT01NVSBkcml2ZXIgYWxyZWFkeSBhc3NpZ25lZCB0byBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzcGluX2xvY2soJmFybV9zbW11X2RldmljZXNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJlbnQsICZhcm1fc21tdV9kZXZpY2VzLCBsaXN0KSB7CkBAIC0xNTI2LDEzICsxNTM2LDIzIEBACiAJaWYgKCFtYXN0ZXIpCiAJCXJldHVybiAtRU5PREVWOwogCisJZ3JvdXAgPSBpb21tdV9ncm91cF9hbGxvYygpOworCWlmIChJU19FUlIoZ3JvdXApKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIElPTU1VIGdyb3VwXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ3JvdXApOworCX0KKworCXJldCA9IGlvbW11X2dyb3VwX2FkZF9kZXZpY2UoZ3JvdXAsIGRldik7CisJaW9tbXVfZ3JvdXBfcHV0KGdyb3VwKTsKIAlkZXYtPmFyY2hkYXRhLmlvbW11ID0gc21tdTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9zbW11X3JlbW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCWRldi0+YXJjaGRhdGEuaW9tbXUgPSBOVUxMOworCWlvbW11X2dyb3VwX3JlbW92ZV9kZXZpY2UoZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYXJtX3NtbXVfb3BzID0gewpAQCAtMTczMCw3ICsxNzUwLDYgQEAKIAkgKiBhbGxvY2F0aW9uIChQVFJTX1BFUl9QR0QpLgogCSAqLwogI2lmZGVmIENPTkZJR182NEJJVAotCS8qIEN1cnJlbnQgbWF4aW11bSBvdXRwdXQgc2l6ZSBvZiAzOSBiaXRzICovCiAJc21tdS0+czFfb3V0cHV0X3NpemUgPSBtaW4oMzlVTCwgc2l6ZSk7CiAjZWxzZQogCXNtbXUtPnMxX291dHB1dF9zaXplID0gbWluKDMyVUwsIHNpemUpOwpAQCAtMTc0NSw3ICsxNzY0LDcgQEAKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR182NEJJVAogCQlzaXplID0gKGlkID4+IElEMl9VQlNfU0hJRlQpICYgSUQyX1VCU19NQVNLOwotCQlzaXplID0gbWluKDM5LCBhcm1fc21tdV9pZF9zaXplX3RvX2JpdHMoc2l6ZSkpOworCQlzaXplID0gbWluKFZBX0JJVFMsIGFybV9zbW11X2lkX3NpemVfdG9fYml0cyhzaXplKSk7CiAjZWxzZQogCQlzaXplID0gMzI7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvZG1hci5jIGIvZHJpdmVycy9pb21tdS9kbWFyLmMKaW5kZXggOGI0NTJjOS4uMTU4MTU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9kbWFyLmMKKysrIGIvZHJpdmVycy9pb21tdS9kbWFyLmMKQEAgLTUyLDYgKzUyLDkgQEAKIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqIF9faW5pdGRhdGEgZG1hcl90Ymw7CiBzdGF0aWMgYWNwaV9zaXplIGRtYXJfdGJsX3NpemU7CiAKK3N0YXRpYyBpbnQgYWxsb2NfaW9tbXUoc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkKTsKK3N0YXRpYyB2b2lkIGZyZWVfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBkbWFyX3JlZ2lzdGVyX2RyaGRfdW5pdChzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQpCiB7CiAJLyoKQEAgLTEwMCw3ICsxMDMsNiBAQAogCWlmICghcGRldikgewogCQlwcl93YXJuKCJEZXZpY2Ugc2NvcGUgZGV2aWNlIFslMDR4OiUwMng6JTAyeC4lMDJ4XSBub3QgZm91bmRcbiIsCiAJCQlzZWdtZW50LCBzY29wZS0+YnVzLCBwYXRoLT5kZXZpY2UsIHBhdGgtPmZ1bmN0aW9uKTsKLQkJKmRldiA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoKHNjb3BlLT5lbnRyeV90eXBlID09IEFDUElfRE1BUl9TQ09QRV9UWVBFX0VORFBPSU5UICYmIFwKQEAgLTE1MSw3ICsxNTMsNyBAQAogCQkJcmV0ID0gZG1hcl9wYXJzZV9vbmVfZGV2X3Njb3BlKHNjb3BlLAogCQkJCSYoKmRldmljZXMpW2luZGV4XSwgc2VnbWVudCk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJa2ZyZWUoKmRldmljZXMpOworCQkJCWRtYXJfZnJlZV9kZXZfc2NvcGUoZGV2aWNlcywgY250KTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQkJaW5kZXggKys7CkBAIC0xNjIsNiArMTY0LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgZG1hcl9mcmVlX2Rldl9zY29wZShzdHJ1Y3QgcGNpX2RldiAqKipkZXZpY2VzLCBpbnQgKmNudCkKK3sKKwlpZiAoKmRldmljZXMgJiYgKmNudCkgeworCQl3aGlsZSAoLS0qY250ID49IDApCisJCQlwY2lfZGV2X3B1dCgoKmRldmljZXMpWypjbnRdKTsKKwkJa2ZyZWUoKmRldmljZXMpOworCQkqZGV2aWNlcyA9IE5VTEw7CisJCSpjbnQgPSAwOworCX0KK30KKwogLyoqCiAgKiBkbWFyX3BhcnNlX29uZV9kcmhkIC0gcGFyc2VzIGV4YWN0bHkgb25lIERNQSByZW1hcHBpbmcgaGFyZHdhcmUgZGVmaW5pdGlvbgogICogc3RydWN0dXJlIHdoaWNoIHVuaXF1ZWx5IHJlcHJlc2VudCBvbmUgRE1BIHJlbWFwcGluZyBoYXJkd2FyZSB1bml0CkBAIC0xOTMsMjUgKzIwNiwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkbWFyX2ZyZWVfZHJoZChzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRtYXJ1KQoreworCWlmIChkbWFydS0+ZGV2aWNlcyAmJiBkbWFydS0+ZGV2aWNlc19jbnQpCisJCWRtYXJfZnJlZV9kZXZfc2NvcGUoJmRtYXJ1LT5kZXZpY2VzLCAmZG1hcnUtPmRldmljZXNfY250KTsKKwlpZiAoZG1hcnUtPmlvbW11KQorCQlmcmVlX2lvbW11KGRtYXJ1LT5pb21tdSk7CisJa2ZyZWUoZG1hcnUpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBkbWFyX3BhcnNlX2RldihzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRtYXJ1KQogewogCXN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqZHJoZDsKLQlpbnQgcmV0ID0gMDsKIAogCWRyaGQgPSAoc3RydWN0IGFjcGlfZG1hcl9oYXJkd2FyZV91bml0ICopIGRtYXJ1LT5oZHI7CiAKIAlpZiAoZG1hcnUtPmluY2x1ZGVfYWxsKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGRtYXJfcGFyc2VfZGV2X3Njb3BlKCh2b2lkICopKGRyaGQgKyAxKSwKLQkJCQkoKHZvaWQgKilkcmhkKSArIGRyaGQtPmhlYWRlci5sZW5ndGgsCi0JCQkJJmRtYXJ1LT5kZXZpY2VzX2NudCwgJmRtYXJ1LT5kZXZpY2VzLAotCQkJCWRyaGQtPnNlZ21lbnQpOwotCWlmIChyZXQpIHsKLQkJbGlzdF9kZWwoJmRtYXJ1LT5saXN0KTsKLQkJa2ZyZWUoZG1hcnUpOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBkbWFyX3BhcnNlX2Rldl9zY29wZSgodm9pZCAqKShkcmhkICsgMSksCisJCQkJICAgICgodm9pZCAqKWRyaGQpICsgZHJoZC0+aGVhZGVyLmxlbmd0aCwKKwkJCQkgICAgJmRtYXJ1LT5kZXZpY2VzX2NudCwgJmRtYXJ1LT5kZXZpY2VzLAorCQkJCSAgICBkcmhkLT5zZWdtZW50KTsKIH0KIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKQEAgLTQyMyw3ICs0MzksNyBAQAogaW50IF9faW5pdCBkbWFyX2Rldl9zY29wZV9pbml0KHZvaWQpCiB7CiAJc3RhdGljIGludCBkbWFyX2Rldl9zY29wZV9pbml0aWFsaXplZDsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQsICpkcmhkX247CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwogCWludCByZXQgPSAtRU5PREVWOwogCiAJaWYgKGRtYXJfZGV2X3Njb3BlX2luaXRpYWxpemVkKQpAQCAtNDMyLDcgKzQ0OCw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJmRtYXJfZHJoZF91bml0cykpCiAJCWdvdG8gZmFpbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkcmhkLCBkcmhkX24sICZkbWFyX2RyaGRfdW5pdHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRyaGQsICZkbWFyX2RyaGRfdW5pdHMsIGxpc3QpIHsKIAkJcmV0ID0gZG1hcl9wYXJzZV9kZXYoZHJoZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGZhaWw7CkBAIC00NTYsMjQgKzQ3MiwyMyBAQAogCXN0YXRpYyBpbnQgZG1hcl90YWJsZV9pbml0aWFsaXplZDsKIAlpbnQgcmV0OwogCi0JaWYgKGRtYXJfdGFibGVfaW5pdGlhbGl6ZWQpCi0JCXJldHVybiAwOworCWlmIChkbWFyX3RhYmxlX2luaXRpYWxpemVkID09IDApIHsKKwkJcmV0ID0gcGFyc2VfZG1hcl90YWJsZSgpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKHJldCAhPSAtRU5PREVWKQorCQkJCXByX2luZm8oInBhcnNlIERNQVIgdGFibGUgZmFpbHVyZS5cbiIpOworCQl9IGVsc2UgIGlmIChsaXN0X2VtcHR5KCZkbWFyX2RyaGRfdW5pdHMpKSB7CisJCQlwcl9pbmZvKCJObyBETUFSIGRldmljZXMgZm91bmRcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJfQogCi0JZG1hcl90YWJsZV9pbml0aWFsaXplZCA9IDE7Ci0KLQlyZXQgPSBwYXJzZV9kbWFyX3RhYmxlKCk7Ci0JaWYgKHJldCkgewotCQlpZiAocmV0ICE9IC1FTk9ERVYpCi0JCQlwcl9pbmZvKCJwYXJzZSBETUFSIHRhYmxlIGZhaWx1cmUuXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IDApCisJCQlkbWFyX3RhYmxlX2luaXRpYWxpemVkID0gcmV0OworCQllbHNlCisJCQlkbWFyX3RhYmxlX2luaXRpYWxpemVkID0gMTsKIAl9CiAKLQlpZiAobGlzdF9lbXB0eSgmZG1hcl9kcmhkX3VuaXRzKSkgewotCQlwcl9pbmZvKCJObyBETUFSIGRldmljZXMgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZG1hcl90YWJsZV9pbml0aWFsaXplZCA8IDAgPyBkbWFyX3RhYmxlX2luaXRpYWxpemVkIDogMDsKIH0KIAogc3RhdGljIHZvaWQgd2Fybl9pbnZhbGlkX2RtYXIodTY0IGFkZHIsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCkBAIC00ODgsNyArNTAzLDcgQEAKIAkJZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9WRVJTSU9OKSk7CiB9CiAKLWludCBfX2luaXQgY2hlY2tfemVyb19hZGRyZXNzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjaGVja196ZXJvX2FkZHJlc3Modm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICpkbWFyOwogCXN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICplbnRyeV9oZWFkZXI7CkBAIC01NDYsMTQgKzU2MSw2IEBACiAJaWYgKHJldCkKIAkJcmV0ID0gY2hlY2tfemVyb19hZGRyZXNzKCk7CiAJewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICpkbWFyOwotCi0JCWRtYXIgPSAoc3RydWN0IGFjcGlfdGFibGVfZG1hciAqKSBkbWFyX3RibDsKLQotCQlpZiAocmV0ICYmIGlycV9yZW1hcHBpbmdfZW5hYmxlZCAmJiBjcHVfaGFzX3gyYXBpYyAmJgotCQkgICAgZG1hci0+ZmxhZ3MgJiAweDEpCi0JCQlwcl9pbmZvKCJRdWV1ZWQgaW52YWxpZGF0aW9uIHdpbGwgYmUgZW5hYmxlZCB0byBzdXBwb3J0IHgyYXBpYyBhbmQgSW50ci1yZW1hcHBpbmcuXG4iKTsKLQogCQlpZiAocmV0ICYmICFub19pb21tdSAmJiAhaW9tbXVfZGV0ZWN0ZWQgJiYgIWRtYXJfZGlzYWJsZWQpIHsKIAkJCWlvbW11X2RldGVjdGVkID0gMTsKIAkJCS8qIE1ha2Ugc3VyZSBBQ1Mgd2lsbCBiZSBlbmFibGVkICovCkBAIC01NjUsNyArNTcyLDcgQEAKIAkJCXg4Nl9pbml0LmlvbW11LmlvbW11X2luaXQgPSBpbnRlbF9pb21tdV9pbml0OwogI2VuZGlmCiAJfQotCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KGRtYXJfdGJsLCBkbWFyX3RibF9zaXplKTsKKwllYXJseV9hY3BpX29zX3VubWFwX21lbW9yeSgodm9pZCBfX2lvbWVtICopZG1hcl90YmwsIGRtYXJfdGJsX3NpemUpOwogCWRtYXJfdGJsID0gTlVMTDsKIAogCXJldHVybiByZXQgPyAxIDogLUVOT0RFVjsKQEAgLTY0Nyw3ICs2NTQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBhbGxvY19pb21tdShzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQpCitzdGF0aWMgaW50IGFsbG9jX2lvbW11KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZCkKIHsKIAlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwogCXUzMiB2ZXIsIHN0czsKQEAgLTcyMSwxMiArNzI4LDE5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBmcmVlX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCitzdGF0aWMgdm9pZCBmcmVlX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCiB7Ci0JaWYgKCFpb21tdSkKLQkJcmV0dXJuOworCWlmIChpb21tdS0+aXJxKSB7CisJCWZyZWVfaXJxKGlvbW11LT5pcnEsIGlvbW11KTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaW9tbXUtPmlycSwgTlVMTCk7CisJCWRlc3Ryb3lfaXJxKGlvbW11LT5pcnEpOworCX0KIAotCWZyZWVfZG1hcl9pb21tdShpb21tdSk7CisJaWYgKGlvbW11LT5xaSkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaW9tbXUtPnFpLT5kZXNjKTsKKwkJa2ZyZWUoaW9tbXUtPnFpLT5kZXNjX3N0YXR1cyk7CisJCWtmcmVlKGlvbW11LT5xaSk7CisJfQogCiAJaWYgKGlvbW11LT5yZWcpCiAJCXVubWFwX2lvbW11KGlvbW11KTsKQEAgLTEwNTAsNyArMTA2NCw3IEBACiAJZGVzY19wYWdlID0gYWxsb2NfcGFnZXNfbm9kZShpb21tdS0+bm9kZSwgR0ZQX0FUT01JQyB8IF9fR0ZQX1pFUk8sIDApOwogCWlmICghZGVzY19wYWdlKSB7CiAJCWtmcmVlKHFpKTsKLQkJaW9tbXUtPnFpID0gMDsKKwkJaW9tbXUtPnFpID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDYwLDcgKzEwNzQsNyBAQAogCWlmICghcWktPmRlc2Nfc3RhdHVzKSB7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcWktPmRlc2MpOwogCQlrZnJlZShxaSk7Ci0JCWlvbW11LT5xaSA9IDA7CisJCWlvbW11LT5xaSA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTExMSw5ICsxMTI1LDcgQEAKIAkiQmxvY2tlZCBhbiBpbnRlcnJ1cHQgcmVxdWVzdCBkdWUgdG8gc291cmNlLWlkIHZlcmlmaWNhdGlvbiBmYWlsdXJlIiwKIH07CiAKLSNkZWZpbmUgTUFYX0ZBVUxUX1JFQVNPTl9JRFggCShBUlJBWV9TSVpFKGZhdWx0X3JlYXNvbl9zdHJpbmdzKSAtIDEpCi0KLWNvbnN0IGNoYXIgKmRtYXJfZ2V0X2ZhdWx0X3JlYXNvbih1OCBmYXVsdF9yZWFzb24sIGludCAqZmF1bHRfdHlwZSkKK3N0YXRpYyBjb25zdCBjaGFyICpkbWFyX2dldF9mYXVsdF9yZWFzb24odTggZmF1bHRfcmVhc29uLCBpbnQgKmZhdWx0X3R5cGUpCiB7CiAJaWYgKGZhdWx0X3JlYXNvbiA+PSAweDIwICYmIChmYXVsdF9yZWFzb24gLSAweDIwIDwKIAkJCQkJQVJSQVlfU0laRShpcnFfcmVtYXBfZmF1bHRfcmVhc29ucykpKSB7CkBAIC0xMzAzLDE1ICsxMzE1LDE0IEBACiBpbnQgX19pbml0IGVuYWJsZV9kcmhkX2ZhdWx0X2hhbmRsaW5nKHZvaWQpCiB7CiAJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CiAKIAkvKgogCSAqIEVuYWJsZSBmYXVsdCBjb250cm9sIGludGVycnVwdC4KIAkgKi8KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpbnQgcmV0OwotCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKIAkJdTMyIGZhdWx0X3N0YXR1czsKLQkJcmV0ID0gZG1hcl9zZXRfaW50ZXJydXB0KGlvbW11KTsKKwkJaW50IHJldCA9IGRtYXJfc2V0X2ludGVycnVwdChpb21tdSk7CiAKIAkJaWYgKHJldCkgewogCQkJcHJfZXJyKCJEUkhEICVMeDogZmFpbGVkIHRvIGVuYWJsZSBmYXVsdCwgaW50ZXJydXB0LCByZXQgJWRcbiIsCkBAIC0xMzY2LDQgKzEzNzcsMjIgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGRtYXItPmZsYWdzICYgMHgxOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBkbWFyX2ZyZWVfdW51c2VkX3Jlc291cmNlcyh2b2lkKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZG1hcnUsICpkbWFydV9uOworCisJLyogRE1BUiB1bml0cyBhcmUgaW4gdXNlICovCisJaWYgKGlycV9yZW1hcHBpbmdfZW5hYmxlZCB8fCBpbnRlbF9pb21tdV9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkbWFydSwgZG1hcnVfbiwgJmRtYXJfZHJoZF91bml0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmZG1hcnUtPmxpc3QpOworCQlkbWFyX2ZyZWVfZHJoZChkbWFydSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoZG1hcl9mcmVlX3VudXNlZF9yZXNvdXJjZXMpOwogSU9NTVVfSU5JVF9QT1NUKGRldGVjdF9pbnRlbF9pb21tdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2ZzbF9wYW11X2RvbWFpbi5jIGIvZHJpdmVycy9pb21tdS9mc2xfcGFtdV9kb21haW4uYwppbmRleCBjODU3YzMwLi45MzA3MmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2ZzbF9wYW11X2RvbWFpbi5jCisrKyBiL2RyaXZlcnMvaW9tbXUvZnNsX3BhbXVfZG9tYWluLmMKQEAgLTY5MSw3ICs2OTEsNyBAQAogCSAqIFVzZSBMSU9ETiBvZiB0aGUgUENJIGNvbnRyb2xsZXIgd2hpbGUgYXR0YWNoaW5nIGEKIAkgKiBQQ0kgZGV2aWNlLgogCSAqLwotCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJaWYgKGRldl9pc19wY2koZGV2KSkgewogCQlwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCQlwY2lfY3RsID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CiAJCS8qCkBAIC03MjksNyArNzI5LDcgQEAKIAkgKiBVc2UgTElPRE4gb2YgdGhlIFBDSSBjb250cm9sbGVyIHdoaWxlIGRldGFjaGluZyBhCiAJICogUENJIGRldmljZS4KIAkgKi8KLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkgeworCWlmIChkZXZfaXNfcGNpKGRldikpIHsKIAkJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAkJcGNpX2N0bCA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOwogCQkvKgpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIAkgKiBGb3IgcGxhdGZvcm0gZGV2aWNlcyB3ZSBhbGxvY2F0ZSBhIHNlcGFyYXRlIGdyb3VwIGZvcgogCSAqIGVhY2ggb2YgdGhlIGRldmljZXMuCiAJICovCi0JaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwlpZiAoZGV2X2lzX3BjaShkZXYpKSB7CiAJCXBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJCS8qIERvbid0IGNyZWF0ZSBkZXZpY2UgZ3JvdXBzIGZvciB2aXJ0dWFsIFBDSSBicmlkZ2VzICovCiAJCWlmIChwZGV2LT5zdWJvcmRpbmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYwppbmRleCA1OTc3OWUxLi5hMjJjODZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCkBAIC02Myw2ICs2Myw3IEBACiAjZGVmaW5lIERFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEggNDgKIAogI2RlZmluZSBNQVhfQUdBV19XSURUSCA2NAorI2RlZmluZSBNQVhfQUdBV19QRk5fV0lEVEgJKE1BWF9BR0FXX1dJRFRIIC0gVlREX1BBR0VfU0hJRlQpCiAKICNkZWZpbmUgX19ET01BSU5fTUFYX1BGTihnYXcpICAoKCgodWludDY0X3QpMSkgPDwgKGdhdy1WVERfUEFHRV9TSElGVCkpIC0gMSkKICNkZWZpbmUgX19ET01BSU5fTUFYX0FERFIoZ2F3KSAoKCgodWludDY0X3QpMSkgPDwgZ2F3KSAtIDEpCkBAIC0xMDYsMTIgKzEwNywxMiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhZ2F3X3RvX3dpZHRoKGludCBhZ2F3KQogewotCXJldHVybiAzMCArIGFnYXcgKiBMRVZFTF9TVFJJREU7CisJcmV0dXJuIG1pbl90KGludCwgMzAgKyBhZ2F3ICogTEVWRUxfU1RSSURFLCBNQVhfQUdBV19XSURUSCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHdpZHRoX3RvX2FnYXcoaW50IHdpZHRoKQogewotCXJldHVybiAod2lkdGggLSAzMCkgLyBMRVZFTF9TVFJJREU7CisJcmV0dXJuIERJVl9ST1VORF9VUCh3aWR0aCAtIDMwLCBMRVZFTF9TVFJJREUpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsZXZlbF90b19vZmZzZXRfYml0cyhpbnQgbGV2ZWwpCkBAIC0xNDEsNyArMTQyLDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGx2bF90b19ucl9wYWdlcyh1bnNpZ25lZCBpbnQgbHZsKQogewotCXJldHVybiAgMSA8PCAoKGx2bCAtIDEpICogTEVWRUxfU1RSSURFKTsKKwlyZXR1cm4gIDEgPDwgbWluX3QoaW50LCAobHZsIC0gMSkgKiBMRVZFTF9TVFJJREUsIE1BWF9BR0FXX1BGTl9XSURUSCk7CiB9CiAKIC8qIFZULWQgcGFnZXMgbXVzdCBhbHdheXMgYmUgX3NtYWxsZXJfIHRoYW4gTU0gcGFnZXMuIE90aGVyd2lzZSB0aGluZ3MKQEAgLTI4OCwyNiArMjg5LDYgQEAKIAlwdGUtPnZhbCA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc2V0X3B0ZV9yZWFkYWJsZShzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQotewotCXB0ZS0+dmFsIHw9IERNQV9QVEVfUkVBRDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3dyaXRhYmxlKHN0cnVjdCBkbWFfcHRlICpwdGUpCi17Ci0JcHRlLT52YWwgfD0gRE1BX1BURV9XUklURTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3NucChzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQotewotCXB0ZS0+dmFsIHw9IERNQV9QVEVfU05QOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfcHJvdChzdHJ1Y3QgZG1hX3B0ZSAqcHRlLCB1bnNpZ25lZCBsb25nIHByb3QpCi17Ci0JcHRlLT52YWwgPSAocHRlLT52YWwgJiB+MykgfCAocHJvdCAmIDMpOwotfQotCiBzdGF0aWMgaW5saW5lIHU2NCBkbWFfcHRlX2FkZHIoc3RydWN0IGRtYV9wdGUgKnB0ZSkKIHsKICNpZmRlZiBDT05GSUdfNjRCSVQKQEAgLTMxOCwxMSArMjk5LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfcGZuKHN0cnVjdCBkbWFfcHRlICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXB0ZS0+dmFsIHw9ICh1aW50NjRfdClwZm4gPDwgVlREX1BBR0VfU0hJRlQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBkbWFfcHRlX3ByZXNlbnQoc3RydWN0IGRtYV9wdGUgKnB0ZSkKIHsKIAlyZXR1cm4gKHB0ZS0+dmFsICYgMykgIT0gMDsKQEAgLTQwNiw3ICszODIsNyBAQAogCiBzdGF0aWMgdm9pZCBmbHVzaF91bm1hcHNfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCi1ERUZJTkVfVElNRVIodW5tYXBfdGltZXIsICBmbHVzaF91bm1hcHNfdGltZW91dCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHVubWFwX3RpbWVyLCAgZmx1c2hfdW5tYXBzX3RpbWVvdXQsIDAsIDApOwogCiAjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyAyNTAKIHN0cnVjdCBkZWZlcnJlZF9mbHVzaF90YWJsZXMgewpAQCAtNjUyLDkgKzYyOCw3IEBACiAJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkID0gTlVMTDsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7CisJZm9yX2VhY2hfYWN0aXZlX2RyaGRfdW5pdChkcmhkKSB7CiAJCWlmIChzZWdtZW50ICE9IGRyaGQtPnNlZ21lbnQpCiAJCQljb250aW51ZTsKIApAQCAtODY1LDcgKzgzOSw2IEBACiAJaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBpbnQgbGFyZ2VfcGFnZSA9IDE7CiAJc3RydWN0IGRtYV9wdGUgKmZpcnN0X3B0ZSwgKnB0ZTsKLQlpbnQgb3JkZXI7CiAKIAlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgc3RhcnRfcGZuID4+IGFkZHJfd2lkdGgpOwogCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBsYXN0X3BmbiA+PiBhZGRyX3dpZHRoKTsKQEAgLTg5MCw4ICs4NjMsNyBAQAogCiAJfSB3aGlsZSAoc3RhcnRfcGZuICYmIHN0YXJ0X3BmbiA8PSBsYXN0X3Bmbik7CiAKLQlvcmRlciA9IChsYXJnZV9wYWdlIC0gMSkgKiA5OwotCXJldHVybiBvcmRlcjsKKwlyZXR1cm4gbWluX3QoaW50LCAobGFyZ2VfcGFnZSAtIDEpICogOSwgTUFYX0FHQVdfUEZOX1dJRFRIKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3B0ZV9mcmVlX2xldmVsKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgbGV2ZWwsCkBAIC0xMjU1LDggKzEyMjcsOCBAQAogCXVuc2lnbmVkIGxvbmcgbmxvbmdzOwogCiAJbmRvbWFpbnMgPSBjYXBfbmRvbXMoaW9tbXUtPmNhcCk7Ci0JcHJfZGVidWcoIklPTU1VICVkOiBOdW1iZXIgb2YgRG9tYWlucyBzdXBwb3J0ZWQgPCVsZD5cbiIsIGlvbW11LT5zZXFfaWQsCi0JCQluZG9tYWlucyk7CisJcHJfZGVidWcoIklPTU1VJWQ6IE51bWJlciBvZiBEb21haW5zIHN1cHBvcnRlZCA8JWxkPlxuIiwKKwkJIGlvbW11LT5zZXFfaWQsIG5kb21haW5zKTsKIAlubG9uZ3MgPSBCSVRTX1RPX0xPTkdTKG5kb21haW5zKTsKIAogCXNwaW5fbG9ja19pbml0KCZpb21tdS0+bG9jayk7CkBAIC0xMjY2LDEzICsxMjM4LDE3IEBACiAJICovCiAJaW9tbXUtPmRvbWFpbl9pZHMgPSBrY2FsbG9jKG5sb25ncywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlvbW11LT5kb21haW5faWRzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQWxsb2NhdGluZyBkb21haW4gaWQgYXJyYXkgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJJT01NVSVkOiBhbGxvY2F0aW5nIGRvbWFpbiBpZCBhcnJheSBmYWlsZWRcbiIsCisJCSAgICAgICBpb21tdS0+c2VxX2lkKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlvbW11LT5kb21haW5zID0ga2NhbGxvYyhuZG9tYWlucywgc2l6ZW9mKHN0cnVjdCBkbWFyX2RvbWFpbiAqKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghaW9tbXUtPmRvbWFpbnMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBbGxvY2F0aW5nIGRvbWFpbiBhcnJheSBmYWlsZWRcbiIpOworCQlwcl9lcnIoIklPTU1VJWQ6IGFsbG9jYXRpbmcgZG9tYWluIGFycmF5IGZhaWxlZFxuIiwKKwkJICAgICAgIGlvbW11LT5zZXFfaWQpOworCQlrZnJlZShpb21tdS0+ZG9tYWluX2lkcyk7CisJCWlvbW11LT5kb21haW5faWRzID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjg5LDEwICsxMjY1LDEwIEBACiBzdGF0aWMgdm9pZCBkb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbik7CiBzdGF0aWMgdm9pZCB2bV9kb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbik7CiAKLXZvaWQgZnJlZV9kbWFyX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCitzdGF0aWMgdm9pZCBmcmVlX2RtYXJfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKIHsKIAlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKLQlpbnQgaTsKKwlpbnQgaSwgY291bnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgoaW9tbXUtPmRvbWFpbnMpICYmIChpb21tdS0+ZG9tYWluX2lkcykpIHsKQEAgLTEzMDEsMjggKzEyNzcsMjQgQEAKIAkJCWNsZWFyX2JpdChpLCBpb21tdS0+ZG9tYWluX2lkcyk7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmlvbW11X2xvY2ssIGZsYWdzKTsKLQkJCWlmICgtLWRvbWFpbi0+aW9tbXVfY291bnQgPT0gMCkgeworCQkJY291bnQgPSAtLWRvbWFpbi0+aW9tbXVfY291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmlvbW11X2xvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA9PSAwKSB7CiAJCQkJaWYgKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpCiAJCQkJCXZtX2RvbWFpbl9leGl0KGRvbWFpbik7CiAJCQkJZWxzZQogCQkJCQlkb21haW5fZXhpdChkb21haW4pOwogCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFncyk7CiAJCX0KIAl9CiAKIAlpZiAoaW9tbXUtPmdjbWQgJiBETUFfR0NNRF9URSkKIAkJaW9tbXVfZGlzYWJsZV90cmFuc2xhdGlvbihpb21tdSk7CiAKLQlpZiAoaW9tbXUtPmlycSkgewotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpb21tdS0+aXJxLCBOVUxMKTsKLQkJLyogVGhpcyB3aWxsIG1hc2sgdGhlIGlycSAqLwotCQlmcmVlX2lycShpb21tdS0+aXJxLCBpb21tdSk7Ci0JCWRlc3Ryb3lfaXJxKGlvbW11LT5pcnEpOwotCX0KLQogCWtmcmVlKGlvbW11LT5kb21haW5zKTsKIAlrZnJlZShpb21tdS0+ZG9tYWluX2lkcyk7CisJaW9tbXUtPmRvbWFpbnMgPSBOVUxMOworCWlvbW11LT5kb21haW5faWRzID0gTlVMTDsKIAogCWdfaW9tbXVzW2lvbW11LT5zZXFfaWRdID0gTlVMTDsKIApAQCAtMjI0NSw4ICsyMjE3LDYgQEAKIAlpZiAoIXNpX2RvbWFpbikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlwcl9kZWJ1ZygiSWRlbnRpdHkgbWFwcGluZyBkb21haW4gaXMgZG9tYWluICVkXG4iLCBzaV9kb21haW4tPmlkKTsKLQogCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgewogCQlyZXQgPSBpb21tdV9hdHRhY2hfZG9tYWluKHNpX2RvbWFpbiwgaW9tbXUpOwogCQlpZiAocmV0KSB7CkBAIC0yMjYxLDYgKzIyMzEsOCBAQAogCX0KIAogCXNpX2RvbWFpbi0+ZmxhZ3MgPSBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFk7CisJcHJfZGVidWcoIklPTU1VOiBpZGVudGl0eSBtYXBwaW5nIGRvbWFpbiBpcyBkb21haW4gJWRcbiIsCisJCSBzaV9kb21haW4tPmlkKTsKIAogCWlmIChodykKIAkJcmV0dXJuIDA7CkBAIC0yNDkyLDExICsyNDY0LDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoZHJoZC0+aWdub3JlZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlvbW11ID0gZHJoZC0+aW9tbXU7CisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7CiAJCWdfaW9tbXVzW2lvbW11LT5zZXFfaWRdID0gaW9tbXU7CiAKIAkJcmV0ID0gaW9tbXVfaW5pdF9kb21haW5zKGlvbW11KTsKQEAgLTI1MjAsMTIgKzI0ODgsNyBAQAogCS8qCiAJICogU3RhcnQgZnJvbSB0aGUgc2FuZSBpb21tdSBoYXJkd2FyZSBzdGF0ZS4KIAkgKi8KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoZHJoZC0+aWdub3JlZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlvbW11ID0gZHJoZC0+aW9tbXU7Ci0KKwlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpIHsKIAkJLyoKIAkJICogSWYgdGhlIHF1ZXVlZCBpbnZhbGlkYXRpb24gaXMgYWxyZWFkeSBpbml0aWFsaXplZCBieSB1cwogCQkgKiAoZm9yIGV4YW1wbGUsIHdoaWxlIGVuYWJsaW5nIGludGVycnVwdC1yZW1hcHBpbmcpIHRoZW4KQEAgLTI1NDUsMTIgKzI1MDgsNyBAQAogCQlkbWFyX2Rpc2FibGVfcWkoaW9tbXUpOwogCX0KIAotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7Ci0KLQkJaW9tbXUgPSBkcmhkLT5pb21tdTsKLQorCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgewogCQlpZiAoZG1hcl9lbmFibGVfcWkoaW9tbXUpKSB7CiAJCQkvKgogCQkJICogUXVldWVkIEludmFsaWRhdGUgbm90IGVuYWJsZWQsIHVzZSBSZWdpc3RlciBCYXNlZApAQCAtMjYzMywxNyArMjU5MSwxNiBAQAogCSAqICAgZ2xvYmFsIGludmFsaWRhdGUgaW90bGIKIAkgKiAgIGVuYWJsZSB0cmFuc2xhdGlvbgogCSAqLwotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKIAkJaWYgKGRyaGQtPmlnbm9yZWQpIHsKIAkJCS8qCiAJCQkgKiB3ZSBhbHdheXMgaGF2ZSB0byBkaXNhYmxlIFBNUnMgb3IgRE1BIG1heSBmYWlsIG9uCiAJCQkgKiB0aGlzIGRldmljZQogCQkJICovCiAJCQlpZiAoZm9yY2Vfb24pCi0JCQkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGRyaGQtPmlvbW11KTsKKwkJCQlpb21tdV9kaXNhYmxlX3Byb3RlY3RfbWVtX3JlZ2lvbnMoaW9tbXUpOwogCQkJY29udGludWU7CiAJCX0KLQkJaW9tbXUgPSBkcmhkLT5pb21tdTsKIAogCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOwogCkBAIC0yNjY1LDEyICsyNjIyLDkgQEAKIAogCXJldHVybiAwOwogZXJyb3I6Ci0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJaWYgKGRyaGQtPmlnbm9yZWQpCi0JCQljb250aW51ZTsKLQkJaW9tbXUgPSBkcmhkLT5pb21tdTsKLQkJZnJlZV9pb21tdShpb21tdSk7Ci0JfQorCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkKKwkJZnJlZV9kbWFyX2lvbW11KGlvbW11KTsKKwlrZnJlZShkZWZlcnJlZF9mbHVzaCk7CiAJa2ZyZWUoZ19pb21tdXMpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNzU4LDcgKzI3MTIsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCWludCBmb3VuZDsKIAotCWlmICh1bmxpa2VseShkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKSkKKwlpZiAodW5saWtlbHkoIWRldl9pc19wY2koZGV2KSkpCiAJCXJldHVybiAxOwogCiAJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKQEAgLTMzMTgsOSArMzI3Miw5IEBACiAJCX0KIAl9CiAKLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCWZvcl9lYWNoX2FjdGl2ZV9kcmhkX3VuaXQoZHJoZCkgewogCQlpbnQgaTsKLQkJaWYgKGRyaGQtPmlnbm9yZWQgfHwgZHJoZC0+aW5jbHVkZV9hbGwpCisJCWlmIChkcmhkLT5pbmNsdWRlX2FsbCkKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkcmhkLT5kZXZpY2VzX2NudDsgaSsrKQpAQCAtMzUxNCwxOCArMzQ2OCwxMiBAQAogcm1ycl9wYXJzZV9kZXYoc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJydSkKIHsKIAlzdHJ1Y3QgYWNwaV9kbWFyX3Jlc2VydmVkX21lbW9yeSAqcm1ycjsKLQlpbnQgcmV0OwogCiAJcm1yciA9IChzdHJ1Y3QgYWNwaV9kbWFyX3Jlc2VydmVkX21lbW9yeSAqKSBybXJydS0+aGRyOwotCXJldCA9IGRtYXJfcGFyc2VfZGV2X3Njb3BlKCh2b2lkICopKHJtcnIgKyAxKSwKLQkJKCh2b2lkICopcm1ycikgKyBybXJyLT5oZWFkZXIubGVuZ3RoLAotCQkmcm1ycnUtPmRldmljZXNfY250LCAmcm1ycnUtPmRldmljZXMsIHJtcnItPnNlZ21lbnQpOwotCi0JaWYgKHJldCB8fCAocm1ycnUtPmRldmljZXNfY250ID09IDApKSB7Ci0JCWxpc3RfZGVsKCZybXJydS0+bGlzdCk7Ci0JCWtmcmVlKHJtcnJ1KTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZG1hcl9wYXJzZV9kZXZfc2NvcGUoKHZvaWQgKikocm1yciArIDEpLAorCQkJCSAgICAoKHZvaWQgKilybXJyKSArIHJtcnItPmhlYWRlci5sZW5ndGgsCisJCQkJICAgICZybXJydS0+ZGV2aWNlc19jbnQsICZybXJydS0+ZGV2aWNlcywKKwkJCQkgICAgcm1yci0+c2VnbWVudCk7CiB9CiAKIHN0YXRpYyBMSVNUX0hFQUQoZG1hcl9hdHNyX3VuaXRzKTsKQEAgLTM1NTAsMjMgKzM0OTgsMzkgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXRzcl9wYXJzZV9kZXYoc3RydWN0IGRtYXJfYXRzcl91bml0ICphdHNydSkKIHsKLQlpbnQgcmM7CiAJc3RydWN0IGFjcGlfZG1hcl9hdHNyICphdHNyOwogCiAJaWYgKGF0c3J1LT5pbmNsdWRlX2FsbCkKIAkJcmV0dXJuIDA7CiAKIAlhdHNyID0gY29udGFpbmVyX29mKGF0c3J1LT5oZHIsIHN0cnVjdCBhY3BpX2RtYXJfYXRzciwgaGVhZGVyKTsKLQlyYyA9IGRtYXJfcGFyc2VfZGV2X3Njb3BlKCh2b2lkICopKGF0c3IgKyAxKSwKLQkJCQkodm9pZCAqKWF0c3IgKyBhdHNyLT5oZWFkZXIubGVuZ3RoLAotCQkJCSZhdHNydS0+ZGV2aWNlc19jbnQsICZhdHNydS0+ZGV2aWNlcywKLQkJCQlhdHNyLT5zZWdtZW50KTsKLQlpZiAocmMgfHwgIWF0c3J1LT5kZXZpY2VzX2NudCkgewotCQlsaXN0X2RlbCgmYXRzcnUtPmxpc3QpOwotCQlrZnJlZShhdHNydSk7CisJcmV0dXJuIGRtYXJfcGFyc2VfZGV2X3Njb3BlKCh2b2lkICopKGF0c3IgKyAxKSwKKwkJCQkgICAgKHZvaWQgKilhdHNyICsgYXRzci0+aGVhZGVyLmxlbmd0aCwKKwkJCQkgICAgJmF0c3J1LT5kZXZpY2VzX2NudCwgJmF0c3J1LT5kZXZpY2VzLAorCQkJCSAgICBhdHNyLT5zZWdtZW50KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaW9tbXVfZnJlZV9hdHNyKHN0cnVjdCBkbWFyX2F0c3JfdW5pdCAqYXRzcnUpCit7CisJZG1hcl9mcmVlX2Rldl9zY29wZSgmYXRzcnUtPmRldmljZXMsICZhdHNydS0+ZGV2aWNlc19jbnQpOworCWtmcmVlKGF0c3J1KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaW9tbXVfZnJlZV9kbWFycyh2b2lkKQoreworCXN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1ycnUsICpybXJyX247CisJc3RydWN0IGRtYXJfYXRzcl91bml0ICphdHNydSwgKmF0c3JfbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShybXJydSwgcm1ycl9uLCAmZG1hcl9ybXJyX3VuaXRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZybXJydS0+bGlzdCk7CisJCWRtYXJfZnJlZV9kZXZfc2NvcGUoJnJtcnJ1LT5kZXZpY2VzLCAmcm1ycnUtPmRldmljZXNfY250KTsKKwkJa2ZyZWUocm1ycnUpOwogCX0KIAotCXJldHVybiByYzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXRzcnUsIGF0c3JfbiwgJmRtYXJfYXRzcl91bml0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmYXRzcnUtPmxpc3QpOworCQlpbnRlbF9pb21tdV9mcmVlX2F0c3IoYXRzcnUpOworCX0KIH0KIAogaW50IGRtYXJfZmluZF9tYXRjaGVkX2F0c3JfdW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMzYxMCwxNyArMzU3NCwxNyBAQAogCiBpbnQgX19pbml0IGRtYXJfcGFyc2Vfcm1ycl9hdHNyX2Rldih2b2lkKQogewotCXN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1yciwgKnJtcnJfbjsKLQlzdHJ1Y3QgZG1hcl9hdHNyX3VuaXQgKmF0c3IsICphdHNyX247CisJc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJyOworCXN0cnVjdCBkbWFyX2F0c3JfdW5pdCAqYXRzcjsKIAlpbnQgcmV0ID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShybXJyLCBybXJyX24sICZkbWFyX3JtcnJfdW5pdHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJtcnIsICZkbWFyX3JtcnJfdW5pdHMsIGxpc3QpIHsKIAkJcmV0ID0gcm1ycl9wYXJzZV9kZXYocm1ycik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdHNyLCBhdHNyX24sICZkbWFyX2F0c3JfdW5pdHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF0c3IsICZkbWFyX2F0c3JfdW5pdHMsIGxpc3QpIHsKIAkJcmV0ID0gYXRzcl9wYXJzZV9kZXYoYXRzcik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtMzY2Nyw4ICszNjMxLDkgQEAKIAogaW50IF9faW5pdCBpbnRlbF9pb21tdV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IC1FTk9ERVY7CiAJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CiAKIAkvKiBWVC1kIGlzIHJlcXVpcmVkIGZvciBhIFRYVC90Ym9vdCBsYXVuY2gsIHNvIGVuZm9yY2UgdGhhdCAqLwogCWZvcmNlX29uID0gdGJvb3RfZm9yY2VfaW9tbXUoKTsKQEAgLTM2NzYsMzYgKzM2NDEsMjkgQEAKIAlpZiAoZG1hcl90YWJsZV9pbml0KCkpIHsKIAkJaWYgKGZvcmNlX29uKQogCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBETUFSIHRhYmxlXG4iKTsKLQkJcmV0dXJuIAktRU5PREVWOworCQlnb3RvIG91dF9mcmVlX2RtYXI7CiAJfQogCiAJLyoKIAkgKiBEaXNhYmxlIHRyYW5zbGF0aW9uIGlmIGFscmVhZHkgZW5hYmxlZCBwcmlvciB0byBPUyBoYW5kb3Zlci4KIAkgKi8KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCi0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7Ci0KLQkJaW9tbXUgPSBkcmhkLT5pb21tdTsKKwlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpCiAJCWlmIChpb21tdS0+Z2NtZCAmIERNQV9HQ01EX1RFKQogCQkJaW9tbXVfZGlzYWJsZV90cmFuc2xhdGlvbihpb21tdSk7Ci0JfQogCiAJaWYgKGRtYXJfZGV2X3Njb3BlX2luaXQoKSA8IDApIHsKIAkJaWYgKGZvcmNlX29uKQogCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBETUFSIGRldmljZSBzY29wZVxuIik7Ci0JCXJldHVybiAJLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZV9kbWFyOwogCX0KIAogCWlmIChub19pb21tdSB8fCBkbWFyX2Rpc2FibGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZV9kbWFyOwogCiAJaWYgKGlvbW11X2luaXRfbWVtcG9vbCgpKSB7CiAJCWlmIChmb3JjZV9vbikKIAkJCXBhbmljKCJ0Ym9vdDogRmFpbGVkIHRvIGluaXRpYWxpemUgaW9tbXUgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIAktRU5PREVWOworCQlnb3RvIG91dF9mcmVlX2RtYXI7CiAJfQogCiAJaWYgKGxpc3RfZW1wdHkoJmRtYXJfcm1ycl91bml0cykpCkBAIC0zNzE3LDcgKzM2NzUsNyBAQAogCWlmIChkbWFyX2luaXRfcmVzZXJ2ZWRfcmFuZ2VzKCkpIHsKIAkJaWYgKGZvcmNlX29uKQogCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gcmVzZXJ2ZSBpb21tdSByYW5nZXNcbiIpOwotCQlyZXR1cm4gCS1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWVfbWVtcG9vbDsKIAl9CiAKIAlpbml0X25vX3JlbWFwcGluZ19kZXZpY2VzKCk7CkBAIC0zNzI3LDkgKzM2ODUsNyBAQAogCQlpZiAoZm9yY2Vfb24pCiAJCQlwYW5pYygidGJvb3Q6IEZhaWxlZCB0byBpbml0aWFsaXplIERNQVJzXG4iKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogZG1hciBpbml0IGZhaWxlZFxuIik7Ci0JCXB1dF9pb3ZhX2RvbWFpbigmcmVzZXJ2ZWRfaW92YV9saXN0KTsKLQkJaW9tbXVfZXhpdF9tZW1wb29sKCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2ZyZWVfcmVzZXJ2ZWRfcmFuZ2U7CiAJfQogCXByaW50ayhLRVJOX0lORk8KIAkiUENJLURNQTogSW50ZWwoUikgVmlydHVhbGl6YXRpb24gVGVjaG5vbG9neSBmb3IgRGlyZWN0ZWQgSS9PXG4iKTsKQEAgLTM3NDksNiArMzcwNSwxNCBAQAogCWludGVsX2lvbW11X2VuYWJsZWQgPSAxOwogCiAJcmV0dXJuIDA7CisKK291dF9mcmVlX3Jlc2VydmVkX3JhbmdlOgorCXB1dF9pb3ZhX2RvbWFpbigmcmVzZXJ2ZWRfaW92YV9saXN0KTsKK291dF9mcmVlX21lbXBvb2w6CisJaW9tbXVfZXhpdF9tZW1wb29sKCk7CitvdXRfZnJlZV9kbWFyOgorCWludGVsX2lvbW11X2ZyZWVfZG1hcnMoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBpb21tdV9kZXRhY2hfZGVwZW5kZW50X2RldmljZXMoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwKQEAgLTM4NzcsNyArMzg0MSw3IEBACiB9CiAKIC8qIGRvbWFpbiBpZCBmb3IgdmlydHVhbCBtYWNoaW5lLCBpdCB3b24ndCBiZSBzZXQgaW4gY29udGV4dCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1fZG9taWQ7CitzdGF0aWMgYXRvbWljX3Qgdm1fZG9taWQgPSBBVE9NSUNfSU5JVCgwKTsKIAogc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqaW9tbXVfYWxsb2Nfdm1fZG9tYWluKHZvaWQpCiB7CkBAIC0zODg3LDcgKzM4NTEsNyBAQAogCWlmICghZG9tYWluKQogCQlyZXR1cm4gTlVMTDsKIAotCWRvbWFpbi0+aWQgPSB2bV9kb21pZCsrOworCWRvbWFpbi0+aWQgPSBhdG9taWNfaW5jX3JldHVybigmdm1fZG9taWQpOwogCWRvbWFpbi0+bmlkID0gLTE7CiAJbWVtc2V0KGRvbWFpbi0+aW9tbXVfYm1wLCAwLCBzaXplb2YoZG9tYWluLT5pb21tdV9ibXApKTsKIAlkb21haW4tPmZsYWdzID0gRE9NQUlOX0ZMQUdfVklSVFVBTF9NQUNISU5FOwpAQCAtMzkzNCwxMSArMzg5OCw3IEBACiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGxvbmcgbmRvbWFpbnM7CiAKLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoZHJoZC0+aWdub3JlZCkKLQkJCWNvbnRpbnVlOwotCQlpb21tdSA9IGRyaGQtPmlvbW11OwotCisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7CiAJCW5kb21haW5zID0gY2FwX25kb21zKGlvbW11LT5jYXApOwogCQlmb3JfZWFjaF9zZXRfYml0KGksIGlvbW11LT5kb21haW5faWRzLCBuZG9tYWlucykgewogCQkJaWYgKGlvbW11LT5kb21haW5zW2ldID09IGRvbWFpbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pbnRlbF9pcnFfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL2lvbW11L2ludGVsX2lycV9yZW1hcHBpbmcuYwppbmRleCAwY2I3NTI4Li5lZjVmNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2ludGVsX2lycV9yZW1hcHBpbmcuYworKysgYi9kcml2ZXJzL2lvbW11L2ludGVsX2lycV9yZW1hcHBpbmcuYwpAQCAtNDAsMTMgKzQwLDE1IEBACiAKIHN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGlycV8yX2lyX2xvY2spOwogCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9pb2FwaWNzX3VuZGVyX2lyKHZvaWQpOworCiBzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBpcnFfZ2V0X2NoaXBfZGF0YShpcnEpOwogCXJldHVybiBjZmcgPyAmY2ZnLT5pcnFfMl9pb21tdSA6IE5VTEw7CiB9CiAKLWludCBnZXRfaXJ0ZShpbnQgaXJxLCBzdHJ1Y3QgaXJ0ZSAqZW50cnkpCitzdGF0aWMgaW50IGdldF9pcnRlKGludCBpcnEsIHN0cnVjdCBpcnRlICplbnRyeSkKIHsKIAlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY5LDE5ICs3MSwxMyBAQAogCXN0cnVjdCBpcl90YWJsZSAqdGFibGUgPSBpb21tdS0+aXJfdGFibGU7CiAJc3RydWN0IGlycV8yX2lvbW11ICppcnFfaW9tbXUgPSBpcnFfMl9pb21tdShpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBpcnFfZ2V0X2NoaXBfZGF0YShpcnEpOwotCXUxNiBpbmRleCwgc3RhcnRfaW5kZXg7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7CisJaW50IGluZGV4OwogCiAJaWYgKCFjb3VudCB8fCAhaXJxX2lvbW11KQogCQlyZXR1cm4gLTE7CiAKLQkvKgotCSAqIHN0YXJ0IHRoZSBJUlRFIHNlYXJjaCBmcm9tIGluZGV4IDAuCi0JICovCi0JaW5kZXggPSBzdGFydF9pbmRleCA9IDA7Ci0KIAlpZiAoY291bnQgPiAxKSB7CiAJCWNvdW50ID0gX19yb3VuZHVwX3Bvd19vZl90d28oY291bnQpOwogCQltYXNrID0gaWxvZzIoY291bnQpOwpAQCAtOTYsMzIgKzkyLDE3IEBACiAJfQogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0JZG8gewotCQlmb3IgKGkgPSBpbmRleDsgaSA8IGluZGV4ICsgY291bnQ7IGkrKykKLQkJCWlmICAodGFibGUtPmJhc2VbaV0ucHJlc2VudCkKLQkJCQlicmVhazsKLQkJLyogZW1wdHkgaW5kZXggZm91bmQgKi8KLQkJaWYgKGkgPT0gaW5kZXggKyBjb3VudCkKLQkJCWJyZWFrOwotCi0JCWluZGV4ID0gKGluZGV4ICsgY291bnQpICUgSU5UUl9SRU1BUF9UQUJMRV9FTlRSSUVTOwotCi0JCWlmIChpbmRleCA9PSBzdGFydF9pbmRleCkgewotCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgYW4gSVJURVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IHdoaWxlICgxKTsKLQotCWZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgaSsrKQotCQl0YWJsZS0+YmFzZVtpXS5wcmVzZW50ID0gMTsKLQotCWNmZy0+cmVtYXBwZWQgPSAxOwotCWlycV9pb21tdS0+aW9tbXUgPSBpb21tdTsKLQlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSAgaW5kZXg7Ci0JaXJxX2lvbW11LT5zdWJfaGFuZGxlID0gMDsKLQlpcnFfaW9tbXUtPmlydGVfbWFzayA9IG1hc2s7Ci0KKwlpbmRleCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKHRhYmxlLT5iaXRtYXAsCisJCQkJCUlOVFJfUkVNQVBfVEFCTEVfRU5UUklFUywgbWFzayk7CisJaWYgKGluZGV4IDwgMCkgeworCQlwcl93YXJuKCJJUiVkOiBjYW4ndCBhbGxvY2F0ZSBhbiBJUlRFXG4iLCBpb21tdS0+c2VxX2lkKTsKKwl9IGVsc2UgeworCQljZmctPnJlbWFwcGVkID0gMTsKKwkJaXJxX2lvbW11LT5pb21tdSA9IGlvbW11OworCQlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSAgaW5kZXg7CisJCWlycV9pb21tdS0+c3ViX2hhbmRsZSA9IDA7CisJCWlycV9pb21tdS0+aXJ0ZV9tYXNrID0gbWFzazsKKwl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBpbmRleDsKQEAgLTI1NCw2ICsyMzUsOCBAQAogCQlzZXRfNjRiaXQoJmVudHJ5LT5sb3csIDApOwogCQlzZXRfNjRiaXQoJmVudHJ5LT5oaWdoLCAwKTsKIAl9CisJYml0bWFwX3JlbGVhc2VfcmVnaW9uKGlvbW11LT5pcl90YWJsZS0+Yml0bWFwLCBpbmRleCwKKwkJCSAgICAgIGlycV9pb21tdS0+aXJ0ZV9tYXNrKTsKIAogCXJldHVybiBxaV9mbHVzaF9pZWMoaW9tbXUsIGluZGV4LCBpcnFfaW9tbXUtPmlydGVfbWFzayk7CiB9CkBAIC0zMzYsNyArMzE5LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXNldF9pcnRlX3NpZChpcnRlLCAxLCAwLCBzaWQpOworCXNldF9pcnRlX3NpZChpcnRlLCBTVlRfVkVSSUZZX1NJRF9TUSwgU1FfQUxMXzE2LCBzaWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTMsNiArNDM2LDcgQEAKIHsKIAlzdHJ1Y3QgaXJfdGFibGUgKmlyX3RhYmxlOwogCXN0cnVjdCBwYWdlICpwYWdlczsKKwl1bnNpZ25lZCBsb25nICpiaXRtYXA7CiAKIAlpcl90YWJsZSA9IGlvbW11LT5pcl90YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcl90YWJsZSksCiAJCQkJCSAgICAgR0ZQX0FUT01JQyk7CkBAIC00NjQsMTMgKzQ0OCwyMyBAQAogCQkJCSBJTlRSX1JFTUFQX1BBR0VfT1JERVIpOwogCiAJaWYgKCFwYWdlcykgewotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlcyBvZiBvcmRlciAlZFxuIiwKLQkJICAgICAgIElOVFJfUkVNQVBfUEFHRV9PUkRFUik7CisJCXByX2VycigiSVIlZDogZmFpbGVkIHRvIGFsbG9jYXRlIHBhZ2VzIG9mIG9yZGVyICVkXG4iLAorCQkgICAgICAgaW9tbXUtPnNlcV9pZCwgSU5UUl9SRU1BUF9QQUdFX09SREVSKTsKIAkJa2ZyZWUoaW9tbXUtPmlyX3RhYmxlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJYml0bWFwID0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKElOVFJfUkVNQVBfVEFCTEVfRU5UUklFUyksCisJCQkgc2l6ZW9mKGxvbmcpLCBHRlBfQVRPTUlDKTsKKwlpZiAoYml0bWFwID09IE5VTEwpIHsKKwkJcHJfZXJyKCJJUiVkOiBmYWlsZWQgdG8gYWxsb2NhdGUgYml0bWFwXG4iLCBpb21tdS0+c2VxX2lkKTsKKwkJX19mcmVlX3BhZ2VzKHBhZ2VzLCBJTlRSX1JFTUFQX1BBR0VfT1JERVIpOworCQlrZnJlZShpcl90YWJsZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCWlyX3RhYmxlLT5iYXNlID0gcGFnZV9hZGRyZXNzKHBhZ2VzKTsKKwlpcl90YWJsZS0+Yml0bWFwID0gYml0bWFwOwogCiAJaW9tbXVfc2V0X2lycV9yZW1hcHBpbmcoaW9tbXUsIG1vZGUpOwogCXJldHVybiAwOwpAQCAtNTIxLDYgKzUxNSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbnRlbF9pcnFfcmVtYXBwaW5nX3N1cHBvcnRlZCh2b2lkKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwogCiAJaWYgKGRpc2FibGVfaXJxX3JlbWFwKQogCQlyZXR1cm4gMDsKQEAgLTUzOSwxMiArNTM0LDkgQEAKIAlpZiAoIWRtYXJfaXJfc3VwcG9ydCgpKQogCQlyZXR1cm4gMDsKIAotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQorCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKQogCQlpZiAoIWVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpCiAJCQlyZXR1cm4gMDsKLQl9CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTU1Miw2ICs1NDQsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW50ZWxfZW5hYmxlX2lycV9yZW1hcHBpbmcodm9pZCkKIHsKIAlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKIAlib29sIHgyYXBpY19wcmVzZW50OwogCWludCBzZXR1cCA9IDA7CiAJaW50IGVpbSA9IDA7CkBAIC01NjQsNiArNTU3LDggQEAKIAl9CiAKIAlpZiAoeDJhcGljX3ByZXNlbnQpIHsKKwkJcHJfaW5mbygiUXVldWVkIGludmFsaWRhdGlvbiB3aWxsIGJlIGVuYWJsZWQgdG8gc3VwcG9ydCB4MmFwaWMgYW5kIEludHItcmVtYXBwaW5nLlxuIik7CisKIAkJZWltID0gIWRtYXJfeDJhcGljX29wdG91dCgpOwogCQlpZiAoIWVpbSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTU3Miw5ICs1NjcsNyBAQAogCQkJCSJVc2UgJ2ludHJlbWFwPW5vX3gyYXBpY19vcHRvdXQnIHRvIG92ZXJyaWRlIEJJT1MgcmVxdWVzdC5cbiIpOwogCX0KIAotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQorCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKSB7CiAJCS8qCiAJCSAqIElmIHRoZSBxdWV1ZWQgaW52YWxpZGF0aW9uIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsCiAJCSAqIHNob3VsZG4ndCBkaXNhYmxlIGl0LgpAQCAtNTk5LDkgKzU5Miw3IEBACiAJLyoKIAkgKiBjaGVjayBmb3IgdGhlIEludGVycnVwdC1yZW1hcHBpbmcgc3VwcG9ydAogCSAqLwotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQorCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKSB7CiAJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKIAkJCWNvbnRpbnVlOwogCkBAIC02MTUsMTAgKzYwNiw4IEBACiAJLyoKIAkgKiBFbmFibGUgcXVldWVkIGludmFsaWRhdGlvbiBmb3IgYWxsIHRoZSBEUkhEJ3MuCiAJICovCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJaW50IHJldDsKLQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OwotCQlyZXQgPSBkbWFyX2VuYWJsZV9xaShpb21tdSk7CisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKKwkJaW50IHJldCA9IGRtYXJfZW5hYmxlX3FpKGlvbW11KTsKIAogCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkRSSEQgJUx4OiBmYWlsZWQgdG8gZW5hYmxlIHF1ZXVlZCwgIgpAQCAtNjMxLDkgKzYyMCw3IEBACiAJLyoKIAkgKiBTZXR1cCBJbnRlcnJ1cHQtcmVtYXBwaW5nIGZvciBhbGwgdGhlIERSSEQncyBub3cuCiAJICovCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OwotCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKIAkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQogCQkJY29udGludWU7CiAKQEAgLTc3NCwyMiArNzYxLDIwIEBACiAgKiBGaW5kcyB0aGUgYXNzb2NhaXRpb24gYmV0d2VlbiBJT0FQSUMncyBhbmQgaXRzIEludGVycnVwdC1yZW1hcHBpbmcKICAqIGhhcmR3YXJlIHVuaXQuCiAgKi8KLWludCBfX2luaXQgcGFyc2VfaW9hcGljc191bmRlcl9pcih2b2lkKQorc3RhdGljIGludCBfX2luaXQgcGFyc2VfaW9hcGljc191bmRlcl9pcih2b2lkKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwogCWludCBpcl9zdXBwb3J0ZWQgPSAwOwogCWludCBpb2FwaWNfaWR4OwogCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OwotCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpCiAJCWlmIChlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKSB7CiAJCQlpZiAoaXJfcGFyc2VfaW9hcGljX2hwZXRfc2NvcGUoZHJoZC0+aGRyLCBpb21tdSkpCiAJCQkJcmV0dXJuIC0xOwogCiAJCQlpcl9zdXBwb3J0ZWQgPSAxOwogCQl9Ci0JfQogCiAJaWYgKCFpcl9zdXBwb3J0ZWQpCiAJCXJldHVybiAwOwpAQCAtODA3LDcgKzc5Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBfX2luaXQgaXJfZGV2X3Njb3BlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlyX2Rldl9zY29wZV9pbml0KHZvaWQpCiB7CiAJaWYgKCFpcnFfcmVtYXBwaW5nX2VuYWJsZWQpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pcnFfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL2lvbW11L2lycV9yZW1hcHBpbmcuYwppbmRleCAzOWY4MWFlLi4yMjg2MzJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pcnFfcmVtYXBwaW5nLmMKKysrIGIvZHJpdmVycy9pb21tdS9pcnFfcmVtYXBwaW5nLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCQlyZXR1cm4gZG9fc2V0dXBfbXNpeF9pcnFzKGRldiwgbnZlYyk7CiB9CiAKLXZvaWQgZW9pX2lvYXBpY19waW5fcmVtYXBwZWQoaW50IGFwaWMsIGludCBwaW4sIGludCB2ZWN0b3IpCitzdGF0aWMgdm9pZCBlb2lfaW9hcGljX3Bpbl9yZW1hcHBlZChpbnQgYXBpYywgaW50IHBpbiwgaW50IHZlY3RvcikKIHsKIAkvKgogCSAqIEludHItcmVtYXBwaW5nIHVzZXMgcGluIG51bWJlciBhcyB0aGUgdmlydHVhbCB2ZWN0b3IKQEAgLTI5NSw4ICsyOTUsOCBAQAogCQkJCQkgICAgIHZlY3RvciwgYXR0cik7CiB9CiAKLWludCBzZXRfcmVtYXBwZWRfaXJxX2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCi0JCQkgICAgICBib29sIGZvcmNlKQorc3RhdGljIGludCBzZXRfcmVtYXBwZWRfaXJxX2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBib29sIGZvcmNlKQogewogCWlmICghY29uZmlnX2VuYWJsZWQoQ09ORklHX1NNUCkgfHwgIXJlbWFwX29wcyB8fAogCSAgICAhcmVtYXBfb3BzLT5zZXRfYWZmaW5pdHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L29mX2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L29mX2lvbW11LmMKaW5kZXggZWUyNDliYy4uZTU1MGNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9vZl9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvb2ZfaW9tbXUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaW9tbXUuaD4KIAogLyoqCiAgKiBvZl9nZXRfZG1hX3dpbmRvdyAtIFBhcnNlICpkbWEtd2luZG93IHByb3BlcnR5IGFuZCByZXR1cm5zIDAgaWYgZm91bmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L3NobW9iaWxlLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L3NobW9iaWxlLWlvbW11LmMKaW5kZXggZDU3Mjg2My4uN2EzYjkyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9zaG1vYmlsZS1pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvc2htb2JpbGUtaW9tbXUuYwpAQCAtMzgwLDE0ICszODAsMTMgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KGwxY2FjaGUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JYXJjaGRhdGEgPSBrbWFsbG9jKHNpemVvZigqYXJjaGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlhcmNoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCphcmNoZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghYXJjaGRhdGEpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGwxY2FjaGUpOwogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobDJjYWNoZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmYXJjaGRhdGEtPmF0dGFjaF9sb2NrKTsKLQlhcmNoZGF0YS0+YXR0YWNoZWQgPSBOVUxMOwogCWFyY2hkYXRhLT5pcG1tdSA9IGlwbW11OwogCWlwbW11X2FyY2hkYXRhID0gYXJjaGRhdGE7CiAJYnVzX3NldF9pb21tdSgmcGxhdGZvcm1fYnVzX3R5cGUsICZzaG1vYmlsZV9pb21tdV9vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9zaG1vYmlsZS1pcG1tdS5jIGIvZHJpdmVycy9pb21tdS9zaG1vYmlsZS1pcG1tdS5jCmluZGV4IDgzMjFmODkuLmUzYmMyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvc2htb2JpbGUtaXBtbXUuYworKysgYi9kcml2ZXJzL2lvbW11L3NobW9iaWxlLWlwbW11LmMKQEAgLTM1LDEyICszNSwxMiBAQAogCWlmICghaXBtbXUpCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmlwbW11LT5mbHVzaF9sb2NrKTsKKwlzcGluX2xvY2soJmlwbW11LT5mbHVzaF9sb2NrKTsKIAlpZiAoaXBtbXUtPnRsYl9lbmFibGVkKQogCQlpcG1tdV9yZWdfd3JpdGUoaXBtbXUsIElNQ1RSMSwgSU1DVFIxX0ZMVVNIIHwgSU1DVFIxX1RMQkVOKTsKIAllbHNlCiAJCWlwbW11X3JlZ193cml0ZShpcG1tdSwgSU1DVFIxLCBJTUNUUjFfRkxVU0gpOwotCW11dGV4X3VubG9jaygmaXBtbXUtPmZsdXNoX2xvY2spOworCXNwaW5fdW5sb2NrKCZpcG1tdS0+Zmx1c2hfbG9jayk7CiB9CiAKIHZvaWQgaXBtbXVfdGxiX3NldChzdHJ1Y3Qgc2htb2JpbGVfaXBtbXUgKmlwbW11LCB1bnNpZ25lZCBsb25nIHBoeXMsIGludCBzaXplLApAQCAtNDksNyArNDksNyBAQAogCWlmICghaXBtbXUpCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmlwbW11LT5mbHVzaF9sb2NrKTsKKwlzcGluX2xvY2soJmlwbW11LT5mbHVzaF9sb2NrKTsKIAlzd2l0Y2ggKHNpemUpIHsKIAlkZWZhdWx0OgogCQlpcG1tdS0+dGxiX2VuYWJsZWQgPSAwOwpAQCAtODUsNyArODUsNyBAQAogCX0KIAlpcG1tdV9yZWdfd3JpdGUoaXBtbXUsIElNVFRCUiwgcGh5cyk7CiAJaXBtbXVfcmVnX3dyaXRlKGlwbW11LCBJTUFTSUQsIGFzaWQpOwotCW11dGV4X3VubG9jaygmaXBtbXUtPmZsdXNoX2xvY2spOworCXNwaW5fdW5sb2NrKCZpcG1tdS0+Zmx1c2hfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgaXBtbXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgZGV2aWNlIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbXV0ZXhfaW5pdCgmaXBtbXUtPmZsdXNoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpcG1tdS0+Zmx1c2hfbG9jayk7CiAJaXBtbXUtPmRldiA9ICZwZGV2LT5kZXY7CiAJaXBtbXUtPmlwbW11X2Jhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAogCQkJCQkJcmVzb3VyY2Vfc2l6ZShyZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvc2htb2JpbGUtaXBtbXUuaCBiL2RyaXZlcnMvaW9tbXUvc2htb2JpbGUtaXBtbXUuaAppbmRleCA0ZDUzNjg0Li45NTI0NzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L3NobW9iaWxlLWlwbW11LmgKKysrIGIvZHJpdmVycy9pb21tdS9zaG1vYmlsZS1pcG1tdS5oCkBAIC0xNCw3ICsxNCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXZvaWQgX19pb21lbSAqaXBtbXVfYmFzZTsKIAlpbnQgdGxiX2VuYWJsZWQ7Ci0Jc3RydWN0IG11dGV4IGZsdXNoX2xvY2s7CisJc3BpbmxvY2tfdCBmbHVzaF9sb2NrOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqZGV2X25hbWVzOwogCXVuc2lnbmVkIGludCBudW1fZGV2X25hbWVzOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQppbmRleCA4NmI0ODRjLi41MTk0YWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBvYmotJChDT05GSUdfUkVORVNBU19JTlRDX0lSUVBJTikJKz0gaXJxLXJlbmVzYXMtaW50Yy1pcnFwaW4ubwogb2JqLSQoQ09ORklHX1JFTkVTQVNfSVJRQykJCSs9IGlycS1yZW5lc2FzLWlycWMubwogb2JqLSQoQ09ORklHX1ZFUlNBVElMRV9GUEdBX0lSUSkJKz0gaXJxLXZlcnNhdGlsZS1mcGdhLm8KK29iai0kKENPTkZJR19BUkNIX05TUElSRSkJCSs9IGlycS16ZXZpby5vCiBvYmotJChDT05GSUdfQVJDSF9WVDg1MDApCQkrPSBpcnEtdnQ4NTAwLm8KIG9iai0kKENPTkZJR19UQjEwWF9JUlFDKQkJKz0gaXJxLXRiMTB4Lm8KIG9iai0kKENPTkZJR19YVEVOU0EpCQkJKz0gaXJxLXh0ZW5zYS1waWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1hcm1hZGEtMzcwLXhwLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYwppbmRleCA0MzNjYzg1Li41NDA5NTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYwpAQCAtNTksOCArNTksNiBAQAogI2RlZmluZSBQQ0lfTVNJX0RPT1JCRUxMX0VORCAgICAgICAgICAgICAgICAgICAgKDMyKQogI2RlZmluZSBQQ0lfTVNJX0RPT1JCRUxMX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAogCi1zdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhpcnFfY29udHJvbGxlcl9sb2NrKTsKLQogc3RhdGljIHZvaWQgX19pb21lbSAqcGVyX2NwdV9pbnRfYmFzZTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm1haW5faW50X2Jhc2U7CiBzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKmFybWFkYV8zNzBfeHBfbXBpY19kb21haW47CkBAIC0yMzksNiArMjM3LDggQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKIHN0YXRpYyBpbnQgYXJtYWRhX3hwX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmQsCiAJCQkJICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFza192YWwsIGJvb2wgZm9yY2UpCiB7CkBAIC0zODEsNyArMzgxLDcgQEAKIAkJCQkJCUFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUykKIAkJCQkmIFBDSV9NU0lfRE9PUkJFTExfTUFTSzsKIAotCQkJd3JpdGVsKH5QQ0lfTVNJX0RPT1JCRUxMX01BU0ssIHBlcl9jcHVfaW50X2Jhc2UgKworCQkJd3JpdGVsKH5tc2ltYXNrLCBwZXJfY3B1X2ludF9iYXNlICsKIAkJCSAgICAgICBBUk1BREFfMzcwX1hQX0lOX0RSQkVMX0NBVVNFX09GRlMpOwogCiAJCQlmb3IgKG1zaW5yID0gUENJX01TSV9ET09SQkVMTF9TVEFSVDsKQEAgLTQwNyw3ICs0MDcsNyBAQAogCQkJCQkJQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9DQVVTRV9PRkZTKQogCQkJCSYgSVBJX0RPT1JCRUxMX01BU0s7CiAKLQkJCXdyaXRlbCh+SVBJX0RPT1JCRUxMX01BU0ssIHBlcl9jcHVfaW50X2Jhc2UgKworCQkJd3JpdGVsKH5pcGltYXNrLCBwZXJfY3B1X2ludF9iYXNlICsKIAkJCQlBUk1BREFfMzcwX1hQX0lOX0RSQkVMX0NBVVNFX09GRlMpOwogCiAJCQkvKiBIYW5kbGUgYWxsIHBlbmRpbmcgZG9vcmJlbGxzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMDRjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtemV2aW8uYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEzIERhbmllbCBUYW5nIDx0YW5ncnNAdGFuZ3JzLmlkLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgImlycWNoaXAuaCIKKworI2RlZmluZSBJT19TVEFUVVMJMHgwMDAKKyNkZWZpbmUgSU9fUkFXX1NUQVRVUwkweDAwNAorI2RlZmluZSBJT19FTkFCTEUJMHgwMDgKKyNkZWZpbmUgSU9fRElTQUJMRQkweDAwQworI2RlZmluZSBJT19DVVJSRU5UCTB4MDIwCisjZGVmaW5lIElPX1JFU0VUCTB4MDI4CisjZGVmaW5lIElPX01BWF9QUklPVFkJMHgwMkMKKworI2RlZmluZSBJT19JUlFfQkFTRQkweDAwMAorI2RlZmluZSBJT19GSVFfQkFTRQkweDEwMAorCisjZGVmaW5lIElPX0lOVkVSVF9TRUwJMHgyMDAKKyNkZWZpbmUgSU9fU1RJQ0tZX1NFTAkweDIwNAorI2RlZmluZSBJT19QUklPUklUWV9TRUwJMHgzMDAKKworI2RlZmluZSBNQVhfSU5UUlMJMzIKKyNkZWZpbmUgRklRX1NUQVJUCU1BWF9JTlRSUworCitzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKnpldmlvX2lycV9kb21haW47CitzdGF0aWMgdm9pZCBfX2lvbWVtICp6ZXZpb19pcnFfaW87CisKK3N0YXRpYyB2b2lkIHpldmlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICppcnFkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGlycWQpOworCXN0cnVjdCBpcnFfY2hpcF9yZWdzICpyZWdzID0KKwkJJmNvbnRhaW5lcl9vZihpcnFkLT5jaGlwLCBzdHJ1Y3QgaXJxX2NoaXBfdHlwZSwgY2hpcCktPnJlZ3M7CisKKwlyZWFkbChnYy0+cmVnX2Jhc2UgKyByZWdzLT5hY2spOworfQorCitzdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB6ZXZpb19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpcnFucjsKKworCXdoaWxlIChyZWFkbCh6ZXZpb19pcnFfaW8gKyBJT19TVEFUVVMpKSB7CisJCWlycW5yID0gcmVhZGwoemV2aW9faXJxX2lvICsgSU9fQ1VSUkVOVCk7CisJCWlycW5yID0gaXJxX2ZpbmRfbWFwcGluZyh6ZXZpb19pcnFfZG9tYWluLCBpcnFucik7CisJCWhhbmRsZV9JUlEoaXJxbnIsIHJlZ3MpOworCX07Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB6ZXZpb19pbml0X2lycV9iYXNlKHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsKH4wLCBiYXNlICsgSU9fRElTQUJMRSk7CisKKwkvKiBBY2NlcHQgaW50ZXJydXB0cyBvZiBhbGwgcHJpb3JpdGllcyAqLworCXdyaXRlbCgweEYsIGJhc2UgKyBJT19NQVhfUFJJT1RZKTsKKworCS8qIFJlc2V0IGV4aXN0aW5nIGludGVycnVwdHMgKi8KKwlyZWFkbChiYXNlICsgSU9fUkVTRVQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB6ZXZpb19vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgY2xyID0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFIHwgSVJRX05PQVVUT0VOOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oemV2aW9faXJxX2lvIHx8IHpldmlvX2lycV9kb21haW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJemV2aW9faXJxX2lvID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJQlVHX09OKCF6ZXZpb19pcnFfaW8pOworCisJLyogRG8gbm90IGludmVydCBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KKwl3cml0ZWwofjAsIHpldmlvX2lycV9pbyArIElPX0lOVkVSVF9TRUwpOworCisJLyogRGlzYWJsZSBzdGlja3kgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCB6ZXZpb19pcnFfaW8gKyBJT19TVElDS1lfU0VMKTsKKworCS8qIFdlIGRvbid0IHVzZSBJUlEgcHJpb3JpdGllcy4gU2V0IGVhY2ggSVJRIHRvIGhpZ2hlc3QgcHJpb3JpdHkuICovCisJbWVtc2V0X2lvKHpldmlvX2lycV9pbyArIElPX1BSSU9SSVRZX1NFTCwgMCwgTUFYX0lOVFJTICogc2l6ZW9mKHUzMikpOworCisJLyogSW5pdCBJUlEgYW5kIEZJUSAqLworCXpldmlvX2luaXRfaXJxX2Jhc2UoemV2aW9faXJxX2lvICsgSU9fSVJRX0JBU0UpOworCXpldmlvX2luaXRfaXJxX2Jhc2UoemV2aW9faXJxX2lvICsgSU9fRklRX0JBU0UpOworCisJemV2aW9faXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBNQVhfSU5UUlMsCisJCQkJCQkgJmlycV9nZW5lcmljX2NoaXBfb3BzLCBOVUxMKTsKKwlCVUdfT04oIXpldmlvX2lycV9kb21haW4pOworCisJcmV0ID0gaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKHpldmlvX2lycV9kb21haW4sIE1BWF9JTlRSUywgMSwKKwkJCQkJICAgICAiemV2aW9faW50YyIsIGhhbmRsZV9sZXZlbF9pcnEsCisJCQkJCSAgICAgY2xyLCAwLCBJUlFfR0NfSU5JVF9NQVNLX0NBQ0hFKTsKKwlCVUdfT04ocmV0KTsKKworCWdjID0gaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKHpldmlvX2lycV9kb21haW4sIDApOworCWdjLT5yZWdfYmFzZQkJCQk9IHpldmlvX2lycV9pbzsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmlycV9hY2sJCT0gemV2aW9faXJxX2FjazsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmlycV9tYXNrCQk9IGlycV9nY19tYXNrX2Rpc2FibGVfcmVnOworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX3VubWFzawk9IGlycV9nY191bm1hc2tfZW5hYmxlX3JlZzsKKwlnYy0+Y2hpcF90eXBlc1swXS5yZWdzLm1hc2sJCT0gSU9fSVJRX0JBU0UgKyBJT19FTkFCTEU7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5lbmFibGUJCT0gSU9fSVJRX0JBU0UgKyBJT19FTkFCTEU7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5kaXNhYmxlCQk9IElPX0lSUV9CQVNFICsgSU9fRElTQUJMRTsKKwlnYy0+Y2hpcF90eXBlc1swXS5yZWdzLmFjawkJPSBJT19JUlFfQkFTRSArIElPX1JFU0VUOworCisJc2V0X2hhbmRsZV9pcnEoemV2aW9faGFuZGxlX2lycSk7CisKKwlwcl9pbmZvKCJUSS1OU1BJUkUgY2xhc3NpYyBJUlEgY29udHJvbGxlclxuIik7CisJcmV0dXJuIDA7Cit9CisKK0lSUUNISVBfREVDTEFSRSh6ZXZpb19pcnEsICJsc2ksemV2aW8taW50YyIsIHpldmlvX29mX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3E5MzEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMKaW5kZXggYWYxYjAyMC4uYjQyMGY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3E5MzEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvcTkzMS5jCkBAIC04MTAsNyArODEwLDcgQEAKIAlkcCArPSBzcHJpbnRmKGRwLCAiICAgIG9jdGV0IDMgICIpOwogCWRwICs9IHByYml0cyhkcCwgKnAsIDgsIDgpOwogCSpkcCsrID0gJ1xuJzsKLQlpZiAoISgqcCsrICYgODApKSB7CisJaWYgKCEoKnArKyAmIDB4ODApKSB7CiAJCWRwICs9IHNwcmludGYoZHAsICIgICAgb2N0ZXQgNCAgIik7CiAJCWRwICs9IHByYml0cyhkcCwgKnArKywgOCwgOCk7CiAJCSpkcCsrID0gJ1xuJzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL01ha2VmaWxlIGIvZHJpdmVycy9tZC9iY2FjaGUvTWFrZWZpbGUKaW5kZXggMGU5YzgyNS4uYzQ4OGI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiAKIG9iai0kKENPTkZJR19CQ0FDSEUpCSs9IGJjYWNoZS5vCiAKLWJjYWNoZS15CQk6PSBhbGxvYy5vIGJ0cmVlLm8gYnNldC5vIGlvLm8gam91cm5hbC5vIHdyaXRlYmFjay5vXAotCW1vdmluZ2djLm8gcmVxdWVzdC5vIHN1cGVyLm8gc3lzZnMubyBkZWJ1Zy5vIHV0aWwubyB0cmFjZS5vIHN0YXRzLm8gY2xvc3VyZS5vCitiY2FjaGUteQkJOj0gYWxsb2MubyBic2V0Lm8gYnRyZWUubyBjbG9zdXJlLm8gZGVidWcubyBleHRlbnRzLm9cCisJaW8ubyBqb3VybmFsLm8gbW92aW5nZ2MubyByZXF1ZXN0Lm8gc3RhdHMubyBzdXBlci5vIHN5c2ZzLm8gdHJhY2Uub1wKKwl1dGlsLm8gd3JpdGViYWNrLm8KIAogQ0ZMQUdTX3JlcXVlc3QubwkrPSAtSWJsb2NrCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYwppbmRleCA0Yzk4NTJkLi5jMGQzN2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKQEAgLTEzMiwxMCArMTMyLDE2IEBACiB7CiAJQlVHX09OKEdDX01BUksoYikgfHwgR0NfU0VDVE9SU19VU0VEKGIpKTsKIAotCWlmIChmaWZvX3VzZWQoJmNhLT5mcmVlKSA+IGNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01PVklOR0dDXSAmJgotCSAgICBDQUNIRV9SRVBMQUNFTUVOVCgmY2EtPnNiKSA9PSBDQUNIRV9SRVBMQUNFTUVOVF9GSUZPKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKENBQ0hFX1JFUExBQ0VNRU5UKCZjYS0+c2IpID09IENBQ0hFX1JFUExBQ0VNRU5UX0ZJRk8pIHsKKwkJdW5zaWduZWQgaTsKIAorCQlmb3IgKGkgPSAwOyBpIDwgUkVTRVJWRV9OT05FOyBpKyspCisJCQlpZiAoIWZpZm9fZnVsbCgmY2EtPmZyZWVbaV0pKQorCQkJCWdvdG8gYWRkOworCisJCXJldHVybiBmYWxzZTsKKwl9CithZGQ6CiAJYi0+cHJpbyA9IDA7CiAKIAlpZiAoY2FuX2luY19idWNrZXRfZ2VuKGIpICYmCkBAIC0xNjIsOCArMTY4LDIxIEBACiAJZmlmb19wdXNoKCZjYS0+ZnJlZV9pbmMsIGIgLSBjYS0+YnVja2V0cyk7CiB9CiAKLSNkZWZpbmUgYnVja2V0X3ByaW8oYikJCQkJXAotCSgoKHVuc2lnbmVkKSAoYi0+cHJpbyAtIGNhLT5zZXQtPm1pbl9wcmlvKSkgKiBHQ19TRUNUT1JTX1VTRUQoYikpCisvKgorICogRGV0ZXJtaW5lcyB3aGF0IG9yZGVyIHdlJ3JlIGdvaW5nIHRvIHJldXNlIGJ1Y2tldHMsIHNtYWxsZXN0IGJ1Y2tldF9wcmlvKCkKKyAqIGZpcnN0OiB3ZSBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBvZiBsaXZlIGRhdGEgaW4gdGhhdAorICogYnVja2V0LCBhbmQgaW4gb3JkZXIgZm9yIHRoYXQgbXVsdGlwbHkgdG8gbWFrZSBzZW5zZSB3ZSBoYXZlIHRvIHNjYWxlIGJ1Y2tldAorICoKKyAqIFRodXMsIHdlIHNjYWxlIHRoZSBidWNrZXQgcHJpb3JpdGllcyBzbyB0aGF0IHRoZSBidWNrZXQgd2l0aCB0aGUgc21hbGxlc3QKKyAqIHByaW8gaXMgd29ydGggMS84dGggb2Ygd2hhdCBJTklUSUFMX1BSSU8gaXMgd29ydGguCisgKi8KKworI2RlZmluZSBidWNrZXRfcHJpbyhiKQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBtaW5fcHJpbyA9IChJTklUSUFMX1BSSU8gLSBjYS0+c2V0LT5taW5fcHJpbykgLyA4OwlcCisJCQkJCQkJCQlcCisJKGItPnByaW8gLSBjYS0+c2V0LT5taW5fcHJpbyArIG1pbl9wcmlvKSAqIEdDX1NFQ1RPUlNfVVNFRChiKTsJXAorfSkKIAogI2RlZmluZSBidWNrZXRfbWF4X2NtcChsLCByKQkoYnVja2V0X3ByaW8obCkgPCBidWNrZXRfcHJpbyhyKSkKICNkZWZpbmUgYnVja2V0X21pbl9jbXAobCwgcikJKGJ1Y2tldF9wcmlvKGwpID4gYnVja2V0X3ByaW8ocikpCkBAIC0zMDQsNiArMzIzLDIxIEBACiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwkJCQlcCiB9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IGJjaF9hbGxvY2F0b3JfcHVzaChzdHJ1Y3QgY2FjaGUgKmNhLCBsb25nIGJ1Y2tldCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogUHJpb3MvZ2VucyBhcmUgYWN0dWFsbHkgdGhlIG1vc3QgaW1wb3J0YW50IHJlc2VydmUgKi8KKwlpZiAoZmlmb19wdXNoKCZjYS0+ZnJlZVtSRVNFUlZFX1BSSU9dLCBidWNrZXQpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBSRVNFUlZFX05SOyBpKyspCisJCWlmIChmaWZvX3B1c2goJmNhLT5mcmVlW2ldLCBidWNrZXQpKQorCQkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgYmNoX2FsbG9jYXRvcl90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBjYWNoZSAqY2EgPSBhcmc7CkBAIC0zMzYsOSArMzcwLDcgQEAKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKLQkJCWFsbG9jYXRvcl93YWl0KGNhLCAhZmlmb19mdWxsKCZjYS0+ZnJlZSkpOwotCi0JCQlmaWZvX3B1c2goJmNhLT5mcmVlLCBidWNrZXQpOworCQkJYWxsb2NhdG9yX3dhaXQoY2EsIGJjaF9hbGxvY2F0b3JfcHVzaChjYSwgYnVja2V0KSk7CiAJCQl3YWtlX3VwKCZjYS0+c2V0LT5idWNrZXRfd2FpdCk7CiAJCX0KIApAQCAtMzY1LDM0ICszOTcsMjkgQEAKIAl9CiB9CiAKLWxvbmcgYmNoX2J1Y2tldF9hbGxvYyhzdHJ1Y3QgY2FjaGUgKmNhLCB1bnNpZ25lZCB3YXRlcm1hcmssIGJvb2wgd2FpdCkKK2xvbmcgYmNoX2J1Y2tldF9hbGxvYyhzdHJ1Y3QgY2FjaGUgKmNhLCB1bnNpZ25lZCByZXNlcnZlLCBib29sIHdhaXQpCiB7CiAJREVGSU5FX1dBSVQodyk7CiAJc3RydWN0IGJ1Y2tldCAqYjsKIAlsb25nIHI7CiAKIAkvKiBmYXN0cGF0aCAqLwotCWlmIChmaWZvX3VzZWQoJmNhLT5mcmVlKSA+IGNhLT53YXRlcm1hcmtbd2F0ZXJtYXJrXSkgewotCQlmaWZvX3BvcCgmY2EtPmZyZWUsIHIpOworCWlmIChmaWZvX3BvcCgmY2EtPmZyZWVbUkVTRVJWRV9OT05FXSwgcikgfHwKKwkgICAgZmlmb19wb3AoJmNhLT5mcmVlW3Jlc2VydmVdLCByKSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKCF3YWl0KQogCQlyZXR1cm4gLTE7CiAKLQl3aGlsZSAoMSkgewotCQlpZiAoZmlmb191c2VkKCZjYS0+ZnJlZSkgPiBjYS0+d2F0ZXJtYXJrW3dhdGVybWFya10pIHsKLQkJCWZpZm9fcG9wKCZjYS0+ZnJlZSwgcik7Ci0JCQlicmVhazsKLQkJfQotCisJZG8gewogCQlwcmVwYXJlX3RvX3dhaXQoJmNhLT5zZXQtPmJ1Y2tldF93YWl0LCAmdywKIAkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCXNjaGVkdWxlKCk7CiAJCW11dGV4X2xvY2soJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKLQl9CisJfSB3aGlsZSAoIWZpZm9fcG9wKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdLCByKSAmJgorCQkgIWZpZm9fcG9wKCZjYS0+ZnJlZVtyZXNlcnZlXSwgcikpOwogCiAJZmluaXNoX3dhaXQoJmNhLT5zZXQtPmJ1Y2tldF93YWl0LCAmdyk7CiBvdXQ6CkBAIC00MDEsMTIgKzQyOCwxNCBAQAogCWlmIChleHBlbnNpdmVfZGVidWdfY2hlY2tzKGNhLT5zZXQpKSB7CiAJCXNpemVfdCBpdGVyOwogCQlsb25nIGk7CisJCXVuc2lnbmVkIGo7CiAKIAkJZm9yIChpdGVyID0gMDsgaXRlciA8IHByaW9fYnVja2V0cyhjYSkgKiAyOyBpdGVyKyspCiAJCQlCVUdfT04oY2EtPnByaW9fYnVja2V0c1tpdGVyXSA9PSAodWludDY0X3QpIHIpOwogCi0JCWZpZm9fZm9yX2VhY2goaSwgJmNhLT5mcmVlLCBpdGVyKQotCQkJQlVHX09OKGkgPT0gcik7CisJCWZvciAoaiA9IDA7IGogPCBSRVNFUlZFX05SOyBqKyspCisJCQlmaWZvX2Zvcl9lYWNoKGksICZjYS0+ZnJlZVtqXSwgaXRlcikKKwkJCQlCVUdfT04oaSA9PSByKTsKIAkJZmlmb19mb3JfZWFjaChpLCAmY2EtPmZyZWVfaW5jLCBpdGVyKQogCQkJQlVHX09OKGkgPT0gcik7CiAJCWZpZm9fZm9yX2VhY2goaSwgJmNhLT51bnVzZWQsIGl0ZXIpCkBAIC00MTksNyArNDQ4LDcgQEAKIAogCVNFVF9HQ19TRUNUT1JTX1VTRUQoYiwgY2EtPnNiLmJ1Y2tldF9zaXplKTsKIAotCWlmICh3YXRlcm1hcmsgPD0gV0FURVJNQVJLX01FVEFEQVRBKSB7CisJaWYgKHJlc2VydmUgPD0gUkVTRVJWRV9QUklPKSB7CiAJCVNFVF9HQ19NQVJLKGIsIEdDX01BUktfTUVUQURBVEEpOwogCQlTRVRfR0NfTU9WRShiLCAwKTsKIAkJYi0+cHJpbyA9IEJUUkVFX1BSSU87CkBAIC00NDUsNyArNDc0LDcgQEAKIAl9CiB9CiAKLWludCBfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHVuc2lnbmVkIHdhdGVybWFyaywKK2ludCBfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHVuc2lnbmVkIHJlc2VydmUsCiAJCQkgICBzdHJ1Y3QgYmtleSAqaywgaW50IG4sIGJvb2wgd2FpdCkKIHsKIAlpbnQgaTsKQEAgLTQ1OSw3ICs0ODgsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlzdHJ1Y3QgY2FjaGUgKmNhID0gYy0+Y2FjaGVfYnlfYWxsb2NbaV07Ci0JCWxvbmcgYiA9IGJjaF9idWNrZXRfYWxsb2MoY2EsIHdhdGVybWFyaywgd2FpdCk7CisJCWxvbmcgYiA9IGJjaF9idWNrZXRfYWxsb2MoY2EsIHJlc2VydmUsIHdhaXQpOwogCiAJCWlmIChiID09IC0xKQogCQkJZ290byBlcnI7CkBAIC00NzgsMTIgKzUwNywxMiBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IGJjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHVuc2lnbmVkIHdhdGVybWFyaywKK2ludCBiY2hfYnVja2V0X2FsbG9jX3NldChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCB1bnNpZ25lZCByZXNlcnZlLAogCQkJIHN0cnVjdCBia2V5ICprLCBpbnQgbiwgYm9vbCB3YWl0KQogewogCWludCByZXQ7CiAJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwotCXJldCA9IF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoYywgd2F0ZXJtYXJrLCBrLCBuLCB3YWl0KTsKKwlyZXQgPSBfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KGMsIHJlc2VydmUsIGssIG4sIHdhaXQpOwogCW11dGV4X3VubG9jaygmYy0+YnVja2V0X2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC01NzMsOCArNjAyLDggQEAKIAogCXdoaWxlICghKGIgPSBwaWNrX2RhdGFfYnVja2V0KGMsIGssIHdyaXRlX3BvaW50LCAmYWxsb2Mua2V5KSkpIHsKIAkJdW5zaWduZWQgd2F0ZXJtYXJrID0gd3JpdGVfcHJpbwotCQkJPyBXQVRFUk1BUktfTU9WSU5HR0MKLQkJCTogV0FURVJNQVJLX05PTkU7CisJCQk/IFJFU0VSVkVfTU9WSU5HR0MKKwkJCTogUkVTRVJWRV9OT05FOwogCiAJCXNwaW5fdW5sb2NrKCZjLT5kYXRhX2J1Y2tldF9sb2NrKTsKIApAQCAtNjg5LDcgKzcxOCw3IEBACiAJICogVGhlbiA4IGZvciBidHJlZSBhbGxvY2F0aW9ucwogCSAqIFRoZW4gaGFsZiBmb3IgdGhlIG1vdmluZyBnYXJiYWdlIGNvbGxlY3RvcgogCSAqLwotCisjaWYgMAogCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX1BSSU9dID0gMDsKIAogCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01FVEFEQVRBXSA9IHByaW9fYnVja2V0cyhjYSk7CkBAIC02OTksNiArNzI4LDYgQEAKIAogCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX05PTkVdID0gY2EtPmZyZWUuc2l6ZSAvIDIgKwogCQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19NT1ZJTkdHQ107Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYmNhY2hlLmggYi9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaAppbmRleCA3NTRmNDMxLi4wYzcwN2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaApAQCAtMTg3LDYgKzE4Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAorI2luY2x1ZGUgImJzZXQuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiY2xvc3VyZS5oIgogCkBAIC0yODAsNyArMjgxLDYgQEAKIAl1bnNpZ25lZCBsb25nCQlzZWN0b3JzX2RpcnR5X2xhc3Q7CiAJbG9uZwkJCXNlY3RvcnNfZGlydHlfZGVyaXZhdGl2ZTsKIAotCW1lbXBvb2xfdAkJKnVuYWxpZ25lZF9idmVjOwogCXN0cnVjdCBiaW9fc2V0CQkqYmlvX3NwbGl0OwogCiAJdW5zaWduZWQJCWRhdGFfY3N1bToxOwpAQCAtMzEwLDcgKzMxMCw4IEBACiAJc3RydWN0IGNhY2hlX3NiCQlzYjsKIAlzdHJ1Y3QgYmlvCQlzYl9iaW87CiAJc3RydWN0IGJpb192ZWMJCXNiX2J2WzFdOwotCXN0cnVjdCBjbG9zdXJlX3dpdGhfd2FpdGxpc3Qgc2Jfd3JpdGU7CisJc3RydWN0IGNsb3N1cmUJCXNiX3dyaXRlOworCXN0cnVjdCBzZW1hcGhvcmUJc2Jfd3JpdGVfbXV0ZXg7CiAKIAkvKiBSZWZjb3VudCBvbiB0aGUgY2FjaGUgc2V0LiBBbHdheXMgbm9uemVybyB3aGVuIHdlJ3JlIGNhY2hpbmcuICovCiAJYXRvbWljX3QJCWNvdW50OwpAQCAtMzgzLDEyICszODQsMTIgQEAKIAl1bnNpZ25lZAkJd3JpdGViYWNrX3JhdGVfcF90ZXJtX2ludmVyc2U7CiB9OwogCi1lbnVtIGFsbG9jX3dhdGVybWFya3MgewotCVdBVEVSTUFSS19QUklPLAotCVdBVEVSTUFSS19NRVRBREFUQSwKLQlXQVRFUk1BUktfTU9WSU5HR0MsCi0JV0FURVJNQVJLX05PTkUsCi0JV0FURVJNQVJLX01BWAorZW51bSBhbGxvY19yZXNlcnZlIHsKKwlSRVNFUlZFX0JUUkVFLAorCVJFU0VSVkVfUFJJTywKKwlSRVNFUlZFX01PVklOR0dDLAorCVJFU0VSVkVfTk9ORSwKKwlSRVNFUlZFX05SLAogfTsKIAogc3RydWN0IGNhY2hlIHsKQEAgLTQwMCw4ICs0MDEsNiBAQAogCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXY7CiAKLQl1bnNpZ25lZAkJd2F0ZXJtYXJrW1dBVEVSTUFSS19NQVhdOwotCiAJc3RydWN0IHRhc2tfc3RydWN0CSphbGxvY190aHJlYWQ7CiAKIAlzdHJ1Y3QgY2xvc3VyZQkJcHJpbzsKQEAgLTQzMCw3ICs0MjksNyBAQAogCSAqIGJlY2F1c2UgYWxsIHRoZSBkYXRhIHRoZXkgY29udGFpbmVkIHdhcyBvdmVyd3JpdHRlbiksIHNvIHdlIG9ubHkKIAkgKiBuZWVkIHRvIGRpc2NhcmQgdGhlbSBiZWZvcmUgdGhleSBjYW4gYmUgbW92ZWQgdG8gdGhlIGZyZWUgbGlzdC4KIAkgKi8KLQlERUNMQVJFX0ZJRk8obG9uZywgZnJlZSk7CisJREVDTEFSRV9GSUZPKGxvbmcsIGZyZWUpW1JFU0VSVkVfTlJdOwogCURFQ0xBUkVfRklGTyhsb25nLCBmcmVlX2luYyk7CiAJREVDTEFSRV9GSUZPKGxvbmcsIHVudXNlZCk7CiAKQEAgLTUxNSw3ICs1MTQsOCBAQAogCXVpbnQ2NF90CQljYWNoZWRfZGV2X3NlY3RvcnM7CiAJc3RydWN0IGNsb3N1cmUJCWNhY2hpbmc7CiAKLQlzdHJ1Y3QgY2xvc3VyZV93aXRoX3dhaXRsaXN0IHNiX3dyaXRlOworCXN0cnVjdCBjbG9zdXJlCQlzYl93cml0ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNiX3dyaXRlX211dGV4OwogCiAJbWVtcG9vbF90CQkqc2VhcmNoOwogCW1lbXBvb2xfdAkJKmJpb19tZXRhOwpAQCAtNjMwLDEzICs2MzAsMTUgQEAKIAogI2lmZGVmIENPTkZJR19CQ0FDSEVfREVCVUcKIAlzdHJ1Y3QgYnRyZWUJCSp2ZXJpZnlfZGF0YTsKKwlzdHJ1Y3QgYnNldAkJKnZlcmlmeV9vbmRpc2s7CiAJc3RydWN0IG11dGV4CQl2ZXJpZnlfbG9jazsKICNlbmRpZgogCiAJdW5zaWduZWQJCW5yX3V1aWRzOwogCXN0cnVjdCB1dWlkX2VudHJ5CSp1dWlkczsKIAlCS0VZX1BBRERFRCh1dWlkX2J1Y2tldCk7Ci0Jc3RydWN0IGNsb3N1cmVfd2l0aF93YWl0bGlzdCB1dWlkX3dyaXRlOworCXN0cnVjdCBjbG9zdXJlCQl1dWlkX3dyaXRlOworCXN0cnVjdCBzZW1hcGhvcmUJdXVpZF93cml0ZV9tdXRleDsKIAogCS8qCiAJICogQSBidHJlZSBub2RlIG9uIGRpc2sgY291bGQgaGF2ZSB0b28gbWFueSBic2V0cyBmb3IgYW4gaXRlcmF0b3IgdG8gZml0CkBAIC02NDQsMTMgKzY0Niw3IEBACiAJICovCiAJbWVtcG9vbF90CQkqZmlsbF9pdGVyOwogCi0JLyoKLQkgKiBidHJlZV9zb3J0KCkgaXMgYSBtZXJnZSBzb3J0IGFuZCByZXF1aXJlcyB0ZW1wb3Jhcnkgc3BhY2UgLSBzaW5nbGUKLQkgKiBlbGVtZW50IG1lbXBvb2wKLQkgKi8KLQlzdHJ1Y3QgbXV0ZXgJCXNvcnRfbG9jazsKLQlzdHJ1Y3QgYnNldAkJKnNvcnQ7Ci0JdW5zaWduZWQJCXNvcnRfY3JpdF9mYWN0b3I7CisJc3RydWN0IGJzZXRfc29ydF9zdGF0ZQlzb3J0OwogCiAJLyogTGlzdCBvZiBidWNrZXRzIHdlJ3JlIGN1cnJlbnRseSB3cml0aW5nIGRhdGEgdG8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWRhdGFfYnVja2V0czsKQEAgLTY2Niw3ICs2NjIsNiBAQAogCXVuc2lnbmVkCQljb25nZXN0ZWRfcmVhZF90aHJlc2hvbGRfdXM7CiAJdW5zaWduZWQJCWNvbmdlc3RlZF93cml0ZV90aHJlc2hvbGRfdXM7CiAKLQlzdHJ1Y3QgdGltZV9zdGF0cwlzb3J0X3RpbWU7CiAJc3RydWN0IHRpbWVfc3RhdHMJYnRyZWVfZ2NfdGltZTsKIAlzdHJ1Y3QgdGltZV9zdGF0cwlidHJlZV9zcGxpdF90aW1lOwogCXN0cnVjdCB0aW1lX3N0YXRzCWJ0cmVlX3JlYWRfdGltZTsKQEAgLTY4NCw5ICs2NzksOSBAQAogCXVuc2lnbmVkCQllcnJvcl9kZWNheTsKIAogCXVuc2lnbmVkIHNob3J0CQlqb3VybmFsX2RlbGF5X21zOworCWJvb2wJCQlleHBlbnNpdmVfZGVidWdfY2hlY2tzOwogCXVuc2lnbmVkCQl2ZXJpZnk6MTsKIAl1bnNpZ25lZAkJa2V5X21lcmdpbmdfZGlzYWJsZWQ6MTsKLQl1bnNpZ25lZAkJZXhwZW5zaXZlX2RlYnVnX2NoZWNrczoxOwogCXVuc2lnbmVkCQlnY19hbHdheXNfcmV3cml0ZToxOwogCXVuc2lnbmVkCQlzaHJpbmtlcl9kaXNhYmxlZDoxOwogCXVuc2lnbmVkCQljb3B5X2djX2VuYWJsZWQ6MTsKQEAgLTcwOCwxMyArNzAzLDggQEAKIAlzdHJ1Y3QgYmlvCQliaW87CiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvY2FsX2Nsb2NrX3VzKHZvaWQpCi17Ci0JcmV0dXJuIGxvY2FsX2Nsb2NrKCkgPj4gMTA7Ci19Ci0KICNkZWZpbmUgQlRSRUVfUFJJTwkJVVNIUlRfTUFYCi0jZGVmaW5lIElOSVRJQUxfUFJJTwkJMzI3NjgKKyNkZWZpbmUgSU5JVElBTF9QUklPCQkzMjc2OFUKIAogI2RlZmluZSBidHJlZV9ieXRlcyhjKQkJKChjKS0+YnRyZWVfcGFnZXMgKiBQQUdFX1NJWkUpCiAjZGVmaW5lIGJ0cmVlX2Jsb2NrcyhiKQkJCQkJCQlcCkBAIC03MjcsMjEgKzcxNyw2IEBACiAjZGVmaW5lIGJ1Y2tldF9ieXRlcyhjKQkJKChjKS0+c2IuYnVja2V0X3NpemUgPDwgOSkKICNkZWZpbmUgYmxvY2tfYnl0ZXMoYykJCSgoYyktPnNiLmJsb2NrX3NpemUgPDwgOSkKIAotI2RlZmluZSBfX3NldF9ieXRlcyhpLCBrKQkoc2l6ZW9mKCooaSkpICsgKGspICogc2l6ZW9mKHVpbnQ2NF90KSkKLSNkZWZpbmUgc2V0X2J5dGVzKGkpCQlfX3NldF9ieXRlcyhpLCBpLT5rZXlzKQotCi0jZGVmaW5lIF9fc2V0X2Jsb2NrcyhpLCBrLCBjKQlESVZfUk9VTkRfVVAoX19zZXRfYnl0ZXMoaSwgayksIGJsb2NrX2J5dGVzKGMpKQotI2RlZmluZSBzZXRfYmxvY2tzKGksIGMpCV9fc2V0X2Jsb2NrcyhpLCAoaSktPmtleXMsIGMpCi0KLSNkZWZpbmUgbm9kZShpLCBqKQkJKChzdHJ1Y3QgYmtleSAqKSAoKGkpLT5kICsgKGopKSkKLSNkZWZpbmUgZW5kKGkpCQkJbm9kZShpLCAoaSktPmtleXMpCi0KLSNkZWZpbmUgaW5kZXgoaSwgYikJCQkJCQkJXAotCSgoc2l6ZV90KSAoKCh2b2lkICopIGkgLSAodm9pZCAqKSAoYiktPnNldHNbMF0uZGF0YSkgLwkJXAotCQkgICBibG9ja19ieXRlcyhiLT5jKSkpCi0KLSNkZWZpbmUgYnRyZWVfZGF0YV9zcGFjZShiKQkoUEFHRV9TSVpFIDw8IChiKS0+cGFnZV9vcmRlcikKLQogI2RlZmluZSBwcmlvc19wZXJfYnVja2V0KGMpCQkJCVwKIAkoKGJ1Y2tldF9ieXRlcyhjKSAtIHNpemVvZihzdHJ1Y3QgcHJpb19zZXQpKSAvCVwKIAkgc2l6ZW9mKHN0cnVjdCBidWNrZXRfZGlzaykpCkBAIC03ODQsMjAgKzc1OSwzNCBAQAogCXJldHVybiBQVFJfQ0FDSEUoYywgaywgcHRyKS0+YnVja2V0cyArIFBUUl9CVUNLRVRfTlIoYywgaywgcHRyKTsKIH0KIAotLyogQnRyZWUga2V5IG1hY3JvcyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmtleV9pbml0KHN0cnVjdCBia2V5ICprKQorc3RhdGljIGlubGluZSB1aW50OF90IGdlbl9hZnRlcih1aW50OF90IGEsIHVpbnQ4X3QgYikKIHsKLQkqayA9IFpFUk9fS0VZOworCXVpbnQ4X3QgciA9IGEgLSBiOworCXJldHVybiByID4gMTI4VSA/IDAgOiByOwogfQogCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgcHRyX3N0YWxlKHN0cnVjdCBjYWNoZV9zZXQgKmMsIGNvbnN0IHN0cnVjdCBia2V5ICprLAorCQkJCXVuc2lnbmVkIGkpCit7CisJcmV0dXJuIGdlbl9hZnRlcihQVFJfQlVDS0VUKGMsIGssIGkpLT5nZW4sIFBUUl9HRU4oaywgaSkpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHRyX2F2YWlsYWJsZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBjb25zdCBzdHJ1Y3QgYmtleSAqaywKKwkJCQkgdW5zaWduZWQgaSkKK3sKKwlyZXR1cm4gKFBUUl9ERVYoaywgaSkgPCBNQVhfQ0FDSEVTX1BFUl9TRVQpICYmIFBUUl9DQUNIRShjLCBrLCBpKTsKK30KKworLyogQnRyZWUga2V5IG1hY3JvcyAqLworCiAvKgogICogVGhpcyBpcyB1c2VkIGZvciB2YXJpb3VzIG9uIGRpc2sgZGF0YSBzdHJ1Y3R1cmVzIC0gY2FjaGVfc2IsIHByaW9fc2V0LCBic2V0LAogICoganNldDogVGhlIGNoZWNrc3VtIGlzIF9hbHdheXNfIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZXNlIHN0cnVjdHMKICAqLwogI2RlZmluZSBjc3VtX3NldChpKQkJCQkJCQlcCiAJYmNoX2NyYzY0KCgodm9pZCAqKSAoaSkpICsgc2l6ZW9mKHVpbnQ2NF90KSwJCQlcCi0JICAgICAgKCh2b2lkICopIGVuZChpKSkgLSAoKCh2b2lkICopIChpKSkgKyBzaXplb2YodWludDY0X3QpKSkKKwkJICAoKHZvaWQgKikgYnNldF9ia2V5X2xhc3QoaSkpIC0JCQlcCisJCSAgKCgodm9pZCAqKSAoaSkpICsgc2l6ZW9mKHVpbnQ2NF90KSkpCiAKIC8qIEVycm9yIGhhbmRsaW5nIG1hY3JvcyAqLwogCkBAIC05MDIsNyArODkxLDYgQEAKIHZvaWQgYmNoX2JiaW9fZnJlZShzdHJ1Y3QgYmlvICosIHN0cnVjdCBjYWNoZV9zZXQgKik7CiBzdHJ1Y3QgYmlvICpiY2hfYmJpb19hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICopOwogCi1zdHJ1Y3QgYmlvICpiY2hfYmlvX3NwbGl0KHN0cnVjdCBiaW8gKiwgaW50LCBnZnBfdCwgc3RydWN0IGJpb19zZXQgKik7CiB2b2lkIGJjaF9nZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgYmlvICosIHN0cnVjdCBiaW9fc3BsaXRfcG9vbCAqKTsKIHZvaWQgX19iY2hfc3VibWl0X2JiaW8oc3RydWN0IGJpbyAqLCBzdHJ1Y3QgY2FjaGVfc2V0ICopOwogdm9pZCBiY2hfc3VibWl0X2JiaW8oc3RydWN0IGJpbyAqLCBzdHJ1Y3QgY2FjaGVfc2V0ICosIHN0cnVjdCBia2V5ICosIHVuc2lnbmVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYwppbmRleCA3ZDM4OGI4Li40ZjZiNTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5jCkBAIC01LDMwICs1LDEzNCBAQAogICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlLCBJbmMuCiAgKi8KIAotI2luY2x1ZGUgImJjYWNoZS5oIgotI2luY2x1ZGUgImJ0cmVlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgImJjYWNoZTogJXMoKSAiIGZtdCAiXG4iLCBfX2Z1bmNfXwogCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImJzZXQuaCIKKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCisjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRworCit2b2lkIGJjaF9kdW1wX2JzZXQoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHN0cnVjdCBic2V0ICppLCB1bnNpZ25lZCBzZXQpCit7CisJc3RydWN0IGJrZXkgKmssICpuZXh0OworCisJZm9yIChrID0gaS0+c3RhcnQ7IGsgPCBic2V0X2JrZXlfbGFzdChpKTsgayA9IG5leHQpIHsKKwkJbmV4dCA9IGJrZXlfbmV4dChrKTsKKworCQlwcmludGsoS0VSTl9FUlIgImJsb2NrICV1IGtleSAlemkvJXU6ICIsIHNldCwKKwkJICAgICAgICh1aW50NjRfdCAqKSBrIC0gaS0+ZCwgaS0+a2V5cyk7CisKKwkJaWYgKGItPm9wcy0+a2V5X2R1bXApCisJCQliLT5vcHMtPmtleV9kdW1wKGIsIGspOworCQllbHNlCisJCQlwcmludGsoIiVsbHU6JWxsdVxuIiwgS0VZX0lOT0RFKGspLCBLRVlfT0ZGU0VUKGspKTsKKworCQlpZiAobmV4dCA8IGJzZXRfYmtleV9sYXN0KGkpICYmCisJCSAgICBia2V5X2NtcChrLCBiLT5vcHMtPmlzX2V4dGVudHMgPworCQkJICAgICAmU1RBUlRfS0VZKG5leHQpIDogbmV4dCkgPiAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJLZXkgc2tpcHBlZCBiYWNrd2FyZHNcbiIpOworCX0KK30KKwordm9pZCBiY2hfZHVtcF9idWNrZXQoc3RydWN0IGJ0cmVlX2tleXMgKmIpCit7CisJdW5zaWduZWQgaTsKKworCWNvbnNvbGVfbG9jaygpOworCWZvciAoaSA9IDA7IGkgPD0gYi0+bnNldHM7IGkrKykKKwkJYmNoX2R1bXBfYnNldChiLCBiLT5zZXRbaV0uZGF0YSwKKwkJCSAgICAgIGJzZXRfc2VjdG9yX29mZnNldChiLCBiLT5zZXRbaV0uZGF0YSkpOworCWNvbnNvbGVfdW5sb2NrKCk7Cit9CisKK2ludCBfX2JjaF9jb3VudF9kYXRhKHN0cnVjdCBidHJlZV9rZXlzICpiKQoreworCXVuc2lnbmVkIHJldCA9IDA7CisJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKKwlzdHJ1Y3QgYmtleSAqazsKKworCWlmIChiLT5vcHMtPmlzX2V4dGVudHMpCisJCWZvcl9lYWNoX2tleShiLCBrLCAmaXRlcikKKwkJCXJldCArPSBLRVlfU0laRShrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9fYmNoX2NoZWNrX2tleXMoc3RydWN0IGJ0cmVlX2tleXMgKmIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlzdHJ1Y3QgYmtleSAqaywgKnAgPSBOVUxMOworCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CisJY29uc3QgY2hhciAqZXJyOworCisJZm9yX2VhY2hfa2V5KGIsIGssICZpdGVyKSB7CisJCWlmIChiLT5vcHMtPmlzX2V4dGVudHMpIHsKKwkJCWVyciA9ICJLZXlzIG91dCBvZiBvcmRlciI7CisJCQlpZiAocCAmJiBia2V5X2NtcCgmU1RBUlRfS0VZKHApLCAmU1RBUlRfS0VZKGspKSA+IDApCisJCQkJZ290byBidWc7CisKKwkJCWlmIChiY2hfcHRyX2ludmFsaWQoYiwgaykpCisJCQkJY29udGludWU7CisKKwkJCWVyciA9ICAiT3ZlcmxhcHBpbmcga2V5cyI7CisJCQlpZiAocCAmJiBia2V5X2NtcChwLCAmU1RBUlRfS0VZKGspKSA+IDApCisJCQkJZ290byBidWc7CisJCX0gZWxzZSB7CisJCQlpZiAoYmNoX3B0cl9iYWQoYiwgaykpCisJCQkJY29udGludWU7CisKKwkJCWVyciA9ICJEdXBsaWNhdGUga2V5cyI7CisJCQlpZiAocCAmJiAhYmtleV9jbXAocCwgaykpCisJCQkJZ290byBidWc7CisJCX0KKwkJcCA9IGs7CisJfQorI2lmIDAKKwllcnIgPSAiS2V5IGxhcmdlciB0aGFuIGJ0cmVlIG5vZGUga2V5IjsKKwlpZiAocCAmJiBia2V5X2NtcChwLCAmYi0+a2V5KSA+IDApCisJCWdvdG8gYnVnOworI2VuZGlmCisJcmV0dXJuOworYnVnOgorCWJjaF9kdW1wX2J1Y2tldChiKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXBhbmljKCJiY2hfY2hlY2tfa2V5cyBlcnJvcjogICVzOlxuIiwgZXJyKTsKK30KKworc3RhdGljIHZvaWQgYmNoX2J0cmVlX2l0ZXJfbmV4dF9jaGVjayhzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlcikKK3sKKwlzdHJ1Y3QgYmtleSAqayA9IGl0ZXItPmRhdGEtPmssICpuZXh0ID0gYmtleV9uZXh0KGspOworCisJaWYgKG5leHQgPCBpdGVyLT5kYXRhLT5lbmQgJiYKKwkgICAgYmtleV9jbXAoaywgaXRlci0+Yi0+b3BzLT5pc19leHRlbnRzID8KKwkJICAgICAmU1RBUlRfS0VZKG5leHQpIDogbmV4dCkgPiAwKSB7CisJCWJjaF9kdW1wX2J1Y2tldChpdGVyLT5iKTsKKwkJcGFuaWMoIktleSBza2lwcGVkIGJhY2t3YXJkc1xuIik7CisJfQorfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNoX2J0cmVlX2l0ZXJfbmV4dF9jaGVjayhzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlcikge30KKworI2VuZGlmCisKIC8qIEtleWxpc3RzICovCiAKLWludCBiY2hfa2V5bGlzdF9yZWFsbG9jKHN0cnVjdCBrZXlsaXN0ICpsLCBpbnQgbnB0cnMsIHN0cnVjdCBjYWNoZV9zZXQgKmMpCitpbnQgX19iY2hfa2V5bGlzdF9yZWFsbG9jKHN0cnVjdCBrZXlsaXN0ICpsLCB1bnNpZ25lZCB1NjRzKQogewogCXNpemVfdCBvbGRzaXplID0gYmNoX2tleWxpc3RfbmtleXMobCk7Ci0Jc2l6ZV90IG5ld3NpemUgPSBvbGRzaXplICsgMiArIG5wdHJzOworCXNpemVfdCBuZXdzaXplID0gb2xkc2l6ZSArIHU2NHM7CiAJdWludDY0X3QgKm9sZF9rZXlzID0gbC0+a2V5c19wID09IGwtPmlubGluZV9rZXlzID8gTlVMTCA6IGwtPmtleXNfcDsKIAl1aW50NjRfdCAqbmV3X2tleXM7CiAKLQkvKiBUaGUgam91cm5hbGxpbmcgY29kZSBkb2Vzbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUga2V5cyB0byBpbnNlcnQKLQkgKiBpcyBiaWdnZXIgdGhhbiBhbiBlbXB0eSB3cml0ZTogSWYgd2UganVzdCByZXR1cm4gLUVOT01FTSBoZXJlLAotCSAqIGJpb19pbnNlcnQoKSBhbmQgYmlvX2ludmFsaWRhdGUoKSB3aWxsIGluc2VydCB0aGUga2V5cyBjcmVhdGVkIHNvIGZhcgotCSAqIGFuZCBmaW5pc2ggdGhlIHJlc3Qgd2hlbiB0aGUga2V5bGlzdCBpcyBlbXB0eS4KLQkgKi8KLQlpZiAobmV3c2l6ZSAqIHNpemVvZih1aW50NjRfdCkgPiBibG9ja19ieXRlcyhjKSAtIHNpemVvZihzdHJ1Y3QganNldCkpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJbmV3c2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhuZXdzaXplKTsKIAogCWlmIChuZXdzaXplIDw9IEtFWUxJU1RfSU5MSU5FIHx8CkBAIC03MSwxMzYgKzE3NSw2IEBACiAJCWJjaF9rZXlsaXN0X2J5dGVzKGwpKTsKIH0KIAotLyogUG9pbnRlciB2YWxpZGF0aW9uICovCi0KLXN0YXRpYyBib29sIF9fcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmspCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQotCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBpKSkgewotCQkJc3RydWN0IGNhY2hlICpjYSA9IFBUUl9DQUNIRShjLCBrLCBpKTsKLQkJCXNpemVfdCBidWNrZXQgPSBQVFJfQlVDS0VUX05SKGMsIGssIGkpOwotCQkJc2l6ZV90IHIgPSBidWNrZXRfcmVtYWluZGVyKGMsIFBUUl9PRkZTRVQoaywgaSkpOwotCi0JCQlpZiAoS0VZX1NJWkUoaykgKyByID4gYy0+c2IuYnVja2V0X3NpemUgfHwKLQkJCSAgICBidWNrZXQgPCAgY2EtPnNiLmZpcnN0X2J1Y2tldCB8fAotCQkJICAgIGJ1Y2tldCA+PSBjYS0+c2IubmJ1Y2tldHMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBiY2hfYnRyZWVfcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmspCi17Ci0JY2hhciBidWZbODBdOwotCi0JaWYgKCFLRVlfUFRSUyhrKSB8fCAhS0VZX1NJWkUoaykgfHwgS0VZX0RJUlRZKGspKQotCQlnb3RvIGJhZDsKLQotCWlmIChfX3B0cl9pbnZhbGlkKGMsIGspKQotCQlnb3RvIGJhZDsKLQotCXJldHVybiBmYWxzZTsKLWJhZDoKLQliY2hfYmtleV90b190ZXh0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIGspOwotCWNhY2hlX2J1ZyhjLCAic3BvdHRlZCBidHJlZSBwdHIgJXM6ICVzIiwgYnVmLCBiY2hfcHRyX3N0YXR1cyhjLCBrKSk7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYmNoX2V4dGVudF9wdHJfaW52YWxpZChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKLXsKLQljaGFyIGJ1Zls4MF07Ci0KLQlpZiAoIUtFWV9TSVpFKGspKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmIChLRVlfU0laRShrKSA+IEtFWV9PRkZTRVQoaykpCi0JCWdvdG8gYmFkOwotCi0JaWYgKF9fcHRyX2ludmFsaWQoYywgaykpCi0JCWdvdG8gYmFkOwotCi0JcmV0dXJuIGZhbHNlOwotYmFkOgotCWJjaF9ia2V5X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7Ci0JY2FjaGVfYnVnKGMsICJzcG90dGVkIGV4dGVudCAlczogJXMiLCBidWYsIGJjaF9wdHJfc3RhdHVzKGMsIGspKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgcHRyX2JhZF9leHBlbnNpdmVfY2hlY2tzKHN0cnVjdCBidHJlZSAqYiwgY29uc3Qgc3RydWN0IGJrZXkgKmssCi0JCQkJICAgICB1bnNpZ25lZCBwdHIpCi17Ci0Jc3RydWN0IGJ1Y2tldCAqZyA9IFBUUl9CVUNLRVQoYi0+YywgaywgcHRyKTsKLQljaGFyIGJ1Zls4MF07Ci0KLQlpZiAobXV0ZXhfdHJ5bG9jaygmYi0+Yy0+YnVja2V0X2xvY2spKSB7Ci0JCWlmIChiLT5sZXZlbCkgewotCQkJaWYgKEtFWV9ESVJUWShrKSB8fAotCQkJICAgIGctPnByaW8gIT0gQlRSRUVfUFJJTyB8fAotCQkJICAgIChiLT5jLT5nY19tYXJrX3ZhbGlkICYmCi0JCQkgICAgIEdDX01BUksoZykgIT0gR0NfTUFSS19NRVRBREFUQSkpCi0JCQkJZ290byBlcnI7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChnLT5wcmlvID09IEJUUkVFX1BSSU8pCi0JCQkJZ290byBlcnI7Ci0KLQkJCWlmIChLRVlfRElSVFkoaykgJiYKLQkJCSAgICBiLT5jLT5nY19tYXJrX3ZhbGlkICYmCi0JCQkgICAgR0NfTUFSSyhnKSAhPSBHQ19NQVJLX0RJUlRZKQotCQkJCWdvdG8gZXJyOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwotCX0KLQotCXJldHVybiBmYWxzZTsKLWVycjoKLQltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKLQliY2hfYmtleV90b190ZXh0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIGspOwotCWJ0cmVlX2J1ZyhiLAotImluY29uc2lzdGVudCBwb2ludGVyICVzOiBidWNrZXQgJXp1IHBpbiAlaSBwcmlvICVpIGdlbiAlaSBsYXN0X2djICVpIG1hcmsgJWxsdSBnY19nZW4gJWkiLAotCQkgIGJ1ZiwgUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBwdHIpLCBhdG9taWNfcmVhZCgmZy0+cGluKSwKLQkJICBnLT5wcmlvLCBnLT5nZW4sIGctPmxhc3RfZ2MsIEdDX01BUksoZyksIGctPmdjX2dlbik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYmNoX3B0cl9iYWQoc3RydWN0IGJ0cmVlICpiLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKLXsKLQlzdHJ1Y3QgYnVja2V0ICpnOwotCXVuc2lnbmVkIGksIHN0YWxlOwotCi0JaWYgKCFia2V5X2NtcChrLCAmWkVST19LRVkpIHx8Ci0JICAgICFLRVlfUFRSUyhrKSB8fAotCSAgICBiY2hfcHRyX2ludmFsaWQoYiwgaykpCi0JCXJldHVybiB0cnVlOwotCi0JZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKLQkJaWYgKCFwdHJfYXZhaWxhYmxlKGItPmMsIGssIGkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJZyA9IFBUUl9CVUNLRVQoYi0+YywgaywgaSk7Ci0JCXN0YWxlID0gcHRyX3N0YWxlKGItPmMsIGssIGkpOwotCi0JCWJ0cmVlX2J1Z19vbihzdGFsZSA+IDk2LCBiLAotCQkJICAgICAia2V5IHRvbyBzdGFsZTogJWksIG5lZWRfZ2MgJXUiLAotCQkJICAgICBzdGFsZSwgYi0+Yy0+bmVlZF9nYyk7Ci0KLQkJYnRyZWVfYnVnX29uKHN0YWxlICYmIEtFWV9ESVJUWShrKSAmJiBLRVlfU0laRShrKSwKLQkJCSAgICAgYiwgInN0YWxlIGRpcnR5IHBvaW50ZXIiKTsKLQotCQlpZiAoc3RhbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZXhwZW5zaXZlX2RlYnVnX2NoZWNrcyhiLT5jKSAmJgotCQkgICAgcHRyX2JhZF9leHBlbnNpdmVfY2hlY2tzKGIsIGssIGkpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCiAvKiBLZXkvcG9pbnRlciBtYW5pcHVsYXRpb24gKi8KIAogdm9pZCBiY2hfYmtleV9jb3B5X3NpbmdsZV9wdHIoc3RydWN0IGJrZXkgKmRlc3QsIGNvbnN0IHN0cnVjdCBia2V5ICpzcmMsCkBAIC0yNTUsNTYgKzIyOSwxMzggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHVpbnQ2NF90IG1lcmdlX2Noa3N1bXMoc3RydWN0IGJrZXkgKmwsIHN0cnVjdCBia2V5ICpyKQorLyogQXV4aWxpYXJ5IHNlYXJjaCB0cmVlcyAqLworCisvKiAzMiBiaXRzIHRvdGFsOiAqLworI2RlZmluZSBCS0VZX01JRF9CSVRTCQkzCisjZGVmaW5lIEJLRVlfRVhQT05FTlRfQklUUwk3CisjZGVmaW5lIEJLRVlfTUFOVElTU0FfQklUUwkoMzIgLSBCS0VZX01JRF9CSVRTIC0gQktFWV9FWFBPTkVOVF9CSVRTKQorI2RlZmluZSBCS0VZX01BTlRJU1NBX01BU0sJKCgxIDw8IEJLRVlfTUFOVElTU0FfQklUUykgLSAxKQorCitzdHJ1Y3QgYmtleV9mbG9hdCB7CisJdW5zaWduZWQJZXhwb25lbnQ6QktFWV9FWFBPTkVOVF9CSVRTOworCXVuc2lnbmVkCW06QktFWV9NSURfQklUUzsKKwl1bnNpZ25lZAltYW50aXNzYTpCS0VZX01BTlRJU1NBX0JJVFM7Cit9IF9fcGFja2VkOworCisvKgorICogQlNFVF9DQUNIRUxJTkUgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gbWF0Y2ggdGhlIGhhcmR3YXJlIGNhY2hlbGluZSBzaXplIC0KKyAqIGl0IHVzZWQgdG8gYmUgNjQsIGJ1dCBJIHJlYWxpemVkIHRoZSBsb29rdXAgY29kZSB3b3VsZCB0b3VjaCBzbGlnaHRseSBsZXNzCisgKiBtZW1vcnkgaWYgaXQgd2FzIDEyOC4KKyAqCisgKiBJdCBkZWZpbml0ZXMgdGhlIG51bWJlciBvZiBieXRlcyAoaW4gc3RydWN0IGJzZXQpIHBlciBzdHJ1Y3QgYmtleV9mbG9hdCBpbgorICogdGhlIGF1eGlsaWFyIHNlYXJjaCB0cmVlIC0gd2hlbiB3ZSdyZSBkb25lIHNlYXJjaGluZyB0aGUgYnNldF9mbG9hdCB0cmVlIHdlCisgKiBoYXZlIHRoaXMgbWFueSBieXRlcyBsZWZ0IHRoYXQgd2UgZG8gYSBsaW5lYXIgc2VhcmNoIG92ZXIuCisgKgorICogU2luY2UgKGFmdGVyIGxldmVsIDUpIGV2ZXJ5IGxldmVsIG9mIHRoZSBic2V0X3RyZWUgaXMgb24gYSBuZXcgY2FjaGVsaW5lLAorICogd2UncmUgdG91Y2hpbmcgb25lIGZld2VyIGNhY2hlbGluZSBpbiB0aGUgYnNldCB0cmVlIGluIGV4Y2hhbmdlIGZvciBvbmUgbW9yZQorICogY2FjaGVsaW5lIGluIHRoZSBsaW5lYXIgc2VhcmNoIC0gYnV0IHRoZSBsaW5lYXIgc2VhcmNoIG1pZ2h0IHN0b3AgYmVmb3JlIGl0CisgKiBnZXRzIHRvIHRoZSBzZWNvbmQgY2FjaGVsaW5lLgorICovCisKKyNkZWZpbmUgQlNFVF9DQUNIRUxJTkUJCTEyOAorCisvKiBTcGFjZSByZXF1aXJlZCBmb3IgdGhlIGJ0cmVlIG5vZGUga2V5cyAqLworc3RhdGljIGlubGluZSBzaXplX3QgYnRyZWVfa2V5c19ieXRlcyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYikKIHsKLQlyZXR1cm4gKGwtPnB0cltLRVlfUFRSUyhsKV0gKyByLT5wdHJbS0VZX1BUUlMocildKSAmCi0JCX4oKHVpbnQ2NF90KTEgPDwgNjMpOworCXJldHVybiBQQUdFX1NJWkUgPDwgYi0+cGFnZV9vcmRlcjsKIH0KIAotLyogVHJpZXMgdG8gbWVyZ2UgbCBhbmQgcjogbCBzaG91bGQgYmUgbG93ZXIgdGhhbiByCi0gKiBSZXR1cm5zIHRydWUgaWYgd2Ugd2VyZSBhYmxlIHRvIG1lcmdlLiBJZiB3ZSBkaWQgbWVyZ2UsIGwgd2lsbCBiZSB0aGUgbWVyZ2VkCi0gKiBrZXksIHIgd2lsbCBiZSB1bnRvdWNoZWQuCi0gKi8KLWJvb2wgYmNoX2JrZXlfdHJ5X21lcmdlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJrZXkgKmwsIHN0cnVjdCBia2V5ICpyKQorc3RhdGljIGlubGluZSBzaXplX3QgYnRyZWVfa2V5c19jYWNoZWxpbmVzKHN0cnVjdCBidHJlZV9rZXlzICpiKQoreworCXJldHVybiBidHJlZV9rZXlzX2J5dGVzKGIpIC8gQlNFVF9DQUNIRUxJTkU7Cit9CisKKy8qIFNwYWNlIHJlcXVpcmVkIGZvciB0aGUgYXV4aWxpYXJ5IHNlYXJjaCB0cmVlcyAqLworc3RhdGljIGlubGluZSBzaXplX3QgYnNldF90cmVlX2J5dGVzKHN0cnVjdCBidHJlZV9rZXlzICpiKQoreworCXJldHVybiBidHJlZV9rZXlzX2NhY2hlbGluZXMoYikgKiBzaXplb2Yoc3RydWN0IGJrZXlfZmxvYXQpOworfQorCisvKiBTcGFjZSByZXF1aXJlZCBmb3IgdGhlIHByZXYgcG9pbnRlcnMgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGJzZXRfcHJldl9ieXRlcyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYikKK3sKKwlyZXR1cm4gYnRyZWVfa2V5c19jYWNoZWxpbmVzKGIpICogc2l6ZW9mKHVpbnQ4X3QpOworfQorCisvKiBNZW1vcnkgYWxsb2NhdGlvbiAqLworCit2b2lkIGJjaF9idHJlZV9rZXlzX2ZyZWUoc3RydWN0IGJ0cmVlX2tleXMgKmIpCit7CisJc3RydWN0IGJzZXRfdHJlZSAqdCA9IGItPnNldDsKKworCWlmIChic2V0X3ByZXZfYnl0ZXMoYikgPCBQQUdFX1NJWkUpCisJCWtmcmVlKHQtPnByZXYpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdC0+cHJldiwKKwkJCSAgIGdldF9vcmRlcihic2V0X3ByZXZfYnl0ZXMoYikpKTsKKworCWlmIChic2V0X3RyZWVfYnl0ZXMoYikgPCBQQUdFX1NJWkUpCisJCWtmcmVlKHQtPnRyZWUpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdC0+dHJlZSwKKwkJCSAgIGdldF9vcmRlcihic2V0X3RyZWVfYnl0ZXMoYikpKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHQtPmRhdGEsIGItPnBhZ2Vfb3JkZXIpOworCisJdC0+cHJldiA9IE5VTEw7CisJdC0+dHJlZSA9IE5VTEw7CisJdC0+ZGF0YSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGJjaF9idHJlZV9rZXlzX2ZyZWUpOworCitpbnQgYmNoX2J0cmVlX2tleXNfYWxsb2Moc3RydWN0IGJ0cmVlX2tleXMgKmIsIHVuc2lnbmVkIHBhZ2Vfb3JkZXIsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgYnNldF90cmVlICp0ID0gYi0+c2V0OworCisJQlVHX09OKHQtPmRhdGEpOworCisJYi0+cGFnZV9vcmRlciA9IHBhZ2Vfb3JkZXI7CisKKwl0LT5kYXRhID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhnZnAsIGItPnBhZ2Vfb3JkZXIpOworCWlmICghdC0+ZGF0YSkKKwkJZ290byBlcnI7CisKKwl0LT50cmVlID0gYnNldF90cmVlX2J5dGVzKGIpIDwgUEFHRV9TSVpFCisJCT8ga21hbGxvYyhic2V0X3RyZWVfYnl0ZXMoYiksIGdmcCkKKwkJOiAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGdmcCwgZ2V0X29yZGVyKGJzZXRfdHJlZV9ieXRlcyhiKSkpOworCWlmICghdC0+dHJlZSkKKwkJZ290byBlcnI7CisKKwl0LT5wcmV2ID0gYnNldF9wcmV2X2J5dGVzKGIpIDwgUEFHRV9TSVpFCisJCT8ga21hbGxvYyhic2V0X3ByZXZfYnl0ZXMoYiksIGdmcCkKKwkJOiAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGdmcCwgZ2V0X29yZGVyKGJzZXRfcHJldl9ieXRlcyhiKSkpOworCWlmICghdC0+cHJldikKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKK2VycjoKKwliY2hfYnRyZWVfa2V5c19mcmVlKGIpOworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTChiY2hfYnRyZWVfa2V5c19hbGxvYyk7CisKK3ZvaWQgYmNoX2J0cmVlX2tleXNfaW5pdChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgY29uc3Qgc3RydWN0IGJ0cmVlX2tleXNfb3BzICpvcHMsCisJCQkgYm9vbCAqZXhwZW5zaXZlX2RlYnVnX2NoZWNrcykKIHsKIAl1bnNpZ25lZCBpOwogCi0JaWYgKGtleV9tZXJnaW5nX2Rpc2FibGVkKGItPmMpKQotCQlyZXR1cm4gZmFsc2U7CisJYi0+b3BzID0gb3BzOworCWItPmV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MgPSBleHBlbnNpdmVfZGVidWdfY2hlY2tzOworCWItPm5zZXRzID0gMDsKKwliLT5sYXN0X3NldF91bndyaXR0ZW4gPSAwOwogCi0JaWYgKEtFWV9QVFJTKGwpICE9IEtFWV9QVFJTKHIpIHx8Ci0JICAgIEtFWV9ESVJUWShsKSAhPSBLRVlfRElSVFkocikgfHwKLQkgICAgYmtleV9jbXAobCwgJlNUQVJUX0tFWShyKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhsKTsgaSsrKQotCQlpZiAobC0+cHRyW2ldICsgUFRSKDAsIEtFWV9TSVpFKGwpLCAwKSAhPSByLT5wdHJbaV0gfHwKLQkJICAgIFBUUl9CVUNLRVRfTlIoYi0+YywgbCwgaSkgIT0gUFRSX0JVQ0tFVF9OUihiLT5jLCByLCBpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCS8qIEtleXMgd2l0aCBubyBwb2ludGVycyBhcmVuJ3QgcmVzdHJpY3RlZCB0byBvbmUgYnVja2V0IGFuZCBjb3VsZAotCSAqIG92ZXJmbG93IEtFWV9TSVpFCisJLyogWFhYOiBzaG91bGRuJ3QgYmUgbmVlZGVkICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9CU0VUUzsgaSsrKQorCQliLT5zZXRbaV0uc2l6ZSA9IDA7CisJLyoKKwkgKiBTZWNvbmQgbG9vcCBzdGFydHMgYXQgMSBiZWNhdXNlIGItPmtleXNbMF0tPmRhdGEgaXMgdGhlIG1lbW9yeSB3ZQorCSAqIGFsbG9jYXRlZAogCSAqLwotCWlmIChLRVlfU0laRShsKSArIEtFWV9TSVpFKHIpID4gVVNIUlRfTUFYKSB7Ci0JCVNFVF9LRVlfT0ZGU0VUKGwsIEtFWV9PRkZTRVQobCkgKyBVU0hSVF9NQVggLSBLRVlfU0laRShsKSk7Ci0JCVNFVF9LRVlfU0laRShsLCBVU0hSVF9NQVgpOwotCi0JCWJjaF9jdXRfZnJvbnQobCwgcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoS0VZX0NTVU0obCkpIHsKLQkJaWYgKEtFWV9DU1VNKHIpKQotCQkJbC0+cHRyW0tFWV9QVFJTKGwpXSA9IG1lcmdlX2Noa3N1bXMobCwgcik7Ci0JCWVsc2UKLQkJCVNFVF9LRVlfQ1NVTShsLCAwKTsKLQl9Ci0KLQlTRVRfS0VZX09GRlNFVChsLCBLRVlfT0ZGU0VUKGwpICsgS0VZX1NJWkUocikpOwotCVNFVF9LRVlfU0laRShsLCBLRVlfU0laRShsKSArIEtFWV9TSVpFKHIpKTsKLQotCXJldHVybiB0cnVlOworCWZvciAoaSA9IDE7IGkgPCBNQVhfQlNFVFM7IGkrKykKKwkJYi0+c2V0W2ldLmRhdGEgPSBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChiY2hfYnRyZWVfa2V5c19pbml0KTsKIAogLyogQmluYXJ5IHRyZWUgc3R1ZmYgZm9yIGF1eGlsaWFyeSBzZWFyY2ggdHJlZXMgKi8KIApAQCAtNDU1LDkgKzUxMSwxMSBAQAogCXJldHVybiAoKHZvaWQgKikgayAtICh2b2lkICopIHQtPmRhdGEpIC8gQlNFVF9DQUNIRUxJTkU7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBia2V5X3RvX2NhY2hlbGluZV9vZmZzZXQoc3RydWN0IGJrZXkgKmspCitzdGF0aWMgdW5zaWduZWQgYmtleV90b19jYWNoZWxpbmVfb2Zmc2V0KHN0cnVjdCBic2V0X3RyZWUgKnQsCisJCQkJCSB1bnNpZ25lZCBjYWNoZWxpbmUsCisJCQkJCSBzdHJ1Y3QgYmtleSAqaykKIHsKLQlyZXR1cm4gKChzaXplX3QpIGsgJiAoQlNFVF9DQUNIRUxJTkUgLSAxKSkgLyBzaXplb2YodWludDY0X3QpOworCXJldHVybiAodTY0ICopIGsgLSAodTY0ICopIGNhY2hlbGluZV90b19ia2V5KHQsIGNhY2hlbGluZSwgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmtleSAqdHJlZV90b19ia2V5KHN0cnVjdCBic2V0X3RyZWUgKnQsIHVuc2lnbmVkIGopCkBAIC01MDQsNyArNTYyLDcgQEAKIAkJOiB0cmVlX3RvX3ByZXZfYmtleSh0LCBqID4+IGZmcyhqKSk7CiAKIAlzdHJ1Y3QgYmtleSAqciA9IGlzX3Bvd2VyX29mXzIoaiArIDEpCi0JCT8gbm9kZSh0LT5kYXRhLCB0LT5kYXRhLT5rZXlzIC0gYmtleV91NjRzKCZ0LT5lbmQpKQorCQk/IGJzZXRfYmtleV9pZHgodC0+ZGF0YSwgdC0+ZGF0YS0+a2V5cyAtIGJrZXlfdTY0cygmdC0+ZW5kKSkKIAkJOiB0cmVlX3RvX2JrZXkodCwgaiA+PiAoZmZ6KGopICsgMSkpOwogCiAJQlVHX09OKG0gPCBsIHx8IG0gPiByKTsKQEAgLTUyOCw5ICs1ODYsOSBAQAogCQlmLT5leHBvbmVudCA9IDEyNzsKIH0KIAotc3RhdGljIHZvaWQgYnNldF9hbGxvY190cmVlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCkKK3N0YXRpYyB2b2lkIGJzZXRfYWxsb2NfdHJlZShzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCkKIHsKLQlpZiAodCAhPSBiLT5zZXRzKSB7CisJaWYgKHQgIT0gYi0+c2V0KSB7CiAJCXVuc2lnbmVkIGogPSByb3VuZHVwKHRbLTFdLnNpemUsCiAJCQkJICAgICA2NCAvIHNpemVvZihzdHJ1Y3QgYmtleV9mbG9hdCkpOwogCkBAIC01MzgsMzMgKzU5Niw1NCBAQAogCQl0LT5wcmV2ID0gdFstMV0ucHJldiArIGo7CiAJfQogCi0Jd2hpbGUgKHQgPCBiLT5zZXRzICsgTUFYX0JTRVRTKQorCXdoaWxlICh0IDwgYi0+c2V0ICsgTUFYX0JTRVRTKQogCQl0KystPnNpemUgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBic2V0X2J1aWxkX3Vud3JpdHRlbl90cmVlKHN0cnVjdCBidHJlZSAqYikKK3N0YXRpYyB2b2lkIGJjaF9ic2V0X2J1aWxkX3Vud3JpdHRlbl90cmVlKHN0cnVjdCBidHJlZV9rZXlzICpiKQogewotCXN0cnVjdCBic2V0X3RyZWUgKnQgPSBiLT5zZXRzICsgYi0+bnNldHM7CisJc3RydWN0IGJzZXRfdHJlZSAqdCA9IGJzZXRfdHJlZV9sYXN0KGIpOworCisJQlVHX09OKGItPmxhc3Rfc2V0X3Vud3JpdHRlbik7CisJYi0+bGFzdF9zZXRfdW53cml0dGVuID0gMTsKIAogCWJzZXRfYWxsb2NfdHJlZShiLCB0KTsKIAotCWlmICh0LT50cmVlICE9IGItPnNldHMtPnRyZWUgKyBic2V0X3RyZWVfc3BhY2UoYikpIHsKLQkJdC0+cHJldlswXSA9IGJrZXlfdG9fY2FjaGVsaW5lX29mZnNldCh0LT5kYXRhLT5zdGFydCk7CisJaWYgKHQtPnRyZWUgIT0gYi0+c2V0LT50cmVlICsgYnRyZWVfa2V5c19jYWNoZWxpbmVzKGIpKSB7CisJCXQtPnByZXZbMF0gPSBia2V5X3RvX2NhY2hlbGluZV9vZmZzZXQodCwgMCwgdC0+ZGF0YS0+c3RhcnQpOwogCQl0LT5zaXplID0gMTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJzZXRfYnVpbGRfd3JpdHRlbl90cmVlKHN0cnVjdCBidHJlZSAqYikKK3ZvaWQgYmNoX2JzZXRfaW5pdF9uZXh0KHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnNldCAqaSwgdWludDY0X3QgbWFnaWMpCiB7Ci0Jc3RydWN0IGJzZXRfdHJlZSAqdCA9IGItPnNldHMgKyBiLT5uc2V0czsKLQlzdHJ1Y3QgYmtleSAqayA9IHQtPmRhdGEtPnN0YXJ0OworCWlmIChpICE9IGItPnNldC0+ZGF0YSkgeworCQliLT5zZXRbKytiLT5uc2V0c10uZGF0YSA9IGk7CisJCWktPnNlcSA9IGItPnNldC0+ZGF0YS0+c2VxOworCX0gZWxzZQorCQlnZXRfcmFuZG9tX2J5dGVzKCZpLT5zZXEsIHNpemVvZih1aW50NjRfdCkpOworCisJaS0+bWFnaWMJPSBtYWdpYzsKKwlpLT52ZXJzaW9uCT0gMDsKKwlpLT5rZXlzCQk9IDA7CisKKwliY2hfYnNldF9idWlsZF91bndyaXR0ZW5fdHJlZShiKTsKK30KK0VYUE9SVF9TWU1CT0woYmNoX2JzZXRfaW5pdF9uZXh0KTsKKwordm9pZCBiY2hfYnNldF9idWlsZF93cml0dGVuX3RyZWUoc3RydWN0IGJ0cmVlX2tleXMgKmIpCit7CisJc3RydWN0IGJzZXRfdHJlZSAqdCA9IGJzZXRfdHJlZV9sYXN0KGIpOworCXN0cnVjdCBia2V5ICpwcmV2ID0gTlVMTCwgKmsgPSB0LT5kYXRhLT5zdGFydDsKIAl1bnNpZ25lZCBqLCBjYWNoZWxpbmUgPSAxOwogCisJYi0+bGFzdF9zZXRfdW53cml0dGVuID0gMDsKKwogCWJzZXRfYWxsb2NfdHJlZShiLCB0KTsKIAogCXQtPnNpemUgPSBtaW5fdCh1bnNpZ25lZCwKLQkJCWJrZXlfdG9fY2FjaGVsaW5lKHQsIGVuZCh0LT5kYXRhKSksCi0JCQliLT5zZXRzLT50cmVlICsgYnNldF90cmVlX3NwYWNlKGIpIC0gdC0+dHJlZSk7CisJCQlia2V5X3RvX2NhY2hlbGluZSh0LCBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSksCisJCQliLT5zZXQtPnRyZWUgKyBidHJlZV9rZXlzX2NhY2hlbGluZXMoYikgLSB0LT50cmVlKTsKIAogCWlmICh0LT5zaXplIDwgMikgewogCQl0LT5zaXplID0gMDsKQEAgLTU3NywxNiArNjU2LDE0IEBACiAJZm9yIChqID0gaW5vcmRlcl9uZXh0KDAsIHQtPnNpemUpOwogCSAgICAgajsKIAkgICAgIGogPSBpbm9yZGVyX25leHQoaiwgdC0+c2l6ZSkpIHsKLQkJd2hpbGUgKGJrZXlfdG9fY2FjaGVsaW5lKHQsIGspICE9IGNhY2hlbGluZSkKLQkJCWsgPSBia2V5X25leHQoayk7CisJCXdoaWxlIChia2V5X3RvX2NhY2hlbGluZSh0LCBrKSA8IGNhY2hlbGluZSkKKwkJCXByZXYgPSBrLCBrID0gYmtleV9uZXh0KGspOwogCi0JCXQtPnByZXZbal0gPSBia2V5X3U2NHMoayk7Ci0JCWsgPSBia2V5X25leHQoayk7Ci0JCWNhY2hlbGluZSsrOwotCQl0LT50cmVlW2pdLm0gPSBia2V5X3RvX2NhY2hlbGluZV9vZmZzZXQoayk7CisJCXQtPnByZXZbal0gPSBia2V5X3U2NHMocHJldik7CisJCXQtPnRyZWVbal0ubSA9IGJrZXlfdG9fY2FjaGVsaW5lX29mZnNldCh0LCBjYWNoZWxpbmUrKywgayk7CiAJfQogCi0Jd2hpbGUgKGJrZXlfbmV4dChrKSAhPSBlbmQodC0+ZGF0YSkpCisJd2hpbGUgKGJrZXlfbmV4dChrKSAhPSBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSkKIAkJayA9IGJrZXlfbmV4dChrKTsKIAogCXQtPmVuZCA9ICprOwpAQCAtNTk3LDE0ICs2NzQsMTcgQEAKIAkgICAgIGogPSBpbm9yZGVyX25leHQoaiwgdC0+c2l6ZSkpCiAJCW1ha2VfYmZsb2F0KHQsIGopOwogfQorRVhQT1JUX1NZTUJPTChiY2hfYnNldF9idWlsZF93cml0dGVuX3RyZWUpOwogCi12b2lkIGJjaF9ic2V0X2ZpeF9pbnZhbGlkYXRlZF9rZXkoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYmtleSAqaykKKy8qIEluc2VydCAqLworCit2b2lkIGJjaF9ic2V0X2ZpeF9pbnZhbGlkYXRlZF9rZXkoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHN0cnVjdCBia2V5ICprKQogewogCXN0cnVjdCBic2V0X3RyZWUgKnQ7CiAJdW5zaWduZWQgaW5vcmRlciwgaiA9IDE7CiAKLQlmb3IgKHQgPSBiLT5zZXRzOyB0IDw9ICZiLT5zZXRzW2ItPm5zZXRzXTsgdCsrKQotCQlpZiAoayA8IGVuZCh0LT5kYXRhKSkKKwlmb3IgKHQgPSBiLT5zZXQ7IHQgPD0gYnNldF90cmVlX2xhc3QoYik7IHQrKykKKwkJaWYgKGsgPCBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSkKIAkJCWdvdG8gZm91bmRfc2V0OwogCiAJQlVHKCk7CkBAIC02MTcsNyArNjk3LDcgQEAKIAlpZiAoayA9PSB0LT5kYXRhLT5zdGFydCkKIAkJZ290byBmaXhfbGVmdDsKIAotCWlmIChia2V5X25leHQoaykgPT0gZW5kKHQtPmRhdGEpKSB7CisJaWYgKGJrZXlfbmV4dChrKSA9PSBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSkgewogCQl0LT5lbmQgPSAqazsKIAkJZ290byBmaXhfcmlnaHQ7CiAJfQpAQCAtNjQyLDEwICs3MjIsMTIgQEAKIAkJCWogPSBqICogMiArIDE7CiAJCX0gd2hpbGUgKGogPCB0LT5zaXplKTsKIH0KK0VYUE9SVF9TWU1CT0woYmNoX2JzZXRfZml4X2ludmFsaWRhdGVkX2tleSk7CiAKLXZvaWQgYmNoX2JzZXRfZml4X2xvb2t1cF90YWJsZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBia2V5ICprKQorc3RhdGljIHZvaWQgYmNoX2JzZXRfZml4X2xvb2t1cF90YWJsZShzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnNldF90cmVlICp0LAorCQkJCSAgICAgIHN0cnVjdCBia2V5ICprKQogewotCXN0cnVjdCBic2V0X3RyZWUgKnQgPSAmYi0+c2V0c1tiLT5uc2V0c107CiAJdW5zaWduZWQgc2hpZnQgPSBia2V5X3U2NHMoayk7CiAJdW5zaWduZWQgaiA9IGJrZXlfdG9fY2FjaGVsaW5lKHQsIGspOwogCkBAIC02NTcsOCArNzM5LDggQEAKIAkgKiBsb29rdXAgdGFibGUgZm9yIHRoZSBmaXJzdCBrZXkgdGhhdCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gazoKIAkgKiBpdCdzIGVpdGhlciBrJ3MgY2FjaGVsaW5lIG9yIHRoZSBuZXh0IG9uZQogCSAqLwotCWlmIChqIDwgdC0+c2l6ZSAmJgotCSAgICB0YWJsZV90b19ia2V5KHQsIGopIDw9IGspCisJd2hpbGUgKGogPCB0LT5zaXplICYmCisJICAgICAgIHRhYmxlX3RvX2JrZXkodCwgaikgPD0gaykKIAkJaisrOwogCiAJLyogQWRqdXN0IGFsbCB0aGUgbG9va3VwIHRhYmxlIGVudHJpZXMsIGFuZCBmaW5kIGEgbmV3IGtleSBmb3IgYW55IHRoYXQKQEAgLTY3Myw1NCArNzU1LDEyNCBAQAogCQkJd2hpbGUgKGsgPCBjYWNoZWxpbmVfdG9fYmtleSh0LCBqLCAwKSkKIAkJCQlrID0gYmtleV9uZXh0KGspOwogCi0JCQl0LT5wcmV2W2pdID0gYmtleV90b19jYWNoZWxpbmVfb2Zmc2V0KGspOworCQkJdC0+cHJldltqXSA9IGJrZXlfdG9fY2FjaGVsaW5lX29mZnNldCh0LCBqLCBrKTsKIAkJfQogCX0KIAotCWlmICh0LT5zaXplID09IGItPnNldHMtPnRyZWUgKyBic2V0X3RyZWVfc3BhY2UoYikgLSB0LT50cmVlKQorCWlmICh0LT5zaXplID09IGItPnNldC0+dHJlZSArIGJ0cmVlX2tleXNfY2FjaGVsaW5lcyhiKSAtIHQtPnRyZWUpCiAJCXJldHVybjsKIAogCS8qIFBvc3NpYmx5IGFkZCBhIG5ldyBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsb29rdXAgdGFibGUgKi8KIAogCWZvciAoayA9IHRhYmxlX3RvX2JrZXkodCwgdC0+c2l6ZSAtIDEpOwotCSAgICAgayAhPSBlbmQodC0+ZGF0YSk7CisJICAgICBrICE9IGJzZXRfYmtleV9sYXN0KHQtPmRhdGEpOwogCSAgICAgayA9IGJrZXlfbmV4dChrKSkKIAkJaWYgKHQtPnNpemUgPT0gYmtleV90b19jYWNoZWxpbmUodCwgaykpIHsKLQkJCXQtPnByZXZbdC0+c2l6ZV0gPSBia2V5X3RvX2NhY2hlbGluZV9vZmZzZXQoayk7CisJCQl0LT5wcmV2W3QtPnNpemVdID0gYmtleV90b19jYWNoZWxpbmVfb2Zmc2V0KHQsIHQtPnNpemUsIGspOwogCQkJdC0+c2l6ZSsrOwogCQl9CiB9CiAKLXZvaWQgYmNoX2JzZXRfaW5pdF9uZXh0KHN0cnVjdCBidHJlZSAqYikKKy8qCisgKiBUcmllcyB0byBtZXJnZSBsIGFuZCByOiBsIHNob3VsZCBiZSBsb3dlciB0aGFuIHIKKyAqIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIGFibGUgdG8gbWVyZ2UuIElmIHdlIGRpZCBtZXJnZSwgbCB3aWxsIGJlIHRoZSBtZXJnZWQKKyAqIGtleSwgciB3aWxsIGJlIHVudG91Y2hlZC4KKyAqLworYm9vbCBiY2hfYmtleV90cnlfbWVyZ2Uoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHN0cnVjdCBia2V5ICpsLCBzdHJ1Y3QgYmtleSAqcikKIHsKLQlzdHJ1Y3QgYnNldCAqaSA9IHdyaXRlX2Jsb2NrKGIpOworCWlmICghYi0+b3BzLT5rZXlfbWVyZ2UpCisJCXJldHVybiBmYWxzZTsKIAotCWlmIChpICE9IGItPnNldHNbMF0uZGF0YSkgewotCQliLT5zZXRzWysrYi0+bnNldHNdLmRhdGEgPSBpOwotCQlpLT5zZXEgPSBiLT5zZXRzWzBdLmRhdGEtPnNlcTsKLQl9IGVsc2UKLQkJZ2V0X3JhbmRvbV9ieXRlcygmaS0+c2VxLCBzaXplb2YodWludDY0X3QpKTsKKwkvKgorCSAqIEdlbmVyaWMgaGVhZGVyIGNoZWNrcworCSAqIEFzc3VtZXMgbGVmdCBhbmQgcmlnaHQgYXJlIGluIG9yZGVyCisJICogTGVmdCBhbmQgcmlnaHQgbXVzdCBiZSBleGFjdGx5IGFsaWduZWQKKwkgKi8KKwlpZiAoIWJjaF9ia2V5X2VxdWFsX2hlYWRlcihsLCByKSB8fAorCSAgICAgYmtleV9jbXAobCwgJlNUQVJUX0tFWShyKSkpCisJCXJldHVybiBmYWxzZTsKIAotCWktPm1hZ2ljCT0gYnNldF9tYWdpYygmYi0+Yy0+c2IpOwotCWktPnZlcnNpb24JPSAwOwotCWktPmtleXMJCT0gMDsKLQotCWJzZXRfYnVpbGRfdW53cml0dGVuX3RyZWUoYik7CisJcmV0dXJuIGItPm9wcy0+a2V5X21lcmdlKGIsIGwsIHIpOwogfQorRVhQT1JUX1NZTUJPTChiY2hfYmtleV90cnlfbWVyZ2UpOworCit2b2lkIGJjaF9ic2V0X2luc2VydChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgc3RydWN0IGJrZXkgKndoZXJlLAorCQkgICAgIHN0cnVjdCBia2V5ICppbnNlcnQpCit7CisJc3RydWN0IGJzZXRfdHJlZSAqdCA9IGJzZXRfdHJlZV9sYXN0KGIpOworCisJQlVHX09OKCFiLT5sYXN0X3NldF91bndyaXR0ZW4pOworCUJVR19PTihic2V0X2J5dGVfb2Zmc2V0KGIsIHQtPmRhdGEpICsKKwkgICAgICAgX19zZXRfYnl0ZXModC0+ZGF0YSwgdC0+ZGF0YS0+a2V5cyArIGJrZXlfdTY0cyhpbnNlcnQpKSA+CisJICAgICAgIFBBR0VfU0laRSA8PCBiLT5wYWdlX29yZGVyKTsKKworCW1lbW1vdmUoKHVpbnQ2NF90ICopIHdoZXJlICsgYmtleV91NjRzKGluc2VydCksCisJCXdoZXJlLAorCQkodm9pZCAqKSBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSAtICh2b2lkICopIHdoZXJlKTsKKworCXQtPmRhdGEtPmtleXMgKz0gYmtleV91NjRzKGluc2VydCk7CisJYmtleV9jb3B5KHdoZXJlLCBpbnNlcnQpOworCWJjaF9ic2V0X2ZpeF9sb29rdXBfdGFibGUoYiwgdCwgd2hlcmUpOworfQorRVhQT1JUX1NZTUJPTChiY2hfYnNldF9pbnNlcnQpOworCit1bnNpZ25lZCBiY2hfYnRyZWVfaW5zZXJ0X2tleShzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgc3RydWN0IGJrZXkgKmssCisJCQkgICAgICBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCit7CisJdW5zaWduZWQgc3RhdHVzID0gQlRSRUVfSU5TRVJUX1NUQVRVU19OT19JTlNFUlQ7CisJc3RydWN0IGJzZXQgKmkgPSBic2V0X3RyZWVfbGFzdChiKS0+ZGF0YTsKKwlzdHJ1Y3QgYmtleSAqbSwgKnByZXYgPSBOVUxMOworCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CisKKwlCVUdfT04oYi0+b3BzLT5pc19leHRlbnRzICYmICFLRVlfU0laRShrKSk7CisKKwltID0gYmNoX2J0cmVlX2l0ZXJfaW5pdChiLCAmaXRlciwgYi0+b3BzLT5pc19leHRlbnRzCisJCQkJPyBQUkVDRURJTkdfS0VZKCZTVEFSVF9LRVkoaykpCisJCQkJOiBQUkVDRURJTkdfS0VZKGspKTsKKworCWlmIChiLT5vcHMtPmluc2VydF9maXh1cChiLCBrLCAmaXRlciwgcmVwbGFjZV9rZXkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gQlRSRUVfSU5TRVJUX1NUQVRVU19JTlNFUlQ7CisKKwl3aGlsZSAobSAhPSBic2V0X2JrZXlfbGFzdChpKSAmJgorCSAgICAgICBia2V5X2NtcChrLCBiLT5vcHMtPmlzX2V4dGVudHMgPyAmU1RBUlRfS0VZKG0pIDogbSkgPiAwKQorCQlwcmV2ID0gbSwgbSA9IGJrZXlfbmV4dChtKTsKKworCS8qIHByZXYgaXMgaW4gdGhlIHRyZWUsIGlmIHdlIG1lcmdlIHdlJ3JlIGRvbmUgKi8KKwlzdGF0dXMgPSBCVFJFRV9JTlNFUlRfU1RBVFVTX0JBQ0tfTUVSR0U7CisJaWYgKHByZXYgJiYKKwkgICAgYmNoX2JrZXlfdHJ5X21lcmdlKGIsIHByZXYsIGspKQorCQlnb3RvIG1lcmdlZDsKKyNpZiAwCisJc3RhdHVzID0gQlRSRUVfSU5TRVJUX1NUQVRVU19PVkVSV1JPVEU7CisJaWYgKG0gIT0gYnNldF9ia2V5X2xhc3QoaSkgJiYKKwkgICAgS0VZX1BUUlMobSkgPT0gS0VZX1BUUlMoaykgJiYgIUtFWV9TSVpFKG0pKQorCQlnb3RvIGNvcHk7CisjZW5kaWYKKwlzdGF0dXMgPSBCVFJFRV9JTlNFUlRfU1RBVFVTX0ZST05UX01FUkdFOworCWlmIChtICE9IGJzZXRfYmtleV9sYXN0KGkpICYmCisJICAgIGJjaF9ia2V5X3RyeV9tZXJnZShiLCBrLCBtKSkKKwkJZ290byBjb3B5OworCisJYmNoX2JzZXRfaW5zZXJ0KGIsIG0sIGspOworY29weToJYmtleV9jb3B5KG0sIGspOworbWVyZ2VkOgorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKGJjaF9idHJlZV9pbnNlcnRfa2V5KTsKKworLyogTG9va3VwICovCiAKIHN0cnVjdCBic2V0X3NlYXJjaF9pdGVyIHsKIAlzdHJ1Y3QgYmtleSAqbCwgKnI7CiB9OwogCi1zdGF0aWMgc3RydWN0IGJzZXRfc2VhcmNoX2l0ZXIgYnNldF9zZWFyY2hfd3JpdGVfc2V0KHN0cnVjdCBidHJlZSAqYiwKLQkJCQkJCSAgICAgc3RydWN0IGJzZXRfdHJlZSAqdCwKK3N0YXRpYyBzdHJ1Y3QgYnNldF9zZWFyY2hfaXRlciBic2V0X3NlYXJjaF93cml0ZV9zZXQoc3RydWN0IGJzZXRfdHJlZSAqdCwKIAkJCQkJCSAgICAgY29uc3Qgc3RydWN0IGJrZXkgKnNlYXJjaCkKIHsKIAl1bnNpZ25lZCBsaSA9IDAsIHJpID0gdC0+c2l6ZTsKIAotCUJVR19PTighYi0+bnNldHMgJiYKLQkgICAgICAgdC0+c2l6ZSA8IGJrZXlfdG9fY2FjaGVsaW5lKHQsIGVuZCh0LT5kYXRhKSkpOwotCiAJd2hpbGUgKGxpICsgMSAhPSByaSkgewogCQl1bnNpZ25lZCBtID0gKGxpICsgcmkpID4+IDE7CiAKQEAgLTczMiwxMiArODg0LDExIEBACiAKIAlyZXR1cm4gKHN0cnVjdCBic2V0X3NlYXJjaF9pdGVyKSB7CiAJCXRhYmxlX3RvX2JrZXkodCwgbGkpLAotCQlyaSA8IHQtPnNpemUgPyB0YWJsZV90b19ia2V5KHQsIHJpKSA6IGVuZCh0LT5kYXRhKQorCQlyaSA8IHQtPnNpemUgPyB0YWJsZV90b19ia2V5KHQsIHJpKSA6IGJzZXRfYmtleV9sYXN0KHQtPmRhdGEpCiAJfTsKIH0KIAotc3RhdGljIHN0cnVjdCBic2V0X3NlYXJjaF9pdGVyIGJzZXRfc2VhcmNoX3RyZWUoc3RydWN0IGJ0cmVlICpiLAotCQkJCQkJc3RydWN0IGJzZXRfdHJlZSAqdCwKK3N0YXRpYyBzdHJ1Y3QgYnNldF9zZWFyY2hfaXRlciBic2V0X3NlYXJjaF90cmVlKHN0cnVjdCBic2V0X3RyZWUgKnQsCiAJCQkJCQljb25zdCBzdHJ1Y3QgYmtleSAqc2VhcmNoKQogewogCXN0cnVjdCBia2V5ICpsLCAqcjsKQEAgLTc4NCw3ICs5MzUsNyBAQAogCQkJZiA9ICZ0LT50cmVlW2lub3JkZXJfbmV4dChqLCB0LT5zaXplKV07CiAJCQlyID0gY2FjaGVsaW5lX3RvX2JrZXkodCwgaW5vcmRlciwgZi0+bSk7CiAJCX0gZWxzZQotCQkJciA9IGVuZCh0LT5kYXRhKTsKKwkJCXIgPSBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKTsKIAl9IGVsc2UgewogCQlyID0gY2FjaGVsaW5lX3RvX2JrZXkodCwgaW5vcmRlciwgZi0+bSk7CiAKQEAgLTc5OCw3ICs5NDksNyBAQAogCXJldHVybiAoc3RydWN0IGJzZXRfc2VhcmNoX2l0ZXIpIHtsLCByfTsKIH0KIAotc3RydWN0IGJrZXkgKl9fYmNoX2JzZXRfc2VhcmNoKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCwKK3N0cnVjdCBia2V5ICpfX2JjaF9ic2V0X3NlYXJjaChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmtleSAqc2VhcmNoKQogewogCXN0cnVjdCBic2V0X3NlYXJjaF9pdGVyIGk7CkBAIC04MjAsNyArOTcxLDcgQEAKIAogCWlmICh1bmxpa2VseSghdC0+c2l6ZSkpIHsKIAkJaS5sID0gdC0+ZGF0YS0+c3RhcnQ7Ci0JCWkuciA9IGVuZCh0LT5kYXRhKTsKKwkJaS5yID0gYnNldF9ia2V5X2xhc3QodC0+ZGF0YSk7CiAJfSBlbHNlIGlmIChic2V0X3dyaXR0ZW4oYiwgdCkpIHsKIAkJLyoKIAkJICogRWFjaCBub2RlIGluIHRoZSBhdXhpbGlhcnkgc2VhcmNoIHRyZWUgY292ZXJzIGEgY2VydGFpbiByYW5nZQpAQCAtODMwLDIzICs5ODEsMjcgQEAKIAkJICovCiAKIAkJaWYgKHVubGlrZWx5KGJrZXlfY21wKHNlYXJjaCwgJnQtPmVuZCkgPj0gMCkpCi0JCQlyZXR1cm4gZW5kKHQtPmRhdGEpOworCQkJcmV0dXJuIGJzZXRfYmtleV9sYXN0KHQtPmRhdGEpOwogCiAJCWlmICh1bmxpa2VseShia2V5X2NtcChzZWFyY2gsIHQtPmRhdGEtPnN0YXJ0KSA8IDApKQogCQkJcmV0dXJuIHQtPmRhdGEtPnN0YXJ0OwogCi0JCWkgPSBic2V0X3NlYXJjaF90cmVlKGIsIHQsIHNlYXJjaCk7Ci0JfSBlbHNlCi0JCWkgPSBic2V0X3NlYXJjaF93cml0ZV9zZXQoYiwgdCwgc2VhcmNoKTsKKwkJaSA9IGJzZXRfc2VhcmNoX3RyZWUodCwgc2VhcmNoKTsKKwl9IGVsc2UgeworCQlCVUdfT04oIWItPm5zZXRzICYmCisJCSAgICAgICB0LT5zaXplIDwgYmtleV90b19jYWNoZWxpbmUodCwgYnNldF9ia2V5X2xhc3QodC0+ZGF0YSkpKTsKIAotCWlmIChleHBlbnNpdmVfZGVidWdfY2hlY2tzKGItPmMpKSB7CisJCWkgPSBic2V0X3NlYXJjaF93cml0ZV9zZXQodCwgc2VhcmNoKTsKKwl9CisKKwlpZiAoYnRyZWVfa2V5c19leHBlbnNpdmVfY2hlY2tzKGIpKSB7CiAJCUJVR19PTihic2V0X3dyaXR0ZW4oYiwgdCkgJiYKIAkJICAgICAgIGkubCAhPSB0LT5kYXRhLT5zdGFydCAmJgogCQkgICAgICAgYmtleV9jbXAodHJlZV90b19wcmV2X2JrZXkodCwKIAkJCSAgaW5vcmRlcl90b190cmVlKGJrZXlfdG9fY2FjaGVsaW5lKHQsIGkubCksIHQpKSwKIAkJCQlzZWFyY2gpID4gMCk7CiAKLQkJQlVHX09OKGkuciAhPSBlbmQodC0+ZGF0YSkgJiYKKwkJQlVHX09OKGkuciAhPSBic2V0X2JrZXlfbGFzdCh0LT5kYXRhKSAmJgogCQkgICAgICAgYmtleV9jbXAoaS5yLCBzZWFyY2gpIDw9IDApOwogCX0KIApAQCAtODU2LDIyICsxMDExLDE3IEBACiAKIAlyZXR1cm4gaS5sOwogfQorRVhQT1JUX1NZTUJPTChfX2JjaF9ic2V0X3NlYXJjaCk7CiAKIC8qIEJ0cmVlIGl0ZXJhdG9yICovCiAKLS8qCi0gKiBSZXR1cm5zIHRydWUgaWYgbCA+IHIgLSB1bmxlc3MgbCA9PSByLCBpbiB3aGljaCBjYXNlIHJldHVybnMgdHJ1ZSBpZiBsIGlzCi0gKiBvbGRlciB0aGFuIHIuCi0gKgotICogTmVjZXNzYXJ5IGZvciBidHJlZV9zb3J0X2ZpeHVwKCkgLSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUga2V5cyB0aGF0IGNvbXBhcmUKLSAqIGVxdWFsIGluIGRpZmZlcmVudCBzZXRzLCB3ZSBoYXZlIHRvIHByb2Nlc3MgdGhlbSBuZXdlc3QgdG8gb2xkZXN0LgotICovCit0eXBlZGVmIGJvb2wgKGJ0cmVlX2l0ZXJfY21wX2ZuKShzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQsCisJCQkJIHN0cnVjdCBidHJlZV9pdGVyX3NldCk7CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBidHJlZV9pdGVyX2NtcChzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQgbCwKIAkJCQkgIHN0cnVjdCBidHJlZV9pdGVyX3NldCByKQogewotCWludDY0X3QgYyA9IGJrZXlfY21wKCZTVEFSVF9LRVkobC5rKSwgJlNUQVJUX0tFWShyLmspKTsKLQotCXJldHVybiBjID8gYyA+IDAgOiBsLmsgPCByLms7CisJcmV0dXJuIGJrZXlfY21wKGwuaywgci5rKSA+IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBidHJlZV9pdGVyX2VuZChzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlcikKQEAgLTg4OCw4ICsxMDM4LDEwIEBACiAJCQkJIGJ0cmVlX2l0ZXJfY21wKSk7CiB9CiAKLXN0cnVjdCBia2V5ICpfX2JjaF9idHJlZV9pdGVyX2luaXQoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKLQkJCQkgICBzdHJ1Y3QgYmtleSAqc2VhcmNoLCBzdHJ1Y3QgYnNldF90cmVlICpzdGFydCkKK3N0YXRpYyBzdHJ1Y3QgYmtleSAqX19iY2hfYnRyZWVfaXRlcl9pbml0KHN0cnVjdCBidHJlZV9rZXlzICpiLAorCQkJCQkgIHN0cnVjdCBidHJlZV9pdGVyICppdGVyLAorCQkJCQkgIHN0cnVjdCBia2V5ICpzZWFyY2gsCisJCQkJCSAgc3RydWN0IGJzZXRfdHJlZSAqc3RhcnQpCiB7CiAJc3RydWN0IGJrZXkgKnJldCA9IE5VTEw7CiAJaXRlci0+c2l6ZSA9IEFSUkFZX1NJWkUoaXRlci0+ZGF0YSk7CkBAIC04OTksMTUgKzEwNTEsMjQgQEAKIAlpdGVyLT5iID0gYjsKICNlbmRpZgogCi0JZm9yICg7IHN0YXJ0IDw9ICZiLT5zZXRzW2ItPm5zZXRzXTsgc3RhcnQrKykgeworCWZvciAoOyBzdGFydCA8PSBic2V0X3RyZWVfbGFzdChiKTsgc3RhcnQrKykgewogCQlyZXQgPSBiY2hfYnNldF9zZWFyY2goYiwgc3RhcnQsIHNlYXJjaCk7Ci0JCWJjaF9idHJlZV9pdGVyX3B1c2goaXRlciwgcmV0LCBlbmQoc3RhcnQtPmRhdGEpKTsKKwkJYmNoX2J0cmVlX2l0ZXJfcHVzaChpdGVyLCByZXQsIGJzZXRfYmtleV9sYXN0KHN0YXJ0LT5kYXRhKSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IGJrZXkgKmJjaF9idHJlZV9pdGVyX25leHQoc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIpCitzdHJ1Y3QgYmtleSAqYmNoX2J0cmVlX2l0ZXJfaW5pdChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwKKwkJCQkgc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCisJCQkJIHN0cnVjdCBia2V5ICpzZWFyY2gpCit7CisJcmV0dXJuIF9fYmNoX2J0cmVlX2l0ZXJfaW5pdChiLCBpdGVyLCBzZWFyY2gsIGItPnNldCk7Cit9CitFWFBPUlRfU1lNQk9MKGJjaF9idHJlZV9pdGVyX2luaXQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBia2V5ICpfX2JjaF9idHJlZV9pdGVyX25leHQoc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCisJCQkJCQkgYnRyZWVfaXRlcl9jbXBfZm4gKmNtcCkKIHsKIAlzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQgdW51c2VkOwogCXN0cnVjdCBia2V5ICpyZXQgPSBOVUxMOwpAQCAtOTI0LDE2ICsxMDg1LDIzIEBACiAJCX0KIAogCQlpZiAoaXRlci0+ZGF0YS0+ayA9PSBpdGVyLT5kYXRhLT5lbmQpCi0JCQloZWFwX3BvcChpdGVyLCB1bnVzZWQsIGJ0cmVlX2l0ZXJfY21wKTsKKwkJCWhlYXBfcG9wKGl0ZXIsIHVudXNlZCwgY21wKTsKIAkJZWxzZQotCQkJaGVhcF9zaWZ0KGl0ZXIsIDAsIGJ0cmVlX2l0ZXJfY21wKTsKKwkJCWhlYXBfc2lmdChpdGVyLCAwLCBjbXApOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCBia2V5ICpiY2hfYnRyZWVfaXRlcl9uZXh0KHN0cnVjdCBidHJlZV9pdGVyICppdGVyKQoreworCXJldHVybiBfX2JjaF9idHJlZV9pdGVyX25leHQoaXRlciwgYnRyZWVfaXRlcl9jbXApOworCit9CitFWFBPUlRfU1lNQk9MKGJjaF9idHJlZV9pdGVyX25leHQpOworCiBzdHJ1Y3QgYmtleSAqYmNoX2J0cmVlX2l0ZXJfbmV4dF9maWx0ZXIoc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCi0JCQkJCXN0cnVjdCBidHJlZSAqYiwgcHRyX2ZpbHRlcl9mbiBmbikKKwkJCQkJc3RydWN0IGJ0cmVlX2tleXMgKmIsIHB0cl9maWx0ZXJfZm4gZm4pCiB7CiAJc3RydWN0IGJrZXkgKnJldDsKIApAQCAtOTQ2LDcwICsxMTE0LDU4IEBACiAKIC8qIE1lcmdlc29ydCAqLwogCi1zdGF0aWMgdm9pZCBzb3J0X2tleV9uZXh0KHN0cnVjdCBidHJlZV9pdGVyICppdGVyLAotCQkJICBzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQgKmkpCit2b2lkIGJjaF9ic2V0X3NvcnRfc3RhdGVfZnJlZShzdHJ1Y3QgYnNldF9zb3J0X3N0YXRlICpzdGF0ZSkKIHsKLQlpLT5rID0gYmtleV9uZXh0KGktPmspOwotCi0JaWYgKGktPmsgPT0gaS0+ZW5kKQotCQkqaSA9IGl0ZXItPmRhdGFbLS1pdGVyLT51c2VkXTsKKwlpZiAoc3RhdGUtPnBvb2wpCisJCW1lbXBvb2xfZGVzdHJveShzdGF0ZS0+cG9vbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0cmVlX3NvcnRfZml4dXAoc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIpCitpbnQgYmNoX2JzZXRfc29ydF9zdGF0ZV9pbml0KHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBwYWdlX29yZGVyKQogewotCXdoaWxlIChpdGVyLT51c2VkID4gMSkgewotCQlzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQgKnRvcCA9IGl0ZXItPmRhdGEsICppID0gdG9wICsgMTsKKwlzcGluX2xvY2tfaW5pdCgmc3RhdGUtPnRpbWUubG9jayk7CiAKLQkJaWYgKGl0ZXItPnVzZWQgPiAyICYmCi0JCSAgICBidHJlZV9pdGVyX2NtcChpWzBdLCBpWzFdKSkKLQkJCWkrKzsKKwlzdGF0ZS0+cGFnZV9vcmRlciA9IHBhZ2Vfb3JkZXI7CisJc3RhdGUtPmNyaXRfZmFjdG9yID0gaW50X3NxcnQoMSA8PCBwYWdlX29yZGVyKTsKIAotCQlpZiAoYmtleV9jbXAodG9wLT5rLCAmU1RBUlRfS0VZKGktPmspKSA8PSAwKQotCQkJYnJlYWs7CisJc3RhdGUtPnBvb2wgPSBtZW1wb29sX2NyZWF0ZV9wYWdlX3Bvb2woMSwgcGFnZV9vcmRlcik7CisJaWYgKCFzdGF0ZS0+cG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJaWYgKCFLRVlfU0laRShpLT5rKSkgewotCQkJc29ydF9rZXlfbmV4dChpdGVyLCBpKTsKLQkJCWhlYXBfc2lmdChpdGVyLCBpIC0gdG9wLCBidHJlZV9pdGVyX2NtcCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICh0b3AtPmsgPiBpLT5rKSB7Ci0JCQlpZiAoYmtleV9jbXAodG9wLT5rLCBpLT5rKSA+PSAwKQotCQkJCXNvcnRfa2V5X25leHQoaXRlciwgaSk7Ci0JCQllbHNlCi0JCQkJYmNoX2N1dF9mcm9udCh0b3AtPmssIGktPmspOwotCi0JCQloZWFwX3NpZnQoaXRlciwgaSAtIHRvcCwgYnRyZWVfaXRlcl9jbXApOwotCQl9IGVsc2UgewotCQkJLyogY2FuJ3QgaGFwcGVuIGJlY2F1c2Ugb2YgY29tcGFyaXNvbiBmdW5jICovCi0JCQlCVUdfT04oIWJrZXlfY21wKCZTVEFSVF9LRVkodG9wLT5rKSwgJlNUQVJUX0tFWShpLT5rKSkpOwotCQkJYmNoX2N1dF9iYWNrKCZTVEFSVF9LRVkoaS0+ayksIHRvcC0+ayk7Ci0JCX0KLQl9CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGJjaF9ic2V0X3NvcnRfc3RhdGVfaW5pdCk7CiAKLXN0YXRpYyB2b2lkIGJ0cmVlX21lcmdlc29ydChzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBic2V0ICpvdXQsCitzdGF0aWMgdm9pZCBidHJlZV9tZXJnZXNvcnQoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHN0cnVjdCBic2V0ICpvdXQsCiAJCQkgICAgc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCiAJCQkgICAgYm9vbCBmaXh1cCwgYm9vbCByZW1vdmVfc3RhbGUpCiB7CisJaW50IGk7CiAJc3RydWN0IGJrZXkgKmssICpsYXN0ID0gTlVMTDsKLQlib29sICgqYmFkKShzdHJ1Y3QgYnRyZWUgKiwgY29uc3Qgc3RydWN0IGJrZXkgKikgPSByZW1vdmVfc3RhbGUKKwlCS0VZX1BBRERFRChrKSB0bXA7CisJYm9vbCAoKmJhZCkoc3RydWN0IGJ0cmVlX2tleXMgKiwgY29uc3Qgc3RydWN0IGJrZXkgKikgPSByZW1vdmVfc3RhbGUKIAkJPyBiY2hfcHRyX2JhZAogCQk6IGJjaF9wdHJfaW52YWxpZDsKIAotCXdoaWxlICghYnRyZWVfaXRlcl9lbmQoaXRlcikpIHsKLQkJaWYgKGZpeHVwICYmICFiLT5sZXZlbCkKLQkJCWJ0cmVlX3NvcnRfZml4dXAoaXRlcik7CisJLyogSGVhcGlmeSB0aGUgaXRlcmF0b3IsIHVzaW5nIG91ciBjb21wYXJpc29uIGZ1bmN0aW9uICovCisJZm9yIChpID0gaXRlci0+dXNlZCAvIDIgLSAxOyBpID49IDA7IC0taSkKKwkJaGVhcF9zaWZ0KGl0ZXIsIGksIGItPm9wcy0+c29ydF9jbXApOwogCi0JCWsgPSBiY2hfYnRyZWVfaXRlcl9uZXh0KGl0ZXIpOworCXdoaWxlICghYnRyZWVfaXRlcl9lbmQoaXRlcikpIHsKKwkJaWYgKGItPm9wcy0+c29ydF9maXh1cCAmJiBmaXh1cCkKKwkJCWsgPSBiLT5vcHMtPnNvcnRfZml4dXAoaXRlciwgJnRtcC5rKTsKKwkJZWxzZQorCQkJayA9IE5VTEw7CisKKwkJaWYgKCFrKQorCQkJayA9IF9fYmNoX2J0cmVlX2l0ZXJfbmV4dChpdGVyLCBiLT5vcHMtPnNvcnRfY21wKTsKKwogCQlpZiAoYmFkKGIsIGspKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFsYXN0KSB7CiAJCQlsYXN0ID0gb3V0LT5zdGFydDsKIAkJCWJrZXlfY29weShsYXN0LCBrKTsKLQkJfSBlbHNlIGlmIChiLT5sZXZlbCB8fAotCQkJICAgIWJjaF9ia2V5X3RyeV9tZXJnZShiLCBsYXN0LCBrKSkgeworCQl9IGVsc2UgaWYgKCFiY2hfYmtleV90cnlfbWVyZ2UoYiwgbGFzdCwgaykpIHsKIAkJCWxhc3QgPSBia2V5X25leHQobGFzdCk7CiAJCQlia2V5X2NvcHkobGFzdCwgayk7CiAJCX0KQEAgLTEwMjAsMjcgKzExNzYsMjcgQEAKIAlwcl9kZWJ1Zygic29ydGVkICVpIGtleXMiLCBvdXQtPmtleXMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2J0cmVlX3NvcnQoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKLQkJCSB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgb3JkZXIsIGJvb2wgZml4dXApCitzdGF0aWMgdm9pZCBfX2J0cmVlX3NvcnQoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHN0cnVjdCBidHJlZV9pdGVyICppdGVyLAorCQkJIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBvcmRlciwgYm9vbCBmaXh1cCwKKwkJCSBzdHJ1Y3QgYnNldF9zb3J0X3N0YXRlICpzdGF0ZSkKIHsKIAl1aW50NjRfdCBzdGFydF90aW1lOwotCWJvb2wgcmVtb3ZlX3N0YWxlID0gIWItPndyaXR0ZW47CisJYm9vbCB1c2VkX21lbXBvb2wgPSBmYWxzZTsKIAlzdHJ1Y3QgYnNldCAqb3V0ID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhfX0dGUF9OT1dBUk58R0ZQX05PSU8sCiAJCQkJCQkgICAgIG9yZGVyKTsKIAlpZiAoIW91dCkgewotCQltdXRleF9sb2NrKCZiLT5jLT5zb3J0X2xvY2spOwotCQlvdXQgPSBiLT5jLT5zb3J0OwotCQlvcmRlciA9IGlsb2cyKGJ1Y2tldF9wYWdlcyhiLT5jKSk7CisJCUJVR19PTihvcmRlciA+IHN0YXRlLT5wYWdlX29yZGVyKTsKKworCQlvdXQgPSBwYWdlX2FkZHJlc3MobWVtcG9vbF9hbGxvYyhzdGF0ZS0+cG9vbCwgR0ZQX05PSU8pKTsKKwkJdXNlZF9tZW1wb29sID0gdHJ1ZTsKKwkJb3JkZXIgPSBzdGF0ZS0+cGFnZV9vcmRlcjsKIAl9CiAKIAlzdGFydF90aW1lID0gbG9jYWxfY2xvY2soKTsKIAotCWJ0cmVlX21lcmdlc29ydChiLCBvdXQsIGl0ZXIsIGZpeHVwLCByZW1vdmVfc3RhbGUpOworCWJ0cmVlX21lcmdlc29ydChiLCBvdXQsIGl0ZXIsIGZpeHVwLCBmYWxzZSk7CiAJYi0+bnNldHMgPSBzdGFydDsKIAotCWlmICghZml4dXAgJiYgIXN0YXJ0ICYmIGItPndyaXR0ZW4pCi0JCWJjaF9idHJlZV92ZXJpZnkoYiwgb3V0KTsKLQogCWlmICghc3RhcnQgJiYgb3JkZXIgPT0gYi0+cGFnZV9vcmRlcikgewogCQkvKgogCQkgKiBPdXIgdGVtcG9yYXJ5IGJ1ZmZlciBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBidHJlZSBub2RlJ3MKQEAgLTEwNDgsODQgKzEyMDQsNzYgQEAKIAkJICogbWVtY3B5KCkKIAkJICovCiAKLQkJb3V0LT5tYWdpYwk9IGJzZXRfbWFnaWMoJmItPmMtPnNiKTsKLQkJb3V0LT5zZXEJPSBiLT5zZXRzWzBdLmRhdGEtPnNlcTsKLQkJb3V0LT52ZXJzaW9uCT0gYi0+c2V0c1swXS5kYXRhLT52ZXJzaW9uOwotCQlzd2FwKG91dCwgYi0+c2V0c1swXS5kYXRhKTsKLQotCQlpZiAoYi0+Yy0+c29ydCA9PSBiLT5zZXRzWzBdLmRhdGEpCi0JCQliLT5jLT5zb3J0ID0gb3V0OworCQlvdXQtPm1hZ2ljCT0gYi0+c2V0LT5kYXRhLT5tYWdpYzsKKwkJb3V0LT5zZXEJPSBiLT5zZXQtPmRhdGEtPnNlcTsKKwkJb3V0LT52ZXJzaW9uCT0gYi0+c2V0LT5kYXRhLT52ZXJzaW9uOworCQlzd2FwKG91dCwgYi0+c2V0LT5kYXRhKTsKIAl9IGVsc2UgewotCQliLT5zZXRzW3N0YXJ0XS5kYXRhLT5rZXlzID0gb3V0LT5rZXlzOwotCQltZW1jcHkoYi0+c2V0c1tzdGFydF0uZGF0YS0+c3RhcnQsIG91dC0+c3RhcnQsCi0JCSAgICAgICAodm9pZCAqKSBlbmQob3V0KSAtICh2b2lkICopIG91dC0+c3RhcnQpOworCQliLT5zZXRbc3RhcnRdLmRhdGEtPmtleXMgPSBvdXQtPmtleXM7CisJCW1lbWNweShiLT5zZXRbc3RhcnRdLmRhdGEtPnN0YXJ0LCBvdXQtPnN0YXJ0LAorCQkgICAgICAgKHZvaWQgKikgYnNldF9ia2V5X2xhc3Qob3V0KSAtICh2b2lkICopIG91dC0+c3RhcnQpOwogCX0KIAotCWlmIChvdXQgPT0gYi0+Yy0+c29ydCkKLQkJbXV0ZXhfdW5sb2NrKCZiLT5jLT5zb3J0X2xvY2spOworCWlmICh1c2VkX21lbXBvb2wpCisJCW1lbXBvb2xfZnJlZSh2aXJ0X3RvX3BhZ2Uob3V0KSwgc3RhdGUtPnBvb2wpOwogCWVsc2UKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgb3V0LCBvcmRlcik7CiAKLQlpZiAoYi0+d3JpdHRlbikKLQkJYnNldF9idWlsZF93cml0dGVuX3RyZWUoYik7CisJYmNoX2JzZXRfYnVpbGRfd3JpdHRlbl90cmVlKGIpOwogCiAJaWYgKCFzdGFydCkKLQkJYmNoX3RpbWVfc3RhdHNfdXBkYXRlKCZiLT5jLT5zb3J0X3RpbWUsIHN0YXJ0X3RpbWUpOworCQliY2hfdGltZV9zdGF0c191cGRhdGUoJnN0YXRlLT50aW1lLCBzdGFydF90aW1lKTsKIH0KIAotdm9pZCBiY2hfYnRyZWVfc29ydF9wYXJ0aWFsKHN0cnVjdCBidHJlZSAqYiwgdW5zaWduZWQgc3RhcnQpCit2b2lkIGJjaF9idHJlZV9zb3J0X3BhcnRpYWwoc3RydWN0IGJ0cmVlX2tleXMgKmIsIHVuc2lnbmVkIHN0YXJ0LAorCQkJICAgIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKnN0YXRlKQogewogCXNpemVfdCBvcmRlciA9IGItPnBhZ2Vfb3JkZXIsIGtleXMgPSAwOwogCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CiAJaW50IG9sZHNpemUgPSBiY2hfY291bnRfZGF0YShiKTsKIAotCV9fYmNoX2J0cmVlX2l0ZXJfaW5pdChiLCAmaXRlciwgTlVMTCwgJmItPnNldHNbc3RhcnRdKTsKLQotCUJVR19PTihiLT5zZXRzW2ItPm5zZXRzXS5kYXRhID09IHdyaXRlX2Jsb2NrKGIpICYmCi0JICAgICAgIChiLT5zZXRzW2ItPm5zZXRzXS5zaXplIHx8IGItPm5zZXRzKSk7Ci0KKwlfX2JjaF9idHJlZV9pdGVyX2luaXQoYiwgJml0ZXIsIE5VTEwsICZiLT5zZXRbc3RhcnRdKTsKIAogCWlmIChzdGFydCkgewogCQl1bnNpZ25lZCBpOwogCiAJCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGItPm5zZXRzOyBpKyspCi0JCQlrZXlzICs9IGItPnNldHNbaV0uZGF0YS0+a2V5czsKKwkJCWtleXMgKz0gYi0+c2V0W2ldLmRhdGEtPmtleXM7CiAKLQkJb3JkZXIgPSByb3VuZHVwX3Bvd19vZl90d28oX19zZXRfYnl0ZXMoYi0+c2V0cy0+ZGF0YSwKLQkJCQkJCSAgICAgICBrZXlzKSkgLyBQQUdFX1NJWkU7Ci0JCWlmIChvcmRlcikKLQkJCW9yZGVyID0gaWxvZzIob3JkZXIpOworCQlvcmRlciA9IGdldF9vcmRlcihfX3NldF9ieXRlcyhiLT5zZXQtPmRhdGEsIGtleXMpKTsKIAl9CiAKLQlfX2J0cmVlX3NvcnQoYiwgJml0ZXIsIHN0YXJ0LCBvcmRlciwgZmFsc2UpOworCV9fYnRyZWVfc29ydChiLCAmaXRlciwgc3RhcnQsIG9yZGVyLCBmYWxzZSwgc3RhdGUpOwogCi0JRUJVR19PTihiLT53cml0dGVuICYmIG9sZHNpemUgPj0gMCAmJiBiY2hfY291bnRfZGF0YShiKSAhPSBvbGRzaXplKTsKKwlFQlVHX09OKG9sZHNpemUgPj0gMCAmJiBiY2hfY291bnRfZGF0YShiKSAhPSBvbGRzaXplKTsKIH0KK0VYUE9SVF9TWU1CT0woYmNoX2J0cmVlX3NvcnRfcGFydGlhbCk7CiAKLXZvaWQgYmNoX2J0cmVlX3NvcnRfYW5kX2ZpeF9leHRlbnRzKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIpCit2b2lkIGJjaF9idHJlZV9zb3J0X2FuZF9maXhfZXh0ZW50cyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwKKwkJCQkgICAgc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCisJCQkJICAgIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKnN0YXRlKQogewotCUJVR19PTighYi0+d3JpdHRlbik7Ci0JX19idHJlZV9zb3J0KGIsIGl0ZXIsIDAsIGItPnBhZ2Vfb3JkZXIsIHRydWUpOworCV9fYnRyZWVfc29ydChiLCBpdGVyLCAwLCBiLT5wYWdlX29yZGVyLCB0cnVlLCBzdGF0ZSk7CiB9CiAKLXZvaWQgYmNoX2J0cmVlX3NvcnRfaW50byhzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZSAqbmV3KQordm9pZCBiY2hfYnRyZWVfc29ydF9pbnRvKHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnRyZWVfa2V5cyAqbmV3LAorCQkJIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKnN0YXRlKQogewogCXVpbnQ2NF90IHN0YXJ0X3RpbWUgPSBsb2NhbF9jbG9jaygpOwogCiAJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKIAliY2hfYnRyZWVfaXRlcl9pbml0KGIsICZpdGVyLCBOVUxMKTsKIAotCWJ0cmVlX21lcmdlc29ydChiLCBuZXctPnNldHMtPmRhdGEsICZpdGVyLCBmYWxzZSwgdHJ1ZSk7CisJYnRyZWVfbWVyZ2Vzb3J0KGIsIG5ldy0+c2V0LT5kYXRhLCAmaXRlciwgZmFsc2UsIHRydWUpOwogCi0JYmNoX3RpbWVfc3RhdHNfdXBkYXRlKCZiLT5jLT5zb3J0X3RpbWUsIHN0YXJ0X3RpbWUpOworCWJjaF90aW1lX3N0YXRzX3VwZGF0ZSgmc3RhdGUtPnRpbWUsIHN0YXJ0X3RpbWUpOwogCi0JYmtleV9jb3B5X2tleSgmbmV3LT5rZXksICZiLT5rZXkpOwotCW5ldy0+c2V0cy0+c2l6ZSA9IDA7CisJbmV3LT5zZXQtPnNpemUgPSAwOyAvLyBYWFg6IHdoeT8KIH0KIAogI2RlZmluZSBTT1JUX0NSSVQJKDQwOTYgLyBzaXplb2YodWludDY0X3QpKQogCi12b2lkIGJjaF9idHJlZV9zb3J0X2xhenkoc3RydWN0IGJ0cmVlICpiKQordm9pZCBiY2hfYnRyZWVfc29ydF9sYXp5KHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnNldF9zb3J0X3N0YXRlICpzdGF0ZSkKIHsKIAl1bnNpZ25lZCBjcml0ID0gU09SVF9DUklUOwogCWludCBpOwpAQCAtMTEzNCw1MCArMTI4MiwzMiBAQAogCWlmICghYi0+bnNldHMpCiAJCWdvdG8gb3V0OwogCi0JLyogSWYgbm90IGEgbGVhZiBub2RlLCBhbHdheXMgc29ydCAqLwotCWlmIChiLT5sZXZlbCkgewotCQliY2hfYnRyZWVfc29ydChiKTsKLQkJcmV0dXJuOwotCX0KLQogCWZvciAoaSA9IGItPm5zZXRzIC0gMTsgaSA+PSAwOyAtLWkpIHsKLQkJY3JpdCAqPSBiLT5jLT5zb3J0X2NyaXRfZmFjdG9yOworCQljcml0ICo9IHN0YXRlLT5jcml0X2ZhY3RvcjsKIAotCQlpZiAoYi0+c2V0c1tpXS5kYXRhLT5rZXlzIDwgY3JpdCkgewotCQkJYmNoX2J0cmVlX3NvcnRfcGFydGlhbChiLCBpKTsKKwkJaWYgKGItPnNldFtpXS5kYXRhLT5rZXlzIDwgY3JpdCkgeworCQkJYmNoX2J0cmVlX3NvcnRfcGFydGlhbChiLCBpLCBzdGF0ZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAkvKiBTb3J0IGlmIHdlJ2Qgb3ZlcmZsb3cgKi8KIAlpZiAoYi0+bnNldHMgKyAxID09IE1BWF9CU0VUUykgewotCQliY2hfYnRyZWVfc29ydChiKTsKKwkJYmNoX2J0cmVlX3NvcnQoYiwgc3RhdGUpOwogCQlyZXR1cm47CiAJfQogCiBvdXQ6Ci0JYnNldF9idWlsZF93cml0dGVuX3RyZWUoYik7CisJYmNoX2JzZXRfYnVpbGRfd3JpdHRlbl90cmVlKGIpOwogfQorRVhQT1JUX1NZTUJPTChiY2hfYnRyZWVfc29ydF9sYXp5KTsKIAotLyogU3lzZnMgc3R1ZmYgKi8KLQotc3RydWN0IGJzZXRfc3RhdHMgewotCXN0cnVjdCBidHJlZV9vcCBvcDsKLQlzaXplX3Qgbm9kZXM7Ci0Jc2l6ZV90IHNldHNfd3JpdHRlbiwgc2V0c191bndyaXR0ZW47Ci0Jc2l6ZV90IGJ5dGVzX3dyaXR0ZW4sIGJ5dGVzX3Vud3JpdHRlbjsKLQlzaXplX3QgZmxvYXRzLCBmYWlsZWQ7Ci19OwotCi1zdGF0aWMgaW50IGJ0cmVlX2JzZXRfc3RhdHMoc3RydWN0IGJ0cmVlX29wICpvcCwgc3RydWN0IGJ0cmVlICpiKQordm9pZCBiY2hfYnRyZWVfa2V5c19zdGF0cyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgc3RydWN0IGJzZXRfc3RhdHMgKnN0YXRzKQogewotCXN0cnVjdCBic2V0X3N0YXRzICpzdGF0cyA9IGNvbnRhaW5lcl9vZihvcCwgc3RydWN0IGJzZXRfc3RhdHMsIG9wKTsKIAl1bnNpZ25lZCBpOwogCi0Jc3RhdHMtPm5vZGVzKys7Ci0KIAlmb3IgKGkgPSAwOyBpIDw9IGItPm5zZXRzOyBpKyspIHsKLQkJc3RydWN0IGJzZXRfdHJlZSAqdCA9ICZiLT5zZXRzW2ldOworCQlzdHJ1Y3QgYnNldF90cmVlICp0ID0gJmItPnNldFtpXTsKIAkJc2l6ZV90IGJ5dGVzID0gdC0+ZGF0YS0+a2V5cyAqIHNpemVvZih1aW50NjRfdCk7CiAJCXNpemVfdCBqOwogCkBAIC0xMTk1LDMyICsxMzI1LDQgQEAKIAkJCXN0YXRzLT5ieXRlc191bndyaXR0ZW4gKz0gYnl0ZXM7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gTUFQX0NPTlRJTlVFOwotfQotCi1pbnQgYmNoX2JzZXRfcHJpbnRfc3RhdHMoc3RydWN0IGNhY2hlX3NldCAqYywgY2hhciAqYnVmKQotewotCXN0cnVjdCBic2V0X3N0YXRzIHQ7Ci0JaW50IHJldDsKLQotCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHN0cnVjdCBic2V0X3N0YXRzKSk7Ci0JYmNoX2J0cmVlX29wX2luaXQoJnQub3AsIC0xKTsKLQotCXJldCA9IGJjaF9idHJlZV9tYXBfbm9kZXMoJnQub3AsIGMsICZaRVJPX0tFWSwgYnRyZWVfYnNldF9zdGF0cyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsCi0JCQkiYnRyZWUgbm9kZXM6CQklenVcbiIKLQkJCSJ3cml0dGVuIHNldHM6CQklenVcbiIKLQkJCSJ1bndyaXR0ZW4gc2V0czoJCSV6dVxuIgotCQkJIndyaXR0ZW4ga2V5IGJ5dGVzOgklenVcbiIKLQkJCSJ1bndyaXR0ZW4ga2V5IGJ5dGVzOgklenVcbiIKLQkJCSJmbG9hdHM6CQkJJXp1XG4iCi0JCQkiZmFpbGVkOgkJCSV6dVxuIiwKLQkJCXQubm9kZXMsCi0JCQl0LnNldHNfd3JpdHRlbiwgdC5zZXRzX3Vud3JpdHRlbiwKLQkJCXQuYnl0ZXNfd3JpdHRlbiwgdC5ieXRlc191bndyaXR0ZW4sCi0JCQl0LmZsb2F0cywgdC5mYWlsZWQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oCmluZGV4IDFkM2MyNGYuLjAwMzI2MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmgKQEAgLTEsNyArMSwxMSBAQAogI2lmbmRlZiBfQkNBQ0hFX0JTRVRfSAogI2RlZmluZSBfQkNBQ0hFX0JTRVRfSAogCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJ1dGlsLmgiIC8qIGZvciB0aW1lX3N0YXRzICovCiAKIC8qCiAgKiBCS0VZUzoKQEAgLTE0MiwyMCArMTQ2LDEzIEBACiAgKiBmaXJzdCBrZXkgaW4gdGhhdCByYW5nZSBvZiBieXRlcyBhZ2Fpbi4KICAqLwogCi0vKiBCdHJlZSBrZXkgY29tcGFyaXNvbi9pdGVyYXRpb24gKi8KK3N0cnVjdCBidHJlZV9rZXlzOworc3RydWN0IGJ0cmVlX2l0ZXI7CitzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQ7CitzdHJ1Y3QgYmtleV9mbG9hdDsKIAogI2RlZmluZSBNQVhfQlNFVFMJCTRVCiAKLXN0cnVjdCBidHJlZV9pdGVyIHsKLQlzaXplX3Qgc2l6ZSwgdXNlZDsKLSNpZmRlZiBDT05GSUdfQkNBQ0hFX0RFQlVHCi0Jc3RydWN0IGJ0cmVlICpiOwotI2VuZGlmCi0Jc3RydWN0IGJ0cmVlX2l0ZXJfc2V0IHsKLQkJc3RydWN0IGJrZXkgKmssICplbmQ7Ci0JfSBkYXRhW01BWF9CU0VUU107Ci19OwotCiBzdHJ1Y3QgYnNldF90cmVlIHsKIAkvKgogCSAqIFdlIGNvbnN0cnVjdCBhIGJpbmFyeSB0cmVlIGluIGFuIGFycmF5IGFzIGlmIHRoZSBhcnJheQpAQCAtMTY1LDE0ICsxNjIsMTQgQEAKIAkgKi8KIAogCS8qIHNpemUgb2YgdGhlIGJpbmFyeSB0cmVlIGFuZCBwcmV2IGFycmF5ICovCi0JdW5zaWduZWQJc2l6ZTsKKwl1bnNpZ25lZAkJc2l6ZTsKIAogCS8qIGZ1bmN0aW9uIG9mIHNpemUgLSBwcmVjYWxjdWxhdGVkIGZvciB0b19pbm9yZGVyKCkgKi8KLQl1bnNpZ25lZAlleHRyYTsKKwl1bnNpZ25lZAkJZXh0cmE7CiAKIAkvKiBjb3B5IG9mIHRoZSBsYXN0IGtleSBpbiB0aGUgc2V0ICovCi0Jc3RydWN0IGJrZXkJZW5kOwotCXN0cnVjdCBia2V5X2Zsb2F0ICp0cmVlOworCXN0cnVjdCBia2V5CQllbmQ7CisJc3RydWN0IGJrZXlfZmxvYXQJKnRyZWU7CiAKIAkvKgogCSAqIFRoZSBub2RlcyBpbiB0aGUgYnNldCB0cmVlIHBvaW50IHRvIHNwZWNpZmljIGtleXMgLSB0aGlzCkBAIC0xODIsMTIgKzE3OSwyMTkgQEAKIAkgKiB0byBrZWVwIGJrZXlfZmxvYXQgdG8gNCBieXRlcyBhbmQgcHJldiBpc24ndCB1c2VkIGluIHRoZSBmYXN0CiAJICogcGF0aC4KIAkgKi8KLQl1aW50OF90CQkqcHJldjsKKwl1aW50OF90CQkJKnByZXY7CiAKIAkvKiBUaGUgYWN0dWFsIGJ0cmVlIG5vZGUsIHdpdGggcG9pbnRlcnMgdG8gZWFjaCBzb3J0ZWQgc2V0ICovCi0Jc3RydWN0IGJzZXQJKmRhdGE7CisJc3RydWN0IGJzZXQJCSpkYXRhOwogfTsKIAorc3RydWN0IGJ0cmVlX2tleXNfb3BzIHsKKwlib29sCQkoKnNvcnRfY21wKShzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQsCisJCQkJICAgIHN0cnVjdCBidHJlZV9pdGVyX3NldCk7CisJc3RydWN0IGJrZXkJKigqc29ydF9maXh1cCkoc3RydWN0IGJ0cmVlX2l0ZXIgKiwgc3RydWN0IGJrZXkgKik7CisJYm9vbAkJKCppbnNlcnRfZml4dXApKHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBia2V5ICosCisJCQkJCXN0cnVjdCBidHJlZV9pdGVyICosIHN0cnVjdCBia2V5ICopOworCWJvb2wJCSgqa2V5X2ludmFsaWQpKHN0cnVjdCBidHJlZV9rZXlzICosCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBia2V5ICopOworCWJvb2wJCSgqa2V5X2JhZCkoc3RydWN0IGJ0cmVlX2tleXMgKiwgY29uc3Qgc3RydWN0IGJrZXkgKik7CisJYm9vbAkJKCprZXlfbWVyZ2UpKHN0cnVjdCBidHJlZV9rZXlzICosCisJCQkJICAgICBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKKwl2b2lkCQkoKmtleV90b190ZXh0KShjaGFyICosIHNpemVfdCwgY29uc3Qgc3RydWN0IGJrZXkgKik7CisJdm9pZAkJKCprZXlfZHVtcCkoc3RydWN0IGJ0cmVlX2tleXMgKiwgY29uc3Qgc3RydWN0IGJrZXkgKik7CisKKwkvKgorCSAqIE9ubHkgdXNlZCBmb3IgZGVjaWRpbmcgd2hldGhlciB0byB1c2UgU1RBUlRfS0VZKGspIG9yIGp1c3QgdGhlIGtleQorCSAqIGl0c2VsZiBpbiBhIGNvdXBsZSBwbGFjZXMKKwkgKi8KKwlib29sCQlpc19leHRlbnRzOworfTsKKworc3RydWN0IGJ0cmVlX2tleXMgeworCWNvbnN0IHN0cnVjdCBidHJlZV9rZXlzX29wcwkqb3BzOworCXVpbnQ4X3QJCQlwYWdlX29yZGVyOworCXVpbnQ4X3QJCQluc2V0czsKKwl1bnNpZ25lZAkJbGFzdF9zZXRfdW53cml0dGVuOjE7CisJYm9vbAkJCSpleHBlbnNpdmVfZGVidWdfY2hlY2tzOworCisJLyoKKwkgKiBTZXRzIG9mIHNvcnRlZCBrZXlzIC0gdGhlIHJlYWwgYnRyZWUgbm9kZSAtIHBsdXMgYSBiaW5hcnkgc2VhcmNoIHRyZWUKKwkgKgorCSAqIHNldFswXSBpcyBzcGVjaWFsOyBzZXRbMF0tPnRyZWUsIHNldFswXS0+cHJldiBhbmQgc2V0WzBdLT5kYXRhIHBvaW50CisJICogdG8gdGhlIG1lbW9yeSB3ZSBoYXZlIGFsbG9jYXRlZCBmb3IgdGhpcyBidHJlZSBub2RlLiBBZGRpdGlvbmFsbHksCisJICogc2V0WzBdLT5kYXRhIHBvaW50cyB0byB0aGUgZW50aXJlIGJ0cmVlIG5vZGUgYXMgaXQgZXhpc3RzIG9uIGRpc2suCisJICovCisJc3RydWN0IGJzZXRfdHJlZQlzZXRbTUFYX0JTRVRTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZXRfdHJlZSAqYnNldF90cmVlX2xhc3Qoc3RydWN0IGJ0cmVlX2tleXMgKmIpCit7CisJcmV0dXJuIGItPnNldCArIGItPm5zZXRzOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYnNldF93cml0dGVuKHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnNldF90cmVlICp0KQoreworCXJldHVybiB0IDw9IGItPnNldCArIGItPm5zZXRzIC0gYi0+bGFzdF9zZXRfdW53cml0dGVuOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmtleV93cml0dGVuKHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYmtleSAqaykKK3sKKwlyZXR1cm4gIWItPmxhc3Rfc2V0X3Vud3JpdHRlbiB8fCBrIDwgYi0+c2V0W2ItPm5zZXRzXS5kYXRhLT5zdGFydDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBic2V0X2J5dGVfb2Zmc2V0KHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnNldCAqaSkKK3sKKwlyZXR1cm4gKChzaXplX3QpIGkpIC0gKChzaXplX3QpIGItPnNldC0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgYnNldF9zZWN0b3Jfb2Zmc2V0KHN0cnVjdCBidHJlZV9rZXlzICpiLCBzdHJ1Y3QgYnNldCAqaSkKK3sKKwlyZXR1cm4gYnNldF9ieXRlX29mZnNldChiLCBpKSA+PiA5OworfQorCisjZGVmaW5lIF9fc2V0X2J5dGVzKGksIGspCShzaXplb2YoKihpKSkgKyAoaykgKiBzaXplb2YodWludDY0X3QpKQorI2RlZmluZSBzZXRfYnl0ZXMoaSkJCV9fc2V0X2J5dGVzKGksIGktPmtleXMpCisKKyNkZWZpbmUgX19zZXRfYmxvY2tzKGksIGssIGJsb2NrX2J5dGVzKQkJCQlcCisJRElWX1JPVU5EX1VQKF9fc2V0X2J5dGVzKGksIGspLCBibG9ja19ieXRlcykKKyNkZWZpbmUgc2V0X2Jsb2NrcyhpLCBibG9ja19ieXRlcykJCQkJXAorCV9fc2V0X2Jsb2NrcyhpLCAoaSktPmtleXMsIGJsb2NrX2J5dGVzKQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBiY2hfYnRyZWVfa2V5c191NjRzX3JlbWFpbmluZyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYikKK3sKKwlzdHJ1Y3QgYnNldF90cmVlICp0ID0gYnNldF90cmVlX2xhc3QoYik7CisKKwlCVUdfT04oKFBBR0VfU0laRSA8PCBiLT5wYWdlX29yZGVyKSA8CisJICAgICAgIChic2V0X2J5dGVfb2Zmc2V0KGIsIHQtPmRhdGEpICsgc2V0X2J5dGVzKHQtPmRhdGEpKSk7CisKKwlpZiAoIWItPmxhc3Rfc2V0X3Vud3JpdHRlbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKChQQUdFX1NJWkUgPDwgYi0+cGFnZV9vcmRlcikgLQorCQkoYnNldF9ieXRlX29mZnNldChiLCB0LT5kYXRhKSArIHNldF9ieXRlcyh0LT5kYXRhKSkpIC8KKwkJc2l6ZW9mKHU2NCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZXQgKmJzZXRfbmV4dF9zZXQoc3RydWN0IGJ0cmVlX2tleXMgKmIsCisJCQkJCSB1bnNpZ25lZCBibG9ja19ieXRlcykKK3sKKwlzdHJ1Y3QgYnNldCAqaSA9IGJzZXRfdHJlZV9sYXN0KGIpLT5kYXRhOworCisJcmV0dXJuICgodm9pZCAqKSBpKSArIHJvdW5kdXAoc2V0X2J5dGVzKGkpLCBibG9ja19ieXRlcyk7Cit9CisKK3ZvaWQgYmNoX2J0cmVlX2tleXNfZnJlZShzdHJ1Y3QgYnRyZWVfa2V5cyAqKTsKK2ludCBiY2hfYnRyZWVfa2V5c19hbGxvYyhzdHJ1Y3QgYnRyZWVfa2V5cyAqLCB1bnNpZ25lZCwgZ2ZwX3QpOwordm9pZCBiY2hfYnRyZWVfa2V5c19pbml0KHN0cnVjdCBidHJlZV9rZXlzICosIGNvbnN0IHN0cnVjdCBidHJlZV9rZXlzX29wcyAqLAorCQkJIGJvb2wgKik7CisKK3ZvaWQgYmNoX2JzZXRfaW5pdF9uZXh0KHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBic2V0ICosIHVpbnQ2NF90KTsKK3ZvaWQgYmNoX2JzZXRfYnVpbGRfd3JpdHRlbl90cmVlKHN0cnVjdCBidHJlZV9rZXlzICopOwordm9pZCBiY2hfYnNldF9maXhfaW52YWxpZGF0ZWRfa2V5KHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBia2V5ICopOworYm9vbCBiY2hfYmtleV90cnlfbWVyZ2Uoc3RydWN0IGJ0cmVlX2tleXMgKiwgc3RydWN0IGJrZXkgKiwgc3RydWN0IGJrZXkgKik7Cit2b2lkIGJjaF9ic2V0X2luc2VydChzdHJ1Y3QgYnRyZWVfa2V5cyAqLCBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKK3Vuc2lnbmVkIGJjaF9idHJlZV9pbnNlcnRfa2V5KHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBia2V5ICosCisJCQkgICAgICBzdHJ1Y3QgYmtleSAqKTsKKworZW51bSB7CisJQlRSRUVfSU5TRVJUX1NUQVRVU19OT19JTlNFUlQgPSAwLAorCUJUUkVFX0lOU0VSVF9TVEFUVVNfSU5TRVJULAorCUJUUkVFX0lOU0VSVF9TVEFUVVNfQkFDS19NRVJHRSwKKwlCVFJFRV9JTlNFUlRfU1RBVFVTX09WRVJXUk9URSwKKwlCVFJFRV9JTlNFUlRfU1RBVFVTX0ZST05UX01FUkdFLAorfTsKKworLyogQnRyZWUga2V5IGl0ZXJhdGlvbiAqLworCitzdHJ1Y3QgYnRyZWVfaXRlciB7CisJc2l6ZV90IHNpemUsIHVzZWQ7CisjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRworCXN0cnVjdCBidHJlZV9rZXlzICpiOworI2VuZGlmCisJc3RydWN0IGJ0cmVlX2l0ZXJfc2V0IHsKKwkJc3RydWN0IGJrZXkgKmssICplbmQ7CisJfSBkYXRhW01BWF9CU0VUU107Cit9OworCit0eXBlZGVmIGJvb2wgKCpwdHJfZmlsdGVyX2ZuKShzdHJ1Y3QgYnRyZWVfa2V5cyAqLCBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKKworc3RydWN0IGJrZXkgKmJjaF9idHJlZV9pdGVyX25leHQoc3RydWN0IGJ0cmVlX2l0ZXIgKik7CitzdHJ1Y3QgYmtleSAqYmNoX2J0cmVlX2l0ZXJfbmV4dF9maWx0ZXIoc3RydWN0IGJ0cmVlX2l0ZXIgKiwKKwkJCQkJc3RydWN0IGJ0cmVlX2tleXMgKiwgcHRyX2ZpbHRlcl9mbik7CisKK3ZvaWQgYmNoX2J0cmVlX2l0ZXJfcHVzaChzdHJ1Y3QgYnRyZWVfaXRlciAqLCBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKK3N0cnVjdCBia2V5ICpiY2hfYnRyZWVfaXRlcl9pbml0KHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBidHJlZV9pdGVyICosCisJCQkJIHN0cnVjdCBia2V5ICopOworCitzdHJ1Y3QgYmtleSAqX19iY2hfYnNldF9zZWFyY2goc3RydWN0IGJ0cmVlX2tleXMgKiwgc3RydWN0IGJzZXRfdHJlZSAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBia2V5ICopOworCisvKgorICogUmV0dXJucyB0aGUgZmlyc3Qga2V5IHRoYXQgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHNlYXJjaAorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBia2V5ICpiY2hfYnNldF9zZWFyY2goc3RydWN0IGJ0cmVlX2tleXMgKmIsCisJCQkJCSAgIHN0cnVjdCBic2V0X3RyZWUgKnQsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBia2V5ICpzZWFyY2gpCit7CisJcmV0dXJuIHNlYXJjaCA/IF9fYmNoX2JzZXRfc2VhcmNoKGIsIHQsIHNlYXJjaCkgOiB0LT5kYXRhLT5zdGFydDsKK30KKworI2RlZmluZSBmb3JfZWFjaF9rZXlfZmlsdGVyKGIsIGssIGl0ZXIsIGZpbHRlcikJCQkJXAorCWZvciAoYmNoX2J0cmVlX2l0ZXJfaW5pdCgoYiksIChpdGVyKSwgTlVMTCk7CQkJXAorCSAgICAgKChrKSA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKChpdGVyKSwgKGIpLCBmaWx0ZXIpKTspCisKKyNkZWZpbmUgZm9yX2VhY2hfa2V5KGIsIGssIGl0ZXIpCQkJCQlcCisJZm9yIChiY2hfYnRyZWVfaXRlcl9pbml0KChiKSwgKGl0ZXIpLCBOVUxMKTsJCQlcCisJICAgICAoKGspID0gYmNoX2J0cmVlX2l0ZXJfbmV4dChpdGVyKSk7KQorCisvKiBTb3J0aW5nICovCisKK3N0cnVjdCBic2V0X3NvcnRfc3RhdGUgeworCW1lbXBvb2xfdAkJKnBvb2w7CisKKwl1bnNpZ25lZAkJcGFnZV9vcmRlcjsKKwl1bnNpZ25lZAkJY3JpdF9mYWN0b3I7CisKKwlzdHJ1Y3QgdGltZV9zdGF0cwl0aW1lOworfTsKKwordm9pZCBiY2hfYnNldF9zb3J0X3N0YXRlX2ZyZWUoc3RydWN0IGJzZXRfc29ydF9zdGF0ZSAqKTsKK2ludCBiY2hfYnNldF9zb3J0X3N0YXRlX2luaXQoc3RydWN0IGJzZXRfc29ydF9zdGF0ZSAqLCB1bnNpZ25lZCk7Cit2b2lkIGJjaF9idHJlZV9zb3J0X2xhenkoc3RydWN0IGJ0cmVlX2tleXMgKiwgc3RydWN0IGJzZXRfc29ydF9zdGF0ZSAqKTsKK3ZvaWQgYmNoX2J0cmVlX3NvcnRfaW50byhzdHJ1Y3QgYnRyZWVfa2V5cyAqLCBzdHJ1Y3QgYnRyZWVfa2V5cyAqLAorCQkJIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKik7Cit2b2lkIGJjaF9idHJlZV9zb3J0X2FuZF9maXhfZXh0ZW50cyhzdHJ1Y3QgYnRyZWVfa2V5cyAqLCBzdHJ1Y3QgYnRyZWVfaXRlciAqLAorCQkJCSAgICBzdHJ1Y3QgYnNldF9zb3J0X3N0YXRlICopOwordm9pZCBiY2hfYnRyZWVfc29ydF9wYXJ0aWFsKHN0cnVjdCBidHJlZV9rZXlzICosIHVuc2lnbmVkLAorCQkJICAgIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2hfYnRyZWVfc29ydChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwKKwkJCQkgIHN0cnVjdCBic2V0X3NvcnRfc3RhdGUgKnN0YXRlKQoreworCWJjaF9idHJlZV9zb3J0X3BhcnRpYWwoYiwgMCwgc3RhdGUpOworfQorCitzdHJ1Y3QgYnNldF9zdGF0cyB7CisJc2l6ZV90IHNldHNfd3JpdHRlbiwgc2V0c191bndyaXR0ZW47CisJc2l6ZV90IGJ5dGVzX3dyaXR0ZW4sIGJ5dGVzX3Vud3JpdHRlbjsKKwlzaXplX3QgZmxvYXRzLCBmYWlsZWQ7Cit9OworCit2b2lkIGJjaF9idHJlZV9rZXlzX3N0YXRzKHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBic2V0X3N0YXRzICopOworCisvKiBCa2V5IHV0aWxpdHkgY29kZSAqLworCisjZGVmaW5lIGJzZXRfYmtleV9sYXN0KGkpCWJrZXlfaWR4KChzdHJ1Y3QgYmtleSAqKSAoaSktPmQsIChpKS0+a2V5cykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmtleSAqYnNldF9ia2V5X2lkeChzdHJ1Y3QgYnNldCAqaSwgdW5zaWduZWQgaWR4KQoreworCXJldHVybiBia2V5X2lkeChpLT5zdGFydCwgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJrZXlfaW5pdChzdHJ1Y3QgYmtleSAqaykKK3sKKwkqayA9IFpFUk9fS0VZOworfQorCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludDY0X3QgYmtleV9jbXAoY29uc3Qgc3RydWN0IGJrZXkgKmwsCiAJCQkJCWNvbnN0IHN0cnVjdCBia2V5ICpyKQogewpAQCAtMTk2LDYgKzQwMCw2MiBAQAogCQk6IChpbnQ2NF90KSBLRVlfT0ZGU0VUKGwpIC0gKGludDY0X3QpIEtFWV9PRkZTRVQocik7CiB9CiAKK3ZvaWQgYmNoX2JrZXlfY29weV9zaW5nbGVfcHRyKHN0cnVjdCBia2V5ICosIGNvbnN0IHN0cnVjdCBia2V5ICosCisJCQkgICAgICB1bnNpZ25lZCk7Citib29sIF9fYmNoX2N1dF9mcm9udChjb25zdCBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKK2Jvb2wgX19iY2hfY3V0X2JhY2soY29uc3Qgc3RydWN0IGJrZXkgKiwgc3RydWN0IGJrZXkgKik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBiY2hfY3V0X2Zyb250KGNvbnN0IHN0cnVjdCBia2V5ICp3aGVyZSwgc3RydWN0IGJrZXkgKmspCit7CisJQlVHX09OKGJrZXlfY21wKHdoZXJlLCBrKSA+IDApOworCXJldHVybiBfX2JjaF9jdXRfZnJvbnQod2hlcmUsIGspOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmNoX2N1dF9iYWNrKGNvbnN0IHN0cnVjdCBia2V5ICp3aGVyZSwgc3RydWN0IGJrZXkgKmspCit7CisJQlVHX09OKGJrZXlfY21wKHdoZXJlLCAmU1RBUlRfS0VZKGspKSA8IDApOworCXJldHVybiBfX2JjaF9jdXRfYmFjayh3aGVyZSwgayk7Cit9CisKKyNkZWZpbmUgUFJFQ0VESU5HX0tFWShfaykJCQkJCVwKKyh7CQkJCQkJCQlcCisJc3RydWN0IGJrZXkgKl9yZXQgPSBOVUxMOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAoS0VZX0lOT0RFKF9rKSB8fCBLRVlfT0ZGU0VUKF9rKSkgewkJCVwKKwkJX3JldCA9ICZLRVkoS0VZX0lOT0RFKF9rKSwgS0VZX09GRlNFVChfayksIDApOwlcCisJCQkJCQkJCVwKKwkJaWYgKCFfcmV0LT5sb3cpCQkJCQlcCisJCQlfcmV0LT5oaWdoLS07CQkJCVwKKwkJX3JldC0+bG93LS07CQkJCQlcCisJfQkJCQkJCQlcCisJCQkJCQkJCVwKKwlfcmV0OwkJCQkJCQlcCit9KQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmNoX3B0cl9pbnZhbGlkKHN0cnVjdCBidHJlZV9rZXlzICpiLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKK3sKKwlyZXR1cm4gYi0+b3BzLT5rZXlfaW52YWxpZChiLCBrKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJjaF9wdHJfYmFkKHN0cnVjdCBidHJlZV9rZXlzICpiLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKK3sKKwlyZXR1cm4gYi0+b3BzLT5rZXlfYmFkKGIsIGspOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNoX2JrZXlfdG9fdGV4dChzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgY2hhciAqYnVmLAorCQkJCSAgICBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RydWN0IGJrZXkgKmspCit7CisJcmV0dXJuIGItPm9wcy0+a2V5X3RvX3RleHQoYnVmLCBzaXplLCBrKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJjaF9ia2V5X2VxdWFsX2hlYWRlcihjb25zdCBzdHJ1Y3QgYmtleSAqbCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBia2V5ICpyKQoreworCXJldHVybiAoS0VZX0RJUlRZKGwpID09IEtFWV9ESVJUWShyKSAmJgorCQlLRVlfUFRSUyhsKSA9PSBLRVlfUFRSUyhyKSAmJgorCQlLRVlfQ1NVTShsKSA9PSBLRVlfQ1NVTShsKSk7Cit9CisKIC8qIEtleWxpc3RzICovCiAKIHN0cnVjdCBrZXlsaXN0IHsKQEAgLTI1NywxMzYgKzUxNyw0NCBAQAogCiBzdHJ1Y3QgYmtleSAqYmNoX2tleWxpc3RfcG9wKHN0cnVjdCBrZXlsaXN0ICopOwogdm9pZCBiY2hfa2V5bGlzdF9wb3BfZnJvbnQoc3RydWN0IGtleWxpc3QgKik7Ci1pbnQgYmNoX2tleWxpc3RfcmVhbGxvYyhzdHJ1Y3Qga2V5bGlzdCAqLCBpbnQsIHN0cnVjdCBjYWNoZV9zZXQgKik7CitpbnQgX19iY2hfa2V5bGlzdF9yZWFsbG9jKHN0cnVjdCBrZXlsaXN0ICosIHVuc2lnbmVkKTsKIAotdm9pZCBiY2hfYmtleV9jb3B5X3NpbmdsZV9wdHIoc3RydWN0IGJrZXkgKiwgY29uc3Qgc3RydWN0IGJrZXkgKiwKLQkJCSAgICAgIHVuc2lnbmVkKTsKLWJvb2wgX19iY2hfY3V0X2Zyb250KGNvbnN0IHN0cnVjdCBia2V5ICosIHN0cnVjdCBia2V5ICopOwotYm9vbCBfX2JjaF9jdXRfYmFjayhjb25zdCBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKKy8qIERlYnVnIHN0dWZmICovCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBiY2hfY3V0X2Zyb250KGNvbnN0IHN0cnVjdCBia2V5ICp3aGVyZSwgc3RydWN0IGJrZXkgKmspCisjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRworCitpbnQgX19iY2hfY291bnRfZGF0YShzdHJ1Y3QgYnRyZWVfa2V5cyAqKTsKK3ZvaWQgX19iY2hfY2hlY2tfa2V5cyhzdHJ1Y3QgYnRyZWVfa2V5cyAqLCBjb25zdCBjaGFyICosIC4uLik7Cit2b2lkIGJjaF9kdW1wX2JzZXQoc3RydWN0IGJ0cmVlX2tleXMgKiwgc3RydWN0IGJzZXQgKiwgdW5zaWduZWQpOwordm9pZCBiY2hfZHVtcF9idWNrZXQoc3RydWN0IGJ0cmVlX2tleXMgKik7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYmNoX2NvdW50X2RhdGEoc3RydWN0IGJ0cmVlX2tleXMgKmIpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgX19iY2hfY2hlY2tfa2V5cyhzdHJ1Y3QgYnRyZWVfa2V5cyAqYiwgY29uc3QgY2hhciAqZm10LCAuLi4pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNoX2R1bXBfYnVja2V0KHN0cnVjdCBidHJlZV9rZXlzICpiKSB7fQordm9pZCBiY2hfZHVtcF9ic2V0KHN0cnVjdCBidHJlZV9rZXlzICosIHN0cnVjdCBic2V0ICosIHVuc2lnbmVkKTsKKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBidHJlZV9rZXlzX2V4cGVuc2l2ZV9jaGVja3Moc3RydWN0IGJ0cmVlX2tleXMgKmIpCiB7Ci0JQlVHX09OKGJrZXlfY21wKHdoZXJlLCBrKSA+IDApOwotCXJldHVybiBfX2JjaF9jdXRfZnJvbnQod2hlcmUsIGspOworI2lmZGVmIENPTkZJR19CQ0FDSEVfREVCVUcKKwlyZXR1cm4gKmItPmV4cGVuc2l2ZV9kZWJ1Z19jaGVja3M7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYmNoX2N1dF9iYWNrKGNvbnN0IHN0cnVjdCBia2V5ICp3aGVyZSwgc3RydWN0IGJrZXkgKmspCitzdGF0aWMgaW5saW5lIGludCBiY2hfY291bnRfZGF0YShzdHJ1Y3QgYnRyZWVfa2V5cyAqYikKIHsKLQlCVUdfT04oYmtleV9jbXAod2hlcmUsICZTVEFSVF9LRVkoaykpIDwgMCk7Ci0JcmV0dXJuIF9fYmNoX2N1dF9iYWNrKHdoZXJlLCBrKTsKKwlyZXR1cm4gYnRyZWVfa2V5c19leHBlbnNpdmVfY2hlY2tzKGIpID8gX19iY2hfY291bnRfZGF0YShiKSA6IC0xOwogfQogCi1jb25zdCBjaGFyICpiY2hfcHRyX3N0YXR1cyhzdHJ1Y3QgY2FjaGVfc2V0ICosIGNvbnN0IHN0cnVjdCBia2V5ICopOwotYm9vbCBiY2hfYnRyZWVfcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqLCBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKLWJvb2wgYmNoX2V4dGVudF9wdHJfaW52YWxpZChzdHJ1Y3QgY2FjaGVfc2V0ICosIGNvbnN0IHN0cnVjdCBia2V5ICopOwotCi1ib29sIGJjaF9wdHJfYmFkKHN0cnVjdCBidHJlZSAqLCBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKLQotc3RhdGljIGlubGluZSB1aW50OF90IGdlbl9hZnRlcih1aW50OF90IGEsIHVpbnQ4X3QgYikKLXsKLQl1aW50OF90IHIgPSBhIC0gYjsKLQlyZXR1cm4gciA+IDEyOFUgPyAwIDogcjsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90IHB0cl9zdGFsZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBjb25zdCBzdHJ1Y3QgYmtleSAqaywKLQkJCQl1bnNpZ25lZCBpKQotewotCXJldHVybiBnZW5fYWZ0ZXIoUFRSX0JVQ0tFVChjLCBrLCBpKS0+Z2VuLCBQVFJfR0VOKGssIGkpKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHB0cl9hdmFpbGFibGUoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmssCi0JCQkJIHVuc2lnbmVkIGkpCi17Ci0JcmV0dXJuIChQVFJfREVWKGssIGkpIDwgTUFYX0NBQ0hFU19QRVJfU0VUKSAmJiBQVFJfQ0FDSEUoYywgaywgaSk7Ci19Ci0KLQotdHlwZWRlZiBib29sICgqcHRyX2ZpbHRlcl9mbikoc3RydWN0IGJ0cmVlICosIGNvbnN0IHN0cnVjdCBia2V5ICopOwotCi1zdHJ1Y3QgYmtleSAqYmNoX2J0cmVlX2l0ZXJfbmV4dChzdHJ1Y3QgYnRyZWVfaXRlciAqKTsKLXN0cnVjdCBia2V5ICpiY2hfYnRyZWVfaXRlcl9uZXh0X2ZpbHRlcihzdHJ1Y3QgYnRyZWVfaXRlciAqLAotCQkJCQlzdHJ1Y3QgYnRyZWUgKiwgcHRyX2ZpbHRlcl9mbik7Ci0KLXZvaWQgYmNoX2J0cmVlX2l0ZXJfcHVzaChzdHJ1Y3QgYnRyZWVfaXRlciAqLCBzdHJ1Y3QgYmtleSAqLCBzdHJ1Y3QgYmtleSAqKTsKLXN0cnVjdCBia2V5ICpfX2JjaF9idHJlZV9pdGVyX2luaXQoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBidHJlZV9pdGVyICosCi0JCQkJICAgc3RydWN0IGJrZXkgKiwgc3RydWN0IGJzZXRfdHJlZSAqKTsKLQotLyogMzIgYml0cyB0b3RhbDogKi8KLSNkZWZpbmUgQktFWV9NSURfQklUUwkJMwotI2RlZmluZSBCS0VZX0VYUE9ORU5UX0JJVFMJNwotI2RlZmluZSBCS0VZX01BTlRJU1NBX0JJVFMJMjIKLSNkZWZpbmUgQktFWV9NQU5USVNTQV9NQVNLCSgoMSA8PCBCS0VZX01BTlRJU1NBX0JJVFMpIC0gMSkKLQotc3RydWN0IGJrZXlfZmxvYXQgewotCXVuc2lnbmVkCWV4cG9uZW50OkJLRVlfRVhQT05FTlRfQklUUzsKLQl1bnNpZ25lZAltOkJLRVlfTUlEX0JJVFM7Ci0JdW5zaWduZWQJbWFudGlzc2E6QktFWV9NQU5USVNTQV9CSVRTOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIEJTRVRfQ0FDSEVMSU5FIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIG1hdGNoIHRoZSBoYXJkd2FyZSBjYWNoZWxpbmUgc2l6ZSAtCi0gKiBpdCB1c2VkIHRvIGJlIDY0LCBidXQgSSByZWFsaXplZCB0aGUgbG9va3VwIGNvZGUgd291bGQgdG91Y2ggc2xpZ2h0bHkgbGVzcwotICogbWVtb3J5IGlmIGl0IHdhcyAxMjguCi0gKgotICogSXQgZGVmaW5pdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKGluIHN0cnVjdCBic2V0KSBwZXIgc3RydWN0IGJrZXlfZmxvYXQgaW4KLSAqIHRoZSBhdXhpbGlhciBzZWFyY2ggdHJlZSAtIHdoZW4gd2UncmUgZG9uZSBzZWFyY2hpbmcgdGhlIGJzZXRfZmxvYXQgdHJlZSB3ZQotICogaGF2ZSB0aGlzIG1hbnkgYnl0ZXMgbGVmdCB0aGF0IHdlIGRvIGEgbGluZWFyIHNlYXJjaCBvdmVyLgotICoKLSAqIFNpbmNlIChhZnRlciBsZXZlbCA1KSBldmVyeSBsZXZlbCBvZiB0aGUgYnNldF90cmVlIGlzIG9uIGEgbmV3IGNhY2hlbGluZSwKLSAqIHdlJ3JlIHRvdWNoaW5nIG9uZSBmZXdlciBjYWNoZWxpbmUgaW4gdGhlIGJzZXQgdHJlZSBpbiBleGNoYW5nZSBmb3Igb25lIG1vcmUKLSAqIGNhY2hlbGluZSBpbiB0aGUgbGluZWFyIHNlYXJjaCAtIGJ1dCB0aGUgbGluZWFyIHNlYXJjaCBtaWdodCBzdG9wIGJlZm9yZSBpdAotICogZ2V0cyB0byB0aGUgc2Vjb25kIGNhY2hlbGluZS4KLSAqLwotCi0jZGVmaW5lIEJTRVRfQ0FDSEVMSU5FCQkxMjgKLSNkZWZpbmUgYnNldF90cmVlX3NwYWNlKGIpCShidHJlZV9kYXRhX3NwYWNlKGIpIC8gQlNFVF9DQUNIRUxJTkUpCi0KLSNkZWZpbmUgYnNldF90cmVlX2J5dGVzKGIpCShic2V0X3RyZWVfc3BhY2UoYikgKiBzaXplb2Yoc3RydWN0IGJrZXlfZmxvYXQpKQotI2RlZmluZSBic2V0X3ByZXZfYnl0ZXMoYikJKGJzZXRfdHJlZV9zcGFjZShiKSAqIHNpemVvZih1aW50OF90KSkKLQotdm9pZCBiY2hfYnNldF9pbml0X25leHQoc3RydWN0IGJ0cmVlICopOwotCi12b2lkIGJjaF9ic2V0X2ZpeF9pbnZhbGlkYXRlZF9rZXkoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBia2V5ICopOwotdm9pZCBiY2hfYnNldF9maXhfbG9va3VwX3RhYmxlKHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgYmtleSAqKTsKLQotc3RydWN0IGJrZXkgKl9fYmNoX2JzZXRfc2VhcmNoKHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgYnNldF90cmVlICosCi0JCQkgICBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKLQotLyoKLSAqIFJldHVybnMgdGhlIGZpcnN0IGtleSB0aGF0IGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBzZWFyY2gKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmtleSAqYmNoX2JzZXRfc2VhcmNoKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCwKLQkJCQkJICAgY29uc3Qgc3RydWN0IGJrZXkgKnNlYXJjaCkKLXsKLQlyZXR1cm4gc2VhcmNoID8gX19iY2hfYnNldF9zZWFyY2goYiwgdCwgc2VhcmNoKSA6IHQtPmRhdGEtPnN0YXJ0OwotfQotCi0jZGVmaW5lIFBSRUNFRElOR19LRVkoX2spCQkJCQlcCi0oewkJCQkJCQkJXAotCXN0cnVjdCBia2V5ICpfcmV0ID0gTlVMTDsJCQkJXAotCQkJCQkJCQlcCi0JaWYgKEtFWV9JTk9ERShfaykgfHwgS0VZX09GRlNFVChfaykpIHsJCQlcCi0JCV9yZXQgPSAmS0VZKEtFWV9JTk9ERShfayksIEtFWV9PRkZTRVQoX2spLCAwKTsJXAotCQkJCQkJCQlcCi0JCWlmICghX3JldC0+bG93KQkJCQkJXAotCQkJX3JldC0+aGlnaC0tOwkJCQlcCi0JCV9yZXQtPmxvdy0tOwkJCQkJXAotCX0JCQkJCQkJXAotCQkJCQkJCQlcCi0JX3JldDsJCQkJCQkJXAotfSkKLQotYm9vbCBiY2hfYmtleV90cnlfbWVyZ2Uoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBia2V5ICosIHN0cnVjdCBia2V5ICopOwotdm9pZCBiY2hfYnRyZWVfc29ydF9sYXp5KHN0cnVjdCBidHJlZSAqKTsKLXZvaWQgYmNoX2J0cmVlX3NvcnRfaW50byhzdHJ1Y3QgYnRyZWUgKiwgc3RydWN0IGJ0cmVlICopOwotdm9pZCBiY2hfYnRyZWVfc29ydF9hbmRfZml4X2V4dGVudHMoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBidHJlZV9pdGVyICopOwotdm9pZCBiY2hfYnRyZWVfc29ydF9wYXJ0aWFsKHN0cnVjdCBidHJlZSAqLCB1bnNpZ25lZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiY2hfYnRyZWVfc29ydChzdHJ1Y3QgYnRyZWUgKmIpCi17Ci0JYmNoX2J0cmVlX3NvcnRfcGFydGlhbChiLCAwKTsKLX0KLQotaW50IGJjaF9ic2V0X3ByaW50X3N0YXRzKHN0cnVjdCBjYWNoZV9zZXQgKiwgY2hhciAqKTsKKyNkZWZpbmUgYmNoX2NoZWNrX2tleXMoYiwgLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGJ0cmVlX2tleXNfZXhwZW5zaXZlX2NoZWNrcyhiKSkJCQkJXAorCQlfX2JjaF9jaGVja19rZXlzKGIsIF9fVkFfQVJHU19fKTsJCQlcCit9IHdoaWxlICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jCmluZGV4IDMxYmI1M2YuLjk4Y2MwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgImJjYWNoZS5oIgogI2luY2x1ZGUgImJ0cmVlLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ3cml0ZWJhY2suaCIKKyNpbmNsdWRlICJleHRlbnRzLmgiCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC04OSwxMyArODksNiBAQAogICogVGVzdCBtb2R1bGUgbG9hZC91bmxvYWQKICAqLwogCi1lbnVtIHsKLQlCVFJFRV9JTlNFUlRfU1RBVFVTX0lOU0VSVCwKLQlCVFJFRV9JTlNFUlRfU1RBVFVTX0JBQ0tfTUVSR0UsCi0JQlRSRUVfSU5TRVJUX1NUQVRVU19PVkVSV1JPVEUsCi0JQlRSRUVfSU5TRVJUX1NUQVRVU19GUk9OVF9NRVJHRSwKLX07Ci0KICNkZWZpbmUgTUFYX05FRURfR0MJCTY0CiAjZGVmaW5lIE1BWF9TQVZFX1BSSU8JCTcyCiAKQEAgLTEwNiwxNCArOTksNiBAQAogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJ0cmVlX2lvX3dxOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX3NwbGl0KHN0cnVjdCBidHJlZSAqYikKLXsKLQlzdHJ1Y3QgYnNldCAqaSA9IHdyaXRlX2Jsb2NrKGIpOwotCXJldHVybiBiLT53cml0dGVuID49IGJ0cmVlX2Jsb2NrcyhiKSB8fAotCQkoYi0+d3JpdHRlbiArIF9fc2V0X2Jsb2NrcyhpLCBpLT5rZXlzICsgMTUsIGItPmMpCi0JCSA+IGJ0cmVlX2Jsb2NrcyhiKSk7Ci19Ci0KICNkZWZpbmUgaW5zZXJ0X2xvY2socywgYikJKChiKS0+bGV2ZWwgPD0gKHMpLT5sb2NrKQogCiAvKgpAQCAtMTY3LDYgKzE1Miw4IEBACiAJCQlfciA9IGJjaF9idHJlZV8gIyMgZm4oX2IsIG9wLCAjI19fVkFfQVJHU19fKTsJXAogCQl9CQkJCQkJCVwKIAkJcndfdW5sb2NrKF93LCBfYik7CQkJCQlcCisJCWlmIChfciA9PSAtRUlOVFIpCQkJCQlcCisJCQlzY2hlZHVsZSgpOwkJCQkJXAogCQliY2hfY2FubmliYWxpemVfdW5sb2NrKGMpOwkJCQlcCiAJCWlmIChfciA9PSAtRU5PU1BDKSB7CQkJCQlcCiAJCQl3YWl0X2V2ZW50KChjKS0+dHJ5X3dhaXQsCQkJXApAQCAtMTc1LDkgKzE2MiwxNSBAQAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlIChfciA9PSAtRUlOVFIpOwkJCQkJCVwKIAkJCQkJCQkJCVwKKwlmaW5pc2hfd2FpdCgmKGMpLT5idWNrZXRfd2FpdCwgJihvcCktPndhaXQpOwkJCVwKIAlfcjsJCQkJCQkJCVwKIH0pCiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZXQgKndyaXRlX2Jsb2NrKHN0cnVjdCBidHJlZSAqYikKK3sKKwlyZXR1cm4gKCh2b2lkICopIGJ0cmVlX2JzZXRfZmlyc3QoYikpICsgYi0+d3JpdHRlbiAqIGJsb2NrX2J5dGVzKGItPmMpOworfQorCiAvKiBCdHJlZSBrZXkgbWFuaXB1bGF0aW9uICovCiAKIHZvaWQgYmtleV9wdXQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmspCkBAIC0xOTQsMTYgKzE4NywxNiBAQAogc3RhdGljIHVpbnQ2NF90IGJ0cmVlX2NzdW1fc2V0KHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXQgKmkpCiB7CiAJdWludDY0X3QgY3JjID0gYi0+a2V5LnB0clswXTsKLQl2b2lkICpkYXRhID0gKHZvaWQgKikgaSArIDgsICplbmQgPSBlbmQoaSk7CisJdm9pZCAqZGF0YSA9ICh2b2lkICopIGkgKyA4LCAqZW5kID0gYnNldF9ia2V5X2xhc3QoaSk7CiAKIAljcmMgPSBiY2hfY3JjNjRfdXBkYXRlKGNyYywgZGF0YSwgZW5kIC0gZGF0YSk7CiAJcmV0dXJuIGNyYyBeIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKIH0KIAotc3RhdGljIHZvaWQgYmNoX2J0cmVlX25vZGVfcmVhZF9kb25lKHN0cnVjdCBidHJlZSAqYikKK3ZvaWQgYmNoX2J0cmVlX25vZGVfcmVhZF9kb25lKHN0cnVjdCBidHJlZSAqYikKIHsKIAljb25zdCBjaGFyICplcnIgPSAiYmFkIGJ0cmVlIGhlYWRlciI7Ci0Jc3RydWN0IGJzZXQgKmkgPSBiLT5zZXRzWzBdLmRhdGE7CisJc3RydWN0IGJzZXQgKmkgPSBidHJlZV9ic2V0X2ZpcnN0KGIpOwogCXN0cnVjdCBidHJlZV9pdGVyICppdGVyOwogCiAJaXRlciA9IG1lbXBvb2xfYWxsb2MoYi0+Yy0+ZmlsbF9pdGVyLCBHRlBfTk9XQUlUKTsKQEAgLTIxMSwyMSArMjA0LDIyIEBACiAJaXRlci0+dXNlZCA9IDA7CiAKICNpZmRlZiBDT05GSUdfQkNBQ0hFX0RFQlVHCi0JaXRlci0+YiA9IGI7CisJaXRlci0+YiA9ICZiLT5rZXlzOwogI2VuZGlmCiAKIAlpZiAoIWktPnNlcSkKIAkJZ290byBlcnI7CiAKIAlmb3IgKDsKLQkgICAgIGItPndyaXR0ZW4gPCBidHJlZV9ibG9ja3MoYikgJiYgaS0+c2VxID09IGItPnNldHNbMF0uZGF0YS0+c2VxOworCSAgICAgYi0+d3JpdHRlbiA8IGJ0cmVlX2Jsb2NrcyhiKSAmJiBpLT5zZXEgPT0gYi0+a2V5cy5zZXRbMF0uZGF0YS0+c2VxOwogCSAgICAgaSA9IHdyaXRlX2Jsb2NrKGIpKSB7CiAJCWVyciA9ICJ1bnN1cHBvcnRlZCBic2V0IHZlcnNpb24iOwogCQlpZiAoaS0+dmVyc2lvbiA+IEJDQUNIRV9CU0VUX1ZFUlNJT04pCiAJCQlnb3RvIGVycjsKIAogCQllcnIgPSAiYmFkIGJ0cmVlIGhlYWRlciI7Ci0JCWlmIChiLT53cml0dGVuICsgc2V0X2Jsb2NrcyhpLCBiLT5jKSA+IGJ0cmVlX2Jsb2NrcyhiKSkKKwkJaWYgKGItPndyaXR0ZW4gKyBzZXRfYmxvY2tzKGksIGJsb2NrX2J5dGVzKGItPmMpKSA+CisJCSAgICBidHJlZV9ibG9ja3MoYikpCiAJCQlnb3RvIGVycjsKIAogCQllcnIgPSAiYmFkIG1hZ2ljIjsKQEAgLTI0NSwzOSArMjM5LDQwIEBACiAJCX0KIAogCQllcnIgPSAiZW1wdHkgc2V0IjsKLQkJaWYgKGkgIT0gYi0+c2V0c1swXS5kYXRhICYmICFpLT5rZXlzKQorCQlpZiAoaSAhPSBiLT5rZXlzLnNldFswXS5kYXRhICYmICFpLT5rZXlzKQogCQkJZ290byBlcnI7CiAKLQkJYmNoX2J0cmVlX2l0ZXJfcHVzaChpdGVyLCBpLT5zdGFydCwgZW5kKGkpKTsKKwkJYmNoX2J0cmVlX2l0ZXJfcHVzaChpdGVyLCBpLT5zdGFydCwgYnNldF9ia2V5X2xhc3QoaSkpOwogCi0JCWItPndyaXR0ZW4gKz0gc2V0X2Jsb2NrcyhpLCBiLT5jKTsKKwkJYi0+d3JpdHRlbiArPSBzZXRfYmxvY2tzKGksIGJsb2NrX2J5dGVzKGItPmMpKTsKIAl9CiAKIAllcnIgPSAiY29ycnVwdGVkIGJ0cmVlIjsKIAlmb3IgKGkgPSB3cml0ZV9ibG9jayhiKTsKLQkgICAgIGluZGV4KGksIGIpIDwgYnRyZWVfYmxvY2tzKGIpOworCSAgICAgYnNldF9zZWN0b3Jfb2Zmc2V0KCZiLT5rZXlzLCBpKSA8IEtFWV9TSVpFKCZiLT5rZXkpOwogCSAgICAgaSA9ICgodm9pZCAqKSBpKSArIGJsb2NrX2J5dGVzKGItPmMpKQotCQlpZiAoaS0+c2VxID09IGItPnNldHNbMF0uZGF0YS0+c2VxKQorCQlpZiAoaS0+c2VxID09IGItPmtleXMuc2V0WzBdLmRhdGEtPnNlcSkKIAkJCWdvdG8gZXJyOwogCi0JYmNoX2J0cmVlX3NvcnRfYW5kX2ZpeF9leHRlbnRzKGIsIGl0ZXIpOworCWJjaF9idHJlZV9zb3J0X2FuZF9maXhfZXh0ZW50cygmYi0+a2V5cywgaXRlciwgJmItPmMtPnNvcnQpOwogCi0JaSA9IGItPnNldHNbMF0uZGF0YTsKKwlpID0gYi0+a2V5cy5zZXRbMF0uZGF0YTsKIAllcnIgPSAic2hvcnQgYnRyZWUga2V5IjsKLQlpZiAoYi0+c2V0c1swXS5zaXplICYmCi0JICAgIGJrZXlfY21wKCZiLT5rZXksICZiLT5zZXRzWzBdLmVuZCkgPCAwKQorCWlmIChiLT5rZXlzLnNldFswXS5zaXplICYmCisJICAgIGJrZXlfY21wKCZiLT5rZXksICZiLT5rZXlzLnNldFswXS5lbmQpIDwgMCkKIAkJZ290byBlcnI7CiAKIAlpZiAoYi0+d3JpdHRlbiA8IGJ0cmVlX2Jsb2NrcyhiKSkKLQkJYmNoX2JzZXRfaW5pdF9uZXh0KGIpOworCQliY2hfYnNldF9pbml0X25leHQoJmItPmtleXMsIHdyaXRlX2Jsb2NrKGIpLAorCQkJCSAgIGJzZXRfbWFnaWMoJmItPmMtPnNiKSk7CiBvdXQ6CiAJbWVtcG9vbF9mcmVlKGl0ZXIsIGItPmMtPmZpbGxfaXRlcik7CiAJcmV0dXJuOwogZXJyOgogCXNldF9idHJlZV9ub2RlX2lvX2Vycm9yKGIpOwotCWJjaF9jYWNoZV9zZXRfZXJyb3IoYi0+YywgIiVzIGF0IGJ1Y2tldCAlenUsIGJsb2NrICV6dSwgJXUga2V5cyIsCisJYmNoX2NhY2hlX3NldF9lcnJvcihiLT5jLCAiJXMgYXQgYnVja2V0ICV6dSwgYmxvY2sgJXUsICV1IGtleXMiLAogCQkJICAgIGVyciwgUFRSX0JVQ0tFVF9OUihiLT5jLCAmYi0+a2V5LCAwKSwKLQkJCSAgICBpbmRleChpLCBiKSwgaS0+a2V5cyk7CisJCQkgICAgYnNldF9ibG9ja19vZmZzZXQoYiwgaSksIGktPmtleXMpOwogCWdvdG8gb3V0OwogfQogCkBAIC0yODcsNyArMjgyLDcgQEAKIAljbG9zdXJlX3B1dChjbCk7CiB9CiAKLXZvaWQgYmNoX2J0cmVlX25vZGVfcmVhZChzdHJ1Y3QgYnRyZWUgKmIpCitzdGF0aWMgdm9pZCBiY2hfYnRyZWVfbm9kZV9yZWFkKHN0cnVjdCBidHJlZSAqYikKIHsKIAl1aW50NjRfdCBzdGFydF90aW1lID0gbG9jYWxfY2xvY2soKTsKIAlzdHJ1Y3QgY2xvc3VyZSBjbDsKQEAgLTI5OSwxMSArMjk0LDExIEBACiAKIAliaW8gPSBiY2hfYmJpb19hbGxvYyhiLT5jKTsKIAliaW8tPmJpX3J3CT0gUkVRX01FVEF8UkVBRF9TWU5DOwotCWJpby0+Ymlfc2l6ZQk9IEtFWV9TSVpFKCZiLT5rZXkpIDw8IDk7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBLRVlfU0laRSgmYi0+a2V5KSA8PCA5OwogCWJpby0+YmlfZW5kX2lvCT0gYnRyZWVfbm9kZV9yZWFkX2VuZGlvOwogCWJpby0+YmlfcHJpdmF0ZQk9ICZjbDsKIAotCWJjaF9iaW9fbWFwKGJpbywgYi0+c2V0c1swXS5kYXRhKTsKKwliY2hfYmlvX21hcChiaW8sIGItPmtleXMuc2V0WzBdLmRhdGEpOwogCiAJYmNoX3N1Ym1pdF9iYmlvKGJpbywgYi0+YywgJmItPmtleSwgMCk7CiAJY2xvc3VyZV9zeW5jKCZjbCk7CkBAIC0zNDAsOSArMzM1LDE2IEBACiAJdy0+am91cm5hbAk9IE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGJ0cmVlX25vZGVfd3JpdGVfdW5sb2NrKHN0cnVjdCBjbG9zdXJlICpjbCkKK3sKKwlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBidHJlZSwgaW8pOworCisJdXAoJmItPmlvX211dGV4KTsKK30KKwogc3RhdGljIHZvaWQgX19idHJlZV9ub2RlX3dyaXRlX2RvbmUoc3RydWN0IGNsb3N1cmUgKmNsKQogewotCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IGJ0cmVlLCBpby5jbCk7CisJc3RydWN0IGJ0cmVlICpiID0gY29udGFpbmVyX29mKGNsLCBzdHJ1Y3QgYnRyZWUsIGlvKTsKIAlzdHJ1Y3QgYnRyZWVfd3JpdGUgKncgPSBidHJlZV9wcmV2X3dyaXRlKGIpOwogCiAJYmNoX2JiaW9fZnJlZShiLT5iaW8sIGItPmMpOwpAQCAtMzUzLDE2ICszNTUsMTYgQEAKIAkJcXVldWVfZGVsYXllZF93b3JrKGJ0cmVlX2lvX3dxLCAmYi0+d29yaywKIAkJCQkgICBtc2Vjc190b19qaWZmaWVzKDMwMDAwKSk7CiAKLQljbG9zdXJlX3JldHVybihjbCk7CisJY2xvc3VyZV9yZXR1cm5fd2l0aF9kZXN0cnVjdG9yKGNsLCBidHJlZV9ub2RlX3dyaXRlX3VubG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0cmVlX25vZGVfd3JpdGVfZG9uZShzdHJ1Y3QgY2xvc3VyZSAqY2wpCiB7Ci0Jc3RydWN0IGJ0cmVlICpiID0gY29udGFpbmVyX29mKGNsLCBzdHJ1Y3QgYnRyZWUsIGlvLmNsKTsKKwlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBidHJlZSwgaW8pOwogCXN0cnVjdCBiaW9fdmVjICpidjsKIAlpbnQgbjsKIAotCV9fYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGItPmJpbywgbiwgMCkKKwliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnYsIGItPmJpbywgbikKIAkJX19mcmVlX3BhZ2UoYnYtPmJ2X3BhZ2UpOwogCiAJX19idHJlZV9ub2RlX3dyaXRlX2RvbmUoY2wpOwpAQCAtMzcxLDcgKzM3Myw3IEBACiBzdGF0aWMgdm9pZCBidHJlZV9ub2RlX3dyaXRlX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCXN0cnVjdCBjbG9zdXJlICpjbCA9IGJpby0+YmlfcHJpdmF0ZTsKLQlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBidHJlZSwgaW8uY2wpOworCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IGJ0cmVlLCBpbyk7CiAKIAlpZiAoZXJyb3IpCiAJCXNldF9idHJlZV9ub2RlX2lvX2Vycm9yKGIpOwpAQCAtMzgyLDggKzM4NCw4IEBACiAKIHN0YXRpYyB2b2lkIGRvX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICpiKQogewotCXN0cnVjdCBjbG9zdXJlICpjbCA9ICZiLT5pby5jbDsKLQlzdHJ1Y3QgYnNldCAqaSA9IGItPnNldHNbYi0+bnNldHNdLmRhdGE7CisJc3RydWN0IGNsb3N1cmUgKmNsID0gJmItPmlvOworCXN0cnVjdCBic2V0ICppID0gYnRyZWVfYnNldF9sYXN0KGIpOwogCUJLRVlfUEFEREVEKGtleSkgazsKIAogCWktPnZlcnNpb24JPSBCQ0FDSEVfQlNFVF9WRVJTSU9OOwpAQCAtMzk1LDcgKzM5Nyw3IEBACiAJYi0+YmlvLT5iaV9lbmRfaW8JPSBidHJlZV9ub2RlX3dyaXRlX2VuZGlvOwogCWItPmJpby0+YmlfcHJpdmF0ZQk9IGNsOwogCWItPmJpby0+YmlfcncJCT0gUkVRX01FVEF8V1JJVEVfU1lOQ3xSRVFfRlVBOwotCWItPmJpby0+Ymlfc2l6ZQkJPSBzZXRfYmxvY2tzKGksIGItPmMpICogYmxvY2tfYnl0ZXMoYi0+Yyk7CisJYi0+YmlvLT5iaV9pdGVyLmJpX3NpemUJPSByb3VuZHVwKHNldF9ieXRlcyhpKSwgYmxvY2tfYnl0ZXMoYi0+YykpOwogCWJjaF9iaW9fbWFwKGItPmJpbywgaSk7CiAKIAkvKgpAQCAtNDE0LDE0ICs0MTYsMTUgQEAKIAkgKi8KIAogCWJrZXlfY29weSgmay5rZXksICZiLT5rZXkpOwotCVNFVF9QVFJfT0ZGU0VUKCZrLmtleSwgMCwgUFRSX09GRlNFVCgmay5rZXksIDApICsgYnNldF9vZmZzZXQoYiwgaSkpOworCVNFVF9QVFJfT0ZGU0VUKCZrLmtleSwgMCwgUFRSX09GRlNFVCgmay5rZXksIDApICsKKwkJICAgICAgIGJzZXRfc2VjdG9yX29mZnNldCgmYi0+a2V5cywgaSkpOwogCiAJaWYgKCFiaW9fYWxsb2NfcGFnZXMoYi0+YmlvLCBHRlBfTk9JTykpIHsKIAkJaW50IGo7CiAJCXN0cnVjdCBiaW9fdmVjICpidjsKIAkJdm9pZCAqYmFzZSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgaSAmIH4oUEFHRV9TSVpFIC0gMSkpOwogCi0JCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiLT5iaW8sIGopCisJCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYi0+YmlvLCBqKQogCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSksCiAJCQkgICAgICAgYmFzZSArIGogKiBQQUdFX1NJWkUsIFBBR0VfU0laRSk7CiAKQEAgLTQzNSw0MCArNDM4LDU0IEBACiAJCWJjaF9zdWJtaXRfYmJpbyhiLT5iaW8sIGItPmMsICZrLmtleSwgMCk7CiAKIAkJY2xvc3VyZV9zeW5jKGNsKTsKLQkJX19idHJlZV9ub2RlX3dyaXRlX2RvbmUoY2wpOworCQljb250aW51ZV9hdF9ub2JhcnJpZXIoY2wsIF9fYnRyZWVfbm9kZV93cml0ZV9kb25lLCBOVUxMKTsKIAl9CiB9CiAKIHZvaWQgYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KQogewotCXN0cnVjdCBic2V0ICppID0gYi0+c2V0c1tiLT5uc2V0c10uZGF0YTsKKwlzdHJ1Y3QgYnNldCAqaSA9IGJ0cmVlX2JzZXRfbGFzdChiKTsKIAogCXRyYWNlX2JjYWNoZV9idHJlZV93cml0ZShiKTsKIAogCUJVR19PTihjdXJyZW50LT5iaW9fbGlzdCk7CiAJQlVHX09OKGItPndyaXR0ZW4gPj0gYnRyZWVfYmxvY2tzKGIpKTsKIAlCVUdfT04oYi0+d3JpdHRlbiAmJiAhaS0+a2V5cyk7Ci0JQlVHX09OKGItPnNldHMtPmRhdGEtPnNlcSAhPSBpLT5zZXEpOwotCWJjaF9jaGVja19rZXlzKGIsICJ3cml0aW5nIik7CisJQlVHX09OKGJ0cmVlX2JzZXRfZmlyc3QoYiktPnNlcSAhPSBpLT5zZXEpOworCWJjaF9jaGVja19rZXlzKCZiLT5rZXlzLCAid3JpdGluZyIpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmYi0+d29yayk7CiAKIAkvKiBJZiBjYWxsZXIgaXNuJ3Qgd2FpdGluZyBmb3Igd3JpdGUsIHBhcmVudCByZWZjb3VudCBpcyBjYWNoZSBzZXQgKi8KLQljbG9zdXJlX2xvY2soJmItPmlvLCBwYXJlbnQgPzogJmItPmMtPmNsKTsKKwlkb3duKCZiLT5pb19tdXRleCk7CisJY2xvc3VyZV9pbml0KCZiLT5pbywgcGFyZW50ID86ICZiLT5jLT5jbCk7CiAKIAljbGVhcl9iaXQoQlRSRUVfTk9ERV9kaXJ0eSwJICZiLT5mbGFncyk7CiAJY2hhbmdlX2JpdChCVFJFRV9OT0RFX3dyaXRlX2lkeCwgJmItPmZsYWdzKTsKIAogCWRvX2J0cmVlX25vZGVfd3JpdGUoYik7CiAKLQliLT53cml0dGVuICs9IHNldF9ibG9ja3MoaSwgYi0+Yyk7Ci0JYXRvbWljX2xvbmdfYWRkKHNldF9ibG9ja3MoaSwgYi0+YykgKiBiLT5jLT5zYi5ibG9ja19zaXplLAorCWF0b21pY19sb25nX2FkZChzZXRfYmxvY2tzKGksIGJsb2NrX2J5dGVzKGItPmMpKSAqIGItPmMtPnNiLmJsb2NrX3NpemUsCiAJCQkmUFRSX0NBQ0hFKGItPmMsICZiLT5rZXksIDApLT5idHJlZV9zZWN0b3JzX3dyaXR0ZW4pOwogCi0JYmNoX2J0cmVlX3NvcnRfbGF6eShiKTsKKwliLT53cml0dGVuICs9IHNldF9ibG9ja3MoaSwgYmxvY2tfYnl0ZXMoYi0+YykpOworCisJLyogSWYgbm90IGEgbGVhZiBub2RlLCBhbHdheXMgc29ydCAqLworCWlmIChiLT5sZXZlbCAmJiBiLT5rZXlzLm5zZXRzKQorCQliY2hfYnRyZWVfc29ydCgmYi0+a2V5cywgJmItPmMtPnNvcnQpOworCWVsc2UKKwkJYmNoX2J0cmVlX3NvcnRfbGF6eSgmYi0+a2V5cywgJmItPmMtPnNvcnQpOworCisJLyoKKwkgKiBkbyB2ZXJpZnkgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgc2V0IGluaXRpYWxseSAoaS5lLiB3ZSBkaWQgYQorCSAqIHNvcnQpIGFuZCB3ZSBzb3J0ZWQgZG93biB0byBhIHNpbmdsZSBzZXQ6CisJICovCisJaWYgKGkgIT0gYi0+a2V5cy5zZXQtPmRhdGEgJiYgIWItPmtleXMubnNldHMpCisJCWJjaF9idHJlZV92ZXJpZnkoYik7CiAKIAlpZiAoYi0+d3JpdHRlbiA8IGJ0cmVlX2Jsb2NrcyhiKSkKLQkJYmNoX2JzZXRfaW5pdF9uZXh0KGIpOworCQliY2hfYnNldF9pbml0X25leHQoJmItPmtleXMsIHdyaXRlX2Jsb2NrKGIpLAorCQkJCSAgIGJzZXRfbWFnaWMoJmItPmMtPnNiKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMoc3RydWN0IGJ0cmVlICpiKQpAQCAtNDkzLDcgKzUxMCw3IEBACiAKIHN0YXRpYyB2b2lkIGJjaF9idHJlZV9sZWFmX2RpcnR5KHN0cnVjdCBidHJlZSAqYiwgYXRvbWljX3QgKmpvdXJuYWxfcmVmKQogewotCXN0cnVjdCBic2V0ICppID0gYi0+c2V0c1tiLT5uc2V0c10uZGF0YTsKKwlzdHJ1Y3QgYnNldCAqaSA9IGJ0cmVlX2JzZXRfbGFzdChiKTsKIAlzdHJ1Y3QgYnRyZWVfd3JpdGUgKncgPSBidHJlZV9jdXJyZW50X3dyaXRlKGIpOwogCiAJQlVHX09OKCFiLT53cml0dGVuKTsKQEAgLTUyOCwyNCArNTQ1LDYgQEAKICAqIG1jYSAtPiBtZW1vcnkgY2FjaGUKICAqLwogCi1zdGF0aWMgdm9pZCBtY2FfcmVpbml0KHN0cnVjdCBidHJlZSAqYikKLXsKLQl1bnNpZ25lZCBpOwotCi0JYi0+ZmxhZ3MJPSAwOwotCWItPndyaXR0ZW4JPSAwOwotCWItPm5zZXRzCT0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlNFVFM7IGkrKykKLQkJYi0+c2V0c1tpXS5zaXplID0gMDsKLQkvKgotCSAqIFNlY29uZCBsb29wIHN0YXJ0cyBhdCAxIGJlY2F1c2UgYi0+c2V0c1swXS0+ZGF0YSBpcyB0aGUgbWVtb3J5IHdlCi0JICogYWxsb2NhdGVkCi0JICovCi0JZm9yIChpID0gMTsgaSA8IE1BWF9CU0VUUzsgaSsrKQotCQliLT5zZXRzW2ldLmRhdGEgPSBOVUxMOwotfQotCiAjZGVmaW5lIG1jYV9yZXNlcnZlKGMpCSgoKGMtPnJvb3QgJiYgYy0+cm9vdC0+bGV2ZWwpCQlcCiAJCQkgID8gYy0+cm9vdC0+bGV2ZWwgOiAxKSAqIDggKyAxNikKICNkZWZpbmUgbWNhX2Nhbl9mcmVlKGMpCQkJCQkJXApAQCAtNTUzLDI4ICs1NTIsMTIgQEAKIAogc3RhdGljIHZvaWQgbWNhX2RhdGFfZnJlZShzdHJ1Y3QgYnRyZWUgKmIpCiB7Ci0Jc3RydWN0IGJzZXRfdHJlZSAqdCA9IGItPnNldHM7Ci0JQlVHX09OKCFjbG9zdXJlX2lzX3VubG9ja2VkKCZiLT5pby5jbCkpOworCUJVR19PTihiLT5pb19tdXRleC5jb3VudCAhPSAxKTsKIAotCWlmIChic2V0X3ByZXZfYnl0ZXMoYikgPCBQQUdFX1NJWkUpCi0JCWtmcmVlKHQtPnByZXYpOwotCWVsc2UKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdC0+cHJldiwKLQkJCSAgIGdldF9vcmRlcihic2V0X3ByZXZfYnl0ZXMoYikpKTsKKwliY2hfYnRyZWVfa2V5c19mcmVlKCZiLT5rZXlzKTsKIAotCWlmIChic2V0X3RyZWVfYnl0ZXMoYikgPCBQQUdFX1NJWkUpCi0JCWtmcmVlKHQtPnRyZWUpOwotCWVsc2UKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdC0+dHJlZSwKLQkJCSAgIGdldF9vcmRlcihic2V0X3RyZWVfYnl0ZXMoYikpKTsKLQotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHQtPmRhdGEsIGItPnBhZ2Vfb3JkZXIpOwotCi0JdC0+cHJldiA9IE5VTEw7Ci0JdC0+dHJlZSA9IE5VTEw7Ci0JdC0+ZGF0YSA9IE5VTEw7Ci0JbGlzdF9tb3ZlKCZiLT5saXN0LCAmYi0+Yy0+YnRyZWVfY2FjaGVfZnJlZWQpOwogCWItPmMtPmJ1Y2tldF9jYWNoZV91c2VkLS07CisJbGlzdF9tb3ZlKCZiLT5saXN0LCAmYi0+Yy0+YnRyZWVfY2FjaGVfZnJlZWQpOwogfQogCiBzdGF0aWMgdm9pZCBtY2FfYnVja2V0X2ZyZWUoc3RydWN0IGJ0cmVlICpiKQpAQCAtNTkzLDM0ICs1NzYsMTYgQEAKIAogc3RhdGljIHZvaWQgbWNhX2RhdGFfYWxsb2Moc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYmtleSAqaywgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBic2V0X3RyZWUgKnQgPSBiLT5zZXRzOwotCUJVR19PTih0LT5kYXRhKTsKLQotCWItPnBhZ2Vfb3JkZXIgPSBtYXhfdCh1bnNpZ25lZCwKLQkJCSAgICAgIGlsb2cyKGItPmMtPmJ0cmVlX3BhZ2VzKSwKLQkJCSAgICAgIGJ0cmVlX29yZGVyKGspKTsKLQotCXQtPmRhdGEgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGdmcCwgYi0+cGFnZV9vcmRlcik7Ci0JaWYgKCF0LT5kYXRhKQotCQlnb3RvIGVycjsKLQotCXQtPnRyZWUgPSBic2V0X3RyZWVfYnl0ZXMoYikgPCBQQUdFX1NJWkUKLQkJPyBrbWFsbG9jKGJzZXRfdHJlZV9ieXRlcyhiKSwgZ2ZwKQotCQk6ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoYnNldF90cmVlX2J5dGVzKGIpKSk7Ci0JaWYgKCF0LT50cmVlKQotCQlnb3RvIGVycjsKLQotCXQtPnByZXYgPSBic2V0X3ByZXZfYnl0ZXMoYikgPCBQQUdFX1NJWkUKLQkJPyBrbWFsbG9jKGJzZXRfcHJldl9ieXRlcyhiKSwgZ2ZwKQotCQk6ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoYnNldF9wcmV2X2J5dGVzKGIpKSk7Ci0JaWYgKCF0LT5wcmV2KQotCQlnb3RvIGVycjsKLQotCWxpc3RfbW92ZSgmYi0+bGlzdCwgJmItPmMtPmJ0cmVlX2NhY2hlKTsKLQliLT5jLT5idWNrZXRfY2FjaGVfdXNlZCsrOwotCXJldHVybjsKLWVycjoKLQltY2FfZGF0YV9mcmVlKGIpOworCWlmICghYmNoX2J0cmVlX2tleXNfYWxsb2MoJmItPmtleXMsCisJCQkJICBtYXhfdCh1bnNpZ25lZCwKKwkJCQkJaWxvZzIoYi0+Yy0+YnRyZWVfcGFnZXMpLAorCQkJCQlidHJlZV9vcmRlcihrKSksCisJCQkJICBnZnApKSB7CisJCWItPmMtPmJ1Y2tldF9jYWNoZV91c2VkKys7CisJCWxpc3RfbW92ZSgmYi0+bGlzdCwgJmItPmMtPmJ0cmVlX2NhY2hlKTsKKwl9IGVsc2UgeworCQlsaXN0X21vdmUoJmItPmxpc3QsICZiLT5jLT5idHJlZV9jYWNoZV9mcmVlZCk7CisJfQogfQogCiBzdGF0aWMgc3RydWN0IGJ0cmVlICptY2FfYnVja2V0X2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKmMsCkBAIC02MzUsNyArNjAwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmYi0+bGlzdCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmItPndvcmssIGJ0cmVlX25vZGVfd3JpdGVfd29yayk7CiAJYi0+YyA9IGM7Ci0JY2xvc3VyZV9pbml0X3VubG9ja2VkKCZiLT5pbyk7CisJc2VtYV9pbml0KCZiLT5pb19tdXRleCwgMSk7CiAKIAltY2FfZGF0YV9hbGxvYyhiLCBrLCBnZnApOwogCXJldHVybiBiOwpAQCAtNjUxLDI0ICs2MTYsMzEgQEAKIAlpZiAoIWRvd25fd3JpdGVfdHJ5bG9jaygmYi0+bG9jaykpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JQlVHX09OKGJ0cmVlX25vZGVfZGlydHkoYikgJiYgIWItPnNldHNbMF0uZGF0YSk7CisJQlVHX09OKGJ0cmVlX25vZGVfZGlydHkoYikgJiYgIWItPmtleXMuc2V0WzBdLmRhdGEpOwogCi0JaWYgKGItPnBhZ2Vfb3JkZXIgPCBtaW5fb3JkZXIgfHwKLQkgICAgKCFmbHVzaCAmJgotCSAgICAgKGJ0cmVlX25vZGVfZGlydHkoYikgfHwKLQkgICAgICBhdG9taWNfcmVhZCgmYi0+aW8uY2wucmVtYWluaW5nKSAhPSAtMSkpKSB7Ci0JCXJ3X3VubG9jayh0cnVlLCBiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGItPmtleXMucGFnZV9vcmRlciA8IG1pbl9vcmRlcikKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKCFmbHVzaCkgeworCQlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQlpZiAoZG93bl90cnlsb2NrKCZiLT5pb19tdXRleCkpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCXVwKCZiLT5pb19tdXRleCk7CiAJfQogCiAJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMoYik7CiAKIAkvKiB3YWl0IGZvciBhbnkgaW4gZmxpZ2h0IGJ0cmVlIHdyaXRlICovCi0JY2xvc3VyZV93YWl0X2V2ZW50KCZiLT5pby53YWl0LCAmY2wsCi0JCQkgICBhdG9taWNfcmVhZCgmYi0+aW8uY2wucmVtYWluaW5nKSA9PSAtMSk7CisJZG93bigmYi0+aW9fbXV0ZXgpOworCXVwKCZiLT5pb19tdXRleCk7CiAKIAlyZXR1cm4gMDsKK291dF91bmxvY2s6CisJcndfdW5sb2NrKHRydWUsIGIpOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBiY2hfbWNhX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmssCkBAIC03MTQsMTQgKzY4NiwxMCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBDYW4gaGFwcGVuIHJpZ2h0IHdoZW4gd2UgZmlyc3Qgc3RhcnQgdXAsIGJlZm9yZSB3ZSd2ZSByZWFkIGluIGFueQotCSAqIGJ0cmVlIG5vZGVzCi0JICovCi0JaWYgKGxpc3RfZW1wdHkoJmMtPmJ0cmVlX2NhY2hlKSkKLQkJZ290byBvdXQ7Ci0KIAlmb3IgKGkgPSAwOyAobnItLSkgJiYgaSA8IGMtPmJ1Y2tldF9jYWNoZV91c2VkOyBpKyspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmMtPmJ0cmVlX2NhY2hlKSkKKwkJCWdvdG8gb3V0OworCiAJCWIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjLT5idHJlZV9jYWNoZSwgc3RydWN0IGJ0cmVlLCBsaXN0KTsKIAkJbGlzdF9yb3RhdGVfbGVmdCgmYy0+YnRyZWVfY2FjaGUpOwogCkBAIC03NjcsNiArNzM1LDggQEAKICNpZmRlZiBDT05GSUdfQkNBQ0hFX0RFQlVHCiAJaWYgKGMtPnZlcmlmeV9kYXRhKQogCQlsaXN0X21vdmUoJmMtPnZlcmlmeV9kYXRhLT5saXN0LCAmYy0+YnRyZWVfY2FjaGUpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYy0+dmVyaWZ5X29uZGlzaywgaWxvZzIoYnVja2V0X3BhZ2VzKGMpKSk7CiAjZW5kaWYKIAogCWxpc3Rfc3BsaWNlKCZjLT5idHJlZV9jYWNoZV9mcmVlYWJsZSwKQEAgLTgwNywxMCArNzc3LDEzIEBACiAjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRwogCW11dGV4X2luaXQoJmMtPnZlcmlmeV9sb2NrKTsKIAorCWMtPnZlcmlmeV9vbmRpc2sgPSAodm9pZCAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIGlsb2cyKGJ1Y2tldF9wYWdlcyhjKSkpOworCiAJYy0+dmVyaWZ5X2RhdGEgPSBtY2FfYnVja2V0X2FsbG9jKGMsICZaRVJPX0tFWSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoYy0+dmVyaWZ5X2RhdGEgJiYKLQkgICAgYy0+dmVyaWZ5X2RhdGEtPnNldHNbMF0uZGF0YSkKKwkgICAgYy0+dmVyaWZ5X2RhdGEtPmtleXMuc2V0LT5kYXRhKQogCQlsaXN0X2RlbF9pbml0KCZjLT52ZXJpZnlfZGF0YS0+bGlzdCk7CiAJZWxzZQogCQljLT52ZXJpZnlfZGF0YSA9IE5VTEw7CkBAIC05MDgsNyArODgxLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZV9mcmVlZCwgbGlzdCkKIAkJaWYgKCFtY2FfcmVhcChiLCAwLCBmYWxzZSkpIHsKIAkJCW1jYV9kYXRhX2FsbG9jKGIsIGssIF9fR0ZQX05PV0FSTnxHRlBfTk9JTyk7Ci0JCQlpZiAoIWItPnNldHNbMF0uZGF0YSkKKwkJCWlmICghYi0+a2V5cy5zZXRbMF0uZGF0YSkKIAkJCQlnb3RvIGVycjsKIAkJCWVsc2UKIAkJCQlnb3RvIG91dDsKQEAgLTkxOSwxMCArODkyLDEwIEBACiAJCWdvdG8gZXJyOwogCiAJQlVHX09OKCFkb3duX3dyaXRlX3RyeWxvY2soJmItPmxvY2spKTsKLQlpZiAoIWItPnNldHMtPmRhdGEpCisJaWYgKCFiLT5rZXlzLnNldC0+ZGF0YSkKIAkJZ290byBlcnI7CiBvdXQ6Ci0JQlVHX09OKCFjbG9zdXJlX2lzX3VubG9ja2VkKCZiLT5pby5jbCkpOworCUJVR19PTihiLT5pb19tdXRleC5jb3VudCAhPSAxKTsKIAogCWJrZXlfY29weSgmYi0+a2V5LCBrKTsKIAlsaXN0X21vdmUoJmItPmxpc3QsICZjLT5idHJlZV9jYWNoZSk7CkBAIC05MzAsMTAgKzkwMywxNyBAQAogCWhsaXN0X2FkZF9oZWFkX3JjdSgmYi0+aGFzaCwgbWNhX2hhc2goYywgaykpOwogCiAJbG9ja19zZXRfc3ViY2xhc3MoJmItPmxvY2suZGVwX21hcCwgbGV2ZWwgKyAxLCBfVEhJU19JUF8pOwotCWItPmxldmVsCT0gbGV2ZWw7CiAJYi0+cGFyZW50CT0gKHZvaWQgKikgfjBVTDsKKwliLT5mbGFncwk9IDA7CisJYi0+d3JpdHRlbgk9IDA7CisJYi0+bGV2ZWwJPSBsZXZlbDsKIAotCW1jYV9yZWluaXQoYik7CisJaWYgKCFiLT5sZXZlbCkKKwkJYmNoX2J0cmVlX2tleXNfaW5pdCgmYi0+a2V5cywgJmJjaF9leHRlbnRfa2V5c19vcHMsCisJCQkJICAgICZiLT5jLT5leHBlbnNpdmVfZGVidWdfY2hlY2tzKTsKKwllbHNlCisJCWJjaF9idHJlZV9rZXlzX2luaXQoJmItPmtleXMsICZiY2hfYnRyZWVfa2V5c19vcHMsCisJCQkJICAgICZiLT5jLT5leHBlbnNpdmVfZGVidWdfY2hlY2tzKTsKIAogCXJldHVybiBiOwogZXJyOgpAQCAtOTk0LDEzICs5NzQsMTMgQEAKIAogCWItPmFjY2Vzc2VkID0gMTsKIAotCWZvciAoOyBpIDw9IGItPm5zZXRzICYmIGItPnNldHNbaV0uc2l6ZTsgaSsrKSB7Ci0JCXByZWZldGNoKGItPnNldHNbaV0udHJlZSk7Ci0JCXByZWZldGNoKGItPnNldHNbaV0uZGF0YSk7CisJZm9yICg7IGkgPD0gYi0+a2V5cy5uc2V0cyAmJiBiLT5rZXlzLnNldFtpXS5zaXplOyBpKyspIHsKKwkJcHJlZmV0Y2goYi0+a2V5cy5zZXRbaV0udHJlZSk7CisJCXByZWZldGNoKGItPmtleXMuc2V0W2ldLmRhdGEpOwogCX0KIAotCWZvciAoOyBpIDw9IGItPm5zZXRzOyBpKyspCi0JCXByZWZldGNoKGItPnNldHNbaV0uZGF0YSk7CisJZm9yICg7IGkgPD0gYi0+a2V5cy5uc2V0czsgaSsrKQorCQlwcmVmZXRjaChiLT5rZXlzLnNldFtpXS5kYXRhKTsKIAogCWlmIChidHJlZV9ub2RlX2lvX2Vycm9yKGIpKSB7CiAJCXJ3X3VubG9jayh3cml0ZSwgYik7CkBAIC0xMDYzLDcgKzEwNDMsNyBAQAogCiAJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwogcmV0cnk6Ci0JaWYgKF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoYywgV0FURVJNQVJLX01FVEFEQVRBLCAmay5rZXksIDEsIHdhaXQpKQorCWlmIChfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KGMsIFJFU0VSVkVfQlRSRUUsICZrLmtleSwgMSwgd2FpdCkpCiAJCWdvdG8gZXJyOwogCiAJYmtleV9wdXQoYywgJmsua2V5KTsKQEAgLTEwODAsNyArMTA2MCw3IEBACiAJfQogCiAJYi0+YWNjZXNzZWQgPSAxOwotCWJjaF9ic2V0X2luaXRfbmV4dChiKTsKKwliY2hfYnNldF9pbml0X25leHQoJmItPmtleXMsIGItPmtleXMuc2V0LT5kYXRhLCBic2V0X21hZ2ljKCZiLT5jLT5zYikpOwogCiAJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiAKQEAgLTEwOTgsOCArMTA3OCwxMCBAQAogc3RhdGljIHN0cnVjdCBidHJlZSAqYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChzdHJ1Y3QgYnRyZWUgKmIsIGJvb2wgd2FpdCkKIHsKIAlzdHJ1Y3QgYnRyZWUgKm4gPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBiLT5sZXZlbCwgd2FpdCk7Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChuKSkKLQkJYmNoX2J0cmVlX3NvcnRfaW50byhiLCBuKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKG4pKSB7CisJCWJjaF9idHJlZV9zb3J0X2ludG8oJmItPmtleXMsICZuLT5rZXlzLCAmYi0+Yy0+c29ydCk7CisJCWJrZXlfY29weV9rZXkoJm4tPmtleSwgJmItPmtleSk7CisJfQogCiAJcmV0dXJuIG47CiB9CkBAIC0xMTIwLDYgKzExMDIsMjggQEAKIAlhdG9taWNfaW5jKCZiLT5jLT5wcmlvX2Jsb2NrZWQpOwogfQogCitzdGF0aWMgaW50IGJ0cmVlX2NoZWNrX3Jlc2VydmUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wKQoreworCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBiLT5jOworCXN0cnVjdCBjYWNoZSAqY2E7CisJdW5zaWduZWQgaSwgcmVzZXJ2ZSA9IGMtPnJvb3QtPmxldmVsICogMiArIDE7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CisKKwlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkKKwkJaWYgKGZpZm9fdXNlZCgmY2EtPmZyZWVbUkVTRVJWRV9CVFJFRV0pIDwgcmVzZXJ2ZSkgeworCQkJaWYgKG9wKQorCQkJCXByZXBhcmVfdG9fd2FpdCgmYy0+YnVja2V0X3dhaXQsICZvcC0+d2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXJldCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisKKwltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBHYXJiYWdlIGNvbGxlY3Rpb24gKi8KIAogdWludDhfdCBfX2JjaF9idHJlZV9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBpbnQgbGV2ZWwsIHN0cnVjdCBia2V5ICprKQpAQCAtMTE4MywxMSArMTE4NywxMSBAQAogCiAJZ2MtPm5vZGVzKys7CiAKLQlmb3JfZWFjaF9rZXlfZmlsdGVyKGIsIGssICZpdGVyLCBiY2hfcHRyX2ludmFsaWQpIHsKKwlmb3JfZWFjaF9rZXlfZmlsdGVyKCZiLT5rZXlzLCBrLCAmaXRlciwgYmNoX3B0cl9pbnZhbGlkKSB7CiAJCXN0YWxlID0gbWF4KHN0YWxlLCBidHJlZV9tYXJrX2tleShiLCBrKSk7CiAJCWtleXMrKzsKIAotCQlpZiAoYmNoX3B0cl9iYWQoYiwgaykpCisJCWlmIChiY2hfcHRyX2JhZCgmYi0+a2V5cywgaykpCiAJCQljb250aW51ZTsKIAogCQlnYy0+a2V5X2J5dGVzICs9IGJrZXlfdTY0cyhrKTsKQEAgLTExOTcsOSArMTIwMSw5IEBACiAJCWdjLT5kYXRhICs9IEtFWV9TSVpFKGspOwogCX0KIAotCWZvciAodCA9IGItPnNldHM7IHQgPD0gJmItPnNldHNbYi0+bnNldHNdOyB0KyspCisJZm9yICh0ID0gYi0+a2V5cy5zZXQ7IHQgPD0gJmItPmtleXMuc2V0W2ItPmtleXMubnNldHNdOyB0KyspCiAJCWJ0cmVlX2J1Z19vbih0LT5zaXplICYmCi0JCQkgICAgIGJzZXRfd3JpdHRlbihiLCB0KSAmJgorCQkJICAgICBic2V0X3dyaXR0ZW4oJmItPmtleXMsIHQpICYmCiAJCQkgICAgIGJrZXlfY21wKCZiLT5rZXksICZ0LT5lbmQpIDwgMCwKIAkJCSAgICAgYiwgImZvdW5kIHNob3J0IGJ0cmVlIGtleSBpbiBnYyIpOwogCkBAIC0xMjQzLDcgKzEyNDcsOCBAQAogCWJsb2NrcyA9IGJ0cmVlX2RlZmF1bHRfYmxvY2tzKGItPmMpICogMiAvIDM7CiAKIAlpZiAobm9kZXMgPCAyIHx8Ci0JICAgIF9fc2V0X2Jsb2NrcyhiLT5zZXRzWzBdLmRhdGEsIGtleXMsIGItPmMpID4gYmxvY2tzICogKG5vZGVzIC0gMSkpCisJICAgIF9fc2V0X2Jsb2NrcyhiLT5rZXlzLnNldFswXS5kYXRhLCBrZXlzLAorCQkJIGJsb2NrX2J5dGVzKGItPmMpKSA+IGJsb2NrcyAqIChub2RlcyAtIDEpKQogCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7CkBAIC0xMjUzLDE4ICsxMjU4LDE5IEBACiAJfQogCiAJZm9yIChpID0gbm9kZXMgLSAxOyBpID4gMDsgLS1pKSB7Ci0JCXN0cnVjdCBic2V0ICpuMSA9IG5ld19ub2Rlc1tpXS0+c2V0cy0+ZGF0YTsKLQkJc3RydWN0IGJzZXQgKm4yID0gbmV3X25vZGVzW2kgLSAxXS0+c2V0cy0+ZGF0YTsKKwkJc3RydWN0IGJzZXQgKm4xID0gYnRyZWVfYnNldF9maXJzdChuZXdfbm9kZXNbaV0pOworCQlzdHJ1Y3QgYnNldCAqbjIgPSBidHJlZV9ic2V0X2ZpcnN0KG5ld19ub2Rlc1tpIC0gMV0pOwogCQlzdHJ1Y3QgYmtleSAqaywgKmxhc3QgPSBOVUxMOwogCiAJCWtleXMgPSAwOwogCiAJCWlmIChpID4gMSkgewogCQkJZm9yIChrID0gbjItPnN0YXJ0OwotCQkJICAgICBrIDwgZW5kKG4yKTsKKwkJCSAgICAgayA8IGJzZXRfYmtleV9sYXN0KG4yKTsKIAkJCSAgICAgayA9IGJrZXlfbmV4dChrKSkgewogCQkJCWlmIChfX3NldF9ibG9ja3MobjEsIG4xLT5rZXlzICsga2V5cyArCi0JCQkJCQkgYmtleV91NjRzKGspLCBiLT5jKSA+IGJsb2NrcykKKwkJCQkJCSBia2V5X3U2NHMoayksCisJCQkJCQkgYmxvY2tfYnl0ZXMoYi0+YykpID4gYmxvY2tzKQogCQkJCQlicmVhazsKIAogCQkJCWxhc3QgPSBrOwpAQCAtMTI4MCw3ICsxMjg2LDggQEAKIAkJCSAqIHRob3VnaCkKIAkJCSAqLwogCQkJaWYgKF9fc2V0X2Jsb2NrcyhuMSwgbjEtPmtleXMgKyBuMi0+a2V5cywKLQkJCQkJIGItPmMpID4gYnRyZWVfYmxvY2tzKG5ld19ub2Rlc1tpXSkpCisJCQkJCSBibG9ja19ieXRlcyhiLT5jKSkgPgorCQkJICAgIGJ0cmVlX2Jsb2NrcyhuZXdfbm9kZXNbaV0pKQogCQkJCWdvdG8gb3V0X25vY29hbGVzY2U7CiAKIAkJCWtleXMgPSBuMi0+a2V5czsKQEAgLTEyODgsMjcgKzEyOTUsMjggQEAKIAkJCWxhc3QgPSAmci0+Yi0+a2V5OwogCQl9CiAKLQkJQlVHX09OKF9fc2V0X2Jsb2NrcyhuMSwgbjEtPmtleXMgKyBrZXlzLAotCQkJCSAgICBiLT5jKSA+IGJ0cmVlX2Jsb2NrcyhuZXdfbm9kZXNbaV0pKTsKKwkJQlVHX09OKF9fc2V0X2Jsb2NrcyhuMSwgbjEtPmtleXMgKyBrZXlzLCBibG9ja19ieXRlcyhiLT5jKSkgPgorCQkgICAgICAgYnRyZWVfYmxvY2tzKG5ld19ub2Rlc1tpXSkpOwogCiAJCWlmIChsYXN0KQogCQkJYmtleV9jb3B5X2tleSgmbmV3X25vZGVzW2ldLT5rZXksIGxhc3QpOwogCi0JCW1lbWNweShlbmQobjEpLAorCQltZW1jcHkoYnNldF9ia2V5X2xhc3QobjEpLAogCQkgICAgICAgbjItPnN0YXJ0LAotCQkgICAgICAgKHZvaWQgKikgbm9kZShuMiwga2V5cykgLSAodm9pZCAqKSBuMi0+c3RhcnQpOworCQkgICAgICAgKHZvaWQgKikgYnNldF9ia2V5X2lkeChuMiwga2V5cykgLSAodm9pZCAqKSBuMi0+c3RhcnQpOwogCiAJCW4xLT5rZXlzICs9IGtleXM7CiAJCXJbaV0ua2V5cyA9IG4xLT5rZXlzOwogCiAJCW1lbW1vdmUobjItPnN0YXJ0LAotCQkJbm9kZShuMiwga2V5cyksCi0JCQkodm9pZCAqKSBlbmQobjIpIC0gKHZvaWQgKikgbm9kZShuMiwga2V5cykpOworCQkJYnNldF9ia2V5X2lkeChuMiwga2V5cyksCisJCQkodm9pZCAqKSBic2V0X2JrZXlfbGFzdChuMikgLQorCQkJKHZvaWQgKikgYnNldF9ia2V5X2lkeChuMiwga2V5cykpOwogCiAJCW4yLT5rZXlzIC09IGtleXM7CiAKLQkJaWYgKGJjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwKLQkJCQkJS0VZX1BUUlMoJm5ld19ub2Rlc1tpXS0+a2V5KSwgYi0+YykpCisJCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwKKwkJCQkJICBia2V5X3U2NHMoJm5ld19ub2Rlc1tpXS0+a2V5KSkpCiAJCQlnb3RvIG91dF9ub2NvYWxlc2NlOwogCiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlKG5ld19ub2Rlc1tpXSwgJmNsKTsKQEAgLTEzMTYsNyArMTMyNCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKLQkJaWYgKGJjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwgS0VZX1BUUlMoJnJbaV0uYi0+a2V5KSwgYi0+YykpCisJCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwgYmtleV91NjRzKCZyW2ldLmItPmtleSkpKQogCQkJZ290byBvdXRfbm9jb2FsZXNjZTsKIAogCQltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KHJbaV0uYiwga2V5bGlzdC0+dG9wKTsKQEAgLTEzMjQsNyArMTMzMiw3IEBACiAJfQogCiAJLyogV2UgZW1wdGllZCBvdXQgdGhpcyBub2RlICovCi0JQlVHX09OKG5ld19ub2Rlc1swXS0+c2V0cy0+ZGF0YS0+a2V5cyk7CisJQlVHX09OKGJ0cmVlX2JzZXRfZmlyc3QobmV3X25vZGVzWzBdKS0+a2V5cyk7CiAJYnRyZWVfbm9kZV9mcmVlKG5ld19ub2Rlc1swXSk7CiAJcndfdW5sb2NrKHRydWUsIG5ld19ub2Rlc1swXSk7CiAKQEAgLTEzNzAsNyArMTM3OCw3IEBACiAJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKIAl1bnNpZ25lZCByZXQgPSAwOwogCi0JZm9yX2VhY2hfa2V5X2ZpbHRlcihiLCBrLCAmaXRlciwgYmNoX3B0cl9iYWQpCisJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfYmFkKQogCQlyZXQgKz0gYmtleV91NjRzKGspOwogCiAJcmV0dXJuIHJldDsKQEAgLTEzOTAsMTMgKzEzOTgsMTMgQEAKIAlzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyAqbGFzdCA9IHIgKyBHQ19NRVJHRV9OT0RFUyAtIDE7CiAKIAliY2hfa2V5bGlzdF9pbml0KCZrZXlzKTsKLQliY2hfYnRyZWVfaXRlcl9pbml0KGIsICZpdGVyLCAmYi0+Yy0+Z2NfZG9uZSk7CisJYmNoX2J0cmVlX2l0ZXJfaW5pdCgmYi0+a2V5cywgJml0ZXIsICZiLT5jLT5nY19kb25lKTsKIAogCWZvciAoaSA9IDA7IGkgPCBHQ19NRVJHRV9OT0RFUzsgaSsrKQogCQlyW2ldLmIgPSBFUlJfUFRSKC1FSU5UUik7CiAKIAl3aGlsZSAoMSkgewotCQlrID0gYmNoX2J0cmVlX2l0ZXJfbmV4dF9maWx0ZXIoJml0ZXIsIGIsIGJjaF9wdHJfYmFkKTsKKwkJayA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKCZpdGVyLCAmYi0+a2V5cywgYmNoX3B0cl9iYWQpOwogCQlpZiAoaykgewogCQkJci0+YiA9IGJjaF9idHJlZV9ub2RlX2dldChiLT5jLCBrLCBiLT5sZXZlbCAtIDEsIHRydWUpOwogCQkJaWYgKElTX0VSUihyLT5iKSkgewpAQCAtMTQxNiw3ICsxNDI0LDggQEAKIAogCQlpZiAoIUlTX0VSUihsYXN0LT5iKSkgewogCQkJc2hvdWxkX3Jld3JpdGUgPSBidHJlZV9nY19tYXJrX25vZGUobGFzdC0+YiwgZ2MpOwotCQkJaWYgKHNob3VsZF9yZXdyaXRlKSB7CisJCQlpZiAoc2hvdWxkX3Jld3JpdGUgJiYKKwkJCSAgICAhYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkgewogCQkJCW4gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGxhc3QtPmIsCiAJCQkJCQkJCSBmYWxzZSk7CiAKQEAgLTE3MDUsNyArMTcxNCw3IEBACiAJc3RydWN0IGJ1Y2tldCAqZzsKIAlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwogCi0JZm9yX2VhY2hfa2V5X2ZpbHRlcihiLCBrLCAmaXRlciwgYmNoX3B0cl9pbnZhbGlkKSB7CisJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfaW52YWxpZCkgewogCQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykgewogCQkJaWYgKCFwdHJfYXZhaWxhYmxlKGItPmMsIGssIGkpKQogCQkJCWNvbnRpbnVlOwpAQCAtMTcyOCwxMCArMTczNywxMSBAQAogCX0KIAogCWlmIChiLT5sZXZlbCkgewotCQliY2hfYnRyZWVfaXRlcl9pbml0KGIsICZpdGVyLCBOVUxMKTsKKwkJYmNoX2J0cmVlX2l0ZXJfaW5pdCgmYi0+a2V5cywgJml0ZXIsIE5VTEwpOwogCiAJCWRvIHsKLQkJCWsgPSBiY2hfYnRyZWVfaXRlcl9uZXh0X2ZpbHRlcigmaXRlciwgYiwgYmNoX3B0cl9iYWQpOworCQkJayA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKCZpdGVyLCAmYi0+a2V5cywKKwkJCQkJCSAgICAgICBiY2hfcHRyX2JhZCk7CiAJCQlpZiAoaykKIAkJCQlidHJlZV9ub2RlX3ByZWZldGNoKGItPmMsIGssIGItPmxldmVsIC0gMSk7CiAKQEAgLTE3NzQsMjM1ICsxNzg0LDM2IEBACiAKIC8qIEJ0cmVlIGluc2VydGlvbiAqLwogCi1zdGF0aWMgdm9pZCBzaGlmdF9rZXlzKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJrZXkgKndoZXJlLCBzdHJ1Y3QgYmtleSAqaW5zZXJ0KQorc3RhdGljIGJvb2wgYnRyZWVfaW5zZXJ0X2tleShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBia2V5ICprLAorCQkJICAgICBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCiB7Ci0Jc3RydWN0IGJzZXQgKmkgPSBiLT5zZXRzW2ItPm5zZXRzXS5kYXRhOwotCi0JbWVtbW92ZSgodWludDY0X3QgKikgd2hlcmUgKyBia2V5X3U2NHMoaW5zZXJ0KSwKLQkJd2hlcmUsCi0JCSh2b2lkICopIGVuZChpKSAtICh2b2lkICopIHdoZXJlKTsKLQotCWktPmtleXMgKz0gYmtleV91NjRzKGluc2VydCk7Ci0JYmtleV9jb3B5KHdoZXJlLCBpbnNlcnQpOwotCWJjaF9ic2V0X2ZpeF9sb29rdXBfdGFibGUoYiwgd2hlcmUpOwotfQotCi1zdGF0aWMgYm9vbCBmaXhfb3ZlcmxhcHBpbmdfZXh0ZW50cyhzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBia2V5ICppbnNlcnQsCi0JCQkJICAgIHN0cnVjdCBidHJlZV9pdGVyICppdGVyLAotCQkJCSAgICBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCi17Ci0Jdm9pZCBzdWJ0cmFjdF9kaXJ0eShzdHJ1Y3QgYmtleSAqaywgdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2VjdG9ycykKLQl7Ci0JCWlmIChLRVlfRElSVFkoaykpCi0JCQliY2FjaGVfZGV2X3NlY3RvcnNfZGlydHlfYWRkKGItPmMsIEtFWV9JTk9ERShrKSwKLQkJCQkJCSAgICAgb2Zmc2V0LCAtc2VjdG9ycyk7Ci0JfQotCi0JdWludDY0X3Qgb2xkX29mZnNldDsKLQl1bnNpZ25lZCBvbGRfc2l6ZSwgc2VjdG9yc19mb3VuZCA9IDA7Ci0KLQl3aGlsZSAoMSkgewotCQlzdHJ1Y3QgYmtleSAqayA9IGJjaF9idHJlZV9pdGVyX25leHQoaXRlcik7Ci0JCWlmICghayB8fAotCQkgICAgYmtleV9jbXAoJlNUQVJUX0tFWShrKSwgaW5zZXJ0KSA+PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGJrZXlfY21wKGssICZTVEFSVF9LRVkoaW5zZXJ0KSkgPD0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCW9sZF9vZmZzZXQgPSBLRVlfU1RBUlQoayk7Ci0JCW9sZF9zaXplID0gS0VZX1NJWkUoayk7Ci0KLQkJLyoKLQkJICogV2UgbWlnaHQgb3ZlcmxhcCB3aXRoIDAgc2l6ZSBleHRlbnRzOyB3ZSBjYW4ndCBza2lwIHRoZXNlCi0JCSAqIGJlY2F1c2UgaWYgdGhleSdyZSBpbiB0aGUgc2V0IHdlJ3JlIGluc2VydGluZyB0byB3ZSBoYXZlIHRvCi0JCSAqIGFkanVzdCB0aGVtIHNvIHRoZXkgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHRoZSBrZXkgd2UncmUKLQkJICogaW5zZXJ0aW5nLiBCdXQgd2UgZG9uJ3Qgd2FudCB0byBjaGVjayB0aGVtIGZvciByZXBsYWNlCi0JCSAqIG9wZXJhdGlvbnMuCi0JCSAqLwotCi0JCWlmIChyZXBsYWNlX2tleSAmJiBLRVlfU0laRShrKSkgewotCQkJLyoKLQkJCSAqIGsgbWlnaHQgaGF2ZSBiZWVuIHNwbGl0IHNpbmNlIHdlIGluc2VydGVkL2ZvdW5kIHRoZQotCQkJICoga2V5IHdlJ3JlIHJlcGxhY2luZwotCQkJICovCi0JCQl1bnNpZ25lZCBpOwotCQkJdWludDY0X3Qgb2Zmc2V0ID0gS0VZX1NUQVJUKGspIC0KLQkJCQlLRVlfU1RBUlQocmVwbGFjZV9rZXkpOwotCi0JCQkvKiBCdXQgaXQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgcmVwbGFjZSBrZXkgKi8KLQkJCWlmIChLRVlfU1RBUlQoaykgPCBLRVlfU1RBUlQocmVwbGFjZV9rZXkpIHx8Ci0JCQkgICAgS0VZX09GRlNFVChrKSA+IEtFWV9PRkZTRVQocmVwbGFjZV9rZXkpKQotCQkJCWdvdG8gY2hlY2tfZmFpbGVkOwotCi0JCQkvKiBXZSBkaWRuJ3QgZmluZCBhIGtleSB0aGF0IHdlIHdlcmUgc3VwcG9zZWQgdG8gKi8KLQkJCWlmIChLRVlfU1RBUlQoaykgPiBLRVlfU1RBUlQoaW5zZXJ0KSArIHNlY3RvcnNfZm91bmQpCi0JCQkJZ290byBjaGVja19mYWlsZWQ7Ci0KLQkJCWlmIChLRVlfUFRSUyhrKSAhPSBLRVlfUFRSUyhyZXBsYWNlX2tleSkgfHwKLQkJCSAgICBLRVlfRElSVFkoaykgIT0gS0VZX0RJUlRZKHJlcGxhY2Vfa2V5KSkKLQkJCQlnb3RvIGNoZWNrX2ZhaWxlZDsKLQotCQkJLyogc2tpcCBwYXN0IGdlbiAqLwotCQkJb2Zmc2V0IDw8PSA4OwotCi0JCQlCVUdfT04oIUtFWV9QVFJTKHJlcGxhY2Vfa2V5KSk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhyZXBsYWNlX2tleSk7IGkrKykKLQkJCQlpZiAoay0+cHRyW2ldICE9IHJlcGxhY2Vfa2V5LT5wdHJbaV0gKyBvZmZzZXQpCi0JCQkJCWdvdG8gY2hlY2tfZmFpbGVkOwotCi0JCQlzZWN0b3JzX2ZvdW5kID0gS0VZX09GRlNFVChrKSAtIEtFWV9TVEFSVChpbnNlcnQpOwotCQl9Ci0KLQkJaWYgKGJrZXlfY21wKGluc2VydCwgaykgPCAwICYmCi0JCSAgICBia2V5X2NtcCgmU1RBUlRfS0VZKGluc2VydCksICZTVEFSVF9LRVkoaykpID4gMCkgewotCQkJLyoKLQkJCSAqIFdlIG92ZXJsYXBwZWQgaW4gdGhlIG1pZGRsZSBvZiBhbiBleGlzdGluZyBrZXk6IHRoYXQKLQkJCSAqIG1lYW5zIHdlIGhhdmUgdG8gc3BsaXQgdGhlIG9sZCBrZXkuIEJ1dCB3ZSBoYXZlIHRvIGRvCi0JCQkgKiBzbGlnaHRseSBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQotCQkJICogb2xkIGtleSBoYXMgYmVlbiB3cml0dGVuIG91dCB5ZXQuCi0JCQkgKi8KLQotCQkJc3RydWN0IGJrZXkgKnRvcDsKLQotCQkJc3VidHJhY3RfZGlydHkoaywgS0VZX1NUQVJUKGluc2VydCksIEtFWV9TSVpFKGluc2VydCkpOwotCi0JCQlpZiAoYmtleV93cml0dGVuKGIsIGspKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBpbnNlcnQgYSBuZXcga2V5IHRvIGNvdmVyIHRoZSB0b3Agb2YgdGhlCi0JCQkJICogb2xkIGtleSwgYW5kIHRoZSBvbGQga2V5IGlzIG1vZGlmaWVkIGluIHBsYWNlCi0JCQkJICogdG8gcmVwcmVzZW50IHRoZSBib3R0b20gc3BsaXQuCi0JCQkJICoKLQkJCQkgKiBJdCdzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5IHdoZXRoZXIgdGhlIG5ldyBrZXkKLQkJCQkgKiBpcyB0aGUgdG9wIG9yIHRoZSBib3R0b20sIGJ1dCBpdCBoYXMgdG8gbWF0Y2gKLQkJCQkgKiB1cCB3aXRoIHdoYXQgYnRyZWVfc29ydF9maXh1cCgpIGRvZXMgLSBpdAotCQkJCSAqIGRvZXNuJ3QgY2hlY2sgZm9yIHRoaXMga2luZCBvZiBvdmVybGFwLCBpdAotCQkJCSAqIGRlcGVuZHMgb24gdXMgaW5zZXJ0aW5nIGEgbmV3IGtleSBmb3IgdGhlIHRvcAotCQkJCSAqIGhlcmUuCi0JCQkJICovCi0JCQkJdG9wID0gYmNoX2JzZXRfc2VhcmNoKGIsICZiLT5zZXRzW2ItPm5zZXRzXSwKLQkJCQkJCSAgICAgIGluc2VydCk7Ci0JCQkJc2hpZnRfa2V5cyhiLCB0b3AsIGspOwotCQkJfSBlbHNlIHsKLQkJCQlCS0VZX1BBRERFRChrZXkpIHRlbXA7Ci0JCQkJYmtleV9jb3B5KCZ0ZW1wLmtleSwgayk7Ci0JCQkJc2hpZnRfa2V5cyhiLCBrLCAmdGVtcC5rZXkpOwotCQkJCXRvcCA9IGJrZXlfbmV4dChrKTsKLQkJCX0KLQotCQkJYmNoX2N1dF9mcm9udChpbnNlcnQsIHRvcCk7Ci0JCQliY2hfY3V0X2JhY2soJlNUQVJUX0tFWShpbnNlcnQpLCBrKTsKLQkJCWJjaF9ic2V0X2ZpeF9pbnZhbGlkYXRlZF9rZXkoYiwgayk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmtleV9jbXAoaW5zZXJ0LCBrKSA8IDApIHsKLQkJCWJjaF9jdXRfZnJvbnQoaW5zZXJ0LCBrKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChia2V5X2NtcCgmU1RBUlRfS0VZKGluc2VydCksICZTVEFSVF9LRVkoaykpID4gMCkKLQkJCQlvbGRfb2Zmc2V0ID0gS0VZX1NUQVJUKGluc2VydCk7Ci0KLQkJCWlmIChia2V5X3dyaXR0ZW4oYiwgaykgJiYKLQkJCSAgICBia2V5X2NtcCgmU1RBUlRfS0VZKGluc2VydCksICZTVEFSVF9LRVkoaykpIDw9IDApIHsKLQkJCQkvKgotCQkJCSAqIENvbXBsZXRlbHkgb3Zlcndyb3RlLCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0JCQkJICogaW52YWxpZGF0ZSB0aGUgYmluYXJ5IHNlYXJjaCB0cmVlCi0JCQkJICovCi0JCQkJYmNoX2N1dF9mcm9udChrLCBrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJX19iY2hfY3V0X2JhY2soJlNUQVJUX0tFWShpbnNlcnQpLCBrKTsKLQkJCQliY2hfYnNldF9maXhfaW52YWxpZGF0ZWRfa2V5KGIsIGspOwotCQkJfQotCQl9Ci0KLQkJc3VidHJhY3RfZGlydHkoaywgb2xkX29mZnNldCwgb2xkX3NpemUgLSBLRVlfU0laRShrKSk7Ci0JfQotCi1jaGVja19mYWlsZWQ6Ci0JaWYgKHJlcGxhY2Vfa2V5KSB7Ci0JCWlmICghc2VjdG9yc19mb3VuZCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoc2VjdG9yc19mb3VuZCA8IEtFWV9TSVpFKGluc2VydCkpIHsKLQkJCVNFVF9LRVlfT0ZGU0VUKGluc2VydCwgS0VZX09GRlNFVChpbnNlcnQpIC0KLQkJCQkgICAgICAgKEtFWV9TSVpFKGluc2VydCkgLSBzZWN0b3JzX2ZvdW5kKSk7Ci0JCQlTRVRfS0VZX1NJWkUoaW5zZXJ0LCBzZWN0b3JzX2ZvdW5kKTsKLQkJfQotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgYnRyZWVfaW5zZXJ0X2tleShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCi0JCQkgICAgIHN0cnVjdCBia2V5ICprLCBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCi17Ci0Jc3RydWN0IGJzZXQgKmkgPSBiLT5zZXRzW2ItPm5zZXRzXS5kYXRhOwotCXN0cnVjdCBia2V5ICptLCAqcHJldjsKLQl1bnNpZ25lZCBzdGF0dXMgPSBCVFJFRV9JTlNFUlRfU1RBVFVTX0lOU0VSVDsKKwl1bnNpZ25lZCBzdGF0dXM7CiAKIAlCVUdfT04oYmtleV9jbXAoaywgJmItPmtleSkgPiAwKTsKLQlCVUdfT04oYi0+bGV2ZWwgJiYgIUtFWV9QVFJTKGspKTsKLQlCVUdfT04oIWItPmxldmVsICYmICFLRVlfT0ZGU0VUKGspKTsKIAotCWlmICghYi0+bGV2ZWwpIHsKLQkJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKKwlzdGF0dXMgPSBiY2hfYnRyZWVfaW5zZXJ0X2tleSgmYi0+a2V5cywgaywgcmVwbGFjZV9rZXkpOworCWlmIChzdGF0dXMgIT0gQlRSRUVfSU5TRVJUX1NUQVRVU19OT19JTlNFUlQpIHsKKwkJYmNoX2NoZWNrX2tleXMoJmItPmtleXMsICIldSBmb3IgJXMiLCBzdGF0dXMsCisJCQkgICAgICAgcmVwbGFjZV9rZXkgPyAicmVwbGFjZSIgOiAiaW5zZXJ0Iik7CiAKLQkJLyoKLQkJICogYnNldF9zZWFyY2goKSByZXR1cm5zIHRoZSBmaXJzdCBrZXkgdGhhdCBpcyBzdHJpY3RseSBncmVhdGVyCi0JCSAqIHRoYW4gdGhlIHNlYXJjaCBrZXkgLSBidXQgZm9yIGJhY2sgbWVyZ2luZywgd2Ugd2FudCB0byBmaW5kCi0JCSAqIHRoZSBwcmV2aW91cyBrZXkuCi0JCSAqLwotCQlwcmV2ID0gTlVMTDsKLQkJbSA9IGJjaF9idHJlZV9pdGVyX2luaXQoYiwgJml0ZXIsIFBSRUNFRElOR19LRVkoJlNUQVJUX0tFWShrKSkpOworCQl0cmFjZV9iY2FjaGVfYnRyZWVfaW5zZXJ0X2tleShiLCBrLCByZXBsYWNlX2tleSAhPSBOVUxMLAorCQkJCQkgICAgICBzdGF0dXMpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQogCi0JCWlmIChmaXhfb3ZlcmxhcHBpbmdfZXh0ZW50cyhiLCBrLCAmaXRlciwgcmVwbGFjZV9rZXkpKSB7Ci0JCQlvcC0+aW5zZXJ0X2NvbGxpc2lvbiA9IHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KK3N0YXRpYyBzaXplX3QgaW5zZXJ0X3U2NHNfcmVtYWluaW5nKHN0cnVjdCBidHJlZSAqYikKK3sKKwlzc2l6ZV90IHJldCA9IGJjaF9idHJlZV9rZXlzX3U2NHNfcmVtYWluaW5nKCZiLT5rZXlzKTsKIAotCQlpZiAoS0VZX0RJUlRZKGspKQotCQkJYmNhY2hlX2Rldl9zZWN0b3JzX2RpcnR5X2FkZChiLT5jLCBLRVlfSU5PREUoayksCi0JCQkJCQkgICAgIEtFWV9TVEFSVChrKSwgS0VZX1NJWkUoaykpOworCS8qCisJICogTWlnaHQgbGFuZCBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4aXN0aW5nIGV4dGVudCBhbmQgaGF2ZSB0byBzcGxpdCBpdAorCSAqLworCWlmIChiLT5rZXlzLm9wcy0+aXNfZXh0ZW50cykKKwkJcmV0IC09IEtFWV9NQVhfVTY0UzsKIAotCQl3aGlsZSAobSAhPSBlbmQoaSkgJiYKLQkJICAgICAgIGJrZXlfY21wKGssICZTVEFSVF9LRVkobSkpID4gMCkKLQkJCXByZXYgPSBtLCBtID0gYmtleV9uZXh0KG0pOwotCi0JCWlmIChrZXlfbWVyZ2luZ19kaXNhYmxlZChiLT5jKSkKLQkJCWdvdG8gaW5zZXJ0OwotCi0JCS8qIHByZXYgaXMgaW4gdGhlIHRyZWUsIGlmIHdlIG1lcmdlIHdlJ3JlIGRvbmUgKi8KLQkJc3RhdHVzID0gQlRSRUVfSU5TRVJUX1NUQVRVU19CQUNLX01FUkdFOwotCQlpZiAocHJldiAmJgotCQkgICAgYmNoX2JrZXlfdHJ5X21lcmdlKGIsIHByZXYsIGspKQotCQkJZ290byBtZXJnZWQ7Ci0KLQkJc3RhdHVzID0gQlRSRUVfSU5TRVJUX1NUQVRVU19PVkVSV1JPVEU7Ci0JCWlmIChtICE9IGVuZChpKSAmJgotCQkgICAgS0VZX1BUUlMobSkgPT0gS0VZX1BUUlMoaykgJiYgIUtFWV9TSVpFKG0pKQotCQkJZ290byBjb3B5OwotCi0JCXN0YXR1cyA9IEJUUkVFX0lOU0VSVF9TVEFUVVNfRlJPTlRfTUVSR0U7Ci0JCWlmIChtICE9IGVuZChpKSAmJgotCQkgICAgYmNoX2JrZXlfdHJ5X21lcmdlKGIsIGssIG0pKQotCQkJZ290byBjb3B5OwotCX0gZWxzZSB7Ci0JCUJVR19PTihyZXBsYWNlX2tleSk7Ci0JCW0gPSBiY2hfYnNldF9zZWFyY2goYiwgJmItPnNldHNbYi0+bnNldHNdLCBrKTsKLQl9Ci0KLWluc2VydDoJc2hpZnRfa2V5cyhiLCBtLCBrKTsKLWNvcHk6CWJrZXlfY29weShtLCBrKTsKLW1lcmdlZDoKLQliY2hfY2hlY2tfa2V5cyhiLCAiJXUgZm9yICVzIiwgc3RhdHVzLAotCQkgICAgICAgcmVwbGFjZV9rZXkgPyAicmVwbGFjZSIgOiAiaW5zZXJ0Iik7Ci0KLQlpZiAoYi0+bGV2ZWwgJiYgIUtFWV9PRkZTRVQoaykpCi0JCWJ0cmVlX2N1cnJlbnRfd3JpdGUoYiktPnByaW9fYmxvY2tlZCsrOwotCi0JdHJhY2VfYmNhY2hlX2J0cmVlX2luc2VydF9rZXkoYiwgaywgcmVwbGFjZV9rZXkgIT0gTlVMTCwgc3RhdHVzKTsKLQotCXJldHVybiB0cnVlOworCXJldHVybiBtYXgocmV0LCAwTCk7CiB9CiAKIHN0YXRpYyBib29sIGJjaF9idHJlZV9pbnNlcnRfa2V5cyhzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3AsCkBAIC0yMDEwLDIxICsxODIxLDE5IEBACiAJCQkJICBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCiB7CiAJYm9vbCByZXQgPSBmYWxzZTsKLQlpbnQgb2xkc2l6ZSA9IGJjaF9jb3VudF9kYXRhKGIpOworCWludCBvbGRzaXplID0gYmNoX2NvdW50X2RhdGEoJmItPmtleXMpOwogCiAJd2hpbGUgKCFiY2hfa2V5bGlzdF9lbXB0eShpbnNlcnRfa2V5cykpIHsKLQkJc3RydWN0IGJzZXQgKmkgPSB3cml0ZV9ibG9jayhiKTsKIAkJc3RydWN0IGJrZXkgKmsgPSBpbnNlcnRfa2V5cy0+a2V5czsKIAotCQlpZiAoYi0+d3JpdHRlbiArIF9fc2V0X2Jsb2NrcyhpLCBpLT5rZXlzICsgYmtleV91NjRzKGspLCBiLT5jKQotCQkgICAgPiBidHJlZV9ibG9ja3MoYikpCisJCWlmIChia2V5X3U2NHMoaykgPiBpbnNlcnRfdTY0c19yZW1haW5pbmcoYikpCiAJCQlicmVhazsKIAogCQlpZiAoYmtleV9jbXAoaywgJmItPmtleSkgPD0gMCkgewogCQkJaWYgKCFiLT5sZXZlbCkKIAkJCQlia2V5X3B1dChiLT5jLCBrKTsKIAotCQkJcmV0IHw9IGJ0cmVlX2luc2VydF9rZXkoYiwgb3AsIGssIHJlcGxhY2Vfa2V5KTsKKwkJCXJldCB8PSBidHJlZV9pbnNlcnRfa2V5KGIsIGssIHJlcGxhY2Vfa2V5KTsKIAkJCWJjaF9rZXlsaXN0X3BvcF9mcm9udChpbnNlcnRfa2V5cyk7CiAJCX0gZWxzZSBpZiAoYmtleV9jbXAoJlNUQVJUX0tFWShrKSwgJmItPmtleSkgPCAwKSB7CiAJCQlCS0VZX1BBRERFRChrZXkpIHRlbXA7CkBAIC0yMDMzLDE2ICsxODQyLDE5IEBACiAJCQliY2hfY3V0X2JhY2soJmItPmtleSwgJnRlbXAua2V5KTsKIAkJCWJjaF9jdXRfZnJvbnQoJmItPmtleSwgaW5zZXJ0X2tleXMtPmtleXMpOwogCi0JCQlyZXQgfD0gYnRyZWVfaW5zZXJ0X2tleShiLCBvcCwgJnRlbXAua2V5LCByZXBsYWNlX2tleSk7CisJCQlyZXQgfD0gYnRyZWVfaW5zZXJ0X2tleShiLCAmdGVtcC5rZXksIHJlcGxhY2Vfa2V5KTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJYnJlYWs7CiAJCX0KIAl9CiAKKwlpZiAoIXJldCkKKwkJb3AtPmluc2VydF9jb2xsaXNpb24gPSB0cnVlOworCiAJQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eShpbnNlcnRfa2V5cykgJiYgYi0+bGV2ZWwpOwogCi0JQlVHX09OKGJjaF9jb3VudF9kYXRhKGIpIDwgb2xkc2l6ZSk7CisJQlVHX09OKGJjaF9jb3VudF9kYXRhKCZiLT5rZXlzKSA8IG9sZHNpemUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwNTksMTYgKzE4NzEsMjEgQEAKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKIAliY2hfa2V5bGlzdF9pbml0KCZwYXJlbnRfa2V5cyk7CiAKKwlpZiAoIWItPmxldmVsICYmCisJICAgIGJ0cmVlX2NoZWNrX3Jlc2VydmUoYiwgb3ApKQorCQlyZXR1cm4gLUVJTlRSOworCiAJbjEgPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGIsIHRydWUpOwogCWlmIChJU19FUlIobjEpKQogCQlnb3RvIGVycjsKIAotCXNwbGl0ID0gc2V0X2Jsb2NrcyhuMS0+c2V0c1swXS5kYXRhLCBuMS0+YykgPiAoYnRyZWVfYmxvY2tzKGIpICogNCkgLyA1OworCXNwbGl0ID0gc2V0X2Jsb2NrcyhidHJlZV9ic2V0X2ZpcnN0KG4xKSwKKwkJCSAgIGJsb2NrX2J5dGVzKG4xLT5jKSkgPiAoYnRyZWVfYmxvY2tzKGIpICogNCkgLyA1OwogCiAJaWYgKHNwbGl0KSB7CiAJCXVuc2lnbmVkIGtleXMgPSAwOwogCi0JCXRyYWNlX2JjYWNoZV9idHJlZV9ub2RlX3NwbGl0KGIsIG4xLT5zZXRzWzBdLmRhdGEtPmtleXMpOworCQl0cmFjZV9iY2FjaGVfYnRyZWVfbm9kZV9zcGxpdChiLCBidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyk7CiAKIAkJbjIgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhiLT5jLCBiLT5sZXZlbCwgdHJ1ZSk7CiAJCWlmIChJU19FUlIobjIpKQpAQCAtMjA4NywxOCArMTkwNCwyMCBAQAogCQkgKiBzZWFyY2ggdHJlZSB5ZXQKIAkJICovCiAKLQkJd2hpbGUgKGtleXMgPCAobjEtPnNldHNbMF0uZGF0YS0+a2V5cyAqIDMpIC8gNSkKLQkJCWtleXMgKz0gYmtleV91NjRzKG5vZGUobjEtPnNldHNbMF0uZGF0YSwga2V5cykpOworCQl3aGlsZSAoa2V5cyA8IChidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyAqIDMpIC8gNSkKKwkJCWtleXMgKz0gYmtleV91NjRzKGJzZXRfYmtleV9pZHgoYnRyZWVfYnNldF9maXJzdChuMSksCisJCQkJCQkJa2V5cykpOwogCi0JCWJrZXlfY29weV9rZXkoJm4xLT5rZXksIG5vZGUobjEtPnNldHNbMF0uZGF0YSwga2V5cykpOwotCQlrZXlzICs9IGJrZXlfdTY0cyhub2RlKG4xLT5zZXRzWzBdLmRhdGEsIGtleXMpKTsKKwkJYmtleV9jb3B5X2tleSgmbjEtPmtleSwKKwkJCSAgICAgIGJzZXRfYmtleV9pZHgoYnRyZWVfYnNldF9maXJzdChuMSksIGtleXMpKTsKKwkJa2V5cyArPSBia2V5X3U2NHMoYnNldF9ia2V5X2lkeChidHJlZV9ic2V0X2ZpcnN0KG4xKSwga2V5cykpOwogCi0JCW4yLT5zZXRzWzBdLmRhdGEtPmtleXMgPSBuMS0+c2V0c1swXS5kYXRhLT5rZXlzIC0ga2V5czsKLQkJbjEtPnNldHNbMF0uZGF0YS0+a2V5cyA9IGtleXM7CisJCWJ0cmVlX2JzZXRfZmlyc3QobjIpLT5rZXlzID0gYnRyZWVfYnNldF9maXJzdChuMSktPmtleXMgLSBrZXlzOworCQlidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyA9IGtleXM7CiAKLQkJbWVtY3B5KG4yLT5zZXRzWzBdLmRhdGEtPnN0YXJ0LAotCQkgICAgICAgZW5kKG4xLT5zZXRzWzBdLmRhdGEpLAotCQkgICAgICAgbjItPnNldHNbMF0uZGF0YS0+a2V5cyAqIHNpemVvZih1aW50NjRfdCkpOworCQltZW1jcHkoYnRyZWVfYnNldF9maXJzdChuMiktPnN0YXJ0LAorCQkgICAgICAgYnNldF9ia2V5X2xhc3QoYnRyZWVfYnNldF9maXJzdChuMSkpLAorCQkgICAgICAgYnRyZWVfYnNldF9maXJzdChuMiktPmtleXMgKiBzaXplb2YodWludDY0X3QpKTsKIAogCQlia2V5X2NvcHlfa2V5KCZuMi0+a2V5LCAmYi0+a2V5KTsKIApAQCAtMjEwNiw3ICsxOTI1LDcgQEAKIAkJYmNoX2J0cmVlX25vZGVfd3JpdGUobjIsICZjbCk7CiAJCXJ3X3VubG9jayh0cnVlLCBuMik7CiAJfSBlbHNlIHsKLQkJdHJhY2VfYmNhY2hlX2J0cmVlX25vZGVfY29tcGFjdChiLCBuMS0+c2V0c1swXS5kYXRhLT5rZXlzKTsKKwkJdHJhY2VfYmNhY2hlX2J0cmVlX25vZGVfY29tcGFjdChiLCBidHJlZV9ic2V0X2ZpcnN0KG4xKS0+a2V5cyk7CiAKIAkJYmNoX2J0cmVlX2luc2VydF9rZXlzKG4xLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KTsKIAl9CkBAIC0yMTQ5LDE4ICsxOTY4LDIxIEBACiAKIAlyZXR1cm4gMDsKIGVycl9mcmVlMjoKKwlia2V5X3B1dChiLT5jLCAmbjItPmtleSk7CiAJYnRyZWVfbm9kZV9mcmVlKG4yKTsKIAlyd191bmxvY2sodHJ1ZSwgbjIpOwogZXJyX2ZyZWUxOgorCWJrZXlfcHV0KGItPmMsICZuMS0+a2V5KTsKIAlidHJlZV9ub2RlX2ZyZWUobjEpOwogCXJ3X3VubG9jayh0cnVlLCBuMSk7CiBlcnI6CisJV0FSTigxLCAiYmNhY2hlOiBidHJlZSBzcGxpdCBmYWlsZWQiKTsKKwogCWlmIChuMyA9PSBFUlJfUFRSKC1FQUdBSU4pIHx8CiAJICAgIG4yID09IEVSUl9QVFIoLUVBR0FJTikgfHwKIAkgICAgbjEgPT0gRVJSX1BUUigtRUFHQUlOKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlwcl93YXJuKCJjb3VsZG4ndCBzcGxpdCIpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC0yMTcxLDcgKzE5OTMsNyBAQAogewogCUJVR19PTihiLT5sZXZlbCAmJiByZXBsYWNlX2tleSk7CiAKLQlpZiAoc2hvdWxkX3NwbGl0KGIpKSB7CisJaWYgKGJjaF9rZXlsaXN0X25rZXlzKGluc2VydF9rZXlzKSA+IGluc2VydF91NjRzX3JlbWFpbmluZyhiKSkgewogCQlpZiAoY3VycmVudC0+YmlvX2xpc3QpIHsKIAkJCW9wLT5sb2NrID0gYi0+Yy0+cm9vdC0+bGV2ZWwgKyAxOwogCQkJcmV0dXJuIC1FQUdBSU47CkBAIC0yMTgwLDExICsyMDAyLDEzIEBACiAJCQlyZXR1cm4gLUVJTlRSOwogCQl9IGVsc2UgewogCQkJLyogSW52YWxpZGF0ZWQgYWxsIGl0ZXJhdG9ycyAqLwotCQkJcmV0dXJuIGJ0cmVlX3NwbGl0KGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpID86Ci0JCQkJLUVJTlRSOworCQkJaW50IHJldCA9IGJ0cmVlX3NwbGl0KGIsIG9wLCBpbnNlcnRfa2V5cywgcmVwbGFjZV9rZXkpOworCisJCQlyZXR1cm4gYmNoX2tleWxpc3RfZW1wdHkoaW5zZXJ0X2tleXMpID8KKwkJCQkwIDogcmV0ID86IC1FSU5UUjsKIAkJfQogCX0gZWxzZSB7Ci0JCUJVR19PTih3cml0ZV9ibG9jayhiKSAhPSBiLT5zZXRzW2ItPm5zZXRzXS5kYXRhKTsKKwkJQlVHX09OKHdyaXRlX2Jsb2NrKGIpICE9IGJ0cmVlX2JzZXRfbGFzdChiKSk7CiAKIAkJaWYgKGJjaF9idHJlZV9pbnNlcnRfa2V5cyhiLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KSkgewogCQkJaWYgKCFiLT5sZXZlbCkKQEAgLTIzMjMsOSArMjE0Nyw5IEBACiAJCXN0cnVjdCBia2V5ICprOwogCQlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwogCi0JCWJjaF9idHJlZV9pdGVyX2luaXQoYiwgJml0ZXIsIGZyb20pOworCQliY2hfYnRyZWVfaXRlcl9pbml0KCZiLT5rZXlzLCAmaXRlciwgZnJvbSk7CiAKLQkJd2hpbGUgKChrID0gYmNoX2J0cmVlX2l0ZXJfbmV4dF9maWx0ZXIoJml0ZXIsIGIsCisJCXdoaWxlICgoayA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKCZpdGVyLCAmYi0+a2V5cywKIAkJCQkJCSAgICAgICBiY2hfcHRyX2JhZCkpKSB7CiAJCQlyZXQgPSBidHJlZShtYXBfbm9kZXNfcmVjdXJzZSwgaywgYiwKIAkJCQkgICAgb3AsIGZyb20sIGZuLCBmbGFncyk7CkBAIC0yMzU2LDkgKzIxODAsOSBAQAogCXN0cnVjdCBia2V5ICprOwogCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7CiAKLQliY2hfYnRyZWVfaXRlcl9pbml0KGIsICZpdGVyLCBmcm9tKTsKKwliY2hfYnRyZWVfaXRlcl9pbml0KCZiLT5rZXlzLCAmaXRlciwgZnJvbSk7CiAKLQl3aGlsZSAoKGsgPSBiY2hfYnRyZWVfaXRlcl9uZXh0X2ZpbHRlcigmaXRlciwgYiwgYmNoX3B0cl9iYWQpKSkgeworCXdoaWxlICgoayA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKCZpdGVyLCAmYi0+a2V5cywgYmNoX3B0cl9iYWQpKSkgewogCQlyZXQgPSAhYi0+bGV2ZWwKIAkJCT8gZm4ob3AsIGIsIGspCiAJCQk6IGJ0cmVlKG1hcF9rZXlzX3JlY3Vyc2UsIGssIGIsIG9wLCBmcm9tLCBmbiwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmgKaW5kZXggNzY3ZTc1NS4uYWYwNjVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5oCkBAIC0xMzAsMjAgKzEzMCwxMiBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXVpbnQxNl90CQl3cml0dGVuOwkvKiB3b3VsZCBiZSBuaWNlIHRvIGtpbGwgKi8KIAl1aW50OF90CQkJbGV2ZWw7Ci0JdWludDhfdAkJCW5zZXRzOwotCXVpbnQ4X3QJCQlwYWdlX29yZGVyOwogCi0JLyoKLQkgKiBTZXQgb2Ygc29ydGVkIGtleXMgLSB0aGUgcmVhbCBidHJlZSBub2RlIC0gcGx1cyBhIGJpbmFyeSBzZWFyY2ggdHJlZQotCSAqCi0JICogc2V0c1swXSBpcyBzcGVjaWFsOyBzZXRbMF0tPnRyZWUsIHNldFswXS0+cHJldiBhbmQgc2V0WzBdLT5kYXRhIHBvaW50Ci0JICogdG8gdGhlIG1lbW9yeSB3ZSBoYXZlIGFsbG9jYXRlZCBmb3IgdGhpcyBidHJlZSBub2RlLiBBZGRpdGlvbmFsbHksCi0JICogc2V0WzBdLT5kYXRhIHBvaW50cyB0byB0aGUgZW50aXJlIGJ0cmVlIG5vZGUgYXMgaXQgZXhpc3RzIG9uIGRpc2suCi0JICovCi0Jc3RydWN0IGJzZXRfdHJlZQlzZXRzW01BWF9CU0VUU107CisJc3RydWN0IGJ0cmVlX2tleXMJa2V5czsKIAogCS8qIEZvciBvdXRzdGFuZGluZyBidHJlZSB3cml0ZXMsIHVzZWQgYXMgYSBsb2NrIC0gcHJvdGVjdHMgd3JpdGVfaWR4ICovCi0Jc3RydWN0IGNsb3N1cmVfd2l0aF93YWl0bGlzdAlpbzsKKwlzdHJ1Y3QgY2xvc3VyZQkJaW87CisJc3RydWN0IHNlbWFwaG9yZQlpb19tdXRleDsKIAogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7CkBAIC0xNzksMjQgKzE3MSwxOSBAQAogCXJldHVybiBiLT53cml0ZXMgKyAoYnRyZWVfbm9kZV93cml0ZV9pZHgoYikgXiAxKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBic2V0X29mZnNldChzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBic2V0ICppKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnNldCAqYnRyZWVfYnNldF9maXJzdChzdHJ1Y3QgYnRyZWUgKmIpCiB7Ci0JcmV0dXJuICgoKHNpemVfdCkgaSkgLSAoKHNpemVfdCkgYi0+c2V0cy0+ZGF0YSkpID4+IDk7CisJcmV0dXJuIGItPmtleXMuc2V0LT5kYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBic2V0ICp3cml0ZV9ibG9jayhzdHJ1Y3QgYnRyZWUgKmIpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBic2V0ICpidHJlZV9ic2V0X2xhc3Qoc3RydWN0IGJ0cmVlICpiKQogewotCXJldHVybiAoKHZvaWQgKikgYi0+c2V0c1swXS5kYXRhKSArIGItPndyaXR0ZW4gKiBibG9ja19ieXRlcyhiLT5jKTsKKwlyZXR1cm4gYnNldF90cmVlX2xhc3QoJmItPmtleXMpLT5kYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYnNldF93cml0dGVuKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXRfdHJlZSAqdCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgYnNldF9ibG9ja19vZmZzZXQoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnNldCAqaSkKIHsKLQlyZXR1cm4gdC0+ZGF0YSA8IHdyaXRlX2Jsb2NrKGIpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYmtleV93cml0dGVuKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJrZXkgKmspCi17Ci0JcmV0dXJuIGsgPCB3cml0ZV9ibG9jayhiKS0+c3RhcnQ7CisJcmV0dXJuIGJzZXRfc2VjdG9yX29mZnNldCgmYi0+a2V5cywgaSkgPj4gYi0+Yy0+YmxvY2tfYml0czsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9nY19zZWN0b3JzKHN0cnVjdCBjYWNoZV9zZXQgKmMpCkBAIC0yMDQsMjEgKzE5MSw2IEBACiAJYXRvbWljX3NldCgmYy0+c2VjdG9yc190b19nYywgYy0+c2IuYnVja2V0X3NpemUgKiBjLT5uYnVja2V0cyAvIDE2KTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmtleSAqYmNoX2J0cmVlX2l0ZXJfaW5pdChzdHJ1Y3QgYnRyZWUgKmIsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKLQkJCQkJICAgICAgIHN0cnVjdCBia2V5ICpzZWFyY2gpCi17Ci0JcmV0dXJuIF9fYmNoX2J0cmVlX2l0ZXJfaW5pdChiLCBpdGVyLCBzZWFyY2gsIGItPnNldHMpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYmNoX3B0cl9pbnZhbGlkKHN0cnVjdCBidHJlZSAqYiwgY29uc3Qgc3RydWN0IGJrZXkgKmspCi17Ci0JaWYgKGItPmxldmVsKQotCQlyZXR1cm4gYmNoX2J0cmVlX3B0cl9pbnZhbGlkKGItPmMsIGspOwotCWVsc2UKLQkJcmV0dXJuIGJjaF9leHRlbnRfcHRyX2ludmFsaWQoYi0+Yywgayk7Ci19Ci0KIHZvaWQgYmtleV9wdXQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJrZXkgKmspOwogCiAvKiBMb29waW5nIG1hY3JvcyAqLwpAQCAtMjI5LDE3ICsyMDEsMTIgQEAKIAkgICAgIGl0ZXIrKykJCQkJCQkJXAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoKGIpLCAoYyktPmJ1Y2tldF9oYXNoICsgaXRlciwgaGFzaCkKIAotI2RlZmluZSBmb3JfZWFjaF9rZXlfZmlsdGVyKGIsIGssIGl0ZXIsIGZpbHRlcikJCQkJXAotCWZvciAoYmNoX2J0cmVlX2l0ZXJfaW5pdCgoYiksIChpdGVyKSwgTlVMTCk7CQkJXAotCSAgICAgKChrKSA9IGJjaF9idHJlZV9pdGVyX25leHRfZmlsdGVyKChpdGVyKSwgYiwgZmlsdGVyKSk7KQotCi0jZGVmaW5lIGZvcl9lYWNoX2tleShiLCBrLCBpdGVyKQkJCQkJXAotCWZvciAoYmNoX2J0cmVlX2l0ZXJfaW5pdCgoYiksIChpdGVyKSwgTlVMTCk7CQkJXAotCSAgICAgKChrKSA9IGJjaF9idHJlZV9pdGVyX25leHQoaXRlcikpOykKLQogLyogUmVjdXJzaW5nIGRvd24gdGhlIGJ0cmVlICovCiAKIHN0cnVjdCBidHJlZV9vcCB7CisJLyogZm9yIHdhaXRpbmcgb24gYnRyZWUgcmVzZXJ2ZSBpbiBidHJlZV9zcGxpdCgpICovCisJd2FpdF9xdWV1ZV90CQl3YWl0OworCiAJLyogQnRyZWUgbGV2ZWwgYXQgd2hpY2ggd2Ugc3RhcnQgdGFraW5nIHdyaXRlIGxvY2tzICovCiAJc2hvcnQJCQlsb2NrOwogCkBAIC0yNDksNiArMjE2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiY2hfYnRyZWVfb3BfaW5pdChzdHJ1Y3QgYnRyZWVfb3AgKm9wLCBpbnQgd3JpdGVfbG9ja19sZXZlbCkKIHsKIAltZW1zZXQob3AsIDAsIHNpemVvZihzdHJ1Y3QgYnRyZWVfb3ApKTsKKwlpbml0X3dhaXQoJm9wLT53YWl0KTsKIAlvcC0+bG9jayA9IHdyaXRlX2xvY2tfbGV2ZWw7CiB9CiAKQEAgLTI2Nyw3ICsyMzUsNyBAQAogCSh3ID8gdXBfd3JpdGUgOiB1cF9yZWFkKSgmYi0+bG9jayk7CiB9CiAKLXZvaWQgYmNoX2J0cmVlX25vZGVfcmVhZChzdHJ1Y3QgYnRyZWUgKik7Cit2b2lkIGJjaF9idHJlZV9ub2RlX3JlYWRfZG9uZShzdHJ1Y3QgYnRyZWUgKik7CiB2b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgY2xvc3VyZSAqKTsKIAogdm9pZCBiY2hfYnRyZWVfc2V0X3Jvb3Qoc3RydWN0IGJ0cmVlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvY2xvc3VyZS5jIGIvZHJpdmVycy9tZC9iY2FjaGUvY2xvc3VyZS5jCmluZGV4IGRmZmYyNDEuLjdhMjI4ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2Nsb3N1cmUuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9jbG9zdXJlLmMKQEAgLTExLDE5ICsxMSw2IEBACiAKICNpbmNsdWRlICJjbG9zdXJlLmgiCiAKLSNkZWZpbmUgQ0xfRklFTEQodHlwZSwgZmllbGQpCQkJCQlcCi0JY2FzZSBUWVBFXyAjIyB0eXBlOgkJCQkJXAotCXJldHVybiAmY29udGFpbmVyX29mKGNsLCBzdHJ1Y3QgdHlwZSwgY2wpLT5maWVsZAotCi1zdGF0aWMgc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QgKmNsb3N1cmVfd2FpdGxpc3Qoc3RydWN0IGNsb3N1cmUgKmNsKQotewotCXN3aXRjaCAoY2wtPnR5cGUpIHsKLQkJQ0xfRklFTEQoY2xvc3VyZV93aXRoX3dhaXRsaXN0LCB3YWl0KTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX3B1dF9hZnRlcl9zdWIoc3RydWN0IGNsb3N1cmUgKmNsLCBpbnQgZmxhZ3MpCiB7CiAJaW50IHIgPSBmbGFncyAmIENMT1NVUkVfUkVNQUlOSU5HX01BU0s7CkBAIC00MiwxNyArMjksMTAgQEAKIAkJCWNsb3N1cmVfcXVldWUoY2wpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IGNsb3N1cmUgKnBhcmVudCA9IGNsLT5wYXJlbnQ7Ci0JCQlzdHJ1Y3QgY2xvc3VyZV93YWl0bGlzdCAqd2FpdCA9IGNsb3N1cmVfd2FpdGxpc3QoY2wpOwogCQkJY2xvc3VyZV9mbiAqZGVzdHJ1Y3RvciA9IGNsLT5mbjsKIAogCQkJY2xvc3VyZV9kZWJ1Z19kZXN0cm95KGNsKTsKIAotCQkJc21wX21iKCk7Ci0JCQlhdG9taWNfc2V0KCZjbC0+cmVtYWluaW5nLCAtMSk7Ci0KLQkJCWlmICh3YWl0KQotCQkJCWNsb3N1cmVfd2FrZV91cCh3YWl0KTsKLQogCQkJaWYgKGRlc3RydWN0b3IpCiAJCQkJZGVzdHJ1Y3RvcihjbCk7CiAKQEAgLTY5LDE5ICs0OSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTChjbG9zdXJlX3N1Yik7CiAKKy8qKgorICogY2xvc3VyZV9wdXQgLSBkZWNyZW1lbnQgYSBjbG9zdXJlJ3MgcmVmY291bnQKKyAqLwogdm9pZCBjbG9zdXJlX3B1dChzdHJ1Y3QgY2xvc3VyZSAqY2wpCiB7CiAJY2xvc3VyZV9wdXRfYWZ0ZXJfc3ViKGNsLCBhdG9taWNfZGVjX3JldHVybigmY2wtPnJlbWFpbmluZykpOwogfQogRVhQT1JUX1NZTUJPTChjbG9zdXJlX3B1dCk7CiAKLXN0YXRpYyB2b2lkIHNldF93YWl0aW5nKHN0cnVjdCBjbG9zdXJlICpjbCwgdW5zaWduZWQgbG9uZyBmKQotewotI2lmZGVmIENPTkZJR19CQ0FDSEVfQ0xPU1VSRVNfREVCVUcKLQljbC0+d2FpdGluZ19vbiA9IGY7Ci0jZW5kaWYKLX0KLQorLyoqCisgKiBjbG9zdXJlX3dha2VfdXAgLSB3YWtlIHVwIGFsbCBjbG9zdXJlcyBvbiBhIHdhaXQgbGlzdCwgd2l0aG91dCBtZW1vcnkgYmFycmllcgorICovCiB2b2lkIF9fY2xvc3VyZV93YWtlX3VwKHN0cnVjdCBjbG9zdXJlX3dhaXRsaXN0ICp3YWl0X2xpc3QpCiB7CiAJc3RydWN0IGxsaXN0X25vZGUgKmxpc3Q7CkBAIC0xMDYsMjcgKzg1LDM0IEBACiAJCWNsID0gY29udGFpbmVyX29mKHJldmVyc2UsIHN0cnVjdCBjbG9zdXJlLCBsaXN0KTsKIAkJcmV2ZXJzZSA9IGxsaXN0X25leHQocmV2ZXJzZSk7CiAKLQkJc2V0X3dhaXRpbmcoY2wsIDApOworCQljbG9zdXJlX3NldF93YWl0aW5nKGNsLCAwKTsKIAkJY2xvc3VyZV9zdWIoY2wsIENMT1NVUkVfV0FJVElORyArIDEpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woX19jbG9zdXJlX3dha2VfdXApOwogCi1ib29sIGNsb3N1cmVfd2FpdChzdHJ1Y3QgY2xvc3VyZV93YWl0bGlzdCAqbGlzdCwgc3RydWN0IGNsb3N1cmUgKmNsKQorLyoqCisgKiBjbG9zdXJlX3dhaXQgLSBhZGQgYSBjbG9zdXJlIHRvIGEgd2FpdGxpc3QKKyAqCisgKiBAd2FpdGxpc3Qgd2lsbCBvd24gYSByZWYgb24gQGNsLCB3aGljaCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4KKyAqIGNsb3N1cmVfd2FrZV91cCgpIGlzIGNhbGxlZCBvbiBAd2FpdGxpc3QuCisgKgorICovCitib29sIGNsb3N1cmVfd2FpdChzdHJ1Y3QgY2xvc3VyZV93YWl0bGlzdCAqd2FpdGxpc3QsIHN0cnVjdCBjbG9zdXJlICpjbCkKIHsKIAlpZiAoYXRvbWljX3JlYWQoJmNsLT5yZW1haW5pbmcpICYgQ0xPU1VSRV9XQUlUSU5HKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlzZXRfd2FpdGluZyhjbCwgX1JFVF9JUF8pOworCWNsb3N1cmVfc2V0X3dhaXRpbmcoY2wsIF9SRVRfSVBfKTsKIAlhdG9taWNfYWRkKENMT1NVUkVfV0FJVElORyArIDEsICZjbC0+cmVtYWluaW5nKTsKLQlsbGlzdF9hZGQoJmNsLT5saXN0LCAmbGlzdC0+bGlzdCk7CisJbGxpc3RfYWRkKCZjbC0+bGlzdCwgJndhaXRsaXN0LT5saXN0KTsKIAogCXJldHVybiB0cnVlOwogfQogRVhQT1JUX1NZTUJPTChjbG9zdXJlX3dhaXQpOwogCiAvKioKLSAqIGNsb3N1cmVfc3luYygpIC0gc2xlZXAgdW50aWwgYSBjbG9zdXJlIGEgY2xvc3VyZSBoYXMgbm90aGluZyBsZWZ0IHRvIHdhaXQgb24KKyAqIGNsb3N1cmVfc3luYyAtIHNsZWVwIHVudGlsIGEgY2xvc3VyZSBhIGNsb3N1cmUgaGFzIG5vdGhpbmcgbGVmdCB0byB3YWl0IG9uCiAgKgogICogU2xlZXBzIHVudGlsIHRoZSByZWZjb3VudCBoaXRzIDEgLSB0aGUgdGhyZWFkIHRoYXQncyBydW5uaW5nIHRoZSBjbG9zdXJlIG93bnMKICAqIHRoZSBsYXN0IHJlZmNvdW50LgpAQCAtMTQ4LDQ2ICsxMzQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjbG9zdXJlX3N5bmMpOwogCi0vKioKLSAqIGNsb3N1cmVfdHJ5bG9jaygpIC0gdHJ5IHRvIGFjcXVpcmUgdGhlIGNsb3N1cmUsIHdpdGhvdXQgd2FpdGluZwotICogQGNsOgkJY2xvc3VyZSB0byBsb2NrCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbG9zdXJlIHdhcyBzdWNjZXNmdWxseSBsb2NrZWQuCi0gKi8KLWJvb2wgY2xvc3VyZV90cnlsb2NrKHN0cnVjdCBjbG9zdXJlICpjbCwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKLXsKLQlpZiAoYXRvbWljX2NtcHhjaGcoJmNsLT5yZW1haW5pbmcsIC0xLAotCQkJICAgQ0xPU1VSRV9SRU1BSU5JTkdfSU5JVElBTElaRVIpICE9IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlzbXBfbWIoKTsKLQotCWNsLT5wYXJlbnQgPSBwYXJlbnQ7Ci0JaWYgKHBhcmVudCkKLQkJY2xvc3VyZV9nZXQocGFyZW50KTsKLQotCWNsb3N1cmVfc2V0X3JldF9pcChjbCk7Ci0JY2xvc3VyZV9kZWJ1Z19jcmVhdGUoY2wpOwotCXJldHVybiB0cnVlOwotfQotRVhQT1JUX1NZTUJPTChjbG9zdXJlX3RyeWxvY2spOwotCi12b2lkIF9fY2xvc3VyZV9sb2NrKHN0cnVjdCBjbG9zdXJlICpjbCwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCwKLQkJICAgIHN0cnVjdCBjbG9zdXJlX3dhaXRsaXN0ICp3YWl0X2xpc3QpCi17Ci0Jc3RydWN0IGNsb3N1cmUgd2FpdDsKLQljbG9zdXJlX2luaXRfc3RhY2soJndhaXQpOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKGNsb3N1cmVfdHJ5bG9jayhjbCwgcGFyZW50KSkKLQkJCXJldHVybjsKLQotCQljbG9zdXJlX3dhaXRfZXZlbnQod2FpdF9saXN0LCAmd2FpdCwKLQkJCQkgICBhdG9taWNfcmVhZCgmY2wtPnJlbWFpbmluZykgPT0gLTEpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woX19jbG9zdXJlX2xvY2spOwotCiAjaWZkZWYgQ09ORklHX0JDQUNIRV9DTE9TVVJFU19ERUJVRwogCiBzdGF0aWMgTElTVF9IRUFEKGNsb3N1cmVfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9jbG9zdXJlLmggYi9kcml2ZXJzL21kL2JjYWNoZS9jbG9zdXJlLmgKaW5kZXggOTc2MmYxYi4uN2VmNzQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvY2xvc3VyZS5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2Nsb3N1cmUuaApAQCAtNzIsMzAgKzcyLDYgQEAKICAqIGNsb3N1cmUgLSBfYWx3YXlzXyB1c2UgY29udGludWVfYXQoKS4gRG9pbmcgc28gY29uc2lzdGVudGx5IHdpbGwgaGVscAogICogZWxpbWluYXRlIGFuIGVudGlyZSBjbGFzcyBvZiBwYXJ0aWN1bGFybHkgcGVybmljaW91cyByYWNlcy4KICAqCi0gKiBGb3IgYSBjbG9zdXJlIHRvIHdhaXQgb24gYW4gYXJiaXRyYXJ5IGV2ZW50LCB3ZSBuZWVkIHRvIGludHJvZHVjZSB3YWl0bGlzdHM6Ci0gKgotICogc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QgbGlzdDsKLSAqIGNsb3N1cmVfd2FpdF9ldmVudChsaXN0LCBjbCwgY29uZGl0aW9uKTsKLSAqIGNsb3N1cmVfd2FrZV91cCh3YWl0X2xpc3QpOwotICoKLSAqIFRoZXNlIHdvcmsgYW5hbGFnb3VzbHkgdG8gd2FpdF9ldmVudCgpIGFuZCB3YWtlX3VwKCkgLSBleGNlcHQgdGhhdCBpbnN0ZWFkIG9mCi0gKiBvcGVyYXRpbmcgb24gdGhlIGN1cnJlbnQgdGhyZWFkIChmb3Igd2FpdF9ldmVudCgpKSBhbmQgbGlzdHMgb2YgdGhyZWFkcywgdGhleQotICogb3BlcmF0ZSBvbiBhbiBleHBsaWNpdCBjbG9zdXJlIGFuZCBsaXN0cyBvZiBjbG9zdXJlcy4KLSAqCi0gKiBCZWNhdXNlIGl0J3MgYSBjbG9zdXJlIHdlIGNhbiBub3cgd2FpdCBlaXRoZXIgc3luY2hyb25vdXNseSBvcgotICogYXN5bmNocm9ub3VzbHkuIGNsb3N1cmVfd2FpdF9ldmVudCgpIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCi0gKiBjb25kaXRpb24sIGFuZCBpZiBpdCByZXR1cm5lZCBmYWxzZSBjb250aW51ZV9hdCgpIG9yIGNsb3N1cmVfc3luYygpIGNhbiBiZQotICogdXNlZCB0byB3YWl0IGZvciBpdCB0byBiZWNvbWUgdHJ1ZS4KLSAqCi0gKiBJdCdzIHVzZWZ1bCBmb3Igd2FpdGluZyBvbiB0aGluZ3Mgd2hlbiB5b3UgY2FuJ3Qgc2xlZXAgaW4gdGhlIGNvbnRleHQgaW4KLSAqIHdoaWNoIHlvdSBtdXN0IGNoZWNrIHRoZSBjb25kaXRpb24gKHBlcmhhcHMgYSBzcGlubG9jayBoZWxkLCBvciB5b3UgbWlnaHQgYmUKLSAqIGJlbmVhdGggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSAtIGluIHdoaWNoIGNhc2UgeW91IGNhbid0IHNsZWVwIG9uIElPKS4KLSAqCi0gKiBjbG9zdXJlX3dhaXRfZXZlbnQoKSB3aWxsIHdhaXQgZWl0aGVyIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHksCi0gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY2xvc3VyZSBpcyBpbiBibG9ja2luZyBtb2RlIG9yIG5vdC4gWW91IGNhbiBwaWNrIGEKLSAqIG1vZGUgZXhwbGljaXRseSB3aXRoIGNsb3N1cmVfd2FpdF9ldmVudF9zeW5jKCkgYW5kCi0gKiBjbG9zdXJlX3dhaXRfZXZlbnRfYXN5bmMoKSwgd2hpY2ggZG8ganVzdCB3aGF0IHlvdSBtaWdodCBleHBlY3QuCi0gKgogICogTGFzdGx5LCB5b3UgbWlnaHQgaGF2ZSBhIHdhaXQgbGlzdCBkZWRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBldmVudCwgYW5kIGhhdmUgbm8KICAqIG5lZWQgZm9yIHNwZWNpZnlpbmcgdGhlIGNvbmRpdGlvbiAtIHlvdSBqdXN0IHdhbnQgdG8gd2FpdCB1bnRpbCBzb21lb25lIHJ1bnMKICAqIGNsb3N1cmVfd2FrZV91cCgpIG9uIHRoZSBhcHByb3ByaWF0ZSB3YWl0IGxpc3QuIEluIHRoYXQgY2FzZSwganVzdCB1c2UKQEAgLTEyMSw0MCArOTcsNiBAQAogICogQWxsIHRoaXMgaW1wbGllcyB0aGF0IGEgY2xvc3VyZSBzaG91bGQgdHlwaWNhbGx5IGJlIGVtYmVkZGVkIGluIGEgcGFydGljdWxhcgogICogc3RydWN0ICh3aGljaCBpdHMgcmVmY291bnQgd2lsbCBub3JtYWxseSBjb250cm9sIHRoZSBsaWZldGltZSBvZiksIGFuZCB0aGF0CiAgKiBzdHJ1Y3QgY2FuIHZlcnkgbXVjaCBiZSB0aG91Z2h0IG9mIGFzIGEgc3RhY2sgZnJhbWUuCi0gKgotICogTG9ja2luZzoKLSAqCi0gKiBDbG9zdXJlcyBhcmUgYmFzZWQgb24gd29yayBpdGVtcyBidXQgdGhleSBjYW4gYmUgdGhvdWdodCBvZiBhcyBtb3JlIGxpa2UKLSAqIHRocmVhZHMgLSBpbiB0aGF0IGxpa2UgdGhyZWFkcyBhbmQgdW5saWtlIHdvcmsgaXRlbXMgdGhleSBoYXZlIGEgd2VsbAotICogZGVmaW5lZCBsaWZldGltZTsgdGhleSBhcmUgY3JlYXRlZCAod2l0aCBjbG9zdXJlX2luaXQoKSkgYW5kIGV2ZW50dWFsbHkKLSAqIGNvbXBsZXRlIGFmdGVyIGEgY29udGludWVfYXQoY2wsIE5VTEwsIE5VTEwpLgotICoKLSAqIFN1cHBvc2UgeW91J3ZlIGdvdCBzb21lIGxhcmdlciBzdHJ1Y3R1cmUgd2l0aCBhIGNsb3N1cmUgZW1iZWRkZWQgaW4gaXQgdGhhdCdzCi0gKiB1c2VkIGZvciBwZXJpb2RpY2FsbHkgZG9pbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiBZb3Ugb25seSB3YW50IG9uZSBnYXJiYWdlCi0gKiBjb2xsZWN0aW9uIGhhcHBlbmluZyBhdCBhIHRpbWUsIHNvIHRoZSBuYXR1cmFsIHRoaW5nIHRvIGRvIGlzIHByb3RlY3QgaXQgd2l0aAotICogYSBsb2NrLiBIb3dldmVyLCBpdCdzIGRpZmZpY3VsdCB0byB1c2UgYSBsb2NrIHByb3RlY3RpbmcgYSBjbG9zdXJlIGNvcnJlY3RseQotICogYmVjYXVzZSB0aGUgdW5sb2NrIHNob3VsZCBjb21lIGFmdGVyIHRoZSBsYXN0IGNvbnRpbnVlX3RvKCkgKGFkZGl0aW9uYWxseSwgaWYKLSAqIHlvdSdyZSB1c2luZyB0aGUgY2xvc3VyZSBhc3luY2hyb25vdXNseSBhIG11dGV4IHdvbid0IHdvcmsgc2luY2UgYSBtdXRleCBoYXMKLSAqIHRvIGJlIHVubG9ja2VkIGJ5IHRoZSBzYW1lIHByb2Nlc3MgdGhhdCBsb2NrZWQgaXQpLgotICoKLSAqIFNvIHRvIG1ha2UgaXQgbGVzcyBlcnJvciBwcm9uZSBhbmQgbW9yZSBlZmZpY2llbnQsIHdlIGFsc28gaGF2ZSB0aGUgYWJpbGl0eQotICogdG8gdXNlIGNsb3N1cmVzIGFzIGxvY2tzOgotICoKLSAqIGNsb3N1cmVfaW5pdF91bmxvY2tlZCgpOwotICogY2xvc3VyZV90cnlsb2NrKCk7Ci0gKgotICogVGhhdCdzIGFsbCB3ZSBuZWVkIGZvciB0cnlsb2NrKCkgLSB0aGUgbGFzdCBjbG9zdXJlX3B1dCgpIGltcGxpY2l0bHkgdW5sb2NrcwotICogaXQgZm9yIHlvdS4gIEJ1dCBmb3IgY2xvc3VyZV9sb2NrKCksIHdlIGFsc28gbmVlZCBhIHdhaXQgbGlzdDoKLSAqCi0gKiBzdHJ1Y3QgY2xvc3VyZV93aXRoX3dhaXRsaXN0IGZyb2JuaWNhdG9yX2NsOwotICoKLSAqIGNsb3N1cmVfaW5pdF91bmxvY2tlZCgmZnJvYm5pY2F0b3JfY2wpOwotICogY2xvc3VyZV9sb2NrKCZmcm9ibmljYXRvcl9jbCk7Ci0gKgotICogQSBjbG9zdXJlX3dpdGhfd2FpdGxpc3QgZW1iZWRzIGEgY2xvc3VyZSBhbmQgYSB3YWl0IGxpc3QgLSBtdWNoIGxpa2Ugc3RydWN0Ci0gKiBkZWxheWVkX3dvcmsgZW1iZWRzIGEgd29yayBpdGVtIGFuZCBhIHRpbWVyX2xpc3QuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMsIHVzZQotICogaXQgZXhhY3RseSBsaWtlIHlvdSB3b3VsZCBhIHJlZ3VsYXIgY2xvc3VyZSBhbmQgY2xvc3VyZV9wdXQoKSB3aWxsIG1hZ2ljYWxseQotICogaGFuZGxlIGV2ZXJ5dGhpbmcgZm9yIHlvdS4KICAqLwogCiBzdHJ1Y3QgY2xvc3VyZTsKQEAgLTE2NCwxMiArMTA2LDYgQEAKIAlzdHJ1Y3QgbGxpc3RfaGVhZAlsaXN0OwogfTsKIAotZW51bSBjbG9zdXJlX3R5cGUgewotCVRZUEVfY2xvc3VyZQkJCQk9IDAsCi0JVFlQRV9jbG9zdXJlX3dpdGhfd2FpdGxpc3QJCT0gMSwKLQlNQVhfQ0xPU1VSRV9UWVBFCQkJPSAxLAotfTsKLQogZW51bSBjbG9zdXJlX3N0YXRlIHsKIAkvKgogCSAqIENMT1NVUkVfV0FJVElORzogU2V0IGlmZiB0aGUgY2xvc3VyZSBpcyBvbiBhIHdhaXRsaXN0LiBNdXN0IGJlIHNldCBieQpAQCAtMjI0LDggKzE2MCw2IEBACiAKIAlhdG9taWNfdAkJcmVtYWluaW5nOwogCi0JZW51bSBjbG9zdXJlX3R5cGUJdHlwZTsKLQogI2lmZGVmIENPTkZJR19CQ0FDSEVfQ0xPU1VSRVNfREVCVUcKICNkZWZpbmUgQ0xPU1VSRV9NQUdJQ19ERUFECTB4YzA1NGRlYWQKICNkZWZpbmUgQ0xPU1VSRV9NQUdJQ19BTElWRQkweGMwNTRhMTFlCkBAIC0yMzcsMzQgKzE3MSwxMiBAQAogI2VuZGlmCiB9OwogCi1zdHJ1Y3QgY2xvc3VyZV93aXRoX3dhaXRsaXN0IHsKLQlzdHJ1Y3QgY2xvc3VyZQkJY2w7Ci0Jc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QJd2FpdDsKLX07Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnZhbGlkX2Nsb3N1cmVfdHlwZSh2b2lkKTsKLQotI2RlZmluZSBfX0NMT1NVUkVfVFlQRShjbCwgX3QpCQkJCQkJXAotCSAgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2YoY2wpLCBzdHJ1Y3QgX3QpCQlcCi0JCT8gVFlQRV8gIyMgX3QgOgkJCQkJCVwKLQotI2RlZmluZSBfX2Nsb3N1cmVfdHlwZShjbCkJCQkJCQlcCi0oCQkJCQkJCQkJXAotCV9fQ0xPU1VSRV9UWVBFKGNsLCBjbG9zdXJlKQkJCQkJXAotCV9fQ0xPU1VSRV9UWVBFKGNsLCBjbG9zdXJlX3dpdGhfd2FpdGxpc3QpCQkJXAotCWludmFsaWRfY2xvc3VyZV90eXBlKCkJCQkJCQlcCi0pCi0KIHZvaWQgY2xvc3VyZV9zdWIoc3RydWN0IGNsb3N1cmUgKmNsLCBpbnQgdik7CiB2b2lkIGNsb3N1cmVfcHV0KHN0cnVjdCBjbG9zdXJlICpjbCk7CiB2b2lkIF9fY2xvc3VyZV93YWtlX3VwKHN0cnVjdCBjbG9zdXJlX3dhaXRsaXN0ICpsaXN0KTsKIGJvb2wgY2xvc3VyZV93YWl0KHN0cnVjdCBjbG9zdXJlX3dhaXRsaXN0ICpsaXN0LCBzdHJ1Y3QgY2xvc3VyZSAqY2wpOwogdm9pZCBjbG9zdXJlX3N5bmMoc3RydWN0IGNsb3N1cmUgKmNsKTsKIAotYm9vbCBjbG9zdXJlX3RyeWxvY2soc3RydWN0IGNsb3N1cmUgKmNsLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KTsKLXZvaWQgX19jbG9zdXJlX2xvY2soc3RydWN0IGNsb3N1cmUgKmNsLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50LAotCQkgICAgc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QgKndhaXRfbGlzdCk7Ci0KICNpZmRlZiBDT05GSUdfQkNBQ0hFX0NMT1NVUkVTX0RFQlVHCiAKIHZvaWQgY2xvc3VyZV9kZWJ1Z19pbml0KHZvaWQpOwpAQCAtMjkzLDExNCArMjA1LDEzIEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfZ2V0KHN0cnVjdCBjbG9zdXJlICpjbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX3NldF93YWl0aW5nKHN0cnVjdCBjbG9zdXJlICpjbCwgdW5zaWduZWQgbG9uZyBmKQogewogI2lmZGVmIENPTkZJR19CQ0FDSEVfQ0xPU1VSRVNfREVCVUcKLQlCVUdfT04oKGF0b21pY19pbmNfcmV0dXJuKCZjbC0+cmVtYWluaW5nKSAmCi0JCUNMT1NVUkVfUkVNQUlOSU5HX01BU0spIDw9IDEpOwotI2Vsc2UKLQlhdG9taWNfaW5jKCZjbC0+cmVtYWluaW5nKTsKKwljbC0+d2FpdGluZ19vbiA9IGY7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfc2V0X3N0b3BwZWQoc3RydWN0IGNsb3N1cmUgKmNsKQotewotCWF0b21pY19zdWIoQ0xPU1VSRV9SVU5OSU5HLCAmY2wtPnJlbWFpbmluZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zdXJlX2lzX3VubG9ja2VkKHN0cnVjdCBjbG9zdXJlICpjbCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmNsLT5yZW1haW5pbmcpID09IC0xOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fY2xvc3VyZV9pbml0KHN0cnVjdCBjbG9zdXJlICpjbCwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCwKLQkJCQkgICBib29sIHJ1bm5pbmcpCi17Ci0JY2wtPnBhcmVudCA9IHBhcmVudDsKLQlpZiAocGFyZW50KQotCQljbG9zdXJlX2dldChwYXJlbnQpOwotCi0JaWYgKHJ1bm5pbmcpIHsKLQkJY2xvc3VyZV9kZWJ1Z19jcmVhdGUoY2wpOwotCQlhdG9taWNfc2V0KCZjbC0+cmVtYWluaW5nLCBDTE9TVVJFX1JFTUFJTklOR19JTklUSUFMSVpFUik7Ci0JfSBlbHNlCi0JCWF0b21pY19zZXQoJmNsLT5yZW1haW5pbmcsIC0xKTsKLQotCWNsb3N1cmVfc2V0X2lwKGNsKTsKLX0KLQotLyoKLSAqIEhhY2sgdG8gZ2V0IGF0IHRoZSBlbWJlZGRlZCBjbG9zdXJlIGlmIHRoZXJlIGlzIG9uZSwgYnkgZG9pbmcgYW4gdW5zYWZlIGNhc3Q6Ci0gKiB0aGUgcmVzdWx0IG9mIF9fY2xvc3VyZV90eXBlKCkgaXMgdGhyb3duIGF3YXksIGl0J3MgdXNlZCBtZXJlbHkgZm9yIHR5cGUKLSAqIGNoZWNraW5nLgotICovCi0jZGVmaW5lIF9fdG9faW50ZXJuYWxfY2xvc3VyZShjbCkJCQkJXAotKHsJCQkJCQkJCVwKLQlCVUlMRF9CVUdfT04oX19jbG9zdXJlX3R5cGUoKmNsKSA+IE1BWF9DTE9TVVJFX1RZUEUpOwlcCi0JKHN0cnVjdCBjbG9zdXJlICopIGNsOwkJCQkJXAotfSkKLQotI2RlZmluZSBjbG9zdXJlX2luaXRfdHlwZShjbCwgcGFyZW50LCBydW5uaW5nKQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlzdHJ1Y3QgY2xvc3VyZSAqX2NsID0gX190b19pbnRlcm5hbF9jbG9zdXJlKGNsKTsJXAotCV9jbC0+dHlwZSA9IF9fY2xvc3VyZV90eXBlKCooY2wpKTsJCQlcCi0JZG9fY2xvc3VyZV9pbml0KF9jbCwgcGFyZW50LCBydW5uaW5nKTsJCQlcCi19IHdoaWxlICgwKQotCi0vKioKLSAqIF9fY2xvc3VyZV9pbml0KCkgLSBJbml0aWFsaXplIGEgY2xvc3VyZSwgc2tpcHBpbmcgdGhlIG1lbXNldCgpCi0gKgotICogTWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBjbG9zdXJlX2luaXQoKSB3aGVuIG1lbW9yeSBoYXMgYWxyZWFkeSBiZWVuIHplcm9lZC4KLSAqLwotI2RlZmluZSBfX2Nsb3N1cmVfaW5pdChjbCwgcGFyZW50KQkJCQlcCi0JY2xvc3VyZV9pbml0X3R5cGUoY2wsIHBhcmVudCwgdHJ1ZSkKLQotLyoqCi0gKiBjbG9zdXJlX2luaXQoKSAtIEluaXRpYWxpemUgYSBjbG9zdXJlLCBzZXR0aW5nIHRoZSByZWZjb3VudCB0byAxCi0gKiBAY2w6CQljbG9zdXJlIHRvIGluaXRpYWxpemUKLSAqIEBwYXJlbnQ6CXBhcmVudCBvZiB0aGUgbmV3IGNsb3N1cmUuIGNsIHdpbGwgdGFrZSBhIHJlZmNvdW50IG9uIGl0IGZvciBpdHMKLSAqCQlsaWZldGltZTsgbWF5IGJlIE5VTEwuCi0gKi8KLSNkZWZpbmUgY2xvc3VyZV9pbml0KGNsLCBwYXJlbnQpCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQltZW1zZXQoKGNsKSwgMCwgc2l6ZW9mKCooY2wpKSk7CQkJCVwKLQlfX2Nsb3N1cmVfaW5pdChjbCwgcGFyZW50KTsJCQkJXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfaW5pdF9zdGFjayhzdHJ1Y3QgY2xvc3VyZSAqY2wpCi17Ci0JbWVtc2V0KGNsLCAwLCBzaXplb2Yoc3RydWN0IGNsb3N1cmUpKTsKLQlhdG9taWNfc2V0KCZjbC0+cmVtYWluaW5nLCBDTE9TVVJFX1JFTUFJTklOR19JTklUSUFMSVpFUnxDTE9TVVJFX1NUQUNLKTsKLX0KLQotLyoqCi0gKiBjbG9zdXJlX2luaXRfdW5sb2NrZWQoKSAtIEluaXRpYWxpemUgYSBjbG9zdXJlIGJ1dCBsZWF2ZSBpdCB1bmxvY2tlZC4KLSAqIEBjbDoJCWNsb3N1cmUgdG8gaW5pdGlhbGl6ZQotICoKLSAqIEZvciB3aGVuIHRoZSBjbG9zdXJlIHdpbGwgYmUgdXNlZCBhcyBhIGxvY2suIFRoZSBjbG9zdXJlIG1heSBub3QgYmUgdXNlZAotICogdW50aWwgYWZ0ZXIgYSBjbG9zdXJlX2xvY2soKSBvciBjbG9zdXJlX3RyeWxvY2soKS4KLSAqLwotI2RlZmluZSBjbG9zdXJlX2luaXRfdW5sb2NrZWQoY2wpCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQltZW1zZXQoKGNsKSwgMCwgc2l6ZW9mKCooY2wpKSk7CQkJCVwKLQljbG9zdXJlX2luaXRfdHlwZShjbCwgTlVMTCwgZmFsc2UpOwkJCVwKLX0gd2hpbGUgKDApCi0KLS8qKgotICogY2xvc3VyZV9sb2NrKCkgLSBsb2NrIGFuZCBpbml0aWFsaXplIGEgY2xvc3VyZS4KLSAqIEBjbDoJCXRoZSBjbG9zdXJlIHRvIGxvY2sKLSAqIEBwYXJlbnQ6CXRoZSBuZXcgcGFyZW50IGZvciB0aGlzIGNsb3N1cmUKLSAqCi0gKiBUaGUgY2xvc3VyZSBtdXN0IGJlIG9mIG9uZSBvZiB0aGUgdHlwZXMgdGhhdCBoYXMgYSB3YWl0bGlzdCAob3RoZXJ3aXNlIHdlCi0gKiB3b3VsZG4ndCBiZSBhYmxlIHRvIHNsZWVwIG9uIGNvbnRlbnRpb24pLgotICoKLSAqIEBwYXJlbnQgaGFzIGV4YWN0bHkgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBjbG9zdXJlX2luaXQoKTsgaWYgbm9uIG51bGwsIHRoZQotICogY2xvc3VyZSB3aWxsIHRha2UgYSByZWZlcmVuY2Ugb24gQHBhcmVudCB3aGljaCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gaXQgaXMKLSAqIHVubG9ja2VkLgotICovCi0jZGVmaW5lIGNsb3N1cmVfbG9jayhjbCwgcGFyZW50KQkJCQlcCi0JX19jbG9zdXJlX2xvY2soX190b19pbnRlcm5hbF9jbG9zdXJlKGNsKSwgcGFyZW50LCAmKGNsKS0+d2FpdCkKLQogc3RhdGljIGlubGluZSB2b2lkIF9fY2xvc3VyZV9lbmRfc2xlZXAoc3RydWN0IGNsb3N1cmUgKmNsKQogewogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKQEAgLTQxOSw2NSArMjMwLDkgQEAKIAkJYXRvbWljX2FkZChDTE9TVVJFX1NMRUVQSU5HLCAmY2wtPnJlbWFpbmluZyk7CiB9CiAKLS8qKgotICogY2xvc3VyZV93YWtlX3VwKCkgLSB3YWtlIHVwIGFsbCBjbG9zdXJlcyBvbiBhIHdhaXQgbGlzdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfd2FrZV91cChzdHJ1Y3QgY2xvc3VyZV93YWl0bGlzdCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX3NldF9zdG9wcGVkKHN0cnVjdCBjbG9zdXJlICpjbCkKIHsKLQlzbXBfbWIoKTsKLQlfX2Nsb3N1cmVfd2FrZV91cChsaXN0KTsKLX0KLQotLyoKLSAqIFdhaXQgb24gYW4gZXZlbnQsIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgLSBhbmFsb2dvdXMgdG8gd2FpdF9ldmVudCgpCi0gKiBidXQgZm9yIGNsb3N1cmVzLgotICoKLSAqIFRoZSBsb29wIGlzIG9kZGx5IHN0cnVjdHVyZWQgc28gYXMgdG8gYXZvaWQgYSByYWNlOyB3ZSBtdXN0IGNoZWNrIHRoZQotICogY29uZGl0aW9uIGFnYWluIGFmdGVyIHdlJ3ZlIGFkZGVkIG91cnNlbGYgdG8gdGhlIHdhaXRsaXN0LiBXZSBrbm93IGlmIHdlIHdlcmUKLSAqIGFscmVhZHkgb24gdGhlIHdhaXRsaXN0IGJlY2F1c2UgY2xvc3VyZV93YWl0KCkgcmV0dXJucyBmYWxzZTsgdGh1cywgd2Ugb25seQotICogc2NoZWR1bGUgb3IgYnJlYWsgaWYgY2xvc3VyZV93YWl0KCkgcmV0dXJucyBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlLCB3ZQotICoganVzdCBsb29wIGFnYWluIC0gcmVjaGVja2luZyB0aGUgY29uZGl0aW9uLgotICoKLSAqIFRoZSBfX2Nsb3N1cmVfd2FrZV91cCgpIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG1heSByYWNlIHdpdGggdGhlIGV2ZW50Ci0gKiBiZWNvbWluZyB0cnVlOyBpLmUuIHdlIHNlZSBldmVudCBmYWxzZSAtPiB3YWl0IC0+IHJlY2hlY2sgY29uZGl0aW9uLCBidXQgdGhlCi0gKiB0aHJlYWQgdGhhdCBtYWRlIHRoZSBldmVudCB0cnVlIG1heSBoYXZlIGNhbGxlZCBjbG9zdXJlX3dha2VfdXAoKSBiZWZvcmUgd2UKLSAqIGFkZGVkIG91cnNlbGYgdG8gdGhlIHdhaXQgbGlzdC4KLSAqCi0gKiBXZSBoYXZlIHRvIGNhbGwgY2xvc3VyZV9zeW5jKCkgYXQgdGhlIGVuZCBpbnN0ZWFkIG9mIGp1c3QKLSAqIF9fY2xvc3VyZV9lbmRfc2xlZXAoKSBiZWNhdXNlIGEgZGlmZmVyZW50IHRocmVhZCBtaWdodCd2ZSBjYWxsZWQKLSAqIGNsb3N1cmVfd2FrZV91cCgpIGJlZm9yZSB1cyBhbmQgZ290dGVuIHByZWVtcHRlZCBiZWZvcmUgdGhleSBkcm9wcGVkIHRoZQotICogcmVmY291bnQgb24gb3VyIGNsb3N1cmUuIElmIHRoaXMgd2FzIGEgc3RhY2sgYWxsb2NhdGVkIGNsb3N1cmUsIHRoYXQgd291bGQgYmUKLSAqIGJhZC4KLSAqLwotI2RlZmluZSBjbG9zdXJlX3dhaXRfZXZlbnQobGlzdCwgY2wsIGNvbmRpdGlvbikJCQkJXAotKHsJCQkJCQkJCQlcCi0JdHlwZW9mKGNvbmRpdGlvbikgcmV0OwkJCQkJCVwKLQkJCQkJCQkJCVwKLQl3aGlsZSAoMSkgewkJCQkJCQlcCi0JCXJldCA9IChjb25kaXRpb24pOwkJCQkJXAotCQlpZiAocmV0KSB7CQkJCQkJXAotCQkJX19jbG9zdXJlX3dha2VfdXAobGlzdCk7CQkJXAotCQkJY2xvc3VyZV9zeW5jKGNsKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQl9CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkJX19jbG9zdXJlX3N0YXJ0X3NsZWVwKGNsKTsJCQkJXAotCQkJCQkJCQkJXAotCQlpZiAoIWNsb3N1cmVfd2FpdChsaXN0LCBjbCkpCQkJCVwKLQkJCXNjaGVkdWxlKCk7CQkJCQlcCi0JfQkJCQkJCQkJXAotCQkJCQkJCQkJXAotCXJldDsJCQkJCQkJCVwKLX0pCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX3F1ZXVlKHN0cnVjdCBjbG9zdXJlICpjbCkKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBjbC0+d3E7Ci0JaWYgKHdxKSB7Ci0JCUlOSVRfV09SSygmY2wtPndvcmssIGNsLT53b3JrLmZ1bmMpOwotCQlCVUdfT04oIXF1ZXVlX3dvcmsod3EsICZjbC0+d29yaykpOwotCX0gZWxzZQotCQljbC0+Zm4oY2wpOworCWF0b21pY19zdWIoQ0xPU1VSRV9SVU5OSU5HLCAmY2wtPnJlbWFpbmluZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2xvc3VyZV9mbihzdHJ1Y3QgY2xvc3VyZSAqY2wsIGNsb3N1cmVfZm4gKmZuLApAQCAtNDkxLDYgKzI0Niw3NiBAQAogCXNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfcXVldWUoc3RydWN0IGNsb3N1cmUgKmNsKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGNsLT53cTsKKwlpZiAod3EpIHsKKwkJSU5JVF9XT1JLKCZjbC0+d29yaywgY2wtPndvcmsuZnVuYyk7CisJCUJVR19PTighcXVldWVfd29yayh3cSwgJmNsLT53b3JrKSk7CisJfSBlbHNlCisJCWNsLT5mbihjbCk7Cit9CisKKy8qKgorICogY2xvc3VyZV9nZXQgLSBpbmNyZW1lbnQgYSBjbG9zdXJlJ3MgcmVmY291bnQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfZ2V0KHN0cnVjdCBjbG9zdXJlICpjbCkKK3sKKyNpZmRlZiBDT05GSUdfQkNBQ0hFX0NMT1NVUkVTX0RFQlVHCisJQlVHX09OKChhdG9taWNfaW5jX3JldHVybigmY2wtPnJlbWFpbmluZykgJgorCQlDTE9TVVJFX1JFTUFJTklOR19NQVNLKSA8PSAxKTsKKyNlbHNlCisJYXRvbWljX2luYygmY2wtPnJlbWFpbmluZyk7CisjZW5kaWYKK30KKworLyoqCisgKiBjbG9zdXJlX2luaXQgLSBJbml0aWFsaXplIGEgY2xvc3VyZSwgc2V0dGluZyB0aGUgcmVmY291bnQgdG8gMQorICogQGNsOgkJY2xvc3VyZSB0byBpbml0aWFsaXplCisgKiBAcGFyZW50OglwYXJlbnQgb2YgdGhlIG5ldyBjbG9zdXJlLiBjbCB3aWxsIHRha2UgYSByZWZjb3VudCBvbiBpdCBmb3IgaXRzCisgKgkJbGlmZXRpbWU7IG1heSBiZSBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc3VyZV9pbml0KHN0cnVjdCBjbG9zdXJlICpjbCwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKK3sKKwltZW1zZXQoY2wsIDAsIHNpemVvZihzdHJ1Y3QgY2xvc3VyZSkpOworCWNsLT5wYXJlbnQgPSBwYXJlbnQ7CisJaWYgKHBhcmVudCkKKwkJY2xvc3VyZV9nZXQocGFyZW50KTsKKworCWF0b21pY19zZXQoJmNsLT5yZW1haW5pbmcsIENMT1NVUkVfUkVNQUlOSU5HX0lOSVRJQUxJWkVSKTsKKworCWNsb3N1cmVfZGVidWdfY3JlYXRlKGNsKTsKKwljbG9zdXJlX3NldF9pcChjbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX2luaXRfc3RhY2soc3RydWN0IGNsb3N1cmUgKmNsKQoreworCW1lbXNldChjbCwgMCwgc2l6ZW9mKHN0cnVjdCBjbG9zdXJlKSk7CisJYXRvbWljX3NldCgmY2wtPnJlbWFpbmluZywgQ0xPU1VSRV9SRU1BSU5JTkdfSU5JVElBTElaRVJ8Q0xPU1VSRV9TVEFDSyk7Cit9CisKKy8qKgorICogY2xvc3VyZV93YWtlX3VwIC0gd2FrZSB1cCBhbGwgY2xvc3VyZXMgb24gYSB3YWl0IGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zdXJlX3dha2VfdXAoc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QgKmxpc3QpCit7CisJc21wX21iKCk7CisJX19jbG9zdXJlX3dha2VfdXAobGlzdCk7Cit9CisKKy8qKgorICogY29udGludWVfYXQgLSBqdW1wIHRvIGFub3RoZXIgZnVuY3Rpb24gd2l0aCBiYXJyaWVyCisgKgorICogQWZ0ZXIgQGNsIGlzIG5vIGxvbmdlciB3YWl0aW5nIG9uIGFueXRoaW5nIChpLmUuIGFsbCBvdXRzdGFuZGluZyByZWZzIGhhdmUKKyAqIGJlZW4gZHJvcHBlZCB3aXRoIGNsb3N1cmVfcHV0KCkpLCBpdCB3aWxsIHJlc3VtZSBleGVjdXRpb24gYXQgQGZuIHJ1bm5pbmcgb3V0CisgKiBvZiBAd3EgKG9yLCBpZiBAd3EgaXMgTlVMTCwgQGZuIHdpbGwgYmUgY2FsbGVkIGJ5IGNsb3N1cmVfcHV0KCkgZGlyZWN0bHkpLgorICoKKyAqIE5PVEU6IFRoaXMgbWFjcm8gZXhwYW5kcyB0byBhIHJldHVybiBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiEKKyAqCisgKiBUaGlzIGlzIGJlY2F1c2UgYWZ0ZXIgY2FsbGluZyBjb250aW51ZV9hdCgpIHlvdSBubyBsb25nZXIgaGF2ZSBhIHJlZiBvbiBAY2wsCisgKiBhbmQgd2hhdGV2ZXIgQGNsIG93bnMgbWF5IGJlIGZyZWVkIG91dCBmcm9tIHVuZGVyIHlvdSAtIGEgcnVubmluZyBjbG9zdXJlIGZuCisgKiBoYXMgYSByZWYgb24gaXRzIG93biBjbG9zdXJlIHdoaWNoIGNvbnRpbnVlX2F0KCkgZHJvcHMuCisgKi8KICNkZWZpbmUgY29udGludWVfYXQoX2NsLCBfZm4sIF93cSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc2V0X2Nsb3N1cmVfZm4oX2NsLCBfZm4sIF93cSk7CQkJCQlcCkBAIC00OTgsOCArMzIzLDI4IEBACiAJcmV0dXJuOwkJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorLyoqCisgKiBjbG9zdXJlX3JldHVybiAtIGZpbmlzaCBleGVjdXRpb24gb2YgYSBjbG9zdXJlCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgQGNsIGlzIGZpbmlzaGVkOiB3aGVuIGFsbCBvdXRzdGFuZGluZyByZWZzIG9uCisgKiBAY2wgaGF2ZSBiZWVuIGRyb3BwZWQgQGNsJ3MgcmVmIG9uIGl0cyBwYXJlbnQgY2xvc3VyZSAoYXMgcGFzc2VkIHRvCisgKiBjbG9zdXJlX2luaXQoKSkgd2lsbCBiZSBkcm9wcGVkLCBpZiBvbmUgd2FzIHNwZWNpZmllZCAtIHRodXMgdGhpcyBjYW4gYmUKKyAqIHRob3VnaHQgb2YgYXMgcmV0dXJuaW5nIHRvIHRoZSBwYXJlbnQgY2xvc3VyZS4KKyAqLwogI2RlZmluZSBjbG9zdXJlX3JldHVybihfY2wpCWNvbnRpbnVlX2F0KChfY2wpLCBOVUxMLCBOVUxMKQogCisvKioKKyAqIGNvbnRpbnVlX2F0X25vYmFycmllciAtIGp1bXAgdG8gYW5vdGhlciBmdW5jdGlvbiB3aXRob3V0IGJhcnJpZXIKKyAqCisgKiBDYXVzZXMgQGZuIHRvIGJlIGV4ZWN1dGVkIG91dCBvZiBAY2wsIGluIEB3cSBjb250ZXh0IChvciBjYWxsZWQgZGlyZWN0bHkgaWYKKyAqIEB3cSBpcyBOVUxMKS4KKyAqCisgKiBOT1RFOiBsaWtlIGNvbnRpbnVlX2F0KCksIHRoaXMgbWFjcm8gZXhwYW5kcyB0byBhIHJldHVybiBpbiB0aGUgY2FsbGVyIQorICoKKyAqIFRoZSByZWYgdGhlIGNhbGxlciBvZiBjb250aW51ZV9hdF9ub2JhcnJpZXIoKSBoYWQgb24gQGNsIGlzIG5vdyBvd25lZCBieSBAZm4sCisgKiB0aHVzIGl0J3Mgbm90IHNhZmUgdG8gdG91Y2ggYW55dGhpbmcgcHJvdGVjdGVkIGJ5IEBjbCBhZnRlciBhCisgKiBjb250aW51ZV9hdF9ub2JhcnJpZXIoKS4KKyAqLwogI2RlZmluZSBjb250aW51ZV9hdF9ub2JhcnJpZXIoX2NsLCBfZm4sIF93cSkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlzZXRfY2xvc3VyZV9mbihfY2wsIF9mbiwgX3dxKTsJCQkJCVwKQEAgLTUwNyw2ICszNTIsMTUgQEAKIAlyZXR1cm47CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCisvKioKKyAqIGNsb3N1cmVfcmV0dXJuIC0gZmluaXNoIGV4ZWN1dGlvbiBvZiBhIGNsb3N1cmUsIHdpdGggZGVzdHJ1Y3RvcgorICoKKyAqIFdvcmtzIGxpa2UgY2xvc3VyZV9yZXR1cm4oKSwgZXhjZXB0IEBkZXN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdoZW4gYWxsCisgKiBvdXRzdGFuZGluZyByZWZzIG9uIEBjbCBoYXZlIGJlZW4gZHJvcHBlZDsgQGRlc3RydWN0b3IgbWF5IGJlIHVzZWQgdG8gc2FmZWx5CisgKiBmcmVlIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgQGNsLCBhbmQgaXQgaXMgY2FsbGVkIHdpdGggdGhlIHJlZiBvbiB0aGUgcGFyZW50CisgKiBjbG9zdXJlIHN0aWxsIGhlbGQgLSBzbyBAZGVzdHJ1Y3RvciBjb3VsZCBzYWZlbHkgcmV0dXJuIGFuIGl0ZW0gdG8gYQorICogZnJlZWxpc3QgcHJvdGVjdGVkIGJ5IEBjbCdzIHBhcmVudC4KKyAqLwogI2RlZmluZSBjbG9zdXJlX3JldHVybl93aXRoX2Rlc3RydWN0b3IoX2NsLCBfZGVzdHJ1Y3RvcikJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc2V0X2Nsb3N1cmVfZm4oX2NsLCBfZGVzdHJ1Y3RvciwgTlVMTCk7CQkJCVwKQEAgLTUxNCw2ICszNjgsMTMgQEAKIAlyZXR1cm47CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCisvKioKKyAqIGNsb3N1cmVfY2FsbCAtIGV4ZWN1dGUgQGZuIG91dCBvZiBhIG5ldywgdW5pbml0aWFsaXplZCBjbG9zdXJlCisgKgorICogVHlwaWNhbGx5IHVzZWQgd2hlbiBydW5uaW5nIG91dCBvZiBvbmUgY2xvc3VyZSwgYW5kIHdlIHdhbnQgdG8gcnVuIEBmbgorICogYXN5bmNocm9ub3VzbHkgb3V0IG9mIGEgbmV3IGNsb3N1cmUgLSBAcGFyZW50IHdpbGwgdGhlbiB3YWl0IGZvciBAY2wgdG8KKyAqIGZpbmlzaC4KKyAqLwogc3RhdGljIGlubGluZSB2b2lkIGNsb3N1cmVfY2FsbChzdHJ1Y3QgY2xvc3VyZSAqY2wsIGNsb3N1cmVfZm4gZm4sCiAJCQkJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAogCQkJCXN0cnVjdCBjbG9zdXJlICpwYXJlbnQpCkBAIC01MjIsMTIgKzM4Myw0IEBACiAJY29udGludWVfYXRfbm9iYXJyaWVyKGNsLCBmbiwgd3EpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xvc3VyZV90cnlsb2NrX2NhbGwoc3RydWN0IGNsb3N1cmUgKmNsLCBjbG9zdXJlX2ZuIGZuLAotCQkJCQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCi0JCQkJCXN0cnVjdCBjbG9zdXJlICpwYXJlbnQpCi17Ci0JaWYgKGNsb3N1cmVfdHJ5bG9jayhjbCwgcGFyZW50KSkKLQkJY29udGludWVfYXRfbm9iYXJyaWVyKGNsLCBmbiwgd3EpOwotfQotCiAjZW5kaWYgLyogX0xJTlVYX0NMT1NVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2RlYnVnLmMKaW5kZXggMjY0ZmNmYi4uOGIxZjFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9kZWJ1Zy5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgImJjYWNoZS5oIgogI2luY2x1ZGUgImJ0cmVlLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJleHRlbnRzLmgiCiAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpAQCAtMTcsMTYzICsxOCw5NiBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWc7CiAKLWNvbnN0IGNoYXIgKmJjaF9wdHJfc3RhdHVzKHN0cnVjdCBjYWNoZV9zZXQgKmMsIGNvbnN0IHN0cnVjdCBia2V5ICprKQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKLQkJaWYgKHB0cl9hdmFpbGFibGUoYywgaywgaSkpIHsKLQkJCXN0cnVjdCBjYWNoZSAqY2EgPSBQVFJfQ0FDSEUoYywgaywgaSk7Ci0JCQlzaXplX3QgYnVja2V0ID0gUFRSX0JVQ0tFVF9OUihjLCBrLCBpKTsKLQkJCXNpemVfdCByID0gYnVja2V0X3JlbWFpbmRlcihjLCBQVFJfT0ZGU0VUKGssIGkpKTsKLQotCQkJaWYgKEtFWV9TSVpFKGspICsgciA+IGMtPnNiLmJ1Y2tldF9zaXplKQotCQkJCXJldHVybiAiYmFkLCBsZW5ndGggdG9vIGJpZyI7Ci0JCQlpZiAoYnVja2V0IDwgIGNhLT5zYi5maXJzdF9idWNrZXQpCi0JCQkJcmV0dXJuICJiYWQsIHNob3J0IG9mZnNldCI7Ci0JCQlpZiAoYnVja2V0ID49IGNhLT5zYi5uYnVja2V0cykKLQkJCQlyZXR1cm4gImJhZCwgb2Zmc2V0IHBhc3QgZW5kIG9mIGRldmljZSI7Ci0JCQlpZiAocHRyX3N0YWxlKGMsIGssIGkpKQotCQkJCXJldHVybiAic3RhbGUiOwotCQl9Ci0KLQlpZiAoIWJrZXlfY21wKGssICZaRVJPX0tFWSkpCi0JCXJldHVybiAiYmFkLCBudWxsIGtleSI7Ci0JaWYgKCFLRVlfUFRSUyhrKSkKLQkJcmV0dXJuICJiYWQsIG5vIHBvaW50ZXJzIjsKLQlpZiAoIUtFWV9TSVpFKGspKQotCQlyZXR1cm4gInplcm9lZCBrZXkiOwotCXJldHVybiAiIjsKLX0KLQotaW50IGJjaF9ia2V5X3RvX3RleHQoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RydWN0IGJrZXkgKmspCi17Ci0JdW5zaWduZWQgaSA9IDA7Ci0JY2hhciAqb3V0ID0gYnVmLCAqZW5kID0gYnVmICsgc2l6ZTsKLQotI2RlZmluZSBwKC4uLikJKG91dCArPSBzY25wcmludGYob3V0LCBlbmQgLSBvdXQsIF9fVkFfQVJHU19fKSkKLQotCXAoIiVsbHU6JWxsdSBsZW4gJWxsdSAtPiBbIiwgS0VZX0lOT0RFKGspLCBLRVlfT0ZGU0VUKGspLCBLRVlfU0laRShrKSk7Ci0KLQlpZiAoS0VZX1BUUlMoaykpCi0JCXdoaWxlICgxKSB7Ci0JCQlwKCIlbGx1OiVsbHUgZ2VuICVsbHUiLAotCQkJICBQVFJfREVWKGssIGkpLCBQVFJfT0ZGU0VUKGssIGkpLCBQVFJfR0VOKGssIGkpKTsKLQotCQkJaWYgKCsraSA9PSBLRVlfUFRSUyhrKSkKLQkJCQlicmVhazsKLQotCQkJcCgiLCAiKTsKLQkJfQotCi0JcCgiXSIpOwotCi0JaWYgKEtFWV9ESVJUWShrKSkKLQkJcCgiIGRpcnR5Iik7Ci0JaWYgKEtFWV9DU1VNKGspKQotCQlwKCIgY3MlbGx1ICVsbHgiLCBLRVlfQ1NVTShrKSwgay0+cHRyWzFdKTsKLSN1bmRlZiBwCi0JcmV0dXJuIG91dCAtIGJ1ZjsKLX0KLQogI2lmZGVmIENPTkZJR19CQ0FDSEVfREVCVUcKIAotc3RhdGljIHZvaWQgZHVtcF9ic2V0KHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJzZXQgKmkpCi17Ci0Jc3RydWN0IGJrZXkgKmssICpuZXh0OwotCXVuc2lnbmVkIGo7Ci0JY2hhciBidWZbODBdOworI2RlZmluZSBmb3JfZWFjaF93cml0dGVuX2JzZXQoYiwgc3RhcnQsIGkpCQkJCVwKKwlmb3IgKGkgPSAoc3RhcnQpOwkJCQkJCVwKKwkgICAgICh2b2lkICopIGkgPCAodm9pZCAqKSAoc3RhcnQpICsgKEtFWV9TSVpFKCZiLT5rZXkpIDw8IDkpICYmXAorCSAgICAgaS0+c2VxID09IChzdGFydCktPnNlcTsJCQkJCVwKKwkgICAgIGkgPSAodm9pZCAqKSBpICsgc2V0X2Jsb2NrcyhpLCBibG9ja19ieXRlcyhiLT5jKSkgKglcCisJCSBibG9ja19ieXRlcyhiLT5jKSkKIAotCWZvciAoayA9IGktPnN0YXJ0OyBrIDwgZW5kKGkpOyBrID0gbmV4dCkgewotCQluZXh0ID0gYmtleV9uZXh0KGspOwotCi0JCWJjaF9ia2V5X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7Ci0JCXByaW50ayhLRVJOX0VSUiAiYmxvY2sgJXp1IGtleSAlemkvJXU6ICVzIiwgaW5kZXgoaSwgYiksCi0JCSAgICAgICAodWludDY0X3QgKikgayAtIGktPmQsIGktPmtleXMsIGJ1Zik7Ci0KLQkJZm9yIChqID0gMDsgaiA8IEtFWV9QVFJTKGspOyBqKyspIHsKLQkJCXNpemVfdCBuID0gUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBqKTsKLQkJCXByaW50aygiIGJ1Y2tldCAlenUiLCBuKTsKLQotCQkJaWYgKG4gPj0gYi0+Yy0+c2IuZmlyc3RfYnVja2V0ICYmIG4gPCBiLT5jLT5zYi5uYnVja2V0cykKLQkJCQlwcmludGsoIiBwcmlvICVpIiwKLQkJCQkgICAgICAgUFRSX0JVQ0tFVChiLT5jLCBrLCBqKS0+cHJpbyk7Ci0JCX0KLQotCQlwcmludGsoIiAlc1xuIiwgYmNoX3B0cl9zdGF0dXMoYi0+YywgaykpOwotCi0JCWlmIChuZXh0IDwgZW5kKGkpICYmCi0JCSAgICBia2V5X2NtcChrLCAhYi0+bGV2ZWwgPyAmU1RBUlRfS0VZKG5leHQpIDogbmV4dCkgPiAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJLZXkgc2tpcHBlZCBiYWNrd2FyZHNcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYmNoX2R1bXBfYnVja2V0KHN0cnVjdCBidHJlZSAqYikKLXsKLQl1bnNpZ25lZCBpOwotCi0JY29uc29sZV9sb2NrKCk7Ci0JZm9yIChpID0gMDsgaSA8PSBiLT5uc2V0czsgaSsrKQotCQlkdW1wX2JzZXQoYiwgYi0+c2V0c1tpXS5kYXRhKTsKLQljb25zb2xlX3VubG9jaygpOwotfQotCi12b2lkIGJjaF9idHJlZV92ZXJpZnkoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnNldCAqbmV3KQordm9pZCBiY2hfYnRyZWVfdmVyaWZ5KHN0cnVjdCBidHJlZSAqYikKIHsKIAlzdHJ1Y3QgYnRyZWUgKnYgPSBiLT5jLT52ZXJpZnlfZGF0YTsKLQlzdHJ1Y3QgY2xvc3VyZSBjbDsKLQljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKKwlzdHJ1Y3QgYnNldCAqb25kaXNrLCAqc29ydGVkLCAqaW5tZW1vcnk7CisJc3RydWN0IGJpbyAqYmlvOwogCi0JaWYgKCFiLT5jLT52ZXJpZnkpCisJaWYgKCFiLT5jLT52ZXJpZnkgfHwgIWItPmMtPnZlcmlmeV9vbmRpc2spCiAJCXJldHVybjsKIAotCWNsb3N1cmVfd2FpdF9ldmVudCgmYi0+aW8ud2FpdCwgJmNsLAotCQkJICAgYXRvbWljX3JlYWQoJmItPmlvLmNsLnJlbWFpbmluZykgPT0gLTEpOwotCisJZG93bigmYi0+aW9fbXV0ZXgpOwogCW11dGV4X2xvY2soJmItPmMtPnZlcmlmeV9sb2NrKTsKIAorCW9uZGlzayA9IGItPmMtPnZlcmlmeV9vbmRpc2s7CisJc29ydGVkID0gYi0+Yy0+dmVyaWZ5X2RhdGEtPmtleXMuc2V0LT5kYXRhOworCWlubWVtb3J5ID0gYi0+a2V5cy5zZXQtPmRhdGE7CisKIAlia2V5X2NvcHkoJnYtPmtleSwgJmItPmtleSk7CiAJdi0+d3JpdHRlbiA9IDA7CiAJdi0+bGV2ZWwgPSBiLT5sZXZlbDsKKwl2LT5rZXlzLm9wcyA9IGItPmtleXMub3BzOwogCi0JYmNoX2J0cmVlX25vZGVfcmVhZCh2KTsKLQljbG9zdXJlX3dhaXRfZXZlbnQoJnYtPmlvLndhaXQsICZjbCwKLQkJCSAgIGF0b21pY19yZWFkKCZiLT5pby5jbC5yZW1haW5pbmcpID09IC0xKTsKKwliaW8gPSBiY2hfYmJpb19hbGxvYyhiLT5jKTsKKwliaW8tPmJpX2JkZXYJCT0gUFRSX0NBQ0hFKGItPmMsICZiLT5rZXksIDApLT5iZGV2OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSBQVFJfT0ZGU0VUKCZiLT5rZXksIDApOworCWJpby0+YmlfaXRlci5iaV9zaXplCT0gS0VZX1NJWkUoJnYtPmtleSkgPDwgOTsKKwliY2hfYmlvX21hcChiaW8sIHNvcnRlZCk7CiAKLQlpZiAobmV3LT5rZXlzICE9IHYtPnNldHNbMF0uZGF0YS0+a2V5cyB8fAotCSAgICBtZW1jbXAobmV3LT5zdGFydCwKLQkJICAgdi0+c2V0c1swXS5kYXRhLT5zdGFydCwKLQkJICAgKHZvaWQgKikgZW5kKG5ldykgLSAodm9pZCAqKSBuZXctPnN0YXJ0KSkgewotCQl1bnNpZ25lZCBpLCBqOworCXN1Ym1pdF9iaW9fd2FpdChSRVFfTUVUQXxSRUFEX1NZTkMsIGJpbyk7CisJYmNoX2JiaW9fZnJlZShiaW8sIGItPmMpOworCisJbWVtY3B5KG9uZGlzaywgc29ydGVkLCBLRVlfU0laRSgmdi0+a2V5KSA8PCA5KTsKKworCWJjaF9idHJlZV9ub2RlX3JlYWRfZG9uZSh2KTsKKwlzb3J0ZWQgPSB2LT5rZXlzLnNldC0+ZGF0YTsKKworCWlmIChpbm1lbW9yeS0+a2V5cyAhPSBzb3J0ZWQtPmtleXMgfHwKKwkgICAgbWVtY21wKGlubWVtb3J5LT5zdGFydCwKKwkJICAgc29ydGVkLT5zdGFydCwKKwkJICAgKHZvaWQgKikgYnNldF9ia2V5X2xhc3QoaW5tZW1vcnkpIC0gKHZvaWQgKikgaW5tZW1vcnktPnN0YXJ0KSkgeworCQlzdHJ1Y3QgYnNldCAqaTsKKwkJdW5zaWduZWQgajsKIAogCQljb25zb2xlX2xvY2soKTsKIAotCQlwcmludGsoS0VSTl9FUlIgIioqKiBvcmlnaW5hbCBtZW1vcnkgbm9kZTpcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDw9IGItPm5zZXRzOyBpKyspCi0JCQlkdW1wX2JzZXQoYiwgYi0+c2V0c1tpXS5kYXRhKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIqKiogaW4gbWVtb3J5OlxuIik7CisJCWJjaF9kdW1wX2JzZXQoJmItPmtleXMsIGlubWVtb3J5LCAwKTsKIAotCQlwcmludGsoS0VSTl9FUlIgIioqKiBzb3J0ZWQgbWVtb3J5IG5vZGU6XG4iKTsKLQkJZHVtcF9ic2V0KGIsIG5ldyk7CisJCXByaW50ayhLRVJOX0VSUiAiKioqIHJlYWQgYmFjayBpbjpcbiIpOworCQliY2hfZHVtcF9ic2V0KCZ2LT5rZXlzLCBzb3J0ZWQsIDApOwogCi0JCXByaW50ayhLRVJOX0VSUiAiKioqIG9uIGRpc2sgbm9kZTpcbiIpOwotCQlkdW1wX2JzZXQodiwgdi0+c2V0c1swXS5kYXRhKTsKKwkJZm9yX2VhY2hfd3JpdHRlbl9ic2V0KGIsIG9uZGlzaywgaSkgeworCQkJdW5zaWduZWQgYmxvY2sgPSAoKHZvaWQgKikgaSAtICh2b2lkICopIG9uZGlzaykgLworCQkJCWJsb2NrX2J5dGVzKGItPmMpOwogCi0JCWZvciAoaiA9IDA7IGogPCBuZXctPmtleXM7IGorKykKLQkJCWlmIChuZXctPmRbal0gIT0gdi0+c2V0c1swXS5kYXRhLT5kW2pdKQorCQkJcHJpbnRrKEtFUk5fRVJSICIqKiogb24gZGlzayBibG9jayAldTpcbiIsIGJsb2NrKTsKKwkJCWJjaF9kdW1wX2JzZXQoJmItPmtleXMsIGksIGJsb2NrKTsKKwkJfQorCisJCXByaW50ayhLRVJOX0VSUiAiKioqIGJsb2NrICV6dSBub3Qgd3JpdHRlblxuIiwKKwkJICAgICAgICgodm9pZCAqKSBpIC0gKHZvaWQgKikgb25kaXNrKSAvIGJsb2NrX2J5dGVzKGItPmMpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgaW5tZW1vcnktPmtleXM7IGorKykKKwkJCWlmIChpbm1lbW9yeS0+ZFtqXSAhPSBzb3J0ZWQtPmRbal0pCiAJCQkJYnJlYWs7CiAKKwkJcHJpbnRrKEtFUk5fRVJSICJiLT53cml0dGVuICV1XG4iLCBiLT53cml0dGVuKTsKKwogCQljb25zb2xlX3VubG9jaygpOwogCQlwYW5pYygidmVyaWZ5IGZhaWxlZCBhdCAldVxuIiwgaik7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZiLT5jLT52ZXJpZnlfbG9jayk7CisJdXAoJmItPmlvX211dGV4KTsKIH0KIAogdm9pZCBiY2hfZGF0YV92ZXJpZnkoc3RydWN0IGNhY2hlZF9kZXYgKmRjLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJY2hhciBuYW1lW0JERVZOQU1FX1NJWkVdOwogCXN0cnVjdCBiaW8gKmNoZWNrOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidiwgKmJ2MjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJaW50IGk7CiAKIAljaGVjayA9IGJpb19jbG9uZShiaW8sIEdGUF9OT0lPKTsKQEAgLTE4NSw5NSArMTE5LDI3IEBACiAKIAlzdWJtaXRfYmlvX3dhaXQoUkVBRF9TWU5DLCBjaGVjayk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7Ci0JCXZvaWQgKnAxID0ga21hcF9hdG9taWMoYnYtPmJ2X3BhZ2UpOwotCQl2b2lkICpwMiA9IHBhZ2VfYWRkcmVzcyhjaGVjay0+YmlfaW9fdmVjW2ldLmJ2X3BhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGl0ZXIpIHsKKwkJdm9pZCAqcDEgPSBrbWFwX2F0b21pYyhidi5idl9wYWdlKTsKKwkJdm9pZCAqcDIgPSBwYWdlX2FkZHJlc3MoY2hlY2stPmJpX2lvX3ZlY1tpdGVyLmJpX2lkeF0uYnZfcGFnZSk7CiAKLQkJY2FjaGVfc2V0X2Vycl9vbihtZW1jbXAocDEgKyBidi0+YnZfb2Zmc2V0LAotCQkJCQlwMiArIGJ2LT5idl9vZmZzZXQsCi0JCQkJCWJ2LT5idl9sZW4pLAorCQljYWNoZV9zZXRfZXJyX29uKG1lbWNtcChwMSArIGJ2LmJ2X29mZnNldCwKKwkJCQkJcDIgKyBidi5idl9vZmZzZXQsCisJCQkJCWJ2LmJ2X2xlbiksCiAJCQkJIGRjLT5kaXNrLmMsCiAJCQkJICJ2ZXJpZnkgZmFpbGVkIGF0IGRldiAlcyBzZWN0b3IgJWxsdSIsCiAJCQkJIGJkZXZuYW1lKGRjLT5iZGV2LCBuYW1lKSwKLQkJCQkgKHVpbnQ2NF90KSBiaW8tPmJpX3NlY3Rvcik7CisJCQkJICh1aW50NjRfdCkgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKIAkJa3VubWFwX2F0b21pYyhwMSk7CiAJfQogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2LCBjaGVjaywgaSkKLQkJX19mcmVlX3BhZ2UoYnYtPmJ2X3BhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidjIsIGNoZWNrLCBpKQorCQlfX2ZyZWVfcGFnZShidjItPmJ2X3BhZ2UpOwogb3V0X3B1dDoKIAliaW9fcHV0KGNoZWNrKTsKIH0KIAotaW50IF9fYmNoX2NvdW50X2RhdGEoc3RydWN0IGJ0cmVlICpiKQotewotCXVuc2lnbmVkIHJldCA9IDA7Ci0Jc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKLQlzdHJ1Y3QgYmtleSAqazsKLQotCWlmICghYi0+bGV2ZWwpCi0JCWZvcl9lYWNoX2tleShiLCBrLCAmaXRlcikKLQkJCXJldCArPSBLRVlfU0laRShrKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIF9fYmNoX2NoZWNrX2tleXMoc3RydWN0IGJ0cmVlICpiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0Jc3RydWN0IGJrZXkgKmssICpwID0gTlVMTDsKLQlzdHJ1Y3QgYnRyZWVfaXRlciBpdGVyOwotCWNvbnN0IGNoYXIgKmVycjsKLQotCWZvcl9lYWNoX2tleShiLCBrLCAmaXRlcikgewotCQlpZiAoIWItPmxldmVsKSB7Ci0JCQllcnIgPSAiS2V5cyBvdXQgb2Ygb3JkZXIiOwotCQkJaWYgKHAgJiYgYmtleV9jbXAoJlNUQVJUX0tFWShwKSwgJlNUQVJUX0tFWShrKSkgPiAwKQotCQkJCWdvdG8gYnVnOwotCi0JCQlpZiAoYmNoX3B0cl9pbnZhbGlkKGIsIGspKQotCQkJCWNvbnRpbnVlOwotCi0JCQllcnIgPSAgIk92ZXJsYXBwaW5nIGtleXMiOwotCQkJaWYgKHAgJiYgYmtleV9jbXAocCwgJlNUQVJUX0tFWShrKSkgPiAwKQotCQkJCWdvdG8gYnVnOwotCQl9IGVsc2UgewotCQkJaWYgKGJjaF9wdHJfYmFkKGIsIGspKQotCQkJCWNvbnRpbnVlOwotCi0JCQllcnIgPSAiRHVwbGljYXRlIGtleXMiOwotCQkJaWYgKHAgJiYgIWJrZXlfY21wKHAsIGspKQotCQkJCWdvdG8gYnVnOwotCQl9Ci0JCXAgPSBrOwotCX0KLQotCWVyciA9ICJLZXkgbGFyZ2VyIHRoYW4gYnRyZWUgbm9kZSBrZXkiOwotCWlmIChwICYmIGJrZXlfY21wKHAsICZiLT5rZXkpID4gMCkKLQkJZ290byBidWc7Ci0KLQlyZXR1cm47Ci1idWc6Ci0JYmNoX2R1bXBfYnVja2V0KGIpOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcGFuaWMoImJjYWNoZSBlcnJvcjogJXM6XG4iLCBlcnIpOwotfQotCi12b2lkIGJjaF9idHJlZV9pdGVyX25leHRfY2hlY2soc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIpCi17Ci0Jc3RydWN0IGJrZXkgKmsgPSBpdGVyLT5kYXRhLT5rLCAqbmV4dCA9IGJrZXlfbmV4dChrKTsKLQotCWlmIChuZXh0IDwgaXRlci0+ZGF0YS0+ZW5kICYmCi0JICAgIGJrZXlfY21wKGssIGl0ZXItPmItPmxldmVsID8gbmV4dCA6ICZTVEFSVF9LRVkobmV4dCkpID4gMCkgewotCQliY2hfZHVtcF9idWNrZXQoaXRlci0+Yik7Ci0JCXBhbmljKCJLZXkgc2tpcHBlZCBiYWNrd2FyZHNcbiIpOwotCX0KLX0KLQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKQEAgLTMyMCw3ICsxODYsNyBAQAogCQlpZiAoIXcpCiAJCQlicmVhazsKIAotCQliY2hfYmtleV90b190ZXh0KGtidWYsIHNpemVvZihrYnVmKSwgJnctPmtleSk7CisJCWJjaF9leHRlbnRfdG9fdGV4dChrYnVmLCBzaXplb2Yoa2J1ZiksICZ3LT5rZXkpOwogCQlpLT5ieXRlcyA9IHNucHJpbnRmKGktPmJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGtidWYpOwogCQliY2hfa2V5YnVmX2RlbCgmaS0+a2V5cywgdyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2RlYnVnLmgKaW5kZXggMmVkZTYwZS4uMWY2M2MxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9kZWJ1Zy5oCkBAIC0xLDQ3ICsxLDMwIEBACiAjaWZuZGVmIF9CQ0FDSEVfREVCVUdfSAogI2RlZmluZSBfQkNBQ0hFX0RFQlVHX0gKIAotLyogQnRyZWUvYmtleSBkZWJ1ZyBwcmludGluZyAqLwotCi1pbnQgYmNoX2JrZXlfdG9fdGV4dChjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBzdHJ1Y3QgYmtleSAqayk7CitzdHJ1Y3QgYmlvOworc3RydWN0IGNhY2hlZF9kZXY7CitzdHJ1Y3QgY2FjaGVfc2V0OwogCiAjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRwogCi12b2lkIGJjaF9idHJlZV92ZXJpZnkoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBic2V0ICopOwordm9pZCBiY2hfYnRyZWVfdmVyaWZ5KHN0cnVjdCBidHJlZSAqKTsKIHZvaWQgYmNoX2RhdGFfdmVyaWZ5KHN0cnVjdCBjYWNoZWRfZGV2ICosIHN0cnVjdCBiaW8gKik7Ci1pbnQgX19iY2hfY291bnRfZGF0YShzdHJ1Y3QgYnRyZWUgKik7Ci12b2lkIF9fYmNoX2NoZWNrX2tleXMoc3RydWN0IGJ0cmVlICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLXZvaWQgYmNoX2J0cmVlX2l0ZXJfbmV4dF9jaGVjayhzdHJ1Y3QgYnRyZWVfaXRlciAqKTsKIAotI2RlZmluZSBFQlVHX09OKGNvbmQpCQkJQlVHX09OKGNvbmQpCiAjZGVmaW5lIGV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MoYykJKChjKS0+ZXhwZW5zaXZlX2RlYnVnX2NoZWNrcykKICNkZWZpbmUga2V5X21lcmdpbmdfZGlzYWJsZWQoYykJCSgoYyktPmtleV9tZXJnaW5nX2Rpc2FibGVkKQogI2RlZmluZSBieXBhc3NfdG9ydHVyZV90ZXN0KGQpCQkoKGQpLT5ieXBhc3NfdG9ydHVyZV90ZXN0KQogCiAjZWxzZSAvKiBERUJVRyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNoX2J0cmVlX3ZlcmlmeShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBic2V0ICppKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGJjaF9idHJlZV92ZXJpZnkoc3RydWN0IGJ0cmVlICpiKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGJjaF9kYXRhX3ZlcmlmeShzdHJ1Y3QgY2FjaGVkX2RldiAqZGMsIHN0cnVjdCBiaW8gKmJpbykge30KLXN0YXRpYyBpbmxpbmUgaW50IF9fYmNoX2NvdW50X2RhdGEoc3RydWN0IGJ0cmVlICpiKSB7IHJldHVybiAtMTsgfQotc3RhdGljIGlubGluZSB2b2lkIF9fYmNoX2NoZWNrX2tleXMoc3RydWN0IGJ0cmVlICpiLCBjb25zdCBjaGFyICpmbXQsIC4uLikge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBiY2hfYnRyZWVfaXRlcl9uZXh0X2NoZWNrKHN0cnVjdCBidHJlZV9pdGVyICppdGVyKSB7fQogCi0jZGVmaW5lIEVCVUdfT04oY29uZCkJCQlkbyB7IGlmIChjb25kKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZXhwZW5zaXZlX2RlYnVnX2NoZWNrcyhjKQkwCiAjZGVmaW5lIGtleV9tZXJnaW5nX2Rpc2FibGVkKGMpCQkwCiAjZGVmaW5lIGJ5cGFzc190b3J0dXJlX3Rlc3QoZCkJCTAKIAogI2VuZGlmCiAKLSNkZWZpbmUgYmNoX2NvdW50X2RhdGEoYikJCQkJCQlcCi0JKGV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MoKGIpLT5jKSA/IF9fYmNoX2NvdW50X2RhdGEoYikgOiAtMSkKLQotI2RlZmluZSBiY2hfY2hlY2tfa2V5cyhiLCAuLi4pCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoZXhwZW5zaXZlX2RlYnVnX2NoZWNrcygoYiktPmMpKQkJCQlcCi0JCV9fYmNoX2NoZWNrX2tleXMoYiwgX19WQV9BUkdTX18pOwkJCVwKLX0gd2hpbGUgKDApCi0KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIHZvaWQgYmNoX2RlYnVnX2luaXRfY2FjaGVfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKik7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmQxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgS2VudCBPdmVyc3RyZWV0IDxrZW50Lm92ZXJzdHJlZXRAZ21haWwuY29tPgorICoKKyAqIFVzZXMgYSBibG9jayBkZXZpY2UgYXMgY2FjaGUgZm9yIG90aGVyIGJsb2NrIGRldmljZXM7IG9wdGltaXplZCBmb3IgU1NEcy4KKyAqIEFsbCBhbGxvY2F0aW9uIGlzIGRvbmUgaW4gYnVja2V0cywgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSBlcmFzZSBibG9jayBzaXplCisgKiBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEJ1Y2tldHMgY29udGFpbmluZyBjYWNoZWQgZGF0YSBhcmUga2VwdCBvbiBhIGhlYXAgc29ydGVkIGJ5IHByaW9yaXR5OworICogYnVja2V0IHByaW9yaXR5IGlzIGluY3JlYXNlZCBvbiBjYWNoZSBoaXQsIGFuZCBwZXJpb2RpY2FsbHkgYWxsIHRoZSBidWNrZXRzCisgKiBvbiB0aGUgaGVhcCBoYXZlIHRoZWlyIHByaW9yaXR5IHNjYWxlZCBkb3duLiBUaGlzIGN1cnJlbnRseSBpcyBqdXN0IHVzZWQgYXMKKyAqIGFuIExSVSBidXQgaW4gdGhlIGZ1dHVyZSBzaG91bGQgYWxsb3cgZm9yIG1vcmUgaW50ZWxsaWdlbnQgaGV1cmlzdGljcy4KKyAqCisgKiBCdWNrZXRzIGhhdmUgYW4gOCBiaXQgY291bnRlcjsgZnJlZWluZyBpcyBhY2NvbXBsaXNoZWQgYnkgaW5jcmVtZW50aW5nIHRoZQorICogY291bnRlci4gR2FyYmFnZSBjb2xsZWN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIHN0YWxlIHBvaW50ZXJzLgorICoKKyAqIEluZGV4aW5nIGlzIGRvbmUgdmlhIGEgYnRyZWU7IG5vZGVzIGFyZSBub3QgbmVjZXNzYXJpbHkgZnVsbHkgc29ydGVkLCByYXRoZXIKKyAqIGFzIGtleXMgYXJlIGluc2VydGVkIHdlIG9ubHkgc29ydCB0aGUgcGFnZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB3cml0dGVuLgorICogV2hlbiBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgcnVuLCB3ZSByZXNvcnQgdGhlIGVudGlyZSBub2RlLgorICoKKyAqIEFsbCBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIHN5c2ZzOyBzZWUgRG9jdW1lbnRhdGlvbi9iY2FjaGUudHh0LgorICovCisKKyNpbmNsdWRlICJiY2FjaGUuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZXh0ZW50cy5oIgorI2luY2x1ZGUgIndyaXRlYmFjay5oIgorCitzdGF0aWMgdm9pZCBzb3J0X2tleV9uZXh0KHN0cnVjdCBidHJlZV9pdGVyICppdGVyLAorCQkJICBzdHJ1Y3QgYnRyZWVfaXRlcl9zZXQgKmkpCit7CisJaS0+ayA9IGJrZXlfbmV4dChpLT5rKTsKKworCWlmIChpLT5rID09IGktPmVuZCkKKwkJKmkgPSBpdGVyLT5kYXRhWy0taXRlci0+dXNlZF07Cit9CisKK3N0YXRpYyBib29sIGJjaF9rZXlfc29ydF9jbXAoc3RydWN0IGJ0cmVlX2l0ZXJfc2V0IGwsCisJCQkgICAgIHN0cnVjdCBidHJlZV9pdGVyX3NldCByKQoreworCWludDY0X3QgYyA9IGJrZXlfY21wKGwuaywgci5rKTsKKworCXJldHVybiBjID8gYyA+IDAgOiBsLmsgPCByLms7Cit9CisKK3N0YXRpYyBib29sIF9fcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmspCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBpKSkgeworCQkJc3RydWN0IGNhY2hlICpjYSA9IFBUUl9DQUNIRShjLCBrLCBpKTsKKwkJCXNpemVfdCBidWNrZXQgPSBQVFJfQlVDS0VUX05SKGMsIGssIGkpOworCQkJc2l6ZV90IHIgPSBidWNrZXRfcmVtYWluZGVyKGMsIFBUUl9PRkZTRVQoaywgaSkpOworCisJCQlpZiAoS0VZX1NJWkUoaykgKyByID4gYy0+c2IuYnVja2V0X3NpemUgfHwKKwkJCSAgICBidWNrZXQgPCAgY2EtPnNiLmZpcnN0X2J1Y2tldCB8fAorCQkJICAgIGJ1Y2tldCA+PSBjYS0+c2IubmJ1Y2tldHMpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyogQ29tbW9uIGFtb25nIGJ0cmVlIGFuZCBleHRlbnQgcHRycyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqYmNoX3B0cl9zdGF0dXMoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmspCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBpKSkgeworCQkJc3RydWN0IGNhY2hlICpjYSA9IFBUUl9DQUNIRShjLCBrLCBpKTsKKwkJCXNpemVfdCBidWNrZXQgPSBQVFJfQlVDS0VUX05SKGMsIGssIGkpOworCQkJc2l6ZV90IHIgPSBidWNrZXRfcmVtYWluZGVyKGMsIFBUUl9PRkZTRVQoaywgaSkpOworCisJCQlpZiAoS0VZX1NJWkUoaykgKyByID4gYy0+c2IuYnVja2V0X3NpemUpCisJCQkJcmV0dXJuICJiYWQsIGxlbmd0aCB0b28gYmlnIjsKKwkJCWlmIChidWNrZXQgPCAgY2EtPnNiLmZpcnN0X2J1Y2tldCkKKwkJCQlyZXR1cm4gImJhZCwgc2hvcnQgb2Zmc2V0IjsKKwkJCWlmIChidWNrZXQgPj0gY2EtPnNiLm5idWNrZXRzKQorCQkJCXJldHVybiAiYmFkLCBvZmZzZXQgcGFzdCBlbmQgb2YgZGV2aWNlIjsKKwkJCWlmIChwdHJfc3RhbGUoYywgaywgaSkpCisJCQkJcmV0dXJuICJzdGFsZSI7CisJCX0KKworCWlmICghYmtleV9jbXAoaywgJlpFUk9fS0VZKSkKKwkJcmV0dXJuICJiYWQsIG51bGwga2V5IjsKKwlpZiAoIUtFWV9QVFJTKGspKQorCQlyZXR1cm4gImJhZCwgbm8gcG9pbnRlcnMiOworCWlmICghS0VZX1NJWkUoaykpCisJCXJldHVybiAiemVyb2VkIGtleSI7CisJcmV0dXJuICIiOworfQorCit2b2lkIGJjaF9leHRlbnRfdG9fdGV4dChjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKK3sKKwl1bnNpZ25lZCBpID0gMDsKKwljaGFyICpvdXQgPSBidWYsICplbmQgPSBidWYgKyBzaXplOworCisjZGVmaW5lIHAoLi4uKQkob3V0ICs9IHNjbnByaW50ZihvdXQsIGVuZCAtIG91dCwgX19WQV9BUkdTX18pKQorCisJcCgiJWxsdTolbGx1IGxlbiAlbGx1IC0+IFsiLCBLRVlfSU5PREUoayksIEtFWV9TVEFSVChrKSwgS0VZX1NJWkUoaykpOworCisJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKKwkJaWYgKGkpCisJCQlwKCIsICIpOworCisJCWlmIChQVFJfREVWKGssIGkpID09IFBUUl9DSEVDS19ERVYpCisJCQlwKCJjaGVjayBkZXYiKTsKKwkJZWxzZQorCQkJcCgiJWxsdTolbGx1IGdlbiAlbGx1IiwgUFRSX0RFVihrLCBpKSwKKwkJCSAgUFRSX09GRlNFVChrLCBpKSwgUFRSX0dFTihrLCBpKSk7CisJfQorCisJcCgiXSIpOworCisJaWYgKEtFWV9ESVJUWShrKSkKKwkJcCgiIGRpcnR5Iik7CisJaWYgKEtFWV9DU1VNKGspKQorCQlwKCIgY3MlbGx1ICVsbHgiLCBLRVlfQ1NVTShrKSwgay0+cHRyWzFdKTsKKyN1bmRlZiBwCit9CisKK3N0YXRpYyB2b2lkIGJjaF9ia2V5X2R1bXAoc3RydWN0IGJ0cmVlX2tleXMgKmtleXMsIGNvbnN0IHN0cnVjdCBia2V5ICprKQoreworCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihrZXlzLCBzdHJ1Y3QgYnRyZWUsIGtleXMpOworCXVuc2lnbmVkIGo7CisJY2hhciBidWZbODBdOworCisJYmNoX2V4dGVudF90b190ZXh0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIGspOworCXByaW50aygiICVzIiwgYnVmKTsKKworCWZvciAoaiA9IDA7IGogPCBLRVlfUFRSUyhrKTsgaisrKSB7CisJCXNpemVfdCBuID0gUFRSX0JVQ0tFVF9OUihiLT5jLCBrLCBqKTsKKwkJcHJpbnRrKCIgYnVja2V0ICV6dSIsIG4pOworCisJCWlmIChuID49IGItPmMtPnNiLmZpcnN0X2J1Y2tldCAmJiBuIDwgYi0+Yy0+c2IubmJ1Y2tldHMpCisJCQlwcmludGsoIiBwcmlvICVpIiwKKwkJCSAgICAgICBQVFJfQlVDS0VUKGItPmMsIGssIGopLT5wcmlvKTsKKwl9CisKKwlwcmludGsoIiAlc1xuIiwgYmNoX3B0cl9zdGF0dXMoYi0+YywgaykpOworfQorCisvKiBCdHJlZSBwdHJzICovCisKK2Jvb2wgX19iY2hfYnRyZWVfcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqYywgY29uc3Qgc3RydWN0IGJrZXkgKmspCit7CisJY2hhciBidWZbODBdOworCisJaWYgKCFLRVlfUFRSUyhrKSB8fCAhS0VZX1NJWkUoaykgfHwgS0VZX0RJUlRZKGspKQorCQlnb3RvIGJhZDsKKworCWlmIChfX3B0cl9pbnZhbGlkKGMsIGspKQorCQlnb3RvIGJhZDsKKworCXJldHVybiBmYWxzZTsKK2JhZDoKKwliY2hfZXh0ZW50X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7CisJY2FjaGVfYnVnKGMsICJzcG90dGVkIGJ0cmVlIHB0ciAlczogJXMiLCBidWYsIGJjaF9wdHJfc3RhdHVzKGMsIGspKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYmNoX2J0cmVlX3B0cl9pbnZhbGlkKHN0cnVjdCBidHJlZV9rZXlzICpiaywgY29uc3Qgc3RydWN0IGJrZXkgKmspCit7CisJc3RydWN0IGJ0cmVlICpiID0gY29udGFpbmVyX29mKGJrLCBzdHJ1Y3QgYnRyZWUsIGtleXMpOworCXJldHVybiBfX2JjaF9idHJlZV9wdHJfaW52YWxpZChiLT5jLCBrKTsKK30KKworc3RhdGljIGJvb2wgYnRyZWVfcHRyX2JhZF9leHBlbnNpdmUoc3RydWN0IGJ0cmVlICpiLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKK3sKKwl1bnNpZ25lZCBpOworCWNoYXIgYnVmWzgwXTsKKwlzdHJ1Y3QgYnVja2V0ICpnOworCisJaWYgKG11dGV4X3RyeWxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJCWlmIChwdHJfYXZhaWxhYmxlKGItPmMsIGssIGkpKSB7CisJCQkJZyA9IFBUUl9CVUNLRVQoYi0+YywgaywgaSk7CisKKwkJCQlpZiAoS0VZX0RJUlRZKGspIHx8CisJCQkJICAgIGctPnByaW8gIT0gQlRSRUVfUFJJTyB8fAorCQkJCSAgICAoYi0+Yy0+Z2NfbWFya192YWxpZCAmJgorCQkJCSAgICAgR0NfTUFSSyhnKSAhPSBHQ19NQVJLX01FVEFEQVRBKSkKKwkJCQkJZ290byBlcnI7CisJCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CisJfQorCisJcmV0dXJuIGZhbHNlOworZXJyOgorCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOworCWJjaF9leHRlbnRfdG9fdGV4dChidWYsIHNpemVvZihidWYpLCBrKTsKKwlidHJlZV9idWcoYiwKKyJpbmNvbnNpc3RlbnQgYnRyZWUgcG9pbnRlciAlczogYnVja2V0ICV6aSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUgZ2NfZ2VuICVpIiwKKwkJICBidWYsIFBUUl9CVUNLRVRfTlIoYi0+YywgaywgaSksIGF0b21pY19yZWFkKCZnLT5waW4pLAorCQkgIGctPnByaW8sIGctPmdlbiwgZy0+bGFzdF9nYywgR0NfTUFSSyhnKSwgZy0+Z2NfZ2VuKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYmNoX2J0cmVlX3B0cl9iYWQoc3RydWN0IGJ0cmVlX2tleXMgKmJrLCBjb25zdCBzdHJ1Y3QgYmtleSAqaykKK3sKKwlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YoYmssIHN0cnVjdCBidHJlZSwga2V5cyk7CisJdW5zaWduZWQgaTsKKworCWlmICghYmtleV9jbXAoaywgJlpFUk9fS0VZKSB8fAorCSAgICAhS0VZX1BUUlMoaykgfHwKKwkgICAgYmNoX3B0cl9pbnZhbGlkKGJrLCBrKSkKKwkJcmV0dXJuIHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJaWYgKCFwdHJfYXZhaWxhYmxlKGItPmMsIGssIGkpIHx8CisJCSAgICBwdHJfc3RhbGUoYi0+YywgaywgaSkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChleHBlbnNpdmVfZGVidWdfY2hlY2tzKGItPmMpICYmCisJICAgIGJ0cmVlX3B0cl9iYWRfZXhwZW5zaXZlKGIsIGspKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgYmNoX2J0cmVlX3B0cl9pbnNlcnRfZml4dXAoc3RydWN0IGJ0cmVlX2tleXMgKmJrLAorCQkJCSAgICAgICBzdHJ1Y3QgYmtleSAqaW5zZXJ0LAorCQkJCSAgICAgICBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKKwkJCQkgICAgICAgc3RydWN0IGJrZXkgKnJlcGxhY2Vfa2V5KQoreworCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihiaywgc3RydWN0IGJ0cmVlLCBrZXlzKTsKKworCWlmICghS0VZX09GRlNFVChpbnNlcnQpKQorCQlidHJlZV9jdXJyZW50X3dyaXRlKGIpLT5wcmlvX2Jsb2NrZWQrKzsKKworCXJldHVybiBmYWxzZTsKK30KKworY29uc3Qgc3RydWN0IGJ0cmVlX2tleXNfb3BzIGJjaF9idHJlZV9rZXlzX29wcyA9IHsKKwkuc29ydF9jbXAJPSBiY2hfa2V5X3NvcnRfY21wLAorCS5pbnNlcnRfZml4dXAJPSBiY2hfYnRyZWVfcHRyX2luc2VydF9maXh1cCwKKwkua2V5X2ludmFsaWQJPSBiY2hfYnRyZWVfcHRyX2ludmFsaWQsCisJLmtleV9iYWQJPSBiY2hfYnRyZWVfcHRyX2JhZCwKKwkua2V5X3RvX3RleHQJPSBiY2hfZXh0ZW50X3RvX3RleHQsCisJLmtleV9kdW1wCT0gYmNoX2JrZXlfZHVtcCwKK307CisKKy8qIEV4dGVudHMgKi8KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBsID4gciAtIHVubGVzcyBsID09IHIsIGluIHdoaWNoIGNhc2UgcmV0dXJucyB0cnVlIGlmIGwgaXMKKyAqIG9sZGVyIHRoYW4gci4KKyAqCisgKiBOZWNlc3NhcnkgZm9yIGJ0cmVlX3NvcnRfZml4dXAoKSAtIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBrZXlzIHRoYXQgY29tcGFyZQorICogZXF1YWwgaW4gZGlmZmVyZW50IHNldHMsIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGVtIG5ld2VzdCB0byBvbGRlc3QuCisgKi8KK3N0YXRpYyBib29sIGJjaF9leHRlbnRfc29ydF9jbXAoc3RydWN0IGJ0cmVlX2l0ZXJfc2V0IGwsCisJCQkJc3RydWN0IGJ0cmVlX2l0ZXJfc2V0IHIpCit7CisJaW50NjRfdCBjID0gYmtleV9jbXAoJlNUQVJUX0tFWShsLmspLCAmU1RBUlRfS0VZKHIuaykpOworCisJcmV0dXJuIGMgPyBjID4gMCA6IGwuayA8IHIuazsKK30KKworc3RhdGljIHN0cnVjdCBia2V5ICpiY2hfZXh0ZW50X3NvcnRfZml4dXAoc3RydWN0IGJ0cmVlX2l0ZXIgKml0ZXIsCisJCQkJCSAgc3RydWN0IGJrZXkgKnRtcCkKK3sKKwl3aGlsZSAoaXRlci0+dXNlZCA+IDEpIHsKKwkJc3RydWN0IGJ0cmVlX2l0ZXJfc2V0ICp0b3AgPSBpdGVyLT5kYXRhLCAqaSA9IHRvcCArIDE7CisKKwkJaWYgKGl0ZXItPnVzZWQgPiAyICYmCisJCSAgICBiY2hfZXh0ZW50X3NvcnRfY21wKGlbMF0sIGlbMV0pKQorCQkJaSsrOworCisJCWlmIChia2V5X2NtcCh0b3AtPmssICZTVEFSVF9LRVkoaS0+aykpIDw9IDApCisJCQlicmVhazsKKworCQlpZiAoIUtFWV9TSVpFKGktPmspKSB7CisJCQlzb3J0X2tleV9uZXh0KGl0ZXIsIGkpOworCQkJaGVhcF9zaWZ0KGl0ZXIsIGkgLSB0b3AsIGJjaF9leHRlbnRfc29ydF9jbXApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodG9wLT5rID4gaS0+aykgeworCQkJaWYgKGJrZXlfY21wKHRvcC0+aywgaS0+aykgPj0gMCkKKwkJCQlzb3J0X2tleV9uZXh0KGl0ZXIsIGkpOworCQkJZWxzZQorCQkJCWJjaF9jdXRfZnJvbnQodG9wLT5rLCBpLT5rKTsKKworCQkJaGVhcF9zaWZ0KGl0ZXIsIGkgLSB0b3AsIGJjaF9leHRlbnRfc29ydF9jbXApOworCQl9IGVsc2UgeworCQkJLyogY2FuJ3QgaGFwcGVuIGJlY2F1c2Ugb2YgY29tcGFyaXNvbiBmdW5jICovCisJCQlCVUdfT04oIWJrZXlfY21wKCZTVEFSVF9LRVkodG9wLT5rKSwgJlNUQVJUX0tFWShpLT5rKSkpOworCisJCQlpZiAoYmtleV9jbXAoaS0+aywgdG9wLT5rKSA8IDApIHsKKwkJCQlia2V5X2NvcHkodG1wLCB0b3AtPmspOworCisJCQkJYmNoX2N1dF9iYWNrKCZTVEFSVF9LRVkoaS0+ayksIHRtcCk7CisJCQkJYmNoX2N1dF9mcm9udChpLT5rLCB0b3AtPmspOworCQkJCWhlYXBfc2lmdChpdGVyLCAwLCBiY2hfZXh0ZW50X3NvcnRfY21wKTsKKworCQkJCXJldHVybiB0bXA7CisJCQl9IGVsc2UgeworCQkJCWJjaF9jdXRfYmFjaygmU1RBUlRfS0VZKGktPmspLCB0b3AtPmspOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGJjaF9leHRlbnRfaW5zZXJ0X2ZpeHVwKHN0cnVjdCBidHJlZV9rZXlzICpiLAorCQkJCSAgICBzdHJ1Y3QgYmtleSAqaW5zZXJ0LAorCQkJCSAgICBzdHJ1Y3QgYnRyZWVfaXRlciAqaXRlciwKKwkJCQkgICAgc3RydWN0IGJrZXkgKnJlcGxhY2Vfa2V5KQoreworCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBjb250YWluZXJfb2YoYiwgc3RydWN0IGJ0cmVlLCBrZXlzKS0+YzsKKworCXZvaWQgc3VidHJhY3RfZGlydHkoc3RydWN0IGJrZXkgKmssIHVpbnQ2NF90IG9mZnNldCwgaW50IHNlY3RvcnMpCisJeworCQlpZiAoS0VZX0RJUlRZKGspKQorCQkJYmNhY2hlX2Rldl9zZWN0b3JzX2RpcnR5X2FkZChjLCBLRVlfSU5PREUoayksCisJCQkJCQkgICAgIG9mZnNldCwgLXNlY3RvcnMpOworCX0KKworCXVpbnQ2NF90IG9sZF9vZmZzZXQ7CisJdW5zaWduZWQgb2xkX3NpemUsIHNlY3RvcnNfZm91bmQgPSAwOworCisJQlVHX09OKCFLRVlfT0ZGU0VUKGluc2VydCkpOworCUJVR19PTighS0VZX1NJWkUoaW5zZXJ0KSk7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgYmtleSAqayA9IGJjaF9idHJlZV9pdGVyX25leHQoaXRlcik7CisJCWlmICghaykKKwkJCWJyZWFrOworCisJCWlmIChia2V5X2NtcCgmU1RBUlRfS0VZKGspLCBpbnNlcnQpID49IDApIHsKKwkJCWlmIChLRVlfU0laRShrKSkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChia2V5X2NtcChrLCAmU1RBUlRfS0VZKGluc2VydCkpIDw9IDApCisJCQljb250aW51ZTsKKworCQlvbGRfb2Zmc2V0ID0gS0VZX1NUQVJUKGspOworCQlvbGRfc2l6ZSA9IEtFWV9TSVpFKGspOworCisJCS8qCisJCSAqIFdlIG1pZ2h0IG92ZXJsYXAgd2l0aCAwIHNpemUgZXh0ZW50czsgd2UgY2FuJ3Qgc2tpcCB0aGVzZQorCQkgKiBiZWNhdXNlIGlmIHRoZXkncmUgaW4gdGhlIHNldCB3ZSdyZSBpbnNlcnRpbmcgdG8gd2UgaGF2ZSB0bworCQkgKiBhZGp1c3QgdGhlbSBzbyB0aGV5IGRvbid0IG92ZXJsYXAgd2l0aCB0aGUga2V5IHdlJ3JlCisJCSAqIGluc2VydGluZy4gQnV0IHdlIGRvbid0IHdhbnQgdG8gY2hlY2sgdGhlbSBmb3IgcmVwbGFjZQorCQkgKiBvcGVyYXRpb25zLgorCQkgKi8KKworCQlpZiAocmVwbGFjZV9rZXkgJiYgS0VZX1NJWkUoaykpIHsKKwkJCS8qCisJCQkgKiBrIG1pZ2h0IGhhdmUgYmVlbiBzcGxpdCBzaW5jZSB3ZSBpbnNlcnRlZC9mb3VuZCB0aGUKKwkJCSAqIGtleSB3ZSdyZSByZXBsYWNpbmcKKwkJCSAqLworCQkJdW5zaWduZWQgaTsKKwkJCXVpbnQ2NF90IG9mZnNldCA9IEtFWV9TVEFSVChrKSAtCisJCQkJS0VZX1NUQVJUKHJlcGxhY2Vfa2V5KTsKKworCQkJLyogQnV0IGl0IG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIHJlcGxhY2Uga2V5ICovCisJCQlpZiAoS0VZX1NUQVJUKGspIDwgS0VZX1NUQVJUKHJlcGxhY2Vfa2V5KSB8fAorCQkJICAgIEtFWV9PRkZTRVQoaykgPiBLRVlfT0ZGU0VUKHJlcGxhY2Vfa2V5KSkKKwkJCQlnb3RvIGNoZWNrX2ZhaWxlZDsKKworCQkJLyogV2UgZGlkbid0IGZpbmQgYSBrZXkgdGhhdCB3ZSB3ZXJlIHN1cHBvc2VkIHRvICovCisJCQlpZiAoS0VZX1NUQVJUKGspID4gS0VZX1NUQVJUKGluc2VydCkgKyBzZWN0b3JzX2ZvdW5kKQorCQkJCWdvdG8gY2hlY2tfZmFpbGVkOworCisJCQlpZiAoIWJjaF9ia2V5X2VxdWFsX2hlYWRlcihrLCByZXBsYWNlX2tleSkpCisJCQkJZ290byBjaGVja19mYWlsZWQ7CisKKwkJCS8qIHNraXAgcGFzdCBnZW4gKi8KKwkJCW9mZnNldCA8PD0gODsKKworCQkJQlVHX09OKCFLRVlfUFRSUyhyZXBsYWNlX2tleSkpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMocmVwbGFjZV9rZXkpOyBpKyspCisJCQkJaWYgKGstPnB0cltpXSAhPSByZXBsYWNlX2tleS0+cHRyW2ldICsgb2Zmc2V0KQorCQkJCQlnb3RvIGNoZWNrX2ZhaWxlZDsKKworCQkJc2VjdG9yc19mb3VuZCA9IEtFWV9PRkZTRVQoaykgLSBLRVlfU1RBUlQoaW5zZXJ0KTsKKwkJfQorCisJCWlmIChia2V5X2NtcChpbnNlcnQsIGspIDwgMCAmJgorCQkgICAgYmtleV9jbXAoJlNUQVJUX0tFWShpbnNlcnQpLCAmU1RBUlRfS0VZKGspKSA+IDApIHsKKwkJCS8qCisJCQkgKiBXZSBvdmVybGFwcGVkIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhpc3Rpbmcga2V5OiB0aGF0CisJCQkgKiBtZWFucyB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBvbGQga2V5LiBCdXQgd2UgaGF2ZSB0byBkbworCQkJICogc2xpZ2h0bHkgZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKwkJCSAqIG9sZCBrZXkgaGFzIGJlZW4gd3JpdHRlbiBvdXQgeWV0LgorCQkJICovCisKKwkJCXN0cnVjdCBia2V5ICp0b3A7CisKKwkJCXN1YnRyYWN0X2RpcnR5KGssIEtFWV9TVEFSVChpbnNlcnQpLCBLRVlfU0laRShpbnNlcnQpKTsKKworCQkJaWYgKGJrZXlfd3JpdHRlbihiLCBrKSkgeworCQkJCS8qCisJCQkJICogV2UgaW5zZXJ0IGEgbmV3IGtleSB0byBjb3ZlciB0aGUgdG9wIG9mIHRoZQorCQkJCSAqIG9sZCBrZXksIGFuZCB0aGUgb2xkIGtleSBpcyBtb2RpZmllZCBpbiBwbGFjZQorCQkJCSAqIHRvIHJlcHJlc2VudCB0aGUgYm90dG9tIHNwbGl0LgorCQkJCSAqCisJCQkJICogSXQncyBjb21wbGV0ZWx5IGFyYml0cmFyeSB3aGV0aGVyIHRoZSBuZXcga2V5CisJCQkJICogaXMgdGhlIHRvcCBvciB0aGUgYm90dG9tLCBidXQgaXQgaGFzIHRvIG1hdGNoCisJCQkJICogdXAgd2l0aCB3aGF0IGJ0cmVlX3NvcnRfZml4dXAoKSBkb2VzIC0gaXQKKwkJCQkgKiBkb2Vzbid0IGNoZWNrIGZvciB0aGlzIGtpbmQgb2Ygb3ZlcmxhcCwgaXQKKwkJCQkgKiBkZXBlbmRzIG9uIHVzIGluc2VydGluZyBhIG5ldyBrZXkgZm9yIHRoZSB0b3AKKwkJCQkgKiBoZXJlLgorCQkJCSAqLworCQkJCXRvcCA9IGJjaF9ic2V0X3NlYXJjaChiLCBic2V0X3RyZWVfbGFzdChiKSwKKwkJCQkJCSAgICAgIGluc2VydCk7CisJCQkJYmNoX2JzZXRfaW5zZXJ0KGIsIHRvcCwgayk7CisJCQl9IGVsc2UgeworCQkJCUJLRVlfUEFEREVEKGtleSkgdGVtcDsKKwkJCQlia2V5X2NvcHkoJnRlbXAua2V5LCBrKTsKKwkJCQliY2hfYnNldF9pbnNlcnQoYiwgaywgJnRlbXAua2V5KTsKKwkJCQl0b3AgPSBia2V5X25leHQoayk7CisJCQl9CisKKwkJCWJjaF9jdXRfZnJvbnQoaW5zZXJ0LCB0b3ApOworCQkJYmNoX2N1dF9iYWNrKCZTVEFSVF9LRVkoaW5zZXJ0KSwgayk7CisJCQliY2hfYnNldF9maXhfaW52YWxpZGF0ZWRfa2V5KGIsIGspOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYmtleV9jbXAoaW5zZXJ0LCBrKSA8IDApIHsKKwkJCWJjaF9jdXRfZnJvbnQoaW5zZXJ0LCBrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChia2V5X2NtcCgmU1RBUlRfS0VZKGluc2VydCksICZTVEFSVF9LRVkoaykpID4gMCkKKwkJCQlvbGRfb2Zmc2V0ID0gS0VZX1NUQVJUKGluc2VydCk7CisKKwkJCWlmIChia2V5X3dyaXR0ZW4oYiwgaykgJiYKKwkJCSAgICBia2V5X2NtcCgmU1RBUlRfS0VZKGluc2VydCksICZTVEFSVF9LRVkoaykpIDw9IDApIHsKKwkJCQkvKgorCQkJCSAqIENvbXBsZXRlbHkgb3Zlcndyb3RlLCBzbyB3ZSBkb24ndCBoYXZlIHRvCisJCQkJICogaW52YWxpZGF0ZSB0aGUgYmluYXJ5IHNlYXJjaCB0cmVlCisJCQkJICovCisJCQkJYmNoX2N1dF9mcm9udChrLCBrKTsKKwkJCX0gZWxzZSB7CisJCQkJX19iY2hfY3V0X2JhY2soJlNUQVJUX0tFWShpbnNlcnQpLCBrKTsKKwkJCQliY2hfYnNldF9maXhfaW52YWxpZGF0ZWRfa2V5KGIsIGspOworCQkJfQorCQl9CisKKwkJc3VidHJhY3RfZGlydHkoaywgb2xkX29mZnNldCwgb2xkX3NpemUgLSBLRVlfU0laRShrKSk7CisJfQorCitjaGVja19mYWlsZWQ6CisJaWYgKHJlcGxhY2Vfa2V5KSB7CisJCWlmICghc2VjdG9yc19mb3VuZCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSBpZiAoc2VjdG9yc19mb3VuZCA8IEtFWV9TSVpFKGluc2VydCkpIHsKKwkJCVNFVF9LRVlfT0ZGU0VUKGluc2VydCwgS0VZX09GRlNFVChpbnNlcnQpIC0KKwkJCQkgICAgICAgKEtFWV9TSVpFKGluc2VydCkgLSBzZWN0b3JzX2ZvdW5kKSk7CisJCQlTRVRfS0VZX1NJWkUoaW5zZXJ0LCBzZWN0b3JzX2ZvdW5kKTsKKwkJfQorCX0KK291dDoKKwlpZiAoS0VZX0RJUlRZKGluc2VydCkpCisJCWJjYWNoZV9kZXZfc2VjdG9yc19kaXJ0eV9hZGQoYywgS0VZX0lOT0RFKGluc2VydCksCisJCQkJCSAgICAgS0VZX1NUQVJUKGluc2VydCksCisJCQkJCSAgICAgS0VZX1NJWkUoaW5zZXJ0KSk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGJjaF9leHRlbnRfaW52YWxpZChzdHJ1Y3QgYnRyZWVfa2V5cyAqYmssIGNvbnN0IHN0cnVjdCBia2V5ICprKQoreworCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihiaywgc3RydWN0IGJ0cmVlLCBrZXlzKTsKKwljaGFyIGJ1Zls4MF07CisKKwlpZiAoIUtFWV9TSVpFKGspKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChLRVlfU0laRShrKSA+IEtFWV9PRkZTRVQoaykpCisJCWdvdG8gYmFkOworCisJaWYgKF9fcHRyX2ludmFsaWQoYi0+YywgaykpCisJCWdvdG8gYmFkOworCisJcmV0dXJuIGZhbHNlOworYmFkOgorCWJjaF9leHRlbnRfdG9fdGV4dChidWYsIHNpemVvZihidWYpLCBrKTsKKwljYWNoZV9idWcoYi0+YywgInNwb3R0ZWQgZXh0ZW50ICVzOiAlcyIsIGJ1ZiwgYmNoX3B0cl9zdGF0dXMoYi0+YywgaykpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBiY2hfZXh0ZW50X2JhZF9leHBlbnNpdmUoc3RydWN0IGJ0cmVlICpiLCBjb25zdCBzdHJ1Y3QgYmtleSAqaywKKwkJCQkgICAgIHVuc2lnbmVkIHB0cikKK3sKKwlzdHJ1Y3QgYnVja2V0ICpnID0gUFRSX0JVQ0tFVChiLT5jLCBrLCBwdHIpOworCWNoYXIgYnVmWzgwXTsKKworCWlmIChtdXRleF90cnlsb2NrKCZiLT5jLT5idWNrZXRfbG9jaykpIHsKKwkJaWYgKGItPmMtPmdjX21hcmtfdmFsaWQgJiYKKwkJICAgICgoR0NfTUFSSyhnKSAhPSBHQ19NQVJLX0RJUlRZICYmCisJCSAgICAgIEtFWV9ESVJUWShrKSkgfHwKKwkJICAgICBHQ19NQVJLKGcpID09IEdDX01BUktfTUVUQURBVEEpKQorCQkJZ290byBlcnI7CisKKwkJaWYgKGctPnByaW8gPT0gQlRSRUVfUFJJTykKKwkJCWdvdG8gZXJyOworCisJCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOworCX0KKworCXJldHVybiBmYWxzZTsKK2VycjoKKwltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKKwliY2hfZXh0ZW50X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7CisJYnRyZWVfYnVnKGIsCisiaW5jb25zaXN0ZW50IGV4dGVudCBwb2ludGVyICVzOlxuYnVja2V0ICV6dSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUgZ2NfZ2VuICVpIiwKKwkJICBidWYsIFBUUl9CVUNLRVRfTlIoYi0+YywgaywgcHRyKSwgYXRvbWljX3JlYWQoJmctPnBpbiksCisJCSAgZy0+cHJpbywgZy0+Z2VuLCBnLT5sYXN0X2djLCBHQ19NQVJLKGcpLCBnLT5nY19nZW4pOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBiY2hfZXh0ZW50X2JhZChzdHJ1Y3QgYnRyZWVfa2V5cyAqYmssIGNvbnN0IHN0cnVjdCBia2V5ICprKQoreworCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZihiaywgc3RydWN0IGJ0cmVlLCBrZXlzKTsKKwlzdHJ1Y3QgYnVja2V0ICpnOworCXVuc2lnbmVkIGksIHN0YWxlOworCisJaWYgKCFLRVlfUFRSUyhrKSB8fAorCSAgICBiY2hfZXh0ZW50X2ludmFsaWQoYmssIGspKQorCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlpZiAoIXB0cl9hdmFpbGFibGUoYi0+YywgaywgaSkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghZXhwZW5zaXZlX2RlYnVnX2NoZWNrcyhiLT5jKSAmJiBLRVlfRElSVFkoaykpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKSB7CisJCWcgPSBQVFJfQlVDS0VUKGItPmMsIGssIGkpOworCQlzdGFsZSA9IHB0cl9zdGFsZShiLT5jLCBrLCBpKTsKKworCQlidHJlZV9idWdfb24oc3RhbGUgPiA5NiwgYiwKKwkJCSAgICAgImtleSB0b28gc3RhbGU6ICVpLCBuZWVkX2djICV1IiwKKwkJCSAgICAgc3RhbGUsIGItPmMtPm5lZWRfZ2MpOworCisJCWJ0cmVlX2J1Z19vbihzdGFsZSAmJiBLRVlfRElSVFkoaykgJiYgS0VZX1NJWkUoayksCisJCQkgICAgIGIsICJzdGFsZSBkaXJ0eSBwb2ludGVyIik7CisKKwkJaWYgKHN0YWxlKQorCQkJcmV0dXJuIHRydWU7CisKKwkJaWYgKGV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MoYi0+YykgJiYKKwkJICAgIGJjaF9leHRlbnRfYmFkX2V4cGVuc2l2ZShiLCBrLCBpKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVpbnQ2NF90IG1lcmdlX2Noa3N1bXMoc3RydWN0IGJrZXkgKmwsIHN0cnVjdCBia2V5ICpyKQoreworCXJldHVybiAobC0+cHRyW0tFWV9QVFJTKGwpXSArIHItPnB0cltLRVlfUFRSUyhyKV0pICYKKwkJfigodWludDY0X3QpMSA8PCA2Myk7Cit9CisKK3N0YXRpYyBib29sIGJjaF9leHRlbnRfbWVyZ2Uoc3RydWN0IGJ0cmVlX2tleXMgKmJrLCBzdHJ1Y3QgYmtleSAqbCwgc3RydWN0IGJrZXkgKnIpCit7CisJc3RydWN0IGJ0cmVlICpiID0gY29udGFpbmVyX29mKGJrLCBzdHJ1Y3QgYnRyZWUsIGtleXMpOworCXVuc2lnbmVkIGk7CisKKwlpZiAoa2V5X21lcmdpbmdfZGlzYWJsZWQoYi0+YykpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhsKTsgaSsrKQorCQlpZiAobC0+cHRyW2ldICsgUFRSKDAsIEtFWV9TSVpFKGwpLCAwKSAhPSByLT5wdHJbaV0gfHwKKwkJICAgIFBUUl9CVUNLRVRfTlIoYi0+YywgbCwgaSkgIT0gUFRSX0JVQ0tFVF9OUihiLT5jLCByLCBpKSkKKwkJCXJldHVybiBmYWxzZTsKKworCS8qIEtleXMgd2l0aCBubyBwb2ludGVycyBhcmVuJ3QgcmVzdHJpY3RlZCB0byBvbmUgYnVja2V0IGFuZCBjb3VsZAorCSAqIG92ZXJmbG93IEtFWV9TSVpFCisJICovCisJaWYgKEtFWV9TSVpFKGwpICsgS0VZX1NJWkUocikgPiBVU0hSVF9NQVgpIHsKKwkJU0VUX0tFWV9PRkZTRVQobCwgS0VZX09GRlNFVChsKSArIFVTSFJUX01BWCAtIEtFWV9TSVpFKGwpKTsKKwkJU0VUX0tFWV9TSVpFKGwsIFVTSFJUX01BWCk7CisKKwkJYmNoX2N1dF9mcm9udChsLCByKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChLRVlfQ1NVTShsKSkgeworCQlpZiAoS0VZX0NTVU0ocikpCisJCQlsLT5wdHJbS0VZX1BUUlMobCldID0gbWVyZ2VfY2hrc3VtcyhsLCByKTsKKwkJZWxzZQorCQkJU0VUX0tFWV9DU1VNKGwsIDApOworCX0KKworCVNFVF9LRVlfT0ZGU0VUKGwsIEtFWV9PRkZTRVQobCkgKyBLRVlfU0laRShyKSk7CisJU0VUX0tFWV9TSVpFKGwsIEtFWV9TSVpFKGwpICsgS0VZX1NJWkUocikpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHN0cnVjdCBidHJlZV9rZXlzX29wcyBiY2hfZXh0ZW50X2tleXNfb3BzID0geworCS5zb3J0X2NtcAk9IGJjaF9leHRlbnRfc29ydF9jbXAsCisJLnNvcnRfZml4dXAJPSBiY2hfZXh0ZW50X3NvcnRfZml4dXAsCisJLmluc2VydF9maXh1cAk9IGJjaF9leHRlbnRfaW5zZXJ0X2ZpeHVwLAorCS5rZXlfaW52YWxpZAk9IGJjaF9leHRlbnRfaW52YWxpZCwKKwkua2V5X2JhZAk9IGJjaF9leHRlbnRfYmFkLAorCS5rZXlfbWVyZ2UJPSBiY2hfZXh0ZW50X21lcmdlLAorCS5rZXlfdG9fdGV4dAk9IGJjaF9leHRlbnRfdG9fdGV4dCwKKwkua2V5X2R1bXAJPSBiY2hfYmtleV9kdW1wLAorCS5pc19leHRlbnRzCT0gdHJ1ZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmggYi9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2V4dGVudHMuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9CQ0FDSEVfRVhURU5UU19ICisjZGVmaW5lIF9CQ0FDSEVfRVhURU5UU19ICisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYnRyZWVfa2V5c19vcHMgYmNoX2J0cmVlX2tleXNfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBidHJlZV9rZXlzX29wcyBiY2hfZXh0ZW50X2tleXNfb3BzOworCitzdHJ1Y3QgYmtleTsKK3N0cnVjdCBjYWNoZV9zZXQ7CisKK3ZvaWQgYmNoX2V4dGVudF90b190ZXh0KGNoYXIgKiwgc2l6ZV90LCBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKK2Jvb2wgX19iY2hfYnRyZWVfcHRyX2ludmFsaWQoc3RydWN0IGNhY2hlX3NldCAqLCBjb25zdCBzdHJ1Y3QgYmtleSAqKTsKKworI2VuZGlmIC8qIF9CQ0FDSEVfRVhURU5UU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9pby5jIGIvZHJpdmVycy9tZC9iY2FjaGUvaW8uYwppbmRleCA5MDU2NjMyLi5mYTAyOGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9pby5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2lvLmMKQEAgLTExLDE3OCArMTEsNDAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogCi1zdGF0aWMgdm9pZCBiY2hfYmlfaWR4X2hhY2tfZW5kaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCi17Ci0Jc3RydWN0IGJpbyAqcCA9IGJpby0+YmlfcHJpdmF0ZTsKLQotCWJpb19lbmRpbyhwLCBlcnJvcik7Ci0JYmlvX3B1dChiaW8pOwotfQotCi1zdGF0aWMgdm9pZCBiY2hfZ2VuZXJpY19tYWtlX3JlcXVlc3RfaGFjayhzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JaWYgKGJpby0+YmlfaWR4KSB7Ci0JCXN0cnVjdCBiaW8gKmNsb25lID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBiaW9fc2VnbWVudHMoYmlvKSk7Ci0KLQkJbWVtY3B5KGNsb25lLT5iaV9pb192ZWMsCi0JCSAgICAgICBiaW9faW92ZWMoYmlvKSwKLQkJICAgICAgIGJpb19zZWdtZW50cyhiaW8pICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7Ci0KLQkJY2xvbmUtPmJpX3NlY3Rvcgk9IGJpby0+Ymlfc2VjdG9yOwotCQljbG9uZS0+YmlfYmRldgkJPSBiaW8tPmJpX2JkZXY7Ci0JCWNsb25lLT5iaV9ydwkJPSBiaW8tPmJpX3J3OwotCQljbG9uZS0+YmlfdmNudAkJPSBiaW9fc2VnbWVudHMoYmlvKTsKLQkJY2xvbmUtPmJpX3NpemUJCT0gYmlvLT5iaV9zaXplOwotCi0JCWNsb25lLT5iaV9wcml2YXRlCT0gYmlvOwotCQljbG9uZS0+YmlfZW5kX2lvCT0gYmNoX2JpX2lkeF9oYWNrX2VuZGlvOwotCi0JCWJpbyA9IGNsb25lOwotCX0KLQotCS8qCi0JICogSGFjaywgc2luY2UgZHJpdmVycyB0aGF0IGNsb25lIGJpb3MgY2xvbmUgdXAgdG8gYmlfbWF4X3ZlY3MsIGJ1dCBvdXIKLQkgKiBiaW9zIG1pZ2h0IGhhdmUgaGFkIG1vcmUgdGhhbiB0aGF0IChiZWZvcmUgd2Ugc3BsaXQgdGhlbSBwZXIgZGV2aWNlCi0JICogbGltaXRhdGlvbnMpLgotCSAqCi0JICogVG8gYmUgdGFrZW4gb3V0IG9uY2UgaW1tdXRhYmxlIGJ2ZWMgc3R1ZmYgaXMgaW4uCi0JICovCi0JYmlvLT5iaV9tYXhfdmVjcyA9IGJpby0+YmlfdmNudDsKLQotCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7Ci19Ci0KLS8qKgotICogYmNoX2Jpb19zcGxpdCAtIHNwbGl0IGEgYmlvCi0gKiBAYmlvOgliaW8gdG8gc3BsaXQKLSAqIEBzZWN0b3JzOgludW1iZXIgb2Ygc2VjdG9ycyB0byBzcGxpdCBmcm9tIHRoZSBmcm9udCBvZiBAYmlvCi0gKiBAZ2ZwOglnZnAgbWFzawotICogQGJzOgkJYmlvIHNldCB0byBhbGxvY2F0ZSBmcm9tCi0gKgotICogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGJpbyB3aGljaCByZXByZXNlbnRzIEBzZWN0b3JzIGZyb20gdGhlIHN0YXJ0IG9mCi0gKiBAYmlvLCBhbmQgdXBkYXRlcyBAYmlvIHRvIHJlcHJlc2VudCB0aGUgcmVtYWluaW5nIHNlY3RvcnMuCi0gKgotICogSWYgYmlvX3NlY3RvcnMoQGJpbykgd2FzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBAc2VjdG9ycywgcmV0dXJucyBAYmlvCi0gKiB1bmNoYW5nZWQuCi0gKgotICogVGhlIG5ld2x5IGFsbG9jYXRlZCBiaW8gd2lsbCBwb2ludCB0byBAYmlvJ3MgYmlfaW9fdmVjLCBpZiB0aGUgc3BsaXQgd2FzIG9uIGEKLSAqIGJ2ZWMgYm91bmRyeTsgaXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IEBiaW8gaXMgbm90Ci0gKiBmcmVlZCBiZWZvcmUgdGhlIHNwbGl0LgotICovCi1zdHJ1Y3QgYmlvICpiY2hfYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpbywgaW50IHNlY3RvcnMsCi0JCQkgIGdmcF90IGdmcCwgc3RydWN0IGJpb19zZXQgKmJzKQotewotCXVuc2lnbmVkIGlkeCA9IGJpby0+YmlfaWR4LCB2Y250ID0gMCwgbmJ5dGVzID0gc2VjdG9ycyA8PCA5OwotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlzdHJ1Y3QgYmlvICpyZXQgPSBOVUxMOwotCi0JQlVHX09OKHNlY3RvcnMgPD0gMCk7Ci0KLQlpZiAoc2VjdG9ycyA+PSBiaW9fc2VjdG9ycyhiaW8pKQotCQlyZXR1cm4gYmlvOwotCi0JaWYgKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgewotCQlyZXQgPSBiaW9fYWxsb2NfYmlvc2V0KGdmcCwgMSwgYnMpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiBOVUxMOwotCQlpZHggPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpZHgpIHsKLQkJdmNudCA9IGlkeCAtIGJpby0+YmlfaWR4OwotCi0JCWlmICghbmJ5dGVzKSB7Ci0JCQlyZXQgPSBiaW9fYWxsb2NfYmlvc2V0KGdmcCwgdmNudCwgYnMpOwotCQkJaWYgKCFyZXQpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW1lbWNweShyZXQtPmJpX2lvX3ZlYywgYmlvX2lvdmVjKGJpbyksCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSAqIHZjbnQpOwotCi0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChuYnl0ZXMgPCBidi0+YnZfbGVuKSB7Ci0JCQlyZXQgPSBiaW9fYWxsb2NfYmlvc2V0KGdmcCwgKyt2Y250LCBicyk7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbWVtY3B5KHJldC0+YmlfaW9fdmVjLCBiaW9faW92ZWMoYmlvKSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJpb192ZWMpICogdmNudCk7Ci0KLQkJCXJldC0+YmlfaW9fdmVjW3ZjbnQgLSAxXS5idl9sZW4gPSBuYnl0ZXM7Ci0JCQlidi0+YnZfb2Zmc2V0CSs9IG5ieXRlczsKLQkJCWJ2LT5idl9sZW4JLT0gbmJ5dGVzOwotCQkJYnJlYWs7Ci0JCX0KLQotCQluYnl0ZXMgLT0gYnYtPmJ2X2xlbjsKLQl9Ci1vdXQ6Ci0JcmV0LT5iaV9iZGV2CT0gYmlvLT5iaV9iZGV2OwotCXJldC0+Ymlfc2VjdG9yCT0gYmlvLT5iaV9zZWN0b3I7Ci0JcmV0LT5iaV9zaXplCT0gc2VjdG9ycyA8PCA5OwotCXJldC0+YmlfcncJPSBiaW8tPmJpX3J3OwotCXJldC0+YmlfdmNudAk9IHZjbnQ7Ci0JcmV0LT5iaV9tYXhfdmVjcyA9IHZjbnQ7Ci0KLQliaW8tPmJpX3NlY3RvcgkrPSBzZWN0b3JzOwotCWJpby0+Ymlfc2l6ZQktPSBzZWN0b3JzIDw8IDk7Ci0JYmlvLT5iaV9pZHgJID0gaWR4OwotCi0JaWYgKGJpb19pbnRlZ3JpdHkoYmlvKSkgewotCQlpZiAoYmlvX2ludGVncml0eV9jbG9uZShyZXQsIGJpbywgZ2ZwKSkgewotCQkJYmlvX3B1dChyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQliaW9faW50ZWdyaXR5X3RyaW0ocmV0LCAwLCBiaW9fc2VjdG9ycyhyZXQpKTsKLQkJYmlvX2ludGVncml0eV90cmltKGJpbywgYmlvX3NlY3RvcnMocmV0KSwgYmlvX3NlY3RvcnMoYmlvKSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGJjaF9iaW9fbWF4X3NlY3RvcnMoc3RydWN0IGJpbyAqYmlvKQogewotCXVuc2lnbmVkIHJldCA9IGJpb19zZWN0b3JzKGJpbyk7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpOwotCXVuc2lnbmVkIG1heF9zZWdtZW50cyA9IG1pbl90KHVuc2lnbmVkLCBCSU9fTUFYX1BBR0VTLAotCQkJCSAgICAgIHF1ZXVlX21heF9zZWdtZW50cyhxKSk7CisJc3RydWN0IGJpb192ZWMgYnY7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCXVuc2lnbmVkIHJldCA9IDAsIHNlZyA9IDA7CiAKIAlpZiAoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKQotCQlyZXR1cm4gbWluKHJldCwgcS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMpOworCQlyZXR1cm4gbWluKGJpb19zZWN0b3JzKGJpbyksIHEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzKTsKIAotCWlmIChiaW9fc2VnbWVudHMoYmlvKSA+IG1heF9zZWdtZW50cyB8fAotCSAgICBxLT5tZXJnZV9idmVjX2ZuKSB7Ci0JCXN0cnVjdCBiaW9fdmVjICpidjsKLQkJaW50IGksIHNlZyA9IDA7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaXRlcikgeworCQlzdHJ1Y3QgYnZlY19tZXJnZV9kYXRhIGJ2bSA9IHsKKwkJCS5iaV9iZGV2CT0gYmlvLT5iaV9iZGV2LAorCQkJLmJpX3NlY3Rvcgk9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkuYmlfc2l6ZQk9IHJldCA8PCA5LAorCQkJLmJpX3J3CQk9IGJpby0+YmlfcncsCisJCX07CiAKLQkJcmV0ID0gMDsKKwkJaWYgKHNlZyA9PSBtaW5fdCh1bnNpZ25lZCwgQklPX01BWF9QQUdFUywKKwkJCQkgcXVldWVfbWF4X3NlZ21lbnRzKHEpKSkKKwkJCWJyZWFrOwogCi0JCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKLQkJCXN0cnVjdCBidmVjX21lcmdlX2RhdGEgYnZtID0gewotCQkJCS5iaV9iZGV2CT0gYmlvLT5iaV9iZGV2LAotCQkJCS5iaV9zZWN0b3IJPSBiaW8tPmJpX3NlY3RvciwKLQkJCQkuYmlfc2l6ZQk9IHJldCA8PCA5LAotCQkJCS5iaV9ydwkJPSBiaW8tPmJpX3J3LAotCQkJfTsKKwkJaWYgKHEtPm1lcmdlX2J2ZWNfZm4gJiYKKwkJICAgIHEtPm1lcmdlX2J2ZWNfZm4ocSwgJmJ2bSwgJmJ2KSA8IChpbnQpIGJ2LmJ2X2xlbikKKwkJCWJyZWFrOwogCi0JCQlpZiAoc2VnID09IG1heF9zZWdtZW50cykKLQkJCQlicmVhazsKLQotCQkJaWYgKHEtPm1lcmdlX2J2ZWNfZm4gJiYKLQkJCSAgICBxLT5tZXJnZV9idmVjX2ZuKHEsICZidm0sIGJ2KSA8IChpbnQpIGJ2LT5idl9sZW4pCi0JCQkJYnJlYWs7Ci0KLQkJCXNlZysrOwotCQkJcmV0ICs9IGJ2LT5idl9sZW4gPj4gOTsKLQkJfQorCQlzZWcrKzsKKwkJcmV0ICs9IGJ2LmJ2X2xlbiA+PiA5OwogCX0KIAogCXJldCA9IG1pbihyZXQsIHF1ZXVlX21heF9zZWN0b3JzKHEpKTsKIAogCVdBUk5fT04oIXJldCk7Ci0JcmV0ID0gbWF4X3QoaW50LCByZXQsIGJpb19pb3ZlYyhiaW8pLT5idl9sZW4gPj4gOSk7CisJcmV0ID0gbWF4X3QoaW50LCByZXQsIGJpb19pb3ZlYyhiaW8pLmJ2X2xlbiA+PiA5KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xOTMsNyArNTUsNyBAQAogCiAJcy0+YmlvLT5iaV9lbmRfaW8gPSBzLT5iaV9lbmRfaW87CiAJcy0+YmlvLT5iaV9wcml2YXRlID0gcy0+YmlfcHJpdmF0ZTsKLQliaW9fZW5kaW8ocy0+YmlvLCAwKTsKKwliaW9fZW5kaW9fbm9kZWMocy0+YmlvLCAwKTsKIAogCWNsb3N1cmVfZGVidWdfZGVzdHJveSgmcy0+Y2wpOwogCW1lbXBvb2xfZnJlZShzLCBzLT5wLT5iaW9fc3BsaXRfaG9vayk7CkBAIC0yMzIsMTkgKzk0LDE5IEBACiAJYmlvX2dldChiaW8pOwogCiAJZG8gewotCQluID0gYmNoX2Jpb19zcGxpdChiaW8sIGJjaF9iaW9fbWF4X3NlY3RvcnMoYmlvKSwKLQkJCQkgIEdGUF9OT0lPLCBzLT5wLT5iaW9fc3BsaXQpOworCQluID0gYmlvX25leHRfc3BsaXQoYmlvLCBiY2hfYmlvX21heF9zZWN0b3JzKGJpbyksCisJCQkJICAgR0ZQX05PSU8sIHMtPnAtPmJpb19zcGxpdCk7CiAKIAkJbi0+YmlfZW5kX2lvCT0gYmNoX2Jpb19zdWJtaXRfc3BsaXRfZW5kaW87CiAJCW4tPmJpX3ByaXZhdGUJPSAmcy0+Y2w7CiAKIAkJY2xvc3VyZV9nZXQoJnMtPmNsKTsKLQkJYmNoX2dlbmVyaWNfbWFrZV9yZXF1ZXN0X2hhY2sobik7CisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KG4pOwogCX0gd2hpbGUgKG4gIT0gYmlvKTsKIAogCWNvbnRpbnVlX2F0KCZzLT5jbCwgYmNoX2Jpb19zdWJtaXRfc3BsaXRfZG9uZSwgTlVMTCk7CiBzdWJtaXQ6Ci0JYmNoX2dlbmVyaWNfbWFrZV9yZXF1ZXN0X2hhY2soYmlvKTsKKwlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwogfQogCiAvKiBCaW9zIHdpdGggaGVhZGVycyAqLwpAQCAtMjcyLDggKzEzNCw4IEBACiB7CiAJc3RydWN0IGJiaW8gKmIgPSBjb250YWluZXJfb2YoYmlvLCBzdHJ1Y3QgYmJpbywgYmlvKTsKIAotCWJpby0+Ymlfc2VjdG9yCT0gUFRSX09GRlNFVCgmYi0+a2V5LCAwKTsKLQliaW8tPmJpX2JkZXYJPSBQVFJfQ0FDSEUoYywgJmItPmtleSwgMCktPmJkZXY7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcgk9IFBUUl9PRkZTRVQoJmItPmtleSwgMCk7CisJYmlvLT5iaV9iZGV2CQk9IFBUUl9DQUNIRShjLCAmYi0+a2V5LCAwKS0+YmRldjsKIAogCWItPnN1Ym1pdF90aW1lX3VzID0gbG9jYWxfY2xvY2tfdXMoKTsKIAljbG9zdXJlX2Jpb19zdWJtaXQoYmlvLCBiaW8tPmJpX3ByaXZhdGUsIFBUUl9DQUNIRShjLCAmYi0+a2V5LCAwKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMKaW5kZXggZWNkYWE2Ny4uMTgwMzlhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuYwpAQCAtNDQsMTcgKzQ0LDE3IEBACiAKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKIAotCXByX2RlYnVnKCJyZWFkaW5nICVsbHUiLCAodWludDY0X3QpIGJ1Y2tldCk7CisJcHJfZGVidWcoInJlYWRpbmcgJXUiLCBidWNrZXRfaW5kZXgpOwogCiAJd2hpbGUgKG9mZnNldCA8IGNhLT5zYi5idWNrZXRfc2l6ZSkgewogcmVyZWFkOgkJbGVmdCA9IGNhLT5zYi5idWNrZXRfc2l6ZSAtIG9mZnNldDsKLQkJbGVuID0gbWluX3QodW5zaWduZWQsIGxlZnQsIFBBR0VfU0VDVE9SUyAqIDgpOworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCwgbGVmdCwgUEFHRV9TRUNUT1JTIDw8IEpTRVRfQklUUyk7CiAKIAkJYmlvX3Jlc2V0KGJpbyk7Ci0JCWJpby0+Ymlfc2VjdG9yCT0gYnVja2V0ICsgb2Zmc2V0OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yCT0gYnVja2V0ICsgb2Zmc2V0OwogCQliaW8tPmJpX2JkZXYJPSBjYS0+YmRldjsKIAkJYmlvLT5iaV9ydwk9IFJFQUQ7Ci0JCWJpby0+Ymlfc2l6ZQk9IGxlbiA8PCA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IGxlbiA8PCA5OwogCiAJCWJpby0+YmlfZW5kX2lvCT0gam91cm5hbF9yZWFkX2VuZGlvOwogCQliaW8tPmJpX3ByaXZhdGUgPSAmY2w7CkBAIC03NCwxOSArNzQsMjggQEAKIAkJCXN0cnVjdCBsaXN0X2hlYWQgKndoZXJlOwogCQkJc2l6ZV90IGJsb2NrcywgYnl0ZXMgPSBzZXRfYnl0ZXMoaik7CiAKLQkJCWlmIChqLT5tYWdpYyAhPSBqc2V0X21hZ2ljKCZjYS0+c2IpKQorCQkJaWYgKGotPm1hZ2ljICE9IGpzZXRfbWFnaWMoJmNhLT5zYikpIHsKKwkJCQlwcl9kZWJ1ZygiJXU6IGJhZCBtYWdpYyIsIGJ1Y2tldF9pbmRleCk7CiAJCQkJcmV0dXJuIHJldDsKKwkJCX0KIAotCQkJaWYgKGJ5dGVzID4gbGVmdCA8PCA5KQorCQkJaWYgKGJ5dGVzID4gbGVmdCA8PCA5IHx8CisJCQkgICAgYnl0ZXMgPiBQQUdFX1NJWkUgPDwgSlNFVF9CSVRTKSB7CisJCQkJcHJfaW5mbygiJXU6IHRvbyBiaWcsICV6dSBieXRlcywgb2Zmc2V0ICV1IiwKKwkJCQkJYnVja2V0X2luZGV4LCBieXRlcywgb2Zmc2V0KTsKIAkJCQlyZXR1cm4gcmV0OworCQkJfQogCiAJCQlpZiAoYnl0ZXMgPiBsZW4gPDwgOSkKIAkJCQlnb3RvIHJlcmVhZDsKIAotCQkJaWYgKGotPmNzdW0gIT0gY3N1bV9zZXQoaikpCisJCQlpZiAoai0+Y3N1bSAhPSBjc3VtX3NldChqKSkgeworCQkJCXByX2luZm8oIiV1OiBiYWQgY3N1bSwgJXp1IGJ5dGVzLCBvZmZzZXQgJXUiLAorCQkJCQlidWNrZXRfaW5kZXgsIGJ5dGVzLCBvZmZzZXQpOwogCQkJCXJldHVybiByZXQ7CisJCQl9CiAKLQkJCWJsb2NrcyA9IHNldF9ibG9ja3MoaiwgY2EtPnNldCk7CisJCQlibG9ja3MgPSBzZXRfYmxvY2tzKGosIGJsb2NrX2J5dGVzKGNhLT5zZXQpKTsKIAogCQkJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CiAJCQkJaSA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwKQEAgLTI3NSw3ICsyODQsNyBAQAogCQl9CiAKIAkJZm9yIChrID0gaS0+ai5zdGFydDsKLQkJICAgICBrIDwgZW5kKCZpLT5qKTsKKwkJICAgICBrIDwgYnNldF9ia2V5X2xhc3QoJmktPmopOwogCQkgICAgIGsgPSBia2V5X25leHQoaykpIHsKIAkJCXVuc2lnbmVkIGo7CiAKQEAgLTMxMyw3ICszMjIsNyBAQAogCQkJCSBuLCBpLT5qLnNlcSAtIDEsIHN0YXJ0LCBlbmQpOwogCiAJCWZvciAoayA9IGktPmouc3RhcnQ7Ci0JCSAgICAgayA8IGVuZCgmaS0+aik7CisJCSAgICAgayA8IGJzZXRfYmtleV9sYXN0KCZpLT5qKTsKIAkJICAgICBrID0gYmtleV9uZXh0KGspKSB7CiAJCQl0cmFjZV9iY2FjaGVfam91cm5hbF9yZXBsYXlfa2V5KGspOwogCkBAIC00MzcsMTMgKzQ0NiwxMyBAQAogCQlhdG9taWNfc2V0KCZqYS0+ZGlzY2FyZF9pbl9mbGlnaHQsIERJU0NBUkRfSU5fRkxJR0hUKTsKIAogCQliaW9faW5pdChiaW8pOwotCQliaW8tPmJpX3NlY3RvcgkJPSBidWNrZXRfdG9fc2VjdG9yKGNhLT5zZXQsCisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSBidWNrZXRfdG9fc2VjdG9yKGNhLT5zZXQsCiAJCQkJCQljYS0+c2IuZFtqYS0+ZGlzY2FyZF9pZHhdKTsKIAkJYmlvLT5iaV9iZGV2CQk9IGNhLT5iZGV2OwogCQliaW8tPmJpX3J3CQk9IFJFUV9XUklURXxSRVFfRElTQ0FSRDsKIAkJYmlvLT5iaV9tYXhfdmVjcwk9IDE7CiAJCWJpby0+YmlfaW9fdmVjCQk9IGJpby0+YmlfaW5saW5lX3ZlY3M7Ci0JCWJpby0+Ymlfc2l6ZQkJPSBidWNrZXRfYnl0ZXMoY2EpOworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IGJ1Y2tldF9ieXRlcyhjYSk7CiAJCWJpby0+YmlfZW5kX2lvCQk9IGpvdXJuYWxfZGlzY2FyZF9lbmRpbzsKIAogCQljbG9zdXJlX2dldCgmY2EtPnNldC0+Y2wpOwpAQCAtNTU1LDYgKzU2NCwxNCBAQAogCWNvbnRpbnVlX2F0X25vYmFycmllcihjbCwgam91cm5hbF93cml0ZSwgc3lzdGVtX3dxKTsKIH0KIAorc3RhdGljIHZvaWQgam91cm5hbF93cml0ZV91bmxvY2soc3RydWN0IGNsb3N1cmUgKmNsKQoreworCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBjYWNoZV9zZXQsIGpvdXJuYWwuaW8pOworCisJYy0+am91cm5hbC5pb19pbl9mbGlnaHQgPSAwOworCXNwaW5fdW5sb2NrKCZjLT5qb3VybmFsLmxvY2spOworfQorCiBzdGF0aWMgdm9pZCBqb3VybmFsX3dyaXRlX3VubG9ja2VkKHN0cnVjdCBjbG9zdXJlICpjbCkKIAlfX3JlbGVhc2VzKGMtPmpvdXJuYWwubG9jaykKIHsKQEAgLTU2MiwyMiArNTc5LDE1IEBACiAJc3RydWN0IGNhY2hlICpjYTsKIAlzdHJ1Y3Qgam91cm5hbF93cml0ZSAqdyA9IGMtPmpvdXJuYWwuY3VyOwogCXN0cnVjdCBia2V5ICprID0gJmMtPmpvdXJuYWwua2V5OwotCXVuc2lnbmVkIGksIHNlY3RvcnMgPSBzZXRfYmxvY2tzKHctPmRhdGEsIGMpICogYy0+c2IuYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBpLCBzZWN0b3JzID0gc2V0X2Jsb2Nrcyh3LT5kYXRhLCBibG9ja19ieXRlcyhjKSkgKgorCQljLT5zYi5ibG9ja19zaXplOwogCiAJc3RydWN0IGJpbyAqYmlvOwogCXN0cnVjdCBiaW9fbGlzdCBsaXN0OwogCWJpb19saXN0X2luaXQoJmxpc3QpOwogCiAJaWYgKCF3LT5uZWVkX3dyaXRlKSB7Ci0JCS8qCi0JCSAqIFhYWDogaGF2ZSB0byB1bmxvY2sgY2xvc3VyZSBiZWZvcmUgd2UgdW5sb2NrIGpvdXJuYWwgbG9jaywKLQkJICogZWxzZSB3ZSByYWNlIHdpdGggYmNoX2pvdXJuYWwoKS4gQnV0IHRoaXMgd2F5IHdlIHJhY2UKLQkJICogYWdhaW5zdCBjYWNoZSBzZXQgdW5yZWdpc3Rlci4gRG9oLgotCQkgKi8KLQkJc2V0X2Nsb3N1cmVfZm4oY2wsIE5VTEwsIE5VTEwpOwotCQljbG9zdXJlX3N1YihjbCwgQ0xPU1VSRV9SVU5OSU5HICsgMSk7Ci0JCXNwaW5fdW5sb2NrKCZjLT5qb3VybmFsLmxvY2spOwotCQlyZXR1cm47CisJCWNsb3N1cmVfcmV0dXJuX3dpdGhfZGVzdHJ1Y3RvcihjbCwgam91cm5hbF93cml0ZV91bmxvY2spOwogCX0gZWxzZSBpZiAoam91cm5hbF9mdWxsKCZjLT5qb3VybmFsKSkgewogCQlqb3VybmFsX3JlY2xhaW0oYyk7CiAJCXNwaW5fdW5sb2NrKCZjLT5qb3VybmFsLmxvY2spOwpAQCAtNTg2LDcgKzU5Niw3IEBACiAJCWNvbnRpbnVlX2F0KGNsLCBqb3VybmFsX3dyaXRlLCBzeXN0ZW1fd3EpOwogCX0KIAotCWMtPmpvdXJuYWwuYmxvY2tzX2ZyZWUgLT0gc2V0X2Jsb2Nrcyh3LT5kYXRhLCBjKTsKKwljLT5qb3VybmFsLmJsb2Nrc19mcmVlIC09IHNldF9ibG9ja3Mody0+ZGF0YSwgYmxvY2tfYnl0ZXMoYykpOwogCiAJdy0+ZGF0YS0+YnRyZWVfbGV2ZWwgPSBjLT5yb290LT5sZXZlbDsKIApAQCAtNjA4LDEwICs2MTgsMTAgQEAKIAkJYXRvbWljX2xvbmdfYWRkKHNlY3RvcnMsICZjYS0+bWV0YV9zZWN0b3JzX3dyaXR0ZW4pOwogCiAJCWJpb19yZXNldChiaW8pOwotCQliaW8tPmJpX3NlY3Rvcgk9IFBUUl9PRkZTRVQoaywgaSk7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSBQVFJfT0ZGU0VUKGssIGkpOwogCQliaW8tPmJpX2JkZXYJPSBjYS0+YmRldjsKIAkJYmlvLT5iaV9ydwk9IFJFUV9XUklURXxSRVFfU1lOQ3xSRVFfTUVUQXxSRVFfRkxVU0h8UkVRX0ZVQTsKLQkJYmlvLT5iaV9zaXplCT0gc2VjdG9ycyA8PCA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IHNlY3RvcnMgPDwgOTsKIAogCQliaW8tPmJpX2VuZF9pbwk9IGpvdXJuYWxfd3JpdGVfZW5kaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IHc7CkBAIC02NTMsMTAgKzY2MywxMiBAQAogCiAJdy0+bmVlZF93cml0ZSA9IHRydWU7CiAKLQlpZiAoY2xvc3VyZV90cnlsb2NrKGNsLCAmYy0+Y2wpKQotCQlqb3VybmFsX3dyaXRlX3VubG9ja2VkKGNsKTsKLQllbHNlCisJaWYgKCFjLT5qb3VybmFsLmlvX2luX2ZsaWdodCkgeworCQljLT5qb3VybmFsLmlvX2luX2ZsaWdodCA9IDE7CisJCWNsb3N1cmVfY2FsbChjbCwgam91cm5hbF93cml0ZV91bmxvY2tlZCwgTlVMTCwgJmMtPmNsKTsKKwl9IGVsc2UgewogCQlzcGluX3VubG9jaygmYy0+am91cm5hbC5sb2NrKTsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgam91cm5hbF93cml0ZSAqam91cm5hbF93YWl0X2Zvcl93cml0ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjLApAQCAtNjY0LDYgKzY3Niw3IEBACiB7CiAJc2l6ZV90IHNlY3RvcnM7CiAJc3RydWN0IGNsb3N1cmUgY2w7CisJYm9vbCB3YWl0ID0gZmFsc2U7CiAKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKIApAQCAtNjczLDE2ICs2ODYsMTkgQEAKIAkJc3RydWN0IGpvdXJuYWxfd3JpdGUgKncgPSBjLT5qb3VybmFsLmN1cjsKIAogCQlzZWN0b3JzID0gX19zZXRfYmxvY2tzKHctPmRhdGEsIHctPmRhdGEtPmtleXMgKyBua2V5cywKLQkJCQkgICAgICAgYykgKiBjLT5zYi5ibG9ja19zaXplOworCQkJCSAgICAgICBibG9ja19ieXRlcyhjKSkgKiBjLT5zYi5ibG9ja19zaXplOwogCiAJCWlmIChzZWN0b3JzIDw9IG1pbl90KHNpemVfdCwKIAkJCQkgICAgIGMtPmpvdXJuYWwuYmxvY2tzX2ZyZWUgKiBjLT5zYi5ibG9ja19zaXplLAogCQkJCSAgICAgUEFHRV9TRUNUT1JTIDw8IEpTRVRfQklUUykpCiAJCQlyZXR1cm4gdzsKIAotCQkvKiBYWFg6IHRyYWNlcG9pbnQgKi8KKwkJaWYgKHdhaXQpCisJCQljbG9zdXJlX3dhaXQoJmMtPmpvdXJuYWwud2FpdCwgJmNsKTsKKwogCQlpZiAoIWpvdXJuYWxfZnVsbCgmYy0+am91cm5hbCkpIHsKLQkJCXRyYWNlX2JjYWNoZV9qb3VybmFsX2VudHJ5X2Z1bGwoYyk7CisJCQlpZiAod2FpdCkKKwkJCQl0cmFjZV9iY2FjaGVfam91cm5hbF9lbnRyeV9mdWxsKGMpOwogCiAJCQkvKgogCQkJICogWFhYOiBJZiB3ZSB3ZXJlIGluc2VydGluZyBzbyBtYW55IGtleXMgdGhhdCB0aGV5CkBAIC02OTIsMTIgKzcwOCwxMSBAQAogCQkJICovCiAJCQlCVUdfT04oIXctPmRhdGEtPmtleXMpOwogCi0JCQljbG9zdXJlX3dhaXQoJnctPndhaXQsICZjbCk7CiAJCQlqb3VybmFsX3RyeV93cml0ZShjKTsgLyogdW5sb2NrcyAqLwogCQl9IGVsc2UgewotCQkJdHJhY2VfYmNhY2hlX2pvdXJuYWxfZnVsbChjKTsKKwkJCWlmICh3YWl0KQorCQkJCXRyYWNlX2JjYWNoZV9qb3VybmFsX2Z1bGwoYyk7CiAKLQkJCWNsb3N1cmVfd2FpdCgmYy0+am91cm5hbC53YWl0LCAmY2wpOwogCQkJam91cm5hbF9yZWNsYWltKGMpOwogCQkJc3Bpbl91bmxvY2soJmMtPmpvdXJuYWwubG9jayk7CiAKQEAgLTcwNiw2ICs3MjEsNyBAQAogCiAJCWNsb3N1cmVfc3luYygmY2wpOwogCQlzcGluX2xvY2soJmMtPmpvdXJuYWwubG9jayk7CisJCXdhaXQgPSB0cnVlOwogCX0KIH0KIApAQCAtNzM2LDcgKzc1Miw3IEBACiAKIAl3ID0gam91cm5hbF93YWl0X2Zvcl93cml0ZShjLCBiY2hfa2V5bGlzdF9ua2V5cyhrZXlzKSk7CiAKLQltZW1jcHkoZW5kKHctPmRhdGEpLCBrZXlzLT5rZXlzLCBiY2hfa2V5bGlzdF9ieXRlcyhrZXlzKSk7CisJbWVtY3B5KGJzZXRfYmtleV9sYXN0KHctPmRhdGEpLCBrZXlzLT5rZXlzLCBiY2hfa2V5bGlzdF9ieXRlcyhrZXlzKSk7CiAJdy0+ZGF0YS0+a2V5cyArPSBiY2hfa2V5bGlzdF9ua2V5cyhrZXlzKTsKIAogCXJldCA9ICZmaWZvX2JhY2soJmMtPmpvdXJuYWwucGluKTsKQEAgLTc4MCw3ICs3OTYsNiBAQAogewogCXN0cnVjdCBqb3VybmFsICpqID0gJmMtPmpvdXJuYWw7CiAKLQljbG9zdXJlX2luaXRfdW5sb2NrZWQoJmotPmlvKTsKIAlzcGluX2xvY2tfaW5pdCgmai0+bG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmotPndvcmssIGpvdXJuYWxfd3JpdGVfd29yayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaAppbmRleCBhNjQ3MmZkLi45MTgwYzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5oCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkvKiB1c2VkIHdoZW4gd2FpdGluZyBiZWNhdXNlIHRoZSBqb3VybmFsIHdhcyBmdWxsICovCiAJc3RydWN0IGNsb3N1cmVfd2FpdGxpc3QJd2FpdDsKIAlzdHJ1Y3QgY2xvc3VyZQkJaW87CisJaW50CQkJaW9faW5fZmxpZ2h0OwogCXN0cnVjdCBkZWxheWVkX3dvcmsJd29yazsKIAogCS8qIE51bWJlciBvZiBibG9ja3MgZnJlZSBpbiB0aGUgYnVja2V0KHMpIHdlJ3JlIGN1cnJlbnRseSB3cml0aW5nIHRvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYwppbmRleCBmMmYwOTk4Li45ZWI2MGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAliaW9fZ2V0KGJpbyk7CiAJYmlvX3NldF9wcmlvKGJpbywgSU9QUklPX1BSSU9fVkFMVUUoSU9QUklPX0NMQVNTX0lETEUsIDApKTsKIAotCWJpby0+Ymlfc2l6ZQkJPSBLRVlfU0laRSgmaW8tPnctPmtleSkgPDwgOTsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IEtFWV9TSVpFKCZpby0+dy0+a2V5KSA8PCA5OwogCWJpby0+YmlfbWF4X3ZlY3MJPSBESVZfUk9VTkRfVVAoS0VZX1NJWkUoJmlvLT53LT5rZXkpLAogCQkJCQkgICAgICAgUEFHRV9TRUNUT1JTKTsKIAliaW8tPmJpX3ByaXZhdGUJCT0gJmlvLT5jbDsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCWlmICghb3AtPmVycm9yKSB7CiAJCW1vdmluZ19pbml0KGlvKTsKIAotCQlpby0+YmlvLmJpby5iaV9zZWN0b3IgPSBLRVlfU1RBUlQoJmlvLT53LT5rZXkpOworCQlpby0+YmlvLmJpby5iaV9pdGVyLmJpX3NlY3RvciA9IEtFWV9TVEFSVCgmaW8tPnctPmtleSk7CiAJCW9wLT53cml0ZV9wcmlvCQk9IDE7CiAJCW9wLT5iaW8JCQk9ICZpby0+YmlvLmJpbzsKIApAQCAtMjExLDcgKzIxMSw3IEBACiAJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpIHsKIAkJdW5zaWduZWQgc2VjdG9yc190b19tb3ZlID0gMDsKIAkJdW5zaWduZWQgcmVzZXJ2ZV9zZWN0b3JzID0gY2EtPnNiLmJ1Y2tldF9zaXplICoKLQkJCW1pbihmaWZvX3VzZWQoJmNhLT5mcmVlKSwgY2EtPmZyZWUuc2l6ZSAvIDIpOworCQkJZmlmb191c2VkKCZjYS0+ZnJlZVtSRVNFUlZFX01PVklOR0dDXSk7CiAKIAkJY2EtPmhlYXAudXNlZCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYwppbmRleCA2MWJjZmMyLi43MmNkMjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogCiBzdGF0aWMgdm9pZCBiaW9fY3N1bShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBia2V5ICprKQogewotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJdWludDY0X3QgY3N1bSA9IDA7Ci0JaW50IGk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7Ci0JCXZvaWQgKmQgPSBrbWFwKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7Ci0JCWNzdW0gPSBiY2hfY3JjNjRfdXBkYXRlKGNzdW0sIGQsIGJ2LT5idl9sZW4pOwotCQlrdW5tYXAoYnYtPmJ2X3BhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGl0ZXIpIHsKKwkJdm9pZCAqZCA9IGttYXAoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CisJCWNzdW0gPSBiY2hfY3JjNjRfdXBkYXRlKGNzdW0sIGQsIGJ2LmJ2X2xlbik7CisJCWt1bm1hcChidi5idl9wYWdlKTsKIAl9CiAKIAlrLT5wdHJbS0VZX1BUUlMoayldID0gY3N1bSAmICh+MFVMTCA+PiAxKTsKQEAgLTI1NCwyNiArMjU0LDQ0IEBACiAJY2xvc3VyZV9yZXR1cm4oY2wpOwogfQogCitzdGF0aWMgaW50IGJjaF9rZXlsaXN0X3JlYWxsb2Moc3RydWN0IGtleWxpc3QgKmwsIHVuc2lnbmVkIHU2NHMsCisJCQkgICAgICAgc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwlzaXplX3Qgb2xkc2l6ZSA9IGJjaF9rZXlsaXN0X25rZXlzKGwpOworCXNpemVfdCBuZXdzaXplID0gb2xkc2l6ZSArIHU2NHM7CisKKwkvKgorCSAqIFRoZSBqb3VybmFsbGluZyBjb2RlIGRvZXNuJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBrZXlzIHRvIGluc2VydAorCSAqIGlzIGJpZ2dlciB0aGFuIGFuIGVtcHR5IHdyaXRlOiBJZiB3ZSBqdXN0IHJldHVybiAtRU5PTUVNIGhlcmUsCisJICogYmlvX2luc2VydCgpIGFuZCBiaW9faW52YWxpZGF0ZSgpIHdpbGwgaW5zZXJ0IHRoZSBrZXlzIGNyZWF0ZWQgc28gZmFyCisJICogYW5kIGZpbmlzaCB0aGUgcmVzdCB3aGVuIHRoZSBrZXlsaXN0IGlzIGVtcHR5LgorCSAqLworCWlmIChuZXdzaXplICogc2l6ZW9mKHVpbnQ2NF90KSA+IGJsb2NrX2J5dGVzKGMpIC0gc2l6ZW9mKHN0cnVjdCBqc2V0KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gX19iY2hfa2V5bGlzdF9yZWFsbG9jKGwsIHU2NHMpOworfQorCiBzdGF0aWMgdm9pZCBiY2hfZGF0YV9pbnZhbGlkYXRlKHN0cnVjdCBjbG9zdXJlICpjbCkKIHsKIAlzdHJ1Y3QgZGF0YV9pbnNlcnRfb3AgKm9wID0gY29udGFpbmVyX29mKGNsLCBzdHJ1Y3QgZGF0YV9pbnNlcnRfb3AsIGNsKTsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBvcC0+YmlvOwogCiAJcHJfZGVidWcoImludmFsaWRhdGluZyAlaSBzZWN0b3JzIGZyb20gJWxsdSIsCi0JCSBiaW9fc2VjdG9ycyhiaW8pLCAodWludDY0X3QpIGJpby0+Ymlfc2VjdG9yKTsKKwkJIGJpb19zZWN0b3JzKGJpbyksICh1aW50NjRfdCkgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKIAl3aGlsZSAoYmlvX3NlY3RvcnMoYmlvKSkgewogCQl1bnNpZ25lZCBzZWN0b3JzID0gbWluKGJpb19zZWN0b3JzKGJpbyksCiAJCQkJICAgICAgIDFVIDw8IChLRVlfU0laRV9CSVRTIC0gMSkpOwogCi0JCWlmIChiY2hfa2V5bGlzdF9yZWFsbG9jKCZvcC0+aW5zZXJ0X2tleXMsIDAsIG9wLT5jKSkKKwkJaWYgKGJjaF9rZXlsaXN0X3JlYWxsb2MoJm9wLT5pbnNlcnRfa2V5cywgMiwgb3AtPmMpKQogCQkJZ290byBvdXQ7CiAKLQkJYmlvLT5iaV9zZWN0b3IJKz0gc2VjdG9yczsKLQkJYmlvLT5iaV9zaXplCS09IHNlY3RvcnMgPDwgOTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvcgkrPSBzZWN0b3JzOworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZQktPSBzZWN0b3JzIDw8IDk7CiAKIAkJYmNoX2tleWxpc3RfYWRkKCZvcC0+aW5zZXJ0X2tleXMsCi0JCQkJJktFWShvcC0+aW5vZGUsIGJpby0+Ymlfc2VjdG9yLCBzZWN0b3JzKSk7CisJCQkJJktFWShvcC0+aW5vZGUsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsIHNlY3RvcnMpKTsKIAl9CiAKIAlvcC0+aW5zZXJ0X2RhdGFfZG9uZSA9IHRydWU7CkBAIC0zNTYsMjEgKzM3NCwyMSBAQAogCiAJCS8qIDEgZm9yIHRoZSBkZXZpY2UgcG9pbnRlciBhbmQgMSBmb3IgdGhlIGNoa3N1bSAqLwogCQlpZiAoYmNoX2tleWxpc3RfcmVhbGxvYygmb3AtPmluc2VydF9rZXlzLAotCQkJCQkxICsgKG9wLT5jc3VtID8gMSA6IDApLAorCQkJCQkzICsgKG9wLT5jc3VtID8gMSA6IDApLAogCQkJCQlvcC0+YykpCiAJCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIGJjYWNoZV93cSk7CiAKIAkJayA9IG9wLT5pbnNlcnRfa2V5cy50b3A7CiAJCWJrZXlfaW5pdChrKTsKIAkJU0VUX0tFWV9JTk9ERShrLCBvcC0+aW5vZGUpOwotCQlTRVRfS0VZX09GRlNFVChrLCBiaW8tPmJpX3NlY3Rvcik7CisJCVNFVF9LRVlfT0ZGU0VUKGssIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCiAJCWlmICghYmNoX2FsbG9jX3NlY3RvcnMob3AtPmMsIGssIGJpb19zZWN0b3JzKGJpbyksCiAJCQkJICAgICAgIG9wLT53cml0ZV9wb2ludCwgb3AtPndyaXRlX3ByaW8sCiAJCQkJICAgICAgIG9wLT53cml0ZWJhY2spKQogCQkJZ290byBlcnI7CiAKLQkJbiA9IGJjaF9iaW9fc3BsaXQoYmlvLCBLRVlfU0laRShrKSwgR0ZQX05PSU8sIHNwbGl0KTsKKwkJbiA9IGJpb19uZXh0X3NwbGl0KGJpbywgS0VZX1NJWkUoayksIEdGUF9OT0lPLCBzcGxpdCk7CiAKIAkJbi0+YmlfZW5kX2lvCT0gYmNoX2RhdGFfaW5zZXJ0X2VuZGlvOwogCQluLT5iaV9wcml2YXRlCT0gY2w7CkBAIC01MjEsNyArNTM5LDcgQEAKIAkgICAgIChiaW8tPmJpX3J3ICYgUkVRX1dSSVRFKSkpCiAJCWdvdG8gc2tpcDsKIAotCWlmIChiaW8tPmJpX3NlY3RvciAmIChjLT5zYi5ibG9ja19zaXplIC0gMSkgfHwKKwlpZiAoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAmIChjLT5zYi5ibG9ja19zaXplIC0gMSkgfHwKIAkgICAgYmlvX3NlY3RvcnMoYmlvKSAmIChjLT5zYi5ibG9ja19zaXplIC0gMSkpIHsKIAkJcHJfZGVidWcoInNraXBwaW5nIHVuYWxpZ25lZCBpbyIpOwogCQlnb3RvIHNraXA7CkBAIC01NDUsOCArNTYzLDggQEAKIAogCXNwaW5fbG9jaygmZGMtPmlvX2xvY2spOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkoaSwgaW9oYXNoKGRjLCBiaW8tPmJpX3NlY3RvciksIGhhc2gpCi0JCWlmIChpLT5sYXN0ID09IGJpby0+Ymlfc2VjdG9yICYmCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaSwgaW9oYXNoKGRjLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSwgaGFzaCkKKwkJaWYgKGktPmxhc3QgPT0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAmJgogCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywgaS0+amlmZmllcykpCiAJCQlnb3RvIGZvdW5kOwogCkBAIC01NTUsOCArNTczLDggQEAKIAlhZGRfc2VxdWVudGlhbCh0YXNrKTsKIAlpLT5zZXF1ZW50aWFsID0gMDsKIGZvdW5kOgotCWlmIChpLT5zZXF1ZW50aWFsICsgYmlvLT5iaV9zaXplID4gaS0+c2VxdWVudGlhbCkKLQkJaS0+c2VxdWVudGlhbAkrPSBiaW8tPmJpX3NpemU7CisJaWYgKGktPnNlcXVlbnRpYWwgKyBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA+IGktPnNlcXVlbnRpYWwpCisJCWktPnNlcXVlbnRpYWwJKz0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAKIAlpLT5sYXN0CQkJID0gYmlvX2VuZF9zZWN0b3IoYmlvKTsKIAlpLT5qaWZmaWVzCQkgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKTsKQEAgLTU5NiwxNiArNjE0LDEzIEBACiAJLyogU3RhY2sgZnJhbWUgZm9yIGJpb19jb21wbGV0ZSAqLwogCXN0cnVjdCBjbG9zdXJlCQljbDsKIAotCXN0cnVjdCBiY2FjaGVfZGV2aWNlCSpkOwotCiAJc3RydWN0IGJiaW8JCWJpbzsKIAlzdHJ1Y3QgYmlvCQkqb3JpZ19iaW87CiAJc3RydWN0IGJpbwkJKmNhY2hlX21pc3M7CisJc3RydWN0IGJjYWNoZV9kZXZpY2UJKmQ7CiAKIAl1bnNpZ25lZAkJaW5zZXJ0X2Jpb19zZWN0b3JzOwotCiAJdW5zaWduZWQJCXJlY292ZXJhYmxlOjE7Ci0JdW5zaWduZWQJCXVuYWxpZ25lZF9idmVjOjE7CiAJdW5zaWduZWQJCXdyaXRlOjE7CiAJdW5zaWduZWQJCXJlYWRfZGlydHlfZGF0YToxOwogCkBAIC02MzAsNyArNjQ1LDggQEAKIAogCWlmIChlcnJvcikKIAkJcy0+aW9wLmVycm9yID0gZXJyb3I7Ci0JZWxzZSBpZiAocHRyX3N0YWxlKHMtPmlvcC5jLCAmYi0+a2V5LCAwKSkgeworCWVsc2UgaWYgKCFLRVlfRElSVFkoJmItPmtleSkgJiYKKwkJIHB0cl9zdGFsZShzLT5pb3AuYywgJmItPmtleSwgMCkpIHsKIAkJYXRvbWljX2xvbmdfaW5jKCZzLT5pb3AuYy0+Y2FjaGVfcmVhZF9yYWNlcyk7CiAJCXMtPmlvcC5lcnJvciA9IC1FSU5UUjsKIAl9CkBAIC02NDksMTUgKzY2NSwxNSBAQAogCXN0cnVjdCBia2V5ICpiaW9fa2V5OwogCXVuc2lnbmVkIHB0cjsKIAotCWlmIChia2V5X2NtcChrLCAmS0VZKHMtPmlvcC5pbm9kZSwgYmlvLT5iaV9zZWN0b3IsIDApKSA8PSAwKQorCWlmIChia2V5X2NtcChrLCAmS0VZKHMtPmlvcC5pbm9kZSwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgMCkpIDw9IDApCiAJCXJldHVybiBNQVBfQ09OVElOVUU7CiAKIAlpZiAoS0VZX0lOT0RFKGspICE9IHMtPmlvcC5pbm9kZSB8fAotCSAgICBLRVlfU1RBUlQoaykgPiBiaW8tPmJpX3NlY3RvcikgeworCSAgICBLRVlfU1RBUlQoaykgPiBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSB7CiAJCXVuc2lnbmVkIGJpb19zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKIAkJdW5zaWduZWQgc2VjdG9ycyA9IEtFWV9JTk9ERShrKSA9PSBzLT5pb3AuaW5vZGUKIAkJCT8gbWluX3QodWludDY0X3QsIElOVF9NQVgsCi0JCQkJS0VZX1NUQVJUKGspIC0gYmlvLT5iaV9zZWN0b3IpCisJCQkJS0VZX1NUQVJUKGspIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikKIAkJCTogSU5UX01BWDsKIAogCQlpbnQgcmV0ID0gcy0+ZC0+Y2FjaGVfbWlzcyhiLCBzLCBiaW8sIHNlY3RvcnMpOwpAQCAtNjc5LDE0ICs2OTUsMTQgQEAKIAlpZiAoS0VZX0RJUlRZKGspKQogCQlzLT5yZWFkX2RpcnR5X2RhdGEgPSB0cnVlOwogCi0JbiA9IGJjaF9iaW9fc3BsaXQoYmlvLCBtaW5fdCh1aW50NjRfdCwgSU5UX01BWCwKLQkJCQkgICAgIEtFWV9PRkZTRVQoaykgLSBiaW8tPmJpX3NlY3RvciksCi0JCQkgIEdGUF9OT0lPLCBzLT5kLT5iaW9fc3BsaXQpOworCW4gPSBiaW9fbmV4dF9zcGxpdChiaW8sIG1pbl90KHVpbnQ2NF90LCBJTlRfTUFYLAorCQkJCSAgICAgIEtFWV9PRkZTRVQoaykgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSwKKwkJCSAgIEdGUF9OT0lPLCBzLT5kLT5iaW9fc3BsaXQpOwogCiAJYmlvX2tleSA9ICZjb250YWluZXJfb2Yobiwgc3RydWN0IGJiaW8sIGJpbyktPmtleTsKIAliY2hfYmtleV9jb3B5X3NpbmdsZV9wdHIoYmlvX2tleSwgaywgcHRyKTsKIAotCWJjaF9jdXRfZnJvbnQoJktFWShzLT5pb3AuaW5vZGUsIG4tPmJpX3NlY3RvciwgMCksIGJpb19rZXkpOworCWJjaF9jdXRfZnJvbnQoJktFWShzLT5pb3AuaW5vZGUsIG4tPmJpX2l0ZXIuYmlfc2VjdG9yLCAwKSwgYmlvX2tleSk7CiAJYmNoX2N1dF9iYWNrKCZLRVkocy0+aW9wLmlub2RlLCBiaW9fZW5kX3NlY3RvcihuKSwgMCksIGJpb19rZXkpOwogCiAJbi0+YmlfZW5kX2lvCT0gYmNoX2NhY2hlX3JlYWRfZW5kaW87CkBAIC03MTEsMTAgKzcyNywxMyBAQAogewogCXN0cnVjdCBzZWFyY2ggKnMgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBzZWFyY2gsIGlvcC5jbCk7CiAJc3RydWN0IGJpbyAqYmlvID0gJnMtPmJpby5iaW87CisJaW50IHJldDsKIAotCWludCByZXQgPSBiY2hfYnRyZWVfbWFwX2tleXMoJnMtPm9wLCBzLT5pb3AuYywKLQkJCQkgICAgICZLRVkocy0+aW9wLmlub2RlLCBiaW8tPmJpX3NlY3RvciwgMCksCi0JCQkJICAgICBjYWNoZV9sb29rdXBfZm4sIE1BUF9FTkRfS0VZKTsKKwliY2hfYnRyZWVfb3BfaW5pdCgmcy0+b3AsIC0xKTsKKworCXJldCA9IGJjaF9idHJlZV9tYXBfa2V5cygmcy0+b3AsIHMtPmlvcC5jLAorCQkJCSAmS0VZKHMtPmlvcC5pbm9kZSwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgMCksCisJCQkJIGNhY2hlX2xvb2t1cF9mbiwgTUFQX0VORF9LRVkpOwogCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJY29udGludWVfYXQoY2wsIGNhY2hlX2xvb2t1cCwgYmNhY2hlX3dxKTsKIApAQCAtNzU1LDEzICs3NzQsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2Jpb19ob29rKHN0cnVjdCBzZWFyY2ggKnMpCitzdGF0aWMgdm9pZCBkb19iaW9faG9vayhzdHJ1Y3Qgc2VhcmNoICpzLCBzdHJ1Y3QgYmlvICpvcmlnX2JpbykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSAmcy0+YmlvLmJpbzsKLQltZW1jcHkoYmlvLCBzLT5vcmlnX2Jpbywgc2l6ZW9mKHN0cnVjdCBiaW8pKTsKIAorCWJpb19pbml0KGJpbyk7CisJX19iaW9fY2xvbmVfZmFzdChiaW8sIG9yaWdfYmlvKTsKIAliaW8tPmJpX2VuZF9pbwkJPSByZXF1ZXN0X2VuZGlvOwogCWJpby0+YmlfcHJpdmF0ZQkJPSAmcy0+Y2w7CisKIAlhdG9taWNfc2V0KCZiaW8tPmJpX2NudCwgMyk7CiB9CiAKQEAgLTc3Myw0MyArNzk0LDM2IEBACiAJaWYgKHMtPmlvcC5iaW8pCiAJCWJpb19wdXQocy0+aW9wLmJpbyk7CiAKLQlpZiAocy0+dW5hbGlnbmVkX2J2ZWMpCi0JCW1lbXBvb2xfZnJlZShzLT5iaW8uYmlvLmJpX2lvX3ZlYywgcy0+ZC0+dW5hbGlnbmVkX2J2ZWMpOwotCiAJY2xvc3VyZV9kZWJ1Z19kZXN0cm95KGNsKTsKIAltZW1wb29sX2ZyZWUocywgcy0+ZC0+Yy0+c2VhcmNoKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzZWFyY2ggKnNlYXJjaF9hbGxvYyhzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiY2FjaGVfZGV2aWNlICpkKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2VhcmNoICpzZWFyY2hfYWxsb2Moc3RydWN0IGJpbyAqYmlvLAorCQkJCQkgIHN0cnVjdCBiY2FjaGVfZGV2aWNlICpkKQogewogCXN0cnVjdCBzZWFyY2ggKnM7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwogCiAJcyA9IG1lbXBvb2xfYWxsb2MoZC0+Yy0+c2VhcmNoLCBHRlBfTk9JTyk7Ci0JbWVtc2V0KHMsIDAsIG9mZnNldG9mKHN0cnVjdCBzZWFyY2gsIGlvcC5pbnNlcnRfa2V5cykpOwogCi0JX19jbG9zdXJlX2luaXQoJnMtPmNsLCBOVUxMKTsKKwljbG9zdXJlX2luaXQoJnMtPmNsLCBOVUxMKTsKKwlkb19iaW9faG9vayhzLCBiaW8pOwogCi0Jcy0+aW9wLmlub2RlCQk9IGQtPmlkOwotCXMtPmlvcC5jCQk9IGQtPmM7Ci0Jcy0+ZAkJCT0gZDsKLQlzLT5vcC5sb2NrCQk9IC0xOwotCXMtPmlvcC53cml0ZV9wb2ludAk9IGhhc2hfbG9uZygodW5zaWduZWQgbG9uZykgY3VycmVudCwgMTYpOwogCXMtPm9yaWdfYmlvCQk9IGJpbzsKLQlzLT53cml0ZQkJPSAoYmlvLT5iaV9ydyAmIFJFUV9XUklURSkgIT0gMDsKLQlzLT5pb3AuZmx1c2hfam91cm5hbAk9IChiaW8tPmJpX3J3ICYgKFJFUV9GTFVTSHxSRVFfRlVBKSkgIT0gMDsKKwlzLT5jYWNoZV9taXNzCQk9IE5VTEw7CisJcy0+ZAkJCT0gZDsKIAlzLT5yZWNvdmVyYWJsZQkJPSAxOworCXMtPndyaXRlCQk9IChiaW8tPmJpX3J3ICYgUkVRX1dSSVRFKSAhPSAwOworCXMtPnJlYWRfZGlydHlfZGF0YQk9IDA7CiAJcy0+c3RhcnRfdGltZQkJPSBqaWZmaWVzOwotCWRvX2Jpb19ob29rKHMpOwogCi0JaWYgKGJpby0+Ymlfc2l6ZSAhPSBiaW9fc2VnbWVudHMoYmlvKSAqIFBBR0VfU0laRSkgewotCQlidiA9IG1lbXBvb2xfYWxsb2MoZC0+dW5hbGlnbmVkX2J2ZWMsIEdGUF9OT0lPKTsKLQkJbWVtY3B5KGJ2LCBiaW9faW92ZWMoYmlvKSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykgKiBiaW9fc2VnbWVudHMoYmlvKSk7Ci0KLQkJcy0+YmlvLmJpby5iaV9pb192ZWMJPSBidjsKLQkJcy0+dW5hbGlnbmVkX2J2ZWMJPSAxOwotCX0KKwlzLT5pb3AuYwkJPSBkLT5jOworCXMtPmlvcC5iaW8JCT0gTlVMTDsKKwlzLT5pb3AuaW5vZGUJCT0gZC0+aWQ7CisJcy0+aW9wLndyaXRlX3BvaW50CT0gaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LCAxNik7CisJcy0+aW9wLndyaXRlX3ByaW8JPSAwOworCXMtPmlvcC5lcnJvcgkJPSAwOworCXMtPmlvcC5mbGFncwkJPSAwOworCXMtPmlvcC5mbHVzaF9qb3VybmFsCT0gKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIfFJFUV9GVUEpKSAhPSAwOwogCiAJcmV0dXJuIHM7CiB9CkBAIC04NDksMjYgKzg2MywxMyBAQAogewogCXN0cnVjdCBzZWFyY2ggKnMgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBzZWFyY2gsIGNsKTsKIAlzdHJ1Y3QgYmlvICpiaW8gPSAmcy0+YmlvLmJpbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JaW50IGk7CiAKIAlpZiAocy0+cmVjb3ZlcmFibGUpIHsKIAkJLyogUmV0cnkgZnJvbSB0aGUgYmFja2luZyBkZXZpY2U6ICovCiAJCXRyYWNlX2JjYWNoZV9yZWFkX3JldHJ5KHMtPm9yaWdfYmlvKTsKIAogCQlzLT5pb3AuZXJyb3IgPSAwOwotCQlidiA9IHMtPmJpby5iaW8uYmlfaW9fdmVjOwotCQlkb19iaW9faG9vayhzKTsKLQkJcy0+YmlvLmJpby5iaV9pb192ZWMgPSBidjsKLQotCQlpZiAoIXMtPnVuYWxpZ25lZF9idmVjKQotCQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHMtPm9yaWdfYmlvLCBpKQotCQkJCWJ2LT5idl9vZmZzZXQgPSAwLCBidi0+YnZfbGVuID0gUEFHRV9TSVpFOwotCQllbHNlCi0JCQltZW1jcHkocy0+YmlvLmJpby5iaV9pb192ZWMsCi0JCQkgICAgICAgYmlvX2lvdmVjKHMtPm9yaWdfYmlvKSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJpb192ZWMpICoKLQkJCSAgICAgICBiaW9fc2VnbWVudHMocy0+b3JpZ19iaW8pKTsKKwkJZG9fYmlvX2hvb2socywgcy0+b3JpZ19iaW8pOwogCiAJCS8qIFhYWDogaW52YWxpZGF0ZSBjYWNoZSAqLwogCkBAIC04OTMsOSArODk0LDkgQEAKIAogCWlmIChzLT5pb3AuYmlvKSB7CiAJCWJpb19yZXNldChzLT5pb3AuYmlvKTsKLQkJcy0+aW9wLmJpby0+Ymlfc2VjdG9yID0gcy0+Y2FjaGVfbWlzcy0+Ymlfc2VjdG9yOworCQlzLT5pb3AuYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHMtPmNhY2hlX21pc3MtPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQlzLT5pb3AuYmlvLT5iaV9iZGV2ID0gcy0+Y2FjaGVfbWlzcy0+YmlfYmRldjsKLQkJcy0+aW9wLmJpby0+Ymlfc2l6ZSA9IHMtPmluc2VydF9iaW9fc2VjdG9ycyA8PCA5OworCQlzLT5pb3AuYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBzLT5pbnNlcnRfYmlvX3NlY3RvcnMgPDwgOTsKIAkJYmNoX2Jpb19tYXAocy0+aW9wLmJpbywgTlVMTCk7CiAKIAkJYmlvX2NvcHlfZGF0YShzLT5jYWNoZV9taXNzLCBzLT5pb3AuYmlvKTsKQEAgLTkwNCw4ICs5MDUsNyBAQAogCQlzLT5jYWNoZV9taXNzID0gTlVMTDsKIAl9CiAKLQlpZiAodmVyaWZ5KGRjLCAmcy0+YmlvLmJpbykgJiYgcy0+cmVjb3ZlcmFibGUgJiYKLQkgICAgIXMtPnVuYWxpZ25lZF9idmVjICYmICFzLT5yZWFkX2RpcnR5X2RhdGEpCisJaWYgKHZlcmlmeShkYywgJnMtPmJpby5iaW8pICYmIHMtPnJlY292ZXJhYmxlICYmICFzLT5yZWFkX2RpcnR5X2RhdGEpCiAJCWJjaF9kYXRhX3ZlcmlmeShkYywgcy0+b3JpZ19iaW8pOwogCiAJYmlvX2NvbXBsZXRlKHMpOwpAQCAtOTQ1LDcgKzk0NSw3IEBACiAJc3RydWN0IGJpbyAqbWlzcywgKmNhY2hlX2JpbzsKIAogCWlmIChzLT5jYWNoZV9taXNzIHx8IHMtPmlvcC5ieXBhc3MpIHsKLQkJbWlzcyA9IGJjaF9iaW9fc3BsaXQoYmlvLCBzZWN0b3JzLCBHRlBfTk9JTywgcy0+ZC0+YmlvX3NwbGl0KTsKKwkJbWlzcyA9IGJpb19uZXh0X3NwbGl0KGJpbywgc2VjdG9ycywgR0ZQX05PSU8sIHMtPmQtPmJpb19zcGxpdCk7CiAJCXJldCA9IG1pc3MgPT0gYmlvID8gTUFQX0RPTkUgOiBNQVBfQ09OVElOVUU7CiAJCWdvdG8gb3V0X3N1Ym1pdDsKIAl9CkBAIC05NTksNyArOTU5LDcgQEAKIAlzLT5pbnNlcnRfYmlvX3NlY3RvcnMgPSBtaW4oc2VjdG9ycywgYmlvX3NlY3RvcnMoYmlvKSArIHJlYWRhKTsKIAogCXMtPmlvcC5yZXBsYWNlX2tleSA9IEtFWShzLT5pb3AuaW5vZGUsCi0JCQkJIGJpby0+Ymlfc2VjdG9yICsgcy0+aW5zZXJ0X2Jpb19zZWN0b3JzLAorCQkJCSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICsgcy0+aW5zZXJ0X2Jpb19zZWN0b3JzLAogCQkJCSBzLT5pbnNlcnRfYmlvX3NlY3RvcnMpOwogCiAJcmV0ID0gYmNoX2J0cmVlX2luc2VydF9jaGVja19rZXkoYiwgJnMtPm9wLCAmcy0+aW9wLnJlcGxhY2Vfa2V5KTsKQEAgLTk2OCw3ICs5NjgsNyBAQAogCiAJcy0+aW9wLnJlcGxhY2UgPSB0cnVlOwogCi0JbWlzcyA9IGJjaF9iaW9fc3BsaXQoYmlvLCBzZWN0b3JzLCBHRlBfTk9JTywgcy0+ZC0+YmlvX3NwbGl0KTsKKwltaXNzID0gYmlvX25leHRfc3BsaXQoYmlvLCBzZWN0b3JzLCBHRlBfTk9JTywgcy0+ZC0+YmlvX3NwbGl0KTsKIAogCS8qIGJ0cmVlX3NlYXJjaF9yZWN1cnNlKCkncyBidHJlZSBpdGVyYXRvciBpcyBubyBnb29kIGFueW1vcmUgKi8KIAlyZXQgPSBtaXNzID09IGJpbyA/IE1BUF9ET05FIDogLUVJTlRSOwpAQCAtOTc5LDkgKzk3OSw5IEBACiAJaWYgKCFjYWNoZV9iaW8pCiAJCWdvdG8gb3V0X3N1Ym1pdDsKIAotCWNhY2hlX2Jpby0+Ymlfc2VjdG9yCT0gbWlzcy0+Ymlfc2VjdG9yOwotCWNhY2hlX2Jpby0+YmlfYmRldgk9IG1pc3MtPmJpX2JkZXY7Ci0JY2FjaGVfYmlvLT5iaV9zaXplCT0gcy0+aW5zZXJ0X2Jpb19zZWN0b3JzIDw8IDk7CisJY2FjaGVfYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcgk9IG1pc3MtPmJpX2l0ZXIuYmlfc2VjdG9yOworCWNhY2hlX2Jpby0+YmlfYmRldgkJPSBtaXNzLT5iaV9iZGV2OworCWNhY2hlX2Jpby0+YmlfaXRlci5iaV9zaXplCT0gcy0+aW5zZXJ0X2Jpb19zZWN0b3JzIDw8IDk7CiAKIAljYWNoZV9iaW8tPmJpX2VuZF9pbwk9IHJlcXVlc3RfZW5kaW87CiAJY2FjaGVfYmlvLT5iaV9wcml2YXRlCT0gJnMtPmNsOwpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIHsKIAlzdHJ1Y3QgY2xvc3VyZSAqY2wgPSAmcy0+Y2w7CiAJc3RydWN0IGJpbyAqYmlvID0gJnMtPmJpby5iaW87Ci0Jc3RydWN0IGJrZXkgc3RhcnQgPSBLRVkoZGMtPmRpc2suaWQsIGJpby0+Ymlfc2VjdG9yLCAwKTsKKwlzdHJ1Y3QgYmtleSBzdGFydCA9IEtFWShkYy0+ZGlzay5pZCwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgMCk7CiAJc3RydWN0IGJrZXkgZW5kID0gS0VZKGRjLT5kaXNrLmlkLCBiaW9fZW5kX3NlY3RvcihiaW8pLCAwKTsKIAogCWJjaF9rZXlidWZfY2hlY2tfb3ZlcmxhcHBpbmcoJnMtPmlvcC5jLT5tb3ZpbmdfZ2Nfa2V5cywgJnN0YXJ0LCAmZW5kKTsKQEAgLTEwODcsOCArMTA4Nyw3IEBACiAJCQljbG9zdXJlX2Jpb19zdWJtaXQoZmx1c2gsIGNsLCBzLT5kKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXMtPmlvcC5iaW8gPSBiaW9fY2xvbmVfYmlvc2V0KGJpbywgR0ZQX05PSU8sCi0JCQkJCSAgICAgIGRjLT5kaXNrLmJpb19zcGxpdCk7CisJCXMtPmlvcC5iaW8gPSBiaW9fY2xvbmVfZmFzdChiaW8sIEdGUF9OT0lPLCBkYy0+ZGlzay5iaW9fc3BsaXQpOwogCiAJCWNsb3N1cmVfYmlvX3N1Ym1pdChiaW8sIGNsLCBzLT5kKTsKIAl9CkBAIC0xMTI2LDEzICsxMTI1LDEzIEBACiAJcGFydF9zdGF0X3VubG9jaygpOwogCiAJYmlvLT5iaV9iZGV2ID0gZGMtPmJkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgKz0gZGMtPnNiLmRhdGFfb2Zmc2V0OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgKz0gZGMtPnNiLmRhdGFfb2Zmc2V0OwogCiAJaWYgKGNhY2hlZF9kZXZfZ2V0KGRjKSkgewogCQlzID0gc2VhcmNoX2FsbG9jKGJpbywgZCk7CiAJCXRyYWNlX2JjYWNoZV9yZXF1ZXN0X3N0YXJ0KHMtPmQsIGJpbyk7CiAKLQkJaWYgKCFiaW8tPmJpX3NpemUpIHsKKwkJaWYgKCFiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkgewogCQkJLyoKIAkJCSAqIGNhbid0IGNhbGwgYmNoX2pvdXJuYWxfbWV0YSBmcm9tIHVuZGVyCiAJCQkgKiBnZW5lcmljX21ha2VfcmVxdWVzdApAQCAtMTIwNCwyNCArMTIwMywyNCBAQAogc3RhdGljIGludCBmbGFzaF9kZXZfY2FjaGVfbWlzcyhzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBzZWFyY2ggKnMsCiAJCQkJc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzZWN0b3JzKQogewotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKIAkvKiBaZXJvIGZpbGwgYmlvICovCiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7Ci0JCXVuc2lnbmVkIGogPSBtaW4oYnYtPmJ2X2xlbiA+PiA5LCBzZWN0b3JzKTsKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7CisJCXVuc2lnbmVkIGogPSBtaW4oYnYuYnZfbGVuID4+IDksIHNlY3RvcnMpOwogCi0JCXZvaWQgKnAgPSBrbWFwKGJ2LT5idl9wYWdlKTsKLQkJbWVtc2V0KHAgKyBidi0+YnZfb2Zmc2V0LCAwLCBqIDw8IDkpOwotCQlrdW5tYXAoYnYtPmJ2X3BhZ2UpOworCQl2b2lkICpwID0ga21hcChidi5idl9wYWdlKTsKKwkJbWVtc2V0KHAgKyBidi5idl9vZmZzZXQsIDAsIGogPDwgOSk7CisJCWt1bm1hcChidi5idl9wYWdlKTsKIAogCQlzZWN0b3JzCS09IGo7CiAJfQogCi0JYmlvX2FkdmFuY2UoYmlvLCBtaW4oc2VjdG9ycyA8PCA5LCBiaW8tPmJpX3NpemUpKTsKKwliaW9fYWR2YW5jZShiaW8sIG1pbihzZWN0b3JzIDw8IDksIGJpby0+YmlfaXRlci5iaV9zaXplKSk7CiAKLQlpZiAoIWJpby0+Ymlfc2l6ZSkKKwlpZiAoIWJpby0+YmlfaXRlci5iaV9zaXplKQogCQlyZXR1cm4gTUFQX0RPTkU7CiAKIAlyZXR1cm4gTUFQX0NPTlRJTlVFOwpAQCAtMTI1NSw3ICsxMjU0LDcgQEAKIAogCXRyYWNlX2JjYWNoZV9yZXF1ZXN0X3N0YXJ0KHMtPmQsIGJpbyk7CiAKLQlpZiAoIWJpby0+Ymlfc2l6ZSkgeworCWlmICghYmlvLT5iaV9pdGVyLmJpX3NpemUpIHsKIAkJLyoKIAkJICogY2FuJ3QgY2FsbCBiY2hfam91cm5hbF9tZXRhIGZyb20gdW5kZXIKIAkJICogZ2VuZXJpY19tYWtlX3JlcXVlc3QKQEAgLTEyNjUsNyArMTI2NCw3IEBACiAJCQkJICAgICAgYmNhY2hlX3dxKTsKIAl9IGVsc2UgaWYgKHJ3KSB7CiAJCWJjaF9rZXlidWZfY2hlY2tfb3ZlcmxhcHBpbmcoJnMtPmlvcC5jLT5tb3ZpbmdfZ2Nfa2V5cywKLQkJCQkJJktFWShkLT5pZCwgYmlvLT5iaV9zZWN0b3IsIDApLAorCQkJCQkmS0VZKGQtPmlkLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCAwKSwKIAkJCQkJJktFWShkLT5pZCwgYmlvX2VuZF9zZWN0b3IoYmlvKSwgMCkpOwogCiAJCXMtPmlvcC5ieXBhc3MJCT0gKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgIT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaAppbmRleCAyY2Q2NWJmLi4zOWYyMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5oCkBAIC0xMywxNyArMTMsMjIgQEAKIAl1aW50MTZfdAkJd3JpdGVfcHJpbzsKIAlzaG9ydAkJCWVycm9yOwogCi0JdW5zaWduZWQJCWJ5cGFzczoxOwotCXVuc2lnbmVkCQl3cml0ZWJhY2s6MTsKLQl1bnNpZ25lZAkJZmx1c2hfam91cm5hbDoxOwotCXVuc2lnbmVkCQljc3VtOjE7CisJdW5pb24geworCQl1aW50MTZfdAlmbGFnczsKIAotCXVuc2lnbmVkCQlyZXBsYWNlOjE7Ci0JdW5zaWduZWQJCXJlcGxhY2VfY29sbGlzaW9uOjE7CisJc3RydWN0IHsKKwkJdW5zaWduZWQJYnlwYXNzOjE7CisJCXVuc2lnbmVkCXdyaXRlYmFjazoxOworCQl1bnNpZ25lZAlmbHVzaF9qb3VybmFsOjE7CisJCXVuc2lnbmVkCWNzdW06MTsKIAotCXVuc2lnbmVkCQlpbnNlcnRfZGF0YV9kb25lOjE7CisJCXVuc2lnbmVkCXJlcGxhY2U6MTsKKwkJdW5zaWduZWQJcmVwbGFjZV9jb2xsaXNpb246MTsKIAotCS8qIEFueXRoaW5nIHBhc3QgdGhpcyBwb2ludCB3b24ndCBnZXQgemVyb2VkIGluIHNlYXJjaF9hbGxvYygpICovCisJCXVuc2lnbmVkCWluc2VydF9kYXRhX2RvbmU6MTsKKwl9OworCX07CisKIAlzdHJ1Y3Qga2V5bGlzdAkJaW5zZXJ0X2tleXM7CiAJQktFWV9QQURERUQocmVwbGFjZV9rZXkpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCmluZGV4IGM1N2JmYTAuLjI0YTNhMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlICJiY2FjaGUuaCIKICNpbmNsdWRlICJidHJlZS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZXh0ZW50cy5oIgogI2luY2x1ZGUgInJlcXVlc3QuaCIKICNpbmNsdWRlICJ3cml0ZWJhY2suaCIKIApAQCAtMjI1LDcgKzIyNiw3IEBACiAJc3RydWN0IGNhY2hlZF9kZXYgKmRjID0gYmlvLT5iaV9wcml2YXRlOwogCS8qIFhYWDogZXJyb3IgY2hlY2tpbmcgKi8KIAotCWNsb3N1cmVfcHV0KCZkYy0+c2Jfd3JpdGUuY2wpOworCWNsb3N1cmVfcHV0KCZkYy0+c2Jfd3JpdGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX3dyaXRlX3N1cGVyKHN0cnVjdCBjYWNoZV9zYiAqc2IsIHN0cnVjdCBiaW8gKmJpbykKQEAgLTIzMyw5ICsyMzQsOSBAQAogCXN0cnVjdCBjYWNoZV9zYiAqb3V0ID0gcGFnZV9hZGRyZXNzKGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UpOwogCXVuc2lnbmVkIGk7CiAKLQliaW8tPmJpX3NlY3Rvcgk9IFNCX1NFQ1RPUjsKLQliaW8tPmJpX3J3CT0gUkVRX1NZTkN8UkVRX01FVEE7Ci0JYmlvLT5iaV9zaXplCT0gU0JfU0laRTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yCT0gU0JfU0VDVE9SOworCWJpby0+YmlfcncJCT0gUkVRX1NZTkN8UkVRX01FVEE7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUJPSBTQl9TSVpFOwogCWJjaF9iaW9fbWFwKGJpbywgTlVMTCk7CiAKIAlvdXQtPm9mZnNldAkJPSBjcHVfdG9fbGU2NChzYi0+b2Zmc2V0KTsKQEAgLTI2MywxMiArMjY0LDIwIEBACiAJc3VibWl0X2JpbyhSRVFfV1JJVEUsIGJpbyk7CiB9CiAKK3N0YXRpYyB2b2lkIGJjaF93cml0ZV9iZGV2X3N1cGVyX3VubG9jayhzdHJ1Y3QgY2xvc3VyZSAqY2wpCit7CisJc3RydWN0IGNhY2hlZF9kZXYgKmRjID0gY29udGFpbmVyX29mKGNsLCBzdHJ1Y3QgY2FjaGVkX2Rldiwgc2Jfd3JpdGUpOworCisJdXAoJmRjLT5zYl93cml0ZV9tdXRleCk7Cit9CisKIHZvaWQgYmNoX3dyaXRlX2JkZXZfc3VwZXIoc3RydWN0IGNhY2hlZF9kZXYgKmRjLCBzdHJ1Y3QgY2xvc3VyZSAqcGFyZW50KQogewotCXN0cnVjdCBjbG9zdXJlICpjbCA9ICZkYy0+c2Jfd3JpdGUuY2w7CisJc3RydWN0IGNsb3N1cmUgKmNsID0gJmRjLT5zYl93cml0ZTsKIAlzdHJ1Y3QgYmlvICpiaW8gPSAmZGMtPnNiX2JpbzsKIAotCWNsb3N1cmVfbG9jaygmZGMtPnNiX3dyaXRlLCBwYXJlbnQpOworCWRvd24oJmRjLT5zYl93cml0ZV9tdXRleCk7CisJY2xvc3VyZV9pbml0KGNsLCBwYXJlbnQpOwogCiAJYmlvX3Jlc2V0KGJpbyk7CiAJYmlvLT5iaV9iZGV2CT0gZGMtPmJkZXY7CkBAIC0yNzgsNyArMjg3LDcgQEAKIAljbG9zdXJlX2dldChjbCk7CiAJX193cml0ZV9zdXBlcigmZGMtPnNiLCBiaW8pOwogCi0JY2xvc3VyZV9yZXR1cm4oY2wpOworCWNsb3N1cmVfcmV0dXJuX3dpdGhfZGVzdHJ1Y3RvcihjbCwgYmNoX3dyaXRlX2JkZXZfc3VwZXJfdW5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfZW5kaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCkBAIC0yODYsMTYgKzI5NSwyNCBAQAogCXN0cnVjdCBjYWNoZSAqY2EgPSBiaW8tPmJpX3ByaXZhdGU7CiAKIAliY2hfY291bnRfaW9fZXJyb3JzKGNhLCBlcnJvciwgIndyaXRpbmcgc3VwZXJibG9jayIpOwotCWNsb3N1cmVfcHV0KCZjYS0+c2V0LT5zYl93cml0ZS5jbCk7CisJY2xvc3VyZV9wdXQoJmNhLT5zZXQtPnNiX3dyaXRlKTsKK30KKworc3RhdGljIHZvaWQgYmNhY2hlX3dyaXRlX3N1cGVyX3VubG9jayhzdHJ1Y3QgY2xvc3VyZSAqY2wpCit7CisJc3RydWN0IGNhY2hlX3NldCAqYyA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IGNhY2hlX3NldCwgc2Jfd3JpdGUpOworCisJdXAoJmMtPnNiX3dyaXRlX211dGV4KTsKIH0KIAogdm9pZCBiY2FjaGVfd3JpdGVfc3VwZXIoc3RydWN0IGNhY2hlX3NldCAqYykKIHsKLQlzdHJ1Y3QgY2xvc3VyZSAqY2wgPSAmYy0+c2Jfd3JpdGUuY2w7CisJc3RydWN0IGNsb3N1cmUgKmNsID0gJmMtPnNiX3dyaXRlOwogCXN0cnVjdCBjYWNoZSAqY2E7CiAJdW5zaWduZWQgaTsKIAotCWNsb3N1cmVfbG9jaygmYy0+c2Jfd3JpdGUsICZjLT5jbCk7CisJZG93bigmYy0+c2Jfd3JpdGVfbXV0ZXgpOworCWNsb3N1cmVfaW5pdChjbCwgJmMtPmNsKTsKIAogCWMtPnNiLnNlcSsrOwogCkBAIC0zMTcsNyArMzM0LDcgQEAKIAkJX193cml0ZV9zdXBlcigmY2EtPnNiLCBiaW8pOwogCX0KIAotCWNsb3N1cmVfcmV0dXJuKGNsKTsKKwljbG9zdXJlX3JldHVybl93aXRoX2Rlc3RydWN0b3IoY2wsIGJjYWNoZV93cml0ZV9zdXBlcl91bmxvY2spOwogfQogCiAvKiBVVUlEIGlvICovCkBAIC0zMjUsMjkgKzM0MiwzNyBAQAogc3RhdGljIHZvaWQgdXVpZF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgY2xvc3VyZSAqY2wgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGNhY2hlX3NldCAqYyA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IGNhY2hlX3NldCwgdXVpZF93cml0ZS5jbCk7CisJc3RydWN0IGNhY2hlX3NldCAqYyA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IGNhY2hlX3NldCwgdXVpZF93cml0ZSk7CiAKIAljYWNoZV9zZXRfZXJyX29uKGVycm9yLCBjLCAiYWNjZXNzaW5nIHV1aWRzIik7CiAJYmNoX2JiaW9fZnJlZShiaW8sIGMpOwogCWNsb3N1cmVfcHV0KGNsKTsKIH0KIAorc3RhdGljIHZvaWQgdXVpZF9pb191bmxvY2soc3RydWN0IGNsb3N1cmUgKmNsKQoreworCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBjYWNoZV9zZXQsIHV1aWRfd3JpdGUpOworCisJdXAoJmMtPnV1aWRfd3JpdGVfbXV0ZXgpOworfQorCiBzdGF0aWMgdm9pZCB1dWlkX2lvKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHVuc2lnbmVkIGxvbmcgcncsCiAJCSAgICBzdHJ1Y3QgYmtleSAqaywgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgY2xvc3VyZSAqY2wgPSAmYy0+dXVpZF93cml0ZS5jbDsKKwlzdHJ1Y3QgY2xvc3VyZSAqY2wgPSAmYy0+dXVpZF93cml0ZTsKIAlzdHJ1Y3QgdXVpZF9lbnRyeSAqdTsKIAl1bnNpZ25lZCBpOwogCWNoYXIgYnVmWzgwXTsKIAogCUJVR19PTighcGFyZW50KTsKLQljbG9zdXJlX2xvY2soJmMtPnV1aWRfd3JpdGUsIHBhcmVudCk7CisJZG93bigmYy0+dXVpZF93cml0ZV9tdXRleCk7CisJY2xvc3VyZV9pbml0KGNsLCBwYXJlbnQpOwogCiAJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKIAkJc3RydWN0IGJpbyAqYmlvID0gYmNoX2JiaW9fYWxsb2MoYyk7CiAKIAkJYmlvLT5iaV9ydwk9IFJFUV9TWU5DfFJFUV9NRVRBfHJ3OwotCQliaW8tPmJpX3NpemUJPSBLRVlfU0laRShrKSA8PCA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IEtFWV9TSVpFKGspIDw8IDk7CiAKIAkJYmlvLT5iaV9lbmRfaW8JPSB1dWlkX2VuZGlvOwogCQliaW8tPmJpX3ByaXZhdGUgPSBjbDsKQEAgLTM1OSw3ICszODQsNyBAQAogCQkJYnJlYWs7CiAJfQogCi0JYmNoX2JrZXlfdG9fdGV4dChidWYsIHNpemVvZihidWYpLCBrKTsKKwliY2hfZXh0ZW50X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7CiAJcHJfZGVidWcoIiVzIFVVSURzIGF0ICVzIiwgcncgJiBSRVFfV1JJVEUgPyAid3JvdGUiIDogInJlYWQiLCBidWYpOwogCiAJZm9yICh1ID0gYy0+dXVpZHM7IHUgPCBjLT51dWlkcyArIGMtPm5yX3V1aWRzOyB1KyspCkBAIC0zNjgsMTQgKzM5MywxNCBAQAogCQkJCSB1IC0gYy0+dXVpZHMsIHUtPnV1aWQsIHUtPmxhYmVsLAogCQkJCSB1LT5maXJzdF9yZWcsIHUtPmxhc3RfcmVnLCB1LT5pbnZhbGlkYXRlZCk7CiAKLQljbG9zdXJlX3JldHVybihjbCk7CisJY2xvc3VyZV9yZXR1cm5fd2l0aF9kZXN0cnVjdG9yKGNsLCB1dWlkX2lvX3VubG9jayk7CiB9CiAKIHN0YXRpYyBjaGFyICp1dWlkX3JlYWQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGpzZXQgKmosIHN0cnVjdCBjbG9zdXJlICpjbCkKIHsKIAlzdHJ1Y3QgYmtleSAqayA9ICZqLT51dWlkX2J1Y2tldDsKIAotCWlmIChiY2hfYnRyZWVfcHRyX2ludmFsaWQoYywgaykpCisJaWYgKF9fYmNoX2J0cmVlX3B0cl9pbnZhbGlkKGMsIGspKQogCQlyZXR1cm4gImJhZCB1dWlkIHBvaW50ZXIiOwogCiAJYmtleV9jb3B5KCZjLT51dWlkX2J1Y2tldCwgayk7CkBAIC00MjAsNyArNDQ1LDcgQEAKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmJjaF9yZWdpc3Rlcl9sb2NrKTsKIAotCWlmIChiY2hfYnVja2V0X2FsbG9jX3NldChjLCBXQVRFUk1BUktfTUVUQURBVEEsICZrLmtleSwgMSwgdHJ1ZSkpCisJaWYgKGJjaF9idWNrZXRfYWxsb2Nfc2V0KGMsIFJFU0VSVkVfQlRSRUUsICZrLmtleSwgMSwgdHJ1ZSkpCiAJCXJldHVybiAxOwogCiAJU0VUX0tFWV9TSVpFKCZrLmtleSwgYy0+c2IuYnVja2V0X3NpemUpOwpAQCAtNTAzLDEwICs1MjgsMTAgQEAKIAogCWNsb3N1cmVfaW5pdF9zdGFjayhjbCk7CiAKLQliaW8tPmJpX3NlY3Rvcgk9IGJ1Y2tldCAqIGNhLT5zYi5idWNrZXRfc2l6ZTsKLQliaW8tPmJpX2JkZXYJPSBjYS0+YmRldjsKLQliaW8tPmJpX3J3CT0gUkVRX1NZTkN8UkVRX01FVEF8cnc7Ci0JYmlvLT5iaV9zaXplCT0gYnVja2V0X2J5dGVzKGNhKTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yCT0gYnVja2V0ICogY2EtPnNiLmJ1Y2tldF9zaXplOworCWJpby0+YmlfYmRldgkJPSBjYS0+YmRldjsKKwliaW8tPmJpX3J3CQk9IFJFUV9TWU5DfFJFUV9NRVRBfHJ3OworCWJpby0+YmlfaXRlci5iaV9zaXplCT0gYnVja2V0X2J5dGVzKGNhKTsKIAogCWJpby0+YmlfZW5kX2lvCT0gcHJpb19lbmRpbzsKIAliaW8tPmJpX3ByaXZhdGUgPSBjYTsKQEAgLTUzOCw4ICs1NjMsOCBAQAogCWF0b21pY19sb25nX2FkZChjYS0+c2IuYnVja2V0X3NpemUgKiBwcmlvX2J1Y2tldHMoY2EpLAogCQkJJmNhLT5tZXRhX3NlY3RvcnNfd3JpdHRlbik7CiAKLQlwcl9kZWJ1ZygiZnJlZSAlenUsIGZyZWVfaW5jICV6dSwgdW51c2VkICV6dSIsIGZpZm9fdXNlZCgmY2EtPmZyZWUpLAotCQkgZmlmb191c2VkKCZjYS0+ZnJlZV9pbmMpLCBmaWZvX3VzZWQoJmNhLT51bnVzZWQpKTsKKwkvL3ByX2RlYnVnKCJmcmVlICV6dSwgZnJlZV9pbmMgJXp1LCB1bnVzZWQgJXp1IiwgZmlmb191c2VkKCZjYS0+ZnJlZSksCisJLy8JIGZpZm9fdXNlZCgmY2EtPmZyZWVfaW5jKSwgZmlmb191c2VkKCZjYS0+dW51c2VkKSk7CiAKIAlmb3IgKGkgPSBwcmlvX2J1Y2tldHMoY2EpIC0gMTsgaSA+PSAwOyAtLWkpIHsKIAkJbG9uZyBidWNrZXQ7CkBAIC01NTgsNyArNTgzLDcgQEAKIAkJcC0+bWFnaWMJPSBwc2V0X21hZ2ljKCZjYS0+c2IpOwogCQlwLT5jc3VtCQk9IGJjaF9jcmM2NCgmcC0+bWFnaWMsIGJ1Y2tldF9ieXRlcyhjYSkgLSA4KTsKIAotCQlidWNrZXQgPSBiY2hfYnVja2V0X2FsbG9jKGNhLCBXQVRFUk1BUktfUFJJTywgdHJ1ZSk7CisJCWJ1Y2tldCA9IGJjaF9idWNrZXRfYWxsb2MoY2EsIFJFU0VSVkVfUFJJTywgdHJ1ZSk7CiAJCUJVR19PTihidWNrZXQgPT0gLTEpOwogCiAJCW11dGV4X3VubG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwpAQCAtNzM5LDggKzc2NCw2IEBACiAJfQogCiAJYmlvX3NwbGl0X3Bvb2xfZnJlZSgmZC0+YmlvX3NwbGl0X2hvb2spOwotCWlmIChkLT51bmFsaWduZWRfYnZlYykKLQkJbWVtcG9vbF9kZXN0cm95KGQtPnVuYWxpZ25lZF9idmVjKTsKIAlpZiAoZC0+YmlvX3NwbGl0KQogCQliaW9zZXRfZnJlZShkLT5iaW9fc3BsaXQpOwogCWlmIChpc192bWFsbG9jX2FkZHIoZC0+ZnVsbF9kaXJ0eV9zdHJpcGVzKSkKQEAgLTc5Myw4ICs4MTYsNiBAQAogCQlyZXR1cm4gbWlub3I7CiAKIAlpZiAoIShkLT5iaW9fc3BsaXQgPSBiaW9zZXRfY3JlYXRlKDQsIG9mZnNldG9mKHN0cnVjdCBiYmlvLCBiaW8pKSkgfHwKLQkgICAgIShkLT51bmFsaWduZWRfYnZlYyA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbCgxLAotCQkJCXNpemVvZihzdHJ1Y3QgYmlvX3ZlYykgKiBCSU9fTUFYX1BBR0VTKSkgfHwKIAkgICAgYmlvX3NwbGl0X3Bvb2xfaW5pdCgmZC0+YmlvX3NwbGl0X2hvb2spIHx8CiAJICAgICEoZC0+ZGlzayA9IGFsbG9jX2Rpc2soMSkpKSB7CiAJCWlkYV9zaW1wbGVfcmVtb3ZlKCZiY2FjaGVfbWlub3IsIG1pbm9yKTsKQEAgLTExMDIsNyArMTEyMyw3IEBACiAJc2V0X2Nsb3N1cmVfZm4oJmRjLT5kaXNrLmNsLCBjYWNoZWRfZGV2X2ZsdXNoLCBzeXN0ZW1fd3EpOwogCWtvYmplY3RfaW5pdCgmZGMtPmRpc2sua29iaiwgJmJjaF9jYWNoZWRfZGV2X2t0eXBlKTsKIAlJTklUX1dPUksoJmRjLT5kZXRhY2gsIGNhY2hlZF9kZXZfZGV0YWNoX2ZpbmlzaCk7Ci0JY2xvc3VyZV9pbml0X3VubG9ja2VkKCZkYy0+c2Jfd3JpdGUpOworCXNlbWFfaW5pdCgmZGMtPnNiX3dyaXRlX211dGV4LCAxKTsKIAlJTklUX0xJU1RfSEVBRCgmZGMtPmlvX2xydSk7CiAJc3Bpbl9sb2NrX2luaXQoJmRjLT5pb19sb2NrKTsKIAliY2hfY2FjaGVfYWNjb3VudGluZ19pbml0KCZkYy0+YWNjb3VudGluZywgJmRjLT5kaXNrLmNsKTsKQEAgLTExMTQsNiArMTEzNSwxMiBAQAogCQlobGlzdF9hZGRfaGVhZCgmaW8tPmhhc2gsIGRjLT5pb19oYXNoICsgUkVDRU5UX0lPKTsKIAl9CiAKKwlkYy0+ZGlzay5zdHJpcGVfc2l6ZSA9IHEtPmxpbWl0cy5pb19vcHQgPj4gOTsKKworCWlmIChkYy0+ZGlzay5zdHJpcGVfc2l6ZSkKKwkJZGMtPnBhcnRpYWxfc3RyaXBlc19leHBlbnNpdmUgPQorCQkJcS0+bGltaXRzLnJhaWRfcGFydGlhbF9zdHJpcGVzX2V4cGVuc2l2ZTsKKwogCXJldCA9IGJjYWNoZV9kZXZpY2VfaW5pdCgmZGMtPmRpc2ssIGJsb2NrX3NpemUsCiAJCQkgZGMtPmJkZXYtPmJkX3BhcnQtPm5yX3NlY3RzIC0gZGMtPnNiLmRhdGFfb2Zmc2V0KTsKIAlpZiAocmV0KQpAQCAtMTMyNSw4ICsxMzUyLDggQEAKIAkJaWYgKGNhKQogCQkJa29iamVjdF9wdXQoJmNhLT5rb2JqKTsKIAorCWJjaF9ic2V0X3NvcnRfc3RhdGVfZnJlZSgmYy0+c29ydCk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYy0+dXVpZHMsIGlsb2cyKGJ1Y2tldF9wYWdlcyhjKSkpOwotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGMtPnNvcnQsIGlsb2cyKGJ1Y2tldF9wYWdlcyhjKSkpOwogCiAJaWYgKGMtPmJpb19zcGxpdCkKIAkJYmlvc2V0X2ZyZWUoYy0+YmlvX3NwbGl0KTsKQEAgLTE0NTEsMjEgKzE0NzgsMTcgQEAKIAljLT5ibG9ja19iaXRzCQk9IGlsb2cyKHNiLT5ibG9ja19zaXplKTsKIAljLT5ucl91dWlkcwkJPSBidWNrZXRfYnl0ZXMoYykgLyBzaXplb2Yoc3RydWN0IHV1aWRfZW50cnkpOwogCi0JYy0+YnRyZWVfcGFnZXMJCT0gYy0+c2IuYnVja2V0X3NpemUgLyBQQUdFX1NFQ1RPUlM7CisJYy0+YnRyZWVfcGFnZXMJCT0gYnVja2V0X3BhZ2VzKGMpOwogCWlmIChjLT5idHJlZV9wYWdlcyA+IEJUUkVFX01BWF9QQUdFUykKIAkJYy0+YnRyZWVfcGFnZXMgPSBtYXhfdChpbnQsIGMtPmJ0cmVlX3BhZ2VzIC8gNCwKIAkJCQkgICAgICAgQlRSRUVfTUFYX1BBR0VTKTsKIAotCWMtPnNvcnRfY3JpdF9mYWN0b3IgPSBpbnRfc3FydChjLT5idHJlZV9wYWdlcyk7Ci0KLQljbG9zdXJlX2luaXRfdW5sb2NrZWQoJmMtPnNiX3dyaXRlKTsKKwlzZW1hX2luaXQoJmMtPnNiX3dyaXRlX211dGV4LCAxKTsKIAltdXRleF9pbml0KCZjLT5idWNrZXRfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+dHJ5X3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmJ1Y2tldF93YWl0KTsKLQljbG9zdXJlX2luaXRfdW5sb2NrZWQoJmMtPnV1aWRfd3JpdGUpOwotCW11dGV4X2luaXQoJmMtPnNvcnRfbG9jayk7CisJc2VtYV9pbml0KCZjLT51dWlkX3dyaXRlX211dGV4LCAxKTsKIAotCXNwaW5fbG9ja19pbml0KCZjLT5zb3J0X3RpbWUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX2djX3RpbWUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX3NwbGl0X3RpbWUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmJ0cmVlX3JlYWRfdGltZS5sb2NrKTsKQEAgLTE0OTMsMTEgKzE1MTYsMTEgQEAKIAkJCQlidWNrZXRfcGFnZXMoYykpKSB8fAogCSAgICAhKGMtPmZpbGxfaXRlciA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbCgxLCBpdGVyX3NpemUpKSB8fAogCSAgICAhKGMtPmJpb19zcGxpdCA9IGJpb3NldF9jcmVhdGUoNCwgb2Zmc2V0b2Yoc3RydWN0IGJiaW8sIGJpbykpKSB8fAotCSAgICAhKGMtPnNvcnQgPSBhbGxvY19idWNrZXRfcGFnZXMoR0ZQX0tFUk5FTCwgYykpIHx8CiAJICAgICEoYy0+dXVpZHMgPSBhbGxvY19idWNrZXRfcGFnZXMoR0ZQX0tFUk5FTCwgYykpIHx8CiAJICAgIGJjaF9qb3VybmFsX2FsbG9jKGMpIHx8CiAJICAgIGJjaF9idHJlZV9jYWNoZV9hbGxvYyhjKSB8fAotCSAgICBiY2hfb3Blbl9idWNrZXRzX2FsbG9jKGMpKQorCSAgICBiY2hfb3Blbl9idWNrZXRzX2FsbG9jKGMpIHx8CisJICAgIGJjaF9ic2V0X3NvcnRfc3RhdGVfaW5pdCgmYy0+c29ydCwgaWxvZzIoYy0+YnRyZWVfcGFnZXMpKSkKIAkJZ290byBlcnI7CiAKIAljLT5jb25nZXN0ZWRfcmVhZF90aHJlc2hvbGRfdXMJPSAyMDAwOwpAQCAtMTU1Myw3ICsxNTc2LDcgQEAKIAkJayA9ICZqLT5idHJlZV9yb290OwogCiAJCWVyciA9ICJiYWQgYnRyZWUgcm9vdCI7Ci0JCWlmIChiY2hfYnRyZWVfcHRyX2ludmFsaWQoYywgaykpCisJCWlmIChfX2JjaF9idHJlZV9wdHJfaW52YWxpZChjLCBrKSkKIAkJCWdvdG8gZXJyOwogCiAJCWVyciA9ICJlcnJvciByZWFkaW5nIGJ0cmVlIHJvb3QiOwpAQCAtMTc0Nyw2ICsxNzcwLDcgQEAKIHZvaWQgYmNoX2NhY2hlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGNhY2hlICpjYSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2FjaGUsIGtvYmopOworCXVuc2lnbmVkIGk7CiAKIAlpZiAoY2EtPnNldCkKIAkJY2EtPnNldC0+Y2FjaGVbY2EtPnNiLm5yX3RoaXNfZGV2XSA9IE5VTEw7CkBAIC0xNzYwLDcgKzE3ODQsOSBAQAogCWZyZWVfaGVhcCgmY2EtPmhlYXApOwogCWZyZWVfZmlmbygmY2EtPnVudXNlZCk7CiAJZnJlZV9maWZvKCZjYS0+ZnJlZV9pbmMpOwotCWZyZWVfZmlmbygmY2EtPmZyZWUpOworCisJZm9yIChpID0gMDsgaSA8IFJFU0VSVkVfTlI7IGkrKykKKwkJZnJlZV9maWZvKCZjYS0+ZnJlZVtpXSk7CiAKIAlpZiAoY2EtPnNiX2Jpby5iaV9pbmxpbmVfdmVjc1swXS5idl9wYWdlKQogCQlwdXRfcGFnZShjYS0+c2JfYmlvLmJpX2lvX3ZlY1swXS5idl9wYWdlKTsKQEAgLTE3ODYsMTAgKzE4MTIsMTIgQEAKIAljYS0+am91cm5hbC5iaW8uYmlfbWF4X3ZlY3MgPSA4OwogCWNhLT5qb3VybmFsLmJpby5iaV9pb192ZWMgPSBjYS0+am91cm5hbC5iaW8uYmlfaW5saW5lX3ZlY3M7CiAKLQlmcmVlID0gcm91bmR1cF9wb3dfb2ZfdHdvKGNhLT5zYi5uYnVja2V0cykgPj4gOTsKLQlmcmVlID0gbWF4X3Qoc2l6ZV90LCBmcmVlLCAocHJpb19idWNrZXRzKGNhKSArIDgpICogMik7CisJZnJlZSA9IHJvdW5kdXBfcG93X29mX3R3byhjYS0+c2IubmJ1Y2tldHMpID4+IDEwOwogCi0JaWYgKCFpbml0X2ZpZm8oJmNhLT5mcmVlLAlmcmVlLCBHRlBfS0VSTkVMKSB8fAorCWlmICghaW5pdF9maWZvKCZjYS0+ZnJlZVtSRVNFUlZFX0JUUkVFXSwgOCwgR0ZQX0tFUk5FTCkgfHwKKwkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9QUklPXSwgcHJpb19idWNrZXRzKGNhKSwgR0ZQX0tFUk5FTCkgfHwKKwkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9NT1ZJTkdHQ10sIGZyZWUsIEdGUF9LRVJORUwpIHx8CisJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfTk9ORV0sIGZyZWUsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlX2luYywJZnJlZSA8PCAyLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9maWZvKCZjYS0+dW51c2VkLAlmcmVlIDw8IDIsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2hlYXAoJmNhLT5oZWFwLAlmcmVlIDw8IDMsIEdGUF9LRVJORUwpIHx8CkBAIC0yMDM0LDcgKzIwNjIsOCBAQAogCQlrb2JqZWN0X3B1dChiY2FjaGVfa29iaik7CiAJaWYgKGJjYWNoZV93cSkKIAkJZGVzdHJveV93b3JrcXVldWUoYmNhY2hlX3dxKTsKLQl1bnJlZ2lzdGVyX2Jsa2RldihiY2FjaGVfbWFqb3IsICJiY2FjaGUiKTsKKwlpZiAoYmNhY2hlX21ham9yKQorCQl1bnJlZ2lzdGVyX2Jsa2RldihiY2FjaGVfbWFqb3IsICJiY2FjaGUiKTsKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmVib290KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N5c2ZzLmMKaW5kZXggYTFmODU2MS4uYzZhYjY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9zeXNmcy5jCkBAIC0xMDIsNyArMTAyLDYgQEAKIHJ3X2F0dHJpYnV0ZShrZXlfbWVyZ2luZ19kaXNhYmxlZCk7CiByd19hdHRyaWJ1dGUoZ2NfYWx3YXlzX3Jld3JpdGUpOwogcndfYXR0cmlidXRlKGV4cGVuc2l2ZV9kZWJ1Z19jaGVja3MpOwotcndfYXR0cmlidXRlKGZyZWVsaXN0X3BlcmNlbnQpOwogcndfYXR0cmlidXRlKGNhY2hlX3JlcGxhY2VtZW50X3BvbGljeSk7CiByd19hdHRyaWJ1dGUoYnRyZWVfc2hyaW5rZXJfZGlzYWJsZWQpOwogcndfYXR0cmlidXRlKGNvcHlfZ2NfZW5hYmxlZCk7CkBAIC00MDEsNiArNDAwLDQ4IEBACiB9OwogS1RZUEUoYmNoX2ZsYXNoX2Rldik7CiAKK3N0cnVjdCBic2V0X3N0YXRzX29wIHsKKwlzdHJ1Y3QgYnRyZWVfb3Agb3A7CisJc2l6ZV90IG5vZGVzOworCXN0cnVjdCBic2V0X3N0YXRzIHN0YXRzOworfTsKKworc3RhdGljIGludCBidHJlZV9ic2V0X3N0YXRzKHN0cnVjdCBidHJlZV9vcCAqYl9vcCwgc3RydWN0IGJ0cmVlICpiKQoreworCXN0cnVjdCBic2V0X3N0YXRzX29wICpvcCA9IGNvbnRhaW5lcl9vZihiX29wLCBzdHJ1Y3QgYnNldF9zdGF0c19vcCwgb3ApOworCisJb3AtPm5vZGVzKys7CisJYmNoX2J0cmVlX2tleXNfc3RhdHMoJmItPmtleXMsICZvcC0+c3RhdHMpOworCisJcmV0dXJuIE1BUF9DT05USU5VRTsKK30KKworaW50IGJjaF9ic2V0X3ByaW50X3N0YXRzKHN0cnVjdCBjYWNoZV9zZXQgKmMsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnNldF9zdGF0c19vcCBvcDsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisJYmNoX2J0cmVlX29wX2luaXQoJm9wLm9wLCAtMSk7CisKKwlyZXQgPSBiY2hfYnRyZWVfbWFwX25vZGVzKCZvcC5vcCwgYywgJlpFUk9fS0VZLCBidHJlZV9ic2V0X3N0YXRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwKKwkJCSJidHJlZSBub2RlczoJCSV6dVxuIgorCQkJIndyaXR0ZW4gc2V0czoJCSV6dVxuIgorCQkJInVud3JpdHRlbiBzZXRzOgkJJXp1XG4iCisJCQkid3JpdHRlbiBrZXkgYnl0ZXM6CSV6dVxuIgorCQkJInVud3JpdHRlbiBrZXkgYnl0ZXM6CSV6dVxuIgorCQkJImZsb2F0czoJCQklenVcbiIKKwkJCSJmYWlsZWQ6CQkJJXp1XG4iLAorCQkJb3Aubm9kZXMsCisJCQlvcC5zdGF0cy5zZXRzX3dyaXR0ZW4sIG9wLnN0YXRzLnNldHNfdW53cml0dGVuLAorCQkJb3Auc3RhdHMuYnl0ZXNfd3JpdHRlbiwgb3Auc3RhdHMuYnl0ZXNfdW53cml0dGVuLAorCQkJb3Auc3RhdHMuZmxvYXRzLCBvcC5zdGF0cy5mYWlsZWQpOworfQorCiBTSE9XKF9fYmNoX2NhY2hlX3NldCkKIHsKIAl1bnNpZ25lZCByb290X3VzYWdlKHN0cnVjdCBjYWNoZV9zZXQgKmMpCkBAIC00MTksNyArNDYwLDcgQEAKIAkJCXJ3X2xvY2soZmFsc2UsIGIsIGItPmxldmVsKTsKIAkJfSB3aGlsZSAoYiAhPSBjLT5yb290KTsKIAotCQlmb3JfZWFjaF9rZXlfZmlsdGVyKGIsIGssICZpdGVyLCBiY2hfcHRyX2JhZCkKKwkJZm9yX2VhY2hfa2V5X2ZpbHRlcigmYi0+a2V5cywgaywgJml0ZXIsIGJjaF9wdHJfYmFkKQogCQkJYnl0ZXMgKz0gYmtleV9ieXRlcyhrKTsKIAogCQlyd191bmxvY2soZmFsc2UsIGIpOwpAQCAtNDM0LDcgKzQ3NSw3IEBACiAKIAkJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkKLQkJCXJldCArPSAxIDw8IChiLT5wYWdlX29yZGVyICsgUEFHRV9TSElGVCk7CisJCQlyZXQgKz0gMSA8PCAoYi0+a2V5cy5wYWdlX29yZGVyICsgUEFHRV9TSElGVCk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiAJCXJldHVybiByZXQ7CkBAIC00OTEsNyArNTMyLDcgQEAKIAogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPmJ0cmVlX2djX3RpbWUsCWJ0cmVlX2djLCBzZWMsIG1zKTsKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5idHJlZV9zcGxpdF90aW1lLAlidHJlZV9zcGxpdCwgc2VjLCB1cyk7Ci0Jc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+c29ydF90aW1lLAkJYnRyZWVfc29ydCwgbXMsIHVzKTsKKwlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5zb3J0LnRpbWUsCQlidHJlZV9zb3J0LCBtcywgdXMpOwogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPmJ0cmVlX3JlYWRfdGltZSwJYnRyZWVfcmVhZCwgbXMsIHVzKTsKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT50cnlfaGFyZGVyX3RpbWUsCXRyeV9oYXJkZXIsIG1zLCB1cyk7CiAKQEAgLTcxMSw5ICs3NTIsNiBAQAogCXN5c2ZzX3ByaW50KGlvX2Vycm9ycywKIAkJICAgIGF0b21pY19yZWFkKCZjYS0+aW9fZXJyb3JzKSA+PiBJT19FUlJPUl9TSElGVCk7CiAKLQlzeXNmc19wcmludChmcmVlbGlzdF9wZXJjZW50LCBjYS0+ZnJlZS5zaXplICogMTAwIC8KLQkJICAgICgoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMpKTsKLQogCWlmIChhdHRyID09ICZzeXNmc19jYWNoZV9yZXBsYWNlbWVudF9wb2xpY3kpCiAJCXJldHVybiBiY2hfc25wcmludF9zdHJpbmdfbGlzdChidWYsIFBBR0VfU0laRSwKIAkJCQkJICAgICAgIGNhY2hlX3JlcGxhY2VtZW50X3BvbGljaWVzLApAQCAtODIwLDMyICs4NTgsNiBAQAogCQl9CiAJfQogCi0JaWYgKGF0dHIgPT0gJnN5c2ZzX2ZyZWVsaXN0X3BlcmNlbnQpIHsKLQkJREVDTEFSRV9GSUZPKGxvbmcsIGZyZWUpOwotCQlsb25nIGk7Ci0JCXNpemVfdCBwID0gc3RydG91bF9vcl9yZXR1cm4oYnVmKTsKLQotCQlwID0gY2xhbXBfdChzaXplX3QsCi0JCQkgICAgKChzaXplX3QpIGNhLT5zYi5uYnVja2V0cyAqIHApIC8gMTAwLAotCQkJICAgIHJvdW5kdXBfcG93X29mX3R3byhjYS0+c2IubmJ1Y2tldHMpID4+IDksCi0JCQkgICAgY2EtPnNiLm5idWNrZXRzIC8gMik7Ci0KLQkJaWYgKCFpbml0X2ZpZm9fZXhhY3QoJmZyZWUsIHAsIEdGUF9LRVJORUwpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJbXV0ZXhfbG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwotCi0JCWZpZm9fbW92ZSgmZnJlZSwgJmNhLT5mcmVlKTsKLQkJZmlmb19zd2FwKCZmcmVlLCAmY2EtPmZyZWUpOwotCi0JCW11dGV4X3VubG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwotCi0JCXdoaWxlIChmaWZvX3BvcCgmZnJlZSwgaSkpCi0JCQlhdG9taWNfZGVjKCZjYS0+YnVja2V0c1tpXS5waW4pOwotCi0JCWZyZWVfZmlmbygmZnJlZSk7Ci0JfQotCiAJaWYgKGF0dHIgPT0gJnN5c2ZzX2NsZWFyX3N0YXRzKSB7CiAJCWF0b21pY19sb25nX3NldCgmY2EtPnNlY3RvcnNfd3JpdHRlbiwgMCk7CiAJCWF0b21pY19sb25nX3NldCgmY2EtPmJ0cmVlX3NlY3RvcnNfd3JpdHRlbiwgMCk7CkBAIC04NjksNyArODgxLDYgQEAKIAkmc3lzZnNfbWV0YWRhdGFfd3JpdHRlbiwKIAkmc3lzZnNfaW9fZXJyb3JzLAogCSZzeXNmc19jbGVhcl9zdGF0cywKLQkmc3lzZnNfZnJlZWxpc3RfcGVyY2VudCwKIAkmc3lzZnNfY2FjaGVfcmVwbGFjZW1lbnRfcG9saWN5LAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS91dGlsLmMgYi9kcml2ZXJzL21kL2JjYWNoZS91dGlsLmMKaW5kZXggYmIzNzYxOC4uZGIzYWU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvdXRpbC5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3V0aWwuYwpAQCAtMjI0LDEwICsyMjQsMTAgQEAKIAogdm9pZCBiY2hfYmlvX21hcChzdHJ1Y3QgYmlvICpiaW8sIHZvaWQgKmJhc2UpCiB7Ci0Jc2l6ZV90IHNpemUgPSBiaW8tPmJpX3NpemU7CisJc2l6ZV90IHNpemUgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnYgPSBiaW8tPmJpX2lvX3ZlYzsKIAotCUJVR19PTighYmlvLT5iaV9zaXplKTsKKwlCVUdfT04oIWJpby0+YmlfaXRlci5iaV9zaXplKTsKIAlCVUdfT04oYmlvLT5iaV92Y250KTsKIAogCWJ2LT5idl9vZmZzZXQgPSBiYXNlID8gKCh1bnNpZ25lZCBsb25nKSBiYXNlKSAlIFBBR0VfU0laRSA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS91dGlsLmggYi9kcml2ZXJzL21kL2JjYWNoZS91dGlsLmgKaW5kZXggMTAzMGM2MC4uYWM3ZDBkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvdXRpbC5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3V0aWwuaApAQCAtMiw2ICsyLDcgQEAKICNpZm5kZWYgX0JDQUNIRV9VVElMX0gKICNkZWZpbmUgX0JDQUNIRV9VVElMX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGxpc3QuaD4KQEAgLTE3LDExICsxOCwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRwogCisjZGVmaW5lIEVCVUdfT04oY29uZCkJCQlCVUdfT04oY29uZCkKICNkZWZpbmUgYXRvbWljX2RlY19idWcodikJQlVHX09OKGF0b21pY19kZWNfcmV0dXJuKHYpIDwgMCkKICNkZWZpbmUgYXRvbWljX2luY19idWcodiwgaSkJQlVHX09OKGF0b21pY19pbmNfcmV0dXJuKHYpIDw9IGkpCiAKICNlbHNlIC8qIERFQlVHICovCiAKKyNkZWZpbmUgRUJVR19PTihjb25kKQkJCWRvIHsgaWYgKGNvbmQpOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdG9taWNfZGVjX2J1Zyh2KQlhdG9taWNfZGVjKHYpCiAjZGVmaW5lIGF0b21pY19pbmNfYnVnKHYsIGkpCWF0b21pY19pbmModikKIApAQCAtMzkxLDYgKzM5NCwxMSBAQAogCiB2b2lkIGJjaF90aW1lX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgdGltZV9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90IHRpbWUpOwogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvY2FsX2Nsb2NrX3VzKHZvaWQpCit7CisJcmV0dXJuIGxvY2FsX2Nsb2NrKCkgPj4gMTA7Cit9CisKICNkZWZpbmUgTlNFQ19QRVJfbnMJCQkxTAogI2RlZmluZSBOU0VDX1BFUl91cwkJCU5TRUNfUEVSX1VTRUMKICNkZWZpbmUgTlNFQ19QRVJfbXMJCQlOU0VDX1BFUl9NU0VDCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS93cml0ZWJhY2suYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5jCmluZGV4IDZjNDRmZTAuLmY0MzAwZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlpZiAoIWlvLT5kYy0+d3JpdGViYWNrX3BlcmNlbnQpCiAJCWJpb19zZXRfcHJpbyhiaW8sIElPUFJJT19QUklPX1ZBTFVFKElPUFJJT19DTEFTU19JRExFLCAwKSk7CiAKLQliaW8tPmJpX3NpemUJCT0gS0VZX1NJWkUoJnctPmtleSkgPDwgOTsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IEtFWV9TSVpFKCZ3LT5rZXkpIDw8IDk7CiAJYmlvLT5iaV9tYXhfdmVjcwk9IERJVl9ST1VORF9VUChLRVlfU0laRSgmdy0+a2V5KSwgUEFHRV9TRUNUT1JTKTsKIAliaW8tPmJpX3ByaXZhdGUJCT0gdzsKIAliaW8tPmJpX2lvX3ZlYwkJPSBiaW8tPmJpX2lubGluZV92ZWNzOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAKIAlkaXJ0eV9pbml0KHcpOwogCWlvLT5iaW8uYmlfcncJCT0gV1JJVEU7Ci0JaW8tPmJpby5iaV9zZWN0b3IJPSBLRVlfU1RBUlQoJnctPmtleSk7CisJaW8tPmJpby5iaV9pdGVyLmJpX3NlY3RvciA9IEtFWV9TVEFSVCgmdy0+a2V5KTsKIAlpby0+YmlvLmJpX2JkZXYJCT0gaW8tPmRjLT5iZGV2OwogCWlvLT5iaW8uYmlfZW5kX2lvCT0gZGlydHlfZW5kaW87CiAKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQlpby0+ZGMJCT0gZGM7CiAKIAkJZGlydHlfaW5pdCh3KTsKLQkJaW8tPmJpby5iaV9zZWN0b3IJPSBQVFJfT0ZGU0VUKCZ3LT5rZXksIDApOworCQlpby0+YmlvLmJpX2l0ZXIuYmlfc2VjdG9yID0gUFRSX09GRlNFVCgmdy0+a2V5LCAwKTsKIAkJaW8tPmJpby5iaV9iZGV2CQk9IFBUUl9DQUNIRShkYy0+ZGlzay5jLAogCQkJCQkJICAgICZ3LT5rZXksIDApLT5iZGV2OwogCQlpby0+YmlvLmJpX3J3CQk9IFJFQUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS93cml0ZWJhY2suaCBiL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5oCmluZGV4IGM5ZGRjZjQuLmUyZjg1OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3dyaXRlYmFjay5oCkBAIC01MCw3ICs1MCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChkYy0+cGFydGlhbF9zdHJpcGVzX2V4cGVuc2l2ZSAmJgotCSAgICBiY2FjaGVfZGV2X3N0cmlwZV9kaXJ0eShkYywgYmlvLT5iaV9zZWN0b3IsCisJICAgIGJjYWNoZV9kZXZfc3RyaXBlX2RpcnR5KGRjLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJCSAgICBiaW9fc2VjdG9ycyhiaW8pKSkKIAkJcmV0dXJuIHRydWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tYmlvLXJlY29yZC5oIGIvZHJpdmVycy9tZC9kbS1iaW8tcmVjb3JkLmgKaW5kZXggM2E4Y2ZhMi4uZGQzNjQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1iaW8tcmVjb3JkLmgKKysrIGIvZHJpdmVycy9tZC9kbS1iaW8tcmVjb3JkLmgKQEAgLTE3LDU1ICsxNywyNCBAQAogICogb3JpZ2luYWwgYmlvIHN0YXRlLgogICovCiAKLXN0cnVjdCBkbV9iaW9fdmVjX2RldGFpbHMgewotI2lmIFBBR0VfU0laRSA8IDY1NTM2Ci0JX191MTYgYnZfbGVuOwotCV9fdTE2IGJ2X29mZnNldDsKLSNlbHNlCi0JdW5zaWduZWQgYnZfbGVuOwotCXVuc2lnbmVkIGJ2X29mZnNldDsKLSNlbmRpZgotfTsKLQogc3RydWN0IGRtX2Jpb19kZXRhaWxzIHsKLQlzZWN0b3JfdCBiaV9zZWN0b3I7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmlfYmRldjsKLQl1bnNpZ25lZCBpbnQgYmlfc2l6ZTsKLQl1bnNpZ25lZCBzaG9ydCBiaV9pZHg7CiAJdW5zaWduZWQgbG9uZyBiaV9mbGFnczsKLQlzdHJ1Y3QgZG1fYmlvX3ZlY19kZXRhaWxzIGJpX2lvX3ZlY1tCSU9fTUFYX1BBR0VTXTsKKwlzdHJ1Y3QgYnZlY19pdGVyIGJpX2l0ZXI7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1fYmlvX3JlY29yZChzdHJ1Y3QgZG1fYmlvX2RldGFpbHMgKmJkLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JdW5zaWduZWQgaTsKLQotCWJkLT5iaV9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKIAliZC0+YmlfYmRldiA9IGJpby0+YmlfYmRldjsKLQliZC0+Ymlfc2l6ZSA9IGJpby0+Ymlfc2l6ZTsKLQliZC0+YmlfaWR4ID0gYmlvLT5iaV9pZHg7CiAJYmQtPmJpX2ZsYWdzID0gYmlvLT5iaV9mbGFnczsKLQotCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgewotCQliZC0+YmlfaW9fdmVjW2ldLmJ2X2xlbiA9IGJpby0+YmlfaW9fdmVjW2ldLmJ2X2xlbjsKLQkJYmQtPmJpX2lvX3ZlY1tpXS5idl9vZmZzZXQgPSBiaW8tPmJpX2lvX3ZlY1tpXS5idl9vZmZzZXQ7Ci0JfQorCWJkLT5iaV9pdGVyID0gYmlvLT5iaV9pdGVyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1fYmlvX3Jlc3RvcmUoc3RydWN0IGRtX2Jpb19kZXRhaWxzICpiZCwgc3RydWN0IGJpbyAqYmlvKQogewotCXVuc2lnbmVkIGk7Ci0KLQliaW8tPmJpX3NlY3RvciA9IGJkLT5iaV9zZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gYmQtPmJpX2JkZXY7Ci0JYmlvLT5iaV9zaXplID0gYmQtPmJpX3NpemU7Ci0JYmlvLT5iaV9pZHggPSBiZC0+YmlfaWR4OwogCWJpby0+YmlfZmxhZ3MgPSBiZC0+YmlfZmxhZ3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmlvLT5iaV92Y250OyBpKyspIHsKLQkJYmlvLT5iaV9pb192ZWNbaV0uYnZfbGVuID0gYmQtPmJpX2lvX3ZlY1tpXS5idl9sZW47Ci0JCWJpby0+YmlfaW9fdmVjW2ldLmJ2X29mZnNldCA9IGJkLT5iaV9pb192ZWNbaV0uYnZfb2Zmc2V0OwotCX0KKwliaW8tPmJpX2l0ZXIgPSBiZC0+YmlfaXRlcjsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKaW5kZXggOWVkNDIxMi4uNjZjNWQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1idWZpby5jCisrKyBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uYwpAQCAtNTQwLDcgKzU0MCw3IEBACiAJYmlvX2luaXQoJmItPmJpbyk7CiAJYi0+YmlvLmJpX2lvX3ZlYyA9IGItPmJpb192ZWM7CiAJYi0+YmlvLmJpX21heF92ZWNzID0gRE1fQlVGSU9fSU5MSU5FX1ZFQ1M7Ci0JYi0+YmlvLmJpX3NlY3RvciA9IGJsb2NrIDw8IGItPmMtPnNlY3RvcnNfcGVyX2Jsb2NrX2JpdHM7CisJYi0+YmlvLmJpX2l0ZXIuYmlfc2VjdG9yID0gYmxvY2sgPDwgYi0+Yy0+c2VjdG9yc19wZXJfYmxvY2tfYml0czsKIAliLT5iaW8uYmlfYmRldiA9IGItPmMtPmJkZXY7CiAJYi0+YmlvLmJpX2VuZF9pbyA9IGVuZF9pbzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jYWNoZS1wb2xpY3ktbXEuYyBiL2RyaXZlcnMvbWQvZG0tY2FjaGUtcG9saWN5LW1xLmMKaW5kZXggOTMwZThjMy4uMWUwMThlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jYWNoZS1wb2xpY3ktbXEuYworKysgYi9kcml2ZXJzL21kL2RtLWNhY2hlLXBvbGljeS1tcS5jCkBAIC03Miw3ICs3Miw3IEBACiAKIHN0YXRpYyB2b2lkIGlvdF91cGRhdGVfc3RhdHMoc3RydWN0IGlvX3RyYWNrZXIgKnQsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlpZiAoYmlvLT5iaV9zZWN0b3IgPT0gZnJvbV9vYmxvY2sodC0+bGFzdF9lbmRfb2Jsb2NrKSArIDEpCisJaWYgKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPT0gZnJvbV9vYmxvY2sodC0+bGFzdF9lbmRfb2Jsb2NrKSArIDEpCiAJCXQtPm5yX3NlcV9zYW1wbGVzKys7CiAJZWxzZSB7CiAJCS8qCkBAIC04Nyw3ICs4Nyw3IEBACiAJCXQtPm5yX3JhbmRfc2FtcGxlcysrOwogCX0KIAotCXQtPmxhc3RfZW5kX29ibG9jayA9IHRvX29ibG9jayhiaW8tPmJpX3NlY3RvciArIGJpb19zZWN0b3JzKGJpbykgLSAxKTsKKwl0LT5sYXN0X2VuZF9vYmxvY2sgPSB0b19vYmxvY2soYmlvX2VuZF9zZWN0b3IoYmlvKSAtIDEpOwogfQogCiBzdGF0aWMgdm9pZCBpb3RfY2hlY2tfZm9yX3BhdHRlcm5fc3dpdGNoKHN0cnVjdCBpb190cmFja2VyICp0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jYWNoZS10YXJnZXQuYyBiL2RyaXZlcnMvbWQvZG0tY2FjaGUtdGFyZ2V0LmMKaW5kZXggMDkzMzRjMi4uZmZkNDcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jYWNoZS10YXJnZXQuYworKysgYi9kcml2ZXJzL21kL2RtLWNhY2hlLXRhcmdldC5jCkBAIC04NSw2ICs4NSwxMiBAQAogewogCWJpby0+YmlfZW5kX2lvID0gaC0+YmlfZW5kX2lvOwogCWJpby0+YmlfcHJpdmF0ZSA9IGgtPmJpX3ByaXZhdGU7CisKKwkvKgorCSAqIE11c3QgYnVtcCBiaV9yZW1haW5pbmcgdG8gYWxsb3cgYmlvIHRvIGNvbXBsZXRlIHdpdGgKKwkgKiByZXN0b3JlZCBiaV9lbmRfaW8uCisJICovCisJYXRvbWljX2luYygmYmlvLT5iaV9yZW1haW5pbmcpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjY0LDE1ICs2NzAsMTcgQEAKIHN0YXRpYyB2b2lkIHJlbWFwX3RvX2NhY2hlKHN0cnVjdCBjYWNoZSAqY2FjaGUsIHN0cnVjdCBiaW8gKmJpbywKIAkJCSAgIGRtX2NibG9ja190IGNibG9jaykKIHsKLQlzZWN0b3JfdCBiaV9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwlzZWN0b3JfdCBiaV9zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCiAJYmlvLT5iaV9iZGV2ID0gY2FjaGUtPmNhY2hlX2Rldi0+YmRldjsKIAlpZiAoIWJsb2NrX3NpemVfaXNfcG93ZXJfb2ZfdHdvKGNhY2hlKSkKLQkJYmlvLT5iaV9zZWN0b3IgPSAoZnJvbV9jYmxvY2soY2Jsb2NrKSAqIGNhY2hlLT5zZWN0b3JzX3Blcl9ibG9jaykgKwotCQkJCXNlY3Rvcl9kaXYoYmlfc2VjdG9yLCBjYWNoZS0+c2VjdG9yc19wZXJfYmxvY2spOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0KKwkJCShmcm9tX2NibG9jayhjYmxvY2spICogY2FjaGUtPnNlY3RvcnNfcGVyX2Jsb2NrKSArCisJCQlzZWN0b3JfZGl2KGJpX3NlY3RvciwgY2FjaGUtPnNlY3RvcnNfcGVyX2Jsb2NrKTsKIAllbHNlCi0JCWJpby0+Ymlfc2VjdG9yID0gKGZyb21fY2Jsb2NrKGNibG9jaykgPDwgY2FjaGUtPnNlY3RvcnNfcGVyX2Jsb2NrX3NoaWZ0KSB8Ci0JCQkJKGJpX3NlY3RvciAmIChjYWNoZS0+c2VjdG9yc19wZXJfYmxvY2sgLSAxKSk7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPQorCQkJKGZyb21fY2Jsb2NrKGNibG9jaykgPDwgY2FjaGUtPnNlY3RvcnNfcGVyX2Jsb2NrX3NoaWZ0KSB8CisJCQkoYmlfc2VjdG9yICYgKGNhY2hlLT5zZWN0b3JzX3Blcl9ibG9jayAtIDEpKTsKIH0KIAogc3RhdGljIHZvaWQgY2hlY2tfaWZfdGlja19iaW9fbmVlZGVkKHN0cnVjdCBjYWNoZSAqY2FjaGUsIHN0cnVjdCBiaW8gKmJpbykKQEAgLTcxMiw3ICs3MjAsNyBAQAogCiBzdGF0aWMgZG1fb2Jsb2NrX3QgZ2V0X2Jpb19ibG9jayhzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc2VjdG9yX3QgYmxvY2tfbnIgPSBiaW8tPmJpX3NlY3RvcjsKKwlzZWN0b3JfdCBibG9ja19uciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAlpZiAoIWJsb2NrX3NpemVfaXNfcG93ZXJfb2ZfdHdvKGNhY2hlKSkKIAkJKHZvaWQpIHNlY3Rvcl9kaXYoYmxvY2tfbnIsIGNhY2hlLT5zZWN0b3JzX3Blcl9ibG9jayk7CkBAIC0xMDI3LDcgKzEwMzUsNyBAQAogc3RhdGljIGJvb2wgYmlvX3dyaXRlc19jb21wbGV0ZV9ibG9jayhzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJcmV0dXJuIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgJiYKLQkJKGJpby0+Ymlfc2l6ZSA9PSAoY2FjaGUtPnNlY3RvcnNfcGVyX2Jsb2NrIDw8IFNFQ1RPUl9TSElGVCkpOworCQkoYmlvLT5iaV9pdGVyLmJpX3NpemUgPT0gKGNhY2hlLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpKTsKIH0KIAogc3RhdGljIHZvaWQgYXZvaWRfY29weShzdHJ1Y3QgZG1fY2FjaGVfbWlncmF0aW9uICptZykKQEAgLTEyNTIsNyArMTI2MCw3IEBACiAJc2l6ZV90IHBiX2RhdGFfc2l6ZSA9IGdldF9wZXJfYmlvX2RhdGFfc2l6ZShjYWNoZSk7CiAJc3RydWN0IHBlcl9iaW9fZGF0YSAqcGIgPSBnZXRfcGVyX2Jpb19kYXRhKGJpbywgcGJfZGF0YV9zaXplKTsKIAotCUJVR19PTihiaW8tPmJpX3NpemUpOworCUJVR19PTihiaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAJaWYgKCFwYi0+cmVxX25yKQogCQlyZW1hcF90b19vcmlnaW4oY2FjaGUsIGJpbyk7CiAJZWxzZQpAQCAtMTI3NSw5ICsxMjgzLDkgQEAKICAqLwogc3RhdGljIHZvaWQgcHJvY2Vzc19kaXNjYXJkX2JpbyhzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JZG1fYmxvY2tfdCBzdGFydF9ibG9jayA9IGRtX3NlY3Rvcl9kaXZfdXAoYmlvLT5iaV9zZWN0b3IsCisJZG1fYmxvY2tfdCBzdGFydF9ibG9jayA9IGRtX3NlY3Rvcl9kaXZfdXAoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKIAkJCQkJCSAgY2FjaGUtPmRpc2NhcmRfYmxvY2tfc2l6ZSk7Ci0JZG1fYmxvY2tfdCBlbmRfYmxvY2sgPSBiaW8tPmJpX3NlY3RvciArIGJpb19zZWN0b3JzKGJpbyk7CisJZG1fYmxvY2tfdCBlbmRfYmxvY2sgPSBiaW9fZW5kX3NlY3RvcihiaW8pOwogCWRtX2Jsb2NrX3QgYjsKIAogCWVuZF9ibG9jayA9IGJsb2NrX2RpdihlbmRfYmxvY2ssIGNhY2hlLT5kaXNjYXJkX2Jsb2NrX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDgxYjBmYTYuLjc4NDY5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTM5LDEwICszOSw4IEBACiAJc3RydWN0IGNvbXBsZXRpb24gcmVzdGFydDsKIAlzdHJ1Y3QgYmlvICpiaW9faW47CiAJc3RydWN0IGJpbyAqYmlvX291dDsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0X2luOwotCXVuc2lnbmVkIGludCBvZmZzZXRfb3V0OwotCXVuc2lnbmVkIGludCBpZHhfaW47Ci0JdW5zaWduZWQgaW50IGlkeF9vdXQ7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyX2luOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcl9vdXQ7CiAJc2VjdG9yX3QgY2Nfc2VjdG9yOwogCWF0b21pY190IGNjX3BlbmRpbmc7CiB9OwpAQCAtODI2LDEwICs4MjQsMTAgQEAKIHsKIAljdHgtPmJpb19pbiA9IGJpb19pbjsKIAljdHgtPmJpb19vdXQgPSBiaW9fb3V0OwotCWN0eC0+b2Zmc2V0X2luID0gMDsKLQljdHgtPm9mZnNldF9vdXQgPSAwOwotCWN0eC0+aWR4X2luID0gYmlvX2luID8gYmlvX2luLT5iaV9pZHggOiAwOwotCWN0eC0+aWR4X291dCA9IGJpb19vdXQgPyBiaW9fb3V0LT5iaV9pZHggOiAwOworCWlmIChiaW9faW4pCisJCWN0eC0+aXRlcl9pbiA9IGJpb19pbi0+YmlfaXRlcjsKKwlpZiAoYmlvX291dCkKKwkJY3R4LT5pdGVyX291dCA9IGJpb19vdXQtPmJpX2l0ZXI7CiAJY3R4LT5jY19zZWN0b3IgPSBzZWN0b3IgKyBjYy0+aXZfb2Zmc2V0OwogCWluaXRfY29tcGxldGlvbigmY3R4LT5yZXN0YXJ0KTsKIH0KQEAgLTg1Nyw4ICs4NTUsOCBAQAogCQkJICAgICAgIHN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCwKIAkJCSAgICAgICBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2X2luID0gYmlvX2lvdmVjX2lkeChjdHgtPmJpb19pbiwgY3R4LT5pZHhfaW4pOwotCXN0cnVjdCBiaW9fdmVjICpidl9vdXQgPSBiaW9faW92ZWNfaWR4KGN0eC0+YmlvX291dCwgY3R4LT5pZHhfb3V0KTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidl9pbiA9IGJpb19pdGVyX2lvdmVjKGN0eC0+YmlvX2luLCBjdHgtPml0ZXJfaW4pOworCXN0cnVjdCBiaW9fdmVjIGJ2X291dCA9IGJpb19pdGVyX2lvdmVjKGN0eC0+YmlvX291dCwgY3R4LT5pdGVyX291dCk7CiAJc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgKmRtcmVxOwogCXU4ICppdjsKIAlpbnQgcjsKQEAgLTg2OSwyNCArODY3LDE1IEBACiAJZG1yZXEtPml2X3NlY3RvciA9IGN0eC0+Y2Nfc2VjdG9yOwogCWRtcmVxLT5jdHggPSBjdHg7CiAJc2dfaW5pdF90YWJsZSgmZG1yZXEtPnNnX2luLCAxKTsKLQlzZ19zZXRfcGFnZSgmZG1yZXEtPnNnX2luLCBidl9pbi0+YnZfcGFnZSwgMSA8PCBTRUNUT1JfU0hJRlQsCi0JCSAgICBidl9pbi0+YnZfb2Zmc2V0ICsgY3R4LT5vZmZzZXRfaW4pOworCXNnX3NldF9wYWdlKCZkbXJlcS0+c2dfaW4sIGJ2X2luLmJ2X3BhZ2UsIDEgPDwgU0VDVE9SX1NISUZULAorCQkgICAgYnZfaW4uYnZfb2Zmc2V0KTsKIAogCXNnX2luaXRfdGFibGUoJmRtcmVxLT5zZ19vdXQsIDEpOwotCXNnX3NldF9wYWdlKCZkbXJlcS0+c2dfb3V0LCBidl9vdXQtPmJ2X3BhZ2UsIDEgPDwgU0VDVE9SX1NISUZULAotCQkgICAgYnZfb3V0LT5idl9vZmZzZXQgKyBjdHgtPm9mZnNldF9vdXQpOworCXNnX3NldF9wYWdlKCZkbXJlcS0+c2dfb3V0LCBidl9vdXQuYnZfcGFnZSwgMSA8PCBTRUNUT1JfU0hJRlQsCisJCSAgICBidl9vdXQuYnZfb2Zmc2V0KTsKIAotCWN0eC0+b2Zmc2V0X2luICs9IDEgPDwgU0VDVE9SX1NISUZUOwotCWlmIChjdHgtPm9mZnNldF9pbiA+PSBidl9pbi0+YnZfbGVuKSB7Ci0JCWN0eC0+b2Zmc2V0X2luID0gMDsKLQkJY3R4LT5pZHhfaW4rKzsKLQl9Ci0KLQljdHgtPm9mZnNldF9vdXQgKz0gMSA8PCBTRUNUT1JfU0hJRlQ7Ci0JaWYgKGN0eC0+b2Zmc2V0X291dCA+PSBidl9vdXQtPmJ2X2xlbikgewotCQljdHgtPm9mZnNldF9vdXQgPSAwOwotCQljdHgtPmlkeF9vdXQrKzsKLQl9CisJYmlvX2FkdmFuY2VfaXRlcihjdHgtPmJpb19pbiwgJmN0eC0+aXRlcl9pbiwgMSA8PCBTRUNUT1JfU0hJRlQpOworCWJpb19hZHZhbmNlX2l0ZXIoY3R4LT5iaW9fb3V0LCAmY3R4LT5pdGVyX291dCwgMSA8PCBTRUNUT1JfU0hJRlQpOwogCiAJaWYgKGNjLT5pdl9nZW5fb3BzKSB7CiAJCXIgPSBjYy0+aXZfZ2VuX29wcy0+Z2VuZXJhdG9yKGNjLCBpdiwgZG1yZXEpOwpAQCAtOTM3LDggKzkyNiw3IEBACiAKIAlhdG9taWNfc2V0KCZjdHgtPmNjX3BlbmRpbmcsIDEpOwogCi0Jd2hpbGUoY3R4LT5pZHhfaW4gPCBjdHgtPmJpb19pbi0+YmlfdmNudCAmJgotCSAgICAgIGN0eC0+aWR4X291dCA8IGN0eC0+YmlvX291dC0+YmlfdmNudCkgeworCXdoaWxlIChjdHgtPml0ZXJfaW4uYmlfc2l6ZSAmJiBjdHgtPml0ZXJfb3V0LmJpX3NpemUpIHsKIAogCQljcnlwdF9hbGxvY19yZXEoY2MsIGN0eCk7CiAKQEAgLTEwMjEsNyArMTAwOSw3IEBACiAJCXNpemUgLT0gbGVuOwogCX0KIAotCWlmICghY2xvbmUtPmJpX3NpemUpIHsKKwlpZiAoIWNsb25lLT5iaV9pdGVyLmJpX3NpemUpIHsKIAkJYmlvX3B1dChjbG9uZSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTExNjEsNyArMTE0OSw3IEBACiAJY3J5cHRfaW5jX3BlbmRpbmcoaW8pOwogCiAJY2xvbmVfaW5pdChpbywgY2xvbmUpOwotCWNsb25lLT5iaV9zZWN0b3IgPSBjYy0+c3RhcnQgKyBpby0+c2VjdG9yOworCWNsb25lLT5iaV9pdGVyLmJpX3NlY3RvciA9IGNjLT5zdGFydCArIGlvLT5zZWN0b3I7CiAKIAlnZW5lcmljX21ha2VfcmVxdWVzdChjbG9uZSk7CiAJcmV0dXJuIDA7CkBAIC0xMjA3LDkgKzExOTUsOSBAQAogCX0KIAogCS8qIGNyeXB0X2NvbnZlcnQgc2hvdWxkIGhhdmUgZmlsbGVkIHRoZSBjbG9uZSBiaW8gKi8KLQlCVUdfT04oaW8tPmN0eC5pZHhfb3V0IDwgY2xvbmUtPmJpX3ZjbnQpOworCUJVR19PTihpby0+Y3R4Lml0ZXJfb3V0LmJpX3NpemUpOwogCi0JY2xvbmUtPmJpX3NlY3RvciA9IGNjLT5zdGFydCArIGlvLT5zZWN0b3I7CisJY2xvbmUtPmJpX2l0ZXIuYmlfc2VjdG9yID0gY2MtPnN0YXJ0ICsgaW8tPnNlY3RvcjsKIAogCWlmIChhc3luYykKIAkJa2NyeXB0ZF9xdWV1ZV9pbyhpbyk7CkBAIC0xMjI0LDcgKzEyMTIsNyBAQAogCXN0cnVjdCBkbV9jcnlwdF9pbyAqbmV3X2lvOwogCWludCBjcnlwdF9maW5pc2hlZDsKIAl1bnNpZ25lZCBvdXRfb2ZfcGFnZXMgPSAwOwotCXVuc2lnbmVkIHJlbWFpbmluZyA9IGlvLT5iYXNlX2Jpby0+Ymlfc2l6ZTsKKwl1bnNpZ25lZCByZW1haW5pbmcgPSBpby0+YmFzZV9iaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBpby0+c2VjdG9yOwogCWludCByOwogCkBAIC0xMjQ2LDkgKzEyMzQsOSBAQAogCQl9CiAKIAkJaW8tPmN0eC5iaW9fb3V0ID0gY2xvbmU7Ci0JCWlvLT5jdHguaWR4X291dCA9IDA7CisJCWlvLT5jdHguaXRlcl9vdXQgPSBjbG9uZS0+YmlfaXRlcjsKIAotCQlyZW1haW5pbmcgLT0gY2xvbmUtPmJpX3NpemU7CisJCXJlbWFpbmluZyAtPSBjbG9uZS0+YmlfaXRlci5iaV9zaXplOwogCQlzZWN0b3IgKz0gYmlvX3NlY3RvcnMoY2xvbmUpOwogCiAJCWNyeXB0X2luY19wZW5kaW5nKGlvKTsKQEAgLTEyOTAsOCArMTI3OCw3IEBACiAJCQljcnlwdF9pbmNfcGVuZGluZyhuZXdfaW8pOwogCQkJY3J5cHRfY29udmVydF9pbml0KGNjLCAmbmV3X2lvLT5jdHgsIE5VTEwsCiAJCQkJCSAgIGlvLT5iYXNlX2Jpbywgc2VjdG9yKTsKLQkJCW5ld19pby0+Y3R4LmlkeF9pbiA9IGlvLT5jdHguaWR4X2luOwotCQkJbmV3X2lvLT5jdHgub2Zmc2V0X2luID0gaW8tPmN0eC5vZmZzZXRfaW47CisJCQluZXdfaW8tPmN0eC5pdGVyX2luID0gaW8tPmN0eC5pdGVyX2luOwogCiAJCQkvKgogCQkJICogRnJhZ21lbnRzIGFmdGVyIHRoZSBmaXJzdCB1c2UgdGhlIGJhc2VfaW8KQEAgLTE4NjksMTEgKzE4NTYsMTIgQEAKIAlpZiAodW5saWtlbHkoYmlvLT5iaV9ydyAmIChSRVFfRkxVU0ggfCBSRVFfRElTQ0FSRCkpKSB7CiAJCWJpby0+YmlfYmRldiA9IGNjLT5kZXYtPmJkZXY7CiAJCWlmIChiaW9fc2VjdG9ycyhiaW8pKQotCQkJYmlvLT5iaV9zZWN0b3IgPSBjYy0+c3RhcnQgKyBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX3NlY3Rvcik7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gY2MtPnN0YXJ0ICsKKwkJCQlkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCX0KIAotCWlvID0gY3J5cHRfaW9fYWxsb2MoY2MsIGJpbywgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9zZWN0b3IpKTsKKwlpbyA9IGNyeXB0X2lvX2FsbG9jKGNjLCBiaW8sIGRtX3RhcmdldF9vZmZzZXQodGksIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpKTsKIAogCWlmIChiaW9fZGF0YV9kaXIoaW8tPmJhc2VfYmlvKSA9PSBSRUFEKSB7CiAJCWlmIChrY3J5cHRkX2lvX3JlYWQoaW8sIEdGUF9OT1dBSVQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1kZWxheS5jIGIvZHJpdmVycy9tZC9kbS1kZWxheS5jCmluZGV4IGE4YTUxMWMuLjQyYzNhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZGVsYXkuYworKysgYi9kcml2ZXJzL21kL2RtLWRlbGF5LmMKQEAgLTI3NywxNCArMjc3LDE1IEBACiAJaWYgKChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgJiYgKGRjLT5kZXZfd3JpdGUpKSB7CiAJCWJpby0+YmlfYmRldiA9IGRjLT5kZXZfd3JpdGUtPmJkZXY7CiAJCWlmIChiaW9fc2VjdG9ycyhiaW8pKQotCQkJYmlvLT5iaV9zZWN0b3IgPSBkYy0+c3RhcnRfd3JpdGUgKwotCQkJCQkgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9zZWN0b3IpOworCQkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGRjLT5zdGFydF93cml0ZSArCisJCQkJZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKIAkJcmV0dXJuIGRlbGF5X2JpbyhkYywgZGMtPndyaXRlX2RlbGF5LCBiaW8pOwogCX0KIAogCWJpby0+YmlfYmRldiA9IGRjLT5kZXZfcmVhZC0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IGRjLT5zdGFydF9yZWFkICsgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9zZWN0b3IpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBkYy0+c3RhcnRfcmVhZCArCisJCWRtX3RhcmdldF9vZmZzZXQodGksIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCiAJcmV0dXJuIGRlbGF5X2JpbyhkYywgZGMtPnJlYWRfZGVsYXksIGJpbyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jIGIvZHJpdmVycy9tZC9kbS1mbGFrZXkuYwppbmRleCBjODBhMGVjLi5iMjU3ZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKQEAgLTI0OCw3ICsyNDgsOCBAQAogCiAJYmlvLT5iaV9iZGV2ID0gZmMtPmRldi0+YmRldjsKIAlpZiAoYmlvX3NlY3RvcnMoYmlvKSkKLQkJYmlvLT5iaV9zZWN0b3IgPSBmbGFrZXlfbWFwX3NlY3Rvcih0aSwgYmlvLT5iaV9zZWN0b3IpOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0KKwkJCWZsYWtleV9tYXBfc2VjdG9yKHRpLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIH0KIAogc3RhdGljIHZvaWQgY29ycnVwdF9iaW9fZGF0YShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBmbGFrZXlfYyAqZmMpCkBAIC0yNjUsOCArMjY2LDggQEAKIAkJRE1ERUJVRygiQ29ycnVwdGluZyBkYXRhIGJpbz0lcCBieSB3cml0aW5nICV1IHRvIGJ5dGUgJXUgIgogCQkJIihydz0lYyBiaV9ydz0lbHUgYmlfc2VjdG9yPSVsbHUgY3VyX2J5dGVzPSV1KVxuIiwKIAkJCWJpbywgZmMtPmNvcnJ1cHRfYmlvX3ZhbHVlLCBmYy0+Y29ycnVwdF9iaW9fYnl0ZSwKLQkJCShiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgPyAndycgOiAncicsCi0JCQliaW8tPmJpX3J3LCAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBiaW9fYnl0ZXMpOworCQkJKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSA/ICd3JyA6ICdyJywgYmlvLT5iaV9ydywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgYmlvX2J5dGVzKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCAyYTIwOTg2Li5iMmI4YTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC0yMDEsMjYgKzIwMSwyOSBAQAogLyoKICAqIEZ1bmN0aW9ucyBmb3IgZ2V0dGluZyB0aGUgcGFnZXMgZnJvbSBhIGJ2ZWMuCiAgKi8KLXN0YXRpYyB2b2lkIGJ2ZWNfZ2V0X3BhZ2Uoc3RydWN0IGRwYWdlcyAqZHAsCitzdGF0aWMgdm9pZCBiaW9fZ2V0X3BhZ2Uoc3RydWN0IGRwYWdlcyAqZHAsCiAJCSAgc3RydWN0IHBhZ2UgKipwLCB1bnNpZ25lZCBsb25nICpsZW4sIHVuc2lnbmVkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSAoc3RydWN0IGJpb192ZWMgKikgZHAtPmNvbnRleHRfcHRyOwotCSpwID0gYnZlYy0+YnZfcGFnZTsKLQkqbGVuID0gYnZlYy0+YnZfbGVuOwotCSpvZmZzZXQgPSBidmVjLT5idl9vZmZzZXQ7CisJc3RydWN0IGJpbyAqYmlvID0gZHAtPmNvbnRleHRfcHRyOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWMgPSBiaW9faW92ZWMoYmlvKTsKKwkqcCA9IGJ2ZWMuYnZfcGFnZTsKKwkqbGVuID0gYnZlYy5idl9sZW47CisJKm9mZnNldCA9IGJ2ZWMuYnZfb2Zmc2V0OwogfQogCi1zdGF0aWMgdm9pZCBidmVjX25leHRfcGFnZShzdHJ1Y3QgZHBhZ2VzICpkcCkKK3N0YXRpYyB2b2lkIGJpb19uZXh0X3BhZ2Uoc3RydWN0IGRwYWdlcyAqZHApCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSAoc3RydWN0IGJpb192ZWMgKikgZHAtPmNvbnRleHRfcHRyOwotCWRwLT5jb250ZXh0X3B0ciA9IGJ2ZWMgKyAxOworCXN0cnVjdCBiaW8gKmJpbyA9IGRwLT5jb250ZXh0X3B0cjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjID0gYmlvX2lvdmVjKGJpbyk7CisKKwliaW9fYWR2YW5jZShiaW8sIGJ2ZWMuYnZfbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgYnZlY19kcF9pbml0KHN0cnVjdCBkcGFnZXMgKmRwLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYykKK3N0YXRpYyB2b2lkIGJpb19kcF9pbml0KHN0cnVjdCBkcGFnZXMgKmRwLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JZHAtPmdldF9wYWdlID0gYnZlY19nZXRfcGFnZTsKLQlkcC0+bmV4dF9wYWdlID0gYnZlY19uZXh0X3BhZ2U7Ci0JZHAtPmNvbnRleHRfcHRyID0gYnZlYzsKKwlkcC0+Z2V0X3BhZ2UgPSBiaW9fZ2V0X3BhZ2U7CisJZHAtPm5leHRfcGFnZSA9IGJpb19uZXh0X3BhZ2U7CisJZHAtPmNvbnRleHRfcHRyID0gYmlvOwogfQogCiAvKgpAQCAtMzA0LDE0ICszMDcsMTQgQEAKIAkJCQkJICBkbV9zZWN0b3JfZGl2X3VwKHJlbWFpbmluZywgKFBBR0VfU0laRSA+PiBTRUNUT1JfU0hJRlQpKSk7CiAKIAkJYmlvID0gYmlvX2FsbG9jX2Jpb3NldChHRlBfTk9JTywgbnVtX2J2ZWNzLCBpby0+Y2xpZW50LT5iaW9zKTsKLQkJYmlvLT5iaV9zZWN0b3IgPSB3aGVyZS0+c2VjdG9yICsgKHdoZXJlLT5jb3VudCAtIHJlbWFpbmluZyk7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSB3aGVyZS0+c2VjdG9yICsgKHdoZXJlLT5jb3VudCAtIHJlbWFpbmluZyk7CiAJCWJpby0+YmlfYmRldiA9IHdoZXJlLT5iZGV2OwogCQliaW8tPmJpX2VuZF9pbyA9IGVuZGlvOwogCQlzdG9yZV9pb19hbmRfcmVnaW9uX2luX2JpbyhiaW8sIGlvLCByZWdpb24pOwogCiAJCWlmIChydyAmIFJFUV9ESVNDQVJEKSB7CiAJCQludW1fc2VjdG9ycyA9IG1pbl90KHNlY3Rvcl90LCBxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycywgcmVtYWluaW5nKTsKLQkJCWJpby0+Ymlfc2l6ZSA9IG51bV9zZWN0b3JzIDw8IFNFQ1RPUl9TSElGVDsKKwkJCWJpby0+YmlfaXRlci5iaV9zaXplID0gbnVtX3NlY3RvcnMgPDwgU0VDVE9SX1NISUZUOwogCQkJcmVtYWluaW5nIC09IG51bV9zZWN0b3JzOwogCQl9IGVsc2UgaWYgKHJ3ICYgUkVRX1dSSVRFX1NBTUUpIHsKIAkJCS8qCkBAIC0zMjAsNyArMzIzLDcgQEAKIAkJCWRwLT5nZXRfcGFnZShkcCwgJnBhZ2UsICZsZW4sICZvZmZzZXQpOwogCQkJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgbG9naWNhbF9ibG9ja19zaXplLCBvZmZzZXQpOwogCQkJbnVtX3NlY3RvcnMgPSBtaW5fdChzZWN0b3JfdCwgcS0+bGltaXRzLm1heF93cml0ZV9zYW1lX3NlY3RvcnMsIHJlbWFpbmluZyk7Ci0JCQliaW8tPmJpX3NpemUgPSBudW1fc2VjdG9ycyA8PCBTRUNUT1JfU0hJRlQ7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IG51bV9zZWN0b3JzIDw8IFNFQ1RPUl9TSElGVDsKIAogCQkJb2Zmc2V0ID0gMDsKIAkJCXJlbWFpbmluZyAtPSBudW1fc2VjdG9yczsKQEAgLTQ1Nyw4ICs0NjAsOCBAQAogCQlsaXN0X2RwX2luaXQoZHAsIGlvX3JlcS0+bWVtLnB0ci5wbCwgaW9fcmVxLT5tZW0ub2Zmc2V0KTsKIAkJYnJlYWs7CiAKLQljYXNlIERNX0lPX0JWRUM6Ci0JCWJ2ZWNfZHBfaW5pdChkcCwgaW9fcmVxLT5tZW0ucHRyLmJ2ZWMpOworCWNhc2UgRE1fSU9fQklPOgorCQliaW9fZHBfaW5pdChkcCwgaW9fcmVxLT5tZW0ucHRyLmJpbyk7CiAJCWJyZWFrOwogCiAJY2FzZSBETV9JT19WTUE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jIGIvZHJpdmVycy9tZC9kbS1saW5lYXIuYwppbmRleCA0Zjk5ZDI2Li41M2U4NDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMKQEAgLTg1LDcgKzg1LDggQEAKIAogCWJpby0+YmlfYmRldiA9IGxjLT5kZXYtPmJkZXY7CiAJaWYgKGJpb19zZWN0b3JzKGJpbykpCi0JCWJpby0+Ymlfc2VjdG9yID0gbGluZWFyX21hcF9zZWN0b3IodGksIGJpby0+Ymlfc2VjdG9yKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9CisJCQlsaW5lYXJfbWFwX3NlY3Rvcih0aSwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiB9CiAKIHN0YXRpYyBpbnQgbGluZWFyX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCmluZGV4IDk1ODQ0NDMuLmYyODRlMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCXJlZ2lvbl90IHJlZ2lvbiA9IGRtX3JoX2Jpb190b19yZWdpb24obXMtPnJoLCBiaW8pOwogCiAJaWYgKGxvZy0+dHlwZS0+aW5fc3luYyhsb2csIHJlZ2lvbiwgMCkpCi0JCXJldHVybiBjaG9vc2VfbWlycm9yKG1zLCAgYmlvLT5iaV9zZWN0b3IpID8gMSA6IDA7CisJCXJldHVybiBjaG9vc2VfbWlycm9yKG1zLCAgYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikgPyAxIDogMDsKIAogCXJldHVybiAwOwogfQpAQCAtNDQyLDE1ICs0NDIsMTUgQEAKICAqLwogc3RhdGljIHNlY3Rvcl90IG1hcF9zZWN0b3Ioc3RydWN0IG1pcnJvciAqbSwgc3RydWN0IGJpbyAqYmlvKQogewotCWlmICh1bmxpa2VseSghYmlvLT5iaV9zaXplKSkKKwlpZiAodW5saWtlbHkoIWJpby0+YmlfaXRlci5iaV9zaXplKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIG0tPm9mZnNldCArIGRtX3RhcmdldF9vZmZzZXQobS0+bXMtPnRpLCBiaW8tPmJpX3NlY3Rvcik7CisJcmV0dXJuIG0tPm9mZnNldCArIGRtX3RhcmdldF9vZmZzZXQobS0+bXMtPnRpLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIH0KIAogc3RhdGljIHZvaWQgbWFwX2JpbyhzdHJ1Y3QgbWlycm9yICptLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJYmlvLT5iaV9iZGV2ID0gbS0+ZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gbWFwX3NlY3RvcihtLCBiaW8pOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBtYXBfc2VjdG9yKG0sIGJpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hcF9yZWdpb24oc3RydWN0IGRtX2lvX3JlZ2lvbiAqaW8sIHN0cnVjdCBtaXJyb3IgKm0sCkBAIC01MjYsOCArNTI2LDggQEAKIAlzdHJ1Y3QgZG1faW9fcmVnaW9uIGlvOwogCXN0cnVjdCBkbV9pb19yZXF1ZXN0IGlvX3JlcSA9IHsKIAkJLmJpX3J3ID0gUkVBRCwKLQkJLm1lbS50eXBlID0gRE1fSU9fQlZFQywKLQkJLm1lbS5wdHIuYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV9pZHgsCisJCS5tZW0udHlwZSA9IERNX0lPX0JJTywKKwkJLm1lbS5wdHIuYmlvID0gYmlvLAogCQkubm90aWZ5LmZuID0gcmVhZF9jYWxsYmFjaywKIAkJLm5vdGlmeS5jb250ZXh0ID0gYmlvLAogCQkuY2xpZW50ID0gbS0+bXMtPmlvX2NsaWVudCwKQEAgLTU1OSw3ICs1NTksNyBAQAogCQkgKiBXZSBjYW4gb25seSByZWFkIGJhbGFuY2UgaWYgdGhlIHJlZ2lvbiBpcyBpbiBzeW5jLgogCQkgKi8KIAkJaWYgKGxpa2VseShyZWdpb25faW5fc3luYyhtcywgcmVnaW9uLCAxKSkpCi0JCQltID0gY2hvb3NlX21pcnJvcihtcywgYmlvLT5iaV9zZWN0b3IpOworCQkJbSA9IGNob29zZV9taXJyb3IobXMsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCQllbHNlIGlmIChtICYmIGF0b21pY19yZWFkKCZtLT5lcnJvcl9jb3VudCkpCiAJCQltID0gTlVMTDsKIApAQCAtNjI5LDggKzYyOSw4IEBACiAJc3RydWN0IG1pcnJvciAqbTsKIAlzdHJ1Y3QgZG1faW9fcmVxdWVzdCBpb19yZXEgPSB7CiAJCS5iaV9ydyA9IFdSSVRFIHwgKGJpby0+YmlfcncgJiBXUklURV9GTFVTSF9GVUEpLAotCQkubWVtLnR5cGUgPSBETV9JT19CVkVDLAotCQkubWVtLnB0ci5idmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX2lkeCwKKwkJLm1lbS50eXBlID0gRE1fSU9fQklPLAorCQkubWVtLnB0ci5iaW8gPSBiaW8sCiAJCS5ub3RpZnkuZm4gPSB3cml0ZV9jYWxsYmFjaywKIAkJLm5vdGlmeS5jb250ZXh0ID0gYmlvLAogCQkuY2xpZW50ID0gbXMtPmlvX2NsaWVudCwKQEAgLTExODEsNyArMTE4MSw3IEBACiAJICogVGhlIHJlZ2lvbiBpcyBpbi1zeW5jIGFuZCB3ZSBjYW4gcGVyZm9ybSByZWFkcyBkaXJlY3RseS4KIAkgKiBTdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gc28gd2UgY2FuIHJldHJ5IGlmIGl0IGZhaWxzLgogCSAqLwotCW0gPSBjaG9vc2VfbWlycm9yKG1zLCBiaW8tPmJpX3NlY3Rvcik7CisJbSA9IGNob29zZV9taXJyb3IobXMsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCWlmICh1bmxpa2VseSghbSkpCiAJCXJldHVybiAtRUlPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJlZ2lvbi1oYXNoLmMgYi9kcml2ZXJzL21kL2RtLXJlZ2lvbi1oYXNoLmMKaW5kZXggNjk3MzJlMC4uYjkyOWZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yZWdpb24taGFzaC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmVnaW9uLWhhc2guYwpAQCAtMTI2LDcgKzEyNiw4IEBACiAKIHJlZ2lvbl90IGRtX3JoX2Jpb190b19yZWdpb24oc3RydWN0IGRtX3JlZ2lvbl9oYXNoICpyaCwgc3RydWN0IGJpbyAqYmlvKQogewotCXJldHVybiBkbV9yaF9zZWN0b3JfdG9fcmVnaW9uKHJoLCBiaW8tPmJpX3NlY3RvciAtIHJoLT50YXJnZXRfYmVnaW4pOworCXJldHVybiBkbV9yaF9zZWN0b3JfdG9fcmVnaW9uKHJoLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIC0KKwkJCQkgICAgICByaC0+dGFyZ2V0X2JlZ2luKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRtX3JoX2Jpb190b19yZWdpb24pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDcxNzcxODUuLmViZGRlZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC0xNDM4LDYgKzE0MzgsNyBAQAogCWlmIChmdWxsX2JpbykgewogCQlmdWxsX2Jpby0+YmlfZW5kX2lvID0gcGUtPmZ1bGxfYmlvX2VuZF9pbzsKIAkJZnVsbF9iaW8tPmJpX3ByaXZhdGUgPSBwZS0+ZnVsbF9iaW9fcHJpdmF0ZTsKKwkJYXRvbWljX2luYygmZnVsbF9iaW8tPmJpX3JlbWFpbmluZyk7CiAJfQogCWZyZWVfcGVuZGluZ19leGNlcHRpb24ocGUpOwogCkBAIC0xNjE5LDExICsxNjIwLDEwIEBACiAJCQkgICAgc3RydWN0IGJpbyAqYmlvLCBjaHVua190IGNodW5rKQogewogCWJpby0+YmlfYmRldiA9IHMtPmNvdy0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IGNodW5rX3RvX3NlY3RvcihzLT5zdG9yZSwKLQkJCQkJIGRtX2NodW5rX251bWJlcihlLT5uZXdfY2h1bmspICsKLQkJCQkJIChjaHVuayAtIGUtPm9sZF9jaHVuaykpICsKLQkJCQkJIChiaW8tPmJpX3NlY3RvciAmCi0JCQkJCSAgcy0+c3RvcmUtPmNodW5rX21hc2spOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPQorCQljaHVua190b19zZWN0b3Iocy0+c3RvcmUsIGRtX2NodW5rX251bWJlcihlLT5uZXdfY2h1bmspICsKKwkJCQkoY2h1bmsgLSBlLT5vbGRfY2h1bmspKSArCisJCShiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICYgcy0+c3RvcmUtPmNodW5rX21hc2spOwogfQogCiBzdGF0aWMgaW50IHNuYXBzaG90X21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvKQpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCX0KIAotCWNodW5rID0gc2VjdG9yX3RvX2NodW5rKHMtPnN0b3JlLCBiaW8tPmJpX3NlY3Rvcik7CisJY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsocy0+c3RvcmUsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCiAJLyogRnVsbCBzbmFwc2hvdHMgYXJlIG5vdCB1c2FibGUgKi8KIAkvKiBUbyBnZXQgaGVyZSB0aGUgdGFibGUgbXVzdCBiZSBsaXZlIHNvIHMtPmFjdGl2ZSBpcyBhbHdheXMgc2V0LiAqLwpAQCAtMTcwMiw3ICsxNzAyLDggQEAKIAkJciA9IERNX01BUElPX1NVQk1JVFRFRDsKIAogCQlpZiAoIXBlLT5zdGFydGVkICYmCi0JCSAgICBiaW8tPmJpX3NpemUgPT0gKHMtPnN0b3JlLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkpIHsKKwkJICAgIGJpby0+YmlfaXRlci5iaV9zaXplID09CisJCSAgICAocy0+c3RvcmUtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKSkgewogCQkJcGUtPnN0YXJ0ZWQgPSAxOwogCQkJdXBfd3JpdGUoJnMtPmxvY2spOwogCQkJc3RhcnRfZnVsbF9iaW8ocGUsIGJpbyk7CkBAIC0xNzU4LDcgKzE3NTksNyBAQAogCQlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiAJfQogCi0JY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsocy0+c3RvcmUsIGJpby0+Ymlfc2VjdG9yKTsKKwljaHVuayA9IHNlY3Rvcl90b19jaHVuayhzLT5zdG9yZSwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKIAlkb3duX3dyaXRlKCZzLT5sb2NrKTsKIApAQCAtMjA5NSw3ICsyMDk2LDcgQEAKIAlkb3duX3JlYWQoJl9vcmlnaW5zX2xvY2spOwogCW8gPSBfX2xvb2t1cF9vcmlnaW4ob3JpZ2luLT5iZGV2KTsKIAlpZiAobykKLQkJciA9IF9fb3JpZ2luX3dyaXRlKCZvLT5zbmFwc2hvdHMsIGJpby0+Ymlfc2VjdG9yLCBiaW8pOworCQlyID0gX19vcmlnaW5fd3JpdGUoJm8tPnNuYXBzaG90cywgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgYmlvKTsKIAl1cF9yZWFkKCZfb3JpZ2luc19sb2NrKTsKIAogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zdHJpcGUuYyBiL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKaW5kZXggNzNjMTcxMi4uZDE2MDBkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zdHJpcGUuYworKysgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCkBAIC0yNTksMTMgKzI1OSwxNSBAQAogewogCXNlY3Rvcl90IGJlZ2luLCBlbmQ7CiAKLQlzdHJpcGVfbWFwX3JhbmdlX3NlY3RvcihzYywgYmlvLT5iaV9zZWN0b3IsIHRhcmdldF9zdHJpcGUsICZiZWdpbik7CisJc3RyaXBlX21hcF9yYW5nZV9zZWN0b3Ioc2MsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkJdGFyZ2V0X3N0cmlwZSwgJmJlZ2luKTsKIAlzdHJpcGVfbWFwX3JhbmdlX3NlY3RvcihzYywgYmlvX2VuZF9zZWN0b3IoYmlvKSwKIAkJCQl0YXJnZXRfc3RyaXBlLCAmZW5kKTsKIAlpZiAoYmVnaW4gPCBlbmQpIHsKIAkJYmlvLT5iaV9iZGV2ID0gc2MtPnN0cmlwZVt0YXJnZXRfc3RyaXBlXS5kZXYtPmJkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gYmVnaW4gKyBzYy0+c3RyaXBlW3RhcmdldF9zdHJpcGVdLnBoeXNpY2FsX3N0YXJ0OwotCQliaW8tPmJpX3NpemUgPSB0b19ieXRlcyhlbmQgLSBiZWdpbik7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBiZWdpbiArCisJCQlzYy0+c3RyaXBlW3RhcmdldF9zdHJpcGVdLnBoeXNpY2FsX3N0YXJ0OworCQliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IHRvX2J5dGVzKGVuZCAtIGJlZ2luKTsKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCX0gZWxzZSB7CiAJCS8qIFRoZSByYW5nZSBkb2Vzbid0IG1hcCB0byB0aGUgdGFyZ2V0IHN0cmlwZSAqLwpAQCAtMjkzLDkgKzI5NSwxMCBAQAogCQlyZXR1cm4gc3RyaXBlX21hcF9yYW5nZShzYywgYmlvLCB0YXJnZXRfYmlvX25yKTsKIAl9CiAKLQlzdHJpcGVfbWFwX3NlY3RvcihzYywgYmlvLT5iaV9zZWN0b3IsICZzdHJpcGUsICZiaW8tPmJpX3NlY3Rvcik7CisJc3RyaXBlX21hcF9zZWN0b3Ioc2MsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkgICZzdHJpcGUsICZiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAotCWJpby0+Ymlfc2VjdG9yICs9IHNjLT5zdHJpcGVbc3RyaXBlXS5waHlzaWNhbF9zdGFydDsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICs9IHNjLT5zdHJpcGVbc3RyaXBlXS5waHlzaWNhbF9zdGFydDsKIAliaW8tPmJpX2JkZXYgPSBzYy0+c3RyaXBlW3N0cmlwZV0uZGV2LT5iZGV2OwogCiAJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zd2l0Y2guYyBiL2RyaXZlcnMvbWQvZG0tc3dpdGNoLmMKaW5kZXggZmY5YWM0Yi4uMDlhNjg4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zd2l0Y2guYworKysgYi9kcml2ZXJzL21kL2RtLXN3aXRjaC5jCkBAIC0zMTEsMTEgKzMxMSwxMSBAQAogc3RhdGljIGludCBzd2l0Y2hfbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IHN3aXRjaF9jdHggKnNjdHggPSB0aS0+cHJpdmF0ZTsKLQlzZWN0b3JfdCBvZmZzZXQgPSBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX3NlY3Rvcik7CisJc2VjdG9yX3Qgb2Zmc2V0ID0gZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJdW5zaWduZWQgcGF0aF9uciA9IHN3aXRjaF9nZXRfcGF0aF9ucihzY3R4LCBvZmZzZXQpOwogCiAJYmlvLT5iaV9iZGV2ID0gc2N0eC0+cGF0aF9saXN0W3BhdGhfbnJdLmRtZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gc2N0eC0+cGF0aF9saXN0W3BhdGhfbnJdLnN0YXJ0ICsgb2Zmc2V0OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzY3R4LT5wYXRoX2xpc3RbcGF0aF9ucl0uc3RhcnQgKyBvZmZzZXQ7CiAKIAlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCmluZGV4IDcyNjIyOGIuLmZhYWY5NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBAIC00MTQsNyArNDE0LDcgQEAKIHN0YXRpYyBkbV9ibG9ja190IGdldF9iaW9fYmxvY2soc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOwotCXNlY3Rvcl90IGJsb2NrX25yID0gYmlvLT5iaV9zZWN0b3I7CisJc2VjdG9yX3QgYmxvY2tfbnIgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCiAJaWYgKGJsb2NrX3NpemVfaXNfcG93ZXJfb2ZfdHdvKHBvb2wpKQogCQlibG9ja19uciA+Pj0gcG9vbC0+c2VjdG9yc19wZXJfYmxvY2tfc2hpZnQ7CkBAIC00MjcsMTQgKzQyNywxNSBAQAogc3RhdGljIHZvaWQgcmVtYXAoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbywgZG1fYmxvY2tfdCBibG9jaykKIHsKIAlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOwotCXNlY3Rvcl90IGJpX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCXNlY3Rvcl90IGJpX3NlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAliaW8tPmJpX2JkZXYgPSB0Yy0+cG9vbF9kZXYtPmJkZXY7CiAJaWYgKGJsb2NrX3NpemVfaXNfcG93ZXJfb2ZfdHdvKHBvb2wpKQotCQliaW8tPmJpX3NlY3RvciA9IChibG9jayA8PCBwb29sLT5zZWN0b3JzX3Blcl9ibG9ja19zaGlmdCkgfAotCQkJCShiaV9zZWN0b3IgJiAocG9vbC0+c2VjdG9yc19wZXJfYmxvY2sgLSAxKSk7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPQorCQkJKGJsb2NrIDw8IHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrX3NoaWZ0KSB8CisJCQkoYmlfc2VjdG9yICYgKHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrIC0gMSkpOwogCWVsc2UKLQkJYmlvLT5iaV9zZWN0b3IgPSAoYmxvY2sgKiBwb29sLT5zZWN0b3JzX3Blcl9ibG9jaykgKworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gKGJsb2NrICogcG9vbC0+c2VjdG9yc19wZXJfYmxvY2spICsKIAkJCQkgc2VjdG9yX2RpdihiaV9zZWN0b3IsIHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrKTsKIH0KIApAQCAtNjEyLDggKzYxMywxMCBAQAogCiBzdGF0aWMgdm9pZCBwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmdfZmFpbChzdHJ1Y3QgZG1fdGhpbl9uZXdfbWFwcGluZyAqbSkKIHsKLQlpZiAobS0+YmlvKQorCWlmIChtLT5iaW8pIHsKIAkJbS0+YmlvLT5iaV9lbmRfaW8gPSBtLT5zYXZlZF9iaV9lbmRfaW87CisJCWF0b21pY19pbmMoJm0tPmJpby0+YmlfcmVtYWluaW5nKTsKKwl9CiAJY2VsbF9lcnJvcihtLT50Yy0+cG9vbCwgbS0+Y2VsbCk7CiAJbGlzdF9kZWwoJm0tPmxpc3QpOwogCW1lbXBvb2xfZnJlZShtLCBtLT50Yy0+cG9vbC0+bWFwcGluZ19wb29sKTsKQEAgLTYyNyw4ICs2MzAsMTAgQEAKIAlpbnQgcjsKIAogCWJpbyA9IG0tPmJpbzsKLQlpZiAoYmlvKQorCWlmIChiaW8pIHsKIAkJYmlvLT5iaV9lbmRfaW8gPSBtLT5zYXZlZF9iaV9lbmRfaW87CisJCWF0b21pY19pbmMoJmJpby0+YmlfcmVtYWluaW5nKTsKKwl9CiAKIAlpZiAobS0+ZXJyKSB7CiAJCWNlbGxfZXJyb3IocG9vbCwgbS0+Y2VsbCk7CkBAIC03MzEsNyArNzM2LDggQEAKICAqLwogc3RhdGljIGludCBpb19vdmVybGFwc19ibG9jayhzdHJ1Y3QgcG9vbCAqcG9vbCwgc3RydWN0IGJpbyAqYmlvKQogewotCXJldHVybiBiaW8tPmJpX3NpemUgPT0gKHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrIDw8IFNFQ1RPUl9TSElGVCk7CisJcmV0dXJuIGJpby0+YmlfaXRlci5iaV9zaXplID09CisJCShwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOwogfQogCiBzdGF0aWMgaW50IGlvX292ZXJ3cml0ZXNfYmxvY2soc3RydWN0IHBvb2wgKnBvb2wsIHN0cnVjdCBiaW8gKmJpbykKQEAgLTExMzYsNyArMTE0Miw3IEBACiAJaWYgKGJpb19kZXRhaW4ocG9vbCwgJmtleSwgYmlvLCAmY2VsbCkpCiAJCXJldHVybjsKIAotCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSAmJiBiaW8tPmJpX3NpemUpCisJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFICYmIGJpby0+YmlfaXRlci5iaV9zaXplKQogCQlicmVha19zaGFyaW5nKHRjLCBiaW8sIGJsb2NrLCAma2V5LCBsb29rdXBfcmVzdWx0LCBjZWxsKTsKIAllbHNlIHsKIAkJc3RydWN0IGRtX3RoaW5fZW5kaW9faG9vayAqaCA9IGRtX3Blcl9iaW9fZGF0YShiaW8sIHNpemVvZihzdHJ1Y3QgZG1fdGhpbl9lbmRpb19ob29rKSk7CkBAIC0xMTU5LDcgKzExNjUsNyBAQAogCS8qCiAJICogUmVtYXAgZW1wdHkgYmlvcyAoZmx1c2hlcykgaW1tZWRpYXRlbHksIHdpdGhvdXQgcHJvdmlzaW9uaW5nLgogCSAqLwotCWlmICghYmlvLT5iaV9zaXplKSB7CisJaWYgKCFiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkgewogCQlpbmNfYWxsX2lvX2VudHJ5KHBvb2wsIGJpbyk7CiAJCWNlbGxfZGVmZXJfbm9faG9sZGVyKHRjLCBjZWxsKTsKIApAQCAtMTI1OCw3ICsxMjY0LDcgQEAKIAlyID0gZG1fdGhpbl9maW5kX2Jsb2NrKHRjLT50ZCwgYmxvY2ssIDEsICZsb29rdXBfcmVzdWx0KTsKIAlzd2l0Y2ggKHIpIHsKIAljYXNlIDA6Ci0JCWlmIChsb29rdXBfcmVzdWx0LnNoYXJlZCAmJiAocncgPT0gV1JJVEUpICYmIGJpby0+Ymlfc2l6ZSkKKwkJaWYgKGxvb2t1cF9yZXN1bHQuc2hhcmVkICYmIChydyA9PSBXUklURSkgJiYgYmlvLT5iaV9pdGVyLmJpX3NpemUpCiAJCQloYW5kbGVfdW5zZXJ2aWNlYWJsZV9iaW8odGMtPnBvb2wsIGJpbyk7CiAJCWVsc2UgewogCQkJaW5jX2FsbF9pb19lbnRyeSh0Yy0+cG9vbCwgYmlvKTsKQEAgLTI5MzksNyArMjk0NSw3IEBACiAKIHN0YXRpYyBpbnQgdGhpbl9tYXAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbykKIHsKLQliaW8tPmJpX3NlY3RvciA9IGRtX3RhcmdldF9vZmZzZXQodGksIGJpby0+Ymlfc2VjdG9yKTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKIAlyZXR1cm4gdGhpbl9iaW9fbWFwKHRpLCBiaW8pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS12ZXJpdHkuYyBiL2RyaXZlcnMvbWQvZG0tdmVyaXR5LmMKaW5kZXggNGI3OTQxZC4uNzk2MDA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS12ZXJpdHkuYworKysgYi9kcml2ZXJzL21kL2RtLXZlcml0eS5jCkBAIC03MywxNSArNzMsMTAgQEAKIAlzZWN0b3JfdCBibG9jazsKIAl1bnNpZ25lZCBuX2Jsb2NrczsKIAotCS8qIHNhdmVkIGJpbyB2ZWN0b3IgKi8KLQlzdHJ1Y3QgYmlvX3ZlYyAqaW9fdmVjOwotCXVuc2lnbmVkIGlvX3ZlY19zaXplOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCi0JLyogQSBzcGFjZSBmb3Igc2hvcnQgdmVjdG9yczsgbG9uZ2VyIHZlY3RvcnMgYXJlIGFsbG9jYXRlZCBzZXBhcmF0ZWx5LiAqLwotCXN0cnVjdCBiaW9fdmVjIGlvX3ZlY19pbmxpbmVbRE1fVkVSSVRZX0lPX1ZFQ19JTkxJTkVdOwotCiAJLyoKIAkgKiBUaHJlZSB2YXJpYWJseS1zaXplIGZpZWxkcyBmb2xsb3cgdGhpcyBzdHJ1Y3Q6CiAJICoKQEAgLTI4NCw5ICsyNzksMTAgQEAKIHN0YXRpYyBpbnQgdmVyaXR5X3ZlcmlmeV9pbyhzdHJ1Y3QgZG1fdmVyaXR5X2lvICppbykKIHsKIAlzdHJ1Y3QgZG1fdmVyaXR5ICp2ID0gaW8tPnY7CisJc3RydWN0IGJpbyAqYmlvID0gZG1fYmlvX2Zyb21fcGVyX2Jpb19kYXRhKGlvLAorCQkJCQkJICAgdi0+dGktPnBlcl9iaW9fZGF0YV9zaXplKTsKIAl1bnNpZ25lZCBiOwogCWludCBpOwotCXVuc2lnbmVkIHZlY3RvciA9IDAsIG9mZnNldCA9IDA7CiAKIAlmb3IgKGIgPSAwOyBiIDwgaW8tPm5fYmxvY2tzOyBiKyspIHsKIAkJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2M7CkBAIC0zMzYsMzEgKzMzMiwyMiBAQAogCQl9CiAKIAkJdG9kbyA9IDEgPDwgdi0+ZGF0YV9kZXZfYmxvY2tfYml0czsKLQkJZG8gewotCQkJc3RydWN0IGJpb192ZWMgKmJ2OworCQl3aGlsZSAoaW8tPml0ZXIuYmlfc2l6ZSkgewogCQkJdTggKnBhZ2U7Ci0JCQl1bnNpZ25lZCBsZW47CisJCQlzdHJ1Y3QgYmlvX3ZlYyBidiA9IGJpb19pdGVyX2lvdmVjKGJpbywgaW8tPml0ZXIpOwogCi0JCQlCVUdfT04odmVjdG9yID49IGlvLT5pb192ZWNfc2l6ZSk7Ci0JCQlidiA9ICZpby0+aW9fdmVjW3ZlY3Rvcl07Ci0JCQlwYWdlID0ga21hcF9hdG9taWMoYnYtPmJ2X3BhZ2UpOwotCQkJbGVuID0gYnYtPmJ2X2xlbiAtIG9mZnNldDsKLQkJCWlmIChsaWtlbHkobGVuID49IHRvZG8pKQotCQkJCWxlbiA9IHRvZG87Ci0JCQlyID0gY3J5cHRvX3NoYXNoX3VwZGF0ZShkZXNjLAotCQkJCQlwYWdlICsgYnYtPmJ2X29mZnNldCArIG9mZnNldCwgbGVuKTsKKwkJCXBhZ2UgPSBrbWFwX2F0b21pYyhidi5idl9wYWdlKTsKKwkJCXIgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIHBhZ2UgKyBidi5idl9vZmZzZXQsCisJCQkJCQlidi5idl9sZW4pOwogCQkJa3VubWFwX2F0b21pYyhwYWdlKTsKKwogCQkJaWYgKHIgPCAwKSB7CiAJCQkJRE1FUlIoImNyeXB0b19zaGFzaF91cGRhdGUgZmFpbGVkOiAlZCIsIHIpOwogCQkJCXJldHVybiByOwogCQkJfQotCQkJb2Zmc2V0ICs9IGxlbjsKLQkJCWlmIChsaWtlbHkob2Zmc2V0ID09IGJ2LT5idl9sZW4pKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCQl2ZWN0b3IrKzsKLQkJCX0KLQkJCXRvZG8gLT0gbGVuOwotCQl9IHdoaWxlICh0b2RvKTsKKworCQkJYmlvX2FkdmFuY2VfaXRlcihiaW8sICZpby0+aXRlciwgYnYuYnZfbGVuKTsKKwkJfQogCiAJCWlmICghdi0+dmVyc2lvbikgewogCQkJciA9IGNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgdi0+c2FsdCwgdi0+c2FsdF9zaXplKTsKQEAgLTM4Myw4ICszNzAsNiBAQAogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9Ci0JQlVHX09OKHZlY3RvciAhPSBpby0+aW9fdmVjX3NpemUpOwotCUJVR19PTihvZmZzZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDAsMTAgKzM4NSw3IEBACiAJYmlvLT5iaV9lbmRfaW8gPSBpby0+b3JpZ19iaV9lbmRfaW87CiAJYmlvLT5iaV9wcml2YXRlID0gaW8tPm9yaWdfYmlfcHJpdmF0ZTsKIAotCWlmIChpby0+aW9fdmVjICE9IGlvLT5pb192ZWNfaW5saW5lKQotCQltZW1wb29sX2ZyZWUoaW8tPmlvX3ZlYywgdi0+dmVjX21lbXBvb2wpOwotCi0JYmlvX2VuZGlvKGJpbywgZXJyb3IpOworCWJpb19lbmRpb19ub2RlYyhiaW8sIGVycm9yKTsKIH0KIAogc3RhdGljIHZvaWQgdmVyaXR5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQpAQCAtNDkzLDkgKzQ3NSw5IEBACiAJc3RydWN0IGRtX3Zlcml0eV9pbyAqaW87CiAKIAliaW8tPmJpX2JkZXYgPSB2LT5kYXRhX2Rldi0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IHZlcml0eV9tYXBfc2VjdG9yKHYsIGJpby0+Ymlfc2VjdG9yKTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gdmVyaXR5X21hcF9zZWN0b3IodiwgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAKLQlpZiAoKCh1bnNpZ25lZCliaW8tPmJpX3NlY3RvciB8IGJpb19zZWN0b3JzKGJpbykpICYKKwlpZiAoKCh1bnNpZ25lZCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIHwgYmlvX3NlY3RvcnMoYmlvKSkgJgogCSAgICAoKDEgPDwgKHYtPmRhdGFfZGV2X2Jsb2NrX2JpdHMgLSBTRUNUT1JfU0hJRlQpKSAtIDEpKSB7CiAJCURNRVJSX0xJTUlUKCJ1bmFsaWduZWQgaW8iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC01MTQsMTggKzQ5NiwxMiBAQAogCWlvLT52ID0gdjsKIAlpby0+b3JpZ19iaV9lbmRfaW8gPSBiaW8tPmJpX2VuZF9pbzsKIAlpby0+b3JpZ19iaV9wcml2YXRlID0gYmlvLT5iaV9wcml2YXRlOwotCWlvLT5ibG9jayA9IGJpby0+Ymlfc2VjdG9yID4+ICh2LT5kYXRhX2Rldl9ibG9ja19iaXRzIC0gU0VDVE9SX1NISUZUKTsKLQlpby0+bl9ibG9ja3MgPSBiaW8tPmJpX3NpemUgPj4gdi0+ZGF0YV9kZXZfYmxvY2tfYml0czsKKwlpby0+YmxvY2sgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID4+ICh2LT5kYXRhX2Rldl9ibG9ja19iaXRzIC0gU0VDVE9SX1NISUZUKTsKKwlpby0+bl9ibG9ja3MgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA+PiB2LT5kYXRhX2Rldl9ibG9ja19iaXRzOwogCiAJYmlvLT5iaV9lbmRfaW8gPSB2ZXJpdHlfZW5kX2lvOwogCWJpby0+YmlfcHJpdmF0ZSA9IGlvOwotCWlvLT5pb192ZWNfc2l6ZSA9IGJpb19zZWdtZW50cyhiaW8pOwotCWlmIChpby0+aW9fdmVjX3NpemUgPCBETV9WRVJJVFlfSU9fVkVDX0lOTElORSkKLQkJaW8tPmlvX3ZlYyA9IGlvLT5pb192ZWNfaW5saW5lOwotCWVsc2UKLQkJaW8tPmlvX3ZlYyA9IG1lbXBvb2xfYWxsb2Modi0+dmVjX21lbXBvb2wsIEdGUF9OT0lPKTsKLQltZW1jcHkoaW8tPmlvX3ZlYywgYmlvX2lvdmVjKGJpbyksCi0JICAgICAgIGlvLT5pb192ZWNfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOworCWlvLT5pdGVyID0gYmlvLT5iaV9pdGVyOwogCiAJdmVyaXR5X3N1Ym1pdF9wcmVmZXRjaCh2LCBpbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCBiNDljNzYyLi44YzUzYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC01NzUsNyArNTc1LDcgQEAKIAkJYXRvbWljX2luY19yZXR1cm4oJm1kLT5wZW5kaW5nW3J3XSkpOwogCiAJaWYgKHVubGlrZWx5KGRtX3N0YXRzX3VzZWQoJm1kLT5zdGF0cykpKQotCQlkbV9zdGF0c19hY2NvdW50X2lvKCZtZC0+c3RhdHMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2VjdG9yLAorCQlkbV9zdGF0c19hY2NvdW50X2lvKCZtZC0+c3RhdHMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCiAJCQkJICAgIGJpb19zZWN0b3JzKGJpbyksIGZhbHNlLCAwLCAmaW8tPnN0YXRzX2F1eCk7CiB9CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogCXBhcnRfc3RhdF91bmxvY2soKTsKIAogCWlmICh1bmxpa2VseShkbV9zdGF0c191c2VkKCZtZC0+c3RhdHMpKSkKLQkJZG1fc3RhdHNfYWNjb3VudF9pbygmbWQtPnN0YXRzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NlY3RvciwKKwkJZG1fc3RhdHNfYWNjb3VudF9pbygmbWQtPnN0YXRzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJCSAgICBiaW9fc2VjdG9ycyhiaW8pLCB0cnVlLCBkdXJhdGlvbiwgJmlvLT5zdGF0c19hdXgpOwogCiAJLyoKQEAgLTc0Miw3ICs3NDIsNyBAQAogCQlpZiAoaW9fZXJyb3IgPT0gRE1fRU5ESU9fUkVRVUVVRSkKIAkJCXJldHVybjsKIAotCQlpZiAoKGJpby0+YmlfcncgJiBSRVFfRkxVU0gpICYmIGJpby0+Ymlfc2l6ZSkgeworCQlpZiAoKGJpby0+YmlfcncgJiBSRVFfRkxVU0gpICYmIGJpby0+YmlfaXRlci5iaV9zaXplKSB7CiAJCQkvKgogCQkJICogUHJlZmx1c2ggZG9uZSBmb3IgZmx1c2ggd2l0aCBkYXRhLCByZWlzc3VlCiAJCQkgKiB3aXRob3V0IFJFUV9GTFVTSC4KQEAgLTc5Nyw3ICs3OTcsNyBAQAogCXN0cnVjdCBkbV9ycV9jbG9uZV9iaW9faW5mbyAqaW5mbyA9IGNsb25lLT5iaV9wcml2YXRlOwogCXN0cnVjdCBkbV9ycV90YXJnZXRfaW8gKnRpbyA9IGluZm8tPnRpbzsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBpbmZvLT5vcmlnOwotCXVuc2lnbmVkIGludCBucl9ieXRlcyA9IGluZm8tPm9yaWctPmJpX3NpemU7CisJdW5zaWduZWQgaW50IG5yX2J5dGVzID0gaW5mby0+b3JpZy0+YmlfaXRlci5iaV9zaXplOwogCiAJYmlvX3B1dChjbG9uZSk7CiAKQEAgLTExMjgsNyArMTEyOCw3IEBACiAJICogdGhpcyBpby4KIAkgKi8KIAlhdG9taWNfaW5jKCZ0aW8tPmlvLT5pb19jb3VudCk7Ci0Jc2VjdG9yID0gY2xvbmUtPmJpX3NlY3RvcjsKKwlzZWN0b3IgPSBjbG9uZS0+YmlfaXRlci5iaV9zZWN0b3I7CiAJciA9IHRpLT50eXBlLT5tYXAodGksIGNsb25lKTsKIAlpZiAociA9PSBETV9NQVBJT19SRU1BUFBFRCkgewogCQkvKiB0aGUgYmlvIGhhcyBiZWVuIHJlbWFwcGVkIHNvIGRpc3BhdGNoIGl0ICovCkBAIC0xMTU1LDc2ICsxMTU1LDMyIEBACiAJc3RydWN0IGRtX2lvICppbzsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc2VjdG9yX3Qgc2VjdG9yX2NvdW50OwotCXVuc2lnbmVkIHNob3J0IGlkeDsKIH07CiAKIHN0YXRpYyB2b2lkIGJpb19zZXR1cF9zZWN0b3Ioc3RydWN0IGJpbyAqYmlvLCBzZWN0b3JfdCBzZWN0b3IsIHNlY3Rvcl90IGxlbikKIHsKLQliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKLQliaW8tPmJpX3NpemUgPSB0b19ieXRlcyhsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBiaW9fc2V0dXBfYnYoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzaG9ydCBpZHgsIHVuc2lnbmVkIHNob3J0IGJ2X2NvdW50KQotewotCWJpby0+YmlfaWR4ID0gaWR4OwotCWJpby0+YmlfdmNudCA9IGlkeCArIGJ2X2NvdW50OwotCWJpby0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOwotfQotCi1zdGF0aWMgdm9pZCBjbG9uZV9iaW9faW50ZWdyaXR5KHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqY2xvbmUsCi0JCQkJdW5zaWduZWQgc2hvcnQgaWR4LCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIG9mZnNldCwKLQkJCQl1bnNpZ25lZCB0cmltKQotewotCWlmICghYmlvX2ludGVncml0eShiaW8pKQotCQlyZXR1cm47Ci0KLQliaW9faW50ZWdyaXR5X2Nsb25lKGNsb25lLCBiaW8sIEdGUF9OT0lPKTsKLQotCWlmICh0cmltKQotCQliaW9faW50ZWdyaXR5X3RyaW0oY2xvbmUsIGJpb19zZWN0b3Jfb2Zmc2V0KGJpbywgaWR4LCBvZmZzZXQpLCBsZW4pOwotfQotCi0vKgotICogQ3JlYXRlcyBhIGxpdHRsZSBiaW8gdGhhdCBqdXN0IGRvZXMgcGFydCBvZiBhIGJ2ZWMuCi0gKi8KLXN0YXRpYyB2b2lkIGNsb25lX3NwbGl0X2JpbyhzdHJ1Y3QgZG1fdGFyZ2V0X2lvICp0aW8sIHN0cnVjdCBiaW8gKmJpbywKLQkJCSAgICBzZWN0b3JfdCBzZWN0b3IsIHVuc2lnbmVkIHNob3J0IGlkeCwKLQkJCSAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYmlvICpjbG9uZSA9ICZ0aW8tPmNsb25lOwotCXN0cnVjdCBiaW9fdmVjICpidiA9IGJpby0+YmlfaW9fdmVjICsgaWR4OwotCi0JKmNsb25lLT5iaV9pb192ZWMgPSAqYnY7Ci0KLQliaW9fc2V0dXBfc2VjdG9yKGNsb25lLCBzZWN0b3IsIGxlbik7Ci0KLQljbG9uZS0+YmlfYmRldiA9IGJpby0+YmlfYmRldjsKLQljbG9uZS0+YmlfcncgPSBiaW8tPmJpX3J3OwotCWNsb25lLT5iaV92Y250ID0gMTsKLQljbG9uZS0+YmlfaW9fdmVjLT5idl9vZmZzZXQgPSBvZmZzZXQ7Ci0JY2xvbmUtPmJpX2lvX3ZlYy0+YnZfbGVuID0gY2xvbmUtPmJpX3NpemU7Ci0JY2xvbmUtPmJpX2ZsYWdzIHw9IDEgPDwgQklPX0NMT05FRDsKLQotCWNsb25lX2Jpb19pbnRlZ3JpdHkoYmlvLCBjbG9uZSwgaWR4LCBsZW4sIG9mZnNldCwgMSk7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IHRvX2J5dGVzKGxlbik7CiB9CiAKIC8qCiAgKiBDcmVhdGVzIGEgYmlvIHRoYXQgY29uc2lzdHMgb2YgcmFuZ2Ugb2YgY29tcGxldGUgYnZlY3MuCiAgKi8KIHN0YXRpYyB2b2lkIGNsb25lX2JpbyhzdHJ1Y3QgZG1fdGFyZ2V0X2lvICp0aW8sIHN0cnVjdCBiaW8gKmJpbywKLQkJICAgICAgc2VjdG9yX3Qgc2VjdG9yLCB1bnNpZ25lZCBzaG9ydCBpZHgsCi0JCSAgICAgIHVuc2lnbmVkIHNob3J0IGJ2X2NvdW50LCB1bnNpZ25lZCBsZW4pCisJCSAgICAgIHNlY3Rvcl90IHNlY3RvciwgdW5zaWduZWQgbGVuKQogewogCXN0cnVjdCBiaW8gKmNsb25lID0gJnRpby0+Y2xvbmU7Ci0JdW5zaWduZWQgdHJpbSA9IDA7CiAKLQlfX2Jpb19jbG9uZShjbG9uZSwgYmlvKTsKLQliaW9fc2V0dXBfc2VjdG9yKGNsb25lLCBzZWN0b3IsIGxlbik7Ci0JYmlvX3NldHVwX2J2KGNsb25lLCBpZHgsIGJ2X2NvdW50KTsKKwlfX2Jpb19jbG9uZV9mYXN0KGNsb25lLCBiaW8pOwogCi0JaWYgKGlkeCAhPSBiaW8tPmJpX2lkeCB8fCBjbG9uZS0+Ymlfc2l6ZSA8IGJpby0+Ymlfc2l6ZSkKLQkJdHJpbSA9IDE7Ci0JY2xvbmVfYmlvX2ludGVncml0eShiaW8sIGNsb25lLCBpZHgsIGxlbiwgMCwgdHJpbSk7CisJaWYgKGJpb19pbnRlZ3JpdHkoYmlvKSkKKwkJYmlvX2ludGVncml0eV9jbG9uZShjbG9uZSwgYmlvLCBHRlBfTk9JTyk7CisKKwliaW9fYWR2YW5jZShjbG9uZSwgdG9fYnl0ZXMoc2VjdG9yIC0gY2xvbmUtPmJpX2l0ZXIuYmlfc2VjdG9yKSk7CisJY2xvbmUtPmJpX2l0ZXIuYmlfc2l6ZSA9IHRvX2J5dGVzKGxlbik7CisKKwlpZiAoYmlvX2ludGVncml0eShiaW8pKQorCQliaW9faW50ZWdyaXR5X3RyaW0oY2xvbmUsIDAsIGxlbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1fdGFyZ2V0X2lvICphbGxvY190aW8oc3RydWN0IGNsb25lX2luZm8gKmNpLApAQCAtMTI1Nyw3ICsxMjEzLDcgQEAKIAkgKiBjaS0+YmlvLT5iaV9tYXhfdmVjcyBpcyBCSU9fSU5MSU5FX1ZFQ1MgYW55d2F5LCBmb3IgYm90aCBmbHVzaAogCSAqIGFuZCBkaXNjYXJkLCBzbyBubyBuZWVkIGZvciBjb25jZXJuIGFib3V0IHdhc3RlZCBidmVjIGFsbG9jYXRpb25zLgogCSAqLwotCSBfX2Jpb19jbG9uZShjbG9uZSwgY2ktPmJpbyk7CisJIF9fYmlvX2Nsb25lX2Zhc3QoY2xvbmUsIGNpLT5iaW8pOwogCWlmIChsZW4pCiAJCWJpb19zZXR1cF9zZWN0b3IoY2xvbmUsIGNpLT5zZWN0b3IsIGxlbik7CiAKQEAgLTEyODYsMTAgKzEyNDIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2Nsb25lX2FuZF9tYXBfZGF0YV9iaW8oc3RydWN0IGNsb25lX2luZm8gKmNpLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJCQkgICAgIHNlY3Rvcl90IHNlY3RvciwgaW50IG5yX2lvdmVjcywKLQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IGlkeCwgdW5zaWduZWQgc2hvcnQgYnZfY291bnQsCi0JCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbiwKLQkJCQkgICAgIHVuc2lnbmVkIHNwbGl0X2J2ZWMpCisJCQkJICAgICBzZWN0b3JfdCBzZWN0b3IsIHVuc2lnbmVkIGxlbikKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBjaS0+YmlvOwogCXN0cnVjdCBkbV90YXJnZXRfaW8gKnRpbzsKQEAgLTEzMDMsMTEgKzEyNTYsOCBAQAogCQludW1fdGFyZ2V0X2Jpb3MgPSB0aS0+bnVtX3dyaXRlX2Jpb3ModGksIGJpbyk7CiAKIAlmb3IgKHRhcmdldF9iaW9fbnIgPSAwOyB0YXJnZXRfYmlvX25yIDwgbnVtX3RhcmdldF9iaW9zOyB0YXJnZXRfYmlvX25yKyspIHsKLQkJdGlvID0gYWxsb2NfdGlvKGNpLCB0aSwgbnJfaW92ZWNzLCB0YXJnZXRfYmlvX25yKTsKLQkJaWYgKHNwbGl0X2J2ZWMpCi0JCQljbG9uZV9zcGxpdF9iaW8odGlvLCBiaW8sIHNlY3RvciwgaWR4LCBvZmZzZXQsIGxlbik7Ci0JCWVsc2UKLQkJCWNsb25lX2Jpbyh0aW8sIGJpbywgc2VjdG9yLCBpZHgsIGJ2X2NvdW50LCBsZW4pOworCQl0aW8gPSBhbGxvY190aW8oY2ksIHRpLCAwLCB0YXJnZXRfYmlvX25yKTsKKwkJY2xvbmVfYmlvKHRpbywgYmlvLCBzZWN0b3IsIGxlbik7CiAJCV9fbWFwX2Jpbyh0aW8pOwogCX0KIH0KQEAgLTEzNzksNjggKzEzMjksMTMgQEAKIH0KIAogLyoKLSAqIEZpbmQgbWF4aW11bSBudW1iZXIgb2Ygc2VjdG9ycyAvIGJ2ZWNzIHdlIGNhbiBwcm9jZXNzIHdpdGggYSBzaW5nbGUgYmlvLgotICovCi1zdGF0aWMgc2VjdG9yX3QgX19sZW5fd2l0aGluX3RhcmdldChzdHJ1Y3QgY2xvbmVfaW5mbyAqY2ksIHNlY3Rvcl90IG1heCwgaW50ICppZHgpCi17Ci0Jc3RydWN0IGJpbyAqYmlvID0gY2ktPmJpbzsKLQlzZWN0b3JfdCBidl9sZW4sIHRvdGFsX2xlbiA9IDA7Ci0KLQlmb3IgKCppZHggPSBjaS0+aWR4OyBtYXggJiYgKCppZHggPCBiaW8tPmJpX3ZjbnQpOyAoKmlkeCkrKykgewotCQlidl9sZW4gPSB0b19zZWN0b3IoYmlvLT5iaV9pb192ZWNbKmlkeF0uYnZfbGVuKTsKLQotCQlpZiAoYnZfbGVuID4gbWF4KQotCQkJYnJlYWs7Ci0KLQkJbWF4IC09IGJ2X2xlbjsKLQkJdG90YWxfbGVuICs9IGJ2X2xlbjsKLQl9Ci0KLQlyZXR1cm4gdG90YWxfbGVuOwotfQotCi1zdGF0aWMgaW50IF9fc3BsaXRfYnZlY19hY3Jvc3NfdGFyZ2V0cyhzdHJ1Y3QgY2xvbmVfaW5mbyAqY2ksCi0JCQkJICAgICAgIHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzZWN0b3JfdCBtYXgpCi17Ci0Jc3RydWN0IGJpbyAqYmlvID0gY2ktPmJpbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnYgPSBiaW8tPmJpX2lvX3ZlYyArIGNpLT5pZHg7Ci0Jc2VjdG9yX3QgcmVtYWluaW5nID0gdG9fc2VjdG9yKGJ2LT5idl9sZW4pOwotCXVuc2lnbmVkIG9mZnNldCA9IDA7Ci0Jc2VjdG9yX3QgbGVuOwotCi0JZG8gewotCQlpZiAob2Zmc2V0KSB7Ci0JCQl0aSA9IGRtX3RhYmxlX2ZpbmRfdGFyZ2V0KGNpLT5tYXAsIGNpLT5zZWN0b3IpOwotCQkJaWYgKCFkbV90YXJnZXRfaXNfdmFsaWQodGkpKQotCQkJCXJldHVybiAtRUlPOwotCi0JCQltYXggPSBtYXhfaW9fbGVuKGNpLT5zZWN0b3IsIHRpKTsKLQkJfQotCi0JCWxlbiA9IG1pbihyZW1haW5pbmcsIG1heCk7Ci0KLQkJX19jbG9uZV9hbmRfbWFwX2RhdGFfYmlvKGNpLCB0aSwgY2ktPnNlY3RvciwgMSwgY2ktPmlkeCwgMCwKLQkJCQkJIGJ2LT5idl9vZmZzZXQgKyBvZmZzZXQsIGxlbiwgMSk7Ci0KLQkJY2ktPnNlY3RvciArPSBsZW47Ci0JCWNpLT5zZWN0b3JfY291bnQgLT0gbGVuOwotCQlvZmZzZXQgKz0gdG9fYnl0ZXMobGVuKTsKLQl9IHdoaWxlIChyZW1haW5pbmcgLT0gbGVuKTsKLQotCWNpLT5pZHgrKzsKLQotCXJldHVybiAwOwotfQotCi0vKgogICogU2VsZWN0IHRoZSBjb3JyZWN0IHN0cmF0ZWd5IGZvciBwcm9jZXNzaW5nIGEgbm9uLWZsdXNoIGJpby4KICAqLwogc3RhdGljIGludCBfX3NwbGl0X2FuZF9wcm9jZXNzX25vbl9mbHVzaChzdHJ1Y3QgY2xvbmVfaW5mbyAqY2kpCiB7CiAJc3RydWN0IGJpbyAqYmlvID0gY2ktPmJpbzsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKLQlzZWN0b3JfdCBsZW4sIG1heDsKLQlpbnQgaWR4OworCXVuc2lnbmVkIGxlbjsKIAogCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpKQogCQlyZXR1cm4gX19zZW5kX2Rpc2NhcmQoY2kpOwpAQCAtMTQ1MSw0MSArMTM0NiwxNCBAQAogCWlmICghZG1fdGFyZ2V0X2lzX3ZhbGlkKHRpKSkKIAkJcmV0dXJuIC1FSU87CiAKLQltYXggPSBtYXhfaW9fbGVuKGNpLT5zZWN0b3IsIHRpKTsKKwlsZW4gPSBtaW5fdChzZWN0b3JfdCwgbWF4X2lvX2xlbihjaS0+c2VjdG9yLCB0aSksIGNpLT5zZWN0b3JfY291bnQpOwogCi0JLyoKLQkgKiBPcHRpbWlzZSBmb3IgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIHdlIGNhbiBkbyBhbGwgb2YKLQkgKiB0aGUgcmVtYWluaW5nIGlvIHdpdGggYSBzaW5nbGUgY2xvbmUuCi0JICovCi0JaWYgKGNpLT5zZWN0b3JfY291bnQgPD0gbWF4KSB7Ci0JCV9fY2xvbmVfYW5kX21hcF9kYXRhX2JpbyhjaSwgdGksIGNpLT5zZWN0b3IsIGJpby0+YmlfbWF4X3ZlY3MsCi0JCQkJCSBjaS0+aWR4LCBiaW8tPmJpX3ZjbnQgLSBjaS0+aWR4LCAwLAotCQkJCQkgY2ktPnNlY3Rvcl9jb3VudCwgMCk7Ci0JCWNpLT5zZWN0b3JfY291bnQgPSAwOwotCQlyZXR1cm4gMDsKLQl9CisJX19jbG9uZV9hbmRfbWFwX2RhdGFfYmlvKGNpLCB0aSwgY2ktPnNlY3RvciwgbGVuKTsKIAotCS8qCi0JICogVGhlcmUgYXJlIHNvbWUgYnZlY3MgdGhhdCBkb24ndCBzcGFuIHRhcmdldHMuCi0JICogRG8gYXMgbWFueSBvZiB0aGVzZSBhcyBwb3NzaWJsZS4KLQkgKi8KLQlpZiAodG9fc2VjdG9yKGJpby0+YmlfaW9fdmVjW2NpLT5pZHhdLmJ2X2xlbikgPD0gbWF4KSB7Ci0JCWxlbiA9IF9fbGVuX3dpdGhpbl90YXJnZXQoY2ksIG1heCwgJmlkeCk7CisJY2ktPnNlY3RvciArPSBsZW47CisJY2ktPnNlY3Rvcl9jb3VudCAtPSBsZW47CiAKLQkJX19jbG9uZV9hbmRfbWFwX2RhdGFfYmlvKGNpLCB0aSwgY2ktPnNlY3RvciwgYmlvLT5iaV9tYXhfdmVjcywKLQkJCQkJIGNpLT5pZHgsIGlkeCAtIGNpLT5pZHgsIDAsIGxlbiwgMCk7Ci0KLQkJY2ktPnNlY3RvciArPSBsZW47Ci0JCWNpLT5zZWN0b3JfY291bnQgLT0gbGVuOwotCQljaS0+aWR4ID0gaWR4OwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogSGFuZGxlIGEgYnZlYyB0aGF0IG11c3QgYmUgc3BsaXQgYmV0d2VlbiB0d28gb3IgbW9yZSB0YXJnZXRzLgotCSAqLwotCXJldHVybiBfX3NwbGl0X2J2ZWNfYWNyb3NzX3RhcmdldHMoY2ksIHRpLCBtYXgpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTUxMCw4ICsxMzc4LDcgQEAKIAljaS5pby0+YmlvID0gYmlvOwogCWNpLmlvLT5tZCA9IG1kOwogCXNwaW5fbG9ja19pbml0KCZjaS5pby0+ZW5kaW9fbG9jayk7Ci0JY2kuc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7Ci0JY2kuaWR4ID0gYmlvLT5iaV9pZHg7CisJY2kuc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAogCXN0YXJ0X2lvX2FjY3QoY2kuaW8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2ZhdWx0eS5jIGIvZHJpdmVycy9tZC9mYXVsdHkuYwppbmRleCAzMTkzYWVmLi5lOGI0NTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2ZhdWx0eS5jCisrKyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKQEAgLTc0LDggKzc0LDggQEAKIHsKIAlzdHJ1Y3QgYmlvICpiID0gYmlvLT5iaV9wcml2YXRlOwogCi0JYi0+Ymlfc2l6ZSA9IGJpby0+Ymlfc2l6ZTsKLQliLT5iaV9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwliLT5iaV9pdGVyLmJpX3NpemUgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKKwliLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAliaW9fcHV0KGJpbyk7CiAKQEAgLTE4NSwyNiArMTg1LDMxIEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlpZiAoY2hlY2tfc2VjdG9yKGNvbmYsIGJpby0+Ymlfc2VjdG9yLCBiaW9fZW5kX3NlY3RvcihiaW8pLCBXUklURSkpCisJCWlmIChjaGVja19zZWN0b3IoY29uZiwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQkgYmlvX2VuZF9zZWN0b3IoYmlvKSwgV1JJVEUpKQogCQkJZmFpbGl0ID0gMTsKIAkJaWYgKGNoZWNrX21vZGUoY29uZiwgV3JpdGVQZXJzaXN0ZW50KSkgewotCQkJYWRkX3NlY3Rvcihjb25mLCBiaW8tPmJpX3NlY3RvciwgV3JpdGVQZXJzaXN0ZW50KTsKKwkJCWFkZF9zZWN0b3IoY29uZiwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQkgICBXcml0ZVBlcnNpc3RlbnQpOwogCQkJZmFpbGl0ID0gMTsKIAkJfQogCQlpZiAoY2hlY2tfbW9kZShjb25mLCBXcml0ZVRyYW5zaWVudCkpCiAJCQlmYWlsaXQgPSAxOwogCX0gZWxzZSB7CiAJCS8qIHJlYWQgcmVxdWVzdCAqLwotCQlpZiAoY2hlY2tfc2VjdG9yKGNvbmYsIGJpby0+Ymlfc2VjdG9yLCBiaW9fZW5kX3NlY3RvcihiaW8pLCBSRUFEKSkKKwkJaWYgKGNoZWNrX3NlY3Rvcihjb25mLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkJCSBiaW9fZW5kX3NlY3RvcihiaW8pLCBSRUFEKSkKIAkJCWZhaWxpdCA9IDE7CiAJCWlmIChjaGVja19tb2RlKGNvbmYsIFJlYWRUcmFuc2llbnQpKQogCQkJZmFpbGl0ID0gMTsKIAkJaWYgKGNoZWNrX21vZGUoY29uZiwgUmVhZFBlcnNpc3RlbnQpKSB7Ci0JCQlhZGRfc2VjdG9yKGNvbmYsIGJpby0+Ymlfc2VjdG9yLCBSZWFkUGVyc2lzdGVudCk7CisJCQlhZGRfc2VjdG9yKGNvbmYsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkJICAgUmVhZFBlcnNpc3RlbnQpOwogCQkJZmFpbGl0ID0gMTsKIAkJfQogCQlpZiAoY2hlY2tfbW9kZShjb25mLCBSZWFkRml4YWJsZSkpIHsKLQkJCWFkZF9zZWN0b3IoY29uZiwgYmlvLT5iaV9zZWN0b3IsIFJlYWRGaXhhYmxlKTsKKwkJCWFkZF9zZWN0b3IoY29uZiwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQkgICBSZWFkRml4YWJsZSk7CiAJCQlmYWlsaXQgPSAxOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggZjAzZmFiZC4uNTZmNTM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0yODgsNjUgKzI4OCw2NSBAQAogCiBzdGF0aWMgdm9pZCBsaW5lYXJfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJc3RydWN0IGRldl9pbmZvICp0bXBfZGV2OwotCXNlY3Rvcl90IHN0YXJ0X3NlY3RvcjsKKwlzdHJ1Y3QgYmlvICpzcGxpdDsKKwlzZWN0b3JfdCBzdGFydF9zZWN0b3IsIGVuZF9zZWN0b3IsIGRhdGFfb2Zmc2V0OwogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7CiAJCXJldHVybjsKIAl9CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JdG1wX2RldiA9IHdoaWNoX2RldihtZGRldiwgYmlvLT5iaV9zZWN0b3IpOwotCXN0YXJ0X3NlY3RvciA9IHRtcF9kZXYtPmVuZF9zZWN0b3IgLSB0bXBfZGV2LT5yZGV2LT5zZWN0b3JzOworCWRvIHsKKwkJcmN1X3JlYWRfbG9jaygpOwogCi0KLQlpZiAodW5saWtlbHkoYmlvLT5iaV9zZWN0b3IgPj0gKHRtcF9kZXYtPmVuZF9zZWN0b3IpCi0JCSAgICAgfHwgKGJpby0+Ymlfc2VjdG9yIDwgc3RhcnRfc2VjdG9yKSkpIHsKLQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwotCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIm1kL2xpbmVhcjolczogbWFrZV9yZXF1ZXN0OiBTZWN0b3IgJWxsdSBvdXQgb2YgYm91bmRzIG9uICIKLQkJICAgICAgICJkZXYgJXM6ICVsbHUgc2VjdG9ycywgb2Zmc2V0ICVsbHVcbiIsCi0JCSAgICAgICBtZG5hbWUobWRkZXYpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwKLQkJICAgICAgIGJkZXZuYW1lKHRtcF9kZXYtPnJkZXYtPmJkZXYsIGIpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBfZGV2LT5yZGV2LT5zZWN0b3JzLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF9zZWN0b3IpOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHVubGlrZWx5KGJpb19lbmRfc2VjdG9yKGJpbykgPiB0bXBfZGV2LT5lbmRfc2VjdG9yKSkgewotCQkvKiBUaGlzIGJpbyBjcm9zc2VzIGEgZGV2aWNlIGJvdW5kYXJ5LCBzbyB3ZSBoYXZlIHRvCi0JCSAqIHNwbGl0IGl0LgotCQkgKi8KLQkJc3RydWN0IGJpb19wYWlyICpicDsKLQkJc2VjdG9yX3QgZW5kX3NlY3RvciA9IHRtcF9kZXYtPmVuZF9zZWN0b3I7CisJCXRtcF9kZXYgPSB3aGljaF9kZXYobWRkZXYsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOworCQlzdGFydF9zZWN0b3IgPSB0bXBfZGV2LT5lbmRfc2VjdG9yIC0gdG1wX2Rldi0+cmRldi0+c2VjdG9yczsKKwkJZW5kX3NlY3RvciA9IHRtcF9kZXYtPmVuZF9zZWN0b3I7CisJCWRhdGFfb2Zmc2V0ID0gdG1wX2Rldi0+cmRldi0+ZGF0YV9vZmZzZXQ7CisJCWJpby0+YmlfYmRldiA9IHRtcF9kZXYtPnJkZXYtPmJkZXY7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBlbmRfc2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IpOworCQlpZiAodW5saWtlbHkoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA+PSBlbmRfc2VjdG9yIHx8CisJCQkgICAgIGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPCBzdGFydF9zZWN0b3IpKQorCQkJZ290byBvdXRfb2ZfYm91bmRzOwogCi0JCWxpbmVhcl9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMSk7Ci0JCWxpbmVhcl9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7Ci0JCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQlyZXR1cm47Ci0JfQotCQkgICAgCi0JYmlvLT5iaV9iZGV2ID0gdG1wX2Rldi0+cmRldi0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yIC0gc3RhcnRfc2VjdG9yCi0JCSsgdG1wX2Rldi0+cmRldi0+ZGF0YV9vZmZzZXQ7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJCWlmICh1bmxpa2VseShiaW9fZW5kX3NlY3RvcihiaW8pID4gZW5kX3NlY3RvcikpIHsKKwkJCS8qIFRoaXMgYmlvIGNyb3NzZXMgYSBkZXZpY2UgYm91bmRhcnksIHNvIHdlIGhhdmUgdG8KKwkJCSAqIHNwbGl0IGl0LgorCQkJICovCisJCQlzcGxpdCA9IGJpb19zcGxpdChiaW8sIGVuZF9zZWN0b3IgLQorCQkJCQkgIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkJCSAgR0ZQX05PSU8sIGZzX2Jpb19zZXQpOworCQkJYmlvX2NoYWluKHNwbGl0LCBiaW8pOworCQl9IGVsc2UgeworCQkJc3BsaXQgPSBiaW87CisJCX0KIAotCWlmICh1bmxpa2VseSgoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSAmJgotCQkgICAgICFibGtfcXVldWVfZGlzY2FyZChiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpKSkpIHsKLQkJLyogSnVzdCBpZ25vcmUgaXQgKi8KLQkJYmlvX2VuZGlvKGJpbywgMCk7Ci0JCXJldHVybjsKLQl9CisJCXNwbGl0LT5iaV9pdGVyLmJpX3NlY3RvciA9IHNwbGl0LT5iaV9pdGVyLmJpX3NlY3RvciAtCisJCQlzdGFydF9zZWN0b3IgKyBkYXRhX29mZnNldDsKIAotCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CisJCWlmICh1bmxpa2VseSgoc3BsaXQtPmJpX3J3ICYgUkVRX0RJU0NBUkQpICYmCisJCQkgIWJsa19xdWV1ZV9kaXNjYXJkKGJkZXZfZ2V0X3F1ZXVlKHNwbGl0LT5iaV9iZGV2KSkpKSB7CisJCQkvKiBKdXN0IGlnbm9yZSBpdCAqLworCQkJYmlvX2VuZGlvKHNwbGl0LCAwKTsKKwkJfSBlbHNlCisJCQlnZW5lcmljX21ha2VfcmVxdWVzdChzcGxpdCk7CisJfSB3aGlsZSAoc3BsaXQgIT0gYmlvKTsKKwlyZXR1cm47CisKK291dF9vZl9ib3VuZHM6CisJcHJpbnRrKEtFUk5fRVJSCisJICAgICAgICJtZC9saW5lYXI6JXM6IG1ha2VfcmVxdWVzdDogU2VjdG9yICVsbHUgb3V0IG9mIGJvdW5kcyBvbiAiCisJICAgICAgICJkZXYgJXM6ICVsbHUgc2VjdG9ycywgb2Zmc2V0ICVsbHVcbiIsCisJICAgICAgIG1kbmFtZShtZGRldiksCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkgICAgICAgYmRldm5hbWUodG1wX2Rldi0+cmRldi0+YmRldiwgYiksCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdG1wX2Rldi0+cmRldi0+c2VjdG9ycywKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF9zZWN0b3IpOworCWJpb19pb19lcnJvcihiaW8pOwogfQogCiBzdGF0aWMgdm9pZCBsaW5lYXJfc3RhdHVzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG1kZGV2ICptZGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA0MGM1MzEzLi40YWQ1Y2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAlzdHJ1Y3QgbWRkZXYgKm1kZGV2ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgbWRkZXYsIGZsdXNoX3dvcmspOwogCXN0cnVjdCBiaW8gKmJpbyA9IG1kZGV2LT5mbHVzaF9iaW87CiAKLQlpZiAoYmlvLT5iaV9zaXplID09IDApCisJaWYgKGJpby0+YmlfaXRlci5iaV9zaXplID09IDApCiAJCS8qIGFuIGVtcHR5IGJhcnJpZXIgLSBhbGwgZG9uZSAqLwogCQliaW9fZW5kaW8oYmlvLCAwKTsKIAllbHNlIHsKQEAgLTc1NCw3ICs3NTQsNyBAQAogCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19tZGRldihHRlBfTk9JTywgMSwgbWRkZXYpOwogCiAJYmlvLT5iaV9iZGV2ID0gcmRldi0+bWV0YV9iZGV2ID8gcmRldi0+bWV0YV9iZGV2IDogcmRldi0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIHNpemUsIDApOwogCWJpby0+YmlfcHJpdmF0ZSA9IHJkZXY7CiAJYmlvLT5iaV9lbmRfaW8gPSBzdXBlcl93cml0dGVuOwpAQCAtNzgyLDE4ICs3ODIsMTYgQEAKIAlzdHJ1Y3QgYmlvICpiaW8gPSBiaW9fYWxsb2NfbWRkZXYoR0ZQX05PSU8sIDEsIHJkZXYtPm1kZGV2KTsKIAlpbnQgcmV0OwogCi0JcncgfD0gUkVRX1NZTkM7Ci0KIAliaW8tPmJpX2JkZXYgPSAobWV0YWRhdGFfb3AgJiYgcmRldi0+bWV0YV9iZGV2KSA/CiAJCXJkZXYtPm1ldGFfYmRldiA6IHJkZXYtPmJkZXY7CiAJaWYgKG1ldGFkYXRhX29wKQotCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciArIHJkZXYtPnNiX3N0YXJ0OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yICsgcmRldi0+c2Jfc3RhcnQ7CiAJZWxzZSBpZiAocmRldi0+bWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gIT0gTWF4U2VjdG9yICYmCiAJCSAocmRldi0+bWRkZXYtPnJlc2hhcGVfYmFja3dhcmRzID09CiAJCSAgKHNlY3RvciA+PSByZGV2LT5tZGRldi0+cmVzaGFwZV9wb3NpdGlvbikpKQotCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciArIHJkZXYtPm5ld19kYXRhX29mZnNldDsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvciArIHJkZXYtPm5ld19kYXRhX29mZnNldDsKIAllbHNlCi0JCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yICsgcmRldi0+ZGF0YV9vZmZzZXQ7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3IgKyByZGV2LT5kYXRhX29mZnNldDsKIAliaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBzaXplLCAwKTsKIAlzdWJtaXRfYmlvX3dhaXQocncsIGJpbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IDE2NDJlYWUuLjg0OWFkMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCW1kX2Vycm9yIChtcF9iaC0+bWRkZXYsIHJkZXYpOwogCQlwcmludGsoS0VSTl9FUlIgIm11bHRpcGF0aDogJXM6IHJlc2NoZWR1bGluZyBzZWN0b3IgJWxsdVxuIiwgCiAJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LGIpLCAKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJbXVsdGlwYXRoX3Jlc2NoZWR1bGVfcmV0cnkobXBfYmgpOwogCX0gZWxzZQogCQltdWx0aXBhdGhfZW5kX2JoX2lvKG1wX2JoLCBlcnJvcik7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAltdWx0aXBhdGggPSBjb25mLT5tdWx0aXBhdGhzICsgbXBfYmgtPnBhdGg7CiAKIAltcF9iaC0+YmlvID0gKmJpbzsKLQltcF9iaC0+YmlvLmJpX3NlY3RvciArPSBtdWx0aXBhdGgtPnJkZXYtPmRhdGFfb2Zmc2V0OworCW1wX2JoLT5iaW8uYmlfaXRlci5iaV9zZWN0b3IgKz0gbXVsdGlwYXRoLT5yZGV2LT5kYXRhX29mZnNldDsKIAltcF9iaC0+YmlvLmJpX2JkZXYgPSBtdWx0aXBhdGgtPnJkZXYtPmJkZXY7CiAJbXBfYmgtPmJpby5iaV9ydyB8PSBSRVFfRkFJTEZBU1RfVFJBTlNQT1JUOwogCW1wX2JoLT5iaW8uYmlfZW5kX2lvID0gbXVsdGlwYXRoX2VuZF9yZXF1ZXN0OwpAQCAtMzU1LDIxICszNTUsMjIgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAogCQliaW8gPSAmbXBfYmgtPmJpbzsKLQkJYmlvLT5iaV9zZWN0b3IgPSBtcF9iaC0+bWFzdGVyX2Jpby0+Ymlfc2VjdG9yOworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gbXBfYmgtPm1hc3Rlcl9iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQkKIAkJaWYgKChtcF9iaC0+cGF0aCA9IG11bHRpcGF0aF9tYXAgKGNvbmYpKTwwKSB7CiAJCQlwcmludGsoS0VSTl9BTEVSVCAibXVsdGlwYXRoOiAlczogdW5yZWNvdmVyYWJsZSBJTyByZWFkIgogCQkJCSIgZXJyb3IgZm9yIGJsb2NrICVsbHVcbiIsCiAJCQkJYmRldm5hbWUoYmlvLT5iaV9iZGV2LGIpLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJCQltdWx0aXBhdGhfZW5kX2JoX2lvKG1wX2JoLCAtRUlPKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX0VSUiAibXVsdGlwYXRoOiAlczogcmVkaXJlY3Rpbmcgc2VjdG9yICVsbHUiCiAJCQkJIiB0byBhbm90aGVyIElPIHBhdGhcbiIsCiAJCQkJYmRldm5hbWUoYmlvLT5iaV9iZGV2LGIpLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJCQkqYmlvID0gKihtcF9iaC0+bWFzdGVyX2Jpbyk7Ci0JCQliaW8tPmJpX3NlY3RvciArPSBjb25mLT5tdWx0aXBhdGhzW21wX2JoLT5wYXRoXS5yZGV2LT5kYXRhX29mZnNldDsKKwkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgKz0KKwkJCQljb25mLT5tdWx0aXBhdGhzW21wX2JoLT5wYXRoXS5yZGV2LT5kYXRhX29mZnNldDsKIAkJCWJpby0+YmlfYmRldiA9IGNvbmYtPm11bHRpcGF0aHNbbXBfYmgtPnBhdGhdLnJkZXYtPmJkZXY7CiAJCQliaW8tPmJpX3J3IHw9IFJFUV9GQUlMRkFTVF9UUkFOU1BPUlQ7CiAJCQliaW8tPmJpX2VuZF9pbyA9IG11bHRpcGF0aF9lbmRfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCBjNGQ0MjBiLi40MDdhOTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC01MDEsMTAgKzUwMSwxMSBAQAogCQkJdW5zaWduZWQgaW50IGNodW5rX3NlY3RzLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaWYgKGxpa2VseShpc19wb3dlcl9vZl8yKGNodW5rX3NlY3RzKSkpIHsKLQkJcmV0dXJuIGNodW5rX3NlY3RzID49ICgoYmlvLT5iaV9zZWN0b3IgJiAoY2h1bmtfc2VjdHMtMSkpCisJCXJldHVybiBjaHVua19zZWN0cyA+PQorCQkJKChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICYgKGNodW5rX3NlY3RzLTEpKQogCQkJCQkrIGJpb19zZWN0b3JzKGJpbykpOwogCX0gZWxzZXsKLQkJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAJCXJldHVybiBjaHVua19zZWN0cyA+PSAoc2VjdG9yX2RpdihzZWN0b3IsIGNodW5rX3NlY3RzKQogCQkJCQkJKyBiaW9fc2VjdG9ycyhiaW8pKTsKIAl9CkBAIC01MTIsNjQgKzUxMyw0NCBAQAogCiBzdGF0aWMgdm9pZCByYWlkMF9tYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQogewotCXVuc2lnbmVkIGludCBjaHVua19zZWN0czsKLQlzZWN0b3JfdCBzZWN0b3Jfb2Zmc2V0OwogCXN0cnVjdCBzdHJpcF96b25lICp6b25lOwogCXN0cnVjdCBtZF9yZGV2ICp0bXBfZGV2OworCXN0cnVjdCBiaW8gKnNwbGl0OwogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7CiAJCXJldHVybjsKIAl9CiAKLQljaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwotCWlmICh1bmxpa2VseSghaXNfaW9faW5fY2h1bmtfYm91bmRhcnkobWRkZXYsIGNodW5rX3NlY3RzLCBiaW8pKSkgewotCQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLQkJc3RydWN0IGJpb19wYWlyICpicDsKLQkJLyogU2FuaXR5IGNoZWNrIC0tIHF1ZXVlIGZ1bmN0aW9ucyBzaG91bGQgcHJldmVudCB0aGlzIGhhcHBlbmluZyAqLwotCQlpZiAoYmlvX3NlZ21lbnRzKGJpbykgPiAxKQotCQkJZ290byBiYWRfbWFwOwotCQkvKiBUaGlzIGlzIGEgb25lIHBhZ2UgYmlvIHRoYXQgdXBwZXIgbGF5ZXJzCi0JCSAqIHJlZnVzZSB0byBzcGxpdCBmb3IgdXMsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQuCi0JCSAqLwotCQlpZiAobGlrZWx5KGlzX3Bvd2VyX29mXzIoY2h1bmtfc2VjdHMpKSkKLQkJCWJwID0gYmlvX3NwbGl0KGJpbywgY2h1bmtfc2VjdHMgLSAoc2VjdG9yICYKLQkJCQkJCQkgICAoY2h1bmtfc2VjdHMtMSkpKTsKLQkJZWxzZQotCQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBjaHVua19zZWN0cyAtCi0JCQkJICAgICAgIHNlY3Rvcl9kaXYoc2VjdG9yLCBjaHVua19zZWN0cykpOwotCQlyYWlkMF9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMSk7Ci0JCXJhaWQwX21ha2VfcmVxdWVzdChtZGRldiwgJmJwLT5iaW8yKTsKLQkJYmlvX3BhaXJfcmVsZWFzZShicCk7Ci0JCXJldHVybjsKLQl9CisJZG8geworCQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOworCQl1bnNpZ25lZCBjaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwogCi0Jc2VjdG9yX29mZnNldCA9IGJpby0+Ymlfc2VjdG9yOwotCXpvbmUgPSBmaW5kX3pvbmUobWRkZXYtPnByaXZhdGUsICZzZWN0b3Jfb2Zmc2V0KTsKLQl0bXBfZGV2ID0gbWFwX3NlY3RvcihtZGRldiwgem9uZSwgYmlvLT5iaV9zZWN0b3IsCi0JCQkgICAgICZzZWN0b3Jfb2Zmc2V0KTsKLQliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yX29mZnNldCArIHpvbmUtPmRldl9zdGFydCArCi0JCXRtcF9kZXYtPmRhdGFfb2Zmc2V0OworCQl1bnNpZ25lZCBzZWN0b3JzID0gY2h1bmtfc2VjdHMgLQorCQkJKGxpa2VseShpc19wb3dlcl9vZl8yKGNodW5rX3NlY3RzKSkKKwkJCSA/IChzZWN0b3IgJiAoY2h1bmtfc2VjdHMtMSkpCisJCQkgOiBzZWN0b3JfZGl2KHNlY3RvciwgY2h1bmtfc2VjdHMpKTsKIAotCWlmICh1bmxpa2VseSgoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSAmJgotCQkgICAgICFibGtfcXVldWVfZGlzY2FyZChiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpKSkpIHsKLQkJLyogSnVzdCBpZ25vcmUgaXQgKi8KLQkJYmlvX2VuZGlvKGJpbywgMCk7Ci0JCXJldHVybjsKLQl9CisJCWlmIChzZWN0b3JzIDwgYmlvX3NlY3RvcnMoYmlvKSkgeworCQkJc3BsaXQgPSBiaW9fc3BsaXQoYmlvLCBzZWN0b3JzLCBHRlBfTk9JTywgZnNfYmlvX3NldCk7CisJCQliaW9fY2hhaW4oc3BsaXQsIGJpbyk7CisJCX0gZWxzZSB7CisJCQlzcGxpdCA9IGJpbzsKKwkJfQogCi0JZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKLQlyZXR1cm47CisJCXpvbmUgPSBmaW5kX3pvbmUobWRkZXYtPnByaXZhdGUsICZzZWN0b3IpOworCQl0bXBfZGV2ID0gbWFwX3NlY3RvcihtZGRldiwgem9uZSwgc2VjdG9yLCAmc2VjdG9yKTsKKwkJc3BsaXQtPmJpX2JkZXYgPSB0bXBfZGV2LT5iZGV2OworCQlzcGxpdC0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3IgKyB6b25lLT5kZXZfc3RhcnQgKworCQkJdG1wX2Rldi0+ZGF0YV9vZmZzZXQ7CiAKLWJhZF9tYXA6Ci0JcHJpbnRrKCJtZC9yYWlkMDolczogbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgotCSAgICAgICAiIG9yIGJpZ2dlciB0aGFuICVkayAlbGx1ICVkXG4iLAotCSAgICAgICBtZG5hbWUobWRkZXYpLCBjaHVua19zZWN0cyAvIDIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpb19zZWN0b3JzKGJpbykgLyAyKTsKLQotCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybjsKKwkJaWYgKHVubGlrZWx5KChzcGxpdC0+YmlfcncgJiBSRVFfRElTQ0FSRCkgJiYKKwkJCSAhYmxrX3F1ZXVlX2Rpc2NhcmQoYmRldl9nZXRfcXVldWUoc3BsaXQtPmJpX2JkZXYpKSkpIHsKKwkJCS8qIEp1c3QgaWdub3JlIGl0ICovCisJCQliaW9fZW5kaW8oc3BsaXQsIDApOworCQl9IGVsc2UKKwkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KHNwbGl0KTsKKwl9IHdoaWxlIChzcGxpdCAhPSBiaW8pOwogfQogCiBzdGF0aWMgdm9pZCByYWlkMF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZGRldiAqbWRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggYTQ5Y2ZjYy4uZmQzYTJhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJaW50IGRvbmU7CiAJc3RydWN0IHIxY29uZiAqY29uZiA9IHIxX2Jpby0+bWRkZXYtPnByaXZhdGU7CiAJc2VjdG9yX3Qgc3RhcnRfbmV4dF93aW5kb3cgPSByMV9iaW8tPnN0YXJ0X25leHRfd2luZG93OwotCXNlY3Rvcl90IGJpX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCXNlY3Rvcl90IGJpX3NlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAlpZiAoYmlvLT5iaV9waHlzX3NlZ21lbnRzKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNjUsOSArMjY1LDggQEAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUjFCSU9fUmV0dXJuZWQsICZyMV9iaW8tPnN0YXRlKSkgewogCQlwcl9kZWJ1ZygicmFpZDE6IHN5bmMgZW5kICVzIG9uIHNlY3RvcnMgJWxsdS0lbGx1XG4iLAogCQkJIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgPyAid3JpdGUiIDogInJlYWQiLAotCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGJpby0+Ymlfc2VjdG9yLAotCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGJpby0+Ymlfc2VjdG9yICsKLQkJCSBiaW9fc2VjdG9ycyhiaW8pIC0gMSk7CisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBiaW9fZW5kX3NlY3RvcihiaW8pIC0gMSk7CiAKIAkJY2FsbF9iaW9fZW5kaW8ocjFfYmlvKTsKIAl9CkBAIC00NjYsOSArNDY1LDggQEAKIAkJCQlzdHJ1Y3QgYmlvICptYmlvID0gcjFfYmlvLT5tYXN0ZXJfYmlvOwogCQkJCXByX2RlYnVnKCJyYWlkMTogYmVoaW5kIGVuZCB3cml0ZSBzZWN0b3JzIgogCQkJCQkgIiAlbGx1LSVsbHVcbiIsCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBtYmlvLT5iaV9zZWN0b3IsCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBtYmlvLT5iaV9zZWN0b3IgKwotCQkJCQkgYmlvX3NlY3RvcnMobWJpbykgLSAxKTsKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIG1iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmlvX2VuZF9zZWN0b3IobWJpbykgLSAxKTsKIAkJCQljYWxsX2Jpb19lbmRpbyhyMV9iaW8pOwogCQkJfQogCQl9CkBAIC04NzUsNyArODczLDcgQEAKIAkJZWxzZSBpZiAoKGNvbmYtPm5leHRfcmVzeW5jIC0gUkVTWU5DX1dJTkRPV19TRUNUT1JTCiAJCQkJPj0gYmlvX2VuZF9zZWN0b3IoYmlvKSkgfHwKIAkJCSAoY29uZi0+bmV4dF9yZXN5bmMgKyBORVhUX05PUk1BTElPX0RJU1RBTkNFCi0JCQkJPD0gYmlvLT5iaV9zZWN0b3IpKQorCQkJCTw9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpKQogCQkJd2FpdCA9IGZhbHNlOwogCQllbHNlCiAJCQl3YWl0ID0gdHJ1ZTsKQEAgLTkxMywxNCArOTExLDE0IEBACiAKIAlpZiAoYmlvICYmIGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSB7CiAJCWlmIChjb25mLT5uZXh0X3Jlc3luYyArIE5FWFRfTk9STUFMSU9fRElTVEFOQ0UKLQkJICAgIDw9IGJpby0+Ymlfc2VjdG9yKSB7CisJCSAgICA8PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSB7CiAJCQlpZiAoY29uZi0+c3RhcnRfbmV4dF93aW5kb3cgPT0gTWF4U2VjdG9yKQogCQkJCWNvbmYtPnN0YXJ0X25leHRfd2luZG93ID0KIAkJCQkJY29uZi0+bmV4dF9yZXN5bmMgKwogCQkJCQlORVhUX05PUk1BTElPX0RJU1RBTkNFOwogCiAJCQlpZiAoKGNvbmYtPnN0YXJ0X25leHRfd2luZG93ICsgTkVYVF9OT1JNQUxJT19ESVNUQU5DRSkKLQkJCSAgICA8PSBiaW8tPmJpX3NlY3RvcikKKwkJCSAgICA8PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKQogCQkJCWNvbmYtPm5leHRfd2luZG93X3JlcXVlc3RzKys7CiAJCQllbHNlCiAJCQkJY29uZi0+Y3VycmVudF93aW5kb3dfcmVxdWVzdHMrKzsKQEAgLTEwMjcsNyArMTAyNSw4IEBACiAJCWlmIChidmVjc1tpXS5idl9wYWdlKQogCQkJcHV0X3BhZ2UoYnZlY3NbaV0uYnZfcGFnZSk7CiAJa2ZyZWUoYnZlY3MpOwotCXByX2RlYnVnKCIlZEIgYmVoaW5kIGFsbG9jIGZhaWxlZCwgZG9pbmcgc3luYyBJL09cbiIsIGJpby0+Ymlfc2l6ZSk7CisJcHJfZGVidWcoIiVkQiBiZWhpbmQgYWxsb2MgZmFpbGVkLCBkb2luZyBzeW5jIEkvT1xuIiwKKwkJIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIH0KIAogc3RydWN0IHJhaWQxX3BsdWdfY2IgewpAQCAtMTEwNyw3ICsxMTA2LDcgQEAKIAogCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSAmJgogCSAgICBiaW9fZW5kX3NlY3RvcihiaW8pID4gbWRkZXYtPnN1c3BlbmRfbG8gJiYKLQkgICAgYmlvLT5iaV9zZWN0b3IgPCBtZGRldi0+c3VzcGVuZF9oaSkgeworCSAgICBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDwgbWRkZXYtPnN1c3BlbmRfaGkpIHsKIAkJLyogQXMgdGhlIHN1c3BlbmRfKiByYW5nZSBpcyBjb250cm9sbGVkIGJ5CiAJCSAqIHVzZXJzcGFjZSwgd2Ugd2FudCBhbiBpbnRlcnJ1cHRpYmxlCiAJCSAqIHdhaXQuCkBAIC0xMTE4LDcgKzExMTcsNyBAQAogCQkJcHJlcGFyZV90b193YWl0KCZjb25mLT53YWl0X2JhcnJpZXIsCiAJCQkJCSZ3LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJaWYgKGJpb19lbmRfc2VjdG9yKGJpbykgPD0gbWRkZXYtPnN1c3BlbmRfbG8gfHwKLQkJCSAgICBiaW8tPmJpX3NlY3RvciA+PSBtZGRldi0+c3VzcGVuZF9oaSkKKwkJCSAgICBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID49IG1kZGV2LT5zdXNwZW5kX2hpKQogCQkJCWJyZWFrOwogCQkJc2NoZWR1bGUoKTsKIAkJfQpAQCAtMTE0MCw3ICsxMTM5LDcgQEAKIAlyMV9iaW8tPnNlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOwogCXIxX2Jpby0+c3RhdGUgPSAwOwogCXIxX2Jpby0+bWRkZXYgPSBtZGRldjsKLQlyMV9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCXIxX2Jpby0+c2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAogCS8qIFdlIG1pZ2h0IG5lZWQgdG8gaXNzdWUgbXVsdGlwbGUgcmVhZHMgdG8gZGlmZmVyZW50CiAJICogZGV2aWNlcyBpZiB0aGVyZSBhcmUgYmFkIGJsb2NrcyBhcm91bmQsIHNvIHdlIGtlZXAKQEAgLTExODAsMTIgKzExNzksMTMgQEAKIAkJcjFfYmlvLT5yZWFkX2Rpc2sgPSByZGlzazsKIAogCQlyZWFkX2JpbyA9IGJpb19jbG9uZV9tZGRldihiaW8sIEdGUF9OT0lPLCBtZGRldik7Ci0JCWJpb190cmltKHJlYWRfYmlvLCByMV9iaW8tPnNlY3RvciAtIGJpby0+Ymlfc2VjdG9yLAorCQliaW9fdHJpbShyZWFkX2JpbywgcjFfYmlvLT5zZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJIG1heF9zZWN0b3JzKTsKIAogCQlyMV9iaW8tPmJpb3NbcmRpc2tdID0gcmVhZF9iaW87CiAKLQkJcmVhZF9iaW8tPmJpX3NlY3RvciA9IHIxX2Jpby0+c2VjdG9yICsgbWlycm9yLT5yZGV2LT5kYXRhX29mZnNldDsKKwkJcmVhZF9iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcjFfYmlvLT5zZWN0b3IgKworCQkJbWlycm9yLT5yZGV2LT5kYXRhX29mZnNldDsKIAkJcmVhZF9iaW8tPmJpX2JkZXYgPSBtaXJyb3ItPnJkZXYtPmJkZXY7CiAJCXJlYWRfYmlvLT5iaV9lbmRfaW8gPSByYWlkMV9lbmRfcmVhZF9yZXF1ZXN0OwogCQlyZWFkX2Jpby0+YmlfcncgPSBSRUFEIHwgZG9fc3luYzsKQEAgLTExOTcsNyArMTE5Nyw3IEBACiAJCQkgKi8KIAogCQkJc2VjdG9yc19oYW5kbGVkID0gKHIxX2Jpby0+c2VjdG9yICsgbWF4X3NlY3RvcnMKLQkJCQkJICAgLSBiaW8tPmJpX3NlY3Rvcik7CisJCQkJCSAgIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJCQlyMV9iaW8tPnNlY3RvcnMgPSBtYXhfc2VjdG9yczsKIAkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCWlmIChiaW8tPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkKQEAgLTEyMTgsNyArMTIxOCw4IEBACiAJCQlyMV9iaW8tPnNlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pIC0gc2VjdG9yc19oYW5kbGVkOwogCQkJcjFfYmlvLT5zdGF0ZSA9IDA7CiAJCQlyMV9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCQlyMV9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yICsgc2VjdG9yc19oYW5kbGVkOworCQkJcjFfYmlvLT5zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICsKKwkJCQlzZWN0b3JzX2hhbmRsZWQ7CiAJCQlnb3RvIHJlYWRfYWdhaW47CiAJCX0gZWxzZQogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QocmVhZF9iaW8pOwpAQCAtMTMyMSw3ICsxMzIyLDcgQEAKIAkJCWlmIChyMV9iaW8tPmJpb3Nbal0pCiAJCQkJcmRldl9kZWNfcGVuZGluZyhjb25mLT5taXJyb3JzW2pdLnJkZXYsIG1kZGV2KTsKIAkJcjFfYmlvLT5zdGF0ZSA9IDA7Ci0JCWFsbG93X2JhcnJpZXIoY29uZiwgc3RhcnRfbmV4dF93aW5kb3csIGJpby0+Ymlfc2VjdG9yKTsKKwkJYWxsb3dfYmFycmllcihjb25mLCBzdGFydF9uZXh0X3dpbmRvdywgYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJCW1kX3dhaXRfZm9yX2Jsb2NrZWRfcmRldihibG9ja2VkX3JkZXYsIG1kZGV2KTsKIAkJc3RhcnRfbmV4dF93aW5kb3cgPSB3YWl0X2JhcnJpZXIoY29uZiwgYmlvKTsKIAkJLyoKQEAgLTEzNDgsNyArMTM0OSw3IEBACiAJCQliaW8tPmJpX3BoeXNfc2VnbWVudHMrKzsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJfQotCXNlY3RvcnNfaGFuZGxlZCA9IHIxX2Jpby0+c2VjdG9yICsgbWF4X3NlY3RvcnMgLSBiaW8tPmJpX3NlY3RvcjsKKwlzZWN0b3JzX2hhbmRsZWQgPSByMV9iaW8tPnNlY3RvciArIG1heF9zZWN0b3JzIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAogCWF0b21pY19zZXQoJnIxX2Jpby0+cmVtYWluaW5nLCAxKTsKIAlhdG9taWNfc2V0KCZyMV9iaW8tPmJlaGluZF9yZW1haW5pbmcsIDApOwpAQCAtMTM2MCw3ICsxMzYxLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCW1iaW8gPSBiaW9fY2xvbmVfbWRkZXYoYmlvLCBHRlBfTk9JTywgbWRkZXYpOwotCQliaW9fdHJpbShtYmlvLCByMV9iaW8tPnNlY3RvciAtIGJpby0+Ymlfc2VjdG9yLCBtYXhfc2VjdG9ycyk7CisJCWJpb190cmltKG1iaW8sIHIxX2Jpby0+c2VjdG9yIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwgbWF4X3NlY3RvcnMpOwogCiAJCWlmIChmaXJzdF9jbG9uZSkgewogCQkJLyogZG8gYmVoaW5kIEkvTyA/CkBAIC0xMzk0LDcgKzEzOTUsNyBAQAogCiAJCXIxX2Jpby0+Ymlvc1tpXSA9IG1iaW87CiAKLQkJbWJpby0+Ymlfc2VjdG9yCT0gKHIxX2Jpby0+c2VjdG9yICsKKwkJbWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSAocjFfYmlvLT5zZWN0b3IgKwogCQkJCSAgIGNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZGF0YV9vZmZzZXQpOwogCQltYmlvLT5iaV9iZGV2ID0gY29uZi0+bWlycm9yc1tpXS5yZGV2LT5iZGV2OwogCQltYmlvLT5iaV9lbmRfaW8JPSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdDsKQEAgLTE0MzQsNyArMTQzNSw3IEBACiAJCXIxX2Jpby0+c2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbykgLSBzZWN0b3JzX2hhbmRsZWQ7CiAJCXIxX2Jpby0+c3RhdGUgPSAwOwogCQlyMV9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCXIxX2Jpby0+c2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgKyBzZWN0b3JzX2hhbmRsZWQ7CisJCXIxX2Jpby0+c2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciArIHNlY3RvcnNfaGFuZGxlZDsKIAkJZ290byByZXRyeV93cml0ZTsKIAl9CiAKQEAgLTE5NTgsMTQgKzE5NTksMTQgQEAKIAkJLyogZml4dXAgdGhlIGJpbyBmb3IgcmV1c2UgKi8KIAkJYmlvX3Jlc2V0KGIpOwogCQliLT5iaV92Y250ID0gdmNudDsKLQkJYi0+Ymlfc2l6ZSA9IHIxX2Jpby0+c2VjdG9ycyA8PCA5OwotCQliLT5iaV9zZWN0b3IgPSByMV9iaW8tPnNlY3RvciArCisJCWItPmJpX2l0ZXIuYmlfc2l6ZSA9IHIxX2Jpby0+c2VjdG9ycyA8PCA5OworCQliLT5iaV9pdGVyLmJpX3NlY3RvciA9IHIxX2Jpby0+c2VjdG9yICsKIAkJCWNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZGF0YV9vZmZzZXQ7CiAJCWItPmJpX2JkZXYgPSBjb25mLT5taXJyb3JzW2ldLnJkZXYtPmJkZXY7CiAJCWItPmJpX2VuZF9pbyA9IGVuZF9zeW5jX3JlYWQ7CiAJCWItPmJpX3ByaXZhdGUgPSByMV9iaW87CiAKLQkJc2l6ZSA9IGItPmJpX3NpemU7CisJCXNpemUgPSBiLT5iaV9pdGVyLmJpX3NpemU7CiAJCWZvciAoaiA9IDA7IGogPCB2Y250IDsgaisrKSB7CiAJCQlzdHJ1Y3QgYmlvX3ZlYyAqYmk7CiAJCQliaSA9ICZiLT5iaV9pb192ZWNbal07CkBAIC0yMjIwLDExICsyMjIxLDExIEBACiAJCX0KIAogCQl3YmlvLT5iaV9ydyA9IFdSSVRFOwotCQl3YmlvLT5iaV9zZWN0b3IgPSByMV9iaW8tPnNlY3RvcjsKLQkJd2Jpby0+Ymlfc2l6ZSA9IHIxX2Jpby0+c2VjdG9ycyA8PCA5OworCQl3YmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHIxX2Jpby0+c2VjdG9yOworCQl3YmlvLT5iaV9pdGVyLmJpX3NpemUgPSByMV9iaW8tPnNlY3RvcnMgPDwgOTsKIAogCQliaW9fdHJpbSh3YmlvLCBzZWN0b3IgLSByMV9iaW8tPnNlY3Rvciwgc2VjdG9ycyk7Ci0JCXdiaW8tPmJpX3NlY3RvciArPSByZGV2LT5kYXRhX29mZnNldDsKKwkJd2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgKz0gcmRldi0+ZGF0YV9vZmZzZXQ7CiAJCXdiaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwogCQlpZiAoc3VibWl0X2Jpb193YWl0KFdSSVRFLCB3YmlvKSA9PSAwKQogCQkJLyogZmFpbHVyZSEgKi8KQEAgLTIzMzgsNyArMjMzOSw4IEBACiAJCX0KIAkJcjFfYmlvLT5yZWFkX2Rpc2sgPSBkaXNrOwogCQliaW8gPSBiaW9fY2xvbmVfbWRkZXYocjFfYmlvLT5tYXN0ZXJfYmlvLCBHRlBfTk9JTywgbWRkZXYpOwotCQliaW9fdHJpbShiaW8sIHIxX2Jpby0+c2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IsIG1heF9zZWN0b3JzKTsKKwkJYmlvX3RyaW0oYmlvLCByMV9iaW8tPnNlY3RvciAtIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkgbWF4X3NlY3RvcnMpOwogCQlyMV9iaW8tPmJpb3NbcjFfYmlvLT5yZWFkX2Rpc2tdID0gYmlvOwogCQlyZGV2ID0gY29uZi0+bWlycm9yc1tkaXNrXS5yZGV2OwogCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIKQEAgLTIzNDcsNyArMjM0OSw3IEBACiAJCQkJICAgbWRuYW1lKG1kZGV2KSwKIAkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXIxX2Jpby0+c2VjdG9yLAogCQkJCSAgIGJkZXZuYW1lKHJkZXYtPmJkZXYsIGIpKTsKLQkJYmlvLT5iaV9zZWN0b3IgPSByMV9iaW8tPnNlY3RvciArIHJkZXYtPmRhdGFfb2Zmc2V0OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcjFfYmlvLT5zZWN0b3IgKyByZGV2LT5kYXRhX29mZnNldDsKIAkJYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJYmlvLT5iaV9lbmRfaW8gPSByYWlkMV9lbmRfcmVhZF9yZXF1ZXN0OwogCQliaW8tPmJpX3J3ID0gUkVBRCB8IGRvX3N5bmM7CkBAIC0yMzU2LDcgKzIzNTgsNyBAQAogCQkJLyogRHJhdCAtIGhhdmUgdG8gc3BsaXQgdGhpcyB1cCBtb3JlICovCiAJCQlzdHJ1Y3QgYmlvICptYmlvID0gcjFfYmlvLT5tYXN0ZXJfYmlvOwogCQkJaW50IHNlY3RvcnNfaGFuZGxlZCA9IChyMV9iaW8tPnNlY3RvciArIG1heF9zZWN0b3JzCi0JCQkJCSAgICAgICAtIG1iaW8tPmJpX3NlY3Rvcik7CisJCQkJCSAgICAgICAtIG1iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJCXIxX2Jpby0+c2VjdG9ycyA9IG1heF9zZWN0b3JzOwogCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQkJaWYgKG1iaW8tPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkKQEAgLTIzNzQsNyArMjM3Niw4IEBACiAJCQlyMV9iaW8tPnN0YXRlID0gMDsKIAkJCXNldF9iaXQoUjFCSU9fUmVhZEVycm9yLCAmcjFfYmlvLT5zdGF0ZSk7CiAJCQlyMV9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCQlyMV9iaW8tPnNlY3RvciA9IG1iaW8tPmJpX3NlY3RvciArIHNlY3RvcnNfaGFuZGxlZDsKKwkJCXIxX2Jpby0+c2VjdG9yID0gbWJpby0+YmlfaXRlci5iaV9zZWN0b3IgKworCQkJCXNlY3RvcnNfaGFuZGxlZDsKIAogCQkJZ290byByZWFkX21vcmU7CiAJCX0gZWxzZQpAQCAtMjU5OCw3ICsyNjAxLDcgQEAKIAkJfQogCQlpZiAoYmlvLT5iaV9lbmRfaW8pIHsKIAkJCWF0b21pY19pbmMoJnJkZXYtPm5yX3BlbmRpbmcpOwotCQkJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3JfbnIgKyByZGV2LT5kYXRhX29mZnNldDsKKwkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3JfbnIgKyByZGV2LT5kYXRhX29mZnNldDsKIAkJCWJpby0+YmlfYmRldiA9IHJkZXYtPmJkZXY7CiAJCQliaW8tPmJpX3ByaXZhdGUgPSByMV9iaW87CiAJCX0KQEAgLTI2OTgsNyArMjcwMSw3IEBACiAJCQkJCQkJY29udGludWU7CiAJCQkJCQkvKiByZW1vdmUgbGFzdCBwYWdlIGZyb20gdGhpcyBiaW8gKi8KIAkJCQkJCWJpby0+YmlfdmNudC0tOwotCQkJCQkJYmlvLT5iaV9zaXplIC09IGxlbjsKKwkJCQkJCWJpby0+YmlfaXRlci5iaV9zaXplIC09IGxlbjsKIAkJCQkJCWJpby0+YmlfZmxhZ3MgJj0gfigxPDwgQklPX1NFR19WQUxJRCk7CiAJCQkJCX0KIAkJCQkJZ290byBiaW9fZnVsbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDhkMzlkNjMuLjMzZmM0MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTE1MiwxNCArMTE1MiwxMiBAQAogCWtmcmVlKHBsdWcpOwogfQogCi1zdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpbykKK3N0YXRpYyB2b2lkIF9fbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcjEwY29uZiAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCXN0cnVjdCByMTBiaW8gKnIxMF9iaW87CiAJc3RydWN0IGJpbyAqcmVhZF9iaW87CiAJaW50IGk7Ci0Jc2VjdG9yX3QgY2h1bmtfbWFzayA9IChjb25mLT5nZW8uY2h1bmtfbWFzayAmIGNvbmYtPnByZXYuY2h1bmtfbWFzayk7Ci0JaW50IGNodW5rX3NlY3RzID0gY2h1bmtfbWFzayArIDE7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBkb19zeW5jID0gKGJpby0+YmlfcncgJiBSRVFfU1lOQyk7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBkb19mdWEgPSAoYmlvLT5iaV9ydyAmIFJFUV9GVUEpOwpAQCAtMTE3NCw4OCArMTE3MiwyNyBAQAogCWludCBtYXhfc2VjdG9yczsKIAlpbnQgc2VjdG9yczsKIAotCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKSkgewotCQltZF9mbHVzaF9yZXF1ZXN0KG1kZGV2LCBiaW8pOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgdGhpcyByZXF1ZXN0IGNyb3NzZXMgYSBjaHVuayBib3VuZGFyeSwgd2UgbmVlZCB0bwotCSAqIHNwbGl0IGl0LiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGZvciAxIFBBR0UgKG9yIGxlc3MpIHJlcXVlc3RzLgotCSAqLwotCWlmICh1bmxpa2VseSgoYmlvLT5iaV9zZWN0b3IgJiBjaHVua19tYXNrKSArIGJpb19zZWN0b3JzKGJpbykKLQkJICAgICA+IGNodW5rX3NlY3RzCi0JCSAgICAgJiYgKGNvbmYtPmdlby5uZWFyX2NvcGllcyA8IGNvbmYtPmdlby5yYWlkX2Rpc2tzCi0JCQkgfHwgY29uZi0+cHJldi5uZWFyX2NvcGllcyA8IGNvbmYtPnByZXYucmFpZF9kaXNrcykpKSB7Ci0JCXN0cnVjdCBiaW9fcGFpciAqYnA7Ci0JCS8qIFNhbml0eSBjaGVjayAtLSBxdWV1ZSBmdW5jdGlvbnMgc2hvdWxkIHByZXZlbnQgdGhpcyBoYXBwZW5pbmcgKi8KLQkJaWYgKGJpb19zZWdtZW50cyhiaW8pID4gMSkKLQkJCWdvdG8gYmFkX21hcDsKLQkJLyogVGhpcyBpcyBhIG9uZSBwYWdlIGJpbyB0aGF0IHVwcGVyIGxheWVycwotCQkgKiByZWZ1c2UgdG8gc3BsaXQgZm9yIHVzLCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0LgotCQkgKi8KLQkJYnAgPSBiaW9fc3BsaXQoYmlvLAotCQkJICAgICAgIGNodW5rX3NlY3RzIC0gKGJpby0+Ymlfc2VjdG9yICYgKGNodW5rX3NlY3RzIC0gMSkpICk7Ci0KLQkJLyogRWFjaCBvZiB0aGVzZSAnbWFrZV9yZXF1ZXN0JyBjYWxscyB3aWxsIGNhbGwgJ3dhaXRfYmFycmllcicuCi0JCSAqIElmIHRoZSBmaXJzdCBzdWNjZWVkcyBidXQgdGhlIHNlY29uZCBibG9ja3MgZHVlIHRvIHRoZSByZXN5bmMKLQkJICogdGhyZWFkIHJhaXNpbmcgdGhlIGJhcnJpZXIsIHdlIHdpbGwgZGVhZGxvY2sgYmVjYXVzZSB0aGUKLQkJICogSU8gdG8gdGhlIHVuZGVybHlpbmcgZGV2aWNlIHdpbGwgYmUgcXVldWVkIGluIGdlbmVyaWNfbWFrZV9yZXF1ZXN0Ci0JCSAqIGFuZCB3aWxsIG5ldmVyIGNvbXBsZXRlLCBzbyB3aWxsIG5ldmVyIHJlZHVjZSBucl9wZW5kaW5nLgotCQkgKiBTbyBpbmNyZW1lbnQgbnJfd2FpdGluZyBoZXJlIHNvIG5vIG5ldyByYWlzZV9iYXJyaWVycyB3aWxsCi0JCSAqIHN1Y2NlZWQsIGFuZCBzbyB0aGUgc2Vjb25kIHdhaXRfYmFycmllciBjYW5ub3QgYmxvY2suCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7Ci0JCWNvbmYtPm5yX3dhaXRpbmcrKzsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7Ci0KLQkJbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOwotCQltYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7Ci0KLQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwotCQljb25mLT5ucl93YWl0aW5nLS07Ci0JCXdha2VfdXAoJmNvbmYtPndhaXRfYmFycmllcik7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwotCi0JCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQlyZXR1cm47Ci0JYmFkX21hcDoKLQkJcHJpbnRrKCJtZC9yYWlkMTA6JXM6IG1ha2VfcmVxdWVzdCBidWc6IGNhbid0IGNvbnZlcnQgYmxvY2sgYWNyb3NzIGNodW5rcyIKLQkJICAgICAgICIgb3IgYmlnZ2VyIHRoYW4gJWRrICVsbHUgJWRcbiIsIG1kbmFtZShtZGRldiksIGNodW5rX3NlY3RzLzIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBiaW9fc2VjdG9ycyhiaW8pIC8gMik7Ci0KLQkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltZF93cml0ZV9zdGFydChtZGRldiwgYmlvKTsKLQotCS8qCi0JICogUmVnaXN0ZXIgdGhlIG5ldyByZXF1ZXN0IGFuZCB3YWl0IGlmIHRoZSByZWNvbnN0cnVjdGlvbgotCSAqIHRocmVhZCBoYXMgcHV0IHVwIGEgYmFyIGZvciBuZXcgcmVxdWVzdHMuCi0JICogQ29udGludWUgaW1tZWRpYXRlbHkgaWYgbm8gcmVzeW5jIGlzIGFjdGl2ZSBjdXJyZW50bHkuCi0JICovCi0Jd2FpdF9iYXJyaWVyKGNvbmYpOwotCiAJc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7CiAJd2hpbGUgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpICYmCi0JICAgIGJpby0+Ymlfc2VjdG9yIDwgY29uZi0+cmVzaGFwZV9wcm9ncmVzcyAmJgotCSAgICBiaW8tPmJpX3NlY3RvciArIHNlY3RvcnMgPiBjb25mLT5yZXNoYXBlX3Byb2dyZXNzKSB7CisJICAgIGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPCBjb25mLT5yZXNoYXBlX3Byb2dyZXNzICYmCisJICAgIGJpby0+YmlfaXRlci5iaV9zZWN0b3IgKyBzZWN0b3JzID4gY29uZi0+cmVzaGFwZV9wcm9ncmVzcykgewogCQkvKiBJTyBzcGFucyB0aGUgcmVzaGFwZSBwb3NpdGlvbi4gIE5lZWQgdG8gd2FpdCBmb3IKIAkJICogcmVzaGFwZSB0byBwYXNzCiAJCSAqLwogCQlhbGxvd19iYXJyaWVyKGNvbmYpOwogCQl3YWl0X2V2ZW50KGNvbmYtPndhaXRfYmFycmllciwKLQkJCSAgIGNvbmYtPnJlc2hhcGVfcHJvZ3Jlc3MgPD0gYmlvLT5iaV9zZWN0b3IgfHwKLQkJCSAgIGNvbmYtPnJlc2hhcGVfcHJvZ3Jlc3MgPj0gYmlvLT5iaV9zZWN0b3IgKyBzZWN0b3JzKTsKKwkJCSAgIGNvbmYtPnJlc2hhcGVfcHJvZ3Jlc3MgPD0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciB8fAorCQkJICAgY29uZi0+cmVzaGFwZV9wcm9ncmVzcyA+PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICsKKwkJCSAgIHNlY3RvcnMpOwogCQl3YWl0X2JhcnJpZXIoY29uZik7CiAJfQogCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVNIQVBFLCAmbWRkZXYtPnJlY292ZXJ5KSAmJgogCSAgICBiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSAmJgogCSAgICAobWRkZXYtPnJlc2hhcGVfYmFja3dhcmRzCi0JICAgICA/IChiaW8tPmJpX3NlY3RvciA8IGNvbmYtPnJlc2hhcGVfc2FmZSAmJgotCQliaW8tPmJpX3NlY3RvciArIHNlY3RvcnMgPiBjb25mLT5yZXNoYXBlX3Byb2dyZXNzKQotCSAgICAgOiAoYmlvLT5iaV9zZWN0b3IgKyBzZWN0b3JzID4gY29uZi0+cmVzaGFwZV9zYWZlICYmCi0JCWJpby0+Ymlfc2VjdG9yIDwgY29uZi0+cmVzaGFwZV9wcm9ncmVzcykpKSB7CisJICAgICA/IChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDwgY29uZi0+cmVzaGFwZV9zYWZlICYmCisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgKyBzZWN0b3JzID4gY29uZi0+cmVzaGFwZV9wcm9ncmVzcykKKwkgICAgIDogKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgKyBzZWN0b3JzID4gY29uZi0+cmVzaGFwZV9zYWZlICYmCisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPCBjb25mLT5yZXNoYXBlX3Byb2dyZXNzKSkpIHsKIAkJLyogTmVlZCB0byB1cGRhdGUgcmVzaGFwZV9wb3NpdGlvbiBpbiBtZXRhZGF0YSAqLwogCQltZGRldi0+cmVzaGFwZV9wb3NpdGlvbiA9IGNvbmYtPnJlc2hhcGVfcHJvZ3Jlc3M7CiAJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwpAQCAtMTI3Myw3ICsxMjEwLDcgQEAKIAlyMTBfYmlvLT5zZWN0b3JzID0gc2VjdG9yczsKIAogCXIxMF9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JcjEwX2Jpby0+c2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJcjEwX2Jpby0+c2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAlyMTBfYmlvLT5zdGF0ZSA9IDA7CiAKIAkvKiBXZSBtaWdodCBuZWVkIHRvIGlzc3VlIG11bHRpcGxlIHJlYWRzIHRvIGRpZmZlcmVudApAQCAtMTMwMiwxMyArMTIzOSwxMyBAQAogCQlzbG90ID0gcjEwX2Jpby0+cmVhZF9zbG90OwogCiAJCXJlYWRfYmlvID0gYmlvX2Nsb25lX21kZGV2KGJpbywgR0ZQX05PSU8sIG1kZGV2KTsKLQkJYmlvX3RyaW0ocmVhZF9iaW8sIHIxMF9iaW8tPnNlY3RvciAtIGJpby0+Ymlfc2VjdG9yLAorCQliaW9fdHJpbShyZWFkX2JpbywgcjEwX2Jpby0+c2VjdG9yIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKIAkJCSBtYXhfc2VjdG9ycyk7CiAKIAkJcjEwX2Jpby0+ZGV2c1tzbG90XS5iaW8gPSByZWFkX2JpbzsKIAkJcjEwX2Jpby0+ZGV2c1tzbG90XS5yZGV2ID0gcmRldjsKIAotCQlyZWFkX2Jpby0+Ymlfc2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tzbG90XS5hZGRyICsKKwkJcmVhZF9iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tzbG90XS5hZGRyICsKIAkJCWNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLCByZGV2KTsKIAkJcmVhZF9iaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwogCQlyZWFkX2Jpby0+YmlfZW5kX2lvID0gcmFpZDEwX2VuZF9yZWFkX3JlcXVlc3Q7CkBAIC0xMzIwLDcgKzEyNTcsNyBAQAogCQkJICogbmVlZCBhbm90aGVyIHIxMF9iaW8uCiAJCQkgKi8KIAkJCXNlY3RvcnNfaGFuZGxlZCA9IChyMTBfYmlvLT5zZWN0b3IgKyBtYXhfc2VjdG9ycwotCQkJCQkgICAtIGJpby0+Ymlfc2VjdG9yKTsKKwkJCQkJICAgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJCXIxMF9iaW8tPnNlY3RvcnMgPSBtYXhfc2VjdG9yczsKIAkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCWlmIChiaW8tPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkKQEAgLTEzNDEsNyArMTI3OCw4IEBACiAJCQlyMTBfYmlvLT5zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKSAtIHNlY3RvcnNfaGFuZGxlZDsKIAkJCXIxMF9iaW8tPnN0YXRlID0gMDsKIAkJCXIxMF9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCQlyMTBfYmlvLT5zZWN0b3IgPSBiaW8tPmJpX3NlY3RvciArIHNlY3RvcnNfaGFuZGxlZDsKKwkJCXIxMF9iaW8tPnNlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IgKworCQkJCXNlY3RvcnNfaGFuZGxlZDsKIAkJCWdvdG8gcmVhZF9hZ2FpbjsKIAkJfSBlbHNlCiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChyZWFkX2Jpbyk7CkBAIC0xNDk5LDcgKzE0MzcsOCBAQAogCQkJYmlvLT5iaV9waHlzX3NlZ21lbnRzKys7CiAJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCX0KLQlzZWN0b3JzX2hhbmRsZWQgPSByMTBfYmlvLT5zZWN0b3IgKyBtYXhfc2VjdG9ycyAtIGJpby0+Ymlfc2VjdG9yOworCXNlY3RvcnNfaGFuZGxlZCA9IHIxMF9iaW8tPnNlY3RvciArIG1heF9zZWN0b3JzIC0KKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAogCWF0b21pY19zZXQoJnIxMF9iaW8tPnJlbWFpbmluZywgMSk7CiAJYml0bWFwX3N0YXJ0d3JpdGUobWRkZXYtPmJpdG1hcCwgcjEwX2Jpby0+c2VjdG9yLCByMTBfYmlvLT5zZWN0b3JzLCAwKTsKQEAgLTE1MTAsMTEgKzE0NDksMTEgQEAKIAkJaWYgKHIxMF9iaW8tPmRldnNbaV0uYmlvKSB7CiAJCQlzdHJ1Y3QgbWRfcmRldiAqcmRldiA9IGNvbmYtPm1pcnJvcnNbZF0ucmRldjsKIAkJCW1iaW8gPSBiaW9fY2xvbmVfbWRkZXYoYmlvLCBHRlBfTk9JTywgbWRkZXYpOwotCQkJYmlvX3RyaW0obWJpbywgcjEwX2Jpby0+c2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IsCisJCQliaW9fdHJpbShtYmlvLCByMTBfYmlvLT5zZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAogCQkJCSBtYXhfc2VjdG9ycyk7CiAJCQlyMTBfYmlvLT5kZXZzW2ldLmJpbyA9IG1iaW87CiAKLQkJCW1iaW8tPmJpX3NlY3Rvcgk9IChyMTBfYmlvLT5kZXZzW2ldLmFkZHIrCisJCQltYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcgk9IChyMTBfYmlvLT5kZXZzW2ldLmFkZHIrCiAJCQkJCSAgIGNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLAogCQkJCQkJCSAgICAgIHJkZXYpKTsKIAkJCW1iaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwpAQCAtMTU1MywxMSArMTQ5MiwxMSBAQAogCQkJCXJkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXY7CiAJCQl9CiAJCQltYmlvID0gYmlvX2Nsb25lX21kZGV2KGJpbywgR0ZQX05PSU8sIG1kZGV2KTsKLQkJCWJpb190cmltKG1iaW8sIHIxMF9iaW8tPnNlY3RvciAtIGJpby0+Ymlfc2VjdG9yLAorCQkJYmlvX3RyaW0obWJpbywgcjEwX2Jpby0+c2VjdG9yIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKIAkJCQkgbWF4X3NlY3RvcnMpOwogCQkJcjEwX2Jpby0+ZGV2c1tpXS5yZXBsX2JpbyA9IG1iaW87CiAKLQkJCW1iaW8tPmJpX3NlY3Rvcgk9IChyMTBfYmlvLT5kZXZzW2ldLmFkZHIgKworCQkJbWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSAocjEwX2Jpby0+ZGV2c1tpXS5hZGRyICsKIAkJCQkJICAgY2hvb3NlX2RhdGFfb2Zmc2V0KAogCQkJCQkJICAgcjEwX2JpbywgcmRldikpOwogCQkJbWJpby0+YmlfYmRldiA9IHJkZXYtPmJkZXY7CkBAIC0xNTkxLDExICsxNTMwLDU3IEBACiAJCXIxMF9iaW8tPnNlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pIC0gc2VjdG9yc19oYW5kbGVkOwogCiAJCXIxMF9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCXIxMF9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yICsgc2VjdG9yc19oYW5kbGVkOworCQlyMTBfYmlvLT5zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICsgc2VjdG9yc19oYW5kbGVkOwogCQlyMTBfYmlvLT5zdGF0ZSA9IDA7CiAJCWdvdG8gcmV0cnlfd3JpdGU7CiAJfQogCW9uZV93cml0ZV9kb25lKHIxMF9iaW8pOworfQorCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCByMTBjb25mICpjb25mID0gbWRkZXYtPnByaXZhdGU7CisJc2VjdG9yX3QgY2h1bmtfbWFzayA9IChjb25mLT5nZW8uY2h1bmtfbWFzayAmIGNvbmYtPnByZXYuY2h1bmtfbWFzayk7CisJaW50IGNodW5rX3NlY3RzID0gY2h1bmtfbWFzayArIDE7CisKKwlzdHJ1Y3QgYmlvICpzcGxpdDsKKworCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKSkgeworCQltZF9mbHVzaF9yZXF1ZXN0KG1kZGV2LCBiaW8pOworCQlyZXR1cm47CisJfQorCisJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWVzdCBhbmQgd2FpdCBpZiB0aGUgcmVjb25zdHJ1Y3Rpb24KKwkgKiB0aHJlYWQgaGFzIHB1dCB1cCBhIGJhciBmb3IgbmV3IHJlcXVlc3RzLgorCSAqIENvbnRpbnVlIGltbWVkaWF0ZWx5IGlmIG5vIHJlc3luYyBpcyBhY3RpdmUgY3VycmVudGx5LgorCSAqLworCXdhaXRfYmFycmllcihjb25mKTsKKworCWRvIHsKKworCQkvKgorCQkgKiBJZiB0aGlzIHJlcXVlc3QgY3Jvc3NlcyBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBuZWVkIHRvIHNwbGl0CisJCSAqIGl0LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICYgY2h1bmtfbWFzaykgKworCQkJICAgICBiaW9fc2VjdG9ycyhiaW8pID4gY2h1bmtfc2VjdHMKKwkJCSAgICAgJiYgKGNvbmYtPmdlby5uZWFyX2NvcGllcyA8IGNvbmYtPmdlby5yYWlkX2Rpc2tzCisJCQkJIHx8IGNvbmYtPnByZXYubmVhcl9jb3BpZXMgPAorCQkJCSBjb25mLT5wcmV2LnJhaWRfZGlza3MpKSkgeworCQkJc3BsaXQgPSBiaW9fc3BsaXQoYmlvLCBjaHVua19zZWN0cyAtCisJCQkJCSAgKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgJgorCQkJCQkgICAoY2h1bmtfc2VjdHMgLSAxKSksCisJCQkJCSAgR0ZQX05PSU8sIGZzX2Jpb19zZXQpOworCQkJYmlvX2NoYWluKHNwbGl0LCBiaW8pOworCQl9IGVsc2UgeworCQkJc3BsaXQgPSBiaW87CisJCX0KKworCQlfX21ha2VfcmVxdWVzdChtZGRldiwgc3BsaXQpOworCX0gd2hpbGUgKHNwbGl0ICE9IGJpbyk7CiAKIAkvKiBJbiBjYXNlIHJhaWQxMGQgc251Y2sgaW4gdG8gZnJlZXplX2FycmF5ICovCiAJd2FrZV91cCgmY29uZi0+d2FpdF9iYXJyaWVyKTsKQEAgLTIxMjQsMTAgKzIxMDksMTAgQEAKIAkJYmlvX3Jlc2V0KHRiaW8pOwogCiAJCXRiaW8tPmJpX3ZjbnQgPSB2Y250OwotCQl0YmlvLT5iaV9zaXplID0gcjEwX2Jpby0+c2VjdG9ycyA8PCA5OworCQl0YmlvLT5iaV9pdGVyLmJpX3NpemUgPSByMTBfYmlvLT5zZWN0b3JzIDw8IDk7CiAJCXRiaW8tPmJpX3J3ID0gV1JJVEU7CiAJCXRiaW8tPmJpX3ByaXZhdGUgPSByMTBfYmlvOwotCQl0YmlvLT5iaV9zZWN0b3IgPSByMTBfYmlvLT5kZXZzW2ldLmFkZHI7CisJCXRiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tpXS5hZGRyOwogCiAJCWZvciAoaj0wOyBqIDwgdmNudCA7IGorKykgewogCQkJdGJpby0+YmlfaW9fdmVjW2pdLmJ2X29mZnNldCA9IDA7CkBAIC0yMTQ0LDcgKzIxMjksNyBAQAogCQlhdG9taWNfaW5jKCZyMTBfYmlvLT5yZW1haW5pbmcpOwogCQltZF9zeW5jX2FjY3QoY29uZi0+bWlycm9yc1tkXS5yZGV2LT5iZGV2LCBiaW9fc2VjdG9ycyh0YmlvKSk7CiAKLQkJdGJpby0+Ymlfc2VjdG9yICs9IGNvbmYtPm1pcnJvcnNbZF0ucmRldi0+ZGF0YV9vZmZzZXQ7CisJCXRiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICs9IGNvbmYtPm1pcnJvcnNbZF0ucmRldi0+ZGF0YV9vZmZzZXQ7CiAJCXRiaW8tPmJpX2JkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXYtPmJkZXY7CiAJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KHRiaW8pOwogCX0KQEAgLTI2MTQsOCArMjU5OSw4IEBACiAJCQlzZWN0b3JzID0gc2VjdF90b193cml0ZTsKIAkJLyogV3JpdGUgYXQgJ3NlY3RvcicgZm9yICdzZWN0b3JzJyAqLwogCQl3YmlvID0gYmlvX2Nsb25lX21kZGV2KGJpbywgR0ZQX05PSU8sIG1kZGV2KTsKLQkJYmlvX3RyaW0od2Jpbywgc2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IsIHNlY3RvcnMpOwotCQl3YmlvLT5iaV9zZWN0b3IgPSAocjEwX2Jpby0+ZGV2c1tpXS5hZGRyKworCQliaW9fdHJpbSh3YmlvLCBzZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBzZWN0b3JzKTsKKwkJd2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgPSAocjEwX2Jpby0+ZGV2c1tpXS5hZGRyKwogCQkJCSAgIGNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLCByZGV2KSArCiAJCQkJICAgKHNlY3RvciAtIHIxMF9iaW8tPnNlY3RvcikpOwogCQl3YmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKQEAgLTI2ODcsMTAgKzI2NzIsMTAgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylyMTBfYmlvLT5zZWN0b3IpOwogCWJpbyA9IGJpb19jbG9uZV9tZGRldihyMTBfYmlvLT5tYXN0ZXJfYmlvLAogCQkJICAgICAgR0ZQX05PSU8sIG1kZGV2KTsKLQliaW9fdHJpbShiaW8sIHIxMF9iaW8tPnNlY3RvciAtIGJpby0+Ymlfc2VjdG9yLCBtYXhfc2VjdG9ycyk7CisJYmlvX3RyaW0oYmlvLCByMTBfYmlvLT5zZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBtYXhfc2VjdG9ycyk7CiAJcjEwX2Jpby0+ZGV2c1tzbG90XS5iaW8gPSBiaW87CiAJcjEwX2Jpby0+ZGV2c1tzbG90XS5yZGV2ID0gcmRldjsKLQliaW8tPmJpX3NlY3RvciA9IHIxMF9iaW8tPmRldnNbc2xvdF0uYWRkcgorCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSByMTBfYmlvLT5kZXZzW3Nsb3RdLmFkZHIKIAkJKyBjaG9vc2VfZGF0YV9vZmZzZXQocjEwX2JpbywgcmRldik7CiAJYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAliaW8tPmJpX3J3ID0gUkVBRCB8IGRvX3N5bmM7CkBAIC0yNzAxLDcgKzI2ODYsNyBAQAogCQlzdHJ1Y3QgYmlvICptYmlvID0gcjEwX2Jpby0+bWFzdGVyX2JpbzsKIAkJaW50IHNlY3RvcnNfaGFuZGxlZCA9CiAJCQlyMTBfYmlvLT5zZWN0b3IgKyBtYXhfc2VjdG9ycwotCQkJLSBtYmlvLT5iaV9zZWN0b3I7CisJCQktIG1iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQlyMTBfYmlvLT5zZWN0b3JzID0gbWF4X3NlY3RvcnM7CiAJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJaWYgKG1iaW8tPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkKQEAgLTI3MTksNyArMjcwNCw3IEBACiAJCXNldF9iaXQoUjEwQklPX1JlYWRFcnJvciwKIAkJCSZyMTBfYmlvLT5zdGF0ZSk7CiAJCXIxMF9iaW8tPm1kZGV2ID0gbWRkZXY7Ci0JCXIxMF9iaW8tPnNlY3RvciA9IG1iaW8tPmJpX3NlY3RvcgorCQlyMTBfYmlvLT5zZWN0b3IgPSBtYmlvLT5iaV9pdGVyLmJpX3NlY3RvcgogCQkJKyBzZWN0b3JzX2hhbmRsZWQ7CiAKIAkJZ290byByZWFkX21vcmU7CkBAIC0zMTU3LDcgKzMxNDIsOCBAQAogCQkJCWJpby0+YmlfZW5kX2lvID0gZW5kX3N5bmNfcmVhZDsKIAkJCQliaW8tPmJpX3J3ID0gUkVBRDsKIAkJCQlmcm9tX2FkZHIgPSByMTBfYmlvLT5kZXZzW2pdLmFkZHI7Ci0JCQkJYmlvLT5iaV9zZWN0b3IgPSBmcm9tX2FkZHIgKyByZGV2LT5kYXRhX29mZnNldDsKKwkJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gZnJvbV9hZGRyICsKKwkJCQkJcmRldi0+ZGF0YV9vZmZzZXQ7CiAJCQkJYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKIAkJCQkvKiBhbmQgd2Ugd3JpdGUgdG8gJ2knIChpZiBub3QgaW5fc3luYykgKi8KQEAgLTMxODEsNyArMzE2Nyw3IEBACiAJCQkJCWJpby0+YmlfcHJpdmF0ZSA9IHIxMF9iaW87CiAJCQkJCWJpby0+YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7CiAJCQkJCWJpby0+YmlfcncgPSBXUklURTsKLQkJCQkJYmlvLT5iaV9zZWN0b3IgPSB0b19hZGRyCisJCQkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSB0b19hZGRyCiAJCQkJCQkrIHJkZXYtPmRhdGFfb2Zmc2V0OwogCQkJCQliaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwogCQkJCQlhdG9taWNfaW5jKCZyMTBfYmlvLT5yZW1haW5pbmcpOwpAQCAtMzIxMCw3ICszMTk2LDggQEAKIAkJCQliaW8tPmJpX3ByaXZhdGUgPSByMTBfYmlvOwogCQkJCWJpby0+YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7CiAJCQkJYmlvLT5iaV9ydyA9IFdSSVRFOwotCQkJCWJpby0+Ymlfc2VjdG9yID0gdG9fYWRkciArIHJkZXYtPmRhdGFfb2Zmc2V0OworCQkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSB0b19hZGRyICsKKwkJCQkJcmRldi0+ZGF0YV9vZmZzZXQ7CiAJCQkJYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJCQlhdG9taWNfaW5jKCZyMTBfYmlvLT5yZW1haW5pbmcpOwogCQkJCWJyZWFrOwpAQCAtMzMyOCw3ICszMzE1LDcgQEAKIAkJCWJpby0+YmlfcHJpdmF0ZSA9IHIxMF9iaW87CiAJCQliaW8tPmJpX2VuZF9pbyA9IGVuZF9zeW5jX3JlYWQ7CiAJCQliaW8tPmJpX3J3ID0gUkVBRDsKLQkJCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yICsKKwkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3IgKwogCQkJCWNvbmYtPm1pcnJvcnNbZF0ucmRldi0+ZGF0YV9vZmZzZXQ7CiAJCQliaW8tPmJpX2JkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXYtPmJkZXY7CiAJCQljb3VudCsrOwpAQCAtMzM1MCw3ICszMzM3LDcgQEAKIAkJCWJpby0+YmlfcHJpdmF0ZSA9IHIxMF9iaW87CiAJCQliaW8tPmJpX2VuZF9pbyA9IGVuZF9zeW5jX3dyaXRlOwogCQkJYmlvLT5iaV9ydyA9IFdSSVRFOwotCQkJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3IgKworCQkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvciArCiAJCQkJY29uZi0+bWlycm9yc1tkXS5yZXBsYWNlbWVudC0+ZGF0YV9vZmZzZXQ7CiAJCQliaW8tPmJpX2JkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJlcGxhY2VtZW50LT5iZGV2OwogCQkJY291bnQrKzsKQEAgLTMzOTcsNyArMzM4NCw3IEBACiAJCQkgICAgIGJpbzIgPSBiaW8yLT5iaV9uZXh0KSB7CiAJCQkJLyogcmVtb3ZlIGxhc3QgcGFnZSBmcm9tIHRoaXMgYmlvICovCiAJCQkJYmlvMi0+YmlfdmNudC0tOwotCQkJCWJpbzItPmJpX3NpemUgLT0gbGVuOworCQkJCWJpbzItPmJpX2l0ZXIuYmlfc2l6ZSAtPSBsZW47CiAJCQkJYmlvMi0+YmlfZmxhZ3MgJj0gfigxPDwgQklPX1NFR19WQUxJRCk7CiAJCQl9CiAJCQlnb3RvIGJpb19mdWxsOwpAQCAtNDQxOCw3ICs0NDA1LDcgQEAKIAlyZWFkX2JpbyA9IGJpb19hbGxvY19tZGRldihHRlBfS0VSTkVMLCBSRVNZTkNfUEFHRVMsIG1kZGV2KTsKIAogCXJlYWRfYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKLQlyZWFkX2Jpby0+Ymlfc2VjdG9yID0gKHIxMF9iaW8tPmRldnNbcjEwX2Jpby0+cmVhZF9zbG90XS5hZGRyCisJcmVhZF9iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gKHIxMF9iaW8tPmRldnNbcjEwX2Jpby0+cmVhZF9zbG90XS5hZGRyCiAJCQkgICAgICAgKyByZGV2LT5kYXRhX29mZnNldCk7CiAJcmVhZF9iaW8tPmJpX3ByaXZhdGUgPSByMTBfYmlvOwogCXJlYWRfYmlvLT5iaV9lbmRfaW8gPSBlbmRfc3luY19yZWFkOwpAQCAtNDQyNiw3ICs0NDEzLDcgQEAKIAlyZWFkX2Jpby0+YmlfZmxhZ3MgJj0gfihCSU9fUE9PTF9NQVNLIC0gMSk7CiAJcmVhZF9iaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX1VQVE9EQVRFOwogCXJlYWRfYmlvLT5iaV92Y250ID0gMDsKLQlyZWFkX2Jpby0+Ymlfc2l6ZSA9IDA7CisJcmVhZF9iaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IDA7CiAJcjEwX2Jpby0+bWFzdGVyX2JpbyA9IHJlYWRfYmlvOwogCXIxMF9iaW8tPnJlYWRfc2xvdCA9IHIxMF9iaW8tPmRldnNbcjEwX2Jpby0+cmVhZF9zbG90XS5kZXZudW07CiAKQEAgLTQ0NTIsNyArNDQzOSw4IEBACiAKIAkJYmlvX3Jlc2V0KGIpOwogCQliLT5iaV9iZGV2ID0gcmRldjItPmJkZXY7Ci0JCWItPmJpX3NlY3RvciA9IHIxMF9iaW8tPmRldnNbcy8yXS5hZGRyICsgcmRldjItPm5ld19kYXRhX29mZnNldDsKKwkJYi0+YmlfaXRlci5iaV9zZWN0b3IgPSByMTBfYmlvLT5kZXZzW3MvMl0uYWRkciArCisJCQlyZGV2Mi0+bmV3X2RhdGFfb2Zmc2V0OwogCQliLT5iaV9wcml2YXRlID0gcjEwX2JpbzsKIAkJYi0+YmlfZW5kX2lvID0gZW5kX3Jlc2hhcGVfd3JpdGU7CiAJCWItPmJpX3J3ID0gV1JJVEU7CkBAIC00NDc5LDcgKzQ0NjcsNyBAQAogCQkJICAgICBiaW8yID0gYmlvMi0+YmlfbmV4dCkgewogCQkJCS8qIFJlbW92ZSBsYXN0IHBhZ2UgZnJvbSB0aGlzIGJpbyAqLwogCQkJCWJpbzItPmJpX3ZjbnQtLTsKLQkJCQliaW8yLT5iaV9zaXplIC09IGxlbjsKKwkJCQliaW8yLT5iaV9pdGVyLmJpX3NpemUgLT0gbGVuOwogCQkJCWJpbzItPmJpX2ZsYWdzICY9IH4oMTw8QklPX1NFR19WQUxJRCk7CiAJCQl9CiAJCQlnb3RvIGJpb19mdWxsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IDAzZjgyYWIuLmYxZmVhZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmlvICpyNV9uZXh0X2JpbyhzdHJ1Y3QgYmlvICpiaW8sIHNlY3Rvcl90IHNlY3RvcikKIHsKIAlpbnQgc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7Ci0JaWYgKGJpby0+Ymlfc2VjdG9yICsgc2VjdG9ycyA8IHNlY3RvciArIFNUUklQRV9TRUNUT1JTKQorCWlmIChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICsgc2VjdG9ycyA8IHNlY3RvciArIFNUUklQRV9TRUNUT1JTKQogCQlyZXR1cm4gYmlvLT5iaV9uZXh0OwogCWVsc2UKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMjUsNyArMjI1LDcgQEAKIAogCQlyZXR1cm5fYmkgPSBiaS0+YmlfbmV4dDsKIAkJYmktPmJpX25leHQgPSBOVUxMOwotCQliaS0+Ymlfc2l6ZSA9IDA7CisJCWJpLT5iaV9pdGVyLmJpX3NpemUgPSAwOwogCQl0cmFjZV9ibG9ja19iaW9fY29tcGxldGUoYmRldl9nZXRfcXVldWUoYmktPmJpX2JkZXYpLAogCQkJCQkgYmksIDApOwogCQliaW9fZW5kaW8oYmksIDApOwpAQCAtODUyLDEwICs4NTIsMTAgQEAKIAkJCQliaS0+YmlfcncsIGkpOwogCQkJYXRvbWljX2luYygmc2gtPmNvdW50KTsKIAkJCWlmICh1c2VfbmV3X29mZnNldChjb25mLCBzaCkpCi0JCQkJYmktPmJpX3NlY3RvciA9IChzaC0+c2VjdG9yCisJCQkJYmktPmJpX2l0ZXIuYmlfc2VjdG9yID0gKHNoLT5zZWN0b3IKIAkJCQkJCSArIHJkZXYtPm5ld19kYXRhX29mZnNldCk7CiAJCQllbHNlCi0JCQkJYmktPmJpX3NlY3RvciA9IChzaC0+c2VjdG9yCisJCQkJYmktPmJpX2l0ZXIuYmlfc2VjdG9yID0gKHNoLT5zZWN0b3IKIAkJCQkJCSArIHJkZXYtPmRhdGFfb2Zmc2V0KTsKIAkJCWlmICh0ZXN0X2JpdChSNV9SZWFkTm9NZXJnZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQogCQkJCWJpLT5iaV9ydyB8PSBSRVFfTk9NRVJHRTsKQEAgLTg2Myw3ICs4NjMsNyBAQAogCQkJYmktPmJpX3ZjbnQgPSAxOwogCQkJYmktPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBTVFJJUEVfU0laRTsKIAkJCWJpLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0ID0gMDsKLQkJCWJpLT5iaV9zaXplID0gU1RSSVBFX1NJWkU7CisJCQliaS0+YmlfaXRlci5iaV9zaXplID0gU1RSSVBFX1NJWkU7CiAJCQkvKgogCQkJICogSWYgdGhpcyBpcyBkaXNjYXJkIHJlcXVlc3QsIHNldCBiaV92Y250IDAuIFdlIGRvbid0CiAJCQkgKiB3YW50IHRvIGNvbmZ1c2UgU0NTSSBiZWNhdXNlIFNDU0kgd2lsbCByZXBsYWNlIHBheWxvYWQKQEAgLTg5OSwxNSArODk5LDE1IEBACiAJCQkJcmJpLT5iaV9ydywgaSk7CiAJCQlhdG9taWNfaW5jKCZzaC0+Y291bnQpOwogCQkJaWYgKHVzZV9uZXdfb2Zmc2V0KGNvbmYsIHNoKSkKLQkJCQlyYmktPmJpX3NlY3RvciA9IChzaC0+c2VjdG9yCisJCQkJcmJpLT5iaV9pdGVyLmJpX3NlY3RvciA9IChzaC0+c2VjdG9yCiAJCQkJCQkgICsgcnJkZXYtPm5ld19kYXRhX29mZnNldCk7CiAJCQllbHNlCi0JCQkJcmJpLT5iaV9zZWN0b3IgPSAoc2gtPnNlY3RvcgorCQkJCXJiaS0+YmlfaXRlci5iaV9zZWN0b3IgPSAoc2gtPnNlY3RvcgogCQkJCQkJICArIHJyZGV2LT5kYXRhX29mZnNldCk7CiAJCQlyYmktPmJpX3ZjbnQgPSAxOwogCQkJcmJpLT5iaV9pb192ZWNbMF0uYnZfbGVuID0gU1RSSVBFX1NJWkU7CiAJCQlyYmktPmJpX2lvX3ZlY1swXS5idl9vZmZzZXQgPSAwOwotCQkJcmJpLT5iaV9zaXplID0gU1RSSVBFX1NJWkU7CisJCQlyYmktPmJpX2l0ZXIuYmlfc2l6ZSA9IFNUUklQRV9TSVpFOwogCQkJLyoKIAkJCSAqIElmIHRoaXMgaXMgZGlzY2FyZCByZXF1ZXN0LCBzZXQgYmlfdmNudCAwLiBXZSBkb24ndAogCQkJICogd2FudCB0byBjb25mdXNlIFNDU0kgYmVjYXVzZSBTQ1NJIHdpbGwgcmVwbGFjZSBwYXlsb2FkCkBAIC05MzUsMjQgKzkzNSwyNCBAQAogYXN5bmNfY29weV9kYXRhKGludCBmcm9tYmlvLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlICpwYWdlLAogCXNlY3Rvcl90IHNlY3Rvciwgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZsOworCXN0cnVjdCBiaW9fdmVjIGJ2bDsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAJc3RydWN0IHBhZ2UgKmJpb19wYWdlOwotCWludCBpOwogCWludCBwYWdlX29mZnNldDsKIAlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CiAJZW51bSBhc3luY190eF9mbGFncyBmbGFncyA9IDA7CiAKLQlpZiAoYmlvLT5iaV9zZWN0b3IgPj0gc2VjdG9yKQotCQlwYWdlX29mZnNldCA9IChzaWduZWQpKGJpby0+Ymlfc2VjdG9yIC0gc2VjdG9yKSAqIDUxMjsKKwlpZiAoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA+PSBzZWN0b3IpCisJCXBhZ2Vfb2Zmc2V0ID0gKHNpZ25lZCkoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAtIHNlY3RvcikgKiA1MTI7CiAJZWxzZQotCQlwYWdlX29mZnNldCA9IChzaWduZWQpKHNlY3RvciAtIGJpby0+Ymlfc2VjdG9yKSAqIC01MTI7CisJCXBhZ2Vfb2Zmc2V0ID0gKHNpZ25lZCkoc2VjdG9yIC0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikgKiAtNTEyOwogCiAJaWYgKGZyb21iaW8pCiAJCWZsYWdzIHw9IEFTWU5DX1RYX0ZFTkNFOwogCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIGZsYWdzLCB0eCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmwsIGJpbywgaSkgewotCQlpbnQgbGVuID0gYnZsLT5idl9sZW47CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGl0ZXIpIHsKKwkJaW50IGxlbiA9IGJ2bC5idl9sZW47CiAJCWludCBjbGVuOwogCQlpbnQgYl9vZmZzZXQgPSAwOwogCkBAIC05NjgsOCArOTY4LDggQEAKIAkJCWNsZW4gPSBsZW47CiAKIAkJaWYgKGNsZW4gPiAwKSB7Ci0JCQliX29mZnNldCArPSBidmwtPmJ2X29mZnNldDsKLQkJCWJpb19wYWdlID0gYnZsLT5idl9wYWdlOworCQkJYl9vZmZzZXQgKz0gYnZsLmJ2X29mZnNldDsKKwkJCWJpb19wYWdlID0gYnZsLmJ2X3BhZ2U7CiAJCQlpZiAoZnJvbWJpbykKIAkJCQl0eCA9IGFzeW5jX21lbWNweShwYWdlLCBiaW9fcGFnZSwgcGFnZV9vZmZzZXQsCiAJCQkJCQkgIGJfb2Zmc2V0LCBjbGVuLCAmc3VibWl0KTsKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJCQlCVUdfT04oIWRldi0+cmVhZCk7CiAJCQlyYmkgPSBkZXYtPnJlYWQ7CiAJCQlkZXYtPnJlYWQgPSBOVUxMOwotCQkJd2hpbGUgKHJiaSAmJiByYmktPmJpX3NlY3RvciA8CisJCQl3aGlsZSAocmJpICYmIHJiaS0+YmlfaXRlci5iaV9zZWN0b3IgPAogCQkJCWRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQlyYmkyID0gcjVfbmV4dF9iaW8ocmJpLCBkZXYtPnNlY3Rvcik7CiAJCQkJaWYgKCFyYWlkNV9kZWNfYmlfYWN0aXZlX3N0cmlwZXMocmJpKSkgewpAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIAkJCWRldi0+cmVhZCA9IHJiaSA9IGRldi0+dG9yZWFkOwogCQkJZGV2LT50b3JlYWQgPSBOVUxMOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZzaC0+c3RyaXBlX2xvY2spOwotCQkJd2hpbGUgKHJiaSAmJiByYmktPmJpX3NlY3RvciA8CisJCQl3aGlsZSAocmJpICYmIHJiaS0+YmlfaXRlci5iaV9zZWN0b3IgPAogCQkJCWRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQl0eCA9IGFzeW5jX2NvcHlfZGF0YSgwLCByYmksIGRldi0+cGFnZSwKIAkJCQkJZGV2LT5zZWN0b3IsIHR4KTsKQEAgLTEzOTAsNyArMTM5MCw3IEBACiAJCQl3YmkgPSBkZXYtPndyaXR0ZW4gPSBjaG9zZW47CiAJCQlzcGluX3VubG9ja19pcnEoJnNoLT5zdHJpcGVfbG9jayk7CiAKLQkJCXdoaWxlICh3YmkgJiYgd2JpLT5iaV9zZWN0b3IgPAorCQkJd2hpbGUgKHdiaSAmJiB3YmktPmJpX2l0ZXIuYmlfc2VjdG9yIDwKIAkJCQlkZXYtPnNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7CiAJCQkJaWYgKHdiaS0+YmlfcncgJiBSRVFfRlVBKQogCQkJCQlzZXRfYml0KFI1X1dhbnRGVUEsICZkZXYtPmZsYWdzKTsKQEAgLTI2MTUsNyArMjYxNSw3IEBACiAJaW50IGZpcnN0d3JpdGU9MDsKIAogCXByX2RlYnVnKCJhZGRpbmcgYmkgYiMlbGx1IHRvIHN0cmlwZSBzIyVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpYmktPmJpX3NlY3RvciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+YmlfaXRlci5iaV9zZWN0b3IsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CiAKIAkvKgpAQCAtMjYzMywxMiArMjYzMywxMiBAQAogCQkJZmlyc3R3cml0ZSA9IDE7CiAJfSBlbHNlCiAJCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG9yZWFkOwotCXdoaWxlICgqYmlwICYmICgqYmlwKS0+Ymlfc2VjdG9yIDwgYmktPmJpX3NlY3RvcikgewotCQlpZiAoYmlvX2VuZF9zZWN0b3IoKmJpcCkgPiBiaS0+Ymlfc2VjdG9yKQorCXdoaWxlICgqYmlwICYmICgqYmlwKS0+YmlfaXRlci5iaV9zZWN0b3IgPCBiaS0+YmlfaXRlci5iaV9zZWN0b3IpIHsKKwkJaWYgKGJpb19lbmRfc2VjdG9yKCpiaXApID4gYmktPmJpX2l0ZXIuYmlfc2VjdG9yKQogCQkJZ290byBvdmVybGFwOwogCQliaXAgPSAmICgqYmlwKS0+YmlfbmV4dDsKIAl9Ci0JaWYgKCpiaXAgJiYgKCpiaXApLT5iaV9zZWN0b3IgPCBiaW9fZW5kX3NlY3RvcihiaSkpCisJaWYgKCpiaXAgJiYgKCpiaXApLT5iaV9pdGVyLmJpX3NlY3RvciA8IGJpb19lbmRfc2VjdG9yKGJpKSkKIAkJZ290byBvdmVybGFwOwogCiAJQlVHX09OKCpiaXAgJiYgYmktPmJpX25leHQgJiYgKCpiaXApICE9IGJpLT5iaV9uZXh0KTsKQEAgLTI2NTIsNyArMjY1Miw3IEBACiAJCXNlY3Rvcl90IHNlY3RvciA9IHNoLT5kZXZbZGRfaWR4XS5zZWN0b3I7CiAJCWZvciAoYmk9c2gtPmRldltkZF9pZHhdLnRvd3JpdGU7CiAJCSAgICAgc2VjdG9yIDwgc2gtPmRldltkZF9pZHhdLnNlY3RvciArIFNUUklQRV9TRUNUT1JTICYmCi0JCQkgICAgIGJpICYmIGJpLT5iaV9zZWN0b3IgPD0gc2VjdG9yOworCQkJICAgICBiaSAmJiBiaS0+YmlfaXRlci5iaV9zZWN0b3IgPD0gc2VjdG9yOwogCQkgICAgIGJpID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbZGRfaWR4XS5zZWN0b3IpKSB7CiAJCQlpZiAoYmlvX2VuZF9zZWN0b3IoYmkpID49IHNlY3RvcikKIAkJCQlzZWN0b3IgPSBiaW9fZW5kX3NlY3RvcihiaSk7CkBAIC0yNjYyLDcgKzI2NjIsNyBAQAogCX0KIAogCXByX2RlYnVnKCJhZGRlZCBiaSBiIyVsbHUgdG8gc3RyaXBlIHMjJWxsdSwgZGlzayAlZC5cbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpKCpiaXApLT5iaV9zZWN0b3IsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpKCpiaXApLT5iaV9pdGVyLmJpX3NlY3RvciwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBkZF9pZHgpOwogCXNwaW5fdW5sb2NrX2lycSgmc2gtPnN0cmlwZV9sb2NrKTsKIApAQCAtMjczNyw3ICsyNzM3LDcgQEAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCiAJCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKIAotCQl3aGlsZSAoYmkgJiYgYmktPmJpX3NlY3RvciA8CisJCXdoaWxlIChiaSAmJiBiaS0+YmlfaXRlci5iaV9zZWN0b3IgPAogCQkJc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJc3RydWN0IGJpbyAqbmV4dGJpID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKIAkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwpAQCAtMjc1Niw3ICsyNzU2LDcgQEAKIAkJYmkgPSBzaC0+ZGV2W2ldLndyaXR0ZW47CiAJCXNoLT5kZXZbaV0ud3JpdHRlbiA9IE5VTEw7CiAJCWlmIChiaSkgYml0bWFwX2VuZCA9IDE7Ci0JCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwKKwkJd2hpbGUgKGJpICYmIGJpLT5iaV9pdGVyLmJpX3NlY3RvciA8CiAJCSAgICAgICBzaC0+ZGV2W2ldLnNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7CiAJCQlzdHJ1Y3QgYmlvICpiaTIgPSByNV9uZXh0X2JpbyhiaSwgc2gtPmRldltpXS5zZWN0b3IpOwogCQkJY2xlYXJfYml0KEJJT19VUFRPREFURSwgJmJpLT5iaV9mbGFncyk7CkBAIC0yNzgwLDcgKzI3ODAsNyBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZzaC0+c3RyaXBlX2xvY2spOwogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCiAJCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7Ci0JCQl3aGlsZSAoYmkgJiYgYmktPmJpX3NlY3RvciA8CisJCQl3aGlsZSAoYmkgJiYgYmktPmJpX2l0ZXIuYmlfc2VjdG9yIDwKIAkJCSAgICAgICBzaC0+ZGV2W2ldLnNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7CiAJCQkJc3RydWN0IGJpbyAqbmV4dGJpID0KIAkJCQkJcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKQEAgLTMwMDQsNyArMzAwNCw3IEBACiAJCQkJCWNsZWFyX2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpOwogCQkJCXdiaSA9IGRldi0+d3JpdHRlbjsKIAkJCQlkZXYtPndyaXR0ZW4gPSBOVUxMOwotCQkJCXdoaWxlICh3YmkgJiYgd2JpLT5iaV9zZWN0b3IgPAorCQkJCXdoaWxlICh3YmkgJiYgd2JpLT5iaV9pdGVyLmJpX3NlY3RvciA8CiAJCQkJCWRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQkJd2JpMiA9IHI1X25leHRfYmlvKHdiaSwgZGV2LT5zZWN0b3IpOwogCQkJCQlpZiAoIXJhaWQ1X2RlY19iaV9hY3RpdmVfc3RyaXBlcyh3YmkpKSB7CkBAIC00MDk2LDcgKzQwOTYsNyBAQAogCiBzdGF0aWMgaW50IGluX2NodW5rX2JvdW5kYXJ5KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvciArIGdldF9zdGFydF9zZWN0KGJpby0+YmlfYmRldik7CisJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvciArIGdldF9zdGFydF9zZWN0KGJpby0+YmlfYmRldik7CiAJdW5zaWduZWQgaW50IGNodW5rX3NlY3RvcnMgPSBtZGRldi0+Y2h1bmtfc2VjdG9yczsKIAl1bnNpZ25lZCBpbnQgYmlvX3NlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOwogCkBAIC00MjMzLDkgKzQyMzMsOSBAQAogCS8qCiAJICoJY29tcHV0ZSBwb3NpdGlvbgogCSAqLwotCWFsaWduX2JpLT5iaV9zZWN0b3IgPSAgcmFpZDVfY29tcHV0ZV9zZWN0b3IoY29uZiwgcmFpZF9iaW8tPmJpX3NlY3RvciwKLQkJCQkJCSAgICAwLAotCQkJCQkJICAgICZkZF9pZHgsIE5VTEwpOworCWFsaWduX2JpLT5iaV9pdGVyLmJpX3NlY3RvciA9CisJCXJhaWQ1X2NvbXB1dGVfc2VjdG9yKGNvbmYsIHJhaWRfYmlvLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQkgICAgIDAsICZkZF9pZHgsIE5VTEwpOwogCiAJZW5kX3NlY3RvciA9IGJpb19lbmRfc2VjdG9yKGFsaWduX2JpKTsKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC00MjYwLDcgKzQyNjAsOCBAQAogCQlhbGlnbl9iaS0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOwogCiAJCWlmICghYmlvX2ZpdHNfcmRldihhbGlnbl9iaSkgfHwKLQkJICAgIGlzX2JhZGJsb2NrKHJkZXYsIGFsaWduX2JpLT5iaV9zZWN0b3IsIGJpb19zZWN0b3JzKGFsaWduX2JpKSwKKwkJICAgIGlzX2JhZGJsb2NrKHJkZXYsIGFsaWduX2JpLT5iaV9pdGVyLmJpX3NlY3RvciwKKwkJCQliaW9fc2VjdG9ycyhhbGlnbl9iaSksCiAJCQkJJmZpcnN0X2JhZCwgJmJhZF9zZWN0b3JzKSkgewogCQkJLyogdG9vIGJpZyBpbiBzb21lIHdheSwgb3IgaGFzIGEga25vd24gYmFkIGJsb2NrICovCiAJCQliaW9fcHV0KGFsaWduX2JpKTsKQEAgLTQyNjksNyArNDI3MCw3IEBACiAJCX0KIAogCQkvKiBObyByZXNoYXBlIGFjdGl2ZSwgc28gd2UgY2FuIHRydXN0IHJkZXYtPmRhdGFfb2Zmc2V0ICovCi0JCWFsaWduX2JpLT5iaV9zZWN0b3IgKz0gcmRldi0+ZGF0YV9vZmZzZXQ7CisJCWFsaWduX2JpLT5iaV9pdGVyLmJpX3NlY3RvciArPSByZGV2LT5kYXRhX29mZnNldDsKIAogCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLApAQCAtNDI4MSw3ICs0MjgyLDcgQEAKIAkJaWYgKG1kZGV2LT5nZW5kaXNrKQogCQkJdHJhY2VfYmxvY2tfYmlvX3JlbWFwKGJkZXZfZ2V0X3F1ZXVlKGFsaWduX2JpLT5iaV9iZGV2KSwKIAkJCQkJICAgICAgYWxpZ25fYmksIGRpc2tfZGV2dChtZGRldi0+Z2VuZGlzayksCi0JCQkJCSAgICAgIHJhaWRfYmlvLT5iaV9zZWN0b3IpOworCQkJCQkgICAgICByYWlkX2Jpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCQlnZW5lcmljX21ha2VfcmVxdWVzdChhbGlnbl9iaSk7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7CkBAIC00NDY0LDggKzQ0NjUsOCBAQAogCQkvKiBTa2lwIGRpc2NhcmQgd2hpbGUgcmVzaGFwZSBpcyBoYXBwZW5pbmcgKi8KIAkJcmV0dXJuOwogCi0JbG9naWNhbF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7Ci0JbGFzdF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICsgKGJpLT5iaV9zaXplPj45KTsKKwlsb2dpY2FsX3NlY3RvciA9IGJpLT5iaV9pdGVyLmJpX3NlY3RvciAmIH4oKHNlY3Rvcl90KVNUUklQRV9TRUNUT1JTLTEpOworCWxhc3Rfc2VjdG9yID0gYmktPmJpX2l0ZXIuYmlfc2VjdG9yICsgKGJpLT5iaV9pdGVyLmJpX3NpemU+PjkpOwogCiAJYmktPmJpX25leHQgPSBOVUxMOwogCWJpLT5iaV9waHlzX3NlZ21lbnRzID0gMTsgLyogb3Zlci1sb2FkZWQgdG8gY291bnQgYWN0aXZlIHN0cmlwZXMgKi8KQEAgLTQ1NjksNyArNDU3MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlsb2dpY2FsX3NlY3RvciA9IGJpLT5iaV9zZWN0b3IgJiB+KChzZWN0b3JfdClTVFJJUEVfU0VDVE9SUy0xKTsKKwlsb2dpY2FsX3NlY3RvciA9IGJpLT5iaV9pdGVyLmJpX3NlY3RvciAmIH4oKHNlY3Rvcl90KVNUUklQRV9TRUNUT1JTLTEpOwogCWxhc3Rfc2VjdG9yID0gYmlvX2VuZF9zZWN0b3IoYmkpOwogCWJpLT5iaV9uZXh0ID0gTlVMTDsKIAliaS0+YmlfcGh5c19zZWdtZW50cyA9IDE7CS8qIG92ZXItbG9hZGVkIHRvIGNvdW50IGFjdGl2ZSBzdHJpcGVzICovCkBAIC01MDUzLDcgKzUwNTQsOCBAQAogCWludCByZW1haW5pbmc7CiAJaW50IGhhbmRsZWQgPSAwOwogCi0JbG9naWNhbF9zZWN0b3IgPSByYWlkX2Jpby0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7CisJbG9naWNhbF9zZWN0b3IgPSByYWlkX2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgJgorCQl+KChzZWN0b3JfdClTVFJJUEVfU0VDVE9SUy0xKTsKIAlzZWN0b3IgPSByYWlkNV9jb21wdXRlX3NlY3Rvcihjb25mLCBsb2dpY2FsX3NlY3RvciwKIAkJCQkgICAgICAwLCAmZGRfaWR4LCBOVUxMKTsKIAlsYXN0X3NlY3RvciA9IGJpb19lbmRfc2VjdG9yKHJhaWRfYmlvKTsKQEAgLTYxMDEsNiArNjEwMyw3IEBACiAJCWJsa19xdWV1ZV9pb19taW4obWRkZXYtPnF1ZXVlLCBjaHVua19zaXplKTsKIAkJYmxrX3F1ZXVlX2lvX29wdChtZGRldi0+cXVldWUsIGNodW5rX3NpemUgKgogCQkJCSAoY29uZi0+cmFpZF9kaXNrcyAtIGNvbmYtPm1heF9kZWdyYWRlZCkpOworCQltZGRldi0+cXVldWUtPmxpbWl0cy5yYWlkX3BhcnRpYWxfc3RyaXBlc19leHBlbnNpdmUgPSAxOwogCQkvKgogCQkgKiBXZSBjYW4gb25seSBkaXNjYXJkIGEgd2hvbGUgc3RyaXBlLiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8KIAkJICogZGlzY2FyZCBkYXRhIGRpc2sgYnV0IHdyaXRlIHBhcml0eSBkaXNrCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL0tjb25maWcKaW5kZXggODI3MDM4OC4uMWQwNzU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwpAQCAtMTcyLDYgKzE3Miw5IEBACiBjb25maWcgTUVESUFfU1VCRFJWX0FVVE9TRUxFQ1QKIAlib29sICJBdXRvc2VsZWN0IGFuY2lsbGFyeSBkcml2ZXJzICh0dW5lcnMsIHNlbnNvcnMsIGkyYywgZnJvbnRlbmRzKSIKIAlkZXBlbmRzIG9uIE1FRElBX0FOQUxPR19UVl9TVVBQT1JUIHx8IE1FRElBX0RJR0lUQUxfVFZfU1VQUE9SVCB8fCBNRURJQV9DQU1FUkFfU1VQUE9SVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJc2VsZWN0IEkyQworCXNlbGVjdCBJMkNfTVVYCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQnkgZGVmYXVsdCwgYSBtZWRpYSBkcml2ZXIgYXV0by1zZWxlY3RzIGFsbCBwb3NzaWJsZSBhbmNpbGxhcnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWNvcmUvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiLWNvcmUvZHZiLXVzYi1pZHMuaAppbmRleCA0MTlhMmQ2Li5mMTlhMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1jb3JlL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItY29yZS9kdmItdXNiLWlkcy5oCkBAIC0yMzksNiArMjM5LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfQTgzNUJfNDgzNQkJCTB4NDgzNQogI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV8xODY3CQkJCTB4MTg2NwogI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9BODY3CQkJCTB4YTg2NworI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9IMzM1CQkJCTB4MDMzNQogI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9UV0lOU1RBUgkJCTB4MDgyNQogI2RlZmluZSBVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfUzI0MDAgICAgICAgICAgICAgICAweDMwMDYKICNkZWZpbmUgVVNCX1BJRF9URUNITk9UUkVORF9DT05ORUNUX1MyNDAwXzhLRUVQUk9NCTB4MzAwOQpAQCAtMzE3LDYgKzMxOCw3IEBACiAjZGVmaW5lIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX0gJCQkweDYwZjYKICNkZWZpbmUgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfU1RLNzcwMFBfMgkJMHg2ZjAxCiAjZGVmaW5lIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX0dPTEQJCQkweDYwMjkKKyNkZWZpbmUgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfTUlOSUQJCTB4NmYwZgogI2RlZmluZSBVU0JfUElEX0dFTlBJWF84UFNLX1JFVl8xX0NPTEQJCQkweDAyMDAKICNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19SRVZfMV9XQVJNCQkJMHgwMjAxCiAjZGVmaW5lIFVTQl9QSURfR0VOUElYXzhQU0tfUkVWXzIJCQkweDAyMDIKQEAgLTM2NSw2ICszNjcsNyBAQAogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0RWQlMyQ0lfVjIJCQkweDEwYWMKICNkZWZpbmUgVVNCX1BJRF9URUNITklTQVRfVVNCMl9IRENJX1YxCQkJMHgwMDAxCiAjZGVmaW5lIFVTQl9QSURfVEVDSE5JU0FUX1VTQjJfSERDSV9WMgkJCTB4MDAwMgorI2RlZmluZSBVU0JfUElEX1RFQ0hOSVNBVF9VU0IyX0NBQkxFU1RBUl9IRENJCQkweDAwMDMKICNkZWZpbmUgVVNCX1BJRF9URUNITklTQVRfQUlSU1RBUl9URUxFU1RJQ0tfMgkJMHgwMDA0CiAjZGVmaW5lIFVTQl9QSURfVEVDSE5JU0FUX1VTQjJfRFZCX1MyCQkJMHgwNTAwCiAjZGVmaW5lIFVTQl9QSURfQ1BZVE9fUkVESV9QQzUwQQkJCTB4YTgwMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvS2NvbmZpZwppbmRleCBiZGRiYWI0Li5kZDEyYTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvS2NvbmZpZwpAQCAtMzUsNiArMzUsMTMgQEAKIAloZWxwCiAJICBBIFNpbGljb24gdHVuZXIgdGhhdCBzdXBwb3J0cyBEVkItUyBhbmQgRFZCLVMyIG1vZGVzCiAKK2NvbmZpZyBEVkJfTTg4RFMzMTAzCisJdHJpc3RhdGUgIk1vbnRhZ2UgTTg4RFMzMTAzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDICYmIEkyQ19NVVgKKwlkZWZhdWx0IG0gaWYgIU1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCisJaGVscAorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIk11bHRpc3RhbmRhcmQgKGNhYmxlICsgdGVycmVzdHJpYWwpIGZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9NYWtlZmlsZQppbmRleCBmOWNiNDNkLi4wYzc1YTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL01ha2VmaWxlCkBAIC04NSw2ICs4NSw3IEBACiBvYmotJChDT05GSUdfRFZCX1NUVjA5MDApICs9IHN0djA5MDAubwogb2JqLSQoQ09ORklHX0RWQl9TVFYwOTB4KSArPSBzdHYwOTB4Lm8KIG9iai0kKENPTkZJR19EVkJfU1RWNjExMHgpICs9IHN0djYxMTB4Lm8KK29iai0kKENPTkZJR19EVkJfTTg4RFMzMTAzKSArPSBtODhkczMxMDMubwogb2JqLSQoQ09ORklHX0RWQl9JU0w2NDIzKSArPSBpc2w2NDIzLm8KIG9iai0kKENPTkZJR19EVkJfRUMxMDApICs9IGVjMTAwLm8KIG9iai0kKENPTkZJR19EVkJfSEQyOUwyKSArPSBoZDI5bDIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2E4MjkzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvYTgyOTMuYwppbmRleCA3NGZiYjVkLi43ODBkYTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvYTgyOTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvYTgyOTMuYwpAQCAtOTYsNiArOTYsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCisJdXNsZWVwX3JhbmdlKDE1MDAsIDUwMDAwKTsKKwogCXJldHVybiByZXQ7CiBlcnI6CiAJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9jeDI0MTE3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvY3gyNDExNy5jCmluZGV4IDQ3NmI0MjIuLmE2YzNjOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9jeDI0MTE3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2N4MjQxMTcuYwpAQCAtMTM1LDE1ICsxMzUsMzMgQEAKIAogCiBlbnVtIGNtZHMgewotCUNNRF9TRVRfVkNPICAgICA9IDB4MTAsCi0JQ01EX1RVTkVSRVFVRVNUID0gMHgxMSwKLQlDTURfTVBFR0NPTkZJRyAgPSAweDEzLAotCUNNRF9UVU5FUklOSVQgICA9IDB4MTQsCi0JQ01EX0xOQlNFTkQgICAgID0gMHgyMSwgLyogRm9ybWVybHkgQ01EX1NFTkRfRElTRVFDICovCi0JQ01EX0xOQkRDTEVWRUwgID0gMHgyMiwKLQlDTURfU0VUX1RPTkUgICAgPSAweDIzLAotCUNNRF9VUERGV1ZFUlMgICA9IDB4MzUsCi0JQ01EX1RVTkVSU0xFRVAgID0gMHgzNiwKKwlDTURfU0VUX1ZDT0ZSRVEgICAgPSAweDEwLAorCUNNRF9UVU5FUkVRVUVTVCAgICA9IDB4MTEsCisJQ01EX0dMT0JBTF9NUEVHQ0ZHID0gMHgxMywKKwlDTURfTVBFR0NGRyAgICAgICAgPSAweDE0LAorCUNNRF9UVU5FUklOSVQgICAgICA9IDB4MTUsCisJQ01EX0dFVF9TUkFURSAgICAgID0gMHgxOCwKKwlDTURfU0VUX0dPTERDT0RFICAgPSAweDE5LAorCUNNRF9HRVRfQUdDQUNDICAgICA9IDB4MWEsCisJQ01EX0RFTU9ESU5JVCAgICAgID0gMHgxYiwKKwlDTURfR0VUQ1RMQUNDICAgICAgPSAweDFjLAorCisJQ01EX0xOQkNPTkZJRyAgICAgID0gMHgyMCwKKwlDTURfTE5CU0VORCAgICAgICAgPSAweDIxLAorCUNNRF9MTkJEQ0xFVkVMICAgICA9IDB4MjIsCisJQ01EX0xOQlBDQkNPTkZJRyAgID0gMHgyMywKKwlDTURfTE5CU0VORFRPTkVCU1QgPSAweDI0LAorCUNNRF9MTkJVUERSRVBMWSAgICA9IDB4MjUsCisKKwlDTURfU0VUX0dQSU9NT0RFICAgPSAweDMwLAorCUNNRF9TRVRfR1BJT0VOICAgICA9IDB4MzEsCisJQ01EX1NFVF9HUElPRElSICAgID0gMHgzMiwKKwlDTURfU0VUX0dQSU9PVVQgICAgPSAweDMzLAorCUNNRF9FTkFCTEVSU0NPUlIgICA9IDB4MzQsCisJQ01EX0ZXVkVSU0lPTiAgICAgID0gMHgzNSwKKwlDTURfU0VUX1NMRUVQTU9ERSAgPSAweDM2LAorCUNNRF9CRVJDVFJMICAgICAgICA9IDB4M2MsCisJQ01EX0VWRU5UQ1RSTCAgICAgID0gMHgzZCwKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQoaHlicmlkX3R1bmVyX2luc3RhbmNlX2xpc3QpOwpAQCAtNjE5LDggKzYzNyw4IEBACiAJY3gyNDExN193cml0ZXJlZyhzdGF0ZSwgMHhmNywgMHgwYyk7CiAJY3gyNDExN193cml0ZXJlZyhzdGF0ZSwgMHhlMCwgMHgwMCk7CiAKLQkvKiBDTUQgMUIgKi8KLQljbWQuYXJnc1swXSA9IDB4MWI7CisJLyogSW5pdCBkZW1vZHVsYXRvciAqLworCWNtZC5hcmdzWzBdID0gQ01EX0RFTU9ESU5JVDsKIAljbWQuYXJnc1sxXSA9IDB4MDA7CiAJY21kLmFyZ3NbMl0gPSAweDAxOwogCWNtZC5hcmdzWzNdID0gMHgwMDsKQEAgLTYyOSw4ICs2NDcsOCBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJvcjsKIAotCS8qIENNRCAxMCAqLwotCWNtZC5hcmdzWzBdID0gQ01EX1NFVF9WQ087CisJLyogU2V0IFZDTyBmcmVxdWVuY3kgKi8KKwljbWQuYXJnc1swXSA9IENNRF9TRVRfVkNPRlJFUTsKIAljbWQuYXJnc1sxXSA9IDB4MDY7CiAJY21kLmFyZ3NbMl0gPSAweDJiOwogCWNtZC5hcmdzWzNdID0gMHhkODsKQEAgLTY0OCw4ICs2NjYsOCBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJvcjsKIAotCS8qIENNRCAxNSAqLwotCWNtZC5hcmdzWzBdID0gMHgxNTsKKwkvKiBUdW5lciBpbml0ICovCisJY21kLmFyZ3NbMF0gPSBDTURfVFVORVJJTklUOwogCWNtZC5hcmdzWzFdID0gMHgwMDsKIAljbWQuYXJnc1syXSA9IDB4MDE7CiAJY21kLmFyZ3NbM10gPSAweDAwOwpAQCAtNjY3LDggKzY4NSw4IEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycm9yOwogCi0JLyogQ01EIDEzICovCi0JY21kLmFyZ3NbMF0gPSBDTURfTVBFR0NPTkZJRzsKKwkvKiBHbG9iYWwgTVBFRyBjb25maWcgKi8KKwljbWQuYXJnc1swXSA9IENNRF9HTE9CQUxfTVBFR0NGRzsKIAljbWQuYXJnc1sxXSA9IDB4MDA7CiAJY21kLmFyZ3NbMl0gPSAweDAwOwogCWNtZC5hcmdzWzNdID0gMHgwMDsKQEAgLTY3OSw5ICs2OTcsOSBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJvcjsKIAotCS8qIENNRCAxNCAqLworCS8qIE1QRUcgY29uZmlnIGZvciBlYWNoIGRlbW9kICovCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQljbWQuYXJnc1swXSA9IENNRF9UVU5FUklOSVQ7CisJCWNtZC5hcmdzWzBdID0gQ01EX01QRUdDRkc7CiAJCWNtZC5hcmdzWzFdID0gKHU4KSBpOwogCQljbWQuYXJnc1syXSA9IDB4MDA7CiAJCWNtZC5hcmdzWzNdID0gMHgwNTsKQEAgLTY5OSw4ICs3MTcsOCBAQAogCWN4MjQxMTdfd3JpdGVyZWcoc3RhdGUsIDB4Y2YsIDB4MDApOwogCWN4MjQxMTdfd3JpdGVyZWcoc3RhdGUsIDB4ZTUsIDB4MDQpOwogCi0JLyogRmlybXdhcmUgQ01EIDM1OiBHZXQgZmlybXdhcmUgdmVyc2lvbiAqLwotCWNtZC5hcmdzWzBdID0gQ01EX1VQREZXVkVSUzsKKwkvKiBHZXQgZmlybXdhcmUgdmVyc2lvbiAqLworCWNtZC5hcmdzWzBdID0gQ01EX0ZXVkVSU0lPTjsKIAljbWQubGVuID0gMjsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWNtZC5hcmdzWzFdID0gaTsKQEAgLTc3OSw4ICs3OTcsOCBAQAogCXU4IHJlZyA9IChzdGF0ZS0+ZGVtb2QgPT0gMCkgPwogCQlDWDI0MTE3X1JFR19TU1RBVFVTMCA6IENYMjQxMTdfUkVHX1NTVEFUVVMxOwogCi0JLyogRmlybXdhcmUgQ01EIDFBICovCi0JY21kLmFyZ3NbMF0gPSAweDFhOworCS8qIFJlYWQgQUdDIGFjY3VtdWxhdG9yIHJlZ2lzdGVyICovCisJY21kLmFyZ3NbMF0gPSBDTURfR0VUX0FHQ0FDQzsKIAljbWQuYXJnc1sxXSA9ICh1OCkgc3RhdGUtPmRlbW9kOwogCWNtZC5sZW4gPSAyOwogCXJldCA9IGN4MjQxMTdfY21kX2V4ZWN1dGUoZmUsICZjbWQpOwpAQCAtODk5LDIyICs5MTcsMTUgQEAKIAkJdm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCA/ICJTRUNfVk9MVEFHRV8xOCIgOgogCQkiU0VDX1ZPTFRBR0VfT0ZGIik7CiAKLQkvKiBDTUQgMzIgKi8KLQljbWQuYXJnc1swXSA9IDB4MzI7Ci0JY21kLmFyZ3NbMV0gPSByZWc7Ci0JY21kLmFyZ3NbMl0gPSByZWc7CisJLyogUHJlcGFyZSBhIHNldCBHUElPIGxvZ2ljIGxldmVsIENNRCAqLworCWNtZC5hcmdzWzBdID0gQ01EX1NFVF9HUElPT1VUOworCWNtZC5hcmdzWzJdID0gcmVnOyAvKiBtYXNrICovCiAJY21kLmxlbiA9IDM7Ci0JcmV0ID0gY3gyNDExN19jbWRfZXhlY3V0ZShmZSwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAogCWlmICgodm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xMykgfHwKIAkgICAgKHZvbHRhZ2UgPT0gU0VDX1ZPTFRBR0VfMTgpKSB7Ci0JCS8qIENNRCAzMyAqLwotCQljbWQuYXJnc1swXSA9IDB4MzM7CisJCS8qIHBvd2VyIG9uIExOQiAqLwogCQljbWQuYXJnc1sxXSA9IHJlZzsKLQkJY21kLmFyZ3NbMl0gPSByZWc7Ci0JCWNtZC5sZW4gPSAzOwogCQlyZXQgPSBjeDI0MTE3X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTkyNiwyMiArOTM3LDIyIEBACiAJCS8qIFdhaXQgZm9yIHZvbHRhZ2UvbWluIHJlcGVhdCBkZWxheSAqLwogCQltc2xlZXAoMTAwKTsKIAotCQkvKiBDTUQgMjIgLSBDTURfTE5CRENMRVZFTCAqLworCQkvKiBTZXQgMTNWLzE4ViBzZWxlY3QgcGluICovCiAJCWNtZC5hcmdzWzBdID0gQ01EX0xOQkRDTEVWRUw7CiAJCWNtZC5hcmdzWzFdID0gc3RhdGUtPmRlbW9kID8gMCA6IDE7CiAJCWNtZC5hcmdzWzJdID0gKHZvbHRhZ2UgPT0gU0VDX1ZPTFRBR0VfMTggPyAweDAxIDogMHgwMCk7CiAJCWNtZC5sZW4gPSAzOworCQlyZXQgPSBjeDI0MTE3X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKIAogCQkvKiBNaW4gZGVsYXkgdGltZSBiZWZvcmUgRGlTRXFDIHNlbmQgKi8KIAkJbXNsZWVwKDIwKTsKIAl9IGVsc2UgewotCQljbWQuYXJnc1swXSA9IDB4MzM7CisJCS8qIHBvd2VyIG9mZiBMTkIgKi8KIAkJY21kLmFyZ3NbMV0gPSAweDAwOwotCQljbWQuYXJnc1syXSA9IHJlZzsKLQkJY21kLmxlbiA9IDM7CisJCXJldCA9IGN4MjQxMTdfY21kX2V4ZWN1dGUoZmUsICZjbWQpOwogCX0KIAotCXJldHVybiBjeDI0MTE3X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGN4MjQxMTdfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCkBAIC05NjgsOCArOTc5LDcgQEAKIAltc2xlZXAoMjApOwogCiAJLyogU2V0IHRoZSB0b25lICovCi0JLyogQ01EIDIzIC0gQ01EX1NFVF9UT05FICovCi0JY21kLmFyZ3NbMF0gPSBDTURfU0VUX1RPTkU7CisJY21kLmFyZ3NbMF0gPSBDTURfTE5CUENCQ09ORklHOwogCWNtZC5hcmdzWzFdID0gKHN0YXRlLT5kZW1vZCA/IDAgOiAxKTsKIAljbWQuYXJnc1syXSA9IDB4MDA7CiAJY21kLmFyZ3NbM10gPSAweDAwOwpAQCAtMTE2Niw3ICsxMTc2LDcgQEAKIAogCXN3aXRjaCAoZGVtb2QpIHsKIAljYXNlIDA6Ci0JCWRldl9lcnIoJnN0YXRlLT5wcml2LT5pMmMtPmRldiwKKwkJZGV2X2VycigmaTJjLT5kZXYsCiAJCQkiJXM6IEVycm9yIGF0dGFjaGluZyBmcm9udGVuZCAlZFxuIiwKIAkJCUtCVUlMRF9NT0ROQU1FLCBkZW1vZCk7CiAJCWdvdG8gZXJyb3IxOwpAQCAtMTE5MCwxMiArMTIwMCw2IEBACiAJc3RhdGUtPmRlbW9kID0gZGVtb2QgLSAxOwogCXN0YXRlLT5wcml2ID0gcHJpdjsKIAotCS8qIHRlc3QgaTJjIGJ1cyBmb3IgYWNrICovCi0JaWYgKGRlbW9kID09IDApIHsKLQkJaWYgKGN4MjQxMTdfcmVhZHJlZyhzdGF0ZSwgMHgwMCkgPCAwKQotCQkJZ290byBlcnJvcjM7Ci0JfQotCiAJZGV2X2luZm8oJnN0YXRlLT5wcml2LT5pMmMtPmRldiwKIAkJIiVzOiBBdHRhY2hpbmcgZnJvbnRlbmQgJWRcbiIsCiAJCUtCVUlMRF9NT0ROQU1FLCBzdGF0ZS0+ZGVtb2QpOwpAQCAtMTIwNiw4ICsxMjEwLDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCi1lcnJvcjM6Ci0Ja2ZyZWUoc3RhdGUpOwogZXJyb3IyOgogCWN4MjQxMTdfcmVsZWFzZV9wcml2KHByaXYpOwogZXJyb3IxOgpAQCAtMTIzMSw4ICsxMjMzLDggQEAKIAogCW11dGV4X2xvY2soJnN0YXRlLT5wcml2LT5mZV9sb2NrKTsKIAotCS8qIEZpcm13YXJlIENNRCAzNjogUG93ZXIgY29uZmlnICovCi0JY21kLmFyZ3NbMF0gPSBDTURfVFVORVJTTEVFUDsKKwkvKiBTZXQgc2xlZXAgbW9kZSBvZmYgKi8KKwljbWQuYXJnc1swXSA9IENNRF9TRVRfU0xFRVBNT0RFOwogCWNtZC5hcmdzWzFdID0gKHN0YXRlLT5kZW1vZCA/IDEgOiAwKTsKIAljbWQuYXJnc1syXSA9IDA7CiAJY21kLmxlbiA9IDM7CkBAIC0xMjQ0LDggKzEyNDYsOCBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBleGl0OwogCi0JLyogQ01EIDNDICovCi0JY21kLmFyZ3NbMF0gPSAweDNjOworCS8qIFNldCBCRVIgY29udHJvbCAqLworCWNtZC5hcmdzWzBdID0gQ01EX0JFUkNUUkw7CiAJY21kLmFyZ3NbMV0gPSAoc3RhdGUtPmRlbW9kID8gMSA6IDApOwogCWNtZC5hcmdzWzJdID0gMHgxMDsKIAljbWQuYXJnc1szXSA9IDB4MTA7CkBAIC0xMjU0LDEyICsxMjU2LDIyIEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGV4aXQ7CiAKLQkvKiBDTUQgMzQgKi8KLQljbWQuYXJnc1swXSA9IDB4MzQ7CisJLyogU2V0IFJTIGNvcnJlY3Rpb24gKGVuYWJsZS9kaXNhYmxlKSAqLworCWNtZC5hcmdzWzBdID0gQ01EX0VOQUJMRVJTQ09SUjsKIAljbWQuYXJnc1sxXSA9IChzdGF0ZS0+ZGVtb2QgPyAxIDogMCk7CiAJY21kLmFyZ3NbMl0gPSBDWDI0MTE3X09DQzsKIAljbWQubGVuID0gMzsKIAlyZXQgPSBjeDI0MTE3X2NtZF9leGVjdXRlX25vbG9jayhmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBTZXQgR1BJTyBkaXJlY3Rpb24gKi8KKwkvKiBTZXQgYXMgb3V0cHV0IC0gY29udHJvbHMgTE5CIHBvd2VyIG9uL29mZiAqLworCWNtZC5hcmdzWzBdID0gQ01EX1NFVF9HUElPRElSOworCWNtZC5hcmdzWzFdID0gMHgzMDsKKwljbWQuYXJnc1syXSA9IDB4MzA7CisJY21kLmxlbiA9IDM7CisJcmV0ID0gY3gyNDExN19jbWRfZXhlY3V0ZV9ub2xvY2soZmUsICZjbWQpOwogCiBleGl0OgogCW11dGV4X3VubG9jaygmc3RhdGUtPnByaXYtPmZlX2xvY2spOwpAQCAtMTI3OCw4ICsxMjkwLDggQEAKIAlkZXZfZGJnKCZzdGF0ZS0+cHJpdi0+aTJjLT5kZXYsICIlcygpIGRlbW9kJWRcbiIsCiAJCV9fZnVuY19fLCBzdGF0ZS0+ZGVtb2QpOwogCi0JLyogRmlybXdhcmUgQ01EIDM2OiBQb3dlciBjb25maWcgKi8KLQljbWQuYXJnc1swXSA9IENNRF9UVU5FUlNMRUVQOworCS8qIFNldCBzbGVlcCBtb2RlIG9uICovCisJY21kLmFyZ3NbMF0gPSBDTURfU0VUX1NMRUVQTU9ERTsKIAljbWQuYXJnc1sxXSA9IChzdGF0ZS0+ZGVtb2QgPyAxIDogMCk7CiAJY21kLmFyZ3NbMl0gPSAxOwogCWNtZC5sZW4gPSAzOwpAQCAtMTU1OCw3ICsxNTcwLDggQEAKIAogCXU4IGJ1ZlsweDFmLTRdOwogCi0JY21kLmFyZ3NbMF0gPSAweDFjOworCS8qIFJlYWQgY3VycmVudCB0dW5lIHBhcmFtZXRlcnMgKi8KKwljbWQuYXJnc1swXSA9IENNRF9HRVRDVExBQ0M7CiAJY21kLmFyZ3NbMV0gPSAodTgpIHN0YXRlLT5kZW1vZDsKIAljbWQubGVuID0gMjsKIAlyZXQgPSBjeDI0MTE3X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9kaWI4MDAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvZGliODAwMC5jCmluZGV4IDZkYmJlZTQuLjE2MzJkNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9kaWI4MDAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2RpYjgwMDAuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjaW5jbHVkZSAiZHZiX21hdGguaCIKIApAQCAtMTE4LDYgKzExOSwxMiBAQAogCXU4IGxvbmdlc3RfaW50bHZfbGF5ZXI7CiAJdTE2IG91dHB1dF9tb2RlOwogCisJLyogZm9yIERWQnY1IHN0YXRzICovCisJczY0IGluaXRfdWNiOworCXVuc2lnbmVkIGxvbmcgcGVyX2ppZmZpZXNfc3RhdHM7CisJdW5zaWduZWQgbG9uZyBiZXJfamlmZmllc19zdGF0czsKKwl1bnNpZ25lZCBsb25nIGJlcl9qaWZmaWVzX3N0YXRzX2xheWVyWzNdOworCiAjaWZkZWYgRElCODAwMF9BR0NfRlJFRVpFCiAJdTE2IGFnYzFfbWF4OwogCXUxNiBhZ2MxX21pbjsKQEAgLTE1NywxNSArMTY0LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHUxNiBkaWI4MDAwX3JlYWRfd29yZChzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUsIHUxNiByZWcpCitzdGF0aWMgdTE2IF9fZGliODAwMF9yZWFkX3dvcmQoc3RydWN0IGRpYjgwMDBfc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQogewogCXUxNiByZXQ7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKLQkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZyA+PiA4OwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gcmVnICYgMHhmZjsKIApAQCAtMTgzLDYgKzE4NSwyMSBAQAogCQlkcHJpbnRrKCJpMmMgcmVhZCBlcnJvciBvbiAlZCIsIHJlZyk7CiAKIAlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGRpYjgwMDBfcmVhZF93b3JkKHN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKK3sKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gX19kaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgcmVnKTsKKwogCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTkyLDggKzIwOSwxNSBAQAogewogCXUxNiByd1syXTsKIAotCXJ3WzBdID0gZGliODAwMF9yZWFkX3dvcmQoc3RhdGUsIHJlZyArIDApOwotCXJ3WzFdID0gZGliODAwMF9yZWFkX3dvcmQoc3RhdGUsIHJlZyArIDEpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAwOworCX0KKworCXJ3WzBdID0gX19kaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgcmVnICsgMCk7CisJcndbMV0gPSBfX2RpYjgwMDBfcmVhZF93b3JkKHN0YXRlLCByZWcgKyAxKTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CiAKIAlyZXR1cm4gKChyd1swXSA8PCAxNikgfCAocndbMV0pKTsKIH0KQEAgLTc4Nyw3ICs4MTEsNyBAQAogCQkJZHByaW50aygiUExMOiBVcGRhdGUgcmF0aW8gKHByZWRpdjogJWQsIHJhdGlvOiAlZCkiLCBzdGF0ZS0+Y2ZnLnBsbC0+cGxsX3ByZWRpdiwgcmF0aW8pOwogCQkJZGliODAwMF93cml0ZV93b3JkKHN0YXRlLCA5MDEsIChzdGF0ZS0+Y2ZnLnBsbC0+cGxsX3ByZWRpdiA8PCA4KSB8IChyYXRpbyA8PCAwKSk7IC8qIG9ubHkgdGhlIFBMTCByYXRpbyBpcyB1cGRhdGVkLiAqLwogCQl9Ci19CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05NjYsNiArOTkwLDQ1IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMgaW50IGRpYjgwMDBfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVuYyk7CisKK3N0YXRpYyB2b2lkIGRpYjgwMDBfcmVzZXRfc3RhdHMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGRpYjgwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJnN0YXRlLT5mZVswXS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCXUzMiB1Y2I7CisKKwltZW1zZXQoJmMtPnN0cmVuZ3RoLCAwLCBzaXplb2YoYy0+c3RyZW5ndGgpKTsKKwltZW1zZXQoJmMtPmNuciwgMCwgc2l6ZW9mKGMtPmNucikpOworCW1lbXNldCgmYy0+cG9zdF9iaXRfZXJyb3IsIDAsIHNpemVvZihjLT5wb3N0X2JpdF9lcnJvcikpOworCW1lbXNldCgmYy0+cG9zdF9iaXRfY291bnQsIDAsIHNpemVvZihjLT5wb3N0X2JpdF9jb3VudCkpOworCW1lbXNldCgmYy0+YmxvY2tfZXJyb3IsIDAsIHNpemVvZihjLT5ibG9ja19lcnJvcikpOworCisJYy0+c3RyZW5ndGgubGVuID0gMTsKKwljLT5jbnIubGVuID0gMTsKKwljLT5ibG9ja19lcnJvci5sZW4gPSAxOworCWMtPmJsb2NrX2NvdW50LmxlbiA9IDE7CisJYy0+cG9zdF9iaXRfZXJyb3IubGVuID0gMTsKKwljLT5wb3N0X2JpdF9jb3VudC5sZW4gPSAxOworCisJYy0+c3RyZW5ndGguc3RhdFswXS5zY2FsZSA9IEZFX1NDQUxFX0RFQ0lCRUw7CisJYy0+c3RyZW5ndGguc3RhdFswXS51dmFsdWUgPSAwOworCisJYy0+Y25yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCWMtPmJsb2NrX2Vycm9yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCWMtPmJsb2NrX2NvdW50LnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCWMtPnBvc3RfYml0X2Vycm9yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCWMtPnBvc3RfYml0X2NvdW50LnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCisJZGliODAwMF9yZWFkX3VuY19ibG9ja3MoZmUsICZ1Y2IpOworCisJc3RhdGUtPmluaXRfdWNiID0gLXVjYjsKKwlzdGF0ZS0+YmVyX2ppZmZpZXNfc3RhdHMgPSAwOworCXN0YXRlLT5wZXJfamlmZmllc19zdGF0cyA9IDA7CisJbWVtc2V0KCZzdGF0ZS0+YmVyX2ppZmZpZXNfc3RhdHNfbGF5ZXIsIDAsCisJICAgICAgIHNpemVvZihzdGF0ZS0+YmVyX2ppZmZpZXNfc3RhdHNfbGF5ZXIpKTsKK30KKwogc3RhdGljIGludCBkaWI4MDAwX3Jlc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtMTA3MSw2ICsxMTM0LDggQEAKIAogCWRpYjgwMDBfc2V0X3Bvd2VyX21vZGUoc3RhdGUsIERJQjgwMDBfUE9XRVJfSU5URVJGQUNFX09OTFkpOwogCisJZGliODAwMF9yZXNldF9zdGF0cyhmZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ0NSw3ICsyNTEwLDggQEAKIAlpZiAoc3RhdGUtPnJldmlzaW9uID09IDB4ODA5MCkKIAkJaW50ZXJuYWwgPSBkaWI4MDAwX3JlYWQzMihzdGF0ZSwgMjMpIC8gMTAwMDsKIAotCWlmIChzdGF0ZS0+YXV0b3NlYXJjaF9zdGF0ZSA9PSBBU19TRUFSQ0hJTkdfRkZUKSB7CisJaWYgKChzdGF0ZS0+cmV2aXNpb24gPj0gMHg4MDAyKSAmJgorCSAgICAoc3RhdGUtPmF1dG9zZWFyY2hfc3RhdGUgPT0gQVNfU0VBUkNISU5HX0ZGVCkpIHsKIAkJZGliODAwMF93cml0ZV93b3JkKHN0YXRlLCAgMzcsIDB4MDA2NSk7IC8qIFBfY3RybF9waGFfb2ZmX21heCBkZWZhdWx0IHZhbHVlcyAqLwogCQlkaWI4MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDExNiwgMHgwMDAwKTsgLyogUF9hbmFfZ2FpbiB0byAwICovCiAKQEAgLTI0ODEsNyArMjU0Nyw4IEBACiAJCWRpYjgwMDBfd3JpdGVfd29yZChzdGF0ZSwgNzcwLCAoZGliODAwMF9yZWFkX3dvcmQoc3RhdGUsIDc3MCkgJiAweGRmZmYpIHwgKDEgPDwgMTMpKTsgLyogUF9yZXN0YXJ0X2NjZyA9IDEgKi8KIAkJZGliODAwMF93cml0ZV93b3JkKHN0YXRlLCA3NzAsIChkaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgNzcwKSAmIDB4ZGZmZikgfCAoMCA8PCAxMykpOyAvKiBQX3Jlc3RhcnRfY2NnID0gMCAqLwogCQlkaWI4MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDAsIChkaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgMCkgJiAweDdmZikgfCAoMCA8PCAxNSkgfCAoMSA8PCAxMykpOyAvKiBQX3Jlc3RhcnRfc2VhcmNoID0gMDsgKi8KLQl9IGVsc2UgaWYgKHN0YXRlLT5hdXRvc2VhcmNoX3N0YXRlID09IEFTX1NFQVJDSElOR19HVUFSRCkgeworCX0gZWxzZSBpZiAoKHN0YXRlLT5yZXZpc2lvbiA+PSAweDgwMDIpICYmCisJCSAgIChzdGF0ZS0+YXV0b3NlYXJjaF9zdGF0ZSA9PSBBU19TRUFSQ0hJTkdfR1VBUkQpKSB7CiAJCWMtPnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfOEs7CiAJCWMtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV84OwogCQljLT5pbnZlcnNpb24gPSAwOwpAQCAtMjU4Myw3ICsyNjUwLDggQEAKIAlzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MTYgaXJxX3BlbmRpbmcgPSBkaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgMTI4NCk7CiAKLQlpZiAoc3RhdGUtPmF1dG9zZWFyY2hfc3RhdGUgPT0gQVNfU0VBUkNISU5HX0ZGVCkgeworCWlmICgoc3RhdGUtPnJldmlzaW9uID49IDB4ODAwMikgJiYKKwkgICAgKHN0YXRlLT5hdXRvc2VhcmNoX3N0YXRlID09IEFTX1NFQVJDSElOR19GRlQpKSB7CiAJCWlmIChpcnFfcGVuZGluZyAmIDB4MSkgewogCQkJZHByaW50aygiZGliODAwMF9hdXRvc2VhcmNoX2lycTogbWF4IGNvcnJlbGF0aW9uIHJlc3VsdCBhdmFpbGFibGUiKTsKIAkJCXJldHVybiAzOwpAQCAtMjg1Myw2ICsyOTIxLDkxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogaXNfbWFudWFsX21vZGUgLSBDaGVjayBpZiBUTUNDIHNob3VsZCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJzIHNldHRpbmdzCisgKiBAYzoJc3RydWN0IGR2Yl9mcm9udGVuZF9wcm9wZXJ0aWVzCisgKgorICogQnkgZGVmYXVsdCwgVE1DQyB0YWJsZSBzaG91bGQgYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHNldHRpbmdzIG9uIG1vc3QKKyAqIHVzZXJjYXNlcy4gSG93ZXZlciwgc29tZXRpbWVzIGl0IGlzIGRlc2lyYWJsZSB0byBsb2NrIHRoZSBkZW1vZCB0bworICogdXNlIHRoZSBtYW51YWwgcGFyYW1ldGVycy4KKyAqCisgKiBPbiBtYW51YWwgbW9kZSwgdGhlIGN1cnJlbnQgZGliODAwMF90dW5lIHN0YXRlIG1hY2hpbmUgaXMgdmVyeSByZXN0cmljdDoKKyAqIEl0IHJlcXVpcmVzIHRoYXQgYm90aCBwZXItbGF5ZXIgYW5kIHBlci10cmFuc3BvbmRlciBwYXJhbWV0ZXJzIHRvIGJlCisgKiBwcm9wZXJseSBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgZGV2aWNlIHdvbid0IGxvY2suCisgKgorICogQ2hlY2sgaWYgYWxsIHRob3NlIGNvbmRpdGlvbnMgYXJlIHByb3Blcmx5IHNhdGlzZmllZCBiZWZvcmUgYWxsb3dpbmcKKyAqIHRoZSBkZXZpY2UgdG8gdXNlIHRoZSBtYW51YWwgZnJlcXVlbmN5IGxvY2sgbW9kZS4KKyAqLworc3RhdGljIGludCBpc19tYW51YWxfbW9kZShzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMpCit7CisJaW50IGksIG5fc2VncyA9IDA7CisKKwkvKiBVc2UgYXV0byBtb2RlIG9uIERWQi1UIGNvbXBhdCBtb2RlICovCisJaWYgKGMtPmRlbGl2ZXJ5X3N5c3RlbSAhPSBTWVNfSVNEQlQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUcmFuc21pc3Npb24gbW9kZSBpcyBvbmx5IGRldGVjdGVkIG9uIGF1dG8gbW9kZSwgY3VycmVudGx5CisJICovCisJaWYgKGMtPnRyYW5zbWlzc2lvbl9tb2RlID09IFRSQU5TTUlTU0lPTl9NT0RFX0FVVE8pIHsKKwkJZHByaW50aygidHJhbnNtaXNzaW9uIG1vZGUgYXV0byIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEd1YXJkIGludGVydmFsIGlzIG9ubHkgZGV0ZWN0ZWQgb24gYXV0byBtb2RlLCBjdXJyZW50bHkKKwkgKi8KKwlpZiAoYy0+Z3VhcmRfaW50ZXJ2YWwgPT0gR1VBUkRfSU5URVJWQUxfQVVUTykgeworCQlkcHJpbnRrKCJndWFyZCBpbnRlcnZhbCBhdXRvIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgbm8gbGF5ZXIgaXMgZW5hYmxlZCwgYXNzdW1lIGF1dG8gbW9kZSwgYXMgYXQgbGVhc3Qgb25lCisJICogbGF5ZXIgc2hvdWxkIGJlIGVuYWJsZWQKKwkgKi8KKwlpZiAoIWMtPmlzZGJ0X2xheWVyX2VuYWJsZWQpIHsKKwkJZHByaW50aygibm8gbGF5ZXIgbW9kdWxhdGlvbiBzcGVjaWZpZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcGVyLWxheWVyIHBhcmFtZXRlcnMgYXJlbid0IGF1dG8gYW5kCisJICogZGlzYWJsZSBhIGxheWVyIGlmIHNlZ21lbnQgY291bnQgaXMgMCBvciBpbnZhbGlkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCEoYy0+aXNkYnRfbGF5ZXJfZW5hYmxlZCAmIDEgPDwgaSkpCisJCQljb250aW51ZTsKKworCQlpZiAoKGMtPmxheWVyW2ldLnNlZ21lbnRfY291bnQgPiAxMykgfHwKKwkJICAgIChjLT5sYXllcltpXS5zZWdtZW50X2NvdW50ID09IDApKSB7CisJCQljLT5pc2RidF9sYXllcl9lbmFibGVkICY9IH4oMSA8PCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbl9zZWdzICs9IGMtPmxheWVyW2ldLnNlZ21lbnRfY291bnQ7CisKKwkJaWYgKChjLT5sYXllcltpXS5tb2R1bGF0aW9uID09IFFBTV9BVVRPKSB8fAorCQkgICAgKGMtPmxheWVyW2ldLmZlYyA9PSBGRUNfQVVUTykpIHsKKwkJCWRwcmludGsoImxheWVyICVjIGhhcyBlaXRoZXIgbW9kdWxhdGlvbiBvciBGRUMgYXV0byIsCisJCQkJJ0EnICsgaSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogVXNlcnNwYWNlIHNwZWNpZmllZCBhIHdyb25nIG51bWJlciBvZiBzZWdtZW50cy4KKwkgKglmYWxsYmFjayB0byBhdXRvIG1vZGUuCisJICovCisJaWYgKG5fc2VncyA9PSAwIHx8IG5fc2VncyA+IDEzKSB7CisJCWRwcmludGsoIm51bWJlciBvZiBzZWdtZW50cyBpcyBpbnZhbGlkIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEV2ZXJ5dGhpbmcgbG9va3Mgb2sgZm9yIG1hbnVhbCBtb2RlICovCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgZGliODAwMF90dW5lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtMjg3OCw0MCArMzAzMSwxOSBAQAogCiAJc3dpdGNoICgqdHVuZV9zdGF0ZSkgewogCWNhc2UgQ1RfREVNT0RfU1RBUlQ6IC8qIDMwICovCisJCQlkaWI4MDAwX3Jlc2V0X3N0YXRzKGZlKTsKKwogCQkJaWYgKHN0YXRlLT5yZXZpc2lvbiA9PSAweDgwOTApCiAJCQkJZGliODA5MHBfaW5pdF9zZHJhbShzdGF0ZSk7CiAJCQlzdGF0ZS0+c3RhdHVzID0gRkVfU1RBVFVTX1RVTkVfUEVORElORzsKLQkJCWlmICgoYy0+ZGVsaXZlcnlfc3lzdGVtICE9IFNZU19JU0RCVCkgfHwKLQkJCQkJKGMtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykgfHwKLQkJCQkJKGMtPnRyYW5zbWlzc2lvbl9tb2RlID09IFRSQU5TTUlTU0lPTl9NT0RFX0FVVE8pIHx8Ci0JCQkJCShjLT5ndWFyZF9pbnRlcnZhbCA9PSBHVUFSRF9JTlRFUlZBTF9BVVRPKSB8fAotCQkJCQkoKChjLT5pc2RidF9sYXllcl9lbmFibGVkICYgKDEgPDwgMCkpICE9IDApICYmCi0JCQkJCSAoYy0+bGF5ZXJbMF0uc2VnbWVudF9jb3VudCAhPSAweGZmKSAmJgotCQkJCQkgKGMtPmxheWVyWzBdLnNlZ21lbnRfY291bnQgIT0gMCkgJiYKLQkJCQkJICgoYy0+bGF5ZXJbMF0ubW9kdWxhdGlvbiA9PSBRQU1fQVVUTykgfHwKLQkJCQkJICAoYy0+bGF5ZXJbMF0uZmVjID09IEZFQ19BVVRPKSkpIHx8Ci0JCQkJCSgoKGMtPmlzZGJ0X2xheWVyX2VuYWJsZWQgJiAoMSA8PCAxKSkgIT0gMCkgJiYKLQkJCQkJIChjLT5sYXllclsxXS5zZWdtZW50X2NvdW50ICE9IDB4ZmYpICYmCi0JCQkJCSAoYy0+bGF5ZXJbMV0uc2VnbWVudF9jb3VudCAhPSAwKSAmJgotCQkJCQkgKChjLT5sYXllclsxXS5tb2R1bGF0aW9uID09IFFBTV9BVVRPKSB8fAotCQkJCQkgIChjLT5sYXllclsxXS5mZWMgPT0gRkVDX0FVVE8pKSkgfHwKLQkJCQkJKCgoYy0+aXNkYnRfbGF5ZXJfZW5hYmxlZCAmICgxIDw8IDIpKSAhPSAwKSAmJgotCQkJCQkgKGMtPmxheWVyWzJdLnNlZ21lbnRfY291bnQgIT0gMHhmZikgJiYKLQkJCQkJIChjLT5sYXllclsyXS5zZWdtZW50X2NvdW50ICE9IDApICYmCi0JCQkJCSAoKGMtPmxheWVyWzJdLm1vZHVsYXRpb24gPT0gUUFNX0FVVE8pIHx8Ci0JCQkJCSAgKGMtPmxheWVyWzJdLmZlYyA9PSBGRUNfQVVUTykpKSB8fAotCQkJCQkoKChjLT5sYXllclswXS5zZWdtZW50X2NvdW50ID09IDApIHx8Ci0JCQkJCSAgKChjLT5pc2RidF9sYXllcl9lbmFibGVkICYgKDEgPDwgMCkpID09IDApKSAmJgotCQkJCQkgKChjLT5sYXllclsxXS5zZWdtZW50X2NvdW50ID09IDApIHx8Ci0JCQkJCSAgKChjLT5pc2RidF9sYXllcl9lbmFibGVkICYgKDIgPDwgMCkpID09IDApKSAmJgotCQkJCQkgKChjLT5sYXllclsyXS5zZWdtZW50X2NvdW50ID09IDApIHx8ICgoYy0+aXNkYnRfbGF5ZXJfZW5hYmxlZCAmICgzIDw8IDApKSA9PSAwKSkpKQotCQkJCXN0YXRlLT5jaGFubmVsX3BhcmFtZXRlcnNfc2V0ID0gMDsgLyogYXV0byBzZWFyY2ggKi8KLQkJCWVsc2UKLQkJCQlzdGF0ZS0+Y2hhbm5lbF9wYXJhbWV0ZXJzX3NldCA9IDE7IC8qIGNoYW5uZWwgcGFyYW1ldGVycyBhcmUga25vd24gKi8KKwkJCXN0YXRlLT5jaGFubmVsX3BhcmFtZXRlcnNfc2V0ID0gaXNfbWFudWFsX21vZGUoYyk7CisKKwkJCWRwcmludGsoIlR1bmluZyBjaGFubmVsIG9uICVzIHNlYXJjaCBtb2RlIiwKKwkJCQlzdGF0ZS0+Y2hhbm5lbF9wYXJhbWV0ZXJzX3NldCA/ICJtYW51YWwiIDogImF1dG8iKTsKIAogCQkJZGliODAwMF92aXRlcmJpX3N0YXRlKHN0YXRlLCAwKTsgLyogZm9yY2UgY2hhbiBkZWMgaW4gcmVzdGFydCAqLwogCi0JCQkvKiBMYXllciBtb25pdCAqLworCQkJLyogTGF5ZXIgbW9uaXRvciAqLwogCQkJZGliODAwMF93cml0ZV93b3JkKHN0YXRlLCAyODUsIGRpYjgwMDBfcmVhZF93b3JkKHN0YXRlLCAyODUpICYgMHg2MCk7CiAKIAkJCWRpYjgwMDBfc2V0X2ZyZXF1ZW5jeV9vZmZzZXQoc3RhdGUpOwpAQCAtMzI1NiwxNSArMzM4OCwyNyBAQAogCXJldHVybiBkaWI4MDAwX3NldF9hZGNfc3RhdGUoc3RhdGUsIERJQlgwMDBfU0xPV19BRENfT0ZGKSB8IGRpYjgwMDBfc2V0X2FkY19zdGF0ZShzdGF0ZSwgRElCWDAwMF9BRENfT0ZGKTsKIH0KIAorc3RhdGljIGludCBkaWI4MDAwX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqIHN0YXQpOworCiBzdGF0aWMgaW50IGRpYjgwMDBfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXUxNiBpLCB2YWwgPSAwOwotCWZlX3N0YXR1c190IHN0YXQ7CisJZmVfc3RhdHVzX3Qgc3RhdCA9IDA7CiAJdTggaW5kZXhfZnJvbnRlbmQsIHN1Yl9pbmRleF9mcm9udGVuZDsKIAogCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuYmFuZHdpZHRoX2h6ID0gNjAwMDAwMDsKIAorCS8qCisJICogSWYgY2FsbGVkIHRvIGVhcmx5LCBnZXRfZnJvbnRlbmQgbWFrZXMgZGliODAwMF90dW5lIHRvIGVpdGhlcgorCSAqIG5vdCBsb2NrIG9yIG5vdCBzeW5jLiBUaGlzIGNhdXNlcyBkdmJ2NS1zY2FuL2R2YnY1LXphcCB0byBmYWlsLgorCSAqIFNvLCBsZXQncyBqdXN0IHJldHVybiBpZiBmcm9udGVuZCAwIGhhcyBub3QgbG9ja2VkLgorCSAqLworCWRpYjgwMDBfcmVhZF9zdGF0dXMoZmUsICZzdGF0KTsKKwlpZiAoIShzdGF0ICYgRkVfSEFTX1NZTkMpKQorCQlyZXR1cm4gMDsKKworCWRwcmludGsoIlRNQ0MgbG9jayIpOwogCWZvciAoaW5kZXhfZnJvbnRlbmQgPSAxOyAoaW5kZXhfZnJvbnRlbmQgPCBNQVhfTlVNQkVSX09GX0ZST05URU5EUykgJiYgKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0gIT0gTlVMTCk7IGluZGV4X2Zyb250ZW5kKyspIHsKIAkJc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXS0+b3BzLnJlYWRfc3RhdHVzKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0sICZzdGF0KTsKIAkJaWYgKHN0YXQmRkVfSEFTX1NZTkMpIHsKQEAgLTMzMzUsOSArMzQ3OSwxMyBAQAogCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmxheWVyW2ldLnNlZ21lbnRfY291bnQgPSB2YWwgJiAweDBGOwogCQlkcHJpbnRrKCJkaWI4MDAwX2dldF9mcm9udGVuZCA6IExheWVyICVkIHNlZ21lbnRzID0gJWQgIiwgaSwgZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5sYXllcltpXS5zZWdtZW50X2NvdW50KTsKIAotCQl2YWwgPSBkaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgNDk5ICsgaSk7Ci0JCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUubGF5ZXJbaV0uaW50ZXJsZWF2aW5nID0gdmFsICYgMHgzOwotCQlkcHJpbnRrKCJkaWI4MDAwX2dldF9mcm9udGVuZCA6IExheWVyICVkIHRpbWVfaW50bHYgPSAlZCAiLCBpLCBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmxheWVyW2ldLmludGVybGVhdmluZyk7CisJCXZhbCA9IGRpYjgwMDBfcmVhZF93b3JkKHN0YXRlLCA0OTkgKyBpKSAmIDB4MzsKKwkJLyogSW50ZXJsZWF2aW5nIGNhbiBiZSAwLCAxLCAyIG9yIDQgKi8KKwkJaWYgKHZhbCA9PSAzKQorCQkJdmFsID0gNDsKKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5sYXllcltpXS5pbnRlcmxlYXZpbmcgPSB2YWw7CisJCWRwcmludGsoImRpYjgwMDBfZ2V0X2Zyb250ZW5kIDogTGF5ZXIgJWQgdGltZV9pbnRsdiA9ICVkICIsCisJCQlpLCBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmxheWVyW2ldLmludGVybGVhdmluZyk7CiAKIAkJdmFsID0gZGliODAwMF9yZWFkX3dvcmQoc3RhdGUsIDQ4MSArIGkpOwogCQlzd2l0Y2ggKHZhbCAmIDB4NykgewpAQCAtMzU1Niw2ICszNzA0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkaWI4MDAwX2dldF9zdGF0cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3Qgc3RhdCk7CisKIHN0YXRpYyBpbnQgZGliODAwMF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKiBzdGF0KQogewogCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtMzU5Myw2ICszNzQzLDcgQEAKIAkJaWYgKGxvY2sgJiAweDAxKQogCQkJKnN0YXQgfD0gRkVfSEFTX1ZJVEVSQkk7CiAJfQorCWRpYjgwMDBfZ2V0X3N0YXRzKGZlLCAqc3RhdCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2OTksNiArMzg1MCwzNTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IHBlcl9sYXllcl9yZWdzIHsKKwl1MTYgbG9jaywgYmVyLCBwZXI7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBlcl9sYXllcl9yZWdzIHBlcl9sYXllcl9yZWdzW10gPSB7CisJeyA1NTQsIDU2MCwgNTYyIH0sCisJeyA1NTUsIDU3NiwgNTc4IH0sCisJeyA1NTYsIDU4MSwgNTgzIH0sCit9OworCitzdHJ1Y3QgbGluZWFyX3NlZ21lbnRzIHsKKwl1bnNpZ25lZCB4OworCXNpZ25lZCB5OworfTsKKworLyoKKyAqIFRhYmxlIHRvIGVzdGltYXRlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0uCisgKiBUaGlzIHRhYmxlIHdhcyBlbXBpcmljYWxseSBkZXRlcm1pbmF0ZWQgYnkgbWVhc3VyaW5nIHRoZSBzaWduYWwKKyAqIHN0cmVuZ3RoIGdlbmVyYXRlZCBieSBhIERUQS0yMTExIFJGIGdlbmVyYXRvciBkaXJlY3RseSBjb25uZWN0ZWQgaW50bworICogYSBkaWI4MDc2IGRldmljZSAoYSBQaXhlbFZpZXcgUFYtRDIzMVUgc3RpY2spLCB1c2luZyBhIGdvb2QgcXVhbGl0eQorICogMyBtZXRlcnMgUkM2IGNhYmxlIGFuZCBnb29kIFJDNiBjb25uZWN0b3JzLgorICogVGhlIHJlYWwgdmFsdWUgY2FuIGFjdHVhbGx5IGJlIGRpZmZlcmVudCBvbiBvdGhlciBkZXZpY2VzLCBkZXBlbmRpbmcKKyAqIG9uIHNldmVyYWwgZmFjdG9ycywgbGlrZSBpZiBMTkEgaXMgZW5hYmxlZCBvciBub3QsIGlmIGRpdmVyc2l0eSBpcworICogZW5hYmxlZCwgdHlwZSBvZiBjb25uZWN0b3JzLCBldGMuCisgKiBZZXQsIGl0IGlzIGJldHRlciB0byB1c2UgdGhpcyBtZWFzdXJlIGluIGRCIHRoYW4gYSByYW5kb20gbm9uLWxpbmVhcgorICogcGVyY2VudGFnZSB2YWx1ZSwgZXNwZWNpYWxseSBmb3IgYW50ZW5uYSBhZGp1c3RtZW50cy4KKyAqIE9uIG15IHRlc3RzLCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBtZWFzdXJlIHVzaW5nIHRoaXMgdGFibGUgaXMgYWJvdXQKKyAqIDAuNSBkQiwgd2l0aCBzb3VuZHMgcmVhc29uYWJsZSBlbm91Z2guCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGluZWFyX3NlZ21lbnRzIHN0cmVuZ3RoX3RvX2RiX3RhYmxlW10gPSB7CisJeyA1NTk1MywgMTA4NTAwIH0sCS8qIC0yMi41IGRCbSAqLworCXsgNTUzOTQsIDEwODAwMCB9LAorCXsgNTM4MzQsIDEwNzAwMCB9LAorCXsgNTI4NjMsIDEwNjAwMCB9LAorCXsgNTIyMzksIDEwNTAwMCB9LAorCXsgNTIwMTIsIDEwNDAwMCB9LAorCXsgNTE4MDMsIDEwMzAwMCB9LAorCXsgNTE1NjYsIDEwMjAwMCB9LAorCXsgNTEzNTYsIDEwMTAwMCB9LAorCXsgNTExMTIsIDEwMDAwMCB9LAorCXsgNTA4NjksICA5OTAwMCB9LAorCXsgNTA2MDAsICA5ODAwMCB9LAorCXsgNTAzNjMsICA5NzAwMCB9LAorCXsgNTAxMTcsICA5NjAwMCB9LAkvKiAtMzUgZEJtICovCisJeyA0OTg4OSwgIDk1MDAwIH0sCisJeyA0OTY4MCwgIDk0MDAwIH0sCisJeyA0OTQ5MywgIDkzMDAwIH0sCisJeyA0OTMwMiwgIDkyMDAwIH0sCisJeyA0ODkyOSwgIDkxMDAwIH0sCisJeyA0ODQxNiwgIDkwMDAwIH0sCisJeyA0ODAzNSwgIDg5MDAwIH0sCisJeyA0NzU5MywgIDg4MDAwIH0sCisJeyA0NzI4MiwgIDg3MDAwIH0sCisJeyA0Njk1MywgIDg2MDAwIH0sCisJeyA0NjY5OCwgIDg1MDAwIH0sCisJeyA0NTYxNywgIDg0MDAwIH0sCisJeyA0NDc3MywgIDgzMDAwIH0sCisJeyA0Mzg0NSwgIDgyMDAwIH0sCisJeyA0MzAyMCwgIDgxMDAwIH0sCisJeyA0MjAxMCwgIDgwMDAwIH0sCS8qIC01MSBkQm0gKi8KKwl7ICAgICAwLCAgICAgIDAgfSwKK307CisKK3N0YXRpYyB1MzIgaW50ZXJwb2xhdGVfdmFsdWUodTMyIHZhbHVlLCBzdHJ1Y3QgbGluZWFyX3NlZ21lbnRzICpzZWdtZW50cywKKwkJCSAgICAgdW5zaWduZWQgbGVuKQoreworCXU2NCB0bXA2NDsKKwl1MzIgZHg7CisJczMyIGR5OworCWludCBpLCByZXQ7CisKKwlpZiAodmFsdWUgPj0gc2VnbWVudHNbMF0ueCkKKwkJcmV0dXJuIHNlZ21lbnRzWzBdLnk7CisJaWYgKHZhbHVlIDwgc2VnbWVudHNbbGVuLTFdLngpCisJCXJldHVybiBzZWdtZW50c1tsZW4tMV0ueTsKKworCWZvciAoaSA9IDE7IGkgPCBsZW4gLSAxOyBpKyspIHsKKwkJLyogSWYgdmFsdWUgaXMgaWRlbnRpY2FsLCBubyBuZWVkIHRvIGludGVycG9sYXRlICovCisJCWlmICh2YWx1ZSA9PSBzZWdtZW50c1tpXS54KQorCQkJcmV0dXJuIHNlZ21lbnRzW2ldLnk7CisJCWlmICh2YWx1ZSA+IHNlZ21lbnRzW2ldLngpCisJCQlicmVhazsKKwl9CisKKwkvKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB0d28gKHgseSkgcG9pbnRzICovCisJZHkgPSBzZWdtZW50c1tpIC0gMV0ueSAtIHNlZ21lbnRzW2ldLnk7CisJZHggPSBzZWdtZW50c1tpIC0gMV0ueCAtIHNlZ21lbnRzW2ldLng7CisKKwl0bXA2NCA9IHZhbHVlIC0gc2VnbWVudHNbaV0ueDsKKwl0bXA2NCAqPSBkeTsKKwlkb19kaXYodG1wNjQsIGR4KTsKKwlyZXQgPSBzZWdtZW50c1tpXS55ICsgdG1wNjQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGRpYjgwMDBfZ2V0X3RpbWVfdXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBsYXllcikKK3sKKwlzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmc3RhdGUtPmZlWzBdLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJaW50IGluaV9sYXllciwgZW5kX2xheWVyLCBpOworCXU2NCB0aW1lX3VzLCB0bXA2NDsKKwl1MzIgdG1wLCBkZW5vbTsKKwlpbnQgZ3VhcmQsIHJhdGVfbnVtLCByYXRlX2RlbnVtID0gMSwgYml0c19wZXJfc3ltYm9sLCBuc2VnczsKKwlpbnQgaW50ZXJsZWF2aW5nID0gMCwgZmZ0X2RpdjsKKworCWlmIChsYXllciA+PSAwKSB7CisJCWluaV9sYXllciA9IGxheWVyOworCQllbmRfbGF5ZXIgPSBsYXllciArIDE7CisJfSBlbHNlIHsKKwkJaW5pX2xheWVyID0gMDsKKwkJZW5kX2xheWVyID0gMzsKKwl9CisKKwlzd2l0Y2ggKGMtPmd1YXJkX2ludGVydmFsKSB7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzQ6CisJCWd1YXJkID0gNDsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CisJCWd1YXJkID0gODsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzE2OgorCQlndWFyZCA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKKwkJZ3VhcmQgPSAzMjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjLT50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CisJCWZmdF9kaXYgPSA0OworCQlicmVhazsKKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzRLOgorCQlmZnRfZGl2ID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgorCQlmZnRfZGl2ID0gMTsKKwkJYnJlYWs7CisJfQorCisJZGVub20gPSAwOworCWZvciAoaSA9IGluaV9sYXllcjsgaSA8IGVuZF9sYXllcjsgaSsrKSB7CisJCW5zZWdzID0gYy0+bGF5ZXJbaV0uc2VnbWVudF9jb3VudDsKKwkJaWYgKG5zZWdzID09IDAgfHwgbnNlZ3MgPiAxMykKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoYy0+bGF5ZXJbaV0ubW9kdWxhdGlvbikgeworCQljYXNlIERRUFNLOgorCQljYXNlIFFQU0s6CisJCQliaXRzX3Blcl9zeW1ib2wgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzE2OgorCQkJYml0c19wZXJfc3ltYm9sID0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFFBTV82NDoKKwkJCWJpdHNfcGVyX3N5bWJvbCA9IDY7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoYy0+bGF5ZXJbaV0uZmVjKSB7CisJCWNhc2UgRkVDXzFfMjoKKwkJCXJhdGVfbnVtID0gMTsKKwkJCXJhdGVfZGVudW0gPSAyOworCQkJYnJlYWs7CisJCWNhc2UgRkVDXzJfMzoKKwkJCXJhdGVfbnVtID0gMjsKKwkJCXJhdGVfZGVudW0gPSAzOworCQkJYnJlYWs7CisJCWNhc2UgRkVDXzNfNDoKKwkJCXJhdGVfbnVtID0gMzsKKwkJCXJhdGVfZGVudW0gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgRkVDXzVfNjoKKwkJCXJhdGVfbnVtID0gNTsKKwkJCXJhdGVfZGVudW0gPSA2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgRkVDXzdfODoKKwkJCXJhdGVfbnVtID0gNzsKKwkJCXJhdGVfZGVudW0gPSA4OworCQkJYnJlYWs7CisJCX0KKworCQlpbnRlcmxlYXZpbmcgPSBjLT5sYXllcltpXS5pbnRlcmxlYXZpbmc7CisKKwkJZGVub20gKz0gYml0c19wZXJfc3ltYm9sICogcmF0ZV9udW0gKiBmZnRfZGl2ICogbnNlZ3MgKiAzODQ7CisJfQorCisJLyogSWYgYWxsIGdvZXMgd3JvbmcsIHdhaXQgZm9yIDFzIGZvciB0aGUgbmV4dCBzdGF0cyAqLworCWlmICghZGVub20pCisJCXJldHVybiAwOworCisJLyogRXN0aW1hdGUgdGhlIHBlcmlvZCBmb3IgdGhlIHRvdGFsIGJpdCByYXRlICovCisJdGltZV91cyA9IHJhdGVfZGVudW0gKiAoMTAwOCAqIDE1NjI1MDBMKTsKKwl0bXA2NCA9IHRpbWVfdXM7CisJZG9fZGl2KHRtcDY0LCBndWFyZCk7CisJdGltZV91cyA9IHRpbWVfdXMgKyB0bXA2NDsKKwl0aW1lX3VzICs9IGRlbm9tIC8gMjsKKwlkb19kaXYodGltZV91cywgZGVub20pOworCisJdG1wID0gMTAwOCAqIDk2ICogaW50ZXJsZWF2aW5nOworCXRpbWVfdXMgKz0gdG1wICsgdG1wIC8gZ3VhcmQ7CisKKwlyZXR1cm4gdGltZV91czsKK30KKworc3RhdGljIGludCBkaWI4MDAwX2dldF9zdGF0cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3Qgc3RhdCkKK3sKKwlzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmc3RhdGUtPmZlWzBdLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJaW50IGk7CisJaW50IHNob3dfcGVyX3N0YXRzID0gMDsKKwl1MzIgdGltZV91cyA9IDAsIHNuciwgdmFsOworCXU2NCBibG9ja3M7CisJczMyIGRiOworCXUxNiBzdHJlbmd0aDsKKworCS8qIEdldCBTaWduYWwgc3RyZW5ndGggKi8KKwlkaWI4MDAwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKGZlLCAmc3RyZW5ndGgpOworCXZhbCA9IHN0cmVuZ3RoOworCWRiID0gaW50ZXJwb2xhdGVfdmFsdWUodmFsLAorCQkJICAgICAgIHN0cmVuZ3RoX3RvX2RiX3RhYmxlLAorCQkJICAgICAgIEFSUkFZX1NJWkUoc3RyZW5ndGhfdG9fZGJfdGFibGUpKSAtIDEzMTAwMDsKKwljLT5zdHJlbmd0aC5zdGF0WzBdLnN2YWx1ZSA9IGRiOworCisJLyogVUNCL0JFUi9DTlIgbWVhc3VyZXMgcmVxdWlyZSBsb2NrICovCisJaWYgKCEoc3RhdCAmIEZFX0hBU19MT0NLKSkgeworCQljLT5jbnIubGVuID0gMTsKKwkJYy0+YmxvY2tfY291bnQubGVuID0gMTsKKwkJYy0+YmxvY2tfZXJyb3IubGVuID0gMTsKKwkJYy0+cG9zdF9iaXRfZXJyb3IubGVuID0gMTsKKwkJYy0+cG9zdF9iaXRfY291bnQubGVuID0gMTsKKwkJYy0+Y25yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCQljLT5wb3N0X2JpdF9lcnJvci5zdGF0WzBdLnNjYWxlID0gRkVfU0NBTEVfTk9UX0FWQUlMQUJMRTsKKwkJYy0+cG9zdF9iaXRfY291bnQuc3RhdFswXS5zY2FsZSA9IEZFX1NDQUxFX05PVF9BVkFJTEFCTEU7CisJCWMtPmJsb2NrX2Vycm9yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9OT1RfQVZBSUxBQkxFOworCQljLT5ibG9ja19jb3VudC5zdGF0WzBdLnNjYWxlID0gRkVfU0NBTEVfTk9UX0FWQUlMQUJMRTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgdGltZSBmb3Igc3RhdHMgd2FzIGVsYXBzZWQgKi8KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGF0ZS0+cGVyX2ppZmZpZXNfc3RhdHMpKSB7CisJCXN0YXRlLT5wZXJfamlmZmllc19zdGF0cyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJCS8qIEdldCBTTlIgKi8KKwkJc25yID0gZGliODAwMF9nZXRfc25yKGZlKTsKKwkJZm9yIChpID0gMTsgaSA8IE1BWF9OVU1CRVJfT0ZfRlJPTlRFTkRTOyBpKyspIHsKKwkJCWlmIChzdGF0ZS0+ZmVbaV0pCisJCQkJc25yICs9IGRpYjgwMDBfZ2V0X3NucihzdGF0ZS0+ZmVbaV0pOworCQl9CisJCXNuciA9IHNuciA+PiAxNjsKKworCQlpZiAoc25yKSB7CisJCQlzbnIgPSAxMCAqIGludGxvZzEwKHNucik7CisJCQlzbnIgPSAoMTAwMEwgKiBzbnIpID4+IDI0OworCQl9IGVsc2UgeworCQkJc25yID0gMDsKKwkJfQorCQljLT5jbnIuc3RhdFswXS5zdmFsdWUgPSBzbnI7CisJCWMtPmNuci5zdGF0WzBdLnNjYWxlID0gRkVfU0NBTEVfREVDSUJFTDsKKworCQkvKiBHZXQgVUNCIG1lYXN1cmVzICovCisJCWRpYjgwMDBfcmVhZF91bmNfYmxvY2tzKGZlLCAmdmFsKTsKKwkJaWYgKHZhbCA8IHN0YXRlLT5pbml0X3VjYikKKwkJCXN0YXRlLT5pbml0X3VjYiArPSAweDEwMDAwMDAwMExMOworCisJCWMtPmJsb2NrX2Vycm9yLnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9DT1VOVEVSOworCQljLT5ibG9ja19lcnJvci5zdGF0WzBdLnV2YWx1ZSA9IHZhbCArIHN0YXRlLT5pbml0X3VjYjsKKworCQkvKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgYmFzZWQgb24gYml0cmF0ZSAqLworCQlpZiAoIXRpbWVfdXMpCisJCQl0aW1lX3VzID0gZGliODAwMF9nZXRfdGltZV91cyhmZSwgLTEpOworCisJCWlmICh0aW1lX3VzKSB7CisJCQlibG9ja3MgPSAxMjUwMDAwVUxMICogMTAwMDAwMFVMTDsKKwkJCWRvX2RpdihibG9ja3MsIHRpbWVfdXMgKiA4ICogMjA0KTsKKwkJCWMtPmJsb2NrX2NvdW50LnN0YXRbMF0uc2NhbGUgPSBGRV9TQ0FMRV9DT1VOVEVSOworCQkJYy0+YmxvY2tfY291bnQuc3RhdFswXS51dmFsdWUgKz0gYmxvY2tzOworCQl9CisKKwkJc2hvd19wZXJfc3RhdHMgPSAxOworCX0KKworCS8qIEdldCBwb3N0LUJFUiBtZWFzdXJlcyAqLworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXRlLT5iZXJfamlmZmllc19zdGF0cykpIHsKKwkJdGltZV91cyA9IGRpYjgwMDBfZ2V0X3RpbWVfdXMoZmUsIC0xKTsKKwkJc3RhdGUtPmJlcl9qaWZmaWVzX3N0YXRzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoKHRpbWVfdXMgKyA1MDApIC8gMTAwMCk7CisKKwkJZHByaW50aygiTmV4dCBhbGwgbGF5ZXJzIHN0YXRzIGF2YWlsYWJsZSBpbiAldSB1cy4iLCB0aW1lX3VzKTsKKworCQlkaWI4MDAwX3JlYWRfYmVyKGZlLCAmdmFsKTsKKwkJYy0+cG9zdF9iaXRfZXJyb3Iuc3RhdFswXS5zY2FsZSA9IEZFX1NDQUxFX0NPVU5URVI7CisJCWMtPnBvc3RfYml0X2Vycm9yLnN0YXRbMF0udXZhbHVlICs9IHZhbDsKKworCQljLT5wb3N0X2JpdF9jb3VudC5zdGF0WzBdLnNjYWxlID0gRkVfU0NBTEVfQ09VTlRFUjsKKwkJYy0+cG9zdF9iaXRfY291bnQuc3RhdFswXS51dmFsdWUgKz0gMTAwMDAwMDAwOworCX0KKworCWlmIChzdGF0ZS0+cmV2aXNpb24gPCAweDgwMDIpCisJCXJldHVybiAwOworCisJYy0+YmxvY2tfZXJyb3IubGVuID0gNDsKKwljLT5wb3N0X2JpdF9lcnJvci5sZW4gPSA0OworCWMtPnBvc3RfYml0X2NvdW50LmxlbiA9IDQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXVuc2lnbmVkIG5zZWdzID0gYy0+bGF5ZXJbaV0uc2VnbWVudF9jb3VudDsKKworCQlpZiAobnNlZ3MgPT0gMCB8fCBuc2VncyA+IDEzKQorCQkJY29udGludWU7CisKKwkJdGltZV91cyA9IDA7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhdGUtPmJlcl9qaWZmaWVzX3N0YXRzX2xheWVyW2ldKSkgeworCQkJdGltZV91cyA9IGRpYjgwMDBfZ2V0X3RpbWVfdXMoZmUsIGkpOworCisJCQlzdGF0ZS0+YmVyX2ppZmZpZXNfc3RhdHNfbGF5ZXJbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygodGltZV91cyArIDUwMCkgLyAxMDAwKTsKKwkJCWRwcmludGsoIk5leHQgbGF5ZXIgJWMgIHN0YXRzIHdpbGwgYmUgYXZhaWxhYmxlIGluICV1IHVzXG4iLAorCQkJCSdBJyArIGksIHRpbWVfdXMpOworCisJCQl2YWwgPSBkaWI4MDAwX3JlYWRfd29yZChzdGF0ZSwgcGVyX2xheWVyX3JlZ3NbaV0uYmVyKTsKKwkJCWMtPnBvc3RfYml0X2Vycm9yLnN0YXRbMSArIGldLnNjYWxlID0gRkVfU0NBTEVfQ09VTlRFUjsKKwkJCWMtPnBvc3RfYml0X2Vycm9yLnN0YXRbMSArIGldLnV2YWx1ZSArPSB2YWw7CisKKwkJCWMtPnBvc3RfYml0X2NvdW50LnN0YXRbMSArIGldLnNjYWxlID0gRkVfU0NBTEVfQ09VTlRFUjsKKwkJCWMtPnBvc3RfYml0X2NvdW50LnN0YXRbMSArIGldLnV2YWx1ZSArPSAxMDAwMDAwMDA7CisJCX0KKworCQlpZiAoc2hvd19wZXJfc3RhdHMpIHsKKwkJCXZhbCA9IGRpYjgwMDBfcmVhZF93b3JkKHN0YXRlLCBwZXJfbGF5ZXJfcmVnc1tpXS5wZXIpOworCisJCQljLT5ibG9ja19lcnJvci5zdGF0WzEgKyBpXS5zY2FsZSA9IEZFX1NDQUxFX0NPVU5URVI7CisJCQljLT5ibG9ja19lcnJvci5zdGF0WzEgKyBpXS51dmFsdWUgKz0gdmFsOworCisJCQlpZiAoIXRpbWVfdXMpCisJCQkJdGltZV91cyA9IGRpYjgwMDBfZ2V0X3RpbWVfdXMoZmUsIGkpOworCQkJaWYgKHRpbWVfdXMpIHsKKwkJCQlibG9ja3MgPSAxMjUwMDAwVUxMICogMTAwMDAwMFVMTDsKKwkJCQlkb19kaXYoYmxvY2tzLCB0aW1lX3VzICogOCAqIDIwNCk7CisJCQkJYy0+YmxvY2tfY291bnQuc3RhdFswXS5zY2FsZSA9IEZFX1NDQUxFX0NPVU5URVI7CisJCQkJYy0+YmxvY2tfY291bnQuc3RhdFswXS51dmFsdWUgKz0gYmxvY2tzOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCiBpbnQgZGliODAwMF9zZXRfc2xhdmVfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlX3NsYXZlKQogewogCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2RyeGsuaCBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9kcnhrLmgKaW5kZXggZjIyZWI5Zi4uZjZjYjM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2RyeGsuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvZHJ4ay5oCkBAIC0yOSw3ICsyOSw2IEBACiAgKgkJCQlBIHZhbHVlIG9mIDAgKGRlZmF1bHQpIG9yIGxvd2VyIGluZGljYXRlcyB0aGF0CiAgKgkJCQl0aGUgY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyB3aWxsIGJlCiAgKgkJCQlhdXRvbWF0aWNhbGx5IGRldGVjdGVkLgotICogQGxvYWRfZmlybXdhcmVfc3luYzoJCUZvcmNlIHRoZSBmaXJtd2FyZSBsb2FkIHRvIGJlIHN5bmNocm9ub3VzLgogICoKICAqIE9uIHRoZSAqX2dwaW8gdmFycywgYml0IDAgaXMgVUlPLTEsIGJpdCAxIGlzIFVJTy0yIGFuZCBiaXQgMiBpcwogICogVUlPLTMuCkBAIC00MSw3ICs0MCw2IEBACiAJYm9vbAlwYXJhbGxlbF90czsKIAlib29sCWR5bmFtaWNfY2xrOwogCWJvb2wJZW5hYmxlX21lcnJfY2ZnOwotCWJvb2wJbG9hZF9maXJtd2FyZV9zeW5jOwogCiAJYm9vbAlhbnRlbm5hX2R2YnQ7CiAJdTE2CWFudGVubmFfZ3BpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9kcnhrX2hhcmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9kcnhrX2hhcmQuYwppbmRleCBiZjI5YTNmLi5jY2U5NGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvZHJ4a19oYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL2RyeGtfaGFyZC5jCkBAIC02ODMwLDI1ICs2ODMwLDEzIEBACiAKIAkvKiBMb2FkIGZpcm13YXJlIGFuZCBpbml0aWFsaXplIERSWC1LICovCiAJaWYgKHN0YXRlLT5taWNyb2NvZGVfbmFtZSkgewotCQlpZiAoY29uZmlnLT5sb2FkX2Zpcm13YXJlX3N5bmMpIHsKLQkJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKIAotCQkJc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIHN0YXRlLT5taWNyb2NvZGVfbmFtZSwKLQkJCQkJCSAgc3RhdGUtPmkyYy0+ZGV2LnBhcmVudCk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlmdyA9IE5VTEw7Ci0JCQlsb2FkX2Zpcm13YXJlX2NiKGZ3LCBzdGF0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwKLQkJCQkJICAgICAgc3RhdGUtPm1pY3JvY29kZV9uYW1lLAotCQkJCQkgICAgICBzdGF0ZS0+aTJjLT5kZXYucGFyZW50LAotCQkJCQkgICAgICBHRlBfS0VSTkVMLAotCQkJCQkgICAgICBzdGF0ZSwgbG9hZF9maXJtd2FyZV9jYik7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCXByX2VycigiZmFpbGVkIHRvIHJlcXVlc3QgYSBmaXJtd2FyZVxuIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KKwkJc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIHN0YXRlLT5taWNyb2NvZGVfbmFtZSwKKwkJCQkJICBzdGF0ZS0+aTJjLT5kZXYucGFyZW50KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlmdyA9IE5VTEw7CisJCWxvYWRfZmlybXdhcmVfY2IoZncsIHN0YXRlKTsKIAl9IGVsc2UgaWYgKGluaXRfZHJ4ayhzdGF0ZSkgPCAwKQogCQlnb3RvIGVycm9yOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4ZHMzMTAzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4ZHMzMTAzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhNzg5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDMuYwpAQCAtMCwwICsxLDEzMTEgQEAKKy8qCisgKiBNb250YWdlIE04OERTMzEwMyBkZW1vZHVsYXRvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJtODhkczMxMDNfcHJpdi5oIgorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbTg4ZHMzMTAzX29wczsKKworLyogd3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IG04OGRzMzEwM193cl9yZWdzKHN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiwKKwkJdTggcmVnLCBjb25zdCB1OCAqdmFsLCBpbnQgbGVuKQoreworI2RlZmluZSBNQVhfV1JfTEVOIDMyCisjZGVmaW5lIE1BWF9XUl9YRkVSX0xFTiAoTUFYX1dSX0xFTiArIDEpCisJaW50IHJldDsKKwl1OCBidWZbTUFYX1dSX1hGRVJfTEVOXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMV0gPSB7CisJCXsKKwkJCS5hZGRyID0gcHJpdi0+Y2ZnLT5pMmNfYWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSArIGxlbiwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJaWYgKFdBUk5fT04obGVuID4gTUFYX1dSX0xFTikpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gcmVnOworCW1lbWNweSgmYnVmWzFdLCB2YWwsIGxlbik7CisKKwltdXRleF9sb2NrKCZwcml2LT5pMmNfbXV0ZXgpOworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZywgMSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5pMmNfbXV0ZXgpOworCWlmIChyZXQgPT0gMSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCWRldl93YXJuKCZwcml2LT5pMmMtPmRldiwKKwkJCQkiJXM6IGkyYyB3ciBmYWlsZWQ9JWQgcmVnPSUwMnggbGVuPSVkXG4iLAorCQkJCUtCVUlMRF9NT0ROQU1FLCByZXQsIHJlZywgbGVuKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiByZWFkIG11bHRpcGxlIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBtODhkczMxMDNfcmRfcmVncyhzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYsCisJCXU4IHJlZywgdTggKnZhbCwgaW50IGxlbikKK3sKKyNkZWZpbmUgTUFYX1JEX0xFTiAzCisjZGVmaW5lIE1BWF9SRF9YRkVSX0xFTiAoTUFYX1JEX0xFTikKKwlpbnQgcmV0OworCXU4IGJ1ZltNQVhfUkRfWEZFUl9MRU5dOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBwcml2LT5jZmctPmkyY19hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9ICZyZWcsCisJCX0sIHsKKwkJCS5hZGRyID0gcHJpdi0+Y2ZnLT5pMmNfYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IGxlbiwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJaWYgKFdBUk5fT04obGVuID4gTUFYX1JEX0xFTikpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmcHJpdi0+aTJjX211dGV4KTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDIpOworCW11dGV4X3VubG9jaygmcHJpdi0+aTJjX211dGV4KTsKKwlpZiAocmV0ID09IDIpIHsKKwkJbWVtY3B5KHZhbCwgYnVmLCBsZW4pOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCWRldl93YXJuKCZwcml2LT5pMmMtPmRldiwKKwkJCQkiJXM6IGkyYyByZCBmYWlsZWQ9JWQgcmVnPSUwMnggbGVuPSVkXG4iLAorCQkJCUtCVUlMRF9NT0ROQU1FLCByZXQsIHJlZywgbGVuKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiB3cml0ZSBzaW5nbGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3dyX3JlZyhzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYsIHU4IHJlZywgdTggdmFsKQoreworCXJldHVybiBtODhkczMxMDNfd3JfcmVncyhwcml2LCByZWcsICZ2YWwsIDEpOworfQorCisvKiByZWFkIHNpbmdsZSByZWdpc3RlciAqLworc3RhdGljIGludCBtODhkczMxMDNfcmRfcmVnKHN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiwgdTggcmVnLCB1OCAqdmFsKQoreworCXJldHVybiBtODhkczMxMDNfcmRfcmVncyhwcml2LCByZWcsIHZhbCwgMSk7Cit9CisKKy8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciB3aXRoIG1hc2sgKi8KK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiwKKwkJdTggcmVnLCB1OCB2YWwsIHU4IG1hc2spCit7CisJaW50IHJldDsKKwl1OCB1OHRtcDsKKworCS8qIG5vIG5lZWQgZm9yIHJlYWQgaWYgd2hvbGUgcmVnIGlzIHdyaXR0ZW4gKi8KKwlpZiAobWFzayAhPSAweGZmKSB7CisJCXJldCA9IG04OGRzMzEwM19yZF9yZWdzKHByaXYsIHJlZywgJnU4dG1wLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsICY9IG1hc2s7CisJCXU4dG1wICY9IH5tYXNrOworCQl2YWwgfD0gdTh0bXA7CisJfQorCisJcmV0dXJuIG04OGRzMzEwM193cl9yZWdzKHByaXYsIHJlZywgJnZhbCwgMSk7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyIHdpdGggbWFzayAqLworc3RhdGljIGludCBtODhkczMxMDNfcmRfcmVnX21hc2soc3RydWN0IG04OGRzMzEwM19wcml2ICpwcml2LAorCQl1OCByZWcsIHU4ICp2YWwsIHU4IG1hc2spCit7CisJaW50IHJldCwgaTsKKwl1OCB1OHRtcDsKKworCXJldCA9IG04OGRzMzEwM19yZF9yZWdzKHByaXYsIHJlZywgJnU4dG1wLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdTh0bXAgJj0gbWFzazsKKworCS8qIGZpbmQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKChtYXNrID4+IGkpICYgMHgwMSkKKwkJCWJyZWFrOworCX0KKwkqdmFsID0gdTh0bXAgPj4gaTsKKworCXJldHVybiAwOworfQorCisvKiB3cml0ZSByZWcgdmFsIHRhYmxlIHVzaW5nIHJlZyBhZGRyIGF1dG8gaW5jcmVtZW50ICovCitzdGF0aWMgaW50IG04OGRzMzEwM193cl9yZWdfdmFsX3RhYihzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYsCisJCWNvbnN0IHN0cnVjdCBtODhkczMxMDNfcmVnX3ZhbCAqdGFiLCBpbnQgdGFiX2xlbikKK3sKKwlpbnQgcmV0LCBpLCBqOworCXU4IGJ1Zls4M107CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogdGFiX2xlbj0lZFxuIiwgX19mdW5jX18sIHRhYl9sZW4pOworCisJaWYgKHRhYl9sZW4gPiA4MykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHRhYl9sZW47IGkrKywgaisrKSB7CisJCWJ1ZltqXSA9IHRhYltpXS52YWw7CisKKwkJaWYgKGkgPT0gdGFiX2xlbiAtIDEgfHwgdGFiW2ldLnJlZyAhPSB0YWJbaSArIDFdLnJlZyAtIDEgfHwKKwkJCQkhKChqICsgMSkgJSAocHJpdi0+Y2ZnLT5pMmNfd3JfbWF4IC0gMSkpKSB7CisJCQlyZXQgPSBtODhkczMxMDNfd3JfcmVncyhwcml2LCB0YWJbaV0ucmVnIC0gaiwgYnVmLCBqICsgMSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCisJCQlqID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCWludCByZXQ7CisJdTggdTh0bXA7CisKKwkqc3RhdHVzID0gMDsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycjsKKwl9CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCXJldCA9IG04OGRzMzEwM19yZF9yZWdfbWFzayhwcml2LCAweGQxLCAmdTh0bXAsIDB4MDcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJaWYgKHU4dG1wID09IDB4MDcpCisJCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCQkJRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU1lOQyB8CisJCQkJCUZFX0hBU19MT0NLOworCQlicmVhazsKKwljYXNlIFNZU19EVkJTMjoKKwkJcmV0ID0gbTg4ZHMzMTAzX3JkX3JlZ19tYXNrKHByaXYsIDB4MGQsICZ1OHRtcCwgMHg4Zik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlpZiAodTh0bXAgPT0gMHg4ZikKKwkJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfAorCQkJCQlGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DIHwKKwkJCQkJRkVfSEFTX0xPQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgZGVsaXZlcnlfc3lzdGVtXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcHJpdi0+ZmVfc3RhdHVzID0gKnN0YXR1czsKKworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGxvY2s9JTAyeCBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fZnVuY19fLCB1OHRtcCwgKnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwlpbnQgcmV0LCBsZW47CisJY29uc3Qgc3RydWN0IG04OGRzMzEwM19yZWdfdmFsICppbml0OworCXU4IHU4dG1wLCB1OHRtcDEsIHU4dG1wMjsKKwl1OCBidWZbMl07CisJdTE2IHUxNnRtcCwgZGl2aWRlX3JhdGlvOworCXUzMiB0dW5lcl9mcmVxdWVuY3ksIHRhcmdldF9tY2xrLCB0c19jbGs7CisJczMyIHMzMnRtcDsKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwKKwkJCSIlczogZGVsaXZlcnlfc3lzdGVtPSVkIG1vZHVsYXRpb249JWQgZnJlcXVlbmN5PSVkIHN5bWJvbF9yYXRlPSVkIGludmVyc2lvbj0lZCBwaWxvdD0lZCByb2xsb2ZmPSVkXG4iLAorCQkJX19mdW5jX18sIGMtPmRlbGl2ZXJ5X3N5c3RlbSwKKwkJCWMtPm1vZHVsYXRpb24sIGMtPmZyZXF1ZW5jeSwgYy0+c3ltYm9sX3JhdGUsCisJCQljLT5pbnZlcnNpb24sIGMtPnBpbG90LCBjLT5yb2xsb2ZmKTsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBwcm9ncmFtIHR1bmVyICovCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJcmV0ID0gZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuZ2V0X2ZyZXF1ZW5jeSkgeworCQlyZXQgPSBmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KGZlLCAmdHVuZXJfZnJlcXVlbmN5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIHJlc2V0ICovCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweDA3LCAweDgwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHgwNywgMHgwMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YjIsIDB4MDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXN3aXRjaCAoYy0+ZGVsaXZlcnlfc3lzdGVtKSB7CisJY2FzZSBTWVNfRFZCUzoKKwkJbGVuID0gQVJSQVlfU0laRShtODhkczMxMDNfZHZic19pbml0X3JlZ192YWxzKTsKKwkJaW5pdCA9IG04OGRzMzEwM19kdmJzX2luaXRfcmVnX3ZhbHM7CisJCXRhcmdldF9tY2xrID0gOTYwMDA7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlsZW4gPSBBUlJBWV9TSVpFKG04OGRzMzEwM19kdmJzMl9pbml0X3JlZ192YWxzKTsKKwkJaW5pdCA9IG04OGRzMzEwM19kdmJzMl9pbml0X3JlZ192YWxzOworCisJCXN3aXRjaCAocHJpdi0+Y2ZnLT50c19tb2RlKSB7CisJCWNhc2UgTTg4RFMzMTAzX1RTX1NFUklBTDoKKwkJY2FzZSBNODhEUzMxMDNfVFNfU0VSSUFMX0Q3OgorCQkJaWYgKGMtPnN5bWJvbF9yYXRlIDwgMTgwMDAwMDApCisJCQkJdGFyZ2V0X21jbGsgPSA5NjAwMDsKKwkJCWVsc2UKKwkJCQl0YXJnZXRfbWNsayA9IDE0NDAwMDsKKwkJCWJyZWFrOworCQljYXNlIE04OERTMzEwM19UU19QQVJBTExFTDoKKwkJY2FzZSBNODhEUzMxMDNfVFNfUEFSQUxMRUxfMTI6CisJCWNhc2UgTTg4RFMzMTAzX1RTX1BBUkFMTEVMXzE2OgorCQljYXNlIE04OERTMzEwM19UU19QQVJBTExFTF8xOV8yOgorCQljYXNlIE04OERTMzEwM19UU19DSToKKwkJCWlmIChjLT5zeW1ib2xfcmF0ZSA8IDE4MDAwMDAwKQorCQkJCXRhcmdldF9tY2xrID0gOTYwMDA7CisJCQllbHNlIGlmIChjLT5zeW1ib2xfcmF0ZSA8IDI4MDAwMDAwKQorCQkJCXRhcmdldF9tY2xrID0gMTQ0MDAwOworCQkJZWxzZQorCQkJCXRhcmdldF9tY2xrID0gMTkyMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBpbnZhbGlkIHRzX21vZGVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBpbnZhbGlkIGRlbGl2ZXJ5X3N5c3RlbVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIHByb2dyYW0gaW5pdCB0YWJsZSAqLworCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gIT0gcHJpdi0+ZGVsaXZlcnlfc3lzdGVtKSB7CisJCXJldCA9IG04OGRzMzEwM193cl9yZWdfdmFsX3RhYihwcml2LCBpbml0LCBsZW4pOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJdTh0bXAxID0gMDsgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCisJc3dpdGNoIChwcml2LT5jZmctPnRzX21vZGUpIHsKKwljYXNlIE04OERTMzEwM19UU19TRVJJQUw6CisJCXU4dG1wMSA9IDB4MDA7CisJCXRzX2NsayA9IDA7CisJCXU4dG1wID0gMHg0NjsKKwkJYnJlYWs7CisJY2FzZSBNODhEUzMxMDNfVFNfU0VSSUFMX0Q3OgorCQl1OHRtcDEgPSAweDIwOworCQl0c19jbGsgPSAwOworCQl1OHRtcCA9IDB4NDY7CisJCWJyZWFrOworCWNhc2UgTTg4RFMzMTAzX1RTX1BBUkFMTEVMOgorCQl0c19jbGsgPSAyNDAwMDsKKwkJdTh0bXAgPSAweDQyOworCQlicmVhazsKKwljYXNlIE04OERTMzEwM19UU19QQVJBTExFTF8xMjoKKwkJdHNfY2xrID0gMTIwMDA7CisJCXU4dG1wID0gMHg0MjsKKwkJYnJlYWs7CisJY2FzZSBNODhEUzMxMDNfVFNfUEFSQUxMRUxfMTY6CisJCXRzX2NsayA9IDE2MDAwOworCQl1OHRtcCA9IDB4NDI7CisJCWJyZWFrOworCWNhc2UgTTg4RFMzMTAzX1RTX1BBUkFMTEVMXzE5XzI6CisJCXRzX2NsayA9IDE5MjAwOworCQl1OHRtcCA9IDB4NDI7CisJCWJyZWFrOworCWNhc2UgTTg4RFMzMTAzX1RTX0NJOgorCQl0c19jbGsgPSA2MDAwOworCQl1OHRtcCA9IDB4NDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgdHNfbW9kZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBUUyBtb2RlICovCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweGZkLCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlzd2l0Y2ggKHByaXYtPmNmZy0+dHNfbW9kZSkgeworCWNhc2UgTTg4RFMzMTAzX1RTX1NFUklBTDoKKwljYXNlIE04OERTMzEwM19UU19TRVJJQUxfRDc6CisJCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDI5LCB1OHRtcDEsIDB4MjApOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKHRzX2NsaykgeworCQlkaXZpZGVfcmF0aW8gPSBESVZfUk9VTkRfVVAodGFyZ2V0X21jbGssIHRzX2Nsayk7CisJCXU4dG1wMSA9IGRpdmlkZV9yYXRpbyAvIDI7CisJCXU4dG1wMiA9IERJVl9ST1VORF9VUChkaXZpZGVfcmF0aW8sIDIpOworCX0gZWxzZSB7CisJCWRpdmlkZV9yYXRpbyA9IDA7CisJCXU4dG1wMSA9IDA7CisJCXU4dG1wMiA9IDA7CisJfQorCisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsCisJCQkiJXM6IHRhcmdldF9tY2xrPSVkIHRzX2Nsaz0lZCBkaXZpZGVfcmF0aW89JWRcbiIsCisJCQlfX2Z1bmNfXywgdGFyZ2V0X21jbGssIHRzX2NsaywgZGl2aWRlX3JhdGlvKTsKKworCXU4dG1wMS0tOworCXU4dG1wMi0tOworCS8qIHU4dG1wMVs1OjJdID0+IGZlWzM6MF0sIHU4dG1wMVsxOjBdID0+IGVhWzc6Nl0gKi8KKwl1OHRtcDEgJj0gMHgzZjsKKwkvKiB1OHRtcDJbNTowXSA9PiBlYVs1OjBdICovCisJdTh0bXAyICY9IDB4M2Y7CisKKwlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4ZmUsICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl1OHRtcCA9ICgodTh0bXAgICYgMHhmMCkgPDwgMCkgfCB1OHRtcDEgPj4gMjsKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4ZmUsIHU4dG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXU4dG1wID0gKCh1OHRtcDEgJiAweDAzKSA8PCA2KSB8IHU4dG1wMiA+PiAwOworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHhlYSwgdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc3dpdGNoICh0YXJnZXRfbWNsaykgeworCWNhc2UgNzIwMDA6CisJCXU4dG1wMSA9IDB4MDA7IC8qIDBiMDAgKi8KKwkJdTh0bXAyID0gMHgwMzsgLyogMGIxMSAqLworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQl1OHRtcDEgPSAweDAyOyAvKiAwYjEwICovCisJCXU4dG1wMiA9IDB4MDE7IC8qIDBiMDEgKi8KKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6CisJCXU4dG1wMSA9IDB4MDE7IC8qIDBiMDEgKi8KKwkJdTh0bXAyID0gMHgwMTsgLyogMGIwMSAqLworCQlicmVhazsKKwljYXNlIDE0NDAwMDoKKwkJdTh0bXAxID0gMHgwMDsgLyogMGIwMCAqLworCQl1OHRtcDIgPSAweDAxOyAvKiAwYjAxICovCisJCWJyZWFrOworCWNhc2UgMTkyMDAwOgorCQl1OHRtcDEgPSAweDAzOyAvKiAwYjExICovCisJCXU4dG1wMiA9IDB4MDA7IC8qIDBiMDAgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogaW52YWxpZCB0YXJnZXRfbWNsa1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnX21hc2socHJpdiwgMHgyMiwgdTh0bXAxIDw8IDYsIDB4YzApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4MjQsIHU4dG1wMiA8PCA2LCAweGMwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWlmIChjLT5zeW1ib2xfcmF0ZSA8PSAzMDAwMDAwKQorCQl1OHRtcCA9IDB4MjA7CisJZWxzZSBpZiAoYy0+c3ltYm9sX3JhdGUgPD0gMTAwMDAwMDApCisJCXU4dG1wID0gMHgxMDsKKwllbHNlCisJCXU4dG1wID0gMHgwNjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHhjMywgMHgwOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YzgsIHU4dG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHhjNCwgMHgwOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YzcsIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJdTE2dG1wID0gRElWX1JPVU5EX0NMT1NFU1QoKGMtPnN5bWJvbF9yYXRlIC8gMTAwMCkgPDwgMTUsIE04OERTMzEwM19NQ0xLX0tIWiAvIDIpOworCWJ1ZlswXSA9ICh1MTZ0bXAgPj4gMCkgJiAweGZmOworCWJ1ZlsxXSA9ICh1MTZ0bXAgPj4gOCkgJiAweGZmOworCXJldCA9IG04OGRzMzEwM193cl9yZWdzKHByaXYsIDB4NjEsIGJ1ZiwgMik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnX21hc2socHJpdiwgMHg0ZCwgcHJpdi0+Y2ZnLT5zcGVjX2ludiA8PCAxLCAweDAyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDMwLCBwcml2LT5jZmctPmFnY19pbnYgPDwgNCwgMHgxMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4MzMsIHByaXYtPmNmZy0+YWdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGNhcnJpZXIgb2Zmc2V0PSVkXG4iLCBfX2Z1bmNfXywKKwkJCSh0dW5lcl9mcmVxdWVuY3kgLSBjLT5mcmVxdWVuY3kpKTsKKworCXMzMnRtcCA9IDB4MTAwMDAgKiAodHVuZXJfZnJlcXVlbmN5IC0gYy0+ZnJlcXVlbmN5KTsKKwlzMzJ0bXAgPSBESVZfUk9VTkRfQ0xPU0VTVChzMzJ0bXAsIE04OERTMzEwM19NQ0xLX0tIWik7CisJaWYgKHMzMnRtcCA8IDApCisJCXMzMnRtcCArPSAweDEwMDAwOworCisJYnVmWzBdID0gKHMzMnRtcCA+PiAwKSAmIDB4ZmY7CisJYnVmWzFdID0gKHMzMnRtcCA+PiA4KSAmIDB4ZmY7CisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ3MocHJpdiwgMHg1ZSwgYnVmLCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHgwMCwgMHgwMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YjIsIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcHJpdi0+ZGVsaXZlcnlfc3lzdGVtID0gYy0+ZGVsaXZlcnlfc3lzdGVtOworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQsIGxlbiwgcmVtYWluaW5nOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCXU4ICpmd19maWxlID0gTTg4RFMzMTAzX0ZJUk1XQVJFOworCXU4IHU4dG1wOworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBzZXQgY29sZCBzdGF0ZSBieSBkZWZhdWx0ICovCisJcHJpdi0+d2FybSA9IGZhbHNlOworCisJLyogd2FrZSB1cCBkZXZpY2UgZnJvbSBzbGVlcCAqLworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDA4LCAweDAxLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDA0LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDIzLCAweDAwLCAweDEwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIHJlc2V0ICovCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweDA3LCAweDYwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHgwNywgMHgwMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBmaXJtd2FyZSBzdGF0dXMgKi8KKwlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4YjksICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmaXJtd2FyZT0lMDJ4XG4iLCBfX2Z1bmNfXywgdTh0bXApOworCisJaWYgKHU4dG1wKQorCQlnb3RvIHNraXBfZndfZG93bmxvYWQ7CisKKwkvKiBjb2xkIHN0YXRlIC0gdHJ5IHRvIGRvd25sb2FkIGZpcm13YXJlICovCisJZGV2X2luZm8oJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGZvdW5kIGEgJyVzJyBpbiBjb2xkIHN0YXRlXG4iLAorCQkJS0JVSUxEX01PRE5BTUUsIG04OGRzMzEwM19vcHMuaW5mby5uYW1lKTsKKworCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgYW5kIHRpbWVvdXQgKi8KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfZmlsZSwgcHJpdi0+aTJjLT5kZXYucGFyZW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGZpcm1hcmUgZmlsZSAnJXMnIG5vdCBmb3VuZFxuIiwKKwkJCQlLQlVJTERfTU9ETkFNRSwgZndfZmlsZSk7CisJCWdvdG8gZXJyOworCX0KKworCWRldl9pbmZvKCZwcml2LT5pMmMtPmRldiwgIiVzOiBkb3dubG9hZGluZyBmaXJtd2FyZSBmcm9tIGZpbGUgJyVzJ1xuIiwKKwkJCUtCVUlMRF9NT0ROQU1FLCBmd19maWxlKTsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWcocHJpdiwgMHhiMiwgMHgwMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmb3IgKHJlbWFpbmluZyA9IGZ3LT5zaXplOyByZW1haW5pbmcgPiAwOworCQkJcmVtYWluaW5nIC09IChwcml2LT5jZmctPmkyY193cl9tYXggLSAxKSkgeworCQlsZW4gPSByZW1haW5pbmc7CisJCWlmIChsZW4gPiAocHJpdi0+Y2ZnLT5pMmNfd3JfbWF4IC0gMSkpCisJCQlsZW4gPSAocHJpdi0+Y2ZnLT5pMmNfd3JfbWF4IC0gMSk7CisKKwkJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ3MocHJpdiwgMHhiMCwKKwkJCQkmZnctPmRhdGFbZnctPnNpemUgLSByZW1haW5pbmddLCBsZW4pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwcml2LT5pMmMtPmRldiwKKwkJCQkJIiVzOiBmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWQ9JWRcbiIsCisJCQkJCUtCVUlMRF9NT0ROQU1FLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YjIsIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJZncgPSBOVUxMOworCisJcmV0ID0gbTg4ZHMzMTAzX3JkX3JlZyhwcml2LCAweGI5LCAmdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJaWYgKCF1OHRtcCkgeworCQlkZXZfaW5mbygmcHJpdi0+aTJjLT5kZXYsICIlczogZmlybXdhcmUgZGlkIG5vdCBydW5cbiIsCisJCQkJS0JVSUxEX01PRE5BTUUpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZfaW5mbygmcHJpdi0+aTJjLT5kZXYsICIlczogZm91bmQgYSAnJXMnIGluIHdhcm0gc3RhdGVcbiIsCisJCQlLQlVJTERfTU9ETkFNRSwgbTg4ZHMzMTAzX29wcy5pbmZvLm5hbWUpOworCWRldl9pbmZvKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmaXJtd2FyZSB2ZXJzaW9uICVYLiVYXG4iLAorCQkJS0JVSUxEX01PRE5BTUUsICh1OHRtcCA+PiA0KSAmIDB4ZiwgKHU4dG1wID4+IDAgJiAweGYpKTsKKworc2tpcF9md19kb3dubG9hZDoKKwkvKiB3YXJtIHN0YXRlICovCisJcHJpdi0+d2FybSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoZncpCisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlwcml2LT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfVU5ERUZJTkVEOworCisJLyogVFMgSGktWiAqLworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDI3LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIHNsZWVwICovCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4MDgsIDB4MDAsIDB4MDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4MDQsIDB4MDEsIDB4MDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4MjMsIDB4MTAsIDB4MTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IG04OGRzMzEwM19wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJaW50IHJldDsKKwl1OCBidWZbM107CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycjsKKwl9CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCXJldCA9IG04OGRzMzEwM19yZF9yZWcocHJpdiwgMHhlMCwgJmJ1ZlswXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4ZTYsICZidWZbMV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJc3dpdGNoICgoYnVmWzBdID4+IDIpICYgMHgwMSkgeworCQljYXNlIDA6CisJCQljLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWMtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogaW52YWxpZCBpbnZlcnNpb25cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJfQorCisJCXN3aXRjaCAoKGJ1ZlsxXSA+PiA1KSAmIDB4MDcpIHsKKwkJY2FzZSAwOgorCQkJYy0+ZmVjX2lubmVyID0gRkVDXzdfODsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfNV82OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWMtPmZlY19pbm5lciA9IEZFQ18zXzQ7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYy0+ZmVjX2lubmVyID0gRkVDXzJfMzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfMV8yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBpbnZhbGlkIGZlY19pbm5lclxuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisKKwkJYy0+bW9kdWxhdGlvbiA9IFFQU0s7CisKKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCXJldCA9IG04OGRzMzEwM19yZF9yZWcocHJpdiwgMHg3ZSwgJmJ1ZlswXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4ODksICZidWZbMV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJcmV0ID0gbTg4ZHMzMTAzX3JkX3JlZyhwcml2LCAweGYyLCAmYnVmWzJdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCXN3aXRjaCAoKGJ1ZlswXSA+PiAwKSAmIDB4MGYpIHsKKwkJY2FzZSAyOgorCQkJYy0+ZmVjX2lubmVyID0gRkVDXzJfNTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfMV8yOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWMtPmZlY19pbm5lciA9IEZFQ18zXzU7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJYy0+ZmVjX2lubmVyID0gRkVDXzJfMzsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfM180OworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWMtPmZlY19pbm5lciA9IEZFQ180XzU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJYy0+ZmVjX2lubmVyID0gRkVDXzVfNjsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfOF85OworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQljLT5mZWNfaW5uZXIgPSBGRUNfOV8xMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogaW52YWxpZCBmZWNfaW5uZXJcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJfQorCisJCXN3aXRjaCAoKGJ1ZlswXSA+PiA1KSAmIDB4MDEpIHsKKwkJY2FzZSAwOgorCQkJYy0+cGlsb3QgPSBQSUxPVF9PRkY7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYy0+cGlsb3QgPSBQSUxPVF9PTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogaW52YWxpZCBwaWxvdFxuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisKKwkJc3dpdGNoICgoYnVmWzBdID4+IDYpICYgMHgwNykgeworCQljYXNlIDA6CisJCQljLT5tb2R1bGF0aW9uID0gUVBTSzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQljLT5tb2R1bGF0aW9uID0gUFNLXzg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYy0+bW9kdWxhdGlvbiA9IEFQU0tfMTY7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYy0+bW9kdWxhdGlvbiA9IEFQU0tfMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgbW9kdWxhdGlvblxuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisKKwkJc3dpdGNoICgoYnVmWzFdID4+IDcpICYgMHgwMSkgeworCQljYXNlIDA6CisJCQljLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWMtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogaW52YWxpZCBpbnZlcnNpb25cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJfQorCisJCXN3aXRjaCAoKGJ1ZlsyXSA+PiAwKSAmIDB4MDMpIHsKKwkJY2FzZSAwOgorCQkJYy0+cm9sbG9mZiA9IFJPTExPRkZfMzU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYy0+cm9sbG9mZiA9IFJPTExPRkZfMjU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYy0+cm9sbG9mZiA9IFJPTExPRkZfMjA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgcm9sbG9mZlxuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgZGVsaXZlcnlfc3lzdGVtXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbTg4ZHMzMTAzX3JkX3JlZ3MocHJpdiwgMHg2ZCwgYnVmLCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWMtPnN5bWJvbF9yYXRlID0gMXVsbCAqICgoYnVmWzFdIDw8IDgpIHwgKGJ1ZlswXSA8PCAwKSkgKgorCQkJTTg4RFMzMTAzX01DTEtfS0haICogMTAwMCAvIDB4MTAwMDA7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwlpbnQgcmV0LCBpLCB0bXA7CisJdTggYnVmWzNdOworCXUxNiBub2lzZSwgc2lnbmFsOworCXUzMiBub2lzZV90b3QsIHNpZ25hbF90b3Q7CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKwkvKiByZXBvcnRzIFNOUiBpbiByZXNvbHV0aW9uIG9mIDAuMSBkQiAqLworCisJLyogbW9yZSBpdGVyYXRpb25zIGZvciBtb3JlIGFjY3VyYXRlIGVzdGltYXRpb24gKi8KKwkjZGVmaW5lIE04OERTMzEwM19TTlJfSVRFUkFUSU9OUyAzCisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCXRtcCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IE04OERTMzEwM19TTlJfSVRFUkFUSU9OUzsgaSsrKSB7CisJCQlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4ZmYsICZidWZbMF0pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKworCQkJdG1wICs9IGJ1ZlswXTsKKwkJfQorCisJCS8qIHVzZSBvZiBvbmUgcmVnaXN0ZXIgbGltaXRzIG1heCB2YWx1ZSB0byAxNSBkQiAqLworCQkvKiBTTlIoWCkgZEIgPSAxMCAqIGxuKFgpIC8gbG4oMTApIGRCICovCisJCXRtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRtcCwgOCAqIE04OERTMzEwM19TTlJfSVRFUkFUSU9OUyk7CisJCWlmICh0bXApCisJCQkqc25yID0gMTAwdWwgKiBpbnRsb2cyKHRtcCkgLyBpbnRsb2cyKDEwKTsKKwkJZWxzZQorCQkJKnNuciA9IDA7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlub2lzZV90b3QgPSAwOworCQlzaWduYWxfdG90ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgTTg4RFMzMTAzX1NOUl9JVEVSQVRJT05TOyBpKyspIHsKKwkJCXJldCA9IG04OGRzMzEwM19yZF9yZWdzKHByaXYsIDB4OGMsIGJ1ZiwgMyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCisJCQlub2lzZSA9IGJ1ZlsxXSA8PCA2OyAgICAvKiBbMTM6Nl0gKi8KKwkJCW5vaXNlIHw9IGJ1ZlswXSAmIDB4M2Y7IC8qICBbNTowXSAqLworCQkJbm9pc2UgPj49IDI7CisJCQlzaWduYWwgPSBidWZbMl0gKiBidWZbMl07CisJCQlzaWduYWwgPj49IDE7CisKKwkJCW5vaXNlX3RvdCArPSBub2lzZTsKKwkJCXNpZ25hbF90b3QgKz0gc2lnbmFsOworCQl9CisKKwkJbm9pc2UgPSBub2lzZV90b3QgLyBNODhEUzMxMDNfU05SX0lURVJBVElPTlM7CisJCXNpZ25hbCA9IHNpZ25hbF90b3QgLyBNODhEUzMxMDNfU05SX0lURVJBVElPTlM7CisKKwkJLyogU05SKFgpIGRCID0gMTAgKiBsb2cxMChYKSBkQiAqLworCQlpZiAoc2lnbmFsID4gbm9pc2UpIHsKKwkJCXRtcCA9IHNpZ25hbCAvIG5vaXNlOworCQkJKnNuciA9IDEwMHVsICogaW50bG9nMTAodG1wKSAvICgxIDw8IDI0KTsKKwkJfSBlbHNlIHsKKwkJCSpzbnIgPSAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgZGVsaXZlcnlfc3lzdGVtXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3NlY190b25lX21vZGVfdCBmZV9zZWNfdG9uZV9tb2RlKQoreworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggdTh0bXAsIHRvbmUsIHJlZ19hMV9tYXNrOworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGZlX3NlY190b25lX21vZGU9JWRcbiIsIF9fZnVuY19fLAorCQkJZmVfc2VjX3RvbmVfbW9kZSk7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnI7CisJfQorCisJc3dpdGNoIChmZV9zZWNfdG9uZV9tb2RlKSB7CisJY2FzZSBTRUNfVE9ORV9PTjoKKwkJdG9uZSA9IDA7CisJCXJlZ19hMV9tYXNrID0gMHg4NzsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVE9ORV9PRkY6CisJCXRvbmUgPSAxOworCQlyZWdfYTFfbWFzayA9IDB4MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgZmVfc2VjX3RvbmVfbW9kZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXU4dG1wID0gdG9uZSA8PCA3IHwgcHJpdi0+Y2ZnLT5lbnZlbG9wZV9tb2RlIDw8IDU7CisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4YTIsIHU4dG1wLCAweGUwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXU4dG1wID0gMSA8PCAyOworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweGExLCB1OHRtcCwgcmVnX2ExX21hc2spOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQlzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICpkaXNlcWNfY21kKQoreworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQsIGk7CisJdTggdTh0bXA7CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogbXNnPSUqcGhcbiIsIF9fZnVuY19fLAorCQkJZGlzZXFjX2NtZC0+bXNnX2xlbiwgZGlzZXFjX2NtZC0+bXNnKTsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZGlzZXFjX2NtZC0+bXNnX2xlbiA8IDMgfHwgZGlzZXFjX2NtZC0+bXNnX2xlbiA+IDYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJdTh0bXAgPSBwcml2LT5jZmctPmVudmVsb3BlX21vZGUgPDwgNTsKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnX21hc2socHJpdiwgMHhhMiwgdTh0bXAsIDB4ZTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ3MocHJpdiwgMHhhMywgZGlzZXFjX2NtZC0+bXNnLAorCQkJZGlzZXFjX2NtZC0+bXNnX2xlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnKHByaXYsIDB4YTEsCisJCQkoZGlzZXFjX2NtZC0+bXNnX2xlbiAtIDEpIDw8IDMgfCAweDA3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIERpU0VxQyBtZXNzYWdlIHR5cGljYWwgcGVyaW9kIGlzIDU0IG1zICovCisJdXNsZWVwX3JhbmdlKDQwMDAwLCA2MDAwMCk7CisKKwkvKiB3YWl0IERpU0VxQyBUWCByZWFkeSAqLworCWZvciAoaSA9IDIwLCB1OHRtcCA9IDE7IGkgJiYgdTh0bXA7IGktLSkgeworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgMTAwMDApOworCisJCXJldCA9IG04OGRzMzEwM19yZF9yZWdfbWFzayhwcml2LCAweGExLCAmdTh0bXAsIDB4NDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogbG9vcD0lZFxuIiwgX19mdW5jX18sIGkpOworCisJaWYgKGkgPT0gMCkgeworCQlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBkaXNlcWMgdHggdGltZW91dFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweGExLCAweDQwLCAweGMwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweGEyLCAweDgwLCAweGMwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWlmIChpID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlmZV9zZWNfbWluaV9jbWRfdCBmZV9zZWNfbWluaV9jbWQpCit7CisJc3RydWN0IG04OGRzMzEwM19wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCwgaTsKKwl1OCB1OHRtcCwgYnVyc3Q7CisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogZmVfc2VjX21pbmlfY21kPSVkXG4iLCBfX2Z1bmNfXywKKwkJCWZlX3NlY19taW5pX2NtZCk7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnI7CisJfQorCisJdTh0bXAgPSBwcml2LT5jZmctPmVudmVsb3BlX21vZGUgPDwgNTsKKwlyZXQgPSBtODhkczMxMDNfd3JfcmVnX21hc2socHJpdiwgMHhhMiwgdTh0bXAsIDB4ZTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc3dpdGNoIChmZV9zZWNfbWluaV9jbWQpIHsKKwljYXNlIFNFQ19NSU5JX0E6CisJCWJ1cnN0ID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBTRUNfTUlOSV9COgorCQlidXJzdCA9IDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGludmFsaWQgZmVfc2VjX21pbmlfY21kXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweGExLCBidXJzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBEaVNFcUMgVG9uZUJ1cnN0IHBlcmlvZCBpcyAxMi41IG1zICovCisJdXNsZWVwX3JhbmdlKDExMDAwLCAyMDAwMCk7CisKKwkvKiB3YWl0IERpU0VxQyBUWCByZWFkeSAqLworCWZvciAoaSA9IDUsIHU4dG1wID0gMTsgaSAmJiB1OHRtcDsgaS0tKSB7CisJCXVzbGVlcF9yYW5nZSg4MDAsIDIwMDApOworCisJCXJldCA9IG04OGRzMzEwM19yZF9yZWdfbWFzayhwcml2LCAweGExLCAmdTh0bXAsIDB4NDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJZGV2X2RiZygmcHJpdi0+aTJjLT5kZXYsICIlczogbG9vcD0lZFxuIiwgX19mdW5jX18sIGkpOworCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZ19tYXNrKHByaXYsIDB4YTIsIDB4ODAsIDB4YzApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJaWYgKGkgPT0gMCkgeworCQlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBkaXNlcWMgdHggdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZGJnKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4ZHMzMTAzX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqcykKK3sKKwlzLT5taW5fZGVsYXlfbXMgPSAzMDAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG04OGRzMzEwM19yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWkyY19kZWxfbXV4X2FkYXB0ZXIocHJpdi0+aTJjX2FkYXB0ZXIpOworCWtmcmVlKHByaXYpOworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19zZWxlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB2b2lkICptdXhfcHJpdiwgdTMyIGNoYW4pCit7CisJc3RydWN0IG04OGRzMzEwM19wcml2ICpwcml2ID0gbXV4X3ByaXY7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTJjX21zZyBnYXRlX29wZW5fbXNnWzFdID0geworCQl7CisJCQkuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDIsCisJCQkuYnVmID0gIlx4MDNceDExIiwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZwcml2LT5pMmNfbXV0ZXgpOworCisJLyogb3BlbiB0dW5lciBJMkMgcmVwZWF0ZXIgZm9yIDEgeGZlciwgY2xvc2VzIGF1dG9tYXRpY2FsbHkgKi8KKwlyZXQgPSBfX2kyY190cmFuc2Zlcihwcml2LT5pMmMsIGdhdGVfb3Blbl9tc2csIDEpOworCWlmIChyZXQgIT0gMSkgeworCQlkZXZfd2FybigmcHJpdi0+aTJjLT5kZXYsICIlczogaTJjIHdyIGZhaWxlZD0lZFxuIiwKKwkJCQlLQlVJTERfTU9ETkFNRSwgcmV0KTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVSRU1PVEVJTzsKKworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG04OGRzMzEwM19kZXNlbGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHZvaWQgKm11eF9wcml2LAorCQl1MzIgY2hhbikKK3sKKwlzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgKnByaXYgPSBtdXhfcHJpdjsKKworCW11dGV4X3VubG9jaygmcHJpdi0+aTJjX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICptODhkczMxMDNfYXR0YWNoKGNvbnN0IHN0cnVjdCBtODhkczMxMDNfY29uZmlnICpjZmcsCisJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKip0dW5lcl9pMmNfYWRhcHRlcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtODhkczMxMDNfcHJpdiAqcHJpdjsKKwl1OCBjaGlwX2lkLCB1OHRtcDsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHByaXYgKi8KKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICIlczoga3phbGxvYygpIGZhaWxlZFxuIiwgS0JVSUxEX01PRE5BTUUpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcml2LT5jZmcgPSBjZmc7CisJcHJpdi0+aTJjID0gaTJjOworCW11dGV4X2luaXQoJnByaXYtPmkyY19tdXRleCk7CisKKwlyZXQgPSBtODhkczMxMDNfcmRfcmVnKHByaXYsIDB4MDEsICZjaGlwX2lkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9kYmcoJnByaXYtPmkyYy0+ZGV2LCAiJXM6IGNoaXBfaWQ9JTAyeFxuIiwgX19mdW5jX18sIGNoaXBfaWQpOworCisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSAweGQwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycjsKKwl9CisKKwlzd2l0Y2ggKHByaXYtPmNmZy0+Y2xvY2tfb3V0KSB7CisJY2FzZSBNODhEUzMxMDNfQ0xPQ0tfT1VUX0RJU0FCTEVEOgorCQl1OHRtcCA9IDB4ODA7CisJCWJyZWFrOworCWNhc2UgTTg4RFMzMTAzX0NMT0NLX09VVF9FTkFCTEVEOgorCQl1OHRtcCA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgTTg4RFMzMTAzX0NMT0NLX09VVF9FTkFCTEVEX0RJVjI6CisJCXU4dG1wID0gMHgxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbTg4ZHMzMTAzX3dyX3JlZyhwcml2LCAweDI5LCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBzbGVlcCAqLworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDA4LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDA0LCAweDAxLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OGRzMzEwM193cl9yZWdfbWFzayhwcml2LCAweDIzLCAweDEwLCAweDEwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIGNyZWF0ZSBtdXggaTJjIGFkYXB0ZXIgZm9yIHR1bmVyICovCisJcHJpdi0+aTJjX2FkYXB0ZXIgPSBpMmNfYWRkX211eF9hZGFwdGVyKGkyYywgJmkyYy0+ZGV2LCBwcml2LCAwLCAwLCAwLAorCQkJbTg4ZHMzMTAzX3NlbGVjdCwgbTg4ZHMzMTAzX2Rlc2VsZWN0KTsKKwlpZiAocHJpdi0+aTJjX2FkYXB0ZXIgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwkqdHVuZXJfaTJjX2FkYXB0ZXIgPSBwcml2LT5pMmNfYWRhcHRlcjsKKworCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KKwltZW1jcHkoJnByaXYtPmZlLm9wcywgJm04OGRzMzEwM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXByaXYtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBwcml2OworCisJcmV0dXJuICZwcml2LT5mZTsKK2VycjoKKwlkZXZfZGJnKCZpMmMtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCWtmcmVlKHByaXYpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChtODhkczMxMDNfYXR0YWNoKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG04OGRzMzEwM19vcHMgPSB7CisJLmRlbHN5cyA9IHsgU1lTX0RWQlMsIFNZU19EVkJTMiB9LAorCS5pbmZvID0geworCQkubmFtZSA9ICJNb250YWdlIE04OERTMzEwMyIsCisJCS5mcmVxdWVuY3lfbWluID0gIDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSA9IDUwMDAsCisJCS5zeW1ib2xfcmF0ZV9taW4gPSAgMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQlGRV9DQU5fRkVDXzFfMiB8CisJCQlGRV9DQU5fRkVDXzJfMyB8CisJCQlGRV9DQU5fRkVDXzNfNCB8CisJCQlGRV9DQU5fRkVDXzRfNSB8CisJCQlGRV9DQU5fRkVDXzVfNiB8CisJCQlGRV9DQU5fRkVDXzZfNyB8CisJCQlGRV9DQU5fRkVDXzdfOCB8CisJCQlGRV9DQU5fRkVDXzhfOSB8CisJCQlGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfAorCQkJRkVfQ0FOX1JFQ09WRVIgfAorCQkJRkVfQ0FOXzJHX01PRFVMQVRJT04KKwl9LAorCisJLnJlbGVhc2UgPSBtODhkczMxMDNfcmVsZWFzZSwKKworCS5nZXRfdHVuZV9zZXR0aW5ncyA9IG04OGRzMzEwM19nZXRfdHVuZV9zZXR0aW5ncywKKworCS5pbml0ID0gbTg4ZHMzMTAzX2luaXQsCisJLnNsZWVwID0gbTg4ZHMzMTAzX3NsZWVwLAorCisJLnNldF9mcm9udGVuZCA9IG04OGRzMzEwM19zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IG04OGRzMzEwM19nZXRfZnJvbnRlbmQsCisKKwkucmVhZF9zdGF0dXMgPSBtODhkczMxMDNfcmVhZF9zdGF0dXMsCisJLnJlYWRfc25yID0gbTg4ZHMzMTAzX3JlYWRfc25yLAorCisJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBtODhkczMxMDNfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCwKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSBtODhkczMxMDNfZGlzZXFjX3NlbmRfYnVyc3QsCisKKwkuc2V0X3RvbmUgPSBtODhkczMxMDNfc2V0X3RvbmUsCit9OworCitNT0RVTEVfQVVUSE9SKCJBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTW9udGFnZSBNODhEUzMxMDMgRFZCLVMvUzIgZGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfRklSTVdBUkUoTTg4RFMzMTAzX0ZJUk1XQVJFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI3ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OGRzMzEwMy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTW9udGFnZSBNODhEUzMxMDMgZGVtb2R1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIE04OERTMzEwM19ICisjZGVmaW5lIE04OERTMzEwM19ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworc3RydWN0IG04OGRzMzEwM19jb25maWcgeworCS8qCisJICogSTJDIGFkZHJlc3MKKwkgKiBEZWZhdWx0OiBub25lLCBtdXN0IHNldAorCSAqIDB4NjgsIC4uLgorCSAqLworCXU4IGkyY19hZGRyOworCisJLyoKKwkgKiBjbG9jaworCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogMjcwMDAwMDAKKwkgKi8KKwl1MzIgY2xvY2s7CisKKwkvKgorCSAqIG1heCBieXRlcyBJMkMgcHJvdmlkZXIgaXMgYXNrZWQgdG8gd3JpdGUgYXQgb25jZQorCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogMzMsIDY1LCAuLi4KKwkgKi8KKwl1MTYgaTJjX3dyX21heDsKKworCS8qCisJICogVFMgb3V0cHV0IG1vZGUKKwkgKiBEZWZhdWx0OiBNODhEUzMxMDNfVFNfU0VSSUFMCisJICovCisjZGVmaW5lIE04OERTMzEwM19UU19TRVJJQUwgICAgICAgICAgICAgMCAvKiBUUyBvdXRwdXQgcGluIEQwLCBub3JtYWwgKi8KKyNkZWZpbmUgTTg4RFMzMTAzX1RTX1NFUklBTF9ENyAgICAgICAgICAxIC8qIFRTIG91dHB1dCBwaW4gRDcgKi8KKyNkZWZpbmUgTTg4RFMzMTAzX1RTX1BBUkFMTEVMICAgICAgICAgICAyIC8qIDI0IE1Ieiwgbm9ybWFsICovCisjZGVmaW5lIE04OERTMzEwM19UU19QQVJBTExFTF8xMiAgICAgICAgMyAvKiAxMiBNSHogKi8KKyNkZWZpbmUgTTg4RFMzMTAzX1RTX1BBUkFMTEVMXzE2ICAgICAgICA0IC8qIDE2IE1IeiAqLworI2RlZmluZSBNODhEUzMxMDNfVFNfUEFSQUxMRUxfMTlfMiAgICAgIDUgLyogMTkuMiBNSHogKi8KKyNkZWZpbmUgTTg4RFMzMTAzX1RTX0NJICAgICAgICAgICAgICAgICA2IC8qIDYgTUh6ICovCisJdTggdHNfbW9kZTsKKworCS8qCisJICogc3BlY3RydW0gaW52ZXJzaW9uCisJICogRGVmYXVsdDogMAorCSAqLworCXU4IHNwZWNfaW52OjE7CisKKwkvKgorCSAqIEFHQyBwb2xhcml0eQorCSAqIERlZmF1bHQ6IDAKKwkgKi8KKwl1OCBhZ2NfaW52OjE7CisKKwkvKgorCSAqIGNsb2NrIG91dHB1dAorCSAqIERlZmF1bHQ6IE04OERTMzEwM19DTE9DS19PVVRfRElTQUJMRUQKKwkgKi8KKyNkZWZpbmUgTTg4RFMzMTAzX0NMT0NLX09VVF9ESVNBQkxFRCAgICAgICAgMAorI2RlZmluZSBNODhEUzMxMDNfQ0xPQ0tfT1VUX0VOQUJMRUQgICAgICAgICAxCisjZGVmaW5lIE04OERTMzEwM19DTE9DS19PVVRfRU5BQkxFRF9ESVYyICAgIDIKKwl1OCBjbG9ja19vdXQ7CisKKwkvKgorCSAqIERpU0VxQyBlbnZlbG9wZSBtb2RlCisJICogRGVmYXVsdDogMAorCSAqLworCXU4IGVudmVsb3BlX21vZGU6MTsKKworCS8qCisJICogQUdDIGNvbmZpZ3VyYXRpb24KKwkgKiBEZWZhdWx0OiBub25lLCBtdXN0IHNldAorCSAqLworCXU4IGFnYzsKK307CisKKy8qCisgKiBEcml2ZXIgaW1wbGVtZW50cyBvd24gSTJDLWFkYXB0ZXIgZm9yIHR1bmVyIEkyQyBhY2Nlc3MuIFRoYXQncyBzaW5jZSBjaGlwCisgKiBoYXMgSTJDLWdhdGUgY29udHJvbCB3aGljaCBjbG9zZXMgZ2F0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIEkyQyB0cmFuc2Zlci4KKyAqIFVzaW5nIG93biBJMkMgYWRhcHRlciB3ZSBjYW4gd29ya2Fyb3VuZCB0aGF0LgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTTg4RFMzMTAzKSB8fCBcCisJCShkZWZpbmVkKENPTkZJR19EVkJfTTg4RFMzMTAzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKm04OGRzMzEwM19hdHRhY2goCisJCWNvbnN0IHN0cnVjdCBtODhkczMxMDNfY29uZmlnICpjb25maWcsCisJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKip0dW5lcl9pMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqbTg4ZHMzMTAzX2F0dGFjaCgKKwkJY29uc3Qgc3RydWN0IG04OGRzMzEwM19jb25maWcgKmNvbmZpZywKKwkJc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCXN0cnVjdCBpMmNfYWRhcHRlciAqKnR1bmVyX2kyYykKK3sKKwlwcl93YXJuKCIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDNfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OGRzMzEwM19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjM2MwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDNfcHJpdi5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogTW9udGFnZSBNODhEUzMxMDMgZGVtb2R1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIE04OERTMzEwM19QUklWX0gKKyNkZWZpbmUgTTg4RFMzMTAzX1BSSVZfSAorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAibTg4ZHMzMTAzLmgiCisjaW5jbHVkZSAiZHZiX21hdGguaCIKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1tdXguaD4KKworI2RlZmluZSBNODhEUzMxMDNfRklSTVdBUkUgImR2Yi1kZW1vZC1tODhkczMxMDMuZnciCisjZGVmaW5lIE04OERTMzEwM19NQ0xLX0tIWiA5NjAwMAorCitzdHJ1Y3QgbTg4ZHMzMTAzX3ByaXYgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCS8qIG11dGV4IG5lZWRlZCBkdWUgdG8gb3duIHR1bmVyIEkyQyBhZGFwdGVyICovCisJc3RydWN0IG11dGV4IGkyY19tdXRleDsKKwljb25zdCBzdHJ1Y3QgbTg4ZHMzMTAzX2NvbmZpZyAqY2ZnOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZmU7CisJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsaXZlcnlfc3lzdGVtOworCWZlX3N0YXR1c190IGZlX3N0YXR1czsKKwlib29sIHdhcm07IC8qIEZXIHJ1bm5pbmcgKi8KKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwdGVyOworfTsKKworc3RydWN0IG04OGRzMzEwM19yZWdfdmFsIHsKKwl1OCByZWc7CisJdTggdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtODhkczMxMDNfcmVnX3ZhbCBtODhkczMxMDNfZHZic19pbml0X3JlZ192YWxzW10gPSB7CisJezB4MjMsIDB4MDd9LAorCXsweDA4LCAweDAzfSwKKwl7MHgwYywgMHgwMn0sCisJezB4MjEsIDB4NTR9LAorCXsweDI1LCAweDhhfSwKKwl7MHgyNywgMHgzMX0sCisJezB4MzAsIDB4MDh9LAorCXsweDMxLCAweDQwfSwKKwl7MHgzMiwgMHgzMn0sCisJezB4MzUsIDB4ZmZ9LAorCXsweDNhLCAweDAwfSwKKwl7MHgzNywgMHgxMH0sCisJezB4MzgsIDB4MTB9LAorCXsweDM5LCAweDAyfSwKKwl7MHg0MiwgMHg2MH0sCisJezB4NGEsIDB4ODB9LAorCXsweDRiLCAweDA0fSwKKwl7MHg0ZCwgMHg5MX0sCisJezB4NWQsIDB4Yzh9LAorCXsweDUwLCAweDM2fSwKKwl7MHg1MSwgMHgzNn0sCisJezB4NTIsIDB4MzZ9LAorCXsweDUzLCAweDM2fSwKKwl7MHg1NiwgMHgwMX0sCisJezB4NjMsIDB4MGZ9LAorCXsweDY0LCAweDMwfSwKKwl7MHg2NSwgMHg0MH0sCisJezB4NjgsIDB4MjZ9LAorCXsweDY5LCAweDRjfSwKKwl7MHg3MCwgMHgyMH0sCisJezB4NzEsIDB4NzB9LAorCXsweDcyLCAweDA0fSwKKwl7MHg3MywgMHgwMH0sCisJezB4NzAsIDB4NDB9LAorCXsweDcxLCAweDcwfSwKKwl7MHg3MiwgMHgwNH0sCisJezB4NzMsIDB4MDB9LAorCXsweDcwLCAweDYwfSwKKwl7MHg3MSwgMHg3MH0sCisJezB4NzIsIDB4MDR9LAorCXsweDczLCAweDAwfSwKKwl7MHg3MCwgMHg4MH0sCisJezB4NzEsIDB4NzB9LAorCXsweDcyLCAweDA0fSwKKwl7MHg3MywgMHgwMH0sCisJezB4NzAsIDB4YTB9LAorCXsweDcxLCAweDcwfSwKKwl7MHg3MiwgMHgwNH0sCisJezB4NzMsIDB4MDB9LAorCXsweDcwLCAweDFmfSwKKwl7MHg3NiwgMHgzOH0sCisJezB4NzcsIDB4YTZ9LAorCXsweDc4LCAweDBjfSwKKwl7MHg3OSwgMHg4MH0sCisJezB4N2YsIDB4MTR9LAorCXsweDdjLCAweDAwfSwKKwl7MHhhZSwgMHg4Mn0sCisJezB4ODAsIDB4NjR9LAorCXsweDgxLCAweDY2fSwKKwl7MHg4MiwgMHg0NH0sCisJezB4ODUsIDB4MDR9LAorCXsweGNkLCAweGY0fSwKKwl7MHg5MCwgMHgzM30sCisJezB4YTAsIDB4NDR9LAorCXsweGMwLCAweDA4fSwKKwl7MHhjMywgMHgxMH0sCisJezB4YzQsIDB4MDh9LAorCXsweGM1LCAweGYwfSwKKwl7MHhjNiwgMHhmZn0sCisJezB4YzcsIDB4MDB9LAorCXsweGM4LCAweDFhfSwKKwl7MHhjOSwgMHg4MH0sCisJezB4ZTAsIDB4Zjh9LAorCXsweGU2LCAweDhifSwKKwl7MHhkMCwgMHg0MH0sCisJezB4ZjgsIDB4MjB9LAorCXsweGZhLCAweDBmfSwKKwl7MHgwMCwgMHgwMH0sCisJezB4YmQsIDB4MDF9LAorCXsweGI4LCAweDAwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbTg4ZHMzMTAzX3JlZ192YWwgbTg4ZHMzMTAzX2R2YnMyX2luaXRfcmVnX3ZhbHNbXSA9IHsKKwl7MHgyMywgMHgwN30sCisJezB4MDgsIDB4MDd9LAorCXsweDBjLCAweDAyfSwKKwl7MHgyMSwgMHg1NH0sCisJezB4MjUsIDB4OGF9LAorCXsweDI3LCAweDMxfSwKKwl7MHgzMCwgMHgwOH0sCisJezB4MzIsIDB4MzJ9LAorCXsweDM1LCAweGZmfSwKKwl7MHgzYSwgMHgwMH0sCisJezB4MzcsIDB4MTB9LAorCXsweDM4LCAweDEwfSwKKwl7MHgzOSwgMHgwMn0sCisJezB4NDIsIDB4NjB9LAorCXsweDRhLCAweDgwfSwKKwl7MHg0YiwgMHgwNH0sCisJezB4NGQsIDB4OTF9LAorCXsweDVkLCAweGM4fSwKKwl7MHg1MCwgMHgzNn0sCisJezB4NTEsIDB4MzZ9LAorCXsweDUyLCAweDM2fSwKKwl7MHg1MywgMHgzNn0sCisJezB4NTYsIDB4MDF9LAorCXsweDYzLCAweDBmfSwKKwl7MHg2NCwgMHgxMH0sCisJezB4NjUsIDB4MjB9LAorCXsweDY4LCAweDQ2fSwKKwl7MHg2OSwgMHhjZH0sCisJezB4NzAsIDB4MjB9LAorCXsweDcxLCAweDcwfSwKKwl7MHg3MiwgMHgwNH0sCisJezB4NzMsIDB4MDB9LAorCXsweDcwLCAweDQwfSwKKwl7MHg3MSwgMHg3MH0sCisJezB4NzIsIDB4MDR9LAorCXsweDczLCAweDAwfSwKKwl7MHg3MCwgMHg2MH0sCisJezB4NzEsIDB4NzB9LAorCXsweDcyLCAweDA0fSwKKwl7MHg3MywgMHgwMH0sCisJezB4NzAsIDB4ODB9LAorCXsweDcxLCAweDcwfSwKKwl7MHg3MiwgMHgwNH0sCisJezB4NzMsIDB4MDB9LAorCXsweDcwLCAweGEwfSwKKwl7MHg3MSwgMHg3MH0sCisJezB4NzIsIDB4MDR9LAorCXsweDczLCAweDAwfSwKKwl7MHg3MCwgMHgxZn0sCisJezB4NzYsIDB4Mzh9LAorCXsweDc3LCAweGE2fSwKKwl7MHg3OCwgMHgwY30sCisJezB4NzksIDB4ODB9LAorCXsweDdmLCAweDE0fSwKKwl7MHg4NSwgMHgwOH0sCisJezB4Y2QsIDB4ZjR9LAorCXsweDkwLCAweDMzfSwKKwl7MHg4NiwgMHgwMH0sCisJezB4ODcsIDB4MGZ9LAorCXsweDg5LCAweDAwfSwKKwl7MHg4YiwgMHg0NH0sCisJezB4OGMsIDB4NjZ9LAorCXsweDlkLCAweGMxfSwKKwl7MHg4YSwgMHgxMH0sCisJezB4YWQsIDB4NDB9LAorCXsweGEwLCAweDQ0fSwKKwl7MHhjMCwgMHgwOH0sCisJezB4YzEsIDB4MTB9LAorCXsweGMyLCAweDA4fSwKKwl7MHhjMywgMHgxMH0sCisJezB4YzQsIDB4MDh9LAorCXsweGM1LCAweGYwfSwKKwl7MHhjNiwgMHhmZn0sCisJezB4YzcsIDB4MDB9LAorCXsweGM4LCAweDFhfSwKKwl7MHhjOSwgMHg4MH0sCisJezB4Y2EsIDB4MjN9LAorCXsweGNiLCAweDI0fSwKKwl7MHhjYywgMHhmNH0sCisJezB4Y2UsIDB4NzR9LAorCXsweDAwLCAweDAwfSwKKwl7MHhiZCwgMHgwMX0sCisJezB4YjgsIDB4MDB9LAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4cnMyMDAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4cnMyMDAwLmMKaW5kZXggNGRhNTI3Mi4uYjIzNTE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OHJzMjAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhyczIwMDAuYwpAQCAtMTEwLDI4ICsxMTAsOTQgQEAKIAlyZXR1cm4gYjFbMF07CiB9CiAKK3N0YXRpYyB1MzIgbTg4cnMyMDAwX2dldF9tY2xrKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtODhyczIwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIG1jbGs7CisJdTggcmVnOworCS8qIE11c3Qgbm90IGJlIDB4MDAgb3IgMHhmZiAqLworCXJlZyA9IG04OHJzMjAwMF9yZWFkcmVnKHN0YXRlLCAweDg2KTsKKwlpZiAoIXJlZyB8fCByZWcgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisKKwlyZWcgLz0gMjsKKwlyZWcgKz0gMTsKKworCW1jbGsgPSAodTMyKShyZWcgKiBSUzIwMDBfRkVfQ1JZU1RBTF9LSFogKyAyOCAvIDIpIC8gMjg7CisKKwlyZXR1cm4gbWNsazsKK30KKworc3RhdGljIGludCBtODhyczIwMDBfc2V0X2NhcnJpZXJvZmZzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHMxNiBvZmZzZXQpCit7CisJc3RydWN0IG04OHJzMjAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgbWNsazsKKwlzMzIgdG1wOworCXU4IHJlZzsKKwlpbnQgcmV0OworCisJbWNsayA9IG04OHJzMjAwMF9nZXRfbWNsayhmZSk7CisJaWYgKCFtY2xrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IChvZmZzZXQgKiA0MDk2ICsgKHMzMiltY2xrIC8gMikgLyAoczMyKW1jbGs7CisJaWYgKHRtcCA8IDApCisJCXRtcCArPSA0MDk2OworCisJLyogQ2FycmllciBPZmZzZXQgKi8KKwlyZXQgPSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4OWMsICh1OCkodG1wID4+IDQpKTsKKworCXJlZyA9IG04OHJzMjAwMF9yZWFkcmVnKHN0YXRlLCAweDlkKTsKKwlyZWcgJj0gMHhmOworCXJlZyB8PSAodTgpKHRtcCAmIDB4ZikgPDwgNDsKKworCXJldCB8PSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4OWQsIHJlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG04OHJzMjAwMF9zZXRfc3ltYm9scmF0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIHNyYXRlKQogewogCXN0cnVjdCBtODhyczIwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKLQl1MzIgdGVtcDsKKwl1NjQgdGVtcDsKKwl1MzIgbWNsazsKIAl1OCBiWzNdOwogCiAJaWYgKChzcmF0ZSA8IDEwMDAwMDApIHx8IChzcmF0ZSA+IDQ1MDAwMDAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltY2xrID0gbTg4cnMyMDAwX2dldF9tY2xrKGZlKTsKKwlpZiAoIW1jbGspCisJCXJldHVybiAtRUlOVkFMOworCiAJdGVtcCA9IHNyYXRlIC8gMTAwMDsKLQl0ZW1wICo9IDExODMxOwotCXRlbXAgLz0gNjg7Ci0JdGVtcCAtPSAzOworCXRlbXAgKj0gMSA8PCAyNDsKKworCWRvX2Rpdih0ZW1wLCBtY2xrKTsKIAogCWJbMF0gPSAodTgpICh0ZW1wID4+IDE2KSAmIDB4ZmY7CiAJYlsxXSA9ICh1OCkgKHRlbXAgPj4gOCkgJiAweGZmOwogCWJbMl0gPSAodTgpIHRlbXAgJiAweGZmOworCiAJcmV0ID0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDkzLCBiWzJdKTsKIAlyZXQgfD0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDk0LCBiWzFdKTsKIAlyZXQgfD0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDk1LCBiWzBdKTsKIAorCWlmIChzcmF0ZSA+IDEwMDAwMDAwKQorCQlyZXQgfD0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEwLCAweDIwKTsKKwllbHNlCisJCXJldCB8PSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTAsIDB4NjApOworCisJcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHhhMSwgMHhlMCk7CisKKwlpZiAoc3JhdGUgPiAxMjAwMDAwMCkKKwkJcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHhhMywgMHgyMCk7CisJZWxzZSBpZiAoc3JhdGUgPiAyODAwMDAwKQorCQlyZXQgfD0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEzLCAweDk4KTsKKwllbHNlCisJCXJldCB8PSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTMsIDB4OTApOworCiAJZGViX2luZm8oIm04OHJzMjAwMDogbTg4cnMyMDAwX3NldF9zeW1ib2xyYXRlXG4iKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjYxLDggKzMyNyw2IEBACiAKIHN0cnVjdCBpbml0dGFiIGZlX3Jlc2V0W10gPSB7CiAJe0RFTU9EX1dSSVRFLCAweDAwLCAweDAxfSwKLQl7REVNT0RfV1JJVEUsIDB4ZjEsIDB4YmZ9LAotCXtERU1PRF9XUklURSwgMHgwMCwgMHgwMX0sCiAJe0RFTU9EX1dSSVRFLCAweDIwLCAweDgxfSwKIAl7REVNT0RfV1JJVEUsIDB4MjEsIDB4ODB9LAogCXtERU1PRF9XUklURSwgMHgxMCwgMHgzM30sCkBAIC0zMDUsOSArMzY5LDYgQEAKIAl7REVNT0RfV1JJVEUsIDB4OWIsIDB4NjR9LAogCXtERU1PRF9XUklURSwgMHg5ZSwgMHgwMH0sCiAJe0RFTU9EX1dSSVRFLCAweDlmLCAweGY4fSwKLQl7REVNT0RfV1JJVEUsIDB4YTAsIDB4MjB9LAotCXtERU1PRF9XUklURSwgMHhhMSwgMHhlMH0sCi0Je0RFTU9EX1dSSVRFLCAweGEzLCAweDM4fSwKIAl7REVNT0RfV1JJVEUsIDB4OTgsIDB4ZmZ9LAogCXtERU1PRF9XUklURSwgMHhjMCwgMHgwZn0sCiAJe0RFTU9EX1dSSVRFLCAweDg5LCAweDAxfSwKQEAgLTQwOCw3ICs0NjksNyBAQAogCiAJKnN0YXR1cyA9IDA7CiAKLQlpZiAoKHJlZyAmIDB4NykgPT0gMHg3KSB7CisJaWYgKChyZWcgJiAweGVlKSA9PSAweGVlKSB7CiAJCSpzdGF0dXMgPSBGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfVklURVJCSQogCQkJfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwogCQlpZiAoc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcykKQEAgLTQ4MCwzNCArNTQxLDM5IEBACiBzdGF0aWMgaW50IG04OHJzMjAwMF9zZXRfZmVjKHN0cnVjdCBtODhyczIwMDBfc3RhdGUgKnN0YXRlLAogCQlmZV9jb2RlX3JhdGVfdCBmZWMpCiB7Ci0JdTE2IGZlY19zZXQ7CisJdTggZmVjX3NldCwgcmVnOworCWludCByZXQ7CisKIAlzd2l0Y2ggKGZlYykgewotCS8qIFRoaXMgaXMgbm90IGNvbmZpcm1lZCBrZXB0IGZvciByZWZlcmVuY2UgKi8KLS8qCWNhc2UgRkVDXzFfMjoKLQkJZmVjX3NldCA9IDB4ODg7CisJY2FzZSBGRUNfMV8yOgorCQlmZWNfc2V0ID0gMHg4OwogCQlicmVhazsKIAljYXNlIEZFQ18yXzM6Ci0JCWZlY19zZXQgPSAweDY4OworCQlmZWNfc2V0ID0gMHgxMDsKIAkJYnJlYWs7CiAJY2FzZSBGRUNfM180OgotCQlmZWNfc2V0ID0gMHg0ODsKKwkJZmVjX3NldCA9IDB4MjA7CiAJCWJyZWFrOwogCWNhc2UgRkVDXzVfNjoKLQkJZmVjX3NldCA9IDB4Mjg7CisJCWZlY19zZXQgPSAweDQwOwogCQlicmVhazsKIAljYXNlIEZFQ183Xzg6Ci0JCWZlY19zZXQgPSAweDE4OwotCQlicmVhazsgKi8KKwkJZmVjX3NldCA9IDB4ODA7CisJCWJyZWFrOwogCWNhc2UgRkVDX0FVVE86CiAJZGVmYXVsdDoKLQkJZmVjX3NldCA9IDB4MDg7CisJCWZlY19zZXQgPSAweDA7CiAJfQotCW04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg3NiwgZmVjX3NldCk7CiAKLQlyZXR1cm4gMDsKKwlyZWcgPSBtODhyczIwMDBfcmVhZHJlZyhzdGF0ZSwgMHg3MCk7CisJcmVnICY9IDB4NzsKKwlyZXQgPSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4NzAsIHJlZyB8IGZlY19zZXQpOworCisJcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg3NiwgMHg4KTsKKworCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGZlX2NvZGVfcmF0ZV90IG04OHJzMjAwMF9nZXRfZmVjKHN0cnVjdCBtODhyczIwMDBfc3RhdGUgKnN0YXRlKQogewogCXU4IHJlZzsKQEAgLTUxNSwxOCArNTgxLDIwIEBACiAJcmVnID0gbTg4cnMyMDAwX3JlYWRyZWcoc3RhdGUsIDB4NzYpOwogCW04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg5YSwgMHhiMCk7CiAKKwlyZWcgJj0gMHhmMDsKKwlyZWcgPj49IDU7CisKIAlzd2l0Y2ggKHJlZykgewotCWNhc2UgMHg4ODoKKwljYXNlIDB4NDoKIAkJcmV0dXJuIEZFQ18xXzI7Ci0JY2FzZSAweDY4OgorCWNhc2UgMHgzOgogCQlyZXR1cm4gRkVDXzJfMzsKLQljYXNlIDB4NDg6CisJY2FzZSAweDI6CiAJCXJldHVybiBGRUNfM180OwotCWNhc2UgMHgyODoKKwljYXNlIDB4MToKIAkJcmV0dXJuIEZFQ181XzY7Ci0JY2FzZSAweDE4OgorCWNhc2UgMHgwOgogCQlyZXR1cm4gRkVDXzdfODsKLQljYXNlIDB4MDg6CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtNTQwLDkgKzYwOCw4IEBACiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAJZmVfc3RhdHVzX3Qgc3RhdHVzOwogCWludCBpLCByZXQgPSAwOwotCXMzMiB0bXA7CiAJdTMyIHR1bmVyX2ZyZXE7Ci0JdTE2IG9mZnNldCA9IDA7CisJczE2IG9mZnNldCA9IDA7CiAJdTggcmVnOwogCiAJc3RhdGUtPm5vX2xvY2tfY291bnQgPSAwOwpAQCAtNTY3LDM4ICs2MzQsMzEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlvZmZzZXQgPSB0dW5lcl9mcmVxIC0gYy0+ZnJlcXVlbmN5OworCW9mZnNldCA9IChzMTYpKChzMzIpdHVuZXJfZnJlcSAtIGMtPmZyZXF1ZW5jeSk7CiAKLQkvKiBjYWxjdWxhdGUgb2Zmc2V0IGFzc3VtaW5nIDk2MDAwa0h6Ki8KLQl0bXAgPSBvZmZzZXQ7Ci0JdG1wICo9IDY1NTM2OworCS8qIGRlZmF1bHQgbWNsayB2YWx1ZSA5Ni40Mjg1ICogMiAqIDEwMDAgPSAxOTI4NTcgKi8KKwlpZiAoKChjLT5mcmVxdWVuY3kgJSAxOTI4NTcpID49ICgxOTI4NTcgLSAzMDAwKSkgfHwKKwkJCQkoYy0+ZnJlcXVlbmN5ICUgMTkyODU3KSA8PSAzMDAwKQorCQlyZXQgPSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4ODYsIDB4YzIpOworCWVsc2UKKwkJcmV0ID0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDg2LCAweGM2KTsKIAotCXRtcCA9ICgyICogdG1wICsgOTYwMDApIC8gKDIgKiA5NjAwMCk7Ci0JaWYgKHRtcCA8IDApCi0JCXRtcCArPSA2NTUzNjsKLQotCW9mZnNldCA9IHRtcCAmIDB4ZmZmZjsKLQotCXJldCA9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg5YSwgMHgzMCk7Ci0JLyogVW5rbm93biB1c3VhbGx5IDB4YzYgc29tZXRpbWVzIDB4YzEgKi8KLQlyZWcgPSBtODhyczIwMDBfcmVhZHJlZyhzdGF0ZSwgMHg4Nik7Ci0JcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg4NiwgcmVnKTsKLQkvKiBPZmZzZXQgbG93ZXIgbmliYmxlIGFsd2F5cyAwICovCi0JcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg5YywgKG9mZnNldCA+PiA4KSk7Ci0JcmV0IHw9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHg5ZCwgb2Zmc2V0ICYgMHhmMCk7Ci0KLQotCS8qIFJlc2V0IERlbW9kICovCi0JcmV0ID0gbTg4cnMyMDAwX3RhYl9zZXQoc3RhdGUsIGZlX3Jlc2V0KTsKKwlyZXQgfD0gbTg4cnMyMDAwX3NldF9jYXJyaWVyb2Zmc2V0KGZlLCBvZmZzZXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIFVua25vd24gKi8KLQlyZWcgPSBtODhyczIwMDBfcmVhZHJlZyhzdGF0ZSwgMHg3MCk7Ci0JcmV0ID0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDcwLCByZWcpOworCS8qIFJlc2V0IGRlbW9kIGJ5IHN5bWJvbCByYXRlICovCisJaWYgKGMtPnN5bWJvbF9yYXRlID4gMjc1MDAwMDApCisJCXJldCA9IG04OHJzMjAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmMSwgMHhhNCk7CisJZWxzZQorCQlyZXQgPSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4ZjEsIDB4YmYpOworCisJcmV0IHw9IG04OHJzMjAwMF90YWJfc2V0KHN0YXRlLCBmZV9yZXNldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOwogCiAJLyogU2V0IEZFQyAqLwotCXJldCB8PSBtODhyczIwMDBfc2V0X2ZlYyhzdGF0ZSwgYy0+ZmVjX2lubmVyKTsKKwlyZXQgPSBtODhyczIwMDBfc2V0X2ZlYyhzdGF0ZSwgYy0+ZmVjX2lubmVyKTsKIAlyZXQgfD0gbTg4cnMyMDAwX3dyaXRlcmVnKHN0YXRlLCAweDg1LCAweDEpOwogCXJldCB8PSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4OGEsIDB4YmYpOwogCXJldCB8PSBtODhyczIwMDBfd3JpdGVyZWcoc3RhdGUsIDB4OGQsIDB4MWUpOwpAQCAtNjIwLDcgKzY4MCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykgewogCQlyZWcgPSBtODhyczIwMDBfcmVhZHJlZyhzdGF0ZSwgMHg4Yyk7Ci0JCWlmICgocmVnICYgMHg3KSA9PSAweDcpIHsKKwkJaWYgKChyZWcgJiAweGVlKSA9PSAweGVlKSB7CiAJCQlzdGF0dXMgPSBGRV9IQVNfTE9DSzsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4cnMyMDAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4cnMyMDAwLmgKaW5kZXggMTRjZTMxZS4uMGE1MGVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OHJzMjAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhyczIwMDAuaApAQCAtNTMsNiArNTMsOCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19EVkJfTTg4UlMyMDAwICovCiAKKyNkZWZpbmUgUlMyMDAwX0ZFX0NSWVNUQUxfS0haIDI3MDAwCisKIGVudW0gewogCURFTU9EX1dSSVRFID0gMHgxLAogCVdSSVRFX0RFTEFZID0gMHgxMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ueHQyMDB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbnh0MjAweC5jCmluZGV4IGZiY2E5ODUuLjhhOGUxZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ueHQyMDB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL254dDIwMHguYwpAQCAtMiw3ICsyLDcgQEAKICAqICAgIFN1cHBvcnQgZm9yIE5YVDIwMDIgYW5kIE5YVDIwMDQgLSBWU0IvUUFNCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDA1IEtpcmsgTGFwcmF5IDxraXJrLmxhcHJheUBnbWFpbC5jb20+Ci0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4KKyAqICAgIENvcHlyaWdodCAoQykgMjAwNi0yMDE0IE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgogICogICAgYmFzZWQgb24gbnh0MjAwMiBieSBUYXlsb3IgSmFjb2IgPHJ0amFjb2JAZWFydGhsaW5rLm5ldD4KICAqICAgIGFuZCBueHQyMDA0IGJ5IEplYW4tRnJhbmNvaXMgVGhpYmVydCA8amVhbmZyYW5jb2lzQHNhZ2V0di5jb20+CiAgKgpAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAvKiBNYXggdHJhbnNmZXIgc2l6ZSBkb25lIGJ5IEkyQyB0cmFuc2ZlciBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgTUFYX1hGRVJfU0laRSAgNjQKKyNkZWZpbmUgTUFYX1hGRVJfU0laRSAgMjU2CiAKICNkZWZpbmUgTlhUMjAwMl9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtbnh0MjAwMi5mdyIKICNkZWZpbmUgTlhUMjAwNF9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtbnh0MjAwNC5mdyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2kyYy9LY29uZmlnCmluZGV4IDg0MjY1NGQuLjRhYTljNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvS2NvbmZpZwpAQCAtNTU1LDE0ICs1NTUsNiBAQAogCSAgVGhpcyBpcyBhIFZpZGVvNExpbnV4MiBzZW5zb3ItbGV2ZWwgZHJpdmVyIGZvciB0aGUgTWljcm9uCiAJICBNVDlWMDMyIDc1Mng0ODAgQ01PUyBzZW5zb3IuCiAKLWNvbmZpZyBWSURFT19UQ004MjVYCi0JdHJpc3RhdGUgIlRDTTgyNXggY2FtZXJhIHNlbnNvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgVklERU9fVjRMMl9JTlRfREVWSUNFCi0JZGVwZW5kcyBvbiBNRURJQV9DQU1FUkFfU1VQUE9SVAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBUb3NoaWJhIFRDTTgyNXggVkdBIGNhbWVyYSBzZW5zb3IuCi0JICBJdCBpcyB1c2VkIGZvciBleGFtcGxlIGluIE5va2lhIE44MDAuCi0KIGNvbmZpZyBWSURFT19TUjAzMFBDMzAKIAl0cmlzdGF0ZSAiU2lsaWNvbmZpbGUgU1IwMzBQQzMwIHNlbnNvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKQEAgLTU5NCw2ICs1ODYsMTMgQEAKICAgICAgICAgICBUaGlzIGlzIGEgVjRMMiBzZW5zb3ItbGV2ZWwgZHJpdmVyIGZvciBTYW1zdW5nIFM1SzRFQ0dYIDVNCiAgICAgICAgICAgY2FtZXJhIHNlbnNvciB3aXRoIGFuIGVtYmVkZGVkIFNvQyBpbWFnZSBzaWduYWwgcHJvY2Vzc29yLgogCitjb25maWcgVklERU9fUzVLNUJBRgorCXRyaXN0YXRlICJTYW1zdW5nIFM1SzVCQUYgc2Vuc29yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBWSURFT19WNEwyX1NVQkRFVl9BUEkKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgVjRMMiBzZW5zb3ItbGV2ZWwgZHJpdmVyIGZvciBTYW1zdW5nIFM1SzVCQUYgMk0KKwkgIGNhbWVyYSBzZW5zb3Igd2l0aCBhbiBlbWJlZGRlZCBTb0MgaW1hZ2Ugc2lnbmFsIHByb2Nlc3Nvci4KKwogc291cmNlICJkcml2ZXJzL21lZGlhL2kyYy9zbWlhcHAvS2NvbmZpZyIKIAogY29uZmlnIFZJREVPX1M1QzczTTMKQEAgLTY1NSw2ICs2NTQsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVwZDY0MDgzLgogCitjb21tZW50ICJBdWRpby9WaWRlbyBjb21wcmVzc2lvbiBjaGlwcyIKKworY29uZmlnIFZJREVPX1NBQTY3NTJIUworCXRyaXN0YXRlICJQaGlsaXBzIFNBQTY3NTJIUyBNUEVHLTIgQXVkaW8vVmlkZW8gRW5jb2RlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgU0FBNjc1MkhTIE1QRUctMiB2aWRlbyBhbmQgTVBFRy1hdWRpby9BQy0zCisJICBhdWRpbyBlbmNvZGVyIHdpdGggbXVsdGlwbGV4ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhYTY3NTJocy4KKwogY29tbWVudCAiTWlzY2VsbGFuZW91cyBoZWxwZXIgY2hpcHMiCiAKIGNvbmZpZyBWSURFT19USFM3MzAzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvaTJjL01ha2VmaWxlCmluZGV4IGUwM2YxNzcuLjQ4ODg4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfVklERU9fU0FBNzEyNykgKz0gc2FhNzEyNy5vCiBvYmotJChDT05GSUdfVklERU9fU0FBNzE4NSkgKz0gc2FhNzE4NS5vCiBvYmotJChDT05GSUdfVklERU9fU0FBNzE5MSkgKz0gc2FhNzE5MS5vCitvYmotJChDT05GSUdfVklERU9fU0FBNjc1MkhTKSArPSBzYWE2NzUyaHMubwogb2JqLSQoQ09ORklHX1ZJREVPX0FEVjcxNzApICs9IGFkdjcxNzAubwogb2JqLSQoQ09ORklHX1ZJREVPX0FEVjcxNzUpICs9IGFkdjcxNzUubwogb2JqLSQoQ09ORklHX1ZJREVPX0FEVjcxODApICs9IGFkdjcxODAubwpAQCAtNTcsNyArNTgsNiBAQAogb2JqLSQoQ09ORklHX1ZJREVPX09WNzY0MCkgKz0gb3Y3NjQwLm8KIG9iai0kKENPTkZJR19WSURFT19PVjc2NzApICs9IG92NzY3MC5vCiBvYmotJChDT05GSUdfVklERU9fT1Y5NjUwKSArPSBvdjk2NTAubwotb2JqLSQoQ09ORklHX1ZJREVPX1RDTTgyNVgpICs9IHRjbTgyNXgubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOU0wMzIpICs9IG10OW0wMzIubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVAwMzEpICs9IG10OXAwMzEubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVQwMDEpICs9IG10OXQwMDEubwpAQCAtNjcsNiArNjcsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX05PT04wMTBQQzMwKQkrPSBub29uMDEwcGMzMC5vCiBvYmotJChDT05GSUdfVklERU9fUzVLNkFBKQkrPSBzNWs2YWEubwogb2JqLSQoQ09ORklHX1ZJREVPX1M1SzRFQ0dYKQkrPSBzNWs0ZWNneC5vCitvYmotJChDT05GSUdfVklERU9fUzVLNUJBRikJKz0gczVrNWJhZi5vCiBvYmotJChDT05GSUdfVklERU9fUzVDNzNNMykJKz0gczVjNzNtMy8KIG9iai0kKENPTkZJR19WSURFT19BRFAxNjUzKQkrPSBhZHAxNjUzLm8KIG9iai0kKENPTkZJR19WSURFT19BUzM2NDVBKQkrPSBhczM2NDVhLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL2FkOTM4OWIuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL2FkOTM4OWIuYwppbmRleCBiMDZhN2U1Li44MzIyNWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9hZDkzODliLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvYWQ5Mzg5Yi5jCkBAIC02NiwxMSArNjYsNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KIAotc3RydWN0IGkyY19yZWdfdmFsdWUgewotCXU4IHJlZzsKLQl1OCB2YWx1ZTsKLX07Ci0KIHN0cnVjdCBhZDkzODliX3N0YXRlX2VkaWQgewogCS8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KIAl1MzIgYmxvY2tzOwpAQCAtMTQzLDE0ICsxMzgsMTQgQEAKIAkJaWYgKHJldCA9PSAwKQogCQkJcmV0dXJuIDA7CiAJfQotCXY0bDJfZXJyKHNkLCAiSTJDIFdyaXRlIFByb2JsZW1cbiIpOworCXY0bDJfZXJyKHNkLCAiJXM6IGZhaWxlZCByZWcgMHgleCwgdmFsIDB4JXhcbiIsIF9fZnVuY19fLCByZWcsIHZhbCk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogVG8gc2V0IHNwZWNpZmljIGJpdHMgaW4gdGhlIHJlZ2lzdGVyLCBhIGNsZWFyLW1hc2sgaXMgZ2l2ZW4gKHRvIGJlIEFORC1lZCksCiAgICBhbmQgdGhlbiB0aGUgdmFsdWUtbWFzayAodG8gYmUgT1ItZWQpLiAqLwogc3RhdGljIGlubGluZSB2b2lkIGFkOTM4OWJfd3JfYW5kX29yKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZywKLQkJCQkJCXU4IGNscl9tYXNrLCB1OCB2YWxfbWFzaykKKwkJCQkgICAgIHU4IGNscl9tYXNrLCB1OCB2YWxfbWFzaykKIHsKIAlhZDkzODliX3dyKHNkLCByZWcsIChhZDkzODliX3JkKHNkLCByZWcpICYgY2xyX21hc2spIHwgdmFsX21hc2spOwogfQpAQCAtMzIxLDEyICszMTYsMTIgQEAKIAlzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSAqc3RhdGUgPSBnZXRfYWQ5Mzg5Yl9zdGF0ZShzZCk7CiAKIAl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCi0JCSIlczogY3RybCBpZDogJWQsIGN0cmwtPnZhbCAlZFxuIiwgX19mdW5jX18sIGN0cmwtPmlkLCBjdHJsLT52YWwpOworCQkgIiVzOiBjdHJsIGlkOiAlZCwgY3RybC0+dmFsICVkXG4iLCBfX2Z1bmNfXywgY3RybC0+aWQsIGN0cmwtPnZhbCk7CiAKIAlpZiAoc3RhdGUtPmhkbWlfbW9kZV9jdHJsID09IGN0cmwpIHsKIAkJLyogU2V0IEhETUkgb3IgRFZJLUQgKi8KIAkJYWQ5Mzg5Yl93cl9hbmRfb3Ioc2QsIDB4YWYsIDB4ZmQsCi0JCQkJY3RybC0+dmFsID09IFY0TDJfRFZfVFhfTU9ERV9IRE1JID8gMHgwMiA6IDB4MDApOworCQkJCSAgY3RybC0+dmFsID09IFY0TDJfRFZfVFhfTU9ERV9IRE1JID8gMHgwMiA6IDB4MDApOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHN0YXRlLT5yZ2JfcXVhbnRpemF0aW9uX3JhbmdlX2N0cmwgPT0gY3RybCkKQEAgLTM4Nyw2MSArMzgyLDU3IEBACiAJdjRsMl9pbmZvKHNkLCAiY2hpcCByZXZpc2lvbiAlZFxuIiwgc3RhdGUtPmNoaXBfcmV2aXNpb24pOwogCXY0bDJfaW5mbyhzZCwgInBvd2VyICVzXG4iLCBzdGF0ZS0+cG93ZXJfb24gPyAib24iIDogIm9mZiIpOwogCXY0bDJfaW5mbyhzZCwgIiVzIGhvdHBsdWcsICVzIFJ4IFNlbnNlLCAlcyBFRElEICglZCBibG9jayhzKSlcbiIsCi0JCQkoYWQ5Mzg5Yl9yZChzZCwgMHg0MikgJiBNQVNLX0FEOTM4OUJfSFBEX0RFVEVDVCkgPwotCQkJCQkJCSJkZXRlY3RlZCIgOiAibm8iLAotCQkJKGFkOTM4OWJfcmQoc2QsIDB4NDIpICYgTUFTS19BRDkzODlCX01TRU5fREVURUNUKSA/Ci0JCQkJCQkJImRldGVjdGVkIiA6ICJubyIsCi0JCQllZGlkLT5zZWdtZW50cyA/ICJmb3VuZCIgOiAibm8iLCBlZGlkLT5ibG9ja3MpOwotCWlmIChzdGF0ZS0+aGF2ZV9tb25pdG9yKSB7Ci0JCXY0bDJfaW5mbyhzZCwgIiVzIG91dHB1dCAlc1xuIiwKLQkJCQkgIChhZDkzODliX3JkKHNkLCAweGFmKSAmIDB4MDIpID8KLQkJCQkgICJIRE1JIiA6ICJEVkktRCIsCi0JCQkJICAoYWQ5Mzg5Yl9yZChzZCwgMHhhMSkgJiAweDNjKSA/Ci0JCQkJICAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLQl9CisJCSAgKGFkOTM4OWJfcmQoc2QsIDB4NDIpICYgTUFTS19BRDkzODlCX0hQRF9ERVRFQ1QpID8KKwkJICAiZGV0ZWN0ZWQiIDogIm5vIiwKKwkJICAoYWQ5Mzg5Yl9yZChzZCwgMHg0MikgJiBNQVNLX0FEOTM4OUJfTVNFTl9ERVRFQ1QpID8KKwkJICAiZGV0ZWN0ZWQiIDogIm5vIiwKKwkJICBlZGlkLT5zZWdtZW50cyA/ICJmb3VuZCIgOiAibm8iLCBlZGlkLT5ibG9ja3MpOworCXY0bDJfaW5mbyhzZCwgIiVzIG91dHB1dCAlc1xuIiwKKwkJICAoYWQ5Mzg5Yl9yZChzZCwgMHhhZikgJiAweDAyKSA/CisJCSAgIkhETUkiIDogIkRWSS1EIiwKKwkJICAoYWQ5Mzg5Yl9yZChzZCwgMHhhMSkgJiAweDNjKSA/CisJCSAgImRpc2FibGVkIiA6ICJlbmFibGVkIik7CiAJdjRsMl9pbmZvKHNkLCAiYWQ5Mzg5YjogJXNcbiIsIChhZDkzODliX3JkKHNkLCAweGI4KSAmIDB4NDApID8KLQkJCQkJImVuY3J5cHRlZCIgOiAibm8gZW5jcnlwdGlvbiIpOworCQkgICJlbmNyeXB0ZWQiIDogIm5vIGVuY3J5cHRpb24iKTsKIAl2NGwyX2luZm8oc2QsICJzdGF0ZTogJXMsIGVycm9yOiAlcywgZGV0ZWN0IGNvdW50OiAldSwgbXNrL2lycTogJTAyeC8lMDJ4XG4iLAotCQkJc3RhdGVzW2FkOTM4OWJfcmQoc2QsIDB4YzgpICYgMHhmXSwKLQkJCWVycm9yc1thZDkzODliX3JkKHNkLCAweGM4KSA+PiA0XSwKLQkJCXN0YXRlLT5lZGlkX2RldGVjdF9jb3VudGVyLAotCQkJYWQ5Mzg5Yl9yZChzZCwgMHg5NCksIGFkOTM4OWJfcmQoc2QsIDB4OTYpKTsKKwkJICBzdGF0ZXNbYWQ5Mzg5Yl9yZChzZCwgMHhjOCkgJiAweGZdLAorCQkgIGVycm9yc1thZDkzODliX3JkKHNkLCAweGM4KSA+PiA0XSwKKwkJICBzdGF0ZS0+ZWRpZF9kZXRlY3RfY291bnRlciwKKwkJICBhZDkzODliX3JkKHNkLCAweDk0KSwgYWQ5Mzg5Yl9yZChzZCwgMHg5NikpOwogCW1hbnVhbF9nZWFyID0gYWQ5Mzg5Yl9yZChzZCwgMHg5OCkgJiAweDgwOwogCXY0bDJfaW5mbyhzZCwgImFkOTM4OWI6IFJHQiBxdWFudGl6YXRpb246ICVzIHJhbmdlXG4iLAotCQkJYWQ5Mzg5Yl9yZChzZCwgMHgzYikgJiAweDAxID8gImxpbWl0ZWQiIDogImZ1bGwiKTsKKwkJICBhZDkzODliX3JkKHNkLCAweDNiKSAmIDB4MDEgPyAibGltaXRlZCIgOiAiZnVsbCIpOwogCXY0bDJfaW5mbyhzZCwgImFkOTM4OWI6ICVzIGdlYXIgJWRcbiIsCiAJCSAgbWFudWFsX2dlYXIgPyAibWFudWFsIiA6ICJhdXRvbWF0aWMiLAogCQkgIG1hbnVhbF9nZWFyID8gKChhZDkzODliX3JkKHNkLCAweDk4KSAmIDB4NzApID4+IDQpIDoKLQkJCQkoKGFkOTM4OWJfcmQoc2QsIDB4OWUpICYgMHgwZSkgPj4gMSkpOwotCWlmIChzdGF0ZS0+aGF2ZV9tb25pdG9yKSB7Ci0JCWlmIChhZDkzODliX3JkKHNkLCAweGFmKSAmIDB4MDIpIHsKLQkJCS8qIEhETUkgb25seSAqLwotCQkJdTggbWFudWFsX2N0cyA9IGFkOTM4OWJfcmQoc2QsIDB4MGEpICYgMHg4MDsKLQkJCXUzMiBOID0gKGFkOTM4OWJfcmQoc2QsIDB4MDEpICYgMHhmKSA8PCAxNiB8Ci0JCQkJIGFkOTM4OWJfcmQoc2QsIDB4MDIpIDw8IDggfAotCQkJCSBhZDkzODliX3JkKHNkLCAweDAzKTsKLQkJCXU4IHZpY19kZXRlY3QgPSBhZDkzODliX3JkKHNkLCAweDNlKSA+PiAyOwotCQkJdTggdmljX3NlbnQgPSBhZDkzODliX3JkKHNkLCAweDNkKSAmIDB4M2Y7Ci0JCQl1MzIgQ1RTOworCQkgICgoYWQ5Mzg5Yl9yZChzZCwgMHg5ZSkgJiAweDBlKSA+PiAxKSk7CisJaWYgKGFkOTM4OWJfcmQoc2QsIDB4YWYpICYgMHgwMikgeworCQkvKiBIRE1JIG9ubHkgKi8KKwkJdTggbWFudWFsX2N0cyA9IGFkOTM4OWJfcmQoc2QsIDB4MGEpICYgMHg4MDsKKwkJdTMyIE4gPSAoYWQ5Mzg5Yl9yZChzZCwgMHgwMSkgJiAweGYpIDw8IDE2IHwKKwkJCWFkOTM4OWJfcmQoc2QsIDB4MDIpIDw8IDggfAorCQkJYWQ5Mzg5Yl9yZChzZCwgMHgwMyk7CisJCXU4IHZpY19kZXRlY3QgPSBhZDkzODliX3JkKHNkLCAweDNlKSA+PiAyOworCQl1OCB2aWNfc2VudCA9IGFkOTM4OWJfcmQoc2QsIDB4M2QpICYgMHgzZjsKKwkJdTMyIENUUzsKIAotCQkJaWYgKG1hbnVhbF9jdHMpCi0JCQkJQ1RTID0gKGFkOTM4OWJfcmQoc2QsIDB4MDcpICYgMHhmKSA8PCAxNiB8Ci0JCQkJICAgICAgIGFkOTM4OWJfcmQoc2QsIDB4MDgpIDw8IDggfAotCQkJCSAgICAgICBhZDkzODliX3JkKHNkLCAweDA5KTsKLQkJCWVsc2UKLQkJCQlDVFMgPSAoYWQ5Mzg5Yl9yZChzZCwgMHgwNCkgJiAweGYpIDw8IDE2IHwKLQkJCQkgICAgICAgYWQ5Mzg5Yl9yZChzZCwgMHgwNSkgPDwgOCB8Ci0JCQkJICAgICAgIGFkOTM4OWJfcmQoc2QsIDB4MDYpOwotCQkJTiA9IChhZDkzODliX3JkKHNkLCAweDAxKSAmIDB4ZikgPDwgMTYgfAotCQkJICAgICBhZDkzODliX3JkKHNkLCAweDAyKSA8PCA4IHwKLQkJCSAgICAgYWQ5Mzg5Yl9yZChzZCwgMHgwMyk7CisJCWlmIChtYW51YWxfY3RzKQorCQkJQ1RTID0gKGFkOTM4OWJfcmQoc2QsIDB4MDcpICYgMHhmKSA8PCAxNiB8CisJCQkgICAgICBhZDkzODliX3JkKHNkLCAweDA4KSA8PCA4IHwKKwkJCSAgICAgIGFkOTM4OWJfcmQoc2QsIDB4MDkpOworCQllbHNlCisJCQlDVFMgPSAoYWQ5Mzg5Yl9yZChzZCwgMHgwNCkgJiAweGYpIDw8IDE2IHwKKwkJCSAgICAgIGFkOTM4OWJfcmQoc2QsIDB4MDUpIDw8IDggfAorCQkJICAgICAgYWQ5Mzg5Yl9yZChzZCwgMHgwNik7CisJCU4gPSAoYWQ5Mzg5Yl9yZChzZCwgMHgwMSkgJiAweGYpIDw8IDE2IHwKKwkJICAgIGFkOTM4OWJfcmQoc2QsIDB4MDIpIDw8IDggfAorCQkgICAgYWQ5Mzg5Yl9yZChzZCwgMHgwMyk7CiAKLQkJCXY0bDJfaW5mbyhzZCwgImFkOTM4OWI6IENUUyAlcyBtb2RlOiBOICVkLCBDVFMgJWRcbiIsCi0JCQkJbWFudWFsX2N0cyA/ICJtYW51YWwiIDogImF1dG9tYXRpYyIsIE4sIENUUyk7CisJCXY0bDJfaW5mbyhzZCwgImFkOTM4OWI6IENUUyAlcyBtb2RlOiBOICVkLCBDVFMgJWRcbiIsCisJCQkgIG1hbnVhbF9jdHMgPyAibWFudWFsIiA6ICJhdXRvbWF0aWMiLCBOLCBDVFMpOwogCi0JCQl2NGwyX2luZm8oc2QsICJhZDkzODliOiBWSUM6IGRldGVjdGVkICVkLCBzZW50ICVkXG4iLAotCQkJCXZpY19kZXRlY3QsIHZpY19zZW50KTsKLQkJfQorCQl2NGwyX2luZm8oc2QsICJhZDkzODliOiBWSUM6IGRldGVjdGVkICVkLCBzZW50ICVkXG4iLAorCQkJICB2aWNfZGV0ZWN0LCB2aWNfc2VudCk7CiAJfQogCWlmIChzdGF0ZS0+ZHZfdGltaW5ncy50eXBlID09IFY0TDJfRFZfQlRfNjU2XzExMjApCiAJCXY0bDJfcHJpbnRfZHZfdGltaW5ncyhzZC0+bmFtZSwgInRpbWluZ3M6ICIsCkBAIC00ODYsNyArNDc3LDcgQEAKIAl9CiAJaWYgKGkgPiAxKQogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCi0JCQkibmVlZGVkICVkIHJldHJpZXMgdG8gcG93ZXJ1cCB0aGUgYWQ5Mzg5YlxuIiwgaSk7CisJCQkgIm5lZWRlZCAlZCByZXRyaWVzIHRvIHBvd2VydXAgdGhlIGFkOTM4OWJcbiIsIGkpOwogCiAJLyogU2VsZWN0IGNoaXA6IEFEOTM4OUIgKi8KIAlhZDkzODliX3dyX2FuZF9vcihzZCwgMHhiYSwgMHhlZiwgMHgxMCk7CkBAIC01NTYsMTQgKzU0NywxNiBAQAogCWlycV9zdGF0dXMgPSBhZDkzODliX3JkKHNkLCAweDk2KTsKIAkvKiBjbGVhciBkZXRlY3RlZCBpbnRlcnJ1cHRzICovCiAJYWQ5Mzg5Yl93cihzZCwgMHg5NiwgaXJxX3N0YXR1cyk7CisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwlhZDkzODliX3NldF9pc3Ioc2QsIHRydWUpOwogCi0JaWYgKGlycV9zdGF0dXMgJiAoTUFTS19BRDkzODlCX0hQRF9JTlQgfCBNQVNLX0FEOTM4OUJfTVNFTl9JTlQpKQorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBpcnFfc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBpcnFfc3RhdHVzKTsKKworCWlmIChpcnFfc3RhdHVzICYgKE1BU0tfQUQ5Mzg5Ql9IUERfSU5UKSkKIAkJYWQ5Mzg5Yl9jaGVja19tb25pdG9yX3ByZXNlbnRfc3RhdHVzKHNkKTsKIAlpZiAoaXJxX3N0YXR1cyAmIE1BU0tfQUQ5Mzg5Ql9FRElEX1JEWV9JTlQpCiAJCWFkOTM4OWJfY2hlY2tfZWRpZF9zdGF0dXMoc2QpOwogCi0JLyogZW5hYmxlIGludGVycnVwdHMgKi8KLQlhZDkzODliX3NldF9pc3Ioc2QsIHRydWUpOwogCSpoYW5kbGVkID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU5OSw3ICs1OTIsNyBAQAogCWlmIChlZGlkLT5ibG9ja3MgKyBlZGlkLT5zdGFydF9ibG9jayA+PSBzdGF0ZS0+ZWRpZC5zZWdtZW50cyAqIDIpCiAJCWVkaWQtPmJsb2NrcyA9IHN0YXRlLT5lZGlkLnNlZ21lbnRzICogMiAtIGVkaWQtPnN0YXJ0X2Jsb2NrOwogCW1lbWNweShlZGlkLT5lZGlkLCAmc3RhdGUtPmVkaWQuZGF0YVtlZGlkLT5zdGFydF9ibG9jayAqIDEyOF0sCi0JCQkJMTI4ICogZWRpZC0+YmxvY2tzKTsKKwkgICAgICAgMTI4ICogZWRpZC0+YmxvY2tzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjEyLDggKzYwNSw2IEBACiAvKiBFbmFibGUvZGlzYWJsZSBhZDkzODliIG91dHB1dCAqLwogc3RhdGljIGludCBhZDkzODliX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCiB7Ci0Jc3RydWN0IGFkOTM4OWJfc3RhdGUgKnN0YXRlID0gZ2V0X2FkOTM4OWJfc3RhdGUoc2QpOwotCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6ICVzYWJsZVxuIiwgX19mdW5jX18sIChlbmFibGUgPyAiZW4iIDogImRpcyIpKTsKIAogCWFkOTM4OWJfd3JfYW5kX29yKHNkLCAweGExLCB+MHgzYywgKGVuYWJsZSA/IDAgOiAweDNjKSk7CkBAIC02MjEsNyArNjEyLDYgQEAKIAkJYWQ5Mzg5Yl9jaGVja19tb25pdG9yX3ByZXNlbnRfc3RhdHVzKHNkKTsKIAl9IGVsc2UgewogCQlhZDkzODliX3NfcG93ZXIoc2QsIDApOwotCQlzdGF0ZS0+aGF2ZV9tb25pdG9yID0gZmFsc2U7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjg2LDE0ICs2NzYsMTQgQEAKIH0KIAogc3RhdGljIGludCBhZDkzODliX2VudW1fZHZfdGltaW5ncyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IHY0bDJfZW51bV9kdl90aW1pbmdzICp0aW1pbmdzKQorCQkJCSAgIHN0cnVjdCB2NGwyX2VudW1fZHZfdGltaW5ncyAqdGltaW5ncykKIHsKIAlyZXR1cm4gdjRsMl9lbnVtX2R2X3RpbWluZ3NfY2FwKHRpbWluZ3MsICZhZDkzODliX3RpbWluZ3NfY2FwLAogCQkJTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgYWQ5Mzg5Yl9kdl90aW1pbmdzX2NhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IHY0bDJfZHZfdGltaW5nc19jYXAgKmNhcCkKKwkJCQkgIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3NfY2FwICpjYXApCiB7CiAJKmNhcCA9IGFkOTM4OWJfdGltaW5nc19jYXA7CiAJcmV0dXJuIDA7CkBAIC03MjQsMTUgKzcxNCwxNSBAQAogCXUzMiBOOwogCiAJc3dpdGNoIChmcmVxKSB7Ci0JY2FzZSAzMjAwMDogTiA9IDQwOTY7IGJyZWFrOwotCWNhc2UgNDQxMDA6IE4gPSA2MjcyOyBicmVhazsKLQljYXNlIDQ4MDAwOiBOID0gNjE0NDsgYnJlYWs7Ci0JY2FzZSA4ODIwMDogTiA9IDEyNTQ0OyBicmVhazsKLQljYXNlIDk2MDAwOiBOID0gMTIyODg7IGJyZWFrOworCWNhc2UgMzIwMDA6ICBOID0gNDA5NjsgIGJyZWFrOworCWNhc2UgNDQxMDA6ICBOID0gNjI3MjsgIGJyZWFrOworCWNhc2UgNDgwMDA6ICBOID0gNjE0NDsgIGJyZWFrOworCWNhc2UgODgyMDA6ICBOID0gMTI1NDQ7IGJyZWFrOworCWNhc2UgOTYwMDA6ICBOID0gMTIyODg7IGJyZWFrOwogCWNhc2UgMTc2NDAwOiBOID0gMjUwODg7IGJyZWFrOwogCWNhc2UgMTkyMDAwOiBOID0gMjQ1NzY7IGJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCSAgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogU2V0IE4gKHVzZWQgd2l0aCBDVFMgdG8gcmVnZW5lcmF0ZSB0aGUgYXVkaW8gY2xvY2spICovCkBAIC03NDgsMTUgKzczOCwxNSBAQAogCXUzMiBpMnNfc2Y7CiAKIAlzd2l0Y2ggKGZyZXEpIHsKLQljYXNlIDMyMDAwOiBpMnNfc2YgPSAweDMwOyBicmVhazsKLQljYXNlIDQ0MTAwOiBpMnNfc2YgPSAweDAwOyBicmVhazsKLQljYXNlIDQ4MDAwOiBpMnNfc2YgPSAweDIwOyBicmVhazsKLQljYXNlIDg4MjAwOiBpMnNfc2YgPSAweDgwOyBicmVhazsKLQljYXNlIDk2MDAwOiBpMnNfc2YgPSAweGEwOyBicmVhazsKKwljYXNlIDMyMDAwOiAgaTJzX3NmID0gMHgzMDsgYnJlYWs7CisJY2FzZSA0NDEwMDogIGkyc19zZiA9IDB4MDA7IGJyZWFrOworCWNhc2UgNDgwMDA6ICBpMnNfc2YgPSAweDIwOyBicmVhazsKKwljYXNlIDg4MjAwOiAgaTJzX3NmID0gMHg4MDsgYnJlYWs7CisJY2FzZSA5NjAwMDogIGkyc19zZiA9IDB4YTA7IGJyZWFrOwogCWNhc2UgMTc2NDAwOiBpMnNfc2YgPSAweGMwOyBicmVhazsKIAljYXNlIDE5MjAwMDogaTJzX3NmID0gMHhlMDsgYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJICAgICByZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBTZXQgc2FtcGxpbmcgZnJlcXVlbmN5IGZvciBJMlMgYXVkaW8gdG8gNDgga0h6ICovCkBAIC04MDAsNyArNzkwLDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyB2b2lkIGFkOTM4OWJfZGJnX2R1bXBfZWRpZChpbnQgbHZsLCBpbnQgZGVidWcsIHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkJCQkJaW50IHNlZ21lbnQsIHU4ICpidWYpCisJCQkJICBpbnQgc2VnbWVudCwgdTggKmJ1ZikKIHsKIAlpbnQgaSwgajsKIApAQCAtODI2LDggKzgxNiw4IEBACiBzdGF0aWMgdm9pZCBhZDkzODliX2VkaWRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Ci0Jc3RydWN0IGFkOTM4OWJfc3RhdGUgKnN0YXRlID0gY29udGFpbmVyX29mKGR3b3JrLAotCQkJc3RydWN0IGFkOTM4OWJfc3RhdGUsIGVkaWRfaGFuZGxlcik7CisJc3RydWN0IGFkOTM4OWJfc3RhdGUgKnN0YXRlID0KKwkJY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSwgZWRpZF9oYW5kbGVyKTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJnN0YXRlLT5zZDsKIAlzdHJ1Y3QgYWQ5Mzg5Yl9lZGlkX2RldGVjdCBlZDsKIApAQCAtODQ1LDExICs4MzUsMTAgQEAKIAkJaWYgKHN0YXRlLT5lZGlkLnJlYWRfcmV0cmllcykgewogCQkJc3RhdGUtPmVkaWQucmVhZF9yZXRyaWVzLS07CiAJCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogZWRpZCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJc3RhdGUtPmhhdmVfbW9uaXRvciA9IGZhbHNlOwogCQkJYWQ5Mzg5Yl9zX3Bvd2VyKHNkLCBmYWxzZSk7CiAJCQlhZDkzODliX3NfcG93ZXIoc2QsIHRydWUpOwogCQkJcXVldWVfZGVsYXllZF93b3JrKHN0YXRlLT53b3JrX3F1ZXVlLAotCQkJCQkmc3RhdGUtPmVkaWRfaGFuZGxlciwgRURJRF9ERUxBWSk7CisJCQkJCSAgICZzdGF0ZS0+ZWRpZF9oYW5kbGVyLCBFRElEX0RFTEFZKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTkxNSw0OSArOTA0LDM1IEBACiAJdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBBRDkzODlCX01PTklUT1JfREVURUNULCAodm9pZCAqKSZtZHQpOwogfQogCi1zdGF0aWMgdm9pZCBhZDkzODliX2NoZWNrX21vbml0b3JfcHJlc2VudF9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3N0YXRpYyB2b2lkIGFkOTM4OWJfdXBkYXRlX21vbml0b3JfcHJlc2VudF9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSAqc3RhdGUgPSBnZXRfYWQ5Mzg5Yl9zdGF0ZShzZCk7CiAJLyogcmVhZCBob3RwbHVnIGFuZCByeC1zZW5zZSBzdGF0ZSAqLwogCXU4IHN0YXR1cyA9IGFkOTM4OWJfcmQoc2QsIDB4NDIpOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IHN0YXR1czogMHgleCVzJXNcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgc3RhdHVzLAotCQkJIHN0YXR1cyAmIE1BU0tfQUQ5Mzg5Ql9IUERfREVURUNUID8gIiwgaG90cGx1ZyIgOiAiIiwKLQkJCSBzdGF0dXMgJiBNQVNLX0FEOTM4OUJfTVNFTl9ERVRFQ1QgPyAiLCByeC1zZW5zZSIgOiAiIik7CisJCSBfX2Z1bmNfXywKKwkJIHN0YXR1cywKKwkJIHN0YXR1cyAmIE1BU0tfQUQ5Mzg5Ql9IUERfREVURUNUID8gIiwgaG90cGx1ZyIgOiAiIiwKKwkJIHN0YXR1cyAmIE1BU0tfQUQ5Mzg5Ql9NU0VOX0RFVEVDVCA/ICIsIHJ4LXNlbnNlIiA6ICIiKTsKIAotCWlmICgoc3RhdHVzICYgTUFTS19BRDkzODlCX0hQRF9ERVRFQ1QpICYmCi0JICAgICgoc3RhdHVzICYgTUFTS19BRDkzODlCX01TRU5fREVURUNUKSB8fCBzdGF0ZS0+ZWRpZC5zZWdtZW50cykpIHsKLQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLAotCQkJCSIlczogaG90cGx1ZyBhbmQgKHJ4LXNlbnNlIG9yIGVkaWQpXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICghc3RhdGUtPmhhdmVfbW9uaXRvcikgewotCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IG1vbml0b3IgZGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKLQkJCXN0YXRlLT5oYXZlX21vbml0b3IgPSB0cnVlOwotCQkJYWQ5Mzg5Yl9zZXRfaXNyKHNkLCB0cnVlKTsKLQkJCWlmICghYWQ5Mzg5Yl9zX3Bvd2VyKHNkLCB0cnVlKSkgewotCQkJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKLQkJCQkJIiVzOiBtb25pdG9yIGRldGVjdGVkLCBwb3dlcnVwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkOTM4OWJfc2V0dXAoc2QpOwotCQkJYWQ5Mzg5Yl9ub3RpZnlfbW9uaXRvcl9kZXRlY3Qoc2QpOwotCQkJc3RhdGUtPmVkaWQucmVhZF9yZXRyaWVzID0gRURJRF9NQVhfUkVUUklFUzsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0ZS0+d29ya19xdWV1ZSwKLQkJCQkJJnN0YXRlLT5lZGlkX2hhbmRsZXIsIEVESURfREVMQVkpOwotCQl9Ci0JfSBlbHNlIGlmIChzdGF0dXMgJiBNQVNLX0FEOTM4OUJfSFBEX0RFVEVDVCkgeworCWlmIChzdGF0dXMgJiBNQVNLX0FEOTM4OUJfSFBEX0RFVEVDVCkgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogaG90cGx1ZyBkZXRlY3RlZFxuIiwgX19mdW5jX18pOworCQlzdGF0ZS0+aGF2ZV9tb25pdG9yID0gdHJ1ZTsKKwkJaWYgKCFhZDkzODliX3NfcG93ZXIoc2QsIHRydWUpKSB7CisJCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCisJCQkJICIlczogbW9uaXRvciBkZXRlY3RlZCwgcG93ZXJ1cCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCQlhZDkzODliX3NldHVwKHNkKTsKKwkJYWQ5Mzg5Yl9ub3RpZnlfbW9uaXRvcl9kZXRlY3Qoc2QpOwogCQlzdGF0ZS0+ZWRpZC5yZWFkX3JldHJpZXMgPSBFRElEX01BWF9SRVRSSUVTOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3RhdGUtPndvcmtfcXVldWUsCi0JCQkJJnN0YXRlLT5lZGlkX2hhbmRsZXIsIEVESURfREVMQVkpOworCQkJCSAgICZzdGF0ZS0+ZWRpZF9oYW5kbGVyLCBFRElEX0RFTEFZKTsKIAl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTUFTS19BRDkzODlCX0hQRF9ERVRFQ1QpKSB7CiAJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBob3RwbHVnIG5vdCBkZXRlY3RlZFxuIiwgX19mdW5jX18pOwotCQlpZiAoc3RhdGUtPmhhdmVfbW9uaXRvcikgewotCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IG1vbml0b3Igbm90IGRldGVjdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzdGF0ZS0+aGF2ZV9tb25pdG9yID0gZmFsc2U7Ci0JCQlhZDkzODliX25vdGlmeV9tb25pdG9yX2RldGVjdChzZCk7Ci0JCX0KKwkJc3RhdGUtPmhhdmVfbW9uaXRvciA9IGZhbHNlOworCQlhZDkzODliX25vdGlmeV9tb25pdG9yX2RldGVjdChzZCk7CiAJCWFkOTM4OWJfc19wb3dlcihzZCwgZmFsc2UpOwogCQltZW1zZXQoJnN0YXRlLT5lZGlkLCAwLCBzaXplb2Yoc3RydWN0IGFkOTM4OWJfc3RhdGVfZWRpZCkpOwogCX0KQEAgLTk2Niw2ICs5NDEsMzUgQEAKIAl2NGwyX2N0cmxfc19jdHJsKHN0YXRlLT5ob3RwbHVnX2N0cmwsIGFkOTM4OWJfaGF2ZV9ob3RwbHVnKHNkKSA/IDB4MSA6IDB4MCk7CiAJdjRsMl9jdHJsX3NfY3RybChzdGF0ZS0+cnhfc2Vuc2VfY3RybCwgYWQ5Mzg5Yl9oYXZlX3J4X3NlbnNlKHNkKSA/IDB4MSA6IDB4MCk7CiAJdjRsMl9jdHJsX3NfY3RybChzdGF0ZS0+aGF2ZV9lZGlkMF9jdHJsLCBzdGF0ZS0+ZWRpZC5zZWdtZW50cyA/IDB4MSA6IDB4MCk7CisKKwkvKiB1cGRhdGUgd2l0aCBzZXR0aW5nIGZyb20gY3RybHMgKi8KKwlhZDkzODliX3NfY3RybChzdGF0ZS0+cmdiX3F1YW50aXphdGlvbl9yYW5nZV9jdHJsKTsKKwlhZDkzODliX3NfY3RybChzdGF0ZS0+aGRtaV9tb2RlX2N0cmwpOworfQorCitzdGF0aWMgdm9pZCBhZDkzODliX2NoZWNrX21vbml0b3JfcHJlc2VudF9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSAqc3RhdGUgPSBnZXRfYWQ5Mzg5Yl9zdGF0ZShzZCk7CisJaW50IHJldHJ5ID0gMDsKKworCWFkOTM4OWJfdXBkYXRlX21vbml0b3JfcHJlc2VudF9zdGF0dXMoc2QpOworCisJLyoKKwkgKiBSYXBpZCB0b2dnbGluZyBvZiB0aGUgaG90cGx1ZyBtYXkgbGVhdmUgdGhlIGNoaXAgcG93ZXJlZCBvZmYsCisJICogZXZlbiBpZiB3ZSB0aGluayBpdCBpcyBvbi4gSW4gdGhhdCBjYXNlIHJlc2V0IGFuZCBwb3dlciB1cCBhZ2Fpbi4KKwkgKi8KKwl3aGlsZSAoc3RhdGUtPnBvd2VyX29uICYmIChhZDkzODliX3JkKHNkLCAweDQxKSAmIDB4NDApKSB7CisJCWlmICgrK3JldHJ5ID4gNSkgeworCQkJdjRsMl9lcnIoc2QsICJyZXRyaWVkICVkIHRpbWVzLCBnaXZlIHVwXG4iLCByZXRyeSk7CisJCQlyZXR1cm47CisJCX0KKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IHJlc2V0IGFuZCByZS1jaGVjayBzdGF0dXMgKCVkKVxuIiwgX19mdW5jX18sIHJldHJ5KTsKKwkJYWQ5Mzg5Yl9ub3RpZnlfbW9uaXRvcl9kZXRlY3Qoc2QpOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnN0YXRlLT5lZGlkX2hhbmRsZXIpOworCQltZW1zZXQoJnN0YXRlLT5lZGlkLCAwLCBzaXplb2Yoc3RydWN0IGFkOTM4OWJfc3RhdGVfZWRpZCkpOworCQlhZDkzODliX3NfcG93ZXIoc2QsIGZhbHNlKTsKKwkJYWQ5Mzg5Yl91cGRhdGVfbW9uaXRvcl9wcmVzZW50X3N0YXR1cyhzZCk7CisJfQogfQogCiBzdGF0aWMgYm9vbCBlZGlkX2Jsb2NrX3ZlcmlmeV9jcmModTggKmVkaWRfYmxvY2spCkBAIC05NzgsNyArOTgyLDcgQEAKIAlyZXR1cm4gc3VtID09IDA7CiB9CiAKLXN0YXRpYyBib29sIGVkaWRfc2VnbWVudF92ZXJpZnlfY3JjKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBzZWdtZW50KQorc3RhdGljIGJvb2wgZWRpZF92ZXJpZnlfY3JjKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBzZWdtZW50KQogewogCXN0cnVjdCBhZDkzODliX3N0YXRlICpzdGF0ZSA9IGdldF9hZDkzODliX3N0YXRlKHNkKTsKIAl1MzIgYmxvY2tzID0gc3RhdGUtPmVkaWQuYmxvY2tzOwpAQCAtOTkyLDYgKzk5NiwyNSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wgZWRpZF92ZXJpZnlfaGVhZGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBzZWdtZW50KQoreworCXN0YXRpYyBjb25zdCB1OCBoZG1pX2hlYWRlcltdID0geworCQkweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwCisJfTsKKwlzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSAqc3RhdGUgPSBnZXRfYWQ5Mzg5Yl9zdGF0ZShzZCk7CisJdTggKmRhdGEgPSBzdGF0ZS0+ZWRpZC5kYXRhOworCWludCBpOworCisJaWYgKHNlZ21lbnQpCisJCXJldHVybiB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGRtaV9oZWFkZXIpOyBpKyspCisJCWlmIChkYXRhW2ldICE9IGhkbWlfaGVhZGVyW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBib29sIGFkOTM4OWJfY2hlY2tfZWRpZF9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlzdHJ1Y3QgYWQ5Mzg5Yl9zdGF0ZSAqc3RhdGUgPSBnZXRfYWQ5Mzg5Yl9zdGF0ZShzZCk7CkBAIC0xMDAwLDcgKzEwMjMsNyBAQAogCXU4IGVkaWRSZHkgPSBhZDkzODliX3JkKHNkLCAweGM1KTsKIAogCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBlZGlkIHJlYWR5IChyZXRyaWVzOiAlZClcbiIsCi0JCQkgX19mdW5jX18sIEVESURfTUFYX1JFVFJJRVMgLSBzdGF0ZS0+ZWRpZC5yZWFkX3JldHJpZXMpOworCQkgX19mdW5jX18sIEVESURfTUFYX1JFVFJJRVMgLSBzdGF0ZS0+ZWRpZC5yZWFkX3JldHJpZXMpOwogCiAJaWYgKCEoZWRpZFJkeSAmIE1BU0tfQUQ5Mzg5Ql9FRElEX1JEWSkpCiAJCXJldHVybiBmYWxzZTsKQEAgLTEwMTMsMTYgKzEwMzYsMTYgQEAKIAl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogZ290IHNlZ21lbnQgJWRcbiIsIF9fZnVuY19fLCBzZWdtZW50KTsKIAlhZDkzODliX2VkaWRfcmQoc2QsIDI1NiwgJnN0YXRlLT5lZGlkLmRhdGFbc2VnbWVudCAqIDI1Nl0pOwogCWFkOTM4OWJfZGJnX2R1bXBfZWRpZCgyLCBkZWJ1Zywgc2QsIHNlZ21lbnQsCi0JCQkmc3RhdGUtPmVkaWQuZGF0YVtzZWdtZW50ICogMjU2XSk7CisJCQkgICAgICAmc3RhdGUtPmVkaWQuZGF0YVtzZWdtZW50ICogMjU2XSk7CiAJaWYgKHNlZ21lbnQgPT0gMCkgewogCQlzdGF0ZS0+ZWRpZC5ibG9ja3MgPSBzdGF0ZS0+ZWRpZC5kYXRhWzB4N2VdICsgMTsKIAkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6ICVkIGJsb2NrcyBpbiB0b3RhbFxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhdGUtPmVkaWQuYmxvY2tzKTsKKwkJCSBfX2Z1bmNfXywgc3RhdGUtPmVkaWQuYmxvY2tzKTsKIAl9Ci0JaWYgKCFlZGlkX3NlZ21lbnRfdmVyaWZ5X2NyYyhzZCwgc2VnbWVudCkpIHsKKwlpZiAoIWVkaWRfdmVyaWZ5X2NyYyhzZCwgc2VnbWVudCkgfHwKKwkgICAgIWVkaWRfdmVyaWZ5X2hlYWRlcihzZCwgc2VnbWVudCkpIHsKIAkJLyogZWRpZCBjcmMgZXJyb3IsIGZvcmNlIHJlcmVhZCBvZiBlZGlkIHNlZ21lbnQgKi8KLQkJdjRsMl9lcnIoc2QsICIlczogZWRpZCBjcmMgZXJyb3JcbiIsIF9fZnVuY19fKTsKLQkJc3RhdGUtPmhhdmVfbW9uaXRvciA9IGZhbHNlOworCQl2NGwyX2VycihzZCwgIiVzOiBlZGlkIGNyYyBvciBoZWFkZXIgZXJyb3JcbiIsIF9fZnVuY19fKTsKIAkJYWQ5Mzg5Yl9zX3Bvd2VyKHNkLCBmYWxzZSk7CiAJCWFkOTM4OWJfc19wb3dlcihzZCwgdHJ1ZSk7CiAJCXJldHVybiBmYWxzZTsKQEAgLTEwMzIsMTIgKzEwNTUsMTIgQEAKIAlpZiAoKChzdGF0ZS0+ZWRpZC5kYXRhWzB4N2VdID4+IDEpICsgMSkgPiBzdGF0ZS0+ZWRpZC5zZWdtZW50cykgewogCQkvKiBSZXF1ZXN0IG5leHQgRURJRCBzZWdtZW50ICovCiAJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiByZXF1ZXN0IHNlZ21lbnQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHN0YXRlLT5lZGlkLnNlZ21lbnRzKTsKKwkJCSBfX2Z1bmNfXywgc3RhdGUtPmVkaWQuc2VnbWVudHMpOwogCQlhZDkzODliX3dyKHNkLCAweGM5LCAweGYpOwogCQlhZDkzODliX3dyKHNkLCAweGM0LCBzdGF0ZS0+ZWRpZC5zZWdtZW50cyk7CiAJCXN0YXRlLT5lZGlkLnJlYWRfcmV0cmllcyA9IEVESURfTUFYX1JFVFJJRVM7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0ZS0+d29ya19xdWV1ZSwKLQkJCQkmc3RhdGUtPmVkaWRfaGFuZGxlciwgRURJRF9ERUxBWSk7CisJCQkJICAgJnN0YXRlLT5lZGlkX2hhbmRsZXIsIEVESURfREVMQVkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xMDgxLDcgKzExMDQsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRldGVjdGluZyBhZDkzODliIGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsCi0JCQljbGllbnQtPmFkZHIgPDwgMSk7CisJCWNsaWVudC0+YWRkciA8PCAxKTsKIAogCXN0YXRlID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghc3RhdGUpCkBAIC0xMTQwLDcgKzExNjMsNyBAQAogCQlnb3RvIGVycl9lbnRpdHk7CiAJfQogCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInJlZyAweDQxIDB4JXgsIGNoaXAgdmVyc2lvbiAocmVnIDB4MDApIDB4JXhcbiIsCi0JCQlhZDkzODliX3JkKHNkLCAweDQxKSwgc3RhdGUtPmNoaXBfcmV2aXNpb24pOworCQkgYWQ5Mzg5Yl9yZChzZCwgMHg0MSksIHN0YXRlLT5jaGlwX3JldmlzaW9uKTsKIAogCXN0YXRlLT5lZGlkX2kyY19jbGllbnQgPSBpMmNfbmV3X2R1bW15KGNsaWVudC0+YWRhcHRlciwgKDB4N2U+PjEpKTsKIAlpZiAoc3RhdGUtPmVkaWRfaTJjX2NsaWVudCA9PSBOVUxMKSB7CkBAIC0xMTYzLDcgKzExODYsNyBAQAogCWFkOTM4OWJfc2V0X2lzcihzZCwgdHJ1ZSk7CiAKIAl2NGwyX2luZm8oc2QsICIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgY2xpZW50LT5uYW1lLAotCQkJICBjbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwkJICBjbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKIAlyZXR1cm4gMDsKIAogZXJyX3VucmVnOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzUxMS5jIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzUxMS5jCmluZGV4IDdjOGQ5NzEuLmVlNjE4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL2Fkdjc1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9hZHY3NTExLmMKQEAgLTQ1Miw2ICs0NTIsMjkgQEAKIAkJCSAgZXJyb3JzW2Fkdjc1MTFfcmQoc2QsIDB4YzgpID4+IDRdLCBzdGF0ZS0+ZWRpZF9kZXRlY3RfY291bnRlciwKIAkJCSAgYWR2NzUxMV9yZChzZCwgMHg5NCksIGFkdjc1MTFfcmQoc2QsIDB4OTYpKTsKIAl2NGwyX2luZm8oc2QsICJSR0IgcXVhbnRpemF0aW9uOiAlcyByYW5nZVxuIiwgYWR2NzUxMV9yZChzZCwgMHgxOCkgJiAweDgwID8gImxpbWl0ZWQiIDogImZ1bGwiKTsKKwlpZiAoYWR2NzUxMV9yZChzZCwgMHhhZikgJiAweDAyKSB7CisJCS8qIEhETUkgb25seSAqLworCQl1OCBtYW51YWxfY3RzID0gYWR2NzUxMV9yZChzZCwgMHgwYSkgJiAweDgwOworCQl1MzIgTiA9IChhZHY3NTExX3JkKHNkLCAweDAxKSAmIDB4ZikgPDwgMTYgfAorCQkJYWR2NzUxMV9yZChzZCwgMHgwMikgPDwgOCB8CisJCQlhZHY3NTExX3JkKHNkLCAweDAzKTsKKwkJdTggdmljX2RldGVjdCA9IGFkdjc1MTFfcmQoc2QsIDB4M2UpID4+IDI7CisJCXU4IHZpY19zZW50ID0gYWR2NzUxMV9yZChzZCwgMHgzZCkgJiAweDNmOworCQl1MzIgQ1RTOworCisJCWlmIChtYW51YWxfY3RzKQorCQkJQ1RTID0gKGFkdjc1MTFfcmQoc2QsIDB4MDcpICYgMHhmKSA8PCAxNiB8CisJCQkgICAgICBhZHY3NTExX3JkKHNkLCAweDA4KSA8PCA4IHwKKwkJCSAgICAgIGFkdjc1MTFfcmQoc2QsIDB4MDkpOworCQllbHNlCisJCQlDVFMgPSAoYWR2NzUxMV9yZChzZCwgMHgwNCkgJiAweGYpIDw8IDE2IHwKKwkJCSAgICAgIGFkdjc1MTFfcmQoc2QsIDB4MDUpIDw8IDggfAorCQkJICAgICAgYWR2NzUxMV9yZChzZCwgMHgwNik7CisJCXY0bDJfaW5mbyhzZCwgIkNUUyAlcyBtb2RlOiBOICVkLCBDVFMgJWRcbiIsCisJCQkgIG1hbnVhbF9jdHMgPyAibWFudWFsIiA6ICJhdXRvbWF0aWMiLCBOLCBDVFMpOworCQl2NGwyX2luZm8oc2QsICJWSUM6IGRldGVjdGVkICVkLCBzZW50ICVkXG4iLAorCQkJICB2aWNfZGV0ZWN0LCB2aWNfc2VudCk7CisJfQogCWlmIChzdGF0ZS0+ZHZfdGltaW5ncy50eXBlID09IFY0TDJfRFZfQlRfNjU2XzExMjApCiAJCXY0bDJfcHJpbnRfZHZfdGltaW5ncyhzZC0+bmFtZSwgInRpbWluZ3M6ICIsCiAJCQkJJnN0YXRlLT5kdl90aW1pbmdzLCBmYWxzZSk7CkBAIC05NDIsMjYgKzk2NSwzOCBAQAogCiBzdGF0aWMgYm9vbCBlZGlkX2Jsb2NrX3ZlcmlmeV9jcmModWludDhfdCAqZWRpZF9ibG9jaykKIHsKLQlpbnQgaTsKIAl1aW50OF90IHN1bSA9IDA7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCi0JCXN1bSArPSAqKGVkaWRfYmxvY2sgKyBpKTsKLQlyZXR1cm4gKHN1bSA9PSAwKTsKKwkJc3VtICs9IGVkaWRfYmxvY2tbaV07CisJcmV0dXJuIHN1bSA9PSAwOwogfQogCi1zdGF0aWMgYm9vbCBlZGlkX3NlZ21lbnRfdmVyaWZ5X2NyYyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc2VnbWVudCkKK3N0YXRpYyBib29sIGVkaWRfdmVyaWZ5X2NyYyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc2VnbWVudCkKIHsKIAlzdHJ1Y3QgYWR2NzUxMV9zdGF0ZSAqc3RhdGUgPSBnZXRfYWR2NzUxMV9zdGF0ZShzZCk7CiAJdTMyIGJsb2NrcyA9IHN0YXRlLT5lZGlkLmJsb2NrczsKIAl1aW50OF90ICpkYXRhID0gc3RhdGUtPmVkaWQuZGF0YTsKIAotCWlmIChlZGlkX2Jsb2NrX3ZlcmlmeV9jcmMoJmRhdGFbc2VnbWVudCAqIDI1Nl0pKSB7Ci0JCWlmICgoc2VnbWVudCArIDEpICogMiA8PSBibG9ja3MpCi0JCQlyZXR1cm4gZWRpZF9ibG9ja192ZXJpZnlfY3JjKCZkYXRhW3NlZ21lbnQgKiAyNTYgKyAxMjhdKTsKKwlpZiAoIWVkaWRfYmxvY2tfdmVyaWZ5X2NyYygmZGF0YVtzZWdtZW50ICogMjU2XSkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoKHNlZ21lbnQgKyAxKSAqIDIgPD0gYmxvY2tzKQorCQlyZXR1cm4gZWRpZF9ibG9ja192ZXJpZnlfY3JjKCZkYXRhW3NlZ21lbnQgKiAyNTYgKyAxMjhdKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZWRpZF92ZXJpZnlfaGVhZGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBzZWdtZW50KQoreworCXN0YXRpYyBjb25zdCB1OCBoZG1pX2hlYWRlcltdID0geworCQkweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwCisJfTsKKwlzdHJ1Y3QgYWR2NzUxMV9zdGF0ZSAqc3RhdGUgPSBnZXRfYWR2NzUxMV9zdGF0ZShzZCk7CisJdTggKmRhdGEgPSBzdGF0ZS0+ZWRpZC5kYXRhOworCisJaWYgKHNlZ21lbnQgIT0gMCkKIAkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gIW1lbWNtcChkYXRhLCBoZG1pX2hlYWRlciwgc2l6ZW9mKGhkbWlfaGVhZGVyKSk7CiB9CiAKIHN0YXRpYyBib29sIGFkdjc1MTFfY2hlY2tfZWRpZF9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKQEAgLTk5MCw5ICsxMDI1LDEwIEBACiAJCQlzdGF0ZS0+ZWRpZC5ibG9ja3MgPSBzdGF0ZS0+ZWRpZC5kYXRhWzB4N2VdICsgMTsKIAkJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiAlZCBibG9ja3MgaW4gdG90YWxcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZWRpZC5ibG9ja3MpOwogCQl9Ci0JCWlmICghZWRpZF9zZWdtZW50X3ZlcmlmeV9jcmMoc2QsIHNlZ21lbnQpKSB7CisJCWlmICghZWRpZF92ZXJpZnlfY3JjKHNkLCBzZWdtZW50KSB8fAorCQkgICAgIWVkaWRfdmVyaWZ5X2hlYWRlcihzZCwgc2VnbWVudCkpIHsKIAkJCS8qIGVkaWQgY3JjIGVycm9yLCBmb3JjZSByZXJlYWQgb2YgZWRpZCBzZWdtZW50ICovCi0JCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogZWRpZCBjcmMgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJCXY0bDJfZXJyKHNkLCAiJXM6IGVkaWQgY3JjIG9yIGhlYWRlciBlcnJvclxuIiwgX19mdW5jX18pOwogCQkJc3RhdGUtPmhhdmVfbW9uaXRvciA9IGZhbHNlOwogCQkJYWR2NzUxMV9zX3Bvd2VyKHNkLCBmYWxzZSk7CiAJCQlhZHY3NTExX3NfcG93ZXIoc2QsIHRydWUpOwpAQCAtMTAzOCw2ICsxMDc0LDEyIEBACiAKIAkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwogCWFkdjc1MTFfd3Ioc2QsIDB4OTYsIDB4ZmYpOworCS8qCisJICogU3RvcCBIUEQgZnJvbSByZXNldHRpbmcgYSBsb3Qgb2YgcmVnaXN0ZXJzLgorCSAqIEl0IG1pZ2h0IGxlYXZlIHRoZSBjaGlwIGluIGEgcGFydGx5IHVuLWluaXRpYWxpemVkIHN0YXRlLAorCSAqIGluIHBhcnRpY3VsYXIgd2l0aCByZWdhcmRzIHRvIGhvdHBsdWcgYm91bmNlcy4KKwkgKi8KKwlhZHY3NTExX3dyX2FuZF9vcihzZCwgMHhkNiwgMHgzZiwgMHhjMCk7CiAJbWVtc2V0KGVkaWQsIDAsIHNpemVvZihzdHJ1Y3QgYWR2NzUxMV9zdGF0ZV9lZGlkKSk7CiAJc3RhdGUtPmhhdmVfbW9uaXRvciA9IGZhbHNlOwogCWFkdjc1MTFfc2V0X2lzcihzZCwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzYwNC5jIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzYwNC5jCmluZGV4IGEzMjQxMDZiLi43MWM4NTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9hZHY3NjA0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzYwNC5jCkBAIC01Myw4ICs1Myw2IEBACiAvKiBBRFY3NjA0IHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgKi8KICNkZWZpbmUgQURWNzYwNF9mc2MgKDI4NjM2MzYwKQogCi0jZGVmaW5lIERJR0lUQUxfSU5QVVQgKHN0YXRlLT5tb2RlID09IEFEVjc2MDRfTU9ERV9IRE1JKQotCiAvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NywxNyArNjUsMTkgQEAKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAJc3RydWN0IG1lZGlhX3BhZCBwYWQ7CiAJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhkbDsKLQllbnVtIGFkdjc2MDRfbW9kZSBtb2RlOworCWVudW0gYWR2NzYwNF9pbnB1dF9wb3J0IHNlbGVjdGVkX2lucHV0OwogCXN0cnVjdCB2NGwyX2R2X3RpbWluZ3MgdGltaW5nczsKLQl1OCBlZGlkWzI1Nl07Ci0JdW5zaWduZWQgZWRpZF9ibG9ja3M7CisJc3RydWN0IHsKKwkJdTggZWRpZFsyNTZdOworCQl1MzIgcHJlc2VudDsKKwkJdW5zaWduZWQgYmxvY2tzOworCX0gZWRpZDsKKwl1MTYgc3BhX3BvcnRfYVsyXTsKIAlzdHJ1Y3QgdjRsMl9mcmFjdCBhc3BlY3RfcmF0aW87CiAJdTMyIHJnYl9xdWFudGl6YXRpb25fcmFuZ2U7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfcXVldWVzOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrX2VuYWJsZV9ob3RwbHVnOwotCWJvb2wgY29ubmVjdG9yX2hkbWk7CiAJYm9vbCByZXN0YXJ0X3N0ZGlfb25jZTsKLQl1MzIgcHJldl9pbnB1dF9zdGF0dXM7CiAKIAkvKiBpMmMgY2xpZW50cyAqLwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfYXZsaW5rOwpAQCAtMTYwLDYgKzE2MCw3IEBACiAJVjRMMl9EVl9CVF9ETVRfMTc5MlgxMzQ0UDYwLAogCVY0TDJfRFZfQlRfRE1UXzE4NTZYMTM5MlA2MCwKIAlWNEwyX0RWX0JUX0RNVF8xOTIwWDEyMDBQNjBfUkIsCisJVjRMMl9EVl9CVF9ETVRfMTM2Nlg3NjhQNjBfUkIsCiAJVjRMMl9EVl9CVF9ETVRfMTM2Nlg3NjhQNjAsCiAJVjRMMl9EVl9CVF9ETVRfMTkyMFgxMDgwUDYwLAogCXsgfSwKQEAgLTUwNyw2ICs1MDgsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZWRpZF93cml0ZV9ibG9jayhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCQl1bnNpZ25lZCBsZW4sIGNvbnN0IHU4ICp2YWwpCit7CisJc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCWludCBlcnIgPSAwOworCWludCBpOworCisJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXM6IHdyaXRlIEVESUQgYmxvY2sgKCVkIGJ5dGUpXG4iLCBfX2Z1bmNfXywgbGVuKTsKKworCWZvciAoaSA9IDA7ICFlcnIgJiYgaSA8IGxlbjsgaSArPSBJMkNfU01CVVNfQkxPQ0tfTUFYKQorCQllcnIgPSBhZHZfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoc3RhdGUtPmkyY19lZGlkLCBpLAorCQkJCUkyQ19TTUJVU19CTE9DS19NQVgsIHZhbCArIGkpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIGFkdjc2MDRfZGVsYXllZF93b3JrX2VuYWJsZV9ob3RwbHVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKQEAgLTUxNiw0OCArNTMyLDcgQEAKIAogCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBlbmFibGUgaG90cGx1Z1xuIiwgX19mdW5jX18pOwogCi0JdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBBRFY3NjA0X0hPVFBMVUcsICh2b2lkICopMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGVkaWRfd3JpdGVfYmxvY2soc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCQkJdW5zaWduZWQgbGVuLCBjb25zdCB1OCAqdmFsKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0KLQl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogd3JpdGUgRURJRCBibG9jayAoJWQgYnl0ZSlcbiIsIF9fZnVuY19fLCBsZW4pOwotCi0JdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBBRFY3NjA0X0hPVFBMVUcsICh2b2lkICopMCk7Ci0KLQkvKiBEaXNhYmxlcyBJMkMgYWNjZXNzIHRvIGludGVybmFsIEVESUQgcmFtIGZyb20gRERDIHBvcnQgKi8KLQlyZXBfd3JpdGVfYW5kX29yKHNkLCAweDc3LCAweGYwLCAweDApOwotCi0JZm9yIChpID0gMDsgIWVyciAmJiBpIDwgbGVuOyBpICs9IEkyQ19TTUJVU19CTE9DS19NQVgpCi0JCWVyciA9IGFkdl9zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShzdGF0ZS0+aTJjX2VkaWQsIGksCi0JCQkJSTJDX1NNQlVTX0JMT0NLX01BWCwgdmFsICsgaSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qIGFkdjc2MDQgY2FsY3VsYXRlcyB0aGUgY2hlY2tzdW1zIGFuZCBlbmFibGVzIEkyQyBhY2Nlc3MgdG8gaW50ZXJuYWwKLQkgICBFRElEIHJhbSBmcm9tIEREQyBwb3J0LiAqLwotCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4ZjAsIDB4MSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWlmIChyZXBfcmVhZChzZCwgMHg3ZCkgJiAxKQotCQkJYnJlYWs7Ci0JCW1kZWxheSgxKTsKLQl9Ci0JaWYgKGkgPT0gMTAwMCkgewotCQl2NGxfZXJyKGNsaWVudCwgImVycm9yIGVuYWJsaW5nIGVkaWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBlbmFibGUgaG90cGx1ZyBhZnRlciAxMDAgbXMgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsoc3RhdGUtPndvcmtfcXVldWVzLAotCQkJJnN0YXRlLT5kZWxheWVkX3dvcmtfZW5hYmxlX2hvdHBsdWcsIEhaIC8gMTApOwotCXJldHVybiAwOworCXY0bDJfc3ViZGV2X25vdGlmeShzZCwgQURWNzYwNF9IT1RQTFVHLCAodm9pZCAqKSZzdGF0ZS0+ZWRpZC5wcmVzZW50KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaGRtaV9yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKQEAgLTU3NCw2ICs1NDksMTEgQEAKIAlyZXR1cm4gYWR2X3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdGF0ZS0+aTJjX2hkbWksIHJlZywgdmFsKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaGRtaV93cml0ZV9hbmRfb3Ioc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCBtYXNrLCB1OCB2YWwpCit7CisJcmV0dXJuIGhkbWlfd3JpdGUoc2QsIHJlZywgKGhkbWlfcmVhZChzZCwgcmVnKSAmIG1hc2spIHwgdmFsKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgdGVzdF9yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKIAlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CkBAIC02MjMsNiArNjAzLDI2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19hbmFsb2dfaW5wdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlyZXR1cm4gc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfVkdBX1JHQiB8fAorCSAgICAgICBzdGF0ZS0+c2VsZWN0ZWRfaW5wdXQgPT0gQURWNzYwNF9JTlBVVF9WR0FfQ09NUDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2RpZ2l0YWxfaW5wdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlyZXR1cm4gc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfSERNSV9QT1JUX0EgfHwKKwkgICAgICAgc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfSERNSV9QT1JUX0IgfHwKKwkgICAgICAgc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfSERNSV9QT1JUX0MgfHwKKwkgICAgICAgc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfSERNSV9QT1JUX0Q7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiBzdGF0aWMgdm9pZCBhZHY3NjA0X2ludl9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewpAQCAtNjk2LDQ1ICs2OTYsNDcgQEAKIHN0YXRpYyBpbnQgYWR2NzYwNF9zX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQogeworCXU4IHZhbCA9IHJlZy0+dmFsICYgMHhmZjsKKwogCXN3aXRjaCAocmVnLT5yZWcgPj4gOCkgewogCWNhc2UgMDoKLQkJaW9fd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwkJaW9fd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlhdmxpbmtfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwkJYXZsaW5rX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJY2VjX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7CisJCWNlY193cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCB2YWwpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWluZm9mcmFtZV93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCQlpbmZvZnJhbWVfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQllc2RwX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7CisJCWVzZHBfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSA1OgotCQlkcHBfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwkJZHBwX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgNjoKLQkJYWZlX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7CisJCWFmZV93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCB2YWwpOwogCQlicmVhazsKIAljYXNlIDc6Ci0JCXJlcF93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCQlyZXBfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQllZGlkX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7CisJCWVkaWRfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSA5OgotCQloZG1pX3dyaXRlKHNkLCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7CisJCWhkbWlfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSAweGE6Ci0JCXRlc3Rfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwkJdGVzdF93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCB2YWwpOwogCQlicmVhazsKIAljYXNlIDB4YjoKLQkJY3Bfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwkJY3Bfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSAweGM6Ci0JCXZkcF93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCQl2ZHBfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgdmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdjRsMl9pbmZvKHNkLCAiUmVnaXN0ZXIgJTAzbGx4IG5vdCBzdXBwb3J0ZWRcbiIsIHJlZy0+cmVnKTsKQEAgLTc0OCwxMCArNzUwLDEzIEBACiBzdGF0aWMgaW50IGFkdjc2MDRfc19kZXRlY3RfdHhfNXZfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBhZHY3NjA0X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwl1OCByZWdfaW9fNmYgPSBpb19yZWFkKHNkLCAweDZmKTsKIAotCS8qIHBvcnQgQSBvbmx5ICovCiAJcmV0dXJuIHY0bDJfY3RybF9zX2N0cmwoc3RhdGUtPmRldGVjdF90eF81dl9jdHJsLAotCQkJCSgoaW9fcmVhZChzZCwgMHg2ZikgJiAweDEwKSA+PiA0KSk7CisJCQkoKHJlZ19pb182ZiAmIDB4MTApID4+IDQpIHwKKwkJCSgocmVnX2lvXzZmICYgMHgwOCkgPj4gMikgfAorCQkJKHJlZ19pb182ZiAmIDB4MDQpIHwKKwkJCSgocmVnX2lvXzZmICYgMHgwMikgPDwgMikpOwogfQogCiBzdGF0aWMgaW50IGZpbmRfYW5kX3NldF9wcmVkZWZpbmVkX3ZpZGVvX3RpbWluZ3Moc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKQEAgLTc1OSwxMiArNzY0LDExIEBACiAJCWNvbnN0IHN0cnVjdCBhZHY3NjA0X3ZpZGVvX3N0YW5kYXJkcyAqcHJlZGVmX3ZpZF90aW1pbmdzLAogCQljb25zdCBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzICp0aW1pbmdzKQogewotCXN0cnVjdCBhZHY3NjA0X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IHByZWRlZl92aWRfdGltaW5nc1tpXS50aW1pbmdzLmJ0LndpZHRoOyBpKyspIHsKIAkJaWYgKCF2NGwyX21hdGNoX2R2X3RpbWluZ3ModGltaW5ncywgJnByZWRlZl92aWRfdGltaW5nc1tpXS50aW1pbmdzLAotCQkJCQlESUdJVEFMX0lOUFVUID8gMjUwMDAwIDogMTAwMDAwMCkpCisJCQkJCWlzX2RpZ2l0YWxfaW5wdXQoc2QpID8gMjUwMDAwIDogMTAwMDAwMCkpCiAJCQljb250aW51ZTsKIAkJaW9fd3JpdGUoc2QsIDB4MDAsIHByZWRlZl92aWRfdGltaW5nc1tpXS52aWRfc3RkKTsgLyogdmlkZW8gc3RkICovCiAJCWlvX3dyaXRlKHNkLCAweDAxLCAocHJlZGVmX3ZpZF90aW1pbmdzW2ldLnZfZnJlcSA8PCA0KSArCkBAIC03OTksMjcgKzgwMywyMiBAQAogCWNwX3dyaXRlKHNkLCAweGFiLCAweDAwKTsKIAljcF93cml0ZShzZCwgMHhhYywgMHgwMCk7CiAKLQlzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7Ci0JY2FzZSBBRFY3NjA0X01PREVfQ09NUDoKLQljYXNlIEFEVjc2MDRfTU9ERV9HUjoKKwlpZiAoaXNfYW5hbG9nX2lucHV0KHNkKSkgewogCQllcnIgPSBmaW5kX2FuZF9zZXRfcHJlZGVmaW5lZF92aWRlb190aW1pbmdzKHNkLAogCQkJCTB4MDEsIGFkdjc2MDRfcHJpbV9tb2RlX2NvbXAsIHRpbWluZ3MpOwogCQlpZiAoZXJyKQogCQkJZXJyID0gZmluZF9hbmRfc2V0X3ByZWRlZmluZWRfdmlkZW9fdGltaW5ncyhzZCwKIAkJCQkJMHgwMiwgYWR2NzYwNF9wcmltX21vZGVfZ3IsIHRpbWluZ3MpOwotCQlicmVhazsKLQljYXNlIEFEVjc2MDRfTU9ERV9IRE1JOgorCX0gZWxzZSBpZiAoaXNfZGlnaXRhbF9pbnB1dChzZCkpIHsKIAkJZXJyID0gZmluZF9hbmRfc2V0X3ByZWRlZmluZWRfdmlkZW9fdGltaW5ncyhzZCwKIAkJCQkweDA1LCBhZHY3NjA0X3ByaW1fbW9kZV9oZG1pX2NvbXAsIHRpbWluZ3MpOwogCQlpZiAoZXJyKQogCQkJZXJyID0gZmluZF9hbmRfc2V0X3ByZWRlZmluZWRfdmlkZW9fdGltaW5ncyhzZCwKIAkJCQkJMHgwNiwgYWR2NzYwNF9wcmltX21vZGVfaGRtaV9nciwgdGltaW5ncyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBVbmtub3duIG1vZGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHN0YXRlLT5tb2RlKTsKKwl9IGVsc2UgeworCQl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogVW5rbm93biBwb3J0ICVkIHNlbGVjdGVkXG4iLAorCQkJCV9fZnVuY19fLCBzdGF0ZS0+c2VsZWN0ZWRfaW5wdXQpOwogCQllcnIgPSAtMTsKLQkJYnJlYWs7CiAJfQogCiAKQEAgLTg0Niw5ICs4NDUsNyBAQAogCiAJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXNcbiIsIF9fZnVuY19fKTsKIAotCXN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLQljYXNlIEFEVjc2MDRfTU9ERV9DT01QOgotCWNhc2UgQURWNzYwNF9NT0RFX0dSOgorCWlmIChpc19hbmFsb2dfaW5wdXQoc2QpKSB7CiAJCS8qIGF1dG8gZ3JhcGhpY3MgKi8KIAkJaW9fd3JpdGUoc2QsIDB4MDAsIDB4MDcpOyAvKiB2aWRlbyBzdGQgKi8KIAkJaW9fd3JpdGUoc2QsIDB4MDEsIDB4MDIpOyAvKiBwcmltIG1vZGUgKi8KQEAgLTg1OCwzMyArODU1LDI4IEBACiAJCS8qIFNob3VsZCBvbmx5IGJlIHNldCBpbiBhdXRvLWdyYXBoaWNzIG1vZGUgW1JFRl8wMiwgcC4gOTEtOTJdICovCiAJCS8qIHNldHVwIFBMTF9ESVZfTUFOX0VOIGFuZCBQTExfRElWX1JBVElPICovCiAJCS8qIElPLW1hcCByZWcuIDB4MTYgYW5kIDB4MTcgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gc2VxdWVuY2UgKi8KLQkJaWYgKGFkdl9zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIDB4MTYsIDIsIHBsbCkpIHsKKwkJaWYgKGFkdl9zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIDB4MTYsIDIsIHBsbCkpCiAJCQl2NGwyX2VycihzZCwgIndyaXRpbmcgdG8gcmVnIDB4MTYgYW5kIDB4MTcgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9CiAKIAkJLyogYWN0aXZlIHZpZGVvIC0gaG9yaXpvbnRhbCB0aW1pbmcgKi8KIAkJY3Bfd3JpdGUoc2QsIDB4YTIsIChjcF9zdGFydF9zYXYgPj4gNCkgJiAweGZmKTsKIAkJY3Bfd3JpdGUoc2QsIDB4YTMsICgoY3Bfc3RhcnRfc2F2ICYgMHgwZikgPDwgNCkgfAotCQkJCQkoKGNwX3N0YXJ0X2VhdiA+PiA4KSAmIDB4MGYpKTsKKwkJCQkgICAoKGNwX3N0YXJ0X2VhdiA+PiA4KSAmIDB4MGYpKTsKIAkJY3Bfd3JpdGUoc2QsIDB4YTQsIGNwX3N0YXJ0X2VhdiAmIDB4ZmYpOwogCiAJCS8qIGFjdGl2ZSB2aWRlbyAtIHZlcnRpY2FsIHRpbWluZyAqLwogCQljcF93cml0ZShzZCwgMHhhNSwgKGNwX3N0YXJ0X3ZiaSA+PiA0KSAmIDB4ZmYpOwogCQljcF93cml0ZShzZCwgMHhhNiwgKChjcF9zdGFydF92YmkgJiAweGYpIDw8IDQpIHwKLQkJCQkJKChjcF9lbmRfdmJpID4+IDgpICYgMHhmKSk7CisJCQkJICAgKChjcF9lbmRfdmJpID4+IDgpICYgMHhmKSk7CiAJCWNwX3dyaXRlKHNkLCAweGE3LCBjcF9lbmRfdmJpICYgMHhmZik7Ci0JCWJyZWFrOwotCWNhc2UgQURWNzYwNF9NT0RFX0hETUk6CisJfSBlbHNlIGlmIChpc19kaWdpdGFsX2lucHV0KHNkKSkgewogCQkvKiBzZXQgZGVmYXVsdCBwcmltX21vZGUvdmlkX3N0ZCBmb3IgSERNSQogCQkgICBhY2NvcmRpbmcgdG8gW1JFRl8wMywgYy4gNC4yXSAqLwogCQlpb193cml0ZShzZCwgMHgwMCwgMHgwMik7IC8qIHZpZGVvIHN0ZCAqLwogCQlpb193cml0ZShzZCwgMHgwMSwgMHgwNik7IC8qIHByaW0gbW9kZSAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogVW5rbm93biBtb2RlICVkXG4iLAotCQkJCV9fZnVuY19fLCBzdGF0ZS0+bW9kZSk7Ci0JCWJyZWFrOworCX0gZWxzZSB7CisJCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBVbmtub3duIHBvcnQgJWQgc2VsZWN0ZWRcbiIsCisJCQkJX19mdW5jX18sIHN0YXRlLT5zZWxlY3RlZF9pbnB1dCk7CiAJfQogCiAJY3Bfd3JpdGUoc2QsIDB4OGYsIChjaDFfZnJfbGwgPj4gOCkgJiAweDcpOwpAQCAtODkzLDQzICs4ODUsMTQ5IEBACiAJY3Bfd3JpdGUoc2QsIDB4YWMsIChoZWlnaHQgJiAweDBmKSA8PCA0KTsKIH0KIAorc3RhdGljIHZvaWQgYWR2NzYwNF9zZXRfb2Zmc2V0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGJvb2wgYXV0b19vZmZzZXQsIHUxNiBvZmZzZXRfYSwgdTE2IG9mZnNldF9iLCB1MTYgb2Zmc2V0X2MpCit7CisJc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXU4IG9mZnNldF9idWZbNF07CisKKwlpZiAoYXV0b19vZmZzZXQpIHsKKwkJb2Zmc2V0X2EgPSAweDNmZjsKKwkJb2Zmc2V0X2IgPSAweDNmZjsKKwkJb2Zmc2V0X2MgPSAweDNmZjsKKwl9CisKKwl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogJXMgb2Zmc2V0OiBhID0gMHgleCwgYiA9IDB4JXgsIGMgPSAweCV4XG4iLAorCQkJX19mdW5jX18sIGF1dG9fb2Zmc2V0ID8gIkF1dG8iIDogIk1hbnVhbCIsCisJCQlvZmZzZXRfYSwgb2Zmc2V0X2IsIG9mZnNldF9jKTsKKworCW9mZnNldF9idWZbMF0gPSAoY3BfcmVhZChzZCwgMHg3NykgJiAweGMwKSB8ICgob2Zmc2V0X2EgJiAweDNmMCkgPj4gNCk7CisJb2Zmc2V0X2J1ZlsxXSA9ICgob2Zmc2V0X2EgJiAweDAwZikgPDwgNCkgfCAoKG9mZnNldF9iICYgMHgzYzApID4+IDYpOworCW9mZnNldF9idWZbMl0gPSAoKG9mZnNldF9iICYgMHgwM2YpIDw8IDIpIHwgKChvZmZzZXRfYyAmIDB4MzAwKSA+PiA4KTsKKwlvZmZzZXRfYnVmWzNdID0gb2Zmc2V0X2MgJiAweDBmZjsKKworCS8qIFJlZ2lzdGVycyBtdXN0IGJlIHdyaXR0ZW4gaW4gdGhpcyBvcmRlciB3aXRoIG5vIGkyYyBhY2Nlc3MgaW4gYmV0d2VlbiAqLworCWlmIChhZHZfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoc3RhdGUtPmkyY19jcCwgMHg3NywgNCwgb2Zmc2V0X2J1ZikpCisJCXY0bDJfZXJyKHNkLCAiJXM6IGkyYyBlcnJvciB3cml0aW5nIHRvIENQIHJlZyAweDc3LCAweDc4LCAweDc5LCAweDdhXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkdjc2MDRfc2V0X2dhaW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgYm9vbCBhdXRvX2dhaW4sIHUxNiBnYWluX2EsIHUxNiBnYWluX2IsIHUxNiBnYWluX2MpCit7CisJc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXU4IGdhaW5fYnVmWzRdOworCXU4IGdhaW5fbWFuID0gMTsKKwl1OCBhZ2NfbW9kZV9tYW4gPSAxOworCisJaWYgKGF1dG9fZ2FpbikgeworCQlnYWluX21hbiA9IDA7CisJCWFnY19tb2RlX21hbiA9IDA7CisJCWdhaW5fYSA9IDB4MTAwOworCQlnYWluX2IgPSAweDEwMDsKKwkJZ2Fpbl9jID0gMHgxMDA7CisJfQorCisJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXM6ICVzIGdhaW46IGEgPSAweCV4LCBiID0gMHgleCwgYyA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgYXV0b19nYWluID8gIkF1dG8iIDogIk1hbnVhbCIsCisJCQlnYWluX2EsIGdhaW5fYiwgZ2Fpbl9jKTsKKworCWdhaW5fYnVmWzBdID0gKChnYWluX21hbiA8PCA3KSB8IChhZ2NfbW9kZV9tYW4gPDwgNikgfCAoKGdhaW5fYSAmIDB4M2YwKSA+PiA0KSk7CisJZ2Fpbl9idWZbMV0gPSAoKChnYWluX2EgJiAweDAwZikgPDwgNCkgfCAoKGdhaW5fYiAmIDB4M2MwKSA+PiA2KSk7CisJZ2Fpbl9idWZbMl0gPSAoKChnYWluX2IgJiAweDAzZikgPDwgMikgfCAoKGdhaW5fYyAmIDB4MzAwKSA+PiA4KSk7CisJZ2Fpbl9idWZbM10gPSAoKGdhaW5fYyAmIDB4MGZmKSk7CisKKwkvKiBSZWdpc3RlcnMgbXVzdCBiZSB3cml0dGVuIGluIHRoaXMgb3JkZXIgd2l0aCBubyBpMmMgYWNjZXNzIGluIGJldHdlZW4gKi8KKwlpZiAoYWR2X3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKHN0YXRlLT5pMmNfY3AsIDB4NzMsIDQsIGdhaW5fYnVmKSkKKwkJdjRsMl9lcnIoc2QsICIlczogaTJjIGVycm9yIHdyaXRpbmcgdG8gQ1AgcmVnIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzZcbiIsIF9fZnVuY19fKTsKK30KKwogc3RhdGljIHZvaWQgc2V0X3JnYl9xdWFudGl6YXRpb25fcmFuZ2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJYm9vbCByZ2Jfb3V0cHV0ID0gaW9fcmVhZChzZCwgMHgwMikgJiAweDAyOworCWJvb2wgaGRtaV9zaWduYWwgPSBoZG1pX3JlYWQoc2QsIDB4MDUpICYgMHg4MDsKKworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBSR0IgcXVhbnRpemF0aW9uIHJhbmdlOiAlZCwgUkdCIG91dDogJWQsIEhETUk6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXRlLT5yZ2JfcXVhbnRpemF0aW9uX3JhbmdlLAorCQkJcmdiX291dHB1dCwgaGRtaV9zaWduYWwpOworCisJYWR2NzYwNF9zZXRfZ2FpbihzZCwgdHJ1ZSwgMHgwLCAweDAsIDB4MCk7CisJYWR2NzYwNF9zZXRfb2Zmc2V0KHNkLCB0cnVlLCAweDAsIDB4MCwgMHgwKTsKIAogCXN3aXRjaCAoc3RhdGUtPnJnYl9xdWFudGl6YXRpb25fcmFuZ2UpIHsKIAljYXNlIFY0TDJfRFZfUkdCX1JBTkdFX0FVVE86Ci0JCS8qIGF1dG9tYXRpYyAqLwotCQlpZiAoRElHSVRBTF9JTlBVVCAmJiAhKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDgwKSkgewotCQkJLyogcmVjZWl2aW5nIERWSS1EIHNpZ25hbCAqLworCQlpZiAoc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfVkdBX1JHQikgeworCQkJLyogUmVjZWl2aW5nIGFuYWxvZyBSR0Igc2lnbmFsCisJCQkgKiBTZXQgUkdCIGZ1bGwgcmFuZ2UgKDAtMjU1KSAqLworCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDEwKTsKKwkJCWJyZWFrOworCQl9CiAKLQkJCS8qIEFEVjc2MDQgc2VsZWN0cyBSR0IgbGltaXRlZCByYW5nZSByZWdhcmRsZXNzIG9mCi0JCQkgICBpbnB1dCBmb3JtYXQgKENFL0lUKSBpbiBhdXRvbWF0aWMgbW9kZSAqLwotCQkJaWYgKHN0YXRlLT50aW1pbmdzLmJ0LnN0YW5kYXJkcyAmIFY0TDJfRFZfQlRfU1REX0NFQTg2MSkgewotCQkJCS8qIFJHQiBsaW1pdGVkIHJhbmdlICgxNi0yMzUpICovCi0JCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDAwKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKiBSR0IgZnVsbCByYW5nZSAoMC0yNTUpICovCi0JCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDEwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHJlY2VpdmluZyBIRE1JIG9yIGFuYWxvZyBzaWduYWwsIHNldCBhdXRvbW9kZSAqLworCQlpZiAoc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfVkdBX0NPTVApIHsKKwkJCS8qIFJlY2VpdmluZyBhbmFsb2cgWVBiUHIgc2lnbmFsCisJCQkgKiBTZXQgYXV0b21vZGUgKi8KIAkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHhmMCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChoZG1pX3NpZ25hbCkgeworCQkJLyogUmVjZWl2aW5nIEhETUkgc2lnbmFsCisJCQkgKiBTZXQgYXV0b21vZGUgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHhmMCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlY2VpdmluZyBEVkktRCBzaWduYWwKKwkJICogQURWNzYwNCBzZWxlY3RzIFJHQiBsaW1pdGVkIHJhbmdlIHJlZ2FyZGxlc3Mgb2YKKwkJICogaW5wdXQgZm9ybWF0IChDRS9JVCkgaW4gYXV0b21hdGljIG1vZGUgKi8KKwkJaWYgKHN0YXRlLT50aW1pbmdzLmJ0LnN0YW5kYXJkcyAmIFY0TDJfRFZfQlRfU1REX0NFQTg2MSkgeworCQkJLyogUkdCIGxpbWl0ZWQgcmFuZ2UgKDE2LTIzNSkgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBSR0IgZnVsbCByYW5nZSAoMC0yNTUpICovCisJCQlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MDIsIDB4MGYsIDB4MTApOworCisJCQlpZiAoaXNfZGlnaXRhbF9pbnB1dChzZCkgJiYgcmdiX291dHB1dCkgeworCQkJCWFkdjc2MDRfc2V0X29mZnNldChzZCwgZmFsc2UsIDB4NDAsIDB4NDAsIDB4NDApOworCQkJfSBlbHNlIHsKKwkJCQlhZHY3NjA0X3NldF9nYWluKHNkLCBmYWxzZSwgMHhlMCwgMHhlMCwgMHhlMCk7CisJCQkJYWR2NzYwNF9zZXRfb2Zmc2V0KHNkLCBmYWxzZSwgMHg3MCwgMHg3MCwgMHg3MCk7CisJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0RWX1JHQl9SQU5HRV9MSU1JVEVEOgorCQlpZiAoc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfVkdBX0NPTVApIHsKKwkJCS8qIFlDckNiIGxpbWl0ZWQgcmFuZ2UgKDE2LTIzNSkgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgyMCk7CisJCQlicmVhazsKKwkJfQorCiAJCS8qIFJHQiBsaW1pdGVkIHJhbmdlICgxNi0yMzUpICovCiAJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgwMCk7CisKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0RWX1JHQl9SQU5HRV9GVUxMOgorCQlpZiAoc3RhdGUtPnNlbGVjdGVkX2lucHV0ID09IEFEVjc2MDRfSU5QVVRfVkdBX0NPTVApIHsKKwkJCS8qIFlDckNiIGZ1bGwgcmFuZ2UgKDAtMjU1KSAqLworCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDYwKTsKKwkJCWJyZWFrOworCQl9CisKIAkJLyogUkdCIGZ1bGwgcmFuZ2UgKDAtMjU1KSAqLwogCQlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MDIsIDB4MGYsIDB4MTApOworCisJCWlmIChpc19hbmFsb2dfaW5wdXQoc2QpIHx8IGhkbWlfc2lnbmFsKQorCQkJYnJlYWs7CisKKwkJLyogQWRqdXN0IGdhaW4vb2Zmc2V0IGZvciBEVkktRCBzaWduYWxzIG9ubHkgKi8KKwkJaWYgKHJnYl9vdXRwdXQpIHsKKwkJCWFkdjc2MDRfc2V0X29mZnNldChzZCwgZmFsc2UsIDB4NDAsIDB4NDAsIDB4NDApOworCQl9IGVsc2UgeworCQkJYWR2NzYwNF9zZXRfZ2FpbihzZCwgZmFsc2UsIDB4ZTAsIDB4ZTAsIDB4ZTApOworCQkJYWR2NzYwNF9zZXRfb2Zmc2V0KHNkLCBmYWxzZSwgMHg3MCwgMHg3MCwgMHg3MCk7CisJCX0KIAkJYnJlYWs7CiAJfQogfQogCi0KIHN0YXRpYyBpbnQgYWR2NzYwNF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gdG9fc2QoY3RybCk7CkBAIC05ODMsOCArMTA4MSw5IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBub19zaWduYWxfdG1kcyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewotCS8qIFRPRE8gcG9ydCBCLCBDIGFuZCBEICovCi0JcmV0dXJuICEoaW9fcmVhZChzZCwgMHg2YSkgJiAweDEwKTsKKwlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlyZXR1cm4gIShpb19yZWFkKHNkLCAweDZhKSAmICgweDEwID4+IHN0YXRlLT5zZWxlY3RlZF9pbnB1dCkpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgbm9fbG9ja190bWRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCkBAIC0xMDExLDcgKzExMTAsNiBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgbm9fc2lnbmFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWJvb2wgcmV0OwogCiAJcmV0ID0gbm9fcG93ZXIoc2QpOwpAQCAtMTAxOSw3ICsxMTE3LDcgQEAKIAlyZXQgfD0gbm9fbG9ja19zdGRpKHNkKTsKIAlyZXQgfD0gbm9fbG9ja19zc3BkKHNkKTsKIAotCWlmIChESUdJVEFMX0lOUFVUKSB7CisJaWYgKGlzX2RpZ2l0YWxfaW5wdXQoc2QpKSB7CiAJCXJldCB8PSBub19sb2NrX3RtZHMoc2QpOwogCQlyZXQgfD0gbm9fc2lnbmFsX3RtZHMoc2QpOwogCX0KQEAgLTEwMzYsMTMgKzExMzQsMTEgQEAKIAogc3RhdGljIGludCBhZHY3NjA0X2dfaW5wdXRfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqc3RhdHVzKQogewotCXN0cnVjdCBhZHY3NjA0X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKLQogCSpzdGF0dXMgPSAwOwogCSpzdGF0dXMgfD0gbm9fcG93ZXIoc2QpID8gVjRMMl9JTl9TVF9OT19QT1dFUiA6IDA7CiAJKnN0YXR1cyB8PSBub19zaWduYWwoc2QpID8gVjRMMl9JTl9TVF9OT19TSUdOQUwgOiAwOwogCWlmIChub19sb2NrX2NwKHNkKSkKLQkJKnN0YXR1cyB8PSBESUdJVEFMX0lOUFVUID8gVjRMMl9JTl9TVF9OT19TWU5DIDogVjRMMl9JTl9TVF9OT19IX0xPQ0s7CisJCSpzdGF0dXMgfD0gaXNfZGlnaXRhbF9pbnB1dChzZCkgPyBWNEwyX0lOX1NUX05PX1NZTkMgOiBWNEwyX0lOX1NUX05PX0hfTE9DSzsKIAogCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBzdGF0dXMgPSAweCV4XG4iLCBfX2Z1bmNfXywgKnN0YXR1cyk7CiAKQEAgLTExNTcsMTMgKzEyNTMsMTEgQEAKIHN0YXRpYyBpbnQgYWR2NzYwNF9kdl90aW1pbmdzX2NhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJc3RydWN0IHY0bDJfZHZfdGltaW5nc19jYXAgKmNhcCkKIHsKLQlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7Ci0KIAljYXAtPnR5cGUgPSBWNEwyX0RWX0JUXzY1Nl8xMTIwOwogCWNhcC0+YnQubWF4X3dpZHRoID0gMTkyMDsKIAljYXAtPmJ0Lm1heF9oZWlnaHQgPSAxMjAwOwogCWNhcC0+YnQubWluX3BpeGVsY2xvY2sgPSAyNTAwMDAwMDsKLQlpZiAoRElHSVRBTF9JTlBVVCkKKwlpZiAoaXNfZGlnaXRhbF9pbnB1dChzZCkpCiAJCWNhcC0+YnQubWF4X3BpeGVsY2xvY2sgPSAyMjUwMDAwMDA7CiAJZWxzZQogCQljYXAtPmJ0Lm1heF9waXhlbGNsb2NrID0gMTcwMDAwMDAwOwpAQCAtMTE3OSwxMiArMTI3MywxMSBAQAogc3RhdGljIHZvaWQgYWR2NzYwNF9maWxsX29wdGlvbmFsX2R2X3RpbWluZ3NfZmllbGRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCXN0cnVjdCB2NGwyX2R2X3RpbWluZ3MgKnRpbWluZ3MpCiB7Ci0Jc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgYWR2NzYwNF90aW1pbmdzW2ldLmJ0LndpZHRoOyBpKyspIHsKIAkJaWYgKHY0bDJfbWF0Y2hfZHZfdGltaW5ncyh0aW1pbmdzLCAmYWR2NzYwNF90aW1pbmdzW2ldLAotCQkJCQlESUdJVEFMX0lOUFVUID8gMjUwMDAwIDogMTAwMDAwMCkpIHsKKwkJCQkJaXNfZGlnaXRhbF9pbnB1dChzZCkgPyAyNTAwMDAgOiAxMDAwMDAwKSkgewogCQkJKnRpbWluZ3MgPSBhZHY3NjA0X3RpbWluZ3NbaV07CiAJCQlicmVhazsKIAkJfQpAQCAtMTIwNCw2ICsxMjk3LDcgQEAKIAltZW1zZXQodGltaW5ncywgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpKTsKIAogCWlmIChub19zaWduYWwoc2QpKSB7CisJCXN0YXRlLT5yZXN0YXJ0X3N0ZGlfb25jZSA9IHRydWU7CiAJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBubyB2YWxpZCBzaWduYWxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9MSU5LOwogCX0KQEAgLTEyMTYsNyArMTMxMCw3IEBACiAJYnQtPmludGVybGFjZWQgPSBzdGRpLmludGVybGFjZWQgPwogCQlWNEwyX0RWX0lOVEVSTEFDRUQgOiBWNEwyX0RWX1BST0dSRVNTSVZFOwogCi0JaWYgKERJR0lUQUxfSU5QVVQpIHsKKwlpZiAoaXNfZGlnaXRhbF9pbnB1dChzZCkpIHsKIAkJdWludDMyX3QgZnJlcTsKIAogCQl0aW1pbmdzLT50eXBlID0gVjRMMl9EVl9CVF82NTZfMTEyMDsKQEAgLTEzMDUsOCArMTM5OSw4IEBACiAJCXJldHVybiAtRU5PTElOSzsKIAl9CiAKLQlpZiAoKCFESUdJVEFMX0lOUFVUICYmIGJ0LT5waXhlbGNsb2NrID4gMTcwMDAwMDAwKSB8fAotCQkJKERJR0lUQUxfSU5QVVQgJiYgYnQtPnBpeGVsY2xvY2sgPiAyMjUwMDAwMDApKSB7CisJaWYgKChpc19hbmFsb2dfaW5wdXQoc2QpICYmIGJ0LT5waXhlbGNsb2NrID4gMTcwMDAwMDAwKSB8fAorCQkJKGlzX2RpZ2l0YWxfaW5wdXQoc2QpICYmIGJ0LT5waXhlbGNsb2NrID4gMjI1MDAwMDAwKSkgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogcGl4ZWxjbG9jayBvdXQgb2YgcmFuZ2UgJWRcbiIsCiAJCQkJX19mdW5jX18sICh1MzIpYnQtPnBpeGVsY2xvY2spOwogCQlyZXR1cm4gLUVSQU5HRTsKQEAgLTEzMjksMTAgKzE0MjMsMTUgQEAKIAlpZiAoIXRpbWluZ3MpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHY0bDJfbWF0Y2hfZHZfdGltaW5ncygmc3RhdGUtPnRpbWluZ3MsIHRpbWluZ3MsIDApKSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBubyBjaGFuZ2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJYnQgPSAmdGltaW5ncy0+YnQ7CiAKLQlpZiAoKCFESUdJVEFMX0lOUFVUICYmIGJ0LT5waXhlbGNsb2NrID4gMTcwMDAwMDAwKSB8fAotCQkJKERJR0lUQUxfSU5QVVQgJiYgYnQtPnBpeGVsY2xvY2sgPiAyMjUwMDAwMDApKSB7CisJaWYgKChpc19hbmFsb2dfaW5wdXQoc2QpICYmIGJ0LT5waXhlbGNsb2NrID4gMTcwMDAwMDAwKSB8fAorCQkJKGlzX2RpZ2l0YWxfaW5wdXQoc2QpICYmIGJ0LT5waXhlbGNsb2NrID4gMjI1MDAwMDAwKSkgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogcGl4ZWxjbG9jayBvdXQgb2YgcmFuZ2UgJWRcbiIsCiAJCQkJX19mdW5jX18sICh1MzIpYnQtPnBpeGVsY2xvY2spOwogCQlyZXR1cm4gLUVSQU5HRTsKQEAgLTEzNTQsNyArMTQ1Myw2IEBACiAKIAlzZXRfcmdiX3F1YW50aXphdGlvbl9yYW5nZShzZCk7CiAKLQogCWlmIChkZWJ1ZyA+IDEpCiAJCXY0bDJfcHJpbnRfZHZfdGltaW5ncyhzZC0+bmFtZSwgImFkdjc2MDRfc19kdl90aW1pbmdzOiAiLAogCQkJCSAgICAgIHRpbWluZ3MsIHRydWUpOwpAQCAtMTM3NCwzMCArMTQ3MiwyNCBAQAogewogCXN0cnVjdCBhZHY3NjA0X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAotCXN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLQljYXNlIEFEVjc2MDRfTU9ERV9DT01QOgotCWNhc2UgQURWNzYwNF9NT0RFX0dSOgotCQkvKiBlbmFibGUgKi8KKwlpZiAoaXNfYW5hbG9nX2lucHV0KHNkKSkgewogCQlpb193cml0ZShzZCwgMHgxNSwgMHhiMCk7ICAgLyogRGlzYWJsZSBUcmlzdGF0ZSBvZiBQaW5zIChubyBhdWRpbykgKi8KLQkJYnJlYWs7Ci0JY2FzZSBBRFY3NjA0X01PREVfSERNSToKLQkJLyogZW5hYmxlICovCi0JCWhkbWlfd3JpdGUoc2QsIDB4MWEsIDB4MGEpOyAvKiBVbm11dGUgYXVkaW8gKi8KKwl9IGVsc2UgaWYgKGlzX2RpZ2l0YWxfaW5wdXQoc2QpKSB7CisJCWhkbWlfd3JpdGVfYW5kX29yKHNkLCAweDAwLCAweGZjLCBzdGF0ZS0+c2VsZWN0ZWRfaW5wdXQpOwogCQloZG1pX3dyaXRlKHNkLCAweDAxLCAweDAwKTsgLyogRW5hYmxlIEhETUkgY2xvY2sgdGVybWluYXRvcnMgKi8KIAkJaW9fd3JpdGUoc2QsIDB4MTUsIDB4YTApOyAgIC8qIERpc2FibGUgVHJpc3RhdGUgb2YgUGlucyAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogVW5rbm93biBtb2RlICVkXG4iLAotCQkJCV9fZnVuY19fLCBzdGF0ZS0+bW9kZSk7Ci0JCWJyZWFrOworCQloZG1pX3dyaXRlX2FuZF9vcihzZCwgMHgxYSwgMHhlZiwgMHgwMCk7IC8qIFVubXV0ZSBhdWRpbyAqLworCX0gZWxzZSB7CisJCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBVbmtub3duIHBvcnQgJWQgc2VsZWN0ZWRcbiIsCisJCQkJX19mdW5jX18sIHN0YXRlLT5zZWxlY3RlZF9pbnB1dCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2lucHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0JLyogZGlzYWJsZSAqLworCWhkbWlfd3JpdGVfYW5kX29yKHNkLCAweDFhLCAweGVmLCAweDEwKTsgLyogTXV0ZSBhdWRpbyAqLworCW1zbGVlcCgxNik7IC8qIDUxMiBzYW1wbGVzIHdpdGggPj0gMzIga0h6IHNhbXBsZSByYXRlIFtSRUZfMDMsIGMuIDcuMTYuMTBdICovCiAJaW9fd3JpdGUoc2QsIDB4MTUsIDB4YmUpOyAgIC8qIFRyaXN0YXRlIGFsbCBvdXRwdXRzIGZyb20gdmlkZW8gY29yZSAqLwotCWhkbWlfd3JpdGUoc2QsIDB4MWEsIDB4MWEpOyAvKiBNdXRlIGF1ZGlvICovCiAJaGRtaV93cml0ZShzZCwgMHgwMSwgMHg3OCk7IC8qIERpc2FibGUgSERNSSBjbG9jayB0ZXJtaW5hdG9ycyAqLwogfQogCkBAIC0xNDA1LDkgKzE0OTcsNyBAQAogewogCXN0cnVjdCBhZHY3NjA0X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAotCXN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLQljYXNlIEFEVjc2MDRfTU9ERV9DT01QOgotCWNhc2UgQURWNzYwNF9NT0RFX0dSOgorCWlmIChpc19hbmFsb2dfaW5wdXQoc2QpKSB7CiAJCS8qIHJlc2V0IEFESSByZWNvbW1lbmRlZCBzZXR0aW5ncyBmb3IgSERNSTogKi8KIAkJLyogIkFEVjc2MDQgUmVnaXN0ZXIgU2V0dGluZ3MgUmVjb21tZW5kYXRpb25zIChyZXYuIDIuNSwgSnVuZSAyMDEwKSIgcC4gNC4gKi8KIAkJaGRtaV93cml0ZShzZCwgMHgwZCwgMHgwNCk7IC8qIEhETUkgZmlsdGVyIG9wdGltaXphdGlvbiAqLwpAQCAtMTQzMyw5ICsxNTIzLDkgQEAKIAkJY3Bfd3JpdGUoc2QsIDB4M2UsIDB4MDQpOyAvKiBDUCBjb3JlIHByZS1nYWluIGNvbnRyb2wgKi8KIAkJY3Bfd3JpdGUoc2QsIDB4YzMsIDB4MzkpOyAvKiBDUCBjb2FzdCBjb250cm9sLiBHcmFwaGljcyBtb2RlICovCiAJCWNwX3dyaXRlKHNkLCAweDQwLCAweDVjKTsgLyogQ1AgY29yZSBwcmUtZ2FpbiBjb250cm9sLiBHcmFwaGljcyBtb2RlICovCi0JCWJyZWFrOworCX0gZWxzZSBpZiAoaXNfZGlnaXRhbF9pbnB1dChzZCkpIHsKKwkJaGRtaV93cml0ZShzZCwgMHgwMCwgc3RhdGUtPnNlbGVjdGVkX2lucHV0ICYgMHgwMyk7CiAKLQljYXNlIEFEVjc2MDRfTU9ERV9IRE1JOgogCQkvKiBzZXQgQURJIHJlY29tbWVuZGVkIHNldHRpbmdzIGZvciBIRE1JOiAqLwogCQkvKiAiQURWNzYwNCBSZWdpc3RlciBTZXR0aW5ncyBSZWNvbW1lbmRhdGlvbnMgKHJldi4gMi41LCBKdW5lIDIwMTApIiBwLiA0LiAqLwogCQloZG1pX3dyaXRlKHNkLCAweDBkLCAweDg0KTsgLyogSERNSSBmaWx0ZXIgb3B0aW1pemF0aW9uICovCkBAIC0xNDYxLDEyICsxNTUxLDkgQEAKIAkJY3Bfd3JpdGUoc2QsIDB4M2UsIDB4MDApOyAvKiBDUCBjb3JlIHByZS1nYWluIGNvbnRyb2wgKi8KIAkJY3Bfd3JpdGUoc2QsIDB4YzMsIDB4MzkpOyAvKiBDUCBjb2FzdCBjb250cm9sLiBHcmFwaGljcyBtb2RlICovCiAJCWNwX3dyaXRlKHNkLCAweDQwLCAweDgwKTsgLyogQ1AgY29yZSBwcmUtZ2FpbiBjb250cm9sLiBHcmFwaGljcyBtb2RlICovCi0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXM6IFVua25vd24gbW9kZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhdGUtPm1vZGUpOwotCQlicmVhazsKKwl9IGVsc2UgeworCQl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogVW5rbm93biBwb3J0ICVkIHNlbGVjdGVkXG4iLAorCQkJCV9fZnVuY19fLCBzdGF0ZS0+c2VsZWN0ZWRfaW5wdXQpOwogCX0KIH0KIApAQCAtMTQ3NSw5ICsxNTYyLDEzIEBACiB7CiAJc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCi0JdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXM6IGlucHV0ICVkIiwgX19mdW5jX18sIGlucHV0KTsKKwl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogaW5wdXQgJWQsIHNlbGVjdGVkIGlucHV0ICVkIiwKKwkJCV9fZnVuY19fLCBpbnB1dCwgc3RhdGUtPnNlbGVjdGVkX2lucHV0KTsKIAotCXN0YXRlLT5tb2RlID0gaW5wdXQ7CisJaWYgKGlucHV0ID09IHN0YXRlLT5zZWxlY3RlZF9pbnB1dCkKKwkJcmV0dXJuIDA7CisKKwlzdGF0ZS0+c2VsZWN0ZWRfaW5wdXQgPSBpbnB1dDsKIAogCWRpc2FibGVfaW5wdXQoc2QpOwogCkBAIC0xNTE2LDM2ICsxNjA3LDQ3IEBACiAKIHN0YXRpYyBpbnQgYWR2NzYwNF9pc3Ioc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHN0YXR1cywgYm9vbCAqaGFuZGxlZCkKIHsKLQlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7Ci0JdTggZm10X2NoYW5nZSwgZm10X2NoYW5nZV9kaWdpdGFsLCB0eF81djsKLQl1MzIgaW5wdXRfc3RhdHVzOworCWNvbnN0IHU4IGlycV9yZWdfMHg0MyA9IGlvX3JlYWQoc2QsIDB4NDMpOworCWNvbnN0IHU4IGlycV9yZWdfMHg2YiA9IGlvX3JlYWQoc2QsIDB4NmIpOworCWNvbnN0IHU4IGlycV9yZWdfMHg3MCA9IGlvX3JlYWQoc2QsIDB4NzApOworCXU4IGZtdF9jaGFuZ2VfZGlnaXRhbDsKKwl1OCBmbXRfY2hhbmdlOworCXU4IHR4XzV2OworCisJaWYgKGlycV9yZWdfMHg0MykKKwkJaW9fd3JpdGUoc2QsIDB4NDQsIGlycV9yZWdfMHg0Myk7CisJaWYgKGlycV9yZWdfMHg3MCkKKwkJaW9fd3JpdGUoc2QsIDB4NzEsIGlycV9yZWdfMHg3MCk7CisJaWYgKGlycV9yZWdfMHg2YikKKwkJaW9fd3JpdGUoc2QsIDB4NmMsIGlycV9yZWdfMHg2Yik7CisKKwl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICIlczogIiwgX19mdW5jX18pOwogCiAJLyogZm9ybWF0IGNoYW5nZSAqLwotCWZtdF9jaGFuZ2UgPSBpb19yZWFkKHNkLCAweDQzKSAmIDB4OTg7Ci0JaWYgKGZtdF9jaGFuZ2UpCi0JCWlvX3dyaXRlKHNkLCAweDQ0LCBmbXRfY2hhbmdlKTsKLQlmbXRfY2hhbmdlX2RpZ2l0YWwgPSBESUdJVEFMX0lOUFVUID8gKGlvX3JlYWQoc2QsIDB4NmIpICYgMHhjMCkgOiAwOwotCWlmIChmbXRfY2hhbmdlX2RpZ2l0YWwpCi0JCWlvX3dyaXRlKHNkLCAweDZjLCBmbXRfY2hhbmdlX2RpZ2l0YWwpOworCWZtdF9jaGFuZ2UgPSBpcnFfcmVnXzB4NDMgJiAweDk4OworCWZtdF9jaGFuZ2VfZGlnaXRhbCA9IGlzX2RpZ2l0YWxfaW5wdXQoc2QpID8gKGlycV9yZWdfMHg2YiAmIDB4YzApIDogMDsKKwogCWlmIChmbXRfY2hhbmdlIHx8IGZtdF9jaGFuZ2VfZGlnaXRhbCkgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCiAJCQkiJXM6IGZtdF9jaGFuZ2UgPSAweCV4LCBmbXRfY2hhbmdlX2RpZ2l0YWwgPSAweCV4XG4iLAogCQkJX19mdW5jX18sIGZtdF9jaGFuZ2UsIGZtdF9jaGFuZ2VfZGlnaXRhbCk7CiAKLQkJYWR2NzYwNF9nX2lucHV0X3N0YXR1cyhzZCwgJmlucHV0X3N0YXR1cyk7Ci0JCWlmIChpbnB1dF9zdGF0dXMgIT0gc3RhdGUtPnByZXZfaW5wdXRfc3RhdHVzKSB7Ci0JCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCi0JCQkJIiVzOiBpbnB1dF9zdGF0dXMgPSAweCV4LCBwcmV2X2lucHV0X3N0YXR1cyA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGlucHV0X3N0YXR1cywgc3RhdGUtPnByZXZfaW5wdXRfc3RhdHVzKTsKLQkJCXN0YXRlLT5wcmV2X2lucHV0X3N0YXR1cyA9IGlucHV0X3N0YXR1czsKLQkJCXY0bDJfc3ViZGV2X25vdGlmeShzZCwgQURWNzYwNF9GTVRfQ0hBTkdFLCBOVUxMKTsKLQkJfQorCQl2NGwyX3N1YmRldl9ub3RpZnkoc2QsIEFEVjc2MDRfRk1UX0NIQU5HRSwgTlVMTCk7CiAKIAkJaWYgKGhhbmRsZWQpCiAJCQkqaGFuZGxlZCA9IHRydWU7CiAJfQorCS8qIEhETUkvRFZJIG1vZGUgKi8KKwlpZiAoaXJxX3JlZ18weDZiICYgMHgwMSkgeworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogaXJxICVzIG1vZGVcbiIsIF9fZnVuY19fLAorCQkJKGlvX3JlYWQoc2QsIDB4NmEpICYgMHgwMSkgPyAiSERNSSIgOiAiRFZJIik7CisJCXNldF9yZ2JfcXVhbnRpemF0aW9uX3JhbmdlKHNkKTsKKwkJaWYgKGhhbmRsZWQpCisJCQkqaGFuZGxlZCA9IHRydWU7CisJfQorCiAJLyogdHggNXYgZGV0ZWN0ICovCi0JdHhfNXYgPSBpb19yZWFkKHNkLCAweDcwKSAmIDB4MTA7CisJdHhfNXYgPSBpb19yZWFkKHNkLCAweDcwKSAmIDB4MWU7CiAJaWYgKHR4XzV2KSB7CiAJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiB0eF81djogMHgleFxuIiwgX19mdW5jX18sIHR4XzV2KTsKIAkJaW9fd3JpdGUoc2QsIDB4NzEsIHR4XzV2KTsKQEAgLTE1NTksNTUgKzE2NjEsMTc4IEBACiBzdGF0aWMgaW50IGFkdjc2MDRfZ2V0X2VkaWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2VkaWQgKmVkaWQpCiB7CiAJc3RydWN0IGFkdjc2MDRfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXU4ICpkYXRhID0gTlVMTDsKIAotCWlmIChlZGlkLT5wYWQgIT0gMCkKKwlpZiAoZWRpZC0+cGFkID4gQURWNzYwNF9FRElEX1BPUlRfRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGVkaWQtPmJsb2NrcyA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZWRpZC0+c3RhcnRfYmxvY2sgPj0gc3RhdGUtPmVkaWRfYmxvY2tzKQorCWlmIChlZGlkLT5ibG9ja3MgPiAyKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZWRpZC0+c3RhcnRfYmxvY2sgKyBlZGlkLT5ibG9ja3MgPiBzdGF0ZS0+ZWRpZF9ibG9ja3MpCi0JCWVkaWQtPmJsb2NrcyA9IHN0YXRlLT5lZGlkX2Jsb2NrcyAtIGVkaWQtPnN0YXJ0X2Jsb2NrOworCWlmIChlZGlkLT5zdGFydF9ibG9jayA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlZGlkLT5zdGFydF9ibG9jayA9PSAxKQorCQllZGlkLT5ibG9ja3MgPSAxOwogCWlmICghZWRpZC0+ZWRpZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtY3B5KGVkaWQtPmVkaWQgKyBlZGlkLT5zdGFydF9ibG9jayAqIDEyOCwKLQkgICAgICAgc3RhdGUtPmVkaWQgKyBlZGlkLT5zdGFydF9ibG9jayAqIDEyOCwKKworCWlmIChlZGlkLT5ibG9ja3MgPiBzdGF0ZS0+ZWRpZC5ibG9ja3MpCisJCWVkaWQtPmJsb2NrcyA9IHN0YXRlLT5lZGlkLmJsb2NrczsKKworCXN3aXRjaCAoZWRpZC0+cGFkKSB7CisJY2FzZSBBRFY3NjA0X0VESURfUE9SVF9BOgorCWNhc2UgQURWNzYwNF9FRElEX1BPUlRfQjoKKwljYXNlIEFEVjc2MDRfRURJRF9QT1JUX0M6CisJY2FzZSBBRFY3NjA0X0VESURfUE9SVF9EOgorCQlpZiAoc3RhdGUtPmVkaWQucHJlc2VudCAmICgxIDw8IGVkaWQtPnBhZCkpCisJCQlkYXRhID0gc3RhdGUtPmVkaWQuZWRpZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PREFUQTsKKworCW1lbWNweShlZGlkLT5lZGlkLAorCSAgICAgICBkYXRhICsgZWRpZC0+c3RhcnRfYmxvY2sgKiAxMjgsCiAJICAgICAgIGVkaWQtPmJsb2NrcyAqIDEyOCk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X2VkaWRfc3BhX2xvY2F0aW9uKGNvbnN0IHU4ICplZGlkKQoreworCXU4IGQ7CisKKwlpZiAoKGVkaWRbMHg3ZV0gIT0gMSkgfHwKKwkgICAgKGVkaWRbMHg4MF0gIT0gMHgwMikgfHwKKwkgICAgKGVkaWRbMHg4MV0gIT0gMHgwMykpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHNlYXJjaCBWZW5kb3IgU3BlY2lmaWMgRGF0YSBCbG9jayAodGFnIDMpICovCisJZCA9IGVkaWRbMHg4Ml0gJiAweDdmOworCWlmIChkID4gNCkgeworCQlpbnQgaSA9IDB4ODQ7CisJCWludCBlbmQgPSAweDgwICsgZDsKKworCQlkbyB7CisJCQl1OCB0YWcgPSBlZGlkW2ldID4+IDU7CisJCQl1OCBsZW4gPSBlZGlkW2ldICYgMHgxZjsKKworCQkJaWYgKCh0YWcgPT0gMykgJiYgKGxlbiA+PSA1KSkKKwkJCQlyZXR1cm4gaSArIDQ7CisJCQlpICs9IGxlbiArIDE7CisJCX0gd2hpbGUgKGkgPCBlbmQpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbnQgYWR2NzYwNF9zZXRfZWRpZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZWRpZCAqZWRpZCkKIHsKIAlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJaW50IHNwYV9sb2M7CisJaW50IHRtcCA9IDA7CiAJaW50IGVycjsKKwlpbnQgaTsKIAotCWlmIChlZGlkLT5wYWQgIT0gMCkKKwlpZiAoZWRpZC0+cGFkID4gQURWNzYwNF9FRElEX1BPUlRfRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGVkaWQtPnN0YXJ0X2Jsb2NrICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChlZGlkLT5ibG9ja3MgPT0gMCkgewotCQkvKiBQdWxsIGRvd24gdGhlIGhvdHBsdWcgcGluICovCi0JCXY0bDJfc3ViZGV2X25vdGlmeShzZCwgQURWNzYwNF9IT1RQTFVHLCAodm9pZCAqKTApOwotCQkvKiBEaXNhYmxlcyBJMkMgYWNjZXNzIHRvIGludGVybmFsIEVESUQgcmFtIGZyb20gRERDIHBvcnQgKi8KLQkJcmVwX3dyaXRlX2FuZF9vcihzZCwgMHg3NywgMHhmMCwgMHgwKTsKLQkJc3RhdGUtPmVkaWRfYmxvY2tzID0gMDsKKwkJLyogRGlzYWJsZSBob3RwbHVnIGFuZCBJMkMgYWNjZXNzIHRvIEVESUQgUkFNIGZyb20gRERDIHBvcnQgKi8KKwkJc3RhdGUtPmVkaWQucHJlc2VudCAmPSB+KDEgPDwgZWRpZC0+cGFkKTsKKwkJdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBBRFY3NjA0X0hPVFBMVUcsICh2b2lkICopJnN0YXRlLT5lZGlkLnByZXNlbnQpOworCQlyZXBfd3JpdGVfYW5kX29yKHNkLCAweDc3LCAweGYwLCBzdGF0ZS0+ZWRpZC5wcmVzZW50KTsKKwogCQkvKiBGYWxsIGJhY2sgdG8gYSAxNjo5IGFzcGVjdCByYXRpbyAqLwogCQlzdGF0ZS0+YXNwZWN0X3JhdGlvLm51bWVyYXRvciA9IDE2OwogCQlzdGF0ZS0+YXNwZWN0X3JhdGlvLmRlbm9taW5hdG9yID0gOTsKKworCQlpZiAoIXN0YXRlLT5lZGlkLnByZXNlbnQpCisJCQlzdGF0ZS0+ZWRpZC5ibG9ja3MgPSAwOworCisJCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBjbGVhciBFRElEIHBhZCAlZCwgZWRpZC5wcmVzZW50ID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgZWRpZC0+cGFkLCBzdGF0ZS0+ZWRpZC5wcmVzZW50KTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChlZGlkLT5ibG9ja3MgPiAyKQorCWlmIChlZGlkLT5ibG9ja3MgPiAyKSB7CisJCWVkaWQtPmJsb2NrcyA9IDI7CiAJCXJldHVybiAtRTJCSUc7CisJfQogCWlmICghZWRpZC0+ZWRpZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtY3B5KHN0YXRlLT5lZGlkLCBlZGlkLT5lZGlkLCAxMjggKiBlZGlkLT5ibG9ja3MpOwotCXN0YXRlLT5lZGlkX2Jsb2NrcyA9IGVkaWQtPmJsb2NrczsKKworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiB3cml0ZSBFRElEIHBhZCAlZCwgZWRpZC5wcmVzZW50ID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBlZGlkLT5wYWQsIHN0YXRlLT5lZGlkLnByZXNlbnQpOworCisJLyogRGlzYWJsZSBob3RwbHVnIGFuZCBJMkMgYWNjZXNzIHRvIEVESUQgUkFNIGZyb20gRERDIHBvcnQgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnN0YXRlLT5kZWxheWVkX3dvcmtfZW5hYmxlX2hvdHBsdWcpOworCXY0bDJfc3ViZGV2X25vdGlmeShzZCwgQURWNzYwNF9IT1RQTFVHLCAodm9pZCAqKSZ0bXApOworCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4ZjAsIDB4MDApOworCisJc3BhX2xvYyA9IGdldF9lZGlkX3NwYV9sb2NhdGlvbihlZGlkLT5lZGlkKTsKKwlpZiAoc3BhX2xvYyA8IDApCisJCXNwYV9sb2MgPSAweGMwOyAvKiBEZWZhdWx0IHZhbHVlIFtSRUZfMDIsIHAuIDExNl0gKi8KKworCXN3aXRjaCAoZWRpZC0+cGFkKSB7CisJY2FzZSBBRFY3NjA0X0VESURfUE9SVF9BOgorCQlzdGF0ZS0+c3BhX3BvcnRfYVswXSA9IGVkaWQtPmVkaWRbc3BhX2xvY107CisJCXN0YXRlLT5zcGFfcG9ydF9hWzFdID0gZWRpZC0+ZWRpZFtzcGFfbG9jICsgMV07CisJCWJyZWFrOworCWNhc2UgQURWNzYwNF9FRElEX1BPUlRfQjoKKwkJcmVwX3dyaXRlKHNkLCAweDcwLCBlZGlkLT5lZGlkW3NwYV9sb2NdKTsKKwkJcmVwX3dyaXRlKHNkLCAweDcxLCBlZGlkLT5lZGlkW3NwYV9sb2MgKyAxXSk7CisJCWJyZWFrOworCWNhc2UgQURWNzYwNF9FRElEX1BPUlRfQzoKKwkJcmVwX3dyaXRlKHNkLCAweDcyLCBlZGlkLT5lZGlkW3NwYV9sb2NdKTsKKwkJcmVwX3dyaXRlKHNkLCAweDczLCBlZGlkLT5lZGlkW3NwYV9sb2MgKyAxXSk7CisJCWJyZWFrOworCWNhc2UgQURWNzYwNF9FRElEX1BPUlRfRDoKKwkJcmVwX3dyaXRlKHNkLCAweDc0LCBlZGlkLT5lZGlkW3NwYV9sb2NdKTsKKwkJcmVwX3dyaXRlKHNkLCAweDc1LCBlZGlkLT5lZGlkW3NwYV9sb2MgKyAxXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXBfd3JpdGUoc2QsIDB4NzYsIHNwYV9sb2MgJiAweGZmKTsKKwlyZXBfd3JpdGVfYW5kX29yKHNkLCAweDc3LCAweGJmLCAoc3BhX2xvYyA+PiAyKSAmIDB4NDApOworCisJZWRpZC0+ZWRpZFtzcGFfbG9jXSA9IHN0YXRlLT5zcGFfcG9ydF9hWzBdOworCWVkaWQtPmVkaWRbc3BhX2xvYyArIDFdID0gc3RhdGUtPnNwYV9wb3J0X2FbMV07CisKKwltZW1jcHkoc3RhdGUtPmVkaWQuZWRpZCwgZWRpZC0+ZWRpZCwgMTI4ICogZWRpZC0+YmxvY2tzKTsKKwlzdGF0ZS0+ZWRpZC5ibG9ja3MgPSBlZGlkLT5ibG9ja3M7CiAJc3RhdGUtPmFzcGVjdF9yYXRpbyA9IHY0bDJfY2FsY19hc3BlY3RfcmF0aW8oZWRpZC0+ZWRpZFsweDE1XSwKIAkJCWVkaWQtPmVkaWRbMHgxNl0pOwotCWVyciA9IGVkaWRfd3JpdGVfYmxvY2soc2QsIDEyOCAqIGVkaWQtPmJsb2Nrcywgc3RhdGUtPmVkaWQpOwotCWlmIChlcnIgPCAwKQotCQl2NGwyX2VycihzZCwgImVycm9yICVkIHdyaXRpbmcgZWRpZFxuIiwgZXJyKTsKLQlyZXR1cm4gZXJyOworCXN0YXRlLT5lZGlkLnByZXNlbnQgfD0gMSA8PCBlZGlkLT5wYWQ7CisKKwllcnIgPSBlZGlkX3dyaXRlX2Jsb2NrKHNkLCAxMjggKiBlZGlkLT5ibG9ja3MsIHN0YXRlLT5lZGlkLmVkaWQpOworCWlmIChlcnIgPCAwKSB7CisJCXY0bDJfZXJyKHNkLCAiZXJyb3IgJWQgd3JpdGluZyBlZGlkIHBhZCAlZFxuIiwgZXJyLCBlZGlkLT5wYWQpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGFkdjc2MDQgY2FsY3VsYXRlcyB0aGUgY2hlY2tzdW1zIGFuZCBlbmFibGVzIEkyQyBhY2Nlc3MgdG8gaW50ZXJuYWwKKwkgICBFRElEIFJBTSBmcm9tIEREQyBwb3J0LiAqLworCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4ZjAsIHN0YXRlLT5lZGlkLnByZXNlbnQpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAocmVwX3JlYWQoc2QsIDB4N2QpICYgc3RhdGUtPmVkaWQucHJlc2VudCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCWlmIChpID09IDEwMDApIHsKKwkJdjRsMl9lcnIoc2QsICJlcnJvciBlbmFibGluZyBlZGlkICgweCV4KVxuIiwgc3RhdGUtPmVkaWQucHJlc2VudCk7CisJCXJldHVybiAtRUlPOworCX0KKworCisJLyogZW5hYmxlIGhvdHBsdWcgYWZ0ZXIgMTAwIG1zICovCisJcXVldWVfZGVsYXllZF93b3JrKHN0YXRlLT53b3JrX3F1ZXVlcywKKwkJCSZzdGF0ZS0+ZGVsYXllZF93b3JrX2VuYWJsZV9ob3RwbHVnLCBIWiAvIDEwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqIGF2aSBpbmZvIGZyYW1lIENFQS04NjEtRSAqKioqKioqKioqKioqKi8KQEAgLTE2NzAsNyArMTg5NSw3IEBACiAJY2hhciAqaW5wdXRfY29sb3Jfc3BhY2VfdHh0WzE2XSA9IHsKIAkJIlJHQiBsaW1pdGVkIHJhbmdlICgxNi0yMzUpIiwgIlJHQiBmdWxsIHJhbmdlICgwLTI1NSkiLAogCQkiWUNiQ3IgQnQuNjAxICgxNi0yMzUpIiwgIllDYkNyIEJ0LjcwOSAoMTYtMjM1KSIsCi0JCSJYdllDQyBCdC42MDEiLCAiWHZZQ0MgQnQuNzA5IiwKKwkJInh2WUNDIEJ0LjYwMSIsICJ4dllDQyBCdC43MDkiLAogCQkiWUNiQ3IgQnQuNjAxICgwLTI1NSkiLCAiWUNiQ3IgQnQuNzA5ICgwLTI1NSkiLAogCQkiaW52YWxpZCIsICJpbnZhbGlkIiwgImludmFsaWQiLCAiaW52YWxpZCIsICJpbnZhbGlkIiwKIAkJImludmFsaWQiLCAiaW52YWxpZCIsICJhdXRvbWF0aWMiCkBAIC0xNjg5LDE2ICsxOTE0LDIwIEBACiAKIAl2NGwyX2luZm8oc2QsICItLS0tLUNoaXAgc3RhdHVzLS0tLS1cbiIpOwogCXY0bDJfaW5mbyhzZCwgIkNoaXAgcG93ZXI6ICVzXG4iLCBub19wb3dlcihzZCkgPyAib2ZmIiA6ICJvbiIpOwotCXY0bDJfaW5mbyhzZCwgIkNvbm5lY3RvciB0eXBlOiAlc1xuIiwgc3RhdGUtPmNvbm5lY3Rvcl9oZG1pID8KLQkJCSJIRE1JIiA6IChESUdJVEFMX0lOUFVUID8gIkRWSS1EIiA6ICJEVkktQSIpKTsKLQl2NGwyX2luZm8oc2QsICJFRElEOiAlc1xuIiwgKChyZXBfcmVhZChzZCwgMHg3ZCkgJiAweDAxKSAmJgotCQkJKHJlcF9yZWFkKHNkLCAweDc3KSAmIDB4MDEpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCAiKTsKKwl2NGwyX2luZm8oc2QsICJFRElEIGVuYWJsZWQgcG9ydCBBOiAlcywgQjogJXMsIEM6ICVzLCBEOiAlc1xuIiwKKwkJCSgocmVwX3JlYWQoc2QsIDB4N2QpICYgMHgwMSkgPyAiWWVzIiA6ICJObyIpLAorCQkJKChyZXBfcmVhZChzZCwgMHg3ZCkgJiAweDAyKSA/ICJZZXMiIDogIk5vIiksCisJCQkoKHJlcF9yZWFkKHNkLCAweDdkKSAmIDB4MDQpID8gIlllcyIgOiAiTm8iKSwKKwkJCSgocmVwX3JlYWQoc2QsIDB4N2QpICYgMHgwOCkgPyAiWWVzIiA6ICJObyIpKTsKIAl2NGwyX2luZm8oc2QsICJDRUM6ICVzXG4iLCAhIShjZWNfcmVhZChzZCwgMHgyYSkgJiAweDAxKSA/CiAJCQkiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAogCXY0bDJfaW5mbyhzZCwgIi0tLS0tU2lnbmFsIHN0YXR1cy0tLS0tXG4iKTsKLQl2NGwyX2luZm8oc2QsICJDYWJsZSBkZXRlY3RlZCAoKzVWIHBvd2VyKTogJXNcbiIsCi0JCQkoaW9fcmVhZChzZCwgMHg2ZikgJiAweDEwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCXY0bDJfaW5mbyhzZCwgIkNhYmxlIGRldGVjdGVkICgrNVYgcG93ZXIpIHBvcnQgQTogJXMsIEI6ICVzLCBDOiAlcywgRDogJXNcbiIsCisJCQkoKGlvX3JlYWQoc2QsIDB4NmYpICYgMHgxMCkgPyAiWWVzIiA6ICJObyIpLAorCQkJKChpb19yZWFkKHNkLCAweDZmKSAmIDB4MDgpID8gIlllcyIgOiAiTm8iKSwKKwkJCSgoaW9fcmVhZChzZCwgMHg2ZikgJiAweDA0KSA/ICJZZXMiIDogIk5vIiksCisJCQkoKGlvX3JlYWQoc2QsIDB4NmYpICYgMHgwMikgPyAiWWVzIiA6ICJObyIpKTsKIAl2NGwyX2luZm8oc2QsICJUTURTIHNpZ25hbCBkZXRlY3RlZDogJXNcbiIsCiAJCQlub19zaWduYWxfdG1kcyhzZCkgPyAiZmFsc2UiIDogInRydWUiKTsKIAl2NGwyX2luZm8oc2QsICJUTURTIHNpZ25hbCBsb2NrZWQ6ICVzXG4iLApAQCAtMTc0NCwxMSArMTk3MywxNCBAQAogCXY0bDJfaW5mbyhzZCwgIkNvbG9yIHNwYWNlIGNvbnZlcnNpb246ICVzXG4iLAogCQkJY3NjX2NvZWZmX3NlbF9yYltjcF9yZWFkKHNkLCAweGZjKSA+PiA0XSk7CiAKLQlpZiAoIURJR0lUQUxfSU5QVVQpCisJaWYgKCFpc19kaWdpdGFsX2lucHV0KHNkKSkKIAkJcmV0dXJuIDA7CiAKIAl2NGwyX2luZm8oc2QsICItLS0tLSVzIHN0YXR1cy0tLS0tXG4iLCBpc19oZG1pKHNkKSA/ICJIRE1JIiA6ICJEVkktRCIpOwotCXY0bDJfaW5mbyhzZCwgIkhEQ1AgZW5jcnlwdGVkIGNvbnRlbnQ6ICVzXG4iLCAoaGRtaV9yZWFkKHNkLCAweDA1KSAmIDB4NDApID8gInRydWUiIDogImZhbHNlIik7CisJdjRsMl9pbmZvKHNkLCAiRGlnaXRhbCB2aWRlbyBwb3J0IHNlbGVjdGVkOiAlY1xuIiwKKwkJCShoZG1pX3JlYWQoc2QsIDB4MDApICYgMHgwMykgKyAnQScpOworCXY0bDJfaW5mbyhzZCwgIkhEQ1AgZW5jcnlwdGVkIGNvbnRlbnQ6ICVzXG4iLAorCQkJKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDQwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogCXY0bDJfaW5mbyhzZCwgIkhEQ1Aga2V5cyByZWFkOiAlcyVzXG4iLAogCQkJKGhkbWlfcmVhZChzZCwgMHgwNCkgJiAweDIwKSA/ICJ5ZXMiIDogIm5vIiwKIAkJCShoZG1pX3JlYWQoc2QsIDB4MDQpICYgMHgxMCkgPyAiRVJST1IiIDogIiIpOwpAQCAtMTg5NCwxMCArMjEyNiwxNiBAQAogCQkJCQlwZGF0YS0+cmVwbGljYXRlX2F2X2NvZGVzIDw8IDEgfAogCQkJCQlwZGF0YS0+aW52ZXJ0X2NiY3IgPDwgMCk7CiAKLQkvKiBUT0RPIGZyb20gcGxhdGZvcm0gZGF0YSAqLwogCWNwX3dyaXRlKHNkLCAweDY5LCAweDMwKTsgICAvKiBFbmFibGUgQ1AgQ1NDICovCi0JaW9fd3JpdGUoc2QsIDB4MDYsIDB4YTYpOyAgIC8qIHBvc2l0aXZlIFZTIGFuZCBIUyAqLwotCWlvX3dyaXRlKHNkLCAweDE0LCAweDdmKTsgICAvKiBEcml2ZSBzdHJlbmd0aCBhZGp1c3RlZCB0byBtYXggKi8KKworCS8qIFZTLCBIUyBwb2xhcml0aWVzICovCisJaW9fd3JpdGUoc2QsIDB4MDYsIDB4YTAgfCBwZGF0YS0+aW52X3ZzX3BvbCA8PCAyIHwgcGRhdGEtPmludl9oc19wb2wgPDwgMSk7CisKKwkvKiBBZGp1c3QgZHJpdmUgc3RyZW5ndGggKi8KKwlpb193cml0ZShzZCwgMHgxNCwgMHg0MCB8IHBkYXRhLT5kcl9zdHJfZGF0YSA8PCA0IHwKKwkJCQlwZGF0YS0+ZHJfc3RyX2NsayA8PCAyIHwKKwkJCQlwZGF0YS0+ZHJfc3RyX3N5bmMpOworCiAJY3Bfd3JpdGUoc2QsIDB4YmEsIChwZGF0YS0+aGRtaV9mcmVlX3J1bl9tb2RlIDw8IDEpIHwgMHgwMSk7IC8qIEhETUkgZnJlZSBydW4gKi8KIAljcF93cml0ZShzZCwgMHhmMywgMHhkYyk7IC8qIExvdyB0aHJlc2hvbGQgdG8gZW50ZXIvZXhpdCBmcmVlIHJ1biBtb2RlICovCiAJY3Bfd3JpdGUoc2QsIDB4ZjksIDB4MjMpOyAvKiAgU1RESSBjaC4gMSAtIExDVlMgY2hhbmdlIHRocmVzaG9sZCAtCkBAIC0xOTA3LDYgKzIxNDUsMTEgQEAKIAljcF93cml0ZShzZCwgMHhjOSwgMHgyZCk7IC8qIHVzZSBwcmltX21vZGUgYW5kIHZpZF9zdGQgYXMgZnJlZSBydW4gcmVzb2x1dGlvbgogCQkJCSAgICAgZm9yIGRpZ2l0YWwgZm9ybWF0cyAqLwogCisJLyogSERNSSBhdWRpbyAqLworCWhkbWlfd3JpdGVfYW5kX29yKHNkLCAweDE1LCAweGZjLCAweDAzKTsgLyogTXV0ZSBvbiBGSUZPIG92ZXItL3VuZGVyZmxvdyBbUkVGXzAxLCBjLiAxLjIuMThdICovCisJaGRtaV93cml0ZV9hbmRfb3Ioc2QsIDB4MWEsIDB4ZjEsIDB4MDgpOyAvKiBXYWl0IDEgcyBiZWZvcmUgdW5tdXRlICovCisJaGRtaV93cml0ZV9hbmRfb3Ioc2QsIDB4NjgsIDB4ZjksIDB4MDYpOyAvKiBGSUZPIHJlc2V0IG9uIG92ZXItL3VuZGVyZmxvdyBbUkVGXzAxLCBjLiAxLjIuMTldICovCisKIAkvKiBUT0RPIGZyb20gcGxhdGZvcm0gZGF0YSAqLwogCWFmZV93cml0ZShzZCwgMHhiNSwgMHgwMSk7ICAvKiBTZXR0aW5nIE1DTEsgdG8gMjU2RnMgKi8KIApAQCAtMTkxNyw4ICsyMTYwLDggQEAKIAlpb193cml0ZShzZCwgMHg0MCwgMHhjMik7IC8qIENvbmZpZ3VyZSBJTlQxICovCiAJaW9fd3JpdGUoc2QsIDB4NDEsIDB4ZDcpOyAvKiBTVERJIGlycSBmb3IgYW55IGNoYW5nZSwgZGlzYWJsZSBJTlQyICovCiAJaW9fd3JpdGUoc2QsIDB4NDYsIDB4OTgpOyAvKiBFbmFibGUgU1NQRCwgU1RESSBhbmQgQ1AgdW5sb2NrZWQgaW50ZXJydXB0cyAqLwotCWlvX3dyaXRlKHNkLCAweDZlLCAweGMwKTsgLyogRW5hYmxlIFZfTE9DS0VEIGFuZCBERV9SRUdFTl9MQ0sgaW50ZXJydXB0cyAqLwotCWlvX3dyaXRlKHNkLCAweDczLCAweDEwKTsgLyogRW5hYmxlIENBQkxFX0RFVF9BX1NUICgrNXYpIGludGVycnVwdCAqLworCWlvX3dyaXRlKHNkLCAweDZlLCAweGMxKTsgLyogRW5hYmxlIFZfTE9DS0VELCBERV9SRUdFTl9MQ0ssIEhETUlfTU9ERSBpbnRlcnJ1cHRzICovCisJaW9fd3JpdGUoc2QsIDB4NzMsIDB4MWUpOyAvKiBFbmFibGUgQ0FCTEVfREVUX0FfU1QgKCs1dikgaW50ZXJydXB0cyAqLwogCiAJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKHNkLT5jdHJsX2hhbmRsZXIpOwogfQpAQCAtMTk2NCw2ICsyMjA3LDggQEAKIHN0YXRpYyBpbnQgYWR2NzYwNF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZHZfdGltaW5ncyBjZWE2NDB4NDgwID0KKwkJVjRMMl9EVl9CVF9DRUFfNjQwWDQ4MFA1OV85NDsKIAlzdHJ1Y3QgYWR2NzYwNF9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IGFkdjc2MDRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsOwpAQCAtMTk4NCwxOSArMjIyOSwxOSBAQAogCiAJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KIAlzdGF0ZS0+cmVzdGFydF9zdGRpX29uY2UgPSB0cnVlOwotCXN0YXRlLT5wcmV2X2lucHV0X3N0YXR1cyA9IH4wOworCXN0YXRlLT5zZWxlY3RlZF9pbnB1dCA9IH4wOwogCiAJLyogcGxhdGZvcm0gZGF0YSAqLwogCWlmICghcGRhdGEpIHsKIAkJdjRsX2VycihjbGllbnQsICJObyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQltZW1jcHkoJnN0YXRlLT5wZGF0YSwgcGRhdGEsIHNpemVvZihzdGF0ZS0+cGRhdGEpKTsKKwlzdGF0ZS0+cGRhdGEgPSAqcGRhdGE7CisJc3RhdGUtPnRpbWluZ3MgPSBjZWE2NDB4NDgwOwogCiAJc2QgPSAmc3RhdGUtPnNkOwogCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZhZHY3NjA0X29wcyk7CiAJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXN0YXRlLT5jb25uZWN0b3JfaGRtaSA9IHBkYXRhLT5jb25uZWN0b3JfaGRtaTsKIAogCS8qIGkyYyBhY2Nlc3MgdG8gYWR2NzYwND8gKi8KIAlpZiAoYWR2X3NtYnVzX3JlYWRfYnl0ZV9kYXRhX2NoZWNrKGNsaWVudCwgMHhmYiwgZmFsc2UpICE9IDB4NjgpIHsKQEAgLTIwMjAsNyArMjI2NSw3IEBACiAKIAkvKiBwcml2YXRlIGNvbnRyb2xzICovCiAJc3RhdGUtPmRldGVjdF90eF81dl9jdHJsID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBOVUxMLAotCQkJVjRMMl9DSURfRFZfUlhfUE9XRVJfUFJFU0VOVCwgMCwgMSwgMCwgMCk7CisJCQlWNEwyX0NJRF9EVl9SWF9QT1dFUl9QUkVTRU5ULCAwLCAweDBmLCAwLCAwKTsKIAlzdGF0ZS0+cmdiX3F1YW50aXphdGlvbl9yYW5nZV9jdHJsID0KIAkJdjRsMl9jdHJsX25ld19zdGRfbWVudShoZGwsICZhZHY3NjA0X2N0cmxfb3BzLAogCQkJVjRMMl9DSURfRFZfUlhfUkdCX1JBTkdFLCBWNEwyX0RWX1JHQl9SQU5HRV9GVUxMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvYWR2Nzg0Mi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2Nzg0Mi5jCmluZGV4IGIxNTRmMzYuLjliYmQ2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL2Fkdjc4NDIuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9hZHY3ODQyLmMKQEAgLTIwLDEwICsyMCwxMyBAQAogCiAvKgogICogUmVmZXJlbmNlcyAoYyA9IGNoYXB0ZXIsIHAgPSBwYWdlKToKLSAqIFJFRl8wMSAtIEFuYWxvZyBkZXZpY2VzLCBBRFY3ODQyLCBSZWdpc3RlciBTZXR0aW5ncyBSZWNvbW1lbmRhdGlvbnMsCi0gKgkJUmV2aXNpb24gMi41LCBKdW5lIDIwMTAKLSAqIFJFRl8wMiAtIEFuYWxvZyBkZXZpY2VzLCBSZWdpc3RlciBtYXAgZG9jdW1lbnRhdGlvbiwgRG9jdW1lbnRhdGlvbiBvZgotICoJCXRoZSByZWdpc3RlciBtYXBzLCBTb2Z0d2FyZSBtYW51YWwsIFJldi4gRiwgSnVuZSAyMDEwCisgKiBSRUZfMDEgLSBBbmFsb2cgZGV2aWNlcywgQURWNzg0MiwKKyAqCQlSZWdpc3RlciBTZXR0aW5ncyBSZWNvbW1lbmRhdGlvbnMsIFJldi4gMS45LCBBcHJpbCAyMDExCisgKiBSRUZfMDIgLSBBbmFsb2cgZGV2aWNlcywgU29mdHdhcmUgVXNlciBHdWlkZSwgVUctMjA2LAorICoJCUFEVjc4NDIgSTJDIFJlZ2lzdGVyIE1hcHMsIFJldi4gMCwgTm92ZW1iZXIgMjAxMAorICogUkVGXzAzIC0gQW5hbG9nIGRldmljZXMsIEhhcmR3YXJlIFVzZXIgR3VpZGUsIFVHLTIxNCwKKyAqCQlBRFY3ODQyIEZhc3QgU3dpdGNoaW5nIDI6MSBIRE1JIDEuNCBSZWNlaXZlciB3aXRoIDNELUNvbWIKKyAqCQlEZWNvZGVyIGFuZCBEaWdpdGl6ZXIgLCBSZXYuIDAsIEphbnVhcnkgMjAxMQogICovCiAKIApAQCAtNjEsNiArNjQsNyBAQAogKi8KIAogc3RydWN0IGFkdjc4NDJfc3RhdGUgeworCXN0cnVjdCBhZHY3ODQyX3BsYXRmb3JtX2RhdGEgcGRhdGE7CiAJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCXN0cnVjdCBtZWRpYV9wYWQgcGFkOwogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7CkBAIC04MSw3ICs4NSw3IEBACiAJYm9vbCBpc19jZWFfZm9ybWF0OwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3F1ZXVlczsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29ya19lbmFibGVfaG90cGx1ZzsKLQlib29sIGNvbm5lY3Rvcl9oZG1pOworCWJvb2wgcmVzdGFydF9zdGRpX29uY2U7CiAJYm9vbCBoZG1pX3BvcnRfYTsKIAogCS8qIGkyYyBjbGllbnRzICovCkBAIC00OTEsNiArNDk1LDExIEBACiAJcmV0dXJuIGFkdl9zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RhdGUtPmkyY19oZG1pLCByZWcsIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGhkbWlfd3JpdGVfYW5kX29yKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZywgdTggbWFzaywgdTggdmFsKQoreworCXJldHVybiBoZG1pX3dyaXRlKHNkLCByZWcsIChoZG1pX3JlYWQoc2QsIHJlZykgJiBtYXNrKSB8IHZhbCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNwX3JlYWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnKQogewogCXN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKQEAgLTUzMiw3ICs1NDEsNyBAQAogCiAJYWR2X3NtYnVzX3dyaXRlX2J5dGVfbm9fY2hlY2soY2xpZW50LCAweGZmLCAweDgwKTsKIAotCW1kZWxheSgyKTsKKwltZGVsYXkoNSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01ODcsMTAgKzU5NiwxMCBAQAogCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBlbmFibGUgaG90cGx1ZyBvbiBwb3J0czogMHgleFxuIiwKIAkJCV9fZnVuY19fLCBwcmVzZW50KTsKIAotCWlmIChwcmVzZW50ICYgMHgxKQotCQltYXNrIHw9IDB4MjA7IC8qIHBvcnQgQSAqLwotCWlmIChwcmVzZW50ICYgMHgyKQotCQltYXNrIHw9IDB4MTA7IC8qIHBvcnQgQiAqLworCWlmIChwcmVzZW50ICYgKDB4MDQgPDwgQURWNzg0Ml9FRElEX1BPUlRfQSkpCisJCW1hc2sgfD0gMHgyMDsKKwlpZiAocHJlc2VudCAmICgweDA0IDw8IEFEVjc4NDJfRURJRF9QT1JUX0IpKQorCQltYXNrIHw9IDB4MTA7CiAJaW9fd3JpdGVfYW5kX29yKHNkLCAweDIwLCAweGNmLCBtYXNrKTsKIH0KIApAQCAtNjc5LDE0ICs2ODgsMTIgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IGFkdjc4NDJfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWNvbnN0IHU4ICp2YWwgPSBzdGF0ZS0+aGRtaV9lZGlkLmVkaWQ7Ci0JdTggY3VyX21hc2sgPSByZXBfcmVhZChzZCwgMHg3NykgJiAweDBjOwotCXU4IG1hc2sgPSBwb3J0ID09IDAgPyAweDQgOiAweDg7CiAJaW50IHNwYV9sb2MgPSBlZGlkX3NwYV9sb2NhdGlvbih2YWwpOwogCWludCBlcnIgPSAwOwogCWludCBpOwogCi0JdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAiJXM6IHdyaXRlIEVESUQgb24gcG9ydCAlZCAoc3BhIGF0IDB4JXgpXG4iLAotCQkJX19mdW5jX18sIHBvcnQsIHNwYV9sb2MpOworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiB3cml0ZSBFRElEIG9uIHBvcnQgJWMgKHNwYSBhdCAweCV4KVxuIiwKKwkJCV9fZnVuY19fLCAocG9ydCA9PSBBRFY3ODQyX0VESURfUE9SVF9BKSA/ICdBJyA6ICdCJywgc3BhX2xvYyk7CiAKIAkvKiBIUEEgZGlzYWJsZSBvbiBwb3J0IEEgYW5kIEIgKi8KIAlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MjAsIDB4Y2YsIDB4MDApOwpAQCAtNjk0LDYgKzcwMSw5IEBACiAJLyogRGlzYWJsZSBJMkMgYWNjZXNzIHRvIGludGVybmFsIEVESUQgcmFtIGZyb20gSERNSSBEREMgcG9ydHMgKi8KIAlyZXBfd3JpdGVfYW5kX29yKHNkLCAweDc3LCAweGYzLCAweDAwKTsKIAorCWlmICghc3RhdGUtPmhkbWlfZWRpZC5wcmVzZW50KQorCQlyZXR1cm4gMDsKKwogCS8qIGVkaWQgc2VnbWVudCBwb2ludGVyICcwJyBmb3IgSERNSSBwb3J0cyAqLwogCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4ZWYsIDB4MDApOwogCkBAIC03MDMsNDQgKzcxMywzMiBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoc3BhX2xvYyA+IDApIHsKLQkJaWYgKHBvcnQgPT0gMCkgewotCQkJLyogcG9ydCBBIFNQQSAqLwotCQkJcmVwX3dyaXRlKHNkLCAweDcyLCB2YWxbc3BhX2xvY10pOwotCQkJcmVwX3dyaXRlKHNkLCAweDczLCB2YWxbc3BhX2xvYyArIDFdKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHBvcnQgQiBTUEEgKi8KLQkJCXJlcF93cml0ZShzZCwgMHg3NCwgdmFsW3NwYV9sb2NdKTsKLQkJCXJlcF93cml0ZShzZCwgMHg3NSwgdmFsW3NwYV9sb2MgKyAxXSk7Ci0JCX0KLQkJcmVwX3dyaXRlKHNkLCAweDc2LCBzcGFfbG9jKTsKKwlpZiAoc3BhX2xvYyA8IDApCisJCXNwYV9sb2MgPSAweGMwOyAvKiBEZWZhdWx0IHZhbHVlIFtSRUZfMDIsIHAuIDE5OV0gKi8KKworCWlmIChwb3J0ID09IEFEVjc4NDJfRURJRF9QT1JUX0EpIHsKKwkJcmVwX3dyaXRlKHNkLCAweDcyLCB2YWxbc3BhX2xvY10pOworCQlyZXBfd3JpdGUoc2QsIDB4NzMsIHZhbFtzcGFfbG9jICsgMV0pOwogCX0gZWxzZSB7Ci0JCS8qIGRlZmF1bHQgcmVnaXN0ZXIgdmFsdWVzIGZvciBTUEEgKi8KLQkJaWYgKHBvcnQgPT0gMCkgewotCQkJLyogcG9ydCBBIFNQQSAqLwotCQkJcmVwX3dyaXRlKHNkLCAweDcyLCAwKTsKLQkJCXJlcF93cml0ZShzZCwgMHg3MywgMCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBwb3J0IEIgU1BBICovCi0JCQlyZXBfd3JpdGUoc2QsIDB4NzQsIDApOwotCQkJcmVwX3dyaXRlKHNkLCAweDc1LCAwKTsKLQkJfQotCQlyZXBfd3JpdGUoc2QsIDB4NzYsIDB4YzApOworCQlyZXBfd3JpdGUoc2QsIDB4NzQsIHZhbFtzcGFfbG9jXSk7CisJCXJlcF93cml0ZShzZCwgMHg3NSwgdmFsW3NwYV9sb2MgKyAxXSk7CiAJfQotCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4YmYsIDB4MDApOworCXJlcF93cml0ZShzZCwgMHg3Niwgc3BhX2xvYyAmIDB4ZmYpOworCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4YmYsIChzcGFfbG9jID4+IDIpICYgMHg0MCk7CiAKIAkvKiBDYWxjdWxhdGVzIHRoZSBjaGVja3N1bXMgYW5kIGVuYWJsZXMgSTJDIGFjY2VzcyB0byBpbnRlcm5hbAogCSAqIEVESUQgcmFtIGZyb20gSERNSSBEREMgcG9ydHMKIAkgKi8KLQlyZXBfd3JpdGVfYW5kX29yKHNkLCAweDc3LCAweGYzLCBtYXNrIHwgY3VyX21hc2spOworCXJlcF93cml0ZV9hbmRfb3Ioc2QsIDB4NzcsIDB4ZjMsIHN0YXRlLT5oZG1pX2VkaWQucHJlc2VudCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWlmIChyZXBfcmVhZChzZCwgMHg3ZCkgJiBtYXNrKQorCQlpZiAocmVwX3JlYWQoc2QsIDB4N2QpICYgc3RhdGUtPmhkbWlfZWRpZC5wcmVzZW50KQogCQkJYnJlYWs7CiAJCW1kZWxheSgxKTsKIAl9CiAJaWYgKGkgPT0gMTAwMCkgewotCQl2NGxfZXJyKGNsaWVudCwgImVycm9yIGVuYWJsaW5nIGVkaWQgb24gcG9ydCAlZFxuIiwgcG9ydCk7CisJCXY0bF9lcnIoY2xpZW50LCAiZXJyb3IgZW5hYmxpbmcgZWRpZCBvbiBwb3J0ICVjXG4iLAorCQkJCShwb3J0ID09IEFEVjc4NDJfRURJRF9QT1JUX0EpID8gJ0EnIDogJ0InKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC05MjcsNyArOTI1LDcgQEAKIAljcF93cml0ZShzZCwgMHgyNywgMHgwMCk7CiAJY3Bfd3JpdGUoc2QsIDB4MjgsIDB4MDApOwogCWNwX3dyaXRlKHNkLCAweDI5LCAweDAwKTsKLQljcF93cml0ZShzZCwgMHg4ZiwgMHgwMCk7CisJY3Bfd3JpdGUoc2QsIDB4OGYsIDB4NDApOwogCWNwX3dyaXRlKHNkLCAweDkwLCAweDAwKTsKIAljcF93cml0ZShzZCwgMHhhNSwgMHgwMCk7CiAJY3Bfd3JpdGUoc2QsIDB4YTYsIDB4MDApOwpAQCAtMTAzMywzNCArMTAzMSw2MCBAQAogewogCXN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAorCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiByZ2JfcXVhbnRpemF0aW9uX3JhbmdlID0gJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdGUtPnJnYl9xdWFudGl6YXRpb25fcmFuZ2UpOworCiAJc3dpdGNoIChzdGF0ZS0+cmdiX3F1YW50aXphdGlvbl9yYW5nZSkgewogCWNhc2UgVjRMMl9EVl9SR0JfUkFOR0VfQVVUTzoKLQkJLyogYXV0b21hdGljICovCi0JCWlmIChpc19kaWdpdGFsX2lucHV0KHNkKSAmJiAhKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDgwKSkgewotCQkJLyogcmVjZWl2aW5nIERWSS1EIHNpZ25hbCAqLworCQlpZiAoc3RhdGUtPm1vZGUgPT0gQURWNzg0Ml9NT0RFX1JHQikgeworCQkJLyogUmVjZWl2aW5nIGFuYWxvZyBSR0Igc2lnbmFsCisJCQkgKiBTZXQgUkdCIGZ1bGwgcmFuZ2UgKDAtMjU1KSAqLworCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDEwKTsKKwkJCWJyZWFrOworCQl9CiAKLQkJCS8qIEFEVjc4NDIgc2VsZWN0cyBSR0IgbGltaXRlZCByYW5nZSByZWdhcmRsZXNzIG9mCi0JCQkgICBpbnB1dCBmb3JtYXQgKENFL0lUKSBpbiBhdXRvbWF0aWMgbW9kZSAqLwotCQkJaWYgKHN0YXRlLT50aW1pbmdzLmJ0LnN0YW5kYXJkcyAmIFY0TDJfRFZfQlRfU1REX0NFQTg2MSkgewotCQkJCS8qIFJHQiBsaW1pdGVkIHJhbmdlICgxNi0yMzUpICovCi0JCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDAwKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKiBSR0IgZnVsbCByYW5nZSAoMC0yNTUpICovCi0JCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDEwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHJlY2VpdmluZyBIRE1JIG9yIGFuYWxvZyBzaWduYWwsIHNldCBhdXRvbW9kZSAqLworCQlpZiAoc3RhdGUtPm1vZGUgPT0gQURWNzg0Ml9NT0RFX0NPTVApIHsKKwkJCS8qIFJlY2VpdmluZyBhbmFsb2cgWVBiUHIgc2lnbmFsCisJCQkgKiBTZXQgYXV0b21vZGUgKi8KIAkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHhmMCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChoZG1pX3JlYWQoc2QsIDB4MDUpICYgMHg4MCkgeworCQkJLyogUmVjZWl2aW5nIEhETUkgc2lnbmFsCisJCQkgKiBTZXQgYXV0b21vZGUgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHhmMCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlY2VpdmluZyBEVkktRCBzaWduYWwKKwkJICogQURWNzg0MiBzZWxlY3RzIFJHQiBsaW1pdGVkIHJhbmdlIHJlZ2FyZGxlc3Mgb2YKKwkJICogaW5wdXQgZm9ybWF0IChDRS9JVCkgaW4gYXV0b21hdGljIG1vZGUgKi8KKwkJaWYgKHN0YXRlLT50aW1pbmdzLmJ0LnN0YW5kYXJkcyAmIFY0TDJfRFZfQlRfU1REX0NFQTg2MSkgeworCQkJLyogUkdCIGxpbWl0ZWQgcmFuZ2UgKDE2LTIzNSkgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBSR0IgZnVsbCByYW5nZSAoMC0yNTUpICovCisJCQlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MDIsIDB4MGYsIDB4MTApOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9EVl9SR0JfUkFOR0VfTElNSVRFRDoKLQkJLyogUkdCIGxpbWl0ZWQgcmFuZ2UgKDE2LTIzNSkgKi8KLQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDAwKTsKKwkJaWYgKHN0YXRlLT5tb2RlID09IEFEVjc4NDJfTU9ERV9DT01QKSB7CisJCQkvKiBZQ3JDYiBsaW1pdGVkIHJhbmdlICgxNi0yMzUpICovCisJCQlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MDIsIDB4MGYsIDB4MjApOworCQl9IGVsc2UgeworCQkJLyogUkdCIGxpbWl0ZWQgcmFuZ2UgKDE2LTIzNSkgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgwMCk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0RWX1JHQl9SQU5HRV9GVUxMOgotCQkvKiBSR0IgZnVsbCByYW5nZSAoMC0yNTUpICovCi0JCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgxMCk7CisJCWlmIChzdGF0ZS0+bW9kZSA9PSBBRFY3ODQyX01PREVfQ09NUCkgeworCQkJLyogWUNyQ2IgZnVsbCByYW5nZSAoMC0yNTUpICovCisJCQlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MDIsIDB4MGYsIDB4NjApOworCQl9IGVsc2UgeworCQkJLyogUkdCIGZ1bGwgcmFuZ2UgKDAtMjU1KSAqLworCQkJaW9fd3JpdGVfYW5kX29yKHNkLCAweDAyLCAweDBmLCAweDEwKTsKKwkJfQogCQlicmVhazsKIAl9CiB9CkBAIC0xMjk4LDcgKzEzMjIsNyBAQAogfQogCiAvKiBGaWxsIHRoZSBvcHRpb25hbCBmaWVsZHMgLnN0YW5kYXJkcyBhbmQgLmZsYWdzIGluIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MKLSAgIGlmIHRoZSBmb3JtYXQgaXMgbGlzdGVkIGluIGFkdjc2MDRfdGltaW5nc1tdICovCisgICBpZiB0aGUgZm9ybWF0IGlzIGxpc3RlZCBpbiBhZHY3ODQyX3RpbWluZ3NbXSAqLwogc3RhdGljIHZvaWQgYWR2Nzg0Ml9maWxsX29wdGlvbmFsX2R2X3RpbWluZ3NfZmllbGRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCXN0cnVjdCB2NGwyX2R2X3RpbWluZ3MgKnRpbWluZ3MpCiB7CkBAIC0xMzE0LDExOSArMTMzOCwxMDYgQEAKIAlzdHJ1Y3QgdjRsMl9idF90aW1pbmdzICpidCA9ICZ0aW1pbmdzLT5idDsKIAlzdHJ1Y3Qgc3RkaV9yZWFkYmFjayBzdGRpID0geyAwIH07CiAKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczpcbiIsIF9fZnVuY19fKTsKKwogCS8qIFNEUCBibG9jayAqLwogCWlmIChzdGF0ZS0+bW9kZSA9PSBBRFY3ODQyX01PREVfU0RQKQogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAkvKiByZWFkIFNUREkgKi8KIAlpZiAocmVhZF9zdGRpKHNkLCAmc3RkaSkpIHsKKwkJc3RhdGUtPnJlc3RhcnRfc3RkaV9vbmNlID0gdHJ1ZTsKIAkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IG5vIHZhbGlkIHNpZ25hbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0xJTks7CiAJfQogCWJ0LT5pbnRlcmxhY2VkID0gc3RkaS5pbnRlcmxhY2VkID8KIAkJVjRMMl9EVl9JTlRFUkxBQ0VEIDogVjRMMl9EVl9QUk9HUkVTU0lWRTsKLQlidC0+cG9sYXJpdGllcyA9ICgoaGRtaV9yZWFkKHNkLCAweDA1KSAmIDB4MTApID8gVjRMMl9EVl9WU1lOQ19QT1NfUE9MIDogMCkgfAotCQkoKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDIwKSA/IFY0TDJfRFZfSFNZTkNfUE9TX1BPTCA6IDApOwotCWJ0LT52c3luYyA9IHN0ZGkubGN2czsKIAogCWlmIChpc19kaWdpdGFsX2lucHV0KHNkKSkgewotCQlib29sIGxvY2sgPSBoZG1pX3JlYWQoc2QsIDB4MDQpICYgMHgwMjsKLQkJYm9vbCBpbnRlcmxhY2VkID0gaGRtaV9yZWFkKHNkLCAweDBiKSAmIDB4MjA7Ci0JCXVuc2lnbmVkIHcgPSAoaGRtaV9yZWFkKHNkLCAweDA3KSAmIDB4MWYpICogMjU2ICsgaGRtaV9yZWFkKHNkLCAweDA4KTsKLQkJdW5zaWduZWQgaCA9IChoZG1pX3JlYWQoc2QsIDB4MDkpICYgMHgxZikgKiAyNTYgKyBoZG1pX3JlYWQoc2QsIDB4MGEpOwotCQl1bnNpZ25lZCB3X3RvdGFsID0gKGhkbWlfcmVhZChzZCwgMHgxZSkgJiAweDNmKSAqIDI1NiArCi0JCQloZG1pX3JlYWQoc2QsIDB4MWYpOwotCQl1bnNpZ25lZCBoX3RvdGFsID0gKChoZG1pX3JlYWQoc2QsIDB4MjYpICYgMHgzZikgKiAyNTYgKwotCQkJCSAgICBoZG1pX3JlYWQoc2QsIDB4MjcpKSAvIDI7Ci0JCXVuc2lnbmVkIGZyZXEgPSAoKChoZG1pX3JlYWQoc2QsIDB4NTEpIDw8IDEpICsKLQkJCQkJKGhkbWlfcmVhZChzZCwgMHg1MikgPj4gNykpICogMTAwMDAwMCkgKwotCQkJKChoZG1pX3JlYWQoc2QsIDB4NTIpICYgMHg3ZikgKiAxMDAwMDAwKSAvIDEyODsKLQkJaW50IGk7Ci0KLQkJaWYgKGlzX2hkbWkoc2QpKSB7Ci0JCQkvKiBhZGp1c3QgZm9yIGRlZXAgY29sb3IgbW9kZSAqLwotCQkJZnJlcSA9IGZyZXEgKiA4IC8gKCgoaGRtaV9yZWFkKHNkLCAweDBiKSAmIDB4YzApPj42KSAqIDIgKyA4KTsKLQkJfQotCi0JCS8qIE5vIGxvY2s/ICovCi0JCWlmICghbG9jaykgewotCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IG5vIGxvY2sgb24gVE1EUyBzaWduYWxcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5PTENLOwotCQl9Ci0JCS8qIEludGVybGFjZWQ/ICovCi0JCWlmIChpbnRlcmxhY2VkKSB7Ci0JCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogaW50ZXJsYWNlZCB2aWRlbyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVSQU5HRTsKLQkJfQotCi0JCWZvciAoaSA9IDA7IHY0bDJfZHZfdGltaW5nc19wcmVzZXRzW2ldLmJ0LndpZHRoOyBpKyspIHsKLQkJCWNvbnN0IHN0cnVjdCB2NGwyX2J0X3RpbWluZ3MgKmJ0ID0gJnY0bDJfZHZfdGltaW5nc19wcmVzZXRzW2ldLmJ0OwotCi0JCQlpZiAoIXY0bDJfdmFsaWRfZHZfdGltaW5ncygmdjRsMl9kdl90aW1pbmdzX3ByZXNldHNbaV0sCi0JCQkJCQkgICBhZHY3ODQyX2dldF9kdl90aW1pbmdzX2NhcChzZCksCi0JCQkJCQkgICBhZHY3ODQyX2NoZWNrX2R2X3RpbWluZ3MsIE5VTEwpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHdfdG90YWwgIT0gaHRvdGFsKGJ0KSB8fCBoX3RvdGFsICE9IHZ0b3RhbChidCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICh3ICE9IGJ0LT53aWR0aCB8fCBoICE9IGJ0LT5oZWlnaHQpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChhYnMoZnJlcSAtIGJ0LT5waXhlbGNsb2NrKSA+IDEwMDAwMDApCi0JCQkJY29udGludWU7Ci0JCQkqdGltaW5ncyA9IHY0bDJfZHZfdGltaW5nc19wcmVzZXRzW2ldOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJdWludDMyX3QgZnJlcTsKIAogCQl0aW1pbmdzLT50eXBlID0gVjRMMl9EVl9CVF82NTZfMTEyMDsKIAotCQlidC0+d2lkdGggPSB3OwotCQlidC0+aGVpZ2h0ID0gaDsKLQkJYnQtPmludGVybGFjZWQgPSAoaGRtaV9yZWFkKHNkLCAweDBiKSAmIDB4MjApID8KLQkJCVY0TDJfRFZfSU5URVJMQUNFRCA6IFY0TDJfRFZfUFJPR1JFU1NJVkU7Ci0JCWJ0LT5wb2xhcml0aWVzID0gKChoZG1pX3JlYWQoc2QsIDB4MDUpICYgMHgxMCkgPwotCQkJVjRMMl9EVl9WU1lOQ19QT1NfUE9MIDogMCkgfCAoKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDIwKSA/Ci0JCQlWNEwyX0RWX0hTWU5DX1BPU19QT0wgOiAwKTsKLQkJYnQtPnBpeGVsY2xvY2sgPSAoKChoZG1pX3JlYWQoc2QsIDB4NTEpIDw8IDEpICsKLQkJCQkgICAoaGRtaV9yZWFkKHNkLCAweDUyKSA+PiA3KSkgKiAxMDAwMDAwKSArCi0JCQkJICgoaGRtaV9yZWFkKHNkLCAweDUyKSAmIDB4N2YpICogMTAwMDAwMCkgLyAxMjg7Ci0JCWJ0LT5oZnJvbnRwb3JjaCA9IChoZG1pX3JlYWQoc2QsIDB4MjApICYgMHgxZikgKiAyNTYgKwotCQkJaGRtaV9yZWFkKHNkLCAweDIxKTsKLQkJYnQtPmhzeW5jID0gKGhkbWlfcmVhZChzZCwgMHgyMikgJiAweDFmKSAqIDI1NiArCi0JCQloZG1pX3JlYWQoc2QsIDB4MjMpOwotCQlidC0+aGJhY2twb3JjaCA9IChoZG1pX3JlYWQoc2QsIDB4MjQpICYgMHgxZikgKiAyNTYgKwotCQkJaGRtaV9yZWFkKHNkLCAweDI1KTsKLQkJYnQtPnZmcm9udHBvcmNoID0gKChoZG1pX3JlYWQoc2QsIDB4MmEpICYgMHgzZikgKiAyNTYgKwotCQkJCSAgIGhkbWlfcmVhZChzZCwgMHgyYikpIC8gMjsKLQkJYnQtPmlsX3Zmcm9udHBvcmNoID0gKChoZG1pX3JlYWQoc2QsIDB4MmMpICYgMHgzZikgKiAyNTYgKwotCQkJCSAgICAgIGhkbWlfcmVhZChzZCwgMHgyZCkpIC8gMjsKLQkJYnQtPnZzeW5jID0gKChoZG1pX3JlYWQoc2QsIDB4MmUpICYgMHgzZikgKiAyNTYgKwotCQkJICAgICBoZG1pX3JlYWQoc2QsIDB4MmYpKSAvIDI7Ci0JCWJ0LT5pbF92c3luYyA9ICgoaGRtaV9yZWFkKHNkLCAweDMwKSAmIDB4M2YpICogMjU2ICsKLQkJCQloZG1pX3JlYWQoc2QsIDB4MzEpKSAvIDI7Ci0JCWJ0LT52YmFja3BvcmNoID0gKChoZG1pX3JlYWQoc2QsIDB4MzIpICYgMHgzZikgKiAyNTYgKwotCQkJCSAgaGRtaV9yZWFkKHNkLCAweDMzKSkgLyAyOwotCQlidC0+aWxfdmJhY2twb3JjaCA9ICgoaGRtaV9yZWFkKHNkLCAweDM0KSAmIDB4M2YpICogMjU2ICsKLQkJCQkgICAgIGhkbWlfcmVhZChzZCwgMHgzNSkpIC8gMjsKKwkJYnQtPndpZHRoID0gKGhkbWlfcmVhZChzZCwgMHgwNykgJiAweDBmKSAqIDI1NiArIGhkbWlfcmVhZChzZCwgMHgwOCk7CisJCWJ0LT5oZWlnaHQgPSAoaGRtaV9yZWFkKHNkLCAweDA5KSAmIDB4MGYpICogMjU2ICsgaGRtaV9yZWFkKHNkLCAweDBhKTsKKwkJZnJlcSA9IChoZG1pX3JlYWQoc2QsIDB4MDYpICogMTAwMDAwMCkgKworCQkgICAgICAgKChoZG1pX3JlYWQoc2QsIDB4M2IpICYgMHgzMCkgPj4gNCkgKiAyNTAwMDA7CiAKLQkJYnQtPnN0YW5kYXJkcyA9IDA7Ci0JCWJ0LT5mbGFncyA9IDA7Ci0JfSBlbHNlIHsKLQkJLyogSW50ZXJsYWNlZD8gKi8KLQkJaWYgKHN0ZGkuaW50ZXJsYWNlZCkgewotCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IGludGVybGFjZWQgdmlkZW8gbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FUkFOR0U7CisJCWlmIChpc19oZG1pKHNkKSkgeworCQkJLyogYWRqdXN0IGZvciBkZWVwIGNvbG9yIG1vZGUgKi8KKwkJCWZyZXEgPSBmcmVxICogOCAvICgoKGhkbWlfcmVhZChzZCwgMHgwYikgJiAweGMwKSA+PiA1KSArIDgpOwogCQl9Ci0KKwkJYnQtPnBpeGVsY2xvY2sgPSBmcmVxOworCQlidC0+aGZyb250cG9yY2ggPSAoaGRtaV9yZWFkKHNkLCAweDIwKSAmIDB4MDMpICogMjU2ICsKKwkJCWhkbWlfcmVhZChzZCwgMHgyMSk7CisJCWJ0LT5oc3luYyA9IChoZG1pX3JlYWQoc2QsIDB4MjIpICYgMHgwMykgKiAyNTYgKworCQkJaGRtaV9yZWFkKHNkLCAweDIzKTsKKwkJYnQtPmhiYWNrcG9yY2ggPSAoaGRtaV9yZWFkKHNkLCAweDI0KSAmIDB4MDMpICogMjU2ICsKKwkJCWhkbWlfcmVhZChzZCwgMHgyNSk7CisJCWJ0LT52ZnJvbnRwb3JjaCA9ICgoaGRtaV9yZWFkKHNkLCAweDJhKSAmIDB4MWYpICogMjU2ICsKKwkJCWhkbWlfcmVhZChzZCwgMHgyYikpIC8gMjsKKwkJYnQtPnZzeW5jID0gKChoZG1pX3JlYWQoc2QsIDB4MmUpICYgMHgxZikgKiAyNTYgKworCQkJaGRtaV9yZWFkKHNkLCAweDJmKSkgLyAyOworCQlidC0+dmJhY2twb3JjaCA9ICgoaGRtaV9yZWFkKHNkLCAweDMyKSAmIDB4MWYpICogMjU2ICsKKwkJCWhkbWlfcmVhZChzZCwgMHgzMykpIC8gMjsKKwkJYnQtPnBvbGFyaXRpZXMgPSAoKGhkbWlfcmVhZChzZCwgMHgwNSkgJiAweDEwKSA/IFY0TDJfRFZfVlNZTkNfUE9TX1BPTCA6IDApIHwKKwkJCSgoaGRtaV9yZWFkKHNkLCAweDA1KSAmIDB4MjApID8gVjRMMl9EVl9IU1lOQ19QT1NfUE9MIDogMCk7CisJCWlmIChidC0+aW50ZXJsYWNlZCA9PSBWNEwyX0RWX0lOVEVSTEFDRUQpIHsKKwkJCWJ0LT5oZWlnaHQgKz0gKGhkbWlfcmVhZChzZCwgMHgwYikgJiAweDBmKSAqIDI1NiArCisJCQkJCWhkbWlfcmVhZChzZCwgMHgwYyk7CisJCQlidC0+aWxfdmZyb250cG9yY2ggPSAoKGhkbWlfcmVhZChzZCwgMHgyYykgJiAweDFmKSAqIDI1NiArCisJCQkJCWhkbWlfcmVhZChzZCwgMHgyZCkpIC8gMjsKKwkJCWJ0LT5pbF92c3luYyA9ICgoaGRtaV9yZWFkKHNkLCAweDMwKSAmIDB4MWYpICogMjU2ICsKKwkJCQkJaGRtaV9yZWFkKHNkLCAweDMxKSkgLyAyOworCQkJYnQtPnZiYWNrcG9yY2ggPSAoKGhkbWlfcmVhZChzZCwgMHgzNCkgJiAweDFmKSAqIDI1NiArCisJCQkJCWhkbWlfcmVhZChzZCwgMHgzNSkpIC8gMjsKKwkJfQorCQlhZHY3ODQyX2ZpbGxfb3B0aW9uYWxfZHZfdGltaW5nc19maWVsZHMoc2QsIHRpbWluZ3MpOworCX0gZWxzZSB7CisJCS8qIGZpbmQgZm9ybWF0CisJCSAqIFNpbmNlIExDVlMgdmFsdWVzIGFyZSBpbmFjY3VyYXRlIFtSRUZfMDMsIHAuIDMzOS0zNDBdLAorCQkgKiBzdGRpMmR2X3RpbWluZ3MoKSBpcyBjYWxsZWQgd2l0aCBsY3ZzICstMSBpZiB0aGUgZmlyc3QgYXR0ZW1wdCBmYWlscy4KKwkJICovCisJCWlmICghc3RkaTJkdl90aW1pbmdzKHNkLCAmc3RkaSwgdGltaW5ncykpCisJCQlnb3RvIGZvdW5kOworCQlzdGRpLmxjdnMgKz0gMTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IGxjdnMgKyAxID0gJWRcbiIsIF9fZnVuY19fLCBzdGRpLmxjdnMpOworCQlpZiAoIXN0ZGkyZHZfdGltaW5ncyhzZCwgJnN0ZGksIHRpbWluZ3MpKQorCQkJZ290byBmb3VuZDsKKwkJc3RkaS5sY3ZzIC09IDI7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBsY3ZzIC0gMSA9ICVkXG4iLCBfX2Z1bmNfXywgc3RkaS5sY3ZzKTsKIAkJaWYgKHN0ZGkyZHZfdGltaW5ncyhzZCwgJnN0ZGksIHRpbWluZ3MpKSB7CisJCQkvKgorCQkJICogVGhlIFNUREkgYmxvY2sgbWF5IG1lYXN1cmUgd3JvbmcgdmFsdWVzLCBlc3BlY2lhbGx5CisJCQkgKiBmb3IgbGN2cyBhbmQgbGNmLiBJZiB0aGUgZHJpdmVyIGNhbiBub3QgZmluZCBhbnkKKwkJCSAqIHZhbGlkIHRpbWluZywgdGhlIFNUREkgYmxvY2sgaXMgcmVzdGFydGVkIHRvIG1lYXN1cmUKKwkJCSAqIHRoZSB2aWRlbyB0aW1pbmdzIGFnYWluLiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4KKwkJCSAqIGVycm9yLCBidXQgdGhlIHJlc3RhcnQgb2YgU1RESSB3aWxsIGdlbmVyYXRlIGEgbmV3CisJCQkgKiBTVERJIGludGVycnVwdCBhbmQgdGhlIGZvcm1hdCBkZXRlY3Rpb24gcHJvY2VzcyB3aWxsCisJCQkgKiByZXN0YXJ0LgorCQkJICovCisJCQlpZiAoc3RhdGUtPnJlc3RhcnRfc3RkaV9vbmNlKSB7CisJCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IHJlc3RhcnQgU1RESVxuIiwgX19mdW5jX18pOworCQkJCS8qIFRPRE8gcmVzdGFydCBTVERJIGZvciBTeW5jIENoYW5uZWwgMiAqLworCQkJCS8qIGVudGVyIG9uZS1zaG90IG1vZGUgKi8KKwkJCQljcF93cml0ZV9hbmRfb3Ioc2QsIDB4ODYsIDB4ZjksIDB4MDApOworCQkJCS8qIHRyaWdnZXIgU1RESSByZXN0YXJ0ICovCisJCQkJY3Bfd3JpdGVfYW5kX29yKHNkLCAweDg2LCAweGY5LCAweDA0KTsKKwkJCQkvKiByZXNldCB0byBjb250aW51b3VzIG1vZGUgKi8KKwkJCQljcF93cml0ZV9hbmRfb3Ioc2QsIDB4ODYsIDB4ZjksIDB4MDIpOworCQkJCXN0YXRlLT5yZXN0YXJ0X3N0ZGlfb25jZSA9IGZhbHNlOworCQkJCXJldHVybiAtRU5PTElOSzsKKwkJCX0KIAkJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KKwkJc3RhdGUtPnJlc3RhcnRfc3RkaV9vbmNlID0gdHJ1ZTsKIAl9Citmb3VuZDoKIAogCWlmIChkZWJ1ZyA+IDEpCi0JCXY0bDJfcHJpbnRfZHZfdGltaW5ncyhzZC0+bmFtZSwgImFkdjc4NDJfcXVlcnlfZHZfdGltaW5nczogIiwKLQkJCQkgICAgICB0aW1pbmdzLCB0cnVlKTsKKwkJdjRsMl9wcmludF9kdl90aW1pbmdzKHNkLT5uYW1lLCAiYWR2Nzg0Ml9xdWVyeV9kdl90aW1pbmdzOiIsCisJCQkJdGltaW5ncywgdHJ1ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzcsOSArMTQ0OCwxNiBAQAogCXN0cnVjdCB2NGwyX2J0X3RpbWluZ3MgKmJ0OwogCWludCBlcnI7CiAKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczpcbiIsIF9fZnVuY19fKTsKKwogCWlmIChzdGF0ZS0+bW9kZSA9PSBBRFY3ODQyX01PREVfU0RQKQogCQlyZXR1cm4gLUVOT0RBVEE7CiAKKwlpZiAodjRsMl9tYXRjaF9kdl90aW1pbmdzKCZzdGF0ZS0+dGltaW5ncywgdGltaW5ncywgMCkpIHsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IG5vIGNoYW5nZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKIAlidCA9ICZ0aW1pbmdzLT5idDsKIAogCWlmICghdjRsMl92YWxpZF9kdl90aW1pbmdzKHRpbWluZ3MsIGFkdjc4NDJfZ2V0X2R2X3RpbWluZ3NfY2FwKHNkKSwKQEAgLTE0NTAsNyArMTQ2OCw3IEBACiAKIAlzdGF0ZS0+dGltaW5ncyA9ICp0aW1pbmdzOwogCi0JY3Bfd3JpdGUoc2QsIDB4OTEsIGJ0LT5pbnRlcmxhY2VkID8gMHg1MCA6IDB4MTApOworCWNwX3dyaXRlKHNkLCAweDkxLCBidC0+aW50ZXJsYWNlZCA/IDB4NDAgOiAweDAwKTsKIAogCS8qIFVzZSBwcmltX21vZGUgYW5kIHZpZF9zdGQgd2hlbiBhdmFpbGFibGUgKi8KIAllcnIgPSBjb25maWd1cmVfcHJlZGVmaW5lZF92aWRlb190aW1pbmdzKHNkLCB0aW1pbmdzKTsKQEAgLTE0ODMsMTggKzE1MDEsMTggQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnB1dChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXNldF9yZ2JfcXVhbnRpemF0aW9uX3JhbmdlKHNkKTsKIAlzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CiAJY2FzZSBBRFY3ODQyX01PREVfU0RQOgogCWNhc2UgQURWNzg0Ml9NT0RFX0NPTVA6CiAJY2FzZSBBRFY3ODQyX01PREVfUkdCOgotCQkvKiBlbmFibGUgKi8KIAkJaW9fd3JpdGUoc2QsIDB4MTUsIDB4YjApOyAgIC8qIERpc2FibGUgVHJpc3RhdGUgb2YgUGlucyAobm8gYXVkaW8pICovCiAJCWJyZWFrOwogCWNhc2UgQURWNzg0Ml9NT0RFX0hETUk6Ci0JCS8qIGVuYWJsZSAqLwotCQloZG1pX3dyaXRlKHNkLCAweDFhLCAweDBhKTsgLyogVW5tdXRlIGF1ZGlvICovCiAJCWhkbWlfd3JpdGUoc2QsIDB4MDEsIDB4MDApOyAvKiBFbmFibGUgSERNSSBjbG9jayB0ZXJtaW5hdG9ycyAqLwogCQlpb193cml0ZShzZCwgMHgxNSwgMHhhMCk7ICAgLyogRGlzYWJsZSBUcmlzdGF0ZSBvZiBQaW5zICovCisJCWhkbWlfd3JpdGVfYW5kX29yKHNkLCAweDFhLCAweGVmLCAweDAwKTsgLyogVW5tdXRlIGF1ZGlvICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIiVzOiBVbmtub3duIG1vZGUgJWRcbiIsCkBAIC0xNTA1LDkgKzE1MjMsOSBAQAogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2lucHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0JLyogZGlzYWJsZSAqLworCWhkbWlfd3JpdGVfYW5kX29yKHNkLCAweDFhLCAweGVmLCAweDEwKTsgLyogTXV0ZSBhdWRpbyBbUkVGXzAxLCBjLiAyLjIuMl0gKi8KKwltc2xlZXAoMTYpOyAvKiA1MTIgc2FtcGxlcyB3aXRoID49IDMyIGtIeiBzYW1wbGUgcmF0ZSBbUkVGXzAzLCBjLiA4LjI5XSAqLwogCWlvX3dyaXRlKHNkLCAweDE1LCAweGJlKTsgICAvKiBUcmlzdGF0ZSBhbGwgb3V0cHV0cyBmcm9tIHZpZGVvIGNvcmUgKi8KLQloZG1pX3dyaXRlKHNkLCAweDFhLCAweDFhKTsgLyogTXV0ZSBhdWRpbyAqLwogCWhkbWlfd3JpdGUoc2QsIDB4MDEsIDB4NzgpOyAvKiBEaXNhYmxlIEhETUkgY2xvY2sgdGVybWluYXRvcnMgKi8KIH0KIApAQCAtMTU3NSw5ICsxNTkzLDYgQEAKIAkJYWZlX3dyaXRlKHNkLCAweDAwLCAweDAwKTsgLyogcG93ZXIgdXAgQURDICovCiAJCWFmZV93cml0ZShzZCwgMHhjOCwgMHgwMCk7IC8qIHBoYXNlIGNvbnRyb2wgKi8KIAotCQlpb193cml0ZShzZCwgMHgxOSwgMHg4Myk7IC8qIExMQyBETEwgcGhhc2UgKi8KLQkJaW9fd3JpdGUoc2QsIDB4MzMsIDB4NDApOyAvKiBMTEMgRExMIGVuYWJsZSAqLwotCiAJCWlvX3dyaXRlKHNkLCAweGRkLCAweDkwKTsgLyogTWFudWFsIDJ4IG91dHB1dCBjbG9jayAqLwogCQkvKiBzY3JpcHQgc2F5cyByZWdpc3RlciAweGRlLCB3aGljaCBkb24ndCBleGlzdCBpbiBtYW51YWwgKi8KIApAQCAtMTYxMSw4ICsxNjI2LDYgQEAKIAkJLyogZGVpbnRlcmxhY2VyIGVuYWJsZWQgYW5kIDNEIGNvbWIgKi8KIAkJc2RwX3dyaXRlX2FuZF9vcihzZCwgMHgxMiwgMHhmNiwgMHgwOSk7CiAKLQkJc2RwX3dyaXRlKHNkLCAweGRkLCAweDA4KTsgLyogZnJlZSBydW4gYXV0byAqLwotCiAJCWJyZWFrOwogCiAJY2FzZSBBRFY3ODQyX01PREVfQ09NUDoKQEAgLTE2MjcsNiArMTY0MCwxMyBAQAogCiAJCWFmZV93cml0ZShzZCwgMHgwMCwgMHgwMCk7IC8qIHBvd2VyIHVwIEFEQyAqLwogCQlhZmVfd3JpdGUoc2QsIDB4YzgsIDB4MDApOyAvKiBwaGFzZSBjb250cm9sICovCisJCWlmIChzdGF0ZS0+bW9kZSA9PSBBRFY3ODQyX01PREVfQ09NUCkgeworCQkJLyogZm9yY2UgdG8gWUNyQ2IgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHg2MCk7CisJCX0gZWxzZSB7CisJCQkvKiBmb3JjZSB0byBSR0IgKi8KKwkJCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgwMiwgMHgwZiwgMHgxMCk7CisJCX0KIAogCQkvKiBzZXQgQURJIHJlY29tbWVuZGVkIHNldHRpbmdzIGZvciBkaWdpdGl6ZXIgKi8KIAkJLyogIkFEVjc4NDIgUmVnaXN0ZXIgU2V0dGluZ3MgUmVjb21tZW5kYXRpb25zCkBAIC0xNzIyLDE5ICsxNzQyLDE5IEBACiAKIAlzd2l0Y2ggKGlucHV0KSB7CiAJY2FzZSBBRFY3ODQyX1NFTEVDVF9IRE1JX1BPUlRfQToKLQkJLyogVE9ETyBzZWxlY3QgSERNSV9DT01QIG9yIEhETUlfR1IgKi8KIAkJc3RhdGUtPm1vZGUgPSBBRFY3ODQyX01PREVfSERNSTsKIAkJc3RhdGUtPnZpZF9zdGRfc2VsZWN0ID0gQURWNzg0Ml9IRE1JX0NPTVBfVklEX1NURF9IRF8xMjUwUDsKIAkJc3RhdGUtPmhkbWlfcG9ydF9hID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBRFY3ODQyX1NFTEVDVF9IRE1JX1BPUlRfQjoKLQkJLyogVE9ETyBzZWxlY3QgSERNSV9DT01QIG9yIEhETUlfR1IgKi8KIAkJc3RhdGUtPm1vZGUgPSBBRFY3ODQyX01PREVfSERNSTsKIAkJc3RhdGUtPnZpZF9zdGRfc2VsZWN0ID0gQURWNzg0Ml9IRE1JX0NPTVBfVklEX1NURF9IRF8xMjUwUDsKIAkJc3RhdGUtPmhkbWlfcG9ydF9hID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgQURWNzg0Ml9TRUxFQ1RfVkdBX0NPTVA6Ci0JCXY0bDJfaW5mbyhzZCwgIiVzOiBWR0EgY29tcG9uZW50OiB0b2RvXG4iLCBfX2Z1bmNfXyk7CisJCXN0YXRlLT5tb2RlID0gQURWNzg0Ml9NT0RFX0NPTVA7CisJCXN0YXRlLT52aWRfc3RkX3NlbGVjdCA9IEFEVjc4NDJfUkdCX1ZJRF9TVERfQVVUT19HUkFQSF9NT0RFOworCQlicmVhazsKIAljYXNlIEFEVjc4NDJfU0VMRUNUX1ZHQV9SR0I6CiAJCXN0YXRlLT5tb2RlID0gQURWNzg0Ml9NT0RFX1JHQjsKIAkJc3RhdGUtPnZpZF9zdGRfc2VsZWN0ID0gQURWNzg0Ml9SR0JfVklEX1NURF9BVVRPX0dSQVBIX01PREU7CkBAIC0xODE0LDEyICsxODM0LDE1IEBACiAJCWlvX3dyaXRlKHNkLCAweDc4LCAweDAzKTsKIAkJLyogRW5hYmxlIFNEUCBTdGFuZGFyZCBEZXRlY3Rpb24gQ2hhbmdlIGFuZCBTRFAgVmlkZW8gRGV0ZWN0ZWQgKi8KIAkJaW9fd3JpdGUoc2QsIDB4YTAsIDB4MDkpOworCQkvKiBFbmFibGUgSERNSV9NT0RFIGludGVycnVwdCAqLworCQlpb193cml0ZShzZCwgMHg2OSwgMHgwOCk7CiAJfSBlbHNlIHsKIAkJaW9fd3JpdGUoc2QsIDB4NDYsIDB4MCk7CiAJCWlvX3dyaXRlKHNkLCAweDVhLCAweDApOwogCQlpb193cml0ZShzZCwgMHg3MywgMHgwKTsKIAkJaW9fd3JpdGUoc2QsIDB4NzgsIDB4MCk7CiAJCWlvX3dyaXRlKHNkLCAweGEwLCAweDApOworCQlpb193cml0ZShzZCwgMHg2OSwgMHgwKTsKIAl9CiB9CiAKQEAgLTE4MjcsMTEgKzE4NTAsOSBAQAogewogCXN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAl1OCBmbXRfY2hhbmdlX2NwLCBmbXRfY2hhbmdlX2RpZ2l0YWwsIGZtdF9jaGFuZ2Vfc2RwOwotCXU4IGlycV9zdGF0dXNbNV07Ci0JdTggaXJxX2NmZyA9IGlvX3JlYWQoc2QsIDB4NDApOworCXU4IGlycV9zdGF0dXNbNl07CiAKLQkvKiBkaXNhYmxlIGlycS1waW4gb3V0cHV0ICovCi0JaW9fd3JpdGUoc2QsIDB4NDAsIGlycV9jZmcgfCAweDMpOworCWFkdjc4NDJfaXJxX2VuYWJsZShzZCwgZmFsc2UpOwogCiAJLyogcmVhZCBzdGF0dXMgKi8KIAlpcnFfc3RhdHVzWzBdID0gaW9fcmVhZChzZCwgMHg0Myk7CkBAIC0xODM5LDYgKzE4NjAsNyBAQAogCWlycV9zdGF0dXNbMl0gPSBpb19yZWFkKHNkLCAweDcwKTsKIAlpcnFfc3RhdHVzWzNdID0gaW9fcmVhZChzZCwgMHg3NSk7CiAJaXJxX3N0YXR1c1s0XSA9IGlvX3JlYWQoc2QsIDB4OWQpOworCWlycV9zdGF0dXNbNV0gPSBpb19yZWFkKHNkLCAweDY2KTsKIAogCS8qIGFuZCBjbGVhciAqLwogCWlmIChpcnFfc3RhdHVzWzBdKQpAQCAtMTg1MSwxMCArMTg3MywxNCBAQAogCQlpb193cml0ZShzZCwgMHg3NiwgaXJxX3N0YXR1c1szXSk7CiAJaWYgKGlycV9zdGF0dXNbNF0pCiAJCWlvX3dyaXRlKHNkLCAweDllLCBpcnFfc3RhdHVzWzRdKTsKKwlpZiAoaXJxX3N0YXR1c1s1XSkKKwkJaW9fd3JpdGUoc2QsIDB4NjcsIGlycV9zdGF0dXNbNV0pOwogCi0JdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IGlycSAleCwgJXgsICV4LCAleCwgJXhcbiIsIF9fZnVuY19fLAorCWFkdjc4NDJfaXJxX2VuYWJsZShzZCwgdHJ1ZSk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlczogaXJxICV4LCAleCwgJXgsICV4LCAleCwgJXhcbiIsIF9fZnVuY19fLAogCQkgaXJxX3N0YXR1c1swXSwgaXJxX3N0YXR1c1sxXSwgaXJxX3N0YXR1c1syXSwKLQkJIGlycV9zdGF0dXNbM10sIGlycV9zdGF0dXNbNF0pOworCQkgaXJxX3N0YXR1c1szXSwgaXJxX3N0YXR1c1s0XSwgaXJxX3N0YXR1c1s1XSk7CiAKIAkvKiBmb3JtYXQgY2hhbmdlIENQICovCiAJZm10X2NoYW5nZV9jcCA9IGlycV9zdGF0dXNbMF0gJiAweDljOwpAQCAtMTg3MSwyNSArMTg5Nyw3MiBAQAogCWVsc2UKIAkJZm10X2NoYW5nZV9kaWdpdGFsID0gMDsKIAotCS8qIG5vdGlmeSAqLworCS8qIGZvcm1hdCBjaGFuZ2UgKi8KIAlpZiAoZm10X2NoYW5nZV9jcCB8fCBmbXRfY2hhbmdlX2RpZ2l0YWwgfHwgZm10X2NoYW5nZV9zZHApIHsKIAkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLAogCQkJICIlczogZm10X2NoYW5nZV9jcCA9IDB4JXgsIGZtdF9jaGFuZ2VfZGlnaXRhbCA9IDB4JXgsIGZtdF9jaGFuZ2Vfc2RwID0gMHgleFxuIiwKIAkJCSBfX2Z1bmNfXywgZm10X2NoYW5nZV9jcCwgZm10X2NoYW5nZV9kaWdpdGFsLAogCQkJIGZtdF9jaGFuZ2Vfc2RwKTsKIAkJdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBBRFY3ODQyX0ZNVF9DSEFOR0UsIE5VTEwpOworCQlpZiAoaGFuZGxlZCkKKwkJCSpoYW5kbGVkID0gdHJ1ZTsKIAl9CiAKLQkvKiA1diBjYWJsZSBkZXRlY3QgKi8KLQlpZiAoaXJxX3N0YXR1c1syXSkKKwkvKiBIRE1JL0RWSSBtb2RlICovCisJaWYgKGlycV9zdGF0dXNbNV0gJiAweDA4KSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBpcnEgJXMgbW9kZVxuIiwgX19mdW5jX18sCisJCQkgKGlvX3JlYWQoc2QsIDB4NjUpICYgMHgwOCkgPyAiSERNSSIgOiAiRFZJIik7CisJCWlmIChoYW5kbGVkKQorCQkJKmhhbmRsZWQgPSB0cnVlOworCX0KKworCS8qIHR4IDV2IGRldGVjdCAqLworCWlmIChpcnFfc3RhdHVzWzJdICYgMHgzKSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBpcnEgdHhfNXZcbiIsIF9fZnVuY19fKTsKIAkJYWR2Nzg0Ml9zX2RldGVjdF90eF81dl9jdHJsKHNkKTsKKwkJaWYgKGhhbmRsZWQpCisJCQkqaGFuZGxlZCA9IHRydWU7CisJfQorCXJldHVybiAwOworfQogCi0JaWYgKGhhbmRsZWQpCi0JCSpoYW5kbGVkID0gdHJ1ZTsKK3N0YXRpYyBpbnQgYWR2Nzg0Ml9nZXRfZWRpZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZWRpZCAqZWRpZCkKK3sKKwlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJdTggKmRhdGEgPSBOVUxMOwogCi0JLyogcmUtZW5hYmxlIGlycS1waW4gb3V0cHV0ICovCi0JaW9fd3JpdGUoc2QsIDB4NDAsIGlycV9jZmcpOworCWlmIChlZGlkLT5wYWQgPiBBRFY3ODQyX0VESURfUE9SVF9WR0EpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlZGlkLT5ibG9ja3MgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVkaWQtPmJsb2NrcyA+IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlZGlkLT5zdGFydF9ibG9jayA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlZGlkLT5zdGFydF9ibG9jayA9PSAxKQorCQllZGlkLT5ibG9ja3MgPSAxOworCWlmICghZWRpZC0+ZWRpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKKwlzd2l0Y2ggKGVkaWQtPnBhZCkgeworCWNhc2UgQURWNzg0Ml9FRElEX1BPUlRfQToKKwljYXNlIEFEVjc4NDJfRURJRF9QT1JUX0I6CisJCWlmIChzdGF0ZS0+aGRtaV9lZGlkLnByZXNlbnQgJiAoMHgwNCA8PCBlZGlkLT5wYWQpKQorCQkJZGF0YSA9IHN0YXRlLT5oZG1pX2VkaWQuZWRpZDsKKwkJYnJlYWs7CisJY2FzZSBBRFY3ODQyX0VESURfUE9SVF9WR0E6CisJCWlmIChzdGF0ZS0+dmdhX2VkaWQucHJlc2VudCkKKwkJCWRhdGEgPSBzdGF0ZS0+dmdhX2VkaWQuZWRpZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJbWVtY3B5KGVkaWQtPmVkaWQsCisJICAgICAgIGRhdGEgKyBlZGlkLT5zdGFydF9ibG9jayAqIDEyOCwKKwkgICAgICAgZWRpZC0+YmxvY2tzICogMTI4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg5OCw3ICsxOTcxLDcgQEAKIAlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoZS0+cGFkID4gMikKKwlpZiAoZS0+cGFkID4gQURWNzg0Ml9FRElEX1BPUlRfVkdBKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZS0+c3RhcnRfYmxvY2sgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTExLDIwICsxOTg0LDI1IEBACiAJc3RhdGUtPmFzcGVjdF9yYXRpbyA9IHY0bDJfY2FsY19hc3BlY3RfcmF0aW8oZS0+ZWRpZFsweDE1XSwKIAkJCWUtPmVkaWRbMHgxNl0pOwogCi0JaWYgKGUtPnBhZCA9PSAyKSB7CisJc3dpdGNoIChlLT5wYWQpIHsKKwljYXNlIEFEVjc4NDJfRURJRF9QT1JUX1ZHQToKIAkJbWVtc2V0KCZzdGF0ZS0+dmdhX2VkaWQuZWRpZCwgMCwgMjU2KTsKIAkJc3RhdGUtPnZnYV9lZGlkLnByZXNlbnQgPSBlLT5ibG9ja3MgPyAweDEgOiAweDA7CiAJCW1lbWNweSgmc3RhdGUtPnZnYV9lZGlkLmVkaWQsIGUtPmVkaWQsIDEyOCAqIGUtPmJsb2Nrcyk7CiAJCWVyciA9IGVkaWRfd3JpdGVfdmdhX3NlZ21lbnQoc2QpOwotCX0gZWxzZSB7Ci0JCXUzMiBtYXNrID0gMHgxPDxlLT5wYWQ7CisJCWJyZWFrOworCWNhc2UgQURWNzg0Ml9FRElEX1BPUlRfQToKKwljYXNlIEFEVjc4NDJfRURJRF9QT1JUX0I6CiAJCW1lbXNldCgmc3RhdGUtPmhkbWlfZWRpZC5lZGlkLCAwLCAyNTYpOwogCQlpZiAoZS0+YmxvY2tzKQotCQkJc3RhdGUtPmhkbWlfZWRpZC5wcmVzZW50IHw9IG1hc2s7CisJCQlzdGF0ZS0+aGRtaV9lZGlkLnByZXNlbnQgfD0gMHgwNCA8PCBlLT5wYWQ7CiAJCWVsc2UKLQkJCXN0YXRlLT5oZG1pX2VkaWQucHJlc2VudCAmPSB+bWFzazsKLQkJbWVtY3B5KCZzdGF0ZS0+aGRtaV9lZGlkLmVkaWQsIGUtPmVkaWQsIDEyOCplLT5ibG9ja3MpOworCQkJc3RhdGUtPmhkbWlfZWRpZC5wcmVzZW50ICY9IH4oMHgwNCA8PCBlLT5wYWQpOworCQltZW1jcHkoJnN0YXRlLT5oZG1pX2VkaWQuZWRpZCwgZS0+ZWRpZCwgMTI4ICogZS0+YmxvY2tzKTsKIAkJZXJyID0gZWRpZF93cml0ZV9oZG1pX3NlZ21lbnQoc2QsIGUtPnBhZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoZXJyIDwgMCkKIAkJdjRsMl9lcnIoc2QsICJlcnJvciAlZCB3cml0aW5nIGVkaWQgb24gcG9ydCAlZFxuIiwgZXJyLCBlLT5wYWQpOwpAQCAtMjE1Niw3ICsyMjM0LDcgQEAKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X2NvbG9yX3NwYWNlX3R4dFsxNl0gPSB7CiAJCSJSR0IgbGltaXRlZCByYW5nZSAoMTYtMjM1KSIsICJSR0IgZnVsbCByYW5nZSAoMC0yNTUpIiwKIAkJIllDYkNyIEJ0LjYwMSAoMTYtMjM1KSIsICJZQ2JDciBCdC43MDkgKDE2LTIzNSkiLAotCQkiWHZZQ0MgQnQuNjAxIiwgIlh2WUNDIEJ0LjcwOSIsCisJCSJ4dllDQyBCdC42MDEiLCAieHZZQ0MgQnQuNzA5IiwKIAkJIllDYkNyIEJ0LjYwMSAoMC0yNTUpIiwgIllDYkNyIEJ0LjcwOSAoMC0yNTUpIiwKIAkJImludmFsaWQiLCAiaW52YWxpZCIsICJpbnZhbGlkIiwgImludmFsaWQiLCAiaW52YWxpZCIsCiAJCSJpbnZhbGlkIiwgImludmFsaWQiLCAiYXV0b21hdGljIgpAQCAtMjE3NSw4ICsyMjUzLDYgQEAKIAogCXY0bDJfaW5mbyhzZCwgIi0tLS0tQ2hpcCBzdGF0dXMtLS0tLVxuIik7CiAJdjRsMl9pbmZvKHNkLCAiQ2hpcCBwb3dlcjogJXNcbiIsIG5vX3Bvd2VyKHNkKSA/ICJvZmYiIDogIm9uIik7Ci0JdjRsMl9pbmZvKHNkLCAiQ29ubmVjdG9yIHR5cGU6ICVzXG4iLCBzdGF0ZS0+Y29ubmVjdG9yX2hkbWkgPwotCQkJIkhETUkiIDogKGlzX2RpZ2l0YWxfaW5wdXQoc2QpID8gIkRWSS1EIiA6ICJEVkktQSIpKTsKIAl2NGwyX2luZm8oc2QsICJIRE1JL0RWSS1EIHBvcnQgc2VsZWN0ZWQ6ICVzXG4iLAogCQkJc3RhdGUtPmhkbWlfcG9ydF9hID8gIkEiIDogIkIiKTsKIAl2NGwyX2luZm8oc2QsICJFRElEIEEgJXMsIEIgJXNcbiIsCkBAIC0yMzU0LDE1ICsyNDMwLDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFkdjc4NDJfc19zZHBfaW8oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IGFkdjc4NDJfc2RwX2lvX3N5bmNfYWRqdXN0bWVudCAqcykKK3sKKwlpZiAocyAmJiBzLT5hZGp1c3QpIHsKKwkJc2RwX2lvX3dyaXRlKHNkLCAweDk0LCAocy0+aHNfYmVnID4+IDgpICYgMHhmKTsKKwkJc2RwX2lvX3dyaXRlKHNkLCAweDk1LCBzLT5oc19iZWcgJiAweGZmKTsKKwkJc2RwX2lvX3dyaXRlKHNkLCAweDk2LCAocy0+aHNfd2lkdGggPj4gOCkgJiAweGYpOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4OTcsIHMtPmhzX3dpZHRoICYgMHhmZik7CisJCXNkcF9pb193cml0ZShzZCwgMHg5OCwgKHMtPmRlX2JlZyA+PiA4KSAmIDB4Zik7CisJCXNkcF9pb193cml0ZShzZCwgMHg5OSwgcy0+ZGVfYmVnICYgMHhmZik7CisJCXNkcF9pb193cml0ZShzZCwgMHg5YSwgKHMtPmRlX2VuZCA+PiA4KSAmIDB4Zik7CisJCXNkcF9pb193cml0ZShzZCwgMHg5Yiwgcy0+ZGVfZW5kICYgMHhmZik7CisJCXNkcF9pb193cml0ZShzZCwgMHhhOCwgcy0+dnNfYmVnX28pOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4YTksIHMtPnZzX2JlZ19lKTsKKwkJc2RwX2lvX3dyaXRlKHNkLCAweGFhLCBzLT52c19lbmRfbyk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhYiwgcy0+dnNfZW5kX2UpOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4YWMsIHMtPmRlX3ZfYmVnX28pOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4YWQsIHMtPmRlX3ZfYmVnX2UpOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4YWUsIHMtPmRlX3ZfZW5kX28pOworCQlzZHBfaW9fd3JpdGUoc2QsIDB4YWYsIHMtPmRlX3ZfZW5kX2UpOworCX0gZWxzZSB7CisJCS8qIHNldCB0byBkZWZhdWx0ICovCisJCXNkcF9pb193cml0ZShzZCwgMHg5NCwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5NSwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5NiwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5NywgMHgyMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5OCwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5OSwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5YSwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHg5YiwgMHgwMCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhOCwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhOSwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhYSwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhYiwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhYywgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhZCwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhZSwgMHgwNCk7CisJCXNkcF9pb193cml0ZShzZCwgMHhhZiwgMHgwNCk7CisJfQorfQorCiBzdGF0aWMgaW50IGFkdjc4NDJfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgbm9ybSkKIHsKIAlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGFkdjc4NDJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmc3RhdGUtPnBkYXRhOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6XG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoc3RhdGUtPm1vZGUgIT0gQURWNzg0Ml9NT0RFX1NEUCkKIAkJcmV0dXJuIC1FTk9EQVRBOwogCisJaWYgKG5vcm0gJiBWNEwyX1NURF82MjVfNTApCisJCWFkdjc4NDJfc19zZHBfaW8oc2QsICZwZGF0YS0+c2RwX2lvX3N5bmNfNjI1KTsKKwllbHNlIGlmIChub3JtICYgVjRMMl9TVERfNTI1XzYwKQorCQlhZHY3ODQyX3Nfc2RwX2lvKHNkLCAmcGRhdGEtPnNkcF9pb19zeW5jXzUyNSk7CisJZWxzZQorCQlhZHY3ODQyX3Nfc2RwX2lvKHNkLCBOVUxMKTsKKwogCWlmIChub3JtICYgVjRMMl9TVERfQUxMKSB7CiAJCXN0YXRlLT5ub3JtID0gbm9ybTsKIAkJcmV0dXJuIDA7CkBAIC0yMzg1LDkgKzI1MDksMTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBhZHY3ODQyX2NvcmVfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQljb25zdCBzdHJ1Y3QgYWR2Nzg0Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3N0YXRpYyBpbnQgYWR2Nzg0Ml9jb3JlX2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKKwlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGFkdjc4NDJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmc3RhdGUtPnBkYXRhOwogCWhkbWlfd3JpdGUoc2QsIDB4NDgsCiAJCSAgIChwZGF0YS0+ZGlzYWJsZV9wd3JkbmIgPyAweDgwIDogMCkgfAogCQkgICAocGRhdGEtPmRpc2FibGVfY2FibGVfZGV0X3JzdCA/IDB4NDAgOiAwKSk7CkBAIC0yNDAwLDcgKzI1MjUsNyBAQAogCiAJLyogdmlkZW8gZm9ybWF0ICovCiAJaW9fd3JpdGUoc2QsIDB4MDIsCi0JCSBwZGF0YS0+aW5wX2NvbG9yX3NwYWNlIDw8IDQgfAorCQkgMHhmMCB8CiAJCSBwZGF0YS0+YWx0X2dhbW1hIDw8IDMgfAogCQkgcGRhdGEtPm9wXzY1Nl9yYW5nZSA8PCAyIHwKIAkJIHBkYXRhLT5yZ2Jfb3V0IDw8IDEgfApAQCAtMjQxMiwxMyArMjUzNywyNCBAQAogCQkJcGRhdGEtPnJlcGxpY2F0ZV9hdl9jb2RlcyA8PCAxIHwKIAkJCXBkYXRhLT5pbnZlcnRfY2JjciA8PCAwKTsKIAorCS8qIEhETUkgYXVkaW8gKi8KKwloZG1pX3dyaXRlX2FuZF9vcihzZCwgMHgxYSwgMHhmMSwgMHgwOCk7IC8qIFdhaXQgMSBzIGJlZm9yZSB1bm11dGUgKi8KKwogCS8qIERyaXZlIHN0cmVuZ3RoICovCi0JaW9fd3JpdGVfYW5kX29yKHNkLCAweDE0LCAweGMwLCBwZGF0YS0+ZHJpdmVfc3RyZW5ndGguZGF0YTw8NCB8Ci0JCQlwZGF0YS0+ZHJpdmVfc3RyZW5ndGguY2xvY2s8PDIgfAotCQkJcGRhdGEtPmRyaXZlX3N0cmVuZ3RoLnN5bmMpOworCWlvX3dyaXRlX2FuZF9vcihzZCwgMHgxNCwgMHhjMCwKKwkJCXBkYXRhLT5kcl9zdHJfZGF0YSA8PCA0IHwKKwkJCXBkYXRhLT5kcl9zdHJfY2xrIDw8IDIgfAorCQkJcGRhdGEtPmRyX3N0cl9zeW5jKTsKIAogCS8qIEhETUkgZnJlZSBydW4gKi8KLQljcF93cml0ZShzZCwgMHhiYSwgKHBkYXRhLT5oZG1pX2ZyZWVfcnVuX21vZGUgPDwgMSkgfCAweDAxKTsKKwljcF93cml0ZV9hbmRfb3Ioc2QsIDB4YmEsIDB4ZmMsIHBkYXRhLT5oZG1pX2ZyZWVfcnVuX2VuYWJsZSB8CisJCQkJCShwZGF0YS0+aGRtaV9mcmVlX3J1bl9tb2RlIDw8IDEpKTsKKworCS8qIFNQRCBmcmVlIHJ1biAqLworCXNkcF93cml0ZV9hbmRfb3Ioc2QsIDB4ZGQsIDB4ZjAsIHBkYXRhLT5zZHBfZnJlZV9ydW5fZm9yY2UgfAorCQkJCQkgKHBkYXRhLT5zZHBfZnJlZV9ydW5fY2Jhcl9lbiA8PCAxKSB8CisJCQkJCSAocGRhdGEtPnNkcF9mcmVlX3J1bl9tYW5fY29sX2VuIDw8IDIpIHwKKwkJCQkJIChwZGF0YS0+c2RwX2ZyZWVfcnVuX2F1dG8gPDwgMykpOwogCiAJLyogVE9ETyBmcm9tIHBsYXRmb3JtIGRhdGEgKi8KIAljcF93cml0ZShzZCwgMHg2OSwgMHgxNCk7ICAgLyogRW5hYmxlIENQIENTQyAqLwpAQCAtMjQzMSwxOCArMjU2Nyw2IEBACiAKIAlzZHBfY3NjX2NvZWZmKHNkLCAmcGRhdGEtPnNkcF9jc2NfY29lZmYpOwogCi0JaWYgKHBkYXRhLT5zZHBfaW9fc3luYy5hZGp1c3QpIHsKLQkJY29uc3Qgc3RydWN0IGFkdjc4NDJfc2RwX2lvX3N5bmNfYWRqdXN0bWVudCAqcyA9ICZwZGF0YS0+c2RwX2lvX3N5bmM7Ci0JCXNkcF9pb193cml0ZShzZCwgMHg5NCwgKHMtPmhzX2JlZz4+OCkgJiAweGYpOwotCQlzZHBfaW9fd3JpdGUoc2QsIDB4OTUsIHMtPmhzX2JlZyAmIDB4ZmYpOwotCQlzZHBfaW9fd3JpdGUoc2QsIDB4OTYsIChzLT5oc193aWR0aD4+OCkgJiAweGYpOwotCQlzZHBfaW9fd3JpdGUoc2QsIDB4OTcsIHMtPmhzX3dpZHRoICYgMHhmZik7Ci0JCXNkcF9pb193cml0ZShzZCwgMHg5OCwgKHMtPmRlX2JlZz4+OCkgJiAweGYpOwotCQlzZHBfaW9fd3JpdGUoc2QsIDB4OTksIHMtPmRlX2JlZyAmIDB4ZmYpOwotCQlzZHBfaW9fd3JpdGUoc2QsIDB4OWEsIChzLT5kZV9lbmQ+PjgpICYgMHhmKTsKLQkJc2RwX2lvX3dyaXRlKHNkLCAweDliLCBzLT5kZV9lbmQgJiAweGZmKTsKLQl9Ci0KIAkvKiB0b2RvLCBpbXByb3ZlIHNldHRpbmdzIGZvciBzZHJhbSAqLwogCWlmIChwZGF0YS0+c2RfcmFtX3NpemUgPj0gMTI4KSB7CiAJCXNkcF93cml0ZShzZCwgMHgxMiwgMHgwZCk7IC8qIEZyYW1lIFRCQywzRCBjb21iIGVuYWJsZWQgKi8KQEAgLTI0ODMsMTIgKzI2MDcsMTEgQEAKIAlpb193cml0ZV9hbmRfb3Ioc2QsIDB4MjAsIDB4Y2YsIDB4MDApOwogCiAJLyogTExDICovCi0JLyogU2V0IHBoYXNlIHRvIDE2LiBUT0RPOiBnZXQgdGhpcyBmcm9tIHBsYXRmb3JtX2RhdGEgKi8KLQlpb193cml0ZShzZCwgMHgxOSwgMHg5MCk7CisJaW9fd3JpdGUoc2QsIDB4MTksIDB4ODAgfCBwZGF0YS0+bGxjX2RsbF9waGFzZSk7CiAJaW9fd3JpdGUoc2QsIDB4MzMsIDB4NDApOwogCiAJLyogaW50ZXJydXB0cyAqLwotCWlvX3dyaXRlKHNkLCAweDQwLCAweGUyKTsgLyogQ29uZmlndXJlIElOVDEgKi8KKwlpb193cml0ZShzZCwgMHg0MCwgMHhmMik7IC8qIENvbmZpZ3VyZSBJTlQxICovCiAKIAlhZHY3ODQyX2lycV9lbmFibGUoc2QsIHRydWUpOwogCkBAIC0yNTg4LDYgKzI3MTEsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJc3RydWN0IGFkdjc4NDJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2NGwyX2R2X3RpbWluZ3MgdGltaW5nczsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghcGRhdGEpCkBAIC0yNjEwLDcgKzI3MzQsNyBAQAogCWFkdjc4NDJfcmV3cml0ZV9pMmNfYWRkcmVzc2VzKHNkLCBwZGF0YSk7CiAKIAkvKiBhbmQgcmUtaW5pdCBjaGlwIGFuZCBzdGF0ZSAqLwotCWFkdjc4NDJfY29yZV9pbml0KHNkLCBwZGF0YSk7CisJYWR2Nzg0Ml9jb3JlX2luaXQoc2QpOwogCiAJZGlzYWJsZV9pbnB1dChzZCk7CiAKQEAgLTI2MTgsMTEgKzI3NDIsMTUgQEAKIAogCWVuYWJsZV9pbnB1dChzZCk7CiAKLQlhZHY3ODQyX3NfZHZfdGltaW5ncyhzZCwgJnN0YXRlLT50aW1pbmdzKTsKLQogCWVkaWRfd3JpdGVfdmdhX3NlZ21lbnQoc2QpOwotCWVkaWRfd3JpdGVfaGRtaV9zZWdtZW50KHNkLCAwKTsKLQllZGlkX3dyaXRlX2hkbWlfc2VnbWVudChzZCwgMSk7CisJZWRpZF93cml0ZV9oZG1pX3NlZ21lbnQoc2QsIEFEVjc4NDJfRURJRF9QT1JUX0EpOworCWVkaWRfd3JpdGVfaGRtaV9zZWdtZW50KHNkLCBBRFY3ODQyX0VESURfUE9SVF9CKTsKKworCXRpbWluZ3MgPSBzdGF0ZS0+dGltaW5nczsKKworCW1lbXNldCgmc3RhdGUtPnRpbWluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzKSk7CisKKwlhZHY3ODQyX3NfZHZfdGltaW5ncyhzZCwgJnRpbWluZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI2NzAsNiArMjc5OCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgYWR2Nzg0Ml9wYWRfb3BzID0geworCS5nZXRfZWRpZCA9IGFkdjc4NDJfZ2V0X2VkaWQsCiAJLnNldF9lZGlkID0gYWR2Nzg0Ml9zZXRfZWRpZCwKIH07CiAKQEAgLTI3MTIsOCArMjg0MSw5IEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIGFkdjc4NDJfdW5yZWdpc3Rlcl9jbGllbnRzKHN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSkKK3N0YXRpYyB2b2lkIGFkdjc4NDJfdW5yZWdpc3Rlcl9jbGllbnRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CisJc3RydWN0IGFkdjc4NDJfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWlmIChzdGF0ZS0+aTJjX2F2bGluaykKIAkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKHN0YXRlLT5pMmNfYXZsaW5rKTsKIAlpZiAoc3RhdGUtPmkyY19jZWMpCkBAIC0yNzM2LDIxICsyODY2LDc5IEBACiAJCWkyY191bnJlZ2lzdGVyX2RldmljZShzdGF0ZS0+aTJjX2NwKTsKIAlpZiAoc3RhdGUtPmkyY192ZHApCiAJCWkyY191bnJlZ2lzdGVyX2RldmljZShzdGF0ZS0+aTJjX3ZkcCk7CisKKwlzdGF0ZS0+aTJjX2F2bGluayA9IE5VTEw7CisJc3RhdGUtPmkyY19jZWMgPSBOVUxMOworCXN0YXRlLT5pMmNfaW5mb2ZyYW1lID0gTlVMTDsKKwlzdGF0ZS0+aTJjX3NkcF9pbyA9IE5VTEw7CisJc3RhdGUtPmkyY19zZHAgPSBOVUxMOworCXN0YXRlLT5pMmNfYWZlID0gTlVMTDsKKwlzdGF0ZS0+aTJjX3JlcGVhdGVyID0gTlVMTDsKKwlzdGF0ZS0+aTJjX2VkaWQgPSBOVUxMOworCXN0YXRlLT5pMmNfaGRtaSA9IE5VTEw7CisJc3RhdGUtPmkyY19jcCA9IE5VTEw7CisJc3RhdGUtPmkyY192ZHAgPSBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmFkdjc4NDJfZHVtbXlfY2xpZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmFkdjc4NDJfZHVtbXlfY2xpZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IGNoYXIgKmRlc2MsCiAJCQkJCSAgICAgICB1OCBhZGRyLCB1OCBpb19yZWcpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjcDsKIAogCWlvX3dyaXRlKHNkLCBpb19yZWcsIGFkZHIgPDwgMSk7Ci0JcmV0dXJuIGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLCBpb19yZWFkKHNkLCBpb19yZWcpID4+IDEpOworCisJaWYgKGFkZHIgPT0gMCkgeworCQl2NGwyX2VycihzZCwgIm5vICVzIGkyYyBhZGRyIGNvbmZpZ3VyZWRcbiIsIGRlc2MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljcCA9IGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLCBpb19yZWFkKHNkLCBpb19yZWcpID4+IDEpOworCWlmICghY3ApCisJCXY0bDJfZXJyKHNkLCAicmVnaXN0ZXIgJXMgb24gaTJjIGFkZHIgMHgleCBmYWlsZWRcbiIsIGRlc2MsIGFkZHIpOworCisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgaW50IGFkdjc4NDJfcmVnaXN0ZXJfY2xpZW50cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBhZHY3ODQyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgYWR2Nzg0Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9ICZzdGF0ZS0+cGRhdGE7CisKKwlzdGF0ZS0+aTJjX2F2bGluayA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCAiYXZsaW5rIiwgcGRhdGEtPmkyY19hdmxpbmssIDB4ZjMpOworCXN0YXRlLT5pMmNfY2VjID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJjZWMiLCBwZGF0YS0+aTJjX2NlYywgMHhmNCk7CisJc3RhdGUtPmkyY19pbmZvZnJhbWUgPSBhZHY3ODQyX2R1bW15X2NsaWVudChzZCwgImluZm9mcmFtZSIsIHBkYXRhLT5pMmNfaW5mb2ZyYW1lLCAweGY1KTsKKwlzdGF0ZS0+aTJjX3NkcF9pbyA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCAic2RwX2lvIiwgcGRhdGEtPmkyY19zZHBfaW8sIDB4ZjIpOworCXN0YXRlLT5pMmNfc2RwID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJzZHAiLCBwZGF0YS0+aTJjX3NkcCwgMHhmMSk7CisJc3RhdGUtPmkyY19hZmUgPSBhZHY3ODQyX2R1bW15X2NsaWVudChzZCwgImFmZSIsIHBkYXRhLT5pMmNfYWZlLCAweGY4KTsKKwlzdGF0ZS0+aTJjX3JlcGVhdGVyID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJyZXBlYXRlciIsIHBkYXRhLT5pMmNfcmVwZWF0ZXIsIDB4ZjkpOworCXN0YXRlLT5pMmNfZWRpZCA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCAiZWRpZCIsIHBkYXRhLT5pMmNfZWRpZCwgMHhmYSk7CisJc3RhdGUtPmkyY19oZG1pID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJoZG1pIiwgcGRhdGEtPmkyY19oZG1pLCAweGZiKTsKKwlzdGF0ZS0+aTJjX2NwID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJjcCIsIHBkYXRhLT5pMmNfY3AsIDB4ZmQpOworCXN0YXRlLT5pMmNfdmRwID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsICJ2ZHAiLCBwZGF0YS0+aTJjX3ZkcCwgMHhmZSk7CisKKwlpZiAoIXN0YXRlLT5pMmNfYXZsaW5rIHx8CisJICAgICFzdGF0ZS0+aTJjX2NlYyB8fAorCSAgICAhc3RhdGUtPmkyY19pbmZvZnJhbWUgfHwKKwkgICAgIXN0YXRlLT5pMmNfc2RwX2lvIHx8CisJICAgICFzdGF0ZS0+aTJjX3NkcCB8fAorCSAgICAhc3RhdGUtPmkyY19hZmUgfHwKKwkgICAgIXN0YXRlLT5pMmNfcmVwZWF0ZXIgfHwKKwkgICAgIXN0YXRlLT5pMmNfZWRpZCB8fAorCSAgICAhc3RhdGUtPmkyY19oZG1pIHx8CisJICAgICFzdGF0ZS0+aTJjX2NwIHx8CisJICAgICFzdGF0ZS0+aTJjX3ZkcCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWR2Nzg0Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYWR2Nzg0Ml9zdGF0ZSAqc3RhdGU7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MgY2VhNjQweDQ4MCA9CisJCVY0TDJfRFZfQlRfQ0VBXzY0MFg0ODBQNTlfOTQ7CiAJc3RydWN0IGFkdjc4NDJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CkBAIC0yNzc1LDEzICsyOTYzLDE3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCS8qIHBsYXRmb3JtIGRhdGEgKi8KKwlzdGF0ZS0+cGRhdGEgPSAqcGRhdGE7CisJc3RhdGUtPnRpbWluZ3MgPSBjZWE2NDB4NDgwOworCiAJc2QgPSAmc3RhdGUtPnNkOwogCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZhZHY3ODQyX29wcyk7CiAJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXN0YXRlLT5jb25uZWN0b3JfaGRtaSA9IHBkYXRhLT5jb25uZWN0b3JfaGRtaTsKIAlzdGF0ZS0+bW9kZSA9IHBkYXRhLT5tb2RlOwogCi0Jc3RhdGUtPmhkbWlfcG9ydF9hID0gdHJ1ZTsKKwlzdGF0ZS0+aGRtaV9wb3J0X2EgPSBwZGF0YS0+aW5wdXQgPT0gQURWNzg0Ml9TRUxFQ1RfSERNSV9QT1JUX0E7CisJc3RhdGUtPnJlc3RhcnRfc3RkaV9vbmNlID0gdHJ1ZTsKIAogCS8qIGkyYyBhY2Nlc3MgdG8gYWR2Nzg0Mj8gKi8KIAlyZXYgPSBhZHZfc21idXNfcmVhZF9ieXRlX2RhdGFfY2hlY2soY2xpZW50LCAweGVhLCBmYWxzZSkgPDwgOCB8CkBAIC0yODQzLDIxICszMDM1LDcgQEAKIAkJZ290byBlcnJfaGRsOwogCX0KIAotCXN0YXRlLT5pMmNfYXZsaW5rID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsIHBkYXRhLT5pMmNfYXZsaW5rLCAweGYzKTsKLQlzdGF0ZS0+aTJjX2NlYyA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCBwZGF0YS0+aTJjX2NlYywgMHhmNCk7Ci0Jc3RhdGUtPmkyY19pbmZvZnJhbWUgPSBhZHY3ODQyX2R1bW15X2NsaWVudChzZCwgcGRhdGEtPmkyY19pbmZvZnJhbWUsIDB4ZjUpOwotCXN0YXRlLT5pMmNfc2RwX2lvID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsIHBkYXRhLT5pMmNfc2RwX2lvLCAweGYyKTsKLQlzdGF0ZS0+aTJjX3NkcCA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCBwZGF0YS0+aTJjX3NkcCwgMHhmMSk7Ci0Jc3RhdGUtPmkyY19hZmUgPSBhZHY3ODQyX2R1bW15X2NsaWVudChzZCwgcGRhdGEtPmkyY19hZmUsIDB4ZjgpOwotCXN0YXRlLT5pMmNfcmVwZWF0ZXIgPSBhZHY3ODQyX2R1bW15X2NsaWVudChzZCwgcGRhdGEtPmkyY19yZXBlYXRlciwgMHhmOSk7Ci0Jc3RhdGUtPmkyY19lZGlkID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsIHBkYXRhLT5pMmNfZWRpZCwgMHhmYSk7Ci0Jc3RhdGUtPmkyY19oZG1pID0gYWR2Nzg0Ml9kdW1teV9jbGllbnQoc2QsIHBkYXRhLT5pMmNfaGRtaSwgMHhmYik7Ci0Jc3RhdGUtPmkyY19jcCA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCBwZGF0YS0+aTJjX2NwLCAweGZkKTsKLQlzdGF0ZS0+aTJjX3ZkcCA9IGFkdjc4NDJfZHVtbXlfY2xpZW50KHNkLCBwZGF0YS0+aTJjX3ZkcCwgMHhmZSk7Ci0JaWYgKCFzdGF0ZS0+aTJjX2F2bGluayB8fCAhc3RhdGUtPmkyY19jZWMgfHwgIXN0YXRlLT5pMmNfaW5mb2ZyYW1lIHx8Ci0JICAgICFzdGF0ZS0+aTJjX3NkcF9pbyB8fCAhc3RhdGUtPmkyY19zZHAgfHwgIXN0YXRlLT5pMmNfYWZlIHx8Ci0JICAgICFzdGF0ZS0+aTJjX3JlcGVhdGVyIHx8ICFzdGF0ZS0+aTJjX2VkaWQgfHwgIXN0YXRlLT5pMmNfaGRtaSB8fAotCSAgICAhc3RhdGUtPmkyY19jcCB8fCAhc3RhdGUtPmkyY192ZHApIHsKKwlpZiAoYWR2Nzg0Ml9yZWdpc3Rlcl9jbGllbnRzKHNkKSA8IDApIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJdjRsMl9lcnIoc2QsICJmYWlsZWQgdG8gY3JlYXRlIGFsbCBpMmMgY2xpZW50c1xuIik7CiAJCWdvdG8gZXJyX2kyYzsKQEAgLTI4NzksNyArMzA1Nyw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfd29ya19xdWV1ZXM7CiAKLQllcnIgPSBhZHY3ODQyX2NvcmVfaW5pdChzZCwgcGRhdGEpOworCWVyciA9IGFkdjc4NDJfY29yZV9pbml0KHNkKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9lbnRpdHk7CiAKQEAgLTI4OTMsNyArMzA3MSw3IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmc3RhdGUtPmRlbGF5ZWRfd29ya19lbmFibGVfaG90cGx1Zyk7CiAJZGVzdHJveV93b3JrcXVldWUoc3RhdGUtPndvcmtfcXVldWVzKTsKIGVycl9pMmM6Ci0JYWR2Nzg0Ml91bnJlZ2lzdGVyX2NsaWVudHMoc3RhdGUpOworCWFkdjc4NDJfdW5yZWdpc3Rlcl9jbGllbnRzKHNkKTsKIGVycl9oZGw6CiAJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZShoZGwpOwogCXJldHVybiBlcnI7CkBAIC0yOTEyLDcgKzMwOTAsNyBAQAogCWRlc3Ryb3lfd29ya3F1ZXVlKHN0YXRlLT53b3JrX3F1ZXVlcyk7CiAJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOwogCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzZC0+ZW50aXR5KTsKLQlhZHY3ODQyX3VucmVnaXN0ZXJfY2xpZW50cyh0b19zdGF0ZShzZCkpOworCWFkdjc4NDJfdW5yZWdpc3Rlcl9jbGllbnRzKHNkKTsKIAl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKHNkLT5jdHJsX2hhbmRsZXIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvbG0zNTYwLmMgYi9kcml2ZXJzL21lZGlhL2kyYy9sbTM1NjAuYwppbmRleCAzMzE3YTlhLi5kOThjYTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9sbTM1NjAuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9sbTM1NjAuYwpAQCAtMTcyLDI4ICsxNzIsMjggQEAKIHN0YXRpYyBpbnQgbG0zNTYwX2dldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGVudW0gbG0zNTYwX2xlZF9pZCBsZWRfbm8pCiB7CiAJc3RydWN0IGxtMzU2MF9mbGFzaCAqZmxhc2ggPSB0b19sbTM1NjBfZmxhc2goY3RybCwgbGVkX25vKTsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZmbGFzaC0+bG9jayk7CiAKIAlpZiAoY3RybC0+aWQgPT0gVjRMMl9DSURfRkxBU0hfRkFVTFQpIHsKLQkJaW50IHJ2YWw7CiAJCXMzMiBmYXVsdCA9IDA7CiAJCXVuc2lnbmVkIGludCByZWdfdmFsOwogCQlydmFsID0gcmVnbWFwX3JlYWQoZmxhc2gtPnJlZ21hcCwgUkVHX0ZMQUcsICZyZWdfdmFsKTsKIAkJaWYgKHJ2YWwgPCAwKQotCQkJcmV0dXJuIHJ2YWw7Ci0JCWlmIChydmFsICYgRkFVTFRfU0hPUlRfQ0lSQ1VJVCkKKwkJCWdvdG8gb3V0OworCQlpZiAocmVnX3ZhbCAmIEZBVUxUX1NIT1JUX0NJUkNVSVQpCiAJCQlmYXVsdCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQ7Ci0JCWlmIChydmFsICYgRkFVTFRfT1ZFUlRFTVApCisJCWlmIChyZWdfdmFsICYgRkFVTFRfT1ZFUlRFTVApCiAJCQlmYXVsdCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkU7Ci0JCWlmIChydmFsICYgRkFVTFRfVElNRU9VVCkKKwkJaWYgKHJlZ192YWwgJiBGQVVMVF9USU1FT1VUKQogCQkJZmF1bHQgfD0gVjRMMl9GTEFTSF9GQVVMVF9USU1FT1VUOwogCQljdHJsLT5jdXIudmFsID0gZmF1bHQ7Ci0JCXJldHVybiAwOwogCX0KIAorb3V0OgogCW11dGV4X3VubG9jaygmZmxhc2gtPmxvY2spOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiBydmFsOwogfQogCiBzdGF0aWMgaW50IGxtMzU2MF9zZXRfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCBlbnVtIGxtMzU2MF9sZWRfaWQgbGVkX25vKQpAQCAtMjE5LDE1ICsyMTksMTkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRToKLQkJaWYgKGZsYXNoLT5sZWRfbW9kZSAhPSBWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNIKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGZsYXNoLT5sZWRfbW9kZSAhPSBWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNIKSB7CisJCQlydmFsID0gLUVCVVNZOworCQkJZ290byBlcnJfb3V0OworCQl9CiAJCWZsYXNoLT5sZWRfbW9kZSA9IFY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0g7CiAJCXJ2YWwgPSBsbTM1NjBfbW9kZV9jdHJsKGZsYXNoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QOgotCQlpZiAoZmxhc2gtPmxlZF9tb2RlICE9IFY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0gpCi0JCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoZmxhc2gtPmxlZF9tb2RlICE9IFY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0gpIHsKKwkJCXJ2YWwgPSAtRUJVU1k7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KIAkJZmxhc2gtPmxlZF9tb2RlID0gVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FOwogCQlydmFsID0gbG0zNTYwX21vZGVfY3RybChmbGFzaCk7CiAJCWJyZWFrOwpAQCAtMjQ3LDggKzI1MSw4IEBACiAJCWJyZWFrOwogCX0KIAotCW11dGV4X3VubG9jaygmZmxhc2gtPmxvY2spOwogZXJyX291dDoKKwltdXRleF91bmxvY2soJmZsYXNoLT5sb2NrKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtNDQ0LDE0ICs0NDgsMTQgQEAKIAlpZiAocnZhbCA8IDApCiAJCXJldHVybiBydmFsOwogCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZmxhc2gpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbG0zNTYwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IGxtMzU2MF9mbGFzaCAqZmxhc2ggPSBjb250YWluZXJfb2Yoc3ViZGV2LCBzdHJ1Y3QgbG0zNTYwX2ZsYXNoLAotCQkJCQkJICBzdWJkZXZfbGVkW0xNMzU2MF9MRURfTUFYXSk7CisJc3RydWN0IGxtMzU2MF9mbGFzaCAqZmxhc2ggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWZvciAoaSA9IExNMzU2MF9MRUQwOyBpIDwgTE0zNTYwX0xFRF9NQVg7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvbXQ5bTAzMi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5bTAzMi5jCmluZGV4IDg0NmIxNWYuLjg1ZWMzYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL210OW0wMzIuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9tdDltMDMyLmMKQEAgLTQ1OSwxMyArNDU5LDE1IEBACiAJCQkgIE1UOU0wMzJfQ09MVU1OX1NUQVJUX01BWCk7CiAJcmVjdC50b3AgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LnRvcCwgMiksIE1UOU0wMzJfUk9XX1NUQVJUX01JTiwKIAkJCSBNVDlNMDMyX1JPV19TVEFSVF9NQVgpOwotCXJlY3Qud2lkdGggPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwgTVQ5TTAzMl9DT0xVTU5fU0laRV9NSU4sCi0JCQkgICBNVDlNMDMyX0NPTFVNTl9TSVpFX01BWCk7Ci0JcmVjdC5oZWlnaHQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmhlaWdodCwgMiksIE1UOU0wMzJfUk9XX1NJWkVfTUlOLAotCQkJICAgIE1UOU0wMzJfUk9XX1NJWkVfTUFYKTsKKwlyZWN0LndpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLAorCQkJICAgICBNVDlNMDMyX0NPTFVNTl9TSVpFX01JTiwgTVQ5TTAzMl9DT0xVTU5fU0laRV9NQVgpOworCXJlY3QuaGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGNyb3AtPnJlY3QuaGVpZ2h0LCAyKSwKKwkJCSAgICAgIE1UOU0wMzJfUk9XX1NJWkVfTUlOLCBNVDlNMDMyX1JPV19TSVpFX01BWCk7CiAKLQlyZWN0LndpZHRoID0gbWluKHJlY3Qud2lkdGgsIE1UOU0wMzJfUElYRUxfQVJSQVlfV0lEVEggLSByZWN0LmxlZnQpOwotCXJlY3QuaGVpZ2h0ID0gbWluKHJlY3QuaGVpZ2h0LCBNVDlNMDMyX1BJWEVMX0FSUkFZX0hFSUdIVCAtIHJlY3QudG9wKTsKKwlyZWN0LndpZHRoID0gbWluX3QodW5zaWduZWQgaW50LCByZWN0LndpZHRoLAorCQkJICAgTVQ5TTAzMl9QSVhFTF9BUlJBWV9XSURUSCAtIHJlY3QubGVmdCk7CisJcmVjdC5oZWlnaHQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJlY3QuaGVpZ2h0LAorCQkJICAgIE1UOU0wMzJfUElYRUxfQVJSQVlfSEVJR0hUIC0gcmVjdC50b3ApOwogCiAJX19jcm9wID0gX19tdDltMDMyX2dldF9wYWRfY3JvcChzZW5zb3IsIGZoLCBjcm9wLT53aGljaCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYwppbmRleCAxYzIzMDNkLi5lNWRkZjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9tdDlwMDMxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5cDAzMS5jCkBAIC01MTksMTEgKzUxOSwxMyBAQAogCiAJLyogQ2xhbXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG8gYXZvaWQgZGl2aWRpbmcgYnkgemVyby4gKi8KIAl3aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC53aWR0aCwgMiksCi0JCQltYXgoX19jcm9wLT53aWR0aCAvIDcsIE1UOVAwMzFfV0lORE9XX1dJRFRIX01JTiksCisJCQltYXhfdCh1bnNpZ25lZCBpbnQsIF9fY3JvcC0+d2lkdGggLyA3LAorCQkJICAgICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUlOKSwKIAkJCV9fY3JvcC0+d2lkdGgpOwogCWhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC5oZWlnaHQsIDIpLAotCQkJbWF4KF9fY3JvcC0+aGVpZ2h0IC8gOCwgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX01JTiksCi0JCQlfX2Nyb3AtPmhlaWdodCk7CisJCQkgbWF4X3QodW5zaWduZWQgaW50LCBfX2Nyb3AtPmhlaWdodCAvIDgsCisJCQkgICAgICAgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX01JTiksCisJCQkgX19jcm9wLT5oZWlnaHQpOwogCiAJaHJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QoX19jcm9wLT53aWR0aCwgd2lkdGgpOwogCXZyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKF9fY3JvcC0+aGVpZ2h0LCBoZWlnaHQpOwpAQCAtNTY1LDE1ICs1NjcsMTcgQEAKIAkJCSAgTVQ5UDAzMV9DT0xVTU5fU1RBUlRfTUFYKTsKIAlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wLCAyKSwgTVQ5UDAzMV9ST1dfU1RBUlRfTUlOLAogCQkJIE1UOVAwMzFfUk9XX1NUQVJUX01BWCk7Ci0JcmVjdC53aWR0aCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLAotCQkJICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUlOLAotCQkJICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUFYKTsKLQlyZWN0LmhlaWdodCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QuaGVpZ2h0LCAyKSwKLQkJCSAgICBNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUlOLAotCQkJICAgIE1UOVAwMzFfV0lORE9XX0hFSUdIVF9NQVgpOworCXJlY3Qud2lkdGggPSBjbGFtcF90KHVuc2lnbmVkIGludCwgQUxJR04oY3JvcC0+cmVjdC53aWR0aCwgMiksCisJCQkgICAgIE1UOVAwMzFfV0lORE9XX1dJRFRIX01JTiwKKwkJCSAgICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUFYKTsKKwlyZWN0LmhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihjcm9wLT5yZWN0LmhlaWdodCwgMiksCisJCQkgICAgICBNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUlOLAorCQkJICAgICAgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX01BWCk7CiAKLQlyZWN0LndpZHRoID0gbWluKHJlY3Qud2lkdGgsIE1UOVAwMzFfUElYRUxfQVJSQVlfV0lEVEggLSByZWN0LmxlZnQpOwotCXJlY3QuaGVpZ2h0ID0gbWluKHJlY3QuaGVpZ2h0LCBNVDlQMDMxX1BJWEVMX0FSUkFZX0hFSUdIVCAtIHJlY3QudG9wKTsKKwlyZWN0LndpZHRoID0gbWluX3QodW5zaWduZWQgaW50LCByZWN0LndpZHRoLAorCQkJICAgTVQ5UDAzMV9QSVhFTF9BUlJBWV9XSURUSCAtIHJlY3QubGVmdCk7CisJcmVjdC5oZWlnaHQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJlY3QuaGVpZ2h0LAorCQkJICAgIE1UOVAwMzFfUElYRUxfQVJSQVlfSEVJR0hUIC0gcmVjdC50b3ApOwogCiAJX19jcm9wID0gX19tdDlwMDMxX2dldF9wYWRfY3JvcChtdDlwMDMxLCBmaCwgY3JvcC0+cGFkLCBjcm9wLT53aGljaCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL210OXQwMDEuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL210OXQwMDEuYwppbmRleCA3OTY0NjM0Li5kNDFjNzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9tdDl0MDAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5dDAwMS5jCkBAIC0yOTEsMTAgKzI5MSwxMiBAQAogCiAJLyogQ2xhbXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG8gYXZvaWQgZGl2aWRpbmcgYnkgemVyby4gKi8KIAl3aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC53aWR0aCwgMiksCi0JCQltYXgoX19jcm9wLT53aWR0aCAvIDgsIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NSU4gKyAxKSwKKwkJCW1heF90KHVuc2lnbmVkIGludCwgX19jcm9wLT53aWR0aCAvIDgsCisJCQkgICAgICBNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUlOICsgMSksCiAJCQlfX2Nyb3AtPndpZHRoKTsKIAloZWlnaHQgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgQUxJR04oZm9ybWF0LT5mb3JtYXQuaGVpZ2h0LCAyKSwKLQkJCSBtYXgoX19jcm9wLT5oZWlnaHQgLyA4LCBNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUlOICsgMSksCisJCQkgbWF4X3QodW5zaWduZWQgaW50LCBfX2Nyb3AtPmhlaWdodCAvIDgsCisJCQkgICAgICAgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX01JTiArIDEpLAogCQkJIF9fY3JvcC0+aGVpZ2h0KTsKIAogCWhyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKF9fY3JvcC0+d2lkdGgsIHdpZHRoKTsKQEAgLTMzOSwxNSArMzQxLDE3IEBACiAJcmVjdC50b3AgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LnRvcCwgMiksCiAJCQkgTVQ5VDAwMV9ST1dfU1RBUlRfTUlOLAogCQkJIE1UOVQwMDFfUk9XX1NUQVJUX01BWCk7Ci0JcmVjdC53aWR0aCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLAotCQkJICAgTVQ5VDAwMV9XSU5ET1dfV0lEVEhfTUlOICsgMSwKLQkJCSAgIE1UOVQwMDFfV0lORE9XX1dJRFRIX01BWCArIDEpOwotCXJlY3QuaGVpZ2h0ID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC5oZWlnaHQsIDIpLAotCQkJICAgIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NSU4gKyAxLAotCQkJICAgIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NQVggKyAxKTsKKwlyZWN0LndpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLAorCQkJICAgICBNVDlUMDAxX1dJTkRPV19XSURUSF9NSU4gKyAxLAorCQkJICAgICBNVDlUMDAxX1dJTkRPV19XSURUSF9NQVggKyAxKTsKKwlyZWN0LmhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihjcm9wLT5yZWN0LmhlaWdodCwgMiksCisJCQkgICAgICBNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUlOICsgMSwKKwkJCSAgICAgIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NQVggKyAxKTsKIAotCXJlY3Qud2lkdGggPSBtaW4ocmVjdC53aWR0aCwgTVQ5VDAwMV9QSVhFTF9BUlJBWV9XSURUSCAtIHJlY3QubGVmdCk7Ci0JcmVjdC5oZWlnaHQgPSBtaW4ocmVjdC5oZWlnaHQsIE1UOVQwMDFfUElYRUxfQVJSQVlfSEVJR0hUIC0gcmVjdC50b3ApOworCXJlY3Qud2lkdGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJlY3Qud2lkdGgsCisJCQkgICBNVDlUMDAxX1BJWEVMX0FSUkFZX1dJRFRIIC0gcmVjdC5sZWZ0KTsKKwlyZWN0LmhlaWdodCA9IG1pbl90KHVuc2lnbmVkIGludCwgcmVjdC5oZWlnaHQsCisJCQkgICAgTVQ5VDAwMV9QSVhFTF9BUlJBWV9IRUlHSFQgLSByZWN0LnRvcCk7CiAKIAlfX2Nyb3AgPSBfX210OXQwMDFfZ2V0X3BhZF9jcm9wKG10OXQwMDEsIGZoLCBjcm9wLT5wYWQsIGNyb3AtPndoaWNoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvbXQ5djAzMi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5djAzMi5jCmluZGV4IDJjNTBlZmYuLjM2YzUwNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL210OXYwMzIuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9tdDl2MDMyLmMKQEAgLTI3LDE0ICsyNywxNiBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KIAotI2RlZmluZSBNVDlWMDMyX1BJWEVMX0FSUkFZX0hFSUdIVAkJCTQ5MgotI2RlZmluZSBNVDlWMDMyX1BJWEVMX0FSUkFZX1dJRFRICQkJNzgyCisvKiBUaGUgZmlyc3QgZm91ciByb3dzIGFyZSBibGFjayByb3dzLiBUaGUgYWN0aXZlIGFyZWEgc3BhbnMgNzUzeDQ4MSBwaXhlbHMuICovCisjZGVmaW5lIE1UOVYwMzJfUElYRUxfQVJSQVlfSEVJR0hUCQkJNDg1CisjZGVmaW5lIE1UOVYwMzJfUElYRUxfQVJSQVlfV0lEVEgJCQk3NTMKIAogI2RlZmluZSBNVDlWMDMyX1NZU0NMS19GUkVRX0RFRgkJCQkyNjYwMDAwMAogCiAjZGVmaW5lIE1UOVYwMzJfQ0hJUF9WRVJTSU9OCQkJCTB4MDAKICNkZWZpbmUJCU1UOVYwMzJfQ0hJUF9JRF9SRVYxCQkJMHgxMzExCiAjZGVmaW5lCQlNVDlWMDMyX0NISVBfSURfUkVWMwkJCTB4MTMxMworI2RlZmluZQkJTVQ5VjAzNF9DSElQX0lEX1JFVjEJCQkwWDEzMjQKICNkZWZpbmUgTVQ5VjAzMl9DT0xVTU5fU1RBUlQJCQkJMHgwMQogI2RlZmluZQkJTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUlOCQkxCiAjZGVmaW5lCQlNVDlWMDMyX0NPTFVNTl9TVEFSVF9ERUYJCTEKQEAgLTUzLDEyICs1NSwxNSBAQAogI2RlZmluZQkJTVQ5VjAzMl9XSU5ET1dfV0lEVEhfTUFYCQk3NTIKICNkZWZpbmUgTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HCQkJMHgwNQogI2RlZmluZQkJTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX01JTgkJNDMKKyNkZWZpbmUJCU1UOVYwMzRfSE9SSVpPTlRBTF9CTEFOS0lOR19NSU4JCTYxCiAjZGVmaW5lCQlNVDlWMDMyX0hPUklaT05UQUxfQkxBTktJTkdfREVGCQk5NAogI2RlZmluZQkJTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX01BWAkJMTAyMwogI2RlZmluZSBNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HCQkJMHgwNgogI2RlZmluZQkJTVQ5VjAzMl9WRVJUSUNBTF9CTEFOS0lOR19NSU4JCTQKKyNkZWZpbmUJCU1UOVYwMzRfVkVSVElDQUxfQkxBTktJTkdfTUlOCQkyCiAjZGVmaW5lCQlNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HX0RFRgkJNDUKICNkZWZpbmUJCU1UOVYwMzJfVkVSVElDQUxfQkxBTktJTkdfTUFYCQkzMDAwCisjZGVmaW5lCQlNVDlWMDM0X1ZFUlRJQ0FMX0JMQU5LSU5HX01BWAkJMzIyODgKICNkZWZpbmUgTVQ5VjAzMl9DSElQX0NPTlRST0wJCQkJMHgwNwogI2RlZmluZQkJTVQ5VjAzMl9DSElQX0NPTlRST0xfTUFTVEVSX01PREUJKDEgPDwgMykKICNkZWZpbmUJCU1UOVYwMzJfQ0hJUF9DT05UUk9MX0RPVVRfRU5BQkxFCSgxIDw8IDcpCkBAIC02OCw4ICs3MywxMCBAQAogI2RlZmluZSBNVDlWMDMyX1NIVVRURVJfV0lEVEhfQ09OVFJPTAkJCTB4MGEKICNkZWZpbmUgTVQ5VjAzMl9UT1RBTF9TSFVUVEVSX1dJRFRICQkJMHgwYgogI2RlZmluZQkJTVQ5VjAzMl9UT1RBTF9TSFVUVEVSX1dJRFRIX01JTgkJMQorI2RlZmluZQkJTVQ5VjAzNF9UT1RBTF9TSFVUVEVSX1dJRFRIX01JTgkJMAogI2RlZmluZQkJTVQ5VjAzMl9UT1RBTF9TSFVUVEVSX1dJRFRIX0RFRgkJNDgwCiAjZGVmaW5lCQlNVDlWMDMyX1RPVEFMX1NIVVRURVJfV0lEVEhfTUFYCQkzMjc2NworI2RlZmluZQkJTVQ5VjAzNF9UT1RBTF9TSFVUVEVSX1dJRFRIX01BWAkJMzI3NjUKICNkZWZpbmUgTVQ5VjAzMl9SRVNFVAkJCQkJMHgwYwogI2RlZmluZSBNVDlWMDMyX1JFQURfTU9ERQkJCQkweDBkCiAjZGVmaW5lCQlNVDlWMDMyX1JFQURfTU9ERV9ST1dfQklOX01BU0sJCSgzIDw8IDApCkBAIC04MSw2ICs4OCw4IEBACiAjZGVmaW5lCQlNVDlWMDMyX1JFQURfTU9ERV9EQVJLX0NPTFVNTlMJCSgxIDw8IDYpCiAjZGVmaW5lCQlNVDlWMDMyX1JFQURfTU9ERV9EQVJLX1JPV1MJCSgxIDw8IDcpCiAjZGVmaW5lIE1UOVYwMzJfUElYRUxfT1BFUkFUSU9OX01PREUJCQkweDBmCisjZGVmaW5lCQlNVDlWMDM0X1BJWEVMX09QRVJBVElPTl9NT0RFX0hEUgkoMSA8PCAwKQorI2RlZmluZQkJTVQ5VjAzNF9QSVhFTF9PUEVSQVRJT05fTU9ERV9DT0xPUgkoMSA8PCAxKQogI2RlZmluZQkJTVQ5VjAzMl9QSVhFTF9PUEVSQVRJT05fTU9ERV9DT0xPUgkoMSA8PCAyKQogI2RlZmluZQkJTVQ5VjAzMl9QSVhFTF9PUEVSQVRJT05fTU9ERV9IRFIJKDEgPDwgNikKICNkZWZpbmUgTVQ5VjAzMl9BTkFMT0dfR0FJTgkJCQkweDM1CkBAIC05Niw5ICsxMDUsMTIgQEAKICNkZWZpbmUJCU1UOVYwMzJfREFSS19BVkdfSElHSF9USFJFU0hfTUFTSwkoMjU1IDw8IDgpCiAjZGVmaW5lCQlNVDlWMDMyX0RBUktfQVZHX0hJR0hfVEhSRVNIX1NISUZUCTgKICNkZWZpbmUgTVQ5VjAzMl9ST1dfTk9JU0VfQ09SUl9DT05UUk9MCQkJMHg3MAorI2RlZmluZQkJTVQ5VjAzNF9ST1dfTk9JU0VfQ09SUl9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lCQlNVDlWMDM0X1JPV19OT0lTRV9DT1JSX1VTRV9CTEtfQVZHCSgxIDw8IDEpCiAjZGVmaW5lCQlNVDlWMDMyX1JPV19OT0lTRV9DT1JSX0VOQUJMRQkJKDEgPDwgNSkKICNkZWZpbmUJCU1UOVYwMzJfUk9XX05PSVNFX0NPUlJfVVNFX0JMS19BVkcJKDEgPDwgNykKICNkZWZpbmUgTVQ5VjAzMl9QSVhFTF9DTE9DSwkJCQkweDc0CisjZGVmaW5lIE1UOVYwMzRfUElYRUxfQ0xPQ0sJCQkJMHg3MgogI2RlZmluZQkJTVQ5VjAzMl9QSVhFTF9DTE9DS19JTlZfTElORQkJKDEgPDwgMCkKICNkZWZpbmUJCU1UOVYwMzJfUElYRUxfQ0xPQ0tfSU5WX0ZSQU1FCQkoMSA8PCAxKQogI2RlZmluZQkJTVQ5VjAzMl9QSVhFTF9DTE9DS19YT1JfTElORQkJKDEgPDwgMikKQEAgLTEyMCwxMiArMTMyLDg4IEBACiAjZGVmaW5lCQlNVDlWMDMyX0FHQ19FTkFCTEUJCQkoMSA8PCAxKQogI2RlZmluZSBNVDlWMDMyX1RIRVJNQUxfSU5GTwkJCQkweGMxCiAKK2VudW0gbXQ5djAzMl9tb2RlbCB7CisJTVQ5VjAzMl9NT0RFTF9WMDMyX0NPTE9SLAorCU1UOVYwMzJfTU9ERUxfVjAzMl9NT05PLAorCU1UOVYwMzJfTU9ERUxfVjAzNF9DT0xPUiwKKwlNVDlWMDMyX01PREVMX1YwMzRfTU9OTywKK307CisKK3N0cnVjdCBtdDl2MDMyX21vZGVsX3ZlcnNpb24geworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgbXQ5djAzMl9tb2RlbF9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgbWluX3Jvd190aW1lOworCXVuc2lnbmVkIGludCBtaW5faGJsYW5rOworCXVuc2lnbmVkIGludCBtaW5fdmJsYW5rOworCXVuc2lnbmVkIGludCBtYXhfdmJsYW5rOworCXVuc2lnbmVkIGludCBtaW5fc2h1dHRlcjsKKwl1bnNpZ25lZCBpbnQgbWF4X3NodXR0ZXI7CisJdW5zaWduZWQgaW50IHBjbGtfcmVnOworfTsKKworc3RydWN0IG10OXYwMzJfbW9kZWxfaW5mbyB7CisJY29uc3Qgc3RydWN0IG10OXYwMzJfbW9kZWxfZGF0YSAqZGF0YTsKKwlib29sIGNvbG9yOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdDl2MDMyX21vZGVsX3ZlcnNpb24gbXQ5djAzMl92ZXJzaW9uc1tdID0geworCXsgTVQ5VjAzMl9DSElQX0lEX1JFVjEsICJNVDlWMDMyIHJldjEvMiIgfSwKKwl7IE1UOVYwMzJfQ0hJUF9JRF9SRVYzLCAiTVQ5VjAzMiByZXYzIiB9LAorCXsgTVQ5VjAzNF9DSElQX0lEX1JFVjEsICJNVDlWMDM0IHJldjEiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG10OXYwMzJfbW9kZWxfZGF0YSBtdDl2MDMyX21vZGVsX2RhdGFbXSA9IHsKKwl7CisJCS8qIE1UOVYwMzIgcmV2aXNpb25zIDEvMi8zICovCisJCS5taW5fcm93X3RpbWUgPSA2NjAsCisJCS5taW5faGJsYW5rID0gTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX01JTiwKKwkJLm1pbl92YmxhbmsgPSBNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HX01JTiwKKwkJLm1heF92YmxhbmsgPSBNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HX01BWCwKKwkJLm1pbl9zaHV0dGVyID0gTVQ5VjAzMl9UT1RBTF9TSFVUVEVSX1dJRFRIX01JTiwKKwkJLm1heF9zaHV0dGVyID0gTVQ5VjAzMl9UT1RBTF9TSFVUVEVSX1dJRFRIX01BWCwKKwkJLnBjbGtfcmVnID0gTVQ5VjAzMl9QSVhFTF9DTE9DSywKKwl9LCB7CisJCS8qIE1UOVYwMzQgKi8KKwkJLm1pbl9yb3dfdGltZSA9IDY5MCwKKwkJLm1pbl9oYmxhbmsgPSBNVDlWMDM0X0hPUklaT05UQUxfQkxBTktJTkdfTUlOLAorCQkubWluX3ZibGFuayA9IE1UOVYwMzRfVkVSVElDQUxfQkxBTktJTkdfTUlOLAorCQkubWF4X3ZibGFuayA9IE1UOVYwMzRfVkVSVElDQUxfQkxBTktJTkdfTUFYLAorCQkubWluX3NodXR0ZXIgPSBNVDlWMDM0X1RPVEFMX1NIVVRURVJfV0lEVEhfTUlOLAorCQkubWF4X3NodXR0ZXIgPSBNVDlWMDM0X1RPVEFMX1NIVVRURVJfV0lEVEhfTUFYLAorCQkucGNsa19yZWcgPSBNVDlWMDM0X1BJWEVMX0NMT0NLLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG10OXYwMzJfbW9kZWxfaW5mbyBtdDl2MDMyX21vZGVsc1tdID0geworCVtNVDlWMDMyX01PREVMX1YwMzJfQ09MT1JdID0geworCQkuZGF0YSA9ICZtdDl2MDMyX21vZGVsX2RhdGFbMF0sCisJCS5jb2xvciA9IHRydWUsCisJfSwKKwlbTVQ5VjAzMl9NT0RFTF9WMDMyX01PTk9dID0geworCQkuZGF0YSA9ICZtdDl2MDMyX21vZGVsX2RhdGFbMF0sCisJCS5jb2xvciA9IGZhbHNlLAorCX0sCisJW01UOVYwMzJfTU9ERUxfVjAzNF9DT0xPUl0gPSB7CisJCS5kYXRhID0gJm10OXYwMzJfbW9kZWxfZGF0YVsxXSwKKwkJLmNvbG9yID0gdHJ1ZSwKKwl9LAorCVtNVDlWMDMyX01PREVMX1YwMzRfTU9OT10gPSB7CisJCS5kYXRhID0gJm10OXYwMzJfbW9kZWxfZGF0YVsxXSwKKwkJLmNvbG9yID0gZmFsc2UsCisJfSwKK307CisKIHN0cnVjdCBtdDl2MDMyIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OwogCXN0cnVjdCBtZWRpYV9wYWQgcGFkOwogCiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBmb3JtYXQ7CiAJc3RydWN0IHY0bDJfcmVjdCBjcm9wOworCXVuc2lnbmVkIGludCBocmF0aW87CisJdW5zaWduZWQgaW50IHZyYXRpbzsKIAogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKIAlzdHJ1Y3QgewpAQCAtMTM5LDYgKzIyNyw4IEBACiAJc3RydWN0IGNsayAqY2xrOwogCiAJc3RydWN0IG10OXYwMzJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJY29uc3Qgc3RydWN0IG10OXYwMzJfbW9kZWxfaW5mbyAqbW9kZWw7CisJY29uc3Qgc3RydWN0IG10OXYwMzJfbW9kZWxfdmVyc2lvbiAqdmVyc2lvbjsKIAogCXUzMiBzeXNjbGs7CiAJdTE2IGNoaXBfY29udHJvbDsKQEAgLTIxMCwxMyArMzAwLDE4IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXYwMzItPnN1YmRldik7CiAJc3RydWN0IHY0bDJfcmVjdCAqY3JvcCA9ICZtdDl2MDMyLT5jcm9wOworCXVuc2lnbmVkIGludCBtaW5faGJsYW5rID0gbXQ5djAzMi0+bW9kZWwtPmRhdGEtPm1pbl9oYmxhbms7CisJdW5zaWduZWQgaW50IGhibGFuazsKIAotCXJldHVybiBtdDl2MDMyX3dyaXRlKGNsaWVudCwgTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HLAotCQkJICAgICBtYXhfdChzMzIsIG10OXYwMzItPmhibGFuaywgNjYwIC0gY3JvcC0+d2lkdGgpKTsKKwlpZiAobXQ5djAzMi0+dmVyc2lvbi0+dmVyc2lvbiA9PSBNVDlWMDM0X0NISVBfSURfUkVWMSkKKwkJbWluX2hibGFuayArPSAobXQ5djAzMi0+aHJhdGlvIC0gMSkgKiAxMDsKKwltaW5faGJsYW5rID0gbWF4X3QodW5zaWduZWQgaW50LCAoaW50KW10OXYwMzItPm1vZGVsLT5kYXRhLT5taW5fcm93X3RpbWUgLSBjcm9wLT53aWR0aCwKKwkJCSAgIChpbnQpbWluX2hibGFuayk7CisJaGJsYW5rID0gbWF4X3QodW5zaWduZWQgaW50LCBtdDl2MDMyLT5oYmxhbmssIG1pbl9oYmxhbmspOworCisJcmV0dXJuIG10OXYwMzJfd3JpdGUoY2xpZW50LCBNVDlWMDMyX0hPUklaT05UQUxfQkxBTktJTkcsIGhibGFuayk7CiB9CiAKLSNkZWZpbmUgRVhUX0NMSwkJMjUwMDAwMDAKLQogc3RhdGljIGludCBtdDl2MDMyX3Bvd2VyX29uKHN0cnVjdCBtdDl2MDMyICptdDl2MDMyKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDl2MDMyLT5zdWJkZXYpOwpAQCAtMjU5LDcgKzM1NCw3IEBACiAKIAkvKiBDb25maWd1cmUgdGhlIHBpeGVsIGNsb2NrIHBvbGFyaXR5ICovCiAJaWYgKG10OXYwMzItPnBkYXRhICYmIG10OXYwMzItPnBkYXRhLT5jbGtfcG9sKSB7Ci0JCXJldCA9IG10OXYwMzJfd3JpdGUoY2xpZW50LCBNVDlWMDMyX1BJWEVMX0NMT0NLLAorCQlyZXQgPSBtdDl2MDMyX3dyaXRlKGNsaWVudCwgbXQ5djAzMi0+bW9kZWwtPmRhdGEtPnBjbGtfcmVnLAogCQkJCU1UOVYwMzJfUElYRUxfQ0xPQ0tfSU5WX1BYTF9DTEspOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC0zMTIsMjIgKzQwNywyMCBAQAogCQkgICAgICAgfCBNVDlWMDMyX0NISVBfQ09OVFJPTF9TRVFVRU5USUFMOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CiAJc3RydWN0IG10OXYwMzIgKm10OXYwMzIgPSB0b19tdDl2MDMyKHN1YmRldik7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0ID0gJm10OXYwMzItPmZvcm1hdDsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wID0gJm10OXYwMzItPmNyb3A7Ci0JdW5zaWduZWQgaW50IGhyYXRpbzsKLQl1bnNpZ25lZCBpbnQgdnJhdGlvOworCXVuc2lnbmVkIGludCBoYmluOworCXVuc2lnbmVkIGludCB2YmluOwogCWludCByZXQ7CiAKIAlpZiAoIWVuYWJsZSkKIAkJcmV0dXJuIG10OXYwMzJfc2V0X2NoaXBfY29udHJvbChtdDl2MDMyLCBtb2RlLCAwKTsKIAogCS8qIENvbmZpZ3VyZSB0aGUgd2luZG93IHNpemUgYW5kIHJvdy9jb2x1bW4gYmluICovCi0JaHJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QoY3JvcC0+d2lkdGgsIGZvcm1hdC0+d2lkdGgpOwotCXZyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKGNyb3AtPmhlaWdodCwgZm9ybWF0LT5oZWlnaHQpOwotCisJaGJpbiA9IGZscyhtdDl2MDMyLT5ocmF0aW8pIC0gMTsKKwl2YmluID0gZmxzKG10OXYwMzItPnZyYXRpbykgLSAxOwogCXJldCA9IG10OXYwMzJfd3JpdGUoY2xpZW50LCBNVDlWMDMyX1JFQURfTU9ERSwKLQkJICAgIChocmF0aW8gLSAxKSA8PCBNVDlWMDMyX1JFQURfTU9ERV9ST1dfQklOX1NISUZUIHwKLQkJICAgICh2cmF0aW8gLSAxKSA8PCBNVDlWMDMyX1JFQURfTU9ERV9DT0xVTU5fQklOX1NISUZUKTsKKwkJCSAgICBoYmluIDw8IE1UOVYwMzJfUkVBRF9NT0RFX0NPTFVNTl9CSU5fU0hJRlQgfAorCQkJICAgIHZiaW4gPDwgTVQ5VjAzMl9SRUFEX01PREVfUk9XX0JJTl9TSElGVCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTM3MCwxMiArNDYzLDEyIEBACiAJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKIAkJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCiB7Ci0JaWYgKGZzZS0+aW5kZXggPj0gOCB8fCBmc2UtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTApCisJaWYgKGZzZS0+aW5kZXggPj0gMyB8fCBmc2UtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZnNlLT5taW5fd2lkdGggPSBNVDlWMDMyX1dJTkRPV19XSURUSF9ERUYgLyBmc2UtPmluZGV4OworCWZzZS0+bWluX3dpZHRoID0gTVQ5VjAzMl9XSU5ET1dfV0lEVEhfREVGIC8gKDEgPDwgZnNlLT5pbmRleCk7CiAJZnNlLT5tYXhfd2lkdGggPSBmc2UtPm1pbl93aWR0aDsKLQlmc2UtPm1pbl9oZWlnaHQgPSBNVDlWMDMyX1dJTkRPV19IRUlHSFRfREVGIC8gZnNlLT5pbmRleDsKKwlmc2UtPm1pbl9oZWlnaHQgPSBNVDlWMDMyX1dJTkRPV19IRUlHSFRfREVGIC8gKDEgPDwgZnNlLT5pbmRleCk7CiAJZnNlLT5tYXhfaGVpZ2h0ID0gZnNlLT5taW5faGVpZ2h0OwogCiAJcmV0dXJuIDA7CkBAIC0zOTIsMTggKzQ4NSwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtdDl2MDMyX2NvbmZpZ3VyZV9waXhlbF9yYXRlKHN0cnVjdCBtdDl2MDMyICptdDl2MDMyLAotCQkJCQkgdW5zaWduZWQgaW50IGhyYXRpbykKK3N0YXRpYyB2b2lkIG10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUoc3RydWN0IG10OXYwMzIgKm10OXYwMzIpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXYwMzItPnN1YmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IHY0bDJfY3RybF9zX2N0cmxfaW50NjQobXQ5djAzMi0+cGl4ZWxfcmF0ZSwKLQkJCQkgICAgIG10OXYwMzItPnN5c2NsayAvIGhyYXRpbyk7CisJCQkJICAgICBtdDl2MDMyLT5zeXNjbGsgLyBtdDl2MDMyLT5ocmF0aW8pOwogCWlmIChyZXQgPCAwKQogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gc2V0IHBpeGVsIHJhdGUgKCVkKVxuIiwgcmV0KTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBtdDl2MDMyX2NhbGNfcmF0aW8odW5zaWduZWQgaW50IGlucHV0LCB1bnNpZ25lZCBpbnQgb3V0cHV0KQoreworCS8qIENvbXB1dGUgdGhlIHBvd2VyLW9mLXR3byBiaW5uaW5nIGZhY3RvciBjbG9zZXN0IHRvIHRoZSBpbnB1dCBzaXplIHRvCisJICogb3V0cHV0IHNpemUgcmF0aW8uIEdpdmVuIHRoYXQgdGhlIG91dHB1dCBzaXplIGlzIGJvdW5kZWQgYnkgaW5wdXQvNAorCSAqIGFuZCBpbnB1dCwgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGFuIGluZWZmZWN0aXZlIGx1eHVyeS4KKwkgKi8KKwlpZiAob3V0cHV0ICogMyA+IGlucHV0ICogMikKKwkJcmV0dXJuIDE7CisJaWYgKG91dHB1dCAqIDMgPiBpbnB1dCkKKwkJcmV0dXJuIDI7CisJcmV0dXJuIDQ7Cit9CisKIHN0YXRpYyBpbnQgbXQ5djAzMl9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAogCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZvcm1hdCkKQEAgLTQyMCwyMiArNTI1LDI4IEBACiAJCQkJCWZvcm1hdC0+d2hpY2gpOwogCiAJLyogQ2xhbXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG8gYXZvaWQgZGl2aWRpbmcgYnkgemVyby4gKi8KLQl3aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC53aWR0aCwgMiksCi0JCQltYXgoX19jcm9wLT53aWR0aCAvIDgsIE1UOVYwMzJfV0lORE9XX1dJRFRIX01JTiksCi0JCQlfX2Nyb3AtPndpZHRoKTsKLQloZWlnaHQgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgQUxJR04oZm9ybWF0LT5mb3JtYXQuaGVpZ2h0LCAyKSwKLQkJCSBtYXgoX19jcm9wLT5oZWlnaHQgLyA4LCBNVDlWMDMyX1dJTkRPV19IRUlHSFRfTUlOKSwKLQkJCSBfX2Nyb3AtPmhlaWdodCk7CisJd2lkdGggPSBjbGFtcChBTElHTihmb3JtYXQtPmZvcm1hdC53aWR0aCwgMiksCisJCSAgICAgIG1heF90KHVuc2lnbmVkIGludCwgX19jcm9wLT53aWR0aCAvIDQsCisJCQkgICAgTVQ5VjAzMl9XSU5ET1dfV0lEVEhfTUlOKSwKKwkJICAgICAgX19jcm9wLT53aWR0aCk7CisJaGVpZ2h0ID0gY2xhbXAoQUxJR04oZm9ybWF0LT5mb3JtYXQuaGVpZ2h0LCAyKSwKKwkJICAgICAgIG1heF90KHVuc2lnbmVkIGludCwgX19jcm9wLT5oZWlnaHQgLyA0LAorCQkJICAgICBNVDlWMDMyX1dJTkRPV19IRUlHSFRfTUlOKSwKKwkJICAgICAgIF9fY3JvcC0+aGVpZ2h0KTsKIAotCWhyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKF9fY3JvcC0+d2lkdGgsIHdpZHRoKTsKLQl2cmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChfX2Nyb3AtPmhlaWdodCwgaGVpZ2h0KTsKKwlocmF0aW8gPSBtdDl2MDMyX2NhbGNfcmF0aW8oX19jcm9wLT53aWR0aCwgd2lkdGgpOworCXZyYXRpbyA9IG10OXYwMzJfY2FsY19yYXRpbyhfX2Nyb3AtPmhlaWdodCwgaGVpZ2h0KTsKIAogCV9fZm9ybWF0ID0gX19tdDl2MDMyX2dldF9wYWRfZm9ybWF0KG10OXYwMzIsIGZoLCBmb3JtYXQtPnBhZCwKIAkJCQkJICAgIGZvcm1hdC0+d2hpY2gpOwogCV9fZm9ybWF0LT53aWR0aCA9IF9fY3JvcC0+d2lkdGggLyBocmF0aW87CiAJX19mb3JtYXQtPmhlaWdodCA9IF9fY3JvcC0+aGVpZ2h0IC8gdnJhdGlvOwotCWlmIChmb3JtYXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUpCi0JCW10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUobXQ5djAzMiwgaHJhdGlvKTsKKworCWlmIChmb3JtYXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUpIHsKKwkJbXQ5djAzMi0+aHJhdGlvID0gaHJhdGlvOworCQltdDl2MDMyLT52cmF0aW8gPSB2cmF0aW87CisJCW10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUobXQ5djAzMik7CisJfQogCiAJZm9ybWF0LT5mb3JtYXQgPSAqX19mb3JtYXQ7CiAKQEAgLTQ3MSwxNSArNTgyLDE3IEBACiAJcmVjdC50b3AgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LnRvcCArIDEsIDIpIC0gMSwKIAkJCSBNVDlWMDMyX1JPV19TVEFSVF9NSU4sCiAJCQkgTVQ5VjAzMl9ST1dfU1RBUlRfTUFYKTsKLQlyZWN0LndpZHRoID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC53aWR0aCwgMiksCi0JCQkgICBNVDlWMDMyX1dJTkRPV19XSURUSF9NSU4sCi0JCQkgICBNVDlWMDMyX1dJTkRPV19XSURUSF9NQVgpOwotCXJlY3QuaGVpZ2h0ID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC5oZWlnaHQsIDIpLAotCQkJICAgIE1UOVYwMzJfV0lORE9XX0hFSUdIVF9NSU4sCi0JCQkgICAgTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX01BWCk7CisJcmVjdC53aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwKKwkJCSAgICAgTVQ5VjAzMl9XSU5ET1dfV0lEVEhfTUlOLAorCQkJICAgICBNVDlWMDMyX1dJTkRPV19XSURUSF9NQVgpOworCXJlY3QuaGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGNyb3AtPnJlY3QuaGVpZ2h0LCAyKSwKKwkJCSAgICAgIE1UOVYwMzJfV0lORE9XX0hFSUdIVF9NSU4sCisJCQkgICAgICBNVDlWMDMyX1dJTkRPV19IRUlHSFRfTUFYKTsKIAotCXJlY3Qud2lkdGggPSBtaW4ocmVjdC53aWR0aCwgTVQ5VjAzMl9QSVhFTF9BUlJBWV9XSURUSCAtIHJlY3QubGVmdCk7Ci0JcmVjdC5oZWlnaHQgPSBtaW4ocmVjdC5oZWlnaHQsIE1UOVYwMzJfUElYRUxfQVJSQVlfSEVJR0hUIC0gcmVjdC50b3ApOworCXJlY3Qud2lkdGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkgICByZWN0LndpZHRoLCBNVDlWMDMyX1BJWEVMX0FSUkFZX1dJRFRIIC0gcmVjdC5sZWZ0KTsKKwlyZWN0LmhlaWdodCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCSAgICByZWN0LmhlaWdodCwgTVQ5VjAzMl9QSVhFTF9BUlJBWV9IRUlHSFQgLSByZWN0LnRvcCk7CiAKIAlfX2Nyb3AgPSBfX210OXYwMzJfZ2V0X3BhZF9jcm9wKG10OXYwMzIsIGZoLCBjcm9wLT5wYWQsIGNyb3AtPndoaWNoKTsKIApAQCAtNDkxLDggKzYwNCwxMSBAQAogCQkJCQkJICAgIGNyb3AtPndoaWNoKTsKIAkJX19mb3JtYXQtPndpZHRoID0gcmVjdC53aWR0aDsKIAkJX19mb3JtYXQtPmhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCQlpZiAoY3JvcC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRSkKLQkJCW10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUobXQ5djAzMiwgMSk7CisJCWlmIChjcm9wLT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFKSB7CisJCQltdDl2MDMyLT5ocmF0aW8gPSAxOworCQkJbXQ5djAzMi0+dnJhdGlvID0gMTsKKwkJCW10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUobXQ5djAzMik7CisJCX0KIAl9CiAKIAkqX19jcm9wID0gcmVjdDsKQEAgLTY0MSw3ICs3NTcsOCBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CiAJc3RydWN0IG10OXYwMzIgKm10OXYwMzIgPSB0b19tdDl2MDMyKHN1YmRldik7Ci0JczMyIGRhdGE7CisJdW5zaWduZWQgaW50IGk7CisJczMyIHZlcnNpb247CiAJaW50IHJldDsKIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlByb2JpbmcgTVQ5VjAzMiBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKQEAgLTY1NCwyNSArNzcxLDM4IEBACiAJfQogCiAJLyogUmVhZCBhbmQgY2hlY2sgdGhlIHNlbnNvciB2ZXJzaW9uICovCi0JZGF0YSA9IG10OXYwMzJfcmVhZChjbGllbnQsIE1UOVYwMzJfQ0hJUF9WRVJTSU9OKTsKLQlpZiAoZGF0YSAhPSBNVDlWMDMyX0NISVBfSURfUkVWMSAmJiBkYXRhICE9IE1UOVYwMzJfQ0hJUF9JRF9SRVYzKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5VjAzMiBub3QgZGV0ZWN0ZWQsIHdyb25nIHZlcnNpb24gIgotCQkJCSIweCUwNHhcbiIsIGRhdGEpOworCXZlcnNpb24gPSBtdDl2MDMyX3JlYWQoY2xpZW50LCBNVDlWMDMyX0NISVBfVkVSU0lPTik7CisJaWYgKHZlcnNpb24gPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHJlYWRpbmcgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5djAzMl92ZXJzaW9ucyk7ICsraSkgeworCQlpZiAobXQ5djAzMl92ZXJzaW9uc1tpXS52ZXJzaW9uID09IHZlcnNpb24pIHsKKwkJCW10OXYwMzItPnZlcnNpb24gPSAmbXQ5djAzMl92ZXJzaW9uc1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG10OXYwMzItPnZlcnNpb24gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuc3VwcG9ydGVkIGNoaXAgdmVyc2lvbiAweCUwNHhcbiIsCisJCQl2ZXJzaW9uKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbXQ5djAzMl9wb3dlcl9vZmYobXQ5djAzMik7CiAKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNVDlWMDMyIGRldGVjdGVkIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAotCQkJY2xpZW50LT5hZGRyKTsKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyBkZXRlY3RlZCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJIG10OXYwMzItPnZlcnNpb24tPm5hbWUsIGNsaWVudC0+YWRkcik7CiAKLQltdDl2MDMyX2NvbmZpZ3VyZV9waXhlbF9yYXRlKG10OXYwMzIsIDEpOworCW10OXYwMzJfY29uZmlndXJlX3BpeGVsX3JhdGUobXQ5djAzMik7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10OXYwMzJfb3BlbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKIHsKKwlzdHJ1Y3QgbXQ5djAzMiAqbXQ5djAzMiA9IHRvX210OXYwMzIoc3ViZGV2KTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CiAJc3RydWN0IHY0bDJfcmVjdCAqY3JvcDsKIApAQCAtNjgzLDcgKzgxMywxMiBAQAogCWNyb3AtPmhlaWdodCA9IE1UOVYwMzJfV0lORE9XX0hFSUdIVF9ERUY7CiAKIAlmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7Ci0JZm9ybWF0LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisKKwlpZiAobXQ5djAzMi0+bW9kZWwtPmNvbG9yKQorCQlmb3JtYXQtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMDsKKwllbHNlCisJCWZvcm1hdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfWTEwXzFYMTA7CisKIAlmb3JtYXQtPndpZHRoID0gTVQ5VjAzMl9XSU5ET1dfV0lEVEhfREVGOwogCWZvcm1hdC0+aGVpZ2h0ID0gTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX0RFRjsKIAlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwpAQCAtNzU1LDYgKzg5MCw3IEBACiAKIAltdXRleF9pbml0KCZtdDl2MDMyLT5wb3dlcl9sb2NrKTsKIAltdDl2MDMyLT5wZGF0YSA9IHBkYXRhOworCW10OXYwMzItPm1vZGVsID0gKGNvbnN0IHZvaWQgKilkaWQtPmRyaXZlcl9kYXRhOwogCiAJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5djAzMi0+Y3RybHMsIDEwKTsKIApAQCAtNzY3LDE2ICs5MDMsMTYgQEAKIAkJCSAgICAgICBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCBWNEwyX0VYUE9TVVJFX01BTlVBTCwgMCwKIAkJCSAgICAgICBWNEwyX0VYUE9TVVJFX0FVVE8pOwogCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl2MDMyLT5jdHJscywgJm10OXYwMzJfY3RybF9vcHMsCi0JCQkgIFY0TDJfQ0lEX0VYUE9TVVJFLCBNVDlWMDMyX1RPVEFMX1NIVVRURVJfV0lEVEhfTUlOLAotCQkJICBNVDlWMDMyX1RPVEFMX1NIVVRURVJfV0lEVEhfTUFYLCAxLAorCQkJICBWNEwyX0NJRF9FWFBPU1VSRSwgbXQ5djAzMi0+bW9kZWwtPmRhdGEtPm1pbl9zaHV0dGVyLAorCQkJICBtdDl2MDMyLT5tb2RlbC0+ZGF0YS0+bWF4X3NodXR0ZXIsIDEsCiAJCQkgIE1UOVYwMzJfVE9UQUxfU0hVVFRFUl9XSURUSF9ERUYpOwogCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl2MDMyLT5jdHJscywgJm10OXYwMzJfY3RybF9vcHMsCi0JCQkgIFY0TDJfQ0lEX0hCTEFOSywgTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX01JTiwKKwkJCSAgVjRMMl9DSURfSEJMQU5LLCBtdDl2MDMyLT5tb2RlbC0+ZGF0YS0+bWluX2hibGFuaywKIAkJCSAgTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX01BWCwgMSwKIAkJCSAgTVQ5VjAzMl9IT1JJWk9OVEFMX0JMQU5LSU5HX0RFRik7CiAJdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMzItPmN0cmxzLCAmbXQ5djAzMl9jdHJsX29wcywKLQkJCSAgVjRMMl9DSURfVkJMQU5LLCBNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HX01JTiwKLQkJCSAgTVQ5VjAzMl9WRVJUSUNBTF9CTEFOS0lOR19NQVgsIDEsCisJCQkgIFY0TDJfQ0lEX1ZCTEFOSywgbXQ5djAzMi0+bW9kZWwtPmRhdGEtPm1pbl92YmxhbmssCisJCQkgIG10OXYwMzItPm1vZGVsLT5kYXRhLT5tYXhfdmJsYW5rLCAxLAogCQkJICBNVDlWMDMyX1ZFUlRJQ0FMX0JMQU5LSU5HX0RFRik7CiAJbXQ5djAzMi0+dGVzdF9wYXR0ZXJuID0gdjRsMl9jdHJsX25ld19zdGRfbWVudV9pdGVtcygmbXQ5djAzMi0+Y3RybHMsCiAJCQkJJm10OXYwMzJfY3RybF9vcHMsIFY0TDJfQ0lEX1RFU1RfUEFUVEVSTiwKQEAgLTgxOSwxMiArOTU1LDE5IEBACiAJbXQ5djAzMi0+Y3JvcC53aWR0aCA9IE1UOVYwMzJfV0lORE9XX1dJRFRIX0RFRjsKIAltdDl2MDMyLT5jcm9wLmhlaWdodCA9IE1UOVYwMzJfV0lORE9XX0hFSUdIVF9ERUY7CiAKLQltdDl2MDMyLT5mb3JtYXQuY29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCWlmIChtdDl2MDMyLT5tb2RlbC0+Y29sb3IpCisJCW10OXYwMzItPmZvcm1hdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisJZWxzZQorCQltdDl2MDMyLT5mb3JtYXQuY29kZSA9IFY0TDJfTUJVU19GTVRfWTEwXzFYMTA7CisKIAltdDl2MDMyLT5mb3JtYXQud2lkdGggPSBNVDlWMDMyX1dJTkRPV19XSURUSF9ERUY7CiAJbXQ5djAzMi0+Zm9ybWF0LmhlaWdodCA9IE1UOVYwMzJfV0lORE9XX0hFSUdIVF9ERUY7CiAJbXQ5djAzMi0+Zm9ybWF0LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwogCW10OXYwMzItPmZvcm1hdC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CiAKKwltdDl2MDMyLT5ocmF0aW8gPSAxOworCW10OXYwMzItPnZyYXRpbyA9IDE7CisKIAltdDl2MDMyLT5hZWNfYWdjID0gTVQ5VjAzMl9BRUNfRU5BQkxFIHwgTVQ5VjAzMl9BR0NfRU5BQkxFOwogCW10OXYwMzItPmhibGFuayA9IE1UOVYwMzJfSE9SSVpPTlRBTF9CTEFOS0lOR19ERUY7CiAJbXQ5djAzMi0+c3lzY2xrID0gTVQ5VjAzMl9TWVNDTEtfRlJFUV9ERUY7CkBAIC04NTUsNyArOTk4LDEwIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDl2MDMyX2lkW10gPSB7Ci0JeyAibXQ5djAzMiIsIDAgfSwKKwl7ICJtdDl2MDMyIiwgKGtlcm5lbF91bG9uZ190KSZtdDl2MDMyX21vZGVsc1tNVDlWMDMyX01PREVMX1YwMzJfQ09MT1JdIH0sCisJeyAibXQ5djAzMm0iLCAoa2VybmVsX3Vsb25nX3QpJm10OXYwMzJfbW9kZWxzW01UOVYwMzJfTU9ERUxfVjAzMl9NT05PXSB9LAorCXsgIm10OXYwMzQiLCAoa2VybmVsX3Vsb25nX3QpJm10OXYwMzJfbW9kZWxzW01UOVYwMzJfTU9ERUxfVjAzNF9DT0xPUl0gfSwKKwl7ICJtdDl2MDM0bSIsIChrZXJuZWxfdWxvbmdfdCkmbXQ5djAzMl9tb2RlbHNbTVQ5VjAzMl9NT0RFTF9WMDM0X01PTk9dIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG10OXYwMzJfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTEwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMKQEAgLTAsMCArMSwyMDUzIEBACisvKgorICogRHJpdmVyIGZvciBTYW1zdW5nIFM1SzVCQUYgVVhHQSAxLzUiIDJNIENNT1MgSW1hZ2UgU2Vuc29yCisgKiB3aXRoIGVtYmVkZGVkIFNvQyBJU1AuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQW5kcnplaiBIYWpkYSA8YS5oYWpkYUBzYW1zdW5nLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBTNUs2QUEgZHJpdmVyIGF1dGhvcmVkIGJ5IFN5bHdlc3RlciBOYXdyb2NraQorICogQ29weXJpZ2h0IChDKSAyMDEzLCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbWVkaWEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1vZi5oPgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCisjZGVmaW5lIFM1SzVCQUZfRFJJVkVSX05BTUUJCSJzNWs1YmFmIgorI2RlZmluZSBTNUs1QkFGX0RFRkFVTFRfTUNMS19GUkVRCTI0MDAwMDAwVQorI2RlZmluZSBTNUs1QkFGX0NMS19OQU1FCQkibWNsayIKKworI2RlZmluZSBTNUs1QkFGX0ZXX0ZJTEVOQU1FCQkiczVrNWJhZi1jZmcuYmluIgorI2RlZmluZSBTNUs1QkFGX0ZXX1RBRwkJCSJTRjAwIgorI2RlZmluZSBTNUs1QkFHX0ZXX1RBR19MRU4JCTIKKyNkZWZpbmUgUzVLNUJBR19GV19NQVhfQ09VTlQJCTE2CisKKyNkZWZpbmUgUzVLNUJBRl9DSVNfV0lEVEgJCTE2MDAKKyNkZWZpbmUgUzVLNUJBRl9DSVNfSEVJR0hUCQkxMjAwCisjZGVmaW5lIFM1SzVCQUZfV0lOX1dJRFRIX01JTgkJOAorI2RlZmluZSBTNUs1QkFGX1dJTl9IRUlHSFRfTUlOCQk4CisjZGVmaW5lIFM1SzVCQUZfR0FJTl9SRURfREVGCQkxMjcKKyNkZWZpbmUgUzVLNUJBRl9HQUlOX0dSRUVOX0RFRgkJOTUKKyNkZWZpbmUgUzVLNUJBRl9HQUlOX0JMVUVfREVGCQkxODAKKy8qIERlZmF1bHQgbnVtYmVyIG9mIE1JUEkgQ1NJLTIgZGF0YSBsYW5lcyB1c2VkICovCisjZGVmaW5lIFM1SzVCQUZfREVGX05VTV9MQU5FUwkJMQorCisjZGVmaW5lIEFIQl9NU0JfQUREUl9QVFIJCTB4ZmNmYworCisvKgorICogUmVnaXN0ZXIgaW50ZXJmYWNlIHBhZ2VzICh0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIG9mIHRoZSBhZGRyZXNzKQorICovCisjZGVmaW5lIFBBR0VfSUZfSFcJCQkweGQwMDAKKyNkZWZpbmUgUEFHRV9JRl9TVwkJCTB4NzAwMAorCisvKgorICogSC9XIHJlZ2lzdGVyIEludGVyZmFjZSAoUEFHRV9JRl9IVykKKyAqLworI2RlZmluZSBSRUdfU1dfTE9BRF9DT01QTEVURQkJMHgwMDE0CisjZGVmaW5lIFJFR19DTURXUl9QQUdFCQkJMHgwMDI4CisjZGVmaW5lIFJFR19DTURXUl9BRERSCQkJMHgwMDJhCisjZGVmaW5lIFJFR19DTURSRF9QQUdFCQkJMHgwMDJjCisjZGVmaW5lIFJFR19DTURSRF9BRERSCQkJMHgwMDJlCisjZGVmaW5lIFJFR19DTURfQlVGCQkJMHgwZjEyCisjZGVmaW5lIFJFR19TRVRfSE9TVF9JTlQJCTB4MTAwMAorI2RlZmluZSBSRUdfQ0xFQVJfSE9TVF9JTlQJCTB4MTAzMAorI2RlZmluZSBSRUdfUEFUVEVSTl9TRVQJCQkweDMxMDAKKyNkZWZpbmUgUkVHX1BBVFRFUk5fV0lEVEgJCTB4MzExOAorI2RlZmluZSBSRUdfUEFUVEVSTl9IRUlHSFQJCTB4MzExYQorI2RlZmluZSBSRUdfUEFUVEVSTl9QQVJBTQkJMHgzMTFjCisKKy8qCisgKiBTL1cgcmVnaXN0ZXIgaW50ZXJmYWNlIChQQUdFX0lGX1NXKQorICovCisKKy8qIEZpcm13YXJlIHJldmlzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFJFR19GV19BUElWRVIJCQkweDAxMmUKKyNkZWZpbmUgIFM1SzVCQUZfRldfQVBJVkVSCQkweDAwMDEKKyNkZWZpbmUgUkVHX0ZXX1JFVklTSU9OCQkJMHgwMTMwCisjZGVmaW5lIFJFR19GV19TRU5TT1JfSUQJCTB4MDE1MgorCisvKiBJbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisvKiBNYXN0ZXIgY2xvY2sgZnJlcXVlbmN5IGluIEtIeiAqLworI2RlZmluZSBSRUdfSV9JTkNMS19GUkVRX0wJCTB4MDFiOAorI2RlZmluZSBSRUdfSV9JTkNMS19GUkVRX0gJCTB4MDFiYQorI2RlZmluZSAgTUlOX01DTEtfRlJFUV9LSFoJCTYwMDBVCisjZGVmaW5lICBNQVhfTUNMS19GUkVRX0tIWgkJNDgwMDBVCisjZGVmaW5lIFJFR19JX1VTRV9OUFZJX0NMT0NLUwkJMHgwMWM2CisjZGVmaW5lICBOUFZJX0NMT0NLUwkJCTEKKyNkZWZpbmUgUkVHX0lfVVNFX05NSVBJX0NMT0NLUwkJMHgwMWM4CisjZGVmaW5lICBOTUlQSV9DTE9DS1MJCQkxCisjZGVmaW5lIFJFR19JX0JMT0NLX0lOVEVSTkFMX1BMTF9DQUxDCTB4MDFjYQorCisvKiBDbG9jayBjb25maWd1cmF0aW9ucywgbiA9IDAuLjIuIFJFR19JXyogZnJlcXVlbmN5IHVuaXQgaXMgNCBrSHouICovCisjZGVmaW5lIFJFR19JX09QQ0xLXzRLSFoobikJCSgobikgKiA2ICsgMHgwMWNjKQorI2RlZmluZSBSRUdfSV9NSU5fT1VUUkFURV80S0haKG4pCSgobikgKiA2ICsgMHgwMWNlKQorI2RlZmluZSBSRUdfSV9NQVhfT1VUUkFURV80S0haKG4pCSgobikgKiA2ICsgMHgwMWQwKQorI2RlZmluZSAgU0NMS19QVklfRlJFUQkJCTI0MDAwCisjZGVmaW5lICBTQ0xLX01JUElfRlJFUQkJCTQ4MDAwCisjZGVmaW5lICBQQ0xLX01JTl9GUkVRCQkJNjAwMAorI2RlZmluZSAgUENMS19NQVhfRlJFUQkJCTQ4MDAwCisjZGVmaW5lIFJFR19JX1VTRV9SRUdTX0FQSQkJMHgwMWRlCisjZGVmaW5lIFJFR19JX0lOSVRfUEFSQU1TX1VQREFURUQJMHgwMWUwCisjZGVmaW5lIFJFR19JX0VSUk9SX0lORk8JCTB4MDFlMgorCisvKiBHZW5lcmFsIHB1cnBvc2UgcGFyYW1ldGVycyAqLworI2RlZmluZSBSRUdfVVNFUl9CUklHSFRORVNTCQkweDAxZTQKKyNkZWZpbmUgUkVHX1VTRVJfQ09OVFJBU1QJCTB4MDFlNgorI2RlZmluZSBSRUdfVVNFUl9TQVRVUkFUSU9OCQkweDAxZTgKKyNkZWZpbmUgUkVHX1VTRVJfU0hBUlBCTFVSCQkweDAxZWEKKworI2RlZmluZSBSRUdfR19TUEVDX0VGRkVDVFMJCTB4MDFlZQorI2RlZmluZSBSRUdfR19FTkFCTEVfUFJFVgkJMHgwMWYwCisjZGVmaW5lIFJFR19HX0VOQUJMRV9QUkVWX0NIRwkJMHgwMWYyCisjZGVmaW5lIFJFR19HX05FV19DRkdfU1lOQwkJMHgwMWY4CisjZGVmaW5lIFJFR19HX1BSRVZSRVFfSU5fV0lEVEgJCTB4MDFmYQorI2RlZmluZSBSRUdfR19QUkVWUkVRX0lOX0hFSUdIVAkJMHgwMWZjCisjZGVmaW5lIFJFR19HX1BSRVZSRVFfSU5fWE9GRlMJCTB4MDFmZQorI2RlZmluZSBSRUdfR19QUkVWUkVRX0lOX1lPRkZTCQkweDAyMDAKKyNkZWZpbmUgUkVHX0dfUFJFVlpPT01fSU5fV0lEVEgJCTB4MDIwYQorI2RlZmluZSBSRUdfR19QUkVWWk9PTV9JTl9IRUlHSFQJMHgwMjBjCisjZGVmaW5lIFJFR19HX1BSRVZaT09NX0lOX1hPRkZTCQkweDAyMGUKKyNkZWZpbmUgUkVHX0dfUFJFVlpPT01fSU5fWU9GRlMJCTB4MDIxMAorI2RlZmluZSBSRUdfR19JTlBVVFNfQ0hBTkdFX1JFUQkJMHgwMjFhCisjZGVmaW5lIFJFR19HX0FDVElWRV9QUkVWX0NGRwkJMHgwMjFjCisjZGVmaW5lIFJFR19HX1BSRVZfQ0ZHX0NIRwkJMHgwMjFlCisjZGVmaW5lIFJFR19HX1BSRVZfT1BFTl9BRlRFUl9DSAkweDAyMjAKKyNkZWZpbmUgUkVHX0dfUFJFVl9DRkdfRVJST1IJCTB4MDIyMgorI2RlZmluZSAgQ0ZHX0VSUk9SX1JBTkdFCQkweDBiCisjZGVmaW5lIFJFR19HX1BSRVZfQ0ZHX0JZUEFTU19DSEFOR0VECTB4MDIyYQorI2RlZmluZSBSRUdfR19BQ1RVQUxfUF9GUl9USU1FCQkweDAyM2EKKyNkZWZpbmUgUkVHX0dfQUNUVUFMX1BfT1VUX1JBVEUJCTB4MDIzYworI2RlZmluZSBSRUdfR19BQ1RVQUxfQ19GUl9USU1FCQkweDAyM2UKKyNkZWZpbmUgUkVHX0dfQUNUVUFMX0NfT1VUX1JBVEUJCTB4MDI0MAorCisvKiBQcmV2aWV3IGNvbnRyb2wgc2VjdGlvbi4gbiA9IDAuLi40LiAqLworI2RlZmluZSBQUkVHKG4sIHgpCQkJKChuKSAqIDB4MjYgKyB4KQorI2RlZmluZSBSRUdfUF9PVVRfV0lEVEgobikJCVBSRUcobiwgMHgwMjQyKQorI2RlZmluZSBSRUdfUF9PVVRfSEVJR0hUKG4pCQlQUkVHKG4sIDB4MDI0NCkKKyNkZWZpbmUgUkVHX1BfRk1UKG4pCQkJUFJFRyhuLCAweDAyNDYpCisjZGVmaW5lIFJFR19QX01BWF9PVVRfUkFURShuKQkJUFJFRyhuLCAweDAyNDgpCisjZGVmaW5lIFJFR19QX01JTl9PVVRfUkFURShuKQkJUFJFRyhuLCAweDAyNGEpCisjZGVmaW5lIFJFR19QX1BWSV9NQVNLKG4pCQlQUkVHKG4sIDB4MDI0YykKKyNkZWZpbmUgIFBWSV9NQVNLX01JUEkJCQkweDUyCisjZGVmaW5lIFJFR19QX0NMS19JTkRFWChuKQkJUFJFRyhuLCAweDAyNGUpCisjZGVmaW5lICBDTEtfUFZJX0lOREVYCQkJMAorI2RlZmluZSAgQ0xLX01JUElfSU5ERVgJCQlOUFZJX0NMT0NLUworI2RlZmluZSBSRUdfUF9GUl9SQVRFX1RZUEUobikJCVBSRUcobiwgMHgwMjUwKQorI2RlZmluZSAgRlJfUkFURV9EWU5BTUlDCQkwCisjZGVmaW5lICBGUl9SQVRFX0ZJWEVECQkJMQorI2RlZmluZSAgRlJfUkFURV9GSVhFRF9BQ0NVUkFURQkJMgorI2RlZmluZSBSRUdfUF9GUl9SQVRFX1FfVFlQRShuKQkJUFJFRyhuLCAweDAyNTIpCisjZGVmaW5lICBGUl9SQVRFX1FfRFlOQU1JQwkJMAorI2RlZmluZSAgRlJfUkFURV9RX0JFU1RfRlJSQVRFCQkxIC8qIEJpbm5pbmcgZW5hYmxlZCAqLworI2RlZmluZSAgRlJfUkFURV9RX0JFU1RfUVVBTElUWQkJMiAvKiBCaW5uaW5nIGRpc2FibGVkICovCisvKiBGcmFtZSBwZXJpb2QgaW4gMC4xIG1zIHVuaXRzICovCisjZGVmaW5lIFJFR19QX01BWF9GUl9USU1FKG4pCQlQUkVHKG4sIDB4MDI1NCkKKyNkZWZpbmUgUkVHX1BfTUlOX0ZSX1RJTUUobikJCVBSRUcobiwgMHgwMjU2KQorI2RlZmluZSAgUzVLNUJBRl9NSU5fRlJfVElNRQkJMzMzICAvKiB4MTAwIHVzICovCisjZGVmaW5lICBTNUs1QkFGX01BWF9GUl9USU1FCQk2NTAwIC8qIHgxMDAgdXMgKi8KKy8qIFRoZSBiZWxvdyA1IHJlZ2lzdGVycyBhcmUgZm9yICJkZXZpY2UgY29ycmVjdGlvbiIgdmFsdWVzICovCisjZGVmaW5lIFJFR19QX1NBVFVSQVRJT04obikJCVBSRUcobiwgMHgwMjU4KQorI2RlZmluZSBSRUdfUF9TSEFSUF9CTFVSKG4pCQlQUkVHKG4sIDB4MDI1YSkKKyNkZWZpbmUgUkVHX1BfR0xBTU9VUihuKQkJUFJFRyhuLCAweDAyNWMpCisjZGVmaW5lIFJFR19QX0NPTE9SVEVNUChuKQkJUFJFRyhuLCAweDAyNWUpCisjZGVmaW5lIFJFR19QX0dBTU1BX0lOREVYKG4pCQlQUkVHKG4sIDB4MDI2MCkKKyNkZWZpbmUgUkVHX1BfUFJFVl9NSVJST1IobikJCVBSRUcobiwgMHgwMjYyKQorI2RlZmluZSBSRUdfUF9DQVBfTUlSUk9SKG4pCQlQUkVHKG4sIDB4MDI2NCkKKyNkZWZpbmUgUkVHX1BfQ0FQX1JPVEFUSU9OKG4pCQlQUkVHKG4sIDB4MDI2NikKKworLyogRXh0ZW5kZWQgaW1hZ2UgcHJvcGVydHkgY29udHJvbHMgKi8KKy8qIEV4cG9zdXJlIHRpbWUgaW4gMTAgdXMgdW5pdHMgKi8KKyNkZWZpbmUgUkVHX1NGX1VTUl9FWFBPU1VSRV9MCQkweDAzYmMKKyNkZWZpbmUgUkVHX1NGX1VTUl9FWFBPU1VSRV9ICQkweDAzYmUKKyNkZWZpbmUgUkVHX1NGX1VTUl9FWFBPU1VSRV9DSEcJCTB4MDNjMAorI2RlZmluZSBSRUdfU0ZfVVNSX1RPVF9HQUlOCQkweDAzYzIKKyNkZWZpbmUgUkVHX1NGX1VTUl9UT1RfR0FJTl9DSEcJCTB4MDNjNAorI2RlZmluZSBSRUdfU0ZfUkdBSU4JCQkweDAzYzYKKyNkZWZpbmUgUkVHX1NGX1JHQUlOX0NIRwkJMHgwM2M4CisjZGVmaW5lIFJFR19TRl9HR0FJTgkJCTB4MDNjYQorI2RlZmluZSBSRUdfU0ZfR0dBSU5fQ0hHCQkweDAzY2MKKyNkZWZpbmUgUkVHX1NGX0JHQUlOCQkJMHgwM2NlCisjZGVmaW5lIFJFR19TRl9CR0FJTl9DSEcJCTB4MDNkMAorI2RlZmluZSBSRUdfU0ZfV0JHQUlOX0NIRwkJMHgwM2QyCisjZGVmaW5lIFJFR19TRl9GTElDS0VSX1FVQU5UCQkweDAzZDQKKyNkZWZpbmUgUkVHX1NGX0ZMSUNLRVJfUVVBTlRfQ0hHCTB4MDNkNgorCisvKiBPdXRwdXQgaW50ZXJmYWNlIChwYXJhbGxlbC9NSVBJKSBzZXR1cCAqLworI2RlZmluZSBSRUdfT0lGX0VOX01JUElfTEFORVMJCTB4MDNmMgorI2RlZmluZSBSRUdfT0lGX0VOX1BBQ0tFVFMJCTB4MDNmNAorI2RlZmluZSAgRU5fUEFDS0VUU19DU0kyCQkweGMzCisjZGVmaW5lIFJFR19PSUZfQ0ZHX0NIRwkJCTB4MDNmNgorCisvKiBBdXRvLWFsZ29yaXRobXMgZW5hYmxlIG1hc2sgKi8KKyNkZWZpbmUgUkVHX0RCR19BVVRPQUxHX0VOCQkweDAzZjgKKyNkZWZpbmUgIEFBTEdfQUxMX0VOCQkJQklUKDApCisjZGVmaW5lICBBQUxHX0FFX0VOCQkJQklUKDEpCisjZGVmaW5lICBBQUxHX0RJVkxFSV9FTgkJCUJJVCgyKQorI2RlZmluZSAgQUFMR19XQl9FTgkJCUJJVCgzKQorI2RlZmluZSAgQUFMR19VU0VfV0JfRk9SX0lTUAkJQklUKDQpCisjZGVmaW5lICBBQUxHX0ZMSUNLRVJfRU4JCUJJVCg1KQorI2RlZmluZSAgQUFMR19GSVRfRU4JCQlCSVQoNikKKyNkZWZpbmUgIEFBTEdfV1JIV19FTgkJCUJJVCg3KQorCisvKiBQb2ludGVycyB0byBjb2xvciBjb3JyZWN0aW9uIG1hdHJpY2VzICovCisjZGVmaW5lIFJFR19QVFJfQ0NNX0hPUklaT04JCTB4MDZkMAorI2RlZmluZSBSRUdfUFRSX0NDTV9JTkNBTkRFU0NFTlQJMHgwNmQ0CisjZGVmaW5lIFJFR19QVFJfQ0NNX1dBUk1fV0hJVEUJCTB4MDZkOAorI2RlZmluZSBSRUdfUFRSX0NDTV9DT09MX1dISVRFCQkweDA2ZGMKKyNkZWZpbmUgUkVHX1BUUl9DQ01fREw1MAkJMHgwNmUwCisjZGVmaW5lIFJFR19QVFJfQ0NNX0RMNjUJCTB4MDZlNAorI2RlZmluZSBSRUdfUFRSX0NDTV9PVVRET09SCQkweDA2ZWMKKworI2RlZmluZSBSRUdfQVJSX0NDTShuKQkJCSgweDI4MDAgKyAzNiAqIChuKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzNWs1YmFmX3N1cHBseV9uYW1lc1tdID0geworCSJ2ZGRhIiwJCS8qIEFuYWxvZyBwb3dlciBzdXBwbHkgMi44ViAoMi42ViB0byAzLjBWKSAqLworCSJ2ZGRyZWciLAkvKiBSZWd1bGF0b3IgaW5wdXQgcG93ZXIgc3VwcGx5IDEuOFYgKDEuN1YgdG8gMS45VikKKwkJCSAgIG9yIDIuOFYgKDIuNlYgdG8gMy4wKSAqLworCSJ2ZGRpbyIsCS8qIEkvTyBwb3dlciBzdXBwbHkgMS44ViAoMS42NVYgdG8gMS45NVYpCisJCQkgICBvciAyLjhWICgyLjVWIHRvIDMuMVYpICovCit9OworI2RlZmluZSBTNUs1QkFGX05VTV9TVVBQTElFUyBBUlJBWV9TSVpFKHM1azViYWZfc3VwcGx5X25hbWVzKQorCitzdHJ1Y3QgczVrNWJhZl9ncGlvIHsKKwlpbnQgZ3BpbzsKKwlpbnQgbGV2ZWw7Cit9OworCitlbnVtIHM1azViYWZfZ3Bpb19pZCB7CisJU1RCWSwKKwlSU1QsCisJTlVNX0dQSU9TLAorfTsKKworI2RlZmluZSBQQURfQ0lTIDAKKyNkZWZpbmUgUEFEX09VVCAxCisjZGVmaW5lIE5VTV9DSVNfUEFEUyAxCisjZGVmaW5lIE5VTV9JU1BfUEFEUyAyCisKK3N0cnVjdCBzNWs1YmFmX3BpeGZtdCB7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CisJdTMyIGNvbG9yc3BhY2U7CisJLyogUkVHX1BfRk1UKHgpIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHJlZ19wX2ZtdDsKK307CisKK3N0cnVjdCBzNWs1YmFmX2N0cmxzIHsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGFuZGxlcjsKKwlzdHJ1Y3QgeyAvKiBBdXRvIC8gbWFudWFsIHdoaXRlIGJhbGFuY2UgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICphd2I7CisJCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW5fcmVkOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluX2JsdWU7CisJfTsKKwlzdHJ1Y3QgeyAvKiBNaXJyb3IgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICpoZmxpcDsKKwkJc3RydWN0IHY0bDJfY3RybCAqdmZsaXA7CisJfTsKKwlzdHJ1Y3QgeyAvKiBBdXRvIGV4cG9zdXJlIC8gbWFudWFsIGV4cG9zdXJlIGFuZCBnYWluIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqYXV0b19leHA7CisJCXN0cnVjdCB2NGwyX2N0cmwgKmV4cG9zdXJlOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluOworCX07Cit9OworCitlbnVtIHsKKwlTNUs1QkFGX0ZXX0lEX1BBVENILAorCVM1SzVCQUZfRldfSURfQ0NNLAorCVM1SzVCQUZfRldfSURfQ0lTLAorfTsKKworc3RydWN0IHM1azViYWZfZncgeworCXUxNiBjb3VudDsKKwlzdHJ1Y3QgeworCQl1MTYgaWQ7CisJCXUxNiBvZmZzZXQ7CisJfSBzZXFbMF07CisJdTE2IGRhdGFbMF07Cit9OworCitzdHJ1Y3QgczVrNWJhZiB7CisJc3RydWN0IHM1azViYWZfZ3BpbyBncGlvc1tOVU1fR1BJT1NdOworCWVudW0gdjRsMl9tYnVzX3R5cGUgYnVzX3R5cGU7CisJdTggbmxhbmVzOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1M1SzVCQUZfTlVNX1NVUFBMSUVTXTsKKworCXN0cnVjdCBjbGsgKmNsb2NrOworCXUzMiBtY2xrX2ZyZXF1ZW5jeTsKKworCXN0cnVjdCBzNWs1YmFmX2Z3ICpmdzsKKworCXN0cnVjdCB2NGwyX3N1YmRldiBjaXNfc2Q7CisJc3RydWN0IG1lZGlhX3BhZCBjaXNfcGFkOworCisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCXN0cnVjdCBtZWRpYV9wYWQgcGFkc1tOVU1fSVNQX1BBRFNdOworCisJLyogcHJvdGVjdHMgdGhlIHN0cnVjdCBtZW1iZXJzIGJlbG93ICovCisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlpbnQgZXJyb3I7CisKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3Bfc2luazsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNvbXBvc2U7CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wX3NvdXJjZTsKKwkvKiBpbmRleCB0byBzNWs1YmFmX2Zvcm1hdHMgYXJyYXkgKi8KKwlpbnQgcGl4Zm10OworCS8qIGFjdHVhbCBmcmFtZSBpbnRlcnZhbCBpbiAxMDB1cyAqLworCXUxNiBmaXY7CisJLyogcmVxdWVzdGVkIGZyYW1lIGludGVydmFsIGluIDEwMHVzICovCisJdTE2IHJlcV9maXY7CisJLyogY2FjaGUgZm9yIFJFR19EQkdfQVVUT0FMR19FTiByZWdpc3RlciAqLworCXUxNiBhdXRvX2FsZzsKKworCXN0cnVjdCBzNWs1YmFmX2N0cmxzIGN0cmxzOworCisJdW5zaWduZWQgaW50IHN0cmVhbWluZzoxOworCXVuc2lnbmVkIGludCBhcHBseV9jZmc6MTsKKwl1bnNpZ25lZCBpbnQgYXBwbHlfY3JvcDoxOworCXVuc2lnbmVkIGludCB2YWxpZF9hdXRvX2FsZzoxOworCXVuc2lnbmVkIGludCBwb3dlcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgczVrNWJhZl9waXhmbXQgczVrNWJhZl9mb3JtYXRzW10gPSB7CisJeyBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCwJVjRMMl9DT0xPUlNQQUNFX0pQRUcsCTUgfSwKKwkvKiByYW5nZSAxNi0yNDAgKi8KKwl7IFY0TDJfTUJVU19GTVRfVllVWThfMlg4LAlWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5LAk2IH0sCisJeyBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkUsCVY0TDJfQ09MT1JTUEFDRV9KUEVHLAkwIH0sCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfcmVjdCBzNWs1YmFmX2Npc19yZWN0ID0geworCTAsIDAsIFM1SzVCQUZfQ0lTX1dJRFRILCBTNUs1QkFGX0NJU19IRUlHSFQKK307CisKKy8qIFNldGZpbGUgY29udGFpbnMgc2V0IG9mIEkyQyBjb21tYW5kIHNlcXVlbmNlcy4gRWFjaCBzZXF1ZW5jZSBoYXMgaXRzIElELgorICogc2V0ZmlsZSBmb3JtYXQ6CisgKgl1OCBtYWdpY1s0XTsKKyAqCXUxNiBjb3VudDsJCW51bWJlciBvZiBzZXF1ZW5jZXMKKyAqCXN0cnVjdCB7CisgKgkJdTE2IGlkOwkJc2VxdWVuY2UgaWQKKyAqCQl1MTYgb2Zmc2V0OwlzZXF1ZW5jZSBvZmZzZXQgaW4gZGF0YSBhcnJheQorICoJfSBzZXFbY291bnRdOworICoJdTE2IGRhdGFbKl07CQlhcnJheSBjb250YWluaW5nIHNlcXVlbmNlcworICoKKyAqLworc3RhdGljIGludCBzNWs1YmFmX2Z3X3BhcnNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHM1azViYWZfZncgKipmdywKKwkJCSAgICBzaXplX3QgY291bnQsIGNvbnN0IHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3QgczVrNWJhZl9mdyAqZjsKKwl1MTYgKmQsIGksICplbmQ7CisJaW50IHJldDsKKworCWlmIChjb3VudCA8IFM1SzVCQUdfRldfVEFHX0xFTiArIDEpIHsKKwkJZGV2X2VycihkZXYsICJmaXJtd2FyZSBmaWxlIHRvbyBzaG9ydCAoJXp1KVxuIiwgY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtZW1jbXAoZGF0YSwgUzVLNUJBRl9GV19UQUcsIFM1SzVCQUdfRldfVEFHX0xFTiAqIHNpemVvZih1MTYpKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGZpcm13YXJlIG1hZ2ljIG51bWJlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEgKz0gUzVLNUJBR19GV19UQUdfTEVOOworCWNvdW50IC09IFM1SzVCQUdfRldfVEFHX0xFTjsKKworCWQgPSBkZXZtX2t6YWxsb2MoZGV2LCBjb3VudCAqIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQlkW2ldID0gbGUxNl90b19jcHUoZGF0YVtpXSk7CisKKwlmID0gKHN0cnVjdCBzNWs1YmFmX2Z3ICopZDsKKwlpZiAoY291bnQgPCAxICsgMiAqIGYtPmNvdW50KSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBmaXJtd2FyZSBoZWFkZXIgKGNvdW50PSVkIHNpemU9JXp1KVxuIiwKKwkJCWYtPmNvdW50LCAyICogKGNvdW50ICsgUzVLNUJBR19GV19UQUdfTEVOKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllbmQgPSBkICsgY291bnQ7CisJZCArPSAxICsgMiAqIGYtPmNvdW50OworCisJZm9yIChpID0gMDsgaSA8IGYtPmNvdW50OyArK2kpIHsKKwkJaWYgKGYtPnNlcVtpXS5vZmZzZXQgKyBkIDw9IGVuZCkKKwkJCWNvbnRpbnVlOworCQlkZXZfZXJyKGRldiwgImludmFsaWQgZmlybXdhcmUgaGVhZGVyIChzZXE9JWQpXG4iLCBpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKmZ3ID0gZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqY3RybF90b19zZChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXJldHVybiAmY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBzNWs1YmFmLCBjdHJscy5oYW5kbGVyKS0+c2Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzNWs1YmFmX2lzX2Npc19zdWJkZXYoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gc2QtPmVudGl0eS50eXBlID09IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWX1NFTlNPUjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczVrNWJhZiAqdG9fczVrNWJhZihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCWlmIChzNWs1YmFmX2lzX2Npc19zdWJkZXYoc2QpKQorCQlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgczVrNWJhZiwgY2lzX3NkKTsKKwllbHNlCisJCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzNWs1YmFmLCBzZCk7Cit9CisKK3N0YXRpYyB1MTYgczVrNWJhZl9pMmNfcmVhZChzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIHUxNiBhZGRyKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmc3RhdGUtPnNkKTsKKwlfX2JlMTYgdywgcjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeyAuYWRkciA9IGMtPmFkZHIsIC5mbGFncyA9IDAsCisJCSAgLmxlbiA9IDIsIC5idWYgPSAodTggKikmdyB9LAorCQl7IC5hZGRyID0gYy0+YWRkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCSAgLmxlbiA9IDIsIC5idWYgPSAodTggKikmciB9LAorCX07CisJaW50IHJldDsKKworCWlmIChzdGF0ZS0+ZXJyb3IpCisJCXJldHVybiAwOworCisJdyA9IGNwdV90b19iZTE2KGFkZHIpOworCXJldCA9IGkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCBtc2csIDIpOworCXIgPSBiZTE2X3RvX2NwdShyKTsKKworCXY0bDJfZGJnKDMsIGRlYnVnLCBjLCAiaTJjX3JlYWQ6IDB4JTA0eCA6IDB4JTA0eFxuIiwgYWRkciwgcik7CisKKwlpZiAocmV0ICE9IDIpIHsKKwkJdjRsMl9lcnIoYywgImkyY19yZWFkOiBlcnJvciBkdXJpbmcgdHJhbnNmZXIgKCVkKVxuIiwgcmV0KTsKKwkJc3RhdGUtPmVycm9yID0gcmV0OworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9pMmNfd3JpdGUoc3RydWN0IHM1azViYWYgKnN0YXRlLCB1MTYgYWRkciwgdTE2IHZhbCkKK3sKKwl1OCBidWZbNF0gPSB7IGFkZHIgPj4gOCwgYWRkciAmIDB4RkYsIHZhbCA+PiA4LCB2YWwgJiAweEZGIH07CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzdGF0ZS0+c2QpOworCWludCByZXQ7CisKKwlpZiAoc3RhdGUtPmVycm9yKQorCQlyZXR1cm47CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoYywgYnVmLCA0KTsKKwl2NGwyX2RiZygzLCBkZWJ1ZywgYywgImkyY193cml0ZTogMHglMDR4IDogMHglMDR4XG4iLCBhZGRyLCB2YWwpOworCisJaWYgKHJldCAhPSA0KSB7CisJCXY0bDJfZXJyKGMsICJpMmNfd3JpdGU6IGVycm9yIGR1cmluZyB0cmFuc2ZlciAoJWQpXG4iLCByZXQpOworCQlzdGF0ZS0+ZXJyb3IgPSByZXQ7CisJfQorfQorCitzdGF0aWMgdTE2IHM1azViYWZfcmVhZChzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIHUxNiBhZGRyKQoreworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfQ01EUkRfQUREUiwgYWRkcik7CisJcmV0dXJuIHM1azViYWZfaTJjX3JlYWQoc3RhdGUsIFJFR19DTURfQlVGKTsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl93cml0ZShzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIHUxNiBhZGRyLCB1MTYgdmFsKQoreworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfQ01EV1JfQUREUiwgYWRkcik7CisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19DTURfQlVGLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX3dyaXRlX2Fycl9zZXEoc3RydWN0IHM1azViYWYgKnN0YXRlLCB1MTYgYWRkciwKKwkJCQkgIHUxNiBjb3VudCwgY29uc3QgdTE2ICpzZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzdGF0ZS0+c2QpOworCV9fYmUxNiBidWZbNjVdOworCisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19DTURXUl9BRERSLCBhZGRyKTsKKwlpZiAoc3RhdGUtPmVycm9yKQorCQlyZXR1cm47CisKKwl2NGwyX2RiZygzLCBkZWJ1ZywgYywgImkyY193cml0ZV9zZXEoY291bnQ9JWQpOiAlKnBoXG4iLCBjb3VudCwKKwkJIG1pbigyICogY291bnQsIDY0KSwgc2VxKTsKKworCWJ1ZlswXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoUkVHX0NNRF9CVUYpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnQgbiA9IG1pbl90KGludCwgY291bnQsIEFSUkFZX1NJWkUoYnVmKSAtIDEpOworCQlpbnQgcmV0LCBpOworCisJCWZvciAoaSA9IDE7IGkgPD0gbjsgKytpKQorCQkJYnVmW2ldID0gY3B1X3RvX2JlMTYoKnNlcSsrKTsKKworCQlpICo9IDI7CisJCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjLCAoY2hhciAqKWJ1ZiwgaSk7CisJCWlmIChyZXQgIT0gaSkgeworCQkJdjRsMl9lcnIoYywgImkyY193cml0ZV9zZXE6IGVycm9yIGR1cmluZyB0cmFuc2ZlciAoJWQpXG4iLCByZXQpOworCQkJc3RhdGUtPmVycm9yID0gcmV0OworCQkJYnJlYWs7CisJCX0KKworCQljb3VudCAtPSBuOworCX0KK30KKworI2RlZmluZSBzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgYWRkciwgc2VxLi4uKSBcCisJczVrNWJhZl93cml0ZV9hcnJfc2VxKHN0YXRlLCBhZGRyLCBzaXplb2YoKGNoYXJbXSl7IHNlcSB9KSwgXAorCQkJICAgICAgKGNvbnN0IHUxNiBbXSl7IHNlcSB9KTsKKworLyogYWRkIGl0ZW1zIGNvdW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKi8KKyNkZWZpbmUgTlNFUShzZXEuLi4pIHNpemVvZigoY2hhcltdKXsgc2VxIH0pLCBzZXEKKworLyoKKyAqIHM1azViYWZfd3JpdGVfbnNlcSgpIC0gV3JpdGVzIHNlcXVlbmNlcyBvZiB2YWx1ZXMgdG8gc2Vuc29yIG1lbW9yeSB2aWEgaTJjCisgKiBAbnNlcTogc2VxdWVuY2Ugb2YgdTE2IHdvcmRzIGluIGZvcm1hdDoKKyAqCShOLCBhZGRyZXNzLCB2YWx1ZVsxXS4uLnZhbHVlW04tMV0pKiwwCisgKiBFeC46CisgKgl1MTYgc2VxW10gPSB7IE5TRVEoMHg0MDAwLCAxLCAxKSwgTlNFUSgweDQwMTAsIDY0MCwgNDgwKSwgMCB9OworICoJcmV0ID0gczVrNWJhZl93cml0ZV9uc2VxKGMsIHNlcSk7CisgKi8KK3N0YXRpYyB2b2lkIHM1azViYWZfd3JpdGVfbnNlcShzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIGNvbnN0IHUxNiAqbnNlcSkKK3sKKwlpbnQgY291bnQ7CisKKwl3aGlsZSAoKGNvdW50ID0gKm5zZXErKykpIHsKKwkJdTE2IGFkZHIgPSAqbnNlcSsrOworCQktLWNvdW50OworCisJCXM1azViYWZfd3JpdGVfYXJyX3NlcShzdGF0ZSwgYWRkciwgY291bnQsIG5zZXEpOworCQluc2VxICs9IGNvdW50OworCX0KK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9zeW5jaHJvbml6ZShzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIGludCB0aW1lb3V0LCB1MTYgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCXUxNiByZWc7CisKKwlzNWs1YmFmX3dyaXRlKHN0YXRlLCBhZGRyLCAxKTsKKwlkbyB7CisJCXJlZyA9IHM1azViYWZfcmVhZChzdGF0ZSwgYWRkcik7CisJCWlmIChzdGF0ZS0+ZXJyb3IgfHwgIXJlZykKKwkJCXJldHVybjsKKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDEwMDAwKTsKKwl9IHdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSk7CisKKwl2NGwyX2Vycigmc3RhdGUtPnNkLCAidGltZW91dCBvbiByZWdpc3RlciBzeW5jaHJvbml6ZSAoJSN4KVxuIiwgYWRkcik7CisJc3RhdGUtPmVycm9yID0gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHUxNiAqczVrNWJhZl9md19nZXRfc2VxKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSwgdTE2IHNlcV9pZCkKK3sKKwlzdHJ1Y3QgczVrNWJhZl9mdyAqZncgPSBzdGF0ZS0+Znc7CisJdTE2ICpkYXRhOworCWludCBpOworCisJaWYgKGZ3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZGF0YSA9IGZ3LT5kYXRhICsgMiAqIGZ3LT5jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBmdy0+Y291bnQ7ICsraSkgeworCQlpZiAoZnctPnNlcVtpXS5pZCA9PSBzZXFfaWQpCisJCQlyZXR1cm4gZGF0YSArIGZ3LT5zZXFbaV0ub2Zmc2V0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3BhdGNoKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwl1MTYgKnNlcSA9IHM1azViYWZfZndfZ2V0X3NlcShzdGF0ZSwgUzVLNUJBRl9GV19JRF9QQVRDSCk7CisKKwlpZiAoc2VxKQorCQlzNWs1YmFmX3dyaXRlX25zZXEoc3RhdGUsIHNlcSk7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc2V0X2Nsb2NrcyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBtY2xrID0gc3RhdGUtPm1jbGtfZnJlcXVlbmN5IC8gMTAwMDsKKwl1MTYgc3RhdHVzOworCXN0YXRpYyBjb25zdCB1MTYgbnNlcV9jbGtfY2ZnW10gPSB7CisJCU5TRVEoUkVHX0lfVVNFX05QVklfQ0xPQ0tTLAorCQkgIE5QVklfQ0xPQ0tTLCBOTUlQSV9DTE9DS1MsIDAsCisJCSAgU0NMS19QVklfRlJFUSAvIDQsIFBDTEtfTUlOX0ZSRVEgLyA0LCBQQ0xLX01BWF9GUkVRIC8gNCwKKwkJICBTQ0xLX01JUElfRlJFUSAvIDQsIFBDTEtfTUlOX0ZSRVEgLyA0LCBQQ0xLX01BWF9GUkVRIC8gNCksCisJCU5TRVEoUkVHX0lfVVNFX1JFR1NfQVBJLCAxKSwKKwkJMAorCX07CisKKwlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX0lfSU5DTEtfRlJFUV9MLCBtY2xrICYgMHhmZmZmLCBtY2xrID4+IDE2KTsKKwlzNWs1YmFmX3dyaXRlX25zZXEoc3RhdGUsIG5zZXFfY2xrX2NmZyk7CisKKwlzNWs1YmFmX3N5bmNocm9uaXplKHN0YXRlLCAyNTAsIFJFR19JX0lOSVRfUEFSQU1TX1VQREFURUQpOworCXN0YXR1cyA9IHM1azViYWZfcmVhZChzdGF0ZSwgUkVHX0lfRVJST1JfSU5GTyk7CisJaWYgKCFzdGF0ZS0+ZXJyb3IgJiYgc3RhdHVzKSB7CisJCXY0bDJfZXJyKCZzdGF0ZS0+c2QsICJlcnJvciBjb25maWd1cmluZyBQTEwgKCVkKVxuIiwgc3RhdHVzKTsKKwkJc3RhdGUtPmVycm9yID0gLUVJTlZBTDsKKwl9Cit9CisKKy8qIHNldCBjdXN0b20gY29sb3IgY29ycmVjdGlvbiBtYXRyaWNlcyBmb3IgdmFyaW91cyBpbGx1bWluYXRpb25zICovCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3NldF9jY20oc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXUxNiAqc2VxID0gczVrNWJhZl9md19nZXRfc2VxKHN0YXRlLCBTNUs1QkFGX0ZXX0lEX0NDTSk7CisKKwlpZiAoc2VxKQorCQlzNWs1YmFmX3dyaXRlX25zZXEoc3RhdGUsIHNlcSk7Cit9CisKKy8qIENJUyBzZW5zb3IgdHVuaW5nLCBiYXNlZCBvbiB1bmRvY3VtZW50ZWQgYW5kcm9pZCBkcml2ZXIgY29kZSAqLworc3RhdGljIHZvaWQgczVrNWJhZl9od19zZXRfY2lzKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwl1MTYgKnNlcSA9IHM1azViYWZfZndfZ2V0X3NlcShzdGF0ZSwgUzVLNUJBRl9GV19JRF9DSVMpOworCisJaWYgKCFzZXEpCisJCXJldHVybjsKKworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfQ01EV1JfUEFHRSwgUEFHRV9JRl9IVyk7CisJczVrNWJhZl93cml0ZV9uc2VxKHN0YXRlLCBzZXEpOworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfQ01EV1JfUEFHRSwgUEFHRV9JRl9TVyk7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc3luY19jZmcoc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXM1azViYWZfd3JpdGUoc3RhdGUsIFJFR19HX1BSRVZfQ0ZHX0NIRywgMSk7CisJaWYgKHN0YXRlLT5hcHBseV9jcm9wKSB7CisJCXM1azViYWZfd3JpdGUoc3RhdGUsIFJFR19HX0lOUFVUU19DSEFOR0VfUkVRLCAxKTsKKwkJczVrNWJhZl93cml0ZShzdGF0ZSwgUkVHX0dfUFJFVl9DRkdfQllQQVNTX0NIQU5HRUQsIDEpOworCX0KKwlzNWs1YmFmX3N5bmNocm9uaXplKHN0YXRlLCA1MDAsIFJFR19HX05FV19DRkdfU1lOQyk7Cit9CisvKiBTZXQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW1hZ2UgZmxpcHBpbmcgKi8KK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc2V0X21pcnJvcihzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJdTE2IGZsaXAgPSBzdGF0ZS0+Y3RybHMudmZsaXAtPnZhbCB8IChzdGF0ZS0+Y3RybHMudmZsaXAtPnZhbCA8PCAxKTsKKworCXM1azViYWZfd3JpdGUoc3RhdGUsIFJFR19QX1BSRVZfTUlSUk9SKDApLCBmbGlwKTsKKwlpZiAoc3RhdGUtPnN0cmVhbWluZykKKwkJczVrNWJhZl9od19zeW5jX2NmZyhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc2V0X2FsZyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIHUxNiBhbGcsIGJvb2wgZW5hYmxlKQoreworCXUxNiBjdXJfYWxnLCBuZXdfYWxnOworCisJaWYgKCFzdGF0ZS0+dmFsaWRfYXV0b19hbGcpCisJCWN1cl9hbGcgPSBzNWs1YmFmX3JlYWQoc3RhdGUsIFJFR19EQkdfQVVUT0FMR19FTik7CisJZWxzZQorCQljdXJfYWxnID0gc3RhdGUtPmF1dG9fYWxnOworCisJbmV3X2FsZyA9IGVuYWJsZSA/IChjdXJfYWxnIHwgYWxnKSA6IChjdXJfYWxnICYgfmFsZyk7CisKKwlpZiAobmV3X2FsZyAhPSBjdXJfYWxnKQorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfREJHX0FVVE9BTEdfRU4sIG5ld19hbGcpOworCisJaWYgKHN0YXRlLT5lcnJvcikKKwkJcmV0dXJuOworCisJc3RhdGUtPnZhbGlkX2F1dG9fYWxnID0gMTsKKwlzdGF0ZS0+YXV0b19hbGcgPSBuZXdfYWxnOworfQorCisvKiBDb25maWd1cmUgYXV0by9tYW51YWwgd2hpdGUgYmFsYW5jZSBhbmQgUi9HL0IgZ2FpbnMgKi8KK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc2V0X2F3YihzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIGludCBhd2IpCit7CisJc3RydWN0IHM1azViYWZfY3RybHMgKmN0cmxzID0gJnN0YXRlLT5jdHJsczsKKworCWlmICghYXdiKQorCQlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX1NGX1JHQUlOLAorCQkJCSAgY3RybHMtPmdhaW5fcmVkLT52YWwsIDEsCisJCQkJICBTNUs1QkFGX0dBSU5fR1JFRU5fREVGLCAxLAorCQkJCSAgY3RybHMtPmdhaW5fYmx1ZS0+dmFsLCAxLAorCQkJCSAgMSk7CisKKwlzNWs1YmFmX2h3X3NldF9hbGcoc3RhdGUsIEFBTEdfV0JfRU4sIGF3Yik7Cit9CisKKy8qIFByb2dyYW0gRlcgd2l0aCBleHBvc3VyZSB0aW1lLCAnZXhwb3N1cmUnIGluIHVzIHVuaXRzICovCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3NldF91c2VyX2V4cG9zdXJlKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSwgaW50IGV4cG9zdXJlKQoreworCXVuc2lnbmVkIGludCB0aW1lID0gZXhwb3N1cmUgLyAxMDsKKworCXM1azViYWZfd3JpdGVfc2VxKHN0YXRlLCBSRUdfU0ZfVVNSX0VYUE9TVVJFX0wsCisJCQkgIHRpbWUgJiAweGZmZmYsIHRpbWUgPj4gMTYsIDEpOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3NldF91c2VyX2dhaW4oc3RydWN0IHM1azViYWYgKnN0YXRlLCBpbnQgZ2FpbikKK3sKKwlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX1NGX1VTUl9UT1RfR0FJTiwgZ2FpbiwgMSk7Cit9CisKKy8qIFNldCBhdXRvL21hbnVhbCBleHBvc3VyZSBhbmQgdG90YWwgZ2FpbiAqLworc3RhdGljIHZvaWQgczVrNWJhZl9od19zZXRfYXV0b19leHBvc3VyZShzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gVjRMMl9FWFBPU1VSRV9BVVRPKSB7CisJCXM1azViYWZfaHdfc2V0X2FsZyhzdGF0ZSwgQUFMR19BRV9FTiB8IEFBTEdfRElWTEVJX0VOLCB0cnVlKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgZXhwX3RpbWUgPSBzdGF0ZS0+Y3RybHMuZXhwb3N1cmUtPnZhbDsKKworCQlzNWs1YmFmX2h3X3NldF91c2VyX2V4cG9zdXJlKHN0YXRlLCBleHBfdGltZSk7CisJCXM1azViYWZfaHdfc2V0X3VzZXJfZ2FpbihzdGF0ZSwgc3RhdGUtPmN0cmxzLmdhaW4tPnZhbCk7CisJCXM1azViYWZfaHdfc2V0X2FsZyhzdGF0ZSwgQUFMR19BRV9FTiB8IEFBTEdfRElWTEVJX0VOLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3NldF9hbnRpX2ZsaWNrZXIoc3RydWN0IHM1azViYWYgKnN0YXRlLCBpbnQgdikKK3sKKwlpZiAodiA9PSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9BVVRPKSB7CisJCXM1azViYWZfaHdfc2V0X2FsZyhzdGF0ZSwgQUFMR19GTElDS0VSX0VOLCB0cnVlKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgVjRMMl9DSURfTElORV9GUkVRVUVOQ1kgY29udHJvbCB2YWx1ZXMgbWF0Y2gKKwkJICogdGhlIHJlZ2lzdGVyIHZhbHVlcyAqLworCQlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX1NGX0ZMSUNLRVJfUVVBTlQsIHYsIDEpOworCQlzNWs1YmFmX2h3X3NldF9hbGcoc3RhdGUsIEFBTEdfRkxJQ0tFUl9FTiwgZmFsc2UpOworCX0KK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9od19zZXRfY29sb3JmeChzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsIGludCB2YWwpCit7CisJc3RhdGljIGNvbnN0IHUxNiBjb2xvcmZ4W10gPSB7CisJCVtWNEwyX0NPTE9SRlhfTk9ORV0gPSAwLAorCQlbVjRMMl9DT0xPUkZYX0JXXSA9IDEsCisJCVtWNEwyX0NPTE9SRlhfTkVHQVRJVkVdID0gMiwKKwkJW1Y0TDJfQ09MT1JGWF9TRVBJQV0gPSAzLAorCQlbVjRMMl9DT0xPUkZYX1NLWV9CTFVFXSA9IDQsCisJCVtWNEwyX0NPTE9SRlhfU0tFVENIXSA9IDUsCisJfTsKKworCXM1azViYWZfd3JpdGUoc3RhdGUsIFJFR19HX1NQRUNfRUZGRUNUUywgY29sb3JmeFt2YWxdKTsKK30KKworc3RhdGljIGludCBzNWs1YmFmX2ZpbmRfcGl4Zm10KHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCWludCBpLCBjID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNWs1YmFmX2Zvcm1hdHMpOyBpKyspIHsKKwkJaWYgKG1mLT5jb2xvcnNwYWNlICE9IHM1azViYWZfZm9ybWF0c1tpXS5jb2xvcnNwYWNlKQorCQkJY29udGludWU7CisJCWlmIChtZi0+Y29kZSA9PSBzNWs1YmFmX2Zvcm1hdHNbaV0uY29kZSkKKwkJCXJldHVybiBpOworCQlpZiAoYyA8IDApCisJCQljID0gaTsKKwl9CisJcmV0dXJuIChjIDwgMCkgPyAwIDogYzsKK30KKworc3RhdGljIGludCBzNWs1YmFmX2NsZWFyX2Vycm9yKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gc3RhdGUtPmVycm9yOworCisJc3RhdGUtPmVycm9yID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azViYWZfaHdfc2V0X3ZpZGVvX2J1cyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJdTE2IGVuX3BrdHM7CisKKwlpZiAoc3RhdGUtPmJ1c190eXBlID09IFY0TDJfTUJVU19DU0kyKQorCQllbl9wa3RzID0gRU5fUEFDS0VUU19DU0kyOworCWVsc2UKKwkJZW5fcGt0cyA9IDA7CisKKwlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX09JRl9FTl9NSVBJX0xBTkVTLAorCQkJICBzdGF0ZS0+bmxhbmVzLCBlbl9wa3RzLCAxKTsKKworCXJldHVybiBzNWs1YmFmX2NsZWFyX2Vycm9yKHN0YXRlKTsKK30KKworc3RhdGljIHUxNiBzNWs1YmFmX2dldF9jZmdfZXJyb3Ioc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXUxNiBlcnIgPSBzNWs1YmFmX3JlYWQoc3RhdGUsIFJFR19HX1BSRVZfQ0ZHX0VSUk9SKTsKKwlpZiAoZXJyKQorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfR19QUkVWX0NGR19FUlJPUiwgMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9od19zZXRfZml2KHN0cnVjdCBzNWs1YmFmICpzdGF0ZSwgdTE2IGZpdikKK3sKKwlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfUF9NQVhfRlJfVElNRSgwKSwgZml2KTsKKwlzNWs1YmFmX2h3X3N5bmNfY2ZnKHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9od19maW5kX21pbl9maXYoc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXUxNiBlcnIsIGZpdjsKKwlpbnQgbjsKKworCWZpdiA9IHM1azViYWZfcmVhZChzdGF0ZSwgIFJFR19HX0FDVFVBTF9QX0ZSX1RJTUUpOworCWlmIChzdGF0ZS0+ZXJyb3IpCisJCXJldHVybjsKKworCWZvciAobiA9IDU7IG4gPiAwOyAtLW4pIHsKKwkJczVrNWJhZl9od19zZXRfZml2KHN0YXRlLCBmaXYpOworCQllcnIgPSBzNWs1YmFmX2dldF9jZmdfZXJyb3Ioc3RhdGUpOworCQlpZiAoc3RhdGUtPmVycm9yKQorCQkJcmV0dXJuOworCQlzd2l0Y2ggKGVycikgeworCQljYXNlIENGR19FUlJPUl9SQU5HRToKKwkJCSsrZml2OworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCXN0YXRlLT5maXYgPSBmaXY7CisJCQl2NGwyX2luZm8oJnN0YXRlLT5zZCwKKwkJCQkgICJmb3VuZCB2YWxpZCBmcmFtZSBpbnRlcnZhbDogJWQwMHVzXG4iLCBmaXYpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJdjRsMl9lcnIoJnN0YXRlLT5zZCwKKwkJCQkgImVycm9yIHNldHRpbmcgZnJhbWUgaW50ZXJ2YWw6ICVkXG4iLCBlcnIpOworCQkJc3RhdGUtPmVycm9yID0gLUVJTlZBTDsKKwkJfQorCX07CisJdjRsMl9lcnIoJnN0YXRlLT5zZCwgImNhbm5vdCBmaW5kIGNvcnJlY3QgZnJhbWUgaW50ZXJ2YWxcbiIpOworCXN0YXRlLT5lcnJvciA9IC1FUkFOR0U7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfdmFsaWRhdGVfY2ZnKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwl1MTYgZXJyOworCisJZXJyID0gczVrNWJhZl9nZXRfY2ZnX2Vycm9yKHN0YXRlKTsKKwlpZiAoc3RhdGUtPmVycm9yKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgMDoKKwkJc3RhdGUtPmFwcGx5X2NmZyA9IDE7CisJCXJldHVybjsKKwljYXNlIENGR19FUlJPUl9SQU5HRToKKwkJczVrNWJhZl9od19maW5kX21pbl9maXYoc3RhdGUpOworCQlpZiAoIXN0YXRlLT5lcnJvcikKKwkJCXN0YXRlLT5hcHBseV9jZmcgPSAxOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJdjRsMl9lcnIoJnN0YXRlLT5zZCwKKwkJCSAiZXJyb3Igc2V0dGluZyBmb3JtYXQ6ICVkXG4iLCBlcnIpOworCQlzdGF0ZS0+ZXJyb3IgPSAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9yZXNjYWxlKHN0cnVjdCB2NGwyX3JlY3QgKnIsIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QgKnYsCisJCQkgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqbiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0ICpkKQoreworCXItPmxlZnQgPSB2LT5sZWZ0ICogbi0+d2lkdGggLyBkLT53aWR0aDsKKwlyLT50b3AgPSB2LT50b3AgKiBuLT5oZWlnaHQgLyBkLT5oZWlnaHQ7CisJci0+d2lkdGggPSB2LT53aWR0aCAqIG4tPndpZHRoIC8gZC0+d2lkdGg7CisJci0+aGVpZ2h0ID0gdi0+aGVpZ2h0ICogbi0+aGVpZ2h0IC8gZC0+aGVpZ2h0OworfQorCitzdGF0aWMgaW50IHM1azViYWZfaHdfc2V0X2Nyb3BfcmVjdHMoc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXN0cnVjdCB2NGwyX3JlY3QgKnAsIHI7CisJdTE2IGVycjsKKwlpbnQgcmV0OworCisJcCA9ICZzdGF0ZS0+Y3JvcF9zaW5rOworCXM1azViYWZfd3JpdGVfc2VxKHN0YXRlLCBSRUdfR19QUkVWUkVRX0lOX1dJRFRILCBwLT53aWR0aCwgcC0+aGVpZ2h0LAorCQkJICBwLT5sZWZ0LCBwLT50b3ApOworCisJczVrNWJhZl9yZXNjYWxlKCZyLCAmc3RhdGUtPmNyb3Bfc291cmNlLCAmc3RhdGUtPmNyb3Bfc2luaywKKwkJCSZzdGF0ZS0+Y29tcG9zZSk7CisJczVrNWJhZl93cml0ZV9zZXEoc3RhdGUsIFJFR19HX1BSRVZaT09NX0lOX1dJRFRILCByLndpZHRoLCByLmhlaWdodCwKKwkJCSAgci5sZWZ0LCByLnRvcCk7CisKKwlzNWs1YmFmX3N5bmNocm9uaXplKHN0YXRlLCA1MDAsIFJFR19HX0lOUFVUU19DSEFOR0VfUkVRKTsKKwlzNWs1YmFmX3N5bmNocm9uaXplKHN0YXRlLCA1MDAsIFJFR19HX1BSRVZfQ0ZHX0JZUEFTU19DSEFOR0VEKTsKKwllcnIgPSBzNWs1YmFmX2dldF9jZmdfZXJyb3Ioc3RhdGUpOworCXJldCA9IHM1azViYWZfY2xlYXJfZXJyb3Ioc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChlcnIpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgQ0ZHX0VSUk9SX1JBTkdFOgorCQkvKiByZXRyeSBjcm9wIHdpdGggZnJhbWUgaW50ZXJ2YWwgc2V0IHRvIG1heCAqLworCQlzNWs1YmFmX2h3X3NldF9maXYoc3RhdGUsIFM1SzVCQUZfTUFYX0ZSX1RJTUUpOworCQllcnIgPSBzNWs1YmFmX2dldF9jZmdfZXJyb3Ioc3RhdGUpOworCQlyZXQgPSBzNWs1YmFmX2NsZWFyX2Vycm9yKHN0YXRlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoZXJyKSB7CisJCQl2NGwyX2Vycigmc3RhdGUtPnNkLAorCQkJCSAiY3JvcCBlcnJvciBvbiBtYXggZnJhbWUgaW50ZXJ2YWw6ICVkXG4iLCBlcnIpOworCQkJc3RhdGUtPmVycm9yID0gLUVJTlZBTDsKKwkJfQorCQlzNWs1YmFmX2h3X3NldF9maXYoc3RhdGUsIHN0YXRlLT5yZXFfZml2KTsKKwkJczVrNWJhZl9od192YWxpZGF0ZV9jZmcoc3RhdGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGwyX2Vycigmc3RhdGUtPnNkLCAiY3JvcCBlcnJvcjogJWRcbiIsIGVycik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghc3RhdGUtPmFwcGx5X2NmZykKKwkJcmV0dXJuIDA7CisKKwlwID0gJnN0YXRlLT5jcm9wX3NvdXJjZTsKKwlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX1BfT1VUX1dJRFRIKDApLCBwLT53aWR0aCwgcC0+aGVpZ2h0KTsKKwlzNWs1YmFmX2h3X3NldF9maXYoc3RhdGUsIHN0YXRlLT5yZXFfZml2KTsKKwlzNWs1YmFmX2h3X3ZhbGlkYXRlX2NmZyhzdGF0ZSk7CisKKwlyZXR1cm4gczVrNWJhZl9jbGVhcl9lcnJvcihzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfaHdfc2V0X2NvbmZpZyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJdTE2IHJlZ19mbXQgPSBzNWs1YmFmX2Zvcm1hdHNbc3RhdGUtPnBpeGZtdF0ucmVnX3BfZm10OworCXN0cnVjdCB2NGwyX3JlY3QgKnIgPSAmc3RhdGUtPmNyb3Bfc291cmNlOworCisJczVrNWJhZl93cml0ZV9zZXEoc3RhdGUsIFJFR19QX09VVF9XSURUSCgwKSwKKwkJCSAgci0+d2lkdGgsIHItPmhlaWdodCwgcmVnX2ZtdCwKKwkJCSAgUENMS19NQVhfRlJFUSA+PiAyLCBQQ0xLX01JTl9GUkVRID4+IDIsCisJCQkgIFBWSV9NQVNLX01JUEksIENMS19NSVBJX0lOREVYLAorCQkJICBGUl9SQVRFX0ZJWEVELCBGUl9SQVRFX1FfRFlOQU1JQywKKwkJCSAgc3RhdGUtPnJlcV9maXYsIFM1SzVCQUZfTUlOX0ZSX1RJTUUpOworCXM1azViYWZfaHdfc3luY19jZmcoc3RhdGUpOworCXM1azViYWZfaHdfdmFsaWRhdGVfY2ZnKHN0YXRlKTsKK30KKworCitzdGF0aWMgdm9pZCBzNWs1YmFmX2h3X3NldF90ZXN0X3BhdHRlcm4oc3RydWN0IHM1azViYWYgKnN0YXRlLCBpbnQgaWQpCit7CisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19QQVRURVJOX1dJRFRILCA4MDApOworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfUEFUVEVSTl9IRUlHSFQsIDUxMSk7CisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19QQVRURVJOX1BBUkFNLCAwKTsKKwlzNWs1YmFmX2kyY193cml0ZShzdGF0ZSwgUkVHX1BBVFRFUk5fU0VULCBpZCk7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfZ3Bpb19hc3NlcnQoc3RydWN0IHM1azViYWYgKnN0YXRlLCBpbnQgaWQpCit7CisJc3RydWN0IHM1azViYWZfZ3BpbyAqZ3BpbyA9ICZzdGF0ZS0+Z3Bpb3NbaWRdOworCisJZ3Bpb19zZXRfdmFsdWUoZ3Bpby0+Z3BpbywgZ3Bpby0+bGV2ZWwpOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX2dwaW9fZGVhc3NlcnQoc3RydWN0IHM1azViYWYgKnN0YXRlLCBpbnQgaWQpCit7CisJc3RydWN0IHM1azViYWZfZ3BpbyAqZ3BpbyA9ICZzdGF0ZS0+Z3Bpb3NbaWRdOworCisJZ3Bpb19zZXRfdmFsdWUoZ3Bpby0+Z3BpbywgIWdwaW8tPmxldmVsKTsKK30KKworc3RhdGljIGludCBzNWs1YmFmX3Bvd2VyX29uKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKFM1SzVCQUZfTlVNX1NVUFBMSUVTLCBzdGF0ZS0+c3VwcGxpZXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IGNsa19zZXRfcmF0ZShzdGF0ZS0+Y2xvY2ssIHN0YXRlLT5tY2xrX2ZyZXF1ZW5jeSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlZ19kaXM7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3RhdGUtPmNsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVnX2RpczsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmc3RhdGUtPnNkLCAiY2xvY2sgZnJlcXVlbmN5OiAlbGRcbiIsCisJCSBjbGtfZ2V0X3JhdGUoc3RhdGUtPmNsb2NrKSk7CisKKwlzNWs1YmFmX2dwaW9fZGVhc3NlcnQoc3RhdGUsIFNUQlkpOworCXVzbGVlcF9yYW5nZSg1MCwgMTAwKTsKKwlzNWs1YmFmX2dwaW9fZGVhc3NlcnQoc3RhdGUsIFJTVCk7CisJcmV0dXJuIDA7CisKK2Vycl9yZWdfZGlzOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoUzVLNUJBRl9OVU1fU1VQUExJRVMsIHN0YXRlLT5zdXBwbGllcyk7CitlcnI6CisJdjRsMl9lcnIoJnN0YXRlLT5zZCwgIiVzKCkgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9wb3dlcl9vZmYoc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCWludCByZXQ7CisKKwlzdGF0ZS0+c3RyZWFtaW5nID0gMDsKKwlzdGF0ZS0+YXBwbHlfY2ZnID0gMDsKKwlzdGF0ZS0+YXBwbHlfY3JvcCA9IDA7CisKKwlzNWs1YmFmX2dwaW9fYXNzZXJ0KHN0YXRlLCBSU1QpOworCXM1azViYWZfZ3Bpb19hc3NlcnQoc3RhdGUsIFNUQlkpOworCisJaWYgKCFJU19FUlIoc3RhdGUtPmNsb2NrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN0YXRlLT5jbG9jayk7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKFM1SzVCQUZfTlVNX1NVUFBMSUVTLAorCQkJCQlzdGF0ZS0+c3VwcGxpZXMpOworCWlmIChyZXQgPCAwKQorCQl2NGwyX2Vycigmc3RhdGUtPnNkLCAiZmFpbGVkIHRvIGRpc2FibGUgcmVndWxhdG9yc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9od19pbml0KHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwlzNWs1YmFmX2kyY193cml0ZShzdGF0ZSwgQUhCX01TQl9BRERSX1BUUiwgUEFHRV9JRl9IVyk7CisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19DTEVBUl9IT1NUX0lOVCwgMCk7CisJczVrNWJhZl9pMmNfd3JpdGUoc3RhdGUsIFJFR19TV19MT0FEX0NPTVBMRVRFLCAxKTsKKwlzNWs1YmFmX2kyY193cml0ZShzdGF0ZSwgUkVHX0NNRFJEX1BBR0UsIFBBR0VfSUZfU1cpOworCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfQ01EV1JfUEFHRSwgUEFHRV9JRl9TVyk7Cit9CisKKy8qCisgKiBWNEwyIHN1YmRldiBjb3JlIGFuZCB2aWRlbyBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIHZvaWQgczVrNWJhZl9pbml0aWFsaXplX2RhdGEoc3RydWN0IHM1azViYWYgKnN0YXRlKQoreworCXN0YXRlLT5waXhmbXQgPSAwOworCXN0YXRlLT5yZXFfZml2ID0gMTAwMDAgLyAxNTsKKwlzdGF0ZS0+Zml2ID0gc3RhdGUtPnJlcV9maXY7CisJc3RhdGUtPnZhbGlkX2F1dG9fYWxnID0gMDsKK30KKworc3RhdGljIGludCBzNWs1YmFmX2xvYWRfc2V0ZmlsZShzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzdGF0ZS0+c2QpOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBTNUs1QkFGX0ZXX0ZJTEVOQU1FLCAmYy0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfd2FybigmYy0+ZGV2LCAiZmlybXdhcmUgZmlsZSAoJXMpIG5vdCBsb2FkZWRcbiIsCisJCQkgUzVLNUJBRl9GV19GSUxFTkFNRSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gczVrNWJhZl9md19wYXJzZSgmYy0+ZGV2LCAmc3RhdGUtPmZ3LCBmdy0+c2l6ZSAvIDIsCisJCQkgICAgICAgKHUxNiAqKWZ3LT5kYXRhKTsKKworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs1YmFmX3NldF9wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IHM1azViYWYgKnN0YXRlID0gdG9fczVrNWJhZihzZCk7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7CisKKwlpZiAoIW9uICE9IHN0YXRlLT5wb3dlcikKKwkJZ290byBvdXQ7CisKKwlpZiAob24pIHsKKwkJaWYgKHN0YXRlLT5mdyA9PSBOVUxMKQorCQkJczVrNWJhZl9sb2FkX3NldGZpbGUoc3RhdGUpOworCisJCXM1azViYWZfaW5pdGlhbGl6ZV9kYXRhKHN0YXRlKTsKKwkJcmV0ID0gczVrNWJhZl9wb3dlcl9vbihzdGF0ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJczVrNWJhZl9od19pbml0KHN0YXRlKTsKKwkJczVrNWJhZl9od19wYXRjaChzdGF0ZSk7CisJCXM1azViYWZfaTJjX3dyaXRlKHN0YXRlLCBSRUdfU0VUX0hPU1RfSU5ULCAxKTsKKwkJczVrNWJhZl9od19zZXRfY2xvY2tzKHN0YXRlKTsKKworCQlyZXQgPSBzNWs1YmFmX2h3X3NldF92aWRlb19idXMoc3RhdGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXM1azViYWZfaHdfc2V0X2NpcyhzdGF0ZSk7CisJCXM1azViYWZfaHdfc2V0X2NjbShzdGF0ZSk7CisKKwkJcmV0ID0gczVrNWJhZl9jbGVhcl9lcnJvcihzdGF0ZSk7CisJCWlmICghcmV0KQorCQkJc3RhdGUtPnBvd2VyKys7CisJfSBlbHNlIHsKKwkJczVrNWJhZl9wb3dlcl9vZmYoc3RhdGUpOworCQlzdGF0ZS0+cG93ZXItLTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKworCWlmICghcmV0ICYmIG9uKQorCQlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmc3RhdGUtPmN0cmxzLmhhbmRsZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgczVrNWJhZl9od19zZXRfc3RyZWFtKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSwgaW50IGVuYWJsZSkKK3sKKwlzNWs1YmFmX3dyaXRlX3NlcShzdGF0ZSwgUkVHX0dfRU5BQkxFX1BSRVYsIGVuYWJsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IHM1azViYWYgKnN0YXRlID0gdG9fczVrNWJhZihzZCk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0YXRlLT5sb2NrKTsKKworCWlmIChzdGF0ZS0+c3RyZWFtaW5nID09ICEhb24pIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG9uKSB7CisJCXM1azViYWZfaHdfc2V0X2NvbmZpZyhzdGF0ZSk7CisJCXJldCA9IHM1azViYWZfaHdfc2V0X2Nyb3BfcmVjdHMoc3RhdGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzNWs1YmFmX2h3X3NldF9zdHJlYW0oc3RhdGUsIDEpOworCQlzNWs1YmFmX2kyY193cml0ZShzdGF0ZSwgMHhiMGNjLCAweDAwMGIpOworCX0gZWxzZSB7CisJCXM1azViYWZfaHdfc2V0X3N0cmVhbShzdGF0ZSwgMCk7CisJfQorCXJldCA9IHM1azViYWZfY2xlYXJfZXJyb3Ioc3RhdGUpOworCWlmICghcmV0KQorCQlzdGF0ZS0+c3RyZWFtaW5nID0gIXN0YXRlLT5zdHJlYW1pbmc7CisKK291dDoKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9nX2ZyYW1lX2ludGVydmFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsICpmaSkKK3sKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKworCW11dGV4X2xvY2soJnN0YXRlLT5sb2NrKTsKKwlmaS0+aW50ZXJ2YWwubnVtZXJhdG9yID0gc3RhdGUtPmZpdjsKKwlmaS0+aW50ZXJ2YWwuZGVub21pbmF0b3IgPSAxMDAwMDsKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX3NldF9mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgczVrNWJhZiAqc3RhdGUsCisJCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAqZmkpCit7CisJc3RydWN0IHY0bDJfZnJhY3QgKmkgPSAmZmktPmludGVydmFsOworCisJaWYgKGZpLT5pbnRlcnZhbC5kZW5vbWluYXRvciA9PSAwKQorCQlzdGF0ZS0+cmVxX2ZpdiA9IFM1SzVCQUZfTUFYX0ZSX1RJTUU7CisJZWxzZQorCQlzdGF0ZS0+cmVxX2ZpdiA9IGNsYW1wX3QodTMyLAorCQkJCQkgaS0+bnVtZXJhdG9yICogMTAwMDAgLyBpLT5kZW5vbWluYXRvciwKKwkJCQkJIFM1SzVCQUZfTUlOX0ZSX1RJTUUsCisJCQkJCSBTNUs1QkFGX01BWF9GUl9USU1FKTsKKworCXN0YXRlLT5maXYgPSBzdGF0ZS0+cmVxX2ZpdjsKKwlpZiAoc3RhdGUtPmFwcGx5X2NmZykgeworCQlzNWs1YmFmX2h3X3NldF9maXYoc3RhdGUsIHN0YXRlLT5yZXFfZml2KTsKKwkJczVrNWJhZl9od192YWxpZGF0ZV9jZmcoc3RhdGUpOworCX0KKwkqaSA9IChzdHJ1Y3QgdjRsMl9mcmFjdCl7IHN0YXRlLT5maXYsIDEwMDAwIH07CisJaWYgKHN0YXRlLT5maXYgPT0gc3RhdGUtPnJlcV9maXYpCisJCXY0bDJfaW5mbygmc3RhdGUtPnNkLCAiZnJhbWUgaW50ZXJ2YWwgY2hhbmdlZCB0byAlZDAwdXNcbiIsCisJCQkgIHN0YXRlLT5maXYpOworfQorCitzdGF0aWMgaW50IHM1azViYWZfc19mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAqZmkpCit7CisJc3RydWN0IHM1azViYWYgKnN0YXRlID0gdG9fczVrNWJhZihzZCk7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7CisJczVrNWJhZl9zZXRfZnJhbWVfaW50ZXJ2YWwoc3RhdGUsIGZpKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFY0TDIgc3ViZGV2IHBhZCBsZXZlbCBhbmQgdmlkZW8gb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IHM1azViYWZfZW51bV9mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbF9lbnVtICpmaWUpCit7CisJaWYgKGZpZS0+aW5kZXggPiBTNUs1QkFGX01BWF9GUl9USU1FIC0gUzVLNUJBRl9NSU5fRlJfVElNRSB8fAorCSAgICBmaWUtPnBhZCAhPSBQQURfQ0lTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmZmllLT53aWR0aCwgUzVLNUJBRl9XSU5fV0lEVEhfTUlOLAorCQkJICAgICAgUzVLNUJBRl9DSVNfV0lEVEgsIDEsCisJCQkgICAgICAmZmllLT5oZWlnaHQsIFM1SzVCQUZfV0lOX0hFSUdIVF9NSU4sCisJCQkgICAgICBTNUs1QkFGX0NJU19IRUlHSFQsIDEsIDApOworCisJZmllLT5pbnRlcnZhbC5udW1lcmF0b3IgPSBTNUs1QkFGX01JTl9GUl9USU1FICsgZmllLT5pbmRleDsKKwlmaWUtPmludGVydmFsLmRlbm9taW5hdG9yID0gMTAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWs1YmFmX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlpZiAoY29kZS0+cGFkID09IFBBRF9DSVMpIHsKKwkJaWYgKGNvZGUtPmluZGV4ID4gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljb2RlLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNvZGUtPmluZGV4ID49IEFSUkFZX1NJWkUoczVrNWJhZl9mb3JtYXRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb2RlLT5jb2RlID0gczVrNWJhZl9mb3JtYXRzW2NvZGUtPmluZGV4XS5jb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azViYWZfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCWludCBpOworCisJaWYgKGZzZS0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc2UtPnBhZCA9PSBQQURfQ0lTKSB7CisJCWZzZS0+Y29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQ7CisJCWZzZS0+bWluX3dpZHRoID0gUzVLNUJBRl9DSVNfV0lEVEg7CisJCWZzZS0+bWF4X3dpZHRoID0gUzVLNUJBRl9DSVNfV0lEVEg7CisJCWZzZS0+bWluX2hlaWdodCA9IFM1SzVCQUZfQ0lTX0hFSUdIVDsKKwkJZnNlLT5tYXhfaGVpZ2h0ID0gUzVLNUJBRl9DSVNfSEVJR0hUOworCQlyZXR1cm4gMDsKKwl9CisKKwlpID0gQVJSQVlfU0laRShzNWs1YmFmX2Zvcm1hdHMpOworCXdoaWxlICgtLWkpCisJCWlmIChmc2UtPmNvZGUgPT0gczVrNWJhZl9mb3JtYXRzW2ldLmNvZGUpCisJCQlicmVhazsKKwlmc2UtPmNvZGUgPSBzNWs1YmFmX2Zvcm1hdHNbaV0uY29kZTsKKwlmc2UtPm1pbl93aWR0aCA9IFM1SzVCQUZfV0lOX1dJRFRIX01JTjsKKwlmc2UtPm1heF93aWR0aCA9IFM1SzVCQUZfQ0lTX1dJRFRIOworCWZzZS0+bWF4X2hlaWdodCA9IFM1SzVCQUZfV0lOX0hFSUdIVF9NSU47CisJZnNlLT5taW5faGVpZ2h0ID0gUzVLNUJBRl9DSVNfSEVJR0hUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfdHJ5X2Npc19mb3JtYXQoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJbWYtPndpZHRoID0gUzVLNUJBRl9DSVNfV0lEVEg7CisJbWYtPmhlaWdodCA9IFM1SzVCQUZfQ0lTX0hFSUdIVDsKKwltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQ7CisJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl90cnlfaXNwX2Zvcm1hdChzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlpbnQgcGl4Zm10OworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZtZi0+d2lkdGgsIFM1SzVCQUZfV0lOX1dJRFRIX01JTiwKKwkJCSAgICAgIFM1SzVCQUZfQ0lTX1dJRFRILCAxLAorCQkJICAgICAgJm1mLT5oZWlnaHQsIFM1SzVCQUZfV0lOX0hFSUdIVF9NSU4sCisJCQkgICAgICBTNUs1QkFGX0NJU19IRUlHSFQsIDEsIDApOworCisJcGl4Zm10ID0gczVrNWJhZl9maW5kX3BpeGZtdChtZik7CisKKwltZi0+Y29sb3JzcGFjZSA9IHM1azViYWZfZm9ybWF0c1twaXhmbXRdLmNvbG9yc3BhY2U7CisJbWYtPmNvZGUgPSBzNWs1YmFmX2Zvcm1hdHNbcGl4Zm10XS5jb2RlOworCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKworCXJldHVybiBwaXhmbXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9nZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKwljb25zdCBzdHJ1Y3QgczVrNWJhZl9waXhmbXQgKnBpeGZtdDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgZm10LT5wYWQpOworCQlmbXQtPmZvcm1hdCA9ICptZjsKKwkJcmV0dXJuIDA7CisJfQorCisJbWYgPSAmZm10LT5mb3JtYXQ7CisJaWYgKGZtdC0+cGFkID09IFBBRF9DSVMpIHsKKwkJczVrNWJhZl90cnlfY2lzX2Zvcm1hdChtZik7CisJCXJldHVybiAwOworCX0KKwltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJbXV0ZXhfbG9jaygmc3RhdGUtPmxvY2spOworCXBpeGZtdCA9ICZzNWs1YmFmX2Zvcm1hdHNbc3RhdGUtPnBpeGZtdF07CisJbWYtPndpZHRoID0gc3RhdGUtPmNyb3Bfc291cmNlLndpZHRoOworCW1mLT5oZWlnaHQgPSBzdGF0ZS0+Y3JvcF9zb3VyY2UuaGVpZ2h0OworCW1mLT5jb2RlID0gcGl4Zm10LT5jb2RlOworCW1mLT5jb2xvcnNwYWNlID0gcGl4Zm10LT5jb2xvcnNwYWNlOworCW11dGV4X3VubG9jaygmc3RhdGUtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9zZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZiA9ICZmbXQtPmZvcm1hdDsKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKwljb25zdCBzdHJ1Y3QgczVrNWJhZl9waXhmbXQgKnBpeGZtdDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJKnY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBmbXQtPnBhZCkgPSAqbWY7CisJCXJldHVybiAwOworCX0KKworCWlmIChmbXQtPnBhZCA9PSBQQURfQ0lTKSB7CisJCXM1azViYWZfdHJ5X2Npc19mb3JtYXQobWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7CisKKwlpZiAoc3RhdGUtPnN0cmVhbWluZykgeworCQltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzdGF0ZS0+cGl4Zm10ID0gczVrNWJhZl90cnlfaXNwX2Zvcm1hdChtZik7CisJcGl4Zm10ID0gJnM1azViYWZfZm9ybWF0c1tzdGF0ZS0+cGl4Zm10XTsKKwltZi0+Y29kZSA9IHBpeGZtdC0+Y29kZTsKKwltZi0+Y29sb3JzcGFjZSA9IHBpeGZtdC0+Y29sb3JzcGFjZTsKKwltZi0+d2lkdGggPSBzdGF0ZS0+Y3JvcF9zb3VyY2Uud2lkdGg7CisJbWYtPmhlaWdodCA9IHN0YXRlLT5jcm9wX3NvdXJjZS5oZWlnaHQ7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitlbnVtIHNlbGVjdGlvbl9yZWN0IHsgUl9DSVMsIFJfQ1JPUF9TSU5LLCBSX0NPTVBPU0UsIFJfQ1JPUF9TT1VSQ0UsIFJfSU5WQUxJRCB9OworCitzdGF0aWMgZW51bSBzZWxlY3Rpb25fcmVjdCBzNWs1YmFmX2dldF9zZWxfcmVjdCh1MzIgcGFkLCB1MzIgdGFyZ2V0KQoreworCXN3aXRjaCAodGFyZ2V0KSB7CisJY2FzZSBWNEwyX1NFTF9UR1RfQ1JPUF9CT1VORFM6CisJCXJldHVybiBwYWQgPyBSX0NPTVBPU0UgOiBSX0NJUzsKKwljYXNlIFY0TDJfU0VMX1RHVF9DUk9QOgorCQlyZXR1cm4gcGFkID8gUl9DUk9QX1NPVVJDRSA6IFJfQ1JPUF9TSU5LOworCWNhc2UgVjRMMl9TRUxfVEdUX0NPTVBPU0VfQk9VTkRTOgorCQlyZXR1cm4gcGFkID8gUl9JTlZBTElEIDogUl9DUk9QX1NJTks7CisJY2FzZSBWNEwyX1NFTF9UR1RfQ09NUE9TRToKKwkJcmV0dXJuIHBhZCA/IFJfSU5WQUxJRCA6IFJfQ09NUE9TRTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gUl9JTlZBTElEOworCX0KK30KKworc3RhdGljIGludCBzNWs1YmFmX2lzX2JvdW5kX3RhcmdldCh1MzIgdGFyZ2V0KQoreworCXJldHVybiB0YXJnZXQgPT0gVjRMMl9TRUxfVEdUX0NST1BfQk9VTkRTIHx8CisJCXRhcmdldCA9PSBWNEwyX1NFTF9UR1RfQ09NUE9TRV9CT1VORFM7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9nZXRfc2VsZWN0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9zZWxlY3Rpb24gKnNlbCkKK3sKKwlzdGF0aWMgZW51bSBzZWxlY3Rpb25fcmVjdCBydHlwZTsKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKworCXJ0eXBlID0gczVrNWJhZl9nZXRfc2VsX3JlY3Qoc2VsLT5wYWQsIHNlbC0+dGFyZ2V0KTsKKworCXN3aXRjaCAocnR5cGUpIHsKKwljYXNlIFJfSU5WQUxJRDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBSX0NJUzoKKwkJc2VsLT5yID0gczVrNWJhZl9jaXNfcmVjdDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHNlbC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQlpZiAocnR5cGUgPT0gUl9DT01QT1NFKQorCQkJc2VsLT5yID0gKnY0bDJfc3ViZGV2X2dldF90cnlfY29tcG9zZShmaCwgc2VsLT5wYWQpOworCQllbHNlCisJCQlzZWwtPnIgPSAqdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBzZWwtPnBhZCk7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJnN0YXRlLT5sb2NrKTsKKwlzd2l0Y2ggKHJ0eXBlKSB7CisJY2FzZSBSX0NST1BfU0lOSzoKKwkJc2VsLT5yID0gc3RhdGUtPmNyb3Bfc2luazsKKwkJYnJlYWs7CisJY2FzZSBSX0NPTVBPU0U6CisJCXNlbC0+ciA9IHN0YXRlLT5jb21wb3NlOworCQlicmVhazsKKwljYXNlIFJfQ1JPUF9TT1VSQ0U6CisJCXNlbC0+ciA9IHN0YXRlLT5jcm9wX3NvdXJjZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChzNWs1YmFmX2lzX2JvdW5kX3RhcmdldChzZWwtPnRhcmdldCkpIHsKKwkJc2VsLT5yLmxlZnQgPSAwOworCQlzZWwtPnIudG9wID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYm91bmRzIHJhbmdlIFtzdGFydCwgc3RhcnQrbGVuKSB0byBbMCwgbWF4KSBhbmQgYWxpZ25zIHRvIDIgKi8KK3N0YXRpYyB2b2lkIHM1azViYWZfYm91bmRfcmFuZ2UodTMyICpzdGFydCwgdTMyICpsZW4sIHUzMiBtYXgpCit7CisJaWYgKCpsZW4gPiBtYXgpCisJCSpsZW4gPSBtYXg7CisJaWYgKCpzdGFydCArICpsZW4gPiBtYXgpCisJCSpzdGFydCA9IG1heCAtICpsZW47CisJKnN0YXJ0ICY9IH4xOworCSpsZW4gJj0gfjE7CisJaWYgKCpsZW4gPCBTNUs1QkFGX1dJTl9XSURUSF9NSU4pCisJCSpsZW4gPSBTNUs1QkFGX1dJTl9XSURUSF9NSU47Cit9CisKK3N0YXRpYyB2b2lkIHM1azViYWZfYm91bmRfcmVjdChzdHJ1Y3QgdjRsMl9yZWN0ICpyLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCit7CisJczVrNWJhZl9ib3VuZF9yYW5nZSgmci0+bGVmdCwgJnItPndpZHRoLCB3aWR0aCk7CisJczVrNWJhZl9ib3VuZF9yYW5nZSgmci0+dG9wLCAmci0+aGVpZ2h0LCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX3NldF9yZWN0X2FuZF9hZGp1c3Qoc3RydWN0IHY0bDJfcmVjdCAqKnJlY3RzLAorCQkJCQllbnVtIHNlbGVjdGlvbl9yZWN0IGZpcnN0LAorCQkJCQlzdHJ1Y3QgdjRsMl9yZWN0ICp2KQoreworCXN0cnVjdCB2NGwyX3JlY3QgKnIsICpicjsKKwllbnVtIHNlbGVjdGlvbl9yZWN0IGkgPSBmaXJzdDsKKworCSpyZWN0c1tmaXJzdF0gPSAqdjsKKwlkbyB7CisJCXIgPSByZWN0c1tpXTsKKwkJYnIgPSByZWN0c1tpIC0gMV07CisJCXM1azViYWZfYm91bmRfcmVjdChyLCBici0+d2lkdGgsIGJyLT5oZWlnaHQpOworCX0gd2hpbGUgKCsraSAhPSBSX0lOVkFMSUQpOworCSp2ID0gKnJlY3RzW2ZpcnN0XTsKK30KKworc3RhdGljIGJvb2wgczVrNWJhZl9jbXBfcmVjdChjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0ICpyMSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqcjIpCit7CisJcmV0dXJuICFtZW1jbXAocjEsIHIyLCBzaXplb2YoKnIxKSk7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9zZXRfc2VsZWN0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9zZWxlY3Rpb24gKnNlbCkKK3sKKwlzdGF0aWMgZW51bSBzZWxlY3Rpb25fcmVjdCBydHlwZTsKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICoqcmVjdHM7CisJaW50IHJldCA9IDA7CisKKwlydHlwZSA9IHM1azViYWZfZ2V0X3NlbF9yZWN0KHNlbC0+cGFkLCBzZWwtPnRhcmdldCk7CisJaWYgKHJ0eXBlID09IFJfSU5WQUxJRCB8fCBzNWs1YmFmX2lzX2JvdW5kX3RhcmdldChzZWwtPnRhcmdldCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogYWxsb3cgb25seSBzY2FsaW5nIG9uIGNvbXBvc2UgKi8KKwlpZiAocnR5cGUgPT0gUl9DT01QT1NFKSB7CisJCXNlbC0+ci5sZWZ0ID0gMDsKKwkJc2VsLT5yLnRvcCA9IDA7CisJfQorCisJaWYgKHNlbC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQlyZWN0cyA9IChzdHJ1Y3QgdjRsMl9yZWN0ICogW10pIHsKKwkJCQkmczVrNWJhZl9jaXNfcmVjdCwKKwkJCQl2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIFBBRF9DSVMpLAorCQkJCXY0bDJfc3ViZGV2X2dldF90cnlfY29tcG9zZShmaCwgUEFEX0NJUyksCisJCQkJdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBQQURfT1VUKQorCQkJfTsKKwkJczVrNWJhZl9zZXRfcmVjdF9hbmRfYWRqdXN0KHJlY3RzLCBydHlwZSwgJnNlbC0+cik7CisJCXJldHVybiAwOworCX0KKworCXJlY3RzID0gKHN0cnVjdCB2NGwyX3JlY3QgKiBbXSkgeworCQkJJnM1azViYWZfY2lzX3JlY3QsCisJCQkmc3RhdGUtPmNyb3Bfc2luaywKKwkJCSZzdGF0ZS0+Y29tcG9zZSwKKwkJCSZzdGF0ZS0+Y3JvcF9zb3VyY2UKKwkJfTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7CisJaWYgKHN0YXRlLT5zdHJlYW1pbmcpIHsKKwkJLyogYWRqdXN0IHNlbC0+ciB0byBhdm9pZCBvdXRwdXQgcmVzb2x1dGlvbiBjaGFuZ2UgKi8KKwkJaWYgKHJ0eXBlIDwgUl9DUk9QX1NPVVJDRSkgeworCQkJaWYgKHNlbC0+ci53aWR0aCA8IHN0YXRlLT5jcm9wX3NvdXJjZS53aWR0aCkKKwkJCQlzZWwtPnIud2lkdGggPSBzdGF0ZS0+Y3JvcF9zb3VyY2Uud2lkdGg7CisJCQlpZiAoc2VsLT5yLmhlaWdodCA8IHN0YXRlLT5jcm9wX3NvdXJjZS5oZWlnaHQpCisJCQkJc2VsLT5yLmhlaWdodCA9IHN0YXRlLT5jcm9wX3NvdXJjZS5oZWlnaHQ7CisJCX0gZWxzZSB7CisJCQlzZWwtPnIud2lkdGggPSBzdGF0ZS0+Y3JvcF9zb3VyY2Uud2lkdGg7CisJCQlzZWwtPnIuaGVpZ2h0ID0gc3RhdGUtPmNyb3Bfc291cmNlLmhlaWdodDsKKwkJfQorCX0KKwlzNWs1YmFmX3NldF9yZWN0X2FuZF9hZGp1c3QocmVjdHMsIHJ0eXBlLCAmc2VsLT5yKTsKKwlpZiAoIXM1azViYWZfY21wX3JlY3QoJnN0YXRlLT5jcm9wX3NpbmssICZzNWs1YmFmX2Npc19yZWN0KSB8fAorCSAgICAhczVrNWJhZl9jbXBfcmVjdCgmc3RhdGUtPmNvbXBvc2UsICZzNWs1YmFmX2Npc19yZWN0KSkKKwkJc3RhdGUtPmFwcGx5X2Nyb3AgPSAxOworCWlmIChzdGF0ZS0+c3RyZWFtaW5nKQorCQlyZXQgPSBzNWs1YmFmX2h3X3NldF9jcm9wX3JlY3RzKHN0YXRlKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBzNWs1YmFmX2Npc19wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZQkJPSBzNWs1YmFmX2VudW1fbWJ1c19jb2RlLAorCS5lbnVtX2ZyYW1lX3NpemUJPSBzNWs1YmFmX2VudW1fZnJhbWVfc2l6ZSwKKwkuZ2V0X2ZtdAkJPSBzNWs1YmFmX2dldF9mbXQsCisJLnNldF9mbXQJCT0gczVrNWJhZl9zZXRfZm10LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIHM1azViYWZfcGFkX29wcyA9IHsKKwkuZW51bV9tYnVzX2NvZGUJCT0gczVrNWJhZl9lbnVtX21idXNfY29kZSwKKwkuZW51bV9mcmFtZV9zaXplCT0gczVrNWJhZl9lbnVtX2ZyYW1lX3NpemUsCisJLmVudW1fZnJhbWVfaW50ZXJ2YWwJPSBzNWs1YmFmX2VudW1fZnJhbWVfaW50ZXJ2YWwsCisJLmdldF9mbXQJCT0gczVrNWJhZl9nZXRfZm10LAorCS5zZXRfZm10CQk9IHM1azViYWZfc2V0X2ZtdCwKKwkuZ2V0X3NlbGVjdGlvbgkJPSBzNWs1YmFmX2dldF9zZWxlY3Rpb24sCisJLnNldF9zZWxlY3Rpb24JCT0gczVrNWJhZl9zZXRfc2VsZWN0aW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgczVrNWJhZl92aWRlb19vcHMgPSB7CisJLmdfZnJhbWVfaW50ZXJ2YWwJPSBzNWs1YmFmX2dfZnJhbWVfaW50ZXJ2YWwsCisJLnNfZnJhbWVfaW50ZXJ2YWwJPSBzNWs1YmFmX3NfZnJhbWVfaW50ZXJ2YWwsCisJLnNfc3RyZWFtCQk9IHM1azViYWZfc19zdHJlYW0sCit9OworCisvKgorICogVjRMMiBzdWJkZXYgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IHM1azViYWZfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGN0cmxfdG9fc2QoY3RybCk7CisJc3RydWN0IHM1azViYWYgKnN0YXRlID0gdG9fczVrNWJhZihzZCk7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImN0cmw6ICVzLCB2YWx1ZTogJWRcbiIsIGN0cmwtPm5hbWUsIGN0cmwtPnZhbCk7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7CisKKwlpZiAoc3RhdGUtPnBvd2VyID09IDApCisJCWdvdG8gdW5sb2NrOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQlzNWs1YmFmX2h3X3NldF9hd2Ioc3RhdGUsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfVVNFUl9CUklHSFRORVNTLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfQ09MT1JGWDoKKwkJczVrNWJhZl9od19zZXRfY29sb3JmeChzdGF0ZSwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfVVNFUl9DT05UUkFTVCwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCXM1azViYWZfaHdfc2V0X2F1dG9fZXhwb3N1cmUoc3RhdGUsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJczVrNWJhZl9od19zZXRfbWlycm9yKHN0YXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZOgorCQlzNWs1YmFmX2h3X3NldF9hbnRpX2ZsaWNrZXIoc3RhdGUsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfVVNFUl9TQVRVUkFUSU9OLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfVVNFUl9TSEFSUEJMVVIsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFOgorCQlzNWs1YmFmX3dyaXRlKHN0YXRlLCBSRUdfUF9DT0xPUlRFTVAoMCksIGN0cmwtPnZhbCk7CisJCWlmIChzdGF0ZS0+YXBwbHlfY2ZnKQorCQkJczVrNWJhZl9od19zeW5jX2NmZyhzdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9URVNUX1BBVFRFUk46CisJCXM1azViYWZfaHdfc2V0X3Rlc3RfcGF0dGVybihzdGF0ZSwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJfQordW5sb2NrOgorCXJldCA9IHM1azViYWZfY2xlYXJfZXJyb3Ioc3RhdGUpOworCW11dGV4X3VubG9jaygmc3RhdGUtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzNWs1YmFmX2N0cmxfb3BzID0geworCS5zX2N0cmwJPSBzNWs1YmFmX3NfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgczVrNWJhZl90ZXN0X3BhdHRlcm5fbWVudVtdID0geworCSJEaXNhYmxlZCIsCisJIkJsYW5rIiwKKwkiQmFycyIsCisJIkdyYWRpZW50cyIsCisJIlRleHRpbGUiLAorCSJUZXh0aWxlMiIsCisJIlNxdWFyZXMiCit9OworCitzdGF0aWMgaW50IHM1azViYWZfaW5pdGlhbGl6ZV9jdHJscyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgKm9wcyA9ICZzNWs1YmFmX2N0cmxfb3BzOworCXN0cnVjdCBzNWs1YmFmX2N0cmxzICpjdHJscyA9ICZzdGF0ZS0+Y3RybHM7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwgPSAmY3RybHMtPmhhbmRsZXI7CisJaW50IHJldDsKKworCXJldCA9IHY0bDJfY3RybF9oYW5kbGVyX2luaXQoaGRsLCAxNik7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnN0YXRlLT5zZCwgImNhbm5vdCBpbml0IGN0cmwgaGFuZGxlciAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEF1dG8gd2hpdGUgYmFsYW5jZSBjbHVzdGVyICovCisJY3RybHMtPmF3YiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJCQkJICAgICAgIDAsIDEsIDEsIDEpOworCWN0cmxzLT5nYWluX3JlZCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJCQkJICAgIDAsIDI1NSwgMSwgUzVLNUJBRl9HQUlOX1JFRF9ERUYpOworCWN0cmxzLT5nYWluX2JsdWUgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkJCQkgICAgIDAsIDI1NSwgMSwgUzVLNUJBRl9HQUlOX0JMVUVfREVGKTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsICZjdHJscy0+YXdiLCAwLCBmYWxzZSk7CisKKwljdHJscy0+aGZsaXAgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCWN0cmxzLT52ZmxpcCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX2NsdXN0ZXIoMiwgJmN0cmxzLT5oZmxpcCk7CisKKwljdHJscy0+YXV0b19leHAgPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgb3BzLAorCQkJCVY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIDAsIFY0TDJfRVhQT1NVUkVfQVVUTyk7CisJLyogRXhwb3N1cmUgdGltZTogeCAxIHVzICovCisJY3RybHMtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJCQkgICAgMCwgNjAwMDAwMFUsIDEsIDEwMDAwMFUpOworCS8qIFRvdGFsIGdhaW46IDI1NiA8PT4gMXggKi8KKwljdHJscy0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9HQUlOLAorCQkJCQkwLCAyNTYsIDEsIDI1Nik7CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigzLCAmY3RybHMtPmF1dG9fZXhwLCAwLCBmYWxzZSk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgb3BzLCBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSwKKwkJCSAgICAgICBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9BVVRPLCAwLAorCQkJICAgICAgIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8pOworCisJdjRsMl9jdHJsX25ld19zdGRfbWVudShoZGwsIG9wcywgVjRMMl9DSURfQ09MT1JGWCwKKwkJCSAgICAgICBWNEwyX0NPTE9SRlhfU0tZX0JMVUUsIH4weDZmLCBWNEwyX0NPTE9SRlhfTk9ORSk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwKKwkJCSAgMCwgMjU2LCAxLCAwKTsKKworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9TQVRVUkFUSU9OLCAtMTI3LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9CUklHSFRORVNTLCAtMTI3LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9DT05UUkFTVCwgLTEyNywgMTI3LCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfU0hBUlBORVNTLCAtMTI3LCAxMjcsIDEsIDApOworCisJdjRsMl9jdHJsX25ld19zdGRfbWVudV9pdGVtcyhoZGwsIG9wcywgVjRMMl9DSURfVEVTVF9QQVRURVJOLAorCQkJCSAgICAgQVJSQVlfU0laRShzNWs1YmFmX3Rlc3RfcGF0dGVybl9tZW51KSAtIDEsCisJCQkJICAgICAwLCAwLCBzNWs1YmFmX3Rlc3RfcGF0dGVybl9tZW51KTsKKworCWlmIChoZGwtPmVycm9yKSB7CisJCXY0bDJfZXJyKCZzdGF0ZS0+c2QsICJlcnJvciBjcmVhdGluZyBjb250cm9scyAoJWQpXG4iLAorCQkJIGhkbC0+ZXJyb3IpOworCQlyZXQgPSBoZGwtPmVycm9yOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKGhkbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RhdGUtPnNkLmN0cmxfaGFuZGxlciA9IGhkbDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFY0TDIgc3ViZGV2IGludGVybmFsIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCBzNWs1YmFmX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKworCW1mID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIFBBRF9DSVMpOworCXM1azViYWZfdHJ5X2Npc19mb3JtYXQobWYpOworCisJaWYgKHM1azViYWZfaXNfY2lzX3N1YmRldihzZCkpCisJCXJldHVybiAwOworCisJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgUEFEX09VVCk7CisJbWYtPmNvbG9yc3BhY2UgPSBzNWs1YmFmX2Zvcm1hdHNbMF0uY29sb3JzcGFjZTsKKwltZi0+Y29kZSA9IHM1azViYWZfZm9ybWF0c1swXS5jb2RlOworCW1mLT53aWR0aCA9IHM1azViYWZfY2lzX3JlY3Qud2lkdGg7CisJbWYtPmhlaWdodCA9IHM1azViYWZfY2lzX3JlY3QuaGVpZ2h0OworCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKworCSp2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIFBBRF9DSVMpID0gczVrNWJhZl9jaXNfcmVjdDsKKwkqdjRsMl9zdWJkZXZfZ2V0X3RyeV9jb21wb3NlKGZoLCBQQURfQ0lTKSA9IHM1azViYWZfY2lzX3JlY3Q7CisJKnY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgUEFEX09VVCkgPSBzNWs1YmFmX2Npc19yZWN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9jaGVja19md19yZXZpc2lvbihzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJdTE2IGFwaV92ZXIgPSAwLCBmd19yZXYgPSAwLCBzX2lkID0gMDsKKwlpbnQgcmV0OworCisJYXBpX3ZlciA9IHM1azViYWZfcmVhZChzdGF0ZSwgUkVHX0ZXX0FQSVZFUik7CisJZndfcmV2ID0gczVrNWJhZl9yZWFkKHN0YXRlLCBSRUdfRldfUkVWSVNJT04pICYgMHhmZjsKKwlzX2lkID0gczVrNWJhZl9yZWFkKHN0YXRlLCBSRUdfRldfU0VOU09SX0lEKTsKKwlyZXQgPSBzNWs1YmFmX2NsZWFyX2Vycm9yKHN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXY0bDJfaW5mbygmc3RhdGUtPnNkLCAiRlcgQVBJPSUjeCwgcmV2aXNpb249JSN4IHNlbnNvcl9pZD0lI3hcbiIsCisJCSAgYXBpX3ZlciwgZndfcmV2LCBzX2lkKTsKKworCWlmIChhcGlfdmVyICE9IFM1SzVCQUZfRldfQVBJVkVSKSB7CisJCXY0bDJfZXJyKCZzdGF0ZS0+c2QsICJGVyBBUEkgdmVyc2lvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9yZWdpc3RlcmVkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHM1azViYWYgKnN0YXRlID0gdG9fczVrNWJhZihzZCk7CisJaW50IHJldDsKKworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldihzZC0+djRsMl9kZXYsICZzdGF0ZS0+Y2lzX3NkKTsKKwlpZiAocmV0IDwgMCkKKwkJdjRsMl9lcnIoc2QsICJmYWlsZWQgdG8gcmVnaXN0ZXIgc3ViZGV2ICVzXG4iLAorCQkJIHN0YXRlLT5jaXNfc2QubmFtZSk7CisJZWxzZQorCQlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnN0YXRlLT5jaXNfc2QuZW50aXR5LCBQQURfQ0lTLAorCQkJCQkgICAgICAgJnN0YXRlLT5zZC5lbnRpdHksIFBBRF9DSVMsCisJCQkJCSAgICAgICBNRURJQV9MTktfRkxfSU1NVVRBQkxFIHwKKwkJCQkJICAgICAgIE1FRElBX0xOS19GTF9FTkFCTEVEKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzNWs1YmFmX3VucmVnaXN0ZXJlZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBzNWs1YmFmICpzdGF0ZSA9IHRvX3M1azViYWYoc2QpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZzdGF0ZS0+Y2lzX3NkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgczVrNWJhZl9jaXNfc3ViZGV2X29wcyA9IHsKKwkucGFkCT0gJnM1azViYWZfY2lzX3BhZF9vcHMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBzNWs1YmFmX2Npc19zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5vcGVuID0gczVrNWJhZl9vcGVuLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgczVrNWJhZl9zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5yZWdpc3RlcmVkID0gczVrNWJhZl9yZWdpc3RlcmVkLAorCS51bnJlZ2lzdGVyZWQgPSBzNWs1YmFmX3VucmVnaXN0ZXJlZCwKKwkub3BlbiA9IHM1azViYWZfb3BlbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgczVrNWJhZl9jb3JlX29wcyA9IHsKKwkuc19wb3dlciA9IHM1azViYWZfc2V0X3Bvd2VyLAorCS5sb2dfc3RhdHVzID0gdjRsMl9jdHJsX3N1YmRldl9sb2dfc3RhdHVzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgczVrNWJhZl9zdWJkZXZfb3BzID0geworCS5jb3JlID0gJnM1azViYWZfY29yZV9vcHMsCisJLnBhZCA9ICZzNWs1YmFmX3BhZF9vcHMsCisJLnZpZGVvID0gJnM1azViYWZfdmlkZW9fb3BzLAorfTsKKworc3RhdGljIGludCBzNWs1YmFmX2NvbmZpZ3VyZV9ncGlvcyhzdHJ1Y3QgczVrNWJhZiAqc3RhdGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKm5hbWVbXSA9IHsgIlM1SzVCQUZfU1RCWSIsICJTNUs1QkFGX1JTVCIgfTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnN0YXRlLT5zZCk7CisJc3RydWN0IHM1azViYWZfZ3BpbyAqZyA9IHN0YXRlLT5ncGlvczsKKwlpbnQgcmV0LCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9HUElPUzsgKytpKSB7CisJCWludCBmbGFncyA9IEdQSU9GX0RJUl9PVVQ7CisJCWlmIChnW2ldLmxldmVsKQorCQkJZmxhZ3MgfD0gR1BJT0ZfSU5JVF9ISUdIOworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJmMtPmRldiwgZ1tpXS5ncGlvLCBmbGFncywgbmFtZVtpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2NGwyX2VycihjLCAiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyAlc1xuIiwgbmFtZVtpXSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azViYWZfcGFyc2VfZ3Bpb3Moc3RydWN0IHM1azViYWZfZ3BpbyAqZ3Bpb3MsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisJCSJzdGJ5bi1ncGlvcyIsCisJCSJyc3RuLWdwaW9zIiwKKwl9OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwllbnVtIG9mX2dwaW9fZmxhZ3MgZmxhZ3M7CisJaW50IHJldCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BJT1M7ICsraSkgeworCQlyZXQgPSBvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyhub2RlLCBuYW1lc1tpXSwgMCwgJmZsYWdzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAibm8gJXMgR1BJTyBwaW4gcHJvdmlkZWRcbiIsIG5hbWVzW2ldKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZ3Bpb3NbaV0uZ3BpbyA9IHJldDsKKwkJZ3Bpb3NbaV0ubGV2ZWwgPSAhKGZsYWdzICYgT0ZfR1BJT19BQ1RJVkVfTE9XKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWs1YmFmX3BhcnNlX2RldmljZV9ub2RlKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGVfZXA7CisJc3RydWN0IHY0bDJfb2ZfZW5kcG9pbnQgZXA7CisJaW50IHJldDsKKworCWlmICghbm9kZSkgeworCQlkZXZfZXJyKGRldiwgIm5vIGRldmljZS10cmVlIG5vZGUgcHJvdmlkZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCQkgICAmc3RhdGUtPm1jbGtfZnJlcXVlbmN5KTsKKwlpZiAocmV0IDwgMCkgeworCQlzdGF0ZS0+bWNsa19mcmVxdWVuY3kgPSBTNUs1QkFGX0RFRkFVTFRfTUNMS19GUkVROworCQlkZXZfaW5mbyhkZXYsICJ1c2luZyBkZWZhdWx0ICV1IEh6IGNsb2NrIGZyZXF1ZW5jeVxuIiwKKwkJCSBzdGF0ZS0+bWNsa19mcmVxdWVuY3kpOworCX0KKworCXJldCA9IHM1azViYWZfcGFyc2VfZ3Bpb3Moc3RhdGUtPmdwaW9zLCBkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbm9kZV9lcCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgTlVMTCk7CisJaWYgKCFub2RlX2VwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gZW5kcG9pbnQgZGVmaW5lZCBhdCBub2RlICVzXG4iLAorCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdjRsMl9vZl9wYXJzZV9lbmRwb2ludChub2RlX2VwLCAmZXApOworCW9mX25vZGVfcHV0KG5vZGVfZXApOworCXN0YXRlLT5idXNfdHlwZSA9IGVwLmJ1c190eXBlOworCisJc3dpdGNoIChzdGF0ZS0+YnVzX3R5cGUpIHsKKwljYXNlIFY0TDJfTUJVU19DU0kyOgorCQlzdGF0ZS0+bmxhbmVzID0gZXAuYnVzLm1pcGlfY3NpMi5udW1fZGF0YV9sYW5lczsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgYnVzIGluIGVuZHBvaW50IGRlZmluZWQgYXQgbm9kZSAlc1xuIiwKKwkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azViYWZfY29uZmlndXJlX3N1YmRldnMoc3RydWN0IHM1azViYWYgKnN0YXRlLAorCQkJCSAgICAgc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlpbnQgcmV0OworCisJc2QgPSAmc3RhdGUtPmNpc19zZDsKKwl2NGwyX3N1YmRldl9pbml0KHNkLCAmczVrNWJhZl9jaXNfc3ViZGV2X29wcyk7CisJc2QtPm93bmVyID0gVEhJU19NT0RVTEU7CisJdjRsMl9zZXRfc3ViZGV2ZGF0YShzZCwgc3RhdGUpOworCXNucHJpbnRmKHNkLT5uYW1lLCBzaXplb2Yoc2QtPm5hbWUpLCAiUzVLNUJBRi1DSVMgJWQtJTA0eCIsCisJCSBpMmNfYWRhcHRlcl9pZChjLT5hZGFwdGVyKSwgYy0+YWRkcik7CisKKwlzZC0+aW50ZXJuYWxfb3BzID0gJnM1azViYWZfY2lzX3N1YmRldl9pbnRlcm5hbF9vcHM7CisJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCisJc3RhdGUtPmNpc19wYWQuZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOworCXNkLT5lbnRpdHkudHlwZSA9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWX1NFTlNPUjsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmc2QtPmVudGl0eSwgTlVNX0NJU19QQURTLCAmc3RhdGUtPmNpc19wYWQsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXNkID0gJnN0YXRlLT5zZDsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgYywgJnM1azViYWZfc3ViZGV2X29wcyk7CisJc25wcmludGYoc2QtPm5hbWUsIHNpemVvZihzZC0+bmFtZSksICJTNUs1QkFGLUlTUCAlZC0lMDR4IiwKKwkJIGkyY19hZGFwdGVyX2lkKGMtPmFkYXB0ZXIpLCBjLT5hZGRyKTsKKworCXNkLT5pbnRlcm5hbF9vcHMgPSAmczVrNWJhZl9zdWJkZXZfaW50ZXJuYWxfb3BzOworCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXN0YXRlLT5wYWRzW1BBRF9DSVNdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7CisJc3RhdGUtPnBhZHNbUEFEX09VVF0uZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOworCXNkLT5lbnRpdHkudHlwZSA9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZzZC0+ZW50aXR5LCBOVU1fSVNQX1BBRFMsIHN0YXRlLT5wYWRzLCAwKTsKKworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdGF0ZS0+Y2lzX3NkLmVudGl0eSk7CitlcnI6CisJZGV2X2VycigmYy0+ZGV2LCAiY2Fubm90IGluaXQgbWVkaWEgZW50aXR5ICVzXG4iLCBzZC0+bmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs1YmFmX2NvbmZpZ3VyZV9yZWd1bGF0b3JzKHN0cnVjdCBzNWs1YmFmICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnN0YXRlLT5zZCk7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTNUs1QkFGX05VTV9TVVBQTElFUzsgaSsrKQorCQlzdGF0ZS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gczVrNWJhZl9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmYy0+ZGV2LCBTNUs1QkFGX05VTV9TVVBQTElFUywKKwkJCQkgICAgICBzdGF0ZS0+c3VwcGxpZXMpOworCWlmIChyZXQgPCAwKQorCQl2NGwyX2VycihjLCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3JzXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azViYWZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmMsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHM1azViYWYgKnN0YXRlOworCWludCByZXQ7CisKKwlzdGF0ZSA9IGRldm1fa3phbGxvYygmYy0+ZGV2LCBzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZzdGF0ZS0+bG9jayk7CisJc3RhdGUtPmNyb3Bfc2luayA9IHM1azViYWZfY2lzX3JlY3Q7CisJc3RhdGUtPmNvbXBvc2UgPSBzNWs1YmFmX2Npc19yZWN0OworCXN0YXRlLT5jcm9wX3NvdXJjZSA9IHM1azViYWZfY2lzX3JlY3Q7CisKKwlyZXQgPSBzNWs1YmFmX3BhcnNlX2RldmljZV9ub2RlKHN0YXRlLCAmYy0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHM1azViYWZfY29uZmlndXJlX3N1YmRldnMoc3RhdGUsIGMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gczVrNWJhZl9jb25maWd1cmVfZ3Bpb3Moc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9tZTsKKworCXJldCA9IHM1azViYWZfY29uZmlndXJlX3JlZ3VsYXRvcnMoc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9tZTsKKworCXN0YXRlLT5jbG9jayA9IGRldm1fY2xrX2dldChzdGF0ZS0+c2QuZGV2LCBTNUs1QkFGX0NMS19OQU1FKTsKKwlpZiAoSVNfRVJSKHN0YXRlLT5jbG9jaykpIHsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnJfbWU7CisJfQorCisJcmV0ID0gczVrNWJhZl9wb3dlcl9vbihzdGF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnJfbWU7CisJfQorCXM1azViYWZfaHdfaW5pdChzdGF0ZSk7CisJcmV0ID0gczVrNWJhZl9jaGVja19md19yZXZpc2lvbihzdGF0ZSk7CisKKwlzNWs1YmFmX3Bvd2VyX29mZihzdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX21lOworCisJcmV0ID0gczVrNWJhZl9pbml0aWFsaXplX2N0cmxzKHN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfbWU7CisKKwlyZXQgPSB2NGwyX2FzeW5jX3JlZ2lzdGVyX3N1YmRldigmc3RhdGUtPnNkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY3RybDsKKworCXJldHVybiAwOworCitlcnJfY3RybDoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKHN0YXRlLT5zZC5jdHJsX2hhbmRsZXIpOworZXJyX21lOgorCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdGF0ZS0+c2QuZW50aXR5KTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmc3RhdGUtPmNpc19zZC5lbnRpdHkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNWJhZl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3QgczVrNWJhZiAqc3RhdGUgPSB0b19zNWs1YmFmKHNkKTsKKworCXY0bDJfYXN5bmNfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoc2QtPmN0cmxfaGFuZGxlcik7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOworCisJc2QgPSAmc3RhdGUtPmNpc19zZDsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzNWs1YmFmX2lkW10gPSB7CisJeyBTNUs1QkFGX0RSSVZFUl9OQU1FLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzNWs1YmFmX2lkKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczVrNWJhZl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNWs1YmFmIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHM1azViYWZfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczVrNWJhZl9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vZl9tYXRjaF90YWJsZSA9IHM1azViYWZfb2ZfbWF0Y2gsCisJCS5uYW1lID0gUzVLNUJBRl9EUklWRVJfTkFNRQorCX0sCisJLnByb2JlCQk9IHM1azViYWZfcHJvYmUsCisJLnJlbW92ZQkJPSBzNWs1YmFmX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBzNWs1YmFmX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoczVrNWJhZl9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFM1SzVCQUYoWCkgVVhHQSBjYW1lcmEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJBbmRyemVqIEhhamRhIDxhLmhhamRhQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvc2FhNjU4OC5jIGIvZHJpdmVycy9tZWRpYS9pMmMvc2FhNjU4OC5jCmluZGV4IDcwYmM3MmUuLjI5NjBiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3NhYTY1ODguYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9zYWE2NTg4LmMKQEAgLTE1MCwxNCArMTUwLDE0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBibG9ja190b191c2VyX2J1ZihzdHJ1Y3Qgc2FhNjU4OCAqcywgdW5zaWduZWQgY2hhciBfX3VzZXIgKnVzZXJfYnVmKQorc3RhdGljIGJvb2wgYmxvY2tfZnJvbV9idWYoc3RydWN0IHNhYTY1ODggKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKIAlpbnQgaTsKIAogCWlmIChzLT5yZF9pbmRleCA9PSBzLT53cl9pbmRleCkgewogCQlpZiAoZGVidWcgPiAyKQogCQkJZHByaW50ayhQUkVGSVggIlJlYWQ6IGJ1ZmZlciBlbXB0eS5cbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWlmIChkZWJ1ZyA+IDIpIHsKQEAgLTE2Niw4ICsxNjYsNyBAQAogCQkJZHByaW50aygiMHglMDJ4ICIsIHMtPmJ1ZmZlcltpXSk7CiAJfQogCi0JaWYgKGNvcHlfdG9fdXNlcih1c2VyX2J1ZiwgJnMtPmJ1ZmZlcltzLT5yZF9pbmRleF0sIDMpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwltZW1jcHkoYnVmLCAmcy0+YnVmZmVyW3MtPnJkX2luZGV4XSwgMyk7CiAKIAlzLT5yZF9pbmRleCArPSAzOwogCWlmIChzLT5yZF9pbmRleCA+PSBzLT5idWZfc2l6ZSkKQEAgLTE3NywyMiArMTc2LDIyIEBACiAJaWYgKGRlYnVnID4gMikKIAkJZHByaW50aygiJWQgYmxvY2tzIHRvdGFsLlxuIiwgcy0+YmxvY2tfY291bnQpOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfZnJvbV9idWYoc3RydWN0IHNhYTY1ODggKnMsIHN0cnVjdCBzYWE2NTg4X2NvbW1hbmQgKmEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCXVuc2lnbmVkIGNoYXIgX191c2VyICpidWZfcHRyID0gYS0+YnVmZmVyOwotCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgYnVmWzNdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHJkX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWEtPnJlc3VsdCA9IDA7CiAJaWYgKCFhLT5idWZmZXIpCiAJCXJldHVybjsKIAotCXdoaWxlICghcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQpIHsKKwl3aGlsZSAoIWEtPm5vbmJsb2NraW5nICYmICFzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCkgewogCQlpbnQgcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHMtPnJlYWRfcXVldWUsCiAJCQkJCSAgICAgcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQpOwogCQlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykgewpAQCAtMjAxLDI0ICsyMDAsMzEgQEAKIAkJfQogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CiAJcmRfYmxvY2tzID0gYS0+YmxvY2tfY291bnQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKIAlpZiAocmRfYmxvY2tzID4gcy0+YmxvY2tfY291bnQpCiAJCXJkX2Jsb2NrcyA9IHMtPmJsb2NrX2NvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAotCWlmICghcmRfYmxvY2tzKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXJkX2Jsb2NrcykKIAkJcmV0dXJuOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCByZF9ibG9ja3M7IGkrKykgewotCQlpZiAoYmxvY2tfdG9fdXNlcl9idWYocywgYnVmX3B0cikpIHsKLQkJCWJ1Zl9wdHIgKz0gMzsKLQkJCWEtPnJlc3VsdCsrOwotCQl9IGVsc2UKKwkJYm9vbCBnb3RfYmxvY2s7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZ290X2Jsb2NrID0gYmxvY2tfZnJvbV9idWYocywgYnVmKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoIWdvdF9ibG9jaykKIAkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKGJ1Zl9wdHIsIGJ1ZiwgMykpIHsKKwkJCWEtPnJlc3VsdCA9IC1FRkFVTFQ7CisJCQlyZXR1cm47CisJCX0KKwkJYnVmX3B0ciArPSAzOworCQlhLT5yZXN1bHQgKz0gMzsKIAl9Ci0JYS0+cmVzdWx0ICo9IDM7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKIAlzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCA9IChzLT5ibG9ja19jb3VudCA+IDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTM5NCwxNCArNDAwLDExIEBACiAJc3RydWN0IHNhYTY1ODhfY29tbWFuZCAqYSA9IGFyZzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCS8qIC0tLSBvcGVuKCkgZm9yIC9kZXYvcmFkaW8gLS0tICovCi0JY2FzZSBTQUE2NTg4X0NNRF9PUEVOOgotCQlhLT5yZXN1bHQgPSAwOwkvKiByZXR1cm4gZXJyb3IgaWYgY2hpcCBkb2Vzbid0IHdvcmsgPz8/ICovCi0JCWJyZWFrOwogCQkvKiAtLS0gY2xvc2UoKSBmb3IgL2Rldi9yYWRpbyAtLS0gKi8KIAljYXNlIFNBQTY1ODhfQ01EX0NMT1NFOgogCQlzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCA9IDE7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcy0+cmVhZF9xdWV1ZSk7CisJCXMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkID0gMDsKIAkJYS0+cmVzdWx0ID0gMDsKIAkJYnJlYWs7CiAJCS8qIC0tLSByZWFkKCkgZm9yIC9kZXYvcmFkaW8gLS0tICovCkBAIC00MTEsOSArNDE0LDggQEAKIAkJLyogLS0tIHBvbGwoKSBmb3IgL2Rldi9yYWRpbyAtLS0gKi8KIAljYXNlIFNBQTY1ODhfQ01EX1BPTEw6CiAJCWEtPnJlc3VsdCA9IDA7Ci0JCWlmIChzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCkgeworCQlpZiAocy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQpCiAJCQlhLT5yZXN1bHQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJfQogCQlwb2xsX3dhaXQoYS0+aW5zdGFuY2UsICZzLT5yZWFkX3F1ZXVlLCBhLT5ldmVudF9saXN0KTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNjc1MmhzLmMgYi9kcml2ZXJzL21lZGlhL2kyYy9zYWE2NzUyaHMuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTY3NTJocy5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL2kyYy9zYWE2NzUyaHMuYwppbmRleCA4YWM0YjFmLi44MjcyYzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTY3NTJocy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3NhYTY3NTJocy5jCkBAIC0zMywxMSArMzMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAKICNkZWZpbmUgTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVggIDI3MDAwCiAjZGVmaW5lIE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYICAgICAyNzAwMApAQCAtMTI0LDcgKzEyNCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHU4IFBBVFtdID0geworc3RhdGljIGNvbnN0IHU4IFBBVFtdID0gewogCTB4YzIsIC8qIGkyYyByZWdpc3RlciAqLwogCTB4MDAsIC8qIHRhYmxlIG51bWJlciBmb3IgZW5jb2RlciAqLwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIENSQzMyICovCiB9OwogCi1zdGF0aWMgdTggUE1UW10gPSB7CitzdGF0aWMgY29uc3QgdTggUE1UW10gPSB7CiAJMHhjMiwgLyogaTJjIHJlZ2lzdGVyICovCiAJMHgwMSwgLyogdGFibGUgbnVtYmVyIGZvciBlbmNvZGVyICovCiAKQEAgLTE3OSw3ICsxNzksNyBAQAogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgLyogQ1JDMzIgKi8KIH07CiAKLXN0YXRpYyB1OCBQTVRfQUMzW10gPSB7CitzdGF0aWMgY29uc3QgdTggUE1UX0FDM1tdID0gewogCTB4YzIsIC8qIGkyYyByZWdpc3RlciAqLwogCTB4MDEsIC8qIHRhYmxlIG51bWJlciBmb3IgZW5jb2RlcigxKSAqLwogCTB4NDcsIC8qIHN5bmMgKi8KQEAgLTIxMiw3ICsyMTIsNyBAQAogCTB4RUQsIDB4REUsIDB4MkQsIDB4RjMgLyogQ1JDMzIgQkUgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zIHBhcmFtX2RlZmF1bHRzID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zIHBhcmFtX2RlZmF1bHRzID0KIHsKIAkudHNfcGlkX3BtdCAgICAgID0gMTYsCiAJLnRzX3BpZF92aWRlbyAgICA9IDI2MCwKQEAgLTY0MywxMyArNjQzLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBzYWE2NzUyaHNfY29yZV9vcHMgPSB7CiAJLmluaXQgPSBzYWE2NzUyaHNfaW5pdCwKLQkuZ19leHRfY3RybHMgPSB2NGwyX3N1YmRldl9nX2V4dF9jdHJscywKLQkudHJ5X2V4dF9jdHJscyA9IHY0bDJfc3ViZGV2X3RyeV9leHRfY3RybHMsCi0JLnNfZXh0X2N0cmxzID0gdjRsMl9zdWJkZXZfc19leHRfY3RybHMsCi0JLmdfY3RybCA9IHY0bDJfc3ViZGV2X2dfY3RybCwKLQkuc19jdHJsID0gdjRsMl9zdWJkZXZfc19jdHJsLAotCS5xdWVyeWN0cmwgPSB2NGwyX3N1YmRldl9xdWVyeWN0cmwsCi0JLnF1ZXJ5bWVudSA9IHY0bDJfc3ViZGV2X3F1ZXJ5bWVudSwKIAkuc19zdGQgPSBzYWE2NzUyaHNfc19zdGQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9zbWlhcHAvc21pYXBwLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3NtaWFwcC9zbWlhcHAtY29yZS5jCmluZGV4IGFlNjZkOTEuLjg3NDFjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3NtaWFwcC9zbWlhcHAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3NtaWFwcC9zbWlhcHAtY29yZS5jCkBAIC0zOTksNyArMzk5LDYgQEAKIAogCUJVR19PTihtYXgoaW50ZXJuYWxfY3NpX2Zvcm1hdF9pZHgsIGNzaV9mb3JtYXRfaWR4KSArIHBpeGVsX29yZGVyCiAJICAgICAgID49IEFSUkFZX1NJWkUoc21pYXBwX2NzaV9kYXRhX2Zvcm1hdHMpKTsKLQlCVUdfT04obWluKGludGVybmFsX2NzaV9mb3JtYXRfaWR4LCBjc2lfZm9ybWF0X2lkeCkgPCAwKTsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibmV3IHBpeGVsIG9yZGVyICVzXG4iLAogCQlwaXhlbF9vcmRlcl9zdHJbcGl4ZWxfb3JkZXJdKTsKQEAgLTIwMjgsOCArMjAyNyw4IEBACiAJc2VsLT5yLndpZHRoID0gbWluKHNlbC0+ci53aWR0aCwgc3JjX3NpemUtPndpZHRoKTsKIAlzZWwtPnIuaGVpZ2h0ID0gbWluKHNlbC0+ci5oZWlnaHQsIHNyY19zaXplLT5oZWlnaHQpOwogCi0Jc2VsLT5yLmxlZnQgPSBtaW4oc2VsLT5yLmxlZnQsIHNyY19zaXplLT53aWR0aCAtIHNlbC0+ci53aWR0aCk7Ci0Jc2VsLT5yLnRvcCA9IG1pbihzZWwtPnIudG9wLCBzcmNfc2l6ZS0+aGVpZ2h0IC0gc2VsLT5yLmhlaWdodCk7CisJc2VsLT5yLmxlZnQgPSBtaW5fdChpbnQsIHNlbC0+ci5sZWZ0LCBzcmNfc2l6ZS0+d2lkdGggLSBzZWwtPnIud2lkdGgpOworCXNlbC0+ci50b3AgPSBtaW5fdChpbnQsIHNlbC0+ci50b3AsIHNyY19zaXplLT5oZWlnaHQgLSBzZWwtPnIuaGVpZ2h0KTsKIAogCSpjcm9wc1tzZWwtPnBhZF0gPSBzZWwtPnI7CiAKQEAgLTIxMjEsOCArMjEyMCw4IEBACiAKIAlzZWwtPnIubGVmdCA9IG1heCgwLCBzZWwtPnIubGVmdCAmIH4xKTsKIAlzZWwtPnIudG9wID0gbWF4KDAsIHNlbC0+ci50b3AgJiB+MSk7Ci0Jc2VsLT5yLndpZHRoID0gbWF4KDAsIFNNSUFQUF9BTElHTl9ESU0oc2VsLT5yLndpZHRoLCBzZWwtPmZsYWdzKSk7Ci0Jc2VsLT5yLmhlaWdodCA9IG1heCgwLCBTTUlBUFBfQUxJR05fRElNKHNlbC0+ci5oZWlnaHQsIHNlbC0+ZmxhZ3MpKTsKKwlzZWwtPnIud2lkdGggPSBTTUlBUFBfQUxJR05fRElNKHNlbC0+ci53aWR0aCwgc2VsLT5mbGFncyk7CisJc2VsLT5yLmhlaWdodCA9CVNNSUFQUF9BTElHTl9ESU0oc2VsLT5yLmhlaWdodCwgc2VsLT5mbGFncyk7CiAKIAlzZWwtPnIud2lkdGggPSBtYXhfdCh1bnNpZ25lZCBpbnQsCiAJCQkgICAgIHNlbnNvci0+bGltaXRzW1NNSUFQUF9MSU1JVF9NSU5fWF9PVVRQVVRfU0laRV0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9zb2NfY2FtZXJhL210OW0xMTEuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3NvY19jYW1lcmEvbXQ5bTExMS5jCmluZGV4IDZmNDA1NjYuLmNjZjU5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3NvY19jYW1lcmEvbXQ5bTExMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3NvY19jYW1lcmEvbXQ5bTExMS5jCkBAIC0yMDgsOCArMjA4LDggQEAKIAlzdHJ1Y3QgbXQ5bTExMV9jb250ZXh0ICpjdHg7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OwkvKiBjcm9wcGluZyByZWN0YW5nbGUgKi8KIAlzdHJ1Y3QgdjRsMl9jbGsgKmNsazsKLQlpbnQgd2lkdGg7CQkvKiBvdXRwdXQgKi8KLQlpbnQgaGVpZ2h0OwkJLyogc2l6ZXMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7CS8qIG91dHB1dCAqLworCXVuc2lnbmVkIGludCBoZWlnaHQ7CS8qIHNpemVzICovCiAJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7IC8qIGxvY2sgdG8gcHJvdGVjdCBwb3dlcl9jb3VudCAqLwogCWludCBwb3dlcl9jb3VudDsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTUwLmMgYi9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTUwLmMKaW5kZXggODljMGIxMy4uNTQyZDI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvdHZwNTE1MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDUxNTAuYwpAQCAtNTgsMjEgKzU4LDE3IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKIAlpbnQgcmM7CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmFkZHIgPSBjLT5hZGRyLCAuZmxhZ3MgPSAwLAorCQkgIC5idWYgPSAmYWRkciwgLmxlbiA9IDEgfSwKKwkJeyAuYWRkciA9IGMtPmFkZHIsIC5mbGFncyA9IEkyQ19NX1JELAorCQkgIC5idWYgPSBidWZmZXIsIC5sZW4gPSAxIH0KKwl9OwogCi0JYnVmZmVyWzBdID0gYWRkcjsKLQotCXJjID0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQl2NGwyX2VycihzZCwgImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMSlcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW1zbGVlcCgxMCk7Ci0KLQlyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJdjRsMl9lcnIoc2QsICJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDEpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwlyYyA9IGkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChyYyA8IDAgfHwgcmMgIT0gMikgeworCQl2NGwyX2VycihzZCwgImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIsIHJjKTsKKwkJcmV0dXJuIHJjIDwgMCA/IHJjIDogLUVJTzsKIAl9CiAKIAl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICJ0dnA1MTUwOiByZWFkIDB4JTAyeCA9IDB4JTAyeFxuIiwgYWRkciwgYnVmZmVyWzBdKTsKQEAgLTg2Nyw3ICs4NjMsNyBAQAogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IGEtPmM7CiAJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSB0b190dnA1MTUwKHNkKTsKIAl2NGwyX3N0ZF9pZCBzdGQ7Ci0JaW50IGhtYXg7CisJdW5zaWduZWQgaW50IGhtYXg7CiAKIAl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICIlcyBsZWZ0PSVkLCB0b3A9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsCiAJCV9fZnVuY19fLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CkBAIC04NzcsOSArODczLDkgQEAKIAogCS8qIHR2cDUxNTAgaGFzIHNvbWUgc3BlY2lhbCBsaW1pdHMgKi8KIAlyZWN0LmxlZnQgPSBjbGFtcChyZWN0LmxlZnQsIDAsIFRWUDUxNTBfTUFYX0NST1BfTEVGVCk7Ci0JcmVjdC53aWR0aCA9IGNsYW1wKHJlY3Qud2lkdGgsCi0JCQkgICBUVlA1MTUwX0hfTUFYIC0gVFZQNTE1MF9NQVhfQ1JPUF9MRUZUIC0gcmVjdC5sZWZ0LAotCQkJICAgVFZQNTE1MF9IX01BWCAtIHJlY3QubGVmdCk7CisJcmVjdC53aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCByZWN0LndpZHRoLAorCQkJICAgICBUVlA1MTUwX0hfTUFYIC0gVFZQNTE1MF9NQVhfQ1JPUF9MRUZUIC0gcmVjdC5sZWZ0LAorCQkJICAgICBUVlA1MTUwX0hfTUFYIC0gcmVjdC5sZWZ0KTsKIAlyZWN0LnRvcCA9IGNsYW1wKHJlY3QudG9wLCAwLCBUVlA1MTUwX01BWF9DUk9QX1RPUCk7CiAKIAkvKiBDYWxjdWxhdGUgaGVpZ2h0IGJhc2VkIG9uIGN1cnJlbnQgc3RhbmRhcmQgKi8KQEAgLTg5Myw5ICs4ODksOSBAQAogCWVsc2UKIAkJaG1heCA9IFRWUDUxNTBfVl9NQVhfT1RIRVJTOwogCi0JcmVjdC5oZWlnaHQgPSBjbGFtcChyZWN0LmhlaWdodCwKLQkJCSAgICBobWF4IC0gVFZQNTE1MF9NQVhfQ1JPUF9UT1AgLSByZWN0LnRvcCwKLQkJCSAgICBobWF4IC0gcmVjdC50b3ApOworCXJlY3QuaGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIHJlY3QuaGVpZ2h0LAorCQkJICAgICAgaG1heCAtIFRWUDUxNTBfTUFYX0NST1BfVE9QIC0gcmVjdC50b3AsCisJCQkgICAgICBobWF4IC0gcmVjdC50b3ApOwogCiAJdHZwNTE1MF93cml0ZShzZCwgVFZQNTE1MF9WRVJUX0JMQU5LSU5HX1NUQVJULCByZWN0LnRvcCk7CiAJdHZwNTE1MF93cml0ZShzZCwgVFZQNTE1MF9WRVJUX0JMQU5LSU5HX1NUT1AsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy92czY2MjQuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3ZzNjYyNC5jCmluZGV4IDI1YmRkOTMuLjIzZjRmNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3ZzNjYyNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3ZzNjYyNC5jCkBAIC01MDMsNiArNTAzLDcgQEAKIAlyZXR1cm4gJmNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgdnM2NjI0LCBoZGwpLT5zZDsKIH0KIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIHN0YXRpYyBpbnQgdnM2NjI0X3JlYWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTE2IGluZGV4KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTUxNSw2ICs1MTYsNyBAQAogCiAJcmV0dXJuIGJ1ZlswXTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IHZzNjYyNF93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MTYgaW5kZXgsCiAJCQkJdTggdmFsdWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL21lZGlhLWVudGl0eS5jIGIvZHJpdmVycy9tZWRpYS9tZWRpYS1lbnRpdHkuYwppbmRleCAyYzI4NmMzLi4zN2MzMzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL21lZGlhLWVudGl0eS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvbWVkaWEtZW50aXR5LmMKQEAgLTIzNSw2ICsyMzUsOCBAQAogCW1lZGlhX2VudGl0eV9ncmFwaF93YWxrX3N0YXJ0KCZncmFwaCwgZW50aXR5KTsKIAogCXdoaWxlICgoZW50aXR5ID0gbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfbmV4dCgmZ3JhcGgpKSkgeworCQlERUNMQVJFX0JJVE1BUChhY3RpdmUsIGVudGl0eS0+bnVtX3BhZHMpOworCQlERUNMQVJFX0JJVE1BUChoYXNfbm9fbGlua3MsIGVudGl0eS0+bnVtX3BhZHMpOwogCQl1bnNpZ25lZCBpbnQgaTsKIAogCQllbnRpdHktPnN0cmVhbV9jb3VudCsrOwpAQCAtMjQ4LDIxICsyNTAsNDYgQEAKIAkJaWYgKCFlbnRpdHktPm9wcyB8fCAhZW50aXR5LT5vcHMtPmxpbmtfdmFsaWRhdGUpCiAJCQljb250aW51ZTsKIAorCQliaXRtYXBfemVybyhhY3RpdmUsIGVudGl0eS0+bnVtX3BhZHMpOworCQliaXRtYXBfZmlsbChoYXNfbm9fbGlua3MsIGVudGl0eS0+bnVtX3BhZHMpOworCiAJCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPm51bV9saW5rczsgaSsrKSB7CiAJCQlzdHJ1Y3QgbWVkaWFfbGluayAqbGluayA9ICZlbnRpdHktPmxpbmtzW2ldOworCQkJc3RydWN0IG1lZGlhX3BhZCAqcGFkID0gbGluay0+c2luay0+ZW50aXR5ID09IGVudGl0eQorCQkJCQkJPyBsaW5rLT5zaW5rIDogbGluay0+c291cmNlOwogCi0JCQkvKiBJcyB0aGlzIHBhZCBwYXJ0IG9mIGFuIGVuYWJsZWQgbGluaz8gKi8KLQkJCWlmICghKGxpbmstPmZsYWdzICYgTUVESUFfTE5LX0ZMX0VOQUJMRUQpKQotCQkJCWNvbnRpbnVlOworCQkJLyogTWFyayB0aGF0IGEgcGFkIGlzIGNvbm5lY3RlZCBieSBhIGxpbmsuICovCisJCQliaXRtYXBfY2xlYXIoaGFzX25vX2xpbmtzLCBwYWQtPmluZGV4LCAxKTsKIAotCQkJLyogQXJlIHdlIHRoZSBzaW5rIG9yIG5vdD8gKi8KLQkJCWlmIChsaW5rLT5zaW5rLT5lbnRpdHkgIT0gZW50aXR5KQorCQkJLyoKKwkJCSAqIFBhZHMgdGhhdCBlaXRoZXIgZG8gbm90IG5lZWQgdG8gY29ubmVjdCBvcgorCQkJICogYXJlIGNvbm5lY3RlZCB0aHJvdWdoIGFuIGVuYWJsZWQgbGluayBhcmUKKwkJCSAqIGZpbmUuCisJCQkgKi8KKwkJCWlmICghKHBhZC0+ZmxhZ3MgJiBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUKSB8fAorCQkJICAgIGxpbmstPmZsYWdzICYgTUVESUFfTE5LX0ZMX0VOQUJMRUQpCisJCQkJYml0bWFwX3NldChhY3RpdmUsIHBhZC0+aW5kZXgsIDEpOworCisJCQkvKgorCQkJICogTGluayB2YWxpZGF0aW9uIHdpbGwgb25seSB0YWtlIHBsYWNlIGZvcgorCQkJICogc2luayBlbmRzIG9mIHRoZSBsaW5rIHRoYXQgYXJlIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmIChsaW5rLT5zaW5rICE9IHBhZCB8fAorCQkJICAgICEobGluay0+ZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpCiAJCQkJY29udGludWU7CiAKIAkJCXJldCA9IGVudGl0eS0+b3BzLT5saW5rX3ZhbGlkYXRlKGxpbmspOwogCQkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkKIAkJCQlnb3RvIGVycm9yOwogCQl9CisKKwkJLyogRWl0aGVyIG5vIGxpbmtzIG9yIHZhbGlkYXRlZCBsaW5rcyBhcmUgZmluZS4gKi8KKwkJYml0bWFwX29yKGFjdGl2ZSwgYWN0aXZlLCBoYXNfbm9fbGlua3MsIGVudGl0eS0+bnVtX3BhZHMpOworCisJCWlmICghYml0bWFwX2Z1bGwoYWN0aXZlLCBlbnRpdHktPm51bV9wYWRzKSkgeworCQkJcmV0ID0gLUVQSVBFOworCQkJZ290byBlcnJvcjsKKwkJfQogCX0KIAogCW11dGV4X3VubG9jaygmbWRldi0+Z3JhcGhfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1jYXJkcy5jCmluZGV4IGQ4NWNiMGEuLjY2NjJiNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9idDh4eC9idHR2LWNhcmRzLmMKQEAgLTI0MjYsNyArMjQyNiw3IEBACiAJfSwKIAkJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJW0JUVFZfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0xJVEVdID0gewotCQkvKiBNaWNoYWVsIEtydWZreSA8bWtydWZreUBtMWsubmV0PiAqLworCQkvKiBNaWNoYWVsIEtydWZreSA8bWtydWZreUBsaW51eHR2Lm9yZz4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDZYRiwgLyogVERWUy1IMDY0RiAqLwogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9idDh4eC9idHR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1kcml2ZXIuYwppbmRleCA5MmEwNmZkLi5hZmNkNTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9idDh4eC9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2J0OHh4L2J0dHYtZHJpdmVyLmMKQEAgLTExMjYsOSArMTEyNiw5IEBACiAJCWMtPm1pbl9zY2FsZWRfaGVpZ2h0ID0gMzI7CiAJfSBlbHNlIHsKIAkJYy0+bWluX3NjYWxlZF93aWR0aCA9Ci0JCQkobWF4KDQ4LCBjLT5yZWN0LndpZHRoID4+IDQpICsgMykgJiB+MzsKKwkJCShtYXhfdCh1bnNpZ25lZCBpbnQsIDQ4LCBjLT5yZWN0LndpZHRoID4+IDQpICsgMykgJiB+MzsKIAkJYy0+bWluX3NjYWxlZF9oZWlnaHQgPQotCQkJbWF4KDMyLCBjLT5yZWN0LmhlaWdodCA+PiA0KTsKKwkJCW1heF90KHVuc2lnbmVkIGludCwgMzIsIGMtPnJlY3QuaGVpZ2h0ID4+IDQpOwogCX0KIAogCWMtPm1heF9zY2FsZWRfd2lkdGggID0gYy0+cmVjdC53aWR0aCAmIH4zOwpAQCAtMjAyNCw3ICsyMDI0LDcgQEAKIAkJLyogV2UgY2Fubm90IHNjYWxlIHVwLiBXaGVuIHRoZSBzY2FsZWQgaW1hZ2UgaXMgbGFyZ2VyCiAJCSAgIHRoYW4gY3JvcC5yZWN0IHdlIGFkanVzdCB0aGUgY3JvcC5yZWN0IGFzIHJlcXVpcmVkCiAJCSAgIGJ5IHRoZSBWNEwyIHNwZWMsIGhlbmNlIGNyb3BjYXAuYm91bmRzIGFyZSBvdXIgbGltaXQuICovCi0JCW1heF93aWR0aCA9IG1pbihiLT53aWR0aCwgKF9fczMyKSBNQVhfSEFDVElWRSk7CisJCW1heF93aWR0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgYi0+d2lkdGgsIE1BWF9IQUNUSVZFKTsKIAkJbWF4X2hlaWdodCA9IGItPmhlaWdodDsKIAogCQkvKiBXZSBjYW5ub3QgY2FwdHVyZSB0aGUgc2FtZSBsaW5lIGFzIHZpZGVvIGFuZCBWQkkgZGF0YS4KQEAgLTMyNjYsNyArMzI2Niw5IEBACiAJc3RydWN0IGJ0dHZfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBidHR2ICpidHYgPSBmaC0+YnR2OwogCXN0cnVjdCBzYWE2NTg4X2NvbW1hbmQgY21kOwotCWNtZC5ibG9ja19jb3VudCA9IGNvdW50LzM7CisKKwljbWQuYmxvY2tfY291bnQgPSBjb3VudCAvIDM7CisJY21kLm5vbmJsb2NraW5nID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CiAJY21kLmJ1ZmZlciA9IGRhdGE7CiAJY21kLmluc3RhbmNlID0gZmlsZTsKIAljbWQucmVzdWx0ID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2J0OHh4L2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1ncGlvLmMKaW5kZXggOTIyZTgyMy4uM2YzNjRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnR0di1ncGlvLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc3ViLT5kZXYpOwogCWlmICgwICE9IGVycikgewotCQlrZnJlZShzdWIpOworCQlwdXRfZGV2aWNlKCZzdWItPmRldik7CiAJCXJldHVybiBlcnI7CiAJfQogCXByX2luZm8oIiVkOiBhZGQgc3ViZGV2aWNlIFwiJXNcIlxuIiwgY29yZS0+bnIsIGRldl9uYW1lKCZzdWItPmRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWRyaXZlci5jCmluZGV4IGMxZjhjYzYuLjcxNmJkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MTgvY3gxOC1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDE4L2N4MTgtZHJpdmVyLmMKQEAgLTMyNywxMyArMzI3LDE2IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmM7CiAJdTggZWVkYXRhWzI1Nl07CiAKKwltZW1zZXQodHYsIDAsIHNpemVvZigqdHYpKTsKKwogCWMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOworCWlmICghYykKKwkJcmV0dXJuOwogCiAJc3RybGNweShjLT5uYW1lLCAiY3gxOCB0dmVlcHJvbSB0bXAiLCBzaXplb2YoYy0+bmFtZSkpOwogCWMtPmFkYXB0ZXIgPSAmY3gtPmkyY19hZGFwWzBdOwogCWMtPmFkZHIgPSAweGEwID4+IDE7CiAKLQltZW1zZXQodHYsIDAsIHNpemVvZigqdHYpKTsKIAlpZiAodHZlZXByb21fcmVhZChjLCBlZWRhdGEsIHNpemVvZihlZWRhdGEpKSkKIAkJZ290byByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IDZlOTFlODQuLmIxZTA4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYwpAQCAtNjE4LDcgKzYxOCw3IEBACiAgKiBPbmx5IGJvYXJkcyB3aXRoIGVlcHJvbSBhbmQgYnl0ZSAxIGF0IGVlcHJvbT0xIGhhdmUgaXQKICAqLwogCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoY3gyNTgyMV9hdWRpb19wY2lfdGJsKSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDI1ODIxX2F1ZGlvX3BjaV90YmxbXSA9IHsKIAl7MHgxNGYxLCAweDA5MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXswLH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwppbmRleCBiNzYyYzViLi5lODExNzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKQEAgLTEzNjEsNyArMTM2MSw3IEBACiAJa2ZyZWUoZGV2KTsKIH0KIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4MjU4MjFfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3gyNTgyMV9wY2lfdGJsW10gPSB7CiAJewogCQkvKiBDWDI1ODIxIEF0aGVuYSAqLwogCQkudmVuZG9yID0gMHgxNGYxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggNDAwZWIxYy4uZDAxNDIwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYwpAQCAtOTMxLDkgKzkzMSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGN4ODhfYXVkaW9fZmluaWRldihzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewotCXN0cnVjdCBjeDg4X2F1ZGlvX2RldiAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCi0Jc25kX2NhcmRfZnJlZSgodm9pZCAqKWNhcmQpOworCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAKIAlkZXZuby0tOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9LY29uZmlnCmluZGV4IDE1YjkwZDYuLjc4ODMzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJc2VsZWN0IFZJREVPX1RWRUVQUk9NCiAJc2VsZWN0IENSQzMyCiAJc2VsZWN0IFZJREVPX1NBQTY1ODggaWYgTUVESUFfU1VCRFJWX0FVVE9TRUxFQ1QKKwlzZWxlY3QgVklERU9fU0FBNjc1MkhTIGlmIE1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyBTQUE3MTN4IGJhc2VkCiAJICBUViBjYXJkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L01ha2VmaWxlCmluZGV4IDM1Mzc1NDguLjU4ZGU5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIHNhYTcxMzQteSArPQlzYWE3MTM0LXZpZGVvLm8KIHNhYTcxMzQtJChDT05GSUdfVklERU9fU0FBNzEzNF9SQykgKz0gc2FhNzEzNC1pbnB1dC5vCiAKLW9iai0kKENPTkZJR19WSURFT19TQUE3MTM0KSArPSAgc2FhNjc1MmhzLm8gc2FhNzEzNC5vIHNhYTcxMzQtZW1wcmVzcy5vCitvYmotJChDT05GSUdfVklERU9fU0FBNzEzNCkgKz0gIHNhYTcxMzQubyBzYWE3MTM0LWVtcHJlc3MubwogCiBvYmotJChDT05GSUdfVklERU9fU0FBNzEzNF9BTFNBKSArPSBzYWE3MTM0LWFsc2EubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IGQ0NWU3ZjYuLmM5YjIzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCkBAIC0yNTkwLDcgKzI1OTAsNyBAQAogCQl9fSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BVkVSVFZIRF9BMTgwXSA9IHsKLQkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4KKwkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAJCSAqIFVzZXMgQWxwcyBFbGVjdHJpYyBUREhVMiwgY29udGFpbmluZyBOWFQyMDA0IEFUU0MgRGVjb2RlcgogCQkgKiBBRkFJSywgdGhlcmUgaXMgbm8gYW5hbG9nIGRlbW9kLCB0aHVzLAogCQkgKiBubyBzdXBwb3J0IGZvciBhbmFsb2cgdGVsZXZpc2lvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCmluZGV4IDI3ZDdlZTcuLjEzNjJiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtNzUxLDYgKzc1MSw3IEBACiAJc2FhNzEzNF9pbnB1dF9maW5pKGRldik7CiAJc2FhNzEzNF92YmlfZmluaShkZXYpOwogCXNhYTcxMzRfdHZhdWRpb19maW5pKGRldik7CisJc2FhNzEzNF92aWRlb19maW5pKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwMiw3ICs4MDMsNiBAQAogCSp2ZmQgPSAqdGVtcGxhdGU7CiAJdmZkLT52NGwyX2RldiAgPSAmZGV2LT52NGwyX2RldjsKIAl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQl2ZmQtPmRlYnVnICAgPSB2aWRlb19kZWJ1ZzsKIAlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMgJXMgKCVzKSIsCiAJCSBkZXYtPm5hbWUsIHR5cGUsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOwogCXNldF9iaXQoVjRMMl9GTF9VU0VfRkhfUFJJTywgJnZmZC0+ZmxhZ3MpOwpAQCAtMTAwOCwxMyArMTAwOCwxMyBAQAogCiAJLyogbG9hZCBpMmMgaGVscGVycyAqLwogCWlmIChjYXJkX2lzX2VtcHJlc3MoZGV2KSkgewotCQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0KKwkJZGV2LT5lbXByZXNzX3NkID0KIAkJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAogCQkJCSJzYWE2NzUyaHMiLAogCQkJCXNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLmVtcHJlc3NfYWRkciwgTlVMTCk7CiAKLQkJaWYgKHNkKQotCQkJc2QtPmdycF9pZCA9IEdSUF9FTVBSRVNTOworCQlpZiAoZGV2LT5lbXByZXNzX3NkKQorCQkJZGV2LT5lbXByZXNzX3NkLT5ncnBfaWQgPSBHUlBfRU1QUkVTUzsKIAl9CiAKIAlpZiAoc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmRzX2FkZHIpIHsKQEAgLTEwNDYsNiArMTA0Niw3IEBACiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPdmVybGF5IHN1cHBvcnQgZGlzYWJsZWQuXG4iLCBkZXYtPm5hbWUpOwogCiAJZGV2LT52aWRlb19kZXYgPSB2ZGV2X2luaXQoZGV2LCZzYWE3MTM0X3ZpZGVvX3RlbXBsYXRlLCJ2aWRlbyIpOworCWRldi0+dmlkZW9fZGV2LT5jdHJsX2hhbmRsZXIgPSAmZGV2LT5jdHJsX2hhbmRsZXI7CiAJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+dmlkZW9fZGV2LFZGTF9UWVBFX0dSQUJCRVIsCiAJCQkJICAgIHZpZGVvX25yW2Rldi0+bnJdKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMTA1Nyw2ICsxMDU4LDcgQEAKIAkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+dmlkZW9fZGV2KSk7CiAKIAlkZXYtPnZiaV9kZXYgPSB2ZGV2X2luaXQoZGV2LCAmc2FhNzEzNF92aWRlb190ZW1wbGF0ZSwgInZiaSIpOworCWRldi0+dmJpX2Rldi0+Y3RybF9oYW5kbGVyID0gJmRldi0+Y3RybF9oYW5kbGVyOwogCiAJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+dmJpX2RldixWRkxfVFlQRV9WQkksCiAJCQkJICAgIHZiaV9ucltkZXYtPm5yXSk7CkBAIC0xMDY3LDYgKzEwNjksNyBAQAogCiAJaWYgKGNhcmRfaGFzX3JhZGlvKGRldikpIHsKIAkJZGV2LT5yYWRpb19kZXYgPSB2ZGV2X2luaXQoZGV2LCZzYWE3MTM0X3JhZGlvX3RlbXBsYXRlLCJyYWRpbyIpOworCQlkZXYtPnJhZGlvX2Rldi0+Y3RybF9oYW5kbGVyID0gJmRldi0+cmFkaW9fY3RybF9oYW5kbGVyOwogCQllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYsVkZMX1RZUEVfUkFESU8sCiAJCQkJCSAgICByYWRpb19ucltkZXYtPm5yXSk7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggMzAyMmViMi4uMGE5MDQ3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0yMywxMiArMjMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWV2ZW50Lmg+CisKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3NhYTY3NTJocy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CkBAIC04NSw1MiArODUsNTQgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmg7CiAKLQlkcHJpbnRrKCJvcGVuIGRldj0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7Ci0JZXJyID0gLUVCVVNZOwotCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5lbXByZXNzX3RzcS52Yl9sb2NrKSkKLQkJcmV0dXJuIGVycjsKLQlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZW1wcmVzc191c2VycykpCi0JCWdvdG8gZG9uZTsKKwkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLworCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZmgpCisJCXJldHVybiAtRU5PTUVNOworCisJdjRsMl9maF9pbml0KCZmaC0+ZmgsIHZkZXYpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5pc19lbXByZXNzID0gdHJ1ZTsKKwl2NGwyX2ZoX2FkZCgmZmgtPmZoKTsKIAogCS8qIFVubXV0ZSBhdWRpbyAqLwogCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19NVVRFX0NUUkwsCiAJCXNhYV9yZWFkYihTQUE3MTM0X0FVRElPX01VVEVfQ1RSTCkgJiB+KDEgPDwgNikpOwogCi0JYXRvbWljX2luYygmZGV2LT5lbXByZXNzX3VzZXJzKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7Ci0JZXJyID0gMDsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmRldi0+ZW1wcmVzc190c3EudmJfbG9jayk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0c19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQl2aWRlb2J1Zl9zdG9wKCZkZXYtPmVtcHJlc3NfdHNxKTsKLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmRldi0+ZW1wcmVzc190c3EpOworCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX0VNUFJFU1MpKSB7CisJCXZpZGVvYnVmX3N0b3AoJmRldi0+ZW1wcmVzc190c3EpOworCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmRldi0+ZW1wcmVzc190c3EpOwogCi0JLyogc3RvcCB0aGUgZW5jb2RlciAqLwotCXRzX3Jlc2V0X2VuY29kZXIoZGV2KTsKKwkJLyogc3RvcCB0aGUgZW5jb2RlciAqLworCQl0c19yZXNldF9lbmNvZGVyKGRldik7CiAKLQkvKiBNdXRlIGF1ZGlvICovCi0Jc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX01VVEVfQ1RSTCwKLQkJc2FhX3JlYWRiKFNBQTcxMzRfQVVESU9fTVVURV9DVFJMKSB8ICgxIDw8IDYpKTsKKwkJLyogTXV0ZSBhdWRpbyAqLworCQlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fTVVURV9DVFJMLAorCQkJCXNhYV9yZWFkYihTQUE3MTM0X0FVRElPX01VVEVfQ1RSTCkgfCAoMSA8PCA2KSk7CisJfQogCi0JYXRvbWljX2RlYygmZGV2LT5lbXByZXNzX3VzZXJzKTsKLQorCXY0bDJfZmhfZGVsKCZmaC0+ZmgpOworCXY0bDJfZmhfZXhpdCgmZmgtPmZoKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QKIHRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKKwlpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX0VNUFJFU1MpKQorCQlyZXR1cm4gLUVCVVNZOwogCWlmICghZGV2LT5lbXByZXNzX3N0YXJ0ZWQpCiAJCXRzX2luaXRfZW5jb2RlcihkZXYpOwogCkBAIC0xNDIsNjggKzE0NCwyNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogdHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgcmVxX2V2ZW50cyA9IHBvbGxfcmVxdWVzdGVkX2V2ZW50cyh3YWl0KTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCByYyA9IDA7CiAKLQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmRldi0+ZW1wcmVzc190c3EsIHdhaXQpOworCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoJmZoLT5maCkpCisJCXJjID0gUE9MTFBSSTsKKwllbHNlIGlmIChyZXFfZXZlbnRzICYgUE9MTFBSSSkKKwkJcG9sbF93YWl0KGZpbGUsICZmaC0+Zmgud2FpdCwgd2FpdCk7CisJcmV0dXJuIHJjIHwgdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmRldi0+ZW1wcmVzc190c3EsIHdhaXQpOwogfQogCiAKIHN0YXRpYyBpbnQKIHRzX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoJmRldi0+ZW1wcmVzc190c3EsIHZtYSk7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIF9ub3RfIGNhbGxlZCBkaXJlY3RseSwgYnV0IGZyb20KLSAqIHZpZGVvX2dlbmVyaWNfaW9jdGwgKGFuZCBtYXliZSBvdGhlcnMpLiAgdXNlcnNwYWNlCi0gKiBjb3B5aW5nIGlzIGRvbmUgYWxyZWFkeSwgYXJnIGlzIGEga2VybmVsIHBvaW50ZXIuCi0gKi8KLQotc3RhdGljIGludCBlbXByZXNzX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3RyY3B5KGNhcC0+ZHJpdmVyLCAic2FhNzEzNCIpOwotCXN0cmxjcHkoY2FwLT5jYXJkLCBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLAotCQlzaXplb2YoY2FwLT5jYXJkKSk7Ci0Jc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPmNhcGFiaWxpdGllcyA9Ci0JCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAotCQlWNEwyX0NBUF9SRUFEV1JJVEUgfAotCQlWNEwyX0NBUF9TVFJFQU1JTkc7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW1wcmVzc19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKLXsKLQlpZiAoaS0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQlzdHJjcHkoaS0+bmFtZSwgIkNDSVI2NTYiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtcHJlc3NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQotewotCSppID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQotewotCWlmIChpICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZW1wcmVzc19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKIHsKQEAgLTIxOSw3ICsxODAsNyBAQAogc3RhdGljIGludCBlbXByZXNzX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OwogCiAJc2FhX2NhbGxfYWxsKGRldiwgdmlkZW8sIGdfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CkBAIC0yMzYsNyArMTk3LDcgQEAKIHN0YXRpYyBpbnQgZW1wcmVzc19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKIAogCXY0bDJfZmlsbF9tYnVzX2Zvcm1hdCgmbWJ1c19mbXQsICZmLT5mbXQucGl4LCBWNEwyX01CVVNfRk1UX0ZJWEVEKTsKQEAgLTI1NCw3ICsyMTUsNyBAQAogc3RhdGljIGludCBlbXByZXNzX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CiAKIAl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmZi0+Zm10LnBpeCwgVjRMMl9NQlVTX0ZNVF9GSVhFRCk7CkBAIC0yNjksMTc1ICsyMzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVtcHJlc3NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZGV2LT5lbXByZXNzX3RzcSwgcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZW1wcmVzc19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKCZkZXYtPmVtcHJlc3NfdHNxLCBiKTsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZkZXYtPmVtcHJlc3NfdHNxLCBiKTsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmRldi0+ZW1wcmVzc190c3EsIGIsCi0JCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotCi1zdGF0aWMgaW50IGVtcHJlc3Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKCZkZXYtPmVtcHJlc3NfdHNxKTsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZkZXYtPmVtcHJlc3NfdHNxKTsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX3NfZXh0X2N0cmxzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3RybHMpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGVycjsKLQotCS8qIGNvdW50ID09IDAgaXMgYWJ1c2VkIGluIHNhYTY3NTJocy5jLCBzbyB0aGF0IHNwZWNpYWwKLQkJY2FzZSBpcyBoYW5kbGVkIGhlcmUgZXhwbGljaXRseS4gKi8KLQlpZiAoY3RybHMtPmNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKGN0cmxzLT5jdHJsX2NsYXNzICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVyciA9IHNhYV9jYWxsX2VtcHJlc3MoZGV2LCBjb3JlLCBzX2V4dF9jdHJscywgY3RybHMpOwotCXRzX2luaXRfZW5jb2RlcihkZXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX2dfZXh0X2N0cmxzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3RybHMpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoY3RybHMtPmN0cmxfY2xhc3MgIT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBzYWFfY2FsbF9lbXByZXNzKGRldiwgY29yZSwgZ19leHRfY3RybHMsIGN0cmxzKTsKLX0KLQotc3RhdGljIGludCBlbXByZXNzX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqYykKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiBzYWE3MTM0X2dfY3RybF9pbnRlcm5hbChkZXYsIE5VTEwsIGMpOwotfQotCi1zdGF0aWMgaW50IGVtcHJlc3Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHNhYTcxMzRfc19jdHJsX2ludGVybmFsKGRldiwgTlVMTCwgYyk7Ci19Ci0KLXN0YXRpYyBpbnQgZW1wcmVzc19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYykKLXsKLQkvKiBNdXN0IGJlIHNvcnRlZCBmcm9tIGxvdyB0byBoaWdoIGNvbnRyb2wgSUQhICovCi0Jc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7Ci0JCVY0TDJfQ0lEX1VTRVJfQ0xBU1MsCi0JCVY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCVY0TDJfQ0lEX0NPTlRSQVNULAotCQlWNEwyX0NJRF9TQVRVUkFUSU9OLAotCQlWNEwyX0NJRF9IVUUsCi0JCVY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKLQkJVjRMMl9DSURfQVVESU9fTVVURSwKLQkJVjRMMl9DSURfSEZMSVAsCi0JCTAKLQl9OwotCi0JLyogTXVzdCBiZSBzb3J0ZWQgZnJvbSBsb3cgdG8gaGlnaCBjb250cm9sIElEISAqLwotCXN0YXRpYyBjb25zdCB1MzIgbXBlZ19jdHJsc1tdID0gewotCQlWNEwyX0NJRF9NUEVHX0NMQVNTLAotCQlWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFLAotCQlWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1ULAotCQlWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU8sCi0JCVY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTywKLQkJVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUiwKLQkJVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRLAotCQlWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HLAotCQlWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUsCi0JCVY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcsCi0JCVY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNULAotCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSwKLQkJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAotCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSywKLQkJMAotCX07Ci0Jc3RhdGljIGNvbnN0IHUzMiAqY3RybF9jbGFzc2VzW10gPSB7Ci0JCXVzZXJfY3RybHMsCi0JCW1wZWdfY3RybHMsCi0JCU5VTEwKLQl9OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYy0+aWQgPSB2NGwyX2N0cmxfbmV4dChjdHJsX2NsYXNzZXMsIGMtPmlkKTsKLQlpZiAoYy0+aWQgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGMtPmlkID09IFY0TDJfQ0lEX1VTRVJfQ0xBU1MgfHwgYy0+aWQgPT0gVjRMMl9DSURfTVBFR19DTEFTUykKLQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKGMsIDAsIDAsIDAsIDApOwotCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoYy0+aWQpICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQotCQlyZXR1cm4gc2FhNzEzNF9xdWVyeWN0cmwoZmlsZSwgcHJpdiwgYyk7Ci0JcmV0dXJuIHNhYV9jYWxsX2VtcHJlc3MoZGV2LCBjb3JlLCBxdWVyeWN0cmwsIGMpOwotfQotCi1zdGF0aWMgaW50IGVtcHJlc3NfcXVlcnltZW51KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKmMpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoVjRMMl9DVFJMX0lEMkNMQVNTKGMtPmlkKSAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHNhYV9jYWxsX2VtcHJlc3MoZGV2LCBjb3JlLCBxdWVyeW1lbnUsIGMpOwotfQotCi1zdGF0aWMgaW50IGVtcHJlc3Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkIGlkKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHNhYTcxMzRfc19zdGRfaW50ZXJuYWwoZGV2LCBOVUxMLCBpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgZW1wcmVzc19nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmlkKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JKmlkID0gZGV2LT50dm5vcm0tPmlkOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHRzX2ZvcHMgPQogewogCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCkBAIC00NTAsMjggKzI0MiwyOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB0c19pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcAkJPSBlbXByZXNzX3F1ZXJ5Y2FwLAorCS52aWRpb2NfcXVlcnljYXAJCT0gc2FhNzEzNF9xdWVyeWNhcCwKIAkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAJPSBlbXByZXNzX2VudW1fZm10X3ZpZF9jYXAsCiAJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJCT0gZW1wcmVzc190cnlfZm10X3ZpZF9jYXAsCiAJLnZpZGlvY19zX2ZtdF92aWRfY2FwCQk9IGVtcHJlc3Nfc19mbXRfdmlkX2NhcCwKIAkudmlkaW9jX2dfZm10X3ZpZF9jYXAJCT0gZW1wcmVzc19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcwkJCT0gZW1wcmVzc19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYJCT0gZW1wcmVzc19xdWVyeWJ1ZiwKLQkudmlkaW9jX3FidWYJCQk9IGVtcHJlc3NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmCQkJPSBlbXByZXNzX2RxYnVmLAotCS52aWRpb2Nfc3RyZWFtb24JCT0gZW1wcmVzc19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSBlbXByZXNzX3N0cmVhbW9mZiwKLQkudmlkaW9jX3NfZXh0X2N0cmxzCQk9IGVtcHJlc3Nfc19leHRfY3RybHMsCi0JLnZpZGlvY19nX2V4dF9jdHJscwkJPSBlbXByZXNzX2dfZXh0X2N0cmxzLAotCS52aWRpb2NfZW51bV9pbnB1dAkJPSBlbXByZXNzX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0CQkJPSBlbXByZXNzX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0CQkJPSBlbXByZXNzX3NfaW5wdXQsCi0JLnZpZGlvY19xdWVyeWN0cmwJCT0gZW1wcmVzc19xdWVyeWN0cmwsCi0JLnZpZGlvY19xdWVyeW1lbnUJCT0gZW1wcmVzc19xdWVyeW1lbnUsCi0JLnZpZGlvY19nX2N0cmwJCQk9IGVtcHJlc3NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsCQkJPSBlbXByZXNzX3NfY3RybCwKLQkudmlkaW9jX3Nfc3RkCQkJPSBlbXByZXNzX3Nfc3RkLAotCS52aWRpb2NfZ19zdGQJCQk9IGVtcHJlc3NfZ19zdGQsCisJLnZpZGlvY19yZXFidWZzCQkJPSBzYWE3MTM0X3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZgkJPSBzYWE3MTM0X3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZgkJCT0gc2FhNzEzNF9xYnVmLAorCS52aWRpb2NfZHFidWYJCQk9IHNhYTcxMzRfZHFidWYsCisJLnZpZGlvY19zdHJlYW1vbgkJPSBzYWE3MTM0X3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmCQk9IHNhYTcxMzRfc3RyZWFtb2ZmLAorCS52aWRpb2NfZ19mcmVxdWVuY3kJCT0gc2FhNzEzNF9nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5CQk9IHNhYTcxMzRfc19mcmVxdWVuY3ksCisJLnZpZGlvY19nX3R1bmVyCQkJPSBzYWE3MTM0X2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyCQkJPSBzYWE3MTM0X3NfdHVuZXIsCisJLnZpZGlvY19lbnVtX2lucHV0CQk9IHNhYTcxMzRfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQJCQk9IHNhYTcxMzRfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQJCQk9IHNhYTcxMzRfc19pbnB1dCwKKwkudmlkaW9jX3Nfc3RkCQkJPSBzYWE3MTM0X3Nfc3RkLAorCS52aWRpb2NfZ19zdGQJCQk9IHNhYTcxMzRfZ19zdGQsCisJLnZpZGlvY19sb2dfc3RhdHVzCQk9IHY0bDJfY3RybF9sb2dfc3RhdHVzLAorCS52aWRpb2Nfc3Vic2NyaWJlX2V2ZW50CQk9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZlbnQsCisJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudAk9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTAxLDkgKzI5NCwyNiBAQAogCXNjaGVkdWxlX3dvcmsoJmRldi0+ZW1wcmVzc193b3JrcXVldWUpOwogfQogCitzdGF0aWMgYm9vbCBlbXByZXNzX2N0cmxfZmlsdGVyKGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0lOVkVSVDoKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEU6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CiAKIHN0YXRpYyBpbnQgZW1wcmVzc19pbml0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogeworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsID0gJmRldi0+ZW1wcmVzc19jdHJsX2hhbmRsZXI7CiAJaW50IGVycjsKIAogCWRwcmludGsoIiVzOiAlc1xuIixkZXYtPm5hbWUsX19mdW5jX18pOwpAQCAtNTE2LDYgKzMyNiwxNiBAQAogCXNucHJpbnRmKGRldi0+ZW1wcmVzc19kZXYtPm5hbWUsIHNpemVvZihkZXYtPmVtcHJlc3NfZGV2LT5uYW1lKSwKIAkJICIlcyBlbXByZXNzICglcykiLCBkZXYtPm5hbWUsCiAJCSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwlzZXRfYml0KFY0TDJfRkxfVVNFX0ZIX1BSSU8sICZkZXYtPmVtcHJlc3NfZGV2LT5mbGFncyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdChoZGwsIDIxKTsKKwl2NGwyX2N0cmxfYWRkX2hhbmRsZXIoaGRsLCAmZGV2LT5jdHJsX2hhbmRsZXIsIGVtcHJlc3NfY3RybF9maWx0ZXIpOworCWlmIChkZXYtPmVtcHJlc3Nfc2QpCisJCXY0bDJfY3RybF9hZGRfaGFuZGxlcihoZGwsIGRldi0+ZW1wcmVzc19zZC0+Y3RybF9oYW5kbGVyLCBOVUxMKTsKKwlpZiAoaGRsLT5lcnJvcikgeworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPmVtcHJlc3NfZGV2KTsKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisJfQorCWRldi0+ZW1wcmVzc19kZXYtPmN0cmxfaGFuZGxlciA9IGhkbDsKIAogCUlOSVRfV09SSygmZGV2LT5lbXByZXNzX3dvcmtxdWV1ZSwgZW1wcmVzc19zaWduYWxfdXBkYXRlKTsKIApAQCAtNTUxLDYgKzM3MSw3IEBACiAJCXJldHVybiAwOwogCWZsdXNoX3dvcmsoJmRldi0+ZW1wcmVzc193b3JrcXVldWUpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+ZW1wcmVzc19kZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmRldi0+ZW1wcmVzc19jdHJsX2hhbmRsZXIpOwogCWRldi0+ZW1wcmVzc19kZXYgPSBOVUxMOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LXZiaS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LXZiaS5jCmluZGV4IGU5YWE5NGIuLmQ0ZGExOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtdmJpLmMKQEAgLTExNyw4ICsxMTcsNyBAQAogCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKIAkJCSAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCAgID0gcS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHEtPnByaXZfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3Qgc2FhNzEzNF9idWYsdmIpOwogCXN0cnVjdCBzYWE3MTM0X3R2bm9ybSAqbm9ybSA9IGRldi0+dHZub3JtOwogCXVuc2lnbmVkIGludCBsaW5lcywgbGxlbmd0aCwgc2l6ZTsKQEAgLTE0MSw3ICsxNDAsNyBAQAogCQlidWYtPnZiLndpZHRoICA9IGxsZW5ndGg7CiAJCWJ1Zi0+dmIuaGVpZ2h0ID0gbGluZXM7CiAJCWJ1Zi0+dmIuc2l6ZSAgID0gc2l6ZTsKLQkJYnVmLT5wdCAgICAgICAgPSAmZmgtPnB0X3ZiaTsKKwkJYnVmLT5wdCAgICAgICAgPSAmZGV2LT5wdF92Ymk7CiAKIAkJZXJyID0gdmlkZW9idWZfaW9sb2NrKHEsJmJ1Zi0+dmIsTlVMTCk7CiAJCWlmIChlcnIpCkBAIC0xNjYsOCArMTY1LDcgQEAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggICA9IHEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CiAJaW50IGxsZW5ndGgsbGluZXM7CiAKIAlsaW5lcyAgID0gZGV2LT50dm5vcm0tPnZiaV92X3N0b3BfMCAtIGRldi0+dHZub3JtLT52Ymlfdl9zdGFydF8wICsxOwpAQCAtMTgxLDggKzE3OSw3IEBACiAKIHN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CiAJc3RydWN0IHNhYTcxMzRfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IHNhYTcxMzRfYnVmLHZiKTsKIAogCXNhYTcxMzRfYnVmZmVyX3F1ZXVlKGRldiwmZGV2LT52YmlfcSxidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwppbmRleCBmYjYwZGE4Li5lYjQ3MmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMjcsMTAgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3NhYTY1ODguaD4KKwogI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCiAjaW5jbHVkZSAic2FhNzEzNC5oIgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc2FhNjU4OC5oPgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzY5LDExNyArMzcxLDYgQEAKIH07CiAjZGVmaW5lIFRWTk9STVMgQVJSQVlfU0laRSh0dm5vcm1zKQogCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDApCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfWV9PREQgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfWV9FVkVOICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbm9fY3RybCA9IHsKLQkubmFtZSAgPSAiNDIiLAotCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdmlkZW9fY3RybHNbXSA9IHsKLQkvKiAtLS0gdmlkZW8gLS0tICovCi0JewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCS5uYW1lICAgICAgICAgID0gIkJyaWdodG5lc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMjU1LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMTI4LAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfSx7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCi0JCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDY4LAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfSx7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKLQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxMjcsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCX0sewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0hVRSwKLQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTI4LAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IRkxJUCwKLQkJLm5hbWUgICAgICAgICAgPSAiTWlycm9yIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9LAotCS8qIC0tLSBhdWRpbyAtLS0gKi8KLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JfSx7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAotCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAotCQkubWluaW11bSAgICAgICA9IC0xNSwKLQkJLm1heGltdW0gICAgICAgPSAxNSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LAotCS8qIC0tLSBwcml2YXRlIC0tLSAqLwotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0lOVkVSVCwKLQkJLm5hbWUgICAgICAgICAgPSAiSW52ZXJ0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1lfT0RELAotCQkubmFtZSAgICAgICAgICA9ICJ5IG9mZnNldCBvZGQgZmllbGQiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMTI4LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMCwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCX0sewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfWV9FVkVOLAotCQkubmFtZSAgICAgICAgICA9ICJ5IG9mZnNldCBldmVuIGZpZWxkIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEyOCwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0FVVE9NVVRFLAotCQkubmFtZSAgICAgICAgICA9ICJhdXRvbXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDEsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9Ci19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBDVFJMUyA9IEFSUkFZX1NJWkUodmlkZW9fY3RybHMpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsKiBjdHJsX2J5X2lkKHVuc2lnbmVkIGludCBpZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDVFJMUzsgaSsrKQotCQlpZiAodmlkZW9fY3RybHNbaV0uaWQgPT0gaWQpCi0JCQlyZXR1cm4gdmlkZW9fY3RybHMraTsKLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHN0cnVjdCBzYWE3MTM0X2Zvcm1hdCogZm9ybWF0X2J5X2ZvdXJjYyh1bnNpZ25lZCBpbnQgZm91cmNjKQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtNTE0LDE2ICs0MDUsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHJlc19jaGVjayhzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JcmV0dXJuIChmaC0+cmVzb3VyY2VzICYgYml0KTsKLX0KLQotc3RhdGljIGludCByZXNfbG9ja2VkKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgYml0KQotewotCXJldHVybiAoZGV2LT5yZXNvdXJjZXMgJiBiaXQpOwotfQotCiBzdGF0aWMKIHZvaWQgcmVzX2ZyZWUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdHMpCiB7CkBAIC04NjgsNyArNzQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdGFydF9wcmV2aWV3KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgpCitzdGF0aWMgaW50IHN0YXJ0X3ByZXZpZXcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlLGNvbnRyb2wsYnBsOwogCWludCBlcnI7CkBAIC05MjMsNyArODA0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdG9wX3ByZXZpZXcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCkKK3N0YXRpYyBpbnQgc3RvcF9wcmV2aWV3KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCWRldi0+b3ZlbmFibGUgPSAwOwogCXNhYTcxMzRfc2V0X2RtYWJpdHMoZGV2KTsKQEAgLTEwMTgsOCArODk5LDcgQEAKIAkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCiAJCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOwogCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJaW50IGVycjsKQEAgLTEwNTcsNyArOTM3LDcgQEAKIAkJYnVmLT52Yi5zaXplICAgPSBzaXplOwogCQlidWYtPnZiLmZpZWxkICA9IGZpZWxkOwogCQlidWYtPmZtdCAgICAgICA9IGRldi0+Zm10OwotCQlidWYtPnB0ICAgICAgICA9ICZmaC0+cHRfY2FwOworCQlidWYtPnB0ICAgICAgICA9ICZkZXYtPnB0X2NhcDsKIAkJZGV2LT52aWRlb19xLmN1cnIgPSBOVUxMOwogCiAJCWVyciA9IHZpZGVvYnVmX2lvbG9jayhxLCZidWYtPnZiLCZkZXYtPm92YnVmKTsKQEAgLTEwODIsOCArOTYyLDcgQEAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOwogCiAJKnNpemUgPSBkZXYtPmZtdC0+ZGVwdGggKiBkZXYtPndpZHRoICogZGV2LT5oZWlnaHQgPj4gMzsKIAlpZiAoMCA9PSAqY291bnQpCkBAIC0xMDk0LDEwICs5NzMsMTAgQEAKIAogc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOwogCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CiAKLQlzYWE3MTM0X2J1ZmZlcl9xdWV1ZShmaC0+ZGV2LCZmaC0+ZGV2LT52aWRlb19xLGJ1Zik7CisJc2FhNzEzNF9idWZmZXJfcXVldWUoZGV2LCAmZGV2LT52aWRlb19xLCBidWYpOwogfQogCiBzdGF0aWMgdm9pZCBidWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQpAQCAtMTExNiwxMzMgKzk5NSw1NiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50IHNhYTcxMzRfZ19jdHJsX2ludGVybmFsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCitzdGF0aWMgaW50IHNhYTcxMzRfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsKiBjdHJsOwotCi0JY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOwotCWlmIChOVUxMID09IGN0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCXN3aXRjaCAoYy0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfYnJpZ2h0OwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJYy0+dmFsdWUgPSBkZXYtPmN0bF9odWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfY29udHJhc3Q7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJYy0+dmFsdWUgPSBkZXYtPmN0bF9zYXR1cmF0aW9uOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfbXV0ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfdm9sdW1lOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUOgotCQljLT52YWx1ZSA9IGRldi0+Y3RsX2ludmVydDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJYy0+dmFsdWUgPSBkZXYtPmN0bF9taXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9ZX0VWRU46Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfeV9ldmVuOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfWV9PREQ6Ci0JCWMtPnZhbHVlID0gZGV2LT5jdGxfeV9vZGQ7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPTVVURToKLQkJYy0+dmFsdWUgPSBkZXYtPmN0bF9hdXRvbXV0ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9nX2N0cmxfaW50ZXJuYWwpOwotCi1zdGF0aWMgaW50IHNhYTcxMzRfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKQotewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gc2FhNzEzNF9nX2N0cmxfaW50ZXJuYWwoZmgtPmRldiwgZmgsIGMpOwotfQotCi1pbnQgc2FhNzEzNF9zX2N0cmxfaW50ZXJuYWwoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsICBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCi17Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsKiBjdHJsOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBzYWE3MTM0X2RldiwgY3RybF9oYW5kbGVyKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN0YXJ0X292ZXJsYXkgPSAwOwotCWludCBlcnI7CiAKLQllcnIgPSAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQotCWN0cmwgPSBjdHJsX2J5X2lkKGMtPmlkKTsKLQlpZiAoTlVMTCA9PSBjdHJsKQotCQlnb3RvIGVycm9yOwotCi0JZHByaW50aygic2V0X2NvbnRyb2wgbmFtZT0lcyB2YWw9JWRcbiIsY3RybC0+bmFtZSxjLT52YWx1ZSk7Ci0Jc3dpdGNoIChjdHJsLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOOgotCWNhc2UgVjRMMl9DVFJMX1RZUEVfTUVOVToKLQljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI6Ci0JCWlmIChjLT52YWx1ZSA8IGN0cmwtPm1pbmltdW0pCi0JCQljLT52YWx1ZSA9IGN0cmwtPm1pbmltdW07Ci0JCWlmIChjLT52YWx1ZSA+IGN0cmwtPm1heGltdW0pCi0JCQljLT52YWx1ZSA9IGN0cmwtPm1heGltdW07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIG5vdGhpbmcgKi87Ci0JfQotCXN3aXRjaCAoYy0+aWQpIHsKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQlkZXYtPmN0bF9icmlnaHQgPSBjLT52YWx1ZTsKLQkJc2FhX3dyaXRlYihTQUE3MTM0X0RFQ19MVU1BX0JSSUdIVCwgZGV2LT5jdGxfYnJpZ2h0KTsKKwkJZGV2LT5jdGxfYnJpZ2h0ID0gY3RybC0+dmFsOworCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQlJJR0hULCBjdHJsLT52YWwpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hVRToKLQkJZGV2LT5jdGxfaHVlID0gYy0+dmFsdWU7Ci0JCXNhYV93cml0ZWIoU0FBNzEzNF9ERUNfQ0hST01BX0hVRSwgZGV2LT5jdGxfaHVlKTsKKwkJZGV2LT5jdGxfaHVlID0gY3RybC0+dmFsOworCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0NIUk9NQV9IVUUsIGN0cmwtPnZhbCk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWRldi0+Y3RsX2NvbnRyYXN0ID0gYy0+dmFsdWU7CisJCWRldi0+Y3RsX2NvbnRyYXN0ID0gY3RybC0+dmFsOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQ09OVFJBU1QsCiAJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfY29udHJhc3QgOiBkZXYtPmN0bF9jb250cmFzdCk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJZGV2LT5jdGxfc2F0dXJhdGlvbiA9IGMtPnZhbHVlOworCQlkZXYtPmN0bF9zYXR1cmF0aW9uID0gY3RybC0+dmFsOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0NIUk9NQV9TQVRVUkFUSU9OLAogCQkJICAgZGV2LT5jdGxfaW52ZXJ0ID8gLWRldi0+Y3RsX3NhdHVyYXRpb24gOiBkZXYtPmN0bF9zYXR1cmF0aW9uKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlkZXYtPmN0bF9tdXRlID0gYy0+dmFsdWU7CisJCWRldi0+Y3RsX211dGUgPSBjdHJsLT52YWw7CiAJCXNhYTcxMzRfdHZhdWRpb19zZXRtdXRlKGRldik7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQlkZXYtPmN0bF92b2x1bWUgPSBjLT52YWx1ZTsKKwkJZGV2LT5jdGxfdm9sdW1lID0gY3RybC0+dmFsOwogCQlzYWE3MTM0X3R2YXVkaW9fc2V0dm9sdW1lKGRldixkZXYtPmN0bF92b2x1bWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUOgotCQlkZXYtPmN0bF9pbnZlcnQgPSBjLT52YWx1ZTsKKwkJZGV2LT5jdGxfaW52ZXJ0ID0gY3RybC0+dmFsOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQ09OVFJBU1QsCiAJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfY29udHJhc3QgOiBkZXYtPmN0bF9jb250cmFzdCk7CiAJCXNhYV93cml0ZWIoU0FBNzEzNF9ERUNfQ0hST01BX1NBVFVSQVRJT04sCiAJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfc2F0dXJhdGlvbiA6IGRldi0+Y3RsX3NhdHVyYXRpb24pOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlkZXYtPmN0bF9taXJyb3IgPSBjLT52YWx1ZTsKKwkJZGV2LT5jdGxfbWlycm9yID0gY3RybC0+dmFsOwogCQlyZXN0YXJ0X292ZXJsYXkgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfWV9FVkVOOgotCQlkZXYtPmN0bF95X2V2ZW4gPSBjLT52YWx1ZTsKKwkJZGV2LT5jdGxfeV9ldmVuID0gY3RybC0+dmFsOwogCQlyZXN0YXJ0X292ZXJsYXkgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfWV9PREQ6Ci0JCWRldi0+Y3RsX3lfb2RkID0gYy0+dmFsdWU7CisJCWRldi0+Y3RsX3lfb2RkID0gY3RybC0+dmFsOwogCQlyZXN0YXJ0X292ZXJsYXkgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEU6CkBAIC0xMjUyLDcgKzEwNTQsNyBAQAogCQl0ZGE5ODg3X2NmZy50dW5lciA9IFRVTkVSX1REQTk4ODc7CiAJCXRkYTk4ODdfY2ZnLnByaXYgPSAmZGV2LT50ZGE5ODg3X2NvbmY7CiAKLQkJZGV2LT5jdGxfYXV0b211dGUgPSBjLT52YWx1ZTsKKwkJZGV2LT5jdGxfYXV0b211dGUgPSBjdHJsLT52YWw7CiAJCWlmIChkZXYtPnRkYTk4ODdfY29uZikgewogCQkJaWYgKGRldi0+Y3RsX2F1dG9tdXRlKQogCQkJCWRldi0+dGRhOTg4N19jb25mIHw9IFREQTk4ODdfQVVUT01VVEU7CkBAIC0xMjY0LDI3ICsxMDY2LDE1IEBACiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OgotCQlnb3RvIGVycm9yOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKHJlc3RhcnRfb3ZlcmxheSAmJiBmaCAmJiByZXNfY2hlY2soZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLGZsYWdzKTsKLQkJc3RvcF9wcmV2aWV3KGRldixmaCk7Ci0JCXN0YXJ0X3ByZXZpZXcoZGV2LGZoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7CisJaWYgKHJlc3RhcnRfb3ZlcmxheSAmJiByZXNfbG9ja2VkKGRldiwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKKwkJc3RvcF9wcmV2aWV3KGRldik7CisJCXN0YXJ0X3ByZXZpZXcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCX0KLQllcnIgPSAwOwotCi1lcnJvcjoKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfc19jdHJsX2ludGVybmFsKTsKLQotc3RhdGljIGludCBzYWE3MTM0X3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwgc3RydWN0IHY0bDJfY29udHJvbCAqYykKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmOwotCi0JcmV0dXJuIHNhYTcxMzRfc19jdHJsX2ludGVybmFsKGZoLT5kZXYsIGZoLCBjKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMjkyLDE1ICsxMDgyLDE2IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpzYWE3MTM0X3F1ZXVlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gTlVMTDsKIAogCXN3aXRjaCAodmRldi0+dmZsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6Ci0JCXEgPSAmZmgtPmNhcDsKKwkJcSA9IGZoLT5pc19lbXByZXNzID8gJmRldi0+ZW1wcmVzc190c3EgOiAmZGV2LT5jYXA7CiAJCWJyZWFrOwogCWNhc2UgVkZMX1RZUEVfVkJJOgotCQlxID0gJmZoLT52Ymk7CisJCXEgPSAmZGV2LT52Ymk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMTMxMSw5ICsxMTAyLDEwIEBACiBzdGF0aWMgaW50IHNhYTcxMzRfcmVzb3VyY2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKHZkZXYtPnZmbF90eXBlID09IFZGTF9UWVBFX0dSQUJCRVIpCi0JCXJldHVybiBSRVNPVVJDRV9WSURFTzsKKwkJcmV0dXJuIGZoLT5pc19lbXByZXNzID8gUkVTT1VSQ0VfRU1QUkVTUyA6IFJFU09VUkNFX1ZJREVPOwogCiAJaWYgKHZkZXYtPnZmbF90eXBlID09IFZGTF9UWVBFX1ZCSSkKIAkJcmV0dXJuIFJFU09VUkNFX1ZCSTsKQEAgLTEzMzUsMjIgKzExMjcsNiBAQAogCiAJdjRsMl9maF9pbml0KCZmaC0+ZmgsIHZkZXYpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwotCWZoLT5kZXYgICAgICA9IGRldjsKLQotCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT5jYXAsICZ2aWRlb19xb3BzLAotCQkJICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKLQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2FhNzEzNF9idWYpLAotCQkJICAgIGZoLCBOVUxMKTsKLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmJpLCAmc2FhNzEzNF92YmlfcW9wcywKLQkJCSAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKLQkJCSAgICBWNEwyX0ZJRUxEX1NFUV9UQiwKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKLQkJCSAgICBmaCwgTlVMTCk7Ci0Jc2FhNzEzNF9wZ3RhYmxlX2FsbG9jKGRldi0+cGNpLCZmaC0+cHRfY2FwKTsKLQlzYWE3MTM0X3BndGFibGVfYWxsb2MoZGV2LT5wY2ksJmZoLT5wdF92YmkpOwogCiAJaWYgKHZkZXYtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSB7CiAJCS8qIHN3aXRjaCB0byByYWRpbyBtb2RlICovCkBAIC0xMzY5LDE3ICsxMTQ1LDE4IEBACiB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXN3aXRjaCAodmRldi0+dmZsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6Ci0JCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKQorCQlpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX1ZJREVPKSkKIAkJCXJldHVybiAtRUJVU1k7CiAJCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZShzYWE3MTM0X3F1ZXVlKGZpbGUpLAogCQkJCQkgZGF0YSwgY291bnQsIHBwb3MsCiAJCQkJCSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJY2FzZSBWRkxfVFlQRV9WQkk6Ci0JCWlmICghcmVzX2dldChmaC0+ZGV2LGZoLFJFU09VUkNFX1ZCSSkpCisJCWlmICghcmVzX2dldChkZXYsIGZoLCBSRVNPVVJDRV9WQkkpKQogCQkJcmV0dXJuIC1FQlVTWTsKIAkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKHNhYTcxMzRfcXVldWUoZmlsZSksCiAJCQkJCSAgICBkYXRhLCBjb3VudCwgcHBvcywgMSwKQEAgLTEzOTQsNTIgKzExNzEsNTkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKKwl1bnNpZ25lZCBsb25nIHJlcV9ldmVudHMgPSBwb2xsX3JlcXVlc3RlZF9ldmVudHMod2FpdCk7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpidWYgPSBOVUxMOwogCXVuc2lnbmVkIGludCByYyA9IDA7CiAKLQlpZiAodmRldi0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfVkJJKQotCQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52YmksIHdhaXQpOworCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoJmZoLT5maCkpCisJCXJjID0gUE9MTFBSSTsKKwllbHNlIGlmIChyZXFfZXZlbnRzICYgUE9MTFBSSSkKKwkJcG9sbF93YWl0KGZpbGUsICZmaC0+Zmgud2FpdCwgd2FpdCk7CiAKLQlpZiAocmVzX2NoZWNrKGZoLFJFU09VUkNFX1ZJREVPKSkgewotCQltdXRleF9sb2NrKCZmaC0+Y2FwLnZiX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmZoLT5jYXAuc3RyZWFtKSkKLQkJCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPmNhcC5zdHJlYW0ubmV4dCwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciwgc3RyZWFtKTsKKwlpZiAodmRldi0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfVkJJKQorCQlyZXR1cm4gcmMgfCB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZGV2LT52YmksIHdhaXQpOworCisJaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8pKSB7CisJCW11dGV4X2xvY2soJmRldi0+Y2FwLnZiX2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y2FwLnN0cmVhbSkpCisJCQlidWYgPSBsaXN0X2VudHJ5KGRldi0+Y2FwLnN0cmVhbS5uZXh0LCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBzdHJlYW0pOwogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJmZoLT5jYXAudmJfbG9jayk7Ci0JCWlmIChVTlNFVCA9PSBmaC0+Y2FwLnJlYWRfb2ZmKSB7CisJCW11dGV4X2xvY2soJmRldi0+Y2FwLnZiX2xvY2spOworCQlpZiAoVU5TRVQgPT0gZGV2LT5jYXAucmVhZF9vZmYpIHsKIAkJCS8qIG5lZWQgdG8gY2FwdHVyZSBhIG5ldyBmcmFtZSAqLwotCQkJaWYgKHJlc19sb2NrZWQoZmgtPmRldixSRVNPVVJDRV9WSURFTykpCisJCQlpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX1ZJREVPKSkKIAkJCQlnb3RvIGVycjsKLQkJCWlmICgwICE9IGZoLT5jYXAub3BzLT5idWZfcHJlcGFyZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmLGZoLT5jYXAuZmllbGQpKQorCQkJaWYgKDAgIT0gZGV2LT5jYXAub3BzLT5idWZfcHJlcGFyZSgmZGV2LT5jYXAsCisJCQkJCWRldi0+Y2FwLnJlYWRfYnVmLCBkZXYtPmNhcC5maWVsZCkpCiAJCQkJZ290byBlcnI7Ci0JCQlmaC0+Y2FwLm9wcy0+YnVmX3F1ZXVlKCZmaC0+Y2FwLGZoLT5jYXAucmVhZF9idWYpOwotCQkJZmgtPmNhcC5yZWFkX29mZiA9IDA7CisJCQlkZXYtPmNhcC5vcHMtPmJ1Zl9xdWV1ZSgmZGV2LT5jYXAsIGRldi0+Y2FwLnJlYWRfYnVmKTsKKwkJCWRldi0+Y2FwLnJlYWRfb2ZmID0gMDsKIAkJfQotCQlidWYgPSBmaC0+Y2FwLnJlYWRfYnVmOworCQlidWYgPSBkZXYtPmNhcC5yZWFkX2J1ZjsKIAl9CiAKIAlpZiAoIWJ1ZikKIAkJZ290byBlcnI7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+ZG9uZSwgd2FpdCk7Ci0JaWYgKGJ1Zi0+c3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fAotCSAgICBidWYtPnN0YXRlID09IFZJREVPQlVGX0VSUk9SKQotCQlyYyA9IFBPTExJTnxQT0xMUkROT1JNOwotCW11dGV4X3VubG9jaygmZmgtPmNhcC52Yl9sb2NrKTsKKwlpZiAoYnVmLT5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+c3RhdGUgPT0gVklERU9CVUZfRVJST1IpCisJCXJjIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmNhcC52Yl9sb2NrKTsKIAlyZXR1cm4gcmM7CiAKIGVycjoKLQltdXRleF91bmxvY2soJmZoLT5jYXAudmJfbG9jayk7Ci0JcmV0dXJuIFBPTExFUlI7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmNhcC52Yl9sb2NrKTsKKwlyZXR1cm4gcmMgfCBQT0xMRVJSOwogfQogCiBzdGF0aWMgaW50IHZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTcxMzRfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTY1ODhfY29tbWFuZCBjbWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTQ0OCwyNiArMTIzMiwyOCBAQAogCS8qIHR1cm4gb2ZmIG92ZXJsYXkgKi8KIAlpZiAocmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7Ci0JCXN0b3BfcHJldmlldyhkZXYsZmgpOworCQlzdG9wX3ByZXZpZXcoZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7Ci0JCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9PVkVSTEFZKTsKKwkJcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfT1ZFUkxBWSk7CiAJfQogCiAJLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCiAJaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8pKSB7CiAJCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmZGV2LT5xb3NfcmVxdWVzdCk7Ci0JCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPmNhcCk7Ci0JCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WSURFTyk7CisJCXZpZGVvYnVmX3N0cmVhbW9mZigmZGV2LT5jYXApOworCQlyZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTyk7CisJCXZpZGVvYnVmX21tYXBfZnJlZSgmZGV2LT5jYXApOwogCX0KLQlpZiAoZmgtPmNhcC5yZWFkX2J1ZikgewotCQlidWZmZXJfcmVsZWFzZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmKTsKLQkJa2ZyZWUoZmgtPmNhcC5yZWFkX2J1Zik7CisJaWYgKGRldi0+Y2FwLnJlYWRfYnVmKSB7CisJCWJ1ZmZlcl9yZWxlYXNlKCZkZXYtPmNhcCwgZGV2LT5jYXAucmVhZF9idWYpOworCQlrZnJlZShkZXYtPmNhcC5yZWFkX2J1Zik7CiAJfQogCiAJLyogc3RvcCB2YmkgY2FwdHVyZSAqLwogCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZCSSkpIHsKLQkJdmlkZW9idWZfc3RvcCgmZmgtPnZiaSk7Ci0JCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WQkkpOworCQl2aWRlb2J1Zl9zdG9wKCZkZXYtPnZiaSk7CisJCXJlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZCSSk7CisJCXZpZGVvYnVmX21tYXBfZnJlZSgmZGV2LT52YmkpOwogCX0KIAogCS8qIHRzLWNhcHR1cmUgd2lsbCBub3Qgd29yayBpbiBwbGFuYXIgbW9kZSwgc28gdHVybiBpdCBvZmYgSGFjOiAwNC4wNSovCkBAIC0xNDgwLDEyICsxMjY2LDYgQEAKIAlpZiAodmRldi0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfUkFESU8pCiAJCXNhYV9jYWxsX2FsbChkZXYsIGNvcmUsIGlvY3RsLCBTQUE2NTg4X0NNRF9DTE9TRSwgJmNtZCk7CiAKLQkvKiBmcmVlIHN0dWZmICovCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+Y2FwKTsKLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmkpOwotCXNhYTcxMzRfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCZmaC0+cHRfY2FwKTsKLQlzYWE3MTM0X3BndGFibGVfZnJlZShkZXYtPnBjaSwmZmgtPnB0X3ZiaSk7Ci0KIAl2NGwyX2ZoX2RlbCgmZmgtPmZoKTsKIAl2NGwyX2ZoX2V4aXQoJmZoLT5maCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKQEAgLTE1MDEsMTEgKzEyODEsMTEgQEAKIHN0YXRpYyBzc2l6ZV90IHJhZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAogCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE2NTg4X2NvbW1hbmQgY21kOwogCiAJY21kLmJsb2NrX2NvdW50ID0gY291bnQvMzsKKwljbWQubm9uYmxvY2tpbmcgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKIAljbWQuYnVmZmVyID0gZGF0YTsKIAljbWQuaW5zdGFuY2UgPSBmaWxlOwogCWNtZC5yZXN1bHQgPSAtRU5PREVWOwpAQCAtMTUxNywxNiArMTI5NywxNiBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHNhYTY1ODhfY29tbWFuZCBjbWQ7CisJdW5zaWduZWQgaW50IHJjID0gdjRsMl9jdHJsX3BvbGwoZmlsZSwgd2FpdCk7CiAKIAljbWQuaW5zdGFuY2UgPSBmaWxlOwogCWNtZC5ldmVudF9saXN0ID0gd2FpdDsKLQljbWQucmVzdWx0ID0gLUVOT0RFVjsKKwljbWQucmVzdWx0ID0gMDsKIAlzYWFfY2FsbF9hbGwoZGV2LCBjb3JlLCBpb2N0bCwgU0FBNjU4OF9DTURfUE9MTCwgJmNtZCk7CiAKLQlyZXR1cm4gY21kLnJlc3VsdDsKKwlyZXR1cm4gcmMgfCBjbWQucmVzdWx0OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE1MzQsOCArMTMxNCw3IEBACiBzdGF0aWMgaW50IHNhYTcxMzRfdHJ5X2dldF9zZXRfZm10X3ZiaV9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTM0X3R2bm9ybSAqbm9ybSA9IGRldi0+dHZub3JtOwogCiAJbWVtc2V0KCZmLT5mbXQudmJpLnJlc2VydmVkLCAwLCBzaXplb2YoZi0+Zm10LnZiaS5yZXNlcnZlZCkpOwpAQCAtMTU1NSwxMiArMTMzNCwxMSBAQAogc3RhdGljIGludCBzYWE3MTM0X2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gZGV2LT53aWR0aDsKIAlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IGRldi0+aGVpZ2h0OwotCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gZmgtPmNhcC5maWVsZDsKKwlmLT5mbXQucGl4LmZpZWxkICAgICAgICA9IGRldi0+Y2FwLmZpZWxkOwogCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gZGV2LT5mbXQtPmZvdXJjYzsKIAlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CiAJCShmLT5mbXQucGl4LndpZHRoICogZGV2LT5mbXQtPmRlcHRoKSA+PiAzOwpAQCAtMTU3NCw4ICsxMzUyLDcgQEAKIHN0YXRpYyBpbnQgc2FhNzEzNF9nX2ZtdF92aWRfb3ZlcmxheShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCB2NGwyX2NsaXAgX191c2VyICpjbGlwcyA9IGYtPmZtdC53aW4uY2xpcHM7CiAJdTMyIGNsaXBjb3VudCA9IGYtPmZtdC53aW4uY2xpcGNvdW50OwogCWludCBlcnIgPSAwOwpAQCAtMTYwNyw4ICsxMzg0LDcgQEAKIHN0YXRpYyBpbnQgc2FhNzEzNF90cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAqZm10OwogCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKIAl1bnNpZ25lZCBpbnQgbWF4dywgbWF4aDsKQEAgLTE2NTksOCArMTQzNSw3IEBACiBzdGF0aWMgaW50IHNhYTcxMzRfdHJ5X2ZtdF92aWRfb3ZlcmxheShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAoc2FhNzEzNF9ub19vdmVybGF5ID4gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIlY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTogbm9fb3ZlcmxheVxuIik7CkBAIC0xNjc1LDggKzE0NTAsNyBAQAogc3RhdGljIGludCBzYWE3MTM0X3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGVycjsKIAogCWVyciA9IHNhYTcxMzRfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwpAQCAtMTY4NiwxNSArMTQ2MCwxNCBAQAogCWRldi0+Zm10ICAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKIAlkZXYtPndpZHRoICAgICA9IGYtPmZtdC5waXgud2lkdGg7CiAJZGV2LT5oZWlnaHQgICAgPSBmLT5mbXQucGl4LmhlaWdodDsKLQlmaC0+Y2FwLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwlkZXYtPmNhcC5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2FhNzEzNF9zX2ZtdF92aWRfb3ZlcmxheShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE3MTksMTAgKzE0OTIsMTAgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKKwlpZiAocmVzX2NoZWNrKHByaXYsIFJFU09VUkNFX09WRVJMQVkpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLCBmbGFncyk7Ci0JCXN0b3BfcHJldmlldyhkZXYsIGZoKTsKLQkJc3RhcnRfcHJldmlldyhkZXYsIGZoKTsKKwkJc3RvcF9wcmV2aWV3KGRldik7CisJCXN0YXJ0X3ByZXZpZXcoZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCX0KIApAQCAtMTczMCwyNiArMTUwMyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzYWE3MTM0X3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjKQoraW50IHNhYTcxMzRfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsOwotCi0JaWYgKChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8Ci0JICAgICBjLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpICYmCi0JICAgIChjLT5pZCA8ICBWNEwyX0NJRF9QUklWQVRFX0JBU0UgfHwKLQkgICAgIGMtPmlkID49IFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOwotCSpjID0gKE5VTEwgIT0gY3RybCkgPyAqY3RybCA6IG5vX2N0cmw7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X3F1ZXJ5Y3RybCk7Ci0KLXN0YXRpYyBpbnQgc2FhNzEzNF9lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJdW5zaWduZWQgaW50IG47CiAKIAluID0gaS0+aW5kZXg7CkBAIC0xNzY5LDI3ICsxNTI1LDI3IEBACiAJCWlmICgwICE9ICh2MSAmIDB4NDApKQogCQkJaS0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fSF9MT0NLOwogCQlpZiAoMCAhPSAodjIgJiAweDQwKSkKLQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NZTkM7CisJCQlpLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9OT19TSUdOQUw7CiAJCWlmICgwICE9ICh2MiAmIDB4MGUpKQogCQkJaS0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTUFDUk9WSVNJT047CiAJfQogCWktPnN0ZCA9IFNBQTcxMzRfTk9STVM7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X2VudW1faW5wdXQpOwogCi1zdGF0aWMgaW50IHNhYTcxMzRfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoraW50IHNhYTcxMzRfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCSppID0gZGV2LT5jdGxfaW5wdXQ7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X2dfaW5wdXQpOwogCi1zdGF0aWMgaW50IHNhYTcxMzRfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCitpbnQgc2FhNzEzNF9zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAoaSA+PSBTQUE3MTM0X0lOUFVUX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODAwLDEzICsxNTU2LDE0IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9zX2lucHV0KTsKIAotc3RhdGljIGludCBzYWE3MTM0X3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKK2ludCBzYWE3MTM0X3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7CiAJdTMyIHJhZGlvX2NhcHMsIHZpZGVvX2NhcHMsIHZiaV9jYXBzOwogCiAJdW5zaWduZWQgaW50IHR1bmVyX3R5cGUgPSBkZXYtPnR1bmVyX3R5cGU7CkBAIC0xODI1LDcgKzE1ODIsNyBAQAogCQlyYWRpb19jYXBzIHw9IFY0TDJfQ0FQX1JEU19DQVBUVVJFOwogCiAJdmlkZW9fY2FwcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkU7Ci0JaWYgKHNhYTcxMzRfbm9fb3ZlcmxheSA8PSAwKQorCWlmIChzYWE3MTM0X25vX292ZXJsYXkgPD0gMCAmJiAhZmgtPmlzX2VtcHJlc3MpCiAJCXZpZGVvX2NhcHMgfD0gVjRMMl9DQVBfVklERU9fT1ZFUkxBWTsKIAogCXZiaV9jYXBzID0gVjRMMl9DQVBfVkJJX0NBUFRVUkU7CkBAIC0xODUxLDE0ICsxNjA4LDE3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfcXVlcnljYXApOwogCi1pbnQgc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoLCB2NGwyX3N0ZF9pZCBpZCkKK2ludCBzYWE3MTM0X3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCBpZCkKIHsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpOwogCXY0bDJfc3RkX2lkIGZpeHVwOwogCi0JaWYgKCFmaCAmJiByZXNfbG9ja2VkKGRldiwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKKwlpZiAoZmgtPmlzX2VtcHJlc3MgJiYgcmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX09WRVJMQVkpKSB7CiAJCS8qIERvbid0IGNoYW5nZSB0aGUgc3RkIGZyb20gdGhlIG1wZWcgZGV2aWNlCiAJCSAgIGlmIG92ZXJsYXkgaXMgYWN0aXZlLiAqLwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTg5OCwxNSArMTY1OCwxNSBAQAogCWlkID0gdHZub3Jtc1tpXS5pZDsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JaWYgKGZoICYmIHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKKwlpZiAoIWZoLT5pc19lbXByZXNzICYmIHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLQkJc3RvcF9wcmV2aWV3KGRldiwgZmgpOworCQlzdG9wX3ByZXZpZXcoZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCiAJCXNldF90dm5vcm0oZGV2LCAmdHZub3Jtc1tpXSk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLQkJc3RhcnRfcHJldmlldyhkZXYsIGZoKTsKKwkJc3RhcnRfcHJldmlldyhkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7CiAJfSBlbHNlCiAJCXNldF90dm5vcm0oZGV2LCAmdHZub3Jtc1tpXSk7CkBAIC0xOTE1LDI5ICsxNjc1LDIxIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbCk7CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X3Nfc3RkKTsKIAotc3RhdGljIGludCBzYWE3MTM0X3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCBpZCkKK2ludCBzYWE3MTM0X2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaWQpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQotCXJldHVybiBzYWE3MTM0X3Nfc3RkX2ludGVybmFsKGZoLT5kZXYsIGZoLCBpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2FhNzEzNF9nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmlkKQotewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCSppZCA9IGRldi0+dHZub3JtLT5pZDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfZ19zdGQpOwogCiBzdGF0aWMgaW50IHNhYTcxMzRfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmIChjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICYmCiAJICAgIGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkpCkBAIC0xOTU5LDggKzE3MTEsNyBAQAogCiBzdGF0aWMgaW50IHNhYTcxMzRfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAmJgogCSAgICBjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSkKQEAgLTE5NzEsMjIgKzE3MjIsMTcgQEAKIAogc3RhdGljIGludCBzYWE3MTM0X3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwgY29uc3Qgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmOwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHY0bDJfcmVjdCAqYiA9ICZkZXYtPmNyb3BfYm91bmRzOwogCXN0cnVjdCB2NGwyX3JlY3QgKmMgPSAmZGV2LT5jcm9wX2N1cnJlbnQ7CiAKIAlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKIAkgICAgY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjcm9wLT5jLmhlaWdodCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjcm9wLT5jLndpZHRoIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocmVzX2xvY2tlZChmaC0+ZGV2LCBSRVNPVVJDRV9PVkVSTEFZKSkKKwlpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX09WRVJMQVkpKQogCQlyZXR1cm4gLUVCVVNZOwotCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPKSkKKwlpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX1ZJREVPKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCSpjID0gY3JvcC0+YzsKQEAgLTIwMDYsMTEgKzE3NTIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYWE3MTM0X2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitpbnQgc2FhNzEzNF9nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IG47CiAKIAlpZiAoMCAhPSB0LT5pbmRleCkKQEAgLTIwMzcsMTIgKzE3ODIsMTIgQEAKIAkJdC0+c2lnbmFsID0gMHhmZmZmOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9nX3R1bmVyKTsKIAotc3RhdGljIGludCBzYWE3MTM0X3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitpbnQgc2FhNzEzNF9zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQljb25zdCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJ4LCBtb2RlOwogCiAJaWYgKDAgIT0gdC0+aW5kZXgpCkBAIC0yMDU4LDEyICsxODAzLDEyIEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfc190dW5lcik7CiAKLXN0YXRpYyBpbnQgc2FhNzEzNF9nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKK2ludCBzYWE3MTM0X2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKDAgIT0gZi0+dHVuZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA3MiwxMiArMTgxNywxMiBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X2dfZnJlcXVlbmN5KTsKIAotc3RhdGljIGludCBzYWE3MTM0X3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoraW50IHNhYTcxMzRfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAoMCAhPSBmLT50dW5lcikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDg5LDYgKzE4MzQsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfc19mcmVxdWVuY3kpOwogCiBzdGF0aWMgaW50IHNhYTcxMzRfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCkBAIC0yMTI2LDggKzE4NzIsNyBAQAogc3RhdGljIGludCBzYWE3MTM0X2dfZmJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwKIAkJCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJKmZiID0gZGV2LT5vdmJ1ZjsKIAlmYi0+Y2FwYWJpbGl0eSA9IFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORzsKQEAgLTIxMzgsOCArMTg4Myw3IEBACiBzdGF0aWMgaW50IHNhYTcxMzRfc19mYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLAogCQkJCQljb25zdCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAqZm10OwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmCkBAIC0yMTYwLDEwICsxOTA0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYWE3MTM0X292ZXJsYXkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsIHVuc2lnbmVkIGludCBvbikKK3N0YXRpYyBpbnQgc2FhNzEzNF9vdmVybGF5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgb24pCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gZjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAob24pIHsKQEAgLTIxNzIsNTQgKzE5MTUsNTcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJaWYgKCFyZXNfZ2V0KGRldiwgZmgsIFJFU09VUkNFX09WRVJMQVkpKQorCQlpZiAoIXJlc19nZXQoZGV2LCBwcml2LCBSRVNPVVJDRV9PVkVSTEFZKSkKIAkJCXJldHVybiAtRUJVU1k7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLCBmbGFncyk7Ci0JCXN0YXJ0X3ByZXZpZXcoZGV2LCBmaCk7CisJCXN0YXJ0X3ByZXZpZXcoZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCX0KIAlpZiAoIW9uKSB7Ci0JCWlmICghcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkKKwkJaWYgKCFyZXNfY2hlY2socHJpdiwgUkVTT1VSQ0VfT1ZFUkxBWSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLQkJc3RvcF9wcmV2aWV3KGRldiwgZmgpOworCQlzdG9wX3ByZXZpZXcoZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwotCQlyZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9PVkVSTEFZKTsKKwkJcmVzX2ZyZWUoZGV2LCBwcml2LCBSRVNPVVJDRV9PVkVSTEFZKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNzEzNF9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoraW50IHNhYTcxMzRfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCiB7CiAJcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoc2FhNzEzNF9xdWV1ZShmaWxlKSwgcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X3JlcWJ1ZnMpOwogCi1zdGF0aWMgaW50IHNhYTcxMzRfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitpbnQgc2FhNzEzNF9xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihzYWE3MTM0X3F1ZXVlKGZpbGUpLCBiKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfcXVlcnlidWYpOwogCi1zdGF0aWMgaW50IHNhYTcxMzRfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoraW50IHNhYTcxMzRfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXJldHVybiB2aWRlb2J1Zl9xYnVmKHNhYTcxMzRfcXVldWUoZmlsZSksIGIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9xYnVmKTsKIAotc3RhdGljIGludCBzYWE3MTM0X2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCitpbnQgc2FhNzEzNF9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZihzYWE3MTM0X3F1ZXVlKGZpbGUpLCBiLAogCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfZHFidWYpOwogCi1zdGF0aWMgaW50IHNhYTcxMzRfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitpbnQgc2FhNzEzNF9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXMgPSBzYWE3MTM0X3Jlc291cmNlKGZpbGUpOwogCi0JaWYgKCFyZXNfZ2V0KGRldiwgZmgsIHJlcykpCisJaWYgKCFyZXNfZ2V0KGRldiwgcHJpdiwgcmVzKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIFRoZSBTQUE3MTM0IGhhcyBhIDFLIEZJRk87IHRoZSBkYXRhc2hlZXQgc3VnZ2VzdHMgdGhhdCB3aGVuCkBAIC0yMjI5LDM2ICsxOTc1LDM3IEBACiAJICogVW5mb3J0dW5hdGVseSwgSSBsYWNrIHJlZ2lzdGVyLWxldmVsIGRvY3VtZW50YXRpb24gdG8gY2hlY2sgdGhlCiAJICogTGludXggRklGTyBzZXR1cCBhbmQgY29uZmlybSB0aGUgcGVyZmVjdCB2YWx1ZS4KIAkgKi8KLQlwbV9xb3NfYWRkX3JlcXVlc3QoJmRldi0+cW9zX3JlcXVlc3QsCi0JCQkgICBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJICAgMjApOworCWlmIChyZXMgIT0gUkVTT1VSQ0VfRU1QUkVTUykKKwkJcG1fcW9zX2FkZF9yZXF1ZXN0KCZkZXYtPnFvc19yZXF1ZXN0LAorCQkJICAgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwgMjApOwogCiAJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKHNhYTcxMzRfcXVldWUoZmlsZSkpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9zdHJlYW1vbik7CiAKLXN0YXRpYyBpbnQgc2FhNzEzNF9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitpbnQgc2FhNzEzNF9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQogeworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgZXJyOwotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCWludCByZXMgPSBzYWE3MTM0X3Jlc291cmNlKGZpbGUpOwogCi0JcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZXYtPnFvc19yZXF1ZXN0KTsKKwlpZiAocmVzICE9IFJFU09VUkNFX0VNUFJFU1MpCisJCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmZGV2LT5xb3NfcmVxdWVzdCk7CiAKIAllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoc2FhNzEzNF9xdWV1ZShmaWxlKSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JcmVzX2ZyZWUoZGV2LCBmaCwgcmVzKTsKKwlyZXNfZnJlZShkZXYsIHByaXYsIHJlcyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X3N0cmVhbW9mZik7CiAKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiBzdGF0aWMgaW50IHZpZGlvY19nX3JlZ2lzdGVyIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXJlZy0+dmFsID0gc2FhX3JlYWRiKHJlZy0+cmVnICYgMHhmZmZmZmYpOwogCXJlZy0+c2l6ZSA9IDE7CkBAIC0yMjY4LDggKzIwMTUsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19yZWdpc3RlciAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJY29uc3Qgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc2FhX3dyaXRlYihyZWctPnJlZyAmIDB4ZmZmZmZmLCByZWctPnZhbCk7CiAJcmV0dXJuIDA7CkBAIC0yMjc5LDggKzIwMjUsNyBAQAogc3RhdGljIGludCByYWRpb19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICgwICE9IHQtPmluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyOTksOCArMjA0NCw3IEBACiBzdGF0aWMgaW50IHJhZGlvX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX3R1bmVyICp0KQogewotCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKDAgIT0gdC0+aW5kZXgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjMwOSw1MCArMjA1Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkaW9fZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfaW5wdXQgKmkpCi17Ci0JaWYgKGktPmluZGV4ICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RyY3B5KGktPm5hbWUsICJSYWRpbyIpOwotCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgbm9ybSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYykKLXsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7Ci0KLQlpZiAoYy0+aWQgPCAgVjRMMl9DSURfQkFTRSB8fAotCSAgICBjLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7Ci0JCWN0cmwgPSBjdHJsX2J5X2lkKGMtPmlkKTsKLQkJKmMgPSAqY3RybDsKLQl9IGVsc2UKLQkJKmMgPSBub19jdHJsOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPQogewogCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCkBAIC0yMzg3LDkgKzIwODcsNiBAQAogCS52aWRpb2NfZW51bV9pbnB1dAkJPSBzYWE3MTM0X2VudW1faW5wdXQsCiAJLnZpZGlvY19nX2lucHV0CQkJPSBzYWE3MTM0X2dfaW5wdXQsCiAJLnZpZGlvY19zX2lucHV0CQkJPSBzYWE3MTM0X3NfaW5wdXQsCi0JLnZpZGlvY19xdWVyeWN0cmwJCT0gc2FhNzEzNF9xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwJCQk9IHNhYTcxMzRfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsCQkJPSBzYWE3MTM0X3NfY3RybCwKIAkudmlkaW9jX3N0cmVhbW9uCQk9IHNhYTcxMzRfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYJCT0gc2FhNzEzNF9zdHJlYW1vZmYsCiAJLnZpZGlvY19nX3R1bmVyCQkJPSBzYWE3MTM0X2dfdHVuZXIsCkBAIC0yNDA1LDYgKzIxMDIsOSBAQAogCS52aWRpb2NfZ19yZWdpc3RlciAgICAgICAgICAgICAgPSB2aWRpb2NfZ19yZWdpc3RlciwKIAkudmlkaW9jX3NfcmVnaXN0ZXIgICAgICAgICAgICAgID0gdmlkaW9jX3NfcmVnaXN0ZXIsCiAjZW5kaWYKKwkudmlkaW9jX2xvZ19zdGF0dXMJCT0gdjRsMl9jdHJsX2xvZ19zdGF0dXMsCisJLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQJCT0gdjRsMl9jdHJsX3N1YnNjcmliZV9ldmVudCwKKwkudmlkaW9jX3Vuc3Vic2NyaWJlX2V2ZW50CT0gdjRsMl9ldmVudF91bnN1YnNjcmliZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgcmFkaW9fZm9wcyA9IHsKQEAgLTI0MTksMTYgKzIxMTksMTEgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgcmFkaW9faW9jdGxfb3BzID0gewogCS52aWRpb2NfcXVlcnljYXAJPSBzYWE3MTM0X3F1ZXJ5Y2FwLAogCS52aWRpb2NfZ190dW5lcgkJPSByYWRpb19nX3R1bmVyLAotCS52aWRpb2NfZW51bV9pbnB1dAk9IHJhZGlvX2VudW1faW5wdXQsCiAJLnZpZGlvY19zX3R1bmVyCQk9IHJhZGlvX3NfdHVuZXIsCi0JLnZpZGlvY19zX2lucHV0CQk9IHJhZGlvX3NfaW5wdXQsCi0JLnZpZGlvY19zX3N0ZAkJPSByYWRpb19zX3N0ZCwKLQkudmlkaW9jX3F1ZXJ5Y3RybAk9IHJhZGlvX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfaW5wdXQJCT0gcmFkaW9fZ19pbnB1dCwKLQkudmlkaW9jX2dfY3RybAkJPSBzYWE3MTM0X2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJPSBzYWE3MTM0X3NfY3RybCwKIAkudmlkaW9jX2dfZnJlcXVlbmN5CT0gc2FhNzEzNF9nX2ZyZXF1ZW5jeSwKIAkudmlkaW9jX3NfZnJlcXVlbmN5CT0gc2FhNzEzNF9zX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3N1YnNjcmliZV9ldmVudAk9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZlbnQsCisJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjQ0Nyw4ICsyMTQyLDU1IEBACiAJLmlvY3RsX29wcyAJCT0gJnJhZGlvX2lvY3RsX29wcywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzYWE3MTM0X2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBzYWE3MTM0X3NfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBzYWE3MTM0X2N0cmxfaW52ZXJ0ID0geworCS5vcHMgPSAmc2FhNzEzNF9jdHJsX29wcywKKwkuaWQgPSBWNEwyX0NJRF9QUklWQVRFX0lOVkVSVCwKKwkubmFtZSA9ICJJbnZlcnQiLAorCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubWluID0gMCwKKwkubWF4ID0gMSwKKwkuc3RlcCA9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgc2FhNzEzNF9jdHJsX3lfb2RkID0geworCS5vcHMgPSAmc2FhNzEzNF9jdHJsX29wcywKKwkuaWQgPSBWNEwyX0NJRF9QUklWQVRFX1lfT0RELAorCS5uYW1lID0gIlkgT2Zmc2V0IE9kZCBGaWVsZCIsCisJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCS5taW4gPSAwLAorCS5tYXggPSAxMjgsCisJLnN0ZXAgPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHNhYTcxMzRfY3RybF95X2V2ZW4gPSB7CisJLm9wcyA9ICZzYWE3MTM0X2N0cmxfb3BzLAorCS5pZCA9IFY0TDJfQ0lEX1BSSVZBVEVfWV9FVkVOLAorCS5uYW1lID0gIlkgT2Zmc2V0IEV2ZW4gRmllbGQiLAorCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkubWluID0gMCwKKwkubWF4ID0gMTI4LAorCS5zdGVwID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBzYWE3MTM0X2N0cmxfYXV0b211dGUgPSB7CisJLm9wcyA9ICZzYWE3MTM0X2N0cmxfb3BzLAorCS5pZCA9IFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUsCisJLm5hbWUgPSAiQXV0b211dGUiLAorCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubWluID0gMCwKKwkubWF4ID0gMSwKKwkuc3RlcCA9IDEsCisJLmRlZiA9IDEsCit9OworCiBpbnQgc2FhNzEzNF92aWRlb19pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCA9ICZkZXYtPmN0cmxfaGFuZGxlcjsKKwogCS8qIHNhbml0eWNoZWNrIGluc21vZCBvcHRpb25zICovCiAJaWYgKGdidWZmZXJzIDwgMiB8fCBnYnVmZmVycyA+IFZJREVPX01BWF9GUkFNRSkKIAkJZ2J1ZmZlcnMgPSAyOwpAQCAtMjQ1NiwxNyArMjE5OCwzOCBAQAogCQlnYnVmc2l6ZSA9IGdidWZzaXplX21heDsKIAlnYnVmc2l6ZSA9IChnYnVmc2l6ZSArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLOwogCi0JLyogcHV0IHNvbWUgc2Vuc2libGUgZGVmYXVsdHMgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIC4uLiAqLwotCWRldi0+Y3RsX2JyaWdodCAgICAgPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX0JSSUdIVE5FU1MpLT5kZWZhdWx0X3ZhbHVlOwotCWRldi0+Y3RsX2NvbnRyYXN0ICAgPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX0NPTlRSQVNUKS0+ZGVmYXVsdF92YWx1ZTsKLQlkZXYtPmN0bF9odWUgICAgICAgID0gY3RybF9ieV9pZChWNEwyX0NJRF9IVUUpLT5kZWZhdWx0X3ZhbHVlOwotCWRldi0+Y3RsX3NhdHVyYXRpb24gPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX1NBVFVSQVRJT04pLT5kZWZhdWx0X3ZhbHVlOwotCWRldi0+Y3RsX3ZvbHVtZSAgICAgPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSktPmRlZmF1bHRfdmFsdWU7Ci0JZGV2LT5jdGxfbXV0ZSAgICAgICA9IDE7IC8vIGN0cmxfYnlfaWQoVjRMMl9DSURfQVVESU9fTVVURSktPmRlZmF1bHRfdmFsdWU7Ci0JZGV2LT5jdGxfaW52ZXJ0ICAgICA9IGN0cmxfYnlfaWQoVjRMMl9DSURfUFJJVkFURV9JTlZFUlQpLT5kZWZhdWx0X3ZhbHVlOwotCWRldi0+Y3RsX2F1dG9tdXRlICAgPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUpLT5kZWZhdWx0X3ZhbHVlOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoaGRsLCAxMSk7CisJdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmc2FhNzEzNF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsIDAsIDI1NSwgMSwgMTI4KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZzYWE3MTM0X2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQ09OVFJBU1QsIDAsIDEyNywgMSwgNjgpOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNhYTcxMzRfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9TQVRVUkFUSU9OLCAwLCAxMjcsIDEsIDY0KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZzYWE3MTM0X2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSFVFLCAtMTI4LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNhYTcxMzRfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmc2FhNzEzNF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVRElPX01VVEUsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNhYTcxMzRfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9BVURJT19WT0xVTUUsIC0xNSwgMTUsIDEsIDApOworCXY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnNhYTcxMzRfY3RybF9pbnZlcnQsIE5VTEwpOworCXY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnNhYTcxMzRfY3RybF95X29kZCwgTlVMTCk7CisJdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmc2FhNzEzNF9jdHJsX3lfZXZlbiwgTlVMTCk7CisJdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmc2FhNzEzNF9jdHJsX2F1dG9tdXRlLCBOVUxMKTsKKwlpZiAoaGRsLT5lcnJvcikKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisJaWYgKGNhcmRfaGFzX3JhZGlvKGRldikpIHsKKwkJaGRsID0gJmRldi0+cmFkaW9fY3RybF9oYW5kbGVyOworCQl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KGhkbCwgMik7CisJCXY0bDJfY3RybF9hZGRfaGFuZGxlcihoZGwsICZkZXYtPmN0cmxfaGFuZGxlciwKKwkJCQl2NGwyX2N0cmxfcmFkaW9fZmlsdGVyKTsKKwkJaWYgKGhkbC0+ZXJyb3IpCisJCQlyZXR1cm4gaGRsLT5lcnJvcjsKKwl9CisJZGV2LT5jdGxfbXV0ZSAgICAgICA9IDE7CiAKLQlpZiAoZGV2LT50ZGE5ODg3X2NvbmYgJiYgZGV2LT5jdGxfYXV0b211dGUpCisJaWYgKGRldi0+dGRhOTg4N19jb25mICYmIHNhYTcxMzRfY3RybF9hdXRvbXV0ZS5kZWYpCiAJCWRldi0+dGRhOTg4N19jb25mIHw9IFREQTk4ODdfQVVUT01VVEU7CiAJZGV2LT5hdXRvbXV0ZSAgICAgICA9IDA7CiAKQEAgLTI0ODksOSArMjI1MiwzNCBAQAogCWlmIChzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS52aWRlb19vdXQpCiAJCXNhYTcxMzRfdmlkZW9wb3J0X2luaXQoZGV2KTsKIAorCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmRldi0+Y2FwLCAmdmlkZW9fcW9wcywKKwkJCSAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKKwkJCSAgICBkZXYsIE5VTEwpOworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmRldi0+dmJpLCAmc2FhNzEzNF92YmlfcW9wcywKKwkJCSAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKKwkJCSAgICBWNEwyX0ZJRUxEX1NFUV9UQiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKKwkJCSAgICBkZXYsIE5VTEwpOworCXNhYTcxMzRfcGd0YWJsZV9hbGxvYyhkZXYtPnBjaSwgJmRldi0+cHRfY2FwKTsKKwlzYWE3MTM0X3BndGFibGVfYWxsb2MoZGV2LT5wY2ksICZkZXYtPnB0X3ZiaSk7CisKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBzYWE3MTM0X3ZpZGVvX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogZnJlZSBzdHVmZiAqLworCXNhYTcxMzRfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCAmZGV2LT5wdF9jYXApOworCXNhYTcxMzRfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCAmZGV2LT5wdF92YmkpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmRldi0+Y3RybF9oYW5kbGVyKTsKKwlpZiAoY2FyZF9oYXNfcmFkaW8oZGV2KSkKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmZGV2LT5yYWRpb19jdHJsX2hhbmRsZXIpOworfQorCiBpbnQgc2FhNzEzNF92aWRlb3BvcnRfaW5pdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKIAkvKiBlbmFibGUgdmlkZW8gb3V0cHV0ICovCkBAIC0yNTMzLDYgKzIzMjEsNyBAQAogCS8qIGluaXQgdmlkZW8gaHcgKi8KIAlzZXRfdHZub3JtKGRldiwmdHZub3Jtc1swXSk7CiAJdmlkZW9fbXV4KGRldiwwKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmZGV2LT5jdHJsX2hhbmRsZXIpOwogCXNhYTcxMzRfdHZhdWRpb19zZXRtdXRlKGRldik7CiAJc2FhNzEzNF90dmF1ZGlvX3NldHZvbHVtZShkZXYsZGV2LT5jdGxfdm9sdW1lKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggOGQxNDUzYS4uMjQ3NGU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWZoLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KQEAgLTQxMCwxMiArNDExLDE4IEBACiAjZGVmaW5lIGNhcmQoZGV2KSAgICAgICAgICAgICAoc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0pCiAjZGVmaW5lIGNhcmRfaW4oZGV2LG4pICAgICAgICAoc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0uaW5wdXRzW25dKQogCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUICAgICAgKFY0TDJfQ0lEX1VTRVJfU0FBNzEzNF9CQVNFICsgMCkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9ZX09ERCAgICAgICAoVjRMMl9DSURfVVNFUl9TQUE3MTM0X0JBU0UgKyAxKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1lfRVZFTiAgICAgIChWNEwyX0NJRF9VU0VSX1NBQTcxMzRfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUgICAgKFY0TDJfQ0lEX1VTRVJfU0FBNzEzNF9CQVNFICsgMykKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRldmljZSAvIGZpbGUgaGFuZGxlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICNkZWZpbmUgUkVTT1VSQ0VfT1ZFUkxBWSAgICAgICAxCiAjZGVmaW5lIFJFU09VUkNFX1ZJREVPICAgICAgICAgMgogI2RlZmluZSBSRVNPVVJDRV9WQkkgICAgICAgICAgIDQKKyNkZWZpbmUgUkVTT1VSQ0VfRU1QUkVTUyAgICAgICA4CiAKICNkZWZpbmUgSU5URVJMQUNFX0FVVE8gICAgICAgICAwCiAjZGVmaW5lIElOVEVSTEFDRV9PTiAgICAgICAgICAgMQpAQCAtNDcwLDE2ICs0NzcsOCBAQAogLyogdmlkZW8gZmlsZWhhbmRsZSBzdGF0dXMgKi8KIHN0cnVjdCBzYWE3MTM0X2ZoIHsKIAlzdHJ1Y3QgdjRsMl9maCAgICAgICAgICAgICBmaDsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgICAgICAgICAqZGV2OworCWJvb2wJCQkgICBpc19lbXByZXNzOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJlc291cmNlczsKLQotCS8qIHZpZGVvIGNhcHR1cmUgKi8KLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgICAgICBjYXA7Ci0Jc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAgICAgcHRfY2FwOwotCi0JLyogdmJpIGNhcHR1cmUgKi8KLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgICAgICB2Ymk7Ci0Jc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAgICAgcHRfdmJpOwogfTsKIAogLyogZG1hc291bmQgZHNwIHN0YXR1cyAqLwpAQCAtNTg5LDcgKzU4OCwxMSBAQAogCiAJLyogdmlkZW8rdHMrdmJpIGNhcHR1cmUgKi8KIAlzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAgICB2aWRlb19xOworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIGNhcDsKKwlzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICAgICBwdF9jYXA7CiAJc3RydWN0IHNhYTcxMzRfZG1hcXVldWUgICAgdmJpX3E7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgdmJpOworCXN0cnVjdCBzYWE3MTM0X3BndGFibGUgICAgIHB0X3ZiaTsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB2aWRlb19maWVsZGNvdW50OwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHZiaV9maWVsZGNvdW50OwogCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAgICAgICpmbXQ7CkBAIC01OTksNiArNjAyLDcgQEAKIAkvKiB2YXJpb3VzIHY0bCBjb250cm9scyAqLwogCXN0cnVjdCBzYWE3MTM0X3R2bm9ybSAgICAgICp0dm5vcm07ICAgICAgICAgICAgICAvKiB2aWRlbyAqLwogCXN0cnVjdCBzYWE3MTM0X3R2YXVkaW8gICAgICp0dmF1ZGlvOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAgIGN0cmxfaGFuZGxlcjsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBjdGxfaW5wdXQ7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3RsX2JyaWdodDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICBjdGxfY29udHJhc3Q7CkBAIC02MjYsNiArNjMwLDcgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NhcnJpZXI7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbm9zaWduYWw7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaW5zdXNwZW5kOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAgIHJhZGlvX2N0cmxfaGFuZGxlcjsKIAogCS8qIEkyQyBrZXlib2FyZCBkYXRhICovCiAJc3RydWN0IElSX2kyY19pbml0X2RhdGEgICAgaW5pdF9kYXRhOwpAQCAtNjM4LDEwICs2NDMsMTEgQEAKIAogCS8qIFNBQTcxMzRfTVBFR19FTVBSRVNTIG9ubHkgKi8KIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqZW1wcmVzc19kZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2CSAgICplbXByZXNzX3NkOwogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIGVtcHJlc3NfdHNxOwotCWF0b21pY190IAkJICAgZW1wcmVzc191c2VyczsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICAgICBlbXByZXNzX3dvcmtxdWV1ZTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNzX3N0YXJ0ZWQ7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICAgZW1wcmVzc19jdHJsX2hhbmRsZXI7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19WSURFT19TQUE3MTM0X0RWQikKIAkvKiBTQUE3MTM0X01QRUdfRFZCIG9ubHkgKi8KQEAgLTY5OSw2ICs3MDUsMTYgQEAKIAlfcmM7CQkJCQkJCQlcCiB9KQogCitzdGF0aWMgaW5saW5lIGludCByZXNfY2hlY2soc3RydWN0IHNhYTcxMzRfZmggKmZoLCB1bnNpZ25lZCBpbnQgYml0KQoreworCXJldHVybiBmaC0+cmVzb3VyY2VzICYgYml0OworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNfbG9ja2VkKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgYml0KQoreworCXJldHVybiBkZXYtPnJlc291cmNlcyAmIGJpdDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNhYTcxMzQtY29yZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTc2MSwxMCArNzc3LDMxIEBACiBleHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSBzYWE3MTM0X3ZpZGVvX3RlbXBsYXRlOwogZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhNzEzNF9yYWRpb190ZW1wbGF0ZTsKIAotaW50IHNhYTcxMzRfc19jdHJsX2ludGVybmFsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCAgc3RydWN0IHNhYTcxMzRfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKTsKLWludCBzYWE3MTM0X2dfY3RybF9pbnRlcm5hbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwgc3RydWN0IHY0bDJfY29udHJvbCAqYyk7Ci1pbnQgc2FhNzEzNF9xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYyk7Ci1pbnQgc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwgdjRsMl9zdGRfaWQgaWQpOworaW50IHNhYTcxMzRfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkIGlkKTsKK2ludCBzYWE3MTM0X2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaWQpOworaW50IHNhYTcxMzRfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfaW5wdXQgKmkpOworaW50IHNhYTcxMzRfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKTsKK2ludCBzYWE3MTM0X3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKTsKK2ludCBzYWE3MTM0X3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKTsKK2ludCBzYWE3MTM0X2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KTsKK2ludCBzYWE3MTM0X3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX3R1bmVyICp0KTsKK2ludCBzYWE3MTM0X2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpOworaW50IHNhYTcxMzRfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZik7CitpbnQgc2FhNzEzNF9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCk7CitpbnQgc2FhNzEzNF9xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKK2ludCBzYWE3MTM0X3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CitpbnQgc2FhNzEzNF9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKK2ludCBzYWE3MTM0X3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSk7CitpbnQgc2FhNzEzNF9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKTsKIAogaW50IHNhYTcxMzRfdmlkZW9wb3J0X2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwogdm9pZCBzYWE3MTM0X3NldF90dm5vcm1faHcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwpAQCAtNzczLDYgKzgxMCw3IEBACiBpbnQgc2FhNzEzNF92aWRlb19pbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiB2b2lkIHNhYTcxMzRfaXJxX3ZpZGVvX3NpZ25hbGNoYW5nZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiB2b2lkIHNhYTcxMzRfaXJxX3ZpZGVvX2RvbmUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKTsKK3ZvaWQgc2FhNzEzNF92aWRlb19maW5pKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc3RhMngxMS9zdGEyeDExX3ZpcC5jIGIvZHJpdmVycy9tZWRpYS9wY2kvc3RhMngxMS9zdGEyeDExX3ZpcC5jCmluZGV4IDc3ZWRjMTEuLmU1Y2ZiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3N0YTJ4MTEvc3RhMngxMV92aXAuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zdGEyeDExL3N0YTJ4MTFfdmlwLmMKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAKICNlbmRpZgogCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoc3RhMngxMV92aXBfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3RhMngxMV92aXBfcGNpX3RibFtdID0gewogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1RNSUNSTywgUENJX0RFVklDRV9JRF9TVE1JQ1JPX1ZJUCl9LAogCXswLH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcKaW5kZXggZDdmMDI0OS4uYjJhNDQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZwpAQCAtMzYsNyArMzYsOCBAQAogY29uZmlnIFZJREVPX1NIX1ZPVQogCXRyaXN0YXRlICJTdXBlckggVk9VIHZpZGVvIG91dHB1dCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBNRURJQV9DQU1FUkFfU1VQUE9SVAotCWRlcGVuZHMgb24gVklERU9fREVWICYmIEFSQ0hfU0hNT0JJTEUgJiYgSTJDCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFZpZGVvIE91dHB1dCBVbml0IChWT1UpIG9uIFN1cGVySCBTb0NzLgpAQCAtOTAsMTMgKzkxLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFydi4KIAotY29uZmlnIFZJREVPX09NQVAyCi0JdHJpc3RhdGUgIk9NQVAyIENhbWVyYSBDYXB0dXJlIEludGVyZmFjZSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgQVJDSF9PTUFQMiAmJiBWSURFT19WNEwyX0lOVF9ERVZJQ0UKLQlzZWxlY3QgVklERU9CVUZfRE1BX1NHCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgVEkgT01BUDIgY2FtZXJhIGNhcHR1cmUgaW50ZXJmYWNlCi0KIGNvbmZpZyBWSURFT19PTUFQMwogCXRyaXN0YXRlICJPTUFQIDMgQ2FtZXJhIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBPTUFQX0lPVk1NICYmIFZJREVPX1Y0TDIgJiYgSTJDICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBBUkNIX09NQVAzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9NYWtlZmlsZQppbmRleCAxMzQ4YmExLi5lNTI2OWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vTWFrZWZpbGUKQEAgLTIsOCArMiw2IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgdmlkZW8gY2FwdHVyZS9wbGF5YmFjayBkZXZpY2UgZHJpdmVycy4KICMKIAotb21hcDJjYW0tb2Jqcwk6PQlvbWFwMjR4eGNhbS5vIG9tYXAyNHh4Y2FtLWRtYS5vCi0KIG9iai0kKENPTkZJR19WSURFT19WSU5PKSArPSBpbmR5Y2FtLm8KIG9iai0kKENPTkZJR19WSURFT19WSU5PKSArPSB2aW5vLm8KIApAQCAtMTQsNyArMTIsNiBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gbWFydmVsbC1jY2ljLwogb2JqLSQoQ09ORklHX1ZJREVPX01NUF9DQU1FUkEpICs9IG1hcnZlbGwtY2NpYy8KIAotb2JqLSQoQ09ORklHX1ZJREVPX09NQVAyKQkJKz0gb21hcDJjYW0ubwogb2JqLSQoQ09ORklHX1ZJREVPX09NQVAzKQkrPSBvbWFwM2lzcC8KIAogb2JqLSQoQ09ORklHX1ZJREVPX1ZJVSkgKz0gZnNsLXZpdS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKaW5kZXggZWFjNDcyYi4uYjAyYWJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJLyogSWYgYnVmZmVyIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm4gZXJyb3IgKi8KIAlpZiAobGlzdF9lbXB0eSgmbGF5ZXItPmRtYV9xdWV1ZSkpIHsKIAkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImJ1ZmZlciBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCS8qIEdldCB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSBidWZmZXIgcXVldWUgKi8KIAlsYXllci0+bmV4dF9mcm0gPSBsYXllci0+Y3VyX2ZybSA9IGxpc3RfZW50cnkobGF5ZXItPmRtYV9xdWV1ZS5uZXh0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jCmluZGV4IDUyYWM1ZTYuLjczNWVjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZGF2aW5jaS92cGlmX2NhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZjb21tb24tPmRtYV9xdWV1ZSkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tbW9uLT5pcnFsb2NrLCBmbGFncyk7CiAJCXZwaWZfZGJnKDEsIGRlYnVnLCAiYnVmZmVyIHF1ZXVlIGlzIGVtcHR5XG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PQlVGUzsKIAl9CiAKIAkvKiBHZXQgdGhlIG5leHQgZnJhbWUgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBpZl9kaXNwbGF5LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBpZl9kaXNwbGF5LmMKaW5kZXggYzMxYmNmMS4uOWQxMTVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZGF2aW5jaS92cGlmX2Rpc3BsYXkuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJmNvbW1vbi0+ZG1hX3F1ZXVlKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21tb24tPmlycWxvY2ssIGZsYWdzKTsKIAkJdnBpZl9lcnIoImJ1ZmZlciBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCiAJLyogR2V0IHRoZSBuZXh0IGZyYW1lIGZyb20gdGhlIGJ1ZmZlciBxdWV1ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvS2NvbmZpZwppbmRleCBkMmQzYjRiLi4wMWVkMWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKIAogY29uZmlnIFZJREVPX1NBTVNVTkdfRVhZTk9TNF9JUwogCWJvb2wgIlNhbXN1bmcgUzVQL0VYWU5PUzQgU29DIHNlcmllcyBDYW1lcmEgU3Vic3lzdGVtIGRyaXZlciIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJICYmIFBNX1JVTlRJTUUKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJCiAJZGVwZW5kcyBvbiAoUExBVF9TNVAgfHwgQVJDSF9FWFlOT1MpCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgY2FtZXJhIGhvc3QgaW50ZXJmYWNlIGRldmljZXMgZm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1jYXB0dXJlLmMKaW5kZXggZmIyN2ZmNy4uOGE3MTJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWNhcHR1cmUuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCXZjLT5zdHJlYW1pbmcgPSBmYWxzZTsKIAl9CiAKLQlyZXQgPSB2YjJfZm9wX3JlbGVhc2UoZmlsZSk7CisJcmV0ID0gX3ZiMl9mb3BfcmVsZWFzZShmaWxlLCBOVUxMKTsKIAogCWlmIChjbG9zZSkgewogCQljbGVhcl9iaXQoU1RfQ0FQVF9CVVNZLCAmZmltYy0+c3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtY29yZS5jCmluZGV4IGY3OTE1NjkuLmRhMmZjODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1jb3JlLmMKQEAgLTk5OCw0MSArOTk4LDQ2IEBACiAKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcmVzLT5zdGFydCwgZmltY19pcnFfaGFuZGxlciwKIAkJCSAgICAgICAwLCBkZXZfbmFtZShkZXYpLCBmaW1jKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5zdGFsbCBpcnEgKCVkKVxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOworCQlnb3RvIGVycl9zY2xrOwogCX0KIAogCXJldCA9IGZpbWNfaW5pdGlhbGl6ZV9jYXB0dXJlX3N1YmRldihmaW1jKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jbGs7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3NjbGs7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmaW1jKTsKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfc2Q7CisKKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZXYpKSB7CisJCXJldCA9IGNsa19lbmFibGUoZmltYy0+Y2xvY2tbQ0xLX0dBVEVdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9zZDsKKwl9CisKIAkvKiBJbml0aWFsaXplIGNvbnRpZ3VvdXMgbWVtb3J5IGFsbG9jYXRvciAqLwogCWZpbWMtPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KGRldik7CiAJaWYgKElTX0VSUihmaW1jLT5hbGxvY19jdHgpKSB7CiAJCXJldCA9IFBUUl9FUlIoZmltYy0+YWxsb2NfY3R4KTsKLQkJZ290byBlcnJfcG07CisJCWdvdG8gZXJyX2djbGs7CiAJfQogCiAJZGV2X2RiZyhkZXYsICJGSU1DLiVkIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLCBmaW1jLT5pZCk7Ci0KLQlwbV9ydW50aW1lX3B1dChkZXYpOwogCXJldHVybiAwOwotZXJyX3BtOgotCXBtX3J1bnRpbWVfcHV0KGRldik7CisKK2Vycl9nY2xrOgorCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldikpCisJCWNsa19kaXNhYmxlKGZpbWMtPmNsb2NrW0NMS19HQVRFXSk7CiBlcnJfc2Q6CiAJZmltY191bnJlZ2lzdGVyX2NhcHR1cmVfc3ViZGV2KGZpbWMpOwotZXJyX2NsazoKK2Vycl9zY2xrOgogCWNsa19kaXNhYmxlKGZpbWMtPmNsb2NrW0NMS19CVVNdKTsKIAlmaW1jX2Nsa19wdXQoZmltYyk7CiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiBzdGF0aWMgaW50IGZpbWNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9CWRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTA2NSw2ICsxMDcwLDcgQEAKIAlkYmcoImZpbWMlZDogc3RhdGU6IDB4JWx4IiwgZmltYy0+aWQsIGZpbWMtPnN0YXRlKTsKIAlyZXR1cm4gcmV0OwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgZmltY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtY29yZS5oCmluZGV4IDNkMzc2ZmEuLjE3OTBmYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1jb3JlLmgKQEAgLTQ4MSw3ICs0ODEsNiBAQAogICogQGZsYWdzOgkJYWRkaXRpb25hbCBmbGFncyBmb3IgaW1hZ2UgY29udmVyc2lvbgogICogQHN0YXRlOgkJZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiB1c2VyIGNvbmZpZ3VyYXRpb24KICAqIEBmaW1jX2RldjoJCXRoZSBGSU1DIGRldmljZSB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotICogQG0ybV9jdHg6CQltZW1vcnktdG8tbWVtb3J5IGRldmljZSBjb250ZXh0CiAgKiBAZmg6CQkJdjRsMiBmaWxlIGhhbmRsZQogICogQGN0cmxzOgkJdjRsMiBjb250cm9scyBzdHJ1Y3R1cmUKICAqLwpAQCAtNTAyLDcgKzUwMSw2IEBACiAJdTMyCQkJZmxhZ3M7CiAJdTMyCQkJc3RhdGU7CiAJc3RydWN0IGZpbWNfZGV2CQkqZmltY19kZXY7Ci0Jc3RydWN0IHY0bDJfbTJtX2N0eAkqbTJtX2N0eDsKIAlzdHJ1Y3QgdjRsMl9maAkJZmg7CiAJc3RydWN0IGZpbWNfY3RybHMJY3RybHM7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMtcmVncy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMtcmVncy5jCmluZGV4IGY3NThlMjYuLjI2Mjg3MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLXJlZ3MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy1yZWdzLmMKQEAgLTMzLDQ3ICszMywyMyBAQAogCW1jdWN0bF93cml0ZShJTlRHUjBfSU5UR0QoMCksIGlzLCBNQ1VDVExfUkVHX0lOVEdSMCk7CiB9CiAKLWludCBmaW1jX2lzX2h3X3dhaXRfaW50c3IwX2ludHNkMChzdHJ1Y3QgZmltY19pcyAqaXMpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSAyMDAwOwotCXUzMiBjZmcsIHN0YXR1czsKLQotCWNmZyA9IG1jdWN0bF9yZWFkKGlzLCBNQ1VDVExfUkVHX0lOVFNSMCk7Ci0Jc3RhdHVzID0gSU5UU1IwX0dFVF9JTlRTRCgwLCBjZmcpOwotCi0Jd2hpbGUgKHN0YXR1cykgewotCQljZmcgPSBtY3VjdGxfcmVhZChpcywgTUNVQ1RMX1JFR19JTlRTUjApOwotCQlzdGF0dXMgPSBJTlRTUjBfR0VUX0lOVFNEKDAsIGNmZyk7Ci0JCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCWRldl93YXJuKCZpcy0+cGRldi0+ZGV2LCAiJXMgdGltZW91dFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQotCQl0aW1lb3V0LS07Ci0JCXVkZWxheSgxKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBmaW1jX2lzX2h3X3dhaXRfaW50bXNyMF9pbnRtc2QwKHN0cnVjdCBmaW1jX2lzICppcykKIHsKIAl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDIwMDA7CiAJdTMyIGNmZywgc3RhdHVzOwogCi0JY2ZnID0gbWN1Y3RsX3JlYWQoaXMsIE1DVUNUTF9SRUdfSU5UTVNSMCk7Ci0Jc3RhdHVzID0gSU5UTVNSMF9HRVRfSU5UTVNEKDAsIGNmZyk7Ci0KLQl3aGlsZSAoc3RhdHVzKSB7CisJZG8gewogCQljZmcgPSBtY3VjdGxfcmVhZChpcywgTUNVQ1RMX1JFR19JTlRNU1IwKTsKIAkJc3RhdHVzID0gSU5UTVNSMF9HRVRfSU5UTVNEKDAsIGNmZyk7Ci0JCWlmICh0aW1lb3V0ID09IDApIHsKKworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKIAkJCWRldl93YXJuKCZpcy0+cGRldi0+ZGV2LCAiJXMgdGltZW91dFxuIiwKIAkJCQkgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRTsKKwkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9Ci0JCXRpbWVvdXQtLTsKIAkJdWRlbGF5KDEpOwotCX0KKwl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMtcmVncy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMtcmVncy5oCmluZGV4IDVmYTJmZGEuLjFkOWQ0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLXJlZ3MuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy1yZWdzLmgKQEAgLTE0NSw3ICsxNDUsNiBAQAogaW50IGZpbWNfaXNfaHdfZ2V0X3BhcmFtcyhzdHJ1Y3QgZmltY19pcyAqaXMsIHVuc2lnbmVkIGludCBudW0pOwogCiB2b2lkIGZpbWNfaXNfaHdfc2V0X2ludGdyMF9nZDAoc3RydWN0IGZpbWNfaXMgKmlzKTsKLWludCBmaW1jX2lzX2h3X3dhaXRfaW50c3IwX2ludHNkMChzdHJ1Y3QgZmltY19pcyAqaXMpOwogaW50IGZpbWNfaXNfaHdfd2FpdF9pbnRtc3IwX2ludG1zZDAoc3RydWN0IGZpbWNfaXMgKmlzKTsKIHZvaWQgZmltY19pc19od19zZXRfc2Vuc29yX251bShzdHJ1Y3QgZmltY19pcyAqaXMpOwogdm9pZCBmaW1jX2lzX2h3X3N0cmVhbV9vbihzdHJ1Y3QgZmltY19pcyAqaXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLmMKaW5kZXggOTc3MGZhOS4uMTNhNDIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy5jCkBAIC03ODEsNiArNzgxLDkgQEAKIAlyZXR1cm4gaXMtPmRlYnVnZnNfZW50cnkgPT0gTlVMTCA/IC1FSU8gOiAwOwogfQogCitzdGF0aWMgaW50IGZpbWNfaXNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZmltY19pc19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKKwogc3RhdGljIGludCBmaW1jX2lzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTgzNSwxNCArODM4LDIwIEBACiAJfQogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CiAKKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZXYpKSB7CisJCXJldCA9IGZpbWNfaXNfcnVudGltZV9yZXN1bWUoZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9pcnE7CisJfQorCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9pcnE7CisJCWdvdG8gZXJyX3BtOwogCiAJaXMtPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KGRldik7CiAJaWYgKElTX0VSUihpcy0+YWxsb2NfY3R4KSkgewogCQlyZXQgPSBQVFJfRVJSKGlzLT5hbGxvY19jdHgpOwotCQlnb3RvIGVycl9pcnE7CisJCWdvdG8gZXJyX3BtOwogCX0KIAkvKgogCSAqIFJlZ2lzdGVyIEZJTUMtSVMgVjRMMiBzdWJkZXZzIHRvIHRoaXMgZHJpdmVyLiBUaGUgdmlkZW8gbm9kZXMKQEAgLTg2NywxMCArODc2LDEzIEBACiAKIGVycl9kZnM6CiAJZmltY19pc19kZWJ1Z2ZzX3JlbW92ZShpcyk7Ci1lcnJfdmI6Ci0JdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoaXMtPmFsbG9jX2N0eCk7CiBlcnJfc2Q6CiAJZmltY19pc191bnJlZ2lzdGVyX3N1YmRldnMoaXMpOworZXJyX3ZiOgorCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGlzLT5hbGxvY19jdHgpOworZXJyX3BtOgorCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldikpCisJCWZpbWNfaXNfcnVudGltZV9zdXNwZW5kKGRldik7CiBlcnJfaXJxOgogCWZyZWVfaXJxKGlzLT5pcnEsIGlzKTsKIGVycl9jbGs6CkBAIC05MTksMTAgKzkzMSwxMyBAQAogCiBzdGF0aWMgaW50IGZpbWNfaXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGZpbWNfaXMgKmlzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZmltY19pcyAqaXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJaWYgKCFwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkKKwkJZmltY19pc19ydW50aW1lX3N1c3BlbmQoZGV2KTsKIAlmcmVlX2lycShpcy0+aXJxLCBpcyk7CiAJZmltY19pc191bnJlZ2lzdGVyX3N1YmRldnMoaXMpOwogCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGlzLT5hbGxvY19jdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtbGl0ZS1yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWxpdGUtcmVnLmMKaW5kZXggNzJhMzQzZTNiLi5kMGRjN2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1saXRlLXJlZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWxpdGUtcmVnLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCWludCBpID0gQVJSQVlfU0laRShzcmNfcGl4Zm10X21hcCk7CiAJdTMyIGNmZzsKIAotCXdoaWxlICgtLWkgPj0gMCkgeworCXdoaWxlICgtLWkpIHsKIAkJaWYgKHNyY19waXhmbXRfbWFwW2ldWzBdID09IHBpeGVsY29kZSkKIAkJCWJyZWFrOwogCX0KQEAgLTI0MCw3ICsyNDAsNyBAQAogCXUzMiBjZmcgPSByZWFkbChkZXYtPnJlZ3MgKyBGTElURV9SRUdfQ0lPRE1BRk1UKTsKIAlpbnQgaSA9IEFSUkFZX1NJWkUocGl4Y29kZSk7CiAKLQl3aGlsZSAoLS1pID49IDApCisJd2hpbGUgKC0taSkKIAkJaWYgKHBpeGNvZGVbaV1bMF0gPT0gZi0+Zm10LT5tYnVzX2NvZGUpCiAJCQlicmVhazsKIAljZmcgJj0gfkZMSVRFX1JFR19DSU9ETUFGTVRfWUNCQ1JfT1JERVJfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWxpdGUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWxpdGUuYwppbmRleCBlNTc5OGY3Li43NzllYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1saXRlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtbGl0ZS5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIAkJbXV0ZXhfdW5sb2NrKCZlbnRpdHktPnBhcmVudC0+Z3JhcGhfbXV0ZXgpOwogCX0KIAotCXZiMl9mb3BfcmVsZWFzZShmaWxlKTsKKwlfdmIyX2ZvcF9yZWxlYXNlKGZpbGUsIE5VTEwpOwogCXBtX3J1bnRpbWVfcHV0KCZmaW1jLT5wZGV2LT5kZXYpOwogCWNsZWFyX2JpdChTVF9GTElURV9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSk7CiAKQEAgLTE1NDksNDIgKzE1NDksNDYgQEAKIAkJCSAgICAgICAwLCBkZXZfbmFtZShkZXYpLCBmaW1jKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2NsazsKKwkJZ290byBlcnJfY2xrX3B1dDsKIAl9CiAKIAkvKiBUaGUgdmlkZW8gbm9kZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aGluIHRoZSBzdWJkZXYncyByZWdpc3RlcmVkKCkgb3AgKi8KIAlyZXQgPSBmaW1jX2xpdGVfY3JlYXRlX2NhcHR1cmVfc3ViZGV2KGZpbWMpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX2NsazsKKwkJZ290byBlcnJfY2xrX3B1dDsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZpbWMpOwogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9zZDsKKworCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldikpIHsKKwkJcmV0ID0gY2xrX2VuYWJsZShmaW1jLT5jbG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfc2Q7CisJfQogCiAJZmltYy0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoZGV2KTsKIAlpZiAoSVNfRVJSKGZpbWMtPmFsbG9jX2N0eCkpIHsKIAkJcmV0ID0gUFRSX0VSUihmaW1jLT5hbGxvY19jdHgpOwotCQlnb3RvIGVycl9wbTsKKwkJZ290byBlcnJfY2xrX2RpczsKIAl9CiAKLQlwbV9ydW50aW1lX3B1dChkZXYpOwotCiAJZmltY19saXRlX3NldF9kZWZhdWx0X2NvbmZpZyhmaW1jKTsKIAogCWRldl9kYmcoZGV2LCAiRklNQy1MSVRFLiVkIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLAogCQlmaW1jLT5pbmRleCk7CiAJcmV0dXJuIDA7Ci1lcnJfcG06Ci0JcG1fcnVudGltZV9wdXQoZGV2KTsKKworZXJyX2Nsa19kaXM6CisJaWYgKCFwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSkKKwkJY2xrX2Rpc2FibGUoZmltYy0+Y2xvY2spOwogZXJyX3NkOgogCWZpbWNfbGl0ZV91bnJlZ2lzdGVyX2NhcHR1cmVfc3ViZGV2KGZpbWMpOwotZXJyX2NsazoKK2Vycl9jbGtfcHV0OgogCWZpbWNfbGl0ZV9jbGtfcHV0KGZpbWMpOwogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogc3RhdGljIGludCBmaW1jX2xpdGVfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmaW1jX2xpdGUgKmZpbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTE2MDAsNiArMTYwNCw3IEBACiAJY2xrX2Rpc2FibGUoZmltYy0+Y2xvY2spOwogCXJldHVybiAwOwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgZmltY19saXRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1tMm0uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLW0ybS5jCmluZGV4IDhkMzNiNjguLjlkYTk1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLW0ybS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLW0ybS5jCkBAIC00NCwxNyArNDQsMTcgQEAKIHsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX3ZiLCAqZHN0X3ZiOwogCi0JaWYgKCFjdHggfHwgIWN0eC0+bTJtX2N0eCkKKwlpZiAoIWN0eCB8fCAhY3R4LT5maC5tMm1fY3R4KQogCQlyZXR1cm47CiAKLQlzcmNfdmIgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdHgtPm0ybV9jdHgpOwotCWRzdF92YiA9IHY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKGN0eC0+bTJtX2N0eCk7CisJc3JjX3ZiID0gdjRsMl9tMm1fc3JjX2J1Zl9yZW1vdmUoY3R4LT5maC5tMm1fY3R4KTsKKwlkc3RfdmIgPSB2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgpOwogCiAJaWYgKHNyY192YiAmJiBkc3RfdmIpIHsKIAkJdjRsMl9tMm1fYnVmX2RvbmUoc3JjX3ZiLCB2Yl9zdGF0ZSk7CiAJCXY0bDJfbTJtX2J1Zl9kb25lKGRzdF92YiwgdmJfc3RhdGUpOwogCQl2NGwyX20ybV9qb2JfZmluaXNoKGN0eC0+ZmltY19kZXYtPm0ybS5tMm1fZGV2LAotCQkJCSAgICBjdHgtPm0ybV9jdHgpOworCQkJCSAgICBjdHgtPmZoLm0ybV9jdHgpOwogCX0KIH0KIApAQCAtMTIzLDEyICsxMjMsMTIgQEAKIAkJZmltY19wcmVwYXJlX2RtYV9vZmZzZXQoY3R4LCBkZik7CiAJfQogCi0Jc3JjX3ZiID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+bTJtX2N0eCk7CisJc3JjX3ZiID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+ZmgubTJtX2N0eCk7CiAJcmV0ID0gZmltY19wcmVwYXJlX2FkZHIoY3R4LCBzcmNfdmIsIHNmLCAmc2YtPnBhZGRyKTsKIAlpZiAocmV0KQogCQlnb3RvIGRtYV91bmxvY2s7CiAKLQlkc3RfdmIgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5tMm1fY3R4KTsKKwlkc3RfdmIgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5maC5tMm1fY3R4KTsKIAlyZXQgPSBmaW1jX3ByZXBhcmVfYWRkcihjdHgsIGRzdF92YiwgZGYsICZkZi0+cGFkZHIpOwogCWlmIChyZXQpCiAJCWdvdG8gZG1hX3VubG9jazsKQEAgLTIxOSwzMSArMjE5LDE1IEBACiBzdGF0aWMgdm9pZCBmaW1jX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IGZpbWNfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwotCi0JZGJnKCJjdHg6ICVwLCBjdHgtPnN0YXRlOiAweCV4IiwgY3R4LCBjdHgtPnN0YXRlKTsKLQotCWlmIChjdHgtPm0ybV9jdHgpCi0JCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPm0ybV9jdHgsIHZiKTsKLX0KLQotc3RhdGljIHZvaWQgZmltY19sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnZxKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7Ci0JbXV0ZXhfbG9jaygmY3R4LT5maW1jX2Rldi0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbWNfdW5sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnZxKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7Ci0JbXV0ZXhfdW5sb2NrKCZjdHgtPmZpbWNfZGV2LT5sb2NrKTsKKwl2NGwyX20ybV9idWZfcXVldWUoY3R4LT5maC5tMm1fY3R4LCB2Yik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdmIyX29wcyBmaW1jX3FvcHMgPSB7CiAJLnF1ZXVlX3NldHVwCSA9IGZpbWNfcXVldWVfc2V0dXAsCiAJLmJ1Zl9wcmVwYXJlCSA9IGZpbWNfYnVmX3ByZXBhcmUsCiAJLmJ1Zl9xdWV1ZQkgPSBmaW1jX2J1Zl9xdWV1ZSwKLQkud2FpdF9wcmVwYXJlCSA9IGZpbWNfdW5sb2NrLAotCS53YWl0X2ZpbmlzaAkgPSBmaW1jX2xvY2ssCisJLndhaXRfcHJlcGFyZQkgPSB2YjJfb3BzX3dhaXRfcHJlcGFyZSwKKwkud2FpdF9maW5pc2gJID0gdmIyX29wc193YWl0X2ZpbmlzaCwKIAkuc3RvcF9zdHJlYW1pbmcJID0gc3RvcF9zdHJlYW1pbmcsCiAJLnN0YXJ0X3N0cmVhbWluZyA9IHN0YXJ0X3N0cmVhbWluZywKIH07CkBAIC0zODUsNyArMzY5LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JdnEgPSB2NGwyX20ybV9nZXRfdnEoY3R4LT5tMm1fY3R4LCBmLT50eXBlKTsKKwl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPmZoLm0ybV9jdHgsIGYtPnR5cGUpOwogCiAJaWYgKHZiMl9pc19idXN5KHZxKSkgewogCQl2NGwyX2VycigmZmltYy0+bTJtLnZmZCwgInF1ZXVlICglZCkgYnVzeVxuIiwgZi0+dHlwZSk7CkBAIC00MTAsNTYgKzM5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwotCXJldHVybiB2NGwyX20ybV9yZXFidWZzKGZpbGUsIGN0eC0+bTJtX2N0eCwgcmVxYnVmcyk7Ci19Ci0KLXN0YXRpYyBpbnQgZmltY19tMm1fcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7Ci0JcmV0dXJuIHY0bDJfbTJtX3F1ZXJ5YnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKLX0KLQotc3RhdGljIGludCBmaW1jX20ybV9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCSBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7Ci0JcmV0dXJuIHY0bDJfbTJtX3FidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOwotfQotCi1zdGF0aWMgaW50IGZpbWNfbTJtX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwotCXJldHVybiB2NGwyX20ybV9kcWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgZmltY19tMm1fZXhwYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCSAgICBzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgKmViKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKLQlyZXR1cm4gdjRsMl9tMm1fZXhwYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgZWIpOwotfQotCi0KLXN0YXRpYyBpbnQgZmltY19tMm1fc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7Ci0JcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9uKGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZmltY19tMm1fc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7Ci0JcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9mZihmaWxlLCBjdHgtPm0ybV9jdHgsIHR5cGUpOwotfQotCiBzdGF0aWMgaW50IGZpbWNfbTJtX2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAogCQkJICAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyKQogewpAQCAtNTk4LDEzICs1MzIsMTMgQEAKIAkudmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX20ybV90cnlfZm10X21wbGFuZSwKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19tMm1fc19mbXRfbXBsYW5lLAogCS52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX20ybV9zX2ZtdF9tcGxhbmUsCi0JLnZpZGlvY19yZXFidWZzCQkJPSBmaW1jX20ybV9yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYJCT0gZmltY19tMm1fcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmCQkJPSBmaW1jX20ybV9xYnVmLAotCS52aWRpb2NfZHFidWYJCQk9IGZpbWNfbTJtX2RxYnVmLAotCS52aWRpb2NfZXhwYnVmCQkJPSBmaW1jX20ybV9leHBidWYsCi0JLnZpZGlvY19zdHJlYW1vbgkJPSBmaW1jX20ybV9zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSBmaW1jX20ybV9zdHJlYW1vZmYsCisJLnZpZGlvY19yZXFidWZzCQkJPSB2NGwyX20ybV9pb2N0bF9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJCT0gdjRsMl9tMm1faW9jdGxfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQkJPSB2NGwyX20ybV9pb2N0bF9xYnVmLAorCS52aWRpb2NfZHFidWYJCQk9IHY0bDJfbTJtX2lvY3RsX2RxYnVmLAorCS52aWRpb2NfZXhwYnVmCQkJPSB2NGwyX20ybV9pb2N0bF9leHBidWYsCisJLnZpZGlvY19zdHJlYW1vbgkJPSB2NGwyX20ybV9pb2N0bF9zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgkJPSB2NGwyX20ybV9pb2N0bF9zdHJlYW1vZmYsCiAJLnZpZGlvY19nX2Nyb3AJCQk9IGZpbWNfbTJtX2dfY3JvcCwKIAkudmlkaW9jX3NfY3JvcAkJCT0gZmltY19tMm1fc19jcm9wLAogCS52aWRpb2NfY3JvcGNhcAkJCT0gZmltY19tMm1fY3JvcGNhcApAQCAtNjI0LDYgKzU1OCw3IEBACiAJc3JjX3ZxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKIAlzcmNfdnEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9tMm1fYnVmZmVyKTsKIAlzcmNfdnEtPnRpbWVzdGFtcF90eXBlID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfQ09QWTsKKwlzcmNfdnEtPmxvY2sgPSAmY3R4LT5maW1jX2Rldi0+bG9jazsKIAogCXJldCA9IHZiMl9xdWV1ZV9pbml0KHNyY192cSk7CiAJaWYgKHJldCkKQEAgLTYzNiw2ICs1NzEsNyBAQAogCWRzdF92cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CiAJZHN0X3ZxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IHY0bDJfbTJtX2J1ZmZlcik7CiAJZHN0X3ZxLT50aW1lc3RhbXBfdHlwZSA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7CisJZHN0X3ZxLT5sb2NrID0gJmN0eC0+ZmltY19kZXYtPmxvY2s7CiAKIAlyZXR1cm4gdmIyX3F1ZXVlX2luaXQoZHN0X3ZxKTsKIH0KQEAgLTcwOCw5ICs2NDQsOSBAQAogCWN0eC0+b3V0X3BhdGggPSBGSU1DX0lPX0RNQTsKIAljdHgtPnNjYWxlci5lbmFibGVkID0gMTsKIAotCWN0eC0+bTJtX2N0eCA9IHY0bDJfbTJtX2N0eF9pbml0KGZpbWMtPm0ybS5tMm1fZGV2LCBjdHgsIHF1ZXVlX2luaXQpOwotCWlmIChJU19FUlIoY3R4LT5tMm1fY3R4KSkgewotCQlyZXQgPSBQVFJfRVJSKGN0eC0+bTJtX2N0eCk7CisJY3R4LT5maC5tMm1fY3R4ID0gdjRsMl9tMm1fY3R4X2luaXQoZmltYy0+bTJtLm0ybV9kZXYsIGN0eCwgcXVldWVfaW5pdCk7CisJaWYgKElTX0VSUihjdHgtPmZoLm0ybV9jdHgpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5maC5tMm1fY3R4KTsKIAkJZ290byBlcnJvcl9jOwogCX0KIApAQCAtNzI1LDcgKzY2MSw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX20ybV9jdHg6Ci0JdjRsMl9tMm1fY3R4X3JlbGVhc2UoY3R4LT5tMm1fY3R4KTsKKwl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPmZoLm0ybV9jdHgpOwogZXJyb3JfYzoKIAlmaW1jX2N0cmxzX2RlbGV0ZShjdHgpOwogZXJyb3JfZmg6CkBAIC03NDcsNyArNjgzLDcgQEAKIAogCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOwogCi0JdjRsMl9tMm1fY3R4X3JlbGVhc2UoY3R4LT5tMm1fY3R4KTsKKwl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPmZoLm0ybV9jdHgpOwogCWZpbWNfY3RybHNfZGVsZXRlKGN0eCk7CiAJdjRsMl9maF9kZWwoJmN0eC0+ZmgpOwogCXY0bDJfZmhfZXhpdCgmY3R4LT5maCk7CkBAIC03NjAsNDUgKzY5NiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpbWNfbTJtX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCWludCByZXQ7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmaW1jLT5sb2NrKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXJldCA9IHY0bDJfbTJtX3BvbGwoZmlsZSwgY3R4LT5tMm1fY3R4LCB3YWl0KTsKLQltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGZpbWNfbTJtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKLQlpbnQgcmV0OwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZmltYy0+bG9jaykpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyZXQgPSB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKLQltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBmaW1jX20ybV9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBmaW1jX20ybV9vcGVuLAogCS5yZWxlYXNlCT0gZmltY19tMm1fcmVsZWFzZSwKLQkucG9sbAkJPSBmaW1jX20ybV9wb2xsLAorCS5wb2xsCQk9IHY0bDJfbTJtX2ZvcF9wb2xsLAogCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKLQkubW1hcAkJPSBmaW1jX20ybV9tbWFwLAorCS5tbWFwCQk9IHY0bDJfbTJtX2ZvcF9tbWFwLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX20ybV9vcHMgbTJtX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYwppbmRleCA5ZmMyYWY2Li5mM2MzNTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWlwaS1jc2lzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21pcGktY3Npcy5jCkBAIC05MSw3ICs5MSw3IEBACiAjZGVmaW5lIFM1UENTSVNfSU5UU1JDX09ERF9CRUZPUkUJKDEgPDwgMjkpCiAjZGVmaW5lIFM1UENTSVNfSU5UU1JDX09ERF9BRlRFUgkoMSA8PCAyOCkKICNkZWZpbmUgUzVQQ1NJU19JTlRTUkNfT0RECQkoMHgzIDw8IDI4KQotI2RlZmluZSBTNVBDU0lTX0lOVFNSQ19OT05fSU1BR0VfREFUQQkoMHhmZiA8PCAyOCkKKyNkZWZpbmUgUzVQQ1NJU19JTlRTUkNfTk9OX0lNQUdFX0RBVEEJKDB4ZiA8PCAyOCkKICNkZWZpbmUgUzVQQ1NJU19JTlRTUkNfRlJBTUVfU1RBUlQJKDEgPDwgMjcpCiAjZGVmaW5lIFM1UENTSVNfSU5UU1JDX0ZSQU1FX0VORAkoMSA8PCAyNikKICNkZWZpbmUgUzVQQ1NJU19JTlRTUkNfRVJSX1NPVF9IUwkoMHhmIDw8IDEyKQpAQCAtNzkwLDYgKzc5MCw3IEBACiAjZGVmaW5lIHM1cGNzaXNfcGFyc2VfZHQocGRldiwgc3RhdGUpICgtRU5PU1lTKQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgczVwY3Npc19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHJ1bnRpbWUpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczVwY3Npc19vZl9tYXRjaFtdOwogCiBzdGF0aWMgaW50IHM1cGNzaXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTkwMiwxMyArOTAzLDIxIEBACiAJLyogLi4gYW5kIGEgcG9pbnRlciB0byB0aGUgc3ViZGV2LiAqLwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZzdGF0ZS0+c2QpOwogCW1lbWNweShzdGF0ZS0+ZXZlbnRzLCBzNXBjc2lzX2V2ZW50cywgc2l6ZW9mKHN0YXRlLT5ldmVudHMpKTsKKwogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJaWYgKCFwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSkgeworCQlyZXQgPSBzNXBjc2lzX3BtX3Jlc3VtZShkZXYsIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZV9tX2VudDsKKwl9CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAibGFuZXM6ICVkLCBoc19zZXR0bGU6ICVkLCB3Y2xrOiAlZCwgZnJlcTogJXVcbiIsCiAJCSBzdGF0ZS0+bnVtX2xhbmVzLCBzdGF0ZS0+aHNfc2V0dGxlLCBzdGF0ZS0+d2Nsa19leHQsCiAJCSBzdGF0ZS0+Y2xrX2ZyZXF1ZW5jeSk7CiAJcmV0dXJuIDA7CiAKK2VfbV9lbnQ6CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnN0YXRlLT5zZC5lbnRpdHkpOwogZV9jbGtkaXM6CiAJY2xrX2Rpc2FibGUoc3RhdGUtPmNsb2NrW0NTSVNfQ0xLX01VWF0pOwogZV9jbGtwdXQ6CkBAIC0xMDE0LDcgKzEwMjMsNyBAQAogCXN0cnVjdCBjc2lzX3N0YXRlICpzdGF0ZSA9IHNkX3RvX2NzaXNfc3RhdGUoc2QpOwogCiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCXM1cGNzaXNfcG1fc3VzcGVuZCgmcGRldi0+ZGV2LCBmYWxzZSk7CisJczVwY3Npc19wbV9zdXNwZW5kKCZwZGV2LT5kZXYsIHRydWUpOwogCWNsa19kaXNhYmxlKHN0YXRlLT5jbG9ja1tDU0lTX0NMS19NVVhdKTsKIAlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoJnBkZXYtPmRldik7CiAJczVwY3Npc19jbGtfcHV0KHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZnNsLXZpdS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9mc2wtdml1LmMKaW5kZXggNmEyMzIyMy4uZGJmMGNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9mc2wtdml1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9mc2wtdml1LmMKQEAgLTE1ODAsNyArMTU4MCw3IEBACiAJfQogCiAJLyogZW5hYmxlIFZJVSBjbG9jayAqLwotCWNsayA9IGRldm1fY2xrX2dldCgmb3AtPmRldiwgInZpdV9jbGsiKTsKKwljbGsgPSBkZXZtX2Nsa19nZXQoJm9wLT5kZXYsICJpcGciKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2Vycigmb3AtPmRldiwgImZhaWxlZCB0byBsb29rdXAgdGhlIGNsb2NrIVxuIik7CiAJCXJldCA9IFBUUl9FUlIoY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbTJtLWRlaW50ZXJsYWNlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL20ybS1kZWludGVybGFjZS5jCmluZGV4IDY1Y2FiNzAuLjZiYjg2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbTJtLWRlaW50ZXJsYWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tMm0tZGVpbnRlcmxhY2UuYwpAQCAtOTE4LDcgKzkxOCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JY3R4LT54dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcikgKworCWN0eC0+eHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX2ludGVybGVhdmVkX3RlbXBsYXRlKSArCiAJCQkJc2l6ZW9mKHN0cnVjdCBkYXRhX2NodW5rKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjdHgtPnh0KSB7CiAJCWtmcmVlKGN0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21lbTJtZW1fdGVzdGRldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tZW0ybWVtX3Rlc3RkZXYuYwppbmRleCA4ZGY1OTc1Li4wOGUyNDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21lbTJtZW1fdGVzdGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbWVtMm1lbV90ZXN0ZGV2LmMKQEAgLTE3Nyw4ICsxNzcsNiBAQAogCiAJZW51bSB2NGwyX2NvbG9yc3BhY2UJY29sb3JzcGFjZTsKIAotCXN0cnVjdCB2NGwyX20ybV9jdHgJKm0ybV9jdHg7Ci0KIAkvKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHF1ZXVlIGRhdGEgKi8KIAlzdHJ1Y3QgbTJtdGVzdF9xX2RhdGEgICBxX2RhdGFbMl07CiB9OwpAQCAtMzQyLDggKzM0MCw4IEBACiB7CiAJc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSBwcml2OwogCi0JaWYgKHY0bDJfbTJtX251bV9zcmNfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpIDwgY3R4LT50cmFuc2xlbgotCSAgICB8fCB2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA8IGN0eC0+dHJhbnNsZW4pIHsKKwlpZiAodjRsMl9tMm1fbnVtX3NyY19idWZzX3JlYWR5KGN0eC0+ZmgubTJtX2N0eCkgPCBjdHgtPnRyYW5zbGVuCisJICAgIHx8IHY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPmZoLm0ybV9jdHgpIDwgY3R4LT50cmFuc2xlbikgewogCQlkcHJpbnRrKGN0eC0+ZGV2LCAiTm90IGVub3VnaCBidWZmZXJzIGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTM1OSwyMSArMzU3LDYgQEAKIAljdHgtPmFib3J0aW5nID0gMTsKIH0KIAotc3RhdGljIHZvaWQgbTJtdGVzdF9sb2NrKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBtMm10ZXN0X2RldiAqZGV2ID0gY3R4LT5kZXY7Ci0JbXV0ZXhfbG9jaygmZGV2LT5kZXZfbXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBtMm10ZXN0X3VubG9jayh2b2lkICpwcml2KQotewotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgbTJtdGVzdF9kZXYgKmRldiA9IGN0eC0+ZGV2OwotCW11dGV4X3VubG9jaygmZGV2LT5kZXZfbXV0ZXgpOwotfQotCi0KIC8qIGRldmljZV9ydW4oKSAtIHByZXBhcmVzIGFuZCBzdGFydHMgdGhlIGRldmljZQogICoKICAqIFRoaXMgc2ltdWxhdGVzIGFsbCB0aGUgaW1tZWRpYXRlIHByZXBhcmF0aW9ucyByZXF1aXJlZCBiZWZvcmUgc3RhcnRpbmcKQEAgLTM4Niw4ICszNjksOCBAQAogCXN0cnVjdCBtMm10ZXN0X2RldiAqZGV2ID0gY3R4LT5kZXY7CiAJc3RydWN0IHZiMl9idWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwogCi0Jc3JjX2J1ZiA9IHY0bDJfbTJtX25leHRfc3JjX2J1ZihjdHgtPm0ybV9jdHgpOwotCWRzdF9idWYgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5tMm1fY3R4KTsKKwlzcmNfYnVmID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+ZmgubTJtX2N0eCk7CisJZHN0X2J1ZiA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihjdHgtPmZoLm0ybV9jdHgpOwogCiAJZGV2aWNlX3Byb2Nlc3MoY3R4LCBzcmNfYnVmLCBkc3RfYnVmKTsKIApAQCAtNDA5LDggKzM5Miw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcmNfdmIgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdXJyX2N0eC0+bTJtX2N0eCk7Ci0JZHN0X3ZiID0gdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUoY3Vycl9jdHgtPm0ybV9jdHgpOworCXNyY192YiA9IHY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN1cnJfY3R4LT5maC5tMm1fY3R4KTsKKwlkc3RfdmIgPSB2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdXJyX2N0eC0+ZmgubTJtX2N0eCk7CiAKIAljdXJyX2N0eC0+bnVtX3Byb2Nlc3NlZCsrOwogCkBAIC00MjMsNyArNDA2LDcgQEAKIAkgICAgfHwgY3Vycl9jdHgtPmFib3J0aW5nKSB7CiAJCWRwcmludGsoY3Vycl9jdHgtPmRldiwgIkZpbmlzaGluZyB0cmFuc2FjdGlvblxuIik7CiAJCWN1cnJfY3R4LT5udW1fcHJvY2Vzc2VkID0gMDsKLQkJdjRsMl9tMm1fam9iX2ZpbmlzaChtMm10ZXN0X2Rldi0+bTJtX2RldiwgY3Vycl9jdHgtPm0ybV9jdHgpOworCQl2NGwyX20ybV9qb2JfZmluaXNoKG0ybXRlc3RfZGV2LT5tMm1fZGV2LCBjdXJyX2N0eC0+ZmgubTJtX2N0eCk7CiAJfSBlbHNlIHsKIAkJZGV2aWNlX3J1bihjdXJyX2N0eCk7CiAJfQpAQCAtNDkxLDcgKzQ3NCw3IEBACiAJc3RydWN0IHZiMl9xdWV1ZSAqdnE7CiAJc3RydWN0IG0ybXRlc3RfcV9kYXRhICpxX2RhdGE7CiAKLQl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOworCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+ZmgubTJtX2N0eCwgZi0+dHlwZSk7CiAJaWYgKCF2cSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTU5NCw3ICs1NzcsNyBAQAogCXN0cnVjdCBtMm10ZXN0X3FfZGF0YSAqcV9kYXRhOwogCXN0cnVjdCB2YjJfcXVldWUgKnZxOwogCi0JdnEgPSB2NGwyX20ybV9nZXRfdnEoY3R4LT5tMm1fY3R4LCBmLT50eXBlKTsKKwl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPmZoLm0ybV9jdHgsIGYtPnR5cGUpOwogCWlmICghdnEpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC02NDgsNTIgKzYzMSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB2aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCi17Ci0Jc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSBmaWxlMmN0eChmaWxlKTsKLQotCXJldHVybiB2NGwyX20ybV9yZXFidWZzKGZpbGUsIGN0eC0+bTJtX2N0eCwgcmVxYnVmcyk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSBmaWxlMmN0eChmaWxlKTsKLQotCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gZmlsZTJjdHgoZmlsZSk7Ci0KLQlyZXR1cm4gdjRsMl9tMm1fcWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IGZpbGUyY3R4KGZpbGUpOwotCi0JcmV0dXJuIHY0bDJfbTJtX2RxYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IGZpbGUyY3R4KGZpbGUpOwotCi0JcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9uKGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IGZpbGUyY3R4KGZpbGUpOwotCi0JcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9mZihmaWxlLCBjdHgtPm0ybV9jdHgsIHR5cGUpOwotfQotCiBzdGF0aWMgaW50IG0ybXRlc3Rfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7CiAJc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPQpAQCAtNzQ4LDE0ICs2ODUsMTQgQEAKIAkudmlkaW9jX3RyeV9mbXRfdmlkX291dAk9IHZpZGlvY190cnlfZm10X3ZpZF9vdXQsCiAJLnZpZGlvY19zX2ZtdF92aWRfb3V0CT0gdmlkaW9jX3NfZm10X3ZpZF9vdXQsCiAKLQkudmlkaW9jX3JlcWJ1ZnMJCT0gdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1Zgk9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3JlcWJ1ZnMJCT0gdjRsMl9tMm1faW9jdGxfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCT0gdjRsMl9tMm1faW9jdGxfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQk9IHY0bDJfbTJtX2lvY3RsX3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJPSB2NGwyX20ybV9pb2N0bF9kcWJ1ZiwKIAotCS52aWRpb2NfcWJ1ZgkJPSB2aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmCQk9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCT0gdjRsMl9tMm1faW9jdGxfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYJPSB2NGwyX20ybV9pb2N0bF9zdHJlYW1vZmYsCiAKLQkudmlkaW9jX3N0cmVhbW9uCT0gdmlkaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmCT0gdmlkaW9jX3N0cmVhbW9mZiwKIAkudmlkaW9jX3N1YnNjcmliZV9ldmVudCA9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZlbnQsCiAJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwpAQCAtODE4LDI3ICs3NTUsMTUgQEAKIHN0YXRpYyB2b2lkIG0ybXRlc3RfYnVmX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7Ci0JdjRsMl9tMm1fYnVmX3F1ZXVlKGN0eC0+bTJtX2N0eCwgdmIpOwotfQotCi1zdGF0aWMgdm9pZCBtMm10ZXN0X3dhaXRfcHJlcGFyZShzdHJ1Y3QgdmIyX3F1ZXVlICpxKQotewotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKLQltMm10ZXN0X3VubG9jayhjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBtMm10ZXN0X3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0Jc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwotCW0ybXRlc3RfbG9jayhjdHgpOworCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPmZoLm0ybV9jdHgsIHZiKTsKIH0KIAogc3RhdGljIHN0cnVjdCB2YjJfb3BzIG0ybXRlc3RfcW9wcyA9IHsKIAkucXVldWVfc2V0dXAJID0gbTJtdGVzdF9xdWV1ZV9zZXR1cCwKIAkuYnVmX3ByZXBhcmUJID0gbTJtdGVzdF9idWZfcHJlcGFyZSwKIAkuYnVmX3F1ZXVlCSA9IG0ybXRlc3RfYnVmX3F1ZXVlLAotCS53YWl0X3ByZXBhcmUJID0gbTJtdGVzdF93YWl0X3ByZXBhcmUsCi0JLndhaXRfZmluaXNoCSA9IG0ybXRlc3Rfd2FpdF9maW5pc2gsCisJLndhaXRfcHJlcGFyZQkgPSB2YjJfb3BzX3dhaXRfcHJlcGFyZSwKKwkud2FpdF9maW5pc2gJID0gdmIyX29wc193YWl0X2ZpbmlzaCwKIH07CiAKIHN0YXRpYyBpbnQgcXVldWVfaW5pdCh2b2lkICpwcml2LCBzdHJ1Y3QgdmIyX3F1ZXVlICpzcmNfdnEsIHN0cnVjdCB2YjJfcXVldWUgKmRzdF92cSkKQEAgLTg1Myw2ICs3NzgsNyBAQAogCXNyY192cS0+b3BzID0gJm0ybXRlc3RfcW9wczsKIAlzcmNfdnEtPm1lbV9vcHMgPSAmdmIyX3ZtYWxsb2NfbWVtb3BzOwogCXNyY192cS0+dGltZXN0YW1wX3R5cGUgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9DT1BZOworCXNyY192cS0+bG9jayA9ICZjdHgtPmRldi0+ZGV2X211dGV4OwogCiAJcmV0ID0gdmIyX3F1ZXVlX2luaXQoc3JjX3ZxKTsKIAlpZiAocmV0KQpAQCAtODY1LDYgKzc5MSw3IEBACiAJZHN0X3ZxLT5vcHMgPSAmbTJtdGVzdF9xb3BzOwogCWRzdF92cS0+bWVtX29wcyA9ICZ2YjJfdm1hbGxvY19tZW1vcHM7CiAJZHN0X3ZxLT50aW1lc3RhbXBfdHlwZSA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7CisJZHN0X3ZxLT5sb2NrID0gJmN0eC0+ZGV2LT5kZXZfbXV0ZXg7CiAKIAlyZXR1cm4gdmIyX3F1ZXVlX2luaXQoZHN0X3ZxKTsKIH0KQEAgLTkzNiwxMCArODYzLDEwIEBACiAJY3R4LT5xX2RhdGFbVjRMMl9NMk1fRFNUXSA9IGN0eC0+cV9kYXRhW1Y0TDJfTTJNX1NSQ107CiAJY3R4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1JFQzcwOTsKIAotCWN0eC0+bTJtX2N0eCA9IHY0bDJfbTJtX2N0eF9pbml0KGRldi0+bTJtX2RldiwgY3R4LCAmcXVldWVfaW5pdCk7CisJY3R4LT5maC5tMm1fY3R4ID0gdjRsMl9tMm1fY3R4X2luaXQoZGV2LT5tMm1fZGV2LCBjdHgsICZxdWV1ZV9pbml0KTsKIAotCWlmIChJU19FUlIoY3R4LT5tMm1fY3R4KSkgewotCQlyYyA9IFBUUl9FUlIoY3R4LT5tMm1fY3R4KTsKKwlpZiAoSVNfRVJSKGN0eC0+ZmgubTJtX2N0eCkpIHsKKwkJcmMgPSBQVFJfRVJSKGN0eC0+ZmgubTJtX2N0eCk7CiAKIAkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZShoZGwpOwogCQlrZnJlZShjdHgpOwpAQCAtOTQ5LDcgKzg3Niw4IEBACiAJdjRsMl9maF9hZGQoJmN0eC0+ZmgpOwogCWF0b21pY19pbmMoJmRldi0+bnVtX2luc3QpOwogCi0JZHByaW50ayhkZXYsICJDcmVhdGVkIGluc3RhbmNlICVwLCBtMm1fY3R4OiAlcFxuIiwgY3R4LCBjdHgtPm0ybV9jdHgpOworCWRwcmludGsoZGV2LCAiQ3JlYXRlZCBpbnN0YW5jZTogJXAsIG0ybV9jdHg6ICVwXG4iLAorCQljdHgsIGN0eC0+ZmgubTJtX2N0eCk7CiAKIG9wZW5fdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5kZXZfbXV0ZXgpOwpAQCAtOTY3LDcgKzg5NSw3IEBACiAJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKIAl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjdHgtPmhkbCk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZfbXV0ZXgpOwotCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7CisJdjRsMl9tMm1fY3R4X3JlbGVhc2UoY3R4LT5maC5tMm1fY3R4KTsKIAltdXRleF91bmxvY2soJmRldi0+ZGV2X211dGV4KTsKIAlrZnJlZShjdHgpOwogCkBAIC05NzYsMzQgKzkwNCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG0ybXRlc3RfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gZmlsZTJjdHgoZmlsZSk7Ci0KLQlyZXR1cm4gdjRsMl9tMm1fcG9sbChmaWxlLCBjdHgtPm0ybV9jdHgsIHdhaXQpOwotfQotCi1zdGF0aWMgaW50IG0ybXRlc3RfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IG0ybXRlc3RfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gZmlsZTJjdHgoZmlsZSk7Ci0JaW50IHJlczsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+ZGV2X211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXMgPSB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKLQltdXRleF91bmxvY2soJmRldi0+ZGV2X211dGV4KTsKLQlyZXR1cm4gcmVzOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIG0ybXRlc3RfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gbTJtdGVzdF9vcGVuLAogCS5yZWxlYXNlCT0gbTJtdGVzdF9yZWxlYXNlLAotCS5wb2xsCQk9IG0ybXRlc3RfcG9sbCwKKwkucG9sbAkJPSB2NGwyX20ybV9mb3BfcG9sbCwKIAkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCi0JLm1tYXAJCT0gbTJtdGVzdF9tbWFwLAorCS5tbWFwCQk9IHY0bDJfbTJtX2ZvcF9tbWFwLAogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgbTJtdGVzdF92aWRlb2RldiA9IHsKQEAgLTEwMTksOCArOTI2LDYgQEAKIAkuZGV2aWNlX3J1bgk9IGRldmljZV9ydW4sCiAJLmpvYl9yZWFkeQk9IGpvYl9yZWFkeSwKIAkuam9iX2Fib3J0CT0gam9iX2Fib3J0LAotCS5sb2NrCQk9IG0ybXRlc3RfbG9jaywKLQkudW5sb2NrCQk9IG0ybXRlc3RfdW5sb2NrLAogfTsKIAogc3RhdGljIGludCBtMm10ZXN0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMTMzLDQgKzEwMzgsMyBAQAogCiBtb2R1bGVfaW5pdChtMm10ZXN0X2luaXQpOwogbW9kdWxlX2V4aXQobTJtdGVzdF9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwLmMKaW5kZXggZmRiZGVhZS4uNTgwNzE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcC5jCkBAIC04NzMsMTUgKzg3MywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCS8qIElmIHRoZSBwcmV2aWV3IGVuZ2luZSBjcmFzaGVkIGl0IG1pZ2h0IG5vdCByZXNwb25kIHRvIHJlYWQvd3JpdGUKLQkgKiBvcGVyYXRpb25zIG9uIHRoZSBMNCBidXMuIFRoaXMgd291bGQgcmVzdWx0IGluIGEgYnVzIGZhdWx0IGFuZCBhCi0JICoga2VybmVsIG9vcHMuIFJlZnVzZSB0byBzdGFydCBzdHJlYW1pbmcgaW4gdGhhdCBjYXNlLiBUaGlzIGNoZWNrIG11c3QKLQkgKiBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBsb29wIGJlbG93IHRvIGF2b2lkIHN0YXJ0aW5nIGVudGl0aWVzIGlmIHRoZQotCSAqIHBpcGVsaW5lIHdvbid0IHN0YXJ0IGFueXdheSAodGhvc2UgZW50aXRpZXMgd291bGQgdGhlbiBsaWtlbHkgZmFpbCB0bwotCSAqIHN0b3AsIG1ha2luZyB0aGUgcHJvYmxlbSB3b3JzZSkuCisJLyogUmVmdXNlIHRvIHN0YXJ0IHN0cmVhbWluZyBpZiBhbiBlbnRpdHkgaW5jbHVkZWQgaW4gdGhlIHBpcGVsaW5lIGhhcworCSAqIGNyYXNoZWQuIFRoaXMgY2hlY2sgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBsb29wIGJlbG93IHRvIGF2b2lkCisJICogc3RhcnRpbmcgZW50aXRpZXMgaWYgdGhlIHBpcGVsaW5lIHdvbid0IHN0YXJ0IGFueXdheSAodGhvc2UgZW50aXRpZXMKKwkgKiB3b3VsZCB0aGVuIGxpa2VseSBmYWlsIHRvIHN0b3AsIG1ha2luZyB0aGUgcHJvYmxlbSB3b3JzZSkuCiAJICovCi0JaWYgKChwaXBlLT5lbnRpdGllcyAmIGlzcC0+Y3Jhc2hlZCkgJgotCSAgICAoMVUgPDwgaXNwLT5pc3BfcHJldi5zdWJkZXYuZW50aXR5LmlkKSkKKwlpZiAocGlwZS0+ZW50aXRpZXMgJiBpc3AtPmNyYXNoZWQpCiAJCXJldHVybiAtRUlPOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKQEAgLTEwMTQsMTMgKzEwMTEsMjMgQEAKIAkJZWxzZQogCQkJcmV0ID0gMDsKIAorCQkvKiBIYW5kbGUgc3RvcCBmYWlsdXJlcy4gQW4gZW50aXR5IHRoYXQgZmFpbHMgdG8gc3RvcCBjYW4KKwkJICogdXN1YWxseSBqdXN0IGJlIHJlc3RhcnRlZC4gRmxhZyB0aGUgc3RvcCBmYWlsdXJlIG5vbmV0aGVsZXNzCisJCSAqIHRvIHRyaWdnZXIgYW4gSVNQIHJlc2V0IHRoZSBuZXh0IHRpbWUgdGhlIGRldmljZSBpcyByZWxlYXNlZCwKKwkJICoganVzdCBpbiBjYXNlLgorCQkgKgorCQkgKiBUaGUgcHJldmlldyBlbmdpbmUgaXMgYSBzcGVjaWFsIGNhc2UuIEEgZmFpbHVyZSB0byBzdG9wIGNhbgorCQkgKiBtZWFuIGEgaGFyZHdhcmUgY3Jhc2guIFdoZW4gdGhhdCBoYXBwZW5zIHRoZSBwcmV2aWV3IGVuZ2luZQorCQkgKiB3b24ndCByZXNwb25kIHRvIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBvbiB0aGUgTDQgYnVzIGFueW1vcmUsCisJCSAqIHJlc3VsdGluZyBpbiBhIGJ1cyBmYXVsdCBhbmQgYSBrZXJuZWwgb29wcyBuZXh0IHRpbWUgaXQgZ2V0cworCQkgKiBhY2Nlc3NlZC4gTWFyayBpdCBhcyBjcmFzaGVkIHRvIHByZXZlbnQgcGlwZWxpbmVzIGluY2x1ZGluZworCQkgKiBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQuCisJCSAqLwogCQlpZiAocmV0KSB7CiAJCQlkZXZfaW5mbyhpc3AtPmRldiwgIlVuYWJsZSB0byBzdG9wICVzXG4iLCBzdWJkZXYtPm5hbWUpOwotCQkJLyogSWYgdGhlIGVudGl0eSBmYWlsZWQgdG8gc3RvcHBlZCwgYXNzdW1lIGl0IGhhcwotCQkJICogY3Jhc2hlZC4gTWFyayBpdCBhcyBzdWNoLCB0aGUgSVNQIHdpbGwgYmUgcmVzZXQgd2hlbgotCQkJICogYXBwbGljYXRpb25zIHdpbGwgcmVsZWFzZSBpdC4KLQkJCSAqLwotCQkJaXNwLT5jcmFzaGVkIHw9IDFVIDw8IHN1YmRldi0+ZW50aXR5LmlkOworCQkJaXNwLT5zdG9wX2ZhaWx1cmUgPSB0cnVlOworCQkJaWYgKHN1YmRldiA9PSAmaXNwLT5pc3BfcHJldi5zdWJkZXYpCisJCQkJaXNwLT5jcmFzaGVkIHw9IDFVIDw8IHN1YmRldi0+ZW50aXR5LmlkOwogCQkJZmFpbHVyZSA9IC1FVElNRURPVVQ7CiAJCX0KIAl9CkBAIC0xMDU3LDYgKzEwNjQsMjMgQEAKIH0KIAogLyoKKyAqIG9tYXAzaXNwX3BpcGVsaW5lX2NhbmNlbF9zdHJlYW0gLSBDYW5jZWwgc3RyZWFtIG9uIGEgcGlwZWxpbmUKKyAqIEBwaXBlOiBJU1AgcGlwZWxpbmUKKyAqCisgKiBDYW5jZWxsaW5nIGEgc3RyZWFtIG1hcmsgYWxsIGJ1ZmZlcnMgb24gYWxsIHZpZGVvIG5vZGVzIGluIHRoZSBwaXBlbGluZSBhcworICogZXJyb25lb3VzIGFuZCBtYWtlcyBzdXJlIG5vIG5ldyBidWZmZXIgY2FuIGJlIHF1ZXVlZC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIHdoZW4gYSBmYXRhbCBlcnJvciB0aGF0IHByZXZlbnRzIGFueSBmdXJ0aGVyIG9wZXJhdGlvbiBvbiB0aGUgcGlwZWxpbmUKKyAqIG9jY3Vycy4KKyAqLwordm9pZCBvbWFwM2lzcF9waXBlbGluZV9jYW5jZWxfc3RyZWFtKHN0cnVjdCBpc3BfcGlwZWxpbmUgKnBpcGUpCit7CisJaWYgKHBpcGUtPmlucHV0KQorCQlvbWFwM2lzcF92aWRlb19jYW5jZWxfc3RyZWFtKHBpcGUtPmlucHV0KTsKKwlpZiAocGlwZS0+b3V0cHV0KQorCQlvbWFwM2lzcF92aWRlb19jYW5jZWxfc3RyZWFtKHBpcGUtPm91dHB1dCk7Cit9CisKKy8qCiAgKiBpc3BfcGlwZWxpbmVfcmVzdW1lIC0gUmVzdW1lIHN0cmVhbWluZyBvbiBhIHBpcGVsaW5lCiAgKiBAcGlwZTogSVNQIHBpcGVsaW5lCiAgKgpAQCAtMTIwOCw2ICsxMjMyLDcgQEAKIAkJdWRlbGF5KDEpOwogCX0KIAorCWlzcC0+c3RvcF9mYWlsdXJlID0gZmFsc2U7CiAJaXNwLT5jcmFzaGVkID0gMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MTksNyArMTY0NCw3IEBACiAJCS8qIFJlc2V0IHRoZSBJU1AgaWYgYW4gZW50aXR5IGhhcyBmYWlsZWQgdG8gc3RvcC4gVGhpcyBpcyB0aGUKIAkJICogb25seSB3YXkgdG8gcmVjb3ZlciBmcm9tIHN1Y2ggY29uZGl0aW9ucy4KIAkJICovCi0JCWlmIChpc3AtPmNyYXNoZWQpCisJCWlmIChpc3AtPmNyYXNoZWQgfHwgaXNwLT5zdG9wX2ZhaWx1cmUpCiAJCQlpc3BfcmVzZXQoaXNwKTsKIAkJaXNwX2Rpc2FibGVfY2xvY2tzKGlzcCk7CiAJfQpAQCAtMjEzMCwyOCArMjE1NSwxMyBAQAogCS8qIHJlcXVlc3QgdGhlIG1lbSByZWdpb24gZm9yIHRoZSBjYW1lcmEgcmVnaXN0ZXJzICovCiAKIAltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIHJlcyk7Ci0JaWYgKCFtZW0pIHsKLQkJZGV2X2Vycihpc3AtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGlzcC0+ZGV2LCBtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCi0JCQkJICAgICBwZGV2LT5uYW1lKSkgewotCQlkZXZfZXJyKGlzcC0+ZGV2LAotCQkJImNhbm5vdCByZXNlcnZlIGNhbWVyYSByZWdpc3RlciBJL08gcmVnaW9uXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlzcC0+bW1pb19iYXNlX3BoeXNbcmVzXSA9IG1lbS0+c3RhcnQ7Ci0JaXNwLT5tbWlvX3NpemVbcmVzXSA9IHJlc291cmNlX3NpemUobWVtKTsKIAogCS8qIG1hcCB0aGUgcmVnaW9uICovCi0JaXNwLT5tbWlvX2Jhc2VbcmVzXSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGlzcC0+ZGV2LAotCQkJCQkJICAgaXNwLT5tbWlvX2Jhc2VfcGh5c1tyZXNdLAotCQkJCQkJICAgaXNwLT5tbWlvX3NpemVbcmVzXSk7Ci0JaWYgKCFpc3AtPm1taW9fYmFzZVtyZXNdKSB7Ci0JCWRldl9lcnIoaXNwLT5kZXYsICJjYW5ub3QgbWFwIGNhbWVyYSByZWdpc3RlciBJL08gcmVnaW9uXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlzcC0+bW1pb19iYXNlW3Jlc10gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoaXNwLT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUihpc3AtPm1taW9fYmFzZVtyZXNdKSkKKwkJcmV0dXJuIFBUUl9FUlIoaXNwLT5tbWlvX2Jhc2VbcmVzXSk7CisKKwlpc3AtPm1taW9fYmFzZV9waHlzW3Jlc10gPSBtZW0tPnN0YXJ0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuaAppbmRleCBkMWU4NTdlLi4wODFmNWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwLmgKQEAgLTE1Miw5ICsxNTIsOSBAQAogICogICAgICAgICAgICAgcmVnaW9ucy4KICAqIEBtbWlvX2Jhc2VfcGh5czogQXJyYXkgd2l0aCBwaHlzaWNhbCBMNCBidXMgYWRkcmVzc2VzIGZvciBJU1AgcmVnaXN0ZXIKICAqICAgICAgICAgICAgICAgICAgcmVnaW9ucy4KLSAqIEBtbWlvX3NpemU6IEFycmF5IHdpdGggSVNQIHJlZ2lzdGVyIHJlZ2lvbnMgc2l6ZSBpbiBieXRlcy4KICAqIEBzdGF0X2xvY2s6IFNwaW5sb2NrIGZvciBoYW5kbGluZyBzdGF0aXN0aWNzCiAgKiBAaXNwX211dGV4OiBNdXRleCBmb3Igc2VyaWFsaXppbmcgcmVxdWVzdHMgdG8gSVNQLgorICogQHN0b3BfZmFpbHVyZTogSW5kaWNhdGVzIHRoYXQgYW4gZW50aXR5IGZhaWxlZCB0byBzdG9wLgogICogQGNyYXNoZWQ6IEJpdG1hc2sgb2YgY3Jhc2hlZCBlbnRpdGllcyAoaW5kZXhlZCBieSBlbnRpdHkgSUQpCiAgKiBAaGFzX2NvbnRleHQ6IENvbnRleHQgaGFzIGJlZW4gc2F2ZWQgYXQgbGVhc3Qgb25jZSBhbmQgY2FuIGJlIHJlc3RvcmVkLgogICogQHJlZl9jb3VudDogUmVmZXJlbmNlIGNvdW50IGZvciBoYW5kbGluZyBtdWx0aXBsZSBJU1AgcmVxdWVzdHMuCkBAIC0xODgsMTEgKzE4OCwxMSBAQAogCiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2VbT01BUDNfSVNQX0lPTUVNX0xBU1RdOwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlX3BoeXNbT01BUDNfSVNQX0lPTUVNX0xBU1RdOwotCXJlc291cmNlX3NpemVfdCBtbWlvX3NpemVbT01BUDNfSVNQX0lPTUVNX0xBU1RdOwogCiAJLyogSVNQIE9iaiAqLwogCXNwaW5sb2NrX3Qgc3RhdF9sb2NrOwkvKiBjb21tb24gbG9jayBmb3Igc3RhdGlzdGljIGRyaXZlcnMgKi8KIAlzdHJ1Y3QgbXV0ZXggaXNwX211dGV4OwkvKiBGb3IgaGFuZGxpbmcgcmVmX2NvdW50IGZpZWxkICovCisJYm9vbCBzdG9wX2ZhaWx1cmU7CiAJdTMyIGNyYXNoZWQ7CiAJaW50IGhhc19jb250ZXh0OwogCWludCByZWZfY291bnQ7CkBAIC0yMzgsNiArMjM4LDcgQEAKIAogaW50IG9tYXAzaXNwX3BpcGVsaW5lX3NldF9zdHJlYW0oc3RydWN0IGlzcF9waXBlbGluZSAqcGlwZSwKIAkJCQkgZW51bSBpc3BfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHN0YXRlKTsKK3ZvaWQgb21hcDNpc3BfcGlwZWxpbmVfY2FuY2VsX3N0cmVhbShzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlKTsKIHZvaWQgb21hcDNpc3BfY29uZmlndXJlX2JyaWRnZShzdHJ1Y3QgaXNwX2RldmljZSAqaXNwLAogCQkJICAgICAgIGVudW0gY2NkY19pbnB1dF9lbnRpdHkgaW5wdXQsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGlzcF9wYXJhbGxlbF9wbGF0Zm9ybV9kYXRhICpwZGF0YSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NkYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKaW5kZXggOTA3YTIwNS4uNWRiMmM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKQEAgLTE1MTYsNiArMTUxNiw4IEBACiAKIAlpZiAoY2NkY19zYmxfd2FpdF9pZGxlKGNjZGMsIDEwMDApKSB7CiAJCWRldl9pbmZvKGlzcC0+ZGV2LCAiQ0NEQyB3b24ndCBiZWNvbWUgaWRsZSFcbiIpOworCQlpc3AtPmNyYXNoZWQgfD0gMVUgPDwgY2NkYy0+c3ViZGV2LmVudGl0eS5pZDsKKwkJb21hcDNpc3BfcGlwZWxpbmVfY2FuY2VsX3N0cmVhbShwaXBlKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMjQ4NCw3ICsyNDg2LDggQEAKIAl2NGwyX3NldF9zdWJkZXZkYXRhKHNkLCBjY2RjKTsKIAlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwogCi0JcGFkc1tDQ0RDX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCXBhZHNbQ0NEQ19QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSworCQkJCSAgICB8IE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1Q7CiAJcGFkc1tDQ0RDX1BBRF9TT1VSQ0VfVlBdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKIAlwYWRzW0NDRENfUEFEX1NPVVJDRV9PRl0uZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNjcDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NwMi5jCmluZGV4IGU3MTY1MTQuLmU4NGZlMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NwMi5jCkBAIC0xMDc2LDcgKzEwNzYsOCBAQAogCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGNjcDIpOwogCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKIAotCXBhZHNbQ0NQMl9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlwYWRzW0NDUDJfUEFEX1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTksKKwkJCQkgICAgfCBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUOwogCXBhZHNbQ0NQMl9QQURfU09VUkNFXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CiAKIAltZS0+b3BzID0gJmNjcDJfbWVkaWFfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3Bjc2kyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNzaTIuYwppbmRleCA2ZGIyNDVkLi42MjA1NjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNzaTIuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNzaTIuYwpAQCAtMTI0NSw3ICsxMjQ1LDggQEAKIAlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CiAKIAlwYWRzW0NTSTJfUEFEX1NPVVJDRV0uZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOwotCXBhZHNbQ1NJMl9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlwYWRzW0NTSTJfUEFEX1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTksKKwkJCQkgICAgfCBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUOwogCiAJbWUtPm9wcyA9ICZjc2kyX21lZGlhX29wczsKIAlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdChtZSwgQ1NJMl9QQURTX05VTSwgcGFkcywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHByZXZpZXcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCmluZGV4IGNkODgzMWEuLjFjNzc2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCkBAIC0yMjgzLDcgKzIyODMsOCBAQAogCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZwcmV2LT5jdHJscyk7CiAJc2QtPmN0cmxfaGFuZGxlciA9ICZwcmV2LT5jdHJsczsKIAotCXBhZHNbUFJFVl9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlwYWRzW1BSRVZfUEFEX1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTksKKwkJCQkgICAgfCBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUOwogCXBhZHNbUFJFVl9QQURfU09VUkNFXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CiAKIAltZS0+b3BzID0gJnByZXZpZXdfbWVkaWFfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BxdWV1ZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BxdWV1ZS5jCmluZGV4IGUxNWYwMTMuLjVmMGY4ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcXVldWUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHF1ZXVlLmMKQEAgLTU1Myw4ICs1NTMsMTAgQEAKIAlzd2l0Y2ggKGJ1Zi0+c3RhdGUpIHsKIAljYXNlIElTUF9CVUZfU1RBVEVfRVJST1I6CiAJCXZidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRVJST1I7CisJCS8qIEZhbGx0aHJvdWdoICovCiAJY2FzZSBJU1BfQlVGX1NUQVRFX0RPTkU6CiAJCXZidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYnJlYWs7CiAJY2FzZSBJU1BfQlVGX1NUQVRFX1FVRVVFRDoKIAljYXNlIElTUF9CVUZfU1RBVEVfQUNUSVZFOgogCQl2YnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcmVzaXplci5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3ByZXNpemVyLmMKaW5kZXggZDExZmIyNi4uMGQzNmI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3ByZXNpemVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3ByZXNpemVyLmMKQEAgLTE1MzIsNiArMTUzMiwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJlc2l6ZXJfbGlua192YWxpZGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBzdHJ1Y3QgbWVkaWFfbGluayAqbGluaywKKwkJCQkgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqc291cmNlX2ZtdCwKKwkJCQkgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqc2lua19mbXQpCit7CisJc3RydWN0IGlzcF9yZXNfZGV2aWNlICpyZXMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlID0gdG9faXNwX3BpcGVsaW5lKCZzZC0+ZW50aXR5KTsKKworCW9tYXAzaXNwX3Jlc2l6ZXJfbWF4X3JhdGUocmVzLCAmcGlwZS0+bWF4X3JhdGUpOworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2xpbmtfdmFsaWRhdGVfZGVmYXVsdChzZCwgbGluaywKKwkJCQkJCSBzb3VyY2VfZm10LCBzaW5rX2ZtdCk7Cit9CisKIC8qCiAgKiByZXNpemVyX2luaXRfZm9ybWF0cyAtIEluaXRpYWxpemUgZm9ybWF0cyBvbiBhbGwgcGFkcwogICogQHNkOiBJU1AgcmVzaXplciBWNEwyIHN1YmRldmljZQpAQCAtMTU3MCw2ICsxNTg0LDcgQEAKIAkuc2V0X2ZtdCA9IHJlc2l6ZXJfc2V0X2Zvcm1hdCwKIAkuZ2V0X3NlbGVjdGlvbiA9IHJlc2l6ZXJfZ2V0X3NlbGVjdGlvbiwKIAkuc2V0X3NlbGVjdGlvbiA9IHJlc2l6ZXJfc2V0X3NlbGVjdGlvbiwKKwkubGlua192YWxpZGF0ZSA9IHJlc2l6ZXJfbGlua192YWxpZGF0ZSwKIH07CiAKIC8qIHN1YmRldiBvcGVyYXRpb25zICovCkBAIC0xNzAxLDcgKzE3MTYsOCBAQAogCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIHJlcyk7CiAJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwogCi0JcGFkc1tSRVNaX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCXBhZHNbUkVTWl9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSworCQkJCSAgICB8IE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1Q7CiAJcGFkc1tSRVNaX1BBRF9TT1VSQ0VdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKIAogCW1lLT5vcHMgPSAmcmVzaXplcl9tZWRpYV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwc3RhdC5jCmluZGV4IDYxZTE3ZjkuLmE3NTQwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwc3RhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwc3RhdC5jCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCXN1YmRldi0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwogCXY0bDJfc2V0X3N1YmRldmRhdGEoc3ViZGV2LCBzdGF0KTsKIAotCXN0YXQtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCXN0YXQtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LIHwgTUVESUFfUEFEX0ZMX01VU1RfQ09OTkVDVDsKIAltZS0+b3BzID0gTlVMTDsKIAogCXJldHVybiBtZWRpYV9lbnRpdHlfaW5pdChtZSwgMSwgJnN0YXQtPnBhZCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHZpZGVvLmMKaW5kZXggZjYzMDRiYi4uODU2ZmRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3B2aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uYwpAQCAtMjc4LDU1ICsyNzgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogVmFsaWRhdGUgYSBwaXBlbGluZSBieSBjaGVja2luZyBib3RoIGVuZHMgb2YgYWxsIGxpbmtzIGZvciBmb3JtYXQKLSAqIGRpc2NyZXBhbmNpZXMuCi0gKgotICogQ29tcHV0ZSB0aGUgbWluaW11bSB0aW1lIHBlciBmcmFtZSB2YWx1ZSBhcyB0aGUgbWF4aW11bSBvZiB0aW1lIHBlciBmcmFtZQotICogbGltaXRzIHJlcG9ydGVkIGJ5IGV2ZXJ5IGJsb2NrIGluIHRoZSBwaXBlbGluZS4KLSAqCi0gKiBSZXR1cm4gMCBpZiBhbGwgZm9ybWF0cyBtYXRjaCwgb3IgLUVQSVBFIGlmIGF0IGxlYXN0IG9uZSBsaW5rIGlzIGZvdW5kIHdpdGgKLSAqIGRpZmZlcmVudCBmb3JtYXRzIG9uIGl0cyB0d28gZW5kcyBvciBpZiB0aGUgcGlwZWxpbmUgZG9lc24ndCBzdGFydCB3aXRoIGEKLSAqIHZpZGVvIHNvdXJjZSAoZWl0aGVyIGEgc3ViZGV2IHdpdGggbm8gaW5wdXQgcGFkLCBvciBhIG5vbi1zdWJkZXYgZW50aXR5KS4KLSAqLwotc3RhdGljIGludCBpc3BfdmlkZW9fdmFsaWRhdGVfcGlwZWxpbmUoc3RydWN0IGlzcF9waXBlbGluZSAqcGlwZSkKLXsKLQlzdHJ1Y3QgaXNwX2RldmljZSAqaXNwID0gcGlwZS0+b3V0cHV0LT5pc3A7Ci0Jc3RydWN0IG1lZGlhX3BhZCAqcGFkOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwotCi0Jc3ViZGV2ID0gaXNwX3ZpZGVvX3JlbW90ZV9zdWJkZXYocGlwZS0+b3V0cHV0LCBOVUxMKTsKLQlpZiAoc3ViZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRVBJUEU7Ci0KLQl3aGlsZSAoMSkgewotCQkvKiBSZXRyaWV2ZSB0aGUgc2luayBmb3JtYXQgKi8KLQkJcGFkID0gJnN1YmRldi0+ZW50aXR5LnBhZHNbMF07Ci0JCWlmICghKHBhZC0+ZmxhZ3MgJiBNRURJQV9QQURfRkxfU0lOSykpCi0JCQlicmVhazsKLQotCQkvKiBVcGRhdGUgdGhlIG1heGltdW0gZnJhbWUgcmF0ZSAqLwotCQlpZiAoc3ViZGV2ID09ICZpc3AtPmlzcF9yZXMuc3ViZGV2KQotCQkJb21hcDNpc3BfcmVzaXplcl9tYXhfcmF0ZSgmaXNwLT5pc3BfcmVzLAotCQkJCQkJICAmcGlwZS0+bWF4X3JhdGUpOwotCi0JCS8qIFJldHJpZXZlIHRoZSBzb3VyY2UgZm9ybWF0LiBSZXR1cm4gYW4gZXJyb3IgaWYgbm8gc291cmNlCi0JCSAqIGVudGl0eSBjYW4gYmUgZm91bmQsIGFuZCBzdG9wIGNoZWNraW5nIHRoZSBwaXBlbGluZSBpZiB0aGUKLQkJICogc291cmNlIGVudGl0eSBpc24ndCBhIHN1YmRldi4KLQkJICovCi0JCXBhZCA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKHBhZCk7Ci0JCWlmIChwYWQgPT0gTlVMTCkKLQkJCXJldHVybiAtRVBJUEU7Ci0KLQkJaWYgKG1lZGlhX2VudGl0eV90eXBlKHBhZC0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKLQkJCWJyZWFrOwotCi0JCXN1YmRldiA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihwYWQtPmVudGl0eSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQKIF9faXNwX3ZpZGVvX2dldF9mb3JtYXQoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8sIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm9ybWF0KQogewpAQCAtNDYwLDYgKzQxMSwxNSBAQAogCXN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvID0gdmZoLT52aWRlbzsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKKwkvKiBSZWZ1c2UgdG8gcHJlcGFyZSB0aGUgYnVmZmVyIGlzIHRoZSB2aWRlbyBub2RlIGhhcyByZWdpc3RlcmVkIGFuCisJICogZXJyb3IuIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgbG9jayBoZXJlIGFzIHRoZSBvcGVyYXRpb24gaXMKKwkgKiBpbmhlcmVudGx5IHJhY3kuIFRoZSBhdXRob3JpdGF0aXZlIGNoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZQorCSAqIHF1ZXVlIGhhbmRsZXIsIHdoaWNoIGNhbid0IHJldHVybiBhbiBlcnJvciwgdGhpcyBjaGVjayBpcyBqdXN0IGEgYmVzdAorCSAqIGVmZm9ydCB0byBub3RpZnkgdXNlcnNwYWNlIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorCSAqLworCWlmICh1bmxpa2VseSh2aWRlby0+ZXJyb3IpKQorCQlyZXR1cm4gLUVJTzsKKwogCWFkZHIgPSBpc3BtbXVfdm1hcCh2aWRlby0+aXNwLCBidWYtPnNnbGlzdCwgYnVmLT5zZ2xlbik7CiAJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkKIAkJcmV0dXJuIC1FSU87CkBAIC00OTYsNiArNDU2LDEyIEBACiAJdW5zaWduZWQgaW50IGVtcHR5OwogCXVuc2lnbmVkIGludCBzdGFydDsKIAorCWlmICh1bmxpa2VseSh2aWRlby0+ZXJyb3IpKSB7CisJCWJ1Zi0+c3RhdGUgPSBJU1BfQlVGX1NUQVRFX0VSUk9SOworCQl3YWtlX3VwKCZidWYtPndhaXQpOworCQlyZXR1cm47CisJfQorCiAJZW1wdHkgPSBsaXN0X2VtcHR5KCZ2aWRlby0+ZG1hcXVldWUpOwogCWxpc3RfYWRkX3RhaWwoJmJ1ZmZlci0+YnVmZmVyLmlycWxpc3QsICZ2aWRlby0+ZG1hcXVldWUpOwogCkBAIC02MTgsNiArNTg0LDM2IEBACiB9CiAKIC8qCisgKiBvbWFwM2lzcF92aWRlb19jYW5jZWxfc3RyZWFtIC0gQ2FuY2VsIHN0cmVhbSBvbiBhIHZpZGVvIG5vZGUKKyAqIEB2aWRlbzogSVNQIHZpZGVvIG9iamVjdAorICoKKyAqIENhbmNlbGxpbmcgYSBzdHJlYW0gbWFyayBhbGwgYnVmZmVycyBvbiB0aGUgdmlkZW8gbm9kZSBhcyBlcnJvbmVvdXMgYW5kIG1ha2VzCisgKiBzdXJlIG5vIG5ldyBidWZmZXIgY2FuIGJlIHF1ZXVlZC4KKyAqLwordm9pZCBvbWFwM2lzcF92aWRlb19jYW5jZWxfc3RyZWFtKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKQoreworCXN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlID0gdmlkZW8tPnF1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmdmlkZW8tPmRtYXF1ZXVlKSkgeworCQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOworCisJCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnZpZGVvLT5kbWFxdWV1ZSwKKwkJCQkgICAgICAgc3RydWN0IGlzcF92aWRlb19idWZmZXIsIGlycWxpc3QpOworCQlsaXN0X2RlbCgmYnVmLT5pcnFsaXN0KTsKKworCQlidWYtPnN0YXRlID0gSVNQX0JVRl9TVEFURV9FUlJPUjsKKwkJd2FrZV91cCgmYnVmLT53YWl0KTsKKwl9CisKKwl2aWRlby0+ZXJyb3IgPSB0cnVlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKK30KKworLyoKICAqIG9tYXAzaXNwX3ZpZGVvX3Jlc3VtZSAtIFBlcmZvcm0gcmVzdW1lIG9wZXJhdGlvbiBvbiB0aGUgYnVmZmVycwogICogQHZpZGVvOiBJU1AgdmlkZW8gb2JqZWN0CiAgKiBAY29udGludW91czogUGlwZWxpbmUgaXMgaW4gc2luZ2xlIHNob3QgbW9kZSBpZiAwIG9yIGNvbnRpbnVvdXMgbW9kZSBvdGhlcndpc2UKQEAgLTEwNTEsMTEgKzEwNDcsNiBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jaGVja19mb3JtYXQ7CiAKLQkvKiBWYWxpZGF0ZSB0aGUgcGlwZWxpbmUgYW5kIHVwZGF0ZSBpdHMgc3RhdGUuICovCi0JcmV0ID0gaXNwX3ZpZGVvX3ZhbGlkYXRlX3BpcGVsaW5lKHBpcGUpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9jaGVja19mb3JtYXQ7Ci0KIAlwaXBlLT5lcnJvciA9IGZhbHNlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKQEAgLTExNTksNiArMTE1MCw3IEBACiAJb21hcDNpc3BfdmlkZW9fcXVldWVfc3RyZWFtb2ZmKCZ2ZmgtPnF1ZXVlKTsKIAl2aWRlby0+cXVldWUgPSBOVUxMOwogCXZpZGVvLT5zdHJlYW1pbmcgPSAwOworCXZpZGVvLT5lcnJvciA9IGZhbHNlOwogCiAJaWYgKHZpZGVvLT5pc3AtPnBkYXRhLT5zZXRfY29uc3RyYWludHMpCiAJCXZpZGVvLT5pc3AtPnBkYXRhLT5zZXRfY29uc3RyYWludHModmlkZW8tPmlzcCwgZmFsc2UpOwpAQCAtMTMzMiwxMSArMTMyNCwxMyBAQAogCXN3aXRjaCAodmlkZW8tPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKIAkJZGlyZWN0aW9uID0gIm91dHB1dCI7Ci0JCXZpZGVvLT5wYWQuZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwkJdmlkZW8tPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LCisJCQkJICAgfCBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUOwogCQlicmVhazsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgogCQlkaXJlY3Rpb24gPSAiaW5wdXQiOwotCQl2aWRlby0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwkJdmlkZW8tPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0UKKwkJCQkgICB8IE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1Q7CiAJCXZpZGVvLT52aWRlby52ZmxfZGlyID0gVkZMX0RJUl9UWDsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uaAppbmRleCAxYWQ0NzBlLi40ZTE5NDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHZpZGVvLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3B2aWRlby5oCkBAIC0xNzgsNiArMTc4LDcgQEAKIAkvKiBQaXBlbGluZSBzdGF0ZSAqLwogCXN0cnVjdCBpc3BfcGlwZWxpbmUgcGlwZTsKIAlzdHJ1Y3QgbXV0ZXggc3RyZWFtX2xvY2s7CS8qIHBpcGVsaW5lIGFuZCBzdHJlYW0gc3RhdGVzICovCisJYm9vbCBlcnJvcjsKIAogCS8qIFZpZGVvIGJ1ZmZlcnMgcXVldWUgKi8KIAlzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZTsKQEAgLTIwNyw2ICsyMDgsNyBAQAogCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldik7CiB2b2lkIG9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8pOwogc3RydWN0IGlzcF9idWZmZXIgKm9tYXAzaXNwX3ZpZGVvX2J1ZmZlcl9uZXh0KHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKTsKK3ZvaWQgb21hcDNpc3BfdmlkZW9fY2FuY2VsX3N0cmVhbShzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbyk7CiB2b2lkIG9tYXAzaXNwX3ZpZGVvX3Jlc3VtZShzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbywgaW50IGNvbnRpbnVvdXMpOwogc3RydWN0IG1lZGlhX3BhZCAqb21hcDNpc3BfdmlkZW9fcmVtb3RlX3BhZChzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWcyZC9nMmQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWcyZC9nMmQuYwppbmRleCAwYjI5NDgzLi4wZmNmN2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1nMmQvZzJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtZzJkL2cyZC5jCkBAIC0xMzYsMTAgKzEzNiw5IEBACiBzdGF0aWMgdm9pZCBnMmRfYnVmX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKLQl2NGwyX20ybV9idWZfcXVldWUoY3R4LT5tMm1fY3R4LCB2Yik7CisJdjRsMl9tMm1fYnVmX3F1ZXVlKGN0eC0+ZmgubTJtX2N0eCwgdmIpOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgdmIyX29wcyBnMmRfcW9wcyA9IHsKIAkucXVldWVfc2V0dXAJPSBnMmRfcXVldWVfc2V0dXAsCiAJLmJ1Zl9wcmVwYXJlCT0gZzJkX2J1Zl9wcmVwYXJlLApAQCAtMTU5LDYgKzE1OCw3IEBACiAJc3JjX3ZxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKIAlzcmNfdnEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9tMm1fYnVmZmVyKTsKIAlzcmNfdnEtPnRpbWVzdGFtcF90eXBlID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfQ09QWTsKKwlzcmNfdnEtPmxvY2sgPSAmY3R4LT5kZXYtPm11dGV4OwogCiAJcmV0ID0gdmIyX3F1ZXVlX2luaXQoc3JjX3ZxKTsKIAlpZiAocmV0KQpAQCAtMTcxLDYgKzE3MSw3IEBACiAJZHN0X3ZxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKIAlkc3RfdnEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9tMm1fYnVmZmVyKTsKIAlkc3RfdnEtPnRpbWVzdGFtcF90eXBlID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfQ09QWTsKKwlkc3RfdnEtPmxvY2sgPSAmY3R4LT5kZXYtPm11dGV4OwogCiAJcmV0dXJuIHZiMl9xdWV1ZV9pbml0KGRzdF92cSk7CiB9CkBAIC0yNTMsOSArMjU0LDkgQEAKIAkJa2ZyZWUoY3R4KTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9Ci0JY3R4LT5tMm1fY3R4ID0gdjRsMl9tMm1fY3R4X2luaXQoZGV2LT5tMm1fZGV2LCBjdHgsICZxdWV1ZV9pbml0KTsKLQlpZiAoSVNfRVJSKGN0eC0+bTJtX2N0eCkpIHsKLQkJcmV0ID0gUFRSX0VSUihjdHgtPm0ybV9jdHgpOworCWN0eC0+ZmgubTJtX2N0eCA9IHY0bDJfbTJtX2N0eF9pbml0KGRldi0+bTJtX2RldiwgY3R4LCAmcXVldWVfaW5pdCk7CisJaWYgKElTX0VSUihjdHgtPmZoLm0ybV9jdHgpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5maC5tMm1fY3R4KTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAkJa2ZyZWUoY3R4KTsKIAkJcmV0dXJuIHJldDsKQEAgLTMyNCw3ICszMjUsNyBAQAogCXN0cnVjdCB2YjJfcXVldWUgKnZxOwogCXN0cnVjdCBnMmRfZnJhbWUgKmZybTsKIAotCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgZi0+dHlwZSk7CisJdnEgPSB2NGwyX20ybV9nZXRfdnEoY3R4LT5maC5tMm1fY3R4LCBmLT50eXBlKTsKIAlpZiAoIXZxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlmcm0gPSBnZXRfZnJhbWUoY3R4LCBmLT50eXBlKTsKQEAgLTM4NCw3ICszODUsNyBAQAogCXJldCA9IHZpZGlvY190cnlfZm10KGZpbGUsIHBydiwgZik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOworCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+ZmgubTJtX2N0eCwgZi0+dHlwZSk7CiAJaWYgKHZiMl9pc19idXN5KHZxKSkgewogCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgInF1ZXVlICglZCkgYnVzdFxuIiwgZi0+dHlwZSk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC00MTAsNzIgKzQxMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZzJkX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gZmgyY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0Jc3RydWN0IGcyZF9kZXYgKmRldiA9IGN0eC0+ZGV2OwotCXVuc2lnbmVkIGludCByZXM7Ci0KLQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKLQlyZXMgPSB2NGwyX20ybV9wb2xsKGZpbGUsIGN0eC0+bTJtX2N0eCwgd2FpdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IGcyZF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gZmgyY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0Jc3RydWN0IGcyZF9kZXYgKmRldiA9IGN0eC0+ZGV2OwotCWludCByZXQ7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm11dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXQgPSB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKLQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxYnVmcykKLXsKLQlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gcHJpdjsKLQlyZXR1cm4gdjRsMl9tMm1fcmVxYnVmcyhmaWxlLCBjdHgtPm0ybV9jdHgsIHJlcWJ1ZnMpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBnMmRfY3R4ICpjdHggPSBwcml2OwotCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBnMmRfY3R4ICpjdHggPSBwcml2OwotCXJldHVybiB2NGwyX20ybV9xYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBnMmRfY3R4ICpjdHggPSBwcml2OwotCXJldHVybiB2NGwyX20ybV9kcWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBnMmRfY3R4ICpjdHggPSBwcml2OwotCXJldHVybiB2NGwyX20ybV9zdHJlYW1vbihmaWxlLCBjdHgtPm0ybV9jdHgsIHR5cGUpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBnMmRfY3R4ICpjdHggPSBwcml2OwotCXJldHVybiB2NGwyX20ybV9zdHJlYW1vZmYoZmlsZSwgY3R4LT5tMm1fY3R4LCB0eXBlKTsKLX0KLQogc3RhdGljIGludCB2aWRpb2NfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3IpCiB7CkBAIC01NTEsMjAgKzQ4Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGcyZF9sb2NrKHZvaWQgKnBydikKLXsKLQlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gcHJ2OwotCXN0cnVjdCBnMmRfZGV2ICpkZXYgPSBjdHgtPmRldjsKLQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgZzJkX3VubG9jayh2b2lkICpwcnYpCi17Ci0Jc3RydWN0IGcyZF9jdHggKmN0eCA9IHBydjsKLQlzdHJ1Y3QgZzJkX2RldiAqZGV2ID0gY3R4LT5kZXY7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKLX0KLQogc3RhdGljIHZvaWQgam9iX2Fib3J0KHZvaWQgKnBydikKIHsKIAlzdHJ1Y3QgZzJkX2N0eCAqY3R4ID0gcHJ2OwpAQCAtNTg5LDggKzUxMCw4IEBACiAKIAlkZXYtPmN1cnIgPSBjdHg7CiAKLQlzcmMgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1fY3R4KTsKLQlkc3QgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5tMm1fY3R4KTsKKwlzcmMgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5maC5tMm1fY3R4KTsKKwlkc3QgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5maC5tMm1fY3R4KTsKIAogCWNsa19lbmFibGUoZGV2LT5nYXRlKTsKIAlnMmRfcmVzZXQoZGV2KTsKQEAgLTYzMSw4ICs1NTIsOCBAQAogCiAJQlVHX09OKGN0eCA9PSBOVUxMKTsKIAotCXNyYyA9IHY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN0eC0+bTJtX2N0eCk7Ci0JZHN0ID0gdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUoY3R4LT5tMm1fY3R4KTsKKwlzcmMgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgpOworCWRzdCA9IHY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKGN0eC0+ZmgubTJtX2N0eCk7CiAKIAlCVUdfT04oc3JjID09IE5VTEwpOwogCUJVR19PTihkc3QgPT0gTlVMTCk7CkBAIC02NDIsNyArNTYzLDcgQEAKIAogCXY0bDJfbTJtX2J1Zl9kb25lKHNyYywgVkIyX0JVRl9TVEFURV9ET05FKTsKIAl2NGwyX20ybV9idWZfZG9uZShkc3QsIFZCMl9CVUZfU1RBVEVfRE9ORSk7Ci0JdjRsMl9tMm1fam9iX2ZpbmlzaChkZXYtPm0ybV9kZXYsIGN0eC0+bTJtX2N0eCk7CisJdjRsMl9tMm1fam9iX2ZpbmlzaChkZXYtPm0ybV9kZXYsIGN0eC0+ZmgubTJtX2N0eCk7CiAKIAlkZXYtPmN1cnIgPSBOVUxMOwogCXdha2VfdXAoJmRldi0+aXJxX3F1ZXVlKTsKQEAgLTY1Myw5ICs1NzQsOSBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBnMmRfb3BlbiwKIAkucmVsZWFzZQk9IGcyZF9yZWxlYXNlLAotCS5wb2xsCQk9IGcyZF9wb2xsLAorCS5wb2xsCQk9IHY0bDJfbTJtX2ZvcF9wb2xsLAogCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKLQkubW1hcAkJPSBnMmRfbW1hcCwKKwkubW1hcAkJPSB2NGwyX20ybV9mb3BfbW1hcCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgZzJkX2lvY3RsX29wcyA9IHsKQEAgLTY3MSwxNCArNTkyLDEzIEBACiAJLnZpZGlvY190cnlfZm10X3ZpZF9vdXQJCT0gdmlkaW9jX3RyeV9mbXQsCiAJLnZpZGlvY19zX2ZtdF92aWRfb3V0CQk9IHZpZGlvY19zX2ZtdCwKIAotCS52aWRpb2NfcmVxYnVmcwkJCT0gdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZgkJPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19yZXFidWZzCQkJPSB2NGwyX20ybV9pb2N0bF9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJCT0gdjRsMl9tMm1faW9jdGxfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQkJPSB2NGwyX20ybV9pb2N0bF9xYnVmLAorCS52aWRpb2NfZHFidWYJCQk9IHY0bDJfbTJtX2lvY3RsX2RxYnVmLAogCi0JLnZpZGlvY19xYnVmCQkJPSB2aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmCQkJPSB2aWRpb2NfZHFidWYsCi0KLQkudmlkaW9jX3N0cmVhbW9uCQk9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2Nfc3RyZWFtb24JCT0gdjRsMl9tMm1faW9jdGxfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYJCT0gdjRsMl9tMm1faW9jdGxfc3RyZWFtb2ZmLAogCiAJLnZpZGlvY19nX2Nyb3AJCQk9IHZpZGlvY19nX2Nyb3AsCiAJLnZpZGlvY19zX2Nyb3AJCQk9IHZpZGlvY19zX2Nyb3AsCkBAIC02OTcsOCArNjE3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9tMm1fb3BzIGcyZF9tMm1fb3BzID0gewogCS5kZXZpY2VfcnVuCT0gZGV2aWNlX3J1biwKIAkuam9iX2Fib3J0CT0gam9iX2Fib3J0LAotCS5sb2NrCQk9IGcyZF9sb2NrLAotCS51bmxvY2sJCT0gZzJkX3VubG9jaywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGV4eW5vc19nMmRfbWF0Y2hbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWcyZC9nMmQuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWcyZC9nMmQuaAppbmRleCAzMDBjYTA1Li5iMGU1MmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1nMmQvZzJkLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtZzJkL2cyZC5oCkBAIC01Nyw3ICs1Nyw2IEBACiBzdHJ1Y3QgZzJkX2N0eCB7CiAJc3RydWN0IHY0bDJfZmggZmg7CiAJc3RydWN0IGcyZF9kZXYJCSpkZXY7Ci0Jc3RydWN0IHY0bDJfbTJtX2N0eAkqbTJtX2N0eDsKIAlzdHJ1Y3QgZzJkX2ZyYW1lCWluOwogCXN0cnVjdCBnMmRfZnJhbWUJb3V0OwogCXN0cnVjdCB2NGwyX2N0cmwJKmN0cmxfaGZsaXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9NYWtlZmlsZQppbmRleCBkMThjYjVlLi5hMWE5MTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACi1zNXAtanBlZy1vYmpzIDo9IGpwZWctY29yZS5vCitzNXAtanBlZy1vYmpzIDo9IGpwZWctY29yZS5vIGpwZWctaHctZXh5bm9zNC5vIGpwZWctaHctczVwLm8KIG9iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9KUEVHKSArPSBzNXAtanBlZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWNvcmUuYwppbmRleCA5Yjg4YTQ2MC4uN2Q2OGQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctY29yZS5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qIGxpbnV4L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1jb3JlLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiAgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQogICoKICAqIEF1dGhvcjogQW5kcnplaiBQaWV0cmFzaWV3aWN6IDxhbmRyemVqLnBAc2Ftc3VuZy5jb20+CisgKiBBdXRob3I6IEphY2VrIEFuYXN6ZXdza2kgPGouYW5hc3pld3NraUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE3LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTI4LDQxICszMCwxOCBAQAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CiAKICNpbmNsdWRlICJqcGVnLWNvcmUuaCIKLSNpbmNsdWRlICJqcGVnLWh3LmgiCisjaW5jbHVkZSAianBlZy1ody1zNXAuaCIKKyNpbmNsdWRlICJqcGVnLWh3LWV4eW5vczQuaCIKKyNpbmNsdWRlICJqcGVnLXJlZ3MuaCIKIAotc3RhdGljIHN0cnVjdCBzNXBfanBlZ19mbXQgZm9ybWF0c19lbmNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgczVwX2pwZWdfZm10IHNqcGVnX2Zvcm1hdHNbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJKUEVHIEpGSUYiLAogCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9KUEVHLAotCQkuY29scGxhbmVzCT0gMSwKLQkJLnR5cGVzCQk9IE1FTTJNRU1fQ0FQVFVSRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIllVViA0OjI6MiBwYWNrZWQsIFlDYllDciIsCi0JCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5kZXB0aAkJPSAxNiwKLQkJLmNvbHBsYW5lcwk9IDEsCi0JCS50eXBlcwkJPSBNRU0yTUVNX09VVFBVVCwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIlJHQjU2NSIsCi0JCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKLQkJLmRlcHRoCQk9IDE2LAotCQkuY29scGxhbmVzCT0gMSwKLQkJLnR5cGVzCQk9IE1FTTJNRU1fT1VUUFVULAotCX0sCi19OwotI2RlZmluZSBOVU1fRk9STUFUU19FTkMgQVJSQVlfU0laRShmb3JtYXRzX2VuYykKLQotc3RhdGljIHN0cnVjdCBzNXBfanBlZ19mbXQgZm9ybWF0c19kZWNbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJZVVYgNDoyOjAgcGxhbmFyLCBZQ2JDciIsCi0JCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1lVVjQyMCwKLQkJLmRlcHRoCQk9IDEyLAotCQkuY29scGxhbmVzCT0gMywKLQkJLmhfYWxpZ24JPSA0LAotCQkudl9hbGlnbgk9IDQsCi0JCS50eXBlcwkJPSBNRU0yTUVNX0NBUFRVUkUsCisJCS5mbGFncwkJPSBTSlBFR19GTVRfRkxBR19FTkNfQ0FQVFVSRSB8CisJCQkJICBTSlBFR19GTVRfRkxBR19ERUNfT1VUUFVUIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX1M1UCB8CisJCQkJICBTSlBFR19GTVRfRkxBR19FWFlOT1M0LAogCX0sCiAJewogCQkubmFtZQkJPSAiWVVWIDQ6MjoyIHBhY2tlZCwgWUNiWUNyIiwKQEAgLTcxLDI3ICs1MCwyMTQgQEAKIAkJLmNvbHBsYW5lcwk9IDEsCiAJCS5oX2FsaWduCT0gNCwKIAkJLnZfYWxpZ24JPSAzLAotCQkudHlwZXMJCT0gTUVNMk1FTV9DQVBUVVJFLAorCQkuZmxhZ3MJCT0gU0pQRUdfRk1UX0ZMQUdfRU5DX09VVFBVVCB8CisJCQkJICBTSlBFR19GTVRfRkxBR19ERUNfQ0FQVFVSRSB8CisJCQkJICBTSlBFR19GTVRfRkxBR19TNVAgfAorCQkJCSAgU0pQRUdfRk1UX05PTl9SR0IsCisJCS5zdWJzYW1wbGluZwk9IFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyLAogCX0sCiAJewotCQkubmFtZQkJPSAiSlBFRyBKRklGIiwKLQkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfSlBFRywKKwkJLm5hbWUJCT0gIllVViA0OjI6MiBwYWNrZWQsIFlDYllDciIsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5kZXB0aAkJPSAxNiwKIAkJLmNvbHBsYW5lcwk9IDEsCi0JCS50eXBlcwkJPSBNRU0yTUVNX09VVFBVVCwKKwkJLmhfYWxpZ24JPSAxLAorCQkudl9hbGlnbgk9IDAsCisJCS5mbGFncwkJPSBTSlBFR19GTVRfRkxBR19FTkNfT1VUUFVUIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0RFQ19DQVBUVVJFIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0VYWU5PUzQgfAorCQkJCSAgU0pQRUdfRk1UX05PTl9SR0IsCisJCS5zdWJzYW1wbGluZwk9IFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyLAorCX0sCisJeworCQkubmFtZQkJPSAiWVVWIDQ6MjoyIHBhY2tlZCwgWUNyWUNiIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfWVZZVSwKKwkJLmRlcHRoCQk9IDE2LAorCQkuY29scGxhbmVzCT0gMSwKKwkJLmhfYWxpZ24JPSAxLAorCQkudl9hbGlnbgk9IDAsCisJCS5mbGFncwkJPSBTSlBFR19GTVRfRkxBR19FTkNfT1VUUFVUIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0RFQ19DQVBUVVJFIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0VYWU5PUzQgfAorCQkJCSAgU0pQRUdfRk1UX05PTl9SR0IsCisJCS5zdWJzYW1wbGluZwk9IFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyLAorCX0sCisJeworCQkubmFtZQkJPSAiUkdCNTY1IiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkuZGVwdGgJCT0gMTYsCisJCS5jb2xwbGFuZXMJPSAxLAorCQkuaF9hbGlnbgk9IDAsCisJCS52X2FsaWduCT0gMCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfUkdCLAorCQkuc3Vic2FtcGxpbmcJPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQ0NCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIlJHQjU2NSIsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLmRlcHRoCQk9IDE2LAorCQkuY29scGxhbmVzCT0gMSwKKwkJLmhfYWxpZ24JPSAwLAorCQkudl9hbGlnbgk9IDAsCisJCS5mbGFncwkJPSBTSlBFR19GTVRfRkxBR19FTkNfT1VUUFVUIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX1M1UCB8CisJCQkJICBTSlBFR19GTVRfUkdCLAorCQkuc3Vic2FtcGxpbmcJPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQ0NCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIkFSR0I4ODg4LCAzMiBicHAiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9SR0IzMiwKKwkJLmRlcHRoCQk9IDMyLAorCQkuY29scGxhbmVzCT0gMSwKKwkJLmhfYWxpZ24JPSAwLAorCQkudl9hbGlnbgk9IDAsCisJCS5mbGFncwkJPSBTSlBFR19GTVRfRkxBR19FTkNfT1VUUFVUIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0RFQ19DQVBUVVJFIHwKKwkJCQkgIFNKUEVHX0ZNVF9GTEFHX0VYWU5PUzQgfAorCQkJCSAgU0pQRUdfRk1UX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180NDQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDo0OjQgcGxhbmFyLCBZL0NiQ3IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjI0LAorCQkuZGVwdGgJCT0gMjQsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDAsCisJCS52X2FsaWduCT0gMCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180NDQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDo0OjQgcGxhbmFyLCBZL0NyQ2IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjQyLAorCQkuZGVwdGgJCT0gMjQsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDAsCisJCS52X2FsaWduCT0gMCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180NDQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDoyOjIgcGxhbmFyLCBZL0NyQ2IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjYxLAorCQkuZGVwdGgJCT0gMTYsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDEsCisJCS52X2FsaWduCT0gMCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjIsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDoyOjIgcGxhbmFyLCBZL0NiQ3IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjE2LAorCQkuZGVwdGgJCT0gMTYsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDEsCisJCS52X2FsaWduCT0gMCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjIsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDoyOjAgcGxhbmFyLCBZL0NiQ3IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjEyLAorCQkuZGVwdGgJCT0gMTIsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDEsCisJCS52X2FsaWduCT0gMSwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjAsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJZVVYgNDoyOjAgcGxhbmFyLCBZL0NiQ3IiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjEyLAorCQkuZGVwdGgJCT0gMTIsCisJCS5jb2xwbGFuZXMJPSAyLAorCQkuaF9hbGlnbgk9IDQsCisJCS52X2FsaWduCT0gNCwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfUzVQIHwKKwkJCQkgIFNKUEVHX0ZNVF9OT05fUkdCLAorCQkuc3Vic2FtcGxpbmcJPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIllVViA0OjI6MCBwbGFuYXIsIFkvQ3JDYiIsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX05WMjEsCisJCS5kZXB0aAkJPSAxMiwKKwkJLmNvbHBsYW5lcwk9IDIsCisJCS5oX2FsaWduCT0gMSwKKwkJLnZfYWxpZ24JPSAxLAorCQkuZmxhZ3MJCT0gU0pQRUdfRk1UX0ZMQUdfRU5DX09VVFBVVCB8CisJCQkJICBTSlBFR19GTVRfRkxBR19ERUNfQ0FQVFVSRSB8CisJCQkJICBTSlBFR19GTVRfRkxBR19FWFlOT1M0IHwKKwkJCQkgIFNKUEVHX0ZNVF9OT05fUkdCLAorCQkuc3Vic2FtcGxpbmcJPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIllVViA0OjI6MCBjb250aWd1b3VzIDMtcGxhbmFyLCBZL0NiL0NyIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfWVVWNDIwLAorCQkuZGVwdGgJCT0gMTIsCisJCS5jb2xwbGFuZXMJPSAzLAorCQkuaF9hbGlnbgk9IDEsCisJCS52X2FsaWduCT0gMSwKKwkJLmZsYWdzCQk9IFNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfREVDX0NBUFRVUkUgfAorCQkJCSAgU0pQRUdfRk1UX0ZMQUdfRVhZTk9TNCB8CisJCQkJICBTSlBFR19GTVRfTk9OX1JHQiwKKwkJLnN1YnNhbXBsaW5nCT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjAsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJHcmF5IiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwkJLmRlcHRoCQk9IDgsCisJCS5jb2xwbGFuZXMJPSAxLAorCQkuZmxhZ3MJCT0gU0pQRUdfRk1UX0ZMQUdfRU5DX09VVFBVVCB8CisJCQkJICBTSlBFR19GTVRfRkxBR19ERUNfQ0FQVFVSRSB8CisJCQkJICBTSlBFR19GTVRfRkxBR19FWFlOT1M0IHwKKwkJCQkgIFNKUEVHX0ZNVF9OT05fUkdCLAorCQkuc3Vic2FtcGxpbmcJPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HX0dSQVksCiAJfSwKIH07Ci0jZGVmaW5lIE5VTV9GT1JNQVRTX0RFQyBBUlJBWV9TSVpFKGZvcm1hdHNfZGVjKQorI2RlZmluZSBTSlBFR19OVU1fRk9STUFUUyBBUlJBWV9TSVpFKHNqcGVnX2Zvcm1hdHMpCiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHF0YmxfbHVtaW5hbmNlWzRdWzY0XSA9IHsKLQl7LyogbGV2ZWwgMSAtIGhpZ2ggcXVhbGl0eSAqLwotCQkgOCwgIDYsICA2LCAgOCwgMTIsIDE0LCAxNiwgMTcsCi0JCSA2LCAgNiwgIDYsICA4LCAxMCwgMTMsIDEyLCAxNSwKLQkJIDYsICA2LCAgNywgIDgsIDEzLCAxNCwgMTgsIDI0LAotCQkgOCwgIDgsICA4LCAxNCwgMTMsIDE5LCAyNCwgMzUsCi0JCTEyLCAxMCwgMTMsIDEzLCAyMCwgMjYsIDM0LCAzOSwKLQkJMTQsIDEzLCAxNCwgMTksIDI2LCAzNCwgMzksIDM5LAotCQkxNiwgMTIsIDE4LCAyNCwgMzQsIDM5LCAzOSwgMzksCi0JCTE3LCAxNSwgMjQsIDM1LCAzOSwgMzksIDM5LCAzOQorCXsvKmxldmVsIDAgLSBoaWdoIGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KKwkJMjAsIDE2LCAyNSwgMzksIDUwLCA0NiwgNjIsIDY4LAorCQkxNiwgMTgsIDIzLCAzOCwgMzgsIDUzLCA2NSwgNjgsCisJCTI1LCAyMywgMzEsIDM4LCA1MywgNjUsIDY4LCA2OCwKKwkJMzksIDM4LCAzOCwgNTMsIDY1LCA2OCwgNjgsIDY4LAorCQk1MCwgMzgsIDUzLCA2NSwgNjgsIDY4LCA2OCwgNjgsCisJCTQ2LCA1MywgNjUsIDY4LCA2OCwgNjgsIDY4LCA2OCwKKwkJNjIsIDY1LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LAorCQk2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgKKwl9LAorCXsvKiBsZXZlbCAxICovCisJCTE2LCAxMSwgMTEsIDE2LCAyMywgMjcsIDMxLCAzMCwKKwkJMTEsIDEyLCAxMiwgMTUsIDIwLCAyMywgMjMsIDMwLAorCQkxMSwgMTIsIDEzLCAxNiwgMjMsIDI2LCAzNSwgNDcsCisJCTE2LCAxNSwgMTYsIDIzLCAyNiwgMzcsIDQ3LCA2NCwKKwkJMjMsIDIwLCAyMywgMjYsIDM5LCA1MSwgNjQsIDY0LAorCQkyNywgMjMsIDI2LCAzNywgNTEsIDY0LCA2NCwgNjQsCisJCTMxLCAyMywgMzUsIDQ3LCA2NCwgNjQsIDY0LCA2NCwKKwkJMzAsIDMwLCA0NywgNjQsIDY0LCA2NCwgNjQsIDY0CiAJfSwKIAl7LyogbGV2ZWwgMiAqLwogCQkxMiwgIDgsICA4LCAxMiwgMTcsIDIxLCAyNCwgMjMsCkBAIC0xMDMsMzggKzI2OSwzOCBAQAogCQkyNCwgMTgsIDI3LCAzNiwgNTEsIDU5LCA1OSwgNTksCiAJCTIzLCAyMywgMzYsIDUzLCA1OSwgNTksIDU5LCA1OQogCX0sCi0Jey8qIGxldmVsIDMgKi8KLQkJMTYsIDExLCAxMSwgMTYsIDIzLCAyNywgMzEsIDMwLAotCQkxMSwgMTIsIDEyLCAxNSwgMjAsIDIzLCAyMywgMzAsCi0JCTExLCAxMiwgMTMsIDE2LCAyMywgMjYsIDM1LCA0NywKLQkJMTYsIDE1LCAxNiwgMjMsIDI2LCAzNywgNDcsIDY0LAotCQkyMywgMjAsIDIzLCAyNiwgMzksIDUxLCA2NCwgNjQsCi0JCTI3LCAyMywgMjYsIDM3LCA1MSwgNjQsIDY0LCA2NCwKLQkJMzEsIDIzLCAzNSwgNDcsIDY0LCA2NCwgNjQsIDY0LAotCQkzMCwgMzAsIDQ3LCA2NCwgNjQsIDY0LCA2NCwgNjQKLQl9LAotCXsvKmxldmVsIDQgLSBsb3cgcXVhbGl0eSAqLwotCQkyMCwgMTYsIDI1LCAzOSwgNTAsIDQ2LCA2MiwgNjgsCi0JCTE2LCAxOCwgMjMsIDM4LCAzOCwgNTMsIDY1LCA2OCwKLQkJMjUsIDIzLCAzMSwgMzgsIDUzLCA2NSwgNjgsIDY4LAotCQkzOSwgMzgsIDM4LCA1MywgNjUsIDY4LCA2OCwgNjgsCi0JCTUwLCAzOCwgNTMsIDY1LCA2OCwgNjgsIDY4LCA2OCwKLQkJNDYsIDUzLCA2NSwgNjgsIDY4LCA2OCwgNjgsIDY4LAotCQk2MiwgNjUsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsCi0JCTY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OAorCXsvKiBsZXZlbCAzIC0gbG93IGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KKwkJIDgsICA2LCAgNiwgIDgsIDEyLCAxNCwgMTYsIDE3LAorCQkgNiwgIDYsICA2LCAgOCwgMTAsIDEzLCAxMiwgMTUsCisJCSA2LCAgNiwgIDcsICA4LCAxMywgMTQsIDE4LCAyNCwKKwkJIDgsICA4LCAgOCwgMTQsIDEzLCAxOSwgMjQsIDM1LAorCQkxMiwgMTAsIDEzLCAxMywgMjAsIDI2LCAzNCwgMzksCisJCTE0LCAxMywgMTQsIDE5LCAyNiwgMzQsIDM5LCAzOSwKKwkJMTYsIDEyLCAxOCwgMjQsIDM0LCAzOSwgMzksIDM5LAorCQkxNywgMTUsIDI0LCAzNSwgMzksIDM5LCAzOSwgMzkKIAl9CiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBxdGJsX2Nocm9taW5hbmNlWzRdWzY0XSA9IHsKLQl7LyogbGV2ZWwgMSAtIGhpZ2ggcXVhbGl0eSAqLwotCQkgOSwgIDgsICA5LCAxMSwgMTQsIDE3LCAxOSwgMjQsCi0JCSA4LCAxMCwgIDksIDExLCAxNCwgMTMsIDE3LCAyMiwKLQkJIDksICA5LCAxMywgMTQsIDEzLCAxNSwgMjMsIDI2LAotCQkxMSwgMTEsIDE0LCAxNCwgMTUsIDIwLCAyNiwgMzMsCi0JCTE0LCAxNCwgMTMsIDE1LCAyMCwgMjQsIDMzLCAzOSwKLQkJMTcsIDEzLCAxNSwgMjAsIDI0LCAzMiwgMzksIDM5LAotCQkxOSwgMTcsIDIzLCAyNiwgMzMsIDM5LCAzOSwgMzksCi0JCTI0LCAyMiwgMjYsIDMzLCAzOSwgMzksIDM5LCAzOQorCXsvKmxldmVsIDAgLSBoaWdoIGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KKwkJMjEsIDI1LCAzMiwgMzgsIDU0LCA2OCwgNjgsIDY4LAorCQkyNSwgMjgsIDI0LCAzOCwgNTQsIDY4LCA2OCwgNjgsCisJCTMyLCAyNCwgMzIsIDQzLCA2NiwgNjgsIDY4LCA2OCwKKwkJMzgsIDM4LCA0MywgNTMsIDY4LCA2OCwgNjgsIDY4LAorCQk1NCwgNTQsIDY2LCA2OCwgNjgsIDY4LCA2OCwgNjgsCisJCTY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwKKwkJNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LAorCQk2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgKKwl9LAorCXsvKiBsZXZlbCAxICovCisJCTE3LCAxNSwgMTcsIDIxLCAyMCwgMjYsIDM4LCA0OCwKKwkJMTUsIDE5LCAxOCwgMTcsIDIwLCAyNiwgMzUsIDQzLAorCQkxNywgMTgsIDIwLCAyMiwgMjYsIDMwLCA0NiwgNTMsCisJCTIxLCAxNywgMjIsIDI4LCAzMCwgMzksIDUzLCA2NCwKKwkJMjAsIDIwLCAyNiwgMzAsIDM5LCA0OCwgNjQsIDY0LAorCQkyNiwgMjYsIDMwLCAzOSwgNDgsIDYzLCA2NCwgNjQsCisJCTM4LCAzNSwgNDYsIDUzLCA2NCwgNjQsIDY0LCA2NCwKKwkJNDgsIDQzLCA1MywgNjQsIDY0LCA2NCwgNjQsIDY0CiAJfSwKIAl7LyogbGV2ZWwgMiAqLwogCQkxMywgMTEsIDEzLCAxNiwgMjAsIDIwLCAyOSwgMzcsCkBAIC0xNDYsMjUgKzMxMiwxNSBAQAogCQkyOSwgMjYsIDM1LCA0MCwgNTAsIDU5LCA1OSwgNTksCiAJCTM3LCAzMiwgNDAsIDUwLCA1OSwgNTksIDU5LCA1OQogCX0sCi0Jey8qIGxldmVsIDMgKi8KLQkJMTcsIDE1LCAxNywgMjEsIDIwLCAyNiwgMzgsIDQ4LAotCQkxNSwgMTksIDE4LCAxNywgMjAsIDI2LCAzNSwgNDMsCi0JCTE3LCAxOCwgMjAsIDIyLCAyNiwgMzAsIDQ2LCA1MywKLQkJMjEsIDE3LCAyMiwgMjgsIDMwLCAzOSwgNTMsIDY0LAotCQkyMCwgMjAsIDI2LCAzMCwgMzksIDQ4LCA2NCwgNjQsCi0JCTI2LCAyNiwgMzAsIDM5LCA0OCwgNjMsIDY0LCA2NCwKLQkJMzgsIDM1LCA0NiwgNTMsIDY0LCA2NCwgNjQsIDY0LAotCQk0OCwgNDMsIDUzLCA2NCwgNjQsIDY0LCA2NCwgNjQKLQl9LAotCXsvKmxldmVsIDQgLSBsb3cgcXVhbGl0eSAqLwotCQkyMSwgMjUsIDMyLCAzOCwgNTQsIDY4LCA2OCwgNjgsCi0JCTI1LCAyOCwgMjQsIDM4LCA1NCwgNjgsIDY4LCA2OCwKLQkJMzIsIDI0LCAzMiwgNDMsIDY2LCA2OCwgNjgsIDY4LAotCQkzOCwgMzgsIDQzLCA1MywgNjgsIDY4LCA2OCwgNjgsCi0JCTU0LCA1NCwgNjYsIDY4LCA2OCwgNjgsIDY4LCA2OCwKLQkJNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LAotCQk2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsCi0JCTY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OAorCXsvKiBsZXZlbCAzIC0gbG93IGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KKwkJIDksICA4LCAgOSwgMTEsIDE0LCAxNywgMTksIDI0LAorCQkgOCwgMTAsICA5LCAxMSwgMTQsIDEzLCAxNywgMjIsCisJCSA5LCAgOSwgMTMsIDE0LCAxMywgMTUsIDIzLCAyNiwKKwkJMTEsIDExLCAxNCwgMTQsIDE1LCAyMCwgMjYsIDMzLAorCQkxNCwgMTQsIDEzLCAxNSwgMjAsIDI0LCAzMywgMzksCisJCTE3LCAxMywgMTUsIDIwLCAyNCwgMzIsIDM5LCAzOSwKKwkJMTksIDE3LCAyMywgMjYsIDMzLCAzOSwgMzksIDM5LAorCQkyNCwgMjIsIDI2LCAzMywgMzksIDM5LCAzOSwgMzkKIAl9CiB9OwogCkBAIC0yMDIsNiArMzU4LDEwNiBAQAogCTB4ZjksIDB4ZmEKIH07CiAKKy8qCisgKiBGb3VyY2MgZG93bmdyYWRlIHNjaGVtYSBsb29rdXAgdGFibGVzIGZvciA0MjIgYW5kIDQyMAorICogY2hyb21hIHN1YnNhbXBsaW5nIC0gZm91cmNjIG9uIGVhY2ggcG9zaXRpb24gbWFwcyBvbiB0aGUKKyAqIGZvdXJjYyBmcm9tIHRoZSB0YWJsZSBmb3VyY2NfdG9fZHduZ3JkX3NjaGVtYV9pZCB3aGljaCBhbGxvd3MKKyAqIHRvIGdldCB0aGUgbW9zdCBzdWl0YWJsZSBmb3VyY2MgY291bnRlcnBhcnQgZm9yIHRoZSBnaXZlbgorICogZG93bmdyYWRlZCBzdWJzYW1wbGluZyBwcm9wZXJ0eS4KKyAqLworc3RhdGljIGNvbnN0IHUzMiBzdWJzNDIyX2ZvdXJjY19kd25ncmRfc2NoZW1hW10gPSB7CisJVjRMMl9QSVhfRk1UX05WMTYsCisJVjRMMl9QSVhfRk1UX05WNjEsCit9OworCitzdGF0aWMgY29uc3QgdTMyIHN1YnM0MjBfZm91cmNjX2R3bmdyZF9zY2hlbWFbXSA9IHsKKwlWNEwyX1BJWF9GTVRfTlYxMiwKKwlWNEwyX1BJWF9GTVRfTlYyMSwKKwlWNEwyX1BJWF9GTVRfTlYxMiwKKwlWNEwyX1BJWF9GTVRfTlYyMSwKKwlWNEwyX1BJWF9GTVRfTlYxMiwKKwlWNEwyX1BJWF9GTVRfTlYyMSwKKwlWNEwyX1BJWF9GTVRfR1JFWSwKKwlWNEwyX1BJWF9GTVRfR1JFWSwKKwlWNEwyX1BJWF9GTVRfR1JFWSwKKwlWNEwyX1BJWF9GTVRfR1JFWSwKK307CisKKy8qCisgKiBMb29rdXAgdGFibGUgZm9yIHRyYW5zbGF0aW9uIG9mIGEgZm91cmNjIHRvIHRoZSBwb3NpdGlvbgorICogb2YgaXRzIGRvd25ncmFkZWQgY291bnRlcnBhcnQgaW4gdGhlICpmb3VyY2NfZHduZ3JkX3NjaGVtYQorICogdGFibGVzLgorICovCitzdGF0aWMgY29uc3QgdTMyIGZvdXJjY190b19kd25ncmRfc2NoZW1hX2lkW10gPSB7CisJVjRMMl9QSVhfRk1UX05WMjQsCisJVjRMMl9QSVhfRk1UX05WNDIsCisJVjRMMl9QSVhfRk1UX05WMTYsCisJVjRMMl9QSVhfRk1UX05WNjEsCisJVjRMMl9QSVhfRk1UX1lVWVYsCisJVjRMMl9QSVhfRk1UX1lWWVUsCisJVjRMMl9QSVhfRk1UX05WMTIsCisJVjRMMl9QSVhfRk1UX05WMjEsCisJVjRMMl9QSVhfRk1UX1lVVjQyMCwKKwlWNEwyX1BJWF9GTVRfR1JFWSwKK307CisKK3N0YXRpYyBpbnQgczVwX2pwZWdfZ2V0X2R3bmdyZF9zY2hfaWRfYnlfZm91cmNjKHUzMiBmb3VyY2MpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm91cmNjX3RvX2R3bmdyZF9zY2hlbWFfaWQpOyArK2kpIHsKKwkJaWYgKGZvdXJjY190b19kd25ncmRfc2NoZW1hX2lkW2ldID09IGZvdXJjYykKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHM1cF9qcGVnX2FkanVzdF9mb3VyY2NfdG9fc3Vic2FtcGxpbmcoCisJCQkJCWVudW0gdjRsMl9qcGVnX2Nocm9tYV9zdWJzYW1wbGluZyBzdWJzLAorCQkJCQl1MzIgaW5fZm91cmNjLAorCQkJCQl1MzIgKm91dF9mb3VyY2MsCisJCQkJCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCkKK3sKKwlpbnQgZHduZ3JkX3NjaF9pZDsKKworCWlmIChjdHgtPnN1YnNhbXBsaW5nICE9IFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfR1JBWSkgeworCQlkd25ncmRfc2NoX2lkID0KKwkJCXM1cF9qcGVnX2dldF9kd25ncmRfc2NoX2lkX2J5X2ZvdXJjYyhpbl9mb3VyY2MpOworCQlpZiAoZHduZ3JkX3NjaF9pZCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGN0eC0+c3Vic2FtcGxpbmcpIHsKKwljYXNlIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfR1JBWToKKwkJKm91dF9mb3VyY2MgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMDoKKwkJaWYgKGR3bmdyZF9zY2hfaWQgPgorCQkJCUFSUkFZX1NJWkUoc3ViczQyMF9mb3VyY2NfZHduZ3JkX3NjaGVtYSkgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSpvdXRfZm91cmNjID0gc3ViczQyMF9mb3VyY2NfZHduZ3JkX3NjaGVtYVtkd25ncmRfc2NoX2lkXTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMjoKKwkJaWYgKGR3bmdyZF9zY2hfaWQgPgorCQkJCUFSUkFZX1NJWkUoc3ViczQyMl9mb3VyY2NfZHduZ3JkX3NjaGVtYSkgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSpvdXRfZm91cmNjID0gc3ViczQyMl9mb3VyY2NfZHduZ3JkX3NjaGVtYVtkd25ncmRfc2NoX2lkXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKm91dF9mb3VyY2MgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNHgxMl9kZWNvZGVkX3N1YnNhbXBsaW5nW10gPSB7CisJVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZLAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDQ0LAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyLAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIwLAorfTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHJsX3RvX2N0eChzdHJ1Y3QgdjRsMl9jdHJsICpjKQogewogCXJldHVybiBjb250YWluZXJfb2YoYy0+aGFuZGxlciwgc3RydWN0IHM1cF9qcGVnX2N0eCwgY3RybF9oYW5kbGVyKTsKQEAgLTIxMiw4ICs0NjgsMjQgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGZoLCBzdHJ1Y3QgczVwX2pwZWdfY3R4LCBmaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3NldF9xdGJsKHZvaWQgX19pb21lbSAqcmVncywgY29uc3QgdW5zaWduZWQgY2hhciAqcXRibCwKLQkJICAgdW5zaWduZWQgbG9uZyB0YWIsIGludCBsZW4pCitzdGF0aWMgaW50IHM1cF9qcGVnX3RvX3VzZXJfc3Vic2FtcGxpbmcoc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4KQoreworCVdBUk5fT04oY3R4LT5zdWJzYW1wbGluZyA+IDMpOworCisJaWYgKGN0eC0+anBlZy0+dmFyaWFudC0+dmVyc2lvbiA9PSBTSlBFR19TNVApIHsKKwkJaWYgKGN0eC0+c3Vic2FtcGxpbmcgPiAyKQorCQkJcmV0dXJuIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfR1JBWTsKKwkJcmV0dXJuIGN0eC0+c3Vic2FtcGxpbmc7CisJfSBlbHNlIHsKKwkJaWYgKGN0eC0+c3Vic2FtcGxpbmcgPiAyKQorCQkJcmV0dXJuIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIwOworCQlyZXR1cm4gZXh5bm9zNHgxMl9kZWNvZGVkX3N1YnNhbXBsaW5nW2N0eC0+c3Vic2FtcGxpbmddOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHM1cF9qcGVnX3NldF9xdGJsKHZvaWQgX19pb21lbSAqcmVncywKKwkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnF0YmwsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHRhYiwgaW50IGxlbikKIHsKIAlpbnQgaTsKIApAQCAtMjIxLDIyICs0OTMsMjUgQEAKIAkJd3JpdGVsKCh1bnNpZ25lZCBpbnQpcXRibFtpXSwgcmVncyArIHRhYiArIChpICogMHgwNCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19zZXRfcXRibF9sdW0odm9pZCBfX2lvbWVtICpyZWdzLCBpbnQgcXVhbGl0eSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfanBlZ19zZXRfcXRibF9sdW0odm9pZCBfX2lvbWVtICpyZWdzLCBpbnQgcXVhbGl0eSkKIHsKIAkvKiB0aGlzIGRyaXZlciBmaWxscyBxdWFudGlzYXRpb24gdGFibGUgMCB3aXRoIGRhdGEgZm9yIGx1bWEgKi8KLQlqcGVnX3NldF9xdGJsKHJlZ3MsIHF0YmxfbHVtaW5hbmNlW3F1YWxpdHldLCBTNVBfSlBHX1FUQkxfQ09OVEVOVCgwKSwKLQkJICAgICAgQVJSQVlfU0laRShxdGJsX2x1bWluYW5jZVtxdWFsaXR5XSkpOworCXM1cF9qcGVnX3NldF9xdGJsKHJlZ3MsIHF0YmxfbHVtaW5hbmNlW3F1YWxpdHldLAorCQkJICBTNVBfSlBHX1FUQkxfQ09OVEVOVCgwKSwKKwkJCSAgQVJSQVlfU0laRShxdGJsX2x1bWluYW5jZVtxdWFsaXR5XSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19zZXRfcXRibF9jaHIodm9pZCBfX2lvbWVtICpyZWdzLCBpbnQgcXVhbGl0eSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfanBlZ19zZXRfcXRibF9jaHIodm9pZCBfX2lvbWVtICpyZWdzLCBpbnQgcXVhbGl0eSkKIHsKIAkvKiB0aGlzIGRyaXZlciBmaWxscyBxdWFudGlzYXRpb24gdGFibGUgMSB3aXRoIGRhdGEgZm9yIGNocm9tYSAqLwotCWpwZWdfc2V0X3F0YmwocmVncywgcXRibF9jaHJvbWluYW5jZVtxdWFsaXR5XSwgUzVQX0pQR19RVEJMX0NPTlRFTlQoMSksCi0JCSAgICAgIEFSUkFZX1NJWkUocXRibF9jaHJvbWluYW5jZVtxdWFsaXR5XSkpOworCXM1cF9qcGVnX3NldF9xdGJsKHJlZ3MsIHF0YmxfY2hyb21pbmFuY2VbcXVhbGl0eV0sCisJCQkgIFM1UF9KUEdfUVRCTF9DT05URU5UKDEpLAorCQkJICBBUlJBWV9TSVpFKHF0YmxfY2hyb21pbmFuY2VbcXVhbGl0eV0pKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfc2V0X2h0Ymwodm9pZCBfX2lvbWVtICpyZWdzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpodGJsLAotCQkgICB1bnNpZ25lZCBsb25nIHRhYiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfanBlZ19zZXRfaHRibCh2b2lkIF9faW9tZW0gKnJlZ3MsCisJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpodGJsLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB0YWIsIGludCBsZW4pCiB7CiAJaW50IGk7CiAKQEAgLTI0NCwyOCArNTE5LDg0IEBACiAJCXdyaXRlbCgodW5zaWduZWQgaW50KWh0YmxbaV0sIHJlZ3MgKyB0YWIgKyAoaSAqIDB4MDQpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfc2V0X2hkY3RibCh2b2lkIF9faW9tZW0gKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX2pwZWdfc2V0X2hkY3RibCh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJLyogdGhpcyBkcml2ZXIgZmlsbHMgdGFibGUgMCBmb3IgdGhpcyBjb21wb25lbnQgKi8KLQlqcGVnX3NldF9odGJsKHJlZ3MsIGhkY3RibDAsIFM1UF9KUEdfSERDVEJMKDApLCBBUlJBWV9TSVpFKGhkY3RibDApKTsKKwlzNXBfanBlZ19zZXRfaHRibChyZWdzLCBoZGN0YmwwLCBTNVBfSlBHX0hEQ1RCTCgwKSwKKwkJCQkJCUFSUkFZX1NJWkUoaGRjdGJsMCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19zZXRfaGRjdGJsZyh2b2lkIF9faW9tZW0gKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX2pwZWdfc2V0X2hkY3RibGcodm9pZCBfX2lvbWVtICpyZWdzKQogewogCS8qIHRoaXMgZHJpdmVyIGZpbGxzIHRhYmxlIDAgZm9yIHRoaXMgY29tcG9uZW50ICovCi0JanBlZ19zZXRfaHRibChyZWdzLCBoZGN0YmxnMCwgUzVQX0pQR19IRENUQkxHKDApLCBBUlJBWV9TSVpFKGhkY3RibGcwKSk7CisJczVwX2pwZWdfc2V0X2h0YmwocmVncywgaGRjdGJsZzAsIFM1UF9KUEdfSERDVEJMRygwKSwKKwkJCQkJCUFSUkFZX1NJWkUoaGRjdGJsZzApKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfc2V0X2hhY3RibCh2b2lkIF9faW9tZW0gKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX2pwZWdfc2V0X2hhY3RibCh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJLyogdGhpcyBkcml2ZXIgZmlsbHMgdGFibGUgMCBmb3IgdGhpcyBjb21wb25lbnQgKi8KLQlqcGVnX3NldF9odGJsKHJlZ3MsIGhhY3RibDAsIFM1UF9KUEdfSEFDVEJMKDApLCBBUlJBWV9TSVpFKGhhY3RibDApKTsKKwlzNXBfanBlZ19zZXRfaHRibChyZWdzLCBoYWN0YmwwLCBTNVBfSlBHX0hBQ1RCTCgwKSwKKwkJCQkJCUFSUkFZX1NJWkUoaGFjdGJsMCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19zZXRfaGFjdGJsZyh2b2lkIF9faW9tZW0gKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX2pwZWdfc2V0X2hhY3RibGcodm9pZCBfX2lvbWVtICpyZWdzKQogewogCS8qIHRoaXMgZHJpdmVyIGZpbGxzIHRhYmxlIDAgZm9yIHRoaXMgY29tcG9uZW50ICovCi0JanBlZ19zZXRfaHRibChyZWdzLCBoYWN0YmxnMCwgUzVQX0pQR19IQUNUQkxHKDApLCBBUlJBWV9TSVpFKGhhY3RibGcwKSk7CisJczVwX2pwZWdfc2V0X2h0YmwocmVncywgaGFjdGJsZzAsIFM1UF9KUEdfSEFDVEJMRygwKSwKKwkJCQkJCUFSUkFZX1NJWkUoaGFjdGJsZzApKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4eW5vczRfanBlZ19zZXRfdGJsKHZvaWQgX19pb21lbSAqcmVncywKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJsLAorCQkJCQl1bnNpZ25lZCBsb25nIHRhYiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZHdvcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKKwkJZHdvcmQgPSB0YmxbaV0gfAorCQkJKHRibFtpICsgMV0gPDwgOCkgfAorCQkJKHRibFtpICsgMl0gPDwgMTYpIHwKKwkJCSh0YmxbaSArIDNdIDw8IDI0KTsKKwkJd3JpdGVsKGR3b3JkLCByZWdzICsgdGFiICsgaSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh5bm9zNF9qcGVnX3NldF9xdGJsX2x1bSh2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBxdWFsaXR5KQoreworCS8qIHRoaXMgZHJpdmVyIGZpbGxzIHF1YW50aXNhdGlvbiB0YWJsZSAwIHdpdGggZGF0YSBmb3IgbHVtYSAqLworCWV4eW5vczRfanBlZ19zZXRfdGJsKHJlZ3MsIHF0YmxfbHVtaW5hbmNlW3F1YWxpdHldLAorCQkJICAgICBFWFlOT1M0X1FUQkxfQ09OVEVOVCgwKSwKKwkJCSAgICAgQVJSQVlfU0laRShxdGJsX2x1bWluYW5jZVtxdWFsaXR5XSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh5bm9zNF9qcGVnX3NldF9xdGJsX2Nocih2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBxdWFsaXR5KQoreworCS8qIHRoaXMgZHJpdmVyIGZpbGxzIHF1YW50aXNhdGlvbiB0YWJsZSAxIHdpdGggZGF0YSBmb3IgY2hyb21hICovCisJZXh5bm9zNF9qcGVnX3NldF90YmwocmVncywgcXRibF9jaHJvbWluYW5jZVtxdWFsaXR5XSwKKwkJCSAgICAgRVhZTk9TNF9RVEJMX0NPTlRFTlQoMSksCisJCQkgICAgIEFSUkFZX1NJWkUocXRibF9jaHJvbWluYW5jZVtxdWFsaXR5XSkpOworfQorCit2b2lkIGV4eW5vczRfanBlZ19zZXRfaHVmZl90Ymwodm9pZCBfX2lvbWVtICpiYXNlKQoreworCWV4eW5vczRfanBlZ19zZXRfdGJsKGJhc2UsIGhkY3RibDAsIEVYWU5PUzRfSFVGRl9UQkxfSERDTEwsCisJCQkJCQkJQVJSQVlfU0laRShoZGN0YmwwKSk7CisJZXh5bm9zNF9qcGVnX3NldF90YmwoYmFzZSwgaGRjdGJsMCwgRVhZTk9TNF9IVUZGX1RCTF9IRENDTCwKKwkJCQkJCQlBUlJBWV9TSVpFKGhkY3RibDApKTsKKwlleHlub3M0X2pwZWdfc2V0X3RibChiYXNlLCBoZGN0YmxnMCwgRVhZTk9TNF9IVUZGX1RCTF9IRENMViwKKwkJCQkJCQlBUlJBWV9TSVpFKGhkY3RibGcwKSk7CisJZXh5bm9zNF9qcGVnX3NldF90YmwoYmFzZSwgaGRjdGJsZzAsIEVYWU5PUzRfSFVGRl9UQkxfSERDQ1YsCisJCQkJCQkJQVJSQVlfU0laRShoZGN0YmxnMCkpOworCWV4eW5vczRfanBlZ19zZXRfdGJsKGJhc2UsIGhhY3RibDAsIEVYWU5PUzRfSFVGRl9UQkxfSEFDTEwsCisJCQkJCQkJQVJSQVlfU0laRShoYWN0YmwwKSk7CisJZXh5bm9zNF9qcGVnX3NldF90YmwoYmFzZSwgaGFjdGJsMCwgRVhZTk9TNF9IVUZGX1RCTF9IQUNDTCwKKwkJCQkJCQlBUlJBWV9TSVpFKGhhY3RibDApKTsKKwlleHlub3M0X2pwZWdfc2V0X3RibChiYXNlLCBoYWN0YmxnMCwgRVhZTk9TNF9IVUZGX1RCTF9IQUNMViwKKwkJCQkJCQlBUlJBWV9TSVpFKGhhY3RibGcwKSk7CisJZXh5bm9zNF9qcGVnX3NldF90YmwoYmFzZSwgaGFjdGJsZzAsIEVYWU5PUzRfSFVGRl9UQkxfSEFDQ1YsCisJCQkJCQkJQVJSQVlfU0laRShoYWN0YmxnMCkpOwogfQogCiAvKgpAQCAtMjc2LDggKzYwNyw4IEBACiAKIHN0YXRpYyBpbnQgcXVldWVfaW5pdCh2b2lkICpwcml2LCBzdHJ1Y3QgdmIyX3F1ZXVlICpzcmNfdnEsCiAJCSAgICAgIHN0cnVjdCB2YjJfcXVldWUgKmRzdF92cSk7Ci1zdGF0aWMgc3RydWN0IHM1cF9qcGVnX2ZtdCAqczVwX2pwZWdfZmluZF9mb3JtYXQodW5zaWduZWQgaW50IG1vZGUsCi0JCQkJCQkgX191MzIgcGl4ZWxmb3JtYXQpOworc3RhdGljIHN0cnVjdCBzNXBfanBlZ19mbXQgKnM1cF9qcGVnX2ZpbmRfZm9ybWF0KHN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCwKKwkJCQlfX3UzMiBwaXhlbGZvcm1hdCwgdW5zaWduZWQgaW50IGZtdF90eXBlKTsKIHN0YXRpYyBpbnQgczVwX2pwZWdfY29udHJvbHNfY3JlYXRlKHN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCk7CiAKIHN0YXRpYyBpbnQgczVwX2pwZWdfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI4NSw3ICs2MTYsNyBAQAogCXN0cnVjdCBzNXBfanBlZyAqanBlZyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHg7Ci0Jc3RydWN0IHM1cF9qcGVnX2ZtdCAqb3V0X2ZtdDsKKwlzdHJ1Y3QgczVwX2pwZWdfZm10ICpvdXRfZm10LCAqY2FwX2ZtdDsKIAlpbnQgcmV0ID0gMDsKIAogCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKQEAgLTMwNiwyNCArNjM3LDMxIEBACiAJY3R4LT5qcGVnID0ganBlZzsKIAlpZiAodmZkID09IGpwZWctPnZmZF9lbmNvZGVyKSB7CiAJCWN0eC0+bW9kZSA9IFM1UF9KUEVHX0VOQ09ERTsKLQkJb3V0X2ZtdCA9IHM1cF9qcGVnX2ZpbmRfZm9ybWF0KGN0eC0+bW9kZSwgVjRMMl9QSVhfRk1UX1JHQjU2NSk7CisJCW91dF9mbXQgPSBzNXBfanBlZ19maW5kX2Zvcm1hdChjdHgsIFY0TDJfUElYX0ZNVF9SR0I1NjUsCisJCQkJCQkJRk1UX1RZUEVfT1VUUFVUKTsKKwkJY2FwX2ZtdCA9IHM1cF9qcGVnX2ZpbmRfZm9ybWF0KGN0eCwgVjRMMl9QSVhfRk1UX0pQRUcsCisJCQkJCQkJRk1UX1RZUEVfQ0FQVFVSRSk7CiAJfSBlbHNlIHsKIAkJY3R4LT5tb2RlID0gUzVQX0pQRUdfREVDT0RFOwotCQlvdXRfZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LT5tb2RlLCBWNEwyX1BJWF9GTVRfSlBFRyk7CisJCW91dF9mbXQgPSBzNXBfanBlZ19maW5kX2Zvcm1hdChjdHgsIFY0TDJfUElYX0ZNVF9KUEVHLAorCQkJCQkJCUZNVF9UWVBFX09VVFBVVCk7CisJCWNhcF9mbXQgPSBzNXBfanBlZ19maW5kX2Zvcm1hdChjdHgsIFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkJCQkJCUZNVF9UWVBFX0NBUFRVUkUpOwogCX0KIAorCWN0eC0+ZmgubTJtX2N0eCA9IHY0bDJfbTJtX2N0eF9pbml0KGpwZWctPm0ybV9kZXYsIGN0eCwgcXVldWVfaW5pdCk7CisJaWYgKElTX0VSUihjdHgtPmZoLm0ybV9jdHgpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5maC5tMm1fY3R4KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljdHgtPm91dF9xLmZtdCA9IG91dF9mbXQ7CisJY3R4LT5jYXBfcS5mbXQgPSBjYXBfZm10OworCiAJcmV0ID0gczVwX2pwZWdfY29udHJvbHNfY3JlYXRlKGN0eCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQljdHgtPm0ybV9jdHggPSB2NGwyX20ybV9jdHhfaW5pdChqcGVnLT5tMm1fZGV2LCBjdHgsIHF1ZXVlX2luaXQpOwotCWlmIChJU19FUlIoY3R4LT5tMm1fY3R4KSkgewotCQlyZXQgPSBQVFJfRVJSKGN0eC0+bTJtX2N0eCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JY3R4LT5vdXRfcS5mbXQgPSBvdXRfZm10OwotCWN0eC0+Y2FwX3EuZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LT5tb2RlLCBWNEwyX1BJWF9GTVRfWVVZVik7CiAJbXV0ZXhfdW5sb2NrKCZqcGVnLT5sb2NrKTsKIAlyZXR1cm4gMDsKIApAQCAtMzQyLDQ5ICs2ODAsMjMgQEAKIAlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAogCW11dGV4X2xvY2soJmpwZWctPmxvY2spOwotCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7Ci0JbXV0ZXhfdW5sb2NrKCZqcGVnLT5sb2NrKTsKKwl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPmZoLm0ybV9jdHgpOwogCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oYW5kbGVyKTsKIAl2NGwyX2ZoX2RlbCgmY3R4LT5maCk7CiAJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKIAlrZnJlZShjdHgpOworCW11dGV4X3VubG9jaygmanBlZy0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzNXBfanBlZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IHM1cF9qcGVnICpqcGVnID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQl1bnNpZ25lZCBpbnQgcmVzOwotCi0JbXV0ZXhfbG9jaygmanBlZy0+bG9jayk7Ci0JcmVzID0gdjRsMl9tMm1fcG9sbChmaWxlLCBjdHgtPm0ybV9jdHgsIHdhaXQpOwotCW11dGV4X3VubG9jaygmanBlZy0+bG9jayk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBzNXBfanBlZ19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgczVwX2pwZWcgKmpwZWcgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IGZoX3RvX2N0eChmaWxlLT5wcml2YXRlX2RhdGEpOwotCWludCByZXQ7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZqcGVnLT5sb2NrKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXQgPSB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKLQltdXRleF91bmxvY2soJmpwZWctPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgczVwX2pwZWdfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gczVwX2pwZWdfb3BlbiwKIAkucmVsZWFzZQk9IHM1cF9qcGVnX3JlbGVhc2UsCi0JLnBvbGwJCT0gczVwX2pwZWdfcG9sbCwKKwkucG9sbAkJPSB2NGwyX20ybV9mb3BfcG9sbCwKIAkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCi0JLm1tYXAJCT0gczVwX2pwZWdfbW1hcCwKKwkubW1hcAkJPSB2NGwyX20ybV9mb3BfbW1hcCwKIH07CiAKIC8qCkBAIC00MjcsMTAgKzczOSwxMSBAQAogfQogCiBzdGF0aWMgYm9vbCBzNXBfanBlZ19wYXJzZV9oZHIoc3RydWN0IHM1cF9qcGVnX3FfZGF0YSAqcmVzdWx0LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgICBzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHgpCiB7CiAJaW50IGMsIGNvbXBvbmVudHMsIG5vdGZvdW5kOwotCXVuc2lnbmVkIGludCBoZWlnaHQsIHdpZHRoLCB3b3JkOworCXVuc2lnbmVkIGludCBoZWlnaHQsIHdpZHRoLCB3b3JkLCBzdWJzYW1wbGluZyA9IDA7CiAJbG9uZyBsZW5ndGg7CiAJc3RydWN0IHM1cF9qcGVnX2J1ZmZlciBqcGVnX2J1ZmZlcjsKIApAQCAtNDY5LDcgKzc4MiwxNSBAQAogCQkJCWJyZWFrOwogCQkJbm90Zm91bmQgPSAwOwogCi0JCQlza2lwKCZqcGVnX2J1ZmZlciwgY29tcG9uZW50cyAqIDMpOworCQkJaWYgKGNvbXBvbmVudHMgPT0gMSkgeworCQkJCXN1YnNhbXBsaW5nID0gMHgzMzsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCgmanBlZ19idWZmZXIsIDEpOworCQkJCXN1YnNhbXBsaW5nID0gZ2V0X2J5dGUoJmpwZWdfYnVmZmVyKTsKKwkJCQlza2lwKCZqcGVnX2J1ZmZlciwgMSk7CisJCQl9CisKKwkJCXNraXAoJmpwZWdfYnVmZmVyLCBjb21wb25lbnRzICogMik7CiAJCQlicmVhazsKIAogCQkvKiBza2lwIHBheWxvYWQtbGVzcyBtYXJrZXJzICovCkBAIC00OTEsNiArODEyLDI0IEBACiAJcmVzdWx0LT53ID0gd2lkdGg7CiAJcmVzdWx0LT5oID0gaGVpZ2h0OwogCXJlc3VsdC0+c2l6ZSA9IGNvbXBvbmVudHM7CisKKwlzd2l0Y2ggKHN1YnNhbXBsaW5nKSB7CisJY2FzZSAweDExOgorCQljdHgtPnN1YnNhbXBsaW5nID0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180NDQ7CisJCWJyZWFrOworCWNhc2UgMHgyMToKKwkJY3R4LT5zdWJzYW1wbGluZyA9IFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyOworCQlicmVhazsKKwljYXNlIDB4MjI6CisJCWN0eC0+c3Vic2FtcGxpbmcgPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMDsKKwkJYnJlYWs7CisJY2FzZSAweDMzOgorCQljdHgtPnN1YnNhbXBsaW5nID0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJcmV0dXJuICFub3Rmb3VuZDsKIH0KIApAQCAtNTIxLDEzICs4NjAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbnVtX2ZtdChzdHJ1Y3QgczVwX2pwZWdfZm10ICpmb3JtYXRzLCBpbnQgbiwKK3N0YXRpYyBpbnQgZW51bV9mbXQoc3RydWN0IHM1cF9qcGVnX2ZtdCAqc2pwZWdfZm9ybWF0cywgaW50IG4sCiAJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmLCB1MzIgdHlwZSkKIHsKIAlpbnQgaSwgbnVtID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJaWYgKGZvcm1hdHNbaV0udHlwZXMgJiB0eXBlKSB7CisJCWlmIChzanBlZ19mb3JtYXRzW2ldLmZsYWdzICYgdHlwZSkgewogCQkJLyogaW5kZXgtdGggZm9ybWF0IG9mIHR5cGUgdHlwZSBmb3VuZCA/ICovCiAJCQlpZiAobnVtID09IGYtPmluZGV4KQogCQkJCWJyZWFrOwpAQCAtNTQxLDggKzg4MCw4IEBACiAJaWYgKGkgPj0gbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCBmb3JtYXRzW2ldLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOwotCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0c1tpXS5mb3VyY2M7CisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgc2pwZWdfZm9ybWF0c1tpXS5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwlmLT5waXhlbGZvcm1hdCA9IHNqcGVnX2Zvcm1hdHNbaV0uZm91cmNjOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTMsMTAgKzg5MiwxMSBAQAogCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKIAogCWlmIChjdHgtPm1vZGUgPT0gUzVQX0pQRUdfRU5DT0RFKQotCQlyZXR1cm4gZW51bV9mbXQoZm9ybWF0c19lbmMsIE5VTV9GT1JNQVRTX0VOQywgZiwKLQkJCQlNRU0yTUVNX0NBUFRVUkUpOworCQlyZXR1cm4gZW51bV9mbXQoc2pwZWdfZm9ybWF0cywgU0pQRUdfTlVNX0ZPUk1BVFMsIGYsCisJCQkJU0pQRUdfRk1UX0ZMQUdfRU5DX0NBUFRVUkUpOwogCi0JcmV0dXJuIGVudW1fZm10KGZvcm1hdHNfZGVjLCBOVU1fRk9STUFUU19ERUMsIGYsIE1FTTJNRU1fQ0FQVFVSRSk7CisJcmV0dXJuIGVudW1fZm10KHNqcGVnX2Zvcm1hdHMsIFNKUEVHX05VTV9GT1JNQVRTLCBmLAorCQkJCQlTSlBFR19GTVRfRkxBR19ERUNfQ0FQVFVSRSk7CiB9CiAKIHN0YXRpYyBpbnQgczVwX2pwZWdfZW51bV9mbXRfdmlkX291dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTU2NSwxMCArOTA1LDExIEBACiAJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwogCiAJaWYgKGN0eC0+bW9kZSA9PSBTNVBfSlBFR19FTkNPREUpCi0JCXJldHVybiBlbnVtX2ZtdChmb3JtYXRzX2VuYywgTlVNX0ZPUk1BVFNfRU5DLCBmLAotCQkJCU1FTTJNRU1fT1VUUFVUKTsKKwkJcmV0dXJuIGVudW1fZm10KHNqcGVnX2Zvcm1hdHMsIFNKUEVHX05VTV9GT1JNQVRTLCBmLAorCQkJCVNKUEVHX0ZNVF9GTEFHX0VOQ19PVVRQVVQpOwogCi0JcmV0dXJuIGVudW1fZm10KGZvcm1hdHNfZGVjLCBOVU1fRk9STUFUU19ERUMsIGYsIE1FTTJNRU1fT1VUUFVUKTsKKwlyZXR1cm4gZW51bV9mbXQoc2pwZWdfZm9ybWF0cywgU0pQRUdfTlVNX0ZPUk1BVFMsIGYsCisJCQkJCVNKUEVHX0ZNVF9GTEFHX0RFQ19PVVRQVVQpOwogfQogCiBzdGF0aWMgc3RydWN0IHM1cF9qcGVnX3FfZGF0YSAqZ2V0X3FfZGF0YShzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHgsCkBAIC01ODksNyArOTMwLDcgQEAKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKIAlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdCA9IGZoX3RvX2N0eChwcml2KTsKIAotCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0LT5tMm1fY3R4LCBmLT50eXBlKTsKKwl2cSA9IHY0bDJfbTJtX2dldF92cShjdC0+ZmgubTJtX2N0eCwgZi0+dHlwZSk7CiAJaWYgKCF2cSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTYxNSwyOSArOTU2LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgczVwX2pwZWdfZm10ICpzNXBfanBlZ19maW5kX2Zvcm1hdCh1bnNpZ25lZCBpbnQgbW9kZSwKLQkJCQkJCSB1MzIgcGl4ZWxmb3JtYXQpCitzdGF0aWMgc3RydWN0IHM1cF9qcGVnX2ZtdCAqczVwX2pwZWdfZmluZF9mb3JtYXQoc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4LAorCQkJCXUzMiBwaXhlbGZvcm1hdCwgdW5zaWduZWQgaW50IGZtdF90eXBlKQogewotCXVuc2lnbmVkIGludCBrOwotCXN0cnVjdCBzNXBfanBlZ19mbXQgKmZvcm1hdHM7Ci0JaW50IG47CisJdW5zaWduZWQgaW50IGssIGZtdF9mbGFnLCB2ZXJfZmxhZzsKIAotCWlmIChtb2RlID09IFM1UF9KUEVHX0VOQ09ERSkgewotCQlmb3JtYXRzID0gZm9ybWF0c19lbmM7Ci0JCW4gPSBOVU1fRk9STUFUU19FTkM7Ci0JfSBlbHNlIHsKLQkJZm9ybWF0cyA9IGZvcm1hdHNfZGVjOwotCQluID0gTlVNX0ZPUk1BVFNfREVDOwotCX0KKwlpZiAoY3R4LT5tb2RlID09IFM1UF9KUEVHX0VOQ09ERSkKKwkJZm10X2ZsYWcgPSAoZm10X3R5cGUgPT0gRk1UX1RZUEVfT1VUUFVUKSA/CisJCQkJU0pQRUdfRk1UX0ZMQUdfRU5DX09VVFBVVCA6CisJCQkJU0pQRUdfRk1UX0ZMQUdfRU5DX0NBUFRVUkU7CisJZWxzZQorCQlmbXRfZmxhZyA9IChmbXRfdHlwZSA9PSBGTVRfVFlQRV9PVVRQVVQpID8KKwkJCQlTSlBFR19GTVRfRkxBR19ERUNfT1VUUFVUIDoKKwkJCQlTSlBFR19GTVRfRkxBR19ERUNfQ0FQVFVSRTsKIAotCWZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKLQkJc3RydWN0IHM1cF9qcGVnX2ZtdCAqZm10ID0gJmZvcm1hdHNba107Ci0JCWlmIChmbXQtPmZvdXJjYyA9PSBwaXhlbGZvcm1hdCkKKwlpZiAoY3R4LT5qcGVnLT52YXJpYW50LT52ZXJzaW9uID09IFNKUEVHX1M1UCkKKwkJdmVyX2ZsYWcgPSBTSlBFR19GTVRfRkxBR19TNVA7CisJZWxzZQorCQl2ZXJfZmxhZyA9IFNKUEVHX0ZNVF9GTEFHX0VYWU5PUzQ7CisKKwlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShzanBlZ19mb3JtYXRzKTsgaysrKSB7CisJCXN0cnVjdCBzNXBfanBlZ19mbXQgKmZtdCA9ICZzanBlZ19mb3JtYXRzW2tdOworCQlpZiAoZm10LT5mb3VyY2MgPT0gcGl4ZWxmb3JtYXQgJiYKKwkJICAgIGZtdC0+ZmxhZ3MgJiBmbXRfZmxhZyAmJgorCQkgICAgZm10LT5mbGFncyAmIHZlcl9mbGFnKSB7CiAJCQlyZXR1cm4gZm10OworCQl9CiAJfQogCiAJcmV0dXJuIE5VTEw7Ci0KIH0KIAogc3RhdGljIHZvaWQganBlZ19ib3VuZF9hbGlnbl9pbWFnZSh1MzIgKncsIHVuc2lnbmVkIGludCB3bWluLCB1bnNpZ25lZCBpbnQgd21heCwKQEAgLTY3Myw3ICsxMDIwLDcgQEAKIAogCS8qIFY0TDIgc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGUgZHJpdmVyIGNvcnJlY3RzIHRoZSBmb3JtYXQgc3RydWN0CiAJICogaWYgYW55IG9mIHRoZSBkaW1lbnNpb25zIGlzIHVuc3VwcG9ydGVkICovCi0JaWYgKHFfdHlwZSA9PSBNRU0yTUVNX09VVFBVVCkKKwlpZiAocV90eXBlID09IEZNVF9UWVBFX09VVFBVVCkKIAkJanBlZ19ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgUzVQX0pQRUdfTUlOX1dJRFRILAogCQkJCSAgICAgICBTNVBfSlBFR19NQVhfV0lEVEgsIDAsCiAJCQkJICAgICAgICZwaXgtPmhlaWdodCwgUzVQX0pQRUdfTUlOX0hFSUdIVCwKQEAgLTY5NSw3ICsxMDQyLDcgQEAKIAkJCWJwbCA9IHBpeC0+d2lkdGg7IC8qIHBsYW5hciAqLwogCiAJCWlmIChmbXQtPmNvbHBsYW5lcyA9PSAxICYmIC8qIHBhY2tlZCAqLwotCQkgICAgKGJwbCA8PCAzKSAqIGZtdC0+ZGVwdGggPCBwaXgtPndpZHRoKQorCQkgICAgKGJwbCA8PCAzKSAvIGZtdC0+ZGVwdGggPCBwaXgtPndpZHRoKQogCQkJYnBsID0gKHBpeC0+d2lkdGggKiBmbXQtPmRlcHRoKSA+PiAzOwogCiAJCXBpeC0+Ynl0ZXNwZXJsaW5lID0gYnBsOwpAQCAtNzA5LDE3ICsxMDU2LDQxIEBACiAJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OwogCXN0cnVjdCBzNXBfanBlZ19mbXQgKmZtdDsKKwlpbnQgcmV0OwogCi0JZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LT5tb2RlLCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlpZiAoIWZtdCB8fCAhKGZtdC0+dHlwZXMgJiBNRU0yTUVNX0NBUFRVUkUpKSB7CisJZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0LAorCQkJCQkJRk1UX1RZUEVfQ0FQVFVSRSk7CisJaWYgKCFmbXQpIHsKIAkJdjRsMl9lcnIoJmN0eC0+anBlZy0+djRsMl9kZXYsCiAJCQkgIkZvdXJjYyBmb3JtYXQgKDB4JTA4eCkgaW52YWxpZC5cbiIsCiAJCQkgZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiB2aWRpb2NfdHJ5X2ZtdChmLCBmbXQsIGN0eCwgTUVNMk1FTV9DQVBUVVJFKTsKKwkvKgorCSAqIFRoZSBleHlub3M0eDEyIGRldmljZSByZXF1aXJlcyByZXN1bHRpbmcgWVVWIGltYWdlCisJICogc3Vic2FtcGxpbmcgbm90IHRvIGJlIGxvd2VyIHRoYW4gdGhlIGlucHV0IGpwZWcgc3Vic2FtcGxpbmcuCisJICogSWYgdGhpcyByZXF1aXJlbWVudCBpcyBub3QgbWV0IHRoZW4gZG93bmdyYWRlIHRoZSByZXF1ZXN0ZWQKKwkgKiBjYXB0dXJlIGZvcm1hdCB0byB0aGUgb25lIHdpdGggc3Vic2FtcGxpbmcgZXF1YWwgdG8gdGhlIGlucHV0IGpwZWcuCisJICovCisJaWYgKChjdHgtPmpwZWctPnZhcmlhbnQtPnZlcnNpb24gIT0gU0pQRUdfUzVQKSAmJgorCSAgICAoY3R4LT5tb2RlID09IFM1UF9KUEVHX0RFQ09ERSkgJiYKKwkgICAgKGZtdC0+ZmxhZ3MgJiBTSlBFR19GTVRfTk9OX1JHQikgJiYKKwkgICAgKGZtdC0+c3Vic2FtcGxpbmcgPCBjdHgtPnN1YnNhbXBsaW5nKSkgeworCQlyZXQgPSBzNXBfanBlZ19hZGp1c3RfZm91cmNjX3RvX3N1YnNhbXBsaW5nKGN0eC0+c3Vic2FtcGxpbmcsCisJCQkJCQkJICAgIGZtdC0+Zm91cmNjLAorCQkJCQkJCSAgICAmcGl4LT5waXhlbGZvcm1hdCwKKwkJCQkJCQkgICAgY3R4KTsKKwkJaWYgKHJldCA8IDApCisJCQlwaXgtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7CisKKwkJZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LCBwaXgtPnBpeGVsZm9ybWF0LAorCQkJCQkJCUZNVF9UWVBFX0NBUFRVUkUpOworCX0KKworCXJldHVybiB2aWRpb2NfdHJ5X2ZtdChmLCBmbXQsIGN0eCwgRk1UX1RZUEVfQ0FQVFVSRSk7CiB9CiAKIHN0YXRpYyBpbnQgczVwX2pwZWdfdHJ5X2ZtdF92aWRfb3V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LApAQCAtNzI4LDE1ICsxMDk5LDE2IEBACiAJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwogCXN0cnVjdCBzNXBfanBlZ19mbXQgKmZtdDsKIAotCWZtdCA9IHM1cF9qcGVnX2ZpbmRfZm9ybWF0KGN0eC0+bW9kZSwgZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JaWYgKCFmbXQgfHwgIShmbXQtPnR5cGVzICYgTUVNMk1FTV9PVVRQVVQpKSB7CisJZm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3R4LCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0LAorCQkJCQkJRk1UX1RZUEVfT1VUUFVUKTsKKwlpZiAoIWZtdCkgewogCQl2NGwyX2VycigmY3R4LT5qcGVnLT52NGwyX2RldiwKIAkJCSAiRm91cmNjIGZvcm1hdCAoMHglMDh4KSBpbnZhbGlkLlxuIiwKIAkJCSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHZpZGlvY190cnlfZm10KGYsIGZtdCwgY3R4LCBNRU0yTUVNX09VVFBVVCk7CisJcmV0dXJuIHZpZGlvY190cnlfZm10KGYsIGZtdCwgY3R4LCBGTVRfVFlQRV9PVVRQVVQpOwogfQogCiBzdGF0aWMgaW50IHM1cF9qcGVnX3NfZm10KHN0cnVjdCBzNXBfanBlZ19jdHggKmN0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCkBAIC03NDQsOCArMTExNiwxMCBAQAogCXN0cnVjdCB2YjJfcXVldWUgKnZxOwogCXN0cnVjdCBzNXBfanBlZ19xX2RhdGEgKnFfZGF0YSA9IE5VTEw7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJc3RydWN0IHY0bDJfY3RybCAqY3RybF9zdWJzOworCXVuc2lnbmVkIGludCBmX3R5cGU7CiAKLQl2cSA9IHY0bDJfbTJtX2dldF92cShjdC0+bTJtX2N0eCwgZi0+dHlwZSk7CisJdnEgPSB2NGwyX20ybV9nZXRfdnEoY3QtPmZoLm0ybV9jdHgsIGYtPnR5cGUpOwogCWlmICghdnEpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03NTcsNyArMTEzMSwxMCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXFfZGF0YS0+Zm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3QtPm1vZGUsIHBpeC0+cGl4ZWxmb3JtYXQpOworCWZfdHlwZSA9IFY0TDJfVFlQRV9JU19PVVRQVVQoZi0+dHlwZSkgPworCQkJRk1UX1RZUEVfT1VUUFVUIDogRk1UX1RZUEVfQ0FQVFVSRTsKKworCXFfZGF0YS0+Zm10ID0gczVwX2pwZWdfZmluZF9mb3JtYXQoY3QsIHBpeC0+cGl4ZWxmb3JtYXQsIGZfdHlwZSk7CiAJcV9kYXRhLT53ID0gcGl4LT53aWR0aDsKIAlxX2RhdGEtPmggPSBwaXgtPmhlaWdodDsKIAlpZiAocV9kYXRhLT5mbXQtPmZvdXJjYyAhPSBWNEwyX1BJWF9GTVRfSlBFRykKQEAgLTc2NSw2ICsxMTQyLDEzIEBACiAJZWxzZQogCQlxX2RhdGEtPnNpemUgPSBwaXgtPnNpemVpbWFnZTsKIAorCWlmIChmX3R5cGUgPT0gRk1UX1RZUEVfT1VUUFVUKSB7CisJCWN0cmxfc3VicyA9IHY0bDJfY3RybF9maW5kKCZjdC0+Y3RybF9oYW5kbGVyLAorCQkJCQlWNEwyX0NJRF9KUEVHX0NIUk9NQV9TVUJTQU1QTElORyk7CisJCWlmIChjdHJsX3N1YnMpCisJCQl2NGwyX2N0cmxfc19jdHJsKGN0cmxfc3VicywgcV9kYXRhLT5mbXQtPnN1YnNhbXBsaW5nKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzkyLDYwICsxMTc2LDE0IEBACiAJcmV0dXJuIHM1cF9qcGVnX3NfZm10KGZoX3RvX2N0eChwcml2KSwgZik7CiB9CiAKLXN0YXRpYyBpbnQgczVwX2pwZWdfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCi17Ci0Jc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwotCi0JcmV0dXJuIHY0bDJfbTJtX3JlcWJ1ZnMoZmlsZSwgY3R4LT5tMm1fY3R4LCByZXFidWZzKTsKLX0KLQotc3RhdGljIGludCBzNXBfanBlZ19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKLQotCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgczVwX2pwZWdfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwotCi0JcmV0dXJuIHY0bDJfbTJtX3FidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOwotfQotCi1zdGF0aWMgaW50IHM1cF9qcGVnX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7Ci0KLQlyZXR1cm4gdjRsMl9tMm1fZHFidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOwotfQotCi1zdGF0aWMgaW50IHM1cF9qcGVnX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwotCi0JcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9uKGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7Ci19Ci0KLXN0YXRpYyBpbnQgczVwX2pwZWdfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKLQotCXJldHVybiB2NGwyX20ybV9zdHJlYW1vZmYoZmlsZSwgY3R4LT5tMm1fY3R4LCB0eXBlKTsKLX0KLQogc3RhdGljIGludCBzNXBfanBlZ19nX3NlbGVjdGlvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSBzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24gKnMpCiB7CiAJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOwogCiAJaWYgKHMtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKLQkgICAgcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJICAgIHMtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICYmCisJICAgIGN0eC0+anBlZy0+dmFyaWFudC0+dmVyc2lvbiAhPSBTSlBFR19TNVApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogRm9yIEpQRUcgYmxvYiBhY3RpdmUgPT0gZGVmYXVsdCA9PSBib3VuZHMgKi8KQEAgLTg4NCwxMiArMTIyMiw3IEBACiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfSlBFR19DSFJPTUFfU1VCU0FNUExJTkc6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZqcGVnLT5zbG9jaywgZmxhZ3MpOwotCi0JCVdBUk5fT04oY3R4LT5zdWJzYW1wbGluZyA+IFM1UF9TVUJTQU1QTElOR19NT0RFX0dSQVkpOwotCQlpZiAoY3R4LT5zdWJzYW1wbGluZyA+IDIpCi0JCQljdHJsLT52YWwgPSBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HX0dSQVk7Ci0JCWVsc2UKLQkJCWN0cmwtPnZhbCA9IGN0eC0+c3Vic2FtcGxpbmc7CisJCWN0cmwtPnZhbCA9IHM1cF9qcGVnX3RvX3VzZXJfc3Vic2FtcGxpbmcoY3R4KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmanBlZy0+c2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CiAJfQpAQCAtODk3LDYgKzEyMzAsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzNXBfanBlZ190cnlfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IGN0cmxfdG9fY3R4KGN0cmwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5qcGVnLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HKSB7CisJCWlmIChjdHgtPmpwZWctPnZhcmlhbnQtPnZlcnNpb24gPT0gU0pQRUdfUzVQKQorCQkJZ290byBlcnJvcl9mcmVlOworCQkvKgorCQkgKiBUaGUgZXh5bm9zNHgxMiBkZXZpY2UgcmVxdWlyZXMgaW5wdXQgcmF3IGltYWdlIGZvdXJjYworCQkgKiB0byBiZSBWNEwyX1BJWF9GTVRfR1JFWSBpZiBncmF5IGpwZWcgZm9ybWF0CisJCSAqIGlzIHRvIGJlIHNldC4KKwkJICovCisJCWlmIChjdHgtPm91dF9xLmZtdC0+Zm91cmNjICE9IFY0TDJfUElYX0ZNVF9HUkVZICYmCisJCSAgICBjdHJsLT52YWwgPT0gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcl9mcmVlOworCQl9CisJCS8qCisJCSAqIFRoZSBleHlub3M0eDEyIGRldmljZSByZXF1aXJlcyByZXN1bHRpbmcganBlZyBzdWJzYW1wbGluZworCQkgKiBub3QgdG8gYmUgbG93ZXIgdGhhbiB0aGUgaW5wdXQgcmF3IGltYWdlIHN1YnNhbXBsaW5nLgorCQkgKi8KKwkJaWYgKGN0eC0+b3V0X3EuZm10LT5zdWJzYW1wbGluZyA+IGN0cmwtPnZhbCkKKwkJCWN0cmwtPnZhbCA9IGN0eC0+b3V0X3EuZm10LT5zdWJzYW1wbGluZzsKKwl9CisKK2Vycm9yX2ZyZWU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5qcGVnLT5zbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgczVwX2pwZWdfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7CiAJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gY3RybF90b19jdHgoY3RybCk7CkBAIC05MDYsNyArMTI3Myw3IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9KUEVHX0NPTVBSRVNTSU9OX1FVQUxJVFk6Ci0JCWN0eC0+Y29tcHJfcXVhbGl0eSA9IFM1UF9KUEVHX0NPTVBSX1FVQUxfV09SU1QgLSBjdHJsLT52YWw7CisJCWN0eC0+Y29tcHJfcXVhbGl0eSA9IGN0cmwtPnZhbDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9KUEVHX1JFU1RBUlRfSU5URVJWQUw6CiAJCWN0eC0+cmVzdGFydF9pbnRlcnZhbCA9IGN0cmwtPnZhbDsKQEAgLTkyMiw2ICsxMjg5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIHM1cF9qcGVnX2N0cmxfb3BzID0gewogCS5nX3ZvbGF0aWxlX2N0cmwJPSBzNXBfanBlZ19nX3ZvbGF0aWxlX2N0cmwsCisJLnRyeV9jdHJsCQk9IHM1cF9qcGVnX3RyeV9jdHJsLAogCS5zX2N0cmwJCQk9IHM1cF9qcGVnX3NfY3RybCwKIH07CiAKQEAgLTkyOSwxOCArMTI5NywyMCBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gfjB4Mjc7IC8qIDQ0NCwgNDIyLCA0MjAsIEdSQVkgKi8KIAlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsOworCWludCByZXQ7CiAKIAl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZjdHgtPmN0cmxfaGFuZGxlciwgMyk7CiAKIAlpZiAoY3R4LT5tb2RlID09IFM1UF9KUEVHX0VOQ09ERSkgewogCQl2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJsX2hhbmRsZXIsICZzNXBfanBlZ19jdHJsX29wcywKIAkJCQkgIFY0TDJfQ0lEX0pQRUdfQ09NUFJFU1NJT05fUVVBTElUWSwKLQkJCQkgIDAsIDMsIDEsIDMpOworCQkJCSAgMCwgMywgMSwgUzVQX0pQRUdfQ09NUFJfUVVBTF9XT1JTVCk7CiAKIAkJdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybF9oYW5kbGVyLCAmczVwX2pwZWdfY3RybF9vcHMsCiAJCQkJICBWNEwyX0NJRF9KUEVHX1JFU1RBUlRfSU5URVJWQUwsCiAJCQkJICAwLCAzLCAweGZmZmYsIDApOwotCQltYXNrID0gfjB4MDY7IC8qIDQyMiwgNDIwICovCisJCWlmIChjdHgtPmpwZWctPnZhcmlhbnQtPnZlcnNpb24gPT0gU0pQRUdfUzVQKQorCQkJbWFzayA9IH4weDA2OyAvKiA0MjIsIDQyMCAqLwogCX0KIAogCWN0cmwgPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KCZjdHgtPmN0cmxfaGFuZGxlciwgJnM1cF9qcGVnX2N0cmxfb3BzLApAQCAtOTQ4LDEzICsxMzE4LDI0IEBACiAJCQkJICAgICAgVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZLCBtYXNrLAogCQkJCSAgICAgIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyKTsKIAotCWlmIChjdHgtPmN0cmxfaGFuZGxlci5lcnJvcikKLQkJcmV0dXJuIGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yOworCWlmIChjdHgtPmN0cmxfaGFuZGxlci5lcnJvcikgeworCQlyZXQgPSBjdHgtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KIAogCWlmIChjdHgtPm1vZGUgPT0gUzVQX0pQRUdfREVDT0RFKQogCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSB8CiAJCQlWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7Ci0JcmV0dXJuIDA7CisKKwlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmY3R4LT5jdHJsX2hhbmRsZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9mcmVlOgorCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oYW5kbGVyKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHM1cF9qcGVnX2lvY3RsX29wcyA9IHsKQEAgLTk3MiwxNCArMTM1MywxMyBAQAogCS52aWRpb2Nfc19mbXRfdmlkX2NhcAkJPSBzNXBfanBlZ19zX2ZtdF92aWRfY2FwLAogCS52aWRpb2Nfc19mbXRfdmlkX291dAkJPSBzNXBfanBlZ19zX2ZtdF92aWRfb3V0LAogCi0JLnZpZGlvY19yZXFidWZzCQkJPSBzNXBfanBlZ19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYJCT0gczVwX2pwZWdfcXVlcnlidWYsCisJLnZpZGlvY19yZXFidWZzCQkJPSB2NGwyX20ybV9pb2N0bF9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJCT0gdjRsMl9tMm1faW9jdGxfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQkJPSB2NGwyX20ybV9pb2N0bF9xYnVmLAorCS52aWRpb2NfZHFidWYJCQk9IHY0bDJfbTJtX2lvY3RsX2RxYnVmLAogCi0JLnZpZGlvY19xYnVmCQkJPSBzNXBfanBlZ19xYnVmLAotCS52aWRpb2NfZHFidWYJCQk9IHM1cF9qcGVnX2RxYnVmLAotCi0JLnZpZGlvY19zdHJlYW1vbgkJPSBzNXBfanBlZ19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSBzNXBfanBlZ19zdHJlYW1vZmYsCisJLnZpZGlvY19zdHJlYW1vbgkJPSB2NGwyX20ybV9pb2N0bF9zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgkJPSB2NGwyX20ybV9pb2N0bF9zdHJlYW1vZmYsCiAKIAkudmlkaW9jX2dfc2VsZWN0aW9uCQk9IHM1cF9qcGVnX2dfc2VsZWN0aW9uLAogfTsKQEAgLTk5NSw3NCArMTM3NSwxODEgQEAKIAlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHggPSBwcml2OwogCXN0cnVjdCBzNXBfanBlZyAqanBlZyA9IGN0eC0+anBlZzsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX2J1ZiwgKmRzdF9idWY7Ci0JdW5zaWduZWQgbG9uZyBzcmNfYWRkciwgZHN0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBzcmNfYWRkciwgZHN0X2FkZHIsIGZsYWdzOwogCi0Jc3JjX2J1ZiA9IHY0bDJfbTJtX25leHRfc3JjX2J1ZihjdHgtPm0ybV9jdHgpOwotCWRzdF9idWYgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5tMm1fY3R4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5qcGVnLT5zbG9jaywgZmxhZ3MpOworCisJc3JjX2J1ZiA9IHY0bDJfbTJtX25leHRfc3JjX2J1ZihjdHgtPmZoLm0ybV9jdHgpOworCWRzdF9idWYgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5maC5tMm1fY3R4KTsKIAlzcmNfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHNyY19idWYsIDApOwogCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoZHN0X2J1ZiwgMCk7CiAKLQlqcGVnX3Jlc2V0KGpwZWctPnJlZ3MpOwotCWpwZWdfcG93ZXJvbihqcGVnLT5yZWdzKTsKLQlqcGVnX3Byb2NfbW9kZShqcGVnLT5yZWdzLCBjdHgtPm1vZGUpOworCXM1cF9qcGVnX3Jlc2V0KGpwZWctPnJlZ3MpOworCXM1cF9qcGVnX3Bvd2Vyb24oanBlZy0+cmVncyk7CisJczVwX2pwZWdfcHJvY19tb2RlKGpwZWctPnJlZ3MsIGN0eC0+bW9kZSk7CiAJaWYgKGN0eC0+bW9kZSA9PSBTNVBfSlBFR19FTkNPREUpIHsKIAkJaWYgKGN0eC0+b3V0X3EuZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1JHQjU2NSkKLQkJCWpwZWdfaW5wdXRfcmF3X21vZGUoanBlZy0+cmVncywgUzVQX0pQRUdfUkFXX0lOXzU2NSk7CisJCQlzNXBfanBlZ19pbnB1dF9yYXdfbW9kZShqcGVnLT5yZWdzLAorCQkJCQkJCVM1UF9KUEVHX1JBV19JTl81NjUpOwogCQllbHNlCi0JCQlqcGVnX2lucHV0X3Jhd19tb2RlKGpwZWctPnJlZ3MsIFM1UF9KUEVHX1JBV19JTl80MjIpOwotCQlqcGVnX3N1YnNhbXBsaW5nX21vZGUoanBlZy0+cmVncywgY3R4LT5zdWJzYW1wbGluZyk7Ci0JCWpwZWdfZHJpKGpwZWctPnJlZ3MsIGN0eC0+cmVzdGFydF9pbnRlcnZhbCk7Ci0JCWpwZWdfeChqcGVnLT5yZWdzLCBjdHgtPm91dF9xLncpOwotCQlqcGVnX3koanBlZy0+cmVncywgY3R4LT5vdXRfcS5oKTsKLQkJanBlZ19pbWdhZHIoanBlZy0+cmVncywgc3JjX2FkZHIpOwotCQlqcGVnX2pwZ2FkcihqcGVnLT5yZWdzLCBkc3RfYWRkcik7CisJCQlzNXBfanBlZ19pbnB1dF9yYXdfbW9kZShqcGVnLT5yZWdzLAorCQkJCQkJCVM1UF9KUEVHX1JBV19JTl80MjIpOworCQlzNXBfanBlZ19zdWJzYW1wbGluZ19tb2RlKGpwZWctPnJlZ3MsIGN0eC0+c3Vic2FtcGxpbmcpOworCQlzNXBfanBlZ19kcmkoanBlZy0+cmVncywgY3R4LT5yZXN0YXJ0X2ludGVydmFsKTsKKwkJczVwX2pwZWdfeChqcGVnLT5yZWdzLCBjdHgtPm91dF9xLncpOworCQlzNXBfanBlZ195KGpwZWctPnJlZ3MsIGN0eC0+b3V0X3EuaCk7CisJCXM1cF9qcGVnX2ltZ2FkcihqcGVnLT5yZWdzLCBzcmNfYWRkcik7CisJCXM1cF9qcGVnX2pwZ2FkcihqcGVnLT5yZWdzLCBkc3RfYWRkcik7CiAKIAkJLyogdWx0aW1hdGVseSBjb21lcyBmcm9tIHNpemVpbWFnZSBmcm9tIHVzZXJzcGFjZSAqLwotCQlqcGVnX2VuY19zdHJlYW1faW50KGpwZWctPnJlZ3MsIGN0eC0+Y2FwX3Euc2l6ZSk7CisJCXM1cF9qcGVnX2VuY19zdHJlYW1faW50KGpwZWctPnJlZ3MsIGN0eC0+Y2FwX3Euc2l6ZSk7CiAKIAkJLyogSlBFRyBSR0IgdG8gWUNiQ3IgY29udmVyc2lvbiBtYXRyaXggKi8KLQkJanBlZ19jb2VmKGpwZWctPnJlZ3MsIDEsIDEsIFM1UF9KUEVHX0NPRUYxMSk7Ci0JCWpwZWdfY29lZihqcGVnLT5yZWdzLCAxLCAyLCBTNVBfSlBFR19DT0VGMTIpOwotCQlqcGVnX2NvZWYoanBlZy0+cmVncywgMSwgMywgUzVQX0pQRUdfQ09FRjEzKTsKLQkJanBlZ19jb2VmKGpwZWctPnJlZ3MsIDIsIDEsIFM1UF9KUEVHX0NPRUYyMSk7Ci0JCWpwZWdfY29lZihqcGVnLT5yZWdzLCAyLCAyLCBTNVBfSlBFR19DT0VGMjIpOwotCQlqcGVnX2NvZWYoanBlZy0+cmVncywgMiwgMywgUzVQX0pQRUdfQ09FRjIzKTsKLQkJanBlZ19jb2VmKGpwZWctPnJlZ3MsIDMsIDEsIFM1UF9KUEVHX0NPRUYzMSk7Ci0JCWpwZWdfY29lZihqcGVnLT5yZWdzLCAzLCAyLCBTNVBfSlBFR19DT0VGMzIpOwotCQlqcGVnX2NvZWYoanBlZy0+cmVncywgMywgMywgUzVQX0pQRUdfQ09FRjMzKTsKKwkJczVwX2pwZWdfY29lZihqcGVnLT5yZWdzLCAxLCAxLCBTNVBfSlBFR19DT0VGMTEpOworCQlzNXBfanBlZ19jb2VmKGpwZWctPnJlZ3MsIDEsIDIsIFM1UF9KUEVHX0NPRUYxMik7CisJCXM1cF9qcGVnX2NvZWYoanBlZy0+cmVncywgMSwgMywgUzVQX0pQRUdfQ09FRjEzKTsKKwkJczVwX2pwZWdfY29lZihqcGVnLT5yZWdzLCAyLCAxLCBTNVBfSlBFR19DT0VGMjEpOworCQlzNXBfanBlZ19jb2VmKGpwZWctPnJlZ3MsIDIsIDIsIFM1UF9KUEVHX0NPRUYyMik7CisJCXM1cF9qcGVnX2NvZWYoanBlZy0+cmVncywgMiwgMywgUzVQX0pQRUdfQ09FRjIzKTsKKwkJczVwX2pwZWdfY29lZihqcGVnLT5yZWdzLCAzLCAxLCBTNVBfSlBFR19DT0VGMzEpOworCQlzNXBfanBlZ19jb2VmKGpwZWctPnJlZ3MsIDMsIDIsIFM1UF9KUEVHX0NPRUYzMik7CisJCXM1cF9qcGVnX2NvZWYoanBlZy0+cmVncywgMywgMywgUzVQX0pQRUdfQ09FRjMzKTsKIAogCQkvKgogCQkgKiBKUEVHIElQIGFsbG93cyBzdG9yaW5nIDQgcXVhbnRpemF0aW9uIHRhYmxlcwogCQkgKiBXZSBmaWxsIHRhYmxlIDAgZm9yIGx1bWEgYW5kIHRhYmxlIDEgZm9yIGNocm9tYQogCQkgKi8KLQkJanBlZ19zZXRfcXRibF9sdW0oanBlZy0+cmVncywgY3R4LT5jb21wcl9xdWFsaXR5KTsKLQkJanBlZ19zZXRfcXRibF9jaHIoanBlZy0+cmVncywgY3R4LT5jb21wcl9xdWFsaXR5KTsKKwkJczVwX2pwZWdfc2V0X3F0YmxfbHVtKGpwZWctPnJlZ3MsIGN0eC0+Y29tcHJfcXVhbGl0eSk7CisJCXM1cF9qcGVnX3NldF9xdGJsX2NocihqcGVnLT5yZWdzLCBjdHgtPmNvbXByX3F1YWxpdHkpOwogCQkvKiB1c2UgdGFibGUgMCBmb3IgWSAqLwotCQlqcGVnX3F0YmwoanBlZy0+cmVncywgMSwgMCk7CisJCXM1cF9qcGVnX3F0YmwoanBlZy0+cmVncywgMSwgMCk7CiAJCS8qIHVzZSB0YWJsZSAxIGZvciBDYiBhbmQgQ3IqLwotCQlqcGVnX3F0YmwoanBlZy0+cmVncywgMiwgMSk7Ci0JCWpwZWdfcXRibChqcGVnLT5yZWdzLCAzLCAxKTsKKwkJczVwX2pwZWdfcXRibChqcGVnLT5yZWdzLCAyLCAxKTsKKwkJczVwX2pwZWdfcXRibChqcGVnLT5yZWdzLCAzLCAxKTsKIAogCQkvKiBZLCBDYiwgQ3IgdXNlIEh1ZmZtYW4gdGFibGUgMCAqLwotCQlqcGVnX2h0YmxfYWMoanBlZy0+cmVncywgMSk7Ci0JCWpwZWdfaHRibF9kYyhqcGVnLT5yZWdzLCAxKTsKLQkJanBlZ19odGJsX2FjKGpwZWctPnJlZ3MsIDIpOwotCQlqcGVnX2h0YmxfZGMoanBlZy0+cmVncywgMik7Ci0JCWpwZWdfaHRibF9hYyhqcGVnLT5yZWdzLCAzKTsKLQkJanBlZ19odGJsX2RjKGpwZWctPnJlZ3MsIDMpOworCQlzNXBfanBlZ19odGJsX2FjKGpwZWctPnJlZ3MsIDEpOworCQlzNXBfanBlZ19odGJsX2RjKGpwZWctPnJlZ3MsIDEpOworCQlzNXBfanBlZ19odGJsX2FjKGpwZWctPnJlZ3MsIDIpOworCQlzNXBfanBlZ19odGJsX2RjKGpwZWctPnJlZ3MsIDIpOworCQlzNXBfanBlZ19odGJsX2FjKGpwZWctPnJlZ3MsIDMpOworCQlzNXBfanBlZ19odGJsX2RjKGpwZWctPnJlZ3MsIDMpOwogCX0gZWxzZSB7IC8qIFM1UF9KUEVHX0RFQ09ERSAqLwotCQlqcGVnX3JzdF9pbnRfZW5hYmxlKGpwZWctPnJlZ3MsIHRydWUpOwotCQlqcGVnX2RhdGFfbnVtX2ludF9lbmFibGUoanBlZy0+cmVncywgdHJ1ZSk7Ci0JCWpwZWdfZmluYWxfbWN1X251bV9pbnRfZW5hYmxlKGpwZWctPnJlZ3MsIHRydWUpOworCQlzNXBfanBlZ19yc3RfaW50X2VuYWJsZShqcGVnLT5yZWdzLCB0cnVlKTsKKwkJczVwX2pwZWdfZGF0YV9udW1faW50X2VuYWJsZShqcGVnLT5yZWdzLCB0cnVlKTsKKwkJczVwX2pwZWdfZmluYWxfbWN1X251bV9pbnRfZW5hYmxlKGpwZWctPnJlZ3MsIHRydWUpOwogCQlpZiAoY3R4LT5jYXBfcS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWVVZVikKLQkJCWpwZWdfb3V0Zm9ybV9yYXcoanBlZy0+cmVncywgUzVQX0pQRUdfUkFXX09VVF80MjIpOworCQkJczVwX2pwZWdfb3V0Zm9ybV9yYXcoanBlZy0+cmVncywgUzVQX0pQRUdfUkFXX09VVF80MjIpOwogCQllbHNlCi0JCQlqcGVnX291dGZvcm1fcmF3KGpwZWctPnJlZ3MsIFM1UF9KUEVHX1JBV19PVVRfNDIwKTsKLQkJanBlZ19qcGdhZHIoanBlZy0+cmVncywgc3JjX2FkZHIpOwotCQlqcGVnX2ltZ2FkcihqcGVnLT5yZWdzLCBkc3RfYWRkcik7CisJCQlzNXBfanBlZ19vdXRmb3JtX3JhdyhqcGVnLT5yZWdzLCBTNVBfSlBFR19SQVdfT1VUXzQyMCk7CisJCXM1cF9qcGVnX2pwZ2FkcihqcGVnLT5yZWdzLCBzcmNfYWRkcik7CisJCXM1cF9qcGVnX2ltZ2FkcihqcGVnLT5yZWdzLCBkc3RfYWRkcik7CiAJfQogCi0JanBlZ19zdGFydChqcGVnLT5yZWdzKTsKKwlzNXBfanBlZ19zdGFydChqcGVnLT5yZWdzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+anBlZy0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9qcGVnX3NldF9pbWdfYWRkcihzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9qcGVnICpqcGVnID0gY3R4LT5qcGVnOworCXN0cnVjdCBzNXBfanBlZ19mbXQgKmZtdDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7CisJc3RydWN0IHM1cF9qcGVnX2FkZHIganBlZ19hZGRyOworCXUzMiBwaXhfc2l6ZSwgcGFkZGluZ19ieXRlcyA9IDA7CisKKwlwaXhfc2l6ZSA9IGN0eC0+Y2FwX3EudyAqIGN0eC0+Y2FwX3EuaDsKKworCWlmIChjdHgtPm1vZGUgPT0gUzVQX0pQRUdfRU5DT0RFKSB7CisJCXZiID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+ZmgubTJtX2N0eCk7CisJCWZtdCA9IGN0eC0+b3V0X3EuZm10OworCQlpZiAoY3R4LT5vdXRfcS53ICUgMiAmJiBmbXQtPmhfYWxpZ24gPiAwKQorCQkJcGFkZGluZ19ieXRlcyA9IGN0eC0+b3V0X3EuaDsKKwl9IGVsc2UgeworCQlmbXQgPSBjdHgtPmNhcF9xLmZtdDsKKwkJdmIgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYoY3R4LT5maC5tMm1fY3R4KTsKKwl9CisKKwlqcGVnX2FkZHIueSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKKworCWlmIChmbXQtPmNvbHBsYW5lcyA9PSAyKSB7CisJCWpwZWdfYWRkci5jYiA9IGpwZWdfYWRkci55ICsgcGl4X3NpemUgLSBwYWRkaW5nX2J5dGVzOworCX0gZWxzZSBpZiAoZm10LT5jb2xwbGFuZXMgPT0gMykgeworCQlqcGVnX2FkZHIuY2IgPSBqcGVnX2FkZHIueSArIHBpeF9zaXplOworCQlpZiAoZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKKwkJCWpwZWdfYWRkci5jciA9IGpwZWdfYWRkci5jYiArIHBpeF9zaXplIC8gNDsKKwkJZWxzZQorCQkJanBlZ19hZGRyLmNyID0ganBlZ19hZGRyLmNiICsgcGl4X3NpemUgLyAyOworCX0KKworCWV4eW5vczRfanBlZ19zZXRfZnJhbWVfYnVmX2FkZHJlc3MoanBlZy0+cmVncywgJmpwZWdfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfanBlZ19zZXRfanBlZ19hZGRyKHN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX2pwZWcgKmpwZWcgPSBjdHgtPmpwZWc7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCXVuc2lnbmVkIGludCBqcGVnX2FkZHIgPSAwOworCisJaWYgKGN0eC0+bW9kZSA9PSBTNVBfSlBFR19FTkNPREUpCisJCXZiID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+ZmgubTJtX2N0eCk7CisJZWxzZQorCQl2YiA9IHY0bDJfbTJtX25leHRfc3JjX2J1ZihjdHgtPmZoLm0ybV9jdHgpOworCisJanBlZ19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOworCWV4eW5vczRfanBlZ19zZXRfc3RyZWFtX2J1Zl9hZGRyZXNzKGpwZWctPnJlZ3MsIGpwZWdfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfanBlZ19kZXZpY2VfcnVuKHZvaWQgKnByaXYpCit7CisJc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgczVwX2pwZWcgKmpwZWcgPSBjdHgtPmpwZWc7CisJdW5zaWduZWQgaW50IGJpdHN0cmVhbV9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5qcGVnLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKGN0eC0+bW9kZSA9PSBTNVBfSlBFR19FTkNPREUpIHsKKwkJZXh5bm9zNF9qcGVnX3N3X3Jlc2V0KGpwZWctPnJlZ3MpOworCQlleHlub3M0X2pwZWdfc2V0X2ludGVycnVwdChqcGVnLT5yZWdzKTsKKwkJZXh5bm9zNF9qcGVnX3NldF9odWZfdGFibGVfZW5hYmxlKGpwZWctPnJlZ3MsIDEpOworCisJCWV4eW5vczRfanBlZ19zZXRfaHVmZl90YmwoanBlZy0+cmVncyk7CisKKwkJLyoKKwkJICogSlBFRyBJUCBhbGxvd3Mgc3RvcmluZyA0IHF1YW50aXphdGlvbiB0YWJsZXMKKwkJICogV2UgZmlsbCB0YWJsZSAwIGZvciBsdW1hIGFuZCB0YWJsZSAxIGZvciBjaHJvbWEKKwkJICovCisJCWV4eW5vczRfanBlZ19zZXRfcXRibF9sdW0oanBlZy0+cmVncywgY3R4LT5jb21wcl9xdWFsaXR5KTsKKwkJZXh5bm9zNF9qcGVnX3NldF9xdGJsX2NocihqcGVnLT5yZWdzLCBjdHgtPmNvbXByX3F1YWxpdHkpOworCisJCWV4eW5vczRfanBlZ19zZXRfZW5jb2RlX3RibF9zZWxlY3QoanBlZy0+cmVncywKKwkJCQkJCQljdHgtPmNvbXByX3F1YWxpdHkpOworCQlleHlub3M0X2pwZWdfc2V0X3N0cmVhbV9zaXplKGpwZWctPnJlZ3MsIGN0eC0+Y2FwX3EudywKKwkJCQkJCQljdHgtPmNhcF9xLmgpOworCisJCWV4eW5vczRfanBlZ19zZXRfZW5jX291dF9mbXQoanBlZy0+cmVncywgY3R4LT5zdWJzYW1wbGluZyk7CisJCWV4eW5vczRfanBlZ19zZXRfaW1nX2ZtdChqcGVnLT5yZWdzLCBjdHgtPm91dF9xLmZtdC0+Zm91cmNjKTsKKwkJZXh5bm9zNF9qcGVnX3NldF9pbWdfYWRkcihjdHgpOworCQlleHlub3M0X2pwZWdfc2V0X2pwZWdfYWRkcihjdHgpOworCQlleHlub3M0X2pwZWdfc2V0X2VuY29kZV9ob2ZmX2NudChqcGVnLT5yZWdzLAorCQkJCQkJCWN0eC0+b3V0X3EuZm10LT5mb3VyY2MpOworCX0gZWxzZSB7CisJCWV4eW5vczRfanBlZ19zd19yZXNldChqcGVnLT5yZWdzKTsKKwkJZXh5bm9zNF9qcGVnX3NldF9pbnRlcnJ1cHQoanBlZy0+cmVncyk7CisJCWV4eW5vczRfanBlZ19zZXRfaW1nX2FkZHIoY3R4KTsKKwkJZXh5bm9zNF9qcGVnX3NldF9qcGVnX2FkZHIoY3R4KTsKKwkJZXh5bm9zNF9qcGVnX3NldF9pbWdfZm10KGpwZWctPnJlZ3MsIGN0eC0+Y2FwX3EuZm10LT5mb3VyY2MpOworCisJCWJpdHN0cmVhbV9zaXplID0gRElWX1JPVU5EX1VQKGN0eC0+b3V0X3Euc2l6ZSwgMzIpOworCisJCWV4eW5vczRfanBlZ19zZXRfZGVjX2JpdHN0cmVhbV9zaXplKGpwZWctPnJlZ3MsIGJpdHN0cmVhbV9zaXplKTsKKwl9CisKKwlleHlub3M0X2pwZWdfc2V0X2VuY19kZWNfbW9kZShqcGVnLT5yZWdzLCBjdHgtPm1vZGUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5qcGVnLT5zbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IHM1cF9qcGVnX2pvYl9yZWFkeSh2b2lkICpwcml2KQpAQCAtMTA4Miw2ICsxNTY5LDEyIEBACiAJLmRldmljZV9ydW4JPSBzNXBfanBlZ19kZXZpY2VfcnVuLAogCS5qb2JfcmVhZHkJPSBzNXBfanBlZ19qb2JfcmVhZHksCiAJLmpvYl9hYm9ydAk9IHM1cF9qcGVnX2pvYl9hYm9ydCwKK30KKzsKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tMm1fb3BzIGV4eW5vc19qcGVnX20ybV9vcHMgPSB7CisJLmRldmljZV9ydW4JPSBleHlub3M0X2pwZWdfZGV2aWNlX3J1biwKKwkuam9iX3JlYWR5CT0gczVwX2pwZWdfam9iX3JlYWR5LAorCS5qb2JfYWJvcnQJPSBzNXBfanBlZ19qb2JfYWJvcnQsCiB9OwogCiAvKgpAQCAtMTE0OSw3ICsxNjQyLDcgQEAKIAkJY3R4LT5oZHJfcGFyc2VkID0gczVwX2pwZWdfcGFyc2VfaGRyKCZ0bXAsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpdmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSwKIAkJICAgICBtaW4oKHVuc2lnbmVkIGxvbmcpY3R4LT5vdXRfcS5zaXplLAotCQkJIHZiMl9nZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCkpKTsKKwkJCSB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKSwgY3R4KTsKIAkJaWYgKCFjdHgtPmhkcl9wYXJzZWQpIHsKIAkJCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CiAJCQlyZXR1cm47CkBAIC0xMTYyLDMwICsxNjU1LDkgQEAKIAkJcV9kYXRhID0gJmN0eC0+Y2FwX3E7CiAJCXFfZGF0YS0+dyA9IHRtcC53OwogCQlxX2RhdGEtPmggPSB0bXAuaDsKLQotCQlqcGVnX2JvdW5kX2FsaWduX2ltYWdlKCZxX2RhdGEtPncsIFM1UF9KUEVHX01JTl9XSURUSCwKLQkJCQkgICAgICAgUzVQX0pQRUdfTUFYX1dJRFRILCBxX2RhdGEtPmZtdC0+aF9hbGlnbiwKLQkJCQkgICAgICAgJnFfZGF0YS0+aCwgUzVQX0pQRUdfTUlOX0hFSUdIVCwKLQkJCQkgICAgICAgUzVQX0pQRUdfTUFYX0hFSUdIVCwgcV9kYXRhLT5mbXQtPnZfYWxpZ24KLQkJCQkgICAgICApOwotCQlxX2RhdGEtPnNpemUgPSBxX2RhdGEtPncgKiBxX2RhdGEtPmggKiBxX2RhdGEtPmZtdC0+ZGVwdGggPj4gMzsKIAl9Ci0JaWYgKGN0eC0+bTJtX2N0eCkKLQkJdjRsMl9tMm1fYnVmX3F1ZXVlKGN0eC0+bTJtX2N0eCwgdmIpOwotfQogCi1zdGF0aWMgdm9pZCBzNXBfanBlZ193YWl0X3ByZXBhcmUoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCi17Ci0Jc3RydWN0IHM1cF9qcGVnX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7Ci0KLQltdXRleF91bmxvY2soJmN0eC0+anBlZy0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHM1cF9qcGVnX3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnZxKQotewotCXN0cnVjdCBzNXBfanBlZ19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwotCi0JbXV0ZXhfbG9jaygmY3R4LT5qcGVnLT5sb2NrKTsKKwl2NGwyX20ybV9idWZfcXVldWUoY3R4LT5maC5tMm1fY3R4LCB2Yik7CiB9CiAKIHN0YXRpYyBpbnQgczVwX2pwZWdfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKQEAgLTEyMTEsOCArMTY4Myw4IEBACiAJLnF1ZXVlX3NldHVwCQk9IHM1cF9qcGVnX3F1ZXVlX3NldHVwLAogCS5idWZfcHJlcGFyZQkJPSBzNXBfanBlZ19idWZfcHJlcGFyZSwKIAkuYnVmX3F1ZXVlCQk9IHM1cF9qcGVnX2J1Zl9xdWV1ZSwKLQkud2FpdF9wcmVwYXJlCQk9IHM1cF9qcGVnX3dhaXRfcHJlcGFyZSwKLQkud2FpdF9maW5pc2gJCT0gczVwX2pwZWdfd2FpdF9maW5pc2gsCisJLndhaXRfcHJlcGFyZQkJPSB2YjJfb3BzX3dhaXRfcHJlcGFyZSwKKwkud2FpdF9maW5pc2gJCT0gdmIyX29wc193YWl0X2ZpbmlzaCwKIAkuc3RhcnRfc3RyZWFtaW5nCT0gczVwX2pwZWdfc3RhcnRfc3RyZWFtaW5nLAogCS5zdG9wX3N0cmVhbWluZwkJPSBzNXBfanBlZ19zdG9wX3N0cmVhbWluZywKIH07CkBAIC0xMjMwLDYgKzE3MDIsNyBAQAogCXNyY192cS0+b3BzID0gJnM1cF9qcGVnX3FvcHM7CiAJc3JjX3ZxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKIAlzcmNfdnEtPnRpbWVzdGFtcF90eXBlID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfQ09QWTsKKwlzcmNfdnEtPmxvY2sgPSAmY3R4LT5qcGVnLT5sb2NrOwogCiAJcmV0ID0gdmIyX3F1ZXVlX2luaXQoc3JjX3ZxKTsKIAlpZiAocmV0KQpAQCAtMTI0Miw2ICsxNzE1LDcgQEAKIAlkc3RfdnEtPm9wcyA9ICZzNXBfanBlZ19xb3BzOwogCWRzdF92cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CiAJZHN0X3ZxLT50aW1lc3RhbXBfdHlwZSA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7CisJZHN0X3ZxLT5sb2NrID0gJmN0eC0+anBlZy0+bG9jazsKIAogCXJldHVybiB2YjJfcXVldWVfaW5pdChkc3RfdnEpOwogfQpAQCAtMTI2NywyNiArMTc0MSwyNyBAQAogCiAJY3Vycl9jdHggPSB2NGwyX20ybV9nZXRfY3Vycl9wcml2KGpwZWctPm0ybV9kZXYpOwogCi0Jc3JjX2J1ZiA9IHY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN1cnJfY3R4LT5tMm1fY3R4KTsKLQlkc3RfYnVmID0gdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUoY3Vycl9jdHgtPm0ybV9jdHgpOworCXNyY19idWYgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdXJyX2N0eC0+ZmgubTJtX2N0eCk7CisJZHN0X2J1ZiA9IHY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKGN1cnJfY3R4LT5maC5tMm1fY3R4KTsKIAogCWlmIChjdXJyX2N0eC0+bW9kZSA9PSBTNVBfSlBFR19FTkNPREUpCi0JCWVuY19qcGVnX3Rvb19sYXJnZSA9IGpwZWdfZW5jX3N0cmVhbV9zdGF0KGpwZWctPnJlZ3MpOwotCXRpbWVyX2VsYXBzZWQgPSBqcGVnX3RpbWVyX3N0YXQoanBlZy0+cmVncyk7Ci0Jb3BfY29tcGxldGVkID0ganBlZ19yZXN1bHRfc3RhdF9vayhqcGVnLT5yZWdzKTsKKwkJZW5jX2pwZWdfdG9vX2xhcmdlID0gczVwX2pwZWdfZW5jX3N0cmVhbV9zdGF0KGpwZWctPnJlZ3MpOworCXRpbWVyX2VsYXBzZWQgPSBzNXBfanBlZ190aW1lcl9zdGF0KGpwZWctPnJlZ3MpOworCW9wX2NvbXBsZXRlZCA9IHM1cF9qcGVnX3Jlc3VsdF9zdGF0X29rKGpwZWctPnJlZ3MpOwogCWlmIChjdXJyX2N0eC0+bW9kZSA9PSBTNVBfSlBFR19ERUNPREUpCi0JCW9wX2NvbXBsZXRlZCA9IG9wX2NvbXBsZXRlZCAmJiBqcGVnX3N0cmVhbV9zdGF0X29rKGpwZWctPnJlZ3MpOworCQlvcF9jb21wbGV0ZWQgPSBvcF9jb21wbGV0ZWQgJiYKKwkJCQkJczVwX2pwZWdfc3RyZWFtX3N0YXRfb2soanBlZy0+cmVncyk7CiAKIAlpZiAoZW5jX2pwZWdfdG9vX2xhcmdlKSB7CiAJCXN0YXRlID0gVkIyX0JVRl9TVEFURV9FUlJPUjsKLQkJanBlZ19jbGVhcl9lbmNfc3RyZWFtX3N0YXQoanBlZy0+cmVncyk7CisJCXM1cF9qcGVnX2NsZWFyX2VuY19zdHJlYW1fc3RhdChqcGVnLT5yZWdzKTsKIAl9IGVsc2UgaWYgKHRpbWVyX2VsYXBzZWQpIHsKIAkJc3RhdGUgPSBWQjJfQlVGX1NUQVRFX0VSUk9SOwotCQlqcGVnX2NsZWFyX3RpbWVyX3N0YXQoanBlZy0+cmVncyk7CisJCXM1cF9qcGVnX2NsZWFyX3RpbWVyX3N0YXQoanBlZy0+cmVncyk7CiAJfSBlbHNlIGlmICghb3BfY29tcGxldGVkKSB7CiAJCXN0YXRlID0gVkIyX0JVRl9TVEFURV9FUlJPUjsKIAl9IGVsc2UgewotCQlwYXlsb2FkX3NpemUgPSBqcGVnX2NvbXByZXNzZWRfc2l6ZShqcGVnLT5yZWdzKTsKKwkJcGF5bG9hZF9zaXplID0gczVwX2pwZWdfY29tcHJlc3NlZF9zaXplKGpwZWctPnJlZ3MpOwogCX0KIAogCWRzdF9idWYtPnY0bDJfYnVmLnRpbWVjb2RlID0gc3JjX2J1Zi0+djRsMl9idWYudGltZWNvZGU7CkBAIC0xMjk2LDE2ICsxNzcxLDc5IEBACiAJaWYgKGN1cnJfY3R4LT5tb2RlID09IFM1UF9KUEVHX0VOQ09ERSkKIAkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKGRzdF9idWYsIDAsIHBheWxvYWRfc2l6ZSk7CiAJdjRsMl9tMm1fYnVmX2RvbmUoZHN0X2J1Ziwgc3RhdGUpOwotCXY0bDJfbTJtX2pvYl9maW5pc2goanBlZy0+bTJtX2RldiwgY3Vycl9jdHgtPm0ybV9jdHgpOworCXY0bDJfbTJtX2pvYl9maW5pc2goanBlZy0+bTJtX2RldiwgY3Vycl9jdHgtPmZoLm0ybV9jdHgpOwogCi0JY3Vycl9jdHgtPnN1YnNhbXBsaW5nID0ganBlZ19nZXRfc3Vic2FtcGxpbmdfbW9kZShqcGVnLT5yZWdzKTsKKwljdXJyX2N0eC0+c3Vic2FtcGxpbmcgPSBzNXBfanBlZ19nZXRfc3Vic2FtcGxpbmdfbW9kZShqcGVnLT5yZWdzKTsKIAlzcGluX3VubG9jaygmanBlZy0+c2xvY2spOwogCi0JanBlZ19jbGVhcl9pbnQoanBlZy0+cmVncyk7CisJczVwX2pwZWdfY2xlYXJfaW50KGpwZWctPnJlZ3MpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgZXh5bm9zNF9qcGVnX2lycShpbnQgaXJxLCB2b2lkICpwcml2KQoreworCXVuc2lnbmVkIGludCBpbnRfc3RhdHVzOworCXN0cnVjdCB2YjJfYnVmZmVyICpzcmNfdmIsICpkc3RfdmI7CisJc3RydWN0IHM1cF9qcGVnICpqcGVnID0gcHJpdjsKKwlzdHJ1Y3QgczVwX2pwZWdfY3R4ICpjdXJyX2N0eDsKKwl1bnNpZ25lZCBsb25nIHBheWxvYWRfc2l6ZSA9IDA7CisKKwlzcGluX2xvY2soJmpwZWctPnNsb2NrKTsKKworCWN1cnJfY3R4ID0gdjRsMl9tMm1fZ2V0X2N1cnJfcHJpdihqcGVnLT5tMm1fZGV2KTsKKworCXNyY192YiA9IHY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN1cnJfY3R4LT5maC5tMm1fY3R4KTsKKwlkc3RfdmIgPSB2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdXJyX2N0eC0+ZmgubTJtX2N0eCk7CisKKwlpbnRfc3RhdHVzID0gZXh5bm9zNF9qcGVnX2dldF9pbnRfc3RhdHVzKGpwZWctPnJlZ3MpOworCisJaWYgKGludF9zdGF0dXMpIHsKKwkJc3dpdGNoIChpbnRfc3RhdHVzICYgMHgxZikgeworCQljYXNlIDB4MToKKwkJCWpwZWctPmlycV9yZXQgPSBFUlJfUFJPVDsKKwkJCWJyZWFrOworCQljYXNlIDB4MjoKKwkJCWpwZWctPmlycV9yZXQgPSBPS19FTkNfT1JfREVDOworCQkJYnJlYWs7CisJCWNhc2UgMHg0OgorCQkJanBlZy0+aXJxX3JldCA9IEVSUl9ERUNfSU5WQUxJRF9GT1JNQVQ7CisJCQlicmVhazsKKwkJY2FzZSAweDg6CisJCQlqcGVnLT5pcnFfcmV0ID0gRVJSX01VTFRJX1NDQU47CisJCQlicmVhazsKKwkJY2FzZSAweDEwOgorCQkJanBlZy0+aXJxX3JldCA9IEVSUl9GUkFNRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJanBlZy0+aXJxX3JldCA9IEVSUl9VTktOT1dOOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlqcGVnLT5pcnFfcmV0ID0gRVJSX1VOS05PV047CisJfQorCisJaWYgKGpwZWctPmlycV9yZXQgPT0gT0tfRU5DX09SX0RFQykgeworCQlpZiAoY3Vycl9jdHgtPm1vZGUgPT0gUzVQX0pQRUdfRU5DT0RFKSB7CisJCQlwYXlsb2FkX3NpemUgPSBleHlub3M0X2pwZWdfZ2V0X3N0cmVhbV9zaXplKGpwZWctPnJlZ3MpOworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKGRzdF92YiwgMCwgcGF5bG9hZF9zaXplKTsKKwkJfQorCQl2NGwyX20ybV9idWZfZG9uZShzcmNfdmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCXY0bDJfbTJtX2J1Zl9kb25lKGRzdF92YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9IGVsc2UgeworCQl2NGwyX20ybV9idWZfZG9uZShzcmNfdmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCQl2NGwyX20ybV9idWZfZG9uZShkc3RfdmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCX0KKworCXY0bDJfbTJtX2pvYl9maW5pc2goanBlZy0+bTJtX2RldiwgY3Vycl9jdHgtPmZoLm0ybV9jdHgpOworCWN1cnJfY3R4LT5zdWJzYW1wbGluZyA9IGV4eW5vczRfanBlZ19nZXRfZnJhbWVfZm10KGpwZWctPnJlZ3MpOworCisJc3Bpbl91bmxvY2soJmpwZWctPnNsb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkICpqcGVnX2dldF9kcnZfZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwogLyoKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIERyaXZlciBiYXNpYyBpbmZyYXN0cnVjdHVyZQpAQCAtMTMxNiwxMyArMTg1NCwxOSBAQAogewogCXN0cnVjdCBzNXBfanBlZyAqanBlZzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgdjRsMl9tMm1fb3BzICpzYW1zdW5nX2pwZWdfbTJtX29wczsKIAlpbnQgcmV0OwogCisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBKUEVHIElQIGFic3RyYWN0aW9uIHN0cnVjdCAqLwogCWpwZWcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzNXBfanBlZyksIEdGUF9LRVJORUwpOwogCWlmICghanBlZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlqcGVnLT52YXJpYW50ID0ganBlZ19nZXRfZHJ2X2RhdGEocGRldik7CisKIAltdXRleF9pbml0KCZqcGVnLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmanBlZy0+c2xvY2spOwogCWpwZWctPmRldiA9ICZwZGV2LT5kZXY7CkBAIC0xMzQxLDggKzE4ODUsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwganBlZy0+aXJxLCBzNXBfanBlZ19pcnEsIDAsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwganBlZyk7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBqcGVnLT5pcnEsIGpwZWctPnZhcmlhbnQtPmpwZWdfaXJxLAorCQkJCTAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBqcGVnKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjbGFpbSBJUlEgJWRcbiIsIGpwZWctPmlycSk7CiAJCXJldHVybiByZXQ7CkBAIC0xMzU2LDcgKzE5MDAsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJjbG9jayBzb3VyY2UgJXBcbiIsIGpwZWctPmNsayk7Ci0JY2xrX3ByZXBhcmVfZW5hYmxlKGpwZWctPmNsayk7CiAKIAkvKiB2NGwyIGRldmljZSAqLwogCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZqcGVnLT52NGwyX2Rldik7CkBAIC0xMzY1LDggKzE5MDgsMTMgQEAKIAkJZ290byBjbGtfZ2V0X3JvbGxiYWNrOwogCX0KIAorCWlmIChqcGVnLT52YXJpYW50LT52ZXJzaW9uID09IFNKUEVHX1M1UCkKKwkJc2Ftc3VuZ19qcGVnX20ybV9vcHMgPSAmczVwX2pwZWdfbTJtX29wczsKKwllbHNlCisJCXNhbXN1bmdfanBlZ19tMm1fb3BzID0gJmV4eW5vc19qcGVnX20ybV9vcHM7CisKIAkvKiBtZW0ybWVtIGRldmljZSAqLwotCWpwZWctPm0ybV9kZXYgPSB2NGwyX20ybV9pbml0KCZzNXBfanBlZ19tMm1fb3BzKTsKKwlqcGVnLT5tMm1fZGV2ID0gdjRsMl9tMm1faW5pdChzYW1zdW5nX2pwZWdfbTJtX29wcyk7CiAJaWYgKElTX0VSUihqcGVnLT5tMm1fZGV2KSkgewogCQl2NGwyX2VycigmanBlZy0+djRsMl9kZXYsICJGYWlsZWQgdG8gaW5pdCBtZW0ybWVtIGRldmljZVxuIik7CiAJCXJldCA9IFBUUl9FUlIoanBlZy0+bTJtX2Rldik7CkBAIC0xMzg3LDggKzE5MzUsOCBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHZiMl9hbGxvY2F0b3Jfcm9sbGJhY2s7CiAJfQotCXN0cmxjcHkoanBlZy0+dmZkX2VuY29kZXItPm5hbWUsIFM1UF9KUEVHX00yTV9OQU1FLAotCQlzaXplb2YoanBlZy0+dmZkX2VuY29kZXItPm5hbWUpKTsKKwlzbnByaW50ZihqcGVnLT52ZmRfZW5jb2Rlci0+bmFtZSwgc2l6ZW9mKGpwZWctPnZmZF9lbmNvZGVyLT5uYW1lKSwKKwkJCQkiJXMtZW5jIiwgUzVQX0pQRUdfTTJNX05BTUUpOwogCWpwZWctPnZmZF9lbmNvZGVyLT5mb3BzCQk9ICZzNXBfanBlZ19mb3BzOwogCWpwZWctPnZmZF9lbmNvZGVyLT5pb2N0bF9vcHMJPSAmczVwX2pwZWdfaW9jdGxfb3BzOwogCWpwZWctPnZmZF9lbmNvZGVyLT5taW5vcgk9IC0xOwpAQCAtMTQxNSw4ICsxOTYzLDggQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlbmNfdmRldl9yZWdpc3Rlcl9yb2xsYmFjazsKIAl9Ci0Jc3RybGNweShqcGVnLT52ZmRfZGVjb2Rlci0+bmFtZSwgUzVQX0pQRUdfTTJNX05BTUUsCi0JCXNpemVvZihqcGVnLT52ZmRfZGVjb2Rlci0+bmFtZSkpOworCXNucHJpbnRmKGpwZWctPnZmZF9kZWNvZGVyLT5uYW1lLCBzaXplb2YoanBlZy0+dmZkX2RlY29kZXItPm5hbWUpLAorCQkJCSIlcy1kZWMiLCBTNVBfSlBFR19NMk1fTkFNRSk7CiAJanBlZy0+dmZkX2RlY29kZXItPmZvcHMJCT0gJnM1cF9qcGVnX2ZvcHM7CiAJanBlZy0+dmZkX2RlY29kZXItPmlvY3RsX29wcwk9ICZzNXBfanBlZ19pb2N0bF9vcHM7CiAJanBlZy0+dmZkX2RlY29kZXItPm1pbm9yCT0gLTE7CkBAIC0xNDY0LDcgKzIwMTIsNiBAQAogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmpwZWctPnY0bDJfZGV2KTsKIAogY2xrX2dldF9yb2xsYmFjazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoanBlZy0+Y2xrKTsKIAljbGtfcHV0KGpwZWctPmNsayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTQ4NCw3ICsyMDMxLDkgQEAKIAl2NGwyX20ybV9yZWxlYXNlKGpwZWctPm0ybV9kZXYpOwogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmpwZWctPnY0bDJfZGV2KTsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShqcGVnLT5jbGspOworCWlmICghcG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKCZwZGV2LT5kZXYpKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoanBlZy0+Y2xrKTsKKwogCWNsa19wdXQoanBlZy0+Y2xrKTsKIAogCXJldHVybiAwOwpAQCAtMTQ5Miw0MSArMjA0MSwxMTkgQEAKIAogc3RhdGljIGludCBzNXBfanBlZ19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBzNXBfanBlZyAqanBlZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGpwZWctPmNsayk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzNXBfanBlZ19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHM1cF9qcGVnICpqcGVnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGpwZWctPmNsayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmanBlZy0+c2xvY2ssIGZsYWdzKTsKKwogCS8qCiAJICogSlBFRyBJUCBhbGxvd3Mgc3RvcmluZyB0d28gSHVmZm1hbiB0YWJsZXMgZm9yIGVhY2ggY29tcG9uZW50Ci0JICogV2UgZmlsbCB0YWJsZSAwIGZvciBlYWNoIGNvbXBvbmVudAorCSAqIFdlIGZpbGwgdGFibGUgMCBmb3IgZWFjaCBjb21wb25lbnQgYW5kIGRvIHRoaXMgaGVyZSBvbmx5CisJICogZm9yIFM1UEMyMTAgZGV2aWNlIGFzIEV4eW5vczR4MTIgcmVxdWlyZXMgcHJvZ3JhbW1pbmcgaXRzCisJICogSHVmZm1hbiB0YWJsZXMgZWFjaCB0aW1lIHRoZSBlbmNvZGluZyBwcm9jZXNzIGlzIGluaXRpYWxpemVkLgogCSAqLwotCWpwZWdfc2V0X2hkY3RibChqcGVnLT5yZWdzKTsKLQlqcGVnX3NldF9oZGN0YmxnKGpwZWctPnJlZ3MpOwotCWpwZWdfc2V0X2hhY3RibChqcGVnLT5yZWdzKTsKLQlqcGVnX3NldF9oYWN0YmxnKGpwZWctPnJlZ3MpOworCWlmIChqcGVnLT52YXJpYW50LT52ZXJzaW9uID09IFNKUEVHX1M1UCkgeworCQlzNXBfanBlZ19zZXRfaGRjdGJsKGpwZWctPnJlZ3MpOworCQlzNXBfanBlZ19zZXRfaGRjdGJsZyhqcGVnLT5yZWdzKTsKKwkJczVwX2pwZWdfc2V0X2hhY3RibChqcGVnLT5yZWdzKTsKKwkJczVwX2pwZWdfc2V0X2hhY3RibGcoanBlZy0+cmVncyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmanBlZy0+c2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHM1cF9qcGVnX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzNXBfanBlZ19ydW50aW1lX3N1c3BlbmQoZGV2KTsKK30KKworc3RhdGljIGludCBzNXBfanBlZ19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzNXBfanBlZ19ydW50aW1lX3Jlc3VtZShkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczVwX2pwZWdfcG1fb3BzID0gewotCS5ydW50aW1lX3N1c3BlbmQgPSBzNXBfanBlZ19ydW50aW1lX3N1c3BlbmQsCi0JLnJ1bnRpbWVfcmVzdW1lCSA9IHM1cF9qcGVnX3J1bnRpbWVfcmVzdW1lLAorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHM1cF9qcGVnX3N1c3BlbmQsIHM1cF9qcGVnX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoczVwX2pwZWdfcnVudGltZV9zdXNwZW5kLCBzNXBfanBlZ19ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBzdHJ1Y3QgczVwX2pwZWdfdmFyaWFudCBzNXBfanBlZ19kcnZkYXRhID0geworCS52ZXJzaW9uCT0gU0pQRUdfUzVQLAorCS5qcGVnX2lycQk9IHM1cF9qcGVnX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX2pwZWdfdmFyaWFudCBleHlub3M0X2pwZWdfZHJ2ZGF0YSA9IHsKKwkudmVyc2lvbgk9IFNKUEVHX0VYWU5PUzQsCisJLmpwZWdfaXJxCT0gZXh5bm9zNF9qcGVnX2lycSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfanBlZ19tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNXB2MjEwLWpwZWciLAorCQkuZGF0YSA9ICZzNXBfanBlZ19kcnZkYXRhLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLWpwZWciLAorCQkuZGF0YSA9ICZzNXBfanBlZ19kcnZkYXRhLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEyLWpwZWciLAorCQkuZGF0YSA9ICZleHlub3M0X2pwZWdfZHJ2ZGF0YSwKKwl9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2Ftc3VuZ19qcGVnX21hdGNoKTsKKworc3RhdGljIHZvaWQgKmpwZWdfZ2V0X2Rydl9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHM1cF9qcGVnX3ZhcmlhbnQgKmRyaXZlcl9kYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShvZl9tYXRjaF9wdHIoc2Ftc3VuZ19qcGVnX21hdGNoKSwKKwkJCQkJIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAobWF0Y2gpCisJCWRyaXZlcl9kYXRhID0gKHN0cnVjdCBzNXBfanBlZ192YXJpYW50ICopbWF0Y2gtPmRhdGE7CisKKwlyZXR1cm4gZHJpdmVyX2RhdGE7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwX2pwZWdfZHJpdmVyID0gewogCS5wcm9iZSA9IHM1cF9qcGVnX3Byb2JlLAogCS5yZW1vdmUgPSBzNXBfanBlZ19yZW1vdmUsCiAJLmRyaXZlciA9IHsKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5uYW1lID0gUzVQX0pQRUdfTTJNX05BTUUsCi0JCS5wbSA9ICZzNXBfanBlZ19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihzYW1zdW5nX2pwZWdfbWF0Y2gpLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCQk9IFM1UF9KUEVHX00yTV9OQU1FLAorCQkucG0JCT0gJnM1cF9qcGVnX3BtX29wcywKIAl9LAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzNXBfanBlZ19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWoucEBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkphY2VrIEFuYXN6ZXdza2kgPGouYW5hc3pld3NraUBzYW1zdW5nLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBKUEVHIGNvZGVjIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWNvcmUuaAppbmRleCA4YTQwMTNlLi5mNDgyZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctY29yZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1jb3JlLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpZm5kZWYgSlBFR19DT1JFX0hfCiAjZGVmaW5lIEpQRUdfQ09SRV9IXwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWZoLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgpAQCAtNDMsOCArNDQsNDUgQEAKICNkZWZpbmUgREhQCQkJCTB4ZGUKIAogLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSBhIGZvcm1hdCBjYW4gYmUgdXNlZCBmb3IgY2FwdHVyZS9vdXRwdXQgKi8KLSNkZWZpbmUgTUVNMk1FTV9DQVBUVVJFCQkJKDEgPDwgMCkKLSNkZWZpbmUgTUVNMk1FTV9PVVRQVVQJCQkoMSA8PCAxKQorI2RlZmluZSBTSlBFR19GTVRfRkxBR19FTkNfQ0FQVFVSRQkoMSA8PCAwKQorI2RlZmluZSBTSlBFR19GTVRfRkxBR19FTkNfT1VUUFVUCSgxIDw8IDEpCisjZGVmaW5lIFNKUEVHX0ZNVF9GTEFHX0RFQ19DQVBUVVJFCSgxIDw8IDIpCisjZGVmaW5lIFNKUEVHX0ZNVF9GTEFHX0RFQ19PVVRQVVQJKDEgPDwgMykKKyNkZWZpbmUgU0pQRUdfRk1UX0ZMQUdfUzVQCQkoMSA8PCA0KQorI2RlZmluZSBTSlBFR19GTVRfRkxBR19FWFlOT1M0CQkoMSA8PCA1KQorI2RlZmluZSBTSlBFR19GTVRfUkdCCQkJKDEgPDwgNikKKyNkZWZpbmUgU0pQRUdfRk1UX05PTl9SR0IJCSgxIDw8IDcpCisKKyNkZWZpbmUgUzVQX0pQRUdfRU5DT0RFCQkwCisjZGVmaW5lIFM1UF9KUEVHX0RFQ09ERQkJMQorCisjZGVmaW5lIEZNVF9UWVBFX09VVFBVVAkJMAorI2RlZmluZSBGTVRfVFlQRV9DQVBUVVJFCTEKKworI2RlZmluZSBTSlBFR19TVUJTQU1QTElOR180NDQJMHgxMQorI2RlZmluZSBTSlBFR19TVUJTQU1QTElOR180MjIJMHgyMQorI2RlZmluZSBTSlBFR19TVUJTQU1QTElOR180MjAJMHgyMgorCisvKiBWZXJzaW9uIG51bWJlcnMgKi8KKworI2RlZmluZSBTSlBFR19TNVAJMQorI2RlZmluZSBTSlBFR19FWFlOT1M0CTIKKworZW51bSBleHlub3M0X2pwZWdfcmVzdWx0IHsKKwlPS19FTkNfT1JfREVDLAorCUVSUl9QUk9ULAorCUVSUl9ERUNfSU5WQUxJRF9GT1JNQVQsCisJRVJSX01VTFRJX1NDQU4sCisJRVJSX0ZSQU1FLAorCUVSUl9VTktOT1dOLAorfTsKKworZW51bSAgZXh5bm9zNF9qcGVnX2ltZ19xdWFsaXR5X2xldmVsIHsKKwlRVUFMSVRZX0xFVkVMXzEgPSAwLAkvKiBoaWdoICovCisJUVVBTElUWV9MRVZFTF8yLAorCVFVQUxJVFlfTEVWRUxfMywKKwlRVUFMSVRZX0xFVkVMXzQsCS8qIGxvdyAqLworfTsKIAogLyoqCiAgKiBzdHJ1Y3QgczVwX2pwZWcgLSBKUEVHIElQIGFic3RyYWN0aW9uCkBAIC03MSw5ICsxMDksMTYgQEAKIAogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJdW5zaWduZWQgaW50CQlpcnE7CisJZW51bSBleHlub3M0X2pwZWdfcmVzdWx0IGlycV9yZXQ7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXZvaWQJCQkqYWxsb2NfY3R4OworCXN0cnVjdCBzNXBfanBlZ192YXJpYW50ICp2YXJpYW50OworfTsKKworc3RydWN0IHM1cF9qcGVnX3ZhcmlhbnQgeworCXVuc2lnbmVkIGludAl2ZXJzaW9uOworCWlycXJldHVybl90CSgqanBlZ19pcnEpKGludCBpcnEsIHZvaWQgKnByaXYpOwogfTsKIAogLyoqCkBAIC04NCwxNiArMTI5LDE4IEBACiAgKiBAY29scGxhbmVzOgludW1iZXIgb2YgY29sb3IgcGxhbmVzICgxIGZvciBwYWNrZWQgZm9ybWF0cykKICAqIEBoX2FsaWduOglob3Jpem9udGFsIGFsaWdubWVudCBvcmRlciAoYWxpZ24gdG8gMl5oX2FsaWduKQogICogQHZfYWxpZ246CXZlcnRpY2FsIGFsaWdubWVudCBvcmRlciAoYWxpZ24gdG8gMl52X2FsaWduKQotICogQHR5cGVzOgl0eXBlcyBvZiBxdWV1ZSB0aGlzIGZvcm1hdCBpcyBhcHBsaWNhYmxlIHRvCisgKiBAZmxhZ3M6CWZsYWdzIGRlc2NyaWJpbmcgZm9ybWF0IGFwcGxpY2FiaWxpdHkKICAqLwogc3RydWN0IHM1cF9qcGVnX2ZtdCB7CiAJY2hhcgkqbmFtZTsKIAl1MzIJZm91cmNjOwogCWludAlkZXB0aDsKIAlpbnQJY29scGxhbmVzOworCWludAltZW1wbGFuZXM7CiAJaW50CWhfYWxpZ247CiAJaW50CXZfYWxpZ247Ci0JdTMyCXR5cGVzOworCWludAlzdWJzYW1wbGluZzsKKwl1MzIJZmxhZ3M7CiB9OwogCiAvKioKQEAgLTExNSw3ICsxNjIsNiBAQAogICogQGpwZWc6CQlKUEVHIElQIGRldmljZSBmb3IgdGhpcyBjb250ZXh0CiAgKiBAbW9kZToJCWNvbXByZXNzaW9uIChlbmNvZGUpIG9wZXJhdGlvbiBvciBkZWNvbXByZXNzaW9uIChkZWNvZGUpCiAgKiBAY29tcHJfcXVhbGl0eToJZGVzdGluYXRpb24gaW1hZ2UgcXVhbGl0eSBpbiBjb21wcmVzc2lvbiAoZW5jb2RlKSBtb2RlCi0gKiBAbTJtX2N0eDoJCW1lbTJtZW0gZGV2aWNlIGNvbnRleHQKICAqIEBvdXRfcToJCXNvdXJjZSAob3V0cHV0KSBxdWV1ZSBpbmZvcm1hdGlvbgogICogQGNhcF9mbXQ6CQlkZXN0aW5hdGlvbiAoY2FwdHVyZSkgcXVldWUgcXVldWUgaW5mb3JtYXRpb24KICAqIEBoZHJfcGFyc2VkOgkJc2V0IGlmIGhlYWRlciBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29tcHJlc3Npb24KQEAgLTEyNyw3ICsxNzMsNiBAQAogCXVuc2lnbmVkIHNob3J0CQljb21wcl9xdWFsaXR5OwogCXVuc2lnbmVkIHNob3J0CQlyZXN0YXJ0X2ludGVydmFsOwogCXVuc2lnbmVkIHNob3J0CQlzdWJzYW1wbGluZzsKLQlzdHJ1Y3QgdjRsMl9tMm1fY3R4CSptMm1fY3R4OwogCXN0cnVjdCBzNXBfanBlZ19xX2RhdGEJb3V0X3E7CiAJc3RydWN0IHM1cF9qcGVnX3FfZGF0YQljYXBfcTsKIAlzdHJ1Y3QgdjRsMl9maAkJZmg7CkBAIC0xNDcsNCArMTkyLDE2IEBACiAJdW5zaWduZWQgbG9uZyBkYXRhOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgczVwX2pwZWdfYWRkciAtIEpQRUcgY29udmVydGVyIHBoeXNpY2FsIGFkZHJlc3Mgc2V0IGZvciBETUEKKyAqIEB5OiAgIGx1bWluYW5jZSBwbGFuZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBAY2I6ICBDYiBwbGFuZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBAY3I6ICBDciBwbGFuZSBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK3N0cnVjdCBzNXBfanBlZ19hZGRyIHsKKwl1MzIgICAgIHk7CisJdTMyICAgICBjYjsKKwl1MzIgICAgIGNyOworfTsKKwogI2VuZGlmIC8qIEpQRUdfQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctaHctZXh5bm9zNC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThkNmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczQuYwpAQCAtMCwwICsxLDI3OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBBdXRob3I6IEphY2VrIEFuYXN6ZXdza2kgPGouYW5hc3pld3NraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBSZWdpc3RlciBpbnRlcmZhY2UgZmlsZSBmb3IgSlBFRyBkcml2ZXIgb24gRXh5bm9zNHgxMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAianBlZy1jb3JlLmgiCisjaW5jbHVkZSAianBlZy1ody1leHlub3M0LmgiCisjaW5jbHVkZSAianBlZy1yZWdzLmgiCisKK3ZvaWQgZXh5bm9zNF9qcGVnX3N3X3Jlc2V0KHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gcmVhZGwoYmFzZSArIEVYWU5PUzRfSlBFR19DTlRMX1JFRyk7CisJd3JpdGVsKHJlZyAmIH5FWFlOT1M0X1NPRlRfUkVTRVRfSEksIGJhc2UgKyBFWFlOT1M0X0pQRUdfQ05UTF9SRUcpOworCisJbmRlbGF5KDEwMDAwMCk7CisKKwl3cml0ZWwocmVnIHwgRVhZTk9TNF9TT0ZUX1JFU0VUX0hJLCBiYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY19kZWNfbW9kZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZWFkbChiYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKKwkvKiBzZXQgZXh5bm9zNF9qcGVnIG1vZCByZWdpc3RlciAqLworCWlmIChtb2RlID09IFM1UF9KUEVHX0RFQ09ERSkgeworCQl3cml0ZWwoKHJlZyAmIEVYWU5PUzRfRU5DX0RFQ19NT0RFX01BU0spIHwKKwkJCQkJRVhZTk9TNF9ERUNfTU9ERSwKKwkJCWJhc2UgKyBFWFlOT1M0X0pQRUdfQ05UTF9SRUcpOworCX0gZWxzZSB7LyogZW5jb2RlICovCisJCXdyaXRlbCgocmVnICYgRVhZTk9TNF9FTkNfREVDX01PREVfTUFTSykgfAorCQkJCQlFWFlOT1M0X0VOQ19NT0RFLAorCQkJYmFzZSArIEVYWU5PUzRfSlBFR19DTlRMX1JFRyk7CisJfQorfQorCit2b2lkIGV4eW5vczRfanBlZ19zZXRfaW1nX2ZtdCh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBpbWdfZm10KQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZWFkbChiYXNlICsgRVhZTk9TNF9JTUdfRk1UX1JFRykgJgorCQkJRVhZTk9TNF9FTkNfSU5fRk1UX01BU0s7IC8qIGNsZWFyIGV4Y2VwdCBlbmMgZm9ybWF0ICovCisKKwlzd2l0Y2ggKGltZ19mbXQpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9HUkVZOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19HUkFZX0lNRyB8IEVYWU5PUzRfR1JBWV9JTUdfSVA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19SR0JfSU1HIHwKKwkJCQlFWFlOT1M0X1JHQl9JUF9SR0JfMzJCSVRfSU1HOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCXJlZyA9IHJlZyB8IEVYWU5PUzRfRU5DX1JHQl9JTUcgfAorCQkJCUVYWU5PUzRfUkdCX0lQX1JHQl8xNkJJVF9JTUc7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX05WMjQ6CisJCXJlZyA9IHJlZyB8IEVYWU5PUzRfRU5DX1lVVl80NDRfSU1HIHwKKwkJCQlFWFlOT1M0X1lVVl80NDRfSVBfWVVWXzQ0NF8yUF9JTUcgfAorCQkJCUVYWU5PUzRfU1dBUF9DSFJPTUFfQ0JDUjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfTlY0MjoKKwkJcmVnID0gcmVnIHwgRVhZTk9TNF9FTkNfWVVWXzQ0NF9JTUcgfAorCQkJCUVYWU5PUzRfWVVWXzQ0NF9JUF9ZVVZfNDQ0XzJQX0lNRyB8CisJCQkJRVhZTk9TNF9TV0FQX0NIUk9NQV9DUkNCOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0RFQ19ZVVZfNDIyX0lNRyB8CisJCQkJRVhZTk9TNF9ZVVZfNDIyX0lQX1lVVl80MjJfMVBfSU1HIHwKKwkJCQlFWFlOT1M0X1NXQVBfQ0hST01BX0NCQ1I7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX1BJWF9GTVRfWVZZVToKKwkJcmVnID0gcmVnIHwgRVhZTk9TNF9ERUNfWVVWXzQyMl9JTUcgfAorCQkJCUVYWU5PUzRfWVVWXzQyMl9JUF9ZVVZfNDIyXzFQX0lNRyB8CisJCQkJRVhZTk9TNF9TV0FQX0NIUk9NQV9DUkNCOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0RFQ19ZVVZfNDIyX0lNRyB8CisJCQkJRVhZTk9TNF9ZVVZfNDIyX0lQX1lVVl80MjJfMlBfSU1HIHwKKwkJCQlFWFlOT1M0X1NXQVBfQ0hST01BX0NCQ1I7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisJCXJlZyA9IHJlZyB8IEVYWU5PUzRfREVDX1lVVl80MjJfSU1HIHwKKwkJCQlFWFlOT1M0X1lVVl80MjJfSVBfWVVWXzQyMl8yUF9JTUcgfAorCQkJCUVYWU5PUzRfU1dBUF9DSFJPTUFfQ1JDQjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwkJcmVnID0gcmVnIHwgRVhZTk9TNF9ERUNfWVVWXzQyMF9JTUcgfAorCQkJCUVYWU5PUzRfWVVWXzQyMF9JUF9ZVVZfNDIwXzJQX0lNRyB8CisJCQkJRVhZTk9TNF9TV0FQX0NIUk9NQV9DQkNSOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9OVjIxOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0RFQ19ZVVZfNDIwX0lNRyB8CisJCQkJRVhZTk9TNF9ZVVZfNDIwX0lQX1lVVl80MjBfMlBfSU1HIHwKKwkJCQlFWFlOT1M0X1NXQVBfQ0hST01BX0NSQ0I7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKwkJcmVnID0gcmVnIHwgRVhZTk9TNF9ERUNfWVVWXzQyMF9JTUcgfAorCQkJCUVYWU5PUzRfWVVWXzQyMF9JUF9ZVVZfNDIwXzNQX0lNRyB8CisJCQkJRVhZTk9TNF9TV0FQX0NIUk9NQV9DQkNSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKworCX0KKworCXdyaXRlbChyZWcsIGJhc2UgKyBFWFlOT1M0X0lNR19GTVRfUkVHKTsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY19vdXRfZm10KHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IG91dF9mbXQpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBFWFlOT1M0X0lNR19GTVRfUkVHKSAmCisJCQl+RVhZTk9TNF9FTkNfRk1UX01BU0s7IC8qIGNsZWFyIGVuYyBmb3JtYXQgKi8KKworCXN3aXRjaCAob3V0X2ZtdCkgeworCWNhc2UgVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19GTVRfR1JBWTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDQ0OgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19GTVRfWVVWXzQ0NDsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIyOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19GTVRfWVVWXzQyMjsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIwOgorCQlyZWcgPSByZWcgfCBFWFlOT1M0X0VOQ19GTVRfWVVWXzQyMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl3cml0ZWwocmVnLCBiYXNlICsgRVhZTk9TNF9JTUdfRk1UX1JFRyk7Cit9CisKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9pbnRlcnJ1cHQodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZWFkbChiYXNlICsgRVhZTk9TNF9JTlRfRU5fUkVHKSAmIH5FWFlOT1M0X0lOVF9FTl9NQVNLOworCXdyaXRlbChFWFlOT1M0X0lOVF9FTl9BTEwsIGJhc2UgKyBFWFlOT1M0X0lOVF9FTl9SRUcpOworfQorCit1bnNpZ25lZCBpbnQgZXh5bm9zNF9qcGVnX2dldF9pbnRfc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1bnNpZ25lZCBpbnQJaW50X3N0YXR1czsKKworCWludF9zdGF0dXMgPSByZWFkbChiYXNlICsgRVhZTk9TNF9JTlRfU1RBVFVTX1JFRyk7CisKKwlyZXR1cm4gaW50X3N0YXR1czsKK30KKwordW5zaWduZWQgaW50IGV4eW5vczRfanBlZ19nZXRfZmlmb19zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVuc2lnbmVkIGludCBmaWZvX3N0YXR1czsKKworCWZpZm9fc3RhdHVzID0gcmVhZGwoYmFzZSArIEVYWU5PUzRfRklGT19TVEFUVVNfUkVHKTsKKworCXJldHVybiBmaWZvX3N0YXR1czsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X2h1Zl90YWJsZV9lbmFibGUodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50CXJlZzsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBFWFlOT1M0X0pQRUdfQ05UTF9SRUcpICYgfkVYWU5PUzRfSFVGX1RCTF9FTjsKKworCWlmICh2YWx1ZSA9PSAxKQorCQl3cml0ZWwocmVnIHwgRVhZTk9TNF9IVUZfVEJMX0VOLAorCQkJCQliYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKKwllbHNlCisJCXdyaXRlbChyZWcgfCB+RVhZTk9TNF9IVUZfVEJMX0VOLAorCQkJCQliYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X3N5c19pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludAlyZWc7CisKKwlyZWcgPSByZWFkbChiYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKSAmIH4oRVhZTk9TNF9TWVNfSU5UX0VOKTsKKworCWlmICh2YWx1ZSA9PSAxKQorCQl3cml0ZWwoRVhZTk9TNF9TWVNfSU5UX0VOLCBiYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKKwllbHNlCisJCXdyaXRlbCh+RVhZTk9TNF9TWVNfSU5UX0VOLCBiYXNlICsgRVhZTk9TNF9KUEVHX0NOVExfUkVHKTsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X3N0cmVhbV9idWZfYWRkcmVzcyh2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkJCSB1bnNpZ25lZCBpbnQgYWRkcmVzcykKK3sKKwl3cml0ZWwoYWRkcmVzcywgYmFzZSArIEVYWU5PUzRfT1VUX01FTV9CQVNFX1JFRyk7Cit9CisKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9zdHJlYW1fc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsCisJCXVuc2lnbmVkIGludCB4X3ZhbHVlLCB1bnNpZ25lZCBpbnQgeV92YWx1ZSkKK3sKKwl3cml0ZWwoMHgwLCBiYXNlICsgRVhZTk9TNF9KUEVHX0lNR19TSVpFX1JFRyk7IC8qIGNsZWFyICovCisJd3JpdGVsKEVYWU5PUzRfWF9TSVpFKHhfdmFsdWUpIHwgRVhZTk9TNF9ZX1NJWkUoeV92YWx1ZSksCisJCQliYXNlICsgRVhZTk9TNF9KUEVHX0lNR19TSVpFX1JFRyk7Cit9CisKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9mcmFtZV9idWZfYWRkcmVzcyh2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkJc3RydWN0IHM1cF9qcGVnX2FkZHIgKmV4eW5vczRfanBlZ19hZGRyKQoreworCXdyaXRlbChleHlub3M0X2pwZWdfYWRkci0+eSwgYmFzZSArIEVYWU5PUzRfSU1HX0JBX1BMQU5FXzFfUkVHKTsKKwl3cml0ZWwoZXh5bm9zNF9qcGVnX2FkZHItPmNiLCBiYXNlICsgRVhZTk9TNF9JTUdfQkFfUExBTkVfMl9SRUcpOworCXdyaXRlbChleHlub3M0X2pwZWdfYWRkci0+Y3IsIGJhc2UgKyBFWFlOT1M0X0lNR19CQV9QTEFORV8zX1JFRyk7Cit9CisKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9lbmNvZGVfdGJsX3NlbGVjdCh2b2lkIF9faW9tZW0gKmJhc2UsCisJCWVudW0gZXh5bm9zNF9qcGVnX2ltZ19xdWFsaXR5X2xldmVsIGxldmVsKQoreworCXVuc2lnbmVkIGludAlyZWc7CisKKwlyZWcgPSBFWFlOT1M0X1FfVEJMX0NPTVAxXzAgfCBFWFlOT1M0X1FfVEJMX0NPTVAyXzEgfAorCQlFWFlOT1M0X1FfVEJMX0NPTVAzXzEgfAorCQlFWFlOT1M0X0hVRkZfVEJMX0NPTVAxX0FDXzBfRENfMSB8CisJCUVYWU5PUzRfSFVGRl9UQkxfQ09NUDJfQUNfMF9EQ18wIHwKKwkJRVhZTk9TNF9IVUZGX1RCTF9DT01QM19BQ18xX0RDXzE7CisKKwl3cml0ZWwocmVnLCBiYXNlICsgRVhZTk9TNF9UQkxfU0VMX1JFRyk7Cit9CisKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9lbmNvZGVfaG9mZl9jbnQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgZm10KQoreworCWlmIChmbXQgPT0gVjRMMl9QSVhfRk1UX0dSRVkpCisJCXdyaXRlbCgweGQyLCBiYXNlICsgRVhZTk9TNF9IVUZGX0NOVF9SRUcpOworCWVsc2UKKwkJd3JpdGVsKDB4MWEyLCBiYXNlICsgRVhZTk9TNF9IVUZGX0NOVF9SRUcpOworfQorCit1bnNpZ25lZCBpbnQgZXh5bm9zNF9qcGVnX2dldF9zdHJlYW1fc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gcmVhZGwoYmFzZSArIEVYWU5PUzRfQklUU1RSRUFNX1NJWkVfUkVHKTsKKwlyZXR1cm4gc2l6ZTsKK30KKwordm9pZCBleHlub3M0X2pwZWdfc2V0X2RlY19iaXRzdHJlYW1fc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBzaXplKQoreworCXdyaXRlbChzaXplLCBiYXNlICsgRVhZTk9TNF9CSVRTVFJFQU1fU0laRV9SRUcpOworfQorCit2b2lkIGV4eW5vczRfanBlZ19nZXRfZnJhbWVfc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsCisJCQl1bnNpZ25lZCBpbnQgKndpZHRoLCB1bnNpZ25lZCBpbnQgKmhlaWdodCkKK3sKKwkqd2lkdGggPSAocmVhZGwoYmFzZSArIEVYWU5PUzRfREVDT0RFX1hZX1NJWkVfUkVHKSAmCisJCQkJRVhZTk9TNF9ERUNPREVEX1NJWkVfTUFTSyk7CisJKmhlaWdodCA9IChyZWFkbChiYXNlICsgRVhZTk9TNF9ERUNPREVfWFlfU0laRV9SRUcpID4+IDE2KSAmCisJCQkJRVhZTk9TNF9ERUNPREVEX1NJWkVfTUFTSzsKK30KKwordW5zaWduZWQgaW50IGV4eW5vczRfanBlZ19nZXRfZnJhbWVfZm10KHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwlyZXR1cm4gcmVhZGwoYmFzZSArIEVYWU5PUzRfREVDT0RFX0lNR19GTVRfUkVHKSAmCisJCQkJRVhZTk9TNF9KUEVHX0RFQ09ERURfSU1HX0ZNVF9NQVNLOworfQorCit2b2lkIGV4eW5vczRfanBlZ19zZXRfdGltZXJfY291bnQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl3cml0ZWwoc2l6ZSwgYmFzZSArIEVYWU5PUzRfSU5UX1RJTUVSX0NPVU5UX1JFRyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctaHctZXh5bm9zNC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI4ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczQuaApAQCAtMCwwICsxLDQyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEF1dGhvcjogSmFjZWsgQW5hc3pld3NraSA8ai5hbmFzemV3c2tpQHNhbXN1bmcuY29tPgorICoKKyAqIEhlYWRlciBmaWxlIG9mIHRoZSByZWdpc3RlciBpbnRlcmZhY2UgZm9yIEpQRUcgZHJpdmVyIG9uIEV4eW5vczR4MTIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgSlBFR19IV19FWFlOT1M0X0hfCisjZGVmaW5lIEpQRUdfSFdfRVhZTk9TNF9IXworCit2b2lkIGV4eW5vczRfanBlZ19zd19yZXNldCh2b2lkIF9faW9tZW0gKmJhc2UpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY19kZWNfbW9kZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBtb2RlKTsKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9pbWdfZm10KHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IGltZ19mbXQpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY19vdXRfZm10KHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IG91dF9mbXQpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY190Ymwodm9pZCBfX2lvbWVtICpiYXNlKTsKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9pbnRlcnJ1cHQodm9pZCBfX2lvbWVtICpiYXNlKTsKK3Vuc2lnbmVkIGludCBleHlub3M0X2pwZWdfZ2V0X2ludF9zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlKTsKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9odWZfdGFibGVfZW5hYmxlKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHZhbHVlKTsKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9zeXNfaW50X2VuYWJsZSh2b2lkIF9faW9tZW0gKmJhc2UsIGludCB2YWx1ZSk7Cit2b2lkIGV4eW5vczRfanBlZ19zZXRfc3RyZWFtX2J1Zl9hZGRyZXNzKHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBhZGRyZXNzKTsKK3ZvaWQgZXh5bm9zNF9qcGVnX3NldF9zdHJlYW1fc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsCisJCXVuc2lnbmVkIGludCB4X3ZhbHVlLCB1bnNpZ25lZCBpbnQgeV92YWx1ZSk7Cit2b2lkIGV4eW5vczRfanBlZ19zZXRfZnJhbWVfYnVmX2FkZHJlc3Modm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCXN0cnVjdCBzNXBfanBlZ19hZGRyICpqcGVnX2FkZHIpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY29kZV90Ymxfc2VsZWN0KHZvaWQgX19pb21lbSAqYmFzZSwKKwkJZW51bSBleHlub3M0X2pwZWdfaW1nX3F1YWxpdHlfbGV2ZWwgbGV2ZWwpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2VuY29kZV9ob2ZmX2NudCh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBmbXQpOwordm9pZCBleHlub3M0X2pwZWdfc2V0X2RlY19iaXRzdHJlYW1fc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBzaXplKTsKK3Vuc2lnbmVkIGludCBleHlub3M0X2pwZWdfZ2V0X3N0cmVhbV9zaXplKHZvaWQgX19pb21lbSAqYmFzZSk7Cit2b2lkIGV4eW5vczRfanBlZ19nZXRfZnJhbWVfc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2UsCisJCQl1bnNpZ25lZCBpbnQgKndpZHRoLCB1bnNpZ25lZCBpbnQgKmhlaWdodCk7Cit1bnNpZ25lZCBpbnQgZXh5bm9zNF9qcGVnX2dldF9mcmFtZV9mbXQodm9pZCBfX2lvbWVtICpiYXNlKTsKK3Vuc2lnbmVkIGludCBleHlub3M0X2pwZWdfZ2V0X2ZpZm9fc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZSk7Cit2b2lkIGV4eW5vczRfanBlZ19zZXRfdGltZXJfY291bnQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBKUEVHX0hXX0VYWU5PUzRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1ody5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LXM1cC5jCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1ody5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctaHctczVwLmMKaW5kZXggYjQ3ZTg4Ny4uNTI0MDdkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LXM1cC5jCkBAIC05LDI3ICs5LDE1IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpZm5kZWYgSlBFR19IV19IXwotI2RlZmluZSBKUEVHX0hXX0hfCiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCi0jaW5jbHVkZSAianBlZy1ody5oIgorI2luY2x1ZGUgImpwZWctY29yZS5oIgogI2luY2x1ZGUgImpwZWctcmVncy5oIgorI2luY2x1ZGUgImpwZWctaHctczVwLmgiCiAKLSNkZWZpbmUgUzVQX0pQRUdfTUlOX1dJRFRICQkzMgotI2RlZmluZSBTNVBfSlBFR19NSU5fSEVJR0hUCQkzMgotI2RlZmluZSBTNVBfSlBFR19NQVhfV0lEVEgJCTgxOTIKLSNkZWZpbmUgUzVQX0pQRUdfTUFYX0hFSUdIVAkJODE5MgotI2RlZmluZSBTNVBfSlBFR19FTkNPREUJCQkwCi0jZGVmaW5lIFM1UF9KUEVHX0RFQ09ERQkJCTEKLSNkZWZpbmUgUzVQX0pQRUdfUkFXX0lOXzU2NQkJMAotI2RlZmluZSBTNVBfSlBFR19SQVdfSU5fNDIyCQkxCi0jZGVmaW5lIFM1UF9KUEVHX1JBV19PVVRfNDIyCQkwCi0jZGVmaW5lIFM1UF9KUEVHX1JBV19PVVRfNDIwCQkxCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3Jlc2V0KHZvaWQgX19pb21lbSAqcmVncykKK3ZvaWQgczVwX2pwZWdfcmVzZXQodm9pZCBfX2lvbWVtICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC00MiwxMiArMzAsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3Bvd2Vyb24odm9pZCBfX2lvbWVtICpyZWdzKQordm9pZCBzNXBfanBlZ19wb3dlcm9uKHZvaWQgX19pb21lbSAqcmVncykKIHsKIAl3cml0ZWwoUzVQX1BPV0VSX09OLCByZWdzICsgUzVQX0pQR0NMS0NPTik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX2lucHV0X3Jhd19tb2RlKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBtb2RlKQordm9pZCBzNXBfanBlZ19pbnB1dF9yYXdfbW9kZSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbW9kZSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlZywgbTsKIApAQCAtNjMsNyArNTEsNyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHQ01PRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX2lucHV0X3Jhd195MTYodm9pZCBfX2lvbWVtICpyZWdzLCBib29sIHkxNikKK3ZvaWQgczVwX2pwZWdfaW5wdXRfcmF3X3kxNih2b2lkIF9faW9tZW0gKnJlZ3MsIGJvb2wgeTE2KQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC03NSw3ICs2Myw3IEBACiAJd3JpdGVsKHJlZywgcmVncyArIFM1UF9KUEdDTU9EKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfcHJvY19tb2RlKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBtb2RlKQordm9pZCBzNXBfanBlZ19wcm9jX21vZGUodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIG1vZGUpCiB7CiAJdW5zaWduZWQgbG9uZyByZWcsIG07CiAKQEAgLTkwLDcgKzc4LDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR01PRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3N1YnNhbXBsaW5nX21vZGUodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3ZvaWQgczVwX2pwZWdfc3Vic2FtcGxpbmdfbW9kZSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCBtb2RlKQogewogCXVuc2lnbmVkIGxvbmcgcmVnLCBtOwogCkBAIC0xMDUsMTIgKzkzLDEyIEBACiAJd3JpdGVsKHJlZywgcmVncyArIFM1UF9KUEdNT0QpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqcGVnX2dldF9zdWJzYW1wbGluZ19tb2RlKHZvaWQgX19pb21lbSAqcmVncykKK3Vuc2lnbmVkIGludCBzNXBfanBlZ19nZXRfc3Vic2FtcGxpbmdfbW9kZSh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJcmV0dXJuIHJlYWRsKHJlZ3MgKyBTNVBfSlBHTU9EKSAmIFM1UF9TVUJTQU1QTElOR19NT0RFX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX2RyaSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCBkcmkpCit2b2lkIHM1cF9qcGVnX2RyaSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCBkcmkpCiB7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKQEAgLTEyNSw3ICsxMTMsNyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHRFJJX0wpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19xdGJsKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBuKQordm9pZCBzNXBfanBlZ19xdGJsKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBuKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0xMzUsNyArMTIzLDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19RVEJMKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfaHRibF9hYyh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCB0KQordm9pZCBzNXBfanBlZ19odGJsX2FjKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgaW50IHQpCiB7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKQEAgLTE0Niw3ICsxMzQsNyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHX0hUQkwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19odGJsX2RjKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgaW50IHQpCit2b2lkIHM1cF9qcGVnX2h0YmxfZGModm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgdCkKIHsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIApAQCAtMTU3LDcgKzE0NSw3IEBACiAJd3JpdGVsKHJlZywgcmVncyArIFM1UF9KUEdfSFRCTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3kodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgeSkKK3ZvaWQgczVwX2pwZWdfeSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCB5KQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0xNzIsNyArMTYwLDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR1lfTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3godm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgeCkKK3ZvaWQgczVwX2pwZWdfeCh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCB4KQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0xODcsNyArMTc1LDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR1hfTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3JzdF9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmFibGUpCit2b2lkIHM1cF9qcGVnX3JzdF9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmFibGUpCiB7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKQEAgLTE5OCw3ICsxODYsNyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHSU5UU0UpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19kYXRhX251bV9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmFibGUpCit2b2lkIHM1cF9qcGVnX2RhdGFfbnVtX2ludF9lbmFibGUodm9pZCBfX2lvbWVtICpyZWdzLCBib29sIGVuYWJsZSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIApAQCAtMjA5LDcgKzE5Nyw3IEBACiAJd3JpdGVsKHJlZywgcmVncyArIFM1UF9KUEdJTlRTRSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX2ZpbmFsX21jdV9udW1faW50X2VuYWJsZSh2b2lkIF9faW9tZW0gKnJlZ3MsIGJvb2wgZW5ibCkKK3ZvaWQgczVwX2pwZWdfZmluYWxfbWN1X251bV9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmJsKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0yMjAsNyArMjA4LDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR0lOVFNFKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfdGltZXJfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyB2YWwpCit2b2lkIHM1cF9qcGVnX3RpbWVyX2VuYWJsZSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0yMzEsNyArMjE5LDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19USU1FUl9TRSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX3RpbWVyX2Rpc2FibGUodm9pZCBfX2lvbWVtICpyZWdzKQordm9pZCBzNXBfanBlZ190aW1lcl9kaXNhYmxlKHZvaWQgX19pb21lbSAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIApAQCAtMjQwLDEzICsyMjgsMTMgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19USU1FUl9TRSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGpwZWdfdGltZXJfc3RhdCh2b2lkIF9faW9tZW0gKnJlZ3MpCitpbnQgczVwX2pwZWdfdGltZXJfc3RhdCh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJcmV0dXJuIChpbnQpKChyZWFkbChyZWdzICsgUzVQX0pQR19USU1FUl9TVCkgJiBTNVBfVElNRVJfSU5UX1NUQVRfTUFTSykKIAkJICAgICA+PiBTNVBfVElNRVJfSU5UX1NUQVRfU0hJRlQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19jbGVhcl90aW1lcl9zdGF0KHZvaWQgX19pb21lbSAqcmVncykKK3ZvaWQgczVwX2pwZWdfY2xlYXJfdGltZXJfc3RhdCh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKQEAgLTI1NSw3ICsyNDMsNyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHX1RJTUVSX1NFKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfZW5jX3N0cmVhbV9pbnQodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIHNpemUpCit2b2lkIHM1cF9qcGVnX2VuY19zdHJlYW1faW50KHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0yNjYsMTMgKzI1NCwxMyBAQAogCXdyaXRlbChyZWcsIHJlZ3MgKyBTNVBfSlBHX0VOQ19TVFJFQU1fSU5UU0UpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBqcGVnX2VuY19zdHJlYW1fc3RhdCh2b2lkIF9faW9tZW0gKnJlZ3MpCitpbnQgczVwX2pwZWdfZW5jX3N0cmVhbV9zdGF0KHZvaWQgX19pb21lbSAqcmVncykKIHsKIAlyZXR1cm4gKGludCkocmVhZGwocmVncyArIFM1UF9KUEdfRU5DX1NUUkVBTV9JTlRTVCkgJgogCQkgICAgIFM1UF9FTkNfU1RSRUFNX0lOVF9TVEFUX01BU0spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19jbGVhcl9lbmNfc3RyZWFtX3N0YXQodm9pZCBfX2lvbWVtICpyZWdzKQordm9pZCBzNXBfanBlZ19jbGVhcl9lbmNfc3RyZWFtX3N0YXQodm9pZCBfX2lvbWVtICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwogCkBAIC0yODEsNyArMjY5LDcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19FTkNfU1RSRUFNX0lOVFNFKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfb3V0Zm9ybV9yYXcodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIGZvcm1hdCkKK3ZvaWQgczVwX2pwZWdfb3V0Zm9ybV9yYXcodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIGZvcm1hdCkKIHsKIAl1bnNpZ25lZCBsb25nIHJlZywgZjsKIApAQCAtMjk2LDE3ICsyODQsMTcgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19PVVRGT1JNKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfanBnYWRyKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKQordm9pZCBzNXBfanBlZ19qcGdhZHIodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJd3JpdGVsKGFkZHIsIHJlZ3MgKyBTNVBfSlBHX0pQR0FEUik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqcGVnX2ltZ2Fkcih2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3ZvaWQgczVwX2pwZWdfaW1nYWRyKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXdyaXRlbChhZGRyLCByZWdzICsgUzVQX0pQR19JTUdBRFIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQganBlZ19jb2VmKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgaW50IGksCit2b2lkIHM1cF9qcGVnX2NvZWYodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgaSwKIAkJCSAgICAgdW5zaWduZWQgaW50IGosIHVuc2lnbmVkIGludCBjb2VmKQogewogCXVuc2lnbmVkIGxvbmcgcmVnOwpAQCAtMzE3LDI0ICszMDUsMjQgQEAKIAl3cml0ZWwocmVnLCByZWdzICsgUzVQX0pQR19DT0VGKGkpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfc3RhcnQodm9pZCBfX2lvbWVtICpyZWdzKQordm9pZCBzNXBfanBlZ19zdGFydCh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJd3JpdGVsKDEsIHJlZ3MgKyBTNVBfSlNUQVJUKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQganBlZ19yZXN1bHRfc3RhdF9vayh2b2lkIF9faW9tZW0gKnJlZ3MpCitpbnQgczVwX2pwZWdfcmVzdWx0X3N0YXRfb2sodm9pZCBfX2lvbWVtICpyZWdzKQogewogCXJldHVybiAoaW50KSgocmVhZGwocmVncyArIFM1UF9KUEdJTlRTVCkgJiBTNVBfUkVTVUxUX1NUQVRfTUFTSykKIAkJICAgICA+PiBTNVBfUkVTVUxUX1NUQVRfU0hJRlQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBqcGVnX3N0cmVhbV9zdGF0X29rKHZvaWQgX19pb21lbSAqcmVncykKK2ludCBzNXBfanBlZ19zdHJlYW1fc3RhdF9vayh2b2lkIF9faW9tZW0gKnJlZ3MpCiB7CiAJcmV0dXJuICEoaW50KSgocmVhZGwocmVncyArIFM1UF9KUEdJTlRTVCkgJiBTNVBfU1RSRUFNX1NUQVRfTUFTSykKIAkJICAgICAgPj4gUzVQX1NUUkVBTV9TVEFUX1NISUZUKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGpwZWdfY2xlYXJfaW50KHZvaWQgX19pb21lbSAqcmVncykKK3ZvaWQgczVwX2pwZWdfY2xlYXJfaW50KHZvaWQgX19pb21lbSAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIApAQCAtMzQzLDcgKzMzMSw3IEBACiAJcmVnID0gcmVhZGwocmVncyArIFM1UF9KUEdPUFIpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqcGVnX2NvbXByZXNzZWRfc2l6ZSh2b2lkIF9faW9tZW0gKnJlZ3MpCit1bnNpZ25lZCBpbnQgczVwX2pwZWdfY29tcHJlc3NlZF9zaXplKHZvaWQgX19pb21lbSAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGpwZWdfc2l6ZSA9IDA7CiAKQEAgLTM1Myw1ICszNDEsMyBAQAogCiAJcmV0dXJuICh1bnNpZ25lZCBpbnQpanBlZ19zaXplOwogfQotCi0jZW5kaWYgLyogSlBFR19IV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LXM1cC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LXM1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMWViZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctaHctczVwLmgKQEAgLTAsMCArMSw2MyBAQAorLyogbGludXgvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQXV0aG9yOiBBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWoucEBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIEpQRUdfSFdfUzVQX0hfCisjZGVmaW5lIEpQRUdfSFdfUzVQX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSAianBlZy1yZWdzLmgiCisKKyNkZWZpbmUgUzVQX0pQRUdfTUlOX1dJRFRICQkzMgorI2RlZmluZSBTNVBfSlBFR19NSU5fSEVJR0hUCQkzMgorI2RlZmluZSBTNVBfSlBFR19NQVhfV0lEVEgJCTgxOTIKKyNkZWZpbmUgUzVQX0pQRUdfTUFYX0hFSUdIVAkJODE5MgorI2RlZmluZSBTNVBfSlBFR19SQVdfSU5fNTY1CQkwCisjZGVmaW5lIFM1UF9KUEVHX1JBV19JTl80MjIJCTEKKyNkZWZpbmUgUzVQX0pQRUdfUkFXX09VVF80MjIJCTAKKyNkZWZpbmUgUzVQX0pQRUdfUkFXX09VVF80MjAJCTEKKwordm9pZCBzNXBfanBlZ19yZXNldCh2b2lkIF9faW9tZW0gKnJlZ3MpOwordm9pZCBzNXBfanBlZ19wb3dlcm9uKHZvaWQgX19pb21lbSAqcmVncyk7Cit2b2lkIHM1cF9qcGVnX2lucHV0X3Jhd19tb2RlKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBtb2RlKTsKK3ZvaWQgczVwX2pwZWdfaW5wdXRfcmF3X3kxNih2b2lkIF9faW9tZW0gKnJlZ3MsIGJvb2wgeTE2KTsKK3ZvaWQgczVwX2pwZWdfcHJvY19tb2RlKHZvaWQgX19pb21lbSAqcmVncywgdW5zaWduZWQgbG9uZyBtb2RlKTsKK3ZvaWQgczVwX2pwZWdfc3Vic2FtcGxpbmdfbW9kZSh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCBtb2RlKTsKK3Vuc2lnbmVkIGludCBzNXBfanBlZ19nZXRfc3Vic2FtcGxpbmdfbW9kZSh2b2lkIF9faW9tZW0gKnJlZ3MpOwordm9pZCBzNXBfanBlZ19kcmkodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgZHJpKTsKK3ZvaWQgczVwX2pwZWdfcXRibCh2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgbik7Cit2b2lkIHM1cF9qcGVnX2h0YmxfYWModm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgdCk7Cit2b2lkIHM1cF9qcGVnX2h0YmxfZGModm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgdCk7Cit2b2lkIHM1cF9qcGVnX3kodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgeSk7Cit2b2lkIHM1cF9qcGVnX3godm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgeCk7Cit2b2lkIHM1cF9qcGVnX3JzdF9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmFibGUpOwordm9pZCBzNXBfanBlZ19kYXRhX251bV9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqcmVncywgYm9vbCBlbmFibGUpOwordm9pZCBzNXBfanBlZ19maW5hbF9tY3VfbnVtX2ludF9lbmFibGUodm9pZCBfX2lvbWVtICpyZWdzLCBib29sIGVuYmwpOwordm9pZCBzNXBfanBlZ190aW1lcl9lbmFibGUodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIHZhbCk7Cit2b2lkIHM1cF9qcGVnX3RpbWVyX2Rpc2FibGUodm9pZCBfX2lvbWVtICpyZWdzKTsKK2ludCBzNXBfanBlZ190aW1lcl9zdGF0KHZvaWQgX19pb21lbSAqcmVncyk7Cit2b2lkIHM1cF9qcGVnX2NsZWFyX3RpbWVyX3N0YXQodm9pZCBfX2lvbWVtICpyZWdzKTsKK3ZvaWQgczVwX2pwZWdfZW5jX3N0cmVhbV9pbnQodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIHNpemUpOworaW50IHM1cF9qcGVnX2VuY19zdHJlYW1fc3RhdCh2b2lkIF9faW9tZW0gKnJlZ3MpOwordm9pZCBzNXBfanBlZ19jbGVhcl9lbmNfc3RyZWFtX3N0YXQodm9pZCBfX2lvbWVtICpyZWdzKTsKK3ZvaWQgczVwX2pwZWdfb3V0Zm9ybV9yYXcodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBsb25nIGZvcm1hdCk7Cit2b2lkIHM1cF9qcGVnX2pwZ2Fkcih2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcik7Cit2b2lkIHM1cF9qcGVnX2ltZ2Fkcih2b2lkIF9faW9tZW0gKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcik7Cit2b2lkIHM1cF9qcGVnX2NvZWYodm9pZCBfX2lvbWVtICpyZWdzLCB1bnNpZ25lZCBpbnQgaSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGosIHVuc2lnbmVkIGludCBjb2VmKTsKK3ZvaWQgczVwX2pwZWdfc3RhcnQodm9pZCBfX2lvbWVtICpyZWdzKTsKK2ludCBzNXBfanBlZ19yZXN1bHRfc3RhdF9vayh2b2lkIF9faW9tZW0gKnJlZ3MpOworaW50IHM1cF9qcGVnX3N0cmVhbV9zdGF0X29rKHZvaWQgX19pb21lbSAqcmVncyk7Cit2b2lkIHM1cF9qcGVnX2NsZWFyX2ludCh2b2lkIF9faW9tZW0gKnJlZ3MpOwordW5zaWduZWQgaW50IHM1cF9qcGVnX2NvbXByZXNzZWRfc2l6ZSh2b2lkIF9faW9tZW0gKnJlZ3MpOworCisjZW5kaWYgLyogSlBFR19IV19TNVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1yZWdzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctcmVncy5oCmluZGV4IDM4ZTUwODEuLjMzZjJjNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1yZWdzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLXJlZ3MuaApAQCAtMiwxMCArMiwxMSBAQAogICoKICAqIFJlZ2lzdGVyIGRlZmluaXRpb24gZmlsZSBmb3IgU2Ftc3VuZyBKUEVHIGNvZGVjIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KICAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCiAgKgogICogQXV0aG9yOiBBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWoucEBzYW1zdW5nLmNvbT4KKyAqIEF1dGhvcjogSmFjZWsgQW5hc3pld3NraSA8ai5hbmFzemV3c2tpQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTUsNiArMTYsOCBAQAogI2lmbmRlZiBKUEVHX1JFR1NfSF8KICNkZWZpbmUgSlBFR19SRUdTX0hfCiAKKy8qIFJlZ2lzdGVyIGFuZCBiaXQgZGVmaW5pdGlvbnMgZm9yIFM1UEMyMTAgKi8KKwogLyogSlBFRyBtb2RlIHJlZ2lzdGVyICovCiAjZGVmaW5lIFM1UF9KUEdNT0QJCQkweDAwCiAjZGVmaW5lIFM1UF9QUk9DX01PREVfTUFTSwkJKDB4MSA8PCAzKQpAQCAtMTY2LDUgKzE2OSwyMDkgQEAKIC8qIEpQRUcgQUMgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLwogI2RlZmluZSBTNVBfSlBHX0hBQ1RCTEcobikJCSgweDhjMCArIChuKSAqIDB4NDAwKQogCisKKy8qIFJlZ2lzdGVyIGFuZCBiaXQgZGVmaW5pdGlvbnMgZm9yIEV4eW5vcyA0eDEyICovCisKKy8qIEpQRUcgQ29kZWMgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRVhZTk9TNF9KUEVHX0NOVExfUkVHCQkweDAwCisjZGVmaW5lIEVYWU5PUzRfSU5UX0VOX1JFRwkJMHgwNAorI2RlZmluZSBFWFlOT1M0X0lOVF9USU1FUl9DT1VOVF9SRUcJMHgwOAorI2RlZmluZSBFWFlOT1M0X0lOVF9TVEFUVVNfUkVHCQkweDBjCisjZGVmaW5lIEVYWU5PUzRfT1VUX01FTV9CQVNFX1JFRwkJMHgxMAorI2RlZmluZSBFWFlOT1M0X0pQRUdfSU1HX1NJWkVfUkVHCTB4MTQKKyNkZWZpbmUgRVhZTk9TNF9JTUdfQkFfUExBTkVfMV9SRUcJMHgxOAorI2RlZmluZSBFWFlOT1M0X0lNR19TT19QTEFORV8xX1JFRwkweDFjCisjZGVmaW5lIEVYWU5PUzRfSU1HX1BPX1BMQU5FXzFfUkVHCTB4MjAKKyNkZWZpbmUgRVhZTk9TNF9JTUdfQkFfUExBTkVfMl9SRUcJMHgyNAorI2RlZmluZSBFWFlOT1M0X0lNR19TT19QTEFORV8yX1JFRwkweDI4CisjZGVmaW5lIEVYWU5PUzRfSU1HX1BPX1BMQU5FXzJfUkVHCTB4MmMKKyNkZWZpbmUgRVhZTk9TNF9JTUdfQkFfUExBTkVfM19SRUcJMHgzMAorI2RlZmluZSBFWFlOT1M0X0lNR19TT19QTEFORV8zX1JFRwkweDM0CisjZGVmaW5lIEVYWU5PUzRfSU1HX1BPX1BMQU5FXzNfUkVHCTB4MzgKKworI2RlZmluZSBFWFlOT1M0X1RCTF9TRUxfUkVHCQkweDNjCisKKyNkZWZpbmUgRVhZTk9TNF9JTUdfRk1UX1JFRwkJMHg0MAorCisjZGVmaW5lIEVYWU5PUzRfQklUU1RSRUFNX1NJWkVfUkVHCTB4NDQKKyNkZWZpbmUgRVhZTk9TNF9QQURESU5HX1JFRwkJMHg0OAorI2RlZmluZSBFWFlOT1M0X0hVRkZfQ05UX1JFRwkJMHg0YworI2RlZmluZSBFWFlOT1M0X0ZJRk9fU1RBVFVTX1JFRwkweDUwCisjZGVmaW5lIEVYWU5PUzRfREVDT0RFX1hZX1NJWkVfUkVHCTB4NTQKKyNkZWZpbmUgRVhZTk9TNF9ERUNPREVfSU1HX0ZNVF9SRUcJMHg1OAorCisjZGVmaW5lIEVYWU5PUzRfUVVBTl9UQkxfRU5UUllfUkVHCTB4MTAwCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfRU5UUllfUkVHCTB4MjAwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCaXQgZGVmaW5pdGlvbiBwYXJ0CQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBKUEVHIENOVEwgUmVnaXN0ZXIgYml0ICovCisjZGVmaW5lIEVYWU5PUzRfRU5DX0RFQ19NT0RFX01BU0sJKDB4ZmZmZmZmZmMgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9ERUNfTU9ERQkJCSgxIDw8IDApCisjZGVmaW5lIEVYWU5PUzRfRU5DX01PREUJCQkoMSA8PCAxKQorI2RlZmluZSBFWFlOT1M0X0FVVE9fUlNUX01BUktFUgkJKDEgPDwgMikKKyNkZWZpbmUgRVhZTk9TNF9SU1RfSU5URVJWQUxfU0hJRlQJMworI2RlZmluZSBFWFlOT1M0X1JTVF9JTlRFUlZBTCh4KQkJKCgoeCkgJiAweGZmZmYpIFwKKwkJCQkJCTw8IEVYWU5PUzRfUlNUX0lOVEVSVkFMX1NISUZUKQorI2RlZmluZSBFWFlOT1M0X0hVRl9UQkxfRU4JCSgxIDw8IDE5KQorI2RlZmluZSBFWFlOT1M0X0hPUl9TQ0FMSU5HX1NISUZUCTIwCisjZGVmaW5lIEVYWU5PUzRfSE9SX1NDQUxJTkdfTUFTSwkJKDMgPDwgRVhZTk9TNF9IT1JfU0NBTElOR19TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9IT1JfU0NBTElORyh4KQkJKCgoeCkgJiAweDMpIFwKKwkJCQkJCTw8IEVYWU5PUzRfSE9SX1NDQUxJTkdfU0hJRlQpCisjZGVmaW5lIEVYWU5PUzRfVkVSX1NDQUxJTkdfU0hJRlQJMjIKKyNkZWZpbmUgRVhZTk9TNF9WRVJfU0NBTElOR19NQVNLCQkoMyA8PCBFWFlOT1M0X1ZFUl9TQ0FMSU5HX1NISUZUKQorI2RlZmluZSBFWFlOT1M0X1ZFUl9TQ0FMSU5HKHgpCQkoKCh4KSAmIDB4MykgXAorCQkJCQkJPDwgRVhZTk9TNF9WRVJfU0NBTElOR19TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9QQURESU5HCQkJKDEgPDwgMjcpCisjZGVmaW5lIEVYWU5PUzRfU1lTX0lOVF9FTgkJKDEgPDwgMjgpCisjZGVmaW5lIEVYWU5PUzRfU09GVF9SRVNFVF9ISQkJKDEgPDwgMjkpCisKKy8qIEpQRUcgSU5UIFJlZ2lzdGVyIGJpdCAqLworI2RlZmluZSBFWFlOT1M0X0lOVF9FTl9NQVNLCQkoMHgxZiA8PCAwKQorI2RlZmluZSBFWFlOT1M0X1BST1RfRVJSX0lOVF9FTgkJKDEgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9JTUdfQ09NUExFVElPTl9JTlRfRU4JKDEgPDwgMSkKKyNkZWZpbmUgRVhZTk9TNF9ERUNfSU5WQUxJRF9GT1JNQVRfRU4JKDEgPDwgMikKKyNkZWZpbmUgRVhZTk9TNF9NVUxUSV9TQ0FOX0VSUk9SX0VOCSgxIDw8IDMpCisjZGVmaW5lIEVYWU5PUzRfRlJBTUVfRVJSX0VOCQkoMSA8PCA0KQorI2RlZmluZSBFWFlOT1M0X0lOVF9FTl9BTEwJCSgweDFmIDw8IDApCisKKyNkZWZpbmUgRVhZTk9TNF9NT0RfUkVHX1BST0NfRU5DCQkoMCA8PCAzKQorI2RlZmluZSBFWFlOT1M0X01PRF9SRUdfUFJPQ19ERUMJCSgxIDw8IDMpCisKKyNkZWZpbmUgRVhZTk9TNF9NT0RfUkVHX1NVQlNBTVBMRV80NDQJKDAgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9NT0RfUkVHX1NVQlNBTVBMRV80MjIJKDEgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9NT0RfUkVHX1NVQlNBTVBMRV80MjAJKDIgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9NT0RfUkVHX1NVQlNBTVBMRV9HUkFZCSgzIDw8IDApCisKKworLyogSlBFRyBJTUFHRSBTSVpFIFJlZ2lzdGVyIGJpdCAqLworI2RlZmluZSBFWFlOT1M0X1hfU0laRV9TSElGVAkJMAorI2RlZmluZSBFWFlOT1M0X1hfU0laRV9NQVNLCQkoMHhmZmZmIDw8IEVYWU5PUzRfWF9TSVpFX1NISUZUKQorI2RlZmluZSBFWFlOT1M0X1hfU0laRSh4KQkJKCgoeCkgJiAweGZmZmYpIDw8IEVYWU5PUzRfWF9TSVpFX1NISUZUKQorI2RlZmluZSBFWFlOT1M0X1lfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgRVhZTk9TNF9ZX1NJWkVfTUFTSwkJKDB4ZmZmZiA8PCBFWFlOT1M0X1lfU0laRV9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZX1NJWkUoeCkJCSgoKHgpICYgMHhmZmZmKSA8PCBFWFlOT1M0X1lfU0laRV9TSElGVCkKKworLyogSlBFRyBJTUFHRSBGT1JNQVQgUmVnaXN0ZXIgYml0ICovCisjZGVmaW5lIEVYWU5PUzRfRU5DX0lOX0ZNVF9NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIEVYWU5PUzRfRU5DX0dSQVlfSU1HCQkoMCA8PCAwKQorI2RlZmluZSBFWFlOT1M0X0VOQ19SR0JfSU1HCQkoMSA8PCAwKQorI2RlZmluZSBFWFlOT1M0X0VOQ19ZVVZfNDQ0X0lNRwkJKDIgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9FTkNfWVVWXzQyMl9JTUcJCSgzIDw8IDApCisjZGVmaW5lIEVYWU5PUzRfRU5DX1lVVl80NDBfSU1HCQkoNCA8PCAwKQorCisjZGVmaW5lIEVYWU5PUzRfREVDX0dSQVlfSU1HCQkoMCA8PCAwKQorI2RlZmluZSBFWFlOT1M0X0RFQ19SR0JfSU1HCQkoMSA8PCAwKQorI2RlZmluZSBFWFlOT1M0X0RFQ19ZVVZfNDQ0X0lNRwkJKDIgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9ERUNfWVVWXzQyMl9JTUcJCSgzIDw8IDApCisjZGVmaW5lIEVYWU5PUzRfREVDX1lVVl80MjBfSU1HCQkoNCA8PCAwKQorCisjZGVmaW5lIEVYWU5PUzRfR1JBWV9JTUdfSVBfU0hJRlQJMworI2RlZmluZSBFWFlOT1M0X0dSQVlfSU1HX0lQX01BU0sJCSg3IDw8IEVYWU5PUzRfR1JBWV9JTUdfSVBfU0hJRlQpCisjZGVmaW5lIEVYWU5PUzRfR1JBWV9JTUdfSVAJCSg0IDw8IEVYWU5PUzRfR1JBWV9JTUdfSVBfU0hJRlQpCisKKyNkZWZpbmUgRVhZTk9TNF9SR0JfSVBfU0hJRlQJCTYKKyNkZWZpbmUgRVhZTk9TNF9SR0JfSVBfTUFTSwkJKDcgPDwgRVhZTk9TNF9SR0JfSVBfU0hJRlQpCisjZGVmaW5lIEVYWU5PUzRfUkdCX0lQX1JHQl8xNkJJVF9JTUcJKDQgPDwgRVhZTk9TNF9SR0JfSVBfU0hJRlQpCisjZGVmaW5lIEVYWU5PUzRfUkdCX0lQX1JHQl8zMkJJVF9JTUcJKDUgPDwgRVhZTk9TNF9SR0JfSVBfU0hJRlQpCisKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDQ0X0lQX1NISUZUCQkJOQorI2RlZmluZSBFWFlOT1M0X1lVVl80NDRfSVBfTUFTSwkJCSg3IDw8IEVYWU5PUzRfWVVWXzQ0NF9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDQ0X0lQX1lVVl80NDRfMlBfSU1HCSg0IDw8IEVYWU5PUzRfWVVWXzQ0NF9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDQ0X0lQX1lVVl80NDRfM1BfSU1HCSg1IDw8IEVYWU5PUzRfWVVWXzQ0NF9JUF9TSElGVCkKKworI2RlZmluZSBFWFlOT1M0X1lVVl80MjJfSVBfU0hJRlQJCQkxMgorI2RlZmluZSBFWFlOT1M0X1lVVl80MjJfSVBfTUFTSwkJCSg3IDw8IEVYWU5PUzRfWVVWXzQyMl9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDIyX0lQX1lVVl80MjJfMVBfSU1HCSg0IDw8IEVYWU5PUzRfWVVWXzQyMl9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDIyX0lQX1lVVl80MjJfMlBfSU1HCSg1IDw8IEVYWU5PUzRfWVVWXzQyMl9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDIyX0lQX1lVVl80MjJfM1BfSU1HCSg2IDw8IEVYWU5PUzRfWVVWXzQyMl9JUF9TSElGVCkKKworI2RlZmluZSBFWFlOT1M0X1lVVl80MjBfSVBfU0hJRlQJCQkxNQorI2RlZmluZSBFWFlOT1M0X1lVVl80MjBfSVBfTUFTSwkJCSg3IDw8IEVYWU5PUzRfWVVWXzQyMF9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDIwX0lQX1lVVl80MjBfMlBfSU1HCSg0IDw8IEVYWU5PUzRfWVVWXzQyMF9JUF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9ZVVZfNDIwX0lQX1lVVl80MjBfM1BfSU1HCSg1IDw8IEVYWU5PUzRfWVVWXzQyMF9JUF9TSElGVCkKKworI2RlZmluZSBFWFlOT1M0X0VOQ19GTVRfU0hJRlQJCQkyNAorI2RlZmluZSBFWFlOT1M0X0VOQ19GTVRfTUFTSwkJCSgzIDw8IEVYWU5PUzRfRU5DX0ZNVF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9FTkNfRk1UX0dSQVkJCQkoMCA8PCBFWFlOT1M0X0VOQ19GTVRfU0hJRlQpCisjZGVmaW5lIEVYWU5PUzRfRU5DX0ZNVF9ZVVZfNDQ0CQkJKDEgPDwgRVhZTk9TNF9FTkNfRk1UX1NISUZUKQorI2RlZmluZSBFWFlOT1M0X0VOQ19GTVRfWVVWXzQyMgkJCSgyIDw8IEVYWU5PUzRfRU5DX0ZNVF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TNF9FTkNfRk1UX1lVVl80MjAJCQkoMyA8PCBFWFlOT1M0X0VOQ19GTVRfU0hJRlQpCisKKyNkZWZpbmUgRVhZTk9TNF9KUEVHX0RFQ09ERURfSU1HX0ZNVF9NQVNLCTB4MDMKKworI2RlZmluZSBFWFlOT1M0X1NXQVBfQ0hST01BX0NSQ0IJCQkoMSA8PCAyNikKKyNkZWZpbmUgRVhZTk9TNF9TV0FQX0NIUk9NQV9DQkNSCQkJKDAgPDwgMjYpCisKKy8qIEpQRUcgSFVGRiBjb3VudCBSZWdpc3RlciBiaXQgKi8KKyNkZWZpbmUgRVhZTk9TNF9IVUZGX0NPVU5UX01BU0sJCQkweGZmZmYKKworLyogSlBFRyBEZWNvZGVkX2ltZ194X3lfc2l6ZSBSZWdpc3RlciBiaXQgKi8KKyNkZWZpbmUgRVhZTk9TNF9ERUNPREVEX1NJWkVfTUFTSwkJMHgwMDAwZmZmZgorCisvKiBKUEVHIERlY29kZWQgaW1hZ2UgZm9ybWF0IFJlZ2lzdGVyIGJpdCAqLworI2RlZmluZSBFWFlOT1M0X0RFQ09ERURfSU1HX0ZNVF9NQVNLCQkweDMKKworLyogSlBFRyBUQkwgU0VMIFJlZ2lzdGVyIGJpdCAqLworI2RlZmluZSBFWFlOT1M0X1FfVEJMX0NPTVAxXzAJCSgwIDw8IDApCisjZGVmaW5lIEVYWU5PUzRfUV9UQkxfQ09NUDFfMQkJKDEgPDwgMCkKKyNkZWZpbmUgRVhZTk9TNF9RX1RCTF9DT01QMV8yCQkoMiA8PCAwKQorI2RlZmluZSBFWFlOT1M0X1FfVEJMX0NPTVAxXzMJCSgzIDw8IDApCisKKyNkZWZpbmUgRVhZTk9TNF9RX1RCTF9DT01QMl8wCQkoMCA8PCAyKQorI2RlZmluZSBFWFlOT1M0X1FfVEJMX0NPTVAyXzEJCSgxIDw8IDIpCisjZGVmaW5lIEVYWU5PUzRfUV9UQkxfQ09NUDJfMgkJKDIgPDwgMikKKyNkZWZpbmUgRVhZTk9TNF9RX1RCTF9DT01QMl8zCQkoMyA8PCAyKQorCisjZGVmaW5lIEVYWU5PUzRfUV9UQkxfQ09NUDNfMAkJKDAgPDwgNCkKKyNkZWZpbmUgRVhZTk9TNF9RX1RCTF9DT01QM18xCQkoMSA8PCA0KQorI2RlZmluZSBFWFlOT1M0X1FfVEJMX0NPTVAzXzIJCSgyIDw8IDQpCisjZGVmaW5lIEVYWU5PUzRfUV9UQkxfQ09NUDNfMwkJKDMgPDwgNCkKKworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0NPTVAxX0FDXzBfRENfMAkoMCA8PCA2KQorI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0NPTVAxX0FDXzBfRENfMQkoMSA8PCA2KQorI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0NPTVAxX0FDXzFfRENfMAkoMiA8PCA2KQorI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0NPTVAxX0FDXzFfRENfMQkoMyA8PCA2KQorCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfQ09NUDJfQUNfMF9EQ18wCSgwIDw8IDgpCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfQ09NUDJfQUNfMF9EQ18xCSgxIDw8IDgpCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfQ09NUDJfQUNfMV9EQ18wCSgyIDw8IDgpCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfQ09NUDJfQUNfMV9EQ18xCSgzIDw8IDgpCisKKyNkZWZpbmUgRVhZTk9TNF9IVUZGX1RCTF9DT01QM19BQ18wX0RDXzAJKDAgPDwgMTApCisjZGVmaW5lIEVYWU5PUzRfSFVGRl9UQkxfQ09NUDNfQUNfMF9EQ18xCSgxIDw8IDEwKQorI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0NPTVAzX0FDXzFfRENfMAkoMiA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TNF9IVUZGX1RCTF9DT01QM19BQ18xX0RDXzEJKDMgPDwgMTApCisKKy8qIEpQRUcgcXVhbnRpemVyIHRhYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIEVYWU5PUzRfUVRCTF9DT05URU5UKG4pCSgweDEwMCArIChuKSAqIDB4NDApCisKKy8qIEpQRUcgREMgbHVtaW5hbmNlIChjb2RlIGxlbmd0aCkgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hEQ0xMCTB4MjAwCisKKy8qIEpQRUcgREMgbHVtaW5hbmNlICh2YWx1ZXMpIEh1ZmZtYW4gdGFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVhZTk9TNF9IVUZGX1RCTF9IRENMVgkweDIxMAorCisvKiBKUEVHIERDIGNocm9taW5hbmNlIChjb2RlIGxlbmd0aCkgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hEQ0NMCTB4MjIwCisKKy8qIEpQRUcgREMgY2hyb21pbmFuY2UgKHZhbHVlcykgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hEQ0NWCTB4MjMwCisKKy8qIEpQRUcgQUMgbHVtaW5hbmNlIChjb2RlIGxlbmd0aCkgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hBQ0xMCTB4MjQwCisKKy8qIEpQRUcgQUMgbHVtaW5hbmNlICh2YWx1ZXMpIEh1ZmZtYW4gdGFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVhZTk9TNF9IVUZGX1RCTF9IQUNMVgkweDI1MAorCisvKiBKUEVHIEFDIGNocm9taW5hbmNlIChjb2RlIGxlbmd0aCkgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hBQ0NMCTB4MzAwCisKKy8qIEpQRUcgQUMgY2hyb21pbmFuY2UgKHZhbHVlcykgSHVmZm1hbiB0YWJsZSByZWdpc3RlciAqLworI2RlZmluZSBFWFlOT1M0X0hVRkZfVEJMX0hBQ0NWCTB4MzEwCisKICNlbmRpZiAvKiBKUEVHX1JFR1NfSF8gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjLmMKaW5kZXggZTQ2MDY3YS4uZTJhYWM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mYy5jCkBAIC0xNzcsMjEgKzE3Nyw2IEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5tZmNfbXV0ZXgpOwogfQogCi1zdGF0aWMgZW51bSBzNXBfbWZjX25vZGVfdHlwZSBzNXBfbWZjX2dldF9ub2RlX3R5cGUoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0KLQlpZiAoIXZkZXYpIHsKLQkJbWZjX2VycigiZmFpbGVkIHRvIGdldCB2aWRlb19kZXZpY2UiKTsKLQkJcmV0dXJuIE1GQ05PREVfSU5WQUxJRDsKLQl9Ci0JaWYgKHZkZXYtPmluZGV4ID09IDApCi0JCXJldHVybiBNRkNOT0RFX0RFQ09ERVI7Ci0JZWxzZSBpZiAodmRldi0+aW5kZXggPT0gMSkKLQkJcmV0dXJuIE1GQ05PREVfRU5DT0RFUjsKLQlyZXR1cm4gTUZDTk9ERV9JTlZBTElEOwotfQotCiBzdGF0aWMgdm9pZCBzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKIHsKIAltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9SSVNDX0hPU1RfSU5UKTsKQEAgLTcwNSw2ICs2OTAsNyBAQAogLyogT3BlbiBhbiBNRkMgbm9kZSAqLwogc3RhdGljIGludCBzNXBfbWZjX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gTlVMTDsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICpxOwpAQCAtNzQyLDcgKzcyOCw3IEBACiAJLyogTWFyayBjb250ZXh0IGFzIGlkbGUgKi8KIAljbGVhcl93b3JrX2JpdF9pcnFzYXZlKGN0eCk7CiAJZGV2LT5jdHhbY3R4LT5udW1dID0gY3R4OwotCWlmIChzNXBfbWZjX2dldF9ub2RlX3R5cGUoZmlsZSkgPT0gTUZDTk9ERV9ERUNPREVSKSB7CisJaWYgKHZkZXYgPT0gZGV2LT52ZmRfZGVjKSB7CiAJCWN0eC0+dHlwZSA9IE1GQ0lOU1RfREVDT0RFUjsKIAkJY3R4LT5jX29wcyA9IGdldF9kZWNfY29kZWNfb3BzKCk7CiAJCXM1cF9tZmNfZGVjX2luaXQoY3R4KTsKQEAgLTc1Miw3ICs3MzgsNyBAQAogCQkJbWZjX2VycigiRmFpbGVkIHRvIHNldHVwIG1mYyBjb250cm9sc1xuIik7CiAJCQlnb3RvIGVycl9jdHJsc19zZXR1cDsKIAkJfQotCX0gZWxzZSBpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfRU5DT0RFUikgeworCX0gZWxzZSBpZiAodmRldiA9PSBkZXYtPnZmZF9lbmMpIHsKIAkJY3R4LT50eXBlID0gTUZDSU5TVF9FTkNPREVSOwogCQljdHgtPmNfb3BzID0gZ2V0X2VuY19jb2RlY19vcHMoKTsKIAkJLyogb25seSBmb3IgZW5jb2RlciAqLwpAQCAtNzk3LDEwICs3ODMsMTAgQEAKIAlxID0gJmN0eC0+dnFfZHN0OwogCXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwogCXEtPmRydl9wcml2ID0gJmN0eC0+Zmg7Ci0JaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0RFQ09ERVIpIHsKKwlpZiAodmRldiA9PSBkZXYtPnZmZF9kZWMpIHsKIAkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKIAkJcS0+b3BzID0gZ2V0X2RlY19xdWV1ZV9vcHMoKTsKLQl9IGVsc2UgaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0VOQ09ERVIpIHsKKwl9IGVsc2UgaWYgKHZkZXYgPT0gZGV2LT52ZmRfZW5jKSB7CiAJCXEtPmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKIAkJcS0+b3BzID0gZ2V0X2VuY19xdWV1ZV9vcHMoKTsKIAl9IGVsc2UgewpAQCAtODE5LDEwICs4MDUsMTAgQEAKIAlxLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwogCXEtPmlvX21vZGVzID0gVkIyX01NQVA7CiAJcS0+ZHJ2X3ByaXYgPSAmY3R4LT5maDsKLQlpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfREVDT0RFUikgeworCWlmICh2ZGV2ID09IGRldi0+dmZkX2RlYykgewogCQlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOwogCQlxLT5vcHMgPSBnZXRfZGVjX3F1ZXVlX29wcygpOwotCX0gZWxzZSBpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfRU5DT0RFUikgeworCX0gZWxzZSBpZiAodmRldiA9PSBkZXYtPnZmZF9lbmMpIHsKIAkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOwogCQlxLT5vcHMgPSBnZXRfZW5jX3F1ZXVlX29wcygpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2NvbW1vbi5oCmluZGV4IDY5MjBiNTQuLmY3MjNmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2NvbW1vbi5oCkBAIC0xMTUsMTUgKzExNSw2IEBACiB9OwogCiAvKioKLSAqIGVudW0gczVwX21mY19ub2RlX3R5cGUgLSBUaGUgdHlwZSBvZiBhbiBNRkMgZGV2aWNlIG5vZGUuCi0gKi8KLWVudW0gczVwX21mY19ub2RlX3R5cGUgewotCU1GQ05PREVfSU5WQUxJRCA9IC0xLAotCU1GQ05PREVfREVDT0RFUiA9IDAsCi0JTUZDTk9ERV9FTkNPREVSID0gMSwKLX07Ci0KLS8qKgogICogZW51bSBzNXBfbWZjX2luc3RfdHlwZSAtIFRoZSB0eXBlIG9mIGFuIE1GQyBpbnN0YW5jZS4KICAqLwogZW51bSBzNXBfbWZjX2luc3RfdHlwZSB7CkBAIC00MjIsNiArNDEzLDExIEBACiAJZW51bSB2NGwyX3ZwOF9nb2xkZW5fZnJhbWVfc2VsIGdvbGRlbl9mcmFtZV9zZWw7CiAJdTggaGllcl9sYXllcjsKIAl1OCBoaWVyX2xheWVyX3FwWzNdOworCXU4IHJjX21pbl9xcDsKKwl1OCByY19tYXhfcXA7CisJdTggcmNfZnJhbWVfcXA7CisJdTggcmNfcF9mcmFtZV9xcDsKKwl1OCBwcm9maWxlOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19lbmMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2VuYy5jCmluZGV4IDRmZjNiNmMuLjkxYjZlMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2VuYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2VuYy5jCkBAIC02MTgsNiArNjE4LDQ2IEBACiAJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9DSURfTVBFR19WSURFT19WUFhfR09MREVOX0ZSQU1FX1VTRV9QUkVWLAogCQkubWVudV9za2lwX21hc2sgPSAwLAogCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9NQVhfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEyNywKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEyNywKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19WUFhfTUlOX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0lfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEyNywKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9QX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxMjcsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19WUFhfUFJPRklMRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMywKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKIH07CiAKICNkZWZpbmUgTlVNX0NUUkxTIEFSUkFZX1NJWkUoY29udHJvbHMpCkBAIC0xNTU3LDYgKzE1OTcsMjEgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0dPTERFTl9GUkFNRV9TRUw6CiAJCXAtPmNvZGVjLnZwOC5nb2xkZW5fZnJhbWVfc2VsID0gY3RybC0+dmFsOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01JTl9RUDoKKwkJcC0+Y29kZWMudnA4LnJjX21pbl9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9NQVhfUVA6CisJCXAtPmNvZGVjLnZwOC5yY19tYXhfcXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19WUFhfSV9GUkFNRV9RUDoKKwkJcC0+Y29kZWMudnA4LnJjX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BfRlJBTUVfUVA6CisJCXAtPmNvZGVjLnZwOC5yY19wX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BST0ZJTEU6CisJCXAtPmNvZGVjLnZwOC5wcm9maWxlID0gY3RybC0+dmFsOworCQlicmVhazsKIAlkZWZhdWx0OgogCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkludmFsaWQgY29udHJvbCwgaWQ9JWQsIHZhbD0lZFxuIiwKIAkJCQkJCQljdHJsLT5pZCwgY3RybC0+dmFsKTsKQEAgLTE4NjMsNyArMTkxOCw3IEBACiAJCWlmIChjdHgtPnNyY19idWZzX2NudCA8IGN0eC0+cGJfY291bnQpIHsKIAkJCW1mY19lcnIoIk5lZWQgbWluaW11bSAlZCBPVVRQVVQgYnVmZmVyc1xuIiwKIAkJCQkJY3R4LT5wYl9jb3VudCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAtRU5PQlVGUzsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByX3Y2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYwppbmRleCA0NjEzNThjLi5mNmZmMmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYwpAQCAtMTE5NywxMCArMTE5Nyw4IEBACiAJcmVnIHw9ICgocC0+bnVtX2JfZnJhbWUgJiAweDMpIDw8IDE2KTsKIAlXUklURUwocmVnLCBTNVBfRklNVl9FX0dPUF9DT05GSUdfVjYpOwogCi0JLyogcHJvZmlsZSAmIGxldmVsICovCi0JcmVnID0gMDsKLQkvKiogcHJvZmlsZSAqLwotCXJlZyB8PSAoMHgxIDw8IDQpOworCS8qIHByb2ZpbGUgLSAwIH4gMyAqLworCXJlZyA9IHBfdnA4LT5wcm9maWxlICYgMHgzOwogCVdSSVRFTChyZWcsIFM1UF9GSU1WX0VfUElDVFVSRV9QUk9GSUxFX1Y2KTsKIAogCS8qIHJhdGUgY29udHJvbCBjb25maWcuICovCkBAIC0xMjE4LDYgKzEyMTYsMjYgQEAKIAkJV1JJVEVMKHJlZywgUzVQX0ZJTVZfRV9SQ19GUkFNRV9SQVRFX1Y2KTsKIAl9CiAKKwkvKiBmcmFtZSBRUCAqLworCXJlZyAmPSB+KDB4N0YpOworCXJlZyB8PSBwX3ZwOC0+cmNfZnJhbWVfcXAgJiAweDdGOworCVdSSVRFTChyZWcsIFM1UF9GSU1WX0VfUkNfQ09ORklHX1Y2KTsKKworCS8qIG90aGVyIFFQcyAqLworCVdSSVRFTCgweDAsIFM1UF9GSU1WX0VfRklYRURfUElDVFVSRV9RUF9WNik7CisJaWYgKCFwLT5yY19mcmFtZSAmJiAhcC0+cmNfbWIpIHsKKwkJcmVnID0gMDsKKwkJcmVnIHw9ICgocF92cDgtPnJjX3BfZnJhbWVfcXAgJiAweDdGKSA8PCA4KTsKKwkJcmVnIHw9IHBfdnA4LT5yY19mcmFtZV9xcCAmIDB4N0Y7CisJCVdSSVRFTChyZWcsIFM1UF9GSU1WX0VfRklYRURfUElDVFVSRV9RUF9WNik7CisJfQorCisJLyogbWF4IFFQICovCisJcmVnID0gKChwX3ZwOC0+cmNfbWF4X3FwICYgMHg3RikgPDwgOCk7CisJLyogbWluIFFQICovCisJcmVnIHw9IHBfdnA4LT5yY19taW5fcXAgJiAweDdGOworCVdSSVRFTChyZWcsIFM1UF9GSU1WX0VfUkNfUVBfQk9VTkRfVjYpOworCiAJLyogdmJ2IGJ1ZmZlciBzaXplICovCiAJaWYgKHAtPmZyYW1lX3NraXBfbW9kZSA9PQogCQkJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L21peGVyX2Rydi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvbWl4ZXJfZHJ2LmMKaW5kZXggNTE4MDVhNS4uYmMwOGI1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvbWl4ZXJfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvbWl4ZXJfZHJ2LmMKQEAgLTM0NywxOSArMzQ3LDQxIEBACiB7CiAJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSB0b19tZGV2KGRldik7CiAJc3RydWN0IG14cl9yZXNvdXJjZXMgKnJlcyA9ICZtZGV2LT5yZXM7CisJaW50IHJldDsKIAogCW14cl9kYmcobWRldiwgInJlc3VtZSAtIHN0YXJ0XG4iKTsKIAltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CiAJLyogdHVybiBjbG9ja3Mgb24gKi8KLQljbGtfZW5hYmxlKHJlcy0+bWl4ZXIpOwotCWNsa19lbmFibGUocmVzLT52cCk7Ci0JY2xrX2VuYWJsZShyZXMtPnNjbGtfbWl4ZXIpOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShyZXMtPm1peGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKG1kZXYtPmRldiwgImNsa19wcmVwYXJlX2VuYWJsZShtaXhlcikgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocmVzLT52cCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihtZGV2LT5kZXYsICJjbGtfcHJlcGFyZV9lbmFibGUodnApIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbF9taXhlcjsKKwl9CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJlcy0+c2Nsa19taXhlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihtZGV2LT5kZXYsICJjbGtfcHJlcGFyZV9lbmFibGUoc2Nsa19taXhlcikgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsX3ZwOworCX0KIAkvKiBhcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KIAlteHJfcmVnX3Jlc2V0KG1kZXYpOwogCW14cl9kYmcobWRldiwgInJlc3VtZSAtIGZpbmlzaGVkXG4iKTsKIAogCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOwogCXJldHVybiAwOworCitmYWlsX3ZwOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShyZXMtPnZwKTsKK2ZhaWxfbWl4ZXI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJlcy0+bWl4ZXIpOworZmFpbDoKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwlkZXZfZXJyKG1kZXYtPmRldiwgInJlc3VtZSBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbXhyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zNjksOSArMzkxLDkgQEAKIAlteHJfZGJnKG1kZXYsICJzdXNwZW5kIC0gc3RhcnRcbiIpOwogCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKIAkvKiB0dXJuIGNsb2NrcyBvZmYgKi8KLQljbGtfZGlzYWJsZShyZXMtPnNjbGtfbWl4ZXIpOwotCWNsa19kaXNhYmxlKHJlcy0+dnApOwotCWNsa19kaXNhYmxlKHJlcy0+bWl4ZXIpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShyZXMtPnNjbGtfbWl4ZXIpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShyZXMtPnZwKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmVzLT5taXhlcik7CiAJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CiAJbXhyX2RiZyhtZGV2LCAic3VzcGVuZCAtIGZpbmlzaGVkXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L21peGVyX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC10di9taXhlcl92aWRlby5jCmluZGV4IDgxYjk3ZGIuLmM1MDU5YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L21peGVyX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvbWl4ZXJfdmlkZW8uYwpAQCAtOTQ4LDcgKzk0OCw3IEBACiAKIAlpZiAoY291bnQgPT0gMCkgewogCQlteHJfZGJnKG1kZXYsICJubyBvdXRwdXQgYnVmZmVycyBxdWV1ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9CVUZTOwogCX0KIAogCS8qIGJsb2NrIGFueSBjaGFuZ2VzIGluIG91dHB1dCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC10di9zZG9fZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC10di9zZG9fZHJ2LmMKaW5kZXggMGFmYTkwZi4uNWE3YzM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvc2RvX2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L3Nkb19kcnYuYwpAQCAtNTUsNiArNTUsOCBAQAogCXN0cnVjdCBjbGsgKmRhY3BoeTsKIAkvKiogY2xvY2sgZm9yIGNvbnRyb2wgb2YgVlBMTCAqLwogCXN0cnVjdCBjbGsgKmZvdXRfdnBsbDsKKwkvKiogdnBsbCByYXRlIGJlZm9yZSBzZG8gc3RyZWFtIHdhcyBvbiAqLworCXVuc2lnbmVkIGxvbmcgdnBsbF9yYXRlOwogCS8qKiByZWd1bGF0b3IgZm9yIFNETyBJUCBwb3dlciAqLwogCXN0cnVjdCByZWd1bGF0b3IgKnZkYWM7CiAJLyoqIHJlZ3VsYXRvciBmb3IgU0RPIHBsdWcgZGV0ZWN0aW9uICovCkBAIC0xOTMsMTcgKzE5NSwzMyBAQAogCiBzdGF0aWMgaW50IHNkb19zdHJlYW1vbihzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldikKIHsKKwlpbnQgcmV0OworCiAJLyogc2V0IHByb3BlciBjbG9jayBmb3IgVGltaW5nIEdlbmVyYXRvciAqLwotCWNsa19zZXRfcmF0ZShzZGV2LT5mb3V0X3ZwbGwsIDU0MDAwMDAwKTsKKwlzZGV2LT52cGxsX3JhdGUgPSBjbGtfZ2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsKTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsLCA1NDAwMDAwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihzZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IHZwbGwgcmF0ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQogCWRldl9pbmZvKHNkZXYtPmRldiwgImZvdXRfdnBsbC5yYXRlID0gJWx1XG4iLAogCWNsa19nZXRfcmF0ZShzZGV2LT5mb3V0X3ZwbGwpKTsKIAkvKiBlbmFibGUgY2xvY2sgaW4gU0RPICovCiAJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0NMS0NPTiwgfjAsIFNET19UVk9VVF9DTE9DS19PTik7Ci0JY2xrX2VuYWJsZShzZGV2LT5kYWNwaHkpOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzZGV2LT5kYWNwaHkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoc2Rldi0+ZGV2LCAiY2xrX3ByZXBhcmVfZW5hYmxlKGRhY3BoeSkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KIAkvKiBlbmFibGUgREFDICovCiAJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0RBQywgfjAsIFNET19QT1dFUl9PTl9EQUMpOwogCXNkb19yZWdfZGVidWcoc2Rldik7CiAJcmV0dXJuIDA7CisKK2ZhaWw6CisJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0NMS0NPTiwgMCwgU0RPX1RWT1VUX0NMT0NLX09OKTsKKwljbGtfc2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsLCBzZGV2LT52cGxsX3JhdGUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc2RvX3N0cmVhbW9mZihzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldikKQEAgLTIxMSw3ICsyMjksNyBAQAogCWludCB0cmllczsKIAogCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19EQUMsIDAsIFNET19QT1dFUl9PTl9EQUMpOwotCWNsa19kaXNhYmxlKHNkZXYtPmRhY3BoeSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPmRhY3BoeSk7CiAJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0NMS0NPTiwgMCwgU0RPX1RWT1VUX0NMT0NLX09OKTsKIAlmb3IgKHRyaWVzID0gMTAwOyB0cmllczsgLS10cmllcykgewogCQlpZiAoc2RvX3JlYWQoc2RldiwgU0RPX0NMS0NPTikgJiBTRE9fVFZPVVRfQ0xPQ0tfUkVBRFkpCkBAIC0yMjAsNiArMjM4LDcgQEAKIAl9CiAJaWYgKHRyaWVzID09IDApCiAJCWRldl9lcnIoc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHN0b3Agc3RyZWFtaW5nXG4iKTsKKwljbGtfc2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsLCBzZGV2LT52cGxsX3JhdGUpOwogCXJldHVybiB0cmllcyA/IDAgOiAtRUlPOwogfQogCkBAIC0yNTQsNyArMjczLDcgQEAKIAlkZXZfaW5mbyhkZXYsICJzdXNwZW5kXG4iKTsKIAlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGV0KTsKIAlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGFjKTsKLQljbGtfZGlzYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPnNjbGtfZGFjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY2LDcgKzI4NSw3IEBACiAKIAlkZXZfaW5mbyhkZXYsICJyZXN1bWVcbiIpOwogCi0JcmV0ID0gY2xrX2VuYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNkZXYtPnNjbGtfZGFjKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjk5LDcgKzMxOCw3IEBACiB2ZGFjX3JfZGlzOgogCXJlZ3VsYXRvcl9kaXNhYmxlKHNkZXYtPnZkYWMpOwogZGFjX2Nsa19kaXM6Ci0JY2xrX2Rpc2FibGUoc2Rldi0+c2Nsa19kYWMpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzZGV2LT5zY2xrX2RhYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA1LDcgKzQyNCwxMSBAQAogCX0KIAogCS8qIGVuYWJsZSBnYXRlIGZvciBkYWMgY2xvY2ssIGJlY2F1c2UgbWl4ZXIgdXNlcyBpdCAqLwotCWNsa19lbmFibGUoc2Rldi0+ZGFjKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2Rldi0+ZGFjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNsa19wcmVwYXJlX2VuYWJsZShkYWMpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbF9mb3V0X3ZwbGw7CisJfQogCiAJLyogY29uZmlndXJlIHBvd2VyIG1hbmFnZW1lbnQgKi8KIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwpAQCAtNDQ0LDcgKzQ2Nyw3IEBACiAJc3RydWN0IHNkb19kZXZpY2UgKnNkZXYgPSBzZF90b19zZGV2KHNkKTsKIAogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQljbGtfZGlzYWJsZShzZGV2LT5kYWMpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzZGV2LT5kYWMpOwogCWNsa19wdXQoc2Rldi0+Zm91dF92cGxsKTsKIAljbGtfcHV0KHNkZXYtPmRhY3BoeSk7CiAJY2xrX3B1dChzZGV2LT5kYWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zaF92b3UuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc2hfdm91LmMKaW5kZXggNGYzMDM0MS4uZTVmMWQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zaF92b3UuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NoX3ZvdS5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAl2Yi0+c2l6ZSA9IHZiLT5oZWlnaHQgKiBieXRlc19wZXJfbGluZTsKIAlpZiAodmItPmJhZGRyICYmIHZiLT5ic2l6ZSA8IHZiLT5zaXplKSB7CiAJCS8qIFVzZXIgYnVmZmVyIHRvbyBzbWFsbCAqLwotCQlkZXZfd2Fybih2cS0+ZGV2LCAiVXNlciBidWZmZXIgdG9vIHNtYWxsOiBbJXVdIEAgJWx4XG4iLAorCQlkZXZfd2Fybih2cS0+ZGV2LCAiVXNlciBidWZmZXIgdG9vIHNtYWxsOiBbJXp1XSBAICVseFxuIiwKIAkJCSB2Yi0+YnNpemUsIHZiLT5iYWRkcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMwMiw5ICszMDIsMTAgQEAKIAl9CiAKIAlkZXZfZGJnKHZvdV9kZXYtPnY0bDJfZGV2LmRldiwKLQkJIiVzKCk6IGZtdCAjJWQsICV1IGJ5dGVzIHBlciBsaW5lLCBwaHlzIDB4JXgsIHR5cGUgJWQsIHN0YXRlICVkXG4iLAorCQkiJXMoKTogZm10ICMlZCwgJXUgYnl0ZXMgcGVyIGxpbmUsIHBoeXMgJXBhZCwgdHlwZSAlZCwgc3RhdGUgJWRcbiIsCiAJCV9fZnVuY19fLCB2b3VfZGV2LT5waXhfaWR4LCBieXRlc19wZXJfbGluZSwKLQkJdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YiksIHZiLT5tZW1vcnksIHZiLT5zdGF0ZSk7CisJCSh7IGRtYV9hZGRyX3QgYWRkciA9IHZpZGVvYnVmX3RvX2RtYV9jb250aWcodmIpOyAmYWRkcjsgfSksCisJCXZiLT5tZW1vcnksIHZiLT5zdGF0ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0Miw3ICs0NDMsNyBAQAogCQkJCSAgICAgIGludCBwaXhfaWR4LCBpbnQgd19pZHgsIGludCBoX2lkeCkKIHsKIAlzdHJ1Y3Qgc2hfdm91X2ZtdCAqZm10ID0gdm91X2ZtdCArIHBpeF9pZHg7Ci0JdW5zaWduZWQgaW50IGJsYWNrX2xlZnQsIGJsYWNrX3RvcCwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4LAorCXVuc2lnbmVkIGludCBibGFja19sZWZ0LCBibGFja190b3AsIHdpZHRoX21heCwKIAkJZnJhbWVfaW5faGVpZ2h0LCBmcmFtZV9vdXRfaGVpZ2h0LCBmcmFtZV9vdXRfdG9wOwogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmdm91X2Rldi0+cmVjdDsKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmdm91X2Rldi0+cGl4OwpAQCAtNDUwLDEwICs0NTEsMTAgQEAKIAogCWlmICh2b3VfZGV2LT5zdGQgJiBWNEwyX1NURF81MjVfNjApIHsKIAkJd2lkdGhfbWF4ID0gODU4OwotCQloZWlnaHRfbWF4ID0gMjYyOworCQkvKiBoZWlnaHRfbWF4ID0gMjYyOyAqLwogCX0gZWxzZSB7CiAJCXdpZHRoX21heCA9IDg2NDsKLQkJaGVpZ2h0X21heCA9IDMxMjsKKwkJLyogaGVpZ2h0X21heCA9IDMxMjsgKi8KIAl9CiAKIAlmcmFtZV9pbl9oZWlnaHQgPSBwaXgtPmhlaWdodCAvIDI7CkBAIC0xMDUyLDcgKzEwNTMsNiBAQAogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGo7CiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CiAJc3RhdGljIGludCBjbnQ7Ci0Jc3RhdGljIGludCBzaWRlOwogCXUzMiBpcnFfc3RhdHVzID0gc2hfdm91X3JlZ19hX3JlYWQodm91X2RldiwgVk9VSVIpLCBtYXNrZWQ7CiAJdTMyIHZvdV9zdGF0dXMgPSBzaF92b3VfcmVnX2FfcmVhZCh2b3VfZGV2LCBWT1VTVFIpOwogCkBAIC0xMDgwLDcgKzEwODAsNyBAQAogCQlpcnFfc3RhdHVzLCBtYXNrZWQsIHZvdV9zdGF0dXMsIGNudCk7CiAKIAljbnQrKzsKLQlzaWRlID0gdm91X3N0YXR1cyAmIDB4MTAwMDA7CisJLyogc2lkZSA9IHZvdV9zdGF0dXMgJiAweDEwMDAwOyAqLwogCiAJLyogQ2xlYXIgb25seSBzZXQgaW50ZXJydXB0cyAqLwogCXNoX3ZvdV9yZWdfYV93cml0ZSh2b3VfZGV2LCBWT1VJUiwgbWFza2VkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9hdG1lbC1pc2kuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9hdG1lbC1pc2kuYwppbmRleCAxMDQ0ODU2Li40ODM1MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvYXRtZWwtaXNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL2F0bWVsLWlzaS5jCkBAIC0zNCwxMyArMzQsNiBAQAogI2RlZmluZSBNSU5fRlJBTUVfUkFURQkJCTE1CiAjZGVmaW5lIEZSQU1FX0lOVEVSVkFMX01JTExJX1NFQwkoMTAwMCAvIE1JTl9GUkFNRV9SQVRFKQogCi0vKiBJU0kgc3RhdGVzICovCi1lbnVtIHsKLQlJU0lfU1RBVEVfSURMRSA9IDAsCi0JSVNJX1NUQVRFX1JFQURZLAotCUlTSV9TVEFURV9XQUlUX1NPRiwKLX07Ci0KIC8qIEZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9yICovCiBzdHJ1Y3QgZmJkIHsKIAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIgKi8KQEAgLTc1LDExICs2OCw2IEBACiAJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CiAKIAlpbnQJCQkJc2VxdWVuY2U7Ci0JLyogU3RhdGUgb2YgdGhlIElTSSBtb2R1bGUgaW4gY2FwdHVyaW5nIG1vZGUgKi8KLQlpbnQJCQkJc3RhdGU7Ci0KLQkvKiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBTT0YgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAkJdnN5bmNfd3E7CiAKIAlzdHJ1Y3QgdmIyX2FsbG9jX2N0eAkJKmFsbG9jX2N0eDsKIApAQCAtMTI0LDE2ICsxMTIsMTYgQEAKIAljYXNlIFY0TDJfTUJVU19GTVRfWThfMVg4OgogCQljciA9IElTSV9DRkcyX0dSQVlTQ0FMRTsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfVllVWThfMlg4OgogCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMzsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgogCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMjsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4OgogCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMTsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgogCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX0RFRkFVTFQ7CiAJCWJyZWFrOwogCS8qIFJHQiwgVE9ETyAqLwpAQCAtMTQ0LDYgKzEzMiw4IEBACiAJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9ESVMpOwogCiAJY2ZnMiA9IGlzaV9yZWFkbChpc2ksIElTSV9DRkcyKTsKKwkvKiBTZXQgWUNDIHN3YXAgbW9kZSAqLworCWNmZzIgJj0gfklTSV9DRkcyX1lDQ19TV0FQX01PREVfTUFTSzsKIAljZmcyIHw9IGNyOwogCS8qIFNldCB3aWR0aCAqLwogCWNmZzIgJj0gfihJU0lfQ0ZHMl9JTV9IU0laRV9NQVNLKTsKQEAgLTIwNywxMiArMTk3LDYgQEAKIAkJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9DVFJMX0RJUyk7CiAJCXJldCA9IElSUV9IQU5ETEVEOwogCX0gZWxzZSB7Ci0JCWlmICgocGVuZGluZyAmIElTSV9TUl9WU1lOQykgJiYKLQkJCQkoaXNpLT5zdGF0ZSA9PSBJU0lfU1RBVEVfSURMRSkpIHsKLQkJCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfUkVBRFk7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlzaS0+dnN5bmNfd3EpOwotCQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0JCX0KIAkJaWYgKGxpa2VseShwZW5kaW5nICYgSVNJX1NSX0NYRlJfRE9ORSkpCiAJCQlyZXQgPSBhdG1lbF9pc2lfaGFuZGxlX3N0cmVhbWluZyhpc2kpOwogCX0KQEAgLTI1OSwxNiArMjQzLDYgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0JaW50IHJldDsKLQotCS8qIFJlc2V0IElTSSAqLwotCXJldCA9IGF0bWVsX2lzaV93YWl0X3N0YXR1cyhpc2ksIFdBSVRfSVNJX1JFU0VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiUmVzZXQgSVNJIHRpbWVkIG91dFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgfjBVTCk7CiAKIAlzaXplID0gaWNkLT5zaXplaW1hZ2U7CiAKQEAgLTM3NCw2ICszNDgsNyBAQAogCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NfQ1RSTCwgSVNJX0RNQV9DVFJMX0ZFVENIIHwgSVNJX0RNQV9DVFJMX0RPTkUpOwogCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NIRVIsIElTSV9ETUFfQ0hTUl9DX0NIKTsKIAorCWNmZzEgJj0gfklTSV9DRkcxX0ZSQVRFX0RJVl9NQVNLOwogCS8qIEVuYWJsZSBsaW5rZWQgbGlzdCAqLwogCWNmZzEgfD0gaXNpLT5wZGF0YS0+ZnJhdGUgfCBJU0lfQ0ZHMV9ESVNDUjsKIApAQCAtNDA3LDQzICszODIsMjcgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKLQogCXUzMiBzciA9IDA7CiAJaW50IHJldDsKIAotCXNwaW5fbG9ja19pcnEoJmlzaS0+bG9jayk7Ci0JaXNpLT5zdGF0ZSA9IElTSV9TVEFURV9JRExFOwotCS8qIENsZWFyIGFueSBwZW5kaW5nIFNPRiBpbnRlcnJ1cHQgKi8KLQlzciA9IGlzaV9yZWFkbChpc2ksIElTSV9TVEFUVVMpOwotCS8qIEVuYWJsZSBWU1lOQyBpbnRlcnJ1cHQgZm9yIFNPRiAqLwotCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URU4sIElTSV9TUl9WU1lOQyk7Ci0JaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9FTik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOwotCi0JZGV2X2RiZyhpY2QtPnBhcmVudCwgIldhaXRpbmcgZm9yIFNPRlxuIik7Ci0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGlzaS0+dnN5bmNfd3EsCi0JCQkJICAgICAgIGlzaS0+c3RhdGUgIT0gSVNJX1NUQVRFX0lETEUpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JaWYgKGlzaS0+c3RhdGUgIT0gSVNJX1NUQVRFX1JFQURZKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyOworCS8qIFJlc2V0IElTSSAqLworCXJldCA9IGF0bWVsX2lzaV93YWl0X3N0YXR1cyhpc2ksIFdBSVRfSVNJX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiUmVzZXQgSVNJIHRpbWVkIG91dFxuIik7CisJCXJldHVybiByZXQ7CiAJfQorCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgfjBVTCk7CiAKIAlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOwotCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfV0FJVF9TT0Y7Ci0JaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9TUl9WU1lOQyk7CisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0ICovCisJc3IgPSBpc2lfcmVhZGwoaXNpLCBJU0lfU1RBVFVTKTsKKwogCWlmIChjb3VudCkKIAkJc3RhcnRfZG1hKGlzaSwgaXNpLT5hY3RpdmUpOwogCXNwaW5fdW5sb2NrX2lycSgmaXNpLT5sb2NrKTsKIAogCXJldHVybiAwOwotZXJyOgotCWlzaS0+YWN0aXZlID0gTlVMTDsKLQlpc2ktPnNlcXVlbmNlID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmaXNpLT52aWRlb19idWZmZXJfbGlzdCk7Ci0JcmV0dXJuIHJldDsKIH0KIAogLyogYWJvcnQgc3RyZWFtaW5nIGFuZCB3YWl0IGZvciBsYXN0IGJ1ZmZlciAqLwpAQCAtNzY1LDE0ICs3MjQsMTYgQEAKIAlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIAotCXJldCA9IGNsa19lbmFibGUoaXNpLT5wY2xrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaXNpLT5wY2xrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gY2xrX2VuYWJsZShpc2ktPm1jayk7Ci0JaWYgKHJldCkgewotCQljbGtfZGlzYWJsZShpc2ktPnBjbGspOwotCQlyZXR1cm4gcmV0OworCWlmICghSVNfRVJSKGlzaS0+bWNrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaXNpLT5tY2spOworCQlpZiAocmV0KSB7CisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaXNpLT5wY2xrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTc4Myw4ICs3NDQsOSBAQAogewogCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKIAotCWNsa19kaXNhYmxlKGlzaS0+bWNrKTsKLQljbGtfZGlzYWJsZShpc2ktPnBjbGspOworCWlmICghSVNfRVJSKGlzaS0+bWNrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGlzaS0+bWNrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaXNpLT5wY2xrKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpc2lfY2FtZXJhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQpAQCAtOTA2LDcgKzg2OCw2IEBACiAJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gY29udGFpbmVyX29mKHNvY19ob3N0LAogCQkJCQlzdHJ1Y3QgYXRtZWxfaXNpLCBzb2NfaG9zdCk7CiAKLQlmcmVlX2lycShpc2ktPmlycSwgaXNpKTsKIAlzb2NfY2FtZXJhX2hvc3RfdW5yZWdpc3Rlcihzb2NfaG9zdCk7CiAJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoaXNpLT5hbGxvY19jdHgpOwogCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCkBAIC05MTQsMTMgKzg3NSw2IEBACiAJCQlpc2ktPnBfZmJfZGVzY3JpcHRvcnMsCiAJCQlpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMpOwogCi0JaW91bm1hcChpc2ktPnJlZ3MpOwotCWNsa191bnByZXBhcmUoaXNpLT5tY2spOwotCWNsa19wdXQoaXNpLT5tY2spOwotCWNsa191bnByZXBhcmUoaXNpLT5wY2xrKTsKLQljbGtfcHV0KGlzaS0+cGNsayk7Ci0Ja2ZyZWUoaXNpKTsKLQogCXJldHVybiAwOwogfQogCkBAIC05MjgsNyArODgyLDYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXN0cnVjdCBhdG1lbF9pc2kgKmlzaTsKLQlzdHJ1Y3QgY2xrICpwY2xrOwogCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKIAlpbnQgcmV0LCBpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC05MzYsNjQgKzg4OSw1MCBAQAogCXN0cnVjdCBpc2lfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAKIAlwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+ZGF0YV93aWR0aF9mbGFncyB8fCAhcGRhdGEtPm1ja19oeikgeworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5kYXRhX3dpZHRoX2ZsYWdzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJObyBjb25maWcgYXZhaWxhYmxlIGZvciBBdG1lbCBJU0lcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlZ3MpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaXNpX2NsayIpOwotCWlmIChJU19FUlIocGNsaykpCi0JCXJldHVybiBQVFJfRVJSKHBjbGspOwotCi0JcmV0ID0gY2xrX3ByZXBhcmUocGNsayk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfY2xrX3ByZXBhcmVfcGNsazsKLQotCWlzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1lbF9pc2kpLCBHRlBfS0VSTkVMKTsKKwlpc2kgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBhdG1lbF9pc2kpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlzaSkgewotCQlyZXQgPSAtRU5PTUVNOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBpbnRlcmZhY2UhXG4iKTsKLQkJZ290byBlcnJfYWxsb2NfaXNpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpc2ktPnBjbGsgPSBwY2xrOworCWlzaS0+cGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiaXNpX2NsayIpOworCWlmIChJU19FUlIoaXNpLT5wY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoaXNpLT5wY2xrKTsKKwogCWlzaS0+cGRhdGEgPSBwZGF0YTsKIAlpc2ktPmFjdGl2ZSA9IE5VTEw7CiAJc3Bpbl9sb2NrX2luaXQoJmlzaS0+bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmaXNpLT52c3luY193cSk7CiAJSU5JVF9MSVNUX0hFQUQoJmlzaS0+dmlkZW9fYnVmZmVyX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpc2ktPmRtYV9kZXNjX2hlYWQpOwogCi0JLyogR2V0IElTSV9NQ0ssIHByb3ZpZGVkIGJ5IHByb2dyYW1tYWJsZSBjbG9jayBvciBleHRlcm5hbCBjbG9jayAqLwotCWlzaS0+bWNrID0gY2xrX2dldChkZXYsICJpc2lfbWNrIik7Ci0JaWYgKElTX0VSUihpc2ktPm1jaykpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IGlzaV9tY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGlzaS0+bWNrKTsKLQkJZ290byBlcnJfY2xrX2dldDsKKwkvKiBJU0lfTUNLIGlzIHRoZSBzZW5zb3IgbWFzdGVyIGNsb2NrLiBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUKKwkgKiBzZW5zb3IgZHJpdmVyIGRpcmVjdGx5LCBhcyB0aGUgSVNJIGhhcyBubyB1c2UgZm9yIHRoYXQgY2xvY2suIE1ha2UKKwkgKiB0aGUgY2xvY2sgb3B0aW9uYWwgaGVyZSB3aGlsZSBwbGF0Zm9ybXMgdHJhbnNpdGlvbiB0byB0aGUgY29ycmVjdAorCSAqIG1vZGVsLgorCSAqLworCWlzaS0+bWNrID0gZGV2bV9jbGtfZ2V0KGRldiwgImlzaV9tY2siKTsKKwlpZiAoIUlTX0VSUihpc2ktPm1jaykpIHsKKwkJLyogU2V0IElTSV9NQ0sncyBmcmVxdWVuY3ksIGl0IHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBwaXhlbAorCQkgKiBjbG9jay4KKwkJICovCisJCXJldCA9IGNsa19zZXRfcmF0ZShpc2ktPm1jaywgcGRhdGEtPm1ja19oeik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBjbGtfcHJlcGFyZShpc2ktPm1jayk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfY2xrX3ByZXBhcmVfbWNrOwotCi0JLyogU2V0IElTSV9NQ0sncyBmcmVxdWVuY3ksIGl0IHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBwaXhlbCBjbG9jayAqLwotCXJldCA9IGNsa19zZXRfcmF0ZShpc2ktPm1jaywgcGRhdGEtPm1ja19oeik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3NldF9tY2tfcmF0ZTsKLQogCWlzaS0+cF9mYl9kZXNjcmlwdG9ycyA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LAogCQkJCXNpemVvZihzdHJ1Y3QgZmJkKSAqIE1BWF9CVUZGRVJfTlVNLAogCQkJCSZpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2ktPnBfZmJfZGVzY3JpcHRvcnMpIHsKLQkJcmV0ID0gLUVOT01FTTsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgZGVzY3JpcHRvcnMhXG4iKTsKLQkJZ290byBlcnJfYWxsb2NfZGVzY3JpcHRvcnM7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVGRkVSX05VTTsgaSsrKSB7CkBAIC0xMDA5LDkgKzk0OCwxMCBAQAogCQlnb3RvIGVycl9hbGxvY19jdHg7CiAJfQogCi0JaXNpLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7Ci0JaWYgKCFpc2ktPnJlZ3MpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpc2ktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVncyk7CisJaWYgKElTX0VSUihpc2ktPnJlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIoaXNpLT5yZWdzKTsKIAkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKQEAgLTEwMjgsNyArOTY4LDcgQEAKIAkJZ290byBlcnJfcmVxX2lycTsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGlzaV9pbnRlcnJ1cHQsIDAsICJpc2kiLCBpc2kpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBpc2lfaW50ZXJydXB0LCAwLCAiaXNpIiwgaXNpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IGlycSAlZFxuIiwgaXJxKTsKIAkJZ290byBlcnJfcmVxX2lycTsKQEAgLTEwNTAsOSArOTkwLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ2lzdGVyX3NvY19jYW1lcmFfaG9zdDoKLQlmcmVlX2lycShpc2ktPmlycSwgaXNpKTsKIGVycl9yZXFfaXJxOgotCWlvdW5tYXAoaXNpLT5yZWdzKTsKIGVycl9pb3JlbWFwOgogCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGlzaS0+YWxsb2NfY3R4KTsKIGVycl9hbGxvY19jdHg6CkBAIC0xMDYwLDE3ICs5OTgsNiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBmYmQpICogTUFYX0JVRkZFUl9OVU0sCiAJCQlpc2ktPnBfZmJfZGVzY3JpcHRvcnMsCiAJCQlpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMpOwotZXJyX2FsbG9jX2Rlc2NyaXB0b3JzOgotZXJyX3NldF9tY2tfcmF0ZToKLQljbGtfdW5wcmVwYXJlKGlzaS0+bWNrKTsKLWVycl9jbGtfcHJlcGFyZV9tY2s6Ci0JY2xrX3B1dChpc2ktPm1jayk7Ci1lcnJfY2xrX2dldDoKLQlrZnJlZShpc2kpOwotZXJyX2FsbG9jX2lzaToKLQljbGtfdW5wcmVwYXJlKHBjbGspOwotZXJyX2Nsa19wcmVwYXJlX3BjbGs6Ci0JY2xrX3B1dChwY2xrKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvbXgyX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL214Ml9jYW1lcmEuYwppbmRleCA0NWEwMjc2Li5kNzNhYmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvbXgyX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9teDJfY2FtZXJhLmMKQEAgLTY1OSw3ICs2NTksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY291bnQgPCAyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9CVUZTOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9yY2FyX3Zpbi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL3JjYXJfdmluLmMKaW5kZXggNjg2NmJiNC4uM2IxYzA1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL3JjYXJfdmluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL3JjYXJfdmluLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogI2RlZmluZSBWSU5fTUFYX0hFSUdIVAkJMjA0OAogCiBlbnVtIGNoaXBfaWQgewotCVJDQVJfSDIsCisJUkNBUl9HRU4yLAogCVJDQVJfSDEsCiAJUkNBUl9NMSwKIAlSQ0FSX0UxLApAQCAtMzAyLDcgKzMwMiw3IEBACiAJCWRtciA9IDA7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgotCQlpZiAocHJpdi0+Y2hpcCA9PSBSQ0FSX0gyIHx8IHByaXYtPmNoaXAgPT0gUkNBUl9IMSB8fAorCQlpZiAocHJpdi0+Y2hpcCA9PSBSQ0FSX0dFTjIgfHwgcHJpdi0+Y2hpcCA9PSBSQ0FSX0gxIHx8CiAJCSAgICBwcml2LT5jaGlwID09IFJDQVJfRTEpIHsKIAkJCWRtciA9IFZORE1SX0VYUkdCOwogCQkJYnJlYWs7CkBAIC0xMzg0LDcgKzEzODQsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgcmNhcl92aW5faWRfdGFibGVbXSA9IHsKLQl7ICJyOGE3NzkwLXZpbiIsICBSQ0FSX0gyIH0sCisJeyAicjhhNzc5MS12aW4iLCAgUkNBUl9HRU4yIH0sCisJeyAicjhhNzc5MC12aW4iLCAgUkNBUl9HRU4yIH0sCiAJeyAicjhhNzc3OS12aW4iLCAgUkNBUl9IMSB9LAogCXsgInI4YTc3NzgtdmluIiwgIFJDQVJfTTEgfSwKIAl7ICJ1UEQzNTAwNC12aW4iLCBSQ0FSX0UxIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvc29jX3NjYWxlX2Nyb3AuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9zb2Nfc2NhbGVfY3JvcC5jCmluZGV4IGNiZDNhMzQuLjhlNzRmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9zb2Nfc2NhbGVfY3JvcC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9zb2Nfc2NhbGVfY3JvcC5jCkBAIC0xNDEsOCArMTQxLDggQEAKIAkgKiBQb3B1bGFyIHNwZWNpYWwgY2FzZSAtIHNvbWUgY2FtZXJhcyBjYW4gb25seSBoYW5kbGUgZml4ZWQgc2l6ZXMgbGlrZQogCSAqIFFWR0EsIFZHQSwuLi4gVGFrZSBjYXJlIHRvIGF2b2lkIGluZmluaXRlIGxvb3AuCiAJICovCi0Jd2lkdGggPSBtYXgoY2FtX3JlY3QtPndpZHRoLCAyKTsKLQloZWlnaHQgPSBtYXgoY2FtX3JlY3QtPmhlaWdodCwgMik7CisJd2lkdGggPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGNhbV9yZWN0LT53aWR0aCwgMik7CisJaGVpZ2h0ID0gbWF4X3QodW5zaWduZWQgaW50LCBjYW1fcmVjdC0+aGVpZ2h0LCAyKTsKIAogCS8qCiAJICogTG9vcCBhcyBsb25nIGFzIHNlbnNvciBpcyBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlZCByZWN0YW5nbGUgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL01ha2VmaWxlCmluZGV4IGNiZjBhODAuLmJlNjgwZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1RJX1ZQRSkgKz0gdGktdnBlLm8KIAotdGktdnBlLXkgOj0gdnBlLm8gdnBkbWEubwordGktdnBlLXkgOj0gdnBlLm8gc2MubyBjc2MubyB2cGRtYS5vCiAKIGNjZmxhZ3MtJChDT05GSUdfVklERU9fVElfVlBFX0RFQlVHKSArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS9jc2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL2NzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmVhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS9jc2MuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvbG9yIHNwYWNlIGNvbnZlcnRlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBEYXZpZCBHcmllZ28sIDxkYWdyaWVnb0BiaWdsYWtlc29mdHdhcmUuY29tPgorICogRGFsZSBGYXJuc3dvcnRoLCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KKyAqIEFyY2hpdCBUYW5lamEsIDxhcmNoaXRAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSAiY3NjLmgiCisKKy8qCisgKiAxNiBjb2VmZmljaWVudHMgaW4gdGhlIG9yZGVyOgorICogYTAsIGIwLCBjMCwgYTEsIGIxLCBjMSwgYTIsIGIyLCBjMiwgZDAsIGQxLCBkMgorICogKHdlIG1heSBuZWVkIHRvIHBhc3Mgbm9uLWRlZmF1bHQgdmFsdWVzIGZyb20gdXNlciBzcGFjZSBsYXRlciBvbiwgd2UgbWlnaHQKKyAqIG5lZWQgdG8gbWFrZSB0aGUgY29lZmZpY2llbnQgc3RydWN0IG1vcmUgZWFzeSB0byBwb3B1bGF0ZSkKKyAqLworc3RydWN0IGNvbG9yc3BhY2VfY29lZmZzIHsKKwl1MTYJc2RbMTJdOworCXUxNgloZFsxMl07Cit9OworCisvKiBWSURFT19SQU5HRTogbGltaXRlZCByYW5nZSwgR1JBUEhJQ1NfUkFOR0U6IGZ1bGwgcmFuZ2UgKi8KKyNkZWZpbmUJQ1NDX0NPRUZGU19WSURFT19SQU5HRV9ZMlIJMAorI2RlZmluZQlDU0NfQ09FRkZTX0dSQVBISUNTX1JBTkdFX1kyUgkxCisjZGVmaW5lCUNTQ19DT0VGRlNfVklERU9fUkFOR0VfUjJZCTIKKyNkZWZpbmUJQ1NDX0NPRUZGU19HUkFQSElDU19SQU5HRV9SMlkJMworCisvKiBkZWZhdWx0IGNvbG9yc3BhY2UgY29lZmZpY2llbnRzICovCitzdGF0aWMgc3RydWN0IGNvbG9yc3BhY2VfY29lZmZzIGNvbG9yc3BhY2VfY29lZmZzWzRdID0geworCVtDU0NfQ09FRkZTX1ZJREVPX1JBTkdFX1kyUl0gPSB7CisJCXsKKwkJCS8qIFNEVFYgKi8KKwkJCTB4MDQwMCwgMHgwMDAwLCAweDA1N0QsIDB4MDQwMCwgMHgxRUE3LCAweDFEMzUsCisJCQkweDA0MDAsIDB4MDZFRiwgMHgxRkZFLCAweDBENDAsIDB4MDIxMCwgMHgwQzg4LAorCQl9LAorCQl7CisJCQkvKiBIRFRWICovCisJCQkweDA0MDAsIDB4MDAwMCwgMHgwNjI5LCAweDA0MDAsIDB4MUY0NSwgMHgxRTJCLAorCQkJMHgwNDAwLCAweDA3NDIsIDB4MDAwMCwgMHgwQ0VDLCAweDAxNDgsIDB4MEM2MCwKKwkJfSwKKwl9LAorCVtDU0NfQ09FRkZTX0dSQVBISUNTX1JBTkdFX1kyUl0gPSB7CisJCXsKKwkJCS8qIFNEVFYgKi8KKwkJCTB4MDRBOCwgMHgxRkZFLCAweDA2NjIsIDB4MDRBOCwgMHgxRTZGLCAweDFDQkYsCisJCQkweDA0QTgsIDB4MDgxMiwgMHgxRkZGLCAweDBDODQsIDB4MDIyMCwgMHgwQkFDLAorCQl9LAorCQl7CisJCQkvKiBIRFRWICovCisJCQkweDA0QTgsIDB4MDAwMCwgMHgwNzJDLCAweDA0QTgsIDB4MUYyNiwgMHgxRERFLAorCQkJMHgwNEE4LCAweDA4NzMsIDB4MDAwMCwgMHgwQzIwLCAweDAxMzQsIDB4MEI3QywKKwkJfSwKKwl9LAorCVtDU0NfQ09FRkZTX1ZJREVPX1JBTkdFX1IyWV0gPSB7CisJCXsKKwkJCS8qIFNEVFYgKi8KKwkJCTB4MDEzMiwgMHgwMjU5LCAweDAwNzUsIDB4MUY1MCwgMHgxRUE1LCAweDAyMEIsCisJCQkweDAyMEIsIDB4MUU0QSwgMHgxRkFCLCAweDAwMDAsIDB4MDIwMCwgMHgwMjAwLAorCQl9LAorCQl7CisJCQkvKiBIRFRWICovCisJCQkweDAwREEsIDB4MDJEQywgMHgwMDRBLCAweDFGODgsIDB4MUU2QywgMHgwMjBDLAorCQkJMHgwMjBDLCAweDFFMjQsIDB4MUZEMCwgMHgwMDAwLCAweDAyMDAsIDB4MDIwMCwKKwkJfSwKKwl9LAorCVtDU0NfQ09FRkZTX0dSQVBISUNTX1JBTkdFX1IyWV0gPSB7CisJCXsKKwkJCS8qIFNEVFYgKi8KKwkJCTB4MDEwNywgMHgwMjA0LCAweDAwNjQsIDB4MUY2OCwgMHgxRUQ2LCAweDAxQzIsCisJCQkweDAxQzIsIDB4MUU4NywgMHgxRkI3LCAweDAwNDAsIDB4MDIwMCwgMHgwMjAwLAorCQl9LAorCQl7CisJCQkvKiBIRFRWICovCisJCQkweDA0QTgsIDB4MDAwMCwgMHgwNzJDLCAweDA0QTgsIDB4MUYyNiwgMHgxRERFLAorCQkJMHgwNEE4LCAweDA4NzMsIDB4MDAwMCwgMHgwQzIwLCAweDAxMzQsIDB4MEI3QywKKwkJfSwKKwl9LAorfTsKKwordm9pZCBjc2NfZHVtcF9yZWdzKHN0cnVjdCBjc2NfZGF0YSAqY3NjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjc2MtPnBkZXYtPmRldjsKKworCXUzMiByZWFkX3JlZyhzdHJ1Y3QgY3NjX2RhdGEgKmNzYywgaW50IG9mZnNldCkKKwl7CisJCXJldHVybiBpb3JlYWQzMihjc2MtPmJhc2UgKyBvZmZzZXQpOworCX0KKworI2RlZmluZSBEVU1QUkVHKHIpIGRldl9kYmcoZGV2LCAiJS0zNXMgJTA4eFxuIiwgI3IsIHJlYWRfcmVnKGNzYywgQ1NDXyMjcikpCisKKwlEVU1QUkVHKENTQzAwKTsKKwlEVU1QUkVHKENTQzAxKTsKKwlEVU1QUkVHKENTQzAyKTsKKwlEVU1QUkVHKENTQzAzKTsKKwlEVU1QUkVHKENTQzA0KTsKKwlEVU1QUkVHKENTQzA1KTsKKworI3VuZGVmIERVTVBSRUcKK30KKwordm9pZCBjc2Nfc2V0X2NvZWZmX2J5cGFzcyhzdHJ1Y3QgY3NjX2RhdGEgKmNzYywgdTMyICpjc2NfcmVnNSkKK3sKKwkqY3NjX3JlZzUgfD0gQ1NDX0JZUEFTUzsKK30KKworLyoKKyAqIHNldCB0aGUgY29sb3Igc3BhY2UgY29udmVydGVyIGNvZWZmaWNpZW50IHNoYWRvdyByZWdpc3RlciB2YWx1ZXMKKyAqLwordm9pZCBjc2Nfc2V0X2NvZWZmKHN0cnVjdCBjc2NfZGF0YSAqY3NjLCB1MzIgKmNzY19yZWcwLAorCQllbnVtIHY0bDJfY29sb3JzcGFjZSBzcmNfY29sb3JzcGFjZSwKKwkJZW51bSB2NGwyX2NvbG9yc3BhY2UgZHN0X2NvbG9yc3BhY2UpCit7CisJdTMyICpjc2NfcmVnNSA9IGNzY19yZWcwICsgNTsKKwl1MzIgKnNoYWRvd19jc2MgPSBjc2NfcmVnMDsKKwlzdHJ1Y3QgY29sb3JzcGFjZV9jb2VmZnMgKnNkX2hkX2NvZWZmczsKKwl1MTYgKmNvZWZmLCAqZW5kX2NvZWZmOworCWVudW0gdjRsMl9jb2xvcnNwYWNlIHl1dl9jb2xvcnNwYWNlOworCWludCBzZWwgPSAwOworCisJLyoKKwkgKiBzdXBwb3J0IG9ubHkgZ3JhcGhpY3MgZGF0YSByYW5nZShmdWxsIHJhbmdlKSBmb3Igbm93LCBhIGNvbnRyb2wgaW9jdGwKKwkgKiB3b3VsZCBiZSBuaWNlIGhlcmUKKwkgKi8KKwkvKiBZMlIgKi8KKwlpZiAoZHN0X2NvbG9yc3BhY2UgPT0gVjRMMl9DT0xPUlNQQUNFX1NSR0IgJiYKKwkJCShzcmNfY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNIHx8CisJCQlzcmNfY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5KSkgeworCQkvKiBZMlIgKi8KKwkJc2VsID0gMTsKKwkJeXV2X2NvbG9yc3BhY2UgPSBzcmNfY29sb3JzcGFjZTsKKwl9IGVsc2UgaWYgKChkc3RfY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNIHx8CisJCQlkc3RfY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5KSAmJgorCQkJc3JjX2NvbG9yc3BhY2UgPT0gVjRMMl9DT0xPUlNQQUNFX1NSR0IpIHsKKwkJLyogUjJZICovCisJCXNlbCA9IDM7CisJCXl1dl9jb2xvcnNwYWNlID0gZHN0X2NvbG9yc3BhY2U7CisJfSBlbHNlIHsKKwkJKmNzY19yZWc1IHw9IENTQ19CWVBBU1M7CisJCXJldHVybjsKKwl9CisKKwlzZF9oZF9jb2VmZnMgPSAmY29sb3JzcGFjZV9jb2VmZnNbc2VsXTsKKworCS8qIHNlbGVjdCBiZXR3ZWVuIFNEIG9yIEhEIGNvZWZmaWNpZW50cyAqLworCWlmICh5dXZfY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNKQorCQljb2VmZiA9IHNkX2hkX2NvZWZmcy0+c2Q7CisJZWxzZQorCQljb2VmZiA9IHNkX2hkX2NvZWZmcy0+aGQ7CisKKwllbmRfY29lZmYgPSBjb2VmZiArIDEyOworCisJZm9yICg7IGNvZWZmIDwgZW5kX2NvZWZmOyBjb2VmZiArPSAyKQorCQkqc2hhZG93X2NzYysrID0gKCooY29lZmYgKyAxKSA8PCAxNikgfCAqY29lZmY7Cit9CisKK3N0cnVjdCBjc2NfZGF0YSAqY3NjX2NyZWF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjc2NfZGF0YSAqY3NjOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiY3NjX2NyZWF0ZVxuIik7CisKKwljc2MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBhbGxvYyBjc2NfZGF0YVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWNzYy0+cGRldiA9IHBkZXY7CisKKwljc2MtPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkidnBlX2NzYyIpOworCWlmIChjc2MtPnJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gcmVzb3VyY2VzIGRhdGFcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwljc2MtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgY3NjLT5yZXMpOworCWlmICghY3NjLT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIGNzYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL2NzYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvY3NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL2NzYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIERhdmlkIEdyaWVnbywgPGRhZ3JpZWdvQGJpZ2xha2Vzb2Z0d2FyZS5jb20+CisgKiBEYWxlIEZhcm5zd29ydGgsIDxkYWxlQGZhcm5zd29ydGgub3JnPgorICogQXJjaGl0IFRhbmVqYSwgPGFyY2hpdEB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBUSV9DU0NfSAorI2RlZmluZSBUSV9DU0NfSAorCisvKiBWUEUgY29sb3Igc3BhY2UgY29udmVydGVyIHJlZ3MgKi8KKyNkZWZpbmUgQ1NDX0NTQzAwCQkweDAwCisjZGVmaW5lIENTQ19BMF9NQVNLCQkweDFmZmYKKyNkZWZpbmUgQ1NDX0EwX1NISUZUCQkwCisjZGVmaW5lIENTQ19CMF9NQVNLCQkweDFmZmYKKyNkZWZpbmUgQ1NDX0IwX1NISUZUCQkxNgorCisjZGVmaW5lIENTQ19DU0MwMQkJMHgwNAorI2RlZmluZSBDU0NfQzBfTUFTSwkJMHgxZmZmCisjZGVmaW5lIENTQ19DMF9TSElGVAkJMAorI2RlZmluZSBDU0NfQTFfTUFTSwkJMHgxZmZmCisjZGVmaW5lIENTQ19BMV9TSElGVAkJMTYKKworI2RlZmluZSBDU0NfQ1NDMDIJCTB4MDgKKyNkZWZpbmUgQ1NDX0IxX01BU0sJCTB4MWZmZgorI2RlZmluZSBDU0NfQjFfU0hJRlQJCTAKKyNkZWZpbmUgQ1NDX0MxX01BU0sJCTB4MWZmZgorI2RlZmluZSBDU0NfQzFfU0hJRlQJCTE2CisKKyNkZWZpbmUgQ1NDX0NTQzAzCQkweDBjCisjZGVmaW5lIENTQ19BMl9NQVNLCQkweDFmZmYKKyNkZWZpbmUgQ1NDX0EyX1NISUZUCQkwCisjZGVmaW5lIENTQ19CMl9NQVNLCQkweDFmZmYKKyNkZWZpbmUgQ1NDX0IyX1NISUZUCQkxNgorCisjZGVmaW5lIENTQ19DU0MwNAkJMHgxMAorI2RlZmluZSBDU0NfQzJfTUFTSwkJMHgxZmZmCisjZGVmaW5lIENTQ19DMl9TSElGVAkJMAorI2RlZmluZSBDU0NfRDBfTUFTSwkJMHgwZmZmCisjZGVmaW5lIENTQ19EMF9TSElGVAkJMTYKKworI2RlZmluZSBDU0NfQ1NDMDUJCTB4MTQKKyNkZWZpbmUgQ1NDX0QxX01BU0sJCTB4MGZmZgorI2RlZmluZSBDU0NfRDFfU0hJRlQJCTAKKyNkZWZpbmUgQ1NDX0QyX01BU0sJCTB4MGZmZgorI2RlZmluZSBDU0NfRDJfU0hJRlQJCTE2CisKKyNkZWZpbmUgQ1NDX0JZUEFTUwkJKDEgPDwgMjgpCisKK3N0cnVjdCBjc2NfZGF0YSB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7CisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworfTsKKwordm9pZCBjc2NfZHVtcF9yZWdzKHN0cnVjdCBjc2NfZGF0YSAqY3NjKTsKK3ZvaWQgY3NjX3NldF9jb2VmZl9ieXBhc3Moc3RydWN0IGNzY19kYXRhICpjc2MsIHUzMiAqY3NjX3JlZzUpOwordm9pZCBjc2Nfc2V0X2NvZWZmKHN0cnVjdCBjc2NfZGF0YSAqY3NjLCB1MzIgKmNzY19yZWcwLAorCQllbnVtIHY0bDJfY29sb3JzcGFjZSBzcmNfY29sb3JzcGFjZSwKKwkJZW51bSB2NGwyX2NvbG9yc3BhY2UgZHN0X2NvbG9yc3BhY2UpOworc3RydWN0IGNzY19kYXRhICpjc2NfY3JlYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3NjLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS9zYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjBhZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvc2MuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIFNjYWxlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBEYXZpZCBHcmllZ28sIDxkYWdyaWVnb0BiaWdsYWtlc29mdHdhcmUuY29tPgorICogRGFsZSBGYXJuc3dvcnRoLCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KKyAqIEFyY2hpdCBUYW5lamEsIDxhcmNoaXRAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic2MuaCIKKyNpbmNsdWRlICJzY19jb2VmZi5oIgorCit2b2lkIHNjX2R1bXBfcmVncyhzdHJ1Y3Qgc2NfZGF0YSAqc2MpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnNjLT5wZGV2LT5kZXY7CisKKwl1MzIgcmVhZF9yZWcoc3RydWN0IHNjX2RhdGEgKnNjLCBpbnQgb2Zmc2V0KQorCXsKKwkJcmV0dXJuIGlvcmVhZDMyKHNjLT5iYXNlICsgb2Zmc2V0KTsKKwl9CisKKyNkZWZpbmUgRFVNUFJFRyhyKSBkZXZfZGJnKGRldiwgIiUtMzVzICUwOHhcbiIsICNyLCByZWFkX3JlZyhzYywgQ0ZHXyMjcikpCisKKwlEVU1QUkVHKFNDMCk7CisJRFVNUFJFRyhTQzEpOworCURVTVBSRUcoU0MyKTsKKwlEVU1QUkVHKFNDMyk7CisJRFVNUFJFRyhTQzQpOworCURVTVBSRUcoU0M1KTsKKwlEVU1QUkVHKFNDNik7CisJRFVNUFJFRyhTQzgpOworCURVTVBSRUcoU0M5KTsKKwlEVU1QUkVHKFNDMTApOworCURVTVBSRUcoU0MxMSk7CisJRFVNUFJFRyhTQzEyKTsKKwlEVU1QUkVHKFNDMTMpOworCURVTVBSRUcoU0MxNyk7CisJRFVNUFJFRyhTQzE4KTsKKwlEVU1QUkVHKFNDMTkpOworCURVTVBSRUcoU0MyMCk7CisJRFVNUFJFRyhTQzIxKTsKKwlEVU1QUkVHKFNDMjIpOworCURVTVBSRUcoU0MyMyk7CisJRFVNUFJFRyhTQzI0KTsKKwlEVU1QUkVHKFNDMjUpOworCisjdW5kZWYgRFVNUFJFRworfQorCisvKgorICogc2V0IHRoZSBob3Jpem9udGFsIHNjYWxlciBjb2VmZmljaWVudHMgYWNjb3JkaW5nIHRvIHRoZSByYXRpbyBvZiBvdXRwdXQgdG8KKyAqIGlucHV0IHdpZHRocywgYWZ0ZXIgYWNjb3VudGluZyBmb3IgdXAgdG8gdHdvIGxldmVscyBvZiBkZWNpbWF0aW9uCisgKi8KK3ZvaWQgc2Nfc2V0X2hzX2NvZWZmcyhzdHJ1Y3Qgc2NfZGF0YSAqc2MsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBzcmNfdywKKwkJdW5zaWduZWQgaW50IGRzdF93KQoreworCWludCBzaXh0ZWVudGhzOworCWludCBpZHg7CisJaW50IGksIGo7CisJdTE2ICpjb2VmZl9oID0gYWRkcjsKKwljb25zdCB1MTYgKmNwOworCisJaWYgKGRzdF93ID4gc3JjX3cpIHsKKwkJaWR4ID0gSFNfVVBfU0NBTEU7CisJfSBlbHNlIHsKKwkJaWYgKChkc3RfdyA8PCAxKSA8IHNyY193KQorCQkJZHN0X3cgPDw9IDE7CS8qIGZpcnN0IGxldmVsIGRlY2ltYXRpb24gKi8KKwkJaWYgKChkc3RfdyA8PCAxKSA8IHNyY193KQorCQkJZHN0X3cgPDw9IDE7CS8qIHNlY29uZCBsZXZlbCBkZWNpbWF0aW9uICovCisKKwkJaWYgKGRzdF93ID09IHNyY193KSB7CisJCQlpZHggPSBIU19MRV8xNl8xNl9TQ0FMRTsKKwkJfSBlbHNlIHsKKwkJCXNpeHRlZW50aHMgPSAoZHN0X3cgPDwgNCkgLyBzcmNfdzsKKwkJCWlmIChzaXh0ZWVudGhzIDwgOCkKKwkJCQlzaXh0ZWVudGhzID0gODsKKwkJCWlkeCA9IEhTX0xUXzlfMTZfU0NBTEUgKyBzaXh0ZWVudGhzIC0gODsKKwkJfQorCX0KKworCWlmIChpZHggPT0gc2MtPmhzX2luZGV4KQorCQlyZXR1cm47CisKKwljcCA9IHNjYWxlcl9oc19jb2VmZnNbaWR4XTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ19OVU1fUEhBU0VTICogMjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBTQ19IX05VTV9UQVBTOyBqKyspCisJCQkqY29lZmZfaCsrID0gKmNwKys7CisJCS8qCisJCSAqIGZvciBlYWNoIHBoYXNlLCB0aGUgc2NhbGVyIGV4cGVjdHMgc3BhY2UgZm9yIDggY29lZmZpY2llbnRzCisJCSAqIGluIGl0J3MgbWVtb3J5LiBGb3IgdGhlIGhvcml6b250YWwgc2NhbGVyLCB3ZSBjb3B5IHRoZSBmaXJzdAorCQkgKiA3IGNvZWZmaWNpZW50cyBhbmQgc2tpcCB0aGUgbGFzdCBzbG90IHRvIG1vdmUgdG8gdGhlIG5leHQKKwkJICogcm93IHRvIGhvbGQgY29lZmZpY2llbnRzIGZvciB0aGUgbmV4dCBwaGFzZQorCQkgKi8KKwkJY29lZmZfaCArPSBTQ19OVU1fVEFQU19NRU1fQUxJR04gLSBTQ19IX05VTV9UQVBTOworCX0KKworCXNjLT5oc19pbmRleCA9IGlkeDsKKworCXNjLT5sb2FkX2NvZWZmX2ggPSB0cnVlOworfQorCisvKgorICogc2V0IHRoZSB2ZXJ0aWNhbCBzY2FsZXIgY29lZmZpY2llbnRzIGFjY29yZGluZyB0byB0aGUgcmF0aW8gb2Ygb3V0cHV0IHRvCisgKiBpbnB1dCBoZWlnaHRzCisgKi8KK3ZvaWQgc2Nfc2V0X3ZzX2NvZWZmcyhzdHJ1Y3Qgc2NfZGF0YSAqc2MsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBzcmNfaCwKKwkJdW5zaWduZWQgaW50IGRzdF9oKQoreworCWludCBzaXh0ZWVudGhzOworCWludCBpZHg7CisJaW50IGksIGo7CisJdTE2ICpjb2VmZl92ID0gYWRkcjsKKwljb25zdCB1MTYgKmNwOworCisJaWYgKGRzdF9oID4gc3JjX2gpIHsKKwkJaWR4ID0gVlNfVVBfU0NBTEU7CisJfSBlbHNlIGlmIChkc3RfaCA9PSBzcmNfaCkgeworCQlpZHggPSBWU18xX1RPXzFfU0NBTEU7CisJfSBlbHNlIHsKKwkJc2l4dGVlbnRocyA9IChkc3RfaCA8PCA0KSAvIHNyY19oOworCQlpZiAoc2l4dGVlbnRocyA8IDgpCisJCQlzaXh0ZWVudGhzID0gODsKKwkJaWR4ID0gVlNfTFRfOV8xNl9TQ0FMRSArIHNpeHRlZW50aHMgLSA4OworCX0KKworCWlmIChpZHggPT0gc2MtPnZzX2luZGV4KQorCQlyZXR1cm47CisKKwljcCA9IHNjYWxlcl92c19jb2VmZnNbaWR4XTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ19OVU1fUEhBU0VTICogMjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBTQ19WX05VTV9UQVBTOyBqKyspCisJCQkqY29lZmZfdisrID0gKmNwKys7CisJCS8qCisJCSAqIGZvciB0aGUgdmVydGljYWwgc2NhbGVyLCB3ZSBjb3B5IHRoZSBmaXJzdCA1IGNvZWZmaWNpZW50cyBhbmQKKwkJICogc2tpcCB0aGUgbGFzdCAzIHNsb3RzIHRvIG1vdmUgdG8gdGhlIG5leHQgcm93IHRvIGhvbGQKKwkJICogY29lZmZpY2llbnRzIGZvciB0aGUgbmV4dCBwaGFzZQorCQkgKi8KKwkJY29lZmZfdiArPSBTQ19OVU1fVEFQU19NRU1fQUxJR04gLSBTQ19WX05VTV9UQVBTOworCX0KKworCXNjLT52c19pbmRleCA9IGlkeDsKKwlzYy0+bG9hZF9jb2VmZl92ID0gdHJ1ZTsKK30KKwordm9pZCBzY19jb25maWdfc2NhbGVyKHN0cnVjdCBzY19kYXRhICpzYywgdTMyICpzY19yZWcwLCB1MzIgKnNjX3JlZzgsCisJCXUzMiAqc2NfcmVnMTcsIHVuc2lnbmVkIGludCBzcmNfdywgdW5zaWduZWQgaW50IHNyY19oLAorCQl1bnNpZ25lZCBpbnQgZHN0X3csIHVuc2lnbmVkIGludCBkc3RfaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2MtPnBkZXYtPmRldjsKKwl1MzIgdmFsOworCWludCBkY21feCwgZGNtX3NoaWZ0OworCWJvb2wgdXNlX3JhdjsKKwl1bnNpZ25lZCBsb25nIGxsdG1wOworCXUzMiBsaW5fYWNjX2luYywgbGluX2FjY19pbmNfdTsKKwl1MzIgY29sX2FjY19vZmZzZXQ7CisJdTE2IGZhY3RvciA9IDA7CisJaW50IHJvd19hY2NfaW5pdF9yYXYgPSAwLCByb3dfYWNjX2luaXRfcmF2X2IgPSAwOworCXUzMiByb3dfYWNjX2luYyA9IDAsIHJvd19hY2Nfb2Zmc2V0ID0gMCwgcm93X2FjY19vZmZzZXRfYiA9IDA7CisJLyoKKwkgKiBsb2NhdGlvbiBvZiBTQyByZWdpc3RlciBpbiBwYXlsb2FkIG1lbW9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0CisJICogcmVnaXN0ZXIgaW4gdGhlIG1tciBhZGRyZXNzIGRhdGEgYmxvY2sKKwkgKi8KKwl1MzIgKnNjX3JlZzkgPSBzY19yZWc4ICsgMTsKKwl1MzIgKnNjX3JlZzEyID0gc2NfcmVnOCArIDQ7CisJdTMyICpzY19yZWcxMyA9IHNjX3JlZzggKyA1OworCXUzMiAqc2NfcmVnMjQgPSBzY19yZWcxNyArIDc7CisKKwl2YWwgPSBzY19yZWcwWzBdOworCisJLyogY2xlYXIgYWxsIHRoZSBmZWF0dXJlcyh0aGV5IG1heSBnZXQgZW5hYmxlZCBlbHNld2hlcmUgbGF0ZXIpICovCisJdmFsICY9IH4oQ0ZHX1NFTEZHRU5fRklEIHwgQ0ZHX1RSSU0gfCBDRkdfRU5BQkxFX1NJTjJfVkVSX0lOVFAgfAorCQlDRkdfSU5URVJMQUNFX0kgfCBDRkdfRENNXzRYIHwgQ0ZHX0RDTV8yWCB8IENGR19BVVRPX0hTIHwKKwkJQ0ZHX0VOQUJMRV9FViB8IENGR19VU0VfUkFWIHwgQ0ZHX0lOVlRfRklEIHwgQ0ZHX1NDX0JZUEFTUyB8CisJCUNGR19JTlRFUkxBQ0VfTyB8IENGR19ZX1BLX0VOIHwgQ0ZHX0hQX0JZUEFTUyB8IENGR19MSU5FQVIpOworCisJaWYgKHNyY193ID09IGRzdF93ICYmIHNyY19oID09IGRzdF9oKSB7CisJCXZhbCB8PSBDRkdfU0NfQllQQVNTOworCQlzY19yZWcwWzBdID0gdmFsOworCQlyZXR1cm47CisJfQorCisJLyogd2Ugb25seSBzdXBwb3J0IGxpbmVhciBzY2FsaW5nIGZvciBub3cgKi8KKwl2YWwgfD0gQ0ZHX0xJTkVBUjsKKworCS8qIGNvbmZpZ3VyZSBob3Jpem9udGFsIHNjYWxlciAqLworCisJLyogZW5hYmxlIDJYIG9yIDRYIGRlY2ltYXRpb24gKi8KKwlkY21feCA9IHNyY193IC8gZHN0X3c7CisJaWYgKGRjbV94ID4gNCkgeworCQl2YWwgfD0gQ0ZHX0RDTV80WDsKKwkJZGNtX3NoaWZ0ID0gMjsKKwl9IGVsc2UgaWYgKGRjbV94ID4gMikgeworCQl2YWwgfD0gQ0ZHX0RDTV8yWDsKKwkJZGNtX3NoaWZ0ID0gMTsKKwl9IGVsc2UgeworCQlkY21fc2hpZnQgPSAwOworCX0KKworCWxsdG1wID0gZHN0X3cgLSAxOworCWxpbl9hY2NfaW5jID0gZGl2NjRfdTY0KCgodTY0KShzcmNfdyA+PiBkY21fc2hpZnQpIC0gMSkgPDwgMjQsIGxsdG1wKTsKKwlsaW5fYWNjX2luY191ID0gMDsKKwljb2xfYWNjX29mZnNldCA9IDA7CisKKwlkZXZfZGJnKGRldiwgImhzIGNvbmZpZzogc3JjX3cgPSAlZCwgZHN0X3cgPSAlZCwgZGVjaW1hdGlvbiA9ICVzLCBsaW5fYWNjX2luYyA9ICUwOHhcbiIsCisJCXNyY193LCBkc3RfdywgZGNtX3NoaWZ0ID09IDIgPyAiNHgiIDoKKwkJKGRjbV9zaGlmdCA9PSAxID8gIjJ4IiA6ICJub25lIiksIGxpbl9hY2NfaW5jKTsKKworCS8qIGNvbmZpZ3VyZSB2ZXJ0aWNhbCBzY2FsZXIgKi8KKworCS8qIHVzZSBSQVYgZm9yIHZlcnRpY2FsIHNjYWxlciBpZiB2ZXJ0aWNhbCBkb3duc2NhbGluZyBpcyA+IDR4ICovCisJaWYgKGRzdF9oIDwgKHNyY19oID4+IDIpKSB7CisJCXVzZV9yYXYgPSB0cnVlOworCQl2YWwgfD0gQ0ZHX1VTRV9SQVY7CisJfSBlbHNlIHsKKwkJdXNlX3JhdiA9IGZhbHNlOworCX0KKworCWlmICh1c2VfcmF2KSB7CisJCS8qIHVzZSBSQVYgKi8KKwkJZmFjdG9yID0gKHUxNikgKChkc3RfaCA8PCAxMCkgLyBzcmNfaCk7CisKKwkJcm93X2FjY19pbml0X3JhdiA9IGZhY3RvciArICgoMSArIGZhY3RvcikgPj4gMSk7CisJCWlmIChyb3dfYWNjX2luaXRfcmF2ID49IDEwMjQpCisJCQlyb3dfYWNjX2luaXRfcmF2IC09IDEwMjQ7CisKKwkJcm93X2FjY19pbml0X3Jhdl9iID0gcm93X2FjY19pbml0X3JhdiArCisJCQkJKDEgKyAocm93X2FjY19pbml0X3JhdiA+PiAxKSkgLQorCQkJCSgxMDI0ID4+IDEpOworCisJCWlmIChyb3dfYWNjX2luaXRfcmF2X2IgPCAwKSB7CisJCQlyb3dfYWNjX2luaXRfcmF2X2IgKz0gcm93X2FjY19pbml0X3JhdjsKKwkJCXJvd19hY2NfaW5pdF9yYXYgKj0gMjsKKwkJfQorCisJCWRldl9kYmcoZGV2LCAidnMgY29uZmlnKFJBVik6IHNyY19oID0gJWQsIGRzdF9oID0gJWQsIGZhY3RvciA9ICVkLCBhY2NfaW5pdCA9ICUwOHgsIGFjY19pbml0X2IgPSAlMDh4XG4iLAorCQkJc3JjX2gsIGRzdF9oLCBmYWN0b3IsIHJvd19hY2NfaW5pdF9yYXYsCisJCQlyb3dfYWNjX2luaXRfcmF2X2IpOworCX0gZWxzZSB7CisJCS8qIHVzZSBwb2x5cGhhc2UgKi8KKwkJcm93X2FjY19pbmMgPSAoKHNyY19oIC0gMSkgPDwgMTYpIC8gKGRzdF9oIC0gMSk7CisJCXJvd19hY2Nfb2Zmc2V0ID0gMDsKKwkJcm93X2FjY19vZmZzZXRfYiA9IDA7CisKKwkJZGV2X2RiZyhkZXYsICJ2cyBjb25maWcoUE9MWSk6IHNyY19oID0gJWQsIGRzdF9oID0gJWQscm93X2FjY19pbmMgPSAlMDh4XG4iLAorCQkJc3JjX2gsIGRzdF9oLCByb3dfYWNjX2luYyk7CisJfQorCisKKwlzY19yZWcwWzBdID0gdmFsOworCXNjX3JlZzBbMV0gPSByb3dfYWNjX2luYzsKKwlzY19yZWcwWzJdID0gcm93X2FjY19vZmZzZXQ7CisJc2NfcmVnMFszXSA9IHJvd19hY2Nfb2Zmc2V0X2I7CisKKwlzY19yZWcwWzRdID0gKChsaW5fYWNjX2luY191ICYgQ0ZHX0xJTl9BQ0NfSU5DX1VfTUFTSykgPDwKKwkJCUNGR19MSU5fQUNDX0lOQ19VX1NISUZUKSB8IChkc3RfdyA8PCBDRkdfVEFSX1dfU0hJRlQpIHwKKwkJCShkc3RfaCA8PCBDRkdfVEFSX0hfU0hJRlQpOworCisJc2NfcmVnMFs1XSA9IChzcmNfdyA8PCBDRkdfU1JDX1dfU0hJRlQpIHwgKHNyY19oIDw8IENGR19TUkNfSF9TSElGVCk7CisKKwlzY19yZWcwWzZdID0gKHJvd19hY2NfaW5pdF9yYXZfYiA8PCBDRkdfUk9XX0FDQ19JTklUX1JBVl9CX1NISUZUKSB8CisJCShyb3dfYWNjX2luaXRfcmF2IDw8IENGR19ST1dfQUNDX0lOSVRfUkFWX1NISUZUKTsKKworCSpzY19yZWc5ID0gbGluX2FjY19pbmM7CisKKwkqc2NfcmVnMTIgPSBjb2xfYWNjX29mZnNldCA8PCBDRkdfQ09MX0FDQ19PRkZTRVRfU0hJRlQ7CisKKwkqc2NfcmVnMTMgPSBmYWN0b3I7CisKKwkqc2NfcmVnMjQgPSAoc3JjX3cgPDwgQ0ZHX09SR19XX1NISUZUKSB8IChzcmNfaCA8PCBDRkdfT1JHX0hfU0hJRlQpOworfQorCitzdHJ1Y3Qgc2NfZGF0YSAqc2NfY3JlYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNjX2RhdGEgKnNjOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAic2NfY3JlYXRlXG4iKTsKKworCXNjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkbid0IGFsbG9jIHNjX2RhdGFcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlzYy0+cGRldiA9IHBkZXY7CisKKwlzYy0+cmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNjIik7CisJaWYgKCFzYy0+cmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gcmVzb3VyY2VzIGRhdGFcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlzYy0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBzYy0+cmVzKTsKKwlpZiAoIXNjLT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIHNjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvc2MuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlNDExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3NjLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIERhdmlkIEdyaWVnbywgPGRhZ3JpZWdvQGJpZ2xha2Vzb2Z0d2FyZS5jb20+CisgKiBEYWxlIEZhcm5zd29ydGgsIDxkYWxlQGZhcm5zd29ydGgub3JnPgorICogQXJjaGl0IFRhbmVqYSwgPGFyY2hpdEB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBUSV9TQ19ICisjZGVmaW5lIFRJX1NDX0gKKworLyogU2NhbGVyIHJlZ3MgKi8KKyNkZWZpbmUgQ0ZHX1NDMAkJCQkweDAKKyNkZWZpbmUgQ0ZHX0lOVEVSTEFDRV9PCQkJKDEgPDwgMCkKKyNkZWZpbmUgQ0ZHX0xJTkVBUgkJCSgxIDw8IDEpCisjZGVmaW5lIENGR19TQ19CWVBBU1MJCQkoMSA8PCAyKQorI2RlZmluZSBDRkdfSU5WVF9GSUQJCQkoMSA8PCAzKQorI2RlZmluZSBDRkdfVVNFX1JBVgkJCSgxIDw8IDQpCisjZGVmaW5lIENGR19FTkFCTEVfRVYJCQkoMSA8PCA1KQorI2RlZmluZSBDRkdfQVVUT19IUwkJCSgxIDw8IDYpCisjZGVmaW5lIENGR19EQ01fMlgJCQkoMSA8PCA3KQorI2RlZmluZSBDRkdfRENNXzRYCQkJKDEgPDwgOCkKKyNkZWZpbmUgQ0ZHX0hQX0JZUEFTUwkJCSgxIDw8IDkpCisjZGVmaW5lIENGR19JTlRFUkxBQ0VfSQkJCSgxIDw8IDEwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NJTjJfVkVSX0lOVFAJKDEgPDwgMTEpCisjZGVmaW5lIENGR19ZX1BLX0VOCQkJKDEgPDwgMTQpCisjZGVmaW5lIENGR19UUklNCQkJKDEgPDwgMTUpCisjZGVmaW5lIENGR19TRUxGR0VOX0ZJRAkJCSgxIDw8IDE2KQorCisjZGVmaW5lIENGR19TQzEJCQkJMHg0CisjZGVmaW5lIENGR19ST1dfQUNDX0lOQ19NQVNLCQkweDA3ZmZmZmZmCisjZGVmaW5lIENGR19ST1dfQUNDX0lOQ19TSElGVAkJMAorCisjZGVmaW5lIENGR19TQzIJCQkJMHgwOAorI2RlZmluZSBDRkdfUk9XX0FDQ19PRkZTRVRfTUFTSwkJMHgwZmZmZmZmZgorI2RlZmluZSBDRkdfUk9XX0FDQ19PRkZTRVRfU0hJRlQJMAorCisjZGVmaW5lIENGR19TQzMJCQkJMHgwYworI2RlZmluZSBDRkdfUk9XX0FDQ19PRkZTRVRfQl9NQVNLCTB4MGZmZmZmZmYKKyNkZWZpbmUgQ0ZHX1JPV19BQ0NfT0ZGU0VUX0JfU0hJRlQJMAorCisjZGVmaW5lIENGR19TQzQJCQkJMHgxMAorI2RlZmluZSBDRkdfVEFSX0hfTUFTSwkJCTB4MDdmZgorI2RlZmluZSBDRkdfVEFSX0hfU0hJRlQJCQkwCisjZGVmaW5lIENGR19UQVJfV19NQVNLCQkJMHgwN2ZmCisjZGVmaW5lIENGR19UQVJfV19TSElGVAkJCTEyCisjZGVmaW5lIENGR19MSU5fQUNDX0lOQ19VX01BU0sJCTB4MDcKKyNkZWZpbmUgQ0ZHX0xJTl9BQ0NfSU5DX1VfU0hJRlQJCTI0CisjZGVmaW5lIENGR19OTElOX0FDQ19JTklUX1VfTUFTSwkweDA3CisjZGVmaW5lIENGR19OTElOX0FDQ19JTklUX1VfU0hJRlQJMjgKKworI2RlZmluZSBDRkdfU0M1CQkJCTB4MTQKKyNkZWZpbmUgQ0ZHX1NSQ19IX01BU0sJCQkweDA3ZmYKKyNkZWZpbmUgQ0ZHX1NSQ19IX1NISUZUCQkJMAorI2RlZmluZSBDRkdfU1JDX1dfTUFTSwkJCTB4MDdmZgorI2RlZmluZSBDRkdfU1JDX1dfU0hJRlQJCQkxMgorI2RlZmluZSBDRkdfTkxJTl9BQ0NfSU5DX1VfTUFTSwkJMHgwNworI2RlZmluZSBDRkdfTkxJTl9BQ0NfSU5DX1VfU0hJRlQJMjQKKworI2RlZmluZSBDRkdfU0M2CQkJCTB4MTgKKyNkZWZpbmUgQ0ZHX1JPV19BQ0NfSU5JVF9SQVZfTUFTSwkweDAzZmYKKyNkZWZpbmUgQ0ZHX1JPV19BQ0NfSU5JVF9SQVZfU0hJRlQJMAorI2RlZmluZSBDRkdfUk9XX0FDQ19JTklUX1JBVl9CX01BU0sJMHgwM2ZmCisjZGVmaW5lIENGR19ST1dfQUNDX0lOSVRfUkFWX0JfU0hJRlQJMTAKKworI2RlZmluZSBDRkdfU0M4CQkJCTB4MjAKKyNkZWZpbmUgQ0ZHX05MSU5fTEVGVF9NQVNLCQkweDA3ZmYKKyNkZWZpbmUgQ0ZHX05MSU5fTEVGVF9TSElGVAkJMAorI2RlZmluZSBDRkdfTkxJTl9SSUdIVF9NQVNLCQkweDA3ZmYKKyNkZWZpbmUgQ0ZHX05MSU5fUklHSFRfU0hJRlQJCTEyCisKKyNkZWZpbmUgQ0ZHX1NDOQkJCQkweDI0CisjZGVmaW5lIENGR19MSU5fQUNDX0lOQwkJCUNGR19TQzkKKworI2RlZmluZSBDRkdfU0MxMAkJCTB4MjgKKyNkZWZpbmUgQ0ZHX05MSU5fQUNDX0lOSVQJCUNGR19TQzEwCisKKyNkZWZpbmUgQ0ZHX1NDMTEJCQkweDJjCisjZGVmaW5lIENGR19OTElOX0FDQ19JTkMJCUNGR19TQzExCisKKyNkZWZpbmUgQ0ZHX1NDMTIJCQkweDMwCisjZGVmaW5lIENGR19DT0xfQUNDX09GRlNFVF9NQVNLCQkweDAxZmZmZmZmCisjZGVmaW5lIENGR19DT0xfQUNDX09GRlNFVF9TSElGVAkwCisKKyNkZWZpbmUgQ0ZHX1NDMTMJCQkweDM0CisjZGVmaW5lIENGR19TQ19GQUNUT1JfUkFWX01BU0sJCTB4ZmYKKyNkZWZpbmUgQ0ZHX1NDX0ZBQ1RPUl9SQVZfU0hJRlQJCTAKKyNkZWZpbmUgQ0ZHX0NIUk9NQV9JTlRQX1RIUl9NQVNLCTB4MDNmZgorI2RlZmluZSBDRkdfQ0hST01BX0lOVFBfVEhSX1NISUZUCTEyCisjZGVmaW5lIENGR19ERUxUQV9DSFJPTUFfVEhSX01BU0sJMHgwZgorI2RlZmluZSBDRkdfREVMVEFfQ0hST01BX1RIUl9TSElGVAkyNAorCisjZGVmaW5lIENGR19TQzE3CQkJMHg0NAorI2RlZmluZSBDRkdfRVZfVEhSX01BU0sJCQkweDAzZmYKKyNkZWZpbmUgQ0ZHX0VWX1RIUl9TSElGVAkJMTIKKyNkZWZpbmUgQ0ZHX0RFTFRBX0xVTUFfVEhSX01BU0sJCTB4MGYKKyNkZWZpbmUgQ0ZHX0RFTFRBX0xVTUFfVEhSX1NISUZUCTI0CisjZGVmaW5lIENGR19ERUxUQV9FVl9USFJfTUFTSwkJMHgwZgorI2RlZmluZSBDRkdfREVMVEFfRVZfVEhSX1NISUZUCQkyOAorCisjZGVmaW5lIENGR19TQzE4CQkJMHg0OAorI2RlZmluZSBDRkdfSFNfRkFDVE9SX01BU0sJCTB4MDNmZgorI2RlZmluZSBDRkdfSFNfRkFDVE9SX1NISUZUCQkwCisjZGVmaW5lIENGR19DT05GX0RFRkFVTFRfTUFTSwkJMHgwMWZmCisjZGVmaW5lIENGR19DT05GX0RFRkFVTFRfU0hJRlQJCTE2CisKKyNkZWZpbmUgQ0ZHX1NDMTkJCQkweDRjCisjZGVmaW5lIENGR19IUEZfQ09FRkYwX01BU0sJCTB4ZmYKKyNkZWZpbmUgQ0ZHX0hQRl9DT0VGRjBfU0hJRlQJCTAKKyNkZWZpbmUgQ0ZHX0hQRl9DT0VGRjFfTUFTSwkJMHhmZgorI2RlZmluZSBDRkdfSFBGX0NPRUZGMV9TSElGVAkJOAorI2RlZmluZSBDRkdfSFBGX0NPRUZGMl9NQVNLCQkweGZmCisjZGVmaW5lIENGR19IUEZfQ09FRkYyX1NISUZUCQkxNgorI2RlZmluZSBDRkdfSFBGX0NPRUZGM19NQVNLCQkweGZmCisjZGVmaW5lIENGR19IUEZfQ09FRkYzX1NISUZUCQkyMworCisjZGVmaW5lIENGR19TQzIwCQkJMHg1MAorI2RlZmluZSBDRkdfSFBGX0NPRUZGNF9NQVNLCQkweGZmCisjZGVmaW5lIENGR19IUEZfQ09FRkY0X1NISUZUCQkwCisjZGVmaW5lIENGR19IUEZfQ09FRkY1X01BU0sJCTB4ZmYKKyNkZWZpbmUgQ0ZHX0hQRl9DT0VGRjVfU0hJRlQJCTgKKyNkZWZpbmUgQ0ZHX0hQRl9OT1JNX1NISUZUX01BU0sJCTB4MDcKKyNkZWZpbmUgQ0ZHX0hQRl9OT1JNX1NISUZUX1NISUZUCTE2CisjZGVmaW5lIENGR19OTF9MSU1JVF9NQVNLCQkweDFmZgorI2RlZmluZSBDRkdfTkxfTElNSVRfU0hJRlQJCTIwCisKKyNkZWZpbmUgQ0ZHX1NDMjEJCQkweDU0CisjZGVmaW5lIENGR19OTF9MT19USFJfTUFTSwkJMHgwMWZmCisjZGVmaW5lIENGR19OTF9MT19USFJfU0hJRlQJCTAKKyNkZWZpbmUgQ0ZHX05MX0xPX1NMT1BFX01BU0sJCTB4ZmYKKyNkZWZpbmUgQ0ZHX05MX0xPX1NMT1BFX1NISUZUCQkxNgorCisjZGVmaW5lIENGR19TQzIyCQkJMHg1OAorI2RlZmluZSBDRkdfTkxfSElfVEhSX01BU0sJCTB4MDFmZgorI2RlZmluZSBDRkdfTkxfSElfVEhSX1NISUZUCQkwCisjZGVmaW5lIENGR19OTF9ISV9TTE9QRV9TSF9NQVNLCQkweDA3CisjZGVmaW5lIENGR19OTF9ISV9TTE9QRV9TSF9TSElGVAkxNgorCisjZGVmaW5lIENGR19TQzIzCQkJMHg1YworI2RlZmluZSBDRkdfR1JBRElFTlRfVEhSX01BU0sJCTB4MDdmZgorI2RlZmluZSBDRkdfR1JBRElFTlRfVEhSX1NISUZUCQkwCisjZGVmaW5lIENGR19HUkFESUVOVF9USFJfUkFOR0VfTUFTSwkweDBmCisjZGVmaW5lIENGR19HUkFESUVOVF9USFJfUkFOR0VfU0hJRlQJMTIKKyNkZWZpbmUgQ0ZHX01JTl9HWV9USFJfTUFTSwkJMHhmZgorI2RlZmluZSBDRkdfTUlOX0dZX1RIUl9TSElGVAkJMTYKKyNkZWZpbmUgQ0ZHX01JTl9HWV9USFJfUkFOR0VfTUFTSwkweDBmCisjZGVmaW5lIENGR19NSU5fR1lfVEhSX1JBTkdFX1NISUZUCTI4CisKKyNkZWZpbmUgQ0ZHX1NDMjQJCQkweDYwCisjZGVmaW5lIENGR19PUkdfSF9NQVNLCQkJMHgwN2ZmCisjZGVmaW5lIENGR19PUkdfSF9TSElGVAkJCTAKKyNkZWZpbmUgQ0ZHX09SR19XX01BU0sJCQkweDA3ZmYKKyNkZWZpbmUgQ0ZHX09SR19XX1NISUZUCQkJMTYKKworI2RlZmluZSBDRkdfU0MyNQkJCTB4NjQKKyNkZWZpbmUgQ0ZHX09GRl9IX01BU0sJCQkweDA3ZmYKKyNkZWZpbmUgQ0ZHX09GRl9IX1NISUZUCQkJMAorI2RlZmluZSBDRkdfT0ZGX1dfTUFTSwkJCTB4MDdmZgorI2RlZmluZSBDRkdfT0ZGX1dfU0hJRlQJCQkxNgorCisvKiBudW1iZXIgb2YgcGhhc2VzIHN1cHBvcnRlZCBieSB0aGUgcG9seXBoYXNlIHNjYWxlcnMgKi8KKyNkZWZpbmUgU0NfTlVNX1BIQVNFUwkJCTMyCisKKy8qIG51bWJlciBvZiB0YXBzIHVzZWQgYnkgaG9yaXpvbnRhbCBwb2x5cGhhc2Ugc2NhbGVyICovCisjZGVmaW5lIFNDX0hfTlVNX1RBUFMJCQk3CisKKy8qIG51bWJlciBvZiB0YXBzIHVzZWQgYnkgdmVydGljYWwgcG9seXBoYXNlIHNjYWxlciAqLworI2RlZmluZSBTQ19WX05VTV9UQVBTCQkJNQorCisvKiBudW1iZXIgb2YgdGFwcyBleHBlY3RlZCBieSB0aGUgc2NhbGVyIGluIGl0J3MgY29lZmZpY2llbnQgbWVtb3J5ICovCisjZGVmaW5lIFNDX05VTV9UQVBTX01FTV9BTElHTgkJOAorCisvKgorICogY29lZmZpY2llbnQgbWVtb3J5IHNpemUgaW4gYnl0ZXM6CisgKiBudW0gcGhhc2VzIHggbnVtIHNldHMobHVtYSBhbmQgY2hyb21hKSB4IG51bSB0YXBzKGFsaWduZWQpIHggY29lZmYgc2l6ZQorICovCisjZGVmaW5lIFNDX0NPRUZfU1JBTV9TSVpFCShTQ19OVU1fUEhBU0VTICogMiAqIFNDX05VTV9UQVBTX01FTV9BTElHTiAqIDIpCisKK3N0cnVjdCBzY19kYXRhIHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKKworCWRtYV9hZGRyX3QJCWxvYWRlZF9jb2VmZl9oOyAvKiBsb2FkZWQgaCBjb2VmZnMgaW4gU0MgKi8KKwlkbWFfYWRkcl90CQlsb2FkZWRfY29lZmZfdjsgLyogbG9hZGVkIHYgY29lZmZzIGluIFNDICovCisKKwlib29sCQkJbG9hZF9jb2VmZl9oOwkvKiBoYXZlIG5ldyBoIFNDIGNvZWZmcyAqLworCWJvb2wJCQlsb2FkX2NvZWZmX3Y7CS8qIGhhdmUgbmV3IHYgU0MgY29lZmZzICovCisKKwl1bnNpZ25lZCBpbnQJCWhzX2luZGV4OwkvKiBoIFNDIGNvZWZmcyBzZWxlY3RvciAqLworCXVuc2lnbmVkIGludAkJdnNfaW5kZXg7CS8qIHYgU0MgY29lZmZzIHNlbGVjdG9yICovCisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworfTsKKwordm9pZCBzY19kdW1wX3JlZ3Moc3RydWN0IHNjX2RhdGEgKnNjKTsKK3ZvaWQgc2Nfc2V0X2hzX2NvZWZmcyhzdHJ1Y3Qgc2NfZGF0YSAqc2MsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBzcmNfdywKKwkJdW5zaWduZWQgaW50IGRzdF93KTsKK3ZvaWQgc2Nfc2V0X3ZzX2NvZWZmcyhzdHJ1Y3Qgc2NfZGF0YSAqc2MsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBzcmNfaCwKKwkJdW5zaWduZWQgaW50IGRzdF9oKTsKK3ZvaWQgc2NfY29uZmlnX3NjYWxlcihzdHJ1Y3Qgc2NfZGF0YSAqc2MsIHUzMiAqc2NfcmVnMCwgdTMyICpzY19yZWc4LAorCQl1MzIgKnNjX3JlZzE3LCB1bnNpZ25lZCBpbnQgc3JjX3csIHVuc2lnbmVkIGludCBzcmNfaCwKKwkJdW5zaWduZWQgaW50IGRzdF93LCB1bnNpZ25lZCBpbnQgZHN0X2gpOworc3RydWN0IHNjX2RhdGEgKnNjX2NyZWF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS9zY19jb2VmZi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvc2NfY29lZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmZhNWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvc2NfY29lZmYuaApAQCAtMCwwICsxLDEzNDIgQEAKKy8qCisgKiBWUEUgU0MgY29lZnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIERhdmlkIEdyaWVnbywgPGRhZ3JpZWdvQGJpZ2xha2Vzb2Z0d2FyZS5jb20+CisgKiBEYWxlIEZhcm5zd29ydGgsIDxkYWxlQGZhcm5zd29ydGgub3JnPgorICogQXJjaGl0IFRhbmVqYSwgPGFyY2hpdEB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fVElfU0NfQ09FRkZfSAorI2RlZmluZSBfX1RJX1NDX0NPRUZGX0gKKworLyogaG9yaXpvbnRhbCBzY2FsZXIgY29lZmZpY2llbnRzICovCitlbnVtIHsKKwlIU19VUF9TQ0FMRSA9IDAsCisJSFNfTFRfOV8xNl9TQ0FMRSwKKwlIU19MVF8xMF8xNl9TQ0FMRSwKKwlIU19MVF8xMV8xNl9TQ0FMRSwKKwlIU19MVF8xMl8xNl9TQ0FMRSwKKwlIU19MVF8xM18xNl9TQ0FMRSwKKwlIU19MVF8xNF8xNl9TQ0FMRSwKKwlIU19MVF8xNV8xNl9TQ0FMRSwKKwlIU19MRV8xNl8xNl9TQ0FMRSwKK307CisKK3N0YXRpYyBjb25zdCB1MTYgc2NhbGVyX2hzX2NvZWZmc1sxM11bU0NfTlVNX1BIQVNFUyAqIDIgKiBTQ19IX05VTV9UQVBTXSA9IHsKKwlbSFNfVVBfU0NBTEVdID0geworCQkvKiBMdW1hICovCisJCTB4MDAxRiwgMHgxRjkwLCAweDAwRDIsIDB4MDZGRSwgMHgwMEQyLCAweDFGOTAsIDB4MDAxRiwKKwkJMHgwMDFDLCAweDFGOUUsIDB4MDA5RiwgMHgwNkZCLCAweDAxMDgsIDB4MUY4MiwgMHgwMDIyLAorCQkweDAwMTksIDB4MUZBQywgMHgwMDZGLCAweDA2RjMsIDB4MDE0MCwgMHgxRjc0LCAweDAwMjUsCisJCTB4MDAxNiwgMHgxRkI5LCAweDAwNDEsIDB4MDZFNywgMHgwMTdCLCAweDFGNjYsIDB4MDAyOCwKKwkJMHgwMDEzLCAweDFGQzYsIDB4MDAxNywgMHgwNkQ2LCAweDAxQjcsIDB4MUY1OCwgMHgwMDJCLAorCQkweDAwMTAsIDB4MUZEMywgMHgxRkVGLCAweDA2QzAsIDB4MDFGNiwgMHgxRjRCLCAweDAwMkQsCisJCTB4MDAwRSwgMHgxRkRGLCAweDFGQ0IsIDB4MDZBNSwgMHgwMjM1LCAweDFGM0YsIDB4MDAyRiwKKwkJMHgwMDBCLCAweDFGRUEsIDB4MUZBQSwgMHgwNjg2LCAweDAyNzcsIDB4MUYzMywgMHgwMDMxLAorCQkweDAwMDksIDB4MUZGNSwgMHgxRjhDLCAweDA2NjMsIDB4MDJCOCwgMHgxRjI4LCAweDAwMzMsCisJCTB4MDAwNywgMHgxRkZGLCAweDFGNzIsIDB4MDYzQSwgMHgwMkZCLCAweDFGMUYsIDB4MDAzNCwKKwkJMHgwMDA1LCAweDAwMDgsIDB4MUY1QSwgMHgwNjBGLCAweDAzM0UsIDB4MUYxNywgMHgwMDM1LAorCQkweDAwMDMsIDB4MDAxMCwgMHgxRjQ2LCAweDA1RTAsIDB4MDM4MiwgMHgxRjEwLCAweDAwMzUsCisJCTB4MDAwMiwgMHgwMDE3LCAweDFGMzQsIDB4MDVBRiwgMHgwM0M1LCAweDFGMEIsIDB4MDAzNCwKKwkJMHgwMDAxLCAweDAwMUUsIDB4MUYyNiwgMHgwNTc5LCAweDA0MDcsIDB4MUYwOCwgMHgwMDMzLAorCQkweDAwMDAsIDB4MDAyMywgMHgxRjFBLCAweDA1NDEsIDB4MDQ0OSwgMHgxRjA3LCAweDAwMzIsCisJCTB4MUZGRiwgMHgwMDI4LCAweDFGMTIsIDB4MDUwNiwgMHgwNDhBLCAweDFGMDgsIDB4MDAyRiwKKwkJMHgwMDJDLCAweDFGMEMsIDB4MDRDOCwgMHgwNEM4LCAweDFGMEMsIDB4MDAyQywgMHgwMDAwLAorCQkweDAwMkYsIDB4MUYwOCwgMHgwNDhBLCAweDA1MDYsIDB4MUYxMiwgMHgwMDI4LCAweDFGRkYsCisJCTB4MDAzMiwgMHgxRjA3LCAweDA0NDksIDB4MDU0MSwgMHgxRjFBLCAweDAwMjMsIDB4MDAwMCwKKwkJMHgwMDMzLCAweDFGMDgsIDB4MDQwNywgMHgwNTc5LCAweDFGMjYsIDB4MDAxRSwgMHgwMDAxLAorCQkweDAwMzQsIDB4MUYwQiwgMHgwM0M1LCAweDA1QUYsIDB4MUYzNCwgMHgwMDE3LCAweDAwMDIsCisJCTB4MDAzNSwgMHgxRjEwLCAweDAzODIsIDB4MDVFMCwgMHgxRjQ2LCAweDAwMTAsIDB4MDAwMywKKwkJMHgwMDM1LCAweDFGMTcsIDB4MDMzRSwgMHgwNjBGLCAweDFGNUEsIDB4MDAwOCwgMHgwMDA1LAorCQkweDAwMzQsIDB4MUYxRiwgMHgwMkZCLCAweDA2M0EsIDB4MUY3MiwgMHgxRkZGLCAweDAwMDcsCisJCTB4MDAzMywgMHgxRjI4LCAweDAyQjgsIDB4MDY2MywgMHgxRjhDLCAweDFGRjUsIDB4MDAwOSwKKwkJMHgwMDMxLCAweDFGMzMsIDB4MDI3NywgMHgwNjg2LCAweDFGQUEsIDB4MUZFQSwgMHgwMDBCLAorCQkweDAwMkYsIDB4MUYzRiwgMHgwMjM1LCAweDA2QTUsIDB4MUZDQiwgMHgxRkRGLCAweDAwMEUsCisJCTB4MDAyRCwgMHgxRjRCLCAweDAxRjYsIDB4MDZDMCwgMHgxRkVGLCAweDFGRDMsIDB4MDAxMCwKKwkJMHgwMDJCLCAweDFGNTgsIDB4MDFCNywgMHgwNkQ2LCAweDAwMTcsIDB4MUZDNiwgMHgwMDEzLAorCQkweDAwMjgsIDB4MUY2NiwgMHgwMTdCLCAweDA2RTcsIDB4MDA0MSwgMHgxRkI5LCAweDAwMTYsCisJCTB4MDAyNSwgMHgxRjc0LCAweDAxNDAsIDB4MDZGMywgMHgwMDZGLCAweDFGQUMsIDB4MDAxOSwKKwkJMHgwMDIyLCAweDFGODIsIDB4MDEwOCwgMHgwNkZCLCAweDAwOUYsIDB4MUY5RSwgMHgwMDFDLAorCQkvKiBDaHJvbWEgKi8KKwkJMHgwMDFGLCAweDFGOTAsIDB4MDBEMiwgMHgwNkZFLCAweDAwRDIsIDB4MUY5MCwgMHgwMDFGLAorCQkweDAwMUMsIDB4MUY5RSwgMHgwMDlGLCAweDA2RkIsIDB4MDEwOCwgMHgxRjgyLCAweDAwMjIsCisJCTB4MDAxOSwgMHgxRkFDLCAweDAwNkYsIDB4MDZGMywgMHgwMTQwLCAweDFGNzQsIDB4MDAyNSwKKwkJMHgwMDE2LCAweDFGQjksIDB4MDA0MSwgMHgwNkU3LCAweDAxN0IsIDB4MUY2NiwgMHgwMDI4LAorCQkweDAwMTMsIDB4MUZDNiwgMHgwMDE3LCAweDA2RDYsIDB4MDFCNywgMHgxRjU4LCAweDAwMkIsCisJCTB4MDAxMCwgMHgxRkQzLCAweDFGRUYsIDB4MDZDMCwgMHgwMUY2LCAweDFGNEIsIDB4MDAyRCwKKwkJMHgwMDBFLCAweDFGREYsIDB4MUZDQiwgMHgwNkE1LCAweDAyMzUsIDB4MUYzRiwgMHgwMDJGLAorCQkweDAwMEIsIDB4MUZFQSwgMHgxRkFBLCAweDA2ODYsIDB4MDI3NywgMHgxRjMzLCAweDAwMzEsCisJCTB4MDAwOSwgMHgxRkY1LCAweDFGOEMsIDB4MDY2MywgMHgwMkI4LCAweDFGMjgsIDB4MDAzMywKKwkJMHgwMDA3LCAweDFGRkYsIDB4MUY3MiwgMHgwNjNBLCAweDAyRkIsIDB4MUYxRiwgMHgwMDM0LAorCQkweDAwMDUsIDB4MDAwOCwgMHgxRjVBLCAweDA2MEYsIDB4MDMzRSwgMHgxRjE3LCAweDAwMzUsCisJCTB4MDAwMywgMHgwMDEwLCAweDFGNDYsIDB4MDVFMCwgMHgwMzgyLCAweDFGMTAsIDB4MDAzNSwKKwkJMHgwMDAyLCAweDAwMTcsIDB4MUYzNCwgMHgwNUFGLCAweDAzQzUsIDB4MUYwQiwgMHgwMDM0LAorCQkweDAwMDEsIDB4MDAxRSwgMHgxRjI2LCAweDA1NzksIDB4MDQwNywgMHgxRjA4LCAweDAwMzMsCisJCTB4MDAwMCwgMHgwMDIzLCAweDFGMUEsIDB4MDU0MSwgMHgwNDQ5LCAweDFGMDcsIDB4MDAzMiwKKwkJMHgxRkZGLCAweDAwMjgsIDB4MUYxMiwgMHgwNTA2LCAweDA0OEEsIDB4MUYwOCwgMHgwMDJGLAorCQkweDAwMkMsIDB4MUYwQywgMHgwNEM4LCAweDA0QzgsIDB4MUYwQywgMHgwMDJDLCAweDAwMDAsCisJCTB4MDAyRiwgMHgxRjA4LCAweDA0OEEsIDB4MDUwNiwgMHgxRjEyLCAweDAwMjgsIDB4MUZGRiwKKwkJMHgwMDMyLCAweDFGMDcsIDB4MDQ0OSwgMHgwNTQxLCAweDFGMUEsIDB4MDAyMywgMHgwMDAwLAorCQkweDAwMzMsIDB4MUYwOCwgMHgwNDA3LCAweDA1NzksIDB4MUYyNiwgMHgwMDFFLCAweDAwMDEsCisJCTB4MDAzNCwgMHgxRjBCLCAweDAzQzUsIDB4MDVBRiwgMHgxRjM0LCAweDAwMTcsIDB4MDAwMiwKKwkJMHgwMDM1LCAweDFGMTAsIDB4MDM4MiwgMHgwNUUwLCAweDFGNDYsIDB4MDAxMCwgMHgwMDAzLAorCQkweDAwMzUsIDB4MUYxNywgMHgwMzNFLCAweDA2MEYsIDB4MUY1QSwgMHgwMDA4LCAweDAwMDUsCisJCTB4MDAzNCwgMHgxRjFGLCAweDAyRkIsIDB4MDYzQSwgMHgxRjcyLCAweDFGRkYsIDB4MDAwNywKKwkJMHgwMDMzLCAweDFGMjgsIDB4MDJCOCwgMHgwNjYzLCAweDFGOEMsIDB4MUZGNSwgMHgwMDA5LAorCQkweDAwMzEsIDB4MUYzMywgMHgwMjc3LCAweDA2ODYsIDB4MUZBQSwgMHgxRkVBLCAweDAwMEIsCisJCTB4MDAyRiwgMHgxRjNGLCAweDAyMzUsIDB4MDZBNSwgMHgxRkNCLCAweDFGREYsIDB4MDAwRSwKKwkJMHgwMDJELCAweDFGNEIsIDB4MDFGNiwgMHgwNkMwLCAweDFGRUYsIDB4MUZEMywgMHgwMDEwLAorCQkweDAwMkIsIDB4MUY1OCwgMHgwMUI3LCAweDA2RDYsIDB4MDAxNywgMHgxRkM2LCAweDAwMTMsCisJCTB4MDAyOCwgMHgxRjY2LCAweDAxN0IsIDB4MDZFNywgMHgwMDQxLCAweDFGQjksIDB4MDAxNiwKKwkJMHgwMDI1LCAweDFGNzQsIDB4MDE0MCwgMHgwNkYzLCAweDAwNkYsIDB4MUZBQywgMHgwMDE5LAorCQkweDAwMjIsIDB4MUY4MiwgMHgwMTA4LCAweDA2RkIsIDB4MDA5RiwgMHgxRjlFLCAweDAwMUMsCisJfSwKKwlbSFNfTFRfOV8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkEzLCAweDAwNUUsIDB4MDI0QSwgMHgwMzZBLCAweDAyNEEsIDB4MDA1RSwgMHgxRkEzLAorCQkweDFGQTMsIDB4MDA1MiwgMHgwMjNBLCAweDAzNkEsIDB4MDI1OSwgMHgwMDZBLCAweDFGQTQsCisJCTB4MUZBMywgMHgwMDQ2LCAweDAyMkEsIDB4MDM2QSwgMHgwMjY5LCAweDAwNzYsIDB4MUZBNCwKKwkJMHgxRkEzLCAweDAwM0IsIDB4MDIxQSwgMHgwMzY4LCAweDAyNzgsIDB4MDA4MywgMHgxRkE1LAorCQkweDFGQTQsIDB4MDAzMSwgMHgwMjBBLCAweDAzNjUsIDB4MDI4NiwgMHgwMDkwLCAweDFGQTYsCisJCTB4MUZBNSwgMHgwMDI2LCAweDAxRjksIDB4MDM2MiwgMHgwMjk0LCAweDAwOUUsIDB4MUZBOCwKKwkJMHgxRkE2LCAweDAwMUMsIDB4MDFFOCwgMHgwMzVFLCAweDAyQTMsIDB4MDBBQiwgMHgxRkFBLAorCQkweDFGQTcsIDB4MDAxMywgMHgwMUQ3LCAweDAzNUEsIDB4MDJCMCwgMHgwMEI5LCAweDFGQUMsCisJCTB4MUZBOSwgMHgwMDBBLCAweDAxQzYsIDB4MDM1NCwgMHgwMkJELCAweDAwQzcsIDB4MUZBRiwKKwkJMHgxRkFBLCAweDAwMDEsIDB4MDFCNiwgMHgwMzRFLCAweDAyQzksIDB4MDBENiwgMHgxRkIyLAorCQkweDFGQUMsIDB4MUZGOSwgMHgwMUE1LCAweDAzNDcsIDB4MDJENSwgMHgwMEU1LCAweDFGQjUsCisJCTB4MUZBRSwgMHgxRkYxLCAweDAxOTQsIDB4MDM0MCwgMHgwMkUxLCAweDAwRjMsIDB4MUZCOSwKKwkJMHgxRkIwLCAweDFGRUEsIDB4MDE4MywgMHgwMzM4LCAweDAyRUMsIDB4MDEwMiwgMHgxRkJELAorCQkweDFGQjIsIDB4MUZFMywgMHgwMTcyLCAweDAzMzAsIDB4MDJGNiwgMHgwMTEyLCAweDFGQzEsCisJCTB4MUZCNCwgMHgxRkRDLCAweDAxNjEsIDB4MDMyNywgMHgwMzAxLCAweDAxMjEsIDB4MUZDNiwKKwkJMHgxRkI3LCAweDFGRDYsIDB4MDE1MSwgMHgwMzFELCAweDAzMEEsIDB4MDEzMCwgMHgxRkNCLAorCQkweDFGRDIsIDB4MDEzNiwgMHgwMkY4LCAweDAyRjgsIDB4MDEzNiwgMHgxRkQyLCAweDAwMDAsCisJCTB4MUZDQiwgMHgwMTMwLCAweDAzMEEsIDB4MDMxRCwgMHgwMTUxLCAweDFGRDYsIDB4MUZCNywKKwkJMHgxRkM2LCAweDAxMjEsIDB4MDMwMSwgMHgwMzI3LCAweDAxNjEsIDB4MUZEQywgMHgxRkI0LAorCQkweDFGQzEsIDB4MDExMiwgMHgwMkY2LCAweDAzMzAsIDB4MDE3MiwgMHgxRkUzLCAweDFGQjIsCisJCTB4MUZCRCwgMHgwMTAyLCAweDAyRUMsIDB4MDMzOCwgMHgwMTgzLCAweDFGRUEsIDB4MUZCMCwKKwkJMHgxRkI5LCAweDAwRjMsIDB4MDJFMSwgMHgwMzQwLCAweDAxOTQsIDB4MUZGMSwgMHgxRkFFLAorCQkweDFGQjUsIDB4MDBFNSwgMHgwMkQ1LCAweDAzNDcsIDB4MDFBNSwgMHgxRkY5LCAweDFGQUMsCisJCTB4MUZCMiwgMHgwMEQ2LCAweDAyQzksIDB4MDM0RSwgMHgwMUI2LCAweDAwMDEsIDB4MUZBQSwKKwkJMHgxRkFGLCAweDAwQzcsIDB4MDJCRCwgMHgwMzU0LCAweDAxQzYsIDB4MDAwQSwgMHgxRkE5LAorCQkweDFGQUMsIDB4MDBCOSwgMHgwMkIwLCAweDAzNUEsIDB4MDFENywgMHgwMDEzLCAweDFGQTcsCisJCTB4MUZBQSwgMHgwMEFCLCAweDAyQTMsIDB4MDM1RSwgMHgwMUU4LCAweDAwMUMsIDB4MUZBNiwKKwkJMHgxRkE4LCAweDAwOUUsIDB4MDI5NCwgMHgwMzYyLCAweDAxRjksIDB4MDAyNiwgMHgxRkE1LAorCQkweDFGQTYsIDB4MDA5MCwgMHgwMjg2LCAweDAzNjUsIDB4MDIwQSwgMHgwMDMxLCAweDFGQTQsCisJCTB4MUZBNSwgMHgwMDgzLCAweDAyNzgsIDB4MDM2OCwgMHgwMjFBLCAweDAwM0IsIDB4MUZBMywKKwkJMHgxRkE0LCAweDAwNzYsIDB4MDI2OSwgMHgwMzZBLCAweDAyMkEsIDB4MDA0NiwgMHgxRkEzLAorCQkweDFGQTQsIDB4MDA2QSwgMHgwMjU5LCAweDAzNkEsIDB4MDIzQSwgMHgwMDUyLCAweDFGQTMsCisJCS8qIENocm9tYSAqLworCQkweDFGQTMsIDB4MDA1RSwgMHgwMjRBLCAweDAzNkEsIDB4MDI0QSwgMHgwMDVFLCAweDFGQTMsCisJCTB4MUZBMywgMHgwMDUyLCAweDAyM0EsIDB4MDM2QSwgMHgwMjU5LCAweDAwNkEsIDB4MUZBNCwKKwkJMHgxRkEzLCAweDAwNDYsIDB4MDIyQSwgMHgwMzZBLCAweDAyNjksIDB4MDA3NiwgMHgxRkE0LAorCQkweDFGQTMsIDB4MDAzQiwgMHgwMjFBLCAweDAzNjgsIDB4MDI3OCwgMHgwMDgzLCAweDFGQTUsCisJCTB4MUZBNCwgMHgwMDMxLCAweDAyMEEsIDB4MDM2NSwgMHgwMjg2LCAweDAwOTAsIDB4MUZBNiwKKwkJMHgxRkE1LCAweDAwMjYsIDB4MDFGOSwgMHgwMzYyLCAweDAyOTQsIDB4MDA5RSwgMHgxRkE4LAorCQkweDFGQTYsIDB4MDAxQywgMHgwMUU4LCAweDAzNUUsIDB4MDJBMywgMHgwMEFCLCAweDFGQUEsCisJCTB4MUZBNywgMHgwMDEzLCAweDAxRDcsIDB4MDM1QSwgMHgwMkIwLCAweDAwQjksIDB4MUZBQywKKwkJMHgxRkE5LCAweDAwMEEsIDB4MDFDNiwgMHgwMzU0LCAweDAyQkQsIDB4MDBDNywgMHgxRkFGLAorCQkweDFGQUEsIDB4MDAwMSwgMHgwMUI2LCAweDAzNEUsIDB4MDJDOSwgMHgwMEQ2LCAweDFGQjIsCisJCTB4MUZBQywgMHgxRkY5LCAweDAxQTUsIDB4MDM0NywgMHgwMkQ1LCAweDAwRTUsIDB4MUZCNSwKKwkJMHgxRkFFLCAweDFGRjEsIDB4MDE5NCwgMHgwMzQwLCAweDAyRTEsIDB4MDBGMywgMHgxRkI5LAorCQkweDFGQjAsIDB4MUZFQSwgMHgwMTgzLCAweDAzMzgsIDB4MDJFQywgMHgwMTAyLCAweDFGQkQsCisJCTB4MUZCMiwgMHgxRkUzLCAweDAxNzIsIDB4MDMzMCwgMHgwMkY2LCAweDAxMTIsIDB4MUZDMSwKKwkJMHgxRkI0LCAweDFGREMsIDB4MDE2MSwgMHgwMzI3LCAweDAzMDEsIDB4MDEyMSwgMHgxRkM2LAorCQkweDFGQjcsIDB4MUZENiwgMHgwMTUxLCAweDAzMUQsIDB4MDMwQSwgMHgwMTMwLCAweDFGQ0IsCisJCTB4MUZEMiwgMHgwMTM2LCAweDAyRjgsIDB4MDJGOCwgMHgwMTM2LCAweDFGRDIsIDB4MDAwMCwKKwkJMHgxRkNCLCAweDAxMzAsIDB4MDMwQSwgMHgwMzFELCAweDAxNTEsIDB4MUZENiwgMHgxRkI3LAorCQkweDFGQzYsIDB4MDEyMSwgMHgwMzAxLCAweDAzMjcsIDB4MDE2MSwgMHgxRkRDLCAweDFGQjQsCisJCTB4MUZDMSwgMHgwMTEyLCAweDAyRjYsIDB4MDMzMCwgMHgwMTcyLCAweDFGRTMsIDB4MUZCMiwKKwkJMHgxRkJELCAweDAxMDIsIDB4MDJFQywgMHgwMzM4LCAweDAxODMsIDB4MUZFQSwgMHgxRkIwLAorCQkweDFGQjksIDB4MDBGMywgMHgwMkUxLCAweDAzNDAsIDB4MDE5NCwgMHgxRkYxLCAweDFGQUUsCisJCTB4MUZCNSwgMHgwMEU1LCAweDAyRDUsIDB4MDM0NywgMHgwMUE1LCAweDFGRjksIDB4MUZBQywKKwkJMHgxRkIyLCAweDAwRDYsIDB4MDJDOSwgMHgwMzRFLCAweDAxQjYsIDB4MDAwMSwgMHgxRkFBLAorCQkweDFGQUYsIDB4MDBDNywgMHgwMkJELCAweDAzNTQsIDB4MDFDNiwgMHgwMDBBLCAweDFGQTksCisJCTB4MUZBQywgMHgwMEI5LCAweDAyQjAsIDB4MDM1QSwgMHgwMUQ3LCAweDAwMTMsIDB4MUZBNywKKwkJMHgxRkFBLCAweDAwQUIsIDB4MDJBMywgMHgwMzVFLCAweDAxRTgsIDB4MDAxQywgMHgxRkE2LAorCQkweDFGQTgsIDB4MDA5RSwgMHgwMjk0LCAweDAzNjIsIDB4MDFGOSwgMHgwMDI2LCAweDFGQTUsCisJCTB4MUZBNiwgMHgwMDkwLCAweDAyODYsIDB4MDM2NSwgMHgwMjBBLCAweDAwMzEsIDB4MUZBNCwKKwkJMHgxRkE1LCAweDAwODMsIDB4MDI3OCwgMHgwMzY4LCAweDAyMUEsIDB4MDAzQiwgMHgxRkEzLAorCQkweDFGQTQsIDB4MDA3NiwgMHgwMjY5LCAweDAzNkEsIDB4MDIyQSwgMHgwMDQ2LCAweDFGQTMsCisJCTB4MUZBNCwgMHgwMDZBLCAweDAyNTksIDB4MDM2QSwgMHgwMjNBLCAweDAwNTIsIDB4MUZBMywKKwl9LAorCVtIU19MVF8xMF8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRjhELCAweDAwMEMsIDB4MDI2QSwgMHgwM0ZBLCAweDAyNkEsIDB4MDAwQywgMHgxRjhELAorCQkweDFGOEYsIDB4MDAwMCwgMHgwMjU1LCAweDAzRkEsIDB4MDI3RiwgMHgwMDE5LCAweDFGOEEsCisJCTB4MUY5MiwgMHgxRkY1LCAweDAyM0YsIDB4MDNGOCwgMHgwMjkzLCAweDAwMjcsIDB4MUY4OCwKKwkJMHgxRjk1LCAweDFGRUEsIDB4MDIyQSwgMHgwM0Y2LCAweDAyQTcsIDB4MDAzNCwgMHgxRjg2LAorCQkweDFGOTksIDB4MUZERiwgMHgwMjEzLCAweDAzRjIsIDB4MDJCQiwgMHgwMDQzLCAweDFGODUsCisJCTB4MUY5QywgMHgxRkQ1LCAweDAxRkUsIDB4MDNFRCwgMHgwMkNGLCAweDAwNTIsIDB4MUY4MywKKwkJMHgxRkEwLCAweDFGQ0MsIDB4MDFFOCwgMHgwM0U3LCAweDAyRTEsIDB4MDA2MSwgMHgxRjgzLAorCQkweDFGQTQsIDB4MUZDMywgMHgwMUQyLCAweDAzRTAsIDB4MDJGNCwgMHgwMDcxLCAweDFGODIsCisJCTB4MUZBNywgMHgxRkJCLCAweDAxQkMsIDB4MDNEOSwgMHgwMzA2LCAweDAwODEsIDB4MUY4MiwKKwkJMHgxRkFCLCAweDFGQjQsIDB4MDFBNiwgMHgwM0QwLCAweDAzMTcsIDB4MDA5MiwgMHgxRjgyLAorCQkweDFGQUYsIDB4MUZBRCwgMHgwMTkwLCAweDAzQzcsIDB4MDMyNywgMHgwMEEzLCAweDFGODMsCisJCTB4MUZCMywgMHgxRkE3LCAweDAxN0EsIDB4MDNCQywgMHgwMzM3LCAweDAwQjUsIDB4MUY4NCwKKwkJMHgxRkI4LCAweDFGQTEsIDB4MDE2NSwgMHgwM0IwLCAweDAzNDYsIDB4MDBDNywgMHgxRjg1LAorCQkweDFGQkMsIDB4MUY5QywgMHgwMTUwLCAweDAzQTQsIDB4MDM1NCwgMHgwMEQ5LCAweDFGODcsCisJCTB4MUZDMCwgMHgxRjk4LCAweDAxM0EsIDB4MDM5NywgMHgwMzYxLCAweDAwRUMsIDB4MUY4QSwKKwkJMHgxRkM0LCAweDFGOTMsIDB4MDEyNiwgMHgwMzg5LCAweDAzNkYsIDB4MDBGRSwgMHgxRjhELAorCQkweDFGOTMsIDB4MDEwQSwgMHgwMzYzLCAweDAzNjMsIDB4MDEwQSwgMHgxRjkzLCAweDAwMDAsCisJCTB4MUY4RCwgMHgwMEZFLCAweDAzNkYsIDB4MDM4OSwgMHgwMTI2LCAweDFGOTMsIDB4MUZDNCwKKwkJMHgxRjhBLCAweDAwRUMsIDB4MDM2MSwgMHgwMzk3LCAweDAxM0EsIDB4MUY5OCwgMHgxRkMwLAorCQkweDFGODcsIDB4MDBEOSwgMHgwMzU0LCAweDAzQTQsIDB4MDE1MCwgMHgxRjlDLCAweDFGQkMsCisJCTB4MUY4NSwgMHgwMEM3LCAweDAzNDYsIDB4MDNCMCwgMHgwMTY1LCAweDFGQTEsIDB4MUZCOCwKKwkJMHgxRjg0LCAweDAwQjUsIDB4MDMzNywgMHgwM0JDLCAweDAxN0EsIDB4MUZBNywgMHgxRkIzLAorCQkweDFGODMsIDB4MDBBMywgMHgwMzI3LCAweDAzQzcsIDB4MDE5MCwgMHgxRkFELCAweDFGQUYsCisJCTB4MUY4MiwgMHgwMDkyLCAweDAzMTcsIDB4MDNEMCwgMHgwMUE2LCAweDFGQjQsIDB4MUZBQiwKKwkJMHgxRjgyLCAweDAwODEsIDB4MDMwNiwgMHgwM0Q5LCAweDAxQkMsIDB4MUZCQiwgMHgxRkE3LAorCQkweDFGODIsIDB4MDA3MSwgMHgwMkY0LCAweDAzRTAsIDB4MDFEMiwgMHgxRkMzLCAweDFGQTQsCisJCTB4MUY4MywgMHgwMDYxLCAweDAyRTEsIDB4MDNFNywgMHgwMUU4LCAweDFGQ0MsIDB4MUZBMCwKKwkJMHgxRjgzLCAweDAwNTIsIDB4MDJDRiwgMHgwM0VELCAweDAxRkUsIDB4MUZENSwgMHgxRjlDLAorCQkweDFGODUsIDB4MDA0MywgMHgwMkJCLCAweDAzRjIsIDB4MDIxMywgMHgxRkRGLCAweDFGOTksCisJCTB4MUY4NiwgMHgwMDM0LCAweDAyQTcsIDB4MDNGNiwgMHgwMjJBLCAweDFGRUEsIDB4MUY5NSwKKwkJMHgxRjg4LCAweDAwMjcsIDB4MDI5MywgMHgwM0Y4LCAweDAyM0YsIDB4MUZGNSwgMHgxRjkyLAorCQkweDFGOEEsIDB4MDAxOSwgMHgwMjdGLCAweDAzRkEsIDB4MDI1NSwgMHgwMDAwLCAweDFGOEYsCisJCS8qIENocm9tYSAqLworCQkweDFGOEQsIDB4MDAwQywgMHgwMjZBLCAweDAzRkEsIDB4MDI2QSwgMHgwMDBDLCAweDFGOEQsCisJCTB4MUY4RiwgMHgwMDAwLCAweDAyNTUsIDB4MDNGQSwgMHgwMjdGLCAweDAwMTksIDB4MUY4QSwKKwkJMHgxRjkyLCAweDFGRjUsIDB4MDIzRiwgMHgwM0Y4LCAweDAyOTMsIDB4MDAyNywgMHgxRjg4LAorCQkweDFGOTUsIDB4MUZFQSwgMHgwMjJBLCAweDAzRjYsIDB4MDJBNywgMHgwMDM0LCAweDFGODYsCisJCTB4MUY5OSwgMHgxRkRGLCAweDAyMTMsIDB4MDNGMiwgMHgwMkJCLCAweDAwNDMsIDB4MUY4NSwKKwkJMHgxRjlDLCAweDFGRDUsIDB4MDFGRSwgMHgwM0VELCAweDAyQ0YsIDB4MDA1MiwgMHgxRjgzLAorCQkweDFGQTAsIDB4MUZDQywgMHgwMUU4LCAweDAzRTcsIDB4MDJFMSwgMHgwMDYxLCAweDFGODMsCisJCTB4MUZBNCwgMHgxRkMzLCAweDAxRDIsIDB4MDNFMCwgMHgwMkY0LCAweDAwNzEsIDB4MUY4MiwKKwkJMHgxRkE3LCAweDFGQkIsIDB4MDFCQywgMHgwM0Q5LCAweDAzMDYsIDB4MDA4MSwgMHgxRjgyLAorCQkweDFGQUIsIDB4MUZCNCwgMHgwMUE2LCAweDAzRDAsIDB4MDMxNywgMHgwMDkyLCAweDFGODIsCisJCTB4MUZBRiwgMHgxRkFELCAweDAxOTAsIDB4MDNDNywgMHgwMzI3LCAweDAwQTMsIDB4MUY4MywKKwkJMHgxRkIzLCAweDFGQTcsIDB4MDE3QSwgMHgwM0JDLCAweDAzMzcsIDB4MDBCNSwgMHgxRjg0LAorCQkweDFGQjgsIDB4MUZBMSwgMHgwMTY1LCAweDAzQjAsIDB4MDM0NiwgMHgwMEM3LCAweDFGODUsCisJCTB4MUZCQywgMHgxRjlDLCAweDAxNTAsIDB4MDNBNCwgMHgwMzU0LCAweDAwRDksIDB4MUY4NywKKwkJMHgxRkMwLCAweDFGOTgsIDB4MDEzQSwgMHgwMzk3LCAweDAzNjEsIDB4MDBFQywgMHgxRjhBLAorCQkweDFGQzQsIDB4MUY5MywgMHgwMTI2LCAweDAzODksIDB4MDM2RiwgMHgwMEZFLCAweDFGOEQsCisJCTB4MUY5MywgMHgwMTBBLCAweDAzNjMsIDB4MDM2MywgMHgwMTBBLCAweDFGOTMsIDB4MDAwMCwKKwkJMHgxRjhELCAweDAwRkUsIDB4MDM2RiwgMHgwMzg5LCAweDAxMjYsIDB4MUY5MywgMHgxRkM0LAorCQkweDFGOEEsIDB4MDBFQywgMHgwMzYxLCAweDAzOTcsIDB4MDEzQSwgMHgxRjk4LCAweDFGQzAsCisJCTB4MUY4NywgMHgwMEQ5LCAweDAzNTQsIDB4MDNBNCwgMHgwMTUwLCAweDFGOUMsIDB4MUZCQywKKwkJMHgxRjg1LCAweDAwQzcsIDB4MDM0NiwgMHgwM0IwLCAweDAxNjUsIDB4MUZBMSwgMHgxRkI4LAorCQkweDFGODQsIDB4MDBCNSwgMHgwMzM3LCAweDAzQkMsIDB4MDE3QSwgMHgxRkE3LCAweDFGQjMsCisJCTB4MUY4MywgMHgwMEEzLCAweDAzMjcsIDB4MDNDNywgMHgwMTkwLCAweDFGQUQsIDB4MUZBRiwKKwkJMHgxRjgyLCAweDAwOTIsIDB4MDMxNywgMHgwM0QwLCAweDAxQTYsIDB4MUZCNCwgMHgxRkFCLAorCQkweDFGODIsIDB4MDA4MSwgMHgwMzA2LCAweDAzRDksIDB4MDFCQywgMHgxRkJCLCAweDFGQTcsCisJCTB4MUY4MiwgMHgwMDcxLCAweDAyRjQsIDB4MDNFMCwgMHgwMUQyLCAweDFGQzMsIDB4MUZBNCwKKwkJMHgxRjgzLCAweDAwNjEsIDB4MDJFMSwgMHgwM0U3LCAweDAxRTgsIDB4MUZDQywgMHgxRkEwLAorCQkweDFGODMsIDB4MDA1MiwgMHgwMkNGLCAweDAzRUQsIDB4MDFGRSwgMHgxRkQ1LCAweDFGOUMsCisJCTB4MUY4NSwgMHgwMDQzLCAweDAyQkIsIDB4MDNGMiwgMHgwMjEzLCAweDFGREYsIDB4MUY5OSwKKwkJMHgxRjg2LCAweDAwMzQsIDB4MDJBNywgMHgwM0Y2LCAweDAyMkEsIDB4MUZFQSwgMHgxRjk1LAorCQkweDFGODgsIDB4MDAyNywgMHgwMjkzLCAweDAzRjgsIDB4MDIzRiwgMHgxRkY1LCAweDFGOTIsCisJCTB4MUY4QSwgMHgwMDE5LCAweDAyN0YsIDB4MDNGQSwgMHgwMjU1LCAweDAwMDAsIDB4MUY4RiwKKwl9LAorCVtIU19MVF8xMV8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRjk1LCAweDFGQjUsIDB4MDI3MiwgMHgwNDg4LCAweDAyNzIsIDB4MUZCNSwgMHgxRjk1LAorCQkweDFGOUIsIDB4MUZBQSwgMHgwMjU3LCAweDA0ODYsIDB4MDI4RCwgMHgxRkMxLCAweDFGOTAsCisJCTB4MUZBMCwgMHgxRkEwLCAweDAyM0MsIDB4MDQ4NSwgMHgwMkE4LCAweDFGQ0QsIDB4MUY4QSwKKwkJMHgxRkE2LCAweDFGOTYsIDB4MDIyMSwgMHgwNDgxLCAweDAyQzIsIDB4MUZEQiwgMHgxRjg1LAorCQkweDFGQUMsIDB4MUY4RSwgMHgwMjA1LCAweDA0N0MsIDB4MDJEQywgMHgxRkU5LCAweDFGODAsCisJCTB4MUZCMSwgMHgxRjg2LCAweDAxRTksIDB4MDQ3NiwgMHgwMkY2LCAweDFGRjgsIDB4MUY3QywKKwkJMHgxRkI3LCAweDFGN0YsIDB4MDFDRSwgMHgwNDZFLCAweDAzMEYsIDB4MDAwOCwgMHgxRjc3LAorCQkweDFGQkQsIDB4MUY3OSwgMHgwMUIzLCAweDA0NjUsIDB4MDMyNiwgMHgwMDE5LCAweDFGNzMsCisJCTB4MUZDMywgMHgxRjczLCAweDAxOTcsIDB4MDQ1QiwgMHgwMzNFLCAweDAwMkEsIDB4MUY3MCwKKwkJMHgxRkM4LCAweDFGNkYsIDB4MDE3RCwgMHgwNDRFLCAweDAzNTUsIDB4MDAzQywgMHgxRjZELAorCQkweDFGQ0UsIDB4MUY2QiwgMHgwMTYyLCAweDA0NDEsIDB4MDM2QiwgMHgwMDRGLCAweDFGNkEsCisJCTB4MUZEMywgMHgxRjY4LCAweDAxNDgsIDB4MDQzMywgMHgwMzgwLCAweDAwNjMsIDB4MUY2NywKKwkJMHgxRkQ4LCAweDFGNjUsIDB4MDEyRSwgMHgwNDI0LCAweDAzOTUsIDB4MDA3NywgMHgxRjY1LAorCQkweDFGREUsIDB4MUY2MywgMHgwMTE1LCAweDA0MTMsIDB4MDNBOCwgMHgwMDhCLCAweDFGNjQsCisJCTB4MUZFMywgMHgxRjYyLCAweDAwRkMsIDB4MDQwMywgMHgwM0JBLCAweDAwQTAsIDB4MUY2MiwKKwkJMHgxRkU3LCAweDFGNjIsIDB4MDBFNCwgMHgwM0VGLCAweDAzQ0MsIDB4MDBCNiwgMHgxRjYyLAorCQkweDFGNjMsIDB4MDBDQSwgMHgwM0QzLCAweDAzRDMsIDB4MDBDQSwgMHgxRjYzLCAweDAwMDAsCisJCTB4MUY2MiwgMHgwMEI2LCAweDAzQ0MsIDB4MDNFRiwgMHgwMEU0LCAweDFGNjIsIDB4MUZFNywKKwkJMHgxRjYyLCAweDAwQTAsIDB4MDNCQSwgMHgwNDAzLCAweDAwRkMsIDB4MUY2MiwgMHgxRkUzLAorCQkweDFGNjQsIDB4MDA4QiwgMHgwM0E4LCAweDA0MTMsIDB4MDExNSwgMHgxRjYzLCAweDFGREUsCisJCTB4MUY2NSwgMHgwMDc3LCAweDAzOTUsIDB4MDQyNCwgMHgwMTJFLCAweDFGNjUsIDB4MUZEOCwKKwkJMHgxRjY3LCAweDAwNjMsIDB4MDM4MCwgMHgwNDMzLCAweDAxNDgsIDB4MUY2OCwgMHgxRkQzLAorCQkweDFGNkEsIDB4MDA0RiwgMHgwMzZCLCAweDA0NDEsIDB4MDE2MiwgMHgxRjZCLCAweDFGQ0UsCisJCTB4MUY2RCwgMHgwMDNDLCAweDAzNTUsIDB4MDQ0RSwgMHgwMTdELCAweDFGNkYsIDB4MUZDOCwKKwkJMHgxRjcwLCAweDAwMkEsIDB4MDMzRSwgMHgwNDVCLCAweDAxOTcsIDB4MUY3MywgMHgxRkMzLAorCQkweDFGNzMsIDB4MDAxOSwgMHgwMzI2LCAweDA0NjUsIDB4MDFCMywgMHgxRjc5LCAweDFGQkQsCisJCTB4MUY3NywgMHgwMDA4LCAweDAzMEYsIDB4MDQ2RSwgMHgwMUNFLCAweDFGN0YsIDB4MUZCNywKKwkJMHgxRjdDLCAweDFGRjgsIDB4MDJGNiwgMHgwNDc2LCAweDAxRTksIDB4MUY4NiwgMHgxRkIxLAorCQkweDFGODAsIDB4MUZFOSwgMHgwMkRDLCAweDA0N0MsIDB4MDIwNSwgMHgxRjhFLCAweDFGQUMsCisJCTB4MUY4NSwgMHgxRkRCLCAweDAyQzIsIDB4MDQ4MSwgMHgwMjIxLCAweDFGOTYsIDB4MUZBNiwKKwkJMHgxRjhBLCAweDFGQ0QsIDB4MDJBOCwgMHgwNDg1LCAweDAyM0MsIDB4MUZBMCwgMHgxRkEwLAorCQkweDFGOTAsIDB4MUZDMSwgMHgwMjhELCAweDA0ODYsIDB4MDI1NywgMHgxRkFBLCAweDFGOUIsCisJCS8qIENocm9tYSAqLworCQkweDFGOTUsIDB4MUZCNSwgMHgwMjcyLCAweDA0ODgsIDB4MDI3MiwgMHgxRkI1LCAweDFGOTUsCisJCTB4MUY5QiwgMHgxRkFBLCAweDAyNTcsIDB4MDQ4NiwgMHgwMjhELCAweDFGQzEsIDB4MUY5MCwKKwkJMHgxRkEwLCAweDFGQTAsIDB4MDIzQywgMHgwNDg1LCAweDAyQTgsIDB4MUZDRCwgMHgxRjhBLAorCQkweDFGQTYsIDB4MUY5NiwgMHgwMjIxLCAweDA0ODEsIDB4MDJDMiwgMHgxRkRCLCAweDFGODUsCisJCTB4MUZBQywgMHgxRjhFLCAweDAyMDUsIDB4MDQ3QywgMHgwMkRDLCAweDFGRTksIDB4MUY4MCwKKwkJMHgxRkIxLCAweDFGODYsIDB4MDFFOSwgMHgwNDc2LCAweDAyRjYsIDB4MUZGOCwgMHgxRjdDLAorCQkweDFGQjcsIDB4MUY3RiwgMHgwMUNFLCAweDA0NkUsIDB4MDMwRiwgMHgwMDA4LCAweDFGNzcsCisJCTB4MUZCRCwgMHgxRjc5LCAweDAxQjMsIDB4MDQ2NSwgMHgwMzI2LCAweDAwMTksIDB4MUY3MywKKwkJMHgxRkMzLCAweDFGNzMsIDB4MDE5NywgMHgwNDVCLCAweDAzM0UsIDB4MDAyQSwgMHgxRjcwLAorCQkweDFGQzgsIDB4MUY2RiwgMHgwMTdELCAweDA0NEUsIDB4MDM1NSwgMHgwMDNDLCAweDFGNkQsCisJCTB4MUZDRSwgMHgxRjZCLCAweDAxNjIsIDB4MDQ0MSwgMHgwMzZCLCAweDAwNEYsIDB4MUY2QSwKKwkJMHgxRkQzLCAweDFGNjgsIDB4MDE0OCwgMHgwNDMzLCAweDAzODAsIDB4MDA2MywgMHgxRjY3LAorCQkweDFGRDgsIDB4MUY2NSwgMHgwMTJFLCAweDA0MjQsIDB4MDM5NSwgMHgwMDc3LCAweDFGNjUsCisJCTB4MUZERSwgMHgxRjYzLCAweDAxMTUsIDB4MDQxMywgMHgwM0E4LCAweDAwOEIsIDB4MUY2NCwKKwkJMHgxRkUzLCAweDFGNjIsIDB4MDBGQywgMHgwNDAzLCAweDAzQkEsIDB4MDBBMCwgMHgxRjYyLAorCQkweDFGRTcsIDB4MUY2MiwgMHgwMEU0LCAweDAzRUYsIDB4MDNDQywgMHgwMEI2LCAweDFGNjIsCisJCTB4MUY2MywgMHgwMENBLCAweDAzRDMsIDB4MDNEMywgMHgwMENBLCAweDFGNjMsIDB4MDAwMCwKKwkJMHgxRjYyLCAweDAwQjYsIDB4MDNDQywgMHgwM0VGLCAweDAwRTQsIDB4MUY2MiwgMHgxRkU3LAorCQkweDFGNjIsIDB4MDBBMCwgMHgwM0JBLCAweDA0MDMsIDB4MDBGQywgMHgxRjYyLCAweDFGRTMsCisJCTB4MUY2NCwgMHgwMDhCLCAweDAzQTgsIDB4MDQxMywgMHgwMTE1LCAweDFGNjMsIDB4MUZERSwKKwkJMHgxRjY1LCAweDAwNzcsIDB4MDM5NSwgMHgwNDI0LCAweDAxMkUsIDB4MUY2NSwgMHgxRkQ4LAorCQkweDFGNjcsIDB4MDA2MywgMHgwMzgwLCAweDA0MzMsIDB4MDE0OCwgMHgxRjY4LCAweDFGRDMsCisJCTB4MUY2QSwgMHgwMDRGLCAweDAzNkIsIDB4MDQ0MSwgMHgwMTYyLCAweDFGNkIsIDB4MUZDRSwKKwkJMHgxRjZELCAweDAwM0MsIDB4MDM1NSwgMHgwNDRFLCAweDAxN0QsIDB4MUY2RiwgMHgxRkM4LAorCQkweDFGNzAsIDB4MDAyQSwgMHgwMzNFLCAweDA0NUIsIDB4MDE5NywgMHgxRjczLCAweDFGQzMsCisJCTB4MUY3MywgMHgwMDE5LCAweDAzMjYsIDB4MDQ2NSwgMHgwMUIzLCAweDFGNzksIDB4MUZCRCwKKwkJMHgxRjc3LCAweDAwMDgsIDB4MDMwRiwgMHgwNDZFLCAweDAxQ0UsIDB4MUY3RiwgMHgxRkI3LAorCQkweDFGN0MsIDB4MUZGOCwgMHgwMkY2LCAweDA0NzYsIDB4MDFFOSwgMHgxRjg2LCAweDFGQjEsCisJCTB4MUY4MCwgMHgxRkU5LCAweDAyREMsIDB4MDQ3QywgMHgwMjA1LCAweDFGOEUsIDB4MUZBQywKKwkJMHgxRjg1LCAweDFGREIsIDB4MDJDMiwgMHgwNDgxLCAweDAyMjEsIDB4MUY5NiwgMHgxRkE2LAorCQkweDFGOEEsIDB4MUZDRCwgMHgwMkE4LCAweDA0ODUsIDB4MDIzQywgMHgxRkEwLCAweDFGQTAsCisJCTB4MUY5MCwgMHgxRkMxLCAweDAyOEQsIDB4MDQ4NiwgMHgwMjU3LCAweDFGQUEsIDB4MUY5QiwKKwl9LAorCVtIU19MVF8xMl8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkJCLCAweDFGNjUsIDB4MDI1RSwgMHgwNTA0LCAweDAyNUUsIDB4MUY2NSwgMHgxRkJCLAorCQkweDFGQzMsIDB4MUY1RCwgMHgwMjNDLCAweDA1MDMsIDB4MDI3RiwgMHgxRjZFLCAweDFGQjQsCisJCTB4MUZDQSwgMHgxRjU2LCAweDAyMUIsIDB4MDUwMSwgMHgwMkEwLCAweDFGNzgsIDB4MUZBQywKKwkJMHgxRkQxLCAweDFGNTAsIDB4MDFGQSwgMHgwNEZELCAweDAyQzAsIDB4MUY4MywgMHgxRkE1LAorCQkweDFGRDgsIDB4MUY0QiwgMHgwMUQ5LCAweDA0RjYsIDB4MDJFMSwgMHgxRjkwLCAweDFGOUQsCisJCTB4MUZERiwgMHgxRjQ3LCAweDAxQjgsIDB4MDRFRiwgMHgwMzAxLCAweDFGOUQsIDB4MUY5NSwKKwkJMHgxRkU2LCAweDFGNDMsIDB4MDE5OCwgMHgwNEU1LCAweDAzMjEsIDB4MUZBQiwgMHgxRjhFLAorCQkweDFGRUMsIDB4MUY0MSwgMHgwMTc4LCAweDA0REEsIDB4MDM0MCwgMHgxRkJCLCAweDFGODYsCisJCTB4MUZGMiwgMHgxRjQwLCAweDAxNTksIDB4MDRDQywgMHgwMzVFLCAweDFGQ0MsIDB4MUY3RiwKKwkJMHgxRkY4LCAweDFGNDAsIDB4MDEzQSwgMHgwNEJFLCAweDAzN0IsIDB4MUZERCwgMHgxRjc4LAorCQkweDFGRkUsIDB4MUY0MCwgMHgwMTFCLCAweDA0QUQsIDB4MDM5OCwgMHgxRkYwLCAweDFGNzIsCisJCTB4MDAwMywgMHgxRjQxLCAweDAwRkQsIDB4MDQ5QywgMHgwM0I0LCAweDAwMDQsIDB4MUY2QiwKKwkJMHgwMDA4LCAweDFGNDMsIDB4MDBFMCwgMHgwNDg5LCAweDAzQ0UsIDB4MDAxOSwgMHgxRjY1LAorCQkweDAwMEQsIDB4MUY0NiwgMHgwMEM0LCAweDA0NzQsIDB4MDNFOCwgMHgwMDJFLCAweDFGNUYsCisJCTB4MDAxMSwgMHgxRjQ5LCAweDAwQTksIDB4MDQ1RSwgMHgwNDAwLCAweDAwNDUsIDB4MUY1QSwKKwkJMHgwMDE1LCAweDFGNEQsIDB4MDA4RSwgMHgwNDQ3LCAweDA0MTgsIDB4MDA1QywgMHgxRjU1LAorCQkweDFGNEYsIDB4MDA3NiwgMHgwNDNCLCAweDA0M0IsIDB4MDA3NiwgMHgxRjRGLCAweDAwMDAsCisJCTB4MUY1NSwgMHgwMDVDLCAweDA0MTgsIDB4MDQ0NywgMHgwMDhFLCAweDFGNEQsIDB4MDAxNSwKKwkJMHgxRjVBLCAweDAwNDUsIDB4MDQwMCwgMHgwNDVFLCAweDAwQTksIDB4MUY0OSwgMHgwMDExLAorCQkweDFGNUYsIDB4MDAyRSwgMHgwM0U4LCAweDA0NzQsIDB4MDBDNCwgMHgxRjQ2LCAweDAwMEQsCisJCTB4MUY2NSwgMHgwMDE5LCAweDAzQ0UsIDB4MDQ4OSwgMHgwMEUwLCAweDFGNDMsIDB4MDAwOCwKKwkJMHgxRjZCLCAweDAwMDQsIDB4MDNCNCwgMHgwNDlDLCAweDAwRkQsIDB4MUY0MSwgMHgwMDAzLAorCQkweDFGNzIsIDB4MUZGMCwgMHgwMzk4LCAweDA0QUQsIDB4MDExQiwgMHgxRjQwLCAweDFGRkUsCisJCTB4MUY3OCwgMHgxRkRELCAweDAzN0IsIDB4MDRCRSwgMHgwMTNBLCAweDFGNDAsIDB4MUZGOCwKKwkJMHgxRjdGLCAweDFGQ0MsIDB4MDM1RSwgMHgwNENDLCAweDAxNTksIDB4MUY0MCwgMHgxRkYyLAorCQkweDFGODYsIDB4MUZCQiwgMHgwMzQwLCAweDA0REEsIDB4MDE3OCwgMHgxRjQxLCAweDFGRUMsCisJCTB4MUY4RSwgMHgxRkFCLCAweDAzMjEsIDB4MDRFNSwgMHgwMTk4LCAweDFGNDMsIDB4MUZFNiwKKwkJMHgxRjk1LCAweDFGOUQsIDB4MDMwMSwgMHgwNEVGLCAweDAxQjgsIDB4MUY0NywgMHgxRkRGLAorCQkweDFGOUQsIDB4MUY5MCwgMHgwMkUxLCAweDA0RjYsIDB4MDFEOSwgMHgxRjRCLCAweDFGRDgsCisJCTB4MUZBNSwgMHgxRjgzLCAweDAyQzAsIDB4MDRGRCwgMHgwMUZBLCAweDFGNTAsIDB4MUZEMSwKKwkJMHgxRkFDLCAweDFGNzgsIDB4MDJBMCwgMHgwNTAxLCAweDAyMUIsIDB4MUY1NiwgMHgxRkNBLAorCQkweDFGQjQsIDB4MUY2RSwgMHgwMjdGLCAweDA1MDMsIDB4MDIzQywgMHgxRjVELCAweDFGQzMsCisJCS8qIENocm9tYSAqLworCQkweDFGQkIsIDB4MUY2NSwgMHgwMjVFLCAweDA1MDQsIDB4MDI1RSwgMHgxRjY1LCAweDFGQkIsCisJCTB4MUZDMywgMHgxRjVELCAweDAyM0MsIDB4MDUwMywgMHgwMjdGLCAweDFGNkUsIDB4MUZCNCwKKwkJMHgxRkNBLCAweDFGNTYsIDB4MDIxQiwgMHgwNTAxLCAweDAyQTAsIDB4MUY3OCwgMHgxRkFDLAorCQkweDFGRDEsIDB4MUY1MCwgMHgwMUZBLCAweDA0RkQsIDB4MDJDMCwgMHgxRjgzLCAweDFGQTUsCisJCTB4MUZEOCwgMHgxRjRCLCAweDAxRDksIDB4MDRGNiwgMHgwMkUxLCAweDFGOTAsIDB4MUY5RCwKKwkJMHgxRkRGLCAweDFGNDcsIDB4MDFCOCwgMHgwNEVGLCAweDAzMDEsIDB4MUY5RCwgMHgxRjk1LAorCQkweDFGRTYsIDB4MUY0MywgMHgwMTk4LCAweDA0RTUsIDB4MDMyMSwgMHgxRkFCLCAweDFGOEUsCisJCTB4MUZFQywgMHgxRjQxLCAweDAxNzgsIDB4MDREQSwgMHgwMzQwLCAweDFGQkIsIDB4MUY4NiwKKwkJMHgxRkYyLCAweDFGNDAsIDB4MDE1OSwgMHgwNENDLCAweDAzNUUsIDB4MUZDQywgMHgxRjdGLAorCQkweDFGRjgsIDB4MUY0MCwgMHgwMTNBLCAweDA0QkUsIDB4MDM3QiwgMHgxRkRELCAweDFGNzgsCisJCTB4MUZGRSwgMHgxRjQwLCAweDAxMUIsIDB4MDRBRCwgMHgwMzk4LCAweDFGRjAsIDB4MUY3MiwKKwkJMHgwMDAzLCAweDFGNDEsIDB4MDBGRCwgMHgwNDlDLCAweDAzQjQsIDB4MDAwNCwgMHgxRjZCLAorCQkweDAwMDgsIDB4MUY0MywgMHgwMEUwLCAweDA0ODksIDB4MDNDRSwgMHgwMDE5LCAweDFGNjUsCisJCTB4MDAwRCwgMHgxRjQ2LCAweDAwQzQsIDB4MDQ3NCwgMHgwM0U4LCAweDAwMkUsIDB4MUY1RiwKKwkJMHgwMDExLCAweDFGNDksIDB4MDBBOSwgMHgwNDVFLCAweDA0MDAsIDB4MDA0NSwgMHgxRjVBLAorCQkweDAwMTUsIDB4MUY0RCwgMHgwMDhFLCAweDA0NDcsIDB4MDQxOCwgMHgwMDVDLCAweDFGNTUsCisJCTB4MUY0RiwgMHgwMDc2LCAweDA0M0IsIDB4MDQzQiwgMHgwMDc2LCAweDFGNEYsIDB4MDAwMCwKKwkJMHgxRjU1LCAweDAwNUMsIDB4MDQxOCwgMHgwNDQ3LCAweDAwOEUsIDB4MUY0RCwgMHgwMDE1LAorCQkweDFGNUEsIDB4MDA0NSwgMHgwNDAwLCAweDA0NUUsIDB4MDBBOSwgMHgxRjQ5LCAweDAwMTEsCisJCTB4MUY1RiwgMHgwMDJFLCAweDAzRTgsIDB4MDQ3NCwgMHgwMEM0LCAweDFGNDYsIDB4MDAwRCwKKwkJMHgxRjY1LCAweDAwMTksIDB4MDNDRSwgMHgwNDg5LCAweDAwRTAsIDB4MUY0MywgMHgwMDA4LAorCQkweDFGNkIsIDB4MDAwNCwgMHgwM0I0LCAweDA0OUMsIDB4MDBGRCwgMHgxRjQxLCAweDAwMDMsCisJCTB4MUY3MiwgMHgxRkYwLCAweDAzOTgsIDB4MDRBRCwgMHgwMTFCLCAweDFGNDAsIDB4MUZGRSwKKwkJMHgxRjc4LCAweDFGREQsIDB4MDM3QiwgMHgwNEJFLCAweDAxM0EsIDB4MUY0MCwgMHgxRkY4LAorCQkweDFGN0YsIDB4MUZDQywgMHgwMzVFLCAweDA0Q0MsIDB4MDE1OSwgMHgxRjQwLCAweDFGRjIsCisJCTB4MUY4NiwgMHgxRkJCLCAweDAzNDAsIDB4MDREQSwgMHgwMTc4LCAweDFGNDEsIDB4MUZFQywKKwkJMHgxRjhFLCAweDFGQUIsIDB4MDMyMSwgMHgwNEU1LCAweDAxOTgsIDB4MUY0MywgMHgxRkU2LAorCQkweDFGOTUsIDB4MUY5RCwgMHgwMzAxLCAweDA0RUYsIDB4MDFCOCwgMHgxRjQ3LCAweDFGREYsCisJCTB4MUY5RCwgMHgxRjkwLCAweDAyRTEsIDB4MDRGNiwgMHgwMUQ5LCAweDFGNEIsIDB4MUZEOCwKKwkJMHgxRkE1LCAweDFGODMsIDB4MDJDMCwgMHgwNEZELCAweDAxRkEsIDB4MUY1MCwgMHgxRkQxLAorCQkweDFGQUMsIDB4MUY3OCwgMHgwMkEwLCAweDA1MDEsIDB4MDIxQiwgMHgxRjU2LCAweDFGQ0EsCisJCTB4MUZCNCwgMHgxRjZFLCAweDAyN0YsIDB4MDUwMywgMHgwMjNDLCAweDFGNUQsIDB4MUZDMywKKwl9LAorCVtIU19MVF8xM18xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkY0LCAweDFGMjksIDB4MDIyRCwgMHgwNTZDLCAweDAyMkQsIDB4MUYyOSwgMHgxRkY0LAorCQkweDFGRkMsIDB4MUYyNiwgMHgwMjA2LCAweDA1NkEsIDB4MDI1NCwgMHgxRjJFLCAweDFGRUMsCisJCTB4MDAwMywgMHgxRjI0LCAweDAxRTAsIDB4MDU2NywgMHgwMjdBLCAweDFGMzQsIDB4MUZFNCwKKwkJMHgwMDBBLCAweDFGMjMsIDB4MDFCQSwgMHgwNTYxLCAweDAyQTIsIDB4MUYzQiwgMHgxRkRCLAorCQkweDAwMTEsIDB4MUYyMiwgMHgwMTk0LCAweDA1NUIsIDB4MDJDOSwgMHgxRjQzLCAweDFGRDIsCisJCTB4MDAxNywgMHgxRjIzLCAweDAxNkYsIDB4MDU1MSwgMHgwMkYwLCAweDFGNEQsIDB4MUZDOSwKKwkJMHgwMDFELCAweDFGMjUsIDB4MDE0QiwgMHgwNTQ1LCAweDAzMTYsIDB4MUY1OCwgMHgxRkMwLAorCQkweDAwMjIsIDB4MUYyOCwgMHgwMTI3LCAweDA1MzgsIDB4MDMzQywgMHgxRjY1LCAweDFGQjYsCisJCTB4MDAyNywgMHgxRjJDLCAweDAxMDQsIDB4MDUyOCwgMHgwMzYxLCAweDFGNzMsIDB4MUZBRCwKKwkJMHgwMDJCLCAweDFGMzAsIDB4MDBFMiwgMHgwNTE4LCAweDAzODYsIDB4MUY4MiwgMHgxRkEzLAorCQkweDAwMkYsIDB4MUYzNiwgMHgwMEMyLCAweDA1MDQsIDB4MDNBQSwgMHgxRjkyLCAweDFGOTksCisJCTB4MDAzMiwgMHgxRjNDLCAweDAwQTIsIDB4MDRFRiwgMHgwM0NELCAweDFGQTQsIDB4MUY5MCwKKwkJMHgwMDM1LCAweDFGNDIsIDB4MDA4MywgMHgwNEQ5LCAweDAzRUYsIDB4MUZCOCwgMHgxRjg2LAorCQkweDAwMzgsIDB4MUY0OSwgMHgwMDY1LCAweDA0QzAsIDB4MDQxMCwgMHgxRkNELCAweDFGN0QsCisJCTB4MDAzQSwgMHgxRjUxLCAweDAwNDgsIDB4MDRBNiwgMHgwNDMxLCAweDFGRTMsIDB4MUY3MywKKwkJMHgwMDNDLCAweDFGNTksIDB4MDAyRCwgMHgwNDhBLCAweDA0NTAsIDB4MUZGQSwgMHgxRjZBLAorCQkweDFGNUQsIDB4MDAxNCwgMHgwNDhGLCAweDA0OEYsIDB4MDAxNCwgMHgxRjVELCAweDAwMDAsCisJCTB4MUY2QSwgMHgxRkZBLCAweDA0NTAsIDB4MDQ4QSwgMHgwMDJELCAweDFGNTksIDB4MDAzQywKKwkJMHgxRjczLCAweDFGRTMsIDB4MDQzMSwgMHgwNEE2LCAweDAwNDgsIDB4MUY1MSwgMHgwMDNBLAorCQkweDFGN0QsIDB4MUZDRCwgMHgwNDEwLCAweDA0QzAsIDB4MDA2NSwgMHgxRjQ5LCAweDAwMzgsCisJCTB4MUY4NiwgMHgxRkI4LCAweDAzRUYsIDB4MDREOSwgMHgwMDgzLCAweDFGNDIsIDB4MDAzNSwKKwkJMHgxRjkwLCAweDFGQTQsIDB4MDNDRCwgMHgwNEVGLCAweDAwQTIsIDB4MUYzQywgMHgwMDMyLAorCQkweDFGOTksIDB4MUY5MiwgMHgwM0FBLCAweDA1MDQsIDB4MDBDMiwgMHgxRjM2LCAweDAwMkYsCisJCTB4MUZBMywgMHgxRjgyLCAweDAzODYsIDB4MDUxOCwgMHgwMEUyLCAweDFGMzAsIDB4MDAyQiwKKwkJMHgxRkFELCAweDFGNzMsIDB4MDM2MSwgMHgwNTI4LCAweDAxMDQsIDB4MUYyQywgMHgwMDI3LAorCQkweDFGQjYsIDB4MUY2NSwgMHgwMzNDLCAweDA1MzgsIDB4MDEyNywgMHgxRjI4LCAweDAwMjIsCisJCTB4MUZDMCwgMHgxRjU4LCAweDAzMTYsIDB4MDU0NSwgMHgwMTRCLCAweDFGMjUsIDB4MDAxRCwKKwkJMHgxRkM5LCAweDFGNEQsIDB4MDJGMCwgMHgwNTUxLCAweDAxNkYsIDB4MUYyMywgMHgwMDE3LAorCQkweDFGRDIsIDB4MUY0MywgMHgwMkM5LCAweDA1NUIsIDB4MDE5NCwgMHgxRjIyLCAweDAwMTEsCisJCTB4MUZEQiwgMHgxRjNCLCAweDAyQTIsIDB4MDU2MSwgMHgwMUJBLCAweDFGMjMsIDB4MDAwQSwKKwkJMHgxRkU0LCAweDFGMzQsIDB4MDI3QSwgMHgwNTY3LCAweDAxRTAsIDB4MUYyNCwgMHgwMDAzLAorCQkweDFGRUMsIDB4MUYyRSwgMHgwMjU0LCAweDA1NkEsIDB4MDIwNiwgMHgxRjI2LCAweDFGRkMsCisJCS8qIENocm9tYSAqLworCQkweDFGRjQsIDB4MUYyOSwgMHgwMjJELCAweDA1NkMsIDB4MDIyRCwgMHgxRjI5LCAweDFGRjQsCisJCTB4MUZGQywgMHgxRjI2LCAweDAyMDYsIDB4MDU2QSwgMHgwMjU0LCAweDFGMkUsIDB4MUZFQywKKwkJMHgwMDAzLCAweDFGMjQsIDB4MDFFMCwgMHgwNTY3LCAweDAyN0EsIDB4MUYzNCwgMHgxRkU0LAorCQkweDAwMEEsIDB4MUYyMywgMHgwMUJBLCAweDA1NjEsIDB4MDJBMiwgMHgxRjNCLCAweDFGREIsCisJCTB4MDAxMSwgMHgxRjIyLCAweDAxOTQsIDB4MDU1QiwgMHgwMkM5LCAweDFGNDMsIDB4MUZEMiwKKwkJMHgwMDE3LCAweDFGMjMsIDB4MDE2RiwgMHgwNTUxLCAweDAyRjAsIDB4MUY0RCwgMHgxRkM5LAorCQkweDAwMUQsIDB4MUYyNSwgMHgwMTRCLCAweDA1NDUsIDB4MDMxNiwgMHgxRjU4LCAweDFGQzAsCisJCTB4MDAyMiwgMHgxRjI4LCAweDAxMjcsIDB4MDUzOCwgMHgwMzNDLCAweDFGNjUsIDB4MUZCNiwKKwkJMHgwMDI3LCAweDFGMkMsIDB4MDEwNCwgMHgwNTI4LCAweDAzNjEsIDB4MUY3MywgMHgxRkFELAorCQkweDAwMkIsIDB4MUYzMCwgMHgwMEUyLCAweDA1MTgsIDB4MDM4NiwgMHgxRjgyLCAweDFGQTMsCisJCTB4MDAyRiwgMHgxRjM2LCAweDAwQzIsIDB4MDUwNCwgMHgwM0FBLCAweDFGOTIsIDB4MUY5OSwKKwkJMHgwMDMyLCAweDFGM0MsIDB4MDBBMiwgMHgwNEVGLCAweDAzQ0QsIDB4MUZBNCwgMHgxRjkwLAorCQkweDAwMzUsIDB4MUY0MiwgMHgwMDgzLCAweDA0RDksIDB4MDNFRiwgMHgxRkI4LCAweDFGODYsCisJCTB4MDAzOCwgMHgxRjQ5LCAweDAwNjUsIDB4MDRDMCwgMHgwNDEwLCAweDFGQ0QsIDB4MUY3RCwKKwkJMHgwMDNBLCAweDFGNTEsIDB4MDA0OCwgMHgwNEE2LCAweDA0MzEsIDB4MUZFMywgMHgxRjczLAorCQkweDAwM0MsIDB4MUY1OSwgMHgwMDJELCAweDA0OEEsIDB4MDQ1MCwgMHgxRkZBLCAweDFGNkEsCisJCTB4MUY1RCwgMHgwMDE0LCAweDA0OEYsIDB4MDQ4RiwgMHgwMDE0LCAweDFGNUQsIDB4MDAwMCwKKwkJMHgxRjZBLCAweDFGRkEsIDB4MDQ1MCwgMHgwNDhBLCAweDAwMkQsIDB4MUY1OSwgMHgwMDNDLAorCQkweDFGNzMsIDB4MUZFMywgMHgwNDMxLCAweDA0QTYsIDB4MDA0OCwgMHgxRjUxLCAweDAwM0EsCisJCTB4MUY3RCwgMHgxRkNELCAweDA0MTAsIDB4MDRDMCwgMHgwMDY1LCAweDFGNDksIDB4MDAzOCwKKwkJMHgxRjg2LCAweDFGQjgsIDB4MDNFRiwgMHgwNEQ5LCAweDAwODMsIDB4MUY0MiwgMHgwMDM1LAorCQkweDFGOTAsIDB4MUZBNCwgMHgwM0NELCAweDA0RUYsIDB4MDBBMiwgMHgxRjNDLCAweDAwMzIsCisJCTB4MUY5OSwgMHgxRjkyLCAweDAzQUEsIDB4MDUwNCwgMHgwMEMyLCAweDFGMzYsIDB4MDAyRiwKKwkJMHgxRkEzLCAweDFGODIsIDB4MDM4NiwgMHgwNTE4LCAweDAwRTIsIDB4MUYzMCwgMHgwMDJCLAorCQkweDFGQUQsIDB4MUY3MywgMHgwMzYxLCAweDA1MjgsIDB4MDEwNCwgMHgxRjJDLCAweDAwMjcsCisJCTB4MUZCNiwgMHgxRjY1LCAweDAzM0MsIDB4MDUzOCwgMHgwMTI3LCAweDFGMjgsIDB4MDAyMiwKKwkJMHgxRkMwLCAweDFGNTgsIDB4MDMxNiwgMHgwNTQ1LCAweDAxNEIsIDB4MUYyNSwgMHgwMDFELAorCQkweDFGQzksIDB4MUY0RCwgMHgwMkYwLCAweDA1NTEsIDB4MDE2RiwgMHgxRjIzLCAweDAwMTcsCisJCTB4MUZEMiwgMHgxRjQzLCAweDAyQzksIDB4MDU1QiwgMHgwMTk0LCAweDFGMjIsIDB4MDAxMSwKKwkJMHgxRkRCLCAweDFGM0IsIDB4MDJBMiwgMHgwNTYxLCAweDAxQkEsIDB4MUYyMywgMHgwMDBBLAorCQkweDFGRTQsIDB4MUYzNCwgMHgwMjdBLCAweDA1NjcsIDB4MDFFMCwgMHgxRjI0LCAweDAwMDMsCisJCTB4MUZFQywgMHgxRjJFLCAweDAyNTQsIDB4MDU2QSwgMHgwMjA2LCAweDFGMjYsIDB4MUZGQywKKwl9LAorCVtIU19MVF8xNF8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgwMDJGLCAweDFGMEIsIDB4MDFFNywgMHgwNUJFLCAweDAxRTcsIDB4MUYwQiwgMHgwMDJGLAorCQkweDAwMzUsIDB4MUYwRCwgMHgwMUJDLCAweDA1QkQsIDB4MDIxMywgMHgxRjBBLCAweDAwMjgsCisJCTB4MDAzQSwgMHgxRjExLCAweDAxOTEsIDB4MDVCQSwgMHgwMjNGLCAweDFGMEEsIDB4MDAyMSwKKwkJMHgwMDNGLCAweDFGMTUsIDB4MDE2NywgMHgwNUIzLCAweDAyNkMsIDB4MUYwQywgMHgwMDFBLAorCQkweDAwNDMsIDB4MUYxQiwgMHgwMTNFLCAweDA1QUEsIDB4MDI5OSwgMHgxRjBGLCAweDAwMTIsCisJCTB4MDA0NiwgMHgxRjIxLCAweDAxMTYsIDB4MDVBMSwgMHgwMkM2LCAweDFGMTMsIDB4MDAwOSwKKwkJMHgwMDQ5LCAweDFGMjgsIDB4MDBFRiwgMHgwNTkzLCAweDAyRjQsIDB4MUYxOSwgMHgwMDAwLAorCQkweDAwNEMsIDB4MUYzMCwgMHgwMEM5LCAweDA1ODQsIDB4MDMyMSwgMHgxRjIwLCAweDFGRjYsCisJCTB4MDA0RSwgMHgxRjM5LCAweDAwQTQsIDB4MDU3MiwgMHgwMzRELCAweDFGMkEsIDB4MUZFQywKKwkJMHgwMDRGLCAweDFGNDMsIDB4MDA4MCwgMHgwNTVFLCAweDAzN0EsIDB4MUYzNCwgMHgxRkUyLAorCQkweDAwNTAsIDB4MUY0RCwgMHgwMDVFLCAweDA1NDgsIDB4MDNBNSwgMHgxRjQxLCAweDFGRDcsCisJCTB4MDA1MCwgMHgxRjU3LCAweDAwM0QsIDB4MDUzMSwgMHgwM0QxLCAweDFGNEYsIDB4MUZDQiwKKwkJMHgwMDUwLCAweDFGNjIsIDB4MDAxRSwgMHgwNTE2LCAweDAzRkIsIDB4MUY1RiwgMHgxRkMwLAorCQkweDAwNEYsIDB4MUY2RCwgMHgwMDAwLCAweDA0RkEsIDB4MDQyNSwgMHgxRjcxLCAweDFGQjQsCisJCTB4MDA0RSwgMHgxRjc5LCAweDFGRTQsIDB4MDREQywgMHgwNDRELCAweDFGODQsIDB4MUZBOCwKKwkJMHgwMDRELCAweDFGODQsIDB4MUZDQSwgMHgwNEJDLCAweDA0NzQsIDB4MUY5OSwgMHgxRjlDLAorCQkweDFGOEMsIDB4MUZBRSwgMHgwNEM2LCAweDA0QzYsIDB4MUZBRSwgMHgxRjhDLCAweDAwMDAsCisJCTB4MUY5QywgMHgxRjk5LCAweDA0NzQsIDB4MDRCQywgMHgxRkNBLCAweDFGODQsIDB4MDA0RCwKKwkJMHgxRkE4LCAweDFGODQsIDB4MDQ0RCwgMHgwNERDLCAweDFGRTQsIDB4MUY3OSwgMHgwMDRFLAorCQkweDFGQjQsIDB4MUY3MSwgMHgwNDI1LCAweDA0RkEsIDB4MDAwMCwgMHgxRjZELCAweDAwNEYsCisJCTB4MUZDMCwgMHgxRjVGLCAweDAzRkIsIDB4MDUxNiwgMHgwMDFFLCAweDFGNjIsIDB4MDA1MCwKKwkJMHgxRkNCLCAweDFGNEYsIDB4MDNEMSwgMHgwNTMxLCAweDAwM0QsIDB4MUY1NywgMHgwMDUwLAorCQkweDFGRDcsIDB4MUY0MSwgMHgwM0E1LCAweDA1NDgsIDB4MDA1RSwgMHgxRjRELCAweDAwNTAsCisJCTB4MUZFMiwgMHgxRjM0LCAweDAzN0EsIDB4MDU1RSwgMHgwMDgwLCAweDFGNDMsIDB4MDA0RiwKKwkJMHgxRkVDLCAweDFGMkEsIDB4MDM0RCwgMHgwNTcyLCAweDAwQTQsIDB4MUYzOSwgMHgwMDRFLAorCQkweDFGRjYsIDB4MUYyMCwgMHgwMzIxLCAweDA1ODQsIDB4MDBDOSwgMHgxRjMwLCAweDAwNEMsCisJCTB4MDAwMCwgMHgxRjE5LCAweDAyRjQsIDB4MDU5MywgMHgwMEVGLCAweDFGMjgsIDB4MDA0OSwKKwkJMHgwMDA5LCAweDFGMTMsIDB4MDJDNiwgMHgwNUExLCAweDAxMTYsIDB4MUYyMSwgMHgwMDQ2LAorCQkweDAwMTIsIDB4MUYwRiwgMHgwMjk5LCAweDA1QUEsIDB4MDEzRSwgMHgxRjFCLCAweDAwNDMsCisJCTB4MDAxQSwgMHgxRjBDLCAweDAyNkMsIDB4MDVCMywgMHgwMTY3LCAweDFGMTUsIDB4MDAzRiwKKwkJMHgwMDIxLCAweDFGMEEsIDB4MDIzRiwgMHgwNUJBLCAweDAxOTEsIDB4MUYxMSwgMHgwMDNBLAorCQkweDAwMjgsIDB4MUYwQSwgMHgwMjEzLCAweDA1QkQsIDB4MDFCQywgMHgxRjBELCAweDAwMzUsCisJCS8qIENocm9tYSAqLworCQkweDAwMkYsIDB4MUYwQiwgMHgwMUU3LCAweDA1QkUsIDB4MDFFNywgMHgxRjBCLCAweDAwMkYsCisJCTB4MDAzNSwgMHgxRjBELCAweDAxQkMsIDB4MDVCRCwgMHgwMjEzLCAweDFGMEEsIDB4MDAyOCwKKwkJMHgwMDNBLCAweDFGMTEsIDB4MDE5MSwgMHgwNUJBLCAweDAyM0YsIDB4MUYwQSwgMHgwMDIxLAorCQkweDAwM0YsIDB4MUYxNSwgMHgwMTY3LCAweDA1QjMsIDB4MDI2QywgMHgxRjBDLCAweDAwMUEsCisJCTB4MDA0MywgMHgxRjFCLCAweDAxM0UsIDB4MDVBQSwgMHgwMjk5LCAweDFGMEYsIDB4MDAxMiwKKwkJMHgwMDQ2LCAweDFGMjEsIDB4MDExNiwgMHgwNUExLCAweDAyQzYsIDB4MUYxMywgMHgwMDA5LAorCQkweDAwNDksIDB4MUYyOCwgMHgwMEVGLCAweDA1OTMsIDB4MDJGNCwgMHgxRjE5LCAweDAwMDAsCisJCTB4MDA0QywgMHgxRjMwLCAweDAwQzksIDB4MDU4NCwgMHgwMzIxLCAweDFGMjAsIDB4MUZGNiwKKwkJMHgwMDRFLCAweDFGMzksIDB4MDBBNCwgMHgwNTcyLCAweDAzNEQsIDB4MUYyQSwgMHgxRkVDLAorCQkweDAwNEYsIDB4MUY0MywgMHgwMDgwLCAweDA1NUUsIDB4MDM3QSwgMHgxRjM0LCAweDFGRTIsCisJCTB4MDA1MCwgMHgxRjRELCAweDAwNUUsIDB4MDU0OCwgMHgwM0E1LCAweDFGNDEsIDB4MUZENywKKwkJMHgwMDUwLCAweDFGNTcsIDB4MDAzRCwgMHgwNTMxLCAweDAzRDEsIDB4MUY0RiwgMHgxRkNCLAorCQkweDAwNTAsIDB4MUY2MiwgMHgwMDFFLCAweDA1MTYsIDB4MDNGQiwgMHgxRjVGLCAweDFGQzAsCisJCTB4MDA0RiwgMHgxRjZELCAweDAwMDAsIDB4MDRGQSwgMHgwNDI1LCAweDFGNzEsIDB4MUZCNCwKKwkJMHgwMDRFLCAweDFGNzksIDB4MUZFNCwgMHgwNERDLCAweDA0NEQsIDB4MUY4NCwgMHgxRkE4LAorCQkweDAwNEQsIDB4MUY4NCwgMHgxRkNBLCAweDA0QkMsIDB4MDQ3NCwgMHgxRjk5LCAweDFGOUMsCisJCTB4MUY4QywgMHgxRkFFLCAweDA0QzYsIDB4MDRDNiwgMHgxRkFFLCAweDFGOEMsIDB4MDAwMCwKKwkJMHgxRjlDLCAweDFGOTksIDB4MDQ3NCwgMHgwNEJDLCAweDFGQ0EsIDB4MUY4NCwgMHgwMDRELAorCQkweDFGQTgsIDB4MUY4NCwgMHgwNDRELCAweDA0REMsIDB4MUZFNCwgMHgxRjc5LCAweDAwNEUsCisJCTB4MUZCNCwgMHgxRjcxLCAweDA0MjUsIDB4MDRGQSwgMHgwMDAwLCAweDFGNkQsIDB4MDA0RiwKKwkJMHgxRkMwLCAweDFGNUYsIDB4MDNGQiwgMHgwNTE2LCAweDAwMUUsIDB4MUY2MiwgMHgwMDUwLAorCQkweDFGQ0IsIDB4MUY0RiwgMHgwM0QxLCAweDA1MzEsIDB4MDAzRCwgMHgxRjU3LCAweDAwNTAsCisJCTB4MUZENywgMHgxRjQxLCAweDAzQTUsIDB4MDU0OCwgMHgwMDVFLCAweDFGNEQsIDB4MDA1MCwKKwkJMHgxRkUyLCAweDFGMzQsIDB4MDM3QSwgMHgwNTVFLCAweDAwODAsIDB4MUY0MywgMHgwMDRGLAorCQkweDFGRUMsIDB4MUYyQSwgMHgwMzRELCAweDA1NzIsIDB4MDBBNCwgMHgxRjM5LCAweDAwNEUsCisJCTB4MUZGNiwgMHgxRjIwLCAweDAzMjEsIDB4MDU4NCwgMHgwMEM5LCAweDFGMzAsIDB4MDA0QywKKwkJMHgwMDAwLCAweDFGMTksIDB4MDJGNCwgMHgwNTkzLCAweDAwRUYsIDB4MUYyOCwgMHgwMDQ5LAorCQkweDAwMDksIDB4MUYxMywgMHgwMkM2LCAweDA1QTEsIDB4MDExNiwgMHgxRjIxLCAweDAwNDYsCisJCTB4MDAxMiwgMHgxRjBGLCAweDAyOTksIDB4MDVBQSwgMHgwMTNFLCAweDFGMUIsIDB4MDA0MywKKwkJMHgwMDFBLCAweDFGMEMsIDB4MDI2QywgMHgwNUIzLCAweDAxNjcsIDB4MUYxNSwgMHgwMDNGLAorCQkweDAwMjEsIDB4MUYwQSwgMHgwMjNGLCAweDA1QkEsIDB4MDE5MSwgMHgxRjExLCAweDAwM0EsCisJCTB4MDAyOCwgMHgxRjBBLCAweDAyMTMsIDB4MDVCRCwgMHgwMUJDLCAweDFGMEQsIDB4MDAzNSwKKwl9LAorCVtIU19MVF8xNV8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgwMDVCLCAweDFGMEEsIDB4MDE5NSwgMHgwNjBDLCAweDAxOTUsIDB4MUYwQSwgMHgwMDVCLAorCQkweDAwNUQsIDB4MUYxMywgMHgwMTY2LCAweDA2MDksIDB4MDFDNiwgMHgxRjAzLCAweDAwNTgsCisJCTB4MDA1RiwgMHgxRjFDLCAweDAxMzgsIDB4MDYwNSwgMHgwMUY3LCAweDFFRkQsIDB4MDA1NCwKKwkJMHgwMDYwLCAweDFGMjYsIDB4MDEwQiwgMHgwNUZGLCAweDAyMjksIDB4MUVGOCwgMHgwMDRGLAorCQkweDAwNjAsIDB4MUYzMSwgMHgwMERGLCAweDA1RjUsIDB4MDI1QywgMHgxRUY1LCAweDAwNEEsCisJCTB4MDA2MCwgMHgxRjNELCAweDAwQjUsIDB4MDVFOCwgMHgwMjhGLCAweDFFRjMsIDB4MDA0NCwKKwkJMHgwMDVGLCAweDFGNDksIDB4MDA4QywgMHgwNURBLCAweDAyQzMsIDB4MUVGMiwgMHgwMDNELAorCQkweDAwNUUsIDB4MUY1NiwgMHgwMDY1LCAweDA1QzcsIDB4MDJGNiwgMHgxRUY0LCAweDAwMzYsCisJCTB4MDA1QywgMHgxRjYzLCAweDAwM0YsIDB4MDVCMywgMHgwMzJCLCAweDFFRjcsIDB4MDAyRCwKKwkJMHgwMDU5LCAweDFGNzEsIDB4MDAxQiwgMHgwNTlELCAweDAzNUYsIDB4MUVGQiwgMHgwMDI0LAorCQkweDAwNTcsIDB4MUY3RiwgMHgxRkY5LCAweDA1ODMsIDB4MDM5MiwgMHgxRjAyLCAweDAwMUEsCisJCTB4MDA1MywgMHgxRjhELCAweDFGRDksIDB4MDU2NywgMHgwM0M1LCAweDFGMEIsIDB4MDAxMCwKKwkJMHgwMDUwLCAweDFGOUIsIDB4MUZCQiwgMHgwNTQ4LCAweDAzRjgsIDB4MUYxNSwgMHgwMDA1LAorCQkweDAwNEMsIDB4MUZBOSwgMHgxRjlFLCAweDA1MjgsIDB4MDQyQSwgMHgxRjIyLCAweDFGRjksCisJCTB4MDA0OCwgMHgxRkI3LCAweDFGODQsIDB4MDUwNSwgMHgwNDVBLCAweDFGMzEsIDB4MUZFRCwKKwkJMHgwMDQzLCAweDFGQzUsIDB4MUY2QywgMHgwNEUwLCAweDA0OEEsIDB4MUY0MiwgMHgxRkUwLAorCQkweDFGRDEsIDB4MUY1MCwgMHgwNERGLCAweDA0REYsIDB4MUY1MCwgMHgxRkQxLCAweDAwMDAsCisJCTB4MUZFMCwgMHgxRjQyLCAweDA0OEEsIDB4MDRFMCwgMHgxRjZDLCAweDFGQzUsIDB4MDA0MywKKwkJMHgxRkVELCAweDFGMzEsIDB4MDQ1QSwgMHgwNTA1LCAweDFGODQsIDB4MUZCNywgMHgwMDQ4LAorCQkweDFGRjksIDB4MUYyMiwgMHgwNDJBLCAweDA1MjgsIDB4MUY5RSwgMHgxRkE5LCAweDAwNEMsCisJCTB4MDAwNSwgMHgxRjE1LCAweDAzRjgsIDB4MDU0OCwgMHgxRkJCLCAweDFGOUIsIDB4MDA1MCwKKwkJMHgwMDEwLCAweDFGMEIsIDB4MDNDNSwgMHgwNTY3LCAweDFGRDksIDB4MUY4RCwgMHgwMDUzLAorCQkweDAwMUEsIDB4MUYwMiwgMHgwMzkyLCAweDA1ODMsIDB4MUZGOSwgMHgxRjdGLCAweDAwNTcsCisJCTB4MDAyNCwgMHgxRUZCLCAweDAzNUYsIDB4MDU5RCwgMHgwMDFCLCAweDFGNzEsIDB4MDA1OSwKKwkJMHgwMDJELCAweDFFRjcsIDB4MDMyQiwgMHgwNUIzLCAweDAwM0YsIDB4MUY2MywgMHgwMDVDLAorCQkweDAwMzYsIDB4MUVGNCwgMHgwMkY2LCAweDA1QzcsIDB4MDA2NSwgMHgxRjU2LCAweDAwNUUsCisJCTB4MDAzRCwgMHgxRUYyLCAweDAyQzMsIDB4MDVEQSwgMHgwMDhDLCAweDFGNDksIDB4MDA1RiwKKwkJMHgwMDQ0LCAweDFFRjMsIDB4MDI4RiwgMHgwNUU4LCAweDAwQjUsIDB4MUYzRCwgMHgwMDYwLAorCQkweDAwNEEsIDB4MUVGNSwgMHgwMjVDLCAweDA1RjUsIDB4MDBERiwgMHgxRjMxLCAweDAwNjAsCisJCTB4MDA0RiwgMHgxRUY4LCAweDAyMjksIDB4MDVGRiwgMHgwMTBCLCAweDFGMjYsIDB4MDA2MCwKKwkJMHgwMDU0LCAweDFFRkQsIDB4MDFGNywgMHgwNjA1LCAweDAxMzgsIDB4MUYxQywgMHgwMDVGLAorCQkweDAwNTgsIDB4MUYwMywgMHgwMUM2LCAweDA2MDksIDB4MDE2NiwgMHgxRjEzLCAweDAwNUQsCisJCS8qIENocm9tYSAqLworCQkweDAwNUIsIDB4MUYwQSwgMHgwMTk1LCAweDA2MEMsIDB4MDE5NSwgMHgxRjBBLCAweDAwNUIsCisJCTB4MDA1RCwgMHgxRjEzLCAweDAxNjYsIDB4MDYwOSwgMHgwMUM2LCAweDFGMDMsIDB4MDA1OCwKKwkJMHgwMDVGLCAweDFGMUMsIDB4MDEzOCwgMHgwNjA1LCAweDAxRjcsIDB4MUVGRCwgMHgwMDU0LAorCQkweDAwNjAsIDB4MUYyNiwgMHgwMTBCLCAweDA1RkYsIDB4MDIyOSwgMHgxRUY4LCAweDAwNEYsCisJCTB4MDA2MCwgMHgxRjMxLCAweDAwREYsIDB4MDVGNSwgMHgwMjVDLCAweDFFRjUsIDB4MDA0QSwKKwkJMHgwMDYwLCAweDFGM0QsIDB4MDBCNSwgMHgwNUU4LCAweDAyOEYsIDB4MUVGMywgMHgwMDQ0LAorCQkweDAwNUYsIDB4MUY0OSwgMHgwMDhDLCAweDA1REEsIDB4MDJDMywgMHgxRUYyLCAweDAwM0QsCisJCTB4MDA1RSwgMHgxRjU2LCAweDAwNjUsIDB4MDVDNywgMHgwMkY2LCAweDFFRjQsIDB4MDAzNiwKKwkJMHgwMDVDLCAweDFGNjMsIDB4MDAzRiwgMHgwNUIzLCAweDAzMkIsIDB4MUVGNywgMHgwMDJELAorCQkweDAwNTksIDB4MUY3MSwgMHgwMDFCLCAweDA1OUQsIDB4MDM1RiwgMHgxRUZCLCAweDAwMjQsCisJCTB4MDA1NywgMHgxRjdGLCAweDFGRjksIDB4MDU4MywgMHgwMzkyLCAweDFGMDIsIDB4MDAxQSwKKwkJMHgwMDUzLCAweDFGOEQsIDB4MUZEOSwgMHgwNTY3LCAweDAzQzUsIDB4MUYwQiwgMHgwMDEwLAorCQkweDAwNTAsIDB4MUY5QiwgMHgxRkJCLCAweDA1NDgsIDB4MDNGOCwgMHgxRjE1LCAweDAwMDUsCisJCTB4MDA0QywgMHgxRkE5LCAweDFGOUUsIDB4MDUyOCwgMHgwNDJBLCAweDFGMjIsIDB4MUZGOSwKKwkJMHgwMDQ4LCAweDFGQjcsIDB4MUY4NCwgMHgwNTA1LCAweDA0NUEsIDB4MUYzMSwgMHgxRkVELAorCQkweDAwNDMsIDB4MUZDNSwgMHgxRjZDLCAweDA0RTAsIDB4MDQ4QSwgMHgxRjQyLCAweDFGRTAsCisJCTB4MUZEMSwgMHgxRjUwLCAweDA0REYsIDB4MDRERiwgMHgxRjUwLCAweDFGRDEsIDB4MDAwMCwKKwkJMHgxRkUwLCAweDFGNDIsIDB4MDQ4QSwgMHgwNEUwLCAweDFGNkMsIDB4MUZDNSwgMHgwMDQzLAorCQkweDFGRUQsIDB4MUYzMSwgMHgwNDVBLCAweDA1MDUsIDB4MUY4NCwgMHgxRkI3LCAweDAwNDgsCisJCTB4MUZGOSwgMHgxRjIyLCAweDA0MkEsIDB4MDUyOCwgMHgxRjlFLCAweDFGQTksIDB4MDA0QywKKwkJMHgwMDA1LCAweDFGMTUsIDB4MDNGOCwgMHgwNTQ4LCAweDFGQkIsIDB4MUY5QiwgMHgwMDUwLAorCQkweDAwMTAsIDB4MUYwQiwgMHgwM0M1LCAweDA1NjcsIDB4MUZEOSwgMHgxRjhELCAweDAwNTMsCisJCTB4MDAxQSwgMHgxRjAyLCAweDAzOTIsIDB4MDU4MywgMHgxRkY5LCAweDFGN0YsIDB4MDA1NywKKwkJMHgwMDI0LCAweDFFRkIsIDB4MDM1RiwgMHgwNTlELCAweDAwMUIsIDB4MUY3MSwgMHgwMDU5LAorCQkweDAwMkQsIDB4MUVGNywgMHgwMzJCLCAweDA1QjMsIDB4MDAzRiwgMHgxRjYzLCAweDAwNUMsCisJCTB4MDAzNiwgMHgxRUY0LCAweDAyRjYsIDB4MDVDNywgMHgwMDY1LCAweDFGNTYsIDB4MDA1RSwKKwkJMHgwMDNELCAweDFFRjIsIDB4MDJDMywgMHgwNURBLCAweDAwOEMsIDB4MUY0OSwgMHgwMDVGLAorCQkweDAwNDQsIDB4MUVGMywgMHgwMjhGLCAweDA1RTgsIDB4MDBCNSwgMHgxRjNELCAweDAwNjAsCisJCTB4MDA0QSwgMHgxRUY1LCAweDAyNUMsIDB4MDVGNSwgMHgwMERGLCAweDFGMzEsIDB4MDA2MCwKKwkJMHgwMDRGLCAweDFFRjgsIDB4MDIyOSwgMHgwNUZGLCAweDAxMEIsIDB4MUYyNiwgMHgwMDYwLAorCQkweDAwNTQsIDB4MUVGRCwgMHgwMUY3LCAweDA2MDUsIDB4MDEzOCwgMHgxRjFDLCAweDAwNUYsCisJCTB4MDA1OCwgMHgxRjAzLCAweDAxQzYsIDB4MDYwOSwgMHgwMTY2LCAweDFGMTMsIDB4MDA1RCwKKwl9LAorCVtIU19MRV8xNl8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgwMDZFLCAweDFGMjQsIDB4MDEzRSwgMHgwNjYwLCAweDAxM0UsIDB4MUYyNCwgMHgwMDZFLAorCQkweDAwNkMsIDB4MUYzMywgMHgwMTBCLCAweDA2NUQsIDB4MDE3MiwgMHgxRjE3LCAweDAwNzAsCisJCTB4MDA2OSwgMHgxRjQxLCAweDAwREEsIDB4MDY1OSwgMHgwMUE4LCAweDFGMEIsIDB4MDA3MCwKKwkJMHgwMDY2LCAweDFGNTEsIDB4MDBBQSwgMHgwNjUwLCAweDAxREYsIDB4MUYwMCwgMHgwMDcwLAorCQkweDAwNjIsIDB4MUY2MSwgMHgwMDdELCAweDA2NDQsIDB4MDIxNywgMHgxRUY2LCAweDAwNkYsCisJCTB4MDA1RSwgMHgxRjcxLCAweDAwNTEsIDB4MDYzNiwgMHgwMjUwLCAweDFFRUQsIDB4MDA2RCwKKwkJMHgwMDU5LCAweDFGODEsIDB4MDAyOCwgMHgwNjI0LCAweDAyOEEsIDB4MUVFNSwgMHgwMDZCLAorCQkweDAwNTQsIDB4MUY5MSwgMHgwMDAwLCAweDA2MEYsIDB4MDJDNSwgMHgxRUUwLCAweDAwNjcsCisJCTB4MDA0RSwgMHgxRkEyLCAweDFGREIsIDB4MDVGNiwgMHgwMzAwLCAweDFFREMsIDB4MDA2MywKKwkJMHgwMDQ5LCAweDFGQjIsIDB4MUZCOCwgMHgwNURCLCAweDAzM0IsIDB4MUVEQSwgMHgwMDVELAorCQkweDAwNDMsIDB4MUZDMywgMHgxRjk4LCAweDA1QkMsIDB4MDM3NiwgMHgxRUQ5LCAweDAwNTcsCisJCTB4MDAzRCwgMHgxRkQzLCAweDFGN0EsIDB4MDU5QiwgMHgwM0IxLCAweDFFREIsIDB4MDA0RiwKKwkJMHgwMDM2LCAweDFGRTIsIDB4MUY1RSwgMHgwNTc4LCAweDAzRUMsIDB4MUVERiwgMHgwMDQ3LAorCQkweDAwMzAsIDB4MUZGMSwgMHgxRjQ1LCAweDA1NTEsIDB4MDQyNiwgMHgxRUU2LCAweDAwM0QsCisJCTB4MDAyQSwgMHgwMDAwLCAweDFGMkUsIDB4MDUyOCwgMHgwNDVGLCAweDFFRUUsIDB4MDAzMywKKwkJMHgwMDIzLCAweDAwMEUsIDB4MUYxOSwgMHgwNEZELCAweDA0OTgsIDB4MUVGQSwgMHgwMDI3LAorCQkweDAwMUIsIDB4MUYwNCwgMHgwNEUxLCAweDA0RTEsIDB4MUYwNCwgMHgwMDFCLCAweDAwMDAsCisJCTB4MDAyNywgMHgxRUZBLCAweDA0OTgsIDB4MDRGRCwgMHgxRjE5LCAweDAwMEUsIDB4MDAyMywKKwkJMHgwMDMzLCAweDFFRUUsIDB4MDQ1RiwgMHgwNTI4LCAweDFGMkUsIDB4MDAwMCwgMHgwMDJBLAorCQkweDAwM0QsIDB4MUVFNiwgMHgwNDI2LCAweDA1NTEsIDB4MUY0NSwgMHgxRkYxLCAweDAwMzAsCisJCTB4MDA0NywgMHgxRURGLCAweDAzRUMsIDB4MDU3OCwgMHgxRjVFLCAweDFGRTIsIDB4MDAzNiwKKwkJMHgwMDRGLCAweDFFREIsIDB4MDNCMSwgMHgwNTlCLCAweDFGN0EsIDB4MUZEMywgMHgwMDNELAorCQkweDAwNTcsIDB4MUVEOSwgMHgwMzc2LCAweDA1QkMsIDB4MUY5OCwgMHgxRkMzLCAweDAwNDMsCisJCTB4MDA1RCwgMHgxRURBLCAweDAzM0IsIDB4MDVEQiwgMHgxRkI4LCAweDFGQjIsIDB4MDA0OSwKKwkJMHgwMDYzLCAweDFFREMsIDB4MDMwMCwgMHgwNUY2LCAweDFGREIsIDB4MUZBMiwgMHgwMDRFLAorCQkweDAwNjcsIDB4MUVFMCwgMHgwMkM1LCAweDA2MEYsIDB4MDAwMCwgMHgxRjkxLCAweDAwNTQsCisJCTB4MDA2QiwgMHgxRUU1LCAweDAyOEEsIDB4MDYyNCwgMHgwMDI4LCAweDFGODEsIDB4MDA1OSwKKwkJMHgwMDZELCAweDFFRUQsIDB4MDI1MCwgMHgwNjM2LCAweDAwNTEsIDB4MUY3MSwgMHgwMDVFLAorCQkweDAwNkYsIDB4MUVGNiwgMHgwMjE3LCAweDA2NDQsIDB4MDA3RCwgMHgxRjYxLCAweDAwNjIsCisJCTB4MDA3MCwgMHgxRjAwLCAweDAxREYsIDB4MDY1MCwgMHgwMEFBLCAweDFGNTEsIDB4MDA2NiwKKwkJMHgwMDcwLCAweDFGMEIsIDB4MDFBOCwgMHgwNjU5LCAweDAwREEsIDB4MUY0MSwgMHgwMDY5LAorCQkweDAwNzAsIDB4MUYxNywgMHgwMTcyLCAweDA2NUQsIDB4MDEwQiwgMHgxRjMzLCAweDAwNkMsCisJCS8qIENocm9tYSAqLworCQkweDAwNkUsIDB4MUYyNCwgMHgwMTNFLCAweDA2NjAsIDB4MDEzRSwgMHgxRjI0LCAweDAwNkUsCisJCTB4MDA2QywgMHgxRjMzLCAweDAxMEIsIDB4MDY1RCwgMHgwMTcyLCAweDFGMTcsIDB4MDA3MCwKKwkJMHgwMDY5LCAweDFGNDEsIDB4MDBEQSwgMHgwNjU5LCAweDAxQTgsIDB4MUYwQiwgMHgwMDcwLAorCQkweDAwNjYsIDB4MUY1MSwgMHgwMEFBLCAweDA2NTAsIDB4MDFERiwgMHgxRjAwLCAweDAwNzAsCisJCTB4MDA2MiwgMHgxRjYxLCAweDAwN0QsIDB4MDY0NCwgMHgwMjE3LCAweDFFRjYsIDB4MDA2RiwKKwkJMHgwMDVFLCAweDFGNzEsIDB4MDA1MSwgMHgwNjM2LCAweDAyNTAsIDB4MUVFRCwgMHgwMDZELAorCQkweDAwNTksIDB4MUY4MSwgMHgwMDI4LCAweDA2MjQsIDB4MDI4QSwgMHgxRUU1LCAweDAwNkIsCisJCTB4MDA1NCwgMHgxRjkxLCAweDAwMDAsIDB4MDYwRiwgMHgwMkM1LCAweDFFRTAsIDB4MDA2NywKKwkJMHgwMDRFLCAweDFGQTIsIDB4MUZEQiwgMHgwNUY2LCAweDAzMDAsIDB4MUVEQywgMHgwMDYzLAorCQkweDAwNDksIDB4MUZCMiwgMHgxRkI4LCAweDA1REIsIDB4MDMzQiwgMHgxRURBLCAweDAwNUQsCisJCTB4MDA0MywgMHgxRkMzLCAweDFGOTgsIDB4MDVCQywgMHgwMzc2LCAweDFFRDksIDB4MDA1NywKKwkJMHgwMDNELCAweDFGRDMsIDB4MUY3QSwgMHgwNTlCLCAweDAzQjEsIDB4MUVEQiwgMHgwMDRGLAorCQkweDAwMzYsIDB4MUZFMiwgMHgxRjVFLCAweDA1NzgsIDB4MDNFQywgMHgxRURGLCAweDAwNDcsCisJCTB4MDAzMCwgMHgxRkYxLCAweDFGNDUsIDB4MDU1MSwgMHgwNDI2LCAweDFFRTYsIDB4MDAzRCwKKwkJMHgwMDJBLCAweDAwMDAsIDB4MUYyRSwgMHgwNTI4LCAweDA0NUYsIDB4MUVFRSwgMHgwMDMzLAorCQkweDAwMjMsIDB4MDAwRSwgMHgxRjE5LCAweDA0RkQsIDB4MDQ5OCwgMHgxRUZBLCAweDAwMjcsCisJCTB4MDAxQiwgMHgxRjA0LCAweDA0RTEsIDB4MDRFMSwgMHgxRjA0LCAweDAwMUIsIDB4MDAwMCwKKwkJMHgwMDI3LCAweDFFRkEsIDB4MDQ5OCwgMHgwNEZELCAweDFGMTksIDB4MDAwRSwgMHgwMDIzLAorCQkweDAwMzMsIDB4MUVFRSwgMHgwNDVGLCAweDA1MjgsIDB4MUYyRSwgMHgwMDAwLCAweDAwMkEsCisJCTB4MDAzRCwgMHgxRUU2LCAweDA0MjYsIDB4MDU1MSwgMHgxRjQ1LCAweDFGRjEsIDB4MDAzMCwKKwkJMHgwMDQ3LCAweDFFREYsIDB4MDNFQywgMHgwNTc4LCAweDFGNUUsIDB4MUZFMiwgMHgwMDM2LAorCQkweDAwNEYsIDB4MUVEQiwgMHgwM0IxLCAweDA1OUIsIDB4MUY3QSwgMHgxRkQzLCAweDAwM0QsCisJCTB4MDA1NywgMHgxRUQ5LCAweDAzNzYsIDB4MDVCQywgMHgxRjk4LCAweDFGQzMsIDB4MDA0MywKKwkJMHgwMDVELCAweDFFREEsIDB4MDMzQiwgMHgwNURCLCAweDFGQjgsIDB4MUZCMiwgMHgwMDQ5LAorCQkweDAwNjMsIDB4MUVEQywgMHgwMzAwLCAweDA1RjYsIDB4MUZEQiwgMHgxRkEyLCAweDAwNEUsCisJCTB4MDA2NywgMHgxRUUwLCAweDAyQzUsIDB4MDYwRiwgMHgwMDAwLCAweDFGOTEsIDB4MDA1NCwKKwkJMHgwMDZCLCAweDFFRTUsIDB4MDI4QSwgMHgwNjI0LCAweDAwMjgsIDB4MUY4MSwgMHgwMDU5LAorCQkweDAwNkQsIDB4MUVFRCwgMHgwMjUwLCAweDA2MzYsIDB4MDA1MSwgMHgxRjcxLCAweDAwNUUsCisJCTB4MDA2RiwgMHgxRUY2LCAweDAyMTcsIDB4MDY0NCwgMHgwMDdELCAweDFGNjEsIDB4MDA2MiwKKwkJMHgwMDcwLCAweDFGMDAsIDB4MDFERiwgMHgwNjUwLCAweDAwQUEsIDB4MUY1MSwgMHgwMDY2LAorCQkweDAwNzAsIDB4MUYwQiwgMHgwMUE4LCAweDA2NTksIDB4MDBEQSwgMHgxRjQxLCAweDAwNjksCisJCTB4MDA3MCwgMHgxRjE3LCAweDAxNzIsIDB4MDY1RCwgMHgwMTBCLCAweDFGMzMsIDB4MDA2QywKKwl9LAorfTsKKworLyogdmVydGljYWwgc2NhbGVyIGNvZWZmaWNpZW50cyAqLworZW51bSB7CisJVlNfVVBfU0NBTEUgPSAwLAorCVZTX0xUXzlfMTZfU0NBTEUsCisJVlNfTFRfMTBfMTZfU0NBTEUsCisJVlNfTFRfMTFfMTZfU0NBTEUsCisJVlNfTFRfMTJfMTZfU0NBTEUsCisJVlNfTFRfMTNfMTZfU0NBTEUsCisJVlNfTFRfMTRfMTZfU0NBTEUsCisJVlNfTFRfMTVfMTZfU0NBTEUsCisJVlNfTFRfMTZfMTZfU0NBTEUsCisJVlNfMV9UT18xX1NDQUxFLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBzY2FsZXJfdnNfY29lZmZzWzE1XVtTQ19OVU1fUEhBU0VTICogMiAqIFNDX1ZfTlVNX1RBUFNdID0geworCVtWU19VUF9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkQxLCAweDAwQjEsIDB4MDZGQywgMHgwMEIxLCAweDFGRDEsCisJCTB4MUZEOCwgMHgwMDg1LCAweDA2RjksIDB4MDBFMSwgMHgxRkM5LAorCQkweDFGREYsIDB4MDA1QiwgMHgwNkYyLCAweDAxMTQsIDB4MUZDMCwKKwkJMHgxRkU1LCAweDAwMzUsIDB4MDZFNSwgMHgwMTRBLCAweDFGQjcsCisJCTB4MUZFQiwgMHgwMDEyLCAweDA2RDMsIDB4MDE4MiwgMHgxRkFFLAorCQkweDFGRjEsIDB4MUZGMywgMHgwNkJBLCAweDAxQkQsIDB4MUZBNSwKKwkJMHgxRkY1LCAweDFGRDcsIDB4MDY5RCwgMHgwMUZCLCAweDFGOUMsCisJCTB4MUZGOSwgMHgxRkJFLCAweDA2N0MsIDB4MDIzQSwgMHgxRjkzLAorCQkweDFGRkQsIDB4MUZBOCwgMHgwNjU2LCAweDAyN0IsIDB4MUY4QSwKKwkJMHgwMDAwLCAweDFGOTUsIDB4MDYyQiwgMHgwMkJGLCAweDFGODEsCisJCTB4MDAwMiwgMHgxRjg2LCAweDA1RkMsIDB4MDMwMywgMHgxRjc5LAorCQkweDAwMDQsIDB4MUY3OSwgMHgwNUNBLCAweDAzNDcsIDB4MUY3MiwKKwkJMHgwMDA1LCAweDFGNkYsIDB4MDU5NCwgMHgwMzhELCAweDFGNkIsCisJCTB4MDAwNiwgMHgxRjY3LCAweDA1NUIsIDB4MDNEMiwgMHgxRjY2LAorCQkweDAwMDcsIDB4MUY2MiwgMHgwNTFFLCAweDA0MTcsIDB4MUY2MiwKKwkJMHgwMDA3LCAweDFGNUYsIDB4MDRERiwgMHgwNDVDLCAweDFGNUYsCisJCTB4MUY1RSwgMHgwNEEyLCAweDA0QTIsIDB4MUY1RSwgMHgwMDAwLAorCQkweDFGNUYsIDB4MDQ1QywgMHgwNERGLCAweDFGNUYsIDB4MDAwNywKKwkJMHgxRjYyLCAweDA0MTcsIDB4MDUxRSwgMHgxRjYyLCAweDAwMDcsCisJCTB4MUY2NiwgMHgwM0QyLCAweDA1NUIsIDB4MUY2NywgMHgwMDA2LAorCQkweDFGNkIsIDB4MDM4RCwgMHgwNTk0LCAweDFGNkYsIDB4MDAwNSwKKwkJMHgxRjcyLCAweDAzNDcsIDB4MDVDQSwgMHgxRjc5LCAweDAwMDQsCisJCTB4MUY3OSwgMHgwMzAzLCAweDA1RkMsIDB4MUY4NiwgMHgwMDAyLAorCQkweDFGODEsIDB4MDJCRiwgMHgwNjJCLCAweDFGOTUsIDB4MDAwMCwKKwkJMHgxRjhBLCAweDAyN0IsIDB4MDY1NiwgMHgxRkE4LCAweDFGRkQsCisJCTB4MUY5MywgMHgwMjNBLCAweDA2N0MsIDB4MUZCRSwgMHgxRkY5LAorCQkweDFGOUMsIDB4MDFGQiwgMHgwNjlELCAweDFGRDcsIDB4MUZGNSwKKwkJMHgxRkE1LCAweDAxQkQsIDB4MDZCQSwgMHgxRkYzLCAweDFGRjEsCisJCTB4MUZBRSwgMHgwMTgyLCAweDA2RDMsIDB4MDAxMiwgMHgxRkVCLAorCQkweDFGQjcsIDB4MDE0QSwgMHgwNkU1LCAweDAwMzUsIDB4MUZFNSwKKwkJMHgxRkMwLCAweDAxMTQsIDB4MDZGMiwgMHgwMDVCLCAweDFGREYsCisJCTB4MUZDOSwgMHgwMEUxLCAweDA2RjksIDB4MDA4NSwgMHgxRkQ4LAorCQkvKiBDaHJvbWEgKi8KKwkJMHgxRkQxLCAweDAwQjEsIDB4MDZGQywgMHgwMEIxLCAweDFGRDEsCisJCTB4MUZEOCwgMHgwMDg1LCAweDA2RjksIDB4MDBFMSwgMHgxRkM5LAorCQkweDFGREYsIDB4MDA1QiwgMHgwNkYyLCAweDAxMTQsIDB4MUZDMCwKKwkJMHgxRkU1LCAweDAwMzUsIDB4MDZFNSwgMHgwMTRBLCAweDFGQjcsCisJCTB4MUZFQiwgMHgwMDEyLCAweDA2RDMsIDB4MDE4MiwgMHgxRkFFLAorCQkweDFGRjEsIDB4MUZGMywgMHgwNkJBLCAweDAxQkQsIDB4MUZBNSwKKwkJMHgxRkY1LCAweDFGRDcsIDB4MDY5RCwgMHgwMUZCLCAweDFGOUMsCisJCTB4MUZGOSwgMHgxRkJFLCAweDA2N0MsIDB4MDIzQSwgMHgxRjkzLAorCQkweDFGRkQsIDB4MUZBOCwgMHgwNjU2LCAweDAyN0IsIDB4MUY4QSwKKwkJMHgwMDAwLCAweDFGOTUsIDB4MDYyQiwgMHgwMkJGLCAweDFGODEsCisJCTB4MDAwMiwgMHgxRjg2LCAweDA1RkMsIDB4MDMwMywgMHgxRjc5LAorCQkweDAwMDQsIDB4MUY3OSwgMHgwNUNBLCAweDAzNDcsIDB4MUY3MiwKKwkJMHgwMDA1LCAweDFGNkYsIDB4MDU5NCwgMHgwMzhELCAweDFGNkIsCisJCTB4MDAwNiwgMHgxRjY3LCAweDA1NUIsIDB4MDNEMiwgMHgxRjY2LAorCQkweDAwMDcsIDB4MUY2MiwgMHgwNTFFLCAweDA0MTcsIDB4MUY2MiwKKwkJMHgwMDA3LCAweDFGNUYsIDB4MDRERiwgMHgwNDVDLCAweDFGNUYsCisJCTB4MUY1RSwgMHgwNEEyLCAweDA0QTIsIDB4MUY1RSwgMHgwMDAwLAorCQkweDFGNUYsIDB4MDQ1QywgMHgwNERGLCAweDFGNUYsIDB4MDAwNywKKwkJMHgxRjYyLCAweDA0MTcsIDB4MDUxRSwgMHgxRjYyLCAweDAwMDcsCisJCTB4MUY2NiwgMHgwM0QyLCAweDA1NUIsIDB4MUY2NywgMHgwMDA2LAorCQkweDFGNkIsIDB4MDM4RCwgMHgwNTk0LCAweDFGNkYsIDB4MDAwNSwKKwkJMHgxRjcyLCAweDAzNDcsIDB4MDVDQSwgMHgxRjc5LCAweDAwMDQsCisJCTB4MUY3OSwgMHgwMzAzLCAweDA1RkMsIDB4MUY4NiwgMHgwMDAyLAorCQkweDFGODEsIDB4MDJCRiwgMHgwNjJCLCAweDFGOTUsIDB4MDAwMCwKKwkJMHgxRjhBLCAweDAyN0IsIDB4MDY1NiwgMHgxRkE4LCAweDFGRkQsCisJCTB4MUY5MywgMHgwMjNBLCAweDA2N0MsIDB4MUZCRSwgMHgxRkY5LAorCQkweDFGOUMsIDB4MDFGQiwgMHgwNjlELCAweDFGRDcsIDB4MUZGNSwKKwkJMHgxRkE1LCAweDAxQkQsIDB4MDZCQSwgMHgxRkYzLCAweDFGRjEsCisJCTB4MUZBRSwgMHgwMTgyLCAweDA2RDMsIDB4MDAxMiwgMHgxRkVCLAorCQkweDFGQjcsIDB4MDE0QSwgMHgwNkU1LCAweDAwMzUsIDB4MUZFNSwKKwkJMHgxRkMwLCAweDAxMTQsIDB4MDZGMiwgMHgwMDVCLCAweDFGREYsCisJCTB4MUZDOSwgMHgwMEUxLCAweDA2RjksIDB4MDA4NSwgMHgxRkQ4LAorCX0sCisJW1ZTX0xUXzlfMTZfU0NBTEVdID0geworCQkvKiBMdW1hICovCisJCTB4MDAxQywgMHgwMUY2LCAweDAzREMsIDB4MDFGNiwgMHgwMDFDLAorCQkweDAwMTgsIDB4MDFERiwgMHgwM0RCLCAweDAyMEMsIDB4MDAyMiwKKwkJMHgwMDEzLCAweDAxQzksIDB4MDNEOSwgMHgwMjIzLCAweDAwMjgsCisJCTB4MDAwRiwgMHgwMUIzLCAweDAzRDYsIDB4MDIzQSwgMHgwMDJFLAorCQkweDAwMEMsIDB4MDE5RCwgMHgwM0QyLCAweDAyNTAsIDB4MDAzNSwKKwkJMHgwMDA5LCAweDAxODgsIDB4MDNDQywgMHgwMjY2LCAweDAwM0QsCisJCTB4MDAwNiwgMHgwMTczLCAweDAzQzUsIDB4MDI3RCwgMHgwMDQ1LAorCQkweDAwMDQsIDB4MDE1RSwgMHgwM0JELCAweDAyOTMsIDB4MDA0RSwKKwkJMHgwMDAyLCAweDAxNEEsIDB4MDNCNCwgMHgwMkE4LCAweDAwNTgsCisJCTB4MDAwMCwgMHgwMTM2LCAweDAzQUEsIDB4MDJCRSwgMHgwMDYyLAorCQkweDFGRkYsIDB4MDEyMywgMHgwMzlFLCAweDAyRDMsIDB4MDA2RCwKKwkJMHgxRkZFLCAweDAxMTAsIDB4MDM5MiwgMHgwMkU4LCAweDAwNzgsCisJCTB4MUZGRCwgMHgwMEZFLCAweDAzODQsIDB4MDJGQywgMHgwMDg1LAorCQkweDFGRkQsIDB4MDBFRCwgMHgwMzc2LCAweDAzMEYsIDB4MDA5MSwKKwkJMHgxRkZDLCAweDAwREMsIDB4MDM2NywgMHgwMzIyLCAweDAwOUYsCisJCTB4MUZGQywgMHgwMENDLCAweDAzNTcsIDB4MDMzNCwgMHgwMEFELAorCQkweDAwQkMsIDB4MDM0NCwgMHgwMzQ0LCAweDAwQkMsIDB4MDAwMCwKKwkJMHgwMEFELCAweDAzMzQsIDB4MDM1NywgMHgwMENDLCAweDFGRkMsCisJCTB4MDA5RiwgMHgwMzIyLCAweDAzNjcsIDB4MDBEQywgMHgxRkZDLAorCQkweDAwOTEsIDB4MDMwRiwgMHgwMzc2LCAweDAwRUQsIDB4MUZGRCwKKwkJMHgwMDg1LCAweDAyRkMsIDB4MDM4NCwgMHgwMEZFLCAweDFGRkQsCisJCTB4MDA3OCwgMHgwMkU4LCAweDAzOTIsIDB4MDExMCwgMHgxRkZFLAorCQkweDAwNkQsIDB4MDJEMywgMHgwMzlFLCAweDAxMjMsIDB4MUZGRiwKKwkJMHgwMDYyLCAweDAyQkUsIDB4MDNBQSwgMHgwMTM2LCAweDAwMDAsCisJCTB4MDA1OCwgMHgwMkE4LCAweDAzQjQsIDB4MDE0QSwgMHgwMDAyLAorCQkweDAwNEUsIDB4MDI5MywgMHgwM0JELCAweDAxNUUsIDB4MDAwNCwKKwkJMHgwMDQ1LCAweDAyN0QsIDB4MDNDNSwgMHgwMTczLCAweDAwMDYsCisJCTB4MDAzRCwgMHgwMjY2LCAweDAzQ0MsIDB4MDE4OCwgMHgwMDA5LAorCQkweDAwMzUsIDB4MDI1MCwgMHgwM0QyLCAweDAxOUQsIDB4MDAwQywKKwkJMHgwMDJFLCAweDAyM0EsIDB4MDNENiwgMHgwMUIzLCAweDAwMEYsCisJCTB4MDAyOCwgMHgwMjIzLCAweDAzRDksIDB4MDFDOSwgMHgwMDEzLAorCQkweDAwMjIsIDB4MDIwQywgMHgwM0RCLCAweDAxREYsIDB4MDAxOCwKKwkJLyogQ2hyb21hICovCisJCTB4MDAxQywgMHgwMUY2LCAweDAzREMsIDB4MDFGNiwgMHgwMDFDLAorCQkweDAwMTgsIDB4MDFERiwgMHgwM0RCLCAweDAyMEMsIDB4MDAyMiwKKwkJMHgwMDEzLCAweDAxQzksIDB4MDNEOSwgMHgwMjIzLCAweDAwMjgsCisJCTB4MDAwRiwgMHgwMUIzLCAweDAzRDYsIDB4MDIzQSwgMHgwMDJFLAorCQkweDAwMEMsIDB4MDE5RCwgMHgwM0QyLCAweDAyNTAsIDB4MDAzNSwKKwkJMHgwMDA5LCAweDAxODgsIDB4MDNDQywgMHgwMjY2LCAweDAwM0QsCisJCTB4MDAwNiwgMHgwMTczLCAweDAzQzUsIDB4MDI3RCwgMHgwMDQ1LAorCQkweDAwMDQsIDB4MDE1RSwgMHgwM0JELCAweDAyOTMsIDB4MDA0RSwKKwkJMHgwMDAyLCAweDAxNEEsIDB4MDNCNCwgMHgwMkE4LCAweDAwNTgsCisJCTB4MDAwMCwgMHgwMTM2LCAweDAzQUEsIDB4MDJCRSwgMHgwMDYyLAorCQkweDFGRkYsIDB4MDEyMywgMHgwMzlFLCAweDAyRDMsIDB4MDA2RCwKKwkJMHgxRkZFLCAweDAxMTAsIDB4MDM5MiwgMHgwMkU4LCAweDAwNzgsCisJCTB4MUZGRCwgMHgwMEZFLCAweDAzODQsIDB4MDJGQywgMHgwMDg1LAorCQkweDFGRkQsIDB4MDBFRCwgMHgwMzc2LCAweDAzMEYsIDB4MDA5MSwKKwkJMHgxRkZDLCAweDAwREMsIDB4MDM2NywgMHgwMzIyLCAweDAwOUYsCisJCTB4MUZGQywgMHgwMENDLCAweDAzNTcsIDB4MDMzNCwgMHgwMEFELAorCQkweDAwQkMsIDB4MDM0NCwgMHgwMzQ0LCAweDAwQkMsIDB4MDAwMCwKKwkJMHgwMEFELCAweDAzMzQsIDB4MDM1NywgMHgwMENDLCAweDFGRkMsCisJCTB4MDA5RiwgMHgwMzIyLCAweDAzNjcsIDB4MDBEQywgMHgxRkZDLAorCQkweDAwOTEsIDB4MDMwRiwgMHgwMzc2LCAweDAwRUQsIDB4MUZGRCwKKwkJMHgwMDg1LCAweDAyRkMsIDB4MDM4NCwgMHgwMEZFLCAweDFGRkQsCisJCTB4MDA3OCwgMHgwMkU4LCAweDAzOTIsIDB4MDExMCwgMHgxRkZFLAorCQkweDAwNkQsIDB4MDJEMywgMHgwMzlFLCAweDAxMjMsIDB4MUZGRiwKKwkJMHgwMDYyLCAweDAyQkUsIDB4MDNBQSwgMHgwMTM2LCAweDAwMDAsCisJCTB4MDA1OCwgMHgwMkE4LCAweDAzQjQsIDB4MDE0QSwgMHgwMDAyLAorCQkweDAwNEUsIDB4MDI5MywgMHgwM0JELCAweDAxNUUsIDB4MDAwNCwKKwkJMHgwMDQ1LCAweDAyN0QsIDB4MDNDNSwgMHgwMTczLCAweDAwMDYsCisJCTB4MDAzRCwgMHgwMjY2LCAweDAzQ0MsIDB4MDE4OCwgMHgwMDA5LAorCQkweDAwMzUsIDB4MDI1MCwgMHgwM0QyLCAweDAxOUQsIDB4MDAwQywKKwkJMHgwMDJFLCAweDAyM0EsIDB4MDNENiwgMHgwMUIzLCAweDAwMEYsCisJCTB4MDAyOCwgMHgwMjIzLCAweDAzRDksIDB4MDFDOSwgMHgwMDEzLAorCQkweDAwMjIsIDB4MDIwQywgMHgwM0RCLCAweDAxREYsIDB4MDAxOCwKKwl9LAorCVtWU19MVF8xMF8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgwMDAzLCAweDAxRTksIDB4MDQyOCwgMHgwMUU5LCAweDAwMDMsCisJCTB4MDAwMCwgMHgwMUQwLCAweDA0MjYsIDB4MDIwMywgMHgwMDA3LAorCQkweDFGRkQsIDB4MDFCNywgMHgwNDI0LCAweDAyMUMsIDB4MDAwQywKKwkJMHgxRkZCLCAweDAxOUUsIDB4MDQyMCwgMHgwMjM2LCAweDAwMTEsCisJCTB4MUZGOSwgMHgwMTg2LCAweDA0MUEsIDB4MDI1MCwgMHgwMDE3LAorCQkweDFGRjcsIDB4MDE2RSwgMHgwNDE0LCAweDAyNkEsIDB4MDAxRCwKKwkJMHgxRkY2LCAweDAxNTcsIDB4MDQwQiwgMHgwMjg0LCAweDAwMjQsCisJCTB4MUZGNSwgMHgwMTQwLCAweDA0MDEsIDB4MDI5RSwgMHgwMDJDLAorCQkweDFGRjQsIDB4MDEyQSwgMHgwM0Y2LCAweDAyQjcsIDB4MDAzNSwKKwkJMHgxRkY0LCAweDAxMTUsIDB4MDNFOSwgMHgwMkQwLCAweDAwM0UsCisJCTB4MUZGNCwgMHgwMTAwLCAweDAzREIsIDB4MDJFOSwgMHgwMDQ4LAorCQkweDFGRjQsIDB4MDBFQywgMHgwM0NDLCAweDAzMDEsIDB4MDA1MywKKwkJMHgxRkY0LCAweDAwRDksIDB4MDNCQywgMHgwMzE4LCAweDAwNUYsCisJCTB4MUZGNSwgMHgwMEM3LCAweDAzQUEsIDB4MDMyRiwgMHgwMDZCLAorCQkweDFGRjYsIDB4MDBCNSwgMHgwMzk4LCAweDAzNDUsIDB4MDA3OCwKKwkJMHgxRkY2LCAweDAwQTUsIDB4MDM4NCwgMHgwMzVCLCAweDAwODYsCisJCTB4MDA5NCwgMHgwMzZDLCAweDAzNkMsIDB4MDA5NCwgMHgwMDAwLAorCQkweDAwODYsIDB4MDM1QiwgMHgwMzg0LCAweDAwQTUsIDB4MUZGNiwKKwkJMHgwMDc4LCAweDAzNDUsIDB4MDM5OCwgMHgwMEI1LCAweDFGRjYsCisJCTB4MDA2QiwgMHgwMzJGLCAweDAzQUEsIDB4MDBDNywgMHgxRkY1LAorCQkweDAwNUYsIDB4MDMxOCwgMHgwM0JDLCAweDAwRDksIDB4MUZGNCwKKwkJMHgwMDUzLCAweDAzMDEsIDB4MDNDQywgMHgwMEVDLCAweDFGRjQsCisJCTB4MDA0OCwgMHgwMkU5LCAweDAzREIsIDB4MDEwMCwgMHgxRkY0LAorCQkweDAwM0UsIDB4MDJEMCwgMHgwM0U5LCAweDAxMTUsIDB4MUZGNCwKKwkJMHgwMDM1LCAweDAyQjcsIDB4MDNGNiwgMHgwMTJBLCAweDFGRjQsCisJCTB4MDAyQywgMHgwMjlFLCAweDA0MDEsIDB4MDE0MCwgMHgxRkY1LAorCQkweDAwMjQsIDB4MDI4NCwgMHgwNDBCLCAweDAxNTcsIDB4MUZGNiwKKwkJMHgwMDFELCAweDAyNkEsIDB4MDQxNCwgMHgwMTZFLCAweDFGRjcsCisJCTB4MDAxNywgMHgwMjUwLCAweDA0MUEsIDB4MDE4NiwgMHgxRkY5LAorCQkweDAwMTEsIDB4MDIzNiwgMHgwNDIwLCAweDAxOUUsIDB4MUZGQiwKKwkJMHgwMDBDLCAweDAyMUMsIDB4MDQyNCwgMHgwMUI3LCAweDFGRkQsCisJCTB4MDAwNywgMHgwMjAzLCAweDA0MjYsIDB4MDFEMCwgMHgwMDAwLAorCQkvKiBDaHJvbWEgKi8KKwkJMHgwMDAzLCAweDAxRTksIDB4MDQyOCwgMHgwMUU5LCAweDAwMDMsCisJCTB4MDAwMCwgMHgwMUQwLCAweDA0MjYsIDB4MDIwMywgMHgwMDA3LAorCQkweDFGRkQsIDB4MDFCNywgMHgwNDI0LCAweDAyMUMsIDB4MDAwQywKKwkJMHgxRkZCLCAweDAxOUUsIDB4MDQyMCwgMHgwMjM2LCAweDAwMTEsCisJCTB4MUZGOSwgMHgwMTg2LCAweDA0MUEsIDB4MDI1MCwgMHgwMDE3LAorCQkweDFGRjcsIDB4MDE2RSwgMHgwNDE0LCAweDAyNkEsIDB4MDAxRCwKKwkJMHgxRkY2LCAweDAxNTcsIDB4MDQwQiwgMHgwMjg0LCAweDAwMjQsCisJCTB4MUZGNSwgMHgwMTQwLCAweDA0MDEsIDB4MDI5RSwgMHgwMDJDLAorCQkweDFGRjQsIDB4MDEyQSwgMHgwM0Y2LCAweDAyQjcsIDB4MDAzNSwKKwkJMHgxRkY0LCAweDAxMTUsIDB4MDNFOSwgMHgwMkQwLCAweDAwM0UsCisJCTB4MUZGNCwgMHgwMTAwLCAweDAzREIsIDB4MDJFOSwgMHgwMDQ4LAorCQkweDFGRjQsIDB4MDBFQywgMHgwM0NDLCAweDAzMDEsIDB4MDA1MywKKwkJMHgxRkY0LCAweDAwRDksIDB4MDNCQywgMHgwMzE4LCAweDAwNUYsCisJCTB4MUZGNSwgMHgwMEM3LCAweDAzQUEsIDB4MDMyRiwgMHgwMDZCLAorCQkweDFGRjYsIDB4MDBCNSwgMHgwMzk4LCAweDAzNDUsIDB4MDA3OCwKKwkJMHgxRkY2LCAweDAwQTUsIDB4MDM4NCwgMHgwMzVCLCAweDAwODYsCisJCTB4MDA5NCwgMHgwMzZDLCAweDAzNkMsIDB4MDA5NCwgMHgwMDAwLAorCQkweDAwODYsIDB4MDM1QiwgMHgwMzg0LCAweDAwQTUsIDB4MUZGNiwKKwkJMHgwMDc4LCAweDAzNDUsIDB4MDM5OCwgMHgwMEI1LCAweDFGRjYsCisJCTB4MDA2QiwgMHgwMzJGLCAweDAzQUEsIDB4MDBDNywgMHgxRkY1LAorCQkweDAwNUYsIDB4MDMxOCwgMHgwM0JDLCAweDAwRDksIDB4MUZGNCwKKwkJMHgwMDUzLCAweDAzMDEsIDB4MDNDQywgMHgwMEVDLCAweDFGRjQsCisJCTB4MDA0OCwgMHgwMkU5LCAweDAzREIsIDB4MDEwMCwgMHgxRkY0LAorCQkweDAwM0UsIDB4MDJEMCwgMHgwM0U5LCAweDAxMTUsIDB4MUZGNCwKKwkJMHgwMDM1LCAweDAyQjcsIDB4MDNGNiwgMHgwMTJBLCAweDFGRjQsCisJCTB4MDAyQywgMHgwMjlFLCAweDA0MDEsIDB4MDE0MCwgMHgxRkY1LAorCQkweDAwMjQsIDB4MDI4NCwgMHgwNDBCLCAweDAxNTcsIDB4MUZGNiwKKwkJMHgwMDFELCAweDAyNkEsIDB4MDQxNCwgMHgwMTZFLCAweDFGRjcsCisJCTB4MDAxNywgMHgwMjUwLCAweDA0MUEsIDB4MDE4NiwgMHgxRkY5LAorCQkweDAwMTEsIDB4MDIzNiwgMHgwNDIwLCAweDAxOUUsIDB4MUZGQiwKKwkJMHgwMDBDLCAweDAyMUMsIDB4MDQyNCwgMHgwMUI3LCAweDFGRkQsCisJCTB4MDAwNywgMHgwMjAzLCAweDA0MjYsIDB4MDFEMCwgMHgwMDAwLAorCX0sCisJW1ZTX0xUXzExXzE2X1NDQUxFXSA9IHsKKwkJLyogTHVtYSAqLworCQkweDFGRUMsIDB4MDFENiwgMHgwNDdDLCAweDAxRDYsIDB4MUZFQywKKwkJMHgxRkVBLCAweDAxQkEsIDB4MDQ3QiwgMHgwMUYzLCAweDFGRUUsCisJCTB4MUZFOSwgMHgwMTlELCAweDA0NzgsIDB4MDIxMSwgMHgxRkYxLAorCQkweDFGRTgsIDB4MDE4MiwgMHgwNDczLCAweDAyMkUsIDB4MUZGNSwKKwkJMHgxRkU4LCAweDAxNjcsIDB4MDQ2QywgMHgwMjRDLCAweDFGRjksCisJCTB4MUZFOCwgMHgwMTRELCAweDA0NjQsIDB4MDI2QSwgMHgxRkZELAorCQkweDFGRTgsIDB4MDEzNCwgMHgwNDU5LCAweDAyODgsIDB4MDAwMywKKwkJMHgxRkU5LCAweDAxMUIsIDB4MDQ0RCwgMHgwMkE2LCAweDAwMDksCisJCTB4MUZFOSwgMHgwMTA0LCAweDA0NDAsIDB4MDJDMywgMHgwMDEwLAorCQkweDFGRUEsIDB4MDBFRCwgMHgwNDMwLCAweDAyRTEsIDB4MDAxOCwKKwkJMHgxRkVCLCAweDAwRDcsIDB4MDQyMCwgMHgwMkZELCAweDAwMjEsCisJCTB4MUZFRCwgMHgwMEMyLCAweDA0MEQsIDB4MDMxOSwgMHgwMDJCLAorCQkweDFGRUUsIDB4MDBBRSwgMHgwM0Y5LCAweDAzMzYsIDB4MDAzNSwKKwkJMHgxRkYwLCAweDAwOUMsIDB4MDNFMywgMHgwMzUwLCAweDAwNDEsCisJCTB4MUZGMSwgMHgwMDhBLCAweDAzQ0QsIDB4MDM2QiwgMHgwMDRELAorCQkweDFGRjMsIDB4MDA3OSwgMHgwM0I1LCAweDAzODQsIDB4MDA1QiwKKwkJMHgwMDY5LCAweDAzOTcsIDB4MDM5NywgMHgwMDY5LCAweDAwMDAsCisJCTB4MDA1QiwgMHgwMzg0LCAweDAzQjUsIDB4MDA3OSwgMHgxRkYzLAorCQkweDAwNEQsIDB4MDM2QiwgMHgwM0NELCAweDAwOEEsIDB4MUZGMSwKKwkJMHgwMDQxLCAweDAzNTAsIDB4MDNFMywgMHgwMDlDLCAweDFGRjAsCisJCTB4MDAzNSwgMHgwMzM2LCAweDAzRjksIDB4MDBBRSwgMHgxRkVFLAorCQkweDAwMkIsIDB4MDMxOSwgMHgwNDBELCAweDAwQzIsIDB4MUZFRCwKKwkJMHgwMDIxLCAweDAyRkQsIDB4MDQyMCwgMHgwMEQ3LCAweDFGRUIsCisJCTB4MDAxOCwgMHgwMkUxLCAweDA0MzAsIDB4MDBFRCwgMHgxRkVBLAorCQkweDAwMTAsIDB4MDJDMywgMHgwNDQwLCAweDAxMDQsIDB4MUZFOSwKKwkJMHgwMDA5LCAweDAyQTYsIDB4MDQ0RCwgMHgwMTFCLCAweDFGRTksCisJCTB4MDAwMywgMHgwMjg4LCAweDA0NTksIDB4MDEzNCwgMHgxRkU4LAorCQkweDFGRkQsIDB4MDI2QSwgMHgwNDY0LCAweDAxNEQsIDB4MUZFOCwKKwkJMHgxRkY5LCAweDAyNEMsIDB4MDQ2QywgMHgwMTY3LCAweDFGRTgsCisJCTB4MUZGNSwgMHgwMjJFLCAweDA0NzMsIDB4MDE4MiwgMHgxRkU4LAorCQkweDFGRjEsIDB4MDIxMSwgMHgwNDc4LCAweDAxOUQsIDB4MUZFOSwKKwkJMHgxRkVFLCAweDAxRjMsIDB4MDQ3QiwgMHgwMUJBLCAweDFGRUEsCisJCS8qIENocm9tYSAqLworCQkweDFGRUMsIDB4MDFENiwgMHgwNDdDLCAweDAxRDYsIDB4MUZFQywKKwkJMHgxRkVBLCAweDAxQkEsIDB4MDQ3QiwgMHgwMUYzLCAweDFGRUUsCisJCTB4MUZFOSwgMHgwMTlELCAweDA0NzgsIDB4MDIxMSwgMHgxRkYxLAorCQkweDFGRTgsIDB4MDE4MiwgMHgwNDczLCAweDAyMkUsIDB4MUZGNSwKKwkJMHgxRkU4LCAweDAxNjcsIDB4MDQ2QywgMHgwMjRDLCAweDFGRjksCisJCTB4MUZFOCwgMHgwMTRELCAweDA0NjQsIDB4MDI2QSwgMHgxRkZELAorCQkweDFGRTgsIDB4MDEzNCwgMHgwNDU5LCAweDAyODgsIDB4MDAwMywKKwkJMHgxRkU5LCAweDAxMUIsIDB4MDQ0RCwgMHgwMkE2LCAweDAwMDksCisJCTB4MUZFOSwgMHgwMTA0LCAweDA0NDAsIDB4MDJDMywgMHgwMDEwLAorCQkweDFGRUEsIDB4MDBFRCwgMHgwNDMwLCAweDAyRTEsIDB4MDAxOCwKKwkJMHgxRkVCLCAweDAwRDcsIDB4MDQyMCwgMHgwMkZELCAweDAwMjEsCisJCTB4MUZFRCwgMHgwMEMyLCAweDA0MEQsIDB4MDMxOSwgMHgwMDJCLAorCQkweDFGRUUsIDB4MDBBRSwgMHgwM0Y5LCAweDAzMzYsIDB4MDAzNSwKKwkJMHgxRkYwLCAweDAwOUMsIDB4MDNFMywgMHgwMzUwLCAweDAwNDEsCisJCTB4MUZGMSwgMHgwMDhBLCAweDAzQ0QsIDB4MDM2QiwgMHgwMDRELAorCQkweDFGRjMsIDB4MDA3OSwgMHgwM0I1LCAweDAzODQsIDB4MDA1QiwKKwkJMHgwMDY5LCAweDAzOTcsIDB4MDM5NywgMHgwMDY5LCAweDAwMDAsCisJCTB4MDA1QiwgMHgwMzg0LCAweDAzQjUsIDB4MDA3OSwgMHgxRkYzLAorCQkweDAwNEQsIDB4MDM2QiwgMHgwM0NELCAweDAwOEEsIDB4MUZGMSwKKwkJMHgwMDQxLCAweDAzNTAsIDB4MDNFMywgMHgwMDlDLCAweDFGRjAsCisJCTB4MDAzNSwgMHgwMzM2LCAweDAzRjksIDB4MDBBRSwgMHgxRkVFLAorCQkweDAwMkIsIDB4MDMxOSwgMHgwNDBELCAweDAwQzIsIDB4MUZFRCwKKwkJMHgwMDIxLCAweDAyRkQsIDB4MDQyMCwgMHgwMEQ3LCAweDFGRUIsCisJCTB4MDAxOCwgMHgwMkUxLCAweDA0MzAsIDB4MDBFRCwgMHgxRkVBLAorCQkweDAwMTAsIDB4MDJDMywgMHgwNDQwLCAweDAxMDQsIDB4MUZFOSwKKwkJMHgwMDA5LCAweDAyQTYsIDB4MDQ0RCwgMHgwMTFCLCAweDFGRTksCisJCTB4MDAwMywgMHgwMjg4LCAweDA0NTksIDB4MDEzNCwgMHgxRkU4LAorCQkweDFGRkQsIDB4MDI2QSwgMHgwNDY0LCAweDAxNEQsIDB4MUZFOCwKKwkJMHgxRkY5LCAweDAyNEMsIDB4MDQ2QywgMHgwMTY3LCAweDFGRTgsCisJCTB4MUZGNSwgMHgwMjJFLCAweDA0NzMsIDB4MDE4MiwgMHgxRkU4LAorCQkweDFGRjEsIDB4MDIxMSwgMHgwNDc4LCAweDAxOUQsIDB4MUZFOSwKKwkJMHgxRkVFLCAweDAxRjMsIDB4MDQ3QiwgMHgwMUJBLCAweDFGRUEsCisJfSwKKwlbVlNfTFRfMTJfMTZfU0NBTEVdID0geworCQkvKiBMdW1hICovCisJCTB4MUZEOCwgMHgwMUJDLCAweDA0RDgsIDB4MDFCQywgMHgxRkQ4LAorCQkweDFGRDgsIDB4MDE5QywgMHgwNEQ4LCAweDAxREMsIDB4MUZEOCwKKwkJMHgxRkQ4LCAweDAxN0QsIDB4MDRENCwgMHgwMUZFLCAweDFGRDksCisJCTB4MUZEOSwgMHgwMTVFLCAweDA0Q0YsIDB4MDIyMCwgMHgxRkRBLAorCQkweDFGREIsIDB4MDE0MSwgMHgwNEM3LCAweDAyNDEsIDB4MUZEQywKKwkJMHgxRkRDLCAweDAxMjUsIDB4MDRCQywgMHgwMjY0LCAweDFGREYsCisJCTB4MUZERSwgMHgwMTA5LCAweDA0QjAsIDB4MDI4NiwgMHgxRkUzLAorCQkweDFGRTAsIDB4MDBFRiwgMHgwNEExLCAweDAyQTksIDB4MUZFNywKKwkJMHgxRkUyLCAweDAwRDYsIDB4MDQ5MSwgMHgwMkNCLCAweDFGRUMsCisJCTB4MUZFNCwgMHgwMEJFLCAweDA0N0UsIDB4MDJFRSwgMHgxRkYyLAorCQkweDFGRTYsIDB4MDBBNywgMHgwNDZBLCAweDAzMEYsIDB4MUZGQSwKKwkJMHgxRkU5LCAweDAwOTIsIDB4MDQ1MywgMHgwMzMwLCAweDAwMDIsCisJCTB4MUZFQiwgMHgwMDdFLCAweDA0M0IsIDB4MDM1MSwgMHgwMDBCLAorCQkweDFGRUQsIDB4MDA2QiwgMHgwNDIxLCAweDAzNzIsIDB4MDAxNSwKKwkJMHgxRkVGLCAweDAwNUEsIDB4MDQwNiwgMHgwMzkxLCAweDAwMjAsCisJCTB4MUZGMSwgMHgwMDQ5LCAweDAzRUEsIDB4MDNBRiwgMHgwMDJELAorCQkweDAwM0EsIDB4MDNDNiwgMHgwM0M2LCAweDAwM0EsIDB4MDAwMCwKKwkJMHgwMDJELCAweDAzQUYsIDB4MDNFQSwgMHgwMDQ5LCAweDFGRjEsCisJCTB4MDAyMCwgMHgwMzkxLCAweDA0MDYsIDB4MDA1QSwgMHgxRkVGLAorCQkweDAwMTUsIDB4MDM3MiwgMHgwNDIxLCAweDAwNkIsIDB4MUZFRCwKKwkJMHgwMDBCLCAweDAzNTEsIDB4MDQzQiwgMHgwMDdFLCAweDFGRUIsCisJCTB4MDAwMiwgMHgwMzMwLCAweDA0NTMsIDB4MDA5MiwgMHgxRkU5LAorCQkweDFGRkEsIDB4MDMwRiwgMHgwNDZBLCAweDAwQTcsIDB4MUZFNiwKKwkJMHgxRkYyLCAweDAyRUUsIDB4MDQ3RSwgMHgwMEJFLCAweDFGRTQsCisJCTB4MUZFQywgMHgwMkNCLCAweDA0OTEsIDB4MDBENiwgMHgxRkUyLAorCQkweDFGRTcsIDB4MDJBOSwgMHgwNEExLCAweDAwRUYsIDB4MUZFMCwKKwkJMHgxRkUzLCAweDAyODYsIDB4MDRCMCwgMHgwMTA5LCAweDFGREUsCisJCTB4MUZERiwgMHgwMjY0LCAweDA0QkMsIDB4MDEyNSwgMHgxRkRDLAorCQkweDFGREMsIDB4MDI0MSwgMHgwNEM3LCAweDAxNDEsIDB4MUZEQiwKKwkJMHgxRkRBLCAweDAyMjAsIDB4MDRDRiwgMHgwMTVFLCAweDFGRDksCisJCTB4MUZEOSwgMHgwMUZFLCAweDA0RDQsIDB4MDE3RCwgMHgxRkQ4LAorCQkweDFGRDgsIDB4MDFEQywgMHgwNEQ4LCAweDAxOUMsIDB4MUZEOCwKKwkJLyogQ2hyb21hICovCisJCTB4MUZEOCwgMHgwMUJDLCAweDA0RDgsIDB4MDFCQywgMHgxRkQ4LAorCQkweDFGRDgsIDB4MDE5QywgMHgwNEQ4LCAweDAxREMsIDB4MUZEOCwKKwkJMHgxRkQ4LCAweDAxN0QsIDB4MDRENCwgMHgwMUZFLCAweDFGRDksCisJCTB4MUZEOSwgMHgwMTVFLCAweDA0Q0YsIDB4MDIyMCwgMHgxRkRBLAorCQkweDFGREIsIDB4MDE0MSwgMHgwNEM3LCAweDAyNDEsIDB4MUZEQywKKwkJMHgxRkRDLCAweDAxMjUsIDB4MDRCQywgMHgwMjY0LCAweDFGREYsCisJCTB4MUZERSwgMHgwMTA5LCAweDA0QjAsIDB4MDI4NiwgMHgxRkUzLAorCQkweDFGRTAsIDB4MDBFRiwgMHgwNEExLCAweDAyQTksIDB4MUZFNywKKwkJMHgxRkUyLCAweDAwRDYsIDB4MDQ5MSwgMHgwMkNCLCAweDFGRUMsCisJCTB4MUZFNCwgMHgwMEJFLCAweDA0N0UsIDB4MDJFRSwgMHgxRkYyLAorCQkweDFGRTYsIDB4MDBBNywgMHgwNDZBLCAweDAzMEYsIDB4MUZGQSwKKwkJMHgxRkU5LCAweDAwOTIsIDB4MDQ1MywgMHgwMzMwLCAweDAwMDIsCisJCTB4MUZFQiwgMHgwMDdFLCAweDA0M0IsIDB4MDM1MSwgMHgwMDBCLAorCQkweDFGRUQsIDB4MDA2QiwgMHgwNDIxLCAweDAzNzIsIDB4MDAxNSwKKwkJMHgxRkVGLCAweDAwNUEsIDB4MDQwNiwgMHgwMzkxLCAweDAwMjAsCisJCTB4MUZGMSwgMHgwMDQ5LCAweDAzRUEsIDB4MDNBRiwgMHgwMDJELAorCQkweDAwM0EsIDB4MDNDNiwgMHgwM0M2LCAweDAwM0EsIDB4MDAwMCwKKwkJMHgwMDJELCAweDAzQUYsIDB4MDNFQSwgMHgwMDQ5LCAweDFGRjEsCisJCTB4MDAyMCwgMHgwMzkxLCAweDA0MDYsIDB4MDA1QSwgMHgxRkVGLAorCQkweDAwMTUsIDB4MDM3MiwgMHgwNDIxLCAweDAwNkIsIDB4MUZFRCwKKwkJMHgwMDBCLCAweDAzNTEsIDB4MDQzQiwgMHgwMDdFLCAweDFGRUIsCisJCTB4MDAwMiwgMHgwMzMwLCAweDA0NTMsIDB4MDA5MiwgMHgxRkU5LAorCQkweDFGRkEsIDB4MDMwRiwgMHgwNDZBLCAweDAwQTcsIDB4MUZFNiwKKwkJMHgxRkYyLCAweDAyRUUsIDB4MDQ3RSwgMHgwMEJFLCAweDFGRTQsCisJCTB4MUZFQywgMHgwMkNCLCAweDA0OTEsIDB4MDBENiwgMHgxRkUyLAorCQkweDFGRTcsIDB4MDJBOSwgMHgwNEExLCAweDAwRUYsIDB4MUZFMCwKKwkJMHgxRkUzLCAweDAyODYsIDB4MDRCMCwgMHgwMTA5LCAweDFGREUsCisJCTB4MUZERiwgMHgwMjY0LCAweDA0QkMsIDB4MDEyNSwgMHgxRkRDLAorCQkweDFGREMsIDB4MDI0MSwgMHgwNEM3LCAweDAxNDEsIDB4MUZEQiwKKwkJMHgxRkRBLCAweDAyMjAsIDB4MDRDRiwgMHgwMTVFLCAweDFGRDksCisJCTB4MUZEOSwgMHgwMUZFLCAweDA0RDQsIDB4MDE3RCwgMHgxRkQ4LAorCQkweDFGRDgsIDB4MDFEQywgMHgwNEQ4LCAweDAxOUMsIDB4MUZEOCwKKwl9LAorCVtWU19MVF8xM18xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkM4LCAweDAxOTksIDB4MDUzRSwgMHgwMTk5LCAweDFGQzgsCisJCTB4MUZDQSwgMHgwMTc1LCAweDA1M0UsIDB4MDFCRCwgMHgxRkM2LAorCQkweDFGQ0QsIDB4MDE1MywgMHgwNTM5LCAweDAxRTIsIDB4MUZDNSwKKwkJMHgxRkNGLCAweDAxMzIsIDB4MDUzMiwgMHgwMjA5LCAweDFGQzQsCisJCTB4MUZEMiwgMHgwMTEyLCAweDA1MjksIDB4MDIyRiwgMHgxRkM0LAorCQkweDFGRDUsIDB4MDBGNCwgMHgwNTFDLCAweDAyNTYsIDB4MUZDNSwKKwkJMHgxRkQ4LCAweDAwRDcsIDB4MDUwRCwgMHgwMjdFLCAweDFGQzYsCisJCTB4MUZEQywgMHgwMEJCLCAweDA0RkIsIDB4MDJBNiwgMHgxRkM4LAorCQkweDFGREYsIDB4MDBBMSwgMHgwNEU3LCAweDAyQ0UsIDB4MUZDQiwKKwkJMHgxRkUyLCAweDAwODksIDB4MDREMSwgMHgwMkY1LCAweDFGQ0YsCisJCTB4MUZFNSwgMHgwMDcyLCAweDA0QjgsIDB4MDMxRCwgMHgxRkQ0LAorCQkweDFGRTgsIDB4MDA1RCwgMHgwNDlFLCAweDAzNDQsIDB4MUZEOSwKKwkJMHgxRkVCLCAweDAwNDksIDB4MDQ4MCwgMHgwMzZCLCAweDFGRTEsCisJCTB4MUZFRSwgMHgwMDM3LCAweDA0NjIsIDB4MDM5MCwgMHgxRkU5LAorCQkweDFGRjAsIDB4MDAyNiwgMHgwNDQyLCAweDAzQjYsIDB4MUZGMiwKKwkJMHgxRkYyLCAweDAwMTcsIDB4MDQyMCwgMHgwM0RBLCAweDFGRkQsCisJCTB4MDAwOSwgMHgwM0Y3LCAweDAzRjcsIDB4MDAwOSwgMHgwMDAwLAorCQkweDFGRkQsIDB4MDNEQSwgMHgwNDIwLCAweDAwMTcsIDB4MUZGMiwKKwkJMHgxRkYyLCAweDAzQjYsIDB4MDQ0MiwgMHgwMDI2LCAweDFGRjAsCisJCTB4MUZFOSwgMHgwMzkwLCAweDA0NjIsIDB4MDAzNywgMHgxRkVFLAorCQkweDFGRTEsIDB4MDM2QiwgMHgwNDgwLCAweDAwNDksIDB4MUZFQiwKKwkJMHgxRkQ5LCAweDAzNDQsIDB4MDQ5RSwgMHgwMDVELCAweDFGRTgsCisJCTB4MUZENCwgMHgwMzFELCAweDA0QjgsIDB4MDA3MiwgMHgxRkU1LAorCQkweDFGQ0YsIDB4MDJGNSwgMHgwNEQxLCAweDAwODksIDB4MUZFMiwKKwkJMHgxRkNCLCAweDAyQ0UsIDB4MDRFNywgMHgwMEExLCAweDFGREYsCisJCTB4MUZDOCwgMHgwMkE2LCAweDA0RkIsIDB4MDBCQiwgMHgxRkRDLAorCQkweDFGQzYsIDB4MDI3RSwgMHgwNTBELCAweDAwRDcsIDB4MUZEOCwKKwkJMHgxRkM1LCAweDAyNTYsIDB4MDUxQywgMHgwMEY0LCAweDFGRDUsCisJCTB4MUZDNCwgMHgwMjJGLCAweDA1MjksIDB4MDExMiwgMHgxRkQyLAorCQkweDFGQzQsIDB4MDIwOSwgMHgwNTMyLCAweDAxMzIsIDB4MUZDRiwKKwkJMHgxRkM1LCAweDAxRTIsIDB4MDUzOSwgMHgwMTUzLCAweDFGQ0QsCisJCTB4MUZDNiwgMHgwMUJELCAweDA1M0UsIDB4MDE3NSwgMHgxRkNBLAorCQkvKiBDaHJvbWEgKi8KKwkJMHgxRkM4LCAweDAxOTksIDB4MDUzRSwgMHgwMTk5LCAweDFGQzgsCisJCTB4MUZDQSwgMHgwMTc1LCAweDA1M0UsIDB4MDFCRCwgMHgxRkM2LAorCQkweDFGQ0QsIDB4MDE1MywgMHgwNTM5LCAweDAxRTIsIDB4MUZDNSwKKwkJMHgxRkNGLCAweDAxMzIsIDB4MDUzMiwgMHgwMjA5LCAweDFGQzQsCisJCTB4MUZEMiwgMHgwMTEyLCAweDA1MjksIDB4MDIyRiwgMHgxRkM0LAorCQkweDFGRDUsIDB4MDBGNCwgMHgwNTFDLCAweDAyNTYsIDB4MUZDNSwKKwkJMHgxRkQ4LCAweDAwRDcsIDB4MDUwRCwgMHgwMjdFLCAweDFGQzYsCisJCTB4MUZEQywgMHgwMEJCLCAweDA0RkIsIDB4MDJBNiwgMHgxRkM4LAorCQkweDFGREYsIDB4MDBBMSwgMHgwNEU3LCAweDAyQ0UsIDB4MUZDQiwKKwkJMHgxRkUyLCAweDAwODksIDB4MDREMSwgMHgwMkY1LCAweDFGQ0YsCisJCTB4MUZFNSwgMHgwMDcyLCAweDA0QjgsIDB4MDMxRCwgMHgxRkQ0LAorCQkweDFGRTgsIDB4MDA1RCwgMHgwNDlFLCAweDAzNDQsIDB4MUZEOSwKKwkJMHgxRkVCLCAweDAwNDksIDB4MDQ4MCwgMHgwMzZCLCAweDFGRTEsCisJCTB4MUZFRSwgMHgwMDM3LCAweDA0NjIsIDB4MDM5MCwgMHgxRkU5LAorCQkweDFGRjAsIDB4MDAyNiwgMHgwNDQyLCAweDAzQjYsIDB4MUZGMiwKKwkJMHgxRkYyLCAweDAwMTcsIDB4MDQyMCwgMHgwM0RBLCAweDFGRkQsCisJCTB4MDAwOSwgMHgwM0Y3LCAweDAzRjcsIDB4MDAwOSwgMHgwMDAwLAorCQkweDFGRkQsIDB4MDNEQSwgMHgwNDIwLCAweDAwMTcsIDB4MUZGMiwKKwkJMHgxRkYyLCAweDAzQjYsIDB4MDQ0MiwgMHgwMDI2LCAweDFGRjAsCisJCTB4MUZFOSwgMHgwMzkwLCAweDA0NjIsIDB4MDAzNywgMHgxRkVFLAorCQkweDFGRTEsIDB4MDM2QiwgMHgwNDgwLCAweDAwNDksIDB4MUZFQiwKKwkJMHgxRkQ5LCAweDAzNDQsIDB4MDQ5RSwgMHgwMDVELCAweDFGRTgsCisJCTB4MUZENCwgMHgwMzFELCAweDA0QjgsIDB4MDA3MiwgMHgxRkU1LAorCQkweDFGQ0YsIDB4MDJGNSwgMHgwNEQxLCAweDAwODksIDB4MUZFMiwKKwkJMHgxRkNCLCAweDAyQ0UsIDB4MDRFNywgMHgwMEExLCAweDFGREYsCisJCTB4MUZDOCwgMHgwMkE2LCAweDA0RkIsIDB4MDBCQiwgMHgxRkRDLAorCQkweDFGQzYsIDB4MDI3RSwgMHgwNTBELCAweDAwRDcsIDB4MUZEOCwKKwkJMHgxRkM1LCAweDAyNTYsIDB4MDUxQywgMHgwMEY0LCAweDFGRDUsCisJCTB4MUZDNCwgMHgwMjJGLCAweDA1MjksIDB4MDExMiwgMHgxRkQyLAorCQkweDFGQzQsIDB4MDIwOSwgMHgwNTMyLCAweDAxMzIsIDB4MUZDRiwKKwkJMHgxRkM1LCAweDAxRTIsIDB4MDUzOSwgMHgwMTUzLCAweDFGQ0QsCisJCTB4MUZDNiwgMHgwMUJELCAweDA1M0UsIDB4MDE3NSwgMHgxRkNBLAorCX0sCisJW1ZTX0xUXzE0XzE2X1NDQUxFXSA9IHsKKwkJLyogTHVtYSAqLworCQkweDFGQkYsIDB4MDE2QywgMHgwNUFBLCAweDAxNkMsIDB4MUZCRiwKKwkJMHgxRkMzLCAweDAxNDYsIDB4MDVBOCwgMHgwMTk0LCAweDFGQkIsCisJCTB4MUZDNywgMHgwMTIxLCAweDA1QTMsIDB4MDFCRCwgMHgxRkI4LAorCQkweDFGQ0IsIDB4MDBGRCwgMHgwNTlCLCAweDAxRTgsIDB4MUZCNSwKKwkJMHgxRkQwLCAweDAwREMsIDB4MDU4RiwgMHgwMjEzLCAweDFGQjIsCisJCTB4MUZENCwgMHgwMEJDLCAweDA1ODAsIDB4MDI0MCwgMHgxRkIwLAorCQkweDFGRDgsIDB4MDA5RSwgMHgwNTZFLCAweDAyNkQsIDB4MUZBRiwKKwkJMHgxRkRDLCAweDAwODIsIDB4MDU1QSwgMHgwMjlBLCAweDFGQUUsCisJCTB4MUZFMCwgMHgwMDY3LCAweDA1NDIsIDB4MDJDOSwgMHgxRkFFLAorCQkweDFGRTQsIDB4MDA0RiwgMHgwNTI4LCAweDAyRjYsIDB4MUZBRiwKKwkJMHgxRkU4LCAweDAwMzgsIDB4MDUwQSwgMHgwMzI1LCAweDFGQjEsCisJCTB4MUZFQiwgMHgwMDI0LCAweDA0RUIsIDB4MDM1MiwgMHgxRkI0LAorCQkweDFGRUUsIDB4MDAxMSwgMHgwNEM4LCAweDAzODAsIDB4MUZCOSwKKwkJMHgxRkYxLCAweDAwMDAsIDB4MDRBNCwgMHgwM0FDLCAweDFGQkYsCisJCTB4MUZGNCwgMHgxRkYxLCAweDA0N0QsIDB4MDNEOCwgMHgxRkM2LAorCQkweDFGRjYsIDB4MUZFNCwgMHgwNDU1LCAweDA0MDMsIDB4MUZDRSwKKwkJMHgxRkQ4LCAweDA0MjgsIDB4MDQyOCwgMHgxRkQ4LCAweDAwMDAsCisJCTB4MUZDRSwgMHgwNDAzLCAweDA0NTUsIDB4MUZFNCwgMHgxRkY2LAorCQkweDFGQzYsIDB4MDNEOCwgMHgwNDdELCAweDFGRjEsIDB4MUZGNCwKKwkJMHgxRkJGLCAweDAzQUMsIDB4MDRBNCwgMHgwMDAwLCAweDFGRjEsCisJCTB4MUZCOSwgMHgwMzgwLCAweDA0QzgsIDB4MDAxMSwgMHgxRkVFLAorCQkweDFGQjQsIDB4MDM1MiwgMHgwNEVCLCAweDAwMjQsIDB4MUZFQiwKKwkJMHgxRkIxLCAweDAzMjUsIDB4MDUwQSwgMHgwMDM4LCAweDFGRTgsCisJCTB4MUZBRiwgMHgwMkY2LCAweDA1MjgsIDB4MDA0RiwgMHgxRkU0LAorCQkweDFGQUUsIDB4MDJDOSwgMHgwNTQyLCAweDAwNjcsIDB4MUZFMCwKKwkJMHgxRkFFLCAweDAyOUEsIDB4MDU1QSwgMHgwMDgyLCAweDFGREMsCisJCTB4MUZBRiwgMHgwMjZELCAweDA1NkUsIDB4MDA5RSwgMHgxRkQ4LAorCQkweDFGQjAsIDB4MDI0MCwgMHgwNTgwLCAweDAwQkMsIDB4MUZENCwKKwkJMHgxRkIyLCAweDAyMTMsIDB4MDU4RiwgMHgwMERDLCAweDFGRDAsCisJCTB4MUZCNSwgMHgwMUU4LCAweDA1OUIsIDB4MDBGRCwgMHgxRkNCLAorCQkweDFGQjgsIDB4MDFCRCwgMHgwNUEzLCAweDAxMjEsIDB4MUZDNywKKwkJMHgxRkJCLCAweDAxOTQsIDB4MDVBOCwgMHgwMTQ2LCAweDFGQzMsCisJCS8qIENocm9tYSAqLworCQkweDFGQkYsIDB4MDE2QywgMHgwNUFBLCAweDAxNkMsIDB4MUZCRiwKKwkJMHgxRkMzLCAweDAxNDYsIDB4MDVBOCwgMHgwMTk0LCAweDFGQkIsCisJCTB4MUZDNywgMHgwMTIxLCAweDA1QTMsIDB4MDFCRCwgMHgxRkI4LAorCQkweDFGQ0IsIDB4MDBGRCwgMHgwNTlCLCAweDAxRTgsIDB4MUZCNSwKKwkJMHgxRkQwLCAweDAwREMsIDB4MDU4RiwgMHgwMjEzLCAweDFGQjIsCisJCTB4MUZENCwgMHgwMEJDLCAweDA1ODAsIDB4MDI0MCwgMHgxRkIwLAorCQkweDFGRDgsIDB4MDA5RSwgMHgwNTZFLCAweDAyNkQsIDB4MUZBRiwKKwkJMHgxRkRDLCAweDAwODIsIDB4MDU1QSwgMHgwMjlBLCAweDFGQUUsCisJCTB4MUZFMCwgMHgwMDY3LCAweDA1NDIsIDB4MDJDOSwgMHgxRkFFLAorCQkweDFGRTQsIDB4MDA0RiwgMHgwNTI4LCAweDAyRjYsIDB4MUZBRiwKKwkJMHgxRkU4LCAweDAwMzgsIDB4MDUwQSwgMHgwMzI1LCAweDFGQjEsCisJCTB4MUZFQiwgMHgwMDI0LCAweDA0RUIsIDB4MDM1MiwgMHgxRkI0LAorCQkweDFGRUUsIDB4MDAxMSwgMHgwNEM4LCAweDAzODAsIDB4MUZCOSwKKwkJMHgxRkYxLCAweDAwMDAsIDB4MDRBNCwgMHgwM0FDLCAweDFGQkYsCisJCTB4MUZGNCwgMHgxRkYxLCAweDA0N0QsIDB4MDNEOCwgMHgxRkM2LAorCQkweDFGRjYsIDB4MUZFNCwgMHgwNDU1LCAweDA0MDMsIDB4MUZDRSwKKwkJMHgxRkQ4LCAweDA0MjgsIDB4MDQyOCwgMHgxRkQ4LCAweDAwMDAsCisJCTB4MUZDRSwgMHgwNDAzLCAweDA0NTUsIDB4MUZFNCwgMHgxRkY2LAorCQkweDFGQzYsIDB4MDNEOCwgMHgwNDdELCAweDFGRjEsIDB4MUZGNCwKKwkJMHgxRkJGLCAweDAzQUMsIDB4MDRBNCwgMHgwMDAwLCAweDFGRjEsCisJCTB4MUZCOSwgMHgwMzgwLCAweDA0QzgsIDB4MDAxMSwgMHgxRkVFLAorCQkweDFGQjQsIDB4MDM1MiwgMHgwNEVCLCAweDAwMjQsIDB4MUZFQiwKKwkJMHgxRkIxLCAweDAzMjUsIDB4MDUwQSwgMHgwMDM4LCAweDFGRTgsCisJCTB4MUZBRiwgMHgwMkY2LCAweDA1MjgsIDB4MDA0RiwgMHgxRkU0LAorCQkweDFGQUUsIDB4MDJDOSwgMHgwNTQyLCAweDAwNjcsIDB4MUZFMCwKKwkJMHgxRkFFLCAweDAyOUEsIDB4MDU1QSwgMHgwMDgyLCAweDFGREMsCisJCTB4MUZBRiwgMHgwMjZELCAweDA1NkUsIDB4MDA5RSwgMHgxRkQ4LAorCQkweDFGQjAsIDB4MDI0MCwgMHgwNTgwLCAweDAwQkMsIDB4MUZENCwKKwkJMHgxRkIyLCAweDAyMTMsIDB4MDU4RiwgMHgwMERDLCAweDFGRDAsCisJCTB4MUZCNSwgMHgwMUU4LCAweDA1OUIsIDB4MDBGRCwgMHgxRkNCLAorCQkweDFGQjgsIDB4MDFCRCwgMHgwNUEzLCAweDAxMjEsIDB4MUZDNywKKwkJMHgxRkJCLCAweDAxOTQsIDB4MDVBOCwgMHgwMTQ2LCAweDFGQzMsCisJfSwKKwlbVlNfTFRfMTVfMTZfU0NBTEVdID0geworCQkvKiBMdW1hICovCisJCTB4MUZCRCwgMHgwMTM2LCAweDA2MUEsIDB4MDEzNiwgMHgxRkJELAorCQkweDFGQzMsIDB4MDEwRCwgMHgwNjE3LCAweDAxNjEsIDB4MUZCOCwKKwkJMHgxRkM5LCAweDAwRTYsIDB4MDYxMSwgMHgwMThFLCAweDFGQjIsCisJCTB4MUZDRSwgMHgwMEMxLCAweDA2MDcsIDB4MDFCRCwgMHgxRkFELAorCQkweDFGRDQsIDB4MDA5RSwgMHgwNUY5LCAweDAxRUQsIDB4MUZBOCwKKwkJMHgxRkQ5LCAweDAwN0QsIDB4MDVFOCwgMHgwMjFGLCAweDFGQTMsCisJCTB4MUZERSwgMHgwMDVFLCAweDA1RDMsIDB4MDI1MiwgMHgxRjlGLAorCQkweDFGRTIsIDB4MDA0MiwgMHgwNUJDLCAweDAyODUsIDB4MUY5QiwKKwkJMHgxRkU3LCAweDAwMjksIDB4MDU5RiwgMHgwMkI5LCAweDFGOTgsCisJCTB4MUZFQSwgMHgwMDExLCAweDA1ODAsIDB4MDJFRiwgMHgxRjk2LAorCQkweDFGRUUsIDB4MUZGQywgMHgwNTVELCAweDAzMjQsIDB4MUY5NSwKKwkJMHgxRkYxLCAweDFGRTksIDB4MDUzOCwgMHgwMzU5LCAweDFGOTUsCisJCTB4MUZGNCwgMHgxRkQ4LCAweDA1MTAsIDB4MDM4RSwgMHgxRjk2LAorCQkweDFGRjcsIDB4MUZDOSwgMHgwNEU1LCAweDAzQzIsIDB4MUY5OSwKKwkJMHgxRkY5LCAweDFGQkQsIDB4MDRCOCwgMHgwM0Y1LCAweDFGOUQsCisJCTB4MUZGQiwgMHgxRkIyLCAweDA0ODksIDB4MDQyOCwgMHgxRkEyLAorCQkweDFGQUEsIDB4MDQ1NiwgMHgwNDU2LCAweDFGQUEsIDB4MDAwMCwKKwkJMHgxRkEyLCAweDA0MjgsIDB4MDQ4OSwgMHgxRkIyLCAweDFGRkIsCisJCTB4MUY5RCwgMHgwM0Y1LCAweDA0QjgsIDB4MUZCRCwgMHgxRkY5LAorCQkweDFGOTksIDB4MDNDMiwgMHgwNEU1LCAweDFGQzksIDB4MUZGNywKKwkJMHgxRjk2LCAweDAzOEUsIDB4MDUxMCwgMHgxRkQ4LCAweDFGRjQsCisJCTB4MUY5NSwgMHgwMzU5LCAweDA1MzgsIDB4MUZFOSwgMHgxRkYxLAorCQkweDFGOTUsIDB4MDMyNCwgMHgwNTVELCAweDFGRkMsIDB4MUZFRSwKKwkJMHgxRjk2LCAweDAyRUYsIDB4MDU4MCwgMHgwMDExLCAweDFGRUEsCisJCTB4MUY5OCwgMHgwMkI5LCAweDA1OUYsIDB4MDAyOSwgMHgxRkU3LAorCQkweDFGOUIsIDB4MDI4NSwgMHgwNUJDLCAweDAwNDIsIDB4MUZFMiwKKwkJMHgxRjlGLCAweDAyNTIsIDB4MDVEMywgMHgwMDVFLCAweDFGREUsCisJCTB4MUZBMywgMHgwMjFGLCAweDA1RTgsIDB4MDA3RCwgMHgxRkQ5LAorCQkweDFGQTgsIDB4MDFFRCwgMHgwNUY5LCAweDAwOUUsIDB4MUZENCwKKwkJMHgxRkFELCAweDAxQkQsIDB4MDYwNywgMHgwMEMxLCAweDFGQ0UsCisJCTB4MUZCMiwgMHgwMThFLCAweDA2MTEsIDB4MDBFNiwgMHgxRkM5LAorCQkweDFGQjgsIDB4MDE2MSwgMHgwNjE3LCAweDAxMEQsIDB4MUZDMywKKwkJLyogQ2hyb21hICovCisJCTB4MUZCRCwgMHgwMTM2LCAweDA2MUEsIDB4MDEzNiwgMHgxRkJELAorCQkweDFGQzMsIDB4MDEwRCwgMHgwNjE3LCAweDAxNjEsIDB4MUZCOCwKKwkJMHgxRkM5LCAweDAwRTYsIDB4MDYxMSwgMHgwMThFLCAweDFGQjIsCisJCTB4MUZDRSwgMHgwMEMxLCAweDA2MDcsIDB4MDFCRCwgMHgxRkFELAorCQkweDFGRDQsIDB4MDA5RSwgMHgwNUY5LCAweDAxRUQsIDB4MUZBOCwKKwkJMHgxRkQ5LCAweDAwN0QsIDB4MDVFOCwgMHgwMjFGLCAweDFGQTMsCisJCTB4MUZERSwgMHgwMDVFLCAweDA1RDMsIDB4MDI1MiwgMHgxRjlGLAorCQkweDFGRTIsIDB4MDA0MiwgMHgwNUJDLCAweDAyODUsIDB4MUY5QiwKKwkJMHgxRkU3LCAweDAwMjksIDB4MDU5RiwgMHgwMkI5LCAweDFGOTgsCisJCTB4MUZFQSwgMHgwMDExLCAweDA1ODAsIDB4MDJFRiwgMHgxRjk2LAorCQkweDFGRUUsIDB4MUZGQywgMHgwNTVELCAweDAzMjQsIDB4MUY5NSwKKwkJMHgxRkYxLCAweDFGRTksIDB4MDUzOCwgMHgwMzU5LCAweDFGOTUsCisJCTB4MUZGNCwgMHgxRkQ4LCAweDA1MTAsIDB4MDM4RSwgMHgxRjk2LAorCQkweDFGRjcsIDB4MUZDOSwgMHgwNEU1LCAweDAzQzIsIDB4MUY5OSwKKwkJMHgxRkY5LCAweDFGQkQsIDB4MDRCOCwgMHgwM0Y1LCAweDFGOUQsCisJCTB4MUZGQiwgMHgxRkIyLCAweDA0ODksIDB4MDQyOCwgMHgxRkEyLAorCQkweDFGQUEsIDB4MDQ1NiwgMHgwNDU2LCAweDFGQUEsIDB4MDAwMCwKKwkJMHgxRkEyLCAweDA0MjgsIDB4MDQ4OSwgMHgxRkIyLCAweDFGRkIsCisJCTB4MUY5RCwgMHgwM0Y1LCAweDA0QjgsIDB4MUZCRCwgMHgxRkY5LAorCQkweDFGOTksIDB4MDNDMiwgMHgwNEU1LCAweDFGQzksIDB4MUZGNywKKwkJMHgxRjk2LCAweDAzOEUsIDB4MDUxMCwgMHgxRkQ4LCAweDFGRjQsCisJCTB4MUY5NSwgMHgwMzU5LCAweDA1MzgsIDB4MUZFOSwgMHgxRkYxLAorCQkweDFGOTUsIDB4MDMyNCwgMHgwNTVELCAweDFGRkMsIDB4MUZFRSwKKwkJMHgxRjk2LCAweDAyRUYsIDB4MDU4MCwgMHgwMDExLCAweDFGRUEsCisJCTB4MUY5OCwgMHgwMkI5LCAweDA1OUYsIDB4MDAyOSwgMHgxRkU3LAorCQkweDFGOUIsIDB4MDI4NSwgMHgwNUJDLCAweDAwNDIsIDB4MUZFMiwKKwkJMHgxRjlGLCAweDAyNTIsIDB4MDVEMywgMHgwMDVFLCAweDFGREUsCisJCTB4MUZBMywgMHgwMjFGLCAweDA1RTgsIDB4MDA3RCwgMHgxRkQ5LAorCQkweDFGQTgsIDB4MDFFRCwgMHgwNUY5LCAweDAwOUUsIDB4MUZENCwKKwkJMHgxRkFELCAweDAxQkQsIDB4MDYwNywgMHgwMEMxLCAweDFGQ0UsCisJCTB4MUZCMiwgMHgwMThFLCAweDA2MTEsIDB4MDBFNiwgMHgxRkM5LAorCQkweDFGQjgsIDB4MDE2MSwgMHgwNjE3LCAweDAxMEQsIDB4MUZDMywKKwl9LAorCVtWU19MVF8xNl8xNl9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgxRkMzLCAweDAwRjgsIDB4MDY4QSwgMHgwMEY4LCAweDFGQzMsCisJCTB4MUZDQSwgMHgwMENDLCAweDA2ODksIDB4MDEyNSwgMHgxRkJDLAorCQkweDFGRDEsIDB4MDBBMywgMHgwNjgxLCAweDAxNTYsIDB4MUZCNSwKKwkJMHgxRkQ3LCAweDAwN0QsIDB4MDY3NiwgMHgwMTg4LCAweDFGQUUsCisJCTB4MUZERCwgMHgwMDVBLCAweDA2NjYsIDB4MDFCRCwgMHgxRkE2LAorCQkweDFGRTMsIDB4MDAzOSwgMHgwNjUyLCAweDAxRjMsIDB4MUY5RiwKKwkJMHgxRkU4LCAweDAwMUIsIDB4MDYzOSwgMHgwMjJDLCAweDFGOTgsCisJCTB4MUZFQywgMHgwMDAwLCAweDA2MUQsIDB4MDI2NSwgMHgxRjkyLAorCQkweDFGRjAsIDB4MUZFOCwgMHgwNUZDLCAweDAyQTAsIDB4MUY4QywKKwkJMHgxRkY0LCAweDFGRDIsIDB4MDVENywgMHgwMkRDLCAweDFGODcsCisJCTB4MUZGNywgMHgxRkJGLCAweDA1QUYsIDB4MDMxOSwgMHgxRjgyLAorCQkweDFGRkEsIDB4MUZBRiwgMHgwNTgzLCAweDAzNTYsIDB4MUY3RSwKKwkJMHgxRkZDLCAweDFGQTEsIDB4MDU1NCwgMHgwMzkzLCAweDFGN0MsCisJCTB4MUZGRSwgMHgxRjk1LCAweDA1MjMsIDB4MDNDRiwgMHgxRjdCLAorCQkweDAwMDAsIDB4MUY4QywgMHgwNEVFLCAweDA0MEIsIDB4MUY3QiwKKwkJMHgwMDAxLCAweDFGODUsIDB4MDRCOCwgMHgwNDQ2LCAweDFGN0MsCisJCTB4MUY4MCwgMHgwNDgwLCAweDA0ODAsIDB4MUY4MCwgMHgwMDAwLAorCQkweDFGN0MsIDB4MDQ0NiwgMHgwNEI4LCAweDFGODUsIDB4MDAwMSwKKwkJMHgxRjdCLCAweDA0MEIsIDB4MDRFRSwgMHgxRjhDLCAweDAwMDAsCisJCTB4MUY3QiwgMHgwM0NGLCAweDA1MjMsIDB4MUY5NSwgMHgxRkZFLAorCQkweDFGN0MsIDB4MDM5MywgMHgwNTU0LCAweDFGQTEsIDB4MUZGQywKKwkJMHgxRjdFLCAweDAzNTYsIDB4MDU4MywgMHgxRkFGLCAweDFGRkEsCisJCTB4MUY4MiwgMHgwMzE5LCAweDA1QUYsIDB4MUZCRiwgMHgxRkY3LAorCQkweDFGODcsIDB4MDJEQywgMHgwNUQ3LCAweDFGRDIsIDB4MUZGNCwKKwkJMHgxRjhDLCAweDAyQTAsIDB4MDVGQywgMHgxRkU4LCAweDFGRjAsCisJCTB4MUY5MiwgMHgwMjY1LCAweDA2MUQsIDB4MDAwMCwgMHgxRkVDLAorCQkweDFGOTgsIDB4MDIyQywgMHgwNjM5LCAweDAwMUIsIDB4MUZFOCwKKwkJMHgxRjlGLCAweDAxRjMsIDB4MDY1MiwgMHgwMDM5LCAweDFGRTMsCisJCTB4MUZBNiwgMHgwMUJELCAweDA2NjYsIDB4MDA1QSwgMHgxRkRELAorCQkweDFGQUUsIDB4MDE4OCwgMHgwNjc2LCAweDAwN0QsIDB4MUZENywKKwkJMHgxRkI1LCAweDAxNTYsIDB4MDY4MSwgMHgwMEEzLCAweDFGRDEsCisJCTB4MUZCQywgMHgwMTI1LCAweDA2ODksIDB4MDBDQywgMHgxRkNBLAorCQkvKiBDaHJvbWEgKi8KKwkJMHgxRkMzLCAweDAwRjgsIDB4MDY4QSwgMHgwMEY4LCAweDFGQzMsCisJCTB4MUZDQSwgMHgwMENDLCAweDA2ODksIDB4MDEyNSwgMHgxRkJDLAorCQkweDFGRDEsIDB4MDBBMywgMHgwNjgxLCAweDAxNTYsIDB4MUZCNSwKKwkJMHgxRkQ3LCAweDAwN0QsIDB4MDY3NiwgMHgwMTg4LCAweDFGQUUsCisJCTB4MUZERCwgMHgwMDVBLCAweDA2NjYsIDB4MDFCRCwgMHgxRkE2LAorCQkweDFGRTMsIDB4MDAzOSwgMHgwNjUyLCAweDAxRjMsIDB4MUY5RiwKKwkJMHgxRkU4LCAweDAwMUIsIDB4MDYzOSwgMHgwMjJDLCAweDFGOTgsCisJCTB4MUZFQywgMHgwMDAwLCAweDA2MUQsIDB4MDI2NSwgMHgxRjkyLAorCQkweDFGRjAsIDB4MUZFOCwgMHgwNUZDLCAweDAyQTAsIDB4MUY4QywKKwkJMHgxRkY0LCAweDFGRDIsIDB4MDVENywgMHgwMkRDLCAweDFGODcsCisJCTB4MUZGNywgMHgxRkJGLCAweDA1QUYsIDB4MDMxOSwgMHgxRjgyLAorCQkweDFGRkEsIDB4MUZBRiwgMHgwNTgzLCAweDAzNTYsIDB4MUY3RSwKKwkJMHgxRkZDLCAweDFGQTEsIDB4MDU1NCwgMHgwMzkzLCAweDFGN0MsCisJCTB4MUZGRSwgMHgxRjk1LCAweDA1MjMsIDB4MDNDRiwgMHgxRjdCLAorCQkweDAwMDAsIDB4MUY4QywgMHgwNEVFLCAweDA0MEIsIDB4MUY3QiwKKwkJMHgwMDAxLCAweDFGODUsIDB4MDRCOCwgMHgwNDQ2LCAweDFGN0MsCisJCTB4MUY4MCwgMHgwNDgwLCAweDA0ODAsIDB4MUY4MCwgMHgwMDAwLAorCQkweDFGN0MsIDB4MDQ0NiwgMHgwNEI4LCAweDFGODUsIDB4MDAwMSwKKwkJMHgxRjdCLCAweDA0MEIsIDB4MDRFRSwgMHgxRjhDLCAweDAwMDAsCisJCTB4MUY3QiwgMHgwM0NGLCAweDA1MjMsIDB4MUY5NSwgMHgxRkZFLAorCQkweDFGN0MsIDB4MDM5MywgMHgwNTU0LCAweDFGQTEsIDB4MUZGQywKKwkJMHgxRjdFLCAweDAzNTYsIDB4MDU4MywgMHgxRkFGLCAweDFGRkEsCisJCTB4MUY4MiwgMHgwMzE5LCAweDA1QUYsIDB4MUZCRiwgMHgxRkY3LAorCQkweDFGODcsIDB4MDJEQywgMHgwNUQ3LCAweDFGRDIsIDB4MUZGNCwKKwkJMHgxRjhDLCAweDAyQTAsIDB4MDVGQywgMHgxRkU4LCAweDFGRjAsCisJCTB4MUY5MiwgMHgwMjY1LCAweDA2MUQsIDB4MDAwMCwgMHgxRkVDLAorCQkweDFGOTgsIDB4MDIyQywgMHgwNjM5LCAweDAwMUIsIDB4MUZFOCwKKwkJMHgxRjlGLCAweDAxRjMsIDB4MDY1MiwgMHgwMDM5LCAweDFGRTMsCisJCTB4MUZBNiwgMHgwMUJELCAweDA2NjYsIDB4MDA1QSwgMHgxRkRELAorCQkweDFGQUUsIDB4MDE4OCwgMHgwNjc2LCAweDAwN0QsIDB4MUZENywKKwkJMHgxRkI1LCAweDAxNTYsIDB4MDY4MSwgMHgwMEEzLCAweDFGRDEsCisJCTB4MUZCQywgMHgwMTI1LCAweDA2ODksIDB4MDBDQywgMHgxRkNBLAorCX0sCisJW1ZTXzFfVE9fMV9TQ0FMRV0gPSB7CisJCS8qIEx1bWEgKi8KKwkJMHgwMDAwLCAweDAwMDAsIDB4MDgwMCwgMHgwMDAwLCAweDAwMDAsCisJCTB4MUZEOCwgMHgwMDg1LCAweDA2RjksIDB4MDBFMSwgMHgxRkM5LAorCQkweDFGREYsIDB4MDA1QiwgMHgwNkYyLCAweDAxMTQsIDB4MUZDMCwKKwkJMHgxRkU1LCAweDAwMzUsIDB4MDZFNSwgMHgwMTRBLCAweDFGQjcsCisJCTB4MUZFQiwgMHgwMDEyLCAweDA2RDMsIDB4MDE4MiwgMHgxRkFFLAorCQkweDFGRjEsIDB4MUZGMywgMHgwNkJBLCAweDAxQkQsIDB4MUZBNSwKKwkJMHgxRkY1LCAweDFGRDcsIDB4MDY5RCwgMHgwMUZCLCAweDFGOUMsCisJCTB4MUZGOSwgMHgxRkJFLCAweDA2N0MsIDB4MDIzQSwgMHgxRjkzLAorCQkweDFGRkQsIDB4MUZBOCwgMHgwNjU2LCAweDAyN0IsIDB4MUY4QSwKKwkJMHgwMDAwLCAweDFGOTUsIDB4MDYyQiwgMHgwMkJGLCAweDFGODEsCisJCTB4MDAwMiwgMHgxRjg2LCAweDA1RkMsIDB4MDMwMywgMHgxRjc5LAorCQkweDAwMDQsIDB4MUY3OSwgMHgwNUNBLCAweDAzNDcsIDB4MUY3MiwKKwkJMHgwMDA1LCAweDFGNkYsIDB4MDU5NCwgMHgwMzhELCAweDFGNkIsCisJCTB4MDAwNiwgMHgxRjY3LCAweDA1NUIsIDB4MDNEMiwgMHgxRjY2LAorCQkweDAwMDcsIDB4MUY2MiwgMHgwNTFFLCAweDA0MTcsIDB4MUY2MiwKKwkJMHgwMDA3LCAweDFGNUYsIDB4MDRERiwgMHgwNDVDLCAweDFGNUYsCisJCTB4MUY1RSwgMHgwNEEyLCAweDA0QTIsIDB4MUY1RSwgMHgwMDAwLAorCQkweDFGNUYsIDB4MDQ1QywgMHgwNERGLCAweDFGNUYsIDB4MDAwNywKKwkJMHgxRjYyLCAweDA0MTcsIDB4MDUxRSwgMHgxRjYyLCAweDAwMDcsCisJCTB4MUY2NiwgMHgwM0QyLCAweDA1NUIsIDB4MUY2NywgMHgwMDA2LAorCQkweDFGNkIsIDB4MDM4RCwgMHgwNTk0LCAweDFGNkYsIDB4MDAwNSwKKwkJMHgxRjcyLCAweDAzNDcsIDB4MDVDQSwgMHgxRjc5LCAweDAwMDQsCisJCTB4MUY3OSwgMHgwMzAzLCAweDA1RkMsIDB4MUY4NiwgMHgwMDAyLAorCQkweDFGODEsIDB4MDJCRiwgMHgwNjJCLCAweDFGOTUsIDB4MDAwMCwKKwkJMHgxRjhBLCAweDAyN0IsIDB4MDY1NiwgMHgxRkE4LCAweDFGRkQsCisJCTB4MUY5MywgMHgwMjNBLCAweDA2N0MsIDB4MUZCRSwgMHgxRkY5LAorCQkweDFGOUMsIDB4MDFGQiwgMHgwNjlELCAweDFGRDcsIDB4MUZGNSwKKwkJMHgxRkE1LCAweDAxQkQsIDB4MDZCQSwgMHgxRkYzLCAweDFGRjEsCisJCTB4MUZBRSwgMHgwMTgyLCAweDA2RDMsIDB4MDAxMiwgMHgxRkVCLAorCQkweDFGQjcsIDB4MDE0QSwgMHgwNkU1LCAweDAwMzUsIDB4MUZFNSwKKwkJMHgxRkMwLCAweDAxMTQsIDB4MDZGMiwgMHgwMDVCLCAweDFGREYsCisJCTB4MUZDOSwgMHgwMEUxLCAweDA2RjksIDB4MDA4NSwgMHgxRkQ4LAorCQkvKiBDaHJvbWEgKi8KKwkJMHgwMDAwLCAweDAwMDAsIDB4MDgwMCwgMHgwMDAwLCAweDAwMDAsCisJCTB4MUZEOCwgMHgwMDg1LCAweDA2RjksIDB4MDBFMSwgMHgxRkM5LAorCQkweDFGREYsIDB4MDA1QiwgMHgwNkYyLCAweDAxMTQsIDB4MUZDMCwKKwkJMHgxRkU1LCAweDAwMzUsIDB4MDZFNSwgMHgwMTRBLCAweDFGQjcsCisJCTB4MUZFQiwgMHgwMDEyLCAweDA2RDMsIDB4MDE4MiwgMHgxRkFFLAorCQkweDFGRjEsIDB4MUZGMywgMHgwNkJBLCAweDAxQkQsIDB4MUZBNSwKKwkJMHgxRkY1LCAweDFGRDcsIDB4MDY5RCwgMHgwMUZCLCAweDFGOUMsCisJCTB4MUZGOSwgMHgxRkJFLCAweDA2N0MsIDB4MDIzQSwgMHgxRjkzLAorCQkweDFGRkQsIDB4MUZBOCwgMHgwNjU2LCAweDAyN0IsIDB4MUY4QSwKKwkJMHgwMDAwLCAweDFGOTUsIDB4MDYyQiwgMHgwMkJGLCAweDFGODEsCisJCTB4MDAwMiwgMHgxRjg2LCAweDA1RkMsIDB4MDMwMywgMHgxRjc5LAorCQkweDAwMDQsIDB4MUY3OSwgMHgwNUNBLCAweDAzNDcsIDB4MUY3MiwKKwkJMHgwMDA1LCAweDFGNkYsIDB4MDU5NCwgMHgwMzhELCAweDFGNkIsCisJCTB4MDAwNiwgMHgxRjY3LCAweDA1NUIsIDB4MDNEMiwgMHgxRjY2LAorCQkweDAwMDcsIDB4MUY2MiwgMHgwNTFFLCAweDA0MTcsIDB4MUY2MiwKKwkJMHgwMDA3LCAweDFGNUYsIDB4MDRERiwgMHgwNDVDLCAweDFGNUYsCisJCTB4MUY1RSwgMHgwNEEyLCAweDA0QTIsIDB4MUY1RSwgMHgwMDAwLAorCQkweDFGNUYsIDB4MDQ1QywgMHgwNERGLCAweDFGNUYsIDB4MDAwNywKKwkJMHgxRjYyLCAweDA0MTcsIDB4MDUxRSwgMHgxRjYyLCAweDAwMDcsCisJCTB4MUY2NiwgMHgwM0QyLCAweDA1NUIsIDB4MUY2NywgMHgwMDA2LAorCQkweDFGNkIsIDB4MDM4RCwgMHgwNTk0LCAweDFGNkYsIDB4MDAwNSwKKwkJMHgxRjcyLCAweDAzNDcsIDB4MDVDQSwgMHgxRjc5LCAweDAwMDQsCisJCTB4MUY3OSwgMHgwMzAzLCAweDA1RkMsIDB4MUY4NiwgMHgwMDAyLAorCQkweDFGODEsIDB4MDJCRiwgMHgwNjJCLCAweDFGOTUsIDB4MDAwMCwKKwkJMHgxRjhBLCAweDAyN0IsIDB4MDY1NiwgMHgxRkE4LCAweDFGRkQsCisJCTB4MUY5MywgMHgwMjNBLCAweDA2N0MsIDB4MUZCRSwgMHgxRkY5LAorCQkweDFGOUMsIDB4MDFGQiwgMHgwNjlELCAweDFGRDcsIDB4MUZGNSwKKwkJMHgxRkE1LCAweDAxQkQsIDB4MDZCQSwgMHgxRkYzLCAweDFGRjEsCisJCTB4MUZBRSwgMHgwMTgyLCAweDA2RDMsIDB4MDAxMiwgMHgxRkVCLAorCQkweDFGQjcsIDB4MDE0QSwgMHgwNkU1LCAweDAwMzUsIDB4MUZFNSwKKwkJMHgxRkMwLCAweDAxMTQsIDB4MDZGMiwgMHgwMDVCLCAweDFGREYsCisJCTB4MUZDOSwgMHgwMEUxLCAweDA2RjksIDB4MDA4NSwgMHgxRkQ4LAorCX0sCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS92cGRtYS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBkbWEuYwppbmRleCBmY2JlNDhhLi5lODE3NWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS92cGRtYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZG1hLmMKQEAgLTMwLDM4ICszMCw0NyBAQAogCiBjb25zdCBzdHJ1Y3QgdnBkbWFfZGF0YV9mb3JtYXQgdnBkbWFfeXV2X2ZtdHNbXSA9IHsKIAlbVlBETUFfREFUQV9GTVRfWTQ0NF0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfWVVWLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX1k0NDQsCiAJCS5kZXB0aAkJPSA4LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX1k0MjJdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1lVViwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9ZNDIyLAogCQkuZGVwdGgJCT0gOCwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9ZNDIwXSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9ZVVYsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfWTQyMCwKIAkJLmRlcHRoCQk9IDgsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQzQ0NF0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfWVVWLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0M0NDQsCiAJCS5kZXB0aAkJPSA4LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX0M0MjJdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1lVViwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9DNDIyLAogCQkuZGVwdGgJCT0gOCwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9DNDIwXSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9ZVVYsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQzQyMCwKIAkJLmRlcHRoCQk9IDQsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfWUM0MjJdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1lVViwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9ZQzQyMiwKIAkJLmRlcHRoCQk9IDE2LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX1lDNDQ0XSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9ZVVYsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfWUM0NDQsCiAJCS5kZXB0aAkJPSAyNCwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9DWTQyMl0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfWVVWLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0NZNDIyLAogCQkuZGVwdGgJCT0gMTYsCiAJfSwKQEAgLTY5LDgyICs3OCwxMDIgQEAKIAogY29uc3Qgc3RydWN0IHZwZG1hX2RhdGFfZm9ybWF0IHZwZG1hX3JnYl9mbXRzW10gPSB7CiAJW1ZQRE1BX0RBVEFfRk1UX1JHQjU2NV0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX1JHQjE2XzU2NSwKIAkJLmRlcHRoCQk9IDE2LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX0FSR0IxNl8xNTU1XSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQVJHQl8xNTU1LAogCQkuZGVwdGgJCT0gMTYsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQVJHQjE2XSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQVJHQl80NDQ0LAogCQkuZGVwdGgJCT0gMTYsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfUkdCQTE2XzU1NTFdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9SR0JBXzU1NTEsCiAJCS5kZXB0aAkJPSAxNiwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9SR0JBMTZdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9SR0JBXzQ0NDQsCiAJCS5kZXB0aAkJPSAxNiwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9BUkdCMjRdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9BUkdCMjRfNjY2NiwKIAkJLmRlcHRoCQk9IDI0LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX1JHQjI0XSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfUkdCMjRfODg4LAogCQkuZGVwdGgJCT0gMjQsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQVJHQjMyXSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQVJHQjMyXzg4ODgsCiAJCS5kZXB0aAkJPSAzMiwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9SR0JBMjRdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9SR0JBMjRfNjY2NiwKIAkJLmRlcHRoCQk9IDI0LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX1JHQkEzMl0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX1JHQkEzMl84ODg4LAogCQkuZGVwdGgJCT0gMzIsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQkdSNTY1XSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQkdSMTZfNTY1LAogCQkuZGVwdGgJCT0gMTYsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQUJHUjE2XzE1NTVdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9BQkdSXzE1NTUsCiAJCS5kZXB0aAkJPSAxNiwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9BQkdSMTZdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9BQkdSXzQ0NDQsCiAJCS5kZXB0aAkJPSAxNiwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9CR1JBMTZfNTU1MV0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0JHUkFfNTU1MSwKIAkJLmRlcHRoCQk9IDE2LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX0JHUkExNl0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0JHUkFfNDQ0NCwKIAkJLmRlcHRoCQk9IDE2LAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX0FCR1IyNF0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0FCR1IyNF82NjY2LAogCQkuZGVwdGgJCT0gMjQsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQkdSMjRdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9CR1IyNF84ODgsCiAJCS5kZXB0aAkJPSAyNCwKIAl9LAogCVtWUERNQV9EQVRBX0ZNVF9BQkdSMzJdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX1JHQiwKIAkJLmRhdGFfdHlwZQk9IERBVEFfVFlQRV9BQkdSMzJfODg4OCwKIAkJLmRlcHRoCQk9IDMyLAogCX0sCiAJW1ZQRE1BX0RBVEFfRk1UX0JHUkEyNF0gPSB7CisJCS50eXBlCQk9IFZQRE1BX0RBVEFfRk1UX1RZUEVfUkdCLAogCQkuZGF0YV90eXBlCT0gREFUQV9UWVBFX0JHUkEyNF82NjY2LAogCQkuZGVwdGgJCT0gMjQsCiAJfSwKIAlbVlBETUFfREFUQV9GTVRfQkdSQTMyXSA9IHsKKwkJLnR5cGUJCT0gVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfQkdSQTMyXzg4ODgsCiAJCS5kZXB0aAkJPSAzMiwKIAl9LApAQCAtMTUyLDYgKzE4MSw3IEBACiAKIGNvbnN0IHN0cnVjdCB2cGRtYV9kYXRhX2Zvcm1hdCB2cGRtYV9taXNjX2ZtdHNbXSA9IHsKIAlbVlBETUFfREFUQV9GTVRfTVZdID0geworCQkudHlwZQkJPSBWUERNQV9EQVRBX0ZNVF9UWVBFX01JU0MsCiAJCS5kYXRhX3R5cGUJPSBEQVRBX1RZUEVfTVYsCiAJCS5kZXB0aAkJPSA0LAogCX0sCkBAIC01OTksMTAgKzYyOSwxMSBAQAogCiAJY2hhbm5lbCA9IG5leHRfY2hhbiA9IGNoYW5faW5mb1tjaGFuXS5udW07CiAKLQlpZiAoZm10LT5kYXRhX3R5cGUgPT0gREFUQV9UWVBFX0M0MjApCisJaWYgKGZtdC0+dHlwZSA9PSBWUERNQV9EQVRBX0ZNVF9UWVBFX1lVViAmJgorCQkJZm10LT5kYXRhX3R5cGUgPT0gREFUQV9UWVBFX0M0MjApCiAJCWRlcHRoID0gODsKIAotCXN0cmlkZSA9IChkZXB0aCAqIGNfcmVjdC0+d2lkdGgpID4+IDM7CisJc3RyaWRlID0gQUxJR04oKGRlcHRoICogY19yZWN0LT53aWR0aCkgPj4gMywgVlBETUFfU1RSSURFX0FMSUdOKTsKIAlkbWFfYWRkciArPSAoY19yZWN0LT5sZWZ0ICogZGVwdGgpID4+IDM7CiAKIAlkdGQgPSBsaXN0LT5uZXh0OwpAQCAtNjQ5LDEzICs2ODAsMTQgQEAKIAogCWNoYW5uZWwgPSBuZXh0X2NoYW4gPSBjaGFuX2luZm9bY2hhbl0ubnVtOwogCi0JaWYgKGZtdC0+ZGF0YV90eXBlID09IERBVEFfVFlQRV9DNDIwKSB7CisJaWYgKGZtdC0+dHlwZSA9PSBWUERNQV9EQVRBX0ZNVF9UWVBFX1lVViAmJgorCQkJZm10LT5kYXRhX3R5cGUgPT0gREFUQV9UWVBFX0M0MjApIHsKIAkJaGVpZ2h0ID4+PSAxOwogCQlmcmFtZV9oZWlnaHQgPj49IDE7CiAJCWRlcHRoID0gODsKIAl9CiAKLQlzdHJpZGUgPSAoZGVwdGggKiBjX3JlY3QtPndpZHRoKSA+PiAzOworCXN0cmlkZSA9IEFMSUdOKChkZXB0aCAqIGNfcmVjdC0+d2lkdGgpID4+IDMsIFZQRE1BX1NUUklERV9BTElHTik7CiAJZG1hX2FkZHIgKz0gKGNfcmVjdC0+bGVmdCAqIGRlcHRoKSA+PiAzOwogCiAJZHRkID0gbGlzdC0+bmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZG1hLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS92cGRtYS5oCmluZGV4IGVhYTJhNzEuLmNmNDBmMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZG1hLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBkbWEuaApAQCAtMzksMTMgKzM5LDIzIEBACiAJYm9vbCByZWFkeTsKIH07CiAKK2VudW0gdnBkbWFfZGF0YV9mb3JtYXRfdHlwZSB7CisJVlBETUFfREFUQV9GTVRfVFlQRV9ZVVYsCisJVlBETUFfREFUQV9GTVRfVFlQRV9SR0IsCisJVlBETUFfREFUQV9GTVRfVFlQRV9NSVNDLAorfTsKKwogc3RydWN0IHZwZG1hX2RhdGFfZm9ybWF0IHsKKwllbnVtIHZwZG1hX2RhdGFfZm9ybWF0X3R5cGUgdHlwZTsKIAlpbnQgZGF0YV90eXBlOwogCXU4IGRlcHRoOwogfTsKIAogI2RlZmluZSBWUERNQV9ERVNDX0FMSUdOCQkxNgkvKiAxNi1ieXRlIGRlc2NyaXB0b3IgYWxpZ25tZW50ICovCi0KKyNkZWZpbmUgVlBETUFfU1RSSURFX0FMSUdOCQkxNgkvKgorCQkJCQkJICogbGluZSBzdHJpZGUgb2Ygc291cmNlIGFuZCBkZXN0CisJCQkJCQkgKiBidWZmZXJzIHNob3VsZCBiZSAxNiBieXRlIGFsaWduZWQKKwkJCQkJCSAqLwogI2RlZmluZSBWUERNQV9EVERfREVTQ19TSVpFCQkzMgkvKiA4IHdvcmRzICovCiAjZGVmaW5lIFZQRE1BX0NGRF9DVERfREVTQ19TSVpFCQkxNgkvKiA0IHdvcmRzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZG1hX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZG1hX3ByaXYuaAppbmRleCBmMGU5YTgwLi5jMWE2Y2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS92cGRtYV9wcml2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBkbWFfcHJpdi5oCkBAIC03OCw3ICs3OCw3IEBACiAjZGVmaW5lIERBVEFfVFlQRV9DNDIwCQkJCTB4NgogI2RlZmluZSBEQVRBX1RZUEVfWUM0MjIJCQkJMHg3CiAjZGVmaW5lIERBVEFfVFlQRV9ZQzQ0NAkJCQkweDgKLSNkZWZpbmUgREFUQV9UWVBFX0NZNDIyCQkJCTB4MjMKKyNkZWZpbmUgREFUQV9UWVBFX0NZNDIyCQkJCTB4MjcKIAogI2RlZmluZSBEQVRBX1RZUEVfUkdCMTZfNTY1CQkJMHgwCiAjZGVmaW5lIERBVEFfVFlQRV9BUkdCXzE1NTUJCQkweDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBlLmMKaW5kZXggNGU1ODA2OS4uMTI5NmM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KQEAgLTQyLDYgKzQzLDggQEAKIAogI2luY2x1ZGUgInZwZG1hLmgiCiAjaW5jbHVkZSAidnBlX3JlZ3MuaCIKKyNpbmNsdWRlICJzYy5oIgorI2luY2x1ZGUgImNzYy5oIgogCiAjZGVmaW5lIFZQRV9NT0RVTEVfTkFNRSAidnBlIgogCkBAIC01NCwxMCArNTcsNiBAQAogLyogcmVxdWlyZWQgYWxpZ25tZW50cyAqLwogI2RlZmluZSBTX0FMSUdOCQkwCS8qIG11bHRpcGxlIG9mIDEgKi8KICNkZWZpbmUgSF9BTElHTgkJMQkvKiBtdWx0aXBsZSBvZiAyICovCi0jZGVmaW5lIFdfQUxJR04JCTEJLyogbXVsdGlwbGUgb2YgMiAqLwotCi0vKiBtdWx0aXBsZSBvZiAxMjggYml0cywgbGluZSBzdHJpZGUsIDE2IGJ5dGVzICovCi0jZGVmaW5lIExfQUxJR04JCTQKIAogLyogZmxhZ3MgdGhhdCBpbmRpY2F0ZSBhIGZvcm1hdCBjYW4gYmUgdXNlZCBmb3IgY2FwdHVyZS9vdXRwdXQgKi8KICNkZWZpbmUgVlBFX0ZNVF9UWVBFX0NBUFRVUkUJKDEgPDwgMCkKQEAgLTI2OCw2ICsyNjcsMzggQEAKIAkJLnZwZG1hX2ZtdAk9IHsgJnZwZG1hX3l1dl9mbXRzW1ZQRE1BX0RBVEFfRk1UX0NZNDIyXSwKIAkJCQkgIH0sCiAJfSwKKwl7CisJCS5uYW1lCQk9ICJSR0I4ODggcGFja2VkIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfUkdCMjQsCisJCS50eXBlcwkJPSBWUEVfRk1UX1RZUEVfQ0FQVFVSRSwKKwkJLmNvcGxhbmFyCT0gMCwKKwkJLnZwZG1hX2ZtdAk9IHsgJnZwZG1hX3JnYl9mbXRzW1ZQRE1BX0RBVEFfRk1UX1JHQjI0XSwKKwkJCQkgIH0sCisJfSwKKwl7CisJCS5uYW1lCQk9ICJBUkdCMzIiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9SR0IzMiwKKwkJLnR5cGVzCQk9IFZQRV9GTVRfVFlQRV9DQVBUVVJFLAorCQkuY29wbGFuYXIJPSAwLAorCQkudnBkbWFfZm10CT0geyAmdnBkbWFfcmdiX2ZtdHNbVlBETUFfREFUQV9GTVRfQVJHQjMyXSwKKwkJCQkgIH0sCisJfSwKKwl7CisJCS5uYW1lCQk9ICJCR1I4ODggcGFja2VkIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfQkdSMjQsCisJCS50eXBlcwkJPSBWUEVfRk1UX1RZUEVfQ0FQVFVSRSwKKwkJLmNvcGxhbmFyCT0gMCwKKwkJLnZwZG1hX2ZtdAk9IHsgJnZwZG1hX3JnYl9mbXRzW1ZQRE1BX0RBVEFfRk1UX0JHUjI0XSwKKwkJCQkgIH0sCisJfSwKKwl7CisJCS5uYW1lCQk9ICJBQkdSMzIiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9CR1IzMiwKKwkJLnR5cGVzCQk9IFZQRV9GTVRfVFlQRV9DQVBUVVJFLAorCQkuY29wbGFuYXIJPSAwLAorCQkudnBkbWFfZm10CT0geyAmdnBkbWFfcmdiX2ZtdHNbVlBETUFfREFUQV9GTVRfQUJHUjMyXSwKKwkJCQkgIH0sCisJfSwKIH07CiAKIC8qCkBAIC0zMjcsOSArMzU4LDEyIEBACiAKIAlpbnQJCQlpcnE7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7CiAKIAlzdHJ1Y3QgdmIyX2FsbG9jX2N0eAkqYWxsb2NfY3R4OwogCXN0cnVjdCB2cGRtYV9kYXRhCSp2cGRtYTsJCS8qIHZwZG1hIGRhdGEgaGFuZGxlICovCisJc3RydWN0IHNjX2RhdGEJCSpzYzsJCS8qIHNjYWxlciBkYXRhIGhhbmRsZSAqLworCXN0cnVjdCBjc2NfZGF0YQkJKmNzYzsJCS8qIGNzYyBkYXRhIGhhbmRsZSAqLwogfTsKIAogLyoKQEAgLTM1Niw2ICszOTAsOCBAQAogCXZvaWQJCQkqbXZfYnVmWzJdOwkJLyogdmlydHVhbCBhZGRycyBvZiBtb3Rpb24gdmVjdG9yIGJ1ZnMgKi8KIAlzaXplX3QJCQltdl9idWZfc2l6ZTsJCS8qIGN1cnJlbnQgbW90aW9uIHZlY3RvciBidWZmZXIgc2l6ZSAqLwogCXN0cnVjdCB2cGRtYV9idWYJbW1yX2FkYjsJCS8qIHNoYWRvdyByZWcgYWRkci9kYXRhIGJsb2NrICovCisJc3RydWN0IHZwZG1hX2J1ZglzY19jb2VmZl9oOwkJLyogaCBjb2VmZiBidWZmZXIgKi8KKwlzdHJ1Y3QgdnBkbWFfYnVmCXNjX2NvZWZmX3Y7CQkvKiB2IGNvZWZmIGJ1ZmZlciAqLwogCXN0cnVjdCB2cGRtYV9kZXNjX2xpc3QJZGVzY19saXN0OwkJLyogRE1BIGRlc2NyaXB0b3IgbGlzdCAqLwogCiAJYm9vbAkJCWRlaW50ZXJsYWNpbmc7CQkvKiB1c2luZyBkZS1pbnRlcmxhY2VyICovCkBAIC00MzgsMTQgKzQ3NCwyMyBAQAogCXUzMgkJCXVzM19yZWdzWzhdOwogCXN0cnVjdCB2cGRtYV9hZGJfaGRyCWRlaV9oZHI7CiAJdTMyCQkJZGVpX3JlZ3NbOF07Ci0Jc3RydWN0IHZwZG1hX2FkYl9oZHIJc2NfaGRyOwotCXUzMgkJCXNjX3JlZ3NbMV07Ci0JdTMyCQkJc2NfcGFkWzNdOworCXN0cnVjdCB2cGRtYV9hZGJfaGRyCXNjX2hkcjA7CisJdTMyCQkJc2NfcmVnczBbN107CisJdTMyCQkJc2NfcGFkMFsxXTsKKwlzdHJ1Y3QgdnBkbWFfYWRiX2hkcglzY19oZHI4OworCXUzMgkJCXNjX3JlZ3M4WzZdOworCXUzMgkJCXNjX3BhZDhbMl07CisJc3RydWN0IHZwZG1hX2FkYl9oZHIJc2NfaGRyMTc7CisJdTMyCQkJc2NfcmVnczE3WzldOworCXUzMgkJCXNjX3BhZDE3WzNdOwogCXN0cnVjdCB2cGRtYV9hZGJfaGRyCWNzY19oZHI7CiAJdTMyCQkJY3NjX3JlZ3NbNl07CiAJdTMyCQkJY3NjX3BhZFsyXTsKIH07CiAKKyNkZWZpbmUgR0VUX09GRlNFVF9UT1AoY3R4LCBvYmosIHJlZykJXAorCSgob2JqKS0+cmVzLT5zdGFydCAtIGN0eC0+ZGV2LT5yZXMtPnN0YXJ0ICsgcmVnKQorCiAjZGVmaW5lIFZQRV9TRVRfTU1SX0FEQl9IRFIoY3R4LCBoZHIsIHJlZ3MsIG9mZnNldF9hKQlcCiAJVlBETUFfU0VUX01NUl9BREJfSERSKGN0eC0+bW1yX2FkYiwgdnBlX21tcl9hZGIsIGhkciwgcmVncywgb2Zmc2V0X2EpCiAvKgpAQCAtNDU4LDggKzUwMywxNCBAQAogCVZQRV9TRVRfTU1SX0FEQl9IRFIoY3R4LCB1czJfaGRyLCB1czJfcmVncywgVlBFX1VTMl9SMCk7CiAJVlBFX1NFVF9NTVJfQURCX0hEUihjdHgsIHVzM19oZHIsIHVzM19yZWdzLCBWUEVfVVMzX1IwKTsKIAlWUEVfU0VUX01NUl9BREJfSERSKGN0eCwgZGVpX2hkciwgZGVpX3JlZ3MsIFZQRV9ERUlfRlJBTUVfU0laRSk7Ci0JVlBFX1NFVF9NTVJfQURCX0hEUihjdHgsIHNjX2hkciwgc2NfcmVncywgVlBFX1NDX01QX1NDMCk7Ci0JVlBFX1NFVF9NTVJfQURCX0hEUihjdHgsIGNzY19oZHIsIGNzY19yZWdzLCBWUEVfQ1NDX0NTQzAwKTsKKwlWUEVfU0VUX01NUl9BREJfSERSKGN0eCwgc2NfaGRyMCwgc2NfcmVnczAsCisJCUdFVF9PRkZTRVRfVE9QKGN0eCwgY3R4LT5kZXYtPnNjLCBDRkdfU0MwKSk7CisJVlBFX1NFVF9NTVJfQURCX0hEUihjdHgsIHNjX2hkcjgsIHNjX3JlZ3M4LAorCQlHRVRfT0ZGU0VUX1RPUChjdHgsIGN0eC0+ZGV2LT5zYywgQ0ZHX1NDOCkpOworCVZQRV9TRVRfTU1SX0FEQl9IRFIoY3R4LCBzY19oZHIxNywgc2NfcmVnczE3LAorCQlHRVRfT0ZGU0VUX1RPUChjdHgsIGN0eC0+ZGV2LT5zYywgQ0ZHX1NDMTcpKTsKKwlWUEVfU0VUX01NUl9BREJfSERSKGN0eCwgY3NjX2hkciwgY3NjX3JlZ3MsCisJCUdFVF9PRkZTRVRfVE9QKGN0eCwgY3R4LT5kZXYtPmNzYywgQ1NDX0NTQzAwKSk7CiB9OwogCiAvKgpAQCAtNjcwLDE3ICs3MjEsMjAgQEAKIHN0YXRpYyB2b2lkIHNldF9kc3RfcmVnaXN0ZXJzKHN0cnVjdCB2cGVfY3R4ICpjdHgpCiB7CiAJc3RydWN0IHZwZV9tbXJfYWRiICptbXJfYWRiID0gY3R4LT5tbXJfYWRiLmFkZHI7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UgY2xyc3BjID0gY3R4LT5xX2RhdGFbUV9EQVRBX0RTVF0uY29sb3JzcGFjZTsKIAlzdHJ1Y3QgdnBlX2ZtdCAqZm10ID0gY3R4LT5xX2RhdGFbUV9EQVRBX0RTVF0uZm10OwogCXUzMiB2YWwgPSAwOwogCi0JLyogc2VsZWN0IFJHQiBwYXRoIHdoZW4gY29sb3Igc3BhY2UgY29udmVyc2lvbiBpcyBzdXBwb3J0ZWQgaW4gZnV0dXJlICovCi0JaWYgKGZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9SR0IyNCkKLQkJdmFsIHw9IFZQRV9SR0JfT1VUX1NFTEVDVCB8IFZQRV9DU0NfU1JDX0RFSV9TQ0FMRVI7CisJaWYgKGNscnNwYyA9PSBWNEwyX0NPTE9SU1BBQ0VfU1JHQikKKwkJdmFsIHw9IFZQRV9SR0JfT1VUX1NFTEVDVDsKIAllbHNlIGlmIChmbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxNikKIAkJdmFsIHw9IFZQRV9DT0xPUl9TRVBBUkFURV80MjI7CiAKLQkvKiBUaGUgc291cmNlIG9mIENIUl9EUyBpcyBhbHdheXMgdGhlIHNjYWxlciwgd2hldGhlciBpdCdzIHVzZWQgb3Igbm90ICovCi0JdmFsIHw9IFZQRV9EU19TUkNfREVJX1NDQUxFUjsKKwkvKgorCSAqIHRoZSBzb3VyY2Ugb2YgQ0hSX0RTIGFuZCBDU0MgaXMgYWx3YXlzIHRoZSBzY2FsZXIsIGlycmVzcGVjdGl2ZSBvZgorCSAqIHdoZXRoZXIgaXQncyB1c2VkIG9yIG5vdAorCSAqLworCXZhbCB8PSBWUEVfRFNfU1JDX0RFSV9TQ0FMRVIgfCBWUEVfQ1NDX1NSQ19ERUlfU0NBTEVSOwogCiAJaWYgKGZtdC0+Zm91cmNjICE9IFY0TDJfUElYX0ZNVF9OVjEyKQogCQl2YWwgfD0gVlBFX0RTX0JZUEFTUzsKQEAgLTc0MiwyOCArNzk2LDYgQEAKIAljdHgtPmxvYWRfbW1ycyA9IHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9jc2NfY29lZmZfYnlwYXNzKHN0cnVjdCB2cGVfY3R4ICpjdHgpCi17Ci0Jc3RydWN0IHZwZV9tbXJfYWRiICptbXJfYWRiID0gY3R4LT5tbXJfYWRiLmFkZHI7Ci0JdTMyICpzaGFkb3dfY3NjX3JlZzUgPSAmbW1yX2FkYi0+Y3NjX3JlZ3NbNV07Ci0KLQkqc2hhZG93X2NzY19yZWc1IHw9IFZQRV9DU0NfQllQQVNTOwotCi0JY3R4LT5sb2FkX21tcnMgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfc2NfcmVnc19ieXBhc3Moc3RydWN0IHZwZV9jdHggKmN0eCkKLXsKLQlzdHJ1Y3QgdnBlX21tcl9hZGIgKm1tcl9hZGIgPSBjdHgtPm1tcl9hZGIuYWRkcjsKLQl1MzIgKnNjX3JlZzAgPSAmbW1yX2FkYi0+c2NfcmVnc1swXTsKLQl1MzIgdmFsID0gMDsKLQotCXZhbCB8PSBWUEVfU0NfQllQQVNTOwotCSpzY19yZWcwID0gdmFsOwotCi0JY3R4LT5sb2FkX21tcnMgPSB0cnVlOwotfQotCiAvKgogICogU2V0IHRoZSBzaGFkb3cgcmVnaXN0ZXJzIHdob3NlIHZhbHVlcyBhcmUgbW9kaWZpZWQgd2hlbiBlaXRoZXIgdGhlCiAgKiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gZm9ybWF0IGlzIGNoYW5nZWQuCkBAIC03NzIsNiArODA0LDExIEBACiB7CiAJc3RydWN0IHZwZV9xX2RhdGEgKnNfcV9kYXRhID0gICZjdHgtPnFfZGF0YVtRX0RBVEFfU1JDXTsKIAlzdHJ1Y3QgdnBlX3FfZGF0YSAqZF9xX2RhdGEgPSAgJmN0eC0+cV9kYXRhW1FfREFUQV9EU1RdOworCXN0cnVjdCB2cGVfbW1yX2FkYiAqbW1yX2FkYiA9IGN0eC0+bW1yX2FkYi5hZGRyOworCXVuc2lnbmVkIGludCBzcmNfdyA9IHNfcV9kYXRhLT5jX3JlY3Qud2lkdGg7CisJdW5zaWduZWQgaW50IHNyY19oID0gc19xX2RhdGEtPmNfcmVjdC5oZWlnaHQ7CisJdW5zaWduZWQgaW50IGRzdF93ID0gZF9xX2RhdGEtPmNfcmVjdC53aWR0aDsKKwl1bnNpZ25lZCBpbnQgZHN0X2ggPSBkX3FfZGF0YS0+Y19yZWN0LmhlaWdodDsKIAlzaXplX3QgbXZfYnVmX3NpemU7CiAJaW50IHJldDsKIApAQCAtNzgwLDEyICs4MTcsMjMgQEAKIAogCWlmICgoc19xX2RhdGEtPmZsYWdzICYgUV9EQVRBX0lOVEVSTEFDRUQpICYmCiAJCQkhKGRfcV9kYXRhLT5mbGFncyAmIFFfREFUQV9JTlRFUkxBQ0VEKSkgeworCQlpbnQgYnl0ZXNfcGVyX2xpbmU7CiAJCWNvbnN0IHN0cnVjdCB2cGRtYV9kYXRhX2Zvcm1hdCAqbXYgPQogCQkJJnZwZG1hX21pc2NfZm10c1tWUERNQV9EQVRBX0ZNVF9NVl07CiAKKwkJLyoKKwkJICogd2UgbWFrZSBzdXJlIHRoYXQgdGhlIHNvdXJjZSBpbWFnZSBoYXMgYSAxNiBieXRlIGFsaWduZWQKKwkJICogc3RyaWRlLCB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIGZvciB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIKKwkJICogYnkgYWxpZ25pbmcgaXQncyBzdHJpZGUgdG8gdGhlIG5leHQgMTYgYnl0ZSBib3VuZHJ5LiB0aGlzCisJCSAqIGV4dHJhIHNwYWNlIHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlIGRlLWludGVybGFjZXIsIGJ1dCB3aWxsCisJCSAqIGVuc3VyZSB0aGF0IHZwZG1hIG9wZXJhdGVzIGNvcnJlY3RseQorCQkgKi8KKwkJYnl0ZXNfcGVyX2xpbmUgPSBBTElHTigoc19xX2RhdGEtPndpZHRoICogbXYtPmRlcHRoKSA+PiAzLAorCQkJCQlWUERNQV9TVFJJREVfQUxJR04pOworCQltdl9idWZfc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogc19xX2RhdGEtPmhlaWdodDsKKwogCQljdHgtPmRlaW50ZXJsYWNpbmcgPSAxOwotCQltdl9idWZfc2l6ZSA9Ci0JCQkoc19xX2RhdGEtPndpZHRoICogc19xX2RhdGEtPmhlaWdodCAqIG12LT5kZXB0aCkgPj4gMzsKKwkJc3JjX2ggPDw9IDE7CiAJfSBlbHNlIHsKIAkJY3R4LT5kZWludGVybGFjaW5nID0gMDsKIAkJbXZfYnVmX3NpemUgPSAwOwpAQCAtNzk5LDggKzg0NywxNiBAQAogCiAJc2V0X2NmZ19hbmRfbGluZV9tb2RlcyhjdHgpOwogCXNldF9kZWlfcmVncyhjdHgpOwotCXNldF9jc2NfY29lZmZfYnlwYXNzKGN0eCk7Ci0Jc2V0X3NjX3JlZ3NfYnlwYXNzKGN0eCk7CisKKwljc2Nfc2V0X2NvZWZmKGN0eC0+ZGV2LT5jc2MsICZtbXJfYWRiLT5jc2NfcmVnc1swXSwKKwkJc19xX2RhdGEtPmNvbG9yc3BhY2UsIGRfcV9kYXRhLT5jb2xvcnNwYWNlKTsKKworCXNjX3NldF9oc19jb2VmZnMoY3R4LT5kZXYtPnNjLCBjdHgtPnNjX2NvZWZmX2guYWRkciwgc3JjX3csIGRzdF93KTsKKwlzY19zZXRfdnNfY29lZmZzKGN0eC0+ZGV2LT5zYywgY3R4LT5zY19jb2VmZl92LmFkZHIsIHNyY19oLCBkc3RfaCk7CisKKwlzY19jb25maWdfc2NhbGVyKGN0eC0+ZGV2LT5zYywgJm1tcl9hZGItPnNjX3JlZ3MwWzBdLAorCQkmbW1yX2FkYi0+c2NfcmVnczhbMF0sICZtbXJfYWRiLT5zY19yZWdzMTdbMF0sCisJCXNyY193LCBzcmNfaCwgZHN0X3csIGRzdF9oKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTE2LDM1ICs5NzIsMTAgQEAKIAlEVU1QUkVHKERFSV9GTURfU1RBVFVTX1IwKTsKIAlEVU1QUkVHKERFSV9GTURfU1RBVFVTX1IxKTsKIAlEVU1QUkVHKERFSV9GTURfU1RBVFVTX1IyKTsKLQlEVU1QUkVHKFNDX01QX1NDMCk7Ci0JRFVNUFJFRyhTQ19NUF9TQzEpOwotCURVTVBSRUcoU0NfTVBfU0MyKTsKLQlEVU1QUkVHKFNDX01QX1NDMyk7Ci0JRFVNUFJFRyhTQ19NUF9TQzQpOwotCURVTVBSRUcoU0NfTVBfU0M1KTsKLQlEVU1QUkVHKFNDX01QX1NDNik7Ci0JRFVNUFJFRyhTQ19NUF9TQzgpOwotCURVTVBSRUcoU0NfTVBfU0M5KTsKLQlEVU1QUkVHKFNDX01QX1NDMTApOwotCURVTVBSRUcoU0NfTVBfU0MxMSk7Ci0JRFVNUFJFRyhTQ19NUF9TQzEyKTsKLQlEVU1QUkVHKFNDX01QX1NDMTMpOwotCURVTVBSRUcoU0NfTVBfU0MxNyk7Ci0JRFVNUFJFRyhTQ19NUF9TQzE4KTsKLQlEVU1QUkVHKFNDX01QX1NDMTkpOwotCURVTVBSRUcoU0NfTVBfU0MyMCk7Ci0JRFVNUFJFRyhTQ19NUF9TQzIxKTsKLQlEVU1QUkVHKFNDX01QX1NDMjIpOwotCURVTVBSRUcoU0NfTVBfU0MyMyk7Ci0JRFVNUFJFRyhTQ19NUF9TQzI0KTsKLQlEVU1QUkVHKFNDX01QX1NDMjUpOwotCURVTVBSRUcoQ1NDX0NTQzAwKTsKLQlEVU1QUkVHKENTQ19DU0MwMSk7Ci0JRFVNUFJFRyhDU0NfQ1NDMDIpOwotCURVTVBSRUcoQ1NDX0NTQzAzKTsKLQlEVU1QUkVHKENTQ19DU0MwNCk7Ci0JRFVNUFJFRyhDU0NfQ1NDMDUpOwogI3VuZGVmIERVTVBSRUcKKworCXNjX2R1bXBfcmVncyhkZXYtPnNjKTsKKwljc2NfZHVtcF9yZWdzKGRldi0+Y3NjKTsKIH0KIAogc3RhdGljIHZvaWQgYWRkX291dF9kdGQoc3RydWN0IHZwZV9jdHggKmN0eCwgaW50IHBvcnQpCkBAIC0xMDUzLDYgKzEwODQsNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX3J1bih2b2lkICpwcml2KQogewogCXN0cnVjdCB2cGVfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBzY19kYXRhICpzYyA9IGN0eC0+ZGV2LT5zYzsKIAlzdHJ1Y3QgdnBlX3FfZGF0YSAqZF9xX2RhdGEgPSAmY3R4LT5xX2RhdGFbUV9EQVRBX0RTVF07CiAKIAlpZiAoY3R4LT5kZWludGVybGFjaW5nICYmIGN0eC0+c3JjX3Zic1syXSA9PSBOVUxMKSB7CkBAIC0xMDc1LDEzICsxMTA3LDM3IEBACiAJCWN0eC0+bG9hZF9tbXJzID0gZmFsc2U7CiAJfQogCisJaWYgKHNjLT5sb2FkZWRfY29lZmZfaCAhPSBjdHgtPnNjX2NvZWZmX2guZG1hX2FkZHIgfHwKKwkJCXNjLT5sb2FkX2NvZWZmX2gpIHsKKwkJdnBkbWFfbWFwX2Rlc2NfYnVmKGN0eC0+ZGV2LT52cGRtYSwgJmN0eC0+c2NfY29lZmZfaCk7CisJCXZwZG1hX2FkZF9jZmRfYmxvY2soJmN0eC0+ZGVzY19saXN0LCBDRkRfU0NfQ0xJRU5ULAorCQkJJmN0eC0+c2NfY29lZmZfaCwgMCk7CisKKwkJc2MtPmxvYWRlZF9jb2VmZl9oID0gY3R4LT5zY19jb2VmZl9oLmRtYV9hZGRyOworCQlzYy0+bG9hZF9jb2VmZl9oID0gZmFsc2U7CisJfQorCisJaWYgKHNjLT5sb2FkZWRfY29lZmZfdiAhPSBjdHgtPnNjX2NvZWZmX3YuZG1hX2FkZHIgfHwKKwkJCXNjLT5sb2FkX2NvZWZmX3YpIHsKKwkJdnBkbWFfbWFwX2Rlc2NfYnVmKGN0eC0+ZGV2LT52cGRtYSwgJmN0eC0+c2NfY29lZmZfdik7CisJCXZwZG1hX2FkZF9jZmRfYmxvY2soJmN0eC0+ZGVzY19saXN0LCBDRkRfU0NfQ0xJRU5ULAorCQkJJmN0eC0+c2NfY29lZmZfdiwgU0NfQ09FRl9TUkFNX1NJWkUgPj4gNCk7CisKKwkJc2MtPmxvYWRlZF9jb2VmZl92ID0gY3R4LT5zY19jb2VmZl92LmRtYV9hZGRyOworCQlzYy0+bG9hZF9jb2VmZl92ID0gZmFsc2U7CisJfQorCiAJLyogb3V0cHV0IGRhdGEgZGVzY3JpcHRvcnMgKi8KIAlpZiAoY3R4LT5kZWludGVybGFjaW5nKQogCQlhZGRfb3V0X2R0ZChjdHgsIFZQRV9QT1JUX01WX09VVCk7CiAKLQlhZGRfb3V0X2R0ZChjdHgsIFZQRV9QT1JUX0xVTUFfT1VUKTsKLQlpZiAoZF9xX2RhdGEtPmZtdC0+Y29wbGFuYXIpCi0JCWFkZF9vdXRfZHRkKGN0eCwgVlBFX1BPUlRfQ0hST01BX09VVCk7CisJaWYgKGRfcV9kYXRhLT5jb2xvcnNwYWNlID09IFY0TDJfQ09MT1JTUEFDRV9TUkdCKSB7CisJCWFkZF9vdXRfZHRkKGN0eCwgVlBFX1BPUlRfUkdCX09VVCk7CisJfSBlbHNlIHsKKwkJYWRkX291dF9kdGQoY3R4LCBWUEVfUE9SVF9MVU1BX09VVCk7CisJCWlmIChkX3FfZGF0YS0+Zm10LT5jb3BsYW5hcikKKwkJCWFkZF9vdXRfZHRkKGN0eCwgVlBFX1BPUlRfQ0hST01BX09VVCk7CisJfQogCiAJLyogaW5wdXQgZGF0YSBkZXNjcmlwdG9ycyAqLwogCWlmIChjdHgtPmRlaW50ZXJsYWNpbmcpIHsKQEAgLTExMTcsOSArMTE3MywxNiBAQAogCX0KIAogCS8qIHN5bmMgb24gY2hhbm5lbCBjb250cm9sIGRlc2NyaXB0b3JzIGZvciBvdXRwdXQgcG9ydHMgKi8KLQl2cGRtYV9hZGRfc3luY19vbl9jaGFubmVsX2N0ZCgmY3R4LT5kZXNjX2xpc3QsIFZQRV9DSEFOX0xVTUFfT1VUKTsKLQlpZiAoZF9xX2RhdGEtPmZtdC0+Y29wbGFuYXIpCi0JCXZwZG1hX2FkZF9zeW5jX29uX2NoYW5uZWxfY3RkKCZjdHgtPmRlc2NfbGlzdCwgVlBFX0NIQU5fQ0hST01BX09VVCk7CisJaWYgKGRfcV9kYXRhLT5jb2xvcnNwYWNlID09IFY0TDJfQ09MT1JTUEFDRV9TUkdCKSB7CisJCXZwZG1hX2FkZF9zeW5jX29uX2NoYW5uZWxfY3RkKCZjdHgtPmRlc2NfbGlzdCwKKwkJCVZQRV9DSEFOX1JHQl9PVVQpOworCX0gZWxzZSB7CisJCXZwZG1hX2FkZF9zeW5jX29uX2NoYW5uZWxfY3RkKCZjdHgtPmRlc2NfbGlzdCwKKwkJCVZQRV9DSEFOX0xVTUFfT1VUKTsKKwkJaWYgKGRfcV9kYXRhLT5mbXQtPmNvcGxhbmFyKQorCQkJdnBkbWFfYWRkX3N5bmNfb25fY2hhbm5lbF9jdGQoJmN0eC0+ZGVzY19saXN0LAorCQkJCVZQRV9DSEFOX0NIUk9NQV9PVVQpOworCX0KIAogCWlmIChjdHgtPmRlaW50ZXJsYWNpbmcpCiAJCXZwZG1hX2FkZF9zeW5jX29uX2NoYW5uZWxfY3RkKCZjdHgtPmRlc2NfbGlzdCwgVlBFX0NIQU5fTVZfT1VUKTsKQEAgLTExOTgsNiArMTI2MSw4IEBACiAKIAl2cGRtYV91bm1hcF9kZXNjX2J1ZihkZXYtPnZwZG1hLCAmY3R4LT5kZXNjX2xpc3QuYnVmKTsKIAl2cGRtYV91bm1hcF9kZXNjX2J1ZihkZXYtPnZwZG1hLCAmY3R4LT5tbXJfYWRiKTsKKwl2cGRtYV91bm1hcF9kZXNjX2J1ZihkZXYtPnZwZG1hLCAmY3R4LT5zY19jb2VmZl9oKTsKKwl2cGRtYV91bm1hcF9kZXNjX2J1ZihkZXYtPnZwZG1hLCAmY3R4LT5zY19jb2VmZl92KTsKIAogCXZwZG1hX3Jlc2V0X2Rlc2NfbGlzdCgmY3R4LT5kZXNjX2xpc3QpOwogCkBAIC0xMzUyLDcgKzE0MTcsOCBAQAogewogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXggPSAmZi0+Zm10LnBpeF9tcDsKIAlzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0ICpwbGFuZV9mbXQ7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IHdfYWxpZ247CisJaW50IGksIGRlcHRoLCBkZXB0aF9ieXRlczsKIAogCWlmICghZm10IHx8ICEoZm10LT50eXBlcyAmIHR5cGUpKSB7CiAJCXZwZV9lcnIoY3R4LT5kZXYsICJGb3VyY2MgZm9ybWF0ICgweCUwOHgpIGludmFsaWQuXG4iLApAQCAtMTM2MywzNSArMTQyOSw1NyBAQAogCWlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSAmJiBwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfQUxURVJOQVRFKQogCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwogCi0JdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCBNSU5fVywgTUFYX1csIFdfQUxJR04sCisJZGVwdGggPSBmbXQtPnZwZG1hX2ZtdFtWUEVfTFVNQV0tPmRlcHRoOworCisJLyoKKwkgKiB0aGUgbGluZSBzdHJpZGUgc2hvdWxkIDE2IGJ5dGUgYWxpZ25lZCBmb3IgVlBETUEgdG8gd29yaywgYmFzZWQgb24KKwkgKiB0aGUgYnl0ZXMgcGVyIHBpeGVsLCBmaWd1cmUgb3V0IGhvdyBtdWNoIHRoZSB3aWR0aCBzaG91bGQgYmUgYWxpZ25lZAorCSAqIHRvIG1ha2Ugc3VyZSBsaW5lIHN0cmlkZSBpcyAxNiBieXRlIGFsaWduZWQKKwkgKi8KKwlkZXB0aF9ieXRlcyA9IGRlcHRoID4+IDM7CisKKwlpZiAoZGVwdGhfYnl0ZXMgPT0gMykKKwkJLyoKKwkJICogaWYgYnBwIGlzIDMoYXMgaW4gc29tZSBSR0IgZm9ybWF0cyksIHRoZSBwaXhlbCB3aWR0aCBkb2Vzbid0CisJCSAqIHJlYWxseSBoZWxwIGluIGVuc3VyaW5nIGxpbmUgc3RyaWRlIGlzIDE2IGJ5dGUgYWxpZ25lZAorCQkgKi8KKwkJd19hbGlnbiA9IDQ7CisJZWxzZQorCQkvKgorCQkgKiBmb3IgdGhlIHJlbWFpbmRlciBicHAoNCwgMiBhbmQgMSksIHRoZSBwaXhlbCB3aWR0aCBhbGlnbm1lbnQKKwkJICogY2FuIGVuc3VyZSBhIGxpbmUgc3RyaWRlIGFsaWdubWVudCBvZiAxNiBieXRlcy4gRm9yIGV4YW1wbGUsCisJCSAqIGlmIGJwcCBpcyAyLCB0aGVuIHRoZSBsaW5lIHN0cmlkZSBjYW4gYmUgMTYgYnl0ZSBhbGlnbmVkIGlmCisJCSAqIHRoZSB3aWR0aCBpcyA4IGJ5dGUgYWxpZ25lZAorCQkgKi8KKwkJd19hbGlnbiA9IG9yZGVyX2Jhc2VfMihWUERNQV9ERVNDX0FMSUdOIC8gZGVwdGhfYnl0ZXMpOworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCBNSU5fVywgTUFYX1csIHdfYWxpZ24sCiAJCQkgICAgICAmcGl4LT5oZWlnaHQsIE1JTl9ILCBNQVhfSCwgSF9BTElHTiwKIAkJCSAgICAgIFNfQUxJR04pOwogCiAJcGl4LT5udW1fcGxhbmVzID0gZm10LT5jb3BsYW5hciA/IDIgOiAxOwogCXBpeC0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKIAotCWlmICh0eXBlID09IFZQRV9GTVRfVFlQRV9DQVBUVVJFKSB7Ci0JCXN0cnVjdCB2cGVfcV9kYXRhICpzX3FfZGF0YTsKLQotCQkvKiBnZXQgY29sb3JzcGFjZSBmcm9tIHRoZSBzb3VyY2UgcXVldWUgKi8KLQkJc19xX2RhdGEgPSBnZXRfcV9kYXRhKGN0eCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKTsKLQotCQlwaXgtPmNvbG9yc3BhY2UgPSBzX3FfZGF0YS0+Y29sb3JzcGFjZTsKLQl9IGVsc2UgewotCQlpZiAoIXBpeC0+Y29sb3JzcGFjZSkKLQkJCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME07CisJaWYgKCFwaXgtPmNvbG9yc3BhY2UpIHsKKwkJaWYgKGZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9SR0IyNCB8fAorCQkJCWZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9CR1IyNCB8fAorCQkJCWZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9SR0IzMiB8fAorCQkJCWZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9CR1IzMikgeworCQkJcGl4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisJCX0gZWxzZSB7CisJCQlpZiAocGl4LT5oZWlnaHQgPiAxMjgwKQkvKiBIRCAqLworCQkJCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDk7CisJCQllbHNlCQkJLyogU0QgKi8KKwkJCQlwaXgtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHBpeC0+bnVtX3BsYW5lczsgaSsrKSB7Ci0JCWludCBkZXB0aDsKLQogCQlwbGFuZV9mbXQgPSAmcGl4LT5wbGFuZV9mbXRbaV07CiAJCWRlcHRoID0gZm10LT52cGRtYV9mbXRbaV0tPmRlcHRoOwogCiAJCWlmIChpID09IFZQRV9MVU1BKQotCQkJcGxhbmVfZm10LT5ieXRlc3BlcmxpbmUgPQotCQkJCQlyb3VuZF91cCgocGl4LT53aWR0aCAqIGRlcHRoKSA+PiAzLAotCQkJCQkJMSA8PCBMX0FMSUdOKTsKKwkJCXBsYW5lX2ZtdC0+Ynl0ZXNwZXJsaW5lID0gKHBpeC0+d2lkdGggKiBkZXB0aCkgPj4gMzsKIAkJZWxzZQogCQkJcGxhbmVfZm10LT5ieXRlc3BlcmxpbmUgPSBwaXgtPndpZHRoOwogCkBAIC0xNzQ5LDYgKzE4MzcsMTQgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZnJlZV9kZXNjX2xpc3Q7CiAKKwlyZXQgPSB2cGRtYV9hbGxvY19kZXNjX2J1ZigmY3R4LT5zY19jb2VmZl9oLCBTQ19DT0VGX1NSQU1fU0laRSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfbW1yX2FkYjsKKworCXJldCA9IHZwZG1hX2FsbG9jX2Rlc2NfYnVmKCZjdHgtPnNjX2NvZWZmX3YsIFNDX0NPRUZfU1JBTV9TSVpFKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZnJlZV9zY19oOworCiAJaW5pdF9hZGJfaGRycyhjdHgpOwogCiAJdjRsMl9maF9pbml0KCZjdHgtPmZoLCB2aWRlb19kZXZkYXRhKGZpbGUpKTsKQEAgLTE3NzAsNyArMTg2Niw3IEBACiAJc19xX2RhdGEtPmhlaWdodCA9IDEwODA7CiAJc19xX2RhdGEtPnNpemVpbWFnZVtWUEVfTFVNQV0gPSAoc19xX2RhdGEtPndpZHRoICogc19xX2RhdGEtPmhlaWdodCAqCiAJCQlzX3FfZGF0YS0+Zm10LT52cGRtYV9mbXRbVlBFX0xVTUFdLT5kZXB0aCkgPj4gMzsKLQlzX3FfZGF0YS0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME07CisJc19xX2RhdGEtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOwogCXNfcV9kYXRhLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAlzX3FfZGF0YS0+Y19yZWN0LmxlZnQgPSAwOwogCXNfcV9kYXRhLT5jX3JlY3QudG9wID0gMDsKQEAgLTE4MTcsNiArMTkxMywxMCBAQAogZXhpdF9maDoKIAl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKGhkbCk7CiAJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKKwl2cGRtYV9mcmVlX2Rlc2NfYnVmKCZjdHgtPnNjX2NvZWZmX3YpOworZnJlZV9zY19oOgorCXZwZG1hX2ZyZWVfZGVzY19idWYoJmN0eC0+c2NfY29lZmZfaCk7CitmcmVlX21tcl9hZGI6CiAJdnBkbWFfZnJlZV9kZXNjX2J1ZigmY3R4LT5tbXJfYWRiKTsKIGZyZWVfZGVzY19saXN0OgogCXZwZG1hX2ZyZWVfZGVzY19saXN0KCZjdHgtPmRlc2NfbGlzdCk7CkBAIC0xOTM4LDEyICsyMDM4LDExIEBACiB7CiAJc3RydWN0IHZwZV9kZXYgKmRldjsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxLCBmdW5jOwogCiAJZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKElTX0VSUihkZXYpKQotCQlyZXR1cm4gUFRSX0VSUihkZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwogCkBAIC0xOTU0LDE2ICsyMDUzLDE3IEBACiAJYXRvbWljX3NldCgmZGV2LT5udW1faW5zdGFuY2VzLCAwKTsKIAltdXRleF9pbml0KCZkZXYtPmRldl9tdXRleCk7CiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAidnBlX3RvcCIpOworCWRldi0+cmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCSJ2cGVfdG9wIik7CiAJLyoKIAkgKiBIQUNLOiB3ZSBnZXQgcmVzb3VyY2UgaW5mbyBmcm9tIGRldmljZSB0cmVlIGluIHRoZSBmb3JtIG9mIGEgbGlzdCBvZgogCSAqIFZQRSBzdWIgYmxvY2tzLCB0aGUgZHJpdmVyIGN1cnJlbnRseSB1c2VzIG9ubHkgdGhlIGJhc2Ugb2YgdnBlX3RvcAogCSAqIGZvciByZWdpc3RlciBhY2Nlc3MsIHRoZSBkcml2ZXIgc2hvdWxkIGJlIGNoYW5nZWQgbGF0ZXIgdG8gYWNjZXNzCiAJICogcmVnaXN0ZXJzIGJhc2VkIG9uIHRoZSBzdWIgYmxvY2sgYmFzZSBhZGRyZXNzZXMKIAkgKi8KLQlkZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgU1pfMzJLKTsKLQlpZiAoSVNfRVJSKGRldi0+YmFzZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihkZXYtPmJhc2UpOworCWRldi0+YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBkZXYtPnJlcy0+c3RhcnQsIFNaXzMySyk7CisJaWYgKCFkZXYtPmJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byB2NGwyX2Rldl91bnJlZzsKIAl9CiAKQEAgLTIwMDYsOSArMjEwNiwyMyBAQAogCiAJdnBlX3RvcF92cGRtYV9yZXNldChkZXYpOwogCi0JZGV2LT52cGRtYSA9IHZwZG1hX2NyZWF0ZShwZGV2KTsKLQlpZiAoSVNfRVJSKGRldi0+dnBkbWEpKQorCWRldi0+c2MgPSBzY19jcmVhdGUocGRldik7CisJaWYgKElTX0VSUihkZXYtPnNjKSkgeworCQlyZXQgPSBQVFJfRVJSKGRldi0+c2MpOwogCQlnb3RvIHJ1bnRpbWVfcHV0OworCX0KKworCWRldi0+Y3NjID0gY3NjX2NyZWF0ZShwZGV2KTsKKwlpZiAoSVNfRVJSKGRldi0+Y3NjKSkgeworCQlyZXQgPSBQVFJfRVJSKGRldi0+Y3NjKTsKKwkJZ290byBydW50aW1lX3B1dDsKKwl9CisKKwlkZXYtPnZwZG1hID0gdnBkbWFfY3JlYXRlKHBkZXYpOworCWlmIChJU19FUlIoZGV2LT52cGRtYSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkZXYtPnZwZG1hKTsKKwkJZ290byBydW50aW1lX3B1dDsKKwl9CiAKIAl2ZmQgPSAmZGV2LT52ZmQ7CiAJKnZmZCA9IHZwZV92aWRlb2RldjsKQEAgLTIwODEsMTggKzIxOTUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdnBlX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdnBlX3BkcnYpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB2cGVfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZwZV9wZHJ2KTsKLX0KLQotbW9kdWxlX2luaXQodnBlX2luaXQpOwotbW9kdWxlX2V4aXQodnBlX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih2cGVfcGRydik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgVlBFIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiRGFsZSBGYXJuc3dvcnRoLCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZV9yZWdzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3RpLXZwZS92cGVfcmVncy5oCmluZGV4IGVkMjE0ZTguLjc0MjgzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdGktdnBlL3ZwZV9yZWdzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS90aS12cGUvdnBlX3JlZ3MuaApAQCAtMzA2LDE5MSArMzA2LDQgQEAKICNkZWZpbmUgVlBFX0ZNRF9GUkFNRV9ESUZGX01BU0sJCTB4MDAwZmZmZmYKICNkZWZpbmUgVlBFX0ZNRF9GUkFNRV9ESUZGX1NISUZUCTAKIAotLyogVlBFIHNjYWxlciByZWdzICovCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzAJCQkweDA3MDAKLSNkZWZpbmUgVlBFX0lOVEVSTEFDRV9PCQkJKDEgPDwgMCkKLSNkZWZpbmUgVlBFX0xJTkVBUgkJCSgxIDw8IDEpCi0jZGVmaW5lIFZQRV9TQ19CWVBBU1MJCQkoMSA8PCAyKQotI2RlZmluZSBWUEVfSU5WVF9GSUQJCQkoMSA8PCAzKQotI2RlZmluZSBWUEVfVVNFX1JBVgkJCSgxIDw8IDQpCi0jZGVmaW5lIFZQRV9FTkFCTEVfRVYJCQkoMSA8PCA1KQotI2RlZmluZSBWUEVfQVVUT19IUwkJCSgxIDw8IDYpCi0jZGVmaW5lIFZQRV9EQ01fMlgJCQkoMSA8PCA3KQotI2RlZmluZSBWUEVfRENNXzRYCQkJKDEgPDwgOCkKLSNkZWZpbmUgVlBFX0hQX0JZUEFTUwkJCSgxIDw8IDkpCi0jZGVmaW5lIFZQRV9JTlRFUkxBQ0VfSQkJCSgxIDw8IDEwKQotI2RlZmluZSBWUEVfRU5BQkxFX1NJTjJfVkVSX0lOVFAJKDEgPDwgMTEpCi0jZGVmaW5lIFZQRV9ZX1BLX0VOCQkJKDEgPDwgMTQpCi0jZGVmaW5lIFZQRV9UUklNCQkJKDEgPDwgMTUpCi0jZGVmaW5lIFZQRV9TRUxGR0VOX0ZJRAkJCSgxIDw8IDE2KQotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzEJCQkweDA3MDQKLSNkZWZpbmUgVlBFX1JPV19BQ0NfSU5DX01BU0sJCTB4MDdmZmZmZmYKLSNkZWZpbmUgVlBFX1JPV19BQ0NfSU5DX1NISUZUCQkwCi0KLSNkZWZpbmUgVlBFX1NDX01QX1NDMgkJCTB4MDcwOAotI2RlZmluZSBWUEVfUk9XX0FDQ19PRkZTRVRfTUFTSwkJMHgwZmZmZmZmZgotI2RlZmluZSBWUEVfUk9XX0FDQ19PRkZTRVRfU0hJRlQJMAotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzMJCQkweDA3MGMKLSNkZWZpbmUgVlBFX1JPV19BQ0NfT0ZGU0VUX0JfTUFTSwkweDBmZmZmZmZmCi0jZGVmaW5lIFZQRV9ST1dfQUNDX09GRlNFVF9CX1NISUZUCTAKLQotI2RlZmluZSBWUEVfU0NfTVBfU0M0CQkJMHgwNzEwCi0jZGVmaW5lIFZQRV9UQVJfSF9NQVNLCQkJMHgwN2ZmCi0jZGVmaW5lIFZQRV9UQVJfSF9TSElGVAkJCTAKLSNkZWZpbmUgVlBFX1RBUl9XX01BU0sJCQkweDA3ZmYKLSNkZWZpbmUgVlBFX1RBUl9XX1NISUZUCQkJMTIKLSNkZWZpbmUgVlBFX0xJTl9BQ0NfSU5DX1VfTUFTSwkJMHgwNwotI2RlZmluZSBWUEVfTElOX0FDQ19JTkNfVV9TSElGVAkJMjQKLSNkZWZpbmUgVlBFX05MSU5fQUNDX0lOSVRfVV9NQVNLCTB4MDcKLSNkZWZpbmUgVlBFX05MSU5fQUNDX0lOSVRfVV9TSElGVAkyOAotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzUJCQkweDA3MTQKLSNkZWZpbmUgVlBFX1NSQ19IX01BU0sJCQkweDA3ZmYKLSNkZWZpbmUgVlBFX1NSQ19IX1NISUZUCQkJMAotI2RlZmluZSBWUEVfU1JDX1dfTUFTSwkJCTB4MDdmZgotI2RlZmluZSBWUEVfU1JDX1dfU0hJRlQJCQkxMgotI2RlZmluZSBWUEVfTkxJTl9BQ0NfSU5DX1VfTUFTSwkJMHgwNwotI2RlZmluZSBWUEVfTkxJTl9BQ0NfSU5DX1VfU0hJRlQJMjQKLQotI2RlZmluZSBWUEVfU0NfTVBfU0M2CQkJMHgwNzE4Ci0jZGVmaW5lIFZQRV9ST1dfQUNDX0lOSVRfUkFWX01BU0sJMHgwM2ZmCi0jZGVmaW5lIFZQRV9ST1dfQUNDX0lOSVRfUkFWX1NISUZUCTAKLSNkZWZpbmUgVlBFX1JPV19BQ0NfSU5JVF9SQVZfQl9NQVNLCTB4MDNmZgotI2RlZmluZSBWUEVfUk9XX0FDQ19JTklUX1JBVl9CX1NISUZUCTEwCi0KLSNkZWZpbmUgVlBFX1NDX01QX1NDOAkJCTB4MDcyMAotI2RlZmluZSBWUEVfTkxJTl9MRUZUX01BU0sJCTB4MDdmZgotI2RlZmluZSBWUEVfTkxJTl9MRUZUX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9OTElOX1JJR0hUX01BU0sJCTB4MDdmZgotI2RlZmluZSBWUEVfTkxJTl9SSUdIVF9TSElGVAkJMTIKLQotI2RlZmluZSBWUEVfU0NfTVBfU0M5CQkJMHgwNzI0Ci0jZGVmaW5lIFZQRV9MSU5fQUNDX0lOQwkJCVZQRV9TQ19NUF9TQzkKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MxMAkJCTB4MDcyOAotI2RlZmluZSBWUEVfTkxJTl9BQ0NfSU5JVAkJVlBFX1NDX01QX1NDMTAKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MxMQkJCTB4MDcyYwotI2RlZmluZSBWUEVfTkxJTl9BQ0NfSU5DCQlWUEVfU0NfTVBfU0MxMQotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzEyCQkJMHgwNzMwCi0jZGVmaW5lIFZQRV9DT0xfQUNDX09GRlNFVF9NQVNLCQkweDAxZmZmZmZmCi0jZGVmaW5lIFZQRV9DT0xfQUNDX09GRlNFVF9TSElGVAkwCi0KLSNkZWZpbmUgVlBFX1NDX01QX1NDMTMJCQkweDA3MzQKLSNkZWZpbmUgVlBFX1NDX0ZBQ1RPUl9SQVZfTUFTSwkJMHgwM2ZmCi0jZGVmaW5lIFZQRV9TQ19GQUNUT1JfUkFWX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9DSFJPTUFfSU5UUF9USFJfTUFTSwkweDAzZmYKLSNkZWZpbmUgVlBFX0NIUk9NQV9JTlRQX1RIUl9TSElGVAkxMgotI2RlZmluZSBWUEVfREVMVEFfQ0hST01BX1RIUl9NQVNLCTB4MGYKLSNkZWZpbmUgVlBFX0RFTFRBX0NIUk9NQV9USFJfU0hJRlQJMjQKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MxNwkJCTB4MDc0NAotI2RlZmluZSBWUEVfRVZfVEhSX01BU0sJCQkweDAzZmYKLSNkZWZpbmUgVlBFX0VWX1RIUl9TSElGVAkJMTIKLSNkZWZpbmUgVlBFX0RFTFRBX0xVTUFfVEhSX01BU0sJCTB4MGYKLSNkZWZpbmUgVlBFX0RFTFRBX0xVTUFfVEhSX1NISUZUCTI0Ci0jZGVmaW5lIFZQRV9ERUxUQV9FVl9USFJfTUFTSwkJMHgwZgotI2RlZmluZSBWUEVfREVMVEFfRVZfVEhSX1NISUZUCQkyOAotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzE4CQkJMHgwNzQ4Ci0jZGVmaW5lIFZQRV9IU19GQUNUT1JfTUFTSwkJMHgwM2ZmCi0jZGVmaW5lIFZQRV9IU19GQUNUT1JfU0hJRlQJCTAKLSNkZWZpbmUgVlBFX0NPTkZfREVGQVVMVF9NQVNLCQkweDAxZmYKLSNkZWZpbmUgVlBFX0NPTkZfREVGQVVMVF9TSElGVAkJMTYKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MxOQkJCTB4MDc0YwotI2RlZmluZSBWUEVfSFBGX0NPRUZGMF9NQVNLCQkweGZmCi0jZGVmaW5lIFZQRV9IUEZfQ09FRkYwX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9IUEZfQ09FRkYxX01BU0sJCTB4ZmYKLSNkZWZpbmUgVlBFX0hQRl9DT0VGRjFfU0hJRlQJCTgKLSNkZWZpbmUgVlBFX0hQRl9DT0VGRjJfTUFTSwkJMHhmZgotI2RlZmluZSBWUEVfSFBGX0NPRUZGMl9TSElGVAkJMTYKLSNkZWZpbmUgVlBFX0hQRl9DT0VGRjNfTUFTSwkJMHhmZgotI2RlZmluZSBWUEVfSFBGX0NPRUZGM19TSElGVAkJMjMKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MyMAkJCTB4MDc1MAotI2RlZmluZSBWUEVfSFBGX0NPRUZGNF9NQVNLCQkweGZmCi0jZGVmaW5lIFZQRV9IUEZfQ09FRkY0X1NISUZUCQkwCi0jZGVmaW5lIFZQRV9IUEZfQ09FRkY1X01BU0sJCTB4ZmYKLSNkZWZpbmUgVlBFX0hQRl9DT0VGRjVfU0hJRlQJCTgKLSNkZWZpbmUgVlBFX0hQRl9OT1JNX1NISUZUX01BU0sJCTB4MDcKLSNkZWZpbmUgVlBFX0hQRl9OT1JNX1NISUZUX1NISUZUCTE2Ci0jZGVmaW5lIFZQRV9OTF9MSU1JVF9NQVNLCQkweDFmZgotI2RlZmluZSBWUEVfTkxfTElNSVRfU0hJRlQJCTIwCi0KLSNkZWZpbmUgVlBFX1NDX01QX1NDMjEJCQkweDA3NTQKLSNkZWZpbmUgVlBFX05MX0xPX1RIUl9NQVNLCQkweDAxZmYKLSNkZWZpbmUgVlBFX05MX0xPX1RIUl9TSElGVAkJMAotI2RlZmluZSBWUEVfTkxfTE9fU0xPUEVfTUFTSwkJMHhmZgotI2RlZmluZSBWUEVfTkxfTE9fU0xPUEVfU0hJRlQJCTE2Ci0KLSNkZWZpbmUgVlBFX1NDX01QX1NDMjIJCQkweDA3NTgKLSNkZWZpbmUgVlBFX05MX0hJX1RIUl9NQVNLCQkweDAxZmYKLSNkZWZpbmUgVlBFX05MX0hJX1RIUl9TSElGVAkJMAotI2RlZmluZSBWUEVfTkxfSElfU0xPUEVfU0hfTUFTSwkJMHgwNwotI2RlZmluZSBWUEVfTkxfSElfU0xPUEVfU0hfU0hJRlQJMTYKLQotI2RlZmluZSBWUEVfU0NfTVBfU0MyMwkJCTB4MDc1YwotI2RlZmluZSBWUEVfR1JBRElFTlRfVEhSX01BU0sJCTB4MDdmZgotI2RlZmluZSBWUEVfR1JBRElFTlRfVEhSX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9HUkFESUVOVF9USFJfUkFOR0VfTUFTSwkweDBmCi0jZGVmaW5lIFZQRV9HUkFESUVOVF9USFJfUkFOR0VfU0hJRlQJMTIKLSNkZWZpbmUgVlBFX01JTl9HWV9USFJfTUFTSwkJMHhmZgotI2RlZmluZSBWUEVfTUlOX0dZX1RIUl9TSElGVAkJMTYKLSNkZWZpbmUgVlBFX01JTl9HWV9USFJfUkFOR0VfTUFTSwkweDBmCi0jZGVmaW5lIFZQRV9NSU5fR1lfVEhSX1JBTkdFX1NISUZUCTI4Ci0KLSNkZWZpbmUgVlBFX1NDX01QX1NDMjQJCQkweDA3NjAKLSNkZWZpbmUgVlBFX09SR19IX01BU0sJCQkweDA3ZmYKLSNkZWZpbmUgVlBFX09SR19IX1NISUZUCQkJMAotI2RlZmluZSBWUEVfT1JHX1dfTUFTSwkJCTB4MDdmZgotI2RlZmluZSBWUEVfT1JHX1dfU0hJRlQJCQkxNgotCi0jZGVmaW5lIFZQRV9TQ19NUF9TQzI1CQkJMHgwNzY0Ci0jZGVmaW5lIFZQRV9PRkZfSF9NQVNLCQkJMHgwN2ZmCi0jZGVmaW5lIFZQRV9PRkZfSF9TSElGVAkJCTAKLSNkZWZpbmUgVlBFX09GRl9XX01BU0sJCQkweDA3ZmYKLSNkZWZpbmUgVlBFX09GRl9XX1NISUZUCQkJMTYKLQotLyogVlBFIGNvbG9yIHNwYWNlIGNvbnZlcnRlciByZWdzICovCi0jZGVmaW5lIFZQRV9DU0NfQ1NDMDAJCQkweDU3MDAKLSNkZWZpbmUgVlBFX0NTQ19BMF9NQVNLCQkJMHgxZmZmCi0jZGVmaW5lIFZQRV9DU0NfQTBfU0hJRlQJCTAKLSNkZWZpbmUgVlBFX0NTQ19CMF9NQVNLCQkJMHgxZmZmCi0jZGVmaW5lIFZQRV9DU0NfQjBfU0hJRlQJCTE2Ci0KLSNkZWZpbmUgVlBFX0NTQ19DU0MwMQkJCTB4NTcwNAotI2RlZmluZSBWUEVfQ1NDX0MwX01BU0sJCQkweDFmZmYKLSNkZWZpbmUgVlBFX0NTQ19DMF9TSElGVAkJMAotI2RlZmluZSBWUEVfQ1NDX0ExX01BU0sJCQkweDFmZmYKLSNkZWZpbmUgVlBFX0NTQ19BMV9TSElGVAkJMTYKLQotI2RlZmluZSBWUEVfQ1NDX0NTQzAyCQkJMHg1NzA4Ci0jZGVmaW5lIFZQRV9DU0NfQjFfTUFTSwkJCTB4MWZmZgotI2RlZmluZSBWUEVfQ1NDX0IxX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9DU0NfQzFfTUFTSwkJCTB4MWZmZgotI2RlZmluZSBWUEVfQ1NDX0MxX1NISUZUCQkxNgotCi0jZGVmaW5lIFZQRV9DU0NfQ1NDMDMJCQkweDU3MGMKLSNkZWZpbmUgVlBFX0NTQ19BMl9NQVNLCQkJMHgxZmZmCi0jZGVmaW5lIFZQRV9DU0NfQTJfU0hJRlQJCTAKLSNkZWZpbmUgVlBFX0NTQ19CMl9NQVNLCQkJMHgxZmZmCi0jZGVmaW5lIFZQRV9DU0NfQjJfU0hJRlQJCTE2Ci0KLSNkZWZpbmUgVlBFX0NTQ19DU0MwNAkJCTB4NTcxMAotI2RlZmluZSBWUEVfQ1NDX0MyX01BU0sJCQkweDFmZmYKLSNkZWZpbmUgVlBFX0NTQ19DMl9TSElGVAkJMAotI2RlZmluZSBWUEVfQ1NDX0QwX01BU0sJCQkweDBmZmYKLSNkZWZpbmUgVlBFX0NTQ19EMF9TSElGVAkJMTYKLQotI2RlZmluZSBWUEVfQ1NDX0NTQzA1CQkJMHg1NzE0Ci0jZGVmaW5lIFZQRV9DU0NfRDFfTUFTSwkJCTB4MGZmZgotI2RlZmluZSBWUEVfQ1NDX0QxX1NISUZUCQkwCi0jZGVmaW5lIFZQRV9DU0NfRDJfTUFTSwkJCTB4MGZmZgotI2RlZmluZSBWUEVfQ1NDX0QyX1NISUZUCQkxNgotI2RlZmluZSBWUEVfQ1NDX0JZUEFTUwkJCSgxIDw8IDI4KQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS9NYWtlZmlsZQppbmRleCA0ZGEyMjYxLi4xNTFjZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL01ha2VmaWxlCkBAIC0xLDUgKzEsNiBAQAogdnNwMS15CQkJCQk6PSB2c3AxX2Rydi5vIHZzcDFfZW50aXR5Lm8gdnNwMV92aWRlby5vCiB2c3AxLXkJCQkJCSs9IHZzcDFfcnBmLm8gdnNwMV9yd3BmLm8gdnNwMV93cGYubwotdnNwMS15CQkJCQkrPSB2c3AxX2xpZi5vIHZzcDFfdWRzLm8KK3ZzcDEteQkJCQkJKz0gdnNwMV9oc2l0Lm8gdnNwMV9saWYubyB2c3AxX2x1dC5vCit2c3AxLXkJCQkJCSs9IHZzcDFfc3J1Lm8gdnNwMV91ZHMubwogCiBvYmotJChDT05GSUdfVklERU9fUkVORVNBU19WU1AxKQkrPSB2c3AxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMS5oCmluZGV4IGQ2YzZlY2QuLjk0ZDFiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDEuaApAQCAtMjgsOCArMjgsMTEgQEAKIHN0cnVjdCBkZXZpY2U7CiAKIHN0cnVjdCB2c3AxX3BsYXRmb3JtX2RhdGE7CitzdHJ1Y3QgdnNwMV9oc2l0Owogc3RydWN0IHZzcDFfbGlmOworc3RydWN0IHZzcDFfbHV0Owogc3RydWN0IHZzcDFfcndwZjsKK3N0cnVjdCB2c3AxX3NydTsKIHN0cnVjdCB2c3AxX3VkczsKIAogI2RlZmluZSBWUFMxX01BWF9SUEYJCTUKQEAgLTQ3LDggKzUwLDEyIEBACiAJc3RydWN0IG11dGV4IGxvY2s7CiAJaW50IHJlZl9jb3VudDsKIAorCXN0cnVjdCB2c3AxX2hzaXQgKmhzaTsKKwlzdHJ1Y3QgdnNwMV9oc2l0ICpoc3Q7CiAJc3RydWN0IHZzcDFfbGlmICpsaWY7CisJc3RydWN0IHZzcDFfbHV0ICpsdXQ7CiAJc3RydWN0IHZzcDFfcndwZiAqcnBmW1ZQUzFfTUFYX1JQRl07CisJc3RydWN0IHZzcDFfc3J1ICpzcnU7CiAJc3RydWN0IHZzcDFfdWRzICp1ZHNbVlBTMV9NQVhfVURTXTsKIAlzdHJ1Y3QgdnNwMV9yd3BmICp3cGZbVlBTMV9NQVhfV1BGXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kcnYuYwppbmRleCBkMTZiZjBmLi4wZGYwYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kcnYuYwpAQCAtMjAsOCArMjAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KIAogI2luY2x1ZGUgInZzcDEuaCIKKyNpbmNsdWRlICJ2c3AxX2hzaXQuaCIKICNpbmNsdWRlICJ2c3AxX2xpZi5oIgorI2luY2x1ZGUgInZzcDFfbHV0LmgiCiAjaW5jbHVkZSAidnNwMV9yd3BmLmgiCisjaW5jbHVkZSAidnNwMV9zcnUuaCIKICNpbmNsdWRlICJ2c3AxX3Vkcy5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTUyLDYgKzE1NSwyMiBAQAogCX0KIAogCS8qIEluc3RhbnRpYXRlIGFsbCB0aGUgZW50aXRpZXMuICovCisJdnNwMS0+aHNpID0gdnNwMV9oc2l0X2NyZWF0ZSh2c3AxLCB0cnVlKTsKKwlpZiAoSVNfRVJSKHZzcDEtPmhzaSkpIHsKKwkJcmV0ID0gUFRSX0VSUih2c3AxLT5oc2kpOworCQlnb3RvIGRvbmU7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmdnNwMS0+aHNpLT5lbnRpdHkubGlzdF9kZXYsICZ2c3AxLT5lbnRpdGllcyk7CisKKwl2c3AxLT5oc3QgPSB2c3AxX2hzaXRfY3JlYXRlKHZzcDEsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHZzcDEtPmhzdCkpIHsKKwkJcmV0ID0gUFRSX0VSUih2c3AxLT5oc3QpOworCQlnb3RvIGRvbmU7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmdnNwMS0+aHN0LT5lbnRpdHkubGlzdF9kZXYsICZ2c3AxLT5lbnRpdGllcyk7CisKIAlpZiAodnNwMS0+cGRhdGEtPmZlYXR1cmVzICYgVlNQMV9IQVNfTElGKSB7CiAJCXZzcDEtPmxpZiA9IHZzcDFfbGlmX2NyZWF0ZSh2c3AxKTsKIAkJaWYgKElTX0VSUih2c3AxLT5saWYpKSB7CkBAIC0xNjIsNiArMTgxLDE2IEBACiAJCWxpc3RfYWRkX3RhaWwoJnZzcDEtPmxpZi0+ZW50aXR5Lmxpc3RfZGV2LCAmdnNwMS0+ZW50aXRpZXMpOwogCX0KIAorCWlmICh2c3AxLT5wZGF0YS0+ZmVhdHVyZXMgJiBWU1AxX0hBU19MVVQpIHsKKwkJdnNwMS0+bHV0ID0gdnNwMV9sdXRfY3JlYXRlKHZzcDEpOworCQlpZiAoSVNfRVJSKHZzcDEtPmx1dCkpIHsKKwkJCXJldCA9IFBUUl9FUlIodnNwMS0+bHV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJnZzcDEtPmx1dC0+ZW50aXR5Lmxpc3RfZGV2LCAmdnNwMS0+ZW50aXRpZXMpOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCB2c3AxLT5wZGF0YS0+cnBmX2NvdW50OyArK2kpIHsKIAkJc3RydWN0IHZzcDFfcndwZiAqcnBmOwogCkBAIC0xNzUsNiArMjA0LDE2IEBACiAJCWxpc3RfYWRkX3RhaWwoJnJwZi0+ZW50aXR5Lmxpc3RfZGV2LCAmdnNwMS0+ZW50aXRpZXMpOwogCX0KIAorCWlmICh2c3AxLT5wZGF0YS0+ZmVhdHVyZXMgJiBWU1AxX0hBU19TUlUpIHsKKwkJdnNwMS0+c3J1ID0gdnNwMV9zcnVfY3JlYXRlKHZzcDEpOworCQlpZiAoSVNfRVJSKHZzcDEtPnNydSkpIHsKKwkJCXJldCA9IFBUUl9FUlIodnNwMS0+c3J1KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJnZzcDEtPnNydS0+ZW50aXR5Lmxpc3RfZGV2LCAmdnNwMS0+ZW50aXRpZXMpOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCB2c3AxLT5wZGF0YS0+dWRzX2NvdW50OyArK2kpIHsKIAkJc3RydWN0IHZzcDFfdWRzICp1ZHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2VudGl0eS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKaW5kZXggOTAyOGY5ZC4uMDIyNmU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIAogI2luY2x1ZGUgPG1lZGlhL21lZGlhLWVudGl0eS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogCiAjaW5jbHVkZSAidnNwMS5oIgpAQCAtMTIyLDEyICsxMjMsMTYgQEAKIAkJdW5zaWduZWQgaW50IGlkOwogCQl1bnNpZ25lZCBpbnQgcmVnOwogCX0gcm91dGVzW10gPSB7CisJCXsgVkk2X0RQUl9OT0RFX0hTSSwgVkk2X0RQUl9IU0lfUk9VVEUgfSwKKwkJeyBWSTZfRFBSX05PREVfSFNULCBWSTZfRFBSX0hTVF9ST1VURSB9LAogCQl7IFZJNl9EUFJfTk9ERV9MSUYsIDAgfSwKKwkJeyBWSTZfRFBSX05PREVfTFVULCBWSTZfRFBSX0xVVF9ST1VURSB9LAogCQl7IFZJNl9EUFJfTk9ERV9SUEYoMCksIFZJNl9EUFJfUlBGX1JPVVRFKDApIH0sCiAJCXsgVkk2X0RQUl9OT0RFX1JQRigxKSwgVkk2X0RQUl9SUEZfUk9VVEUoMSkgfSwKIAkJeyBWSTZfRFBSX05PREVfUlBGKDIpLCBWSTZfRFBSX1JQRl9ST1VURSgyKSB9LAogCQl7IFZJNl9EUFJfTk9ERV9SUEYoMyksIFZJNl9EUFJfUlBGX1JPVVRFKDMpIH0sCiAJCXsgVkk2X0RQUl9OT0RFX1JQRig0KSwgVkk2X0RQUl9SUEZfUk9VVEUoNCkgfSwKKwkJeyBWSTZfRFBSX05PREVfU1JVLCBWSTZfRFBSX1NSVV9ST1VURSB9LAogCQl7IFZJNl9EUFJfTk9ERV9VRFMoMCksIFZJNl9EUFJfVURTX1JPVVRFKDApIH0sCiAJCXsgVkk2X0RQUl9OT0RFX1VEUygxKSwgVkk2X0RQUl9VRFNfUk9VVEUoMSkgfSwKIAkJeyBWSTZfRFBSX05PREVfVURTKDIpLCBWSTZfRFBSX1VEU19ST1VURSgyKSB9LApAQCAtMTc3LDUgKzE4Miw3IEBACiAKIHZvaWQgdnNwMV9lbnRpdHlfZGVzdHJveShzdHJ1Y3QgdnNwMV9lbnRpdHkgKmVudGl0eSkKIHsKKwlpZiAoZW50aXR5LT5zdWJkZXYuY3RybF9oYW5kbGVyKQorCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKGVudGl0eS0+c3ViZGV2LmN0cmxfaGFuZGxlcik7CiAJbWVkaWFfZW50aXR5X2NsZWFudXAoJmVudGl0eS0+c3ViZGV2LmVudGl0eSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHkuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2VudGl0eS5oCmluZGV4IGM0ZmVhYjJjLi5lMTUyNzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHkuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHkuaApAQCAtMjAsOCArMjAsMTIgQEAKIHN0cnVjdCB2c3AxX2RldmljZTsKIAogZW51bSB2c3AxX2VudGl0eV90eXBlIHsKKwlWU1AxX0VOVElUWV9IU0ksCisJVlNQMV9FTlRJVFlfSFNULAogCVZTUDFfRU5USVRZX0xJRiwKKwlWU1AxX0VOVElUWV9MVVQsCiAJVlNQMV9FTlRJVFlfUlBGLAorCVZTUDFfRU5USVRZX1NSVSwKIAlWU1AxX0VOVElUWV9VRFMsCiAJVlNQMV9FTlRJVFlfV1BGLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2hzaXQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2hzaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU0ODUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfaHNpdC5jCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogdnNwMV9oc2l0LmMgIC0tICBSLUNhciBWU1AxIEh1ZSBTYXR1cmF0aW9uIHZhbHVlIChJbnZlcnNlKSBUcmFuc2Zvcm0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVuZXNhcyBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IExhdXJlbnQgUGluY2hhcnQgKGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKKyNpbmNsdWRlICJ2c3AxLmgiCisjaW5jbHVkZSAidnNwMV9oc2l0LmgiCisKKyNkZWZpbmUgSFNJVF9NSU5fU0laRQkJCQk0VQorI2RlZmluZSBIU0lUX01BWF9TSVpFCQkJCTgxOTBVCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXZpY2UgQWNjZXNzCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgdnNwMV9oc2l0X3JlYWQoc3RydWN0IHZzcDFfaHNpdCAqaHNpdCwgdTMyIHJlZykKK3sKKwlyZXR1cm4gdnNwMV9yZWFkKGhzaXQtPmVudGl0eS52c3AxLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnNwMV9oc2l0X3dyaXRlKHN0cnVjdCB2c3AxX2hzaXQgKmhzaXQsIHUzMiByZWcsIHUzMiBkYXRhKQoreworCXZzcDFfd3JpdGUoaHNpdC0+ZW50aXR5LnZzcDEsIHJlZywgZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIFN1YmRldmljZSBDb3JlIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGhzaXRfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBlbmFibGUpCit7CisJc3RydWN0IHZzcDFfaHNpdCAqaHNpdCA9IHRvX2hzaXQoc3ViZGV2KTsKKworCWlmICghZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChoc2l0LT5pbnZlcnNlKQorCQl2c3AxX2hzaXRfd3JpdGUoaHNpdCwgVkk2X0hTSV9DVFJMLCBWSTZfSFNJX0NUUkxfRU4pOworCWVsc2UKKwkJdnNwMV9oc2l0X3dyaXRlKGhzaXQsIFZJNl9IU1RfQ1RSTCwgVkk2X0hTVF9DVFJMX0VOKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBTdWJkZXZpY2UgUGFkIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGhzaXRfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJc3RydWN0IHZzcDFfaHNpdCAqaHNpdCA9IHRvX2hzaXQoc3ViZGV2KTsKKworCWlmIChjb2RlLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChjb2RlLT5wYWQgPT0gSFNJVF9QQURfU0lOSyAmJiAhaHNpdC0+aW52ZXJzZSkgfAorCSAgICAoY29kZS0+cGFkID09IEhTSVRfUEFEX1NPVVJDRSAmJiBoc2l0LT5pbnZlcnNlKSkKKwkJY29kZS0+Y29kZSA9IFY0TDJfTUJVU19GTVRfQVJHQjg4ODhfMVgzMjsKKwllbHNlCisJCWNvZGUtPmNvZGUgPSBWNEwyX01CVVNfRk1UX0FIU1Y4ODg4XzFYMzI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc2l0X2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCXN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9zaXplX2VudW0gKmZzZSkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CisKKwlmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgZnNlLT5wYWQpOworCisJaWYgKGZzZS0+aW5kZXggfHwgZnNlLT5jb2RlICE9IGZvcm1hdC0+Y29kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnNlLT5wYWQgPT0gSFNJVF9QQURfU0lOSykgeworCQlmc2UtPm1pbl93aWR0aCA9IEhTSVRfTUlOX1NJWkU7CisJCWZzZS0+bWF4X3dpZHRoID0gSFNJVF9NQVhfU0laRTsKKwkJZnNlLT5taW5faGVpZ2h0ID0gSFNJVF9NSU5fU0laRTsKKwkJZnNlLT5tYXhfaGVpZ2h0ID0gSFNJVF9NQVhfU0laRTsKKwl9IGVsc2UgeworCQkvKiBUaGUgc2l6ZSBvbiB0aGUgc291cmNlIHBhZCBhcmUgZml4ZWQgYW5kIGFsd2F5cyBpZGVudGljYWwgdG8KKwkJICogdGhlIHNpemUgb24gdGhlIHNpbmsgcGFkLgorCQkgKi8KKwkJZnNlLT5taW5fd2lkdGggPSBmb3JtYXQtPndpZHRoOworCQlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC0+d2lkdGg7CisJCWZzZS0+bWluX2hlaWdodCA9IGZvcm1hdC0+aGVpZ2h0OworCQlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQtPmhlaWdodDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc2l0X2dldF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2c3AxX2hzaXQgKmhzaXQgPSB0b19oc2l0KHN1YmRldik7CisKKwlmbXQtPmZvcm1hdCA9ICp2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmaHNpdC0+ZW50aXR5LCBmaCwgZm10LT5wYWQsCisJCQkJCQkgIGZtdC0+d2hpY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHNpdF9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdnNwMV9oc2l0ICpoc2l0ID0gdG9faHNpdChzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9ybWF0KCZoc2l0LT5lbnRpdHksIGZoLCBmbXQtPnBhZCwKKwkJCQkJICAgIGZtdC0+d2hpY2gpOworCisJaWYgKGZtdC0+cGFkID09IEhTSVRfUEFEX1NPVVJDRSkgeworCQkvKiBUaGUgSFNUIGFuZCBIU0kgb3V0cHV0IGZvcm1hdCBjb2RlIGFuZCByZXNvbHV0aW9uIGNhbid0IGJlCisJCSAqIG1vZGlmaWVkLgorCQkgKi8KKwkJZm10LT5mb3JtYXQgPSAqZm9ybWF0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3JtYXQtPmNvZGUgPSBoc2l0LT5pbnZlcnNlID8gVjRMMl9NQlVTX0ZNVF9BSFNWODg4OF8xWDMyCisJCSAgICAgOiBWNEwyX01CVVNfRk1UX0FSR0I4ODg4XzFYMzI7CisJZm9ybWF0LT53aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC53aWR0aCwKKwkJCQlIU0lUX01JTl9TSVpFLCBIU0lUX01BWF9TSVpFKTsKKwlmb3JtYXQtPmhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC5oZWlnaHQsCisJCQkJIEhTSVRfTUlOX1NJWkUsIEhTSVRfTUFYX1NJWkUpOworCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZm9ybWF0LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisKKwlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7CisKKwkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCB0byB0aGUgc291cmNlIHBhZC4gKi8KKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmaHNpdC0+ZW50aXR5LCBmaCwgSFNJVF9QQURfU09VUkNFLAorCQkJCQkgICAgZm10LT53aGljaCk7CisJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OworCWZvcm1hdC0+Y29kZSA9IGhzaXQtPmludmVyc2UgPyBWNEwyX01CVVNfRk1UX0FSR0I4ODg4XzFYMzIKKwkJICAgICA6IFY0TDJfTUJVU19GTVRfQUhTVjg4ODhfMVgzMjsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBTdWJkZXZpY2UgT3BlcmF0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIGhzaXRfdmlkZW9fb3BzID0geworCS5zX3N0cmVhbSA9IGhzaXRfc19zdHJlYW0sCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgaHNpdF9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IGhzaXRfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IGhzaXRfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gaHNpdF9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gaHNpdF9zZXRfZm9ybWF0LAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaHNpdF9vcHMgPSB7CisJLnZpZGVvCT0gJmhzaXRfdmlkZW9fb3BzLAorCS5wYWQgICAgPSAmaHNpdF9wYWRfb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWxpemF0aW9uIGFuZCBDbGVhbnVwCisgKi8KKworc3RydWN0IHZzcDFfaHNpdCAqdnNwMV9oc2l0X2NyZWF0ZShzdHJ1Y3QgdnNwMV9kZXZpY2UgKnZzcDEsIGJvb2wgaW52ZXJzZSkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldjsKKwlzdHJ1Y3QgdnNwMV9oc2l0ICpoc2l0OworCWludCByZXQ7CisKKwloc2l0ID0gZGV2bV9remFsbG9jKHZzcDEtPmRldiwgc2l6ZW9mKCpoc2l0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhzaXQgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwloc2l0LT5pbnZlcnNlID0gaW52ZXJzZTsKKworCWlmIChpbnZlcnNlKSB7CisJCWhzaXQtPmVudGl0eS50eXBlID0gVlNQMV9FTlRJVFlfSFNJOworCQloc2l0LT5lbnRpdHkuaWQgPSBWSTZfRFBSX05PREVfSFNJOworCX0gZWxzZSB7CisJCWhzaXQtPmVudGl0eS50eXBlID0gVlNQMV9FTlRJVFlfSFNUOworCQloc2l0LT5lbnRpdHkuaWQgPSBWSTZfRFBSX05PREVfSFNUOworCX0KKworCXJldCA9IHZzcDFfZW50aXR5X2luaXQodnNwMSwgJmhzaXQtPmVudGl0eSwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBWNEwyIHN1YmRldi4gKi8KKwlzdWJkZXYgPSAmaHNpdC0+ZW50aXR5LnN1YmRldjsKKwl2NGwyX3N1YmRldl9pbml0KHN1YmRldiwgJmhzaXRfb3BzKTsKKworCXN1YmRldi0+ZW50aXR5Lm9wcyA9ICZ2c3AxX21lZGlhX29wczsKKwlzdWJkZXYtPmludGVybmFsX29wcyA9ICZ2c3AxX3N1YmRldl9pbnRlcm5hbF9vcHM7CisJc25wcmludGYoc3ViZGV2LT5uYW1lLCBzaXplb2Yoc3ViZGV2LT5uYW1lKSwgIiVzICVzIiwKKwkJIGRldl9uYW1lKHZzcDEtPmRldiksIGludmVyc2UgPyAiaHNpIiA6ICJoc3QiKTsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKHN1YmRldiwgaHNpdCk7CisJc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXZzcDFfZW50aXR5X2luaXRfZm9ybWF0cyhzdWJkZXYsIE5VTEwpOworCisJcmV0dXJuIGhzaXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9oc2l0LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9oc2l0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmMWM4NDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfaHNpdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiB2c3AxX2hzaXQuaCAgLS0gIFItQ2FyIFZTUDEgSHVlIFNhdHVyYXRpb24gdmFsdWUgKEludmVyc2UpIFRyYW5zZm9ybQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZW5lc2FzIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogTGF1cmVudCBQaW5jaGFydCAobGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX19WU1AxX0hTSVRfSF9fCisjZGVmaW5lIF9fVlNQMV9IU0lUX0hfXworCisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2luY2x1ZGUgInZzcDFfZW50aXR5LmgiCisKK3N0cnVjdCB2c3AxX2RldmljZTsKKworI2RlZmluZSBIU0lUX1BBRF9TSU5LCQkJCTAKKyNkZWZpbmUgSFNJVF9QQURfU09VUkNFCQkJCTEKKworc3RydWN0IHZzcDFfaHNpdCB7CisJc3RydWN0IHZzcDFfZW50aXR5IGVudGl0eTsKKwlib29sIGludmVyc2U7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2c3AxX2hzaXQgKnRvX2hzaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzdWJkZXYsIHN0cnVjdCB2c3AxX2hzaXQsIGVudGl0eS5zdWJkZXYpOworfQorCitzdHJ1Y3QgdnNwMV9oc2l0ICp2c3AxX2hzaXRfY3JlYXRlKHN0cnVjdCB2c3AxX2RldmljZSAqdnNwMSwgYm9vbCBpbnZlcnNlKTsKKworI2VuZGlmIC8qIF9fVlNQMV9IU0lUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbHV0LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9sdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTlkYzdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbHV0LmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiB2c3AxX2x1dC5jICAtLSAgUi1DYXIgVlNQMSBMb29rLVVwIFRhYmxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0OiBMYXVyZW50IFBpbmNoYXJ0IChsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvdnNwMS5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2luY2x1ZGUgInZzcDEuaCIKKyNpbmNsdWRlICJ2c3AxX2x1dC5oIgorCisjZGVmaW5lIExVVF9NSU5fU0laRQkJCQk0VQorI2RlZmluZSBMVVRfTUFYX1NJWkUJCQkJODE5MFUKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERldmljZSBBY2Nlc3MKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiB2c3AxX2x1dF9yZWFkKHN0cnVjdCB2c3AxX2x1dCAqbHV0LCB1MzIgcmVnKQoreworCXJldHVybiB2c3AxX3JlYWQobHV0LT5lbnRpdHkudnNwMSwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZzcDFfbHV0X3dyaXRlKHN0cnVjdCB2c3AxX2x1dCAqbHV0LCB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwl2c3AxX3dyaXRlKGx1dC0+ZW50aXR5LnZzcDEsIHJlZywgZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIFN1YmRldmljZSBDb3JlIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBsdXRfY29uZmlndXJlKHN0cnVjdCB2c3AxX2x1dCAqbHV0LCBzdHJ1Y3QgdnNwMV9sdXRfY29uZmlnICpjb25maWcpCit7CisJbWVtY3B5X3RvaW8obHV0LT5lbnRpdHkudnNwMS0+bW1pbyArIFZJNl9MVVRfVEFCTEUsIGNvbmZpZy0+bHV0LAorCQkgICAgc2l6ZW9mKGNvbmZpZy0+bHV0KSk7Cit9CisKK3N0YXRpYyBsb25nIGx1dF9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2c3AxX2x1dCAqbHV0ID0gdG9fbHV0KHN1YmRldik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1ZTUDFfTFVUX0NPTkZJRzoKKwkJbHV0X2NvbmZpZ3VyZShsdXQsIGFyZyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIFN1YmRldmljZSBWaWRlbyBPcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCBsdXRfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBlbmFibGUpCit7CisJc3RydWN0IHZzcDFfbHV0ICpsdXQgPSB0b19sdXQoc3ViZGV2KTsKKworCWlmICghZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCXZzcDFfbHV0X3dyaXRlKGx1dCwgVkk2X0xVVF9DVFJMLCBWSTZfTFVUX0NUUkxfRU4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIFN1YmRldmljZSBQYWQgT3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgbHV0X2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvZGVzW10gPSB7CisJCVY0TDJfTUJVU19GTVRfQVJHQjg4ODhfMVgzMiwKKwkJVjRMMl9NQlVTX0ZNVF9BSFNWODg4OF8xWDMyLAorCQlWNEwyX01CVVNfRk1UX0FZVVY4XzFYMzIsCisJfTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CisKKwlpZiAoY29kZS0+cGFkID09IExVVF9QQURfU0lOSykgeworCQlpZiAoY29kZS0+aW5kZXggPj0gQVJSQVlfU0laRShjb2RlcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljb2RlLT5jb2RlID0gY29kZXNbY29kZS0+aW5kZXhdOworCX0gZWxzZSB7CisJCS8qIFRoZSBMVVQgY2FuJ3QgcGVyZm9ybSBmb3JtYXQgY29udmVyc2lvbiwgdGhlIHNpbmsgZm9ybWF0IGlzCisJCSAqIGFsd2F5cyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBmb3JtYXQuCisJCSAqLworCQlpZiAoY29kZS0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgTFVUX1BBRF9TSU5LKTsKKwkJY29kZS0+Y29kZSA9IGZvcm1hdC0+Y29kZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdXRfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBmc2UtPnBhZCk7CisKKwlpZiAoZnNlLT5pbmRleCB8fCBmc2UtPmNvZGUgIT0gZm9ybWF0LT5jb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc2UtPnBhZCA9PSBMVVRfUEFEX1NJTkspIHsKKwkJZnNlLT5taW5fd2lkdGggPSBMVVRfTUlOX1NJWkU7CisJCWZzZS0+bWF4X3dpZHRoID0gTFVUX01BWF9TSVpFOworCQlmc2UtPm1pbl9oZWlnaHQgPSBMVVRfTUlOX1NJWkU7CisJCWZzZS0+bWF4X2hlaWdodCA9IExVVF9NQVhfU0laRTsKKwl9IGVsc2UgeworCQkvKiBUaGUgc2l6ZSBvbiB0aGUgc291cmNlIHBhZCBhcmUgZml4ZWQgYW5kIGFsd2F5cyBpZGVudGljYWwgdG8KKwkJICogdGhlIHNpemUgb24gdGhlIHNpbmsgcGFkLgorCQkgKi8KKwkJZnNlLT5taW5fd2lkdGggPSBmb3JtYXQtPndpZHRoOworCQlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC0+d2lkdGg7CisJCWZzZS0+bWluX2hlaWdodCA9IGZvcm1hdC0+aGVpZ2h0OworCQlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQtPmhlaWdodDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdXRfZ2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2c3AxX2x1dCAqbHV0ID0gdG9fbHV0KHN1YmRldik7CisKKwlmbXQtPmZvcm1hdCA9ICp2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmbHV0LT5lbnRpdHksIGZoLCBmbXQtPnBhZCwKKwkJCQkJCSAgZm10LT53aGljaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdXRfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2c3AxX2x1dCAqbHV0ID0gdG9fbHV0KHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJLyogRGVmYXVsdCB0byBZVVYgaWYgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KKwlpZiAoZm10LT5mb3JtYXQuY29kZSAhPSBWNEwyX01CVVNfRk1UX0FSR0I4ODg4XzFYMzIgJiYKKwkgICAgZm10LT5mb3JtYXQuY29kZSAhPSBWNEwyX01CVVNfRk1UX0FIU1Y4ODg4XzFYMzIgJiYKKwkgICAgZm10LT5mb3JtYXQuY29kZSAhPSBWNEwyX01CVVNfRk1UX0FZVVY4XzFYMzIpCisJCWZtdC0+Zm9ybWF0LmNvZGUgPSBWNEwyX01CVVNfRk1UX0FZVVY4XzFYMzI7CisKKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmbHV0LT5lbnRpdHksIGZoLCBmbXQtPnBhZCwKKwkJCQkJICAgIGZtdC0+d2hpY2gpOworCisJaWYgKGZtdC0+cGFkID09IExVVF9QQURfU09VUkNFKSB7CisJCS8qIFRoZSBMVVQgb3V0cHV0IGZvcm1hdCBjYW4ndCBiZSBtb2RpZmllZC4gKi8KKwkJZm10LT5mb3JtYXQgPSAqZm9ybWF0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3JtYXQtPndpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGZtdC0+Zm9ybWF0LndpZHRoLAorCQkJCUxVVF9NSU5fU0laRSwgTFVUX01BWF9TSVpFKTsKKwlmb3JtYXQtPmhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC5oZWlnaHQsCisJCQkJIExVVF9NSU5fU0laRSwgTFVUX01BWF9TSVpFKTsKKwlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCWZvcm1hdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCisJZm10LT5mb3JtYXQgPSAqZm9ybWF0OworCisJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgdG8gdGhlIHNvdXJjZSBwYWQuICovCisJZm9ybWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3JtYXQoJmx1dC0+ZW50aXR5LCBmaCwgTFVUX1BBRF9TT1VSQ0UsCisJCQkJCSAgICBmbXQtPndoaWNoKTsKKwkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgU3ViZGV2aWNlIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGx1dF9jb3JlX29wcyA9IHsKKwkuaW9jdGwgPSBsdXRfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBsdXRfdmlkZW9fb3BzID0geworCS5zX3N0cmVhbSA9IGx1dF9zX3N0cmVhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBsdXRfcGFkX29wcyA9IHsKKwkuZW51bV9tYnVzX2NvZGUgPSBsdXRfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IGx1dF9lbnVtX2ZyYW1lX3NpemUsCisJLmdldF9mbXQgPSBsdXRfZ2V0X2Zvcm1hdCwKKwkuc2V0X2ZtdCA9IGx1dF9zZXRfZm9ybWF0LAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbHV0X29wcyA9IHsKKwkuY29yZQk9ICZsdXRfY29yZV9vcHMsCisJLnZpZGVvCT0gJmx1dF92aWRlb19vcHMsCisJLnBhZCAgICA9ICZsdXRfcGFkX29wcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbml0aWFsaXphdGlvbiBhbmQgQ2xlYW51cAorICovCisKK3N0cnVjdCB2c3AxX2x1dCAqdnNwMV9sdXRfY3JlYXRlKHN0cnVjdCB2c3AxX2RldmljZSAqdnNwMSkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldjsKKwlzdHJ1Y3QgdnNwMV9sdXQgKmx1dDsKKwlpbnQgcmV0OworCisJbHV0ID0gZGV2bV9remFsbG9jKHZzcDEtPmRldiwgc2l6ZW9mKCpsdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAobHV0ID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbHV0LT5lbnRpdHkudHlwZSA9IFZTUDFfRU5USVRZX0xVVDsKKwlsdXQtPmVudGl0eS5pZCA9IFZJNl9EUFJfTk9ERV9MVVQ7CisKKwlyZXQgPSB2c3AxX2VudGl0eV9pbml0KHZzcDEsICZsdXQtPmVudGl0eSwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBWNEwyIHN1YmRldi4gKi8KKwlzdWJkZXYgPSAmbHV0LT5lbnRpdHkuc3ViZGV2OworCXY0bDJfc3ViZGV2X2luaXQoc3ViZGV2LCAmbHV0X29wcyk7CisKKwlzdWJkZXYtPmVudGl0eS5vcHMgPSAmdnNwMV9tZWRpYV9vcHM7CisJc3ViZGV2LT5pbnRlcm5hbF9vcHMgPSAmdnNwMV9zdWJkZXZfaW50ZXJuYWxfb3BzOworCXNucHJpbnRmKHN1YmRldi0+bmFtZSwgc2l6ZW9mKHN1YmRldi0+bmFtZSksICIlcyBsdXQiLAorCQkgZGV2X25hbWUodnNwMS0+ZGV2KSk7CisJdjRsMl9zZXRfc3ViZGV2ZGF0YShzdWJkZXYsIGx1dCk7CisJc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXZzcDFfZW50aXR5X2luaXRfZm9ybWF0cyhzdWJkZXYsIE5VTEwpOworCisJcmV0dXJuIGx1dDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2x1dC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2x1dC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiB2c3AxX2x1dC5oICAtLSAgUi1DYXIgVlNQMSBMb29rLVVwIFRhYmxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0OiBMYXVyZW50IFBpbmNoYXJ0IChsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfX1ZTUDFfTFVUX0hfXworI2RlZmluZSBfX1ZTUDFfTFVUX0hfXworCisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2luY2x1ZGUgInZzcDFfZW50aXR5LmgiCisKK3N0cnVjdCB2c3AxX2RldmljZTsKKworI2RlZmluZSBMVVRfUEFEX1NJTksJCQkJMAorI2RlZmluZSBMVVRfUEFEX1NPVVJDRQkJCQkxCisKK3N0cnVjdCB2c3AxX2x1dCB7CisJc3RydWN0IHZzcDFfZW50aXR5IGVudGl0eTsKKwl1MzIgbHV0WzI1Nl07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2c3AxX2x1dCAqdG9fbHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2Yoc3ViZGV2LCBzdHJ1Y3QgdnNwMV9sdXQsIGVudGl0eS5zdWJkZXYpOworfQorCitzdHJ1Y3QgdnNwMV9sdXQgKnZzcDFfbHV0X2NyZWF0ZShzdHJ1Y3QgdnNwMV9kZXZpY2UgKnZzcDEpOworCisjZW5kaWYgLyogX19WU1AxX0xVVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JlZ3MuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JlZ3MuaAppbmRleCAxZDMzMDRmLi4yODY1MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yZWdzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcmVncy5oCkBAIC0zMzYsOCArMzM2LDIxIEBACiAgKi8KIAogI2RlZmluZSBWSTZfU1JVX0NUUkwwCQkJMHgyMjAwCisjZGVmaW5lIFZJNl9TUlVfQ1RSTDBfUEFSQU0wX1NISUZUCTE2CisjZGVmaW5lIFZJNl9TUlVfQ1RSTDBfUEFSQU0xX1NISUZUCTgKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMF9NT0RFX1VQU0NBTEUJKDQgPDwgNCkKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMF9QQVJBTTIJCSgxIDw8IDMpCisjZGVmaW5lIFZJNl9TUlVfQ1RSTDBfUEFSQU0zCQkoMSA8PCAyKQorI2RlZmluZSBWSTZfU1JVX0NUUkwwX1BBUkFNNAkJKDEgPDwgMSkKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMF9FTgkJKDEgPDwgMCkKKwogI2RlZmluZSBWSTZfU1JVX0NUUkwxCQkJMHgyMjA0CisjZGVmaW5lIFZJNl9TUlVfQ1RSTDFfUEFSQU01CQkweDdmZgorCiAjZGVmaW5lIFZJNl9TUlVfQ1RSTDIJCQkweDIyMDgKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMl9QQVJBTTZfU0hJRlQJMTYKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMl9QQVJBTTdfU0hJRlQJOAorI2RlZmluZSBWSTZfU1JVX0NUUkwyX1BBUkFNOF9TSElGVAkwCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBVRFMgQ29udHJvbCBSZWdpc3RlcnMKQEAgLTQxMiw2ICs0MjUsNyBAQAogICovCiAKICNkZWZpbmUgVkk2X0xVVF9DVFJMCQkJMHgyODAwCisjZGVmaW5lIFZJNl9MVVRfQ1RSTF9FTgkJCSgxIDw8IDApCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDTFUgQ29udHJvbCBSZWdpc3RlcnMKQEAgLTQyNCwxMiArNDM4LDE0IEBACiAgKi8KIAogI2RlZmluZSBWSTZfSFNUX0NUUkwJCQkweDJhMDAKKyNkZWZpbmUgVkk2X0hTVF9DVFJMX0VOCQkJKDEgPDwgMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhTSSBDb250cm9sIFJlZ2lzdGVycwogICovCiAKICNkZWZpbmUgVkk2X0hTSV9DVFJMCQkJMHgyYjAwCisjZGVmaW5lIFZJNl9IU0lfQ1RSTF9FTgkJCSgxIDw8IDApCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBCUlUgQ29udHJvbCBSZWdpc3RlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JwZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcnBmLmMKaW5kZXggMjU0ODcxZC4uYmNlMmJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcnBmLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcnBmLmMKQEAgLTQ3LDI1ICs0NywzNiBAQAogCXN0cnVjdCB2c3AxX3J3cGYgKnJwZiA9IHRvX3J3cGYoc3ViZGV2KTsKIAljb25zdCBzdHJ1Y3QgdnNwMV9mb3JtYXRfaW5mbyAqZm10aW5mbyA9IHJwZi0+dmlkZW8uZm10aW5mbzsKIAljb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqZm9ybWF0ID0gJnJwZi0+dmlkZW8uZm9ybWF0OworCWNvbnN0IHN0cnVjdCB2NGwyX3JlY3QgKmNyb3AgPSAmcnBmLT5jcm9wOwogCXUzMiBwc3RyaWRlOwogCXUzMiBpbmZtdDsKIAogCWlmICghZW5hYmxlKQogCQlyZXR1cm4gMDsKIAotCS8qIFNvdXJjZSBzaXplIGFuZCBzdHJpZGUuIENyb3BwaW5nIGlzbid0IHN1cHBvcnRlZCB5ZXQuICovCisJLyogU291cmNlIHNpemUsIHN0cmlkZSBhbmQgY3JvcCBvZmZzZXRzLgorCSAqCisJICogVGhlIGNyb3Agb2Zmc2V0cyBjb3JyZXNwb25kIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3JvcCByZWN0YW5nbGUgdG9wCisJICogbGVmdCBjb3JuZXIgaW4gdGhlIHBsYW5lIGJ1ZmZlci4gT25seSB0d28gb2Zmc2V0cyBhcmUgbmVlZGVkLCBhcworCSAqIHBsYW5lcyAyIGFuZCAzIGFsd2F5cyBoYXZlIGlkZW50aWNhbCBzdHJpZGVzLgorCSAqLwogCXZzcDFfcnBmX3dyaXRlKHJwZiwgVkk2X1JQRl9TUkNfQlNJWkUsCi0JCSAgICAgICAoZm9ybWF0LT53aWR0aCA8PCBWSTZfUlBGX1NSQ19CU0laRV9CSFNJWkVfU0hJRlQpIHwKLQkJICAgICAgIChmb3JtYXQtPmhlaWdodCA8PCBWSTZfUlBGX1NSQ19CU0laRV9CVlNJWkVfU0hJRlQpKTsKKwkJICAgICAgIChjcm9wLT53aWR0aCA8PCBWSTZfUlBGX1NSQ19CU0laRV9CSFNJWkVfU0hJRlQpIHwKKwkJICAgICAgIChjcm9wLT5oZWlnaHQgPDwgVkk2X1JQRl9TUkNfQlNJWkVfQlZTSVpFX1NISUZUKSk7CiAJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ19FU0laRSwKLQkJICAgICAgIChmb3JtYXQtPndpZHRoIDw8IFZJNl9SUEZfU1JDX0VTSVpFX0VIU0laRV9TSElGVCkgfAotCQkgICAgICAgKGZvcm1hdC0+aGVpZ2h0IDw8IFZJNl9SUEZfU1JDX0VTSVpFX0VWU0laRV9TSElGVCkpOworCQkgICAgICAgKGNyb3AtPndpZHRoIDw8IFZJNl9SUEZfU1JDX0VTSVpFX0VIU0laRV9TSElGVCkgfAorCQkgICAgICAgKGNyb3AtPmhlaWdodCA8PCBWSTZfUlBGX1NSQ19FU0laRV9FVlNJWkVfU0hJRlQpKTsKIAorCXJwZi0+b2Zmc2V0c1swXSA9IGNyb3AtPnRvcCAqIGZvcm1hdC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZQorCQkJKyBjcm9wLT5sZWZ0ICogZm10aW5mby0+YnBwWzBdIC8gODsKIAlwc3RyaWRlID0gZm9ybWF0LT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lCiAJCTw8IFZJNl9SUEZfU1JDTV9QU1RSSURFX1lfU0hJRlQ7Ci0JaWYgKGZvcm1hdC0+bnVtX3BsYW5lcyA+IDEpCisJaWYgKGZvcm1hdC0+bnVtX3BsYW5lcyA+IDEpIHsKKwkJcnBmLT5vZmZzZXRzWzFdID0gY3JvcC0+dG9wICogZm9ybWF0LT5wbGFuZV9mbXRbMV0uYnl0ZXNwZXJsaW5lCisJCQkJKyBjcm9wLT5sZWZ0ICogZm10aW5mby0+YnBwWzFdIC8gODsKIAkJcHN0cmlkZSB8PSBmb3JtYXQtPnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUKIAkJCTw8IFZJNl9SUEZfU1JDTV9QU1RSSURFX0NfU0hJRlQ7CisJfQogCiAJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ01fUFNUUklERSwgcHN0cmlkZSk7CiAKQEAgLTExMyw2ICsxMjQsOCBAQAogCS5lbnVtX2ZyYW1lX3NpemUgPSB2c3AxX3J3cGZfZW51bV9mcmFtZV9zaXplLAogCS5nZXRfZm10ID0gdnNwMV9yd3BmX2dldF9mb3JtYXQsCiAJLnNldF9mbXQgPSB2c3AxX3J3cGZfc2V0X2Zvcm1hdCwKKwkuZ2V0X3NlbGVjdGlvbiA9IHZzcDFfcndwZl9nZXRfc2VsZWN0aW9uLAorCS5zZXRfc2VsZWN0aW9uID0gdnNwMV9yd3BmX3NldF9zZWxlY3Rpb24sCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBycGZfb3BzID0gewpAQCAtMTI5LDExICsxNDIsMTQgQEAKIHsKIAlzdHJ1Y3QgdnNwMV9yd3BmICpycGYgPSBjb250YWluZXJfb2YodmlkZW8sIHN0cnVjdCB2c3AxX3J3cGYsIHZpZGVvKTsKIAotCXZzcDFfcnBmX3dyaXRlKHJwZiwgVkk2X1JQRl9TUkNNX0FERFJfWSwgYnVmLT5hZGRyWzBdKTsKKwl2c3AxX3JwZl93cml0ZShycGYsIFZJNl9SUEZfU1JDTV9BRERSX1ksCisJCSAgICAgICBidWYtPmFkZHJbMF0gKyBycGYtPm9mZnNldHNbMF0pOwogCWlmIChidWYtPmJ1Zi5udW1fcGxhbmVzID4gMSkKLQkJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ01fQUREUl9DMCwgYnVmLT5hZGRyWzFdKTsKKwkJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ01fQUREUl9DMCwKKwkJCSAgICAgICBidWYtPmFkZHJbMV0gKyBycGYtPm9mZnNldHNbMV0pOwogCWlmIChidWYtPmJ1Zi5udW1fcGxhbmVzID4gMikKLQkJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ01fQUREUl9DMSwgYnVmLT5hZGRyWzJdKTsKKwkJdnNwMV9ycGZfd3JpdGUocnBmLCBWSTZfUlBGX1NSQ01fQUREUl9DMSwKKwkJCSAgICAgICBidWYtPmFkZHJbMl0gKyBycGYtPm9mZnNldHNbMV0pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZzcDFfdmlkZW9fb3BlcmF0aW9ucyBycGZfdmRldl9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmMKaW5kZXggOTc1MmQ1NS4uNzgyZjc3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcndwZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3J3cGYuYwpAQCAtNzEsNiArNzEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCB2NGwyX3JlY3QgKgordnNwMV9yd3BmX2dldF9jcm9wKHN0cnVjdCB2c3AxX3J3cGYgKnJ3cGYsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsIHUzMiB3aGljaCkKK3sKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBSV1BGX1BBRF9TSU5LKTsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU6CisJCXJldHVybiAmcndwZi0+Y3JvcDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKIGludCB2c3AxX3J3cGZfZ2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKIAkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCiB7CkBAIC04Nyw2ICsxMDAsNyBAQAogewogCXN0cnVjdCB2c3AxX3J3cGYgKnJ3cGYgPSB0b19yd3BmKHN1YmRldik7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CiAKIAkvKiBEZWZhdWx0IHRvIFlVViBpZiB0aGUgcmVxdWVzdGVkIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwogCWlmIChmbXQtPmZvcm1hdC5jb2RlICE9IFY0TDJfTUJVU19GTVRfQVJHQjg4ODhfMVgzMiAmJgpAQCAtMTE1LDYgKzEyOSwxMyBAQAogCiAJZm10LT5mb3JtYXQgPSAqZm9ybWF0OwogCisJLyogVXBkYXRlIHRoZSBzaW5rIGNyb3AgcmVjdGFuZ2xlLiAqLworCWNyb3AgPSB2c3AxX3J3cGZfZ2V0X2Nyb3AocndwZiwgZmgsIGZtdC0+d2hpY2gpOworCWNyb3AtPmxlZnQgPSAwOworCWNyb3AtPnRvcCA9IDA7CisJY3JvcC0+d2lkdGggPSBmbXQtPmZvcm1hdC53aWR0aDsKKwljcm9wLT5oZWlnaHQgPSBmbXQtPmZvcm1hdC5oZWlnaHQ7CisKIAkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCB0byB0aGUgc291cmNlIHBhZC4gKi8KIAlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmcndwZi0+ZW50aXR5LCBmaCwgUldQRl9QQURfU09VUkNFLAogCQkJCQkgICAgZm10LT53aGljaCk7CkBAIC0xMjIsMyArMTQzLDc4IEBACiAKIAlyZXR1cm4gMDsKIH0KKworaW50IHZzcDFfcndwZl9nZXRfc2VsZWN0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X3NlbGVjdGlvbiAqc2VsKQoreworCXN0cnVjdCB2c3AxX3J3cGYgKnJ3cGYgPSB0b19yd3BmKHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJLyogQ3JvcHBpbmcgaXMgaW1wbGVtZW50ZWQgb24gdGhlIHNpbmsgcGFkLiAqLworCWlmIChzZWwtPnBhZCAhPSBSV1BGX1BBRF9TSU5LKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoc2VsLT50YXJnZXQpIHsKKwljYXNlIFY0TDJfU0VMX1RHVF9DUk9QOgorCQlzZWwtPnIgPSAqdnNwMV9yd3BmX2dldF9jcm9wKHJ3cGYsIGZoLCBzZWwtPndoaWNoKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfU0VMX1RHVF9DUk9QX0JPVU5EUzoKKwkJZm9ybWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3JtYXQoJnJ3cGYtPmVudGl0eSwgZmgsCisJCQkJCQkgICAgUldQRl9QQURfU0lOSywgc2VsLT53aGljaCk7CisJCXNlbC0+ci5sZWZ0ID0gMDsKKwkJc2VsLT5yLnRvcCA9IDA7CisJCXNlbC0+ci53aWR0aCA9IGZvcm1hdC0+d2lkdGg7CisJCXNlbC0+ci5oZWlnaHQgPSBmb3JtYXQtPmhlaWdodDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZzcDFfcndwZl9zZXRfc2VsZWN0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X3NlbGVjdGlvbiAqc2VsKQoreworCXN0cnVjdCB2c3AxX3J3cGYgKnJ3cGYgPSB0b19yd3BmKHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CisKKwkvKiBDcm9wcGluZyBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgc2luayBwYWQuICovCisJaWYgKHNlbC0+cGFkICE9IFJXUEZfUEFEX1NJTkspCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNlbC0+dGFyZ2V0ICE9IFY0TDJfU0VMX1RHVF9DUk9QKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgY3JvcCByZWN0YW5nbGUgaXMgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZSBpbWFnZS4gVGhlCisJICogV1BGIHRvcCBhbmQgbGVmdCBvZmZzZXRzIGFyZSBsaW1pdGVkIHRvIDI1NS4KKwkgKi8KKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmcndwZi0+ZW50aXR5LCBmaCwgUldQRl9QQURfU0lOSywKKwkJCQkJICAgIHNlbC0+d2hpY2gpOworCXNlbC0+ci5sZWZ0ID0gbWluX3QodW5zaWduZWQgaW50LCBzZWwtPnIubGVmdCwgZm9ybWF0LT53aWR0aCAtIDIpOworCXNlbC0+ci50b3AgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNlbC0+ci50b3AsIGZvcm1hdC0+aGVpZ2h0IC0gMik7CisJaWYgKHJ3cGYtPmVudGl0eS50eXBlID09IFZTUDFfRU5USVRZX1dQRikgeworCQlzZWwtPnIubGVmdCA9IG1pbl90KHVuc2lnbmVkIGludCwgc2VsLT5yLmxlZnQsIDI1NSk7CisJCXNlbC0+ci50b3AgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNlbC0+ci50b3AsIDI1NSk7CisJfQorCXNlbC0+ci53aWR0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgc2VsLT5yLndpZHRoLAorCQkJICAgICBmb3JtYXQtPndpZHRoIC0gc2VsLT5yLmxlZnQpOworCXNlbC0+ci5oZWlnaHQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNlbC0+ci5oZWlnaHQsCisJCQkgICAgICBmb3JtYXQtPmhlaWdodCAtIHNlbC0+ci50b3ApOworCisJY3JvcCA9IHZzcDFfcndwZl9nZXRfY3JvcChyd3BmLCBmaCwgc2VsLT53aGljaCk7CisJKmNyb3AgPSBzZWwtPnI7CisKKwkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCB0byB0aGUgc291cmNlIHBhZC4gKi8KKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmcndwZi0+ZW50aXR5LCBmaCwgUldQRl9QQURfU09VUkNFLAorCQkJCQkgICAgc2VsLT53aGljaCk7CisJZm9ybWF0LT53aWR0aCA9IGNyb3AtPndpZHRoOworCWZvcm1hdC0+aGVpZ2h0ID0gY3JvcC0+aGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmgKaW5kZXggYzE4MmQ4NS4uNmNiZGI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcndwZi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3J3cGYuaApAQCAtMjksNiArMjksMTAgQEAKIAogCXVuc2lnbmVkIGludCBtYXhfd2lkdGg7CiAJdW5zaWduZWQgaW50IG1heF9oZWlnaHQ7CisKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3A7CisKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0c1syXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZzcDFfcndwZiAqdG9fcndwZihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldikKQEAgLTQ5LDUgKzUzLDExIEBACiAJCQkgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KTsKIGludCB2c3AxX3J3cGZfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKIAkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpOworaW50IHZzcDFfcndwZl9nZXRfc2VsZWN0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X3NlbGVjdGlvbiAqc2VsKTsKK2ludCB2c3AxX3J3cGZfc2V0X3NlbGVjdGlvbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9zZWxlY3Rpb24gKnNlbCk7CiAKICNlbmRpZiAvKiBfX1ZTUDFfUldQRl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3NydS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfc3J1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMWEwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3NydS5jCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogdnNwMV9zcnUuYyAgLS0gIFItQ2FyIFZTUDEgU3VwZXIgUmVzb2x1dGlvbiBVbml0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0OiBMYXVyZW50IFBpbmNoYXJ0IChsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjaW5jbHVkZSAidnNwMS5oIgorI2luY2x1ZGUgInZzcDFfc3J1LmgiCisKKyNkZWZpbmUgU1JVX01JTl9TSVpFCQkJCTRVCisjZGVmaW5lIFNSVV9NQVhfU0laRQkJCQk4MTkwVQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGV2aWNlIEFjY2VzcworICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHZzcDFfc3J1X3JlYWQoc3RydWN0IHZzcDFfc3J1ICpzcnUsIHUzMiByZWcpCit7CisJcmV0dXJuIHZzcDFfcmVhZChzcnUtPmVudGl0eS52c3AxLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnNwMV9zcnVfd3JpdGUoc3RydWN0IHZzcDFfc3J1ICpzcnUsIHUzMiByZWcsIHUzMiBkYXRhKQoreworCXZzcDFfd3JpdGUoc3J1LT5lbnRpdHkudnNwMSwgcmVnLCBkYXRhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbnRyb2xzCisgKi8KKworI2RlZmluZSBWNEwyX0NJRF9WU1AxX1NSVV9JTlRFTlNJVFkJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAxKQorCitzdGF0aWMgaW50IHNydV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgdnNwMV9zcnUgKnNydSA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgdnNwMV9zcnUsIGN0cmxzKTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1ZTUDFfU1JVX0lOVEVOU0lUWToKKwkJc3J1LT5pbnRlbnNpdHkgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgc3J1X2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBzcnVfc19jdHJsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHNydV9pbnRlbnNpdHlfY29udHJvbCA9IHsKKwkub3BzID0gJnNydV9jdHJsX29wcywKKwkuaWQgPSBWNEwyX0NJRF9WU1AxX1NSVV9JTlRFTlNJVFksCisJLm5hbWUgPSAiSW50ZW5zaXR5IiwKKwkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJLm1pbiA9IDEsCisJLm1heCA9IDYsCisJLnN0ZXAgPSAxLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgU3ViZGV2aWNlIENvcmUgT3BlcmF0aW9ucworICovCisKK3N0cnVjdCB2c3AxX3NydV9wYXJhbSB7CisJdTMyIGN0cmwwOworCXUzMiBjdHJsMjsKK307CisKKyNkZWZpbmUgVkk2X1NSVV9DVFJMMF9QQVJBTVMocDAsIHAxKQkJCVwKKwkoKChwMCkgPDwgVkk2X1NSVV9DVFJMMF9QQVJBTTBfU0hJRlQpIHwJCVwKKwkgKChwMSkgPDwgVkk2X1NSVV9DVFJMMF9QQVJBTTFfU0hJRlQpKQorCisjZGVmaW5lIFZJNl9TUlVfQ1RSTDJfUEFSQU1TKHA2LCBwNywgcDgpCQlcCisJKCgocDYpIDw8IFZJNl9TUlVfQ1RSTDJfUEFSQU02X1NISUZUKSB8CQlcCisJICgocDcpIDw8IFZJNl9TUlVfQ1RSTDJfUEFSQU03X1NISUZUKSB8CQlcCisJICgocDgpIDw8IFZJNl9TUlVfQ1RSTDJfUEFSQU04X1NISUZUKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2c3AxX3NydV9wYXJhbSB2c3AxX3NydV9wYXJhbXNbXSA9IHsKKwl7CisJCS5jdHJsMCA9IFZJNl9TUlVfQ1RSTDBfUEFSQU1TKDI1NiwgNCkgfCBWSTZfU1JVX0NUUkwwX0VOLAorCQkuY3RybDIgPSBWSTZfU1JVX0NUUkwyX1BBUkFNUygyNCwgNDAsIDI1NSksCisJfSwgeworCQkuY3RybDAgPSBWSTZfU1JVX0NUUkwwX1BBUkFNUygyNTYsIDQpIHwgVkk2X1NSVV9DVFJMMF9FTiwKKwkJLmN0cmwyID0gVkk2X1NSVV9DVFJMMl9QQVJBTVMoOCwgMTYsIDI1NSksCisJfSwgeworCQkuY3RybDAgPSBWSTZfU1JVX0NUUkwwX1BBUkFNUygzODQsIDUpIHwgVkk2X1NSVV9DVFJMMF9FTiwKKwkJLmN0cmwyID0gVkk2X1NSVV9DVFJMMl9QQVJBTVMoMzYsIDYwLCAyNTUpLAorCX0sIHsKKwkJLmN0cmwwID0gVkk2X1NSVV9DVFJMMF9QQVJBTVMoMzg0LCA1KSB8IFZJNl9TUlVfQ1RSTDBfRU4sCisJCS5jdHJsMiA9IFZJNl9TUlVfQ1RSTDJfUEFSQU1TKDEyLCAyNywgMjU1KSwKKwl9LCB7CisJCS5jdHJsMCA9IFZJNl9TUlVfQ1RSTDBfUEFSQU1TKDUxMSwgNikgfCBWSTZfU1JVX0NUUkwwX0VOLAorCQkuY3RybDIgPSBWSTZfU1JVX0NUUkwyX1BBUkFNUyg0OCwgODAsIDI1NSksCisJfSwgeworCQkuY3RybDAgPSBWSTZfU1JVX0NUUkwwX1BBUkFNUyg1MTEsIDYpIHwgVkk2X1NSVV9DVFJMMF9FTiwKKwkJLmN0cmwyID0gVkk2X1NSVV9DVFJMMl9QQVJBTVMoMTYsIDM2LCAyNTUpLAorCX0sCit9OworCitzdGF0aWMgaW50IHNydV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdnNwMV9zcnUgKnNydSA9IHRvX3NydShzdWJkZXYpOworCWNvbnN0IHN0cnVjdCB2c3AxX3NydV9wYXJhbSAqcGFyYW07CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqaW5wdXQ7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqb3V0cHV0OworCWJvb2wgdXBzY2FsZTsKKwl1MzIgY3RybDA7CisKKwlpZiAoIWVuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpbnB1dCA9ICZzcnUtPmVudGl0eS5mb3JtYXRzW1NSVV9QQURfU0lOS107CisJb3V0cHV0ID0gJnNydS0+ZW50aXR5LmZvcm1hdHNbU1JVX1BBRF9TT1VSQ0VdOworCXVwc2NhbGUgPSBpbnB1dC0+d2lkdGggIT0gb3V0cHV0LT53aWR0aDsKKwlwYXJhbSA9ICZ2c3AxX3NydV9wYXJhbXNbc3J1LT5pbnRlbnNpdHldOworCisJaWYgKGlucHV0LT5jb2RlID09IFY0TDJfTUJVU19GTVRfQVJHQjg4ODhfMVgzMikKKwkJY3RybDAgPSBWSTZfU1JVX0NUUkwwX1BBUkFNMiB8IFZJNl9TUlVfQ1RSTDBfUEFSQU0zCisJCSAgICAgIHwgVkk2X1NSVV9DVFJMMF9QQVJBTTQ7CisJZWxzZQorCQljdHJsMCA9IFZJNl9TUlVfQ1RSTDBfUEFSQU0zOworCisJdnNwMV9zcnVfd3JpdGUoc3J1LCBWSTZfU1JVX0NUUkwwLCBwYXJhbS0+Y3RybDAgfCBjdHJsMCB8CisJCSAgICAgICAodXBzY2FsZSA/IFZJNl9TUlVfQ1RSTDBfTU9ERV9VUFNDQUxFIDogMCkpOworCXZzcDFfc3J1X3dyaXRlKHNydSwgVkk2X1NSVV9DVFJMMSwgVkk2X1NSVV9DVFJMMV9QQVJBTTUpOworCXZzcDFfc3J1X3dyaXRlKHNydSwgVkk2X1NSVV9DVFJMMiwgcGFyYW0tPmN0cmwyKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBTdWJkZXZpY2UgUGFkIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHNydV9lbnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb2Rlc1tdID0geworCQlWNEwyX01CVVNfRk1UX0FSR0I4ODg4XzFYMzIsCisJCVY0TDJfTUJVU19GTVRfQVlVVjhfMVgzMiwKKwl9OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWlmIChjb2RlLT5wYWQgPT0gU1JVX1BBRF9TSU5LKSB7CisJCWlmIChjb2RlLT5pbmRleCA+PSBBUlJBWV9TSVpFKGNvZGVzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvZGUtPmNvZGUgPSBjb2Rlc1tjb2RlLT5pbmRleF07CisJfSBlbHNlIHsKKwkJLyogVGhlIFNSVSBjYW4ndCBwZXJmb3JtIGZvcm1hdCBjb252ZXJzaW9uLCB0aGUgc2luayBmb3JtYXQgaXMKKwkJICogYWx3YXlzIGlkZW50aWNhbCB0byB0aGUgc291cmNlIGZvcm1hdC4KKwkJICovCisJCWlmIChjb2RlLT5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWZvcm1hdCA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBTUlVfUEFEX1NJTkspOworCQljb2RlLT5jb2RlID0gZm9ybWF0LT5jb2RlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNydV9lbnVtX2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJZm9ybWF0ID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIFNSVV9QQURfU0lOSyk7CisKKwlpZiAoZnNlLT5pbmRleCB8fCBmc2UtPmNvZGUgIT0gZm9ybWF0LT5jb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc2UtPnBhZCA9PSBTUlVfUEFEX1NJTkspIHsKKwkJZnNlLT5taW5fd2lkdGggPSBTUlVfTUlOX1NJWkU7CisJCWZzZS0+bWF4X3dpZHRoID0gU1JVX01BWF9TSVpFOworCQlmc2UtPm1pbl9oZWlnaHQgPSBTUlVfTUlOX1NJWkU7CisJCWZzZS0+bWF4X2hlaWdodCA9IFNSVV9NQVhfU0laRTsKKwl9IGVsc2UgeworCQlmc2UtPm1pbl93aWR0aCA9IGZvcm1hdC0+d2lkdGg7CisJCWZzZS0+bWluX2hlaWdodCA9IGZvcm1hdC0+aGVpZ2h0OworCQlpZiAoZm9ybWF0LT53aWR0aCA8PSBTUlVfTUFYX1NJWkUgLyAyICYmCisJCSAgICBmb3JtYXQtPmhlaWdodCA8PSBTUlVfTUFYX1NJWkUgLyAyKSB7CisJCQlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC0+d2lkdGggKiAyOworCQkJZnNlLT5tYXhfaGVpZ2h0ID0gZm9ybWF0LT5oZWlnaHQgKiAyOworCQl9IGVsc2UgeworCQkJZnNlLT5tYXhfd2lkdGggPSBmb3JtYXQtPndpZHRoOworCQkJZnNlLT5tYXhfaGVpZ2h0ID0gZm9ybWF0LT5oZWlnaHQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcnVfZ2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2c3AxX3NydSAqc3J1ID0gdG9fc3J1KHN1YmRldik7CisKKwlmbXQtPmZvcm1hdCA9ICp2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmc3J1LT5lbnRpdHksIGZoLCBmbXQtPnBhZCwKKwkJCQkJCSAgZm10LT53aGljaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3J1X3RyeV9mb3JtYXQoc3RydWN0IHZzcDFfc3J1ICpzcnUsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICB1bnNpZ25lZCBpbnQgcGFkLCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQsCisJCQkgICBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXVuc2lnbmVkIGludCBpbnB1dF9hcmVhOworCXVuc2lnbmVkIGludCBvdXRwdXRfYXJlYTsKKworCXN3aXRjaCAocGFkKSB7CisJY2FzZSBTUlVfUEFEX1NJTks6CisJCS8qIERlZmF1bHQgdG8gWVVWIGlmIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisJCWlmIChmbXQtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9BUkdCODg4OF8xWDMyICYmCisJCSAgICBmbXQtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9BWVVWOF8xWDMyKQorCQkJZm10LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9BWVVWOF8xWDMyOworCisJCWZtdC0+d2lkdGggPSBjbGFtcChmbXQtPndpZHRoLCBTUlVfTUlOX1NJWkUsIFNSVV9NQVhfU0laRSk7CisJCWZtdC0+aGVpZ2h0ID0gY2xhbXAoZm10LT5oZWlnaHQsIFNSVV9NSU5fU0laRSwgU1JVX01BWF9TSVpFKTsKKwkJYnJlYWs7CisKKwljYXNlIFNSVV9QQURfU09VUkNFOgorCQkvKiBUaGUgU1JVIGNhbid0IHBlcmZvcm0gZm9ybWF0IGNvbnZlcnNpb24uICovCisJCWZvcm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9ybWF0KCZzcnUtPmVudGl0eSwgZmgsCisJCQkJCQkgICAgU1JVX1BBRF9TSU5LLCB3aGljaCk7CisJCWZtdC0+Y29kZSA9IGZvcm1hdC0+Y29kZTsKKworCQkvKiBXZSBjYW4gdXBzY2FsZSBieSAyIGluIGJvdGggZGlyZWN0aW9uLCBidXQgbm90IGluZGVwZW5kZW50bHkuCisJCSAqIENvbXBhcmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcmVjdGFuZ2xlcyBhcmVhcyAoYXZvaWRpbmcKKwkJICogaW50ZWdlciBvdmVyZmxvd3Mgb24gdGhlIG91dHB1dCk6IGlmIHRoZSByZXF1ZXN0ZWQgb3V0cHV0CisJCSAqIGFyZWEgaXMgbGFyZ2VyIHRoYW4gMS41XjIgdGhlIGlucHV0IGFyZWEgdXBzY2FsZSBieSB0d28sCisJCSAqIG90aGVyd2lzZSBkb24ndCBzY2FsZS4KKwkJICovCisJCWlucHV0X2FyZWEgPSBmb3JtYXQtPndpZHRoICogZm9ybWF0LT5oZWlnaHQ7CisJCW91dHB1dF9hcmVhID0gbWluKGZtdC0+d2lkdGgsIFNSVV9NQVhfU0laRSkKKwkJCSAgICAqIG1pbihmbXQtPmhlaWdodCwgU1JVX01BWF9TSVpFKTsKKworCQlpZiAoZm10LT53aWR0aCA8PSBTUlVfTUFYX1NJWkUgLyAyICYmCisJCSAgICBmbXQtPmhlaWdodCA8PSBTUlVfTUFYX1NJWkUgLyAyICYmCisJCSAgICBvdXRwdXRfYXJlYSA+IGlucHV0X2FyZWEgKiA5IC8gNCkgeworCQkJZm10LT53aWR0aCA9IGZvcm1hdC0+d2lkdGggKiAyOworCQkJZm10LT5oZWlnaHQgPSBmb3JtYXQtPmhlaWdodCAqIDI7CisJCX0gZWxzZSB7CisJCQlmbXQtPndpZHRoID0gZm9ybWF0LT53aWR0aDsKKwkJCWZtdC0+aGVpZ2h0ID0gZm9ybWF0LT5oZWlnaHQ7CisJCX0KKwkJYnJlYWs7CisJfQorCisJZm10LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmbXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKK30KKworc3RhdGljIGludCBzcnVfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2c3AxX3NydSAqc3J1ID0gdG9fc3J1KHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJc3J1X3RyeV9mb3JtYXQoc3J1LCBmaCwgZm10LT5wYWQsICZmbXQtPmZvcm1hdCwgZm10LT53aGljaCk7CisKKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmc3J1LT5lbnRpdHksIGZoLCBmbXQtPnBhZCwKKwkJCQkJICAgIGZtdC0+d2hpY2gpOworCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKKworCWlmIChmbXQtPnBhZCA9PSBTUlVfUEFEX1NJTkspIHsKKwkJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgdG8gdGhlIHNvdXJjZSBwYWQuICovCisJCWZvcm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9ybWF0KCZzcnUtPmVudGl0eSwgZmgsCisJCQkJCQkgICAgU1JVX1BBRF9TT1VSQ0UsIGZtdC0+d2hpY2gpOworCQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7CisKKwkJc3J1X3RyeV9mb3JtYXQoc3J1LCBmaCwgU1JVX1BBRF9TT1VSQ0UsIGZvcm1hdCwgZm10LT53aGljaCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIFN1YmRldmljZSBPcGVyYXRpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgc3J1X3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0gPSBzcnVfc19zdHJlYW0sCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgc3J1X3BhZF9vcHMgPSB7CisJLmVudW1fbWJ1c19jb2RlID0gc3J1X2VudW1fbWJ1c19jb2RlLAorCS5lbnVtX2ZyYW1lX3NpemUgPSBzcnVfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gc3J1X2dldF9mb3JtYXQsCisJLnNldF9mbXQgPSBzcnVfc2V0X2Zvcm1hdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHNydV9vcHMgPSB7CisJLnZpZGVvCT0gJnNydV92aWRlb19vcHMsCisJLnBhZCAgICA9ICZzcnVfcGFkX29wcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbml0aWFsaXphdGlvbiBhbmQgQ2xlYW51cAorICovCisKK3N0cnVjdCB2c3AxX3NydSAqdnNwMV9zcnVfY3JlYXRlKHN0cnVjdCB2c3AxX2RldmljZSAqdnNwMSkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldjsKKwlzdHJ1Y3QgdnNwMV9zcnUgKnNydTsKKwlpbnQgcmV0OworCisJc3J1ID0gZGV2bV9remFsbG9jKHZzcDEtPmRldiwgc2l6ZW9mKCpzcnUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3J1ID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3J1LT5lbnRpdHkudHlwZSA9IFZTUDFfRU5USVRZX1NSVTsKKwlzcnUtPmVudGl0eS5pZCA9IFZJNl9EUFJfTk9ERV9TUlU7CisKKwlyZXQgPSB2c3AxX2VudGl0eV9pbml0KHZzcDEsICZzcnUtPmVudGl0eSwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBWNEwyIHN1YmRldi4gKi8KKwlzdWJkZXYgPSAmc3J1LT5lbnRpdHkuc3ViZGV2OworCXY0bDJfc3ViZGV2X2luaXQoc3ViZGV2LCAmc3J1X29wcyk7CisKKwlzdWJkZXYtPmVudGl0eS5vcHMgPSAmdnNwMV9tZWRpYV9vcHM7CisJc3ViZGV2LT5pbnRlcm5hbF9vcHMgPSAmdnNwMV9zdWJkZXZfaW50ZXJuYWxfb3BzOworCXNucHJpbnRmKHN1YmRldi0+bmFtZSwgc2l6ZW9mKHN1YmRldi0+bmFtZSksICIlcyBzcnUiLAorCQkgZGV2X25hbWUodnNwMS0+ZGV2KSk7CisJdjRsMl9zZXRfc3ViZGV2ZGF0YShzdWJkZXYsIHNydSk7CisJc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXZzcDFfZW50aXR5X2luaXRfZm9ybWF0cyhzdWJkZXYsIE5VTEwpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBoYW5kbGVyLiAqLworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnNydS0+Y3RybHMsIDEpOworCXY0bDJfY3RybF9uZXdfY3VzdG9tKCZzcnUtPmN0cmxzLCAmc3J1X2ludGVuc2l0eV9jb250cm9sLCBOVUxMKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmc3J1LT5jdHJscyk7CisJc3J1LT5lbnRpdHkuc3ViZGV2LmN0cmxfaGFuZGxlciA9ICZzcnUtPmN0cmxzOworCisJcmV0dXJuIHNydTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3NydS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfc3J1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxODcwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3NydS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiB2c3AxX3NydS5oICAtLSAgUi1DYXIgVlNQMSBTdXBlciBSZXNvbHV0aW9uIFVuaXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVuZXNhcyBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IExhdXJlbnQgUGluY2hhcnQgKGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9fVlNQMV9TUlVfSF9fCisjZGVmaW5lIF9fVlNQMV9TUlVfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYS1lbnRpdHkuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2luY2x1ZGUgInZzcDFfZW50aXR5LmgiCisKK3N0cnVjdCB2c3AxX2RldmljZTsKKworI2RlZmluZSBTUlVfUEFEX1NJTksJCQkJMAorI2RlZmluZSBTUlVfUEFEX1NPVVJDRQkJCQkxCisKK3N0cnVjdCB2c3AxX3NydSB7CisJc3RydWN0IHZzcDFfZW50aXR5IGVudGl0eTsKKworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKKwl1bnNpZ25lZCBpbnQgaW50ZW5zaXR5OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdnNwMV9zcnUgKnRvX3NydShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHN1YmRldiwgc3RydWN0IHZzcDFfc3J1LCBlbnRpdHkuc3ViZGV2KTsKK30KKworc3RydWN0IHZzcDFfc3J1ICp2c3AxX3NydV9jcmVhdGUoc3RydWN0IHZzcDFfZGV2aWNlICp2c3AxKTsKKworI2VuZGlmIC8qIF9fVlNQMV9TUlVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV92aWRlby5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfdmlkZW8uYwppbmRleCA0YjBhYzA3Li5iNDY4N2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3ZpZGVvLmMKQEAgLTQ4OCwxMSArNDg4LDE3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlcyB0aGUgY3VycmVudCBidWZmZXIgYnkgZmlsbGluZyBpdHMgc2VxdWVuY2UgbnVtYmVyLAogICogdGltZSBzdGFtcCBhbmQgcGF5bG9hZCBzaXplLCBhbmQgaGFuZHMgaXQgYmFjayB0byB0aGUgdmlkZW9idWYgY29yZS4KICAqCisgKiBXaGVuIG9wZXJhdGluZyBpbiBEVSBvdXRwdXQgbW9kZSAoZGVlcCBwaXBlbGluZSB0byB0aGUgRFUgdGhyb3VnaCB0aGUgTElGKSwKKyAqIHRoZSBWU1AxIG5lZWRzIHRvIGNvbnN0YW50bHkgc3VwcGx5IGZyYW1lcyB0byB0aGUgZGlzcGxheS4gSW4gdGhhdCBjYXNlLCBpZgorICogbm8gb3RoZXIgYnVmZmVyIGlzIHF1ZXVlZCwgcmV1c2UgdGhlIG9uZSB0aGF0IGhhcyBqdXN0IGJlZW4gcHJvY2Vzc2VkIGluc3RlYWQKKyAqIG9mIGhhbmRpbmcgaXQgYmFjayB0byB0aGUgdmlkZW9idWYgY29yZS4KKyAqCiAgKiBSZXR1cm4gdGhlIG5leHQgcXVldWVkIGJ1ZmZlciBvciBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KICAqLwogc3RhdGljIHN0cnVjdCB2c3AxX3ZpZGVvX2J1ZmZlciAqCiB2c3AxX3ZpZGVvX2NvbXBsZXRlX2J1ZmZlcihzdHJ1Y3QgdnNwMV92aWRlbyAqdmlkZW8pCiB7CisJc3RydWN0IHZzcDFfcGlwZWxpbmUgKnBpcGUgPSB0b192c3AxX3BpcGVsaW5lKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKIAlzdHJ1Y3QgdnNwMV92aWRlb19idWZmZXIgKm5leHQgPSBOVUxMOwogCXN0cnVjdCB2c3AxX3ZpZGVvX2J1ZmZlciAqZG9uZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTA3LDYgKzUxMywxMyBAQAogCiAJZG9uZSA9IGxpc3RfZmlyc3RfZW50cnkoJnZpZGVvLT5pcnFxdWV1ZSwKIAkJCQlzdHJ1Y3QgdnNwMV92aWRlb19idWZmZXIsIHF1ZXVlKTsKKworCS8qIEluIERVIG91dHB1dCBtb2RlIHJldXNlIHRoZSBidWZmZXIgaWYgdGhlIGxpc3QgaXMgc2luZ3VsYXIuICovCisJaWYgKHBpcGUtPmxpZiAmJiBsaXN0X2lzX3Npbmd1bGFyKCZ2aWRlby0+aXJxcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CisJCXJldHVybiBkb25lOworCX0KKwogCWxpc3RfZGVsKCZkb25lLT5xdWV1ZSk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnZpZGVvLT5pcnFxdWV1ZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV93cGYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3dwZi5jCmluZGV4IGRiNGI4NWUuLjdiYWVkODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3dwZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3dwZi5jCkBAIC00OCw4ICs0OCw3IEBACiAJc3RydWN0IHZzcDFfcGlwZWxpbmUgKnBpcGUgPQogCQl0b192c3AxX3BpcGVsaW5lKCZ3cGYtPmVudGl0eS5zdWJkZXYuZW50aXR5KTsKIAlzdHJ1Y3QgdnNwMV9kZXZpY2UgKnZzcDEgPSB3cGYtPmVudGl0eS52c3AxOwotCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdCA9Ci0JCSZ3cGYtPmVudGl0eS5mb3JtYXRzW1JXUEZfUEFEX1NPVVJDRV07CisJY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqY3JvcCA9ICZ3cGYtPmNyb3A7CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHNyY3JwZiA9IDA7CiAJdTMyIG91dGZtdCA9IDA7CkBAIC02OCw3ICs2Nyw3IEBACiAKIAl2c3AxX3dwZl93cml0ZSh3cGYsIFZJNl9XUEZfU1JDUlBGLCBzcmNycGYpOwogCi0JLyogRGVzdGluYXRpb24gc3RyaWRlLiBDcm9wcGluZyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAqLworCS8qIERlc3RpbmF0aW9uIHN0cmlkZS4gKi8KIAlpZiAoIXBpcGUtPmxpZikgewogCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqZm9ybWF0ID0gJndwZi0+dmlkZW8uZm9ybWF0OwogCkBAIC03OSwxMCArNzgsMTIgQEAKIAkJCQkgICAgICAgZm9ybWF0LT5wbGFuZV9mbXRbMV0uYnl0ZXNwZXJsaW5lKTsKIAl9CiAKLQl2c3AxX3dwZl93cml0ZSh3cGYsIFZJNl9XUEZfSFNaQ0xJUCwKLQkJICAgICAgIGZvcm1hdC0+d2lkdGggPDwgVkk2X1dQRl9TWkNMSVBfU0laRV9TSElGVCk7Ci0JdnNwMV93cGZfd3JpdGUod3BmLCBWSTZfV1BGX1ZTWkNMSVAsCi0JCSAgICAgICBmb3JtYXQtPmhlaWdodCA8PCBWSTZfV1BGX1NaQ0xJUF9TSVpFX1NISUZUKTsKKwl2c3AxX3dwZl93cml0ZSh3cGYsIFZJNl9XUEZfSFNaQ0xJUCwgVkk2X1dQRl9TWkNMSVBfRU4gfAorCQkgICAgICAgKGNyb3AtPmxlZnQgPDwgVkk2X1dQRl9TWkNMSVBfT0ZTVF9TSElGVCkgfAorCQkgICAgICAgKGNyb3AtPndpZHRoIDw8IFZJNl9XUEZfU1pDTElQX1NJWkVfU0hJRlQpKTsKKwl2c3AxX3dwZl93cml0ZSh3cGYsIFZJNl9XUEZfVlNaQ0xJUCwgVkk2X1dQRl9TWkNMSVBfRU4gfAorCQkgICAgICAgKGNyb3AtPnRvcCA8PCBWSTZfV1BGX1NaQ0xJUF9PRlNUX1NISUZUKSB8CisJCSAgICAgICAoY3JvcC0+aGVpZ2h0IDw8IFZJNl9XUEZfU1pDTElQX1NJWkVfU0hJRlQpKTsKIAogCS8qIEZvcm1hdCAqLwogCWlmICghcGlwZS0+bGlmKSB7CkBAIC0xMzAsNiArMTMxLDggQEAKIAkuZW51bV9mcmFtZV9zaXplID0gdnNwMV9yd3BmX2VudW1fZnJhbWVfc2l6ZSwKIAkuZ2V0X2ZtdCA9IHZzcDFfcndwZl9nZXRfZm9ybWF0LAogCS5zZXRfZm10ID0gdnNwMV9yd3BmX3NldF9mb3JtYXQsCisJLmdldF9zZWxlY3Rpb24gPSB2c3AxX3J3cGZfZ2V0X3NlbGVjdGlvbiwKKwkuc2V0X3NlbGVjdGlvbiA9IHZzcDFfcndwZl9zZXRfc2VsZWN0aW9uLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgd3BmX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwppbmRleCA2ZWNkYzM5Li4xOTJmMzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCkBAIC0yMSw2ICsyMSwxMiBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L0tjb25maWciCiAKK2NvbmZpZyBSQURJT19TSTQ3MTMKKwl0cmlzdGF0ZSAiU2lsaWNvbiBMYWJzIFNpNDcxMyBGTSBSYWRpbyB3aXRoIFJEUyBUcmFuc21pdHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fVjRMMgorCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL0tjb25maWciCisKIGNvbmZpZyBSQURJT19TSTQ3NlgKIAl0cmlzdGF0ZSAiU2lsaWNvbiBMYWJvcmF0b3JpZXMgU2k0NzZ4IEkyQyBGTSBSYWRpbyIKIAlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCkBAIC0xMTMsMjkgKzExOSw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByYWRpby1zaGFyazIuCiAKLWNvbmZpZyBJMkNfU0k0NzEzCi0JdHJpc3RhdGUgIkkyQyBkcml2ZXIgZm9yIFNpbGljb24gTGFicyBTaTQ3MTMgZGV2aWNlIgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgdG8gU2k0NzEzIEkyQyBkZXZpY2UuCi0JICBUaGlzIGRldmljZSBkcml2ZXIgc3VwcG9ydHMgb25seSBpMmMgYnVzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaTQ3MTMuCi0KLWNvbmZpZyBSQURJT19TSTQ3MTMKLQl0cmlzdGF0ZSAiU2lsaWNvbiBMYWJzIFNpNDcxMyBGTSBSYWRpbyBUcmFuc21pdHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKLQlzZWxlY3QgSTJDX1NJNDcxMwotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCB0byBTaTQ3MTMgRk0gUmFkaW8gVHJhbnNtaXR0ZXIuCi0JICBUaGlzIGRldmljZSBjYW4gdHJhbnNtaXQgYXVkaW8gdGhyb3VnaCBGTS4gSXQgY2FuIHRyYW5zbWl0Ci0JICBSRFMgYW5kIFJCRFMgc2lnbmFscyBhcyB3ZWxsLiBUaGlzIG1vZHVsZSBpcyB0aGUgdjRsMiByYWRpbwotCSAgaW50ZXJmYWNlIGZvciB0aGUgaTJjIGRyaXZlciBvZiB0aGlzIGRldmljZS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmFkaW8tc2k0NzEzLgotCiBjb25maWcgVVNCX0tFRU5FCiAJdHJpc3RhdGUgIktlZW5lIEZNIFRyYW5zbWl0dGVyIFVTQiBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDIKQEAgLTE0Niw2ICsxMjksMjAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJhZGlvLWtlZW5lLgogCitjb25maWcgVVNCX1JBUkVNT05PCisJdHJpc3RhdGUgIlRoYW5rbydzIFJhcmVtb25vIEFNL0ZNL1NXIHJhZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fVjRMMgorCS0tLWhlbHAtLS0KKwkgIFRoZSAnVGhhbmtvJ3MgUmFyZW1vbm8nIGRldmljZSBjb250YWlucyB0aGUgU2k0NzM0IGNoaXAgZnJvbSBTaWxpY29uIExhYnMgSW5jLgorCSAgSXQgaXMgb25lIG9mIHRoZSB2ZXJ5IGZldyBvciBwZXJoYXBzIHRoZSBvbmx5IGNvbnN1bWVyIFVTQiByYWRpbyBkZXZpY2UKKwkgIHRvIHJlY2VpdmUgdGhlIEFNL0ZNL1NXIGJhbmRzLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIEFNL0ZNL1NXIHJlY2VpdmVyCisJICB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJhZGlvLXJhcmVtb25vLgorCiBjb25maWcgVVNCX01BOTAxCiAJdHJpc3RhdGUgIk1hc3RlcmtpdCBNQTkwMSBVU0IgRk0gcmFkaW8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQppbmRleCAzYjY0NTYwLi4xMjBlNzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKQEAgLTE3LDEyICsxNywxMSBAQAogb2JqLSQoQ09ORklHX1JBRElPX1pPTFRSSVgpICs9IHJhZGlvLXpvbHRyaXgubwogb2JqLSQoQ09ORklHX1JBRElPX0dFTVRFSykgKz0gcmFkaW8tZ2VtdGVrLm8KIG9iai0kKENPTkZJR19SQURJT19UUlVTVCkgKz0gcmFkaW8tdHJ1c3Qubwotb2JqLSQoQ09ORklHX0kyQ19TSTQ3MTMpICs9IHNpNDcxMy1pMmMubwotb2JqLSQoQ09ORklHX1JBRElPX1NJNDcxMykgKz0gcmFkaW8tc2k0NzEzLm8KIG9iai0kKENPTkZJR19SQURJT19TSTQ3NlgpICs9IHJhZGlvLXNpNDc2eC5vCiBvYmotJChDT05GSUdfUkFESU9fTUlST1BDTTIwKSArPSByYWRpby1taXJvcGNtMjAubwogb2JqLSQoQ09ORklHX1VTQl9EU0JSKSArPSBkc2JyMTAwLm8KIG9iai0kKENPTkZJR19SQURJT19TSTQ3MFgpICs9IHNpNDcweC8KK29iai0kKENPTkZJR19SQURJT19TSTQ3MTMpICs9IHNpNDcxMy8KIG9iai0kKENPTkZJR19VU0JfTVI4MDApICs9IHJhZGlvLW1yODAwLm8KIG9iai0kKENPTkZJR19VU0JfS0VFTkUpICs9IHJhZGlvLWtlZW5lLm8KIG9iai0kKENPTkZJR19VU0JfTUE5MDEpICs9IHJhZGlvLW1hOTAxLm8KQEAgLTMzLDYgKzMyLDcgQEAKIG9iai0kKENPTkZJR19SQURJT19XTDEyNzMpICs9IHJhZGlvLXdsMTI3My5vCiBvYmotJChDT05GSUdfUkFESU9fV0wxMjhYKSArPSB3bDEyOHgvCiBvYmotJChDT05GSUdfUkFESU9fVEVBNTc1WCkgKz0gdGVhNTc1eC5vCitvYmotJChDT05GSUdfVVNCX1JBUkVNT05PKSArPSByYWRpby1yYXJlbW9uby5vCiAKIHNoYXJrMi1vYmpzIDo9IHJhZGlvLXNoYXJrMi5vIHJhZGlvLXRlYTU3NzcubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJhcmVtb25vLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJhcmVtb25vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcmFyZW1vbm8uYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIENpc2NvIFN5c3RlbXMsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgorCisvKgorICogJ1RoYW5rbydzIFJhcmVtb25vJyBpcyBhIEphcGFuZXNlIHNpNDczNC1iYXNlZCBBTS9GTS9TVyBVU0IgcmVjZWl2ZXI6CisgKgorICogaHR0cDovL3d3dy5yYXJlbW9uby5qcC9wcm9kdWN0LzQ4NC5odG1sLworICoKKyAqIFRoZSBVU0IgcHJvdG9jb2wgaGFzIGJlZW4gcmV2ZXJzZWQgZW5naW5lZXJlZCB1c2luZyB3aXJlc2hhcmssIGluaXRpYWxseQorICogYnkgRGluZXNoIFJhbSA8ZGluZXNoLnJhbUBjZXJuLmNoPiBhbmQgZmluaXNoZWQgYnkgSGFucyBWZXJrdWlsCisgKiA8aHZlcmt1aWxAeHM0YWxsLm5sPi4KKyAqCisgKiBTYWRseSB0aGUgZmlybXdhcmUgdXNlZCBpbiB0aGlzIHByb2R1Y3QgaGlkZXMgbG90cyBvZiBnb29kaWVzIHNpbmNlIHRoZQorICogc2k0NzM0IGhhcyBtb3JlIGZlYXR1cmVzIHRoYW4gYXJlIHN1cHBvcnRlZCBieSB0aGUgZmlybXdhcmUuIE9oIHdlbGwuLi4KKyAqLworCisvKiBkcml2ZXIgYW5kIG1vZHVsZSBkZWZpbml0aW9ucyAqLworTU9EVUxFX0FVVEhPUigiSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoYW5rbydzIFJhcmVtb25vIEFNL0ZNL1NXIFJlY2VpdmVyIFVTQiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworLyoKKyAqIFRoZSBEZXZpY2UgYW5ub3VuY2VzIGl0c2VsZiBhcyBDeWduYWwgSW50ZWdyYXRlZCBQcm9kdWN0cywgSW5jLgorICoKKyAqIFRoZSB2ZW5kb3IgYW5kIHByb2R1Y3QgSURzIChhbmQgaW4gZmFjdCBhbGwgb3RoZXIgbHN1c2IgaW5mb3JtYXRpb24gYXMKKyAqIHdlbGwpIGFyZSBpZGVudGljYWwgdG8gdGhlIHNpNDcweCBTaWxpY29uIExhYnMgVVNCIEZNIFJhZGlvIFJlZmVyZW5jZQorICogRGVzaWduIGJvYXJkLCBldmVuIHRob3VnaCB0aGlzIGNhcmQgaGFzIGEgc2k0NzM0IGRldmljZS4gQ2xlYXJseSB0aGUKKyAqIGRlc2lnbmVyIG9mIHRoaXMgcHJvZHVjdCBuZXZlciBib3RoZXJlZCB0byBjaGFuZ2UgdGhlIFVTQiBJRHMuCisgKi8KKworLyogVVNCIERldmljZSBJRCBMaXN0ICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX3JhcmVtb25vX2RldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDEwYzQsIDB4ODE4YSwgVVNCX0NMQVNTX0hJRCwgMCwgMCkgfSwKKwl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9yYXJlbW9ub19kZXZpY2VfdGFibGUpOworCisjZGVmaW5lIEJVRkZFUl9MRU5HVEggNjQKKworLyogVGltZW91dCBpcyBzZXQgdG8gYSBoaWdoIHZhbHVlLCBjb3VsZCBwcm9iYWJseSBiZSByZWR1Y2VkLiBOZWVkIG1vcmUgdGVzdHMgKi8KKyNkZWZpbmUgVVNCX1RJTUVPVVQgMTAwMDAKKworLyogRnJlcXVlbmN5IGxpbWl0cyBpbiBLSHogKi8KKyNkZWZpbmUgRk1fRlJFUV9SQU5HRV9MT1cJNjQwMDAKKyNkZWZpbmUgRk1fRlJFUV9SQU5HRV9ISUdICTEwODAwMAorCisjZGVmaW5lIEFNX0ZSRVFfUkFOR0VfTE9XCTUyMAorI2RlZmluZSBBTV9GUkVRX1JBTkdFX0hJR0gJMTcxMAorCisjZGVmaW5lIFNXX0ZSRVFfUkFOR0VfTE9XCTIzMDAKKyNkZWZpbmUgU1dfRlJFUV9SQU5HRV9ISUdICTI2MTAwCisKK2VudW0geyBCQU5EX0ZNLCBCQU5EX0FNLCBCQU5EX1NXIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3lfYmFuZCBiYW5kc1tdID0geworCS8qIEJhbmQgRk0gKi8KKwl7CisJCS50eXBlID0gVjRMMl9UVU5FUl9SQURJTywKKwkJLmluZGV4ID0gMCwKKwkJLmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAorCQkJICAgICAgVjRMMl9UVU5FUl9DQVBfRlJFUV9CQU5EUywKKwkJLnJhbmdlbG93ICAgPSBGTV9GUkVRX1JBTkdFX0xPVyAqIDE2LAorCQkucmFuZ2VoaWdoICA9IEZNX0ZSRVFfUkFOR0VfSElHSCAqIDE2LAorCQkubW9kdWxhdGlvbiA9IFY0TDJfQkFORF9NT0RVTEFUSU9OX0ZNLAorCX0sCisJLyogQmFuZCBBTSAqLworCXsKKwkJLnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPLAorCQkuaW5kZXggPSAxLAorCQkuY2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVyB8IFY0TDJfVFVORVJfQ0FQX0ZSRVFfQkFORFMsCisJCS5yYW5nZWxvdyAgID0gQU1fRlJFUV9SQU5HRV9MT1cgKiAxNiwKKwkJLnJhbmdlaGlnaCAgPSBBTV9GUkVRX1JBTkdFX0hJR0ggKiAxNiwKKwkJLm1vZHVsYXRpb24gPSBWNEwyX0JBTkRfTU9EVUxBVElPTl9BTSwKKwl9LAorCS8qIEJhbmQgU1cgKi8KKwl7CisJCS50eXBlID0gVjRMMl9UVU5FUl9SQURJTywKKwkJLmluZGV4ID0gMiwKKwkJLmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9GUkVRX0JBTkRTLAorCQkucmFuZ2Vsb3cgICA9IFNXX0ZSRVFfUkFOR0VfTE9XICogMTYsCisJCS5yYW5nZWhpZ2ggID0gU1dfRlJFUV9SQU5HRV9ISUdIICogMTYsCisJCS5tb2R1bGF0aW9uID0gVjRMMl9CQU5EX01PRFVMQVRJT05fQU0sCisJfSwKK307CisKK3N0cnVjdCByYXJlbW9ub19kZXZpY2UgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXU4ICpidWZmZXI7CisJdTMyIGJhbmQ7CisJdW5zaWduZWQgY3VyZnJlcTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJhcmVtb25vX2RldmljZSAqdG9fcmFyZW1vbm9fZGV2KHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2NGwyX2Rldiwgc3RydWN0IHJhcmVtb25vX2RldmljZSwgdjRsMl9kZXYpOworfQorCisvKiBTZXQgZnJlcXVlbmN5LiAqLworc3RhdGljIGludCByYXJlbW9ub19jbWRfbWFpbihzdHJ1Y3QgcmFyZW1vbm9fZGV2aWNlICpyYWRpbywgdW5zaWduZWQgYmFuZCwgdW5zaWduZWQgZnJlcSkKK3sKKwl1bnNpZ25lZCBiYW5kX29mZnNldDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBCQU5EX0ZNOgorCQliYW5kX29mZnNldCA9IDE7CisJCWZyZXEgLz0gMTA7CisJCWJyZWFrOworCWNhc2UgQkFORF9BTToKKwkJYmFuZF9vZmZzZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliYW5kX29mZnNldCA9IDI7CisJCWJyZWFrOworCX0KKwlyYWRpby0+YnVmZmVyWzBdID0gMHgwNCArIGJhbmRfb2Zmc2V0OworCXJhZGlvLT5idWZmZXJbMV0gPSBmcmVxID4+IDg7CisJcmFkaW8tPmJ1ZmZlclsyXSA9IGZyZXEgJiAweGZmOworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9zbmRjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJCUhJRF9SRVFfU0VUX1JFUE9SVCwKKwkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAorCQkJMHgwMzAwICsgcmFkaW8tPmJ1ZmZlclswXSwgMiwKKwkJCXJhZGlvLT5idWZmZXIsIDMsIFVTQl9USU1FT1VUKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl93YXJuKHJhZGlvLT52NGwyX2Rldi5kZXYsICIlcyBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJhZGlvLT5jdXJmcmVxID0gKGJhbmQgPT0gQkFORF9GTSkgPyBmcmVxICogMTAgOiBmcmVxOworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdW5wbHVnZ2luZyB0aGUgZGV2aWNlLgorICogV2UgY2FsbCB2aWRlb191bnJlZ2lzdGVyX2RldmljZSBpbiBhbnkgY2FzZS4KKyAqIFRoZSBsYXN0IGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGlzIHByb2NlZHVyZSBpcworICogdXNiX3JhcmVtb25vX2RldmljZV9yZWxlYXNlLgorICovCitzdGF0aWMgdm9pZCB1c2JfcmFyZW1vbm9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgcmFyZW1vbm9fZGV2aWNlICpyYWRpbyA9IHRvX3JhcmVtb25vX2Rldih1c2JfZ2V0X2ludGZkYXRhKGludGYpKTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJUaGFua28ncyBSYXJlbW9ubyBkaXNjb25uZWN0ZWRcbiIpOworCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnJhZGlvLT52ZGV2KTsKKwl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZyYWRpby0+djRsMl9kZXYpOworCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCXY0bDJfZGV2aWNlX3B1dCgmcmFkaW8tPnY0bDJfZGV2KTsKK30KKworLyoKKyAqIExpbnV4IFZpZGVvIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKK3sKKwlzdHJ1Y3QgcmFyZW1vbm9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXJhcmVtb25vIiwgc2l6ZW9mKHYtPmRyaXZlcikpOworCXN0cmxjcHkodi0+Y2FyZCwgIlRoYW5rbydzIFJhcmVtb25vIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKKwl2LT5kZXZpY2VfY2FwcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CisJdi0+Y2FwYWJpbGl0aWVzID0gdi0+ZGV2aWNlX2NhcHMgfCBWNEwyX0NBUF9ERVZJQ0VfQ0FQUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mcmVxX2JhbmRzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3lfYmFuZCAqYmFuZCkKK3sKKwlpZiAoYmFuZC0+dHVuZXIgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYmFuZC0+aW5kZXggPj0gQVJSQVlfU0laRShiYW5kcykpCisJCXJldHVybiAtRUlOVkFMOworCisJKmJhbmQgPSBiYW5kc1tiYW5kLT5pbmRleF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJc3RydWN0IHJhcmVtb25vX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQ7CisKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmxjcHkodi0+bmFtZSwgIkFNL0ZNL1NXIiwgc2l6ZW9mKHYtPm5hbWUpKTsKKwl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTE9XIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwKKwkJVjRMMl9UVU5FUl9DQVBfRlJFUV9CQU5EUzsKKwl2LT5yYW5nZWxvdyA9IEFNX0ZSRVFfUkFOR0VfTE9XICogMTY7CisJdi0+cmFuZ2VoaWdoID0gRk1fRlJFUV9SQU5HRV9ISUdIICogMTY7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTyB8IFY0TDJfVFVORVJfU1VCX01PTk87CisJdi0+YXVkbW9kZSA9IChyYWRpby0+Y3VyZnJlcSA8IEZNX0ZSRVFfUkFOR0VfTE9XKSA/CisJCVY0TDJfVFVORVJfTU9ERV9NT05PIDogVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwltZW1zZXQocmFkaW8tPmJ1ZmZlciwgMSwgQlVGRkVSX0xFTkdUSCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJCTEsIDB4YTEsIDB4MDMwZCwgMiwgcmFkaW8tPmJ1ZmZlciwgQlVGRkVSX0xFTkdUSCwgVVNCX1RJTUVPVVQpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X3dhcm4ocmFkaW8tPnY0bDJfZGV2LmRldiwgIiVzIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdi0+c2lnbmFsID0gKChyYWRpby0+YnVmZmVyWzFdICYgMHhmKSA8PCA4IHwgcmFkaW8tPmJ1ZmZlclsyXSkgPDwgNDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJY29uc3Qgc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJcmV0dXJuIHYtPmluZGV4ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgcmFyZW1vbm9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJdTMyIGZyZXEgPSBmLT5mcmVxdWVuY3k7CisJdW5zaWduZWQgYmFuZDsKKworCWlmIChmLT50dW5lciAhPSAwIHx8IGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9SQURJTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZi0+ZnJlcXVlbmN5ID49IChGTV9GUkVRX1JBTkdFX0xPVyArIFNXX0ZSRVFfUkFOR0VfSElHSCkgKiA4KQorCQliYW5kID0gQkFORF9GTTsKKwllbHNlIGlmIChmLT5mcmVxdWVuY3kgPD0gKEFNX0ZSRVFfUkFOR0VfSElHSCArIFNXX0ZSRVFfUkFOR0VfTE9XKSAqIDgpCisJCWJhbmQgPSBCQU5EX0FNOworCWVsc2UKKwkJYmFuZCA9IEJBTkRfU1c7CisKKwlmcmVxID0gY2xhbXBfdCh1MzIsIGYtPmZyZXF1ZW5jeSwgYmFuZHNbYmFuZF0ucmFuZ2Vsb3csIGJhbmRzW2JhbmRdLnJhbmdlaGlnaCk7CisJcmV0dXJuIHJhcmVtb25vX2NtZF9tYWluKHJhZGlvLCBiYW5kLCBmcmVxIC8gMTYpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHJhcmVtb25vX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJaWYgKGYtPnR1bmVyICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IHJhZGlvLT5jdXJmcmVxICogMTY7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGUgc3lzdGVtIGludGVyZmFjZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB1c2JfcmFyZW1vbm9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gdjRsMl9maF9vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IHY0bDJfZmhfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHVzYl9yYXJlbW9ub19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcCA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19lbnVtX2ZyZXFfYmFuZHMgPSB2aWRpb2NfZW51bV9mcmVxX2JhbmRzLAorfTsKKworLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50IGFuZCByZWdpc3RlciB3aXRoIHY0bCBhbmQgdXNiIGlmIGl0IGlzICovCitzdGF0aWMgaW50IHVzYl9yYXJlbW9ub19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJhcmVtb25vX2RldmljZSAqcmFkaW87CisJaW50IHJldHZhbCA9IDA7CisKKwlyYWRpbyA9IGRldm1fa3phbGxvYygmaW50Zi0+ZGV2LCBzaXplb2Yoc3RydWN0IHJhcmVtb25vX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChyYWRpbykKKwkJcmFkaW8tPmJ1ZmZlciA9IGRldm1fa21hbGxvYygmaW50Zi0+ZGV2LCBCVUZGRVJfTEVOR1RILCBHRlBfS0VSTkVMKTsKKworCWlmICghcmFkaW8gfHwgIXJhZGlvLT5idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmFkaW8tPnVzYmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJcmFkaW8tPmludGYgPSBpbnRmOworCisJLyoKKwkgKiBUaGlzIGRldmljZSB1c2VzIHRoZSBzYW1lIFVTQiBJRHMgYXMgdGhlIHNpNDcweCBTaUxhYnMgcmVmZXJlbmNlCisJICogZGVzaWduLiBTbyBkbyBhbiBhZGRpdGlvbmFsIGNoZWNrOiBhdHRlbXB0IHRvIHJlYWQgdGhlIGRldmljZSBJRAorCSAqIGZyb20gdGhlIHNpNDcweDogdGhlIGxvd2VyIDEyIGJpdHMgYXJlIDB4MDI0MiBmb3IgdGhlIHNpNDcweC4gVGhlCisJICogUmFyZW1vbm8gYWx3YXlzIHJldHVybnMgMHgwODAwICh0aGUgbWVhbmluZyBvZiB0aGF0IGlzIHVua25vd24sIGJ1dAorCSAqIGF0IGxlYXN0IGl0IHdvcmtzKS4KKwkgKgorCSAqIFdlIHVzZSB0aGlzIGNoZWNrIHRvIGRldGVybWluZSB3aGljaCBkZXZpY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aC4KKwkgKi8KKwltc2xlZXAoMjApOworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LAorCQl1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCUhJRF9SRVFfR0VUX1JFUE9SVCwKKwkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9JTiwKKwkJMSwgMiwKKwkJcmFkaW8tPmJ1ZmZlciwgMywgNTAwKTsKKwlpZiAocmV0dmFsICE9IDMgfHwKKwkgICAgKGdldF91bmFsaWduZWRfYmUxNigmcmFkaW8tPmJ1ZmZlclsxXSkgJiAweGZmZikgPT0gMHgwMjQyKSB7CisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICJ0aGlzIGlzIG5vdCBUaGFua28ncyBSYXJlbW9uby5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVGhhbmtvJ3MgUmFyZW1vbm8gY29ubmVjdGVkOiAoJTA0WDolMDRYKVxuIiwKKwkJCWlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CisKKwlyZXR2YWwgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmaW50Zi0+ZGV2LCAmcmFkaW8tPnY0bDJfZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCByZWdpc3RlciB2NGwyX2RldmljZVxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJbXV0ZXhfaW5pdCgmcmFkaW8tPmxvY2spOworCisJc3RybGNweShyYWRpby0+dmRldi5uYW1lLCByYWRpby0+djRsMl9kZXYubmFtZSwKKwkJc2l6ZW9mKHJhZGlvLT52ZGV2Lm5hbWUpKTsKKwlyYWRpby0+dmRldi52NGwyX2RldiA9ICZyYWRpby0+djRsMl9kZXY7CisJcmFkaW8tPnZkZXYuZm9wcyA9ICZ1c2JfcmFyZW1vbm9fZm9wczsKKwlyYWRpby0+dmRldi5pb2N0bF9vcHMgPSAmdXNiX3JhcmVtb25vX2lvY3RsX29wczsKKwlyYWRpby0+dmRldi5sb2NrID0gJnJhZGlvLT5sb2NrOworCXJhZGlvLT52ZGV2LnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgJnJhZGlvLT52NGwyX2Rldik7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmcmFkaW8tPnZkZXYsIHJhZGlvKTsKKwlzZXRfYml0KFY0TDJfRkxfVVNFX0ZIX1BSSU8sICZyYWRpby0+dmRldi5mbGFncyk7CisKKwlyYXJlbW9ub19jbWRfbWFpbihyYWRpbywgQkFORF9GTSwgOTUxNjApOworCisJcmV0dmFsID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZyYWRpby0+dmRldiwgVkZMX1RZUEVfUkFESU8sIC0xKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJZGV2X2luZm8oJmludGYtPmRldiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgJXNcbiIsCisJCQkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSgmcmFkaW8tPnZkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCWRldl9lcnIoJmludGYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnJhZGlvLT52NGwyX2Rldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVVNCIHN1YnN5c3RlbSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfcmFyZW1vbm9fZHJpdmVyID0geworCS5uYW1lCQkJPSAicmFkaW8tcmFyZW1vbm8iLAorCS5wcm9iZQkJCT0gdXNiX3JhcmVtb25vX3Byb2JlLAorCS5kaXNjb25uZWN0CQk9IHVzYl9yYXJlbW9ub19kaXNjb25uZWN0LAorCS5pZF90YWJsZQkJPSB1c2JfcmFyZW1vbm9fZGV2aWNlX3RhYmxlLAorfTsKKworbW9kdWxlX3VzYl9kcml2ZXIodXNiX3JhcmVtb25vX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKaW5kZXggZDZkNGQ2MC4uMDdlZjQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwpAQCAtMTM3LDYgKzEzNyw4IEBACiAvKiBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50IDIgZXZlcnkgMSBtaWxsaXNlY29uZCAqLwogI2RlZmluZSBVTlVTRURfUkVQT1JUCQkyMwogCisjZGVmaW5lIE1BWF9SRVBPUlRfU0laRQkJNjQKKwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjA4LDcgKzIxMCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2k0NzB4X2dldF9yZXBvcnQoc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvLCB2b2lkICpidWYsIGludCBzaXplKQogewotCXVuc2lnbmVkIGNoYXIgKnJlcG9ydCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpyZXBvcnQgPSBidWY7CiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LApAQCAtMjMxLDcgKzIzMyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2k0NzB4X3NldF9yZXBvcnQoc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvLCB2b2lkICpidWYsIGludCBzaXplKQogewotCXVuc2lnbmVkIGNoYXIgKnJlcG9ydCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpyZXBvcnQgPSBidWY7CiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LApAQCAtMjU0LDE1ICsyNTYsMTQgQEAKICAqLwogaW50IHNpNDcweF9nZXRfcmVnaXN0ZXIoc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvLCBpbnQgcmVnbnIpCiB7Ci0JdW5zaWduZWQgY2hhciBidWZbUkVHSVNURVJfUkVQT1JUX1NJWkVdOwogCWludCByZXR2YWw7CiAKLQlidWZbMF0gPSBSRUdJU1RFUl9SRVBPUlQocmVnbnIpOworCXJhZGlvLT51c2JfYnVmWzBdID0gUkVHSVNURVJfUkVQT1JUKHJlZ25yKTsKIAotCXJldHZhbCA9IHNpNDcweF9nZXRfcmVwb3J0KHJhZGlvLCAodm9pZCAqKSAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dmFsID0gc2k0NzB4X2dldF9yZXBvcnQocmFkaW8sIHJhZGlvLT51c2JfYnVmLCBSRUdJU1RFUl9SRVBPUlRfU0laRSk7CiAKIAlpZiAocmV0dmFsID49IDApCi0JCXJhZGlvLT5yZWdpc3RlcnNbcmVnbnJdID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZidWZbMV0pOworCQlyYWRpby0+cmVnaXN0ZXJzW3JlZ25yXSA9IGdldF91bmFsaWduZWRfYmUxNigmcmFkaW8tPnVzYl9idWZbMV0pOwogCiAJcmV0dXJuIChyZXR2YWwgPCAwKSA/IC1FSU5WQUwgOiAwOwogfQpAQCAtMjczLDEzICsyNzQsMTIgQEAKICAqLwogaW50IHNpNDcweF9zZXRfcmVnaXN0ZXIoc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvLCBpbnQgcmVnbnIpCiB7Ci0JdW5zaWduZWQgY2hhciBidWZbUkVHSVNURVJfUkVQT1JUX1NJWkVdOwogCWludCByZXR2YWw7CiAKLQlidWZbMF0gPSBSRUdJU1RFUl9SRVBPUlQocmVnbnIpOwotCXB1dF91bmFsaWduZWRfYmUxNihyYWRpby0+cmVnaXN0ZXJzW3JlZ25yXSwgJmJ1ZlsxXSk7CisJcmFkaW8tPnVzYl9idWZbMF0gPSBSRUdJU1RFUl9SRVBPUlQocmVnbnIpOworCXB1dF91bmFsaWduZWRfYmUxNihyYWRpby0+cmVnaXN0ZXJzW3JlZ25yXSwgJnJhZGlvLT51c2JfYnVmWzFdKTsKIAotCXJldHZhbCA9IHNpNDcweF9zZXRfcmVwb3J0KHJhZGlvLCAodm9pZCAqKSAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dmFsID0gc2k0NzB4X3NldF9yZXBvcnQocmFkaW8sIHJhZGlvLT51c2JfYnVmLCBSRUdJU1RFUl9SRVBPUlRfU0laRSk7CiAKIAlyZXR1cm4gKHJldHZhbCA8IDApID8gLUVJTlZBTCA6IDA7CiB9CkBAIC0yOTUsMTggKzI5NSwxNyBAQAogICovCiBzdGF0aWMgaW50IHNpNDcweF9nZXRfYWxsX3JlZ2lzdGVycyhzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8pCiB7Ci0JdW5zaWduZWQgY2hhciBidWZbRU5USVJFX1JFUE9SVF9TSVpFXTsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgcmVnbnI7CiAKLQlidWZbMF0gPSBFTlRJUkVfUkVQT1JUOworCXJhZGlvLT51c2JfYnVmWzBdID0gRU5USVJFX1JFUE9SVDsKIAotCXJldHZhbCA9IHNpNDcweF9nZXRfcmVwb3J0KHJhZGlvLCAodm9pZCAqKSAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dmFsID0gc2k0NzB4X2dldF9yZXBvcnQocmFkaW8sIHJhZGlvLT51c2JfYnVmLCBFTlRJUkVfUkVQT1JUX1NJWkUpOwogCiAJaWYgKHJldHZhbCA+PSAwKQogCQlmb3IgKHJlZ25yID0gMDsgcmVnbnIgPCBSQURJT19SRUdJU1RFUl9OVU07IHJlZ25yKyspCiAJCQlyYWRpby0+cmVnaXN0ZXJzW3JlZ25yXSA9IGdldF91bmFsaWduZWRfYmUxNigKLQkJCQkmYnVmW3JlZ25yICogUkFESU9fUkVHSVNURVJfU0laRSArIDFdKTsKKwkJCQkmcmFkaW8tPnVzYl9idWZbcmVnbnIgKiBSQURJT19SRUdJU1RFUl9TSVpFICsgMV0pOwogCiAJcmV0dXJuIChyZXR2YWwgPCAwKSA/IC1FSU5WQUwgOiAwOwogfQpAQCAtMzIzLDE0ICszMjIsMTMgQEAKIHN0YXRpYyBpbnQgc2k0NzB4X3NldF9sZWRfc3RhdGUoc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvLAogCQl1bnNpZ25lZCBjaGFyIGxlZF9zdGF0ZSkKIHsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltMRURfUkVQT1JUX1NJWkVdOwogCWludCByZXR2YWw7CiAKLQlidWZbMF0gPSBMRURfUkVQT1JUOwotCWJ1ZlsxXSA9IExFRF9DT01NQU5EOwotCWJ1ZlsyXSA9IGxlZF9zdGF0ZTsKKwlyYWRpby0+dXNiX2J1ZlswXSA9IExFRF9SRVBPUlQ7CisJcmFkaW8tPnVzYl9idWZbMV0gPSBMRURfQ09NTUFORDsKKwlyYWRpby0+dXNiX2J1ZlsyXSA9IGxlZF9zdGF0ZTsKIAotCXJldHZhbCA9IHNpNDcweF9zZXRfcmVwb3J0KHJhZGlvLCAodm9pZCAqKSAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dmFsID0gc2k0NzB4X3NldF9yZXBvcnQocmFkaW8sIHJhZGlvLT51c2JfYnVmLCBMRURfUkVQT1JUX1NJWkUpOwogCiAJcmV0dXJuIChyZXR2YWwgPCAwKSA/IC1FSU5WQUwgOiAwOwogfQpAQCAtMzQ2LDE5ICszNDQsMTggQEAKICAqLwogc3RhdGljIGludCBzaTQ3MHhfZ2V0X3NjcmF0Y2hfcGFnZV92ZXJzaW9ucyhzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8pCiB7Ci0JdW5zaWduZWQgY2hhciBidWZbU0NSQVRDSF9SRVBPUlRfU0laRV07CiAJaW50IHJldHZhbDsKIAotCWJ1ZlswXSA9IFNDUkFUQ0hfUkVQT1JUOworCXJhZGlvLT51c2JfYnVmWzBdID0gU0NSQVRDSF9SRVBPUlQ7CiAKLQlyZXR2YWwgPSBzaTQ3MHhfZ2V0X3JlcG9ydChyYWRpbywgKHZvaWQgKikgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldHZhbCA9IHNpNDcweF9nZXRfcmVwb3J0KHJhZGlvLCByYWRpby0+dXNiX2J1ZiwgU0NSQVRDSF9SRVBPUlRfU0laRSk7CiAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZGV2X3dhcm4oJnJhZGlvLT5pbnRmLT5kZXYsICJzaTQ3MHhfZ2V0X3NjcmF0Y2g6ICIKIAkJCSJzaTQ3MHhfZ2V0X3JlcG9ydCByZXR1cm5lZCAlZFxuIiwgcmV0dmFsKTsKIAllbHNlIHsKLQkJcmFkaW8tPnNvZnR3YXJlX3ZlcnNpb24gPSBidWZbMV07Ci0JCXJhZGlvLT5oYXJkd2FyZV92ZXJzaW9uID0gYnVmWzJdOworCQlyYWRpby0+c29mdHdhcmVfdmVyc2lvbiA9IHJhZGlvLT51c2JfYnVmWzFdOworCQlyYWRpby0+aGFyZHdhcmVfdmVyc2lvbiA9IHJhZGlvLT51c2JfYnVmWzJdOwogCX0KIAogCXJldHVybiAocmV0dmFsIDwgMCkgPyAtRUlOVkFMIDogMDsKQEAgLTUwOSw2ICs1MDYsNyBAQAogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnJhZGlvLT52NGwyX2Rldik7CiAJa2ZyZWUocmFkaW8tPmludF9pbl9idWZmZXIpOwogCWtmcmVlKHJhZGlvLT5idWZmZXIpOworCWtmcmVlKHJhZGlvLT51c2JfYnVmKTsKIAlrZnJlZShyYWRpbyk7CiB9CiAKQEAgLTU5Myw2ICs1OTEsMTEgQEAKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW5pdGlhbDsKIAl9CisJcmFkaW8tPnVzYl9idWYgPSBrbWFsbG9jKE1BWF9SRVBPUlRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJhZGlvLT51c2JfYnVmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmFkaW87CisJfQogCXJhZGlvLT51c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXJhZGlvLT5pbnRmID0gaW50ZjsKIAlyYWRpby0+YmFuZCA9IDE7IC8qIERlZmF1bHQgdG8gNzYgLSAxMDggTUh6ICovCkBAIC02MTIsNyArNjE1LDcgQEAKIAlpZiAoIXJhZGlvLT5pbnRfaW5fZW5kcG9pbnQpIHsKIAkJZGV2X2luZm8oJmludGYtPmRldiwgImNvdWxkIG5vdCBmaW5kIGludGVycnVwdCBpbiBlbmRwb2ludFxuIik7CiAJCXJldHZhbCA9IC1FSU87Ci0JCWdvdG8gZXJyX3JhZGlvOworCQlnb3RvIGVycl91c2JidWY7CiAJfQogCiAJaW50X2VuZF9zaXplID0gbGUxNl90b19jcHUocmFkaW8tPmludF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOwpAQCAtNjIxLDcgKzYyNCw3IEBACiAJaWYgKCFyYWRpby0+aW50X2luX2J1ZmZlcikgewogCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIGludF9pbl9idWZmZXIiKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmFkaW87CisJCWdvdG8gZXJyX3VzYmJ1ZjsKIAl9CiAKIAlyYWRpby0+aW50X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CkBAIC02MzIsNiArNjM1LDMwIEBACiAJfQogCiAJcmFkaW8tPnY0bDJfZGV2LnJlbGVhc2UgPSBzaTQ3MHhfdXNiX3JlbGVhc2U7CisKKwkvKgorCSAqIFRoZSBzaTQ3MHggU2lMYWJzIHJlZmVyZW5jZSBkZXNpZ24gdXNlcyB0aGUgc2FtZSBVU0IgSURzIGFzCisJICogJ1RoYW5rbydzIFJhcmVtb25vJyBzaTQ3MzQgYmFzZWQgcmVjZWl2ZXIuIFNvIGNoZWNrIGhlcmUgd2hpY2ggd2UKKwkgKiBoYXZlOiBhdHRlbXB0IHRvIHJlYWQgdGhlIGRldmljZSBJRCBmcm9tIHRoZSBzaTQ3MHg6IHRoZSBsb3dlciAxMgorCSAqIGJpdHMgc2hvdWxkIGJlIDB4MDI0MiBmb3IgdGhlIHNpNDcweC4KKwkgKgorCSAqIFdlIHVzZSB0aGlzIGNoZWNrIHRvIGRldGVybWluZSB3aGljaCBkZXZpY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aC4KKwkgKi8KKwlpZiAoaWQtPmlkVmVuZG9yID09IDB4MTBjNCAmJiBpZC0+aWRQcm9kdWN0ID09IDB4ODE4YSkgeworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwKKwkJCQl1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCQkJSElEX1JFUV9HRVRfUkVQT1JULAorCQkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCisJCQkJMSwgMiwKKwkJCQlyYWRpby0+dXNiX2J1ZiwgMywgNTAwKTsKKwkJaWYgKHJldHZhbCAhPSAzIHx8CisJCSAgICAoZ2V0X3VuYWxpZ25lZF9iZTE2KCZyYWRpby0+dXNiX2J1ZlsxXSkgJiAweGZmZikgIT0gMHgwMjQyKSB7CisJCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAidGhpcyBpcyBub3QgYSBzaTQ3MHggZGV2aWNlLlxuIik7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJZ290byBlcnJfdXJiOworCQl9CisJfQorCiAJcmV0dmFsID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmludGYtPmRldiwgJnJhZGlvLT52NGwyX2Rldik7CiAJaWYgKHJldHZhbCA8IDApIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgcmVnaXN0ZXIgdjRsMl9kZXZpY2VcbiIpOwpAQCAtNzQzLDYgKzc3MCw4IEBACiAJdXNiX2ZyZWVfdXJiKHJhZGlvLT5pbnRfaW5fdXJiKTsKIGVycl9pbnRidWZmZXI6CiAJa2ZyZWUocmFkaW8tPmludF9pbl9idWZmZXIpOworZXJyX3VzYmJ1ZjoKKwlrZnJlZShyYWRpby0+dXNiX2J1Zik7CiBlcnJfcmFkaW86CiAJa2ZyZWUocmFkaW8pOwogZXJyX2luaXRpYWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHguaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCmluZGV4IDQ2N2U5NTUuLjRiNzY2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCkBAIC0xNjcsNiArMTY3LDcgQEAKIAkvKiByZWZlcmVuY2UgdG8gVVNCIGFuZCB2aWRlbyBkZXZpY2UgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCWNoYXIgKnVzYl9idWY7CiAKIAkvKiBJbnRlcnJ1cHQgZW5kcG9pbnQgaGFuZGxpbmcgKi8KIAljaGFyICppbnRfaW5fYnVmZmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjM2JhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL0tjb25maWcKQEAgLTAsMCArMSw0MCBAQAorY29uZmlnIFVTQl9TSTQ3MTMKKwl0cmlzdGF0ZSAiU2lsaWNvbiBMYWJzIFNpNDcxMyBGTSBSYWRpbyBUcmFuc21pdHRlciBzdXBwb3J0IHdpdGggVVNCIgorCWRlcGVuZHMgb24gVVNCICYmIFJBRElPX1NJNDcxMworCXNlbGVjdCBTSTQ3MTMKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBVU0IgZGV2aWNlcyB3aXRoIHRoZSBTaWxpY29uIExhYnMgU0k0NzEzCisJICBjaGlwLiBDdXJyZW50bHkgdGhlc2UgZGV2aWNlcyBhcmUga25vd24gdG8gd29yay4KKwkgIC0gMTBjNDo4MjQ0OiBTaWxpY29uIExhYnMgRk0gVHJhbnNtaXR0ZXIgVVNCIGRldmljZS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiByYWRpbyB0byB5b3VyCisJICBjb21wdXRlcidzIFVTQiBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByYWRpby11c2Itc2k0NzEzLgorCitjb25maWcgUExBVEZPUk1fU0k0NzEzCisJdHJpc3RhdGUgIlNpbGljb24gTGFicyBTaTQ3MTMgRk0gUmFkaW8gVHJhbnNtaXR0ZXIgc3VwcG9ydCB3aXRoIEkyQyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBSQURJT19TSTQ3MTMKKwlzZWxlY3QgU0k0NzEzCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgSTJDIGRldmljZXMgd2l0aCB0aGUgU2lsaWNvbiBMYWJzIFNJNDcxMworCSAgY2hpcC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiByYWRpbyB0byB5b3VyCisJICBjb21wdXRlcidzIEkyQyBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByYWRpby1wbGF0Zm9ybS1zaTQ3MTMuCisKK2NvbmZpZyBJMkNfU0k0NzEzCisJdHJpc3RhdGUgIlNpbGljb24gTGFicyBTaTQ3MTMgRk0gUmFkaW8gVHJhbnNtaXR0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBSQURJT19TSTQ3MTMKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgdG8gU2k0NzEzIEZNIFJhZGlvIFRyYW5zbWl0dGVyLgorCSAgVGhpcyBkZXZpY2UgY2FuIHRyYW5zbWl0IGF1ZGlvIHRocm91Z2ggRk0uIEl0IGNhbiB0cmFuc21pdAorCSAgUkRTIGFuZCBSQkRTIHNpZ25hbHMgYXMgd2VsbC4gVGhpcyBtb2R1bGUgaXMgdGhlIHY0bDIgcmFkaW8KKwkgIGludGVyZmFjZSBmb3IgdGhlIGkyYyBkcml2ZXIgb2YgdGhpcyBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpNDcxMy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhYWY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgcmFkaW9zIHdpdGggU2lsaWNvbiBMYWJzIFNpNDcxMyBGTSBSYWRpbyBUcmFuc21pdHRlcnMKKyMKKworb2JqLSQoQ09ORklHX0kyQ19TSTQ3MTMpICs9IHNpNDcxMy5vCitvYmotJChDT05GSUdfVVNCX1NJNDcxMykgKz0gcmFkaW8tdXNiLXNpNDcxMy5vCitvYmotJChDT05GSUdfUExBVEZPUk1fU0k0NzEzKSArPSByYWRpby1wbGF0Zm9ybS1zaTQ3MTMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MTMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL3JhZGlvLXBsYXRmb3JtLXNpNDcxMy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNpNDcxMy5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy9yYWRpby1wbGF0Zm9ybS1zaTQ3MTMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvcmFkaW8tdXNiLXNpNDcxMy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvcmFkaW8tdXNiLXNpNDcxMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTg1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy9yYWRpby11c2Itc2k0NzEzLmMKQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBDaXNjbyBTeXN0ZW1zLCBJbmMuIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKiBrZXJuZWwgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKy8qIFY0bCBpbmNsdWRlcyAqLworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3NpNDcxMy5oPgorCisjaW5jbHVkZSAic2k0NzEzLmgiCisKKy8qIGRyaXZlciBhbmQgbW9kdWxlIGRlZmluaXRpb25zICovCitNT0RVTEVfQVVUSE9SKCJEaW5lc2ggUmFtIDxkaW5lc2gucmFtQGNlcm4uY2g+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpNDcxMyBGTSBUcmFuc21pdHRlciBVU0IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKKy8qIFRoZSBEZXZpY2UgYW5ub3VuY2VzIGl0c2VsZiBhcyBDeWduYWwgSW50ZWdyYXRlZCBQcm9kdWN0cywgSW5jLiAqLworI2RlZmluZSBVU0JfU0k0NzEzX1ZFTkRPUgkJMHgxMGM0CisjZGVmaW5lIFVTQl9TSTQ3MTNfUFJPRFVDVAkJMHg4MjQ0CisKKyNkZWZpbmUgQlVGRkVSX0xFTkdUSAkJCTY0CisjZGVmaW5lIFVTQl9USU1FT1VUCQkJMTAwMAorI2RlZmluZSBVU0JfUkVTUF9USU1FT1VUCQk1MDAwMAorCisvKiBVU0IgRGV2aWNlIElEIExpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2Jfc2k0NzEzX3VzYl9kZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1NJNDcxM19WRU5ET1IsIFVTQl9TSTQ3MTNfUFJPRFVDVCwKKwkJCQkJCQlVU0JfQ0xBU1NfSElELCAwLCAwKSB9LAorCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3NpNDcxM191c2JfZGV2aWNlX3RhYmxlKTsKKworc3RydWN0IHNpNDcxM191c2JfZGV2aWNlIHsKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdXNiZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCXN0cnVjdCB2aWRlb19kZXZpY2UJdmRldjsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UJdjRsMl9kZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2CSp2NGwyX3N1YmRldjsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJc3RydWN0IGkyY19hZGFwdGVyCWkyY19hZGFwdGVyOworCisJdTgJCQkqYnVmZmVyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UgKnRvX3NpNDcxM19kZXYoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UsIHY0bDJfZGV2KTsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCit7CisJc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXVzYi1zaTQ3MTMiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CisJc3RybGNweSh2LT5jYXJkLCAiU2k0NzEzIEZNIFRyYW5zbWl0dGVyIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKKwl2LT5kZXZpY2VfY2FwcyA9IFY0TDJfQ0FQX01PRFVMQVRPUiB8IFY0TDJfQ0FQX1JEU19PVVRQVVQ7CisJdi0+Y2FwYWJpbGl0aWVzID0gdi0+ZGV2aWNlX2NhcHMgfCBWNEwyX0NBUF9ERVZJQ0VfQ0FQUzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX21vZHVsYXRvcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKnZtKQoreworCXN0cnVjdCBzaTQ3MTNfdXNiX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwocmFkaW8tPnY0bDJfc3ViZGV2LCB0dW5lciwgZ19tb2R1bGF0b3IsIHZtKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19tb2R1bGF0b3Ioc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJY29uc3Qgc3RydWN0IHY0bDJfbW9kdWxhdG9yICp2bSkKK3sKKwlzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHJhZGlvLT52NGwyX3N1YmRldiwgdHVuZXIsIHNfbW9kdWxhdG9yLCB2bSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqdmYpCit7CisJc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChyYWRpby0+djRsMl9zdWJkZXYsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgdmYpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKnZmKQoreworCXN0cnVjdCBzaTQ3MTNfdXNiX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwocmFkaW8tPnY0bDJfc3ViZGV2LCB0dW5lciwgZ19mcmVxdWVuY3ksIHZmKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB1c2Jfc2k0NzEzX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCSAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19nX21vZHVsYXRvcgkgID0gdmlkaW9jX2dfbW9kdWxhdG9yLAorCS52aWRpb2Nfc19tb2R1bGF0b3IJICA9IHZpZGlvY19zX21vZHVsYXRvciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5CSAgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeQkgID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfbG9nX3N0YXR1cwkgID0gdjRsMl9jdHJsX2xvZ19zdGF0dXMsCisJLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgICA9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZlbnQsCisJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCit9OworCisvKiBGaWxlIHN5c3RlbSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdXNiX3NpNDcxM19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSB2NGwyX2ZoX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gdjRsMl9maF9yZWxlYXNlLAorCS5wb2xsICAgICAgICAgICA9IHY0bDJfY3RybF9wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKK307CisKK3N0YXRpYyB2b2lkIHVzYl9zaTQ3MTNfdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKK3sKKwlzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UgKnJhZGlvID0gdG9fc2k0NzEzX2Rldih2NGwyX2Rldik7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gJnJhZGlvLT5pMmNfYWRhcHRlcjsKKworCWkyY19kZWxfYWRhcHRlcihhZGFwdGVyKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZyYWRpby0+djRsMl9kZXYpOworCWtmcmVlKHJhZGlvLT5idWZmZXIpOworCWtmcmVlKHJhZGlvKTsKK30KKworLyoKKyAqIFRoaXMgY29tbWFuZCBzZXF1ZW5jZSBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBXaW5kb3dzIGRyaXZlci4KKyAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlc2UgY29tbWFuZHMgd2FzIGRldGVybWluZWQgYnkgc25pZmZpbmcgdGhlCisgKiB1c2IgdHJhZmZpYyBvZiB0aGUgZGV2aWNlIGR1cmluZyBzdGFydHVwLgorICogTW9zdCBsaWtlbHksIHRoZXNlIGNvbW1hbmRzIG1ha2Ugc29tZSBxdWVyaWVzIHRvIHRoZSBkZXZpY2UuCisgKiBDb21tYW5kcyBhcmUgc2VudCB0byBlbnF1aXJlIHBhcmFtZXRlcnMgbGlrZSB0aGUgYnVzIG1vZGUsCisgKiBjb21wb25lbnQgcmV2aXNpb24sIGJvb3QgbW9kZSwgdGhlIGRldmljZSBzZXJpYWwgbnVtYmVyIGV0Yy4KKyAqCisgKiBUaGVzZSBjb21tYW5kcyBhcmUgbmVjZXNzYXJ5IHRvIGJlIHNlbnQgaW4gdGhpcyBvcmRlciBkdXJpbmcgc3RhcnR1cC4KKyAqIFRoZSBkZXZpY2UgZmFpbHMgdG8gcG93ZXJ1cCBpZiB0aGVzZSBjb21tYW5kcyBhcmUgbm90IHNlbnQuCisgKgorICogVGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3RhcnR1cCBjb21tYW5kcyBpcyBnaXZlbiBpbiB0aGUgc3RhcnRfc2VxIHRhYmxlIGJlbG93LgorICovCitzdGF0aWMgaW50IHNpNDcxM19zZW5kX3N0YXJ0dXBfY29tbWFuZChzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UgKnJhZGlvKQoreworCXVuc2lnbmVkIGxvbmcgdW50aWxfamlmZmllcyA9IGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKFVTQl9SRVNQX1RJTUVPVVQpICsgMTsKKwl1OCAqYnVmZmVyID0gcmFkaW8tPmJ1ZmZlcjsKKwlpbnQgcmV0dmFsOworCisJLyogc2VuZCB0aGUgY29tbWFuZCAqLworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2Jfc25kY3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCQkJCTB4MDksIDB4MjEsIDB4MDMzZiwgMCwgcmFkaW8tPmJ1ZmZlciwKKwkJCQkJQlVGRkVSX0xFTkdUSCwgVVNCX1RJTUVPVVQpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZm9yICg7OykgeworCQkvKiByZWNlaXZlIHRoZSByZXNwb25zZSAqLworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkJCTB4MDEsIDB4YTEsIDB4MDMzZiwgMCwgcmFkaW8tPmJ1ZmZlciwKKwkJCQlCVUZGRVJfTEVOR1RILCBVU0JfVElNRU9VVCk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKCFyYWRpby0+YnVmZmVyWzFdKSB7CisJCQkvKiBVU0IgdHJhZmZpYyBzbmlmZmluZyBzaG93ZWQgdGhhdCBzb21lIGNvbW1hbmRzIHJlcXVpcmUKKwkJCSAqIGFkZGl0aW9uYWwgY2hlY2tzLiAqLworCQkJc3dpdGNoIChidWZmZXJbMV0pIHsKKwkJCWNhc2UgMHgzMjoKKwkJCQlpZiAocmFkaW8tPmJ1ZmZlclsyXSA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxNDoKKwkJCWNhc2UgMHgxMjoKKwkJCQlpZiAocmFkaW8tPmJ1ZmZlclsyXSAmIFNJNDcxM19DVFMpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSAweDA2OgorCQkJCWlmICgocmFkaW8tPmJ1ZmZlclsyXSAmIFNJNDcxM19DVFMpICYmIHJhZGlvLT5idWZmZXJbOV0gPT0gMHgwOCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWlmICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKHVudGlsX2ppZmZpZXMpKQorCQkJcmV0dXJuIC1FSU87CisJCW1zbGVlcCgzKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3Qgc2k0NzEzX3N0YXJ0X3NlcV90YWJsZSB7CisJaW50IGxlbjsKKwl1OCBwYXlsb2FkWzhdOworfTsKKworLyoKKyAqIFNvbWUgb2YgdGhlIHN0YXJ0dXAgY29tbWFuZHMgdGhhdCBjb3VsZCBiZSByZWNvZ25pemVkIGFyZSA6CisgKiAoMHgwMyk6IEdldCBzZXJpYWwgbnVtYmVyIG9mIHRoZSBib2FyZCAoUmVzcG9uc2UgOiBDQjAwMC0wMC0wMCkKKyAqICgweDA2LCAweDAzLCAweDAzLCAweDA4LCAweDAxLCAweDBmKSA6IEdldCBDb21wb25lbnQgcmV2aXNpb24KKyAqLworc3RhdGljIHN0cnVjdCBzaTQ3MTNfc3RhcnRfc2VxX3RhYmxlIHN0YXJ0X3NlcVtdID0geworCisJeyAxLCB7IDB4MDMgfSB9LAorCXsgMiwgeyAweDMyLCAweDdmIH0gfSwKKwl7IDYsIHsgMHgwNiwgMHgwMywgMHgwMywgMHgwOCwgMHgwMSwgMHgwZiB9IH0sCisJeyAyLCB7IDB4MTQsIDB4MDIgfSB9LAorCXsgMiwgeyAweDA5LCAweDkwIH0gfSwKKwl7IDMsIHsgMHgwOCwgMHg5MCwgMHhmYSB9IH0sCisJeyAyLCB7IDB4MzYsIDB4MDEgfSB9LAorCXsgMiwgeyAweDA1LCAweDAzIH0gfSwKKwl7IDcsIHsgMHgwNiwgMHgwMCwgMHgwNiwgMHgwZSwgMHgwMSwgMHgwZiwgMHgwNSB9IH0sCisJeyAxLCB7IDB4MTIgfSB9LAorCS8qIENvbW1hbmRzIHRoYXQgYXJlIHNlbnQgYWZ0ZXIgcHJlc3NpbmcgdGhlICdJbml0aWFsaXplJworCQlidXR0b24gaW4gdGhlIHdpbmRvd3MgYXBwbGljYXRpb24gKi8KKwl7IDEsIHsgMHgwMyB9IH0sCisJeyAxLCB7IDB4MDEgfSB9LAorCXsgMiwgeyAweDA5LCAweDkwIH0gfSwKKwl7IDMsIHsgMHgwOCwgMHg5MCwgMHhmYSB9IH0sCisJeyAxLCB7IDB4MzQgfSB9LAorCXsgMiwgeyAweDM1LCAweDAxIH0gfSwKKwl7IDIsIHsgMHgzNiwgMHgwMSB9IH0sCisJeyAyLCB7IDB4MzAsIDB4MDkgfSB9LAorCXsgNCwgeyAweDMwLCAweDA2LCAweDAwLCAweGUyIH0gfSwKKwl7IDMsIHsgMHgzMSwgMHgwMSwgMHgzMCB9IH0sCisJeyAzLCB7IDB4MzEsIDB4MDQsIDB4MDkgfSB9LAorCXsgMiwgeyAweDA1LCAweDAyIH0gfSwKKwl7IDYsIHsgMHgwNiwgMHgwMywgMHgwMywgMHgwOCwgMHgwMSwgMHgwZiB9IH0sCit9OworCitzdGF0aWMgaW50IHNpNDcxM19zdGFydF9zZXEoc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCXJhZGlvLT5idWZmZXJbMF0gPSAweDNmOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhcnRfc2VxKTsgaSsrKSB7CisJCWludCBsZW4gPSBzdGFydF9zZXFbaV0ubGVuOworCQl1OCAqcGF5bG9hZCA9IHN0YXJ0X3NlcVtpXS5wYXlsb2FkOworCisJCW1lbWNweShyYWRpby0+YnVmZmVyICsgMSwgcGF5bG9hZCwgbGVuKTsKKwkJbWVtc2V0KHJhZGlvLT5idWZmZXIgKyBsZW4gKyAxLCAwLCBCVUZGRVJfTEVOR1RIIC0gMSAtIGxlbik7CisJCXJldHZhbCA9IHNpNDcxM19zZW5kX3N0YXJ0dXBfY29tbWFuZChyYWRpbyk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBzaTQ3MTNfYm9hcmRfaW5mbyA9IHsKKwlJMkNfQk9BUkRfSU5GTygic2k0NzEzIiwgU0k0NzEzX0kyQ19BRERSX0JVU0VOX0hJR0gpLAorfTsKKworc3RydWN0IHNpNDcxM19jb21tYW5kX3RhYmxlIHsKKwlpbnQgY29tbWFuZF9pZDsKKwl1OCBwYXlsb2FkWzhdOworfTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGNvbW1hbmQgOgorICoJQnl0ZSAxIDogMHgzZiAoYWx3YXlzKQorICoJQnl0ZSAyIDogMHgwNiAoc2VuZCBhIGNvbW1hbmQpCisgKglCeXRlIDMgOiBVbmtub3duCisgKglCeXRlIDQgOiBOdW1iZXIgb2YgYXJndW1lbnRzICsgMSAoZm9yIHRoZSBjb21tYW5kIGJ5dGUpCisgKglCeXRlIDUgOiBOdW1iZXIgb2YgcmVzcG9uc2UgYnl0ZXMKKyAqLworc3RhdGljIHN0cnVjdCBzaTQ3MTNfY29tbWFuZF90YWJsZSBjb21tYW5kX3RhYmxlW10gPSB7CisKKwl7IFNJNDcxM19DTURfUE9XRVJfVVAsCQl7IDB4MDAsIFNJNDcxM19QV1VQX05BUkdTICsgMSwgU0k0NzEzX1BXVVBfTlJFU1B9IH0sCisJeyBTSTQ3MTNfQ01EX0dFVF9SRVYsCQl7IDB4MDMsIDB4MDEsIFNJNDcxM19HRVRSRVZfTlJFU1AgfSB9LAorCXsgU0k0NzEzX0NNRF9QT1dFUl9ET1dOLAl7IDB4MDAsIDB4MDEsIFNJNDcxM19QV0ROX05SRVNQfSB9LAorCXsgU0k0NzEzX0NNRF9TRVRfUFJPUEVSVFksCXsgMHgwMCwgU0k0NzEzX1NFVF9QUk9QX05BUkdTICsgMSwgU0k0NzEzX1NFVF9QUk9QX05SRVNQIH0gfSwKKwl7IFNJNDcxM19DTURfR0VUX1BST1BFUlRZLAl7IDB4MDAsIFNJNDcxM19HRVRfUFJPUF9OQVJHUyArIDEsIFNJNDcxM19HRVRfUFJPUF9OUkVTUCB9IH0sCisJeyBTSTQ3MTNfQ01EX1RYX1RVTkVfRlJFUSwJeyAweDAzLCBTSTQ3MTNfVFhGUkVRX05BUkdTICsgMSwgU0k0NzEzX1RYRlJFUV9OUkVTUCB9IH0sCisJeyBTSTQ3MTNfQ01EX1RYX1RVTkVfUE9XRVIsCXsgMHgwMywgU0k0NzEzX1RYUFdSX05BUkdTICsgMSwgU0k0NzEzX1RYUFdSX05SRVNQIH0gfSwKKwl7IFNJNDcxM19DTURfVFhfVFVORV9NRUFTVVJFLAl7IDB4MDMsIFNJNDcxM19UWE1FQV9OQVJHUyArIDEsIFNJNDcxM19UWE1FQV9OUkVTUCB9IH0sCisJeyBTSTQ3MTNfQ01EX1RYX1RVTkVfU1RBVFVTLAl7IDB4MDAsIFNJNDcxM19UWFNUQVRVU19OQVJHUyArIDEsIFNJNDcxM19UWFNUQVRVU19OUkVTUCB9IH0sCisJeyBTSTQ3MTNfQ01EX1RYX0FTUV9TVEFUVVMsCXsgMHgwMywgU0k0NzEzX0FTUVNUQVRVU19OQVJHUyArIDEsIFNJNDcxM19BU1FTVEFUVVNfTlJFU1AgfSB9LAorCXsgU0k0NzEzX0NNRF9HRVRfSU5UX1NUQVRVUywJeyAweDAzLCAweDAxLCBTSTQ3MTNfR0VUX1NUQVRVU19OUkVTUCB9IH0sCisJeyBTSTQ3MTNfQ01EX1RYX1JEU19CVUZGLAl7IDB4MDMsIFNJNDcxM19SRFNCVUZGX05BUkdTICsgMSwgU0k0NzEzX1JEU0JVRkZfTlJFU1AgfSB9LAorCXsgU0k0NzEzX0NNRF9UWF9SRFNfUFMsCQl7IDB4MDAsIFNJNDcxM19SRFNQU19OQVJHUyArIDEsIFNJNDcxM19SRFNQU19OUkVTUCB9IH0sCit9OworCitzdGF0aWMgaW50IHNlbmRfY29tbWFuZChzdHJ1Y3Qgc2k0NzEzX3VzYl9kZXZpY2UgKnJhZGlvLCB1OCAqcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgcmV0dmFsOworCisJcmFkaW8tPmJ1ZmZlclswXSA9IDB4M2Y7CisJcmFkaW8tPmJ1ZmZlclsxXSA9IDB4MDY7CisKKwltZW1jcHkocmFkaW8tPmJ1ZmZlciArIDIsIHBheWxvYWQsIDMpOworCW1lbWNweShyYWRpby0+YnVmZmVyICsgNSwgZGF0YSwgbGVuKTsKKwltZW1zZXQocmFkaW8tPmJ1ZmZlciArIDUgKyBsZW4sIDAsIEJVRkZFUl9MRU5HVEggLSA1IC0gbGVuKTsKKworCS8qIHNlbmQgdGhlIGNvbW1hbmQgKi8KKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3NuZGN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkJCQkweDA5LCAweDIxLCAweDAzM2YsIDAsIHJhZGlvLT5idWZmZXIsCisJCQkJCUJVRkZFUl9MRU5HVEgsIFVTQl9USU1FT1VUKTsKKworCXJldHVybiByZXR2YWwgPCAwID8gcmV0dmFsIDogMDsKK30KKworc3RhdGljIGludCBzaTQ3MTNfaTJjX3JlYWQoc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHVudGlsX2ppZmZpZXMgPSBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyhVU0JfUkVTUF9USU1FT1VUKSArIDE7CisJaW50IHJldHZhbDsKKworCS8qIHJlY2VpdmUgdGhlIHJlc3BvbnNlICovCisJZm9yICg7OykgeworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwKKwkJCQkJdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkJCQkweDAxLCAweGExLCAweDAzM2YsIDAsIHJhZGlvLT5idWZmZXIsCisJCQkJCUJVRkZFUl9MRU5HVEgsIFVTQl9USU1FT1VUKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCisJCS8qCisJCSAqIENoZWNrIHRoYXQgd2UgZ2V0IGEgdmFsaWQgcmVwbHkgYmFjayAoYnVmZmVyWzFdID09IDApIGFuZAorCQkgKiB0aGF0IENUUyBpcyBzZXQgYmVmb3JlIHJldHVybmluZywgb3RoZXJ3aXNlIHdlIHdhaXQgYW5kIHRyeQorCQkgKiBhZ2Fpbi4gVGhlIGkyYyBkcml2ZXIgYWxzbyBkb2VzIHRoZSBDVFMgY2hlY2ssIGJ1dCB0aGUgdGltZW91dHMKKwkJICogdXNlZCB0aGVyZSBhcmUgbXVjaCB0b28gc21hbGwgZm9yIHRoaXMgVVNCIGRyaXZlciwgc28gd2Ugd2FpdAorCQkgKiBmb3IgaXQgaGVyZS4KKwkJICovCisJCWlmIChyYWRpby0+YnVmZmVyWzFdID09IDAgJiYgKHJhZGlvLT5idWZmZXJbMl0gJiBTSTQ3MTNfQ1RTKSkgeworCQkJbWVtY3B5KGRhdGEsIHJhZGlvLT5idWZmZXIgKyAyLCBsZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXModW50aWxfamlmZmllcykpIHsKKwkJCS8qIFplcm8gdGhlIHN0YXR1cyB2YWx1ZSwgZW5zdXJpbmcgQ1RTIGlzbid0IHNldCAqLworCQkJZGF0YVswXSA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltc2xlZXAoMyk7CisJfQorfQorCitzdGF0aWMgaW50IHNpNDcxM19pMmNfd3JpdGUoc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgaTsKKworCWlmIChsZW4gPiBCVUZGRVJfTEVOR1RIIC0gNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kX3RhYmxlKTsgaSsrKSB7CisJCWlmIChkYXRhWzBdID09IGNvbW1hbmRfdGFibGVbaV0uY29tbWFuZF9pZCkKKwkJCXJldHZhbCA9IHNlbmRfY29tbWFuZChyYWRpbywgY29tbWFuZF90YWJsZVtpXS5wYXlsb2FkLAorCQkJCQkJZGF0YSwgbGVuKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsIDwgMCA/IHJldHZhbCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2k0NzEzX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXB0ZXIsCisJCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbyA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXB0ZXIpOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCWludCBpOworCisJaWYgKG51bSA8PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKQorCQkJcmV0dmFsID0gc2k0NzEzX2kyY19yZWFkKHJhZGlvLCBtc2dzW2ldLmJ1ZiwgbXNnc1tpXS5sZW4pOworCQllbHNlCisJCQlyZXR2YWwgPSBzaTQ3MTNfaTJjX3dyaXRlKHJhZGlvLCBtc2dzW2ldLmJ1ZiwgbXNnc1tpXS5sZW4pOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbCA/IHJldHZhbCA6IG51bTsKK30KKworc3RhdGljIHUzMiBzaTQ3MTNfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzaTQ3MTNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IHNpNDcxM190cmFuc2ZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IHNpNDcxM19mdW5jdGlvbmFsaXR5LAorfTsKKworLyogVGhpcyBuYW1lIHZhbHVlIHNob3dzIHVwIGluIHRoZSBzeXNmcyBmaWxlbmFtZSBhc3NvY2lhdGVkCisJCXdpdGggdGhpcyBJMkMgYWRhcHRlciAqLworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBzaTQ3MTNfaTJjX2FkYXB0ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUgICA9ICJzaTQ3MTMtaTJjIiwKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCisJLmFsZ28gICA9ICZzaTQ3MTNfYWxnbywKK307CisKK3N0YXRpYyBpbnQgc2k0NzEzX3JlZ2lzdGVyX2kyY19hZGFwdGVyKHN0cnVjdCBzaTQ3MTNfdXNiX2RldmljZSAqcmFkaW8pCit7CisJcmFkaW8tPmkyY19hZGFwdGVyID0gc2k0NzEzX2kyY19hZGFwdGVyX3RlbXBsYXRlOworCS8qIHNldCB1cCBzeXNmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCisJcmFkaW8tPmkyY19hZGFwdGVyLmRldi5wYXJlbnQgPSAmcmFkaW8tPnVzYmRldi0+ZGV2OworCWkyY19zZXRfYWRhcGRhdGEoJnJhZGlvLT5pMmNfYWRhcHRlciwgcmFkaW8pOworCisJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmcmFkaW8tPmkyY19hZGFwdGVyKTsKK30KKworLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50IGFuZCByZWdpc3RlciB3aXRoIHY0bCBhbmQgdXNiIGlmIGl0IGlzICovCitzdGF0aWMgaW50IHVzYl9zaTQ3MTNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzaTQ3MTNfdXNiX2RldmljZSAqcmFkaW87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiU2k0NzEzIGRldmVsb3BtZW50IGJvYXJkIGRpc2NvdmVyZWQ6ICglMDRYOiUwNFgpXG4iLAorCQkJaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKKworCS8qIEluaXRpYWxpemUgbG9jYWwgZGV2aWNlIHN0cnVjdHVyZSAqLworCXJhZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNpNDcxM191c2JfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJhZGlvKQorCQlyYWRpby0+YnVmZmVyID0ga21hbGxvYyhCVUZGRVJfTEVOR1RILCBHRlBfS0VSTkVMKTsKKworCWlmICghcmFkaW8gfHwgIXJhZGlvLT5idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAia21hbGxvYyBmb3Igc2k0NzEzX3VzYl9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJa2ZyZWUocmFkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZyYWRpby0+bG9jayk7CisKKwlyYWRpby0+dXNiZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlyYWRpby0+aW50ZiA9IGludGY7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCAmcmFkaW8tPnY0bDJfZGV2KTsKKworCXJldHZhbCA9IHNpNDcxM19zdGFydF9zZXEocmFkaW8pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl92NGwyOworCisJcmV0dmFsID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmludGYtPmRldiwgJnJhZGlvLT52NGwyX2Rldik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgcmVnaXN0ZXIgdjRsMl9kZXZpY2VcbiIpOworCQlnb3RvIGVycl92NGwyOworCX0KKworCXJldHZhbCA9IHNpNDcxM19yZWdpc3Rlcl9pMmNfYWRhcHRlcihyYWRpbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIGkyYyBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9pMmNkZXY7CisJfQorCisJYWRhcHRlciA9ICZyYWRpby0+aTJjX2FkYXB0ZXI7CisJc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZyYWRpby0+djRsMl9kZXYsIGFkYXB0ZXIsCisJCQkJCSAgJnNpNDcxM19ib2FyZF9pbmZvLCBOVUxMKTsKKwlyYWRpby0+djRsMl9zdWJkZXYgPSBzZDsKKwlpZiAoIXNkKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImNhbm5vdCBnZXQgdjRsMiBzdWJkZXZpY2VcbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRlbF9hZGFwdGVyOworCX0KKworCXJhZGlvLT52ZGV2LmN0cmxfaGFuZGxlciA9IHNkLT5jdHJsX2hhbmRsZXI7CisJcmFkaW8tPnY0bDJfZGV2LnJlbGVhc2UgPSB1c2Jfc2k0NzEzX3ZpZGVvX2RldmljZV9yZWxlYXNlOworCXN0cmxjcHkocmFkaW8tPnZkZXYubmFtZSwgcmFkaW8tPnY0bDJfZGV2Lm5hbWUsCisJCXNpemVvZihyYWRpby0+dmRldi5uYW1lKSk7CisJcmFkaW8tPnZkZXYudjRsMl9kZXYgPSAmcmFkaW8tPnY0bDJfZGV2OworCXJhZGlvLT52ZGV2LmZvcHMgPSAmdXNiX3NpNDcxM19mb3BzOworCXJhZGlvLT52ZGV2LmlvY3RsX29wcyA9ICZ1c2Jfc2k0NzEzX2lvY3RsX29wczsKKwlyYWRpby0+dmRldi5sb2NrID0gJnJhZGlvLT5sb2NrOworCXJhZGlvLT52ZGV2LnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eTsKKwlyYWRpby0+dmRldi52ZmxfZGlyID0gVkZMX0RJUl9UWDsKKworCXZpZGVvX3NldF9kcnZkYXRhKCZyYWRpby0+dmRldiwgcmFkaW8pOworCXNldF9iaXQoVjRMMl9GTF9VU0VfRkhfUFJJTywgJnJhZGlvLT52ZGV2LmZsYWdzKTsKKworCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcmFkaW8tPnZkZXYsIFZGTF9UWVBFX1JBRElPLCAtMSk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7CisJCWdvdG8gZGVsX2FkYXB0ZXI7CisJfQorCisJZGV2X2luZm8oJmludGYtPmRldiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgJXNcbiIsCisJCQl2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKCZyYWRpby0+dmRldikpOworCisJcmV0dXJuIDA7CisKK2RlbF9hZGFwdGVyOgorCWkyY19kZWxfYWRhcHRlcihhZGFwdGVyKTsKK2Vycl9pMmNkZXY6CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmcmFkaW8tPnY0bDJfZGV2KTsKK2Vycl92NGwyOgorCWtmcmVlKHJhZGlvLT5idWZmZXIpOworCWtmcmVlKHJhZGlvKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB1c2Jfc2k0NzEzX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHNpNDcxM191c2JfZGV2aWNlICpyYWRpbyA9IHRvX3NpNDcxM19kZXYodXNiX2dldF9pbnRmZGF0YShpbnRmKSk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiU2k0NzEzIGRldmVsb3BtZW50IGJvYXJkIG5vdyBkaXNjb25uZWN0ZWRcbiIpOworCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnJhZGlvLT52ZGV2KTsKKwl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZyYWRpby0+djRsMl9kZXYpOworCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCXY0bDJfZGV2aWNlX3B1dCgmcmFkaW8tPnY0bDJfZGV2KTsKK30KKworLyogVVNCIHN1YnN5c3RlbSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2Jfc2k0NzEzX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gInJhZGlvLXVzYi1zaTQ3MTMiLAorCS5wcm9iZQkJCT0gdXNiX3NpNDcxM19wcm9iZSwKKwkuZGlzY29ubmVjdAkJPSB1c2Jfc2k0NzEzX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCQk9IHVzYl9zaTQ3MTNfdXNiX2RldmljZV90YWJsZSwKK307CisKK21vZHVsZV91c2JfZHJpdmVyKHVzYl9zaTQ3MTNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMvc2k0NzEzLmMKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL3NpNDcxMy5jCmluZGV4IDllYzQ4Y2MuLjA3ZDUxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL3NpNDcxMy5jCkBAIC0yNywxMyArMjcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKLSNpbmNsdWRlICJzaTQ3MTMtaTJjLmgiCisjaW5jbHVkZSAic2k0NzEzLmgiCiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCiBzdGF0aWMgaW50IGRlYnVnOwpAQCAtNDUsMjMgKzQ0LDE4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBkcml2ZXIgZm9yIFNpNDcxMyBGTSBSYWRpbyBUcmFuc21pdHRlciIpOwogTU9EVUxFX1ZFUlNJT04oIjAuMC4xIik7CiAKLXN0YXRpYyBjb25zdCBjaGFyICpzaTQ3MTNfc3VwcGx5X25hbWVzW1NJNDcxM19OVU1fU1VQUExJRVNdID0gewotCSJ2aW8iLAotCSJ2ZGQiLAotfTsKLQogI2RlZmluZSBERUZBVUxUX1JEU19QSQkJCTB4MDAKICNkZWZpbmUgREVGQVVMVF9SRFNfUFRZCQkJMHgwMAogI2RlZmluZSBERUZBVUxUX1JEU19ERVZJQVRJT04JCTB4MDBDOAogI2RlZmluZSBERUZBVUxUX1JEU19QU19SRVBFQVRfQ09VTlQJMHgwMDAzCiAjZGVmaW5lIERFRkFVTFRfTElNSVRFUl9SVElNRQkJMHgxMzkyCiAjZGVmaW5lIERFRkFVTFRfTElNSVRFUl9ERVYJCTB4MTAyQ0EKLSNkZWZpbmUgREVGQVVMVF9QSUxPVF9GUkVRVUVOQ1kgCTB4NEEzOAorI2RlZmluZSBERUZBVUxUX1BJTE9UX0ZSRVFVRU5DWQkJMHg0QTM4CiAjZGVmaW5lIERFRkFVTFRfUElMT1RfREVWSUFUSU9OCQkweDFBNUUKICNkZWZpbmUgREVGQVVMVF9BQ09NUF9BVElNRQkJMHgwMDAwCiAjZGVmaW5lIERFRkFVTFRfQUNPTVBfUlRJTUUJCTB4RjQyNDBMCiAjZGVmaW5lIERFRkFVTFRfQUNPTVBfR0FJTgkJMHgwRgotI2RlZmluZSBERUZBVUxUX0FDT01QX1RIUkVTSE9MRCAJKC0weDI4KQorI2RlZmluZSBERUZBVUxUX0FDT01QX1RIUkVTSE9MRAkJKC0weDI4KQogI2RlZmluZSBERUZBVUxUX01VVEUJCQkweDAxCiAjZGVmaW5lIERFRkFVTFRfUE9XRVJfTEVWRUwJCTg4CiAjZGVmaW5lIERFRkFVTFRfRlJFUVVFTkNZCQk4ODAwCkBAIC0yMTMsNiArMjA3LDcgQEAKIAkJCQl1OCByZXNwb25zZVtdLCBjb25zdCBpbnQgcmVzcG4sIGNvbnN0IGludCB1c2VjcykKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmc2Rldi0+c2QpOworCXVuc2lnbmVkIGxvbmcgdW50aWxfamlmZmllczsKIAl1OCBkYXRhMVtNQVhfQVJHUyArIDFdOwogCWludCBlcnI7CiAKQEAgLTIyOCwzMCArMjIzLDQyIEBACiAJaWYgKGVyciAhPSBhcmduICsgMSkgewogCQl2NGwyX2Vycigmc2Rldi0+c2QsICJFcnJvciB3aGlsZSBzZW5kaW5nIGNvbW1hbmQgMHglMDJ4XG4iLAogCQkJY29tbWFuZCk7Ci0JCXJldHVybiAoZXJyID4gMCkgPyAtRUlPIDogZXJyOworCQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU87CiAJfQogCisJdW50aWxfamlmZmllcyA9IGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHVzZWNzKSArIDE7CisKIAkvKiBXYWl0IHJlc3BvbnNlIGZyb20gaW50ZXJydXB0ICovCi0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNkZXYtPndvcmssCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzZGV2LT53b3JrLAogCQkJCXVzZWNzX3RvX2ppZmZpZXModXNlY3MpICsgMSkpCi0JCXY0bDJfd2Fybigmc2Rldi0+c2QsCisJCQl2NGwyX3dhcm4oJnNkZXYtPnNkLAogCQkJCSIoJXMpIERldmljZSB0b29rIHRvbyBtdWNoIHRpbWUgdG8gYW5zd2VyLlxuIiwKIAkJCQlfX2Z1bmNfXyk7Ci0KLQkvKiBUaGVuIGdldCB0aGUgcmVzcG9uc2UgKi8KLQllcnIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCByZXNwb25zZSwgcmVzcG4pOwotCWlmIChlcnIgIT0gcmVzcG4pIHsKLQkJdjRsMl9lcnIoJnNkZXYtPnNkLAotCQkJIkVycm9yIHdoaWxlIHJlYWRpbmcgcmVzcG9uc2UgZm9yIGNvbW1hbmQgMHglMDJ4XG4iLAotCQkJY29tbWFuZCk7Ci0JCXJldHVybiAoZXJyID4gMCkgPyAtRUlPIDogZXJyOwogCX0KIAotCURCR19CVUZGRVIoJnNkZXYtPnNkLCAiUmVzcG9uc2UiLCByZXNwb25zZSwgcmVzcG4pOwotCWlmIChjaGVja19jb21tYW5kX2ZhaWxlZChyZXNwb25zZVswXSkpCi0JCXJldHVybiAtRUJVU1k7CisJZG8geworCQllcnIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCByZXNwb25zZSwgcmVzcG4pOworCQlpZiAoZXJyICE9IHJlc3BuKSB7CisJCQl2NGwyX2Vycigmc2Rldi0+c2QsCisJCQkJIkVycm9yICVkIHdoaWxlIHJlYWRpbmcgcmVzcG9uc2UgZm9yIGNvbW1hbmQgMHglMDJ4XG4iLAorCQkJCWVyciwgY29tbWFuZCk7CisJCQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU87CisJCX0KIAotCXJldHVybiAwOworCQlEQkdfQlVGRkVSKCZzZGV2LT5zZCwgIlJlc3BvbnNlIiwgcmVzcG9uc2UsIHJlc3BuKTsKKwkJaWYgKCFjaGVja19jb21tYW5kX2ZhaWxlZChyZXNwb25zZVswXSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY2xpZW50LT5pcnEpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAodXNlY3MgPD0gMTAwMCkKKwkJCXVzbGVlcF9yYW5nZSh1c2VjcywgMTAwMCk7CisJCWVsc2UKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9IHdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXModW50aWxfamlmZmllcykpOworCisJcmV0dXJuIC1FQlVTWTsKIH0KIAogLyoKQEAgLTI2NSw5ICsyNzIsOSBAQAogCWludCBlcnI7CiAJdTggdmFsW1NJNDcxM19HRVRfUFJPUF9OUkVTUF07CiAJLyoKLQkgKiAJLkZpcnN0IGJ5dGUgPSAwCi0JICogCS5TZWNvbmQgYnl0ZSA9IHByb3BlcnR5J3MgTVNCCi0JICogCS5UaGlyZCBieXRlID0gcHJvcGVydHkncyBMU0IKKwkgKgkuRmlyc3QgYnl0ZSA9IDAKKwkgKgkuU2Vjb25kIGJ5dGUgPSBwcm9wZXJ0eSdzIE1TQgorCSAqCS5UaGlyZCBieXRlID0gcHJvcGVydHkncyBMU0IKIAkgKi8KIAljb25zdCB1OCBhcmdzW1NJNDcxM19HRVRfUFJPUF9OQVJHU10gPSB7CiAJCTB4MDAsCkBAIC0zMDIsMTEgKzMwOSwxMSBAQAogCWludCBydmFsOwogCXU4IHJlc3BbU0k0NzEzX1NFVF9QUk9QX05SRVNQXTsKIAkvKgotCSAqIAkuRmlyc3QgYnl0ZSA9IDAKLQkgKiAJLlNlY29uZCBieXRlID0gcHJvcGVydHkncyBNU0IKLQkgKiAJLlRoaXJkIGJ5dGUgPSBwcm9wZXJ0eSdzIExTQgotCSAqIAkuRm91cnRoIGJ5dGUgPSB2YWx1ZSdzIE1TQgotCSAqIAkuRmlmdGggYnl0ZSA9IHZhbHVlJ3MgTFNCCisJICoJLkZpcnN0IGJ5dGUgPSAwCisJICoJLlNlY29uZCBieXRlID0gcHJvcGVydHkncyBNU0IKKwkgKgkuVGhpcmQgYnl0ZSA9IHByb3BlcnR5J3MgTFNCCisJICoJLkZvdXJ0aCBieXRlID0gdmFsdWUncyBNU0IKKwkgKgkuRmlmdGggYnl0ZSA9IHZhbHVlJ3MgTFNCCiAJICovCiAJY29uc3QgdTggYXJnc1tTSTQ3MTNfU0VUX1BST1BfTkFSR1NdID0gewogCQkweDAwLApAQCAtMzQ0LDMxICszNTEsMzYgQEAKICAqLwogc3RhdGljIGludCBzaTQ3MTNfcG93ZXJ1cChzdHJ1Y3Qgc2k0NzEzX2RldmljZSAqc2RldikKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmc2Rldi0+c2QpOwogCWludCBlcnI7CiAJdTggcmVzcFtTSTQ3MTNfUFdVUF9OUkVTUF07CiAJLyoKLQkgKiAJLkZpcnN0IGJ5dGUgPSBFbmFibGVkIGludGVycnVwdHMgYW5kIGJvb3QgZnVuY3Rpb24KLQkgKiAJLlNlY29uZCBieXRlID0gSW5wdXQgb3BlcmF0aW9uIG1vZGUKKwkgKgkuRmlyc3QgYnl0ZSA9IEVuYWJsZWQgaW50ZXJydXB0cyBhbmQgYm9vdCBmdW5jdGlvbgorCSAqCS5TZWNvbmQgYnl0ZSA9IElucHV0IG9wZXJhdGlvbiBtb2RlCiAJICovCi0JY29uc3QgdTggYXJnc1tTSTQ3MTNfUFdVUF9OQVJHU10gPSB7Ci0JCVNJNDcxM19QV1VQX0NUU0lFTiB8IFNJNDcxM19QV1VQX0dQTzJPRU4gfCBTSTQ3MTNfUFdVUF9GVU5DX1RYLAorCXU4IGFyZ3NbU0k0NzEzX1BXVVBfTkFSR1NdID0geworCQlTSTQ3MTNfUFdVUF9HUE8yT0VOIHwgU0k0NzEzX1BXVVBfRlVOQ19UWCwKIAkJU0k0NzEzX1BXVVBfT1BNT0RfQU5BTE9HLAogCX07CiAKIAlpZiAoc2Rldi0+cG93ZXJfc3RhdGUpCiAJCXJldHVybiAwOwogCi0JZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUoc2Rldi0+c3VwcGxpZXMpLAotCQkJCSAgICBzZGV2LT5zdXBwbGllcyk7Ci0JaWYgKGVycikgewotCQl2NGwyX2Vycigmc2Rldi0+c2QsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwlpZiAoc2Rldi0+c3VwcGxpZXMpIHsKKwkJZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKHNkZXYtPnN1cHBsaWVzLCBzZGV2LT5zdXBwbHlfZGF0YSk7CisJCWlmIChlcnIpIHsKKwkJCXY0bDJfZXJyKCZzZGV2LT5zZCwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAlpZiAoZ3Bpb19pc192YWxpZChzZGV2LT5ncGlvX3Jlc2V0KSkgewogCQl1ZGVsYXkoNTApOwogCQlncGlvX3NldF92YWx1ZShzZGV2LT5ncGlvX3Jlc2V0LCAxKTsKIAl9CiAKKwlpZiAoY2xpZW50LT5pcnEpCisJCWFyZ3NbMF0gfD0gU0k0NzEzX1BXVVBfQ1RTSUVOOworCiAJZXJyID0gc2k0NzEzX3NlbmRfY29tbWFuZChzZGV2LCBTSTQ3MTNfQ01EX1BPV0VSX1VQLAogCQkJCQlhcmdzLCBBUlJBWV9TSVpFKGFyZ3MpLAogCQkJCQlyZXNwLCBBUlJBWV9TSVpFKHJlc3ApLApAQCAtMzgwLDEzICszOTIsMTUgQEAKIAkJdjRsMl9kYmcoMSwgZGVidWcsICZzZGV2LT5zZCwgIkRldmljZSBpbiBwb3dlciB1cCBtb2RlXG4iKTsKIAkJc2Rldi0+cG93ZXJfc3RhdGUgPSBQT1dFUl9PTjsKIAotCQllcnIgPSBzaTQ3MTNfd3JpdGVfcHJvcGVydHkoc2RldiwgU0k0NzEzX0dQT19JRU4sCisJCWlmIChjbGllbnQtPmlycSkKKwkJCWVyciA9IHNpNDcxM193cml0ZV9wcm9wZXJ0eShzZGV2LCBTSTQ3MTNfR1BPX0lFTiwKIAkJCQkJCVNJNDcxM19TVENfSU5UIHwgU0k0NzEzX0NUUyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGdwaW9faXNfdmFsaWQoc2Rldi0+Z3Bpb19yZXNldCkpCi0JCQlncGlvX3NldF92YWx1ZShzZGV2LT5ncGlvX3Jlc2V0LCAwKTsKLQkJZXJyID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHNkZXYtPnN1cHBsaWVzKSwKLQkJCQkJICAgICBzZGV2LT5zdXBwbGllcyk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChncGlvX2lzX3ZhbGlkKHNkZXYtPmdwaW9fcmVzZXQpKQorCQlncGlvX3NldF92YWx1ZShzZGV2LT5ncGlvX3Jlc2V0LCAwKTsKKwlpZiAoc2Rldi0+c3VwcGxpZXMpIHsKKwkJZXJyID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShzZGV2LT5zdXBwbGllcywgc2Rldi0+c3VwcGx5X2RhdGEpOwogCQlpZiAoZXJyKQogCQkJdjRsMl9lcnIoJnNkZXYtPnNkLAogCQkJCSAiRmFpbGVkIHRvIGRpc2FibGUgc3VwcGxpZXM6ICVkXG4iLCBlcnIpOwpAQCAtNDE4LDExICs0MzIsMTMgQEAKIAkJdjRsMl9kYmcoMSwgZGVidWcsICZzZGV2LT5zZCwgIkRldmljZSBpbiByZXNldCBtb2RlXG4iKTsKIAkJaWYgKGdwaW9faXNfdmFsaWQoc2Rldi0+Z3Bpb19yZXNldCkpCiAJCQlncGlvX3NldF92YWx1ZShzZGV2LT5ncGlvX3Jlc2V0LCAwKTsKLQkJZXJyID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHNkZXYtPnN1cHBsaWVzKSwKLQkJCQkJICAgICBzZGV2LT5zdXBwbGllcyk7Ci0JCWlmIChlcnIpCi0JCQl2NGwyX2Vycigmc2Rldi0+c2QsCi0JCQkJICJGYWlsZWQgdG8gZGlzYWJsZSBzdXBwbGllczogJWRcbiIsIGVycik7CisJCWlmIChzZGV2LT5zdXBwbGllcykgeworCQkJZXJyID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShzZGV2LT5zdXBwbGllcywKKwkJCQkJCSAgICAgc2Rldi0+c3VwcGx5X2RhdGEpOworCQkJaWYgKGVycikKKwkJCQl2NGwyX2Vycigmc2Rldi0+c2QsCisJCQkJCSAiRmFpbGVkIHRvIGRpc2FibGUgc3VwcGxpZXM6ICVkXG4iLCBlcnIpOworCQl9CiAJCXNkZXYtPnBvd2VyX3N0YXRlID0gUE9XRVJfT0ZGOwogCX0KIApAQCAtNDUxLDcgKzQ2Nyw3IEBACiAJCXY0bDJfaW5mbygmc2Rldi0+c2QsICJjaGlwIGZvdW5kIEAgMHglMDJ4ICglcylcbiIsCiAJCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAJfSBlbHNlIHsKLQkJdjRsMl9lcnIoJnNkZXYtPnNkLCAiSW52YWxpZCBwcm9kdWN0IG51bWJlclxuIik7CisJCXY0bDJfZXJyKCZzZGV2LT5zZCwgIkludmFsaWQgcHJvZHVjdCBudW1iZXIgMHglWFxuIiwgcmVzcFsxXSk7CiAJCXJ2YWwgPSAtRUlOVkFMOwogCX0KIAlyZXR1cm4gcnZhbDsKQEAgLTQ2NSwzOSArNDgxLDQ1IEBACiAgKi8KIHN0YXRpYyBpbnQgc2k0NzEzX3dhaXRfc3RjKHN0cnVjdCBzaTQ3MTNfZGV2aWNlICpzZGV2LCBjb25zdCBpbnQgdXNlY3MpCiB7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmc2Rldi0+c2QpOwogCXU4IHJlc3BbU0k0NzEzX0dFVF9TVEFUVVNfTlJFU1BdOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfamlmZmllcyA9IGppZmZpZXM7CisJaW50IGVycjsKIAotCS8qIFdhaXQgcmVzcG9uc2UgZnJvbSBTVEMgaW50ZXJydXB0ICovCi0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNkZXYtPndvcmssCi0JCQl1c2Vjc190b19qaWZmaWVzKHVzZWNzKSArIDEpKQorCWlmIChjbGllbnQtPmlycSAmJgorCSAgICAhd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzZGV2LT53b3JrLCB1c2Vjc190b19qaWZmaWVzKHVzZWNzKSArIDEpKQogCQl2NGwyX3dhcm4oJnNkZXYtPnNkLAotCQkJIiVzOiBkZXZpY2UgdG9vayB0b28gbXVjaCB0aW1lIHRvIGFuc3dlciAoJWQgdXNlYykuXG4iLAotCQkJCV9fZnVuY19fLCB1c2Vjcyk7CisJCQkiKCVzKSBEZXZpY2UgdG9vayB0b28gbXVjaCB0aW1lIHRvIGFuc3dlci5cbiIsIF9fZnVuY19fKTsKIAotCS8qIENsZWFyIHN0YXR1cyBiaXRzICovCi0JZXJyID0gc2k0NzEzX3NlbmRfY29tbWFuZChzZGV2LCBTSTQ3MTNfQ01EX0dFVF9JTlRfU1RBVFVTLAotCQkJCQlOVUxMLCAwLAotCQkJCQlyZXNwLCBBUlJBWV9TSVpFKHJlc3ApLAotCQkJCQlERUZBVUxUX1RJTUVPVVQpOworCWZvciAoOzspIHsKKwkJLyogQ2xlYXIgc3RhdHVzIGJpdHMgKi8KKwkJZXJyID0gc2k0NzEzX3NlbmRfY29tbWFuZChzZGV2LCBTSTQ3MTNfQ01EX0dFVF9JTlRfU1RBVFVTLAorCQkJCU5VTEwsIDAsCisJCQkJcmVzcCwgQVJSQVlfU0laRShyZXNwKSwKKwkJCQlERUZBVUxUX1RJTUVPVVQpOworCQkvKiBUaGUgVVNCIGRldmljZSByZXR1cm5zIGVycm9ycyB3aGVuIGl0IHdhaXRzIGZvciB0aGUKKwkJICogU1RDIGJpdCB0byBiZSBzZXQuIEhlbmNlIHBvbGxpbmcgKi8KKwkJaWYgKGVyciA+PSAwKSB7CisJCQl2NGwyX2RiZygxLCBkZWJ1ZywgJnNkZXYtPnNkLAorCQkJCSIlczogc3RhdHVzIGJpdHM6IDB4JTAyeFxuIiwgX19mdW5jX18sIHJlc3BbMF0pOwogCi0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXhpdDsKLQotCXY0bDJfZGJnKDEsIGRlYnVnLCAmc2Rldi0+c2QsCi0JCQkiJXM6IHN0YXR1cyBiaXRzOiAweCUwMnhcbiIsIF9fZnVuY19fLCByZXNwWzBdKTsKLQotCWlmICghKHJlc3BbMF0gJiBTSTQ3MTNfU1RDX0lOVCkpCi0JCWVyciA9IC1FSU87Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKKwkJCWlmIChyZXNwWzBdICYgU0k0NzEzX1NUQ19JTlQpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGppZmZpZXNfdG9fdXNlY3MoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpID4gdXNlY3MpCisJCQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU87CisJCS8qIFdlIHNsZWVwIGhlcmUgZm9yIDMtNCBtcyBpbiBvcmRlciB0byBhdm9pZCBmbG9vZGluZyB0aGUgZGV2aWNlCisJCSAqIHdpdGggVVNCIHJlcXVlc3RzLiBUaGUgc2k0NzEzIFVTQiBkcml2ZXIgd2FzIGRldmVsb3BlZAorCQkgKiBieSByZXZlcnNlIGVuZ2luZWVyaW5nIHRoZSBXaW5kb3dzIFVTQiBkcml2ZXIuIFRoZSB3aW5kb3dzCisJCSAqIGRyaXZlciBhbHNvIGhhcyBhIH4yLjUgbXMgZGVsYXkgYmV0d2VlbiByZXNwb25zZXMuICovCisJCXVzbGVlcF9yYW5nZSgzMDAwLCA0MDAwKTsKKwl9CiB9CiAKIC8qCiAgKiBzaTQ3MTNfdHhfdHVuZV9mcmVxIC0gU2V0cyB0aGUgc3RhdGUgb2YgdGhlIFJGIGNhcnJpZXIgYW5kIHNldHMgdGhlIHR1bmluZwotICogCQkJZnJlcXVlbmN5IGJldHdlZW4gNzYgYW5kIDEwOCBNSHogaW4gMTAga0h6IHVuaXRzIGFuZAotICogCQkJc3RlcHMgb2YgNTAga0h6LgorICoJCQlmcmVxdWVuY3kgYmV0d2VlbiA3NiBhbmQgMTA4IE1IeiBpbiAxMCBrSHogdW5pdHMgYW5kCisgKgkJCXN0ZXBzIG9mIDUwIGtIei4KICAqIEBzZGV2OiBzaTQ3MTNfZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZSB3ZSBhcmUgY29tbXVuaWNhdGluZwogICogQGZyZXF1ZW5jeTogZGVzaXJlZCBmcmVxdWVuY3kgKDc2IC0gMTA4IE1IeiwgdW5pdCAxMCBLSHosIHN0ZXAgNTAga0h6KQogICovCkBAIC01MDYsOSArNTI4LDkgQEAKIAlpbnQgZXJyOwogCXU4IHZhbFtTSTQ3MTNfVFhGUkVRX05SRVNQXTsKIAkvKgotCSAqIAkuRmlyc3QgYnl0ZSA9IDAKLQkgKiAJLlNlY29uZCBieXRlID0gZnJlcXVlbmN5J3MgTVNCCi0JICogCS5UaGlyZCBieXRlID0gZnJlcXVlbmN5J3MgTFNCCisJICoJLkZpcnN0IGJ5dGUgPSAwCisJICoJLlNlY29uZCBieXRlID0gZnJlcXVlbmN5J3MgTVNCCisJICoJLlRoaXJkIGJ5dGUgPSBmcmVxdWVuY3kncyBMU0IKIAkgKi8KIAljb25zdCB1OCBhcmdzW1NJNDcxM19UWEZSRVFfTkFSR1NdID0gewogCQkweDAwLApAQCAtNTM1LDE0ICs1NTcsMTQgQEAKIH0KIAogLyoKLSAqIHNpNDcxM190eF90dW5lX3Bvd2VyIC0gU2V0cyB0aGUgUkYgdm9sdGFnZSBsZXZlbCBiZXR3ZWVuIDg4IGFuZCAxMTUgZEJ1ViBpbgotICogCQkJMSBkQiB1bml0cy4gQSB2YWx1ZSBvZiAweDAwIGluZGljYXRlcyBvZmYuIFRoZSBjb21tYW5kCi0gKiAJCQlhbHNvIHNldHMgdGhlIGFudGVubmEgdHVuaW5nIGNhcGFjaXRhbmNlLiBBIHZhbHVlIG9mIDAKLSAqIAkJCWluZGljYXRlcyBhdXRvdHVuaW5nLCBhbmQgYSB2YWx1ZSBvZiAxIC0gMTkxIGluZGljYXRlcwotICogCQkJYSBtYW51YWwgb3ZlcnJpZGUsIHdoaWNoIHJlc3VsdHMgaW4gYSB0dW5pbmcKLSAqIAkJCWNhcGFjaXRhbmNlIG9mIDAuMjUgcEYgeCBAYW50Y2FwLgorICogc2k0NzEzX3R4X3R1bmVfcG93ZXIgLSBTZXRzIHRoZSBSRiB2b2x0YWdlIGxldmVsIGJldHdlZW4gODggYW5kIDEyMCBkQnVWIGluCisgKgkJCTEgZEIgdW5pdHMuIEEgdmFsdWUgb2YgMHgwMCBpbmRpY2F0ZXMgb2ZmLiBUaGUgY29tbWFuZAorICoJCQlhbHNvIHNldHMgdGhlIGFudGVubmEgdHVuaW5nIGNhcGFjaXRhbmNlLiBBIHZhbHVlIG9mIDAKKyAqCQkJaW5kaWNhdGVzIGF1dG90dW5pbmcsIGFuZCBhIHZhbHVlIG9mIDEgLSAxOTEgaW5kaWNhdGVzCisgKgkJCWEgbWFudWFsIG92ZXJyaWRlLCB3aGljaCByZXN1bHRzIGluIGEgdHVuaW5nCisgKgkJCWNhcGFjaXRhbmNlIG9mIDAuMjUgcEYgeCBAYW50Y2FwLgogICogQHNkZXY6IHNpNDcxM19kZXZpY2Ugc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlIHdlIGFyZSBjb21tdW5pY2F0aW5nCi0gKiBAcG93ZXI6IHR1bmluZyBwb3dlciAoODggLSAxMTUgZEJ1ViwgdW5pdC9zdGVwIDEgZEIpCisgKiBAcG93ZXI6IHR1bmluZyBwb3dlciAoODggLSAxMjAgZEJ1ViwgdW5pdC9zdGVwIDEgZEIpCiAgKiBAYW50Y2FwOiB2YWx1ZSBvZiBhbnRlbm5hIHR1bmluZyBjYXBhY2l0b3IgKDAgLSAxOTEpCiAgKi8KIHN0YXRpYyBpbnQgc2k0NzEzX3R4X3R1bmVfcG93ZXIoc3RydWN0IHNpNDcxM19kZXZpY2UgKnNkZXYsIHU4IHBvd2VyLApAQCAtNTUxLDIxICs1NzMsMjEgQEAKIAlpbnQgZXJyOwogCXU4IHZhbFtTSTQ3MTNfVFhQV1JfTlJFU1BdOwogCS8qCi0JICogCS5GaXJzdCBieXRlID0gMAotCSAqIAkuU2Vjb25kIGJ5dGUgPSAwCi0JICogCS5UaGlyZCBieXRlID0gcG93ZXIKLQkgKiAJLkZvdXJ0aCBieXRlID0gYW50Y2FwCisJICoJLkZpcnN0IGJ5dGUgPSAwCisJICoJLlNlY29uZCBieXRlID0gMAorCSAqCS5UaGlyZCBieXRlID0gcG93ZXIKKwkgKgkuRm91cnRoIGJ5dGUgPSBhbnRjYXAKIAkgKi8KLQljb25zdCB1OCBhcmdzW1NJNDcxM19UWFBXUl9OQVJHU10gPSB7CisJdTggYXJnc1tTSTQ3MTNfVFhQV1JfTkFSR1NdID0gewogCQkweDAwLAogCQkweDAwLAogCQlwb3dlciwKIAkJYW50Y2FwLAogCX07CiAKLQlpZiAoKChwb3dlciA+IDApICYmIChwb3dlciA8IFNJNDcxM19NSU5fUE9XRVIpKSB8fAotCQlwb3dlciA+IFNJNDcxM19NQVhfUE9XRVIgfHwgYW50Y2FwID4gU0k0NzEzX01BWF9BTlRDQVApCi0JCXJldHVybiAtRURPTTsKKwkvKiBNYXAgcG93ZXIgdmFsdWVzIDEtODcgdG8gTUlOX1BPV0VSICg4OCkgKi8KKwlpZiAocG93ZXIgPiAwICYmIHBvd2VyIDwgU0k0NzEzX01JTl9QT1dFUikKKwkJYXJnc1syXSA9IHBvd2VyID0gU0k0NzEzX01JTl9QT1dFUjsKIAogCWVyciA9IHNpNDcxM19zZW5kX2NvbW1hbmQoc2RldiwgU0k0NzEzX0NNRF9UWF9UVU5FX1BPV0VSLAogCQkJCSAgYXJncywgQVJSQVlfU0laRShhcmdzKSwgdmFsLApAQCAtNTgzLDEyICs2MDUsMTIgQEAKIAogLyoKICAqIHNpNDcxM190eF90dW5lX21lYXN1cmUgLSBFbnRlcnMgcmVjZWl2ZSBtb2RlIGFuZCBtZWFzdXJlcyB0aGUgcmVjZWl2ZWQgbm9pc2UKLSAqIAkJCWxldmVsIGluIHVuaXRzIG9mIGRCdVYgb24gdGhlIHNlbGVjdGVkIGZyZXF1ZW5jeS4KLSAqIAkJCVRoZSBGcmVxdWVuY3kgbXVzdCBiZSBiZXR3ZWVuIDc2IGFuZCAxMDggTUh6IGluIDEwIGtIegotICogCQkJdW5pdHMgYW5kIHN0ZXBzIG9mIDUwIGtIei4gVGhlIGNvbW1hbmQgYWxzbyBzZXRzIHRoZQotICogCQkJYW50ZW5uYQl0dW5pbmcgY2FwYWNpdGFuY2UuIEEgdmFsdWUgb2YgMCBtZWFucwotICogCQkJYXV0b3R1bmluZywgYW5kIGEgdmFsdWUgb2YgMSB0byAxOTEgaW5kaWNhdGVzIG1hbnVhbAotICogCQkJb3ZlcnJpZGUuCisgKgkJCWxldmVsIGluIHVuaXRzIG9mIGRCdVYgb24gdGhlIHNlbGVjdGVkIGZyZXF1ZW5jeS4KKyAqCQkJVGhlIEZyZXF1ZW5jeSBtdXN0IGJlIGJldHdlZW4gNzYgYW5kIDEwOCBNSHogaW4gMTAga0h6CisgKgkJCXVuaXRzIGFuZCBzdGVwcyBvZiA1MCBrSHouIFRoZSBjb21tYW5kIGFsc28gc2V0cyB0aGUKKyAqCQkJYW50ZW5uYQl0dW5pbmcgY2FwYWNpdGFuY2UuIEEgdmFsdWUgb2YgMCBtZWFucworICoJCQlhdXRvdHVuaW5nLCBhbmQgYSB2YWx1ZSBvZiAxIHRvIDE5MSBpbmRpY2F0ZXMgbWFudWFsCisgKgkJCW92ZXJyaWRlLgogICogQHNkZXY6IHNpNDcxM19kZXZpY2Ugc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlIHdlIGFyZSBjb21tdW5pY2F0aW5nCiAgKiBAZnJlcXVlbmN5OiBkZXNpcmVkIGZyZXF1ZW5jeSAoNzYgLSAxMDggTUh6LCB1bml0IDEwIEtIeiwgc3RlcCA1MCBrSHopCiAgKiBAYW50Y2FwOiB2YWx1ZSBvZiBhbnRlbm5hIHR1bmluZyBjYXBhY2l0b3IgKDAgLSAxOTEpCkBAIC01OTksMTAgKzYyMSwxMCBAQAogCWludCBlcnI7CiAJdTggdmFsW1NJNDcxM19UWE1FQV9OUkVTUF07CiAJLyoKLQkgKiAJLkZpcnN0IGJ5dGUgPSAwCi0JICogCS5TZWNvbmQgYnl0ZSA9IGZyZXF1ZW5jeSdzIE1TQgotCSAqIAkuVGhpcmQgYnl0ZSA9IGZyZXF1ZW5jeSdzIExTQgotCSAqIAkuRm91cnRoIGJ5dGUgPSBhbnRjYXAKKwkgKgkuRmlyc3QgYnl0ZSA9IDAKKwkgKgkuU2Vjb25kIGJ5dGUgPSBmcmVxdWVuY3kncyBNU0IKKwkgKgkuVGhpcmQgYnl0ZSA9IGZyZXF1ZW5jeSdzIExTQgorCSAqCS5Gb3VydGggYnl0ZSA9IGFudGNhcAogCSAqLwogCWNvbnN0IHU4IGFyZ3NbU0k0NzEzX1RYTUVBX05BUkdTXSA9IHsKIAkJMHgwMCwKQEAgLTYzMiwxMSArNjU0LDExIEBACiAKIC8qCiAgKiBzaTQ3MTNfdHhfdHVuZV9zdGF0dXMtIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgdHhfdHVuZV9mcmVxLCB0eF90dW5lX21lYSBvcgotICogCQkJdHhfdHVuZV9wb3dlciBjb21tYW5kcy4gVGhpcyBjb21tYW5kIHJldHVybiB0aGUgY3VycmVudAotICogCQkJZnJlcXVlbmN5LCBvdXRwdXQgdm9sdGFnZSBpbiBkQnVWLCB0aGUgYW50ZW5uYSB0dW5uaW5nCi0gKiAJCQljYXBhY2l0YW5jZSB2YWx1ZSBhbmQgdGhlIHJlY2VpdmVkIG5vaXNlIGxldmVsLiBUaGUKLSAqIAkJCWNvbW1hbmQgYWxzbyBjbGVhcnMgdGhlIHN0Y2ludCBpbnRlcnJ1cHQgYml0IHdoZW4gdGhlCi0gKiAJCQlmaXJzdCBiaXQgb2YgaXRzIGFyZ3VtZW50cyBpcyBoaWdoLgorICoJCQl0eF90dW5lX3Bvd2VyIGNvbW1hbmRzLiBUaGlzIGNvbW1hbmQgcmV0dXJuIHRoZSBjdXJyZW50CisgKgkJCWZyZXF1ZW5jeSwgb3V0cHV0IHZvbHRhZ2UgaW4gZEJ1ViwgdGhlIGFudGVubmEgdHVubmluZworICoJCQljYXBhY2l0YW5jZSB2YWx1ZSBhbmQgdGhlIHJlY2VpdmVkIG5vaXNlIGxldmVsLiBUaGUKKyAqCQkJY29tbWFuZCBhbHNvIGNsZWFycyB0aGUgc3RjaW50IGludGVycnVwdCBiaXQgd2hlbiB0aGUKKyAqCQkJZmlyc3QgYml0IG9mIGl0cyBhcmd1bWVudHMgaXMgaGlnaC4KICAqIEBzZGV2OiBzaTQ3MTNfZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZSB3ZSBhcmUgY29tbXVuaWNhdGluZwogICogQGludGFjazogMHgwMSB0byBjbGVhciB0aGUgc2Vlay90dW5lIGNvbXBsZXRlIGludGVycnVwdCBzdGF0dXMgaW5kaWNhdG9yLgogICogQGZyZXF1ZW5jeTogcmV0dXJuZWQgZnJlcXVlbmN5CkBAIC02NTEsNyArNjczLDcgQEAKIAlpbnQgZXJyOwogCXU4IHZhbFtTSTQ3MTNfVFhTVEFUVVNfTlJFU1BdOwogCS8qCi0JICogCS5GaXJzdCBieXRlID0gaW50YWNrIGJpdAorCSAqCS5GaXJzdCBieXRlID0gaW50YWNrIGJpdAogCSAqLwogCWNvbnN0IHU4IGFyZ3NbU0k0NzEzX1RYU1RBVFVTX05BUkdTXSA9IHsKIAkJaW50YWNrICYgU0k0NzEzX0lOVEFDS19NQVNLLApAQCAtODEyLDggKzgzNCw5IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2k0NzEzX3NldF9yZHNfcmFkaW9fdGV4dChzdHJ1Y3Qgc2k0NzEzX2RldmljZSAqc2RldiwgY2hhciAqcnQpCitzdGF0aWMgaW50IHNpNDcxM19zZXRfcmRzX3JhZGlvX3RleHQoc3RydWN0IHNpNDcxM19kZXZpY2UgKnNkZXYsIGNvbnN0IGNoYXIgKnJ0KQogeworCXN0YXRpYyBjb25zdCBjaGFyIGNyW1JEU19SQURJT1RFWFRfQkxLX1NJWkVdID0geyBSRFNfQ0FSUklBR0VfUkVUVVJOLCAwIH07CiAJaW50IHJ2YWwgPSAwLCBpOwogCXUxNiB0X2luZGV4ID0gMDsKIAl1OCBiX2luZGV4ID0gMCwgY3JfaW5zZXJ0ZWQgPSAwOwpAQCAtODM3LDcgKzg2MCw3IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgUkRTX1JBRElPVEVYVF9CTEtfU0laRTsgaSsrKSB7CiAJCQkJaWYgKCFydFt0X2luZGV4ICsgaV0gfHwKIAkJCQkgICAgcnRbdF9pbmRleCArIGldID09IFJEU19DQVJSSUFHRV9SRVRVUk4pIHsKLQkJCQkJcnRbdF9pbmRleCArIGldID0gUkRTX0NBUlJJQUdFX1JFVFVSTjsKKwkJCQkJcnQgPSBjcjsKIAkJCQkJY3JfaW5zZXJ0ZWQgPSAxOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0xMDI0LDcgKzEwNDcsNiBAQAogCWlmIChydmFsIDwgMCkKIAkJcmV0dXJuIHJ2YWw7CiAKLQogCXNkZXYtPmZyZXF1ZW5jeSA9IERFRkFVTFRfRlJFUVVFTkNZOwogCXNkZXYtPnN0ZXJlbyA9IDE7CiAJc2Rldi0+dHVuZV9ybmwgPSBERUZBVUxUX1RVTkVfUk5MOwpAQCAtMTM0NSw3ICsxMzY3LDcgQEAKIAlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbDsKIAlpbnQgcnZhbCwgaTsKIAotCXNkZXYgPSBremFsbG9jKHNpemVvZiAqc2RldiwgR0ZQX0tFUk5FTCk7CisJc2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpzZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZGV2KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHZpZGVvIGRldmljZS5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKQEAgLTEzNjIsMTMgKzEzODQsMTQgQEAKIAkJfQogCQlzZGV2LT5ncGlvX3Jlc2V0ID0gcGRhdGEtPmdwaW9fcmVzZXQ7CiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChzZGV2LT5ncGlvX3Jlc2V0LCAwKTsKKwkJc2Rldi0+c3VwcGxpZXMgPSBwZGF0YS0+c3VwcGxpZXM7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2Rldi0+c3VwcGxpZXMpOyBpKyspCi0JCXNkZXYtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHNpNDcxM19zdXBwbHlfbmFtZXNbaV07CisJZm9yIChpID0gMDsgaSA8IHNkZXYtPnN1cHBsaWVzOyBpKyspCisJCXNkZXYtPnN1cHBseV9kYXRhW2ldLnN1cHBseSA9IHBkYXRhLT5zdXBwbHlfbmFtZXNbaV07CiAKLQlydmFsID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZjbGllbnQtPmRldiwgQVJSQVlfU0laRShzZGV2LT5zdXBwbGllcyksCi0JCQkJICBzZGV2LT5zdXBwbGllcyk7CisJcnZhbCA9IHJlZ3VsYXRvcl9idWxrX2dldCgmY2xpZW50LT5kZXYsIHNkZXYtPnN1cHBsaWVzLAorCQkJCSAgc2Rldi0+c3VwcGx5X2RhdGEpOwogCWlmIChydmFsKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2Fubm90IGdldCByZWd1bGF0b3JzOiAlZFxuIiwgcnZhbCk7CiAJCWdvdG8gZnJlZV9ncGlvOwpAQCAtMTQyMCw4ICsxNDQzLDggQEAKIAkJCVY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0dBSU4sIDAsIE1BWF9BQ09NUF9HQUlOLCAxLAogCQkJREVGQVVMVF9BQ09NUF9HQUlOKTsKIAlzZGV2LT5jb21wcmVzc2lvbl90aHJlc2hvbGQgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZzaTQ3MTNfY3RybF9vcHMsCi0JCQlWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9USFJFU0hPTEQsIE1JTl9BQ09NUF9USFJFU0hPTEQsCi0JCQlNQVhfQUNPTVBfVEhSRVNIT0xELCAxLAorCQkJVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fVEhSRVNIT0xELAorCQkJTUlOX0FDT01QX1RIUkVTSE9MRCwgTUFYX0FDT01QX1RIUkVTSE9MRCwgMSwKIAkJCURFRkFVTFRfQUNPTVBfVEhSRVNIT0xEKTsKIAlzZGV2LT5jb21wcmVzc2lvbl9hdHRhY2tfdGltZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNpNDcxM19jdHJsX29wcywKIAkJCVY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0FUVEFDS19USU1FLCAwLApAQCAtMTQ0Myw5ICsxNDY2LDExIEBACiAJCQlWNEwyX0NJRF9UVU5FX1BSRUVNUEhBU0lTLAogCQkJVjRMMl9QUkVFTVBIQVNJU183NV91UywgMCwgVjRMMl9QUkVFTVBIQVNJU181MF91Uyk7CiAJc2Rldi0+dHVuZV9wd3JfbGV2ZWwgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZzaTQ3MTNfY3RybF9vcHMsCi0JCQlWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMLCAwLCAxMjAsIDEsIERFRkFVTFRfUE9XRVJfTEVWRUwpOworCQkJVjRMMl9DSURfVFVORV9QT1dFUl9MRVZFTCwgMCwgU0k0NzEzX01BWF9QT1dFUiwKKwkJCTEsIERFRkFVTFRfUE9XRVJfTEVWRUwpOwogCXNkZXYtPnR1bmVfYW50X2NhcCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNpNDcxM19jdHJsX29wcywKLQkJCVY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1IsIDAsIDE5MSwgMSwgMCk7CisJCQlWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SLCAwLCBTSTQ3MTNfTUFYX0FOVENBUCwKKwkJCTEsIDApOwogCiAJaWYgKGhkbC0+ZXJyb3IpIHsKIAkJcnZhbCA9IGhkbC0+ZXJyb3I7CkBAIC0xNDgxLDcgKzE1MDYsNyBAQAogZnJlZV9jdHJsczoKIAl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKGhkbCk7CiBwdXRfcmVnOgotCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShzZGV2LT5zdXBwbGllcyksIHNkZXYtPnN1cHBsaWVzKTsKKwlyZWd1bGF0b3JfYnVsa19mcmVlKHNkZXYtPnN1cHBsaWVzLCBzZGV2LT5zdXBwbHlfZGF0YSk7CiBmcmVlX2dwaW86CiAJaWYgKGdwaW9faXNfdmFsaWQoc2Rldi0+Z3Bpb19yZXNldCkpCiAJCWdwaW9fZnJlZShzZGV2LT5ncGlvX3Jlc2V0KTsKQEAgLTE1MDUsNyArMTUzMCw3IEBACiAKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CiAJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZShzZC0+Y3RybF9oYW5kbGVyKTsKLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUoc2Rldi0+c3VwcGxpZXMpLCBzZGV2LT5zdXBwbGllcyk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShzZGV2LT5zdXBwbGllcywgc2Rldi0+c3VwcGx5X2RhdGEpOwogCWlmIChncGlvX2lzX3ZhbGlkKHNkZXYtPmdwaW9fcmVzZXQpKQogCQlncGlvX2ZyZWUoc2Rldi0+Z3Bpb19yZXNldCk7CiAJa2ZyZWUoc2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzL3NpNDcxMy5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy9zaTQ3MTMuaAppbmRleCAyNWNkZWEyLi40ODM3Y2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuaAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy9zaTQ3MTMuaApAQCAtMTUsNiArMTUsNyBAQAogI2lmbmRlZiBTSTQ3MTNfSTJDX0gKICNkZWZpbmUgU0k0NzEzX0kyQ19ICiAKKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zaTQ3MTMuaD4KQEAgLTIyNiw3ICsyMjcsOCBAQAogCQlzdHJ1Y3QgdjRsMl9jdHJsICp0dW5lX2FudF9jYXA7CiAJfTsKIAlzdHJ1Y3QgY29tcGxldGlvbiB3b3JrOwotCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1NJNDcxM19OVU1fU1VQUExJRVNdOworCXVuc2lnbmVkIHN1cHBsaWVzOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBseV9kYXRhW1NJNDcxM19OVU1fU1VQUExJRVNdOwogCWludCBncGlvX3Jlc2V0OwogCXUzMiBwb3dlcl9zdGF0ZTsKIAl1MzIgcmRzX2VuYWJsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3RlYTU3NXguYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vdGVhNTc1eC5jCmluZGV4IGNlZjA2OTguLjdjMTQwNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vdGVhNTc1eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vdGVhNTc1eC5jCkBAIC0yMCwxMiArMjAsMTIgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWZoLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYyBiL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jCmluZGV4IGYzMjk0ODUuLjgyMmI5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jCkBAIC0xOTA5LDEwICsxOTA5LDggQEAKIAlpbnQgcmV0LCBpOwogCiAJaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaWRldikgewotCQlkZXZfZXJyKGljdHgtPmRldiwgImlucHV0IGRldiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFpZGV2KQogCQlnb3RvIG91dDsKLQl9CiAKIAlzbnByaW50ZihpY3R4LT5uYW1lX2lkZXYsIHNpemVvZihpY3R4LT5uYW1lX2lkZXYpLAogCQkgImlNT04gUGFuZWwsIEtub2IgYW5kIE1vdXNlKCUwNHg6JTA0eCkiLApAQCAtMTk2MCwxMCArMTk1OCw4IEBACiAJaW50IHJldDsKIAogCXRvdWNoID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCF0b3VjaCkgewotCQlkZXZfZXJyKGljdHgtPmRldiwgInRvdWNoc2NyZWVuIGlucHV0IGRldiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCF0b3VjaCkKIAkJZ290byB0b3VjaF9hbGxvY19mYWlsZWQ7Ci0JfQogCiAJc25wcmludGYoaWN0eC0+bmFtZV90b3VjaCwgc2l6ZW9mKGljdHgtPm5hbWVfdG91Y2gpLAogCQkgImlNT04gVVNCIFRvdWNoc2NyZWVuICglMDR4OiUwNHgpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9NYWtlZmlsZQppbmRleCBiMWNkZThjLi4wYjhjNTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL01ha2VmaWxlCkBAIC05OCw0ICs5OCw1IEBACiAJCQlyYy12aWRlb21hdGUtczM1MC5vIFwKIAkJCXJjLXZpZGVvbWF0ZS10di1wdnIubyBcCiAJCQlyYy13aW5mYXN0Lm8gXAotCQkJcmMtd2luZmFzdC11c2JpaS1kZWx1eGUubworCQkJcmMtd2luZmFzdC11c2JpaS1kZWx1eGUubyBcCisJCQlyYy1zdTMwMDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXN1MzAwMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXN1MzAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc3UzMDAwLmMKQEAgLTAsMCArMSw3NSBAQAorLyogcmMtc3UzMDAwLmggLSBLZXl0YWJsZSBmb3IgR2VuaWF0ZWNoIEhEU3RhciBSZW1vdGUgQ29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBieSBFdmdlbnkgUGxlaG92IDxFdmdlbnkgUGxlaG92QHVrci5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHN1MzAwMFtdID0geworCXsgMHgyNSwgS0VZX1BPV0VSIH0sCS8qIHJpZ2h0LWJvdHRvbSBSZWQgKi8KKwl7IDB4MGEsIEtFWV9NVVRFIH0sCS8qIC0vLS0gKi8KKwl7IDB4MDEsIEtFWV8xIH0sCisJeyAweDAyLCBLRVlfMiB9LAorCXsgMHgwMywgS0VZXzMgfSwKKwl7IDB4MDQsIEtFWV80IH0sCisJeyAweDA1LCBLRVlfNSB9LAorCXsgMHgwNiwgS0VZXzYgfSwKKwl7IDB4MDcsIEtFWV83IH0sCisJeyAweDA4LCBLRVlfOCB9LAorCXsgMHgwOSwgS0VZXzkgfSwKKwl7IDB4MDAsIEtFWV8wIH0sCisJeyAweDIwLCBLRVlfVVAgfSwJLyogQ0grICovCisJeyAweDIxLCBLRVlfRE9XTiB9LAkvKiBDSCsgKi8KKwl7IDB4MTIsIEtFWV9WT0xVTUVVUCB9LAkvKiBCcmlnaHRuZXNzIFVwICovCisJeyAweDEzLCBLRVlfVk9MVU1FRE9XTiB9LC8qIEJyaWdodG5lc3MgRG93biAqLworCXsgMHgxZiwgS0VZX1JFQ09SRCB9LAorCXsgMHgxNywgS0VZX1BMQVkgfSwKKwl7IDB4MTYsIEtFWV9QQVVTRSB9LAorCXsgMHgwYiwgS0VZX1NUT1AgfSwKKwl7IDB4MjcsIEtFWV9GQVNURk9SV0FSRCB9LC8qID4+ICovCisJeyAweDI2LCBLRVlfUkVXSU5EIH0sCS8qIDw8ICovCisJeyAweDBkLCBLRVlfT0sgfSwJLyogTXV0ZSAqLworCXsgMHgxMSwgS0VZX0xFRlQgfSwJLyogVk9MLSAqLworCXsgMHgxMCwgS0VZX1JJR0hUIH0sCS8qIFZPTCsgKi8KKwl7IDB4MjksIEtFWV9CQUNLIH0sCS8qIGJ1dHRvbiB1bmRlciA5ICovCisJeyAweDJjLCBLRVlfTUVOVSB9LAkvKiBUVFggKi8KKwl7IDB4MmIsIEtFWV9FUEcgfSwJLyogRVBHICovCisJeyAweDFlLCBLRVlfUkVEIH0sCS8qIE9TRCAqLworCXsgMHgwZSwgS0VZX0dSRUVOIH0sCS8qIFdpbmRvdyAqLworCXsgMHgyZCwgS0VZX1lFTExPVyB9LAkvKiBidXR0b24gdW5kZXIgPDwgKi8KKwl7IDB4MGYsIEtFWV9CTFVFIH0sCS8qIGJvdHRvbSB5ZWxsb3cgYnV0dG9uICovCisJeyAweDE0LCBLRVlfQVVESU8gfSwJLyogU25hcHNob3QgKi8KKwl7IDB4MzgsIEtFWV9UViB9LAkvKiBUVi9SYWRpbyAqLworCXsgMHgwYywgS0VZX0VTQyB9CS8qIHVwcGVyIFJlZCBidXR0b24gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3Qgc3UzMDAwX21hcCA9IHsKKwkubWFwID0geworCQkuc2NhbiAgICA9IHN1MzAwMCwKKwkJLnNpemUgICAgPSBBUlJBWV9TSVpFKHN1MzAwMCksCisJCS5yY190eXBlID0gUkNfVFlQRV9SQzUsCisJCS5uYW1lICAgID0gUkNfTUFQX1NVMzAwMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JjX21hcF9zdTMwMDAodm9pZCkKK3sKKwlyZXR1cm4gcmNfbWFwX3JlZ2lzdGVyKCZzdTMwMDBfbWFwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmNfbWFwX3N1MzAwMCh2b2lkKQoreworCXJjX21hcF91bnJlZ2lzdGVyKCZzdTMwMDBfbWFwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9yY19tYXBfc3UzMDAwKQorbW9kdWxlX2V4aXQoZXhpdF9yY19tYXBfc3UzMDAwKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJFdmdlbnkgUGxlaG92IDxFdmdlbnkgUGxlaG92QHVrci5uZXQ+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwppbmRleCAzYzc2MTAxLi5hMjViYjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKQEAgLTE5OSw2ICsxOTksNyBAQAogI2RlZmluZSBWRU5ET1JfVElWTwkJMHgxMDVhCiAjZGVmaW5lIFZFTkRPUl9DT05FWEFOVAkJMHgwNTcyCiAjZGVmaW5lIFZFTkRPUl9UV0lTVEVETUVMT04JMHgyNTk2CisjZGVmaW5lIFZFTkRPUl9IQVVQUEFVR0UJMHgyMDQwCiAKIGVudW0gbWNldXNiX21vZGVsX3R5cGUgewogCU1DRV9HRU4yID0gMCwJCS8qIE1vc3QgYm9hcmRzICovCkBAIC0yMTAsNiArMjExLDcgQEAKIAlNVUxUSUZVTkNUSU9OLAogCVRJVk9fS0lULAogCU1DRV9HRU4yX05PX1RYLAorCUhBVVBQQVVHRV9DWF9IWUJSSURfVFYsCiB9OwogCiBzdHJ1Y3QgbWNldXNiX21vZGVsIHsKQEAgLTI1OCw2ICsyNjAsMTEgQEAKIAkJLm5vX3R4ID0gMSwgLyogdHggaXNuJ3Qgd2lyZWQgdXAgYXQgYWxsICovCiAJCS5uYW1lID0gIkNvbmV4YW50IEh5YnJpZCBUViAoY3gyMzF4eCkgTUNFIElSIiwKIAl9LAorCVtIQVVQUEFVR0VfQ1hfSFlCUklEX1RWXSA9IHsKKwkJLnJjX21hcCA9IFJDX01BUF9IQVVQUEFVR0UsCisJCS5ub190eCA9IDEsIC8qIGVlcHJvbSBzYXlzIGl0IGhhcyBubyB0eCAqLworCQkubmFtZSA9ICJDb25leGFudCBIeWJyaWQgVFYgKGN4MjMxeHgpIE1DRSBJUiBubyBUWCIsCisJfSwKIAlbTVVMVElGVU5DVElPTl0gPSB7CiAJCS5tY2VfZ2VuMiA9IDEsCiAJCS5pcl9pbnRmbnVtID0gMiwKQEAgLTM5OSw2ICs0MDYsOSBAQAogCXsgVVNCX0RFVklDRShWRU5ET1JfVFdJU1RFRE1FTE9OLCAweDgwMTYpIH0sCiAJLyogVHdpc3RlZCBNZWxvbiBJbmMuIC0gTWFudGEgVHJhbnNjZWl2ZXIgKi8KIAl7IFVTQl9ERVZJQ0UoVkVORE9SX1RXSVNURURNRUxPTiwgMHg4MDQyKSB9LAorCS8qIEhhdXBwYXVnZSBXSU5UVi1IVlItSFZSIDkzMEMtSEQgLSBiYXNlZCBvbiBjeDIzMXh4ICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9IQVVQUEFVR0UsIDB4YjEzMCksCisJICAuZHJpdmVyX2luZm8gPSBIQVVQUEFVR0VfQ1hfSFlCUklEX1RWIH0sCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCmluZGV4IDQ2ZGEzNjUuLjAyZTJmMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCkBAIC0yMiw2ICsyMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInJjLWNvcmUtcHJpdi5oIgogCisvKiBCaXRtYXAgdG8gc3RvcmUgYWxsb2NhdGVkIGRldmljZSBudW1iZXJzIGZyb20gMCB0byBJUlJDVl9OVU1fREVWSUNFUyAtIDEgKi8KKyNkZWZpbmUgSVJSQ1ZfTlVNX0RFVklDRVMgICAgICAyNTYKK0RFQ0xBUkVfQklUTUFQKGlyX2NvcmVfZGV2X251bWJlciwgSVJSQ1ZfTlVNX0RFVklDRVMpOworCiAvKiBTaXplcyBhcmUgaW4gYnl0ZXMsIDI1NiBieXRlcyBhbGxvd3MgZm9yIDMyIGVudHJpZXMgb24geDY0ICovCiAjZGVmaW5lIElSX1RBQl9NSU5fU0laRQkyNTYKICNkZWZpbmUgSVJfVEFCX01BWF9TSVpFCTgxOTIKQEAgLTEwNjUsMTAgKzEwNjksOSBAQAogaW50IHJjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgcmNfZGV2ICpkZXYpCiB7CiAJc3RhdGljIGJvb2wgcmF3X2luaXQgPSBmYWxzZTsgLyogcmF3IGRlY29kZXJzIGxvYWRlZD8gKi8KLQlzdGF0aWMgYXRvbWljX3QgZGV2bm8gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3QgcmNfbWFwICpyY19tYXA7CiAJY29uc3QgY2hhciAqcGF0aDsKLQlpbnQgcmM7CisJaW50IHJjLCBkZXZubzsKIAogCWlmICghZGV2IHx8ICFkZXYtPm1hcF9uYW1lKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwOTYsNyArMTA5OSwxNSBAQAogCSAqLwogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKLQlkZXYtPmRldm5vID0gKHVuc2lnbmVkIGxvbmcpKGF0b21pY19pbmNfcmV0dXJuKCZkZXZubykgLSAxKTsKKwlkbyB7CisJCWRldm5vID0gZmluZF9maXJzdF96ZXJvX2JpdChpcl9jb3JlX2Rldl9udW1iZXIsCisJCQkJCSAgICBJUlJDVl9OVU1fREVWSUNFUyk7CisJCS8qIE5vIGZyZWUgZGV2aWNlIHNsb3RzICovCisJCWlmIChkZXZubyA+PSBJUlJDVl9OVU1fREVWSUNFUykKKwkJCXJldHVybiAtRU5PTUVNOworCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoZGV2bm8sIGlyX2NvcmVfZGV2X251bWJlcikpOworCisJZGV2LT5kZXZubyA9IGRldm5vOwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJyYyVsZCIsIGRldi0+ZGV2bm8pOwogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGRldik7CiAJcmMgPSBkZXZpY2VfYWRkKCZkZXYtPmRldik7CkBAIC0xMTg2LDYgKzExOTcsNyBAQAogCWRldmljZV9kZWwoJmRldi0+ZGV2KTsKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCWNsZWFyX2JpdChkZXYtPmRldm5vLCBpcl9jb3JlX2Rldl9udW1iZXIpOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJjX3JlZ2lzdGVyX2RldmljZSk7CkBAIC0xMTk3LDYgKzEyMDksOCBAQAogCiAJZGVsX3RpbWVyX3N5bmMoJmRldi0+dGltZXJfa2V5dXApOwogCisJY2xlYXJfYml0KGRldi0+ZGV2bm8sIGlyX2NvcmVfZGV2X251bWJlcik7CisKIAlpZiAoZGV2LT5kcml2ZXJfdHlwZSA9PSBSQ19EUklWRVJfSVJfUkFXKQogCQlpcl9yYXdfZXZlbnRfdW5yZWdpc3RlcihkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3N0X3JjLmMgYi9kcml2ZXJzL21lZGlhL3JjL3N0X3JjLmMKaW5kZXggNjUxMjBjMi4uOGYwY2RkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9zdF9yYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvc3RfcmMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgogCkBAIC0yOCw2ICsyOSw3IEBACiAJaW50CQkJCXNhbXBsZV9tdWx0OwogCWludAkJCQlzYW1wbGVfZGl2OwogCWJvb2wJCQkJcnh1aGZtb2RlOworCXN0cnVjdAlyZXNldF9jb250cm9sCQkqcnN0YzsKIH07CiAKIC8qIFJlZ2lzdGVycyAqLwpAQCAtMTYxLDYgKzE2MywxMCBAQAogCXVuc2lnbmVkIGludCByeF9tYXhfc3ltYm9sX3BlciA9IE1BWF9TWU1CX1RJTUU7CiAJdW5zaWduZWQgaW50IHJ4X3NhbXBsaW5nX2ZyZXFfZGl2OwogCisJLyogRW5hYmxlIHRoZSBJUCAqLworCWlmIChkZXYtPnJzdGMpCisJCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoZGV2LT5yc3RjKTsKKwogCWNsa19wcmVwYXJlX2VuYWJsZShkZXYtPnN5c19jbG9jayk7CiAJYmFzZWNsb2NrID0gY2xrX2dldF9yYXRlKGRldi0+c3lzX2Nsb2NrKTsKIApAQCAtMjcxLDYgKzI3NywxMSBAQAogCWVsc2UKIAkJcmNfZGV2LT5yeF9iYXNlID0gcmNfZGV2LT5iYXNlOwogCisKKwlyY19kZXYtPnJzdGMgPSByZXNldF9jb250cm9sX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIocmNfZGV2LT5yc3RjKSkKKwkJcmNfZGV2LT5yc3RjID0gTlVMTDsKKwogCXJjX2Rldi0+ZGV2ID0gZGV2OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJjX2Rldik7CiAJc3RfcmNfaGFyZHdhcmVfaW5pdChyY19kZXYpOwpAQCAtMzM4LDYgKzM0OSw4IEBACiAJCXdyaXRlbCgweDAwLCByY19kZXYtPnJ4X2Jhc2UgKyBJUkJfUlhfRU4pOwogCQl3cml0ZWwoMHgwMCwgcmNfZGV2LT5yeF9iYXNlICsgSVJCX1JYX0lOVF9FTik7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShyY19kZXYtPnN5c19jbG9jayk7CisJCWlmIChyY19kZXYtPnJzdGMpCisJCQlyZXNldF9jb250cm9sX2Fzc2VydChyY19kZXYtPnJzdGMpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS90dW5lcnMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdHVuZXJzL0tjb25maWcKaW5kZXggMTU2NjVkZS4uYmEyZTM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS90dW5lcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9LY29uZmlnCkBAIC0yMTUsNiArMjE1LDEzIEBACiAJaGVscAogCSAgRkNJIEZDMjU4MCBzaWxpY29uIHR1bmVyIGRyaXZlci4KIAorY29uZmlnIE1FRElBX1RVTkVSX004OFRTMjAyMgorCXRyaXN0YXRlICJNb250YWdlIE04OFRTMjAyMiBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gTUVESUFfU1VQUE9SVCAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgIU1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCisJaGVscAorCSAgTW9udGFnZSBNODhUUzIwMjIgc2lsaWNvbiB0dW5lciBkcml2ZXIuCisKIGNvbmZpZyBNRURJQV9UVU5FUl9UVUE5MDAxCiAJdHJpc3RhdGUgIkluZmluZW9uIFRVQSA5MDAxIHNpbGljb24gdHVuZXIiCiAJZGVwZW5kcyBvbiBNRURJQV9TVVBQT1JUICYmIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS90dW5lcnMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9NYWtlZmlsZQppbmRleCAzMDhmMTA4Li5lZmU4MmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3R1bmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX0U0MDAwKSArPSBlNDAwMC5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfRkMyNTgwKSArPSBmYzI1ODAubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1RVQTkwMDEpICs9IHR1YTkwMDEubworb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX004OFRTMjAyMikgKz0gbTg4dHMyMDIyLm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9GQzAwMTEpICs9IGZjMDAxMS5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfRkMwMDEyKSArPSBmYzAwMTIubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX0ZDMDAxMykgKz0gZmMwMDEzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdHVuZXJzL2U0MDAwLmMgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9lNDAwMC5jCmluZGV4IDcyOTcxYTguLjQwYzFkYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdHVuZXJzL2U0MDAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS90dW5lcnMvZTQwMDAuYwpAQCAtMjQzLDggKzI0MywxMCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPT0gQVJSQVlfU0laRShlNDAwMF9wbGxfbHV0KSkKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGU0MDAwX3BsbF9sdXQpKSB7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyOworCX0KIAogCS8qCiAJICogTm90ZTogQ3VycmVudGx5IGZfdmNvIG92ZXJmbG93cyB3aGVuIGMtPmZyZXF1ZW5jeSBpcyAxIDA3MyA3NDEgODI0IEh6CkBAIC0yNzEsOCArMjczLDEwIEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGU0MDBfbG5hX2ZpbHRlcl9sdXQpKQorCWlmIChpID09IEFSUkFZX1NJWkUoZTQwMF9sbmFfZmlsdGVyX2x1dCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CisJfQogCiAJcmV0ID0gZTQwMDBfd3JfcmVnKHByaXYsIDB4MTAsIGU0MDBfbG5hX2ZpbHRlcl9sdXRbaV0udmFsKTsKIAlpZiAocmV0IDwgMCkKQEAgLTI4NCw4ICsyODgsMTAgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChpID09IEFSUkFZX1NJWkUoZTQwMDBfaWZfZmlsdGVyX2x1dCkpCisJaWYgKGkgPT0gQVJSQVlfU0laRShlNDAwMF9pZl9maWx0ZXJfbHV0KSkgeworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKKwl9CiAKIAlidWZbMF0gPSBlNDAwMF9pZl9maWx0ZXJfbHV0W2ldLnJlZzExX3ZhbDsKIAlidWZbMV0gPSBlNDAwMF9pZl9maWx0ZXJfbHV0W2ldLnJlZzEyX3ZhbDsKQEAgLTMwMCw4ICszMDYsMTAgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChpID09IEFSUkFZX1NJWkUoZTQwMDBfYmFuZF9sdXQpKQorCWlmIChpID09IEFSUkFZX1NJWkUoZTQwMDBfYmFuZF9sdXQpKSB7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyOworCX0KIAogCXJldCA9IGU0MDAwX3dyX3JlZyhwcml2LCAweDA3LCBlNDAwMF9iYW5kX2x1dFtpXS5yZWcwN192YWwpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS90dW5lcnMvbTg4dHMyMDIyLmMgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tODh0czIwMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM0MmRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS90dW5lcnMvbTg4dHMyMDIyLmMKQEAgLTAsMCArMSw2NzQgQEAKKy8qCisgKiBNb250YWdlIE04OFRTMjAyMiBzaWxpY29uIHR1bmVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogU29tZSBjYWxjdWxhdGlvbnMgYXJlIHRha2VuIGZyb20gZXhpc3RpbmcgVFMyMDIwIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSAibTg4dHMyMDIyX3ByaXYuaCIKKworLyogd3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IG04OHRzMjAyMl93cl9yZWdzKHN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiwKKwkJdTggcmVnLCBjb25zdCB1OCAqdmFsLCBpbnQgbGVuKQoreworI2RlZmluZSBNQVhfV1JfTEVOIDMKKyNkZWZpbmUgTUFYX1dSX1hGRVJfTEVOIChNQVhfV1JfTEVOICsgMSkKKwlpbnQgcmV0OworCXU4IGJ1ZltNQVhfV1JfWEZFUl9MRU5dOworCXN0cnVjdCBpMmNfbXNnIG1zZ1sxXSA9IHsKKwkJeworCQkJLmFkZHIgPSBwcml2LT5jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEgKyBsZW4sCisJCQkuYnVmID0gYnVmLAorCQl9CisJfTsKKworCWlmIChXQVJOX09OKGxlbiA+IE1BWF9XUl9MRU4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IHJlZzsKKwltZW1jcHkoJmJ1ZlsxXSwgdmFsLCBsZW4pOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmNsaWVudC0+YWRhcHRlciwgbXNnLCAxKTsKKwlpZiAocmV0ID09IDEpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlkZXZfd2FybigmcHJpdi0+Y2xpZW50LT5kZXYsCisJCQkJIiVzOiBpMmMgd3IgZmFpbGVkPSVkIHJlZz0lMDJ4IGxlbj0lZFxuIiwKKwkJCQlLQlVJTERfTU9ETkFNRSwgcmV0LCByZWcsIGxlbik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogcmVhZCBtdWx0aXBsZSByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgbTg4dHMyMDIyX3JkX3JlZ3Moc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2LCB1OCByZWcsCisJCXU4ICp2YWwsIGludCBsZW4pCit7CisjZGVmaW5lIE1BWF9SRF9MRU4gMQorI2RlZmluZSBNQVhfUkRfWEZFUl9MRU4gKE1BWF9SRF9MRU4pCisJaW50IHJldDsKKwl1OCBidWZbTUFYX1JEX1hGRVJfTEVOXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsKKwkJCS5hZGRyID0gcHJpdi0+Y2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9ICZyZWcsCisJCX0sIHsKKwkJCS5hZGRyID0gcHJpdi0+Y2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gbGVuLAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisKKwlpZiAoV0FSTl9PTihsZW4gPiBNQVhfUkRfTEVOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+Y2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChyZXQgPT0gMikgeworCQltZW1jcHkodmFsLCBidWYsIGxlbik7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJnByaXYtPmNsaWVudC0+ZGV2LAorCQkJCSIlczogaTJjIHJkIGZhaWxlZD0lZCByZWc9JTAyeCBsZW49JWRcbiIsCisJCQkJS0JVSUxEX01PRE5BTUUsIHJldCwgcmVnLCBsZW4pOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciAqLworc3RhdGljIGludCBtODh0czIwMjJfd3JfcmVnKHN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiwgdTggcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIG04OHRzMjAyMl93cl9yZWdzKHByaXYsIHJlZywgJnZhbCwgMSk7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IG04OHRzMjAyMl9yZF9yZWcoc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2LCB1OCByZWcsIHU4ICp2YWwpCit7CisJcmV0dXJuIG04OHRzMjAyMl9yZF9yZWdzKHByaXYsIHJlZywgdmFsLCAxKTsKK30KKworLyogd3JpdGUgc2luZ2xlIHJlZ2lzdGVyIHdpdGggbWFzayAqLworc3RhdGljIGludCBtODh0czIwMjJfd3JfcmVnX21hc2soc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2LAorCQl1OCByZWcsIHU4IHZhbCwgdTggbWFzaykKK3sKKwlpbnQgcmV0OworCXU4IHU4dG1wOworCisJLyogbm8gbmVlZCBmb3IgcmVhZCBpZiB3aG9sZSByZWcgaXMgd3JpdHRlbiAqLworCWlmIChtYXNrICE9IDB4ZmYpIHsKKwkJcmV0ID0gbTg4dHMyMDIyX3JkX3JlZ3MocHJpdiwgcmVnLCAmdTh0bXAsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwgJj0gbWFzazsKKwkJdTh0bXAgJj0gfm1hc2s7CisJCXZhbCB8PSB1OHRtcDsKKwl9CisKKwlyZXR1cm4gbTg4dHMyMDIyX3dyX3JlZ3MocHJpdiwgcmVnLCAmdmFsLCAxKTsKK30KKworc3RhdGljIGludCBtODh0czIwMjJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQlpbnQgb3AsIGludCBzbGVlcCwgdTggcmVnLCB1OCBtYXNrLCB1OCB2YWwsIHU4ICpyZWdfdmFsKQoreworCXN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludCByZXQsIGk7CisJdTggdTh0bXA7CisJc3RydWN0IG04OHRzMjAyMl9yZWdfdmFsIHJlZ192YWxzW10gPSB7CisJCXsweDUxLCAweDFmIC0gb3B9LAorCQl7MHg1MSwgMHgxZn0sCisJCXsweDUwLCAweDAwICsgb3B9LAorCQl7MHg1MCwgMHgwMH0sCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsCisJCQkJIiVzOiBpPSVkIG9wPSUwMnggcmVnPSUwMnggbWFzaz0lMDJ4IHZhbD0lMDJ4XG4iLAorCQkJCV9fZnVuY19fLCBpLCBvcCwgcmVnLCBtYXNrLCB2YWwpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ192YWxzKTsgaSsrKSB7CisJCQlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIHJlZ192YWxzW2ldLnJlZywKKwkJCQkJcmVnX3ZhbHNbaV0udmFsKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnI7CisJCX0KKworCQl1c2xlZXBfcmFuZ2Uoc2xlZXAgKiAxMDAwLCBzbGVlcCAqIDEwMDAwKTsKKworCQlyZXQgPSBtODh0czIwMjJfcmRfcmVnKHByaXYsIHJlZywgJnU4dG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCWlmICgodTh0bXAgJiBtYXNrKSAhPSB2YWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAocmVnX3ZhbCkKKwkJKnJlZ192YWwgPSB1OHRtcDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OHRzMjAyMl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGZyZXF1ZW5jeV9raHosIGZyZXF1ZW5jeV9vZmZzZXRfa2h6LCBmXzNkYl9oejsKKwl1bnNpZ25lZCBpbnQgZl9yZWZfa2h6LCBmX3Zjb19raHosIGRpdl9yZWYsIGRpdl9vdXQsIHBsbF9uLCBnZGl2Mjg7CisJdTggYnVmWzNdLCB1OHRtcCwgY2FwX2NvZGUsIGxwZl9nbSwgbHBmX214ZGl2LCBkaXZfbWF4LCBkaXZfbWluOworCXUxNiB1MTZ0bXA7CisJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsCisJCQkiJXM6IGZyZXF1ZW5jeT0lZCBzeW1ib2xfcmF0ZT0lZCByb2xsb2ZmPSVkXG4iLAorCQkJX19mdW5jX18sIGMtPmZyZXF1ZW5jeSwgYy0+c3ltYm9sX3JhdGUsIGMtPnJvbGxvZmYpOworCS8qCisJICogSW50ZWdlci1OIFBMTCBzeW50aGVzaXplcgorCSAqIGtIeiBpcyB1c2VkIGZvciBhbGwgY2FsY3VsYXRpb25zIHRvIGtlZXAgY2FsY3VsYXRpb25zIHdpdGhpbiAzMi1iaXQKKwkgKi8KKwlmX3JlZl9raHogPSBESVZfUk9VTkRfQ0xPU0VTVChwcml2LT5jZmcuY2xvY2ssIDEwMDApOworCWRpdl9yZWYgPSBESVZfUk9VTkRfQ0xPU0VTVChmX3JlZl9raHosIDIwMDApOworCisJaWYgKGMtPnN5bWJvbF9yYXRlIDwgNTAwMDAwMCkKKwkJZnJlcXVlbmN5X29mZnNldF9raHogPSAzMDAwOyAvKiAzIE1IeiAqLworCWVsc2UKKwkJZnJlcXVlbmN5X29mZnNldF9raHogPSAwOworCisJZnJlcXVlbmN5X2toeiA9IGMtPmZyZXF1ZW5jeSArIGZyZXF1ZW5jeV9vZmZzZXRfa2h6OworCisJaWYgKGZyZXF1ZW5jeV9raHogPCAxMTAzMDAwKSB7CisJCWRpdl9vdXQgPSA0OworCQl1OHRtcCA9IDB4MWI7CisJfSBlbHNlIHsKKwkJZGl2X291dCA9IDI7CisJCXU4dG1wID0gMHgwYjsKKwl9CisKKwlidWZbMF0gPSB1OHRtcDsKKwlidWZbMV0gPSAweDQwOworCXJldCA9IG04OHRzMjAyMl93cl9yZWdzKHByaXYsIDB4MTAsIGJ1ZiwgMik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmX3Zjb19raHogPSBmcmVxdWVuY3lfa2h6ICogZGl2X291dDsKKwlwbGxfbiA9IGZfdmNvX2toeiAqIGRpdl9yZWYgLyBmX3JlZl9raHo7CisJcGxsX24gKz0gcGxsX24gJSAyOworCXByaXYtPmZyZXF1ZW5jeV9raHogPSBwbGxfbiAqIGZfcmVmX2toeiAvIGRpdl9yZWYgLyBkaXZfb3V0OworCisJaWYgKHBsbF9uIDwgNDA5NSkKKwkJdTE2dG1wID0gcGxsX24gLSAxMDI0OworCWVsc2UgaWYgKHBsbF9uIDwgNjE0MykKKwkJdTE2dG1wID0gcGxsX24gKyAxMDI0OworCWVsc2UKKwkJdTE2dG1wID0gcGxsX24gKyAzMDcyOworCisJYnVmWzBdID0gKHUxNnRtcCA+PiA4KSAmIDB4M2Y7CisJYnVmWzFdID0gKHUxNnRtcCA+PiAwKSAmIDB4ZmY7CisJYnVmWzJdID0gZGl2X3JlZiAtIDg7CisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZ3MocHJpdiwgMHgwMSwgYnVmLCAzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9kYmcoJnByaXYtPmNsaWVudC0+ZGV2LAorCQkJIiVzOiBmcmVxdWVuY3k9JXUgb2Zmc2V0PSVkIGZfdmNvX2toej0ldSBwbGxfbj0ldSBkaXZfcmVmPSV1IGRpdl9vdXQ9JXVcbiIsCisJCQlfX2Z1bmNfXywgcHJpdi0+ZnJlcXVlbmN5X2toeiwKKwkJCXByaXYtPmZyZXF1ZW5jeV9raHogLSBjLT5mcmVxdWVuY3ksIGZfdmNvX2toeiwgcGxsX24sCisJCQlkaXZfcmVmLCBkaXZfb3V0KTsKKworCXJldCA9IG04OHRzMjAyMl9jbWQoZmUsIDB4MTAsIDUsIDB4MTUsIDB4NDAsIDB4MDAsIE5VTEwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX3JkX3JlZyhwcml2LCAweDE0LCAmdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJdTh0bXAgJj0gMHg3ZjsKKwlpZiAodTh0bXAgPCA2NCkgeworCQlyZXQgPSBtODh0czIwMjJfd3JfcmVnX21hc2socHJpdiwgMHgxMCwgMHg4MCwgMHg4MCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIDB4MTEsIDB4NmYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJcmV0ID0gbTg4dHMyMDIyX2NtZChmZSwgMHgxMCwgNSwgMHgxNSwgMHg0MCwgMHgwMCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBtODh0czIwMjJfcmRfcmVnKHByaXYsIDB4MTQsICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl1OHRtcCAmPSAweDFmOworCWlmICh1OHRtcCA+IDE5KSB7CisJCXJldCA9IG04OHRzMjAyMl93cl9yZWdfbWFzayhwcml2LCAweDEwLCAweDAwLCAweDAyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCXJldCA9IG04OHRzMjAyMl9jbWQoZmUsIDB4MDgsIDUsIDB4M2MsIDB4ZmYsIDB4MDAsIE5VTEwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDI1LCAweDAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgyNywgMHg3MCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIDB4NDEsIDB4MDkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDA4LCAweDBiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIGZpbHRlcnMgKi8KKwlnZGl2MjggPSBESVZfUk9VTkRfQ0xPU0VTVChmX3JlZl9raHogKiAxNjk0VSwgMTAwMDAwMFUpOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDA0LCBnZGl2MjgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX2NtZChmZSwgMHgwNCwgMiwgMHgyNiwgMHhmZiwgMHgwMCwgJnU4dG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWNhcF9jb2RlID0gdTh0bXAgJiAweDNmOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDQxLCAweDBkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OHRzMjAyMl9jbWQoZmUsIDB4MDQsIDIsIDB4MjYsIDB4ZmYsIDB4MDAsICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl1OHRtcCAmPSAweDNmOworCWNhcF9jb2RlID0gKGNhcF9jb2RlICsgdTh0bXApIC8gMjsKKwlnZGl2MjggPSBnZGl2MjggKiAyMDcgLyAoY2FwX2NvZGUgKiAyICsgMTUxKTsKKwlkaXZfbWF4ID0gZ2RpdjI4ICogMTM1IC8gMTAwOworCWRpdl9taW4gPSBnZGl2MjggKiA3OCAvIDEwMDsKKwlkaXZfbWF4ID0gY2xhbXBfdmFsKGRpdl9tYXgsIDBVLCA2M1UpOworCisJZl8zZGJfaHogPSBjLT5zeW1ib2xfcmF0ZSAqIDEzNVVMIC8gMjAwVUw7CisJZl8zZGJfaHogKz0gIDIwMDAwMDBVICsgKGZyZXF1ZW5jeV9vZmZzZXRfa2h6ICogMTAwMFUpOworCWZfM2RiX2h6ID0gY2xhbXAoZl8zZGJfaHosIDcwMDAwMDBVLCA0MDAwMDAwMFUpOworCisjZGVmaW5lIExQRl9DT0VGRiAzMjAwVQorCWxwZl9nbSA9IERJVl9ST1VORF9DTE9TRVNUKGZfM2RiX2h6ICogZ2RpdjI4LCBMUEZfQ09FRkYgKiBmX3JlZl9raHopOworCWxwZl9nbSA9IGNsYW1wX3ZhbChscGZfZ20sIDFVLCAyM1UpOworCisJbHBmX214ZGl2ID0gRElWX1JPVU5EX0NMT1NFU1QobHBmX2dtICogTFBGX0NPRUZGICogZl9yZWZfa2h6LCBmXzNkYl9oeik7CisJaWYgKGxwZl9teGRpdiA8IGRpdl9taW4pCisJCWxwZl9teGRpdiA9IERJVl9ST1VORF9DTE9TRVNUKCsrbHBmX2dtICogTFBGX0NPRUZGICogZl9yZWZfa2h6LCBmXzNkYl9oeik7CisJbHBmX214ZGl2ID0gY2xhbXBfdmFsKGxwZl9teGRpdiwgMFUsIGRpdl9tYXgpOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDA0LCBscGZfbXhkaXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDA2LCBscGZfZ20pOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX2NtZChmZSwgMHgwNCwgMiwgMHgyNiwgMHhmZiwgMHgwMCwgJnU4dG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWNhcF9jb2RlID0gdTh0bXAgJiAweDNmOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDQxLCAweDA5KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OHRzMjAyMl9jbWQoZmUsIDB4MDQsIDIsIDB4MjYsIDB4ZmYsIDB4MDAsICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl1OHRtcCAmPSAweDNmOworCWNhcF9jb2RlID0gKGNhcF9jb2RlICsgdTh0bXApIC8gMjsKKworCXU4dG1wID0gY2FwX2NvZGUgfCAweDgwOworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgyNSwgdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDI3LCAweDMwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwOCwgMHgwOSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODh0czIwMjJfY21kKGZlLCAweDAxLCAyMCwgMHgyMSwgMHhmZiwgMHgwMCwgTlVMTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CitlcnI6CisJaWYgKHJldCkKKwkJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4dHMyMDIyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldCwgaTsKKwl1OCB1OHRtcDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG04OHRzMjAyMl9yZWdfdmFsIHJlZ192YWxzW10gPSB7CisJCXsweDdkLCAweDlkfSwKKwkJezB4N2MsIDB4OWF9LAorCQl7MHg3YSwgMHg3Nn0sCisJCXsweDNiLCAweDAxfSwKKwkJezB4NjMsIDB4ODh9LAorCQl7MHg2MSwgMHg4NX0sCisJCXsweDIyLCAweDMwfSwKKwkJezB4MzAsIDB4NDB9LAorCQl7MHgyMCwgMHgyM30sCisJCXsweDI0LCAweDAyfSwKKwkJezB4MTIsIDB4YTB9LAorCX07CisJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwMCwgMHgwMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIDB4MDAsIDB4MDMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc3dpdGNoIChwcml2LT5jZmcuY2xvY2tfb3V0KSB7CisJY2FzZSBNODhUUzIwMjJfQ0xPQ0tfT1VUX0RJU0FCTEVEOgorCQl1OHRtcCA9IDB4NjA7CisJCWJyZWFrOworCWNhc2UgTTg4VFMyMDIyX0NMT0NLX09VVF9FTkFCTEVEOgorCQl1OHRtcCA9IDB4NzA7CisJCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwNSwgcHJpdi0+Y2ZnLmNsb2NrX291dF9kaXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2UgTTg4VFMyMDIyX0NMT0NLX09VVF9FTkFCTEVEX1hUQUxPVVQ6CisJCXU4dG1wID0gMHg2YzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDQyLCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpZiAocHJpdi0+Y2ZnLmxvb3BfdGhyb3VnaCkKKwkJdTh0bXAgPSAweGVjOworCWVsc2UKKwkJdTh0bXAgPSAweDZjOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDYyLCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdfdmFscyk7IGkrKykgeworCQlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIHJlZ192YWxzW2ldLnJlZywgcmVnX3ZhbHNbaV0udmFsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KK2VycjoKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwcml2LT5jbGllbnQtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4dHMyMDIyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludCByZXQ7CisJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwMCwgMHgwMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CitlcnI6CisJaWYgKHJldCkKKwkJZGV2X2RiZygmcHJpdi0+Y2xpZW50LT5kZXYsICIlczogZmFpbGVkPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG04OHRzMjAyMl9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgbTg4dHMyMDIyX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlkZXZfZGJnKCZwcml2LT5jbGllbnQtPmRldiwgIiVzOlxuIiwgX19mdW5jX18pOworCisJKmZyZXF1ZW5jeSA9IHByaXYtPmZyZXF1ZW5jeV9raHo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTg4dHMyMDIyX2dldF9pZl9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcXVlbmN5KQoreworCXN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWRldl9kYmcoJnByaXYtPmNsaWVudC0+ZGV2LCAiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwkqZnJlcXVlbmN5ID0gMDsgLyogWmVyby1JRiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG04OHRzMjAyMl9nZXRfcmZfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKwl1OCB1OHRtcDsKKwl1MTYgZ2FpbiwgdTE2dG1wOworCXVuc2lnbmVkIGludCBnYWluMSwgZ2FpbjIsIGdhaW4zOworCisJcmV0ID0gbTg4dHMyMDIyX3JkX3JlZyhwcml2LCAweDNkLCAmdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJZ2FpbjEgPSAodTh0bXAgPj4gMCkgJiAweDFmOworCWdhaW4xID0gY2xhbXAoZ2FpbjEsIDBVLCAxNVUpOworCisJcmV0ID0gbTg4dHMyMDIyX3JkX3JlZyhwcml2LCAweDIxLCAmdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJZ2FpbjIgPSAodTh0bXAgPj4gMCkgJiAweDFmOworCWdhaW4yID0gY2xhbXAoZ2FpbjIsIDJVLCAxNlUpOworCisJcmV0ID0gbTg4dHMyMDIyX3JkX3JlZyhwcml2LCAweDY2LCAmdTh0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJZ2FpbjMgPSAodTh0bXAgPj4gMykgJiAweDA3OworCWdhaW4zID0gY2xhbXAoZ2FpbjMsIDBVLCA2VSk7CisKKwlnYWluID0gZ2FpbjEgKiAyNjUgKyBnYWluMiAqIDMzOCArIGdhaW4zICogMjg1OworCisJLyogc2NhbGUgdmFsdWUgdG8gMHgwMDAwLTB4ZmZmZiAqLworCXUxNnRtcCA9ICgweGZmZmYgLSBnYWluKTsKKwl1MTZ0bXAgPSBjbGFtcF92YWwodTE2dG1wLCA1OTAwMFUsIDYxNTAwVSk7CisKKwkqc3RyZW5ndGggPSAodTE2dG1wIC0gNTkwMDApICogMHhmZmZmIC8gKDYxNTAwIC0gNTkwMDApOworZXJyOgorCWlmIChyZXQpCisJCWRldl9kYmcoJnByaXYtPmNsaWVudC0+ZGV2LCAiJXM6IGZhaWxlZD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIG04OHRzMjAyMl90dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lICAgICAgICAgID0gIk1vbnRhZ2UgTTg4VFMyMDIyIiwKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMCwKKwl9LAorCisJLmluaXQgPSBtODh0czIwMjJfaW5pdCwKKwkuc2xlZXAgPSBtODh0czIwMjJfc2xlZXAsCisJLnNldF9wYXJhbXMgPSBtODh0czIwMjJfc2V0X3BhcmFtcywKKworCS5nZXRfZnJlcXVlbmN5ID0gbTg4dHMyMDIyX2dldF9mcmVxdWVuY3ksCisJLmdldF9pZl9mcmVxdWVuY3kgPSBtODh0czIwMjJfZ2V0X2lmX2ZyZXF1ZW5jeSwKKwkuZ2V0X3JmX3N0cmVuZ3RoID0gbTg4dHMyMDIyX2dldF9yZl9zdHJlbmd0aCwKK307CisKK3N0YXRpYyBpbnQgbTg4dHMyMDIyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbTg4dHMyMDIyX2NvbmZpZyAqY2ZnID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSA9IGNmZy0+ZmU7CisJc3RydWN0IG04OHRzMjAyMl9wcml2ICpwcml2OworCWludCByZXQ7CisJdTggY2hpcF9pZCwgdTh0bXA7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczoga3phbGxvYygpIGZhaWxlZFxuIiwgS0JVSUxEX01PRE5BTUUpOworCQlnb3RvIGVycjsKKwl9CisKKwltZW1jcHkoJnByaXYtPmNmZywgY2ZnLCBzaXplb2Yoc3RydWN0IG04OHRzMjAyMl9jb25maWcpKTsKKwlwcml2LT5jbGllbnQgPSBjbGllbnQ7CisKKwkvKiBjaGVjayBpZiB0aGUgdHVuZXIgaXMgdGhlcmUgKi8KKwlyZXQgPSBtODh0czIwMjJfcmRfcmVnKHByaXYsIDB4MDAsICZ1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpZiAoKHU4dG1wICYgMHgwMykgPT0gMHgwMCkgeworCQlyZXQgPSBtODh0czIwMjJfd3JfcmVnKHByaXYsIDB4MDAsIDB4MDEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCisJCXVzbGVlcF9yYW5nZSgyMDAwLCA1MDAwMCk7CisJfQorCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDAwLCAweDAzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXVzbGVlcF9yYW5nZSgyMDAwLCA1MDAwMCk7CisKKwlyZXQgPSBtODh0czIwMjJfcmRfcmVnKHByaXYsIDB4MDAsICZjaGlwX2lkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9kYmcoJnByaXYtPmNsaWVudC0+ZGV2LCAiJXM6IGNoaXBfaWQ9JTAyeFxuIiwgX19mdW5jX18sIGNoaXBfaWQpOworCisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSAweGMzOgorCWNhc2UgMHg4MzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnI7CisJfQorCisJc3dpdGNoIChwcml2LT5jZmcuY2xvY2tfb3V0KSB7CisJY2FzZSBNODhUUzIwMjJfQ0xPQ0tfT1VUX0RJU0FCTEVEOgorCQl1OHRtcCA9IDB4NjA7CisJCWJyZWFrOworCWNhc2UgTTg4VFMyMDIyX0NMT0NLX09VVF9FTkFCTEVEOgorCQl1OHRtcCA9IDB4NzA7CisJCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwNSwgcHJpdi0+Y2ZnLmNsb2NrX291dF9kaXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2UgTTg4VFMyMDIyX0NMT0NLX09VVF9FTkFCTEVEX1hUQUxPVVQ6CisJCXU4dG1wID0gMHg2YzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDQyLCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpZiAocHJpdi0+Y2ZnLmxvb3BfdGhyb3VnaCkKKwkJdTh0bXAgPSAweGVjOworCWVsc2UKKwkJdTh0bXAgPSAweDZjOworCisJcmV0ID0gbTg4dHMyMDIyX3dyX3JlZyhwcml2LCAweDYyLCB1OHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBzbGVlcCAqLworCXJldCA9IG04OHRzMjAyMl93cl9yZWcocHJpdiwgMHgwMCwgMHgwMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlkZXZfaW5mbygmcHJpdi0+Y2xpZW50LT5kZXYsCisJCQkiJXM6IE1vbnRhZ2UgTTg4VFMyMDIyIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkXG4iLAorCQkJS0JVSUxEX01PRE5BTUUpOworCisJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZtODh0czIwMjJfdHVuZXJfb3BzLAorCQkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwcml2KTsKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBmYWlsZWQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTg4dHMyMDIyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtODh0czIwMjJfcHJpdiAqcHJpdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gcHJpdi0+Y2ZnLmZlOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoJmZlLT5vcHMudHVuZXJfb3BzLCAwLCBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG04OHRzMjAyMl9pZFtdID0geworCXsibTg4dHMyMDIyIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbTg4dHMyMDIyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG04OHRzMjAyMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gIm04OHRzMjAyMiIsCisJfSwKKwkucHJvYmUJCT0gbTg4dHMyMDIyX3Byb2JlLAorCS5yZW1vdmUJCT0gbTg4dHMyMDIyX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBtODh0czIwMjJfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihtODh0czIwMjJfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb250YWdlIE04OFRTMjAyMiBzaWxpY29uIHR1bmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3R1bmVycy9tODh0czIwMjIuaCBiL2RyaXZlcnMvbWVkaWEvdHVuZXJzL204OHRzMjAyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWZhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tODh0czIwMjIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogTW9udGFnZSBNODhUUzIwMjIgc2lsaWNvbiB0dW5lciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgTTg4VFMyMDIyX0gKKyNkZWZpbmUgTTg4VFMyMDIyX0gKKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCitzdHJ1Y3QgbTg4dHMyMDIyX2NvbmZpZyB7CisJLyoKKwkgKiBjbG9jaworCSAqIDE2MDAwMDAwIC0gMzIwMDAwMDAKKwkgKi8KKwl1MzIgY2xvY2s7CisKKwkvKgorCSAqIFJGIGxvb3AtdGhyb3VnaAorCSAqLworCXU4IGxvb3BfdGhyb3VnaDoxOworCisJLyoKKwkgKiBjbG9jayBvdXRwdXQKKwkgKi8KKyNkZWZpbmUgTTg4VFMyMDIyX0NMT0NLX09VVF9ESVNBQkxFRCAgICAgICAgMAorI2RlZmluZSBNODhUUzIwMjJfQ0xPQ0tfT1VUX0VOQUJMRUQgICAgICAgICAxCisjZGVmaW5lIE04OFRTMjAyMl9DTE9DS19PVVRfRU5BQkxFRF9YVEFMT1VUIDIKKwl1OCBjbG9ja19vdXQ6MjsKKworCS8qCisJICogY2xvY2sgb3V0cHV0IGRpdmlkZXIKKwkgKiAxIC0gMzEKKwkgKi8KKwl1OCBjbG9ja19vdXRfZGl2OjU7CisKKwkvKgorCSAqIHBvaW50ZXIgdG8gRFZCIGZyb250ZW5kCisJICovCisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdHVuZXJzL204OHRzMjAyMl9wcml2LmggYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tODh0czIwMjJfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjNkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tODh0czIwMjJfcHJpdi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBNb250YWdlIE04OFRTMjAyMiBzaWxpY29uIHR1bmVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBNODhUUzIwMjJfUFJJVl9ICisjZGVmaW5lIE04OFRTMjAyMl9QUklWX0gKKworI2luY2x1ZGUgIm04OHRzMjAyMi5oIgorCitzdHJ1Y3QgbTg4dHMyMDIyX3ByaXYgeworCXN0cnVjdCBtODh0czIwMjJfY29uZmlnIGNmZzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCXUzMiBmcmVxdWVuY3lfa2h6OworfTsKKworc3RydWN0IG04OHRzMjAyMl9yZWdfdmFsIHsKKwl1OCByZWc7CisJdTggdmFsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3R1bmVycy90dW5lci14YzIwMjguYyBiL2RyaXZlcnMvbWVkaWEvdHVuZXJzL3R1bmVyLXhjMjAyOC5jCmluZGV4IDRiZTVjZjguLmNjYTUwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdHVuZXJzL3R1bmVyLXhjMjAyOC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdHVuZXJzL3R1bmVyLXhjMjAyOC5jCkBAIC0xMzQsMTUgKzEzNCw2IEBACiAJX3JjOwkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBpMmNfcmN2KHByaXYsIGJ1Ziwgc2l6ZSkgKHsJCQkJCVwKLQlpbnQgX3JjOwkJCQkJCQlcCi0JX3JjID0gdHVuZXJfaTJjX3hmZXJfcmVjdigmcHJpdi0+aTJjX3Byb3BzLCBidWYsIHNpemUpOwkJXAotCWlmIChzaXplICE9IF9yYykJCQkJCQlcCi0JCXR1bmVyX2VycigiaTJjIGlucHV0IGVycm9yOiByYyA9ICVkIChzaG91bGQgYmUgJWQpXG4iLAlcCi0JCQkgICBfcmMsIChpbnQpc2l6ZSk7IAkJCQlcCi0JX3JjOwkJCQkJCQkJXAotfSkKLQogI2RlZmluZSBpMmNfc2VuZF9yZWN2KHByaXYsIG9idWYsIG9zaXplLCBpYnVmLCBpc2l6ZSkgKHsJCVwKIAlpbnQgX3JjOwkJCQkJCQlcCiAJX3JjID0gdHVuZXJfaTJjX3hmZXJfc2VuZF9yZWN2KCZwcml2LT5pMmNfcHJvcHMsIG9idWYsIG9zaXplLAlcCkBAIC0yNzYsNiArMjY3LDcgQEAKIAljYXNlIFhDMjAyOF9XQUlUSU5HX0ZJUk1XQVJFOgogCQlyZXR1cm4gLUVBR0FJTjsKIAljYXNlIFhDMjAyOF9BQ1RJVkU6CisJCXJldHVybiAxOwogCWNhc2UgWEMyMDI4X1NMRUVQOgogCQlyZXR1cm4gMDsKIAljYXNlIFhDMjAyOF9OT0RFVjoKQEAgLTcxOCw2ICs3MTAsOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHhjMjAyOF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CisKIHN0YXRpYyBpbnQgY2hlY2tfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHVuc2lnbmVkIGludCB0eXBlLAogCQkJICB2NGwyX3N0ZF9pZCBzdGQsIF9fdTE2IGludF9mcmVxKQogewpAQCAtODkwLDcgKzg4NCw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JcHJpdi0+c3RhdGUgPSBYQzIwMjhfU0xFRVA7CisJcHJpdi0+c3RhdGUgPSBYQzIwMjhfTk9fRklSTVdBUkU7CiAKIAltZW1zZXQoJnByaXYtPmN1cl9mdywgMCwgc2l6ZW9mKHByaXYtPmN1cl9mdykpOwogCWlmIChyZXRyeV9jb3VudCA8IDgpIHsKQEAgLTkwMCw2ICs4OTQsOSBAQAogCQlnb3RvIHJldHJ5OwogCX0KIAorCS8qIEZpcm13YXJlIGRpZG4ndCBsb2FkLiBQdXQgdGhlIGRldmljZSB0byBzbGVlcCAqLworCXhjMjAyOF9zbGVlcChmZSk7CisKIAlpZiAocmMgPT0gLUVOT0VOVCkKIAkJcmMgPSAtRUlOVkFMOwogCXJldHVybiByYzsKQEAgLTkxNyw2ICs5MTQsMTIgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIHNsZWVwaW5nLCBubyBjaGFubmVsIGlzIHR1bmVkICovCisJaWYgKCFyYykgeworCQkqc3RyZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKIAltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKIAogCS8qIFN5bmMgTG9jayBJbmRpY2F0b3IgKi8KQEAgLTk2NCw2ICs5NjcsMTIgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIHNsZWVwaW5nLCBubyBjaGFubmVsIGlzIHR1bmVkICovCisJaWYgKCFyYykgeworCQkqYWZjID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCiAJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CiAKIAkvKiBTeW5jIExvY2sgSW5kaWNhdG9yICovCkBAIC0xMjgxLDYgKzEyOTAsMTAgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwkvKiBEZXZpY2UgaXMgYWxyZWFkeSBpbiBzbGVlcCBtb2RlICovCisJaWYgKCFyYykKKwkJcmV0dXJuIDA7CisKIAkvKiBBdm9pZCBmaXJtd2FyZSByZWxvYWQgb24gc2xvdyBkZXZpY2VzIG9yIGlmIFBNIGRpc2FibGVkICovCiAJaWYgKG5vX3Bvd2Vyb2ZmIHx8IHByaXYtPmN0cmwuZGlzYWJsZV9wb3dlcl9tZ210KQogCQlyZXR1cm4gMDsKQEAgLTEyOTgsNyArMTMxMSw4IEBACiAJZWxzZQogCQlyYyA9IHNlbmRfc2VxKHByaXYsIHsweDgwLCBYUkVHX1BPV0VSX0RPV04sIDB4MDAsIDB4MDB9KTsKIAotCXByaXYtPnN0YXRlID0gWEMyMDI4X1NMRUVQOworCWlmIChyYyA+PSAwKQorCQlwcml2LT5zdGF0ZSA9IFhDMjAyOF9TTEVFUDsKIAogCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CiAKQEAgLTEzNjYsNyArMTM4MCw3IEBACiAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm47Ci0JcHJpdi0+c3RhdGUgPSBYQzIwMjhfU0xFRVA7CisJcHJpdi0+c3RhdGUgPSBYQzIwMjhfQUNUSVZFOwogfQogCiBzdGF0aWMgaW50IHhjMjAyOF9zZXRfY29uZmlnKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB2b2lkICpwcml2X2NmZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3VzYi9LY29uZmlnCmluZGV4IGNmZTgwNTYuLjM5ZDgyNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvS2NvbmZpZwpAQCAtMTcsNyArMTcsNiBAQAogc291cmNlICJkcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21lZGlhL3VzYi9zMjI1NS9LY29uZmlnIgotc291cmNlICJkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdXNiL3VzYnR2L0tjb25maWciCiBlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdXNiL01ha2VmaWxlCmluZGV4IDA5MzVmNDcuLjdhYzRiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw2IEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBKSAgICAgICAgICs9IGdzcGNhLwogb2JqLSQoQ09ORklHX1VTQl9QV0MpICAgICAgICAgICArPSBwd2MvCiBvYmotJChDT05GSUdfVklERU9fQ1BJQTIpICs9IGNwaWEyLwotb2JqLSQoQ09ORklHX1VTQl9TTjlDMTAyKSAgICAgICArPSBzbjljMTAyLwogb2JqLSQoQ09ORklHX1ZJREVPX0FVMDgyOCkgKz0gYXUwODI4Lwogb2JqLSQoQ09ORklHX1ZJREVPX0hEUFZSKQkrPSBoZHB2ci8KIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LWNvcmUuYwppbmRleCBiZDlkMTlhLi5hYjQ1YTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LWNvcmUuYwpAQCAtMTczLDkgKzE3Myw4IEBACiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCWludCBpZm51bTsKLSNpZmRlZiBDT05GSUdfVklERU9fQVUwODI4X1Y0TDIKLQlpbnQgcmV0dmFsOwotI2VuZGlmCisJaW50IHJldHZhbCA9IDA7CisKIAlzdHJ1Y3QgYXUwODI4X2RldiAqZGV2OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CiAKQEAgLTI1Nyw3ICsyNTYsMTEgQEAKICNlbmRpZgogCiAJLyogRGlnaXRhbCBUViAqLwotCWF1MDgyOF9kdmJfcmVnaXN0ZXIoZGV2KTsKKwlyZXR2YWwgPSBhdTA4MjhfZHZiX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldHZhbCkKKwkJcHJfZXJyKCIlcygpIGF1MDI4Ml9kZXZfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCiAKIAkvKiBTdG9yZSB0aGUgcG9pbnRlciB0byB0aGUgYXUwODI4X2RldiBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgaW4KIAkgICBhdTA4MjhfdXNiX2Rpc2Nvbm5lY3QgKi8KQEAgLTI2OCw3ICsyNzEsNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGF1MDgyOF91c2JfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2F1MDgyOC9hdTA4MjgtZHZiLmMKaW5kZXggOWE2ZjE1Ni4uNGFlOGIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LWR2Yi5jCkBAIC0zMyw2ICszMywxMCBAQAogI2luY2x1ZGUgIm14bDUwMDd0LmgiCiAjaW5jbHVkZSAidGRhMTgyNzEuaCIKIAorc3RhdGljIGludCBwcmVhbGxvY2F0ZV9iaWdfYnVmZmVyczsKK21vZHVsZV9wYXJhbV9uYW1lZChwcmVhbGxvY2F0ZV9iaWdfYnVmZmVycywgcHJlYWxsb2NhdGVfYmlnX2J1ZmZlcnMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZWFsbG9jYXRlX2JpZ19idWZmZXJzLCAiUHJlYWxsb2NhdGUgdGhlIGxhcmdlciB0cmFuc2ZlciBidWZmZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUiKTsKKwogRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CiAKICNkZWZpbmUgX0FVMDgyOF9CVUxLUElQRSAweDgzCkBAIC0xNTMsOSArMTU3LDEzIEBACiAKIAlkZXYtPnVyYl9zdHJlYW1pbmcgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBVUkJfQ09VTlQ7IGkrKykgewotCQl1c2Jfa2lsbF91cmIoZGV2LT51cmJzW2ldKTsKLQkJa2ZyZWUoZGV2LT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIpOwotCQl1c2JfZnJlZV91cmIoZGV2LT51cmJzW2ldKTsKKwkJaWYgKGRldi0+dXJic1tpXSkgeworCQkJdXNiX2tpbGxfdXJiKGRldi0+dXJic1tpXSk7CisJCQlpZiAoIXByZWFsbG9jYXRlX2JpZ19idWZmZXJzKQorCQkJCWtmcmVlKGRldi0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKworCQkJdXNiX2ZyZWVfdXJiKGRldi0+dXJic1tpXSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE4MSwxMCArMTg5LDE4IEBACiAKIAkJcHVyYiA9IGRldi0+dXJic1tpXTsKIAotCQlwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBremFsbG9jKFVSQl9CVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHByZWFsbG9jYXRlX2JpZ19idWZmZXJzKQorCQkJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gZGV2LT5kaWdfdHJhbnNmZXJfYnVmZmVyW2ldOworCQllbHNlCisJCQlwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBremFsbG9jKFVSQl9CVUZTSVpFLAorCQkJCQlHRlBfS0VSTkVMKTsKKwogCQlpZiAoIXB1cmItPnRyYW5zZmVyX2J1ZmZlcikgewogCQkJdXNiX2ZyZWVfdXJiKHB1cmIpOwogCQkJZGV2LT51cmJzW2ldID0gTlVMTDsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogZmFpbGVkIGJpZyBidWZmZXIgYWxsb2NhdGlvbiwgZXJyID0gJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CiAJCQlnb3RvIGVycjsKIAkJfQogCkBAIC0yMTcsNiArMjMzLDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgYXUwODI4X3N0YXJ0X3RyYW5zcG9ydChzdHJ1Y3QgYXUwODI4X2RldiAqZGV2KQoreworCWF1MDgyOF93cml0ZShkZXYsIDB4NjA4LCAweDkwKTsKKwlhdTA4Mjhfd3JpdGUoZGV2LCAweDYwOSwgMHg3Mik7CisJYXUwODI4X3dyaXRlKGRldiwgMHg2MGEsIDB4NzEpOworCWF1MDgyOF93cml0ZShkZXYsIDB4NjBiLCAweDAxKTsKKworfQorCitzdGF0aWMgdm9pZCBhdTA4Mjhfc3RvcF90cmFuc3BvcnQoc3RydWN0IGF1MDgyOF9kZXYgKmRldiwgaW50IGZ1bGxfc3RvcCkKK3sKKwlpZiAoZnVsbF9zdG9wKSB7CisJCWF1MDgyOF93cml0ZShkZXYsIDB4NjA4LCAweDAwKTsKKwkJYXUwODI4X3dyaXRlKGRldiwgMHg2MDksIDB4MDApOworCQlhdTA4Mjhfd3JpdGUoZGV2LCAweDYwYSwgMHgwMCk7CisJfQorCWF1MDgyOF93cml0ZShkZXYsIDB4NjBiLCAweDAwKTsKK30KKworCisKIHN0YXRpYyBpbnQgYXUwODI4X2R2Yl9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OwpAQCAtMjMxLDEzICsyNjgsMTcgQEAKIAogCWlmIChkdmIpIHsKIAkJbXV0ZXhfbG9jaygmZHZiLT5sb2NrKTsKKwkJZHZiLT5zdGFydF9jb3VudCsrOworCQlkcHJpbnRrKDEsICIlcygpLCBzdGFydF9jb3VudDogJWQsIHN0b3BfY291bnQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWR2Yi0+c3RhcnRfY291bnQsIGR2Yi0+c3RvcF9jb3VudCk7CiAJCWlmIChkdmItPmZlZWRpbmcrKyA9PSAwKSB7CiAJCQkvKiBTdGFydCB0cmFuc3BvcnQgKi8KLQkJCWF1MDgyOF93cml0ZShkZXYsIDB4NjA4LCAweDkwKTsKLQkJCWF1MDgyOF93cml0ZShkZXYsIDB4NjA5LCAweDcyKTsKLQkJCWF1MDgyOF93cml0ZShkZXYsIDB4NjBhLCAweDcxKTsKLQkJCWF1MDgyOF93cml0ZShkZXYsIDB4NjBiLCAweDAxKTsKKwkJCWF1MDgyOF9zdGFydF90cmFuc3BvcnQoZGV2KTsKIAkJCXJldCA9IHN0YXJ0X3VyYl90cmFuc2ZlcihkZXYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlhdTA4Mjhfc3RvcF90cmFuc3BvcnQoZGV2LCAwKTsKKwkJCQlkdmItPmZlZWRpbmctLTsJLyogV2UgcmFuIG91dCBvZiBtZW1vcnkuLi4gKi8KKwkJCX0KIAkJfQogCQltdXRleF91bmxvY2soJmR2Yi0+bG9jayk7CiAJfQpAQCAtMjU2LDEwICsyOTcsMTYgQEAKIAogCWlmIChkdmIpIHsKIAkJbXV0ZXhfbG9jaygmZHZiLT5sb2NrKTsKLQkJaWYgKC0tZHZiLT5mZWVkaW5nID09IDApIHsKLQkJCS8qIFN0b3AgdHJhbnNwb3J0ICovCi0JCQlyZXQgPSBzdG9wX3VyYl90cmFuc2ZlcihkZXYpOwotCQkJYXUwODI4X3dyaXRlKGRldiwgMHg2MGIsIDB4MDApOworCQlkdmItPnN0b3BfY291bnQrKzsKKwkJZHByaW50aygxLCAiJXMoKSwgc3RhcnRfY291bnQ6ICVkLCBzdG9wX2NvdW50OiAlZFxuIiwgX19mdW5jX18sCisJCQlkdmItPnN0YXJ0X2NvdW50LCBkdmItPnN0b3BfY291bnQpOworCQlpZiAoZHZiLT5mZWVkaW5nID4gMCkgeworCQkJZHZiLT5mZWVkaW5nLS07CisJCQlpZiAoZHZiLT5mZWVkaW5nID09IDApIHsKKwkJCQkvKiBTdG9wIHRyYW5zcG9ydCAqLworCQkJCXJldCA9IHN0b3BfdXJiX3RyYW5zZmVyKGRldik7CisJCQkJYXUwODI4X3N0b3BfdHJhbnNwb3J0KGRldiwgMCk7CisJCQl9CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkdmItPmxvY2spOwogCX0KQEAgLTI4MiwxNiArMzI5LDEwIEBACiAKIAkvKiBTdG9wIHRyYW5zcG9ydCAqLwogCXN0b3BfdXJiX3RyYW5zZmVyKGRldik7Ci0JYXUwODI4X3dyaXRlKGRldiwgMHg2MDgsIDB4MDApOwotCWF1MDgyOF93cml0ZShkZXYsIDB4NjA5LCAweDAwKTsKLQlhdTA4Mjhfd3JpdGUoZGV2LCAweDYwYSwgMHgwMCk7Ci0JYXUwODI4X3dyaXRlKGRldiwgMHg2MGIsIDB4MDApOworCWF1MDgyOF9zdG9wX3RyYW5zcG9ydChkZXYsIDEpOwogCiAJLyogU3RhcnQgdHJhbnNwb3J0ICovCi0JYXUwODI4X3dyaXRlKGRldiwgMHg2MDgsIDB4OTApOwotCWF1MDgyOF93cml0ZShkZXYsIDB4NjA5LCAweDcyKTsKLQlhdTA4Mjhfd3JpdGUoZGV2LCAweDYwYSwgMHg3MSk7Ci0JYXUwODI4X3dyaXRlKGRldiwgMHg2MGIsIDB4MDEpOworCWF1MDgyOF9zdGFydF90cmFuc3BvcnQoZGV2KTsKIAlzdGFydF91cmJfdHJhbnNmZXIoZGV2KTsKIAogCW11dGV4X3VubG9jaygmZHZiLT5sb2NrKTsKQEAgLTMwNCw2ICszNDUsMjMgQEAKIAogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAorCWlmIChwcmVhbGxvY2F0ZV9iaWdfYnVmZmVycykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFVSQl9DT1VOVDsgaSsrKSB7CisJCQlkZXYtPmRpZ190cmFuc2Zlcl9idWZmZXJbaV0gPSBremFsbG9jKFVSQl9CVUZTSVpFLAorCQkJCQlHRlBfS0VSTkVMKTsKKworCQkJaWYgKCFkZXYtPmRpZ190cmFuc2Zlcl9idWZmZXJbaV0pIHsKKwkJCQlyZXN1bHQgPSAtRU5PTUVNOworCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogZmFpbGVkIGJ1ZmZlciBhbGxvY2F0aW9uIChlcnJubyA9ICVkKVxuIiwKKwkJCQkgICAgICAgRFJJVkVSX05BTUUsIHJlc3VsdCk7CisJCQkJZ290byBmYWlsX2FkYXB0ZXI7CisJCQl9CisJCX0KKwl9CisKIAlJTklUX1dPUksoJmRldi0+cmVzdGFydF9zdHJlYW1pbmcsIGF1MDgyOF9yZXN0YXJ0X2R2Yl9zdHJlYW1pbmcpOwogCiAJLyogcmVnaXN0ZXIgYWRhcHRlciAqLwpAQCAtMzc1LDYgKzQzMyw5IEBACiAKIAkvKiByZWdpc3RlciBuZXR3b3JrIGFkYXB0ZXIgKi8KIAlkdmJfbmV0X2luaXQoJmR2Yi0+YWRhcHRlciwgJmR2Yi0+bmV0LCAmZHZiLT5kZW11eC5kbXgpOworCisJZHZiLT5zdGFydF9jb3VudCA9IDA7CisJZHZiLT5zdG9wX2NvdW50ID0gMDsKIAlyZXR1cm4gMDsKIAogZmFpbF9mZV9jb25uOgpAQCAtMzkxLDYgKzQ1MiwxMyBAQAogCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mcm9udGVuZCk7CiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyKTsKIGZhaWxfYWRhcHRlcjoKKworCWlmIChwcmVhbGxvY2F0ZV9iaWdfYnVmZmVycykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFVSQl9DT1VOVDsgaSsrKQorCQkJa2ZyZWUoZGV2LT5kaWdfdHJhbnNmZXJfYnVmZmVyW2ldKTsKKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC00MTEsNiArNDc5LDE0IEBACiAJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7CiAJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZyb250ZW5kKTsKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOworCisJaWYgKHByZWFsbG9jYXRlX2JpZ19idWZmZXJzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgVVJCX0NPVU5UOyBpKyspCisJCQlrZnJlZShkZXYtPmRpZ190cmFuc2Zlcl9idWZmZXJbaV0pOworCX0KKworCiB9CiAKIC8qIEFsbCB0aGUgRFZCIGF0dGFjaCBjYWxscyBnbyBoZXJlLCB0aGlzIGZ1bmN0aW9uIGdldCdzIG1vZGlmaWVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LmggYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LmgKaW5kZXggZWYxZjU3Zi4uNTQzOTc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2F1MDgyOC9hdTA4MjguaApAQCAtMTAyLDYgKzEwMiw4IEBACiAJc3RydWN0IGRteF9mcm9udGVuZCBmZV9tZW07CiAJc3RydWN0IGR2Yl9uZXQgbmV0OwogCWludCBmZWVkaW5nOworCWludCBzdGFydF9jb3VudDsKKwlpbnQgc3RvcF9jb3VudDsKIH07CiAKIGVudW0gYXUwODI4X3N0cmVhbV9zdGF0ZSB7CkBAIC0yNjAsNiArMjYyLDEwIEBACiAJLyogVVNCIC8gVVJCIFJlbGF0ZWQgKi8KIAlpbnQJCXVyYl9zdHJlYW1pbmc7CiAJc3RydWN0IHVyYgkqdXJic1tVUkJfQ09VTlRdOworCisJLyogUHJlYWxsb2NhdGVkIHRyYW5zZmVyIGRpZ2l0YWwgdHJhbnNmZXIgYnVmZmVycyAqLworCisJY2hhciAqZGlnX3RyYW5zZmVyX2J1ZmZlcltVUkJfQ09VTlRdOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvS2NvbmZpZwppbmRleCA4NmZlZWVhLi5mMTRjNWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9LY29uZmlnCkBAIC00NSw2ICs0NSw4IEBACiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDNTAwMCBpZiBNRURJQV9TVUJEUlZfQVVUT1NFTEVDVAogCXNlbGVjdCBNRURJQV9UVU5FUl9UREExODI3MSBpZiBNRURJQV9TVUJEUlZfQVVUT1NFTEVDVAogCXNlbGVjdCBEVkJfTUI4NkEyMFMgaWYgTUVESUFfU1VCRFJWX0FVVE9TRUxFQ1QKKwlzZWxlY3QgRFZCX0xHRFQzMzA1IGlmIE1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCisJc2VsZWN0IERWQl9UREExODI3MUMyREQgaWYgTUVESUFfU1VCRFJWX0FVVE9TRUxFQ1QKIAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBEVkIgY2FyZHMgYmFzZWQgb24gdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCmluZGV4IDUyOGNjZTkuLjJlZTAzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCkBAIC03MDksNiArNzA5LDggQEAKIAogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwogc3RydWN0IHVzYl9kZXZpY2VfaWQgY3gyMzF4eF9pZF90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MUQxOSwgMHg2MTA5KSwKKwkuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX1BWX1hDQVBUVVJFX1VTQn0sCiAJe1VTQl9ERVZJQ0UoMHgwNTcyLCAweDVBM0MpLAogCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX1VOS05PV059LAogCXtVU0JfREVWSUNFKDB4MDU3MiwgMHg1OEEyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1pMmMuYwppbmRleCA5NmE1YTA5Li43YzBmNzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWkyYy5jCkBAIC0zNzEsOSArMzcxLDkgQEAKIAltdXRleF9sb2NrKCZkZXYtPmkyY19sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAotCQlhZGRyID0gbXNnc1tpXS5hZGRyID4+IDE7CisJCWFkZHIgPSBtc2dzW2ldLmFkZHI7CiAKLQkJZHByaW50azIoMiwgIiVzICVzIGFkZHI9JXggbGVuPSVkOiIsCisJCWRwcmludGsyKDIsICIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCiAJCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAogCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOwogCQlpZiAoIW1zZ3NbaV0ubGVuKSB7CkBAIC0zOTAsMzIgKzM5MCw0MSBAQAogCQkJcmMgPSBjeDIzMXh4X2kyY19yZWN2X2J5dGVzKGkyY19hZGFwLCAmbXNnc1tpXSk7CiAJCQlpZiAoaTJjX2RlYnVnID49IDIpIHsKIAkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKLQkJCQkJcHJpbnRrKCIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoaSArIDEgPCBudW0gJiYgKG1zZ3NbaSArIDFdLmZsYWdzICYgSTJDX01fUkQpICYmCiAJCQkgICBtc2dzW2ldLmFkZHIgPT0gbXNnc1tpICsgMV0uYWRkcgogCQkJICAgJiYgKG1zZ3NbaV0ubGVuIDw9IDIpICYmIChidXMtPm5yIDwgMykpIHsKKwkJCS8qIHdyaXRlIGJ5dGVzICovCisJCQlpZiAoaTJjX2RlYnVnID49IDIpIHsKKwkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7CisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCX0KIAkJCS8qIHJlYWQgYnl0ZXMgKi8KKwkJCWRwcmludGsyKDIsICJwbHVzICVzICVzIGFkZHI9MHgleCBsZW49JWQ6IiwKKwkJCQkobXNnc1tpKzFdLmZsYWdzICYgSTJDX01fUkQpID8gInJlYWQiIDogIndyaXRlIiwKKwkJCQlpKzEgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpKzFdLmxlbik7CiAJCQlyYyA9IGN4MjMxeHhfaTJjX3JlY3ZfYnl0ZXNfd2l0aF9zYWRkcihpMmNfYWRhcCwKIAkJCQkJCQkgICAgICAgJm1zZ3NbaV0sCiAJCQkJCQkJICAgICAgICZtc2dzW2kgKyAxXSk7CiAJCQlpZiAoaTJjX2RlYnVnID49IDIpIHsKLQkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKLQkJCQkJcHJpbnRrKCIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKKwkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpKzFdLmxlbjsgYnl0ZSsrKQorCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ3NbaSsxXS5idWZbYnl0ZV0pOwogCQkJfQogCQkJaSsrOwogCQl9IGVsc2UgewogCQkJLyogd3JpdGUgYnl0ZXMgKi8KIAkJCWlmIChpMmNfZGVidWcgPj0gMikgewogCQkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQotCQkJCQlwcmludGsoIiAlMDJ4IiwgbXNnc1tpXS5idWZbYnl0ZV0pOworCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKIAkJCX0KIAkJCXJjID0gY3gyMzF4eF9pMmNfc2VuZF9ieXRlcyhpMmNfYWRhcCwgJm1zZ3NbaV0pOwogCQl9CiAJCWlmIChyYyA8IDApCiAJCQlnb3RvIGVycjsKIAkJaWYgKGkyY19kZWJ1ZyA+PSAyKQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmkyY19sb2NrKTsKIAlyZXR1cm4gbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9hZjkwMzUuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvYWY5MDM1LmMKaW5kZXggOGY5YjJjZWEuLjhlZGU4ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvYWY5MDM1LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9hZjkwMzUuYwpAQCAtMTUzOSw2ICsxNTM5LDggQEAKIAkJJmFmOTAzNV9wcm9wcywgIlRlcnJhVGVjIENpbmVyZ3kgVCBTdGljayBEdWFsIFJDIChyZXYuIDIpIiwgTlVMTCkgfSwKIAl7IERWQl9VU0JfREVWSUNFKFVTQl9WSURfTEVBRFRFSywgMHg2YTA1LAogCQkmYWY5MDM1X3Byb3BzLCAiTGVhZHRlayBXaW5GYXN0IERUViBEb25nbGUgRHVhbCIsIE5VTEwpIH0sCisJeyBEVkJfVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhmOTAwLAorCQkmYWY5MDM1X3Byb3BzLCAiSGF1cHBhdWdlIFdpblRWLU1pbmlTdGljayAyIiwgTlVMTCkgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYWY5MDM1X2lkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2FueXNlZS5jCmluZGV4IDkwY2ZhMzUuLmVlYWI3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9hbnlzZWUuYwpAQCAtNDQyLDYgKzQ0Miw3IEBACiAgKiBJT0RbMF0gWkwxMDM1MyAxPWVuYWJsZWQKICAqIElPRVswXSB0dW5lciAwPWVuYWJsZWQKICAqIHR1bmVyIGlzIGJlaGluZCBaTDEwMzUzIEkyQy1nYXRlCisgKiB0dW5lciBpcyBiZWhpbmQgVERBMTAwMjMgSTJDLWdhdGUKICAqCiAgKiBFNyBUQyBWSUQ9MWM3MyBQSUQ9ODYxZiBIVz0xOCBGVz0wLjcgQU1UQ0k9MC41ICJhbnlzZWUtRTdUQyhMUCkiCiAgKiBQQ0I6IDUwOFRDIChyZXYwLjYpCkBAIC05NTYsNyArOTU3LDcgQEAKIAogCQlpZiAoZmUgJiYgYWRhcC0+ZmVbMV0pIHsKIAkJCS8qIGF0dGFjaCB0dW5lciBmb3IgMm5kIEZFICovCi0JCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlWzBdLAorCQkJZmUgPSBkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZVsxXSwKIAkJCQkJKDB4YzAgPj4gMSksICZkLT5pMmNfYWRhcCwKIAkJCQkJRFZCX1BMTF9TQU1TVU5HX0RUT1M0MDNJSDEwMkEpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2F6NjAwNy5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9hejYwMDcuYwppbmRleCA0NGM2NGVmMy4uYzEwNTFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9hejYwMDcuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2F6NjAwNy5jCkBAIC02OCw2ICs2OCwxOSBAQAogCS5taWNyb2NvZGVfbmFtZSA9ICJkdmItdXNiLXRlcnJhdGVjLWg3LWRyeGsuZnciLAogfTsKIAorc3RhdGljIHN0cnVjdCBkcnhrX2NvbmZpZyBjYWJsZXN0YXJfaGRjaV9kcnhrID0geworCS5hZHIgPSAweDI5LAorCS5wYXJhbGxlbF90cyA9IHRydWUsCisJLmR5bmFtaWNfY2xrID0gdHJ1ZSwKKwkuc2luZ2xlX21hc3RlciA9IHRydWUsCisJLmVuYWJsZV9tZXJyX2NmZyA9IHRydWUsCisJLm5vX2kyY19icmlkZ2UgPSBmYWxzZSwKKwkuY2h1bmtfc2l6ZSA9IDY0LAorCS5tcGVnX291dF9jbGtfc3RyZW5ndGggPSAweDAyLAorCS5xYW1fZGVtb2RfcGFyYW1ldGVyX2NvdW50ID0gMiwKKwkubWljcm9jb2RlX25hbWUgPSAiZHZiLXVzYi10ZWNobmlzYXQtY2FibGVzdGFyLWhkY2ktZHJ4ay5mdyIsCit9OworCiBzdGF0aWMgaW50IGRyeGtfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBhejYwMDdfZGV2aWNlX3N0YXRlICpzdCA9IGZlX3RvX3ByaXYoZmUpOwpAQCAtNjMwLDYgKzY0MywyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF6NjAwN19jYWJsZXN0YXJfaGRjaV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgYXo2MDA3X2RldmljZV9zdGF0ZSAqc3QgPSBhZGFwX3RvX3ByaXYoYWRhcCk7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcF90b19kKGFkYXApOworCisJcHJfZGVidWcoImF0dGFjaGluZyBkZW1vZCBkcnhrXG4iKTsKKworCWFkYXAtPmZlWzBdID0gZHZiX2F0dGFjaChkcnhrX2F0dGFjaCwgJmNhYmxlc3Rhcl9oZGNpX2RyeGssCisJCQkJICZkLT5pMmNfYWRhcCk7CisJaWYgKCFhZGFwLT5mZVswXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGFwLT5mZVswXS0+c2VjX3ByaXYgPSBhZGFwOworCXN0LT5nYXRlX2N0cmwgPSBhZGFwLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmw7CisJYWRhcC0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmw7CisKKwlhejYwMDdfY2lfaW5pdChhZGFwKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGF6NjAwN190dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwX3RvX2QoYWRhcCk7CkBAIC04NjgsNiArOTAyLDI5IEBACiAJfQogfTsKIAorc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGF6NjAwN19jYWJsZXN0YXJfaGRjaV9wcm9wcyA9IHsKKwkuZHJpdmVyX25hbWUgICAgICAgICA9IEtCVUlMRF9NT0ROQU1FLAorCS5vd25lciAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmZpcm13YXJlICAgICAgICAgICAgPSBBWjYwMDdfRklSTVdBUkUsCisKKwkuYWRhcHRlcl9uciAgICAgICAgICA9IGFkYXB0ZXJfbnIsCisJLnNpemVfb2ZfcHJpdiAgICAgICAgPSBzaXplb2Yoc3RydWN0IGF6NjAwN19kZXZpY2Vfc3RhdGUpLAorCS5pMmNfYWxnbyAgICAgICAgICAgID0gJmF6NjAwN19pMmNfYWxnbywKKwkudHVuZXJfYXR0YWNoICAgICAgICA9IGF6NjAwN190dW5lcl9hdHRhY2gsCisJLmZyb250ZW5kX2F0dGFjaCAgICAgPSBhejYwMDdfY2FibGVzdGFyX2hkY2lfZnJvbnRlbmRfYXR0YWNoLAorCS5zdHJlYW1pbmdfY3RybCAgICAgID0gYXo2MDA3X3N0cmVhbWluZ19jdHJsLAorLyogZGl0Y2ggZ2V0X3JjX2NvbmZpZyBhcyBpdCBjYW4ndCB3b3JrIChUUzM1IHJlbW90ZSwgSSBiZWxpZXZlIGl0J3MgcmM1KSAqLworCS5nZXRfcmNfY29uZmlnICAgICAgID0gTlVMTCwKKwkucmVhZF9tYWNfYWRkcmVzcyAgICA9IGF6NjAwN19yZWFkX21hY19hZGRyLAorCS5kb3dubG9hZF9maXJtd2FyZSAgID0gYXo2MDA3X2Rvd25sb2FkX2Zpcm13YXJlLAorCS5pZGVudGlmeV9zdGF0ZQkgICAgID0gYXo2MDA3X2lkZW50aWZ5X3N0YXRlLAorCS5wb3dlcl9jdHJsICAgICAgICAgID0gYXo2MDA3X3Bvd2VyX2N0cmwsCisJLm51bV9hZGFwdGVycyAgICAgICAgPSAxLAorCS5hZGFwdGVyICAgICAgICAgICAgID0geworCQl7IC5zdHJlYW0gPSBEVkJfVVNCX1NUUkVBTV9CVUxLKDB4MDIsIDEwLCA0MDk2KSwgfQorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBhejYwMDdfdXNiX3RhYmxlW10gPSB7CiAJe0RWQl9VU0JfREVWSUNFKFVTQl9WSURfQVpVUkVXQVZFLCBVU0JfUElEX0FaVVJFV0FWRV82MDA3LAogCQkmYXo2MDA3X3Byb3BzLCAiQXp1cmV3YXZlIDYwMDciLCBSQ19NQVBfRU1QVFkpfSwKQEAgLTg3NSw2ICs5MzIsOCBAQAogCQkmYXo2MDA3X3Byb3BzLCAiVGVycmF0ZWMgSDciLCBSQ19NQVBfTkVDX1RFUlJBVEVDX0NJTkVSR1lfWFMpfSwKIAl7RFZCX1VTQl9ERVZJQ0UoVVNCX1ZJRF9URVJSQVRFQywgVVNCX1BJRF9URVJSQVRFQ19IN18yLAogCQkmYXo2MDA3X3Byb3BzLCAiVGVycmF0ZWMgSDciLCBSQ19NQVBfTkVDX1RFUlJBVEVDX0NJTkVSR1lfWFMpfSwKKwl7RFZCX1VTQl9ERVZJQ0UoVVNCX1ZJRF9URUNITklTQVQsIFVTQl9QSURfVEVDSE5JU0FUX1VTQjJfQ0FCTEVTVEFSX0hEQ0ksCisJCSZhejYwMDdfY2FibGVzdGFyX2hkY2lfcHJvcHMsICJUZWNobmlzYXQgQ2FibGVTdGFyIENvbWJvIEhEIENJIiwgUkNfTUFQX0VNUFRZKX0sCiAJezB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9lYzE2OC5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9lYzE2OC5jCmluZGV4IDVjNjhmMzkuLjBjMmIzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvZWMxNjguYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2VjMTY4LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCiBlcnJvcjoKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7Ci0JcmV0dXJuIGk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUzMiBlYzE2OF9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2l0OTEzeC5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9pdDkxM3guYwppbmRleCAxY2I2ODk5Li5mZTk1YTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL2l0OTEzeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvaXQ5MTN4LmMKQEAgLTc5OSw2ICs3OTksOSBAQAogCXsgRFZCX1VTQl9ERVZJQ0UoVVNCX1ZJRF9LV09STERfMiwgVVNCX1BJRF9DVFZESUdEVUFMX1YyLAogCQkmaXQ5MTN4X3Byb3BlcnRpZXMsICJEaWdpdGFsIER1YWwgVFYgUmVjZWl2ZXIgQ1RWRElHRFVBTF9WMiIsCiAJCQlSQ19NQVBfSVQ5MTNYX1YxKSB9LAorCXsgRFZCX1VTQl9ERVZJQ0UoVVNCX1ZJRF9BVkVSTUVESUEsIFVTQl9QSURfQVZFUk1FRElBX0gzMzUsCisJCSZpdDkxM3hfcHJvcGVydGllcywgIkF2ZXJtZWRpYSBIMzM1IiwKKwkJCVJDX01BUF9JVDkxM1hfVjIpIH0sCiAJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWRlbW9kLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWRlbW9kLmMKaW5kZXggZDgzZGY0Yi4uMGE5OGQwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1kZW1vZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtZGVtb2QuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgbXhsMTExc2YtZGVtb2QuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBEVkItVCBkZW1vZHVsYXRvcgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTYwMSw3ICs2MDEsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwobXhsMTExc2ZfZGVtb2RfYXR0YWNoKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhMaW5lYXIgTXhMMTExU0YgRFZCLVQgZGVtb2R1bGF0b3IgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWRlbW9kLmggYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWRlbW9kLmgKaW5kZXggM2YzZjhiZi4uMmQ0NTMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1kZW1vZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtZGVtb2QuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgbXhsMTExc2YtZGVtb2QuaCAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBEVkItVCBkZW1vZHVsYXRvcgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmMKaW5kZXggZTQxMjFjYi4uYTYxOTQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG14bDExMXNmLWdwaW8uYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtZ3Bpby5oIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmgKaW5kZXggMDIyMGY1NC4uYjg1YTU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmgKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1ncGlvLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG14bDExMXNmLWdwaW8uaCAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWkyYy5jCmluZGV4IDM0NDM0NTUuLmExMDFkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1pMmMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgbXhsMTExc2YtaTJjLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICogIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWkyYy5oIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1pMmMuaAppbmRleCBhNTdhNDVmLi40NjU3NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLWkyYy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtaTJjLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG14bDExMXNmLWkyYy5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCiAgKgotICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBsaW51eHR2Lm9yZz4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1waHkuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtcGh5LmMKaW5kZXggYjc0MWIzYS4uZjZiMzQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1waHkuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXBoeS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBteGwxMTFzZi1waHkuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtcGh5LmggYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXBoeS5oCmluZGV4IGYwNzU2MDcuLjA2NDM3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtcGh5LmgKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1waHkuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgbXhsMTExc2YtcGh5LmggLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICogIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXJlZy5oIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi1yZWcuaAppbmRleCAxNzgzMWIwLi44OWJmMTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtcmVnLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG14bDExMXNmLXJlZy5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCiAgKgotICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBsaW51eHR2Lm9yZz4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi10dW5lci5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi10dW5lci5jCmluZGV4IDg3OWM1MjkuLmE4ZDJjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtdHVuZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXR1bmVyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG14bDExMXNmLXR1bmVyLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YgQ01PUyB0dW5lcgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTUxMiw3ICs1MTIsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwobXhsMTExc2ZfdHVuZXJfYXR0YWNoKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhMaW5lYXIgTXhMMTExU0YgQ01PUyB0dW5lciBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTigiMC4xIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtdHVuZXIuaCBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YtdHVuZXIuaAppbmRleCA5MGY1ODNlLi4yMDQ2ZGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLXR1bmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi10dW5lci5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBteGwxMTFzZi10dW5lci5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGIENNT1MgdHVuZXIKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICogIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02OCw3ICs2OCw3IEBACiAjZWxzZQogc3RhdGljIGlubGluZQogc3RydWN0IGR2Yl9mcm9udGVuZCAqbXhsMTExc2ZfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKm14bF9zdGF0ZQorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKm14bF9zdGF0ZSwKIAkJCQkJICAgc3RydWN0IG14bDExMXNmX3R1bmVyX2NvbmZpZyAqY2ZnKQogewogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi5jCmluZGV4IDA4MjQwZTQuLmM3MzA0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgKG1rcnVma3lAbGludXh0di5vcmcpCiAgKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCi0JcHJfZGVidWcoIlI6ICgweCUwMngsIDB4JTAyeClcbiIsIGFkZHIsICpkYXRhKTsKKwlwcl9kZWJ1ZygiUjogKDB4JTAyeCwgMHglMDJ4KVxuIiwgYWRkciwgYnVmWzFdKTsKIGZhaWw6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0MjEsNyArMTQyMSw3IEBACiAKIG1vZHVsZV91c2JfZHJpdmVyKG14bDExMXNmX3VzYl9kcml2ZXIpOwogCi1NT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE1heExpbmVhciBNeEwxMTFTRiIpOwogTU9EVUxFX1ZFUlNJT04oIjEuMCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi5oIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9teGwxMTFzZi5oCmluZGV4IDk4MTZkZTguLjg1MTZjMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvbXhsMTExc2YuaAorKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL214bDExMXNmLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTWljaGFlbCBLcnVma3kgKG1rcnVma3lAbGludXh0di5vcmcpCiAgKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9ydGwyOHh4dS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9ydGwyOHh4dS5jCmluZGV4IGVjY2EwMzYuLmZkYTVjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvcnRsMjh4eHUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL3J0bDI4eHh1LmMKQEAgLTE0MDcsNiArMTQwNyw4IEBACiAJCSZydGwyODMydV9wcm9wcywgIkRleGF0ZWsgREsgRFZCLVQgRG9uZ2xlIiwgTlVMTCkgfSwKIAl7IERWQl9VU0JfREVWSUNFKFVTQl9WSURfTEVBRFRFSywgMHg2NjgwLAogCQkmcnRsMjgzMnVfcHJvcHMsICJEaWdpdGFsTm93IFF1YWQgRFZCLVQgUmVjZWl2ZXIiLCBOVUxMKSB9LAorCXsgRFZCX1VTQl9ERVZJQ0UoVVNCX1ZJRF9MRUFEVEVLLCBVU0JfUElEX1dJTkZBU1RfRFRWX0RPTkdMRV9NSU5JRCwKKwkJJnJ0bDI4MzJ1X3Byb3BzLCAiTGVhZHRlayBXaW5mYXN0IERUViBEb25nbGUgTWluaSBEIiwgTlVMTCkgfSwKIAl7IERWQl9VU0JfREVWSUNFKFVTQl9WSURfVEVSUkFURUMsIDB4MDBkMywKIAkJJnJ0bDI4MzJ1X3Byb3BzLCAiVGVycmFUZWMgQ2luZXJneSBUIFN0aWNrIFJDIChSZXYuIDMpIiwgTlVMTCkgfSwKIAl7IERWQl9VU0JfREVWSUNFKFVTQl9WSURfREVYQVRFSywgMHgxMTAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9jeHVzYi5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9jeHVzYi5jCmluZGV4IDIwZTM0NWQuLmExYzY0MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2IvY3h1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2N4dXNiLmMKQEAgLTE0OSw2ICsxNDksNyBAQAogCQkJICBpbnQgbnVtKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IHJldDsKIAlpbnQgaTsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQpAQCAtMTczLDcgKzE3NCw4IEBACiAJCQlpZiAoMSArIG1zZ1tpXS5sZW4gPiBzaXplb2YoaWJ1ZikpIHsKIAkJCQl3YXJuKCJpMmMgcmQ6IGxlbj0lZCBpcyB0b28gYmlnIVxuIiwKIAkJCQkgICAgIG1zZ1tpXS5sZW4pOwotCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIHVubG9jazsKIAkJCX0KIAkJCW9idWZbMF0gPSAwOwogCQkJb2J1ZlsxXSA9IG1zZ1tpXS5sZW47CkBAIC0xOTMsMTIgKzE5NSwxNCBAQAogCQkJaWYgKDMgKyBtc2dbaV0ubGVuID4gc2l6ZW9mKG9idWYpKSB7CiAJCQkJd2FybigiaTJjIHdyOiBsZW49JWQgaXMgdG9vIGJpZyFcbiIsCiAJCQkJICAgICBtc2dbaV0ubGVuKTsKLQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byB1bmxvY2s7CiAJCQl9CiAJCQlpZiAoMSArIG1zZ1tpICsgMV0ubGVuID4gc2l6ZW9mKGlidWYpKSB7CiAJCQkJd2FybigiaTJjIHJkOiBsZW49JWQgaXMgdG9vIGJpZyFcbiIsCiAJCQkJICAgICBtc2dbaSArIDFdLmxlbik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gdW5sb2NrOwogCQkJfQogCQkJb2J1ZlswXSA9IG1zZ1tpXS5sZW47CiAJCQlvYnVmWzFdID0gbXNnW2krMV0ubGVuOwpAQCAtMjIzLDcgKzIyNyw4IEBACiAJCQlpZiAoMiArIG1zZ1tpXS5sZW4gPiBzaXplb2Yob2J1ZikpIHsKIAkJCQl3YXJuKCJpMmMgd3I6IGxlbj0lZCBpcyB0b28gYmlnIVxuIiwKIAkJCQkgICAgIG1zZ1tpXS5sZW4pOwotCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIHVubG9jazsKIAkJCX0KIAkJCW9idWZbMF0gPSBtc2dbaV0uYWRkcjsKIAkJCW9idWZbMV0gPSBtc2dbaV0ubGVuOwpAQCAtMjM3LDggKzI0MiwxNCBAQAogCQl9CiAJfQogCisJaWYgKGkgPT0gbnVtKQorCQlyZXQgPSBudW07CisJZWxzZQorCQlyZXQgPSAtRVJFTU9URUlPOworCit1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwotCXJldHVybiBpID09IG51bSA/IG51bSA6IC1FUkVNT1RFSU87CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUzMiBjeHVzYl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2R3MjEwMi5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9kdzIxMDIuYwppbmRleCBjMWE2M2IyLi5hZTBmNTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2R3MjEwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2IvZHcyMTAyLmMKQEAgLTIsNyArMiw3IEBACiAgKglEVkJXb3JsZCBEVkItUyAyMTAxLCAyMTAyLCBEVkItUzIgMjEwNCwgRFZCLUMgMzEwMSwKICAqCVRlVmlpIFM2MDAsIFM2MzAsIFM2NTAsIFM2NjAsIFM0ODAsIFM0MjEsIFM2MzIKICAqCVByb2YgMTEwMCwgNzUwMCwKLSAqCUdlbmlhdGVjaCBTVTMwMDAgQ2FyZHMKKyAqCUdlbmlhdGVjaCBTVTMwMDAsIFQyMjAgQ2FyZHMKICAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIElnb3IgTS4gTGlwbGlhbmluIChsaXBsaWFuaW5AbWUuYnkpCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlICJzdGI2MTAwLmgiCiAjaW5jbHVkZSAic3RiNjEwMF9wcm9jLmgiCiAjaW5jbHVkZSAibTg4cnMyMDAwLmgiCisjaW5jbHVkZSAidGRhMTgyNzEuaCIKKyNpbmNsdWRlICJjeGQyODIwci5oIgogCiAvKiBNYXggdHJhbnNmZXIgc2l6ZSBkb25lIGJ5IEkyQyB0cmFuc2ZlciBmdW5jdGlvbnMgKi8KICNkZWZpbmUgTUFYX1hGRVJfU0laRSAgNjQKQEAgLTExMCwxMSArMTEyLDYgQEAKIAkJIlBsZWFzZSBzZWUgbGludXgvRG9jdW1lbnRhdGlvbi9kdmIvIGZvciBtb3JlIGRldGFpbHMgIiBcCiAJCSJvbiBmaXJtd2FyZS1wcm9ibGVtcy4iCiAKLXN0cnVjdCByY19tYXBfZHZiX3VzYl90YWJsZV90YWJsZSB7Ci0Jc3RydWN0IHJjX21hcF90YWJsZSAqcmNfa2V5czsKLQlpbnQgcmNfa2V5c19zaXplOwotfTsKLQogc3RydWN0IHN1MzAwMF9zdGF0ZSB7CiAJdTggaW5pdGlhbGl6ZWQ7CiB9OwpAQCAtMTI5LDEyICsxMjYsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyAyPXhmZXIgND1yYyhvci1hYmxlKSkuIgogCQkJCQkJRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCi0vKiBrZXltYXBzICovCi1zdGF0aWMgaW50IGlyX2tleW1hcDsKLW1vZHVsZV9wYXJhbV9uYW1lZChrZXltYXAsIGlyX2tleW1hcCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moa2V5bWFwLCAic2V0IGtleW1hcCAwPWRlZmF1bHQgMT1kdmJ3b3JsZCAyPXRldmlpIDM9dGJzICAuLi4iCi0JCQkiIDI1Nj1ub25lIik7Ci0KIC8qIGRlbW9kIHByb2JlICovCiBzdGF0aWMgaW50IGRlbW9kX3Byb2JlID0gMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZW1vZCwgZGVtb2RfcHJvYmUsIGludCwgMDY0NCk7CkBAIC0zMDEsNiArMjkyLDcgQEAKIHN0YXRpYyBpbnQgZHcyMTAyX2VhcmRhX2kyY190cmFuc2ZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IHJldDsKIAogCWlmICghZCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zMTYsNyArMzA4LDggQEAKIAkJaWYgKDIgKyBtc2dbMV0ubGVuID4gc2l6ZW9mKGlidWYpKSB7CiAJCQl3YXJuKCJpMmMgcmQ6IGxlbj0lZCBpcyB0b28gYmlnIVxuIiwKIAkJCSAgICAgbXNnWzFdLmxlbik7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW5sb2NrOwogCQl9CiAKIAkJb2J1ZlswXSA9IG1zZ1swXS5hZGRyIDw8IDE7CkBAIC0zNDAsNyArMzMzLDggQEAKIAkJCWlmICgyICsgbXNnWzBdLmxlbiA+IHNpemVvZihvYnVmKSkgewogCQkJCXdhcm4oImkyYyB3cjogbGVuPSVkIGlzIHRvbyBiaWchXG4iLAogCQkJCSAgICAgbXNnWzFdLmxlbik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gdW5sb2NrOwogCQkJfQogCiAJCQlvYnVmWzBdID0gbXNnWzBdLmFkZHIgPDwgMTsKQEAgLTM1Nyw3ICszNTEsOCBAQAogCQkJaWYgKDIgKyBtc2dbMF0ubGVuID4gc2l6ZW9mKG9idWYpKSB7CiAJCQkJd2FybigiaTJjIHdyOiBsZW49JWQgaXMgdG9vIGJpZyFcbiIsCiAJCQkJICAgICBtc2dbMV0ubGVuKTsKLQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byB1bmxvY2s7CiAJCQl9CiAKIAkJCW9idWZbMF0gPSBtc2dbMF0uYWRkciA8PCAxOwpAQCAtMzg2LDE1ICszODEsMTcgQEAKIAogCQlicmVhazsKIAl9CisJcmV0ID0gbnVtOwogCit1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwotCXJldHVybiBudW07CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkdzIxMDRfaTJjX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlpbnQgbGVuLCBpLCBqOworCWludCBsZW4sIGksIGosIHJldDsKIAogCWlmICghZCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC00MzAsNyArNDI3LDggQEAKIAkJCQlpZiAoMiArIG1zZ1tqXS5sZW4gPiBzaXplb2YoaWJ1ZikpIHsKIAkJCQkJd2FybigiaTJjIHJkOiBsZW49JWQgaXMgdG9vIGJpZyFcbiIsCiAJCQkJCSAgICAgbXNnW2pdLmxlbik7Ci0JCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJCWdvdG8gdW5sb2NrOwogCQkJCX0KIAogCQkJCWR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGMzLApAQCAtNDY2LDcgKzQ2NCw4IEBACiAJCQkJaWYgKDIgKyBtc2dbal0ubGVuID4gc2l6ZW9mKG9idWYpKSB7CiAJCQkJCXdhcm4oImkyYyB3cjogbGVuPSVkIGlzIHRvbyBiaWchXG4iLAogCQkJCQkgICAgIG1zZ1tqXS5sZW4pOwotCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9CiAKIAkJCQlvYnVmWzBdID0gbXNnW2pdLmFkZHIgPDwgMTsKQEAgLTQ4MSwxNSArNDgwLDE4IEBACiAJCX0KIAogCX0KKwlyZXQgPSBudW07CiAKK3VubG9jazoKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7Ci0JcmV0dXJuIG51bTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGR3MzEwMV9pMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwKIAkJCQkJCQkJaW50IG51bSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByZXQ7CiAJaW50IGk7CiAKIAlpZiAoIWQpCkBAIC01MDYsNyArNTA4LDggQEAKIAkJaWYgKDIgKyBtc2dbMV0ubGVuID4gc2l6ZW9mKGlidWYpKSB7CiAJCQl3YXJuKCJpMmMgcmQ6IGxlbj0lZCBpcyB0b28gYmlnIVxuIiwKIAkJCSAgICAgbXNnWzFdLmxlbik7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW5sb2NrOwogCQl9CiAJCW9idWZbMF0gPSBtc2dbMF0uYWRkciA8PCAxOwogCQlvYnVmWzFdID0gbXNnWzBdLmxlbjsKQEAgLTUzMCw3ICs1MzMsOCBAQAogCQkJaWYgKDIgKyBtc2dbMF0ubGVuID4gc2l6ZW9mKG9idWYpKSB7CiAJCQkJd2FybigiaTJjIHdyOiBsZW49JWQgaXMgdG9vIGJpZyFcbiIsCiAJCQkJICAgICBtc2dbMF0ubGVuKTsKLQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byB1bmxvY2s7CiAJCQl9CiAJCQlvYnVmWzBdID0gbXNnWzBdLmFkZHIgPDwgMTsKIAkJCW9idWZbMV0gPSBtc2dbMF0ubGVuOwpAQCAtNTU2LDkgKzU2MCwxMSBAQAogCQkJCW1zZ1tpXS5mbGFncyA9PSAwID8gIj4+PiIgOiAiPDw8Iik7CiAJCWRlYnVnX2R1bXAobXNnW2ldLmJ1ZiwgbXNnW2ldLmxlbiwgZGViX3hmZXIpOwogCX0KKwlyZXQgPSBudW07CiAKK3VubG9jazoKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7Ci0JcmV0dXJuIG51bTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHM2eDBfaTJjX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCkBAIC01NjYsNyArNTcyLDcgQEAKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCWludCBsZW4sIGksIGo7CisJaW50IGxlbiwgaSwgaiwgcmV0OwogCiAJaWYgKCFkKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTYxOCw3ICs2MjQsOCBAQAogCQkJCWlmIChtc2dbal0ubGVuID4gc2l6ZW9mKGlidWYpKSB7CiAJCQkJCXdhcm4oImkyYyByZDogbGVuPSVkIGlzIHRvbyBiaWchXG4iLAogCQkJCQkgICAgIG1zZ1tqXS5sZW4pOwotCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9CiAKIAkJCQlkdzIxMHhfb3BfcncoZC0+dWRldiwgMHg5MSwgMCwgMCwKQEAgLTY1Miw3ICs2NTksOCBAQAogCQkJCWlmICgyICsgbXNnW2pdLmxlbiA+IHNpemVvZihvYnVmKSkgewogCQkJCQl3YXJuKCJpMmMgd3I6IGxlbj0lZCBpcyB0b28gYmlnIVxuIiwKIAkJCQkJICAgICBtc2dbal0ubGVuKTsKLQkJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQkJZ290byB1bmxvY2s7CiAJCQkJfQogCiAJCQkJb2J1ZlswXSA9IG1zZ1tqICsgMV0ubGVuOwpAQCAtNjcxLDcgKzY3OSw4IEBACiAJCQkJaWYgKDIgKyBtc2dbal0ubGVuID4gc2l6ZW9mKG9idWYpKSB7CiAJCQkJCXdhcm4oImkyYyB3cjogbGVuPSVkIGlzIHRvbyBiaWchXG4iLAogCQkJCQkgICAgIG1zZ1tqXS5sZW4pOwotCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9CiAJCQkJb2J1ZlswXSA9IG1zZ1tqXS5sZW4gKyAxOwogCQkJCW9idWZbMV0gPSAobXNnW2pdLmFkZHIgPDwgMSk7CkBAIC02ODUsOSArNjk0LDExIEBACiAJCX0KIAkJfQogCX0KKwlyZXQgPSBudW07CiAKK3VubG9jazoKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7Ci0JcmV0dXJuIG51bTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHN1MzAwMF9pMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwKQEAgLTEwOTUsNiArMTEwNiwxNiBAQAogCS5zZXRfbG9ja19sZWQgPSBkdzIxMHhfbGVkX2N0cmwsCiB9OwogCitzdGF0aWMgc3RydWN0IGN4ZDI4MjByX2NvbmZpZyBjeGQyODIwcl9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2YywgLyogKDB4ZDggPj4gMSkgKi8KKwkudHNfbW9kZSA9IDB4MzgsCit9OworCitzdGF0aWMgc3RydWN0IHRkYTE4MjcxX2NvbmZpZyB0ZGExODI3MV9jb25maWcgPSB7CisJLm91dHB1dF9vcHQgPSBUREExODI3MV9PVVRQVVRfTFRfT0ZGLAorCS5nYXRlID0gVERBMTgyNzFfR0FURV9ESUdJVEFMLAorfTsKKwogc3RhdGljIHU4IG04OHJzMjAwMF9pbml0dGFiW10gPSB7CiAJREVNT0RfV1JJVEUsIDB4OWEsIDB4MzAsCiAJREVNT0RfV1JJVEUsIDB4MDAsIDB4MDEsCkBAIC0xMzY0LDYgKzEzODUsNDkgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGludCB0MjIwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICpkKQoreworCXU4IG9idWZbM10gPSB7IDB4ZSwgMHg4MCwgMCB9OworCXU4IGlidWZbXSA9IHsgMCB9OworCisJaWYgKGR2Yl91c2JfZ2VuZXJpY19ydyhkLT5kZXYsIG9idWYsIDMsIGlidWYsIDEsIDApIDwgMCkKKwkJZXJyKCJjb21tYW5kIDB4MGUgdHJhbnNmZXIgZmFpbGVkLiIpOworCisJb2J1ZlswXSA9IDB4ZTsKKwlvYnVmWzFdID0gMHg4MzsKKwlvYnVmWzJdID0gMDsKKworCWlmIChkdmJfdXNiX2dlbmVyaWNfcncoZC0+ZGV2LCBvYnVmLCAzLCBpYnVmLCAxLCAwKSA8IDApCisJCWVycigiY29tbWFuZCAweDBlIHRyYW5zZmVyIGZhaWxlZC4iKTsKKworCW1zbGVlcCgxMDApOworCisJb2J1ZlswXSA9IDB4ZTsKKwlvYnVmWzFdID0gMHg4MDsKKwlvYnVmWzJdID0gMTsKKworCWlmIChkdmJfdXNiX2dlbmVyaWNfcncoZC0+ZGV2LCBvYnVmLCAzLCBpYnVmLCAxLCAwKSA8IDApCisJCWVycigiY29tbWFuZCAweDBlIHRyYW5zZmVyIGZhaWxlZC4iKTsKKworCW9idWZbMF0gPSAweDUxOworCisJaWYgKGR2Yl91c2JfZ2VuZXJpY19ydyhkLT5kZXYsIG9idWYsIDEsIGlidWYsIDEsIDApIDwgMCkKKwkJZXJyKCJjb21tYW5kIDB4NTEgdHJhbnNmZXIgZmFpbGVkLiIpOworCisJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goY3hkMjgyMHJfYXR0YWNoLCAmY3hkMjgyMHJfY29uZmlnLAorCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCk7CisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQlpZiAoZHZiX2F0dGFjaCh0ZGExODI3MV9hdHRhY2gsIGQtPmZlX2FkYXBbMF0uZmUsIDB4NjAsCisJCQkJCSZkLT5kZXYtPmkyY19hZGFwLCAmdGRhMTgyNzFfY29uZmlnKSkgeworCQkJaW5mbygiQXR0YWNoZWQgVERBMTgyNzFIRC9DWEQyODIwUiFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpbmZvKCJGYWlsZWQgdG8gYXR0YWNoIFREQTE4MjcxSEQvQ1hEMjgyMFIhXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKwogc3RhdGljIGludCBtODhyczIwMDBfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmQpCiB7CiAJdTggb2J1ZltdID0geyAweDUxIH07CkBAIC0xNDA0LDE3NCArMTQ2OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHJjX21hcF9kdzIxMHhfdGFibGVbXSA9IHsKLQl7IDB4ZjgwYSwgS0VZX1BPV0VSMiB9LAkJLypwb3dlciovCi0JeyAweGY4MGMsIEtFWV9NVVRFIH0sCQkvKm11dGUqLwotCXsgMHhmODExLCBLRVlfMSB9LAotCXsgMHhmODEyLCBLRVlfMiB9LAotCXsgMHhmODEzLCBLRVlfMyB9LAotCXsgMHhmODE0LCBLRVlfNCB9LAotCXsgMHhmODE1LCBLRVlfNSB9LAotCXsgMHhmODE2LCBLRVlfNiB9LAotCXsgMHhmODE3LCBLRVlfNyB9LAotCXsgMHhmODE4LCBLRVlfOCB9LAotCXsgMHhmODE5LCBLRVlfOSB9LAotCXsgMHhmODEwLCBLRVlfMCB9LAotCXsgMHhmODFjLCBLRVlfQ0hBTk5FTFVQIH0sCS8qY2grKi8KLQl7IDB4ZjgwZiwgS0VZX0NIQU5ORUxET1dOIH0sCS8qY2gtKi8KLQl7IDB4ZjgxYSwgS0VZX1ZPTFVNRVVQIH0sCS8qdm9sKyovCi0JeyAweGY4MGUsIEtFWV9WT0xVTUVET1dOIH0sCS8qdm9sLSovCi0JeyAweGY4MDQsIEtFWV9SRUNPUkQgfSwJCS8qcmVjKi8KLQl7IDB4ZjgwOSwgS0VZX0ZBVk9SSVRFUyB9LAkvKmZhdiovCi0JeyAweGY4MDgsIEtFWV9SRVdJTkQgfSwJCS8qcmV3aW5kKi8KLQl7IDB4ZjgwNywgS0VZX0ZBU1RGT1JXQVJEIH0sCS8qZmFzdCovCi0JeyAweGY4MGIsIEtFWV9QQVVTRSB9LAkJLypwYXVzZSovCi0JeyAweGY4MDIsIEtFWV9FU0MgfSwJCS8qY2FuY2VsKi8KLQl7IDB4ZjgwMywgS0VZX1RBQiB9LAkJLyp0YWIqLwotCXsgMHhmODAwLCBLRVlfVVAgfSwJCS8qdXAqLwotCXsgMHhmODFmLCBLRVlfT0sgfSwJCS8qb2sqLwotCXsgMHhmODAxLCBLRVlfRE9XTiB9LAkJLypkb3duKi8KLQl7IDB4ZjgwNSwgS0VZX0NBTUVSQSB9LAkJLypjYXAqLwotCXsgMHhmODA2LCBLRVlfU1RPUCB9LAkJLypzdG9wKi8KLQl7IDB4Zjg0MCwgS0VZX1pPT00gfSwJCS8qZnVsbCovCi0JeyAweGY4MWUsIEtFWV9UViB9LAkJLyp0dm1vZGUqLwotCXsgMHhmODFiLCBLRVlfTEFTVCB9LAkJLypyZWNhbGwqLwotfTsKLQotc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgcmNfbWFwX3RldmlpX3RhYmxlW10gPSB7Ci0JeyAweGY4MGEsIEtFWV9QT1dFUiB9LAotCXsgMHhmODBjLCBLRVlfTVVURSB9LAotCXsgMHhmODExLCBLRVlfMSB9LAotCXsgMHhmODEyLCBLRVlfMiB9LAotCXsgMHhmODEzLCBLRVlfMyB9LAotCXsgMHhmODE0LCBLRVlfNCB9LAotCXsgMHhmODE1LCBLRVlfNSB9LAotCXsgMHhmODE2LCBLRVlfNiB9LAotCXsgMHhmODE3LCBLRVlfNyB9LAotCXsgMHhmODE4LCBLRVlfOCB9LAotCXsgMHhmODE5LCBLRVlfOSB9LAotCXsgMHhmODEwLCBLRVlfMCB9LAotCXsgMHhmODFjLCBLRVlfTUVOVSB9LAotCXsgMHhmODBmLCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHhmODFhLCBLRVlfTEFTVCB9LAotCXsgMHhmODBlLCBLRVlfT1BFTiB9LAotCXsgMHhmODA0LCBLRVlfUkVDT1JEIH0sCi0JeyAweGY4MDksIEtFWV9WT0xVTUVVUCB9LAotCXsgMHhmODA4LCBLRVlfQ0hBTk5FTFVQIH0sCi0JeyAweGY4MDcsIEtFWV9QVlIgfSwKLQl7IDB4ZjgwYiwgS0VZX1RJTUUgfSwKLQl7IDB4ZjgwMiwgS0VZX1JJR0hUIH0sCi0JeyAweGY4MDMsIEtFWV9MRUZUIH0sCi0JeyAweGY4MDAsIEtFWV9VUCB9LAotCXsgMHhmODFmLCBLRVlfT0sgfSwKLQl7IDB4ZjgwMSwgS0VZX0RPV04gfSwKLQl7IDB4ZjgwNSwgS0VZX1RVTkVSIH0sCi0JeyAweGY4MDYsIEtFWV9DSEFOTkVMRE9XTiB9LAotCXsgMHhmODQwLCBLRVlfUExBWVBBVVNFIH0sCi0JeyAweGY4MWUsIEtFWV9SRVdJTkQgfSwKLQl7IDB4ZjgxYiwgS0VZX0ZBVk9SSVRFUyB9LAotCXsgMHhmODFkLCBLRVlfQkFDSyB9LAotCXsgMHhmODRkLCBLRVlfRkFTVEZPUldBUkQgfSwKLQl7IDB4Zjg0NCwgS0VZX0VQRyB9LAotCXsgMHhmODRjLCBLRVlfSU5GTyB9LAotCXsgMHhmODQxLCBLRVlfQUIgfSwKLQl7IDB4Zjg0MywgS0VZX0FVRElPIH0sCi0JeyAweGY4NDUsIEtFWV9TVUJUSVRMRSB9LAotCXsgMHhmODRhLCBLRVlfTElTVCB9LAotCXsgMHhmODQ2LCBLRVlfRjEgfSwKLQl7IDB4Zjg0NywgS0VZX0YyIH0sCi0JeyAweGY4NWUsIEtFWV9GMyB9LAotCXsgMHhmODVjLCBLRVlfRjQgfSwKLQl7IDB4Zjg1MiwgS0VZX0Y1IH0sCi0JeyAweGY4NWEsIEtFWV9GNiB9LAotCXsgMHhmODU2LCBLRVlfTU9ERSB9LAotCXsgMHhmODU4LCBLRVlfU1dJVENIVklERU9NT0RFIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSByY19tYXBfdGJzX3RhYmxlW10gPSB7Ci0JeyAweGY4ODQsIEtFWV9QT1dFUiB9LAotCXsgMHhmODk0LCBLRVlfTVVURSB9LAotCXsgMHhmODg3LCBLRVlfMSB9LAotCXsgMHhmODg2LCBLRVlfMiB9LAotCXsgMHhmODg1LCBLRVlfMyB9LAotCXsgMHhmODhiLCBLRVlfNCB9LAotCXsgMHhmODhhLCBLRVlfNSB9LAotCXsgMHhmODg5LCBLRVlfNiB9LAotCXsgMHhmODhmLCBLRVlfNyB9LAotCXsgMHhmODhlLCBLRVlfOCB9LAotCXsgMHhmODhkLCBLRVlfOSB9LAotCXsgMHhmODkyLCBLRVlfMCB9LAotCXsgMHhmODk2LCBLRVlfQ0hBTk5FTFVQIH0sCi0JeyAweGY4OTEsIEtFWV9DSEFOTkVMRE9XTiB9LAotCXsgMHhmODkzLCBLRVlfVk9MVU1FVVAgfSwKLQl7IDB4Zjg4YywgS0VZX1ZPTFVNRURPV04gfSwKLQl7IDB4Zjg4MywgS0VZX1JFQ09SRCB9LAotCXsgMHhmODk4LCBLRVlfUEFVU0UgIH0sCi0JeyAweGY4OTksIEtFWV9PSyB9LAotCXsgMHhmODlhLCBLRVlfU0hVRkZMRSB9LAotCXsgMHhmODgxLCBLRVlfVVAgfSwKLQl7IDB4Zjg5MCwgS0VZX0xFRlQgfSwKLQl7IDB4Zjg4MiwgS0VZX1JJR0hUIH0sCi0JeyAweGY4ODgsIEtFWV9ET1dOIH0sCi0JeyAweGY4OTUsIEtFWV9GQVZPUklURVMgfSwKLQl7IDB4Zjg5NywgS0VZX1NVQlRJVExFIH0sCi0JeyAweGY4OWQsIEtFWV9aT09NIH0sCi0JeyAweGY4OWYsIEtFWV9FWElUIH0sCi0JeyAweGY4OWUsIEtFWV9NRU5VIH0sCi0JeyAweGY4OWMsIEtFWV9FUEcgfSwKLQl7IDB4Zjg4MCwgS0VZX1BSRVZJT1VTIH0sCi0JeyAweGY4OWIsIEtFWV9NT0RFIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHJjX21hcF9zdTMwMDBfdGFibGVbXSA9IHsKLQl7IDB4MjUsIEtFWV9QT1dFUiB9LAkvKiByaWdodC1ib3R0b20gUmVkICovCi0JeyAweDBhLCBLRVlfTVVURSB9LAkvKiAtLy0tICovCi0JeyAweDAxLCBLRVlfMSB9LAotCXsgMHgwMiwgS0VZXzIgfSwKLQl7IDB4MDMsIEtFWV8zIH0sCi0JeyAweDA0LCBLRVlfNCB9LAotCXsgMHgwNSwgS0VZXzUgfSwKLQl7IDB4MDYsIEtFWV82IH0sCi0JeyAweDA3LCBLRVlfNyB9LAotCXsgMHgwOCwgS0VZXzggfSwKLQl7IDB4MDksIEtFWV85IH0sCi0JeyAweDAwLCBLRVlfMCB9LAotCXsgMHgyMCwgS0VZX1VQIH0sCS8qIENIKyAqLwotCXsgMHgyMSwgS0VZX0RPV04gfSwJLyogQ0grICovCi0JeyAweDEyLCBLRVlfVk9MVU1FVVAgfSwJLyogQnJpZ2h0bmVzcyBVcCAqLwotCXsgMHgxMywgS0VZX1ZPTFVNRURPV04gfSwvKiBCcmlnaHRuZXNzIERvd24gKi8KLQl7IDB4MWYsIEtFWV9SRUNPUkQgfSwKLQl7IDB4MTcsIEtFWV9QTEFZIH0sCi0JeyAweDE2LCBLRVlfUEFVU0UgfSwKLQl7IDB4MGIsIEtFWV9TVE9QIH0sCi0JeyAweDI3LCBLRVlfRkFTVEZPUldBUkQgfSwvKiA+PiAqLwotCXsgMHgyNiwgS0VZX1JFV0lORCB9LAkvKiA8PCAqLwotCXsgMHgwZCwgS0VZX09LIH0sCS8qIE11dGUgKi8KLQl7IDB4MTEsIEtFWV9MRUZUIH0sCS8qIFZPTC0gKi8KLQl7IDB4MTAsIEtFWV9SSUdIVCB9LAkvKiBWT0wrICovCi0JeyAweDI5LCBLRVlfQkFDSyB9LAkvKiBidXR0b24gdW5kZXIgOSAqLwotCXsgMHgyYywgS0VZX01FTlUgfSwJLyogVFRYICovCi0JeyAweDJiLCBLRVlfRVBHIH0sCS8qIEVQRyAqLwotCXsgMHgxZSwgS0VZX1JFRCB9LAkvKiBPU0QgKi8KLQl7IDB4MGUsIEtFWV9HUkVFTiB9LAkvKiBXaW5kb3cgKi8KLQl7IDB4MmQsIEtFWV9ZRUxMT1cgfSwJLyogYnV0dG9uIHVuZGVyIDw8ICovCi0JeyAweDBmLCBLRVlfQkxVRSB9LAkvKiBib3R0b20geWVsbG93IGJ1dHRvbiAqLwotCXsgMHgxNCwgS0VZX0FVRElPIH0sCS8qIFNuYXBzaG90ICovCi0JeyAweDM4LCBLRVlfVFYgfSwJLyogVFYvUmFkaW8gKi8KLQl7IDB4MGMsIEtFWV9FU0MgfQkvKiB1cHBlciBSZWQgYnV0dG9uICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJjX21hcF9kdmJfdXNiX3RhYmxlX3RhYmxlIGtleXNfdGFibGVzW10gPSB7Ci0JeyByY19tYXBfZHcyMTB4X3RhYmxlLCBBUlJBWV9TSVpFKHJjX21hcF9kdzIxMHhfdGFibGUpIH0sCi0JeyByY19tYXBfdGV2aWlfdGFibGUsIEFSUkFZX1NJWkUocmNfbWFwX3RldmlpX3RhYmxlKSB9LAotCXsgcmNfbWFwX3Ric190YWJsZSwgQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKSB9LAotCXsgcmNfbWFwX3N1MzAwMF90YWJsZSwgQVJSQVlfU0laRShyY19tYXBfc3UzMDAwX3RhYmxlKSB9LAotfTsKLQotc3RhdGljIGludCBkdzIxMDJfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQorc3RhdGljIGludCBkdzIxMDJfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewotCXN0cnVjdCByY19tYXBfdGFibGUgKmtleW1hcCA9IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19tYXBfdGFibGU7Ci0JaW50IGtleW1hcF9zaXplID0gZC0+cHJvcHMucmMubGVnYWN5LnJjX21hcF9zaXplOwogCXU4IGtleVsyXTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CiAJCS5hZGRyID0gRFcyMTAyX1JDX1FVRVJZLApAQCAtMTU3OSwzMiArMTQ3Nyw1NSBAQAogCQkuYnVmID0ga2V5LAogCQkubGVuID0gMgogCX07Ci0JaW50IGk7Ci0JLyogb3ZlcnJpZGUga2V5bWFwICovCi0JaWYgKChpcl9rZXltYXAgPiAwKSAmJiAoaXJfa2V5bWFwIDw9IEFSUkFZX1NJWkUoa2V5c190YWJsZXMpKSkgewotCQlrZXltYXAgPSBrZXlzX3RhYmxlc1tpcl9rZXltYXAgLSAxXS5yY19rZXlzIDsKLQkJa2V5bWFwX3NpemUgPSBrZXlzX3RhYmxlc1tpcl9rZXltYXAgLSAxXS5yY19rZXlzX3NpemU7Ci0JfSBlbHNlIGlmIChpcl9rZXltYXAgPiBBUlJBWV9TSVpFKGtleXNfdGFibGVzKSkKLQkJcmV0dXJuIDA7IC8qIG5vbmUgKi8KIAotCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKIAlpZiAoZC0+cHJvcHMuaTJjX2FsZ28tPm1hc3Rlcl94ZmVyKCZkLT5pMmNfYWRhcCwgJm1zZywgMSkgPT0gMSkgewotCQlmb3IgKGkgPSAwOyBpIDwga2V5bWFwX3NpemUgOyBpKyspIHsKLQkJCWlmIChyYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBtc2cuYnVmWzBdKSB7Ci0JCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwotCQkJCSpldmVudCA9IGtleW1hcFtpXS5rZXljb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlpZiAoKCpzdGF0ZSkgPT0gUkVNT1RFX0tFWV9QUkVTU0VEKQotCQkJZGViX3JjKCIlczogZm91bmQgcmMga2V5OiAleCwgJXgsIGV2ZW50OiAleFxuIiwKLQkJCQkJX19mdW5jX18sIGtleVswXSwga2V5WzFdLCAoKmV2ZW50KSk7Ci0JCWVsc2UgaWYgKGtleVswXSAhPSAweGZmKQotCQkJZGViX3JjKCIlczogdW5rbm93biByYyBrZXk6ICV4LCAleFxuIiwKKwkJaWYgKG1zZy5idWZbMF0gIT0gMHhmZikgeworCQkJZGViX3JjKCIlczogcmMgY29kZTogJXgsICV4XG4iLAogCQkJCQlfX2Z1bmNfXywga2V5WzBdLCBrZXlbMV0pOworCQkJcmNfa2V5ZG93bihkLT5yY19kZXYsIGtleVswXSwgMSk7CisJCX0KKwl9CiAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9mX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBrZXlbMl07CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IERXMjEwMl9SQ19RVUVSWSwKKwkJLmZsYWdzID0gSTJDX01fUkQsCisJCS5idWYgPSBrZXksCisJCS5sZW4gPSAyCisJfTsKKworCWlmIChkLT5wcm9wcy5pMmNfYWxnby0+bWFzdGVyX3hmZXIoJmQtPmkyY19hZGFwLCAmbXNnLCAxKSA9PSAxKSB7CisJCWlmIChtc2cuYnVmWzBdICE9IDB4ZmYpIHsKKwkJCWRlYl9yYygiJXM6IHJjIGNvZGU6ICV4LCAleFxuIiwKKwkJCQkJX19mdW5jX18sIGtleVswXSwga2V5WzFdKTsKKwkJCXJjX2tleWRvd24oZC0+cmNfZGV2LCBrZXlbMF1eMHhmZiwgMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdTMwMDBfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXU4IGtleVsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gRFcyMTAyX1JDX1FVRVJZLAorCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJLmJ1ZiA9IGtleSwKKwkJLmxlbiA9IDIKKwl9OworCisJaWYgKGQtPnByb3BzLmkyY19hbGdvLT5tYXN0ZXJfeGZlcigmZC0+aTJjX2FkYXAsICZtc2csIDEpID09IDEpIHsKKwkJaWYgKG1zZy5idWZbMF0gIT0gMHhmZikgeworCQkJZGViX3JjKCIlczogcmMgY29kZTogJXgsICV4XG4iLAorCQkJCQlfX2Z1bmNfXywga2V5WzBdLCBrZXlbMV0pOworCQkJcmNfa2V5ZG93bihkLT5yY19kZXYsIGtleVsxXSA8PCA4IHwga2V5WzBdLCAxKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMTYzMCw2ICsxNTUxLDcgQEAKIAlURVZJSV9TNjMyLAogCVRFUlJBVEVDX0NJTkVSR1lfUzJfUjIsCiAJR09UVklFV19TQVRfSEQsCisJR0VOSUFURUNIX1QyMjAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZHcyMTAyX3RhYmxlW10gPSB7CkBAIC0xNjUyLDYgKzE1NzQsNyBAQAogCVtURVZJSV9TNjMyXSA9IHtVU0JfREVWSUNFKDB4OTAyMiwgVVNCX1BJRF9URVZJSV9TNjMyKX0sCiAJW1RFUlJBVEVDX0NJTkVSR1lfUzJfUjJdID0ge1VTQl9ERVZJQ0UoVVNCX1ZJRF9URVJSQVRFQywgMHgwMGIwKX0sCiAJW0dPVFZJRVdfU0FUX0hEXSA9IHtVU0JfREVWSUNFKDB4MUZFMSwgVVNCX1BJRF9HT1RWSUVXX1NBVF9IRCl9LAorCVtHRU5JQVRFQ0hfVDIyMF0gPSB7VVNCX0RFVklDRSgweDFmNGQsIDB4RDIyMCl9LAogCXsgfQogfTsKIApAQCAtMTcxMSw5ICsxNjM0LDcgQEAKIAkJLyogaW5pdCByZWdpc3RlcnMgKi8KIAkJc3dpdGNoIChkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSB7CiAJCWNhc2UgVVNCX1BJRF9URVZJSV9TNjUwOgotCQkJZHcyMTA0X3Byb3BlcnRpZXMucmMubGVnYWN5LnJjX21hcF90YWJsZSA9IHJjX21hcF90ZXZpaV90YWJsZTsKLQkJCWR3MjEwNF9wcm9wZXJ0aWVzLnJjLmxlZ2FjeS5yY19tYXBfc2l6ZSA9Ci0JCQkJCUFSUkFZX1NJWkUocmNfbWFwX3RldmlpX3RhYmxlKTsKKwkJCWR3MjEwNF9wcm9wZXJ0aWVzLnJjLmNvcmUucmNfY29kZXMgPSBSQ19NQVBfVEVWSUlfTkVDOwogCQljYXNlIFVTQl9QSURfRFcyMTA0OgogCQkJcmVzZXQgPSAxOwogCQkJZHcyMTB4X29wX3J3KGRldiwgMHhjNCwgMHgwMDAwLCAwLCAmcmVzZXQsIDEsCkBAIC0xNzc3LDEwICsxNjk4LDExIEBACiAKIAkuaTJjX2FsZ28gPSAmZHcyMTAyX3Nlcml0X2kyY19hbGdvLAogCi0JLnJjLmxlZ2FjeSA9IHsKLQkJLnJjX21hcF90YWJsZSA9IHJjX21hcF9kdzIxMHhfdGFibGUsCi0JCS5yY19tYXBfc2l6ZSA9IEFSUkFZX1NJWkUocmNfbWFwX2R3MjEweF90YWJsZSksCisJLnJjLmNvcmUgPSB7CiAJCS5yY19pbnRlcnZhbCA9IDE1MCwKKwkJLnJjX2NvZGVzID0gUkNfTUFQX0RNMTEwNV9ORUMsCisJCS5tb2R1bGVfbmFtZSA9ICJkdzIxMDIiLAorCQkuYWxsb3dlZF9wcm90b3MgICA9IFJDX0JJVF9ORUMsCiAJCS5yY19xdWVyeSA9IGR3MjEwMl9yY19xdWVyeSwKIAl9LAogCkBAIC0xODMxLDEwICsxNzUzLDExIEBACiAJLm5vX3JlY29ubmVjdCA9IDEsCiAKIAkuaTJjX2FsZ28gPSAmZHcyMTA0X2kyY19hbGdvLAotCS5yYy5sZWdhY3kgPSB7Ci0JCS5yY19tYXBfdGFibGUgPSByY19tYXBfZHcyMTB4X3RhYmxlLAotCQkucmNfbWFwX3NpemUgPSBBUlJBWV9TSVpFKHJjX21hcF9kdzIxMHhfdGFibGUpLAorCS5yYy5jb3JlID0gewogCQkucmNfaW50ZXJ2YWwgPSAxNTAsCisJCS5yY19jb2RlcyA9IFJDX01BUF9ETTExMDVfTkVDLAorCQkubW9kdWxlX25hbWUgPSAiZHcyMTAyIiwKKwkJLmFsbG93ZWRfcHJvdG9zICAgPSBSQ19CSVRfTkVDLAogCQkucmNfcXVlcnkgPSBkdzIxMDJfcmNfcXVlcnksCiAJfSwKIApAQCAtMTg4MSwxMCArMTgwNCwxMSBAQAogCS5ub19yZWNvbm5lY3QgPSAxLAogCiAJLmkyY19hbGdvID0gJmR3MzEwMV9pMmNfYWxnbywKLQkucmMubGVnYWN5ID0gewotCQkucmNfbWFwX3RhYmxlID0gcmNfbWFwX2R3MjEweF90YWJsZSwKLQkJLnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfZHcyMTB4X3RhYmxlKSwKKwkucmMuY29yZSA9IHsKIAkJLnJjX2ludGVydmFsID0gMTUwLAorCQkucmNfY29kZXMgPSBSQ19NQVBfRE0xMTA1X05FQywKKwkJLm1vZHVsZV9uYW1lID0gImR3MjEwMiIsCisJCS5hbGxvd2VkX3Byb3RvcyAgID0gUkNfQklUX05FQywKIAkJLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAogCX0sCiAKQEAgLTE5MjksMTAgKzE4NTMsMTEgQEAKIAkubm9fcmVjb25uZWN0ID0gMSwKIAogCS5pMmNfYWxnbyA9ICZzNngwX2kyY19hbGdvLAotCS5yYy5sZWdhY3kgPSB7Ci0JCS5yY19tYXBfdGFibGUgPSByY19tYXBfdGV2aWlfdGFibGUsCi0JCS5yY19tYXBfc2l6ZSA9IEFSUkFZX1NJWkUocmNfbWFwX3RldmlpX3RhYmxlKSwKKwkucmMuY29yZSA9IHsKIAkJLnJjX2ludGVydmFsID0gMTUwLAorCQkucmNfY29kZXMgPSBSQ19NQVBfVEVWSUlfTkVDLAorCQkubW9kdWxlX25hbWUgPSAiZHcyMTAyIiwKKwkJLmFsbG93ZWRfcHJvdG9zICAgPSBSQ19CSVRfTkVDLAogCQkucmNfcXVlcnkgPSBkdzIxMDJfcmNfcXVlcnksCiAJfSwKIApAQCAtMjAyMiwxMSArMTk0NywxMiBAQAogCS5pZGVudGlmeV9zdGF0ZQk9IHN1MzAwMF9pZGVudGlmeV9zdGF0ZSwKIAkuaTJjX2FsZ28gPSAmc3UzMDAwX2kyY19hbGdvLAogCi0JLnJjLmxlZ2FjeSA9IHsKLQkJLnJjX21hcF90YWJsZSA9IHJjX21hcF9zdTMwMDBfdGFibGUsCi0JCS5yY19tYXBfc2l6ZSA9IEFSUkFZX1NJWkUocmNfbWFwX3N1MzAwMF90YWJsZSksCisJLnJjLmNvcmUgPSB7CiAJCS5yY19pbnRlcnZhbCA9IDE1MCwKLQkJLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAorCQkucmNfY29kZXMgPSBSQ19NQVBfU1UzMDAwLAorCQkubW9kdWxlX25hbWUgPSAiZHcyMTAyIiwKKwkJLmFsbG93ZWRfcHJvdG9zICAgPSBSQ19CSVRfUkM1LAorCQkucmNfcXVlcnkgPSBzdTMwMDBfcmNfcXVlcnksCiAJfSwKIAogCS5yZWFkX21hY19hZGRyZXNzID0gc3UzMDAwX3JlYWRfbWFjX2FkZHJlc3MsCkBAIC0yMDc3LDYgKzIwMDMsNTUgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgdDIyMF9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKwkudXNiX2N0cmwgPSBERVZJQ0VfU1BFQ0lGSUMsCisJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3Qgc3UzMDAwX3N0YXRlKSwKKwkucG93ZXJfY3RybCA9IHN1MzAwMF9wb3dlcl9jdHJsLAorCS5udW1fYWRhcHRlcnMgPSAxLAorCS5pZGVudGlmeV9zdGF0ZQk9IHN1MzAwMF9pZGVudGlmeV9zdGF0ZSwKKwkuaTJjX2FsZ28gPSAmc3UzMDAwX2kyY19hbGdvLAorCisJLnJjLmNvcmUgPSB7CisJCS5yY19pbnRlcnZhbCA9IDE1MCwKKwkJLnJjX2NvZGVzID0gUkNfTUFQX1NVMzAwMCwKKwkJLm1vZHVsZV9uYW1lID0gImR3MjEwMiIsCisJCS5hbGxvd2VkX3Byb3RvcyAgID0gUkNfQklUX1JDNSwKKwkJLnJjX3F1ZXJ5ID0gc3UzMDAwX3JjX3F1ZXJ5LAorCX0sCisKKwkucmVhZF9tYWNfYWRkcmVzcyA9IHN1MzAwMF9yZWFkX21hY19hZGRyZXNzLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKworCS5hZGFwdGVyID0geworCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0geyB7CisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IHN1MzAwMF9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gdDIyMF9mcm9udGVuZF9hdHRhY2gsCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gOCwKKwkJCQkuZW5kcG9pbnQgPSAweDgyLAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSB9LAorCQl9CisJfSwKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgIkdlbmlhdGVjaCBUMjIwIERWQi1UL1QyIFVTQjIuMCIsCisJCQl7ICZkdzIxMDJfdGFibGVbR0VOSUFURUNIX1QyMjBdLCBOVUxMIH0sCisJCQl7IE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCiBzdGF0aWMgaW50IGR3MjEwMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtMjA4OCw4ICsyMDYzLDggQEAKIAkvKiBmaWxsIG9ubHkgZGlmZmVyZW50IGZpZWxkcyAqLwogCXAxMTAwLT5maXJtd2FyZSA9IFAxMTAwX0ZJUk1XQVJFOwogCXAxMTAwLT5kZXZpY2VzWzBdID0gZDExMDA7Ci0JcDExMDAtPnJjLmxlZ2FjeS5yY19tYXBfdGFibGUgPSByY19tYXBfdGJzX3RhYmxlOwotCXAxMTAwLT5yYy5sZWdhY3kucmNfbWFwX3NpemUgPSBBUlJBWV9TSVpFKHJjX21hcF90YnNfdGFibGUpOworCXAxMTAwLT5yYy5jb3JlLnJjX3F1ZXJ5ID0gcHJvZl9yY19xdWVyeTsKKwlwMTEwMC0+cmMuY29yZS5yY19jb2RlcyA9IFJDX01BUF9UQlNfTkVDOwogCXAxMTAwLT5hZGFwdGVyLT5mZVswXS5mcm9udGVuZF9hdHRhY2ggPSBzdHYwMjg4X2Zyb250ZW5kX2F0dGFjaDsKIAogCXM2NjAgPSBrbWVtZHVwKCZzNngwX3Byb3BlcnRpZXMsCkBAIC0yMTE0LDggKzIwODksOCBAQAogCX0KIAlwNzUwMC0+ZmlybXdhcmUgPSBQNzUwMF9GSVJNV0FSRTsKIAlwNzUwMC0+ZGV2aWNlc1swXSA9IGQ3NTAwOwotCXA3NTAwLT5yYy5sZWdhY3kucmNfbWFwX3RhYmxlID0gcmNfbWFwX3Ric190YWJsZTsKLQlwNzUwMC0+cmMubGVnYWN5LnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKTsKKwlwNzUwMC0+cmMuY29yZS5yY19xdWVyeSA9IHByb2ZfcmNfcXVlcnk7CisJcDc1MDAtPnJjLmNvcmUucmNfY29kZXMgPSBSQ19NQVBfVEJTX05FQzsKIAlwNzUwMC0+YWRhcHRlci0+ZmVbMF0uZnJvbnRlbmRfYXR0YWNoID0gcHJvZl83NTAwX2Zyb250ZW5kX2F0dGFjaDsKIAogCkBAIC0yMTQ5LDcgKzIxMjQsOSBAQAogCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgczQyMSwKIAkJCVRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSB8fAogCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJnN1MzAwMF9wcm9wZXJ0aWVzLAotCQkJCSAgICAgVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpKQorCQkJIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSB8fAorCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJnQyMjBfcHJvcGVydGllcywKKwkJCSBUSElTX01PRFVMRSwgTlVMTCwgYWRhcHRlcl9ucikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMTY5LDcgKzIxNDYsNyBAQAogCQkJIiBEVkItQyAzMTAxIFVTQjIuMCwiCiAJCQkiIFRlVmlpIFM2MDAsIFM2MzAsIFM2NTAsIFM2NjAsIFM0ODAsIFM0MjEsIFM2MzIiCiAJCQkiIFByb2YgMTEwMCwgNzUwMCBVU0IyLjAsIgotCQkJIiBHZW5pYXRlY2ggU1UzMDAwIGRldmljZXMiKTsKKwkJCSIgR2VuaWF0ZWNoIFNVMzAwMCwgVDIyMCBkZXZpY2VzIik7CiBNT0RVTEVfVkVSU0lPTigiMC4xIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfRklSTVdBUkUoRFcyMTAxX0ZJUk1XQVJFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L0tjb25maWcKaW5kZXggY2E1ZWU2YS4uYTFmY2NmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L0tjb25maWcKQEAgLTEsOCArMSwxMiBAQAogY29uZmlnIFZJREVPX0VNMjhYWAotCXRyaXN0YXRlICJFbXBpYSBFTTI4eHggVVNCIHZpZGVvIGNhcHR1cmUgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiRW1waWEgRU0yOHh4IFVTQiBkZXZpY2VzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCiAJc2VsZWN0IFZJREVPX1RVTkVSCiAJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisKK2NvbmZpZyBWSURFT19FTTI4WFhfVjRMMgorCXRyaXN0YXRlICJFbXBpYSBFTTI4eHggYW5hbG9nIFRWLCB2aWRlbyBjYXB0dXJlIGFuZC9vciB3ZWJjYW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX0VNMjhYWAogCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQwogCXNlbGVjdCBWSURFT19TQUE3MTFYIGlmIE1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCiAJc2VsZWN0IFZJREVPX1RWUDUxNTAgaWYgTUVESUFfU1VCRFJWX0FVVE9TRUxFQ1QKQEAgLTQ5LDYgKzUzLDggQEAKIAlzZWxlY3QgRFZCX01CODZBMjBTIGlmIE1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCiAJc2VsZWN0IE1FRElBX1RVTkVSX1FUMTAxMCBpZiBNRURJQV9TVUJEUlZfQVVUT1NFTEVDVAogCXNlbGVjdCBNRURJQV9UVU5FUl9UREExODI3MSBpZiBNRURJQV9TVUJEUlZfQVVUT1NFTEVDVAorCXNlbGVjdCBEVkJfTTg4RFMzMTAzIGlmIE1FRElBX1NVQkRSVl9BVVRPU0VMRUNUCisJc2VsZWN0IE1FRElBX1RVTkVSX004OFRTMjAyMiBpZiBNRURJQV9TVUJEUlZfQVVUT1NFTEVDVAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBEVkIgY2FyZHMgYmFzZWQgb24gdGhlCiAJICBFbXBpYXRlY2ggZW0yOHh4IGNoaXBzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L01ha2VmaWxlCmluZGV4IGFkNmQ0ODUuLjNmODUwZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvTWFrZWZpbGUKQEAgLTEsMTAgKzEsMTEgQEAKLWVtMjh4eC15ICs9CWVtMjh4eC12aWRlby5vIGVtMjh4eC1pMmMubyBlbTI4eHgtY2FyZHMubwotZW0yOHh4LXkgKz0JZW0yOHh4LWNvcmUubyAgZW0yOHh4LXZiaS5vIGVtMjh4eC1jYW1lcmEubworZW0yOHh4LXkgKz0JZW0yOHh4LWNvcmUubyBlbTI4eHgtaTJjLm8gZW0yOHh4LWNhcmRzLm8gZW0yOHh4LWNhbWVyYS5vCiAKK2VtMjh4eC12NGwtb2JqcyA6PSBlbTI4eHgtdmlkZW8ubyBlbTI4eHgtdmJpLm8KIGVtMjh4eC1hbHNhLW9ianMgOj0gZW0yOHh4LWF1ZGlvLm8KIGVtMjh4eC1yYy1vYmpzIDo9IGVtMjh4eC1pbnB1dC5vCiAKIG9iai0kKENPTkZJR19WSURFT19FTTI4WFgpICs9IGVtMjh4eC5vCitvYmotJChDT05GSUdfVklERU9fRU0yOFhYX1Y0TDIpICs9IGVtMjh4eC12NGwubwogb2JqLSQoQ09ORklHX1ZJREVPX0VNMjhYWF9BTFNBKSArPSBlbTI4eHgtYWxzYS5vCiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYX0RWQikgKz0gZW0yOHh4LWR2Yi5vCiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYX1JDKSArPSBlbTI4eHgtcmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCmluZGV4IDJmZGI2NmUuLjA1ZTliZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNCBNYXVybyBDYXJ2YWxobyBDaGVoYWIKICAqCS0gUG9ydCB0byB3b3JrIHdpdGggdGhlIGluLWtlcm5lbCBkcml2ZXIKICAqCS0gQ2xlYW51cHMsIGZpeGVzLCBhbHNhLWNvbnRyb2xzLCBldGMuCiAgKgpAQCAtNTAsNiArNTAsOSBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImFjdGl2YXRlcyBkZWJ1ZyBpbmZvIik7CiAKKyNkZWZpbmUgRU0yOFhYX01BWF9BVURJT19CVUZTCQk1CisjZGVmaW5lIEVNMjhYWF9NSU5fQVVESU9fUEFDS0VUUwk2NAorCiAjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pIGRvIHsJCQkJCVwKIAkgICAgaWYgKGRlYnVnKQkJCQkJCQlcCiAJCXByaW50ayhLRVJOX0lORk8gImVtMjh4eC1hdWRpbyAlczogIiBmbXQsCQlcCkBAIC02MywxNyArNjYsMTMgQEAKIAlpbnQgaTsKIAogCWRwcmludGsoIlN0b3BwaW5nIGlzb2NcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBFTTI4WFhfQVVESU9fQlVGUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRldi0+YWRldi5udW1fdXJiOyBpKyspIHsKKwkJc3RydWN0IHVyYiAqdXJiID0gZGV2LT5hZGV2LnVyYltpXTsKKwogCQlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJCXVzYl9raWxsX3VyYihkZXYtPmFkZXYudXJiW2ldKTsKKwkJCXVzYl9raWxsX3VyYih1cmIpOwogCQllbHNlCi0JCQl1c2JfdW5saW5rX3VyYihkZXYtPmFkZXYudXJiW2ldKTsKLQotCQl1c2JfZnJlZV91cmIoZGV2LT5hZGV2LnVyYltpXSk7Ci0JCWRldi0+YWRldi51cmJbaV0gPSBOVUxMOwotCi0JCWtmcmVlKGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbaV0pOwotCQlkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldID0gTlVMTDsKKwkJCXVzYl91bmxpbmtfdXJiKHVyYik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC05MSw2ICs5MCwxMiBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgICAqcnVudGltZTsKIAorCWlmIChkZXYtPmRpc2Nvbm5lY3RlZCkgeworCQlkcHJpbnRrKCJkZXZpY2UgZGlzY29ubmVjdGVkIHdoaWxlIHN0cmVhbWluZy4gVVJCIHN0YXR1cz0lZC5cbiIsIHVyYi0+c3RhdHVzKTsKKwkJYXRvbWljX3NldCgmZGV2LT5zdHJlYW1fc3RhcnRlZCwgMCk7CisJCXJldHVybjsKKwl9CisKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOiAgICAgICAgICAgICAvKiBzdWNjZXNzICovCiAJY2FzZSAtRVRJTUVET1VUOiAgICAvKiBOQUsgKi8KQEAgLTE1OCw2MyArMTYzLDI3IEBACiAJdXJiLT5zdGF0dXMgPSAwOwogCiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAoc3RhdHVzIDwgMCkgeworCWlmIChzdGF0dXMgPCAwKQogCQllbTI4eHhfZXJyZGV2KCJyZXN1Ym1pdCBvZiBhdWRpbyB1cmIgZmFpbGVkIChlcnJvcj0laSlcbiIsCiAJCQkgICAgICBzdGF0dXMpOwotCX0KIAlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgZW0yOHh4X2luaXRfYXVkaW9faXNvYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJaW50ICAgICAgIGksIGVyckNvZGU7Ci0JY29uc3QgaW50IHNiX3NpemUgPSBFTTI4WFhfTlVNX0FVRElPX1BBQ0tFVFMgKgotCQkJICAgIEVNMjhYWF9BVURJT19NQVhfUEFDS0VUX1NJWkU7CiAKIAlkcHJpbnRrKCJTdGFydGluZyBpc29jIHRyYW5zZmVyc1xuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgRU0yOFhYX0FVRElPX0JVRlM7IGkrKykgewotCQlzdHJ1Y3QgdXJiICp1cmI7Ci0JCWludCBqLCBrOworCS8qIFN0YXJ0IHN0cmVhbWluZyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZXYubnVtX3VyYjsgaSsrKSB7CisJCW1lbXNldChkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldLCAweDgwLAorCQkgICAgICAgZGV2LT5hZGV2LnVyYltpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CiAKLQkJZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltpXSA9IGttYWxsb2Moc2Jfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltpXSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1lbXNldChkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldLCAweDgwLCBzYl9zaXplKTsKLQkJdXJiID0gdXNiX2FsbG9jX3VyYihFTTI4WFhfTlVNX0FVRElPX1BBQ0tFVFMsIEdGUF9BVE9NSUMpOwotCQlpZiAoIXVyYikgewotCQkJZW0yOHh4X2VycmRldigidXNiX2FsbG9jX3VyYiBmYWlsZWQhXG4iKTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQl1c2JfZnJlZV91cmIoZGV2LT5hZGV2LnVyYltqXSk7Ci0JCQkJa2ZyZWUoZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltqXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCXVyYi0+ZGV2ID0gZGV2LT51ZGV2OwotCQl1cmItPmNvbnRleHQgPSBkZXY7Ci0JCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkZXYtPnVkZXYsIEVNMjhYWF9FUF9BVURJTyk7Ci0JCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7Ci0JCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltpXTsKLQkJdXJiLT5pbnRlcnZhbCA9IDE7Ci0JCXVyYi0+Y29tcGxldGUgPSBlbTI4eHhfYXVkaW9faXNvY2lycTsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEVNMjhYWF9OVU1fQVVESU9fUEFDS0VUUzsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2Jfc2l6ZTsKLQotCQlmb3IgKGogPSBrID0gMDsgaiA8IEVNMjhYWF9OVU1fQVVESU9fUEFDS0VUUzsKLQkJCSAgICAgaisrLCBrICs9IEVNMjhYWF9BVURJT19NQVhfUEFDS0VUX1NJWkUpIHsKLQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gazsKLQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0KLQkJCSAgICBFTTI4WFhfQVVESU9fTUFYX1BBQ0tFVF9TSVpFOwotCQl9Ci0JCWRldi0+YWRldi51cmJbaV0gPSB1cmI7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEVNMjhYWF9BVURJT19CVUZTOyBpKyspIHsKIAkJZXJyQ29kZSA9IHVzYl9zdWJtaXRfdXJiKGRldi0+YWRldi51cmJbaV0sIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyQ29kZSkgewotCQkJZW0yOHh4X2VycmRldigic3VibWl0IG9mIGF1ZGlvIHVyYiBmYWlsZWRcbiIpOworCQkJZW0yOHh4X2VycmRldigic3VibWl0IG9mIGF1ZGlvIHVyYiBmYWlsZWQgKGVycm9yPSVpKVxuIiwKKwkJCQkgICAgICBlcnJDb2RlKTsKIAkJCWVtMjh4eF9kZWluaXRfaXNvY19hdWRpbyhkZXYpOwogCQkJYXRvbWljX3NldCgmZGV2LT5zdHJlYW1fc3RhcnRlZCwgMCk7CiAJCQlyZXR1cm4gZXJyQ29kZTsKQEAgLTI1NSwxNSArMjI0LDI2IEBACiAKIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCi0JLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFX0tOT1QsCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCiAKIAkucmF0ZV9taW4gPSA0ODAwMCwKIAkucmF0ZV9tYXggPSA0ODAwMCwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKIAkuYnVmZmVyX2J5dGVzX21heCA9IDYyNzIwICogOCwJLyoganVzdCBhYm91dCB0aGUgdmFsdWUgaW4gdXNiYXVkaW8uYyAqLwotCS5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCQkvKiAxMjU0NC8yLCAqLwotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gMTI1NDQsCisKKworCS8qCisJICogVGhlIHBlcmlvZCBpcyAxMi4yODggYnl0ZXMuIEFsbG93IGEgMTAlIG9mIHZhcmlhdGlvbiBhbG9uZyBpdHMKKwkgKiB2YWx1ZSwgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcnJ1bnMvdW5kZXJydW5zIGR1ZSB0byBzb21lIGNsb2NrCisJICogZHJpZnQuCisJICoKKwkgKiBGSVhNRTogVGhpcyBwZXJpb2QgYXNzdW1lcyA2NCBwYWNrZXRzLCBhbmQgYSA0ODAwMCBQQ00gcmF0ZS4KKwkgKiBDYWxjdWxhdGUgaXQgZHluYW1pY2FsbHkuCisJICovCisJLnBlcmlvZF9ieXRlc19taW4gPSAxMTA1OSwKKwkucGVyaW9kX2J5dGVzX21heCA9IDEzNTE2LAorCiAJLnBlcmlvZHNfbWluID0gMiwKIAkucGVyaW9kc19tYXggPSA5OCwJCS8qIDEyNTQ0LCAqLwogfTsKQEAgLTI3NCwyOCArMjU0LDQ4IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgcmV0ID0gMDsKIAotCWRwcmludGsoIm9wZW5pbmcgZGV2aWNlIGFuZCB0cnlpbmcgdG8gYWNxdWlyZSBleGNsdXNpdmUgbG9ja1xuIik7Ci0KIAlpZiAoIWRldikgewogCQllbTI4eHhfZXJyKCJCVUc6IGVtMjh4eCBjYW4ndCBmaW5kIGRldmljZSBzdHJ1Y3QuIgogCQkJCSIgQ2FuJ3QgcHJvY2VlZCB3aXRoIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAoZGV2LT5kaXNjb25uZWN0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJZHByaW50aygib3BlbmluZyBkZXZpY2UgYW5kIHRyeWluZyB0byBhY3F1aXJlIGV4Y2x1c2l2ZSBsb2NrXG4iKTsKKwogCXJ1bnRpbWUtPmh3ID0gc25kX2VtMjh4eF9od19jYXB0dXJlOwotCWlmICgoZGV2LT5hbHQgPT0gMCB8fCBkZXYtPmF1ZGlvX2lmbnVtKSAmJiBkZXYtPmFkZXYudXNlcnMgPT0gMCkgewotCQlpZiAoZGV2LT5hdWRpb19pZm51bSkKKwlpZiAoKGRldi0+YWx0ID09IDAgfHwgZGV2LT5pc19hdWRpb19vbmx5KSAmJiBkZXYtPmFkZXYudXNlcnMgPT0gMCkgeworCQlpbnQgbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCQlpZiAobm9uYmxvY2spIHsKKwkJCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5sb2NrKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlCisJCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCQlpZiAoZGV2LT5pc19hdWRpb19vbmx5KQorCQkJLyogdmVuZG9yIGF1ZGlvIGlzIG9uIGEgc2VwYXJhdGUgaW50ZXJmYWNlICovCiAJCQlkZXYtPmFsdCA9IDE7CiAJCWVsc2UKKwkJCS8qIHZlbmRvciBhdWRpbyBpcyBvbiB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdmlkZW8gKi8KIAkJCWRldi0+YWx0ID0gNzsKKwkJCS8qCisJCQkgKiBGSVhNRTogVGhlIGludGVudGlvbiBzZWVtcyB0byBiZSB0byBzZWxlY3QgdGhlIGFsdAorCQkJICogc2V0dGluZyB3aXRoIHRoZSBsYXJnZXN0IHdNYXhQYWNrZXRTaXplIGZvciB0aGUgdmlkZW8KKwkJCSAqIGVuZHBvaW50LgorCQkJICogQXQgbGVhc3QgZGV2LT5hbHQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCwgYnV0IHdlCisJCQkgKiBzaG91bGQgcHJvYmFibHkgbm90IHRvdWNoIGl0IGF0IGFsbCBpZiBpdCBpcworCQkJICogYWxyZWFkeSA+MCwgYmVjYXVzZSB3TWF4UGFja2V0U2l6ZSBvZiB0aGUgYXVkaW8KKwkJCSAqIGVuZHBvaW50cyBzZWVtcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsLgorCQkJICovCiAKIAkJZHByaW50aygiY2hhbmdpbmcgYWx0ZXJuYXRlIG51bWJlciBvbiBpbnRlcmZhY2UgJWQgdG8gJWRcbiIsCi0JCQlkZXYtPmF1ZGlvX2lmbnVtLCBkZXYtPmFsdCk7Ci0JCXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgZGV2LT5hdWRpb19pZm51bSwgZGV2LT5hbHQpOworCQkJZGV2LT5pZm51bSwgZGV2LT5hbHQpOworCQl1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGRldi0+aWZudW0sIGRldi0+YWx0KTsKIAogCQkvKiBTZXRzIHZvbHVtZSwgbXV0ZSwgZXRjICovCiAJCWRldi0+bXV0ZSA9IDA7Ci0JCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJCXJldCA9IGVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnI7CkBAIC0zMDQsNyArMzA0LDEyIEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAl9CiAKKwkvKiBEeW5hbWljYWxseSBhZGp1c3QgdGhlIHBlcmlvZCBzaXplICovCiAJc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKKwkJCQkgICAgIGRldi0+YWRldi5wZXJpb2QgKiA5NSAvIDEwMCwKKwkJCQkgICAgIGRldi0+YWRldi5wZXJpb2QgKiAxMDUgLyAxMDApOworCiAJZGV2LT5hZGV2LmNhcHR1cmVfcGNtX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAogCXJldHVybiAwOwpAQCAtMzQ0LDYgKzM0OSwxMCBAQAogCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChkZXYtPmRpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlkcHJpbnRrKCJTZXR0aW5nIGNhcHR1cmUgcGFyYW1ldGVyc1xuIik7CiAKQEAgLTM4Myw2ICszOTIsOSBAQAogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAorCWlmIChkZXYtPmRpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlkZXYtPmFkZXYuaHdwdHJfZG9uZV9jYXB0dXJlID0gMDsKIAlkZXYtPmFkZXYuY2FwdHVyZV90cmFuc2Zlcl9kb25lID0gMDsKIApAQCAtNDA4LDYgKzQyMCw5IEBACiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCWludCByZXR2YWwgPSAwOwogCisJaWYgKGRldi0+ZGlzY29ubmVjdGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOiAvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRTogLyogZmFsbCB0aHJvdWdoICovCkBAIC00MzQsNiArNDQ5LDkgQEAKIAlzbmRfcGNtX3VmcmFtZXNfdCBod3B0cl9kb25lOwogCiAJZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWlmIChkZXYtPmRpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmFkZXYuc2xvY2ssIGZsYWdzKTsKIAlod3B0cl9kb25lID0gZGV2LT5hZGV2Lmh3cHRyX2RvbmVfY2FwdHVyZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmFkZXYuc2xvY2ssIGZsYWdzKTsKQEAgLTQ1NSw2ICs0NzMsMTEgQEAKIHN0YXRpYyBpbnQgZW0yOHh4X3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAoZGV2LT5kaXNjb25uZWN0ZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKIAlpbmZvLT5jb3VudCA9IDI7CiAJaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwpAQCAtNDY3LDExICs0OTAsMjIgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXYtPmFkZXYuY2FwdHVyZV9wY21fc3Vic3RyZWFtOwogCXUxNiB2YWwgPSAoMHgxZiAtICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4MWYpKSB8CiAJCSAgKDB4MWYgLSAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiAweDFmKSkgPDwgODsKKwlpbnQgbm9uYmxvY2sgPSAwOwogCWludCByYzsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJaWYgKGRldi0+ZGlzY29ubmVjdGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzdWJzdHJlYW0pCisJCW5vbmJsb2NrID0gISEoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaWYgKG5vbmJsb2NrKSB7CisJCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5sb2NrKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZQorCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCXJjID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGVycjsKQEAgLTQ5Niw5ICs1MzAsMjAgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXYtPmFkZXYuY2FwdHVyZV9wY21fc3Vic3RyZWFtOworCWludCBub25ibG9jayA9IDA7CiAJaW50IHZhbDsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJaWYgKGRldi0+ZGlzY29ubmVjdGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzdWJzdHJlYW0pCisJCW5vbmJsb2NrID0gISEoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaWYgKG5vbmJsb2NrKSB7CisJCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5sb2NrKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZQorCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCXZhbCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCWlmICh2YWwgPCAwKQpAQCAtNTIwLDkgKzU2NSwyMCBAQAogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1MTYgdmFsID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXYtPmFkZXYuY2FwdHVyZV9wY21fc3Vic3RyZWFtOworCWludCBub25ibG9jayA9IDA7CiAJaW50IHJjOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5kaXNjb25uZWN0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHN1YnN0cmVhbSkKKwkJbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpZiAobm9uYmxvY2spIHsKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPmxvY2spKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlCisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJcmMgPSBlbTI4eHhfcmVhZF9hYzk3KGRldiwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZXJyOwpAQCAtNTUwLDkgKzYwNiwyMCBAQAogCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldi0+YWRldi5jYXB0dXJlX3BjbV9zdWJzdHJlYW07CisJaW50IG5vbmJsb2NrID0gMDsKIAlpbnQgdmFsOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5kaXNjb25uZWN0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHN1YnN0cmVhbSkKKwkJbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpZiAobm9uYmxvY2spIHsKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPmxvY2spKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlCisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJdmFsID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJaWYgKHZhbCA8IDApCkBAIC02MzQsMjUgKzcwMSwyMDQgQEAKIAkucGFnZSAgICAgID0gc25kX3BjbV9nZXRfdm1hbGxvY19wYWdlLAogfTsKIAorc3RhdGljIHZvaWQgZW0yOHh4X2F1ZGlvX2ZyZWVfdXJiKHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZXYubnVtX3VyYjsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IGRldi0+YWRldi51cmJbaV07CisKKwkJaWYgKCF1cmIpCisJCQljb250aW51ZTsKKworCQl1c2JfZnJlZV9jb2hlcmVudChkZXYtPnVkZXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkgIGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbaV0sCisJCQkJICB1cmItPnRyYW5zZmVyX2RtYSk7CisKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJfQorCWtmcmVlKGRldi0+YWRldi51cmIpOworCWtmcmVlKGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXIpOworCWRldi0+YWRldi5udW1fdXJiID0gMDsKK30KKworLyogaGlnaCBiYW5kd2lkdGggbXVsdGlwbGllciwgYXMgZW5jb2RlZCBpbiBoaWdoc3BlZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyBpbnQgZW0yOHh4X2F1ZGlvX2VwX3BhY2tldF9zaXplKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmUpCit7CisJaW50IHNpemUgPSBsZTE2X3RvX2NwdShlLT53TWF4UGFja2V0U2l6ZSk7CisKKwlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXJldHVybiAoc2l6ZSAmIDB4N2ZmKSAqICAoMSArICgoKHNpemUpID4+IDExKSAmIDB4MDMpKTsKKworCXJldHVybiBzaXplICYgMHg3ZmY7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X2F1ZGlvX3VyYl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmUsICplcCA9IE5VTEw7CisJaW50ICAgICAgICAgICAgICAgICBpLCBlcF9zaXplLCBpbnRlcnZhbCwgbnVtX3VyYiwgbnBhY2tldHM7CisJaW50CQkgICAgdXJiX3NpemUsIGJ5dGVzX3Blcl90cmFuc2ZlcjsKKwl1OCBhbHQ7CisKKwlpZiAoZGV2LT5pZm51bSkKKwkJYWx0ID0gMTsKKwllbHNlCisJCWFsdCA9IDc7CisKKwlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGRldi0+dWRldiwgZGV2LT5pZm51bSk7CisKKwlpZiAoaW50Zi0+bnVtX2FsdHNldHRpbmcgPD0gYWx0KSB7CisJCWVtMjh4eF9lcnJkZXYoImFsdCAlZCBkb2Vzbid0IGV4aXN0IG9uIGludGVyZmFjZSAlZFxuIiwKKwkJCSAgICAgIGRldi0+aWZudW0sIGFsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5hbHRzZXR0aW5nW2FsdF0uZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJZSA9ICZpbnRmLT5hbHRzZXR0aW5nW2FsdF0uZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKGUpKQorCQkJY29udGludWU7CisJCWlmIChlLT5iRW5kcG9pbnRBZGRyZXNzID09IEVNMjhYWF9FUF9BVURJTykgeworCQkJZXAgPSBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVwKSB7CisJCWVtMjh4eF9lcnJkZXYoIkNvdWxkbid0IGZpbmQgYW4gYXVkaW8gZW5kcG9pbnQiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXBfc2l6ZSA9IGVtMjh4eF9hdWRpb19lcF9wYWNrZXRfc2l6ZShkZXYtPnVkZXYsIGVwKTsKKwlpbnRlcnZhbCA9IDEgPDwgKGVwLT5iSW50ZXJ2YWwgLSAxKTsKKworCWVtMjh4eF9pbmZvKCJFbmRwb2ludCAweCUwMnggJXMgb24gaW50ZiAlZCBhbHQgJWQgaW50ZXJ2YWwgPSAlZCwgc2l6ZSAlZFxuIiwKKwkJICAgICBFTTI4WFhfRVBfQVVESU8sIHVzYl9zcGVlZF9zdHJpbmcoZGV2LT51ZGV2LT5zcGVlZCksCisJCSAgICAgZGV2LT5pZm51bSwgYWx0LAorCQkgICAgIGludGVydmFsLAorCQkgICAgIGVwX3NpemUpOworCisJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgYW5kIHNpemUgb2YgVVJCcyB0byBiZXR0ZXIgZml0IHRoZSBhdWRpbyBzYW1wbGVzICovCisKKwkvKgorCSAqIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIERNQSB0cmFuc2Zlci4KKwkgKgorCSAqIFRoaXMgaXMgZ2l2ZW4gYnkgdGhlIGJpdCByYXRlIChmb3Igbm93LCBvbmx5IDQ4MDAwIEh6KSBtdWx0aXBsaWVkCisJICogYnkgMiBjaGFubmVscyBhbmQgMiBieXRlcy9zYW1wbGUgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIG1pY3JvZnJhbWUKKwkgKiBpbnRlcnZhbHMgYW5kIGJ5IHRoZSBtaWNyb2ZyYW1lIHJhdGUgKDEyNSB1cykKKwkgKi8KKwlieXRlc19wZXJfdHJhbnNmZXIgPSBESVZfUk9VTkRfVVAoNDgwMDAgKiAyICogMiwgMTI1ICogaW50ZXJ2YWwpOworCisJLyoKKwkgKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHRyYW5zZmVyIFVSQnMuIERvbid0IGxldCBpdCBnbyBwYXN0IHRoZQorCSAqIG1heGltdW0gbnVtYmVyIG9mIFVSQnMgdGhhdCBpcyBrbm93biB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KKwkgKi8KKwludW1fdXJiID0gRElWX1JPVU5EX1VQKGJ5dGVzX3Blcl90cmFuc2ZlciwgZXBfc2l6ZSk7CisJaWYgKG51bV91cmIgPiBFTTI4WFhfTUFYX0FVRElPX0JVRlMpCisJCW51bV91cmIgPSBFTTI4WFhfTUFYX0FVRElPX0JVRlM7CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlIGtub3cgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgdHJhbnNmZXIgYW5kIHRoZSBudW1iZXIgb2YKKwkgKiBVUkJzLCBlc3RpbWF0ZSB0aGUgdHlwaWNhbCBzaXplIG9mIGFuIFVSQiwgaW4gb3JkZXIgdG8gYWRqdXN0IHRoZQorCSAqIG1pbmltYWwgbnVtYmVyIG9mIHBhY2tldHMuCisJICovCisJdXJiX3NpemUgPSBieXRlc19wZXJfdHJhbnNmZXIgLyBudW1fdXJiOworCisJLyoKKwkgKiBOb3csIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGF1ZGlvIHBhY2tldHMgdG8gYmUgZmlsbGVkIG9uIGVhY2gKKwkgKiBVUkIuIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBvbGQgYmVoYXZpb3VyLCB1c2UgYSBtaW5pbWFsCisJICogdGhyZXNob2xkIGZvciB0aGlzIHZhbHVlLgorCSAqLworCW5wYWNrZXRzID0gRU0yOFhYX01JTl9BVURJT19QQUNLRVRTOworCWlmICh1cmJfc2l6ZSA+IGVwX3NpemUgKiBucGFja2V0cykKKwkJbnBhY2tldHMgPSBESVZfUk9VTkRfVVAodXJiX3NpemUsIGVwX3NpemUpOworCisJZW0yOHh4X2luZm8oIk51bWJlciBvZiBVUkJzOiAlZCwgd2l0aCAlZCBwYWNrZXRzIGFuZCAlZCBzaXplIiwKKwkJICAgIG51bV91cmIsIG5wYWNrZXRzLCB1cmJfc2l6ZSk7CisKKwkvKiBFc3RpbWF0ZSB0aGUgYnl0ZXMgcGVyIHBlcmlvZCAqLworCWRldi0+YWRldi5wZXJpb2QgPSB1cmJfc2l6ZSAqIG5wYWNrZXRzOworCisJLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBVUkJzIHRvIGJlIHVzZWQgKi8KKworCWRldi0+YWRldi50cmFuc2Zlcl9idWZmZXIgPSBrY2FsbG9jKG51bV91cmIsCisJCQkJCSAgICBzaXplb2YoKmRldi0+YWRldi50cmFuc2Zlcl9idWZmZXIpLAorCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJaWYgKCFkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+YWRldi51cmIgPSBrY2FsbG9jKG51bV91cmIsIHNpemVvZigqZGV2LT5hZGV2LnVyYiksIEdGUF9BVE9NSUMpOworCWlmICghZGV2LT5hZGV2LnVyYikgeworCQlrZnJlZShkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQWxsb2MgbWVtb3J5IGZvciBlYWNoIFVSQiBhbmQgZm9yIGVhY2ggdHJhbnNmZXIgYnVmZmVyICovCisJZGV2LT5hZGV2Lm51bV91cmIgPSBudW1fdXJiOworCWZvciAoaSA9IDA7IGkgPCBudW1fdXJiOyBpKyspIHsKKwkJc3RydWN0IHVyYiAqdXJiOworCQlpbnQgaiwgazsKKwkJdm9pZCAqYnVmOworCisJCXVyYiA9IHVzYl9hbGxvY191cmIobnBhY2tldHMsIEdGUF9BVE9NSUMpOworCQlpZiAoIXVyYikgeworCQkJZW0yOHh4X2VycmRldigidXNiX2FsbG9jX3VyYiBmYWlsZWQhXG4iKTsKKwkJCWVtMjh4eF9hdWRpb19mcmVlX3VyYihkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZGV2LT5hZGV2LnVyYltpXSA9IHVyYjsKKworCQlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBucGFja2V0cyAqIGVwX3NpemUsIEdGUF9BVE9NSUMsCisJCQkJCSAmdXJiLT50cmFuc2Zlcl9kbWEpOworCQlpZiAoIWJ1ZikgeworCQkJZW0yOHh4X2VycmRldigidXNiX2FsbG9jX2NvaGVyZW50IGZhaWxlZCFcbiIpOworCQkJZW0yOHh4X2F1ZGlvX2ZyZWVfdXJiKGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldID0gYnVmOworCisJCXVyYi0+ZGV2ID0gZGV2LT51ZGV2OworCQl1cmItPmNvbnRleHQgPSBkZXY7CisJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkZXYtPnVkZXYsIEVNMjhYWF9FUF9BVURJTyk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBidWY7CisJCXVyYi0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKKwkJdXJiLT5jb21wbGV0ZSA9IGVtMjh4eF9hdWRpb19pc29jaXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gbnBhY2tldHM7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGVwX3NpemUgKiBucGFja2V0czsKKworCQlmb3IgKGogPSBrID0gMDsgaiA8IG5wYWNrZXRzOyBqKyssIGsgKz0gZXBfc2l6ZSkgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBrOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBlcF9zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZW0yOHh4X2F1ZGlvX2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KQogewogCXN0cnVjdCBlbTI4eHhfYXVkaW8gKmFkZXYgPSAmZGV2LT5hZGV2OwogCXN0cnVjdCBzbmRfcGNtICAgICAgKnBjbTsKIAlzdHJ1Y3Qgc25kX2NhcmQgICAgICpjYXJkOwogCXN0YXRpYyBpbnQgICAgICAgICAgZGV2bnI7Ci0JaW50ICAgICAgICAgICAgICAgICBlcnI7CisJaW50CQkgICAgZXJyOwogCi0JaWYgKCFkZXYtPmhhc19hbHNhX2F1ZGlvIHx8IGRldi0+YXVkaW9faWZudW0gPCAwKSB7CisJaWYgKCFkZXYtPmhhc19hbHNhX2F1ZGlvKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAoaW4gdGhpcyBjYXNlCiAJCSAgIHRoZSBkZXZpY2UgaXMgZXhwZWN0aW5nIHRoZSBzbmQtdXNiLWF1ZGlvIG1vZHVsZSBvcgogCQkgICBkb2Vzbid0IGhhdmUgYW5hbG9nIGF1ZGlvIHN1cHBvcnQgYXQgYWxsKSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogcHJvYmluZyBmb3IgZW0yOHh4IEF1ZGlvIFZlbmRvciBDbGFzc1xuIik7CisJZW0yOHh4X2luZm8oIkJpbmRpbmcgYXVkaW8gZXh0ZW5zaW9uXG4iKTsKKwogCXByaW50ayhLRVJOX0lORk8gImVtMjh4eC1hdWRpby5jOiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFya3VzICIKIAkJCSAiUmVjaGJlcmdlclxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNy0yMDExIE1hdXJvIENhcnZhbGhvIENoZWhhYlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNy0yMDE0IE1hdXJvIENhcnZhbGhvIENoZWhhYlxuIik7CiAKIAllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAiRW0yOHh4IEF1ZGlvIiwgVEhJU19NT0RVTEUsIDAsCiAJCQkgICAgICAmY2FyZCk7CkBAIC02NjAsMTEgKzkwNiwxMiBAQAogCQlyZXR1cm4gZXJyOwogCiAJc3Bpbl9sb2NrX2luaXQoJmFkZXYtPnNsb2NrKTsKKwlhZGV2LT5zbmRjYXJkID0gY2FyZDsKKwlhZGV2LT51ZGV2ID0gZGV2LT51ZGV2OworCiAJZXJyID0gc25kX3BjbV9uZXcoY2FyZCwgIkVtMjh4eCBBdWRpbyIsIDAsIDAsIDEsICZwY20pOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWlmIChlcnIgPCAwKQorCQlnb3RvIGNhcmRfZnJlZTsKIAogCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9lbTI4eHhfcGNtX2NhcHR1cmUpOwogCXBjbS0+aW5mb19mbGFncyA9IDA7CkBAIC02OTQsMTUgKzk0MSwyNSBAQAogCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiU3Vycm91bmQiLCBBQzk3X1NVUlJPVU5EX01BU1RFUik7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JYWRldi0+c25kY2FyZCA9IGNhcmQ7Ci0JYWRldi0+dWRldiA9IGRldi0+dWRldjsKKwllcnIgPSBlbTI4eHhfYXVkaW9fdXJiX2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGNhcmRfZnJlZTsKIAorCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVyYl9mcmVlOworCisJZW0yOHh4X2luZm8oIkF1ZGlvIGV4dGVuc2lvbiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWRcbiIpOwogCXJldHVybiAwOworCit1cmJfZnJlZToKKwllbTI4eHhfYXVkaW9fZnJlZV91cmIoZGV2KTsKKworY2FyZF9mcmVlOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJYWRldi0+c25kY2FyZCA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGVtMjh4eF9hdWRpb19maW5pKHN0cnVjdCBlbTI4eHggKmRldikKQEAgLTcxNyw3ICs5NzQsMTQgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJZW0yOHh4X2luZm8oIkNsb3NpbmcgYXVkaW8gZXh0ZW5zaW9uIik7CisKIAlpZiAoZGV2LT5hZGV2LnNuZGNhcmQpIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChkZXYtPmFkZXYuc25kY2FyZCk7CisJCWZsdXNoX3dvcmsoJmRldi0+d3FfdHJpZ2dlcik7CisKKwkJZW0yOHh4X2F1ZGlvX2ZyZWVfdXJiKGRldik7CisKIAkJc25kX2NhcmRfZnJlZShkZXYtPmFkZXYuc25kY2FyZCk7CiAJCWRldi0+YWRldi5zbmRjYXJkID0gTlVMTDsKIAl9CkBAIC03NDUsNyArMTAwOSw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkVtMjh4eCBBdWRpbyBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyAiIC0gYXVkaW8gaW50ZXJmYWNlIik7CitNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CiAKIG1vZHVsZV9pbml0KGVtMjh4eF9hbHNhX3JlZ2lzdGVyKTsKIG1vZHVsZV9leGl0KGVtMjh4eF9hbHNhX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY2FtZXJhLmMKaW5kZXggZDY2Njc0MS4uYzI5ZjVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNhbWVyYS5jCkBAIC00NTQsMyArNDU0LDQgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfaW5pdF9jYW1lcmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jYXJkcy5jCmluZGV4IGE1MTk2NjkuLjRkOTdhNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxtZWRpYS90dmF1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvaTJjLWFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS90dmVlcHJvbS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2xrLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2luY2x1ZGUgImVtMjh4eC5oIgpAQCAtNjcsNyArNjYsNyBAQAogCiAKIC8qIEJpdG1hc2sgbWFya2luZyBhbGxvY2F0ZWQgZGV2aWNlcyBmcm9tIDAgdG8gRU0yOFhYX01BWEJPQVJEUyAtIDEgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVtMjh4eF9kZXZ1c2VkOworREVDTEFSRV9CSVRNQVAoZW0yOHh4X2RldnVzZWQsIEVNMjhYWF9NQVhCT0FSRFMpOwogCiBzdHJ1Y3QgZW0yOHh4X2hhc2hfdGFibGUgewogCXVuc2lnbmVkIGxvbmcgaGFzaDsKQEAgLTM1Niw2ICszNTUsMjggQEAKIAl7CS0xLAkJCS0xLAktMSwJLTF9LAogfTsKIAorLyoKKyAqIDIwMTM6MDI1OCBQQ1RWIERWQi1TMiBTdGljayAoNDYxZSkKKyAqIEdQSU8gMCA9IFBPV0VSX09OCisgKiBHUElPIDEgPSBCT09TVAorICogR1BJTyAyID0gVlVWX0xOQiAocmVkIExFRCkKKyAqIEdQSU8gMyA9ICNFWFRfMTJWCisgKiBHUElPIDQgPSBJTlRfREVNCisgKiBHUElPIDUgPSBJTlRfTE5CCisgKiBHUElPIDYgPSAjUkVTRVRfREVNCisgKiBHUElPIDcgPSBQMDdfTEVEIChncmVlbiBMRUQpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgcGN0dl80NjFlW10gPSB7CisJe0VNMjg3NF9SODBfR1BJT19QMF9DVFJMLCAgICAgIDB4N2YsIDB4ZmYsICAgIDB9LAorCXsweDBkLCAgICAgICAgICAgICAgICAgMHhmZiwgMHhmZiwgICAgMH0sCisJe0VNMjg3NF9SODBfR1BJT19QMF9DVFJMLCAgICAgIDB4M2YsIDB4ZmYsICAxMDB9LCAvKiByZXNldCBkZW1vZCAqLworCXtFTTI4NzRfUjgwX0dQSU9fUDBfQ1RSTCwgICAgICAweDdmLCAweGZmLCAgMjAwfSwgLyogcmVzZXQgZGVtb2QgKi8KKwl7MHgwZCwgICAgICAgICAgICAgICAgIDB4NDIsIDB4ZmYsICAgIDB9LAorCXtFTTI4NzRfUjgwX0dQSU9fUDBfQ1RSTCwgICAgICAweGViLCAweGZmLCAgICAwfSwKKwl7RU0yODc0X1I1Rl9UU19FTkFCTEUsIDB4ODQsIDB4ODQsICAgIDB9LCAvKiBwYXJhbGxlbD8gfCBudWxsIGRpc2NhcmQgKi8KKwl7ICAgICAgICAgICAgICAgICAgLTEsICAgLTEsICAgLTEsICAgLTF9LAorfTsKKwogI2lmIDAKIHN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgaGF1cHBhdWdlXzkzMGNfZ3Bpb1tdID0gewogCXtFTTI4NzRfUjgwX0dQSU9fUDBfQ1RSTCwJMHg2ZiwJMHhmZiwJMTB9LApAQCAtNDEyLDYgKzQzMyw3MCBAQAogCXsJLTEsCQkJLTEsCS0xLAktMX0sCiB9OwogCisvKiAxYWU3OjkwMDMvOTAwNCBTcGVlZExpbmsgVmljaW91cyBBbmQgRGV2aW5lIExhcGxhY2Ugd2ViY2FtCisgKiByZWcgMHg4MC8weDg0OgorICogR1BJT18wOiBjYXB0dXJpbmcgTEVELCAwPW9uLCAxPW9mZgorICogR1BJT18yOiBBViBtdXRlIGJ1dHRvbiwgMD1wcmVzc2VkLCAxPXVucHJlc3NlZAorICogR1BJTyAzOiBpbGx1bWluYXRpb24gYnV0dG9uLCAwPXByZXNzZWQsIDE9dW5wcmVzc2VkCisgKiBHUElPXzY6IGlsbHVtaW5hdGlvbi9mbGFzaCBMRUQsIDA9b24sIDE9b2ZmCisgKiByZWcgMHg4MS8weDg1OgorICogR1BJT183OiBzbmFwc2hvdCBidXR0b24sIDA9cHJlc3NlZCwgMT11bnByZXNzZWQKKyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBzcGVlZGxpbmtfdmFkX2xhcGxhY2VfcmVnX3NlcVtdID0geworCXtFTTI4MjBfUjA4X0dQSU9fQ1RSTCwJCTB4ZjcsCTB4ZmYsCTEwfSwKKwl7RU0yODc0X1I4MF9HUElPX1AwX0NUUkwsCTB4ZmYsCTB4YjIsCTEwfSwKKwl7CS0xLAkJCS0xLAktMSwJLTF9LAorfTsKKworLyoKKyAqICBCdXR0b24gZGVmaW5pdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfYnV0dG9uIHN0ZF9zbmFwc2hvdF9idXR0b25bXSA9IHsKKwl7CisJCS5yb2xlICAgICAgICAgPSBFTTI4WFhfQlVUVE9OX1NOQVBTSE9ULAorCQkucmVnX3IgICAgICAgID0gRU0yOFhYX1IwQ19VU0JTVVNQLAorCQkucmVnX2NsZWFyaW5nID0gRU0yOFhYX1IwQ19VU0JTVVNQLAorCQkubWFzayAgICAgICAgID0gRU0yOFhYX1IwQ19VU0JTVVNQX1NOQVBTSE9ULAorCQkuaW52ZXJ0ZWQgICAgID0gMCwKKwl9LAorCXstMSwgMCwgMCwgMCwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGVtMjh4eF9idXR0b24gc3BlZWRsaW5rX3ZhZF9sYXBsYWNlX2J1dHRvbnNbXSA9IHsKKwl7CisJCS5yb2xlICAgICA9IEVNMjhYWF9CVVRUT05fU05BUFNIT1QsCisJCS5yZWdfciAgICA9IEVNMjg3NF9SODVfR1BJT19QMV9TVEFURSwKKwkJLm1hc2sgICAgID0gMHg4MCwKKwkJLmludmVydGVkID0gMSwKKwl9LAorCXsKKwkJLnJvbGUgICAgID0gRU0yOFhYX0JVVFRPTl9JTExVTUlOQVRJT04sCisJCS5yZWdfciAgICA9IEVNMjg3NF9SODRfR1BJT19QMF9TVEFURSwKKwkJLm1hc2sgICAgID0gMHgwOCwKKwkJLmludmVydGVkID0gMSwKKwl9LAorCXstMSwgMCwgMCwgMCwgMH0sCit9OworCisvKgorICogIExFRCBkZWZpbml0aW9ucworICovCitzdGF0aWMgc3RydWN0IGVtMjh4eF9sZWQgc3BlZWRsaW5rX3ZhZF9sYXBsYWNlX2xlZHNbXSA9IHsKKwl7CisJCS5yb2xlICAgICAgPSBFTTI4WFhfTEVEX0FOQUxPR19DQVBUVVJJTkcsCisJCS5ncGlvX3JlZyAgPSBFTTI4NzRfUjgwX0dQSU9fUDBfQ1RSTCwKKwkJLmdwaW9fbWFzayA9IDB4MDEsCisJCS5pbnZlcnRlZCAgPSAxLAorCX0sCisJeworCQkucm9sZSAgICAgID0gRU0yOFhYX0xFRF9JTExVTUlOQVRJT04sCisJCS5ncGlvX3JlZyAgPSBFTTI4NzRfUjgwX0dQSU9fUDBfQ1RSTCwKKwkJLmdwaW9fbWFzayA9IDB4NDAsCisJCS5pbnZlcnRlZCAgPSAxLAorCX0sCisJey0xLCAwLCAwLCAwfSwKK307CisKIC8qCiAgKiAgQm9hcmQgZGVmaW5pdGlvbnMKICAqLwpAQCAtMTM5MSw3ICsxNDc2LDcgQEAKIAl9LAogCVtFTTI4MjBfQk9BUkRfUFJPTElOS19QTEFZVFZfVVNCMl0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiU0lJRyBBVlR1bmVyLVBWUiAvIFBpeGVsdmlldyBQcm9saW5rIFBsYXlUViBVU0IgMi4wIiwKLQkJLmhhc19zbmFwc2hvdF9idXR0b24gPSAxLAorCQkuYnV0dG9ucyA9IHN0ZF9zbmFwc2hvdF9idXR0b24sCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9ZTUVDX1RWRl81NTMzTUYsCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKQEAgLTE0MTMsNyArMTQ5OCw3IEBACiAJfSwKIAlbRU0yODYwX0JPQVJEX1NBQTcxMVhfUkVGRVJFTkNFX0RFU0lHTl0gPSB7CiAJCS5uYW1lICAgICAgICAgICAgICAgID0gIkVNMjg2MC9TQUE3MTFYIFJlZmVyZW5jZSBEZXNpZ24iLAotCQkuaGFzX3NuYXBzaG90X2J1dHRvbiA9IDEsCisJCS5idXR0b25zID0gc3RkX3NuYXBzaG90X2J1dHRvbiwKIAkJLnR1bmVyX3R5cGUgICAgICAgICAgPSBUVU5FUl9BQlNFTlQsCiAJCS5kZWNvZGVyICAgICAgICAgICAgID0gRU0yOFhYX1NBQTcxMVgsCiAJCS5pbnB1dCAgICAgICAgICAgICAgID0geyB7CkBAIC0yMDIwLDcgKzIxMDUsNyBAQAogCX0sCiAJLyogMWI4MDplMWNjIERlbG9jayA2MTk1OQogCSAqIEVtcGlhIEVNMjg3NEIgKyBNaWNyb25hcyBEUlggMzkxM0tBMiArIE5YUCBUREExODI3MUhEQzIKLSAgICAgICAgICogbW9zdGx5IHRoZSBzYW1lIGFzIE1heE1lZGlhIFVCLTQyNS1UQyBidXQgZGlmZmVyZW50IHJlbW90ZSAqLworCSAqIG1vc3RseSB0aGUgc2FtZSBhcyBNYXhNZWRpYSBVQi00MjUtVEMgYnV0IGRpZmZlcmVudCByZW1vdGUgKi8KIAlbRU0yODc0X0JPQVJEX0RFTE9DS182MTk1OV0gPSB7CiAJCS5uYW1lICAgICAgICAgID0gIkRlbG9jayA2MTk1OSIsCiAJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULApAQCAtMjA0Myw3ICsyMTI4LDM4IEBACiAJCS50dW5lcl9ncGlvCT0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkuZGVmX2kyY19idXMJPSAxLAogCX0sCisJLyogMWFlNzo5MDAzLzkwMDQgU3BlZWRMaW5rIFZpY2lvdXMgQW5kIERldmluZSBMYXBsYWNlIHdlYmNhbQorCSAqIEVtcGlhIEVNMjc2NSArIE9tbmlWaXNpb24gT1YyNjQwICovCisJW0VNMjc2NV9CT0FSRF9TUEVFRExJTktfVkFEX0xBUExBQ0VdID0geworCQkubmFtZSAgICAgICAgID0gIlNwZWVkTGluayBWaWNpb3VzIEFuZCBEZXZpbmUgTGFwbGFjZSB3ZWJjYW0iLAorCQkueGNsayAgICAgICAgID0gRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzI0TUhaLAorCQkuaTJjX3NwZWVkICAgID0gRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfAorCQkJCUVNMjhYWF9JMkNfRlJFUV8xMDBfS0haLAorCQkuZGVmX2kyY19idXMgID0gMSwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0FCU0VOVCwKKwkJLmlzX3dlYmNhbSAgICA9IDEsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IHNwZWVkbGlua192YWRfbGFwbGFjZV9yZWdfc2VxLAorCQl9IH0sCisJCS5idXR0b25zID0gc3BlZWRsaW5rX3ZhZF9sYXBsYWNlX2J1dHRvbnMsCisJCS5sZWRzID0gc3BlZWRsaW5rX3ZhZF9sYXBsYWNlX2xlZHMsCisJfSwKKwkvKiAyMDEzOjAyNTggUENUViBEVkItUzIgU3RpY2sgKDQ2MWUpCisJICogRW1waWEgRU0yODE3OCwgTW9udGFnZSBNODhEUzMxMDMsIE1vbnRhZ2UgTTg4VFMyMDIyLCBBbGxlZ3JvIEE4MjkzICovCisJW0VNMjgxNzhfQk9BUkRfUENUVl80NjFFXSA9IHsKKwkJLmRlZl9pMmNfYnVzICAgPSAxLAorCQkuaTJjX3NwZWVkICAgICA9IEVNMjhYWF9JMkNfQ0xLX1dBSVRfRU5BQkxFIHwgRU0yOFhYX0kyQ19GUkVRXzQwMF9LSFosCisJCS5uYW1lICAgICAgICAgID0gIlBDVFYgRFZCLVMyIFN0aWNrICg0NjFlKSIsCisJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULAorCQkudHVuZXJfZ3BpbyAgICA9IHBjdHZfNDYxZSwKKwkJLmhhc19kdmIgICAgICAgPSAxLAorCQkuaXJfY29kZXMgICAgICA9IFJDX01BUF9QSU5OQUNMRV9QQ1RWX0hELAorCX0sCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2JvYXJkcyk7CisKIGNvbnN0IHVuc2lnbmVkIGludCBlbTI4eHhfYmNvdW50ID0gQVJSQVlfU0laRShlbTI4eHhfYm9hcmRzKTsKIAogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwpAQCAtMjIwOCw2ICsyMzI0LDEyIEBACiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4ODRfQk9BUkRfUENUVl81MjBFIH0sCiAJeyBVU0JfREVWSUNFKDB4MWI4MCwgMHhlMWNjKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg3NF9CT0FSRF9ERUxPQ0tfNjE5NTkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxYWU3LCAweDkwMDMpLAorCQkJLmRyaXZlcl9pbmZvID0gRU0yNzY1X0JPQVJEX1NQRUVETElOS19WQURfTEFQTEFDRSB9LAorCXsgVVNCX0RFVklDRSgweDFhZTcsIDB4OTAwNCksCisJCQkuZHJpdmVyX2luZm8gPSBFTTI3NjVfQk9BUkRfU1BFRURMSU5LX1ZBRF9MQVBMQUNFIH0sCisJeyBVU0JfREVWSUNFKDB4MjAxMywgMHgwMjU4KSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjgxNzhfQk9BUkRfUENUVl80NjFFIH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBlbTI4eHhfaWRfdGFibGUpOwpAQCAtMjIzOSwyNCArMjM2MSw2IEBACiB9OwogLyogTk9URTogaW50cm9kdWNlIGEgc2VwYXJhdGUgaGFzaCB0YWJsZSBmb3IgZGV2aWNlcyB3aXRoIDE2IGJpdCBlZXByb21zICovCiAKLS8qIEkyQyBwb3NzaWJsZSBhZGRyZXNzIHRvIHNhYTcxMTUsIHR2cDUxNTAsIG1zcDM0MDAsIHR2YXVkaW8gKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzYWE3MTF4X2FkZHJzW10gPSB7Ci0JMHg0YSA+PiAxLCAweDQ4ID4+IDEsICAgLyogU0FBNzExMSwgU0FBNzExMUEgYW5kIFNBQTcxMTMgKi8KLQkweDQyID4+IDEsIDB4NDAgPj4gMSwgICAvKiBTQUE3MTE0LCBTQUE3MTE1IGFuZCBTQUE3MTE4ICovCi0JSTJDX0NMSUVOVF9FTkQgfTsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHR2cDUxNTBfYWRkcnNbXSA9IHsKLQkweGI4ID4+IDEsCi0JMHhiYSA+PiAxLAotCUkyQ19DTElFTlRfRU5ECi19OwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbXNwMzQwMF9hZGRyc1tdID0gewotCTB4ODAgPj4gMSwKLQkweDg4ID4+IDEsCi0JSTJDX0NMSUVOVF9FTkQKLX07Ci0KIGludCBlbTI4eHhfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZykKIHsKIAlzdHJ1Y3QgZW0yOHh4X2kyY19idXMgKmkyY19idXMgPSBwdHI7CkBAIC0yNDA4LDExMyArMjUxMiw2IEBACiAJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX1NVU1BFTkQpOwogfQogCi1zdGF0aWMgdm9pZCBlbTI4eHhfc2V0dXBfeGMzMDI4KHN0cnVjdCBlbTI4eHggKmRldiwgc3RydWN0IHhjMjAyOF9jdHJsICpjdGwpCi17Ci0JbWVtc2V0KGN0bCwgMCwgc2l6ZW9mKCpjdGwpKTsKLQotCWN0bC0+Zm5hbWUgICA9IFhDMjAyOF9ERUZBVUxUX0ZJUk1XQVJFOwotCWN0bC0+bWF4X2xlbiA9IDY0OwotCWN0bC0+bXRzID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5tdHNfZmlybXdhcmU7Ci0KLQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQljYXNlIEVNMjg4MF9CT0FSRF9FTVBJUkVfRFVBTF9UVjoKLQljYXNlIEVNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMDoKLQljYXNlIEVNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6Ci0JCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfWkFSTElOSzQ1NjsKLQkJYnJlYWs7Ci0JY2FzZSBFTTI4ODBfQk9BUkRfVEVSUkFURUNfSFlCUklEX1hTOgotCWNhc2UgRU0yODgwX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YU19GUjoKLQljYXNlIEVNMjg4MV9CT0FSRF9QSU5OQUNMRV9IWUJSSURfUFJPOgotCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX1pBUkxJTks0NTY7Ci0JCWJyZWFrOwotCWNhc2UgRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwX1IyOgotCWNhc2UgRU0yODgyX0JPQVJEX1BJTk5BQ0xFX0hZQlJJRF9QUk9fMzMwRToKLQkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9ERUZBVUxUOwotCQlicmVhazsKLQljYXNlIEVNMjg4MF9CT0FSRF9BTURfQVRJX1RWX1dPTkRFUl9IRF82MDA6Ci0JCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfREVGQVVMVDsKLQkJY3RsLT5mbmFtZSA9IFhDMzAyOExfREVGQVVMVF9GSVJNV0FSRTsKLQkJYnJlYWs7Ci0JY2FzZSBFTTI4ODNfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl84NTA6Ci0JY2FzZSBFTTI4ODNfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85NTA6Ci0JY2FzZSBFTTI4ODBfQk9BUkRfUElOTkFDTEVfUENUVl9IRF9QUk86Ci0JCS8qIEZJWE1FOiBCZXR0ZXIgdG8gc3BlY2lmeSB0aGUgbmVlZGVkIElGICovCi0JCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfREVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBFTTI4ODNfQk9BUkRfS1dPUkxEX0hZQlJJRF8zMzBVOgotCWNhc2UgRU0yODgyX0JPQVJEX0RJS09NX0RLMzAwOgotCWNhc2UgRU0yODgyX0JPQVJEX0tXT1JMRF9WU19EVkJUOgotCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX0NISU5BOwotCQljdGwtPmZuYW1lID0gWEMyMDI4X0RFRkFVTFRfRklSTVdBUkU7Ci0JCWJyZWFrOwotCWNhc2UgRU0yODgyX0JPQVJEX0VWR0FfSU5EVFVCRToKLQkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9DSElOQTsKLQkJY3RsLT5mbmFtZSA9IFhDMzAyOExfREVGQVVMVF9GSVJNV0FSRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9PUkVONTM4OwotCX0KLX0KLQotc3RhdGljIHZvaWQgZW0yOHh4X3R1bmVyX3NldHVwKHN0cnVjdCBlbTI4eHggKmRldikKLXsKLQlzdHJ1Y3QgdHVuZXJfc2V0dXAgICAgICAgICAgIHR1bl9zZXR1cDsKLQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgICAgICAgIGY7Ci0KLQlpZiAoZGV2LT50dW5lcl90eXBlID09IFRVTkVSX0FCU0VOVCkKLQkJcmV0dXJuOwotCi0JbWVtc2V0KCZ0dW5fc2V0dXAsIDAsIHNpemVvZih0dW5fc2V0dXApKTsKLQotCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87Ci0JdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gZW0yOHh4X3R1bmVyX2NhbGxiYWNrOwotCi0JaWYgKGRldi0+Ym9hcmQucmFkaW8udHlwZSkgewotCQl0dW5fc2V0dXAudHlwZSA9IGRldi0+Ym9hcmQucmFkaW8udHlwZTsKLQkJdHVuX3NldHVwLmFkZHIgPSBkZXYtPmJvYXJkLnJhZGlvX2FkZHI7Ci0KLQkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnR1bl9zZXR1cCk7Ci0JfQotCi0JaWYgKChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKSAmJiAoZGV2LT50dW5lcl90eXBlKSkgewotCQl0dW5fc2V0dXAudHlwZSAgID0gZGV2LT50dW5lcl90eXBlOwotCQl0dW5fc2V0dXAuYWRkciAgID0gZGV2LT50dW5lcl9hZGRyOwotCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190eXBlX2FkZHIsICZ0dW5fc2V0dXApOwotCX0KLQotCWlmIChkZXYtPnRkYTk4ODdfY29uZikgewotCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgdGRhOTg4N19jZmc7Ci0KLQkJdGRhOTg4N19jZmcudHVuZXIgPSBUVU5FUl9UREE5ODg3OwotCQl0ZGE5ODg3X2NmZy5wcml2ID0gJmRldi0+dGRhOTg4N19jb25mOwotCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsICZ0ZGE5ODg3X2NmZyk7Ci0JfQotCi0JaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9YQzIwMjgpIHsKLQkJc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnICB4YzIwMjhfY2ZnOwotCQlzdHJ1Y3QgeGMyMDI4X2N0cmwgICAgICAgICAgIGN0bDsKLQotCQltZW1zZXQoJnhjMjAyOF9jZmcsIDAsIHNpemVvZih4YzIwMjhfY2ZnKSk7Ci0JCW1lbXNldCgmY3RsLCAwLCBzaXplb2YoY3RsKSk7Ci0KLQkJZW0yOHh4X3NldHVwX3hjMzAyOChkZXYsICZjdGwpOwotCi0JCXhjMjAyOF9jZmcudHVuZXIgPSBUVU5FUl9YQzIwMjg7Ci0JCXhjMjAyOF9jZmcucHJpdiAgPSAmY3RsOwotCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsICZ4YzIwMjhfY2ZnKTsKLQl9Ci0KLQkvKiBjb25maWd1cmUgdHVuZXIgKi8KLQlmLnR1bmVyID0gMDsKLQlmLnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQlmLmZyZXF1ZW5jeSA9IDkwNzY7ICAgICAvKiBqdXN0IGEgbWFnaWMgbnVtYmVyICovCi0JZGV2LT5jdGxfZnJlcSA9IGYuZnJlcXVlbmN5OwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksICZmKTsKLX0KLQogc3RhdGljIGludCBlbTI4eHhfaGludF9ib2FyZChzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJaW50IGk7CkBAIC0yNzY4LDU3ICsyNzY1LDU2IEBACiAJLyogQWxsb3cgb3ZlcnJpZGUgdHVuZXIgdHlwZSBieSBhIG1vZHVsZSBwYXJhbWV0ZXIgKi8KIAlpZiAodHVuZXIgPj0gMCkKIAkJZGV2LT50dW5lcl90eXBlID0gdHVuZXI7Ci0KLQkvKiByZXF1ZXN0IHNvbWUgbW9kdWxlcyAqLwotCWlmIChkZXYtPmJvYXJkLmhhc19tc3AzNHh4KQotCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKLQkJCSJtc3AzNDAwIiwgMCwgbXNwMzQwMF9hZGRycyk7Ci0KLQlpZiAoZGV2LT5ib2FyZC5kZWNvZGVyID09IEVNMjhYWF9TQUE3MTFYKQotCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKLQkJCSJzYWE3MTE1X2F1dG8iLCAwLCBzYWE3MTF4X2FkZHJzKTsKLQotCWlmIChkZXYtPmJvYXJkLmRlY29kZXIgPT0gRU0yOFhYX1RWUDUxNTApCi0JCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAotCQkJInR2cDUxNTAiLCAwLCB0dnA1MTUwX2FkZHJzKTsKLQotCWlmIChkZXYtPmJvYXJkLmFkZWNvZGVyID09IEVNMjhYWF9UVkFVRElPKQotCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKLQkJCSJ0dmF1ZGlvIiwgZGV2LT5ib2FyZC50dmF1ZGlvX2FkZHIsIE5VTEwpOwotCi0JaWYgKGRldi0+Ym9hcmQudHVuZXJfdHlwZSAhPSBUVU5FUl9BQlNFTlQpIHsKLQkJaW50IGhhc19kZW1vZCA9IChkZXYtPnRkYTk4ODdfY29uZiAmIFREQTk4ODdfUFJFU0VOVCk7Ci0KLQkJaWYgKGRldi0+Ym9hcmQucmFkaW8udHlwZSkKLQkJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAotCQkJCSJ0dW5lciIsIGRldi0+Ym9hcmQucmFkaW9fYWRkciwgTlVMTCk7Ci0KLQkJaWYgKGhhc19kZW1vZCkKLQkJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsCi0JCQkJJmRldi0+aTJjX2FkYXBbZGV2LT5kZWZfaTJjX2J1c10sICJ0dW5lciIsCi0JCQkJMCwgdjRsMl9pMmNfdHVuZXJfYWRkcnMoQUREUlNfREVNT0QpKTsKLQkJaWYgKGRldi0+dHVuZXJfYWRkciA9PSAwKSB7Ci0JCQllbnVtIHY0bDJfaTJjX3R1bmVyX3R5cGUgdHlwZSA9Ci0JCQkJaGFzX2RlbW9kID8gQUREUlNfVFZfV0lUSF9ERU1PRCA6IEFERFJTX1RWOwotCQkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKLQotCQkJc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LAotCQkJCSZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLCAidHVuZXIiLAotCQkJCTAsIHY0bDJfaTJjX3R1bmVyX2FkZHJzKHR5cGUpKTsKLQotCQkJaWYgKHNkKQotCQkJCWRldi0+dHVuZXJfYWRkciA9IHY0bDJfaTJjX3N1YmRldl9hZGRyKHNkKTsKLQkJfSBlbHNlIHsKLQkJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAotCQkJCSJ0dW5lciIsIGRldi0+dHVuZXJfYWRkciwgTlVMTCk7Ci0JCX0KLQl9Ci0KLQllbTI4eHhfdHVuZXJfc2V0dXAoZGV2KTsKLQotCWVtMjh4eF9pbml0X2NhbWVyYShkZXYpOwogfQogCit2b2lkIGVtMjh4eF9zZXR1cF94YzMwMjgoc3RydWN0IGVtMjh4eCAqZGV2LCBzdHJ1Y3QgeGMyMDI4X2N0cmwgKmN0bCkKK3sKKwltZW1zZXQoY3RsLCAwLCBzaXplb2YoKmN0bCkpOworCisJY3RsLT5mbmFtZSAgID0gWEMyMDI4X0RFRkFVTFRfRklSTVdBUkU7CisJY3RsLT5tYXhfbGVuID0gNjQ7CisJY3RsLT5tdHMgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLm10c19maXJtd2FyZTsKKworCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCWNhc2UgRU0yODgwX0JPQVJEX0VNUElSRV9EVUFMX1RWOgorCWNhc2UgRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwOgorCWNhc2UgRU0yODgyX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YUzoKKwkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9aQVJMSU5LNDU2OworCQlicmVhazsKKwljYXNlIEVNMjg4MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6CisJY2FzZSBFTTI4ODBfQk9BUkRfVEVSUkFURUNfSFlCUklEX1hTX0ZSOgorCWNhc2UgRU0yODgxX0JPQVJEX1BJTk5BQ0xFX0hZQlJJRF9QUk86CisJCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfWkFSTElOSzQ1NjsKKwkJYnJlYWs7CisJY2FzZSBFTTI4ODBfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85MDBfUjI6CisJY2FzZSBFTTI4ODJfQk9BUkRfUElOTkFDTEVfSFlCUklEX1BST18zMzBFOgorCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX0RFRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgRU0yODgwX0JPQVJEX0FNRF9BVElfVFZfV09OREVSX0hEXzYwMDoKKwkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9ERUZBVUxUOworCQljdGwtPmZuYW1lID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFOworCQlicmVhazsKKwljYXNlIEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzg1MDoKKwljYXNlIEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MDoKKwljYXNlIEVNMjg4MF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEX1BSTzoKKwkJLyogRklYTUU6IEJldHRlciB0byBzcGVjaWZ5IHRoZSBuZWVkZWQgSUYgKi8KKwkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9ERUZBVUxUOworCQlicmVhazsKKwljYXNlIEVNMjg4M19CT0FSRF9LV09STERfSFlCUklEXzMzMFU6CisJY2FzZSBFTTI4ODJfQk9BUkRfRElLT01fREszMDA6CisJY2FzZSBFTTI4ODJfQk9BUkRfS1dPUkxEX1ZTX0RWQlQ6CisJCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfQ0hJTkE7CisJCWN0bC0+Zm5hbWUgPSBYQzIwMjhfREVGQVVMVF9GSVJNV0FSRTsKKwkJYnJlYWs7CisJY2FzZSBFTTI4ODJfQk9BUkRfRVZHQV9JTkRUVUJFOgorCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX0NISU5BOworCQljdGwtPmZuYW1lID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX09SRU41Mzg7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X3NldHVwX3hjMzAyOCk7CiAKIHN0YXRpYyB2b2lkIHJlcXVlc3RfbW9kdWxlX2FzeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTI4MzEsMTcgKzI4MjcsMzAgQEAKIAkgKiBjYW4gYmUgaW5pdGlhbGlzZWQgcmlnaHQgbm93LiBPdGhlcndpc2UsIHRoZSBtb2R1bGUgaW5pdAogCSAqIGNvZGUgd2lsbCBkbyBpdC4KIAkgKi8KKworCS8qCisJICogRGV2aWNkZXMgd2l0aCBhbiBhdWRpby1vbmx5IGludGVyZmFjZSBhbHNvIGhhdmUgYSBWNEwvRFZCL1JDCisJICogaW50ZXJmYWNlLiBEb24ndCByZWdpc3RlciBleHRlbnNpb25zIHR3aWNlIG9uIHRob3NlIGRldmljZXMuCisJICovCisJaWYgKGRldi0+aXNfYXVkaW9fb25seSkgeworI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFKQorCQlyZXF1ZXN0X21vZHVsZSgiZW0yOHh4LWFsc2EiKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCiAJZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7CiAKICNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVTKSAmJiBkZWZpbmVkKE1PRFVMRSkKKwlpZiAoZGV2LT5oYXNfdmlkZW8pCisJCXJlcXVlc3RfbW9kdWxlKCJlbTI4eHgtdjRsIik7CiAJaWYgKGRldi0+aGFzX2F1ZGlvX2NsYXNzKQogCQlyZXF1ZXN0X21vZHVsZSgic25kLXVzYi1hdWRpbyIpOwogCWVsc2UgaWYgKGRldi0+aGFzX2Fsc2FfYXVkaW8pCiAJCXJlcXVlc3RfbW9kdWxlKCJlbTI4eHgtYWxzYSIpOwotCiAJaWYgKGRldi0+Ym9hcmQuaGFzX2R2YikKIAkJcmVxdWVzdF9tb2R1bGUoImVtMjh4eC1kdmIiKTsKLQlpZiAoZGV2LT5ib2FyZC5oYXNfc25hcHNob3RfYnV0dG9uIHx8CisJaWYgKGRldi0+Ym9hcmQuYnV0dG9ucyB8fAogCSAgICAoKGRldi0+Ym9hcmQuaXJfY29kZXMgfHwgZGV2LT5ib2FyZC5oYXNfaXJfaTJjKSAmJiAhZGlzYWJsZV9pcikpCiAJCXJlcXVlc3RfbW9kdWxlKCJlbTI4eHgtcmMiKTsKICNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLwpAQCAtMjg2NywyMyArMjg3NiwyMCBAQAogewogCS8qRklYTUU6IEkyQyBJUiBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCiAKLQllbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKGRldik7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAogCWlmIChkZXYtPmRlZl9pMmNfYnVzKQogCQllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2LCAxKTsKIAllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2LCAwKTsKLQlpZiAoZGV2LT5jbGspCi0JCXY0bDJfY2xrX3VucmVnaXN0ZXJfZml4ZWQoZGV2LT5jbGspOwotCi0JdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmZGV2LT5jdHJsX2hhbmRsZXIpOwotCi0JdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CiAKIAl1c2JfcHV0X2RldihkZXYtPnVkZXYpOwogCiAJLyogTWFyayBkZXZpY2UgYXMgdW51c2VkICovCi0JY2xlYXJfYml0KGRldi0+ZGV2bm8sICZlbTI4eHhfZGV2dXNlZCk7CisJY2xlYXJfYml0KGRldi0+ZGV2bm8sIGVtMjh4eF9kZXZ1c2VkKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIH07CitFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMpOwogCiAvKgogICogZW0yOHh4X2luaXRfZGV2KCkKQEAgLTI4OTMsNyArMjg5OSw2IEBACiAJCQkgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkJICAgaW50IG1pbm9yKQogewotCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsID0gJmRldi0+Y3RybF9oYW5kbGVyOwogCWludCByZXR2YWw7CiAJc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfY2hpcF9uYW1lID0gImVtMjh4eCI7CiAJY29uc3QgY2hhciAqY2hpcF9uYW1lID0gZGVmYXVsdF9jaGlwX25hbWU7CkBAIC0yOTY4LDYgKzI5NzMsMTEgQEAKIAkJCWRldi0+d2FpdF9hZnRlcl93cml0ZSA9IDA7CiAJCQlkZXYtPmVlcHJvbV9hZGRyd2lkdGhfMTZiaXQgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9JRF9FTTI4MTc4OgorCQkJY2hpcF9uYW1lID0gImVtMjgxNzgiOworCQkJZGV2LT53YWl0X2FmdGVyX3dyaXRlID0gMDsKKwkJCWRldi0+ZWVwcm9tX2FkZHJ3aWR0aF8xNmJpdCA9IDE7CisJCQlicmVhazsKIAkJY2FzZSBDSElQX0lEX0VNMjg4MzoKIAkJCWNoaXBfbmFtZSA9ICJlbTI4ODIvMyI7CiAJCQlkZXYtPndhaXRfYWZ0ZXJfd3JpdGUgPSAwOwpAQCAtMjk4Myw2ICsyOTkzLDE2IEBACiAJCX0KIAl9CiAKKwlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODcwIHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fAorCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0IHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzgpIHsKKwkJLyogRGlnaXRhbCBvbmx5IGRldmljZSAtIGRvbid0IGxvYWQgYW55IGFsc2EgbW9kdWxlICovCisJCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKKwkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSBmYWxzZTsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOworCX0KKwogCWlmIChjaGlwX25hbWUgIT0gZGVmYXVsdF9jaGlwX25hbWUpCiAJCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUKIAkJICAgICAgICI6IGNoaXAgSUQgaXMgJXNcbiIsIGNoaXBfbmFtZSk7CkBAIC0zMDE1LDE1ICszMDM1LDYgQEAKIAkJfQogCX0KIAotCXJldHZhbCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZpbnRlcmZhY2UtPmRldiwgJmRldi0+djRsMl9kZXYpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWVtMjh4eF9lcnJkZXYoIkNhbGwgdG8gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoKSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KGhkbCwgOCk7Ci0JZGV2LT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSBoZGw7Ci0KIAlydF9tdXRleF9pbml0KCZkZXYtPmkyY19idXNfbG9jayk7CiAKIAkvKiByZWdpc3RlciBpMmMgYnVzIDAgKi8KQEAgLTMwMzQsNyArMzA0NSw3IEBACiAJaWYgKHJldHZhbCA8IDApIHsKIAkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgYnVzIDAgLSBlcnJvciBbJWRdIVxuIiwKIAkJCV9fZnVuY19fLCByZXR2YWwpOwotCQlnb3RvIHVucmVnaXN0ZXJfZGV2OworCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCS8qIHJlZ2lzdGVyIGkyYyBidXMgMSAqLwpAQCAtMzA0OCw4OCArMzA1OSwxNyBAQAogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgYnVzIDEgLSBlcnJvciBbJWRdIVxuIiwKIAkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKLQkJCWdvdG8gdW5yZWdpc3Rlcl9kZXY7CisKKwkJCWVtMjh4eF9pMmNfdW5yZWdpc3RlcihkZXYsIDApOworCisJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQogCi0JLyoKLQkgKiBEZWZhdWx0IGZvcm1hdCwgdXNlZCBmb3IgdHZwNTE1MCBvciBzYWE3MTF4IG91dHB1dCBmb3JtYXRzCi0JICovCi0JZGV2LT52aW5tb2RlID0gMHgxMDsKLQlkZXYtPnZpbmN0bCAgPSBFTTI4WFhfVklOQ1RSTF9JTlRFUkxBQ0VEIHwKLQkJICAgICAgIEVNMjhYWF9WSU5DVFJMX0NDSVI2NTZfRU5BQkxFOwotCiAJLyogRG8gYm9hcmQgc3BlY2lmaWMgaW5pdCBhbmQgZWVwcm9tIHJlYWRpbmcgKi8KIAllbTI4eHhfY2FyZF9zZXR1cChkZXYpOwogCi0JLyogQ29uZmlndXJlIGF1ZGlvICovCi0JcmV0dmFsID0gZW0yOHh4X2F1ZGlvX3NldHVwKGRldik7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZW0yOHh4X2VycmRldigiJXM6IEVycm9yIHdoaWxlIHNldHRpbmcgYXVkaW8gLSBlcnJvciBbJWRdIVxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgewotCQl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZlbTI4eHhfY3RybF9vcHMsCi0JCQlWNEwyX0NJRF9BVURJT19NVVRFLCAwLCAxLCAxLCAxKTsKLQkJdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmZW0yOHh4X2N0cmxfb3BzLAotCQkJVjRMMl9DSURfQVVESU9fVk9MVU1FLCAwLCAweDFmLCAxLCAweDFmKTsKLQl9IGVsc2UgewotCQkvKiBpbnN0YWxsIHRoZSBlbTI4eHggbm90aWZ5IGNhbGxiYWNrICovCi0JCXY0bDJfY3RybF9ub3RpZnkodjRsMl9jdHJsX2ZpbmQoaGRsLCBWNEwyX0NJRF9BVURJT19NVVRFKSwKLQkJCQllbTI4eHhfY3RybF9ub3RpZnksIGRldik7Ci0JCXY0bDJfY3RybF9ub3RpZnkodjRsMl9jdHJsX2ZpbmQoaGRsLCBWNEwyX0NJRF9BVURJT19WT0xVTUUpLAotCQkJCWVtMjh4eF9jdHJsX25vdGlmeSwgZGV2KTsKLQl9Ci0KLQkvKiB3YWtlIGkyYyBkZXZpY2VzICovCi0JZW0yOHh4X3dha2VfaTJjKGRldik7Ci0KLQkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KLQlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJpcS5hY3RpdmUpOwotCi0JaWYgKGRldi0+Ym9hcmQuaGFzX21zcDM0eHgpIHsKLQkJLyogU2VuZCBhIHJlc2V0IHRvIG90aGVyIGNoaXBzIHZpYSBncGlvICovCi0JCXJldHZhbCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4MjBfUjA4X0dQSU9fQ1RSTCwgMHhmNyk7Ci0JCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyAtICIKLQkJCQkgICAgICAibXNwMzR4eCgxKSBmYWlsZWQhIGVycm9yIFslZF1cbiIsCi0JCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbXNsZWVwKDMpOwotCi0JCXJldHZhbCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4MjBfUjA4X0dQSU9fQ1RSTCwgMHhmZik7Ci0JCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyAtICIKLQkJCQkgICAgICAibXNwMzR4eCgyKSBmYWlsZWQhIGVycm9yIFslZF1cbiIsCi0JCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbXNsZWVwKDMpOwotCX0KLQotCXJldHZhbCA9IGVtMjh4eF9yZWdpc3Rlcl9hbmFsb2dfZGV2aWNlcyhkZXYpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTYXZlIHNvbWUgcG93ZXIgYnkgcHV0dGluZyB0dW5lciB0byBzbGVlcCAqLwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3Bvd2VyLCAwKTsKLQogCXJldHVybiAwOwotCi1mYWlsOgotCWlmIChkZXYtPmRlZl9pMmNfYnVzKQotCQllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2LCAxKTsKLQllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2LCAwKTsKLQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZkZXYtPmN0cmxfaGFuZGxlcik7Ci0KLXVucmVnaXN0ZXJfZGV2OgotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOwotCi0JcmV0dXJuIHJldHZhbDsKIH0KIAogLyogaGlnaCBiYW5kd2lkdGggbXVsdGlwbGllciwgYXMgZW5jb2RlZCBpbiBoaWdoc3BlZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KQEAgLTMxNTQsNyArMzA5NCw3IEBACiAKIAkvKiBDaGVjayB0byBzZWUgbmV4dCBmcmVlIGRldmljZSBhbmQgbWFyayBhcyB1c2VkICovCiAJZG8gewotCQluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmVtMjh4eF9kZXZ1c2VkLCBFTTI4WFhfTUFYQk9BUkRTKTsKKwkJbnIgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGVtMjh4eF9kZXZ1c2VkLCBFTTI4WFhfTUFYQk9BUkRTKTsKIAkJaWYgKG5yID49IEVNMjhYWF9NQVhCT0FSRFMpIHsKIAkJCS8qIE5vIGZyZWUgZGV2aWNlIHNsb3RzICovCiAJCQlwcmludGsoRFJJVkVSX05BTUUgIjogU3VwcG9ydHMgb25seSAlaSBlbTI4eHggYm9hcmRzLlxuIiwKQEAgLTMxNjIsNyArMzEwMiw3IEBACiAJCQlyZXR2YWwgPSAtRU5PTUVNOwogCQkJZ290byBlcnJfbm9fc2xvdDsKIAkJfQotCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQobnIsICZlbTI4eHhfZGV2dXNlZCkpOworCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQobnIsIGVtMjh4eF9kZXZ1c2VkKSk7CiAKIAkvKiBEb24ndCByZWdpc3RlciBhdWRpbyBpbnRlcmZhY2VzICovCiAJaWYgKGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfQVVESU8pIHsKQEAgLTMzMzIsNyArMzI3Miw5IEBACiAJZGV2LT5hbHQgICA9IC0xOwogCWRldi0+aXNfYXVkaW9fb25seSA9IGhhc19hdWRpbyAmJiAhKGhhc192aWRlbyB8fCBoYXNfZHZiKTsKIAlkZXYtPmhhc19hbHNhX2F1ZGlvID0gaGFzX2F1ZGlvOwotCWRldi0+YXVkaW9faWZudW0gPSBpZm51bTsKKwlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gaGFzX2F1ZGlvOworCWRldi0+aGFzX3ZpZGVvID0gaGFzX3ZpZGVvOworCWRldi0+aWZudW0gPSBpZm51bTsKIAogCS8qIENoZWNrcyBpZiBhdWRpbyBpcyBwcm92aWRlZCBieSBzb21lIGludGVyZmFjZSAqLwogCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewpAQCAtMzM2OSwxNSArMzMxMSwxMSBAQAogCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKIAotCS8qIGluaXRpYWxpemUgdmlkZW9idWYyIHN0dWZmICovCi0JZW0yOHh4X3ZiMl9zZXR1cChkZXYpOwotCiAJLyogYWxsb2NhdGUgZGV2aWNlIHN0cnVjdCAqLwogCW11dGV4X2luaXQoJmRldi0+bG9jayk7Ci0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAlyZXR2YWwgPSBlbTI4eHhfaW5pdF9kZXYoZGV2LCB1ZGV2LCBpbnRlcmZhY2UsIG5yKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWdvdG8gdW5sb2NrX2FuZF9mcmVlOworCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCWlmICh1c2JfeGZlcl9tb2RlIDwgMCkgewpAQCAtMzQwMiwyNiArMzM0MCw2IEBACiAKIAkJZW0yOHh4X2luZm8oImR2YiBzZXQgdG8gJXMgbW9kZS5cbiIsCiAJCQkgICAgZGV2LT5kdmJfeGZlcl9idWxrID8gImJ1bGsiIDogImlzb2MiKTsKLQotCQkvKiBwcmUtYWxsb2NhdGUgRFZCIHVzYiB0cmFuc2ZlciBidWZmZXJzICovCi0JCWlmIChkZXYtPmR2Yl94ZmVyX2J1bGspIHsKLQkJCXJldHZhbCA9IGVtMjh4eF9hbGxvY191cmJzKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSwKLQkJCQkJICAgIGRldi0+ZHZiX3hmZXJfYnVsaywKLQkJCQkJICAgIEVNMjhYWF9EVkJfTlVNX0JVRlMsCi0JCQkJCSAgICA1MTIsCi0JCQkJCSAgICBFTTI4WFhfRFZCX0JVTEtfUEFDS0VUX01VTFRJUExJRVIpOwotCQl9IGVsc2UgewotCQkJcmV0dmFsID0gZW0yOHh4X2FsbG9jX3VyYnMoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFLAotCQkJCQkgICAgZGV2LT5kdmJfeGZlcl9idWxrLAotCQkJCQkgICAgRU0yOFhYX0RWQl9OVU1fQlVGUywKLQkJCQkJICAgIGRldi0+ZHZiX21heF9wa3Rfc2l6ZV9pc29jLAotCQkJCQkgICAgRU0yOFhYX0RWQl9OVU1fSVNPQ19QQUNLRVRTKTsKLQkJfQotCQlpZiAocmV0dmFsKSB7Ci0JCQlwcmludGsoRFJJVkVSX05BTUUKLQkJCSAgICAgICAiOiBGYWlsZWQgdG8gcHJlLWFsbG9jYXRlIFVTQiB0cmFuc2ZlciBidWZmZXJzIGZvciBEVkIuXG4iKTsKLQkJCWdvdG8gdW5sb2NrX2FuZF9mcmVlOwotCQl9CiAJfQogCiAJcmVxdWVzdF9tb2R1bGVzKGRldik7CkBAIC0zNDI5LDE5ICszMzQ3LDE1IEBACiAJLyogU2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGRvLCB0byBhdm9pZCBuZXdlciB1ZGV2J3MgdG8KIAkgICBvcGVuIHRoZSBkZXZpY2UgYmVmb3JlIGZ1bGx5IGluaXRpYWxpemluZyBpdAogCSAqLwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCXJldHVybiAwOwogCi11bmxvY2tfYW5kX2ZyZWU6Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCiBlcnJfZnJlZToKIAlrZnJlZShkZXYtPmFsdF9tYXhfcGt0X3NpemVfaXNvYyk7CiAJa2ZyZWUoZGV2KTsKIAogZXJyOgotCWNsZWFyX2JpdChuciwgJmVtMjh4eF9kZXZ1c2VkKTsKKwljbGVhcl9iaXQobnIsIGVtMjh4eF9kZXZ1c2VkKTsKIAogZXJyX25vX3Nsb3Q6CiAJdXNiX3B1dF9kZXYodWRldik7CkBAIC0zNDY1LDM2ICszMzc5LDEzIEBACiAKIAlkZXYtPmRpc2Nvbm5lY3RlZCA9IDE7CiAKLQlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7Ci0JCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JCWVtMjh4eF9jbG9zZV9leHRlbnNpb24oZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JZW0yOHh4X2luZm8oImRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+dmRldi0+bmFtZSk7CisJZW0yOHh4X2luZm8oIkRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+bmFtZSk7CiAKIAlmbHVzaF9yZXF1ZXN0X21vZHVsZXMoZGV2KTsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0KLQl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZkZXYtPnY0bDJfZGV2KTsKLQotCWlmIChkZXYtPnVzZXJzKSB7Ci0JCWVtMjh4eF93YXJuKCJkZXZpY2UgJXMgaXMgb3BlbiEgRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSBkZWFsbG9jYXRpb24gYXJlIGRlZmVycmVkIG9uIGNsb3NlLlxuIiwKLQkJCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+dmRldikpOwotCi0JCWVtMjh4eF91bmluaXRfdXNiX3hmZXIoZGV2LCBFTTI4WFhfQU5BTE9HX01PREUpOwotCQllbTI4eHhfdW5pbml0X3VzYl94ZmVyKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSk7Ci0JfQotCiAJZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOwotCS8qIE5PVEU6IG11c3QgYmUgY2FsbGVkIEJFRk9SRSB0aGUgcmVzb3VyY2VzIGFyZSByZWxlYXNlZCAqLwogCi0JaWYgKCFkZXYtPnVzZXJzKQotCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKLQotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKIAogCWlmICghZGV2LT51c2VycykgewogCQlrZnJlZShkZXYtPmFsdF9tYXhfcGt0X3NpemVfaXNvYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY29yZS5jCmluZGV4IGZjMTU3YWYuLjg5OGZiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY29yZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTMzLDYgKzM0LDE2IEBACiAKICNpbmNsdWRlICJlbTI4eHguaCIKIAorI2RlZmluZSBEUklWRVJfQVVUSE9SICJMdWRvdmljbyBDYXZlZG9uIDxjYXZlZG9uQHNzc3VwLml0PiwgIiBcCisJCSAgICAgICJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPiwgIiBcCisJCSAgICAgICJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4sICIgXAorCQkgICAgICAiU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+IgorCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKEVNMjhYWF9WRVJTSU9OKTsKKwogLyogI2RlZmluZSBFTkFCTEVfREVCVUdfSVNPQ19GUkFNRVMgKi8KIAogc3RhdGljIHVuc2lnbmVkIGludCBjb3JlX2RlYnVnOwpAQCAtNTMsMTQgKzY0LDYgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXMgOiJmbXQsIFwKIAkJCSBkZXYtPm5hbWUsIF9fZnVuY19fICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW50IGFsdDsKLW1vZHVsZV9wYXJhbShhbHQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFsdCwgImFsdGVybmF0ZSBzZXR0aW5nIHRvIHVzZSBmb3IgdmlkZW8gZW5kcG9pbnQiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBkaXNhYmxlX3ZiaTsKLW1vZHVsZV9wYXJhbShkaXNhYmxlX3ZiaSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV92YmksICJkaXNhYmxlIHZiaSBzdXBwb3J0Iik7Ci0KIC8qIEZJWE1FICovCiAjZGVmaW5lIGVtMjh4eF9pc29jZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAogCWlmIChjb3JlX2RlYnVnKSBcCkBAIC0yMjYsMjEgKzIyOSw0MiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X3dyaXRlX3JlZ19iaXRzKTsKIAogLyoKKyAqIGVtMjh4eF90b2dnbGVfcmVnX2JpdHMoKQorICogdG9nZ2xlcy9pbnZlcnRzIHRoZSBiaXRzIChzcGVjaWZpZWQgYnkgYml0bWFzaykgb2YgYSByZWdpc3RlcgorICovCitpbnQgZW0yOHh4X3RvZ2dsZV9yZWdfYml0cyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiByZWcsIHU4IGJpdG1hc2spCit7CisJaW50IG9sZHZhbDsKKwl1OCBuZXd2YWw7CisKKwlvbGR2YWwgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCByZWcpOworCWlmIChvbGR2YWwgPCAwKQorCQlyZXR1cm4gb2xkdmFsOworCisJbmV3dmFsID0gKH5vbGR2YWwgJiBiaXRtYXNrKSB8IChvbGR2YWwgJiB+Yml0bWFzayk7CisKKwlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIHJlZywgbmV3dmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF90b2dnbGVfcmVnX2JpdHMpOworCisvKgogICogZW0yOHh4X2lzX2FjOTdfcmVhZHkoKQogICogQ2hlY2tzIGlmIGFjOTcgaXMgcmVhZHkKICAqLwogc3RhdGljIGludCBlbTI4eHhfaXNfYWM5N19yZWFkeShzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7Ci0JaW50IHJldCwgaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhFTTI4WFhfQUM5N19YRkVSX1RJTUVPVVQpOworCWludCByZXQ7CiAKIAkvKiBXYWl0IHVwIHRvIDUwIG1zIGZvciBBQzk3IGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKywgbXNsZWVwKDUpKSB7CisJd2hpbGUgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0aW1lb3V0KSkgewogCQlyZXQgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjQzX0FDOTdCVVNZKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCWlmICghKHJldCAmIDB4MDEpKQogCQkJcmV0dXJuIDA7CisJCW1zbGVlcCg1KTsKIAl9CiAKIAllbTI4eHhfd2FybigiQUM5NyBjb21tYW5kIHN0aWxsIGJlaW5nIGV4ZWN1dGVkOiBub3QgaGFuZGxlZCBwcm9wZXJseSFcbiIpOwpAQCAtNDgyLDE2ICs1MDYsOCBAQAogCWludCB2aWQxLCB2aWQyLCBmZWF0LCBjZmc7CiAJdTMyIHZpZDsKIAotCWlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzAgfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0Ci0JCXx8IGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQpIHsKLQkJLyogRGlnaXRhbCBvbmx5IGRldmljZSAtIGRvbid0IGxvYWQgYW55IGFsc2EgbW9kdWxlICovCi0JCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKLQkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSBmYWxzZTsKLQkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOworCWlmICghZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbykKIAkJcmV0dXJuIDA7Ci0JfQotCi0JZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IHRydWU7CiAKIAkvKiBTZWUgaG93IHRoaXMgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgKi8KIAljZmcgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjAwX0NISVBDRkcpOwpAQCAtNTA0LDE3ICs1MjAsMTkgQEAKIAkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOwogCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gZmFsc2U7CiAJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0KLQkJICAgRU0yOFhYX0NISVBDRkdfSTJTXzNfU0FNUFJBVEVTKSB7Ci0JCWVtMjh4eF9pbmZvKCJJMlMgQXVkaW8gKDMgc2FtcGxlIHJhdGVzKVxuIik7Ci0JCWRldi0+YXVkaW9fbW9kZS5pMnNfM3JhdGVzID0gMTsKLQl9IGVsc2UgaWYgKChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spID09Ci0JCSAgIEVNMjhYWF9DSElQQ0ZHX0kyU181X1NBTVBSQVRFUykgewotCQllbTI4eHhfaW5mbygiSTJTIEF1ZGlvICg1IHNhbXBsZSByYXRlcylcbiIpOwotCQlkZXYtPmF1ZGlvX21vZGUuaTJzXzVyYXRlcyA9IDE7Ci0JfQotCi0JaWYgKChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spICE9IEVNMjhYWF9DSElQQ0ZHX0FDOTcpIHsKKwl9IGVsc2UgaWYgKChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spICE9IEVNMjhYWF9DSElQQ0ZHX0FDOTcpIHsKKwkJaWYgKGRldi0+Y2hpcF9pZCA8IENISVBfSURfRU0yODYwICYmCisJICAgICAgICAgICAgKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0KKwkJICAgIEVNMjgyMF9DSElQQ0ZHX0kyU18xX1NBTVBSQVRFKQorCQkJZGV2LT5hdWRpb19tb2RlLmkyc19zYW1wbGVyYXRlcyA9IDE7CisJCWVsc2UgaWYgKGRldi0+Y2hpcF9pZCA+PSBDSElQX0lEX0VNMjg2MCAmJgorCQkJIChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spID09CisJCQkgRU0yODYwX0NISVBDRkdfSTJTXzVfU0FNUFJBVEVTKQorCQkJZGV2LT5hdWRpb19tb2RlLmkyc19zYW1wbGVyYXRlcyA9IDU7CisJCWVsc2UKKwkJCWRldi0+YXVkaW9fbW9kZS5pMnNfc2FtcGxlcmF0ZXMgPSAzOworCQllbTI4eHhfaW5mbygiSTJTIEF1ZGlvICglZCBzYW1wbGUgcmF0ZShzKSlcbiIsCisJCQkJCSAgICAgICBkZXYtPmF1ZGlvX21vZGUuaTJzX3NhbXBsZXJhdGVzKTsKIAkJLyogU2tpcCB0aGUgY29kZSB0aGF0IGRvZXMgQUM5NyB2ZW5kb3IgZGV0ZWN0aW9uICovCiAJCWRldi0+YXVkaW9fbW9kZS5hYzk3ID0gRU0yOFhYX05PX0FDOTc7CiAJCWdvdG8gaW5pdF9hdWRpbzsKQEAgLTU4MiwyMyArNjAwLDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfYXVkaW9fc2V0dXApOwogCi1pbnQgZW0yOHh4X2NvbG9ybGV2ZWxzX3NldF9kZWZhdWx0KHN0cnVjdCBlbTI4eHggKmRldikKK2NvbnN0IHN0cnVjdCBlbTI4eHhfbGVkICplbTI4eHhfZmluZF9sZWQoc3RydWN0IGVtMjh4eCAqZGV2LAorCQkJCQkgZW51bSBlbTI4eHhfbGVkX3JvbGUgcm9sZSkKIHsKLQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyMF9ZR0FJTiwgQ09OVFJBU1RfREVGQVVMVCk7Ci0JZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjFfWU9GRlNFVCwgQlJJR0hUTkVTU19ERUZBVUxUKTsKLQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyMl9VVkdBSU4sIFNBVFVSQVRJT05fREVGQVVMVCk7Ci0JZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjNfVU9GRlNFVCwgQkxVRV9CQUxBTkNFX0RFRkFVTFQpOwotCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjI0X1ZPRkZTRVQsIFJFRF9CQUxBTkNFX0RFRkFVTFQpOwotCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjI1X1NIQVJQTkVTUywgU0hBUlBORVNTX0RFRkFVTFQpOwotCi0JZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTRfR0FNTUEsIDB4MjApOwotCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjE1X1JHQUlOLCAweDIwKTsKLQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxNl9HR0FJTiwgMHgyMCk7Ci0JZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTdfQkdBSU4sIDB4MjApOwotCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjE4X1JPRkZTRVQsIDB4MDApOwotCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjE5X0dPRkZTRVQsIDB4MDApOwotCXJldHVybiBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxQV9CT0ZGU0VULCAweDAwKTsKKwlpZiAoZGV2LT5ib2FyZC5sZWRzKSB7CisJCXU4IGsgPSAwOworCQl3aGlsZSAoZGV2LT5ib2FyZC5sZWRzW2tdLnJvbGUgPj0gMCAmJgorCQkJICAgICAgIGRldi0+Ym9hcmQubGVkc1trXS5yb2xlIDwgRU0yOFhYX05VTV9MRURfUk9MRVMpIHsKKwkJCWlmIChkZXYtPmJvYXJkLmxlZHNba10ucm9sZSA9PSByb2xlKQorCQkJCXJldHVybiAmZGV2LT5ib2FyZC5sZWRzW2tdOworCQkJaysrOworCQl9CisJfQorCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2ZpbmRfbGVkKTsKIAogaW50IGVtMjh4eF9jYXB0dXJlX3N0YXJ0KHN0cnVjdCBlbTI4eHggKmRldiwgaW50IHN0YXJ0KQogewpAQCAtNjA2LDI3MyArNjIyLDU5IEBACiAKIAlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0IHx8CiAJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg4NCB8fAotCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3OCkgewogCQkvKiBUaGUgVHJhbnNwb3J0IFN0cmVhbSBFbmFibGUgUmVnaXN0ZXIgbW92ZWQgaW4gZW0yODc0ICovCi0JCWlmICghc3RhcnQpIHsKLQkJCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yODc0X1I1Rl9UU19FTkFCTEUsCi0JCQkJCQkgICAweDAwLAotCQkJCQkJICAgRU0yODc0X1RTMV9DQVBUVVJFX0VOQUJMRSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQkvKiBFbmFibGUgVHJhbnNwb3J0IFN0cmVhbSAqLwogCQlyYyA9IGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjg3NF9SNUZfVFNfRU5BQkxFLAotCQkJCQkgICBFTTI4NzRfVFMxX0NBUFRVUkVfRU5BQkxFLAorCQkJCQkgICBzdGFydCA/CisJCQkJCSAgICAgICBFTTI4NzRfVFMxX0NBUFRVUkVfRU5BQkxFIDogMHgwMCwKIAkJCQkJICAgRU0yODc0X1RTMV9DQVBUVVJFX0VOQUJMRSk7Ci0JCXJldHVybiByYzsKKwl9IGVsc2UgeworCQkvKiBGSVhNRTogd2hpY2ggaXMgdGhlIGJlc3Qgb3JkZXI/ICovCisJCS8qIHZpZGVvIHJlZ2lzdGVycyBhcmUgc2FtcGxlZCBieSBWUkVGICovCisJCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yOFhYX1IwQ19VU0JTVVNQLAorCQkJCQkgICBzdGFydCA/IDB4MTAgOiAweDAwLCAweDEwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAoc3RhcnQpIHsKKwkJCWlmIChkZXYtPmJvYXJkLmlzX3dlYmNhbSkKKwkJCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCAweDEzLCAweDBjKTsKKworCQkJLyogRW5hYmxlIHZpZGVvIGNhcHR1cmUgKi8KKwkJCXJjID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIDB4NDgsIDB4MDApOworCisJCQlpZiAoZGV2LT5tb2RlID09IEVNMjhYWF9BTkFMT0dfTU9ERSkKKwkJCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LAorCQkJCQkJICAgIEVNMjhYWF9SMTJfVklORU5BQkxFLCAweDY3KTsKKwkJCWVsc2UKKwkJCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LAorCQkJCQkJICAgIEVNMjhYWF9SMTJfVklORU5BQkxFLCAweDM3KTsKKworCQkJbXNsZWVwKDYpOworCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSB2aWRlbyBjYXB0dXJlICovCisJCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjEyX1ZJTkVOQUJMRSwgMHgyNyk7CisJCX0KIAl9CiAKLQotCS8qIEZJWE1FOiB3aGljaCBpcyB0aGUgYmVzdCBvcmRlcj8gKi8KLQkvKiB2aWRlbyByZWdpc3RlcnMgYXJlIHNhbXBsZWQgYnkgVlJFRiAqLwotCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yOFhYX1IwQ19VU0JTVVNQLAotCQkJCSAgIHN0YXJ0ID8gMHgxMCA6IDB4MDAsIDB4MTApOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCWlmICghc3RhcnQpIHsKLQkJLyogZGlzYWJsZSB2aWRlbyBjYXB0dXJlICovCi0JCXJjID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTJfVklORU5BQkxFLCAweDI3KTsKLQkJcmV0dXJuIHJjOworCS8qIFN3aXRjaCAoZXhwbGljaXRseSBjb250cm9sbGVkKSBhbmFsb2cgY2FwdHVyaW5nIExFRCBvbi9vZmYgKi8KKwlpZiAoZGV2LT5tb2RlID09IEVNMjhYWF9BTkFMT0dfTU9ERSkgeworCQljb25zdCBzdHJ1Y3QgZW0yOHh4X2xlZCAqbGVkOworCQlsZWQgPSBlbTI4eHhfZmluZF9sZWQoZGV2LCBFTTI4WFhfTEVEX0FOQUxPR19DQVBUVVJJTkcpOworCQlpZiAobGVkKQorCQkJZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgbGVkLT5ncGlvX3JlZywKKwkJCQkJICAgICAgKCFzdGFydCBeIGxlZC0+aW52ZXJ0ZWQpID8KKwkJCQkJICAgICAgfmxlZC0+Z3Bpb19tYXNrIDogbGVkLT5ncGlvX21hc2ssCisJCQkJCSAgICAgIGxlZC0+Z3Bpb19tYXNrKTsKIAl9CiAKLQlpZiAoZGV2LT5ib2FyZC5pc193ZWJjYW0pCi0JCXJjID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIDB4MTMsIDB4MGMpOwotCi0JLyogZW5hYmxlIHZpZGVvIGNhcHR1cmUgKi8KLQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCAweDQ4LCAweDAwKTsKLQotCWlmIChkZXYtPm1vZGUgPT0gRU0yOFhYX0FOQUxPR19NT0RFKQotCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjEyX1ZJTkVOQUJMRSwgMHg2Nyk7Ci0JZWxzZQotCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjEyX1ZJTkVOQUJMRSwgMHgzNyk7Ci0KLQltc2xlZXAoNik7Ci0KIAlyZXR1cm4gcmM7CiB9CiAKLWludCBlbTI4eHhfdmJpX3N1cHBvcnRlZChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JLyogTW9kcHJvYmUgb3B0aW9uIHRvIG1hbnVhbGx5IGRpc2FibGUgKi8KLQlpZiAoZGlzYWJsZV92YmkgPT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2LT5ib2FyZC5pc193ZWJjYW0pCi0JCXJldHVybiAwOwotCi0JLyogRklYTUU6IGNoZWNrIHN1YmRldmljZXMgZm9yIFZCSSBzdXBwb3J0ICovCi0KLQlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODYwIHx8Ci0JICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg4MykKLQkJcmV0dXJuIDE7Ci0KLQkvKiBWZXJzaW9uIG9mIGVtMjh4eCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgVkJJICovCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbTI4eHhfc2V0X291dGZtdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JaW50IHJldDsKLQl1OCBmbXQsIHZpbmN0cmw7Ci0KLQlmbXQgPSBkZXYtPmZvcm1hdC0+cmVnOwotCWlmICghZGV2LT5pc19lbTI1eHgpCi0JCWZtdCB8PSAweDIwOwotCS8qCi0JICogTk9URTogaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyByZWFsbHkgbmVlZGVkICEKLQkgKiBUaGUgZGF0YXNoZWV0cyBzYXkgYml0IDUgaXMgYSByZXNlcnZlZCBiaXQgYW5kIGRldmljZXMgc2VlbSB0byB3b3JrCi0JICogZmluZSB3aXRob3V0IGl0LiBCdXQgdGhlIFdpbmRvd3MgZHJpdmVyIHNldHMgaXQgZm9yIGVtMjcxMC81MCtlbTI4eHgKLQkgKiBkZXZpY2VzIGFuZCB3ZSd2ZSBhbHdheXMgYmVlbiBzZXR0aW5nIGl0LCB0b28uCi0JICoKLQkgKiBlbTI3NjUgKGVtMjV4eCwgZW0yNzZ4Lzd4Lzh4KSBkZXZpY2VzIGRvIE5PVCB3b3JrIHdpdGggdGhpcyBiaXQgc2V0LAotCSAqIGl0J3MgbGlrZWx5IHVzZWQgZm9yIGFuIGFkZGl0aW9uYWwgKGNvbXByZXNzZWQgPykgZm9ybWF0IHRoZXJlLgotCSAqLwotCXJldCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjI3X09VVEZNVCwgZm10KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjEwX1ZJTk1PREUsIGRldi0+dmlubW9kZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl2aW5jdHJsID0gZGV2LT52aW5jdGw7Ci0JaWYgKGVtMjh4eF92Ymlfc3VwcG9ydGVkKGRldikgPT0gMSkgewotCQl2aW5jdHJsIHw9IEVNMjhYWF9WSU5DVFJMX1ZCSV9SQVc7Ci0JCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjM0X1ZCSV9TVEFSVF9ILCAweDAwKTsKLQkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMzZfVkJJX1dJRFRILCBkZXYtPnZiaV93aWR0aC80KTsKLQkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMzdfVkJJX0hFSUdIVCwgZGV2LT52YmlfaGVpZ2h0KTsKLQkJaWYgKGRldi0+bm9ybSAmIFY0TDJfU1REXzUyNV82MCkgewotCQkJLyogTlRTQyAqLwotCQkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMzVfVkJJX1NUQVJUX1YsIDB4MDkpOwotCQl9IGVsc2UgaWYgKGRldi0+bm9ybSAmIFY0TDJfU1REXzYyNV81MCkgewotCQkJLyogUEFMICovCi0JCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IzNV9WQklfU1RBUlRfViwgMHgwNyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTFfVklOQ1RSTCwgdmluY3RybCk7Ci19Ci0KLXN0YXRpYyBpbnQgZW0yOHh4X2FjY3VtdWxhdG9yX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IHhtaW4sIHU4IHhtYXgsCi0JCQkJICB1OCB5bWluLCB1OCB5bWF4KQotewotCWVtMjh4eF9jb3JlZGJnKCJlbTI4eHggU2NhbGU6ICglZCwlZCktKCVkLCVkKVxuIiwKLQkJCXhtaW4sIHltaW4sIHhtYXgsIHltYXgpOwotCi0JZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjI4X1hNSU4sICZ4bWluLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjlfWE1BWCwgJnhtYXgsIDEpOwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyQV9ZTUlOLCAmeW1pbiwgMSk7Ci0JcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyQl9ZTUFYLCAmeW1heCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtMjh4eF9jYXB0dXJlX2FyZWFfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggaHN0YXJ0LCB1OCB2c3RhcnQsCi0JCQkJICAgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0KQotewotCXU4IGN3aWR0aCA9IHdpZHRoID4+IDI7Ci0JdTggY2hlaWdodCA9IGhlaWdodCA+PiAyOwotCXU4IG92ZXJmbG93ID0gKGhlaWdodCA+PiA5ICYgMHgwMikgfCAod2lkdGggPj4gMTAgJiAweDAxKTsKLQkvKiBOT1RFOiBzaXplIGxpbWl0OiAyMDQ3eDEwMjMgPSAyTVBpeCAqLwotCi0JZW0yOHh4X2NvcmVkYmcoImNhcHR1cmUgYXJlYSBzZXQgdG8gKCVkLCVkKTogJWR4JWRcbiIsCi0JCSAgICAgICBoc3RhcnQsIHZzdGFydCwKLQkJICAgICAgICgob3ZlcmZsb3cgJiAyKSA8PCA5IHwgY3dpZHRoIDw8IDIpLAotCQkgICAgICAgKChvdmVyZmxvdyAmIDEpIDw8IDEwIHwgY2hlaWdodCA8PCAyKSk7Ci0KLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMUNfSFNUQVJULCAmaHN0YXJ0LCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMURfVlNUQVJULCAmdnN0YXJ0LCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMUVfQ1dJRFRILCAmY3dpZHRoLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMUZfQ0hFSUdIVCwgJmNoZWlnaHQsIDEpOwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IxQl9PRkxPVywgJm92ZXJmbG93LCAxKTsKLQotCS8qIEZJWE1FOiBmdW5jdGlvbi9tZWFuaW5nIG9mIHRoZXNlIHJlZ2lzdGVycyA/ICovCi0JLyogRklYTUU6IGFsaWduIHdpZHRoK2hlaWdodCB0byBtdWx0aXBsZXMgb2YgNCA/ISAqLwotCWlmIChkZXYtPmlzX2VtMjV4eCkgewotCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgMHgzNCwgd2lkdGggPj4gNCk7Ci0JCWVtMjh4eF93cml0ZV9yZWcoZGV2LCAweDM1LCBoZWlnaHQgPj4gNCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGVtMjh4eF9zY2FsZXJfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTE2IGgsIHUxNiB2KQotewotCXU4IG1vZGU7Ci0JLyogdGhlIGVtMjgwMCBzY2FsZXIgb25seSBzdXBwb3J0cyBzY2FsaW5nIGRvd24gdG8gNTAlICovCi0KLQlpZiAoZGV2LT5ib2FyZC5pc19lbTI4MDApIHsKLQkJbW9kZSA9ICh2ID8gMHgyMCA6IDB4MDApIHwgKGggPyAweDEwIDogMHgwMCk7Ci0JfSBlbHNlIHsKLQkJdTggYnVmWzJdOwotCi0JCWJ1ZlswXSA9IGg7Ci0JCWJ1ZlsxXSA9IGggPj4gODsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjMwX0hTQ0FMRUxPVywgKGNoYXIgKilidWYsIDIpOwotCi0JCWJ1ZlswXSA9IHY7Ci0JCWJ1ZlsxXSA9IHYgPj4gODsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjMyX1ZTQ0FMRUxPVywgKGNoYXIgKilidWYsIDIpOwotCQkvKiBpdCBzZWVtcyB0aGF0IGJvdGggSCBhbmQgViBzY2FsZXJzIG11c3QgYmUgYWN0aXZlCi0JCSAgIHRvIHdvcmsgY29ycmVjdGx5ICovCi0JCW1vZGUgPSAoaCB8fCB2KSA/IDB4MzAgOiAweDAwOwotCX0KLQlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yOFhYX1IyNl9DT01QUiwgbW9kZSwgMHgzMCk7Ci19Ci0KLS8qIEZJWE1FOiB0aGlzIG9ubHkgZnVuY3Rpb24gcmVhZCB2YWx1ZXMgZnJvbSBkZXYgKi8KLWludCBlbTI4eHhfcmVzb2x1dGlvbl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2KQotewotCWludCB3aWR0aCwgaGVpZ2h0OwotCXdpZHRoID0gbm9ybV9tYXh3KGRldik7Ci0JaGVpZ2h0ID0gbm9ybV9tYXhoKGRldik7Ci0KLQkvKiBQcm9wZXJseSBzZXR1cCBWQkkgKi8KLQlkZXYtPnZiaV93aWR0aCA9IDcyMDsKLQlpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKQotCQlkZXYtPnZiaV9oZWlnaHQgPSAxMjsKLQllbHNlCi0JCWRldi0+dmJpX2hlaWdodCA9IDE4OwotCi0JZW0yOHh4X3NldF9vdXRmbXQoZGV2KTsKLQotCWVtMjh4eF9hY2N1bXVsYXRvcl9zZXQoZGV2LCAxLCAod2lkdGggLSA0KSA+PiAyLCAxLCAoaGVpZ2h0IC0gNCkgPj4gMik7Ci0KLQkvKiBJZiB3ZSBkb24ndCBzZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIDIgaW4gVkJJIG1vZGUsIHdlIGVuZCB1cAotCSAgIHdpdGggbGluZSAyMC8yMSBiZWluZyBZVVlWIGVuY29kZWQgaW5zdGVhZCBvZiBiZWluZyBpbiA4LWJpdAotCSAgIGdyZXlzY2FsZS4gIFRoZSBjb3JlIG9mIHRoZSBpc3N1ZSBpcyB0aGF0IGxpbmUgMjEgKGFuZCBsaW5lIDIzIGZvcgotCSAgIFBBTCBXU1MpIGFyZSBpbnNpZGUgb2YgYWN0aXZlIHZpZGVvIHJlZ2lvbiwgYW5kIGFzIGEgcmVzdWx0IHRoZXkKLQkgICBnZXQgdGhlIHBpeGVsZm9ybWF0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhhdCBhcmVhLiAgU28gYnkgY3JvcHBpbmcKLQkgICBpdCBvdXQsIHdlIGVuZCB1cCB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgcmVzdCBvZiB0aGUgVkJJCi0JICAgcmVnaW9uICovCi0JaWYgKGVtMjh4eF92Ymlfc3VwcG9ydGVkKGRldikgPT0gMSkKLQkJZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoZGV2LCAwLCAyLCB3aWR0aCwgaGVpZ2h0KTsKLQllbHNlCi0JCWVtMjh4eF9jYXB0dXJlX2FyZWFfc2V0KGRldiwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0KLQlyZXR1cm4gZW0yOHh4X3NjYWxlcl9zZXQoZGV2LCBkZXYtPmhzY2FsZSwgZGV2LT52c2NhbGUpOwotfQotCi0vKiBTZXQgVVNCIGFsdGVybmF0ZSBzZXR0aW5nIGZvciBhbmFsb2cgdmlkZW8gKi8KLWludCBlbTI4eHhfc2V0X2FsdGVybmF0ZShzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JaW50IGVyckNvZGU7Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IG1pbl9wa3Rfc2l6ZSA9IGRldi0+d2lkdGggKiAyICsgNDsKLQotCS8qIE5PVEU6IGZvciBpc29jIHRyYW5zZmVycywgb25seSBhbHQgc2V0dGluZ3MgPiAwIGFyZSBhbGxvd2VkCi0JCSBidWxrIHRyYW5zZmVycyBzZWVtIHRvIHdvcmsgb25seSB3aXRoIGFsdD0wICEgKi8KLQlkZXYtPmFsdCA9IDA7Ci0JaWYgKChhbHQgPiAwKSAmJiAoYWx0IDwgZGV2LT5udW1fYWx0KSkgewotCQllbTI4eHhfY29yZWRiZygiYWx0ZXJuYXRlIGZvcmNlZCB0byAlZFxuIiwgZGV2LT5hbHQpOwotCQlkZXYtPmFsdCA9IGFsdDsKLQkJZ290byBzZXRfYWx0OwotCX0KLQlpZiAoZGV2LT5hbmFsb2dfeGZlcl9idWxrKQotCQlnb3RvIHNldF9hbHQ7Ci0KLQkvKiBXaGVuIGltYWdlIHNpemUgaXMgYmlnZ2VyIHRoYW4gYSBjZXJ0YWluIHZhbHVlLAotCSAgIHRoZSBmcmFtZSBzaXplIHNob3VsZCBiZSBpbmNyZWFzZWQsIG90aGVyd2lzZSwgb25seQotCSAgIGdyZWVuIHNjcmVlbiB3aWxsIGJlIHJlY2VpdmVkLgotCSAqLwotCWlmIChkZXYtPndpZHRoICogMiAqIGRldi0+aGVpZ2h0ID4gNzIwICogMjQwICogMikKLQkJbWluX3BrdF9zaXplICo9IDI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWx0OyBpKyspIHsKLQkJLyogc3RvcCB3aGVuIHRoZSBzZWxlY3RlZCBhbHQgc2V0dGluZyBvZmZlcnMgZW5vdWdoIGJhbmR3aWR0aCAqLwotCQlpZiAoZGV2LT5hbHRfbWF4X3BrdF9zaXplX2lzb2NbaV0gPj0gbWluX3BrdF9zaXplKSB7Ci0JCQlkZXYtPmFsdCA9IGk7Ci0JCQlicmVhazsKLQkJLyogb3RoZXJ3aXNlIG1ha2Ugc3VyZSB0aGF0IHdlIGVuZCB1cCB3aXRoIHRoZSBtYXhpbXVtIGJhbmR3aWR0aAotCQkgICBiZWNhdXNlIHRoZSBtaW5fcGt0X3NpemUgZXF1YXRpb24gbWlnaHQgYmUgd3JvbmcuLi4KLQkJKi8KLQkJfSBlbHNlIGlmIChkZXYtPmFsdF9tYXhfcGt0X3NpemVfaXNvY1tpXSA+Ci0JCQkgICBkZXYtPmFsdF9tYXhfcGt0X3NpemVfaXNvY1tkZXYtPmFsdF0pCi0JCQlkZXYtPmFsdCA9IGk7Ci0JfQotCi1zZXRfYWx0OgotCS8qIE5PVEU6IGZvciBidWxrIHRyYW5zZmVycywgd2UgbmVlZCB0byBjYWxsIHVzYl9zZXRfaW50ZXJmYWNlKCkKLQkgKiBldmVuIGlmIHRoZSBwcmV2aW91cyBzZXR0aW5ncyB3ZXJlIHRoZSBzYW1lLiBPdGhlcndpc2Ugc3RyZWFtaW5nCi0JICogZmFpbHMgd2l0aCBhbGwgdXJicyBoYXZpbmcgc3RhdHVzID0gLUVPVkVSRkxPVyAhICovCi0JaWYgKGRldi0+YW5hbG9nX3hmZXJfYnVsaykgewotCQlkZXYtPm1heF9wa3Rfc2l6ZSA9IDUxMjsgLyogVVNCIDIuMCBzcGVjICovCi0JCWRldi0+cGFja2V0X211bHRpcGxpZXIgPSBFTTI4WFhfQlVMS19QQUNLRVRfTVVMVElQTElFUjsKLQl9IGVsc2UgeyAvKiBpc29jICovCi0JCWVtMjh4eF9jb3JlZGJnKCJtaW5pbXVtIGlzb2MgcGFja2V0IHNpemU6ICV1IChhbHQ9JWQpXG4iLAotCQkJICAgICAgIG1pbl9wa3Rfc2l6ZSwgZGV2LT5hbHQpOwotCQlkZXYtPm1heF9wa3Rfc2l6ZSA9Ci0JCQkJICBkZXYtPmFsdF9tYXhfcGt0X3NpemVfaXNvY1tkZXYtPmFsdF07Ci0JCWRldi0+cGFja2V0X211bHRpcGxpZXIgPSBFTTI4WFhfTlVNX0lTT0NfUEFDS0VUUzsKLQl9Ci0JZW0yOHh4X2NvcmVkYmcoInNldHRpbmcgYWx0ZXJuYXRlICVkIHdpdGggd01heFBhY2tldFNpemU9JXVcbiIsCi0JCSAgICAgICBkZXYtPmFsdCwgZGV2LT5tYXhfcGt0X3NpemUpOwotCWVyckNvZGUgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIDAsIGRldi0+YWx0KTsKLQlpZiAoZXJyQ29kZSA8IDApIHsKLQkJZW0yOHh4X2VycmRldigiY2Fubm90IGNoYW5nZSBhbHRlcm5hdGUgbnVtYmVyIHRvICVkIChlcnJvcj0laSlcbiIsCi0JCQkgICAgICBkZXYtPmFsdCwgZXJyQ29kZSk7Ci0JCXJldHVybiBlcnJDb2RlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogaW50IGVtMjh4eF9ncGlvX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSAqZ3BpbykKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMTIzOCwxOCArMTA0MCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfaW5pdF91c2JfeGZlcik7CiAKIC8qCi0gKiBlbTI4eHhfd2FrZV9pMmMoKQotICogY29uZmlndXJlIGkyYyBhdHRhY2hlZCBkZXZpY2VzCi0gKi8KLXZvaWQgZW0yOHh4X3dha2VfaTJjKHN0cnVjdCBlbTI4eHggKmRldikKLXsKLQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgY29yZSwgIHJlc2V0LCAwKTsKLQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdmlkZW8sIHNfcm91dGluZywKLQkJCUlOUFVUKGRldi0+Y3RsX2lucHV0KS0+dm11eCwgMCwgMCk7Ci0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHZpZGVvLCBzX3N0cmVhbSwgMCk7Ci19Ci0KLS8qCiAgKiBEZXZpY2UgY29udHJvbCBsaXN0CiAgKi8KIApAQCAtMTI3Miw3ICsxMDYyLDcgQEAKIAkJb3BzLT5pbml0KGRldik7CiAJfQogCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCXByaW50ayhLRVJOX0lORk8gIkVtMjh4eDogSW5pdGlhbGl6ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4OiBSZWdpc3RlcmVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChlbTI4eHhfcmVnaXN0ZXJfZXh0ZW5zaW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWR2Yi5jCmluZGV4IDM0NDA0MmIuLmEwYTY2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1kdmIuYwpAQCAtNTEsMTAgKzUxLDE0IEBACiAjaW5jbHVkZSAiYTgyOTMuaCIKICNpbmNsdWRlICJxdDEwMTAuaCIKICNpbmNsdWRlICJtYjg2YTIwcy5oIgorI2luY2x1ZGUgIm04OGRzMzEwMy5oIgorI2luY2x1ZGUgIm04OHRzMjAyMi5oIgogCi1NT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgZW0yOHh4IGJhc2VkIERWQiBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MgIiAtIGRpZ2l0YWwgVFYgaW50ZXJmYWNlIik7CitNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CisKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTg3LDYgKzkxLDcgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgcGxsX211dGV4OwogCWJvb2wJCQlkb250X2F0dGFjaF9mZTE7CiAJaW50CQkJbG5hX2dwaW87CisJc3RydWN0IGkyY19jbGllbnQJKmkyY19jbGllbnRfdHVuZXI7CiB9OwogCiAKQEAgLTE5OCw3ICsyMDMsNyBAQAogCQlkdmJfYWx0ID0gZGV2LT5kdmJfYWx0X2lzb2M7CiAJfQogCi0JdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LCAwLCBkdmJfYWx0KTsKKwl1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGRldi0+aWZudW0sIGR2Yl9hbHQpOwogCXJjID0gZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwpAQCAtMjcxLDcgKzI3Niw3IEBACiBzdGF0aWMgaW50IGVtMjh4eF9kdmJfYnVzX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBhY3F1aXJlKQogewogCXN0cnVjdCBlbTI4eHhfaTJjX2J1cyAqaTJjX2J1cyA9IGZlLT5kdmItPnByaXY7Ci0gICAgICAgIHN0cnVjdCBlbTI4eHggKmRldiA9IGkyY19idXMtPmRldjsKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBpMmNfYnVzLT5kZXY7CiAKIAlpZiAoYWNxdWlyZSkKIAkJcmV0dXJuIGVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9ESUdJVEFMX01PREUpOwpAQCAtMzcwLDcgKzM3NSw2IEBACiAJLm5vX2kyY19icmlkZ2UgPSAxLAogCS5taWNyb2NvZGVfbmFtZSA9ICJkdmItdXNiLXRlcnJhdGVjLWg1LWRyeGsuZnciLAogCS5xYW1fZGVtb2RfcGFyYW1ldGVyX2NvdW50ID0gMiwKLQkubG9hZF9maXJtd2FyZV9zeW5jID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJ4a19jb25maWcgaGF1cHBhdWdlXzkzMGNfZHJ4ayA9IHsKQEAgLTM4MCw3ICszODQsNiBAQAogCS5taWNyb2NvZGVfbmFtZSA9ICJkdmItdXNiLWhhdXBwYXVnZS1odnI5MzBjLWRyeGsuZnciLAogCS5jaHVua19zaXplID0gNTYsCiAJLnFhbV9kZW1vZF9wYXJhbWV0ZXJfY291bnQgPSAyLAotCS5sb2FkX2Zpcm13YXJlX3N5bmMgPSB0cnVlLAogfTsKIAogc3RhdGljIHN0cnVjdCBkcnhrX2NvbmZpZyB0ZXJyYXRlY19odGNfc3RpY2tfZHJ4ayA9IHsKQEAgLTM5NCw3ICszOTcsNiBAQAogCS5hbnRlbm5hX2R2YnQgPSB0cnVlLAogCS8qIFRoZSB3aW5kb3dzIGRyaXZlciB1c2VzIHRoZSBzYW1lLiBUaGlzIHdpbGwgZGlzYWJsZSBMTkEuICovCiAJLmFudGVubmFfZ3BpbyA9IDB4NiwKLQkubG9hZF9maXJtd2FyZV9zeW5jID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJ4a19jb25maWcgbWF4bWVkaWFfdWI0MjVfdGNfZHJ4ayA9IHsKQEAgLTQwMyw3ICs0MDUsNiBAQAogCS5ub19pMmNfYnJpZGdlID0gMSwKIAkubWljcm9jb2RlX25hbWUgPSAiZHZiLWRlbW9kLWRyeGstMDEuZnciLAogCS5jaHVua19zaXplID0gNjIsCi0JLmxvYWRfZmlybXdhcmVfc3luYyA9IHRydWUsCiAJLnFhbV9kZW1vZF9wYXJhbWV0ZXJfY291bnQgPSAyLAogfTsKIApAQCAtNDE1LDcgKzQxNiw2IEBACiAJLmNodW5rX3NpemUgPSA1OCwKIAkuYW50ZW5uYV9kdmJ0ID0gdHJ1ZSwgLyogZGlzYWJsZSBMTkEgKi8KIAkuYW50ZW5uYV9ncGlvID0gKDEgPDwgMiksIC8qIGRpc2FibGUgTE5BICovCi0JLmxvYWRfZmlybXdhcmVfc3luYyA9IHRydWUsCiB9OwogCiBzdGF0aWMgaW50IGRyeGtfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQpAQCAtODA4LDYgKzgwOCwxNCBAQAogCS5zbWFsbF9pMmMgPSBUREExODI3MV8wM19CWVRFX0NIVU5LX0lOSVQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG04OGRzMzEwM19jb25maWcgcGN0dl80NjFlX204OGRzMzEwM19jb25maWcgPSB7CisJLmkyY19hZGRyID0gMHg2OCwKKwkuY2xvY2sgPSAyNzAwMDAwMCwKKwkuaTJjX3dyX21heCA9IDMzLAorCS5jbG9ja19vdXQgPSAwLAorCS50c19tb2RlID0gTTg4RFMzMTAzX1RTX1BBUkFMTEVMXzE2LAorCS5hZ2MgPSAweDk5LAorfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTgxNSwxMSArODIzLDE2IEBACiB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CiAJc3RydWN0IHhjMjAyOF9jb25maWcgY2ZnOworCXN0cnVjdCB4YzIwMjhfY3RybCBjdGw7CiAKIAltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwogCWNmZy5pMmNfYWRhcCAgPSAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXTsKIAljZmcuaTJjX2FkZHIgID0gYWRkcjsKIAorCW1lbXNldCgmY3RsLCAwLCBzaXplb2YoY3RsKSk7CisJZW0yOHh4X3NldHVwX3hjMzAyOChkZXYsICZjdGwpOworCWNmZy5jdHJsICA9ICZjdGw7CisKIAlpZiAoIWRldi0+ZHZiLT5mZVswXSkgewogCQllbTI4eHhfZXJyZGV2KCIvMjogZHZiIGZyb250ZW5kIG5vdCBhdHRhY2hlZC4gIgogCQkJCSJDYW4ndCBhdHRhY2ggeGMzMDI4XG4iKTsKQEAgLTk3OSwxMiArOTkyLDE4IEBACiAJaW50IHJlc3VsdCA9IDAsIG1mZV9zaGFyZWQgPSAwOwogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmI7CiAKLQlpZiAoIWRldi0+Ym9hcmQuaGFzX2R2YikgewotCQkvKiBUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBleHRlbnNpb24gKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4X2R2YjogVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uXG4iKTsKKwlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7CisJCS8qIFNob3VsZG4ndCBpbml0aWFsaXplIElSIGZvciB0aGlzIGludGVyZmFjZSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoIWRldi0+Ym9hcmQuaGFzX2R2YikgeworCQkvKiBUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBleHRlbnNpb24gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJZW0yOHh4X2luZm8oIkJpbmRpbmcgRFZCIGV4dGVuc2lvblxuIik7CisKIAlkdmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW0yOHh4X2R2YiksIEdGUF9LRVJORUwpOwogCiAJaWYgKGR2YiA9PSBOVUxMKSB7CkBAIC05OTQsNiArMTAxMywyNyBAQAogCWRldi0+ZHZiID0gZHZiOwogCWR2Yi0+ZmVbMF0gPSBkdmItPmZlWzFdID0gTlVMTDsKIAorCS8qIHByZS1hbGxvY2F0ZSBEVkIgdXNiIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KKwlpZiAoZGV2LT5kdmJfeGZlcl9idWxrKSB7CisJCXJlc3VsdCA9IGVtMjh4eF9hbGxvY191cmJzKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSwKKwkJCQkJICAgZGV2LT5kdmJfeGZlcl9idWxrLAorCQkJCQkgICBFTTI4WFhfRFZCX05VTV9CVUZTLAorCQkJCQkgICA1MTIsCisJCQkJCSAgIEVNMjhYWF9EVkJfQlVMS19QQUNLRVRfTVVMVElQTElFUik7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gZW0yOHh4X2FsbG9jX3VyYnMoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFLAorCQkJCQkgICBkZXYtPmR2Yl94ZmVyX2J1bGssCisJCQkJCSAgIEVNMjhYWF9EVkJfTlVNX0JVRlMsCisJCQkJCSAgIGRldi0+ZHZiX21heF9wa3Rfc2l6ZV9pc29jLAorCQkJCQkgICBFTTI4WFhfRFZCX05VTV9JU09DX1BBQ0tFVFMpOworCX0KKwlpZiAocmVzdWx0KSB7CisJCWVtMjh4eF9lcnJkZXYoImVtMjh4eF9kdmI6IGZhaWxlZCB0byBwcmUtYWxsb2NhdGUgVVNCIHRyYW5zZmVyIGJ1ZmZlcnMgZm9yIERWQi5cbiIpOworCQlrZnJlZShkdmIpOworCQlkZXYtPmR2YiA9IE5VTEw7CisJCXJldHVybiByZXN1bHQ7CisJfQorCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFKTsKIAkvKiBpbml0IGZyb250ZW5kICovCkBAIC0xMzMwLDYgKzEzNzAsNDggQEAKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBFTTI4MTc4X0JPQVJEX1BDVFZfNDYxRToKKwkJeworCQkJLyogZGVtb2QgSTJDIGFkYXB0ZXIgKi8KKwkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXB0ZXI7CisJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwkJCXN0cnVjdCBtODh0czIwMjJfY29uZmlnIG04OHRzMjAyMl9jb25maWcgPSB7CisJCQkJLmNsb2NrID0gMjcwMDAwMDAsCisJCQl9OworCQkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisKKwkJCS8qIGF0dGFjaCBkZW1vZCAqLworCQkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2gobTg4ZHMzMTAzX2F0dGFjaCwKKwkJCQkJJnBjdHZfNDYxZV9tODhkczMxMDNfY29uZmlnLAorCQkJCQkmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKKwkJCQkJJmkyY19hZGFwdGVyKTsKKwkJCWlmIChkdmItPmZlWzBdID09IE5VTEwpIHsKKwkJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisKKwkJCS8qIGF0dGFjaCB0dW5lciAqLworCQkJbTg4dHMyMDIyX2NvbmZpZy5mZSA9IGR2Yi0+ZmVbMF07CisJCQlzdHJsY3B5KGluZm8udHlwZSwgIm04OHRzMjAyMiIsIEkyQ19OQU1FX1NJWkUpOworCQkJaW5mby5hZGRyID0gMHg2MDsKKwkJCWluZm8ucGxhdGZvcm1fZGF0YSA9ICZtODh0czIwMjJfY29uZmlnOworCQkJcmVxdWVzdF9tb2R1bGUoIm04OHRzMjAyMiIpOworCQkJZHZiLT5pMmNfY2xpZW50X3R1bmVyID0gaTJjX25ld19kZXZpY2UoaTJjX2FkYXB0ZXIsICZpbmZvKTsKKworCQkJLyogZGVsZWdhdGUgc2lnbmFsIHN0cmVuZ3RoIG1lYXN1cmVtZW50IHRvIHR1bmVyICovCisJCQlkdmItPmZlWzBdLT5vcHMucmVhZF9zaWduYWxfc3RyZW5ndGggPQorCQkJCQlkdmItPmZlWzBdLT5vcHMudHVuZXJfb3BzLmdldF9yZl9zdHJlbmd0aDsKKworCQkJLyogYXR0YWNoIFNFQyAqLworCQkJaWYgKCFkdmJfYXR0YWNoKGE4MjkzX2F0dGFjaCwgZHZiLT5mZVswXSwKKwkJCQkJJmRldi0+aTJjX2FkYXBbZGV2LT5kZWZfaTJjX2J1c10sCisJCQkJCSZlbTI4eHhfYTgyOTNfY29uZmlnKSkgeworCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVswXSk7CisJCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVtMjh4eF9lcnJkZXYoIi8yOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIgogCQkJCSIgaXNuJ3Qgc3VwcG9ydGVkIHlldFxuIik7CkBAIC0xMzU0LDcgKzE0MzYsNyBAQAogCS8qIE1GRSBsb2NrICovCiAJZHZiLT5hZGFwdGVyLm1mZV9zaGFyZWQgPSBtZmVfc2hhcmVkOwogCi0JZW0yOHh4X2luZm8oIlN1Y2Nlc3NmdWxseSBsb2FkZWQgZW0yOHh4LWR2YlxuIik7CisJZW0yOHh4X2luZm8oIkRWQiBleHRlbnNpb24gc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkXG4iKTsKIHJldDoKIAllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfU1VTUEVORCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwpAQCAtMTM3NSwxNCArMTQ1NywyMyBAQAogCiBzdGF0aWMgaW50IGVtMjh4eF9kdmJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CisJaWYgKGRldi0+aXNfYXVkaW9fb25seSkgeworCQkvKiBTaG91bGRuJ3QgaW5pdGlhbGl6ZSBJUiBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKCFkZXYtPmJvYXJkLmhhc19kdmIpIHsKIAkJLyogVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uICovCiAJCXJldHVybiAwOwogCX0KIAorCWVtMjh4eF9pbmZvKCJDbG9zaW5nIERWQiBleHRlbnNpb24iKTsKKwogCWlmIChkZXYtPmR2YikgewogCQlzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiID0gZGV2LT5kdmI7CiAKKwkJZW0yOHh4X3VuaW5pdF91c2JfeGZlcihkZXYsIEVNMjhYWF9ESUdJVEFMX01PREUpOworCiAJCWlmIChkZXYtPmRpc2Nvbm5lY3RlZCkgewogCQkJLyogV2UgY2Fubm90IHRlbGwgdGhlIGRldmljZSB0byBzbGVlcAogCQkJICogb25jZSBpdCBoYXMgYmVlbiB1bnBsdWdnZWQuICovCkBAIC0xMzkyLDYgKzE0ODMsNyBAQAogCQkJCXByZXZlbnRfc2xlZXAoJmR2Yi0+ZmVbMV0tPm9wcyk7CiAJCX0KIAorCQlpMmNfcmVsZWFzZV9jbGllbnQoZHZiLT5pMmNfY2xpZW50X3R1bmVyKTsKIAkJZW0yOHh4X3VucmVnaXN0ZXJfZHZiKGR2Yik7CiAJCWtmcmVlKGR2Yik7CiAJCWRldi0+ZHZiID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWkyYy5jCmluZGV4IGM0ZmY5NzMuLjdlMTcyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1pMmMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgImVtMjh4eC5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgpAQCAtNDAsNyArNDEsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGkyY19kZWJ1ZzsKIG1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGkyY19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbaTJjXSIpOworTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsICJpMmMgZGVidWcgbWVzc2FnZSBsZXZlbCAoMTogbm9ybWFsIGRlYnVnLCAyOiBzaG93IEkyQyB0cmFuc2ZlcnMpIik7CiAKIC8qCiAgKiBlbTI4MDBfaTJjX3NlbmRfYnl0ZXMoKQpAQCAtNDgsOCArNDksOCBAQAogICovCiBzdGF0aWMgaW50IGVtMjgwMF9pMmNfc2VuZF9ieXRlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCiB7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRU0yOFhYX0kyQ19YRkVSX1RJTUVPVVQpOwogCWludCByZXQ7Ci0JaW50IHdyaXRlX3RpbWVvdXQ7CiAJdTggYjJbNl07CiAKIAlpZiAobGVuIDwgMSB8fCBsZW4gPiA0KQpAQCAtNzQsMjIgKzc1LDI2IEBACiAJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRUlPOwogCX0KIAkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JZm9yICh3cml0ZV90aW1lb3V0ID0gRU0yODAwX0kyQ19YRkVSX1RJTUVPVVQ7IHdyaXRlX3RpbWVvdXQgPiAwOwotCSAgICAgd3JpdGVfdGltZW91dCAtPSA1KSB7CisJd2hpbGUgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0aW1lb3V0KSkgewogCQlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZyhkZXYsIDB4MDUpOwotCQlpZiAocmV0ID09IDB4ODAgKyBsZW4gLSAxKSB7CisJCWlmIChyZXQgPT0gMHg4MCArIGxlbiAtIDEpCiAJCQlyZXR1cm4gbGVuOwotCQl9IGVsc2UgaWYgKHJldCA9PSAweDk0ICsgbGVuIC0gMSkgewotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IDB4OTQgKyBsZW4gLSAxKSB7CisJCQlpZiAoaTJjX2RlYnVnID09IDEpCisJCQkJZW0yOHh4X3dhcm4oIlIwNSByZXR1cm5lZCAweCUwMng6IEkyQyB0aW1lb3V0IiwKKwkJCQkJICAgIHJldCk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWlmIChyZXQgPCAwKSB7CiAJCQllbTI4eHhfd2FybigiZmFpbGVkIHRvIGdldCBpMmMgdHJhbnNmZXIgc3RhdHVzIGZyb20gYnJpZGdlIHJlZ2lzdGVyIChlcnJvcj0laSlcbiIsCiAJCQkJICAgIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCW1zbGVlcCg1KTsKIAl9Ci0JZW0yOHh4X3dhcm4oIndyaXRlIHRvIGkyYyBkZXZpY2UgYXQgMHgleCB0aW1lZCBvdXRcbiIsIGFkZHIpOwotCXJldHVybiAtRUlPOworCWlmIChpMmNfZGVidWcpCisJCWVtMjh4eF93YXJuKCJ3cml0ZSB0byBpMmMgZGV2aWNlIGF0IDB4JXggdGltZWQgb3V0XG4iLCBhZGRyKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAogLyoKQEAgLTk4LDkgKzEwMyw5IEBACiAgKi8KIHN0YXRpYyBpbnQgZW0yODAwX2kyY19yZWN2X2J5dGVzKHN0cnVjdCBlbTI4eHggKmRldiwgdTggYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhFTTI4WFhfSTJDX1hGRVJfVElNRU9VVCk7CiAJdTggYnVmMls0XTsKIAlpbnQgcmV0OwotCWludCByZWFkX3RpbWVvdXQ7CiAJaW50IGk7CiAKIAlpZiAobGVuIDwgMSB8fCBsZW4gPiA0KQpAQCAtMTE3LDIyICsxMjIsMjggQEAKIAl9CiAKIAkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JZm9yIChyZWFkX3RpbWVvdXQgPSBFTTI4MDBfSTJDX1hGRVJfVElNRU9VVDsgcmVhZF90aW1lb3V0ID4gMDsKLQkgICAgIHJlYWRfdGltZW91dCAtPSA1KSB7CisJd2hpbGUgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0aW1lb3V0KSkgewogCQlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZyhkZXYsIDB4MDUpOwotCQlpZiAocmV0ID09IDB4ODQgKyBsZW4gLSAxKSB7CisJCWlmIChyZXQgPT0gMHg4NCArIGxlbiAtIDEpCiAJCQlicmVhazsKLQkJfSBlbHNlIGlmIChyZXQgPT0gMHg5NCArIGxlbiAtIDEpIHsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA9PSAweDk0ICsgbGVuIC0gMSkgeworCQkJaWYgKGkyY19kZWJ1ZyA9PSAxKQorCQkJCWVtMjh4eF93YXJuKCJSMDUgcmV0dXJuZWQgMHglMDJ4OiBJMkMgdGltZW91dCIsCisJCQkJCSAgICByZXQpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlpZiAocmV0IDwgMCkgewogCQkJZW0yOHh4X3dhcm4oImZhaWxlZCB0byBnZXQgaTJjIHRyYW5zZmVyIHN0YXR1cyBmcm9tIGJyaWRnZSByZWdpc3RlciAoZXJyb3I9JWkpXG4iLAogCQkJCSAgICByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCQltc2xlZXAoNSk7CiAJfQotCWlmIChyZXQgIT0gMHg4NCArIGxlbiAtIDEpCi0JCWVtMjh4eF93YXJuKCJyZWFkIGZyb20gaTJjIGRldmljZSBhdCAweCV4IHRpbWVkIG91dFxuIiwgYWRkcik7CisJaWYgKHJldCAhPSAweDg0ICsgbGVuIC0gMSkgeworCQlpZiAoaTJjX2RlYnVnKQorCQkJZW0yOHh4X3dhcm4oInJlYWQgZnJvbSBpMmMgZGV2aWNlIGF0IDB4JXggdGltZWQgb3V0XG4iLAorCQkJCSAgICBhZGRyKTsKKwl9CiAKIAkvKiBnZXQgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgKi8KIAlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZ19yZXFfbGVuKGRldiwgMHgwMCwgNC1sZW4sIGJ1ZjIsIGxlbik7CkBAIC0xNjgsNyArMTc5LDggQEAKIHN0YXRpYyBpbnQgZW0yOHh4X2kyY19zZW5kX2J5dGVzKHN0cnVjdCBlbTI4eHggKmRldiwgdTE2IGFkZHIsIHU4ICpidWYsCiAJCQkJIHUxNiBsZW4sIGludCBzdG9wKQogewotCWludCB3cml0ZV90aW1lb3V0LCByZXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRU0yOFhYX0kyQ19YRkVSX1RJTUVPVVQpOworCWludCByZXQ7CiAKIAlpZiAobGVuIDwgMSB8fCBsZW4gPiA2NCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTkxLDE2ICsyMDMsMTkgQEAKIAkJfQogCX0KIAotCS8qIENoZWNrIHN1Y2Nlc3Mgb2YgdGhlIGkyYyBvcGVyYXRpb24gKi8KLQlmb3IgKHdyaXRlX3RpbWVvdXQgPSBFTTI4MDBfSTJDX1hGRVJfVElNRU9VVDsgd3JpdGVfdGltZW91dCA+IDA7Ci0JICAgICB3cml0ZV90aW1lb3V0IC09IDUpIHsKKwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisJd2hpbGUgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0aW1lb3V0KSkgewogCQlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZyhkZXYsIDB4MDUpOwotCQlpZiAocmV0ID09IDApIHsgLyogc3VjY2VzcyAqLworCQlpZiAocmV0ID09IDApIC8qIHN1Y2Nlc3MgKi8KIAkJCXJldHVybiBsZW47Ci0JCX0gZWxzZSBpZiAocmV0ID09IDB4MTApIHsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKLQkJCWVtMjh4eF93YXJuKCJmYWlsZWQgdG8gcmVhZCBpMmMgdHJhbnNmZXIgc3RhdHVzIGZyb20gYnJpZGdlIChlcnJvcj0laSlcbiIsCisJCWlmIChyZXQgPT0gMHgxMCkgeworCQkJaWYgKGkyY19kZWJ1ZyA9PSAxKQorCQkJCWVtMjh4eF93YXJuKCJJMkMgdHJhbnNmZXIgdGltZW91dCBvbiB3cml0aW5nIHRvIGFkZHIgMHglMDJ4IiwKKwkJCQkJICAgIGFkZHIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlpZiAocmV0IDwgMCkgeworCQkJZW0yOHh4X3dhcm4oImZhaWxlZCB0byBnZXQgaTJjIHRyYW5zZmVyIHN0YXR1cyBmcm9tIGJyaWRnZSByZWdpc3RlciAoZXJyb3I9JWkpXG4iLAogCQkJCSAgICByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMjExLDggKzIyNiwxMCBAQAogCQkgKiAoZXZlbiB3aXRoIGhpZ2ggcGF5bG9hZCkgLi4uCiAJCSAqLwogCX0KLQllbTI4eHhfd2Fybigid3JpdGUgdG8gaTJjIGRldmljZSBhdCAweCV4IHRpbWVkIG91dFxuIiwgYWRkcik7Ci0JcmV0dXJuIC1FSU87CisJaWYgKGkyY19kZWJ1ZykKKwkJZW0yOHh4X3dhcm4oIndyaXRlIHRvIGkyYyBkZXZpY2UgYXQgMHgleCB0aW1lZCBvdXQgKHN0YXR1cz0laSlcbiIsCisJCQkgICAgYWRkciwgcmV0KTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAogLyoKQEAgLTI0MiwyNiArMjU5LDI4IEBACiAJICogYnl0ZXMgaWYgd2UgYXJlIG9uIGJ1cyBCIEFORCB0aGVyZSB3YXMgbm8gd3JpdGUgYXR0ZW1wdCB0byB0aGUKIAkgKiBzcGVjaWZpZWQgc2xhdmUgYWRkcmVzcyBiZWZvcmUgQU5EIG5vIGRldmljZSBpcyBwcmVzZW50IGF0IHRoZQogCSAqIHJlcXVlc3RlZCBzbGF2ZSBhZGRyZXNzLgotCSAqIEFueXdheSwgdGhlIG5leHQgY2hlY2sgd2lsbCBmYWlsIHdpdGggLUVOT0RFViBpbiB0aGlzIGNhc2UsIHNvIGF2b2lkCisJICogQW55d2F5LCB0aGUgbmV4dCBjaGVjayB3aWxsIGZhaWwgd2l0aCAtRU5YSU8gaW4gdGhpcyBjYXNlLCBzbyBhdm9pZAogCSAqIHNwYW1taW5nIHRoZSBzeXN0ZW0gbG9nIG9uIGRldmljZSBwcm9iaW5nIGFuZCBkbyBub3RoaW5nIGhlcmUuCiAJICovCiAKIAkvKiBDaGVjayBzdWNjZXNzIG9mIHRoZSBpMmMgb3BlcmF0aW9uICovCiAJcmV0ID0gZGV2LT5lbTI4eHhfcmVhZF9yZWcoZGV2LCAweDA1KTsKKwlpZiAocmV0ID09IDApIC8qIHN1Y2Nlc3MgKi8KKwkJcmV0dXJuIGxlbjsKIAlpZiAocmV0IDwgMCkgewotCQllbTI4eHhfd2FybigiZmFpbGVkIHRvIHJlYWQgaTJjIHRyYW5zZmVyIHN0YXR1cyBmcm9tIGJyaWRnZSAoZXJyb3I9JWkpXG4iLAorCQllbTI4eHhfd2FybigiZmFpbGVkIHRvIGdldCBpMmMgdHJhbnNmZXIgc3RhdHVzIGZyb20gYnJpZGdlIHJlZ2lzdGVyIChlcnJvcj0laSlcbiIsCiAJCQkgICAgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKHJldCA+IDApIHsKLQkJaWYgKHJldCA9PSAweDEwKSB7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfSBlbHNlIHsKLQkJCWVtMjh4eF93YXJuKCJ1bmtub3duIGkyYyBlcnJvciAoc3RhdHVzPSVpKVxuIiwgcmV0KTsKLQkJCXJldHVybiAtRUlPOwotCQl9CisJaWYgKHJldCA9PSAweDEwKSB7CisJCWlmIChpMmNfZGVidWcgPT0gMSkKKwkJCWVtMjh4eF93YXJuKCJJMkMgdHJhbnNmZXIgdGltZW91dCBvbiB3cml0aW5nIHRvIGFkZHIgMHglMDJ4IiwKKwkJCQkgICAgYWRkcik7CisJCXJldHVybiAtRU5YSU87CiAJfQotCXJldHVybiBsZW47CisKKwllbTI4eHhfd2FybigidW5rbm93biBpMmMgZXJyb3IgKHN0YXR1cz0laSlcbiIsIHJldCk7CisJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKIC8qCkBAIC0zMTYsOCArMzM1LDEyIEBACiAJICovCiAJaWYgKCFyZXQpCiAJCXJldHVybiBsZW47Ci0JZWxzZSBpZiAocmV0ID4gMCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAocmV0ID4gMCkgeworCQlpZiAoaTJjX2RlYnVnID09IDEpCisJCQllbTI4eHhfd2FybigiQnVzIEIgUjA4IHJldHVybmVkIDB4JTAyeDogSTJDIHRpbWVvdXQiLAorCQkJCSAgICByZXQpOworCQlyZXR1cm4gLUVOWElPOworCX0KIAogCXJldHVybiByZXQ7CiAJLyoKQEAgLTM1NSw3ICszNzgsNyBAQAogCSAqIGJ5dGVzIGlmIHdlIGFyZSBvbiBidXMgQiBBTkQgdGhlcmUgd2FzIG5vIHdyaXRlIGF0dGVtcHQgdG8gdGhlCiAJICogc3BlY2lmaWVkIHNsYXZlIGFkZHJlc3MgYmVmb3JlIEFORCBubyBkZXZpY2UgaXMgcHJlc2VudCBhdCB0aGUKIAkgKiByZXF1ZXN0ZWQgc2xhdmUgYWRkcmVzcy4KLQkgKiBBbnl3YXksIHRoZSBuZXh0IGNoZWNrIHdpbGwgZmFpbCB3aXRoIC1FTk9ERVYgaW4gdGhpcyBjYXNlLCBzbyBhdm9pZAorCSAqIEFueXdheSwgdGhlIG5leHQgY2hlY2sgd2lsbCBmYWlsIHdpdGggLUVOWElPIGluIHRoaXMgY2FzZSwgc28gYXZvaWQKIAkgKiBzcGFtbWluZyB0aGUgc3lzdGVtIGxvZyBvbiBkZXZpY2UgcHJvYmluZyBhbmQgZG8gbm90aGluZyBoZXJlLgogCSAqLwogCkBAIC0zNjcsOCArMzkwLDEyIEBACiAJICovCiAJaWYgKCFyZXQpCiAJCXJldHVybiBsZW47Ci0JZWxzZSBpZiAocmV0ID4gMCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAocmV0ID4gMCkgeworCQlpZiAoaTJjX2RlYnVnID09IDEpCisJCQllbTI4eHhfd2FybigiQnVzIEIgUjA4IHJldHVybmVkIDB4JTAyeDogSTJDIHRpbWVvdXQiLAorCQkJCSAgICByZXQpOworCQlyZXR1cm4gLUVOWElPOworCX0KIAogCXJldHVybiByZXQ7CiAJLyoKQEAgLTQwOSwxMCArNDM2LDYgQEAKIAkJcmMgPSBlbTI4MDBfaTJjX2NoZWNrX2Zvcl9kZXZpY2UoZGV2LCBhZGRyKTsKIAllbHNlIGlmIChpMmNfYnVzLT5hbGdvX3R5cGUgPT0gRU0yOFhYX0kyQ19BTEdPX0VNMjVYWF9CVVNfQikKIAkJcmMgPSBlbTI1eHhfYnVzX0JfY2hlY2tfZm9yX2RldmljZShkZXYsIGFkZHIpOwotCWlmIChyYyA9PSAtRU5PREVWKSB7Ci0JCWlmIChpMmNfZGVidWcpCi0JCQlwcmludGsoIiBubyBkZXZpY2VcbiIpOwotCX0KIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQyMSw3ICs0NDQsNyBAQAogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IGkyY19idXMtPmRldjsKIAl1MTYgYWRkciA9IG1zZy5hZGRyIDw8IDE7Ci0JaW50IGJ5dGUsIHJjID0gLUVPUE5PVFNVUFA7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaTJjX2J1cy0+YWxnb190eXBlID09IEVNMjhYWF9JMkNfQUxHT19FTTI4WFgpCiAJCXJjID0gZW0yOHh4X2kyY19yZWN2X2J5dGVzKGRldiwgYWRkciwgbXNnLmJ1ZiwgbXNnLmxlbik7CkBAIC00MjksMTAgKzQ1Miw2IEBACiAJCXJjID0gZW0yODAwX2kyY19yZWN2X2J5dGVzKGRldiwgYWRkciwgbXNnLmJ1ZiwgbXNnLmxlbik7CiAJZWxzZSBpZiAoaTJjX2J1cy0+YWxnb190eXBlID09IEVNMjhYWF9JMkNfQUxHT19FTTI1WFhfQlVTX0IpCiAJCXJjID0gZW0yNXh4X2J1c19CX3JlY3ZfYnl0ZXMoZGV2LCBhZGRyLCBtc2cuYnVmLCBtc2cubGVuKTsKLQlpZiAoaTJjX2RlYnVnKSB7Ci0JCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2cubGVuOyBieXRlKyspCi0JCQlwcmludGsoIiAlMDJ4IiwgbXNnLmJ1ZltieXRlXSk7Ci0JfQogCXJldHVybiByYzsKIH0KIApAQCAtNDQxLDEyICs0NjAsOCBAQAogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IGkyY19idXMtPmRldjsKIAl1MTYgYWRkciA9IG1zZy5hZGRyIDw8IDE7Ci0JaW50IGJ5dGUsIHJjID0gLUVPUE5PVFNVUFA7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CiAKLQlpZiAoaTJjX2RlYnVnKSB7Ci0JCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2cubGVuOyBieXRlKyspCi0JCQlwcmludGsoIiAlMDJ4IiwgbXNnLmJ1ZltieXRlXSk7Ci0JfQogCWlmIChpMmNfYnVzLT5hbGdvX3R5cGUgPT0gRU0yOFhYX0kyQ19BTEdPX0VNMjhYWCkKIAkJcmMgPSBlbTI4eHhfaTJjX3NlbmRfYnl0ZXMoZGV2LCBhZGRyLCBtc2cuYnVmLCBtc2cubGVuLCBzdG9wKTsKIAllbHNlIGlmIChpMmNfYnVzLT5hbGdvX3R5cGUgPT0gRU0yOFhYX0kyQ19BTEdPX0VNMjgwMCkKQEAgLTQ5MSwzMyArNTA2LDUzIEBACiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlhZGRyID0gbXNnc1tpXS5hZGRyIDw8IDE7Ci0JCWlmIChpMmNfZGVidWcpCisJCWlmIChpMmNfZGVidWcgPiAxKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGF0ICVzOiAlcyAlcyBhZGRyPSUwMnggbGVuPSVkOiIsCiAJCQkgICAgICAgZGV2LT5uYW1lLCBfX2Z1bmNfXyAsCiAJCQkgICAgICAgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAogCQkJICAgICAgIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwKIAkJCSAgICAgICBhZGRyLCBtc2dzW2ldLmxlbik7Ci0JCWlmICghbXNnc1tpXS5sZW4pIHsgLyogbm8gbGVuOiBjaGVjayBvbmx5IGZvciBkZXZpY2UgcHJlc2VuY2UgKi8KKwkJaWYgKCFtc2dzW2ldLmxlbikgeworCQkJLyoKKwkJCSAqIG5vIGxlbjogY2hlY2sgb25seSBmb3IgZGV2aWNlIHByZXNlbmNlCisJCQkgKiBUaGlzIGNvZGUgaXMgb25seSBjYWxsZWQgZHVyaW5nIGRldmljZSBwcm9iZS4KKwkJCSAqLwogCQkJcmMgPSBpMmNfY2hlY2tfZm9yX2RldmljZShpMmNfYnVzLCBhZGRyKTsKLQkJCWlmIChyYyA9PSAtRU5PREVWKSB7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJaWYgKHJjID09IC1FTlhJTykgeworCQkJCQlpZiAoaTJjX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0NPTlQgIiBubyBkZXZpY2VcbiIpOworCQkJCQlyYyA9IC1FTk9ERVY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGkyY19kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9DT05UICIgRVJST1I6ICVpXG4iLCByYyk7CisJCQkJfQogCQkJCXJ0X211dGV4X3VubG9jaygmZGV2LT5pMmNfYnVzX2xvY2spOwogCQkJCXJldHVybiByYzsKIAkJCX0KIAkJfSBlbHNlIGlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpIHsKIAkJCS8qIHJlYWQgYnl0ZXMgKi8KIAkJCXJjID0gaTJjX3JlY3ZfYnl0ZXMoaTJjX2J1cywgbXNnc1tpXSk7CisKKwkJCWlmIChpMmNfZGVidWcgPiAxICYmIHJjID49IDApCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUqcGgiLAorCQkJCSAgICAgICBtc2dzW2ldLmxlbiwgbXNnc1tpXS5idWYpOwogCQl9IGVsc2UgeworCQkJaWYgKGkyY19kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUqcGgiLAorCQkJCSAgICAgICBtc2dzW2ldLmxlbiwgbXNnc1tpXS5idWYpOworCiAJCQkvKiB3cml0ZSBieXRlcyAqLwogCQkJcmMgPSBpMmNfc2VuZF9ieXRlcyhpMmNfYnVzLCBtc2dzW2ldLCBpID09IG51bSAtIDEpOwogCQl9CiAJCWlmIChyYyA8IDApIHsKLQkJCWlmIChpMmNfZGVidWcpCi0JCQkJcHJpbnRrKCIgRVJST1I6ICVpXG4iLCByYyk7CisJCQlpZiAoaTJjX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9DT05UICIgRVJST1I6ICVpXG4iLCByYyk7CiAJCQlydF9tdXRleF91bmxvY2soJmRldi0+aTJjX2J1c19sb2NrKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlpZiAoaTJjX2RlYnVnKQotCQkJcHJpbnRrKCJcbiIpOworCQlpZiAoaTJjX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJfQogCiAJcnRfbXV0ZXhfdW5sb2NrKCZkZXYtPmkyY19idXNfbG9jayk7CkBAIC02MDAsNyArNjM1LDcgQEAKIAkgKiBjYWxjdWxhdGlvbiBhbmQgcmV0dXJuZWQgZGV2aWNlIGRhdGFzZXQuIFNpbXBsaWZpZXMgdGhlIGNvZGUgYSBsb3QsCiAJICogYnV0IHdlIG1pZ2h0IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpcGxlIHNpemVzIGluIHRoZSBmdXR1cmUgIQogCSAqLwotCWludCBpLCBlcnI7CisJaW50IGVycjsKIAlzdHJ1Y3QgZW0yOHh4X2VlcHJvbSAqZGV2X2NvbmZpZzsKIAl1OCBidWYsICpkYXRhOwogCkBAIC02MzEsMjAgKzY2NiwxNCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCS8qIERpc3BsYXkgZWVwcm9tIGNvbnRlbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKDAgPT0gKGkgJSAxNikpIHsKLQkJCWlmIChkZXYtPmVlcHJvbV9hZGRyd2lkdGhfMTZiaXQpCi0JCQkJZW0yOHh4X2luZm8oImkyYyBlZXByb20gJTA0eDoiLCBpKTsKLQkJCWVsc2UKLQkJCQllbTI4eHhfaW5mbygiaTJjIGVlcHJvbSAlMDJ4OiIsIGkpOwotCQl9Ci0JCXByaW50aygiICUwMngiLCBkYXRhW2ldKTsKLQkJaWYgKDE1ID09IChpICUgMTYpKQotCQkJcHJpbnRrKCJcbiIpOworCWlmIChpMmNfZGVidWcpIHsKKwkJLyogRGlzcGxheSBlZXByb20gY29udGVudCAqLworCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJlZXByb20gIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJICAgICAgIDE2LCAxLCBkYXRhLCBsZW4sIHRydWUpOworCisJCWlmIChkZXYtPmVlcHJvbV9hZGRyd2lkdGhfMTZiaXQpCisJCQllbTI4eHhfaW5mbygiZWVwcm9tICUwNng6IC4uLiAoc2tpcHBlZClcbiIsIDI1Nik7CiAJfQotCWlmIChkZXYtPmVlcHJvbV9hZGRyd2lkdGhfMTZiaXQpCi0JCWVtMjh4eF9pbmZvKCJpMmMgZWVwcm9tICUwNHg6IC4uLiAoc2tpcHBlZClcbiIsIGkpOwogCiAJaWYgKGRldi0+ZWVwcm9tX2FkZHJ3aWR0aF8xNmJpdCAmJgogCSAgICBkYXRhWzBdID09IDB4MjYgJiYgZGF0YVszXSA9PSAweDAwKSB7CkBAIC03MzYsMTAgKzc2NSwxNiBAQAogCQllbTI4eHhfaW5mbygiXHRBQzk3IGF1ZGlvICg1IHNhbXBsZSByYXRlcylcbiIpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCWVtMjh4eF9pbmZvKCJcdEkyUyBhdWRpbywgc2FtcGxlIHJhdGU9MzJrXG4iKTsKKwkJaWYgKGRldi0+Y2hpcF9pZCA8IENISVBfSURfRU0yODYwKQorCQkJZW0yOHh4X2luZm8oIlx0STJTIGF1ZGlvLCBzYW1wbGUgcmF0ZT0zMmtcbiIpOworCQllbHNlCisJCQllbTI4eHhfaW5mbygiXHRJMlMgYXVkaW8sIDMgc2FtcGxlIHJhdGVzXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQllbTI4eHhfaW5mbygiXHRJMlMgYXVkaW8sIDMgc2FtcGxlIHJhdGVzXG4iKTsKKwkJaWYgKGRldi0+Y2hpcF9pZCA8IENISVBfSURfRU0yODYwKQorCQkJZW0yOHh4X2luZm8oIlx0STJTIGF1ZGlvLCAzIHNhbXBsZSByYXRlc1xuIik7CisJCWVsc2UKKwkJCWVtMjh4eF9pbmZvKCJcdEkyUyBhdWRpbywgNSBzYW1wbGUgcmF0ZXNcbiIpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwppbmRleCBlYTE4MWU0Li4xOGY2NWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zMCw4ICszMCw5IEBACiAKICNpbmNsdWRlICJlbTI4eHguaCIKIAotI2RlZmluZSBFTTI4WFhfU05BUFNIT1RfS0VZIEtFWV9DQU1FUkEKLSNkZWZpbmUgRU0yOFhYX1NCVVRUT05fUVVFUllfSU5URVJWQUwgNTAwCisjZGVmaW5lIEVNMjhYWF9TTkFQU0hPVF9LRVkJCQkJS0VZX0NBTUVSQQorI2RlZmluZSBFTTI4WFhfQlVUVE9OU19ERUJPVU5DRURfUVVFUllfSU5URVJWQUwJCTUwMCAvKiBbbXNdICovCisjZGVmaW5lIEVNMjhYWF9CVVRUT05TX1ZPTEFUSUxFX1FVRVJZX0lOVEVSVkFMCQkxMDAgLyogW21zXSAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlyX2RlYnVnOwogbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNDQyLDYgKzQ0Myw3IEBACiAJY2FzZSBDSElQX0lEX0VNMjg4NDoKIAljYXNlIENISVBfSURfRU0yODc0OgogCWNhc2UgQ0hJUF9JRF9FTTI4MTc0OgorCWNhc2UgQ0hJUF9JRF9FTTI4MTc4OgogCQlyZXR1cm4gZW0yODc0X2lyX2NoYW5nZV9wcm90b2NvbChyY19kZXYsIHJjX3R5cGUpOwogCWRlZmF1bHQ6CiAJCXByaW50aygiVW5yZWNvZ25pemVkIGVtMjh4eCBjaGlwIGlkIDB4JTAyeDogSVIgbm90IHN1cHBvcnRlZFxuIiwKQEAgLTQ3MCw1NCArNDcyLDk4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gSGFuZGxlIFdlYmNhbSBzbmFwc2hvdCBidXR0b24KKyBIYW5kbGUgYnV0dG9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGVtMjh4eF9xdWVyeV9zYnV0dG9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGVtMjh4eF9xdWVyeV9idXR0b25zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQkvKiBQb2xsIHRoZSByZWdpc3RlciBhbmQgc2VlIGlmIHRoZSBidXR0b24gaXMgZGVwcmVzc2VkICovCiAJc3RydWN0IGVtMjh4eCAqZGV2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbTI4eHgsIHNidXR0b25fcXVlcnlfd29yay53b3JrKTsKLQlpbnQgcmV0OworCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVtMjh4eCwgYnV0dG9uc19xdWVyeV93b3JrLndvcmspOworCXU4IGksIGo7CisJaW50IHJlZ3ZhbDsKKwlib29sIGlzX3ByZXNzZWQsIHdhc19wcmVzc2VkOworCWNvbnN0IHN0cnVjdCBlbTI4eHhfbGVkICpsZWQ7CiAKLQlyZXQgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjBDX1VTQlNVU1ApOwotCi0JaWYgKHJldCAmIEVNMjhYWF9SMENfVVNCU1VTUF9TTkFQU0hPVCkgewotCQl1OCBjbGVhcmVkOwotCQkvKiBCdXR0b24gaXMgZGVwcmVzc2VkLCBjbGVhciB0aGUgcmVnaXN0ZXIgKi8KLQkJY2xlYXJlZCA9ICgodTgpIHJldCkgJiB+RU0yOFhYX1IwQ19VU0JTVVNQX1NOQVBTSE9UOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMENfVVNCU1VTUCwgJmNsZWFyZWQsIDEpOwotCi0JCS8qIE5vdCBlbXVsYXRlIHRoZSBrZXlwcmVzcyAqLwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldi0+c2J1dHRvbl9pbnB1dF9kZXYsIEVNMjhYWF9TTkFQU0hPVF9LRVksCi0JCQkJIDEpOwotCQkvKiBOb3cgdW5wcmVzcyB0aGUga2V5ICovCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5zYnV0dG9uX2lucHV0X2RldiwgRU0yOFhYX1NOQVBTSE9UX0tFWSwKLQkJCQkgMCk7CisJLyogUG9sbCBhbmQgZXZhbHVhdGUgYWxsIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9idXR0b25fcG9sbGluZ19hZGRyZXNzZXM7IGkrKykgeworCQkvKiBSZWFkIHZhbHVlIGZyb20gcmVnaXN0ZXIgKi8KKwkJcmVndmFsID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgZGV2LT5idXR0b25fcG9sbGluZ19hZGRyZXNzZXNbaV0pOworCQlpZiAocmVndmFsIDwgMCkKKwkJCWNvbnRpbnVlOworCQkvKiBDaGVjayBzdGF0ZXMgb2YgdGhlIGJ1dHRvbnMgYW5kIGFjdCAqLworCQlqID0gMDsKKwkJd2hpbGUgKGRldi0+Ym9hcmQuYnV0dG9uc1tqXS5yb2xlID49IDAgJiYKKwkJCSBkZXYtPmJvYXJkLmJ1dHRvbnNbal0ucm9sZSA8IEVNMjhYWF9OVU1fQlVUVE9OX1JPTEVTKSB7CisJCQlzdHJ1Y3QgZW0yOHh4X2J1dHRvbiAqYnV0dG9uID0gJmRldi0+Ym9hcmQuYnV0dG9uc1tqXTsKKwkJCS8qIENoZWNrIGlmIGJ1dHRvbiB1c2VzIHRoZSBjdXJyZW50IGFkZHJlc3MgKi8KKwkJCWlmIChidXR0b24tPnJlZ19yICE9IGRldi0+YnV0dG9uX3BvbGxpbmdfYWRkcmVzc2VzW2ldKSB7CisJCQkJaisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogRGV0ZXJtaW5lIGlmIGJ1dHRvbiBpcyBhbmQgd2FzIHByZXNzZWQgbGFzdCB0aW1lICovCisJCQlpc19wcmVzc2VkID0gcmVndmFsICYgYnV0dG9uLT5tYXNrOworCQkJd2FzX3ByZXNzZWQgPSBkZXYtPmJ1dHRvbl9wb2xsaW5nX2xhc3RfdmFsdWVzW2ldCisJCQkJICAgICAgICYgYnV0dG9uLT5tYXNrOworCQkJaWYgKGJ1dHRvbi0+aW52ZXJ0ZWQpIHsKKwkJCQlpc19wcmVzc2VkID0gIWlzX3ByZXNzZWQ7CisJCQkJd2FzX3ByZXNzZWQgPSAhd2FzX3ByZXNzZWQ7CisJCQl9CisJCQkvKiBDbGVhciBidXR0b24gc3RhdGUgKGlmIG5lZWRlZCkgKi8KKwkJCWlmIChpc19wcmVzc2VkICYmIGJ1dHRvbi0+cmVnX2NsZWFyaW5nKQorCQkJCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBidXR0b24tPnJlZ19jbGVhcmluZywKKwkJCQkJCSAofnJlZ3ZhbCAmIGJ1dHRvbi0+bWFzaykKKwkJCQkJCSAgICB8IChyZWd2YWwgJiB+YnV0dG9uLT5tYXNrKSk7CisJCQkvKiBIYW5kbGUgYnV0dG9uIHN0YXRlICovCisJCQlpZiAoIWlzX3ByZXNzZWQgfHwgd2FzX3ByZXNzZWQpIHsKKwkJCQlqKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzd2l0Y2ggKGJ1dHRvbi0+cm9sZSkgeworCQkJY2FzZSBFTTI4WFhfQlVUVE9OX1NOQVBTSE9UOgorCQkJCS8qIEVtdWxhdGUgdGhlIGtleXByZXNzICovCisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYtPnNidXR0b25faW5wdXRfZGV2LAorCQkJCQkJIEVNMjhYWF9TTkFQU0hPVF9LRVksIDEpOworCQkJCS8qIFVucHJlc3MgdGhlIGtleSAqLworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5zYnV0dG9uX2lucHV0X2RldiwKKwkJCQkJCSBFTTI4WFhfU05BUFNIT1RfS0VZLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU0yOFhYX0JVVFRPTl9JTExVTUlOQVRJT046CisJCQkJbGVkID0gZW0yOHh4X2ZpbmRfbGVkKGRldiwKKwkJCQkJCSAgICAgIEVNMjhYWF9MRURfSUxMVU1JTkFUSU9OKTsKKwkJCQkvKiBTd2l0Y2ggaWxsdW1pbmF0aW9uIExFRCBvbi9vZmYgKi8KKwkJCQlpZiAobGVkKQorCQkJCQllbTI4eHhfdG9nZ2xlX3JlZ19iaXRzKGRldiwKKwkJCQkJCQkgICAgICAgbGVkLT5ncGlvX3JlZywKKwkJCQkJCQkgICAgICAgbGVkLT5ncGlvX21hc2spOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlXQVJOX09OQ0UoMSwgIkJVRzogdW5oYW5kbGVkIGJ1dHRvbiByb2xlLiIpOworCQkJfQorCQkJLyogTmV4dCBidXR0b24gKi8KKwkJCWorKzsKKwkJfQorCQkvKiBTYXZlIGN1cnJlbnQgdmFsdWUgZm9yIGNvbXBhcmlzb24gZHVyaW5nIHRoZSBuZXh0IHBvbGxpbmcgKi8KKwkJZGV2LT5idXR0b25fcG9sbGluZ19sYXN0X3ZhbHVlc1tpXSA9IHJlZ3ZhbDsKIAl9Ci0KIAkvKiBTY2hlZHVsZSBuZXh0IHBvbGwgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+c2J1dHRvbl9xdWVyeV93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhFTTI4WFhfU0JVVFRPTl9RVUVSWV9JTlRFUlZBTCkpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5idXR0b25zX3F1ZXJ5X3dvcmssCisJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKGRldi0+YnV0dG9uX3BvbGxpbmdfaW50ZXJ2YWwpKTsKIH0KIAotc3RhdGljIHZvaWQgZW0yOHh4X3JlZ2lzdGVyX3NuYXBzaG90X2J1dHRvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW50IGVtMjh4eF9yZWdpc3Rlcl9zbmFwc2hvdF9idXR0b24oc3RydWN0IGVtMjh4eCAqZGV2KQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgZXJyOwogCiAJZW0yOHh4X2luZm8oIlJlZ2lzdGVyaW5nIHNuYXBzaG90IGJ1dHRvbi4uLlxuIik7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpbnB1dF9kZXYpIHsKLQkJZW0yOHh4X2VycmRldigiaW5wdXRfYWxsb2NhdGVfZGV2aWNlIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9CisJaWYgKCFpbnB1dF9kZXYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGRldi0+c25hcHNob3RfYnV0dG9uX3BhdGgsCiAJCSAgICAgIHNpemVvZihkZXYtPnNuYXBzaG90X2J1dHRvbl9wYXRoKSk7CiAJc3RybGNhdChkZXYtPnNuYXBzaG90X2J1dHRvbl9wYXRoLCAiL3NidXR0b24iLAogCQlzaXplb2YoZGV2LT5zbmFwc2hvdF9idXR0b25fcGF0aCkpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZkZXYtPnNidXR0b25fcXVlcnlfd29yaywgZW0yOHh4X3F1ZXJ5X3NidXR0b24pOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gImVtMjh4eCBzbmFwc2hvdCBidXR0b24iOwogCWlucHV0X2Rldi0+cGh5cyA9IGRldi0+c25hcHNob3RfYnV0dG9uX3BhdGg7CkBAIC01MzUsMjUgKzU4MSw4NiBAQAogCWlmIChlcnIpIHsKIAkJZW0yOHh4X2VycmRldigiaW5wdXRfcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuIik7CiAJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlkZXYtPnNidXR0b25faW5wdXRfZGV2ID0gaW5wdXRfZGV2OwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5zYnV0dG9uX3F1ZXJ5X3dvcmssCi0JCQkgICAgICBtc2Vjc190b19qaWZmaWVzKEVNMjhYWF9TQlVUVE9OX1FVRVJZX0lOVEVSVkFMKSk7Ci0JcmV0dXJuOwotCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVtMjh4eF9kZXJlZ2lzdGVyX3NuYXBzaG90X2J1dHRvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgdm9pZCBlbTI4eHhfaW5pdF9idXR0b25zKHN0cnVjdCBlbTI4eHggKmRldikKIHsKKwl1OCAgaSA9IDAsIGogPSAwOworCWJvb2wgYWRkcl9uZXcgPSAwOworCisJZGV2LT5idXR0b25fcG9sbGluZ19pbnRlcnZhbCA9IEVNMjhYWF9CVVRUT05TX0RFQk9VTkNFRF9RVUVSWV9JTlRFUlZBTDsKKwl3aGlsZSAoZGV2LT5ib2FyZC5idXR0b25zW2ldLnJvbGUgPj0gMCAmJgorCQkJIGRldi0+Ym9hcmQuYnV0dG9uc1tpXS5yb2xlIDwgRU0yOFhYX05VTV9CVVRUT05fUk9MRVMpIHsKKwkJc3RydWN0IGVtMjh4eF9idXR0b24gKmJ1dHRvbiA9ICZkZXYtPmJvYXJkLmJ1dHRvbnNbaV07CisJCS8qIENoZWNrIGlmIHBvbGxpbmcgYWRkcmVzcyBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0ICovCisJCWFkZHJfbmV3ID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IGRldi0+bnVtX2J1dHRvbl9wb2xsaW5nX2FkZHJlc3NlczsgaisrKSB7CisJCQlpZiAoYnV0dG9uLT5yZWdfciA9PSBkZXYtPmJ1dHRvbl9wb2xsaW5nX2FkZHJlc3Nlc1tqXSkgeworCQkJCWFkZHJfbmV3ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBDaGVjayBpZiBtYXguIG51bWJlciBvZiBwb2xsaW5nIGFkZHJlc3NlcyBpcyBleGNlZWRlZCAqLworCQlpZiAoYWRkcl9uZXcgJiYgZGV2LT5udW1fYnV0dG9uX3BvbGxpbmdfYWRkcmVzc2VzCisJCQkJCSAgID49IEVNMjhYWF9OVU1fQlVUVE9OX0FERFJFU1NFU19NQVgpIHsKKwkJCVdBUk5fT05DRSgxLCAiQlVHOiBtYXhpbXVtIG51bWJlciBvZiBidXR0b24gcG9sbGluZyBhZGRyZXNzZXMgZXhjZWVkZWQuIik7CisJCQlnb3RvIG5leHRfYnV0dG9uOworCQl9CisJCS8qIEJ1dHRvbiByb2xlIHNwZWNpZmljIGNoZWNrcyBhbmQgYWN0aW9ucyAqLworCQlpZiAoYnV0dG9uLT5yb2xlID09IEVNMjhYWF9CVVRUT05fU05BUFNIT1QpIHsKKwkJCS8qIFJlZ2lzdGVyIGlucHV0IGRldmljZSAqLworCQkJaWYgKGVtMjh4eF9yZWdpc3Rlcl9zbmFwc2hvdF9idXR0b24oZGV2KSA8IDApCisJCQkJZ290byBuZXh0X2J1dHRvbjsKKwkJfSBlbHNlIGlmIChidXR0b24tPnJvbGUgPT0gRU0yOFhYX0JVVFRPTl9JTExVTUlOQVRJT04pIHsKKwkJCS8qIENoZWNrIHNhbml0eSAqLworCQkJaWYgKCFlbTI4eHhfZmluZF9sZWQoZGV2LCBFTTI4WFhfTEVEX0lMTFVNSU5BVElPTikpIHsKKwkJCQllbTI4eHhfZXJyZGV2KCJCVUc6IGlsbHVtaW5hdGlvbiBidXR0b24gZGVmaW5lZCwgYnV0IG5vIGlsbHVtaW5hdGlvbiBMRUQuXG4iKTsKKwkJCQlnb3RvIG5leHRfYnV0dG9uOworCQkJfQorCQl9CisJCS8qIEFkZCByZWFkIGFkZHJlc3MgdG8gbGlzdCBvZiBwb2xsaW5nIGFkZHJlc3NlcyAqLworCQlpZiAoYWRkcl9uZXcpIHsKKwkJCXVuc2lnbmVkIGludCBpbmRleCA9IGRldi0+bnVtX2J1dHRvbl9wb2xsaW5nX2FkZHJlc3NlczsKKwkJCWRldi0+YnV0dG9uX3BvbGxpbmdfYWRkcmVzc2VzW2luZGV4XSA9IGJ1dHRvbi0+cmVnX3I7CisJCQlkZXYtPm51bV9idXR0b25fcG9sbGluZ19hZGRyZXNzZXMrKzsKKwkJfQorCQkvKiBSZWR1Y2UgcG9sbGluZyBpbnRlcnZhbCBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKCFidXR0b24tPnJlZ19jbGVhcmluZykKKwkJCWRldi0+YnV0dG9uX3BvbGxpbmdfaW50ZXJ2YWwgPQorCQkJCQkgRU0yOFhYX0JVVFRPTlNfVk9MQVRJTEVfUVVFUllfSU5URVJWQUw7CituZXh0X2J1dHRvbjoKKwkJLyogTmV4dCBidXR0b24gKi8KKwkJaSsrOworCX0KKworCS8qIFN0YXJ0IHBvbGxpbmcgKi8KKwlpZiAoZGV2LT5udW1fYnV0dG9uX3BvbGxpbmdfYWRkcmVzc2VzKSB7CisJCW1lbXNldChkZXYtPmJ1dHRvbl9wb2xsaW5nX2xhc3RfdmFsdWVzLCAwLAorCQkJCQkgICAgICAgRU0yOFhYX05VTV9CVVRUT05fQUREUkVTU0VTX01BWCk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZkZXYtPmJ1dHRvbnNfcXVlcnlfd29yaywKKwkJCQkJCQkgIGVtMjh4eF9xdWVyeV9idXR0b25zKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPmJ1dHRvbnNfcXVlcnlfd29yaywKKwkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKGRldi0+YnV0dG9uX3BvbGxpbmdfaW50ZXJ2YWwpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVtMjh4eF9zaHV0ZG93bl9idXR0b25zKHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwkvKiBDYW5jZWwgcG9sbGluZyAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGV2LT5idXR0b25zX3F1ZXJ5X3dvcmspOworCS8qIENsZWFyIHBvbGxpbmcgYWRkcmVzc2VzIGxpc3QgKi8KKwlkZXYtPm51bV9idXR0b25fcG9sbGluZ19hZGRyZXNzZXMgPSAwOworCS8qIERlcmVnaXN0ZXIgaW5wdXQgZGV2aWNlcyAqLwogCWlmIChkZXYtPnNidXR0b25faW5wdXRfZGV2ICE9IE5VTEwpIHsKIAkJZW0yOHh4X2luZm8oIkRlcmVnaXN0ZXJpbmcgc25hcHNob3QgYnV0dG9uXG4iKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZXYtPnNidXR0b25fcXVlcnlfd29yayk7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+c2J1dHRvbl9pbnB1dF9kZXYpOwogCQlkZXYtPnNidXR0b25faW5wdXRfZGV2ID0gTlVMTDsKIAl9Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IGVtMjh4eF9pcl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKQEAgLTU2NCw4ICs2NzEsMTMgQEAKIAl1NjQgcmNfdHlwZTsKIAl1MTYgaTJjX3JjX2Rldl9hZGRyID0gMDsKIAotCWlmIChkZXYtPmJvYXJkLmhhc19zbmFwc2hvdF9idXR0b24pCi0JCWVtMjh4eF9yZWdpc3Rlcl9zbmFwc2hvdF9idXR0b24oZGV2KTsKKwlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7CisJCS8qIFNob3VsZG4ndCBpbml0aWFsaXplIElSIGZvciB0aGlzIGludGVyZmFjZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2LT5ib2FyZC5idXR0b25zKQorCQllbTI4eHhfaW5pdF9idXR0b25zKGRldik7CiAKIAlpZiAoZGV2LT5ib2FyZC5oYXNfaXJfaTJjKSB7CiAJCWkyY19yY19kZXZfYWRkciA9IGVtMjh4eF9wcm9iZV9pMmNfaXIoZGV2KTsKQEAgLTU4Myw2ICs2OTUsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwllbTI4eHhfaW5mbygiUmVnaXN0ZXJpbmcgaW5wdXQgZXh0ZW5zaW9uXG4iKTsKKwogCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7CiAJcmMgPSByY19hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWlyIHx8ICFyYykKQEAgLTYzMyw2ICs3NDcsNyBAQAogCQljYXNlIENISVBfSURfRU0yODg0OgogCQljYXNlIENISVBfSURfRU0yODc0OgogCQljYXNlIENISVBfSURfRU0yODE3NDoKKwkJY2FzZSBDSElQX0lEX0VNMjgxNzg6CiAJCQlpci0+Z2V0X2tleSA9IGVtMjg3NF9wb2xsaW5nX2dldGtleTsKIAkJCXJjLT5hbGxvd2VkX3Byb3RvcyA9IFJDX0JJVF9SQzUgfCBSQ19CSVRfTkVDIHwKIAkJCQkJICAgICBSQ19CSVRfUkM2XzA7CkBAIC02NzUsNiArNzkwLDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yOwogCisJZW0yOHh4X2luZm8oIklucHV0IGV4dGVuc2lvbiBzdWNjZXNzZnVsbHkgaW5pdGFsaXplZFxuIik7CisKIAlyZXR1cm4gMDsKIAogZXJyb3I6CkBAIC02ODgsNyArODA1LDE0IEBACiB7CiAJc3RydWN0IGVtMjh4eF9JUiAqaXIgPSBkZXYtPmlyOwogCi0JZW0yOHh4X2RlcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKGRldik7CisJaWYgKGRldi0+aXNfYXVkaW9fb25seSkgeworCQkvKiBTaG91bGRuJ3QgaW5pdGlhbGl6ZSBJUiBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJZW0yOHh4X2luZm8oIkNsb3NpbmcgaW5wdXQgZXh0ZW5zaW9uIik7CisKKwllbTI4eHhfc2h1dGRvd25fYnV0dG9ucyhkZXYpOwogCiAJLyogc2tpcCBkZXRhY2ggb24gbm9uIGF0dGFjaGVkIGJvYXJkcyAqLwogCWlmICghaXIpCkBAIC03MjIsNyArODQ2LDggQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkVtMjh4eCBJbnB1dCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyAiIC0gaW5wdXQgaW50ZXJmYWNlIik7CitNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CiAKIG1vZHVsZV9pbml0KGVtMjh4eF9yY19yZWdpc3Rlcik7CiBtb2R1bGVfZXhpdChlbTI4eHhfcmNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1yZWcuaAppbmRleCAwZTA0Nzc4Li4zMTFmYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtcmVnLmgKQEAgLTI1LDEwICsyNSwxMiBAQAogI2RlZmluZSBFTTI4WFhfUjAwX0NISVBDRkcJMHgwMAogCiAvKiBlbTI4eHggQ2hpcCBDb25maWd1cmF0aW9uIDB4MDAgKi8KLSNkZWZpbmUgRU0yOFhYX0NISVBDRkdfVkVORE9SX0FVRElPCQkweDgwCi0jZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0kyU19WT0xVTUVfQ0FQQUJMRQkweDQwCi0jZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0kyU181X1NBTVBSQVRFUwkJMHgzMAotI2RlZmluZSBFTTI4WFhfQ0hJUENGR19JMlNfM19TQU1QUkFURVMJCTB4MjAKKyNkZWZpbmUgRU0yODYwX0NISVBDRkdfVkVORE9SX0FVRElPCQkweDgwCisjZGVmaW5lIEVNMjg2MF9DSElQQ0ZHX0kyU19WT0xVTUVfQ0FQQUJMRQkweDQwCisjZGVmaW5lIEVNMjgyMF9DSElQQ0ZHX0kyU18zX1NBTVBSQVRFUwkJMHgzMAorI2RlZmluZSBFTTI4NjBfQ0hJUENGR19JMlNfNV9TQU1QUkFURVMJCTB4MzAKKyNkZWZpbmUgRU0yODIwX0NISVBDRkdfSTJTXzFfU0FNUFJBVEUJCTB4MjAKKyNkZWZpbmUgRU0yODYwX0NISVBDRkdfSTJTXzNfU0FNUFJBVEVTCQkweDIwCiAjZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0FDOTcJCQkweDEwCiAjZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSwkJMHgzMAogCkBAIC0yNDUsNiArMjQ3LDcgQEAKIAlDSElQX0lEX0VNMjg3NCA9IDY1LAogCUNISVBfSURfRU0yODg0ID0gNjgsCiAJQ0hJUF9JRF9FTTI4MTc0ID0gMTEzLAorCUNISVBfSURfRU0yODE3OCA9IDExNCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LXY0bC5oIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC12NGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC12NGwuaApAQCAtMCwwICsxLDIwIEBACisvKgorICAgZW0yOHh4LXZpZGVvLmMgLSBkcml2ZXIgZm9yIEVtcGlhIEVNMjgwMC9FTTI4MjAvMjg0MCBVU0IKKwkJICAgIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworCisgICBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG0uY2hlaGFiQHNhbXN1bmcuY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworaW50IGVtMjh4eF9zdGFydF9hbmFsb2dfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgY291bnQpOworaW50IGVtMjh4eF9zdG9wX3ZiaV9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpOworZXh0ZXJuIHN0cnVjdCB2YjJfb3BzIGVtMjh4eF92YmlfcW9wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LXZiaS5jCmluZGV4IDM5ZjM5YzUuLmRiM2Q2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC12YmkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgImVtMjh4eC5oIgorI2luY2x1ZGUgImVtMjh4eC12NGwuaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCB2YmlidWZzID0gNTsKIG1vZHVsZV9wYXJhbSh2YmlidWZzLCBpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IGRkMTljOWYuLmMzYzkyODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKQEAgLTM4LDkgKzM4LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiZW0yOHh4LmgiCisjaW5jbHVkZSAiZW0yOHh4LXY0bC5oIgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNsay5oPgogI2luY2x1ZGUgPG1lZGlhL21zcDM0MDAuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogCkBAIC00OSwxOSArNTEsMjMgQEAKIAkJICAgICAgIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiwgIiBcCiAJCSAgICAgICJTYXNjaGEgU29tbWVyIDxzYXNjaGFzb21tZXJAZnJlZW5ldC5kZT4iCiAKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICAgICAiRW1waWEgZW0yOHh4IGJhc2VkIFVTQiB2aWRlbyBkZXZpY2UgZHJpdmVyIgorc3RhdGljIHVuc2lnbmVkIGludCBpc29jX2RlYnVnOworbW9kdWxlX3BhcmFtKGlzb2NfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlzb2NfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2lzb2MgdHJhbnNmZXJzXSIpOwogCi0jZGVmaW5lIEVNMjhYWF9WRVJTSU9OICIwLjIuMCIKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGlzYWJsZV92Ymk7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV92YmksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfdmJpLCAiZGlzYWJsZSB2Ymkgc3VwcG9ydCIpOworCitzdGF0aWMgaW50IGFsdDsKK21vZHVsZV9wYXJhbShhbHQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsdCwgImFsdGVybmF0ZSBzZXR0aW5nIHRvIHVzZSBmb3IgdmlkZW8gZW5kcG9pbnQiKTsKIAogI2RlZmluZSBlbTI4eHhfdmlkZW9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCiAJaWYgKHZpZGVvX2RlYnVnKSBcCiAJCXByaW50ayhLRVJOX0lORk8gIiVzICVzIDoiZm10LCBcCiAJCQkgZGV2LT5uYW1lLCBfX2Z1bmNfXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIHVuc2lnbmVkIGludCBpc29jX2RlYnVnOwotbW9kdWxlX3BhcmFtKGlzb2NfZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlzb2NfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2lzb2MgdHJhbnNmZXJzXSIpOwotCiAjZGVmaW5lIGVtMjh4eF9pc29jZGJnKGZtdCwgYXJnLi4uKSBcCiBkbyB7XAogCWlmIChpc29jX2RlYnVnKSB7IFwKQEAgLTcxLDcgKzc3LDcgQEAKICAgfSB3aGlsZSAoMCkKIAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MgIiAtIHY0bDIgaW50ZXJmYWNlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CiAKQEAgLTEzNSw2ICsxNDEsMjU3IEBACiAJfSwKIH07CiAKK3N0YXRpYyBpbnQgZW0yOHh4X3ZiaV9zdXBwb3J0ZWQoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCS8qIE1vZHByb2JlIG9wdGlvbiB0byBtYW51YWxseSBkaXNhYmxlICovCisJaWYgKGRpc2FibGVfdmJpID09IDEpCisJCXJldHVybiAwOworCisJaWYgKGRldi0+Ym9hcmQuaXNfd2ViY2FtKQorCQlyZXR1cm4gMDsKKworCS8qIEZJWE1FOiBjaGVjayBzdWJkZXZpY2VzIGZvciBWQkkgc3VwcG9ydCAqLworCisJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg2MCB8fAorCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4ODMpCisJCXJldHVybiAxOworCisJLyogVmVyc2lvbiBvZiBlbTI4eHggdGhhdCBkb2VzIG5vdCBzdXBwb3J0IFZCSSAqLworCXJldHVybiAwOworfQorCisvKgorICogZW0yOHh4X3dha2VfaTJjKCkKKyAqIGNvbmZpZ3VyZSBpMmMgYXR0YWNoZWQgZGV2aWNlcworICovCitzdGF0aWMgdm9pZCBlbTI4eHhfd2FrZV9pMmMoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCAgcmVzZXQsIDApOworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB2aWRlbywgc19yb3V0aW5nLAorCQkJSU5QVVQoZGV2LT5jdGxfaW5wdXQpLT52bXV4LCAwLCAwKTsKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdmlkZW8sIHNfc3RyZWFtLCAwKTsKK30KKworc3RhdGljIGludCBlbTI4eHhfY29sb3JsZXZlbHNfc2V0X2RlZmF1bHQoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjIwX1lHQUlOLCBDT05UUkFTVF9ERUZBVUxUKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyMV9ZT0ZGU0VULCBCUklHSFRORVNTX0RFRkFVTFQpOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjIyX1VWR0FJTiwgU0FUVVJBVElPTl9ERUZBVUxUKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyM19VT0ZGU0VULCBCTFVFX0JBTEFOQ0VfREVGQVVMVCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjRfVk9GRlNFVCwgUkVEX0JBTEFOQ0VfREVGQVVMVCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjVfU0hBUlBORVNTLCBTSEFSUE5FU1NfREVGQVVMVCk7CisKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxNF9HQU1NQSwgMHgyMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTVfUkdBSU4sIDB4MjApOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjE2X0dHQUlOLCAweDIwKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxN19CR0FJTiwgMHgyMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMThfUk9GRlNFVCwgMHgwMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTlfR09GRlNFVCwgMHgwMCk7CisJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjFBX0JPRkZTRVQsIDB4MDApOworfQorCitzdGF0aWMgaW50IGVtMjh4eF9zZXRfb3V0Zm10KHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlpbnQgcmV0OworCXU4IGZtdCwgdmluY3RybDsKKworCWZtdCA9IGRldi0+Zm9ybWF0LT5yZWc7CisJaWYgKCFkZXYtPmlzX2VtMjV4eCkKKwkJZm10IHw9IDB4MjA7CisJLyoKKwkgKiBOT1RFOiBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHJlYWxseSBuZWVkZWQgIQorCSAqIFRoZSBkYXRhc2hlZXRzIHNheSBiaXQgNSBpcyBhIHJlc2VydmVkIGJpdCBhbmQgZGV2aWNlcyBzZWVtIHRvIHdvcmsKKwkgKiBmaW5lIHdpdGhvdXQgaXQuIEJ1dCB0aGUgV2luZG93cyBkcml2ZXIgc2V0cyBpdCBmb3IgZW0yNzEwLzUwK2VtMjh4eAorCSAqIGRldmljZXMgYW5kIHdlJ3ZlIGFsd2F5cyBiZWVuIHNldHRpbmcgaXQsIHRvby4KKwkgKgorCSAqIGVtMjc2NSAoZW0yNXh4LCBlbTI3NngvN3gvOHgpIGRldmljZXMgZG8gTk9UIHdvcmsgd2l0aCB0aGlzIGJpdCBzZXQsCisJICogaXQncyBsaWtlbHkgdXNlZCBmb3IgYW4gYWRkaXRpb25hbCAoY29tcHJlc3NlZCA/KSBmb3JtYXQgdGhlcmUuCisJICovCisJcmV0ID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjdfT1VURk1ULCBmbXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTBfVklOTU9ERSwgZGV2LT52aW5tb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXZpbmN0cmwgPSBkZXYtPnZpbmN0bDsKKwlpZiAoZW0yOHh4X3ZiaV9zdXBwb3J0ZWQoZGV2KSA9PSAxKSB7CisJCXZpbmN0cmwgfD0gRU0yOFhYX1ZJTkNUUkxfVkJJX1JBVzsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMzRfVkJJX1NUQVJUX0gsIDB4MDApOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IzNl9WQklfV0lEVEgsIGRldi0+dmJpX3dpZHRoLzQpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IzN19WQklfSEVJR0hULCBkZXYtPnZiaV9oZWlnaHQpOworCQlpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKSB7CisJCQkvKiBOVFNDICovCisJCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IzNV9WQklfU1RBUlRfViwgMHgwOSk7CisJCX0gZWxzZSBpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNjI1XzUwKSB7CisJCQkvKiBQQUwgKi8KKwkJCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjM1X1ZCSV9TVEFSVF9WLCAweDA3KTsKKwkJfQorCX0KKworCXJldHVybiBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMV9WSU5DVFJMLCB2aW5jdHJsKTsKK30KKworc3RhdGljIGludCBlbTI4eHhfYWNjdW11bGF0b3Jfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggeG1pbiwgdTggeG1heCwKKwkJCQkgIHU4IHltaW4sIHU4IHltYXgpCit7CisJZW0yOHh4X3ZpZGVvZGJnKCJlbTI4eHggU2NhbGU6ICglZCwlZCktKCVkLCVkKVxuIiwKKwkJCXhtaW4sIHltaW4sIHhtYXgsIHltYXgpOworCisJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjI4X1hNSU4sICZ4bWluLCAxKTsKKwllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjlfWE1BWCwgJnhtYXgsIDEpOworCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyQV9ZTUlOLCAmeW1pbiwgMSk7CisJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyQl9ZTUFYLCAmeW1heCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtMjh4eF9jYXB0dXJlX2FyZWFfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggaHN0YXJ0LCB1OCB2c3RhcnQsCisJCQkJICAgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0KQoreworCXU4IGN3aWR0aCA9IHdpZHRoID4+IDI7CisJdTggY2hlaWdodCA9IGhlaWdodCA+PiAyOworCXU4IG92ZXJmbG93ID0gKGhlaWdodCA+PiA5ICYgMHgwMikgfCAod2lkdGggPj4gMTAgJiAweDAxKTsKKwkvKiBOT1RFOiBzaXplIGxpbWl0OiAyMDQ3eDEwMjMgPSAyTVBpeCAqLworCisJZW0yOHh4X3ZpZGVvZGJnKCJjYXB0dXJlIGFyZWEgc2V0IHRvICglZCwlZCk6ICVkeCVkXG4iLAorCQkgICAgICAgaHN0YXJ0LCB2c3RhcnQsCisJCSAgICAgICAoKG92ZXJmbG93ICYgMikgPDwgOSB8IGN3aWR0aCA8PCAyKSwKKwkJICAgICAgICgob3ZlcmZsb3cgJiAxKSA8PCAxMCB8IGNoZWlnaHQgPDwgMikpOworCisJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjFDX0hTVEFSVCwgJmhzdGFydCwgMSk7CisJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjFEX1ZTVEFSVCwgJnZzdGFydCwgMSk7CisJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjFFX0NXSURUSCwgJmN3aWR0aCwgMSk7CisJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjFGX0NIRUlHSFQsICZjaGVpZ2h0LCAxKTsKKwllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMUJfT0ZMT1csICZvdmVyZmxvdywgMSk7CisKKwkvKiBGSVhNRTogZnVuY3Rpb24vbWVhbmluZyBvZiB0aGVzZSByZWdpc3RlcnMgPyAqLworCS8qIEZJWE1FOiBhbGlnbiB3aWR0aCtoZWlnaHQgdG8gbXVsdGlwbGVzIG9mIDQgPyEgKi8KKwlpZiAoZGV2LT5pc19lbTI1eHgpIHsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIDB4MzQsIHdpZHRoID4+IDQpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgMHgzNSwgaGVpZ2h0ID4+IDQpOworCX0KK30KKworc3RhdGljIGludCBlbTI4eHhfc2NhbGVyX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiBoLCB1MTYgdikKK3sKKwl1OCBtb2RlOworCS8qIHRoZSBlbTI4MDAgc2NhbGVyIG9ubHkgc3VwcG9ydHMgc2NhbGluZyBkb3duIHRvIDUwJSAqLworCisJaWYgKGRldi0+Ym9hcmQuaXNfZW0yODAwKSB7CisJCW1vZGUgPSAodiA/IDB4MjAgOiAweDAwKSB8IChoID8gMHgxMCA6IDB4MDApOworCX0gZWxzZSB7CisJCXU4IGJ1ZlsyXTsKKworCQlidWZbMF0gPSBoOworCQlidWZbMV0gPSBoID4+IDg7CisJCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IzMF9IU0NBTEVMT1csIChjaGFyICopYnVmLCAyKTsKKworCQlidWZbMF0gPSB2OworCQlidWZbMV0gPSB2ID4+IDg7CisJCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IzMl9WU0NBTEVMT1csIChjaGFyICopYnVmLCAyKTsKKwkJLyogaXQgc2VlbXMgdGhhdCBib3RoIEggYW5kIFYgc2NhbGVycyBtdXN0IGJlIGFjdGl2ZQorCQkgICB0byB3b3JrIGNvcnJlY3RseSAqLworCQltb2RlID0gKGggfHwgdikgPyAweDMwIDogMHgwMDsKKwl9CisJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjhYWF9SMjZfQ09NUFIsIG1vZGUsIDB4MzApOworfQorCisvKiBGSVhNRTogdGhpcyBvbmx5IGZ1bmN0aW9uIHJlYWQgdmFsdWVzIGZyb20gZGV2ICovCitzdGF0aWMgaW50IGVtMjh4eF9yZXNvbHV0aW9uX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpCit7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJd2lkdGggPSBub3JtX21heHcoZGV2KTsKKwloZWlnaHQgPSBub3JtX21heGgoZGV2KTsKKworCS8qIFByb3Blcmx5IHNldHVwIFZCSSAqLworCWRldi0+dmJpX3dpZHRoID0gNzIwOworCWlmIChkZXYtPm5vcm0gJiBWNEwyX1NURF81MjVfNjApCisJCWRldi0+dmJpX2hlaWdodCA9IDEyOworCWVsc2UKKwkJZGV2LT52YmlfaGVpZ2h0ID0gMTg7CisKKwllbTI4eHhfc2V0X291dGZtdChkZXYpOworCisJZW0yOHh4X2FjY3VtdWxhdG9yX3NldChkZXYsIDEsICh3aWR0aCAtIDQpID4+IDIsIDEsIChoZWlnaHQgLSA0KSA+PiAyKTsKKworCS8qIElmIHdlIGRvbid0IHNldCB0aGUgc3RhcnQgcG9zaXRpb24gdG8gMiBpbiBWQkkgbW9kZSwgd2UgZW5kIHVwCisJICAgd2l0aCBsaW5lIDIwLzIxIGJlaW5nIFlVWVYgZW5jb2RlZCBpbnN0ZWFkIG9mIGJlaW5nIGluIDgtYml0CisJICAgZ3JleXNjYWxlLiAgVGhlIGNvcmUgb2YgdGhlIGlzc3VlIGlzIHRoYXQgbGluZSAyMSAoYW5kIGxpbmUgMjMgZm9yCisJICAgUEFMIFdTUykgYXJlIGluc2lkZSBvZiBhY3RpdmUgdmlkZW8gcmVnaW9uLCBhbmQgYXMgYSByZXN1bHQgdGhleQorCSAgIGdldCB0aGUgcGl4ZWxmb3JtYXR0aW5nIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGFyZWEuICBTbyBieSBjcm9wcGluZworCSAgIGl0IG91dCwgd2UgZW5kIHVwIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSByZXN0IG9mIHRoZSBWQkkKKwkgICByZWdpb24gKi8KKwlpZiAoZW0yOHh4X3ZiaV9zdXBwb3J0ZWQoZGV2KSA9PSAxKQorCQllbTI4eHhfY2FwdHVyZV9hcmVhX3NldChkZXYsIDAsIDIsIHdpZHRoLCBoZWlnaHQpOworCWVsc2UKKwkJZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoZGV2LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworCXJldHVybiBlbTI4eHhfc2NhbGVyX3NldChkZXYsIGRldi0+aHNjYWxlLCBkZXYtPnZzY2FsZSk7Cit9CisKKy8qIFNldCBVU0IgYWx0ZXJuYXRlIHNldHRpbmcgZm9yIGFuYWxvZyB2aWRlbyAqLworc3RhdGljIGludCBlbTI4eHhfc2V0X2FsdGVybmF0ZShzdHJ1Y3QgZW0yOHh4ICpkZXYpCit7CisJaW50IGVyckNvZGU7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG1pbl9wa3Rfc2l6ZSA9IGRldi0+d2lkdGggKiAyICsgNDsKKworCS8qIE5PVEU6IGZvciBpc29jIHRyYW5zZmVycywgb25seSBhbHQgc2V0dGluZ3MgPiAwIGFyZSBhbGxvd2VkCisJCSBidWxrIHRyYW5zZmVycyBzZWVtIHRvIHdvcmsgb25seSB3aXRoIGFsdD0wICEgKi8KKwlkZXYtPmFsdCA9IDA7CisJaWYgKChhbHQgPiAwKSAmJiAoYWx0IDwgZGV2LT5udW1fYWx0KSkgeworCQllbTI4eHhfdmlkZW9kYmcoImFsdGVybmF0ZSBmb3JjZWQgdG8gJWRcbiIsIGRldi0+YWx0KTsKKwkJZGV2LT5hbHQgPSBhbHQ7CisJCWdvdG8gc2V0X2FsdDsKKwl9CisJaWYgKGRldi0+YW5hbG9nX3hmZXJfYnVsaykKKwkJZ290byBzZXRfYWx0OworCisJLyogV2hlbiBpbWFnZSBzaXplIGlzIGJpZ2dlciB0aGFuIGEgY2VydGFpbiB2YWx1ZSwKKwkgICB0aGUgZnJhbWUgc2l6ZSBzaG91bGQgYmUgaW5jcmVhc2VkLCBvdGhlcndpc2UsIG9ubHkKKwkgICBncmVlbiBzY3JlZW4gd2lsbCBiZSByZWNlaXZlZC4KKwkgKi8KKwlpZiAoZGV2LT53aWR0aCAqIDIgKiBkZXYtPmhlaWdodCA+IDcyMCAqIDI0MCAqIDIpCisJCW1pbl9wa3Rfc2l6ZSAqPSAyOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2FsdDsgaSsrKSB7CisJCS8qIHN0b3Agd2hlbiB0aGUgc2VsZWN0ZWQgYWx0IHNldHRpbmcgb2ZmZXJzIGVub3VnaCBiYW5kd2lkdGggKi8KKwkJaWYgKGRldi0+YWx0X21heF9wa3Rfc2l6ZV9pc29jW2ldID49IG1pbl9wa3Rfc2l6ZSkgeworCQkJZGV2LT5hbHQgPSBpOworCQkJYnJlYWs7CisJCS8qIG90aGVyd2lzZSBtYWtlIHN1cmUgdGhhdCB3ZSBlbmQgdXAgd2l0aCB0aGUgbWF4aW11bSBiYW5kd2lkdGgKKwkJICAgYmVjYXVzZSB0aGUgbWluX3BrdF9zaXplIGVxdWF0aW9uIG1pZ2h0IGJlIHdyb25nLi4uCisJCSovCisJCX0gZWxzZSBpZiAoZGV2LT5hbHRfbWF4X3BrdF9zaXplX2lzb2NbaV0gPgorCQkJICAgZGV2LT5hbHRfbWF4X3BrdF9zaXplX2lzb2NbZGV2LT5hbHRdKQorCQkJZGV2LT5hbHQgPSBpOworCX0KKworc2V0X2FsdDoKKwkvKiBOT1RFOiBmb3IgYnVsayB0cmFuc2ZlcnMsIHdlIG5lZWQgdG8gY2FsbCB1c2Jfc2V0X2ludGVyZmFjZSgpCisJICogZXZlbiBpZiB0aGUgcHJldmlvdXMgc2V0dGluZ3Mgd2VyZSB0aGUgc2FtZS4gT3RoZXJ3aXNlIHN0cmVhbWluZworCSAqIGZhaWxzIHdpdGggYWxsIHVyYnMgaGF2aW5nIHN0YXR1cyA9IC1FT1ZFUkZMT1cgISAqLworCWlmIChkZXYtPmFuYWxvZ194ZmVyX2J1bGspIHsKKwkJZGV2LT5tYXhfcGt0X3NpemUgPSA1MTI7IC8qIFVTQiAyLjAgc3BlYyAqLworCQlkZXYtPnBhY2tldF9tdWx0aXBsaWVyID0gRU0yOFhYX0JVTEtfUEFDS0VUX01VTFRJUExJRVI7CisJfSBlbHNlIHsgLyogaXNvYyAqLworCQllbTI4eHhfdmlkZW9kYmcoIm1pbmltdW0gaXNvYyBwYWNrZXQgc2l6ZTogJXUgKGFsdD0lZClcbiIsCisJCQkgICAgICAgbWluX3BrdF9zaXplLCBkZXYtPmFsdCk7CisJCWRldi0+bWF4X3BrdF9zaXplID0KKwkJCQkgIGRldi0+YWx0X21heF9wa3Rfc2l6ZV9pc29jW2Rldi0+YWx0XTsKKwkJZGV2LT5wYWNrZXRfbXVsdGlwbGllciA9IEVNMjhYWF9OVU1fSVNPQ19QQUNLRVRTOworCX0KKwllbTI4eHhfdmlkZW9kYmcoInNldHRpbmcgYWx0ZXJuYXRlICVkIHdpdGggd01heFBhY2tldFNpemU9JXVcbiIsCisJCSAgICAgICBkZXYtPmFsdCwgZGV2LT5tYXhfcGt0X3NpemUpOworCWVyckNvZGUgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGRldi0+aWZudW0sIGRldi0+YWx0KTsKKwlpZiAoZXJyQ29kZSA8IDApIHsKKwkJZW0yOHh4X2VycmRldigiY2Fubm90IGNoYW5nZSBhbHRlcm5hdGUgbnVtYmVyIHRvICVkIChlcnJvcj0laSlcbiIsCisJCQkgICAgICBkZXYtPmFsdCwgZXJyQ29kZSk7CisJCXJldHVybiBlcnJDb2RlOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJRE1BIGFuZCB0aHJlYWQgZnVuY3Rpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzYzLDcgKzEwMjAsNyBAQAogCS53YWl0X2ZpbmlzaCAgICA9IHZiMl9vcHNfd2FpdF9maW5pc2gsCiB9OwogCi1pbnQgZW0yOHh4X3ZiMl9zZXR1cChzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW50IGVtMjh4eF92YjJfc2V0dXAoc3RydWN0IGVtMjh4eCAqZGV2KQogewogCWludCByYzsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICpxOwpAQCAtODMxLDcgKzEwODgsNyBAQAogCWVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7CiB9CiAKLXZvaWQgZW0yOHh4X2N0cmxfbm90aWZ5KHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHZvaWQgKnByaXYpCitzdGF0aWMgdm9pZCBlbTI4eHhfY3RybF9ub3RpZnkoc3RydWN0IHY0bDJfY3RybCAqY3RybCwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBwcml2OwogCkBAIC04OTAsNyArMTE0Nyw3IEBACiAJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IDA7CiB9CiAKLWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGVtMjh4eF9jdHJsX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBlbTI4eHhfY3RybF9vcHMgPSB7CiAJLnNfY3RybCA9IGVtMjh4eF9zX2N0cmwsCiB9OwogCkBAIC0xMzY4LDcgKzE2MjUsNyBAQAogCQlyZWctPnZhbCA9IHJldDsKIAl9IGVsc2UgewogCQlfX2xlMTYgdmFsID0gMDsKLQkJcmV0ID0gZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4oZGV2LCBVU0JfUkVRX0dFVF9TVEFUVVMsCisJCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4oZGV2LCBVU0JfUkVRX0dFVF9TVEFUVVMsCiAJCQkJCQkgICByZWctPnJlZywgKGNoYXIgKikmdmFsLCAyKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTU3MCw2ICsxODI3LDEwIEBACiAJY2FzZSBWRkxfVFlQRV9WQkk6CiAJCWZoX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwogCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1JBRElPOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllbTI4eHhfdmlkZW9kYmcoIm9wZW4gZGV2PSVzIHR5cGU9JXMgdXNlcnM9JWRcbiIsCkBAIC0xNTkwLDE1ICsxODUxLDE3IEBACiAJZmgtPnR5cGUgPSBmaF90eXBlOwogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZoOwogCi0JaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAmJiBkZXYtPnVzZXJzID09IDApIHsKKwlpZiAoZGV2LT51c2VycyA9PSAwKSB7CiAJCWVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9BTkFMT0dfTU9ERSk7Ci0JCWVtMjh4eF9yZXNvbHV0aW9uX3NldChkZXYpOwogCi0JCS8qIE5lZWRlZCwgc2luY2UgR1BJTyBtaWdodCBoYXZlIGRpc2FibGVkIHBvd2VyIG9mCi0JCSAgIHNvbWUgaTJjIGRldmljZQorCQlpZiAodmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfUkFESU8pCisJCQllbTI4eHhfcmVzb2x1dGlvbl9zZXQoZGV2KTsKKworCQkvKgorCQkgKiBOZWVkZWQsIHNpbmNlIEdQSU8gbWlnaHQgaGF2ZSBkaXNhYmxlZCBwb3dlcgorCQkgKiBvZiBzb21lIGkyYyBkZXZpY2VzCiAJCSAqLwogCQllbTI4eHhfd2FrZV9pMmMoZGV2KTsKLQogCX0KIAogCWlmICh2ZGV2LT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgewpAQCAtMTYxNSw0MCArMTg3OCw1OSBAQAogfQogCiAvKgotICogZW0yOHh4X3JlYWxlYXNlX3Jlc291cmNlcygpCisgKiBlbTI4eHhfdjRsMl9maW5pKCkKICAqIHVucmVnaXN0ZXJzIHRoZSB2NGwyLGkyYyBhbmQgdXNiIGRldmljZXMKICAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25lY3RlZCBvciBhdCBtb2R1bGUgdW5sb2FkCiAqLwotdm9pZCBlbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldikKK3N0YXRpYyBpbnQgZW0yOHh4X3Y0bDJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CisJaWYgKGRldi0+aXNfYXVkaW9fb25seSkgeworCQkvKiBTaG91bGRuJ3QgaW5pdGlhbGl6ZSBJUiBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKwkJcmV0dXJuIDA7CisJfQogCi0JLypGSVhNRTogSTJDIElSIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQgKi8KKwlpZiAoIWRldi0+aGFzX3ZpZGVvKSB7CisJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHY0bDIgZXh0ZW5zaW9uICovCisJCXJldHVybiAwOworCX0KKworCWVtMjh4eF9pbmZvKCJDbG9zaW5nIHZpZGVvIGV4dGVuc2lvbiIpOworCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKworCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJmRldi0+djRsMl9kZXYpOworCisJZW0yOHh4X3VuaW5pdF91c2JfeGZlcihkZXYsIEVNMjhYWF9BTkFMT0dfTU9ERSk7CiAKIAlpZiAoZGV2LT5yYWRpb19kZXYpIHsKLQkJaWYgKHZpZGVvX2lzX3JlZ2lzdGVyZWQoZGV2LT5yYWRpb19kZXYpKQotCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYpOwotCQllbHNlCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnJhZGlvX2Rldik7Ci0JCWRldi0+cmFkaW9fZGV2ID0gTlVMTDsKKwkJZW0yOHh4X2luZm8oIlY0TDIgZGV2aWNlICVzIGRlcmVnaXN0ZXJlZFxuIiwKKwkJCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+cmFkaW9fZGV2KSk7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+cmFkaW9fZGV2KTsKIAl9CiAJaWYgKGRldi0+dmJpX2RldikgewogCQllbTI4eHhfaW5mbygiVjRMMiBkZXZpY2UgJXMgZGVyZWdpc3RlcmVkXG4iLAogCQkJICAgIHZpZGVvX2RldmljZV9ub2RlX25hbWUoZGV2LT52YmlfZGV2KSk7Ci0JCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+dmJpX2RldikpCi0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYpOwotCQllbHNlCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnZiaV9kZXYpOwotCQlkZXYtPnZiaV9kZXYgPSBOVUxMOworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYpOwogCX0KIAlpZiAoZGV2LT52ZGV2KSB7CiAJCWVtMjh4eF9pbmZvKCJWNEwyIGRldmljZSAlcyBkZXJlZ2lzdGVyZWRcbiIsCiAJCQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShkZXYtPnZkZXYpKTsKLQkJaWYgKHZpZGVvX2lzX3JlZ2lzdGVyZWQoZGV2LT52ZGV2KSkKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmRldik7Ci0JCWVsc2UKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+dmRldik7Ci0JCWRldi0+dmRldiA9IE5VTEw7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmRldik7CiAJfQorCisJaWYgKGRldi0+Y2xrKSB7CisJCXY0bDJfY2xrX3VucmVnaXN0ZXJfZml4ZWQoZGV2LT5jbGspOworCQlkZXYtPmNsayA9IE5VTEw7CisJfQorCisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmZGV2LT5jdHJsX2hhbmRsZXIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOworCisJaWYgKGRldi0+dXNlcnMpCisJCWVtMjh4eF93YXJuKCJEZXZpY2UgaXMgb3BlbiAhIE1lbW9yeSBkZWFsbG9jYXRpb24gaXMgZGVmZXJyZWQgb24gbGFzdCBjbG9zZS5cbiIpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTY2OCwxNCArMTk1MCwxMCBAQAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKIAlpZiAoZGV2LT51c2VycyA9PSAxKSB7Ci0JCS8qIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBkaXNjb25uZWN0LAotCQkgICBmcmVlIHRoZSByZW1haW5pbmcgcmVzb3VyY2VzICovCisJCS8qIGZyZWUgdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgaWYgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCAqLwogCQlpZiAoZGV2LT5kaXNjb25uZWN0ZWQpIHsKLQkJCWVtMjh4eF9yZWxlYXNlX3Jlc291cmNlcyhkZXYpOwogCQkJa2ZyZWUoZGV2LT5hbHRfbWF4X3BrdF9zaXplX2lzb2MpOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQkJa2ZyZWUoZGV2KTsKLQkJCXJldHVybiAwOworCQkJZ290byBleGl0OwogCQl9CiAKIAkJLyogU2F2ZSBzb21lIHBvd2VyIGJ5IHB1dHRpbmcgdHVuZXIgdG8gc2xlZXAgKi8KQEAgLTE2OTQsMTEgKzE5NzIsMjkgQEAKIAkJfQogCX0KIAorZXhpdDoKIAlkZXYtPnVzZXJzLS07CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiAwOwogfQogCisvKgorICogZW0yOHh4X3ZpZGVvZGV2aWNlX3JlbGVhc2UoKQorICogY2FsbGVkIHdoZW4gdGhlIGxhc3QgdXNlciBvZiB0aGUgdmlkZW8gZGV2aWNlIGV4aXRzIGFuZCBmcmVlcyB0aGUgbWVtZW9yeQorICovCitzdGF0aWMgdm9pZCBlbTI4eHhfdmlkZW9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXN0cnVjdCBlbTI4eHggKmRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmRldik7CisJaWYgKHZkZXYgPT0gZGV2LT52ZGV2KQorCQlkZXYtPnZkZXYgPSBOVUxMOworCWVsc2UgaWYgKHZkZXYgPT0gZGV2LT52YmlfZGV2KQorCQlkZXYtPnZiaV9kZXYgPSBOVUxMOworCWVsc2UgaWYgKHZkZXYgPT0gZGV2LT5yYWRpb19kZXYpCisJCWRldi0+cmFkaW9fZGV2ID0gTlVMTDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBlbTI4eHhfdjRsX2ZvcHMgPSB7CiAJLm93bmVyICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICA9IGVtMjh4eF92NGwyX29wZW4sCkBAIC0xNzUzLDExICsyMDQ5LDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZpZGVvX2RldmljZSBlbTI4eHhfdmlkZW9fdGVtcGxhdGUgPSB7Ci0JLmZvcHMgICAgICAgICAgICAgICAgICAgICAgID0gJmVtMjh4eF92NGxfZm9wcywKLQkucmVsZWFzZSAgICAgICAgICAgICAgICAgICAgPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKLQkuaW9jdGxfb3BzIAkJICAgID0gJnZpZGVvX2lvY3RsX29wcywKLQotCS50dm5vcm1zICAgICAgICAgICAgICAgICAgICA9IFY0TDJfU1REX0FMTCwKKwkuZm9wcwkJPSAmZW0yOHh4X3Y0bF9mb3BzLAorCS5pb2N0bF9vcHMJPSAmdmlkZW9faW9jdGxfb3BzLAorCS5yZWxlYXNlCT0gZW0yOHh4X3ZpZGVvZGV2aWNlX3JlbGVhc2UsCisJLnR2bm9ybXMJPSBWNEwyX1NURF9BTEwsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHJhZGlvX2ZvcHMgPSB7CkBAIC0xNzgzLDE1ICsyMDc4LDMxIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBlbTI4eHhfcmFkaW9fdGVtcGxhdGUgPSB7Ci0JLm5hbWUgICAgICAgICAgICAgICAgID0gImVtMjh4eC1yYWRpbyIsCi0JLmZvcHMgICAgICAgICAgICAgICAgID0gJnJhZGlvX2ZvcHMsCi0JLmlvY3RsX29wcyAJICAgICAgPSAmcmFkaW9faW9jdGxfb3BzLAorCS5mb3BzCQk9ICZyYWRpb19mb3BzLAorCS5pb2N0bF9vcHMJPSAmcmFkaW9faW9jdGxfb3BzLAorCS5yZWxlYXNlCT0gZW0yOHh4X3ZpZGVvZGV2aWNlX3JlbGVhc2UsCit9OworCisvKiBJMkMgcG9zc2libGUgYWRkcmVzcyB0byBzYWE3MTE1LCB0dnA1MTUwLCBtc3AzNDAwLCB0dmF1ZGlvICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2FhNzExeF9hZGRyc1tdID0geworCTB4NGEgPj4gMSwgMHg0OCA+PiAxLCAgIC8qIFNBQTcxMTEsIFNBQTcxMTFBIGFuZCBTQUE3MTEzICovCisJMHg0MiA+PiAxLCAweDQwID4+IDEsICAgLyogU0FBNzExNCwgU0FBNzExNSBhbmQgU0FBNzExOCAqLworCUkyQ19DTElFTlRfRU5EIH07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0dnA1MTUwX2FkZHJzW10gPSB7CisJMHhiOCA+PiAxLAorCTB4YmEgPj4gMSwKKwlJMkNfQ0xJRU5UX0VORAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1zcDM0MDBfYWRkcnNbXSA9IHsKKwkweDgwID4+IDEsCisJMHg4OCA+PiAxLAorCUkyQ19DTElFTlRfRU5ECiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdXNiIGludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQotCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqZW0yOHh4X3ZkZXZfaW5pdChzdHJ1Y3QgZW0yOHh4ICpkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAogCQkJCQljb25zdCBjaGFyICp0eXBlX25hbWUpCkBAIC0xODE3LDE0ICsyMTI4LDE5OCBAQAogCXJldHVybiB2ZmQ7CiB9CiAKLWludCBlbTI4eHhfcmVnaXN0ZXJfYW5hbG9nX2RldmljZXMoc3RydWN0IGVtMjh4eCAqZGV2KQorc3RhdGljIHZvaWQgZW0yOHh4X3R1bmVyX3NldHVwKHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlzdHJ1Y3QgdHVuZXJfc2V0dXAgICAgICAgICAgIHR1bl9zZXR1cDsKKwlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgICAgICAgIGY7CisKKwlpZiAoZGV2LT50dW5lcl90eXBlID09IFRVTkVSX0FCU0VOVCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZ0dW5fc2V0dXAsIDAsIHNpemVvZih0dW5fc2V0dXApKTsKKworCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87CisJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gZW0yOHh4X3R1bmVyX2NhbGxiYWNrOworCisJaWYgKGRldi0+Ym9hcmQucmFkaW8udHlwZSkgeworCQl0dW5fc2V0dXAudHlwZSA9IGRldi0+Ym9hcmQucmFkaW8udHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBkZXYtPmJvYXJkLnJhZGlvX2FkZHI7CisKKwkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnR1bl9zZXR1cCk7CisJfQorCisJaWYgKChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKSAmJiAoZGV2LT50dW5lcl90eXBlKSkgeworCQl0dW5fc2V0dXAudHlwZSAgID0gZGV2LT50dW5lcl90eXBlOworCQl0dW5fc2V0dXAuYWRkciAgID0gZGV2LT50dW5lcl9hZGRyOworCisJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190eXBlX2FkZHIsICZ0dW5fc2V0dXApOworCX0KKworCWlmIChkZXYtPnRkYTk4ODdfY29uZikgeworCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgdGRhOTg4N19jZmc7CisKKwkJdGRhOTg4N19jZmcudHVuZXIgPSBUVU5FUl9UREE5ODg3OworCQl0ZGE5ODg3X2NmZy5wcml2ID0gJmRldi0+dGRhOTg4N19jb25mOworCisJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsICZ0ZGE5ODg3X2NmZyk7CisJfQorCisJaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9YQzIwMjgpIHsKKwkJc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnICB4YzIwMjhfY2ZnOworCQlzdHJ1Y3QgeGMyMDI4X2N0cmwgICAgICAgICAgIGN0bDsKKworCQltZW1zZXQoJnhjMjAyOF9jZmcsIDAsIHNpemVvZih4YzIwMjhfY2ZnKSk7CisJCW1lbXNldCgmY3RsLCAwLCBzaXplb2YoY3RsKSk7CisKKwkJZW0yOHh4X3NldHVwX3hjMzAyOChkZXYsICZjdGwpOworCisJCXhjMjAyOF9jZmcudHVuZXIgPSBUVU5FUl9YQzIwMjg7CisJCXhjMjAyOF9jZmcucHJpdiAgPSAmY3RsOworCisJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsICZ4YzIwMjhfY2ZnKTsKKwl9CisKKwkvKiBjb25maWd1cmUgdHVuZXIgKi8KKwlmLnR1bmVyID0gMDsKKwlmLnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwlmLmZyZXF1ZW5jeSA9IDkwNzY7ICAgICAvKiBqdXN0IGEgbWFnaWMgbnVtYmVyICovCisJZGV2LT5jdGxfZnJlcSA9IGYuZnJlcXVlbmN5OworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksICZmKTsKK30KKworc3RhdGljIGludCBlbTI4eHhfdjRsMl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAl1OCB2YWw7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgbWF4dzsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCA9ICZkZXYtPmN0cmxfaGFuZGxlcjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiB2NGwyIGRyaXZlciB2ZXJzaW9uICVzXG4iLAotCQlkZXYtPm5hbWUsIEVNMjhYWF9WRVJTSU9OKTsKKwlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7CisJCS8qIFNob3VsZG4ndCBpbml0aWFsaXplIElSIGZvciB0aGlzIGludGVyZmFjZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldi0+aGFzX3ZpZGVvKSB7CisJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHY0bDIgZXh0ZW5zaW9uICovCisJCXJldHVybiAwOworCX0KKworCWVtMjh4eF9pbmZvKCJSZWdpc3RlcmluZyBWNEwyIGV4dGVuc2lvblxuIik7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+dWRldi0+ZGV2LCAmZGV2LT52NGwyX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZW0yOHh4X2VycmRldigiQ2FsbCB0byB2NGwyX2RldmljZV9yZWdpc3RlcigpIGZhaWxlZCFcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KGhkbCwgOCk7CisJZGV2LT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSBoZGw7CisKKwkvKgorCSAqIERlZmF1bHQgZm9ybWF0LCB1c2VkIGZvciB0dnA1MTUwIG9yIHNhYTcxMXggb3V0cHV0IGZvcm1hdHMKKwkgKi8KKwlkZXYtPnZpbm1vZGUgPSAweDEwOworCWRldi0+dmluY3RsICA9IEVNMjhYWF9WSU5DVFJMX0lOVEVSTEFDRUQgfAorCQkgICAgICAgRU0yOFhYX1ZJTkNUUkxfQ0NJUjY1Nl9FTkFCTEU7CisKKwkvKiByZXF1ZXN0IHNvbWUgbW9kdWxlcyAqLworCisJaWYgKGRldi0+Ym9hcmQuaGFzX21zcDM0eHgpCisJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAorCQkJIm1zcDM0MDAiLCAwLCBtc3AzNDAwX2FkZHJzKTsKKworCWlmIChkZXYtPmJvYXJkLmRlY29kZXIgPT0gRU0yOFhYX1NBQTcxMVgpCisJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAorCQkJInNhYTcxMTVfYXV0byIsIDAsIHNhYTcxMXhfYWRkcnMpOworCisJaWYgKGRldi0+Ym9hcmQuZGVjb2RlciA9PSBFTTI4WFhfVFZQNTE1MCkKKwkJdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwgJmRldi0+aTJjX2FkYXBbZGV2LT5kZWZfaTJjX2J1c10sCisJCQkidHZwNTE1MCIsIDAsIHR2cDUxNTBfYWRkcnMpOworCisJaWYgKGRldi0+Ym9hcmQuYWRlY29kZXIgPT0gRU0yOFhYX1RWQVVESU8pCisJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLAorCQkJInR2YXVkaW8iLCBkZXYtPmJvYXJkLnR2YXVkaW9fYWRkciwgTlVMTCk7CisKKwkvKiBJbml0aWFsaXplIHR1bmVyIGFuZCBjYW1lcmEgKi8KKworCWlmIChkZXYtPmJvYXJkLnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKSB7CisJCWludCBoYXNfZGVtb2QgPSAoZGV2LT50ZGE5ODg3X2NvbmYgJiBUREE5ODg3X1BSRVNFTlQpOworCisJCWlmIChkZXYtPmJvYXJkLnJhZGlvLnR5cGUpCisJCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKKwkJCQkidHVuZXIiLCBkZXYtPmJvYXJkLnJhZGlvX2FkZHIsIE5VTEwpOworCisJCWlmIChoYXNfZGVtb2QpCisJCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LAorCQkJCSZkZXYtPmkyY19hZGFwW2Rldi0+ZGVmX2kyY19idXNdLCAidHVuZXIiLAorCQkJCTAsIHY0bDJfaTJjX3R1bmVyX2FkZHJzKEFERFJTX0RFTU9EKSk7CisJCWlmIChkZXYtPnR1bmVyX2FkZHIgPT0gMCkgeworCQkJZW51bSB2NGwyX2kyY190dW5lcl90eXBlIHR5cGUgPQorCQkJCWhhc19kZW1vZCA/IEFERFJTX1RWX1dJVEhfREVNT0QgOiBBRERSU19UVjsKKwkJCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwkJCXNkID0gdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwKKwkJCQkmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwgInR1bmVyIiwKKwkJCQkwLCB2NGwyX2kyY190dW5lcl9hZGRycyh0eXBlKSk7CisKKwkJCWlmIChzZCkKKwkJCQlkZXYtPnR1bmVyX2FkZHIgPSB2NGwyX2kyY19zdWJkZXZfYWRkcihzZCk7CisJCX0gZWxzZSB7CisJCQl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcFtkZXYtPmRlZl9pMmNfYnVzXSwKKwkJCQkidHVuZXIiLCBkZXYtPnR1bmVyX2FkZHIsIE5VTEwpOworCQl9CisJfQorCisJZW0yOHh4X3R1bmVyX3NldHVwKGRldik7CisJZW0yOHh4X2luaXRfY2FtZXJhKGRldik7CisKKwkvKiBDb25maWd1cmUgYXVkaW8gKi8KKwlyZXQgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQllbTI4eHhfZXJyZGV2KCIlczogRXJyb3Igd2hpbGUgc2V0dGluZyBhdWRpbyAtIGVycm9yIFslZF0hXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gdW5yZWdpc3Rlcl9kZXY7CisJfQorCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgeworCQl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZlbTI4eHhfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9BVURJT19NVVRFLCAwLCAxLCAxLCAxKTsKKwkJdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmZW0yOHh4X2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQVVESU9fVk9MVU1FLCAwLCAweDFmLCAxLCAweDFmKTsKKwl9IGVsc2UgeworCQkvKiBpbnN0YWxsIHRoZSBlbTI4eHggbm90aWZ5IGNhbGxiYWNrICovCisJCXY0bDJfY3RybF9ub3RpZnkodjRsMl9jdHJsX2ZpbmQoaGRsLCBWNEwyX0NJRF9BVURJT19NVVRFKSwKKwkJCQllbTI4eHhfY3RybF9ub3RpZnksIGRldik7CisJCXY0bDJfY3RybF9ub3RpZnkodjRsMl9jdHJsX2ZpbmQoaGRsLCBWNEwyX0NJRF9BVURJT19WT0xVTUUpLAorCQkJCWVtMjh4eF9jdHJsX25vdGlmeSwgZGV2KTsKKwl9CisKKwkvKiB3YWtlIGkyYyBkZXZpY2VzICovCisJZW0yOHh4X3dha2VfaTJjKGRldik7CisKKwkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJpcS5hY3RpdmUpOworCisJaWYgKGRldi0+Ym9hcmQuaGFzX21zcDM0eHgpIHsKKwkJLyogU2VuZCBhIHJlc2V0IHRvIG90aGVyIGNoaXBzIHZpYSBncGlvICovCisJCXJldCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4MjBfUjA4X0dQSU9fQ1RSTCwgMHhmNyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyAtIG1zcDM0eHgoMSkgZmFpbGVkISBlcnJvciBbJWRdXG4iLAorCQkJCSAgICAgIF9fZnVuY19fLCByZXQpOworCQkJZ290byB1bnJlZ2lzdGVyX2RldjsKKwkJfQorCQltc2xlZXAoMyk7CisKKwkJcmV0ID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjgyMF9SMDhfR1BJT19DVFJMLCAweGZmKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnIC0gbXNwMzR4eCgyKSBmYWlsZWQhIGVycm9yIFslZF1cbiIsCisJCQkJICAgICAgX19mdW5jX18sIHJldCk7CisJCQlnb3RvIHVucmVnaXN0ZXJfZGV2OworCQl9CisJCW1zbGVlcCgzKTsKKwl9CiAKIAkvKiBzZXQgZGVmYXVsdCBub3JtICovCiAJZGV2LT5ub3JtID0gVjRMMl9TVERfUEFMOwpAQCAtMTg4OCwxNCArMjM4MywxNiBAQAogCS8qIFJlc2V0IGltYWdlIGNvbnRyb2xzICovCiAJZW0yOHh4X2NvbG9ybGV2ZWxzX3NldF9kZWZhdWx0KGRldik7CiAJdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJmRldi0+Y3RybF9oYW5kbGVyKTsKLQlpZiAoZGV2LT5jdHJsX2hhbmRsZXIuZXJyb3IpCi0JCXJldHVybiBkZXYtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwlyZXQgPSBkZXYtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwlpZiAocmV0KQorCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCiAJLyogYWxsb2NhdGUgYW5kIGZpbGwgdmlkZW8gdmlkZW9fZGV2aWNlIHN0cnVjdCAqLwogCWRldi0+dmRldiA9IGVtMjh4eF92ZGV2X2luaXQoZGV2LCAmZW0yOHh4X3ZpZGVvX3RlbXBsYXRlLCAidmlkZW8iKTsKIAlpZiAoIWRldi0+dmRldikgewogCQllbTI4eHhfZXJyZGV2KCJjYW5ub3QgYWxsb2NhdGUgdmlkZW9fZGV2aWNlLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCX0KIAlkZXYtPnZkZXYtPnF1ZXVlID0gJmRldi0+dmJfdmlkcTsKIAlkZXYtPnZkZXYtPnF1ZXVlLT5sb2NrID0gJmRldi0+dmJfcXVldWVfbG9jazsKQEAgLTE5MjUsNyArMjQyMiw3IEBACiAJaWYgKHJldCkgewogCQllbTI4eHhfZXJyZGV2KCJ1bmFibGUgdG8gcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIChlcnJvcj0laSkuXG4iLAogCQkJICAgICAgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byB1bnJlZ2lzdGVyX2RldjsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgZmlsbCB2YmkgdmlkZW9fZGV2aWNlIHN0cnVjdCAqLwpAQCAtMTk1NCw3ICsyNDUxLDcgQEAKIAkJCQkJICAgIHZiaV9ucltkZXYtPmRldm5vXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQllbTI4eHhfZXJyZGV2KCJ1bmFibGUgdG8gcmVnaXN0ZXIgdmJpIGRldmljZVxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byB1bnJlZ2lzdGVyX2RldjsKIAkJfQogCX0KIApAQCAtMTk2MywxMyArMjQ2MCwxNCBAQAogCQkJCQkJICAicmFkaW8iKTsKIAkJaWYgKCFkZXYtPnJhZGlvX2RldikgewogCQkJZW0yOHh4X2VycmRldigiY2Fubm90IGFsbG9jYXRlIHZpZGVvX2RldmljZS5cbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byB1bnJlZ2lzdGVyX2RldjsKIAkJfQogCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYsIFZGTF9UWVBFX1JBRElPLAogCQkJCQkgICAgcmFkaW9fbnJbZGV2LT5kZXZub10pOwogCQlpZiAocmV0IDwgMCkgewogCQkJZW0yOHh4X2VycmRldigiY2FuJ3QgcmVnaXN0ZXIgcmFkaW8gZGV2aWNlXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCQl9CiAJCWVtMjh4eF9pbmZvKCJSZWdpc3RlcmVkIHJhZGlvIGRldmljZSBhcyAlc1xuIiwKIAkJCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+cmFkaW9fZGV2KSk7CkBAIC0xOTgyLDUgKzI0ODAsNDEgQEAKIAkJZW0yOHh4X2luZm8oIlY0TDIgVkJJIGRldmljZSByZWdpc3RlcmVkIGFzICVzXG4iLAogCQkJICAgIHZpZGVvX2RldmljZV9ub2RlX25hbWUoZGV2LT52YmlfZGV2KSk7CiAKKwkvKiBTYXZlIHNvbWUgcG93ZXIgYnkgcHV0dGluZyB0dW5lciB0byBzbGVlcCAqLworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3Bvd2VyLCAwKTsKKworCS8qIGluaXRpYWxpemUgdmlkZW9idWYyIHN0dWZmICovCisJZW0yOHh4X3ZiMl9zZXR1cChkZXYpOworCisJZW0yOHh4X2luZm8oIlY0TDIgZXh0ZW5zaW9uIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZFxuIik7CisKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIDA7CisKK3VucmVnaXN0ZXJfZGV2OgorCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmRldi0+Y3RybF9oYW5kbGVyKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKK2VycjoKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIHN0cnVjdCBlbTI4eHhfb3BzIHY0bDJfb3BzID0geworCS5pZCAgID0gRU0yOFhYX1Y0TDIsCisJLm5hbWUgPSAiRW0yOHh4IHY0bDIgRXh0ZW5zaW9uIiwKKwkuaW5pdCA9IGVtMjh4eF92NGwyX2luaXQsCisJLmZpbmkgPSBlbTI4eHhfdjRsMl9maW5pLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW0yOHh4X3ZpZGVvX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24oJnY0bDJfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVtMjh4eF92aWRlb191bnJlZ2lzdGVyKHZvaWQpCit7CisJZW0yOHh4X3VucmVnaXN0ZXJfZXh0ZW5zaW9uKCZ2NGwyX29wcyk7Cit9CisKK21vZHVsZV9pbml0KGVtMjh4eF92aWRlb19yZWdpc3Rlcik7Cittb2R1bGVfZXhpdChlbTI4eHhfdmlkZW9fdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LmggYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LmgKaW5kZXggZjg3MjZhZC4uMzJkOGE0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHguaApAQCAtMjYsNiArMjYsOSBAQAogI2lmbmRlZiBfRU0yOFhYX0gKICNkZWZpbmUgX0VNMjhYWF9ICiAKKyNkZWZpbmUgRU0yOFhYX1ZFUlNJT04gIjAuMi4xIgorI2RlZmluZSBEUklWRVJfREVTQyAgICAiRW1waWEgZW0yOHh4IGRldmljZSBkcml2ZXIiCisKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtMTMyLDYgKzEzNSw4IEBACiAjZGVmaW5lIEVNMjg4NF9CT0FSRF9DM1RFQ0hfRElHSVRBTF9EVU8JCSAgODgKICNkZWZpbmUgRU0yODc0X0JPQVJEX0RFTE9DS182MTk1OQkJICA4OQogI2RlZmluZSBFTTI4NzRfQk9BUkRfS1dPUkxEX1VCNDM1UV9WMgkJICA5MAorI2RlZmluZSBFTTI3NjVfQk9BUkRfU1BFRURMSU5LX1ZBRF9MQVBMQUNFCSAgOTEKKyNkZWZpbmUgRU0yODE3OF9CT0FSRF9QQ1RWXzQ2MUUgICAgICAgICAgICAgICAgICAgOTIKIAogLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KICNkZWZpbmUgRU0yOFhYX01JTl9CVUYgNApAQCAtMTc4LDggKzE4MywyNyBAQAogCiAjZGVmaW5lIEVNMjhYWF9JTlRFUkxBQ0VEX0RFRkFVTFQgMQogCi0vKiB0aW1lIGluIG1zZWNzIHRvIHdhaXQgZm9yIGkyYyB3cml0ZXMgdG8gZmluaXNoICovCi0jZGVmaW5lIEVNMjgwMF9JMkNfWEZFUl9USU1FT1VUCQkyMAorLyoKKyAqIFRpbWUgaW4gbXNlY3MgdG8gd2FpdCBmb3IgaTJjIHhmZXJzIHRvIGZpbmlzaC4KKyAqIDM1bXMgaXMgdGhlIG1heGltdW0gdGltZSBhIFNNQlVTIGRldmljZSBjb3VsZCB3YWl0IHdoZW4KKyAqIGNsb2NrIHN0cmV0Y2hpbmcgaXMgdXNlZC4gQXMgdGhlIHRyYW5zZmVyIGl0c2VsZiB3aWxsIHRha2UKKyAqIHNvbWUgdGltZSB0byBoYXBwZW4sIHNldCBpdCB0byAzNSBtcy4KKyAqCisgKiBPaywgSTJDIGRvZXNuJ3Qgc3BlY2lmeSBhbnkgbGltaXQuIFNvLCBldmVudHVhbGx5LCB3ZSBtYXkgbmVlZAorICogdG8gaW5jcmVhc2UgdGhpcyB0aW1lb3V0LgorICoKKyAqIEZJWE1FOiB0aGlzIGFzc3VtZXMgdGhhdCBhbiBJMkMgbWVzc2FnZSBpcyBub3QgbG9uZ2VyIHRoYW4gMW1zLgorICogVGhpcyBpcyBhY3R1YWxseSBkZXBlbmRlbnQgb24gdGhlIEkyQyBidXMgc3BlZWQsIGFsdGhvdWdoIG1vc3QKKyAqIGRldmljZXMgdXNlIGEgMTAwa0h6IGNsb2NrLiBTbywgdGhpcyBhc3N1bXRpb24gaXMgdHJ1ZSBtb3N0IG9mCisgKiB0aGUgdGltZS4KKyAqLworI2RlZmluZSBFTTI4WFhfSTJDX1hGRVJfVElNRU9VVAkJMzYKKworLyogdGltZSBpbiBtc2VjcyB0byB3YWl0IGZvciBBQzk3IHhmZXJzIHRvIGZpbmlzaCAqLworI2RlZmluZSBFTTI4WFhfQUM5N19YRkVSX1RJTUVPVVQJMTAwCisKKy8qIG1heC4gbnVtYmVyIG9mIGJ1dHRvbiBzdGF0ZSBwb2xsaW5nIGFkZHJlc3NlcyAqLworI2RlZmluZSBFTTI4WFhfTlVNX0JVVFRPTl9BRERSRVNTRVNfTUFYCQk1CiAKIGVudW0gZW0yOHh4X21vZGUgewogCUVNMjhYWF9TVVNQRU5ELApAQCAtMjg3LDggKzMxMSw3IEBACiAKIAl1bnNpZ25lZCBpbnQgaGFzX2F1ZGlvOjE7CiAKLQl1bnNpZ25lZCBpbnQgaTJzXzNyYXRlczoxOwotCXVuc2lnbmVkIGludCBpMnNfNXJhdGVzOjE7CisJdTggaTJzX3NhbXBsZXJhdGVzOwogfTsKIAogLyogZW0yOHh4IGhhcyB0d28gYXVkaW8gaW5wdXRzOiB0dW5lciBhbmQgbGluZSBpbi4KQEAgLTM3NCw2ICszOTcsMzMgQEAKIAlFTTI4WFhfVFZBVURJTywKIH07CiAKK2VudW0gZW0yOHh4X2xlZF9yb2xlIHsKKwlFTTI4WFhfTEVEX0FOQUxPR19DQVBUVVJJTkcgPSAwLAorCUVNMjhYWF9MRURfSUxMVU1JTkFUSU9OLAorCUVNMjhYWF9OVU1fTEVEX1JPTEVTLCAvKiBtdXN0IGJlIHRoZSBsYXN0ICovCit9OworCitzdHJ1Y3QgZW0yOHh4X2xlZCB7CisJZW51bSBlbTI4eHhfbGVkX3JvbGUgcm9sZTsKKwl1OCBncGlvX3JlZzsKKwl1OCBncGlvX21hc2s7CisJYm9vbCBpbnZlcnRlZDsKK307CisKK2VudW0gZW0yOHh4X2J1dHRvbl9yb2xlIHsKKwlFTTI4WFhfQlVUVE9OX1NOQVBTSE9UID0gMCwKKwlFTTI4WFhfQlVUVE9OX0lMTFVNSU5BVElPTiwKKwlFTTI4WFhfTlVNX0JVVFRPTl9ST0xFUywgLyogbXVzdCBiZSB0aGUgbGFzdCAqLworfTsKKworc3RydWN0IGVtMjh4eF9idXR0b24geworCWVudW0gZW0yOHh4X2J1dHRvbl9yb2xlIHJvbGU7CisJdTggcmVnX3I7CisJdTggcmVnX2NsZWFyaW5nOworCXU4IG1hc2s7CisJYm9vbCBpbnZlcnRlZDsKK307CisKIHN0cnVjdCBlbTI4eHhfYm9hcmQgewogCWNoYXIgKm5hbWU7CiAJaW50IHZjaGFubmVsczsKQEAgLTM5NSw3ICs0NDUsNiBAQAogCXVuc2lnbmVkIGludCBtdHNfZmlybXdhcmU6MTsKIAl1bnNpZ25lZCBpbnQgbWF4X3JhbmdlXzY0MF80ODA6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX2R2YjoxOwotCXVuc2lnbmVkIGludCBoYXNfc25hcHNob3RfYnV0dG9uOjE7CiAJdW5zaWduZWQgaW50IGlzX3dlYmNhbToxOwogCXVuc2lnbmVkIGludCB2YWxpZDoxOwogCXVuc2lnbmVkIGludCBoYXNfaXJfaTJjOjE7CkBAIC00MTAsNiArNDU5LDEyIEBACiAJc3RydWN0IGVtMjh4eF9pbnB1dCAgICAgICBpbnB1dFtNQVhfRU0yOFhYX0lOUFVUXTsKIAlzdHJ1Y3QgZW0yOHh4X2lucHV0CSAgcmFkaW87CiAJY2hhcgkJCSAgKmlyX2NvZGVzOworCisJLyogTEVEcyB0aGF0IG5lZWQgdG8gYmUgY29udHJvbGxlZCBleHBsaWNpdGx5ICovCisJc3RydWN0IGVtMjh4eF9sZWQJICAqbGVkczsKKworCS8qIEJ1dHRvbnMgKi8KKwlzdHJ1Y3QgZW0yOHh4X2J1dHRvbgkgICpidXR0b25zOwogfTsKIAogc3RydWN0IGVtMjh4eF9lZXByb20gewpAQCAtNDI2LDE1ICs0ODEsMTMgQEAKIAl1OCBzdHJpbmdfaWR4X3RhYmxlOwogfTsKIAotI2RlZmluZSBFTTI4WFhfQVVESU9fQlVGUyA1Ci0jZGVmaW5lIEVNMjhYWF9OVU1fQVVESU9fUEFDS0VUUyA2NAotI2RlZmluZSBFTTI4WFhfQVVESU9fTUFYX1BBQ0tFVF9TSVpFIDE5NiAvKiBzdGF0aWMgdmFsdWUgKi8KICNkZWZpbmUgRU0yOFhYX0NBUFRVUkVfU1RSRUFNX0VOIDEKIAogLyogZW0yOHh4IGV4dGVuc2lvbnMgKi8KICNkZWZpbmUgRU0yOFhYX0FVRElPICAgMHgxMAogI2RlZmluZSBFTTI4WFhfRFZCICAgICAweDIwCiAjZGVmaW5lIEVNMjhYWF9SQyAgICAgIDB4MzAKKyNkZWZpbmUgRU0yOFhYX1Y0TDIgICAgMHg0MAogCiAvKiBlbTI4eHggcmVzb3VyY2UgdHlwZXMgKHVzZWQgZm9yIHJlc19nZXQvcmVzX2xvY2sgZXRjICovCiAjZGVmaW5lIEVNMjhYWF9SRVNPVVJDRV9WSURFTyAweDAxCkBAIC00NDIsOCArNDk1LDkgQEAKIAogc3RydWN0IGVtMjh4eF9hdWRpbyB7CiAJY2hhciBuYW1lWzUwXTsKLQljaGFyICp0cmFuc2Zlcl9idWZmZXJbRU0yOFhYX0FVRElPX0JVRlNdOwotCXN0cnVjdCB1cmIgKnVyYltFTTI4WFhfQVVESU9fQlVGU107CisJdW5zaWduZWQgbnVtX3VyYjsKKwljaGFyICoqdHJhbnNmZXJfYnVmZmVyOworCXN0cnVjdCB1cmIgKip1cmI7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJdW5zaWduZWQgaW50IGNhcHR1cmVfdHJhbnNmZXJfZG9uZTsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gICAqY2FwdHVyZV9wY21fc3Vic3RyZWFtOwpAQCAtNDUxLDYgKzUwNSw4IEBACiAJdW5zaWduZWQgaW50IGh3cHRyX2RvbmVfY2FwdHVyZTsKIAlzdHJ1Y3Qgc25kX2NhcmQgICAgICAgICAgICAqc25kY2FyZDsKIAorCXNpemVfdCBwZXJpb2Q7CisKIAlpbnQgdXNlcnM7CiAJc3BpbmxvY2tfdCBzbG9jazsKIH07CkBAIC00ODUsMTEgKzU0MSwxMyBAQAogCWludCBtb2RlbDsJCS8qIGluZGV4IGluIHRoZSBkZXZpY2VfZGF0YSBzdHJ1Y3QgKi8KIAlpbnQgZGV2bm87CQkvKiBtYXJrcyB0aGUgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCiAJZW51bSBlbTI4eHhfY2hpcF9pZCBjaGlwX2lkOworCiAJdW5zaWduZWQgaW50IGlzX2VtMjV4eDoxOwkvKiBlbTI1eHgvZW0yNzZ4Lzd4Lzh4IGZhbWlseSBicmlkZ2UgKi8KLQogCXVuc2lnbmVkIGNoYXIgZGlzY29ubmVjdGVkOjE7CS8qIGRldmljZSBoYXMgYmVlbiBkaWNvbm5lY3RlZCAqLwotCi0JaW50IGF1ZGlvX2lmbnVtOworCXVuc2lnbmVkIGludCBoYXNfdmlkZW86MTsKKwl1bnNpZ25lZCBpbnQgaGFzX2F1ZGlvX2NsYXNzOjE7CisJdW5zaWduZWQgaW50IGhhc19hbHNhX2F1ZGlvOjE7CisJdW5zaWduZWQgaW50IGlzX2F1ZGlvX29ubHk6MTsKIAogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKIAlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybF9oYW5kbGVyOwpAQCAtNTA3LDEwICs1NjUsNiBAQAogCS8qIFZpbm1vZGUvVmluY3RsIHVzZWQgYXQgdGhlIGRyaXZlciAqLwogCWludCB2aW5tb2RlLCB2aW5jdGw7CiAKLQl1bnNpZ25lZCBpbnQgaGFzX2F1ZGlvX2NsYXNzOjE7Ci0JdW5zaWduZWQgaW50IGhhc19hbHNhX2F1ZGlvOjE7Ci0JdW5zaWduZWQgaW50IGlzX2F1ZGlvX29ubHk6MTsKLQogCS8qIENvbnRyb2xzIGF1ZGlvIHN0cmVhbWluZyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3cV90cmlnZ2VyOwkvKiBUcmlnZ2VyIHRvIHN0YXJ0L3N0b3AgYXVkaW8gZm9yIGFsc2EgbW9kdWxlICovCiAJYXRvbWljX3QgICAgICAgc3RyZWFtX3N0YXJ0ZWQ7CS8qIHN0cmVhbSBzaG91bGQgYmUgcnVubmluZyBpZiB0cnVlICovCkBAIC02MDgsNiArNjYyLDcgQEAKIAogCS8qIHVzYiB0cmFuc2ZlciAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiB0aGUgdXNiIGRldmljZSAqLworCXU4IGlmbnVtOwkJLyogbnVtYmVyIG9mIHRoZSBhc3NpZ25lZCB1c2IgaW50ZXJmYWNlICovCiAJdTggYW5hbG9nX2VwX2lzb2M7CS8qIGFkZHJlc3Mgb2YgaXNvYyBlbmRwb2ludCBmb3IgYW5hbG9nICovCiAJdTggYW5hbG9nX2VwX2J1bGs7CS8qIGFkZHJlc3Mgb2YgYnVsayBlbmRwb2ludCBmb3IgYW5hbG9nICovCiAJdTggZHZiX2VwX2lzb2M7CQkvKiBhZGRyZXNzIG9mIGlzb2MgZW5kcG9pbnQgZm9yIERWQiAqLwpAQCAtNjM5LDEwICs2OTQsMTUgQEAKIAogCWVudW0gZW0yOHh4X21vZGUgbW9kZTsKIAotCS8qIFNuYXBzaG90IGJ1dHRvbiAqLworCS8qIEJ1dHRvbiBzdGF0ZSBwb2xsaW5nICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBidXR0b25zX3F1ZXJ5X3dvcms7CisJdTggYnV0dG9uX3BvbGxpbmdfYWRkcmVzc2VzW0VNMjhYWF9OVU1fQlVUVE9OX0FERFJFU1NFU19NQVhdOworCXU4IGJ1dHRvbl9wb2xsaW5nX2xhc3RfdmFsdWVzW0VNMjhYWF9OVU1fQlVUVE9OX0FERFJFU1NFU19NQVhdOworCXU4IG51bV9idXR0b25fcG9sbGluZ19hZGRyZXNzZXM7CisJdTE2IGJ1dHRvbl9wb2xsaW5nX2ludGVydmFsOyAvKiBbbXNdICovCisJLyogU25hcHNob3QgYnV0dG9uIGlucHV0IGRldmljZSAqLwogCWNoYXIgc25hcHNob3RfYnV0dG9uX3BhdGhbMzBdOwkvKiBwYXRoIG9mIHRoZSBpbnB1dCBkZXYgKi8KIAlzdHJ1Y3QgaW5wdXRfZGV2ICpzYnV0dG9uX2lucHV0X2RldjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNidXR0b25fcXVlcnlfd29yazsKIAogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmI7CiB9OwpAQCAtNjcyLDYgKzczMiw3IEBACiBpbnQgZW0yOHh4X3dyaXRlX3JlZyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiByZWcsIHU4IHZhbCk7CiBpbnQgZW0yOHh4X3dyaXRlX3JlZ19iaXRzKHN0cnVjdCBlbTI4eHggKmRldiwgdTE2IHJlZywgdTggdmFsLAogCQkJCSB1OCBiaXRtYXNrKTsKK2ludCBlbTI4eHhfdG9nZ2xlX3JlZ19iaXRzKHN0cnVjdCBlbTI4eHggKmRldiwgdTE2IHJlZywgdTggYml0bWFzayk7CiAKIGludCBlbTI4eHhfcmVhZF9hYzk3KHN0cnVjdCBlbTI4eHggKmRldiwgdTggcmVnKTsKIGludCBlbTI4eHhfd3JpdGVfYWM5NyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IHJlZywgdTE2IHZhbCk7CkBAIC02NzksMTIgKzc0MCw5IEBACiBpbnQgZW0yOHh4X2F1ZGlvX2FuYWxvZ19zZXQoc3RydWN0IGVtMjh4eCAqZGV2KTsKIGludCBlbTI4eHhfYXVkaW9fc2V0dXAoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAotaW50IGVtMjh4eF9jb2xvcmxldmVsc19zZXRfZGVmYXVsdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOworY29uc3Qgc3RydWN0IGVtMjh4eF9sZWQgKmVtMjh4eF9maW5kX2xlZChzdHJ1Y3QgZW0yOHh4ICpkZXYsCisJCQkJCSBlbnVtIGVtMjh4eF9sZWRfcm9sZSByb2xlKTsKIGludCBlbTI4eHhfY2FwdHVyZV9zdGFydChzdHJ1Y3QgZW0yOHh4ICpkZXYsIGludCBzdGFydCk7Ci1pbnQgZW0yOHh4X3ZiaV9zdXBwb3J0ZWQoc3RydWN0IGVtMjh4eCAqZGV2KTsKLWludCBlbTI4eHhfc2V0X291dGZtdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotaW50IGVtMjh4eF9yZXNvbHV0aW9uX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotaW50IGVtMjh4eF9zZXRfYWx0ZXJuYXRlKHN0cnVjdCBlbTI4eHggKmRldik7CiBpbnQgZW0yOHh4X2FsbG9jX3VyYnMoc3RydWN0IGVtMjh4eCAqZGV2LCBlbnVtIGVtMjh4eF9tb2RlIG1vZGUsIGludCB4ZmVyX2J1bGssCiAJCSAgICAgIGludCBudW1fYnVmcywgaW50IG1heF9wa3Rfc2l6ZSwgaW50IHBhY2tldF9tdWx0aXBsaWVyKTsKIGludCBlbTI4eHhfaW5pdF91c2JfeGZlcihzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgbW9kZSwKQEAgLTY5NiwzMCArNzU0LDE4IEBACiB2b2lkIGVtMjh4eF9zdG9wX3VyYnMoc3RydWN0IGVtMjh4eCAqZGV2KTsKIGludCBlbTI4eHhfc2V0X21vZGUoc3RydWN0IGVtMjh4eCAqZGV2LCBlbnVtIGVtMjh4eF9tb2RlIHNldF9tb2RlKTsKIGludCBlbTI4eHhfZ3Bpb19zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgKmdwaW8pOwotdm9pZCBlbTI4eHhfd2FrZV9pMmMoc3RydWN0IGVtMjh4eCAqZGV2KTsKIGludCBlbTI4eHhfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHhfb3BzICpkZXYpOwogdm9pZCBlbTI4eHhfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKmRldik7CiB2b2lkIGVtMjh4eF9pbml0X2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogdm9pZCBlbTI4eHhfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldik7CiAKLS8qIFByb3ZpZGVkIGJ5IGVtMjh4eC12aWRlby5jICovCi1pbnQgZW0yOHh4X3ZiMl9zZXR1cChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotaW50IGVtMjh4eF9yZWdpc3Rlcl9hbmFsb2dfZGV2aWNlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldik7Ci12b2lkIGVtMjh4eF9jdHJsX25vdGlmeShzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCB2b2lkICpwcml2KTsKLWludCBlbTI4eHhfc3RhcnRfYW5hbG9nX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50IGNvdW50KTsKLWludCBlbTI4eHhfc3RvcF92Ymlfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBlbTI4eHhfY3RybF9vcHM7Ci0KIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC1jYXJkcy5jICovCiBleHRlcm4gc3RydWN0IGVtMjh4eF9ib2FyZCBlbTI4eHhfYm9hcmRzW107CiBleHRlcm4gc3RydWN0IHVzYl9kZXZpY2VfaWQgZW0yOHh4X2lkX3RhYmxlW107CiBpbnQgZW0yOHh4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpOwordm9pZCBlbTI4eHhfc2V0dXBfeGMzMDI4KHN0cnVjdCBlbTI4eHggKmRldiwgc3RydWN0IHhjMjAyOF9jdHJsICpjdGwpOwogdm9pZCBlbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAotLyogUHJvdmlkZWQgYnkgZW0yOHh4LXZiaS5jICovCi1leHRlcm4gc3RydWN0IHZiMl9vcHMgZW0yOHh4X3ZiaV9xb3BzOwotCiAvKiBQcm92aWRlZCBieSBlbTI4eHgtY2FtZXJhLmMgKi8KIGludCBlbTI4eHhfZGV0ZWN0X3NlbnNvcihzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9pbml0X2NhbWVyYShzdHJ1Y3QgZW0yOHh4ICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItY29yZS5jIGIvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItY29yZS5jCmluZGV4IDJmMGM4OWMuLmM1NjM4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2hkcHZyL2hkcHZyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci1jb3JlLmMKQEAgLTE5OCw3ICsxOTgsNiBAQAogCWhleF9kdW1wX3RvX2J1ZmZlcihyZXNwb25zZSwgOCwgMTYsIDEsIHByaW50X2J1ZiwgNSpidWZfc2l6ZSsxLCAwKTsKIAl2NGwyX2RiZyhNU0dfSU5GTywgaGRwdnJfZGVidWcsICZkZXYtPnY0bDJfZGV2LCAiIHJlc3BvbnNlOiAlc1xuIiwKIAkJIHByaW50X2J1Zik7Ci0Ja2ZyZWUocHJpbnRfYnVmKTsKICNlbmRpZgogCiAJbXNsZWVwKDEwMCk7CkBAIC0yMTQsNiArMjEzLDkgQEAKIAlyZXR2YWwgPSByZXQgIT0gODsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+dXNiY19tdXRleCk7CisjaWZkZWYgSERQVlJfREVCVUcKKwlrZnJlZShwcmludF9idWYpOworI2VuZGlmCiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jCmluZGV4IDc4YzliYzguLmFiZjM2NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9wd2MvcHdjLWlmLmMKQEAgLTEwNzgsNyArMTA3OCw2IEBACiAJLyogcmVnaXN0ZXIgd2ViY2FtIHNuYXBzaG90IGJ1dHRvbiBpbnB1dCBkZXZpY2UgKi8KIAlwZGV2LT5idXR0b25fZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFwZGV2LT5idXR0b25fZGV2KSB7Ci0JCVBXQ19FUlJPUigiRXJyLCBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciB3ZWJjYW0gc25hcHNob3QgYnV0dG9uIGRldmljZS4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl92aWRlb191bnJlZzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmFmMjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotY29uZmlnIFVTQl9TTjlDMTAyCi0JdHJpc3RhdGUgIlVTQiBTTjlDMXh4IFBDIENhbWVyYSBDb250cm9sbGVyIHN1cHBvcnQgKERFUFJFQ0FURUQpIgotCWRlcGVuZHMgb24gVklERU9fVjRMMgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgZ3NwY2Egc29uaXhiIGFuZAotCSAgc29uaXhqIG1vZHVsZXMgaW5zdGVhZC4KLQotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIFNPTmlYIFNOOUMxMDEsCi0JICBTTjlDMTAyLCBTTjlDMTAzLCBTTjlDMTA1IGFuZCBTTjlDMTIwIFBDIENhbWVyYSBDb250cm9sbGVycy4KLQotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQ+IGZvciBtb3JlIGluZm8uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNuOWMxMDIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvS2NvbmZpZwppbmRleCA4YzA1NTY1Li4yMTg5YmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL0tjb25maWcKQEAgLTgzLDE0ICs4MywzIEBACiAJI2RlcGVuZHMgb24gSEFTX0RNQQogCXNlbGVjdCBWSURFT0JVRjJfQ09SRQogCXNlbGVjdCBWSURFT0JVRjJfTUVNT1BTCi0KLWNvbmZpZyBWSURFT19WNEwyX0lOVF9ERVZJQ0UKLQl0cmlzdGF0ZSAiVjRMMiBpbnQgZGV2aWNlIChERVBSRUNBVEVEKSIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKLQktLS1oZWxwLS0tCi0JICBBbiBlYXJseSBmcmFtZXdvcmsgZm9yIGEgaGFyZHdhcmUtaW5kZXBlbmRlbnQgaW50ZXJmYWNlIGZvcgotCSAgaW1hZ2Ugc2Vuc29ycyBhbmQgYnJpZGdlcyBldGMuIEN1cnJlbnRseSB1c2VkIGJ5IG9tYXAyNHh4Y2FtIGFuZAotCSAgdGNtODI1eCBkcml2ZXJzIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBWNEwyIHN1YmRldi4KLQotCSAgRG8gbm90IHVzZSBmb3IgbmV3IGRldmVsb3BtZW50cy4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9NYWtlZmlsZQppbmRleCAxYTg1ZWVlLi5jNmFlN2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9NYWtlZmlsZQpAQCAtMTUsNyArMTUsNiBAQAogZW5kaWYKIAogb2JqLSQoQ09ORklHX1ZJREVPX1Y0TDIpICs9IHZpZGVvZGV2Lm8KLW9iai0kKENPTkZJR19WSURFT19WNEwyX0lOVF9ERVZJQ0UpICs9IHY0bDItaW50LWRldmljZS5vCiBvYmotJChDT05GSUdfVklERU9fVjRMMikgKz0gdjRsMi1jb21tb24ubwogb2JqLSQoQ09ORklHX1ZJREVPX1Y0TDIpICs9IHY0bDItZHYtdGltaW5ncy5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY3RybHMuYwppbmRleCBmYjQ2NzkwLi42ZmYwMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWN0cmxzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jdHJscy5jCkBAIC03NDUsNiArNzQ1LDExIEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9GSUxURVJfU0hBUlBORVNTOgkJcmV0dXJuICJWUFggRGVibG9ja2luZyBFZmZlY3QgQ29udHJvbCI7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfUkVGX1BFUklPRDoJcmV0dXJuICJWUFggR29sZGVuIEZyYW1lIFJlZnJlc2ggUGVyaW9kIjsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0dPTERFTl9GUkFNRV9TRUw6CQlyZXR1cm4gIlZQWCBHb2xkZW4gRnJhbWUgSW5kaWNhdG9yIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01JTl9RUDoJCQlyZXR1cm4gIlZQWCBNaW5pbXVtIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01BWF9RUDoJCQlyZXR1cm4gIlZQWCBNYXhpbXVtIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0lfRlJBTUVfUVA6CQlyZXR1cm4gIlZQWCBJLUZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BfRlJBTUVfUVA6CQlyZXR1cm4gIlZQWCBQLUZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BST0ZJTEU6CQkJcmV0dXJuICJWUFggUHJvZmlsZSI7CiAKIAkvKiBDQU1FUkEgY29udHJvbHMgKi8KIAkvKiBLZWVwIHRoZSBvcmRlciBvZiB0aGUgJ2Nhc2UncyB0aGUgc2FtZSBhcyBpbiB2aWRlb2RldjIuaCEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItZGV2LmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWRldi5jCmluZGV4IGI1YWFhYWMuLjBhMzBkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1kZXYuYwpAQCAtODcyLDggKzg3Miw4IEBACiAKIAkvKiBTaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSB0aG91Z2h0IHRoaXMgbWlub3Igd2FzIGZyZWUgKi8KIAlXQVJOX09OKHZpZGVvX2RldmljZVt2ZGV2LT5taW5vcl0gIT0gTlVMTCk7Ci0JdmlkZW9fZGV2aWNlW3ZkZXYtPm1pbm9yXSA9IHZkZXY7CiAJdmRldi0+aW5kZXggPSBnZXRfaW5kZXgodmRldik7CisJdmlkZW9fZGV2aWNlW3ZkZXYtPm1pbm9yXSA9IHZkZXY7CiAJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAogCWlmICh2ZGV2LT5pb2N0bF9vcHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWR2LXRpbWluZ3MuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItZHYtdGltaW5ncy5jCmluZGV4IGVlNTJiOWY0Li5mNzkwMmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWR2LXRpbWluZ3MuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWR2LXRpbWluZ3MuYwpAQCAtNTE1LDYgKzUxNSw3IEBACiAJCWFzcGVjdC5kZW5vbWluYXRvciA9IDk7CiAJfQogCWltYWdlX3dpZHRoID0gKChpbWFnZV9oZWlnaHQgKiBhc3BlY3QubnVtZXJhdG9yKSAvIGFzcGVjdC5kZW5vbWluYXRvcik7CisJaW1hZ2Vfd2lkdGggPSAoaW1hZ2Vfd2lkdGggKyBHVEZfQ0VMTF9HUkFOLzIpICYgfihHVEZfQ0VMTF9HUkFOIC0gMSk7CiAKIAkvKiBIb3Jpem9udGFsICovCiAJaWYgKGRlZmF1bHRfZ3RmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1pb2N0bC5jCmluZGV4IDY4ZTZiNWUuLjcwN2FlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWlvY3RsLmMKQEAgLTI4LDYgKzI4LDkgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy92NGwyLmg+CisKIC8qIFplcm8gb3V0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCBwb2ludGVkIHRvIGJ5IHAuICBFdmVyeXRoaW5nIGFmdGVyLCBidXQKICAqIG5vdCBpbmNsdWRpbmcsIHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgY2xlYXJlZC4gKi8KICNkZWZpbmUgQ0xFQVJfQUZURVJfRklFTEQocCwgZmllbGQpIFwKQEAgLTIzMzgsNiArMjM0MSwxMiBAQAogCWVyciA9IGZ1bmMoZmlsZSwgY21kLCBwYXJnKTsKIAlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKIAkJZXJyID0gLUVOT1RUWTsKKwlpZiAoZXJyID09IDApIHsKKwkJaWYgKGNtZCA9PSBWSURJT0NfRFFCVUYpCisJCQl0cmFjZV92NGwyX2RxYnVmKHZpZGVvX2RldmRhdGEoZmlsZSktPm1pbm9yLCBwYXJnKTsKKwkJZWxzZSBpZiAoY21kID09IFZJRElPQ19RQlVGKQorCQkJdHJhY2VfdjRsMl9xYnVmKHZpZGVvX2RldmRhdGEoZmlsZSktPm1pbm9yLCBwYXJnKTsKKwl9CiAKIAlpZiAoaGFzX2FycmF5X2FyZ3MpIHsKIAkJKmtlcm5lbF9wdHIgPSB1c2VyX3B0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItbWVtMm1lbS5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1tZW0ybWVtLmMKaW5kZXggNzMwMzVlZS4uMTc4Y2U5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1tZW0ybWVtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1tZW0ybWVtLmMKQEAgLTU1OCw2ICs1NTgsOCBAQAogCiAJaWYgKG0ybV9jdHgtPm0ybV9kZXYtPm0ybV9vcHMtPnVubG9jaykKIAkJbTJtX2N0eC0+bTJtX2Rldi0+bTJtX29wcy0+dW5sb2NrKG0ybV9jdHgtPnByaXYpOworCWVsc2UgaWYgKG0ybV9jdHgtPnFfbG9jaykKKwkJbXV0ZXhfdW5sb2NrKG0ybV9jdHgtPnFfbG9jayk7CiAKIAlpZiAobGlzdF9lbXB0eSgmc3JjX3EtPmRvbmVfbGlzdCkpCiAJCXBvbGxfd2FpdChmaWxlLCAmc3JjX3EtPmRvbmVfd3EsIHdhaXQpOwpAQCAtNTY2LDYgKzU2OCw4IEBACiAKIAlpZiAobTJtX2N0eC0+bTJtX2Rldi0+bTJtX29wcy0+bG9jaykKIAkJbTJtX2N0eC0+bTJtX2Rldi0+bTJtX29wcy0+bG9jayhtMm1fY3R4LT5wcml2KTsKKwllbHNlIGlmIChtMm1fY3R4LT5xX2xvY2spCisJCW11dGV4X2xvY2sobTJtX2N0eC0+cV9sb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzcmNfcS0+ZG9uZV9sb2NrLCBmbGFncyk7CiAJaWYgKCFsaXN0X2VtcHR5KCZzcmNfcS0+ZG9uZV9saXN0KSkKQEAgLTY5Myw2ICs2OTcsMTMgQEAKIAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOworCS8qCisJICogSWYgYm90aCBxdWV1ZXMgdXNlIHNhbWUgbXV0ZXggYXNzaWduIGl0IGFzIHRoZSBjb21tb24gYnVmZmVyCisJICogcXVldWVzIGxvY2sgdG8gdGhlIG0ybSBjb250ZXh0LiBUaGlzIGxvY2sgaXMgdXNlZCBpbiB0aGUKKwkgKiB2NGwyX20ybV9pb2N0bF8qIGhlbHBlcnMuCisJICovCisJaWYgKG91dF9xX2N0eC0+cS5sb2NrID09IGNhcF9xX2N0eC0+cS5sb2NrKQorCQltMm1fY3R4LT5xX2xvY2sgPSBvdXRfcV9jdHgtPnEubG9jazsKIAogCXJldHVybiBtMm1fY3R4OwogZXJyOgpAQCAtNzQwLDMgKzc1MSwxMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfbTJtX2J1Zl9xdWV1ZSk7CiAKKy8qIFZpZGVvYnVmMiBpb2N0bCBoZWxwZXJzICovCisKK2ludCB2NGwyX20ybV9pb2N0bF9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYikKK3sKKwlzdHJ1Y3QgdjRsMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gdjRsMl9tMm1fcmVxYnVmcyhmaWxlLCBmaC0+bTJtX2N0eCwgcmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9tMm1faW9jdGxfcmVxYnVmcyk7CisKK2ludCB2NGwyX20ybV9pb2N0bF9jcmVhdGVfYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAqY3JlYXRlKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2NGwyX20ybV9jcmVhdGVfYnVmcyhmaWxlLCBmaC0+bTJtX2N0eCwgY3JlYXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfbTJtX2lvY3RsX2NyZWF0ZV9idWZzKTsKKworaW50IHY0bDJfbTJtX2lvY3RsX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBmaC0+bTJtX2N0eCwgYnVmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfbTJtX2lvY3RsX3F1ZXJ5YnVmKTsKKworaW50IHY0bDJfbTJtX2lvY3RsX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHY0bDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHY0bDJfbTJtX3FidWYoZmlsZSwgZmgtPm0ybV9jdHgsIGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX20ybV9pb2N0bF9xYnVmKTsKKworaW50IHY0bDJfbTJtX2lvY3RsX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2NGwyX20ybV9kcWJ1ZihmaWxlLCBmaC0+bTJtX2N0eCwgYnVmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfbTJtX2lvY3RsX2RxYnVmKTsKKworaW50IHY0bDJfbTJtX2lvY3RsX2V4cGJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgKmViKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2NGwyX20ybV9leHBidWYoZmlsZSwgZmgtPm0ybV9jdHgsIGViKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfbTJtX2lvY3RsX2V4cGJ1Zik7CisKK2ludCB2NGwyX20ybV9pb2N0bF9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgdjRsMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gdjRsMl9tMm1fc3RyZWFtb24oZmlsZSwgZmgtPm0ybV9jdHgsIHR5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9tMm1faW9jdGxfc3RyZWFtb24pOworCitpbnQgdjRsMl9tMm1faW9jdGxfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2NGwyX20ybV9zdHJlYW1vZmYoZmlsZSwgZmgtPm0ybV9jdHgsIHR5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9tMm1faW9jdGxfc3RyZWFtb2ZmKTsKKworLyoKKyAqIHY0bDJfZmlsZV9vcGVyYXRpb25zIGhlbHBlcnMuIEl0IGlzIGFzc3VtZWQgaGVyZSBzYW1lIGxvY2sgaXMgdXNlZAorICogZm9yIHRoZSBvdXRwdXQgYW5kIHRoZSBjYXB0dXJlIGJ1ZmZlciBxdWV1ZS4KKyAqLworCitpbnQgdjRsMl9tMm1fZm9wX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdjRsMl9tMm1fY3R4ICptMm1fY3R4ID0gZmgtPm0ybV9jdHg7CisJaW50IHJldDsKKworCWlmIChtMm1fY3R4LT5xX2xvY2sgJiYgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKG0ybV9jdHgtPnFfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyZXQgPSB2NGwyX20ybV9tbWFwKGZpbGUsIG0ybV9jdHgsIHZtYSk7CisKKwlpZiAobTJtX2N0eC0+cV9sb2NrKQorCQltdXRleF91bmxvY2sobTJtX2N0eC0+cV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX20ybV9mb3BfbW1hcCk7CisKK3Vuc2lnbmVkIGludCB2NGwyX20ybV9mb3BfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgdjRsMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY0bDJfbTJtX2N0eCAqbTJtX2N0eCA9IGZoLT5tMm1fY3R4OworCXVuc2lnbmVkIGludCByZXQ7CisKKwlpZiAobTJtX2N0eC0+cV9sb2NrKQorCQltdXRleF9sb2NrKG0ybV9jdHgtPnFfbG9jayk7CisKKwlyZXQgPSB2NGwyX20ybV9wb2xsKGZpbGUsIG0ybV9jdHgsIHdhaXQpOworCisJaWYgKG0ybV9jdHgtPnFfbG9jaykKKwkJbXV0ZXhfdW5sb2NrKG0ybV9jdHgtPnFfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9tMm1fZm9wX3BvbGwpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMKaW5kZXggYTY0NzhkYy4uNDJlM2U4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1vZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItb2YuYwpAQCAtMTIxLDkgKzEyMSwxMSBAQAogICogdGhlIGJ1cyBhcyBzZXJpYWwgQ1NJLTIgYW5kIGNsb2NrLW5vbmNvbnRpbnVvdXMgaXNuJ3Qgc2V0LCB3ZSBzZXQgdGhlCiAgKiBWNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLIGZsYWcuCiAgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIGEgcmVmZXJlbmNlIHRvIEBub2RlLgorICoKKyAqIFJldHVybjogMC4KICAqLwotdm9pZCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAqZW5kcG9pbnQpCitpbnQgdjRsMl9vZl9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAqZW5kcG9pbnQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwb3J0X25vZGUgPSBvZl9nZXRfcGFyZW50KG5vZGUpOwogCkBAIC0xNDYsNiArMTQ4LDggQEAKIAkJdjRsMl9vZl9wYXJzZV9wYXJhbGxlbF9idXMobm9kZSwgZW5kcG9pbnQpOwogCiAJb2Zfbm9kZV9wdXQocG9ydF9ub2RlKTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX29mX3BhcnNlX2VuZHBvaW50KTsKIApAQCAtMjYyLDYgKzI2Niw2IEBACiAJbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJyZW1vdGUtZW5kcG9pbnQiLCAwKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gb2ZfZ2V0X3BhcmVudChucCk7CisJcmV0dXJuIG9mX2dldF9uZXh0X3BhcmVudChucCk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmLWRtYS1jb250aWcuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmLWRtYS1jb250aWcuYwppbmRleCA2NTQxMWFkLi43ZTZiMjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1Zi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYtZG1hLWNvbnRpZy5jCkBAIC02NiwxNCArNjYsMTEgQEAKIHN0YXRpYyB2b2lkIHZpZGVvYnVmX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHZpZGVvYnVmX21hcHBpbmcgKm1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSA9IG1hcC0+cTsKIAotCWRldl9kYmcocS0+ZGV2LCAidm1fb3BlbiAlcCBbY291bnQ9JXUsdm1hPSUwOGx4LSUwOGx4XVxuIiwKKwlkZXZfZGJnKG1hcC0+cS0+ZGV2LCAidm1fb3BlbiAlcCBbY291bnQ9JXUsdm1hPSUwOGx4LSUwOGx4XVxuIiwKIAkJbWFwLCBtYXAtPmNvdW50LCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7CiAKLQl2aWRlb2J1Zl9xdWV1ZV9sb2NrKHEpOwogCW1hcC0+Y291bnQrKzsKLQl2aWRlb2J1Zl9xdWV1ZV91bmxvY2socSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpZGVvYnVmX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQpAQCAtODUsMTEgKzgyLDEyIEBACiAJZGV2X2RiZyhxLT5kZXYsICJ2bV9jbG9zZSAlcCBbY291bnQ9JXUsdm1hPSUwOGx4LSUwOGx4XVxuIiwKIAkJbWFwLCBtYXAtPmNvdW50LCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7CiAKLQl2aWRlb2J1Zl9xdWV1ZV9sb2NrKHEpOwotCWlmICghLS1tYXAtPmNvdW50KSB7CisJbWFwLT5jb3VudC0tOworCWlmICgwID09IG1hcC0+Y291bnQpIHsKIAkJc3RydWN0IHZpZGVvYnVmX2RtYV9jb250aWdfbWVtb3J5ICptZW07CiAKIAkJZGV2X2RiZyhxLT5kZXYsICJtdW5tYXAgJXAgcT0lcFxuIiwgbWFwLCBxKTsKKwkJdmlkZW9idWZfcXVldWVfbG9jayhxKTsKIAogCQkvKiBXZSBuZWVkIGZpcnN0IHRvIGNhbmNlbCBzdHJlYW1zLCBiZWZvcmUgdW5tYXBwaW5nICovCiAJCWlmIChxLT5zdHJlYW1pbmcpCkBAIC0xMjgsOCArMTI2LDggQEAKIAogCQlrZnJlZShtYXApOwogCisJCXZpZGVvYnVmX3F1ZXVlX3VubG9jayhxKTsKIAl9Ci0JdmlkZW9idWZfcXVldWVfdW5sb2NrKHEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZpZGVvYnVmX3ZtX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmLWRtYS1zZy5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYtZG1hLXNnLmMKaW5kZXggOWRiNjc0Yy4uODI4ZTdjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYtZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYtZG1hLXNnLmMKQEAgLTMzOCwxNCArMzM4LDExIEBACiBzdGF0aWMgdm9pZCB2aWRlb2J1Zl92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCB2aWRlb2J1Zl9tYXBwaW5nICptYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSBtYXAtPnE7CiAKIAlkcHJpbnRrKDIsICJ2bV9vcGVuICVwIFtjb3VudD0lZCx2bWE9JTA4bHgtJTA4bHhdXG4iLCBtYXAsCiAJCW1hcC0+Y291bnQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kKTsKIAotCXZpZGVvYnVmX3F1ZXVlX2xvY2socSk7CiAJbWFwLT5jb3VudCsrOwotCXZpZGVvYnVmX3F1ZXVlX3VubG9jayhxKTsKIH0KIAogc3RhdGljIHZvaWQgdmlkZW9idWZfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC0zNTgsOSArMzU1LDEwIEBACiAJZHByaW50aygyLCAidm1fY2xvc2UgJXAgW2NvdW50PSVkLHZtYT0lMDhseC0lMDhseF1cbiIsIG1hcCwKIAkJbWFwLT5jb3VudCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQpOwogCi0JdmlkZW9idWZfcXVldWVfbG9jayhxKTsKLQlpZiAoIS0tbWFwLT5jb3VudCkgeworCW1hcC0+Y291bnQtLTsKKwlpZiAoMCA9PSBtYXAtPmNvdW50KSB7CiAJCWRwcmludGsoMSwgIm11bm1hcCAlcCBxPSVwXG4iLCBtYXAsIHEpOworCQl2aWRlb2J1Zl9xdWV1ZV9sb2NrKHEpOwogCQlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKIAkJCWlmIChOVUxMID09IHEtPmJ1ZnNbaV0pCiAJCQkJY29udGludWU7CkBAIC0zNzYsOSArMzc0LDkgQEAKIAkJCXEtPmJ1ZnNbaV0tPmJhZGRyID0gMDsKIAkJCXEtPm9wcy0+YnVmX3JlbGVhc2UocSwgcS0+YnVmc1tpXSk7CiAJCX0KKwkJdmlkZW9idWZfcXVldWVfdW5sb2NrKHEpOwogCQlrZnJlZShtYXApOwogCX0KLQl2aWRlb2J1Zl9xdWV1ZV91bmxvY2socSk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1Zi12bWFsbG9jLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1Zi12bWFsbG9jLmMKaW5kZXggMTM2NWM2NS4uMmZmN2ZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYtdm1hbGxvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmLXZtYWxsb2MuYwpAQCAtNTQsMTQgKzU0LDExIEBACiBzdGF0aWMgdm9pZCB2aWRlb2J1Zl92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCB2aWRlb2J1Zl9tYXBwaW5nICptYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSBtYXAtPnE7CiAKIAlkcHJpbnRrKDIsICJ2bV9vcGVuICVwIFtjb3VudD0ldSx2bWE9JTA4bHgtJTA4bHhdXG4iLCBtYXAsCiAJCW1hcC0+Y291bnQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kKTsKIAotCXZpZGVvYnVmX3F1ZXVlX2xvY2socSk7CiAJbWFwLT5jb3VudCsrOwotCXZpZGVvYnVmX3F1ZXVlX3VubG9jayhxKTsKIH0KIAogc3RhdGljIHZvaWQgdmlkZW9idWZfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC03MywxMSArNzAsMTIgQEAKIAlkcHJpbnRrKDIsICJ2bV9jbG9zZSAlcCBbY291bnQ9JXUsdm1hPSUwOGx4LSUwOGx4XVxuIiwgbWFwLAogCQltYXAtPmNvdW50LCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7CiAKLQl2aWRlb2J1Zl9xdWV1ZV9sb2NrKHEpOwotCWlmICghLS1tYXAtPmNvdW50KSB7CisJbWFwLT5jb3VudC0tOworCWlmICgwID09IG1hcC0+Y291bnQpIHsKIAkJc3RydWN0IHZpZGVvYnVmX3ZtYWxsb2NfbWVtb3J5ICptZW07CiAKIAkJZHByaW50aygxLCAibXVubWFwICVwIHE9JXBcbiIsIG1hcCwgcSk7CisJCXZpZGVvYnVmX3F1ZXVlX2xvY2socSk7CiAKIAkJLyogV2UgbmVlZCBmaXJzdCB0byBjYW5jZWwgc3RyZWFtcywgYmVmb3JlIHVubWFwcGluZyAqLwogCQlpZiAocS0+c3RyZWFtaW5nKQpAQCAtMTE2LDggKzExNCw4IEBACiAKIAkJa2ZyZWUobWFwKTsKIAorCQl2aWRlb2J1Zl9xdWV1ZV91bmxvY2socSk7CiAJfQotCXZpZGVvYnVmX3F1ZXVlX3VubG9jayhxKTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItY29yZS5jCmluZGV4IDBlZGMxNjUuLmExMjc5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWNvcmUuYwpAQCAtMjk4LDEwICsyOTgsMjggQEAKICAqIHJlbGF0ZWQgaW5mb3JtYXRpb24sIGlmIG5vIGJ1ZmZlcnMgYXJlIGxlZnQgcmV0dXJuIHRoZSBxdWV1ZSB0byBhbgogICogdW5pbml0aWFsaXplZCBzdGF0ZS4gTWlnaHQgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIHF1ZXVlIGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuCiAgKi8KLXN0YXRpYyB2b2lkIF9fdmIyX3F1ZXVlX2ZyZWUoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGJ1ZmZlcnMpCitzdGF0aWMgaW50IF9fdmIyX3F1ZXVlX2ZyZWUoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGJ1ZmZlcnMpCiB7CiAJdW5zaWduZWQgaW50IGJ1ZmZlcjsKIAorCS8qCisJICogU2FuaXR5IGNoZWNrOiB3aGVuIHByZXBhcmluZyBhIGJ1ZmZlciB0aGUgcXVldWUgbG9jayBpcyByZWxlYXNlZCBmb3IKKwkgKiBhIHNob3J0IHdoaWxlIChzZWUgX19idWZfcHJlcGFyZSBmb3IgdGhlIGRldGFpbHMpLCB3aGljaCB3b3VsZCBhbGxvdworCSAqIGEgcmFjZSB3aXRoIGEgcmVxYnVmcyB3aGljaCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLiBSZW1vdmluZyB0aGUKKwkgKiBidWZmZXJzIGZyb20gdW5kZXJuZWF0aCBfX2J1Zl9wcmVwYXJlIGlzIG9idmlvdXNseSBhIGJhZCBpZGVhLCBzbyB3ZQorCSAqIGNoZWNrIGlmIGFueSBvZiB0aGUgYnVmZmVycyBpcyBpbiB0aGUgc3RhdGUgUFJFUEFSSU5HLCBhbmQgaWYgc28gd2UKKwkgKiBqdXN0IHJldHVybiAtRUFHQUlOLgorCSAqLworCWZvciAoYnVmZmVyID0gcS0+bnVtX2J1ZmZlcnMgLSBidWZmZXJzOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsKKwkgICAgICsrYnVmZmVyKSB7CisJCWlmIChxLT5idWZzW2J1ZmZlcl0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAocS0+YnVmc1tidWZmZXJdLT5zdGF0ZSA9PSBWQjJfQlVGX1NUQVRFX1BSRVBBUklORykgeworCQkJZHByaW50aygxLCAicmVxYnVmczogcHJlcGFyaW5nIGJ1ZmZlcnMsIGNhbm5vdCBmcmVlXG4iKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCiAJLyogQ2FsbCBkcml2ZXItcHJvdmlkZWQgY2xlYW51cCBmdW5jdGlvbiBmb3IgZWFjaCBidWZmZXIsIGlmIHByb3ZpZGVkICovCiAJaWYgKHEtPm9wcy0+YnVmX2NsZWFudXApIHsKIAkJZm9yIChidWZmZXIgPSBxLT5udW1fYnVmZmVycyAtIGJ1ZmZlcnM7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOwpAQCAtMzI2LDYgKzM0NCw3IEBACiAJaWYgKCFxLT5udW1fYnVmZmVycykKIAkJcS0+bWVtb3J5ID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmcS0+cXVldWVkX2xpc3QpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTQ4MSw2ICs1MDAsNyBAQAogCWNhc2UgVkIyX0JVRl9TVEFURV9QUkVQQVJFRDoKIAkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19QUkVQQVJFRDsKIAkJYnJlYWs7CisJY2FzZSBWQjJfQlVGX1NUQVRFX1BSRVBBUklORzoKIAljYXNlIFZCMl9CVUZfU1RBVEVfREVRVUVVRUQ6CiAJCS8qIG5vdGhpbmcgKi8KIAkJYnJlYWs7CkBAIC02NTcsNyArNjc3LDkgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAotCQlfX3ZiMl9xdWV1ZV9mcmVlKHEsIHEtPm51bV9idWZmZXJzKTsKKwkJcmV0ID0gX192YjJfcXVldWVfZnJlZShxLCBxLT5udW1fYnVmZmVycyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qCiAJCSAqIEluIGNhc2Ugb2YgUkVRQlVGUygwKSByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCBjYWxsaW5nCkBAIC0xMTE2LDcgKzExMzgsNyBAQAogCWludCByZXQ7CiAJaW50IHdyaXRlID0gIVY0TDJfVFlQRV9JU19PVVRQVVQocS0+dHlwZSk7CiAKLQkvKiBWZXJpZnkgYW5kIGNvcHkgcmVsZXZhbnQgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHVzZXJzcGFjZSAqLworCS8qIENvcHkgcmVsZXZhbnQgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHVzZXJzcGFjZSAqLwogCV9fZmlsbF92YjJfYnVmZmVyKHZiLCBiLCBwbGFuZXMpOwogCiAJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdmItPm51bV9wbGFuZXM7ICsrcGxhbmUpIHsKQEAgLTExMzUsNiArMTE1Nyw4IEBACiAKIAkJaWYgKHBsYW5lc1twbGFuZV0ubGVuZ3RoIDwgcGxhbmVzW3BsYW5lXS5kYXRhX29mZnNldCArCiAJCSAgICBxLT5wbGFuZV9zaXplc1twbGFuZV0pIHsKKwkJCWRwcmludGsoMSwgInFidWY6IGludmFsaWQgZG1hYnVmIGxlbmd0aCBmb3IgcGxhbmUgJWRcbiIsCisJCQkJcGxhbmUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xMjI2LDYgKzEyNTAsNyBAQAogc3RhdGljIGludCBfX2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwgY29uc3Qgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXN0cnVjdCB2YjJfcXVldWUgKnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCByd19zZW1hcGhvcmUgKm1tYXBfc2VtOwogCWludCByZXQ7CiAKIAlyZXQgPSBfX3ZlcmlmeV9sZW5ndGgodmIsIGIpOwpAQCAtMTIzNSwxMiArMTI2MCwzMiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCXZiLT5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfUFJFUEFSSU5HOwogCXN3aXRjaCAocS0+bWVtb3J5KSB7CiAJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgogCQlyZXQgPSBfX3FidWZfbW1hcCh2YiwgYik7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKwkJLyoKKwkJICogSW4gY2FzZSBvZiB1c2VyIHBvaW50ZXIgYnVmZmVycyB2YjIgYWxsb2NhdG9ycyBuZWVkIHRvIGdldAorCQkgKiBkaXJlY3QgYWNjZXNzIHRvIHVzZXJzcGFjZSBwYWdlcy4gVGhpcyByZXF1aXJlcyBnZXR0aW5nCisJCSAqIHRoZSBtbWFwIHNlbWFwaG9yZSBmb3IgcmVhZCBhY2Nlc3MgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcworCQkgKiBzdHJ1Y3R1cmUuIFRoZSBzYW1lIHNlbWFwaG9yZSBpcyB0YWtlbiBiZWZvcmUgY2FsbGluZyBtbWFwCisJCSAqIG9wZXJhdGlvbiwgd2hpbGUgYm90aCBxYnVmL3ByZXBhcmVfYnVmIGFuZCBtbWFwIGFyZSBjYWxsZWQKKwkJICogYnkgdGhlIGRyaXZlciBvciB2NGwyIGNvcmUgd2l0aCB0aGUgZHJpdmVyJ3MgbG9jayBoZWxkLgorCQkgKiBUbyBhdm9pZCBhbiBBQi1CQSBkZWFkbG9jayAobW1hcF9zZW0gdGhlbiBkcml2ZXIncyBsb2NrIGluCisJCSAqIG1tYXAgYW5kIGRyaXZlcidzIGxvY2sgdGhlbiBtbWFwX3NlbSBpbiBxYnVmL3ByZXBhcmVfYnVmKSwKKwkJICogdGhlIHZpZGVvYnVmMiBjb3JlIHJlbGVhc2VzIHRoZSBkcml2ZXIncyBsb2NrLCB0YWtlcworCQkgKiBtbWFwX3NlbSBhbmQgdGhlbiB0YWtlcyB0aGUgZHJpdmVyJ3MgbG9jayBhZ2Fpbi4KKwkJICovCisJCW1tYXBfc2VtID0gJmN1cnJlbnQtPm1tLT5tbWFwX3NlbTsKKwkJY2FsbF9xb3AocSwgd2FpdF9wcmVwYXJlLCBxKTsKKwkJZG93bl9yZWFkKG1tYXBfc2VtKTsKKwkJY2FsbF9xb3AocSwgd2FpdF9maW5pc2gsIHEpOworCiAJCXJldCA9IF9fcWJ1Zl91c2VycHRyKHZiLCBiKTsKKworCQl1cF9yZWFkKG1tYXBfc2VtKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CiAJCXJldCA9IF9fcWJ1Zl9kbWFidWYodmIsIGIpOwpAQCAtMTI1NCwxMDUgKzEyOTksMzYgQEAKIAkJcmV0ID0gY2FsbF9xb3AocSwgYnVmX3ByZXBhcmUsIHZiKTsKIAlpZiAocmV0KQogCQlkcHJpbnRrKDEsICJxYnVmOiBidWZmZXIgcHJlcGFyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQllbHNlCi0JCXZiLT5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ7CisJdmItPnN0YXRlID0gcmV0ID8gVkIyX0JVRl9TVEFURV9ERVFVRVVFRCA6IFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHZiMl9xdWV1ZV9vcl9wcmVwYXJlX2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKm9wbmFtZSwKLQkJCQkgICAgaW50ICgqaGFuZGxlcikoc3RydWN0IHZiMl9xdWV1ZSAqLAotCQkJCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICosCi0JCQkJCQkgICBzdHJ1Y3QgdmIyX2J1ZmZlciAqKSkKKwkJCQkgICAgY29uc3QgY2hhciAqb3BuYW1lKQogewotCXN0cnVjdCByd19zZW1hcGhvcmUgKm1tYXBfc2VtID0gTlVMTDsKLQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7Ci0JaW50IHJldDsKLQotCS8qCi0JICogSW4gY2FzZSBvZiB1c2VyIHBvaW50ZXIgYnVmZmVycyB2YjIgYWxsb2NhdG9ycyBuZWVkIHRvIGdldCBkaXJlY3QKLQkgKiBhY2Nlc3MgdG8gdXNlcnNwYWNlIHBhZ2VzLiBUaGlzIHJlcXVpcmVzIGdldHRpbmcgdGhlIG1tYXAgc2VtYXBob3JlCi0JICogZm9yIHJlYWQgYWNjZXNzIGluIHRoZSBjdXJyZW50IHByb2Nlc3Mgc3RydWN0dXJlLiBUaGUgc2FtZSBzZW1hcGhvcmUKLQkgKiBpcyB0YWtlbiBiZWZvcmUgY2FsbGluZyBtbWFwIG9wZXJhdGlvbiwgd2hpbGUgYm90aCBxYnVmL3ByZXBhcmVfYnVmCi0JICogYW5kIG1tYXAgYXJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIG9yIHY0bDIgY29yZSB3aXRoIHRoZSBkcml2ZXIncyBsb2NrCi0JICogaGVsZC4gVG8gYXZvaWQgYW4gQUItQkEgZGVhZGxvY2sgKG1tYXBfc2VtIHRoZW4gZHJpdmVyJ3MgbG9jayBpbiBtbWFwCi0JICogYW5kIGRyaXZlcidzIGxvY2sgdGhlbiBtbWFwX3NlbSBpbiBxYnVmL3ByZXBhcmVfYnVmKSB0aGUgdmlkZW9idWYyCi0JICogY29yZSByZWxlYXNlcyB0aGUgZHJpdmVyJ3MgbG9jaywgdGFrZXMgbW1hcF9zZW0gYW5kIHRoZW4gdGFrZXMgdGhlCi0JICogZHJpdmVyJ3MgbG9jayBhZ2Fpbi4KLQkgKgotCSAqIFRvIGF2b2lkIHJhY2luZyB3aXRoIG90aGVyIHZiMiBjYWxscywgd2hpY2ggbWlnaHQgYmUgY2FsbGVkIGFmdGVyCi0JICogcmVsZWFzaW5nIHRoZSBkcml2ZXIncyBsb2NrLCB0aGlzIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYXQgdGhlCi0JICogYmVnaW5uaW5nIG9mIHFidWYvcHJlcGFyZV9idWYgcHJvY2Vzc2luZy4gVGhpcyB3YXkgdGhlIHF1ZXVlIHN0YXR1cwotCSAqIGlzIGNvbnNpc3RlbnQgYWZ0ZXIgZ2V0dGluZyB0aGUgZHJpdmVyJ3MgbG9jayBiYWNrLgotCSAqLwotCWlmIChxLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUikgewotCQltbWFwX3NlbSA9ICZjdXJyZW50LT5tbS0+bW1hcF9zZW07Ci0JCWNhbGxfcW9wKHEsIHdhaXRfcHJlcGFyZSwgcSk7Ci0JCWRvd25fcmVhZChtbWFwX3NlbSk7Ci0JCWNhbGxfcW9wKHEsIHdhaXRfZmluaXNoLCBxKTsKLQl9Ci0KLQlpZiAocS0+ZmlsZWlvKSB7Ci0JCWRwcmludGsoMSwgIiVzKCk6IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIsIG9wbmFtZSk7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCiAJaWYgKGItPnR5cGUgIT0gcS0+dHlwZSkgewogCQlkcHJpbnRrKDEsICIlcygpOiBpbnZhbGlkIGJ1ZmZlciB0eXBlXG4iLCBvcG5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGItPmluZGV4ID49IHEtPm51bV9idWZmZXJzKSB7CiAJCWRwcmludGsoMSwgIiVzKCk6IGJ1ZmZlciBpbmRleCBvdXQgb2YgcmFuZ2VcbiIsIG9wbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl2YiA9IHEtPmJ1ZnNbYi0+aW5kZXhdOwotCWlmIChOVUxMID09IHZiKSB7CisJaWYgKHEtPmJ1ZnNbYi0+aW5kZXhdID09IE5VTEwpIHsKIAkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQlkcHJpbnRrKDEsICIlcygpOiBidWZmZXIgaXMgTlVMTFxuIiwgb3BuYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChiLT5tZW1vcnkgIT0gcS0+bWVtb3J5KSB7CiAJCWRwcmludGsoMSwgIiVzKCk6IGludmFsaWQgbWVtb3J5IHR5cGVcbiIsIG9wbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCXJldCA9IF9fdmVyaWZ5X3BsYW5lc19hcnJheSh2YiwgYik7Ci0JaWYgKHJldCkKLQkJZ290byB1bmxvY2s7Ci0KLQlyZXQgPSBoYW5kbGVyKHEsIGIsIHZiKTsKLQlpZiAocmV0KQotCQlnb3RvIHVubG9jazsKLQotCS8qIEZpbGwgYnVmZmVyIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlcnNwYWNlICovCi0JX19maWxsX3Y0bDJfYnVmZmVyKHZiLCBiKTsKLQotCWRwcmludGsoMSwgIiVzKCkgb2YgYnVmZmVyICVkIHN1Y2NlZWRlZFxuIiwgb3BuYW1lLCB2Yi0+djRsMl9idWYuaW5kZXgpOwotdW5sb2NrOgotCWlmIChtbWFwX3NlbSkKLQkJdXBfcmVhZChtbWFwX3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX3ZiMl9wcmVwYXJlX2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsCi0JCQkgICAgIHN0cnVjdCB2YjJfYnVmZmVyICp2YikKLXsKLQlpZiAodmItPnN0YXRlICE9IFZCMl9CVUZfU1RBVEVfREVRVUVVRUQpIHsKLQkJZHByaW50aygxLCAiJXMoKTogaW52YWxpZCBidWZmZXIgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJdmItPnN0YXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIF9fYnVmX3ByZXBhcmUodmIsIGIpOworCXJldHVybiBfX3ZlcmlmeV9wbGFuZXNfYXJyYXkocS0+YnVmc1tiLT5pbmRleF0sIGIpOwogfQogCiAvKioKQEAgLTEzNzIsMjIgKzEzNDgsOTUgQEAKICAqLwogaW50IHZiMl9wcmVwYXJlX2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7Ci0JcmV0dXJuIHZiMl9xdWV1ZV9vcl9wcmVwYXJlX2J1ZihxLCBiLCAicHJlcGFyZV9idWYiLCBfX3ZiMl9wcmVwYXJlX2J1Zik7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCWludCByZXQ7CisKKwlpZiAocS0+ZmlsZWlvKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSB2YjJfcXVldWVfb3JfcHJlcGFyZV9idWYocSwgYiwgInByZXBhcmVfYnVmIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZiID0gcS0+YnVmc1tiLT5pbmRleF07CisJaWYgKHZiLT5zdGF0ZSAhPSBWQjJfQlVGX1NUQVRFX0RFUVVFVUVEKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGludmFsaWQgYnVmZmVyIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJCXZiLT5zdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IF9fYnVmX3ByZXBhcmUodmIsIGIpOworCWlmICghcmV0KSB7CisJCS8qIEZpbGwgYnVmZmVyIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlcnNwYWNlICovCisJCV9fZmlsbF92NGwyX2J1ZmZlcih2YiwgYik7CisKKwkJZHByaW50aygxLCAiJXMoKSBvZiBidWZmZXIgJWQgc3VjY2VlZGVkXG4iLCBfX2Z1bmNfXywgdmItPnY0bDJfYnVmLmluZGV4KTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9wcmVwYXJlX2J1Zik7CiAKLXN0YXRpYyBpbnQgX192YjJfcWJ1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsCi0JCSAgICAgIHN0cnVjdCB2YjJfYnVmZmVyICp2YikKKy8qKgorICogdmIyX3N0YXJ0X3N0cmVhbWluZygpIC0gQXR0ZW1wdCB0byBzdGFydCBzdHJlYW1pbmcuCisgKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQorICoKKyAqIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ1ZmZlcnMsIHRoZW4gcmV0cnlfc3RhcnRfc3RyZWFtaW5nIGlzIHNldCB0bworICogMSBhbmQgMCBpcyByZXR1cm5lZC4gVGhlIG5leHQgdGltZSBhIGJ1ZmZlciBpcyBxdWV1ZWQgYW5kCisgKiByZXRyeV9zdGFydF9zdHJlYW1pbmcgaXMgMSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB0bworICogcmV0cnkgc3RhcnRpbmcgdGhlIERNQSBlbmdpbmUuCisgKi8KK3N0YXRpYyBpbnQgdmIyX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQogewogCWludCByZXQ7CiAKKwkvKiBUZWxsIHRoZSBkcml2ZXIgdG8gc3RhcnQgc3RyZWFtaW5nICovCisJcmV0ID0gY2FsbF9xb3AocSwgc3RhcnRfc3RyZWFtaW5nLCBxLCBhdG9taWNfcmVhZCgmcS0+cXVldWVkX2NvdW50KSk7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ1ZmZlcnMgcXVldWVkIHRvIHN0YXJ0IHN0cmVhbWluZywgdGhlbgorCSAqIHRoZSBzdGFydF9zdHJlYW1pbmcgb3BlcmF0aW9uIHdpbGwgcmV0dXJuIC1FTk9CVUZTIGFuZCB5b3UgaGF2ZSB0bworCSAqIHJldHJ5IHdoZW4gdGhlIG5leHQgYnVmZmVyIGlzIHF1ZXVlZC4KKwkgKi8KKwlpZiAocmV0ID09IC1FTk9CVUZTKSB7CisJCWRwcmludGsoMSwgInFidWY6IG5vdCBlbm91Z2ggYnVmZmVycywgcmV0cnkgd2hlbiBtb3JlIGJ1ZmZlcnMgYXJlIHF1ZXVlZC5cbiIpOworCQlxLT5yZXRyeV9zdGFydF9zdHJlYW1pbmcgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJldCkKKwkJZHByaW50aygxLCAicWJ1ZjogZHJpdmVyIHJlZnVzZWQgdG8gc3RhcnQgc3RyZWFtaW5nXG4iKTsKKwllbHNlCisJCXEtPnJldHJ5X3N0YXJ0X3N0cmVhbWluZyA9IDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2YjJfaW50ZXJuYWxfcWJ1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJaW50IHJldCA9IHZiMl9xdWV1ZV9vcl9wcmVwYXJlX2J1ZihxLCBiLCAicWJ1ZiIpOworCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2YiA9IHEtPmJ1ZnNbYi0+aW5kZXhdOworCWlmICh2Yi0+c3RhdGUgIT0gVkIyX0JVRl9TVEFURV9ERVFVRVVFRCkgeworCQlkcHJpbnRrKDEsICIlcygpOiBpbnZhbGlkIGJ1ZmZlciBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCisJCQl2Yi0+c3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzd2l0Y2ggKHZiLT5zdGF0ZSkgewogCWNhc2UgVkIyX0JVRl9TVEFURV9ERVFVRVVFRDoKIAkJcmV0ID0gX19idWZfcHJlcGFyZSh2YiwgYik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCQlicmVhazsKIAljYXNlIFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ6CiAJCWJyZWFrOworCWNhc2UgVkIyX0JVRl9TVEFURV9QUkVQQVJJTkc6CisJCWRwcmludGsoMSwgInFidWY6IGJ1ZmZlciBzdGlsbCBiZWluZyBwcmVwYXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCWRlZmF1bHQ6CiAJCWRwcmludGsoMSwgInFidWY6IGJ1ZmZlciBhbHJlYWR5IGluIHVzZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQwNyw2ICsxNDU2LDE2IEBACiAJaWYgKHEtPnN0cmVhbWluZykKIAkJX19lbnF1ZXVlX2luX2RyaXZlcih2Yik7CiAKKwkvKiBGaWxsIGJ1ZmZlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHVzZXJzcGFjZSAqLworCV9fZmlsbF92NGwyX2J1ZmZlcih2YiwgYik7CisKKwlpZiAocS0+cmV0cnlfc3RhcnRfc3RyZWFtaW5nKSB7CisJCXJldCA9IHZiMl9zdGFydF9zdHJlYW1pbmcocSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWRwcmludGsoMSwgIiVzKCkgb2YgYnVmZmVyICVkIHN1Y2NlZWRlZFxuIiwgX19mdW5jX18sIHZiLT52NGwyX2J1Zi5pbmRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MjksNyArMTQ4OCwxMiBAQAogICovCiBpbnQgdmIyX3FidWYoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewotCXJldHVybiB2YjJfcXVldWVfb3JfcHJlcGFyZV9idWYocSwgYiwgInFidWYiLCBfX3ZiMl9xYnVmKTsKKwlpZiAocS0+ZmlsZWlvKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gdmIyX2ludGVybmFsX3FidWYocSwgYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfcWJ1Zik7CiAKQEAgLTE1NTAsNyArMTYxNCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXdhaXRfZXZlbnQocS0+ZG9uZV93cSwgIWF0b21pY19yZWFkKCZxLT5xdWV1ZWRfY291bnQpKTsKKwlpZiAoIXEtPnJldHJ5X3N0YXJ0X3N0cmVhbWluZykKKwkJd2FpdF9ldmVudChxLT5kb25lX3dxLCAhYXRvbWljX3JlYWQoJnEtPnF1ZXVlZF9jb3VudCkpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX3dhaXRfZm9yX2FsbF9idWZmZXJzKTsKQEAgLTE1NzksMzcgKzE2NDQsMTEgQEAKIAkJfQogfQogCi0vKioKLSAqIHZiMl9kcWJ1ZigpIC0gRGVxdWV1ZSBhIGJ1ZmZlciB0byB0aGUgdXNlcnNwYWNlCi0gKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQotICogQGI6CQlidWZmZXIgc3RydWN0dXJlIHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2NfZHFidWYgaGFuZGxlcgotICoJCWluIGRyaXZlcgotICogQG5vbmJsb2NraW5nOiBpZiB0cnVlLCB0aGlzIGNhbGwgd2lsbCBub3Qgc2xlZXAgd2FpdGluZyBmb3IgYSBidWZmZXIgaWYgbm8KLSAqCQkgYnVmZmVycyByZWFkeSBmb3IgZGVxdWV1aW5nIGFyZSBwcmVzZW50LiBOb3JtYWxseSB0aGUgZHJpdmVyCi0gKgkJIHdvdWxkIGJlIHBhc3NpbmcgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSBoZXJlCi0gKgotICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHZpZGlvY19kcWJ1ZiBpb2N0bCBoYW5kbGVyIG9mIGEgZHJpdmVyLgotICogVGhpcyBmdW5jdGlvbjoKLSAqIDEpIHZlcmlmaWVzIHRoZSBwYXNzZWQgYnVmZmVyLAotICogMikgY2FsbHMgYnVmX2ZpbmlzaCBjYWxsYmFjayBpbiB0aGUgZHJpdmVyIChpZiBwcm92aWRlZCksIGluIHdoaWNoCi0gKiAgICBkcml2ZXIgY2FuIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLSAqICAgIHJldHVybmluZyB0aGUgYnVmZmVyIHRvIHVzZXJzcGFjZSwgc3VjaCBhcyBjYWNoZSBzeW5jLAotICogMykgdGhlIGJ1ZmZlciBzdHJ1Y3QgbWVtYmVycyBhcmUgZmlsbGVkIHdpdGggcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yCi0gKiAgICB0aGUgdXNlcnNwYWNlLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgZGlyZWN0bHkgcmV0dXJuZWQKLSAqIGZyb20gdmlkaW9jX2RxYnVmIGhhbmRsZXIgaW4gZHJpdmVyLgotICovCi1pbnQgdmIyX2RxYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYiwgYm9vbCBub25ibG9ja2luZykKK3N0YXRpYyBpbnQgdmIyX2ludGVybmFsX2RxYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYiwgYm9vbCBub25ibG9ja2luZykKIHsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSBOVUxMOwogCWludCByZXQ7CiAKLQlpZiAocS0+ZmlsZWlvKSB7Ci0JCWRwcmludGsoMSwgImRxYnVmOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KIAlpZiAoYi0+dHlwZSAhPSBxLT50eXBlKSB7CiAJCWRwcmludGsoMSwgImRxYnVmOiBpbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjQ4LDYgKzE2ODcsMzYgQEAKIAogCXJldHVybiAwOwogfQorCisvKioKKyAqIHZiMl9kcWJ1ZigpIC0gRGVxdWV1ZSBhIGJ1ZmZlciB0byB0aGUgdXNlcnNwYWNlCisgKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQorICogQGI6CQlidWZmZXIgc3RydWN0dXJlIHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2NfZHFidWYgaGFuZGxlcgorICoJCWluIGRyaXZlcgorICogQG5vbmJsb2NraW5nOiBpZiB0cnVlLCB0aGlzIGNhbGwgd2lsbCBub3Qgc2xlZXAgd2FpdGluZyBmb3IgYSBidWZmZXIgaWYgbm8KKyAqCQkgYnVmZmVycyByZWFkeSBmb3IgZGVxdWV1aW5nIGFyZSBwcmVzZW50LiBOb3JtYWxseSB0aGUgZHJpdmVyCisgKgkJIHdvdWxkIGJlIHBhc3NpbmcgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSBoZXJlCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHZpZGlvY19kcWJ1ZiBpb2N0bCBoYW5kbGVyIG9mIGEgZHJpdmVyLgorICogVGhpcyBmdW5jdGlvbjoKKyAqIDEpIHZlcmlmaWVzIHRoZSBwYXNzZWQgYnVmZmVyLAorICogMikgY2FsbHMgYnVmX2ZpbmlzaCBjYWxsYmFjayBpbiB0aGUgZHJpdmVyIChpZiBwcm92aWRlZCksIGluIHdoaWNoCisgKiAgICBkcml2ZXIgY2FuIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSByZXF1aXJlZCBiZWZvcmUKKyAqICAgIHJldHVybmluZyB0aGUgYnVmZmVyIHRvIHVzZXJzcGFjZSwgc3VjaCBhcyBjYWNoZSBzeW5jLAorICogMykgdGhlIGJ1ZmZlciBzdHJ1Y3QgbWVtYmVycyBhcmUgZmlsbGVkIHdpdGggcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yCisgKiAgICB0aGUgdXNlcnNwYWNlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgZGlyZWN0bHkgcmV0dXJuZWQKKyAqIGZyb20gdmlkaW9jX2RxYnVmIGhhbmRsZXIgaW4gZHJpdmVyLgorICovCitpbnQgdmIyX2RxYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYiwgYm9vbCBub25ibG9ja2luZykKK3sKKwlpZiAocS0+ZmlsZWlvKSB7CisJCWRwcmludGsoMSwgImRxYnVmOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIHZiMl9pbnRlcm5hbF9kcWJ1ZihxLCBiLCBub25ibG9ja2luZyk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfZHFidWYpOwogCiAvKioKQEAgLTE2NjAsNiArMTcyOSwxMSBAQAogewogCXVuc2lnbmVkIGludCBpOwogCisJaWYgKHEtPnJldHJ5X3N0YXJ0X3N0cmVhbWluZykgeworCQlxLT5yZXRyeV9zdGFydF9zdHJlYW1pbmcgPSAwOworCQlxLT5zdHJlYW1pbmcgPSAwOworCX0KKwogCS8qCiAJICogVGVsbCBkcml2ZXIgdG8gc3RvcCBhbGwgdHJhbnNhY3Rpb25zIGFuZCByZWxlYXNlIGFsbCBxdWV1ZWQKIAkgKiBidWZmZXJzLgpAQCAtMTY4Nyw2ICsxNzYxLDQ2IEBACiAJCV9fdmIyX2RxYnVmKHEtPmJ1ZnNbaV0pOwogfQogCitzdGF0aWMgaW50IHZiMl9pbnRlcm5hbF9zdHJlYW1vbihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7CisJaW50IHJldDsKKworCWlmICh0eXBlICE9IHEtPnR5cGUpIHsKKwkJZHByaW50aygxLCAic3RyZWFtb246IGludmFsaWQgc3RyZWFtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocS0+c3RyZWFtaW5nKSB7CisJCWRwcmludGsoMywgInN0cmVhbW9uIHN1Y2Nlc3NmdWw6IGFscmVhZHkgc3RyZWFtaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFxLT5udW1fYnVmZmVycykgeworCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogbm8gYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJZiBhbnkgYnVmZmVycyB3ZXJlIHF1ZXVlZCBiZWZvcmUgc3RyZWFtb24sCisJICogd2UgY2FuIG5vdyBwYXNzIHRoZW0gdG8gZHJpdmVyIGZvciBwcm9jZXNzaW5nLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodmIsICZxLT5xdWV1ZWRfbGlzdCwgcXVldWVkX2VudHJ5KQorCQlfX2VucXVldWVfaW5fZHJpdmVyKHZiKTsKKworCS8qIFRlbGwgZHJpdmVyIHRvIHN0YXJ0IHN0cmVhbWluZy4gKi8KKwlyZXQgPSB2YjJfc3RhcnRfc3RyZWFtaW5nKHEpOworCWlmIChyZXQpIHsKKwkJX192YjJfcXVldWVfY2FuY2VsKHEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXEtPnN0cmVhbWluZyA9IDE7CisKKwlkcHJpbnRrKDMsICJTdHJlYW1vbiBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiB2YjJfc3RyZWFtb24gLSBzdGFydCBzdHJlYW1pbmcKICAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCkBAIC0xNzAyLDQ4ICsxODE2LDM1IEBACiAgKi8KIGludCB2YjJfc3RyZWFtb24oc3RydWN0IHZiMl9xdWV1ZSAqcSwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IHZiMl9idWZmZXIgKnZiOwotCWludCByZXQ7Ci0KIAlpZiAocS0+ZmlsZWlvKSB7CiAJCWRwcmludGsoMSwgInN0cmVhbW9uOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0KLQlpZiAodHlwZSAhPSBxLT50eXBlKSB7Ci0JCWRwcmludGsoMSwgInN0cmVhbW9uOiBpbnZhbGlkIHN0cmVhbSB0eXBlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHEtPnN0cmVhbWluZykgewotCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogYWxyZWFkeSBzdHJlYW1pbmdcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qCi0JICogSWYgYW55IGJ1ZmZlcnMgd2VyZSBxdWV1ZWQgYmVmb3JlIHN0cmVhbW9uLAotCSAqIHdlIGNhbiBub3cgcGFzcyB0aGVtIHRvIGRyaXZlciBmb3IgcHJvY2Vzc2luZy4KLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZiLCAmcS0+cXVldWVkX2xpc3QsIHF1ZXVlZF9lbnRyeSkKLQkJX19lbnF1ZXVlX2luX2RyaXZlcih2Yik7Ci0KLQkvKgotCSAqIExldCBkcml2ZXIgbm90aWNlIHRoYXQgc3RyZWFtaW5nIHN0YXRlIGhhcyBiZWVuIGVuYWJsZWQuCi0JICovCi0JcmV0ID0gY2FsbF9xb3AocSwgc3RhcnRfc3RyZWFtaW5nLCBxLCBhdG9taWNfcmVhZCgmcS0+cXVldWVkX2NvdW50KSk7Ci0JaWYgKHJldCkgewotCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogZHJpdmVyIHJlZnVzZWQgdG8gc3RhcnQgc3RyZWFtaW5nXG4iKTsKLQkJX192YjJfcXVldWVfY2FuY2VsKHEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXEtPnN0cmVhbWluZyA9IDE7Ci0KLQlkcHJpbnRrKDMsICJTdHJlYW1vbiBzdWNjZXNzZnVsXG4iKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmIyX2ludGVybmFsX3N0cmVhbW9uKHEsIHR5cGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX3N0cmVhbW9uKTsKIAorc3RhdGljIGludCB2YjJfaW50ZXJuYWxfc3RyZWFtb2ZmKHN0cnVjdCB2YjJfcXVldWUgKnEsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCWlmICh0eXBlICE9IHEtPnR5cGUpIHsKKwkJZHByaW50aygxLCAic3RyZWFtb2ZmOiBpbnZhbGlkIHN0cmVhbSB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFxLT5zdHJlYW1pbmcpIHsKKwkJZHByaW50aygzLCAic3RyZWFtb2ZmIHN1Y2Nlc3NmdWw6IG5vdCBzdHJlYW1pbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENhbmNlbCB3aWxsIHBhdXNlIHN0cmVhbWluZyBhbmQgcmVtb3ZlIGFsbCBidWZmZXJzIGZyb20gdGhlIGRyaXZlcgorCSAqIGFuZCB2aWRlb2J1ZiwgZWZmZWN0aXZlbHkgcmV0dXJuaW5nIGNvbnRyb2wgb3ZlciB0aGVtIHRvIHVzZXJzcGFjZS4KKwkgKi8KKwlfX3ZiMl9xdWV1ZV9jYW5jZWwocSk7CisKKwlkcHJpbnRrKDMsICJTdHJlYW1vZmYgc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogdmIyX3N0cmVhbW9mZiAtIHN0b3Agc3RyZWFtaW5nCkBAIC0xNzY2LDI1ICsxODY3LDcgQEAKIAkJZHByaW50aygxLCAic3RyZWFtb2ZmOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0KLQlpZiAodHlwZSAhPSBxLT50eXBlKSB7Ci0JCWRwcmludGsoMSwgInN0cmVhbW9mZjogaW52YWxpZCBzdHJlYW0gdHlwZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghcS0+c3RyZWFtaW5nKSB7Ci0JCWRwcmludGsoMSwgInN0cmVhbW9mZjogbm90IHN0cmVhbWluZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogQ2FuY2VsIHdpbGwgcGF1c2Ugc3RyZWFtaW5nIGFuZCByZW1vdmUgYWxsIGJ1ZmZlcnMgZnJvbSB0aGUgZHJpdmVyCi0JICogYW5kIHZpZGVvYnVmLCBlZmZlY3RpdmVseSByZXR1cm5pbmcgY29udHJvbCBvdmVyIHRoZW0gdG8gdXNlcnNwYWNlLgotCSAqLwotCV9fdmIyX3F1ZXVlX2NhbmNlbChxKTsKLQotCWRwcmludGsoMywgIlN0cmVhbW9mZiBzdWNjZXNzZnVsXG4iKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmIyX2ludGVybmFsX3N0cmVhbW9mZihxLCB0eXBlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9zdHJlYW1vZmYpOwogCkBAIC0yMjc3LDE1ICsyMzYwLDE2IEBACiAJCQkJZ290byBlcnJfcmVxYnVmczsKIAkJCWZpbGVpby0+YnVmc1tpXS5xdWV1ZWQgPSAxOwogCQl9Ci0KLQkJLyoKLQkJICogU3RhcnQgc3RyZWFtaW5nLgotCQkgKi8KLQkJcmV0ID0gdmIyX3N0cmVhbW9uKHEsIHEtPnR5cGUpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfcmVxYnVmczsKKwkJZmlsZWlvLT5pbmRleCA9IHEtPm51bV9idWZmZXJzOwogCX0KIAorCS8qCisJICogU3RhcnQgc3RyZWFtaW5nLgorCSAqLworCXJldCA9IHZiMl9zdHJlYW1vbihxLCBxLT50eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXFidWZzOworCiAJcS0+ZmlsZWlvID0gZmlsZWlvOwogCiAJcmV0dXJuIHJldDsKQEAgLTIzMDgsMTMgKzIzOTIsOCBAQAogCXN0cnVjdCB2YjJfZmlsZWlvX2RhdGEgKmZpbGVpbyA9IHEtPmZpbGVpbzsKIAogCWlmIChmaWxlaW8pIHsKLQkJLyoKLQkJICogSGFjayBmaWxlaW8gY29udGV4dCB0byBlbmFibGUgZGlyZWN0IGNhbGxzIHRvIHZiMiBpb2N0bAotCQkgKiBpbnRlcmZhY2UuCi0JCSAqLworCQl2YjJfaW50ZXJuYWxfc3RyZWFtb2ZmKHEsIHEtPnR5cGUpOwogCQlxLT5maWxlaW8gPSBOVUxMOwotCi0JCXZiMl9zdHJlYW1vZmYocSwgcS0+dHlwZSk7CiAJCWZpbGVpby0+cmVxLmNvdW50ID0gMDsKIAkJdmIyX3JlcWJ1ZnMocSwgJmZpbGVpby0+cmVxKTsKIAkJa2ZyZWUoZmlsZWlvKTsKQEAgLTIzNTgsMzkgKzI0MzcsMzQgQEAKIAlmaWxlaW8gPSBxLT5maWxlaW87CiAKIAkvKgotCSAqIEhhY2sgZmlsZWlvIGNvbnRleHQgdG8gZW5hYmxlIGRpcmVjdCBjYWxscyB0byB2YjIgaW9jdGwgaW50ZXJmYWNlLgotCSAqIFRoZSBwb2ludGVyIHdpbGwgYmUgcmVzdG9yZWQgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24uCi0JICovCi0JcS0+ZmlsZWlvID0gTlVMTDsKLQotCWluZGV4ID0gZmlsZWlvLT5pbmRleDsKLQlidWYgPSAmZmlsZWlvLT5idWZzW2luZGV4XTsKLQotCS8qCiAJICogQ2hlY2sgaWYgd2UgbmVlZCB0byBkZXF1ZXVlIHRoZSBidWZmZXIuCiAJICovCi0JaWYgKGJ1Zi0+cXVldWVkKSB7Ci0JCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQorCWluZGV4ID0gZmlsZWlvLT5pbmRleDsKKwlpZiAoaW5kZXggPj0gcS0+bnVtX2J1ZmZlcnMpIHsKIAkJLyoKIAkJICogQ2FsbCB2YjJfZHFidWYgdG8gZ2V0IGJ1ZmZlciBiYWNrLgogCQkgKi8KIAkJbWVtc2V0KCZmaWxlaW8tPmIsIDAsIHNpemVvZihmaWxlaW8tPmIpKTsKIAkJZmlsZWlvLT5iLnR5cGUgPSBxLT50eXBlOwogCQlmaWxlaW8tPmIubWVtb3J5ID0gcS0+bWVtb3J5OwotCQlmaWxlaW8tPmIuaW5kZXggPSBpbmRleDsKLQkJcmV0ID0gdmIyX2RxYnVmKHEsICZmaWxlaW8tPmIsIG5vbmJsb2NrKTsKKwkJcmV0ID0gdmIyX2ludGVybmFsX2RxYnVmKHEsICZmaWxlaW8tPmIsIG5vbmJsb2NrKTsKIAkJZHByaW50ayg1LCAiZmlsZSBpbzogdmIyX2RxYnVmIHJlc3VsdDogJWRcbiIsIHJldCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVuZDsKKwkJCXJldHVybiByZXQ7CiAJCWZpbGVpby0+ZHFfY291bnQgKz0gMTsKIAorCQlpbmRleCA9IGZpbGVpby0+Yi5pbmRleDsKKwkJYnVmID0gJmZpbGVpby0+YnVmc1tpbmRleF07CisKIAkJLyoKIAkJICogR2V0IG51bWJlciBvZiBieXRlcyBmaWxsZWQgYnkgdGhlIGRyaXZlcgogCQkgKi8KLQkJdmIgPSBxLT5idWZzW2luZGV4XTsKLQkJYnVmLT5zaXplID0gdmIyX2dldF9wbGFuZV9wYXlsb2FkKHZiLCAwKTsKKwkJYnVmLT5wb3MgPSAwOwogCQlidWYtPnF1ZXVlZCA9IDA7CisJCWJ1Zi0+c2l6ZSA9IHJlYWQgPyB2YjJfZ2V0X3BsYW5lX3BheWxvYWQocS0+YnVmc1tpbmRleF0sIDApCisJCQkJIDogdmIyX3BsYW5lX3NpemUocS0+YnVmc1tpbmRleF0sIDApOworCX0gZWxzZSB7CisJCWJ1ZiA9ICZmaWxlaW8tPmJ1ZnNbaW5kZXhdOwogCX0KIAogCS8qCkBAIC0yNDEyLDggKzI0ODYsNyBAQAogCQlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWYtPnZhZGRyICsgYnVmLT5wb3MsIGRhdGEsIGNvdW50KTsKIAlpZiAocmV0KSB7CiAJCWRwcmludGsoMywgImZpbGUgaW86IGVycm9yIGNvcHlpbmcgZGF0YVxuIik7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZW5kOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAkvKgpAQCAtMjQzMywxMCArMjUwNiw2IEBACiAJCWlmIChyZWFkICYmIChmaWxlaW8tPmZsYWdzICYgVkIyX0ZJTEVJT19SRUFEX09OQ0UpICYmCiAJCSAgICBmaWxlaW8tPmRxX2NvdW50ID09IDEpIHsKIAkJCWRwcmludGsoMywgImZpbGUgaW86IHJlYWQgbGltaXQgcmVhY2hlZFxuIik7Ci0JCQkvKgotCQkJICogUmVzdG9yZSBmaWxlaW8gcG9pbnRlciBhbmQgcmVsZWFzZSB0aGUgY29udGV4dC4KLQkJCSAqLwotCQkJcS0+ZmlsZWlvID0gZmlsZWlvOwogCQkJcmV0dXJuIF9fdmIyX2NsZWFudXBfZmlsZWlvKHEpOwogCQl9CiAKQEAgLTI0NDgsMzIgKzI1MTcsMjAgQEAKIAkJZmlsZWlvLT5iLm1lbW9yeSA9IHEtPm1lbW9yeTsKIAkJZmlsZWlvLT5iLmluZGV4ID0gaW5kZXg7CiAJCWZpbGVpby0+Yi5ieXRlc3VzZWQgPSBidWYtPnBvczsKLQkJcmV0ID0gdmIyX3FidWYocSwgJmZpbGVpby0+Yik7CisJCXJldCA9IHZiMl9pbnRlcm5hbF9xYnVmKHEsICZmaWxlaW8tPmIpOwogCQlkcHJpbnRrKDUsICJmaWxlIGlvOiB2YjJfZGJ1ZiByZXN1bHQ6ICVkXG4iLCByZXQpOwogCQlpZiAocmV0KQotCQkJZ290byBlbmQ7CisJCQlyZXR1cm4gcmV0OwogCiAJCS8qCiAJCSAqIEJ1ZmZlciBoYXMgYmVlbiBxdWV1ZWQsIHVwZGF0ZSB0aGUgc3RhdHVzCiAJCSAqLwogCQlidWYtPnBvcyA9IDA7CiAJCWJ1Zi0+cXVldWVkID0gMTsKLQkJYnVmLT5zaXplID0gcS0+YnVmc1swXS0+djRsMl9wbGFuZXNbMF0ubGVuZ3RoOworCQlidWYtPnNpemUgPSB2YjJfcGxhbmVfc2l6ZShxLT5idWZzW2luZGV4XSwgMCk7CiAJCWZpbGVpby0+cV9jb3VudCArPSAxOwotCi0JCS8qCi0JCSAqIFN3aXRjaCB0byB0aGUgbmV4dCBidWZmZXIKLQkJICovCi0JCWZpbGVpby0+aW5kZXggPSAoaW5kZXggKyAxKSAlIHEtPm51bV9idWZmZXJzOwotCi0JCS8qCi0JCSAqIFN0YXJ0IHN0cmVhbWluZyBpZiByZXF1aXJlZC4KLQkJICovCi0JCWlmICghcmVhZCAmJiAhcS0+c3RyZWFtaW5nKSB7Ci0JCQlyZXQgPSB2YjJfc3RyZWFtb24ocSwgcS0+dHlwZSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZW5kOwotCQl9CisJCWlmIChmaWxlaW8tPmluZGV4IDwgcS0+bnVtX2J1ZmZlcnMpCisJCQlmaWxlaW8tPmluZGV4Kys7CiAJfQogCiAJLyoKQEAgLTI0ODEsMTEgKzI1MzgsNiBAQAogCSAqLwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gY291bnQ7Ci1lbmQ6Ci0JLyoKLQkgKiBSZXN0b3JlIHRoZSBmaWxlaW8gY29udGV4dCBhbmQgYmxvY2sgdmIyIGlvY3RsIGludGVyZmFjZS4KLQkgKi8KLQlxLT5maWxlaW8gPSBmaWxlaW87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjY0OSwxNiArMjcwMSwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX2ZvcF9tbWFwKTsKIAotaW50IHZiMl9mb3BfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK2ludCBfdmIyX2ZvcF9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IHZkZXYtPnF1ZXVlLT5vd25lcikgeworCQlpZiAobG9jaykKKwkJCW11dGV4X2xvY2sobG9jayk7CiAJCXZiMl9xdWV1ZV9yZWxlYXNlKHZkZXYtPnF1ZXVlKTsKIAkJdmRldi0+cXVldWUtPm93bmVyID0gTlVMTDsKKwkJaWYgKGxvY2spCisJCQltdXRleF91bmxvY2sobG9jayk7CiAJfQogCXJldHVybiB2NGwyX2ZoX3JlbGVhc2UoZmlsZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfdmIyX2ZvcF9yZWxlYXNlKTsKKworaW50IHZiMl9mb3BfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSB2ZGV2LT5xdWV1ZS0+bG9jayA/IHZkZXYtPnF1ZXVlLT5sb2NrIDogdmRldi0+bG9jazsKKworCXJldHVybiBfdmIyX2ZvcF9yZWxlYXNlKGZpbGUsIGxvY2spOworfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX2ZvcF9yZWxlYXNlKTsKIAogc3NpemVfdCB2YjJfZm9wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1zZy5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1zZy5jCmluZGV4IDBkM2E4ZmYuLmM3NzlmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLXNnLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAl1bnNpZ25lZCBpbnQJCQludW1fcGFnZXM7CiAJYXRvbWljX3QJCQlyZWZjb3VudDsKIAlzdHJ1Y3QgdmIyX3ZtYXJlYV9oYW5kbGVyCWhhbmRsZXI7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0CQkqdm1hOwogfTsKIAogc3RhdGljIHZvaWQgdmIyX2RtYV9zZ19wdXQodm9pZCAqYnVmX3ByaXYpOwpAQCAtMTU1LDEyICsxNTYsMTggQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHZtYV9pc19pbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gISEodm1hLT52bV9mbGFncyAmIChWTV9JTyB8IFZNX1BGTk1BUCkpOworfQorCiBzdGF0aWMgdm9pZCAqdmIyX2RtYV9zZ19nZXRfdXNlcnB0cih2b2lkICphbGxvY19jdHgsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHdyaXRlKQogewogCXN0cnVjdCB2YjJfZG1hX3NnX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7CiAJaW50IG51bV9wYWdlc19mcm9tX3VzZXI7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAlidWYgPSBremFsbG9jKHNpemVvZiAqYnVmLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKQEAgLTE4MCw3ICsxODcsMzggQEAKIAlpZiAoIWJ1Zi0+cGFnZXMpCiAJCWdvdG8gdXNlcnB0cl9mYWlsX2FsbG9jX3BhZ2VzOwogCi0JbnVtX3BhZ2VzX2Zyb21fdXNlciA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAorCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCB2YWRkcik7CisJaWYgKCF2bWEpIHsKKwkJZHByaW50aygxLCAibm8gdm1hIGZvciBhZGRyZXNzICVsdVxuIiwgdmFkZHIpOworCQlnb3RvIHVzZXJwdHJfZmFpbF9maW5kX3ZtYTsKKwl9CisKKwlpZiAodm1hLT52bV9lbmQgPCB2YWRkciArIHNpemUpIHsKKwkJZHByaW50aygxLCAidm1hIGF0ICVsdSBpcyB0b28gc21hbGwgZm9yICVsdSBieXRlc1xuIiwKKwkJCXZhZGRyLCBzaXplKTsKKwkJZ290byB1c2VycHRyX2ZhaWxfZmluZF92bWE7CisJfQorCisJYnVmLT52bWEgPSB2YjJfZ2V0X3ZtYSh2bWEpOworCWlmICghYnVmLT52bWEpIHsKKwkJZHByaW50aygxLCAiZmFpbGVkIHRvIGNvcHkgdm1hXG4iKTsKKwkJZ290byB1c2VycHRyX2ZhaWxfZmluZF92bWE7CisJfQorCisJaWYgKHZtYV9pc19pbyhidWYtPnZtYSkpIHsKKwkJZm9yIChudW1fcGFnZXNfZnJvbV91c2VyID0gMDsKKwkJICAgICBudW1fcGFnZXNfZnJvbV91c2VyIDwgYnVmLT5udW1fcGFnZXM7CisJCSAgICAgKytudW1fcGFnZXNfZnJvbV91c2VyLCB2YWRkciArPSBQQUdFX1NJWkUpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcGZuOworCisJCQlpZiAoZm9sbG93X3BmbihidWYtPnZtYSwgdmFkZHIsICZwZm4pKSB7CisJCQkJZHByaW50aygxLCAibm8gcGFnZSBmb3IgYWRkcmVzcyAlbHVcbiIsIHZhZGRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ1Zi0+cGFnZXNbbnVtX3BhZ2VzX2Zyb21fdXNlcl0gPSBwZm5fdG9fcGFnZShwZm4pOworCQl9CisJfSBlbHNlCisJCW51bV9wYWdlc19mcm9tX3VzZXIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKIAkJCQkJICAgICB2YWRkciAmIFBBR0VfTUFTSywKIAkJCQkJICAgICBidWYtPm51bV9wYWdlcywKIAkJCQkJICAgICB3cml0ZSwKQEAgLTIwMCw5ICsyMzgsMTIgQEAKIHVzZXJwdHJfZmFpbF9hbGxvY190YWJsZV9mcm9tX3BhZ2VzOgogdXNlcnB0cl9mYWlsX2dldF91c2VyX3BhZ2VzOgogCWRwcmludGsoMSwgImdldF91c2VyX3BhZ2VzIHJlcXVlc3RlZC9nb3Q6ICVkLyVkXVxuIiwKLQkgICAgICAgbnVtX3BhZ2VzX2Zyb21fdXNlciwgYnVmLT5udW1fcGFnZXMpOwotCXdoaWxlICgtLW51bV9wYWdlc19mcm9tX3VzZXIgPj0gMCkKLQkJcHV0X3BhZ2UoYnVmLT5wYWdlc1tudW1fcGFnZXNfZnJvbV91c2VyXSk7CisJCWJ1Zi0+bnVtX3BhZ2VzLCBudW1fcGFnZXNfZnJvbV91c2VyKTsKKwlpZiAoIXZtYV9pc19pbyhidWYtPnZtYSkpCisJCXdoaWxlICgtLW51bV9wYWdlc19mcm9tX3VzZXIgPj0gMCkKKwkJCXB1dF9wYWdlKGJ1Zi0+cGFnZXNbbnVtX3BhZ2VzX2Zyb21fdXNlcl0pOworCXZiMl9wdXRfdm1hKGJ1Zi0+dm1hKTsKK3VzZXJwdHJfZmFpbF9maW5kX3ZtYToKIAlrZnJlZShidWYtPnBhZ2VzKTsKIHVzZXJwdHJfZmFpbF9hbGxvY19wYWdlczoKIAlrZnJlZShidWYpOwpAQCAtMjI2LDkgKzI2NywxMSBAQAogCXdoaWxlICgtLWkgPj0gMCkgewogCQlpZiAoYnVmLT53cml0ZSkKIAkJCXNldF9wYWdlX2RpcnR5X2xvY2soYnVmLT5wYWdlc1tpXSk7Ci0JCXB1dF9wYWdlKGJ1Zi0+cGFnZXNbaV0pOworCQlpZiAoIXZtYV9pc19pbyhidWYtPnZtYSkpCisJCQlwdXRfcGFnZShidWYtPnBhZ2VzW2ldKTsKIAl9CiAJa2ZyZWUoYnVmLT5wYWdlcyk7CisJdmIyX3B1dF92bWEoYnVmLT52bWEpOwogCWtmcmVlKGJ1Zik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCmluZGV4IGRkMjM5YmQuLjAwZDMzOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwpAQCAtMjIzNSwxMCArMjIzNSwxMCBAQAogCX0KIAogCS8qIGRvIHdlIG5lZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBzZWdtZW50cz8gKi8KLQlpZiAoYmlvX3NlZ21lbnRzKHJlcS0+YmlvKSA+IDEgfHwgYmlvX3NlZ21lbnRzKHJzcC0+YmlvKSA+IDEpIHsKLQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiJXM6IG11bHRpcGxlIHNlZ21lbnRzIHJlcSAldSAldSwgcnNwICV1ICV1XG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgYmlvX3NlZ21lbnRzKHJlcS0+YmlvKSwgYmxrX3JxX2J5dGVzKHJlcSksCi0JCSAgICBiaW9fc2VnbWVudHMocnNwLT5iaW8pLCBibGtfcnFfYnl0ZXMocnNwKSk7CisJaWYgKGJpb19tdWx0aXBsZV9zZWdtZW50cyhyZXEtPmJpbykgfHwKKwkgICAgYmlvX211bHRpcGxlX3NlZ21lbnRzKHJzcC0+YmlvKSkgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICIlczogbXVsdGlwbGUgc2VnbWVudHMgcmVxICV1LCByc3AgJXVcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBibGtfcnFfYnl0ZXMocmVxKSwgYmxrX3JxX2J5dGVzKHJzcCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKaW5kZXggYTYwYzE4OC4uMDRiZDNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTc1NCwxOSArNzU0LDE5IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCByZXQ7Ci0JbXV0ZXhfbG9jaygmaTJvX2NmZ19tdXRleCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEkyT0dFVElPUFM6CiAJCXJldCA9IGkyb19jZmdfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwogCQlicmVhazsKIAljYXNlIEkyT1BBU1NUSFJVMzI6CisJCW11dGV4X2xvY2soJmkyb19jZmdfbXV0ZXgpOwogCQlyZXQgPSBpMm9fY2ZnX3Bhc3N0aHJ1MzIoZmlsZSwgY21kLCBhcmcpOworCQltdXRleF91bmxvY2soJmkyb19jZmdfbXV0ZXgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PSU9DVExDTUQ7CiAJCWJyZWFrOwogCX0KLQltdXRleF91bmxvY2soJmkyb19jZmdfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbS5jCmluZGV4IGMxNjllMDcuLmYwZmE0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a2R1bXAuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtkdW1wLmMKaW5kZXggOWIyMDYyZC4uMmJlZjNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a2R1bXAuYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrZHVtcC5jCkBAIC0xMzksOCArMTM5LDExIEBACiAKIAl1YnVmICs9IHNpemVvZihoZHIpOwogCXVidWZjY2ggPSB1YnVmOwotCWlmIChncnVfdXNlcl9jb3B5X2hhbmRsZSgmdWJ1ZiwgY2NoKSkKLQkJZ290byBmYWlsOworCWlmIChncnVfdXNlcl9jb3B5X2hhbmRsZSgmdWJ1ZiwgY2NoKSkgeworCQlpZiAoY2NoX2xvY2tlZCkKKwkJCXVubG9ja19jY2hfaGFuZGxlKGNjaCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAlpZiAoY2NoX2xvY2tlZCkKIAkJdWJ1ZmNjaC0+ZGVscmVzcCA9IDA7CiAJYnl0ZXMgPSBzaXplb2YoaGRyKSArIEdSVV9DQUNIRV9MSU5FX0JZVEVTOwpAQCAtMTc5LDEwICsxODIsNiBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGJ5dGVzOwotCi1mYWlsOgotCXVubG9ja19jY2hfaGFuZGxlKGNjaCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIGludCBncnVfZHVtcF9jaGlwbGV0X3JlcXVlc3QodW5zaWduZWQgbG9uZyBhcmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMgYi9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMKaW5kZXggNjFlMmFiYy4uMzFlZTdjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9tcGM1MTIxX25mYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXBjNTEyMV9uZmMuYwpAQCAtNzI5LDcgKzcyOSw3IEBACiAJb2Zfbm9kZV9wdXQocm9vdG5vZGUpOwogCiAJLyogRW5hYmxlIE5GQyBjbG9jayAqLwotCWNsayA9IGRldm1fY2xrX2dldChkZXYsICJuZmNfY2xrIik7CisJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImlwZyIpOwogCWlmIChJU19FUlIoY2xrKSkgewogCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBhY3F1aXJlIE5GQyBjbG9jayFcbiIpOwogCQlyZXR2YWwgPSBQVFJfRVJSKGNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvYXR0YWNoLmMgYi9kcml2ZXJzL210ZC91YmkvYXR0YWNoLmMKaW5kZXggMzNiYjFmMi4uNmYyN2Q5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2F0dGFjaC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9hdHRhY2guYwpAQCAtMTQ1Myw4ICsxNDUzLDEwIEBACiAJCXN0cnVjdCB1YmlfYXR0YWNoX2luZm8gKnNjYW5fYWk7CiAKIAkJc2Nhbl9haSA9IGFsbG9jX2FpKCJ1YmlfY2toX2FlYl9zbGFiX2NhY2hlIik7Ci0JCWlmICghc2Nhbl9haSkKKwkJaWYgKCFzY2FuX2FpKSB7CisJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfd2w7CisJCX0KIAogCQllcnIgPSBzY2FuX2FsbCh1YmksIHNjYW5fYWksIDApOwogCQlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCmluZGV4IGUwNWRjNjIuLjU3ZGVhZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCkBAIC0xMjQ1LDggKzEyNDUsMTAgQEAKIAl1Ymlfd2xfZW50cnlfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJ1Ymlfd2xfZW50cnlfc2xhYiIsCiAJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdWJpX3dsX2VudHJ5KSwKIAkJCQkJICAgICAgMCwgMCwgTlVMTCk7Ci0JaWYgKCF1Ymlfd2xfZW50cnlfc2xhYikKKwlpZiAoIXViaV93bF9lbnRyeV9zbGFiKSB7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2Rldl91bnJlZzsKKwl9CiAKIAllcnIgPSB1YmlfZGVidWdmc19pbml0KCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9pby5jIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKaW5kZXggYmY3OWRlZi4uZDM2MTM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2lvLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKQEAgLTQ5NSwxMCArNDk1LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgbm9yX2VyYXNlX3ByZXBhcmUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pCiB7Ci0JaW50IGVyciwgZXJyMTsKKwlpbnQgZXJyOwogCXNpemVfdCB3cml0dGVuOwogCWxvZmZfdCBhZGRyOwogCXVpbnQzMl90IGRhdGEgPSAwOworCXN0cnVjdCB1YmlfZWNfaGRyIGVjX2hkcjsKKwogCS8qCiAJICogTm90ZSwgd2UgY2Fubm90IGdlbmVyYWxseSBkZWZpbmUgVklEIGhlYWRlciBidWZmZXJzIG9uIHN0YWNrLAogCSAqIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkZWFsIHdpdGggdGhlc2UgYnVmZmVycyAoc2VlIHRoZSBoZWFkZXIKQEAgLTUwOSw1MCArNTExLDM4IEBACiAJc3RydWN0IHViaV92aWRfaGRyIHZpZF9oZHI7CiAKIAkvKgorCSAqIElmIFZJRCBvciBFQyBpcyB2YWxpZCwgd2UgaGF2ZSB0byBjb3JydXB0IHRoZW0gYmVmb3JlIGVyYXNpbmcuCiAJICogSXQgaXMgaW1wb3J0YW50IHRvIGZpcnN0IGludmFsaWRhdGUgdGhlIEVDIGhlYWRlciwgYW5kIHRoZW4gdGhlIFZJRAogCSAqIGhlYWRlci4gT3RoZXJ3aXNlIGEgcG93ZXIgY3V0IG1heSBsZWFkIHRvIHZhbGlkIEVDIGhlYWRlciBhbmQKIAkgKiBpbnZhbGlkIFZJRCBoZWFkZXIsIGluIHdoaWNoIGNhc2UgVUJJIHdpbGwgdHJlYXQgdGhpcyBQRUIgYXMKIAkgKiBjb3JydXB0ZWQgYW5kIHdpbGwgdHJ5IHRvIHByZXNlcnZlIGl0LCBhbmQgcHJpbnQgc2Nhcnkgd2FybmluZ3MuCiAJICovCiAJYWRkciA9IChsb2ZmX3QpcG51bSAqIHViaS0+cGViX3NpemU7Ci0JZXJyID0gbXRkX3dyaXRlKHViaS0+bXRkLCBhZGRyLCA0LCAmd3JpdHRlbiwgKHZvaWQgKikmZGF0YSk7Ci0JaWYgKCFlcnIpIHsKKwllcnIgPSB1YmlfaW9fcmVhZF9lY19oZHIodWJpLCBwbnVtLCAmZWNfaGRyLCAwKTsKKwlpZiAoZXJyICE9IFVCSV9JT19CQURfSERSX0VCQURNU0cgJiYgZXJyICE9IFVCSV9JT19CQURfSERSICYmCisJICAgIGVyciAhPSBVQklfSU9fRkYpeworCQllcnIgPSBtdGRfd3JpdGUodWJpLT5tdGQsIGFkZHIsIDQsICZ3cml0dGVuLCAodm9pZCAqKSZkYXRhKTsKKwkJaWYoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwllcnIgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgJnZpZF9oZHIsIDApOworCWlmIChlcnIgIT0gVUJJX0lPX0JBRF9IRFJfRUJBRE1TRyAmJiBlcnIgIT0gVUJJX0lPX0JBRF9IRFIgJiYKKwkgICAgZXJyICE9IFVCSV9JT19GRil7CiAJCWFkZHIgKz0gdWJpLT52aWRfaGRyX2Fsb2Zmc2V0OwogCQllcnIgPSBtdGRfd3JpdGUodWJpLT5tdGQsIGFkZHIsIDQsICZ3cml0dGVuLCAodm9pZCAqKSZkYXRhKTsKLQkJaWYgKCFlcnIpCi0JCQlyZXR1cm4gMDsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CiAJfQorCXJldHVybiAwOwogCitlcnJvcjoKIAkvKgotCSAqIFdlIGZhaWxlZCB0byB3cml0ZSB0byB0aGUgbWVkaWEuIFRoaXMgd2FzIG9ic2VydmVkIHdpdGggU3BhbnNpb24KLQkgKiBTMjlHTDUxMk4gTk9SIGZsYXNoLiBNb3N0IHByb2JhYmx5IHRoZSBwcmV2aW91c2x5IGVyYXNlYmxvY2sgZXJhc3VyZQotCSAqIHdhcyBpbnRlcnJ1cHRlZCBhdCBhIHZlcnkgaW5hcHByb3ByaWF0ZSBtb21lbnQsIHNvIGl0IGJlY2FtZQotCSAqIHVud3JpdGFibGUuIEluIHRoaXMgY2FzZSB3ZSBwcm9iYWJseSBhbnl3YXkgaGF2ZSBnYXJiYWdlIGluIHRoaXMKLQkgKiBQRUIuCisJICogVGhlIFBFQiBjb250YWlucyBhIHZhbGlkIFZJRCBvciBFQyBoZWFkZXIsIGJ1dCB3ZSBjYW5ub3QgaW52YWxpZGF0ZQorCSAqIGl0LiBTdXBwb3NlZGx5IHRoZSBmbGFzaCBtZWRpYSBvciB0aGUgZHJpdmVyIGlzIHNjcmV3ZWQgdXAsIHNvCisJICogcmV0dXJuIGFuIGVycm9yLgogCSAqLwotCWVycjEgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgJnZpZF9oZHIsIDApOwotCWlmIChlcnIxID09IFVCSV9JT19CQURfSERSX0VCQURNU0cgfHwgZXJyMSA9PSBVQklfSU9fQkFEX0hEUiB8fAotCSAgICBlcnIxID09IFVCSV9JT19GRikgewotCQlzdHJ1Y3QgdWJpX2VjX2hkciBlY19oZHI7Ci0KLQkJZXJyMSA9IHViaV9pb19yZWFkX2VjX2hkcih1YmksIHBudW0sICZlY19oZHIsIDApOwotCQlpZiAoZXJyMSA9PSBVQklfSU9fQkFEX0hEUl9FQkFETVNHIHx8IGVycjEgPT0gVUJJX0lPX0JBRF9IRFIgfHwKLQkJICAgIGVycjEgPT0gVUJJX0lPX0ZGKQotCQkJLyoKLQkJCSAqIEJvdGggVklEIGFuZCBFQyBoZWFkZXJzIGFyZSBjb3JydXB0ZWQsIHNvIHdlIGNhbgotCQkJICogc2FmZWx5IGVyYXNlIHRoaXMgUEVCIGFuZCBub3QgYWZyYWlkIHRoYXQgaXQgd2lsbCBiZQotCQkJICogdHJlYXRlZCBhcyBhIHZhbGlkIFBFQiBpbiBjYXNlIG9mIGFuIHVuY2xlYW4gcmVib290LgotCQkJICovCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIFRoZSBQRUIgY29udGFpbnMgYSB2YWxpZCBWSUQgaGVhZGVyLCBidXQgd2UgY2Fubm90IGludmFsaWRhdGUgaXQuCi0JICogU3VwcG9zZWRseSB0aGUgZmxhc2ggbWVkaWEgb3IgdGhlIGRyaXZlciBpcyBzY3Jld2VkIHVwLCBzbyByZXR1cm4gYW4KLQkgKiBlcnJvci4KLQkgKi8KLQl1YmlfZXJyKCJjYW5ub3QgaW52YWxpZGF0ZSBQRUIgJWQsIHdyaXRlIHJldHVybmVkICVkIHJlYWQgcmV0dXJuZWQgJWQiLAotCQlwbnVtLCBlcnIsIGVycjEpOworCXViaV9lcnIoImNhbm5vdCBpbnZhbGlkYXRlIFBFQiAlZCwgd3JpdGUgcmV0dXJuZWQgJWQiLCBwbnVtLCBlcnIpOwogCXViaV9kdW1wX2ZsYXNoKHViaSwgcG51bSwgMCwgdWJpLT5wZWJfc2l6ZSk7CiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCBhN2RiODE5Li43MWJhMThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTEyNzAsOSArMTI3MCwxMyBAQAogCiAJaWYgKHNsYXZlX29wcy0+bmRvX3NldF9tYWNfYWRkcmVzcyA9PSBOVUxMKSB7CiAJCWlmICghYm9uZF9oYXNfc2xhdmVzKGJvbmQpKSB7Ci0JCQlwcl93YXJuaW5nKCIlczogV2FybmluZzogVGhlIGZpcnN0IHNsYXZlIGRldmljZSBzcGVjaWZpZWQgZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSBNQUMgYWRkcmVzcy4gU2V0dGluZyBmYWlsX292ZXJfbWFjIHRvIGFjdGl2ZS4iLAotCQkJCSAgIGJvbmRfZGV2LT5uYW1lKTsKLQkJCWJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjID0gQk9ORF9GT01fQUNUSVZFOworCQkJcHJfd2FybigiJXM6IFdhcm5pbmc6IFRoZSBmaXJzdCBzbGF2ZSBkZXZpY2Ugc3BlY2lmaWVkIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyB0aGUgTUFDIGFkZHJlc3MuXG4iLAorCQkJCWJvbmRfZGV2LT5uYW1lKTsKKwkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCQkJYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMgPSBCT05EX0ZPTV9BQ1RJVkU7CisJCQkJcHJfd2FybigiJXM6IFNldHRpbmcgZmFpbF9vdmVyX21hYyB0byBhY3RpdmUgZm9yIGFjdGl2ZS1iYWNrdXAgbW9kZS5cbiIsCisJCQkJCWJvbmRfZGV2LT5uYW1lKTsKKwkJCX0KIAkJfSBlbHNlIGlmIChib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYyAhPSBCT05EX0ZPTV9BQ1RJVkUpIHsKIAkJCXByX2VycigiJXM6IEVycm9yOiBUaGUgc2xhdmUgZGV2aWNlIHNwZWNpZmllZCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgdGhlIE1BQyBhZGRyZXNzLCBidXQgZmFpbF9vdmVyX21hYyBpcyBub3Qgc2V0IHRvIGFjdGl2ZS5cbiIsCiAJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUpOwpAQCAtMTMxNSw3ICsxMzE5LDggQEAKIAkgKi8KIAltZW1jcHkobmV3X3NsYXZlLT5wZXJtX2h3YWRkciwgc2xhdmVfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCi0JaWYgKCFib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYykgeworCWlmICghYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMgfHwKKwkgICAgYm9uZC0+cGFyYW1zLm1vZGUgIT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkgewogCQkvKgogCQkgKiBTZXQgc2xhdmUgdG8gbWFzdGVyJ3MgbWFjIGFkZHJlc3MuICBUaGUgYXBwbGljYXRpb24gYWxyZWFkeQogCQkgKiBzZXQgdGhlIG1hc3RlcidzIG1hYyBhZGRyZXNzIHRvIHRoYXQgb2YgdGhlIGZpcnN0IHNsYXZlCkBAIC0xNTA1LDcgKzE1MTAsNiBAQAogCXNsYXZlX2Rldi0+bnBpbmZvID0gYm9uZC0+ZGV2LT5ucGluZm87CiAJaWYgKHNsYXZlX2Rldi0+bnBpbmZvKSB7CiAJCWlmIChzbGF2ZV9lbmFibGVfbmV0cG9sbChuZXdfc2xhdmUpKSB7Ci0JCQlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CiAJCQlwcl9pbmZvKCJFcnJvciwgJXM6IG1hc3Rlcl9kZXYgaXMgdXNpbmcgbmV0cG9sbCwgIgogCQkJCSAiYnV0IG5ldyBzbGF2ZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBuZXRwb2xsLlxuIiwKIAkJCQkgYm9uZF9kZXYtPm5hbWUpOwpAQCAtMTU3OSw3ICsxNTgzLDggQEAKIAlkZXZfY2xvc2Uoc2xhdmVfZGV2KTsKIAogZXJyX3Jlc3RvcmVfbWFjOgotCWlmICghYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMpIHsKKwlpZiAoIWJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjIHx8CisJICAgIGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKIAkJLyogWFhYIFRPRE8gLSBmb20gZm9sbG93IG1vZGUgbmVlZHMgdG8gY2hhbmdlIG1hc3RlcidzCiAJCSAqIE1BQyBpZiB0aGlzIHNsYXZlJ3MgTUFDIGlzIGluIHVzZSBieSB0aGUgYm9uZCwgb3IgYXQKIAkJICogbGVhc3QgcHJpbnQgYSB3YXJuaW5nLgpAQCAtMTY3Miw3ICsxNjc3LDggQEAKIAogCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gTlVMTDsKIAotCWlmICghYWxsICYmICFib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYykgeworCWlmICghYWxsICYmICghYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMgfHwKKwkJICAgICBib25kLT5wYXJhbXMubW9kZSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSkgewogCQlpZiAoZXRoZXJfYWRkcl9lcXVhbF82NGJpdHMoYm9uZF9kZXYtPmRldl9hZGRyLCBzbGF2ZS0+cGVybV9od2FkZHIpICYmCiAJCSAgICBib25kX2hhc19zbGF2ZXMoYm9uZCkpCiAJCQlwcl93YXJuKCIlczogV2FybmluZzogdGhlIHBlcm1hbmVudCBIV2FkZHIgb2YgJXMgLSAlcE0gLSBpcyBzdGlsbCBpbiB1c2UgYnkgJXMuIFNldCB0aGUgSFdhZGRyIG9mICVzIHRvIGEgZGlmZmVyZW50IGFkZHJlc3MgdG8gYXZvaWQgY29uZmxpY3RzLlxuIiwKQEAgLTE3NjksNyArMTc3NSw4IEBACiAJLyogY2xvc2Ugc2xhdmUgYmVmb3JlIHJlc3RvcmluZyBpdHMgbWFjIGFkZHJlc3MgKi8KIAlkZXZfY2xvc2Uoc2xhdmVfZGV2KTsKIAotCWlmIChib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYyAhPSBCT05EX0ZPTV9BQ1RJVkUpIHsKKwlpZiAoYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMgIT0gQk9ORF9GT01fQUNUSVZFIHx8CisJICAgIGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKIAkJLyogcmVzdG9yZSBvcmlnaW5hbCAoInBlcm1hbmVudCIpIG1hYyBhZGRyZXNzICovCiAJCW1lbWNweShhZGRyLnNhX2RhdGEsIHNsYXZlLT5wZXJtX2h3YWRkciwgRVRIX0FMRU4pOwogCQlhZGRyLnNhX2ZhbWlseSA9IHNsYXZlX2Rldi0+dHlwZTsKQEAgLTIzNDYsNyArMjM1Myw3IEBACiAJCQkJCSAgICBhcnBfd29yay53b3JrKTsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqb2xkY3VycmVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwotCWludCBkb19mYWlsb3ZlciA9IDA7CisJaW50IGRvX2ZhaWxvdmVyID0gMCwgc2xhdmVfc3RhdGVfY2hhbmdlZCA9IDA7CiAKIAlpZiAoIWJvbmRfaGFzX3NsYXZlcyhib25kKSkKIAkJZ290byByZV9hcm07CkBAIC0yMzcwLDcgKzIzNzcsNyBAQAogCQkJICAgIGJvbmRfdGltZV9pbl9pbnRlcnZhbChib25kLCBzbGF2ZS0+ZGV2LT5sYXN0X3J4LCAxKSkgewogCiAJCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX1VQOwotCQkJCWJvbmRfc2V0X2FjdGl2ZV9zbGF2ZShzbGF2ZSk7CisJCQkJc2xhdmVfc3RhdGVfY2hhbmdlZCA9IDE7CiAKIAkJCQkvKiBwcmltYXJ5X3NsYXZlIGhhcyBubyBtZWFuaW5nIGluIHJvdW5kLXJvYmluCiAJCQkJICogbW9kZS4gdGhlIHdpbmRvdyBvZiBhIHNsYXZlIGJlaW5nIHVwIGFuZApAQCAtMjM5OSw3ICsyNDA2LDcgQEAKIAkJCSAgICAhYm9uZF90aW1lX2luX2ludGVydmFsKGJvbmQsIHNsYXZlLT5kZXYtPmxhc3RfcngsIDIpKSB7CiAKIAkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKLQkJCQlib25kX3NldF9iYWNrdXBfc2xhdmUoc2xhdmUpOworCQkJCXNsYXZlX3N0YXRlX2NoYW5nZWQgPSAxOwogCiAJCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkKIAkJCQkJc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCsrOwpAQCAtMjQyNiwxOSArMjQzMywyNCBAQAogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAoZG9fZmFpbG92ZXIpIHsKLQkJLyogdGhlIGJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZSBtdXN0IGhvbGQgUlROTAotCQkgKiBhbmQgY3Vycl9zbGF2ZV9sb2NrIGZvciB3cml0ZS4KLQkJICovCisJaWYgKGRvX2ZhaWxvdmVyIHx8IHNsYXZlX3N0YXRlX2NoYW5nZWQpIHsKIAkJaWYgKCFydG5sX3RyeWxvY2soKSkKIAkJCWdvdG8gcmVfYXJtOwotCQlibG9ja19uZXRwb2xsX3R4KCk7Ci0JCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CiAKLQkJYm9uZF9zZWxlY3RfYWN0aXZlX3NsYXZlKGJvbmQpOworCQlpZiAoc2xhdmVfc3RhdGVfY2hhbmdlZCkgeworCQkJYm9uZF9zbGF2ZV9zdGF0ZV9jaGFuZ2UoYm9uZCk7CisJCX0gZWxzZSBpZiAoZG9fZmFpbG92ZXIpIHsKKwkJCS8qIHRoZSBib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUgbXVzdCBob2xkIFJUTkwKKwkJCSAqIGFuZCBjdXJyX3NsYXZlX2xvY2sgZm9yIHdyaXRlLgorCQkJICovCisJCQlibG9ja19uZXRwb2xsX3R4KCk7CisJCQl3cml0ZV9sb2NrX2JoKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOwogCi0JCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKLQkJdW5ibG9ja19uZXRwb2xsX3R4KCk7CisJCQlib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUoYm9uZCk7CisKKwkJCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwkJCXVuYmxvY2tfbmV0cG9sbF90eCgpOworCQl9CiAJCXJ0bmxfdW5sb2NrKCk7CiAJfQogCkBAIC0yNTk5LDQ1ICsyNjExLDUxIEBACiAKIC8qCiAgKiBTZW5kIEFSUCBwcm9iZXMgZm9yIGFjdGl2ZS1iYWNrdXAgbW9kZSBBUlAgbW9uaXRvci4KLSAqCi0gKiBDYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrIGhvbGQuCiAgKi8KLXN0YXRpYyB2b2lkIGJvbmRfYWJfYXJwX3Byb2JlKHN0cnVjdCBib25kaW5nICpib25kKQorc3RhdGljIGJvb2wgYm9uZF9hYl9hcnBfcHJvYmUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CiAJc3RydWN0IHNsYXZlICpzbGF2ZSwgKmJlZm9yZSA9IE5VTEwsICpuZXdfc2xhdmUgPSBOVUxMLAotCQkgICAgICpjdXJyX2FycF9zbGF2ZSA9IHJjdV9kZXJlZmVyZW5jZShib25kLT5jdXJyZW50X2FycF9zbGF2ZSk7CisJCSAgICAgKmN1cnJfYXJwX3NsYXZlLCAqY3Vycl9hY3RpdmVfc2xhdmU7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlib29sIGZvdW5kID0gZmFsc2U7CiAKLQlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCWN1cnJfYXJwX3NsYXZlID0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlKTsKKwljdXJyX2FjdGl2ZV9zbGF2ZSA9IHJjdV9kZXJlZmVyZW5jZShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSk7CiAKLQlpZiAoY3Vycl9hcnBfc2xhdmUgJiYgYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpCisJaWYgKGN1cnJfYXJwX3NsYXZlICYmIGN1cnJfYWN0aXZlX3NsYXZlKQogCQlwcl9pbmZvKCJQUk9CRTogY19hcnAgJXMgJiYgY2FzICVzIEJBRFxuIiwKIAkJCWN1cnJfYXJwX3NsYXZlLT5kZXYtPm5hbWUsCi0JCQlib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCWN1cnJfYWN0aXZlX3NsYXZlLT5kZXYtPm5hbWUpOwogCi0JaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7Ci0JCWJvbmRfYXJwX3NlbmRfYWxsKGJvbmQsIGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKLQkJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7Ci0JCXJldHVybjsKKwlpZiAoY3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgY3Vycl9hY3RpdmVfc2xhdmUpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCi0JcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBpZiB3ZSBkb24ndCBoYXZlIGEgY3Vycl9hY3RpdmVfc2xhdmUsIHNlYXJjaCBmb3IgdGhlIG5leHQgYXZhaWxhYmxlCiAJICogYmFja3VwIHNsYXZlIGZyb20gdGhlIGN1cnJlbnRfYXJwX3NsYXZlIGFuZCBtYWtlIGl0IHRoZSBjYW5kaWRhdGUKIAkgKiBmb3IgYmVjb21pbmcgdGhlIGN1cnJfYWN0aXZlX3NsYXZlCiAJICovCiAKKwlpZiAoIXJ0bmxfdHJ5bG9jaygpKQorCQlyZXR1cm4gZmFsc2U7CisJLyogY3Vycl9hcnBfc2xhdmUgbWlnaHQgaGF2ZSBnb25lIGF3YXkgKi8KKwljdXJyX2FycF9zbGF2ZSA9IEFDQ0VTU19PTkNFKGJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlKTsKKwogCWlmICghY3Vycl9hcnBfc2xhdmUpIHsKLQkJY3Vycl9hcnBfc2xhdmUgPSBib25kX2ZpcnN0X3NsYXZlX3JjdShib25kKTsKLQkJaWYgKCFjdXJyX2FycF9zbGF2ZSkKLQkJCXJldHVybjsKKwkJY3Vycl9hcnBfc2xhdmUgPSBib25kX2ZpcnN0X3NsYXZlKGJvbmQpOworCQlpZiAoIWN1cnJfYXJwX3NsYXZlKSB7CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIHRydWU7CisJCX0KIAl9CiAKIAlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhjdXJyX2FycF9zbGF2ZSk7CiAKLQlib25kX2Zvcl9lYWNoX3NsYXZlX3JjdShib25kLCBzbGF2ZSwgaXRlcikgeworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKIAkJaWYgKCFmb3VuZCAmJiAhYmVmb3JlICYmIElTX1VQKHNsYXZlLT5kZXYpKQogCQkJYmVmb3JlID0gc2xhdmU7CiAKQEAgLTI2NjcsMjEgKzI2ODUsMjYgQEAKIAlpZiAoIW5ld19zbGF2ZSAmJiBiZWZvcmUpCiAJCW5ld19zbGF2ZSA9IGJlZm9yZTsKIAotCWlmICghbmV3X3NsYXZlKQotCQlyZXR1cm47CisJaWYgKCFuZXdfc2xhdmUpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIHRydWU7CisJfQogCiAJbmV3X3NsYXZlLT5saW5rID0gQk9ORF9MSU5LX0JBQ0s7CiAJYm9uZF9zZXRfc2xhdmVfYWN0aXZlX2ZsYWdzKG5ld19zbGF2ZSk7CiAJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgbmV3X3NsYXZlKTsKIAluZXdfc2xhdmUtPmppZmZpZXMgPSBqaWZmaWVzOwogCXJjdV9hc3NpZ25fcG9pbnRlcihib25kLT5jdXJyZW50X2FycF9zbGF2ZSwgbmV3X3NsYXZlKTsKKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGJvbmRfYWN0aXZlYmFja3VwX2FycF9tb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBib25kaW5nLAogCQkJCQkgICAgYXJwX3dvcmsud29yayk7Ci0JYm9vbCBzaG91bGRfbm90aWZ5X3BlZXJzID0gZmFsc2U7CisJYm9vbCBzaG91bGRfbm90aWZ5X3BlZXJzID0gZmFsc2UsIHNob3VsZF9jb21taXQgPSBmYWxzZTsKIAlpbnQgZGVsdGFfaW5fdGlja3M7CiAKIAlkZWx0YV9pbl90aWNrcyA9IG1zZWNzX3RvX2ppZmZpZXMoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCk7CkBAIC0yNjkwLDEyICsyNzEzLDExIEBACiAJCWdvdG8gcmVfYXJtOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCiAJc2hvdWxkX25vdGlmeV9wZWVycyA9IGJvbmRfc2hvdWxkX25vdGlmeV9wZWVycyhib25kKTsKKwlzaG91bGRfY29tbWl0ID0gYm9uZF9hYl9hcnBfaW5zcGVjdChib25kKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChib25kX2FiX2FycF9pbnNwZWN0KGJvbmQpKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCisJaWYgKHNob3VsZF9jb21taXQpIHsKIAkJLyogUmFjZSBhdm9pZGFuY2Ugd2l0aCBib25kX2Nsb3NlIGZsdXNoIG9mIHdvcmtxdWV1ZSAqLwogCQlpZiAoIXJ0bmxfdHJ5bG9jaygpKSB7CiAJCQlkZWx0YV9pbl90aWNrcyA9IDE7CkBAIC0yNzA0LDEzICsyNzI2LDE0IEBACiAJCX0KIAogCQlib25kX2FiX2FycF9jb21taXQoYm9uZCk7Ci0KIAkJcnRubF91bmxvY2soKTsKLQkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAotCWJvbmRfYWJfYXJwX3Byb2JlKGJvbmQpOwotCXJjdV9yZWFkX3VubG9jaygpOworCWlmICghYm9uZF9hYl9hcnBfcHJvYmUoYm9uZCkpIHsKKwkJLyogcnRubCBsb2NraW5nIGZhaWxlZCwgcmUtYXJtICovCisJCWRlbHRhX2luX3RpY2tzID0gMTsKKwkJc2hvdWxkX25vdGlmeV9wZWVycyA9IGZhbHNlOworCX0KIAogcmVfYXJtOgogCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKQpAQCAtMzQxNSw3ICszNDM4LDggQEAKIAkvKiBJZiBmYWlsX292ZXJfbWFjIGlzIGVuYWJsZWQsIGRvIG5vdGhpbmcgYW5kIHJldHVybiBzdWNjZXNzLgogCSAqIFJldHVybmluZyBhbiBlcnJvciBjYXVzZXMgaWZlbnNsYXZlIHRvIGZhaWwuCiAJICovCi0JaWYgKGJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjKQorCWlmIChib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYyAmJgorCSAgICBib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKQogCQlyZXR1cm4gMDsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihzYS0+c2FfZGF0YSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaCBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCmluZGV4IDFhOTA2MmYuLjg2Y2NmYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCkBAIC0zMDMsNiArMzAzLDE5IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9zbGF2ZV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKKwlzdHJ1Y3Qgc2xhdmUgKnRtcDsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgdG1wLCBpdGVyKSB7CisJCWlmICh0bXAtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKQorCQkJYm9uZF9zZXRfYWN0aXZlX3NsYXZlKHRtcCk7CisJCWVsc2UgaWYgKHRtcC0+bGluayA9PSBCT05EX0xJTktfRE9XTikKKwkJCWJvbmRfc2V0X2JhY2t1cF9zbGF2ZSh0bXApOworCX0KK30KKwogc3RhdGljIGlubGluZSBpbnQgYm9uZF9zbGF2ZV9zdGF0ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQogewogCXJldHVybiBzbGF2ZS0+YmFja3VwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCBkNDQ3Yjg4Li45ZTdkOTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIGNvbmZpZyBDQU5fRkxFWENBTgogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBGcmVlc2NhbGUgRkxFWENBTiBiYXNlZCBjaGlwcyIKLQlkZXBlbmRzIG9uIChBUk0gJiYgQ1BVX0xJVFRMRV9FTkRJQU4pIHx8IFBQQworCWRlcGVuZHMgb24gQVJNIHx8IFBQQwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBmb3IgRnJlZXNjYWxlIEZsZXhDQU4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYyBiL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYwppbmRleCAxM2E5MDk4Li5mYzU5YmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2Rldi5jCkBAIC0zMjMsMTkgKzMyMywxMCBAQAogCX0KIAogCWlmICghcHJpdi0+ZWNob19za2JbaWR4XSkgewotCQlzdHJ1Y3Qgc29jayAqc3Jjc2sgPSBza2ItPnNrOwogCi0JCWlmIChhdG9taWNfcmVhZCgmc2tiLT51c2VycykgIT0gMSkgewotCQkJc3RydWN0IHNrX2J1ZmYgKm9sZF9za2IgPSBza2I7Ci0KLQkJCXNrYiA9IHNrYl9jbG9uZShvbGRfc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWtmcmVlX3NrYihvbGRfc2tiKTsKLQkJCWlmICghc2tiKQotCQkJCXJldHVybjsKLQkJfSBlbHNlCi0JCQlza2Jfb3JwaGFuKHNrYik7Ci0KLQkJc2tiLT5zayA9IHNyY3NrOworCQlza2IgPSBjYW5fY3JlYXRlX2VjaG9fc2tiKHNrYik7CisJCWlmICghc2tiKQorCQkJcmV0dXJuOwogCiAJCS8qIG1ha2Ugc2V0dGluZ3MgZm9yIGVjaG8gdG8gcmVkdWNlIGNvZGUgaW4gaXJxIGNvbnRleHQgKi8KIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0NBTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYwppbmRleCBhYWVkOTdiLi4zMjBiZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKQEAgLTIzNSw5ICsyMzUsMTIgQEAKIH07CiAKIC8qCi0gKiBBYnN0cmFjdCBvZmYgdGhlIHJlYWQvd3JpdGUgZm9yIGFybSB2ZXJzdXMgcHBjLgorICogQWJzdHJhY3Qgb2ZmIHRoZSByZWFkL3dyaXRlIGZvciBhcm0gdmVyc3VzIHBwYy4gVGhpcworICogYXNzdW1lcyB0aGF0IFBQQyB1c2VzIGJpZy1lbmRpYW4gcmVnaXN0ZXJzIGFuZCBldmVyeXRoaW5nCisgKiBlbHNlIHVzZXMgbGl0dGxlLWVuZGlhbiByZWdpc3RlcnMsIGluZGVwZW5kZW50IG9mIENQVQorICogZW5kaWFuZXNzLgogICovCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQogc3RhdGljIGlubGluZSB1MzIgZmxleGNhbl9yZWFkKHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlyZXR1cm4gaW5fYmUzMihhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9qYW56LWljYW4zLmMgYi9kcml2ZXJzL25ldC9jYW4vamFuei1pY2FuMy5jCmluZGV4IGUyNGU2NjkuLjcxNTk0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9qYW56LWljYW4zLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2phbnotaWNhbjMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vc2tiLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL2Vycm9yLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tZmQvamFuei5oPgpAQCAtMTEzMywyMCArMTEzNCw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGljYW4zX3B1dF9lY2hvX3NrYihzdHJ1Y3QgaWNhbjNfZGV2ICptb2QsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHNvY2sgKnNyY3NrID0gc2tiLT5zazsKLQotCWlmIChhdG9taWNfcmVhZCgmc2tiLT51c2VycykgIT0gMSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqb2xkX3NrYiA9IHNrYjsKLQotCQlza2IgPSBza2JfY2xvbmUob2xkX3NrYiwgR0ZQX0FUT01JQyk7Ci0JCWtmcmVlX3NrYihvbGRfc2tiKTsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJc2tiX29ycGhhbihza2IpOwotCX0KLQotCXNrYi0+c2sgPSBzcmNzazsKKwlza2IgPSBjYW5fY3JlYXRlX2VjaG9fc2tiKHNrYik7CisJaWYgKCFza2IpCisJCXJldHVybjsKIAogCS8qIHNhdmUgdGhpcyBza2IgZm9yIHR4IGludGVycnVwdCBlY2hvIGhhbmRsaW5nICovCiAJc2tiX3F1ZXVlX3RhaWwoJm1vZC0+ZWNob3EsIHNrYik7CkBAIC0xMzIyLDcgKzEzMTIsNyBAQAogCiAJLyogcHJvY2VzcyBhbGwgY29tbXVuaWNhdGlvbiBtZXNzYWdlcyAqLwogCXdoaWxlICh0cnVlKSB7Ci0JCXN0cnVjdCBpY2FuM19tc2cgbXNnOworCQlzdHJ1Y3QgaWNhbjNfbXNnIHVuaW5pdGlhbGl6ZWRfdmFyKG1zZyk7CiAJCXJldCA9IGljYW4zX3JlY3ZfbXNnKG1vZCwgJm1zZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9tcGM1eHh4X2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL21zY2FuL21wYzV4eHhfY2FuLmMKaW5kZXggMDM1ZTIzNS4uNDQ3MjUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL21zY2FuL21wYzV4eHhfY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL21zY2FuL21wYzV4eHhfY2FuLmMKQEAgLTEwOCwxMzUgKzEwOCwxNzAgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDX01QQzUyeHggKi8KIAogI2lmZGVmIENPTkZJR19QUENfTVBDNTEyeAotc3RydWN0IG1wYzUxMnhfY2xvY2tjdGwgewotCXUzMiBzcG1yOwkJLyogU3lzdGVtIFBMTCBNb2RlIFJlZyAqLwotCXUzMiBzY2NyWzJdOwkJLyogU3lzdGVtIENsayBDdHJsIFJlZyAxICYgMiAqLwotCXUzMiBzY2ZyMTsJCS8qIFN5c3RlbSBDbGsgRnJlcSBSZWcgMSAqLwotCXUzMiBzY2ZyMjsJCS8qIFN5c3RlbSBDbGsgRnJlcSBSZWcgMiAqLwotCXUzMiByZXNlcnZlZDsKLQl1MzIgYmNyOwkJLyogQnJlYWQgQ3J1bWIgUmVnICovCi0JdTMyIHBjY3JbMTJdOwkJLyogUFNDIENsayBDdHJsIFJlZyAwLTExICovCi0JdTMyIHNwY2NyOwkJLyogU1BESUYgQ2xrIEN0cmwgUmVnICovCi0JdTMyIGNjY3I7CQkvKiBDRk0gQ2xrIEN0cmwgUmVnICovCi0JdTMyIGRjY3I7CQkvKiBESVUgQ2xrIENuZmcgUmVnICovCi0JdTMyIG1jY3JbNF07CQkvKiBNU0NBTiBDbGsgQ3RybCBSZWcgMS0zICovCi19OwotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1MTJ4X2Nsb2NrX2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtY2xvY2siLCB9LAotCXt9Ci19OwotCiBzdGF0aWMgdTMyIG1wYzUxMnhfY2FuX2dldF9jbG9jayhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldiwKLQkJCQkgY29uc3QgY2hhciAqY2xvY2tfbmFtZSwgaW50ICptc2Nhbl9jbGtzcmMpCisJCQkJIGNvbnN0IGNoYXIgKmNsb2NrX3NvdXJjZSwgaW50ICptc2Nhbl9jbGtzcmMpCiB7Ci0Jc3RydWN0IG1wYzUxMnhfY2xvY2tjdGwgX19pb21lbSAqY2xvY2tjdGw7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucF9jbG9jazsKLQlzdHJ1Y3QgY2xrICpzeXNfY2xrLCAqcmVmX2NsazsKLQlpbnQgcGxlbiwgY2xvY2tpZHgsIGNsb2Nrc3JjID0gLTE7Ci0JdTMyIHN5c19mcmVxLCB2YWwsIGNsb2NrZGl2ID0gMSwgZnJlcSA9IDA7Ci0JY29uc3QgdTMyICpwdmFsOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyIGNsb2NrZGl2OworCWVudW0geworCQlDTEtfRlJPTV9BVVRPLAorCQlDTEtfRlJPTV9JUFMsCisJCUNMS19GUk9NX1NZUywKKwkJQ0xLX0ZST01fUkVGLAorCX0gY2xrX2Zyb207CisJc3RydWN0IGNsayAqY2xrX2luLCAqY2xrX2NhbjsKKwl1bnNpZ25lZCBsb25nIGZyZXFfY2FsYzsKKwlzdHJ1Y3QgbXNjYW5fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgY2xrICpjbGtfaXBnOwogCi0JbnBfY2xvY2sgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgbXBjNTEyeF9jbG9ja19pZHMpOwotCWlmICghbnBfY2xvY2spIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNvdWxkbid0IGZpbmQgY2xvY2sgbm9kZVxuIik7Ci0JCXJldHVybiAwOworCS8qIHRoZSBjYWxsZXIgcGFzc2VkIGluIHRoZSBjbG9jayBzb3VyY2Ugc3BlYyB0aGF0IHdhcyByZWFkIGZyb20KKwkgKiB0aGUgZGV2aWNlIHRyZWUsIGdldCB0aGUgb3B0aW9uYWwgY2xvY2sgZGl2aWRlciBhcyB3ZWxsCisJICovCisJbnAgPSBvZmRldi0+ZGV2Lm9mX25vZGU7CisJY2xvY2tkaXYgPSAxOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLG1zY2FuLWNsb2NrLWRpdmlkZXIiLCAmY2xvY2tkaXYpOworCWRldl9kYmcoJm9mZGV2LT5kZXYsICJkZXZpY2UgdHJlZSBzcGVjczogY2xrIHNyY1slc10gZGl2WyVkXVxuIiwKKwkJY2xvY2tfc291cmNlID8gY2xvY2tfc291cmNlIDogIjxOVUxMPiIsIGNsb2NrZGl2KTsKKworCS8qIHdoZW4gY2xvY2stc291cmNlIGlzICdpcCcsIHRoZSBDQU5DVEwxW0NMS1NSQ10gYml0IG5lZWRzIHRvCisJICogZ2V0IHNldCwgYW5kIHRoZSAnaXBzJyBjbG9jayBpcyB0aGUgaW5wdXQgdG8gdGhlIE1TQ0FOCisJICogY29tcG9uZW50CisJICoKKwkgKiBmb3IgY2xvY2stc291cmNlIHZhbHVlcyBvZiAncmVmJyBvciAnc3lzJyB0aGUgQ0FOQ1RMMVtDTEtTUkNdCisJICogYml0IG5lZWRzIHRvIGdldCBjbGVhcmVkLCBhbiBvcHRpb25hbCBjbG9jay1kaXZpZGVyIG1heSBoYXZlCisJICogYmVlbiBzcGVjaWZpZWQgKHRoZSBkZWZhdWx0IHZhbHVlIGlzIDEpLCB0aGUgYXBwcm9wcmlhdGUKKwkgKiBNU0NBTiByZWxhdGVkIE1DTEsgaXMgdGhlIGlucHV0IHRvIHRoZSBNU0NBTiBjb21wb25lbnQKKwkgKgorCSAqIGluIHRoZSBhYnNlbmNlIG9mIGEgY2xvY2stc291cmNlIHNwZWMsIGZpcnN0IGFuIG9wdGltYWwgY2xvY2sKKwkgKiBnZXRzIGRldGVybWluZWQgYmFzZWQgb24gdGhlICdzeXMnIGNsb2NrLCBpZiB0aGF0IGZhaWxzIHRoZQorCSAqICdyZWYnIGNsb2NrIGlzIHVzZWQKKwkgKi8KKwljbGtfZnJvbSA9IENMS19GUk9NX0FVVE87CisJaWYgKGNsb2NrX3NvdXJjZSkgeworCQkvKiBpbnRlcnByZXQgdGhlIGRldmljZSB0cmVlJ3Mgc3BlYyBmb3IgdGhlIGNsb2NrIHNvdXJjZSAqLworCQlpZiAoIXN0cmNtcChjbG9ja19zb3VyY2UsICJpcCIpKQorCQkJY2xrX2Zyb20gPSBDTEtfRlJPTV9JUFM7CisJCWVsc2UgaWYgKCFzdHJjbXAoY2xvY2tfc291cmNlLCAic3lzIikpCisJCQljbGtfZnJvbSA9IENMS19GUk9NX1NZUzsKKwkJZWxzZSBpZiAoIXN0cmNtcChjbG9ja19zb3VyY2UsICJyZWYiKSkKKwkJCWNsa19mcm9tID0gQ0xLX0ZST01fUkVGOworCQllbHNlCisJCQlnb3RvIGVycl9pbnZhbGlkOworCQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAiZ290IGEgY2xrIHNvdXJjZSBzcGVjWyVkXVxuIiwgY2xrX2Zyb20pOwogCX0KLQljbG9ja2N0bCA9IG9mX2lvbWFwKG5wX2Nsb2NrLCAwKTsKLQlpZiAoIWNsb2NrY3RsKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjb3VsZG4ndCBtYXAgY2xvY2sgcmVnaXN0ZXJzXG4iKTsKLQkJZ290byBleGl0X3B1dDsKKwlpZiAoY2xrX2Zyb20gPT0gQ0xLX0ZST01fQVVUTykgeworCQkvKiBubyBzcGVjIHNvIGZhciwgdHJ5IHRoZSAnc3lzJyBjbG9jazsgcm91bmQgdG8gdGhlCisJCSAqIG5leHQgTUh6IGFuZCBzZWUgaWYgd2UgY2FuIGdldCBhIG11bHRpcGxlIG9mIDE2TUh6CisJCSAqLworCQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAibm8gY2xrIHNvdXJjZSBzcGVjLCB0cnlpbmcgU1lTXG4iKTsKKwkJY2xrX2luID0gZGV2bV9jbGtfZ2V0KCZvZmRldi0+ZGV2LCAic3lzIik7CisJCWlmIChJU19FUlIoY2xrX2luKSkKKwkJCWdvdG8gZXJyX25vdGF2YWlsOworCQlmcmVxX2NhbGMgPSBjbGtfZ2V0X3JhdGUoY2xrX2luKTsKKwkJZnJlcV9jYWxjICs9ICA0OTk5OTk7CisJCWZyZXFfY2FsYyAvPSAxMDAwMDAwOworCQlmcmVxX2NhbGMgKj0gMTAwMDAwMDsKKwkJaWYgKChmcmVxX2NhbGMgJSAxNjAwMDAwMCkgPT0gMCkgeworCQkJY2xrX2Zyb20gPSBDTEtfRlJPTV9TWVM7CisJCQljbG9ja2RpdiA9IGZyZXFfY2FsYyAvIDE2MDAwMDAwOworCQkJZGV2X2RiZygmb2ZkZXYtPmRldiwKKwkJCQkiY2xrIGZpdCwgc3lzWyVsdV0gZGl2WyVkXSBmcmVxWyVsdV1cbiIsCisJCQkJZnJlcV9jYWxjLCBjbG9ja2RpdiwgZnJlcV9jYWxjIC8gY2xvY2tkaXYpOworCQl9CisJfQorCWlmIChjbGtfZnJvbSA9PSBDTEtfRlJPTV9BVVRPKSB7CisJCS8qIG5vIHNwZWMgc28gZmFyLCB1c2UgdGhlICdyZWYnIGNsb2NrICovCisJCWRldl9kYmcoJm9mZGV2LT5kZXYsICJubyBjbGsgc291cmNlIHNwZWMsIHRyeWluZyBSRUZcbiIpOworCQljbGtfaW4gPSBkZXZtX2Nsa19nZXQoJm9mZGV2LT5kZXYsICJyZWYiKTsKKwkJaWYgKElTX0VSUihjbGtfaW4pKQorCQkJZ290byBlcnJfbm90YXZhaWw7CisJCWNsa19mcm9tID0gQ0xLX0ZST01fUkVGOworCQlmcmVxX2NhbGMgPSBjbGtfZ2V0X3JhdGUoY2xrX2luKTsKKwkJZGV2X2RiZygmb2ZkZXYtPmRldiwKKwkJCSJjbGsgZml0LCByZWZbJWx1XSAobm8gZGl2KSBmcmVxWyVsdV1cbiIsCisJCQlmcmVxX2NhbGMsIGZyZXFfY2FsYyk7CiAJfQogCi0JLyogRGV0ZXJtaW5lIHRoZSBNU0NBTiBkZXZpY2UgaW5kZXggZnJvbSB0aGUgcGVyaXBoZXJhbCdzCi0JICogcGh5c2ljYWwgYWRkcmVzcy4gUmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXRzIGFnYWluc3QgdGhlCi0JICogSU1NUiBiYXNlIGFyZTogIDB4MTMwMCwgMHgxMzgwLCAweDIzMDAsIDB4MjM4MAorCS8qIHNlbGVjdCBJUFMgb3IgTUNMSyBhcyB0aGUgTVNDQU4gaW5wdXQgKHJldHVybmVkIHRvIHRoZSBjYWxsZXIpLAorCSAqIHNldHVwIHRoZSBNQ0xLIG11eCBzb3VyY2UgYW5kIHJhdGUgaWYgYXBwbGljYWJsZSwgYXBwbHkgdGhlCisJICogb3B0aW9uYWxseSBzcGVjaWZpZWQgb3IgZGVyaXZlZCBhYm92ZSBkaXZpZGVyLCBhbmQgZGV0ZXJtaW5lCisJICogdGhlIGFjdHVhbCByZXN1bHRpbmcgY2xvY2sgcmF0ZSB0byByZXR1cm4gdG8gdGhlIGNhbGxlcgogCSAqLwotCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPmRldi5vZl9ub2RlLCAicmVnIiwgJnBsZW4pOwotCUJVR19PTighcHZhbCB8fCBwbGVuIDwgc2l6ZW9mKCpwdmFsKSk7Ci0JY2xvY2tpZHggPSAoKnB2YWwgJiAweDgwKSA/IDEgOiAwOwotCWlmICgqcHZhbCAmIDB4MjAwMCkKLQkJY2xvY2tpZHggKz0gMjsKLQotCS8qCi0JICogQ2xvY2sgc291cmNlIGFuZCBkaXZpZGVyIHNlbGVjdGlvbjogMyBkaWZmZXJlbnQgY2xvY2sgc291cmNlcwotCSAqIGNhbiBiZSBzZWxlY3RlZDogImlwIiwgInJlZiIgb3IgInN5cyIuIEZvciB0aGUgbGF0dGVyIHR3bywgYQotCSAqIGNsb2NrIGRpdmlkZXIgY2FuIGJlIGRlZmluZWQgYXMgd2VsbC4gSWYgdGhlIGNsb2NrIHNvdXJjZSBpcwotCSAqIG5vdCBzcGVjaWZpZWQgYnkgdGhlIGRldmljZSB0cmVlLCB3ZSBmaXJzdCB0cnkgdG8gZmluZCBhbgotCSAqIG9wdGltYWwgQ0FOIHNvdXJjZSBjbG9jayBiYXNlZCBvbiB0aGUgc3lzdGVtIGNsb2NrLiBJZiB0aGF0Ci0JICogaXMgbm90IHBvc3NsaWJsZSwgdGhlIHJlZmVyZW5jZSBjbG9jayB3aWxsIGJlIHVzZWQuCi0JICovCi0JaWYgKGNsb2NrX25hbWUgJiYgIXN0cmNtcChjbG9ja19uYW1lLCAiaXAiKSkgeworCXN3aXRjaCAoY2xrX2Zyb20pIHsKKwljYXNlIENMS19GUk9NX0lQUzoKKwkJY2xrX2NhbiA9IGRldm1fY2xrX2dldCgmb2ZkZXYtPmRldiwgImlwcyIpOworCQlpZiAoSVNfRVJSKGNsa19jYW4pKQorCQkJZ290byBlcnJfbm90YXZhaWw7CisJCXByaXYgPSBuZXRkZXZfcHJpdihkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpKTsKKwkJcHJpdi0+Y2xrX2NhbiA9IGNsa19jYW47CisJCWZyZXFfY2FsYyA9IGNsa19nZXRfcmF0ZShjbGtfY2FuKTsKIAkJKm1zY2FuX2Nsa3NyYyA9IE1TQ0FOX0NMS1NSQ19JUFM7Ci0JCWZyZXEgPSBtcGM1eHh4X2dldF9idXNfZnJlcXVlbmN5KG9mZGV2LT5kZXYub2Zfbm9kZSk7Ci0JfSBlbHNlIHsKKwkJZGV2X2RiZygmb2ZkZXYtPmRldiwgImNsayBmcm9tIElQUywgY2xrc3JjWyVkXSBmcmVxWyVsdV1cbiIsCisJCQkqbXNjYW5fY2xrc3JjLCBmcmVxX2NhbGMpOworCQlicmVhazsKKwljYXNlIENMS19GUk9NX1NZUzoKKwljYXNlIENMS19GUk9NX1JFRjoKKwkJY2xrX2NhbiA9IGRldm1fY2xrX2dldCgmb2ZkZXYtPmRldiwgIm1jbGsiKTsKKwkJaWYgKElTX0VSUihjbGtfY2FuKSkKKwkJCWdvdG8gZXJyX25vdGF2YWlsOworCQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KSk7CisJCXByaXYtPmNsa19jYW4gPSBjbGtfY2FuOworCQlpZiAoY2xrX2Zyb20gPT0gQ0xLX0ZST01fU1lTKQorCQkJY2xrX2luID0gZGV2bV9jbGtfZ2V0KCZvZmRldi0+ZGV2LCAic3lzIik7CisJCWlmIChjbGtfZnJvbSA9PSBDTEtfRlJPTV9SRUYpCisJCQljbGtfaW4gPSBkZXZtX2Nsa19nZXQoJm9mZGV2LT5kZXYsICJyZWYiKTsKKwkJaWYgKElTX0VSUihjbGtfaW4pKQorCQkJZ290byBlcnJfbm90YXZhaWw7CisJCWNsa19zZXRfcGFyZW50KGNsa19jYW4sIGNsa19pbik7CisJCWZyZXFfY2FsYyA9IGNsa19nZXRfcmF0ZShjbGtfaW4pOworCQlmcmVxX2NhbGMgLz0gY2xvY2tkaXY7CisJCWNsa19zZXRfcmF0ZShjbGtfY2FuLCBmcmVxX2NhbGMpOworCQlmcmVxX2NhbGMgPSBjbGtfZ2V0X3JhdGUoY2xrX2Nhbik7CiAJCSptc2Nhbl9jbGtzcmMgPSBNU0NBTl9DTEtTUkNfQlVTOwotCi0JCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPmRldi5vZl9ub2RlLAotCQkJCSAgICAgICAiZnNsLG1zY2FuLWNsb2NrLWRpdmlkZXIiLCAmcGxlbik7Ci0JCWlmIChwdmFsICYmIHBsZW4gPT0gc2l6ZW9mKCpwdmFsKSkKLQkJCWNsb2NrZGl2ID0gKnB2YWw7Ci0JCWlmICghY2xvY2tkaXYpCi0JCQljbG9ja2RpdiA9IDE7Ci0KLQkJaWYgKCFjbG9ja19uYW1lIHx8ICFzdHJjbXAoY2xvY2tfbmFtZSwgInN5cyIpKSB7Ci0JCQlzeXNfY2xrID0gZGV2bV9jbGtfZ2V0KCZvZmRldi0+ZGV2LCAic3lzX2NsayIpOwotCQkJaWYgKElTX0VSUihzeXNfY2xrKSkgewotCQkJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjb3VsZG4ndCBnZXQgc3lzX2Nsa1xuIik7Ci0JCQkJZ290byBleGl0X3VubWFwOwotCQkJfQotCQkJLyogR2V0IGFuZCByb3VuZCB1cC9kb3duIHN5cyBjbG9jayByYXRlICovCi0JCQlzeXNfZnJlcSA9IDEwMDAwMDAgKgotCQkJCSgoY2xrX2dldF9yYXRlKHN5c19jbGspICsgNDk5OTk5KSAvIDEwMDAwMDApOwotCi0JCQlpZiAoIWNsb2NrX25hbWUpIHsKLQkJCQkvKiBBIG11bHRpcGxlIG9mIDE2IE1IeiB3b3VsZCBiZSBvcHRpbWFsICovCi0JCQkJaWYgKChzeXNfZnJlcSAlIDE2MDAwMDAwKSA9PSAwKSB7Ci0JCQkJCWNsb2Nrc3JjID0gMDsKLQkJCQkJY2xvY2tkaXYgPSBzeXNfZnJlcSAvIDE2MDAwMDAwOwotCQkJCQlmcmVxID0gc3lzX2ZyZXEgLyBjbG9ja2RpdjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNsb2Nrc3JjID0gMDsKLQkJCQlmcmVxID0gc3lzX2ZyZXEgLyBjbG9ja2RpdjsKLQkJCX0KLQkJfQotCi0JCWlmIChjbG9ja3NyYyA8IDApIHsKLQkJCXJlZl9jbGsgPSBkZXZtX2Nsa19nZXQoJm9mZGV2LT5kZXYsICJyZWZfY2xrIik7Ci0JCQlpZiAoSVNfRVJSKHJlZl9jbGspKSB7Ci0JCQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNvdWxkbid0IGdldCByZWZfY2xrXG4iKTsKLQkJCQlnb3RvIGV4aXRfdW5tYXA7Ci0JCQl9Ci0JCQljbG9ja3NyYyA9IDE7Ci0JCQlmcmVxID0gY2xrX2dldF9yYXRlKHJlZl9jbGspIC8gY2xvY2tkaXY7Ci0JCX0KKwkJZGV2X2RiZygmb2ZkZXYtPmRldiwgImNsayBmcm9tIE1DTEssIGNsa3NyY1slZF0gZnJlcVslbHVdXG4iLAorCQkJKm1zY2FuX2Nsa3NyYywgZnJlcV9jYWxjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJfaW52YWxpZDsKIAl9CiAKLQkvKiBEaXNhYmxlIGNsb2NrICovCi0Jb3V0X2JlMzIoJmNsb2NrY3RsLT5tY2NyW2Nsb2NraWR4XSwgMHgwKTsKLQlpZiAoY2xvY2tzcmMgPj0gMCkgewotCQkvKiBTZXQgc291cmNlIGFuZCBkaXZpZGVyICovCi0JCXZhbCA9IChjbG9ja3NyYyA8PCAxNCkgfCAoKGNsb2NrZGl2IC0gMSkgPDwgMTcpOwotCQlvdXRfYmUzMigmY2xvY2tjdGwtPm1jY3JbY2xvY2tpZHhdLCB2YWwpOwotCQkvKiBFbmFibGUgY2xvY2sgKi8KLQkJb3V0X2JlMzIoJmNsb2NrY3RsLT5tY2NyW2Nsb2NraWR4XSwgdmFsIHwgMHgxMDAwMCk7Ci0JfQorCS8qIHRoZSBhYm92ZSBjbGtfY2FuIGl0ZW0gaXMgdXNlZCBmb3IgdGhlIGJpdHJhdGUsIGFjY2VzcyB0bworCSAqIHRoZSBwZXJpcGhlcmFsJ3MgcmVnaXN0ZXIgc2V0IG5lZWRzIHRoZSBjbGtfaXBnIGl0ZW0KKwkgKi8KKwljbGtfaXBnID0gZGV2bV9jbGtfZ2V0KCZvZmRldi0+ZGV2LCAiaXBnIik7CisJaWYgKElTX0VSUihjbGtfaXBnKSkKKwkJZ290byBlcnJfbm90YXZhaWxfaXBnOworCWlmIChjbGtfcHJlcGFyZV9lbmFibGUoY2xrX2lwZykpCisJCWdvdG8gZXJyX25vdGF2YWlsX2lwZzsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KSk7CisJcHJpdi0+Y2xrX2lwZyA9IGNsa19pcGc7CiAKLQkvKiBFbmFibGUgTVNDQU4gY2xvY2sgZG9tYWluICovCi0JdmFsID0gaW5fYmUzMigmY2xvY2tjdGwtPnNjY3JbMV0pOwotCWlmICghKHZhbCAmICgxIDw8IDI1KSkpCi0JCW91dF9iZTMyKCZjbG9ja2N0bC0+c2NjclsxXSwgdmFsIHwgKDEgPDwgMjUpKTsKKwkvKiByZXR1cm4gdGhlIGRldGVybWluZWQgY2xvY2sgc291cmNlIHJhdGUgKi8KKwlyZXR1cm4gZnJlcV9jYWxjOwogCi0JZGV2X2RiZygmb2ZkZXYtPmRldiwgInVzaW5nICclcycgd2l0aCBmcmVxdWVuY3kgZGl2aWRlciAlZFxuIiwKLQkJKm1zY2FuX2Nsa3NyYyA9PSBNU0NBTl9DTEtTUkNfSVBTID8gImlwc19jbGsiIDoKLQkJY2xvY2tzcmMgPT0gMSA/ICJyZWZfY2xrIiA6ICJzeXNfY2xrIiwgY2xvY2tkaXYpOworZXJyX2ludmFsaWQ6CisJZGV2X2Vycigmb2ZkZXYtPmRldiwgImludmFsaWQgY2xvY2sgc291cmNlIHNwZWNpZmljYXRpb25cbiIpOworCS8qIGNsb2NrIHNvdXJjZSByYXRlIGNvdWxkIG5vdCBnZXQgZGV0ZXJtaW5lZCAqLworCXJldHVybiAwOwogCi1leGl0X3VubWFwOgotCWlvdW5tYXAoY2xvY2tjdGwpOwotZXhpdF9wdXQ6Ci0Jb2Zfbm9kZV9wdXQobnBfY2xvY2spOwotCXJldHVybiBmcmVxOworZXJyX25vdGF2YWlsOgorCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW5ub3QgYWNxdWlyZSBvciBzZXR1cCBiaXRyYXRlIGNsb2NrIHNvdXJjZVxuIik7CisJLyogY2xvY2sgc291cmNlIHJhdGUgY291bGQgbm90IGdldCBkZXRlcm1pbmVkICovCisJcmV0dXJuIDA7CisKK2Vycl9ub3RhdmFpbF9pcGc6CisJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNhbm5vdCBhY3F1aXJlIG9yIHNldHVwIHJlZ2lzdGVyIGNsb2NrXG4iKTsKKwkvKiBjbG9jayBzb3VyY2UgcmF0ZSBjb3VsZCBub3QgZ2V0IGRldGVybWluZWQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBjNTEyeF9jYW5fcHV0X2Nsb2NrKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQoreworCXN0cnVjdCBtc2Nhbl9wcml2ICpwcml2OworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldikpOworCWlmIChwcml2LT5jbGtfaXBnKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrX2lwZyk7CiB9CiAjZWxzZSAvKiAhQ09ORklHX1BQQ19NUEM1MTJ4ICovCiBzdGF0aWMgdTMyIG1wYzUxMnhfY2FuX2dldF9jbG9jayhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldiwKQEAgLTI0NCw2ICsyNzksNyBAQAogewogCXJldHVybiAwOwogfQorI2RlZmluZSBtcGM1MTJ4X2Nhbl9wdXRfY2xvY2sgTlVMTAogI2VuZGlmIC8qIENPTkZJR19QUENfTVBDNTEyeCAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1eHh4X2Nhbl90YWJsZVtdOwpAQCAtMzg1LDExICs0MjEsMTMgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjNXh4eF9jYW5fZGF0YSBtcGM1MjAwX2Nhbl9kYXRhID0gewogCS50eXBlID0gTVNDQU5fVFlQRV9NUEM1MjAwLAogCS5nZXRfY2xvY2sgPSBtcGM1Mnh4X2Nhbl9nZXRfY2xvY2ssCisJLyogLnB1dF9jbG9jayBub3QgYXBwbGljYWJsZSAqLwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtcGM1eHh4X2Nhbl9kYXRhIG1wYzUxMjFfY2FuX2RhdGEgPSB7CiAJLnR5cGUgPSBNU0NBTl9UWVBFX01QQzUxMjEsCiAJLmdldF9jbG9jayA9IG1wYzUxMnhfY2FuX2dldF9jbG9jaywKKwkucHV0X2Nsb2NrID0gbXBjNTEyeF9jYW5fcHV0X2Nsb2NrLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNXh4eF9jYW5fdGFibGVbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi92Y2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vdmNhbi5jCmluZGV4IDBhMmE1ZWUuLjRlOTQwNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi92Y2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3ZjYW4uYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9za2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogCkBAIC0xMDksMjUgKzExMCwyMyBAQAogCQkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAkJCXN0YXRzLT5yeF9ieXRlcyArPSBjZmQtPmxlbjsKIAkJfQotCQlrZnJlZV9za2Ioc2tiKTsKKwkJY29uc3VtZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKIAkvKiBwZXJmb3JtIHN0YW5kYXJkIGVjaG8gaGFuZGxpbmcgZm9yIENBTiBuZXR3b3JrIGludGVyZmFjZXMgKi8KIAogCWlmIChsb29wKSB7Ci0JCXN0cnVjdCBzb2NrICpzcmNzayA9IHNrYi0+c2s7CiAKLQkJc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7CisJCXNrYiA9IGNhbl9jcmVhdGVfZWNob19za2Ioc2tiKTsKIAkJaWYgKCFza2IpCiAJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCiAJCS8qIHJlY2VpdmUgd2l0aCBwYWNrZXQgY291bnRpbmcgKi8KLQkJc2tiLT5zayA9IHNyY3NrOwogCQl2Y2FuX3J4KHNrYiwgZGV2KTsKIAl9IGVsc2UgewogCQkvKiBubyBsb29wZWQgcGFja2V0cyA9PiBubyBjb3VudGluZyAqLwotCQlrZnJlZV9za2Ioc2tiKTsKKwkJY29uc3VtZV9za2Ioc2tiKTsKIAl9CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYwppbmRleCAwZjQyNDFjLi4yMzhjY2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jCkBAIC0zMjk0LDcgKzMyOTQsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2Vpc2FfY2xlYW51cCh2b2lkKQogewotCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnA7CiAJdm9pZCBfX2lvbWVtICppb2FkZHI7CiAKICNpZmRlZiBDT05GSUdfRUlTQQpAQCAtMzMwMyw3ICszMzAyLDYgQEAKICNlbmRpZgogCiAJaWYgKGNvbXBhcV9uZXRfZGV2aWNlKSB7Ci0JCXZwID0gbmV0ZGV2X3ByaXYoY29tcGFxX25ldF9kZXZpY2UpOwogCQlpb2FkZHIgPSBpb3BvcnRfbWFwKGNvbXBhcV9uZXRfZGV2aWNlLT5iYXNlX2FkZHIsCiAJCSAgICAgICAgICAgICAgICAgICAgVk9SVEVYX1RPVEFMX1NJWkUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2FwbmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvYXBuZS5jCmluZGV4IDgxMWZhNWQuLjMwMTA0YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvYXBuZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvYXBuZS5jCkBAIC0yMTIsNyArMjEyLDYgQEAKICAgICBpbnQgbmVYMDAwLCBjdHJvbjsKICNlbmRpZgogICAgIHN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0gICAgc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAgICAgaWYgKChhcG5lX21zZ19lbmFibGUgJiBORVRJRl9NU0dfRFJWKSAmJiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkpCiAJCW5ldGRldl9pbmZvKGRldiwgdmVyc2lvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbGx3aW5uZXIvc3VuNGktZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWxsd2lubmVyL3N1bjRpLWVtYWMuYwppbmRleCAwY2MyMTQzLi41MTFmNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbGx3aW5uZXIvc3VuNGktZW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FsbHdpbm5lci9zdW40aS1lbWFjLmMKQEAgLTkyOSw2ICs5MjksOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlbWFjX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtZW1hYyIsfSwKKworCS8qIERlcHJlY2F0ZWQgKi8KIAl7LmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWVtYWMiLH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCmluZGV4IGU5MmZmZDYuLjJlNDVmNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKQEAgLTEyOTIsNiArMTI5Miw3IEBACiAJYWx4ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmYWx4LT5ody5tZGlvX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhbHgtPmlycV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWx4LT5zdGF0c19sb2NrKTsKIAlhbHgtPmRldiA9IG5ldGRldjsKIAlhbHgtPmh3LnBkZXYgPSBwZGV2OwogCWFseC0+bXNnX2VuYWJsZSA9IE5FVElGX01TR19MSU5LIHwgTkVUSUZfTVNHX0hXIHwgTkVUSUZfTVNHX0lGVVAgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCmluZGV4IDlkMmRlZGEuLmNkYTI1YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAogc3RhdGljIGludCBkaXNhYmxlX21zaSA9IDA7CiAKLW1vZHVsZV9wYXJhbShkaXNhYmxlX21zaSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkaXNhYmxlX21zaSwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9tc2ksICJEaXNhYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpIik7CiAKIHR5cGVkZWYgZW51bSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCmluZGV4IDE3ZDE2ODkuLmJmYzU4ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCkBAIC05MzYsNyArOTM2LDcgQEAKIAllbHNlIC8qIENISVBfSVNfRTFYICovCiAJCXN0YXJ0X3BhcmFtcy0+bmV0d29ya19jb3NfbW9kZSA9IEZXX1dSUjsKIAotCXN0YXJ0X3BhcmFtcy0+Z3JlX3R1bm5lbF9tb2RlID0gSVBHUkVfVFVOTkVMOworCXN0YXJ0X3BhcmFtcy0+Z3JlX3R1bm5lbF9tb2RlID0gTDJHUkVfVFVOTkVMOwogCXN0YXJ0X3BhcmFtcy0+Z3JlX3R1bm5lbF9yc3MgPSBHUkVfSU5ORVJfSEVBREVSU19SU1M7CiAKIAlyZXR1cm4gYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2UoYnAsICZmdW5jX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMKaW5kZXggOTJhNDY3Zi4uMzhmYzc5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2V0aHRvb2wuYwpAQCAtMzU4LDQ5ICszNTgsNDcgQEAKIAogCWNmZ19pZHggPSBibngyeF9nZXRfbGlua19jZmdfaWR4KGJwKTsKIAlvbGRfbXVsdGlfcGh5X2NvbmZpZyA9IGJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnOwotCXN3aXRjaCAoY21kLT5wb3J0KSB7Ci0JY2FzZSBQT1JUX1RQOgotCQlpZiAoYnAtPnBvcnQuc3VwcG9ydGVkW2NmZ19pZHhdICYgU1VQUE9SVEVEX1RQKQotCQkJYnJlYWs7IC8qIG5vIHBvcnQgY2hhbmdlICovCi0KLQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkWzBdICYgU1VQUE9SVEVEX1RQIHx8Ci0JCSAgICAgIGJwLT5wb3J0LnN1cHBvcnRlZFsxXSAmIFNVUFBPUlRFRF9UUCkpIHsKKwlpZiAoY21kLT5wb3J0ICE9IGJueDJ4X2dldF9wb3J0X3R5cGUoYnApKSB7CisJCXN3aXRjaCAoY21kLT5wb3J0KSB7CisJCWNhc2UgUE9SVF9UUDoKKwkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZFswXSAmIFNVUFBPUlRFRF9UUCB8fAorCQkJICAgICAgYnAtPnBvcnQuc3VwcG9ydGVkWzFdICYgU1VQUE9SVEVEX1RQKSkgeworCQkJCURQKEJOWDJYX01TR19FVEhUT09MLAorCQkJCSAgICJVbnN1cHBvcnRlZCBwb3J0IHR5cGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnAtPmxpbmtfcGFyYW1zLm11bHRpX3BoeV9jb25maWcgJj0KKwkJCQl+UE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9NQVNLOworCQkJaWYgKGJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnICYKKwkJCSAgICBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9FTkFCTEVEKQorCQkJCWJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnIHw9CisJCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZOworCQkJZWxzZQorCQkJCWJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnIHw9CisJCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9GSVJTVF9QSFk7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0ZJQlJFOgorCQljYXNlIFBPUlRfREE6CisJCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWRbMF0gJiBTVVBQT1JURURfRklCUkUgfHwKKwkJCSAgICAgIGJwLT5wb3J0LnN1cHBvcnRlZFsxXSAmIFNVUFBPUlRFRF9GSUJSRSkpIHsKKwkJCQlEUChCTlgyWF9NU0dfRVRIVE9PTCwKKwkJCQkgICAiVW5zdXBwb3J0ZWQgcG9ydCB0eXBlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnICY9CisJCQkJflBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fTUFTSzsKKwkJCWlmIChicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyAmCisJCQkgICAgUE9SVF9IV19DRkdfUEhZX1NXQVBQRURfRU5BQkxFRCkKKwkJCQlicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyB8PQorCQkJCVBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZOworCQkJZWxzZQorCQkJCWJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnIHw9CisJCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlEUChCTlgyWF9NU0dfRVRIVE9PTCwgIlVuc3VwcG9ydGVkIHBvcnQgdHlwZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyAmPQotCQkJflBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fTUFTSzsKLQkJaWYgKGJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnICYKLQkJICAgIFBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX0VOQUJMRUQpCi0JCQlicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyB8PQotCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZOwotCQllbHNlCi0JCQlicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyB8PQotCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9GSVJTVF9QSFk7Ci0JCWJyZWFrOwotCWNhc2UgUE9SVF9GSUJSRToKLQljYXNlIFBPUlRfREE6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWRbY2ZnX2lkeF0gJiBTVVBQT1JURURfRklCUkUpCi0JCQlicmVhazsgLyogbm8gcG9ydCBjaGFuZ2UgKi8KLQotCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWRbMF0gJiBTVVBQT1JURURfRklCUkUgfHwKLQkJICAgICAgYnAtPnBvcnQuc3VwcG9ydGVkWzFdICYgU1VQUE9SVEVEX0ZJQlJFKSkgewotCQkJRFAoQk5YMlhfTVNHX0VUSFRPT0wsICJVbnN1cHBvcnRlZCBwb3J0IHR5cGVcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnAtPmxpbmtfcGFyYW1zLm11bHRpX3BoeV9jb25maWcgJj0KLQkJCX5QT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX01BU0s7Ci0JCWlmIChicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyAmCi0JCSAgICBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9FTkFCTEVEKQotCQkJYnAtPmxpbmtfcGFyYW1zLm11bHRpX3BoeV9jb25maWcgfD0KLQkJCVBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZOwotCQllbHNlCi0JCQlicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyB8PQotCQkJUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEUChCTlgyWF9NU0dfRVRIVE9PTCwgIlVuc3VwcG9ydGVkIHBvcnQgdHlwZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBTYXZlIG5ldyBjb25maWcgaW4gY2FzZSBjb21tYW5kIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSAqLwogCW5ld19tdWx0aV9waHlfY29uZmlnID0gYnAtPmxpbmtfcGFyYW1zLm11bHRpX3BoeV9jb25maWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggZTExOGEzZS4uN2Q0MzgyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYwpAQCAtOTUsMjkgKzk1LDI5IEBACiBNT0RVTEVfRklSTVdBUkUoRldfRklMRV9OQU1FX0UyKTsKIAogaW50IGJueDJ4X251bV9xdWV1ZXM7Ci1tb2R1bGVfcGFyYW1fbmFtZWQobnVtX3F1ZXVlcywgYm54MnhfbnVtX3F1ZXVlcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChudW1fcXVldWVzLCBibngyeF9udW1fcXVldWVzLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhudW1fcXVldWVzLAogCQkgIiBTZXQgbnVtYmVyIG9mIHF1ZXVlcyAoZGVmYXVsdCBpcyBhcyBhIG51bWJlciBvZiBDUFVzKSIpOwogCiBzdGF0aWMgaW50IGRpc2FibGVfdHBhOwotbW9kdWxlX3BhcmFtKGRpc2FibGVfdHBhLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRpc2FibGVfdHBhLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX3RwYSwgIiBEaXNhYmxlIHRoZSBUUEEgKExSTykgZmVhdHVyZSIpOwogCiBzdGF0aWMgaW50IGludF9tb2RlOwotbW9kdWxlX3BhcmFtKGludF9tb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGludF9tb2RlLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhpbnRfbW9kZSwgIiBGb3JjZSBpbnRlcnJ1cHQgbW9kZSBvdGhlciB0aGFuIE1TSS1YICIKIAkJCQkiKDEgSU5UI3g7IDIgTVNJKSIpOwogCiBzdGF0aWMgaW50IGRyb3BsZXNzX2ZjOwotbW9kdWxlX3BhcmFtKGRyb3BsZXNzX2ZjLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRyb3BsZXNzX2ZjLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkcm9wbGVzc19mYywgIiBQYXVzZSBvbiBleGhhdXN0ZWQgaG9zdCByaW5nIik7CiAKIHN0YXRpYyBpbnQgbXJycyA9IC0xOwotbW9kdWxlX3BhcmFtKG1ycnMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXJycywgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobXJycywgIiBGb3JjZSBNYXggUmVhZCBSZXEgU2l6ZSAoMC4uMykgKGZvciBkZWJ1ZykiKTsKIAogc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIgRGVmYXVsdCBkZWJ1ZyBtc2dsZXZlbCIpOwogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYm54Mnhfd3E7CkBAIC0xMzEwMiw5ICsxMzEwMiw5IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZwZGV2LT5lbmFibGVfY250KSA9PSAxKQogCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLQl9CiAKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYwppbmRleCBhZWM1ZWYyLi5lNDJmNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKQEAgLTE0NDYsMTIgKzE0NDYsMTIgQEAKIAlpZiAodmYtPmNmZ19mbGFncyAmIFZGX0NGR19JTlRfU0lNRCkKIAkJdmFsIHw9IElHVV9WRl9DT05GX1NJTkdMRV9JU1JfRU47CiAJdmFsICY9IH5JR1VfVkZfQ09ORl9QQVJFTlRfTUFTSzsKLQl2YWwgfD0gQlBfRlVOQyhicCkgPDwgSUdVX1ZGX0NPTkZfUEFSRU5UX1NISUZUOwkvKiBwYXJlbnQgUEYgKi8KKwl2YWwgfD0gKEJQX0FCU19GVU5DKGJwKSA+PiAxKSA8PCBJR1VfVkZfQ09ORl9QQVJFTlRfU0hJRlQ7CiAJUkVHX1dSKGJwLCBJR1VfUkVHX1ZGX0NPTkZJR1VSQVRJT04sIHZhbCk7CiAKIAlEUChCTlgyWF9NU0dfSU9WLAotCSAgICJ2YWx1ZSBpbiBJR1VfUkVHX1ZGX0NPTkZJR1VSQVRJT04gb2YgdmYgJWQgYWZ0ZXIgd3JpdGUgJXhcbiIsCi0JICAgdmYtPmFic192ZmlkLCBSRUdfUkQoYnAsIElHVV9SRUdfVkZfQ09ORklHVVJBVElPTikpOworCSAgICJ2YWx1ZSBpbiBJR1VfUkVHX1ZGX0NPTkZJR1VSQVRJT04gb2YgdmYgJWQgYWZ0ZXIgd3JpdGUgaXMgMHglMDh4XG4iLAorCSAgIHZmLT5hYnNfdmZpZCwgdmFsKTsKIAogCWJueDJ4X3ByZXRlbmRfZnVuYyhicCwgQlBfQUJTX0ZVTkMoYnApKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwppbmRleCBlMmNhMDNlLi4zMTY3ZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwpAQCAtMjYwOSwxMyArMjYwOSwxNCBAQAogCiAJdGczX3dyaXRlcGh5KHRwLCBNSUlfQ1RSTDEwMDAsIHBoeTlfb3JpZyk7CiAKLQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcmVnMzIpKSB7Ci0JCXJlZzMyICY9IH4weDMwMDA7Ci0JCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOwotCX0gZWxzZSBpZiAoIWVycikKLQkJZXJyID0gLUVCVVNZOworCWVyciA9IHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcmVnMzIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gZXJyOworCXJlZzMyICY9IH4weDMwMDA7CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCByZWczMik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdGczX2NhcnJpZXJfb2ZmKHN0cnVjdCB0ZzMgKnRwKQpAQCAtMTQxMTMsMTIgKzE0MTE0LDEyIEBACiAKIAl0ZzNfbmV0aWZfc3RvcCh0cCk7CiAKKwl0ZzNfc2V0X210dShkZXYsIHRwLCBuZXdfbXR1KTsKKwogCXRnM19mdWxsX2xvY2sodHAsIDEpOwogCiAJdGczX2hhbHQodHAsIFJFU0VUX0tJTkRfU0hVVERPV04sIDEpOwogCi0JdGczX3NldF9tdHUoZGV2LCB0cCwgbmV3X210dSk7Ci0KIAkvKiBSZXNldCBQSFksIG90aGVyd2lzZSB0aGUgcmVhZCBETUEgZW5naW5lIHdpbGwgYmUgaW4gYSBtb2RlIHRoYXQKIAkgKiBicmVha3MgYWxsIHJlcXVlc3RzIHRvIDI1NiBieXRlcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCmluZGV4IDRkZThjZmQuLjU1ZTBmYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTUxLDYgKzUyLDcgQEAKICNkZWZpbmUJRVRIX0hBU0gwCTB4NDgKICNkZWZpbmUJRVRIX0hBU0gxCTB4NGMKICNkZWZpbmUJRVRIX1RYQ1RSTAkweDUwCisjZGVmaW5lCUVUSF9FTkQJCTB4NTQKIAogLyogbW9kZSByZWdpc3RlciAqLwogI2RlZmluZQlNT0RFUl9SWEVOCSgxIDw8ICAwKSAvKiByZWNlaXZlIGVuYWJsZSAqLwpAQCAtMTc5LDYgKzE4MSw3IEBACiAgKiBAbWVtYmFzZToJcG9pbnRlciB0byBidWZmZXIgbWVtb3J5IHJlZ2lvbgogICogQGRtYV9hbGxvYzoJZG1hIGFsbG9jYXRlZCBidWZmZXIgc2l6ZQogICogQGlvX3JlZ2lvbl9zaXplOglJL08gbWVtb3J5IHJlZ2lvbiBzaXplCisgKiBAbnVtX2JkOgludW1iZXIgb2YgYnVmZmVyIGRlc2NyaXB0b3JzCiAgKiBAbnVtX3R4OgludW1iZXIgb2Ygc2VuZCBidWZmZXJzCiAgKiBAY3VyX3R4OglsYXN0IHNlbmQgYnVmZmVyIHdyaXR0ZW4KICAqIEBkdHlfdHg6CWxhc3QgYnVmZmVyIGFjdHVhbGx5IHNlbnQKQEAgLTE5OSw2ICsyMDIsNyBAQAogCWludCBkbWFfYWxsb2M7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvX3JlZ2lvbl9zaXplOwogCisJdW5zaWduZWQgaW50IG51bV9iZDsKIAl1bnNpZ25lZCBpbnQgbnVtX3R4OwogCXVuc2lnbmVkIGludCBjdXJfdHg7CiAJdW5zaWduZWQgaW50IGR0eV90eDsKQEAgLTIxNiw2ICsyMjAsNyBAQAogCiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeTsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWRpbzsKKwlzdHJ1Y3QgY2xrICpjbGs7CiAJczggcGh5X2lkOwogfTsKIApAQCAtNjg4LDYgKzY5MywxMSBAQAogCX0KIAogCXByaXYtPnBoeSA9IHBoeTsKKwlwaHktPmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgICAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKTsKKwlwaHktPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04OTAsNiArOTAwLDEwMiBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKK3N0YXRpYyBpbnQgZXRob2NfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeTsKKworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgZXRob2Nfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeTsKKworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgZXRob2NfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEVUSF9FTkQ7Cit9CisKK3N0YXRpYyB2b2lkIGV0aG9jX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgICB2b2lkICpwKQoreworCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyICpyZWdzX2J1ZmYgPSBwOworCXVuc2lnbmVkIGk7CisKKwlyZWdzLT52ZXJzaW9uID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0VORCAvIHNpemVvZih1MzIpOyArK2kpCisJCXJlZ3NfYnVmZltpXSA9IGV0aG9jX3JlYWQocHJpdiwgaSAqIHNpemVvZih1MzIpKTsKK30KKworc3RhdGljIHZvaWQgZXRob2NfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgZXRob2MgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBwcml2LT5udW1fYmQgLSAxOworCXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IHByaXYtPm51bV9iZCAtIDE7CisKKwlyaW5nLT5yeF9wZW5kaW5nID0gcHJpdi0+bnVtX3J4OworCXJpbmctPnJ4X21pbmlfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IDA7CisJcmluZy0+dHhfcGVuZGluZyA9IHByaXYtPm51bV90eDsKK30KKworc3RhdGljIGludCBldGhvY19zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocmluZy0+dHhfcGVuZGluZyA8IDEgfHwgcmluZy0+cnhfcGVuZGluZyA8IDEgfHwKKwkgICAgcmluZy0+dHhfcGVuZGluZyArIHJpbmctPnJ4X3BlbmRpbmcgPiBwcml2LT5udW1fYmQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyaW5nLT5yeF9taW5pX3BlbmRpbmcgfHwgcmluZy0+cnhfanVtYm9fcGVuZGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCW5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKKwkJZXRob2NfZGlzYWJsZV9yeF9hbmRfdHgocHJpdik7CisJCWV0aG9jX2Rpc2FibGVfaXJxKHByaXYsIElOVF9NQVNLX1RYIHwgSU5UX01BU0tfUlgpOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCX0KKworCXByaXYtPm51bV90eCA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKHJpbmctPnR4X3BlbmRpbmcpOworCXByaXYtPm51bV9yeCA9IHJpbmctPnJ4X3BlbmRpbmc7CisJZXRob2NfaW5pdF9yaW5nKHByaXYsIGRldi0+bWVtX3N0YXJ0KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXRob2NfZW5hYmxlX2lycShwcml2LCBJTlRfTUFTS19UWCB8IElOVF9NQVNLX1JYKTsKKwkJZXRob2NfZW5hYmxlX3J4X2FuZF90eChwcml2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGV0aG9jX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBldGhvY19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGV0aG9jX3NldF9zZXR0aW5ncywKKwkuZ2V0X3JlZ3NfbGVuID0gZXRob2NfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncyA9IGV0aG9jX2dldF9yZWdzLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9yaW5ncGFyYW0gPSBldGhvY19nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtID0gZXRob2Nfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3RzX2luZm8gPSBldGh0b29sX29wX2dldF90c19pbmZvLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBldGhvY19uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbiA9IGV0aG9jX29wZW4sCiAJLm5kb19zdG9wID0gZXRob2Nfc3RvcCwKQEAgLTkxNyw2ICsxMDIzLDggQEAKIAlpbnQgbnVtX2JkOwogCWludCByZXQgPSAwOwogCWJvb2wgcmFuZG9tX21hYyA9IGZhbHNlOworCXN0cnVjdCBldGhvY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJdTMyIGV0aF9jbGtmcmVxID0gcGRhdGEgPyBwZGF0YS0+ZXRoX2Nsa2ZyZXEgOiAwOwogCiAJLyogYWxsb2NhdGUgbmV0d29ya2luZyBkZXZpY2UgKi8KIAluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGV0aG9jKSk7CkBAIC0xMDE2LDYgKzExMjQsNyBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KKwlwcml2LT5udW1fYmQgPSBudW1fYmQ7CiAJLyogbnVtX3R4IG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KIAlwcml2LT5udW1fdHggPSByb3VuZGRvd25fcG93X29mX3R3byhudW1fYmQgPj4gMSk7CiAJcHJpdi0+bnVtX3J4ID0gbnVtX2JkIC0gcHJpdi0+bnVtX3R4OwpAQCAtMTAzMCw4ICsxMTM5LDcgQEAKIAl9CiAKIAkvKiBBbGxvdyB0aGUgcGxhdGZvcm0gc2V0dXAgY29kZSB0byBwYXNzIGluIGEgTUFDIGFkZHJlc3MuICovCi0JaWYgKGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldikpIHsKLQkJc3RydWN0IGV0aG9jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAocGRhdGEpIHsKIAkJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIHBkYXRhLT5od2FkZHIsIElGSFdBRERSTEVOKTsKIAkJcHJpdi0+cGh5X2lkID0gcGRhdGEtPnBoeV9pZDsKIAl9IGVsc2UgewpAQCAtMTA2OSw2ICsxMTc3LDI3IEBACiAJaWYgKHJhbmRvbV9tYWMpCiAJCW5ldGRldi0+YWRkcl9hc3NpZ25fdHlwZSA9IE5FVF9BRERSX1JBTkRPTTsKIAorCS8qIEFsbG93IHRoZSBwbGF0Zm9ybSBzZXR1cCBjb2RlIHRvIGFkanVzdCBNSUkgbWFuYWdlbWVudCBidXMgY2xvY2suICovCisJaWYgKCFldGhfY2xrZnJlcSkgeworCQlzdHJ1Y3QgY2xrICpjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisKKwkJaWYgKCFJU19FUlIoY2xrKSkgeworCQkJcHJpdi0+Y2xrID0gY2xrOworCQkJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CisJCQlldGhfY2xrZnJlcSA9IGNsa19nZXRfcmF0ZShjbGspOworCQl9CisJfQorCWlmIChldGhfY2xrZnJlcSkgeworCQl1MzIgY2xrZGl2ID0gTUlJTU9ERVJfQ0xLRElWKGV0aF9jbGtmcmVxIC8gMjUwMDAwMCArIDEpOworCisJCWlmICghY2xrZGl2KQorCQkJY2xrZGl2ID0gMjsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAic2V0dGluZyBNSUkgY2xrZGl2IHRvICV1XG4iLCBjbGtkaXYpOworCQlldGhvY193cml0ZShwcml2LCBNSUlNT0RFUiwKKwkJCSAgICAoZXRob2NfcmVhZChwcml2LCBNSUlNT0RFUikgJiBNSUlNT0RFUl9OT1BSRSkgfAorCQkJICAgIGNsa2Rpdik7CisJfQorCiAJLyogcmVnaXN0ZXIgTUlJIGJ1cyAqLwogCXByaXYtPm1kaW8gPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKCFwcml2LT5tZGlvKSB7CkBAIC0xMTExLDYgKzEyNDAsNyBAQAogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZldGhvY19uZXRkZXZfb3BzOwogCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBFVEhPQ19USU1FT1VUOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gMDsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmV0aG9jX2V0aHRvb2xfb3BzOwogCiAJLyogc2V0dXAgTkFQSSAqLwogCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnByaXYtPm5hcGksIGV0aG9jX3BvbGwsIDY0KTsKQEAgLTExMzMsNiArMTI2Myw4IEBACiAJa2ZyZWUocHJpdi0+bWRpby0+aXJxKTsKIAltZGlvYnVzX2ZyZWUocHJpdi0+bWRpbyk7CiBmcmVlOgorCWlmIChwcml2LT5jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTExNTcsNiArMTI4OSw4IEBACiAJCQlrZnJlZShwcml2LT5tZGlvLT5pcnEpOwogCQkJbWRpb2J1c19mcmVlKHByaXYtPm1kaW8pOwogCQl9CisJCWlmIChwcml2LT5jbGspCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKaW5kZXggY2JhYmE0NC4uYmY3YTAxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYwpAQCAtMzAzNCw3ICszMDM0LDcgQEAKIAkJKmVuYWJsZV93YWtlID0gZmFsc2U7CiAJfQogCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CiB9CiAKIHN0YXRpYyBpbnQgX19lMTAwX3Bvd2VyX29mZihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgYm9vbCB3YWtlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKaW5kZXggYTRiOTQwOC4uYjkwMTM3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCkBAIC00NDQwLDkgKzQ0NDAsMTAgQEAKIAkvKiBDaGVjayBpZiBBUFAgVGFibGUgaGFzIGNoYW5nZWQgKi8KIAlpZiAobWVtY21wKCZuZXdfY2ZnLT5hcHAsCiAJCSAgICZvbGRfY2ZnLT5hcHAsCi0JCSAgIHNpemVvZihuZXdfY2ZnLT5hcHApKSkKKwkJICAgc2l6ZW9mKG5ld19jZmctPmFwcCkpKSB7CiAJCW5lZWRfcmVjb25maWcgPSB0cnVlOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFQUCBUYWJsZSBjaGFuZ2UgZGV0ZWN0ZWQuXG4iKTsKKwl9CiAKIAlyZXR1cm4gbmVlZF9yZWNvbmZpZzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKaW5kZXggNjUwOTkzNS4uNTVhMzdhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKQEAgLTUwMjAsNiArNTAyMCw4IEBACiAJCX0KICAJfQogCisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmaHctPm5hcGksIHNreTJfcG9sbCwgTkFQSV9XRUlHSFQpOworCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CkBAIC01MDI4LDggKzUwMzAsNiBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAotCW5ldGlmX25hcGlfYWRkKGRldiwgJmh3LT5uYXBpLCBza3kyX3BvbGwsIE5BUElfV0VJR0hUKTsKLQogCXNreTJfc2hvd19hZGRyKGRldik7CiAKIAlpZiAoaHctPnBvcnRzID4gMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKaW5kZXggMWRlZDUwY2EuLmU0NmU4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYwpAQCAtNzI2LDkgKzcyNiw2IEBACiAJaW50IHZwYXRoX2lkeCA9IDA7CiAJZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOwogCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aCA9IE5VTEw7Ci0Jc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmhsZGV2OwotCi0JaGxkZXYgPSBwY2lfZ2V0X2RydmRhdGEodmRldi0+cGRldik7CiAKIAltYWNfYWRkcmVzcyA9ICh1OCAqKSZtYWNfYWRkcjsKIAltZW1jcHkobWFjX2FkZHJlc3MsIG1hY19oZWFkZXIsIEVUSF9BTEVOKTsKQEAgLTI0NDMsOSArMjQ0MCw2IEBACiAKIHN0YXRpYyB2b2lkIHZ4Z2VfcmVtX2lzcihzdHJ1Y3QgdnhnZWRldiAqdmRldikKIHsKLQlzdHJ1Y3QgX192eGdlX2h3X2RldmljZSAqaGxkZXY7Ci0JaGxkZXYgPSBwY2lfZ2V0X2RydmRhdGEodmRldi0+cGRldik7Ci0KICNpZmRlZiBDT05GSUdfUENJX01TSQogCWlmICh2ZGV2LT5jb25maWcuaW50cl90eXBlID09IE1TSV9YKSB7CiAJCXZ4Z2VfcmVtX21zaXhfaXNyKHZkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2lvLmMKaW5kZXggMzA4NzRjZC4uNTRlYmYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19pby5jCkBAIC02ODMsMTIgKzY4MywxNyBAQAogCQlhZGFwdGVyLT5haHctPmxpbmt1cCA9IDA7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAJfSBlbHNlIGlmICghYWRhcHRlci0+YWh3LT5saW5rdXAgJiYgbGlua3VwKSB7Ci0JCS8qIERvIG5vdCBhZHZlcnRpc2UgTGluayB1cCBpZiB0aGUgcG9ydCBpcyBpbiBsb29wYmFjayBtb2RlICovCi0JCWlmIChxbGNuaWNfODN4eF9jaGVjayhhZGFwdGVyKSAmJiBhZGFwdGVyLT5haHctPmxiX21vZGUpCisJCWFkYXB0ZXItPmFody0+bGlua3VwID0gMTsKKworCQkvKiBEbyBub3QgYWR2ZXJ0aXNlIExpbmsgdXAgdG8gdGhlIHN0YWNrIGlmIGRldmljZQorCQkgKiBpcyBpbiBsb29wYmFjayBtb2RlCisJCSAqLworCQlpZiAocWxjbmljXzgzeHhfY2hlY2soYWRhcHRlcikgJiYgYWRhcHRlci0+YWh3LT5sYl9tb2RlKSB7CisJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJOSUMgTGluayBpcyB1cCBmb3IgbG9vcGJhY2sgdGVzdFxuIik7CiAJCQlyZXR1cm47CisJCX0KIAogCQluZXRkZXZfaW5mbyhuZXRkZXYsICJOSUMgTGluayBpcyB1cFxuIik7Ci0JCWFkYXB0ZXItPmFody0+bGlua3VwID0gMTsKIAkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwogCX0KIH0KQEAgLTExNTAsMTMgKzExNTUsMTMgQEAKIAl1MTYgbHJvX2xlbmd0aCwgbGVuZ3RoLCBkYXRhX29mZnNldCwgdF92aWQsIHZpZCA9IDB4ZmZmZjsKIAl1MzIgc2VxX251bWJlcjsKIAotCWlmICh1bmxpa2VseShyaW5nID4gYWRhcHRlci0+bWF4X3Jkc19yaW5ncykpCisJaWYgKHVubGlrZWx5KHJpbmcgPj0gYWRhcHRlci0+bWF4X3Jkc19yaW5ncykpCiAJCXJldHVybiBOVUxMOwogCiAJcmRzX3JpbmcgPSAmcmVjdl9jdHgtPnJkc19yaW5nc1tyaW5nXTsKIAogCWluZGV4ID0gcWxjbmljX2dldF9scm9fc3RzX3JlZmhhbmRsZShzdHNfZGF0YTApOwotCWlmICh1bmxpa2VseShpbmRleCA+IHJkc19yaW5nLT5udW1fZGVzYykpCisJaWYgKHVubGlrZWx5KGluZGV4ID49IHJkc19yaW5nLT5udW1fZGVzYykpCiAJCXJldHVybiBOVUxMOwogCiAJYnVmZmVyID0gJnJkc19yaW5nLT5yeF9idWZfYXJyW2luZGV4XTsKQEAgLTE2NjIsMTMgKzE2NjcsMTMgQEAKIAl1MTYgdmlkID0gMHhmZmZmOwogCWludCBlcnI7CiAKLQlpZiAodW5saWtlbHkocmluZyA+IGFkYXB0ZXItPm1heF9yZHNfcmluZ3MpKQorCWlmICh1bmxpa2VseShyaW5nID49IGFkYXB0ZXItPm1heF9yZHNfcmluZ3MpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJkc19yaW5nID0gJnJlY3ZfY3R4LT5yZHNfcmluZ3NbcmluZ107CiAKIAlpbmRleCA9IHFsY25pY184M3h4X2huZGwoc3RzX2RhdGFbMF0pOwotCWlmICh1bmxpa2VseShpbmRleCA+IHJkc19yaW5nLT5udW1fZGVzYykpCisJaWYgKHVubGlrZWx5KGluZGV4ID49IHJkc19yaW5nLT5udW1fZGVzYykpCiAJCXJldHVybiBOVUxMOwogCiAJYnVmZmVyID0gJnJkc19yaW5nLT5yeF9idWZfYXJyW2luZGV4XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwppbmRleCAxZjc5ZDQ3Li5iYTc4Yzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCkBAIC0xODM3LDYgKzE4MzcsNyBAQAogCXFsY25pY19saW5rZXZlbnRfcmVxdWVzdChhZGFwdGVyLCAxKTsKIAogCWFkYXB0ZXItPmFody0+cmVzZXRfY29udGV4dCA9IDA7CisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzA0LDE0ICsyNzA1LDggQEAKIAogCWVyciA9IF9fcWxjbmljX3VwKGFkYXB0ZXIsIG5ldGRldik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfb3V0OworCQlxbGNuaWNfZGV0YWNoKGFkYXB0ZXIpOwogCi0JbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JcWxjbmljX2RldGFjaChhZGFwdGVyKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCmluZGV4IDE3YTFjYTIuLjA2MzhjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCkBAIC00NDgsOCArNDQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfZ2V0X3ZmX2FjbChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgc3RydWN0IHFsY25pY19pbmZvICppbmZvKQorc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfZ2V0X3ZmX2FjbChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHFsY25pY19zcmlvdiAqc3Jpb3YgPSBhZGFwdGVyLT5haHctPnNyaW92OwogCXN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgY21kOwpAQCAtNDk1LDEwICs0OTQsNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiAtRUlPOwogCi0JZXJyID0gcWxjbmljX3NyaW92X2dldF92Zl9hY2woYWRhcHRlciwgJm5pY19pbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJaWYgKHFsY25pY184M3h4X2dldF9wb3J0X2luZm8oYWRhcHRlcikpCiAJCXJldHVybiAtRUlPOwogCkBAIC01NTUsNiArNTUwLDEwIEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0X3NlbmRfY2hhbm5lbF90ZXJtOwogCisJZXJyID0gcWxjbmljX3NyaW92X2dldF92Zl9hY2woYWRhcHRlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3NlbmRfY2hhbm5lbF90ZXJtOworCiAJZXJyID0gcWxjbmljX3NldHVwX25ldGRldihhZGFwdGVyLCBhZGFwdGVyLT5uZXRkZXYsIHBjaV91c2luZ19kYWMpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF9zZW5kX2NoYW5uZWxfdGVybTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy90eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3R4LmMKaW5kZXggYzQ5ZDFmYi4uNzVkMTFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3R4LmMKQEAgLTQyOSw3ICs0MjksOSBAQAogCX0KIAogCS8qIFRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgc2tiIHRvIHRoZSBmaW5hbCBidWZmZXIgKi8KKyNpZmRlZiBFRlhfVVNFX1BJTwogZmluaXNoX3BhY2tldDoKKyNlbmRpZgogCWJ1ZmZlci0+c2tiID0gc2tiOwogCWJ1ZmZlci0+ZmxhZ3MgPSBFRlhfVFhfQlVGX1NLQiB8IGRtYV9mbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tYWluLmMKaW5kZXggZDkzYWE4Ny4uYTJlN2QyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWFpbi5jCkBAIC0xNTI0LDkgKzE1MjQsOSBAQAogCQkJCQkgICAgIHByaXYtPmRldi0+ZGV2X2FkZHIsIDApOwogCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+ZGV2LT5kZXZfYWRkcikpCiAJCQlldGhfaHdfYWRkcl9yYW5kb20ocHJpdi0+ZGV2KTsKKwkJcHJfaW5mbygiJXM6IGRldmljZSBNQUMgYWRkcmVzcyAlcE1cbiIsIHByaXYtPmRldi0+bmFtZSwKKwkJCXByaXYtPmRldi0+ZGV2X2FkZHIpOwogCX0KLQlwcl93YXJuKCIlczogZGV2aWNlIE1BQyBhZGRyZXNzICVwTVxuIiwgcHJpdi0+ZGV2LT5uYW1lLAotCQlwcml2LT5kZXYtPmRldl9hZGRyKTsKIH0KIAogLyoqCkBAIC0xNjM1LDcgKzE2MzUsNyBAQAogCXN0bW1hY19tbWNfc2V0dXAocHJpdik7CiAKIAlyZXQgPSBzdG1tYWNfaW5pdF9wdHAocHJpdik7Ci0JaWYgKHJldCkKKwlpZiAocmV0ICYmIHJldCAhPSAtRU9QTk9UU1VQUCkKIAkJcHJfd2FybigiJXM6IGZhaWxlZCBQVFAgaW5pdGlhbGlzYXRpb25cbiIsIF9fZnVuY19fKTsKIAogI2lmZGVmIENPTkZJR19TVE1NQUNfREVCVUdfRlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwppbmRleCBiZGU2M2UzLi4xZDg2MGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCkBAIC0xODc4LDggKzE4NzgsMTggQEAKIAkJbWRpb19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoYmUzMl90b19jcHVwKHBhcnApKTsKIAkJcGh5aWQgPSBiZTMyX3RvX2NwdXAocGFycCsxKTsKIAkJbWRpbyA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobWRpb19ub2RlKTsKLQkJc25wcmludGYoc2xhdmVfZGF0YS0+cGh5X2lkLCBzaXplb2Yoc2xhdmVfZGF0YS0+cGh5X2lkKSwKLQkJCSBQSFlfSURfRk1ULCBtZGlvLT5uYW1lLCBwaHlpZCk7CisKKwkJaWYgKHN0cm5jbXAobWRpby0+bmFtZSwgImdwaW8iLCA0KSA9PSAwKSB7CisJCQkvKiBHUElPIGJpdGJhbmcgTURJTyBkcml2ZXIgYXR0YWNoZWQgKi8KKwkJCXN0cnVjdCBtaWlfYnVzICpidXMgPSBkZXZfZ2V0X2RydmRhdGEoJm1kaW8tPmRldik7CisKKwkJCXNucHJpbnRmKHNsYXZlX2RhdGEtPnBoeV9pZCwgc2l6ZW9mKHNsYXZlX2RhdGEtPnBoeV9pZCksCisJCQkJIFBIWV9JRF9GTVQsIGJ1cy0+aWQsIHBoeWlkKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRhdmluY2kgTURJTyBkcml2ZXIgYXR0YWNoZWQgKi8KKwkJCXNucHJpbnRmKHNsYXZlX2RhdGEtPnBoeV9pZCwgc2l6ZW9mKHNsYXZlX2RhdGEtPnBoeV9pZCksCisJCQkJIFBIWV9JRF9GTVQsIG1kaW8tPm5hbWUsIHBoeWlkKTsKKwkJfQogCiAJCW1hY19hZGRyID0gb2ZfZ2V0X21hY19hZGRyZXNzKHNsYXZlX25vZGUpOwogCQlpZiAobWFjX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oIGIvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaAppbmRleCBhMjZlZWNiLi43YjU5NGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCiAjZGVmaW5lIE5FVFZTQ19NVFUgNjU1MzYKIAotI2RlZmluZSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfU0laRQkJKDEwMjQqMTAyNCoyKQkvKiAyTUIgKi8KKyNkZWZpbmUgTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX1NJWkUJCSgxMDI0KjEwMjQqMTYpCS8qIDE2TUIgKi8KIAogI2RlZmluZSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQJCTB4Y2FmZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMKaW5kZXggOTNiNDg1Yi4uMDNhMmM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYwpAQCAtMTM2LDggKzEzNiw3IEBACiAKIAlpZiAobmV0X2RldmljZS0+cmVjdl9idWYpIHsKIAkJLyogRnJlZSB1cCB0aGUgcmVjZWl2ZSBidWZmZXIgKi8KLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXRfZGV2aWNlLT5yZWN2X2J1ZiwKLQkJCWdldF9vcmRlcihuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplKSk7CisJCXZmcmVlKG5ldF9kZXZpY2UtPnJlY3ZfYnVmKTsKIAkJbmV0X2RldmljZS0+cmVjdl9idWYgPSBOVUxMOwogCX0KIApAQCAtMTYzLDkgKzE2Miw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCi0JbmV0X2RldmljZS0+cmVjdl9idWYgPQotCQkodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAotCQkJCWdldF9vcmRlcihuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplKSk7CisJbmV0X2RldmljZS0+cmVjdl9idWYgPSB2emFsbG9jKG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUpOwogCWlmICghbmV0X2RldmljZS0+cmVjdl9idWYpIHsKIAkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHJlY2VpdmUgIgogCQkJImJ1ZmZlciBvZiBzaXplICVkXG4iLCBuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZwppbmRleCAyZGM4MmYxLi4zZGE0NGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCkBAIC0yMTAsMTMgKzIxMCw2IEBACiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCiAJICBraW5nc3VuLXNpci4KIAotY29uZmlnIEVQNzIxMV9ET05HTEUKLQl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIGNscHM3MTF4IEkvUiBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVJUVFlfU0lSICYmIEFSQ0hfQ0xQUzcxMVggJiYgSVJEQQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIENpcnJ1cyBsb2dpYwotCSAgRVA3MjExIGNoaXBzZXQncyBpbmZyYXJlZCBtb2R1bGUuCi0KIGNvbmZpZyBLU0RBWlpMRV9ET05HTEUKIAl0cmlzdGF0ZSAiS2luZ1N1biBEYXp6bGUgSXJEQS1VU0IgZG9uZ2xlIgogCWRlcGVuZHMgb24gSVJEQSAmJiBVU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlCmluZGV4IGRmYzY0NTMuLmJlOGFiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpAQCAtMzUsNyArMzUsNiBAQAogb2JqLSQoQ09ORklHX0FDVDIwMExfRE9OR0xFKQkrPSBhY3QyMDBsLXNpci5vCiBvYmotJChDT05GSUdfTUE2MDBfRE9OR0xFKQkrPSBtYTYwMC1zaXIubwogb2JqLSQoQ09ORklHX1RPSU0zMjMyX0RPTkdMRSkJKz0gdG9pbTMyMzItc2lyLm8KLW9iai0kKENPTkZJR19FUDcyMTFfRE9OR0xFKQkrPSBlcDcyMTEtc2lyLm8KIG9iai0kKENPTkZJR19LSU5HU1VOX0RPTkdMRSkJKz0ga2luZ3N1bi1zaXIubwogb2JqLSQoQ09ORklHX0tTREFaWkxFX0RPTkdMRSkJKz0ga3NkYXp6bGUtc2lyLm8KIG9iai0kKENPTkZJR19LUzk1OV9ET05HTEUpICAgIAkrPSBrczk1OS1zaXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9lcDcyMTEtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMS1zaXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlMWY0ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMS1zaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBJUiBwb3J0IGRyaXZlciBmb3IgdGhlIENpcnJ1cyBMb2dpYyBDTFBTNzExWCBwcm9jZXNzb3JzCi0gKgotICogQ29weXJpZ2h0IDIwMDEsIEJsdWUgTXVnIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwNywgU2FtdWVsIE9ydGl6IDxzYW11ZWxAc29ydGl6Lm9yZz4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlICJzaXItZGV2LmgiCi0KLXN0YXRpYyBpbnQgY2xwczcxMXhfZG9uZ2xlX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBpbnQgc3lzY29uOwotCi0JLyogVHVybiBvbiB0aGUgU0lSIGVuY29kZXIuICovCi0Jc3lzY29uID0gY2xwc19yZWFkbChTWVNDT04xKTsKLQlzeXNjb24gfD0gU1lTQ09OMV9TSVJFTjsKLQljbHBzX3dyaXRlbChzeXNjb24sIFNZU0NPTjEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2xwczcxMXhfZG9uZ2xlX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgaW50IHN5c2NvbjsKLQotCS8qIFR1cm4gb2ZmIHRoZSBTSVIgZW5jb2Rlci4gKi8KLQlzeXNjb24gPSBjbHBzX3JlYWRsKFNZU0NPTjEpOwotCXN5c2NvbiAmPSB+U1lTQ09OMV9TSVJFTjsKLQljbHBzX3dyaXRlbChzeXNjb24sIFNZU0NPTjEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBjbHBzNzExeF9kb25nbGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5kcml2ZXJfbmFtZQk9ICJFUDcyMTEgSVIgZHJpdmVyIiwKLQkudHlwZQkJPSBJUkRBX0VQNzIxMV9ET05HTEUsCi0JLm9wZW4JCT0gY2xwczcxMXhfZG9uZ2xlX29wZW4sCi0JLmNsb3NlCQk9IGNscHM3MTF4X2RvbmdsZV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBpbnQgY2xwczcxMXhfc2lyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZjbHBzNzExeF9kb25nbGUpOwotfQotCi1zdGF0aWMgaW50IGNscHM3MTF4X3Npcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmY2xwczcxMXhfZG9uZ2xlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xwczcxMXhfc2lyX2RyaXZlciA9IHsKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJzaXItY2xwczcxMXgiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQk9IGNscHM3MTF4X3Npcl9wcm9iZSwKLQkucmVtb3ZlCT0gY2xwczcxMXhfc2lyX3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGNscHM3MTF4X3Npcl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJTYW11ZWwgT3J0aXogPHNhbXVlbEBzb3J0aXoub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDcyMTEgSVIgZG9uZ2xlIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMyIpOyAvKiBJUkRBX0VQNzIxMV9ET05HTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMgYi9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jCmluZGV4IDU0NzcyNWYuLjk0MTRmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYwpAQCAtNDM3LDcgKzQzNywxMCBAQAogCQlpZiAob24pIHsKIAkJCWdwaW9fbnVtID0gZ3Bpb190YWJbRVhUVFMwX0dQSU8gKyBpbmRleF07CiAJCQlldm50IHw9IChncGlvX251bSAmIEVWTlRfR1BJT19NQVNLKSA8PCBFVk5UX0dQSU9fU0hJRlQ7Ci0JCQlldm50IHw9IEVWTlRfUklTRTsKKwkJCWlmIChycS0+ZXh0dHMuZmxhZ3MgJiBQVFBfRkFMTElOR19FREdFKQorCQkJCWV2bnQgfD0gRVZOVF9GQUxMOworCQkJZWxzZQorCQkJCWV2bnQgfD0gRVZOVF9SSVNFOwogCQl9CiAJCWV4dF93cml0ZSgwLCBwaHlkZXYsIFBBR0U1LCBQVFBfRVZOVCwgZXZudCk7CiAJCXJldHVybiAwOwpAQCAtMTA1OCw2ICsxMDYxLDEzIEBACiAJa2ZyZWUoZHA4MzY0MCk7CiB9CiAKK3N0YXRpYyBpbnQgZHA4MzY0MF9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWVuYWJsZV9zdGF0dXNfZnJhbWVzKHBoeWRldiwgdHJ1ZSk7CisJZXh0X3dyaXRlKDAsIHBoeWRldiwgUEFHRTQsIFBUUF9DVEwsIFBUUF9FTkFCTEUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRwODM2NDBfYWNrX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCBlcnIgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9EUDgzNjQwX01JU1IpOwpAQCAtMTE5NSwxMSArMTIwNSw2IEBACiAKIAltdXRleF9sb2NrKCZkcDgzNjQwLT5jbG9jay0+ZXh0cmVnX2xvY2spOwogCi0JaWYgKGRwODM2NDAtPmh3dHNfdHhfZW4gfHwgZHA4MzY0MC0+aHd0c19yeF9lbikgewotCQllbmFibGVfc3RhdHVzX2ZyYW1lcyhwaHlkZXYsIHRydWUpOwotCQlleHRfd3JpdGUoMCwgcGh5ZGV2LCBQQUdFNCwgUFRQX0NUTCwgUFRQX0VOQUJMRSk7Ci0JfQotCiAJZXh0X3dyaXRlKDAsIHBoeWRldiwgUEFHRTUsIFBUUF9UWENGRzAsIHR4Y2ZnMCk7CiAJZXh0X3dyaXRlKDAsIHBoeWRldiwgUEFHRTUsIFBUUF9SWENGRzAsIHJ4Y2ZnMCk7CiAKQEAgLTEyODEsNiArMTI4Niw3IEBACiAJCX0KIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBIV1RTVEFNUF9UWF9PTjoKKwkJc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyB8PSBTS0JUWF9JTl9QUk9HUkVTUzsKIAkJc2tiX3F1ZXVlX3RhaWwoJmRwODM2NDAtPnR4X3F1ZXVlLCBza2IpOwogCQlzY2hlZHVsZV93b3JrKCZkcDgzNjQwLT50c193b3JrKTsKIAkJYnJlYWs7CkBAIC0xMzMwLDYgKzEzMzYsNyBAQAogCS5mbGFncwkJPSBQSFlfSEFTX0lOVEVSUlVQVCwKIAkucHJvYmUJCT0gZHA4MzY0MF9wcm9iZSwKIAkucmVtb3ZlCQk9IGRwODM2NDBfcmVtb3ZlLAorCS5jb25maWdfaW5pdAk9IGRwODM2NDBfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKIAkuYWNrX2ludGVycnVwdCAgPSBkcDgzNjQwX2Fja19pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1zdW40aS5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW8tc3VuNGkuYwppbmRleCBiYjg4YmM3Li45MzY3YWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1zdW40aS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLXN1bjRpLmMKQEAgLTE3MCw2ICsxNzAsOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV9tZGlvX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1tZGlvIiB9LAorCisJLyogRGVwcmVjYXRlZCAqLwogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLW1kaW8iIH0sCiAJeyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwppbmRleCA5MzA2OTRkLi43MWU0OTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwpAQCAtMTUwLDYgKzE1MCw3IEBACiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZidXMtPmRldik7CiAJaWYgKGVycikgewogCQlwcl9lcnIoIm1paV9idXMgJXMgZmFpbGVkIHRvIHJlZ2lzdGVyXG4iLCBidXMtPmlkKTsKKwkJcHV0X2RldmljZSgmYnVzLT5kZXYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCmluZGV4IDRiMDNlNjMuLjgyNTE0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwpAQCAtNzE5LDcgKzcxOSw3IEBACiBzdGF0aWMgaW50IGdlbnBoeV9jb25maWdfYWR2ZXJ0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJdTMyIGFkdmVydGlzZTsKLQlpbnQgb2xkYWR2LCBhZHY7CisJaW50IG9sZGFkdiwgYWR2LCBibXNyOwogCWludCBlcnIsIGNoYW5nZWQgPSAwOwogCiAJLyogT25seSBhbGxvdyBhZHZlcnRpc2luZyB3aGF0IHRoaXMgUEhZIHN1cHBvcnRzICovCkBAIC03NDQsMjYgKzc0NCwzNiBAQAogCQljaGFuZ2VkID0gMTsKIAl9CiAKKwlibXNyID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQk1TUik7CisJaWYgKGJtc3IgPCAwKQorCQlyZXR1cm4gYm1zcjsKKworCS8qIFBlciA4MDIuMy0yMDA4LCBTZWN0aW9uIDIyLjIuNC4yLjE2IEV4dGVuZGVkIHN0YXR1cyBhbGwKKwkgKiAxMDAwTWJpdHMvc2VjIGNhcGFibGUgUEhZcyBzaGFsbCBoYXZlIHRoZSBCTVNSX0VTVEFURU4gYml0IHNldCB0byBhCisJICogbG9naWNhbCAxLgorCSAqLworCWlmICghKGJtc3IgJiBCTVNSX0VTVEFURU4pKQorCQlyZXR1cm4gY2hhbmdlZDsKKwogCS8qIENvbmZpZ3VyZSBnaWdhYml0IGlmIGl0J3Mgc3VwcG9ydGVkICovCisJYWR2ID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQ1RSTDEwMDApOworCWlmIChhZHYgPCAwKQorCQlyZXR1cm4gYWR2OworCisJb2xkYWR2ID0gYWR2OworCWFkdiAmPSB+KEFEVkVSVElTRV8xMDAwRlVMTCB8IEFEVkVSVElTRV8xMDAwSEFMRik7CisKIAlpZiAocGh5ZGV2LT5zdXBwb3J0ZWQgJiAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKIAkJCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKSkgewotCQlhZHYgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9DVFJMMTAwMCk7Ci0JCWlmIChhZHYgPCAwKQotCQkJcmV0dXJuIGFkdjsKLQotCQlvbGRhZHYgPSBhZHY7Ci0JCWFkdiAmPSB+KEFEVkVSVElTRV8xMDAwRlVMTCB8IEFEVkVSVElTRV8xMDAwSEFMRik7CiAJCWFkdiB8PSBldGh0b29sX2Fkdl90b19taWlfY3RybDEwMDBfdChhZHZlcnRpc2UpOwotCi0JCWlmIChhZHYgIT0gb2xkYWR2KSB7Ci0JCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQ1RSTDEwMDAsIGFkdik7Ci0KLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7CisJCWlmIChhZHYgIT0gb2xkYWR2KQogCQkJY2hhbmdlZCA9IDE7Ci0JCX0KIAl9CiAKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQ1RSTDEwMDAsIGFkdik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCBiY2YwMWFmLi40NGM0ZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtNjksNiArNjksNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTIyMjgsNiArMjIyOSwyNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgdHVuX2Nocl9zaG93X2ZkaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBmaWxlICpmKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW47CisJc3RydWN0IGlmcmVxIGlmcjsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisKKwlydG5sX2xvY2soKTsKKwl0dW4gPSB0dW5fZ2V0KGYpOworCWlmICh0dW4pCisJCXR1bl9nZXRfaWZmKGN1cnJlbnQtPm5zcHJveHktPm5ldF9ucywgdHVuLCAmaWZyKTsKKwlydG5sX3VubG9jaygpOworCisJaWYgKHR1bikKKwkJdHVuX3B1dCh0dW4pOworCisJcmV0dXJuIHNlcV9wcmludGYobSwgImlmZjpcdCVzXG4iLCBpZnIuaWZyX25hbWUpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR1bl9mb3BzID0gewogCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBub19sbHNlZWssCkBAIC0yMjQyLDcgKzIyNjQsMTAgQEAKICNlbmRpZgogCS5vcGVuCT0gdHVuX2Nocl9vcGVuLAogCS5yZWxlYXNlID0gdHVuX2Nocl9jbG9zZSwKLQkuZmFzeW5jID0gdHVuX2Nocl9mYXN5bmMKKwkuZmFzeW5jID0gdHVuX2Nocl9mYXN5bmMsCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkuc2hvd19mZGluZm8gPSB0dW5fY2hyX3Nob3dfZmRpbmZvLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdHVuX21pc2NkZXYgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCmluZGV4IDZiNjM4YTAuLjQwOTQ5OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCkBAIC0yOTIsNiArMjkyLDIyIEBACiAJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIENvcmVDaGlwLXN6IFNSOTcwMCBiYXNlZCBVU0IgMS4xCiAJICAxMC8xMDAgRXRoZXJuZXQgYWRhcHRlcnMuCiAKK2NvbmZpZyBVU0JfTkVUX1NSOTgwMAorCXRyaXN0YXRlICJDb3JlQ2hpcC1zeiBTUjk4MDAgYmFzZWQgVVNCIDIuMCAxMC8xMDAgZXRoZXJuZXQgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQKKwlzZWxlY3QgQ1JDMzIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgMTAwTWJwcyBVU0IgRXRoZXJuZXQKKwkgIGRldmljZSBiYXNlZCBvbiB0aGUgQ29yZUNoaXAtc3ogU1I5ODAwIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIG1ha2VzIHRoZSBhZGFwdGVyIGFwcGVhciBhcyBhIG5vcm1hbCBFdGhlcm5ldCBpbnRlcmZhY2UsCisJICB0eXBpY2FsbHkgb24gZXRoMCwgaWYgaXQgaXMgdGhlIG9ubHkgZXRoZXJuZXQgZGV2aWNlLCBvciBwZXJoYXBzIG9uCisJICBldGgxLCBpZiB5b3UgaGF2ZSBhIFBDSSBvciBJU0EgZXRoZXJuZXQgY2FyZCBpbnN0YWxsZWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNyOTgwMC4KKwogY29uZmlnIFVTQl9ORVRfU01TQzc1WFgKIAl0cmlzdGF0ZSAiU01TQyBMQU43NVhYIGJhc2VkIFVTQiAyLjAgZ2lnYWJpdCBldGhlcm5ldCBkZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCmluZGV4IGIxN2I1ZTguLjQzM2YwYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC91c2IvTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIG9iai0kKENPTkZJR19VU0JfTkVUX0NEQ19FRU0pCSs9IGNkY19lZW0ubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfRE05NjAxKQkrPSBkbTk2MDEubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfU1I5NzAwKQkrPSBzcjk3MDAubworb2JqLSQoQ09ORklHX1VTQl9ORVRfU1I5ODAwKQkrPSBzcjk4MDAubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfU01TQzc1WFgpCSs9IHNtc2M3NXh4Lm8KIG9iai0kKENPTkZJR19VU0JfTkVUX1NNU0M5NVhYKQkrPSBzbXNjOTV4eC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9HTDYyMEEpCSs9IGdsNjIwYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHNvLmMgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKaW5kZXggMWE0ODIzNC4uNjYwYmQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2hzby5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwpAQCAtMTIwMSwxNiArMTIwMSwxOCBAQAogCXN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCisJRDQoIlxuLS0tIEdvdCBzZXJpYWxfcmVhZF9idWxrIGNhbGxiYWNrICUwMnggLS0tIiwgc3RhdHVzKTsKKwogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmICghc2VyaWFsKSB7CiAJCUQxKCJzZXJpYWwgPT0gTlVMTCIpOwogCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChzdGF0dXMpIHsKKwl9CisJaWYgKHN0YXR1cykgewogCQloYW5kbGVfdXNiX2Vycm9yKHN0YXR1cywgX19mdW5jX18sIHNlcmlhbC0+cGFyZW50KTsKIAkJcmV0dXJuOwogCX0KIAotCUQ0KCJcbi0tLSBHb3Qgc2VyaWFsX3JlYWRfYnVsayBjYWxsYmFjayAlMDJ4IC0tLSIsIHN0YXR1cyk7CiAJRDEoIkFjdHVhbCBsZW5ndGggPSAlZFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlEVU1QMSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIApAQCAtMTIxOCwyNSArMTIyMCwxMyBAQAogCWlmIChzZXJpYWwtPnBvcnQuY291bnQgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChzZXJpYWwtPnBhcmVudC0+cG9ydF9zcGVjICYgSFNPX0lORk9fQ1JDX0JVRykKLQkJCWZpeF9jcmNfYnVnKHVyYiwgc2VyaWFsLT5pbl9lbmRwLT53TWF4UGFja2V0U2l6ZSk7Ci0JCS8qIFZhbGlkIGRhdGEsIGhhbmRsZSBSWCBkYXRhICovCi0JCXNwaW5fbG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7Ci0JCXNlcmlhbC0+cnhfdXJiX2ZpbGxlZFtoc29fdXJiX3RvX2luZGV4KHNlcmlhbCwgdXJiKV0gPSAxOwotCQlwdXRfcnhidWZfZGF0YV9hbmRfcmVzdWJtaXRfYnVsa191cmIoc2VyaWFsKTsKLQkJc3Bpbl91bmxvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwotCX0gZWxzZSBpZiAoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCS8qIFVubGlua2VkIC0gY2hlY2sgZm9yIHRocm90dGxlZCBwb3J0LiAqLwotCQlEMigiUG9ydCAlZCwgc3VjY2Vzc2Z1bGx5IHVubGlua2VkIHVyYiIsIHNlcmlhbC0+bWlub3IpOwotCQlzcGluX2xvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwotCQlzZXJpYWwtPnJ4X3VyYl9maWxsZWRbaHNvX3VyYl90b19pbmRleChzZXJpYWwsIHVyYildID0gMDsKLQkJaHNvX3Jlc3VibWl0X3J4X2J1bGtfdXJiKHNlcmlhbCwgdXJiKTsKLQkJc3Bpbl91bmxvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwotCX0gZWxzZSB7Ci0JCUQyKCJQb3J0ICVkLCBzdGF0dXMgPSAlZCBmb3IgcmVhZCB1cmIiLCBzZXJpYWwtPm1pbm9yLCBzdGF0dXMpOwotCQlyZXR1cm47Ci0JfQorCWlmIChzZXJpYWwtPnBhcmVudC0+cG9ydF9zcGVjICYgSFNPX0lORk9fQ1JDX0JVRykKKwkJZml4X2NyY19idWcodXJiLCBzZXJpYWwtPmluX2VuZHAtPndNYXhQYWNrZXRTaXplKTsKKwkvKiBWYWxpZCBkYXRhLCBoYW5kbGUgUlggZGF0YSAqLworCXNwaW5fbG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CisJc2VyaWFsLT5yeF91cmJfZmlsbGVkW2hzb191cmJfdG9faW5kZXgoc2VyaWFsLCB1cmIpXSA9IDE7CisJcHV0X3J4YnVmX2RhdGFfYW5kX3Jlc3VibWl0X2J1bGtfdXJiKHNlcmlhbCk7CisJc3Bpbl91bmxvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwppbmRleCAyM2JkZDViLi5mZjVjODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYworKysgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwpAQCAtNzEyLDYgKzcxMiw3IEBACiAJe1FNSV9GSVhFRF9JTlRGKDB4MTlkMiwgMHgxMjU1LCAzKX0sCiAJe1FNSV9GSVhFRF9JTlRGKDB4MTlkMiwgMHgxMjU1LCA0KX0sCiAJe1FNSV9GSVhFRF9JTlRGKDB4MTlkMiwgMHgxMjU2LCA0KX0sCisJe1FNSV9GSVhFRF9JTlRGKDB4MTlkMiwgMHgxMjcwLCA1KX0sCS8qIFpURSBNRjY2NyAqLwogCXtRTUlfRklYRURfSU5URigweDE5ZDIsIDB4MTQwMSwgMil9LAogCXtRTUlfRklYRURfSU5URigweDE5ZDIsIDB4MTQwMiwgMil9LAkvKiBaVEUgTUY2MCAqLwogCXtRTUlfRklYRURfSU5URigweDE5ZDIsIDB4MTQyNCwgMil9LApAQCAtNzIzLDYgKzcyNCw3IEBACiAJe1FNSV9GSVhFRF9JTlRGKDB4MTE5OSwgMHg2OGEyLCA4KX0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzc3MTAgaW4gUU1JIG1vZGUgKi8KIAl7UU1JX0ZJWEVEX0lOVEYoMHgxMTk5LCAweDY4YTIsIDE5KX0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzc3MTAgaW4gUU1JIG1vZGUgKi8KIAl7UU1JX0ZJWEVEX0lOVEYoMHgxMTk5LCAweDkwMWMsIDgpfSwgICAgLyogU2llcnJhIFdpcmVsZXNzIEVNNzcwMCAqLworCXtRTUlfRklYRURfSU5URigweDExOTksIDB4OTA1MSwgOCl9LAkvKiBOZXRnZWFyIEFpckNhcmQgMzQwVSAqLwogCXtRTUlfRklYRURfSU5URigweDFiYmIsIDB4MDExZSwgNCl9LAkvKiBUZWxla29tIFNwZWVkc3RpY2sgTFRFIElJIChBbGNhdGVsIE9uZSBUb3VjaCBMMTAwViBMVEUpICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MjM1NywgMHgwMjAxLCA0KX0sCS8qIFRQLUxJTksgSFNVUEEgTW9kZW0gTUExODAgKi8KIAl7UU1JX0ZJWEVEX0lOVEYoMHgyMzU3LCAweDkwMDAsIDQpfSwJLyogVFAtTElOSyBNQTI2MCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwppbmRleCBlOGZhYzczLi5kODlkYmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcjgxNTIuYworKysgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwpAQCAtMjI3MywxNSArMjI3Myw2IEBACiAJc3RydWN0IHI4MTUyICp0cCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHJlcyA9IDA7CiAKLQlyZXMgPSB1c2Jfc3VibWl0X3VyYih0cC0+aW50cl91cmIsIEdGUF9LRVJORUwpOwotCWlmIChyZXMpIHsKLQkJaWYgKHJlcyA9PSAtRU5PREVWKQotCQkJbmV0aWZfZGV2aWNlX2RldGFjaCh0cC0+bmV0ZGV2KTsKLQkJbmV0aWZfd2Fybih0cCwgaWZ1cCwgbmV0ZGV2LCAiaW50cl91cmIgc3VibWl0IGZhaWxlZDogJWRcbiIsCi0JCQkgICByZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQogCXJ0bDgxNTJfc2V0X3NwZWVkKHRwLCBBVVRPTkVHX0VOQUJMRSwKIAkJCSAgdHAtPm1paS5zdXBwb3J0c19nbWlpID8gU1BFRURfMTAwMCA6IFNQRUVEXzEwMCwKIAkJCSAgRFVQTEVYX0ZVTEwpOwpAQCAtMjI4OSw2ICsyMjgwLDE0IEBACiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwogCXNldF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpOworCXJlcyA9IHVzYl9zdWJtaXRfdXJiKHRwLT5pbnRyX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcykgeworCQlpZiAocmVzID09IC1FTk9ERVYpCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKHRwLT5uZXRkZXYpOworCQluZXRpZl93YXJuKHRwLCBpZnVwLCBuZXRkZXYsICJpbnRyX3VyYiBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKKwkJCSAgIHJlcyk7CisJfQorCiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjI5OCw4ICsyMjk3LDggQEAKIAlzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgcmVzID0gMDsKIAotCXVzYl9raWxsX3VyYih0cC0+aW50cl91cmIpOwogCWNsZWFyX2JpdChXT1JLX0VOQUJMRSwgJnRwLT5mbGFncyk7CisJdXNiX2tpbGxfdXJiKHRwLT5pbnRyX3VyYik7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0cC0+c2NoZWR1bGUpOwogCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAl0YXNrbGV0X2Rpc2FibGUoJnRwLT50bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc3I5ODAwLmMgYi9kcml2ZXJzL25ldC91c2Ivc3I5ODAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NWViOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zcjk4MDAuYwpAQCAtMCwwICsxLDg3MCBAQAorLyogQ29yZUNoaXAtc3ogU1I5ODAwIG9uZSBjaGlwIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcworICoKKyAqIEF1dGhvciA6IExpdSBKdW5saWFuZyA8bGl1anVubGlhbmdfbGpsQDE2My5jb20+CisgKgorICogQmFzZWQgb24gYXNpeF9jb21tb24uYywgYXNpeF9kZXZpY2VzLmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdXNibmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgInNyOTgwMC5oIgorCitzdGF0aWMgaW50IHNyX3JlYWRfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCSAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdXNibmV0X3JlYWRfY21kKGRldiwgY21kLCBTUl9SRVFfUkRfUkVHLCB2YWx1ZSwgaW5kZXgsCisJCQkgICAgICBkYXRhLCBzaXplKTsKKwlpZiAoKGVyciAhPSBzaXplKSAmJiAoZXJyID49IDApKQorCQllcnIgPSAtRUlOVkFMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcl93cml0ZV9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAorCQkJICAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdXNibmV0X3dyaXRlX2NtZChkZXYsIGNtZCwgU1JfUkVRX1dSX1JFRywgdmFsdWUsIGluZGV4LAorCQkJICAgICAgZGF0YSwgc2l6ZSk7CisJaWYgKChlcnIgIT0gc2l6ZSkgJiYgKGVyciA+PSAwKSkKKwkJZXJyID0gLUVJTlZBTDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitzcl93cml0ZV9jbWRfYXN5bmMoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAorCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwl1c2JuZXRfd3JpdGVfY21kX2FzeW5jKGRldiwgY21kLCBTUl9SRVFfV1JfUkVHLCB2YWx1ZSwgaW5kZXgsIGRhdGEsCisJCQkgICAgICAgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3JfcnhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBvZmZzZXQgPSAwOworCisJd2hpbGUgKG9mZnNldCArIHNpemVvZih1MzIpIDwgc2tiLT5sZW4pIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNyX3NrYjsKKwkJdTE2IHNpemU7CisJCXUzMiBoZWFkZXIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoc2tiLT5kYXRhICsgb2Zmc2V0KTsKKworCQlvZmZzZXQgKz0gc2l6ZW9mKHUzMik7CisJCS8qIGdldCB0aGUgcGFja2V0IGxlbmd0aCAqLworCQlzaXplID0gKHUxNikgKGhlYWRlciAmIDB4N2ZmKTsKKwkJaWYgKHNpemUgIT0gKCh+aGVhZGVyID4+IDE2KSAmIDB4MDdmZikpIHsKKwkJCW5ldGRldl9lcnIoZGV2LT5uZXQsICIlcyA6IEJhZCBIZWFkZXIgTGVuZ3RoXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKChzaXplID4gZGV2LT5uZXQtPm10dSArIEVUSF9ITEVOICsgVkxBTl9ITEVOKSB8fAorCQkgICAgKHNpemUgKyBvZmZzZXQgPiBza2ItPmxlbikpIHsKKwkJCW5ldGRldl9lcnIoZGV2LT5uZXQsICIlcyA6IEJhZCBSWCBMZW5ndGggJWRcbiIsCisJCQkJICAgX19mdW5jX18sIHNpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3Jfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihkZXYtPm5ldCwgc2l6ZSk7CisJCWlmICghc3Jfc2tiKQorCQkJcmV0dXJuIDA7CisKKwkJc2tiX3B1dChzcl9za2IsIHNpemUpOworCQltZW1jcHkoc3Jfc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBvZmZzZXQsIHNpemUpOworCQl1c2JuZXRfc2tiX3JldHVybihkZXYsIHNyX3NrYik7CisKKwkJb2Zmc2V0ICs9IChzaXplICsgMSkgJiAweGZmZmU7CisJfQorCisJaWYgKHNrYi0+bGVuICE9IG9mZnNldCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiJXMgOiBCYWQgU0tCIExlbmd0aCAlZFxuIiwgX19mdW5jX18sCisJCQkgICBza2ItPmxlbik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNyX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJaW50IHRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisJdTMyIHBhZGJ5dGVzID0gMHhmZmZmMDAwMDsKKwl1MzIgcGFja2V0X2xlbjsKKwlpbnQgcGFkbGVuOworCisJcGFkbGVuID0gKChza2ItPmxlbiArIDQpICUgKGRldi0+bWF4cGFja2V0IC0gMSkpID8gMCA6IDQ7CisKKwlpZiAoKCFza2JfY2xvbmVkKHNrYikpICYmICgoaGVhZHJvb20gKyB0YWlscm9vbSkgPj0gKDQgKyBwYWRsZW4pKSkgeworCQlpZiAoKGhlYWRyb29tIDwgNCkgfHwgKHRhaWxyb29tIDwgcGFkbGVuKSkgeworCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyA0LCBza2ItPmRhdGEsCisJCQkJCSAgICBza2ItPmxlbik7CisJCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHNrYi0+bGVuKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBza19idWZmICpza2IyOworCQlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgNCwgcGFkbGVuLCBmbGFncyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IHNrYjI7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiX3B1c2goc2tiLCA0KTsKKwlwYWNrZXRfbGVuID0gKCgoc2tiLT5sZW4gLSA0KSBeIDB4MDAwMGZmZmYpIDw8IDE2KSArIChza2ItPmxlbiAtIDQpOworCWNwdV90b19sZTMycygmcGFja2V0X2xlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAmcGFja2V0X2xlbiwgc2l6ZW9mKHBhY2tldF9sZW4pKTsKKworCWlmIChwYWRsZW4pIHsKKwkJY3B1X3RvX2xlMzJzKCZwYWRieXRlcyk7CisJCW1lbWNweShza2JfdGFpbF9wb2ludGVyKHNrYiksICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CisJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZCBzcl9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNyOTgwMF9pbnRfZGF0YSAqZXZlbnQ7CisJaW50IGxpbms7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgOCkKKwkJcmV0dXJuOworCisJZXZlbnQgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlsaW5rID0gZXZlbnQtPmxpbmsgJiAweDAxOworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldi0+bmV0KSAhPSBsaW5rKSB7CisJCXVzYm5ldF9saW5rX2NoYW5nZShkZXYsIGxpbmssIDEpOworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiTGluayBTdGF0dXMgaXM6ICVkXG4iLCBsaW5rKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNyX3NldF9zd19taWkoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfU0VUX1NXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkZhaWxlZCB0byBlbmFibGUgc29mdHdhcmUgTUlJIGFjY2Vzc1xuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3Jfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHNyX3dyaXRlX2NtZChkZXYsIFNSX0NNRF9TRVRfSFdfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBoYXJkd2FyZSBNSUkgYWNjZXNzXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBzcl9nZXRfcGh5X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXU4IGJ1ZlsyXTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3JfcmVhZF9jbWQoZGV2LCBTUl9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIiVzIDogRXJyb3IgcmVhZGluZyBQSFlJRCByZWdpc3RlcjolMDJ4XG4iLAorCQkJICAgX19mdW5jX18sIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiJXMgOiByZXR1cm5pbmcgMHglMDR4XG4iLCBfX2Z1bmNfXywKKwkJICAgKigoX19sZTE2ICopYnVmKSk7CisKKwlyZXQgPSBidWZbMV07CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNyX3N3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggZmxhZ3MpCit7CisJaW50IHJldDsKKworCXJldCA9IHNyX3dyaXRlX2NtZChkZXYsIFNSX0NNRF9TV19SRVNFVCwgZmxhZ3MsIDAsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHNlbmQgc29mdHdhcmUgcmVzZXQ6JTAyeFxuIiwKKwkJCSAgIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IHNyX3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlfX2xlMTYgdjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3JfcmVhZF9jbWQoZGV2LCBTUl9DTURfUkVBRF9SWF9DVEwsIDAsIDAsIDIsICZ2KTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgcmVhZGluZyBSWF9DVEwgcmVnaXN0ZXI6JTAyeFxuIiwKKwkJCSAgIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGxlMTZfdG9fY3B1KHYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3Jfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpCit7CisJaW50IHJldDsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICIlcyA6IG1vZGUgPSAweCUwNHhcbiIsIF9fZnVuY19fLCBtb2RlKTsKKwlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfV1JJVEVfUlhfQ1RMLCBtb2RlLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJbmV0ZGV2X2VycihkZXYtPm5ldCwKKwkJCSAgICJGYWlsZWQgdG8gd3JpdGUgUlhfQ1RMIG1vZGUgdG8gMHglMDR4OiUwMnhcbiIsCisJCQkgICBtb2RlLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUxNiBzcl9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCV9fbGUxNiB2OworCWludCByZXQ7CisKKwlyZXQgPSBzcl9yZWFkX2NtZChkZXYsIFNSX0NNRF9SRUFEX01FRElVTV9TVEFUVVMsIDAsIDAsIDIsICZ2KTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJICAgIkVycm9yIHJlYWRpbmcgTWVkaXVtIFN0YXR1cyByZWdpc3RlcjolMDJ4XG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwkvKiBUT0RPOiBjYWxsZXJzIG5vdCBjaGVja2luZyBmb3IgZXJyb3IgcmV0ICovCisJfQorCisJcmV0dXJuIGxlMTZfdG9fY3B1KHYpOworfQorCitzdGF0aWMgaW50IHNyX3dyaXRlX21lZGl1bV9tb2RlKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpCit7CisJaW50IHJldDsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICIlcyA6IG1vZGUgPSAweCUwNHhcbiIsIF9fZnVuY19fLCBtb2RlKTsKKwlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJICAgIkZhaWxlZCB0byB3cml0ZSBNZWRpdW0gTW9kZSBtb2RlIHRvIDB4JTA0eDolMDJ4XG4iLAorCQkJICAgbW9kZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNyX3dyaXRlX2dwaW8oc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgdmFsdWUsIGludCBzbGVlcCkKK3sKKwlpbnQgcmV0OworCisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIiVzIDogdmFsdWUgPSAweCUwNHhcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJcmV0ID0gc3Jfd3JpdGVfY21kKGRldiwgU1JfQ01EX1dSSVRFX0dQSU9TLCB2YWx1ZSwgMCwgMCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gd3JpdGUgR1BJTyB2YWx1ZSAweCUwNHg6JTAyeFxuIiwKKwkJCSAgIHZhbHVlLCByZXQpOworCWlmIChzbGVlcCkKKwkJbXNsZWVwKHNsZWVwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFNSOTgwMCBoYXZlIGEgMTYtYml0IFJYX0NUTCB2YWx1ZSAqLworc3RhdGljIHZvaWQgc3Jfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IHNyX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNyX2RhdGEgKikmZGV2LT5kYXRhOworCXUxNiByeF9jdGwgPSBTUl9ERUZBVUxUX1JYX0NUTDsKKworCWlmIChuZXQtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcnhfY3RsIHw9IFNSX1JYX0NUTF9QUk87CisJfSBlbHNlIGlmIChuZXQtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8CisJCSAgIG5ldGRldl9tY19jb3VudChuZXQpID4gU1JfTUFYX01DQVNUKSB7CisJCXJ4X2N0bCB8PSBTUl9SWF9DVExfQU1BTEw7CisJfSBlbHNlIGlmIChuZXRkZXZfbWNfZW1wdHkobmV0KSkgeworCQkvKiBqdXN0IGJyb2FkY2FzdCBhbmQgZGlyZWN0ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBXZSB1c2UgdGhlIDIwIGJ5dGUgZGV2LT5kYXRhCisJCSAqIGZvciBvdXIgOCBieXRlIGZpbHRlciBidWZmZXIKKwkJICogdG8gYXZvaWQgYWxsb2NhdGluZyBtZW1vcnkgdGhhdAorCQkgKiBpcyB0cmlja3kgdG8gZnJlZSBsYXRlcgorCQkgKi8KKwkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwkJdTMyIGNyY19iaXRzOworCisJCW1lbXNldChkYXRhLT5tdWx0aV9maWx0ZXIsIDAsIFNSX01DQVNUX0ZJTFRFUl9TSVpFKTsKKworCQkvKiBCdWlsZCB0aGUgbXVsdGljYXN0IGhhc2ggZmlsdGVyLiAqLworCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmV0KSB7CisJCQljcmNfYml0cyA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgaGEtPmFkZHIpID4+IDI2OworCQkJZGF0YS0+bXVsdGlfZmlsdGVyW2NyY19iaXRzID4+IDNdIHw9CisJCQkgICAgMSA8PCAoY3JjX2JpdHMgJiA3KTsKKwkJfQorCisJCXNyX3dyaXRlX2NtZF9hc3luYyhkZXYsIFNSX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCisJCQkJICAgU1JfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7CisKKwkJcnhfY3RsIHw9IFNSX1JYX0NUTF9BTTsKKwl9CisKKwlzcl93cml0ZV9jbWRfYXN5bmMoZGV2LCBTUl9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHNyX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJX19sZTE2IHJlczsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKwlzcl9zZXRfc3dfbWlpKGRldik7CisJc3JfcmVhZF9jbWQoZGV2LCBTUl9DTURfUkVBRF9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICZyZXMpOworCXNyX3NldF9od19taWkoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsCisJCSAgICIlcyA6IHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHJldHVybnM9MHglMDR4XG4iLCBfX2Z1bmNfXywKKwkJICAgcGh5X2lkLCBsb2MsIGxlMTZfdG9fY3B1KHJlcykpOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzcl9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlfX2xlMTYgcmVzID0gY3B1X3RvX2xlMTYodmFsKTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsCisJCSAgICIlcyA6IHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHZhbD0weCUwNHhcbiIsIF9fZnVuY19fLAorCQkgICBwaHlfaWQsIGxvYywgdmFsKTsKKwltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJc3Jfc2V0X3N3X21paShkZXYpOworCXNyX3dyaXRlX2NtZChkZXYsIFNSX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICZyZXMpOworCXNyX3NldF9od19taWkoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKK30KKworLyogR2V0IHRoZSBQSFkgSWRlbnRpZmllciBmcm9tIHRoZSBQSFlTSUQxICYgUEhZU0lEMiBNSUkgcmVnaXN0ZXJzICovCitzdGF0aWMgdTMyIHNyX2dldF9waHlpZChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50IHBoeV9yZWc7CisJdTMyIHBoeV9pZDsKKwlpbnQgaTsKKworCS8qIFBvbGwgZm9yIHRoZSByYXJlIGNhc2UgdGhlIEZXIG9yIHBoeSBpc24ndCByZWFkeSB5ZXQuICAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlwaHlfcmVnID0gc3JfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwkJaWYgKHBoeV9yZWcgIT0gMCAmJiBwaHlfcmVnICE9IDB4RkZGRikKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCisJaWYgKHBoeV9yZWcgPD0gMCB8fCBwaHlfcmVnID09IDB4RkZGRikKKwkJcmV0dXJuIDA7CisKKwlwaHlfaWQgPSAocGh5X3JlZyAmIDB4ZmZmZikgPDwgMTY7CisKKwlwaHlfcmVnID0gc3JfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQyKTsKKwlpZiAocGh5X3JlZyA8IDApCisJCXJldHVybiAwOworCisJcGh5X2lkIHw9IChwaHlfcmVnICYgMHhmZmZmKTsKKworCXJldHVybiBwaHlfaWQ7Cit9CisKK3N0YXRpYyB2b2lkCitzcl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1OCBvcHQ7CisKKwlpZiAoc3JfcmVhZF9jbWQoZGV2LCBTUl9DTURfUkVBRF9NT05JVE9SX01PREUsIDAsIDAsIDEsICZvcHQpIDwgMCkgeworCQl3b2xpbmZvLT5zdXBwb3J0ZWQgPSAwOworCQl3b2xpbmZvLT53b2xvcHRzID0gMDsKKwkJcmV0dXJuOworCX0KKwl3b2xpbmZvLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUM7CisJd29saW5mby0+d29sb3B0cyA9IDA7CisJaWYgKG9wdCAmIFNSX01PTklUT1JfTElOSykKKwkJd29saW5mby0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwlpZiAob3B0ICYgU1JfTU9OSVRPUl9NQUdJQykKKwkJd29saW5mby0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworfQorCitzdGF0aWMgaW50Citzcl9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1OCBvcHQgPSAwOworCisJaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJb3B0IHw9IFNSX01PTklUT1JfTElOSzsKKwlpZiAod29saW5mby0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCW9wdCB8PSBTUl9NT05JVE9SX01BR0lDOworCisJaWYgKHNyX3dyaXRlX2NtZChkZXYsIFNSX0NNRF9XUklURV9NT05JVE9SX01PREUsCisJCQkgb3B0LCAwLCAwLCBOVUxMKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3JfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzcl9kYXRhICpkYXRhID0gKHN0cnVjdCBzcl9kYXRhICopJmRldi0+ZGF0YTsKKworCXJldHVybiBkYXRhLT5lZXByb21fbGVuOworfQorCitzdGF0aWMgaW50IHNyX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCV9fbGUxNiAqZWJ1ZiA9IChfX2xlMTYgKilkYXRhOworCWludCByZXQ7CisJaW50IGk7CisKKwkvKiBDcnVkZSBoYWNrIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkKKwkgKiBpZiBhbiBvZGQgbGVuZ3RoIGlzIHN1cHBsaWVkCisJICovCisJaWYgKGVlcHJvbS0+bGVuICUgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZXByb20tPm1hZ2ljID0gU1JfRUVQUk9NX01BR0lDOworCisJLyogc3I5ODAwIHJldHVybnMgMiBieXRlcyBmcm9tIGVlcHJvbSBvbiByZWFkICovCisJZm9yIChpID0gMDsgaSA8IGVlcHJvbS0+bGVuIC8gMjsgaSsrKSB7CisJCXJldCA9IHNyX3JlYWRfY21kKGRldiwgU1JfQ01EX1JFQURfRUVQUk9NLCBlZXByb20tPm9mZnNldCArIGksCisJCQkJICAwLCAyLCAmZWJ1ZltpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IHNyX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNyX2RhdGEgKikmZGV2LT5kYXRhOworCisJLyogSW5oZXJpdCBzdGFuZGFyZCBkZXZpY2UgaW5mbyAqLworCXVzYm5ldF9nZXRfZHJ2aW5mbyhuZXQsIGluZm8pOworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJaW5mby0+ZWVkdW1wX2xlbiA9IGRhdGEtPmVlcHJvbV9sZW47Cit9CisKK3N0YXRpYyB1MzIgc3JfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuIG1paV9saW5rX29rKCZkZXYtPm1paSk7Cit9CisKK3N0YXRpYyBpbnQgc3JfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkZXYtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzcl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzcl9kYXRhICpkYXRhID0gKHN0cnVjdCBzcl9kYXRhICopJmRldi0+ZGF0YTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCW1lbWNweShuZXQtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwkvKiBXZSB1c2UgdGhlIDIwIGJ5dGUgZGV2LT5kYXRhCisJICogZm9yIG91ciA2IGJ5dGUgbWFjIGJ1ZmZlcgorCSAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgbWVtb3J5IHRoYXQKKwkgKiBpcyB0cmlja3kgdG8gZnJlZSBsYXRlcgorCSAqLworCW1lbWNweShkYXRhLT5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXNyX3dyaXRlX2NtZF9hc3luYyhkZXYsIFNSX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwKKwkJCSAgIGRhdGEtPm1hY19hZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHNyOTgwMF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JPSBzcl9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJPSBzcl9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAk9IHNyX2dldF93b2wsCisJLnNldF93b2wJPSBzcl9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgk9IHNyX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCT0gc3JfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCT0gdXNibmV0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0gdXNibmV0X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAk9IHVzYm5ldF9ud2F5X3Jlc2V0LAorfTsKKworc3RhdGljIGludCBzcjk4MDBfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGV0aHRvb2xfY21kIGVjbWQgPSB7IC5jbWQgPSBFVEhUT09MX0dTRVQgfTsKKwl1MTYgbW9kZTsKKworCW1paV9jaGVja19tZWRpYSgmZGV2LT5taWksIDEsIDEpOworCW1paV9ldGh0b29sX2dzZXQoJmRldi0+bWlpLCAmZWNtZCk7CisJbW9kZSA9IFNSOTgwMF9NRURJVU1fREVGQVVMVDsKKworCWlmIChldGh0b29sX2NtZF9zcGVlZCgmZWNtZCkgIT0gU1BFRURfMTAwKQorCQltb2RlICY9IH5TUl9NRURJVU1fUFM7CisKKwlpZiAoZWNtZC5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCW1vZGUgJj0gflNSX01FRElVTV9GRDsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICIlcyA6IHNwZWVkOiAldSBkdXBsZXg6ICVkIG1vZGU6IDB4JTA0eFxuIiwKKwkJICAgX19mdW5jX18sIGV0aHRvb2xfY21kX3NwZWVkKCZlY21kKSwgZWNtZC5kdXBsZXgsIG1vZGUpOworCisJc3Jfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3I5ODAwX3NldF9kZWZhdWx0X21vZGUoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiByeF9jdGw7CisJaW50IHJldDsKKworCXNyX21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCXNyX21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKKwkJICAgICAgQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BKTsKKwltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisKKwlyZXQgPSBzcl93cml0ZV9tZWRpdW1fbW9kZShkZXYsIFNSOTgwMF9NRURJVU1fREVGQVVMVCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gc3Jfd3JpdGVfY21kKGRldiwgU1JfQ01EX1dSSVRFX0lQRzAxMiwKKwkJCQlTUjk4MDBfSVBHMF9ERUZBVUxUIHwgU1I5ODAwX0lQRzFfREVGQVVMVCwKKwkJCQlTUjk4MDBfSVBHMl9ERUZBVUxULCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IHNyX3dyaXRlX3J4X2N0bChkZXYsIFNSX0RFRkFVTFRfUlhfQ1RMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyeF9jdGwgPSBzcl9yZWFkX3J4X2N0bChkZXYpOworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCisJCSAgIHJ4X2N0bCk7CisKKwlyeF9jdGwgPSBzcl9yZWFkX21lZGl1bV9zdGF0dXMoZGV2KTsKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiTWVkaXVtIFN0YXR1czoweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKKwkJICAgcnhfY3RsKTsKKworCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3I5ODAwX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3Qgc3JfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc3JfZGF0YSAqKSZkZXYtPmRhdGE7CisJaW50IHJldCwgZW1iZF9waHk7CisJdTE2IHJ4X2N0bDsKKworCXJldCA9IHNyX3dyaXRlX2dwaW8oZGV2LAorCQkJU1JfR1BJT19SU0UgfCBTUl9HUElPX0dQT18yIHwgU1JfR1BJT19HUE8yRU4sIDUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWVtYmRfcGh5ID0gKChzcl9nZXRfcGh5X2FkZHIoZGV2KSAmIDB4MWYpID09IDB4MTAgPyAxIDogMCk7CisKKwlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfU1dfUEhZX1NFTEVDVCwgZW1iZF9waHksIDAsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHNyX3N3X3Jlc2V0KGRldiwgU1JfU1dSRVNFVF9JUFBEIHwgU1JfU1dSRVNFVF9QUkwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCW1zbGVlcCgxNTApOworCisJcmV0ID0gc3Jfc3dfcmVzZXQoZGV2LCBTUl9TV1JFU0VUX0NMRUFSKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltc2xlZXAoMTUwKTsKKworCWlmIChlbWJkX3BoeSkgeworCQlyZXQgPSBzcl9zd19yZXNldChkZXYsIFNSX1NXUkVTRVRfSVBSTCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gc3Jfc3dfcmVzZXQoZGV2LCBTUl9TV1JFU0VUX1BSVEUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKworCW1zbGVlcCgxNTApOworCXJ4X2N0bCA9IHNyX3JlYWRfcnhfY3RsKGRldik7CisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgc29mdHdhcmUgcmVzZXRcbiIsIHJ4X2N0bCk7CisJcmV0ID0gc3Jfd3JpdGVfcnhfY3RsKGRldiwgMHgwMDAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyeF9jdGwgPSBzcl9yZWFkX3J4X2N0bChkZXYpOworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IHNldHRpbmcgdG8gMHgwMDAwXG4iLCByeF9jdGwpOworCisJcmV0ID0gc3Jfc3dfcmVzZXQoZGV2LCBTUl9TV1JFU0VUX1BSTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbXNsZWVwKDE1MCk7CisKKwlyZXQgPSBzcl9zd19yZXNldChkZXYsIFNSX1NXUkVTRVRfSVBSTCB8IFNSX1NXUkVTRVRfUFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltc2xlZXAoMTUwKTsKKworCXJldCA9IHNyOTgwMF9zZXRfZGVmYXVsdF9tb2RlKGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLworCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJcmV0ID0gc3Jfd3JpdGVfY21kKGRldiwgU1JfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLAorCQkJCQkJCWRhdGEtPm1hY19hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc3I5ODAwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHVzYm5ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSB1c2JuZXRfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdXNibmV0X3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IHVzYm5ldF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSB1c2JuZXRfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHNyX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX2RvX2lvY3RsCQk9IHNyX2lvY3RsLAorCS5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gc3Jfc2V0X211bHRpY2FzdCwKK307CisKK3N0YXRpYyBpbnQgc3I5ODAwX3BoeV9wb3dlcnVwKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpbnQgcmV0OworCisJLyogc2V0IHRoZSBlbWJlZGRlZCBFdGhlcm5ldCBQSFkgaW4gcG93ZXItZG93biBzdGF0ZSAqLworCXJldCA9IHNyX3N3X3Jlc2V0KGRldiwgU1JfU1dSRVNFVF9JUFBEIHwgU1JfU1dSRVNFVF9JUFJMKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHBvd2VyIGRvd24gUEhZIDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW1zbGVlcCgyMCk7CisKKwkvKiBzZXQgdGhlIGVtYmVkZGVkIEV0aGVybmV0IFBIWSBpbiBwb3dlci11cCBzdGF0ZSAqLworCXJldCA9IHNyX3N3X3Jlc2V0KGRldiwgU1JfU1dSRVNFVF9JUFJMKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlc2V0IFBIWTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW1zbGVlcCg2MDApOworCisJLyogc2V0IHRoZSBlbWJlZGRlZCBFdGhlcm5ldCBQSFkgaW4gcmVzZXQgc3RhdGUgKi8KKwlyZXQgPSBzcl9zd19yZXNldChkZXYsIFNSX1NXUkVTRVRfQ0xFQVIpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcG93ZXIgdXAgUEhZOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbXNsZWVwKDIwKTsKKworCS8qIHNldCB0aGUgZW1iZWRkZWQgRXRoZXJuZXQgUEhZIGluIHBvd2VyLXVwIHN0YXRlICovCisJcmV0ID0gc3Jfc3dfcmVzZXQoZGV2LCBTUl9TV1JFU0VUX0lQUkwpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVzZXQgUEhZOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcjk4MDBfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzcl9kYXRhICpkYXRhID0gKHN0cnVjdCBzcl9kYXRhICopJmRldi0+ZGF0YTsKKwl1MTYgbGVkMDFfbXV4LCBsZWQyM19tdXg7CisJaW50IHJldCwgZW1iZF9waHk7CisJdTMyIHBoeWlkOworCXUxNiByeF9jdGw7CisKKwlkYXRhLT5lZXByb21fbGVuID0gU1I5ODAwX0VFUFJPTV9MRU47CisKKwl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIGludGYpOworCisJLyogTEVEIFNldHRpbmcgUnVsZSA6CisJICogQUFCQjpDQ0RECisJICogQUEgOiBNRkEwKExFRDApCisJICogQkIgOiBNRkExKExFRDEpCisJICogQ0MgOiBNRkEyKExFRDIpLCBSZXNlcnZlZCBmb3IgU1I5ODAwCisJICogREQgOiBNRkEzKExFRDMpLCBSZXNlcnZlZCBmb3IgU1I5ODAwCisJICovCisJbGVkMDFfbXV4ID0gKFNSX0xFRF9NVVhfTElOS19BQ1RJVkUgPDwgOCkgfCBTUl9MRURfTVVYX0xJTks7CisJbGVkMjNfbXV4ID0gKFNSX0xFRF9NVVhfTElOS19BQ1RJVkUgPDwgOCkgfCBTUl9MRURfTVVYX1RYX0FDVElWRTsKKwlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfTEVEX01VWCwgbGVkMDFfbXV4LCBsZWQyM19tdXgsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCQluZXRkZXZfZXJyKGRldi0+bmV0LCAic2V0IExJTksgTEVEIGZhaWxlZCA6ICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJfQorCisJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCXJldCA9IHNyX3JlYWRfY21kKGRldiwgU1JfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCisJCQkgIGRldi0+bmV0LT5kZXZfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIkZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIm1hYyBhZGRyIDogJXBNXG4iLCBkZXYtPm5ldC0+ZGV2X2FkZHIpOworCisJLyogSW5pdGlhbGl6ZSBNSUkgc3RydWN0dXJlICovCisJZGV2LT5taWkuZGV2ID0gZGV2LT5uZXQ7CisJZGV2LT5taWkubWRpb19yZWFkID0gc3JfbWRpb19yZWFkOworCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBzcl9tZGlvX3dyaXRlOworCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCWRldi0+bWlpLnBoeV9pZCA9IHNyX2dldF9waHlfYWRkcihkZXYpOworCisJZGV2LT5uZXQtPm5ldGRldl9vcHMgPSAmc3I5ODAwX25ldGRldl9vcHM7CisJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJnNyOTgwMF9ldGh0b29sX29wczsKKworCWVtYmRfcGh5ID0gKChkZXYtPm1paS5waHlfaWQgJiAweDFmKSA9PSAweDEwID8gMSA6IDApOworCS8qIFJlc2V0IHRoZSBQSFkgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCisJcmV0ID0gc3Jfd3JpdGVfY21kKGRldiwgU1JfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5LCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEluaXQgUEhZIHJvdXRpbmUgKi8KKwlyZXQgPSBzcjk4MDBfcGh5X3Bvd2VydXAoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyeF9jdGwgPSBzcl9yZWFkX3J4X2N0bChkZXYpOworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIHNvZnR3YXJlIHJlc2V0XG4iLCByeF9jdGwpOworCXJldCA9IHNyX3dyaXRlX3J4X2N0bChkZXYsIDB4MDAwMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcnhfY3RsID0gc3JfcmVhZF9yeF9jdGwoZGV2KTsKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBzZXR0aW5nIHRvIDB4MDAwMFxuIiwgcnhfY3RsKTsKKworCS8qIFJlYWQgUEhZSUQgcmVnaXN0ZXIgKkFGVEVSKiB0aGUgUEhZIHdhcyByZXNldCBwcm9wZXJseSAqLworCXBoeWlkID0gc3JfZ2V0X3BoeWlkKGRldik7CisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlBIWUlEPTB4JTA4eFxuIiwgcGh5aWQpOworCisJLyogbWVkaXVtIG1vZGUgc2V0dGluZyAqLworCXJldCA9IHNyOTgwMF9zZXRfZGVmYXVsdF9tb2RlKGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKGRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJcmV0ID0gc3Jfd3JpdGVfY21kKGRldiwgU1JfQ01EX0JVTEtJTl9TSVpFLAorCQkJU1I5ODAwX0JVTEtJTl9TSVpFW1NSOTgwMF9NQVhfQlVMS0lOXzRLXS5ieXRlX2NudCwKKwkJCVNSOTgwMF9CVUxLSU5fU0laRVtTUjk4MDBfTUFYX0JVTEtJTl80S10udGhyZXNob2xkLAorCQkJMCwgTlVMTCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiUmVzZXQgUlhfQ1RMIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkZXYtPnJ4X3VyYl9zaXplID0KKwkJCVNSOTgwMF9CVUxLSU5fU0laRVtTUjk4MDBfTUFYX0JVTEtJTl80S10uc2l6ZTsKKwl9IGVsc2UgeworCQlyZXQgPSBzcl93cml0ZV9jbWQoZGV2LCBTUl9DTURfQlVMS0lOX1NJWkUsCisJCQlTUjk4MDBfQlVMS0lOX1NJWkVbU1I5ODAwX01BWF9CVUxLSU5fMktdLmJ5dGVfY250LAorCQkJU1I5ODAwX0JVTEtJTl9TSVpFW1NSOTgwMF9NQVhfQlVMS0lOXzJLXS50aHJlc2hvbGQsCisJCQkwLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJSZXNldCBSWF9DVEwgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRldi0+cnhfdXJiX3NpemUgPQorCQkJU1I5ODAwX0JVTEtJTl9TSVpFW1NSOTgwMF9NQVhfQlVMS0lOXzJLXS5zaXplOworCX0KKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiJXMgOiBzZXR0aW5nIHJ4X3VyYl9zaXplIHdpdGggOiAlbGRcbiIsIF9fZnVuY19fLAorCQkgICBkZXYtPnJ4X3VyYl9zaXplKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gc3I5ODAwX2RyaXZlcl9pbmZvID0geworCS5kZXNjcmlwdGlvbgk9ICJDb3JlQ2hpcCBTUjk4MDAgVVNCIDIuMCBFdGhlcm5ldCIsCisJLmJpbmQJCT0gc3I5ODAwX2JpbmQsCisJLnN0YXR1cwkJPSBzcl9zdGF0dXMsCisJLmxpbmtfcmVzZXQJPSBzcjk4MDBfbGlua19yZXNldCwKKwkucmVzZXQJCT0gc3I5ODAwX3Jlc2V0LAorCS5mbGFncwkJPSBEUklWRVJfRkxBRywKKwkucnhfZml4dXAJPSBzcl9yeF9maXh1cCwKKwkudHhfZml4dXAJPSBzcl90eF9maXh1cCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0c1tdID0geworCXsKKwkJVVNCX0RFVklDRSgweDBmZTYsIDB4OTgwMCksCS8qIFNSOTgwMCBEZXZpY2UgICovCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc3I5ODAwX2RyaXZlcl9pbmZvLAorCX0sCisJe30sCQkvKiBFTkQgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gcHJvZHVjdHMsCisJLnByb2JlCQk9IHVzYm5ldF9wcm9iZSwKKwkuc3VzcGVuZAk9IHVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdXNibmV0X3Jlc3VtZSwKKwkuZGlzY29ubmVjdAk9IHVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCit9OworCittb2R1bGVfdXNiX2RyaXZlcihzcl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJMaXUgSnVubGlhbmcgPGxpdWp1bmxpYW5nX2xqbEAxNjMuY29tIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNSOTgwMCBVU0IgMi4wIFVTQjJORVQgRGV2IDogaHR0cDovL3d3dy5jb3JlY2hpcC1zei5jb20iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zcjk4MDAuaCBiL2RyaXZlcnMvbmV0L3VzYi9zcjk4MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY2NzAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdXNiL3NyOTgwMC5oCkBAIC0wLDAgKzEsMjAyIEBACisvKiBDb3JlQ2hpcC1zeiBTUjk4MDAgb25lIGNoaXAgVVNCIDIuMCBFdGhlcm5ldCBEZXZpY2VzCisgKgorICogQXV0aG9yIDogTGl1IEp1bmxpYW5nIDxsaXVqdW5saWFuZ19samxAMTYzLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmCV9TUjk4MDBfSAorI2RlZmluZQlfU1I5ODAwX0gKKworLyogU1I5ODAwIHNwZWMuIGNvbW1hbmQgdGFibGUgb24gTGludXggUGxhdGZvcm0gKi8KKworLyogY29tbWFuZCA6IFNvZnR3YXJlIFN0YXRpb24gTWFuYWdlbWVudCBDb250cm9sIFJlZyAqLworI2RlZmluZSBTUl9DTURfU0VUX1NXX01JSQkJMHgwNgorLyogY29tbWFuZCA6IFBIWSBSZWFkIFJlZyAqLworI2RlZmluZSBTUl9DTURfUkVBRF9NSUlfUkVHCQkweDA3CisvKiBjb21tYW5kIDogUEhZIFdyaXRlIFJlZyAqLworI2RlZmluZSBTUl9DTURfV1JJVEVfTUlJX1JFRwkJMHgwOAorLyogY29tbWFuZCA6IEhhcmR3YXJlIFN0YXRpb24gTWFuYWdlbWVudCBDb250cm9sIFJlZyAqLworI2RlZmluZSBTUl9DTURfU0VUX0hXX01JSQkJMHgwYQorLyogY29tbWFuZCA6IFNST00gUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1JFQURfRUVQUk9NCQkweDBiCisvKiBjb21tYW5kIDogU1JPTSBXcml0ZSBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1dSSVRFX0VFUFJPTQkJMHgwYworLyogY29tbWFuZCA6IFNST00gV3JpdGUgRW5hYmxlIFJlZyAqLworI2RlZmluZSBTUl9DTURfV1JJVEVfRU5BQkxFCQkweDBkCisvKiBjb21tYW5kIDogU1JPTSBXcml0ZSBEaXNhYmxlIFJlZyAqLworI2RlZmluZSBTUl9DTURfV1JJVEVfRElTQUJMRQkJMHgwZQorLyogY29tbWFuZCA6IFJYIENvbnRyb2wgUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1JFQURfUlhfQ1RMCQkweDBmCisjZGVmaW5lCQlTUl9SWF9DVExfUFJPCQkJKDEgPDwgMCkKKyNkZWZpbmUJCVNSX1JYX0NUTF9BTUFMTAkJCSgxIDw8IDEpCisjZGVmaW5lCQlTUl9SWF9DVExfU0VQCQkJKDEgPDwgMikKKyNkZWZpbmUJCVNSX1JYX0NUTF9BQgkJCSgxIDw8IDMpCisjZGVmaW5lCQlTUl9SWF9DVExfQU0JCQkoMSA8PCA0KQorI2RlZmluZQkJU1JfUlhfQ1RMX0FQCQkJKDEgPDwgNSkKKyNkZWZpbmUJCVNSX1JYX0NUTF9BUlAJCQkoMSA8PCA2KQorI2RlZmluZQkJU1JfUlhfQ1RMX1NPCQkJKDEgPDwgNykKKyNkZWZpbmUJCVNSX1JYX0NUTF9SSDFNCQkJKDEgPDwgOCkKKyNkZWZpbmUJCVNSX1JYX0NUTF9SSDJNCQkJKDEgPDwgOSkKKyNkZWZpbmUJCVNSX1JYX0NUTF9SSDNNCQkJKDEgPDwgMTApCisvKiBjb21tYW5kIDogUlggQ29udHJvbCBXcml0ZSBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1dSSVRFX1JYX0NUTAkJMHgxMAorLyogY29tbWFuZCA6IElQRzAvSVBHMS9JUEcyIENvbnRyb2wgUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1JFQURfSVBHMDEyCQkweDExCisvKiBjb21tYW5kIDogSVBHMC9JUEcxL0lQRzIgQ29udHJvbCBXcml0ZSBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1dSSVRFX0lQRzAxMgkJMHgxMgorLyogY29tbWFuZCA6IE5vZGUgSUQgUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1JFQURfTk9ERV9JRAkJMHgxMworLyogY29tbWFuZCA6IE5vZGUgSUQgV3JpdGUgUmVnICovCisjZGVmaW5lIFNSX0NNRF9XUklURV9OT0RFX0lECQkweDE0CisvKiBjb21tYW5kIDogTXVsdGljYXN0IEZpbHRlciBBcnJheSBSZWFkIFJlZyAqLworI2RlZmluZQlTUl9DTURfUkVBRF9NVUxUSV9GSUxURVIJMHgxNQorLyogY29tbWFuZCA6IE11bHRpY2FzdCBGaWx0ZXIgQXJyYXkgV3JpdGUgUmVnICovCisjZGVmaW5lIFNSX0NNRF9XUklURV9NVUxUSV9GSUxURVIJMHgxNgorLyogY29tbWFuZCA6IEV0aC9Ib21lUE5BIFBIWSBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBTUl9DTURfUkVBRF9QSFlfSUQJCTB4MTkKKy8qIGNvbW1hbmQgOiBNZWRpdW0gU3RhdHVzIFJlYWQgUmVnICovCisjZGVmaW5lIFNSX0NNRF9SRUFEX01FRElVTV9TVEFUVVMJMHgxYQorI2RlZmluZQkJU1JfTU9OSVRPUl9MSU5LCQkJKDEgPDwgMSkKKyNkZWZpbmUJCVNSX01PTklUT1JfTUFHSUMJCSgxIDw8IDIpCisjZGVmaW5lCQlTUl9NT05JVE9SX0hTRlMJCQkoMSA8PCA0KQorLyogY29tbWFuZCA6IE1lZGl1bSBTdGF0dXMgV3JpdGUgUmVnICovCisjZGVmaW5lIFNSX0NNRF9XUklURV9NRURJVU1fTU9ERQkweDFiCisjZGVmaW5lCQlTUl9NRURJVU1fR00JCQkoMSA8PCAwKQorI2RlZmluZQkJU1JfTUVESVVNX0ZECQkJKDEgPDwgMSkKKyNkZWZpbmUJCVNSX01FRElVTV9BQwkJCSgxIDw8IDIpCisjZGVmaW5lCQlTUl9NRURJVU1fRU5DSwkJCSgxIDw8IDMpCisjZGVmaW5lCQlTUl9NRURJVU1fUkZDCQkJKDEgPDwgNCkKKyNkZWZpbmUJCVNSX01FRElVTV9URkMJCQkoMSA8PCA1KQorI2RlZmluZQkJU1JfTUVESVVNX0pGRQkJCSgxIDw8IDYpCisjZGVmaW5lCQlTUl9NRURJVU1fUEYJCQkoMSA8PCA3KQorI2RlZmluZQkJU1JfTUVESVVNX1JFCQkJKDEgPDwgOCkKKyNkZWZpbmUJCVNSX01FRElVTV9QUwkJCSgxIDw8IDkpCisjZGVmaW5lCQlTUl9NRURJVU1fUlNWCQkJKDEgPDwgMTApCisjZGVmaW5lCQlTUl9NRURJVU1fU0JQCQkJKDEgPDwgMTEpCisjZGVmaW5lCQlTUl9NRURJVU1fU00JCQkoMSA8PCAxMikKKy8qIGNvbW1hbmQgOiBNb25pdG9yIE1vZGUgU3RhdHVzIFJlYWQgUmVnICovCisjZGVmaW5lIFNSX0NNRF9SRUFEX01PTklUT1JfTU9ERQkweDFjCisvKiBjb21tYW5kIDogTW9uaXRvciBNb2RlIFN0YXR1cyBXcml0ZSBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1dSSVRFX01PTklUT1JfTU9ERQkweDFkCisvKiBjb21tYW5kIDogR1BJTyBTdGF0dXMgUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1JFQURfR1BJT1MJCTB4MWUKKyNkZWZpbmUJCVNSX0dQSU9fR1BPMEVOCQkoMSA8PCAwKSAvKiBHUElPMCBPdXRwdXQgZW5hYmxlICovCisjZGVmaW5lCQlTUl9HUElPX0dQT18wCQkoMSA8PCAxKSAvKiBHUElPMCBPdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUJCVNSX0dQSU9fR1BPMUVOCQkoMSA8PCAyKSAvKiBHUElPMSBPdXRwdXQgZW5hYmxlICovCisjZGVmaW5lCQlTUl9HUElPX0dQT18xCQkoMSA8PCAzKSAvKiBHUElPMSBPdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUJCVNSX0dQSU9fR1BPMkVOCQkoMSA8PCA0KSAvKiBHUElPMiBPdXRwdXQgZW5hYmxlICovCisjZGVmaW5lCQlTUl9HUElPX0dQT18yCQkoMSA8PCA1KSAvKiBHUElPMiBPdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUJCVNSX0dQSU9fUkVTRVJWRUQJKDEgPDwgNikgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCVNSX0dQSU9fUlNFCQkoMSA8PCA3KSAvKiBSZWxvYWQgc2VyaWFsIEVFUFJPTSAqLworLyogY29tbWFuZCA6IEdQSU8gU3RhdHVzIFdyaXRlIFJlZyAqLworI2RlZmluZSBTUl9DTURfV1JJVEVfR1BJT1MJCTB4MWYKKy8qIGNvbW1hbmQgOiBFdGggUEhZIFBvd2VyIGFuZCBSZXNldCBDb250cm9sIFJlZyAqLworI2RlZmluZSBTUl9DTURfU1dfUkVTRVQJCQkweDIwCisjZGVmaW5lCQlTUl9TV1JFU0VUX0NMRUFSCQkweDAwCisjZGVmaW5lCQlTUl9TV1JFU0VUX1JSCQkJKDEgPDwgMCkKKyNkZWZpbmUJCVNSX1NXUkVTRVRfUlQJCQkoMSA8PCAxKQorI2RlZmluZQkJU1JfU1dSRVNFVF9QUlRFCQkJKDEgPDwgMikKKyNkZWZpbmUJCVNSX1NXUkVTRVRfUFJMCQkJKDEgPDwgMykKKyNkZWZpbmUJCVNSX1NXUkVTRVRfQloJCQkoMSA8PCA0KQorI2RlZmluZQkJU1JfU1dSRVNFVF9JUFJMCQkJKDEgPDwgNSkKKyNkZWZpbmUJCVNSX1NXUkVTRVRfSVBQRAkJCSgxIDw8IDYpCisvKiBjb21tYW5kIDogU29mdHdhcmUgSW50ZXJmYWNlIFNlbGVjdGlvbiBTdGF0dXMgUmVhZCBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1NXX1BIWV9TVEFUVVMJCTB4MjEKKy8qIGNvbW1hbmQgOiBTb2Z0d2FyZSBJbnRlcmZhY2UgU2VsZWN0aW9uIFN0YXR1cyBXcml0ZSBSZWcgKi8KKyNkZWZpbmUgU1JfQ01EX1NXX1BIWV9TRUxFQ1QJCTB4MjIKKy8qIGNvbW1hbmQgOiBCVUxLIGluIEJ1ZmZlciBTaXplIFJlZyAqLworI2RlZmluZQlTUl9DTURfQlVMS0lOX1NJWkUJCTB4MkEKKy8qIGNvbW1hbmQgOiBMRURfTVVYIENvbnRyb2wgUmVnICovCisjZGVmaW5lCVNSX0NNRF9MRURfTVVYCQkJMHg3MAorI2RlZmluZQkJU1JfTEVEX01VWF9UWF9BQ1RJVkUJCSgxIDw8IDApCisjZGVmaW5lCQlTUl9MRURfTVVYX1JYX0FDVElWRQkJKDEgPDwgMSkKKyNkZWZpbmUJCVNSX0xFRF9NVVhfQ09MTElTSU9OCQkoMSA8PCAyKQorI2RlZmluZQkJU1JfTEVEX01VWF9EVVBfQ09MCQkoMSA8PCAzKQorI2RlZmluZQkJU1JfTEVEX01VWF9EVVAJCQkoMSA8PCA0KQorI2RlZmluZQkJU1JfTEVEX01VWF9TUEVFRAkJKDEgPDwgNSkKKyNkZWZpbmUJCVNSX0xFRF9NVVhfTElOS19BQ1RJVkUJCSgxIDw8IDYpCisjZGVmaW5lCQlTUl9MRURfTVVYX0xJTksJCQkoMSA8PCA3KQorCisvKiBSZWdpc3RlciBBY2Nlc3MgRmxhZ3MgKi8KKyNkZWZpbmUgU1JfUkVRX1JEX1JFRyAgIChVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSkKKyNkZWZpbmUgU1JfUkVRX1dSX1JFRyAgIChVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UpCisKKy8qIE11bHRpY2FzdCBGaWx0ZXIgQXJyYXkgc2l6ZSAmIE1heCBOdW1iZXIgKi8KKyNkZWZpbmUJU1JfTUNBU1RfRklMVEVSX1NJWkUJCTgKKyNkZWZpbmUJU1JfTUFYX01DQVNUCQkJNjQKKworLyogSVBHMC8xLzIgRGVmYXVsdCBWYWx1ZSAqLworI2RlZmluZQlTUjk4MDBfSVBHMF9ERUZBVUxUCQkweDE1CisjZGVmaW5lCVNSOTgwMF9JUEcxX0RFRkFVTFQJCTB4MGMKKyNkZWZpbmUJU1I5ODAwX0lQRzJfREVGQVVMVAkJMHgxMgorCisvKiBNZWRpdW0gU3RhdHVzIERlZmF1bHQgTW9kZSAqLworI2RlZmluZSBTUjk4MDBfTUVESVVNX0RFRkFVTFQJXAorCShTUl9NRURJVU1fRkQgfCBTUl9NRURJVU1fUkZDIHwgXAorCSBTUl9NRURJVU1fVEZDIHwgU1JfTUVESVVNX1BTIHwgXAorCSBTUl9NRURJVU1fQUMgfCBTUl9NRURJVU1fUkUpCisKKy8qIFJYIENvbnRyb2wgRGVmYXVsdCBTZXR0aW5nICovCisjZGVmaW5lIFNSX0RFRkFVTFRfUlhfQ1RMCVwKKwkoU1JfUlhfQ1RMX1NPIHwgU1JfUlhfQ1RMX0FCIHwgU1JfUlhfQ1RMX1JIMU0pCisKKy8qIEVFUFJPTSBNYWdpYyBOdW1iZXIgJiBFRVBST00gU2l6ZSAqLworI2RlZmluZSBTUl9FRVBST01fTUFHSUMJCQkweGRlYWRiZWVmCisjZGVmaW5lIFNSOTgwMF9FRVBST01fTEVOCQkweGZmCisKKy8qIFNSOTgwMCBEcml2ZXIgVmVyc2lvbiBhbmQgRHJpdmVyIE5hbWUgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCQkiMTEtTm92LTIwMTMiCisjZGVmaW5lIERSSVZFUl9OQU1FCQkJIkNvcmVDaGlwcyIKKyNkZWZpbmUJRFJJVkVSX0ZMQUcJCVwKKwkoRkxBR19FVEhFUiB8IEZMQUdfRlJBTUlOR19BWCB8IEZMQUdfTElOS19JTlRSIHwgIEZMQUdfTVVMVElfUEFDS0VUKQorCisvKiBTUjk4MDAgQlVMS0lOIEJ1ZmZlciBTaXplICovCisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzJLCQkwCisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzRLCQkxCisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzZLCQkyCisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzhLCQkzCisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzE2SwkJNAorI2RlZmluZSBTUjk4MDBfTUFYX0JVTEtJTl8yMEsJCTUKKyNkZWZpbmUgU1I5ODAwX01BWF9CVUxLSU5fMjRLCQk2CisjZGVmaW5lIFNSOTgwMF9NQVhfQlVMS0lOXzMySwkJNworCitzdHJ1Y3Qge3Vuc2lnbmVkIHNob3J0IHNpemUsIGJ5dGVfY250LCB0aHJlc2hvbGQ7IH0gU1I5ODAwX0JVTEtJTl9TSVpFW10gPSB7CisJLyogMmsgKi8KKwl7MjA0OCwgMHg4MDAwLCAweDgwMDF9LAorCS8qIDRrICovCisJezQwOTYsIDB4ODEwMCwgMHg4MTQ3fSwKKwkvKiA2ayAqLworCXs2MTQ0LCAweDgyMDAsIDB4ODFFQn0sCisJLyogOGsgKi8KKwl7ODE5MiwgMHg4MzAwLCAweDgzRDd9LAorCS8qIDE2ICovCisJezE2Mzg0LCAweDg0MDAsIDB4ODUxRX0sCisJLyogMjBrICovCisJezIwNDgwLCAweDg1MDAsIDB4ODY2Nn0sCisJLyogMjRrICovCisJezI0NTc2LCAweDg2MDAsIDB4ODdBRX0sCisJLyogMzJrICovCisJezMyNzY4LCAweDg3MDAsIDB4OEEzRH0sCit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBjYW5ub3QgZXhjZWVkIHNpemVvZih1bnNpZ25lZCBsb25nIFs1XSkgQUtBIDIwIGJ5dGVzICovCitzdHJ1Y3Qgc3JfZGF0YSB7CisJdTggbXVsdGlfZmlsdGVyW1NSX01DQVNUX0ZJTFRFUl9TSVpFXTsKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisJdTggcGh5bW9kZTsKKwl1OCBsZWRtb2RlOworCXU4IGVlcHJvbV9sZW47Cit9OworCitzdHJ1Y3Qgc3I5ODAwX2ludF9kYXRhIHsKKwlfX2xlMTYgcmVzMTsKKwl1OCBsaW5rOworCV9fbGUxNiByZXMyOworCXU4IHN0YXR1czsKKwlfX2xlMTYgcmVzMzsKK30gX19wYWNrZWQ7CisKKyNlbmRpZgkvKiBfU1I5ODAwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMgYi9kcml2ZXJzL25ldC92eGxhbi5jCmluZGV4IDAyNmEzMTMuLmIwZjcwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdnhsYW4uYwpAQCAtNDY5LDcgKzQ2OSw2IEBACiAvKiBMb29rIHVwIEV0aGVybmV0IGFkZHJlc3MgaW4gZm9yd2FyZGluZyB0YWJsZSAqLwogc3RhdGljIHN0cnVjdCB2eGxhbl9mZGIgKl9fdnhsYW5fZmluZF9tYWMoc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4sCiAJCQkJCWNvbnN0IHU4ICptYWMpCi0KIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9IHZ4bGFuX2ZkYl9oZWFkKHZ4bGFuLCBtYWMpOwogCXN0cnVjdCB2eGxhbl9mZGIgKmY7CkBAIC01OTYsMTAgKzU5NSw4IEBACiAJCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gMDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWdvdG8gZm91bmQ7CiAJfQogCi1mb3VuZDoKIAl0eXBlID0gZWgtPmhfcHJvdG87CiAKIAlyY3VfcmVhZF9sb2NrKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwppbmRleCAwZDFjNzU5Li4xOWY3Y2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMKQEAgLTcxLDEyICs3MSw5IEBACiAJCSAgICAgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQogewogCXN0cnVjdCBmcmhkcgkJaGRyOwotCXN0cnVjdCBkbGNpX2xvY2FsCSpkbHA7CiAJdW5zaWduZWQgaW50CQlobGVuOwogCWNoYXIJCQkqZGVzdDsKIAotCWRscCA9IG5ldGRldl9wcml2KGRldik7Ci0KIAloZHIuY29udHJvbCA9IEZSQURfSV9VSTsKIAlzd2l0Y2ggKHR5cGUpCiAJewpAQCAtMTA3LDExICsxMDQsOSBAQAogCiBzdGF0aWMgdm9pZCBkbGNpX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOwogCXN0cnVjdCBmcmhkcgkJKmhkcjsKIAlpbnQJCQkJCXByb2Nlc3MsIGhlYWRlcjsKIAotCWRscCA9IG5ldGRldl9wcml2KGRldik7CiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKSkgewogCQluZXRkZXZfbm90aWNlKGRldiwgImludmFsaWQgZGF0YSBubyBoZWFkZXJcbiIpOwogCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKaW5kZXggOGFhMjBkZi4uNTA3ZDlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCkBAIC0xNzY0LDcgKzE3NjQsNyBAQAogCUFSNTUyM19ERVZJQ0VfVUcoMHgwN2QxLCAweDNhMDcpLAkvKiBELUxpbmsgLyBXVUEtMjM0MCByZXYgQTEgKi8KIAlBUjU1MjNfREVWSUNFX1VHKDB4MTY5MCwgMHgwNzEyKSwJLyogR2lnYXNldCAvIEFSNTUyMyAqLwogCUFSNTUyM19ERVZJQ0VfVUcoMHgxNjkwLCAweDA3MTApLAkvKiBHaWdhc2V0IC8gU01DV1VTQlRHICovCi0JQVI1NTIzX0RFVklDRV9VRygweDEyOWIsIDB4MTYwYyksCS8qIEdpZ2FzZXQgLyBVU0Igc3RpY2sgMTA4CisJQVI1NTIzX0RFVklDRV9VRygweDEyOWIsIDB4MTYwYiksCS8qIEdpZ2FzZXQgLyBVU0Igc3RpY2sgMTA4CiAJCQkJCQkgICAoQ3liZXJUQU4gVGVjaG5vbG9neSkgKi8KIAlBUjU1MjNfREVWSUNFX1VHKDB4MTZhYiwgMHg3ODAxKSwJLyogR2xvYmFsc3VuIC8gQVI1NTIzXzEgKi8KIAlBUjU1MjNfREVWSUNFX1VYKDB4MTZhYiwgMHg3ODExKSwJLyogR2xvYmFsc3VuIC8gQVI1NTIzXzIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCmluZGV4IDI1MjQzY2IuLmI4ZGFmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwpAQCAtNTA2NSw2ICs1MDY1LDEwIEBACiAJCQlicmVhazsKIAkJfQogCX0KKworCWlmIChpczJHSHogJiYgIXR3aWNlTWF4RWRnZVBvd2VyKQorCQl0d2ljZU1heEVkZ2VQb3dlciA9IDYwOworCiAJcmV0dXJuIHR3aWNlTWF4RWRnZVBvd2VyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjLmgKaW5kZXggNThkYTM0Ni4uOTlhMjAzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGMuaApAQCAtMjYyLDYgKzI2Miw4IEBACiBzdHJ1Y3QgYXRoOWtfaHRjX3N0YSB7CiAJdTggaW5kZXg7CiAJZW51bSB0aWRfYWdncl9zdGF0ZSB0aWRfc3RhdGVbQVRIOUtfSFRDX01BWF9USURdOworCXN0cnVjdCB3b3JrX3N0cnVjdCByY191cGRhdGVfd29yazsKKwlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKmh0Y19wcml2OwogfTsKIAogI2RlZmluZSBBVEg5S19IVENfUlhCVUYgMjU2CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMKaW5kZXggZjRlMWRlMi4uYzU3ZDZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYwpAQCAtMzQsNiArMzQsMTAgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChidGNvZXhfZW5hYmxlLCBhdGg5a19odGNfYnRjb2V4X2VuYWJsZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYnRjb2V4X2VuYWJsZSwgIkVuYWJsZSB3aWZpLUJUIGNvZXhpc3RlbmNlIik7CiAKK3N0YXRpYyBpbnQgYXRoOWtfcHNfZW5hYmxlOworbW9kdWxlX3BhcmFtX25hbWVkKHBzX2VuYWJsZSwgYXRoOWtfcHNfZW5hYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwc19lbmFibGUsICJFbmFibGUgV0xBTiBQb3dlclNhdmUiKTsKKwogI2RlZmluZSBDSEFOMkcoX2ZyZXEsIF9pZHgpICB7IFwKIAkuY2VudGVyX2ZyZXEgPSAoX2ZyZXEpLCBcCiAJLmh3X3ZhbHVlID0gKF9pZHgpLCBcCkBAIC03MjUsMTIgKzcyOSwxNCBAQAogCQlJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8CiAJCUlFRUU4MDIxMV9IV19IQVNfUkFURV9DT05UUk9MIHwKIAkJSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8Ci0JCUlFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CiAJCUlFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSyB8CiAJCUlFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVMgfAogCQlJRUVFODAyMTFfSFdfTUZQX0NBUEFCTEUgfAogCQlJRUVFODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HOwogCisJaWYgKGF0aDlrX3BzX2VuYWJsZSkKKwkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUzsKKwogCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KIAkJQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKIAkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKaW5kZXggNjA4ZDczOS4uYzkyNTRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYwpAQCAtMTI3MCwxOCArMTI3MCw1MCBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCBhdGg5a19odGNfc3RhX3JjX3VwZGF0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqaXN0YSA9CisJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoOWtfaHRjX3N0YSwgcmNfdXBkYXRlX3dvcmspOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPQorCSAgICBjb250YWluZXJfb2YoKHZvaWQgKilpc3RhLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSwgZHJ2X3ByaXYpOworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGlzdGEtPmh0Y19wcml2OworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24ocHJpdi0+YWgpOworCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUgdHJhdGU7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKKworCW1lbXNldCgmdHJhdGUsIDAsIHNpemVvZihzdHJ1Y3QgYXRoOWtfaHRjX3RhcmdldF9yYXRlKSk7CisJYXRoOWtfaHRjX3NldHVwX3JhdGUocHJpdiwgc3RhLCAmdHJhdGUpOworCWlmICghYXRoOWtfaHRjX3NlbmRfcmF0ZV9jbWQocHJpdiwgJnRyYXRlKSkKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKKwkJCSJTdXBwb3J0ZWQgcmF0ZXMgZm9yIHN0YTogJXBNIHVwZGF0ZWQsIHJhdGUgY2FwczogMHglWFxuIiwKKwkJCXN0YS0+YWRkciwgYmUzMl90b19jcHUodHJhdGUuY2FwZmxhZ3MpKTsKKwllbHNlCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCisJCQkiVW5hYmxlIHRvIHVwZGF0ZSBzdXBwb3J0ZWQgcmF0ZXMgZm9yIHN0YTogJXBNXG4iLAorCQkJc3RhLT5hZGRyKTsKKworCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworfQorCiBzdGF0aWMgaW50IGF0aDlrX2h0Y19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg5a19odGNfc3RhICppc3RhID0gKHN0cnVjdCBhdGg5a19odGNfc3RhICopIHN0YS0+ZHJ2X3ByaXY7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCXJldCA9IGF0aDlrX2h0Y19hZGRfc3RhdGlvbihwcml2LCB2aWYsIHN0YSk7Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJSU5JVF9XT1JLKCZpc3RhLT5yY191cGRhdGVfd29yaywgYXRoOWtfaHRjX3N0YV9yY191cGRhdGVfd29yayk7CisJCWlzdGEtPmh0Y19wcml2ID0gcHJpdjsKIAkJYXRoOWtfaHRjX2luaXRfcmF0ZShwcml2LCBzdGEpOworCX0KIAlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIApAQCAtMTI5MywxMiArMTMyNSwxMyBAQAogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aDlrX2h0Y19zdGEgKmlzdGE7CisJc3RydWN0IGF0aDlrX2h0Y19zdGEgKmlzdGEgPSAoc3RydWN0IGF0aDlrX2h0Y19zdGEgKikgc3RhLT5kcnZfcHJpdjsKIAlpbnQgcmV0OwogCisJY2FuY2VsX3dvcmtfc3luYygmaXN0YS0+cmNfdXBkYXRlX3dvcmspOworCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCWF0aDlrX2h0Y19wc193YWtldXAocHJpdik7Ci0JaXN0YSA9IChzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqKSBzdGEtPmRydl9wcml2OwogCWh0Y19zdGFfZHJhaW4ocHJpdi0+aHRjLCBpc3RhLT5pbmRleCk7CiAJcmV0ID0gYXRoOWtfaHRjX3JlbW92ZV9zdGF0aW9uKHByaXYsIHZpZiwgc3RhKTsKIAlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKQEAgLTEzMTEsMjggKzEzNDQsMTIgQEAKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGNoYW5nZWQpCiB7Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCk7Ci0Jc3RydWN0IGF0aDlrX2h0Y190YXJnZXRfcmF0ZSB0cmF0ZTsKKwlzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqaXN0YSA9IChzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqKSBzdGEtPmRydl9wcml2OwogCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWF0aDlrX2h0Y19wc193YWtldXAocHJpdik7CisJaWYgKCEoY2hhbmdlZCAmIElFRUU4MDIxMV9SQ19TVVBQX1JBVEVTX0NIQU5HRUQpKQorCQlyZXR1cm47CiAKLQlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9SQ19TVVBQX1JBVEVTX0NIQU5HRUQpIHsKLQkJbWVtc2V0KCZ0cmF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUpKTsKLQkJYXRoOWtfaHRjX3NldHVwX3JhdGUocHJpdiwgc3RhLCAmdHJhdGUpOwotCQlpZiAoIWF0aDlrX2h0Y19zZW5kX3JhdGVfY21kKHByaXYsICZ0cmF0ZSkpCi0JCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAotCQkJCSJTdXBwb3J0ZWQgcmF0ZXMgZm9yIHN0YTogJXBNIHVwZGF0ZWQsIHJhdGUgY2FwczogMHglWFxuIiwKLQkJCQlzdGEtPmFkZHIsIGJlMzJfdG9fY3B1KHRyYXRlLmNhcGZsYWdzKSk7Ci0JCWVsc2UKLQkJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCi0JCQkJIlVuYWJsZSB0byB1cGRhdGUgc3VwcG9ydGVkIHJhdGVzIGZvciBzdGE6ICVwTVxuIiwKLQkJCQlzdGEtPmFkZHIpOwotCX0KLQotCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCXNjaGVkdWxlX3dvcmsoJmlzdGEtPnJjX3VwZGF0ZV93b3JrKTsKIH0KIAogc3RhdGljIGludCBhdGg5a19odGNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKaW5kZXggZmJmNDNjMC4uMTFlYWI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKQEAgLTEzMTYsNyArMTMxNiw3IEBACiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCiAJCXVkZWxheSg1MCk7CiAJZWxzZSBpZiAoQVJfU1JFVl85MTAwKGFoKSkKLQkJdWRlbGF5KDEwMDAwKTsKKwkJbWRlbGF5KDEwKTsKIAllbHNlCiAJCXVkZWxheSgxMDApOwogCkBAIC0yMDUxLDkgKzIwNTEsOCBAQAogCiAJUkVHX1NFVF9CSVQoYWgsIEFSX1JUQ19GT1JDRV9XQUtFLAogCQkgICAgQVJfUlRDX0ZPUkNFX1dBS0VfRU4pOwotCiAJaWYgKEFSX1NSRVZfOTEwMChhaCkpCi0JCXVkZWxheSgxMDAwMCk7CisJCW1kZWxheSgxMCk7CiAJZWxzZQogCQl1ZGVsYXkoNTApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwppbmRleCBjMzZkZTMwLi4xZmMyZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKQEAgLTU3LDYgKzU3LDEwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoYnRfYW50X2RpdmVyc2l0eSwgYXRoOWtfYnRfYW50X2RpdmVyc2l0eSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYnRfYW50X2RpdmVyc2l0eSwgIkVuYWJsZSBXTEFOL0JUIFJYIGFudGVubmEgZGl2ZXJzaXR5Iik7CiAKK3N0YXRpYyBpbnQgYXRoOWtfcHNfZW5hYmxlOworbW9kdWxlX3BhcmFtX25hbWVkKHBzX2VuYWJsZSwgYXRoOWtfcHNfZW5hYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwc19lbmFibGUsICJFbmFibGUgV0xBTiBQb3dlclNhdmUiKTsKKwogYm9vbCBpc19hdGg5a191bmxvYWRlZDsKIC8qIFdlIHVzZSB0aGUgaHdfdmFsdWUgYXMgYW4gaW5kZXggaW50byBvdXIgcHJpdmF0ZSBjaGFubmVsIHN0cnVjdHVyZSAqLwogCkBAIC05MDMsMTMgKzkwNywxNSBAQAogCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAogCQlJRUVFODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HIHwKIAkJSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAotCQlJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAogCQlJRUVFODAyMTFfSFdfUFNfTlVMTEZVTkNfU1RBQ0sgfAogCQlJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8CiAJCUlFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVMgfAogCQlJRUVFODAyMTFfSFdfU1VQUE9SVFNfUkNfVEFCTEUgfAogCQlJRUVFODAyMTFfSFdfU1VQUE9SVFNfSFRfQ0NLX1JBVEVTOwogCisJaWYgKGF0aDlrX3BzX2VuYWJsZSkKKwkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUzsKKwogCWlmIChzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9IVCkgewogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5jCmluZGV4IGYwNmY0Y2IuLjcyNWU5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5jCkBAIC0xODIsNiArMTgyLDExIEBACiAKIAlmb3IgKGNoX2lkeCA9IDA7IGNoX2lkeCA8IElXTF9OVU1fQ0hBTk5FTFM7IGNoX2lkeCsrKSB7CiAJCWNoX2ZsYWdzID0gX19sZTE2X3RvX2NwdXAobnZtX2NoX2ZsYWdzICsgY2hfaWR4KTsKKworCQlpZiAoY2hfaWR4ID49IE5VTV8yR0haX0NIQU5ORUxTICYmCisJCSAgICAhZGF0YS0+c2t1X2NhcF9iYW5kXzUyR0h6X2VuYWJsZSkKKwkJCWNoX2ZsYWdzICY9IH5OVk1fQ0hBTk5FTF9WQUxJRDsKKwogCQlpZiAoIShjaF9mbGFncyAmIE5WTV9DSEFOTkVMX1ZBTElEKSkgewogCQkJSVdMX0RFQlVHX0VFUFJPTShkZXYsCiAJCQkJCSAiQ2guICVkIEZsYWdzICV4IFslc0dIel0gLSBObyB0cmFmZmljXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmgKaW5kZXggNzNjYmJhNy4uOTQyNjkwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCkBAIC01MDQsNiArNTA0LDcgQEAKICAqIEBtYXRjaF9ub3RpZnk6CWNsaWVudHMgd2FpdGluZyBmb3IgbWF0Y2ggZm91bmQgbm90aWZpY2F0aW9uCiAgKiBAcGFzc19tYXRjaDoJCWNsaWVudHMgd2FpdGluZyBmb3IgdGhlIHJlc3VsdHMKICAqIEBhY3RpdmVfY2xpZW50czoJYWN0aXZlIGNsaWVudHMgYml0bWFwIC0gZW51bSBzY2FuX2ZyYW1ld29ya19jbGllbnQKKyAqIEBhbnlfYmVhY29uX25vdGlmeToJY2xpZW50cyB3YWl0aW5nIGZvciBtYXRjaCBub3RpZmljYXRpb24gd2l0aG91dCBtYXRjaAogICovCiBzdHJ1Y3QgaXdsX3NjYW5fb2ZmbG9hZF9wcm9maWxlX2NmZyB7CiAJc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfcHJvZmlsZSBwcm9maWxlc1tJV0xfU0NBTl9NQVhfUFJPRklMRVNdOwpAQCAtNTEyLDcgKzUxMyw4IEBACiAJdTggbWF0Y2hfbm90aWZ5OwogCXU4IHBhc3NfbWF0Y2g7CiAJdTggYWN0aXZlX2NsaWVudHM7Ci0JdTggcmVzZXJ2ZWRbM107CisJdTggYW55X2JlYWNvbl9ub3RpZnk7CisJdTggcmVzZXJ2ZWRbMl07CiB9IF9fcGFja2VkOwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tYWM4MDIxMS5jCmluZGV4IGM0OWI1MDcuLjZiZjk3NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjODAyMTEuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJZWxzZQogCQlody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfU0NIRURfU0NBTikgeworCWlmICgwICYmIG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX1NDSEVEX1NDQU4pIHsKIAkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NVUFBPUlRTX1NDSEVEX1NDQU47CiAJCWh3LT53aXBoeS0+bWF4X3NjaGVkX3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYOwogCQlody0+d2lwaHktPm1heF9tYXRjaF9zZXRzID0gSVdMX1NDQU5fTUFYX1BST0ZJTEVTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2Nhbi5jCmluZGV4IDBlMDAwNzkuLjc0MmFmYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zY2FuLmMKQEAgLTM0NCw3ICszNDQsOCBAQAogCiAJaXdsX212bV9zY2FuX2ZpbGxfc3NpZHMoY21kLCByZXEsIGJhc2ljX3NzaWQgPyAxIDogMCk7CiAKLQljbWQtPnR4X2NtZC50eF9mbGFncyA9IGNwdV90b19sZTMyKFRYX0NNRF9GTEdfU0VRX0NUTCk7CisJY21kLT50eF9jbWQudHhfZmxhZ3MgPSBjcHVfdG9fbGUzMihUWF9DTURfRkxHX1NFUV9DVEwgfAorCQkJCQkgICBUWF9DTURfRkxHX0JUX0RJUyk7CiAJY21kLT50eF9jbWQuc3RhX2lkID0gbXZtLT5hdXhfc3RhLnN0YV9pZDsKIAljbWQtPnR4X2NtZC5saWZlX3RpbWUgPSBjcHVfdG9fbGUzMihUWF9DTURfTElGRV9USU1FX0lORklOSVRFKTsKIAljbWQtPnR4X2NtZC5yYXRlX25fZmxhZ3MgPQpAQCAtODA3LDYgKzgwOCw4IEBACiAJcHJvZmlsZV9jZmctPmFjdGl2ZV9jbGllbnRzID0gU0NBTl9DTElFTlRfU0NIRURfU0NBTjsKIAlwcm9maWxlX2NmZy0+cGFzc19tYXRjaCA9IFNDQU5fQ0xJRU5UX1NDSEVEX1NDQU47CiAJcHJvZmlsZV9jZmctPm1hdGNoX25vdGlmeSA9IFNDQU5fQ0xJRU5UX1NDSEVEX1NDQU47CisJaWYgKCFyZXEtPm5fbWF0Y2hfc2V0cyB8fCAhcmVxLT5tYXRjaF9zZXRzWzBdLnNzaWQuc3NpZF9sZW4pCisJCXByb2ZpbGVfY2ZnLT5hbnlfYmVhY29uX25vdGlmeSA9IFNDQU5fQ0xJRU5UX1NDSEVEX1NDQU47CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX21hdGNoX3NldHM7IGkrKykgewogCQlwcm9maWxlID0gJnByb2ZpbGVfY2ZnLT5wcm9maWxlc1tpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmMKaW5kZXggZWMxODEyMS4uMzM5N2Y1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmMKQEAgLTY1Miw3ICs2NTIsNyBAQAogewogCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwogCXN0YXRpYyBjb25zdCB1OCBfYmFkZHJbXSA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKLQlzdGF0aWMgY29uc3QgdTggKmJhZGRyID0gX2JhZGRyOworCWNvbnN0IHU4ICpiYWRkciA9IF9iYWRkcjsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHguYwppbmRleCA5MDM3OGMyLi40ZGYxMmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3R4LmMKQEAgLTY1OSw4ICs2NTksMTQgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlzdGEgPSByY3VfZGVyZWZlcmVuY2UobXZtLT5md19pZF90b19tYWNfaWRbc3RhX2lkXSk7CisJLyoKKwkgKiBzdGEgY2FuJ3QgYmUgTlVMTCBvdGhlcndpc2UgaXQnZCBtZWFuIHRoYXQgdGhlIHN0YSBoYXMgYmVlbiBmcmVlZCBpbgorCSAqIHRoZSBmaXJtd2FyZSB3aGlsZSB3ZSBzdGlsbCBoYXZlIHBhY2tldHMgZm9yIGl0IGluIHRoZSBUeCBxdWV1ZXMuCisJICovCisJaWYgKFdBUk5fT05fT05DRSghc3RhKSkKKwkJZ290byBvdXQ7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0YSkpIHsKKwlpZiAoIUlTX0VSUihzdGEpKSB7CiAJCW12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKTsKIAogCQlpZiAodGlkICE9IElXTF9USURfTk9OX1FPUykgewpAQCAtNjc1LDcgKzY4MSw2IEBACiAJCQlzcGluX3VubG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXN0YSA9IE5VTEw7CiAJCW12bXN0YSA9IE5VTEw7CiAJfQogCkBAIC02ODMsNDIgKzY4OCwzOCBAQAogCSAqIElmIHRoZSB0eHEgaXMgbm90IGFuIEFNUERVIHF1ZXVlLCB0aGVyZSBpcyBubyBjaGFuY2Ugd2UgZnJlZWQKIAkgKiBzZXZlcmFsIHNrYnMuIENoZWNrIHRoYXQgb3V0Li4uCiAJICovCi0JaWYgKHR4cV9pZCA8IG12bS0+Zmlyc3RfYWdnX3F1ZXVlICYmICFXQVJOX09OKHNrYl9mcmVlZCA+IDEpICYmCi0JICAgIGF0b21pY19zdWJfYW5kX3Rlc3Qoc2tiX2ZyZWVkLCAmbXZtLT5wZW5kaW5nX2ZyYW1lc1tzdGFfaWRdKSkgewotCQlpZiAobXZtc3RhKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZnJhbWVzIGZvciB0aGlzIFNUQSwgbm90aWZ5Ci0JCQkgKiBtYWM4MDIxMSB0aGF0IHRoaXMgc3RhdGlvbiBjYW4gZ28gdG8gc2xlZXAgaW4gaXRzCi0JCQkgKiBTVEEgdGFibGUuCi0JCQkgKi8KLQkJCWlmIChtdm1zdGEtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKLQkJCQlpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKG12bS0+aHcsIHN0YSwgZmFsc2UpOwotCQkJLyoKLQkJCSAqIFdlIG1pZ2h0IHZlcnkgd2VsbCBoYXZlIHRha2VuIG12bXN0YSBwb2ludGVyIHdoaWxlCi0JCQkgKiB0aGUgc3RhdGlvbiB3YXMgYmVpbmcgcmVtb3ZlZC4gVGhlIHJlbW92ZSBmbG93IG1pZ2h0Ci0JCQkgKiBoYXZlIHNlZW4gYSBwZW5kaW5nX2ZyYW1lIChiZWNhdXNlIHdlIGRpZG4ndCB0YWtlCi0JCQkgKiB0aGUgbG9jaykgZXZlbiBpZiBub3cgdGhlIHF1ZXVlcyBhcmUgZHJhaW5lZC4gU28gbWFrZQotCQkJICogcmVhbGx5IHN1cmUgbm93IHRoYXQgdGhpcyB0aGUgc3RhdGlvbiBpcyBub3QgYmVpbmcKLQkJCSAqIHJlbW92ZWQuIElmIGl0IGlzLCBydW4gdGhlIGRyYWluIHdvcmtlciB0byByZW1vdmUgaXQuCi0JCQkgKi8KLQkJCXNwaW5fbG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKLQkJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZShtdm0tPmZ3X2lkX3RvX21hY19pZFtzdGFfaWRdKTsKLQkJCWlmICghc3RhIHx8IFBUUl9FUlIoc3RhKSA9PSAtRUJVU1kpIHsKLQkJCQkvKgotCQkJCSAqIFN0YXRpb24gZGlzYXBwZWFyZWQgaW4gdGhlIG1lYW50aW1lOgotCQkJCSAqIHNvIHdlIGFyZSBkcmFpbmluZy4KLQkJCQkgKi8KLQkJCQlzZXRfYml0KHN0YV9pZCwgbXZtLT5zdGFfZHJhaW5lZCk7Ci0JCQkJc2NoZWR1bGVfd29yaygmbXZtLT5zdGFfZHJhaW5lZF93ayk7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKLQkJfSBlbHNlIGlmICghbXZtc3RhICYmIFBUUl9FUlIoc3RhKSA9PSAtRUJVU1kpIHsKLQkJCS8qIFR4IHJlc3BvbnNlIHdpdGhvdXQgU1RBLCBzbyB3ZSBhcmUgZHJhaW5pbmcgKi8KLQkJCXNldF9iaXQoc3RhX2lkLCBtdm0tPnN0YV9kcmFpbmVkKTsKLQkJCXNjaGVkdWxlX3dvcmsoJm12bS0+c3RhX2RyYWluZWRfd2spOwotCQl9CisJaWYgKHR4cV9pZCA+PSBtdm0tPmZpcnN0X2FnZ19xdWV1ZSkKKwkJZ290byBvdXQ7CisKKwkvKiBXZSBjYW4ndCBmcmVlIG1vcmUgdGhhbiBvbmUgZnJhbWUgYXQgb25jZSBvbiBhIHNoYXJlZCBxdWV1ZSAqLworCVdBUk5fT04oc2tiX2ZyZWVkID4gMSk7CisKKwkvKiBJZiB3ZSBoYXZlIHN0aWxsIGZyYW1lcyBmcm9tIHRoaXMgU1RBIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCWlmICghYXRvbWljX3N1Yl9hbmRfdGVzdChza2JfZnJlZWQsICZtdm0tPnBlbmRpbmdfZnJhbWVzW3N0YV9pZF0pKQorCQlnb3RvIG91dDsKKworCWlmIChtdm1zdGEgJiYgbXZtc3RhLT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZnJhbWVzIGZvciB0aGlzIFNUQSwgbm90aWZ5CisJCSAqIG1hYzgwMjExIHRoYXQgdGhpcyBzdGF0aW9uIGNhbiBnbyB0byBzbGVlcCBpbiBpdHMKKwkJICogU1RBIHRhYmxlLgorCQkgKiBJZiBtdm1zdGEgaXMgbm90IE5VTEwsIHN0YSBpcyB2YWxpZC4KKwkJICovCisJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UobXZtLT5odywgc3RhLCBmYWxzZSk7CiAJfQogCisJaWYgKFBUUl9FUlIoc3RhKSA9PSAtRUJVU1kgfHwgUFRSX0VSUihzdGEpID09IC1FTk9FTlQpIHsKKwkJLyoKKwkJICogV2UgYXJlIGRyYWluaW5nIGFuZCB0aGlzIHdhcyB0aGUgbGFzdCBwYWNrZXQgLSBwcmVfcmN1X3JlbW92ZQorCQkgKiBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeS4gV2UgbWlnaHQgYmUgYWZ0ZXIgdGhlCisJCSAqIHN5bmNocm9uaXplX25ldCBhbHJlYWR5LgorCQkgKiBEb24ndCByZWx5IG9uIGl3bF9tdm1fcm1fc3RhIHRvIHNlZSB0aGUgZW1wdHkgVHggcXVldWVzLgorCQkgKi8KKwkJc2V0X2JpdChzdGFfaWQsIG12bS0+c3RhX2RyYWluZWQpOworCQlzY2hlZHVsZV93b3JrKCZtdm0tPnN0YV9kcmFpbmVkX3drKTsKKwl9CisKK291dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3V0aWxzLmMKaW5kZXggYTRhNWUyNS4uODY5ODlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS91dGlscy5jCkBAIC00MTEsNiArNDExLDggQEAKIAkJCW12bS0+c3RhdHVzLCB0YWJsZS52YWxpZCk7CiAJfQogCisJSVdMX0VSUihtdm0sICJMb2FkZWQgZmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIG12bS0+ZnctPmZ3X3ZlcnNpb24pOworCiAJdHJhY2VfaXdsd2lmaV9kZXZfdWNvZGVfZXJyb3IodHJhbnMtPmRldiwgdGFibGUuZXJyb3JfaWQsIHRhYmxlLnRzZl9sb3csCiAJCQkJICAgICAgdGFibGUuZGF0YTEsIHRhYmxlLmRhdGEyLCB0YWJsZS5kYXRhMywKIAkJCQkgICAgICB0YWJsZS5ibGluazEsIHRhYmxlLmJsaW5rMiwgdGFibGUuaWxpbmsxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL2Rydi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL2Rydi5jCmluZGV4IDMwNDA5MjQuLmY0N2JjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9kcnYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvZHJ2LmMKQEAgLTM1OSwyMCArMzU5LDI1IEBACiAvKiA3MjY1IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4NTAxMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1MTEwLCBpd2w3MjY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDUxMTIsIGl3bDcyNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4NTEwMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1MTBBLCBpd2w3MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVCLCAweDUzMTAsIGl3bDcyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA5NUIsIDB4NTMwMiwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QiwgMHg1MjEwLCBpd2w3MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDUwMTIsIGl3bDcyNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4NTAwQSwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1NDEwLCBpd2w3MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDU0MDAsIGl3bDcyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4MTAxMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1MDAwLCBpd2w3MjY1XzJuX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4NTAwQSwgaXdsNzI2NV8ybl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVCLCAweDUyMDAsIGl3bDcyNjVfMm5fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1MDAyLCBpd2w3MjY1X25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QiwgMHg1MjAyLCBpd2w3MjY1X25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg5MDEwLCBpd2w3MjY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDkwMTIsIGl3bDcyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4OTExMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg5MTEyLCBpd2w3MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDkyMTAsIGl3bDcyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4OTUxMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg5MzEwLCBpd2w3MjY1XzJhY19jZmcpfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYwppbmRleCBhYmM1ZjU2Li4yZjFjZDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5jCkBAIC0xODc3LDYgKzE4NzcsMTEgQEAKIAkJCQkJCSAgIEVFUFJPTV9NQUNfQUREUl8wKSk7CiAKIAkvKgorCSAqIERpc2FibGUgcG93ZXJzYXZpbmcgYXMgZGVmYXVsdC4KKwkgKi8KKwlydDJ4MDBkZXYtPmh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKKworCS8qCiAJICogSW5pdGlhbGl6ZSBod19tb2RlIGluZm9ybWF0aW9uLgogCSAqLwogCXNwZWMtPnN1cHBvcnRlZF9iYW5kcyA9IFNVUFBPUlRfQkFORF8yR0haOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCmluZGV4IDlmMTY4MjQuLmQ4NDlkNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKQEAgLTE3MDYsNiArMTcwNiwxMSBAQAogCSAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAogCSAgICBJRUVFODAyMTFfSFdfUFNfTlVMTEZVTkNfU1RBQ0s7CiAKKwkvKgorCSAqIERpc2FibGUgcG93ZXJzYXZpbmcgYXMgZGVmYXVsdC4KKwkgKi8KKwlydDJ4MDBkZXYtPmh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKKwogCVNFVF9JRUVFODAyMTFfREVWKHJ0MngwMGRldi0+aHcsIHJ0MngwMGRldi0+ZGV2KTsKIAlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihydDJ4MDBkZXYtPmh3LAogCQkJCXJ0MngwMF9lZXByb21fYWRkcihydDJ4MDBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKaW5kZXggYjhmNWIwNi4uN2Y4YjVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtNzQ1OCwxMCArNzQ1OCw5IEBACiAJdTMyIHJlZzsKIAogCS8qCi0JICogRGlzYWJsZSBwb3dlcnNhdmluZyBhcyBkZWZhdWx0IG9uIFBDSSBkZXZpY2VzLgorCSAqIERpc2FibGUgcG93ZXJzYXZpbmcgYXMgZGVmYXVsdC4KIAkgKi8KLQlpZiAocnQyeDAwX2lzX3BjaShydDJ4MDBkZXYpIHx8IHJ0MngwMF9pc19zb2MocnQyeDAwZGV2KSkKLQkJcnQyeDAwZGV2LT5ody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CisJcnQyeDAwZGV2LT5ody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgYWxsIGh3IGZpZWxkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYwppbmRleCA4ZWMxN2FhLi4zODY3ZDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwL2Rldi5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAlzdHJ1Y3QgcnRsODE4MF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDMyOwogCXU4IHNpZ25hbCwgYWdjLCBzcTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CiAKIAl3aGlsZSAoY291bnQtLSkgewogCQlzdHJ1Y3QgcnRsODE4MF9yeF9kZXNjICplbnRyeSA9ICZwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X2lkeF07CkBAIC0xMjgsNiArMTI5LDE3IEBACiAJCQlpZiAodW5saWtlbHkoIW5ld19za2IpKQogCQkJCWdvdG8gZG9uZTsKIAorCQkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSAgICAgICBza2JfdGFpbF9wb2ludGVyKG5ld19za2IpLAorCQkJCQkgICAgICAgTUFYX1JYX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGRldiwgbWFwcGluZykpIHsKKwkJCQlrZnJlZV9za2IobmV3X3NrYik7CisJCQkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LCAiUlggRE1BIG1hcCBlcnJvclxuIik7CisKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKIAkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKIAkJCQkJICooKGRtYV9hZGRyX3QgKilza2ItPmNiKSwKIAkJCQkJIE1BWF9SWF9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTU4LDkgKzE3MCw3IEBACiAKIAkJCXNrYiA9IG5ld19za2I7CiAJCQlwcml2LT5yeF9idWZbcHJpdi0+cnhfaWR4XSA9IHNrYjsKLQkJCSooKGRtYV9hZGRyX3QgKikgc2tiLT5jYikgPQotCQkJCXBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKLQkJCQkJICAgICAgIE1BWF9SWF9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSA9IG1hcHBpbmc7CiAJCX0KIAogCWRvbmU6CkBAIC0yNjYsNiArMjc2LDEzIEBACiAJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wZGV2LCBtYXBwaW5nKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LCAiVFggRE1BIG1hcHBpbmcgZXJyb3JcbiIpOworCQlyZXR1cm47CisKKwl9CisKIAl0eF9mbGFncyA9IFJUTDgxOFhfVFhfREVTQ19GTEFHX09XTiB8IFJUTDgxOFhfVFhfREVTQ19GTEFHX0ZTIHwKIAkJICAgUlRMODE4WF9UWF9ERVNDX0ZMQUdfTFMgfAogCQkgICAoaWVlZTgwMjExX2dldF90eF9yYXRlKGRldiwgaW5mbyktPmh3X3ZhbHVlIDw8IDI0KSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCmluZGV4IDRjNzZiY2IuLmFlNDEzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCkBAIC0xNDMsMTEgKzE0Myw3IEBACiAJY2hhciByeF9pcnFfbmFtZVtJRk5BTVNJWis0XTsgLyogREVWTkFNRS1yeCAqLwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfYmFja19yaW5nIHJ4OwogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfcXVldWU7Ci0JYm9vbCByeF9xdWV1ZV9zdG9wcGVkOwotCS8qIFNldCB3aGVuIHRoZSBSWCBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBmcm9udGVuZC4KLQkgKiBUaGUgd29ya2VyIHRocmVhZCBtYXkgbmVlZCB0byB3YWtlIHRoZSBxdWV1ZS4KLQkgKi8KLQlib29sIHJ4X2V2ZW50OworCVJJTkdfSURYIHJ4X2xhc3Rfc2tiX3Nsb3RzOwogCiAJLyogVGhpcyBhcnJheSBpcyBhbGxvY2F0ZWQgc2VwZXJhdGVseSBhcyBpdCBpcyBsYXJnZSAqLwogCXN0cnVjdCBnbnR0YWJfY29weSAqZ3JhbnRfY29weV9vcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKaW5kZXggYjlkZTMxZS4uNzY2OWQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogewogCXN0cnVjdCB4ZW52aWYgKnZpZiA9IGRldl9pZDsKIAotCXZpZi0+cnhfZXZlbnQgPSB0cnVlOwogCXhlbnZpZl9raWNrX3RocmVhZCh2aWYpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IDZiNjJjM2UuLmU1Mjg0YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTQ3Niw3ICs0NzYsNiBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXN0cnVjdCBza2JfY2Jfb3ZlcmxheSAqc2NvOwogCWJvb2wgbmVlZF90b19ub3RpZnkgPSBmYWxzZTsKLQlib29sIHJpbmdfZnVsbCA9IGZhbHNlOwogCiAJc3RydWN0IG5ldHJ4X3BlbmRpbmdfb3BlcmF0aW9ucyBucG8gPSB7CiAJCS5jb3B5ICA9IHZpZi0+Z3JhbnRfY29weV9vcCwKQEAgLTQ4Niw3ICs0ODUsNyBAQAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnJ4cSk7CiAKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ2aWYtPnJ4X3F1ZXVlKSkgIT0gTlVMTCkgewotCQlpbnQgbWF4X3Nsb3RzX25lZWRlZDsKKwkJUklOR19JRFggbWF4X3Nsb3RzX25lZWRlZDsKIAkJaW50IGk7CiAKIAkJLyogV2UgbmVlZCBhIGNoZWFwIHdvcnNlIGNhc2UgZXN0aW1hdGUgZm9yIHRoZSBudW1iZXIgb2YKQEAgLTUwOSw5ICs1MDgsMTAgQEAKIAkJaWYgKCF4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUodmlmLCBtYXhfc2xvdHNfbmVlZGVkKSkgewogCQkJc2tiX3F1ZXVlX2hlYWQoJnZpZi0+cnhfcXVldWUsIHNrYik7CiAJCQluZWVkX3RvX25vdGlmeSA9IHRydWU7Ci0JCQlyaW5nX2Z1bGwgPSB0cnVlOworCQkJdmlmLT5yeF9sYXN0X3NrYl9zbG90cyA9IG1heF9zbG90c19uZWVkZWQ7CiAJCQlicmVhazsKLQkJfQorCQl9IGVsc2UKKwkJCXZpZi0+cnhfbGFzdF9za2Jfc2xvdHMgPSAwOwogCiAJCXNjbyA9IChzdHJ1Y3Qgc2tiX2NiX292ZXJsYXkgKilza2ItPmNiOwogCQlzY28tPm1ldGFfc2xvdHNfdXNlZCA9IHhlbnZpZl9nb3Bfc2tiKHNrYiwgJm5wbyk7CkBAIC01MjIsOCArNTIyLDYgQEAKIAogCUJVR19PTihucG8ubWV0YV9wcm9kID4gQVJSQVlfU0laRSh2aWYtPm1ldGEpKTsKIAotCXZpZi0+cnhfcXVldWVfc3RvcHBlZCA9ICFucG8uY29weV9wcm9kICYmIHJpbmdfZnVsbDsKLQogCWlmICghbnBvLmNvcHlfcHJvZCkKIAkJZ290byBkb25lOwogCkBAIC0xNDczLDggKzE0NzEsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCByeF93b3JrX3RvZG8oc3RydWN0IHhlbnZpZiAqdmlmKQogewotCXJldHVybiAoIXNrYl9xdWV1ZV9lbXB0eSgmdmlmLT5yeF9xdWV1ZSkgJiYgIXZpZi0+cnhfcXVldWVfc3RvcHBlZCkgfHwKLQkJdmlmLT5yeF9ldmVudDsKKwlyZXR1cm4gIXNrYl9xdWV1ZV9lbXB0eSgmdmlmLT5yeF9xdWV1ZSkgJiYKKwkgICAgICAgeGVudmlmX3J4X3Jpbmdfc2xvdHNfYXZhaWxhYmxlKHZpZiwgdmlmLT5yeF9sYXN0X3NrYl9zbG90cyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHR4X3dvcmtfdG9kbyhzdHJ1Y3QgeGVudmlmICp2aWYpCkBAIC0xNTYwLDggKzE1NTgsNiBAQAogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdmlmLT5yeF9xdWV1ZSkpCiAJCQl4ZW52aWZfcnhfYWN0aW9uKHZpZik7CiAKLQkJdmlmLT5yeF9ldmVudCA9IGZhbHNlOwotCiAJCWlmIChza2JfcXVldWVfZW1wdHkoJnZpZi0+cnhfcXVldWUpICYmCiAJCSAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKHZpZi0+ZGV2KSkKIAkJCXhlbnZpZl9zdGFydF9xdWV1ZSh2aWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCBlOTU1YzU2Li5mOWRhYTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwpAQCAtMTE3LDYgKzExNyw3IEBACiAJfSB0eF9za2JzW05FVF9UWF9SSU5HX1NJWkVdOwogCWdyYW50X3JlZl90IGdyZWZfdHhfaGVhZDsKIAlncmFudF9yZWZfdCBncmFudF90eF9yZWZbTkVUX1RYX1JJTkdfU0laRV07CisJc3RydWN0IHBhZ2UgKmdyYW50X3R4X3BhZ2VbTkVUX1RYX1JJTkdfU0laRV07CiAJdW5zaWduZWQgdHhfc2tiX2ZyZWVsaXN0OwogCiAJc3BpbmxvY2tfdCAgIHJ4X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTM5Niw2ICszOTcsNyBAQAogCQkJZ250dGFiX3JlbGVhc2VfZ3JhbnRfcmVmZXJlbmNlKAogCQkJCSZucC0+Z3JlZl90eF9oZWFkLCBucC0+Z3JhbnRfdHhfcmVmW2lkXSk7CiAJCQlucC0+Z3JhbnRfdHhfcmVmW2lkXSA9IEdSQU5UX0lOVkFMSURfUkVGOworCQkJbnAtPmdyYW50X3R4X3BhZ2VbaWRdID0gTlVMTDsKIAkJCWFkZF9pZF90b19mcmVlbGlzdCgmbnAtPnR4X3NrYl9mcmVlbGlzdCwgbnAtPnR4X3NrYnMsIGlkKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCX0KQEAgLTQ1Miw2ICs0NTQsNyBAQAogCQlnbnR0YWJfZ3JhbnRfZm9yZWlnbl9hY2Nlc3NfcmVmKHJlZiwgbnAtPnhiZGV2LT5vdGhlcmVuZF9pZCwKIAkJCQkJCW1mbiwgR05UTUFQX3JlYWRvbmx5KTsKIAorCQlucC0+Z3JhbnRfdHhfcGFnZVtpZF0gPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CiAJCXR4LT5ncmVmID0gbnAtPmdyYW50X3R4X3JlZltpZF0gPSByZWY7CiAJCXR4LT5vZmZzZXQgPSBvZmZzZXQ7CiAJCXR4LT5zaXplID0gbGVuOwpAQCAtNDk3LDYgKzUwMCw3IEBACiAJCQkJCQkJbnAtPnhiZGV2LT5vdGhlcmVuZF9pZCwKIAkJCQkJCQltZm4sIEdOVE1BUF9yZWFkb25seSk7CiAKKwkJCW5wLT5ncmFudF90eF9wYWdlW2lkXSA9IHBhZ2U7CiAJCQl0eC0+Z3JlZiA9IG5wLT5ncmFudF90eF9yZWZbaWRdID0gcmVmOwogCQkJdHgtPm9mZnNldCA9IG9mZnNldDsKIAkJCXR4LT5zaXplID0gYnl0ZXM7CkBAIC01OTYsNiArNjAwLDcgQEAKIAltZm4gPSB2aXJ0X3RvX21mbihkYXRhKTsKIAlnbnR0YWJfZ3JhbnRfZm9yZWlnbl9hY2Nlc3NfcmVmKAogCQlyZWYsIG5wLT54YmRldi0+b3RoZXJlbmRfaWQsIG1mbiwgR05UTUFQX3JlYWRvbmx5KTsKKwlucC0+Z3JhbnRfdHhfcGFnZVtpZF0gPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CiAJdHgtPmdyZWYgPSBucC0+Z3JhbnRfdHhfcmVmW2lkXSA9IHJlZjsKIAl0eC0+b2Zmc2V0ID0gb2Zmc2V0OwogCXR4LT5zaXplID0gbGVuOwpAQCAtMTA4NSwxMCArMTA5MCwxMSBAQAogCQkJY29udGludWU7CiAKIAkJc2tiID0gbnAtPnR4X3NrYnNbaV0uc2tiOwotCQlnbnR0YWJfZW5kX2ZvcmVpZ25fYWNjZXNzX3JlZihucC0+Z3JhbnRfdHhfcmVmW2ldLAotCQkJCQkgICAgICBHTlRNQVBfcmVhZG9ubHkpOwotCQlnbnR0YWJfcmVsZWFzZV9ncmFudF9yZWZlcmVuY2UoJm5wLT5ncmVmX3R4X2hlYWQsCi0JCQkJCSAgICAgICBucC0+Z3JhbnRfdHhfcmVmW2ldKTsKKwkJZ2V0X3BhZ2UobnAtPmdyYW50X3R4X3BhZ2VbaV0pOworCQlnbnR0YWJfZW5kX2ZvcmVpZ25fYWNjZXNzKG5wLT5ncmFudF90eF9yZWZbaV0sCisJCQkJCSAgR05UTUFQX3JlYWRvbmx5LAorCQkJCQkgICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhucC0+Z3JhbnRfdHhfcGFnZVtpXSkpOworCQlucC0+Z3JhbnRfdHhfcGFnZVtpXSA9IE5VTEw7CiAJCW5wLT5ncmFudF90eF9yZWZbaV0gPSBHUkFOVF9JTlZBTElEX1JFRjsKIAkJYWRkX2lkX3RvX2ZyZWVsaXN0KCZucC0+dHhfc2tiX2ZyZWVsaXN0LCBucC0+dHhfc2ticywgaSk7CiAJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CkBAIC0xMDk3LDc4ICsxMTAzLDM1IEBACiAKIHN0YXRpYyB2b2lkIHhlbm5ldF9yZWxlYXNlX3J4X2J1ZnMoc3RydWN0IG5ldGZyb250X2luZm8gKm5wKQogewotCXN0cnVjdCBtbXVfdXBkYXRlICAgICAgKm1tdSA9IG5wLT5yeF9tbXU7Ci0Jc3RydWN0IG11bHRpY2FsbF9lbnRyeSAqbWNsID0gbnAtPnJ4X21jbDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZyZWVfbGlzdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgbWZuOwotCWludCB4ZmVyID0gMCwgbm94ZmVyID0gMCwgdW51c2VkID0gMDsKIAlpbnQgaWQsIHJlZjsKIAotCWRldl93YXJuKCZucC0+bmV0ZGV2LT5kZXYsICIlczogZml4IG1lIGZvciBjb3B5aW5nIHJlY2VpdmVyLlxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JcmV0dXJuOwotCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZnJlZV9saXN0KTsKLQogCXNwaW5fbG9ja19iaCgmbnAtPnJ4X2xvY2spOwogCiAJZm9yIChpZCA9IDA7IGlkIDwgTkVUX1JYX1JJTkdfU0laRTsgaWQrKykgewotCQlyZWYgPSBucC0+Z3JhbnRfcnhfcmVmW2lkXTsKLQkJaWYgKHJlZiA9PSBHUkFOVF9JTlZBTElEX1JFRikgewotCQkJdW51c2VkKys7Ci0JCQljb250aW51ZTsKLQkJfQorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCQlza2IgPSBucC0+cnhfc2tic1tpZF07Ci0JCW1mbiA9IGdudHRhYl9lbmRfZm9yZWlnbl90cmFuc2Zlcl9yZWYocmVmKTsKLQkJZ250dGFiX3JlbGVhc2VfZ3JhbnRfcmVmZXJlbmNlKCZucC0+Z3JlZl9yeF9oZWFkLCByZWYpOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXJlZiA9IG5wLT5ncmFudF9yeF9yZWZbaWRdOworCQlpZiAocmVmID09IEdSQU5UX0lOVkFMSURfUkVGKQorCQkJY29udGludWU7CisKKwkJcGFnZSA9IHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0pOworCisJCS8qIGdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MoKSBuZWVkcyBhIHBhZ2UgcmVmIHVudGlsCisJCSAqIGZvcmVpZ24gYWNjZXNzIGlzIGVuZGVkICh3aGljaCBtYXkgYmUgZGVmZXJyZWQpLgorCQkgKi8KKwkJZ2V0X3BhZ2UocGFnZSk7CisJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MocmVmLCAwLAorCQkJCQkgICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAJCW5wLT5ncmFudF9yeF9yZWZbaWRdID0gR1JBTlRfSU5WQUxJRF9SRUY7CiAKLQkJaWYgKDAgPT0gbWZuKSB7Ci0JCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gMDsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCW5veGZlcisrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKSB7Ci0JCQkvKiBSZW1hcCB0aGUgcGFnZS4gKi8KLQkJCWNvbnN0IHN0cnVjdCBwYWdlICpwYWdlID0KLQkJCQlza2JfZnJhZ19wYWdlKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdKTsKLQkJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7Ci0JCQl2b2lkICp2YWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQotCQkJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmcobWNsLCAodW5zaWduZWQgbG9uZyl2YWRkciwKLQkJCQkJCW1mbl9wdGUobWZuLCBQQUdFX0tFUk5FTCksCi0JCQkJCQkwKTsKLQkJCW1jbCsrOwotCQkJbW11LT5wdHIgPSAoKHU2NCltZm4gPDwgUEFHRV9TSElGVCkKLQkJCQl8IE1NVV9NQUNIUEhZU19VUERBVEU7Ci0JCQltbXUtPnZhbCA9IHBmbjsKLQkJCW1tdSsrOwotCi0JCQlzZXRfcGh5c190b19tYWNoaW5lKHBmbiwgbWZuKTsKLQkJfQotCQlfX3NrYl9xdWV1ZV90YWlsKCZmcmVlX2xpc3QsIHNrYik7Ci0JCXhmZXIrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCi0JZGV2X2luZm8oJm5wLT5uZXRkZXYtPmRldiwgIiVzOiAlZCB4ZmVyLCAlZCBub3hmZXIsICVkIHVudXNlZFxuIiwKLQkJIF9fZnVuY19fLCB4ZmVyLCBub3hmZXIsIHVudXNlZCk7Ci0KLQlpZiAoeGZlcikgewotCQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKSB7Ci0JCQkvKiBEbyBhbGwgdGhlIHJlbWFwcGluZyB3b3JrIGFuZCBNMlAgdXBkYXRlcy4gKi8KLQkJCU1VTFRJX21tdV91cGRhdGUobWNsLCBucC0+cnhfbW11LCBtbXUgLSBucC0+cnhfbW11LAotCQkJCQkgTlVMTCwgRE9NSURfU0VMRik7Ci0JCQltY2wrKzsKLQkJCUhZUEVSVklTT1JfbXVsdGljYWxsKG5wLT5yeF9tY2wsIG1jbCAtIG5wLT5yeF9tY2wpOwotCQl9Ci0JfQotCi0JX19za2JfcXVldWVfcHVyZ2UoJmZyZWVfbGlzdCk7Ci0KIAlzcGluX3VubG9ja19iaCgmbnAtPnJ4X2xvY2spOwogfQogCkBAIC0xMzM5LDYgKzEzMDIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBORVRfUlhfUklOR19TSVpFOyBpKyspIHsKIAkJbnAtPnJ4X3NrYnNbaV0gPSBOVUxMOwogCQlucC0+Z3JhbnRfcnhfcmVmW2ldID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJCW5wLT5ncmFudF90eF9wYWdlW2ldID0gTlVMTDsKIAl9CiAKIAkvKiBBIGdyYW50IGZvciBldmVyeSB0eCByaW5nIHNsb3QgKi8KQEAgLTE4NjgsNyArMTgzMiw2IEBACiAJY2FzZSBYZW5idXNTdGF0ZVJlY29uZmlndXJpbmc6CiAJY2FzZSBYZW5idXNTdGF0ZVJlY29uZmlndXJlZDoKIAljYXNlIFhlbmJ1c1N0YXRlVW5rbm93bjoKLQljYXNlIFhlbmJ1c1N0YXRlQ2xvc2VkOgogCQlicmVhazsKIAogCWNhc2UgWGVuYnVzU3RhdGVJbml0V2FpdDoKQEAgLTE4ODMsNiArMTg0NiwxMCBAQAogCQluZXRkZXZfbm90aWZ5X3BlZXJzKG5ldGRldik7CiAJCWJyZWFrOwogCisJY2FzZSBYZW5idXNTdGF0ZUNsb3NlZDoKKwkJaWYgKGRldi0+c3RhdGUgPT0gWGVuYnVzU3RhdGVDbG9zZWQpCisJCQlicmVhazsKKwkJLyogTWlzc2VkIHRoZSBiYWNrZW5kJ3MgQ0xPU0lORyBzdGF0ZSAtLSBmYWxsdGhyb3VnaCAqLwogCWNhc2UgWGVuYnVzU3RhdGVDbG9zaW5nOgogCQl4ZW5idXNfZnJvbnRlbmRfY2xvc2VkKGRldik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggY2Q5MjlhZS4uZTJhNzgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC0yMTAsMTAgKzIxMCwyOSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZG9ja19ldmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7CisKKwltdXRleF9sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CisJY29udGV4dCA9IGFjcGlwaHBfZ2V0X2NvbnRleHQoaGFuZGxlKTsKKwlpZiAoIWNvbnRleHQgfHwgV0FSTl9PTihjb250ZXh0LT5oYW5kbGUgIT0gaGFuZGxlKQorCSAgICB8fCBjb250ZXh0LT5mdW5jLnBhcmVudC0+aXNfZ29pbmdfYXdheSkgeworCQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlnZXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKKwlhY3BpcGhwX3B1dF9jb250ZXh0KGNvbnRleHQpOworCW11dGV4X3VubG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOworCisJaG90cGx1Z19ldmVudChoYW5kbGUsIHR5cGUsIGRhdGEpOworCisJcHV0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhY3BpcGhwX2RvY2tfb3BzID0gewogCS5maXh1cCA9IHBvc3RfZG9ja19maXh1cHMsCi0JLmhhbmRsZXIgPSBob3RwbHVnX2V2ZW50LAorCS5oYW5kbGVyID0gZG9ja19ldmVudCwKIH07CiAKIC8qIENoZWNrIHdoZXRoZXIgdGhlIFBDSSBkZXZpY2UgaXMgbWFuYWdlZCBieSBuYXRpdmUgUENJZSBob3RwbHVnIGRyaXZlciAqLwpAQCAtNDQxLDcgKzQ2MCw5IEBACiAJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZicmlkZ2VfbXV0ZXgpOwogCisJbXV0ZXhfbG9jaygmYWNwaXBocF9jb250ZXh0X2xvY2spOwogCWJyaWRnZS0+aXNfZ29pbmdfYXdheSA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CiB9CiAKIC8qKgpAQCAtNzQyLDcgKzc2Myw3IEBACiAKIAkJLyogVGhlIGRldmljZSBpcyBhIGJyaWRnZS4gc28gY2hlY2sgdGhlIGJ1cyBiZWxvdyBpdC4gKi8KIAkJcG1fcnVudGltZV9nZXRfc3luYygmZGV2LT5kZXYpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hpbGQsIHRtcCwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGNoaWxkLCB0bXAsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQogCQkJdHJpbV9zdGFsZV9kZXZpY2VzKGNoaWxkKTsKIAogCQlwbV9ydW50aW1lX3B1dCgmZGV2LT5kZXYpOwpAQCAtNzczLDggKzc5NCw4IEBACiAJCQk7IC8qIGRvIG5vdGhpbmcgKi8KIAkJfSBlbHNlIGlmIChnZXRfc2xvdF9zdGF0dXMoc2xvdCkgPT0gQUNQSV9TVEFfQUxMKSB7CiAJCQkvKiByZW1vdmUgc3RhbGUgZGV2aWNlcyBpZiBhbnkgKi8KLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmJ1cy0+ZGV2aWNlcywKLQkJCQkJCSBidXNfbGlzdCkKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGRldiwgdG1wLAorCQkJCQkJCSAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKIAkJCQlpZiAoUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gc2xvdC0+ZGV2aWNlKQogCQkJCQl0cmltX3N0YWxlX2RldmljZXMoZGV2KTsKIApAQCAtODA1LDcgKzgyNiw3IEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCB0bXAsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWZvciAoaT0wOyBpPFBDSV9CUklER0VfUkVTT1VSQ0VTOyBpKyspIHsKIAkJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07CiAJCQlpZiAoKHJlcy0+ZmxhZ3MgJiB0eXBlX21hc2spICYmICFyZXMtPnN0YXJ0ICYmCkBAIC04MjksNyArODUwLDExIEBACiAKIAlicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKTsKIAlpZiAoYnJpZGdlKSB7CisJCXBjaV9sb2NrX3Jlc2Nhbl9yZW1vdmUoKTsKKwogCQlhY3BpcGhwX2NoZWNrX2JyaWRnZShicmlkZ2UpOworCisJCXBjaV91bmxvY2tfcmVzY2FuX3JlbW92ZSgpOwogCQlwdXRfYnJpZGdlKGJyaWRnZSk7CiAJfQogfQpAQCAtODUyLDYgKzg3Nyw3IEBACiAKIAltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKIAorCXBjaV9sb2NrX3Jlc2Nhbl9yZW1vdmUoKTsKIAlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtOTA1LDYgKzkzMSw3IEBACiAJCWJyZWFrOwogCX0KIAorCXBjaV91bmxvY2tfcmVzY2FuX3JlbW92ZSgpOwogCWlmIChicmlkZ2UpCiAJCXB1dF9icmlkZ2UoYnJpZGdlKTsKIH0KQEAgLTkxNSwxMSArOTQyLDkgQEAKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBjb250ZXh0LT5oYW5kbGU7CiAKIAlhY3BpX3NjYW5fbG9ja19hY3F1aXJlKCk7Ci0JcGNpX2xvY2tfcmVzY2FuX3JlbW92ZSgpOwogCiAJaG90cGx1Z19ldmVudChoYW5kbGUsIHR5cGUsIGNvbnRleHQpOwogCi0JcGNpX3VubG9ja19yZXNjYW5fcmVtb3ZlKCk7CiAJYWNwaV9zY2FuX2xvY2tfcmVsZWFzZSgpOwogCWFjcGlfZXZhbHVhdGVfaG90cGx1Z19vc3QoaGFuZGxlLCB0eXBlLCBBQ1BJX09TVF9TQ19TVUNDRVNTLCBOVUxMKTsKIAlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKQEAgLTkzNyw2ICs5NjIsNyBAQAogewogCXN0cnVjdCBhY3BpcGhwX2NvbnRleHQgKmNvbnRleHQ7CiAJdTMyIG9zdF9jb2RlID0gQUNQSV9PU1RfU0NfU1VDQ0VTUzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKQEAgLTk3MiwxMyArOTk4LDIwIEBACiAKIAltdXRleF9sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CiAJY29udGV4dCA9IGFjcGlwaHBfZ2V0X2NvbnRleHQoaGFuZGxlKTsKLQlpZiAoY29udGV4dCAmJiAhV0FSTl9PTihjb250ZXh0LT5oYW5kbGUgIT0gaGFuZGxlKSkgewotCQlnZXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKLQkJYWNwaXBocF9wdXRfY29udGV4dChjb250ZXh0KTsKLQkJYWNwaV9ob3RwbHVnX2V4ZWN1dGUoaG90cGx1Z19ldmVudF93b3JrLCBjb250ZXh0LCB0eXBlKTsKKwlpZiAoIWNvbnRleHQgfHwgV0FSTl9PTihjb250ZXh0LT5oYW5kbGUgIT0gaGFuZGxlKQorCSAgICB8fCBjb250ZXh0LT5mdW5jLnBhcmVudC0+aXNfZ29pbmdfYXdheSkKKwkJZ290byBlcnJfb3V0OworCisJZ2V0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7CisJYWNwaXBocF9wdXRfY29udGV4dChjb250ZXh0KTsKKwlzdGF0dXMgPSBhY3BpX2hvdHBsdWdfZXhlY3V0ZShob3RwbHVnX2V2ZW50X3dvcmssIGNvbnRleHQsIHR5cGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQltdXRleF91bmxvY2soJmFjcGlwaHBfY29udGV4dF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KKwlwdXRfYnJpZGdlKGNvbnRleHQtPmZ1bmMucGFyZW50KTsKKworIGVycl9vdXQ6CiAJbXV0ZXhfdW5sb2NrKCZhY3BpcGhwX2NvbnRleHRfbG9jayk7CiAJb3N0X2NvZGUgPSBBQ1BJX09TVF9TQ19OT05fU1BFQ0lGSUNfRkFJTFVSRTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggMDQ3OTZjMC4uNmUzNDQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xMjA4LDE4ICsxMjA4LDYgQEAKIAlwY2lfZnJlZV9jYXBfc2F2ZV9idWZmZXJzKGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBpOwotCi0JcGNpX2NsZWFudXBfcm9tKGRldik7Ci0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKLQkJaWYgKHJlcy0+cGFyZW50KQotCQkJcmVsZWFzZV9yZXNvdXJjZShyZXMpOwotCX0KLX0KLQogLyoqCiAgKiBwY2lfcmVsZWFzZV9kZXYgLSBmcmVlIGEgcGNpIGRldmljZSBzdHJ1Y3R1cmUgd2hlbiBhbGwgdXNlcnMgb2YgaXQgYXJlIGZpbmlzaGVkLgogICogQGRldjogZGV2aWNlIHRoYXQncyBiZWVuIGRpc2Nvbm5lY3RlZApAQCAtMTIyOSwxNCArMTIxNyw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBjaV9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAKLQlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7Ci0JbGlzdF9kZWwoJnBjaV9kZXYtPmJ1c19saXN0KTsKLQl1cF93cml0ZSgmcGNpX2J1c19zZW0pOwotCi0JcGNpX2ZyZWVfcmVzb3VyY2VzKHBjaV9kZXYpOwotCisJcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlwY2lfcmVsZWFzZV9jYXBhYmlsaXRpZXMocGNpX2Rldik7CiAJcGNpX3JlbGVhc2Vfb2Zfbm9kZShwY2lfZGV2KTsKIAlwY2liaW9zX3JlbGVhc2VfZGV2aWNlKHBjaV9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCA0ZmYzNmJmLi44YmQ3NmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yZW1vdmUuYworKysgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwpAQCAtMyw2ICszLDE4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KICNpbmNsdWRlICJwY2kuaCIKIAorc3RhdGljIHZvaWQgcGNpX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisKKwlwY2lfY2xlYW51cF9yb20oZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyBpOworCQlpZiAocmVzLT5wYXJlbnQpCisJCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBwY2lfc3RvcF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwY2lfcG1lX2FjdGl2ZShkZXYsIGZhbHNlKTsKQEAgLTI1LDYgKzM3LDExIEBACiAKIAlkZXZpY2VfZGVsKCZkZXYtPmRldik7CiAKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CisJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOworCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CisKKwlwY2lfZnJlZV9yZXNvdXJjZXMoZGV2KTsKIAlwdXRfZGV2aWNlKCZkZXYtPmRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9jb3JlLmMgYi9kcml2ZXJzL3BpbmN0cmwvY29yZS5jCmluZGV4IDVlZTYxYTQuLmMwZmU2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9jb3JlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2NvcmUuYwpAQCAtODUxLDcgKzg1MSw5IEBACiAJa3JlZl9pbml0KCZwLT51c2Vycyk7CiAKIAkvKiBBZGQgdGhlIHBpbmN0cmwgaGFuZGxlIHRvIHRoZSBnbG9iYWwgbGlzdCAqLworCW11dGV4X2xvY2soJnBpbmN0cmxfbGlzdF9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmcC0+bm9kZSwgJnBpbmN0cmxfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwaW5jdHJsX2xpc3RfbXV0ZXgpOwogCiAJcmV0dXJuIHA7CiB9CkBAIC0xNjQyLDggKzE2NDQsMTAgQEAKIAkJCSAgICBkZXZpY2Vfcm9vdCwgcGN0bGRldiwgJnBpbmN0cmxfZ3JvdXBzX29wcyk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZ3Bpby1yYW5nZXMiLCBTX0lGUkVHIHwgU19JUlVHTywKIAkJCSAgICBkZXZpY2Vfcm9vdCwgcGN0bGRldiwgJnBpbmN0cmxfZ3Bpb3Jhbmdlc19vcHMpOwotCXBpbm11eF9pbml0X2RldmljZV9kZWJ1Z2ZzKGRldmljZV9yb290LCBwY3RsZGV2KTsKLQlwaW5jb25mX2luaXRfZGV2aWNlX2RlYnVnZnMoZGV2aWNlX3Jvb3QsIHBjdGxkZXYpOworCWlmIChwY3RsZGV2LT5kZXNjLT5wbXhvcHMpCisJCXBpbm11eF9pbml0X2RldmljZV9kZWJ1Z2ZzKGRldmljZV9yb290LCBwY3RsZGV2KTsKKwlpZiAocGN0bGRldi0+ZGVzYy0+Y29uZm9wcykKKwkJcGluY29uZl9pbml0X2RldmljZV9kZWJ1Z2ZzKGRldmljZV9yb290LCBwY3RsZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgcGluY3RybF9yZW1vdmVfZGV2aWNlX2RlYnVnZnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCmluZGV4IDM4YzZmOGIuLmQ5OTBlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKQEAgLTEyODYsMjIgKzEyODYsMjIgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6Ci0JCWlycV9zZXRfaGFuZGxlcihkLT5pcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOwogCQl3cml0ZWxfcmVsYXhlZChtYXNrLCBwaW8gKyBQSU9fRVNSKTsKIAkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX1JFSExTUik7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQlpcnFfc2V0X2hhbmRsZXIoZC0+aXJxLCBoYW5kbGVfc2ltcGxlX2lycSk7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKIAkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX0VTUik7CiAJCXdyaXRlbF9yZWxheGVkKG1hc2ssIHBpbyArIFBJT19GRUxMU1IpOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJaXJxX3NldF9oYW5kbGVyKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQl3cml0ZWxfcmVsYXhlZChtYXNrLCBwaW8gKyBQSU9fTFNSKTsKIAkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX0ZFTExTUik7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJaXJxX3NldF9oYW5kbGVyKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQl3cml0ZWxfcmVsYXhlZChtYXNrLCBwaW8gKyBQSU9fTFNSKTsKIAkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX1JFSExTUik7CiAJCWJyZWFrOwpAQCAtMTMxMCw3ICsxMzEwLDcgQEAKIAkJICogZGlzYWJsZSBhZGRpdGlvbmFsIGludGVycnVwdCBtb2RlczoKIAkJICogZmFsbCBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IKIAkJICovCi0JCWlycV9zZXRfaGFuZGxlcihkLT5pcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOwogCQl3cml0ZWxfcmVsYXhlZChtYXNrLCBwaW8gKyBQSU9fQUlNRFIpOwogCQlyZXR1cm4gMDsKIAljYXNlIElSUV9UWVBFX05PTkU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1pbXgxLWNvcmUuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWlteDEtY29yZS5jCmluZGV4IDE3YWVjZGUuLjgxNTM4NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWlteDEtY29yZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWlteDEtY29yZS5jCkBAIC00NSw3ICs0NSw3IEBACiAjZGVmaW5lIE1YMV9ERElSIDB4MDAKICNkZWZpbmUgTVgxX09DUiAweDA0CiAjZGVmaW5lIE1YMV9JQ09ORkEgMHgwYwotI2RlZmluZSBNWDFfSUNPTkZCIDB4MTAKKyNkZWZpbmUgTVgxX0lDT05GQiAweDE0CiAjZGVmaW5lIE1YMV9HSVVTIDB4MjAKICNkZWZpbmUgTVgxX0dQUiAweDM4CiAjZGVmaW5lIE1YMV9QVUVOIDB4NDAKQEAgLTk3LDEzICs5NywxMyBAQAogCXUzMiBvbGRfdmFsOwogCXUzMiBuZXdfdmFsOwogCi0JZGV2X2RiZyhpcGN0bC0+ZGV2LCAid3JpdGU6IHJlZ2lzdGVyIDB4JXAgb2Zmc2V0ICVkIHZhbHVlIDB4JXhcbiIsCi0JCQlyZWcsIG9mZnNldCwgdmFsdWUpOwotCiAJLyogVXNlIHRoZSBuZXh0IHJlZ2lzdGVyIGlmIHRoZSBwaW4ncyBwb3J0IHBpbiBudW1iZXIgaXMgPj0xNiAqLwogCWlmIChwaW5faWQgJSAzMiA+PSAxNikKIAkJcmVnICs9IDB4MDQ7CiAKKwlkZXZfZGJnKGlwY3RsLT5kZXYsICJ3cml0ZTogcmVnaXN0ZXIgMHglcCBvZmZzZXQgJWQgdmFsdWUgMHgleFxuIiwKKwkJCXJlZywgb2Zmc2V0LCB2YWx1ZSk7CisKIAkvKiBHZXQgY3VycmVudCBzdGF0ZSBvZiBwaW5zICovCiAJb2xkX3ZhbCA9IHJlYWRsKHJlZyk7CiAJb2xkX3ZhbCAmPSBtYXNrOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCXUzMiByZWdfb2Zmc2V0KQogewogCXZvaWQgX19pb21lbSAqcmVnID0gaW14MV9tZW0oaXBjdGwsIHBpbl9pZCkgKyByZWdfb2Zmc2V0OwotCWludCBvZmZzZXQgPSBwaW5faWQgJSAxNjsKKwlpbnQgb2Zmc2V0ID0gKHBpbl9pZCAlIDE2KSAqIDI7CiAKIAkvKiBVc2UgdGhlIG5leHQgcmVnaXN0ZXIgaWYgdGhlIHBpbidzIHBvcnQgcGluIG51bWJlciBpcyA+PTE2ICovCiAJaWYgKHBpbl9pZCAlIDMyID49IDE2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMKaW5kZXggYTJlOTNhMi4uZTc2NzM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jCkBAIC02NDUsNyArNjQ1LDcgQEAKIAkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbXgtPnJlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2MgcmVncyBwb2ludGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBwbXgtPm5iYW5rczsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXByaW1hMi5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1wcmltYTIuYwppbmRleCAzN2I0MjY1Li5kZGUwMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXByaW1hMi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCS5mdW5jdmFsID0gMCwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBhYzk3X3BpbnNbXSA9IHsgMzMsIDM0LCAzNSwgMzYgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhYzk3X3BpbnNbXSA9IHsgNDMsIDQ0LCA0NSwgNDYgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX211eG1hc2sgc3BpMV9tdXhtYXNrW10gPSB7CiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtdC5jIGIvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtdC5jCmluZGV4IGIyOGQxYWYuLjk4MDJiNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bXQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd210LmMKQEAgLTI3Niw3ICsyNzYsMjAgQEAKIAlpZiAoIWNvbmZpZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY29uZmlnc1swXSA9IHB1bGw7CisJc3dpdGNoIChwdWxsKSB7CisJY2FzZSAwOgorCQljb25maWdzWzBdID0gUElOX0NPTkZJR19CSUFTX0RJU0FCTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY29uZmlnc1swXSA9IFBJTl9DT05GSUdfQklBU19QVUxMX0RPV047CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY29uZmlnc1swXSA9IFBJTl9DT05GSUdfQklBU19QVUxMX1VQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25maWdzWzBdID0gUElOX0NPTkZJR19CSUFTX0RJU0FCTEU7CisJCWRldl9lcnIoZGF0YS0+ZGV2LCAiaW52YWxpZCBwdWxsIHN0YXRlICVkIC0gZGlzYWJsaW5nXG4iLCBwdWxsKTsKKwl9CiAKIAltYXAtPnR5cGUgPSBQSU5fTUFQX1RZUEVfQ09ORklHU19QSU47CiAJbWFwLT5kYXRhLmNvbmZpZ3MuZ3JvdXBfb3JfcGluID0gZGF0YS0+Z3JvdXBzW2dyb3VwXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL0tjb25maWcgYi9kcml2ZXJzL3BsYXRmb3JtL2Nocm9tZS9LY29uZmlnCmluZGV4IGIxMzMwM2UuLjQ0MGVkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL0tjb25maWcKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvS2NvbmZpZwpAQCAtMjUsNCArMjUsMTggQEAKIAkgIElmIHlvdSBoYXZlIGEgc3VwcG9ydGVkIENocm9tZWJvb2ssIGNob29zZSBZIG9yIE0gaGVyZS4KIAkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2hyb21lb3NfbGFwdG9wLgogCitjb25maWcgQ0hST01FT1NfUFNUT1JFCisJdHJpc3RhdGUgIkNocm9tZSBPUyBwc3RvcmUgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGlzIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBvbiB4ODYgQ2hyb21lT1MKKwkgIGRldmljZXMuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGF3YXkgY29uc29sZSBsb2dzIGFuZCBjcmFzaAorCSAgaW5mb3JtYXRpb24gYWNyb3NzIHJlYm9vdHMuCisKKwkgIFRoZSByYW5nZSBvZiBtZW1vcnkgdXNlZCBpcyAweGYwMDAwMC0weDEwMDAwMDAsIHRyYWRpdGlvbmFsbHkKKwkgIHRoZSBtZW1vcnkgdXNlZCB0byBiYWNrIFZHQSBjb250cm9sbGVyIG1lbW9yeS4KKworCSAgSWYgeW91IGhhdmUgYSBzdXBwb3J0ZWQgQ2hyb21lYm9vaywgY2hvb3NlIFkgb3IgTSBoZXJlLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjaHJvbWVvc19wc3RvcmUuCisKKwogZW5kaWYgIyBDSFJPTUVPU19QTEFURk9STVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL01ha2VmaWxlIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvTWFrZWZpbGUKaW5kZXggMDE1ZTkxOS4uMmI4NjBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiAKIG9iai0kKENPTkZJR19DSFJPTUVPU19MQVBUT1ApCSs9IGNocm9tZW9zX2xhcHRvcC5vCitvYmotJChDT05GSUdfQ0hST01FT1NfUFNUT1JFKQkrPSBjaHJvbWVvc19wc3RvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY2hyb21lb3NfbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL2Nocm9tZS9jaHJvbWVvc19sYXB0b3AuYwppbmRleCAzZTViNDQ5Ny4uN2YzYWFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY2hyb21lb3NfbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY2hyb21lb3NfbGFwdG9wLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjZGVmaW5lIEFUTUVMX1RQX0kyQ19BRERSCTB4NGIKICNkZWZpbmUgQVRNRUxfVFBfSTJDX0JMX0FERFIJMHgyNQpAQCAtNDAsNyArNDEsNyBAQAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICp0cDsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqdHM7CiAKLWNvbnN0IGNoYXIgKmkyY19hZGFwdGVyX25hbWVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqaTJjX2FkYXB0ZXJfbmFtZXNbXSA9IHsKIAkiU01CdXMgSTgwMSBhZGFwdGVyIiwKIAkiaTkxNSBnbWJ1cyB2Z2EiLAogCSJpOTE1IGdtYnVzIHBhbmVsIiwKQEAgLTUzLDIwICs1NCwzMyBAQAogCUkyQ19BREFQVEVSX1BBTkVMLAogfTsKIAotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGN5YXBhX2RldmljZSA9IHsKK3N0cnVjdCBpMmNfcGVyaXBoZXJhbCB7CisJaW50ICgqYWRkKShlbnVtIGkyY19hZGFwdGVyX3R5cGUgdHlwZSk7CisJZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGU7Cit9OworCisjZGVmaW5lIE1BWF9JMkNfUEVSSVBIRVJBTFMgMworCitzdHJ1Y3QgY2hyb21lb3NfbGFwdG9wIHsKKwlzdHJ1Y3QgaTJjX3BlcmlwaGVyYWwgaTJjX3BlcmlwaGVyYWxzW01BWF9JMkNfUEVSSVBIRVJBTFNdOworfTsKKworc3RhdGljIHN0cnVjdCBjaHJvbWVvc19sYXB0b3AgKmNyb3NfbGFwdG9wOworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGN5YXBhX2RldmljZSA9IHsKIAlJMkNfQk9BUkRfSU5GTygiY3lhcGEiLCBDWUFQQV9UUF9JMkNfQUREUiksCiAJLmZsYWdzCQk9IEkyQ19DTElFTlRfV0FLRSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBpc2xfYWxzX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaXNsX2Fsc19kZXZpY2UgPSB7CiAJSTJDX0JPQVJEX0lORk8oImlzbDI5MDE4IiwgSVNMX0FMU19JMkNfQUREUiksCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgdHNsMjU4M19hbHNfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyB0c2wyNTgzX2Fsc19kZXZpY2UgPSB7CiAJSTJDX0JPQVJEX0lORk8oInRzbDI1ODMiLCBUQU9TX0FMU19JMkNfQUREUiksCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgdHNsMjU2M19hbHNfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyB0c2wyNTYzX2Fsc19kZXZpY2UgPSB7CiAJSTJDX0JPQVJEX0lORk8oInRzbDI1NjMiLCBUQU9TX0FMU19JMkNfQUREUiksCiB9OwogCkBAIC04OSw3ICsxMDMsNyBAQAogCS5jb25maWdfbGVuZ3RoCQk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYXRtZWxfMjI0c190cF9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGF0bWVsXzIyNHNfdHBfZGV2aWNlID0gewogCUkyQ19CT0FSRF9JTkZPKCJhdG1lbF9teHRfdHAiLCBBVE1FTF9UUF9JMkNfQUREUiksCiAJLnBsYXRmb3JtX2RhdGEgPSAmYXRtZWxfMjI0c190cF9wbGF0Zm9ybV9kYXRhLAogCS5mbGFncwkJPSBJMkNfQ0xJRU5UX1dBS0UsCkBAIC0xMTAsMTMgKzEyNCwxMyBAQAogCS5jb25maWdfbGVuZ3RoCQk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYXRtZWxfMTY2NHNfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBhdG1lbF8xNjY0c19kZXZpY2UgPSB7CiAJSTJDX0JPQVJEX0lORk8oImF0bWVsX214dF90cyIsIEFUTUVMX1RTX0kyQ19BRERSKSwKIAkucGxhdGZvcm1fZGF0YSA9ICZhdG1lbF8xNjY0c19wbGF0Zm9ybV9kYXRhLAogCS5mbGFncwkJPSBJMkNfQ0xJRU5UX1dBS0UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgX19pbml0ICpfX2FkZF9wcm9iZWRfaTJjX2RldmljZSgKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqX19hZGRfcHJvYmVkX2kyY19kZXZpY2UoCiAJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCWludCBidXMsCiAJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbywKQEAgLTE2OSw3ICsxODMsNyBAQAogCXJldHVybiBjbGllbnQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IF9fZmluZF9pMmNfYWRhcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IF9fZmluZF9pMmNfYWRhcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJY29uc3QgY2hhciAqbmFtZSA9IGRhdGE7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJpMmMtIjsKQEAgLTE4MCw3ICsxOTQsNyBAQAogCXJldHVybiAoc3RybmNtcChhZGFwdGVyLT5uYW1lLCBuYW1lLCBzdHJsZW4obmFtZSkpID09IDApOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX2kyY19hZGFwdGVyX251bShlbnVtIGkyY19hZGFwdGVyX3R5cGUgdHlwZSkKK3N0YXRpYyBpbnQgZmluZF9pMmNfYWRhcHRlcl9udW0oZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CkBAIC0xODksOCArMjAzLDkgQEAKIAlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmkyY19idXNfdHlwZSwgTlVMTCwgKHZvaWQgKiluYW1lLAogCQkJICAgICAgX19maW5kX2kyY19hZGFwKTsKIAlpZiAoIWRldikgewotCQlwcl9lcnIoIiVzOiBpMmMgYWRhcHRlciAlcyBub3QgZm91bmQgb24gc3lzdGVtLlxuIiwgX19mdW5jX18sCi0JCSAgICAgICBuYW1lKTsKKwkJLyogQWRhcHRlcnMgbWF5IGFwcGVhciBsYXRlci4gRGVmZXJyZWQgcHJvYmluZyB3aWxsIHJldHJ5ICovCisJCXByX25vdGljZSgiJXM6IGkyYyBhZGFwdGVyICVzIG5vdCBmb3VuZCBvbiBzeXN0ZW0uXG4iLCBfX2Z1bmNfXywKKwkJCSAgbmFtZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlhZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2KTsKQEAgLTIwNSw3ICsyMjAsNyBAQAogICogUmV0dXJucyBOVUxMIGlmIG5vIGRldmljZXMgZm91bmQuCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi9pMmMvaW5zdGFudGlhdGluZy1kZXZpY2VzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICovCi1zdGF0aWMgX19pbml0IHN0cnVjdCBpMmNfY2xpZW50ICphZGRfcHJvYmVkX2kyY19kZXZpY2UoCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmFkZF9wcm9iZWRfaTJjX2RldmljZSgKIAkJY29uc3QgY2hhciAqbmFtZSwKIAkJZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUsCiAJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbywKQEAgLTIyMiw3ICsyMzcsNyBAQAogICogaW5mby0+YWRkci4KICAqIFJldHVybnMgTlVMTCBpZiBubyBkZXZpY2UgZm91bmQuCiAgKi8KLXN0YXRpYyBfX2luaXQgc3RydWN0IGkyY19jbGllbnQgKmFkZF9pMmNfZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmFkZF9pMmNfZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQllbnVtIGkyY19hZGFwdGVyX3R5cGUgdHlwZSwKIAkJCQkJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKQEAgLTIzMywxNjEgKzI0OCwyNTkgQEAKIAkJCQkgICAgICAgYWRkcl9saXN0KTsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgX19pbml0ICphZGRfc21idXNfZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgc2V0dXBfY3lhcGFfdHAoZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUpCiB7Ci0JcmV0dXJuIGFkZF9pMmNfZGV2aWNlKG5hbWUsIEkyQ19BREFQVEVSX1NNQlVTLCBpbmZvKTsKKwlpZiAodHApCisJCXJldHVybiAwOworCisJLyogYWRkIGN5YXBhIHRvdWNocGFkICovCisJdHAgPSBhZGRfaTJjX2RldmljZSgidHJhY2twYWQiLCB0eXBlLCAmY3lhcGFfZGV2aWNlKTsKKwlyZXR1cm4gKCF0cCkgPyAtRUFHQUlOIDogMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2V0dXBfY3lhcGFfc21idXNfdHAoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQotewotCS8qIGFkZCBjeWFwYSB0b3VjaHBhZCBvbiBzbWJ1cyAqLwotCXRwID0gYWRkX3NtYnVzX2RldmljZSgidHJhY2twYWQiLCAmY3lhcGFfZGV2aWNlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfYXRtZWxfMjI0c190cChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCitzdGF0aWMgaW50IHNldHVwX2F0bWVsXzIyNHNfdHAoZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUpCiB7CiAJY29uc3QgdW5zaWduZWQgc2hvcnQgYWRkcl9saXN0W10gPSB7IEFUTUVMX1RQX0kyQ19CTF9BRERSLAogCQkJCQkgICAgIEFUTUVMX1RQX0kyQ19BRERSLAogCQkJCQkgICAgIEkyQ19DTElFTlRfRU5EIH07CisJaWYgKHRwKQorCQlyZXR1cm4gMDsKIAotCS8qIGFkZCBhdG1lbCBteHQgdG91Y2hwYWQgb24gVkdBIEREQyBHTUJ1cyAqLwotCXRwID0gYWRkX3Byb2JlZF9pMmNfZGV2aWNlKCJ0cmFja3BhZCIsIEkyQ19BREFQVEVSX1ZHQUREQywKKwkvKiBhZGQgYXRtZWwgbXh0IHRvdWNocGFkICovCisJdHAgPSBhZGRfcHJvYmVkX2kyY19kZXZpY2UoInRyYWNrcGFkIiwgdHlwZSwKIAkJCQkgICAmYXRtZWxfMjI0c190cF9kZXZpY2UsIGFkZHJfbGlzdCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuICghdHApID8gLUVBR0FJTiA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2F0bWVsXzE2NjRzX3RzKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgc2V0dXBfYXRtZWxfMTY2NHNfdHMoZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUpCiB7CiAJY29uc3QgdW5zaWduZWQgc2hvcnQgYWRkcl9saXN0W10gPSB7IEFUTUVMX1RTX0kyQ19CTF9BRERSLAogCQkJCQkgICAgIEFUTUVMX1RTX0kyQ19BRERSLAogCQkJCQkgICAgIEkyQ19DTElFTlRfRU5EIH07CisJaWYgKHRzKQorCQlyZXR1cm4gMDsKIAotCS8qIGFkZCBhdG1lbCBteHQgdG91Y2ggZGV2aWNlIG9uIFBBTkVMIEdNQnVzICovCi0JdHMgPSBhZGRfcHJvYmVkX2kyY19kZXZpY2UoInRvdWNoc2NyZWVuIiwgSTJDX0FEQVBURVJfUEFORUwsCisJLyogYWRkIGF0bWVsIG14dCB0b3VjaCBkZXZpY2UgKi8KKwl0cyA9IGFkZF9wcm9iZWRfaTJjX2RldmljZSgidG91Y2hzY3JlZW4iLCB0eXBlLAogCQkJCSAgICZhdG1lbF8xNjY0c19kZXZpY2UsIGFkZHJfbGlzdCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuICghdHMpID8gLUVBR0FJTiA6IDA7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfaXNsMjkwMThfYWxzKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgc2V0dXBfaXNsMjkwMThfYWxzKGVudW0gaTJjX2FkYXB0ZXJfdHlwZSB0eXBlKQogeworCWlmIChhbHMpCisJCXJldHVybiAwOworCiAJLyogYWRkIGlzbDI5MDE4IGxpZ2h0IHNlbnNvciAqLwotCWFscyA9IGFkZF9zbWJ1c19kZXZpY2UoImxpZ2h0c2Vuc29yIiwgJmlzbF9hbHNfZGV2aWNlKTsKLQlyZXR1cm4gMDsKKwlhbHMgPSBhZGRfaTJjX2RldmljZSgibGlnaHRzZW5zb3IiLCB0eXBlLCAmaXNsX2Fsc19kZXZpY2UpOworCXJldHVybiAoIWFscykgPyAtRUFHQUlOIDogMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2V0dXBfaXNsMjkwMjNfYWxzKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgc2V0dXBfdHNsMjU4M19hbHMoZW51bSBpMmNfYWRhcHRlcl90eXBlIHR5cGUpCiB7Ci0JLyogYWRkIGlzbDI5MDIzIGxpZ2h0IHNlbnNvciBvbiBQYW5lbCBHTUJ1cyAqLwotCWFscyA9IGFkZF9pMmNfZGV2aWNlKCJsaWdodHNlbnNvciIsIEkyQ19BREFQVEVSX1BBTkVMLAotCQkJICAgICAmaXNsX2Fsc19kZXZpY2UpOwotCXJldHVybiAwOworCWlmIChhbHMpCisJCXJldHVybiAwOworCisJLyogYWRkIHRzbDI1ODMgbGlnaHQgc2Vuc29yICovCisJYWxzID0gYWRkX2kyY19kZXZpY2UoTlVMTCwgdHlwZSwgJnRzbDI1ODNfYWxzX2RldmljZSk7CisJcmV0dXJuICghYWxzKSA/IC1FQUdBSU4gOiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF90c2wyNTgzX2Fscyhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCitzdGF0aWMgaW50IHNldHVwX3RzbDI1NjNfYWxzKGVudW0gaTJjX2FkYXB0ZXJfdHlwZSB0eXBlKQogewotCS8qIGFkZCB0c2wyNTgzIGxpZ2h0IHNlbnNvciBvbiBzbWJ1cyAqLwotCWFscyA9IGFkZF9zbWJ1c19kZXZpY2UoTlVMTCwgJnRzbDI1ODNfYWxzX2RldmljZSk7Ci0JcmV0dXJuIDA7CisJaWYgKGFscykKKwkJcmV0dXJuIDA7CisKKwkvKiBhZGQgdHNsMjU2MyBsaWdodCBzZW5zb3IgKi8KKwlhbHMgPSBhZGRfaTJjX2RldmljZShOVUxMLCB0eXBlLCAmdHNsMjU2M19hbHNfZGV2aWNlKTsKKwlyZXR1cm4gKCFhbHMpID8gLUVBR0FJTiA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX3RzbDI1NjNfYWxzKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgX19pbml0IGNocm9tZW9zX2xhcHRvcF9kbWlfbWF0Y2hlZChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCiB7Ci0JLyogYWRkIHRzbDI1NjMgbGlnaHQgc2Vuc29yIG9uIHNtYnVzICovCi0JYWxzID0gYWRkX3NtYnVzX2RldmljZShOVUxMLCAmdHNsMjU2M19hbHNfZGV2aWNlKTsKLQlyZXR1cm4gMDsKKwljcm9zX2xhcHRvcCA9ICh2b2lkICopaWQtPmRyaXZlcl9kYXRhOworCXByX2RlYnVnKCJETUkgTWF0Y2hlZCAlcy5cbiIsIGlkLT5pZGVudCk7CisKKwkvKiBJbmRpY2F0ZSB0byBkbWlfc2NhbiB0aGF0IHByb2Nlc3NpbmcgaXMgZG9uZS4gKi8KKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgY2hyb21lb3NfbGFwdG9wX2RtaV90YWJsZVtdID0geworc3RhdGljIGludCBjaHJvbWVvc19sYXB0b3BfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSTJDX1BFUklQSEVSQUxTOyBpKyspIHsKKwkJc3RydWN0IGkyY19wZXJpcGhlcmFsICppMmNfZGV2OworCisJCWkyY19kZXYgPSAmY3Jvc19sYXB0b3AtPmkyY19wZXJpcGhlcmFsc1tpXTsKKworCQkvKiBObyBtb3JlIHBlcmlwaGVyYWxzLiAqLworCQlpZiAoaTJjX2Rldi0+YWRkID09IE5VTEwpCisJCQlicmVhazsKKworCQkvKiBBZGQgdGhlIGRldmljZS4gU2V0IC1FUFJPQkVfREVGRVIgb24gYW55IGZhaWx1cmUgKi8KKwkJaWYgKGkyY19kZXYtPmFkZChpMmNfZGV2LT50eXBlKSkKKwkJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjaHJvbWVvc19sYXB0b3Agc2Ftc3VuZ19zZXJpZXNfNV81NTAgPSB7CisJLmkyY19wZXJpcGhlcmFscyA9IHsKKwkJLyogVG91Y2hwYWQuICovCisJCXsgLmFkZCA9IHNldHVwX2N5YXBhX3RwLCBJMkNfQURBUFRFUl9TTUJVUyB9LAorCQkvKiBMaWdodCBTZW5zb3IuICovCisJCXsgLmFkZCA9IHNldHVwX2lzbDI5MDE4X2FscywgSTJDX0FEQVBURVJfU01CVVMgfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaHJvbWVvc19sYXB0b3Agc2Ftc3VuZ19zZXJpZXNfNSA9IHsKKwkuaTJjX3BlcmlwaGVyYWxzID0geworCQkvKiBMaWdodCBTZW5zb3IuICovCisJCXsgLmFkZCA9IHNldHVwX3RzbDI1ODNfYWxzLCBJMkNfQURBUFRFUl9TTUJVUyB9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNocm9tZW9zX2xhcHRvcCBjaHJvbWVib29rX3BpeGVsID0geworCS5pMmNfcGVyaXBoZXJhbHMgPSB7CisJCS8qIFRvdWNoIFNjcmVlbi4gKi8KKwkJeyAuYWRkID0gc2V0dXBfYXRtZWxfMTY2NHNfdHMsIEkyQ19BREFQVEVSX1BBTkVMIH0sCisJCS8qIFRvdWNocGFkLiAqLworCQl7IC5hZGQgPSBzZXR1cF9hdG1lbF8yMjRzX3RwLCBJMkNfQURBUFRFUl9WR0FEREMgfSwKKwkJLyogTGlnaHQgU2Vuc29yLiAqLworCQl7IC5hZGQgPSBzZXR1cF9pc2wyOTAxOF9hbHMsIEkyQ19BREFQVEVSX1BBTkVMIH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hyb21lb3NfbGFwdG9wIGFjZXJfYzdfY2hyb21lYm9vayA9IHsKKwkuaTJjX3BlcmlwaGVyYWxzID0geworCQkvKiBUb3VjaHBhZC4gKi8KKwkJeyAuYWRkID0gc2V0dXBfY3lhcGFfdHAsIEkyQ19BREFQVEVSX1NNQlVTIH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hyb21lb3NfbGFwdG9wIGFjZXJfYWM3MDAgPSB7CisJLmkyY19wZXJpcGhlcmFscyA9IHsKKwkJLyogTGlnaHQgU2Vuc29yLiAqLworCQl7IC5hZGQgPSBzZXR1cF90c2wyNTYzX2FscywgSTJDX0FEQVBURVJfU01CVVMgfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaHJvbWVvc19sYXB0b3AgaHBfcGF2aWxpb25fMTRfY2hyb21lYm9vayA9IHsKKwkuaTJjX3BlcmlwaGVyYWxzID0geworCQkvKiBUb3VjaHBhZC4gKi8KKwkJeyAuYWRkID0gc2V0dXBfY3lhcGFfdHAsIEkyQ19BREFQVEVSX1NNQlVTIH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hyb21lb3NfbGFwdG9wIGNyNDggPSB7CisJLmkyY19wZXJpcGhlcmFscyA9IHsKKwkJLyogTGlnaHQgU2Vuc29yLiAqLworCQl7IC5hZGQgPSBzZXR1cF90c2wyNTYzX2FscywgSTJDX0FEQVBURVJfU01CVVMgfSwKKwl9LAorfTsKKworI2RlZmluZSBfQ0JERChib2FyZF8pIFwKKwkuY2FsbGJhY2sgPSBjaHJvbWVvc19sYXB0b3BfZG1pX21hdGNoZWQsIFwKKwkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZib2FyZF8KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGNocm9tZW9zX2xhcHRvcF9kbWlfdGFibGVbXSBfX2luaXRkYXRhID0gewogCXsKLQkJLmlkZW50ID0gIlNhbXN1bmcgU2VyaWVzIDUgNTUwIC0gVG91Y2hwYWQiLAorCQkuaWRlbnQgPSAiU2Ftc3VuZyBTZXJpZXMgNSA1NTAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkciKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTHVtcHkiKSwKIAkJfSwKLQkJLmNhbGxiYWNrID0gc2V0dXBfY3lhcGFfc21idXNfdHAsCisJCV9DQkREKHNhbXN1bmdfc2VyaWVzXzVfNTUwKSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkNocm9tZWJvb2sgUGl4ZWwgLSBUb3VjaHNjcmVlbiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR09PR0xFIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpbmsiKSwKLQkJfSwKLQkJLmNhbGxiYWNrID0gc2V0dXBfYXRtZWxfMTY2NHNfdHMsCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJDaHJvbWVib29rIFBpeGVsIC0gVG91Y2hwYWQiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkdPT0dMRSIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMaW5rIiksCi0JCX0sCi0JCS5jYWxsYmFjayA9IHNldHVwX2F0bWVsXzIyNHNfdHAsCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJTYW1zdW5nIFNlcmllcyA1IDU1MCAtIExpZ2h0IFNlbnNvciIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMdW1weSIpLAotCQl9LAotCQkuY2FsbGJhY2sgPSBzZXR1cF9pc2wyOTAxOF9hbHMsCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJDaHJvbWVib29rIFBpeGVsIC0gTGlnaHQgU2Vuc29yIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJHT09HTEUiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGluayIpLAotCQl9LAotCQkuY2FsbGJhY2sgPSBzZXR1cF9pc2wyOTAyM19hbHMsCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJBY2VyIEM3IENocm9tZWJvb2sgLSBUb3VjaHBhZCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQYXJyb3QiKSwKLQkJfSwKLQkJLmNhbGxiYWNrID0gc2V0dXBfY3lhcGFfc21idXNfdHAsCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJIUCBQYXZpbGlvbiAxNCBDaHJvbWVib29rIC0gVG91Y2hwYWQiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQnV0dGVyZmx5IiksCi0JCX0sCi0JCS5jYWxsYmFjayA9IHNldHVwX2N5YXBhX3NtYnVzX3RwLAotCX0sCi0JewotCQkuaWRlbnQgPSAiU2Ftc3VuZyBTZXJpZXMgNSAtIExpZ2h0IFNlbnNvciIsCisJCS5pZGVudCA9ICJTYW1zdW5nIFNlcmllcyA1IiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFsZXgiKSwKIAkJfSwKLQkJLmNhbGxiYWNrID0gc2V0dXBfdHNsMjU4M19hbHMsCisJCV9DQkREKHNhbXN1bmdfc2VyaWVzXzUpLAogCX0sCiAJewotCQkuaWRlbnQgPSAiQ3ItNDggLSBMaWdodCBTZW5zb3IiLAorCQkuaWRlbnQgPSAiQ2hyb21lYm9vayBQaXhlbCIsCiAJCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYXJpbyIpLAorCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR09PR0xFIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpbmsiKSwKIAkJfSwKLQkJLmNhbGxiYWNrID0gc2V0dXBfdHNsMjU2M19hbHMsCisJCV9DQkREKGNocm9tZWJvb2tfcGl4ZWwpLAogCX0sCiAJewotCQkuaWRlbnQgPSAiQWNlciBBQzcwMCAtIExpZ2h0IFNlbnNvciIsCisJCS5pZGVudCA9ICJBY2VyIEM3IENocm9tZWJvb2siLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUGFycm90IiksCisJCX0sCisJCV9DQkREKGFjZXJfYzdfY2hyb21lYm9vayksCisJfSwKKwl7CisJCS5pZGVudCA9ICJBY2VyIEFDNzAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpHQiIpLAogCQl9LAotCQkuY2FsbGJhY2sgPSBzZXR1cF90c2wyNTYzX2FscywKKwkJX0NCREQoYWNlcl9hYzcwMCksCisJfSwKKwl7CisJCS5pZGVudCA9ICJIUCBQYXZpbGlvbiAxNCBDaHJvbWVib29rIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkJ1dHRlcmZseSIpLAorCQl9LAorCQlfQ0JERChocF9wYXZpbGlvbl8xNF9jaHJvbWVib29rKSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkNyLTQ4IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hcmlvIiksCisJCX0sCisJCV9DQkREKGNyNDgpLAogCX0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIGNocm9tZW9zX2xhcHRvcF9kbWlfdGFibGUpOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY3Jvc19wbGF0Zm9ybV9kZXZpY2U7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNyb3NfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImNocm9tZW9zX2xhcHRvcCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gY2hyb21lb3NfbGFwdG9wX3Byb2JlLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgY2hyb21lb3NfbGFwdG9wX2luaXQodm9pZCkKIHsKKwlpbnQgcmV0OwogCWlmICghZG1pX2NoZWNrX3N5c3RlbShjaHJvbWVvc19sYXB0b3BfZG1pX3RhYmxlKSkgewogCQlwcl9kZWJ1ZygiJXMgdW5zdXBwb3J0ZWQgc3lzdGVtLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNyb3NfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY3Jvc19wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImNocm9tZW9zX2xhcHRvcCIsIC0xKTsKKwlpZiAoIWNyb3NfcGxhdGZvcm1fZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoY3Jvc19wbGF0Zm9ybV9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UyOworCiAJcmV0dXJuIDA7CisKK2ZhaWxfcGxhdGZvcm1fZGV2aWNlMjoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGNyb3NfcGxhdGZvcm1fZGV2aWNlKTsKK2ZhaWxfcGxhdGZvcm1fZGV2aWNlMToKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3Jvc19wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjaHJvbWVvc19sYXB0b3BfZXhpdCh2b2lkKQpAQCAtMzk4LDYgKzUxMSw5IEBACiAJCWkyY191bnJlZ2lzdGVyX2RldmljZSh0cCk7CiAJaWYgKHRzKQogCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UodHMpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY3Jvc19wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjcm9zX3BsYXRmb3JtX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGNocm9tZW9zX2xhcHRvcF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL2Nocm9tZW9zX3BzdG9yZS5jIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY2hyb21lb3NfcHN0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlMGU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL2Nocm9tZW9zX3BzdG9yZS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogIGNocm9tZW9zX3BzdG9yZS5jIC0gRHJpdmVyIHRvIGluc3RhbnRpYXRlIENocm9tZWJvb2sgcmFtb29wcyBkZXZpY2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wc3RvcmVfcmFtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBjaHJvbWVvc19wc3RvcmVfZG1pX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS8qCisJCSAqIFRvZGF5IGFsbCBDaHJvbWVib29rcy9ib3hlcyBzaGlwIHdpdGggR09PR0xFIGFzIHZlbmRvciBhbmQKKwkJICogY29yZWJvb3QgYXMgYmlvcyB2ZW5kb3IuIE5vIG90aGVyIHN5c3RlbXMgd2l0aCB0aGlzCisJCSAqIGNvbWJpbmF0aW9uIGFyZSBrbm93biB0byBkYXRlLgorCQkgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJHT09HTEUiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJjb3JlYm9vdCIpLAorCQl9LAorCX0sCisJeworCQkvKgorCQkgKiBUaGUgZmlyc3QgU2Ftc3VuZyBDaHJvbWVib3ggYW5kIENocm9tZWJvb2sgU2VyaWVzIDUgNTUwIHVzZQorCQkgKiBjb3JlYm9vdCBidXQgd2l0aCBTYW1zdW5nIGFzIHRoZSBzeXN0ZW0gdmVuZG9yLgorCQkgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiY29yZWJvb3QiKSwKKwkJfSwKKwl9LAorCXsKKwkJLyogeDg2LWFsZXgsIHRoZSBmaXJzdCBTYW1zdW5nIENocm9tZWJvb2suICovCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQWxleCIpLAorCQl9LAorCX0sCisJeworCQkvKiB4ODYtbWFyaW8sIHRoZSBDci00OCBwaWxvdCBkZXZpY2UgZnJvbSBHb29nbGUuICovCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSUVDIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hcmlvIiksCisJCX0sCisJfSwKKwl7CisJCS8qIHg4Ni16Z2IsIHRoZSBmaXJzdCBBY2VyIENocm9tZWJvb2suICovCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQUNFUiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJaR0IiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBjaHJvbWVvc19wc3RvcmVfZG1pX3RhYmxlKTsKKworLyoKKyAqIE9uIHg4NiBjaHJvbWVib29rcy9ib3hlcywgdGhlIGZpcm13YXJlIHdpbGwga2VlcCB0aGUgbGVnYWN5IFZHQSBtZW1vcnkKKyAqIHJhbmdlIHVudG91Y2hlZCBhY3Jvc3MgcmVib290cywgc28gd2UgdXNlIHRoYXQgdG8gc3RvcmUgb3VyIHBzdG9yZQorICogY29udGVudHMgZm9yIHBhbmljIGxvZ3MsIGV0Yy4KKyAqLworc3RhdGljIHN0cnVjdCByYW1vb3BzX3BsYXRmb3JtX2RhdGEgY2hyb21lb3NfcmFtb29wc19kYXRhID0geworCS5tZW1fc2l6ZQk9IDB4MTAwMDAwLAorCS5tZW1fYWRkcmVzcwk9IDB4ZjAwMDAwLAorCS5yZWNvcmRfc2l6ZQk9IDB4MjAwMDAsCisJLmNvbnNvbGVfc2l6ZQk9IDB4MjAwMDAsCisJLmZ0cmFjZV9zaXplCT0gMHgyMDAwMCwKKwkuZHVtcF9vb3BzCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNocm9tZW9zX3JhbW9vcHMgPSB7CisJLm5hbWUgPSAicmFtb29wcyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmY2hyb21lb3NfcmFtb29wc19kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjaHJvbWVvc19wc3RvcmVfaW5pdCh2b2lkKQoreworCWlmIChkbWlfY2hlY2tfc3lzdGVtKGNocm9tZW9zX3BzdG9yZV9kbWlfdGFibGUpKQorCQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjaHJvbWVvc19yYW1vb3BzKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2hyb21lb3NfcHN0b3JlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmY2hyb21lb3NfcmFtb29wcyk7Cit9CisKK21vZHVsZV9pbml0KGNocm9tZW9zX3BzdG9yZV9pbml0KTsKK21vZHVsZV9leGl0KGNocm9tZW9zX3BzdG9yZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaHJvbWUgT1MgcHN0b3JlIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKaW5kZXggZDlkY2QzNy4uNWFlNjVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCkBAIC0xOTcsNiArMTk3LDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBocF9hY2NlbC4KIAorY29uZmlnIEhQX1dJUkVMRVNTCisJdHJpc3RhdGUgIkhQIFdJUkVMRVNTIgorCWRlcGVuZHMgb24gQUNQSQorCWRlcGVuZHMgb24gSU5QVVQKKwloZWxwCisJIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnRzIGZvciBuZXcgSFAgd2lyZWxlc3MgYnV0dG9uIGZvciBXaW5kb3dzIDguCisJIE9uIHN1Y2ggc3lzdGVtcyB0aGUgZHJpdmVyIHNob3VsZCBsb2FkIGF1dG9tYXRpY2FsbHkgKHZpYSBBQ1BJIGFsaWFzKS4KKworCSBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgYmUgY2FsbGVkIGhwLXdpcmVsZXNzLgorCiBjb25maWcgSFBfV01JCiAJdHJpc3RhdGUgIkhQIFdNSSBleHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJX1dNSQpAQCAtODA4LDQgKzgxOSwxMiBAQAogCSAgYSBwYXJhdmlydHVhbGl6ZWQgZGV2aWNlIHByb3ZpZGVkIGJ5IFFFTVU7IGl0IGxldHMgYSB2aXJ0dWFsIG1hY2hpbmUKIAkgIChndWVzdCkgY29tbXVuaWNhdGUgcGFuaWMgZXZlbnRzIHRvIHRoZSBob3N0LgogCitjb25maWcgSU5URUxfQkFZVFJBSUxfTUJJCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIE5lZWRlZCBvbiBCYXl0cmFpbCBwbGF0Zm9ybXMgZm9yIGFjY2VzcyB0byB0aGUgSU9TRiBTaWRlYmFuZCBNYWlsYm94CisJICBJbnRlcmZhY2UuIFRoaXMgaXMgYSByZXF1aXJlbWVudCBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgdG8gY29uZmlndXJlCisJICB0aGUgUFVOSVQgZm9yIHBvd2VyIG1hbmFnZW1lbnQgZmVhdHVyZXMgc3VjaCBhcyBSQVBMLgorCiBlbmRpZiAjIFg4Nl9QTEFURk9STV9ERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZSBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L01ha2VmaWxlCmluZGV4IGYwZTZhYTQuLjliODdjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfQUNFUl9XTUkpCQkrPSBhY2VyLXdtaS5vCiBvYmotJChDT05GSUdfQUNFUkhERikJCSs9IGFjZXJoZGYubwogb2JqLSQoQ09ORklHX0hQX0FDQ0VMKQkJKz0gaHBfYWNjZWwubworb2JqLSQoQ09ORklHX0hQX1dJUkVMRVNTKQkrPSBocC13aXJlbGVzcy5vCiBvYmotJChDT05GSUdfSFBfV01JKQkJKz0gaHAtd21pLm8KIG9iai0kKENPTkZJR19BTUlMT19SRktJTEwpCSs9IGFtaWxvLXJma2lsbC5vCiBvYmotJChDT05GSUdfVEMxMTAwX1dNSSkJKz0gdGMxMTAwLXdtaS5vCkBAIC01NCwzICs1NSw0IEBACiBvYmotJChDT05GSUdfSU5URUxfU01BUlRDT05ORUNUKQkrPSBpbnRlbC1zbWFydGNvbm5lY3QubwogCiBvYmotJChDT05GSUdfUFZQQU5JQykgICAgICAgICAgICs9IHB2cGFuaWMubworb2JqLSQoQ09ORklHX0lOVEVMX0JBWVRSQUlMX01CSSkJKz0gaW50ZWxfYmF5dHJhaWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKaW5kZXggMTA5ZjYzOC4uYzVlMDgyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCkBAIC0xODMsNyArMTgzLDYgQEAKIAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2OwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHRfZGV2aWNlOwotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldmljZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CiAKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2IHdsYW5fbGVkOwpAQCAtMTA3MiwyMCArMTA3MSwxMiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19JUlVHTywgYXN1c19od21vbl9wd20xLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIGFzdXNfaHdtb25fdGVtcDEsIE5VTEwsIDApOwotCi1zdGF0aWMgc3NpemVfdAotc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJhc3VzXG4iKTsKLX0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMLCAwKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPLCBhc3VzX2h3bW9uX3B3bTEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBhc3VzX2h3bW9uX3RlbXAxLCBOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmh3bW9uX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmRldl9hdHRyX3B3bTEuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0xMDk5LDkgKzEwOTAsOSBAQAogCWludCBkZXZfaWQgPSAtMTsKIAl1MzIgdmFsdWUgPSBBU1VTX1dNSV9VTlNVUFBPUlRFRF9NRVRIT0Q7CiAKLQlpZiAoYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0cikKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcHdtMS5hdHRyKQogCQlkZXZfaWQgPSBBU1VTX1dNSV9ERVZJRF9GQU5fQ1RSTDsKLQllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0cikKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyKQogCQlkZXZfaWQgPSBBU1VTX1dNSV9ERVZJRF9USEVSTUFMX0NUUkw7CiAKIAlpZiAoZGV2X2lkICE9IC0xKSB7CkBAIC0xMTM2LDM1ICsxMTI3LDIwIEBACiAJLmlzX3Zpc2libGUgPSBhc3VzX2h3bW9uX3N5c2ZzX2lzX3Zpc2libGUsCiAJLmF0dHJzID0gaHdtb25fYXR0cmlidXRlcwogfTsKLQotc3RhdGljIHZvaWQgYXN1c193bWlfaHdtb25fZXhpdChzdHJ1Y3QgYXN1c193bWkgKmFzdXMpCi17Ci0Jc3RydWN0IGRldmljZSAqaHdtb247Ci0KLQlod21vbiA9IGFzdXMtPmh3bW9uX2RldmljZTsKLQlpZiAoIWh3bW9uKQotCQlyZXR1cm47Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZod21vbi0+a29iaiwgJmh3bW9uX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoaHdtb24pOwotCWFzdXMtPmh3bW9uX2RldmljZSA9IE5VTEw7Ci19CitfX0FUVFJJQlVURV9HUk9VUFMoaHdtb25fYXR0cmlidXRlKTsKIAogc3RhdGljIGludCBhc3VzX3dtaV9od21vbl9pbml0KHN0cnVjdCBhc3VzX3dtaSAqYXN1cykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbjsKLQlpbnQgcmVzdWx0OwogCi0JaHdtb24gPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmFzdXMtPnBsYXRmb3JtX2RldmljZS0+ZGV2KTsKKwlod21vbiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmYXN1cy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYsCisJCQkJCQkgICJhc3VzIiwgYXN1cywKKwkJCQkJCSAgaHdtb25fYXR0cmlidXRlX2dyb3Vwcyk7CiAJaWYgKElTX0VSUihod21vbikpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgYXN1cyBod21vbiBkZXZpY2VcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihod21vbik7CiAJfQotCWRldl9zZXRfZHJ2ZGF0YShod21vbiwgYXN1cyk7Ci0JYXN1cy0+aHdtb25fZGV2aWNlID0gaHdtb247Ci0JcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZod21vbi0+a29iaiwgJmh3bW9uX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJlc3VsdCkKLQkJYXN1c193bWlfaHdtb25fZXhpdChhc3VzKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTgzNSw3ICsxODExLDYgQEAKIGZhaWxfcmZraWxsOgogCWFzdXNfd21pX2xlZF9leGl0KGFzdXMpOwogZmFpbF9sZWRzOgotCWFzdXNfd21pX2h3bW9uX2V4aXQoYXN1cyk7CiBmYWlsX2h3bW9uOgogCWFzdXNfd21pX2lucHV0X2V4aXQoYXN1cyk7CiBmYWlsX2lucHV0OgpAQCAtMTg1Myw3ICsxODI4LDYgQEAKIAl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGFzdXMtPmRyaXZlci0+ZXZlbnRfZ3VpZCk7CiAJYXN1c193bWlfYmFja2xpZ2h0X2V4aXQoYXN1cyk7CiAJYXN1c193bWlfaW5wdXRfZXhpdChhc3VzKTsKLQlhc3VzX3dtaV9od21vbl9leGl0KGFzdXMpOwogCWFzdXNfd21pX2xlZF9leGl0KGFzdXMpOwogCWFzdXNfd21pX3Jma2lsbF9leGl0KGFzdXMpOwogCWFzdXNfd21pX2RlYnVnZnNfZXhpdChhc3VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwppbmRleCBlYWE3OGVkLi43Mjk3ZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCkBAIC0xNzMsOCArMTczLDcgQEAKIC8qID09PT09PT0gKi8KIHN0cnVjdCBjb21wYWxfZGF0YXsKIAkvKiBGYW4gY29udHJvbCAqLwotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKLQlpbnQgcHdtX2VuYWJsZTsgLyogMDpmdWxsIG9uLCAxOnNldCBieSBwd20xLCAyOmNvbnRyb2wgYnkgbW90ZXJib2FyZCAqLworCWludCBwd21fZW5hYmxlOyAvKiAwOmZ1bGwgb24sIDE6c2V0IGJ5IHB3bTEsIDI6Y29udHJvbCBieSBtb3RoZXJib2FyZCAqLwogCXVuc2lnbmVkIGNoYXIgY3Vycl9wd207CiAKIAkvKiBQb3dlciBzdXBwbHkgKi8KQEAgLTQwMiwxNSArNDAxLDYgQEAKIFNJTVBMRV9NQVNLRURfU1RPUkVfU0hPVyh3YWtlX3VwX2tleSwJV0FLRV9VUF9BRERSLCBXQUtFX1VQX0tFWSkKIFNJTVBMRV9NQVNLRURfU1RPUkVfU0hPVyh3YWtlX3VwX21vdXNlLAlXQUtFX1VQX0FERFIsIFdBS0VfVVBfTU9VU0UpCiAKLQotLyogR2VuZXJhbCBod21vbiBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzc2l6ZV90IGh3bW9uX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIERSSVZFUl9OQU1FKTsKLX0KLQotCiAvKiBGYW4gY29udHJvbCBpbnRlcmZhY2UgKi8KIHN0YXRpYyBzc2l6ZV90IHB3bV9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC02NjUsNTYgKzY1NSw1NiBAQAogc3RhdGljIERFVklDRV9BVFRSKHdha2VfdXBfbW91c2UsCiAJCTA2NDQsIHdha2VfdXBfbW91c2Vfc2hvdywJd2FrZV91cF9tb3VzZV9zdG9yZSk7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgICAgICAgIFNfSVJVR08sIGh3bW9uX25hbWVfc2hvdywgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgIFNfSVJVR08sIGZhbl9zaG93LCAgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHRlbXBfY3B1LCAgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHRlbXBfY3B1X2xvY2FsLCAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHRlbXBfY3B1X0RUUywgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sIHRlbXBfbm9ydGhicmlkZ2UsICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sIHRlbXBfdmdhLCAgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDZfaW5wdXQsIFNfSVJVR08sIHRlbXBfU0tJTiwgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWwsIFNfSVJVR08sIGxhYmVsX2NwdSwgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbGFiZWwsIFNfSVJVR08sIGxhYmVsX2NwdV9sb2NhbCwgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbGFiZWwsIFNfSVJVR08sIGxhYmVsX2NwdV9EVFMsICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbGFiZWwsIFNfSVJVR08sIGxhYmVsX25vcnRoYnJpZGdlLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbGFiZWwsIFNfSVJVR08sIGxhYmVsX3ZnYSwgICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDZfbGFiZWwsIFNfSVJVR08sIGxhYmVsX1NLSU4sICAgICAgICBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsIHB3bV9zaG93LCBwd21fc3RvcmUsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwKLQkJU19JUlVHTyB8IFNfSVdVU1IsIHB3bV9lbmFibGVfc2hvdywgcHdtX2VuYWJsZV9zdG9yZSwgMCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgIFNfSVJVR08sIGZhbl9zaG93LCAgICAgICAgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgdGVtcF9jcHUsICAgICAgICAgIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCB0ZW1wX2NwdV9sb2NhbCwgICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHRlbXBfY3B1X0RUUywgICAgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgdGVtcF9ub3J0aGJyaWRnZSwgIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXA1X2lucHV0LCBTX0lSVUdPLCB0ZW1wX3ZnYSwgICAgICAgICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDZfaW5wdXQsIFNfSVJVR08sIHRlbXBfU0tJTiwgICAgICAgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywgbGFiZWxfY3B1LCAgICAgICAgIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9jcHVfbG9jYWwsICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfbGFiZWwsIFNfSVJVR08sIGxhYmVsX2NwdV9EVFMsICAgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wNF9sYWJlbCwgU19JUlVHTywgbGFiZWxfbm9ydGhicmlkZ2UsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXA1X2xhYmVsLCBTX0lSVUdPLCBsYWJlbF92Z2EsICAgICAgICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDZfbGFiZWwsIFNfSVJVR08sIGxhYmVsX1NLSU4sICAgICAgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgcHdtX3Nob3csIHB3bV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHdtMV9lbmFibGUsCisJCSAgIFNfSVJVR08gfCBTX0lXVVNSLCBwd21fZW5hYmxlX3Nob3csIHB3bV9lbmFibGVfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY29tcGFsX2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb21wYWxfcGxhdGZvcm1fYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfd2FrZV91cF9wbWUuYXR0ciwKIAkmZGV2X2F0dHJfd2FrZV91cF9tb2RlbS5hdHRyLAogCSZkZXZfYXR0cl93YWtlX3VwX2xhbi5hdHRyLAogCSZkZXZfYXR0cl93YWtlX3VwX3dsYW4uYXR0ciwKIAkmZGV2X2F0dHJfd2FrZV91cF9rZXkuYXR0ciwKIAkmZGV2X2F0dHJfd2FrZV91cF9tb3VzZS5hdHRyLAotCS8qIE1heWJlIHB1dCB0aGUgc2Vuc29yLXN0dWZmIGluIGEgc2VwYXJhdGUgaHdtb24tZHJpdmVyPyBUaGF0IHdheSwKLQkgKiB0aGUgaHdtb24gc3lzZnMgd29uJ3QgYmUgY2x1dHRlcmVkIHdpdGggdGhlIGFib3ZlIGZpbGVzLiAqLwotCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjb21wYWxfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGNvbXBhbF9hdHRyaWJ1dGVzCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjb21wYWxfcGxhdGZvcm1fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBjb21wYWxfcGxhdGZvcm1fYXR0cnMKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb21wYWxfaHdtb25fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcHdtMV9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfcHdtMS5hdHRyLAorCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAyX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAzX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXA0X2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXA1X2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXA2X2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXAyX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXAzX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXA0X2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXA1X2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXA2X2xhYmVsLmF0dHIsCisJTlVMTAorfTsKK0FUVFJJQlVURV9HUk9VUFMoY29tcGFsX2h3bW9uKTsKKwogc3RhdGljIGludCBjb21wYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIHN0YXRpYyBpbnQgY29tcGFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY29tcGFsX2RyaXZlciA9IHsKQEAgLTEwMjEsMzAgKzEwMTEsMjggQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBjb21wYWxfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAKIAlpZiAoIWV4dHJhX2ZlYXR1cmVzKQogCQlyZXR1cm4gMDsKIAogCS8qIEZhbiBjb250cm9sICovCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21wYWxfZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjb21wYWxfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbml0aWFsaXplX2Zhbl9jb250cm9sX2RhdGEoZGF0YSk7CiAKLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmY29tcGFsX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKGVycikgewotCQlrZnJlZShkYXRhKTsKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmY29tcGFsX3BsYXRmb3JtX2F0dHJfZ3JvdXApOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JfQogCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwotCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJJmNvbXBhbF9hdHRyaWJ1dGVfZ3JvdXApOwotCQlrZnJlZShkYXRhKTsKLQkJcmV0dXJuIGVycjsKKwlod21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoJnBkZXYtPmRldiwKKwkJCQkJCSAgICAgIERSSVZFUl9OQU1FLCBkYXRhLAorCQkJCQkJICAgICAgY29tcGFsX2h3bW9uX2dyb3Vwcyk7CisJaWYgKElTX0VSUihod21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoaHdtb25fZGV2KTsKKwkJZ290byByZW1vdmU7CiAJfQogCiAJLyogUG93ZXIgc3VwcGx5ICovCkBAIC0xMDU0LDYgKzEwNDIsMTAgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAogCXJldHVybiAwOworCityZW1vdmU6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmNvbXBhbF9wbGF0Zm9ybV9hdHRyX2dyb3VwKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY29tcGFsX2NsZWFudXAodm9pZCkKQEAgLTEwODAsMTIgKzEwNzIsOSBAQAogCXB3bV9kaXNhYmxlX2NvbnRyb2woKTsKIAogCWRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkYXRhLT5wc3kpOwogCi0Ja2ZyZWUoZGF0YSk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmY29tcGFsX2F0dHJpYnV0ZV9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmNvbXBhbF9wbGF0Zm9ybV9hdHRyX2dyb3VwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggYzYwOGIxZC4uZmVkNDExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCkBAIC01NTksMTkgKzU1OSw0NSBAQAogfQogc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGRlbGxfcmZraWxsX3dvcmssIGRlbGxfdXBkYXRlX3Jma2lsbCk7CiAKK3N0YXRpYyBib29sIGRlbGxfbGFwdG9wX2k4MDQyX2ZpbHRlcih1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGNoYXIgc3RyLAorCQkJICAgICAgc3RydWN0IHNlcmlvICpwb3J0KQoreworCXN0YXRpYyBib29sIGV4dGVuZGVkOworCisJaWYgKHN0ciAmIDB4MjApCisJCXJldHVybiBmYWxzZTsKKworCWlmICh1bmxpa2VseShkYXRhID09IDB4ZTApKSB7CisJCWV4dGVuZGVkID0gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAodW5saWtlbHkoZXh0ZW5kZWQpKSB7CisJCXN3aXRjaCAoZGF0YSkgeworCQljYXNlIDB4ODoKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGVsbF9yZmtpbGxfd29yaywKKwkJCQkJICAgICAgcm91bmRfamlmZmllc19yZWxhdGl2ZShIWiAvIDQpKTsKKwkJCWJyZWFrOworCQl9CisJCWV4dGVuZGVkID0gZmFsc2U7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBkZWxsX3NldHVwX3Jma2lsbCh2b2lkKQogewotCWludCBzdGF0dXM7Ci0JaW50IHJldDsKKwlpbnQgc3RhdHVzLCByZXQsIHdoaXRlbGlzdGVkOwogCWNvbnN0IGNoYXIgKnByb2R1Y3Q7CiAKIAkvKgotCSAqIHJma2lsbCBjYXVzZXMgdHJvdWJsZSBvbiB2YXJpb3VzIG5vbiBMYXRpdHVkZXMsIGFjY29yZGluZyB0byBEZWxsCi0JICogYWN0dWFsbHkgdGVzdGluZyB0aGUgcmZraWxsIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkb25lIG9uIExhdGl0dWRlcy4KKwkgKiByZmtpbGwgc3VwcG9ydCBjYXVzZXMgdHJvdWJsZSBvbiB2YXJpb3VzIG1vZGVscywgbW9zdGx5IEluc3Bpcm9ucy4KKwkgKiBTbyB3ZSB3aGl0ZWxpc3QgY2VydGFpbiBzZXJpZXMsIGFuZCBkb24ndCBzdXBwb3J0IHJma2lsbCBvbiBvdGhlcnMuCiAJICovCisJd2hpdGVsaXN0ZWQgPSAwOwogCXByb2R1Y3QgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOwotCWlmICghZm9yY2VfcmZraWxsICYmICghcHJvZHVjdCB8fCBzdHJuY21wKHByb2R1Y3QsICJMYXRpdHVkZSIsIDgpKSkKKwlpZiAocHJvZHVjdCAmJiAgKHN0cm5jbXAocHJvZHVjdCwgIkxhdGl0dWRlIiwgOCkgPT0gMCB8fAorCQkJIHN0cm5jbXAocHJvZHVjdCwgIlByZWNpc2lvbiIsIDkpID09IDApKQorCQl3aGl0ZWxpc3RlZCA9IDE7CisJaWYgKCFmb3JjZV9yZmtpbGwgJiYgIXdoaXRlbGlzdGVkKQogCQlyZXR1cm4gMDsKIAogCWdldF9idWZmZXIoKTsKQEAgLTYzMyw3ICs2NTksMTYgQEAKIAkJCWdvdG8gZXJyX3d3YW47CiAJfQogCisJcmV0ID0gaTgwNDJfaW5zdGFsbF9maWx0ZXIoZGVsbF9sYXB0b3BfaTgwNDJfZmlsdGVyKTsKKwlpZiAocmV0KSB7CisJCXByX3dhcm4oIlVuYWJsZSB0byBpbnN0YWxsIGtleSBmaWx0ZXJcbiIpOworCQlnb3RvIGVycl9maWx0ZXI7CisJfQorCiAJcmV0dXJuIDA7CitlcnJfZmlsdGVyOgorCWlmICh3d2FuX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIod3dhbl9yZmtpbGwpOwogZXJyX3d3YW46CiAJcmZraWxsX2Rlc3Ryb3kod3dhbl9yZmtpbGwpOwogCWlmIChibHVldG9vdGhfcmZraWxsKQpAQCAtNjg0LDcgKzcxOSw3IEBACiAKIG91dDoKIAlyZWxlYXNlX2J1ZmZlcigpOwotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGVsbF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKQEAgLTc1NSwzMCArNzkwLDYgQEAKIAlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmdG91Y2hwYWRfbGVkKTsKIH0KIAotc3RhdGljIGJvb2wgZGVsbF9sYXB0b3BfaTgwNDJfZmlsdGVyKHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgY2hhciBzdHIsCi0JCQkgICAgICBzdHJ1Y3Qgc2VyaW8gKnBvcnQpCi17Ci0Jc3RhdGljIGJvb2wgZXh0ZW5kZWQ7Ci0KLQlpZiAoc3RyICYgMHgyMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKHVubGlrZWx5KGRhdGEgPT0gMHhlMCkpIHsKLQkJZXh0ZW5kZWQgPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmICh1bmxpa2VseShleHRlbmRlZCkpIHsKLQkJc3dpdGNoIChkYXRhKSB7Ci0JCWNhc2UgMHg4OgotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZWxsX3Jma2lsbF93b3JrLAotCQkJCQkgICAgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaIC8gNCkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZXh0ZW5kZWQgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGRlbGxfaW5pdCh2b2lkKQogewogCWludCBtYXhfaW50ZW5zaXR5ID0gMDsKQEAgLTgyOCwxMiArODM5LDYgQEAKIAkJZ290byBmYWlsX3Jma2lsbDsKIAl9CiAKLQlyZXQgPSBpODA0Ml9pbnN0YWxsX2ZpbHRlcihkZWxsX2xhcHRvcF9pODA0Ml9maWx0ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJfd2FybigiVW5hYmxlIHRvIGluc3RhbGwga2V5IGZpbHRlclxuIik7Ci0JCWdvdG8gZmFpbF9maWx0ZXI7Ci0JfQotCiAJaWYgKHF1aXJrcyAmJiBxdWlya3MtPnRvdWNocGFkX2xlZCkKIAkJdG91Y2hwYWRfbGVkX2luaXQoJnBsYXRmb3JtX2RldmljZS0+ZGV2KTsKIApAQCAtODg1LDcgKzg5MCw2IEBACiBmYWlsX2JhY2tsaWdodDoKIAlpODA0Ml9yZW1vdmVfZmlsdGVyKGRlbGxfbGFwdG9wX2k4MDQyX2ZpbHRlcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZWxsX3Jma2lsbF93b3JrKTsKLWZhaWxfZmlsdGVyOgogCWRlbGxfY2xlYW51cF9yZmtpbGwoKTsKIGZhaWxfcmZraWxsOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXJwYWdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKaW5kZXggZWQ2OWVjNS4uMzk5ZThjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKQEAgLTE2NSw3ICsxNjUsNiBAQAogCiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkJLyogdGhlIGRldmljZSB3ZSBhcmUgaW4gKi8KLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXZpY2U7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodF9kZXZpY2U7CiAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKQEAgLTEwNjgsNyArMTA2Nyw3IEBACiAJewkJCQkJCQkJXAogCQlyZXR1cm4gc3RvcmVfc3lzX2h3bW9uKF9nZXQsIGJ1ZiwgY291bnQpOwkJXAogCX0JCQkJCQkJCVwKLQlzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKF9uYW1lLCBfbW9kZSwgc2hvd18jI19uYW1lLCBzdG9yZV8jI19uYW1lLCAwKTsKKwlzdGF0aWMgREVWSUNFX0FUVFIoX25hbWUsIF9tb2RlLCBzaG93XyMjX25hbWUsIHN0b3JlXyMjX25hbWUpOwogCiBFRUVQQ19DUkVBVEVfU0VOU09SX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgZWVlcGNfZ2V0X2Zhbl9ycG0sIE5VTEwpOwogRUVFUENfQ1JFQVRFX1NFTlNPUl9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLApAQCAtMTA3Niw1NSArMTA3NSwyNiBAQAogRUVFUENfQ1JFQVRFX1NFTlNPUl9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSBlZWVwY19nZXRfZmFuX2N0cmwsIGVlZXBjX3NldF9mYW5fY3RybCk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVlZXBjXG4iKTsKLX0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMLCAwKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmh3bW9uX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaHdtb25fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcHdtMS5hdHRyLAorCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3B3bTFfZW5hYmxlLmF0dHIsCiAJTlVMTAogfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaHdtb25fYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGh3bW9uX2F0dHJpYnV0ZXMKLX07Ci0KLXN0YXRpYyB2b2lkIGVlZXBjX2h3bW9uX2V4aXQoc3RydWN0IGVlZXBjX2xhcHRvcCAqZWVlcGMpCi17Ci0Jc3RydWN0IGRldmljZSAqaHdtb247Ci0KLQlod21vbiA9IGVlZXBjLT5od21vbl9kZXZpY2U7Ci0JaWYgKCFod21vbikKLQkJcmV0dXJuOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaHdtb24tPmtvYmosCi0JCQkgICAmaHdtb25fYXR0cmlidXRlX2dyb3VwKTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3Rlcihod21vbik7Ci0JZWVlcGMtPmh3bW9uX2RldmljZSA9IE5VTEw7Ci19CitBVFRSSUJVVEVfR1JPVVBTKGh3bW9uKTsKIAogc3RhdGljIGludCBlZWVwY19od21vbl9pbml0KHN0cnVjdCBlZWVwY19sYXB0b3AgKmVlZXBjKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZlZWVwYy0+cGxhdGZvcm1fZGV2aWNlLT5kZXY7CiAJc3RydWN0IGRldmljZSAqaHdtb247Ci0JaW50IHJlc3VsdDsKIAotCWh3bW9uID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZlZWVwYy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYpOworCWh3bW9uID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCAiZWVlcGMiLCBOVUxMLAorCQkJCQkJICAgICAgIGh3bW9uX2dyb3Vwcyk7CiAJaWYgKElTX0VSUihod21vbikpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgZWVlcGMgaHdtb24gZGV2aWNlXG4iKTsKLQkJZWVlcGMtPmh3bW9uX2RldmljZSA9IE5VTEw7CiAJCXJldHVybiBQVFJfRVJSKGh3bW9uKTsKIAl9Ci0JZWVlcGMtPmh3bW9uX2RldmljZSA9IGh3bW9uOwotCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaHdtb24tPmtvYmosCi0JCQkJICAgICZod21vbl9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChyZXN1bHQpCi0JCWVlZXBjX2h3bW9uX2V4aXQoZWVlcGMpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDgwLDcgKzE0NTAsNiBAQAogZmFpbF9yZmtpbGw6CiAJZWVlcGNfbGVkX2V4aXQoZWVlcGMpOwogZmFpbF9sZWQ6Ci0JZWVlcGNfaHdtb25fZXhpdChlZWVwYyk7CiBmYWlsX2h3bW9uOgogCWVlZXBjX2lucHV0X2V4aXQoZWVlcGMpOwogZmFpbF9pbnB1dDoKQEAgLTE1MDAsNyArMTQ2OSw2IEBACiAJZWVlcGNfYmFja2xpZ2h0X2V4aXQoZWVlcGMpOwogCWVlZXBjX3Jma2lsbF9leGl0KGVlZXBjKTsKIAllZWVwY19pbnB1dF9leGl0KGVlZXBjKTsKLQllZWVwY19od21vbl9leGl0KGVlZXBjKTsKIAllZWVwY19sZWRfZXhpdChlZWVwYyk7CiAJZWVlcGNfcGxhdGZvcm1fZXhpdChlZWVwYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCmluZGV4IDlkMzBkNjkuLmJlMDJiY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYwpAQCAtNjMzLDcgKzYzMyw2IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9mdWppdHN1X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgc3RhdGUgPSAwOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCWludCBlcnJvcjsKQEAgLTY2OSw4ICs2NjgsOCBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJfZnJlZV9pbnB1dF9kZXY7CiAKLQlyZXN1bHQgPSBhY3BpX2J1c191cGRhdGVfcG93ZXIoZnVqaXRzdS0+YWNwaV9oYW5kbGUsICZzdGF0ZSk7Ci0JaWYgKHJlc3VsdCkgeworCWVycm9yID0gYWNwaV9idXNfdXBkYXRlX3Bvd2VyKGZ1aml0c3UtPmFjcGlfaGFuZGxlLCAmc3RhdGUpOworCWlmIChlcnJvcikgewogCQlwcl9lcnIoIkVycm9yIHJlYWRpbmcgcG93ZXIgc3RhdGVcbiIpOwogCQlnb3RvIGVycl91bnJlZ2lzdGVyX2lucHV0X2RldjsKIAl9CkBAIC03MDAsNyArNjk5LDcgQEAKIAkJZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MgPSBGVUpJVFNVX0xDRF9OX0xFVkVMUzsKIAlnZXRfbGNkX2xldmVsKCk7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogCiBlcnJfdW5yZWdpc3Rlcl9pbnB1dF9kZXY6CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwpAQCAtNzA4LDcgKzcwNyw3IEBACiBlcnJfZnJlZV9pbnB1dF9kZXY6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwogZXJyX3N0b3A6Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9mdWppdHN1X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKQEAgLTgzMSw4ICs4MzAsOCBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJfZnJlZV9pbnB1dF9kZXY7CiAKLQlyZXN1bHQgPSBhY3BpX2J1c191cGRhdGVfcG93ZXIoZnVqaXRzdV9ob3RrZXktPmFjcGlfaGFuZGxlLCAmc3RhdGUpOwotCWlmIChyZXN1bHQpIHsKKwllcnJvciA9IGFjcGlfYnVzX3VwZGF0ZV9wb3dlcihmdWppdHN1X2hvdGtleS0+YWNwaV9oYW5kbGUsICZzdGF0ZSk7CisJaWYgKGVycm9yKSB7CiAJCXByX2VycigiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaW5wdXRfZGV2OwogCX0KQEAgLTkwNyw3ICs5MDYsNyBAQAogZXJyX2ZyZWVfZmlmbzoKIAlrZmlmb19mcmVlKCZmdWppdHN1X2hvdGtleS0+Zmlmbyk7CiBlcnJfc3RvcDoKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBhY3BpX2Z1aml0c3VfaG90a2V5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwLXdpcmVsZXNzLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13aXJlbGVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTM0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13aXJlbGVzcy5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogIGhwLXdpcmVsZXNzIGJ1dHRvbiBmb3IgV2luZG93cyA4CisgKgorICogIENvcHlyaWdodCAoQykgMjAxNCBBbGV4IEh1bmcgPGFsZXguaHVuZ0BjYW5vbmljYWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQWxleCBIdW5nIik7CitNT0RVTEVfQUxJQVMoImFjcGkqOkhQUTYwMDE6KiIpOworCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqaHB3bF9pbnB1dF9kZXY7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaHB3bF9pZHNbXSA9IHsKKwl7IkhQUTYwMDEiLCAwfSwKKwl7IiIsIDB9LAorfTsKKworc3RhdGljIGludCBocF93aXJlbGVzc19pbnB1dF9zZXR1cCh2b2lkKQoreworCWludCBlcnI7CisKKwlocHdsX2lucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaHB3bF9pbnB1dF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaHB3bF9pbnB1dF9kZXYtPm5hbWUgPSAiSFAgV2lyZWxlc3MgaG90a2V5cyI7CisJaHB3bF9pbnB1dF9kZXYtPnBoeXMgPSAiaHBxNjAwMS9pbnB1dDAiOworCWhwd2xfaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaHB3bF9pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJc2V0X2JpdChLRVlfUkZLSUxMLCBocHdsX2lucHV0X2Rldi0+a2V5Yml0KTsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShocHdsX2lucHV0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGhwd2xfaW5wdXRfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBocF93aXJlbGVzc19pbnB1dF9kZXN0cm95KHZvaWQpCit7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaHB3bF9pbnB1dF9kZXYpOworfQorCitzdGF0aWMgdm9pZCBocHdsX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2LCB1MzIgZXZlbnQpCit7CisJaWYgKGV2ZW50ICE9IDB4ODApIHsKKwkJcHJfaW5mbygiUmVjZWl2ZWQgdW5rbm93biBldmVudCAoMHgleClcbiIsIGV2ZW50KTsKKwkJcmV0dXJuOworCX0KKworCWlucHV0X3JlcG9ydF9rZXkoaHB3bF9pbnB1dF9kZXYsIEtFWV9SRktJTEwsIDEpOworCWlucHV0X3N5bmMoaHB3bF9pbnB1dF9kZXYpOworCWlucHV0X3JlcG9ydF9rZXkoaHB3bF9pbnB1dF9kZXYsIEtFWV9SRktJTEwsIDApOworCWlucHV0X3N5bmMoaHB3bF9pbnB1dF9kZXYpOworfQorCitzdGF0aWMgaW50IGhwd2xfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWludCBlcnI7CisKKwllcnIgPSBocF93aXJlbGVzc19pbnB1dF9zZXR1cCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaHB3bF9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaHBfd2lyZWxlc3NfaW5wdXRfZGVzdHJveSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGhwd2xfZHJpdmVyID0geworCS5uYW1lCT0gImhwLXdpcmVsZXNzIiwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWRzCT0gaHB3bF9pZHMsCisJLm9wcwk9IHsKKwkJLmFkZAk9IGhwd2xfYWRkLAorCQkucmVtb3ZlCT0gaHB3bF9yZW1vdmUsCisJCS5ub3RpZnkJPSBocHdsX25vdGlmeSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaHB3bF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXByX2luZm8oIkluaXRpYWxpemluZyBIUFE2MDAxIG1vZHVsZVxuIik7CisJZXJyID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZocHdsX2RyaXZlcik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBIUCB3aXJlbGVzcyBjb250cm9sIGRyaXZlci5cbiIpOworCQlnb3RvIGVycm9yX2FjcGlfcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX2FjcGlfcmVnaXN0ZXI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhwd2xfZXhpdCh2b2lkKQoreworCXByX2luZm8oIkV4aXRpbmcgSFBRNjAwMSBtb2R1bGVcbiIpOworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZocHdsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGhwd2xfaW5pdCk7Cittb2R1bGVfZXhpdChocHdsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwX2FjY2VsLmMKaW5kZXggYWZmNGQwNi4uM2RjOTM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocF9hY2NlbC5jCkBAIC03Nyw2ICs3Nyw3IEBACiBzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGxpczNsdjAyZF9kZXZpY2VfaWRzW10gPSB7CiAJeyJIUFEwMDA0IiwgMH0sIC8qIEhQIE1vYmlsZSBEYXRhIFByb3RlY3Rpb24gU3lzdGVtIFBOUCAqLwogCXsiSFBRNjAwMCIsIDB9LCAvKiBIUCBNb2JpbGUgRGF0YSBQcm90ZWN0aW9uIFN5c3RlbSBQTlAgKi8KKwl7IkhQUTYwMDciLCAwfSwgLyogSFAgTW9iaWxlIERhdGEgUHJvdGVjdGlvbiBTeXN0ZW0gUE5QICovCiAJeyIiLCAwfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGxpczNsdjAyZF9kZXZpY2VfaWRzKTsKQEAgLTg4LDcgKzg5LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IGxpczNsdjAyZF9hY3BpX2luaXQoc3RydWN0IGxpczNsdjAyZCAqbGlzMykKK3N0YXRpYyBpbnQgbGlzM2x2MDJkX2FjcGlfaW5pdChzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gbGlzMy0+YnVzX3ByaXY7CiAJaWYgKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldi0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLApAQCAtMTA2LDcgKzEwNyw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCBsaXMzbHYwMmRfYWNwaV9yZWFkKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMsIGludCByZWcsIHU4ICpyZXQpCitzdGF0aWMgaW50IGxpczNsdjAyZF9hY3BpX3JlYWQoc3RydWN0IGxpczNsdjAyZCAqbGlzMywgaW50IHJlZywgdTggKnJldCkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGxpczMtPmJ1c19wcml2OwogCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CkBAIC0xMjksNyArMTMwLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IGxpczNsdjAyZF9hY3BpX3dyaXRlKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMsIGludCByZWcsIHU4IHZhbCkKK3N0YXRpYyBpbnQgbGlzM2x2MDJkX2FjcGlfd3JpdGUoc3RydWN0IGxpczNsdjAyZCAqbGlzMywgaW50IHJlZywgdTggdmFsKQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gbGlzMy0+YnVzX3ByaXY7CiAJdW5zaWduZWQgbG9uZyBsb25nIHJldDsgLyogTm90IHVzZWQgd2hlbiB3cml0dGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfYmF5dHJhaWwuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2JheXRyYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2JheXRyYWlsLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBCYXl0cmFpbCBJT1NGLVNCIE1haWxCb3ggSW50ZXJmYWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFRoZSBJT1NGLVNCIGlzIGEgZmFicmljIGJ1cyBhdmFpbGFibGUgb24gQXRvbSBiYXNlZCBTT0MncyB0aGF0IHVzZXMgYQorICogbWFpbGJveCBpbnRlcmZhY2UgKE1CSSkgdG8gY29tbXVuaWNhdGUgd2l0aCBtdXRpcGxlIGRldmljZXMuIFRoaXMKKyAqIGRyaXZlciBpbXBsZW1lbnRzIEJheVRyYWlsLXNwZWNpZmljIGFjY2VzcyB0byB0aGlzIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJpbnRlbF9iYXl0cmFpbC5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvc2ZfbWJpX2xvY2spOworCitzdGF0aWMgaW5saW5lIHUzMiBpb3NmX21iaV9mb3JtX21jcih1OCBvcCwgdTggcG9ydCwgdTggb2Zmc2V0KQoreworCXJldHVybiAob3AgPDwgMjQpIHwgKHBvcnQgPDwgMTYpIHwgKG9mZnNldCA8PCA4KSB8IEJUX01CSV9FTkFCTEU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqbWJpX3BkZXY7CS8qIG9uZSBtYmkgZGV2aWNlICovCisKKy8qIEhvbGQgbG9jayBiZWZvcmUgY2FsbGluZyAqLworc3RhdGljIGludCBpb3NmX21iaV9wY2lfcmVhZF9tZHIodTMyIG1jcngsIHUzMiBtY3IsIHUzMiAqbWRyKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIW1iaV9wZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtY3J4KSB7CisJCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQobWJpX3BkZXYsCisJCQkJCQlCVF9NQklfTUNSWF9PRkZTRVQsIG1jcngpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gaW9zZl9tYmlfcmVhZF9lcnI7CisJfQorCisJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYmlfcGRldiwKKwkJCQkJQlRfTUJJX01DUl9PRkZTRVQsIG1jcik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gaW9zZl9tYmlfcmVhZF9lcnI7CisKKwlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQobWJpX3BkZXYsCisJCQkJICAgICAgIEJUX01CSV9NRFJfT0ZGU0VULCBtZHIpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGlvc2ZfbWJpX3JlYWRfZXJyOworCisJcmV0dXJuIDA7CisKK2lvc2ZfbWJpX3JlYWRfZXJyOgorCWRldl9lcnIoJm1iaV9wZGV2LT5kZXYsICJlcnJvcjogUENJIGNvbmZpZyBvcGVyYXRpb24gcmV0dXJuZWQgJWRcbiIsCisJCXJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogSG9sZCBsb2NrIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgaW50IGlvc2ZfbWJpX3BjaV93cml0ZV9tZHIodTMyIG1jcngsIHUzMiBtY3IsIHUzMiBtZHIpCit7CisJaW50IHJlc3VsdDsKKworCWlmICghbWJpX3BkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYmlfcGRldiwKKwkJCQkJQlRfTUJJX01EUl9PRkZTRVQsIG1kcik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gaW9zZl9tYmlfd3JpdGVfZXJyOworCisJaWYgKG1jcngpIHsKKwkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYmlfcGRldiwKKwkJCSBCVF9NQklfTUNSWF9PRkZTRVQsIG1jcngpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gaW9zZl9tYmlfd3JpdGVfZXJyOworCX0KKworCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQobWJpX3BkZXYsCisJCQkJCUJUX01CSV9NQ1JfT0ZGU0VULCBtY3IpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGlvc2ZfbWJpX3dyaXRlX2VycjsKKworCXJldHVybiAwOworCitpb3NmX21iaV93cml0ZV9lcnI6CisJZGV2X2VycigmbWJpX3BkZXYtPmRldiwgImVycm9yOiBQQ0kgY29uZmlnIG9wZXJhdGlvbiByZXR1cm5lZCAlZFxuIiwKKwkJcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgYnRfbWJpX3JlYWQodTggcG9ydCwgdTggb3Bjb2RlLCB1MzIgb2Zmc2V0LCB1MzIgKm1kcikKK3sKKwl1MzIgbWNyLCBtY3J4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qQWNjZXNzIHRvIHRoZSBHRlggdW5pdCBpcyBoYW5kbGVkIGJ5IEdQVSBjb2RlICovCisJQlVHX09OKHBvcnQgPT0gQlRfTUJJX1VOSVRfR0ZYKTsKKworCW1jciA9IGlvc2ZfbWJpX2Zvcm1fbWNyKG9wY29kZSwgcG9ydCwgb2Zmc2V0ICYgQlRfTUJJX01BU0tfTE8pOworCW1jcnggPSBvZmZzZXQgJiBCVF9NQklfTUFTS19ISTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb3NmX21iaV9sb2NrLCBmbGFncyk7CisJcmV0ID0gaW9zZl9tYmlfcGNpX3JlYWRfbWRyKG1jcngsIG1jciwgbWRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3NmX21iaV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChidF9tYmlfcmVhZCk7CisKK2ludCBidF9tYmlfd3JpdGUodTggcG9ydCwgdTggb3Bjb2RlLCB1MzIgb2Zmc2V0LCB1MzIgbWRyKQoreworCXUzMiBtY3IsIG1jcng7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLypBY2Nlc3MgdG8gdGhlIEdGWCB1bml0IGlzIGhhbmRsZWQgYnkgR1BVIGNvZGUgKi8KKwlCVUdfT04ocG9ydCA9PSBCVF9NQklfVU5JVF9HRlgpOworCisJbWNyID0gaW9zZl9tYmlfZm9ybV9tY3Iob3Bjb2RlLCBwb3J0LCBvZmZzZXQgJiBCVF9NQklfTUFTS19MTyk7CisJbWNyeCA9IG9mZnNldCAmIEJUX01CSV9NQVNLX0hJOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvc2ZfbWJpX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBpb3NmX21iaV9wY2lfd3JpdGVfbWRyKG1jcngsIG1jciwgbWRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3NmX21iaV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChidF9tYmlfd3JpdGUpOworCitpbnQgYnRfbWJpX21vZGlmeSh1OCBwb3J0LCB1OCBvcGNvZGUsIHUzMiBvZmZzZXQsIHUzMiBtZHIsIHUzMiBtYXNrKQoreworCXUzMiBtY3IsIG1jcng7CisJdTMyIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qQWNjZXNzIHRvIHRoZSBHRlggdW5pdCBpcyBoYW5kbGVkIGJ5IEdQVSBjb2RlICovCisJQlVHX09OKHBvcnQgPT0gQlRfTUJJX1VOSVRfR0ZYKTsKKworCW1jciA9IGlvc2ZfbWJpX2Zvcm1fbWNyKG9wY29kZSwgcG9ydCwgb2Zmc2V0ICYgQlRfTUJJX01BU0tfTE8pOworCW1jcnggPSBvZmZzZXQgJiBCVF9NQklfTUFTS19ISTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb3NmX21iaV9sb2NrLCBmbGFncyk7CisKKwkvKiBSZWFkIGN1cnJlbnQgbWRyIHZhbHVlICovCisJcmV0ID0gaW9zZl9tYmlfcGNpX3JlYWRfbWRyKG1jcngsIG1jciAmIEJUX01CSV9SRF9NQVNLLCAmdmFsdWUpOworCWlmIChyZXQgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2ZfbWJpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBBcHBseSBtYXNrICovCisJdmFsdWUgJj0gfm1hc2s7CisJbWRyICY9IG1hc2s7CisJdmFsdWUgfD0gbWRyOworCisJLyogV3JpdGUgYmFjayAqLworCXJldCA9IGlvc2ZfbWJpX3BjaV93cml0ZV9tZHIobWNyeCwgbWNyIHwgQlRfTUJJX1dSX01BU0ssIHZhbHVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2ZfbWJpX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X21iaV9tb2RpZnkpOworCitzdGF0aWMgaW50IGlvc2ZfbWJpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqdW51c2VkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvcjogY291bGQgbm90IGVuYWJsZSBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1iaV9wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpb3NmX21iaV9wY2lfaWRzKSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwRjAwKSB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9zZl9tYmlfcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb3NmX21iaV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJpb3NmX21iaV9wY2kiLAorCS5wcm9iZQkJPSBpb3NmX21iaV9wcm9iZSwKKwkuaWRfdGFibGUJPSBpb3NmX21iaV9wY2lfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnRfbWJpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW9zZl9tYmlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBidF9tYmlfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9zZl9tYmlfcGNpX2RyaXZlcik7CisJaWYgKG1iaV9wZGV2KSB7CisJCXBjaV9kZXZfcHV0KG1iaV9wZGV2KTsKKwkJbWJpX3BkZXYgPSBOVUxMOworCX0KK30KKworbW9kdWxlX2luaXQoYnRfbWJpX2luaXQpOworbW9kdWxlX2V4aXQoYnRfbWJpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBFLiBCb3ggPGRhdmlkLmUuYm94QGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmF5VHJhaWwgTWFpbGJveCBJbnRlcmZhY2UgYWNjZXNzb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2JheXRyYWlsLmggYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9iYXl0cmFpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiY2MzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9iYXl0cmFpbC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBpbnRlbF9iYXl0cmFpbC5oOiBNYWlsQm94IGFjY2VzcyBzdXBwb3J0IGZvciBJbnRlbCBCYXlUcmFpbCBwbGF0Zm9ybXMKKyAqLworCisjaWZuZGVmIElOVEVMX0JBWVRSQUlMX01CSV9TWU1TX0gKKyNkZWZpbmUgSU5URUxfQkFZVFJBSUxfTUJJX1NZTVNfSAorCisjZGVmaW5lIEJUX01CSV9NQ1JfT0ZGU0VUCTB4RDAKKyNkZWZpbmUgQlRfTUJJX01EUl9PRkZTRVQJMHhENAorI2RlZmluZSBCVF9NQklfTUNSWF9PRkZTRVQJMHhEOAorCisjZGVmaW5lIEJUX01CSV9SRF9NQVNLCQkweEZFRkZGRkZGCisjZGVmaW5lIEJUX01CSV9XUl9NQVNLCQkwWDAxMDAwMDAwCisKKyNkZWZpbmUgQlRfTUJJX01BU0tfSEkJCTB4RkZGRkZGMDAKKyNkZWZpbmUgQlRfTUJJX01BU0tfTE8JCTB4MDAwMDAwRkYKKyNkZWZpbmUgQlRfTUJJX0VOQUJMRQkJMHhGMAorCisvKiBCVC1TQiB1bml0IGFjY2VzcyBtZXRob2RzICovCisjZGVmaW5lIEJUX01CSV9VTklUX0FVTklUCTB4MDAKKyNkZWZpbmUgQlRfTUJJX1VOSVRfU01DCQkweDAxCisjZGVmaW5lIEJUX01CSV9VTklUX0NQVQkJMHgwMgorI2RlZmluZSBCVF9NQklfVU5JVF9CVU5JVAkweDAzCisjZGVmaW5lIEJUX01CSV9VTklUX1BNQwkJMHgwNAorI2RlZmluZSBCVF9NQklfVU5JVF9HRlgJCTB4MDYKKyNkZWZpbmUgQlRfTUJJX1VOSVRfU01JCQkweDBDCisjZGVmaW5lIEJUX01CSV9VTklUX1VTQgkJMHg0MworI2RlZmluZSBCVF9NQklfVU5JVF9TQVRBCTB4QTMKKyNkZWZpbmUgQlRfTUJJX1VOSVRfUENJRQkweEE2CisKKy8qIFJlYWQvd3JpdGUgb3Bjb2RlcyAqLworI2RlZmluZSBCVF9NQklfQVVOSVRfUkVBRAkweDEwCisjZGVmaW5lIEJUX01CSV9BVU5JVF9XUklURQkweDExCisjZGVmaW5lIEJUX01CSV9TTUNfUkVBRAkJMHgxMAorI2RlZmluZSBCVF9NQklfU01DX1dSSVRFCTB4MTEKKyNkZWZpbmUgQlRfTUJJX0NQVV9SRUFECQkweDEwCisjZGVmaW5lIEJUX01CSV9DUFVfV1JJVEUJMHgxMQorI2RlZmluZSBCVF9NQklfQlVOSVRfUkVBRAkweDEwCisjZGVmaW5lIEJUX01CSV9CVU5JVF9XUklURQkweDExCisjZGVmaW5lIEJUX01CSV9QTUNfUkVBRAkJMHgwNgorI2RlZmluZSBCVF9NQklfUE1DX1dSSVRFCTB4MDcKKyNkZWZpbmUgQlRfTUJJX0dGWF9SRUFECQkweDAwCisjZGVmaW5lIEJUX01CSV9HRlhfV1JJVEUJMHgwMQorI2RlZmluZSBCVF9NQklfU01JT19SRUFECTB4MDYKKyNkZWZpbmUgQlRfTUJJX1NNSU9fV1JJVEUJMHgwNworI2RlZmluZSBCVF9NQklfVVNCX1JFQUQJCTB4MDYKKyNkZWZpbmUgQlRfTUJJX1VTQl9XUklURQkweDA3CisjZGVmaW5lIEJUX01CSV9TQVRBX1JFQUQJMHgwMAorI2RlZmluZSBCVF9NQklfU0FUQV9XUklURQkweDAxCisjZGVmaW5lIEJUX01CSV9QQ0lFX1JFQUQJMHgwMAorI2RlZmluZSBCVF9NQklfUENJRV9XUklURQkweDAxCisKKy8qKgorICogYnRfbWJpX3JlYWQoKSAtIE1haWxCb3ggSW50ZXJmYWNlIHJlYWQgY29tbWFuZAorICogQHBvcnQ6CXBvcnQgaW5kaWNhdGluZyBzdWJ1bml0IGJlaW5nIGFjY2Vzc2VkCisgKiBAb3Bjb2RlOglwb3J0IHNwZWNpZmljIHJlYWQgb3Igd3JpdGUgb3Bjb2RlCisgKiBAb2Zmc2V0OglyZWdpc3RlciBhZGRyZXNzIG9mZnNldAorICogQG1kcjoJcmVnaXN0ZXIgZGF0YSB0byBiZSByZWFkCisgKgorICogTG9ja2luZyBpcyBoYW5kbGVkIGJ5IHNwaW5sb2NrIC0gY2Fubm90IHNsZWVwLgorICogUmV0dXJuOiBOb256ZXJvIG9uIGVycm9yCisgKi8KK2ludCBidF9tYmlfcmVhZCh1OCBwb3J0LCB1OCBvcGNvZGUsIHUzMiBvZmZzZXQsIHUzMiAqbWRyKTsKKworLyoqCisgKiBidF9tYmlfd3JpdGUoKSAtIE1haWxCb3ggdW5tYXNrZWQgd3JpdGUgY29tbWFuZAorICogQHBvcnQ6CXBvcnQgaW5kaWNhdGluZyBzdWJ1bml0IGJlaW5nIGFjY2Vzc2VkCisgKiBAb3Bjb2RlOglwb3J0IHNwZWNpZmljIHJlYWQgb3Igd3JpdGUgb3Bjb2RlCisgKiBAb2Zmc2V0OglyZWdpc3RlciBhZGRyZXNzIG9mZnNldAorICogQG1kcjoJcmVnaXN0ZXIgZGF0YSB0byBiZSB3cml0dGVuCisgKgorICogTG9ja2luZyBpcyBoYW5kbGVkIGJ5IHNwaW5sb2NrIC0gY2Fubm90IHNsZWVwLgorICogUmV0dXJuOiBOb256ZXJvIG9uIGVycm9yCisgKi8KK2ludCBidF9tYmlfd3JpdGUodTggcG9ydCwgdTggb3Bjb2RlLCB1MzIgb2Zmc2V0LCB1MzIgbWRyKTsKKworLyoqCisgKiBidF9tYmlfbW9kaWZ5KCkgLSBNYWlsQm94IG1hc2tlZCB3cml0ZSBjb21tYW5kCisgKiBAcG9ydDoJcG9ydCBpbmRpY2F0aW5nIHN1YnVuaXQgYmVpbmcgYWNjZXNzZWQKKyAqIEBvcGNvZGU6CXBvcnQgc3BlY2lmaWMgcmVhZCBvciB3cml0ZSBvcGNvZGUKKyAqIEBvZmZzZXQ6CXJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0CisgKiBAbWRyOglyZWdpc3RlciBkYXRhIGJlaW5nIG1vZGlmaWVkCisgKiBAbWFzazoJbWFzayBpbmRpY2F0aW5nIGJpdHMgaW4gbWRyIHRvIGJlIG1vZGlmaWVkCisgKgorICogTG9ja2luZyBpcyBoYW5kbGVkIGJ5IHNwaW5sb2NrIC0gY2Fubm90IHNsZWVwLgorICogUmV0dXJuOiBOb256ZXJvIG9uIGVycm9yCisgKi8KK2ludCBidF9tYmlfbW9kaWZ5KHU4IHBvcnQsIHU4IG9wY29kZSwgdTMyIG9mZnNldCwgdTMyIG1kciwgdTMyIG1hc2spOworCisjZW5kaWYgLyogSU5URUxfQkFZVFJBSUxfTUJJX1NZTVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCmluZGV4IDYwZWE0NzYuLjc2Y2EwOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKQEAgLTYyLDEyICs2MiwxMCBAQAogI2RlZmluZSBJUENfUldCVUZfU0laRSAgICAyMAkJLyogSVBDIFJlYWQgYnVmZmVyIFNpemUgKi8KICNkZWZpbmUgSVBDX0lPQwkgICAgICAgICAgMHgxMDAJCS8qIElQQyBjb21tYW5kIHJlZ2lzdGVyIElPQyBiaXQgKi8KIAotZW51bSB7Ci0JU0NVX0lQQ19MSU5DUk9GVCwKLQlTQ1VfSVBDX1BFTldFTEwsCi0JU0NVX0lQQ19DTE9WRVJWSUVXLAotCVNDVV9JUENfVEFOR0lFUiwKLX07CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTElOQ1JPRlQJCTB4MDgyYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFTldFTEwJCTB4MDgwZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NMT1ZFUlZJRVcJMHgwOGVhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVEFOR0lFUgkJMHgxMWEwCiAKIC8qIGludGVsIHNjdSBpcGMgZHJpdmVyIGRhdGEqLwogc3RydWN0IGludGVsX3NjdV9pcGNfcGRhdGFfdCB7CkBAIC03OCwzNSArNzYsMjkgQEAKIAl1OCBpcnFfbW9kZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfc2N1X2lwY19wZGF0YV90IGludGVsX3NjdV9pcGNfcGRhdGFbXSA9IHsKLQlbU0NVX0lQQ19MSU5DUk9GVF0gPSB7Ci0JCS5pcGNfYmFzZSA9IDB4ZmYxMWMwMDAsCi0JCS5pMmNfYmFzZSA9IDB4ZmYxMmIwMDAsCi0JCS5pcGNfbGVuID0gMHgxMDAsCi0JCS5pMmNfbGVuID0gMHgxMCwKLQkJLmlycV9tb2RlID0gMCwKLQl9LAotCVtTQ1VfSVBDX1BFTldFTExdID0gewotCQkuaXBjX2Jhc2UgPSAweGZmMTFjMDAwLAotCQkuaTJjX2Jhc2UgPSAweGZmMTJiMDAwLAotCQkuaXBjX2xlbiA9IDB4MTAwLAotCQkuaTJjX2xlbiA9IDB4MTAsCi0JCS5pcnFfbW9kZSA9IDEsCi0JfSwKLQlbU0NVX0lQQ19DTE9WRVJWSUVXXSA9IHsKLQkJLmlwY19iYXNlID0gMHhmZjExYzAwMCwKLQkJLmkyY19iYXNlID0gMHhmZjEyYjAwMCwKLQkJLmlwY19sZW4gPSAweDEwMCwKLQkJLmkyY19sZW4gPSAweDEwLAotCQkuaXJxX21vZGUgPSAxLAotCX0sCi0JW1NDVV9JUENfVEFOR0lFUl0gPSB7Ci0JCS5pcGNfYmFzZSA9IDB4ZmYwMDkwMDAsCi0JCS5pMmNfYmFzZSAgPSAweGZmMDBkMDAwLAotCQkuaXBjX2xlbiAgPSAweDEwMCwKLQkJLmkyY19sZW4gPSAweDEwLAotCQkuaXJxX21vZGUgPSAwLAotCX0sCitzdGF0aWMgc3RydWN0IGludGVsX3NjdV9pcGNfcGRhdGFfdCBpbnRlbF9zY3VfaXBjX2xpbmNyb2Z0X3BkYXRhID0geworCS5pcGNfYmFzZSA9IDB4ZmYxMWMwMDAsCisJLmkyY19iYXNlID0gMHhmZjEyYjAwMCwKKwkuaXBjX2xlbiA9IDB4MTAwLAorCS5pMmNfbGVuID0gMHgxMCwKKwkuaXJxX21vZGUgPSAwLAorfTsKKworLyogUGVud2VsbCBhbmQgQ2xvdmVydmlldyAqLworc3RhdGljIHN0cnVjdCBpbnRlbF9zY3VfaXBjX3BkYXRhX3QgaW50ZWxfc2N1X2lwY19wZW53ZWxsX3BkYXRhID0geworCS5pcGNfYmFzZSA9IDB4ZmYxMWMwMDAsCisJLmkyY19iYXNlID0gMHhmZjEyYjAwMCwKKwkuaXBjX2xlbiA9IDB4MTAwLAorCS5pMmNfbGVuID0gMHgxMCwKKwkuaXJxX21vZGUgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF9zY3VfaXBjX3BkYXRhX3QgaW50ZWxfc2N1X2lwY190YW5naWVyX3BkYXRhID0geworCS5pcGNfYmFzZSA9IDB4ZmYwMDkwMDAsCisJLmkyY19iYXNlICA9IDB4ZmYwMGQwMDAsCisJLmlwY19sZW4gID0gMHgxMDAsCisJLmkyY19sZW4gPSAweDEwLAorCS5pcnFfbW9kZSA9IDAsCiB9OwogCiBzdGF0aWMgaW50IGlwY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOwpAQCAtNTgzLDE1ICs1NzUsMTQgQEAKICAqLwogc3RhdGljIGludCBpcGNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludCBlcnIsIHBpZDsKKwlpbnQgZXJyOwogCXN0cnVjdCBpbnRlbF9zY3VfaXBjX3BkYXRhX3QgKnBkYXRhOwogCXJlc291cmNlX3NpemVfdCBwY2lfcmVzb3VyY2U7CiAKIAlpZiAoaXBjZGV2LnBkZXYpCQkvKiBXZSBzdXBwb3J0IG9ubHkgb25lIFNDVSAqLwogCQlyZXR1cm4gLUVCVVNZOwogCi0JcGlkID0gaWQtPmRyaXZlcl9kYXRhOwotCXBkYXRhID0gJmludGVsX3NjdV9pcGNfcGRhdGFbcGlkXTsKKwlwZGF0YSA9IChzdHJ1Y3QgaW50ZWxfc2N1X2lwY19wZGF0YV90ICopaWQtPmRyaXZlcl9kYXRhOwogCiAJaXBjZGV2LnBkZXYgPSBwY2lfZGV2X2dldChkZXYpOwogCWlwY2Rldi5pcnFfbW9kZSA9IHBkYXRhLT5pcnFfbW9kZTsKQEAgLTY1MCwxMSArNjQxLDIxIEBACiB9CiAKIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShwY2lfaWRzKSA9IHsKLQl7UENJX1ZERVZJQ0UoSU5URUwsIDB4MDgyYSksIFNDVV9JUENfTElOQ1JPRlR9LAotCXtQQ0lfVkRFVklDRShJTlRFTCwgMHgwODBlKSwgU0NVX0lQQ19QRU5XRUxMfSwKLQl7UENJX1ZERVZJQ0UoSU5URUwsIDB4MDhlYSksIFNDVV9JUENfQ0xPVkVSVklFV30sCi0Je1BDSV9WREVWSUNFKElOVEVMLCAweDExYTApLCBTQ1VfSVBDX1RBTkdJRVJ9LAotCXsgMCx9CisJeworCQlQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9MSU5DUk9GVCksCisJCShrZXJuZWxfdWxvbmdfdCkmaW50ZWxfc2N1X2lwY19saW5jcm9mdF9wZGF0YSwKKwl9LCB7CisJCVBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX1BFTldFTEwpLAorCQkoa2VybmVsX3Vsb25nX3QpJmludGVsX3NjdV9pcGNfcGVud2VsbF9wZGF0YSwKKwl9LCB7CisJCVBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX0NMT1ZFUlZJRVcpLAorCQkoa2VybmVsX3Vsb25nX3QpJmludGVsX3NjdV9pcGNfcGVud2VsbF9wZGF0YSwKKwl9LCB7CisJCVBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX1RBTkdJRVIpLAorCQkoa2VybmVsX3Vsb25nX3QpJmludGVsX3NjdV9pcGNfdGFuZ2llcl9wZGF0YSwKKwl9LCB7CisJCTAsCisJfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXhtLXdtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXhtLXdtaS5jCmluZGV4IDNjNTljMGEuLmY0YmFkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L214bS13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9teG0td21pLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbXhtLXdtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIAogTU9EVUxFX0FVVEhPUigiRGF2ZSBBaXJsaWUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCmluZGV4IDU2M2U0ZjUuLjhmODU1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwpAQCAtNzg5LDcgKzc4OSw3IEBACiAJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzaXplX3QgbGVuID0gbGVuOworCXNpemVfdCBsZW47CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iamVjdCA9IF9fY2FsbF9zbmNfbWV0aG9kKGhhbmRsZSwgbmFtZSwgdmFsdWUpOwogCiAJaWYgKCFvYmplY3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCmluZGV4IDdhZDFlZDAuLjkwZGQ3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgdG9zaGliYV9kZXZpY2VfaWRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBrZXlfZW50cnkgdG9zaGliYV9hY3BpX2tleW1hcFtdID0geworCXsgS0VfS0VZLCAweDllLCB7IEtFWV9SRktJTEwgfSB9LAogCXsgS0VfS0VZLCAweDEwMSwgeyBLRVlfTVVURSB9IH0sCiAJeyBLRV9LRVksIDB4MTAyLCB7IEtFWV9aT09NT1VUIH0gfSwKIAl7IEtFX0tFWSwgMHgxMDMsIHsgS0VZX1pPT01JTiB9IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hYjMxMDAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FiMzEwMC5jCmluZGV4IDc3YjQ2ZDAuLmUxMGZlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FiMzEwMC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FiMzEwMC5jCkBAIC00OTgsNyArNDk4LDcgQEAKIAkJCQkgICAgIHN0cnVjdCBhYjMxMDBfcGxhdGZvcm1fZGF0YSAqcGxmZGF0YSwKIAkJCQkgICAgIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGEsCiAJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgaW50IGlkKQorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBpZCkKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGFiMzEwMF9yZWd1bGF0b3IgKnJlZzsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCQllcnIgPSBhYjMxMDBfcmVndWxhdG9yX3JlZ2lzdGVyKAogCQkJcGRldiwgTlVMTCwgYWIzMTAwX3JlZ3VsYXRvcl9tYXRjaGVzW2ldLmluaXRfZGF0YSwKIAkJCWFiMzEwMF9yZWd1bGF0b3JfbWF0Y2hlc1tpXS5vZl9ub2RlLAotCQkJKGludCkgYWIzMTAwX3JlZ3VsYXRvcl9tYXRjaGVzW2ldLmRyaXZlcl9kYXRhKTsKKwkJCSh1bnNpZ25lZCBsb25nKWFiMzEwMF9yZWd1bGF0b3JfbWF0Y2hlc1tpXS5kcml2ZXJfZGF0YSk7CiAJCWlmIChlcnIpIHsKIAkJCWFiMzEwMF9yZWd1bGF0b3JzX3JlbW92ZShwZGV2KTsKIAkJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggYjM4YTZiNi4uMTZhMzA5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtMTI3Miw2ICsxMjcyLDggQEAKIAkJCQlpZiAoci0+ZGV2LnBhcmVudCAmJgogCQkJCQlub2RlID09IHItPmRldi5vZl9ub2RlKQogCQkJCQlyZXR1cm4gcjsKKwkJCSpyZXQgPSAtRVBST0JFX0RFRkVSOworCQkJcmV0dXJuIE5VTEw7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogSWYgd2UgY291bGRuJ3QgZXZlbiBnZXQgdGhlIG5vZGUgdGhlbiBpdCdzCkBAIC0xMzEyLDcgKzEzMTQsNyBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciA9IEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7CiAJY29uc3QgY2hhciAqZGV2bmFtZSA9IE5VTEw7Ci0JaW50IHJldCA9IC1FUFJPQkVfREVGRVI7CisJaW50IHJldDsKIAogCWlmIChpZCA9PSBOVUxMKSB7CiAJCXByX2VycigiZ2V0KCkgd2l0aCBubyBpZGVudGlmaWVyXG4iKTsKQEAgLTEzMjIsNiArMTMyNCwxMSBAQAogCWlmIChkZXYpCiAJCWRldm5hbWUgPSBkZXZfbmFtZShkZXYpOwogCisJaWYgKGhhdmVfZnVsbF9jb25zdHJhaW50cygpKQorCQlyZXQgPSAtRU5PREVWOworCWVsc2UKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwogCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIAogCXJkZXYgPSByZWd1bGF0b3JfZGV2X2xvb2t1cChkZXYsIGlkLCAmcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYwppbmRleCBkOWU1NTc5Li5jZDBiOWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9zMm1wczExLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jCkBAIC00NDEsNiArNDQxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUzJNUFMxMV9SRUdVTEFUT1JfTUFYOyBpKyspIHsKIAkJaWYgKCFyZWdfbnApIHsKIAkJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKKwkJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CiAJCX0gZWxzZSB7CiAJCQljb25maWcuaW5pdF9kYXRhID0gcmRhdGFbaV0uaW5pdF9kYXRhOwogCQkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jCmluZGV4IDkyYmQyMmMuLjljYmM1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogCXN0cnVjdCBkYXNkX2RpYWdfcmVxICpkcmVxOwogCXN0cnVjdCBkYXNkX2RpYWdfYmlvICpkYmlvOwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0OwogCXVuc2lnbmVkIGludCBjb3VudCwgZGF0YXNpemU7CiAJc2VjdG9yX3QgcmVjaWQsIGZpcnN0X3JlYywgbGFzdF9yZWM7CkBAIC01MjUsMTAgKzUyNSwxMCBAQAogCS8qIENoZWNrIHN0cnVjdCBiaW8gYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgYmxvY2tzIGZvciB0aGUgcmVxdWVzdC4gKi8KIAljb3VudCA9IDA7CiAJcnFfZm9yX2VhY2hfc2VnbWVudChidiwgcmVxLCBpdGVyKSB7Ci0JCWlmIChidi0+YnZfbGVuICYgKGJsa3NpemUgLSAxKSkKKwkJaWYgKGJ2LmJ2X2xlbiAmIChibGtzaXplIC0gMSkpCiAJCQkvKiBGYmEgY2FuIG9ubHkgZG8gZnVsbCBibG9ja3MuICovCiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQkJY291bnQgKz0gYnYtPmJ2X2xlbiA+PiAoYmxvY2stPnMyYl9zaGlmdCArIDkpOworCQljb3VudCArPSBidi5idl9sZW4gPj4gKGJsb2NrLT5zMmJfc2hpZnQgKyA5KTsKIAl9CiAJLyogUGFyYW5vaWEuICovCiAJaWYgKGNvdW50ICE9IGxhc3RfcmVjIC0gZmlyc3RfcmVjICsgMSkKQEAgLTU0NSw4ICs1NDUsOCBAQAogCWRiaW8gPSBkcmVxLT5iaW87CiAJcmVjaWQgPSBmaXJzdF9yZWM7CiAJcnFfZm9yX2VhY2hfc2VnbWVudChidiwgcmVxLCBpdGVyKSB7Ci0JCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwotCQlmb3IgKG9mZiA9IDA7IG9mZiA8IGJ2LT5idl9sZW47IG9mZiArPSBibGtzaXplKSB7CisJCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKSArIGJ2LmJ2X29mZnNldDsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPCBidi5idl9sZW47IG9mZiArPSBibGtzaXplKSB7CiAJCQltZW1zZXQoZGJpbywgMCwgc2l6ZW9mIChzdHJ1Y3QgZGFzZF9kaWFnX2JpbykpOwogCQkJZGJpby0+dHlwZSA9IHJ3X2NtZDsKIAkJCWRiaW8tPmJsb2NrX251bWJlciA9IHJlY2lkICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCA5NWU0NTc4Li4yZThlMDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC0yNTUxLDcgKzI1NTEsNyBAQAogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKIAlzdHJ1Y3QgY2N3MSAqY2N3OwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0OwogCXVuc2lnbmVkIGludCBvZmY7CiAJaW50IGNvdW50LCBjaWRhdywgY3BsZW5ndGgsIGRhdGFzaXplOwpAQCAtMjU3MywxMyArMjU3MywxMyBAQAogCWNvdW50ID0gMDsKIAljaWRhdyA9IDA7CiAJcnFfZm9yX2VhY2hfc2VnbWVudChidiwgcmVxLCBpdGVyKSB7Ci0JCWlmIChidi0+YnZfbGVuICYgKGJsa3NpemUgLSAxKSkKKwkJaWYgKGJ2LmJ2X2xlbiAmIChibGtzaXplIC0gMSkpCiAJCQkvKiBFY2tkIGNhbiBvbmx5IGRvIGZ1bGwgYmxvY2tzLiAqLwogCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JCWNvdW50ICs9IGJ2LT5idl9sZW4gPj4gKGJsb2NrLT5zMmJfc2hpZnQgKyA5KTsKKwkJY291bnQgKz0gYnYuYnZfbGVuID4+IChibG9jay0+czJiX3NoaWZ0ICsgOSk7CiAjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCi0JCWlmIChpZGFsX2lzX25lZWRlZCAocGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSwgYnYtPmJ2X2xlbikpCi0JCQljaWRhdyArPSBidi0+YnZfbGVuID4+IChibG9jay0+czJiX3NoaWZ0ICsgOSk7CisJCWlmIChpZGFsX2lzX25lZWRlZCAocGFnZV9hZGRyZXNzKGJ2LmJ2X3BhZ2UpLCBidi5idl9sZW4pKQorCQkJY2lkYXcgKz0gYnYuYnZfbGVuID4+IChibG9jay0+czJiX3NoaWZ0ICsgOSk7CiAjZW5kaWYKIAl9CiAJLyogUGFyYW5vaWEuICovCkBAIC0yNjUwLDE2ICsyNjUwLDE2IEBACiAJCQkgICAgICBsYXN0X3JlYyAtIHJlY2lkICsgMSwgY21kLCBiYXNlZGV2LCBibGtzaXplKTsKIAl9CiAJcnFfZm9yX2VhY2hfc2VnbWVudChidiwgcmVxLCBpdGVyKSB7Ci0JCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OworCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CiAJCWlmIChkYXNkX3BhZ2VfY2FjaGUpIHsKIAkJCWNoYXIgKmNvcHkgPSBrbWVtX2NhY2hlX2FsbG9jKGRhc2RfcGFnZV9jYWNoZSwKIAkJCQkJCSAgICAgIEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4pOwogCQkJaWYgKGNvcHkgJiYgcnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkKLQkJCQltZW1jcHkoY29weSArIGJ2LT5idl9vZmZzZXQsIGRzdCwgYnYtPmJ2X2xlbik7CisJCQkJbWVtY3B5KGNvcHkgKyBidi5idl9vZmZzZXQsIGRzdCwgYnYuYnZfbGVuKTsKIAkJCWlmIChjb3B5KQotCQkJCWRzdCA9IGNvcHkgKyBidi0+YnZfb2Zmc2V0OworCQkJCWRzdCA9IGNvcHkgKyBidi5idl9vZmZzZXQ7CiAJCX0KLQkJZm9yIChvZmYgPSAwOyBvZmYgPCBidi0+YnZfbGVuOyBvZmYgKz0gYmxrc2l6ZSkgeworCQlmb3IgKG9mZiA9IDA7IG9mZiA8IGJ2LmJ2X2xlbjsgb2ZmICs9IGJsa3NpemUpIHsKIAkJCXNlY3Rvcl90IHRya2lkID0gcmVjaWQ7CiAJCQl1bnNpZ25lZCBpbnQgcmVjb2ZmcyA9IHNlY3Rvcl9kaXYodHJraWQsIGJsa19wZXJfdHJrKTsKIAkJCXJjbWQgPSBjbWQ7CkBAIC0yNzM1LDcgKzI3MzUsNyBAQAogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKIAlzdHJ1Y3QgY2N3MSAqY2N3OwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0LCAqaWRhd19kc3Q7CiAJdW5zaWduZWQgaW50IGNpZGF3LCBjcGxlbmd0aCwgZGF0YXNpemU7CiAJdW5zaWduZWQgaW50IHRsZjsKQEAgLTI4MTMsOCArMjgxMyw4IEBACiAJaWRhd19kc3QgPSBOVUxMOwogCWlkYXdfbGVuID0gMDsKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpIHsKLQkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7Ci0JCXNlZ19sZW4gPSBidi0+YnZfbGVuOworCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CisJCXNlZ19sZW4gPSBidi5idl9sZW47CiAJCXdoaWxlIChzZWdfbGVuKSB7CiAJCQlpZiAobmV3X3RyYWNrKSB7CiAJCQkJdHJraWQgPSByZWNpZDsKQEAgLTMwMzksNyArMzAzOSw3IEBACiB7CiAJc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyOwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0OwogCXVuc2lnbmVkIGludCB0cmtjb3VudCwgY3RpZGF3OwogCXVuc2lnbmVkIGNoYXIgY21kOwpAQCAtMzEyNSw4ICszMTI1LDggQEAKIAkJbmV3X3RyYWNrID0gMTsKIAkJcmVjaWQgPSBmaXJzdF9yZWM7CiAJCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewotCQkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7Ci0JCQlzZWdfbGVuID0gYnYtPmJ2X2xlbjsKKwkJCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKSArIGJ2LmJ2X29mZnNldDsKKwkJCXNlZ19sZW4gPSBidi5idl9sZW47CiAJCQl3aGlsZSAoc2VnX2xlbikgewogCQkJCWlmIChuZXdfdHJhY2spIHsKIAkJCQkJdHJraWQgPSByZWNpZDsKQEAgLTMxNTgsOSArMzE1OCw5IEBACiAJCX0KIAl9IGVsc2UgewogCQlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpIHsKLQkJCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OworCQkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LmJ2X3BhZ2UpICsgYnYuYnZfb2Zmc2V0OwogCQkJbGFzdF90aWRhdyA9IGl0Y3dfYWRkX3RpZGF3KGl0Y3csIDB4MDAsCi0JCQkJCQkgICAgZHN0LCBidi0+YnZfbGVuKTsKKwkJCQkJCSAgICBkc3QsIGJ2LmJ2X2xlbik7CiAJCQlpZiAoSVNfRVJSKGxhc3RfdGlkYXcpKSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dF9lcnJvcjsKQEAgLTMyNzgsNyArMzI3OCw3IEBACiAJc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyOwogCXN0cnVjdCBjY3cxICpjY3c7CiAJc3RydWN0IHJlcV9pdGVyYXRvciBpdGVyOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAljaGFyICpkc3Q7CiAJdW5zaWduZWQgY2hhciBjbWQ7CiAJdW5zaWduZWQgaW50IHRya2NvdW50OwpAQCAtMzM3OCw4ICszMzc4LDggQEAKIAkJCWlkYXdzID0gaWRhbF9jcmVhdGVfd29yZHMoaWRhd3MsIHJhd3BhZHBhZ2UsIFBBR0VfU0laRSk7CiAJfQogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewotCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKLQkJc2VnX2xlbiA9IGJ2LT5idl9sZW47CisJCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKSArIGJ2LmJ2X29mZnNldDsKKwkJc2VnX2xlbiA9IGJ2LmJ2X2xlbjsKIAkJaWYgKGNtZCA9PSBEQVNEX0VDS0RfQ0NXX1JFQURfVFJBQ0spCiAJCQltZW1zZXQoZHN0LCAwLCBzZWdfbGVuKTsKIAkJaWYgKCFsZW5fdG9fdHJhY2tfZW5kKSB7CkBAIC0zNDI0LDcgKzM0MjQsNyBAQAogCXN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqcHJpdmF0ZTsKIAlzdHJ1Y3QgY2N3MSAqY2N3OwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0LCAqY2RhOwogCXVuc2lnbmVkIGludCBibGtzaXplLCBibGtfcGVyX3Ryaywgb2ZmOwogCXNlY3Rvcl90IHJlY2lkOwpAQCAtMzQ0Miw4ICszNDQyLDggQEAKIAlpZiAocHJpdmF0ZS0+dXNlc19jZGwgPT0gMCB8fCByZWNpZCA+IDIqYmxrX3Blcl90cmspCiAJCWNjdysrOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewotCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKLQkJZm9yIChvZmYgPSAwOyBvZmYgPCBidi0+YnZfbGVuOyBvZmYgKz0gYmxrc2l6ZSkgeworCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CisJCWZvciAob2ZmID0gMDsgb2ZmIDwgYnYuYnZfbGVuOyBvZmYgKz0gYmxrc2l6ZSkgewogCQkJLyogU2tpcCBsb2NhdGUgcmVjb3JkLiAqLwogCQkJaWYgKHByaXZhdGUtPnVzZXNfY2RsICYmIHJlY2lkIDw9IDIqYmxrX3Blcl90cmspCiAJCQkJY2N3Kys7CkBAIC0zNDU0LDcgKzM0NTQsNyBAQAogCQkJCQljZGEgPSAoY2hhciAqKSgoYWRkcl90KSBjY3ctPmNkYSk7CiAJCQkJaWYgKGRzdCAhPSBjZGEpIHsKIAkJCQkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKLQkJCQkJCW1lbWNweShkc3QsIGNkYSwgYnYtPmJ2X2xlbik7CisJCQkJCQltZW1jcHkoZHN0LCBjZGEsIGJ2LmJ2X2xlbik7CiAJCQkJCWttZW1fY2FjaGVfZnJlZShkYXNkX3BhZ2VfY2FjaGUsCiAJCQkJCSAgICAodm9pZCAqKSgoYWRkcl90KWNkYSAmIFBBR0VfTUFTSykpOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKaW5kZXggOWNiYzhjMy4uMmM4ZTY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKIAlzdHJ1Y3QgY2N3MSAqY2N3OwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJY2hhciAqZHN0OwogCWludCBjb3VudCwgY2lkYXcsIGNwbGVuZ3RoLCBkYXRhc2l6ZTsKIAlzZWN0b3JfdCByZWNpZCwgZmlyc3RfcmVjLCBsYXN0X3JlYzsKQEAgLTI4MywxMyArMjgzLDEzIEBACiAJY291bnQgPSAwOwogCWNpZGF3ID0gMDsKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpIHsKLQkJaWYgKGJ2LT5idl9sZW4gJiAoYmxrc2l6ZSAtIDEpKQorCQlpZiAoYnYuYnZfbGVuICYgKGJsa3NpemUgLSAxKSkKIAkJCS8qIEZiYSBjYW4gb25seSBkbyBmdWxsIGJsb2Nrcy4gKi8KIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCQljb3VudCArPSBidi0+YnZfbGVuID4+IChibG9jay0+czJiX3NoaWZ0ICsgOSk7CisJCWNvdW50ICs9IGJ2LmJ2X2xlbiA+PiAoYmxvY2stPnMyYl9zaGlmdCArIDkpOwogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKQotCQlpZiAoaWRhbF9pc19uZWVkZWQgKHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSksIGJ2LT5idl9sZW4pKQotCQkJY2lkYXcgKz0gYnYtPmJ2X2xlbiAvIGJsa3NpemU7CisJCWlmIChpZGFsX2lzX25lZWRlZCAocGFnZV9hZGRyZXNzKGJ2LmJ2X3BhZ2UpLCBidi5idl9sZW4pKQorCQkJY2lkYXcgKz0gYnYuYnZfbGVuIC8gYmxrc2l6ZTsKICNlbmRpZgogCX0KIAkvKiBQYXJhbm9pYS4gKi8KQEAgLTMyNiwxNiArMzI2LDE2IEBACiAJfQogCXJlY2lkID0gZmlyc3RfcmVjOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewotCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKKwkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LmJ2X3BhZ2UpICsgYnYuYnZfb2Zmc2V0OwogCQlpZiAoZGFzZF9wYWdlX2NhY2hlKSB7CiAJCQljaGFyICpjb3B5ID0ga21lbV9jYWNoZV9hbGxvYyhkYXNkX3BhZ2VfY2FjaGUsCiAJCQkJCQkgICAgICBHRlBfRE1BIHwgX19HRlBfTk9XQVJOKTsKIAkJCWlmIChjb3B5ICYmIHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpCi0JCQkJbWVtY3B5KGNvcHkgKyBidi0+YnZfb2Zmc2V0LCBkc3QsIGJ2LT5idl9sZW4pOworCQkJCW1lbWNweShjb3B5ICsgYnYuYnZfb2Zmc2V0LCBkc3QsIGJ2LmJ2X2xlbik7CiAJCQlpZiAoY29weSkKLQkJCQlkc3QgPSBjb3B5ICsgYnYtPmJ2X29mZnNldDsKKwkJCQlkc3QgPSBjb3B5ICsgYnYuYnZfb2Zmc2V0OwogCQl9Ci0JCWZvciAob2ZmID0gMDsgb2ZmIDwgYnYtPmJ2X2xlbjsgb2ZmICs9IGJsa3NpemUpIHsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPCBidi5idl9sZW47IG9mZiArPSBibGtzaXplKSB7CiAJCQkvKiBMb2NhdGUgcmVjb3JkIGZvciBzdHVwaWQgZGV2aWNlcy4gKi8KIAkJCWlmIChwcml2YXRlLT5yZGNfZGF0YS5tb2RlLmJpdHMuZGF0YV9jaGFpbiA9PSAwKSB7CiAJCQkJY2N3Wy0xXS5mbGFncyB8PSBDQ1dfRkxBR19DQzsKQEAgLTM4NCw3ICszODQsNyBAQAogCXN0cnVjdCBkYXNkX2ZiYV9wcml2YXRlICpwcml2YXRlOwogCXN0cnVjdCBjY3cxICpjY3c7CiAJc3RydWN0IHJlcV9pdGVyYXRvciBpdGVyOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAljaGFyICpkc3QsICpjZGE7CiAJdW5zaWduZWQgaW50IGJsa3NpemUsIG9mZjsKIAlpbnQgc3RhdHVzOwpAQCAtMzk5LDggKzM5OSw4IEBACiAJaWYgKHByaXZhdGUtPnJkY19kYXRhLm1vZGUuYml0cy5kYXRhX2NoYWluICE9IDApCiAJCWNjdysrOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewotCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKLQkJZm9yIChvZmYgPSAwOyBvZmYgPCBidi0+YnZfbGVuOyBvZmYgKz0gYmxrc2l6ZSkgeworCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSkgKyBidi5idl9vZmZzZXQ7CisJCWZvciAob2ZmID0gMDsgb2ZmIDwgYnYuYnZfbGVuOyBvZmYgKz0gYmxrc2l6ZSkgewogCQkJLyogU2tpcCBsb2NhdGUgcmVjb3JkLiAqLwogCQkJaWYgKHByaXZhdGUtPnJkY19kYXRhLm1vZGUuYml0cy5kYXRhX2NoYWluID09IDApCiAJCQkJY2N3Kys7CkBAIC00MTEsNyArNDExLDcgQEAKIAkJCQkJY2RhID0gKGNoYXIgKikoKGFkZHJfdCkgY2N3LT5jZGEpOwogCQkJCWlmIChkc3QgIT0gY2RhKSB7CiAJCQkJCWlmIChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpCi0JCQkJCQltZW1jcHkoZHN0LCBjZGEsIGJ2LT5idl9sZW4pOworCQkJCQkJbWVtY3B5KGRzdCwgY2RhLCBidi5idl9sZW4pOwogCQkJCQlrbWVtX2NhY2hlX2ZyZWUoZGFzZF9wYWdlX2NhY2hlLAogCQkJCQkgICAgKHZvaWQgKikoKGFkZHJfdCljZGEgJiBQQUdFX01BU0spKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCA2ZWNhMDE5Li5lYmY0MWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTgwOCwxOCArODA4LDE5IEBACiBkY3NzYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwogCXVuc2lnbmVkIGxvbmcgcGFnZV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgc291cmNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBieXRlc19kb25lOwotCWludCBpOwogCiAJYnl0ZXNfZG9uZSA9IDA7CiAJZGV2X2luZm8gPSBiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlpZiAoZGV2X2luZm8gPT0gTlVMTCkKIAkJZ290byBmYWlsOwotCWlmICgoYmlvLT5iaV9zZWN0b3IgJiA3KSAhPSAwIHx8IChiaW8tPmJpX3NpemUgJiA0MDk1KSAhPSAwKQorCWlmICgoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciAmIDcpICE9IDAgfHwKKwkgICAgKGJpby0+YmlfaXRlci5iaV9zaXplICYgNDA5NSkgIT0gMCkKIAkJLyogUmVxdWVzdCBpcyBub3QgcGFnZS1hbGlnbmVkLiAqLwogCQlnb3RvIGZhaWw7CiAJaWYgKGJpb19lbmRfc2VjdG9yKGJpbykgPiBnZXRfY2FwYWNpdHkoYmlvLT5iaV9iZGV2LT5iZF9kaXNrKSkgewpAQCAtODQyLDIyICs4NDMsMjIgQEAKIAkJfQogCX0KIAotCWluZGV4ID0gKGJpby0+Ymlfc2VjdG9yID4+IDMpOwotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCWluZGV4ID0gKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPj4gMyk7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCXBhZ2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJcGFnZV9hZGRyZXNzKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OworCQkJcGFnZV9hZGRyZXNzKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldDsKIAkJc291cmNlX2FkZHIgPSBkZXZfaW5mby0+c3RhcnQgKyAoaW5kZXg8PDEyKSArIGJ5dGVzX2RvbmU7Ci0JCWlmICh1bmxpa2VseSgocGFnZV9hZGRyICYgNDA5NSkgIT0gMCkgfHwgKGJ2ZWMtPmJ2X2xlbiAmIDQwOTUpICE9IDApCisJCWlmICh1bmxpa2VseSgocGFnZV9hZGRyICYgNDA5NSkgIT0gMCkgfHwgKGJ2ZWMuYnZfbGVuICYgNDA5NSkgIT0gMCkKIAkJCS8vIE1vcmUgcGFyYW5vaWEuCiAJCQlnb3RvIGZhaWw7CiAJCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKSB7CiAJCQltZW1jcHkoKHZvaWQqKXBhZ2VfYWRkciwgKHZvaWQqKXNvdXJjZV9hZGRyLAotCQkJCWJ2ZWMtPmJ2X2xlbik7CisJCQkJYnZlYy5idl9sZW4pOwogCQl9IGVsc2UgewogCQkJbWVtY3B5KCh2b2lkKilzb3VyY2VfYWRkciwgKHZvaWQqKXBhZ2VfYWRkciwKLQkJCQlidmVjLT5idl9sZW4pOworCQkJCWJ2ZWMuYnZfbGVuKTsKIAkJfQotCQlieXRlc19kb25lICs9IGJ2ZWMtPmJ2X2xlbjsKKwkJYnl0ZXNfZG9uZSArPSBidmVjLmJ2X2xlbjsKIAl9CiAJYmlvX2VuZGlvKGJpbywgMCk7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL3NjbV9ibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9zY21fYmxrLmMKaW5kZXggZDBhYjUwMS4uNzZiZWQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL3NjbV9ibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svc2NtX2Jsay5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAlzdHJ1Y3QgYWlkYXcgKmFpZGF3ID0gc2NtcnEtPmFpZGF3OwogCXN0cnVjdCBtc2IgKm1zYiA9ICZzY21ycS0+YW9iLT5tc2JbMF07CiAJc3RydWN0IHJlcV9pdGVyYXRvciBpdGVyOwotCXN0cnVjdCBiaW9fdmVjICpidjsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKIAogCW1zYi0+YnMgPSBNU0JfQlNfNEs7CiAJc2NtcnEtPmFvYi0+cmVxdWVzdC5tc2JfY291bnQgPSAxOwpAQCAtMTQyLDkgKzE0Miw5IEBACiAJbXNiLT5kYXRhX2FkZHIgPSAodTY0KSBhaWRhdzsKIAogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHNjbXJxLT5yZXF1ZXN0LCBpdGVyKSB7Ci0JCVdBUk5fT04oYnYtPmJ2X29mZnNldCk7Ci0JCW1zYi0+YmxrX2NvdW50ICs9IGJ2LT5idl9sZW4gPj4gMTI7Ci0JCWFpZGF3LT5kYXRhX2FkZHIgPSAodTY0KSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpOworCQlXQVJOX09OKGJ2LmJ2X29mZnNldCk7CisJCW1zYi0+YmxrX2NvdW50ICs9IGJ2LmJ2X2xlbiA+PiAxMjsKKwkJYWlkYXctPmRhdGFfYWRkciA9ICh1NjQpIHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKTsKIAkJYWlkYXcrKzsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svc2NtX2Jsa19jbHVzdGVyLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svc2NtX2Jsa19jbHVzdGVyLmMKaW5kZXggMjdmOTMwYy4uOWFhZTkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL3NjbV9ibGtfY2x1c3Rlci5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9zY21fYmxrX2NsdXN0ZXIuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJc3RydWN0IGFpZGF3ICphaWRhdyA9IHNjbXJxLT5haWRhdzsKIAlzdHJ1Y3QgbXNiICptc2IgPSAmc2NtcnEtPmFvYi0+bXNiWzBdOwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CisJc3RydWN0IGJpb192ZWMgYnY7CiAJaW50IGkgPSAwOwogCXU2NCBhZGRyOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJCWkrKzsKIAkJfQogCQlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpIHsKLQkJCWFpZGF3LT5kYXRhX2FkZHIgPSAodTY0KSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpOworCQkJYWlkYXctPmRhdGFfYWRkciA9ICh1NjQpIHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKTsKIAkJCWFpZGF3Kys7CiAJCQlpKys7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKaW5kZXggNTgxNDFmMC4uNjk2OWQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKQEAgLTE4NCwyNSArMTg0LDI2IEBACiBzdGF0aWMgdm9pZCB4cHJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAl4cHJhbV9kZXZpY2VfdCAqeGRldiA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXVuc2lnbmVkIGludCBpbmRleDsKIAl1bnNpZ25lZCBsb25nIHBhZ2VfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzOwotCWludCBpOwogCi0JaWYgKChiaW8tPmJpX3NlY3RvciAmIDcpICE9IDAgfHwgKGJpby0+Ymlfc2l6ZSAmIDQwOTUpICE9IDApCisJaWYgKChiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yICYgNykgIT0gMCB8fAorCSAgICAoYmlvLT5iaV9pdGVyLmJpX3NpemUgJiA0MDk1KSAhPSAwKQogCQkvKiBSZXF1ZXN0IGlzIG5vdCBwYWdlLWFsaWduZWQuICovCiAJCWdvdG8gZmFpbDsKLQlpZiAoKGJpby0+Ymlfc2l6ZSA+PiAxMikgPiB4ZGV2LT5zaXplKQorCWlmICgoYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gMTIpID4geGRldi0+c2l6ZSkKIAkJLyogUmVxdWVzdCBzaXplIGlzIG5vIHBhZ2UtYWxpZ25lZC4gKi8KIAkJZ290byBmYWlsOwotCWlmICgoYmlvLT5iaV9zZWN0b3IgPj4gMykgPiAweGZmZmZmZmZmVSAtIHhkZXYtPm9mZnNldCkKKwlpZiAoKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPj4gMykgPiAweGZmZmZmZmZmVSAtIHhkZXYtPm9mZnNldCkKIAkJZ290byBmYWlsOwotCWluZGV4ID0gKGJpby0+Ymlfc2VjdG9yID4+IDMpICsgeGRldi0+b2Zmc2V0OwotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCWluZGV4ID0gKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPj4gMykgKyB4ZGV2LT5vZmZzZXQ7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCXBhZ2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJa21hcChidmVjLT5idl9wYWdlKSArIGJ2ZWMtPmJ2X29mZnNldDsKLQkJYnl0ZXMgPSBidmVjLT5idl9sZW47CisJCQlrbWFwKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldDsKKwkJYnl0ZXMgPSBidmVjLmJ2X2xlbjsKIAkJaWYgKChwYWdlX2FkZHIgJiA0MDk1KSAhPSAwIHx8IChieXRlcyAmIDQwOTUpICE9IDApCiAJCQkvKiBNb3JlIHBhcmFub2lhLiAqLwogCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2t2bS92aXJ0aW9fY2N3LmMgYi9kcml2ZXJzL3MzOTAva3ZtL3ZpcnRpb19jY3cuYwppbmRleCBkNjI5NzE3Li4wZmM1ODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAva3ZtL3ZpcnRpb19jY3cuYworKysgYi9kcml2ZXJzL3MzOTAva3ZtL3ZpcnRpb19jY3cuYwpAQCAtNjQyLDggKzY0MiwxNSBAQAogCSAgICAgKFNDU1dfU1RDVExfQUxFUlRfU1RBVFVTIHwgU0NTV19TVENUTF9TVEFUVVNfUEVORCkpKSB7CiAJCS8qIE9LICovCiAJfQotCWlmIChpcmJfaXNfZXJyb3IoaXJiKSkKLQkJdmNkZXYtPmVyciA9IC1FSU87IC8qIFhYWCAtIHVzZSByZWFsIGVycm9yICovCisJaWYgKGlyYl9pc19lcnJvcihpcmIpKSB7CisJCS8qIENvbW1hbmQgcmVqZWN0PyAqLworCQlpZiAoKHNjc3dfZHN0YXQoJmlyYi0+c2NzdykgJiBERVZfU1RBVF9VTklUX0NIRUNLKSAmJgorCQkgICAgKGlyYi0+ZWN3WzBdICYgU05TMF9DTURfUkVKRUNUKSkKKwkJCXZjZGV2LT5lcnIgPSAtRU9QTk9UU1VQUDsKKwkJZWxzZQorCQkJLyogTWFwIGV2ZXJ5dGhpbmcgZWxzZSB0byAtRUlPLiAqLworCQkJdmNkZXYtPmVyciA9IC1FSU87CisJfQogCWlmICh2Y2Rldi0+Y3Vycl9pbyAmIGFjdGl2aXR5KSB7CiAJCXN3aXRjaCAoYWN0aXZpdHkpIHsKIAkJY2FzZSBWSVJUSU9fQ0NXX0RPSU5HX1JFQURfRkVBVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCmluZGV4IGFjMGJkZGUuLmEwZGUwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtNzM4LDYgKzczOCw4IEBACiAJaW50ICgqZnJlZXplKShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICopOwogCWludCAoKnRoYXcpIChzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICopOwogCWludCAoKnJlc3RvcmUpKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKik7CisJaW50ICgqY29udHJvbF9ldmVudF9oYW5kbGVyKShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpOwogfTsKIAogc3RydWN0IHFldGhfdmxhbl92aWQgewpAQCAtOTQ4LDEzICs5NTAsMTAgQEAKIGludCBxZXRoX3NlbmRfY29udHJvbF9kYXRhKHN0cnVjdCBxZXRoX2NhcmQgKiwgaW50LCBzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICosCiAJaW50ICgqcmVwbHlfY2IpKHN0cnVjdCBxZXRoX2NhcmQgKiwgc3RydWN0IHFldGhfcmVwbHkqLCB1bnNpZ25lZCBsb25nKSwKIAl2b2lkICpyZXBseV9wYXJhbSk7Ci12b2lkIHFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpOwotdm9pZCBxZXRoX2JyaWRnZXBvcnRfcXVlcnlfc3VwcG9ydChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKTsKIGludCBxZXRoX2JyaWRnZXBvcnRfcXVlcnlfcG9ydHMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKIAllbnVtIHFldGhfc2JwX3JvbGVzICpyb2xlLCBlbnVtIHFldGhfc2JwX3N0YXRlcyAqc3RhdGUpOwogaW50IHFldGhfYnJpZGdlcG9ydF9zZXRyb2xlKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIGVudW0gcWV0aF9zYnBfcm9sZXMgcm9sZSk7CiBpbnQgcWV0aF9icmlkZ2Vwb3J0X2FuX3NldChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBpbnQgZW5hYmxlKTsKLXZvaWQgcWV0aF9icmlkZ2VfaG9zdF9ldmVudChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpOwogaW50IHFldGhfZ2V0X3ByaW9yaXR5X3F1ZXVlKHN0cnVjdCBxZXRoX2NhcmQgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50LCBpbnQpOwogaW50IHFldGhfZ2V0X2VsZW1lbnRzX25vKHN0cnVjdCBxZXRoX2NhcmQgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50KTsKIGludCBxZXRoX2dldF9lbGVtZW50c19mb3JfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKaW5kZXggYzA1ZGFjYi4uYzNhODNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwpAQCAtNjksNiArNjksNyBAQAogc3RhdGljIGludCBxZXRoX2luaXRfcWRpb19vdXRfYnVmKHN0cnVjdCBxZXRoX3FkaW9fb3V0X3EgKiwgaW50KTsKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnFldGhfd3E7CitFWFBPUlRfU1lNQk9MX0dQTChxZXRoX3dxKTsKIAogc3RhdGljIHZvaWQgcWV0aF9jbG9zZV9kZXZfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC02MTYsMTUgKzYxNywxMiBAQAogCQkJCXFldGhfc2NoZWR1bGVfcmVjb3ZlcnkoY2FyZCk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQljYXNlIElQQV9DTURfU0VUQlJJREdFUE9SVDoKLQkJCQlpZiAoY21kLT5kYXRhLnNicC5oZHIuY29tbWFuZF9jb2RlID09Ci0JCQkJCUlQQV9TQlBfQlJJREdFX1BPUlRfU1RBVEVfQ0hBTkdFKSB7Ci0JCQkJCXFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZShjYXJkLCBjbWQpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIGNtZDsKIAkJCWNhc2UgSVBBX0NNRF9BRERSRVNTX0NIQU5HRV9OT1RJRjoKLQkJCQlxZXRoX2JyaWRnZV9ob3N0X2V2ZW50KGNhcmQsIGNtZCk7Ci0JCQkJcmV0dXJuIE5VTEw7CisJCQkJaWYgKGNhcmQtPmRpc2NpcGxpbmUtPmNvbnRyb2xfZXZlbnRfaGFuZGxlcgorCQkJCQkJCQkoY2FyZCwgY21kKSkKKwkJCQkJcmV0dXJuIGNtZDsKKwkJCQllbHNlCisJCQkJCXJldHVybiBOVUxMOwogCQkJY2FzZSBJUEFfQ01EX01PRENDSUQ6CiAJCQkJcmV0dXJuIGNtZDsKIAkJCWNhc2UgSVBBX0NNRF9SRUdJU1RFUl9MT0NBTF9BRERSOgpAQCAtNDk3MywxMCArNDk3MSw2IEBACiAJCXFldGhfcXVlcnlfc2V0YWRhcHRlcnBhcm1zKGNhcmQpOwogCWlmIChxZXRoX2FkcF9zdXBwb3J0ZWQoY2FyZCwgSVBBX1NFVEFEUF9TRVRfRElBR19BU1NJU1QpKQogCQlxZXRoX3F1ZXJ5X3NldGRpYWdhc3MoY2FyZCk7Ci0JcWV0aF9icmlkZ2Vwb3J0X3F1ZXJ5X3N1cHBvcnQoY2FyZCk7Ci0JaWYgKGNhcmQtPm9wdGlvbnMuc2JwLnN1cHBvcnRlZF9mdW5jcykKLQkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKLQkJIlRoZSBkZXZpY2UgcmVwcmVzZW50cyBhIEhpcGVyU29ja2V0cyBCcmlkZ2UgQ2FwYWJsZSBQb3J0XG4iKTsKIAlyZXR1cm4gMDsKIG91dDoKIAlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LCAiVGhlIHFldGggZGV2aWNlIGRyaXZlciBmYWlsZWQgdG8gcmVjb3ZlciAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwppbmRleCA5MTRkMmMxLi4wNzEwNTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKQEAgLTMzLDYgKzMzLDExIEBACiAJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7CiBzdGF0aWMgdm9pZCBxZXRoX2wyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgcWV0aF9sMl9yZWNvdmVyKHZvaWQgKik7CitzdGF0aWMgdm9pZCBxZXRoX2JyaWRnZXBvcnRfcXVlcnlfc3VwcG9ydChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKTsKK3N0YXRpYyB2b2lkIHFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpOworc3RhdGljIHZvaWQgcWV0aF9icmlkZ2VfaG9zdF9ldmVudChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpOwogCiBzdGF0aWMgaW50IHFldGhfbDJfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKQEAgLTk4OSw2ICs5OTQsMTAgQEAKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9yZW1vdmU7CiAJfQorCXFldGhfYnJpZGdlcG9ydF9xdWVyeV9zdXBwb3J0KGNhcmQpOworCWlmIChjYXJkLT5vcHRpb25zLnNicC5zdXBwb3J0ZWRfZnVuY3MpCisJCWRldl9pbmZvKCZjYXJkLT5nZGV2LT5kZXYsCisJCSJUaGUgZGV2aWNlIHJlcHJlc2VudHMgYSBIaXBlclNvY2tldHMgQnJpZGdlIENhcGFibGUgUG9ydFxuIik7CiAJcWV0aF90cmFjZV9mZWF0dXJlcyhjYXJkKTsKIAogCWlmICghY2FyZC0+ZGV2ICYmIHFldGhfbDJfc2V0dXBfbmV0ZGV2KGNhcmQpKSB7CkBAIC0xMjMzLDYgKzEyNDIsMjYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIFJldHVybnMgemVybyBpZiB0aGUgY29tbWFuZCBpcyBzdWNjZXNzZnVsbHkgImNvbnN1bWVkIiAqLworc3RhdGljIGludCBxZXRoX2wyX2NvbnRyb2xfZXZlbnQoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKKwkJCQkJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kKQoreworCXN3aXRjaCAoY21kLT5oZHIuY29tbWFuZCkgeworCWNhc2UgSVBBX0NNRF9TRVRCUklER0VQT1JUOgorCQlpZiAoY21kLT5kYXRhLnNicC5oZHIuY29tbWFuZF9jb2RlID09CisJCQkJSVBBX1NCUF9CUklER0VfUE9SVF9TVEFURV9DSEFOR0UpIHsKKwkJCXFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZShjYXJkLCBjbWQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIDE7CisJY2FzZSBJUEFfQ01EX0FERFJFU1NfQ0hBTkdFX05PVElGOgorCQlxZXRoX2JyaWRnZV9ob3N0X2V2ZW50KGNhcmQsIGNtZCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKwogc3RydWN0IHFldGhfZGlzY2lwbGluZSBxZXRoX2wyX2Rpc2NpcGxpbmUgPSB7CiAJLnN0YXJ0X3BvbGwgPSBxZXRoX3FkaW9fc3RhcnRfcG9sbCwKIAkuaW5wdXRfaGFuZGxlciA9IChxZGlvX2hhbmRsZXJfdCAqKSBxZXRoX3FkaW9faW5wdXRfaGFuZGxlciwKQEAgLTEyNDYsNiArMTI3NSw3IEBACiAJLmZyZWV6ZSA9IHFldGhfbDJfcG1fc3VzcGVuZCwKIAkudGhhdyA9IHFldGhfbDJfcG1fcmVzdW1lLAogCS5yZXN0b3JlID0gcWV0aF9sMl9wbV9yZXN1bWUsCisJLmNvbnRyb2xfZXZlbnRfaGFuZGxlciA9IHFldGhfbDJfY29udHJvbF9ldmVudCwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChxZXRoX2wyX2Rpc2NpcGxpbmUpOwogCkBAIC0xNDYzLDcgKzE0OTMsOCBAQAogCWtmcmVlKGRhdGEpOwogfQogCi12b2lkIHFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpCitzdGF0aWMgdm9pZCBxZXRoX2JyaWRnZV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKKwkJCQkJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kKQogewogCXN0cnVjdCBxZXRoX3NicF9zdGF0ZV9jaGFuZ2UgKnFwb3J0cyA9CiAJCSAmY21kLT5kYXRhLnNicC5kYXRhLnN0YXRlX2NoYW5nZTsKQEAgLTE0ODgsNyArMTUxOSw2IEBACiAJCQlzaXplb2Yoc3RydWN0IHFldGhfc2JwX3N0YXRlX2NoYW5nZSkgKyBleHRyYXNpemUpOwogCXF1ZXVlX3dvcmsocWV0aF93cSwgJmRhdGEtPndvcmtlcik7CiB9Ci1FWFBPUlRfU1lNQk9MKHFldGhfYnJpZGdlX3N0YXRlX2NoYW5nZSk7CiAKIHN0cnVjdCBxZXRoX2JyaWRnZV9ob3N0X2RhdGEgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrZXI7CkBAIC0xNTI4LDcgKzE1NTgsOCBAQAogCWtmcmVlKGRhdGEpOwogfQogCi12b2lkIHFldGhfYnJpZGdlX2hvc3RfZXZlbnQoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgc3RydWN0IHFldGhfaXBhX2NtZCAqY21kKQorc3RhdGljIHZvaWQgcWV0aF9icmlkZ2VfaG9zdF9ldmVudChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpCiB7CiAJc3RydWN0IHFldGhfaXBhY21kX2FkZHJfY2hhbmdlICpob3N0ZXZzID0KIAkJICZjbWQtPmRhdGEuYWRkcmNoYW5nZTsKQEAgLTE1NjAsNyArMTU5MSw2IEBACiAJCQlzaXplb2Yoc3RydWN0IHFldGhfaXBhY21kX2FkZHJfY2hhbmdlKSArIGV4dHJhc2l6ZSk7CiAJcXVldWVfd29yayhxZXRoX3dxLCAmZGF0YS0+d29ya2VyKTsKIH0KLUVYUE9SVF9TWU1CT0wocWV0aF9icmlkZ2VfaG9zdF9ldmVudCk7CiAKIC8qIFNFVEJSSURHRVBPUlQgc3VwcG9ydDsgc2VuZGluZyBjb21tYW5kcyAqLwogCkBAIC0xNjgzLDcgKzE3MTMsNyBAQAogICogU2V0cyBiaXRtYXNrIG9mIHN1cHBvcnRlZCBzZXRicmlkZ2Vwb3J0IHN1YmZ1bmN0aW9ucyBpbiB0aGUgcWV0aF9jYXJkCiAgKiBzdHJ1Y3V0cmU6IGNhcmQtPm9wdGlvbnMuc2JwLnN1cHBvcnRlZF9mdW5jcy4KICAqLwotdm9pZCBxZXRoX2JyaWRnZXBvcnRfcXVlcnlfc3VwcG9ydChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQorc3RhdGljIHZvaWQgcWV0aF9icmlkZ2Vwb3J0X3F1ZXJ5X3N1cHBvcnQoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICppb2I7CiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwpAQCAtMTcwOSw3ICsxNzM5LDYgQEAKIAl9CiAJY2FyZC0+b3B0aW9ucy5zYnAuc3VwcG9ydGVkX2Z1bmNzID0gY2JjdGwuZGF0YS5zdXBwb3J0ZWQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChxZXRoX2JyaWRnZXBvcnRfcXVlcnlfc3VwcG9ydCk7CiAKIHN0YXRpYyBpbnQgcWV0aF9icmlkZ2Vwb3J0X3F1ZXJ5X3BvcnRzX2NiKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsCiAJc3RydWN0IHFldGhfcmVwbHkgKnJlcGx5LCB1bnNpZ25lZCBsb25nIGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwppbmRleCBjMWIwYjI3Li4wZjQzMDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTM1OTMsNiArMzU5MywxMyBAQAogCXJldHVybiByYzsKIH0KIAorLyogUmV0dXJucyB6ZXJvIGlmIHRoZSBjb21tYW5kIGlzIHN1Y2Nlc3NmdWxseSAiY29uc3VtZWQiICovCitzdGF0aWMgaW50IHFldGhfbDNfY29udHJvbF9ldmVudChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQpCit7CisJcmV0dXJuIDE7Cit9CisKIHN0cnVjdCBxZXRoX2Rpc2NpcGxpbmUgcWV0aF9sM19kaXNjaXBsaW5lID0gewogCS5zdGFydF9wb2xsID0gcWV0aF9xZGlvX3N0YXJ0X3BvbGwsCiAJLmlucHV0X2hhbmRsZXIgPSAocWRpb19oYW5kbGVyX3QgKikgcWV0aF9xZGlvX2lucHV0X2hhbmRsZXIsCkBAIC0zNjA2LDYgKzM2MTMsNyBAQAogCS5mcmVlemUgPSBxZXRoX2wzX3BtX3N1c3BlbmQsCiAJLnRoYXcgPSBxZXRoX2wzX3BtX3Jlc3VtZSwKIAkucmVzdG9yZSA9IHFldGhfbDNfcG1fcmVzdW1lLAorCS5jb250cm9sX2V2ZW50X2hhbmRsZXIgPSBxZXRoX2wzX2NvbnRyb2xfZXZlbnQsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwocWV0aF9sM19kaXNjaXBsaW5lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jCmluZGV4IGMxNDQxZWQuLmM3NzYzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKaW5kZXggZmMxMzM5Yy4uN2M3MWU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CQkvKiByZXF1ZXN0X3JlZ2lvbiAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwppbmRleCBkZGJlNWE5Li5hZjE1YTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCkBAIC0xOSw3ICsxOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMgYi9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCmluZGV4IGQ5ZjI2OGYuLjI1YzczOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdWN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL3VjdHJsLmMKaW5kZXggYjBhYWUwNS4uYjdhY2FmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvdWN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwppbmRleCA0NDZiODUxLi4wY2FjN2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKQEAgLTIxNjMsMTAgKzIxNjMsMTAgQEAKIAl9CiAKIAkvKiBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgc2VnbWVudHM/ICovCi0JaWYgKGJpb19zZWdtZW50cyhyZXEtPmJpbykgPiAxIHx8IGJpb19zZWdtZW50cyhyc3AtPmJpbykgPiAxKSB7Ci0JCXByaW50aygiJXM6IG11bHRpcGxlIHNlZ21lbnRzIHJlcSAldSAldSwgcnNwICV1ICV1XG4iLAotCQkgICAgICAgX19mdW5jX18sIGJpb19zZWdtZW50cyhyZXEtPmJpbyksIGJsa19ycV9ieXRlcyhyZXEpLAotCQkgICAgICAgYmlvX3NlZ21lbnRzKHJzcC0+YmlvKSwgYmxrX3JxX2J5dGVzKHJzcCkpOworCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocmVxLT5iaW8pIHx8CisJICAgIGJpb19tdWx0aXBsZV9zZWdtZW50cyhyc3AtPmJpbykpIHsKKwkJcHJpbnRrKCIlczogbXVsdGlwbGUgc2VnbWVudHMgcmVxICV1LCByc3AgJXVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYmxrX3JxX2J5dGVzKHJlcSksIGJsa19ycV9ieXRlcyhyc3ApKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwppbmRleCA5ZDI2NjM3Li40MTBmNGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKQEAgLTE5MDEsNyArMTkwMSw3IEBACiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJTXBpMlNtcFBhc3N0aHJvdWdoUmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAlNcGkyU21wUGFzc3Rocm91Z2hSZXBseV90ICptcGlfcmVwbHk7Ci0JaW50IHJjLCBpOworCWludCByYzsKIAl1MTYgc21pZDsKIAl1MzIgaW9jX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CkBAIC0xOTE2LDcgKzE5MTYsOCBAQAogCXZvaWQgKnBjaV9hZGRyX291dCA9IE5VTEw7CiAJdTE2IHdhaXRfc3RhdGVfY291bnQ7CiAJc3RydWN0IHJlcXVlc3QgKnJzcCA9IHJlcS0+bmV4dF9ycTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IE5VTEw7CisJc3RydWN0IGJpb192ZWMgYnZlYzsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKIAlpZiAoIXJzcCkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogdGhlIHNtcCByZXNwb25zZSBzcGFjZSBpcyAiCkBAIC0xOTQyLDcgKzE5NDMsNyBAQAogCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKIAogCS8qIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSBzZWdtZW50cyAqLwotCWlmIChiaW9fc2VnbWVudHMocmVxLT5iaW8pID4gMSkgeworCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocmVxLT5iaW8pKSB7CiAJCXUzMiBvZmZzZXQgPSAwOwogCiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgcmVxdWVzdCAqLwpAQCAtMTk1NSwxMSArMTk1NiwxMSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEtPmJpbywgaSkgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEtPmJpbywgaXRlcikgewogCQkJbWVtY3B5KHBjaV9hZGRyX291dCArIG9mZnNldCwKLQkJCSAgICBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSkgKyBidmVjLT5idl9vZmZzZXQsCi0JCQkgICAgYnZlYy0+YnZfbGVuKTsKLQkJCW9mZnNldCArPSBidmVjLT5idl9sZW47CisJCQkgICAgcGFnZV9hZGRyZXNzKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldCwKKwkJCSAgICBidmVjLmJ2X2xlbik7CisJCQlvZmZzZXQgKz0gYnZlYy5idl9sZW47CiAJCX0KIAl9IGVsc2UgewogCQlkbWFfYWRkcl9vdXQgPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBkZXYsIGJpb19kYXRhKHJlcS0+YmlvKSwKQEAgLTE5NzQsNyArMTk3NSw3IEBACiAKIAkvKiBDaGVjayBpZiB0aGUgcmVzcG9uc2UgbmVlZHMgdG8gYmUgcG9wdWxhdGVkIGFjcm9zcwogCSAqIG11bHRpcGxlIHNlZ21lbnRzICovCi0JaWYgKGJpb19zZWdtZW50cyhyc3AtPmJpbykgPiAxKSB7CisJaWYgKGJpb19tdWx0aXBsZV9zZWdtZW50cyhyc3AtPmJpbykpIHsKIAkJcGNpX2FkZHJfaW4gPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBkZXYsIGJsa19ycV9ieXRlcyhyc3ApLAogCQkgICAgJnBjaV9kbWFfaW4pOwogCQlpZiAoIXBjaV9hZGRyX2luKSB7CkBAIC0yMDQxLDcgKzIwNDIsNyBAQAogCXNnbF9mbGFncyA9IChNUEkyX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CiAJICAgIE1QSTJfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfCBNUEkyX1NHRV9GTEFHU19IT1NUX1RPX0lPQyk7CiAJc2dsX2ZsYWdzID0gc2dsX2ZsYWdzIDw8IE1QSTJfU0dFX0ZMQUdTX1NISUZUOwotCWlmIChiaW9fc2VnbWVudHMocmVxLT5iaW8pID4gMSkgeworCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocmVxLT5iaW8pKSB7CiAJCWlvYy0+YmFzZV9hZGRfc2dfc2luZ2xlKHBzZ2UsIHNnbF9mbGFncyB8CiAJCSAgICAoYmxrX3JxX2J5dGVzKHJlcSkgLSA0KSwgcGNpX2RtYV9vdXQpOwogCX0gZWxzZSB7CkBAIC0yMDU3LDcgKzIwNTgsNyBAQAogCSAgICBNUEkyX1NHRV9GTEFHU19MQVNUX0VMRU1FTlQgfCBNUEkyX1NHRV9GTEFHU19FTkRfT0ZfQlVGRkVSIHwKIAkgICAgTVBJMl9TR0VfRkxBR1NfRU5EX09GX0xJU1QpOwogCXNnbF9mbGFncyA9IHNnbF9mbGFncyA8PCBNUEkyX1NHRV9GTEFHU19TSElGVDsKLQlpZiAoYmlvX3NlZ21lbnRzKHJzcC0+YmlvKSA+IDEpIHsKKwlpZiAoYmlvX211bHRpcGxlX3NlZ21lbnRzKHJzcC0+YmlvKSkgewogCQlpb2MtPmJhc2VfYWRkX3NnX3NpbmdsZShwc2dlLCBzZ2xfZmxhZ3MgfAogCQkgICAgKGJsa19ycV9ieXRlcyhyc3ApICsgNCksIHBjaV9kbWFfaW4pOwogCX0gZWxzZSB7CkBAIC0yMTAyLDIzICsyMTAzLDIzIEBACiAJCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHktPlJlc3BvbnNlRGF0YUxlbmd0aCk7CiAJCS8qIGNoZWNrIGlmIHRoZSByZXNwIG5lZWRzIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBhbGxvY2F0ZWQKIAkJICogcGNpIG1lbSAqLwotCQlpZiAoYmlvX3NlZ21lbnRzKHJzcC0+YmlvKSA+IDEpIHsKKwkJaWYgKGJpb19tdWx0aXBsZV9zZWdtZW50cyhyc3AtPmJpbykpIHsKIAkJCXUzMiBvZmZzZXQgPSAwOwogCQkJdTMyIGJ5dGVzX3RvX2NvcHkgPQogCQkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoKTsKLQkJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIHJzcC0+YmlvLCBpKSB7Ci0JCQkJaWYgKGJ5dGVzX3RvX2NvcHkgPD0gYnZlYy0+YnZfbGVuKSB7Ci0JCQkJCW1lbWNweShwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSkgKwotCQkJCQkgICAgYnZlYy0+YnZfb2Zmc2V0LCBwY2lfYWRkcl9pbiArCisJCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByc3AtPmJpbywgaXRlcikgeworCQkJCWlmIChieXRlc190b19jb3B5IDw9IGJ2ZWMuYnZfbGVuKSB7CisJCQkJCW1lbWNweShwYWdlX2FkZHJlc3MoYnZlYy5idl9wYWdlKSArCisJCQkJCSAgICBidmVjLmJ2X29mZnNldCwgcGNpX2FkZHJfaW4gKwogCQkJCQkgICAgb2Zmc2V0LCBieXRlc190b19jb3B5KTsKIAkJCQkJYnJlYWs7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhidmVjLT5idl9wYWdlKSArCi0JCQkJCSAgICBidmVjLT5idl9vZmZzZXQsIHBjaV9hZGRyX2luICsKLQkJCQkJICAgIG9mZnNldCwgYnZlYy0+YnZfbGVuKTsKLQkJCQkJYnl0ZXNfdG9fY29weSAtPSBidmVjLT5idl9sZW47CisJCQkJCW1lbWNweShwYWdlX2FkZHJlc3MoYnZlYy5idl9wYWdlKSArCisJCQkJCSAgICBidmVjLmJ2X29mZnNldCwgcGNpX2FkZHJfaW4gKworCQkJCQkgICAgb2Zmc2V0LCBidmVjLmJ2X2xlbik7CisJCQkJCWJ5dGVzX3RvX2NvcHkgLT0gYnZlYy5idl9sZW47CiAJCQkJfQotCQkJCW9mZnNldCArPSBidmVjLT5idl9sZW47CisJCQkJb2Zmc2V0ICs9IGJ2ZWMuYnZfbGVuOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX3RyYW5zcG9ydC5jCmluZGV4IGU3NzFhODguLjY1MTcwY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc190cmFuc3BvcnQuYwpAQCAtMTg4NCw3ICsxODg0LDcgQEAKIAlzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKIAlNcGkyU21wUGFzc3Rocm91Z2hSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwogCU1waTJTbXBQYXNzdGhyb3VnaFJlcGx5X3QgKm1waV9yZXBseTsKLQlpbnQgcmMsIGk7CisJaW50IHJjOwogCXUxNiBzbWlkOwogCXUzMiBpb2Nfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKQEAgLTE4OTgsNyArMTg5OCw4IEBACiAJdm9pZCAqcGNpX2FkZHJfb3V0ID0gTlVMTDsKIAl1MTYgd2FpdF9zdGF0ZV9jb3VudDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnNwID0gcmVxLT5uZXh0X3JxOwotCXN0cnVjdCBiaW9fdmVjICpidmVjID0gTlVMTDsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAogCWlmICghcnNwKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVCAiJXM6IHRoZSBzbXAgcmVzcG9uc2Ugc3BhY2UgaXMgbWlzc2luZ1xuIiwKQEAgLTE5MjUsNyArMTkyNiw3IEBACiAJaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgPSBNUFQzX0NNRF9QRU5ESU5HOwogCiAJLyogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgc3BsaXQgYWNyb3NzIG11bHRpcGxlIHNlZ21lbnRzICovCi0JaWYgKHJlcS0+YmlvLT5iaV92Y250ID4gMSkgeworCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocmVxLT5iaW8pKSB7CiAJCXUzMiBvZmZzZXQgPSAwOwogCiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgcmVxdWVzdCAqLwpAQCAtMTkzOCwxMSArMTkzOSwxMSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEtPmJpbywgaSkgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByZXEtPmJpbywgaXRlcikgewogCQkJbWVtY3B5KHBjaV9hZGRyX291dCArIG9mZnNldCwKLQkJCSAgICBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSkgKyBidmVjLT5idl9vZmZzZXQsCi0JCQkgICAgYnZlYy0+YnZfbGVuKTsKLQkJCW9mZnNldCArPSBidmVjLT5idl9sZW47CisJCQkgICAgcGFnZV9hZGRyZXNzKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldCwKKwkJCSAgICBidmVjLmJ2X2xlbik7CisJCQlvZmZzZXQgKz0gYnZlYy5idl9sZW47CiAJCX0KIAl9IGVsc2UgewogCQlkbWFfYWRkcl9vdXQgPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBkZXYsIGJpb19kYXRhKHJlcS0+YmlvKSwKQEAgLTE5NTcsNyArMTk1OCw3IEBACiAKIAkvKiBDaGVjayBpZiB0aGUgcmVzcG9uc2UgbmVlZHMgdG8gYmUgcG9wdWxhdGVkIGFjcm9zcwogCSAqIG11bHRpcGxlIHNlZ21lbnRzICovCi0JaWYgKHJzcC0+YmlvLT5iaV92Y250ID4gMSkgeworCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocnNwLT5iaW8pKSB7CiAJCXBjaV9hZGRyX2luID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wZGV2LCBibGtfcnFfYnl0ZXMocnNwKSwKIAkJICAgICZwY2lfZG1hX2luKTsKIAkJaWYgKCFwY2lfYWRkcl9pbikgewpAQCAtMjAxOCw3ICsyMDE5LDcgQEAKIAltcGlfcmVxdWVzdC0+UmVxdWVzdERhdGFMZW5ndGggPSBjcHVfdG9fbGUxNihibGtfcnFfYnl0ZXMocmVxKSAtIDQpOwogCXBzZ2UgPSAmbXBpX3JlcXVlc3QtPlNHTDsKIAotCWlmIChyZXEtPmJpby0+YmlfdmNudCA+IDEpCisJaWYgKGJpb19tdWx0aXBsZV9zZWdtZW50cyhyZXEtPmJpbykpCiAJCWlvYy0+YnVpbGRfc2coaW9jLCBwc2dlLCBwY2lfZG1hX291dCwgKGJsa19ycV9ieXRlcyhyZXEpIC0gNCksCiAJCSAgICBwY2lfZG1hX2luLCAoYmxrX3JxX2J5dGVzKHJzcCkgKyA0KSk7CiAJZWxzZQpAQCAtMjA2MywyMyArMjA2NCwyMyBAQAogCiAJCS8qIGNoZWNrIGlmIHRoZSByZXNwIG5lZWRzIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBhbGxvY2F0ZWQKIAkJICogcGNpIG1lbSAqLwotCQlpZiAocnNwLT5iaW8tPmJpX3ZjbnQgPiAxKSB7CisJCWlmIChiaW9fbXVsdGlwbGVfc2VnbWVudHMocnNwLT5iaW8pKSB7CiAJCQl1MzIgb2Zmc2V0ID0gMDsKIAkJCXUzMiBieXRlc190b19jb3B5ID0KIAkJCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHktPlJlc3BvbnNlRGF0YUxlbmd0aCk7Ci0JCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCByc3AtPmJpbywgaSkgewotCQkJCWlmIChieXRlc190b19jb3B5IDw9IGJ2ZWMtPmJ2X2xlbikgewotCQkJCQltZW1jcHkocGFnZV9hZGRyZXNzKGJ2ZWMtPmJ2X3BhZ2UpICsKLQkJCQkJICAgIGJ2ZWMtPmJ2X29mZnNldCwgcGNpX2FkZHJfaW4gKworCQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgcnNwLT5iaW8sIGl0ZXIpIHsKKwkJCQlpZiAoYnl0ZXNfdG9fY29weSA8PSBidmVjLmJ2X2xlbikgeworCQkJCQltZW1jcHkocGFnZV9hZGRyZXNzKGJ2ZWMuYnZfcGFnZSkgKworCQkJCQkgICAgYnZlYy5idl9vZmZzZXQsIHBjaV9hZGRyX2luICsKIAkJCQkJICAgIG9mZnNldCwgYnl0ZXNfdG9fY29weSk7CiAJCQkJCWJyZWFrOwogCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbWNweShwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSkgKwotCQkJCQkgICAgYnZlYy0+YnZfb2Zmc2V0LCBwY2lfYWRkcl9pbiArCi0JCQkJCSAgICBvZmZzZXQsIGJ2ZWMtPmJ2X2xlbik7Ci0JCQkJCWJ5dGVzX3RvX2NvcHkgLT0gYnZlYy0+YnZfbGVuOworCQkJCQltZW1jcHkocGFnZV9hZGRyZXNzKGJ2ZWMuYnZfcGFnZSkgKworCQkJCQkgICAgYnZlYy5idl9vZmZzZXQsIHBjaV9hZGRyX2luICsKKwkJCQkJICAgIG9mZnNldCwgYnZlYy5idl9sZW4pOworCQkJCQlieXRlc190b19jb3B5IC09IGJ2ZWMuYnZfbGVuOwogCQkJCX0KLQkJCQlvZmZzZXQgKz0gYnZlYy0+YnZfbGVuOworCQkJCW9mZnNldCArPSBidmVjLmJ2X2xlbjsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCmluZGV4IGFhNjYzNjEuLmJhYzA0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCkBAIC03MzEsNyArNzMxLDcgQEAKIAogCWJpby0+YmlfcncgJj0gflJFUV9XUklURTsKIAlvci0+aW4uYmlvID0gYmlvOwotCW9yLT5pbi50b3RhbF9ieXRlcyA9IGJpby0+Ymlfc2l6ZTsKKwlvci0+aW4udG90YWxfYnl0ZXMgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggNTcwYzdmYy4uNGEwZDdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC0xOTkwLDYgKzE5OTAsOCBAQAogCiAJdmhhLT5mbGFncy5kZWxldGVfcHJvZ3Jlc3MgPSAxOwogCisJcWx0X3JlbW92ZV90YXJnZXQoaGEsIHZoYSk7CisKIAlmY19yZW1vdmVfaG9zdCh2aGEtPmhvc3QpOwogCiAJc2NzaV9yZW1vdmVfaG9zdCh2aGEtPmhvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IDQxZDY0OTEuLmUxZmU5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTI3NTAsNiArMjc1MCwxMyBAQAogCXVpbnQzMl90IGxlbjsKIH07CiAKK3N0cnVjdCBzY3NpX3FsdF9ob3N0IHsKKwl2b2lkICp0YXJnZXRfbHBvcnRfcHRyOworCXN0cnVjdCBtdXRleCB0Z3RfbXV0ZXg7CisJc3RydWN0IG11dGV4IHRndF9ob3N0X2FjdGlvbl9tdXRleDsKKwlzdHJ1Y3QgcWxhX3RndCAqcWxhX3RndDsKK307CisKIHN0cnVjdCBxbHRfaHdfZGF0YSB7CiAJLyogUHJvdGVjdGVkIGJ5IGh3IGxvY2sgKi8KIAl1aW50MzJfdCBlbmFibGVfY2xhc3NfMjoxOwpAQCAtMjc2NSwxNSArMjc3MiwxMSBAQAogCXVpbnQzMl90IF9faW9tZW0gKmF0aW9fcV9pbjsKIAl1aW50MzJfdCBfX2lvbWVtICphdGlvX3Ffb3V0OwogCi0Jdm9pZCAqdGFyZ2V0X2xwb3J0X3B0cjsKIAlzdHJ1Y3QgcWxhX3RndF9mdW5jX3RtcGwgKnRndF9vcHM7Ci0Jc3RydWN0IHFsYV90Z3QgKnFsYV90Z3Q7CiAJc3RydWN0IHFsYV90Z3RfY21kICpjbWRzW0RFRkFVTFRfT1VUU1RBTkRJTkdfQ09NTUFORFNdOwogCXVpbnQxNl90IGN1cnJlbnRfaGFuZGxlOwogCiAJc3RydWN0IHFsYV90Z3RfdnBfbWFwICp0Z3RfdnBfbWFwOwotCXN0cnVjdCBtdXRleCB0Z3RfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IHRndF9ob3N0X2FjdGlvbl9tdXRleDsKIAogCWludCBzYXZlZF9zZXQ7CiAJdWludDE2X3Qgc2F2ZWRfZXhjaGFuZ2VfY291bnQ7CkBAIC0zNDM1LDYgKzM0MzgsNyBAQAogI2RlZmluZSBWUF9FUlJfRkFCX0xPR09VVAk0CiAjZGVmaW5lIFZQX0VSUl9BREFQX05PUkVTT1VSQ0VTCTUKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmh3OworCXN0cnVjdCBzY3NpX3FsdF9ob3N0IHZoYV90Z3Q7CiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAlpbnQJCWZ3X2hlYXJ0YmVhdF9jb3VudGVyOwogCWludAkJc2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYwppbmRleCAzOGExMjU3Li45ZTgwZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdGFyZ2V0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5jCkBAIC01OTAsNyArNTkwLDcgQEAKIAogCS8qIENoZWNrIHRvIGF2b2lkIGRvdWJsZSBzZXNzaW9ucyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VzcywgJmhhLT50Z3QucWxhX3RndC0+c2Vzc19saXN0LAorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VzcywgJnZoYS0+dmhhX3RndC5xbGFfdGd0LT5zZXNzX2xpc3QsCiAJCQkJc2Vzc19saXN0X2VudHJ5KSB7CiAJCWlmICghbWVtY21wKHNlc3MtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsIFdXTl9TSVpFKSkgewogCQkJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAwNSwKQEAgLTYyNyw3ICs2MjcsNyBAQAogCiAJCXJldHVybiBOVUxMOwogCX0KLQlzZXNzLT50Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc2Vzcy0+dGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJc2Vzcy0+dmhhID0gdmhhOwogCXNlc3MtPnNfaWQgPSBmY3BvcnQtPmRfaWQ7CiAJc2Vzcy0+bG9vcF9pZCA9IGZjcG9ydC0+bG9vcF9pZDsKQEAgLTYzNSw3ICs2MzUsNyBAQAogCiAJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAwNiwKIAkgICAgIkFkZGluZyBzZXNzICVwIHRvIHRndCAlcCB2aWEgLT5jaGVja19pbml0aWF0b3Jfbm9kZV9hY2woKVxuIiwKLQkgICAgc2VzcywgaGEtPnRndC5xbGFfdGd0KTsKKwkgICAgc2VzcywgdmhhLT52aGFfdGd0LnFsYV90Z3QpOwogCiAJYmVfc2lkWzBdID0gc2Vzcy0+c19pZC5iLmRvbWFpbjsKIAliZV9zaWRbMV0gPSBzZXNzLT5zX2lkLmIuYXJlYTsKQEAgLTY2Miw4ICs2NjIsOCBAQAogCW1lbWNweShzZXNzLT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLCBzaXplb2Yoc2Vzcy0+cG9ydF9uYW1lKSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZzZXNzLT5zZXNzX2xpc3RfZW50cnksICZoYS0+dGd0LnFsYV90Z3QtPnNlc3NfbGlzdCk7Ci0JaGEtPnRndC5xbGFfdGd0LT5zZXNzX2NvdW50Kys7CisJbGlzdF9hZGRfdGFpbCgmc2Vzcy0+c2Vzc19saXN0X2VudHJ5LCAmdmhhLT52aGFfdGd0LnFsYV90Z3QtPnNlc3NfbGlzdCk7CisJdmhhLT52aGFfdGd0LnFsYV90Z3QtPnNlc3NfY291bnQrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjA0YiwKQEAgLTY4Miw3ICs2ODIsNyBAQAogdm9pZCBxbHRfZmNfcG9ydF9hZGRlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gaGEtPnRndC5xbGFfdGd0OworCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSB2aGEtPnZoYV90Z3QucWxhX3RndDsKIAlzdHJ1Y3QgcWxhX3RndF9zZXNzICpzZXNzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTY5Miw2ICs2OTIsOSBAQAogCWlmICghdGd0IHx8IChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfSU5JVElBVE9SKSkKIAkJcmV0dXJuOwogCisJaWYgKHFsYV9pbmlfbW9kZV9lbmFibGVkKHZoYSkpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWlmICh0Z3QtPnRndF9zdG9wKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC03MDEsOSArNzA0LDkgQEAKIAlpZiAoIXNlc3MpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAotCQltdXRleF9sb2NrKCZoYS0+dGd0LnRndF9tdXRleCk7CisJCW11dGV4X2xvY2soJnZoYS0+dmhhX3RndC50Z3RfbXV0ZXgpOwogCQlzZXNzID0gcWx0X2NyZWF0ZV9zZXNzKHZoYSwgZmNwb3J0LCBmYWxzZSk7Ci0JCW11dGV4X3VubG9jaygmaGEtPnRndC50Z3RfbXV0ZXgpOworCQltdXRleF91bmxvY2soJnZoYS0+dmhhX3RndC50Z3RfbXV0ZXgpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7CkBAIC03MzksNyArNzQyLDcgQEAKIHZvaWQgcWx0X2ZjX3BvcnRfZGVsZXRlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gaGEtPnRndC5xbGFfdGd0OworCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSB2aGEtPnZoYV90Z3QucWxhX3RndDsKIAlzdHJ1Y3QgcWxhX3RndF9zZXNzICpzZXNzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTgwNiwxMiArODA5LDEyIEBACiAJICogTXV0ZXggbmVlZGVkIHRvIHN5bmMgd2l0aCBxbGFfdGd0X2ZjX3BvcnRfW2FkZGVkLGRlbGV0ZWRdLgogCSAqIExvY2sgaXMgbmVlZGVkLCBiZWNhdXNlIHdlIHN0aWxsIGNhbiBnZXQgYW4gaW5jb21pbmcgcGFja2V0LgogCSAqLwotCW11dGV4X2xvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwltdXRleF9sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAl0Z3QtPnRndF9zdG9wID0gMTsKIAlxbHRfY2xlYXJfdGd0X2RiKHRndCwgdHJ1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQltdXRleF91bmxvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwltdXRleF91bmxvY2soJnZoYS0+dmhhX3RndC50Z3RfbXV0ZXgpOwogCiAJZmx1c2hfZGVsYXllZF93b3JrKCZ0Z3QtPnNlc3NfZGVsX3dvcmspOwogCkBAIC04NDUsMjAgKzg0OCwyMSBAQAogdm9pZCBxbHRfc3RvcF9waGFzZTIoc3RydWN0IHFsYV90Z3QgKnRndCkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdGd0LT5oYTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICh0Z3QtPnRndF9zdG9wcGVkKSB7Ci0JCXFsX2RiZyhxbF9kYmdfdGd0X21ndCwgdGd0LT52aGEsIDB4ZjA0ZiwKKwkJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjA0ZiwKIAkJICAgICJBbHJlYWR5IGluIHRndC0+dGd0X3N0b3BwZWQgc3RhdGVcbiIpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybjsKIAl9CiAKLQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHRndC0+dmhhLCAweGYwMGIsCisJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAwYiwKIAkgICAgIldhaXRpbmcgZm9yICVkIElSUSBjb21tYW5kcyB0byBjb21wbGV0ZSAodGd0ICVwKSIsCiAJICAgIHRndC0+aXJxX2NtZF9jb3VudCwgdGd0KTsKIAotCW11dGV4X2xvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwltdXRleF9sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAodGd0LT5pcnFfY21kX2NvdW50ICE9IDApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTg2OCw5ICs4NzIsOSBAQAogCXRndC0+dGd0X3N0b3AgPSAwOwogCXRndC0+dGd0X3N0b3BwZWQgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfdW5sb2NrKCZoYS0+dGd0LnRndF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAotCXFsX2RiZyhxbF9kYmdfdGd0X21ndCwgdGd0LT52aGEsIDB4ZjAwYywgIlN0b3Agb2YgdGd0ICVwIGZpbmlzaGVkIiwKKwlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDBjLCAiU3RvcCBvZiB0Z3QgJXAgZmluaXNoZWQiLAogCSAgICB0Z3QpOwogfQogRVhQT1JUX1NZTUJPTChxbHRfc3RvcF9waGFzZTIpOwpAQCAtODc4LDE0ICs4ODIsMTQgQEAKIC8qIENhbGxlZCBmcm9tIHFsdF9yZW1vdmVfdGFyZ2V0KCkgLT4gcWxhMngwMF9yZW1vdmVfb25lKCkgKi8KIHN0YXRpYyB2b2lkIHFsdF9yZWxlYXNlKHN0cnVjdCBxbGFfdGd0ICp0Z3QpCiB7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHRndC0+aGE7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSB0Z3QtPnZoYTsKIAotCWlmICgoaGEtPnRndC5xbGFfdGd0ICE9IE5VTEwpICYmICF0Z3QtPnRndF9zdG9wcGVkKQorCWlmICgodmhhLT52aGFfdGd0LnFsYV90Z3QgIT0gTlVMTCkgJiYgIXRndC0+dGd0X3N0b3BwZWQpCiAJCXFsdF9zdG9wX3BoYXNlMih0Z3QpOwogCi0JaGEtPnRndC5xbGFfdGd0ID0gTlVMTDsKKwl2aGEtPnZoYV90Z3QucWxhX3RndCA9IE5VTEw7CiAKLQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHRndC0+dmhhLCAweGYwMGQsCisJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAwZCwKIAkgICAgIlJlbGVhc2Ugb2YgdGd0ICVwIGZpbmlzaGVkXG4iLCB0Z3QpOwogCiAJa2ZyZWUodGd0KTsKQEAgLTk0OSw4ICs5NTMsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGhhLT50Z3QucWxhX3RndCAhPSBOVUxMKQotCQloYS0+dGd0LnFsYV90Z3QtPm5vdGlmeV9hY2tfZXhwZWN0ZWQrKzsKKwlpZiAodmhhLT52aGFfdGd0LnFsYV90Z3QgIT0gTlVMTCkKKwkJdmhhLT52aGFfdGd0LnFsYV90Z3QtPm5vdGlmeV9hY2tfZXhwZWN0ZWQrKzsKIAogCXBrdC0+ZW50cnlfdHlwZSA9IE5PVElGWV9BQ0tfVFlQRTsKIAlwa3QtPmVudHJ5X2NvdW50ID0gMTsKQEAgLTEwNTQsNyArMTA1OCw3IEBACiAJCS8qIE90aGVyIGJ5dGVzIGFyZSB6ZXJvICovCiAJfQogCi0JaGEtPnRndC5xbGFfdGd0LT5hYnRzX3Jlc3BfZXhwZWN0ZWQrKzsKKwl2aGEtPnZoYV90Z3QucWxhX3RndC0+YWJ0c19yZXNwX2V4cGVjdGVkKys7CiAKIAlxbGEyeDAwX3N0YXJ0X2lvY2JzKHZoYSwgdmhhLT5yZXEpOwogfQpAQCAtMTIwNiw3ICsxMjEwLDcgQEAKIAkJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAxMiwKIAkJICAgICJxbGFfdGFyZ2V0KCVkKTogdGFzayBhYm9ydCBmb3Igbm9uLWV4aXN0YW50IHNlc3Npb25cbiIsCiAJCSAgICB2aGEtPnZwX2lkeCk7Ci0JCXJjID0gcWx0X3NjaGVkX3Nlc3Nfd29yayhoYS0+dGd0LnFsYV90Z3QsCisJCXJjID0gcWx0X3NjaGVkX3Nlc3Nfd29yayh2aGEtPnZoYV90Z3QucWxhX3RndCwKIAkJICAgIFFMQV9UR1RfU0VTU19XT1JLX0FCT1JULCBhYnRzLCBzaXplb2YoKmFidHMpKTsKIAkJaWYgKHJjICE9IDApIHsKIAkJCXFsdF8yNHh4X3NlbmRfYWJ0c19yZXNwKHZoYSwgYWJ0cywgRkNQX1RNRl9SRUpFQ1RFRCwKQEAgLTIxNTcsOCArMjE2MSw3IEBACiAJc3RydWN0IHFsYV90Z3RfY21kICpjbWQsIHZvaWQgKmN0aW8pCiB7CiAJc3RydWN0IHFsYV90Z3Rfc3JyX2N0aW8gKnNjOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwogCXN0cnVjdCBxbGFfdGd0X3Nycl9pbW0gKmltbTsKIAogCXRndC0+Y3Rpb19zcnJfaWQrKzsKQEAgLTI0NzQsNyArMjQ3Nyw3IEBACiAJc3RydWN0IHFsYV90Z3RfY21kICpjbWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsYV90Z3RfY21kLCB3b3JrKTsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGNtZC0+dmhhOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwogCXN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3MgPSBOVUxMOwogCXN0cnVjdCBhdGlvX2Zyb21faXNwICphdGlvID0gJmNtZC0+YXRpbzsKIAl1bnNpZ25lZCBjaGFyICpjZGI7CkBAIC0yNTA3LDEwICsyNTEwLDEwIEBACiAJCQlnb3RvIG91dF90ZXJtOwogCQl9CiAKLQkJbXV0ZXhfbG9jaygmaGEtPnRndC50Z3RfbXV0ZXgpOworCQltdXRleF9sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAkJc2VzcyA9IHFsdF9tYWtlX2xvY2FsX3Nlc3ModmhhLCBzX2lkKTsKIAkJLyogc2VzcyBoYXMgYW4gZXh0cmEgY3JlYXRpb24gcmVmLiAqLwotCQltdXRleF91bmxvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAogCQlpZiAoIXNlc3MpCiAJCQlnb3RvIG91dF90ZXJtOwpAQCAtMjU3Niw4ICsyNTc5LDcgQEAKIHN0YXRpYyBpbnQgcWx0X2hhbmRsZV9jbWRfZm9yX2F0aW8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKIAlzdHJ1Y3QgYXRpb19mcm9tX2lzcCAqYXRpbykKIHsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gaGEtPnRndC5xbGFfdGd0OworCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSB2aGEtPnZoYV90Z3QucWxhX3RndDsKIAlzdHJ1Y3QgcWxhX3RndF9jbWQgKmNtZDsKIAogCWlmICh1bmxpa2VseSh0Z3QtPnRndF9zdG9wKSkgewpAQCAtMjU5Nyw3ICsyNTk5LDcgQEAKIAogCW1lbWNweSgmY21kLT5hdGlvLCBhdGlvLCBzaXplb2YoKmF0aW8pKTsKIAljbWQtPnN0YXRlID0gUUxBX1RHVF9TVEFURV9ORVc7Ci0JY21kLT50Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJY21kLT50Z3QgPSB2aGEtPnZoYV90Z3QucWxhX3RndDsKIAljbWQtPnZoYSA9IHZoYTsKIAogCUlOSVRfV09SSygmY21kLT53b3JrLCBxbHRfZG9fd29yayk7CkBAIC0yNzIzLDcgKzI3MjUsNyBAQAogCXVpbnQzMl90IGx1biwgdW5wYWNrZWRfbHVuOwogCWludCBsdW5fc2l6ZSwgZm47CiAKLQl0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAKIAlsdW4gPSBhLT51LmlzcDI0LmZjcF9jbW5kLmx1bjsKIAlsdW5fc2l6ZSA9IHNpemVvZihhLT51LmlzcDI0LmZjcF9jbW5kLmx1bik7CkBAIC0yNzk3LDcgKzI3OTksNyBAQAogCQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDI1LAogCQkgICAgInFsYV90YXJnZXQoJWQpOiB0YXNrIGFib3J0IGZvciB1bmV4aXN0aW5nICIKIAkJICAgICJzZXNzaW9uXG4iLCB2aGEtPnZwX2lkeCk7Ci0JCXJldHVybiBxbHRfc2NoZWRfc2Vzc193b3JrKGhhLT50Z3QucWxhX3RndCwKKwkJcmV0dXJuIHFsdF9zY2hlZF9zZXNzX3dvcmsodmhhLT52aGFfdGd0LnFsYV90Z3QsCiAJCSAgICBRTEFfVEdUX1NFU1NfV09SS19BQk9SVCwgaW9jYiwgc2l6ZW9mKCppb2NiKSk7CiAJfQogCkBAIC0yODEwLDcgKzI4MTIsNiBAQAogc3RhdGljIGludCBxbHRfMjR4eF9oYW5kbGVfZWxzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCiAJc3RydWN0IGltbV9udGZ5X2Zyb21faXNwICppb2NiKQogewotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCByZXMgPSAwOwogCiAJcWxfZGJnKHFsX2RiZ190Z3RfbWd0LCB2aGEsIDB4ZjAyNiwKQEAgLTI4MjgsNyArMjgyOSw3IEBACiAJY2FzZSBFTFNfUERJU0M6CiAJY2FzZSBFTFNfQURJU0M6CiAJewotCQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gaGEtPnRndC5xbGFfdGd0OworCQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJCWlmICh0Z3QtPmxpbmtfcmVpbml0X2lvY2JfcGVuZGluZykgewogCQkJcWx0X3NlbmRfbm90aWZ5X2Fjayh2aGEsICZ0Z3QtPmxpbmtfcmVpbml0X2lvY2IsCiAJCQkgICAgMCwgMCwgMCwgMCwgMCwgMCk7CkBAIC0zMjAyLDggKzMyMDMsNyBAQAogCXN0cnVjdCBpbW1fbnRmeV9mcm9tX2lzcCAqaW9jYikKIHsKIAlzdHJ1Y3QgcWxhX3RndF9zcnJfaW1tICppbW07Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHFsYV90Z3QgKnRndCA9IGhhLT50Z3QucWxhX3RndDsKKwlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJc3RydWN0IHFsYV90Z3Rfc3JyX2N0aW8gKnNjdGlvOwogCiAJdGd0LT5pbW1fc3JyX2lkKys7CkBAIC0zMzEzLDcgKzMzMTMsNyBAQAogCiAJY2FzZSBJTU1fTlRGWV9MSVBfTElOS19SRUlOSVQ6CiAJewotCQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gaGEtPnRndC5xbGFfdGd0OworCQlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJCXFsX2RiZyhxbF9kYmdfdGd0X21ndCwgdmhhLCAweGYwMzMsCiAJCSAgICAicWxhX3RhcmdldCglZCk6IExJTksgUkVJTklUIChsb29wICUjeCwgIgogCQkgICAgInN1YmNvZGUgJXgpXG4iLCB2aGEtPnZwX2lkeCwKQEAgLTM0ODksNyArMzQ4OSw3IEBACiAJc3RydWN0IGF0aW9fZnJvbV9pc3AgKmF0aW8pCiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHFsYV90Z3QgKnRndCA9IGhhLT50Z3QucWxhX3RndDsKKwlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJaW50IHJjOwogCiAJaWYgKHVubGlrZWx5KHRndCA9PSBOVUxMKSkgewpAQCAtMzU5MSw3ICszNTkxLDcgQEAKIHN0YXRpYyB2b2lkIHFsdF9yZXNwb25zZV9wa3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgcmVzcG9uc2VfdCAqcGt0KQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwogCiAJaWYgKHVubGlrZWx5KHRndCA9PSBOVUxMKSkgewogCQlxbF9kYmcocWxfZGJnX3RndCwgdmhhLCAweGUwNWQsCkBAIC0zNzk0LDcgKzM3OTQsNyBAQAogCXVpbnQxNl90ICptYWlsYm94KQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwogCWludCBsb2dpbl9jb2RlOwogCiAJcWxfZGJnKHFsX2RiZ190Z3QsIHZoYSwgMHhlMDM5LApAQCAtMzkyNCwxNCArMzkyNCwxNCBAQAogc3RhdGljIHN0cnVjdCBxbGFfdGd0X3Nlc3MgKnFsdF9tYWtlX2xvY2FsX3Nlc3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKIAl1aW50OF90ICpzX2lkKQogewotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3MgPSBOVUxMOwogCWZjX3BvcnRfdCAqZmNwb3J0ID0gTlVMTDsKIAlpbnQgcmMsIGdsb2JhbF9yZXNldHM7CiAJdWludDE2X3QgbG9vcF9pZCA9IDA7CiAKIHJldHJ5OgotCWdsb2JhbF9yZXNldHMgPSBhdG9taWNfcmVhZCgmaGEtPnRndC5xbGFfdGd0LT50Z3RfZ2xvYmFsX3Jlc2V0c19jb3VudCk7CisJZ2xvYmFsX3Jlc2V0cyA9CisJICAgIGF0b21pY19yZWFkKCZ2aGEtPnZoYV90Z3QucWxhX3RndC0+dGd0X2dsb2JhbF9yZXNldHNfY291bnQpOwogCiAJcmMgPSBxbGEyNHh4X2dldF9sb29wX2lkKHZoYSwgc19pZCwgJmxvb3BfaWQpOwogCWlmIChyYyAhPSAwKSB7CkBAIC0zOTU4LDEyICszOTU4LDEzIEBACiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGdsb2JhbF9yZXNldHMgIT0KLQkgICAgYXRvbWljX3JlYWQoJmhhLT50Z3QucWxhX3RndC0+dGd0X2dsb2JhbF9yZXNldHNfY291bnQpKSB7CisJICAgIGF0b21pY19yZWFkKCZ2aGEtPnZoYV90Z3QucWxhX3RndC0+dGd0X2dsb2JhbF9yZXNldHNfY291bnQpKSB7CiAJCXFsX2RiZyhxbF9kYmdfdGd0X21ndCwgdmhhLCAweGYwNDMsCiAJCSAgICAicWxhX3RhcmdldCglZCk6IGdsb2JhbCByZXNldCBkdXJpbmcgc2Vzc2lvbiBkaXNjb3ZlcnkgIgogCQkgICAgIihjb3VudGVyIHdhcyAlZCwgbmV3ICVkKSwgcmV0cnlpbmciLCB2aGEtPnZwX2lkeCwKIAkJICAgIGdsb2JhbF9yZXNldHMsCi0JCSAgICBhdG9taWNfcmVhZCgmaGEtPnRndC5xbGFfdGd0LT50Z3RfZ2xvYmFsX3Jlc2V0c19jb3VudCkpOworCQkgICAgYXRvbWljX3JlYWQoJnZoYS0+dmhhX3RndC4KKwkJCXFsYV90Z3QtPnRndF9nbG9iYWxfcmVzZXRzX2NvdW50KSk7CiAJCWdvdG8gcmV0cnk7CiAJfQogCkBAIC0zOTk4LDEwICszOTk5LDEwIEBACiAJaWYgKCFzZXNzKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKLQkJbXV0ZXhfbG9jaygmaGEtPnRndC50Z3RfbXV0ZXgpOworCQltdXRleF9sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAkJc2VzcyA9IHFsdF9tYWtlX2xvY2FsX3Nlc3ModmhhLCBzX2lkKTsKIAkJLyogc2VzcyBoYXMgZ290IGFuIGV4dHJhIGNyZWF0aW9uIHJlZiAqLwotCQltdXRleF91bmxvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAkJaWYgKCFzZXNzKQpAQCAtNDA1MiwxMCArNDA1MywxMCBAQAogCWlmICghc2VzcykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCi0JCW11dGV4X2xvY2soJmhhLT50Z3QudGd0X211dGV4KTsKKwkJbXV0ZXhfbG9jaygmdmhhLT52aGFfdGd0LnRndF9tdXRleCk7CiAJCXNlc3MgPSBxbHRfbWFrZV9sb2NhbF9zZXNzKHZoYSwgc19pZCk7CiAJCS8qIHNlc3MgaGFzIGdvdCBhbiBleHRyYSBjcmVhdGlvbiByZWYgKi8KLQkJbXV0ZXhfdW5sb2NrKCZoYS0+dGd0LnRndF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmdmhhLT52aGFfdGd0LnRndF9tdXRleCk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCWlmICghc2VzcykKQEAgLTQxNDEsOSArNDE0Miw5IEBACiAJfQogCiAJcWxfZGJnKHFsX2RiZ190Z3QsIGJhc2VfdmhhLCAweGUwM2IsCi0JICAgICJSZWdpc3RlcmluZyB0YXJnZXQgZm9yIGhvc3QgJWxkKCVwKSIsIGJhc2VfdmhhLT5ob3N0X25vLCBoYSk7CisJICAgICJSZWdpc3RlcmluZyB0YXJnZXQgZm9yIGhvc3QgJWxkKCVwKS5cbiIsIGJhc2VfdmhhLT5ob3N0X25vLCBoYSk7CiAKLQlCVUdfT04oKGhhLT50Z3QucWxhX3RndCAhPSBOVUxMKSB8fCAoaGEtPnRndC50Z3Rfb3BzICE9IE5VTEwpKTsKKwlCVUdfT04oYmFzZV92aGEtPnZoYV90Z3QucWxhX3RndCAhPSBOVUxMKTsKIAogCXRndCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGFfdGd0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QpIHsKQEAgLTQxNzEsNyArNDE3Miw3IEBACiAJSU5JVF9XT1JLKCZ0Z3QtPnNycl93b3JrLCBxbHRfaGFuZGxlX3Nycl93b3JrKTsKIAlhdG9taWNfc2V0KCZ0Z3QtPnRndF9nbG9iYWxfcmVzZXRzX2NvdW50LCAwKTsKIAotCWhhLT50Z3QucWxhX3RndCA9IHRndDsKKwliYXNlX3ZoYS0+dmhhX3RndC5xbGFfdGd0ID0gdGd0OwogCiAJcWxfZGJnKHFsX2RiZ190Z3QsIGJhc2VfdmhhLCAweGUwNjcsCiAJCSJxbGFfdGFyZ2V0KCVkKTogdXNpbmcgNjQgQml0IFBDSSBhZGRyZXNzaW5nIiwKQEAgLTQxOTIsMTYgKzQxOTMsMTYgQEAKIC8qIE11c3QgYmUgY2FsbGVkIHVuZGVyIHRndF9ob3N0X2FjdGlvbl9tdXRleCAqLwogaW50IHFsdF9yZW1vdmVfdGFyZ2V0KHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7Ci0JaWYgKCFoYS0+dGd0LnFsYV90Z3QpCisJaWYgKCF2aGEtPnZoYV90Z3QucWxhX3RndCkKIAkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZxbGFfdGd0X211dGV4KTsKLQlsaXN0X2RlbCgmaGEtPnRndC5xbGFfdGd0LT50Z3RfbGlzdF9lbnRyeSk7CisJbGlzdF9kZWwoJnZoYS0+dmhhX3RndC5xbGFfdGd0LT50Z3RfbGlzdF9lbnRyeSk7CiAJbXV0ZXhfdW5sb2NrKCZxbGFfdGd0X211dGV4KTsKIAogCXFsX2RiZyhxbF9kYmdfdGd0LCB2aGEsIDB4ZTAzYywgIlVucmVnaXN0ZXJpbmcgdGFyZ2V0IGZvciBob3N0ICVsZCglcCkiLAogCSAgICB2aGEtPmhvc3Rfbm8sIGhhKTsKLQlxbHRfcmVsZWFzZShoYS0+dGd0LnFsYV90Z3QpOworCXFsdF9yZWxlYXNlKHZoYS0+dmhhX3RndC5xbGFfdGd0KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDIzNSw4ICs0MjM2LDkgQEAKICAqIEBjYWxsYmFjazogIGxwb3J0IGluaXRpYWxpemF0aW9uIGNhbGxiYWNrIGZvciB0Y21fcWxhMnh4eCBjb2RlCiAgKiBAdGFyZ2V0X2xwb3J0X3B0cjogcG9pbnRlciBmb3IgdGNtX3FsYTJ4eHggc3BlY2lmaWMgbHBvcnQgZGF0YQogICovCi1pbnQgcWx0X2xwb3J0X3JlZ2lzdGVyKHN0cnVjdCBxbGFfdGd0X2Z1bmNfdG1wbCAqcWxhX3RndF9vcHMsIHU2NCB3d3BuLAotCWludCAoKmNhbGxiYWNrKShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSwgdm9pZCAqdGFyZ2V0X2xwb3J0X3B0cikKK2ludCBxbHRfbHBvcnRfcmVnaXN0ZXIodm9pZCAqdGFyZ2V0X2xwb3J0X3B0ciwgdTY0IHBoeXNfd3dwbiwKKwkJICAgICAgIHU2NCBucGl2X3d3cG4sIHU2NCBucGl2X3d3bm4sCisJCSAgICAgICBpbnQgKCpjYWxsYmFjaykoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdm9pZCAqLCB1NjQsIHU2NCkpCiB7CiAJc3RydWN0IHFsYV90Z3QgKnRndDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhOwpAQCAtNDI1NSwxNCArNDI1NywxMSBAQAogCQlpZiAoIWhvc3QpCiAJCQljb250aW51ZTsKIAotCQlpZiAoaGEtPnRndC50Z3Rfb3BzICE9IE5VTEwpCi0JCQljb250aW51ZTsKLQogCQlpZiAoIShob3N0LT5ob3N0dC0+c3VwcG9ydGVkX21vZGUgJiBNT0RFX1RBUkdFVCkpCiAJCQljb250aW51ZTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGhvc3QtPmFjdGl2ZV9tb2RlICYgTU9ERV9UQVJHRVQpIHsKKwkJaWYgKCghbnBpdl93d3BuIHx8ICFucGl2X3d3bm4pICYmIGhvc3QtPmFjdGl2ZV9tb2RlICYgTU9ERV9UQVJHRVQpIHsKIAkJCXByX2RlYnVnKCJNT0RFX1RBUkdFVCBhbHJlYWR5IGFjdGl2ZSBvbiBxbGEyeHh4KCVkKVxuIiwKIAkJCSAgICBob3N0LT5ob3N0X25vKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC00Mjc2LDI0ICs0Mjc1LDE4IEBACiAJCQkgICAgIiBxbGEyeHh4IHNjc2lfaG9zdFxuIik7CiAJCQljb250aW51ZTsKIAkJfQotCQlxbHRfbHBvcnRfZHVtcCh2aGEsIHd3cG4sIGIpOworCQlxbHRfbHBvcnRfZHVtcCh2aGEsIHBoeXNfd3dwbiwgYik7CiAKIAkJaWYgKG1lbWNtcCh2aGEtPnBvcnRfbmFtZSwgYiwgV1dOX1NJWkUpKSB7CiAJCQlzY3NpX2hvc3RfcHV0KGhvc3QpOwogCQkJY29udGludWU7CiAJCX0KLQkJLyoKLQkJICogU2V0dXAgcGFzc2VkIHBhcmFtZXRlcnMgYWhlYWQgb2YgaW52b2tpbmcgY2FsbGJhY2sKLQkJICovCi0JCWhhLT50Z3QudGd0X29wcyA9IHFsYV90Z3Rfb3BzOwotCQloYS0+dGd0LnRhcmdldF9scG9ydF9wdHIgPSB0YXJnZXRfbHBvcnRfcHRyOwotCQlyYyA9ICgqY2FsbGJhY2spKHZoYSk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQloYS0+dGd0LnRndF9vcHMgPSBOVUxMOwotCQkJaGEtPnRndC50YXJnZXRfbHBvcnRfcHRyID0gTlVMTDsKLQkJCXNjc2lfaG9zdF9wdXQoaG9zdCk7Ci0JCX0KIAkJbXV0ZXhfdW5sb2NrKCZxbGFfdGd0X211dGV4KTsKKworCQlyYyA9ICgqY2FsbGJhY2spKHZoYSwgdGFyZ2V0X2xwb3J0X3B0ciwgbnBpdl93d3BuLCBucGl2X3d3bm4pOworCQlpZiAocmMgIT0gMCkKKwkJCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKIAkJcmV0dXJuIHJjOwogCX0KIAltdXRleF91bmxvY2soJnFsYV90Z3RfbXV0ZXgpOwpAQCAtNDMxNCw3ICs0MzA3LDcgQEAKIAkvKgogCSAqIENsZWFyIHRoZSB0YXJnZXRfbHBvcnRfcHRyIHFsYV90YXJnZXRfdGVtcGxhdGUgcG9pbnRlciBpbiBxbGFfaHdfZGF0YQogCSAqLwotCWhhLT50Z3QudGFyZ2V0X2xwb3J0X3B0ciA9IE5VTEw7CisJdmhhLT52aGFfdGd0LnRhcmdldF9scG9ydF9wdHIgPSBOVUxMOwogCWhhLT50Z3QudGd0X29wcyA9IE5VTEw7CiAJLyoKIAkgKiBSZWxlYXNlIHRoZSBTY3NpX0hvc3QgcmVmZXJlbmNlIGZvciB0aGUgdW5kZXJseWluZyBxbGEyeHh4IGhvc3QKQEAgLTQzNzYsOCArNDM2OSw5IEBACiBxbHRfZW5hYmxlX3ZoYShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBoYS0+dGd0LnFsYV90Z3Q7CisJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlpZiAoIXRndCkgewogCQlxbF9kYmcocWxfZGJnX3RndCwgdmhhLCAweGUwNjksCkBAIC00MzkyLDkgKzQzODYsMTQgQEAKIAlxbHRfc2V0X21vZGUodmhhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCi0Jc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwotCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKLQlxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKTsKKwlpZiAodmhhLT52cF9pZHgpIHsKKwkJcWxhMjR4eF9kaXNhYmxlX3ZwKHZoYSk7CisJCXFsYTI0eHhfZW5hYmxlX3ZwKHZoYSk7CisJfSBlbHNlIHsKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncyk7CisJCXFsYTJ4eHhfd2FrZV9kcGMoYmFzZV92aGEpOworCQlxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoYmFzZV92aGEpOworCX0KIH0KIEVYUE9SVF9TWU1CT0wocWx0X2VuYWJsZV92aGEpOwogCkBAIC00NDA3LDcgKzQ0MDYsNyBAQAogcWx0X2Rpc2FibGVfdmhhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHFsYV90Z3QgKnRndCA9IGhhLT50Z3QucWxhX3RndDsKKwlzdHJ1Y3QgcWxhX3RndCAqdGd0ID0gdmhhLT52aGFfdGd0LnFsYV90Z3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghdGd0KSB7CkBAIC00NDM4LDggKzQ0MzcsMTAgQEAKIAlpZiAoIXFsYV90Z3RfbW9kZV9lbmFibGVkKHZoYSkpCiAJCXJldHVybjsKIAotCW11dGV4X2luaXQoJmhhLT50Z3QudGd0X211dGV4KTsKLQltdXRleF9pbml0KCZoYS0+dGd0LnRndF9ob3N0X2FjdGlvbl9tdXRleCk7CisJdmhhLT52aGFfdGd0LnFsYV90Z3QgPSBOVUxMOworCisJbXV0ZXhfaW5pdCgmdmhhLT52aGFfdGd0LnRndF9tdXRleCk7CisJbXV0ZXhfaW5pdCgmdmhhLT52aGFfdGd0LnRndF9ob3N0X2FjdGlvbl9tdXRleCk7CiAKIAlxbHRfY2xlYXJfbW9kZSh2aGEpOwogCkBAIC00NDUwLDYgKzQ0NTEsOCBAQAogCSAqIGFzc2lnbmluZyB0aGUgdmFsdWUgYXBwcm9wcmlhdGVseS4KIAkgKi8KIAloYS0+dGd0LmF0aW9fcV9sZW5ndGggPSBBVElPX0VOVFJZX0NOVF8yNFhYOworCisJcWx0X2FkZF90YXJnZXQoaGEsIHZoYSk7CiB9CiAKIHZvaWQKQEAgLTQ3NjgsOCArNDc3MSw4IEBACiAJCUlTUF9BVElPX1FfT1VUKGJhc2VfdmhhKSA9ICZoYS0+aW9iYXNlLT5pc3AyNC5hdGlvX3Ffb3V0OwogCX0KIAotCW11dGV4X2luaXQoJmhhLT50Z3QudGd0X211dGV4KTsKLQltdXRleF9pbml0KCZoYS0+dGd0LnRndF9ob3N0X2FjdGlvbl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmYmFzZV92aGEtPnZoYV90Z3QudGd0X211dGV4KTsKKwltdXRleF9pbml0KCZiYXNlX3ZoYS0+dmhhX3RndC50Z3RfaG9zdF9hY3Rpb25fbXV0ZXgpOwogCXFsdF9jbGVhcl9tb2RlKGJhc2VfdmhhKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5oCmluZGV4IGIzM2U0MTEuLjFkMTBlZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdGFyZ2V0LmgKQEAgLTkzMiw4ICs5MzIsOCBAQAogICovCiBleHRlcm4gaW50IHFsdF9hZGRfdGFyZ2V0KHN0cnVjdCBxbGFfaHdfZGF0YSAqLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiBpbnQgcWx0X3JlbW92ZV90YXJnZXQoc3RydWN0IHFsYV9od19kYXRhICosIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwotZXh0ZXJuIGludCBxbHRfbHBvcnRfcmVnaXN0ZXIoc3RydWN0IHFsYV90Z3RfZnVuY190bXBsICosIHU2NCwKLQkJCWludCAoKmNhbGxiYWNrKShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSwgdm9pZCAqKTsKK2V4dGVybiBpbnQgcWx0X2xwb3J0X3JlZ2lzdGVyKHZvaWQgKiwgdTY0LCB1NjQsIHU2NCwKKwkJCWludCAoKmNhbGxiYWNrKShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB2b2lkICosIHU2NCwgdTY0KSk7CiBleHRlcm4gdm9pZCBxbHRfbHBvcnRfZGVyZWdpc3RlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsdF91bnJlZ19zZXNzKHN0cnVjdCBxbGFfdGd0X3Nlc3MgKik7CiBleHRlcm4gdm9pZCBxbHRfZmNfcG9ydF9hZGRlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBmY19wb3J0X3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguYwppbmRleCA3ZWIxOWJlLi43NWExNDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmMKQEAgLTUzLDE2ICs1Myw2IEBACiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGNtX3FsYTJ4eHhfZnJlZV93cTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp0Y21fcWxhMnh4eF9jbWRfd3E7CiAKLXN0YXRpYyBpbnQgdGNtX3FsYTJ4eHhfY2hlY2tfdHJ1ZShzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGcpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdGNtX3FsYTJ4eHhfY2hlY2tfZmFsc2Uoc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnKQotewotCXJldHVybiAwOwotfQotCiAvKgogICogUGFyc2UgV1dOLgogICogSWYgc3RyaWN0LCB3ZSByZXF1aXJlIGxvd2VyLWNhc2UgaGV4IGFuZCBjb2xvbiBzZXBhcmF0b3JzIHRvIGJlIHN1cmUKQEAgLTE3NCw3ICsxNjQsNyBAQAogCSp3d25uID0gMDsKIAogCS8qIGNvdW50IG1heSBpbmNsdWRlIGEgTEYgYXQgZW5kIG9mIHN0cmluZyAqLwotCWlmIChuYW1lW2NudC0xXSA9PSAnXG4nKQorCWlmIChuYW1lW2NudC0xXSA9PSAnXG4nIHx8IG5hbWVbY250LTFdID09IDApCiAJCWNudC0tOwogCiAJLyogdmFsaWRhdGUgd2UgaGF2ZSBlbm91Z2ggY2hhcmFjdGVycyBmb3IgV1dQTiAqLwpAQCAtNzc3LDYgKzc2Nyw5IEBACiAKIHN0YXRpYyB2b2lkIHRjbV9xbGEyeHh4X3B1dF9zZXNzKHN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3MpCiB7CisJaWYgKCFzZXNzKQorCQlyZXR1cm47CisKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnNlc3MtPnZoYS0+aHctPmhhcmR3YXJlX2xvY2spOwogCWtyZWZfcHV0KCZzZXNzLT5zZV9zZXNzLT5zZXNzX2tyZWYsIHRjbV9xbGEyeHh4X3JlbGVhc2Vfc2Vzc2lvbik7CiB9CkBAIC05NTcsNyArOTUwLDYgQEAKIAlzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnQgKmxwb3J0ID0gY29udGFpbmVyX29mKHNlX3d3biwKIAkJCXN0cnVjdCB0Y21fcWxhMnh4eF9scG9ydCwgbHBvcnRfd3duKTsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gbHBvcnQtPnFsYV92aGE7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHRjbV9xbGEyeHh4X3RwZyAqdHBnID0gY29udGFpbmVyX29mKHNlX3RwZywKIAkJCXN0cnVjdCB0Y21fcWxhMnh4eF90cGcsIHNlX3RwZyk7CiAJdW5zaWduZWQgbG9uZyBvcDsKQEAgLTk3NywxMiArOTY5LDEyIEBACiAJCWF0b21pY19zZXQoJnRwZy0+bHBvcnRfdHBnX2VuYWJsZWQsIDEpOwogCQlxbHRfZW5hYmxlX3ZoYSh2aGEpOwogCX0gZWxzZSB7Ci0JCWlmICghaGEtPnRndC5xbGFfdGd0KSB7Ci0JCQlwcl9lcnIoInRydWN0IHFsYV9od19kYXRhICpoYS0+dGd0LnFsYV90Z3QgaXMgTlVMTFxuIik7CisJCWlmICghdmhhLT52aGFfdGd0LnFsYV90Z3QpIHsKKwkJCXByX2Vycigic3RydWN0IHFsYV9od19kYXRhICp2aGEtPnZoYV90Z3QucWxhX3RndCBpcyBOVUxMXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCWF0b21pY19zZXQoJnRwZy0+bHBvcnRfdHBnX2VuYWJsZWQsIDApOwotCQlxbHRfc3RvcF9waGFzZTEoaGEtPnRndC5xbGFfdGd0KTsKKwkJcWx0X3N0b3BfcGhhc2UxKHZoYS0+dmhhX3RndC5xbGFfdGd0KTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xMDExLDcgKzEwMDMsNyBAQAogCWlmIChrc3RydG91bChuYW1lICsgNSwgMTAsICZ0cGd0KSB8fCB0cGd0ID4gVVNIUlRfTUFYKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWlmICghbHBvcnQtPnFsYV9ucGl2X3ZwICYmICh0cGd0ICE9IDEpKSB7CisJaWYgKCh0cGd0ICE9IDEpKSB7CiAJCXByX2VycigiSW4gbm9uIE5QSVYgbW9kZSwgYSBzaW5nbGUgVFBHPTEgaXMgdXNlZCBmb3IgSFcgcG9ydCBtYXBwaW5nc1xuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOwogCX0KQEAgLTEwMzgsMTEgKzEwMzAsOCBAQAogCQlrZnJlZSh0cGcpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JLyoKLQkgKiBTZXR1cCBsb2NhbCBUUEc9MSBwb2ludGVyIGZvciBub24gTlBJViBtb2RlLgotCSAqLwotCWlmIChscG9ydC0+cWxhX25waXZfdnAgPT0gTlVMTCkKLQkJbHBvcnQtPnRwZ18xID0gdHBnOworCisJbHBvcnQtPnRwZ18xID0gdHBnOwogCiAJcmV0dXJuICZ0cGctPnNlX3RwZzsKIH0KQEAgLTEwNTMsMTkgKzEwNDIsMTcgQEAKIAkJCXN0cnVjdCB0Y21fcWxhMnh4eF90cGcsIHNlX3RwZyk7CiAJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydCA9IHRwZy0+bHBvcnQ7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGxwb3J0LT5xbGFfdmhhOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCS8qCiAJICogQ2FsbCBpbnRvIHFsYTJ4X3RhcmdldC5jIExMRCBsb2dpYyB0byBzaHV0ZG93biB0aGUgYWN0aXZlCiAJICogRkMgTmV4dXNlcyBhbmQgZGlzYWJsZSB0YXJnZXQgbW9kZSBvcGVyYXRpb24gZm9yIHRoaXMgcWxhX2h3X2RhdGEKIAkgKi8KLQlpZiAoaGEtPnRndC5xbGFfdGd0ICYmICFoYS0+dGd0LnFsYV90Z3QtPnRndF9zdG9wKQotCQlxbHRfc3RvcF9waGFzZTEoaGEtPnRndC5xbGFfdGd0KTsKKwlpZiAodmhhLT52aGFfdGd0LnFsYV90Z3QgJiYgIXZoYS0+dmhhX3RndC5xbGFfdGd0LT50Z3Rfc3RvcCkKKwkJcWx0X3N0b3BfcGhhc2UxKHZoYS0+dmhhX3RndC5xbGFfdGd0KTsKIAogCWNvcmVfdHBnX2RlcmVnaXN0ZXIoc2VfdHBnKTsKIAkvKgogCSAqIENsZWFyIGxvY2FsIFRQRz0xIHBvaW50ZXIgZm9yIG5vbiBOUElWIG1vZGUuCiAJICovCi0JaWYgKGxwb3J0LT5xbGFfbnBpdl92cCA9PSBOVUxMKQogCQlscG9ydC0+dHBnXzEgPSBOVUxMOwogCiAJa2ZyZWUodHBnKTsKQEAgLTEwOTUsMTIgKzEwODIsMjIgQEAKIAl0cGctPmxwb3J0ID0gbHBvcnQ7CiAJdHBnLT5scG9ydF90cGd0ID0gdHBndDsKIAorCS8qCisJICogQnkgZGVmYXVsdCBhbGxvdyBSRUFELU9OTFkgVFBHIGRlbW8tbW9kZSBhY2Nlc3Mgdy8gY2FjaGVkIGR5bmFtaWMKKwkgKiBOb2RlQUNMcworCSAqLworCXRwZy0+dHBnX2F0dHJpYi5nZW5lcmF0ZV9ub2RlX2FjbHMgPSAxOworCXRwZy0+dHBnX2F0dHJpYi5kZW1vX21vZGVfd3JpdGVfcHJvdGVjdCA9IDE7CisJdHBnLT50cGdfYXR0cmliLmNhY2hlX2R5bmFtaWNfYWNscyA9IDE7CisJdHBnLT50cGdfYXR0cmliLmRlbW9fbW9kZV9sb2dpbl9vbmx5ID0gMTsKKwogCXJldCA9IGNvcmVfdHBnX3JlZ2lzdGVyKCZ0Y21fcWxhMnh4eF9ucGl2X2ZhYnJpY19jb25maWdmcy0+dGZfb3BzLCB3d24sCiAJCQkJJnRwZy0+c2VfdHBnLCB0cGcsIFRSQU5TUE9SVF9UUEdfVFlQRV9OT1JNQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHRwZyk7CiAJCXJldHVybiBOVUxMOwogCX0KKwlscG9ydC0+dHBnXzEgPSB0cGc7CiAJcmV0dXJuICZ0cGctPnNlX3RwZzsKIH0KIApAQCAtMTExMSwxMyArMTEwOCwxMiBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhLAogCWNvbnN0IHVpbnQ4X3QgKnNfaWQpCiB7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnNlX25hY2w7CiAJc3RydWN0IHRjbV9xbGEyeHh4X25hY2wgKm5hY2w7CiAJdTMyIGtleTsKIAotCWxwb3J0ID0gaGEtPnRndC50YXJnZXRfbHBvcnRfcHRyOworCWxwb3J0ID0gdmhhLT52aGFfdGd0LnRhcmdldF9scG9ydF9wdHI7CiAJaWYgKCFscG9ydCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0XG4iKTsKIAkJZHVtcF9zdGFjaygpOwpAQCAtMTIyMSwxMyArMTIxNywxMiBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhLAogCWNvbnN0IHVpbnQxNl90IGxvb3BfaWQpCiB7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnNlX25hY2w7CiAJc3RydWN0IHRjbV9xbGEyeHh4X25hY2wgKm5hY2w7CiAJc3RydWN0IHRjbV9xbGEyeHh4X2ZjX2xvb3BpZCAqZmNfbG9vcGlkOwogCi0JbHBvcnQgPSBoYS0+dGd0LnRhcmdldF9scG9ydF9wdHI7CisJbHBvcnQgPSB2aGEtPnZoYV90Z3QudGFyZ2V0X2xwb3J0X3B0cjsKIAlpZiAoIWxwb3J0KSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnRcbiIpOwogCQlkdW1wX3N0YWNrKCk7CkBAIC0xMzQxLDYgKzEzMzYsNyBAQAogewogCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBzZXNzLT50Z3Q7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHRndC0+aGE7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzOwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqc2VfbmFjbDsKIAlzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnQgKmxwb3J0OwpAQCAtMTM1Nyw3ICsxMzUzLDcgQEAKIAlzZV9uYWNsID0gc2Vfc2Vzcy0+c2Vfbm9kZV9hY2w7CiAJbmFjbCA9IGNvbnRhaW5lcl9vZihzZV9uYWNsLCBzdHJ1Y3QgdGNtX3FsYTJ4eHhfbmFjbCwgc2Vfbm9kZV9hY2wpOwogCi0JbHBvcnQgPSBoYS0+dGd0LnRhcmdldF9scG9ydF9wdHI7CisJbHBvcnQgPSB2aGEtPnZoYV90Z3QudGFyZ2V0X2xwb3J0X3B0cjsKIAlpZiAoIWxwb3J0KSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnRcbiIpOwogCQlkdW1wX3N0YWNrKCk7CkBAIC0xMzkxLDcgKzEzODcsNyBAQAogCXVuc2lnbmVkIGNoYXIgcG9ydF9uYW1lWzM2XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbHBvcnQgPSBoYS0+dGd0LnRhcmdldF9scG9ydF9wdHI7CisJbHBvcnQgPSB2aGEtPnZoYV90Z3QudGFyZ2V0X2xwb3J0X3B0cjsKIAlpZiAoIWxwb3J0KSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnRcbiIpOwogCQlkdW1wX3N0YWNrKCk7CkBAIC0xNDU1LDcgKzE0NTEsOCBAQAogewogCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSBzZXNzLT50Z3Q7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHRndC0+aGE7Ci0Jc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydCA9IGhhLT50Z3QudGFyZ2V0X2xwb3J0X3B0cjsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydCA9IHZoYS0+dmhhX3RndC50YXJnZXRfbHBvcnRfcHRyOwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqc2VfbmFjbCA9IHNlc3MtPnNlX3Nlc3MtPnNlX25vZGVfYWNsOwogCXN0cnVjdCB0Y21fcWxhMnh4eF9uYWNsICpuYWNsID0gY29udGFpbmVyX29mKHNlX25hY2wsCiAJCQlzdHJ1Y3QgdGNtX3FsYTJ4eHhfbmFjbCwgc2Vfbm9kZV9hY2wpOwpAQCAtMTU2MiwxNSArMTU1OSwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjbV9xbGEyeHh4X2xwb3J0X3JlZ2lzdGVyX2NiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCitzdGF0aWMgaW50IHRjbV9xbGEyeHh4X2xwb3J0X3JlZ2lzdGVyX2NiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJCQkJCSB2b2lkICp0YXJnZXRfbHBvcnRfcHRyLAorCQkJCQkgdTY0IG5waXZfd3dwbiwgdTY0IG5waXZfd3dubikKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnQgKmxwb3J0OworCXN0cnVjdCB0Y21fcWxhMnh4eF9scG9ydCAqbHBvcnQgPQorCQkJKHN0cnVjdCB0Y21fcWxhMnh4eF9scG9ydCAqKXRhcmdldF9scG9ydF9wdHI7CiAJLyoKLQkgKiBTZXR1cCBsb2NhbCBwb2ludGVyIHRvIHZoYSwgTlBJViBWUCBwb2ludGVyIChpZiBwcmVzZW50KSBhbmQKLQkgKiB2aGEtPnRjbV9scG9ydCBwb2ludGVyCisJICogU2V0dXAgdGd0X29wcywgbG9jYWwgcG9pbnRlciB0byB2aGEgYW5kIHRhcmdldF9scG9ydF9wdHIKIAkgKi8KLQlscG9ydCA9IChzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnQgKiloYS0+dGd0LnRhcmdldF9scG9ydF9wdHI7CisJaGEtPnRndC50Z3Rfb3BzID0gJnRjbV9xbGEyeHh4X3RlbXBsYXRlOworCXZoYS0+dmhhX3RndC50YXJnZXRfbHBvcnRfcHRyID0gdGFyZ2V0X2xwb3J0X3B0cjsKIAlscG9ydC0+cWxhX3ZoYSA9IHZoYTsKIAogCXJldHVybiAwOwpAQCAtMTYwMiw4ICsxNjAyLDggQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gcWx0X2xwb3J0X3JlZ2lzdGVyKCZ0Y21fcWxhMnh4eF90ZW1wbGF0ZSwgd3dwbiwKLQkJCQl0Y21fcWxhMnh4eF9scG9ydF9yZWdpc3Rlcl9jYiwgbHBvcnQpOworCXJldCA9IHFsdF9scG9ydF9yZWdpc3RlcihscG9ydCwgd3dwbiwgMCwgMCwKKwkJCQkgdGNtX3FsYTJ4eHhfbHBvcnRfcmVnaXN0ZXJfY2IpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBvdXRfbHBvcnQ7CiAKQEAgLTE2MjEsNyArMTYyMSw2IEBACiAJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydCA9IGNvbnRhaW5lcl9vZih3d24sCiAJCQlzdHJ1Y3QgdGNtX3FsYTJ4eHhfbHBvcnQsIGxwb3J0X3d3bik7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGxwb3J0LT5xbGFfdmhhOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqbm9kZTsKIAl1MzIga2V5ID0gMDsKIApAQCAtMTYzMCw4ICsxNjI5LDggQEAKIAkgKiBzaHV0ZG93biBvZiBzdHJ1Y3QgcWxhX3RndCBhZnRlciB0aGUgY2FsbCB0bwogCSAqIHFsdF9zdG9wX3BoYXNlMSgpIGZyb20gdGNtX3FsYTJ4eHhfZHJvcF90cGcoKSBhYm92ZS4uCiAJICovCi0JaWYgKGhhLT50Z3QucWxhX3RndCAmJiAhaGEtPnRndC5xbGFfdGd0LT50Z3Rfc3RvcHBlZCkKLQkJcWx0X3N0b3BfcGhhc2UyKGhhLT50Z3QucWxhX3RndCk7CisJaWYgKHZoYS0+dmhhX3RndC5xbGFfdGd0ICYmICF2aGEtPnZoYV90Z3QucWxhX3RndC0+dGd0X3N0b3BwZWQpCisJCXFsdF9zdG9wX3BoYXNlMih2aGEtPnZoYV90Z3QucWxhX3RndCk7CiAKIAlxbHRfbHBvcnRfZGVyZWdpc3Rlcih2aGEpOwogCkBAIC0xNjQyLDE3ICsxNjQxLDcwIEBACiAJa2ZyZWUobHBvcnQpOwogfQogCitzdGF0aWMgaW50IHRjbV9xbGEyeHh4X2xwb3J0X3JlZ2lzdGVyX25waXZfY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhLAorCQkJCQkgICAgICB2b2lkICp0YXJnZXRfbHBvcnRfcHRyLAorCQkJCQkgICAgICB1NjQgbnBpdl93d3BuLCB1NjQgbnBpdl93d25uKQoreworCXN0cnVjdCBmY192cG9ydCAqdnBvcnQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2ggPSBiYXNlX3ZoYS0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqbnBpdl92aGE7CisJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydCA9CisJCQkoc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICopdGFyZ2V0X2xwb3J0X3B0cjsKKwlzdHJ1Y3QgZmNfdnBvcnRfaWRlbnRpZmllcnMgdnBvcnRfaWQ7CisKKwlpZiAoIXFsYV90Z3RfbW9kZV9lbmFibGVkKGJhc2VfdmhhKSkgeworCQlwcl9lcnIoInFsYTJ4eHggYmFzZV92aGEgbm90IGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJnZwb3J0X2lkLCAwLCBzaXplb2YodnBvcnRfaWQpKTsKKwl2cG9ydF9pZC5wb3J0X25hbWUgPSBucGl2X3d3cG47CisJdnBvcnRfaWQubm9kZV9uYW1lID0gbnBpdl93d25uOworCXZwb3J0X2lkLnJvbGVzID0gRkNfUE9SVF9ST0xFX0ZDUF9JTklUSUFUT1I7CisJdnBvcnRfaWQudnBvcnRfdHlwZSA9IEZDX1BPUlRUWVBFX05QSVY7CisJdnBvcnRfaWQuZGlzYWJsZSA9IGZhbHNlOworCisJdnBvcnQgPSBmY192cG9ydF9jcmVhdGUoc2gsIDAsICZ2cG9ydF9pZCk7CisJaWYgKCF2cG9ydCkgeworCQlwcl9lcnIoImZjX3Zwb3J0X2NyZWF0ZSBmYWlsZWQgZm9yIHFsYTJ4eHhfbnBpdlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKgorCSAqIFNldHVwIGxvY2FsIHBvaW50ZXIgdG8gTlBJViB2aGJhICsgdGFyZ2V0X2xwb3J0X3B0cgorCSAqLworCW5waXZfdmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopdnBvcnQtPmRkX2RhdGE7CisJbnBpdl92aGEtPnZoYV90Z3QudGFyZ2V0X2xwb3J0X3B0ciA9IHRhcmdldF9scG9ydF9wdHI7CisJbHBvcnQtPnFsYV92aGEgPSBucGl2X3ZoYTsKKworCXNjc2lfaG9zdF9nZXQobnBpdl92aGEtPmhvc3QpOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBzdHJ1Y3Qgc2Vfd3duICp0Y21fcWxhMnh4eF9ucGl2X21ha2VfbHBvcnQoCiAJc3RydWN0IHRhcmdldF9mYWJyaWNfY29uZmlnZnMgKnRmLAogCXN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLAogCWNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0ICpscG9ydDsKLQl1NjQgbnBpdl93d3BuLCBucGl2X3d3bm47CisJdTY0IHBoeXNfd3dwbiwgbnBpdl93d3BuLCBucGl2X3d3bm47CisJY2hhciAqcCwgdG1wWzEyOF07CiAJaW50IHJldDsKIAotCWlmICh0Y21fcWxhMnh4eF9ucGl2X3BhcnNlX3d3bihuYW1lLCBzdHJsZW4obmFtZSkrMSwKLQkJCQkmbnBpdl93d3BuLCAmbnBpdl93d25uKSA8IDApCisJc25wcmludGYodG1wLCAxMjgsICIlcyIsIG5hbWUpOworCisJcCA9IHN0cmNocih0bXAsICdAJyk7CisJaWYgKCFwKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBOUElWICdAJyBzZXBlcmF0b3JcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJKnArKyA9ICdcMCc7CisKKwlpZiAodGNtX3FsYTJ4eHhfcGFyc2Vfd3duKHRtcCwgJnBoeXNfd3dwbiwgMSkgPCAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlmICh0Y21fcWxhMnh4eF9ucGl2X3BhcnNlX3d3bihwLCBzdHJsZW4ocCkrMSwKKwkJCQkgICAgICAgJm5waXZfd3dwbiwgJm5waXZfd3dubikgPCAwKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWxwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0KSwgR0ZQX0tFUk5FTCk7CkBAIC0xNjY2LDEyICsxNzE4LDE5IEBACiAJCQlUQ01fUUxBMlhYWF9OQU1FTEVOLCBucGl2X3d3cG4sIG5waXZfd3dubik7CiAJc3ByaW50ZihscG9ydC0+bHBvcnRfbmFhX25hbWUsICJuYWEuJTAxNmxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG5waXZfd3dwbik7CiAKLS8qIEZJWE1FOiB0Y21fcWxhMnh4eF9ucGl2X21ha2VfbHBvcnQgKi8KLQlyZXQgPSAtRU5PU1lTOworCXJldCA9IHRjbV9xbGEyeHh4X2luaXRfbHBvcnQobHBvcnQpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBvdXQ7CiAKKwlyZXQgPSBxbHRfbHBvcnRfcmVnaXN0ZXIobHBvcnQsIHBoeXNfd3dwbiwgbnBpdl93d3BuLCBucGl2X3d3bm4sCisJCQkJIHRjbV9xbGEyeHh4X2xwb3J0X3JlZ2lzdGVyX25waXZfY2IpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXRfbHBvcnQ7CisKIAlyZXR1cm4gJmxwb3J0LT5scG9ydF93d247CitvdXRfbHBvcnQ6CisJdmZyZWUobHBvcnQtPmxwb3J0X2xvb3BpZF9tYXApOworCWJ0cmVlX2Rlc3Ryb3kzMigmbHBvcnQtPmxwb3J0X2ZjcG9ydF9tYXApOwogb3V0OgogCWtmcmVlKGxwb3J0KTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtMTY4MSwxNCArMTc0MCwxNiBAQAogewogCXN0cnVjdCB0Y21fcWxhMnh4eF9scG9ydCAqbHBvcnQgPSBjb250YWluZXJfb2Yod3duLAogCQkJc3RydWN0IHRjbV9xbGEyeHh4X2xwb3J0LCBscG9ydF93d24pOwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBscG9ydC0+cWxhX3ZoYTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCA9IHZoYS0+aG9zdDsKLQkvKgotCSAqIE5vdGlmeSBsaWJmYyB0aGF0IHdlIHdhbnQgdG8gcmVsZWFzZSB0aGUgbHBvcnQtPm5waXZfdnBvcnQKLQkgKi8KLQlmY192cG9ydF90ZXJtaW5hdGUobHBvcnQtPm5waXZfdnBvcnQpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpucGl2X3ZoYSA9IGxwb3J0LT5xbGFfdmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBucGl2X3ZoYS0+aHc7CisJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKLQlzY3NpX2hvc3RfcHV0KHNoKTsKKwlzY3NpX2hvc3RfcHV0KG5waXZfdmhhLT5ob3N0KTsKKwkvKgorCSAqIE5vdGlmeSBsaWJmYyB0aGF0IHdlIHdhbnQgdG8gcmVsZWFzZSB0aGUgdmhhLT5mY192cG9ydAorCSAqLworCWZjX3Zwb3J0X3Rlcm1pbmF0ZShucGl2X3ZoYS0+ZmNfdnBvcnQpOworCXNjc2lfaG9zdF9wdXQoYmFzZV92aGEtPmhvc3QpOwogCWtmcmVlKGxwb3J0KTsKIH0KIApAQCAtMTc2OSwxNCArMTgzMCwxNiBAQAogCS50cGdfZ2V0X3ByX3RyYW5zcG9ydF9pZAk9IHRjbV9xbGEyeHh4X2dldF9wcl90cmFuc3BvcnRfaWQsCiAJLnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkX2xlbgk9IHRjbV9xbGEyeHh4X2dldF9wcl90cmFuc3BvcnRfaWRfbGVuLAogCS50cGdfcGFyc2VfcHJfb3V0X3RyYW5zcG9ydF9pZAk9IHRjbV9xbGEyeHh4X3BhcnNlX3ByX291dF90cmFuc3BvcnRfaWQsCi0JLnRwZ19jaGVja19kZW1vX21vZGUJCT0gdGNtX3FsYTJ4eHhfY2hlY2tfZmFsc2UsCi0JLnRwZ19jaGVja19kZW1vX21vZGVfY2FjaGUJPSB0Y21fcWxhMnh4eF9jaGVja190cnVlLAotCS50cGdfY2hlY2tfZGVtb19tb2RlX3dyaXRlX3Byb3RlY3QgPSB0Y21fcWxhMnh4eF9jaGVja190cnVlLAotCS50cGdfY2hlY2tfcHJvZF9tb2RlX3dyaXRlX3Byb3RlY3QgPSB0Y21fcWxhMnh4eF9jaGVja19mYWxzZSwKKwkudHBnX2NoZWNrX2RlbW9fbW9kZQkJPSB0Y21fcWxhMnh4eF9jaGVja19kZW1vX21vZGUsCisJLnRwZ19jaGVja19kZW1vX21vZGVfY2FjaGUJPSB0Y21fcWxhMnh4eF9jaGVja19kZW1vX21vZGVfY2FjaGUsCisJLnRwZ19jaGVja19kZW1vX21vZGVfd3JpdGVfcHJvdGVjdCA9IHRjbV9xbGEyeHh4X2NoZWNrX2RlbW9fbW9kZSwKKwkudHBnX2NoZWNrX3Byb2RfbW9kZV93cml0ZV9wcm90ZWN0ID0KKwkgICAgdGNtX3FsYTJ4eHhfY2hlY2tfcHJvZF93cml0ZV9wcm90ZWN0LAogCS50cGdfY2hlY2tfZGVtb19tb2RlX2xvZ2luX29ubHkJPSB0Y21fcWxhMnh4eF9jaGVja19kZW1vX21vZGVfbG9naW5fb25seSwKIAkudHBnX2FsbG9jX2ZhYnJpY19hY2wJCT0gdGNtX3FsYTJ4eHhfYWxsb2NfZmFicmljX2FjbCwKIAkudHBnX3JlbGVhc2VfZmFicmljX2FjbAkJPSB0Y21fcWxhMnh4eF9yZWxlYXNlX2ZhYnJpY19hY2wsCiAJLnRwZ19nZXRfaW5zdF9pbmRleAkJPSB0Y21fcWxhMnh4eF90cGdfZ2V0X2luc3RfaW5kZXgsCisJLmNoZWNrX3N0b3BfZnJlZSAgICAgICAgICAgICAgICA9IHRjbV9xbGEyeHh4X2NoZWNrX3N0b3BfZnJlZSwKIAkucmVsZWFzZV9jbWQJCQk9IHRjbV9xbGEyeHh4X3JlbGVhc2VfY21kLAogCS5wdXRfc2Vzc2lvbgkJCT0gdGNtX3FsYTJ4eHhfcHV0X3Nlc3Npb24sCiAJLnNodXRkb3duX3Nlc3Npb24JCT0gdGNtX3FsYTJ4eHhfc2h1dGRvd25fc2Vzc2lvbiwKQEAgLTE4NzEsNyArMTkzNCw4IEBACiAJICogU2V0dXAgZGVmYXVsdCBhdHRyaWJ1dGUgbGlzdHMgZm9yIHZhcmlvdXMgbnBpdl9mYWJyaWMtPnRmX2NpdF90bXBsCiAJICovCiAJbnBpdl9mYWJyaWMtPnRmX2NpdF90bXBsLnRmY193d25fY2l0LmN0X2F0dHJzID0gdGNtX3FsYTJ4eHhfd3duX2F0dHJzOwotCW5waXZfZmFicmljLT50Zl9jaXRfdG1wbC50ZmNfdHBnX2Jhc2VfY2l0LmN0X2F0dHJzID0gTlVMTDsKKwlucGl2X2ZhYnJpYy0+dGZfY2l0X3RtcGwudGZjX3RwZ19iYXNlX2NpdC5jdF9hdHRycyA9CisJICAgIHRjbV9xbGEyeHh4X3RwZ19hdHRyczsKIAlucGl2X2ZhYnJpYy0+dGZfY2l0X3RtcGwudGZjX3RwZ19hdHRyaWJfY2l0LmN0X2F0dHJzID0gTlVMTDsKIAlucGl2X2ZhYnJpYy0+dGZfY2l0X3RtcGwudGZjX3RwZ19wYXJhbV9jaXQuY3RfYXR0cnMgPSBOVUxMOwogCW5waXZfZmFicmljLT50Zl9jaXRfdG1wbC50ZmNfdHBnX25wX2Jhc2VfY2l0LmN0X2F0dHJzID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5oCmluZGV4IDc3MWY3YjguLjI3NWQ4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguaApAQCAtNzAsMTIgKzcwLDggQEAKIAlzdHJ1Y3QgdGNtX3FsYTJ4eHhfZmNfbG9vcGlkICpscG9ydF9sb29waWRfbWFwOwogCS8qIFBvaW50ZXIgdG8gc3RydWN0IHNjc2lfcWxhX2hvc3QgZnJvbSBxbGEyeHh4IExMRCAqLwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpxbGFfdmhhOwotCS8qIFBvaW50ZXIgdG8gc3RydWN0IHNjc2lfcWxhX2hvc3QgZm9yIE5QSVYgVlAgZnJvbSBxbGEyeHh4IExMRCAqLwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpxbGFfbnBpdl92cDsKIAkvKiBQb2ludGVyIHRvIHN0cnVjdCBxbGFfdGd0IHBvaW50ZXIgKi8KIAlzdHJ1Y3QgcWxhX3RndCBscG9ydF9xbGFfdGd0OwotCS8qIFBvaW50ZXIgdG8gc3RydWN0IGZjX3Zwb3J0IGZvciBOUElWIHZwb3J0IGZyb20gbGliZmMgKi8KLQlzdHJ1Y3QgZmNfdnBvcnQgKm5waXZfdnBvcnQ7CiAJLyogUG9pbnRlciB0byBUUEc9MSBmb3Igbm9uIE5QSVYgbW9kZSAqLwogCXN0cnVjdCB0Y21fcWxhMnh4eF90cGcgKnRwZ18xOwogCS8qIFJldHVybmVkIGJ5IHRjbV9xbGEyeHh4X21ha2VfbHBvcnQoKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA5ODQ2YzZhLi40NzA5NTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtODAxLDcgKzgwMSw3IEBACiAJaWYgKHNka3AtPmRldmljZS0+bm9fd3JpdGVfc2FtZSkKIAkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKIAotCUJVR19PTihiaW9fb2Zmc2V0KGJpbykgfHwgYmlvX2lvdmVjKGJpbyktPmJ2X2xlbiAhPSBzZHAtPnNlY3Rvcl9zaXplKTsKKwlCVUdfT04oYmlvX29mZnNldChiaW8pIHx8IGJpb19pb3ZlYyhiaW8pLmJ2X2xlbiAhPSBzZHAtPnNlY3Rvcl9zaXplKTsKIAogCXNlY3RvciA+Pj0gaWxvZzIoc2RwLT5zZWN0b3Jfc2l6ZSkgLSA5OwogCW5yX3NlY3RvcnMgPj49IGlsb2cyKHNkcC0+c2VjdG9yX3NpemUpIC0gOTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZF9kaWYuYyBiL2RyaXZlcnMvc2NzaS9zZF9kaWYuYwppbmRleCA2MTc0Y2E0Li5hN2E2OTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkX2RpZi5jCkBAIC0zNjUsNyArMzY1LDYgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJc3RydWN0IHNjc2lfZGlzayAqc2RrcDsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQ7Ci0JdW5zaWduZWQgaW50IGksIGo7CiAJdTMyIHBoeXMsIHZpcnQ7CiAKIAlzZGtwID0gcnEtPmJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwpAQCAtMzc2LDE5ICszNzUsMjEgQEAKIAlwaHlzID0gaHdfc2VjdG9yICYgMHhmZmZmZmZmZjsKIAogCV9fcnFfZm9yX2VhY2hfYmlvKGJpbywgcnEpIHsKLQkJc3RydWN0IGJpb192ZWMgKml2OworCQlzdHJ1Y3QgYmlvX3ZlYyBpdjsKKwkJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCQl1bnNpZ25lZCBpbnQgajsKIAogCQkvKiBBbHJlYWR5IHJlbWFwcGVkPyAqLwogCQlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fTUFQUEVEX0lOVEVHUklUWSkpCiAJCQlicmVhazsKIAotCQl2aXJ0ID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9zZWN0b3IgJiAweGZmZmZmZmZmOworCQl2aXJ0ID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9pdGVyLmJpX3NlY3RvciAmIDB4ZmZmZmZmZmY7CiAKLQkJYmlwX2Zvcl9lYWNoX3ZlYyhpdiwgYmlvLT5iaV9pbnRlZ3JpdHksIGkpIHsKLQkJCXNkdCA9IGttYXBfYXRvbWljKGl2LT5idl9wYWdlKQotCQkJCSsgaXYtPmJ2X29mZnNldDsKKwkJYmlwX2Zvcl9lYWNoX3ZlYyhpdiwgYmlvLT5iaV9pbnRlZ3JpdHksIGl0ZXIpIHsKKwkJCXNkdCA9IGttYXBfYXRvbWljKGl2LmJ2X3BhZ2UpCisJCQkJKyBpdi5idl9vZmZzZXQ7CiAKLQkJCWZvciAoaiA9IDAgOyBqIDwgaXYtPmJ2X2xlbiA7IGogKz0gdHVwbGVfc3osIHNkdCsrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaXYuYnZfbGVuOyBqICs9IHR1cGxlX3N6LCBzZHQrKykgewogCiAJCQkJaWYgKGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykgPT0gdmlydCkKIAkJCQkJc2R0LT5yZWZfdGFnID0gY3B1X3RvX2JlMzIocGh5cyk7CkBAIC00MTQsNyArNDE1LDcgQEAKIAlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwOwogCXN0cnVjdCBiaW8gKmJpbzsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQ7Ci0JdW5zaWduZWQgaW50IGksIGosIHNlY3RvcnMsIHNlY3Rvcl9zejsKKwl1bnNpZ25lZCBpbnQgaiwgc2VjdG9ycywgc2VjdG9yX3N6OwogCXUzMiBwaHlzLCB2aXJ0OwogCiAJc2RrcCA9IHNjc2lfZGlzayhzY21kLT5yZXF1ZXN0LT5ycV9kaXNrKTsKQEAgLTQzMCwxNSArNDMxLDE2IEBACiAJCXBoeXMgPj49IDM7CiAKIAlfX3JxX2Zvcl9lYWNoX2JpbyhiaW8sIHNjbWQtPnJlcXVlc3QpIHsKLQkJc3RydWN0IGJpb192ZWMgKml2OworCQlzdHJ1Y3QgYmlvX3ZlYyBpdjsKKwkJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCi0JCXZpcnQgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX3NlY3RvciAmIDB4ZmZmZmZmZmY7CisJCXZpcnQgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2l0ZXIuYmlfc2VjdG9yICYgMHhmZmZmZmZmZjsKIAotCQliaXBfZm9yX2VhY2hfdmVjKGl2LCBiaW8tPmJpX2ludGVncml0eSwgaSkgewotCQkJc2R0ID0ga21hcF9hdG9taWMoaXYtPmJ2X3BhZ2UpCi0JCQkJKyBpdi0+YnZfb2Zmc2V0OworCQliaXBfZm9yX2VhY2hfdmVjKGl2LCBiaW8tPmJpX2ludGVncml0eSwgaXRlcikgeworCQkJc2R0ID0ga21hcF9hdG9taWMoaXYuYnZfcGFnZSkKKwkJCQkrIGl2LmJ2X29mZnNldDsKIAotCQkJZm9yIChqID0gMCA7IGogPCBpdi0+YnZfbGVuIDsgaiArPSB0dXBsZV9zeiwgc2R0KyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBpdi5idl9sZW47IGogKz0gdHVwbGVfc3osIHNkdCsrKSB7CiAKIAkJCQlpZiAoc2VjdG9ycyA9PSAwKSB7CiAJCQkJCWt1bm1hcF9hdG9taWMoc2R0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKaW5kZXggNDZkMjMxMy4uNTAzMjE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXU4IGJpdHNfcGVyX3dvcmQ7CiAJc3RydWN0IGNsayAqY2xrX21jbGs7CisJc3RydWN0IGNsayAqY2xrX2lwZzsKIAl1MzIgbWNsa19yYXRlOwogCiAJc3RydWN0IGNvbXBsZXRpb24gdHhpc3Jkb25lOwpAQCAtNDc1LDggKzQ3Niw2IEBACiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlpbnQgcmV0OwogCXZvaWQgKnRlbXBwOwotCWludCBwc2NfbnVtOwotCWNoYXIgY2xrX25hbWVbMTZdOwogCXN0cnVjdCBjbGsgKmNsazsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2YgKm1wcyk7CkBAIC01MTksOSArNTE4LDcgQEAKIAkJZ290byBmcmVlX21hc3RlcjsKIAlpbml0X2NvbXBsZXRpb24oJm1wcy0+dHhpc3Jkb25lKTsKIAotCXBzY19udW0gPSBtYXN0ZXItPmJ1c19udW07Ci0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJwc2MlZF9tY2xrIiwgcHNjX251bSk7Ci0JY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgY2xrX25hbWUpOworCWNsayA9IGRldm1fY2xrX2dldChkZXYsICJtY2xrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJZ290byBmcmVlX21hc3RlcjsKQEAgLTUzMiwxNyArNTI5LDI5IEBACiAJbXBzLT5jbGtfbWNsayA9IGNsazsKIAltcHMtPm1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOwogCisJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImlwZyIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJCWdvdG8gZnJlZV9tY2xrX2Nsb2NrOworCX0KKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfbWNsa19jbG9jazsKKwltcHMtPmNsa19pcGcgPSBjbGs7CisKIAlyZXQgPSBtcGM1MTJ4X3BzY19zcGlfcG9ydF9jb25maWcobWFzdGVyLCBtcHMpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGZyZWVfY2xvY2s7CisJCWdvdG8gZnJlZV9pcGdfY2xvY2s7CiAKIAlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGZyZWVfY2xvY2s7CisJCWdvdG8gZnJlZV9pcGdfY2xvY2s7CiAKIAlyZXR1cm4gcmV0OwogCi1mcmVlX2Nsb2NrOgorZnJlZV9pcGdfY2xvY2s6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1wcy0+Y2xrX2lwZyk7CitmcmVlX21jbGtfY2xvY2s6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1wcy0+Y2xrX21jbGspOwogZnJlZV9tYXN0ZXI6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKQEAgLTU1Niw2ICs1NjUsNyBAQAogCXN0cnVjdCBtcGM1MTJ4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAogCWNsa19kaXNhYmxlX3VucHJlcGFyZShtcHMtPmNsa19tY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXBzLT5jbGtfaXBnKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvS2NvbmZpZyBiL2RyaXZlcnMvc3NiL0tjb25maWcKaW5kZXggMmNkOWIwZS4uNzViMzYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3NzYi9LY29uZmlnCkBAIC0xNjgsNiArMTY4LDcgQEAKIGNvbmZpZyBTU0JfRFJJVkVSX0dQSU8KIAlib29sICJTU0IgR1BJTyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBTU0IgJiYgR1BJT0xJQgorCXNlbGVjdCBJUlFfRE9NQUlOIGlmIFNTQl9FTUJFRERFRAogCWhlbHAKIAkgIERyaXZlciB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9uIHRoZSBidXMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9ncGlvLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfZ3Bpby5jCmluZGV4IGRjMTA5ZGUuLmJhMzUwZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9ncGlvLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2dwaW8uYwpAQCAtOSwxNiArOSw0MCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogCiAjaW5jbHVkZSAic3NiX3ByaXZhdGUuaCIKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoYXJlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBzdGF0aWMgc3RydWN0IHNzYl9idXMgKnNzYl9ncGlvX2dldF9idXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBzc2JfYnVzLCBncGlvKTsKIH0KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NTQl9FTUJFRERFRCkKK3N0YXRpYyBpbnQgc3NiX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCit7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IHNzYl9ncGlvX2dldF9idXMoY2hpcCk7CisKKwlpZiAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1NTQikKKwkJcmV0dXJuIGlycV9maW5kX21hcHBpbmcoYnVzLT5pcnFfZG9tYWluLCBncGlvKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hpcENvbW1vbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBzdGF0aWMgaW50IHNzYl9ncGlvX2NoaXBjb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gc3NiX2dwaW9fZ2V0X2J1cyhjaGlwKTsKQEAgLTc0LDE5ICs5OCwxMjkgQEAKIAlzc2JfY2hpcGNvX2dwaW9fcHVsbHVwKCZidXMtPmNoaXBjbywgMSA8PCBncGlvLCAwKTsKIH0KIAotc3RhdGljIGludCBzc2JfZ3Bpb19jaGlwY29fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU1NCX0VNQkVEREVEKQorc3RhdGljIHZvaWQgc3NiX2dwaW9faXJxX2NoaXBjb19tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gc3NiX2dwaW9fZ2V0X2J1cyhjaGlwKTsKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOwogCi0JaWYgKGJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TU0IpCi0JCXJldHVybiBzc2JfbWlwc19pcnEoYnVzLT5jaGlwY28uZGV2KSArIDI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzc2JfY2hpcGNvX2dwaW9faW50bWFzaygmYnVzLT5jaGlwY28sIEJJVChncGlvKSwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNzYl9ncGlvX2lycV9jaGlwY29fdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOworCXUzMiB2YWwgPSBzc2JfY2hpcGNvX2dwaW9faW4oJmJ1cy0+Y2hpcGNvLCBCSVQoZ3BpbykpOworCisJc3NiX2NoaXBjb19ncGlvX3BvbGFyaXR5KCZidXMtPmNoaXBjbywgQklUKGdwaW8pLCB2YWwpOworCXNzYl9jaGlwY29fZ3Bpb19pbnRtYXNrKCZidXMtPmNoaXBjbywgQklUKGdwaW8pLCBCSVQoZ3BpbykpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNzYl9ncGlvX2lycV9jaGlwY29fY2hpcCA9IHsKKwkubmFtZQkJPSAiU1NCLUdQSU8tQ0MiLAorCS5pcnFfbWFzawk9IHNzYl9ncGlvX2lycV9jaGlwY29fbWFzaywKKwkuaXJxX3VubWFzawk9IHNzYl9ncGlvX2lycV9jaGlwY29fdW5tYXNrLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHNzYl9ncGlvX2lycV9jaGlwY29faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldl9pZDsKKwlzdHJ1Y3Qgc3NiX2NoaXBjb21tb24gKmNoaXBjbyA9ICZidXMtPmNoaXBjbzsKKwl1MzIgdmFsID0gY2hpcGNvX3JlYWQzMihjaGlwY28sIFNTQl9DSElQQ09fR1BJT0lOKTsKKwl1MzIgbWFzayA9IGNoaXBjb19yZWFkMzIoY2hpcGNvLCBTU0JfQ0hJUENPX0dQSU9JUlEpOworCXUzMiBwb2wgPSBjaGlwY29fcmVhZDMyKGNoaXBjbywgU1NCX0NISVBDT19HUElPUE9MKTsKKwl1bnNpZ25lZCBsb25nIGlycXMgPSAodmFsIF4gcG9sKSAmIG1hc2s7CisJaW50IGdwaW87CisKKwlpZiAoIWlycXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZvcl9lYWNoX3NldF9iaXQoZ3BpbywgJmlycXMsIGJ1cy0+Z3Bpby5uZ3BpbykKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKHNzYl9ncGlvX3RvX2lycSgmYnVzLT5ncGlvLCBncGlvKSk7CisJc3NiX2NoaXBjb19ncGlvX3BvbGFyaXR5KGNoaXBjbywgaXJxcywgdmFsICYgaXJxcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3NiX2dwaW9faXJxX2NoaXBjb19kb21haW5faW5pdChzdHJ1Y3Qgc3NiX2J1cyAqYnVzKQoreworCXN0cnVjdCBzc2JfY2hpcGNvbW1vbiAqY2hpcGNvID0gJmJ1cy0+Y2hpcGNvOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSAmYnVzLT5ncGlvOworCWludCBncGlvLCBod2lycSwgZXJyOworCisJaWYgKGJ1cy0+YnVzdHlwZSAhPSBTU0JfQlVTVFlQRV9TU0IpCisJCXJldHVybiAwOworCisJYnVzLT5pcnFfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKE5VTEwsIGNoaXAtPm5ncGlvLAorCQkJCQkJJmlycV9kb21haW5fc2ltcGxlX29wcywgY2hpcGNvKTsKKwlpZiAoIWJ1cy0+aXJxX2RvbWFpbikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9pcnFfZG9tYWluOworCX0KKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKGJ1cy0+aXJxX2RvbWFpbiwgZ3Bpbyk7CisKKwkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBidXMpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc3NiX2dwaW9faXJxX2NoaXBjb19jaGlwLAorCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCX0KKworCWh3aXJxID0gc3NiX21pcHNfaXJxKGJ1cy0+Y2hpcGNvLmRldikgKyAyOworCWVyciA9IHJlcXVlc3RfaXJxKGh3aXJxLCBzc2JfZ3Bpb19pcnFfY2hpcGNvX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJICAiZ3BpbyIsIGJ1cyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxX2lycTsKKworCXNzYl9jaGlwY29fZ3Bpb19pbnRtYXNrKCZidXMtPmNoaXBjbywgfjAsIDApOworCWNoaXBjb19zZXQzMihjaGlwY28sIFNTQl9DSElQQ09fSVJRTUFTSywgU1NCX0NISVBDT19JUlFfR1BJTyk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlcV9pcnE6CisJZm9yIChncGlvID0gMDsgZ3BpbyA8IGNoaXAtPm5ncGlvOyBncGlvKyspIHsKKwkJaW50IGlycSA9IGlycV9maW5kX21hcHBpbmcoYnVzLT5pcnFfZG9tYWluLCBncGlvKTsKKworCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycSk7CisJfQorCWlycV9kb21haW5fcmVtb3ZlKGJ1cy0+aXJxX2RvbWFpbik7CitlcnJfaXJxX2RvbWFpbjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzc2JfZ3Bpb19pcnFfY2hpcGNvX2RvbWFpbl9leGl0KHN0cnVjdCBzc2JfYnVzICpidXMpCit7CisJc3RydWN0IHNzYl9jaGlwY29tbW9uICpjaGlwY28gPSAmYnVzLT5jaGlwY287CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9ICZidXMtPmdwaW87CisJaW50IGdwaW87CisKKwlpZiAoYnVzLT5idXN0eXBlICE9IFNTQl9CVVNUWVBFX1NTQikKKwkJcmV0dXJuOworCisJY2hpcGNvX21hc2szMihjaGlwY28sIFNTQl9DSElQQ09fSVJRTUFTSywgflNTQl9DSElQQ09fSVJRX0dQSU8pOworCWZyZWVfaXJxKHNzYl9taXBzX2lycShidXMtPmNoaXBjby5kZXYpICsgMiwgY2hpcGNvKTsKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhidXMtPmlycV9kb21haW4sIGdwaW8pOworCisJCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKKwl9CisJaXJxX2RvbWFpbl9yZW1vdmUoYnVzLT5pcnFfZG9tYWluKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IHNzYl9ncGlvX2lycV9jaGlwY29fZG9tYWluX2luaXQoc3RydWN0IHNzYl9idXMgKmJ1cykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3NiX2dwaW9faXJxX2NoaXBjb19kb21haW5fZXhpdChzdHJ1Y3Qgc3NiX2J1cyAqYnVzKQoreworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgc3NiX2dwaW9fY2hpcGNvX2luaXQoc3RydWN0IHNzYl9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmJ1cy0+Z3BpbzsKKwlpbnQgZXJyOwogCiAJY2hpcC0+bGFiZWwJCT0gInNzYl9jaGlwY29fZ3BpbyI7CiAJY2hpcC0+b3duZXIJCT0gVEhJU19NT0RVTEU7CkBAIC05Niw3ICsyMzAsOSBAQAogCWNoaXAtPnNldAkJPSBzc2JfZ3Bpb19jaGlwY29fc2V0X3ZhbHVlOwogCWNoaXAtPmRpcmVjdGlvbl9pbnB1dAk9IHNzYl9ncGlvX2NoaXBjb19kaXJlY3Rpb25faW5wdXQ7CiAJY2hpcC0+ZGlyZWN0aW9uX291dHB1dAk9IHNzYl9ncGlvX2NoaXBjb19kaXJlY3Rpb25fb3V0cHV0OwotCWNoaXAtPnRvX2lycQkJPSBzc2JfZ3Bpb19jaGlwY29fdG9faXJxOworI2lmIElTX0VOQUJMRUQoQ09ORklHX1NTQl9FTUJFRERFRCkKKwljaGlwLT50b19pcnEJCT0gc3NiX2dwaW9fdG9faXJxOworI2VuZGlmCiAJY2hpcC0+bmdwaW8JCT0gMTY7CiAJLyogVGhlcmUgaXMganVzdCBvbmUgU29DIGluIG9uZSBkZXZpY2UgYW5kIGl0cyBHUElPIGFkZHJlc3NlcyBzaG91bGQgYmUKIAkgKiBkZXRlcm1pbmlzdGljIHRvIGFkZHJlc3MgdGhlbSBtb3JlIGVhc2lseS4gVGhlIG90aGVyIGJ1c2VzIGNvdWxkIGdldApAQCAtMTA2LDkgKzI0MiwyMyBAQAogCWVsc2UKIAkJY2hpcC0+YmFzZQkJPSAtMTsKIAotCXJldHVybiBncGlvY2hpcF9hZGQoY2hpcCk7CisJZXJyID0gc3NiX2dwaW9faXJxX2NoaXBjb19kb21haW5faW5pdChidXMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBncGlvY2hpcF9hZGQoY2hpcCk7CisJaWYgKGVycikgeworCQlzc2JfZ3Bpb19pcnFfY2hpcGNvX2RvbWFpbl9leGl0KGJ1cyk7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVhUSUYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIENPTkZJR19TU0JfRFJJVkVSX0VYVElGCiAKIHN0YXRpYyBpbnQgc3NiX2dwaW9fZXh0aWZfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCkBAIC0xNDUsMTkgKzI5NSwxMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzc2JfZ3Bpb19leHRpZl90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TU0JfRU1CRURERUQpCitzdGF0aWMgdm9pZCBzc2JfZ3Bpb19pcnFfZXh0aWZfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IHNzYl9ncGlvX2dldF9idXMoY2hpcCk7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBncGlvID0gaXJxZF90b19od2lycShkKTsKIAotCWlmIChidXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU1NCKQotCQlyZXR1cm4gc3NiX21pcHNfaXJxKGJ1cy0+ZXh0aWYuZGV2KSArIDI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzc2JfZXh0aWZfZ3Bpb19pbnRtYXNrKCZidXMtPmV4dGlmLCBCSVQoZ3BpbyksIDApOwogfQogCitzdGF0aWMgdm9pZCBzc2JfZ3Bpb19pcnFfZXh0aWZfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOworCXUzMiB2YWwgPSBzc2JfZXh0aWZfZ3Bpb19pbigmYnVzLT5leHRpZiwgQklUKGdwaW8pKTsKKworCXNzYl9leHRpZl9ncGlvX3BvbGFyaXR5KCZidXMtPmV4dGlmLCBCSVQoZ3BpbyksIHZhbCk7CisJc3NiX2V4dGlmX2dwaW9faW50bWFzaygmYnVzLT5leHRpZiwgQklUKGdwaW8pLCBCSVQoZ3BpbykpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNzYl9ncGlvX2lycV9leHRpZl9jaGlwID0geworCS5uYW1lCQk9ICJTU0ItR1BJTy1FWFRJRiIsCisJLmlycV9tYXNrCT0gc3NiX2dwaW9faXJxX2V4dGlmX21hc2ssCisJLmlycV91bm1hc2sJPSBzc2JfZ3Bpb19pcnFfZXh0aWZfdW5tYXNrLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHNzYl9ncGlvX2lycV9leHRpZl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2X2lkOworCXN0cnVjdCBzc2JfZXh0aWYgKmV4dGlmID0gJmJ1cy0+ZXh0aWY7CisJdTMyIHZhbCA9IHNzYl9yZWFkMzIoZXh0aWYtPmRldiwgU1NCX0VYVElGX0dQSU9fSU4pOworCXUzMiBtYXNrID0gc3NiX3JlYWQzMihleHRpZi0+ZGV2LCBTU0JfRVhUSUZfR1BJT19JTlRNQVNLKTsKKwl1MzIgcG9sID0gc3NiX3JlYWQzMihleHRpZi0+ZGV2LCBTU0JfRVhUSUZfR1BJT19JTlRQT0wpOworCXVuc2lnbmVkIGxvbmcgaXJxcyA9ICh2YWwgXiBwb2wpICYgbWFzazsKKwlpbnQgZ3BpbzsKKworCWlmICghaXJxcykKKwkJcmV0dXJuIElSUV9OT05FOworCisJZm9yX2VhY2hfc2V0X2JpdChncGlvLCAmaXJxcywgYnVzLT5ncGlvLm5ncGlvKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoc3NiX2dwaW9fdG9faXJxKCZidXMtPmdwaW8sIGdwaW8pKTsKKwlzc2JfZXh0aWZfZ3Bpb19wb2xhcml0eShleHRpZiwgaXJxcywgdmFsICYgaXJxcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3NiX2dwaW9faXJxX2V4dGlmX2RvbWFpbl9pbml0KHN0cnVjdCBzc2JfYnVzICpidXMpCit7CisJc3RydWN0IHNzYl9leHRpZiAqZXh0aWYgPSAmYnVzLT5leHRpZjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmJ1cy0+Z3BpbzsKKwlpbnQgZ3BpbywgaHdpcnEsIGVycjsKKworCWlmIChidXMtPmJ1c3R5cGUgIT0gU1NCX0JVU1RZUEVfU1NCKQorCQlyZXR1cm4gMDsKKworCWJ1cy0+aXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihOVUxMLCBjaGlwLT5uZ3BpbywKKwkJCQkJCSZpcnFfZG9tYWluX3NpbXBsZV9vcHMsIGV4dGlmKTsKKwlpZiAoIWJ1cy0+aXJxX2RvbWFpbikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9pcnFfZG9tYWluOworCX0KKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKGJ1cy0+aXJxX2RvbWFpbiwgZ3Bpbyk7CisKKwkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBidXMpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc3NiX2dwaW9faXJxX2V4dGlmX2NoaXAsCisJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7CisJfQorCisJaHdpcnEgPSBzc2JfbWlwc19pcnEoYnVzLT5leHRpZi5kZXYpICsgMjsKKwllcnIgPSByZXF1ZXN0X2lycShod2lycSwgc3NiX2dwaW9faXJxX2V4dGlmX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJICAiZ3BpbyIsIGJ1cyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxX2lycTsKKworCXNzYl9leHRpZl9ncGlvX2ludG1hc2soJmJ1cy0+ZXh0aWYsIH4wLCAwKTsKKworCXJldHVybiAwOworCitlcnJfcmVxX2lycToKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhidXMtPmlycV9kb21haW4sIGdwaW8pOworCisJCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKKwl9CisJaXJxX2RvbWFpbl9yZW1vdmUoYnVzLT5pcnFfZG9tYWluKTsKK2Vycl9pcnFfZG9tYWluOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNzYl9ncGlvX2lycV9leHRpZl9kb21haW5fZXhpdChzdHJ1Y3Qgc3NiX2J1cyAqYnVzKQoreworCXN0cnVjdCBzc2JfZXh0aWYgKmV4dGlmID0gJmJ1cy0+ZXh0aWY7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9ICZidXMtPmdwaW87CisJaW50IGdwaW87CisKKwlpZiAoYnVzLT5idXN0eXBlICE9IFNTQl9CVVNUWVBFX1NTQikKKwkJcmV0dXJuOworCisJZnJlZV9pcnEoc3NiX21pcHNfaXJxKGJ1cy0+ZXh0aWYuZGV2KSArIDIsIGV4dGlmKTsKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgY2hpcC0+bmdwaW87IGdwaW8rKykgeworCQlpbnQgaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhidXMtPmlycV9kb21haW4sIGdwaW8pOworCisJCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKKwl9CisJaXJxX2RvbWFpbl9yZW1vdmUoYnVzLT5pcnFfZG9tYWluKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IHNzYl9ncGlvX2lycV9leHRpZl9kb21haW5faW5pdChzdHJ1Y3Qgc3NiX2J1cyAqYnVzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc2JfZ3Bpb19pcnFfZXh0aWZfZG9tYWluX2V4aXQoc3RydWN0IHNzYl9idXMgKmJ1cykKK3sKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IHNzYl9ncGlvX2V4dGlmX2luaXQoc3RydWN0IHNzYl9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmJ1cy0+Z3BpbzsKKwlpbnQgZXJyOwogCiAJY2hpcC0+bGFiZWwJCT0gInNzYl9leHRpZl9ncGlvIjsKIAljaGlwLT5vd25lcgkJPSBUSElTX01PRFVMRTsKQEAgLTE2NSw3ICs0MjMsOSBAQAogCWNoaXAtPnNldAkJPSBzc2JfZ3Bpb19leHRpZl9zZXRfdmFsdWU7CiAJY2hpcC0+ZGlyZWN0aW9uX2lucHV0CT0gc3NiX2dwaW9fZXh0aWZfZGlyZWN0aW9uX2lucHV0OwogCWNoaXAtPmRpcmVjdGlvbl9vdXRwdXQJPSBzc2JfZ3Bpb19leHRpZl9kaXJlY3Rpb25fb3V0cHV0OwotCWNoaXAtPnRvX2lycQkJPSBzc2JfZ3Bpb19leHRpZl90b19pcnE7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfU1NCX0VNQkVEREVEKQorCWNoaXAtPnRvX2lycQkJPSBzc2JfZ3Bpb190b19pcnE7CisjZW5kaWYKIAljaGlwLT5uZ3BpbwkJPSA1OwogCS8qIFRoZXJlIGlzIGp1c3Qgb25lIFNvQyBpbiBvbmUgZGV2aWNlIGFuZCBpdHMgR1BJTyBhZGRyZXNzZXMgc2hvdWxkIGJlCiAJICogZGV0ZXJtaW5pc3RpYyB0byBhZGRyZXNzIHRoZW0gbW9yZSBlYXNpbHkuIFRoZSBvdGhlciBidXNlcyBjb3VsZCBnZXQKQEAgLTE3NSw3ICs0MzUsMTcgQEAKIAllbHNlCiAJCWNoaXAtPmJhc2UJCT0gLTE7CiAKLQlyZXR1cm4gZ3Bpb2NoaXBfYWRkKGNoaXApOworCWVyciA9IHNzYl9ncGlvX2lycV9leHRpZl9kb21haW5faW5pdChidXMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBncGlvY2hpcF9hZGQoY2hpcCk7CisJaWYgKGVycikgeworCQlzc2JfZ3Bpb19pcnFfZXh0aWZfZG9tYWluX2V4aXQoYnVzKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogI2Vsc2UKQEAgLTE4NSw2ICs0NTUsMTAgQEAKIH0KICNlbmRpZgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogaW50IHNzYl9ncGlvX2luaXQoc3RydWN0IHNzYl9idXMgKmJ1cykKIHsKIAlpZiAoc3NiX2NoaXBjb19hdmFpbGFibGUoJmJ1cy0+Y2hpcGNvKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL21haW4uYyBiL2RyaXZlcnMvc3NiL21haW4uYwppbmRleCAzMmE4MTFkLi4yZmVhZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9tYWluLmMKKysrIGIvZHJpdmVycy9zc2IvbWFpbi5jCkBAIC01OTMsNiArNTkzLDEzIEBACiAJCXNzYl9wY2ljb3JlX2luaXQoJmJ1cy0+cGNpY29yZSk7CiAJCWlmIChidXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU1NCKQogCQkJc3NiX3dhdGNoZG9nX3JlZ2lzdGVyKGJ1cyk7CisKKwkJZXJyID0gc3NiX2dwaW9faW5pdChidXMpOworCQlpZiAoZXJyID09IC1FTk9UU1VQUCkKKwkJCXNzYl9kYmcoIkdQSU8gZHJpdmVyIG5vdCBhY3RpdmF0ZWRcbiIpOworCQllbHNlIGlmIChlcnIpCisJCQlzc2JfZGJnKCJFcnJvciByZWdpc3RlcmluZyBHUElPIGRyaXZlcjogJWlcbiIsIGVycik7CisKIAkJc3NiX2J1c19tYXlfcG93ZXJkb3duKGJ1cyk7CiAKIAkJZXJyID0gc3NiX2RldmljZXNfcmVnaXN0ZXIoYnVzKTsKQEAgLTgzMCwxMSArODM3LDYgQEAKIAlzc2JfY2hpcGNvbW1vbl9pbml0KCZidXMtPmNoaXBjbyk7CiAJc3NiX2V4dGlmX2luaXQoJmJ1cy0+ZXh0aWYpOwogCXNzYl9taXBzY29yZV9pbml0KCZidXMtPm1pcHNjb3JlKTsKLQllcnIgPSBzc2JfZ3Bpb19pbml0KGJ1cyk7Ci0JaWYgKGVyciA9PSAtRU5PVFNVUFApCi0JCXNzYl9kYmcoIkdQSU8gZHJpdmVyIG5vdCBhY3RpdmF0ZWRcbiIpOwotCWVsc2UgaWYgKGVycikKLQkJc3NiX2RiZygiRXJyb3IgcmVnaXN0ZXJpbmcgR1BJTyBkcml2ZXI6ICVpXG4iLCBlcnIpOwogCWVyciA9IHNzYl9mZXRjaF9pbnZhcmlhbnRzKGJ1cywgZ2V0X2ludmFyaWFudHMpOwogCWlmIChlcnIpIHsKIAkJc3NiX2J1c19tYXlfcG93ZXJkb3duKGJ1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IDRiYjZiMTEuLjk5Mzc1ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC01Miw2ICs1Miw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L0tjb25maWciCkBAIC03NiwxMCArNzgsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvenNtYWxsb2MvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggOWYwN2U1ZS4uZGRjM2M0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtMTgsNiArMTgsNyBAQAogb2JqLSQoQ09ORklHX1JUTDgxOTJFKQkJKz0gcnRsODE5MmUvCiBvYmotJChDT05GSUdfUjg3MTJVKQkJKz0gcnRsODcxMi8KIG9iai0kKENPTkZJR19SODE4OEVVKQkJKz0gcnRsODE4OGV1Lworb2JqLSQoQ09ORklHX1I4ODIxQUUpCQkrPSBydGw4ODIxYWUvCiBvYmotJChDT05GSUdfUlRTNTEzOSkJCSs9IHJ0czUxMzkvCiBvYmotJChDT05GSUdfUlRTNTIwOCkJCSs9IHJ0czUyMDgvCiBvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gZnJvbnRpZXIvCkBAIC0zMiw4ICszMyw2IEBACiBvYmotJChDT05GSUdfVk1FX0JVUykJCSs9IHZtZS8KIG9iai0kKENPTkZJR19EWF9TRVApICAgICAgICAgICAgKz0gc2VwLwogb2JqLSQoQ09ORklHX0lJTykJCSs9IGlpby8KLW9iai0kKENPTkZJR19aUkFNKQkJKz0genJhbS8KLW9iai0kKENPTkZJR19aU01BTExPQykJCSs9IHpzbWFsbG9jLwogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lwogb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203eHhmYi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCmluZGV4IDUzMzhlOGQuLjA3MTg5MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYwpAQCAtMTk0LDEwICsxOTQsMTAgQEAKIAlzdHJ1Y3QgY2xfb2JqZWN0ICAgICAqb2JqID0gbGxfaTJpbmZvKGlub2RlKS0+bGxpX2Nsb2I7CiAJcGdvZmZfdAkgICAgICAgb2Zmc2V0OwogCWludAkJICAgcmV0OwotCWludAkJICAgaTsKIAlpbnQJCSAgIHJ3OwogCW9iZF9jb3VudAkgICAgIHBhZ2VfY291bnQgPSAwOwotCXN0cnVjdCBiaW9fdmVjICAgICAgICpidmVjOworCXN0cnVjdCBiaW9fdmVjICAgICAgIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciAgIGl0ZXI7CiAJc3RydWN0IGJpbwkgICAqYmlvOwogCXNzaXplX3QJICAgICAgIGJ5dGVzOwogCkBAIC0yMjAsMTUgKzIyMCwxNSBAQAogCWZvciAoYmlvID0gaGVhZDsgYmlvICE9IE5VTEw7IGJpbyA9IGJpby0+YmlfbmV4dCkgewogCQlMQVNTRVJUKHJ3ID09IGJpby0+YmlfcncpOwogCi0JCW9mZnNldCA9IChwZ29mZl90KShiaW8tPmJpX3NlY3RvciA8PCA5KSArIGxvLT5sb19vZmZzZXQ7Ci0JCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewotCQkJQlVHX09OKGJ2ZWMtPmJ2X29mZnNldCAhPSAwKTsKLQkJCUJVR19PTihidmVjLT5idl9sZW4gIT0gUEFHRV9DQUNIRV9TSVpFKTsKKwkJb2Zmc2V0ID0gKHBnb2ZmX3QpKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPDwgOSkgKyBsby0+bG9fb2Zmc2V0OworCQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGl0ZXIpIHsKKwkJCUJVR19PTihidmVjLmJ2X29mZnNldCAhPSAwKTsKKwkJCUJVR19PTihidmVjLmJ2X2xlbiAhPSBQQUdFX0NBQ0hFX1NJWkUpOwogCi0JCQlwYWdlc1twYWdlX2NvdW50XSA9IGJ2ZWMtPmJ2X3BhZ2U7CisJCQlwYWdlc1twYWdlX2NvdW50XSA9IGJ2ZWMuYnZfcGFnZTsKIAkJCW9mZnNldHNbcGFnZV9jb3VudF0gPSBvZmZzZXQ7CiAJCQlwYWdlX2NvdW50Kys7Ci0JCQlvZmZzZXQgKz0gYnZlYy0+YnZfbGVuOworCQkJb2Zmc2V0ICs9IGJ2ZWMuYnZfbGVuOwogCQl9CiAJCUxBU1NFUlQocGFnZV9jb3VudCA8PSBMTE9PUF9NQVhfU0VHTUVOVFMpOwogCX0KQEAgLTMxMyw3ICszMTMsOCBAQAogCWJpbyA9ICZsby0+bG9fYmlvOwogCXdoaWxlICgqYmlvICYmICgqYmlvKS0+YmlfcncgPT0gcncpIHsKIAkJQ0RFQlVHKERfSU5GTywgImJpbyBzZWN0b3IgJWxsdSBzaXplICV1IGNvdW50ICV1IHZjbnQldSBcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgqYmlvKS0+Ymlfc2VjdG9yLCAoKmJpbyktPmJpX3NpemUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgqYmlvKS0+YmlfaXRlci5iaV9zZWN0b3IsCisJCSAgICAgICAoKmJpbyktPmJpX2l0ZXIuYmlfc2l6ZSwKIAkJICAgICAgIHBhZ2VfY291bnQsICgqYmlvKS0+YmlfdmNudCk7CiAJCWlmIChwYWdlX2NvdW50ICsgKCpiaW8pLT5iaV92Y250ID4gTExPT1BfTUFYX1NFR01FTlRTKQogCQkJYnJlYWs7CkBAIC0zNDcsNyArMzQ4LDggQEAKIAkJZ290byBlcnI7CiAKIAlDREVCVUcoRF9JTkZPLCAic3VibWl0IGJpbyBzZWN0b3IgJWxsdSBzaXplICV1XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9sZF9iaW8tPmJpX3NlY3Rvciwgb2xkX2Jpby0+Ymlfc2l6ZSk7CisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2xkX2Jpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJICAgICAgIG9sZF9iaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAKIAlzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7CiAJaW5hY3RpdmUgPSAobG8tPmxvX3N0YXRlICE9IExMT09QX0JPVU5EKTsKQEAgLTM2Nyw3ICszNjksNyBAQAogCWxvb3BfYWRkX2Jpbyhsbywgb2xkX2Jpbyk7CiAJcmV0dXJuOwogZXJyOgotCWNmc19iaW9faW9fZXJyb3Iob2xkX2Jpbywgb2xkX2Jpby0+Ymlfc2l6ZSk7CisJY2ZzX2Jpb19pb19lcnJvcihvbGRfYmlvLCBvbGRfYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogfQogCiAKQEAgLTM3OCw3ICszODAsNyBAQAogCXdoaWxlIChiaW8pIHsKIAkJc3RydWN0IGJpbyAqdG1wID0gYmlvLT5iaV9uZXh0OwogCQliaW8tPmJpX25leHQgPSBOVUxMOwotCQljZnNfYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCByZXQpOworCQljZnNfYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9pdGVyLmJpX3NpemUsIHJldCk7CiAJCWJpbyA9IHRtcDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9LY29uZmlnCmluZGV4IDQ2ZjFlNjEuLjIyYjBjOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9LY29uZmlnCkBAIC0yMSw2ICsyMSw4IEBACiAjIFBsZWFzZSBrZWVwIHRoZW0gaW4gYWxwaGFiZXRpYyBvcmRlcgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9LY29uZmlnIgpAQCAtMzEsOCArMzMsMTQgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbXNpMzEwMS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL0tjb25maWciCisKICMgS2VlcCBMSVJDIGF0IHRoZSBlbmQsIGFzIGl0IGhhcyBzdWItbWVudXMKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlCmluZGV4IGViN2YzMGIuLmJlZGM2MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBvYmotJChDT05GSUdfRFZCX0FTMTAyKQkJKz0gYXMxMDIvCitvYmotJChDT05GSUdfSTJDX0JDTTIwNDgpCSs9IGJjbTIwNDgvCiBvYmotJChDT05GSUdfRFZCX0NYRDIwOTkpCSs9IGN4ZDIwOTkvCiBvYmotJChDT05GSUdfTElSQ19TVEFHSU5HKQkrPSBsaXJjLwogb2JqLSQoQ09ORklHX1NPTE82WDEwKQkJKz0gc29sbzZ4MTAvCkBAIC02LDMgKzcsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwNykJKz0gZ283MDA3Lwogb2JqLSQoQ09ORklHX1VTQl9NU0kzMTAxKQkrPSBtc2kzMTAxLwogb2JqLSQoQ09ORklHX1ZJREVPX0RNMzY1X1ZQRkUpCSs9IGRhdmluY2lfdnBmZS8KK29iai0kKENPTkZJR19WSURFT19PTUFQNCkJKz0gb21hcDRpc3MvCitvYmotJChDT05GSUdfVVNCX1NOOUMxMDIpICAgICAgICs9IHNuOWMxMDIvCitvYmotJChDT05GSUdfVklERU9fT01BUDIpICAgICAgICs9IG9tYXAyNHh4Lworb2JqLSQoQ09ORklHX1ZJREVPX1RDTTgyNVgpICAgICArPSBvbWFwMjR4eC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9kcnYuYwppbmRleCA4YjdiYjk1Li4wOWQ2NGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5jCkBAIC0xMTEsOCArMTExLDYgQEAKIAlzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAgPSAmZGV2LT5idXNfYWRhcDsKIAlpbnQgcmV0ID0gLUVGQVVMVDsKIAotCUVOVEVSKCk7Ci0KIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1c19hZGFwLmxvY2spKSB7CiAJCWRwcmludGsoZGVidWcsICJtdXRleF9sb2NrX2ludGVycnVwdGlibGUobG9jaykgZmFpbGVkICFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTMzLDE1ICsxMzEsMTQgQEAKIAkJZmlsdGVyLnBpZCA9IHBpZDsKIAogCQlyZXQgPSBhczEweF9jbWRfYWRkX1BJRF9maWx0ZXIoYnVzX2FkYXAsICZmaWx0ZXIpOwotCQlkcHJpbnRrKGRlYnVnLCAiQUREX1BJRF9GSUxURVIoWyUwMmQgLT4gJTAyZF0sIDB4JTA0eCkgcmV0ID0gJWRcbiIsCisJCWRwcmludGsoZGVidWcsCisJCQkiQUREX1BJRF9GSUxURVIoWyUwMmQgLT4gJTAyZF0sIDB4JTA0eCkgcmV0ID0gJWRcbiIsCiAJCQlpbmRleCwgZmlsdGVyLmlkeCwgZmlsdGVyLnBpZCwgcmV0KTsKIAkJYnJlYWs7CiAJfQogCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5idXNfYWRhcC5sb2NrKTsKLQotCUxFQVZFKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTUxLDggKzE0OCw2IEBACiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmFzMTAyX2RldiA9IGRlbXV4LT5wcml2OwogCi0JRU5URVIoKTsKLQogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFzMTAyX2Rldi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIApAQCAtMTY0LDcgKzE1OSw2IEBACiAJCXJldCA9IGFzMTAyX3N0YXJ0X3N0cmVhbShhczEwMl9kZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZhczEwMl9kZXYtPnNlbSk7Ci0JTEVBVkUoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzMsOCArMTY3LDYgQEAKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2ID0gZGVtdXgtPnByaXY7CiAKLQlFTlRFUigpOwotCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYXMxMDJfZGV2LT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCkBAIC0xODYsNyArMTc4LDYgQEAKIAkJCQkgZHZiZG14ZmVlZC0+cGlkLCAwKTsKIAogCW11dGV4X3VubG9jaygmYXMxMDJfZGV2LT5zZW0pOwotCUxFQVZFKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9kcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9kcnYuaAppbmRleCBiMGU1YTIzLi5hMDY4MzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5oCkBAIC0zOCwxNCArMzgsNiBAQAogCQlwcmludGsoYXJncyk7CVwKIAl9IH0gd2hpbGUgKDApCiAKLSNpZmRlZiBUUkFDRQotI2RlZmluZSBFTlRFUigpCXByX2RlYnVnKCI+PiBlbnRlciAlc1xuIiwgX19mdW5jX18pCi0jZGVmaW5lIExFQVZFKCkJcHJfZGVidWcoIjw8IGxlYXZlICVzXG4iLCBfX2Z1bmNfXykKLSNlbHNlCi0jZGVmaW5lIEVOVEVSKCkKLSNkZWZpbmUgTEVBVkUoKQotI2VuZGlmCi0KICNkZWZpbmUgQVMxMDJfREVWSUNFX01BSk9SCTE5MgogCiAjZGVmaW5lIEFTMTAyX1VTQl9CVUZfU0laRQk1MTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2ZlLmMKaW5kZXggOWNlOGM5ZC4uYjY4NmI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2ZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2ZlLmMKQEAgLTM0LDggKzM0LDYgQEAKIAlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKIAlzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzIHR1bmVfYXJncyA9IHsgMCB9OwogCi0JRU5URVIoKTsKLQogCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTUyLDcgKzUwLDYgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5idXNfYWRhcC5sb2NrKTsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIChyZXQgPCAwKSA/IC1FSU5WQUwgOiAwOwogfQogCkBAIC02Myw4ICs2MCw2IEBACiAJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CiAJc3RydWN0IGFzMTB4X3RwcyB0cHMgPSB7IDAgfTsKIAotCUVOVEVSKCk7Ci0KIAlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OwogCWlmIChkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04MCwxMyArNzUsMTEgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5idXNfYWRhcC5sb2NrKTsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIChyZXQgPCAwKSA/IC1FSU5WQUwgOiAwOwogfQogCiBzdGF0aWMgaW50IGFzMTAyX2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICpzZXR0aW5ncykgewotCUVOVEVSKCk7CiAKICNpZiAwCiAJZHByaW50ayhkZWJ1ZywgInN0ZXBfc2l6ZSAgICA9ICVkXG4iLCBzZXR0aW5ncy0+c3RlcF9zaXplKTsKQEAgLTk3LDcgKzkwLDYgQEAKIAogCXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSAxMDAwOwogCi0JTEVBVkUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA4LDggKzEwMCw2IEBACiAJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CiAJc3RydWN0IGFzMTB4X3R1bmVfc3RhdHVzIHRzdGF0ZSA9IHsgMCB9OwogCi0JRU5URVIoKTsKLQogCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE1MSw4ICsxNDEsOCBAQAogCQlpZiAoYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cygmZGV2LT5idXNfYWRhcCwKIAkJCShzdHJ1Y3QgYXMxMHhfZGVtb2Rfc3RhdHMgKikgJmRldi0+ZGVtb2Rfc3RhdHMpIDwgMCkgewogCQkJbWVtc2V0KCZkZXYtPmRlbW9kX3N0YXRzLCAwLCBzaXplb2YoZGV2LT5kZW1vZF9zdGF0cykpOwotCQkJZHByaW50ayhkZWJ1ZywgImFzMTB4X2NtZF9nZXRfZGVtb2Rfc3RhdHMgZmFpbGVkICIKLQkJCQkiKHByb2JhYmx5IG5vdCB0dW5lZClcbiIpOworCQkJZHByaW50ayhkZWJ1ZywKKwkJCQkiYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyBmYWlsZWQgKHByb2JhYmx5IG5vdCB0dW5lZClcbiIpOwogCQl9IGVsc2UgewogCQkJZHByaW50ayhkZWJ1ZywKIAkJCQkiZGVtb2Qgc3RhdHVzOiBmYzogMHglMDh4LCBiYWQgZmM6IDB4JTA4eCwgIgpAQCAtMTY4LDcgKzE1OCw2IEBACiAKIG91dDoKIAltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7Ci0JTEVBVkUoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xODMsMTUgKzE3MiwxMiBAQAogewogCXN0cnVjdCBhczEwMl9kZXZfdCAqZGV2OwogCi0JRU5URVIoKTsKLQogCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCSpzbnIgPSBkZXYtPmRlbW9kX3N0YXRzLm1lcjsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OSwxNSArMTg1LDEyIEBACiB7CiAJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CiAKLQlFTlRFUigpOwotCiAJZGV2ID0gKHN0cnVjdCBhczEwMl9kZXZfdCAqKSBmZS0+dHVuZXJfcHJpdjsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJKmJlciA9IGRldi0+YmVyOwogCi0JTEVBVkUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE2LDE1ICsxOTksMTIgQEAKIHsKIAlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKIAotCUVOVEVSKCk7Ci0KIAlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OwogCWlmIChkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkqc3RyZW5ndGggPSAoKCgweGZmZmYgKiA0MDApICogZGV2LT5zaWduYWxfc3RyZW5ndGggKyA0MTAwMCkgKiAyKTsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMiw4ICsyMTIsNiBAQAogewogCXN0cnVjdCBhczEwMl9kZXZfdCAqZGV2OwogCi0JRU5URVIoKTsKLQogCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI0Myw3ICsyMjEsNiBAQAogCWVsc2UKIAkJKnVjYmxvY2tzID0gMDsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Miw4ICsyMjksNiBAQAogCXN0cnVjdCBhczEwMl9kZXZfdCAqZGV2OwogCWludCByZXQ7CiAKLQlFTlRFUigpOwotCiAJZGV2ID0gKHN0cnVjdCBhczEwMl9kZXZfdCAqKSBmZS0+dHVuZXJfcHJpdjsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjYzLDcgKzIzOCw4IEBACiAKIAlpZiAoYWNxdWlyZSkgewogCQlpZiAoZWxuYV9lbmFibGUpCi0JCQlhczEweF9jbWRfc2V0X2NvbnRleHQoJmRldi0+YnVzX2FkYXAsIENPTlRFWFRfTE5BLCBkZXYtPmVsbmFfY2ZnKTsKKwkJCWFzMTB4X2NtZF9zZXRfY29udGV4dCgmZGV2LT5idXNfYWRhcCwKKwkJCQkJICAgICAgQ09OVEVYVF9MTkEsIGRldi0+ZWxuYV9jZmcpOwogCiAJCXJldCA9IGFzMTB4X2NtZF90dXJuX29uKCZkZXYtPmJ1c19hZGFwKTsKIAl9IGVsc2UgewpAQCAtMjcyLDcgKzI0OCw2IEBACiAKIAltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CiAKLQlMRUFWRSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4MSw4ICs1NTYsOCBAQAogCQkJICAgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShwYXJhbXMtPmNvZGVfcmF0ZV9MUCk7CiAJCX0KIAotCQlkcHJpbnRrKGRlYnVnLCAiXHRoaWVyYXJjaHk6IDB4JTAyeCAgIgotCQkJCSJzZWxlY3RlZDogJXMgIGNvZGVfcmF0ZV8lczogMHglMDJ4XG4iLAorCQlkcHJpbnRrKGRlYnVnLAorCQkJIlx0aGllcmFyY2h5OiAweCUwMnggIHNlbGVjdGVkOiAlcyAgY29kZV9yYXRlXyVzOiAweCUwMnhcbiIsCiAJCQl0dW5lX2FyZ3MtPmhpZXJhcmNoeSwKIAkJCXR1bmVfYXJncy0+aGllcl9zZWxlY3QgPT0gSElFUl9ISUdIX1BSSU9SSVRZID8KIAkJCSJIUCIgOiAiTFAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Z3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYwppbmRleCBiOTY3MGVlLi5mMzNmNzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYwpAQCAtMjYsMTAgKzI2LDEwIEBACiAjaW5jbHVkZSAiYXMxMDJfZHJ2LmgiCiAjaW5jbHVkZSAiYXMxMDJfZncuaCIKIAotY2hhciBhczEwMl9zdF9mdzFbXSA9ICJhczEwMl9kYXRhMV9zdC5oZXgiOwotY2hhciBhczEwMl9zdF9mdzJbXSA9ICJhczEwMl9kYXRhMl9zdC5oZXgiOwotY2hhciBhczEwMl9kdF9mdzFbXSA9ICJhczEwMl9kYXRhMV9kdC5oZXgiOwotY2hhciBhczEwMl9kdF9mdzJbXSA9ICJhczEwMl9kYXRhMl9kdC5oZXgiOworc3RhdGljIGNvbnN0IGNoYXIgYXMxMDJfc3RfZncxW10gPSAiYXMxMDJfZGF0YTFfc3QuaGV4IjsKK3N0YXRpYyBjb25zdCBjaGFyIGFzMTAyX3N0X2Z3MltdID0gImFzMTAyX2RhdGEyX3N0LmhleCI7CitzdGF0aWMgY29uc3QgY2hhciBhczEwMl9kdF9mdzFbXSA9ICJhczEwMl9kYXRhMV9kdC5oZXgiOworc3RhdGljIGNvbnN0IGNoYXIgYXMxMDJfZHRfZncyW10gPSAiYXMxMDJfZGF0YTJfZHQuaGV4IjsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRvaHgodW5zaWduZWQgY2hhciAqZHN0LCBjaGFyICpzcmMpCiB7CkBAIC0xMDksOCArMTA5LDYgQEAKIAlpbnQgdG90YWxfcmVhZF9ieXRlcyA9IDAsIGVycm5vID0gMDsKIAl1bnNpZ25lZCBjaGFyIGFkZHJfaGFzX2NoYW5nZWQgPSAwOwogCi0JRU5URVIoKTsKLQogCWZvciAodG90YWxfcmVhZF9ieXRlcyA9IDA7IHRvdGFsX3JlYWRfYnl0ZXMgPCBmaXJtd2FyZS0+c2l6ZTsgKSB7CiAJCWludCByZWFkX2J5dGVzID0gMCwgZGF0YV9sZW4gPSAwOwogCkBAIC0xNTgsNyArMTU2LDYgQEAKIAkJfQogCX0KIGVycm9yOgotCUxFQVZFKCk7CiAJcmV0dXJuIChlcnJubyA9PSAwKSA/IHRvdGFsX3JlYWRfYnl0ZXMgOiBlcnJubzsKIH0KIApAQCAtMTY3LDExICsxNjQsOSBAQAogCWludCBlcnJubyA9IC1FRkFVTFQ7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSA9IE5VTEw7CiAJdW5zaWduZWQgY2hhciAqY21kX2J1ZiA9IE5VTEw7Ci0JY2hhciAqZncxLCAqZncyOworCWNvbnN0IGNoYXIgKmZ3MSwgKmZ3MjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gYnVzX2FkYXAtPnVzYl9kZXY7CiAKLQlFTlRFUigpOwotCiAJLyogc2VsZWN0IGZ3IGZpbGUgdG8gdXBsb2FkICovCiAJaWYgKGR1YWxfdHVuZXIpIHsKIAkJZncxID0gYXMxMDJfZHRfZncxOwpAQCAtMjMzLDYgKzIyOCw1IEBACiAJa2ZyZWUoY21kX2J1Zik7CiAJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CiAKLQlMRUFWRSgpOwogCXJldHVybiBlcnJubzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfdXNiX2Rydi5jCmluZGV4IDlmMjc1ZjAuLmU0YTY5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX3VzYl9kcnYuYwpAQCAtOTIsNyArOTIsNiBAQAogCQkJICAgICAgdW5zaWduZWQgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pCiB7CiAJaW50IHJldCA9IDA7Ci0JRU5URVIoKTsKIAogCWlmIChzZW5kX2J1ZiAhPSBOVUxMKSB7CiAJCXJldCA9IHVzYl9jb250cm9sX21zZyhidXNfYWRhcC0+dXNiX2RldiwKQEAgLTE0MCw3ICsxMzksNiBAQAogI2VuZGlmCiAJfQogCi0JTEVBVkUoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xOTEsNyArMTg5LDcgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsX2xlbjsKIH0KIAotc3RydWN0IGFzMTAyX3ByaXZfb3BzX3QgYXMxMDJfcHJpdl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGFzMTAyX3ByaXZfb3BzX3QgYXMxMDJfcHJpdl9vcHMgPSB7CiAJLnVwbG9hZF9md19wa3QJPSBhczEwMl9zZW5kX2VwMSwKIAkueGZlcl9jbWQJPSBhczEwMl91c2JfeGZlcl9jbWQsCiAJLmFzMTAyX3JlYWRfZXAyCT0gYXMxMDJfcmVhZF9lcDIsCkBAIC0yNDAsOCArMjM4LDYgQEAKIHsKIAlpbnQgaTsKIAotCUVOVEVSKCk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9VUkI7IGkrKykKIAkJdXNiX2ZyZWVfdXJiKGRldi0+c3RyZWFtX3VyYltpXSk7CiAKQEAgLTI0OSwxNSArMjQ1LDEyIEBACiAJCQlNQVhfU1RSRUFNX1VSQiAqIEFTMTAyX1VTQl9CVUZfU0laRSwKIAkJCWRldi0+c3RyZWFtLAogCQkJZGV2LT5kbWFfYWRkcik7Ci0JTEVBVkUoKTsKIH0KIAogc3RhdGljIGludCBhczEwMl9hbGxvY191c2Jfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCUVOVEVSKCk7Ci0KIAlkZXYtPnN0cmVhbSA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPmJ1c19hZGFwLnVzYl9kZXYsCiAJCQkJICAgICAgIE1BWF9TVFJFQU1fVVJCICogQVMxMDJfVVNCX0JVRl9TSVpFLAogCQkJCSAgICAgICBHRlBfS0VSTkVMLApAQCAtMjg3LDcgKzI4MCw2IEBACiAKIAkJZGV2LT5zdHJlYW1fdXJiW2ldID0gdXJiOwogCX0KLQlMRUFWRSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMxOCwyMyArMzEwLDE3IEBACiB7CiAJc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXY7CiAKLQlFTlRFUigpOwotCiAJYXMxMDJfZGV2ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBhczEwMl9kZXZfdCwga3JlZik7CiAJaWYgKGFzMTAyX2RldiAhPSBOVUxMKSB7CiAJCXVzYl9wdXRfZGV2KGFzMTAyX2Rldi0+YnVzX2FkYXAudXNiX2Rldik7CiAJCWtmcmVlKGFzMTAyX2Rldik7CiAJfQotCi0JTEVBVkUoKTsKIH0KIAogc3RhdGljIHZvaWQgYXMxMDJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXY7CiAKLQlFTlRFUigpOwotCiAJLyogZXh0cmFjdCBhczEwMl9kZXZfdCBmcm9tIHVzYl9kZXZpY2UgcHJpdmF0ZSBkYXRhICovCiAJYXMxMDJfZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIApAQCAtMzUzLDggKzMzOSw2IEBACiAJa3JlZl9wdXQoJmFzMTAyX2Rldi0+a3JlZiwgYXMxMDJfdXNiX3JlbGVhc2UpOwogCiAJcHJfaW5mbygiJXM6IGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcbiIsIERSSVZFUl9OQU1FKTsKLQotCUxFQVZFKCk7CiB9CiAKIHN0YXRpYyBpbnQgYXMxMDJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApAQCAtMzY0LDggKzM0OCw2IEBACiAJc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXY7CiAJaW50IGk7CiAKLQlFTlRFUigpOwotCiAJLyogVGhpcyBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuICovCiAJaWYgKEFSUkFZX1NJWkUoYXMxMDJfdXNiX2lkX3RhYmxlKSAhPQogCSAgICAoc2l6ZW9mKGFzMTAyX2RldmljZV9uYW1lcykgLyBzaXplb2YoY29uc3QgY2hhciAqKSkpIHsKQEAgLTQxOSwxNSArNDAxLDIxIEBACiAJLyogcmVxdWVzdCBidWZmZXIgYWxsb2NhdGlvbiBmb3Igc3RyZWFtaW5nICovCiAJcmV0ID0gYXMxMDJfYWxsb2NfdXNiX3N0cmVhbV9idWZmZXIoYXMxMDJfZGV2KTsKIAlpZiAocmV0ICE9IDApCi0JCWdvdG8gZmFpbGVkOworCQlnb3RvIGZhaWxlZF9zdHJlYW07CiAKIAkvKiByZWdpc3RlciBkdmIgbGF5ZXIgKi8KIAlyZXQgPSBhczEwMl9kdmJfcmVnaXN0ZXIoYXMxMDJfZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZmFpbGVkX2R2YjsKIAotCUxFQVZFKCk7CiAJcmV0dXJuIHJldDsKIAorZmFpbGVkX2R2YjoKKwlhczEwMl9mcmVlX3VzYl9zdHJlYW1fYnVmZmVyKGFzMTAyX2Rldik7CitmYWlsZWRfc3RyZWFtOgorCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmYXMxMDJfdXNiX2NsYXNzX2RyaXZlcik7CiBmYWlsZWQ6CisJdXNiX3B1dF9kZXYoYXMxMDJfZGV2LT5idXNfYWRhcC51c2JfZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCWtmcmVlKGFzMTAyX2Rldik7CiAJcmV0dXJuIHJldDsKQEAgLTQzOSw4ICs0MjcsNiBAQAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gTlVMTDsKIAlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldiA9IE5VTEw7CiAKLQlFTlRFUigpOwotCiAJLyogcmVhZCBtaW5vciBmcm9tIGlub2RlICovCiAJbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCkBAIC00NjcsNyArNDUzLDYgQEAKIAlrcmVmX2dldCgmZGV2LT5rcmVmKTsKIAogZXhpdDoKLQlMRUFWRSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ3NiwxNSArNDYxLDEyIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGFzMTAyX2Rldl90ICpkZXYgPSBOVUxMOwogCi0JRU5URVIoKTsKLQogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoZGV2ICE9IE5VTEwpIHsKIAkJLyogZGVjcmVtZW50IHRoZSBjb3VudCBvbiBvdXIgZGV2aWNlICovCiAJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIGFzMTAyX3VzYl9yZWxlYXNlKTsKIAl9CiAKLQlMRUFWRSgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYwppbmRleCBhNzNkZjEwLi45ZTQ5ZjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZC5jCkBAIC0zNCw4ICszNCw2IEBACiAJaW50IGVycm9yID0gQVMxMFhfQ01EX0VSUk9SOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC02Myw3ICs2MSw2IEBACiAJZXJyb3IgPSBhczEweF9yc3BfcGFyc2UocHJzcCwgQ09OVFJPTF9QUk9DX1RVUk5PTl9SU1ApOwogCiBvdXQ6Ci0JTEVBVkUoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTc4LDggKzc1LDYgQEAKIAlpbnQgZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CiAJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKIAotCUVOVEVSKCk7Ci0KIAlwY21kID0gYWRhcC0+Y21kOwogCXByc3AgPSBhZGFwLT5yc3A7CiAKQEAgLTEwNiw3ICsxMDEsNiBAQAogCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19UVVJOT0ZGX1JTUCk7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTIzLDggKzExNyw2IEBACiAJaW50IGVycm9yID0gQVMxMFhfQ01EX0VSUk9SOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcHJlcSwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcHJlcSA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0xNjQsNyArMTU2LDYgQEAKIAllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfU0VUVFVORV9SU1ApOwogCiBvdXQ6Ci0JTEVBVkUoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE4MSw4ICsxNzIsNiBAQAogCWludCBlcnJvciA9IEFTMTBYX0NNRF9FUlJPUjsKIAlzdHJ1Y3QgYXMxMHhfY21kX3QgICpwcmVxLCAqcHJzcDsKIAotCUVOVEVSKCk7Ci0KIAlwcmVxID0gYWRhcC0+Y21kOwogCXByc3AgPSBhZGFwLT5yc3A7CiAKQEAgLTIyMCw3ICsyMDksNiBAQAogCXBzdGF0dXMtPkJFUiA9IGxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJzcC5zdHMuQkVSKTsKIAogb3V0OgotCUxFQVZFKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yMzYsOCArMjI0LDYgQEAKIAlpbnQgZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CiAJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKIAotCUVOVEVSKCk7Ci0KIAlwY21kID0gYWRhcC0+Y21kOwogCXByc3AgPSBhZGFwLT5yc3A7CiAKQEAgLTI4MSw3ICsyNjcsNiBAQAogCXB0cHMtPmNlbGxfSUQgPSBsZTE2X3RvX2NwdShwcnNwLT5ib2R5LmdldF90cHMucnNwLnRwcy5jZWxsX0lEKTsKIAogb3V0OgotCUxFQVZFKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yOTgsOCArMjgzLDYgQEAKIAlpbnQgZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CiAJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKIAotCUVOVEVSKCk7Ci0KIAlwY21kID0gYWRhcC0+Y21kOwogCXByc3AgPSBhZGFwLT5yc3A7CiAKQEAgLTM0Myw3ICszMjYsNiBAQAogCQlwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3Auc3RhdHMuaGFzX3N0YXJ0ZWQ7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzYxLDggKzM0Myw2IEBACiAJaW50IGVycm9yID0gQVMxMFhfQ01EX0VSUk9SOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0zOTcsNyArMzc3LDYgQEAKIAkqaXNfcmVhZHkgPSBwcnNwLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yc3AuaXNfcmVhZHk7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfY2ZnLmMKaW5kZXggNGEyYmJkNy4uYjFlMzAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kX2NmZy5jCkBAIC00MCw4ICs0MCw2IEBACiAJaW50ICBlcnJvcjsKIAlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOwogCi0JRU5URVIoKTsKLQogCXBjbWQgPSBhZGFwLT5jbWQ7CiAJcHJzcCA9IGFkYXAtPnJzcDsKIApAQCAtODEsNyArNzksNiBAQAogCX0KIAogb3V0OgotCUxFQVZFKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC05OSw4ICs5Niw2IEBACiAJaW50IGVycm9yOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0xMzYsNyArMTMxLDYgQEAKIAllcnJvciA9IGFzMTB4X2NvbnRleHRfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19DT05URVhUX1JTUCk7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTU2LDggKzE1MCw2IEBACiAJaW50IGVycm9yOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0xODgsNyArMTgwLDYgQEAKIAllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfRUxOQV9DSEFOR0VfTU9ERV9SU1ApOwogCiBvdXQ6Ci0JTEVBVkUoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kX3N0cmVhbS5jCmluZGV4IDZkMDAwZjYuLjEwODhjYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9zdHJlYW0uYwpAQCAtMzQsOCArMzQsNiBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOwogCi0JRU5URVIoKTsKLQogCXBjbWQgPSBhZGFwLT5jbWQ7CiAJcHJzcCA9IGFkYXAtPnJzcDsKIApAQCAtNzcsNyArNzUsNiBAQAogCX0KIAogb3V0OgotCUxFQVZFKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC05NCw4ICs5MSw2IEBACiAJaW50IGVycm9yOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0xMjYsNyArMTIxLDYgQEAKIAllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfUkVNT1ZFRklMVEVSX1JTUCk7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTQxLDggKzEzNSw2IEBACiAJaW50IGVycm9yOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0xNzIsNyArMTY0LDYgQEAKIAllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HX1JTUCk7CiAKIG91dDoKLQlMRUFWRSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTg3LDggKzE3OCw2IEBACiAJaW50OF90IGVycm9yOwogCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CiAKLQlFTlRFUigpOwotCiAJcGNtZCA9IGFkYXAtPmNtZDsKIAlwcnNwID0gYWRhcC0+cnNwOwogCkBAIC0yMTgsNiArMjA3LDUgQEAKIAllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfU1RPUF9TVFJFQU1JTkdfUlNQKTsKIAogb3V0OgotCUxFQVZFKCk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmYzZlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L0tjb25maWcKQEAgLTAsMCArMSwxMyBAQAorIworIyBNdWx0aW1lZGlhIFZpZGVvIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBJMkNfQkNNMjA0OAorCXRyaXN0YXRlICJCcm9hZGNvbSBCQ00yMDQ4IEZNIFJhZGlvIFJlY2VpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBSQURJT19BREFQVEVSUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCB0byBCQ00yMDQ4IEZNIFJhZGlvIFJlY2VpdmVyLgorCSAgVGhpcyBkZXZpY2UgZHJpdmVyIHN1cHBvcnRzIG9ubHkgaTJjIGJ1cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmFkaW8tYmNtMjA0OC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNTY2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19JMkNfQkNNMjA0OCkgKz0gcmFkaW8tYmNtMjA0OC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFmODVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvVE9ETwpAQCAtMCwwICsxLDI0IEBACitUT0RPOgorCitGcm9tIHRoZSBpbml0aWFsIGNvZGUgcmV2aWV3OgorCitUaGUgbWFpbiB0aGluZyB5b3UgbmVlZCB0byBkbyBpcyB0byBpbXBsZW1lbnQgYWxsIHRoZSBjb250cm9scyB1c2luZyB0aGUKK2NvbnRyb2wgZnJhbWV3b3JrIChzZWUgRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dCkuCitNb3N0IGRyaXZlcnMgYXJlIGJ5IG5vdyBjb252ZXJ0ZWQgdG8gdGhlIGNvbnRyb2wgZnJhbWV3b3JrLCBzbyB5b3Ugd2lsbAorZmluZCBtYW55IGV4YW1wbGVzIG9mIGhvdyB0byBkbyB0aGlzIGluIGRyaXZlcnMvbWVkaWEvcmFkaW8uCisKK1RoZSBzeXNmcyBzdHVmZiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY29udHJvbHMgYXMgd2VsbC4gQSBsb3Qgb2YgdGhlIFJEUworc3VwcG9ydCBpcyBub3cgYXZhaWxhYmxlIGFzIGNvbnRyb2xzIChhbHRob3VnaCB0aGVyZSBtYXkgd2VsbCBiZSBzb21lCittaXNzaW5nIGZlYXR1cmVzLCBidXQgdGhhdCBpcyBlYXN5IGVub3VnaCB0byBhZGQpLiBTaW5jZSB0aGUgUkRTIGRhdGEgaXMKK2FjdHVhbGx5IHJlYWQoKSBmcm9tIHRoZSBkZXZpY2UgSSBhbSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBSRFMKK3Byb3BlcnRpZXMvY29udHJvbHMgc2hvdWxkIGJlIHRoZXJlIGF0IGFsbC4KKworQ29ycmVjdCBDb2RpbmcgU3R5bGUsIGFzIHRoaXMgZHJpdmVyIGFsc28gdmlvbGF0ZXMgc2V2ZXJhbCBTdHlsZQorcnVsZXMsIGFuZCBkbyBldmlsIHRyaWNrcywgbGlrZSByZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9uIGluc2lkZSBhCittYWNyby4KKworRmluYWxseSB0aGlzIGRyaXZlciBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgdXAgaW50byB0d28gcGFydHM6IG9uZQordjRsMl9zdWJkZXYtYmFzZWQgY29yZSBkcml2ZXIgYW5kIG9uZSBwbGF0Zm9ybSBkcml2ZXIuIFNlZSBlLmcuCityYWRpby1zaTQ3MTMvc2k0NzEzLWkyYy5jIGFzIGEgZ29vZCBleGFtcGxlLiBCdXQgSSB3b3VsZCB3YWl0IHdpdGggdGhhdAordW50aWwgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciBpcyBjbGVhbmVkIHVwLiBUaGVuIEkgaGF2ZSBhIGJldHRlciBpZGVhIG9mCit3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5IG9yIG5vdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNkM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCkBAIC0wLDAgKzEsMjc0NCBAQAorLyoKKyAqIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9yYWRpby1iY20yMDQ4LmMKKyAqCisgKiBEcml2ZXIgZm9yIEkyQyBCcm9hZGNvbSBCQ00yMDQ4IEZNIFJhZGlvIFJlY2VpdmVyOgorICoKKyAqIENvcHlyaWdodCAoQykgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvbnRhY3Q6IEVlcm8gTnVya2thbGEgPGV4dC1lZXJvLm51cmtrYWxhQG5va2lhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIE5pbHMgRmFlcmJlciA8bmlscy5mYWVyYmVyQGtlcm5lbGNvbmNlcHRzLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqCQlFZXJvIE51cmtrYWxhIDxleHQtZWVyby5udXJra2FsYUBub2tpYS5jb20+CisgKgkJVmVyc2lvbiAwLjAuMQorICoJCS0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogMjAxMC0wMi0yMQlOaWxzIEZhZXJiZXIgPG5pbHMuZmFlcmJlckBrZXJuZWxjb25jZXB0cy5kZT4KKyAqCQlWZXJzaW9uIDAuMC4yCisgKgkJLSBBZGQgc3VwcG9ydCBmb3IgaW50ZXJydXB0IGRyaXZlbiByZHMgZGF0YSByZWFkaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlICJyYWRpby1iY20yMDQ4LmgiCisKKy8qIGRyaXZlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBCQ00yMDQ4X0RSSVZFUl9BVVRIT1IJIkVlcm8gTnVya2thbGEgPGV4dC1lZXJvLm51cmtrYWxhQG5va2lhLmNvbT4iCisjZGVmaW5lIEJDTTIwNDhfRFJJVkVSX05BTUUJQkNNMjA0OF9OQU1FCisjZGVmaW5lIEJDTTIwNDhfRFJJVkVSX1ZFUlNJT04JS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgQkNNMjA0OF9EUklWRVJfQ0FSRAkiQnJvYWRjb20gYmNtMjA0OCBGTSBSYWRpbyBSZWNlaXZlciIKKyNkZWZpbmUgQkNNMjA0OF9EUklWRVJfREVTQwkiSTJDIGRyaXZlciBmb3IgQkNNMjA0OCBGTSBSYWRpbyBSZWNlaXZlciIKKworLyogSTJDIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0JMHgwMAorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9DVFJMCQkweDAxCisjZGVmaW5lIEJDTTIwNDhfSTJDX1JEU19DVFJMMAkJMHgwMgorI2RlZmluZSBCQ00yMDQ4X0kyQ19SRFNfQ1RSTDEJCTB4MDMKKyNkZWZpbmUgQkNNMjA0OF9JMkNfRk1fQVVESU9fUEFVU0UJMHgwNAorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9BVURJT19DVFJMMAkweDA1CisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwxCTB4MDYKKyNkZWZpbmUgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX0NUUkwwCTB4MDcKKyNkZWZpbmUgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX0NUUkwxCTB4MDgKKyNkZWZpbmUgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX1RVTkVfTU9ERQkweDA5CisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0ZSRVEwCQkweDBhCisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0ZSRVExCQkweDBiCisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0FGX0ZSRVEwCQkweDBjCisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0FGX0ZSRVExCQkweDBkCisjZGVmaW5lIEJDTTIwNDhfSTJDX0ZNX0NBUlJJRVIJCTB4MGUKKyNkZWZpbmUgQkNNMjA0OF9JMkNfRk1fUlNTSQkJMHgwZgorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzAJMHgxMAorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEJMHgxMQorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9SRFNfRkxBRzAJMHgxMgorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9SRFNfRkxBRzEJMHgxMworI2RlZmluZSBCQ00yMDQ4X0kyQ19SRFNfV0xJTkUJCTB4MTQKKyNkZWZpbmUgQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFUQ0gwCTB4MTYKKyNkZWZpbmUgQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFUQ0gxCTB4MTcKKyNkZWZpbmUgQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFTSzAJMHgxOAorI2RlZmluZSBCQ00yMDQ4X0kyQ19SRFNfQkxLQl9NQVNLMQkweDE5CisjZGVmaW5lIEJDTTIwNDhfSTJDX1JEU19QSV9NQVRDSDAJMHgxYQorI2RlZmluZSBCQ00yMDQ4X0kyQ19SRFNfUElfTUFUQ0gxCTB4MWIKKyNkZWZpbmUgQkNNMjA0OF9JMkNfUkRTX1BJX01BU0swCTB4MWMKKyNkZWZpbmUgQkNNMjA0OF9JMkNfUkRTX1BJX01BU0sxCTB4MWQKKyNkZWZpbmUgQkNNMjA0OF9JMkNfU1BBUkUxCQkweDIwCisjZGVmaW5lIEJDTTIwNDhfSTJDX1NQQVJFMgkJMHgyMQorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9SRFNfUkVWCQkweDI4CisjZGVmaW5lIEJDTTIwNDhfSTJDX1NMQVZFX0NPTkZJR1VSQVRJT04JMHgyOQorI2RlZmluZSBCQ00yMDQ4X0kyQ19SRFNfREFUQQkJMHg4MAorI2RlZmluZSBCQ00yMDQ4X0kyQ19GTV9CRVNUX1RVTkVfTU9ERQkweDkwCisKKy8qIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0gKi8KKyNkZWZpbmUgQkNNMjA0OF9GTV9PTgkJCTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9SRFNfT04JCQkweDAyCisKKy8qIEJDTTIwNDhfSTJDX0ZNX0NUUkwgKi8KKyNkZWZpbmUgQkNNMjA0OF9CQU5EX1NFTEVDVAkJCTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9TVEVSRU9fTU9OT19BVVRPX1NFTEVDVAkJMHgwMgorI2RlZmluZSBCQ00yMDQ4X1NURVJFT19NT05PX01BTlVBTF9TRUxFQ1QJMHgwNAorI2RlZmluZSBCQ00yMDQ4X1NURVJFT19NT05PX0JMRU5EX1NXSVRDSAkweDA4CisjZGVmaW5lIEJDTTIwNDhfSElfTE9fSU5KRUNUSU9OCQkJMHgxMAorCisvKiBCQ00yMDQ4X0kyQ19SRFNfQ1RSTDAgKi8KKyNkZWZpbmUgQkNNMjA0OF9SQkRTX1JEU19TRUxFQ1QJCTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9GTFVTSF9GSUZPCQkweDAyCisKKy8qIEJDTTIwNDhfSTJDX0ZNX0FVRElPX1BBVVNFICovCisjZGVmaW5lIEJDTTIwNDhfQVVESU9fUEFVU0VfUlNTSV9UUkVTSAkweDBmCisjZGVmaW5lIEJDTTIwNDhfQVVESU9fUEFVU0VfRFVSQVRJT04JMHhmMAorCisvKiBCQ00yMDQ4X0kyQ19GTV9BVURJT19DVFJMMCAqLworI2RlZmluZSBCQ00yMDQ4X1JGX01VVEUJCQkweDAxCisjZGVmaW5lIEJDTTIwNDhfTUFOVUFMX01VVEUJCTB4MDIKKyNkZWZpbmUgQkNNMjA0OF9EQUNfT1VUUFVUX0xFRlQJCTB4MDQKKyNkZWZpbmUgQkNNMjA0OF9EQUNfT1VUUFVUX1JJR0hUCTB4MDgKKyNkZWZpbmUgQkNNMjA0OF9BVURJT19ST1VURV9EQUMJCTB4MTAKKyNkZWZpbmUgQkNNMjA0OF9BVURJT19ST1VURV9JMlMJCTB4MjAKKyNkZWZpbmUgQkNNMjA0OF9ERV9FTVBIQVNJU19TRUxFQ1QJMHg0MAorI2RlZmluZSBCQ00yMDQ4X0FVRElPX0JBTkRXSURUSF9TRUxFQ1QJMHg4MAorCisvKiBCQ00yMDQ4X0kyQ19GTV9TRUFSQ0hfQ1RSTDAgKi8KKyNkZWZpbmUgQkNNMjA0OF9TRUFSQ0hfUlNTSV9USFJFU0hPTEQJMHg3ZgorI2RlZmluZSBCQ00yMDQ4X1NFQVJDSF9ESVJFQ1RJT04JMHg4MAorCisvKiBCQ00yMDQ4X0kyQ19GTV9TRUFSQ0hfVFVORV9NT0RFICovCisjZGVmaW5lIEJDTTIwNDhfRk1fQVVUT19TRUFSQ0gJCTB4MDMKKworLyogQkNNMjA0OF9JMkNfRk1fUlNTSSAqLworI2RlZmluZSBCQ00yMDQ4X1JTU0lfVkFMVUUJCTB4ZmYKKworLyogQkNNMjA0OF9JMkNfRk1fUkRTX01BU0swICovCisvKiBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEgKi8KKyNkZWZpbmUgQkNNMjA0OF9GTV9GTEFHX1NFQVJDSF9UVU5FX0ZJTklTSEVECTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9GTV9GTEFHX1NFQVJDSF9UVU5FX0ZBSUwJMHgwMgorI2RlZmluZSBCQ00yMDQ4X0ZNX0ZMQUdfUlNTSV9MT1cJCTB4MDQKKyNkZWZpbmUgQkNNMjA0OF9GTV9GTEFHX0NBUlJJRVJfRVJST1JfSElHSAkweDA4CisjZGVmaW5lIEJDTTIwNDhfRk1fRkxBR19BVURJT19QQVVTRV9JTkRJQ0FUSU9OCTB4MTAKKyNkZWZpbmUgQkNNMjA0OF9GTEFHX1NURVJFT19ERVRFQ1RFRAkJMHgyMAorI2RlZmluZSBCQ00yMDQ4X0ZMQUdfU1RFUkVPX0FDVElWRQkJMHg0MAorCisvKiBCQ00yMDQ4X0kyQ19SRFNfREFUQSAqLworI2RlZmluZSBCQ00yMDQ4X1NMQVZFX0FERFJFU1MJCQkweDNmCisjZGVmaW5lIEJDTTIwNDhfU0xBVkVfRU5BQkxFCQkJMHg4MAorCisvKiBCQ00yMDQ4X0kyQ19GTV9CRVNUX1RVTkVfTU9ERSAqLworI2RlZmluZSBCQ00yMDQ4X0JFU1RfVFVORV9NT0RFCQkJMHg4MAorCisjZGVmaW5lIEJDTTIwNDhfRk1fRkxBR19TRUFSQ0hfVFVORV9GSU5JU0hFRAkweDAxCisjZGVmaW5lIEJDTTIwNDhfRk1fRkxBR19TRUFSQ0hfVFVORV9GQUlMCTB4MDIKKyNkZWZpbmUgQkNNMjA0OF9GTV9GTEFHX1JTU0lfTE9XCQkweDA0CisjZGVmaW5lIEJDTTIwNDhfRk1fRkxBR19DQVJSSUVSX0VSUk9SX0hJR0gJMHgwOAorI2RlZmluZSBCQ00yMDQ4X0ZNX0ZMQUdfQVVESU9fUEFVU0VfSU5ESUNBVElPTgkweDEwCisjZGVmaW5lIEJDTTIwNDhfRkxBR19TVEVSRU9fREVURUNURUQJCTB4MjAKKyNkZWZpbmUgQkNNMjA0OF9GTEFHX1NURVJFT19BQ1RJVkUJCTB4NDAKKworI2RlZmluZSBCQ00yMDQ4X1JEU19GTEFHX0ZJRk9fV0xJTkUJCTB4MDIKKyNkZWZpbmUgQkNNMjA0OF9SRFNfRkxBR19CX0JMT0NLX01BVENICQkweDA4CisjZGVmaW5lIEJDTTIwNDhfUkRTX0ZMQUdfU1lOQ19MT1NUCQkweDEwCisjZGVmaW5lIEJDTTIwNDhfUkRTX0ZMQUdfUElfTUFUQ0gJCTB4MjAKKworI2RlZmluZSBCQ00yMDQ4X1JEU19NQVJLX0VORF9CWVRFMAkJMHg3QworI2RlZmluZSBCQ00yMDQ4X1JEU19NQVJLX0VORF9CWVRFTgkJMHhGRgorCisjZGVmaW5lIEJDTTIwNDhfRk1fRkxBR1NfQUxMCShGTV9GTEFHX1NFQVJDSF9UVU5FX0ZJTklTSEVEIHwgXAorCQkJCSBGTV9GTEFHX1NFQVJDSF9UVU5FX0ZBSUwgfCBcCisJCQkJIEZNX0ZMQUdfUlNTSV9MT1cgfCBcCisJCQkJIEZNX0ZMQUdfQ0FSUklFUl9FUlJPUl9ISUdIIHwgXAorCQkJCSBGTV9GTEFHX0FVRElPX1BBVVNFX0lORElDQVRJT04gfCBcCisJCQkJIEZMQUdfU1RFUkVPX0RFVEVDVEVEIHwgRkxBR19TVEVSRU9fQUNUSVZFKQorCisjZGVmaW5lIEJDTTIwNDhfUkRTX0ZMQUdTX0FMTAkoUkRTX0ZMQUdfRklGT19XTElORSB8IFwKKwkJCQkgUkRTX0ZMQUdfQl9CTE9DS19NQVRDSCB8IFwKKwkJCQkgUkRTX0ZMQUdfU1lOQ19MT1NUIHwgUkRTX0ZMQUdfUElfTUFUQ0gpCisKKyNkZWZpbmUgQkNNMjA0OF9ERUZBVUxUX1RJTUVPVVQJCTE1MDAKKyNkZWZpbmUgQkNNMjA0OF9BVVRPX1NFQVJDSF9USU1FT1VUCTMwMDAKKworCisjZGVmaW5lIEJDTTIwNDhfRlJFUURFVl9VTklUCQkxMDAwMAorI2RlZmluZSBCQ00yMDQ4X0ZSRVFWNEwyX01VTFRJCQk2MjUKKyNkZWZpbmUgZGV2X3RvX3Y0bDIoZikJKChmICogQkNNMjA0OF9GUkVRREVWX1VOSVQpIC8gQkNNMjA0OF9GUkVRVjRMMl9NVUxUSSkKKyNkZWZpbmUgdjRsMl90b19kZXYoZikJKChmICogQkNNMjA0OF9GUkVRVjRMMl9NVUxUSSkgLyBCQ00yMDQ4X0ZSRVFERVZfVU5JVCkKKworI2RlZmluZSBtc2IoeCkgICAgICAgICAgICAgICAgICAoKHU4KSgodTE2KSB4ID4+IDgpKQorI2RlZmluZSBsc2IoeCkgICAgICAgICAgICAgICAgICAoKHU4KSgodTE2KSB4ICYgIDB4MDBGRikpCisjZGVmaW5lIGNvbXBvc2VfdTE2KG1zYiwgbHNiKQkoKCh1MTYpbXNiIDw8IDgpIHwgbHNiKQorCisjZGVmaW5lIEJDTTIwNDhfREVGQVVMVF9QT1dFUklOR19ERUxBWQkyMAorI2RlZmluZSBCQ00yMDQ4X0RFRkFVTFRfUkVHSU9OCQkweDAyCisjZGVmaW5lIEJDTTIwNDhfREVGQVVMVF9NVVRFCQkweDAxCisjZGVmaW5lIEJDTTIwNDhfREVGQVVMVF9SU1NJX1RIUkVTSE9MRAkweDY0CisjZGVmaW5lIEJDTTIwNDhfREVGQVVMVF9SRFNfV0xJTkUJMHg3RQorCisjZGVmaW5lIEJDTTIwNDhfRk1fU0VBUkNIX0lOQUNUSVZFCTB4MDAKKyNkZWZpbmUgQkNNMjA0OF9GTV9QUkVfU0VUX01PREUJCTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9GTV9BVVRPX1NFQVJDSF9NT0RFCTB4MDIKKyNkZWZpbmUgQkNNMjA0OF9GTV9BRl9KVU1QX01PREUJCTB4MDMKKworI2RlZmluZSBCQ00yMDQ4X0ZSRVFVRU5DWV9CQVNFCQk2NDAwMAorCisjZGVmaW5lIEJDTTIwNDhfUE9XRVJfT04JCTB4MDEKKyNkZWZpbmUgQkNNMjA0OF9QT1dFUl9PRkYJCTB4MDAKKworI2RlZmluZSBCQ00yMDQ4X0lURU1fRU5BQkxFRAkJMHgwMQorI2RlZmluZSBCQ00yMDQ4X1NFQVJDSF9ESVJFQ1RJT05fVVAJMHgwMQorCisjZGVmaW5lIEJDTTIwNDhfREVfRU1QSEFTSVNfNzV1cwk3NQorI2RlZmluZSBCQ00yMDQ4X0RFX0VNUEhBU0lTXzUwdXMJNTAKKworI2RlZmluZSBCQ00yMDQ4X1NDQU5fRkFJTAkJMHgwMAorI2RlZmluZSBCQ00yMDQ4X1NDQU5fT0sJCQkweDAxCisKKyNkZWZpbmUgQkNNMjA0OF9GUkVRX0VSUk9SX0ZMT09SCS0yMAorI2RlZmluZSBCQ00yMDQ4X0ZSRVFfRVJST1JfUk9PRgkJMjAKKworLyogLTYwIGRCIGlzIHJlcG9ydGVkIGFzIGZ1bGwgc2lnbmFsIHN0cmVuZ2h0ICovCisjZGVmaW5lIEJDTTIwNDhfUlNTSV9MRVZFTF9CQVNFCQktNjAKKyNkZWZpbmUgQkNNMjA0OF9SU1NJX0xFVkVMX1JPT0YJCS0xMDAKKyNkZWZpbmUgQkNNMjA0OF9SU1NJX0xFVkVMX1JPT0ZfTkVHCTEwMAorI2RlZmluZSBCQ00yMDQ4X1NJR05BTF9NVUxUSVBMSUVSCSgweEZGRkYgLyBcCisJCQkJCSAoQkNNMjA0OF9SU1NJX0xFVkVMX1JPT0ZfTkVHICsgXAorCQkJCQkgIEJDTTIwNDhfUlNTSV9MRVZFTF9CQVNFKSkKKworI2RlZmluZSBCQ00yMDQ4X1JEU19GSUZPX0RVUExFX1NJWkUJMHgwMworI2RlZmluZSBCQ00yMDQ4X1JEU19DUkNfTUFTSwkJMHgwRgorI2RlZmluZSBCQ00yMDQ4X1JEU19DUkNfTk9ORQkJMHgwMAorI2RlZmluZSBCQ00yMDQ4X1JEU19DUkNfTUFYXzJCSVRTCTB4MDQKKyNkZWZpbmUgQkNNMjA0OF9SRFNfQ1JDX0xFQVNUXzJCSVRTCTB4MDgKKyNkZWZpbmUgQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUJMHgwQworCisjZGVmaW5lIEJDTTIwNDhfUkRTX0JMT0NLX01BU0sJCTB4RjAKKyNkZWZpbmUgQkNNMjA0OF9SRFNfQkxPQ0tfQQkJMHgwMAorI2RlZmluZSBCQ00yMDQ4X1JEU19CTE9DS19CCQkweDEwCisjZGVmaW5lIEJDTTIwNDhfUkRTX0JMT0NLX0MJCTB4MjAKKyNkZWZpbmUgQkNNMjA0OF9SRFNfQkxPQ0tfRAkJMHgzMAorI2RlZmluZSBCQ00yMDQ4X1JEU19CTE9DS19DX1NDT1JFRAkweDQwCisjZGVmaW5lIEJDTTIwNDhfUkRTX0JMT0NLX0UJCTB4NjAKKworI2RlZmluZSBCQ00yMDQ4X1JEU19SVAkJCTB4MjAKKyNkZWZpbmUgQkNNMjA0OF9SRFNfUFMJCQkweDAwCisKKyNkZWZpbmUgQkNNMjA0OF9SRFNfR1JPVVBfQUJfTUFTSwkweDA4CisjZGVmaW5lIEJDTTIwNDhfUkRTX0dST1VQX0EJCTB4MDAKKyNkZWZpbmUgQkNNMjA0OF9SRFNfR1JPVVBfQgkJMHgwOAorCisjZGVmaW5lIEJDTTIwNDhfUkRTX1JUX0FCX01BU0sJCTB4MTAKKyNkZWZpbmUgQkNNMjA0OF9SRFNfUlRfQQkJMHgwMAorI2RlZmluZSBCQ00yMDQ4X1JEU19SVF9CCQkweDEwCisjZGVmaW5lIEJDTTIwNDhfUkRTX1JUX0lOREVYCQkweDBGCisKKyNkZWZpbmUgQkNNMjA0OF9SRFNfUFNfSU5ERVgJCTB4MDMKKworc3RydWN0IHJkc19pbmZvIHsKKwl1MTYgcmRzX3BpOworI2RlZmluZSBCQ00yMDQ4X01BWF9SRFNfUlQgKDY0ICsgMSkKKwl1OCByZHNfcnRbQkNNMjA0OF9NQVhfUkRTX1JUXTsKKwl1OCByZHNfcnRfZ3JvdXBfYjsKKwl1OCByZHNfcnRfYWI7CisjZGVmaW5lIEJDTTIwNDhfTUFYX1JEU19QUyAoOCArIDEpCisJdTggcmRzX3BzW0JDTTIwNDhfTUFYX1JEU19QU107CisJdTggcmRzX3BzX2dyb3VwOworCXU4IHJkc19wc19ncm91cF9jbnQ7CisjZGVmaW5lIEJDTTIwNDhfTUFYX1JEU19SQURJT19URVhUIDI1NQorCXU4IHJhZGlvX3RleHRbQkNNMjA0OF9NQVhfUkRTX1JBRElPX1RFWFQgKyAzXTsKKwl1OCB0ZXh0X2xlbjsKK307CisKK3N0cnVjdCByZWdpb25faW5mbyB7CisJdTMyIGJvdHRvbV9mcmVxdWVuY3k7CisJdTMyIHRvcF9mcmVxdWVuY3k7CisJdTggZGVlbXBoYXNpczsKKwl1OCBjaGFubmVsX3NwYWNpbmc7CisJdTggcmVnaW9uOworfTsKKworc3RydWN0IGJjbTIwNDhfZGV2aWNlIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgYmNtMjA0OF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCXN0cnVjdCByZHNfaW5mbyByZHNfaW5mbzsKKwlzdHJ1Y3QgcmVnaW9uX2luZm8gcmVnaW9uX2luZm87CisJdTE2IGZyZXF1ZW5jeTsKKwl1OCBjYWNoZV9mbV9yZHNfc3lzdGVtOworCXU4IGNhY2hlX2ZtX2N0cmw7CisJdTggY2FjaGVfZm1fYXVkaW9fY3RybDA7CisJdTggY2FjaGVfZm1fc2VhcmNoX2N0cmwwOworCXU4IHBvd2VyX3N0YXRlOworCXU4IHJkc19zdGF0ZTsKKwl1OCBmaWZvX3NpemU7CisJdTggc2Nhbl9zdGF0ZTsKKwl1OCBtdXRlX3N0YXRlOworCisJLyogZm9yIHJkcyBkYXRhIGRldmljZSByZWFkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF9xdWV1ZTsKKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisJdW5zaWduZWQgY2hhciByZHNfZGF0YV9hdmFpbGFibGU7CisJdW5zaWduZWQgaW50IHJkX2luZGV4OworfTsKKworc3RhdGljIGludCByYWRpb19uciA9IC0xOwkvKiByYWRpbyBkZXZpY2UgbWlub3IgKC0xID09PiBhdXRvIGFzc2lnbikgKi8KK21vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsCisJCSAiTWlub3IgbnVtYmVyIGZvciByYWRpbyBkZXZpY2UgKC0xID09PiBhdXRvIGFzc2lnbikiKTsKKworc3RhdGljIHN0cnVjdCByZWdpb25faW5mbyByZWdpb25fY29uZmlnc1tdID0geworCS8qIFVTQSAqLworCXsKKwkJLmNoYW5uZWxfc3BhY2luZwk9IDIwLAorCQkuYm90dG9tX2ZyZXF1ZW5jeQk9IDg3NTAwLAorCQkudG9wX2ZyZXF1ZW5jeQkJPSAxMDgwMDAsCisJCS5kZWVtcGhhc2lzCQk9IDc1LAorCQkucmVnaW9uCQkJPSAwLAorCX0sCisJLyogQXVzdHJhbGlhICovCisJeworCQkuY2hhbm5lbF9zcGFjaW5nCT0gMjAsCisJCS5ib3R0b21fZnJlcXVlbmN5CT0gODc1MDAsCisJCS50b3BfZnJlcXVlbmN5CQk9IDEwODAwMCwKKwkJLmRlZW1waGFzaXMJCT0gNTAsCisJCS5yZWdpb24JCQk9IDEsCisJfSwKKwkvKiBFdXJvcGUgKi8KKwl7CisJCS5jaGFubmVsX3NwYWNpbmcJPSAxMCwKKwkJLmJvdHRvbV9mcmVxdWVuY3kJPSA4NzUwMCwKKwkJLnRvcF9mcmVxdWVuY3kJCT0gMTA4MDAwLAorCQkuZGVlbXBoYXNpcwkJPSA1MCwKKwkJLnJlZ2lvbgkJCT0gMiwKKwl9LAorCS8qIEphcGFuICovCisJeworCQkuY2hhbm5lbF9zcGFjaW5nCT0gMTAsCisJCS5ib3R0b21fZnJlcXVlbmN5CT0gNzYwMDAsCisJCS50b3BfZnJlcXVlbmN5CQk9IDkwMDAwLAorCQkuZGVlbXBoYXNpcwkJPSA1MCwKKwkJLnJlZ2lvbgkJCT0gMywKKwl9LAorCS8qIEphcGFuIHdpZGUgYmFuZCAqLworCXsKKwkJLmNoYW5uZWxfc3BhY2luZwk9IDEwLAorCQkuYm90dG9tX2ZyZXF1ZW5jeQk9IDc2MDAwLAorCQkudG9wX2ZyZXF1ZW5jeQkJPSAxMDgwMDAsCisJCS5kZWVtcGhhc2lzCQk9IDUwLAorCQkucmVnaW9uCQkJPSA0LAorCX0sCit9OworCisvKgorICoJSTJDIEludGVyZmFjZSByZWFkIC8gd3JpdGUKKyAqLworc3RhdGljIGludCBiY20yMDQ4X3NlbmRfY29tbWFuZChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCByZWcsCisJCQkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gYmRldi0+Y2xpZW50OworCXU4IGRhdGFbMl07CisKKwlpZiAoIWJkZXYtPnBvd2VyX3N0YXRlKSB7CisJCWRldl9lcnIoJmJkZXYtPmNsaWVudC0+ZGV2LCAiYmNtMjA0ODogY2hpcCBub3QgcG93ZXJlZCFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkYXRhWzBdID0gcmVnICYgMHhmZjsKKwlkYXRhWzFdID0gdmFsdWUgJiAweGZmOworCisJaWYgKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGRhdGEsIDIpID09IDIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmYmRldi0+Y2xpZW50LT5kZXYsICJCQ00gSTJDIGVycm9yIVxuIik7CisJCWRldl9lcnIoJmJkZXYtPmNsaWVudC0+ZGV2LCAiSXMgQmx1ZXRvb3RoIHVwIGFuZCBydW5uaW5nP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KK30KKworc3RhdGljIGludCBiY20yMDQ4X3JlY3ZfY29tbWFuZChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCByZWcsCisJCQl1OCAqdmFsdWUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGJkZXYtPmNsaWVudDsKKworCWlmICghYmRldi0+cG93ZXJfc3RhdGUpIHsKKwkJZGV2X2VycigmYmRldi0+Y2xpZW50LT5kZXYsICJiY20yMDQ4OiBjaGlwIG5vdCBwb3dlcmVkIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXZhbHVlWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICYgMHhmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3JlY3ZfZHVwbGVzKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IHJlZywKKwkJCXU4ICp2YWx1ZSwgdTggZHVwbGVzKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBiZGV2LT5jbGllbnQ7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKwl1OCBidWY7CisKKwlpZiAoIWJkZXYtPnBvd2VyX3N0YXRlKSB7CisJCWRldl9lcnIoJmJkZXYtPmNsaWVudC0+ZGV2LCAiYmNtMjA0ODogY2hpcCBub3QgcG93ZXJlZCFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlidWYgPSByZWcgJiAweGZmOworCisJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJbXNnWzBdLmZsYWdzID0gY2xpZW50LT5mbGFncyAmIEkyQ19NX1RFTjsKKwltc2dbMF0ubGVuID0gMTsKKwltc2dbMF0uYnVmID0gJmJ1ZjsKKworCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZ1sxXS5mbGFncyA9IGNsaWVudC0+ZmxhZ3MgJiBJMkNfTV9URU47CisJbXNnWzFdLmZsYWdzIHw9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSBkdXBsZXM7CisJbXNnWzFdLmJ1ZiA9IHZhbHVlOworCisJcmV0dXJuIGkyY190cmFuc2ZlcihhZGFwLCBtc2csIDIpOworfQorCisvKgorICoJQkNNMjA0OCAtIEkyQyByZWdpc3RlciBwcm9ncmFtbWluZyBoZWxwZXJzCisgKi8KK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1OCBwb3dlcikKK3sKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWlmIChwb3dlcikgeworCQliZGV2LT5wb3dlcl9zdGF0ZSA9IEJDTTIwNDhfUE9XRVJfT047CisJCWJkZXYtPmNhY2hlX2ZtX3Jkc19zeXN0ZW0gfD0gQkNNMjA0OF9GTV9PTjsKKwl9IGVsc2UgeworCQliZGV2LT5jYWNoZV9mbV9yZHNfc3lzdGVtICY9IH5CQ00yMDQ4X0ZNX09OOworCX0KKworCS8qCisJICogV2FybmluZyEgRk0gY2Fubm90IGJlIHR1cm5lZCBvZmYgYmVjYXVzZSB0aGVuCisJICogdGhlIEkyQyBjb21tdW5pY2F0aW9ucyBnZXQgcnVpbmVkIQorCSAqIENvbW1lbnQgb2ZmIHRoZSAiaWYgKHBvd2VyKSIgd2hlbiB0aGUgY2hpcCB3b3JrcyEKKwkgKi8KKwlpZiAocG93ZXIpCisJCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sCisJCQkJCWJkZXYtPmNhY2hlX2ZtX3Jkc19zeXN0ZW0pOworCW1zbGVlcChCQ00yMDQ4X0RFRkFVTFRfUE9XRVJJTkdfREVMQVkpOworCisJaWYgKCFwb3dlcikKKwkJYmRldi0+cG93ZXJfc3RhdGUgPSBCQ00yMDQ4X1BPV0VSX09GRjsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcG93ZXJfc3RhdGUoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfU1lTVEVNLCAmdmFsdWUpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVyciAmJiAodmFsdWUgJiBCQ00yMDQ4X0ZNX09OKSkKKwkJcmV0dXJuIEJDTTIwNDhfUE9XRVJfT047CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X3Jkc19ub19sb2NrKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTggcmRzX29uKQoreworCWludCBlcnI7CisJdTggZmxhZ3M7CisKKwliZGV2LT5jYWNoZV9mbV9yZHNfc3lzdGVtICY9IH5CQ00yMDQ4X1JEU19PTjsKKworCWlmIChyZHNfb24pIHsKKwkJYmRldi0+Y2FjaGVfZm1fcmRzX3N5c3RlbSB8PSBCQ00yMDQ4X1JEU19PTjsKKwkJYmRldi0+cmRzX3N0YXRlID0gQkNNMjA0OF9SRFNfT047CisJCWZsYWdzID0JQkNNMjA0OF9SRFNfRkxBR19GSUZPX1dMSU5FOworCQllcnIgPSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEsCisJCQkJCQlmbGFncyk7CisJfSBlbHNlIHsKKwkJZmxhZ3MgPQkwOworCQliZGV2LT5yZHNfc3RhdGUgPSAwOworCQllcnIgPSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEsCisJCQkJCQlmbGFncyk7CisJCW1lbXNldCgmYmRldi0+cmRzX2luZm8sIDAsIHNpemVvZihiZGV2LT5yZHNfaW5mbykpOworCX0KKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sCisJCQkJCWJkZXYtPmNhY2hlX2ZtX3Jkc19zeXN0ZW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZHNfbm9fbG9jayhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2YWx1ZTsKKworCWVyciA9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sICZ2YWx1ZSk7CisKKwlpZiAoIWVyciAmJiAodmFsdWUgJiBCQ00yMDQ4X1JEU19PTikpCisJCXJldHVybiBCQ00yMDQ4X0lURU1fRU5BQkxFRDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfcmRzKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTggcmRzX29uKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3NldF9yZHNfbm9fbG9jayhiZGV2LCByZHNfb24pOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZHMoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X2dldF9yZHNfbm9fbG9jayhiZGV2KTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcmRzX3BpKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlyZXR1cm4gYmRldi0+cmRzX2luZm8ucmRzX3BpOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X2ZtX2F1dG9tYXRpY19zdGVyZW9fbW9ubyhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsCisJCQkJCQl1OCBlbmFibGVkKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwliZGV2LT5jYWNoZV9mbV9jdHJsICY9IH5CQ00yMDQ4X1NURVJFT19NT05PX0FVVE9fU0VMRUNUOworCisJaWYgKGVuYWJsZWQpCisJCWJkZXYtPmNhY2hlX2ZtX2N0cmwgfD0gQkNNMjA0OF9TVEVSRU9fTU9OT19BVVRPX1NFTEVDVDsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0NUUkwsCisJCQkJCWJkZXYtPmNhY2hlX2ZtX2N0cmwpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9mbV9oaV9sb19pbmplY3Rpb24oc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LAorCQkJCQkJdTggaGlfbG8pCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWJkZXYtPmNhY2hlX2ZtX2N0cmwgJj0gfkJDTTIwNDhfSElfTE9fSU5KRUNUSU9OOworCisJaWYgKGhpX2xvKQorCQliZGV2LT5jYWNoZV9mbV9jdHJsIHw9IEJDTTIwNDhfSElfTE9fSU5KRUNUSU9OOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQ1RSTCwKKwkJCQkJYmRldi0+Y2FjaGVfZm1fY3RybCk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X2ZtX2hpX2xvX2luamVjdGlvbihzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2YWx1ZTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0NUUkwsICZ2YWx1ZSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyICYmICh2YWx1ZSAmIEJDTTIwNDhfSElfTE9fSU5KRUNUSU9OKSkKKwkJcmV0dXJuIEJDTTIwNDhfSVRFTV9FTkFCTEVEOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9mbV9mcmVxdWVuY3koc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1MzIgZnJlcXVlbmN5KQoreworCWludCBlcnI7CisKKwlpZiAoZnJlcXVlbmN5IDwgYmRldi0+cmVnaW9uX2luZm8uYm90dG9tX2ZyZXF1ZW5jeSB8fAorCQlmcmVxdWVuY3kgPiBiZGV2LT5yZWdpb25faW5mby50b3BfZnJlcXVlbmN5KQorCQlyZXR1cm4gLUVET007CisKKwlmcmVxdWVuY3kgLT0gQkNNMjA0OF9GUkVRVUVOQ1lfQkFTRTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0ZSRVEwLCBsc2IoZnJlcXVlbmN5KSk7CisJZXJyIHw9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0ZSRVExLAorCQkJCQltc2IoZnJlcXVlbmN5KSk7CisKKwlpZiAoIWVycikKKwkJYmRldi0+ZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9mbV9mcmVxdWVuY3koc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggbHNiLCBtc2I7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9GUkVRMCwgJmxzYik7CisJZXJyIHw9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0ZSRVExLCAmbXNiKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGNvbXBvc2VfdTE2KG1zYiwgbHNiKTsKKwllcnIgKz0gQkNNMjA0OF9GUkVRVUVOQ1lfQkFTRTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfZm1fYWZfZnJlcXVlbmN5KHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwKKwkJCQkJCXUzMiBmcmVxdWVuY3kpCit7CisJaW50IGVycjsKKworCWlmIChmcmVxdWVuY3kgPCBiZGV2LT5yZWdpb25faW5mby5ib3R0b21fZnJlcXVlbmN5IHx8CisJCWZyZXF1ZW5jeSA+IGJkZXYtPnJlZ2lvbl9pbmZvLnRvcF9mcmVxdWVuY3kpCisJCXJldHVybiAtRURPTTsKKworCWZyZXF1ZW5jeSAtPSBCQ00yMDQ4X0ZSRVFVRU5DWV9CQVNFOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQUZfRlJFUTAsCisJCQkJCWxzYihmcmVxdWVuY3kpKTsKKwllcnIgfD0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQUZfRlJFUTEsCisJCQkJCW1zYihmcmVxdWVuY3kpKTsKKwlpZiAoIWVycikKKwkJYmRldi0+ZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9mbV9hZl9mcmVxdWVuY3koc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggbHNiLCBtc2I7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9BRl9GUkVRMCwgJmxzYik7CisJZXJyIHw9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FGX0ZSRVExLCAmbXNiKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGNvbXBvc2VfdTE2KG1zYiwgbHNiKTsKKwllcnIgKz0gQkNNMjA0OF9GUkVRVUVOQ1lfQkFTRTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfZm1fZGVlbXBoYXNpcyhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIGludCBkKQoreworCWludCBlcnI7CisJdTggZGVlbXBoYXNpczsKKworCWlmIChkID09IEJDTTIwNDhfREVfRU1QSEFTSVNfNzV1cykKKwkJZGVlbXBoYXNpcyA9IEJDTTIwNDhfREVfRU1QSEFTSVNfU0VMRUNUOworCWVsc2UKKwkJZGVlbXBoYXNpcyA9IDA7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwliZGV2LT5jYWNoZV9mbV9hdWRpb19jdHJsMCAmPSB+QkNNMjA0OF9ERV9FTVBIQVNJU19TRUxFQ1Q7CisJYmRldi0+Y2FjaGVfZm1fYXVkaW9fY3RybDAgfD0gZGVlbXBoYXNpczsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwwLAorCQliZGV2LT5jYWNoZV9mbV9hdWRpb19jdHJsMCk7CisKKwlpZiAoIWVycikKKwkJYmRldi0+cmVnaW9uX2luZm8uZGVlbXBoYXNpcyA9IGQ7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfZm1fZGVlbXBoYXNpcyhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2YWx1ZTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwwLCAmdmFsdWUpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikgeworCQlpZiAodmFsdWUgJiBCQ00yMDQ4X0RFX0VNUEhBU0lTX1NFTEVDVCkKKwkJCXJldHVybiBCQ00yMDQ4X0RFX0VNUEhBU0lTXzc1dXM7CisJCWVsc2UKKwkJCXJldHVybiBCQ00yMDQ4X0RFX0VNUEhBU0lTXzUwdXM7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9yZWdpb24oc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1OCByZWdpb24pCit7CisJaW50IGVycjsKKwl1MzIgbmV3X2ZyZXF1ZW5jeSA9IDA7CisKKwlpZiAocmVnaW9uID4gQVJSQVlfU0laRShyZWdpb25fY29uZmlncykpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCWJkZXYtPnJlZ2lvbl9pbmZvID0gcmVnaW9uX2NvbmZpZ3NbcmVnaW9uXTsKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmIChiZGV2LT5mcmVxdWVuY3kgPCByZWdpb25fY29uZmlnc1tyZWdpb25dLmJvdHRvbV9mcmVxdWVuY3kgfHwKKwkJYmRldi0+ZnJlcXVlbmN5ID4gcmVnaW9uX2NvbmZpZ3NbcmVnaW9uXS50b3BfZnJlcXVlbmN5KQorCQluZXdfZnJlcXVlbmN5ID0gcmVnaW9uX2NvbmZpZ3NbcmVnaW9uXS5ib3R0b21fZnJlcXVlbmN5OworCisJaWYgKG5ld19mcmVxdWVuY3kgPiAwKSB7CisJCWVyciA9IGJjbTIwNDhfc2V0X2ZtX2ZyZXF1ZW5jeShiZGV2LCBuZXdfZnJlcXVlbmN5KTsKKworCQlpZiAoZXJyKQorCQkJZ290byBkb25lOworCX0KKworCWVyciA9IGJjbTIwNDhfc2V0X2ZtX2RlZW1waGFzaXMoYmRldiwKKwkJCXJlZ2lvbl9jb25maWdzW3JlZ2lvbl0uZGVlbXBoYXNpcyk7CisKK2RvbmU6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZWdpb24oc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisJZXJyID0gYmRldi0+cmVnaW9uX2luZm8ucmVnaW9uOworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9tdXRlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTE2IG11dGUpCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWJkZXYtPmNhY2hlX2ZtX2F1ZGlvX2N0cmwwICY9IH4oQkNNMjA0OF9SRl9NVVRFIHwgQkNNMjA0OF9NQU5VQUxfTVVURSk7CisKKwlpZiAobXV0ZSkKKwkJYmRldi0+Y2FjaGVfZm1fYXVkaW9fY3RybDAgfD0gKEJDTTIwNDhfUkZfTVVURSB8CisJCQkJCQlCQ00yMDQ4X01BTlVBTF9NVVRFKTsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwwLAorCQkJCQliZGV2LT5jYWNoZV9mbV9hdWRpb19jdHJsMCk7CisKKwlpZiAoIWVycikKKwkJYmRldi0+bXV0ZV9zdGF0ZSA9IG11dGU7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X211dGUoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoYmRldi0+cG93ZXJfc3RhdGUpIHsKKwkJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQVVESU9fQ1RSTDAsCisJCQkJCQkmdmFsdWUpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHZhbHVlICYgKEJDTTIwNDhfUkZfTVVURSB8IEJDTTIwNDhfTUFOVUFMX01VVEUpOworCX0gZWxzZSB7CisJCWVyciA9IGJkZXYtPm11dGVfc3RhdGU7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9hdWRpb19yb3V0ZShzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIHU4IHJvdXRlKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlyb3V0ZSAmPSAoQkNNMjA0OF9BVURJT19ST1VURV9EQUMgfCBCQ00yMDQ4X0FVRElPX1JPVVRFX0kyUyk7CisJYmRldi0+Y2FjaGVfZm1fYXVkaW9fY3RybDAgJj0gfihCQ00yMDQ4X0FVRElPX1JPVVRFX0RBQyB8CisJCUJDTTIwNDhfQVVESU9fUk9VVEVfSTJTKTsKKwliZGV2LT5jYWNoZV9mbV9hdWRpb19jdHJsMCB8PSByb3V0ZTsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwwLAorCQkJCQliZGV2LT5jYWNoZV9mbV9hdWRpb19jdHJsMCk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X2F1ZGlvX3JvdXRlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCXU4IHZhbHVlOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQVVESU9fQ1RSTDAsICZ2YWx1ZSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gdmFsdWUgJiAoQkNNMjA0OF9BVURJT19ST1VURV9EQUMgfAorCQkJQkNNMjA0OF9BVURJT19ST1VURV9JMlMpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9kYWNfb3V0cHV0KHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTggY2hhbm5lbHMpCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWJkZXYtPmNhY2hlX2ZtX2F1ZGlvX2N0cmwwICY9IH4oQkNNMjA0OF9EQUNfT1VUUFVUX0xFRlQgfAorCQkJCQlCQ00yMDQ4X0RBQ19PVVRQVVRfUklHSFQpOworCWJkZXYtPmNhY2hlX2ZtX2F1ZGlvX2N0cmwwIHw9IGNoYW5uZWxzOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQVVESU9fQ1RSTDAsCisJCQkJCWJkZXYtPmNhY2hlX2ZtX2F1ZGlvX2N0cmwwKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfZGFjX291dHB1dChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2YWx1ZTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX0FVRElPX0NUUkwwLCAmdmFsdWUpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIHZhbHVlICYgKEJDTTIwNDhfREFDX09VVFBVVF9MRUZUIHwKKwkJCUJDTTIwNDhfREFDX09VVFBVVF9SSUdIVCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X2ZtX3NlYXJjaF9yc3NpX3RocmVzaG9sZChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsCisJCQkJCQkJdTggdGhyZXNob2xkKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwl0aHJlc2hvbGQgJj0gQkNNMjA0OF9TRUFSQ0hfUlNTSV9USFJFU0hPTEQ7CisJYmRldi0+Y2FjaGVfZm1fc2VhcmNoX2N0cmwwICY9IH5CQ00yMDQ4X1NFQVJDSF9SU1NJX1RIUkVTSE9MRDsKKwliZGV2LT5jYWNoZV9mbV9zZWFyY2hfY3RybDAgfD0gdGhyZXNob2xkOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX0NUUkwwLAorCQkJCQliZGV2LT5jYWNoZV9mbV9zZWFyY2hfY3RybDApOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9mbV9zZWFyY2hfcnNzaV90aHJlc2hvbGQoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9TRUFSQ0hfQ1RSTDAsICZ2YWx1ZSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gdmFsdWUgJiBCQ00yMDQ4X1NFQVJDSF9SU1NJX1RIUkVTSE9MRDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfZm1fc2VhcmNoX21vZGVfZGlyZWN0aW9uKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwKKwkJCQkJCXU4IGRpcmVjdGlvbikKK3sKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJYmRldi0+Y2FjaGVfZm1fc2VhcmNoX2N0cmwwICY9IH5CQ00yMDQ4X1NFQVJDSF9ESVJFQ1RJT047CisKKwlpZiAoZGlyZWN0aW9uKQorCQliZGV2LT5jYWNoZV9mbV9zZWFyY2hfY3RybDAgfD0gQkNNMjA0OF9TRUFSQ0hfRElSRUNUSU9OOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX0NUUkwwLAorCQkJCQliZGV2LT5jYWNoZV9mbV9zZWFyY2hfY3RybDApOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9mbV9zZWFyY2hfbW9kZV9kaXJlY3Rpb24oc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9TRUFSQ0hfQ1RSTDAsICZ2YWx1ZSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyICYmICh2YWx1ZSAmIEJDTTIwNDhfU0VBUkNIX0RJUkVDVElPTikpCisJCXJldHVybiBCQ00yMDQ4X1NFQVJDSF9ESVJFQ1RJT05fVVA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X2ZtX3NlYXJjaF90dW5lX21vZGUoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LAorCQkJCQkJdTggbW9kZSkKK3sKKwlpbnQgZXJyLCB0aW1lb3V0LCByZXN0YXJ0X3JkcyA9IDA7CisJdTggdmFsdWUsIGZsYWdzOworCisJdmFsdWUgPSBtb2RlICYgQkNNMjA0OF9GTV9BVVRPX1NFQVJDSDsKKworCWZsYWdzID0JQkNNMjA0OF9GTV9GTEFHX1NFQVJDSF9UVU5FX0ZJTklTSEVEIHwKKwkJQkNNMjA0OF9GTV9GTEFHX1NFQVJDSF9UVU5FX0ZBSUw7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwkvKgorCSAqIElmIFJEUyBpcyBlbmFibGVkLCBhbmQgZnJlcXVlbmN5IGlzIGNoYW5nZWQsIFJEUyBxdWl0cyB3b3JraW5nLgorCSAqIFRodXMsIGFsd2F5cyByZXN0YXJ0IFJEUyBpZiBpdCdzIGVuYWJsZWQuIE1vcmVvdmVyLCBSRFMgbXVzdAorCSAqIG5vdCBiZSBlbmFibGVkIHdoaWxlIGNoYW5naW5nIHRoZSBmcmVxdWVuY3kgYmVjYXVzZSBpdCBjYW4KKwkgKiBwcm92aWRlIGEgcmFjZSB0byB0aGUgbXV0ZXggZnJvbSB0aGUgd29ya3F1ZXVlIGhhbmRsZXIgaWYgUkRTCisJICogSVJRIG9jY3VycyB3aGlsZSB3YWl0aW5nIGZvciBmcmVxdWVuY3kgY2hhbmdlZCBJUlEuCisJICovCisJaWYgKGJjbTIwNDhfZ2V0X3Jkc19ub19sb2NrKGJkZXYpKSB7CisJCWVyciA9IGJjbTIwNDhfc2V0X3Jkc19ub19sb2NrKGJkZXYsIDApOworCQlpZiAoZXJyKQorCQkJZ290byB1bmxvY2s7CisJCXJlc3RhcnRfcmRzID0gMTsKKwl9CisKKwllcnIgPSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzAsIGZsYWdzKTsKKworCWlmIChlcnIpCisJCWdvdG8gdW5sb2NrOworCisJYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX1RVTkVfTU9ERSwgdmFsdWUpOworCisJaWYgKG1vZGUgIT0gQkNNMjA0OF9GTV9BVVRPX1NFQVJDSF9NT0RFKQorCQl0aW1lb3V0ID0gQkNNMjA0OF9ERUZBVUxUX1RJTUVPVVQ7CisJZWxzZQorCQl0aW1lb3V0ID0gQkNNMjA0OF9BVVRPX1NFQVJDSF9USU1FT1VUOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmJkZXYtPmNvbXBsLAorCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpCisJCQlkZXZfZXJyKCZiZGV2LT5jbGllbnQtPmRldiwgIklSUSB0aW1lb3V0LlxuIik7CisKKwlpZiAodmFsdWUpCisJCWlmICghYmRldi0+c2Nhbl9zdGF0ZSkKKwkJCWVyciA9IC1FSU87CisKK3VubG9jazoKKwlpZiAocmVzdGFydF9yZHMpCisJCWVyciB8PSBiY20yMDQ4X3NldF9yZHNfbm9fbG9jayhiZGV2LCAxKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9mbV9zZWFyY2hfdHVuZV9tb2RlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCXU4IHZhbHVlOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fU0VBUkNIX1RVTkVfTU9ERSwKKwkJCQkJJnZhbHVlKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKCFlcnIpCisJCXJldHVybiB2YWx1ZSAmIEJDTTIwNDhfRk1fQVVUT19TRUFSQ0g7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X3Jkc19iX2Jsb2NrX21hc2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1MTYgbWFzaykKK3sKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19CTEtCX01BU0swLCBsc2IobWFzaykpOworCWVyciB8PSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFTSzEsIG1zYihtYXNrKSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X3Jkc19iX2Jsb2NrX21hc2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggbHNiLCBtc2I7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFTSzAsICZsc2IpOworCWVyciB8PSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFTSzEsICZtc2IpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIGNvbXBvc2VfdTE2KG1zYiwgbHNiKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfcmRzX2JfYmxvY2tfbWF0Y2goc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LAorCQkJCQkJdTE2IG1hdGNoKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX0JMS0JfTUFUQ0gwLCBsc2IobWF0Y2gpKTsKKwllcnIgfD0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19CTEtCX01BVENIMSwgbXNiKG1hdGNoKSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X3Jkc19iX2Jsb2NrX21hdGNoKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCXU4IGxzYiwgbXNiOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19CTEtCX01BVENIMCwgJmxzYik7CisJZXJyIHw9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsCisJCQlCQ00yMDQ4X0kyQ19SRFNfQkxLQl9NQVRDSDEsICZtc2IpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIGNvbXBvc2VfdTE2KG1zYiwgbHNiKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zZXRfcmRzX3BpX21hc2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1MTYgbWFzaykKK3sKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19QSV9NQVNLMCwgbHNiKG1hc2spKTsKKwllcnIgfD0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19QSV9NQVNLMSwgbXNiKG1hc2spKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcmRzX3BpX21hc2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggbHNiLCBtc2I7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX1BJX01BU0swLCAmbHNiKTsKKwllcnIgfD0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19QSV9NQVNLMSwgJm1zYik7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gY29tcG9zZV91MTYobXNiLCBsc2IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3NldF9yZHNfcGlfbWF0Y2goc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCB1MTYgbWF0Y2gpCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsCisJCQlCQ00yMDQ4X0kyQ19SRFNfUElfTUFUQ0gwLCBsc2IobWF0Y2gpKTsKKwllcnIgfD0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwKKwkJCUJDTTIwNDhfSTJDX1JEU19QSV9NQVRDSDEsIG1zYihtYXRjaCkpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZHNfcGlfbWF0Y2goc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggbHNiLCBtc2I7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LAorCQkJQkNNMjA0OF9JMkNfUkRTX1BJX01BVENIMCwgJmxzYik7CisJZXJyIHw9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsCisJCQlCQ00yMDQ4X0kyQ19SRFNfUElfTUFUQ0gxLCAmbXNiKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKCFlcnIpCisJCXJldHVybiBjb21wb3NlX3UxNihtc2IsIGxzYik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X2ZtX3Jkc19tYXNrKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTE2IG1hc2spCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsCisJCQlCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzAsIGxzYihtYXNrKSk7CisJZXJyIHw9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsCisJCQlCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEsIG1zYihtYXNrKSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X2ZtX3Jkc19tYXNrKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCXU4IHZhbHVlMCwgdmFsdWUxOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUkRTX01BU0swLCAmdmFsdWUwKTsKKwllcnIgfD0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUkRTX01BU0sxLCAmdmFsdWUxKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKCFlcnIpCisJCXJldHVybiBjb21wb3NlX3UxNih2YWx1ZTEsIHZhbHVlMCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X2ZtX3Jkc19mbGFncyhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2YWx1ZTAsIHZhbHVlMTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWVyciA9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19GTEFHMCwgJnZhbHVlMCk7CisJZXJyIHw9IGJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19GTEFHMSwgJnZhbHVlMSk7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gY29tcG9zZV91MTYodmFsdWUxLCB2YWx1ZTApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZWdpb25fYm90dG9tX2ZyZXF1ZW5jeShzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJuIGJkZXYtPnJlZ2lvbl9pbmZvLmJvdHRvbV9mcmVxdWVuY3k7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcmVnaW9uX3RvcF9mcmVxdWVuY3koc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCXJldHVybiBiZGV2LT5yZWdpb25faW5mby50b3BfZnJlcXVlbmN5OworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X2ZtX2Jlc3RfdHVuZV9tb2RlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgdTggbW9kZSkKK3sKKwlpbnQgZXJyOworCXU4IHZhbHVlOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJLyogUGVyZm9ybSByZWFkIGFzIHRoZSBtYW51YWwgaW5kaWNhdGVzICovCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQkVTVF9UVU5FX01PREUsCisJCQkJCSZ2YWx1ZSk7CisJdmFsdWUgJj0gfkJDTTIwNDhfQkVTVF9UVU5FX01PREU7CisKKwlpZiAobW9kZSkKKwkJdmFsdWUgfD0gQkNNMjA0OF9CRVNUX1RVTkVfTU9ERTsKKwllcnIgfD0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQkVTVF9UVU5FX01PREUsCisJCQkJCXZhbHVlKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfZm1fYmVzdF90dW5lX21vZGUoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJdTggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9CRVNUX1RVTkVfTU9ERSwKKwkJCQkJJnZhbHVlKTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCisJaWYgKCFlcnIgJiYgKHZhbHVlICYgQkNNMjA0OF9CRVNUX1RVTkVfTU9ERSkpCisJCXJldHVybiBCQ00yMDQ4X0lURU1fRU5BQkxFRDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfZm1fY2Fycmllcl9lcnJvcihzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVyciA9IDA7CisJczggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fQ0FSUklFUiwgJnZhbHVlKTsKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gdmFsdWU7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X2ZtX3Jzc2koc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisJczggdmFsdWU7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUlNTSSwgJnZhbHVlKTsKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gdmFsdWU7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfc2V0X3Jkc193bGluZShzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIHU4IHdsaW5lKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZiZGV2LT5tdXRleCk7CisKKwllcnIgPSBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19SRFNfV0xJTkUsIHdsaW5lKTsKKworCWlmICghZXJyKQorCQliZGV2LT5maWZvX3NpemUgPSB3bGluZTsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcmRzX3dsaW5lKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCXU4IHZhbHVlOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfUkRTX1dMSU5FLCAmdmFsdWUpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikgeworCQliZGV2LT5maWZvX3NpemUgPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9jaGVja3JldihzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCit7CisJaW50IGVycjsKKwl1OCB2ZXJzaW9uOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUkRTX1JFViwgJnZlcnNpb24pOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisKKwlpZiAoIWVycikgeworCQlkZXZfaW5mbygmYmRldi0+Y2xpZW50LT5kZXYsICJCQ00yMDQ4IFZlcnNpb24gMHgleFxuIiwKKwkJCXZlcnNpb24pOworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X3Jkc19ydChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIGNoYXIgKmRhdGEpCit7CisJaW50IGVyciA9IDAsIGksIGogPSAwLCBjZSA9IDAsIGNyID0gMDsKKwljaGFyIGRhdGFfYnVmZmVyW0JDTTIwNDhfTUFYX1JEU19SVCsxXTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghYmRldi0+cmRzX2luZm8udGV4dF9sZW4pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJDTTIwNDhfTUFYX1JEU19SVDsgaSsrKSB7CisJCWlmIChiZGV2LT5yZHNfaW5mby5yZHNfcnRbaV0pIHsKKwkJCWNlID0gaTsKKwkJCS8qIFNraXAgdGhlIGNhcnJpYWdlIHJldHVybiAqLworCQkJaWYgKGJkZXYtPnJkc19pbmZvLnJkc19ydFtpXSAhPSAweDBkKSB7CisJCQkJZGF0YV9idWZmZXJbaisrXSA9IGJkZXYtPnJkc19pbmZvLnJkc19ydFtpXTsKKwkJCX0gZWxzZSB7CisJCQkJY3IgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGogPD0gQkNNMjA0OF9NQVhfUkRTX1JUKQorCQlkYXRhX2J1ZmZlcltqXSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkNNMjA0OF9NQVhfUkRTX1JUOyBpKyspIHsKKwkJaWYgKCFiZGV2LT5yZHNfaW5mby5yZHNfcnRbaV0pIHsKKwkJCWlmIChjciAmJiAoaSA8IGNyKSkgeworCQkJCWVyciA9IC1FQlVTWTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKwkJCWlmIChpIDwgY2UpIHsKKwkJCQlpZiAoY3IgJiYgKGkgPj0gY3IpKQorCQkJCQlicmVhazsKKwkJCQllcnIgPSAtRUJVU1k7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisJCX0KKwl9CisKKwltZW1jcHkoZGF0YSwgZGF0YV9idWZmZXIsIHNpemVvZihkYXRhX2J1ZmZlcikpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2dldF9yZHNfcHMoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBjaGFyICpkYXRhKQoreworCWludCBlcnIgPSAwLCBpLCBqID0gMDsKKwljaGFyIGRhdGFfYnVmZmVyW0JDTTIwNDhfTUFYX1JEU19QUysxXTsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghYmRldi0+cmRzX2luZm8udGV4dF9sZW4pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJDTTIwNDhfTUFYX1JEU19QUzsgaSsrKSB7CisJCWlmIChiZGV2LT5yZHNfaW5mby5yZHNfcHNbaV0pIHsKKwkJCWRhdGFfYnVmZmVyW2orK10gPSBiZGV2LT5yZHNfaW5mby5yZHNfcHNbaV07CisJCX0gZWxzZSB7CisJCQlpZiAoaSA8IChCQ00yMDQ4X01BWF9SRFNfUFMgLSAxKSkgeworCQkJCWVyciA9IC1FQlVTWTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChqIDw9IEJDTTIwNDhfTUFYX1JEU19QUykKKwkJZGF0YV9idWZmZXJbal0gPSAwOworCisJbWVtY3B5KGRhdGEsIGRhdGFfYnVmZmVyLCBzaXplb2YoZGF0YV9idWZmZXIpKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTIwNDhfcGFyc2VfcmRzX3BpKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgaSwgY250ID0gMDsKKwl1MTYgcGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmRldi0+Zmlmb19zaXplOyBpICs9IEJDTTIwNDhfUkRTX0ZJRk9fRFVQTEVfU0laRSkgeworCisJCS8qIEJsb2NrIEEgbWF0Y2gsIG9ubHkgZGF0YSB3aXRob3V0IGNyYyBlcnJvcnMgdGFrZW4gKi8KKwkJaWYgKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gPT0gQkNNMjA0OF9SRFNfQkxPQ0tfQSkgeworCisJCQlwaSA9ICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdIDw8IDgpICsKKwkJCQliZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMl0pOworCisJCQlpZiAoIWJkZXYtPnJkc19pbmZvLnJkc19waSkgeworCQkJCWJkZXYtPnJkc19pbmZvLnJkc19waSA9IHBpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChwaSAhPSBiZGV2LT5yZHNfaW5mby5yZHNfcGkpIHsKKwkJCQljbnQrKzsKKwkJCQlpZiAoY250ID4gMykgeworCQkJCQliZGV2LT5yZHNfaW5mby5yZHNfcGkgPSBwaTsKKwkJCQkJY250ID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNudCA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9yZHNfYmxvY2tfY3JjKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgaW50IGkpCit7CisJcmV0dXJuIGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gJiBCQ00yMDQ4X1JEU19DUkNfTUFTSzsKK30KKworc3RhdGljIHZvaWQgYmNtMjA0OF9wYXJzZV9yZHNfcnRfYmxvY2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBpbnQgaSwKKwkJCQkJaW50IGluZGV4LCBpbnQgY3JjKQoreworCS8qIEdvb2QgZGF0YSB3aWxsIG92ZXJ3cml0ZSBwb29yIGRhdGEgKi8KKwlpZiAoY3JjKSB7CisJCWlmICghYmRldi0+cmRzX2luZm8ucmRzX3J0W2luZGV4XSkKKwkJCWJkZXYtPnJkc19pbmZvLnJkc19ydFtpbmRleF0gPQorCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXTsKKwkJaWYgKCFiZGV2LT5yZHNfaW5mby5yZHNfcnRbaW5kZXgrMV0pCisJCQliZGV2LT5yZHNfaW5mby5yZHNfcnRbaW5kZXgrMV0gPQorCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXTsKKwl9IGVsc2UgeworCQliZGV2LT5yZHNfaW5mby5yZHNfcnRbaW5kZXhdID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdOworCQliZGV2LT5yZHNfaW5mby5yZHNfcnRbaW5kZXgrMV0gPQorCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdOworCX0KK30KKworc3RhdGljIGludCBiY20yMDQ4X3BhcnNlX3J0X21hdGNoX2Ioc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBpbnQgaSkKK3sKKwlpbnQgY3JjLCBydF9pZCwgcnRfZ3JvdXBfYiwgcnRfYWIsIGluZGV4ID0gMDsKKworCWNyYyA9IGJjbTIwNDhfcmRzX2Jsb2NrX2NyYyhiZGV2LCBpKTsKKworCWlmIChjcmMgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCisJCXJldHVybiAtRUlPOworCisJaWYgKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2ldICYgQkNNMjA0OF9SRFNfQkxPQ0tfTUFTSykgPT0KKwkJQkNNMjA0OF9SRFNfQkxPQ0tfQikgeworCisJCXJ0X2lkID0gKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSAmCisJCQlCQ00yMDQ4X1JEU19CTE9DS19NQVNLKTsKKwkJcnRfZ3JvdXBfYiA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSAmCisJCQlCQ00yMDQ4X1JEU19HUk9VUF9BQl9NQVNLOworCQlydF9hYiA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXSAmCisJCQkJQkNNMjA0OF9SRFNfUlRfQUJfTUFTSzsKKworCQlpZiAocnRfZ3JvdXBfYiAhPSBiZGV2LT5yZHNfaW5mby5yZHNfcnRfZ3JvdXBfYikgeworCQkJbWVtc2V0KGJkZXYtPnJkc19pbmZvLnJkc19ydCwgMCwKKwkJCQlzaXplb2YoYmRldi0+cmRzX2luZm8ucmRzX3J0KSk7CisJCQliZGV2LT5yZHNfaW5mby5yZHNfcnRfZ3JvdXBfYiA9IHJ0X2dyb3VwX2I7CisJCX0KKworCQlpZiAocnRfaWQgPT0gQkNNMjA0OF9SRFNfUlQpIHsKKwkJCS8qIEEgdG8gQiBvciAodmljZSB2ZXJzYSksIG1lYW5zOiBjbGVhciBzY3JlZW4gKi8KKwkJCWlmIChydF9hYiAhPSBiZGV2LT5yZHNfaW5mby5yZHNfcnRfYWIpIHsKKwkJCQltZW1zZXQoYmRldi0+cmRzX2luZm8ucmRzX3J0LCAwLAorCQkJCQlzaXplb2YoYmRldi0+cmRzX2luZm8ucmRzX3J0KSk7CisJCQkJYmRldi0+cmRzX2luZm8ucmRzX3J0X2FiID0gcnRfYWI7CisJCQl9CisKKwkJCWluZGV4ID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdICYKKwkJCQkJQkNNMjA0OF9SRFNfUlRfSU5ERVg7CisKKwkJCWlmIChiZGV2LT5yZHNfaW5mby5yZHNfcnRfZ3JvdXBfYikKKwkJCQlpbmRleCA8PD0gMTsKKwkJCWVsc2UKKwkJCQlpbmRleCA8PD0gMjsKKworCQkJcmV0dXJuIGluZGV4OworCQl9CisJfQorCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9wYXJzZV9ydF9tYXRjaF9jKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiwgaW50IGksCisJCQkJCWludCBpbmRleCkKK3sKKwlpbnQgY3JjOworCisJY3JjID0gYmNtMjA0OF9yZHNfYmxvY2tfY3JjKGJkZXYsIGkpOworCisJaWYgKGNyYyA9PSBCQ00yMDQ4X1JEU19DUkNfVU5SRUNPVkFSQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlCVUdfT04oKGluZGV4KzIpID49IEJDTTIwNDhfTUFYX1JEU19SVCk7CisKKwlpZiAoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gJiBCQ00yMDQ4X1JEU19CTE9DS19NQVNLKSA9PQorCQlCQ00yMDQ4X1JEU19CTE9DS19DKSB7CisJCWlmIChiZGV2LT5yZHNfaW5mby5yZHNfcnRfZ3JvdXBfYikKKwkJCXJldHVybiAxOworCQliY20yMDQ4X3BhcnNlX3Jkc19ydF9ibG9jayhiZGV2LCBpLCBpbmRleCwgY3JjKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTIwNDhfcGFyc2VfcnRfbWF0Y2hfZChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIGludCBpLAorCQkJCQlpbnQgaW5kZXgpCit7CisJaW50IGNyYzsKKworCWNyYyA9IGJjbTIwNDhfcmRzX2Jsb2NrX2NyYyhiZGV2LCBpKTsKKworCWlmIChjcmMgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCisJCXJldHVybjsKKworCUJVR19PTigoaW5kZXgrNCkgPj0gQkNNMjA0OF9NQVhfUkRTX1JUKTsKKworCWlmICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpXSAmIEJDTTIwNDhfUkRTX0JMT0NLX01BU0spID09CisJCUJDTTIwNDhfUkRTX0JMT0NLX0QpCisJCWJjbTIwNDhfcGFyc2VfcmRzX3J0X2Jsb2NrKGJkZXYsIGksIGluZGV4KzIsIGNyYyk7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9wYXJzZV9yZHNfcnQoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBpLCBpbmRleCA9IDAsIGNyYywgbWF0Y2hfYiA9IDAsIG1hdGNoX2MgPSAwLCBtYXRjaF9kID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZGV2LT5maWZvX3NpemU7IGkgKz0gQkNNMjA0OF9SRFNfRklGT19EVVBMRV9TSVpFKSB7CisKKwkJaWYgKG1hdGNoX2IpIHsKKwkJCW1hdGNoX2IgPSAwOworCQkJaW5kZXggPSBiY20yMDQ4X3BhcnNlX3J0X21hdGNoX2IoYmRldiwgaSk7CisJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSAoQkNNMjA0OF9NQVhfUkRTX1JUIC0gNSkpCisJCQkJbWF0Y2hfYyA9IDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaF9jKSB7CisJCQltYXRjaF9jID0gMDsKKwkJCWlmIChiY20yMDQ4X3BhcnNlX3J0X21hdGNoX2MoYmRldiwgaSwgaW5kZXgpKQorCQkJCW1hdGNoX2QgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hfZCkgeworCQkJbWF0Y2hfZCA9IDA7CisJCQliY20yMDQ4X3BhcnNlX3J0X21hdGNoX2QoYmRldiwgaSwgaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBTa2lwIGVycm9uZW91cyBibG9ja3MgZHVlIHRvIG1lc3NlZCB1cCBBIGJsb2NrIGFsdG9nZXRoZXIgKi8KKwkJaWYgKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2ldICYgQkNNMjA0OF9SRFNfQkxPQ0tfTUFTSykKKwkJCT09IEJDTTIwNDhfUkRTX0JMT0NLX0EpIHsKKwkJCWNyYyA9IGJjbTIwNDhfcmRzX2Jsb2NrX2NyYyhiZGV2LCBpKTsKKwkJCWlmIChjcmMgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCisJCQkJY29udGludWU7CisJCQkvKiBTeW5jcm9uaXplIHRvIGEgZ29vZCBSRFMgUEkgKi8KKwkJCWlmICgoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSA8PCA4KSArCisJCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdKSA9PQorCQkJCWJkZXYtPnJkc19pbmZvLnJkc19waSkKKwkJCQkJbWF0Y2hfYiA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtMjA0OF9wYXJzZV9yZHNfcHNfYmxvY2soc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBpbnQgaSwKKwkJCQkJaW50IGluZGV4LCBpbnQgY3JjKQoreworCS8qIEdvb2QgZGF0YSB3aWxsIG92ZXJ3cml0ZSBwb29yIGRhdGEgKi8KKwlpZiAoY3JjKSB7CisJCWlmICghYmRldi0+cmRzX2luZm8ucmRzX3BzW2luZGV4XSkKKwkJCWJkZXYtPnJkc19pbmZvLnJkc19wc1tpbmRleF0gPQorCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXTsKKwkJaWYgKCFiZGV2LT5yZHNfaW5mby5yZHNfcHNbaW5kZXgrMV0pCisJCQliZGV2LT5yZHNfaW5mby5yZHNfcHNbaW5kZXgrMV0gPQorCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXTsKKwl9IGVsc2UgeworCQliZGV2LT5yZHNfaW5mby5yZHNfcHNbaW5kZXhdID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdOworCQliZGV2LT5yZHNfaW5mby5yZHNfcHNbaW5kZXgrMV0gPQorCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdOworCX0KK30KKworc3RhdGljIGludCBiY20yMDQ4X3BhcnNlX3BzX21hdGNoX2Moc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBpbnQgaSwKKwkJCQkJaW50IGluZGV4KQoreworCWludCBjcmM7CisKKwljcmMgPSBiY20yMDQ4X3Jkc19ibG9ja19jcmMoYmRldiwgaSk7CisKKwlpZiAoY3JjID09IEJDTTIwNDhfUkRTX0NSQ19VTlJFQ09WQVJBQkxFKQorCQlyZXR1cm4gMDsKKworCWlmICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpXSAmIEJDTTIwNDhfUkRTX0JMT0NLX01BU0spID09CisJCUJDTTIwNDhfUkRTX0JMT0NLX0MpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTIwNDhfcGFyc2VfcHNfbWF0Y2hfZChzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIGludCBpLAorCQkJCQlpbnQgaW5kZXgpCit7CisJaW50IGNyYzsKKworCWNyYyA9IGJjbTIwNDhfcmRzX2Jsb2NrX2NyYyhiZGV2LCBpKTsKKworCWlmIChjcmMgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCisJCXJldHVybjsKKworCWlmICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpXSAmIEJDTTIwNDhfUkRTX0JMT0NLX01BU0spID09CisJCUJDTTIwNDhfUkRTX0JMT0NLX0QpCisJCWJjbTIwNDhfcGFyc2VfcmRzX3BzX2Jsb2NrKGJkZXYsIGksIGluZGV4LCBjcmMpOworfQorCitzdGF0aWMgaW50IGJjbTIwNDhfcGFyc2VfcHNfbWF0Y2hfYihzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYsIGludCBpKQoreworCWludCBjcmMsIGluZGV4LCBwc19pZCwgcHNfZ3JvdXA7CisKKwljcmMgPSBiY20yMDQ4X3Jkc19ibG9ja19jcmMoYmRldiwgaSk7CisKKwlpZiAoY3JjID09IEJDTTIwNDhfUkRTX0NSQ19VTlJFQ09WQVJBQkxFKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEJsb2NrIEIgUmFkaW8gUFMgbWF0Y2ggKi8KKwlpZiAoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gJiBCQ00yMDQ4X1JEU19CTE9DS19NQVNLKSA9PQorCQlCQ00yMDQ4X1JEU19CTE9DS19CKSB7CisJCXBzX2lkID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdICYKKwkJCUJDTTIwNDhfUkRTX0JMT0NLX01BU0s7CisJCXBzX2dyb3VwID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdICYKKwkJCUJDTTIwNDhfUkRTX0dST1VQX0FCX01BU0s7CisKKwkJLyoKKwkJICogUG9vciBSU1NJIHdpbGwgbGVhZCB0byBSRFMgZGF0YSBjb3JydXB0aW9uCisJCSAqIFNvIHVzaW5nIDMgKHNhbWUpIHNlcXVlbnRpYWwgdmFsdWVzIHRvIGp1c3RpZnkgbWFqb3IgY2hhbmdlcworCQkgKi8KKwkJaWYgKHBzX2dyb3VwICE9IGJkZXYtPnJkc19pbmZvLnJkc19wc19ncm91cCkgeworCQkJaWYgKGNyYyA9PSBCQ00yMDQ4X1JEU19DUkNfTk9ORSkgeworCQkJCWJkZXYtPnJkc19pbmZvLnJkc19wc19ncm91cF9jbnQrKzsKKwkJCQlpZiAoYmRldi0+cmRzX2luZm8ucmRzX3BzX2dyb3VwX2NudCA+IDIpIHsKKwkJCQkJYmRldi0+cmRzX2luZm8ucmRzX3BzX2dyb3VwID0gcHNfZ3JvdXA7CisJCQkJCWJkZXYtPnJkc19pbmZvLnJkc19wc19ncm91cF9jbnQJPSAwOworCQkJCQlkZXZfZXJyKCZiZGV2LT5jbGllbnQtPmRldiwKKwkJCQkJCSJSRFMgUFMgR3JvdXAgY2hhbmdlIVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQliZGV2LT5yZHNfaW5mby5yZHNfcHNfZ3JvdXBfY250ID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwc19pZCA9PSBCQ00yMDQ4X1JEU19QUykgeworCQkJaW5kZXggPSBiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMl0gJgorCQkJCUJDTTIwNDhfUkRTX1BTX0lOREVYOworCQkJaW5kZXggPDw9IDE7CisJCQlyZXR1cm4gaW5kZXg7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgYmNtMjA0OF9wYXJzZV9yZHNfcHMoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBpLCBpbmRleCA9IDAsIGNyYywgbWF0Y2hfYiA9IDAsIG1hdGNoX2MgPSAwLCBtYXRjaF9kID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZGV2LT5maWZvX3NpemU7IGkgKz0gQkNNMjA0OF9SRFNfRklGT19EVVBMRV9TSVpFKSB7CisKKwkJaWYgKG1hdGNoX2IpIHsKKwkJCW1hdGNoX2IgPSAwOworCQkJaW5kZXggPSBiY20yMDQ4X3BhcnNlX3BzX21hdGNoX2IoYmRldiwgaSk7CisJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IChCQ00yMDQ4X01BWF9SRFNfUFMgLSAxKSkKKwkJCQltYXRjaF9jID0gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG1hdGNoX2MpIHsKKwkJCW1hdGNoX2MgPSAwOworCQkJaWYgKGJjbTIwNDhfcGFyc2VfcHNfbWF0Y2hfYyhiZGV2LCBpLCBpbmRleCkpCisJCQkJbWF0Y2hfZCA9IDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaF9kKSB7CisJCQltYXRjaF9kID0gMDsKKwkJCWJjbTIwNDhfcGFyc2VfcHNfbWF0Y2hfZChiZGV2LCBpLCBpbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNraXAgZXJyb25lb3VzIGJsb2NrcyBkdWUgdG8gbWVzc2VkIHVwIEEgYmxvY2sgYWx0b2dldGhlciAqLworCQlpZiAoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gJiBCQ00yMDQ4X1JEU19CTE9DS19NQVNLKQorCQkJPT0gQkNNMjA0OF9SRFNfQkxPQ0tfQSkgeworCQkJY3JjID0gYmNtMjA0OF9yZHNfYmxvY2tfY3JjKGJkZXYsIGkpOworCQkJaWYgKGNyYyA9PSBCQ00yMDQ4X1JEU19DUkNfVU5SRUNPVkFSQUJMRSkKKwkJCQljb250aW51ZTsKKwkJCS8qIFN5bmNyb25pemUgdG8gYSBnb29kIFJEUyBQSSAqLworCQkJaWYgKCgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdIDw8IDgpICsKKwkJCQliZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMl0pID09CisJCQkJYmRldi0+cmRzX2luZm8ucmRzX3BpKQorCQkJCQltYXRjaF9iID0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYmNtMjA0OF9yZHNfZmlmb19yZWNlaXZlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmYmRldi0+bXV0ZXgpOworCisJZXJyID0gYmNtMjA0OF9yZWN2X2R1cGxlcyhiZGV2LCBCQ00yMDQ4X0kyQ19SRFNfREFUQSwKKwkJCQliZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0LCBiZGV2LT5maWZvX3NpemUpOworCWlmIChlcnIgIT0gMikgeworCQlkZXZfZXJyKCZiZGV2LT5jbGllbnQtPmRldiwgIlJEUyBSZWFkIHByb2JsZW1cbiIpOworCQltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWJkZXYtPnJkc19pbmZvLnRleHRfbGVuID0gYmRldi0+Zmlmb19zaXplOworCisJYmNtMjA0OF9wYXJzZV9yZHNfcGkoYmRldik7CisJYmNtMjA0OF9wYXJzZV9yZHNfcnQoYmRldik7CisJYmNtMjA0OF9wYXJzZV9yZHNfcHMoYmRldik7CisKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYmRldi0+cmVhZF9xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9nZXRfcmRzX2RhdGEoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LCBjaGFyICpkYXRhKQoreworCWludCBlcnIgPSAwLCBpLCBwID0gMDsKKwljaGFyICpkYXRhX2J1ZmZlcjsKKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKworCWlmICghYmRldi0+cmRzX2luZm8udGV4dF9sZW4pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZGF0YV9idWZmZXIgPSBremFsbG9jKEJDTTIwNDhfTUFYX1JEU19SQURJT19URVhUKjUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YV9idWZmZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGJkZXYtPnJkc19pbmZvLnRleHRfbGVuOyBpKyspIHsKKwkJcCArPSBzcHJpbnRmKGRhdGFfYnVmZmVyK3AsICIleCAiLAorCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpXSk7CisJfQorCisJbWVtY3B5KGRhdGEsIGRhdGFfYnVmZmVyLCBwKTsKKwlrZnJlZShkYXRhX2J1ZmZlcik7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmJkZXYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQkNNMjA0OCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBpbnQgYmNtMjA0OF9pbml0KHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PTik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXhpdDsKKworCWVyciA9IGJjbTIwNDhfc2V0X2F1ZGlvX3JvdXRlKGJkZXYsIEJDTTIwNDhfQVVESU9fUk9VVEVfREFDKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0OworCisJZXJyID0gYmNtMjA0OF9zZXRfZGFjX291dHB1dChiZGV2LCBCQ00yMDQ4X0RBQ19PVVRQVVRfTEVGVCB8CisJCUJDTTIwNDhfREFDX09VVFBVVF9SSUdIVCk7CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUJDTTIwNDggZGVmYXVsdCBkZWluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBpbnQgYmNtMjA0OF9kZWluaXQoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBiY20yMDQ4X3NldF9hdWRpb19yb3V0ZShiZGV2LCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0OworCisJZXJyID0gYmNtMjA0OF9zZXRfZGFjX291dHB1dChiZGV2LCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0OworCisJZXJyID0gYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PRkYpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGV4aXQ7CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUJDTTIwNDggcHJvYmUgc2VxdWVuY2UKKyAqLworc3RhdGljIGludCBiY20yMDQ4X3Byb2JlKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PTik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5sb2NrOworCisJZXJyID0gYmNtMjA0OF9jaGVja3JldihiZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwllcnIgPSBiY20yMDQ4X3NldF9tdXRlKGJkZXYsIEJDTTIwNDhfREVGQVVMVF9NVVRFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwllcnIgPSBiY20yMDQ4X3NldF9yZWdpb24oYmRldiwgQkNNMjA0OF9ERUZBVUxUX1JFR0lPTik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5sb2NrOworCisJZXJyID0gYmNtMjA0OF9zZXRfZm1fc2VhcmNoX3Jzc2lfdGhyZXNob2xkKGJkZXYsCisJCQkJCUJDTTIwNDhfREVGQVVMVF9SU1NJX1RIUkVTSE9MRCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5sb2NrOworCisJZXJyID0gYmNtMjA0OF9zZXRfZm1fYXV0b21hdGljX3N0ZXJlb19tb25vKGJkZXYsIEJDTTIwNDhfSVRFTV9FTkFCTEVEKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwllcnIgPSBiY20yMDQ4X2dldF9yZHNfd2xpbmUoYmRldik7CisJaWYgKGVyciA8IEJDTTIwNDhfREVGQVVMVF9SRFNfV0xJTkUpCisJCWVyciA9IGJjbTIwNDhfc2V0X3Jkc193bGluZShiZGV2LCBCQ00yMDQ4X0RFRkFVTFRfUkRTX1dMSU5FKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwllcnIgPSBiY20yMDQ4X3NldF9wb3dlcl9zdGF0ZShiZGV2LCBCQ00yMDQ4X1BPV0VSX09GRik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiZGV2LT5yZWFkX3F1ZXVlKTsKKwliZGV2LT5yZHNfZGF0YV9hdmFpbGFibGUgPSAwOworCWJkZXYtPnJkX2luZGV4ID0gMDsKKwliZGV2LT51c2VycyA9IDA7CisKK3VubG9jazoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQkNNMjA0OCB3b3JrcXVldWUgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBiY20yMDQ4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldjsKKwl1OCBmbGFnX2xzYiwgZmxhZ19tc2IsIGZsYWdzOworCisJYmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UsIHdvcmspOworCWJjbTIwNDhfcmVjdl9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19GTEFHMCwgJmZsYWdfbHNiKTsKKwliY20yMDQ4X3JlY3ZfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfRkxBRzEsICZmbGFnX21zYik7CisKKwlpZiAoZmxhZ19sc2IgJiAoQkNNMjA0OF9GTV9GTEFHX1NFQVJDSF9UVU5FX0ZJTklTSEVEIHwKKwkJCUJDTTIwNDhfRk1fRkxBR19TRUFSQ0hfVFVORV9GQUlMKSkgeworCisJCWlmIChmbGFnX2xzYiAmIEJDTTIwNDhfRk1fRkxBR19TRUFSQ0hfVFVORV9GQUlMKQorCQkJYmRldi0+c2Nhbl9zdGF0ZSA9IEJDTTIwNDhfU0NBTl9GQUlMOworCQllbHNlCisJCQliZGV2LT5zY2FuX3N0YXRlID0gQkNNMjA0OF9TQ0FOX09LOworCisJCWNvbXBsZXRlKCZiZGV2LT5jb21wbCk7CisJfQorCisJaWYgKGZsYWdfbXNiICYgQkNNMjA0OF9SRFNfRkxBR19GSUZPX1dMSU5FKSB7CisJCWJjbTIwNDhfcmRzX2ZpZm9fcmVjZWl2ZShiZGV2KTsKKwkJaWYgKGJkZXYtPnJkc19zdGF0ZSkgeworCQkJZmxhZ3MgPQlCQ00yMDQ4X1JEU19GTEFHX0ZJRk9fV0xJTkU7CisJCQliY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfTUFTSzEsCisJCQkJCQlmbGFncyk7CisJCX0KKwkJYmRldi0+cmRzX2RhdGFfYXZhaWxhYmxlID0gMTsKKwkJYmRldi0+cmRfaW5kZXggPSAwOyAvKiBuZXcgZGF0YSwgbmV3IHN0YXJ0ICovCisJfQorfQorCisvKgorICoJQkNNMjA0OCBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYmNtMjA0OF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYgPSBkZXY7CisKKwlkZXZfZGJnKCZiZGV2LT5jbGllbnQtPmRldiwgIklSUSBjYWxsZWQsIHF1ZXVpbmcgd29ya1xuIik7CisJaWYgKGJkZXYtPnBvd2VyX3N0YXRlKQorCQlzY2hlZHVsZV93b3JrKCZiZGV2LT53b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqCUJDTTIwNDggc3lzZnMgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgcHJvcGVydHlfd3JpdGUocHJvcCwgdHlwZSwgbWFzaywgY2hlY2spCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGJjbTIwNDhfIyNwcm9wIyNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljb25zdCBjaGFyICpidWYsCQlcCisJCQkJCXNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCXR5cGUgdmFsdWU7CQkJCQkJCVwKKwlpbnQgZXJyOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKCFiZGV2KQkJCQkJCQlcCisJCXJldHVybiAtRU5PREVWOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzc2NhbmYoYnVmLCBtYXNrLCAmdmFsdWUpOwkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChjaGVjaykJCQkJCQkJXAorCQlyZXR1cm4gLUVET007CQkJCQkJXAorCQkJCQkJCQkJXAorCWVyciA9IGJjbTIwNDhfc2V0XyMjcHJvcChiZGV2LCB2YWx1ZSk7CQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwkJCQkJXAorfQorCisjZGVmaW5lIHByb3BlcnR5X3JlYWQocHJvcCwgc2l6ZSwgbWFzaykJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGJjbTIwNDhfIyNwcm9wIyNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJCWNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCWludCB2YWx1ZTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghYmRldikJCQkJCQkJXAorCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCisJCQkJCQkJCQlcCisJdmFsdWUgPSBiY20yMDQ4X2dldF8jI3Byb3AoYmRldik7CQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAodmFsdWUgPj0gMCkJCQkJCQkJXAorCQl2YWx1ZSA9IHNwcmludGYoYnVmLCBtYXNrICJcbiIsIHZhbHVlKTsJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHZhbHVlOwkJCQkJCQlcCit9CisKKyNkZWZpbmUgcHJvcGVydHlfc2lnbmVkX3JlYWQocHJvcCwgc2l6ZSwgbWFzaykJCQkJXAorc3RhdGljIHNzaXplX3QgYmNtMjA0OF8jI3Byb3AjI19yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY2hhciAqYnVmKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCisJc2l6ZSB2YWx1ZTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghYmRldikJCQkJCQkJXAorCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCisJCQkJCQkJCQlcCisJdmFsdWUgPSBiY20yMDQ4X2dldF8jI3Byb3AoYmRldik7CQkJCVwKKwkJCQkJCQkJCVwKKwl2YWx1ZSA9IHNwcmludGYoYnVmLCBtYXNrICJcbiIsIHZhbHVlKTsJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiB2YWx1ZTsJCQkJCQkJXAorfQorCisjZGVmaW5lIERFRklORV9TWVNGU19QUk9QRVJUWShwcm9wLCBzaWduYWwsIHNpemUsIG1hc2ssIGNoZWNrKQkJXAorcHJvcGVydHlfd3JpdGUocHJvcCwgc2lnbmFsIHNpemUsIG1hc2ssIGNoZWNrKQkJCQlcCitwcm9wZXJ0eV9yZWFkKHByb3AsIHNpemUsIG1hc2spCisKKyNkZWZpbmUgcHJvcGVydHlfc3RyX3JlYWQocHJvcCwgc2l6ZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGJjbTIwNDhfIyNwcm9wIyNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJCWNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCWludCBjb3VudDsJCQkJCQkJXAorCXU4ICpvdXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoIWJkZXYpCQkJCQkJCVwKKwkJcmV0dXJuIC1FTk9ERVY7CQkJCQkJXAorCQkJCQkJCQkJXAorCW91dCA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwkJCQlcCisJaWYgKCFvdXQpCQkJCQkJCVwKKwkJcmV0dXJuIC1FTk9NRU07CQkJCQkJXAorCQkJCQkJCQkJXAorCWJjbTIwNDhfZ2V0XyMjcHJvcChiZGV2LCBvdXQpOwkJCQkJXAorCWNvdW50ID0gc3ByaW50ZihidWYsICIlc1xuIiwgb3V0KTsJCQkJXAorCQkJCQkJCQkJXAorCWtmcmVlKG91dCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30KKworREVGSU5FX1NZU0ZTX1BST1BFUlRZKHBvd2VyX3N0YXRlLCB1bnNpZ25lZCwgaW50LCAiJXUiLCAwKQorREVGSU5FX1NZU0ZTX1BST1BFUlRZKG11dGUsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoYXVkaW9fcm91dGUsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoZGFjX291dHB1dCwgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKKworREVGSU5FX1NZU0ZTX1BST1BFUlRZKGZtX2hpX2xvX2luamVjdGlvbiwgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKK0RFRklORV9TWVNGU19QUk9QRVJUWShmbV9mcmVxdWVuY3ksIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoZm1fYWZfZnJlcXVlbmN5LCB1bnNpZ25lZCwgaW50LCAiJXUiLCAwKQorREVGSU5FX1NZU0ZTX1BST1BFUlRZKGZtX2RlZW1waGFzaXMsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoZm1fcmRzX21hc2ssIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoZm1fYmVzdF90dW5lX21vZGUsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkoZm1fc2VhcmNoX3Jzc2lfdGhyZXNob2xkLCB1bnNpZ25lZCwgaW50LCAiJXUiLCAwKQorREVGSU5FX1NZU0ZTX1BST1BFUlRZKGZtX3NlYXJjaF9tb2RlX2RpcmVjdGlvbiwgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKK0RFRklORV9TWVNGU19QUk9QRVJUWShmbV9zZWFyY2hfdHVuZV9tb2RlLCB1bnNpZ25lZCwgaW50LCAiJXUiLCB2YWx1ZSA+IDMpCisKK0RFRklORV9TWVNGU19QUk9QRVJUWShyZHMsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkocmRzX2JfYmxvY2tfbWFzaywgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKK0RFRklORV9TWVNGU19QUk9QRVJUWShyZHNfYl9ibG9ja19tYXRjaCwgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKK0RFRklORV9TWVNGU19QUk9QRVJUWShyZHNfcGlfbWFzaywgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKK0RFRklORV9TWVNGU19QUk9QRVJUWShyZHNfcGlfbWF0Y2gsIHVuc2lnbmVkLCBpbnQsICIldSIsIDApCitERUZJTkVfU1lTRlNfUFJPUEVSVFkocmRzX3dsaW5lLCB1bnNpZ25lZCwgaW50LCAiJXUiLCAwKQorcHJvcGVydHlfcmVhZChyZHNfcGksIHVuc2lnbmVkIGludCwgIiV4IikKK3Byb3BlcnR5X3N0cl9yZWFkKHJkc19ydCwgKEJDTTIwNDhfTUFYX1JEU19SVCArIDEpKQorcHJvcGVydHlfc3RyX3JlYWQocmRzX3BzLCAoQkNNMjA0OF9NQVhfUkRTX1BTICsgMSkpCisKK3Byb3BlcnR5X3JlYWQoZm1fcmRzX2ZsYWdzLCB1bnNpZ25lZCBpbnQsICIldSIpCitwcm9wZXJ0eV9zdHJfcmVhZChyZHNfZGF0YSwgQkNNMjA0OF9NQVhfUkRTX1JBRElPX1RFWFQqNSkKKworcHJvcGVydHlfcmVhZChyZWdpb25fYm90dG9tX2ZyZXF1ZW5jeSwgdW5zaWduZWQgaW50LCAiJXUiKQorcHJvcGVydHlfcmVhZChyZWdpb25fdG9wX2ZyZXF1ZW5jeSwgdW5zaWduZWQgaW50LCAiJXUiKQorcHJvcGVydHlfc2lnbmVkX3JlYWQoZm1fY2Fycmllcl9lcnJvciwgaW50LCAiJWQiKQorcHJvcGVydHlfc2lnbmVkX3JlYWQoZm1fcnNzaSwgaW50LCAiJWQiKQorREVGSU5FX1NZU0ZTX1BST1BFUlRZKHJlZ2lvbiwgdW5zaWduZWQsIGludCwgIiV1IiwgMCkKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHJzW10gPSB7CisJX19BVFRSKHBvd2VyX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwgYmNtMjA0OF9wb3dlcl9zdGF0ZV9yZWFkLAorCQliY20yMDQ4X3Bvd2VyX3N0YXRlX3dyaXRlKSwKKwlfX0FUVFIobXV0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJjbTIwNDhfbXV0ZV9yZWFkLAorCQliY20yMDQ4X211dGVfd3JpdGUpLAorCV9fQVRUUihhdWRpb19yb3V0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJjbTIwNDhfYXVkaW9fcm91dGVfcmVhZCwKKwkJYmNtMjA0OF9hdWRpb19yb3V0ZV93cml0ZSksCisJX19BVFRSKGRhY19vdXRwdXQsIFNfSVJVR08gfCBTX0lXVVNSLCBiY20yMDQ4X2RhY19vdXRwdXRfcmVhZCwKKwkJYmNtMjA0OF9kYWNfb3V0cHV0X3dyaXRlKSwKKwlfX0FUVFIoZm1faGlfbG9faW5qZWN0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYmNtMjA0OF9mbV9oaV9sb19pbmplY3Rpb25fcmVhZCwKKwkJYmNtMjA0OF9mbV9oaV9sb19pbmplY3Rpb25fd3JpdGUpLAorCV9fQVRUUihmbV9mcmVxdWVuY3ksIFNfSVJVR08gfCBTX0lXVVNSLCBiY20yMDQ4X2ZtX2ZyZXF1ZW5jeV9yZWFkLAorCQliY20yMDQ4X2ZtX2ZyZXF1ZW5jeV93cml0ZSksCisJX19BVFRSKGZtX2FmX2ZyZXF1ZW5jeSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWJjbTIwNDhfZm1fYWZfZnJlcXVlbmN5X3JlYWQsCisJCWJjbTIwNDhfZm1fYWZfZnJlcXVlbmN5X3dyaXRlKSwKKwlfX0FUVFIoZm1fZGVlbXBoYXNpcywgU19JUlVHTyB8IFNfSVdVU1IsIGJjbTIwNDhfZm1fZGVlbXBoYXNpc19yZWFkLAorCQliY20yMDQ4X2ZtX2RlZW1waGFzaXNfd3JpdGUpLAorCV9fQVRUUihmbV9yZHNfbWFzaywgU19JUlVHTyB8IFNfSVdVU1IsIGJjbTIwNDhfZm1fcmRzX21hc2tfcmVhZCwKKwkJYmNtMjA0OF9mbV9yZHNfbWFza193cml0ZSksCisJX19BVFRSKGZtX2Jlc3RfdHVuZV9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYmNtMjA0OF9mbV9iZXN0X3R1bmVfbW9kZV9yZWFkLAorCQliY20yMDQ4X2ZtX2Jlc3RfdHVuZV9tb2RlX3dyaXRlKSwKKwlfX0FUVFIoZm1fc2VhcmNoX3Jzc2lfdGhyZXNob2xkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYmNtMjA0OF9mbV9zZWFyY2hfcnNzaV90aHJlc2hvbGRfcmVhZCwKKwkJYmNtMjA0OF9mbV9zZWFyY2hfcnNzaV90aHJlc2hvbGRfd3JpdGUpLAorCV9fQVRUUihmbV9zZWFyY2hfbW9kZV9kaXJlY3Rpb24sIFNfSVJVR08gfCBTX0lXVVNSLAorCQliY20yMDQ4X2ZtX3NlYXJjaF9tb2RlX2RpcmVjdGlvbl9yZWFkLAorCQliY20yMDQ4X2ZtX3NlYXJjaF9tb2RlX2RpcmVjdGlvbl93cml0ZSksCisJX19BVFRSKGZtX3NlYXJjaF90dW5lX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQliY20yMDQ4X2ZtX3NlYXJjaF90dW5lX21vZGVfcmVhZCwKKwkJYmNtMjA0OF9mbV9zZWFyY2hfdHVuZV9tb2RlX3dyaXRlKSwKKwlfX0FUVFIocmRzLCBTX0lSVUdPIHwgU19JV1VTUiwgYmNtMjA0OF9yZHNfcmVhZCwKKwkJYmNtMjA0OF9yZHNfd3JpdGUpLAorCV9fQVRUUihyZHNfYl9ibG9ja19tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYmNtMjA0OF9yZHNfYl9ibG9ja19tYXNrX3JlYWQsCisJCWJjbTIwNDhfcmRzX2JfYmxvY2tfbWFza193cml0ZSksCisJX19BVFRSKHJkc19iX2Jsb2NrX21hdGNoLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYmNtMjA0OF9yZHNfYl9ibG9ja19tYXRjaF9yZWFkLAorCQliY20yMDQ4X3Jkc19iX2Jsb2NrX21hdGNoX3dyaXRlKSwKKwlfX0FUVFIocmRzX3BpX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLCBiY20yMDQ4X3Jkc19waV9tYXNrX3JlYWQsCisJCWJjbTIwNDhfcmRzX3BpX21hc2tfd3JpdGUpLAorCV9fQVRUUihyZHNfcGlfbWF0Y2gsIFNfSVJVR08gfCBTX0lXVVNSLCBiY20yMDQ4X3Jkc19waV9tYXRjaF9yZWFkLAorCQliY20yMDQ4X3Jkc19waV9tYXRjaF93cml0ZSksCisJX19BVFRSKHJkc193bGluZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJjbTIwNDhfcmRzX3dsaW5lX3JlYWQsCisJCWJjbTIwNDhfcmRzX3dsaW5lX3dyaXRlKSwKKwlfX0FUVFIocmRzX3BpLCBTX0lSVUdPLCBiY20yMDQ4X3Jkc19waV9yZWFkLCBOVUxMKSwKKwlfX0FUVFIocmRzX3J0LCBTX0lSVUdPLCBiY20yMDQ4X3Jkc19ydF9yZWFkLCBOVUxMKSwKKwlfX0FUVFIocmRzX3BzLCBTX0lSVUdPLCBiY20yMDQ4X3Jkc19wc19yZWFkLCBOVUxMKSwKKwlfX0FUVFIoZm1fcmRzX2ZsYWdzLCBTX0lSVUdPLCBiY20yMDQ4X2ZtX3Jkc19mbGFnc19yZWFkLCBOVUxMKSwKKwlfX0FUVFIocmVnaW9uX2JvdHRvbV9mcmVxdWVuY3ksIFNfSVJVR08sCisJCWJjbTIwNDhfcmVnaW9uX2JvdHRvbV9mcmVxdWVuY3lfcmVhZCwgTlVMTCksCisJX19BVFRSKHJlZ2lvbl90b3BfZnJlcXVlbmN5LCBTX0lSVUdPLAorCQliY20yMDQ4X3JlZ2lvbl90b3BfZnJlcXVlbmN5X3JlYWQsIE5VTEwpLAorCV9fQVRUUihmbV9jYXJyaWVyX2Vycm9yLCBTX0lSVUdPLAorCQliY20yMDQ4X2ZtX2NhcnJpZXJfZXJyb3JfcmVhZCwgTlVMTCksCisJX19BVFRSKGZtX3Jzc2ksIFNfSVJVR08sCisJCWJjbTIwNDhfZm1fcnNzaV9yZWFkLCBOVUxMKSwKKwlfX0FUVFIocmVnaW9uLCBTX0lSVUdPIHwgU19JV1VTUiwgYmNtMjA0OF9yZWdpb25fcmVhZCwKKwkJYmNtMjA0OF9yZWdpb25fd3JpdGUpLAorCV9fQVRUUihyZHNfZGF0YSwgU19JUlVHTywgYmNtMjA0OF9yZHNfZGF0YV9yZWFkLCBOVUxMKSwKK307CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zeXNmc191bnJlZ2lzdGVyX3Byb3BlcnRpZXMoc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2LAorCQkJCQkJaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJkZXYtPmNsaWVudC0+ZGV2LCAmYXR0cnNbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF9zeXNmc19yZWdpc3Rlcl9wcm9wZXJ0aWVzKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0dHJzKTsgaSsrKSB7CisJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmJkZXYtPmNsaWVudC0+ZGV2LCAmYXR0cnNbaV0pICE9IDApIHsKKwkJCWRldl9lcnIoJmJkZXYtPmNsaWVudC0+ZGV2LAorCQkJCQkiY291bGQgbm90IHJlZ2lzdGVyIHN5c2ZzIGVudHJ5XG4iKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWJjbTIwNDhfc3lzZnNfdW5yZWdpc3Rlcl9wcm9wZXJ0aWVzKGJkZXYsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgYmNtMjA0OF9mb3BzX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCWJkZXYtPnVzZXJzKys7CisJYmRldi0+cmRfaW5kZXggPSAwOworCWJkZXYtPnJkc19kYXRhX2F2YWlsYWJsZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X2ZvcHNfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJYmRldi0+dXNlcnMtLTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJjbTIwNDhfZm9wc19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnB0cykKK3sKKwlzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXR2YWwgPSAwOworCisJcG9sbF93YWl0KGZpbGUsICZiZGV2LT5yZWFkX3F1ZXVlLCBwdHMpOworCisJaWYgKGJkZXYtPnJkc19kYXRhX2F2YWlsYWJsZSkKKwkJcmV0dmFsID0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJjbTIwNDhfZm9wc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisKKwkvKiB3ZSByZXR1cm4gYXQgbGVhc3QgMyBieXRlcywgb25lIGJsb2NrICovCisJY291bnQgPSAoY291bnQgLyAzKSAqIDM7IC8qIG9ubHkgbXVsdGlwbGVzIG9mIDMgKi8KKwlpZiAoY291bnQgPCAzKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwl3aGlsZSAoIWJkZXYtPnJkc19kYXRhX2F2YWlsYWJsZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FV09VTERCTE9DSzsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZiZGV2LT5yZWFkX3F1ZXVlKTsgKi8KKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiZGV2LT5yZWFkX3F1ZXVlLAorCQkJYmRldi0+cmRzX2RhdGFfYXZhaWxhYmxlKSA8IDApIHsKKwkJCXJldHZhbCA9IC1FSU5UUjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCW11dGV4X2xvY2soJmJkZXYtPm11dGV4KTsKKwkvKiBjb3B5IGRhdGEgdG8gdXNlcnNwYWNlICovCisJaSA9IGJkZXYtPmZpZm9fc2l6ZSAtIGJkZXYtPnJkX2luZGV4OworCWlmIChjb3VudCA+IGkpCisJCWNvdW50ID0gKGkgLyAzKSAqIDM7CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGNvdW50KSB7CisJCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzNdOworCQl0bXBidWZbaV0gPSBiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2JkZXYtPnJkX2luZGV4K2krMl07CisJCXRtcGJ1ZltpKzFdID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpKzFdOworCQl0bXBidWZbaSsyXSA9ICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpXQorCQkJCSYgMHhmMCkgPj4gNCk7CisJCWlmICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpXSAmCisJCQlCQ00yMDQ4X1JEU19DUkNfTUFTSykgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCisJCQl0bXBidWZbaSsyXSB8PSAweDgwOworCQlpZiAoY29weV90b191c2VyKGJ1ZitpLCB0bXBidWYsIDMpKSB7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaSArPSAzOworCX0KKworCWJkZXYtPnJkX2luZGV4ICs9IGk7CisJaWYgKGJkZXYtPnJkX2luZGV4ID49IGJkZXYtPmZpZm9fc2l6ZSkKKwkJYmRldi0+cmRzX2RhdGFfYXZhaWxhYmxlID0gMDsKKworCW11dGV4X3VubG9jaygmYmRldi0+bXV0ZXgpOworCWlmIChyZXR2YWwgPT0gMCkKKwkJcmV0dmFsID0gaTsKKworZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICoJYmNtMjA0OF9mb3BzIC0gZmlsZSBvcGVyYXRpb25zIGludGVyZmFjZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGJjbTIwNDhfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKKwkvKiBmb3IgUkRTIHJlYWQgc3VwcG9ydCAqLworCS5vcGVuCQk9IGJjbTIwNDhfZm9wc19vcGVuLAorCS5yZWxlYXNlCT0gYmNtMjA0OF9mb3BzX3JlbGVhc2UsCisJLnJlYWQJCT0gYmNtMjA0OF9mb3BzX3JlYWQsCisJLnBvbGwJCT0gYmNtMjA0OF9mb3BzX3BvbGwKK307CisKKy8qCisgKglWaWRlbzRMaW51eCBJbnRlcmZhY2UKKyAqLworc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBiY20yMDQ4X3Y0bDJfcXVlcnljdHJsW10gPSB7CisJeworCQkuaWQJCT0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19CQVNTLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19UUkVCTEUsCisJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKKwl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX0FVRElPX01VVEUsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJNdXRlIiwKKwkJLm1pbmltdW0JPSAwLAorCQkubWF4aW11bQk9IDEsCisJCS5zdGVwCQk9IDEsCisJCS5kZWZhdWx0X3ZhbHVlCT0gMSwKKwl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX0FVRElPX0xPVURORVNTLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcGFiaWxpdHkpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlzdHJsY3B5KGNhcGFiaWxpdHktPmRyaXZlciwgQkNNMjA0OF9EUklWRVJfTkFNRSwKKwkJc2l6ZW9mKGNhcGFiaWxpdHktPmRyaXZlcikpOworCXN0cmxjcHkoY2FwYWJpbGl0eS0+Y2FyZCwgQkNNMjA0OF9EUklWRVJfQ0FSRCwKKwkJc2l6ZW9mKGNhcGFiaWxpdHktPmNhcmQpKTsKKwlzbnByaW50ZihjYXBhYmlsaXR5LT5idXNfaW5mbywgMzIsICJJMkM6IDB4JVgiLCBiZGV2LT5jbGllbnQtPmFkZHIpOworCWNhcGFiaWxpdHktPnZlcnNpb24gPSBCQ00yMDQ4X0RSSVZFUl9WRVJTSU9OOworCWNhcGFiaWxpdHktPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU8gfAorCQkJCQlWNEwyX0NBUF9IV19GUkVRX1NFRUs7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQl1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJCQkJdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmNtMjA0OF92NGwyX3F1ZXJ5Y3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBiY20yMDQ4X3Y0bDJfcXVlcnljdHJsW2ldLmlkKSB7CisJCQkqcWMgPSBiY20yMDQ4X3Y0bDJfcXVlcnljdHJsW2ldOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWJkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJZXJyID0gYmNtMjA0OF9nZXRfbXV0ZShiZGV2KTsKKwkJaWYgKGVyciA+PSAwKQorCQkJY3RybC0+dmFsdWUgPSBlcnI7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCWludCBlcnIgPSAwOworCisJaWYgKCFiZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjdHJsLT52YWx1ZSkgeworCQkJaWYgKGJkZXYtPnBvd2VyX3N0YXRlKSB7CisJCQkJZXJyID0gYmNtMjA0OF9zZXRfbXV0ZShiZGV2LCBjdHJsLT52YWx1ZSk7CisJCQkJZXJyIHw9IGJjbTIwNDhfZGVpbml0KGJkZXYpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFiZGV2LT5wb3dlcl9zdGF0ZSkgeworCQkJCWVyciA9IGJjbTIwNDhfaW5pdChiZGV2KTsKKwkJCQllcnIgfD0gYmNtMjA0OF9zZXRfbXV0ZShiZGV2LCBjdHJsLT52YWx1ZSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCit7CisJaWYgKGF1ZGlvLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybmNweShhdWRpby0+bmFtZSwgIlJhZGlvIiwgMzIpOworCWF1ZGlvLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJY29uc3Qgc3RydWN0IHY0bDJfYXVkaW8gKmF1ZGlvKQoreworCWlmIChhdWRpby0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJczggZl9lcnJvcjsKKwlzOCByc3NpOworCisJaWYgKCFiZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh0dW5lci0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cm5jcHkodHVuZXItPm5hbWUsICJGTSBSZWNlaXZlciIsIDMyKTsKKwl0dW5lci0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJdHVuZXItPnJhbmdlbG93ID0KKwkJZGV2X3RvX3Y0bDIoYmNtMjA0OF9nZXRfcmVnaW9uX2JvdHRvbV9mcmVxdWVuY3koYmRldikpOworCXR1bmVyLT5yYW5nZWhpZ2ggPQorCQlkZXZfdG9fdjRsMihiY20yMDQ4X2dldF9yZWdpb25fdG9wX2ZyZXF1ZW5jeShiZGV2KSk7CisJdHVuZXItPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJdHVuZXItPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfCBWNEwyX1RVTkVSX0NBUF9MT1c7CisJdHVuZXItPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXR1bmVyLT5hZmMgPSAwOworCWlmIChiZGV2LT5wb3dlcl9zdGF0ZSkgeworCQkvKgorCQkgKiBSZXBvcnQgZnJlcXVlbmNpZXMgd2l0aCBoaWdoIGNhcnJpZXIgZXJyb3JzIHRvIGhhdmUgemVybworCQkgKiBzaWduYWwgbGV2ZWwKKwkJICovCisJCWZfZXJyb3IgPSBiY20yMDQ4X2dldF9mbV9jYXJyaWVyX2Vycm9yKGJkZXYpOworCQlpZiAoZl9lcnJvciA8IEJDTTIwNDhfRlJFUV9FUlJPUl9GTE9PUiB8fAorCQkgICAgZl9lcnJvciA+IEJDTTIwNDhfRlJFUV9FUlJPUl9ST09GKSB7CisJCQl0dW5lci0+c2lnbmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBSU1NJIGxldmVsIC02MCBkQiBpcyBkZWZpbmVkIHRvIHJlcG9ydCBmdWxsCisJCQkgKiBzaWduYWwgc3RyZW5naHQKKwkJCSAqLworCQkJcnNzaSA9IGJjbTIwNDhfZ2V0X2ZtX3Jzc2koYmRldik7CisJCQlpZiAocnNzaSA+PSBCQ00yMDQ4X1JTU0lfTEVWRUxfQkFTRSkgeworCQkJCXR1bmVyLT5zaWduYWwgPSAweEZGRkY7CisJCQl9IGVsc2UgaWYgKHJzc2kgPiBCQ00yMDQ4X1JTU0lfTEVWRUxfUk9PRikgeworCQkJCXR1bmVyLT5zaWduYWwgPSAocnNzaSArCisJCQkJCQkgQkNNMjA0OF9SU1NJX0xFVkVMX1JPT0ZfTkVHKQorCQkJCQkJICogQkNNMjA0OF9TSUdOQUxfTVVMVElQTElFUjsKKwkJCX0gZWxzZSB7CisJCQkJdHVuZXItPnNpZ25hbCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0dW5lci0+c2lnbmFsID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQljb25zdCBzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlpZiAoIWJkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHR1bmVyLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSkKK3sKKwlzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgZjsKKworCWlmICghYmRldi0+cG93ZXJfc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCisJZnJlcS0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJZiA9IGJjbTIwNDhfZ2V0X2ZtX2ZyZXF1ZW5jeShiZGV2KTsKKworCWlmIChmIDwgMCkKKwkJZXJyID0gZjsKKwllbHNlCisJCWZyZXEtPmZyZXF1ZW5jeSA9IGRldl90b192NGwyKGYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiY20yMDQ4X3ZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJY29uc3Qgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmcmVxKQoreworCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCWludCBlcnI7CisKKwlpZiAoZnJlcS0+dHlwZSAhPSBWNEwyX1RVTkVSX1JBRElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYmRldi0+cG93ZXJfc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gYmNtMjA0OF9zZXRfZm1fZnJlcXVlbmN5KGJkZXYsIHY0bDJfdG9fZGV2KGZyZXEtPmZyZXF1ZW5jeSkpOworCWVyciB8PSBiY20yMDQ4X3NldF9mbV9zZWFyY2hfdHVuZV9tb2RlKGJkZXYsIEJDTTIwNDhfRk1fUFJFX1NFVF9NT0RFKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjA0OF92aWRpb2Nfc19od19mcmVxX3NlZWsoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2h3X2ZyZXFfc2VlayAqc2VlaykKK3sKKwlzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlpbnQgZXJyOworCisJaWYgKCFiZGV2LT5wb3dlcl9zdGF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKHNlZWstPnR1bmVyICE9IDApIHx8IChzZWVrLT50eXBlICE9IFY0TDJfVFVORVJfUkFESU8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGJjbTIwNDhfc2V0X2ZtX3NlYXJjaF9tb2RlX2RpcmVjdGlvbihiZGV2LCBzZWVrLT5zZWVrX3Vwd2FyZCk7CisJZXJyIHw9IGJjbTIwNDhfc2V0X2ZtX3NlYXJjaF90dW5lX21vZGUoYmRldiwKKwkJCUJDTTIwNDhfRk1fQVVUT19TRUFSQ0hfTU9ERSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGJjbTIwNDhfaW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAJPSBiY20yMDQ4X3ZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfaW5wdXQJCT0gYmNtMjA0OF92aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQJCT0gYmNtMjA0OF92aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3F1ZXJ5Y3RybAk9IGJjbTIwNDhfdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybAkJPSBiY20yMDQ4X3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwJCT0gYmNtMjA0OF92aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19hdWRpbwkJPSBiY20yMDQ4X3ZpZGlvY19nX2F1ZGlvLAorCS52aWRpb2Nfc19hdWRpbwkJPSBiY20yMDQ4X3ZpZGlvY19zX2F1ZGlvLAorCS52aWRpb2NfZ190dW5lcgkJPSBiY20yMDQ4X3ZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lcgkJPSBiY20yMDQ4X3ZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kJPSBiY20yMDQ4X3ZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5CT0gYmNtMjA0OF92aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2h3X2ZyZXFfc2VlayAgPSBiY20yMDQ4X3ZpZGlvY19zX2h3X2ZyZXFfc2VlaywKK307CisKKy8qCisgKiBiY20yMDQ4X3ZpZGRldl90ZW1wbGF0ZSAtIHZpZGVvIGRldmljZSBpbnRlcmZhY2UKKyAqLworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgYmNtMjA0OF92aWRkZXZfdGVtcGxhdGUgPSB7CisJLmZvcHMJCQk9ICZiY20yMDQ4X2ZvcHMsCisJLm5hbWUJCQk9IEJDTTIwNDhfRFJJVkVSX05BTUUsCisJLnJlbGVhc2UJCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLmlvY3RsX29wcwkJPSAmYmNtMjA0OF9pb2N0bF9vcHMsCit9OworCisvKgorICoJSTJDIGRyaXZlciBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBiY20yMDQ4X2kyY19kcml2ZXJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldjsKKwlpbnQgZXJyLCBza2lwX3JlbGVhc2UgPSAwOworCisJYmRldiA9IGt6YWxsb2Moc2l6ZW9mKCpiZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiZGV2KSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHZpZGVvIGRldmljZS5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJYmRldi0+dmlkZW9kZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIWJkZXYtPnZpZGVvZGV2KSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHZpZGVvIGRldmljZS5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfYmRldjsKKwl9CisKKwliZGV2LT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYmRldik7CisJbXV0ZXhfaW5pdCgmYmRldi0+bXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmYmRldi0+Y29tcGwpOworCUlOSVRfV09SSygmYmRldi0+d29yaywgYmNtMjA0OF93b3JrKTsKKworCWlmIChjbGllbnQtPmlycSkgeworCQllcnIgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwKKwkJCWJjbTIwNDhfaGFuZGxlciwgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX0RJU0FCTEVELAorCQkJY2xpZW50LT5uYW1lLCBiZGV2KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ291bGQgbm90IHJlcXVlc3QgSVJRXG4iKTsKKwkJCWdvdG8gZnJlZV92ZGV2OworCQl9CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiSVJRIHJlcXVlc3RlZC5cbiIpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiSVJRIG5vdCBjb25maWd1cmVkLiBVc2luZyB0aW1lb3V0cy5cbiIpOworCX0KKworCSpiZGV2LT52aWRlb2RldiA9IGJjbTIwNDhfdmlkZGV2X3RlbXBsYXRlOworCXZpZGVvX3NldF9kcnZkYXRhKGJkZXYtPnZpZGVvZGV2LCBiZGV2KTsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGJkZXYtPnZpZGVvZGV2LCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZS5cbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCWVyciA9IGJjbTIwNDhfc3lzZnNfcmVnaXN0ZXJfcHJvcGVydGllcyhiZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBzeXNmcyBpbnRlcmZhY2UuXG4iKTsKKwkJZ290byBmcmVlX3JlZ2lzdHJhdGlvbjsKKwl9CisKKwllcnIgPSBiY20yMDQ4X3Byb2JlKGJkZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHByb2JlIGRldmljZSBpbmZvcm1hdGlvbi5cbiIpOworCQlnb3RvIGZyZWVfc3lzZnM7CisJfQorCisJcmV0dXJuIDA7CisKK2ZyZWVfc3lzZnM6CisJYmNtMjA0OF9zeXNmc191bnJlZ2lzdGVyX3Byb3BlcnRpZXMoYmRldiwgQVJSQVlfU0laRShhdHRycykpOworZnJlZV9yZWdpc3RyYXRpb246CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoYmRldi0+dmlkZW9kZXYpOworCS8qIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlIGZyZWVzIGJkZXYtPnZpZGVvZGV2ICovCisJYmRldi0+dmlkZW9kZXYgPSBOVUxMOworCXNraXBfcmVsZWFzZSA9IDE7CitmcmVlX2lycToKKwlpZiAoY2xpZW50LT5pcnEpCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBiZGV2KTsKK2ZyZWVfdmRldjoKKwlpZiAoIXNraXBfcmVsZWFzZSkKKwkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoYmRldi0+dmlkZW9kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworZnJlZV9iZGV2OgorCWtmcmVlKGJkZXYpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBiY20yMDQ4X2kyY19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGJjbTIwNDhfZGV2aWNlICpiZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CisKKwlpZiAoIWNsaWVudC0+YWRhcHRlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYmRldikgeworCQl2ZCA9IGJkZXYtPnZpZGVvZGV2OworCisJCWJjbTIwNDhfc3lzZnNfdW5yZWdpc3Rlcl9wcm9wZXJ0aWVzKGJkZXYsIEFSUkFZX1NJWkUoYXR0cnMpKTsKKworCQlpZiAodmQpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2ZCk7CisKKwkJaWYgKGJkZXYtPnBvd2VyX3N0YXRlKQorCQkJYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PRkYpOworCisJCWlmIChjbGllbnQtPmlycSA+IDApCisJCQlmcmVlX2lycShjbGllbnQtPmlycSwgYmRldik7CisKKwkJY2FuY2VsX3dvcmtfc3luYygmYmRldi0+d29yayk7CisKKwkJa2ZyZWUoYmRldik7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWJjbTIwNDhfaTJjX2RyaXZlciAtIGkyYyBkcml2ZXIgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBiY20yMDQ4X2lkW10gPSB7CisJeyAiYmNtMjA0OCIgLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBiY20yMDQ4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJjbTIwNDhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBCQ00yMDQ4X0RSSVZFUl9OQU1FLAorCX0sCisJLnByb2JlCQk9IGJjbTIwNDhfaTJjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGJjbTIwNDhfaTJjX2RyaXZlcl9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGJjbTIwNDhfaWQsCit9OworCisvKgorICoJTW9kdWxlIEludGVyZmFjZQorICovCitzdGF0aWMgaW50IF9faW5pdCBiY20yMDQ4X21vZHVsZV9pbml0KHZvaWQpCit7CisJcHJfaW5mbyhCQ00yMDQ4X0RSSVZFUl9ERVNDICJcbiIpOworCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZiY20yMDQ4X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYmNtMjA0OF9tb2R1bGVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiY20yMDQ4X21vZHVsZV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmJjbTIwNDhfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChiY20yMDQ4X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUihCQ00yMDQ4X0RSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKEJDTTIwNDhfRFJJVkVSX0RFU0MpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MGEzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguaApAQCAtMCwwICsxLDMwIEBACisvKgorICogZHJpdmVycy9zdGFnaW5nL21lZGlhL3JhZGlvLWJjbTIwNDguaAorICoKKyAqIFByb3BlcnR5IGFuZCBjb21tYW5kIGRlZmluaXRpb25zIGZvciBiY20yMDQ4IHJhZGlvIHJlY2VpdmVyIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29udGFjdDogRWVybyBOdXJra2FsYSA8ZXh0LWVlcm8ubnVya2thbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEJDTTIwNDhfSAorI2RlZmluZSBCQ00yMDQ4X0gKKworI2RlZmluZSBCQ00yMDQ4X05BTUUJCSJiY20yMDQ4IgorI2RlZmluZSBCQ00yMDQ4X0kyQ19BRERSCTB4MjIKKworI2VuZGlmCS8qIGlmbmRlZiBCQ00yMDQ4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pc2lmLmMKaW5kZXggZmY0OGZjZS4uYjk0MmJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pc2lmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pc2lmLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqICAgICAgUHJhYmhha2FyIExhZCA8cHJhYmhha2FyLmxhZEB0aS5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAiZG0zNjVfaXNpZi5oIgogI2luY2x1ZGUgInZwZmVfbWNfY2FwdHVyZS5oIgogCkBAIC05MTgsNyArOTE5LDcgQEAKIAkJICAgKDAgPDwgSVNJRl9WREZDX0VOX1NISUZUKSwgREZDQ1RMKTsKIAogCWlzaWZfd3JpdGUoaXNpZi0+aXNpZl9jZmcuYmFzZV9hZGRyLCAweDYsIERGQ01FTUNUTCk7Ci0JZm9yIChpID0gMCA7IGkgPCB2ZGZjLT5udW1fdmRlZmVjdHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCB2ZGZjLT5udW1fdmRlZmVjdHM7IGkrKykgewogCQljb3VudCA9IERGQ19XUklURV9XQUlUX0NPVU5UOwogCQl3aGlsZSAoY291bnQgJiYKIAkJCShpc2lmX3JlYWQoaXNpZi0+aXNpZl9jZmcuYmFzZV9hZGRyLCBERkNNRU1DVEwpICYgMHgyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKaW5kZXggMjRkOThhNi4uMWYzYjBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCX0KIAltdXRleF91bmxvY2soJm1kZXYtPmdyYXBoX211dGV4KTsKIAotCXJldHVybiAocmV0ID09IDApID8gcmV0IDogLUVUSU1FRE9VVCA7CisJcmV0dXJuIHJldCA/IC1FVElNRURPVVQgOiAwOwogfQogCiAvKgpAQCAtMTIwMSw2ICsxMjAxLDggQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IHJldDsKIAorCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gLUVOT0JVRlM7CiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ2aWRlby0+bG9jayk7CiAJaWYgKHJldCkKIAkJZ290byBzdHJlYW1vZmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1sb2FkZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCmluZGV4IDEwYmI0MWMuLmVlY2IxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWxvYWRlci5jCkBAIC01OSw3ICs1OSw3IEBACiAKIAlpZiAodXNiZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiY2FuJ3QgaGFuZGxlIG11bHRpcGxlIGNvbmZpZ1xuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGZhaWxlZDI7CiAJfQogCiAJdmVuZG9yID0gbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKQEAgLTEwOCw2ICsxMDgsNyBAQAogCXJldHVybiAwOwogCiBmYWlsZWQyOgorCXVzYl9wdXRfZGV2KHVzYmRldik7CiAJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJwcm9iZSBmYWlsZWRcbiIpOwogCXJldHVybiAtRU5PREVWOwogfQpAQCAtMTE1LDYgKzExNiw3IEBACiBzdGF0aWMgdm9pZCBnbzcwMDdfbG9hZGVyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJkaXNjb25uZWN0XG4iKTsKKwl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCmluZGV4IDQxZDExMGYuLjBiNTg5ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCXdwdHIgPSBud3B0cjsKIH0KIAotc3RhdGljIHZvaWQgaXJxX2hhbmRsZXIodm9pZCAqYmxhaCkKK3N0YXRpYyB2b2lkIGxpcmNfbGlyY19pcnFfaGFuZGxlcih2b2lkICpibGFoKQogewogCXN0cnVjdCB0aW1ldmFsIHR2OwogCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0dHY7CkBAIC02NTksNyArNjU5LDcgQEAKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCXBwZGV2aWNlID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocHBvcnQsIExJUkNfRFJJVkVSX05BTUUsCi0JCQkJCSAgIHBmLCBrZiwgaXJxX2hhbmRsZXIsIDAsIE5VTEwpOworCQkJCQkgICBwZiwga2YsIGxpcmNfbGlyY19pcnFfaGFuZGxlciwgMCwgTlVMTCk7CiAJcGFycG9ydF9wdXRfcG9ydChwcG9ydCk7CiAJaWYgKHBwZGV2aWNlID09IE5VTEwpIHsKIAkJcHJfbm90aWNlKCJwYXJwb3J0X3JlZ2lzdGVyX2RldmljZSgpIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zZXJpYWwuYwppbmRleCBhYmUwZDVjLi4xMGM2ODVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2VyaWFsLmMKQEAgLTY1MCw3ICs2NTAsNyBAQAogCXJid3JpdGUobCk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaSwgdm9pZCAqYmxhaCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBsaXJjX2lycV9oYW5kbGVyKGludCBpLCB2b2lkICpibGFoKQogewogCXN0cnVjdCB0aW1ldmFsIHR2OwogCWludCBjb3VudGVyLCBkY2Q7CkBAIC04NTIsNyArODUyLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKICNlbmRpZgogCi0JcmVzdWx0ID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFuZGxlciwKKwlyZXN1bHQgPSByZXF1ZXN0X2lycShpcnEsIGxpcmNfaXJxX2hhbmRsZXIsCiAJCQkgICAgIChzaGFyZV9pcnEgPyBJUlFGX1NIQVJFRCA6IDApLAogCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAodm9pZCAqKSZoYXJkd2FyZSk7CiAJaWYgKHJlc3VsdCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9LY29uZmlnCkBAIC0wLDAgKzEsMzUgQEAKK2NvbmZpZyBWSURFT19WNEwyX0lOVF9ERVZJQ0UKKyAgICAgICB0cmlzdGF0ZQorCitjb25maWcgVklERU9fT01BUDIKKwl0cmlzdGF0ZSAiT01BUDIgQ2FtZXJhIENhcHR1cmUgSW50ZXJmYWNlIGRyaXZlciAoREVQUkVDQVRFRCkiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgQVJDSF9PTUFQMgorCXNlbGVjdCBWSURFT0JVRl9ETUFfU0cKKwlzZWxlY3QgVklERU9fVjRMMl9JTlRfREVWSUNFCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgVEkgT01BUDIgY2FtZXJhIGNhcHR1cmUgaW50ZXJmYWNlCisKKwkgIEl0IHVzZXMgdGhlIGRlcHJlY2F0ZWQgaW50LWRldmljZSBBUEkuIFNpbmNlIHRoaXMgZHJpdmVyIGlzIG5vCisJICBsb25nZXIgYWN0aXZlbHkgbWFpbnRhaW5lZCBhbmQgbm9ib2R5IGlzIGludGVyZXN0ZWQgaW4gY29udmVydGluZworCSAgaXQgdG8gdGhlIHN1YmRldiBBUEksIHRoaXMgZHJpdmVyIHdpbGwgYmUgcmVtb3ZlZCBzb29uLgorCisJICBJZiB5b3UgZG8gd2FudCB0byBrZWVwIHRoaXMgZHJpdmVyIGluIHRoZSBrZXJuZWwsIGFuZCBhcmUgd2lsbGluZworCSAgdG8gY29udmVydCBpdCB0byB0aGUgc3ViZGV2IEFQSSwgdGhlbiBwbGVhc2UgY29udGFjdCB0aGUgbGludXgtbWVkaWEKKwkgIG1haWxpbmdsaXN0LgorCitjb25maWcgVklERU9fVENNODI1WAorCXRyaXN0YXRlICJUQ004MjV4IGNhbWVyYSBzZW5zb3Igc3VwcG9ydCAoREVQUkVDQVRFRCkiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgorCWRlcGVuZHMgb24gTUVESUFfQ0FNRVJBX1NVUFBPUlQKKwlzZWxlY3QgVklERU9fVjRMMl9JTlRfREVWSUNFCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFRvc2hpYmEgVENNODI1eCBWR0EgY2FtZXJhIHNlbnNvci4KKwkgIEl0IGlzIHVzZWQgZm9yIGV4YW1wbGUgaW4gTm9raWEgTjgwMC4KKworCSAgSXQgdXNlcyB0aGUgZGVwcmVjYXRlZCBpbnQtZGV2aWNlIEFQSS4gU2luY2UgdGhpcyBkcml2ZXIgaXMgbm8KKwkgIGxvbmdlciBhY3RpdmVseSBtYWludGFpbmVkIGFuZCBub2JvZHkgaXMgaW50ZXJlc3RlZCBpbiBjb252ZXJ0aW5nCisJICBpdCB0byB0aGUgc3ViZGV2IEFQSSwgdGhpcyBkcml2ZXIgd2lsbCBiZSByZW1vdmVkIHNvb24uCisKKwkgIElmIHlvdSBkbyB3YW50IHRvIGtlZXAgdGhpcyBkcml2ZXIgaW4gdGhlIGtlcm5lbCwgYW5kIGFyZSB3aWxsaW5nCisJICB0byBjb252ZXJ0IGl0IHRvIHRoZSBzdWJkZXYgQVBJLCB0aGVuIHBsZWFzZSBjb250YWN0IHRoZSBsaW51eC1tZWRpYQorCSAgbWFpbGluZ2xpc3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlNzE3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29tYXAyY2FtLW9ianMJOj0Jb21hcDI0eHhjYW0ubyBvbWFwMjR4eGNhbS1kbWEubworCitvYmotJChDT05GSUdfVklERU9fT01BUDIpICAgKz0gb21hcDJjYW0ubworb2JqLSQoQ09ORklHX1ZJREVPX1RDTTgyNVgpICs9IHRjbTgyNXgubworb2JqLSQoQ09ORklHX1ZJREVPX1Y0TDJfSU5UX0RFVklDRSkgKz0gdjRsMi1pbnQtZGV2aWNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDI0eHhjYW0tZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvb21hcDI0eHhjYW0tZG1hLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDI0eHhjYW0tZG1hLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9vbWFwMjR4eGNhbS1kbWEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwMjR4eGNhbS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L29tYXAyNHh4Y2FtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDI0eHhjYW0uYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L29tYXAyNHh4Y2FtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDI0eHhjYW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9vbWFwMjR4eGNhbS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDI0eHhjYW0uaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L29tYXAyNHh4Y2FtLmgKaW5kZXggN2Y2Zjc5MS4uMjMzYmI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwMjR4eGNhbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC9vbWFwMjR4eGNhbS5oCkBAIC0yOCw4ICsyOCw4IEBACiAjZGVmaW5lIE9NQVAyNFhYQ0FNX0gKIAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW50LWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSAidjRsMi1pbnQtZGV2aWNlLmgiCiAKIC8qCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvdGNtODI1eC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL2kyYy90Y204MjV4LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMKaW5kZXggOTI1MjUyOS4uYjFhZThlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvdGNtODI1eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW50LWRldmljZS5oPgorI2luY2x1ZGUgInY0bDItaW50LWRldmljZS5oIgogCiAjaW5jbHVkZSAidGNtODI1eC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy90Y204MjV4LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvaTJjL3RjbTgyNXguaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaAppbmRleCA4ZWJhYjk1Li5lMmQxYmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy90Y204MjV4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaApAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS92NGwyLWludC1kZXZpY2UuaD4KKyNpbmNsdWRlICJ2NGwyLWludC1kZXZpY2UuaCIKIAogI2RlZmluZSBUQ004MjVYX05BTUUgInRjbTgyNXgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItaW50LWRldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3Y0bDItaW50LWRldmljZS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItaW50LWRldmljZS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdjRsMi1pbnQtZGV2aWNlLmMKaW5kZXggZjQ0NzM0OS4uNDI3YTg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1pbnQtZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3Y0bDItaW50LWRldmljZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS92NGwyLWludC1kZXZpY2UuaD4KKyNpbmNsdWRlICJ2NGwyLWludC1kZXZpY2UuaCIKIAogc3RhdGljIERFRklORV9NVVRFWChtdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKGludF9saXN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdjRsMi1pbnQtZGV2aWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC92NGwyLWludC1kZXZpY2UuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZlNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorY29uZmlnIFZJREVPX09NQVA0CisJYm9vbCAiT01BUCA0IENhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBWSURFT19WNEwyX1NVQkRFVl9BUEkgJiYgSTJDICYmIEFSQ0hfT01BUDQKKwlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIGFuIE9NQVAgNCBJU1MgY29udHJvbGxlci4KKworY29uZmlnIFZJREVPX09NQVA0X0RFQlVHCisJYm9vbCAiT01BUCA0IENhbWVyYSBkZWJ1ZyBtZXNzYWdlcyIKKwlkZXBlbmRzIG9uIFZJREVPX09NQVA0CisJLS0taGVscC0tLQorCSAgRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIG9uIE9NQVAgNCBJU1MgY29udHJvbGxlciBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxNmNlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgTWFrZWZpbGUgZm9yIE9NQVA0IElTUyBkcml2ZXIKKworb21hcDQtaXNzLW9ianMgKz0gXAorCWlzcy5vIGlzc19jc2kyLm8gaXNzX2NzaXBoeS5vIGlzc19pcGlwZWlmLm8gaXNzX2lwaXBlLm8gaXNzX3Jlc2l6ZXIubyBpc3NfdmlkZW8ubworCitvYmotJChDT05GSUdfVklERU9fT01BUDQpICs9IG9tYXA0LWlzcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGU4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvVE9ETwpAQCAtMCwwICsxLDQgQEAKKyogTWFrZSB0aGUgZHJpdmVyIGNvbXBpbGUgYXMgYSBtb2R1bGUKKyogRml4IEZJRk8vYnVmZmVyIG92ZXJmbG93cyBhbmQgdW5kZXJmbG93cworKiBSZXBsYWNlIGR1bW15IHJlc2l6ZXIgY29kZSB3aXRoIGEgcmVhbCBpbXBsZW1lbnRhdGlvbgorKiBGaXggY2hlY2twYXRjaCBlcnJvcnMgYW5kIHdhcm5pbmdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmYmZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3MuYwpAQCAtMCwwICsxLDE1NjMgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIFRleGFzIEluc3RydW1lbnRzCisgKgorICogQXV0aG9yOiBTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisKKyNpbmNsdWRlICJpc3MuaCIKKyNpbmNsdWRlICJpc3NfcmVncy5oIgorCisjZGVmaW5lIElTU19QUklOVF9SRUdJU1RFUihpc3MsIG5hbWUpXAorCWRldl9kYmcoaXNzLT5kZXYsICIjIyNJU1MgIiAjbmFtZSAiPTB4JTA4eFxuIiwgXAorCQlpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTXyMjbmFtZSkpCisKK3N0YXRpYyB2b2lkIGlzc19wcmludF9zdGF0dXMoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiLS0tLS0tLS0tLS0tLUlTUyBITCBSZWdpc3RlciBkdW1wLS0tLS0tLS0tLS0tLVxuIik7CisKKwlJU1NfUFJJTlRfUkVHSVNURVIoaXNzLCBITF9SRVZJU0lPTik7CisJSVNTX1BSSU5UX1JFR0lTVEVSKGlzcywgSExfU1lTQ09ORklHKTsKKwlJU1NfUFJJTlRfUkVHSVNURVIoaXNzLCBITF9JUlFTVEFUVVMoNSkpOworCUlTU19QUklOVF9SRUdJU1RFUihpc3MsIEhMX0lSUUVOQUJMRV9TRVQoNSkpOworCUlTU19QUklOVF9SRUdJU1RFUihpc3MsIEhMX0lSUUVOQUJMRV9DTFIoNSkpOworCUlTU19QUklOVF9SRUdJU1RFUihpc3MsIENUUkwpOworCUlTU19QUklOVF9SRUdJU1RFUihpc3MsIENMS0NUUkwpOworCUlTU19QUklOVF9SRUdJU1RFUihpc3MsIENMS1NUQVQpOworCisJZGV2X2RiZyhpc3MtPmRldiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKK30KKworLyoKKyAqIG9tYXA0aXNzX2ZsdXNoIC0gUG9zdCBwZW5kaW5nIEwzIGJ1cyB3cml0ZXMgYnkgZG9pbmcgYSByZWdpc3RlciByZWFkYmFjaworICogQGlzczogT01BUDQgSVNTIGRldmljZQorICoKKyAqIEluIG9yZGVyIHRvIGZvcmNlIHBvc3Rpbmcgb2YgcGVuZGluZyB3cml0ZXMsIHdlIG5lZWQgdG8gd3JpdGUgYW5kCisgKiByZWFkYmFjayB0aGUgc2FtZSByZWdpc3RlciwgaW4gdGhpcyBjYXNlIHRoZSByZXZpc2lvbiByZWdpc3Rlci4KKyAqCisgKiBTZWUgdGhpcyBsaW5rIGZvciByZWZlcmVuY2U6CisgKiAgIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9saW51eC1vbWFwQHZnZXIua2VybmVsLm9yZy9tc2cwODE0OS5odG1sCisgKi8KK3ZvaWQgb21hcDRpc3NfZmx1c2goc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9UT1AsIElTU19ITF9SRVZJU0lPTiwgMCk7CisJaXNzX3JlZ19yZWFkKGlzcywgT01BUDRfSVNTX01FTV9UT1AsIElTU19ITF9SRVZJU0lPTik7Cit9CisKKy8qCisgKiBpc3NfaXNwX2VuYWJsZV9pbnRlcnJ1cHRzIC0gRW5hYmxlIElTUyBJU1AgaW50ZXJydXB0cy4KKyAqIEBpc3M6IE9NQVA0IElTUyBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgb21hcDRpc3NfaXNwX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJc3RhdGljIGNvbnN0IHUzMiBpc3BfaXJxID0gSVNQNV9JUlFfT0NQX0VSUiB8CisJCQkJICAgSVNQNV9JUlFfUlNaX0ZJRk9fSU5fQkxLX0VSUiB8CisJCQkJICAgSVNQNV9JUlFfUlNaX0ZJRk9fT1ZGIHwKKwkJCQkgICBJU1A1X0lSUV9SU1pfSU5UX0RNQSB8CisJCQkJICAgSVNQNV9JUlFfSVNJRl9JTlQoMCk7CisKKwkvKiBFbmFibGUgSVNQIGludGVycnVwdHMgKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfU1lTMSwgSVNQNV9JUlFTVEFUVVMoMCksIGlzcF9pcnEpOworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X0lSUUVOQUJMRV9TRVQoMCksCisJCSAgICAgIGlzcF9pcnEpOworfQorCisvKgorICogaXNzX2lzcF9kaXNhYmxlX2ludGVycnVwdHMgLSBEaXNhYmxlIElTUyBpbnRlcnJ1cHRzLgorICogQGlzczogT01BUDQgSVNTIGRldmljZQorICovCitzdGF0aWMgdm9pZCBvbWFwNGlzc19pc3BfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1NZUzEsIElTUDVfSVJRRU5BQkxFX0NMUigwKSwgfjApOworfQorCisvKgorICogaXNzX2VuYWJsZV9pbnRlcnJ1cHRzIC0gRW5hYmxlIElTUyBpbnRlcnJ1cHRzLgorICogQGlzczogT01BUDQgSVNTIGRldmljZQorICovCitzdGF0aWMgdm9pZCBpc3NfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlzdGF0aWMgY29uc3QgdTMyIGhsX2lycSA9IElTU19ITF9JUlFfQ1NJQSB8IElTU19ITF9JUlFfQ1NJQgorCQkJCXwgSVNTX0hMX0lSUV9JU1AoMCk7CisKKwkvKiBFbmFibGUgSEwgaW50ZXJydXB0cyAqLworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX0lSUVNUQVRVUyg1KSwgaGxfaXJxKTsKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9UT1AsIElTU19ITF9JUlFFTkFCTEVfU0VUKDUpLCBobF9pcnEpOworCisJaWYgKGlzcy0+cmVnc1tPTUFQNF9JU1NfTUVNX0lTUF9TWVMxXSkKKwkJb21hcDRpc3NfaXNwX2VuYWJsZV9pbnRlcnJ1cHRzKGlzcyk7Cit9CisKKy8qCisgKiBpc3NfZGlzYWJsZV9pbnRlcnJ1cHRzIC0gRGlzYWJsZSBJU1MgaW50ZXJydXB0cy4KKyAqIEBpc3M6IE9NQVA0IElTUyBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXNzX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCWlmIChpc3MtPnJlZ3NbT01BUDRfSVNTX01FTV9JU1BfU1lTMV0pCisJCW9tYXA0aXNzX2lzcF9kaXNhYmxlX2ludGVycnVwdHMoaXNzKTsKKworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX0lSUUVOQUJMRV9DTFIoNSksIH4wKTsKK30KKworaW50IG9tYXA0aXNzX2dldF9leHRlcm5hbF9pbmZvKHN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUsCisJCQkgICAgICAgc3RydWN0IG1lZGlhX2xpbmsgKmxpbmspCit7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9CisJCWNvbnRhaW5lcl9vZihwaXBlLCBzdHJ1Y3QgaXNzX3ZpZGVvLCBwaXBlKS0+aXNzOworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgZm10OworCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7CisJaW50IHJldDsKKworCWlmICghcGlwZS0+ZXh0ZXJuYWwpCisJCXJldHVybiAwOworCisJaWYgKHBpcGUtPmV4dGVybmFsX3JhdGUpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKworCWZtdC5wYWQgPSBsaW5rLT5zb3VyY2UtPmluZGV4OworCWZtdC53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYobGluay0+c2luay0+ZW50aXR5KSwKKwkJCSAgICAgICBwYWQsIGdldF9mbXQsIE5VTEwsICZmbXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVQSVBFOworCisJcGlwZS0+ZXh0ZXJuYWxfYnBwID0gb21hcDRpc3NfdmlkZW9fZm9ybWF0X2luZm8oZm10LmZvcm1hdC5jb2RlKS0+YnBwOworCisJY3RybCA9IHY0bDJfY3RybF9maW5kKHBpcGUtPmV4dGVybmFsLT5jdHJsX2hhbmRsZXIsCisJCQkgICAgICBWNEwyX0NJRF9QSVhFTF9SQVRFKTsKKwlpZiAoY3RybCA9PSBOVUxMKSB7CisJCWRldl93YXJuKGlzcy0+ZGV2LCAibm8gcGl4ZWwgcmF0ZSBjb250cm9sIGluIHN1YmRldiAlc1xuIiwKKwkJCSBwaXBlLT5leHRlcm5hbC0+bmFtZSk7CisJCXJldHVybiAtRVBJUEU7CisJfQorCisJcGlwZS0+ZXh0ZXJuYWxfcmF0ZSA9IHY0bDJfY3RybF9nX2N0cmxfaW50NjQoY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgYnJpZGdlLiBWYWxpZCBpbnB1dHMgYXJlCisgKgorICogSVBJUEVJRl9JTlBVVF9DU0kyQTogQ1NJMmEgcmVjZWl2ZXIKKyAqIElQSVBFSUZfSU5QVVRfQ1NJMkI6IENTSTJiIHJlY2VpdmVyCisgKgorICogVGhlIGJyaWRnZSBhbmQgbGFuZSBzaGlmdGVyIGFyZSBjb25maWd1cmVkIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgaW5wdXQKKyAqIGFuZCB0aGUgSVNQIHBsYXRmb3JtIGRhdGEuCisgKi8KK3ZvaWQgb21hcDRpc3NfY29uZmlndXJlX2JyaWRnZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJICAgICAgIGVudW0gaXBpcGVpZl9pbnB1dF9lbnRpdHkgaW5wdXQpCit7CisJdTMyIGlzc2N0cmxfdmFsOworCXUzMiBpc3A1Y3RybF92YWw7CisKKwlpc3NjdHJsX3ZhbCA9IGlzc19yZWdfcmVhZChpc3MsIE9NQVA0X0lTU19NRU1fVE9QLCBJU1NfQ1RSTCk7CisJaXNzY3RybF92YWwgJj0gfklTU19DVFJMX0lOUFVUX1NFTF9NQVNLOworCWlzc2N0cmxfdmFsICY9IH5JU1NfQ1RSTF9DTEtfRElWX01BU0s7CisKKwlpc3A1Y3RybF92YWwgPSBpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X0NUUkwpOworCisJc3dpdGNoIChpbnB1dCkgeworCWNhc2UgSVBJUEVJRl9JTlBVVF9DU0kyQToKKwkJaXNzY3RybF92YWwgfD0gSVNTX0NUUkxfSU5QVVRfU0VMX0NTSTJBOworCQlicmVhazsKKworCWNhc2UgSVBJUEVJRl9JTlBVVF9DU0kyQjoKKwkJaXNzY3RybF92YWwgfD0gSVNTX0NUUkxfSU5QVVRfU0VMX0NTSTJCOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlpc3NjdHJsX3ZhbCB8PSBJU1NfQ1RSTF9TWU5DX0RFVEVDVF9WU19SQUlTSU5HOworCisJaXNwNWN0cmxfdmFsIHw9IElTUDVfQ1RSTF9WRF9QVUxTRV9FWFQgfCBJU1A1X0NUUkxfUFNZTkNfQ0xLX1NFTCB8CisJCQlJU1A1X0NUUkxfU1lOQ19FTkFCTEU7CisKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9UT1AsIElTU19DVFJMLCBpc3NjdHJsX3ZhbCk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1NZUzEsIElTUDVfQ1RSTCwgaXNwNWN0cmxfdmFsKTsKK30KKworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoSVNTX0lTUl9ERUJVRykKK3N0YXRpYyB2b2lkIGlzc19pc3JfZGJnKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsIHUzMiBpcnFzdGF0dXMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPSB7CisJCSJJU1BfMCIsCisJCSJJU1BfMSIsCisJCSJJU1BfMiIsCisJCSJJU1BfMyIsCisJCSJDU0lBIiwKKwkJIkNTSUIiLAorCQkiQ0NQMl8wIiwKKwkJIkNDUDJfMSIsCisJCSJDQ1AyXzIiLAorCQkiQ0NQMl8zIiwKKwkJIkNCVUZGIiwKKwkJIkJURSIsCisJCSJTSU1DT1BfMCIsCisJCSJTSU1DT1BfMSIsCisJCSJTSU1DT1BfMiIsCisJCSJTSU1DT1BfMyIsCisJCSJDQ1AyXzgiLAorCQkiSFNfVlMiLAorCQkiMTgiLAorCQkiMTkiLAorCQkiMjAiLAorCQkiMjEiLAorCQkiMjIiLAorCQkiMjMiLAorCQkiMjQiLAorCQkiMjUiLAorCQkiMjYiLAorCQkiMjciLAorCQkiMjgiLAorCQkiMjkiLAorCQkiMzAiLAorCQkiMzEiLAorCX07CisJdW5zaWduZWQgaW50IGk7CisKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiSVNTIElSUTogIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lKTsgaSsrKSB7CisJCWlmICgoMSA8PCBpKSAmIGlycXN0YXR1cykKKwkJCXByX2NvbnQoIiVzICIsIG5hbWVbaV0pOworCX0KKwlwcl9jb250KCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBpc3NfaXNwX2lzcl9kYmcoc3RydWN0IGlzc19kZXZpY2UgKmlzcywgdTMyIGlycXN0YXR1cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9IHsKKwkJIklTSUZfMCIsCisJCSJJU0lGXzEiLAorCQkiSVNJRl8yIiwKKwkJIklTSUZfMyIsCisJCSJJUElQRVJFUSIsCisJCSJJUElQRUxBU1RfUElYIiwKKwkJIklQSVBFRE1BIiwKKwkJIklQSVBFQlNDIiwKKwkJIklQSVBFSFNUIiwKKwkJIklQSVBFSUYiLAorCQkiQUVXIiwKKwkJIkFGIiwKKwkJIkgzQSIsCisJCSJSU1pfUkVHIiwKKwkJIlJTWl9MQVNUX1BJWCIsCisJCSJSU1pfRE1BIiwKKwkJIlJTWl9DWUNfUlpBIiwKKwkJIlJTWl9DWUNfUlpCIiwKKwkJIlJTWl9GSUZPX09WRiIsCisJCSJSU1pfRklGT19JTl9CTEtfRVJSIiwKKwkJIjIwIiwKKwkJIjIxIiwKKwkJIlJTWl9FT0YwIiwKKwkJIlJTWl9FT0YxIiwKKwkJIkgzQV9FT0YiLAorCQkiSVBJUEVfRU9GIiwKKwkJIjI2IiwKKwkJIklQSVBFX0RQQ19JTkkiLAorCQkiSVBJUEVfRFBDX1JORVcwIiwKKwkJIklQSVBFX0RQQ19STkVXMSIsCisJCSIzMCIsCisJCSJPQ1BfRVJSIiwKKwl9OworCXVuc2lnbmVkIGludCBpOworCisJZGV2X2RiZyhpc3MtPmRldiwgIklTUCBJUlE6ICIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmFtZSk7IGkrKykgeworCQlpZiAoKDEgPDwgaSkgJiBpcnFzdGF0dXMpCisJCQlwcl9jb250KCIlcyAiLCBuYW1lW2ldKTsKKwl9CisJcHJfY29udCgiXG4iKTsKK30KKyNlbmRpZgorCisvKgorICogaXNzX2lzciAtIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgZm9yIElTUyBtb2R1bGUuCisgKiBAaXJxOiBOb3QgdXNlZCBjdXJyZW50bHkuCisgKiBAX2lzczogUG9pbnRlciB0byB0aGUgT01BUDQgSVNTIGRldmljZQorICoKKyAqIEhhbmRsZXMgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgaWYgcGx1Z2dlZCBpbi4KKyAqCisgKiBSZXR1cm5zIElSUV9IQU5ETEVEIHdoZW4gSVJRIHdhcyBjb3JyZWN0bHkgaGFuZGxlZCwgb3IgSVJRX05PTkUgd2hlbiB0aGUKKyAqIElSUSB3YXNuJ3QgaGFuZGxlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IGlzc19pc3IoaW50IGlycSwgdm9pZCAqX2lzcykKK3sKKwlzdGF0aWMgY29uc3QgdTMyIGlwaXBlaWZfZXZlbnRzID0gSVNQNV9JUlFfSVBJUEVJRl9JUlEgfAorCQkJCQkgIElTUDVfSVJRX0lTSUZfSU5UKDApOworCXN0YXRpYyBjb25zdCB1MzIgcmVzaXplcl9ldmVudHMgPSBJU1A1X0lSUV9SU1pfRklGT19JTl9CTEtfRVJSIHwKKwkJCQkJICBJU1A1X0lSUV9SU1pfRklGT19PVkYgfAorCQkJCQkgIElTUDVfSVJRX1JTWl9JTlRfRE1BOworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSBfaXNzOworCXUzMiBpcnFzdGF0dXM7CisKKwlpcnFzdGF0dXMgPSBpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX0lSUVNUQVRVUyg1KSk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fVE9QLCBJU1NfSExfSVJRU1RBVFVTKDUpLCBpcnFzdGF0dXMpOworCisJaWYgKGlycXN0YXR1cyAmIElTU19ITF9JUlFfQ1NJQSkKKwkJb21hcDRpc3NfY3NpMl9pc3IoJmlzcy0+Y3NpMmEpOworCisJaWYgKGlycXN0YXR1cyAmIElTU19ITF9JUlFfQ1NJQikKKwkJb21hcDRpc3NfY3NpMl9pc3IoJmlzcy0+Y3NpMmIpOworCisJaWYgKGlycXN0YXR1cyAmIElTU19ITF9JUlFfSVNQKDApKSB7CisJCXUzMiBpc3BfaXJxc3RhdHVzID0gaXNzX3JlZ19yZWFkKGlzcywgT01BUDRfSVNTX01FTV9JU1BfU1lTMSwKKwkJCQkJCSBJU1A1X0lSUVNUQVRVUygwKSk7CisJCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X0lSUVNUQVRVUygwKSwKKwkJCSAgICAgIGlzcF9pcnFzdGF0dXMpOworCisJCWlmIChpc3BfaXJxc3RhdHVzICYgSVNQNV9JUlFfT0NQX0VSUikKKwkJCWRldl9kYmcoaXNzLT5kZXYsICJJU1A1IE9DUCBFcnJvciFcbiIpOworCisJCWlmIChpc3BfaXJxc3RhdHVzICYgaXBpcGVpZl9ldmVudHMpIHsKKwkJCW9tYXA0aXNzX2lwaXBlaWZfaXNyKCZpc3MtPmlwaXBlaWYsCisJCQkJCSAgICAgaXNwX2lycXN0YXR1cyAmIGlwaXBlaWZfZXZlbnRzKTsKKwkJfQorCisJCWlmIChpc3BfaXJxc3RhdHVzICYgcmVzaXplcl9ldmVudHMpCisJCQlvbWFwNGlzc19yZXNpemVyX2lzcigmaXNzLT5yZXNpemVyLAorCQkJCQkgICAgIGlzcF9pcnFzdGF0dXMgJiByZXNpemVyX2V2ZW50cyk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKElTU19JU1JfREVCVUcpCisJCWlzc19pc3BfaXNyX2RiZyhpc3MsIGlzcF9pcnFzdGF0dXMpOworI2VuZGlmCisJfQorCisJb21hcDRpc3NfZmx1c2goaXNzKTsKKworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoSVNTX0lTUl9ERUJVRykKKwlpc3NfaXNyX2RiZyhpc3MsIGlycXN0YXR1cyk7CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBpcGVsaW5lIHBvd2VyIG1hbmFnZW1lbnQKKyAqCisgKiBFbnRpdGllcyBtdXN0IGJlIHBvd2VyZWQgdXAgd2hlbiBwYXJ0IG9mIGEgcGlwZWxpbmUgdGhhdCBjb250YWlucyBhdCBsZWFzdAorICogb25lIG9wZW4gdmlkZW8gZGV2aWNlIG5vZGUuCisgKgorICogVG8gYWNoaWV2ZSB0aGlzIHVzZSB0aGUgZW50aXR5IHVzZV9jb3VudCBmaWVsZCB0byB0cmFjayB0aGUgbnVtYmVyIG9mIHVzZXJzLgorICogRm9yIGVudGl0aWVzIGNvcnJlc3BvbmRpbmcgdG8gdmlkZW8gZGV2aWNlIG5vZGVzIHRoZSB1c2VfY291bnQgZmllbGQgc3RvcmVzCisgKiB0aGUgdXNlcnMgY291bnQgb2YgdGhlIG5vZGUuIEZvciBlbnRpdGllcyBjb3JyZXNwb25kaW5nIHRvIHN1YmRldnMgdGhlCisgKiB1c2VfY291bnQgZmllbGQgc3RvcmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgdXNlcnMgb2YgYWxsIHZpZGVvIGRldmljZSBub2RlcworICogaW4gdGhlIHBpcGVsaW5lLgorICoKKyAqIFRoZSBvbWFwNGlzc19waXBlbGluZV9wbV91c2UoKSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbigpIGFuZAorICogY2xvc2UoKSBoYW5kbGVycyBvZiB2aWRlbyBkZXZpY2Ugbm9kZXMuIEl0IGluY3JlbWVudHMgb3IgZGVjcmVtZW50cyB0aGUgdXNlCisgKiBjb3VudCBvZiBhbGwgc3ViZGV2IGVudGl0aWVzIGluIHRoZSBwaXBlbGluZS4KKyAqCisgKiBUbyByZWFjdCB0byBsaW5rIG1hbmFnZW1lbnQgb24gcG93ZXJlZCBwaXBlbGluZXMsIHRoZSBsaW5rIHNldHVwIG5vdGlmaWNhdGlvbgorICogY2FsbGJhY2sgdXBkYXRlcyB0aGUgdXNlIGNvdW50IG9mIGFsbCBlbnRpdGllcyBpbiB0aGUgc291cmNlIGFuZCBzaW5rIHNpZGVzCisgKiBvZiB0aGUgbGluay4KKyAqLworCisvKgorICogaXNzX3BpcGVsaW5lX3BtX3VzZV9jb3VudCAtIENvdW50IHRoZSBudW1iZXIgb2YgdXNlcnMgb2YgYSBwaXBlbGluZQorICogQGVudGl0eTogVGhlIGVudGl0eQorICoKKyAqIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHVzZXJzIG9mIGFsbCB2aWRlbyBkZXZpY2Ugbm9kZXMgaW4gdGhlIHBpcGVsaW5lLgorICovCitzdGF0aWMgaW50IGlzc19waXBlbGluZV9wbV91c2VfY291bnQoc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5KQoreworCXN0cnVjdCBtZWRpYV9lbnRpdHlfZ3JhcGggZ3JhcGg7CisJaW50IHVzZSA9IDA7CisKKwltZWRpYV9lbnRpdHlfZ3JhcGhfd2Fsa19zdGFydCgmZ3JhcGgsIGVudGl0eSk7CisKKwl3aGlsZSAoKGVudGl0eSA9IG1lZGlhX2VudGl0eV9ncmFwaF93YWxrX25leHQoJmdyYXBoKSkpIHsKKwkJaWYgKG1lZGlhX2VudGl0eV90eXBlKGVudGl0eSkgPT0gTUVESUFfRU5UX1RfREVWTk9ERSkKKwkJCXVzZSArPSBlbnRpdHktPnVzZV9jb3VudDsKKwl9CisKKwlyZXR1cm4gdXNlOworfQorCisvKgorICogaXNzX3BpcGVsaW5lX3BtX3Bvd2VyX29uZSAtIEFwcGx5IHBvd2VyIGNoYW5nZSB0byBhbiBlbnRpdHkKKyAqIEBlbnRpdHk6IFRoZSBlbnRpdHkKKyAqIEBjaGFuZ2U6IFVzZSBjb3VudCBjaGFuZ2UKKyAqCisgKiBDaGFuZ2UgdGhlIGVudGl0eSB1c2UgY291bnQgYnkgQGNoYW5nZS4gSWYgdGhlIGVudGl0eSBpcyBhIHN1YmRldiB1cGRhdGUgaXRzCisgKiBwb3dlciBzdGF0ZSBieSBjYWxsaW5nIHRoZSBjb3JlOjpzX3Bvd2VyIG9wZXJhdGlvbiB3aGVuIHRoZSB1c2UgY291bnQgZ29lcworICogZnJvbSAwIHRvICE9IDAgb3IgZnJvbSAhPSAwIHRvIDAuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpc3NfcGlwZWxpbmVfcG1fcG93ZXJfb25lKHN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSwgaW50IGNoYW5nZSkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldjsKKworCXN1YmRldiA9IG1lZGlhX2VudGl0eV90eXBlKGVudGl0eSkgPT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYKKwkgICAgICAgPyBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYoZW50aXR5KSA6IE5VTEw7CisKKwlpZiAoZW50aXR5LT51c2VfY291bnQgPT0gMCAmJiBjaGFuZ2UgPiAwICYmIHN1YmRldiAhPSBOVUxMKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIGNvcmUsIHNfcG93ZXIsIDEpOworCQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwllbnRpdHktPnVzZV9jb3VudCArPSBjaGFuZ2U7CisJV0FSTl9PTihlbnRpdHktPnVzZV9jb3VudCA8IDApOworCisJaWYgKGVudGl0eS0+dXNlX2NvdW50ID09IDAgJiYgY2hhbmdlIDwgMCAmJiBzdWJkZXYgIT0gTlVMTCkKKwkJdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIGNvcmUsIHNfcG93ZXIsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpc3NfcGlwZWxpbmVfcG1fcG93ZXIgLSBBcHBseSBwb3dlciBjaGFuZ2UgdG8gYWxsIGVudGl0aWVzIGluIGEgcGlwZWxpbmUKKyAqIEBlbnRpdHk6IFRoZSBlbnRpdHkKKyAqIEBjaGFuZ2U6IFVzZSBjb3VudCBjaGFuZ2UKKyAqCisgKiBXYWxrIHRoZSBwaXBlbGluZSB0byB1cGRhdGUgdGhlIHVzZSBjb3VudCBhbmQgdGhlIHBvd2VyIHN0YXRlIG9mIGFsbCBub24tbm9kZQorICogZW50aXRpZXMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpc3NfcGlwZWxpbmVfcG1fcG93ZXIoc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5LCBpbnQgY2hhbmdlKQoreworCXN0cnVjdCBtZWRpYV9lbnRpdHlfZ3JhcGggZ3JhcGg7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqZmlyc3QgPSBlbnRpdHk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNoYW5nZSkKKwkJcmV0dXJuIDA7CisKKwltZWRpYV9lbnRpdHlfZ3JhcGhfd2Fsa19zdGFydCgmZ3JhcGgsIGVudGl0eSk7CisKKwl3aGlsZSAoIXJldCAmJiAoZW50aXR5ID0gbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfbmV4dCgmZ3JhcGgpKSkKKwkJaWYgKG1lZGlhX2VudGl0eV90eXBlKGVudGl0eSkgIT0gTUVESUFfRU5UX1RfREVWTk9ERSkKKwkJCXJldCA9IGlzc19waXBlbGluZV9wbV9wb3dlcl9vbmUoZW50aXR5LCBjaGFuZ2UpOworCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfc3RhcnQoJmdyYXBoLCBmaXJzdCk7CisKKwl3aGlsZSAoKGZpcnN0ID0gbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfbmV4dCgmZ3JhcGgpKQorCSAgICAgICAmJiBmaXJzdCAhPSBlbnRpdHkpCisJCWlmIChtZWRpYV9lbnRpdHlfdHlwZShmaXJzdCkgIT0gTUVESUFfRU5UX1RfREVWTk9ERSkKKwkJCWlzc19waXBlbGluZV9wbV9wb3dlcl9vbmUoZmlyc3QsIC1jaGFuZ2UpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9tYXA0aXNzX3BpcGVsaW5lX3BtX3VzZSAtIFVwZGF0ZSB0aGUgdXNlIGNvdW50IG9mIGFuIGVudGl0eQorICogQGVudGl0eTogVGhlIGVudGl0eQorICogQHVzZTogVXNlICgxKSBvciBzdG9wIHVzaW5nICgwKSB0aGUgZW50aXR5CisgKgorICogVXBkYXRlIHRoZSB1c2UgY291bnQgb2YgYWxsIGVudGl0aWVzIGluIHRoZSBwaXBlbGluZSBhbmQgcG93ZXIgZW50aXRpZXMgb24gb3IKKyAqIG9mZiBhY2NvcmRpbmdseS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBQb3dlcmluZyBlbnRpdGllcworICogb2ZmIGlzIGFzc3VtZWQgdG8gbmV2ZXIgZmFpbC4gTm8gZmFpbHVyZSBjYW4gb2NjdXIgd2hlbiB0aGUgdXNlIHBhcmFtZXRlciBpcworICogc2V0IHRvIDAuCisgKi8KK2ludCBvbWFwNGlzc19waXBlbGluZV9wbV91c2Uoc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5LCBpbnQgdXNlKQoreworCWludCBjaGFuZ2UgPSB1c2UgPyAxIDogLTE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmVudGl0eS0+cGFyZW50LT5ncmFwaF9tdXRleCk7CisKKwkvKiBBcHBseSB1c2UgY291bnQgdG8gbm9kZS4gKi8KKwllbnRpdHktPnVzZV9jb3VudCArPSBjaGFuZ2U7CisJV0FSTl9PTihlbnRpdHktPnVzZV9jb3VudCA8IDApOworCisJLyogQXBwbHkgcG93ZXIgY2hhbmdlIHRvIGNvbm5lY3RlZCBub24tbm9kZXMuICovCisJcmV0ID0gaXNzX3BpcGVsaW5lX3BtX3Bvd2VyKGVudGl0eSwgY2hhbmdlKTsKKwlpZiAocmV0IDwgMCkKKwkJZW50aXR5LT51c2VfY291bnQgLT0gY2hhbmdlOworCisJbXV0ZXhfdW5sb2NrKCZlbnRpdHktPnBhcmVudC0+Z3JhcGhfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGlzc19waXBlbGluZV9saW5rX25vdGlmeSAtIExpbmsgbWFuYWdlbWVudCBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIEBsaW5rOiBUaGUgbGluaworICogQGZsYWdzOiBOZXcgbGluayBmbGFncyB0aGF0IHdpbGwgYmUgYXBwbGllZAorICoKKyAqIFJlYWN0IHRvIGxpbmsgbWFuYWdlbWVudCBvbiBwb3dlcmVkIHBpcGVsaW5lcyBieSB1cGRhdGluZyB0aGUgdXNlIGNvdW50IG9mCisgKiBhbGwgZW50aXRpZXMgaW4gdGhlIHNvdXJjZSBhbmQgc2luayBzaWRlcyBvZiB0aGUgbGluay4gRW50aXRpZXMgYXJlIHBvd2VyZWQKKyAqIG9uIG9yIG9mZiBhY2NvcmRpbmdseS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBQb3dlcmluZyBlbnRpdGllcworICogb2ZmIGlzIGFzc3VtZWQgdG8gbmV2ZXIgZmFpbC4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBmYWlsIGZvciBkaXNjb25uZWN0aW9uCisgKiBldmVudHMuCisgKi8KK3N0YXRpYyBpbnQgaXNzX3BpcGVsaW5lX2xpbmtfbm90aWZ5KHN0cnVjdCBtZWRpYV9saW5rICpsaW5rLCB1MzIgZmxhZ3MsCisJCQkJICAgIHVuc2lnbmVkIGludCBub3RpZmljYXRpb24pCit7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqc291cmNlID0gbGluay0+c291cmNlLT5lbnRpdHk7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqc2luayA9IGxpbmstPnNpbmstPmVudGl0eTsKKwlpbnQgc291cmNlX3VzZSA9IGlzc19waXBlbGluZV9wbV91c2VfY291bnQoc291cmNlKTsKKwlpbnQgc2lua191c2UgPSBpc3NfcGlwZWxpbmVfcG1fdXNlX2NvdW50KHNpbmspOworCWludCByZXQ7CisKKwlpZiAobm90aWZpY2F0aW9uID09IE1FRElBX0RFVl9OT1RJRllfUE9TVF9MSU5LX0NIICYmCisJICAgICEobGluay0+ZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJLyogUG93ZXJpbmcgb2ZmIGVudGl0aWVzIGlzIGFzc3VtZWQgdG8gbmV2ZXIgZmFpbC4gKi8KKwkJaXNzX3BpcGVsaW5lX3BtX3Bvd2VyKHNvdXJjZSwgLXNpbmtfdXNlKTsKKwkJaXNzX3BpcGVsaW5lX3BtX3Bvd2VyKHNpbmssIC1zb3VyY2VfdXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5vdGlmaWNhdGlvbiA9PSBNRURJQV9ERVZfTk9USUZZX1BPU1RfTElOS19DSCAmJgorCQkoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJcmV0ID0gaXNzX3BpcGVsaW5lX3BtX3Bvd2VyKHNvdXJjZSwgc2lua191c2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gaXNzX3BpcGVsaW5lX3BtX3Bvd2VyKHNpbmssIHNvdXJjZV91c2UpOworCQlpZiAocmV0IDwgMCkKKwkJCWlzc19waXBlbGluZV9wbV9wb3dlcihzb3VyY2UsIC1zaW5rX3VzZSk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBpcGVsaW5lIHN0cmVhbSBtYW5hZ2VtZW50CisgKi8KKworLyoKKyAqIGlzc19waXBlbGluZV9lbmFibGUgLSBFbmFibGUgc3RyZWFtaW5nIG9uIGEgcGlwZWxpbmUKKyAqIEBwaXBlOiBJU1MgcGlwZWxpbmUKKyAqIEBtb2RlOiBTdHJlYW0gbW9kZSAoc2luZ2xlIHNob3Qgb3IgY29udGludW91cykKKyAqCisgKiBXYWxrIHRoZSBlbnRpdGllcyBjaGFpbiBzdGFydGluZyBhdCB0aGUgcGlwZWxpbmUgb3V0cHV0IHZpZGVvIG5vZGUgYW5kIHN0YXJ0CisgKiBhbGwgbW9kdWxlcyBpbiB0aGUgY2hhaW4gaW4gdGhlIGdpdmVuIG1vZGUuCisgKgorICogUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmFpbGVkIHZpZGVvOjpzX3N0cmVhbQorICogb3BlcmF0aW9uIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBpc3NfcGlwZWxpbmVfZW5hYmxlKHN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUsCisJCQkgICAgICAgZW51bSBpc3NfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIG1vZGUpCit7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHBpcGUtPm91dHB1dC0+aXNzOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eTsKKwlzdHJ1Y3QgbWVkaWFfcGFkICpwYWQ7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogSWYgb25lIG9mIHRoZSBlbnRpdGllcyBpbiB0aGUgcGlwZWxpbmUgaGFzIGNyYXNoZWQgaXQgd2lsbCBub3Qgd29yaworCSAqIHByb3Blcmx5LiBSZWZ1c2UgdG8gc3RhcnQgc3RyZWFtaW5nIGluIHRoYXQgY2FzZS4gVGhpcyBjaGVjayBtdXN0IGJlCisJICogcGVyZm9ybWVkIGJlZm9yZSB0aGUgbG9vcCBiZWxvdyB0byBhdm9pZCBzdGFydGluZyBlbnRpdGllcyBpZiB0aGUKKwkgKiBwaXBlbGluZSB3b24ndCBzdGFydCBhbnl3YXkgKHRob3NlIGVudGl0aWVzIHdvdWxkIHRoZW4gbGlrZWx5IGZhaWwgdG8KKwkgKiBzdG9wLCBtYWtpbmcgdGhlIHByb2JsZW0gd29yc2UpLgorCSAqLworCWlmIChwaXBlLT5lbnRpdGllcyAmIGlzcy0+Y3Jhc2hlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGlwZS0+bG9jaywgZmxhZ3MpOworCXBpcGUtPnN0YXRlICY9IH4oSVNTX1BJUEVMSU5FX0lETEVfSU5QVVQgfCBJU1NfUElQRUxJTkVfSURMRV9PVVRQVVQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKKworCXBpcGUtPmRvX3Byb3BhZ2F0aW9uID0gZmFsc2U7CisKKwllbnRpdHkgPSAmcGlwZS0+b3V0cHV0LT52aWRlby5lbnRpdHk7CisJd2hpbGUgKDEpIHsKKwkJcGFkID0gJmVudGl0eS0+cGFkc1swXTsKKwkJaWYgKCEocGFkLT5mbGFncyAmIE1FRElBX1BBRF9GTF9TSU5LKSkKKwkJCWJyZWFrOworCisJCXBhZCA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKHBhZCk7CisJCWlmIChwYWQgPT0gTlVMTCB8fAorCQkgICAgbWVkaWFfZW50aXR5X3R5cGUocGFkLT5lbnRpdHkpICE9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQorCQkJYnJlYWs7CisKKwkJZW50aXR5ID0gcGFkLT5lbnRpdHk7CisJCXN1YmRldiA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihlbnRpdHkpOworCisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCB2aWRlbywgc19zdHJlYW0sIG1vZGUpOworCQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuIHJldDsKKwl9CisJaXNzX3ByaW50X3N0YXR1cyhwaXBlLT5vdXRwdXQtPmlzcyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpc3NfcGlwZWxpbmVfZGlzYWJsZSAtIERpc2FibGUgc3RyZWFtaW5nIG9uIGEgcGlwZWxpbmUKKyAqIEBwaXBlOiBJU1MgcGlwZWxpbmUKKyAqCisgKiBXYWxrIHRoZSBlbnRpdGllcyBjaGFpbiBzdGFydGluZyBhdCB0aGUgcGlwZWxpbmUgb3V0cHV0IHZpZGVvIG5vZGUgYW5kIHN0b3AKKyAqIGFsbCBtb2R1bGVzIGluIHRoZSBjaGFpbi4gV2FpdCBzeW5jaHJvbm91c2x5IGZvciB0aGUgbW9kdWxlcyB0byBiZSBzdG9wcGVkIGlmCisgKiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgaXNzX3BpcGVsaW5lX2Rpc2FibGUoc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSkKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gcGlwZS0+b3V0cHV0LT5pc3M7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5OworCXN0cnVjdCBtZWRpYV9wYWQgKnBhZDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldjsKKwlpbnQgZmFpbHVyZSA9IDA7CisJaW50IHJldDsKKworCWVudGl0eSA9ICZwaXBlLT5vdXRwdXQtPnZpZGVvLmVudGl0eTsKKwl3aGlsZSAoMSkgeworCQlwYWQgPSAmZW50aXR5LT5wYWRzWzBdOworCQlpZiAoIShwYWQtPmZsYWdzICYgTUVESUFfUEFEX0ZMX1NJTkspKQorCQkJYnJlYWs7CisKKwkJcGFkID0gbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQocGFkKTsKKwkJaWYgKHBhZCA9PSBOVUxMIHx8CisJCSAgICBtZWRpYV9lbnRpdHlfdHlwZShwYWQtPmVudGl0eSkgIT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYpCisJCQlicmVhazsKKworCQllbnRpdHkgPSBwYWQtPmVudGl0eTsKKwkJc3ViZGV2ID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KGVudGl0eSk7CisKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZGJnKGlzcy0+ZGV2LCAiJXM6IG1vZHVsZSBzdG9wIHRpbWVvdXQuXG4iLAorCQkJCXN1YmRldi0+bmFtZSk7CisJCQkvKiBJZiB0aGUgZW50aXR5IGZhaWxlZCB0byBzdG9wcGVkLCBhc3N1bWUgaXQgaGFzCisJCQkgKiBjcmFzaGVkLiBNYXJrIGl0IGFzIHN1Y2gsIHRoZSBJU1Mgd2lsbCBiZSByZXNldCB3aGVuCisJCQkgKiBhcHBsaWNhdGlvbnMgd2lsbCByZWxlYXNlIGl0LgorCQkJICovCisJCQlpc3MtPmNyYXNoZWQgfD0gMVUgPDwgc3ViZGV2LT5lbnRpdHkuaWQ7CisJCQlmYWlsdXJlID0gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCXJldHVybiBmYWlsdXJlOworfQorCisvKgorICogb21hcDRpc3NfcGlwZWxpbmVfc2V0X3N0cmVhbSAtIEVuYWJsZS9kaXNhYmxlIHN0cmVhbWluZyBvbiBhIHBpcGVsaW5lCisgKiBAcGlwZTogSVNTIHBpcGVsaW5lCisgKiBAc3RhdGU6IFN0cmVhbSBzdGF0ZSAoc3RvcHBlZCwgc2luZ2xlIHNob3Qgb3IgY29udGludW91cykKKyAqCisgKiBTZXQgdGhlIHBpcGVsaW5lIHRvIHRoZSBnaXZlbiBzdHJlYW0gc3RhdGUuIFBpcGVsaW5lcyBjYW4gYmUgc3RhcnRlZCBpbgorICogc2luZ2xlLXNob3Qgb3IgY29udGludW91cyBtb2RlLgorICoKKyAqIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZhaWxlZCB2aWRlbzo6c19zdHJlYW0KKyAqIG9wZXJhdGlvbiBvdGhlcndpc2UuIFRoZSBwaXBlbGluZSBzdGF0ZSBpcyBub3QgdXBkYXRlZCB3aGVuIHRoZSBvcGVyYXRpb24KKyAqIGZhaWxzLCBleGNlcHQgd2hlbiBzdG9wcGluZyB0aGUgcGlwZWxpbmUuCisgKi8KK2ludCBvbWFwNGlzc19waXBlbGluZV9zZXRfc3RyZWFtKHN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUsCisJCQkJIGVudW0gaXNzX3BpcGVsaW5lX3N0cmVhbV9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHN0YXRlID09IElTU19QSVBFTElORV9TVFJFQU1fU1RPUFBFRCkKKwkJcmV0ID0gaXNzX3BpcGVsaW5lX2Rpc2FibGUocGlwZSk7CisJZWxzZQorCQlyZXQgPSBpc3NfcGlwZWxpbmVfZW5hYmxlKHBpcGUsIHN0YXRlKTsKKworCWlmIChyZXQgPT0gMCB8fCBzdGF0ZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCisJCXBpcGUtPnN0cmVhbV9zdGF0ZSA9IHN0YXRlOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9tYXA0aXNzX3BpcGVsaW5lX2NhbmNlbF9zdHJlYW0gLSBDYW5jZWwgc3RyZWFtIG9uIGEgcGlwZWxpbmUKKyAqIEBwaXBlOiBJU1MgcGlwZWxpbmUKKyAqCisgKiBDYW5jZWxsaW5nIGEgc3RyZWFtIG1hcmsgYWxsIGJ1ZmZlcnMgb24gYWxsIHZpZGVvIG5vZGVzIGluIHRoZSBwaXBlbGluZSBhcworICogZXJyb25lb3VzIGFuZCBtYWtlcyBzdXJlIG5vIG5ldyBidWZmZXIgY2FuIGJlIHF1ZXVlZC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIHdoZW4gYSBmYXRhbCBlcnJvciB0aGF0IHByZXZlbnRzIGFueSBmdXJ0aGVyIG9wZXJhdGlvbiBvbiB0aGUgcGlwZWxpbmUKKyAqIG9jY3Vycy4KKyAqLwordm9pZCBvbWFwNGlzc19waXBlbGluZV9jYW5jZWxfc3RyZWFtKHN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUpCit7CisJaWYgKHBpcGUtPmlucHV0KQorCQlvbWFwNGlzc192aWRlb19jYW5jZWxfc3RyZWFtKHBpcGUtPmlucHV0KTsKKwlpZiAocGlwZS0+b3V0cHV0KQorCQlvbWFwNGlzc192aWRlb19jYW5jZWxfc3RyZWFtKHBpcGUtPm91dHB1dCk7Cit9CisKKy8qCisgKiBpc3NfcGlwZWxpbmVfaXNfbGFzdCAtIFZlcmlmeSBpZiBlbnRpdHkgaGFzIGFuIGVuYWJsZWQgbGluayB0byB0aGUgb3V0cHV0CisgKgkJCSAgdmlkZW8gbm9kZQorICogQG1lOiBJU1MgbW9kdWxlJ3MgbWVkaWEgZW50aXR5CisgKgorICogUmV0dXJucyAxIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGVuYWJsZWQgbGluayB0byB0aGUgb3V0cHV0IHZpZGVvIG5vZGUgb3IgMAorICogb3RoZXJ3aXNlLiBJdCdzIHRydWUgb25seSB3aGlsZSBwaXBlbGluZSBjYW4gaGF2ZSBubyBtb3JlIHRoYW4gb25lIG91dHB1dAorICogbm9kZS4KKyAqLworc3RhdGljIGludCBpc3NfcGlwZWxpbmVfaXNfbGFzdChzdHJ1Y3QgbWVkaWFfZW50aXR5ICptZSkKK3sKKwlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlOworCXN0cnVjdCBtZWRpYV9wYWQgKnBhZDsKKworCWlmICghbWUtPnBpcGUpCisJCXJldHVybiAwOworCXBpcGUgPSB0b19pc3NfcGlwZWxpbmUobWUpOworCWlmIChwaXBlLT5zdHJlYW1fc3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQlyZXR1cm4gMDsKKwlwYWQgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3BhZCgmcGlwZS0+b3V0cHV0LT5wYWQpOworCXJldHVybiBwYWQtPmVudGl0eSA9PSBtZTsKK30KKworc3RhdGljIGludCBpc3NfcmVzZXQoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOworCisJaXNzX3JlZ19zZXQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX1NZU0NPTkZJRywKKwkJICAgIElTU19ITF9TWVNDT05GSUdfU09GVFJFU0VUKTsKKworCXdoaWxlIChpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX1NZU0NPTkZJRykgJgorCSAgICAgICBJU1NfSExfU1lTQ09ORklHX1NPRlRSRVNFVCkgeworCQlpZiAodGltZW91dCsrID4gMTAwKSB7CisJCQlkZXZfYWxlcnQoaXNzLT5kZXYsICJjYW5ub3QgcmVzZXQgSVNTXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXVzbGVlcF9yYW5nZSgxMCwgMTApOworCX0KKworCWlzcy0+Y3Jhc2hlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNzX2lzcF9yZXNldChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDA7CisKKwkvKiBGaXN0LCBlbnN1cmUgdGhhdCB0aGUgSVNQIGlzIElETEUgKG5vIHRyYW5zYWN0aW9ucyBoYXBwZW5pbmcpICovCisJaXNzX3JlZ191cGRhdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X1NZU0NPTkZJRywKKwkJICAgICAgIElTUDVfU1lTQ09ORklHX1NUQU5EQllNT0RFX01BU0ssCisJCSAgICAgICBJU1A1X1NZU0NPTkZJR19TVEFOREJZTU9ERV9TTUFSVCk7CisKKwlpc3NfcmVnX3NldChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1NZUzEsIElTUDVfQ1RSTCwgSVNQNV9DVFJMX01TVEFOREJZKTsKKworCWZvciAoOzspIHsKKwkJaWYgKGlzc19yZWdfcmVhZChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1NZUzEsIElTUDVfQ1RSTCkgJgorCQkgICAgSVNQNV9DVFJMX01TVEFOREJZX1dBSVQpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQrKyA+IDEwMDApIHsKKwkJCWRldl9hbGVydChpc3MtPmRldiwgImNhbm5vdCBzZXQgSVNQNSB0byBzdGFuZGJ5XG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKKwl9CisKKwkvKiBOb3cgZmluYWxseSwgZG8gdGhlIHJlc2V0ICovCisJaXNzX3JlZ19zZXQoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X1NZU0NPTkZJRywKKwkJICAgIElTUDVfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisKKwl0aW1lb3V0ID0gMDsKKwl3aGlsZSAoaXNzX3JlZ19yZWFkKGlzcywgT01BUDRfSVNTX01FTV9JU1BfU1lTMSwgSVNQNV9TWVNDT05GSUcpICYKKwkgICAgICAgSVNQNV9TWVNDT05GSUdfU09GVFJFU0VUKSB7CisJCWlmICh0aW1lb3V0KysgPiAxMDAwKSB7CisJCQlkZXZfYWxlcnQoaXNzLT5kZXYsICJjYW5ub3QgcmVzZXQgSVNQNVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpc3NfbW9kdWxlX3N5bmNfaWRsZSAtIEhlbHBlciB0byBzeW5jIG1vZHVsZSB3aXRoIGl0cyBpZGxlIHN0YXRlCisgKiBAbWU6IElTUyBzdWJtb2R1bGUncyBtZWRpYSBlbnRpdHkKKyAqIEB3YWl0OiBJU1Mgc3VibW9kdWxlJ3Mgd2FpdCBxdWV1ZSBmb3Igc3RyZWFtb2ZmL2ludGVycnVwdCBzeW5jaHJvbml6YXRpb24KKyAqIEBzdG9wcGluZzogZmxhZyB3aGljaCB0ZWxscyBtb2R1bGUgd2FudHMgdG8gc3RvcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIElTUyBzdWJtb2R1bGUgbmVlZHMgdG8gd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQuIElmCisgKiB5ZXMsIG1ha2VzIHRoZSBjYWxsZXIgdG8gc2xlZXAgd2hpbGUgd2FpdGluZyBmb3Igc3VjaCBldmVudC4KKyAqLworaW50IG9tYXA0aXNzX21vZHVsZV9zeW5jX2lkbGUoc3RydWN0IG1lZGlhX2VudGl0eSAqbWUsIHdhaXRfcXVldWVfaGVhZF90ICp3YWl0LAorCQkJICAgICAgYXRvbWljX3QgKnN0b3BwaW5nKQoreworCXN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUgPSB0b19pc3NfcGlwZWxpbmUobWUpOworCXN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvID0gcGlwZS0+b3V0cHV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocGlwZS0+c3RyZWFtX3N0YXRlID09IElTU19QSVBFTElORV9TVFJFQU1fU1RPUFBFRCB8fAorCSAgICAocGlwZS0+c3RyZWFtX3N0YXRlID09IElTU19QSVBFTElORV9TVFJFQU1fU0lOR0xFU0hPVCAmJgorCSAgICAgIWlzc19waXBlbGluZV9yZWFkeShwaXBlKSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBhdG9taWNfc2V0KCkgZG9lc24ndCBpbmNsdWRlIG1lbW9yeSBiYXJyaWVyIG9uIEFSTSBwbGF0Zm9ybSBmb3IgU01QCisJICogc2NlbmFyaW8uIFdlJ2xsIGNhbGwgaXQgaGVyZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMuCisJICovCisJYXRvbWljX3NldChzdG9wcGluZywgMSk7CisJc21wX3dtYigpOworCisJLyoKKwkgKiBJZiBtb2R1bGUgaXMgdGhlIGxhc3Qgb25lLCBpdCdzIHdyaXRpbmcgdG8gbWVtb3J5LiBJbiB0aGlzIGNhc2UsCisJICogaXQncyBuZWNlc3NhcnkgdG8gY2hlY2sgaWYgdGhlIG1vZHVsZSBpcyBhbHJlYWR5IHBhdXNlZCBkdWUgdG8KKwkgKiBETUEgcXVldWUgdW5kZXJydW4gb3IgaWYgaXQgaGFzIHRvIHdhaXQgZm9yIG5leHQgaW50ZXJydXB0IHRvIGJlCisJICogaWRsZS4KKwkgKiBJZiBpdCBpc24ndCB0aGUgbGFzdCBvbmUsIHRoZSBmdW5jdGlvbiB3b24ndCBzbGVlcCBidXQgKnN0b3BwaW5nCisJICogd2lsbCBzdGlsbCBiZSBzZXQgdG8gd2FybiBuZXh0IHN1Ym1vZHVsZSBjYWxsZXIncyBpbnRlcnJ1cHQgdGhlCisJICogbW9kdWxlIHdhbnRzIHRvIGJlIGlkbGUuCisJICovCisJaWYgKCFpc3NfcGlwZWxpbmVfaXNfbGFzdChtZSkpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5xbG9jaywgZmxhZ3MpOworCWlmICh2aWRlby0+ZG1hcXVldWVfZmxhZ3MgJiBJU1NfVklERU9fRE1BUVVFVUVfVU5ERVJSVU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnFsb2NrLCBmbGFncyk7CisJCWF0b21pY19zZXQoc3RvcHBpbmcsIDApOworCQlzbXBfd21iKCk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dCgqd2FpdCwgIWF0b21pY19yZWFkKHN0b3BwaW5nKSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKSkgeworCQlhdG9taWNfc2V0KHN0b3BwaW5nLCAwKTsKKwkJc21wX3dtYigpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG9tYXA0aXNzX21vZHVsZV9zeW5jX2lzX3N0b3BwZWQgLSBIZWxwZXIgdG8gdmVyaWZ5IGlmIG1vZHVsZSB3YXMgc3RvcHBpbmcKKyAqIEB3YWl0OiBJU1Mgc3VibW9kdWxlJ3Mgd2FpdCBxdWV1ZSBmb3Igc3RyZWFtb2ZmL2ludGVycnVwdCBzeW5jaHJvbml6YXRpb24KKyAqIEBzdG9wcGluZzogZmxhZyB3aGljaCB0ZWxscyBtb2R1bGUgd2FudHMgdG8gc3RvcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIElTUyBzdWJtb2R1bGUgd2FzIHN0b3BwaW5nLiBJbiBjYXNlIG9mIHllcywgaXQKKyAqIG5vdGljZXMgdGhlIGNhbGxlciBieSBzZXR0aW5nIHN0b3BwaW5nIHRvIDAgYW5kIHdha2luZyB1cCB0aGUgd2FpdCBxdWV1ZS4KKyAqIFJldHVybnMgMSBpZiBpdCB3YXMgc3RvcHBpbmcgb3IgMCBvdGhlcndpc2UuCisgKi8KK2ludCBvbWFwNGlzc19tb2R1bGVfc3luY19pc19zdG9wcGluZyh3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdCwKKwkJCQkgICAgIGF0b21pY190ICpzdG9wcGluZykKK3sKKwlpZiAoYXRvbWljX2NtcHhjaGcoc3RvcHBpbmcsIDEsIDApKSB7CisJCXdha2VfdXAod2FpdCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2xvY2sgbWFuYWdlbWVudAorICovCisKKyNkZWZpbmUgSVNTX0NMS0NUUkxfTUFTSwkoSVNTX0NMS0NUUkxfQ1NJMl9BIHxcCisJCQkJIElTU19DTEtDVFJMX0NTSTJfQiB8XAorCQkJCSBJU1NfQ0xLQ1RSTF9JU1ApCisKK3N0YXRpYyBpbnQgX19pc3Nfc3ViY2xrX3VwZGF0ZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCXUzMiBjbGsgPSAwOworCWludCByZXQgPSAwLCB0aW1lb3V0ID0gMTAwMDsKKworCWlmIChpc3MtPnN1YmNsa19yZXNvdXJjZXMgJiBPTUFQNF9JU1NfU1VCQ0xLX0NTSTJfQSkKKwkJY2xrIHw9IElTU19DTEtDVFJMX0NTSTJfQTsKKworCWlmIChpc3MtPnN1YmNsa19yZXNvdXJjZXMgJiBPTUFQNF9JU1NfU1VCQ0xLX0NTSTJfQikKKwkJY2xrIHw9IElTU19DTEtDVFJMX0NTSTJfQjsKKworCWlmIChpc3MtPnN1YmNsa19yZXNvdXJjZXMgJiBPTUFQNF9JU1NfU1VCQ0xLX0lTUCkKKwkJY2xrIHw9IElTU19DTEtDVFJMX0lTUDsKKworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9UT1AsIElTU19DTEtDVFJMLAorCQkgICAgICAgSVNTX0NMS0NUUkxfTUFTSywgY2xrKTsKKworCS8qIFdhaXQgZm9yIEhXIGFzc2VydGlvbiAqLworCXdoaWxlICgtLXRpbWVvdXQgPiAwKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKChpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0NMS1NUQVQpICYKKwkJICAgIElTU19DTEtDVFJMX01BU0spID09IGNsaykKKwkJCWJyZWFrOworCX0KKworCWlmICghdGltZW91dCkKKwkJcmV0ID0gLUVCVVNZOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG9tYXA0aXNzX3N1YmNsa19lbmFibGUoc3RydWN0IGlzc19kZXZpY2UgKmlzcywKKwkJCSAgICBlbnVtIGlzc19zdWJjbGtfcmVzb3VyY2UgcmVzKQoreworCWlzcy0+c3ViY2xrX3Jlc291cmNlcyB8PSByZXM7CisKKwlyZXR1cm4gX19pc3Nfc3ViY2xrX3VwZGF0ZShpc3MpOworfQorCitpbnQgb21hcDRpc3Nfc3ViY2xrX2Rpc2FibGUoc3RydWN0IGlzc19kZXZpY2UgKmlzcywKKwkJCSAgICAgZW51bSBpc3Nfc3ViY2xrX3Jlc291cmNlIHJlcykKK3sKKwlpc3MtPnN1YmNsa19yZXNvdXJjZXMgJj0gfnJlczsKKworCXJldHVybiBfX2lzc19zdWJjbGtfdXBkYXRlKGlzcyk7Cit9CisKKyNkZWZpbmUgSVNTX0lTUDVfQ0xLQ1RSTF9NQVNLCShJU1A1X0NUUkxfQkxfQ0xLX0VOQUJMRSB8XAorCQkJCSBJU1A1X0NUUkxfSVNJRl9DTEtfRU5BQkxFIHxcCisJCQkJIElTUDVfQ1RSTF9IM0FfQ0xLX0VOQUJMRSB8XAorCQkJCSBJU1A1X0NUUkxfUlNaX0NMS19FTkFCTEUgfFwKKwkJCQkgSVNQNV9DVFJMX0lQSVBFX0NMS19FTkFCTEUgfFwKKwkJCQkgSVNQNV9DVFJMX0lQSVBFSUZfQ0xLX0VOQUJMRSkKKworc3RhdGljIHZvaWQgX19pc3NfaXNwX3N1YmNsa191cGRhdGUoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwl1MzIgY2xrID0gMDsKKworCWlmIChpc3MtPmlzcF9zdWJjbGtfcmVzb3VyY2VzICYgT01BUDRfSVNTX0lTUF9TVUJDTEtfSVNJRikKKwkJY2xrIHw9IElTUDVfQ1RSTF9JU0lGX0NMS19FTkFCTEU7CisKKwlpZiAoaXNzLT5pc3Bfc3ViY2xrX3Jlc291cmNlcyAmIE9NQVA0X0lTU19JU1BfU1VCQ0xLX0gzQSkKKwkJY2xrIHw9IElTUDVfQ1RSTF9IM0FfQ0xLX0VOQUJMRTsKKworCWlmIChpc3MtPmlzcF9zdWJjbGtfcmVzb3VyY2VzICYgT01BUDRfSVNTX0lTUF9TVUJDTEtfUlNaKQorCQljbGsgfD0gSVNQNV9DVFJMX1JTWl9DTEtfRU5BQkxFOworCisJaWYgKGlzcy0+aXNwX3N1YmNsa19yZXNvdXJjZXMgJiBPTUFQNF9JU1NfSVNQX1NVQkNMS19JUElQRSkKKwkJY2xrIHw9IElTUDVfQ1RSTF9JUElQRV9DTEtfRU5BQkxFOworCisJaWYgKGlzcy0+aXNwX3N1YmNsa19yZXNvdXJjZXMgJiBPTUFQNF9JU1NfSVNQX1NVQkNMS19JUElQRUlGKQorCQljbGsgfD0gSVNQNV9DVFJMX0lQSVBFSUZfQ0xLX0VOQUJMRTsKKworCWlmIChjbGspCisJCWNsayB8PSBJU1A1X0NUUkxfQkxfQ0xLX0VOQUJMRTsKKworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfU1lTMSwgSVNQNV9DVFJMLAorCQkgICAgICAgSVNTX0lTUDVfQ0xLQ1RSTF9NQVNLLCBjbGspOworfQorCit2b2lkIG9tYXA0aXNzX2lzcF9zdWJjbGtfZW5hYmxlKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsCisJCQkJZW51bSBpc3NfaXNwX3N1YmNsa19yZXNvdXJjZSByZXMpCit7CisJaXNzLT5pc3Bfc3ViY2xrX3Jlc291cmNlcyB8PSByZXM7CisKKwlfX2lzc19pc3Bfc3ViY2xrX3VwZGF0ZShpc3MpOworfQorCit2b2lkIG9tYXA0aXNzX2lzcF9zdWJjbGtfZGlzYWJsZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJCSBlbnVtIGlzc19pc3Bfc3ViY2xrX3Jlc291cmNlIHJlcykKK3sKKwlpc3MtPmlzcF9zdWJjbGtfcmVzb3VyY2VzICY9IH5yZXM7CisKKwlfX2lzc19pc3Bfc3ViY2xrX3VwZGF0ZShpc3MpOworfQorCisvKgorICogaXNzX2VuYWJsZV9jbG9ja3MgLSBFbmFibGUgSVNTIGNsb2NrcworICogQGlzczogT01BUDQgSVNTIGRldmljZQorICoKKyAqIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGNsa19lbmFibGUgcmV0dXJuIHZhbHVlIGlmIGFueSBvZiB0dGhlbSBmYWlscy4KKyAqLworc3RhdGljIGludCBpc3NfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfZW5hYmxlKGlzcy0+aXNzX2Zjayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiY2xrX2VuYWJsZSBpc3NfZmNrIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY2xrX2VuYWJsZShpc3MtPmlzc19jdHJsY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoaXNzLT5kZXYsICJjbGtfZW5hYmxlIGlzc19jdHJsY2xrIGZhaWxlZFxuIik7CisJCWNsa19kaXNhYmxlKGlzcy0+aXNzX2Zjayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpc3NfZGlzYWJsZV9jbG9ja3MgLSBEaXNhYmxlIElTUyBjbG9ja3MKKyAqIEBpc3M6IE9NQVA0IElTUyBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXNzX2Rpc2FibGVfY2xvY2tzKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJY2xrX2Rpc2FibGUoaXNzLT5pc3NfY3RybGNsayk7CisJY2xrX2Rpc2FibGUoaXNzLT5pc3NfZmNrKTsKK30KKworc3RhdGljIHZvaWQgaXNzX3B1dF9jbG9ja3Moc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlpZiAoaXNzLT5pc3NfZmNrKSB7CisJCWNsa19wdXQoaXNzLT5pc3NfZmNrKTsKKwkJaXNzLT5pc3NfZmNrID0gTlVMTDsKKwl9CisKKwlpZiAoaXNzLT5pc3NfY3RybGNsaykgeworCQljbGtfcHV0KGlzcy0+aXNzX2N0cmxjbGspOworCQlpc3MtPmlzc19jdHJsY2xrID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNzX2dldF9jbG9ja3Moc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlpc3MtPmlzc19mY2sgPSBjbGtfZ2V0KGlzcy0+ZGV2LCAiaXNzX2ZjayIpOworCWlmIChJU19FUlIoaXNzLT5pc3NfZmNrKSkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiVW5hYmxlIHRvIGdldCBpc3NfZmNrIGNsb2NrIGluZm9cbiIpOworCQlpc3NfcHV0X2Nsb2Nrcyhpc3MpOworCQlyZXR1cm4gUFRSX0VSUihpc3MtPmlzc19mY2spOworCX0KKworCWlzcy0+aXNzX2N0cmxjbGsgPSBjbGtfZ2V0KGlzcy0+ZGV2LCAiaXNzX2N0cmxjbGsiKTsKKwlpZiAoSVNfRVJSKGlzcy0+aXNzX2N0cmxjbGspKSB7CisJCWRldl9lcnIoaXNzLT5kZXYsICJVbmFibGUgdG8gZ2V0IGlzc19jdHJsY2xrIGNsb2NrIGluZm9cbiIpOworCQlpc3NfcHV0X2Nsb2Nrcyhpc3MpOworCQlyZXR1cm4gUFRSX0VSUihpc3MtPmlzc19mY2spOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogb21hcDRpc3NfZ2V0IC0gQWNxdWlyZSB0aGUgSVNTIHJlc291cmNlLgorICoKKyAqIEluaXRpYWxpemVzIHRoZSBjbG9ja3MgZm9yIHRoZSBmaXJzdCBhY3F1aXJlLgorICoKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBJU1MuIElmIHRoZSBmaXJzdCByZWZlcmVuY2UgaXMgdGFrZW4sCisgKiBlbmFibGUgY2xvY2tzIGFuZCBwb3dlci11cCBhbGwgc3VibW9kdWxlcy4KKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBJU1MgZGV2aWNlIHN0cnVjdHVyZSwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworc3RydWN0IGlzc19kZXZpY2UgKm9tYXA0aXNzX2dldChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICpfX2lzcyA9IGlzczsKKworCWlmIChpc3MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZpc3MtPmlzc19tdXRleCk7CisJaWYgKGlzcy0+cmVmX2NvdW50ID4gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaXNzX2VuYWJsZV9jbG9ja3MoaXNzKSA8IDApIHsKKwkJX19pc3MgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlpc3NfZW5hYmxlX2ludGVycnVwdHMoaXNzKTsKKworb3V0OgorCWlmIChfX2lzcyAhPSBOVUxMKQorCQlpc3MtPnJlZl9jb3VudCsrOworCW11dGV4X3VubG9jaygmaXNzLT5pc3NfbXV0ZXgpOworCisJcmV0dXJuIF9faXNzOworfQorCisvKgorICogb21hcDRpc3NfcHV0IC0gUmVsZWFzZSB0aGUgSVNTCisgKgorICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIElTUy4gSWYgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLAorICogcG93ZXItZG93biBhbGwgc3VibW9kdWxlcywgZGlzYWJsZSBjbG9ja3MgYW5kIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlcnMuCisgKi8KK3ZvaWQgb21hcDRpc3NfcHV0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJaWYgKGlzcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpc3MtPmlzc19tdXRleCk7CisJQlVHX09OKGlzcy0+cmVmX2NvdW50ID09IDApOworCWlmICgtLWlzcy0+cmVmX2NvdW50ID09IDApIHsKKwkJaXNzX2Rpc2FibGVfaW50ZXJydXB0cyhpc3MpOworCQkvKiBSZXNldCB0aGUgSVNTIGlmIGFuIGVudGl0eSBoYXMgZmFpbGVkIHRvIHN0b3AuIFRoaXMgaXMgdGhlCisJCSAqIG9ubHkgd2F5IHRvIHJlY292ZXIgZnJvbSBzdWNoIGNvbmRpdGlvbnMsIGFsdGhvdWdoIGl0IHdvdWxkCisJCSAqIGJlIHdvcnRoIGludmVzdGlnYXRpbmcgd2hldGhlciByZXNldHRpbmcgdGhlIElTUCBvbmx5IGNhbid0CisJCSAqIGZpeCB0aGUgcHJvYmxlbSBpbiBzb21lIGNhc2VzLgorCQkgKi8KKwkJaWYgKGlzcy0+Y3Jhc2hlZCkKKwkJCWlzc19yZXNldChpc3MpOworCQlpc3NfZGlzYWJsZV9jbG9ja3MoaXNzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpc3MtPmlzc19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgaXNzX21hcF9tZW1fcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJCWVudW0gaXNzX21lbV9yZXNvdXJjZXMgcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCisJLyogcmVxdWVzdCB0aGUgbWVtIHJlZ2lvbiBmb3IgdGhlIGNhbWVyYSByZWdpc3RlcnMgKi8KKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcmVzKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwgcGRldi0+bmFtZSkpIHsKKwkJZGV2X2Vycihpc3MtPmRldiwKKwkJCSJjYW5ub3QgcmVzZXJ2ZSBjYW1lcmEgcmVnaXN0ZXIgSS9PIHJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpc3MtPnJlc1tyZXNdID0gbWVtOworCisJLyogbWFwIHRoZSByZWdpb24gKi8KKwlpc3MtPnJlZ3NbcmVzXSA9IGlvcmVtYXBfbm9jYWNoZShtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICghaXNzLT5yZWdzW3Jlc10pIHsKKwkJZGV2X2Vycihpc3MtPmRldiwgImNhbm5vdCBtYXAgY2FtZXJhIHJlZ2lzdGVyIEkvTyByZWdpb25cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNzX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlvbWFwNGlzc19yZXNpemVyX3VucmVnaXN0ZXJfZW50aXRpZXMoJmlzcy0+cmVzaXplcik7CisJb21hcDRpc3NfaXBpcGVfdW5yZWdpc3Rlcl9lbnRpdGllcygmaXNzLT5pcGlwZSk7CisJb21hcDRpc3NfaXBpcGVpZl91bnJlZ2lzdGVyX2VudGl0aWVzKCZpc3MtPmlwaXBlaWYpOworCW9tYXA0aXNzX2NzaTJfdW5yZWdpc3Rlcl9lbnRpdGllcygmaXNzLT5jc2kyYSk7CisJb21hcDRpc3NfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKCZpc3MtPmNzaTJiKTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmlzcy0+djRsMl9kZXYpOworCW1lZGlhX2RldmljZV91bnJlZ2lzdGVyKCZpc3MtPm1lZGlhX2Rldik7Cit9CisKKy8qCisgKiBpc3NfcmVnaXN0ZXJfc3ViZGV2X2dyb3VwIC0gUmVnaXN0ZXIgYSBncm91cCBvZiBzdWJkZXZpY2VzCisgKiBAaXNzOiBPTUFQNCBJU1MgZGV2aWNlCisgKiBAYm9hcmRfaW5mbzogSTJDIHN1YmRldnMgYm9hcmQgaW5mb3JtYXRpb24gYXJyYXkKKyAqCisgKiBSZWdpc3RlciBhbGwgSTJDIHN1YmRldmljZXMgaW4gdGhlIGJvYXJkX2luZm8gYXJyYXkuIFRoZSBhcnJheSBtdXN0IGJlCisgKiB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBlbnRyeSwgYW5kIHRoZSBmaXJzdCBlbnRyeSBtdXN0IGJlIHRoZSBzZW5zb3IuCisgKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc2Vuc29yIG1lZGlhIGVudGl0eSBpZiBpdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAqIHJlZ2lzdGVyZWQsIG9yIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICoKK2lzc19yZWdpc3Rlcl9zdWJkZXZfZ3JvdXAoc3RydWN0IGlzc19kZXZpY2UgKmlzcywKKwkJICAgICBzdHJ1Y3QgaXNzX3N1YmRldl9pMmNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvciA9IE5VTEw7CisJdW5zaWduZWQgaW50IGZpcnN0OworCisJaWYgKGJvYXJkX2luZm8tPmJvYXJkX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGZpcnN0ID0gMTsgYm9hcmRfaW5mby0+Ym9hcmRfaW5mbzsgKytib2FyZF9pbmZvLCBmaXJzdCA9IDApIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXY7CisJCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKworCQlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKGJvYXJkX2luZm8tPmkyY19hZGFwdGVyX2lkKTsKKwkJaWYgKGFkYXB0ZXIgPT0gTlVMTCkgeworCQkJZGV2X2Vycihpc3MtPmRldiwKKwkJCQkiJXM6IFVuYWJsZSB0byBnZXQgSTJDIGFkYXB0ZXIgJWQgZm9yIGRldmljZSAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgYm9hcmRfaW5mby0+aTJjX2FkYXB0ZXJfaWQsCisJCQkJYm9hcmRfaW5mby0+Ym9hcmRfaW5mby0+dHlwZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN1YmRldiA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmlzcy0+djRsMl9kZXYsIGFkYXB0ZXIsCisJCQkJYm9hcmRfaW5mby0+Ym9hcmRfaW5mbywgTlVMTCk7CisJCWlmIChzdWJkZXYgPT0gTlVMTCkgeworCQkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgc3ViZGV2ICVzXG4iLAorCQkJCV9fZnVuY19fLCBib2FyZF9pbmZvLT5ib2FyZF9pbmZvLT50eXBlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGZpcnN0KQorCQkJc2Vuc29yID0gc3ViZGV2OworCX0KKworCXJldHVybiBzZW5zb3I7Cit9CisKK3N0YXRpYyBpbnQgaXNzX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJc3RydWN0IGlzc19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGlzcy0+cGRhdGE7CisJc3RydWN0IGlzc192NGwyX3N1YmRldnNfZ3JvdXAgKnN1YmRldnM7CisJaW50IHJldDsKKworCWlzcy0+bWVkaWFfZGV2LmRldiA9IGlzcy0+ZGV2OworCXN0cmxjcHkoaXNzLT5tZWRpYV9kZXYubW9kZWwsICJUSSBPTUFQNCBJU1MiLAorCQlzaXplb2YoaXNzLT5tZWRpYV9kZXYubW9kZWwpKTsKKwlpc3MtPm1lZGlhX2Rldi5od19yZXZpc2lvbiA9IGlzcy0+cmV2aXNpb247CisJaXNzLT5tZWRpYV9kZXYubGlua19ub3RpZnkgPSBpc3NfcGlwZWxpbmVfbGlua19ub3RpZnk7CisJcmV0ID0gbWVkaWFfZGV2aWNlX3JlZ2lzdGVyKCZpc3MtPm1lZGlhX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBNZWRpYSBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaXNzLT52NGwyX2Rldi5tZGV2ID0gJmlzcy0+bWVkaWFfZGV2OworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKGlzcy0+ZGV2LCAmaXNzLT52NGwyX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBWNEwyIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVybmFsIGVudGl0aWVzICovCisJcmV0ID0gb21hcDRpc3NfY3NpMl9yZWdpc3Rlcl9lbnRpdGllcygmaXNzLT5jc2kyYSwgJmlzcy0+djRsMl9kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvbWFwNGlzc19jc2kyX3JlZ2lzdGVyX2VudGl0aWVzKCZpc3MtPmNzaTJiLCAmaXNzLT52NGwyX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG9tYXA0aXNzX2lwaXBlaWZfcmVnaXN0ZXJfZW50aXRpZXMoJmlzcy0+aXBpcGVpZiwgJmlzcy0+djRsMl9kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvbWFwNGlzc19pcGlwZV9yZWdpc3Rlcl9lbnRpdGllcygmaXNzLT5pcGlwZSwgJmlzcy0+djRsMl9kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvbWFwNGlzc19yZXNpemVyX3JlZ2lzdGVyX2VudGl0aWVzKCZpc3MtPnJlc2l6ZXIsICZpc3MtPnY0bDJfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJLyogUmVnaXN0ZXIgZXh0ZXJuYWwgZW50aXRpZXMgKi8KKwlmb3IgKHN1YmRldnMgPSBwZGF0YS0+c3ViZGV2czsgc3ViZGV2cyAmJiBzdWJkZXZzLT5zdWJkZXZzOyArK3N1YmRldnMpIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3I7CisJCXN0cnVjdCBtZWRpYV9lbnRpdHkgKmlucHV0OworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJCXVuc2lnbmVkIGludCBwYWQ7CisKKwkJc2Vuc29yID0gaXNzX3JlZ2lzdGVyX3N1YmRldl9ncm91cChpc3MsIHN1YmRldnMtPnN1YmRldnMpOworCQlpZiAoc2Vuc29yID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlzZW5zb3ItPmhvc3RfcHJpdiA9IHN1YmRldnM7CisKKwkJLyogQ29ubmVjdCB0aGUgc2Vuc29yIHRvIHRoZSBjb3JyZWN0IGludGVyZmFjZSBtb2R1bGUuCisJCSAqIENTSTJhIHJlY2VpdmVyIHRocm91Z2ggQ1NJUEhZMSwgb3IKKwkJICogQ1NJMmIgcmVjZWl2ZXIgdGhyb3VnaCBDU0lQSFkyCisJCSAqLworCQlzd2l0Y2ggKHN1YmRldnMtPmludGVyZmFjZSkgeworCQljYXNlIElTU19JTlRFUkZBQ0VfQ1NJMkFfUEhZMToKKwkJCWlucHV0ID0gJmlzcy0+Y3NpMmEuc3ViZGV2LmVudGl0eTsKKwkJCXBhZCA9IENTSTJfUEFEX1NJTks7CisJCQlmbGFncyA9IE1FRElBX0xOS19GTF9JTU1VVEFCTEUKKwkJCSAgICAgIHwgTUVESUFfTE5LX0ZMX0VOQUJMRUQ7CisJCQlicmVhazsKKworCQljYXNlIElTU19JTlRFUkZBQ0VfQ1NJMkJfUEhZMjoKKwkJCWlucHV0ID0gJmlzcy0+Y3NpMmIuc3ViZGV2LmVudGl0eTsKKwkJCXBhZCA9IENTSTJfUEFEX1NJTks7CisJCQlmbGFncyA9IE1FRElBX0xOS19GTF9JTU1VVEFCTEUKKwkJCSAgICAgIHwgTUVESUFfTE5LX0ZMX0VOQUJMRUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBpbnZhbGlkIGludGVyZmFjZSB0eXBlICV1XG4iLAorCQkJCV9fZnVuY19fLCBzdWJkZXZzLT5pbnRlcmZhY2UpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmc2Vuc29yLT5lbnRpdHksIDAsIGlucHV0LCBwYWQsCisJCQkJCSAgICAgICBmbGFncyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCX0KKworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldl9ub2RlcygmaXNzLT52NGwyX2Rldik7CisKK2RvbmU6CisJaWYgKHJldCA8IDApCisJCWlzc191bnJlZ2lzdGVyX2VudGl0aWVzKGlzcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpc3NfY2xlYW51cF9tb2R1bGVzKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJb21hcDRpc3NfY3NpMl9jbGVhbnVwKGlzcyk7CisJb21hcDRpc3NfaXBpcGVpZl9jbGVhbnVwKGlzcyk7CisJb21hcDRpc3NfaXBpcGVfY2xlYW51cChpc3MpOworCW9tYXA0aXNzX3Jlc2l6ZXJfY2xlYW51cChpc3MpOworfQorCitzdGF0aWMgaW50IGlzc19pbml0aWFsaXplX21vZHVsZXMoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb21hcDRpc3NfY3NpcGh5X2luaXQoaXNzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiQ1NJIFBIWSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2NzaXBoeTsKKwl9CisKKwlyZXQgPSBvbWFwNGlzc19jc2kyX2luaXQoaXNzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiQ1NJMiBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2NzaTI7CisJfQorCisJcmV0ID0gb21hcDRpc3NfaXBpcGVpZl9pbml0KGlzcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihpc3MtPmRldiwgIklTUCBJUElQRUlGIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfaXBpcGVpZjsKKwl9CisKKwlyZXQgPSBvbWFwNGlzc19pcGlwZV9pbml0KGlzcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihpc3MtPmRldiwgIklTUCBJUElQRSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2lwaXBlOworCX0KKworCXJldCA9IG9tYXA0aXNzX3Jlc2l6ZXJfaW5pdChpc3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaXNzLT5kZXYsICJJU1AgUkVTSVpFUiBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3Jlc2l6ZXI7CisJfQorCisJLyogQ29ubmVjdCB0aGUgc3VibW9kdWxlcy4gKi8KKwlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoCisJCQkmaXNzLT5jc2kyYS5zdWJkZXYuZW50aXR5LCBDU0kyX1BBRF9TT1VSQ0UsCisJCQkmaXNzLT5pcGlwZWlmLnN1YmRldi5lbnRpdHksIElQSVBFSUZfUEFEX1NJTkssIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2xpbms7CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoCisJCQkmaXNzLT5jc2kyYi5zdWJkZXYuZW50aXR5LCBDU0kyX1BBRF9TT1VSQ0UsCisJCQkmaXNzLT5pcGlwZWlmLnN1YmRldi5lbnRpdHksIElQSVBFSUZfUEFEX1NJTkssIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2xpbms7CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoCisJCQkmaXNzLT5pcGlwZWlmLnN1YmRldi5lbnRpdHksIElQSVBFSUZfUEFEX1NPVVJDRV9WUCwKKwkJCSZpc3MtPnJlc2l6ZXIuc3ViZGV2LmVudGl0eSwgUkVTSVpFUl9QQURfU0lOSywgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfbGluazsKKworCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygKKwkJCSZpc3MtPmlwaXBlaWYuc3ViZGV2LmVudGl0eSwgSVBJUEVJRl9QQURfU09VUkNFX1ZQLAorCQkJJmlzcy0+aXBpcGUuc3ViZGV2LmVudGl0eSwgSVBJUEVfUEFEX1NJTkssIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2xpbms7CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoCisJCQkmaXNzLT5pcGlwZS5zdWJkZXYuZW50aXR5LCBJUElQRV9QQURfU09VUkNFX1ZQLAorCQkJJmlzcy0+cmVzaXplci5zdWJkZXYuZW50aXR5LCBSRVNJWkVSX1BBRF9TSU5LLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9saW5rOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2xpbms6CisJb21hcDRpc3NfcmVzaXplcl9jbGVhbnVwKGlzcyk7CitlcnJvcl9yZXNpemVyOgorCW9tYXA0aXNzX2lwaXBlX2NsZWFudXAoaXNzKTsKK2Vycm9yX2lwaXBlOgorCW9tYXA0aXNzX2lwaXBlaWZfY2xlYW51cChpc3MpOworZXJyb3JfaXBpcGVpZjoKKwlvbWFwNGlzc19jc2kyX2NsZWFudXAoaXNzKTsKK2Vycm9yX2NzaTI6CitlcnJvcl9jc2lwaHk6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc3NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXNzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHBkYXRhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaXNzID0ga3phbGxvYyhzaXplb2YoKmlzcyksIEdGUF9LRVJORUwpOworCWlmICghaXNzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZpc3MtPmlzc19tdXRleCk7CisKKwlpc3MtPmRldiA9ICZwZGV2LT5kZXY7CisJaXNzLT5wZGF0YSA9IHBkYXRhOworCisJaXNzLT5yYXdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJaXNzLT5kZXYtPmRtYV9tYXNrID0gJmlzcy0+cmF3X2RtYW1hc2s7CisJaXNzLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlzcyk7CisKKwkvKiBDbG9ja3MgKi8KKwlyZXQgPSBpc3NfbWFwX21lbV9yZXNvdXJjZShwZGV2LCBpc3MsIE9NQVA0X0lTU19NRU1fVE9QKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGlzc19nZXRfY2xvY2tzKGlzcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAob21hcDRpc3NfZ2V0KGlzcykgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGlzc19yZXNldChpc3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2lzczsKKworCWlzcy0+cmV2aXNpb24gPSBpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX1RPUCwgSVNTX0hMX1JFVklTSU9OKTsKKwlkZXZfaW5mbyhpc3MtPmRldiwgIlJldmlzaW9uICUwOHggZm91bmRcbiIsIGlzcy0+cmV2aXNpb24pOworCisJZm9yIChpID0gMTsgaSA8IE9NQVA0X0lTU19NRU1fTEFTVDsgaSsrKSB7CisJCXJldCA9IGlzc19tYXBfbWVtX3Jlc291cmNlKHBkZXYsIGlzcywgaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX2lzczsKKwl9CisKKwkvKiBDb25maWd1cmUgQlRFIEJXX0xJTUlURVIgZmllbGQgdG8gbWF4IHJlY29tbWVuZGVkIHZhbHVlICgxIEdCKSAqLworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9CVEUsIEJURV9DVFJMLAorCQkgICAgICAgQlRFX0NUUkxfQldfTElNSVRFUl9NQVNLLAorCQkgICAgICAgMTggPDwgQlRFX0NUUkxfQldfTElNSVRFUl9TSElGVCk7CisKKwkvKiBQZXJmb3JtIElTUCByZXNldCAqLworCXJldCA9IG9tYXA0aXNzX3N1YmNsa19lbmFibGUoaXNzLCBPTUFQNF9JU1NfU1VCQ0xLX0lTUCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfaXNzOworCisJcmV0ID0gaXNzX2lzcF9yZXNldChpc3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2lzczsKKworCWRldl9pbmZvKGlzcy0+ZGV2LCAiSVNQIFJldmlzaW9uICUwOHggZm91bmRcbiIsCisJCSBpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9TWVMxLCBJU1A1X1JFVklTSU9OKSk7CisKKwkvKiBJbnRlcnJ1cHQgKi8KKwlpc3MtPmlycV9udW0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpc3MtPmlycV9udW0gPD0gMCkgeworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiTm8gSVJRIHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9pc3M7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGlzcy0+aXJxX251bSwgaXNzX2lzciwgSVJRRl9TSEFSRUQsICJPTUFQNCBJU1MiLCBpc3MpKSB7CisJCWRldl9lcnIoaXNzLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBJUlFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX2lzczsKKwl9CisKKwkvKiBFbnRpdGllcyAqLworCXJldCA9IGlzc19pbml0aWFsaXplX21vZHVsZXMoaXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9pcnE7CisKKwlyZXQgPSBpc3NfcmVnaXN0ZXJfZW50aXRpZXMoaXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9tb2R1bGVzOworCisJb21hcDRpc3NfcHV0KGlzcyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfbW9kdWxlczoKKwlpc3NfY2xlYW51cF9tb2R1bGVzKGlzcyk7CitlcnJvcl9pcnE6CisJZnJlZV9pcnEoaXNzLT5pcnFfbnVtLCBpc3MpOworZXJyb3JfaXNzOgorCW9tYXA0aXNzX3B1dChpc3MpOworZXJyb3I6CisJaXNzX3B1dF9jbG9ja3MoaXNzKTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQNF9JU1NfTUVNX0xBU1Q7IGkrKykgeworCQlpZiAoaXNzLT5yZWdzW2ldKSB7CisJCQlpb3VubWFwKGlzcy0+cmVnc1tpXSk7CisJCQlpc3MtPnJlZ3NbaV0gPSBOVUxMOworCQl9CisKKwkJaWYgKGlzcy0+cmVzW2ldKSB7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oaXNzLT5yZXNbaV0tPnN0YXJ0LAorCQkJCQkgICByZXNvdXJjZV9zaXplKGlzcy0+cmVzW2ldKSk7CisJCQlpc3MtPnJlc1tpXSA9IE5VTEw7CisJCX0KKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwltdXRleF9kZXN0cm95KCZpc3MtPmlzc19tdXRleCk7CisJa2ZyZWUoaXNzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlzc191bnJlZ2lzdGVyX2VudGl0aWVzKGlzcyk7CisJaXNzX2NsZWFudXBfbW9kdWxlcyhpc3MpOworCisJZnJlZV9pcnEoaXNzLT5pcnFfbnVtLCBpc3MpOworCWlzc19wdXRfY2xvY2tzKGlzcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUDRfSVNTX01FTV9MQVNUOyBpKyspIHsKKwkJaWYgKGlzcy0+cmVnc1tpXSkgeworCQkJaW91bm1hcChpc3MtPnJlZ3NbaV0pOworCQkJaXNzLT5yZWdzW2ldID0gTlVMTDsKKwkJfQorCisJCWlmIChpc3MtPnJlc1tpXSkgeworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGlzcy0+cmVzW2ldLT5zdGFydCwKKwkJCQkJICAgcmVzb3VyY2Vfc2l6ZShpc3MtPnJlc1tpXSkpOworCQkJaXNzLT5yZXNbaV0gPSBOVUxMOworCQl9CisJfQorCisJa2ZyZWUoaXNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBvbWFwNGlzc19pZF90YWJsZVtdID0geworCXsgIm9tYXA0aXNzIiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBvbWFwNGlzc19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlzc19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGlzc19wcm9iZSwKKwkucmVtb3ZlCQk9IGlzc19yZW1vdmUsCisJLmlkX3RhYmxlCT0gb21hcDRpc3NfaWRfdGFibGUsCisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gIm9tYXA0aXNzIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihpc3NfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBPTUFQNCBJU1MgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihJU1NfVklERU9fRFJJVkVSX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzcy5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmRiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogQXV0aG9yOiBTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9PTUFQNF9JU1NfSF8KKyNkZWZpbmUgX09NQVA0X0lTU19IXworCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL29tYXA0aXNzLmg+CisKKyNpbmNsdWRlICJpc3NfcmVncy5oIgorI2luY2x1ZGUgImlzc19jc2lwaHkuaCIKKyNpbmNsdWRlICJpc3NfY3NpMi5oIgorI2luY2x1ZGUgImlzc19pcGlwZWlmLmgiCisjaW5jbHVkZSAiaXNzX2lwaXBlLmgiCisjaW5jbHVkZSAiaXNzX3Jlc2l6ZXIuaCIKKworI2RlZmluZSB0b19pc3NfZGV2aWNlKHB0cl9tb2R1bGUpCQkJCVwKKwljb250YWluZXJfb2YocHRyX21vZHVsZSwgc3RydWN0IGlzc19kZXZpY2UsIHB0cl9tb2R1bGUpCisjZGVmaW5lIHRvX2RldmljZShwdHJfbW9kdWxlKQkJCQkJCVwKKwkodG9faXNzX2RldmljZShwdHJfbW9kdWxlKS0+ZGV2KQorCitlbnVtIGlzc19tZW1fcmVzb3VyY2VzIHsKKwlPTUFQNF9JU1NfTUVNX1RPUCwKKwlPTUFQNF9JU1NfTUVNX0NTSTJfQV9SRUdTMSwKKwlPTUFQNF9JU1NfTUVNX0NBTUVSQVJYX0NPUkUxLAorCU9NQVA0X0lTU19NRU1fQ1NJMl9CX1JFR1MxLAorCU9NQVA0X0lTU19NRU1fQ0FNRVJBUlhfQ09SRTIsCisJT01BUDRfSVNTX01FTV9CVEUsCisJT01BUDRfSVNTX01FTV9JU1BfU1lTMSwKKwlPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLAorCU9NQVA0X0lTU19NRU1fSVNQX0lQSVBFLAorCU9NQVA0X0lTU19NRU1fSVNQX0lTSUYsCisJT01BUDRfSVNTX01FTV9JU1BfSVBJUEVJRiwKKwlPTUFQNF9JU1NfTUVNX0xBU1QsCit9OworCitlbnVtIGlzc19zdWJjbGtfcmVzb3VyY2UgeworCU9NQVA0X0lTU19TVUJDTEtfU0lNQ09QCQk9ICgxIDw8IDApLAorCU9NQVA0X0lTU19TVUJDTEtfSVNQCQk9ICgxIDw8IDEpLAorCU9NQVA0X0lTU19TVUJDTEtfQ1NJMl9BCQk9ICgxIDw8IDIpLAorCU9NQVA0X0lTU19TVUJDTEtfQ1NJMl9CCQk9ICgxIDw8IDMpLAorCU9NQVA0X0lTU19TVUJDTEtfQ0NQMgkJPSAoMSA8PCA0KSwKK307CisKK2VudW0gaXNzX2lzcF9zdWJjbGtfcmVzb3VyY2UgeworCU9NQVA0X0lTU19JU1BfU1VCQ0xLX0JMCQk9ICgxIDw8IDApLAorCU9NQVA0X0lTU19JU1BfU1VCQ0xLX0lTSUYJPSAoMSA8PCAxKSwKKwlPTUFQNF9JU1NfSVNQX1NVQkNMS19IM0EJPSAoMSA8PCAyKSwKKwlPTUFQNF9JU1NfSVNQX1NVQkNMS19SU1oJPSAoMSA8PCAzKSwKKwlPTUFQNF9JU1NfSVNQX1NVQkNMS19JUElQRQk9ICgxIDw8IDQpLAorCU9NQVA0X0lTU19JU1BfU1VCQ0xLX0lQSVBFSUYJPSAoMSA8PCA1KSwKK307CisKKy8qCisgKiBzdHJ1Y3QgaXNzX3JlZyAtIFN0cnVjdHVyZSBmb3IgSVNTIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIEByZWc6IDMyLWJpdCBSZWdpc3RlciBhZGRyZXNzLgorICogQHZhbDogMzItYml0IFJlZ2lzdGVyIHZhbHVlLgorICovCitzdHJ1Y3QgaXNzX3JlZyB7CisJZW51bSBpc3NfbWVtX3Jlc291cmNlcyBtbWlvX3JhbmdlOworCXUzMiByZWc7CisJdTMyIHZhbDsKK307CisKKy8qCisgKiBzdHJ1Y3QgaXNzX2RldmljZSAtIElTUyBkZXZpY2Ugc3RydWN0dXJlLgorICogQGNyYXNoZWQ6IEJpdG1hc2sgb2YgY3Jhc2hlZCBlbnRpdGllcyAoaW5kZXhlZCBieSBlbnRpdHkgSUQpCisgKi8KK3N0cnVjdCBpc3NfZGV2aWNlIHsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJc3RydWN0IG1lZGlhX2RldmljZSBtZWRpYV9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXUzMiByZXZpc2lvbjsKKworCS8qIHBsYXRmb3JtIEhXIHJlc291cmNlcyAqLworCXN0cnVjdCBpc3NfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJdW5zaWduZWQgaW50IGlycV9udW07CisKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc1tPTUFQNF9JU1NfTUVNX0xBU1RdOworCXZvaWQgX19pb21lbSAqcmVnc1tPTUFQNF9JU1NfTUVNX0xBU1RdOworCisJdTY0IHJhd19kbWFtYXNrOworCisJc3RydWN0IG11dGV4IGlzc19tdXRleDsJLyogRm9yIGhhbmRsaW5nIHJlZl9jb3VudCBmaWVsZCAqLworCWJvb2wgY3Jhc2hlZDsKKwlpbnQgaGFzX2NvbnRleHQ7CisJaW50IHJlZl9jb3VudDsKKworCXN0cnVjdCBjbGsgKmlzc19mY2s7CisJc3RydWN0IGNsayAqaXNzX2N0cmxjbGs7CisKKwkvKiBJU1MgbW9kdWxlcyAqLworCXN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgY3NpMmE7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSBjc2kyYjsKKwlzdHJ1Y3QgaXNzX2NzaXBoeSBjc2lwaHkxOworCXN0cnVjdCBpc3NfY3NpcGh5IGNzaXBoeTI7CisJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSBpcGlwZWlmOworCXN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlIGlwaXBlOworCXN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgcmVzaXplcjsKKworCXVuc2lnbmVkIGludCBzdWJjbGtfcmVzb3VyY2VzOworCXVuc2lnbmVkIGludCBpc3Bfc3ViY2xrX3Jlc291cmNlczsKK307CisKKyNkZWZpbmUgdjRsMl9kZXZfdG9faXNzX2RldmljZShkZXYpIFwKKwljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaXNzX2RldmljZSwgdjRsMl9kZXYpCisKK2ludCBvbWFwNGlzc19nZXRfZXh0ZXJuYWxfaW5mbyhzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlLAorCQkJICAgICAgIHN0cnVjdCBtZWRpYV9saW5rICpsaW5rKTsKKworaW50IG9tYXA0aXNzX21vZHVsZV9zeW5jX2lkbGUoc3RydWN0IG1lZGlhX2VudGl0eSAqbWUsIHdhaXRfcXVldWVfaGVhZF90ICp3YWl0LAorCQkJICAgICAgYXRvbWljX3QgKnN0b3BwaW5nKTsKKworaW50IG9tYXA0aXNzX21vZHVsZV9zeW5jX2lzX3N0b3BwaW5nKHdhaXRfcXVldWVfaGVhZF90ICp3YWl0LAorCQkJCSAgICAgYXRvbWljX3QgKnN0b3BwaW5nKTsKKworaW50IG9tYXA0aXNzX3BpcGVsaW5lX3NldF9zdHJlYW0oc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSwKKwkJCQkgZW51bSBpc3NfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHN0YXRlKTsKK3ZvaWQgb21hcDRpc3NfcGlwZWxpbmVfY2FuY2VsX3N0cmVhbShzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlKTsKKwordm9pZCBvbWFwNGlzc19jb25maWd1cmVfYnJpZGdlKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsCisJCQkgICAgICAgZW51bSBpcGlwZWlmX2lucHV0X2VudGl0eSBpbnB1dCk7CisKK3N0cnVjdCBpc3NfZGV2aWNlICpvbWFwNGlzc19nZXQoc3RydWN0IGlzc19kZXZpY2UgKmlzcyk7Cit2b2lkIG9tYXA0aXNzX3B1dChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKTsKK2ludCBvbWFwNGlzc19zdWJjbGtfZW5hYmxlKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsCisJCQkgICBlbnVtIGlzc19zdWJjbGtfcmVzb3VyY2UgcmVzKTsKK2ludCBvbWFwNGlzc19zdWJjbGtfZGlzYWJsZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJICAgIGVudW0gaXNzX3N1YmNsa19yZXNvdXJjZSByZXMpOwordm9pZCBvbWFwNGlzc19pc3Bfc3ViY2xrX2VuYWJsZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJCWVudW0gaXNzX2lzcF9zdWJjbGtfcmVzb3VyY2UgcmVzKTsKK3ZvaWQgb21hcDRpc3NfaXNwX3N1YmNsa19kaXNhYmxlKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsCisJCQkJIGVudW0gaXNzX2lzcF9zdWJjbGtfcmVzb3VyY2UgcmVzKTsKKworaW50IG9tYXA0aXNzX3BpcGVsaW5lX3BtX3VzZShzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHksIGludCB1c2UpOworCitpbnQgb21hcDRpc3NfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KTsKK3ZvaWQgb21hcDRpc3NfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworLyoKKyAqIGlzc19yZWdfcmVhZCAtIFJlYWQgdGhlIHZhbHVlIG9mIGFuIE9NQVA0IElTUyByZWdpc3RlcgorICogQGlzczogdGhlIElTUyBkZXZpY2UKKyAqIEByZXM6IG1lbW9yeSByZXNvdXJjZSBpbiB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgbG9jYXRlZAorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IGluIHRoZSBtZW1vcnkgcmVzb3VyY2UKKyAqCisgKiBSZXR1cm4gdGhlIHJlZ2lzdGVyIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lCit1MzIgaXNzX3JlZ19yZWFkKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsIGVudW0gaXNzX21lbV9yZXNvdXJjZXMgcmVzLAorCQkgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoaXNzLT5yZWdzW3Jlc10gKyBvZmZzZXQpOworfQorCisvKgorICogaXNzX3JlZ193cml0ZSAtIFdyaXRlIGEgdmFsdWUgdG8gYW4gT01BUDQgSVNTIHJlZ2lzdGVyCisgKiBAaXNzOiB0aGUgSVNTIGRldmljZQorICogQHJlczogbWVtb3J5IHJlc291cmNlIGluIHdoaWNoIHRoZSByZWdpc3RlciBpcyBsb2NhdGVkCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgaW4gdGhlIG1lbW9yeSByZXNvdXJjZQorICogQHZhbHVlOiB2YWx1ZSB0byBiZSB3cml0dGVuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaXNzX3JlZ193cml0ZShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLCBlbnVtIGlzc19tZW1fcmVzb3VyY2VzIHJlcywKKwkJICAgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgaXNzLT5yZWdzW3Jlc10gKyBvZmZzZXQpOworfQorCisvKgorICogaXNzX3JlZ19jbHIgLSBDbGVhciBiaXRzIGluIGFuIE9NQVA0IElTUyByZWdpc3RlcgorICogQGlzczogdGhlIElTUyBkZXZpY2UKKyAqIEByZXM6IG1lbW9yeSByZXNvdXJjZSBpbiB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgbG9jYXRlZAorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IGluIHRoZSBtZW1vcnkgcmVzb3VyY2UKKyAqIEBjbHI6IGJpdCBtYXNrIHRvIGJlIGNsZWFyZWQKKyAqLworc3RhdGljIGlubGluZQordm9pZCBpc3NfcmVnX2NscihzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLCBlbnVtIGlzc19tZW1fcmVzb3VyY2VzIHJlcywKKwkJIHUzMiBvZmZzZXQsIHUzMiBjbHIpCit7CisJdTMyIHYgPSBpc3NfcmVnX3JlYWQoaXNzLCByZXMsIG9mZnNldCk7CisKKwlpc3NfcmVnX3dyaXRlKGlzcywgcmVzLCBvZmZzZXQsIHYgJiB+Y2xyKTsKK30KKworLyoKKyAqIGlzc19yZWdfc2V0IC0gU2V0IGJpdHMgaW4gYW4gT01BUDQgSVNTIHJlZ2lzdGVyCisgKiBAaXNzOiB0aGUgSVNTIGRldmljZQorICogQHJlczogbWVtb3J5IHJlc291cmNlIGluIHdoaWNoIHRoZSByZWdpc3RlciBpcyBsb2NhdGVkCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgaW4gdGhlIG1lbW9yeSByZXNvdXJjZQorICogQHNldDogYml0IG1hc2sgdG8gYmUgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaXNzX3JlZ19zZXQoc3RydWN0IGlzc19kZXZpY2UgKmlzcywgZW51bSBpc3NfbWVtX3Jlc291cmNlcyByZXMsCisJCSB1MzIgb2Zmc2V0LCB1MzIgc2V0KQoreworCXUzMiB2ID0gaXNzX3JlZ19yZWFkKGlzcywgcmVzLCBvZmZzZXQpOworCisJaXNzX3JlZ193cml0ZShpc3MsIHJlcywgb2Zmc2V0LCB2IHwgc2V0KTsKK30KKworLyoKKyAqIGlzc19yZWdfdXBkYXRlIC0gQ2xlYXIgYW5kIHNldCBiaXRzIGluIGFuIE9NQVA0IElTUyByZWdpc3RlcgorICogQGlzczogdGhlIElTUyBkZXZpY2UKKyAqIEByZXM6IG1lbW9yeSByZXNvdXJjZSBpbiB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgbG9jYXRlZAorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IGluIHRoZSBtZW1vcnkgcmVzb3VyY2UKKyAqIEBjbHI6IGJpdCBtYXNrIHRvIGJlIGNsZWFyZWQKKyAqIEBzZXQ6IGJpdCBtYXNrIHRvIGJlIHNldAorICoKKyAqIENsZWFyIHRoZSBjbHIgbWFzayBmaXJzdCBhbmQgdGhlbiBzZXQgdGhlIHNldCBtYXNrLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGlzc19yZWdfdXBkYXRlKHN0cnVjdCBpc3NfZGV2aWNlICppc3MsIGVudW0gaXNzX21lbV9yZXNvdXJjZXMgcmVzLAorCQkgICAgdTMyIG9mZnNldCwgdTMyIGNsciwgdTMyIHNldCkKK3sKKwl1MzIgdiA9IGlzc19yZWdfcmVhZChpc3MsIHJlcywgb2Zmc2V0KTsKKworCWlzc19yZWdfd3JpdGUoaXNzLCByZXMsIG9mZnNldCwgKHYgJiB+Y2xyKSB8IHNldCk7Cit9CisKKyNlbmRpZiAvKiBfT01BUDRfSVNTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfY3NpMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmMzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaTIuYwpAQCAtMCwwICsxLDEzNDMgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIgLSBDU0kgUEhZIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgImlzcy5oIgorI2luY2x1ZGUgImlzc19yZWdzLmgiCisjaW5jbHVkZSAiaXNzX2NzaTIuaCIKKworLyoKKyAqIGNzaTJfaWZfZW5hYmxlIC0gRW5hYmxlIENTSTIgUmVjZWl2ZXIgaW50ZXJmYWNlLgorICogQGVuYWJsZTogZW5hYmxlIGZsYWcKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNzaTJfaWZfZW5hYmxlKHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIsIHU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfY3RybF9jZmcgKmN1cnJjdHJsID0gJmNzaTItPmN0cmw7CisKKwlpc3NfcmVnX3VwZGF0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUUkwsIENTSTJfQ1RSTF9JRl9FTiwKKwkJICAgICAgIGVuYWJsZSA/IENTSTJfQ1RSTF9JRl9FTiA6IDApOworCisJY3VycmN0cmwtPmlmX2VuYWJsZSA9IGVuYWJsZTsKK30KKworLyoKKyAqIGNzaTJfcmVjdl9jb25maWcgLSBDU0kyIHJlY2VpdmVyIG1vZHVsZSBjb25maWd1cmF0aW9uLgorICogQGN1cnJjdHJsOiBpc3NfY3NpMl9jdHJsX2NmZyBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNzaTJfcmVjdl9jb25maWcoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiwKKwkJCSAgICAgc3RydWN0IGlzc19jc2kyX2N0cmxfY2ZnICpjdXJyY3RybCkKK3sKKwl1MzIgcmVnID0gMDsKKworCWlmIChjdXJyY3RybC0+ZnJhbWVfbW9kZSkKKwkJcmVnIHw9IENTSTJfQ1RSTF9GUkFNRTsKKwllbHNlCisJCXJlZyAmPSB+Q1NJMl9DVFJMX0ZSQU1FOworCisJaWYgKGN1cnJjdHJsLT52cF9jbGtfZW5hYmxlKQorCQlyZWcgfD0gQ1NJMl9DVFJMX1ZQX0NMS19FTjsKKwllbHNlCisJCXJlZyAmPSB+Q1NJMl9DVFJMX1ZQX0NMS19FTjsKKworCWlmIChjdXJyY3RybC0+dnBfb25seV9lbmFibGUpCisJCXJlZyB8PSBDU0kyX0NUUkxfVlBfT05MWV9FTjsKKwllbHNlCisJCXJlZyAmPSB+Q1NJMl9DVFJMX1ZQX09OTFlfRU47CisKKwlyZWcgJj0gfkNTSTJfQ1RSTF9WUF9PVVRfQ1RSTF9NQVNLOworCXJlZyB8PSBjdXJyY3RybC0+dnBfb3V0X2N0cmwgPDwgQ1NJMl9DVFJMX1ZQX09VVF9DVFJMX1NISUZUOworCisJaWYgKGN1cnJjdHJsLT5lY2NfZW5hYmxlKQorCQlyZWcgfD0gQ1NJMl9DVFJMX0VDQ19FTjsKKwllbHNlCisJCXJlZyAmPSB+Q1NJMl9DVFJMX0VDQ19FTjsKKworCS8qCisJICogU2V0IE1GbGFnIGFzc2VydGlvbiBib3VuZGFyaWVzIHRvOgorCSAqIExvdzogNC84IG9mIEZJRk8gc2l6ZQorCSAqIEhpZ2g6IDYvOCBvZiBGSUZPIHNpemUKKwkgKi8KKwlyZWcgJj0gfihDU0kyX0NUUkxfTUZMQUdfTEVWSF9NQVNLIHwgQ1NJMl9DVFJMX01GTEFHX0xFVkxfTUFTSyk7CisJcmVnIHw9ICgyIDw8IENTSTJfQ1RSTF9NRkxBR19MRVZIX1NISUZUKSB8CisJICAgICAgICg0IDw8IENTSTJfQ1RSTF9NRkxBR19MRVZMX1NISUZUKTsKKworCS8qIEdlbmVyYXRpb24gb2YgMTZ4NjQtYml0IGJ1cnN0cyAoUmVjb21tZW5kZWQpICovCisJcmVnIHw9IENTSTJfQ1RSTF9CVVJTVF9TSVpFX0VYUEFORDsKKworCS8qIERvIE5vbi1Qb3N0ZWQgd3JpdGVzIChSZWNvbW1lbmRlZCkgKi8KKwlyZWcgfD0gQ1NJMl9DVFJMX05PTl9QT1NURURfV1JJVEU7CisKKwkvKgorCSAqIEVuZm9yY2UgTGl0dGxlIGVuZGlhbiBmb3IgYWxsIGZvcm1hdHMsIGluY2x1ZGluZzoKKwkgKiBZVVY0OjI6MiA4LWJpdCBhbmQgWVVWNDoyOjAgTGVnYWN5CisJICovCisJcmVnIHw9IENTSTJfQ1RSTF9FTkRJQU5ORVNTOworCisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUUkwsIHJlZyk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3NpMl9pbnB1dF9mbXRzW10gPSB7CisJVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTAsCisJVjRMMl9NQlVTX0ZNVF9TR1JCRzEwX0RQQ004XzFYOCwKKwlWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMCwKKwlWNEwyX01CVVNfRk1UX1NSR0dCMTBfRFBDTThfMVg4LAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF9EUENNOF8xWDgsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTAsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzEwX0RQQ004XzFYOCwKKwlWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzhfMVg4LAorCVY0TDJfTUJVU19GTVRfU0dSQkc4XzFYOCwKKwlWNEwyX01CVVNfRk1UX1NSR0dCOF8xWDgsCisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LAorCVY0TDJfTUJVU19GTVRfWVVZVjhfMVgxNiwKK307CisKKy8qIFRvIHNldCB0aGUgZm9ybWF0IG9uIHRoZSBDU0kyIHJlcXVpcmVzIGEgbWFwcGluZyBmdW5jdGlvbiB0aGF0IHRha2VzCisgKiB0aGUgZm9sbG93aW5nIGlucHV0czoKKyAqIC0gMyBkaWZmZXJlbnQgZm9ybWF0cyAoYXQgdGhpcyB0aW1lKQorICogLSAyIGRlc3RpbmF0aW9ucyAobWVtLCB2cCttZW0pICh2cCBvbmx5IGhhbmRsZWQgc2VwYXJhdGVseSkKKyAqIC0gMiBkZWNvbXByZXNzaW9uIG9wdGlvbnMgKG9uLCBvZmYpCisgKiBPdXRwdXQgc2hvdWxkIGJlIENTSTIgZnJhbWUgZm9ybWF0IGNvZGUKKyAqIEFycmF5IGluZGljZXMgYXMgZm9sbG93czogW2Zvcm1hdF1bZGVzdF1bZGVjb21wcl0KKyAqIE5vdCBhbGwgY29tYmluYXRpb25zIGFyZSB2YWxpZC4gMCBtZWFucyBpbnZhbGlkLgorICovCitzdGF0aWMgY29uc3QgdTE2IF9fY3NpMl9mbXRfbWFwW11bMl1bMl0gPSB7CisJLyogUkFXMTAgZm9ybWF0cyAqLworCXsKKwkJLyogT3V0cHV0IHRvIG1lbW9yeSAqLworCQl7CisJCQkvKiBObyBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCUNTSTJfUElYX0ZNVF9SQVcxMF9FWFAxNiwKKwkJCS8qIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJMCwKKwkJfSwKKwkJLyogT3V0cHV0IHRvIGJvdGggKi8KKwkJeworCQkJLyogTm8gRFBDTSBkZWNvbXByZXNzaW9uICovCisJCQlDU0kyX1BJWF9GTVRfUkFXMTBfRVhQMTZfVlAsCisJCQkvKiBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCTAsCisJCX0sCisJfSwKKwkvKiBSQVcxMCBEUENNOCBmb3JtYXRzICovCisJeworCQkvKiBPdXRwdXQgdG8gbWVtb3J5ICovCisJCXsKKwkJCS8qIE5vIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJQ1NJMl9VU0VSREVGXzhCSVRfREFUQTEsCisJCQkvKiBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCUNTSTJfVVNFUkRFRl84QklUX0RBVEExX0RQQ00xMCwKKwkJfSwKKwkJLyogT3V0cHV0IHRvIGJvdGggKi8KKwkJeworCQkJLyogTm8gRFBDTSBkZWNvbXByZXNzaW9uICovCisJCQlDU0kyX1BJWF9GTVRfUkFXOF9WUCwKKwkJCS8qIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJQ1NJMl9VU0VSREVGXzhCSVRfREFUQTFfRFBDTTEwX1ZQLAorCQl9LAorCX0sCisJLyogUkFXOCBmb3JtYXRzICovCisJeworCQkvKiBPdXRwdXQgdG8gbWVtb3J5ICovCisJCXsKKwkJCS8qIE5vIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJQ1NJMl9QSVhfRk1UX1JBVzgsCisJCQkvKiBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCTAsCisJCX0sCisJCS8qIE91dHB1dCB0byBib3RoICovCisJCXsKKwkJCS8qIE5vIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJQ1NJMl9QSVhfRk1UX1JBVzhfVlAsCisJCQkvKiBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCTAsCisJCX0sCisJfSwKKwkvKiBZVVY0MjIgZm9ybWF0cyAqLworCXsKKwkJLyogT3V0cHV0IHRvIG1lbW9yeSAqLworCQl7CisJCQkvKiBObyBEUENNIGRlY29tcHJlc3Npb24gKi8KKwkJCUNTSTJfUElYX0ZNVF9ZVVY0MjJfOEJJVCwKKwkJCS8qIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJMCwKKwkJfSwKKwkJLyogT3V0cHV0IHRvIGJvdGggKi8KKwkJeworCQkJLyogTm8gRFBDTSBkZWNvbXByZXNzaW9uICovCisJCQlDU0kyX1BJWF9GTVRfWVVWNDIyXzhCSVRfVlAxNiwKKwkJCS8qIERQQ00gZGVjb21wcmVzc2lvbiAqLworCQkJMCwKKwkJfSwKKwl9LAorfTsKKworLyoKKyAqIGNzaTJfY3R4X21hcF9mb3JtYXQgLSBNYXAgQ1NJMiBzaW5rIG1lZGlhIGJ1cyBmb3JtYXQgdG8gQ1NJMiBmb3JtYXQgSUQKKyAqIEBjc2kyOiBJU1MgQ1NJMiBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIENTSTIgcGh5c2ljYWwgZm9ybWF0IGlkCisgKi8KK3N0YXRpYyB1MTYgY3NpMl9jdHhfbWFwX2Zvcm1hdChzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyKQoreworCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCA9ICZjc2kyLT5mb3JtYXRzW0NTSTJfUEFEX1NJTktdOworCWludCBmbXRpZHgsIGRlc3RpZHg7CisKKwlzd2l0Y2ggKGZtdC0+Y29kZSkgeworCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA6CisJY2FzZSBWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMDoKKwljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwOgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTA6CisJCWZtdGlkeCA9IDA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwX0RQQ004XzFYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfU1JHR0IxMF9EUENNOF8xWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfRFBDTThfMVg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR0JSRzEwX0RQQ004XzFYODoKKwkJZm10aWR4ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1NHQlJHOF8xWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1NSR0dCOF8xWDg6CisJCWZtdGlkeCA9IDI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xWDE2OgorCQlmbXRpZHggPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsIEtFUk5fRVJSICJDU0kyOiBwaXhlbCBmb3JtYXQgJTA4eCB1bnN1cHBvcnRlZCFcbiIsCisJCSAgICAgZm10LT5jb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoY3NpMi0+b3V0cHV0ICYgQ1NJMl9PVVRQVVRfSVBJUEVJRikgJiYKKwkgICAgIShjc2kyLT5vdXRwdXQgJiBDU0kyX09VVFBVVF9NRU1PUlkpKSB7CisJCS8qIE5laXRoZXIgb3V0cHV0IGVuYWJsZWQgaXMgYSB2YWxpZCBjb21iaW5hdGlvbiAqLworCQlyZXR1cm4gQ1NJMl9QSVhfRk1UX09USEVSUzsKKwl9CisKKwkvKiBJZiB3ZSBuZWVkIHRvIHNraXAgZnJhbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBkaXNhYmxlIHRoZQorCSAqIHZpZGVvIHBvcnQgdG8gYXZvaWQgc2VuZGluZyB0aGUgc2tpcHBlZCBmcmFtZXMgdG8gdGhlIElQSVBFSUYuCisJICovCisJZGVzdGlkeCA9IGNzaTItPmZyYW1lX3NraXAgPyAwIDogISEoY3NpMi0+b3V0cHV0ICYgQ1NJMl9PVVRQVVRfSVBJUEVJRik7CisKKwlyZXR1cm4gX19jc2kyX2ZtdF9tYXBbZm10aWR4XVtkZXN0aWR4XVtjc2kyLT5kcGNtX2RlY29tcHJlc3NdOworfQorCisvKgorICogY3NpMl9zZXRfb3V0YWRkciAtIFNldCBtZW1vcnkgYWRkcmVzcyB0byBzYXZlIG91dHB1dCBpbWFnZQorICogQGNzaTI6IFBvaW50ZXIgdG8gSVNTIENTSTJhIGRldmljZS4KKyAqIEBhZGRyOiAzMi1iaXQgbWVtb3J5IGFkZHJlc3MgYWxpZ25lZCBvbiAzMiBieXRlIGJvdW5kYXJ5LgorICoKKyAqIFNldHMgdGhlIG1lbW9yeSBhZGRyZXNzIHdoZXJlIHRoZSBvdXRwdXQgd2lsbCBiZSBzYXZlZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgLUVJTlZBTCBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gdGhlIDMyIGJ5dGUKKyAqIGJvdW5kYXJ5LgorICovCitzdGF0aWMgdm9pZCBjc2kyX3NldF9vdXRhZGRyKHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIsIHUzMiBhZGRyKQoreworCXN0cnVjdCBpc3NfY3NpMl9jdHhfY2ZnICpjdHggPSAmY3NpMi0+Y29udGV4dHNbMF07CisKKwljdHgtPnBpbmdfYWRkciA9IGFkZHI7CisJY3R4LT5wb25nX2FkZHIgPSBhZGRyOworCWlzc19yZWdfd3JpdGUoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9DVFhfUElOR19BRERSKGN0eC0+Y3R4bnVtKSwKKwkJICAgICAgY3R4LT5waW5nX2FkZHIpOworCWlzc19yZWdfd3JpdGUoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9DVFhfUE9OR19BRERSKGN0eC0+Y3R4bnVtKSwKKwkJICAgICAgY3R4LT5wb25nX2FkZHIpOworfQorCisvKgorICogaXNfdXNyX2RlZl9tYXBwaW5nIC0gQ2hlY2tzIHdoZXRoZXIgVVNFUl9ERUZfTUFQUElORyBzaG91bGQKKyAqCQkJYmUgZW5hYmxlZCBieSBDU0kyLgorICogQGZvcm1hdF9pZDogbWFwcGVkIGZvcm1hdCBpZAorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfdXNyX2RlZl9tYXBwaW5nKHUzMiBmb3JtYXRfaWQpCit7CisJcmV0dXJuIChmb3JtYXRfaWQgJiAweGYwKSA9PSAweDQwID8gMSA6IDA7Cit9CisKKy8qCisgKiBjc2kyX2N0eF9lbmFibGUgLSBFbmFibGUgc3BlY2lmaWVkIENTSTIgY29udGV4dAorICogQGN0eG51bTogQ29udGV4dCBudW1iZXIsIHZhbGlkIGJldHdlZW4gMCBhbmQgNyB2YWx1ZXMuCisgKiBAZW5hYmxlOiBlbmFibGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNzaTJfY3R4X2VuYWJsZShzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLCB1OCBjdHhudW0sIHU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfY3R4X2NmZyAqY3R4ID0gJmNzaTItPmNvbnRleHRzW2N0eG51bV07CisJdTMyIHJlZzsKKworCXJlZyA9IGlzc19yZWdfcmVhZChjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUWF9DVFJMMShjdHhudW0pKTsKKworCWlmIChlbmFibGUpIHsKKwkJdW5zaWduZWQgaW50IHNraXAgPSAwOworCisJCWlmIChjc2kyLT5mcmFtZV9za2lwKQorCQkJc2tpcCA9IGNzaTItPmZyYW1lX3NraXA7CisJCWVsc2UgaWYgKGNzaTItPm91dHB1dCAmIENTSTJfT1VUUFVUX01FTU9SWSkKKwkJCXNraXAgPSAxOworCisJCXJlZyAmPSB+Q1NJMl9DVFhfQ1RSTDFfQ09VTlRfTUFTSzsKKwkJcmVnIHw9IENTSTJfQ1RYX0NUUkwxX0NPVU5UX1VOTE9DSworCQkgICAgfCAgKHNraXAgPDwgQ1NJMl9DVFhfQ1RSTDFfQ09VTlRfU0hJRlQpCisJCSAgICB8ICBDU0kyX0NUWF9DVFJMMV9DVFhfRU47CisJfSBlbHNlIHsKKwkJcmVnICY9IH5DU0kyX0NUWF9DVFJMMV9DVFhfRU47CisJfQorCisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUWF9DVFJMMShjdHhudW0pLCByZWcpOworCWN0eC0+ZW5hYmxlZCA9IGVuYWJsZTsKK30KKworLyoKKyAqIGNzaTJfY3R4X2NvbmZpZyAtIENTSTIgY29udGV4dCBjb25maWd1cmF0aW9uLgorICogQGN0eDogY29udGV4dCBjb25maWd1cmF0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBjc2kyX2N0eF9jb25maWcoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiwKKwkJCSAgICBzdHJ1Y3QgaXNzX2NzaTJfY3R4X2NmZyAqY3R4KQoreworCXUzMiByZWc7CisKKwkvKiBTZXQgdXAgQ1NJMl9DVHhfQ1RSTDEgKi8KKwlpZiAoY3R4LT5lb2ZfZW5hYmxlZCkKKwkJcmVnID0gQ1NJMl9DVFhfQ1RSTDFfRU9GX0VOOworCisJaWYgKGN0eC0+ZW9sX2VuYWJsZWQpCisJCXJlZyB8PSBDU0kyX0NUWF9DVFJMMV9FT0xfRU47CisKKwlpZiAoY3R4LT5jaGVja3N1bV9lbmFibGVkKQorCQlyZWcgfD0gQ1NJMl9DVFhfQ1RSTDFfQ1NfRU47CisKKwlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ1RYX0NUUkwxKGN0eC0+Y3R4bnVtKSwgcmVnKTsKKworCS8qIFNldCB1cCBDU0kyX0NUeF9DVFJMMiAqLworCXJlZyA9IGN0eC0+dmlydHVhbF9pZCA8PCBDU0kyX0NUWF9DVFJMMl9WSVJUVUFMX0lEX1NISUZUOworCXJlZyB8PSBjdHgtPmZvcm1hdF9pZCA8PCBDU0kyX0NUWF9DVFJMMl9GT1JNQVRfU0hJRlQ7CisKKwlpZiAoY3R4LT5kcGNtX2RlY29tcHJlc3MgJiYgY3R4LT5kcGNtX3ByZWRpY3RvcikKKwkJcmVnIHw9IENTSTJfQ1RYX0NUUkwyX0RQQ01fUFJFRDsKKworCWlmIChpc191c3JfZGVmX21hcHBpbmcoY3R4LT5mb3JtYXRfaWQpKQorCQlyZWcgfD0gMiA8PCBDU0kyX0NUWF9DVFJMMl9VU0VSX0RFRl9NQVBfU0hJRlQ7CisKKwlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ1RYX0NUUkwyKGN0eC0+Y3R4bnVtKSwgcmVnKTsKKworCS8qIFNldCB1cCBDU0kyX0NUeF9DVFJMMyAqLworCWlzc19yZWdfd3JpdGUoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9DVFhfQ1RSTDMoY3R4LT5jdHhudW0pLAorCQkgICAgICBjdHgtPmFscGhhIDw8IENTSTJfQ1RYX0NUUkwzX0FMUEhBX1NISUZUKTsKKworCS8qIFNldCB1cCBDU0kyX0NUeF9EQVRfT0ZTVCAqLworCWlzc19yZWdfdXBkYXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ1RYX0RBVF9PRlNUKGN0eC0+Y3R4bnVtKSwKKwkJICAgICAgIENTSTJfQ1RYX0RBVF9PRlNUX01BU0ssIGN0eC0+ZGF0YV9vZmZzZXQpOworCisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUWF9QSU5HX0FERFIoY3R4LT5jdHhudW0pLAorCQkgICAgICBjdHgtPnBpbmdfYWRkcik7CisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUWF9QT05HX0FERFIoY3R4LT5jdHhudW0pLAorCQkgICAgICBjdHgtPnBvbmdfYWRkcik7Cit9CisKKy8qCisgKiBjc2kyX3RpbWluZ19jb25maWcgLSBDU0kyIHRpbWluZyBjb25maWd1cmF0aW9uLgorICogQHRpbWluZzogY3NpMl90aW1pbmdfY2ZnIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBjc2kyX3RpbWluZ19jb25maWcoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiwKKwkJCSAgICAgICBzdHJ1Y3QgaXNzX2NzaTJfdGltaW5nX2NmZyAqdGltaW5nKQoreworCXUzMiByZWc7CisKKwlyZWcgPSBpc3NfcmVnX3JlYWQoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9USU1JTkcpOworCisJaWYgKHRpbWluZy0+Zm9yY2VfcnhfbW9kZSkKKwkJcmVnIHw9IENTSTJfVElNSU5HX0ZPUkNFX1JYX01PREVfSU8xOworCWVsc2UKKwkJcmVnICY9IH5DU0kyX1RJTUlOR19GT1JDRV9SWF9NT0RFX0lPMTsKKworCWlmICh0aW1pbmctPnN0b3Bfc3RhdGVfMTZ4KQorCQlyZWcgfD0gQ1NJMl9USU1JTkdfU1RPUF9TVEFURV9YMTZfSU8xOworCWVsc2UKKwkJcmVnICY9IH5DU0kyX1RJTUlOR19TVE9QX1NUQVRFX1gxNl9JTzE7CisKKwlpZiAodGltaW5nLT5zdG9wX3N0YXRlXzR4KQorCQlyZWcgfD0gQ1NJMl9USU1JTkdfU1RPUF9TVEFURV9YNF9JTzE7CisJZWxzZQorCQlyZWcgJj0gfkNTSTJfVElNSU5HX1NUT1BfU1RBVEVfWDRfSU8xOworCisJcmVnICY9IH5DU0kyX1RJTUlOR19TVE9QX1NUQVRFX0NPVU5URVJfSU8xX01BU0s7CisJcmVnIHw9IHRpbWluZy0+c3RvcF9zdGF0ZV9jb3VudGVyIDw8CisJICAgICAgIENTSTJfVElNSU5HX1NUT1BfU1RBVEVfQ09VTlRFUl9JTzFfU0hJRlQ7CisKKwlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfVElNSU5HLCByZWcpOworfQorCisvKgorICogY3NpMl9pcnFfY3R4X3NldCAtIEVuYWJsZXMgQ1NJMiBDb250ZXh0IElSUXMuCisgKiBAZW5hYmxlOiBFbmFibGUvZGlzYWJsZSBDU0kyIENvbnRleHQgaW50ZXJydXB0cworICovCitzdGF0aWMgdm9pZCBjc2kyX2lycV9jdHhfc2V0KHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIsIGludCBlbmFibGUpCit7CisJdTMyIHJlZyA9IENTSTJfQ1RYX0lSUV9GRTsKKwlpbnQgaTsKKworCWlmIChjc2kyLT51c2VfZnNfaXJxKQorCQlyZWcgfD0gQ1NJMl9DVFhfSVJRX0ZTOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ1RYX0lSUVNUQVRVUyhpKSwKKwkJCSAgICAgIHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlpc3NfcmVnX3NldChjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLAorCQkJCSAgICBDU0kyX0NUWF9JUlFFTkFCTEUoaSksIHJlZyk7CisJCWVsc2UKKwkJCWlzc19yZWdfY2xyKGNzaTItPmlzcywgY3NpMi0+cmVnczEsCisJCQkJICAgIENTSTJfQ1RYX0lSUUVOQUJMRShpKSwgcmVnKTsKKwl9Cit9CisKKy8qCisgKiBjc2kyX2lycV9jb21wbGV4aW8xX3NldCAtIEVuYWJsZXMgQ1NJMiBDb21wbGV4SU8gSVJRcy4KKyAqIEBlbmFibGU6IEVuYWJsZS9kaXNhYmxlIENTSTIgQ29tcGxleElPICMxIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgY3NpMl9pcnFfY29tcGxleGlvMV9zZXQoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiwgaW50IGVuYWJsZSkKK3sKKwl1MzIgcmVnOworCXJlZyA9IENTSTJfQ09NUExFWElPX0lSUV9TVEFURUFMTFVMUE1FWElUIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFQUxMVUxQTUVOVEVSIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTUgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSQ09OVFJPTDUgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDNSB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RTWU5DSFM1IHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVEhTNSB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9TVEFURVVMUE00IHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkNPTlRST0w0IHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkVTQzQgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09UU1lOQ0hTNCB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RIUzQgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfU1RBVEVVTFBNMyB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJDT05UUk9MMyB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJFU0MzIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVFNZTkNIUzMgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09USFMzIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTIgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSQ09OVFJPTDIgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDMiB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RTWU5DSFMyIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVEhTMiB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9TVEFURVVMUE0xIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkNPTlRST0wxIHwKKwkJQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkVTQzEgfAorCQlDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09UU1lOQ0hTMSB8CisJCUNTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RIUzE7CisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NPTVBMRVhJT19JUlFTVEFUVVMsIHJlZyk7CisJaWYgKGVuYWJsZSkKKwkJaXNzX3JlZ19zZXQoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9DT01QTEVYSU9fSVJRRU5BQkxFLAorCQkJICAgIHJlZyk7CisJZWxzZQorCQlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ09NUExFWElPX0lSUUVOQUJMRSwKKwkJCSAgICAgIDApOworfQorCisvKgorICogY3NpMl9pcnFfc3RhdHVzX3NldCAtIEVuYWJsZXMgQ1NJMiBTdGF0dXMgSVJRcy4KKyAqIEBlbmFibGU6IEVuYWJsZS9kaXNhYmxlIENTSTIgU3RhdHVzIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgY3NpMl9pcnFfc3RhdHVzX3NldChzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLCBpbnQgZW5hYmxlKQoreworCXUzMiByZWc7CisJcmVnID0gQ1NJMl9JUlFfT0NQX0VSUiB8CisJCUNTSTJfSVJRX1NIT1JUX1BBQ0tFVCB8CisJCUNTSTJfSVJRX0VDQ19DT1JSRUNUSU9OIHwKKwkJQ1NJMl9JUlFfRUNDX05PX0NPUlJFQ1RJT04gfAorCQlDU0kyX0lSUV9DT01QTEVYSU9fRVJSIHwKKwkJQ1NJMl9JUlFfRklGT19PVkYgfAorCQlDU0kyX0lSUV9DT05URVhUMDsKKwlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfSVJRU1RBVFVTLCByZWcpOworCWlmIChlbmFibGUpCisJCWlzc19yZWdfc2V0KGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfSVJRRU5BQkxFLCByZWcpOworCWVsc2UKKwkJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0lSUUVOQUJMRSwgMCk7Cit9CisKKy8qCisgKiBvbWFwNGlzc19jc2kyX3Jlc2V0IC0gUmVzZXRzIHRoZSBDU0kyIG1vZHVsZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBwaHkgbG9jayBoZWxkLgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAtRUJVU1kgaWYgcG93ZXIgY29tbWFuZCBkaWRuJ3QgcmVzcG9uZC4KKyAqLworaW50IG9tYXA0aXNzX2NzaTJfcmVzZXQoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMikKK3sKKwl1OCBzb2Z0X3Jlc2V0X3JldHJpZXMgPSAwOworCXUzMiByZWc7CisJaW50IGk7CisKKwlpZiAoIWNzaTItPmF2YWlsYWJsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3NpMi0+cGh5LT5waHlfaW5fdXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJaXNzX3JlZ19zZXQoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9TWVNDT05GSUcsCisJCSAgICBDU0kyX1NZU0NPTkZJR19TT0ZUX1JFU0VUKTsKKworCWRvIHsKKwkJcmVnID0gaXNzX3JlZ19yZWFkKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfU1lTU1RBVFVTKQorCQkgICAgJiBDU0kyX1NZU1NUQVRVU19SRVNFVF9ET05FOworCQlpZiAocmVnID09IENTSTJfU1lTU1RBVFVTX1JFU0VUX0RPTkUpCisJCQlicmVhazsKKwkJc29mdF9yZXNldF9yZXRyaWVzKys7CisJCWlmIChzb2Z0X3Jlc2V0X3JldHJpZXMgPCA1KQorCQkJdXNsZWVwX3JhbmdlKDEwMCwgMTAwKTsKKwl9IHdoaWxlIChzb2Z0X3Jlc2V0X3JldHJpZXMgPCA1KTsKKworCWlmIChzb2Z0X3Jlc2V0X3JldHJpZXMgPT0gNSkgeworCQlkZXZfZXJyKGNzaTItPmlzcy0+ZGV2LAorCQkJIkNTSTI6IFNvZnQgcmVzZXQgdHJ5IGNvdW50IGV4Y2VlZGVkIVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaXNzX3JlZ19zZXQoY3NpMi0+aXNzLCBjc2kyLT5yZWdzMSwgQ1NJMl9DT01QTEVYSU9fQ0ZHLAorCQkgICAgQ1NJMl9DT01QTEVYSU9fQ0ZHX1JFU0VUX0NUUkwpOworCisJaSA9IDEwMDsKKwlkbyB7CisJCXJlZyA9IGlzc19yZWdfcmVhZChjc2kyLT5pc3MsIGNzaTItPnBoeS0+cGh5X3JlZ3MsIFJFR0lTVEVSMSkKKwkJICAgICYgUkVHSVNURVIxX1JFU0VUX0RPTkVfQ1RSTENMSzsKKwkJaWYgKHJlZyA9PSBSRUdJU1RFUjFfUkVTRVRfRE9ORV9DVFJMQ0xLKQorCQkJYnJlYWs7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDEwMCk7CisJfSB3aGlsZSAoLS1pID4gMCk7CisKKwlpZiAoaSA9PSAwKSB7CisJCWRldl9lcnIoY3NpMi0+aXNzLT5kZXYsCisJCQkiQ1NJMjogUmVzZXQgZm9yIENTSTJfOTZNX0ZDTEsgZG9tYWluIEZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlzc19yZWdfdXBkYXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfU1lTQ09ORklHLAorCQkgICAgICAgQ1NJMl9TWVNDT05GSUdfTVNUQU5EQllfTU9ERV9NQVNLIHwKKwkJICAgICAgIENTSTJfU1lTQ09ORklHX0FVVE9fSURMRSwKKwkJICAgICAgIENTSTJfU1lTQ09ORklHX01TVEFOREJZX01PREVfTk8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3NpMl9jb25maWd1cmUoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMikKK3sKKwljb25zdCBzdHJ1Y3QgaXNzX3Y0bDJfc3ViZGV2c19ncm91cCAqcGRhdGE7CisJc3RydWN0IGlzc19jc2kyX3RpbWluZ19jZmcgKnRpbWluZyA9ICZjc2kyLT50aW1pbmdbMF07CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3I7CisJc3RydWN0IG1lZGlhX3BhZCAqcGFkOworCisJLyoKKwkgKiBDU0kyIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoaWxlIHRoZSBjb250ZXh0IGhhcworCSAqIGJlZW4gZW5hYmxlZCBvciB0aGUgaW50ZXJmYWNlIGhhcyBiZWVuIGVuYWJsZWQgYXJlIG5vdAorCSAqIHVwZGF0ZWQgZHluYW1pY2FsbHkgY3VycmVudGx5LiBTbyB3ZSBkbyBub3QgYWxsb3cgdG8KKwkgKiByZWNvbmZpZ3VyZSBpZiBlaXRoZXIgaGFzIGJlZW4gZW5hYmxlZAorCSAqLworCWlmIChjc2kyLT5jb250ZXh0c1swXS5lbmFibGVkIHx8IGNzaTItPmN0cmwuaWZfZW5hYmxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGFkID0gbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQoJmNzaTItPnBhZHNbQ1NJMl9QQURfU0lOS10pOworCXNlbnNvciA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihwYWQtPmVudGl0eSk7CisJcGRhdGEgPSBzZW5zb3ItPmhvc3RfcHJpdjsKKworCWNzaTItPmZyYW1lX3NraXAgPSAwOworCXY0bDJfc3ViZGV2X2NhbGwoc2Vuc29yLCBzZW5zb3IsIGdfc2tpcF9mcmFtZXMsICZjc2kyLT5mcmFtZV9za2lwKTsKKworCWNzaTItPmN0cmwudnBfb3V0X2N0cmwgPSBwZGF0YS0+YnVzLmNzaTIudnBjbGtfZGl2OworCWNzaTItPmN0cmwuZnJhbWVfbW9kZSA9IElTU19DU0kyX0ZSQU1FX0lNTUVESUFURTsKKwljc2kyLT5jdHJsLmVjY19lbmFibGUgPSBwZGF0YS0+YnVzLmNzaTIuY3JjOworCisJdGltaW5nLT5mb3JjZV9yeF9tb2RlID0gMTsKKwl0aW1pbmctPnN0b3Bfc3RhdGVfMTZ4ID0gMTsKKwl0aW1pbmctPnN0b3Bfc3RhdGVfNHggPSAxOworCXRpbWluZy0+c3RvcF9zdGF0ZV9jb3VudGVyID0gMHgxZmY7CisKKwkvKgorCSAqIFRoZSBDU0kyIHJlY2VpdmVyIGNhbid0IGRvIGFueSBmb3JtYXQgY29udmVyc2lvbiBleGNlcHQgRFBDTQorCSAqIGRlY29tcHJlc3Npb24sIHNvIGV2ZXJ5IHNldF9mb3JtYXQgY2FsbCBjb25maWd1cmVzIGJvdGggcGFkcworCSAqIGFuZCBlbmFibGVzIERQQ00gZGVjb21wcmVzc2lvbiBhcyBhIHNwZWNpYWwgY2FzZToKKwkgKi8KKwlpZiAoY3NpMi0+Zm9ybWF0c1tDU0kyX1BBRF9TSU5LXS5jb2RlICE9CisJICAgIGNzaTItPmZvcm1hdHNbQ1NJMl9QQURfU09VUkNFXS5jb2RlKQorCQljc2kyLT5kcGNtX2RlY29tcHJlc3MgPSB0cnVlOworCWVsc2UKKwkJY3NpMi0+ZHBjbV9kZWNvbXByZXNzID0gZmFsc2U7CisKKwljc2kyLT5jb250ZXh0c1swXS5mb3JtYXRfaWQgPSBjc2kyX2N0eF9tYXBfZm9ybWF0KGNzaTIpOworCisJaWYgKGNzaTItPnZpZGVvX291dC5icGxfcGFkZGluZyA9PSAwKQorCQljc2kyLT5jb250ZXh0c1swXS5kYXRhX29mZnNldCA9IDA7CisJZWxzZQorCQljc2kyLT5jb250ZXh0c1swXS5kYXRhX29mZnNldCA9IGNzaTItPnZpZGVvX291dC5icGxfdmFsdWU7CisKKwkvKgorCSAqIEVuYWJsZSBlbmQgb2YgZnJhbWUgYW5kIGVuZCBvZiBsaW5lIHNpZ25hbHMgZ2VuZXJhdGlvbiBmb3IKKwkgKiBjb250ZXh0IDAuIFRoZXNlIHNpZ25hbHMgYXJlIGdlbmVyYXRlZCBmcm9tIENTSTIgcmVjZWl2ZXIgdG8KKwkgKiBxdWFsaWZ5IHRoZSBsYXN0IHBpeGVsIG9mIGEgZnJhbWUgYW5kIHRoZSBsYXN0IHBpeGVsIG9mIGEgbGluZS4KKwkgKiBXaXRob3V0IGVuYWJsaW5nIHRoZSBzaWduYWxzIENTSTIgcmVjZWl2ZXIgd3JpdGVzIGRhdGEgdG8gbWVtb3J5CisJICogYmV5b25kIGJ1ZmZlciBzaXplIGFuZC9vciBkYXRhIGxpbmUgb2Zmc2V0IGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4KKwkgKi8KKwljc2kyLT5jb250ZXh0c1swXS5lb2ZfZW5hYmxlZCA9IDE7CisJY3NpMi0+Y29udGV4dHNbMF0uZW9sX2VuYWJsZWQgPSAxOworCisJY3NpMl9pcnFfY29tcGxleGlvMV9zZXQoY3NpMiwgMSk7CisJY3NpMl9pcnFfY3R4X3NldChjc2kyLCAxKTsKKwljc2kyX2lycV9zdGF0dXNfc2V0KGNzaTIsIDEpOworCisJLyogU2V0IGNvbmZpZ3VyYXRpb24gKHRpbWluZ3MsIGZvcm1hdCBhbmQgbGlua3MpICovCisJY3NpMl90aW1pbmdfY29uZmlnKGNzaTIsIHRpbWluZyk7CisJY3NpMl9yZWN2X2NvbmZpZyhjc2kyLCAmY3NpMi0+Y3RybCk7CisJY3NpMl9jdHhfY29uZmlnKGNzaTIsICZjc2kyLT5jb250ZXh0c1swXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNzaTJfcHJpbnRfc3RhdHVzIC0gUHJpbnRzIENTSTIgZGVidWcgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIHJlZ3MsIG5hbWUpXAorCWRldl9kYmcoaXNzLT5kZXYsICIjIyNDU0kyICIgI25hbWUgIj0weCUwOHhcbiIsIFwKKwkJaXNzX3JlZ19yZWFkKGlzcywgcmVncywgQ1NJMl8jI25hbWUpKQorCitzdGF0aWMgdm9pZCBjc2kyX3ByaW50X3N0YXR1cyhzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSBjc2kyLT5pc3M7CisKKwlpZiAoIWNzaTItPmF2YWlsYWJsZSkKKwkJcmV0dXJuOworCisJZGV2X2RiZyhpc3MtPmRldiwgIi0tLS0tLS0tLS0tLS1DU0kyIFJlZ2lzdGVyIGR1bXAtLS0tLS0tLS0tLS0tXG4iKTsKKworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgU1lTQ09ORklHKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIFNZU1NUQVRVUyk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBJUlFFTkFCTEUpOworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgSVJRU1RBVFVTKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIENUUkwpOworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgREJHX0gpOworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgQ09NUExFWElPX0NGRyk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBDT01QTEVYSU9fSVJRU1RBVFVTKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIFNIT1JUX1BBQ0tFVCk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBDT01QTEVYSU9fSVJRRU5BQkxFKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIERCR19QKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIFRJTUlORyk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBDVFhfQ1RSTDEoMCkpOworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgQ1RYX0NUUkwyKDApKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIENUWF9EQVRfT0ZTVCgwKSk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBDVFhfUElOR19BRERSKDApKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIENUWF9QT05HX0FERFIoMCkpOworCUNTSTJfUFJJTlRfUkVHSVNURVIoaXNzLCBjc2kyLT5yZWdzMSwgQ1RYX0lSUUVOQUJMRSgwKSk7CisJQ1NJMl9QUklOVF9SRUdJU1RFUihpc3MsIGNzaTItPnJlZ3MxLCBDVFhfSVJRU1RBVFVTKDApKTsKKwlDU0kyX1BSSU5UX1JFR0lTVEVSKGlzcywgY3NpMi0+cmVnczEsIENUWF9DVFJMMygwKSk7CisKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW50ZXJydXB0IGhhbmRsaW5nCisgKi8KKworLyoKKyAqIGNzaTJfaXNyX2J1ZmZlciAtIERvZXMgYnVmZmVyIGhhbmRsaW5nIGF0IGVuZC1vZi1mcmFtZQorICogd2hlbiB3cml0aW5nIHRvIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgY3NpMl9pc3JfYnVmZmVyKHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIpCit7CisJc3RydWN0IGlzc19idWZmZXIgKmJ1ZmZlcjsKKworCWNzaTJfY3R4X2VuYWJsZShjc2kyLCAwLCAwKTsKKworCWJ1ZmZlciA9IG9tYXA0aXNzX3ZpZGVvX2J1ZmZlcl9uZXh0KCZjc2kyLT52aWRlb19vdXQpOworCisJLyoKKwkgKiBMZXQgdmlkZW8gcXVldWUgb3BlcmF0aW9uIHJlc3RhcnQgZW5naW5lIGlmIHRoZXJlIGlzIGFuIHVuZGVycnVuCisJICogY29uZGl0aW9uLgorCSAqLworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY3NpMl9zZXRfb3V0YWRkcihjc2kyLCBidWZmZXItPmlzc19hZGRyKTsKKwljc2kyX2N0eF9lbmFibGUoY3NpMiwgMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzaTJfaXNyX2N0eChzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLAorCQkJIHN0cnVjdCBpc3NfY3NpMl9jdHhfY2ZnICpjdHgpCit7CisJdW5zaWduZWQgaW50IG4gPSBjdHgtPmN0eG51bTsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gaXNzX3JlZ19yZWFkKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ1RYX0lSUVNUQVRVUyhuKSk7CisJaXNzX3JlZ193cml0ZShjc2kyLT5pc3MsIGNzaTItPnJlZ3MxLCBDU0kyX0NUWF9JUlFTVEFUVVMobiksIHN0YXR1cyk7CisKKwkvKiBQcm9wYWdhdGUgZnJhbWUgbnVtYmVyICovCisJaWYgKHN0YXR1cyAmIENTSTJfQ1RYX0lSUV9GUykgeworCQlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlID0KKwkJCQkgICAgIHRvX2lzc19waXBlbGluZSgmY3NpMi0+c3ViZGV2LmVudGl0eSk7CisJCWlmIChwaXBlLT5kb19wcm9wYWdhdGlvbikKKwkJCWF0b21pY19pbmMoJnBpcGUtPmZyYW1lX251bWJlcik7CisJfQorCisJaWYgKCEoc3RhdHVzICYgQ1NJMl9DVFhfSVJRX0ZFKSkKKwkJcmV0dXJuOworCisJLyogU2tpcCBpbnRlcnJ1cHRzIHVudGlsIHdlIHJlYWNoIHRoZSBmcmFtZSBza2lwIGNvdW50LiBUaGUgQ1NJMiB3aWxsIGJlCisJICogYXV0b21hdGljYWxseSBkaXNhYmxlZCwgYXMgdGhlIGZyYW1lIHNraXAgY291bnQgaGFzIGJlZW4gcHJvZ3JhbW1lZAorCSAqIGluIHRoZSBDU0kyX0NUeF9DVFJMMTo6Q09VTlQgZmllbGQsIHNvIHJlZW5hYmxlIGl0LgorCSAqCisJICogSXQgd291bGQgaGF2ZSBiZWVuIG5pY2UgdG8gcmVseSBvbiB0aGUgRlJBTUVfTlVNQkVSIGludGVycnVwdCBpbnN0ZWFkCisJICogYnV0IGl0IHR1cm5lZCBvdXQgdGhhdCB0aGUgaW50ZXJydXB0IGlzIG9ubHkgZ2VuZXJhdGVkIHdoZW4gdGhlIENTSTIKKwkgKiB3cml0ZXMgdG8gbWVtb3J5ICh0aGUgQ1NJMl9DVHhfQ1RSTDE6OkNPVU5UIGZpZWxkIGlzIGRlY3JlYXNlZAorCSAqIGNvcnJlY3RseSBhbmQgcmVhY2hlcyAwIHdoZW4gZGF0YSBpcyBmb3J3YXJkZWQgdG8gdGhlIHZpZGVvIHBvcnQgb25seQorCSAqIGJ1dCBubyBpbnRlcnJ1cHQgYXJyaXZlcykuIE1heWJlIGEgQ1NJMiBoYXJkd2FyZSBidWcuCisJICovCisJaWYgKGNzaTItPmZyYW1lX3NraXApIHsKKwkJY3NpMi0+ZnJhbWVfc2tpcC0tOworCQlpZiAoY3NpMi0+ZnJhbWVfc2tpcCA9PSAwKSB7CisJCQljdHgtPmZvcm1hdF9pZCA9IGNzaTJfY3R4X21hcF9mb3JtYXQoY3NpMik7CisJCQljc2kyX2N0eF9jb25maWcoY3NpMiwgY3R4KTsKKwkJCWNzaTJfY3R4X2VuYWJsZShjc2kyLCBuLCAxKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKGNzaTItPm91dHB1dCAmIENTSTJfT1VUUFVUX01FTU9SWSkKKwkJY3NpMl9pc3JfYnVmZmVyKGNzaTIpOworfQorCisvKgorICogb21hcDRpc3NfY3NpMl9pc3IgLSBDU0kyIGludGVycnVwdCBoYW5kbGluZy4KKyAqLwordm9pZCBvbWFwNGlzc19jc2kyX2lzcihzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyKQoreworCXN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUgPSB0b19pc3NfcGlwZWxpbmUoJmNzaTItPnN1YmRldi5lbnRpdHkpOworCXUzMiBjc2kyX2lycXN0YXR1cywgY3B4aW8xX2lycXN0YXR1czsKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gY3NpMi0+aXNzOworCisJaWYgKCFjc2kyLT5hdmFpbGFibGUpCisJCXJldHVybjsKKworCWNzaTJfaXJxc3RhdHVzID0gaXNzX3JlZ19yZWFkKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfSVJRU1RBVFVTKTsKKwlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfSVJRU1RBVFVTLCBjc2kyX2lycXN0YXR1cyk7CisKKwkvKiBGYWlsdXJlIENhc2VzICovCisJaWYgKGNzaTJfaXJxc3RhdHVzICYgQ1NJMl9JUlFfQ09NUExFWElPX0VSUikgeworCQljcHhpbzFfaXJxc3RhdHVzID0gaXNzX3JlZ19yZWFkKGNzaTItPmlzcywgY3NpMi0+cmVnczEsCisJCQkJCQlDU0kyX0NPTVBMRVhJT19JUlFTVEFUVVMpOworCQlpc3NfcmVnX3dyaXRlKGNzaTItPmlzcywgY3NpMi0+cmVnczEsIENTSTJfQ09NUExFWElPX0lSUVNUQVRVUywKKwkJCSAgICAgIGNweGlvMV9pcnFzdGF0dXMpOworCQlkZXZfZGJnKGlzcy0+ZGV2LCAiQ1NJMjogQ29tcGxleElPIEVycm9yIElSUSAleFxuIiwKKwkJCWNweGlvMV9pcnFzdGF0dXMpOworCQlwaXBlLT5lcnJvciA9IHRydWU7CisJfQorCisJaWYgKGNzaTJfaXJxc3RhdHVzICYgKENTSTJfSVJRX09DUF9FUlIgfAorCQkJICAgICAgQ1NJMl9JUlFfU0hPUlRfUEFDS0VUIHwKKwkJCSAgICAgIENTSTJfSVJRX0VDQ19OT19DT1JSRUNUSU9OIHwKKwkJCSAgICAgIENTSTJfSVJRX0NPTVBMRVhJT19FUlIgfAorCQkJICAgICAgQ1NJMl9JUlFfRklGT19PVkYpKSB7CisJCWRldl9kYmcoaXNzLT5kZXYsCisJCQkiQ1NJMiBFcnI6IE9DUDolZCBTSE9SVDolZCBFQ0M6JWQgQ1BYSU86JWQgT1ZGOiVkXG4iLAorCQkJY3NpMl9pcnFzdGF0dXMgJiBDU0kyX0lSUV9PQ1BfRVJSID8gMSA6IDAsCisJCQljc2kyX2lycXN0YXR1cyAmIENTSTJfSVJRX1NIT1JUX1BBQ0tFVCA/IDEgOiAwLAorCQkJY3NpMl9pcnFzdGF0dXMgJiBDU0kyX0lSUV9FQ0NfTk9fQ09SUkVDVElPTiA/IDEgOiAwLAorCQkJY3NpMl9pcnFzdGF0dXMgJiBDU0kyX0lSUV9DT01QTEVYSU9fRVJSID8gMSA6IDAsCisJCQljc2kyX2lycXN0YXR1cyAmIENTSTJfSVJRX0ZJRk9fT1ZGID8gMSA6IDApOworCQlwaXBlLT5lcnJvciA9IHRydWU7CisJfQorCisJaWYgKG9tYXA0aXNzX21vZHVsZV9zeW5jX2lzX3N0b3BwaW5nKCZjc2kyLT53YWl0LCAmY3NpMi0+c3RvcHBpbmcpKQorCQlyZXR1cm47CisKKwkvKiBTdWNjZXNzZnVsIGNhc2VzICovCisJaWYgKGNzaTJfaXJxc3RhdHVzICYgQ1NJMl9JUlFfQ09OVEVYVDApCisJCWNzaTJfaXNyX2N0eChjc2kyLCAmY3NpMi0+Y29udGV4dHNbMF0pOworCisJaWYgKGNzaTJfaXJxc3RhdHVzICYgQ1NJMl9JUlFfRUNDX0NPUlJFQ1RJT04pCisJCWRldl9kYmcoaXNzLT5kZXYsICJDU0kyOiBFQ0MgY29ycmVjdGlvbiBkb25lXG4iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUyB2aWRlbyBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIGNzaTJfcXVldWUgLSBRdWV1ZXMgdGhlIGZpcnN0IGJ1ZmZlciB3aGVuIHVzaW5nIG1lbW9yeSBvdXRwdXQKKyAqIEB2aWRlbzogVGhlIHZpZGVvIG5vZGUKKyAqIEBidWZmZXI6IGJ1ZmZlciB0byBxdWV1ZQorICovCitzdGF0aWMgaW50IGNzaTJfcXVldWUoc3RydWN0IGlzc192aWRlbyAqdmlkZW8sIHN0cnVjdCBpc3NfYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiA9IGNvbnRhaW5lcl9vZih2aWRlbywKKwkJCQlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlLCB2aWRlb19vdXQpOworCisJY3NpMl9zZXRfb3V0YWRkcihjc2kyLCBidWZmZXItPmlzc19hZGRyKTsKKworCS8qCisJICogSWYgc3RyZWFtaW5nIHdhcyBlbmFibGVkIGJlZm9yZSB0aGVyZSB3YXMgYSBidWZmZXIgcXVldWVkCisJICogb3IgdW5kZXJydW4gaGFwcGVuZWQgaW4gdGhlIElTUiwgdGhlIGhhcmR3YXJlIHdhcyBub3QgZW5hYmxlZAorCSAqIGFuZCBETUEgcXVldWUgZmxhZyBJU1NfVklERU9fRE1BUVVFVUVfVU5ERVJSVU4gaXMgc3RpbGwgc2V0LgorCSAqIEVuYWJsZSBpdCBub3cuCisJICovCisJaWYgKGNzaTItPnZpZGVvX291dC5kbWFxdWV1ZV9mbGFncyAmIElTU19WSURFT19ETUFRVUVVRV9VTkRFUlJVTikgeworCQkvKiBFbmFibGUgLyBkaXNhYmxlIGNvbnRleHQgMCBhbmQgSVJRcyAqLworCQljc2kyX2lmX2VuYWJsZShjc2kyLCAxKTsKKwkJY3NpMl9jdHhfZW5hYmxlKGNzaTIsIDAsIDEpOworCQlpc3NfdmlkZW9fZG1hcXVldWVfZmxhZ3NfY2xyKCZjc2kyLT52aWRlb19vdXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzc192aWRlb19vcGVyYXRpb25zIGNzaTJfaXNzdmlkZW9fb3BzID0geworCS5xdWV1ZSA9IGNzaTJfcXVldWUsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19fY3NpMl9nZXRfZm9ybWF0KHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCSAgdW5zaWduZWQgaW50IHBhZCwgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCWlmICh3aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKQorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIHBhZCk7CisJZWxzZQorCQlyZXR1cm4gJmNzaTItPmZvcm1hdHNbcGFkXTsKK30KKworc3RhdGljIHZvaWQKK2NzaTJfdHJ5X2Zvcm1hdChzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQl1bnNpZ25lZCBpbnQgcGFkLCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQsCisJCWVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCkKK3sKKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgcGl4ZWxjb2RlOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKwljb25zdCBzdHJ1Y3QgaXNzX2Zvcm1hdF9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChwYWQpIHsKKwljYXNlIENTSTJfUEFEX1NJTks6CisJCS8qIENsYW1wIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHZhbGlkIHJhbmdlICgxLTgxOTEpLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjc2kyX2lucHV0X2ZtdHMpOyBpKyspIHsKKwkJCWlmIChmbXQtPmNvZGUgPT0gY3NpMl9pbnB1dF9mbXRzW2ldKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgbm90IGZvdW5kLCB1c2UgU0dSQkcxMCBhcyBkZWZhdWx0ICovCisJCWlmIChpID49IEFSUkFZX1NJWkUoY3NpMl9pbnB1dF9mbXRzKSkKKwkJCWZtdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCisJCWZtdC0+d2lkdGggPSBjbGFtcF90KHUzMiwgZm10LT53aWR0aCwgMSwgODE5MSk7CisJCWZtdC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGZtdC0+aGVpZ2h0LCAxLCA4MTkxKTsKKwkJYnJlYWs7CisKKwljYXNlIENTSTJfUEFEX1NPVVJDRToKKwkJLyogU291cmNlIGZvcm1hdCBzYW1lIGFzIHNpbmsgZm9ybWF0LCBleGNlcHQgZm9yIERQQ00KKwkJICogY29tcHJlc3Npb24uCisJCSAqLworCQlwaXhlbGNvZGUgPSBmbXQtPmNvZGU7CisJCWZvcm1hdCA9IF9fY3NpMl9nZXRfZm9ybWF0KGNzaTIsIGZoLCBDU0kyX1BBRF9TSU5LLCB3aGljaCk7CisJCW1lbWNweShmbXQsIGZvcm1hdCwgc2l6ZW9mKCpmbXQpKTsKKworCQkvKgorCQkgKiBPbmx5IEFsbG93IERQQ00gZGVjb21wcmVzc2lvbiwgYW5kIGNoZWNrIHRoYXQgdGhlCisJCSAqIHBhdHRlcm4gaXMgcHJlc2VydmVkCisJCSAqLworCQlpbmZvID0gb21hcDRpc3NfdmlkZW9fZm9ybWF0X2luZm8oZm10LT5jb2RlKTsKKwkJaWYgKGluZm8tPnVuY29tcHJlc3NlZCA9PSBwaXhlbGNvZGUpCisJCQlmbXQtPmNvZGUgPSBwaXhlbGNvZGU7CisJCWJyZWFrOworCX0KKworCS8qIFJHQiwgbm9uLWludGVybGFjZWQgKi8KKwlmbXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwlmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworfQorCisvKgorICogY3NpMl9lbnVtX21idXNfY29kZSAtIEhhbmRsZSBwaXhlbCBmb3JtYXQgZW51bWVyYXRpb24KKyAqIEBzZCAgICAgOiBwb2ludGVyIHRvIHY0bDIgc3ViZGV2IHN0cnVjdHVyZQorICogQGZoICAgICA6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCisgKiBAY29kZSAgIDogcG9pbnRlciB0byB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSBzdHJ1Y3R1cmUKKyAqIHJldHVybiAtRUlOVkFMIG9yIHplcm8gb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGNzaTJfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCWNvbnN0IHN0cnVjdCBpc3NfZm9ybWF0X2luZm8gKmluZm87CisKKwlpZiAoY29kZS0+cGFkID09IENTSTJfUEFEX1NJTkspIHsKKwkJaWYgKGNvZGUtPmluZGV4ID49IEFSUkFZX1NJWkUoY3NpMl9pbnB1dF9mbXRzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvZGUtPmNvZGUgPSBjc2kyX2lucHV0X2ZtdHNbY29kZS0+aW5kZXhdOworCX0gZWxzZSB7CisJCWZvcm1hdCA9IF9fY3NpMl9nZXRfZm9ybWF0KGNzaTIsIGZoLCBDU0kyX1BBRF9TSU5LLAorCQkJCQkgICBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwkJc3dpdGNoIChjb2RlLT5pbmRleCkgeworCQljYXNlIDA6CisJCQkvKiBQYXNzdGhyb3VnaCBzaW5rIHBhZCBjb2RlICovCisJCQljb2RlLT5jb2RlID0gZm9ybWF0LT5jb2RlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIFVuY29tcHJlc3NlZCBjb2RlICovCisJCQlpbmZvID0gb21hcDRpc3NfdmlkZW9fZm9ybWF0X2luZm8oZm9ybWF0LT5jb2RlKTsKKwkJCWlmIChpbmZvLT51bmNvbXByZXNzZWQgPT0gZm9ybWF0LT5jb2RlKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljb2RlLT5jb2RlID0gaW5mby0+dW5jb21wcmVzc2VkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzaTJfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OworCisJaWYgKGZzZS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JtYXQuY29kZSA9IGZzZS0+Y29kZTsKKwlmb3JtYXQud2lkdGggPSAxOworCWZvcm1hdC5oZWlnaHQgPSAxOworCWNzaTJfdHJ5X2Zvcm1hdChjc2kyLCBmaCwgZnNlLT5wYWQsICZmb3JtYXQsIFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpOworCWZzZS0+bWluX3dpZHRoID0gZm9ybWF0LndpZHRoOworCWZzZS0+bWluX2hlaWdodCA9IGZvcm1hdC5oZWlnaHQ7CisKKwlpZiAoZm9ybWF0LmNvZGUgIT0gZnNlLT5jb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcm1hdC5jb2RlID0gZnNlLT5jb2RlOworCWZvcm1hdC53aWR0aCA9IC0xOworCWZvcm1hdC5oZWlnaHQgPSAtMTsKKwljc2kyX3RyeV9mb3JtYXQoY3NpMiwgZmgsIGZzZS0+cGFkLCAmZm9ybWF0LCBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC53aWR0aDsKKwlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQuaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjc2kyX2dldF9mb3JtYXQgLSBIYW5kbGUgZ2V0IGZvcm1hdCBieSBwYWRzIHN1YmRldiBtZXRob2QKKyAqIEBzZCA6IHBvaW50ZXIgdG8gdjRsMiBzdWJkZXYgc3RydWN0dXJlCisgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQGZtdDogcG9pbnRlciB0byB2NGwyIHN1YmRldiBmb3JtYXQgc3RydWN0dXJlCisgKiByZXR1cm4gLUVJTlZBTCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBjc2kyX2dldF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJZm9ybWF0ID0gX19jc2kyX2dldF9mb3JtYXQoY3NpMiwgZmgsIGZtdC0+cGFkLCBmbXQtPndoaWNoKTsKKwlpZiAoZm9ybWF0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm10LT5mb3JtYXQgPSAqZm9ybWF0OworCXJldHVybiAwOworfQorCisvKgorICogY3NpMl9zZXRfZm9ybWF0IC0gSGFuZGxlIHNldCBmb3JtYXQgYnkgcGFkcyBzdWJkZXYgbWV0aG9kCisgKiBAc2QgOiBwb2ludGVyIHRvIHY0bDIgc3ViZGV2IHN0cnVjdHVyZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IHBvaW50ZXIgdG8gdjRsMiBzdWJkZXYgZm9ybWF0IHN0cnVjdHVyZQorICogcmV0dXJuIC1FSU5WQUwgb3IgemVybyBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgY3NpMl9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9fY3NpMl9nZXRfZm9ybWF0KGNzaTIsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CisJaWYgKGZvcm1hdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNzaTJfdHJ5X2Zvcm1hdChjc2kyLCBmaCwgZm10LT5wYWQsICZmbXQtPmZvcm1hdCwgZm10LT53aGljaCk7CisJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OworCisJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgZnJvbSBzaW5rIHRvIHNvdXJjZSAqLworCWlmIChmbXQtPnBhZCA9PSBDU0kyX1BBRF9TSU5LKSB7CisJCWZvcm1hdCA9IF9fY3NpMl9nZXRfZm9ybWF0KGNzaTIsIGZoLCBDU0kyX1BBRF9TT1VSQ0UsCisJCQkJCSAgIGZtdC0+d2hpY2gpOworCQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7CisJCWNzaTJfdHJ5X2Zvcm1hdChjc2kyLCBmaCwgQ1NJMl9QQURfU09VUkNFLCBmb3JtYXQsIGZtdC0+d2hpY2gpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzaTJfbGlua192YWxpZGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgbWVkaWFfbGluayAqbGluaywKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKnNvdXJjZV9mbXQsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzaW5rX2ZtdCkKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSA9IHRvX2lzc19waXBlbGluZSgmY3NpMi0+c3ViZGV2LmVudGl0eSk7CisJaW50IHJ2YWw7CisKKwlwaXBlLT5leHRlcm5hbCA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihsaW5rLT5zb3VyY2UtPmVudGl0eSk7CisJcnZhbCA9IG9tYXA0aXNzX2dldF9leHRlcm5hbF9pbmZvKHBpcGUsIGxpbmspOworCWlmIChydmFsIDwgMCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlyZXR1cm4gdjRsMl9zdWJkZXZfbGlua192YWxpZGF0ZV9kZWZhdWx0KHNkLCBsaW5rLCBzb3VyY2VfZm10LAorCQkJCQkJIHNpbmtfZm10KTsKK30KKworLyoKKyAqIGNzaTJfaW5pdF9mb3JtYXRzIC0gSW5pdGlhbGl6ZSBmb3JtYXRzIG9uIGFsbCBwYWRzCisgKiBAc2Q6IElTUyBDU0kyIFY0TDIgc3ViZGV2aWNlCisgKiBAZmg6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCisgKgorICogSW5pdGlhbGl6ZSBhbGwgcGFkIGZvcm1hdHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gSWYgZmggaXMgbm90IE5VTEwsIHRyeQorICogZm9ybWF0cyBhcmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZpbGUgaGFuZGxlLiBPdGhlcndpc2UgYWN0aXZlIGZvcm1hdHMgYXJlCisgKiBpbml0aWFsaXplZCBvbiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGNzaTJfaW5pdF9mb3JtYXRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCBmb3JtYXQ7CisKKwltZW1zZXQoJmZvcm1hdCwgMCwgc2l6ZW9mKGZvcm1hdCkpOworCWZvcm1hdC5wYWQgPSBDU0kyX1BBRF9TSU5LOworCWZvcm1hdC53aGljaCA9IGZoID8gVjRMMl9TVUJERVZfRk9STUFUX1RSWSA6IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7CisJZm9ybWF0LmZvcm1hdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisJZm9ybWF0LmZvcm1hdC53aWR0aCA9IDQwOTY7CisJZm9ybWF0LmZvcm1hdC5oZWlnaHQgPSA0MDk2OworCWNzaTJfc2V0X2Zvcm1hdChzZCwgZmgsICZmb3JtYXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjc2kyX3NldF9zdHJlYW0gLSBFbmFibGUvRGlzYWJsZSBzdHJlYW1pbmcgb24gdGhlIENTSTIgbW9kdWxlCisgKiBAc2Q6IElTUyBDU0kyIFY0TDIgc3ViZGV2aWNlCisgKiBAZW5hYmxlOiBJU1MgcGlwZWxpbmUgc3RyZWFtIHN0YXRlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGNzaTJfc2V0X3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gY3NpMi0+aXNzOworCXN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUgPSB0b19pc3NfcGlwZWxpbmUoJmNzaTItPnN1YmRldi5lbnRpdHkpOworCXN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvX291dCA9ICZjc2kyLT52aWRlb19vdXQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3NpMi0+c3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKSB7CisJCWlmIChlbmFibGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQkJcmV0dXJuIDA7CisKKwkJb21hcDRpc3Nfc3ViY2xrX2VuYWJsZShpc3MsIGNzaTItPnN1YmNsayk7CisJfQorCisJc3dpdGNoIChlbmFibGUpIHsKKwljYXNlIElTU19QSVBFTElORV9TVFJFQU1fQ09OVElOVU9VUzogeworCQlyZXQgPSBvbWFwNGlzc19jc2lwaHlfY29uZmlnKGlzcywgc2QpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKG9tYXA0aXNzX2NzaXBoeV9hY3F1aXJlKGNzaTItPnBoeSkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWNzaTItPnVzZV9mc19pcnEgPSBwaXBlLT5kb19wcm9wYWdhdGlvbjsKKwkJY3NpMl9jb25maWd1cmUoY3NpMik7CisJCWNzaTJfcHJpbnRfc3RhdHVzKGNzaTIpOworCisJCS8qCisJCSAqIFdoZW4gb3V0cHV0dGluZyB0byBtZW1vcnkgd2l0aCBubyBidWZmZXIgYXZhaWxhYmxlLCBsZXQgdGhlCisJCSAqIGJ1ZmZlciBxdWV1ZSBoYW5kbGVyIHN0YXJ0IHRoZSBoYXJkd2FyZS4gQSBETUEgcXVldWUgZmxhZworCQkgKiBJU1NfVklERU9fRE1BUVVFVUVfUVVFVUVEIHdpbGwgYmUgc2V0IGFzIHNvb24gYXMgdGhlcmUgaXMKKwkJICogYSBidWZmZXIgYXZhaWxhYmxlLgorCQkgKi8KKwkJaWYgKGNzaTItPm91dHB1dCAmIENTSTJfT1VUUFVUX01FTU9SWSAmJgorCQkgICAgISh2aWRlb19vdXQtPmRtYXF1ZXVlX2ZsYWdzICYgSVNTX1ZJREVPX0RNQVFVRVVFX1FVRVVFRCkpCisJCQlicmVhazsKKwkJLyogRW5hYmxlIGNvbnRleHQgMCBhbmQgSVJRcyAqLworCQlhdG9taWNfc2V0KCZjc2kyLT5zdG9wcGluZywgMCk7CisJCWNzaTJfY3R4X2VuYWJsZShjc2kyLCAwLCAxKTsKKwkJY3NpMl9pZl9lbmFibGUoY3NpMiwgMSk7CisJCWlzc192aWRlb19kbWFxdWV1ZV9mbGFnc19jbHIodmlkZW9fb3V0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOgorCQlpZiAoY3NpMi0+c3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQkJcmV0dXJuIDA7CisJCWlmIChvbWFwNGlzc19tb2R1bGVfc3luY19pZGxlKCZzZC0+ZW50aXR5LCAmY3NpMi0+d2FpdCwKKwkJCQkJICAgICAgJmNzaTItPnN0b3BwaW5nKSkKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCWNzaTJfY3R4X2VuYWJsZShjc2kyLCAwLCAwKTsKKwkJY3NpMl9pZl9lbmFibGUoY3NpMiwgMCk7CisJCWNzaTJfaXJxX2N0eF9zZXQoY3NpMiwgMCk7CisJCW9tYXA0aXNzX2NzaXBoeV9yZWxlYXNlKGNzaTItPnBoeSk7CisJCW9tYXA0aXNzX3N1YmNsa19kaXNhYmxlKGlzcywgY3NpMi0+c3ViY2xrKTsKKwkJaXNzX3ZpZGVvX2RtYXF1ZXVlX2ZsYWdzX2Nscih2aWRlb19vdXQpOworCQlicmVhazsKKwl9CisKKwljc2kyLT5zdGF0ZSA9IGVuYWJsZTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgY3NpMl92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtID0gY3NpMl9zZXRfc3RyZWFtLAorfTsKKworLyogc3ViZGV2IHBhZCBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgY3NpMl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IGNzaTJfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IGNzaTJfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gY3NpMl9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gY3NpMl9zZXRfZm9ybWF0LAorCS5saW5rX3ZhbGlkYXRlID0gY3NpMl9saW5rX3ZhbGlkYXRlLAorfTsKKworLyogc3ViZGV2IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGNzaTJfb3BzID0geworCS52aWRlbyA9ICZjc2kyX3ZpZGVvX29wcywKKwkucGFkID0gJmNzaTJfcGFkX29wcywKK307CisKKy8qIHN1YmRldiBpbnRlcm5hbCBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBjc2kyX2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IGNzaTJfaW5pdF9mb3JtYXRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1lZGlhIGVudGl0eSBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIGNzaTJfbGlua19zZXR1cCAtIFNldHVwIENTSTIgY29ubmVjdGlvbnMuCisgKiBAZW50aXR5IDogUG9pbnRlciB0byBtZWRpYSBlbnRpdHkgc3RydWN0dXJlCisgKiBAbG9jYWwgIDogUG9pbnRlciB0byBsb2NhbCBwYWQgYXJyYXkKKyAqIEByZW1vdGUgOiBQb2ludGVyIHRvIHJlbW90ZSBwYWQgYXJyYXkKKyAqIEBmbGFncyAgOiBMaW5rIGZsYWdzCisgKiByZXR1cm4gLUVJTlZBTCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBjc2kyX2xpbmtfc2V0dXAoc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5LAorCQkJICAgY29uc3Qgc3RydWN0IG1lZGlhX3BhZCAqbG9jYWwsCisJCQkgICBjb25zdCBzdHJ1Y3QgbWVkaWFfcGFkICpyZW1vdGUsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KGVudGl0eSk7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBpc3NfY3NpMl9jdHJsX2NmZyAqY3RybCA9ICZjc2kyLT5jdHJsOworCisJLyoKKwkgKiBUaGUgSVNTIGNvcmUgZG9lc24ndCBzdXBwb3J0IHBpcGVsaW5lcyB3aXRoIG11bHRpcGxlIHZpZGVvIG91dHB1dHMuCisJICogUmV2aXNpdCB0aGlzIHdoZW4gaXQgd2lsbCBiZSBpbXBsZW1lbnRlZCwgYW5kIHJldHVybiAtRUJVU1kgZm9yIG5vdy4KKwkgKi8KKworCXN3aXRjaCAobG9jYWwtPmluZGV4IHwgbWVkaWFfZW50aXR5X3R5cGUocmVtb3RlLT5lbnRpdHkpKSB7CisJY2FzZSBDU0kyX1BBRF9TT1VSQ0UgfCBNRURJQV9FTlRfVF9ERVZOT0RFOgorCQlpZiAoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkgeworCQkJaWYgKGNzaTItPm91dHB1dCAmIH5DU0kyX09VVFBVVF9NRU1PUlkpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWNzaTItPm91dHB1dCB8PSBDU0kyX09VVFBVVF9NRU1PUlk7CisJCX0gZWxzZSB7CisJCQljc2kyLT5vdXRwdXQgJj0gfkNTSTJfT1VUUFVUX01FTU9SWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NJMl9QQURfU09VUkNFIHwgTUVESUFfRU5UX1RfVjRMMl9TVUJERVY6CisJCWlmIChmbGFncyAmIE1FRElBX0xOS19GTF9FTkFCTEVEKSB7CisJCQlpZiAoY3NpMi0+b3V0cHV0ICYgfkNTSTJfT1VUUFVUX0lQSVBFSUYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWNzaTItPm91dHB1dCB8PSBDU0kyX09VVFBVVF9JUElQRUlGOworCQl9IGVsc2UgeworCQkJY3NpMi0+b3V0cHV0ICY9IH5DU0kyX09VVFBVVF9JUElQRUlGOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogTGluayBmcm9tIGNhbWVyYSB0byBDU0kyIGlzIGZpeGVkLi4uICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0cmwtPnZwX29ubHlfZW5hYmxlID0gY3NpMi0+b3V0cHV0ICYgQ1NJMl9PVVRQVVRfTUVNT1JZID8gZmFsc2UgOiB0cnVlOworCWN0cmwtPnZwX2Nsa19lbmFibGUgPSAhIShjc2kyLT5vdXRwdXQgJiBDU0kyX09VVFBVVF9JUElQRUlGKTsKKworCXJldHVybiAwOworfQorCisvKiBtZWRpYSBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lZGlhX2VudGl0eV9vcGVyYXRpb25zIGNzaTJfbWVkaWFfb3BzID0geworCS5saW5rX3NldHVwID0gY3NpMl9saW5rX3NldHVwLAorCS5saW5rX3ZhbGlkYXRlID0gdjRsMl9zdWJkZXZfbGlua192YWxpZGF0ZSwKK307CisKK3ZvaWQgb21hcDRpc3NfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIpCit7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNzaTItPnN1YmRldik7CisJb21hcDRpc3NfdmlkZW9fdW5yZWdpc3RlcigmY3NpMi0+dmlkZW9fb3V0KTsKK30KKworaW50IG9tYXA0aXNzX2NzaTJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNzaTItPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwNGlzc192aWRlb19yZWdpc3RlcigmY3NpMi0+dmlkZW9fb3V0LCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlvbWFwNGlzc19jc2kyX3VucmVnaXN0ZXJfZW50aXRpZXMoY3NpMik7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUyBDU0kyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKworLyoKKyAqIGNzaTJfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkuCisgKiBAY3NpMjogUG9pbnRlciB0byBjc2kyIHN0cnVjdHVyZS4KKyAqIHJldHVybiAtRU5PTUVNIG9yIHplcm8gb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGNzaTJfaW5pdF9lbnRpdGllcyhzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLCBjb25zdCBjaGFyICpzdWJuYW1lKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmY3NpMi0+c3ViZGV2OworCXN0cnVjdCBtZWRpYV9wYWQgKnBhZHMgPSBjc2kyLT5wYWRzOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lID0gJnNkLT5lbnRpdHk7CisJaW50IHJldDsKKwljaGFyIG5hbWVbVjRMMl9TVUJERVZfTkFNRV9TSVpFXTsKKworCXY0bDJfc3ViZGV2X2luaXQoc2QsICZjc2kyX29wcyk7CisJc2QtPmludGVybmFsX29wcyA9ICZjc2kyX2ludGVybmFsX29wczsKKwlzcHJpbnRmKG5hbWUsICJDU0kyJXMiLCBzdWJuYW1lKTsKKwlzbnByaW50ZihzZC0+bmFtZSwgc2l6ZW9mKHNkLT5uYW1lKSwgIk9NQVA0IElTUyAlcyIsIG5hbWUpOworCisJc2QtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Mgc3ViZGV2cyAqLworCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGNzaTIpOworCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXBhZHNbQ1NJMl9QQURfU09VUkNFXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJcGFkc1tDU0kyX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCisJbWUtPm9wcyA9ICZjc2kyX21lZGlhX29wczsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdChtZSwgQ1NJMl9QQURTX05VTSwgcGFkcywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljc2kyX2luaXRfZm9ybWF0cyhzZCwgTlVMTCk7CisKKwkvKiBWaWRlbyBkZXZpY2Ugbm9kZSAqLworCWNzaTItPnZpZGVvX291dC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWNzaTItPnZpZGVvX291dC5vcHMgPSAmY3NpMl9pc3N2aWRlb19vcHM7CisJY3NpMi0+dmlkZW9fb3V0LmJwbF9hbGlnbm1lbnQgPSAzMjsKKwljc2kyLT52aWRlb19vdXQuYnBsX3plcm9fcGFkZGluZyA9IDE7CisJY3NpMi0+dmlkZW9fb3V0LmJwbF9tYXggPSAweDFmZmUwOworCWNzaTItPnZpZGVvX291dC5pc3MgPSBjc2kyLT5pc3M7CisJY3NpMi0+dmlkZW9fb3V0LmNhcHR1cmVfbWVtID0gUEFHRV9BTElHTig0MDk2ICogNDA5NikgKiAzOworCisJcmV0ID0gb21hcDRpc3NfdmlkZW9faW5pdCgmY3NpMi0+dmlkZW9fb3V0LCBuYW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl92aWRlbzsKKworCS8qIENvbm5lY3QgdGhlIENTSTIgc3ViZGV2IHRvIHRoZSB2aWRlbyBub2RlLiAqLworCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmY3NpMi0+c3ViZGV2LmVudGl0eSwgQ1NJMl9QQURfU09VUkNFLAorCQkJCSAgICAgICAmY3NpMi0+dmlkZW9fb3V0LnZpZGVvLmVudGl0eSwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfbGluazsKKworCXJldHVybiAwOworCitlcnJvcl9saW5rOgorCW9tYXA0aXNzX3ZpZGVvX2NsZWFudXAoJmNzaTItPnZpZGVvX291dCk7CitlcnJvcl92aWRlbzoKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmY3NpMi0+c3ViZGV2LmVudGl0eSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9tYXA0aXNzX2NzaTJfaW5pdCAtIFJvdXRpbmUgZm9yIG1vZHVsZSBkcml2ZXIgaW5pdAorICovCitpbnQgb21hcDRpc3NfY3NpMl9pbml0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMmEgPSAmaXNzLT5jc2kyYTsKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyYiA9ICZpc3MtPmNzaTJiOworCWludCByZXQ7CisKKwljc2kyYS0+aXNzID0gaXNzOworCWNzaTJhLT5hdmFpbGFibGUgPSAxOworCWNzaTJhLT5yZWdzMSA9IE9NQVA0X0lTU19NRU1fQ1NJMl9BX1JFR1MxOworCWNzaTJhLT5waHkgPSAmaXNzLT5jc2lwaHkxOworCWNzaTJhLT5zdWJjbGsgPSBPTUFQNF9JU1NfU1VCQ0xLX0NTSTJfQTsKKwljc2kyYS0+c3RhdGUgPSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3NpMmEtPndhaXQpOworCisJcmV0ID0gY3NpMl9pbml0X2VudGl0aWVzKGNzaTJhLCAiYSIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY3NpMmItPmlzcyA9IGlzczsKKwljc2kyYi0+YXZhaWxhYmxlID0gMTsKKwljc2kyYi0+cmVnczEgPSBPTUFQNF9JU1NfTUVNX0NTSTJfQl9SRUdTMTsKKwljc2kyYi0+cGh5ID0gJmlzcy0+Y3NpcGh5MjsKKwljc2kyYi0+c3ViY2xrID0gT01BUDRfSVNTX1NVQkNMS19DU0kyX0I7CisJY3NpMmItPnN0YXRlID0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNzaTJiLT53YWl0KTsKKworCXJldCA9IGNzaTJfaW5pdF9lbnRpdGllcyhjc2kyYiwgImIiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogb21hcDRpc3NfY3NpMl9jbGVhbnVwIC0gUm91dGluZSBmb3IgbW9kdWxlIGRyaXZlciBjbGVhbnVwCisgKi8KK3ZvaWQgb21hcDRpc3NfY3NpMl9jbGVhbnVwKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMmEgPSAmaXNzLT5jc2kyYTsKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyYiA9ICZpc3MtPmNzaTJiOworCisJb21hcDRpc3NfdmlkZW9fY2xlYW51cCgmY3NpMmEtPnZpZGVvX291dCk7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmNzaTJhLT5zdWJkZXYuZW50aXR5KTsKKworCW9tYXA0aXNzX3ZpZGVvX2NsZWFudXAoJmNzaTJiLT52aWRlb19vdXQpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZjc2kyYi0+c3ViZGV2LmVudGl0eSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaTIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfY3NpMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWFhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaTIuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIENTSTIgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIE9NQVA0X0lTU19DU0kyX0gKKyNkZWZpbmUgT01BUDRfSVNTX0NTSTJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgImlzc192aWRlby5oIgorCitzdHJ1Y3QgaXNzX2NzaXBoeTsKKworLyogVGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0ICovCitlbnVtIGlzc19jc2kyX3BpeF9mb3JtYXRzIHsKKwlDU0kyX1BJWF9GTVRfT1RIRVJTID0gMCwKKwlDU0kyX1BJWF9GTVRfWVVWNDIyXzhCSVQgPSAweDFlLAorCUNTSTJfUElYX0ZNVF9ZVVY0MjJfOEJJVF9WUCA9IDB4OWUsCisJQ1NJMl9QSVhfRk1UX1lVVjQyMl84QklUX1ZQMTYgPSAweGRlLAorCUNTSTJfUElYX0ZNVF9SQVcxMF9FWFAxNiA9IDB4YWIsCisJQ1NJMl9QSVhfRk1UX1JBVzEwX0VYUDE2X1ZQID0gMHgxMmYsCisJQ1NJMl9QSVhfRk1UX1JBVzggPSAweDJhLAorCUNTSTJfUElYX0ZNVF9SQVc4X0RQQ00xMF9FWFAxNiA9IDB4MmFhLAorCUNTSTJfUElYX0ZNVF9SQVc4X0RQQ00xMF9WUCA9IDB4MzJhLAorCUNTSTJfUElYX0ZNVF9SQVc4X1ZQID0gMHgxMmEsCisJQ1NJMl9VU0VSREVGXzhCSVRfREFUQTFfRFBDTTEwX1ZQID0gMHgzNDAsCisJQ1NJMl9VU0VSREVGXzhCSVRfREFUQTFfRFBDTTEwID0gMHgyYzAsCisJQ1NJMl9VU0VSREVGXzhCSVRfREFUQTEgPSAweDQwLAorfTsKKworZW51bSBpc3NfY3NpMl9pcnFldmVudHMgeworCU9DUF9FUlJfSVJRID0gMHg0MDAwLAorCVNIT1JUX1BBQ0tFVF9JUlEgPSAweDIwMDAsCisJRUNDX0NPUlJFQ1RJT05fSVJRID0gMHgxMDAwLAorCUVDQ19OT19DT1JSRUNUSU9OX0lSUSA9IDB4ODAwLAorCUNPTVBMRVhJTzJfRVJSX0lSUSA9IDB4NDAwLAorCUNPTVBMRVhJTzFfRVJSX0lSUSA9IDB4MjAwLAorCUZJRk9fT1ZGX0lSUSA9IDB4MTAwLAorCUNPTlRFWFQ3ID0gMHg4MCwKKwlDT05URVhUNiA9IDB4NDAsCisJQ09OVEVYVDUgPSAweDIwLAorCUNPTlRFWFQ0ID0gMHgxMCwKKwlDT05URVhUMyA9IDB4OCwKKwlDT05URVhUMiA9IDB4NCwKKwlDT05URVhUMSA9IDB4MiwKKwlDT05URVhUMCA9IDB4MSwKK307CisKK2VudW0gaXNzX2NzaTJfY3R4X2lycWV2ZW50cyB7CisJQ1RYX0VDQ19DT1JSRUNUSU9OID0gMHgxMDAsCisJQ1RYX0xJTkVfTlVNQkVSID0gMHg4MCwKKwlDVFhfRlJBTUVfTlVNQkVSID0gMHg0MCwKKwlDVFhfQ1MgPSAweDIwLAorCUNUWF9MRSA9IDB4OCwKKwlDVFhfTFMgPSAweDQsCisJQ1RYX0ZFID0gMHgyLAorCUNUWF9GUyA9IDB4MSwKK307CisKK2VudW0gaXNzX2NzaTJfZnJhbWVfbW9kZSB7CisJSVNTX0NTSTJfRlJBTUVfSU1NRURJQVRFLAorCUlTU19DU0kyX0ZSQU1FX0FGVEVSRkVDLAorfTsKKworI2RlZmluZSBJU1NfQ1NJMl9NQVhfQ1RYX05VTQk3CisKK3N0cnVjdCBpc3NfY3NpMl9jdHhfY2ZnIHsKKwl1OCBjdHhudW07CQkvKiBjb250ZXh0IG51bWJlciAwIC0gNyAqLworCXU4IGRwY21fZGVjb21wcmVzczsKKworCS8qIEZpZWxkcyBpbiBDU0kyX0NUeF9DVFJMMiAtIGxvY2tlZCBieSBDU0kyX0NUeF9DVFJMMS5DVFhfRU4gKi8KKwl1OCB2aXJ0dWFsX2lkOworCXUxNiBmb3JtYXRfaWQ7CQkvKiBhcyBpbiBDU0kyX0NUeF9DVFJMMls5OjBdICovCisJdTggZHBjbV9wcmVkaWN0b3I7CS8qIDE6IHNpbXBsZSwgMDogYWR2YW5jZWQgKi8KKworCS8qIEZpZWxkcyBpbiBDU0kyX0NUeF9DVFJMMS8zIC0gU2hhZG93ZWQgKi8KKwl1MTYgYWxwaGE7CisJdTE2IGRhdGFfb2Zmc2V0OworCXUzMiBwaW5nX2FkZHI7CisJdTMyIHBvbmdfYWRkcjsKKwl1OCBlb2ZfZW5hYmxlZDsKKwl1OCBlb2xfZW5hYmxlZDsKKwl1OCBjaGVja3N1bV9lbmFibGVkOworCXU4IGVuYWJsZWQ7Cit9OworCitzdHJ1Y3QgaXNzX2NzaTJfdGltaW5nX2NmZyB7CisJdTggaW9udW07CQkJLyogSU8xIG9yIElPMiBhcyBpbiBDU0kyX1RJTUlORyAqLworCXVuc2lnbmVkIGZvcmNlX3J4X21vZGU6MTsKKwl1bnNpZ25lZCBzdG9wX3N0YXRlXzE2eDoxOworCXVuc2lnbmVkIHN0b3Bfc3RhdGVfNHg6MTsKKwl1MTYgc3RvcF9zdGF0ZV9jb3VudGVyOworfTsKKworc3RydWN0IGlzc19jc2kyX2N0cmxfY2ZnIHsKKwlib29sIHZwX2Nsa19lbmFibGU7CisJYm9vbCB2cF9vbmx5X2VuYWJsZTsKKwl1OCB2cF9vdXRfY3RybDsKKwllbnVtIGlzc19jc2kyX2ZyYW1lX21vZGUgZnJhbWVfbW9kZTsKKwlib29sIGVjY19lbmFibGU7CisJYm9vbCBpZl9lbmFibGU7Cit9OworCisjZGVmaW5lIENTSTJfUEFEX1NJTksJCTAKKyNkZWZpbmUgQ1NJMl9QQURfU09VUkNFCQkxCisjZGVmaW5lIENTSTJfUEFEU19OVU0JCTIKKworI2RlZmluZSBDU0kyX09VVFBVVF9JUElQRUlGCSgxIDw8IDApCisjZGVmaW5lIENTSTJfT1VUUFVUX01FTU9SWQkoMSA8PCAxKQorCitzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCBtZWRpYV9wYWQgcGFkc1tDU0kyX1BBRFNfTlVNXTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdHNbQ1NJMl9QQURTX05VTV07CisKKwlzdHJ1Y3QgaXNzX3ZpZGVvIHZpZGVvX291dDsKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzOworCisJdTggYXZhaWxhYmxlOwkJLyogSXMgdGhlIElQIHByZXNlbnQgb24gdGhlIHNpbGljb24/ICovCisKKwkvKiBtZW1vcnkgcmVzb3VyY2VzLCBhcyBkZWZpbmVkIGluIGVudW0gaXNzX21lbV9yZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVnczE7CisJdW5zaWduZWQgaW50IHJlZ3MyOworCS8qIElTUCBzdWJjbG9jaywgYXMgZGVmaW5lZCBpbiBlbnVtIGlzc19pc3Bfc3ViY2xrX3Jlc291cmNlICovCisJdW5zaWduZWQgaW50IHN1YmNsazsKKworCXUzMiBvdXRwdXQ7IC8qIG91dHB1dCB0byBJUElQRUlGLCBtZW1vcnkgb3IgYm90aD8gKi8KKwlib29sIGRwY21fZGVjb21wcmVzczsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2tpcDsKKwlib29sIHVzZV9mc19pcnE7CisKKwlzdHJ1Y3QgaXNzX2NzaXBoeSAqcGh5OworCXN0cnVjdCBpc3NfY3NpMl9jdHhfY2ZnIGNvbnRleHRzW0lTU19DU0kyX01BWF9DVFhfTlVNICsgMV07CisJc3RydWN0IGlzc19jc2kyX3RpbWluZ19jZmcgdGltaW5nWzJdOworCXN0cnVjdCBpc3NfY3NpMl9jdHJsX2NmZyBjdHJsOworCWVudW0gaXNzX3BpcGVsaW5lX3N0cmVhbV9zdGF0ZSBzdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWF0b21pY190IHN0b3BwaW5nOworfTsKKwordm9pZCBvbWFwNGlzc19jc2kyX2lzcihzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyKTsKK2ludCBvbWFwNGlzc19jc2kyX3Jlc2V0KHN0cnVjdCBpc3NfY3NpMl9kZXZpY2UgKmNzaTIpOworaW50IG9tYXA0aXNzX2NzaTJfaW5pdChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKTsKK3ZvaWQgb21hcDRpc3NfY3NpMl9jbGVhbnVwKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOwordm9pZCBvbWFwNGlzc19jc2kyX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzc19jc2kyX2RldmljZSAqY3NpMik7CitpbnQgb21hcDRpc3NfY3NpMl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyLAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpOworI2VuZGlmCS8qIE9NQVA0X0lTU19DU0kyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfY3NpcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaXBoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2Q1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaXBoeS5jCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogVEkgT01BUDQgSVNTIFY0TDIgRHJpdmVyIC0gQ1NJIFBIWSBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFNlcmdpbyBBZ3VpcnJlIDxzZXJnaW8uYS5hZ3VpcnJlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmgiCisKKyNpbmNsdWRlICJpc3MuaCIKKyNpbmNsdWRlICJpc3NfcmVncy5oIgorI2luY2x1ZGUgImlzc19jc2lwaHkuaCIKKworLyoKKyAqIGNzaXBoeV9sYW5lc19jb25maWcgLSBDb25maWd1cmF0aW9uIG9mIENTSVBIWSBsYW5lcy4KKyAqCisgKiBVcGRhdGVzIEhXIGNvbmZpZ3VyYXRpb24uCisgKiBDYWxsZWQgd2l0aCBwaHktPm11dGV4IHRha2VuLgorICovCitzdGF0aWMgdm9pZCBjc2lwaHlfbGFuZXNfY29uZmlnKHN0cnVjdCBpc3NfY3NpcGh5ICpwaHkpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHJlZzsKKworCXJlZyA9IGlzc19yZWdfcmVhZChwaHktPmlzcywgcGh5LT5jZmdfcmVncywgQ1NJMl9DT01QTEVYSU9fQ0ZHKTsKKworCWZvciAoaSA9IDA7IGkgPCBwaHktPm1heF9kYXRhX2xhbmVzOyBpKyspIHsKKwkJcmVnICY9IH4oQ1NJMl9DT01QTEVYSU9fQ0ZHX0RBVEFfUE9MKGkgKyAxKSB8CisJCQkgQ1NJMl9DT01QTEVYSU9fQ0ZHX0RBVEFfUE9TSVRJT05fTUFTSyhpICsgMSkpOworCQlyZWcgfD0gKHBoeS0+bGFuZXMuZGF0YVtpXS5wb2wgPworCQkJQ1NJMl9DT01QTEVYSU9fQ0ZHX0RBVEFfUE9MKGkgKyAxKSA6IDApOworCQlyZWcgfD0gKHBoeS0+bGFuZXMuZGF0YVtpXS5wb3MgPDwKKwkJCUNTSTJfQ09NUExFWElPX0NGR19EQVRBX1BPU0lUSU9OX1NISUZUKGkgKyAxKSk7CisJfQorCisJcmVnICY9IH4oQ1NJMl9DT01QTEVYSU9fQ0ZHX0NMT0NLX1BPTCB8CisJCSBDU0kyX0NPTVBMRVhJT19DRkdfQ0xPQ0tfUE9TSVRJT05fTUFTSyk7CisJcmVnIHw9IHBoeS0+bGFuZXMuY2xrLnBvbCA/IENTSTJfQ09NUExFWElPX0NGR19DTE9DS19QT0wgOiAwOworCXJlZyB8PSBwaHktPmxhbmVzLmNsay5wb3MgPDwgQ1NJMl9DT01QTEVYSU9fQ0ZHX0NMT0NLX1BPU0lUSU9OX1NISUZUOworCisJaXNzX3JlZ193cml0ZShwaHktPmlzcywgcGh5LT5jZmdfcmVncywgQ1NJMl9DT01QTEVYSU9fQ0ZHLCByZWcpOworfQorCisvKgorICogY3NpcGh5X3NldF9wb3dlcgorICogQHBvd2VyOiBQb3dlciBzdGF0ZSB0byBiZSBzZXQuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIC1FQlVTWSBpZiB0aGUgcmV0cnkgY291bnQgaXMgZXhjZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgY3NpcGh5X3NldF9wb3dlcihzdHJ1Y3QgaXNzX2NzaXBoeSAqcGh5LCB1MzIgcG93ZXIpCit7CisJdTMyIHJlZzsKKwl1OCByZXRyeV9jb3VudDsKKworCWlzc19yZWdfdXBkYXRlKHBoeS0+aXNzLCBwaHktPmNmZ19yZWdzLCBDU0kyX0NPTVBMRVhJT19DRkcsCisJCSAgICAgICBDU0kyX0NPTVBMRVhJT19DRkdfUFdEX0NNRF9NQVNLLAorCQkgICAgICAgcG93ZXIgfCBDU0kyX0NPTVBMRVhJT19DRkdfUFdSX0FVVE8pOworCisJcmV0cnlfY291bnQgPSAwOworCWRvIHsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBpc3NfcmVnX3JlYWQocGh5LT5pc3MsIHBoeS0+Y2ZnX3JlZ3MsIENTSTJfQ09NUExFWElPX0NGRykKKwkJICAgICYgQ1NJMl9DT01QTEVYSU9fQ0ZHX1BXRF9TVEFUVVNfTUFTSzsKKworCQlpZiAocmVnICE9IHBvd2VyID4+IDIpCisJCQlyZXRyeV9jb3VudCsrOworCisJfSB3aGlsZSAoKHJlZyAhPSBwb3dlciA+PiAyKSAmJiAocmV0cnlfY291bnQgPCAyNTApKTsKKworCWlmIChyZXRyeV9jb3VudCA9PSAyNTApIHsKKwkJZGV2X2VycihwaHktPmlzcy0+ZGV2LCAiQ1NJMiBDSU8gc2V0IHBvd2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogY3NpcGh5X2RwaHlfY29uZmlnIC0gQ29uZmlndXJlIENTSTIgRC1QSFkgcGFyYW1ldGVycy4KKyAqCisgKiBDYWxsZWQgd2l0aCBwaHktPm11dGV4IHRha2VuLgorICovCitzdGF0aWMgdm9pZCBjc2lwaHlfZHBoeV9jb25maWcoc3RydWN0IGlzc19jc2lwaHkgKnBoeSkKK3sKKwl1MzIgcmVnOworCisJLyogU2V0IHVwIFJFR0lTVEVSMCAqLworCXJlZyA9IHBoeS0+ZHBoeS50aHNfdGVybSA8PCBSRUdJU1RFUjBfVEhTX1RFUk1fU0hJRlQ7CisJcmVnIHw9IHBoeS0+ZHBoeS50aHNfc2V0dGxlIDw8IFJFR0lTVEVSMF9USFNfU0VUVExFX1NISUZUOworCisJaXNzX3JlZ193cml0ZShwaHktPmlzcywgcGh5LT5waHlfcmVncywgUkVHSVNURVIwLCByZWcpOworCisJLyogU2V0IHVwIFJFR0lTVEVSMSAqLworCXJlZyA9IHBoeS0+ZHBoeS50Y2xrX3Rlcm0gPDwgUkVHSVNURVIxX1RDTEtfVEVSTV9TSElGVDsKKwlyZWcgfD0gcGh5LT5kcGh5LnRjbGtfbWlzcyA8PCBSRUdJU1RFUjFfQ1RSTENMS19ESVZfRkFDVE9SX1NISUZUOworCXJlZyB8PSBwaHktPmRwaHkudGNsa19zZXR0bGUgPDwgUkVHSVNURVIxX1RDTEtfU0VUVExFX1NISUZUOworCXJlZyB8PSAweGI4IDw8IFJFR0lTVEVSMV9EUEhZX0hTX1NZTkNfUEFUVEVSTl9TSElGVDsKKworCWlzc19yZWdfd3JpdGUocGh5LT5pc3MsIHBoeS0+cGh5X3JlZ3MsIFJFR0lTVEVSMSwgcmVnKTsKK30KKworLyoKKyAqIFRDTEsgdmFsdWVzIGFyZSBPSyBhdCB0aGVpciByZXNldCB2YWx1ZXMKKyAqLworI2RlZmluZSBUQ0xLX1RFUk0JMAorI2RlZmluZSBUQ0xLX01JU1MJMQorI2RlZmluZSBUQ0xLX1NFVFRMRQkxNAorCitpbnQgb21hcDRpc3NfY3NpcGh5X2NvbmZpZyhzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2ICpjc2kyX3N1YmRldikKK3sKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShjc2kyX3N1YmRldik7CisJc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSA9IHRvX2lzc19waXBlbGluZSgmY3NpMl9zdWJkZXYtPmVudGl0eSk7CisJc3RydWN0IGlzc192NGwyX3N1YmRldnNfZ3JvdXAgKnN1YmRldnMgPSBwaXBlLT5leHRlcm5hbC0+aG9zdF9wcml2OworCXN0cnVjdCBpc3NfY3NpcGh5X2RwaHlfY2ZnIGNzaTJwaHk7CisJaW50IGNzaTJfZGRyY2xrX2toejsKKwlzdHJ1Y3QgaXNzX2NzaXBoeV9sYW5lc19jZmcgKmxhbmVzOworCXVuc2lnbmVkIGludCB1c2VkX2xhbmVzID0gMDsKKwl1MzIgY2FtX3J4X2N0cmw7CisJdW5zaWduZWQgaW50IGk7CisKKwlsYW5lcyA9ICZzdWJkZXZzLT5idXMuY3NpMi5sYW5lY2ZnOworCisJLyoKKwkgKiBTQ00uQ09OVFJPTF9DQU1FUkFfUlgKKwkgKiAtIGJpdCBbMzFdIDogQ1NJUEhZMiBsYW5lIDIgZW5hYmxlICg0NDYwKyBvbmx5KQorCSAqIC0gYml0IFszMDoyOV0gOiBDU0lQSFkyIHBlci1sYW5lIGVuYWJsZSAoMSB0byAwKQorCSAqIC0gYml0IFsyODoyNF0gOiBDU0lQSFkxIHBlci1sYW5lIGVuYWJsZSAoNCB0byAwKQorCSAqIC0gYml0IFsyMV0gOiBDU0lQSFkyIENUUkxDTEsgZW5hYmxlCisJICogLSBiaXQgWzIwOjE5XSA6IENTSVBIWTIgY29uZmlnOiAwMCBkLXBoeSwgMDEvMTAgY2NwMgorCSAqIC0gYml0IFsxOF0gOiBDU0lQSFkxIENUUkxDTEsgZW5hYmxlCisJICogLSBiaXQgWzE3OjE2XSA6IENTSVBIWTEgY29uZmlnOiAwMCBkLXBoeSwgMDEvMTAgY2NwMgorCSAqLworCWNhbV9yeF9jdHJsID0gb21hcDRfY3RybF9wYWRfcmVhZGwoCisJCQlPTUFQNF9DVFJMX01PRFVMRV9QQURfQ09SRV9DT05UUk9MX0NBTUVSQV9SWCk7CisKKworCWlmIChzdWJkZXZzLT5pbnRlcmZhY2UgPT0gSVNTX0lOVEVSRkFDRV9DU0kyQV9QSFkxKSB7CisJCWNhbV9yeF9jdHJsICY9IH4oT01BUDRfQ0FNRVJBUlhfQ1NJMjFfTEFORUVOQUJMRV9NQVNLIHwKKwkJCQlPTUFQNF9DQU1FUkFSWF9DU0kyMV9DQU1NT0RFX01BU0spOworCQkvKiBOT1RFOiBMZWF2ZSBDU0lQSFkxIGNvbmZpZyB0byAweDA6IEQtUEhZIG1vZGUgKi8KKwkJLyogRW5hYmxlIGFsbCBsYW5lcyBmb3Igbm93ICovCisJCWNhbV9yeF9jdHJsIHw9CisJCQkweDFmIDw8IE9NQVA0X0NBTUVSQVJYX0NTSTIxX0xBTkVFTkFCTEVfU0hJRlQ7CisJCS8qIEVuYWJsZSBDVFJMQ0xLICovCisJCWNhbV9yeF9jdHJsIHw9IE9NQVA0X0NBTUVSQVJYX0NTSTIxX0NUUkxDTEtFTl9NQVNLOworCX0KKworCWlmIChzdWJkZXZzLT5pbnRlcmZhY2UgPT0gSVNTX0lOVEVSRkFDRV9DU0kyQl9QSFkyKSB7CisJCWNhbV9yeF9jdHJsICY9IH4oT01BUDRfQ0FNRVJBUlhfQ1NJMjJfTEFORUVOQUJMRV9NQVNLIHwKKwkJCQlPTUFQNF9DQU1FUkFSWF9DU0kyMl9DQU1NT0RFX01BU0spOworCQkvKiBOT1RFOiBMZWF2ZSBDU0lQSFkyIGNvbmZpZyB0byAweDA6IEQtUEhZIG1vZGUgKi8KKwkJLyogRW5hYmxlIGFsbCBsYW5lcyBmb3Igbm93ICovCisJCWNhbV9yeF9jdHJsIHw9CisJCQkweDMgPDwgT01BUDRfQ0FNRVJBUlhfQ1NJMjJfTEFORUVOQUJMRV9TSElGVDsKKwkJLyogRW5hYmxlIENUUkxDTEsgKi8KKwkJY2FtX3J4X2N0cmwgfD0gT01BUDRfQ0FNRVJBUlhfQ1NJMjJfQ1RSTENMS0VOX01BU0s7CisJfQorCisJb21hcDRfY3RybF9wYWRfd3JpdGVsKGNhbV9yeF9jdHJsLAorCQkgT01BUDRfQ1RSTF9NT0RVTEVfUEFEX0NPUkVfQ09OVFJPTF9DQU1FUkFfUlgpOworCisJLyogUmVzZXQgdXNlZCBsYW5lIGNvdW50ICovCisJY3NpMi0+cGh5LT51c2VkX2RhdGFfbGFuZXMgPSAwOworCisJLyogQ2xvY2sgYW5kIGRhdGEgbGFuZXMgdmVyaWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGNzaTItPnBoeS0+bWF4X2RhdGFfbGFuZXM7IGkrKykgeworCQlpZiAobGFuZXMtPmRhdGFbaV0ucG9zID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAobGFuZXMtPmRhdGFbaV0ucG9sID4gMSB8fAorCQkgICAgbGFuZXMtPmRhdGFbaV0ucG9zID4gKGNzaTItPnBoeS0+bWF4X2RhdGFfbGFuZXMgKyAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh1c2VkX2xhbmVzICYgKDEgPDwgbGFuZXMtPmRhdGFbaV0ucG9zKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXVzZWRfbGFuZXMgfD0gMSA8PCBsYW5lcy0+ZGF0YVtpXS5wb3M7CisJCWNzaTItPnBoeS0+dXNlZF9kYXRhX2xhbmVzKys7CisJfQorCisJaWYgKGxhbmVzLT5jbGsucG9sID4gMSB8fAorCSAgICBsYW5lcy0+Y2xrLnBvcyA+IChjc2kyLT5waHktPm1heF9kYXRhX2xhbmVzICsgMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxhbmVzLT5jbGsucG9zID09IDAgfHwgdXNlZF9sYW5lcyAmICgxIDw8IGxhbmVzLT5jbGsucG9zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljc2kyX2RkcmNsa19raHogPSBwaXBlLT5leHRlcm5hbF9yYXRlIC8gMTAwMAorCQkvICgyICogY3NpMi0+cGh5LT51c2VkX2RhdGFfbGFuZXMpCisJCSogcGlwZS0+ZXh0ZXJuYWxfYnBwOworCisJLyoKKwkgKiBUSFNfVEVSTTogUHJvZ3JhbW1lZCB2YWx1ZSA9IGNlaWwoMTIuNSBucy9ERFJDbGsgcGVyaW9kKSAtIDEuCisJICogVEhTX1NFVFRMRTogUHJvZ3JhbW1lZCB2YWx1ZSA9IGNlaWwoOTAgbnMvRERSQ2xrIHBlcmlvZCkgKyAzLgorCSAqLworCWNzaTJwaHkudGhzX3Rlcm0gPSBESVZfUk9VTkRfVVAoMjUgKiBjc2kyX2RkcmNsa19raHosIDIwMDAwMDApIC0gMTsKKwljc2kycGh5LnRoc19zZXR0bGUgPSBESVZfUk9VTkRfVVAoOTAgKiBjc2kyX2RkcmNsa19raHosIDEwMDAwMDApICsgMzsKKwljc2kycGh5LnRjbGtfdGVybSA9IFRDTEtfVEVSTTsKKwljc2kycGh5LnRjbGtfbWlzcyA9IFRDTEtfTUlTUzsKKwljc2kycGh5LnRjbGtfc2V0dGxlID0gVENMS19TRVRUTEU7CisKKwltdXRleF9sb2NrKCZjc2kyLT5waHktPm11dGV4KTsKKwljc2kyLT5waHktPmRwaHkgPSBjc2kycGh5OworCWNzaTItPnBoeS0+bGFuZXMgPSAqbGFuZXM7CisJbXV0ZXhfdW5sb2NrKCZjc2kyLT5waHktPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgb21hcDRpc3NfY3NpcGh5X2FjcXVpcmUoc3RydWN0IGlzc19jc2lwaHkgKnBoeSkKK3sKKwlpbnQgcnZhbDsKKworCW11dGV4X2xvY2soJnBoeS0+bXV0ZXgpOworCisJcnZhbCA9IG9tYXA0aXNzX2NzaTJfcmVzZXQocGh5LT5jc2kyKTsKKwlpZiAocnZhbCkKKwkJZ290byBkb25lOworCisJY3NpcGh5X2RwaHlfY29uZmlnKHBoeSk7CisJY3NpcGh5X2xhbmVzX2NvbmZpZyhwaHkpOworCisJcnZhbCA9IGNzaXBoeV9zZXRfcG93ZXIocGh5LCBDU0kyX0NPTVBMRVhJT19DRkdfUFdEX0NNRF9PTik7CisJaWYgKHJ2YWwpCisJCWdvdG8gZG9uZTsKKworCXBoeS0+cGh5X2luX3VzZSA9IDE7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZwaHktPm11dGV4KTsKKwlyZXR1cm4gcnZhbDsKK30KKwordm9pZCBvbWFwNGlzc19jc2lwaHlfcmVsZWFzZShzdHJ1Y3QgaXNzX2NzaXBoeSAqcGh5KQoreworCW11dGV4X2xvY2soJnBoeS0+bXV0ZXgpOworCWlmIChwaHktPnBoeV9pbl91c2UpIHsKKwkJY3NpcGh5X3NldF9wb3dlcihwaHksIENTSTJfQ09NUExFWElPX0NGR19QV0RfQ01EX09GRik7CisJCXBoeS0+cGh5X2luX3VzZSA9IDA7CisJfQorCW11dGV4X3VubG9jaygmcGh5LT5tdXRleCk7Cit9CisKKy8qCisgKiBvbWFwNGlzc19jc2lwaHlfaW5pdCAtIEluaXRpYWxpemUgdGhlIENTSSBQSFkgZnJvbnRlbmRzCisgKi8KK2ludCBvbWFwNGlzc19jc2lwaHlfaW5pdChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCXN0cnVjdCBpc3NfY3NpcGh5ICpwaHkxID0gJmlzcy0+Y3NpcGh5MTsKKwlzdHJ1Y3QgaXNzX2NzaXBoeSAqcGh5MiA9ICZpc3MtPmNzaXBoeTI7CisKKwlwaHkxLT5pc3MgPSBpc3M7CisJcGh5MS0+Y3NpMiA9ICZpc3MtPmNzaTJhOworCXBoeTEtPm1heF9kYXRhX2xhbmVzID0gSVNTX0NTSVBIWTFfTlVNX0RBVEFfTEFORVM7CisJcGh5MS0+dXNlZF9kYXRhX2xhbmVzID0gMDsKKwlwaHkxLT5jZmdfcmVncyA9IE9NQVA0X0lTU19NRU1fQ1NJMl9BX1JFR1MxOworCXBoeTEtPnBoeV9yZWdzID0gT01BUDRfSVNTX01FTV9DQU1FUkFSWF9DT1JFMTsKKwltdXRleF9pbml0KCZwaHkxLT5tdXRleCk7CisKKwlwaHkyLT5pc3MgPSBpc3M7CisJcGh5Mi0+Y3NpMiA9ICZpc3MtPmNzaTJiOworCXBoeTItPm1heF9kYXRhX2xhbmVzID0gSVNTX0NTSVBIWTJfTlVNX0RBVEFfTEFORVM7CisJcGh5Mi0+dXNlZF9kYXRhX2xhbmVzID0gMDsKKwlwaHkyLT5jZmdfcmVncyA9IE9NQVA0X0lTU19NRU1fQ1NJMl9CX1JFR1MxOworCXBoeTItPnBoeV9yZWdzID0gT01BUDRfSVNTX01FTV9DQU1FUkFSWF9DT1JFMjsKKwltdXRleF9pbml0KCZwaHkyLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfY3NpcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaXBoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2E0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2NzaXBoeS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIgLSBDU0kgUEhZIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBPTUFQNF9JU1NfQ1NJX1BIWV9ICisjZGVmaW5lIE9NQVA0X0lTU19DU0lfUEhZX0gKKworI2luY2x1ZGUgPG1lZGlhL29tYXA0aXNzLmg+CisKK3N0cnVjdCBpc3NfY3NpMl9kZXZpY2U7CisKK3N0cnVjdCBpc3NfY3NpcGh5X2RwaHlfY2ZnIHsKKwl1OCB0aHNfdGVybTsKKwl1OCB0aHNfc2V0dGxlOworCXU4IHRjbGtfdGVybTsKKwl1bnNpZ25lZCB0Y2xrX21pc3M6MTsKKwl1OCB0Y2xrX3NldHRsZTsKK307CisKK3N0cnVjdCBpc3NfY3NpcGh5IHsKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzOworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogc2VyaWFsaXplIGNzaXBoeSBjb25maWd1cmF0aW9uICovCisJdTggcGh5X2luX3VzZTsKKwlzdHJ1Y3QgaXNzX2NzaTJfZGV2aWNlICpjc2kyOworCisJLyogbWVtb3J5IHJlc291cmNlcywgYXMgZGVmaW5lZCBpbiBlbnVtIGlzc19tZW1fcmVzb3VyY2VzICovCisJdW5zaWduZWQgaW50IGNmZ19yZWdzOworCXVuc2lnbmVkIGludCBwaHlfcmVnczsKKworCXU4IG1heF9kYXRhX2xhbmVzOwkvKiBudW1iZXIgb2YgQ1NJMiBEYXRhIExhbmVzIHN1cHBvcnRlZCAqLworCXU4IHVzZWRfZGF0YV9sYW5lczsJLyogbnVtYmVyIG9mIENTSTIgRGF0YSBMYW5lcyB1c2VkICovCisJc3RydWN0IGlzc19jc2lwaHlfbGFuZXNfY2ZnIGxhbmVzOworCXN0cnVjdCBpc3NfY3NpcGh5X2RwaHlfY2ZnIGRwaHk7Cit9OworCitpbnQgb21hcDRpc3NfY3NpcGh5X2NvbmZpZyhzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2ICpjc2kyX3N1YmRldik7CitpbnQgb21hcDRpc3NfY3NpcGh5X2FjcXVpcmUoc3RydWN0IGlzc19jc2lwaHkgKnBoeSk7Cit2b2lkIG9tYXA0aXNzX2NzaXBoeV9yZWxlYXNlKHN0cnVjdCBpc3NfY3NpcGh5ICpwaHkpOworaW50IG9tYXA0aXNzX2NzaXBoeV9pbml0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOworCisjZW5kaWYJLyogT01BUDRfSVNTX0NTSV9QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19pcGlwZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19pcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWFmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIgLSBJU1AgSVBJUEUgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlICJpc3MuaCIKKyNpbmNsdWRlICJpc3NfcmVncy5oIgorI2luY2x1ZGUgImlzc19pcGlwZS5oIgorCitzdGF0aWMgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqCitfX2lwaXBlX2dldF9mb3JtYXQoc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkgIHVuc2lnbmVkIGludCBwYWQsIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCk7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaXBpcGVfZm10c1tdID0geworCVY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU1JHR0IxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU0dCUkcxMF8xWDEwLAorfTsKKworLyoKKyAqIGlwaXBlX3ByaW50X3N0YXR1cyAtIFByaW50IGN1cnJlbnQgSVBJUEUgTW9kdWxlIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIEBpcGlwZTogUG9pbnRlciB0byBJU1MgSVNQIElQSVBFIGRldmljZS4KKyAqCisgKiBBbHNvIHByaW50cyBvdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIElQSVBFIG1vZHVsZS4KKyAqLworI2RlZmluZSBJUElQRV9QUklOVF9SRUdJU1RFUihpc3MsIG5hbWUpXAorCWRldl9kYmcoaXNzLT5kZXYsICIjIyNJUElQRSAiICNuYW1lICI9MHglMDh4XG4iLCBcCisJCWlzc19yZWdfcmVhZChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lQSVBFLCBJUElQRV8jI25hbWUpKQorCitzdGF0aWMgdm9pZCBpcGlwZV9wcmludF9zdGF0dXMoc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKGlwaXBlKTsKKworCWRldl9kYmcoaXNzLT5kZXYsICItLS0tLS0tLS0tLS0tSVBJUEUgUmVnaXN0ZXIgZHVtcC0tLS0tLS0tLS0tLS1cbiIpOworCisJSVBJUEVfUFJJTlRfUkVHSVNURVIoaXNzLCBTUkNfRU4pOworCUlQSVBFX1BSSU5UX1JFR0lTVEVSKGlzcywgU1JDX01PREUpOworCUlQSVBFX1BSSU5UX1JFR0lTVEVSKGlzcywgU1JDX0ZNVCk7CisJSVBJUEVfUFJJTlRfUkVHSVNURVIoaXNzLCBTUkNfQ09MKTsKKwlJUElQRV9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19WUFMpOworCUlQSVBFX1BSSU5UX1JFR0lTVEVSKGlzcywgU1JDX1ZTWik7CisJSVBJUEVfUFJJTlRfUkVHSVNURVIoaXNzLCBTUkNfSFBTKTsKKwlJUElQRV9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19IU1opOworCUlQSVBFX1BSSU5UX1JFR0lTVEVSKGlzcywgR0NLX01NUik7CisJSVBJUEVfUFJJTlRfUkVHSVNURVIoaXNzLCBZVVZfUEhTKTsKKworCWRldl9kYmcoaXNzLT5kZXYsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CisKKy8qCisgKiBpcGlwZV9lbmFibGUgLSBFbmFibGUvRGlzYWJsZSBJUElQRS4KKyAqIEBlbmFibGU6IGVuYWJsZSBmbGFnCisgKgorICovCitzdGF0aWMgdm9pZCBpcGlwZV9lbmFibGUoc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlLCB1OCBlbmFibGUpCit7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UoaXBpcGUpOworCisJaXNzX3JlZ191cGRhdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfU1JDX0VOLAorCQkgICAgICAgSVBJUEVfU1JDX0VOX0VOLCBlbmFibGUgPyBJUElQRV9TUkNfRU5fRU4gOiAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvcm1hdC0gYW5kIHBpcGVsaW5lLXJlbGF0ZWQgY29uZmlndXJhdGlvbiBoZWxwZXJzCisgKi8KKworc3RhdGljIHZvaWQgaXBpcGVfY29uZmlndXJlKHN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlICppcGlwZSkKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShpcGlwZSk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJLyogSVBJUEVfUEFEX1NJTksgKi8KKwlmb3JtYXQgPSAmaXBpcGUtPmZvcm1hdHNbSVBJUEVfUEFEX1NJTktdOworCisJLyogTk9URTogQ3VycmVudGx5IGp1c3Qgc3VwcG9ydGluZyBwaXBlbGluZSBJTjogUkdCLCBPVVQ6IFlVVjQyMiAqLworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfU1JDX0ZNVCwKKwkJICAgICAgSVBJUEVfU1JDX0ZNVF9SQVcyWVVWKTsKKworCS8qIEVuYWJsZSBZVVY0NDQgLT4gWVVWNDIyIGNvbnZlcnNpb24gKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVBJUEUsIElQSVBFX1lVVl9QSFMsCisJCSAgICAgIElQSVBFX1lVVl9QSFNfTFBGKTsKKworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfU1JDX1ZQUywgMCk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lQSVBFLCBJUElQRV9TUkNfSFBTLCAwKTsKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVBJUEUsIElQSVBFX1NSQ19WU1osCisJCSAgICAgIChmb3JtYXQtPmhlaWdodCAtIDIpICYgSVBJUEVfU1JDX1ZTWl9NQVNLKTsKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVBJUEUsIElQSVBFX1NSQ19IU1osCisJCSAgICAgIChmb3JtYXQtPndpZHRoIC0gMSkgJiBJUElQRV9TUkNfSFNaX01BU0spOworCisJLyogSWdub3JlIGlwaXBlaWZfd3J0IHNpZ25hbCwgYW5kIG9wZXJhdGUgb24tdGhlLWZseS4gICovCisJaXNzX3JlZ19jbHIoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfU1JDX01PREUsCisJCSAgICBJUElQRV9TUkNfTU9ERV9XUlQgfCBJUElQRV9TUkNfTU9ERV9PU1QpOworCisJLyogSEFDSzogVmFsdWVzIHR1bmVkIGZvciBEdWNhdGkgU1cgKE9WKSAqLworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfU1JDX0NPTCwKKwkJICAgICAgSVBJUEVfU1JDX0NPTF9FRV9CIHwgSVBJUEVfU1JDX0NPTF9FT19HQiB8CisJCSAgICAgIElQSVBFX1NSQ19DT0xfT0VfR1IgfCBJUElQRV9TUkNfQ09MX09PX1IpOworCisJLyogSVBJUEVfUEFEX1NPVVJDRV9WUCAqLworCWZvcm1hdCA9ICZpcGlwZS0+Zm9ybWF0c1tJUElQRV9QQURfU09VUkNFX1ZQXTsKKwkvKiBEbyBub3RoaW5nPyAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucworICovCisKKy8qCisgKiBpcGlwZV9zZXRfc3RyZWFtIC0gRW5hYmxlL0Rpc2FibGUgc3RyZWFtaW5nIG9uIHRoZSBJUElQRSBtb2R1bGUKKyAqIEBzZDogSVNQIElQSVBFIFY0TDIgc3ViZGV2aWNlCisgKiBAZW5hYmxlOiBFbmFibGUvZGlzYWJsZSBzdHJlYW0KKyAqLworc3RhdGljIGludCBpcGlwZV9zZXRfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UoaXBpcGUpOworCWludCByZXQgPSAwOworCisJaWYgKGlwaXBlLT5zdGF0ZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpIHsKKwkJaWYgKGVuYWJsZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCisJCQlyZXR1cm4gMDsKKworCQlvbWFwNGlzc19pc3Bfc3ViY2xrX2VuYWJsZShpc3MsIE9NQVA0X0lTU19JU1BfU1VCQ0xLX0lQSVBFKTsKKworCQkvKiBFbmFibGUgY2xrX2FybV9nMCAqLworCQlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVBJUEUsIElQSVBFX0dDS19NTVIsCisJCQkgICAgICBJUElQRV9HQ0tfTU1SX1JFRyk7CisKKwkJLyogRW5hYmxlIGNsa19waXhfZ1szOjBdICovCisJCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRSwgSVBJUEVfR0NLX1BJWCwKKwkJCSAgICAgIElQSVBFX0dDS19QSVhfRzMgfCBJUElQRV9HQ0tfUElYX0cyIHwKKwkJCSAgICAgIElQSVBFX0dDS19QSVhfRzEgfCBJUElQRV9HQ0tfUElYX0cwKTsKKwl9CisKKwlzd2l0Y2ggKGVuYWJsZSkgeworCWNhc2UgSVNTX1BJUEVMSU5FX1NUUkVBTV9DT05USU5VT1VTOgorCisJCWlwaXBlX2NvbmZpZ3VyZShpcGlwZSk7CisJCWlwaXBlX3ByaW50X3N0YXR1cyhpcGlwZSk7CisKKwkJYXRvbWljX3NldCgmaXBpcGUtPnN0b3BwaW5nLCAwKTsKKwkJaXBpcGVfZW5hYmxlKGlwaXBlLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIElTU19QSVBFTElORV9TVFJFQU1fU1RPUFBFRDoKKwkJaWYgKGlwaXBlLT5zdGF0ZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG9tYXA0aXNzX21vZHVsZV9zeW5jX2lkbGUoJnNkLT5lbnRpdHksICZpcGlwZS0+d2FpdCwKKwkJCQkJICAgICAgJmlwaXBlLT5zdG9wcGluZykpCisJCQlyZXQgPSAtRVRJTUVET1VUOworCisJCWlwaXBlX2VuYWJsZShpcGlwZSwgMCk7CisJCW9tYXA0aXNzX2lzcF9zdWJjbGtfZGlzYWJsZShpc3MsIE9NQVA0X0lTU19JU1BfU1VCQ0xLX0lQSVBFKTsKKwkJYnJlYWs7CisJfQorCisJaXBpcGUtPnN0YXRlID0gZW5hYmxlOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19faXBpcGVfZ2V0X2Zvcm1hdChzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSAqaXBpcGUsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCSAgdW5zaWduZWQgaW50IHBhZCwgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCWlmICh3aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKQorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIHBhZCk7CisJZWxzZQorCQlyZXR1cm4gJmlwaXBlLT5mb3JtYXRzW3BhZF07Cit9CisKKy8qCisgKiBpcGlwZV90cnlfZm9ybWF0IC0gVHJ5IHZpZGVvIGZvcm1hdCBvbiBhIHBhZAorICogQGlwaXBlOiBJU1MgSVBJUEUgZGV2aWNlCisgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQHBhZDogUGFkIG51bWJlcgorICogQGZtdDogRm9ybWF0CisgKi8KK3N0YXRpYyB2b2lkCitpcGlwZV90cnlfZm9ybWF0KHN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlICppcGlwZSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJdW5zaWduZWQgaW50IHBhZCwgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10LAorCQllbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXVuc2lnbmVkIGludCB3aWR0aCA9IGZtdC0+d2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodCA9IGZtdC0+aGVpZ2h0OworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChwYWQpIHsKKwljYXNlIElQSVBFX1BBRF9TSU5LOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcGlwZV9mbXRzKTsgaSsrKSB7CisJCQlpZiAoZm10LT5jb2RlID09IGlwaXBlX2ZtdHNbaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBJZiBub3QgZm91bmQsIHVzZSBTR1JCRzEwIGFzIGRlZmF1bHQgKi8KKwkJaWYgKGkgPj0gQVJSQVlfU0laRShpcGlwZV9mbXRzKSkKKwkJCWZtdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCisJCS8qIENsYW1wIHRoZSBpbnB1dCBzaXplLiAqLworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAxLCA4MTkyKTsKKwkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAxLCA4MTkyKTsKKwkJZm10LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisJCWJyZWFrOworCisJY2FzZSBJUElQRV9QQURfU09VUkNFX1ZQOgorCQlmb3JtYXQgPSBfX2lwaXBlX2dldF9mb3JtYXQoaXBpcGUsIGZoLCBJUElQRV9QQURfU0lOSywgd2hpY2gpOworCQltZW1jcHkoZm10LCBmb3JtYXQsIHNpemVvZigqZm10KSk7CisKKwkJZm10LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2OworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAzMiwgZm10LT53aWR0aCk7CisJCWZtdC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGhlaWdodCwgMzIsIGZtdC0+aGVpZ2h0KTsKKwkJZm10LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CisJCWJyZWFrOworCX0KKworCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cit9CisKKy8qCisgKiBpcGlwZV9lbnVtX21idXNfY29kZSAtIEhhbmRsZSBwaXhlbCBmb3JtYXQgZW51bWVyYXRpb24KKyAqIEBzZCAgICAgOiBwb2ludGVyIHRvIHY0bDIgc3ViZGV2IHN0cnVjdHVyZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBjb2RlICAgOiBwb2ludGVyIHRvIHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtIHN0cnVjdHVyZQorICogcmV0dXJuIC1FSU5WQUwgb3IgemVybyBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlzd2l0Y2ggKGNvZGUtPnBhZCkgeworCWNhc2UgSVBJUEVfUEFEX1NJTks6CisJCWlmIChjb2RlLT5pbmRleCA+PSBBUlJBWV9TSVpFKGlwaXBlX2ZtdHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY29kZS0+Y29kZSA9IGlwaXBlX2ZtdHNbY29kZS0+aW5kZXhdOworCQlicmVhazsKKworCWNhc2UgSVBJUEVfUEFEX1NPVVJDRV9WUDoKKwkJLyogRklYTUU6IEZvcmNlZCBmb3JtYXQgY29udmVyc2lvbiBpbnNpZGUgSVBJUEUgPyAqLworCQlpZiAoY29kZS0+aW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvZGUtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBpcGVfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBmb3JtYXQ7CisKKwlpZiAoZnNlLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcm1hdC5jb2RlID0gZnNlLT5jb2RlOworCWZvcm1hdC53aWR0aCA9IDE7CisJZm9ybWF0LmhlaWdodCA9IDE7CisJaXBpcGVfdHJ5X2Zvcm1hdChpcGlwZSwgZmgsIGZzZS0+cGFkLCAmZm9ybWF0LCBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwlmc2UtPm1pbl93aWR0aCA9IGZvcm1hdC53aWR0aDsKKwlmc2UtPm1pbl9oZWlnaHQgPSBmb3JtYXQuaGVpZ2h0OworCisJaWYgKGZvcm1hdC5jb2RlICE9IGZzZS0+Y29kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JtYXQuY29kZSA9IGZzZS0+Y29kZTsKKwlmb3JtYXQud2lkdGggPSAtMTsKKwlmb3JtYXQuaGVpZ2h0ID0gLTE7CisJaXBpcGVfdHJ5X2Zvcm1hdChpcGlwZSwgZmgsIGZzZS0+cGFkLCAmZm9ybWF0LCBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC53aWR0aDsKKwlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQuaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpcGlwZV9nZXRfZm9ybWF0IC0gUmV0cmlldmUgdGhlIHZpZGVvIGZvcm1hdCBvbiBhIHBhZAorICogQHNkIDogSVNQIElQSVBFIFY0TDIgc3ViZGV2aWNlCisgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQGZtdDogRm9ybWF0CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIGlmIHRoZSBwYWQgaXMgaW52YWxpZCBvciBkb2Vzbid0IGNvcnJlc3BvbmQKKyAqIHRvIHRoZSBmb3JtYXQgdHlwZS4KKyAqLworc3RhdGljIGludCBpcGlwZV9nZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJZm9ybWF0ID0gX19pcGlwZV9nZXRfZm9ybWF0KGlwaXBlLCBmaCwgZm10LT5wYWQsIGZtdC0+d2hpY2gpOworCWlmIChmb3JtYXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpcGlwZV9zZXRfZm9ybWF0IC0gU2V0IHRoZSB2aWRlbyBmb3JtYXQgb24gYSBwYWQKKyAqIEBzZCA6IElTUCBJUElQRSBWNEwyIHN1YmRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IEZvcm1hdAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgcGFkIGlzIGludmFsaWQgb3IgZG9lc24ndCBjb3JyZXNwb25kCisgKiB0byB0aGUgZm9ybWF0IHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlICppcGlwZSA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9faXBpcGVfZ2V0X2Zvcm1hdChpcGlwZSwgZmgsIGZtdC0+cGFkLCBmbXQtPndoaWNoKTsKKwlpZiAoZm9ybWF0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaXBpcGVfdHJ5X2Zvcm1hdChpcGlwZSwgZmgsIGZtdC0+cGFkLCAmZm10LT5mb3JtYXQsIGZtdC0+d2hpY2gpOworCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKKworCS8qIFByb3BhZ2F0ZSB0aGUgZm9ybWF0IGZyb20gc2luayB0byBzb3VyY2UgKi8KKwlpZiAoZm10LT5wYWQgPT0gSVBJUEVfUEFEX1NJTkspIHsKKwkJZm9ybWF0ID0gX19pcGlwZV9nZXRfZm9ybWF0KGlwaXBlLCBmaCwgSVBJUEVfUEFEX1NPVVJDRV9WUCwKKwkJCQkJICAgZm10LT53aGljaCk7CisJCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKKwkJaXBpcGVfdHJ5X2Zvcm1hdChpcGlwZSwgZmgsIElQSVBFX1BBRF9TT1VSQ0VfVlAsIGZvcm1hdCwKKwkJCQlmbXQtPndoaWNoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGlwZV9saW5rX3ZhbGlkYXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCBtZWRpYV9saW5rICpsaW5rLAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzb3VyY2VfZm10LAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzaW5rX2ZtdCkKK3sKKwkvKiBDaGVjayBpZiB0aGUgdHdvIGVuZHMgbWF0Y2ggKi8KKwlpZiAoc291cmNlX2ZtdC0+Zm9ybWF0LndpZHRoICE9IHNpbmtfZm10LT5mb3JtYXQud2lkdGggfHwKKwkgICAgc291cmNlX2ZtdC0+Zm9ybWF0LmhlaWdodCAhPSBzaW5rX2ZtdC0+Zm9ybWF0LmhlaWdodCkKKwkJcmV0dXJuIC1FUElQRTsKKworCWlmIChzb3VyY2VfZm10LT5mb3JtYXQuY29kZSAhPSBzaW5rX2ZtdC0+Zm9ybWF0LmNvZGUpCisJCXJldHVybiAtRVBJUEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlwaXBlX2luaXRfZm9ybWF0cyAtIEluaXRpYWxpemUgZm9ybWF0cyBvbiBhbGwgcGFkcworICogQHNkOiBJU1AgSVBJUEUgVjRMMiBzdWJkZXZpY2UKKyAqIEBmaDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqCisgKiBJbml0aWFsaXplIGFsbCBwYWQgZm9ybWF0cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBJZiBmaCBpcyBub3QgTlVMTCwgdHJ5CisgKiBmb3JtYXRzIGFyZSBpbml0aWFsaXplZCBvbiB0aGUgZmlsZSBoYW5kbGUuIE90aGVyd2lzZSBhY3RpdmUgZm9ybWF0cyBhcmUKKyAqIGluaXRpYWxpemVkIG9uIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVfaW5pdF9mb3JtYXRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCBmb3JtYXQ7CisKKwltZW1zZXQoJmZvcm1hdCwgMCwgc2l6ZW9mKGZvcm1hdCkpOworCWZvcm1hdC5wYWQgPSBJUElQRV9QQURfU0lOSzsKKwlmb3JtYXQud2hpY2ggPSBmaCA/IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkgOiBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOworCWZvcm1hdC5mb3JtYXQuY29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCWZvcm1hdC5mb3JtYXQud2lkdGggPSA0MDk2OworCWZvcm1hdC5mb3JtYXQuaGVpZ2h0ID0gNDA5NjsKKwlpcGlwZV9zZXRfZm9ybWF0KHNkLCBmaCwgJmZvcm1hdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVjRMMiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgaXBpcGVfdjRsMl92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtID0gaXBpcGVfc2V0X3N0cmVhbSwKK307CisKKy8qIFY0TDIgc3ViZGV2IHBhZCBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgaXBpcGVfdjRsMl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IGlwaXBlX2VudW1fbWJ1c19jb2RlLAorCS5lbnVtX2ZyYW1lX3NpemUgPSBpcGlwZV9lbnVtX2ZyYW1lX3NpemUsCisJLmdldF9mbXQgPSBpcGlwZV9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gaXBpcGVfc2V0X2Zvcm1hdCwKKwkubGlua192YWxpZGF0ZSA9IGlwaXBlX2xpbmtfdmFsaWRhdGUsCit9OworCisvKiBWNEwyIHN1YmRldiBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBpcGlwZV92NGwyX29wcyA9IHsKKwkudmlkZW8gPSAmaXBpcGVfdjRsMl92aWRlb19vcHMsCisJLnBhZCA9ICZpcGlwZV92NGwyX3BhZF9vcHMsCit9OworCisvKiBWNEwyIHN1YmRldiBpbnRlcm5hbCBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBpcGlwZV92NGwyX2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IGlwaXBlX2luaXRfZm9ybWF0cywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNZWRpYSBlbnRpdHkgb3BlcmF0aW9ucworICovCisKKy8qCisgKiBpcGlwZV9saW5rX3NldHVwIC0gU2V0dXAgSVBJUEUgY29ubmVjdGlvbnMKKyAqIEBlbnRpdHk6IElQSVBFIG1lZGlhIGVudGl0eQorICogQGxvY2FsOiBQYWQgYXQgdGhlIGxvY2FsIGVuZCBvZiB0aGUgbGluaworICogQHJlbW90ZTogUGFkIGF0IHRoZSByZW1vdGUgZW5kIG9mIHRoZSBsaW5rCisgKiBAZmxhZ3M6IExpbmsgZmxhZ3MKKyAqCisgKiByZXR1cm4gLUVJTlZBTCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpcGlwZV9saW5rX3NldHVwKHN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBtZWRpYV9wYWQgKmxvY2FsLAorCQkJICAgY29uc3Qgc3RydWN0IG1lZGlhX3BhZCAqcmVtb3RlLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihlbnRpdHkpOworCXN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlICppcGlwZSA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKGlwaXBlKTsKKworCXN3aXRjaCAobG9jYWwtPmluZGV4IHwgbWVkaWFfZW50aXR5X3R5cGUocmVtb3RlLT5lbnRpdHkpKSB7CisJY2FzZSBJUElQRV9QQURfU0lOSyB8IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOgorCQkvKiBSZWFkIGZyb20gSVBJUEVJRi4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJCWlwaXBlLT5pbnB1dCA9IElQSVBFX0lOUFVUX05PTkU7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpcGlwZS0+aW5wdXQgIT0gSVBJUEVfSU5QVVRfTk9ORSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKHJlbW90ZS0+ZW50aXR5ID09ICZpc3MtPmlwaXBlaWYuc3ViZGV2LmVudGl0eSkKKwkJCWlwaXBlLT5pbnB1dCA9IElQSVBFX0lOUFVUX0lQSVBFSUY7CisKKwkJYnJlYWs7CisKKwljYXNlIElQSVBFX1BBRF9TT1VSQ0VfVlAgfCBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjoKKwkJLyogU2VuZCB0byBSRVNJWkVSICovCisJCWlmIChmbGFncyAmIE1FRElBX0xOS19GTF9FTkFCTEVEKSB7CisJCQlpZiAoaXBpcGUtPm91dHB1dCAmIH5JUElQRV9PVVRQVVRfVlApCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWlwaXBlLT5vdXRwdXQgfD0gSVBJUEVfT1VUUFVUX1ZQOworCQl9IGVsc2UgeworCQkJaXBpcGUtPm91dHB1dCAmPSB+SVBJUEVfT1VUUFVUX1ZQOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIG1lZGlhIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVkaWFfZW50aXR5X29wZXJhdGlvbnMgaXBpcGVfbWVkaWFfb3BzID0geworCS5saW5rX3NldHVwID0gaXBpcGVfbGlua19zZXR1cCwKKwkubGlua192YWxpZGF0ZSA9IHY0bDJfc3ViZGV2X2xpbmtfdmFsaWRhdGUsCit9OworCisvKgorICogaXBpcGVfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgVjRMMiBzdWJkZXYgYW5kIG1lZGlhIGVudGl0eQorICogQGlwaXBlOiBJU1MgSVNQIElQSVBFIG1vZHVsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGlwaXBlX2luaXRfZW50aXRpZXMoc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmaXBpcGUtPnN1YmRldjsKKwlzdHJ1Y3QgbWVkaWFfcGFkICpwYWRzID0gaXBpcGUtPnBhZHM7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqbWUgPSAmc2QtPmVudGl0eTsKKwlpbnQgcmV0OworCisJaXBpcGUtPmlucHV0ID0gSVBJUEVfSU5QVVRfTk9ORTsKKworCXY0bDJfc3ViZGV2X2luaXQoc2QsICZpcGlwZV92NGwyX29wcyk7CisJc2QtPmludGVybmFsX29wcyA9ICZpcGlwZV92NGwyX2ludGVybmFsX29wczsKKwlzdHJsY3B5KHNkLT5uYW1lLCAiT01BUDQgSVNTIElTUCBJUElQRSIsIHNpemVvZihzZC0+bmFtZSkpOworCXNkLT5ncnBfaWQgPSAxIDw8IDE2OwkvKiBncm91cCBJRCBmb3IgaXNzIHN1YmRldnMgKi8KKwl2NGwyX3NldF9zdWJkZXZkYXRhKHNkLCBpcGlwZSk7CisJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCisJcGFkc1tJUElQRV9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlwYWRzW0lQSVBFX1BBRF9TT1VSQ0VfVlBdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKworCW1lLT5vcHMgPSAmaXBpcGVfbWVkaWFfb3BzOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KG1lLCBJUElQRV9QQURTX05VTSwgcGFkcywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpcGlwZV9pbml0X2Zvcm1hdHMoc2QsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcDRpc3NfaXBpcGVfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSAqaXBpcGUpCit7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmlwaXBlLT5zdWJkZXYuZW50aXR5KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZpcGlwZS0+c3ViZGV2KTsKK30KKworaW50IG9tYXA0aXNzX2lwaXBlX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3NfaXBpcGVfZGV2aWNlICppcGlwZSwKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpCit7CisJaW50IHJldDsKKworCS8qIFJlZ2lzdGVyIHRoZSBzdWJkZXYgYW5kIHZpZGVvIG5vZGUuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZpcGlwZS0+c3ViZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlvbWFwNGlzc19pcGlwZV91bnJlZ2lzdGVyX2VudGl0aWVzKGlwaXBlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNQIElQSVBFIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKworLyoKKyAqIG9tYXA0aXNzX2lwaXBlX2luaXQgLSBJUElQRSBtb2R1bGUgaW5pdGlhbGl6YXRpb24uCisgKiBAaXNzOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDQgSVNTLgorICoKKyAqIFRPRE86IEdldCB0aGUgaW5pdGlhbGlzYXRpb24gdmFsdWVzIGZyb20gcGxhdGZvcm0gZGF0YS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBvbWFwNGlzc19pcGlwZV9pbml0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJc3RydWN0IGlzc19pcGlwZV9kZXZpY2UgKmlwaXBlID0gJmlzcy0+aXBpcGU7CisKKwlpcGlwZS0+c3RhdGUgPSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXBpcGUtPndhaXQpOworCisJcmV0dXJuIGlwaXBlX2luaXRfZW50aXRpZXMoaXBpcGUpOworfQorCisvKgorICogb21hcDRpc3NfaXBpcGVfY2xlYW51cCAtIElQSVBFIG1vZHVsZSBjbGVhbnVwLgorICogQGlzczogRGV2aWNlIHBvaW50ZXIgc3BlY2lmaWMgdG8gdGhlIE9NQVA0IElTUy4KKyAqLwordm9pZCBvbWFwNGlzc19pcGlwZV9jbGVhbnVwKHN0cnVjdCBpc3NfZGV2aWNlICppc3MpCit7CisJLyogRklYTUU6IGFyZSB5b3Ugc3VyZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8/ICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZDkwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfaXBpcGUuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogVEkgT01BUDQgSVNTIFY0TDIgRHJpdmVyIC0gSVNQIElQSVBFIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBPTUFQNF9JU1NfSVBJUEVfSAorI2RlZmluZSBPTUFQNF9JU1NfSVBJUEVfSAorCisjaW5jbHVkZSAiaXNzX3ZpZGVvLmgiCisKK2VudW0gaXBpcGVfaW5wdXRfZW50aXR5IHsKKwlJUElQRV9JTlBVVF9OT05FLAorCUlQSVBFX0lOUFVUX0lQSVBFSUYsCit9OworCisjZGVmaW5lIElQSVBFX09VVFBVVF9WUAkJKDEgPDwgMCkKKworLyogU2luayBhbmQgc291cmNlIElQSVBFIHBhZHMgKi8KKyNkZWZpbmUgSVBJUEVfUEFEX1NJTksJCQkJMAorI2RlZmluZSBJUElQRV9QQURfU09VUkNFX1ZQCQkJMQorI2RlZmluZSBJUElQRV9QQURTX05VTQkJCQkyCisKKy8qCisgKiBzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSAtIFN0cnVjdHVyZSBmb3IgdGhlIElQSVBFIG1vZHVsZSB0byBzdG9yZSBpdHMgb3duCisgKgkJCSAgICBpbmZvcm1hdGlvbgorICogQHN1YmRldjogVjRMMiBzdWJkZXZpY2UKKyAqIEBwYWRzOiBTaW5rIGFuZCBzb3VyY2UgbWVkaWEgZW50aXR5IHBhZHMKKyAqIEBmb3JtYXRzOiBBY3RpdmUgdmlkZW8gZm9ybWF0cworICogQGlucHV0OiBBY3RpdmUgaW5wdXQKKyAqIEBvdXRwdXQ6IEFjdGl2ZSBvdXRwdXRzCisgKiBAZXJyb3I6IEEgaGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNhcHR1cmUKKyAqIEBzdGF0ZTogU3RyZWFtaW5nIHN0YXRlCisgKiBAd2FpdDogV2FpdCBxdWV1ZSB1c2VkIHRvIHN0b3AgdGhlIG1vZHVsZQorICogQHN0b3BwaW5nOiBTdG9wcGluZyBzdGF0ZQorICovCitzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgbWVkaWFfcGFkIHBhZHNbSVBJUEVfUEFEU19OVU1dOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0c1tJUElQRV9QQURTX05VTV07CisKKwllbnVtIGlwaXBlX2lucHV0X2VudGl0eSBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0OworCXVuc2lnbmVkIGludCBlcnJvcjsKKworCWVudW0gaXNzX3BpcGVsaW5lX3N0cmVhbV9zdGF0ZSBzdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWF0b21pY190IHN0b3BwaW5nOworfTsKKworc3RydWN0IGlzc19kZXZpY2U7CisKK2ludCBvbWFwNGlzc19pcGlwZV9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSAqaXBpcGUsCisJc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KTsKK3ZvaWQgb21hcDRpc3NfaXBpcGVfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlX2RldmljZSAqaXBpcGUpOworCitpbnQgb21hcDRpc3NfaXBpcGVfaW5pdChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKTsKK3ZvaWQgb21hcDRpc3NfaXBpcGVfY2xlYW51cChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKTsKKworI2VuZGlmCS8qIE9NQVA0X0lTU19JUElQRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlaWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfaXBpcGVpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzE0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlaWYuYwpAQCAtMCwwICsxLDg0OSBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIElTUCBJUElQRUlGIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAiaXNzLmgiCisjaW5jbHVkZSAiaXNzX3JlZ3MuaCIKKyNpbmNsdWRlICJpc3NfaXBpcGVpZi5oIgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlwaXBlaWZfZm10c1tdID0geworCVY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU1JHR0IxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfU0dCUkcxMF8xWDEwLAorCVY0TDJfTUJVU19GTVRfVVlWWThfMVgxNiwKKwlWNEwyX01CVVNfRk1UX1lVWVY4XzFYMTYsCit9OworCisvKgorICogaXBpcGVpZl9wcmludF9zdGF0dXMgLSBQcmludCBjdXJyZW50IElQSVBFSUYgTW9kdWxlIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIEBpcGlwZWlmOiBQb2ludGVyIHRvIElTUyBJU1AgSVBJUEVJRiBkZXZpY2UuCisgKgorICogQWxzbyBwcmludHMgb3RoZXIgZGVidWcgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBJUElQRUlGIG1vZHVsZS4KKyAqLworI2RlZmluZSBJUElQRUlGX1BSSU5UX1JFR0lTVEVSKGlzcywgbmFtZSlcCisJZGV2X2RiZyhpc3MtPmRldiwgIiMjI0lQSVBFSUYgIiAjbmFtZSAiPTB4JTA4eFxuIiwgXAorCQlpc3NfcmVnX3JlYWQoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRUlGLCBJUElQRUlGXyMjbmFtZSkpCisKKyNkZWZpbmUgSVNJRl9QUklOVF9SRUdJU1RFUihpc3MsIG5hbWUpXAorCWRldl9kYmcoaXNzLT5kZXYsICIjIyNJU0lGICIgI25hbWUgIj0weCUwOHhcbiIsIFwKKwkJaXNzX3JlZ19yZWFkKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVNJRiwgSVNJRl8jI25hbWUpKQorCisjZGVmaW5lIElTUDVfUFJJTlRfUkVHSVNURVIoaXNzLCBuYW1lKVwKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiIyMjSVNQNSAiICNuYW1lICI9MHglMDh4XG4iLCBcCisJCWlzc19yZWdfcmVhZChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1NZUzEsIElTUDVfIyNuYW1lKSkKKworc3RhdGljIHZvaWQgaXBpcGVpZl9wcmludF9zdGF0dXMoc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZikKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShpcGlwZWlmKTsKKworCWRldl9kYmcoaXNzLT5kZXYsICItLS0tLS0tLS0tLS0tSVBJUEVJRiBSZWdpc3RlciBkdW1wLS0tLS0tLS0tLS0tLVxuIik7CisKKwlJUElQRUlGX1BSSU5UX1JFR0lTVEVSKGlzcywgQ0ZHMSk7CisJSVBJUEVJRl9QUklOVF9SRUdJU1RFUihpc3MsIENGRzIpOworCisJSVNJRl9QUklOVF9SRUdJU1RFUihpc3MsIFNZTkNFTik7CisJSVNJRl9QUklOVF9SRUdJU1RFUihpc3MsIENBRFUpOworCUlTSUZfUFJJTlRfUkVHSVNURVIoaXNzLCBDQURMKTsKKwlJU0lGX1BSSU5UX1JFR0lTVEVSKGlzcywgTU9ERVNFVCk7CisJSVNJRl9QUklOVF9SRUdJU1RFUihpc3MsIENDT0xQKTsKKwlJU0lGX1BSSU5UX1JFR0lTVEVSKGlzcywgU1BIKTsKKwlJU0lGX1BSSU5UX1JFR0lTVEVSKGlzcywgTE5IKTsKKwlJU0lGX1BSSU5UX1JFR0lTVEVSKGlzcywgTE5WKTsKKwlJU0lGX1BSSU5UX1JFR0lTVEVSKGlzcywgVkRJTlQoMCkpOworCUlTSUZfUFJJTlRfUkVHSVNURVIoaXNzLCBIU0laRSk7CisKKwlJU1A1X1BSSU5UX1JFR0lTVEVSKGlzcywgU1lTQ09ORklHKTsKKwlJU1A1X1BSSU5UX1JFR0lTVEVSKGlzcywgQ1RSTCk7CisJSVNQNV9QUklOVF9SRUdJU1RFUihpc3MsIElSUVNUQVRVUygwKSk7CisJSVNQNV9QUklOVF9SRUdJU1RFUihpc3MsIElSUUVOQUJMRV9TRVQoMCkpOworCUlTUDVfUFJJTlRfUkVHSVNURVIoaXNzLCBJUlFFTkFCTEVfQ0xSKDApKTsKKworCWRldl9kYmcoaXNzLT5kZXYsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGlwaXBlaWZfd3JpdGVfZW5hYmxlKHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsIHU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShpcGlwZWlmKTsKKworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVNJRiwgSVNJRl9TWU5DRU4sCisJCSAgICAgICBJU0lGX1NZTkNFTl9EV0VOLCBlbmFibGUgPyBJU0lGX1NZTkNFTl9EV0VOIDogMCk7Cit9CisKKy8qCisgKiBpcGlwZWlmX2VuYWJsZSAtIEVuYWJsZS9EaXNhYmxlIElQSVBFSUYuCisgKiBAZW5hYmxlOiBlbmFibGUgZmxhZworICoKKyAqLworc3RhdGljIHZvaWQgaXBpcGVpZl9lbmFibGUoc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiwgdTggZW5hYmxlKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKGlwaXBlaWYpOworCisJaXNzX3JlZ191cGRhdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JU0lGLCBJU0lGX1NZTkNFTiwKKwkJICAgICAgIElTSUZfU1lOQ0VOX1NZRU4sIGVuYWJsZSA/IElTSUZfU1lOQ0VOX1NZRU4gOiAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvcm1hdC0gYW5kIHBpcGVsaW5lLXJlbGF0ZWQgY29uZmlndXJhdGlvbiBoZWxwZXJzCisgKi8KKworLyoKKyAqIGlwaXBlaWZfc2V0X291dGFkZHIgLSBTZXQgbWVtb3J5IGFkZHJlc3MgdG8gc2F2ZSBvdXRwdXQgaW1hZ2UKKyAqIEBpcGlwZWlmOiBQb2ludGVyIHRvIElTUCBJUElQRUlGIGRldmljZS4KKyAqIEBhZGRyOiAzMi1iaXQgbWVtb3J5IGFkZHJlc3MgYWxpZ25lZCBvbiAzMiBieXRlIGJvdW5kYXJ5LgorICoKKyAqIFNldHMgdGhlIG1lbW9yeSBhZGRyZXNzIHdoZXJlIHRoZSBvdXRwdXQgd2lsbCBiZSBzYXZlZC4KKyAqLworc3RhdGljIHZvaWQgaXBpcGVpZl9zZXRfb3V0YWRkcihzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmLCB1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShpcGlwZWlmKTsKKworCS8qIFNhdmUgYWRkcmVzcyBzcGxpdHRlZCBpbiBCYXNlIEFkZHJlc3MgSCAmIEwgKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVNJRiwgSVNJRl9DQURVLAorCQkgICAgICAoYWRkciA+PiAoMTYgKyA1KSkgJiBJU0lGX0NBRFVfTUFTSyk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfQ0FETCwKKwkJICAgICAgKGFkZHIgPj4gNSkgJiBJU0lGX0NBRExfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwaXBlaWZfY29uZmlndXJlKHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYpCit7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UoaXBpcGVpZik7CisJY29uc3Qgc3RydWN0IGlzc19mb3JtYXRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CisJdTMyIGlzaWZfY2NvbHAgPSAwOworCisJb21hcDRpc3NfY29uZmlndXJlX2JyaWRnZShpc3MsIGlwaXBlaWYtPmlucHV0KTsKKworCS8qIElQSVBFSUZfUEFEX1NJTksgKi8KKwlmb3JtYXQgPSAmaXBpcGVpZi0+Zm9ybWF0c1tJUElQRUlGX1BBRF9TSU5LXTsKKworCS8qIElQSVBFSUYgd2l0aCBZVVY0MjIgaW5wdXQgZnJvbSBJU0lGICovCisJaXNzX3JlZ19jbHIoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRUlGLCBJUElQRUlGX0NGRzEsCisJCSAgICBJUElQRUlGX0NGRzFfSU5QU1JDMV9NQVNLIHwgSVBJUEVJRl9DRkcxX0lOUFNSQzJfTUFTSyk7CisKKwkvKiBTZWxlY3QgSVNJRi9JUElQRUlGIGlucHV0IGZvcm1hdCAqLworCXN3aXRjaCAoZm9ybWF0LT5jb2RlKSB7CisJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTY6CisJY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzFYMTY6CisJCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVNJRiwgSVNJRl9NT0RFU0VULAorCQkJICAgICAgIElTSUZfTU9ERVNFVF9DQ0RNRCB8IElTSUZfTU9ERVNFVF9JTlBNT0RfTUFTSyB8CisJCQkgICAgICAgSVNJRl9NT0RFU0VUX0NDRFdfTUFTSywKKwkJCSAgICAgICBJU0lGX01PREVTRVRfSU5QTU9EX1lDQkNSMTYpOworCisJCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVBJUEVJRiwgSVBJUEVJRl9DRkcyLAorCQkJICAgICAgIElQSVBFSUZfQ0ZHMl9ZVVY4LCBJUElQRUlGX0NGRzJfWVVWMTYpOworCisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA6CisJCWlzaWZfY2NvbHAgPSBJU0lGX0NDT0xQX0NQMF9GMF9HUiB8CisJCQlJU0lGX0NDT0xQX0NQMV9GMF9SIHwKKwkJCUlTSUZfQ0NPTFBfQ1AyX0YwX0IgfAorCQkJSVNJRl9DQ09MUF9DUDNfRjBfR0I7CisJCWdvdG8gY29udF9yYXc7CisJY2FzZSBWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMDoKKwkJaXNpZl9jY29scCA9IElTSUZfQ0NPTFBfQ1AwX0YwX1IgfAorCQkJSVNJRl9DQ09MUF9DUDFfRjBfR1IgfAorCQkJSVNJRl9DQ09MUF9DUDJfRjBfR0IgfAorCQkJSVNJRl9DQ09MUF9DUDNfRjBfQjsKKwkJZ290byBjb250X3JhdzsKKwljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwOgorCQlpc2lmX2Njb2xwID0gSVNJRl9DQ09MUF9DUDBfRjBfQiB8CisJCQlJU0lGX0NDT0xQX0NQMV9GMF9HQiB8CisJCQlJU0lGX0NDT0xQX0NQMl9GMF9HUiB8CisJCQlJU0lGX0NDT0xQX0NQM19GMF9SOworCQlnb3RvIGNvbnRfcmF3OworCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTA6CisJCWlzaWZfY2NvbHAgPSBJU0lGX0NDT0xQX0NQMF9GMF9HQiB8CisJCQlJU0lGX0NDT0xQX0NQMV9GMF9CIHwKKwkJCUlTSUZfQ0NPTFBfQ1AyX0YwX1IgfAorCQkJSVNJRl9DQ09MUF9DUDNfRjBfR1I7Citjb250X3JhdzoKKwkJaXNzX3JlZ19jbHIoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JUElQRUlGLCBJUElQRUlGX0NGRzIsCisJCQkgICAgSVBJUEVJRl9DRkcyX1lVVjE2KTsKKworCQlpc3NfcmVnX3VwZGF0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfTU9ERVNFVCwKKwkJCSAgICAgICBJU0lGX01PREVTRVRfQ0NETUQgfCBJU0lGX01PREVTRVRfSU5QTU9EX01BU0sgfAorCQkJICAgICAgIElTSUZfTU9ERVNFVF9DQ0RXX01BU0ssIElTSUZfTU9ERVNFVF9JTlBNT0RfUkFXIHwKKwkJCSAgICAgICBJU0lGX01PREVTRVRfQ0NEV18yQklUKTsKKworCQlpbmZvID0gb21hcDRpc3NfdmlkZW9fZm9ybWF0X2luZm8oZm9ybWF0LT5jb2RlKTsKKwkJaXNzX3JlZ191cGRhdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9JU0lGLCBJU0lGX0NHQU1NQVdELAorCQkJICAgICAgIElTSUZfQ0dBTU1BV0RfR1dESV9NQVNLLAorCQkJICAgICAgIElTSUZfQ0dBTU1BV0RfR1dESShpbmZvLT5icHApKTsKKworCQkvKiBTZXQgUkFXIEJheWVyIHBhdHRlcm4gKi8KKwkJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfQ0NPTFAsCisJCQkgICAgICBpc2lmX2Njb2xwKTsKKwkJYnJlYWs7CisJfQorCisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfU1BILCAwICYgSVNJRl9TUEhfTUFTSyk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfTE5ILAorCQkgICAgICAoZm9ybWF0LT53aWR0aCAtIDEpICYgSVNJRl9MTkhfTUFTSyk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfTE5WLAorCQkgICAgICAoZm9ybWF0LT5oZWlnaHQgLSAxKSAmIElTSUZfTE5WX01BU0spOworCisJLyogR2VuZXJhdGUgSVNJRjAgb24gdGhlIGxhc3QgbGluZSBvZiB0aGUgaW1hZ2UgKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfSVNJRiwgSVNJRl9WRElOVCgwKSwKKwkJICAgICAgZm9ybWF0LT5oZWlnaHQgLSAxKTsKKworCS8qIElQSVBFSUZfUEFEX1NPVVJDRV9JU0lGX1NGICovCisJZm9ybWF0ID0gJmlwaXBlaWYtPmZvcm1hdHNbSVBJUEVJRl9QQURfU09VUkNFX0lTSUZfU0ZdOworCisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX0lTSUYsIElTSUZfSFNJWkUsCisJCSAgICAgIChpcGlwZWlmLT52aWRlb19vdXQuYnBsX3ZhbHVlID4+IDUpICYKKwkJICAgICAgSVNJRl9IU0laRV9IU0laRV9NQVNLKTsKKworCS8qIElQSVBFSUZfUEFEX1NPVVJDRV9WUCAqLworCS8qIERvIG5vdGhpbmc/ICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgdm9pZCBpcGlwZWlmX2lzcl9idWZmZXIoc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZikKK3sKKwlzdHJ1Y3QgaXNzX2J1ZmZlciAqYnVmZmVyOworCisJLyogVGhlIElTSUYgZ2VuZXJhdGVzIFZEMCBpbnRlcnJ1cHRzIGV2ZW4gd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkLgorCSAqIGRlYWwgd2l0aCBpdCBhbnl3YXkpLiBEaXNhYmxpbmcgdGhlIElTSUYgd2hlbiBubyBidWZmZXIgaXMgYXZhaWxhYmxlCisJICogaXMgdGh1cyBub3QgYmUgZW5vdWdoLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgc2l0dWF0aW9uIGV4cGxpY2l0bHkuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmlwaXBlaWYtPnZpZGVvX291dC5kbWFxdWV1ZSkpCisJCXJldHVybjsKKworCWlwaXBlaWZfd3JpdGVfZW5hYmxlKGlwaXBlaWYsIDApOworCisJYnVmZmVyID0gb21hcDRpc3NfdmlkZW9fYnVmZmVyX25leHQoJmlwaXBlaWYtPnZpZGVvX291dCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpcGlwZWlmX3NldF9vdXRhZGRyKGlwaXBlaWYsIGJ1ZmZlci0+aXNzX2FkZHIpOworCisJaXBpcGVpZl93cml0ZV9lbmFibGUoaXBpcGVpZiwgMSk7Cit9CisKKy8qCisgKiBpcGlwZWlmX2lzaWYwX2lzciAtIEhhbmRsZSBJU0lGMCBldmVudAorICogQGlwaXBlaWY6IFBvaW50ZXIgdG8gSVNQIElQSVBFSUYgZGV2aWNlLgorICoKKyAqIEV4ZWN1dGVzIExTQyBkZWZlcnJlZCBlbmFibGVtZW50IGJlZm9yZSBuZXh0IGZyYW1lIHN0YXJ0cy4KKyAqLworc3RhdGljIHZvaWQgaXBpcGVpZl9pc2lmMF9pc3Ioc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZikKK3sKKwlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlID0KKwkJCSAgICAgdG9faXNzX3BpcGVsaW5lKCZpcGlwZWlmLT5zdWJkZXYuZW50aXR5KTsKKwlpZiAocGlwZS0+ZG9fcHJvcGFnYXRpb24pCisJCWF0b21pY19pbmMoJnBpcGUtPmZyYW1lX251bWJlcik7CisKKwlpZiAoaXBpcGVpZi0+b3V0cHV0ICYgSVBJUEVJRl9PVVRQVVRfTUVNT1JZKQorCQlpcGlwZWlmX2lzcl9idWZmZXIoaXBpcGVpZik7Cit9CisKKy8qCisgKiBvbWFwNGlzc19pcGlwZWlmX2lzciAtIENvbmZpZ3VyZSBpcGlwZWlmIGR1cmluZyBpbnRlcmZyYW1lIHRpbWUuCisgKiBAaXBpcGVpZjogUG9pbnRlciB0byBJU1AgSVBJUEVJRiBkZXZpY2UuCisgKiBAZXZlbnRzOiBJUElQRUlGIGV2ZW50cworICovCit2b2lkIG9tYXA0aXNzX2lwaXBlaWZfaXNyKHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsIHUzMiBldmVudHMpCit7CisJaWYgKG9tYXA0aXNzX21vZHVsZV9zeW5jX2lzX3N0b3BwaW5nKCZpcGlwZWlmLT53YWl0LAorCQkJCQkgICAgICZpcGlwZWlmLT5zdG9wcGluZykpCisJCXJldHVybjsKKworCWlmIChldmVudHMgJiBJU1A1X0lSUV9JU0lGX0lOVCgwKSkKKwkJaXBpcGVpZl9pc2lmMF9pc3IoaXBpcGVpZik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1AgdmlkZW8gb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgaXBpcGVpZl92aWRlb19xdWV1ZShzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbywKKwkJCSAgICAgICBzdHJ1Y3QgaXNzX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYgPSBjb250YWluZXJfb2YodmlkZW8sCisJCQkJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSwgdmlkZW9fb3V0KTsKKworCWlmICghKGlwaXBlaWYtPm91dHB1dCAmIElQSVBFSUZfT1VUUFVUX01FTU9SWSkpCisJCXJldHVybiAtRU5PREVWOworCisJaXBpcGVpZl9zZXRfb3V0YWRkcihpcGlwZWlmLCBidWZmZXItPmlzc19hZGRyKTsKKworCS8qCisJICogSWYgc3RyZWFtaW5nIHdhcyBlbmFibGVkIGJlZm9yZSB0aGVyZSB3YXMgYSBidWZmZXIgcXVldWVkCisJICogb3IgdW5kZXJydW4gaGFwcGVuZWQgaW4gdGhlIElTUiwgdGhlIGhhcmR3YXJlIHdhcyBub3QgZW5hYmxlZAorCSAqIGFuZCBETUEgcXVldWUgZmxhZyBJU1NfVklERU9fRE1BUVVFVUVfVU5ERVJSVU4gaXMgc3RpbGwgc2V0LgorCSAqIEVuYWJsZSBpdCBub3cuCisJICovCisJaWYgKHZpZGVvLT5kbWFxdWV1ZV9mbGFncyAmIElTU19WSURFT19ETUFRVUVVRV9VTkRFUlJVTikgeworCQlpZiAoaXBpcGVpZi0+b3V0cHV0ICYgSVBJUEVJRl9PVVRQVVRfTUVNT1JZKQorCQkJaXBpcGVpZl93cml0ZV9lbmFibGUoaXBpcGVpZiwgMSk7CisJCWlwaXBlaWZfZW5hYmxlKGlwaXBlaWYsIDEpOworCQlpc3NfdmlkZW9fZG1hcXVldWVfZmxhZ3NfY2xyKHZpZGVvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpc3NfdmlkZW9fb3BlcmF0aW9ucyBpcGlwZWlmX3ZpZGVvX29wcyA9IHsKKwkucXVldWUgPSBpcGlwZWlmX3ZpZGVvX3F1ZXVlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgc3ViZGV2IG9wZXJhdGlvbnMKKyAqLworCisjZGVmaW5lIElQSVBFSUZfRFJWX1NVQkNMS19NQVNLCShPTUFQNF9JU1NfSVNQX1NVQkNMS19JUElQRUlGIHxcCisJCQkJIE9NQVA0X0lTU19JU1BfU1VCQ0xLX0lTSUYpCisvKgorICogaXBpcGVpZl9zZXRfc3RyZWFtIC0gRW5hYmxlL0Rpc2FibGUgc3RyZWFtaW5nIG9uIHRoZSBJUElQRUlGIG1vZHVsZQorICogQHNkOiBJU1AgSVBJUEVJRiBWNEwyIHN1YmRldmljZQorICogQGVuYWJsZTogRW5hYmxlL2Rpc2FibGUgc3RyZWFtCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVpZl9zZXRfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKGlwaXBlaWYpOworCXN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvX291dCA9ICZpcGlwZWlmLT52aWRlb19vdXQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaXBpcGVpZi0+c3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKSB7CisJCWlmIChlbmFibGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQkJcmV0dXJuIDA7CisKKwkJb21hcDRpc3NfaXNwX3N1YmNsa19lbmFibGUoaXNzLCBJUElQRUlGX0RSVl9TVUJDTEtfTUFTSyk7CisJfQorCisJc3dpdGNoIChlbmFibGUpIHsKKwljYXNlIElTU19QSVBFTElORV9TVFJFQU1fQ09OVElOVU9VUzoKKworCQlpcGlwZWlmX2NvbmZpZ3VyZShpcGlwZWlmKTsKKwkJaXBpcGVpZl9wcmludF9zdGF0dXMoaXBpcGVpZik7CisKKwkJLyoKKwkJICogV2hlbiBvdXRwdXR0aW5nIHRvIG1lbW9yeSB3aXRoIG5vIGJ1ZmZlciBhdmFpbGFibGUsIGxldCB0aGUKKwkJICogYnVmZmVyIHF1ZXVlIGhhbmRsZXIgc3RhcnQgdGhlIGhhcmR3YXJlLiBBIERNQSBxdWV1ZSBmbGFnCisJCSAqIElTU19WSURFT19ETUFRVUVVRV9RVUVVRUQgd2lsbCBiZSBzZXQgYXMgc29vbiBhcyB0aGVyZSBpcworCQkgKiBhIGJ1ZmZlciBhdmFpbGFibGUuCisJCSAqLworCQlpZiAoaXBpcGVpZi0+b3V0cHV0ICYgSVBJUEVJRl9PVVRQVVRfTUVNT1JZICYmCisJCSAgICAhKHZpZGVvX291dC0+ZG1hcXVldWVfZmxhZ3MgJiBJU1NfVklERU9fRE1BUVVFVUVfUVVFVUVEKSkKKwkJCWJyZWFrOworCisJCWF0b21pY19zZXQoJmlwaXBlaWYtPnN0b3BwaW5nLCAwKTsKKwkJaWYgKGlwaXBlaWYtPm91dHB1dCAmIElQSVBFSUZfT1VUUFVUX01FTU9SWSkKKwkJCWlwaXBlaWZfd3JpdGVfZW5hYmxlKGlwaXBlaWYsIDEpOworCQlpcGlwZWlmX2VuYWJsZShpcGlwZWlmLCAxKTsKKwkJaXNzX3ZpZGVvX2RtYXF1ZXVlX2ZsYWdzX2Nscih2aWRlb19vdXQpOworCQlicmVhazsKKworCWNhc2UgSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOgorCQlpZiAoaXBpcGVpZi0+c3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQkJcmV0dXJuIDA7CisJCWlmIChvbWFwNGlzc19tb2R1bGVfc3luY19pZGxlKCZzZC0+ZW50aXR5LCAmaXBpcGVpZi0+d2FpdCwKKwkJCQkJICAgICAgJmlwaXBlaWYtPnN0b3BwaW5nKSkKKwkJCXJldCA9IC1FVElNRURPVVQ7CisKKwkJaWYgKGlwaXBlaWYtPm91dHB1dCAmIElQSVBFSUZfT1VUUFVUX01FTU9SWSkKKwkJCWlwaXBlaWZfd3JpdGVfZW5hYmxlKGlwaXBlaWYsIDApOworCQlpcGlwZWlmX2VuYWJsZShpcGlwZWlmLCAwKTsKKwkJb21hcDRpc3NfaXNwX3N1YmNsa19kaXNhYmxlKGlzcywgSVBJUEVJRl9EUlZfU1VCQ0xLX01BU0spOworCQlpc3NfdmlkZW9fZG1hcXVldWVfZmxhZ3NfY2xyKHZpZGVvX291dCk7CisJCWJyZWFrOworCX0KKworCWlwaXBlaWYtPnN0YXRlID0gZW5hYmxlOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19faXBpcGVpZl9nZXRfZm9ybWF0KHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsCisJCSAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwgdW5zaWduZWQgaW50IHBhZCwKKwkJICAgICBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJaWYgKHdoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpCisJCXJldHVybiB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgcGFkKTsKKwllbHNlCisJCXJldHVybiAmaXBpcGVpZi0+Zm9ybWF0c1twYWRdOworfQorCisvKgorICogaXBpcGVpZl90cnlfZm9ybWF0IC0gVHJ5IHZpZGVvIGZvcm1hdCBvbiBhIHBhZAorICogQGlwaXBlaWY6IElTUyBJUElQRUlGIGRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBwYWQ6IFBhZCBudW1iZXIKKyAqIEBmbXQ6IEZvcm1hdAorICovCitzdGF0aWMgdm9pZAoraXBpcGVpZl90cnlfZm9ybWF0KHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsCisJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsIHVuc2lnbmVkIGludCBwYWQsCisJCSAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCwKKwkJICAgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgd2lkdGggPSBmbXQtPndpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQgPSBmbXQtPmhlaWdodDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAocGFkKSB7CisJY2FzZSBJUElQRUlGX1BBRF9TSU5LOgorCQkvKiBUT0RPOiBJZiB0aGUgSVBJUEVJRiBvdXRwdXQgZm9ybWF0dGVyIHBhZCBpcyBjb25uZWN0ZWQKKwkJICogZGlyZWN0bHkgdG8gdGhlIHJlc2l6ZXIsIG9ubHkgWVVWIGZvcm1hdHMgY2FuIGJlIHVzZWQuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcGlwZWlmX2ZtdHMpOyBpKyspIHsKKwkJCWlmIChmbXQtPmNvZGUgPT0gaXBpcGVpZl9mbXRzW2ldKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgbm90IGZvdW5kLCB1c2UgU0dSQkcxMCBhcyBkZWZhdWx0ICovCisJCWlmIChpID49IEFSUkFZX1NJWkUoaXBpcGVpZl9mbXRzKSkKKwkJCWZtdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCisJCS8qIENsYW1wIHRoZSBpbnB1dCBzaXplLiAqLworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAxLCA4MTkyKTsKKwkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAxLCA4MTkyKTsKKwkJYnJlYWs7CisKKwljYXNlIElQSVBFSUZfUEFEX1NPVVJDRV9JU0lGX1NGOgorCQlmb3JtYXQgPSBfX2lwaXBlaWZfZ2V0X2Zvcm1hdChpcGlwZWlmLCBmaCwgSVBJUEVJRl9QQURfU0lOSywKKwkJCQkJICAgICAgd2hpY2gpOworCQltZW1jcHkoZm10LCBmb3JtYXQsIHNpemVvZigqZm10KSk7CisKKwkJLyogVGhlIGRhdGEgZm9ybWF0dGVyIHRydW5jYXRlcyB0aGUgbnVtYmVyIG9mIGhvcml6b250YWwgb3V0cHV0CisJCSAqIHBpeGVscyB0byBhIG11bHRpcGxlIG9mIDE2LiBUbyBhdm9pZCBjbGlwcGluZyBkYXRhLCBhbGxvdworCQkgKiBjYWxsZXJzIHRvIHJlcXVlc3QgYW4gb3V0cHV0IHNpemUgYmlnZ2VyIHRoYW4gdGhlIGlucHV0IHNpemUKKwkJICogdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYuCisJCSAqLworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAzMiwgKGZtdC0+d2lkdGggKyAxNSkgJiB+MTUpOworCQlmbXQtPndpZHRoICY9IH4xNTsKKwkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAzMiwgZm10LT5oZWlnaHQpOworCQlicmVhazsKKworCWNhc2UgSVBJUEVJRl9QQURfU09VUkNFX1ZQOgorCQlmb3JtYXQgPSBfX2lwaXBlaWZfZ2V0X2Zvcm1hdChpcGlwZWlmLCBmaCwgSVBJUEVJRl9QQURfU0lOSywKKwkJCQkJICAgICAgd2hpY2gpOworCQltZW1jcHkoZm10LCBmb3JtYXQsIHNpemVvZigqZm10KSk7CisKKwkJZm10LT53aWR0aCA9IGNsYW1wX3QodTMyLCB3aWR0aCwgMzIsIGZtdC0+d2lkdGgpOworCQlmbXQtPmhlaWdodCA9IGNsYW1wX3QodTMyLCBoZWlnaHQsIDMyLCBmbXQtPmhlaWdodCk7CisJCWJyZWFrOworCX0KKworCS8qIERhdGEgaXMgd3JpdHRlbiB0byBtZW1vcnkgdW5wYWNrZWQsIGVhY2ggMTAtYml0IG9yIDEyLWJpdCBwaXhlbCBpcworCSAqIHN0b3JlZCBvbiAyIGJ5dGVzLgorCSAqLworCWZtdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cit9CisKKy8qCisgKiBpcGlwZWlmX2VudW1fbWJ1c19jb2RlIC0gSGFuZGxlIHBpeGVsIGZvcm1hdCBlbnVtZXJhdGlvbgorICogQHNkICAgICA6IHBvaW50ZXIgdG8gdjRsMiBzdWJkZXYgc3RydWN0dXJlCisgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQGNvZGUgICA6IHBvaW50ZXIgdG8gdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gc3RydWN0dXJlCisgKiByZXR1cm4gLUVJTlZBTCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpcGlwZWlmX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCXN3aXRjaCAoY29kZS0+cGFkKSB7CisJY2FzZSBJUElQRUlGX1BBRF9TSU5LOgorCQlpZiAoY29kZS0+aW5kZXggPj0gQVJSQVlfU0laRShpcGlwZWlmX2ZtdHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY29kZS0+Y29kZSA9IGlwaXBlaWZfZm10c1tjb2RlLT5pbmRleF07CisJCWJyZWFrOworCisJY2FzZSBJUElQRUlGX1BBRF9TT1VSQ0VfSVNJRl9TRjoKKwljYXNlIElQSVBFSUZfUEFEX1NPVVJDRV9WUDoKKwkJLyogTm8gZm9ybWF0IGNvbnZlcnNpb24gaW5zaWRlIElQSVBFSUYgKi8KKwkJaWYgKGNvZGUtPmluZGV4ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlmb3JtYXQgPSBfX2lwaXBlaWZfZ2V0X2Zvcm1hdChpcGlwZWlmLCBmaCwgSVBJUEVJRl9QQURfU0lOSywKKwkJCQkJICAgICAgVjRMMl9TVUJERVZfRk9STUFUX1RSWSk7CisKKwkJY29kZS0+Y29kZSA9IGZvcm1hdC0+Y29kZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGlwZWlmX2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCXN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKworCWlmIChmc2UtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9ybWF0LmNvZGUgPSBmc2UtPmNvZGU7CisJZm9ybWF0LndpZHRoID0gMTsKKwlmb3JtYXQuaGVpZ2h0ID0gMTsKKwlpcGlwZWlmX3RyeV9mb3JtYXQoaXBpcGVpZiwgZmgsIGZzZS0+cGFkLCAmZm9ybWF0LAorCQkJICAgVjRMMl9TVUJERVZfRk9STUFUX1RSWSk7CisJZnNlLT5taW5fd2lkdGggPSBmb3JtYXQud2lkdGg7CisJZnNlLT5taW5faGVpZ2h0ID0gZm9ybWF0LmhlaWdodDsKKworCWlmIChmb3JtYXQuY29kZSAhPSBmc2UtPmNvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9ybWF0LmNvZGUgPSBmc2UtPmNvZGU7CisJZm9ybWF0LndpZHRoID0gLTE7CisJZm9ybWF0LmhlaWdodCA9IC0xOworCWlwaXBlaWZfdHJ5X2Zvcm1hdChpcGlwZWlmLCBmaCwgZnNlLT5wYWQsICZmb3JtYXQsCisJCQkgICBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC53aWR0aDsKKwlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQuaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpcGlwZWlmX2dldF9mb3JtYXQgLSBSZXRyaWV2ZSB0aGUgdmlkZW8gZm9ybWF0IG9uIGEgcGFkCisgKiBAc2QgOiBJU1AgSVBJUEVJRiBWNEwyIHN1YmRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IEZvcm1hdAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgcGFkIGlzIGludmFsaWQgb3IgZG9lc24ndCBjb3JyZXNwb25kCisgKiB0byB0aGUgZm9ybWF0IHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVpZl9nZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9faXBpcGVpZl9nZXRfZm9ybWF0KGlwaXBlaWYsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CisJaWYgKGZvcm1hdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZtdC0+Zm9ybWF0ID0gKmZvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlwaXBlaWZfc2V0X2Zvcm1hdCAtIFNldCB0aGUgdmlkZW8gZm9ybWF0IG9uIGEgcGFkCisgKiBAc2QgOiBJU1AgSVBJUEVJRiBWNEwyIHN1YmRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IEZvcm1hdAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgcGFkIGlzIGludmFsaWQgb3IgZG9lc24ndCBjb3JyZXNwb25kCisgKiB0byB0aGUgZm9ybWF0IHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgaXBpcGVpZl9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9faXBpcGVpZl9nZXRfZm9ybWF0KGlwaXBlaWYsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CisJaWYgKGZvcm1hdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlwaXBlaWZfdHJ5X2Zvcm1hdChpcGlwZWlmLCBmaCwgZm10LT5wYWQsICZmbXQtPmZvcm1hdCwgZm10LT53aGljaCk7CisJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OworCisJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgZnJvbSBzaW5rIHRvIHNvdXJjZSAqLworCWlmIChmbXQtPnBhZCA9PSBJUElQRUlGX1BBRF9TSU5LKSB7CisJCWZvcm1hdCA9IF9faXBpcGVpZl9nZXRfZm9ybWF0KGlwaXBlaWYsIGZoLAorCQkJCQkgICAgICBJUElQRUlGX1BBRF9TT1VSQ0VfSVNJRl9TRiwKKwkJCQkJICAgICAgZm10LT53aGljaCk7CisJCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKKwkJaXBpcGVpZl90cnlfZm9ybWF0KGlwaXBlaWYsIGZoLCBJUElQRUlGX1BBRF9TT1VSQ0VfSVNJRl9TRiwKKwkJCQkgICBmb3JtYXQsIGZtdC0+d2hpY2gpOworCisJCWZvcm1hdCA9IF9faXBpcGVpZl9nZXRfZm9ybWF0KGlwaXBlaWYsIGZoLAorCQkJCQkgICAgICBJUElQRUlGX1BBRF9TT1VSQ0VfVlAsCisJCQkJCSAgICAgIGZtdC0+d2hpY2gpOworCQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7CisJCWlwaXBlaWZfdHJ5X2Zvcm1hdChpcGlwZWlmLCBmaCwgSVBJUEVJRl9QQURfU09VUkNFX1ZQLCBmb3JtYXQsCisJCQkJZm10LT53aGljaCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBpcGVpZl9saW5rX3ZhbGlkYXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCBtZWRpYV9saW5rICpsaW5rLAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzb3VyY2VfZm10LAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzaW5rX2ZtdCkKK3sKKwkvKiBDaGVjayBpZiB0aGUgdHdvIGVuZHMgbWF0Y2ggKi8KKwlpZiAoc291cmNlX2ZtdC0+Zm9ybWF0LndpZHRoICE9IHNpbmtfZm10LT5mb3JtYXQud2lkdGggfHwKKwkgICAgc291cmNlX2ZtdC0+Zm9ybWF0LmhlaWdodCAhPSBzaW5rX2ZtdC0+Zm9ybWF0LmhlaWdodCkKKwkJcmV0dXJuIC1FUElQRTsKKworCWlmIChzb3VyY2VfZm10LT5mb3JtYXQuY29kZSAhPSBzaW5rX2ZtdC0+Zm9ybWF0LmNvZGUpCisJCXJldHVybiAtRVBJUEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlwaXBlaWZfaW5pdF9mb3JtYXRzIC0gSW5pdGlhbGl6ZSBmb3JtYXRzIG9uIGFsbCBwYWRzCisgKiBAc2Q6IElTUCBJUElQRUlGIFY0TDIgc3ViZGV2aWNlCisgKiBAZmg6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCisgKgorICogSW5pdGlhbGl6ZSBhbGwgcGFkIGZvcm1hdHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gSWYgZmggaXMgbm90IE5VTEwsIHRyeQorICogZm9ybWF0cyBhcmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZpbGUgaGFuZGxlLiBPdGhlcndpc2UgYWN0aXZlIGZvcm1hdHMgYXJlCisgKiBpbml0aWFsaXplZCBvbiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGlwaXBlaWZfaW5pdF9mb3JtYXRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0IGZvcm1hdDsKKworCW1lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0KSk7CisJZm9ybWF0LnBhZCA9IElQSVBFSUZfUEFEX1NJTks7CisJZm9ybWF0LndoaWNoID0gZmggPyBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZIDogVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKKwlmb3JtYXQuZm9ybWF0LmNvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMDsKKwlmb3JtYXQuZm9ybWF0LndpZHRoID0gNDA5NjsKKwlmb3JtYXQuZm9ybWF0LmhlaWdodCA9IDQwOTY7CisJaXBpcGVpZl9zZXRfZm9ybWF0KHNkLCBmaCwgJmZvcm1hdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVjRMMiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgaXBpcGVpZl92NGwyX3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0gPSBpcGlwZWlmX3NldF9zdHJlYW0sCit9OworCisvKiBWNEwyIHN1YmRldiBwYWQgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIGlwaXBlaWZfdjRsMl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IGlwaXBlaWZfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IGlwaXBlaWZfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gaXBpcGVpZl9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gaXBpcGVpZl9zZXRfZm9ybWF0LAorCS5saW5rX3ZhbGlkYXRlID0gaXBpcGVpZl9saW5rX3ZhbGlkYXRlLAorfTsKKworLyogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaXBpcGVpZl92NGwyX29wcyA9IHsKKwkudmlkZW8gPSAmaXBpcGVpZl92NGwyX3ZpZGVvX29wcywKKwkucGFkID0gJmlwaXBlaWZfdjRsMl9wYWRfb3BzLAorfTsKKworLyogVjRMMiBzdWJkZXYgaW50ZXJuYWwgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgaXBpcGVpZl92NGwyX2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IGlwaXBlaWZfaW5pdF9mb3JtYXRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1lZGlhIGVudGl0eSBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIGlwaXBlaWZfbGlua19zZXR1cCAtIFNldHVwIElQSVBFSUYgY29ubmVjdGlvbnMKKyAqIEBlbnRpdHk6IElQSVBFSUYgbWVkaWEgZW50aXR5CisgKiBAbG9jYWw6IFBhZCBhdCB0aGUgbG9jYWwgZW5kIG9mIHRoZSBsaW5rCisgKiBAcmVtb3RlOiBQYWQgYXQgdGhlIHJlbW90ZSBlbmQgb2YgdGhlIGxpbmsKKyAqIEBmbGFnczogTGluayBmbGFncworICoKKyAqIHJldHVybiAtRUlOVkFMIG9yIHplcm8gb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGlwaXBlaWZfbGlua19zZXR1cChzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHksCisJCQkgICBjb25zdCBzdHJ1Y3QgbWVkaWFfcGFkICpsb2NhbCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBtZWRpYV9wYWQgKnJlbW90ZSwgdTMyIGZsYWdzKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYoZW50aXR5KTsKKwlzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UoaXBpcGVpZik7CisKKwlzd2l0Y2ggKGxvY2FsLT5pbmRleCB8IG1lZGlhX2VudGl0eV90eXBlKHJlbW90ZS0+ZW50aXR5KSkgeworCWNhc2UgSVBJUEVJRl9QQURfU0lOSyB8IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOgorCQkvKiBSZWFkIGZyb20gdGhlIHNlbnNvciBDU0kyYSBvciBDU0kyYi4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJCWlwaXBlaWYtPmlucHV0ID0gSVBJUEVJRl9JTlBVVF9OT05FOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaXBpcGVpZi0+aW5wdXQgIT0gSVBJUEVJRl9JTlBVVF9OT05FKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAocmVtb3RlLT5lbnRpdHkgPT0gJmlzcy0+Y3NpMmEuc3ViZGV2LmVudGl0eSkKKwkJCWlwaXBlaWYtPmlucHV0ID0gSVBJUEVJRl9JTlBVVF9DU0kyQTsKKwkJZWxzZSBpZiAocmVtb3RlLT5lbnRpdHkgPT0gJmlzcy0+Y3NpMmIuc3ViZGV2LmVudGl0eSkKKwkJCWlwaXBlaWYtPmlucHV0ID0gSVBJUEVJRl9JTlBVVF9DU0kyQjsKKworCQlicmVhazsKKworCWNhc2UgSVBJUEVJRl9QQURfU09VUkNFX0lTSUZfU0YgfCBNRURJQV9FTlRfVF9ERVZOT0RFOgorCQkvKiBXcml0ZSB0byBtZW1vcnkgKi8KKwkJaWYgKGZsYWdzICYgTUVESUFfTE5LX0ZMX0VOQUJMRUQpIHsKKwkJCWlmIChpcGlwZWlmLT5vdXRwdXQgJiB+SVBJUEVJRl9PVVRQVVRfTUVNT1JZKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlpcGlwZWlmLT5vdXRwdXQgfD0gSVBJUEVJRl9PVVRQVVRfTUVNT1JZOworCQl9IGVsc2UgeworCQkJaXBpcGVpZi0+b3V0cHV0ICY9IH5JUElQRUlGX09VVFBVVF9NRU1PUlk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElQSVBFSUZfUEFEX1NPVVJDRV9WUCB8IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOgorCQkvKiBTZW5kIHRvIElQSVBFL1JFU0laRVIgKi8KKwkJaWYgKGZsYWdzICYgTUVESUFfTE5LX0ZMX0VOQUJMRUQpIHsKKwkJCWlmIChpcGlwZWlmLT5vdXRwdXQgJiB+SVBJUEVJRl9PVVRQVVRfVlApCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWlwaXBlaWYtPm91dHB1dCB8PSBJUElQRUlGX09VVFBVVF9WUDsKKwkJfSBlbHNlIHsKKwkJCWlwaXBlaWYtPm91dHB1dCAmPSB+SVBJUEVJRl9PVVRQVVRfVlA7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogbWVkaWEgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtZWRpYV9lbnRpdHlfb3BlcmF0aW9ucyBpcGlwZWlmX21lZGlhX29wcyA9IHsKKwkubGlua19zZXR1cCA9IGlwaXBlaWZfbGlua19zZXR1cCwKKwkubGlua192YWxpZGF0ZSA9IHY0bDJfc3ViZGV2X2xpbmtfdmFsaWRhdGUsCit9OworCisvKgorICogaXBpcGVpZl9pbml0X2VudGl0aWVzIC0gSW5pdGlhbGl6ZSBWNEwyIHN1YmRldiBhbmQgbWVkaWEgZW50aXR5CisgKiBAaXBpcGVpZjogSVNTIElTUCBJUElQRUlGIG1vZHVsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGlwaXBlaWZfaW5pdF9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmaXBpcGVpZi0+c3ViZGV2OworCXN0cnVjdCBtZWRpYV9wYWQgKnBhZHMgPSBpcGlwZWlmLT5wYWRzOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lID0gJnNkLT5lbnRpdHk7CisJaW50IHJldDsKKworCWlwaXBlaWYtPmlucHV0ID0gSVBJUEVJRl9JTlBVVF9OT05FOworCisJdjRsMl9zdWJkZXZfaW5pdChzZCwgJmlwaXBlaWZfdjRsMl9vcHMpOworCXNkLT5pbnRlcm5hbF9vcHMgPSAmaXBpcGVpZl92NGwyX2ludGVybmFsX29wczsKKwlzdHJsY3B5KHNkLT5uYW1lLCAiT01BUDQgSVNTIElTUCBJUElQRUlGIiwgc2l6ZW9mKHNkLT5uYW1lKSk7CisJc2QtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Mgc3ViZGV2cyAqLworCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGlwaXBlaWYpOworCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXBhZHNbSVBJUEVJRl9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlwYWRzW0lQSVBFSUZfUEFEX1NPVVJDRV9JU0lGX1NGXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJcGFkc1tJUElQRUlGX1BBRF9TT1VSQ0VfVlBdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKworCW1lLT5vcHMgPSAmaXBpcGVpZl9tZWRpYV9vcHM7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQobWUsIElQSVBFSUZfUEFEU19OVU0sIHBhZHMsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaXBpcGVpZl9pbml0X2Zvcm1hdHMoc2QsIE5VTEwpOworCisJaXBpcGVpZi0+dmlkZW9fb3V0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJaXBpcGVpZi0+dmlkZW9fb3V0Lm9wcyA9ICZpcGlwZWlmX3ZpZGVvX29wczsKKwlpcGlwZWlmLT52aWRlb19vdXQuaXNzID0gdG9faXNzX2RldmljZShpcGlwZWlmKTsKKwlpcGlwZWlmLT52aWRlb19vdXQuY2FwdHVyZV9tZW0gPSBQQUdFX0FMSUdOKDQwOTYgKiA0MDk2KSAqIDM7CisJaXBpcGVpZi0+dmlkZW9fb3V0LmJwbF9hbGlnbm1lbnQgPSAzMjsKKwlpcGlwZWlmLT52aWRlb19vdXQuYnBsX3plcm9fcGFkZGluZyA9IDE7CisJaXBpcGVpZi0+dmlkZW9fb3V0LmJwbF9tYXggPSAweDFmZmUwOworCisJcmV0ID0gb21hcDRpc3NfdmlkZW9faW5pdCgmaXBpcGVpZi0+dmlkZW9fb3V0LCAiSVNQIElQSVBFSUYiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvbm5lY3QgdGhlIElQSVBFSUYgc3ViZGV2IHRvIHRoZSB2aWRlbyBub2RlLiAqLworCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmaXBpcGVpZi0+c3ViZGV2LmVudGl0eSwKKwkJCQkgICAgICAgSVBJUEVJRl9QQURfU09VUkNFX0lTSUZfU0YsCisJCQkJICAgICAgICZpcGlwZWlmLT52aWRlb19vdXQudmlkZW8uZW50aXR5LCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXA0aXNzX2lwaXBlaWZfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmKQoreworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZpcGlwZWlmLT5zdWJkZXYuZW50aXR5KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZpcGlwZWlmLT5zdWJkZXYpOworCW9tYXA0aXNzX3ZpZGVvX3VucmVnaXN0ZXIoJmlwaXBlaWYtPnZpZGVvX291dCk7Cit9CisKK2ludCBvbWFwNGlzc19pcGlwZWlmX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsCisJc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2RlLiAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2ZGV2LCAmaXBpcGVpZi0+c3ViZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9tYXA0aXNzX3ZpZGVvX3JlZ2lzdGVyKCZpcGlwZWlmLT52aWRlb19vdXQsIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW9tYXA0aXNzX2lwaXBlaWZfdW5yZWdpc3Rlcl9lbnRpdGllcyhpcGlwZWlmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNQIElQSVBFSUYgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKKyAqLworCisvKgorICogb21hcDRpc3NfaXBpcGVpZl9pbml0IC0gSVBJUEVJRiBtb2R1bGUgaW5pdGlhbGl6YXRpb24uCisgKiBAaXNzOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDQgSVNTLgorICoKKyAqIFRPRE86IEdldCB0aGUgaW5pdGlhbGlzYXRpb24gdmFsdWVzIGZyb20gcGxhdGZvcm0gZGF0YS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBvbWFwNGlzc19pcGlwZWlmX2luaXQoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmID0gJmlzcy0+aXBpcGVpZjsKKworCWlwaXBlaWYtPnN0YXRlID0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlwaXBlaWYtPndhaXQpOworCisJcmV0dXJuIGlwaXBlaWZfaW5pdF9lbnRpdGllcyhpcGlwZWlmKTsKK30KKworLyoKKyAqIG9tYXA0aXNzX2lwaXBlaWZfY2xlYW51cCAtIElQSVBFSUYgbW9kdWxlIGNsZWFudXAuCisgKiBAaXNzOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDQgSVNTLgorICovCit2b2lkIG9tYXA0aXNzX2lwaXBlaWZfY2xlYW51cChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCS8qIEZJWE1FOiBhcmUgeW91IHN1cmUgdGhlcmUncyBub3RoaW5nIHRvIGRvPyAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19pcGlwZWlmLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX2lwaXBlaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRjY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19pcGlwZWlmLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIElTUCBJUElQRUlGIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBPTUFQNF9JU1NfSVBJUEVJRl9ICisjZGVmaW5lIE9NQVA0X0lTU19JUElQRUlGX0gKKworI2luY2x1ZGUgImlzc192aWRlby5oIgorCitlbnVtIGlwaXBlaWZfaW5wdXRfZW50aXR5IHsKKwlJUElQRUlGX0lOUFVUX05PTkUsCisJSVBJUEVJRl9JTlBVVF9DU0kyQSwKKwlJUElQRUlGX0lOUFVUX0NTSTJCCit9OworCisjZGVmaW5lIElQSVBFSUZfT1VUUFVUX01FTU9SWQkJKDEgPDwgMCkKKyNkZWZpbmUgSVBJUEVJRl9PVVRQVVRfVlAJCSgxIDw8IDEpCisKKy8qIFNpbmsgYW5kIHNvdXJjZSBJUElQRUlGIHBhZHMgKi8KKyNkZWZpbmUgSVBJUEVJRl9QQURfU0lOSwkJCTAKKyNkZWZpbmUgSVBJUEVJRl9QQURfU09VUkNFX0lTSUZfU0YJCTEKKyNkZWZpbmUgSVBJUEVJRl9QQURfU09VUkNFX1ZQCQkJMgorI2RlZmluZSBJUElQRUlGX1BBRFNfTlVNCQkJMworCisvKgorICogc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAtIFN0cnVjdHVyZSBmb3IgdGhlIElQSVBFSUYgbW9kdWxlIHRvIHN0b3JlIGl0cyBvd24KKyAqCQkJICAgIGluZm9ybWF0aW9uCisgKiBAc3ViZGV2OiBWNEwyIHN1YmRldmljZQorICogQHBhZHM6IFNpbmsgYW5kIHNvdXJjZSBtZWRpYSBlbnRpdHkgcGFkcworICogQGZvcm1hdHM6IEFjdGl2ZSB2aWRlbyBmb3JtYXRzCisgKiBAaW5wdXQ6IEFjdGl2ZSBpbnB1dAorICogQG91dHB1dDogQWN0aXZlIG91dHB1dHMKKyAqIEB2aWRlb19vdXQ6IE91dHB1dCB2aWRlbyBub2RlCisgKiBAZXJyb3I6IEEgaGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNhcHR1cmUKKyAqIEBhbGF3OiBBLWxhdyBjb21wcmVzc2lvbiBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqIEBscGY6IExvdyBwYXNzIGZpbHRlciBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqIEBvYmNsYW1wOiBPcHRpY2FsLWJsYWNrIGNsYW1wIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogQGZwY19lbjogRmF1bHR5IHBpeGVscyBjb3JyZWN0aW9uIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogQGJsY29tcDogQmxhY2sgbGV2ZWwgY29tcGVuc2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIEBjbGFtcDogT3B0aWNhbC1ibGFjayBvciBkaWdpdGFsIGNsYW1wIGNvbmZpZ3VyYXRpb24KKyAqIEBmcGM6IEZhdWx0eSBwaXhlbHMgY29ycmVjdGlvbiBjb25maWd1cmF0aW9uCisgKiBAbHNjOiBMZW5zIHNoYWRpbmcgY29tcGVuc2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIEB1cGRhdGU6IEJpdG1hc2sgb2YgY29udHJvbHMgdG8gdXBkYXRlIGR1cmluZyB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqIEBzaGFkb3dfdXBkYXRlOiBDb250cm9scyB1cGRhdGUgaW4gcHJvZ3Jlc3MgYnkgdXNlcnNwYWNlCisgKiBAc3luY2lmOiBJbnRlcmZhY2Ugc3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIEB2cGNmZzogVmlkZW8gcG9ydCBjb25maWd1cmF0aW9uCisgKiBAdW5kZXJydW46IEEgYnVmZmVyIHVuZGVycnVuIG9jY3VycmVkIGFuZCBhIG5ldyBidWZmZXIgaGFzIGJlZW4gcXVldWVkCisgKiBAc3RhdGU6IFN0cmVhbWluZyBzdGF0ZQorICogQGxvY2s6IFNlcmlhbGl6ZXMgc2hhZG93X3VwZGF0ZSB3aXRoIGludGVycnVwdCBoYW5kbGVyCisgKiBAd2FpdDogV2FpdCBxdWV1ZSB1c2VkIHRvIHN0b3AgdGhlIG1vZHVsZQorICogQHN0b3BwaW5nOiBTdG9wcGluZyBzdGF0ZQorICogQGlvY3RsX2xvY2s6IFNlcmlhbGl6ZXMgaW9jdGwgY2FsbHMgYW5kIExTQyByZXF1ZXN0cyBmcmVlaW5nCisgKi8KK3N0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZCBwYWRzW0lQSVBFSUZfUEFEU19OVU1dOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0c1tJUElQRUlGX1BBRFNfTlVNXTsKKworCWVudW0gaXBpcGVpZl9pbnB1dF9lbnRpdHkgaW5wdXQ7CisJdW5zaWduZWQgaW50IG91dHB1dDsKKwlzdHJ1Y3QgaXNzX3ZpZGVvIHZpZGVvX291dDsKKwl1bnNpZ25lZCBpbnQgZXJyb3I7CisKKwllbnVtIGlzc19waXBlbGluZV9zdHJlYW1fc3RhdGUgc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwlhdG9taWNfdCBzdG9wcGluZzsKK307CisKK3N0cnVjdCBpc3NfZGV2aWNlOworCitpbnQgb21hcDRpc3NfaXBpcGVpZl9pbml0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOwordm9pZCBvbWFwNGlzc19pcGlwZWlmX2NsZWFudXAoc3RydWN0IGlzc19kZXZpY2UgKmlzcyk7CitpbnQgb21hcDRpc3NfaXBpcGVpZl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmLAorCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldik7Cit2b2lkIG9tYXA0aXNzX2lwaXBlaWZfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmKTsKKworaW50IG9tYXA0aXNzX2lwaXBlaWZfYnVzeShzdHJ1Y3QgaXNzX2lwaXBlaWZfZGV2aWNlICppcGlwZWlmKTsKK3ZvaWQgb21hcDRpc3NfaXBpcGVpZl9pc3Ioc3RydWN0IGlzc19pcGlwZWlmX2RldmljZSAqaXBpcGVpZiwgdTMyIGV2ZW50cyk7Cit2b2lkIG9tYXA0aXNzX2lwaXBlaWZfcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOwordm9pZCBvbWFwNGlzc19pcGlwZWlmX21heF9yYXRlKHN0cnVjdCBpc3NfaXBpcGVpZl9kZXZpY2UgKmlwaXBlaWYsCisJdW5zaWduZWQgaW50ICptYXhfcmF0ZSk7CisKKyNlbmRpZgkvKiBPTUFQNF9JU1NfSVBJUEVJRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3JlZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDAyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3JlZ3MuaApAQCAtMCwwICsxLDkwMSBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIFJlZ2lzdGVyIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogQXV0aG9yOiBTZXJnaW8gQWd1aXJyZSA8c2VyZ2lvLmEuYWd1aXJyZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9PTUFQNF9JU1NfUkVHU19IXworI2RlZmluZSBfT01BUDRfSVNTX1JFR1NfSF8KKworLyogSVNTICovCisjZGVmaW5lIElTU19ITF9SRVZJU0lPTgkJCQkJMHgwCisKKyNkZWZpbmUgSVNTX0hMX1NZU0NPTkZJRwkJCQkweDEwCisjZGVmaW5lIElTU19ITF9TWVNDT05GSUdfSURMRU1PREVfU0hJRlQJCQkyCisjZGVmaW5lIElTU19ITF9TWVNDT05GSUdfSURMRU1PREVfRk9SQ0VJRExFCQkweDAKKyNkZWZpbmUgSVNTX0hMX1NZU0NPTkZJR19JRExFTU9ERV9OT0lETEUJCTB4MQorI2RlZmluZSBJU1NfSExfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJUSURMRQkJMHgyCisjZGVmaW5lIElTU19ITF9TWVNDT05GSUdfU09GVFJFU0VUCQkJKDEgPDwgMCkKKworI2RlZmluZSBJU1NfSExfSVJRU1RBVFVTX1JBVyhpKQkJCQkoMHgyMCArICgweDEwICogKGkpKSkKKyNkZWZpbmUgSVNTX0hMX0lSUVNUQVRVUyhpKQkJCQkoMHgyNCArICgweDEwICogKGkpKSkKKyNkZWZpbmUgSVNTX0hMX0lSUUVOQUJMRV9TRVQoaSkJCQkJKDB4MjggKyAoMHgxMCAqIChpKSkpCisjZGVmaW5lIElTU19ITF9JUlFFTkFCTEVfQ0xSKGkpCQkJCSgweDJjICsgKDB4MTAgKiAoaSkpKQorCisjZGVmaW5lIElTU19ITF9JUlFfSFNfVlMJCQkJKDEgPDwgMTcpCisjZGVmaW5lIElTU19ITF9JUlFfU0lNQ09QKGkpCQkJCSgxIDw8ICgxMiArIChpKSkpCisjZGVmaW5lIElTU19ITF9JUlFfQlRFCQkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgSVNTX0hMX0lSUV9DQlVGRgkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgSVNTX0hMX0lSUV9DQ1AyKGkpCQkJCSgxIDw8ICgoaSkgPiAzID8gMTYgOiAxNCArIChpKSkpCisjZGVmaW5lIElTU19ITF9JUlFfQ1NJQgkJCQkJKDEgPDwgNSkKKyNkZWZpbmUgSVNTX0hMX0lSUV9DU0lBCQkJCQkoMSA8PCA0KQorI2RlZmluZSBJU1NfSExfSVJRX0lTUChpKQkJCQkoMSA8PCAoaSkpCisKKyNkZWZpbmUgSVNTX0NUUkwJCQkJCTB4ODAKKyNkZWZpbmUgSVNTX0NUUkxfQ0xLX0RJVl9NQVNLCQkJCSgzIDw8IDQpCisjZGVmaW5lIElTU19DVFJMX0lOUFVUX1NFTF9NQVNLCQkJCSgzIDw8IDIpCisjZGVmaW5lIElTU19DVFJMX0lOUFVUX1NFTF9DU0kyQQkJCSgwIDw8IDIpCisjZGVmaW5lIElTU19DVFJMX0lOUFVUX1NFTF9DU0kyQgkJCSgxIDw8IDIpCisjZGVmaW5lIElTU19DVFJMX1NZTkNfREVURUNUX1ZTX1JBSVNJTkcJCQkoMyA8PCAwKQorCisjZGVmaW5lIElTU19DTEtDVFJMCQkJCQkweDg0CisjZGVmaW5lIElTU19DTEtDVFJMX1ZQT1JUMl9DTEsJCQkJKDEgPDwgMzApCisjZGVmaW5lIElTU19DTEtDVFJMX1ZQT1JUMV9DTEsJCQkJKDEgPDwgMjkpCisjZGVmaW5lIElTU19DTEtDVFJMX1ZQT1JUMF9DTEsJCQkJKDEgPDwgMjgpCisjZGVmaW5lIElTU19DTEtDVFJMX0NDUDIJCQkJKDEgPDwgNCkKKyNkZWZpbmUgSVNTX0NMS0NUUkxfQ1NJMl9CCQkJCSgxIDw8IDMpCisjZGVmaW5lIElTU19DTEtDVFJMX0NTSTJfQQkJCQkoMSA8PCAyKQorI2RlZmluZSBJU1NfQ0xLQ1RSTF9JU1AJCQkJCSgxIDw8IDEpCisjZGVmaW5lIElTU19DTEtDVFJMX1NJTUNPUAkJCQkoMSA8PCAwKQorCisjZGVmaW5lIElTU19DTEtTVEFUCQkJCQkweDg4CisjZGVmaW5lIElTU19DTEtTVEFUX1ZQT1JUMl9DTEsJCQkJKDEgPDwgMzApCisjZGVmaW5lIElTU19DTEtTVEFUX1ZQT1JUMV9DTEsJCQkJKDEgPDwgMjkpCisjZGVmaW5lIElTU19DTEtTVEFUX1ZQT1JUMF9DTEsJCQkJKDEgPDwgMjgpCisjZGVmaW5lIElTU19DTEtTVEFUX0NDUDIJCQkJKDEgPDwgNCkKKyNkZWZpbmUgSVNTX0NMS1NUQVRfQ1NJMl9CCQkJCSgxIDw8IDMpCisjZGVmaW5lIElTU19DTEtTVEFUX0NTSTJfQQkJCQkoMSA8PCAyKQorI2RlZmluZSBJU1NfQ0xLU1RBVF9JU1AJCQkJCSgxIDw8IDEpCisjZGVmaW5lIElTU19DTEtTVEFUX1NJTUNPUAkJCQkoMSA8PCAwKQorCisjZGVmaW5lIElTU19QTV9TVEFUVVMJCQkJCTB4OGMKKyNkZWZpbmUgSVNTX1BNX1NUQVRVU19DQlVGRl9QTV9NQVNLCQkJKDMgPDwgMTIpCisjZGVmaW5lIElTU19QTV9TVEFUVVNfQlRFX1BNX01BU0sJCQkoMyA8PCAxMCkKKyNkZWZpbmUgSVNTX1BNX1NUQVRVU19TSU1DT1BfUE1fTUFTSwkJCSgzIDw8IDgpCisjZGVmaW5lIElTU19QTV9TVEFUVVNfSVNQX1BNX01BU0sJCQkoMyA8PCA2KQorI2RlZmluZSBJU1NfUE1fU1RBVFVTX0NDUDJfUE1fTUFTSwkJCSgzIDw8IDQpCisjZGVmaW5lIElTU19QTV9TVEFUVVNfQ1NJMl9CX1BNX01BU0sJCQkoMyA8PCAyKQorI2RlZmluZSBJU1NfUE1fU1RBVFVTX0NTSTJfQV9QTV9NQVNLCQkJKDMgPDwgMCkKKworI2RlZmluZSBSRUdJU1RFUjAJCQkJCTB4MAorI2RlZmluZSBSRUdJU1RFUjBfSFNDTE9DS0NPTkZJRwkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgUkVHSVNURVIwX1RIU19URVJNX01BU0sJCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgUkVHSVNURVIwX1RIU19URVJNX1NISUZUCQkJOAorI2RlZmluZSBSRUdJU1RFUjBfVEhTX1NFVFRMRV9NQVNLCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgUkVHSVNURVIwX1RIU19TRVRUTEVfU0hJRlQJCQkwCisKKyNkZWZpbmUgUkVHSVNURVIxCQkJCQkweDQKKyNkZWZpbmUgUkVHSVNURVIxX1JFU0VUX0RPTkVfQ1RSTENMSwkJCSgxIDw8IDI5KQorI2RlZmluZSBSRUdJU1RFUjFfQ0xPQ0tfTUlTU19ERVRFQ1RPUl9TVEFUVVMJCSgxIDw8IDI1KQorI2RlZmluZSBSRUdJU1RFUjFfVENMS19URVJNX01BU0sJCQkoMHgzZiA8PCAxOCkKKyNkZWZpbmUgUkVHSVNURVIxX1RDTEtfVEVSTV9TSElGVAkJCTE4CisjZGVmaW5lIFJFR0lTVEVSMV9EUEhZX0hTX1NZTkNfUEFUVEVSTl9TSElGVAkJMTAKKyNkZWZpbmUgUkVHSVNURVIxX0NUUkxDTEtfRElWX0ZBQ1RPUl9NQVNLCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJFR0lTVEVSMV9DVFJMQ0xLX0RJVl9GQUNUT1JfU0hJRlQJCTgKKyNkZWZpbmUgUkVHSVNURVIxX1RDTEtfU0VUVExFX01BU0sJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBSRUdJU1RFUjFfVENMS19TRVRUTEVfU0hJRlQJCQkwCisKKyNkZWZpbmUgUkVHSVNURVIyCQkJCQkweDgKKworI2RlZmluZSBDU0kyX1NZU0NPTkZJRwkJCQkJMHgxMAorI2RlZmluZSBDU0kyX1NZU0NPTkZJR19NU1RBTkRCWV9NT0RFX01BU0sJCSgzIDw8IDEyKQorI2RlZmluZSBDU0kyX1NZU0NPTkZJR19NU1RBTkRCWV9NT0RFX0ZPUkNFCQkoMCA8PCAxMikKKyNkZWZpbmUgQ1NJMl9TWVNDT05GSUdfTVNUQU5EQllfTU9ERV9OTwkJCSgxIDw8IDEyKQorI2RlZmluZSBDU0kyX1NZU0NPTkZJR19NU1RBTkRCWV9NT0RFX1NNQVJUCQkoMiA8PCAxMikKKyNkZWZpbmUgQ1NJMl9TWVNDT05GSUdfU09GVF9SRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lIENTSTJfU1lTQ09ORklHX0FVVE9fSURMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ1NJMl9TWVNTVEFUVVMJCQkJCTB4MTQKKyNkZWZpbmUgQ1NJMl9TWVNTVEFUVVNfUkVTRVRfRE9ORQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ1NJMl9JUlFTVEFUVVMJCQkJCTB4MTgKKyNkZWZpbmUgQ1NJMl9JUlFFTkFCTEUJCQkJCTB4MWMKKworLyogU2hhcmVkIGJpdHMgYWNyb3NzIENTSTJfSVJRRU5BQkxFIGFuZCBJUlFTVEFUVVMgKi8KKworI2RlZmluZSBDU0kyX0lSUV9PQ1BfRVJSCQkJCSgxIDw8IDE0KQorI2RlZmluZSBDU0kyX0lSUV9TSE9SVF9QQUNLRVQJCQkJKDEgPDwgMTMpCisjZGVmaW5lIENTSTJfSVJRX0VDQ19DT1JSRUNUSU9OCQkJCSgxIDw8IDEyKQorI2RlZmluZSBDU0kyX0lSUV9FQ0NfTk9fQ09SUkVDVElPTgkJCSgxIDw8IDExKQorI2RlZmluZSBDU0kyX0lSUV9DT01QTEVYSU9fRVJSCQkJCSgxIDw8IDkpCisjZGVmaW5lIENTSTJfSVJRX0ZJRk9fT1ZGCQkJCSgxIDw8IDgpCisjZGVmaW5lIENTSTJfSVJRX0NPTlRFWFQwCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ1NJMl9DVFJMCQkJCQkweDQwCisjZGVmaW5lIENTSTJfQ1RSTF9NRkxBR19MRVZIX01BU0sJCQkoNyA8PCAyMCkKKyNkZWZpbmUgQ1NJMl9DVFJMX01GTEFHX0xFVkhfU0hJRlQJCQkyMAorI2RlZmluZSBDU0kyX0NUUkxfTUZMQUdfTEVWTF9NQVNLCQkJKDcgPDwgMTcpCisjZGVmaW5lIENTSTJfQ1RSTF9NRkxBR19MRVZMX1NISUZUCQkJMTcKKyNkZWZpbmUgQ1NJMl9DVFJMX0JVUlNUX1NJWkVfRVhQQU5ECQkJKDEgPDwgMTYpCisjZGVmaW5lIENTSTJfQ1RSTF9WUF9DTEtfRU4JCQkJKDEgPDwgMTUpCisjZGVmaW5lIENTSTJfQ1RSTF9OT05fUE9TVEVEX1dSSVRFCQkJKDEgPDwgMTMpCisjZGVmaW5lIENTSTJfQ1RSTF9WUF9PTkxZX0VOCQkJCSgxIDw8IDExKQorI2RlZmluZSBDU0kyX0NUUkxfVlBfT1VUX0NUUkxfTUFTSwkJCSgzIDw8IDgpCisjZGVmaW5lIENTSTJfQ1RSTF9WUF9PVVRfQ1RSTF9TSElGVAkJCTgKKyNkZWZpbmUgQ1NJMl9DVFJMX0RCR19FTgkJCQkoMSA8PCA3KQorI2RlZmluZSBDU0kyX0NUUkxfQlVSU1RfU0laRV9NQVNLCQkJKDMgPDwgNSkKKyNkZWZpbmUgQ1NJMl9DVFJMX0VORElBTk5FU1MJCQkJKDEgPDwgNCkKKyNkZWZpbmUgQ1NJMl9DVFJMX0ZSQU1FCQkJCQkoMSA8PCAzKQorI2RlZmluZSBDU0kyX0NUUkxfRUNDX0VOCQkJCSgxIDw8IDIpCisjZGVmaW5lIENTSTJfQ1RSTF9JRl9FTgkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBDU0kyX0RCR19ICQkJCQkweDQ0CisKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHCQkJCTB4NTAKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX1JFU0VUX0NUUkwJCQkoMSA8PCAzMCkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX1JFU0VUX0RPTkUJCQkoMSA8PCAyOSkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX1BXRF9DTURfTUFTSwkJCSgzIDw8IDI3KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfUFdEX0NNRF9PRkYJCQkoMCA8PCAyNykKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX1BXRF9DTURfT04JCQkoMSA8PCAyNykKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX1BXRF9DTURfVUxQCQkJKDIgPDwgMjcpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0NGR19QV0RfU1RBVFVTX01BU0sJCSgzIDw8IDI1KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfUFdEX1NUQVRVU19PRkYJCSgwIDw8IDI1KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfUFdEX1NUQVRVU19PTgkJKDEgPDwgMjUpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0NGR19QV0RfU1RBVFVTX1VMUAkJKDIgPDwgMjUpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0NGR19QV1JfQVVUTwkJCSgxIDw8IDI0KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfREFUQV9QT0woaSkJCQkoMSA8PCAoKChpKSAqIDQpICsgMykpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0NGR19EQVRBX1BPU0lUSU9OX01BU0soaSkJKDcgPDwgKChpKSAqIDQpKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfREFUQV9QT1NJVElPTl9TSElGVChpKQkoKGkpICogNCkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fQ0ZHX0NMT0NLX1BPTAkJCSgxIDw8IDMpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0NGR19DTE9DS19QT1NJVElPTl9NQVNLCQkoNyA8PCAwKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19DRkdfQ0xPQ0tfUE9TSVRJT05fU0hJRlQJCTAKKworI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFTVEFUVVMJCQkweDU0CisKKyNkZWZpbmUgQ1NJMl9TSE9SVF9QQUNLRVQJCQkJMHg1YworCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUUVOQUJMRQkJCTB4NjAKKworLyogU2hhcmVkIGJpdHMgYWNyb3NzIENTSTJfQ09NUExFWElPX0lSUUVOQUJMRSBhbmQgSVJRU1RBVFVTICovCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9TVEFURUFMTFVMUE1FWElUCQkoMSA8PCAyNikKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFQUxMVUxQTUVOVEVSCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTUJCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTQJCQkoMSA8PCAyMykKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTMJCQkoMSA8PCAyMikKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTIJCQkoMSA8PCAyMSkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX1NUQVRFVUxQTTEJCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkNPTlRST0w1CQkJKDEgPDwgMTkpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9FUlJDT05UUk9MNAkJCSgxIDw8IDE4KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSQ09OVFJPTDMJCQkoMSA8PCAxNykKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX0VSUkNPTlRST0wyCQkJKDEgPDwgMTYpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9FUlJDT05UUk9MMQkJCSgxIDw8IDE1KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDNQkJCSgxIDw8IDE0KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDNAkJCSgxIDw8IDEzKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDMwkJCSgxIDw8IDEyKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDMgkJCSgxIDw8IDExKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSRVNDMQkJCSgxIDw8IDEwKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09UU1lOQ0hTNQkJKDEgPDwgOSkKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVFNZTkNIUzQJCSgxIDw8IDgpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RTWU5DSFMzCQkoMSA8PCA3KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09UU1lOQ0hTMgkJKDEgPDwgNikKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVFNZTkNIUzEJCSgxIDw8IDUpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RIUzUJCQkoMSA8PCA0KQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09USFM0CQkJKDEgPDwgMykKKyNkZWZpbmUgQ1NJMl9DT01QTEVYSU9fSVJRX0VSUlNPVEhTMwkJCSgxIDw8IDIpCisjZGVmaW5lIENTSTJfQ09NUExFWElPX0lSUV9FUlJTT1RIUzIJCQkoMSA8PCAxKQorI2RlZmluZSBDU0kyX0NPTVBMRVhJT19JUlFfRVJSU09USFMxCQkJKDEgPDwgMCkKKworI2RlZmluZSBDU0kyX0RCR19QCQkJCQkweDY4CisKKyNkZWZpbmUgQ1NJMl9USU1JTkcJCQkJCTB4NmMKKyNkZWZpbmUgQ1NJMl9USU1JTkdfRk9SQ0VfUlhfTU9ERV9JTzEJCQkoMSA8PCAxNSkKKyNkZWZpbmUgQ1NJMl9USU1JTkdfU1RPUF9TVEFURV9YMTZfSU8xCQkJKDEgPDwgMTQpCisjZGVmaW5lIENTSTJfVElNSU5HX1NUT1BfU1RBVEVfWDRfSU8xCQkJKDEgPDwgMTMpCisjZGVmaW5lIENTSTJfVElNSU5HX1NUT1BfU1RBVEVfQ09VTlRFUl9JTzFfTUFTSwkJKDB4MWZmZiA8PCAwKQorI2RlZmluZSBDU0kyX1RJTUlOR19TVE9QX1NUQVRFX0NPVU5URVJfSU8xX1NISUZUCTAKKworI2RlZmluZSBDU0kyX0NUWF9DVFJMMShpKQkJCQkoMHg3MCArICgweDIwICogaSkpCisjZGVmaW5lIENTSTJfQ1RYX0NUUkwxX0dFTkVSSUMJCQkJKDEgPDwgMzApCisjZGVmaW5lIENTSTJfQ1RYX0NUUkwxX1RSQU5TQ09ERQkJCSgweGYgPDwgMjQpCisjZGVmaW5lIENTSTJfQ1RYX0NUUkwxX0ZFQ19OVU1CRVJfTUFTSwkJCSgweGZmIDw8IDE2KQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMV9DT1VOVF9NQVNLCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDFfQ09VTlRfU0hJRlQJCQk4CisjZGVmaW5lIENTSTJfQ1RYX0NUUkwxX0VPRl9FTgkJCQkoMSA8PCA3KQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMV9FT0xfRU4JCQkJKDEgPDwgNikKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDFfQ1NfRU4JCQkJKDEgPDwgNSkKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDFfQ09VTlRfVU5MT0NLCQkJKDEgPDwgNCkKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDFfUElOR19QT05HCQkJKDEgPDwgMykKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDFfQ1RYX0VOCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDIoaSkJCQkJKDB4NzQgKyAoMHgyMCAqIGkpKQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMl9VU0VSX0RFRl9NQVBfU0hJRlQJCTEzCisjZGVmaW5lIENTSTJfQ1RYX0NUUkwyX1VTRVJfREVGX01BUF9NQVNLCQlcCisJCSgweDMgPDwgQ1NJMl9DVFhfQ1RSTDJfVVNFUl9ERUZfTUFQX1NISUZUKQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMl9WSVJUVUFMX0lEX01BU0sJCQkoMyA8PCAxMSkKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDJfVklSVFVBTF9JRF9TSElGVAkJCTExCisjZGVmaW5lIENTSTJfQ1RYX0NUUkwyX0RQQ01fUFJFRAkJCSgxIDw8IDEwKQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMl9GT1JNQVRfTUFTSwkJCSgweDNmZiA8PCAwKQorI2RlZmluZSBDU0kyX0NUWF9DVFJMMl9GT1JNQVRfU0hJRlQJCQkwCisKKyNkZWZpbmUgQ1NJMl9DVFhfREFUX09GU1QoaSkJCQkJKDB4NzggKyAoMHgyMCAqIGkpKQorI2RlZmluZSBDU0kyX0NUWF9EQVRfT0ZTVF9NQVNLCQkJCSgweGZmZiA8PCA1KQorCisjZGVmaW5lIENTSTJfQ1RYX1BJTkdfQUREUihpKQkJCQkoMHg3YyArICgweDIwICogaSkpCisjZGVmaW5lIENTSTJfQ1RYX1BJTkdfQUREUl9NQVNLCQkJCTB4ZmZmZmZmZTAKKworI2RlZmluZSBDU0kyX0NUWF9QT05HX0FERFIoaSkJCQkJKDB4ODAgKyAoMHgyMCAqIGkpKQorI2RlZmluZSBDU0kyX0NUWF9QT05HX0FERFJfTUFTSwkJCQlDU0kyX0NUWF9QSU5HX0FERFJfTUFTSworCisjZGVmaW5lIENTSTJfQ1RYX0lSUUVOQUJMRShpKQkJCQkoMHg4NCArICgweDIwICogaSkpCisjZGVmaW5lIENTSTJfQ1RYX0lSUVNUQVRVUyhpKQkJCQkoMHg4OCArICgweDIwICogaSkpCisKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDMoaSkJCQkJKDB4OGMgKyAoMHgyMCAqIGkpKQorI2RlZmluZSBDU0kyX0NUWF9DVFJMM19BTFBIQV9TSElGVAkJCTUKKyNkZWZpbmUgQ1NJMl9DVFhfQ1RSTDNfQUxQSEFfTUFTSwkJCVwKKwkJKDB4M2ZmZiA8PCBDU0kyX0NUWF9DVFJMM19BTFBIQV9TSElGVCkKKworLyogU2hhcmVkIGJpdHMgYWNyb3NzIENTSTJfQ1RYX0lSUUVOQUJMRSBhbmQgSVJRU1RBVFVTICovCisjZGVmaW5lIENTSTJfQ1RYX0lSUV9FQ0NfQ09SUkVDVElPTgkJCSgxIDw8IDgpCisjZGVmaW5lIENTSTJfQ1RYX0lSUV9MSU5FX05VTUJFUgkJCSgxIDw8IDcpCisjZGVmaW5lIENTSTJfQ1RYX0lSUV9GUkFNRV9OVU1CRVIJCQkoMSA8PCA2KQorI2RlZmluZSBDU0kyX0NUWF9JUlFfQ1MJCQkJCSgxIDw8IDUpCisjZGVmaW5lIENTSTJfQ1RYX0lSUV9MRQkJCQkJKDEgPDwgMykKKyNkZWZpbmUgQ1NJMl9DVFhfSVJRX0xTCQkJCQkoMSA8PCAyKQorI2RlZmluZSBDU0kyX0NUWF9JUlFfRkUJCQkJCSgxIDw8IDEpCisjZGVmaW5lIENTSTJfQ1RYX0lSUV9GUwkJCQkJKDEgPDwgMCkKKworLyogSVNTIEJURSAqLworI2RlZmluZSBCVEVfQ1RSTAkJCQkJKDB4MDAzMCkKKyNkZWZpbmUgQlRFX0NUUkxfQldfTElNSVRFUl9NQVNLCQkJKDB4M2ZmIDw8IDIyKQorI2RlZmluZSBCVEVfQ1RSTF9CV19MSU1JVEVSX1NISUZUCQkJMjIKKworLyogSVNTIElTUF9TWVMxICovCisjZGVmaW5lIElTUDVfUkVWSVNJT04JCQkJCSgweDAwMDApCisjZGVmaW5lIElTUDVfU1lTQ09ORklHCQkJCQkoMHgwMDEwKQorI2RlZmluZSBJU1A1X1NZU0NPTkZJR19TVEFOREJZTU9ERV9NQVNLCQkJKDMgPDwgNCkKKyNkZWZpbmUgSVNQNV9TWVNDT05GSUdfU1RBTkRCWU1PREVfRk9SQ0UJCSgwIDw8IDQpCisjZGVmaW5lIElTUDVfU1lTQ09ORklHX1NUQU5EQllNT0RFX05PCQkJKDEgPDwgNCkKKyNkZWZpbmUgSVNQNV9TWVNDT05GSUdfU1RBTkRCWU1PREVfU01BUlQJCSgyIDw8IDQpCisjZGVmaW5lIElTUDVfU1lTQ09ORklHX1NPRlRSRVNFVAkJCSgxIDw8IDEpCisKKyNkZWZpbmUgSVNQNV9JUlFTVEFUVVMoaSkJCQkJKDB4MDAyOCArICgweDEwICogKGkpKSkKKyNkZWZpbmUgSVNQNV9JUlFFTkFCTEVfU0VUKGkpCQkJCSgweDAwMmMgKyAoMHgxMCAqIChpKSkpCisjZGVmaW5lIElTUDVfSVJRRU5BQkxFX0NMUihpKQkJCQkoMHgwMDMwICsgKDB4MTAgKiAoaSkpKQorCisvKiBCaXRzIHNoYXJlZCBmb3IgSVNQNV9JUlEqIHJlZ2lzdGVycyAqLworI2RlZmluZSBJU1A1X0lSUV9PQ1BfRVJSCQkJCSgxIDw8IDMxKQorI2RlZmluZSBJU1A1X0lSUV9JUElQRV9JTlRfRFBDX1JORVcxCQkJKDEgPDwgMjkpCisjZGVmaW5lIElTUDVfSVJRX0lQSVBFX0lOVF9EUENfUk5FVzAJCQkoMSA8PCAyOCkKKyNkZWZpbmUgSVNQNV9JUlFfSVBJUEVfSU5UX0RQQ19JTklUCQkJKDEgPDwgMjcpCisjZGVmaW5lIElTUDVfSVJRX0lQSVBFX0lOVF9FT0YJCQkJKDEgPDwgMjUpCisjZGVmaW5lIElTUDVfSVJRX0gzQV9JTlRfRU9GCQkJCSgxIDw8IDI0KQorI2RlZmluZSBJU1A1X0lSUV9SU1pfSU5UX0VPRjEJCQkJKDEgPDwgMjMpCisjZGVmaW5lIElTUDVfSVJRX1JTWl9JTlRfRU9GMAkJCQkoMSA8PCAyMikKKyNkZWZpbmUgSVNQNV9JUlFfUlNaX0ZJRk9fSU5fQkxLX0VSUgkJCSgxIDw8IDE5KQorI2RlZmluZSBJU1A1X0lSUV9SU1pfRklGT19PVkYJCQkJKDEgPDwgMTgpCisjZGVmaW5lIElTUDVfSVJRX1JTWl9JTlRfQ1lDX1JTWkIJCQkoMSA8PCAxNykKKyNkZWZpbmUgSVNQNV9JUlFfUlNaX0lOVF9DWUNfUlNaQQkJCSgxIDw8IDE2KQorI2RlZmluZSBJU1A1X0lSUV9SU1pfSU5UX0RNQQkJCQkoMSA8PCAxNSkKKyNkZWZpbmUgSVNQNV9JUlFfUlNaX0lOVF9MQVNUX1BJWAkJCSgxIDw8IDE0KQorI2RlZmluZSBJU1A1X0lSUV9SU1pfSU5UX1JFRwkJCQkoMSA8PCAxMykKKyNkZWZpbmUgSVNQNV9JUlFfSDNBX0lOVAkJCQkoMSA8PCAxMikKKyNkZWZpbmUgSVNQNV9JUlFfQUZfSU5UCQkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgSVNQNV9JUlFfQUVXX0lOVAkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgSVNQNV9JUlFfSVBJUEVJRl9JUlEJCQkJKDEgPDwgOSkKKyNkZWZpbmUgSVNQNV9JUlFfSVBJUEVfSU5UX0hTVAkJCQkoMSA8PCA4KQorI2RlZmluZSBJU1A1X0lSUV9JUElQRV9JTlRfQlNDCQkJCSgxIDw8IDcpCisjZGVmaW5lIElTUDVfSVJRX0lQSVBFX0lOVF9ETUEJCQkJKDEgPDwgNikKKyNkZWZpbmUgSVNQNV9JUlFfSVBJUEVfSU5UX0xBU1RfUElYCQkJKDEgPDwgNSkKKyNkZWZpbmUgSVNQNV9JUlFfSVBJUEVfSU5UX1JFRwkJCQkoMSA8PCA0KQorI2RlZmluZSBJU1A1X0lSUV9JU0lGX0lOVChpKQkJCQkoMSA8PCAoaSkpCisKKyNkZWZpbmUgSVNQNV9DVFJMCQkJCQkoMHgwMDZjKQorI2RlZmluZSBJU1A1X0NUUkxfTVNUQU5EQlkJCQkJKDEgPDwgMjQpCisjZGVmaW5lIElTUDVfQ1RSTF9WRF9QVUxTRV9FWFQJCQkJKDEgPDwgMjMpCisjZGVmaW5lIElTUDVfQ1RSTF9NU1RBTkRCWV9XQUlUCQkJCSgxIDw8IDIwKQorI2RlZmluZSBJU1A1X0NUUkxfQkxfQ0xLX0VOQUJMRQkJCQkoMSA8PCAxNSkKKyNkZWZpbmUgSVNQNV9DVFJMX0lTSUZfQ0xLX0VOQUJMRQkJCSgxIDw8IDE0KQorI2RlZmluZSBJU1A1X0NUUkxfSDNBX0NMS19FTkFCTEUJCQkoMSA8PCAxMykKKyNkZWZpbmUgSVNQNV9DVFJMX1JTWl9DTEtfRU5BQkxFCQkJKDEgPDwgMTIpCisjZGVmaW5lIElTUDVfQ1RSTF9JUElQRV9DTEtfRU5BQkxFCQkJKDEgPDwgMTEpCisjZGVmaW5lIElTUDVfQ1RSTF9JUElQRUlGX0NMS19FTkFCTEUJCQkoMSA8PCAxMCkKKyNkZWZpbmUgSVNQNV9DVFJMX1NZTkNfRU5BQkxFCQkJCSgxIDw8IDkpCisjZGVmaW5lIElTUDVfQ1RSTF9QU1lOQ19DTEtfU0VMCQkJCSgxIDw8IDgpCisKKy8qIElTUyBJU1AgSVNJRiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIElTSUZfU1lOQ0VOCQkJCQkoMHgwMDAwKQorI2RlZmluZSBJU0lGX1NZTkNFTl9EV0VOCQkJCSgxIDw8IDEpCisjZGVmaW5lIElTSUZfU1lOQ0VOX1NZRU4JCQkJKDEgPDwgMCkKKworI2RlZmluZSBJU0lGX01PREVTRVQJCQkJCSgweDAwMDQpCisjZGVmaW5lIElTSUZfTU9ERVNFVF9JTlBNT0RfTUFTSwkJCSgzIDw8IDEyKQorI2RlZmluZSBJU0lGX01PREVTRVRfSU5QTU9EX1JBVwkJCQkoMCA8PCAxMikKKyNkZWZpbmUgSVNJRl9NT0RFU0VUX0lOUE1PRF9ZQ0JDUjE2CQkJKDEgPDwgMTIpCisjZGVmaW5lIElTSUZfTU9ERVNFVF9JTlBNT0RfWUNCQ1I4CQkJKDIgPDwgMTIpCisjZGVmaW5lIElTSUZfTU9ERVNFVF9DQ0RXX01BU0sJCQkJKDcgPDwgOCkKKyNkZWZpbmUgSVNJRl9NT0RFU0VUX0NDRFdfMkJJVAkJCQkoMiA8PCA4KQorI2RlZmluZSBJU0lGX01PREVTRVRfQ0NETUQJCQkJKDEgPDwgNykKKyNkZWZpbmUgSVNJRl9NT0RFU0VUX1NXRU4JCQkJKDEgPDwgNSkKKyNkZWZpbmUgSVNJRl9NT0RFU0VUX0hEUE9MCQkJCSgxIDw8IDMpCisjZGVmaW5lIElTSUZfTU9ERVNFVF9WRFBPTAkJCQkoMSA8PCAyKQorCisjZGVmaW5lIElTSUZfU1BICQkJCQkoMHgwMDE4KQorI2RlZmluZSBJU0lGX1NQSF9NQVNLCQkJCQkoMHg3ZmZmKQorCisjZGVmaW5lIElTSUZfTE5ICQkJCQkoMHgwMDFjKQorI2RlZmluZSBJU0lGX0xOSF9NQVNLCQkJCQkoMHg3ZmZmKQorCisjZGVmaW5lIElTSUZfTE5WCQkJCQkoMHgwMDI4KQorI2RlZmluZSBJU0lGX0xOVl9NQVNLCQkJCQkoMHg3ZmZmKQorCisjZGVmaW5lIElTSUZfSFNJWkUJCQkJCSgweDAwMzQpCisjZGVmaW5lIElTSUZfSFNJWkVfQURDUgkJCQkJKDEgPDwgMTIpCisjZGVmaW5lIElTSUZfSFNJWkVfSFNJWkVfTUFTSwkJCQkoMHhmZmYpCisKKyNkZWZpbmUgSVNJRl9DQURVCQkJCQkoMHgwMDNjKQorI2RlZmluZSBJU0lGX0NBRFVfTUFTSwkJCQkJKDB4N2ZmKQorCisjZGVmaW5lIElTSUZfQ0FETAkJCQkJKDB4MDA0MCkKKyNkZWZpbmUgSVNJRl9DQURMX01BU0sJCQkJCSgweGZmZmYpCisKKyNkZWZpbmUgSVNJRl9DQ09MUAkJCQkJKDB4MDA0YykKKyNkZWZpbmUgSVNJRl9DQ09MUF9DUDBfRjBfUgkJCQkoMCA8PCA2KQorI2RlZmluZSBJU0lGX0NDT0xQX0NQMF9GMF9HUgkJCQkoMSA8PCA2KQorI2RlZmluZSBJU0lGX0NDT0xQX0NQMF9GMF9CCQkJCSgzIDw8IDYpCisjZGVmaW5lIElTSUZfQ0NPTFBfQ1AwX0YwX0dCCQkJCSgyIDw8IDYpCisjZGVmaW5lIElTSUZfQ0NPTFBfQ1AxX0YwX1IJCQkJKDAgPDwgNCkKKyNkZWZpbmUgSVNJRl9DQ09MUF9DUDFfRjBfR1IJCQkJKDEgPDwgNCkKKyNkZWZpbmUgSVNJRl9DQ09MUF9DUDFfRjBfQgkJCQkoMyA8PCA0KQorI2RlZmluZSBJU0lGX0NDT0xQX0NQMV9GMF9HQgkJCQkoMiA8PCA0KQorI2RlZmluZSBJU0lGX0NDT0xQX0NQMl9GMF9SCQkJCSgwIDw8IDIpCisjZGVmaW5lIElTSUZfQ0NPTFBfQ1AyX0YwX0dSCQkJCSgxIDw8IDIpCisjZGVmaW5lIElTSUZfQ0NPTFBfQ1AyX0YwX0IJCQkJKDMgPDwgMikKKyNkZWZpbmUgSVNJRl9DQ09MUF9DUDJfRjBfR0IJCQkJKDIgPDwgMikKKyNkZWZpbmUgSVNJRl9DQ09MUF9DUDNfRjBfUgkJCQkoMCA8PCAwKQorI2RlZmluZSBJU0lGX0NDT0xQX0NQM19GMF9HUgkJCQkoMSA8PCAwKQorI2RlZmluZSBJU0lGX0NDT0xQX0NQM19GMF9CCQkJCSgzIDw8IDApCisjZGVmaW5lIElTSUZfQ0NPTFBfQ1AzX0YwX0dCCQkJCSgyIDw8IDApCisKKyNkZWZpbmUgSVNJRl9WRElOVChpKQkJCQkJKDB4MDA3MCArIChpKSAqIDQpCisjZGVmaW5lIElTSUZfVkRJTlRfTUFTSwkJCQkJKDB4N2ZmZikKKworI2RlZmluZSBJU0lGX0NHQU1NQVdECQkJCQkoMHgwMDgwKQorI2RlZmluZSBJU0lGX0NHQU1NQVdEX0dXRElfTUFTSwkJCQkoMHhmIDw8IDEpCisjZGVmaW5lIElTSUZfQ0dBTU1BV0RfR1dESShicHApCQkJCSgoMTYgLSAoYnBwKSkgPDwgMSkKKworI2RlZmluZSBJU0lGX0NDRENGRwkJCQkJKDB4MDA4OCkKKyNkZWZpbmUgSVNJRl9DQ0RDRkdfWThQT1MJCQkJKDEgPDwgMTEpCisKKy8qIElTUyBJU1AgSVBJUEVJRiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIElQSVBFSUZfRU5BQkxFCQkJCQkoMHgwMDAwKQorCisjZGVmaW5lIElQSVBFSUZfQ0ZHMQkJCQkJKDB4MDAwNCkKKyNkZWZpbmUgSVBJUEVJRl9DRkcxX0lOUFNSQzFfTUFTSwkJCSgzIDw8IDE0KQorI2RlZmluZSBJUElQRUlGX0NGRzFfSU5QU1JDMV9WUE9SVF9SQVcJCQkoMCA8PCAxNCkKKyNkZWZpbmUgSVBJUEVJRl9DRkcxX0lOUFNSQzFfU0RSQU1fUkFXCQkJKDEgPDwgMTQpCisjZGVmaW5lIElQSVBFSUZfQ0ZHMV9JTlBTUkMxX0lTSUZfREFSS0ZNCQkoMiA8PCAxNCkKKyNkZWZpbmUgSVBJUEVJRl9DRkcxX0lOUFNSQzFfU0RSQU1fWVVWCQkJKDMgPDwgMTQpCisjZGVmaW5lIElQSVBFSUZfQ0ZHMV9JTlBTUkMyX01BU0sJCQkoMyA8PCAyKQorI2RlZmluZSBJUElQRUlGX0NGRzFfSU5QU1JDMl9JU0lGCQkJKDAgPDwgMikKKyNkZWZpbmUgSVBJUEVJRl9DRkcxX0lOUFNSQzJfU0RSQU1fUkFXCQkJKDEgPDwgMikKKyNkZWZpbmUgSVBJUEVJRl9DRkcxX0lOUFNSQzJfSVNJRl9EQVJLRk0JCSgyIDw8IDIpCisjZGVmaW5lIElQSVBFSUZfQ0ZHMV9JTlBTUkMyX1NEUkFNX1lVVgkJCSgzIDw8IDIpCisKKyNkZWZpbmUgSVBJUEVJRl9DRkcyCQkJCQkoMHgwMDMwKQorI2RlZmluZSBJUElQRUlGX0NGRzJfWVVWOFAJCQkJKDEgPDwgNykKKyNkZWZpbmUgSVBJUEVJRl9DRkcyX1lVVjgJCQkJKDEgPDwgNikKKyNkZWZpbmUgSVBJUEVJRl9DRkcyX1lVVjE2CQkJCSgxIDw8IDMpCisjZGVmaW5lIElQSVBFSUZfQ0ZHMl9WRFBPTAkJCQkoMSA8PCAyKQorI2RlZmluZSBJUElQRUlGX0NGRzJfSERQT0wJCQkJKDEgPDwgMSkKKyNkZWZpbmUgSVBJUEVJRl9DRkcyX0lOVFNXCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgSVBJUEVJRl9DTEtESVYJCQkJCSgweDAwNDApCisKKy8qIElTUyBJU1AgSVBJUEUgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBJUElQRV9TUkNfRU4JCQkJCSgweDAwMDApCisjZGVmaW5lIElQSVBFX1NSQ19FTl9FTgkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBJUElQRV9TUkNfTU9ERQkJCQkJKDB4MDAwNCkKKyNkZWZpbmUgSVBJUEVfU1JDX01PREVfV1JUCQkJCSgxIDw8IDEpCisjZGVmaW5lIElQSVBFX1NSQ19NT0RFX09TVAkJCQkoMSA8PCAwKQorCisjZGVmaW5lIElQSVBFX1NSQ19GTVQJCQkJCSgweDAwMDgpCisjZGVmaW5lIElQSVBFX1NSQ19GTVRfUkFXMllVVgkJCQkoMCA8PCAwKQorI2RlZmluZSBJUElQRV9TUkNfRk1UX1JBVzJSQVcJCQkJKDEgPDwgMCkKKyNkZWZpbmUgSVBJUEVfU1JDX0ZNVF9SQVcyU1RBVFMJCQkJKDIgPDwgMCkKKyNkZWZpbmUgSVBJUEVfU1JDX0ZNVF9ZVVYyWVVWCQkJCSgzIDw8IDApCisKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTAkJCQkJKDB4MDAwYykKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9PT19SCQkJCSgwIDw8IDYpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfT09fR1IJCQkJKDEgPDwgNikKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9PT19CCQkJCSgzIDw8IDYpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfT09fR0IJCQkJKDIgPDwgNikKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9PRV9SCQkJCSgwIDw8IDQpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfT0VfR1IJCQkJKDEgPDwgNCkKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9PRV9CCQkJCSgzIDw8IDQpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfT0VfR0IJCQkJKDIgPDwgNCkKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9FT19SCQkJCSgwIDw8IDIpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfRU9fR1IJCQkJKDEgPDwgMikKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9FT19CCQkJCSgzIDw8IDIpCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfRU9fR0IJCQkJKDIgPDwgMikKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9FRV9SCQkJCSgwIDw8IDApCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfRUVfR1IJCQkJKDEgPDwgMCkKKyNkZWZpbmUgSVBJUEVfU1JDX0NPTF9FRV9CCQkJCSgzIDw8IDApCisjZGVmaW5lIElQSVBFX1NSQ19DT0xfRUVfR0IJCQkJKDIgPDwgMCkKKworI2RlZmluZSBJUElQRV9TUkNfVlBTCQkJCQkoMHgwMDEwKQorI2RlZmluZSBJUElQRV9TUkNfVlBTX01BU0sJCQkJKDB4ZmZmZikKKworI2RlZmluZSBJUElQRV9TUkNfVlNaCQkJCQkoMHgwMDE0KQorI2RlZmluZSBJUElQRV9TUkNfVlNaX01BU0sJCQkJKDB4MWZmZikKKworI2RlZmluZSBJUElQRV9TUkNfSFBTCQkJCQkoMHgwMDE4KQorI2RlZmluZSBJUElQRV9TUkNfSFBTX01BU0sJCQkJKDB4ZmZmZikKKworI2RlZmluZSBJUElQRV9TUkNfSFNaCQkJCQkoMHgwMDFjKQorI2RlZmluZSBJUElQRV9TUkNfSFNaX01BU0sJCQkJKDB4MWZmZSkKKworI2RlZmluZSBJUElQRV9TRUxfU0JVCQkJCQkoMHgwMDIwKQorCisjZGVmaW5lIElQSVBFX1NSQ19TVEEJCQkJCSgweDAwMjQpCisKKyNkZWZpbmUgSVBJUEVfR0NLX01NUgkJCQkJKDB4MDAyOCkKKyNkZWZpbmUgSVBJUEVfR0NLX01NUl9SRUcJCQkJKDEgPDwgMCkKKworI2RlZmluZSBJUElQRV9HQ0tfUElYCQkJCQkoMHgwMDJjKQorI2RlZmluZSBJUElQRV9HQ0tfUElYX0czCQkJCSgxIDw8IDMpCisjZGVmaW5lIElQSVBFX0dDS19QSVhfRzIJCQkJKDEgPDwgMikKKyNkZWZpbmUgSVBJUEVfR0NLX1BJWF9HMQkJCQkoMSA8PCAxKQorI2RlZmluZSBJUElQRV9HQ0tfUElYX0cwCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgSVBJUEVfRFBDX0xVVF9FTgkJCQkoMHgwMDM0KQorI2RlZmluZSBJUElQRV9EUENfTFVUX1NFTAkJCQkoMHgwMDM4KQorI2RlZmluZSBJUElQRV9EUENfTFVUX0FEUgkJCQkoMHgwMDNjKQorI2RlZmluZSBJUElQRV9EUENfTFVUX1NJWgkJCQkoMHgwMDQwKQorCisjZGVmaW5lIElQSVBFX0RQQ19PVEZfRU4JCQkJKDB4MDA0NCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl9UWVAJCQkJKDB4MDA0OCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0RfVEhSX1IJCQkJKDB4MDA0YykKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0RfVEhSX0dSCQkJKDB4MDA1MCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0RfVEhSX0dCCQkJKDB4MDA1NCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0RfVEhSX0IJCQkJKDB4MDA1OCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0NfVEhSX1IJCQkJKDB4MDA1YykKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0NfVEhSX0dSCQkJKDB4MDA2MCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0NfVEhSX0dCCQkJKDB4MDA2NCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8yX0NfVEhSX0IJCQkJKDB4MDA2OCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8zX1NIRgkJCQkoMHgwMDZjKQorI2RlZmluZSBJUElQRV9EUENfT1RGXzNfRF9USFIJCQkJKDB4MDA3MCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8zX0RfU1BMCQkJCSgweDAwNzQpCisjZGVmaW5lIElQSVBFX0RQQ19PVEZfM19EX01JTgkJCQkoMHgwMDc4KQorI2RlZmluZSBJUElQRV9EUENfT1RGXzNfRF9NQVgJCQkJKDB4MDA3YykKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8zX0NfVEhSCQkJCSgweDAwODApCisjZGVmaW5lIElQSVBFX0RQQ19PVEZfM19DX1NMUAkJCQkoMHgwMDg0KQorI2RlZmluZSBJUElQRV9EUENfT1RGXzNfQ19NSU4JCQkJKDB4MDA4OCkKKyNkZWZpbmUgSVBJUEVfRFBDX09URl8zX0NfTUFYCQkJCSgweDAwOGMpCisKKyNkZWZpbmUgSVBJUEVfTFNDX1ZPRlQJCQkJCSgweDAwOTApCisjZGVmaW5lIElQSVBFX0xTQ19WQTIJCQkJCSgweDAwOTQpCisjZGVmaW5lIElQSVBFX0xTQ19WQTEJCQkJCSgweDAwOTgpCisjZGVmaW5lIElQSVBFX0xTQ19WUwkJCQkJKDB4MDA5YykKKyNkZWZpbmUgSVBJUEVfTFNDX0hPRlQJCQkJCSgweDAwYTApCisjZGVmaW5lIElQSVBFX0xTQ19IQTIJCQkJCSgweDAwYTQpCisjZGVmaW5lIElQSVBFX0xTQ19IQTEJCQkJCSgweDAwYTgpCisjZGVmaW5lIElQSVBFX0xTQ19IUwkJCQkJKDB4MDBhYykKKyNkZWZpbmUgSVBJUEVfTFNDX0dBTl9SCQkJCQkoMHgwMGIwKQorI2RlZmluZSBJUElQRV9MU0NfR0FOX0dSCQkJCSgweDAwYjQpCisjZGVmaW5lIElQSVBFX0xTQ19HQU5fR0IJCQkJKDB4MDBiOCkKKyNkZWZpbmUgSVBJUEVfTFNDX0dBTl9CCQkJCQkoMHgwMGJjKQorI2RlZmluZSBJUElQRV9MU0NfT0ZUX1IJCQkJCSgweDAwYzApCisjZGVmaW5lIElQSVBFX0xTQ19PRlRfR1IJCQkJKDB4MDBjNCkKKyNkZWZpbmUgSVBJUEVfTFNDX09GVF9HQgkJCQkoMHgwMGM4KQorI2RlZmluZSBJUElQRV9MU0NfT0ZUX0IJCQkJCSgweDAwY2MpCisjZGVmaW5lIElQSVBFX0xTQ19TSEYJCQkJCSgweDAwZDApCisjZGVmaW5lIElQSVBFX0xTQ19NQVgJCQkJCSgweDAwZDQpCisKKyNkZWZpbmUgSVBJUEVfRDJGXzFTVF9FTgkJCQkoMHgwMGQ4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RZUAkJCQkoMHgwMGRjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wMAkJCQkoMHgwMGUwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wMQkJCQkoMHgwMGU0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wMgkJCQkoMHgwMGU4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wMwkJCQkoMHgwMGVjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wNAkJCQkoMHgwMGYwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wNQkJCQkoMHgwMGY0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wNgkJCQkoMHgwMGY4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1RIUl8wNwkJCQkoMHgwMGZjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wMAkJCQkoMHgwMTAwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wMQkJCQkoMHgwMTA0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wMgkJCQkoMHgwMTA4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wMwkJCQkoMHgwMTBjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wNAkJCQkoMHgwMTEwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wNQkJCQkoMHgwMTE0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wNgkJCQkoMHgwMTE4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NUUl8wNwkJCQkoMHgwMTFjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wMAkJCQkoMHgwMTIwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wMQkJCQkoMHgwMTI0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wMgkJCQkoMHgwMTI4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wMwkJCQkoMHgwMTJjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wNAkJCQkoMHgwMTMwKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wNQkJCQkoMHgwMTM0KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wNgkJCQkoMHgwMTM4KQorI2RlZmluZSBJUElQRV9EMkZfMVNUX1NQUl8wNwkJCQkoMHgwMTNjKQorI2RlZmluZSBJUElQRV9EMkZfMVNUX0VER19NSU4JCQkJKDB4MDE0MCkKKyNkZWZpbmUgSVBJUEVfRDJGXzFTVF9FREdfTUFYCQkJCSgweDAxNDQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfRU4JCQkJKDB4MDE0OCkKKyNkZWZpbmUgSVBJUEVfRDJGXzJORF9UWVAJCQkJKDB4MDE0YykKKyNkZWZpbmUgSVBJUEVfRDJGXzJORF9USFIwMAkJCQkoMHgwMTUwKQorI2RlZmluZSBJUElQRV9EMkZfMk5EX1RIUjAxCQkJCSgweDAxNTQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfVEhSMDIJCQkJKDB4MDE1OCkKKyNkZWZpbmUgSVBJUEVfRDJGXzJORF9USFIwMwkJCQkoMHgwMTVjKQorI2RlZmluZSBJUElQRV9EMkZfMk5EX1RIUjA0CQkJCSgweDAxNjApCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfVEhSMDUJCQkJKDB4MDE2NCkKKyNkZWZpbmUgSVBJUEVfRDJGXzJORF9USFIwNgkJCQkoMHgwMTY4KQorI2RlZmluZSBJUElQRV9EMkZfMk5EX1RIUjA3CQkJCSgweDAxNmMpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzAwCQkJCSgweDAxNzApCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzAxCQkJCSgweDAxNzQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzAyCQkJCSgweDAxNzgpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzAzCQkJCSgweDAxN2MpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzA0CQkJCSgweDAxODApCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzA1CQkJCSgweDAxODQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzA2CQkJCSgweDAxODgpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1RSXzA3CQkJCSgweDAxOGMpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzAwCQkJCSgweDAxOTApCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzAxCQkJCSgweDAxOTQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzAyCQkJCSgweDAxOTgpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzAzCQkJCSgweDAxOWMpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzA0CQkJCSgweDAxYTApCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzA1CQkJCSgweDAxYTQpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzA2CQkJCSgweDAxYTgpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfU1BSXzA3CQkJCSgweDAxYWMpCisjZGVmaW5lIElQSVBFX0QyRl8yTkRfRURHX01JTgkJCQkoMHgwMWIwKQorI2RlZmluZSBJUElQRV9EMkZfMk5EX0VER19NQVgJCQkJKDB4MDFiNCkKKworI2RlZmluZSBJUElQRV9HSUNfRU4JCQkJCSgweDAxYjgpCisjZGVmaW5lIElQSVBFX0dJQ19UWVAJCQkJCSgweDAxYmMpCisjZGVmaW5lIElQSVBFX0dJQ19HQU4JCQkJCSgweDAxYzApCisjZGVmaW5lIElQSVBFX0dJQ19ORkdBSU4JCQkJKDB4MDFjNCkKKyNkZWZpbmUgSVBJUEVfR0lDX1RIUgkJCQkJKDB4MDFjOCkKKyNkZWZpbmUgSVBJUEVfR0lDX1NMUAkJCQkJKDB4MDFjYykKKworI2RlZmluZSBJUElQRV9XQjJfT0ZUX1IJCQkJCSgweDAxZDApCisjZGVmaW5lIElQSVBFX1dCMl9PRlRfR1IJCQkJKDB4MDFkNCkKKyNkZWZpbmUgSVBJUEVfV0IyX09GVF9HQgkJCQkoMHgwMWQ4KQorI2RlZmluZSBJUElQRV9XQjJfT0ZUX0IJCQkJCSgweDAxZGMpCisKKyNkZWZpbmUgSVBJUEVfV0IyX1dHTl9SCQkJCQkoMHgwMWUwKQorI2RlZmluZSBJUElQRV9XQjJfV0dOX0dSCQkJCSgweDAxZTQpCisjZGVmaW5lIElQSVBFX1dCMl9XR05fR0IJCQkJKDB4MDFlOCkKKyNkZWZpbmUgSVBJUEVfV0IyX1dHTl9CCQkJCQkoMHgwMWVjKQorCisjZGVmaW5lIElQSVBFX0NGQV9NT0RFCQkJCQkoMHgwMWYwKQorI2RlZmluZSBJUElQRV9DRkFfMkRJUl9IUEZfVEhSCQkJCSgweDAxZjQpCisjZGVmaW5lIElQSVBFX0NGQV8yRElSX0hQRl9TTFAJCQkJKDB4MDFmOCkKKyNkZWZpbmUgSVBJUEVfQ0ZBXzJESVJfTUlYX1RIUgkJCQkoMHgwMWZjKQorI2RlZmluZSBJUElQRV9DRkFfMkRJUl9NSVhfU0xQCQkJCSgweDAyMDApCisjZGVmaW5lIElQSVBFX0NGQV8yRElSX0RJUl9UUkgJCQkJKDB4MDIwNCkKKyNkZWZpbmUgSVBJUEVfQ0ZBXzJESVJfRElSX1NMUAkJCQkoMHgwMjA4KQorI2RlZmluZSBJUElQRV9DRkFfMkRJUl9ORFdUCQkJCSgweDAyMGMpCisjZGVmaW5lIElQSVBFX0NGQV9NT05PX0hVRV9GUkEJCQkJKDB4MDIxMCkKKyNkZWZpbmUgSVBJUEVfQ0ZBX01PTk9fRURHX1RIUgkJCQkoMHgwMjE0KQorI2RlZmluZSBJUElQRV9DRkFfTU9OT19USFJfTUlOCQkJCSgweDAyMTgpCisKKyNkZWZpbmUgSVBJUEVfQ0ZBX01PTk9fVEhSX1NMUAkJCQkoMHgwMjFjKQorI2RlZmluZSBJUElQRV9DRkFfTU9OT19TTFBfTUlOCQkJCSgweDAyMjApCisjZGVmaW5lIElQSVBFX0NGQV9NT05PX1NMUF9TTFAJCQkJKDB4MDIyNCkKKyNkZWZpbmUgSVBJUEVfQ0ZBX01PTk9fTFBXVAkJCQkoMHgwMjI4KQorCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX1JSCQkJCSgweDAyMmMpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0dSCQkJCSgweDAyMzApCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0JSCQkJCSgweDAyMzQpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX1JHCQkJCSgweDAyMzgpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0dHCQkJCSgweDAyM2MpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0JHCQkJCSgweDAyNDApCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX1JCCQkJCSgweDAyNDQpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0dCCQkJCSgweDAyNDgpCisjZGVmaW5lIElQSVBFX1JHQjFfTVVMX0JCCQkJCSgweDAyNGMpCisjZGVmaW5lIElQSVBFX1JHQjFfT0ZUX09SCQkJCSgweDAyNTApCisjZGVmaW5lIElQSVBFX1JHQjFfT0ZUX09HCQkJCSgweDAyNTQpCisjZGVmaW5lIElQSVBFX1JHQjFfT0ZUX09CCQkJCSgweDAyNTgpCisjZGVmaW5lIElQSVBFX0dNTV9DRkcJCQkJCSgweDAyNWMpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX1JSCQkJCSgweDAyNjApCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0dSCQkJCSgweDAyNjQpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0JSCQkJCSgweDAyNjgpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX1JHCQkJCSgweDAyNmMpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0dHCQkJCSgweDAyNzApCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0JHCQkJCSgweDAyNzQpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX1JCCQkJCSgweDAyNzgpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0dCCQkJCSgweDAyN2MpCisjZGVmaW5lIElQSVBFX1JHQjJfTVVMX0JCCQkJCSgweDAyODApCisjZGVmaW5lIElQSVBFX1JHQjJfT0ZUX09SCQkJCSgweDAyODQpCisjZGVmaW5lIElQSVBFX1JHQjJfT0ZUX09HCQkJCSgweDAyODgpCisjZGVmaW5lIElQSVBFX1JHQjJfT0ZUX09CCQkJCSgweDAyOGMpCisKKyNkZWZpbmUgSVBJUEVfWVVWX0FESgkJCQkJKDB4MDI5NCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9SWQkJCQkoMHgwMjk4KQorI2RlZmluZSBJUElQRV9ZVVZfTVVMX0dZCQkJCSgweDAyOWMpCisjZGVmaW5lIElQSVBFX1lVVl9NVUxfQlkJCQkJKDB4MDJhMCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9SQ0IJCQkJKDB4MDJhNCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9HQ0IJCQkJKDB4MDJhOCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9CQ0IJCQkJKDB4MDJhYykKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9SQ1IJCQkJKDB4MDJiMCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9HQ1IJCQkJKDB4MDJiNCkKKyNkZWZpbmUgSVBJUEVfWVVWX01VTF9CQ1IJCQkJKDB4MDJiOCkKKyNkZWZpbmUgSVBJUEVfWVVWX09GVF9ZCQkJCQkoMHgwMmJjKQorI2RlZmluZSBJUElQRV9ZVVZfT0ZUX0NCCQkJCSgweDAyYzApCisjZGVmaW5lIElQSVBFX1lVVl9PRlRfQ1IJCQkJKDB4MDJjNCkKKworI2RlZmluZSBJUElQRV9ZVVZfUEhTCQkJCQkoMHgwMmM4KQorI2RlZmluZSBJUElQRV9ZVVZfUEhTX0xQRgkJCQkoMSA8PCAxKQorI2RlZmluZSBJUElQRV9ZVVZfUEhTX1BPUwkJCQkoMSA8PCAwKQorCisjZGVmaW5lIElQSVBFX1lFRV9FTgkJCQkJKDB4MDJkNCkKKyNkZWZpbmUgSVBJUEVfWUVFX1RZUAkJCQkJKDB4MDJkOCkKKyNkZWZpbmUgSVBJUEVfWUVFX1NIRgkJCQkJKDB4MDJkYykKKyNkZWZpbmUgSVBJUEVfWUVFX01VTF8wMAkJCQkoMHgwMmUwKQorI2RlZmluZSBJUElQRV9ZRUVfTVVMXzAxCQkJCSgweDAyZTQpCisjZGVmaW5lIElQSVBFX1lFRV9NVUxfMDIJCQkJKDB4MDJlOCkKKyNkZWZpbmUgSVBJUEVfWUVFX01VTF8xMAkJCQkoMHgwMmVjKQorI2RlZmluZSBJUElQRV9ZRUVfTVVMXzExCQkJCSgweDAyZjApCisjZGVmaW5lIElQSVBFX1lFRV9NVUxfMTIJCQkJKDB4MDJmNCkKKyNkZWZpbmUgSVBJUEVfWUVFX01VTF8yMAkJCQkoMHgwMmY4KQorI2RlZmluZSBJUElQRV9ZRUVfTVVMXzIxCQkJCSgweDAyZmMpCisjZGVmaW5lIElQSVBFX1lFRV9NVUxfMjIJCQkJKDB4MDMwMCkKKyNkZWZpbmUgSVBJUEVfWUVFX1RIUgkJCQkJKDB4MDMwNCkKKyNkZWZpbmUgSVBJUEVfWUVFX0VfR0FOCQkJCQkoMHgwMzA4KQorI2RlZmluZSBJUElQRV9ZRUVfRV9USFJfMQkJCQkoMHgwMzBjKQorI2RlZmluZSBJUElQRV9ZRUVfRV9USFJfMgkJCQkoMHgwMzEwKQorI2RlZmluZSBJUElQRV9ZRUVfR19HQU4JCQkJCSgweDAzMTQpCisjZGVmaW5lIElQSVBFX1lFRV9HX09GVAkJCQkJKDB4MDMxOCkKKworI2RlZmluZSBJUElQRV9DQVJfRU4JCQkJCSgweDAzMWMpCisjZGVmaW5lIElQSVBFX0NBUl9UWVAJCQkJCSgweDAzMjApCisjZGVmaW5lIElQSVBFX0NBUl9TVwkJCQkJKDB4MDMyNCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0hQRl9UWVAJCQkJKDB4MDMyOCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0hQRl9TSEYJCQkJKDB4MDMyYykKKyNkZWZpbmUgSVBJUEVfQ0FSX0hQRl9USFIJCQkJKDB4MDMzMCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMV9HQU4JCQkJKDB4MDMzNCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMV9TSEYJCQkJKDB4MDMzOCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMV9NSU4JCQkJKDB4MDMzYykKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMl9HQU4JCQkJKDB4MDM0MCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMl9TSEYJCQkJKDB4MDM0NCkKKyNkZWZpbmUgSVBJUEVfQ0FSX0dOMl9NSU4JCQkJKDB4MDM0OCkKKyNkZWZpbmUgSVBJUEVfQ0dTX0VOCQkJCQkoMHgwMzRjKQorI2RlZmluZSBJUElQRV9DR1NfR04xX0xfVEhSCQkJCSgweDAzNTApCisjZGVmaW5lIElQSVBFX0NHU19HTjFfTF9HQUlOCQkJCSgweDAzNTQpCisjZGVmaW5lIElQSVBFX0NHU19HTjFfTF9TSEYJCQkJKDB4MDM1OCkKKyNkZWZpbmUgSVBJUEVfQ0dTX0dOMV9MX01JTgkJCQkoMHgwMzVjKQorI2RlZmluZSBJUElQRV9DR1NfR04xX0hfVEhSCQkJCSgweDAzNjApCisjZGVmaW5lIElQSVBFX0NHU19HTjFfSF9HQUlOCQkJCSgweDAzNjQpCisjZGVmaW5lIElQSVBFX0NHU19HTjFfSF9TSEYJCQkJKDB4MDM2OCkKKyNkZWZpbmUgSVBJUEVfQ0dTX0dOMV9IX01JTgkJCQkoMHgwMzZjKQorI2RlZmluZSBJUElQRV9DR1NfR04yX0xfVEhSCQkJCSgweDAzNzApCisjZGVmaW5lIElQSVBFX0NHU19HTjJfTF9HQUlOCQkJCSgweDAzNzQpCisjZGVmaW5lIElQSVBFX0NHU19HTjJfTF9TSEYJCQkJKDB4MDM3OCkKKyNkZWZpbmUgSVBJUEVfQ0dTX0dOMl9MX01JTgkJCQkoMHgwMzdjKQorCisjZGVmaW5lIElQSVBFX0JPWF9FTgkJCQkJKDB4MDM4MCkKKyNkZWZpbmUgSVBJUEVfQk9YX01PREUJCQkJCSgweDAzODQpCisjZGVmaW5lIElQSVBFX0JPWF9UWVAJCQkJCSgweDAzODgpCisjZGVmaW5lIElQSVBFX0JPWF9TSEYJCQkJCSgweDAzOGMpCisjZGVmaW5lIElQSVBFX0JPWF9TRFJfU0FEX0gJCQkJKDB4MDM5MCkKKyNkZWZpbmUgSVBJUEVfQk9YX1NEUl9TQURfTAkJCQkoMHgwMzk0KQorCisjZGVmaW5lIElQSVBFX0hTVF9FTgkJCQkJKDB4MDM5YykKKyNkZWZpbmUgSVBJUEVfSFNUX01PREUJCQkJCSgweDAzYTApCisjZGVmaW5lIElQSVBFX0hTVF9TRUwJCQkJCSgweDAzYTQpCisjZGVmaW5lIElQSVBFX0hTVF9QQVJBCQkJCQkoMHgwM2E4KQorI2RlZmluZSBJUElQRV9IU1RfMF9WUFMJCQkJCSgweDAzYWMpCisjZGVmaW5lIElQSVBFX0hTVF8wX1ZTWgkJCQkJKDB4MDNiMCkKKyNkZWZpbmUgSVBJUEVfSFNUXzBfSFBTCQkJCQkoMHgwM2I0KQorI2RlZmluZSBJUElQRV9IU1RfMF9IU1oJCQkJCSgweDAzYjgpCisjZGVmaW5lIElQSVBFX0hTVF8xX1ZQUwkJCQkJKDB4MDNiYykKKyNkZWZpbmUgSVBJUEVfSFNUXzFfVlNaCQkJCQkoMHgwM2MwKQorI2RlZmluZSBJUElQRV9IU1RfMV9IUFMJCQkJCSgweDAzYzQpCisjZGVmaW5lIElQSVBFX0hTVF8xX0hTWgkJCQkJKDB4MDNjOCkKKyNkZWZpbmUgSVBJUEVfSFNUXzJfVlBTCQkJCQkoMHgwM2NjKQorI2RlZmluZSBJUElQRV9IU1RfMl9WU1oJCQkJCSgweDAzZDApCisjZGVmaW5lIElQSVBFX0hTVF8yX0hQUwkJCQkJKDB4MDNkNCkKKyNkZWZpbmUgSVBJUEVfSFNUXzJfSFNaCQkJCQkoMHgwM2Q4KQorI2RlZmluZSBJUElQRV9IU1RfM19WUFMJCQkJCSgweDAzZGMpCisjZGVmaW5lIElQSVBFX0hTVF8zX1ZTWgkJCQkJKDB4MDNlMCkKKyNkZWZpbmUgSVBJUEVfSFNUXzNfSFBTCQkJCQkoMHgwM2U0KQorI2RlZmluZSBJUElQRV9IU1RfM19IU1oJCQkJCSgweDAzZTgpCisjZGVmaW5lIElQSVBFX0hTVF9UQkwJCQkJCSgweDAzZWMpCisjZGVmaW5lIElQSVBFX0hTVF9NVUxfUgkJCQkJKDB4MDNmMCkKKyNkZWZpbmUgSVBJUEVfSFNUX01VTF9HUgkJCQkoMHgwM2Y0KQorI2RlZmluZSBJUElQRV9IU1RfTVVMX0dCCQkJCSgweDAzZjgpCisjZGVmaW5lIElQSVBFX0hTVF9NVUxfQgkJCQkJKDB4MDNmYykKKworI2RlZmluZSBJUElQRV9CU0NfRU4JCQkJCSgweDA0MDApCisjZGVmaW5lIElQSVBFX0JTQ19NT0RFCQkJCQkoMHgwNDA0KQorI2RlZmluZSBJUElQRV9CU0NfVFlQCQkJCQkoMHgwNDA4KQorI2RlZmluZSBJUElQRV9CU0NfUk9XX1ZDVAkJCQkoMHgwNDBjKQorI2RlZmluZSBJUElQRV9CU0NfUk9XX1NIRgkJCQkoMHgwNDEwKQorI2RlZmluZSBJUElQRV9CU0NfUk9XX1ZQTwkJCQkoMHgwNDE0KQorI2RlZmluZSBJUElQRV9CU0NfUk9XX1ZOVQkJCQkoMHgwNDE4KQorI2RlZmluZSBJUElQRV9CU0NfUk9XX1ZTS0lQCQkJCSgweDA0MWMpCisjZGVmaW5lIElQSVBFX0JTQ19ST1dfSFBPCQkJCSgweDA0MjApCisjZGVmaW5lIElQSVBFX0JTQ19ST1dfSE5VCQkJCSgweDA0MjQpCisjZGVmaW5lIElQSVBFX0JTQ19ST1dfSFNLSVAJCQkJKDB4MDQyOCkKKyNkZWZpbmUgSVBJUEVfQlNDX0NPTF9WQ1QJCQkJKDB4MDQyYykKKyNkZWZpbmUgSVBJUEVfQlNDX0NPTF9TSEYJCQkJKDB4MDQzMCkKKyNkZWZpbmUgSVBJUEVfQlNDX0NPTF9WUE8JCQkJKDB4MDQzNCkKKyNkZWZpbmUgSVBJUEVfQlNDX0NPTF9WTlUJCQkJKDB4MDQzOCkKKyNkZWZpbmUgSVBJUEVfQlNDX0NPTF9WU0tJUAkJCQkoMHgwNDNjKQorI2RlZmluZSBJUElQRV9CU0NfQ09MX0hQTwkJCQkoMHgwNDQwKQorI2RlZmluZSBJUElQRV9CU0NfQ09MX0hOVQkJCQkoMHgwNDQ0KQorI2RlZmluZSBJUElQRV9CU0NfQ09MX0hTS0lQCQkJCSgweDA0NDgpCisKKyNkZWZpbmUgSVBJUEVfQlNDX0VOCQkJCQkoMHgwNDAwKQorCisvKiBJU1MgSVNQIFJlc2l6ZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBSU1pfUkVWSVNJT04JCQkJCSgweDAwMDApCisjZGVmaW5lIFJTWl9TWVNDT05GSUcJCQkJCSgweDAwMDQpCisjZGVmaW5lIFJTWl9TWVNDT05GSUdfUlNaQl9DTEtfRU4JCQkoMSA8PCA5KQorI2RlZmluZSBSU1pfU1lTQ09ORklHX1JTWkFfQ0xLX0VOCQkJKDEgPDwgOCkKKworI2RlZmluZSBSU1pfSU5fRklGT19DVFJMCQkJCSgweDAwMGMpCisjZGVmaW5lIFJTWl9JTl9GSUZPX0NUUkxfVEhSTERfTE9XX01BU0sJCQkoMHgxZmYgPDwgMTYpCisjZGVmaW5lIFJTWl9JTl9GSUZPX0NUUkxfVEhSTERfTE9XX1NISUZUCQkxNgorI2RlZmluZSBSU1pfSU5fRklGT19DVFJMX1RIUkxEX0hJR0hfTUFTSwkJKDB4MWZmIDw8IDApCisjZGVmaW5lIFJTWl9JTl9GSUZPX0NUUkxfVEhSTERfSElHSF9TSElGVAkJMAorCisjZGVmaW5lIFJTWl9GUkFDRElWCQkJCQkoMHgwMDA4KQorI2RlZmluZSBSU1pfRlJBQ0RJVl9NQVNLCQkJCSgweGZmZmYpCisKKyNkZWZpbmUgUlNaX1NSQ19FTgkJCQkJKDB4MDAyMCkKKyNkZWZpbmUgUlNaX1NSQ19FTl9TUkNfRU4JCQkJKDEgPDwgMCkKKworI2RlZmluZSBSU1pfU1JDX01PREUJCQkJCSgweDAwMjQpCisjZGVmaW5lIFJTWl9TUkNfTU9ERV9PU1QJCQkJKDEgPDwgMCkKKyNkZWZpbmUgUlNaX1NSQ19NT0RFX1dSVAkJCQkoMSA8PCAxKQorCisjZGVmaW5lIFJTWl9TUkNfRk1UMAkJCQkJKDB4MDAyOCkKKyNkZWZpbmUgUlNaX1NSQ19GTVQwX0JZUEFTUwkJCQkoMSA8PCAxKQorI2RlZmluZSBSU1pfU1JDX0ZNVDBfU0VMCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgUlNaX1NSQ19GTVQxCQkJCQkoMHgwMDJjKQorI2RlZmluZSBSU1pfU1JDX0ZNVDFfSU40MjAJCQkJKDEgPDwgMSkKKworI2RlZmluZSBSU1pfU1JDX1ZQUwkJCQkJKDB4MDAzMCkKKyNkZWZpbmUgUlNaX1NSQ19WU1oJCQkJCSgweDAwMzQpCisjZGVmaW5lIFJTWl9TUkNfSFBTCQkJCQkoMHgwMDM4KQorI2RlZmluZSBSU1pfU1JDX0hTWgkJCQkJKDB4MDAzYykKKyNkZWZpbmUgUlNaX0RNQV9SWkEJCQkJCSgweDAwNDApCisjZGVmaW5lIFJTWl9ETUFfUlpCCQkJCQkoMHgwMDQ0KQorI2RlZmluZSBSU1pfRE1BX1NUQQkJCQkJKDB4MDA0OCkKKyNkZWZpbmUgUlNaX0dDS19NTVIJCQkJCSgweDAwNGMpCisjZGVmaW5lIFJTWl9HQ0tfTU1SX01NUgkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBSU1pfR0NLX1NEUgkJCQkJKDB4MDA1NCkKKyNkZWZpbmUgUlNaX0dDS19TRFJfQ09SRQkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFJTWl9JUlFfUlpBCQkJCQkoMHgwMDU4KQorI2RlZmluZSBSU1pfSVJRX1JaQV9NQVNLCQkJCSgweDFmZmYpCisKKyNkZWZpbmUgUlNaX0lSUV9SWkIJCQkJCSgweDAwNWMpCisjZGVmaW5lIFJTWl9JUlFfUlpCX01BU0sJCQkJKDB4MWZmZikKKworI2RlZmluZSBSU1pfWVVWX1lfTUlOCQkJCQkoMHgwMDYwKQorI2RlZmluZSBSU1pfWVVWX1lfTUFYCQkJCQkoMHgwMDY0KQorI2RlZmluZSBSU1pfWVVWX0NfTUlOCQkJCQkoMHgwMDY4KQorI2RlZmluZSBSU1pfWVVWX0NfTUFYCQkJCQkoMHgwMDZjKQorCisjZGVmaW5lIFJTWl9TRVEJCQkJCQkoMHgwMDc0KQorI2RlZmluZSBSU1pfU0VRX0hSVkIJCQkJCSgxIDw8IDIpCisjZGVmaW5lIFJTWl9TRVFfSFJWQQkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBSWkFfRU4JCQkJCQkoMHgwMDc4KQorI2RlZmluZSBSWkFfTU9ERQkJCQkJKDB4MDA3YykKKyNkZWZpbmUgUlpBX01PREVfT05FX1NIT1QJCQkJKDEgPDwgMCkKKworI2RlZmluZSBSWkFfNDIwCQkJCQkJKDB4MDA4MCkKKyNkZWZpbmUgUlpBX0lfVlBTCQkJCQkoMHgwMDg0KQorI2RlZmluZSBSWkFfSV9IUFMJCQkJCSgweDAwODgpCisjZGVmaW5lIFJaQV9PX1ZTWgkJCQkJKDB4MDA4YykKKyNkZWZpbmUgUlpBX09fSFNaCQkJCQkoMHgwMDkwKQorI2RlZmluZSBSWkFfVl9QSFNfWQkJCQkJKDB4MDA5NCkKKyNkZWZpbmUgUlpBX1ZfUEhTX0MJCQkJCSgweDAwOTgpCisjZGVmaW5lIFJaQV9WX0RJRgkJCQkJKDB4MDA5YykKKyNkZWZpbmUgUlpBX1ZfVFlQCQkJCQkoMHgwMGEwKQorI2RlZmluZSBSWkFfVl9MUEYJCQkJCSgweDAwYTQpCisjZGVmaW5lIFJaQV9IX1BIUwkJCQkJKDB4MDBhOCkKKyNkZWZpbmUgUlpBX0hfRElGCQkJCQkoMHgwMGIwKQorI2RlZmluZSBSWkFfSF9UWVAJCQkJCSgweDAwYjQpCisjZGVmaW5lIFJaQV9IX0xQRgkJCQkJKDB4MDBiOCkKKyNkZWZpbmUgUlpBX0RXTl9FTgkJCQkJKDB4MDBiYykKKyNkZWZpbmUgUlpBX1NEUl9ZX0JBRF9ICQkJCQkoMHgwMGQwKQorI2RlZmluZSBSWkFfU0RSX1lfQkFEX0wJCQkJCSgweDAwZDQpCisjZGVmaW5lIFJaQV9TRFJfWV9TQURfSAkJCQkJKDB4MDBkOCkKKyNkZWZpbmUgUlpBX1NEUl9ZX1NBRF9MCQkJCQkoMHgwMGRjKQorI2RlZmluZSBSWkFfU0RSX1lfT0ZUCQkJCQkoMHgwMGUwKQorI2RlZmluZSBSWkFfU0RSX1lfUFRSX1MJCQkJCSgweDAwZTQpCisjZGVmaW5lIFJaQV9TRFJfWV9QVFJfRQkJCQkJKDB4MDBlOCkKKyNkZWZpbmUgUlpBX1NEUl9DX0JBRF9ICQkJCQkoMHgwMGVjKQorI2RlZmluZSBSWkFfU0RSX0NfQkFEX0wJCQkJCSgweDAwZjApCisjZGVmaW5lIFJaQV9TRFJfQ19TQURfSAkJCQkJKDB4MDBmNCkKKyNkZWZpbmUgUlpBX1NEUl9DX1NBRF9MCQkJCQkoMHgwMGY4KQorI2RlZmluZSBSWkFfU0RSX0NfT0ZUCQkJCQkoMHgwMGZjKQorI2RlZmluZSBSWkFfU0RSX0NfUFRSX1MJCQkJCSgweDAxMDApCisjZGVmaW5lIFJaQV9TRFJfQ19QVFJfRQkJCQkJKDB4MDEwNCkKKworI2RlZmluZSBSWkJfRU4JCQkJCQkoMHgwMTA4KQorI2RlZmluZSBSWkJfTU9ERQkJCQkJKDB4MDEwYykKKyNkZWZpbmUgUlpCXzQyMAkJCQkJCSgweDAxMTApCisjZGVmaW5lIFJaQl9JX1ZQUwkJCQkJKDB4MDExNCkKKyNkZWZpbmUgUlpCX0lfSFBTCQkJCQkoMHgwMTE4KQorI2RlZmluZSBSWkJfT19WU1oJCQkJCSgweDAxMWMpCisjZGVmaW5lIFJaQl9PX0hTWgkJCQkJKDB4MDEyMCkKKworI2RlZmluZSBSWkJfVl9ESUYJCQkJCSgweDAxMmMpCisjZGVmaW5lIFJaQl9WX1RZUAkJCQkJKDB4MDEzMCkKKyNkZWZpbmUgUlpCX1ZfTFBGCQkJCQkoMHgwMTM0KQorCisjZGVmaW5lIFJaQl9IX0RJRgkJCQkJKDB4MDE0MCkKKyNkZWZpbmUgUlpCX0hfVFlQCQkJCQkoMHgwMTQ0KQorI2RlZmluZSBSWkJfSF9MUEYJCQkJCSgweDAxNDgpCisKKyNkZWZpbmUgUlpCX1NEUl9ZX0JBRF9ICQkJCQkoMHgwMTYwKQorI2RlZmluZSBSWkJfU0RSX1lfQkFEX0wJCQkJCSgweDAxNjQpCisjZGVmaW5lIFJaQl9TRFJfWV9TQURfSAkJCQkJKDB4MDE2OCkKKyNkZWZpbmUgUlpCX1NEUl9ZX1NBRF9MCQkJCQkoMHgwMTZjKQorI2RlZmluZSBSWkJfU0RSX1lfT0ZUCQkJCQkoMHgwMTcwKQorI2RlZmluZSBSWkJfU0RSX1lfUFRSX1MJCQkJCSgweDAxNzQpCisjZGVmaW5lIFJaQl9TRFJfWV9QVFJfRQkJCQkJKDB4MDE3OCkKKyNkZWZpbmUgUlpCX1NEUl9DX0JBRF9ICQkJCQkoMHgwMTdjKQorI2RlZmluZSBSWkJfU0RSX0NfQkFEX0wJCQkJCSgweDAxODApCisjZGVmaW5lIFJaQl9TRFJfQ19TQURfSAkJCQkJKDB4MDE4NCkKKyNkZWZpbmUgUlpCX1NEUl9DX1NBRF9MCQkJCQkoMHgwMTg4KQorCisjZGVmaW5lIFJaQl9TRFJfQ19QVFJfUwkJCQkJKDB4MDE5MCkKKyNkZWZpbmUgUlpCX1NEUl9DX1BUUl9FCQkJCQkoMHgwMTk0KQorCisvKiBTaGFyZWQgQml0bWFza3MgYmV0d2VlbiBSWkEgJiBSWkIgKi8KKyNkZWZpbmUgUlNaX0VOX0VOCQkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFJTWl80MjBfQ0VOCQkJCQkoMSA8PCAxKQorI2RlZmluZSBSU1pfNDIwX1lFTgkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBSU1pfSV9WUFNfTUFTSwkJCQkJKDB4MWZmZikKKworI2RlZmluZSBSU1pfSV9IUFNfTUFTSwkJCQkJKDB4MWZmZikKKworI2RlZmluZSBSU1pfT19WU1pfTUFTSwkJCQkJKDB4MWZmZikKKworI2RlZmluZSBSU1pfT19IU1pfTUFTSwkJCQkJKDB4MWZmZSkKKworI2RlZmluZSBSU1pfVl9QSFNfWV9NQVNLCQkJCSgweDNmZmYpCisKKyNkZWZpbmUgUlNaX1ZfUEhTX0NfTUFTSwkJCQkoMHgzZmZmKQorCisjZGVmaW5lIFJTWl9WX0RJRl9NQVNLCQkJCQkoMHgzZmZmKQorCisjZGVmaW5lIFJTWl9WX1RZUF9DCQkJCQkoMSA8PCAxKQorI2RlZmluZSBSU1pfVl9UWVBfWQkJCQkJKDEgPDwgMCkKKworI2RlZmluZSBSU1pfVl9MUEZfQ19NQVNLCQkJCSgweDNmIDw8IDYpCisjZGVmaW5lIFJTWl9WX0xQRl9DX1NISUZUCQkJCTYKKyNkZWZpbmUgUlNaX1ZfTFBGX1lfTUFTSwkJCQkoMHgzZiA8PCAwKQorI2RlZmluZSBSU1pfVl9MUEZfWV9TSElGVAkJCQkwCisKKyNkZWZpbmUgUlNaX0hfUEhTX01BU0sJCQkJCSgweDNmZmYpCisKKyNkZWZpbmUgUlNaX0hfRElGX01BU0sJCQkJCSgweDNmZmYpCisKKyNkZWZpbmUgUlNaX0hfVFlQX0MJCQkJCSgxIDw8IDEpCisjZGVmaW5lIFJTWl9IX1RZUF9ZCQkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFJTWl9IX0xQRl9DX01BU0sJCQkJKDB4M2YgPDwgNikKKyNkZWZpbmUgUlNaX0hfTFBGX0NfU0hJRlQJCQkJNgorI2RlZmluZSBSU1pfSF9MUEZfWV9NQVNLCQkJCSgweDNmIDw8IDApCisjZGVmaW5lIFJTWl9IX0xQRl9ZX1NISUZUCQkJCTAKKworI2RlZmluZSBSU1pfRFdOX0VOX0RXTl9FTgkJCQkoMSA8PCAwKQorCisjZW5kaWYgLyogX09NQVA0X0lTU19SRUdTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3Jlc2l6ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfcmVzaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3Jlc2l6ZXIuYwpAQCAtMCwwICsxLDg5MyBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIElTUCBSRVNJWkVSIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAiaXNzLmgiCisjaW5jbHVkZSAiaXNzX3JlZ3MuaCIKKyNpbmNsdWRlICJpc3NfcmVzaXplci5oIgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJlc2l6ZXJfZm10c1tdID0geworCVY0TDJfTUJVU19GTVRfVVlWWThfMVgxNiwKKwlWNEwyX01CVVNfRk1UX1lVWVY4XzFYMTYsCit9OworCisvKgorICogcmVzaXplcl9wcmludF9zdGF0dXMgLSBQcmludCBjdXJyZW50IFJFU0laRVIgTW9kdWxlIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIEByZXNpemVyOiBQb2ludGVyIHRvIElTUyBJU1AgUkVTSVpFUiBkZXZpY2UuCisgKgorICogQWxzbyBwcmludHMgb3RoZXIgZGVidWcgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBSRVNJWkVSIG1vZHVsZS4KKyAqLworI2RlZmluZSBSU1pfUFJJTlRfUkVHSVNURVIoaXNzLCBuYW1lKVwKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiIyMjUlNaICIgI25hbWUgIj0weCUwOHhcbiIsIFwKKwkJaXNzX3JlZ19yZWFkKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaXyMjbmFtZSkpCisKKyNkZWZpbmUgUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgbmFtZSlcCisJZGV2X2RiZyhpc3MtPmRldiwgIiMjI1JaQSAiICNuYW1lICI9MHglMDh4XG4iLCBcCisJCWlzc19yZWdfcmVhZChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV8jI25hbWUpKQorCitzdGF0aWMgdm9pZCByZXNpemVyX3ByaW50X3N0YXR1cyhzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKHJlc2l6ZXIpOworCisJZGV2X2RiZyhpc3MtPmRldiwgIi0tLS0tLS0tLS0tLS1SRVNJWkVSIFJlZ2lzdGVyIGR1bXAtLS0tLS0tLS0tLS0tXG4iKTsKKworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNZU0NPTkZJRyk7CisJUlNaX1BSSU5UX1JFR0lTVEVSKGlzcywgSU5fRklGT19DVFJMKTsKKwlSU1pfUFJJTlRfUkVHSVNURVIoaXNzLCBGUkFDRElWKTsKKwlSU1pfUFJJTlRfUkVHSVNURVIoaXNzLCBTUkNfRU4pOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19NT0RFKTsKKwlSU1pfUFJJTlRfUkVHSVNURVIoaXNzLCBTUkNfRk1UMCk7CisJUlNaX1BSSU5UX1JFR0lTVEVSKGlzcywgU1JDX0ZNVDEpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19WUFMpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19WU1opOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19IUFMpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFNSQ19IU1opOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIERNQV9SWkEpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIERNQV9SWkIpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIERNQV9TVEEpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIEdDS19NTVIpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIEdDS19TRFIpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIElSUV9SWkEpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIElSUV9SWkIpOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFlVVl9ZX01JTik7CisJUlNaX1BSSU5UX1JFR0lTVEVSKGlzcywgWVVWX1lfTUFYKTsKKwlSU1pfUFJJTlRfUkVHSVNURVIoaXNzLCBZVVZfQ19NSU4pOworCVJTWl9QUklOVF9SRUdJU1RFUihpc3MsIFlVVl9DX01BWCk7CisJUlNaX1BSSU5UX1JFR0lTVEVSKGlzcywgU0VRKTsKKworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIEVOKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBNT0RFKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCA0MjApOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIElfVlBTKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBJX0hQUyk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgT19WU1opOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIE9fSFNaKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBWX1BIU19ZKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBWX1BIU19DKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBWX0RJRik7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgVl9UWVApOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIFZfTFBGKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBIX1BIUyk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgSF9ESUYpOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIEhfVFlQKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBIX0xQRik7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgRFdOX0VOKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfWV9CQURfSCk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgU0RSX1lfQkFEX0wpOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIFNEUl9ZX1NBRF9IKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfWV9TQURfTCk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgU0RSX1lfT0ZUKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfWV9QVFJfUyk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgU0RSX1lfUFRSX0UpOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIFNEUl9DX0JBRF9IKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfQ19CQURfTCk7CisJUlpBX1BSSU5UX1JFR0lTVEVSKGlzcywgU0RSX0NfU0FEX0gpOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIFNEUl9DX1NBRF9MKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfQ19PRlQpOworCVJaQV9QUklOVF9SRUdJU1RFUihpc3MsIFNEUl9DX1BUUl9TKTsKKwlSWkFfUFJJTlRfUkVHSVNURVIoaXNzLCBTRFJfQ19QVFJfRSk7CisKKwlkZXZfZGJnKGlzcy0+ZGV2LCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCisvKgorICogcmVzaXplcl9lbmFibGUgLSBFbmFibGUvRGlzYWJsZSBSRVNJWkVSLgorICogQGVuYWJsZTogZW5hYmxlIGZsYWcKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHJlc2l6ZXJfZW5hYmxlKHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsIHU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShyZXNpemVyKTsKKworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NSQ19FTiwKKwkJICAgICAgIFJTWl9TUkNfRU5fU1JDX0VOLCBlbmFibGUgPyBSU1pfU1JDX0VOX1NSQ19FTiA6IDApOworCisJLyogVE9ETzogRW5hYmxlIFJTWkIgKi8KKwlpc3NfcmVnX3VwZGF0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9FTiwgUlNaX0VOX0VOLAorCQkgICAgICAgZW5hYmxlID8gUlNaX0VOX0VOIDogMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGb3JtYXQtIGFuZCBwaXBlbGluZS1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gaGVscGVycworICovCisKKy8qCisgKiByZXNpemVyX3NldF9vdXRhZGRyIC0gU2V0IG1lbW9yeSBhZGRyZXNzIHRvIHNhdmUgb3V0cHV0IGltYWdlCisgKiBAcmVzaXplcjogUG9pbnRlciB0byBJU1AgUkVTSVpFUiBkZXZpY2UuCisgKiBAYWRkcjogMzItYml0IG1lbW9yeSBhZGRyZXNzIGFsaWduZWQgb24gMzIgYnl0ZSBib3VuZGFyeS4KKyAqCisgKiBTZXRzIHRoZSBtZW1vcnkgYWRkcmVzcyB3aGVyZSB0aGUgb3V0cHV0IHdpbGwgYmUgc2F2ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJlc2l6ZXJfc2V0X291dGFkZHIoc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciwgdTMyIGFkZHIpCit7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UocmVzaXplcik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqaW5mb3JtYXQsICpvdXRmb3JtYXQ7CisKKwlpbmZvcm1hdCA9ICZyZXNpemVyLT5mb3JtYXRzW1JFU0laRVJfUEFEX1NJTktdOworCW91dGZvcm1hdCA9ICZyZXNpemVyLT5mb3JtYXRzW1JFU0laRVJfUEFEX1NPVVJDRV9NRU1dOworCisJLyogU2F2ZSBhZGRyZXNzIHNwbGl0dGVkIGluIEJhc2UgQWRkcmVzcyBIICYgTCAqLworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX1lfQkFEX0gsCisJCSAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmZmZik7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9TRFJfWV9CQURfTCwKKwkJICAgICAgYWRkciAmIDB4ZmZmZik7CisKKwkvKiBTQUQgPSBCQUQgKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1NEUl9ZX1NBRF9ILAorCQkgICAgICAoYWRkciA+PiAxNikgJiAweGZmZmYpOworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX1lfU0FEX0wsCisJCSAgICAgIGFkZHIgJiAweGZmZmYpOworCisJLyogUHJvZ3JhbSBVViBidWZmZXIgYWRkcmVzcy4uLiBIYXJkY29kZWQgdG8gYmUgY29udGlndW91cyEgKi8KKwlpZiAoKGluZm9ybWF0LT5jb2RlID09IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNikgJiYKKwkgICAgKG91dGZvcm1hdC0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1lVWVY4XzFfNVg4KSkgeworCQl1MzIgY19hZGRyID0gYWRkciArIChyZXNpemVyLT52aWRlb19vdXQuYnBsX3ZhbHVlICoKKwkJCQkgICAgIChvdXRmb3JtYXQtPmhlaWdodCAtIDEpKTsKKworCQkvKiBFbnN1cmUgWV9CQURfTFs2OjBdID0gQ19CQURfTFs2OjBdKi8KKwkJaWYgKChjX2FkZHIgXiBhZGRyKSAmIDB4N2YpIHsKKwkJCWNfYWRkciAmPSB+MHg3ZjsKKwkJCWNfYWRkciArPSAweDgwOworCQkJY19hZGRyIHw9IGFkZHIgJiAweDdmOworCQl9CisKKwkJLyogU2F2ZSBhZGRyZXNzIHNwbGl0dGVkIGluIEJhc2UgQWRkcmVzcyBIICYgTCAqLworCQlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1NEUl9DX0JBRF9ILAorCQkJICAgICAgKGNfYWRkciA+PiAxNikgJiAweGZmZmYpOworCQlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1NEUl9DX0JBRF9MLAorCQkJICAgICAgY19hZGRyICYgMHhmZmZmKTsKKworCQkvKiBTQUQgPSBCQUQgKi8KKwkJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9TRFJfQ19TQURfSCwKKwkJCSAgICAgIChjX2FkZHIgPj4gMTYpICYgMHhmZmZmKTsKKwkJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9TRFJfQ19TQURfTCwKKwkJCSAgICAgIGNfYWRkciAmIDB4ZmZmZik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZXNpemVyX2NvbmZpZ3VyZShzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKQoreworCXN0cnVjdCBpc3NfZGV2aWNlICppc3MgPSB0b19pc3NfZGV2aWNlKHJlc2l6ZXIpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmluZm9ybWF0LCAqb3V0Zm9ybWF0OworCisJaW5mb3JtYXQgPSAmcmVzaXplci0+Zm9ybWF0c1tSRVNJWkVSX1BBRF9TSU5LXTsKKwlvdXRmb3JtYXQgPSAmcmVzaXplci0+Zm9ybWF0c1tSRVNJWkVSX1BBRF9TT1VSQ0VfTUVNXTsKKworCS8qIERpc2FibGUgcGFzcy10aHJvdWdoIG1vcmUuIERlc3BpdGUgaXRzIG5hbWUsIHRoZSBCWVBBU1MgYml0IGNvbnRyb2xzCisJICogcGFzcy10aHJvdWdoIG1vZGUsIG5vdCBieXBhc3MgbW9kZS4KKwkgKi8KKwlpc3NfcmVnX2Nscihpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJTWl9TUkNfRk1UMCwKKwkJICAgIFJTWl9TUkNfRk1UMF9CWVBBU1MpOworCisJLyogU2VsZWN0IFJTWiBpbnB1dCAqLworCWlzc19yZWdfdXBkYXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NSQ19GTVQwLAorCQkgICAgICAgUlNaX1NSQ19GTVQwX1NFTCwKKwkJICAgICAgIHJlc2l6ZXItPmlucHV0ID09IFJFU0laRVJfSU5QVVRfSVBJUEVJRiA/CisJCSAgICAgICBSU1pfU1JDX0ZNVDBfU0VMIDogMCk7CisKKwkvKiBSU1ogaWdub3JlcyBXRU4gc2lnbmFsIGZyb20gSVBJUEUvSVBJUEVJRiAqLworCWlzc19yZWdfY2xyKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NSQ19NT0RFLAorCQkgICAgUlNaX1NSQ19NT0RFX1dSVCk7CisKKwkvKiBTZXQgUmVzaXplciBpbiBmcmVlLXJ1bm5pbmcgbW9kZSAqLworCWlzc19yZWdfY2xyKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NSQ19NT0RFLAorCQkgICAgUlNaX1NSQ19NT0RFX09TVCk7CisKKwkvKiBJbml0IFJlc2l6ZXIgQSAqLworCWlzc19yZWdfY2xyKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX01PREUsCisJCSAgICBSWkFfTU9ERV9PTkVfU0hPVCk7CisKKwkvKiBTZXQgc2l6ZSByZWxhdGVkIHRoaW5ncyBub3cgKi8KKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NSQ19WUFMsIDApOworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSU1pfU1JDX0hQUywgMCk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJTWl9TUkNfVlNaLAorCQkgICAgICBpbmZvcm1hdC0+aGVpZ2h0IC0gMik7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJTWl9TUkNfSFNaLAorCQkgICAgICBpbmZvcm1hdC0+d2lkdGggLSAxKTsKKworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfSV9WUFMsIDApOworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfSV9IUFMsIDApOworCisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9PX1ZTWiwKKwkJICAgICAgb3V0Zm9ybWF0LT5oZWlnaHQgLSAyKTsKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX09fSFNaLAorCQkgICAgICBvdXRmb3JtYXQtPndpZHRoIC0gMSk7CisKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1ZfRElGLCAweDEwMCk7CisJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV9IX0RJRiwgMHgxMDApOworCisJLyogQnVmZmVyIG91dHB1dCBzZXR0aW5ncyAqLworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX1lfUFRSX1MsIDApOworCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX1lfUFRSX0UsCisJCSAgICAgIG91dGZvcm1hdC0+aGVpZ2h0IC0gMSk7CisKKwlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1NEUl9ZX09GVCwKKwkJICAgICAgcmVzaXplci0+dmlkZW9fb3V0LmJwbF92YWx1ZSk7CisKKwkvKiBVWVZZIC0+IE5WMTIgY29udmVyc2lvbiAqLworCWlmICgoaW5mb3JtYXQtPmNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2KSAmJgorCSAgICAob3V0Zm9ybWF0LT5jb2RlID09IFY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDgpKSB7CisJCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfNDIwLAorCQkJICAgICAgUlNaXzQyMF9DRU4gfCBSU1pfNDIwX1lFTik7CisKKwkJLyogVVYgQnVmZmVyIG91dHB1dCBzZXR0aW5ncyAqLworCQlpc3NfcmVnX3dyaXRlKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlpBX1NEUl9DX1BUUl9TLAorCQkJICAgICAgMCk7CisJCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX0NfUFRSX0UsCisJCQkgICAgICBvdXRmb3JtYXQtPmhlaWdodCAtIDEpOworCisJCWlzc19yZWdfd3JpdGUoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSWkFfU0RSX0NfT0ZULAorCQkJICAgICAgcmVzaXplci0+dmlkZW9fb3V0LmJwbF92YWx1ZSk7CisJfSBlbHNlIHsKKwkJaXNzX3JlZ193cml0ZShpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJaQV80MjAsIDApOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVycnVwdCBoYW5kbGluZworICovCisKK3N0YXRpYyB2b2lkIHJlc2l6ZXJfaXNyX2J1ZmZlcihzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKQoreworCXN0cnVjdCBpc3NfYnVmZmVyICpidWZmZXI7CisKKwkvKiBUaGUgd2hvbGUgcmVzaXplciBuZWVkcyB0byBiZSBzdG9wcGVkLiBEaXNhYmxpbmcgUlpBIG9ubHkgcHJvZHVjZXMKKwkgKiBpbnB1dCBGSUZPIG92ZXJmbG93cywgbW9zdCBwcm9iYWJseSB3aGVuIHRoZSBuZXh0IGZyYW1lIGlzIHJlY2VpdmVkLgorCSAqLworCXJlc2l6ZXJfZW5hYmxlKHJlc2l6ZXIsIDApOworCisJYnVmZmVyID0gb21hcDRpc3NfdmlkZW9fYnVmZmVyX25leHQoJnJlc2l6ZXItPnZpZGVvX291dCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlyZXNpemVyX3NldF9vdXRhZGRyKHJlc2l6ZXIsIGJ1ZmZlci0+aXNzX2FkZHIpOworCisJcmVzaXplcl9lbmFibGUocmVzaXplciwgMSk7Cit9CisKKy8qCisgKiByZXNpemVyX2lzaWYwX2lzciAtIEhhbmRsZSBJU0lGMCBldmVudAorICogQHJlc2l6ZXI6IFBvaW50ZXIgdG8gSVNQIFJFU0laRVIgZGV2aWNlLgorICoKKyAqIEV4ZWN1dGVzIExTQyBkZWZlcnJlZCBlbmFibGVtZW50IGJlZm9yZSBuZXh0IGZyYW1lIHN0YXJ0cy4KKyAqLworc3RhdGljIHZvaWQgcmVzaXplcl9pbnRfZG1hX2lzcihzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKQoreworCXN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUgPQorCQkJICAgICB0b19pc3NfcGlwZWxpbmUoJnJlc2l6ZXItPnN1YmRldi5lbnRpdHkpOworCWlmIChwaXBlLT5kb19wcm9wYWdhdGlvbikKKwkJYXRvbWljX2luYygmcGlwZS0+ZnJhbWVfbnVtYmVyKTsKKworCXJlc2l6ZXJfaXNyX2J1ZmZlcihyZXNpemVyKTsKK30KKworLyoKKyAqIG9tYXA0aXNzX3Jlc2l6ZXJfaXNyIC0gQ29uZmlndXJlIHJlc2l6ZXIgZHVyaW5nIGludGVyZnJhbWUgdGltZS4KKyAqIEByZXNpemVyOiBQb2ludGVyIHRvIElTUCBSRVNJWkVSIGRldmljZS4KKyAqIEBldmVudHM6IFJFU0laRVIgZXZlbnRzCisgKi8KK3ZvaWQgb21hcDRpc3NfcmVzaXplcl9pc3Ioc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciwgdTMyIGV2ZW50cykKK3sKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzID0gdG9faXNzX2RldmljZShyZXNpemVyKTsKKwlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlID0KKwkJCSAgICAgdG9faXNzX3BpcGVsaW5lKCZyZXNpemVyLT5zdWJkZXYuZW50aXR5KTsKKworCWlmIChldmVudHMgJiAoSVNQNV9JUlFfUlNaX0ZJRk9fSU5fQkxLX0VSUiB8CisJCSAgICAgIElTUDVfSVJRX1JTWl9GSUZPX09WRikpIHsKKwkJZGV2X2RiZyhpc3MtPmRldiwgIlJTWiBFcnI6IEZJRk9fSU5fQkxLOiVkLCBGSUZPX09WRjolZFxuIiwKKwkJCWV2ZW50cyAmIElTUDVfSVJRX1JTWl9GSUZPX0lOX0JMS19FUlIgPyAxIDogMCwKKwkJCWV2ZW50cyAmIElTUDVfSVJRX1JTWl9GSUZPX09WRiA/IDEgOiAwKTsKKwkJb21hcDRpc3NfcGlwZWxpbmVfY2FuY2VsX3N0cmVhbShwaXBlKTsKKwl9CisKKwlpZiAob21hcDRpc3NfbW9kdWxlX3N5bmNfaXNfc3RvcHBpbmcoJnJlc2l6ZXItPndhaXQsCisJCQkJCSAgICAgJnJlc2l6ZXItPnN0b3BwaW5nKSkKKwkJcmV0dXJuOworCisJaWYgKGV2ZW50cyAmIElTUDVfSVJRX1JTWl9JTlRfRE1BKQorCQlyZXNpemVyX2ludF9kbWFfaXNyKHJlc2l6ZXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNTIHZpZGVvIG9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHJlc2l6ZXJfdmlkZW9fcXVldWUoc3RydWN0IGlzc192aWRlbyAqdmlkZW8sCisJCQkgICAgICAgc3RydWN0IGlzc19idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyID0gY29udGFpbmVyX29mKHZpZGVvLAorCQkJCXN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UsIHZpZGVvX291dCk7CisKKwlpZiAoIShyZXNpemVyLT5vdXRwdXQgJiBSRVNJWkVSX09VVFBVVF9NRU1PUlkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlc2l6ZXJfc2V0X291dGFkZHIocmVzaXplciwgYnVmZmVyLT5pc3NfYWRkcik7CisKKwkvKgorCSAqIElmIHN0cmVhbWluZyB3YXMgZW5hYmxlZCBiZWZvcmUgdGhlcmUgd2FzIGEgYnVmZmVyIHF1ZXVlZAorCSAqIG9yIHVuZGVycnVuIGhhcHBlbmVkIGluIHRoZSBJU1IsIHRoZSBoYXJkd2FyZSB3YXMgbm90IGVuYWJsZWQKKwkgKiBhbmQgRE1BIHF1ZXVlIGZsYWcgSVNTX1ZJREVPX0RNQVFVRVVFX1VOREVSUlVOIGlzIHN0aWxsIHNldC4KKwkgKiBFbmFibGUgaXQgbm93LgorCSAqLworCWlmICh2aWRlby0+ZG1hcXVldWVfZmxhZ3MgJiBJU1NfVklERU9fRE1BUVVFVUVfVU5ERVJSVU4pIHsKKwkJcmVzaXplcl9lbmFibGUocmVzaXplciwgMSk7CisJCWlzc192aWRlb19kbWFxdWV1ZV9mbGFnc19jbHIodmlkZW8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzc192aWRlb19vcGVyYXRpb25zIHJlc2l6ZXJfdmlkZW9fb3BzID0geworCS5xdWV1ZSA9IHJlc2l6ZXJfdmlkZW9fcXVldWUsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucworICovCisKKy8qCisgKiByZXNpemVyX3NldF9zdHJlYW0gLSBFbmFibGUvRGlzYWJsZSBzdHJlYW1pbmcgb24gdGhlIFJFU0laRVIgbW9kdWxlCisgKiBAc2Q6IElTUCBSRVNJWkVSIFY0TDIgc3ViZGV2aWNlCisgKiBAZW5hYmxlOiBFbmFibGUvZGlzYWJsZSBzdHJlYW0KKyAqLworc3RhdGljIGludCByZXNpemVyX3NldF9zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UocmVzaXplcik7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW9fb3V0ID0gJnJlc2l6ZXItPnZpZGVvX291dDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyZXNpemVyLT5zdGF0ZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpIHsKKwkJaWYgKGVuYWJsZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCisJCQlyZXR1cm4gMDsKKworCQlvbWFwNGlzc19pc3Bfc3ViY2xrX2VuYWJsZShpc3MsIE9NQVA0X0lTU19JU1BfU1VCQ0xLX1JTWik7CisKKwkJaXNzX3JlZ19zZXQoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSU1pfR0NLX01NUiwKKwkJCSAgICBSU1pfR0NLX01NUl9NTVIpOworCQlpc3NfcmVnX3NldChpc3MsIE9NQVA0X0lTU19NRU1fSVNQX1JFU0laRVIsIFJTWl9HQ0tfU0RSLAorCQkJICAgIFJTWl9HQ0tfU0RSX0NPUkUpOworCisJCS8qIEZJWE1FOiBFbmFibGUgUlNaQiBhbHNvICovCisJCWlzc19yZWdfc2V0KGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NZU0NPTkZJRywKKwkJCSAgICBSU1pfU1lTQ09ORklHX1JTWkFfQ0xLX0VOKTsKKwl9CisKKwlzd2l0Y2ggKGVuYWJsZSkgeworCWNhc2UgSVNTX1BJUEVMSU5FX1NUUkVBTV9DT05USU5VT1VTOgorCisJCXJlc2l6ZXJfY29uZmlndXJlKHJlc2l6ZXIpOworCQlyZXNpemVyX3ByaW50X3N0YXR1cyhyZXNpemVyKTsKKworCQkvKgorCQkgKiBXaGVuIG91dHB1dHRpbmcgdG8gbWVtb3J5IHdpdGggbm8gYnVmZmVyIGF2YWlsYWJsZSwgbGV0IHRoZQorCQkgKiBidWZmZXIgcXVldWUgaGFuZGxlciBzdGFydCB0aGUgaGFyZHdhcmUuIEEgRE1BIHF1ZXVlIGZsYWcKKwkJICogSVNTX1ZJREVPX0RNQVFVRVVFX1FVRVVFRCB3aWxsIGJlIHNldCBhcyBzb29uIGFzIHRoZXJlIGlzCisJCSAqIGEgYnVmZmVyIGF2YWlsYWJsZS4KKwkJICovCisJCWlmIChyZXNpemVyLT5vdXRwdXQgJiBSRVNJWkVSX09VVFBVVF9NRU1PUlkgJiYKKwkJICAgICEodmlkZW9fb3V0LT5kbWFxdWV1ZV9mbGFncyAmIElTU19WSURFT19ETUFRVUVVRV9RVUVVRUQpKQorCQkJYnJlYWs7CisKKwkJYXRvbWljX3NldCgmcmVzaXplci0+c3RvcHBpbmcsIDApOworCQlyZXNpemVyX2VuYWJsZShyZXNpemVyLCAxKTsKKwkJaXNzX3ZpZGVvX2RtYXF1ZXVlX2ZsYWdzX2Nscih2aWRlb19vdXQpOworCQlicmVhazsKKworCWNhc2UgSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOgorCQlpZiAocmVzaXplci0+c3RhdGUgPT0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKQorCQkJcmV0dXJuIDA7CisJCWlmIChvbWFwNGlzc19tb2R1bGVfc3luY19pZGxlKCZzZC0+ZW50aXR5LCAmcmVzaXplci0+d2FpdCwKKwkJCQkJICAgICAgJnJlc2l6ZXItPnN0b3BwaW5nKSkKKwkJCXJldCA9IC1FVElNRURPVVQ7CisKKwkJcmVzaXplcl9lbmFibGUocmVzaXplciwgMCk7CisJCWlzc19yZWdfY2xyKGlzcywgT01BUDRfSVNTX01FTV9JU1BfUkVTSVpFUiwgUlNaX1NZU0NPTkZJRywKKwkJCSAgICBSU1pfU1lTQ09ORklHX1JTWkFfQ0xLX0VOKTsKKwkJaXNzX3JlZ19jbHIoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSU1pfR0NLX1NEUiwKKwkJCSAgICBSU1pfR0NLX1NEUl9DT1JFKTsKKwkJaXNzX3JlZ19jbHIoaXNzLCBPTUFQNF9JU1NfTUVNX0lTUF9SRVNJWkVSLCBSU1pfR0NLX01NUiwKKwkJCSAgICBSU1pfR0NLX01NUl9NTVIpOworCQlvbWFwNGlzc19pc3Bfc3ViY2xrX2Rpc2FibGUoaXNzLCBPTUFQNF9JU1NfSVNQX1NVQkNMS19SU1opOworCQlpc3NfdmlkZW9fZG1hcXVldWVfZmxhZ3NfY2xyKHZpZGVvX291dCk7CisJCWJyZWFrOworCX0KKworCXJlc2l6ZXItPnN0YXRlID0gZW5hYmxlOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19fcmVzaXplcl9nZXRfZm9ybWF0KHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsCisJCSAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwgdW5zaWduZWQgaW50IHBhZCwKKwkJICAgICBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJaWYgKHdoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpCisJCXJldHVybiB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgcGFkKTsKKwllbHNlCisJCXJldHVybiAmcmVzaXplci0+Zm9ybWF0c1twYWRdOworfQorCisvKgorICogcmVzaXplcl90cnlfZm9ybWF0IC0gVHJ5IHZpZGVvIGZvcm1hdCBvbiBhIHBhZAorICogQHJlc2l6ZXI6IElTUyBSRVNJWkVSIGRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBwYWQ6IFBhZCBudW1iZXIKKyAqIEBmbXQ6IEZvcm1hdAorICovCitzdGF0aWMgdm9pZAorcmVzaXplcl90cnlfZm9ybWF0KHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsCisJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsIHVuc2lnbmVkIGludCBwYWQsCisJCSAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCwKKwkJICAgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBwaXhlbGNvZGU7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXVuc2lnbmVkIGludCB3aWR0aCA9IGZtdC0+d2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodCA9IGZtdC0+aGVpZ2h0OworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChwYWQpIHsKKwljYXNlIFJFU0laRVJfUEFEX1NJTks6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlc2l6ZXJfZm10cyk7IGkrKykgeworCQkJaWYgKGZtdC0+Y29kZSA9PSByZXNpemVyX2ZtdHNbaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBJZiBub3QgZm91bmQsIHVzZSBVWVZZIGFzIGRlZmF1bHQgKi8KKwkJaWYgKGkgPj0gQVJSQVlfU0laRShyZXNpemVyX2ZtdHMpKQorCQkJZm10LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2OworCisJCS8qIENsYW1wIHRoZSBpbnB1dCBzaXplLiAqLworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAxLCA4MTkyKTsKKwkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAxLCA4MTkyKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU0laRVJfUEFEX1NPVVJDRV9NRU06CisJCXBpeGVsY29kZSA9IGZtdC0+Y29kZTsKKwkJZm9ybWF0ID0gX19yZXNpemVyX2dldF9mb3JtYXQocmVzaXplciwgZmgsIFJFU0laRVJfUEFEX1NJTkssCisJCQkJCSAgICAgIHdoaWNoKTsKKwkJbWVtY3B5KGZtdCwgZm9ybWF0LCBzaXplb2YoKmZtdCkpOworCisJCWlmICgocGl4ZWxjb2RlID09IFY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDgpICYmCisJCSAgICAoZm10LT5jb2RlID09IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNikpCisJCQlmbXQtPmNvZGUgPSBwaXhlbGNvZGU7CisKKwkJLyogVGhlIGRhdGEgZm9ybWF0dGVyIHRydW5jYXRlcyB0aGUgbnVtYmVyIG9mIGhvcml6b250YWwgb3V0cHV0CisJCSAqIHBpeGVscyB0byBhIG11bHRpcGxlIG9mIDE2LiBUbyBhdm9pZCBjbGlwcGluZyBkYXRhLCBhbGxvdworCQkgKiBjYWxsZXJzIHRvIHJlcXVlc3QgYW4gb3V0cHV0IHNpemUgYmlnZ2VyIHRoYW4gdGhlIGlucHV0IHNpemUKKwkJICogdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYuCisJCSAqLworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAzMiwgKGZtdC0+d2lkdGggKyAxNSkgJiB+MTUpOworCQlmbXQtPndpZHRoICY9IH4xNTsKKwkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAzMiwgZm10LT5oZWlnaHQpOworCQlicmVhazsKKworCX0KKworCWZtdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cit9CisKKy8qCisgKiByZXNpemVyX2VudW1fbWJ1c19jb2RlIC0gSGFuZGxlIHBpeGVsIGZvcm1hdCBlbnVtZXJhdGlvbgorICogQHNkICAgICA6IHBvaW50ZXIgdG8gdjRsMiBzdWJkZXYgc3RydWN0dXJlCisgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQGNvZGUgICA6IHBvaW50ZXIgdG8gdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gc3RydWN0dXJlCisgKiByZXR1cm4gLUVJTlZBTCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCByZXNpemVyX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCXN3aXRjaCAoY29kZS0+cGFkKSB7CisJY2FzZSBSRVNJWkVSX1BBRF9TSU5LOgorCQlpZiAoY29kZS0+aW5kZXggPj0gQVJSQVlfU0laRShyZXNpemVyX2ZtdHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY29kZS0+Y29kZSA9IHJlc2l6ZXJfZm10c1tjb2RlLT5pbmRleF07CisJCWJyZWFrOworCisJY2FzZSBSRVNJWkVSX1BBRF9TT1VSQ0VfTUVNOgorCQlmb3JtYXQgPSBfX3Jlc2l6ZXJfZ2V0X2Zvcm1hdChyZXNpemVyLCBmaCwgUkVTSVpFUl9QQURfU0lOSywKKwkJCQkJICAgICAgVjRMMl9TVUJERVZfRk9STUFUX1RSWSk7CisKKwkJaWYgKGNvZGUtPmluZGV4ID09IDApIHsKKwkJCWNvZGUtPmNvZGUgPSBmb3JtYXQtPmNvZGU7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoZm9ybWF0LT5jb2RlKSB7CisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2OgorCQkJaWYgKGNvZGUtPmluZGV4ID09IDEpCisJCQkJY29kZS0+Y29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDg7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChjb2RlLT5pbmRleCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNpemVyX2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCXN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKworCWlmIChmc2UtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9ybWF0LmNvZGUgPSBmc2UtPmNvZGU7CisJZm9ybWF0LndpZHRoID0gMTsKKwlmb3JtYXQuaGVpZ2h0ID0gMTsKKwlyZXNpemVyX3RyeV9mb3JtYXQocmVzaXplciwgZmgsIGZzZS0+cGFkLCAmZm9ybWF0LAorCQkJICAgVjRMMl9TVUJERVZfRk9STUFUX1RSWSk7CisJZnNlLT5taW5fd2lkdGggPSBmb3JtYXQud2lkdGg7CisJZnNlLT5taW5faGVpZ2h0ID0gZm9ybWF0LmhlaWdodDsKKworCWlmIChmb3JtYXQuY29kZSAhPSBmc2UtPmNvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9ybWF0LmNvZGUgPSBmc2UtPmNvZGU7CisJZm9ybWF0LndpZHRoID0gLTE7CisJZm9ybWF0LmhlaWdodCA9IC0xOworCXJlc2l6ZXJfdHJ5X2Zvcm1hdChyZXNpemVyLCBmaCwgZnNlLT5wYWQsICZmb3JtYXQsCisJCQkgICBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKTsKKwlmc2UtPm1heF93aWR0aCA9IGZvcm1hdC53aWR0aDsKKwlmc2UtPm1heF9oZWlnaHQgPSBmb3JtYXQuaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZXNpemVyX2dldF9mb3JtYXQgLSBSZXRyaWV2ZSB0aGUgdmlkZW8gZm9ybWF0IG9uIGEgcGFkCisgKiBAc2QgOiBJU1AgUkVTSVpFUiBWNEwyIHN1YmRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IEZvcm1hdAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgcGFkIGlzIGludmFsaWQgb3IgZG9lc24ndCBjb3JyZXNwb25kCisgKiB0byB0aGUgZm9ybWF0IHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgcmVzaXplcl9nZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9fcmVzaXplcl9nZXRfZm9ybWF0KHJlc2l6ZXIsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CisJaWYgKGZvcm1hdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZtdC0+Zm9ybWF0ID0gKmZvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlc2l6ZXJfc2V0X2Zvcm1hdCAtIFNldCB0aGUgdmlkZW8gZm9ybWF0IG9uIGEgcGFkCisgKiBAc2QgOiBJU1AgUkVTSVpFUiBWNEwyIHN1YmRldmljZQorICogQGZoIDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBmbXQ6IEZvcm1hdAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgcGFkIGlzIGludmFsaWQgb3IgZG9lc24ndCBjb3JyZXNwb25kCisgKiB0byB0aGUgZm9ybWF0IHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgcmVzaXplcl9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCWZvcm1hdCA9IF9fcmVzaXplcl9nZXRfZm9ybWF0KHJlc2l6ZXIsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CisJaWYgKGZvcm1hdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc2l6ZXJfdHJ5X2Zvcm1hdChyZXNpemVyLCBmaCwgZm10LT5wYWQsICZmbXQtPmZvcm1hdCwgZm10LT53aGljaCk7CisJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OworCisJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgZnJvbSBzaW5rIHRvIHNvdXJjZSAqLworCWlmIChmbXQtPnBhZCA9PSBSRVNJWkVSX1BBRF9TSU5LKSB7CisJCWZvcm1hdCA9IF9fcmVzaXplcl9nZXRfZm9ybWF0KHJlc2l6ZXIsIGZoLAorCQkJCQkgICAgICBSRVNJWkVSX1BBRF9TT1VSQ0VfTUVNLAorCQkJCQkgICAgICBmbXQtPndoaWNoKTsKKwkJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OworCQlyZXNpemVyX3RyeV9mb3JtYXQocmVzaXplciwgZmgsIFJFU0laRVJfUEFEX1NPVVJDRV9NRU0sIGZvcm1hdCwKKwkJCQlmbXQtPndoaWNoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNpemVyX2xpbmtfdmFsaWRhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgc3RydWN0IG1lZGlhX2xpbmsgKmxpbmssCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKnNvdXJjZV9mbXQsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKnNpbmtfZm10KQoreworCS8qIENoZWNrIGlmIHRoZSB0d28gZW5kcyBtYXRjaCAqLworCWlmIChzb3VyY2VfZm10LT5mb3JtYXQud2lkdGggIT0gc2lua19mbXQtPmZvcm1hdC53aWR0aCB8fAorCSAgICBzb3VyY2VfZm10LT5mb3JtYXQuaGVpZ2h0ICE9IHNpbmtfZm10LT5mb3JtYXQuaGVpZ2h0KQorCQlyZXR1cm4gLUVQSVBFOworCisJaWYgKHNvdXJjZV9mbXQtPmZvcm1hdC5jb2RlICE9IHNpbmtfZm10LT5mb3JtYXQuY29kZSkKKwkJcmV0dXJuIC1FUElQRTsKKworCXJldHVybiAwOworfQorCisvKgorICogcmVzaXplcl9pbml0X2Zvcm1hdHMgLSBJbml0aWFsaXplIGZvcm1hdHMgb24gYWxsIHBhZHMKKyAqIEBzZDogSVNQIFJFU0laRVIgVjRMMiBzdWJkZXZpY2UKKyAqIEBmaDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqCisgKiBJbml0aWFsaXplIGFsbCBwYWQgZm9ybWF0cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBJZiBmaCBpcyBub3QgTlVMTCwgdHJ5CisgKiBmb3JtYXRzIGFyZSBpbml0aWFsaXplZCBvbiB0aGUgZmlsZSBoYW5kbGUuIE90aGVyd2lzZSBhY3RpdmUgZm9ybWF0cyBhcmUKKyAqIGluaXRpYWxpemVkIG9uIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgcmVzaXplcl9pbml0X2Zvcm1hdHMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgZm9ybWF0OworCisJbWVtc2V0KCZmb3JtYXQsIDAsIHNpemVvZihmb3JtYXQpKTsKKwlmb3JtYXQucGFkID0gUkVTSVpFUl9QQURfU0lOSzsKKwlmb3JtYXQud2hpY2ggPSBmaCA/IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkgOiBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOworCWZvcm1hdC5mb3JtYXQuY29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNjsKKwlmb3JtYXQuZm9ybWF0LndpZHRoID0gNDA5NjsKKwlmb3JtYXQuZm9ybWF0LmhlaWdodCA9IDQwOTY7CisJcmVzaXplcl9zZXRfZm9ybWF0KHNkLCBmaCwgJmZvcm1hdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVjRMMiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgcmVzaXplcl92NGwyX3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0gPSByZXNpemVyX3NldF9zdHJlYW0sCit9OworCisvKiBWNEwyIHN1YmRldiBwYWQgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIHJlc2l6ZXJfdjRsMl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IHJlc2l6ZXJfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IHJlc2l6ZXJfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gcmVzaXplcl9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gcmVzaXplcl9zZXRfZm9ybWF0LAorCS5saW5rX3ZhbGlkYXRlID0gcmVzaXplcl9saW5rX3ZhbGlkYXRlLAorfTsKKworLyogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgcmVzaXplcl92NGwyX29wcyA9IHsKKwkudmlkZW8gPSAmcmVzaXplcl92NGwyX3ZpZGVvX29wcywKKwkucGFkID0gJnJlc2l6ZXJfdjRsMl9wYWRfb3BzLAorfTsKKworLyogVjRMMiBzdWJkZXYgaW50ZXJuYWwgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgcmVzaXplcl92NGwyX2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IHJlc2l6ZXJfaW5pdF9mb3JtYXRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1lZGlhIGVudGl0eSBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIHJlc2l6ZXJfbGlua19zZXR1cCAtIFNldHVwIFJFU0laRVIgY29ubmVjdGlvbnMKKyAqIEBlbnRpdHk6IFJFU0laRVIgbWVkaWEgZW50aXR5CisgKiBAbG9jYWw6IFBhZCBhdCB0aGUgbG9jYWwgZW5kIG9mIHRoZSBsaW5rCisgKiBAcmVtb3RlOiBQYWQgYXQgdGhlIHJlbW90ZSBlbmQgb2YgdGhlIGxpbmsKKyAqIEBmbGFnczogTGluayBmbGFncworICoKKyAqIHJldHVybiAtRUlOVkFMIG9yIHplcm8gb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IHJlc2l6ZXJfbGlua19zZXR1cChzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHksCisJCQkgICBjb25zdCBzdHJ1Y3QgbWVkaWFfcGFkICpsb2NhbCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBtZWRpYV9wYWQgKnJlbW90ZSwgdTMyIGZsYWdzKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYoZW50aXR5KTsKKwlzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGlzc19kZXZpY2UgKmlzcyA9IHRvX2lzc19kZXZpY2UocmVzaXplcik7CisKKwlzd2l0Y2ggKGxvY2FsLT5pbmRleCB8IG1lZGlhX2VudGl0eV90eXBlKHJlbW90ZS0+ZW50aXR5KSkgeworCWNhc2UgUkVTSVpFUl9QQURfU0lOSyB8IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOgorCQkvKiBSZWFkIGZyb20gSVBJUEUgb3IgSVBJUEVJRi4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJCXJlc2l6ZXItPmlucHV0ID0gUkVTSVpFUl9JTlBVVF9OT05FOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVzaXplci0+aW5wdXQgIT0gUkVTSVpFUl9JTlBVVF9OT05FKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAocmVtb3RlLT5lbnRpdHkgPT0gJmlzcy0+aXBpcGVpZi5zdWJkZXYuZW50aXR5KQorCQkJcmVzaXplci0+aW5wdXQgPSBSRVNJWkVSX0lOUFVUX0lQSVBFSUY7CisJCWVsc2UgaWYgKHJlbW90ZS0+ZW50aXR5ID09ICZpc3MtPmlwaXBlLnN1YmRldi5lbnRpdHkpCisJCQlyZXNpemVyLT5pbnB1dCA9IFJFU0laRVJfSU5QVVRfSVBJUEU7CisKKworCQlicmVhazsKKworCWNhc2UgUkVTSVpFUl9QQURfU09VUkNFX01FTSB8IE1FRElBX0VOVF9UX0RFVk5PREU6CisJCS8qIFdyaXRlIHRvIG1lbW9yeSAqLworCQlpZiAoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkgeworCQkJaWYgKHJlc2l6ZXItPm91dHB1dCAmIH5SRVNJWkVSX09VVFBVVF9NRU1PUlkpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJlc2l6ZXItPm91dHB1dCB8PSBSRVNJWkVSX09VVFBVVF9NRU1PUlk7CisJCX0gZWxzZSB7CisJCQlyZXNpemVyLT5vdXRwdXQgJj0gflJFU0laRVJfT1VUUFVUX01FTU9SWTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtZWRpYSBvcGVyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lZGlhX2VudGl0eV9vcGVyYXRpb25zIHJlc2l6ZXJfbWVkaWFfb3BzID0geworCS5saW5rX3NldHVwID0gcmVzaXplcl9saW5rX3NldHVwLAorCS5saW5rX3ZhbGlkYXRlID0gdjRsMl9zdWJkZXZfbGlua192YWxpZGF0ZSwKK307CisKKy8qCisgKiByZXNpemVyX2luaXRfZW50aXRpZXMgLSBJbml0aWFsaXplIFY0TDIgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkKKyAqIEByZXNpemVyOiBJU1MgSVNQIFJFU0laRVIgbW9kdWxlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgcmVzaXplcl9pbml0X2VudGl0aWVzKHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZyZXNpemVyLT5zdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZCAqcGFkcyA9IHJlc2l6ZXItPnBhZHM7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqbWUgPSAmc2QtPmVudGl0eTsKKwlpbnQgcmV0OworCisJcmVzaXplci0+aW5wdXQgPSBSRVNJWkVSX0lOUFVUX05PTkU7CisKKwl2NGwyX3N1YmRldl9pbml0KHNkLCAmcmVzaXplcl92NGwyX29wcyk7CisJc2QtPmludGVybmFsX29wcyA9ICZyZXNpemVyX3Y0bDJfaW50ZXJuYWxfb3BzOworCXN0cmxjcHkoc2QtPm5hbWUsICJPTUFQNCBJU1MgSVNQIHJlc2l6ZXIiLCBzaXplb2Yoc2QtPm5hbWUpKTsKKwlzZC0+Z3JwX2lkID0gMSA8PCAxNjsJLyogZ3JvdXAgSUQgZm9yIGlzcyBzdWJkZXZzICovCisJdjRsMl9zZXRfc3ViZGV2ZGF0YShzZCwgcmVzaXplcik7CisJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCisJcGFkc1tSRVNJWkVSX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCXBhZHNbUkVTSVpFUl9QQURfU09VUkNFX01FTV0uZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOworCisJbWUtPm9wcyA9ICZyZXNpemVyX21lZGlhX29wczsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdChtZSwgUkVTSVpFUl9QQURTX05VTSwgcGFkcywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXNpemVyX2luaXRfZm9ybWF0cyhzZCwgTlVMTCk7CisKKwlyZXNpemVyLT52aWRlb19vdXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlyZXNpemVyLT52aWRlb19vdXQub3BzID0gJnJlc2l6ZXJfdmlkZW9fb3BzOworCXJlc2l6ZXItPnZpZGVvX291dC5pc3MgPSB0b19pc3NfZGV2aWNlKHJlc2l6ZXIpOworCXJlc2l6ZXItPnZpZGVvX291dC5jYXB0dXJlX21lbSA9IFBBR0VfQUxJR04oNDA5NiAqIDQwOTYpICogMzsKKwlyZXNpemVyLT52aWRlb19vdXQuYnBsX2FsaWdubWVudCA9IDMyOworCXJlc2l6ZXItPnZpZGVvX291dC5icGxfemVyb19wYWRkaW5nID0gMTsKKwlyZXNpemVyLT52aWRlb19vdXQuYnBsX21heCA9IDB4MWZmZTA7CisKKwlyZXQgPSBvbWFwNGlzc192aWRlb19pbml0KCZyZXNpemVyLT52aWRlb19vdXQsICJJU1AgcmVzaXplciBhIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb25uZWN0IHRoZSBSRVNJWkVSIHN1YmRldiB0byB0aGUgdmlkZW8gbm9kZS4gKi8KKwlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnJlc2l6ZXItPnN1YmRldi5lbnRpdHksCisJCQkJICAgICAgIFJFU0laRVJfUEFEX1NPVVJDRV9NRU0sCisJCQkJICAgICAgICZyZXNpemVyLT52aWRlb19vdXQudmlkZW8uZW50aXR5LCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXA0aXNzX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKQoreworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZyZXNpemVyLT5zdWJkZXYuZW50aXR5KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZyZXNpemVyLT5zdWJkZXYpOworCW9tYXA0aXNzX3ZpZGVvX3VucmVnaXN0ZXIoJnJlc2l6ZXItPnZpZGVvX291dCk7Cit9CisKK2ludCBvbWFwNGlzc19yZXNpemVyX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsCisJc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2RlLiAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2ZGV2LCAmcmVzaXplci0+c3ViZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9tYXA0aXNzX3ZpZGVvX3JlZ2lzdGVyKCZyZXNpemVyLT52aWRlb19vdXQsIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW9tYXA0aXNzX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhyZXNpemVyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNQIFJFU0laRVIgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKKyAqLworCisvKgorICogb21hcDRpc3NfcmVzaXplcl9pbml0IC0gUkVTSVpFUiBtb2R1bGUgaW5pdGlhbGl6YXRpb24uCisgKiBAaXNzOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDQgSVNTLgorICoKKyAqIFRPRE86IEdldCB0aGUgaW5pdGlhbGlzYXRpb24gdmFsdWVzIGZyb20gcGxhdGZvcm0gZGF0YS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBvbWFwNGlzc19yZXNpemVyX2luaXQoc3RydWN0IGlzc19kZXZpY2UgKmlzcykKK3sKKwlzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyID0gJmlzcy0+cmVzaXplcjsKKworCXJlc2l6ZXItPnN0YXRlID0gSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlc2l6ZXItPndhaXQpOworCisJcmV0dXJuIHJlc2l6ZXJfaW5pdF9lbnRpdGllcyhyZXNpemVyKTsKK30KKworLyoKKyAqIG9tYXA0aXNzX3Jlc2l6ZXJfY2xlYW51cCAtIFJFU0laRVIgbW9kdWxlIGNsZWFudXAuCisgKiBAaXNzOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDQgSVNTLgorICovCit2b2lkIG9tYXA0aXNzX3Jlc2l6ZXJfY2xlYW51cChzdHJ1Y3QgaXNzX2RldmljZSAqaXNzKQoreworCS8qIEZJWE1FOiBhcmUgeW91IHN1cmUgdGhlcmUncyBub3RoaW5nIHRvIGRvPyAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19yZXNpemVyLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3Jlc2l6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI3NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc19yZXNpemVyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIFRJIE9NQVA0IElTUyBWNEwyIERyaXZlciAtIElTUCBSRVNJWkVSIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEF1dGhvcjogU2VyZ2lvIEFndWlycmUgPHNlcmdpby5hLmFndWlycmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBPTUFQNF9JU1NfUkVTSVpFUl9ICisjZGVmaW5lIE9NQVA0X0lTU19SRVNJWkVSX0gKKworI2luY2x1ZGUgImlzc192aWRlby5oIgorCitlbnVtIHJlc2l6ZXJfaW5wdXRfZW50aXR5IHsKKwlSRVNJWkVSX0lOUFVUX05PTkUsCisJUkVTSVpFUl9JTlBVVF9JUElQRSwKKwlSRVNJWkVSX0lOUFVUX0lQSVBFSUYKK307CisKKyNkZWZpbmUgUkVTSVpFUl9PVVRQVVRfTUVNT1JZCQkoMSA8PCAwKQorCisvKiBTaW5rIGFuZCBzb3VyY2UgUkVTSVpFUiBwYWRzICovCisjZGVmaW5lIFJFU0laRVJfUEFEX1NJTksJCQkwCisjZGVmaW5lIFJFU0laRVJfUEFEX1NPVVJDRV9NRU0JCQkxCisjZGVmaW5lIFJFU0laRVJfUEFEU19OVU0JCQkyCisKKy8qCisgKiBzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlIC0gU3RydWN0dXJlIGZvciB0aGUgUkVTSVpFUiBtb2R1bGUgdG8gc3RvcmUgaXRzIG93bgorICoJCQkgICAgaW5mb3JtYXRpb24KKyAqIEBzdWJkZXY6IFY0TDIgc3ViZGV2aWNlCisgKiBAcGFkczogU2luayBhbmQgc291cmNlIG1lZGlhIGVudGl0eSBwYWRzCisgKiBAZm9ybWF0czogQWN0aXZlIHZpZGVvIGZvcm1hdHMKKyAqIEBpbnB1dDogQWN0aXZlIGlucHV0CisgKiBAb3V0cHV0OiBBY3RpdmUgb3V0cHV0cworICogQHZpZGVvX291dDogT3V0cHV0IHZpZGVvIG5vZGUKKyAqIEBlcnJvcjogQSBoYXJkd2FyZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY2FwdHVyZQorICogQHN0YXRlOiBTdHJlYW1pbmcgc3RhdGUKKyAqIEB3YWl0OiBXYWl0IHF1ZXVlIHVzZWQgdG8gc3RvcCB0aGUgbW9kdWxlCisgKiBAc3RvcHBpbmc6IFN0b3BwaW5nIHN0YXRlCisgKi8KK3N0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZCBwYWRzW1JFU0laRVJfUEFEU19OVU1dOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0c1tSRVNJWkVSX1BBRFNfTlVNXTsKKworCWVudW0gcmVzaXplcl9pbnB1dF9lbnRpdHkgaW5wdXQ7CisJdW5zaWduZWQgaW50IG91dHB1dDsKKwlzdHJ1Y3QgaXNzX3ZpZGVvIHZpZGVvX291dDsKKwl1bnNpZ25lZCBpbnQgZXJyb3I7CisKKwllbnVtIGlzc19waXBlbGluZV9zdHJlYW1fc3RhdGUgc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwlhdG9taWNfdCBzdG9wcGluZzsKK307CisKK3N0cnVjdCBpc3NfZGV2aWNlOworCitpbnQgb21hcDRpc3NfcmVzaXplcl9pbml0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOwordm9pZCBvbWFwNGlzc19yZXNpemVyX2NsZWFudXAoc3RydWN0IGlzc19kZXZpY2UgKmlzcyk7CitpbnQgb21hcDRpc3NfcmVzaXplcl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyLAorCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldik7Cit2b2lkIG9tYXA0aXNzX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKTsKKworaW50IG9tYXA0aXNzX3Jlc2l6ZXJfYnVzeShzdHJ1Y3QgaXNzX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyKTsKK3ZvaWQgb21hcDRpc3NfcmVzaXplcl9pc3Ioc3RydWN0IGlzc19yZXNpemVyX2RldmljZSAqcmVzaXplciwgdTMyIGV2ZW50cyk7Cit2b2lkIG9tYXA0aXNzX3Jlc2l6ZXJfcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBpc3NfZGV2aWNlICppc3MpOwordm9pZCBvbWFwNGlzc19yZXNpemVyX21heF9yYXRlKHN0cnVjdCBpc3NfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsCisJdW5zaWduZWQgaW50ICptYXhfcmF0ZSk7CisKKyNlbmRpZgkvKiBPTUFQNF9JU1NfUkVTSVpFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ZjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfdmlkZW8uYwpAQCAtMCwwICsxLDEyMjYgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIgLSBHZW5lcmljIHZpZGVvIG5vZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFNlcmdpbyBBZ3VpcnJlIDxzZXJnaW8uYS5hZ3VpcnJlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKworI2luY2x1ZGUgImlzc192aWRlby5oIgorI2luY2x1ZGUgImlzcy5oIgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIZWxwZXIgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBpc3NfZm9ybWF0X2luZm8gZm9ybWF0c1tdID0geworCXsgVjRMMl9NQlVTX0ZNVF9ZOF8xWDgsIFY0TDJfTUJVU19GTVRfWThfMVg4LAorCSAgVjRMMl9NQlVTX0ZNVF9ZOF8xWDgsIFY0TDJfTUJVU19GTVRfWThfMVg4LAorCSAgVjRMMl9QSVhfRk1UX0dSRVksIDgsICJHcmV5c2NhbGUgOCBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9ZMTBfMVgxMCwgVjRMMl9NQlVTX0ZNVF9ZMTBfMVgxMCwKKwkgIFY0TDJfTUJVU19GTVRfWTEwXzFYMTAsIFY0TDJfTUJVU19GTVRfWThfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1kxMCwgMTAsICJHcmV5c2NhbGUgMTAgYnBwIiwgfSwKKwl7IFY0TDJfTUJVU19GTVRfWTEyXzFYMTIsIFY0TDJfTUJVU19GTVRfWTEwXzFYMTAsCisJICBWNEwyX01CVVNfRk1UX1kxMl8xWDEyLCBWNEwyX01CVVNfRk1UX1k4XzFYOCwKKwkgIFY0TDJfUElYX0ZNVF9ZMTIsIDEyLCAiR3JleXNjYWxlIDEyIGJwcCIsIH0sCisJeyBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwKKwkgIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwgVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1NCR0dSOCwgOCwgIkJHR1IgQmF5ZXIgOCBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9TR0JSRzhfMVg4LCBWNEwyX01CVVNfRk1UX1NHQlJHOF8xWDgsCisJICBWNEwyX01CVVNfRk1UX1NHQlJHOF8xWDgsIFY0TDJfTUJVU19GTVRfU0dCUkc4XzFYOCwKKwkgIFY0TDJfUElYX0ZNVF9TR0JSRzgsIDgsICJHQlJHIEJheWVyIDggYnBwIiwgfSwKKwl7IFY0TDJfTUJVU19GTVRfU0dSQkc4XzFYOCwgVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4LAorCSAgVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4LCBWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDgsCisJICBWNEwyX1BJWF9GTVRfU0dSQkc4LCA4LCAiR1JCRyBCYXllciA4IGJwcCIsIH0sCisJeyBWNEwyX01CVVNfRk1UX1NSR0dCOF8xWDgsIFY0TDJfTUJVU19GTVRfU1JHR0I4XzFYOCwKKwkgIFY0TDJfTUJVU19GTVRfU1JHR0I4XzFYOCwgVjRMMl9NQlVTX0ZNVF9TUkdHQjhfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1NSR0dCOCwgOCwgIlJHR0IgQmF5ZXIgOCBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwX0RQQ004XzFYOCwgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwX0RQQ004XzFYOCwKKwkgIFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLCAwLAorCSAgVjRMMl9QSVhfRk1UX1NHUkJHMTBEUENNOCwgOCwgIkdSQkcgQmF5ZXIgMTAgYnBwIERQQ004IiwgIH0sCisJeyBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCwgVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCisJICBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCwgVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1NCR0dSMTAsIDEwLCAiQkdHUiBCYXllciAxMCBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTAsIFY0TDJfTUJVU19GTVRfU0dCUkcxMF8xWDEwLAorCSAgVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTAsIFY0TDJfTUJVU19GTVRfU0dCUkc4XzFYOCwKKwkgIFY0TDJfUElYX0ZNVF9TR0JSRzEwLCAxMCwgIkdCUkcgQmF5ZXIgMTAgYnBwIiwgfSwKKwl7IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLCBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCwKKwkgIFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLCBWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDgsCisJICBWNEwyX1BJWF9GTVRfU0dSQkcxMCwgMTAsICJHUkJHIEJheWVyIDEwIGJwcCIsIH0sCisJeyBWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMCwgVjRMMl9NQlVTX0ZNVF9TUkdHQjEwXzFYMTAsCisJICBWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMCwgVjRMMl9NQlVTX0ZNVF9TUkdHQjhfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1NSR0dCMTAsIDEwLCAiUkdHQiBCYXllciAxMCBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9TQkdHUjEyXzFYMTIsIFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAorCSAgVjRMMl9NQlVTX0ZNVF9TQkdHUjEyXzFYMTIsIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwKKwkgIFY0TDJfUElYX0ZNVF9TQkdHUjEyLCAxMiwgIkJHR1IgQmF5ZXIgMTIgYnBwIiwgfSwKKwl7IFY0TDJfTUJVU19GTVRfU0dCUkcxMl8xWDEyLCBWNEwyX01CVVNfRk1UX1NHQlJHMTBfMVgxMCwKKwkgIFY0TDJfTUJVU19GTVRfU0dCUkcxMl8xWDEyLCBWNEwyX01CVVNfRk1UX1NHQlJHOF8xWDgsCisJICBWNEwyX1BJWF9GTVRfU0dCUkcxMiwgMTIsICJHQlJHIEJheWVyIDEyIGJwcCIsIH0sCisJeyBWNEwyX01CVVNfRk1UX1NHUkJHMTJfMVgxMiwgVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTAsCisJICBWNEwyX01CVVNfRk1UX1NHUkJHMTJfMVgxMiwgVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4LAorCSAgVjRMMl9QSVhfRk1UX1NHUkJHMTIsIDEyLCAiR1JCRyBCYXllciAxMiBicHAiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9TUkdHQjEyXzFYMTIsIFY0TDJfTUJVU19GTVRfU1JHR0IxMF8xWDEwLAorCSAgVjRMMl9NQlVTX0ZNVF9TUkdHQjEyXzFYMTIsIFY0TDJfTUJVU19GTVRfU1JHR0I4XzFYOCwKKwkgIFY0TDJfUElYX0ZNVF9TUkdHQjEyLCAxMiwgIlJHR0IgQmF5ZXIgMTIgYnBwIiwgfSwKKwl7IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNiwgVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LAorCSAgVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LCAwLAorCSAgVjRMMl9QSVhfRk1UX1VZVlksIDE2LCAiWVVWIDQ6MjoyIChVWVZZKSIsIH0sCisJeyBWNEwyX01CVVNfRk1UX1lVWVY4XzFYMTYsIFY0TDJfTUJVU19GTVRfWVVZVjhfMVgxNiwKKwkgIFY0TDJfTUJVU19GTVRfWVVZVjhfMVgxNiwgMCwKKwkgIFY0TDJfUElYX0ZNVF9ZVVlWLCAxNiwgIllVViA0OjI6MiAoWVVZVikiLCB9LAorCXsgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xXzVYOCwgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xXzVYOCwKKwkgIFY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDgsIDAsCisJICBWNEwyX1BJWF9GTVRfTlYxMiwgOCwgIllVViA0OjI6MCAoTlYxMikiLCB9LAorfTsKKworY29uc3Qgc3RydWN0IGlzc19mb3JtYXRfaW5mbyAqCitvbWFwNGlzc192aWRlb19mb3JtYXRfaW5mbyhlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyArK2kpIHsKKwkJaWYgKGZvcm1hdHNbaV0uY29kZSA9PSBjb2RlKQorCQkJcmV0dXJuICZmb3JtYXRzW2ldOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogaXNzX3ZpZGVvX21idXNfdG9fcGl4IC0gQ29udmVydCB2NGwyX21idXNfZnJhbWVmbXQgdG8gdjRsMl9waXhfZm9ybWF0CisgKiBAdmlkZW86IElTUyB2aWRlbyBpbnN0YW5jZQorICogQG1idXM6IHY0bDJfbWJ1c19mcmFtZWZtdCBmb3JtYXQgKGlucHV0KQorICogQHBpeDogdjRsMl9waXhfZm9ybWF0IGZvcm1hdCAob3V0cHV0KQorICoKKyAqIEZpbGwgdGhlIG91dHB1dCBwaXggc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5wdXQgbWJ1cyBmb3JtYXQuCisgKiBUaGUgYnl0ZXNwZXJsaW5lIGFuZCBzaXplaW1hZ2UgZmllbGRzIGFyZSBjb21wdXRlZCBmcm9tIHRoZSByZXF1ZXN0ZWQgYnl0ZXMKKyAqIHBlciBsaW5lIHZhbHVlIGluIHRoZSBwaXggZm9ybWF0IGFuZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aWRlbyBpbnN0YW5jZS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGF0IGVuZCBvZiBsaW5lLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlzc192aWRlb19tYnVzX3RvX3BpeChjb25zdCBzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbywKKwkJCQkJICBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptYnVzLAorCQkJCQkgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCkKK3sKKwl1bnNpZ25lZCBpbnQgYnBsID0gcGl4LT5ieXRlc3BlcmxpbmU7CisJdW5zaWduZWQgaW50IG1pbl9icGw7CisJdW5zaWduZWQgaW50IGk7CisKKwltZW1zZXQocGl4LCAwLCBzaXplb2YoKnBpeCkpOworCXBpeC0+d2lkdGggPSBtYnVzLT53aWR0aDsKKwlwaXgtPmhlaWdodCA9IG1idXMtPmhlaWdodDsKKworCS8qIFNraXAgdGhlIGxhc3QgZm9ybWF0IGluIHRoZSBsb29wIHNvIHRoYXQgaXQgd2lsbCBiZSBzZWxlY3RlZCBpZiBubworCSAqIG1hdGNoIGlzIGZvdW5kLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpIC0gMTsgKytpKSB7CisJCWlmIChmb3JtYXRzW2ldLmNvZGUgPT0gbWJ1cy0+Y29kZSkKKwkJCWJyZWFrOworCX0KKworCW1pbl9icGwgPSBwaXgtPndpZHRoICogQUxJR04oZm9ybWF0c1tpXS5icHAsIDgpIC8gODsKKworCS8qIENsYW1wIHRoZSByZXF1ZXN0ZWQgYnl0ZXMgcGVyIGxpbmUgdmFsdWUuIElmIHRoZSBtYXhpbXVtIGJ5dGVzIHBlcgorCSAqIGxpbmUgdmFsdWUgaXMgemVybywgdGhlIG1vZHVsZSBkb2Vzbid0IHN1cHBvcnQgdXNlciBjb25maWd1cmFibGUgbGluZQorCSAqIHNpemVzLiBPdmVycmlkZSB0aGUgcmVxdWVzdGVkIHZhbHVlIHdpdGggdGhlIG1pbmltdW0gaW4gdGhhdCBjYXNlLgorCSAqLworCWlmICh2aWRlby0+YnBsX21heCkKKwkJYnBsID0gY2xhbXAoYnBsLCBtaW5fYnBsLCB2aWRlby0+YnBsX21heCk7CisJZWxzZQorCQlicGwgPSBtaW5fYnBsOworCisJaWYgKCF2aWRlby0+YnBsX3plcm9fcGFkZGluZyB8fCBicGwgIT0gbWluX2JwbCkKKwkJYnBsID0gQUxJR04oYnBsLCB2aWRlby0+YnBsX2FsaWdubWVudCk7CisKKwlwaXgtPnBpeGVsZm9ybWF0ID0gZm9ybWF0c1tpXS5waXhlbGZvcm1hdDsKKwlwaXgtPmJ5dGVzcGVybGluZSA9IGJwbDsKKwlwaXgtPnNpemVpbWFnZSA9IHBpeC0+Ynl0ZXNwZXJsaW5lICogcGl4LT5oZWlnaHQ7CisJcGl4LT5jb2xvcnNwYWNlID0gbWJ1cy0+Y29sb3JzcGFjZTsKKwlwaXgtPmZpZWxkID0gbWJ1cy0+ZmllbGQ7CisKKwkvKiBGSVhNRTogU3BlY2lhbCBjYXNlIGZvciBOVjEyISBXZSBzaG91bGQgbWFrZSB0aGlzIG5pY2VyLi4uICovCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpCisJCXBpeC0+c2l6ZWltYWdlICs9IChwaXgtPmJ5dGVzcGVybGluZSAqIHBpeC0+aGVpZ2h0KSAvIDI7CisKKwlyZXR1cm4gYnBsIC0gbWluX2JwbDsKK30KKworc3RhdGljIHZvaWQgaXNzX3ZpZGVvX3BpeF90b19tYnVzKGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwKKwkJCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1idXMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwltZW1zZXQobWJ1cywgMCwgc2l6ZW9mKCptYnVzKSk7CisJbWJ1cy0+d2lkdGggPSBwaXgtPndpZHRoOworCW1idXMtPmhlaWdodCA9IHBpeC0+aGVpZ2h0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0cyk7ICsraSkgeworCQlpZiAoZm9ybWF0c1tpXS5waXhlbGZvcm1hdCA9PSBwaXgtPnBpeGVsZm9ybWF0KQorCQkJYnJlYWs7CisJfQorCisJaWYgKFdBUk5fT04oaSA9PSBBUlJBWV9TSVpFKGZvcm1hdHMpKSkKKwkJcmV0dXJuOworCisJbWJ1cy0+Y29kZSA9IGZvcm1hdHNbaV0uY29kZTsKKwltYnVzLT5jb2xvcnNwYWNlID0gcGl4LT5jb2xvcnNwYWNlOworCW1idXMtPmZpZWxkID0gcGl4LT5maWVsZDsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqCitpc3NfdmlkZW9fcmVtb3RlX3N1YmRldihzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbywgdTMyICpwYWQpCit7CisJc3RydWN0IG1lZGlhX3BhZCAqcmVtb3RlOworCisJcmVtb3RlID0gbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQoJnZpZGVvLT5wYWQpOworCisJaWYgKHJlbW90ZSA9PSBOVUxMIHx8CisJICAgIG1lZGlhX2VudGl0eV90eXBlKHJlbW90ZS0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocGFkKQorCQkqcGFkID0gcmVtb3RlLT5pbmRleDsKKworCXJldHVybiBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYocmVtb3RlLT5lbnRpdHkpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBJU1MgdmlkZW8gaW5zdGFuY2UgYXQgdGhlIGZhciBlbmQgb2YgdGhlIHBpcGVsaW5lLiAqLworc3RhdGljIHN0cnVjdCBpc3NfdmlkZW8gKgoraXNzX3ZpZGVvX2Zhcl9lbmQoc3RydWN0IGlzc192aWRlbyAqdmlkZW8pCit7CisJc3RydWN0IG1lZGlhX2VudGl0eV9ncmFwaCBncmFwaDsKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHkgPSAmdmlkZW8tPnZpZGVvLmVudGl0eTsKKwlzdHJ1Y3QgbWVkaWFfZGV2aWNlICptZGV2ID0gZW50aXR5LT5wYXJlbnQ7CisJc3RydWN0IGlzc192aWRlbyAqZmFyX2VuZCA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZtZGV2LT5ncmFwaF9tdXRleCk7CisJbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfc3RhcnQoJmdyYXBoLCBlbnRpdHkpOworCisJd2hpbGUgKChlbnRpdHkgPSBtZWRpYV9lbnRpdHlfZ3JhcGhfd2Fsa19uZXh0KCZncmFwaCkpKSB7CisJCWlmIChlbnRpdHkgPT0gJnZpZGVvLT52aWRlby5lbnRpdHkpCisJCQljb250aW51ZTsKKworCQlpZiAobWVkaWFfZW50aXR5X3R5cGUoZW50aXR5KSAhPSBNRURJQV9FTlRfVF9ERVZOT0RFKQorCQkJY29udGludWU7CisKKwkJZmFyX2VuZCA9IHRvX2lzc192aWRlbyhtZWRpYV9lbnRpdHlfdG9fdmlkZW9fZGV2aWNlKGVudGl0eSkpOworCQlpZiAoZmFyX2VuZC0+dHlwZSAhPSB2aWRlby0+dHlwZSkKKwkJCWJyZWFrOworCisJCWZhcl9lbmQgPSBOVUxMOworCX0KKworCW11dGV4X3VubG9jaygmbWRldi0+Z3JhcGhfbXV0ZXgpOworCXJldHVybiBmYXJfZW5kOworfQorCitzdGF0aWMgaW50CitfX2lzc192aWRlb19nZXRfZm9ybWF0KHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvLAorCQkgICAgICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0KQoreworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgZm10OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OworCXUzMiBwYWQ7CisJaW50IHJldDsKKworCXN1YmRldiA9IGlzc192aWRlb19yZW1vdGVfc3ViZGV2KHZpZGVvLCAmcGFkKTsKKwlpZiAoc3ViZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKwlmbXQucGFkID0gcGFkOworCWZtdC53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7CisKKwltdXRleF9sb2NrKCZ2aWRlby0+bXV0ZXgpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCBwYWQsIGdldF9mbXQsIE5VTEwsICZmbXQpOworCW11dGV4X3VubG9jaygmdmlkZW8tPm11dGV4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqZm9ybWF0ID0gZm10LmZvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX2NoZWNrX2Zvcm1hdChzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbywgc3RydWN0IGlzc192aWRlb19maCAqdmZoKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4Zm10OworCWludCByZXQ7CisKKwlyZXQgPSBfX2lzc192aWRlb19nZXRfZm9ybWF0KHZpZGVvLCAmZm9ybWF0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBpeGZtdC5ieXRlc3BlcmxpbmUgPSAwOworCXJldCA9IGlzc192aWRlb19tYnVzX3RvX3BpeCh2aWRlbywgJmZvcm1hdCwgJnBpeGZtdCk7CisKKwlpZiAodmZoLT5mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCAhPSBwaXhmbXQucGl4ZWxmb3JtYXQgfHwKKwkgICAgdmZoLT5mb3JtYXQuZm10LnBpeC5oZWlnaHQgIT0gcGl4Zm10LmhlaWdodCB8fAorCSAgICB2ZmgtPmZvcm1hdC5mbXQucGl4LndpZHRoICE9IHBpeGZtdC53aWR0aCB8fAorCSAgICB2ZmgtPmZvcm1hdC5mbXQucGl4LmJ5dGVzcGVybGluZSAhPSBwaXhmbXQuYnl0ZXNwZXJsaW5lIHx8CisJICAgIHZmaC0+Zm9ybWF0LmZtdC5waXguc2l6ZWltYWdlICE9IHBpeGZtdC5zaXplaW1hZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFZpZGVvIHF1ZXVlIG9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGlzc192aWRlb19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJCQkgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCQkJIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKKwkJCQkgdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZmaC0+dmlkZW87CisKKwkvKiBSZXZpc2l0IG11bHRpLXBsYW5hciBzdXBwb3J0IGZvciBOVjEyICovCisJKm51bV9wbGFuZXMgPSAxOworCisJc2l6ZXNbMF0gPSB2ZmgtPmZvcm1hdC5mbXQucGl4LnNpemVpbWFnZTsKKwlpZiAoc2l6ZXNbMF0gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhbGxvY19jdHhzWzBdID0gdmlkZW8tPmFsbG9jX2N0eDsKKworCSpjb3VudCA9IG1pbigqY291bnQsIHZpZGVvLT5jYXB0dXJlX21lbSAvIFBBR0VfQUxJR04oc2l6ZXNbMF0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpc3NfdmlkZW9fYnVmX2NsZWFudXAoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBpc3NfYnVmZmVyICpidWZmZXIgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBpc3NfYnVmZmVyLCB2Yik7CisKKwlpZiAoYnVmZmVyLT5pc3NfYWRkcikKKwkJYnVmZmVyLT5pc3NfYWRkciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaXNzX3ZpZGVvX2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBpc3NfYnVmZmVyICpidWZmZXIgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBpc3NfYnVmZmVyLCB2Yik7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2ZmgtPnZpZGVvOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZmaC0+Zm9ybWF0LmZtdC5waXguc2l6ZWltYWdlOworCWRtYV9hZGRyX3QgYWRkcjsKKworCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBzaXplKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwkvKiBSZWZ1c2UgdG8gcHJlcGFyZSB0aGUgYnVmZmVyIGlzIHRoZSB2aWRlbyBub2RlIGhhcyByZWdpc3RlcmVkIGFuCisJICogZXJyb3IuIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgbG9jayBoZXJlIGFzIHRoZSBvcGVyYXRpb24gaXMKKwkgKiBpbmhlcmVudGx5IHJhY3kuIFRoZSBhdXRob3JpdGF0aXZlIGNoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZQorCSAqIHF1ZXVlIGhhbmRsZXIsIHdoaWNoIGNhbid0IHJldHVybiBhbiBlcnJvciwgdGhpcyBjaGVjayBpcyBqdXN0IGEgYmVzdAorCSAqIGVmZm9ydCB0byBub3RpZnkgdXNlcnNwYWNlIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorCSAqLworCWlmICh1bmxpa2VseSh2aWRlby0+ZXJyb3IpKQorCQlyZXR1cm4gLUVJTzsKKworCWFkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CisJaWYgKCFJU19BTElHTkVEKGFkZHIsIDMyKSkgeworCQlkZXZfZGJnKHZpZGVvLT5pc3MtPmRldiwKKwkJCSJCdWZmZXIgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gMzIgYnl0ZXMgYm91bmRhcnkuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCBzaXplKTsKKwlidWZmZXItPmlzc19hZGRyID0gYWRkcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNzX3ZpZGVvX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZmaC0+dmlkZW87CisJc3RydWN0IGlzc19idWZmZXIgKmJ1ZmZlciA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGlzc19idWZmZXIsIHZiKTsKKwlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlID0gdG9faXNzX3BpcGVsaW5lKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgZW1wdHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnFsb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkodmlkZW8tPmVycm9yKSkgeworCQl2YjJfYnVmZmVyX2RvbmUodmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWVtcHR5ID0gbGlzdF9lbXB0eSgmdmlkZW8tPmRtYXF1ZXVlKTsKKwlsaXN0X2FkZF90YWlsKCZidWZmZXItPmxpc3QsICZ2aWRlby0+ZG1hcXVldWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnFsb2NrLCBmbGFncyk7CisKKwlpZiAoZW1wdHkpIHsKKwkJZW51bSBpc3NfcGlwZWxpbmVfc3RhdGUgc3RhdGU7CisJCXVuc2lnbmVkIGludCBzdGFydDsKKworCQlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJc3RhdGUgPSBJU1NfUElQRUxJTkVfUVVFVUVfT1VUUFVUOworCQllbHNlCisJCQlzdGF0ZSA9IElTU19QSVBFTElORV9RVUVVRV9JTlBVVDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGlwZS0+bG9jaywgZmxhZ3MpOworCQlwaXBlLT5zdGF0ZSB8PSBzdGF0ZTsKKwkJdmlkZW8tPm9wcy0+cXVldWUodmlkZW8sIGJ1ZmZlcik7CisJCXZpZGVvLT5kbWFxdWV1ZV9mbGFncyB8PSBJU1NfVklERU9fRE1BUVVFVUVfUVVFVUVEOworCisJCXN0YXJ0ID0gaXNzX3BpcGVsaW5lX3JlYWR5KHBpcGUpOworCQlpZiAoc3RhcnQpCisJCQlwaXBlLT5zdGF0ZSB8PSBJU1NfUElQRUxJTkVfU1RSRUFNOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaXBlLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHN0YXJ0KQorCQkJb21hcDRpc3NfcGlwZWxpbmVfc2V0X3N0cmVhbShwaXBlLAorCQkJCQkJSVNTX1BJUEVMSU5FX1NUUkVBTV9TSU5HTEVTSE9UKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmIyX29wcyBpc3NfdmlkZW9fdmIyb3BzID0geworCS5xdWV1ZV9zZXR1cAk9IGlzc192aWRlb19xdWV1ZV9zZXR1cCwKKwkuYnVmX3ByZXBhcmUJPSBpc3NfdmlkZW9fYnVmX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZQk9IGlzc192aWRlb19idWZfcXVldWUsCisJLmJ1Zl9jbGVhbnVwCT0gaXNzX3ZpZGVvX2J1Zl9jbGVhbnVwLAorfTsKKworLyoKKyAqIG9tYXA0aXNzX3ZpZGVvX2J1ZmZlcl9uZXh0IC0gQ29tcGxldGUgdGhlIGN1cnJlbnQgYnVmZmVyIGFuZCByZXR1cm4gdGhlIG5leHQKKyAqIEB2aWRlbzogSVNTIHZpZGVvIG9iamVjdAorICoKKyAqIFJlbW92ZSB0aGUgY3VycmVudCB2aWRlbyBidWZmZXIgZnJvbSB0aGUgRE1BIHF1ZXVlIGFuZCBmaWxsIGl0cyB0aW1lc3RhbXAsCisgKiBmaWVsZCBjb3VudCBhbmQgc3RhdGUgZmllbGRzIGJlZm9yZSB3YWtpbmcgdXAgaXRzIGNvbXBsZXRpb24gaGFuZGxlci4KKyAqCisgKiBGb3IgY2FwdHVyZSB2aWRlbyBub2RlcywgdGhlIGJ1ZmZlciBzdGF0ZSBpcyBzZXQgdG8gVkIyX0JVRl9TVEFURV9ET05FIGlmIG5vCisgKiBlcnJvciBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBwaXBlbGluZSwgb3IgdG8gVkIyX0JVRl9TVEFURV9FUlJPUiBvdGhlcndpc2UuCisgKgorICogVGhlIERNQSBxdWV1ZSBpcyBleHBlY3RlZCB0byBjb250YWluIGF0IGxlYXN0IG9uZSBidWZmZXIuCisgKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV4dCBidWZmZXIgaW4gdGhlIERNQSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMKKyAqIGVtcHR5LgorICovCitzdHJ1Y3QgaXNzX2J1ZmZlciAqb21hcDRpc3NfdmlkZW9fYnVmZmVyX25leHQoc3RydWN0IGlzc192aWRlbyAqdmlkZW8pCit7CisJc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSA9IHRvX2lzc19waXBlbGluZSgmdmlkZW8tPnZpZGVvLmVudGl0eSk7CisJZW51bSBpc3NfcGlwZWxpbmVfc3RhdGUgc3RhdGU7CisJc3RydWN0IGlzc19idWZmZXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwlpZiAoV0FSTl9PTihsaXN0X2VtcHR5KCZ2aWRlby0+ZG1hcXVldWUpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmdmlkZW8tPmRtYXF1ZXVlLCBzdHJ1Y3QgaXNzX2J1ZmZlciwKKwkJCSAgICAgICBsaXN0KTsKKwlsaXN0X2RlbCgmYnVmLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKworCWt0aW1lX2dldF90cygmdHMpOworCWJ1Zi0+dmIudjRsMl9idWYudGltZXN0YW1wLnR2X3NlYyA9IHRzLnR2X3NlYzsKKwlidWYtPnZiLnY0bDJfYnVmLnRpbWVzdGFtcC50dl91c2VjID0gdHMudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CisKKwkvKiBEbyBmcmFtZSBudW1iZXIgcHJvcGFnYXRpb24gb25seSBpZiB0aGlzIGlzIHRoZSBvdXRwdXQgdmlkZW8gbm9kZS4KKwkgKiBGcmFtZSBudW1iZXIgZWl0aGVyIGNvbWVzIGZyb20gdGhlIENTSSByZWNlaXZlcnMgb3IgaXQgZ2V0cworCSAqIGluY3JlbWVudGVkIGhlcmUgaWYgSDNBIGlzIG5vdCBhY3RpdmUuCisJICogTm90ZTogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBmaW5pc2gKKwkgKiBmaXJzdCwgc28gdGhlIGlucHV0IG51bWJlciBtaWdodCBsYWcgYmVoaW5kIGJ5IDEgaW4gc29tZSBjYXNlcy4KKwkgKi8KKwlpZiAodmlkZW8gPT0gcGlwZS0+b3V0cHV0ICYmICFwaXBlLT5kb19wcm9wYWdhdGlvbikKKwkJYnVmLT52Yi52NGwyX2J1Zi5zZXF1ZW5jZSA9CisJCQlhdG9taWNfaW5jX3JldHVybigmcGlwZS0+ZnJhbWVfbnVtYmVyKTsKKwllbHNlCisJCWJ1Zi0+dmIudjRsMl9idWYuc2VxdWVuY2UgPSBhdG9taWNfcmVhZCgmcGlwZS0+ZnJhbWVfbnVtYmVyKTsKKworCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgcGlwZS0+ZXJyb3IgPworCQkJVkIyX0JVRl9TVEFURV9FUlJPUiA6IFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJcGlwZS0+ZXJyb3IgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmdmlkZW8tPmRtYXF1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwkJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXN0YXRlID0gSVNTX1BJUEVMSU5FX1FVRVVFX09VVFBVVAorCQkJICAgICAgfCBJU1NfUElQRUxJTkVfU1RSRUFNOworCQllbHNlCisJCQlzdGF0ZSA9IElTU19QSVBFTElORV9RVUVVRV9JTlBVVAorCQkJICAgICAgfCBJU1NfUElQRUxJTkVfU1RSRUFNOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaXBlLT5sb2NrLCBmbGFncyk7CisJCXBpcGUtPnN0YXRlICY9IH5zdGF0ZTsKKwkJaWYgKHZpZGVvLT5waXBlLnN0cmVhbV9zdGF0ZSA9PSBJU1NfUElQRUxJTkVfU1RSRUFNX0NPTlRJTlVPVVMpCisJCQl2aWRlby0+ZG1hcXVldWVfZmxhZ3MgfD0gSVNTX1ZJREVPX0RNQVFVRVVFX1VOREVSUlVOOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaXBlLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYgcGlwZS0+aW5wdXQgIT0gTlVMTCkgeworCQlzcGluX2xvY2soJnBpcGUtPmxvY2spOworCQlwaXBlLT5zdGF0ZSAmPSB+SVNTX1BJUEVMSU5FX1NUUkVBTTsKKwkJc3Bpbl91bmxvY2soJnBpcGUtPmxvY2spOworCX0KKworCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnZpZGVvLT5kbWFxdWV1ZSwgc3RydWN0IGlzc19idWZmZXIsCisJCQkgICAgICAgbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnFsb2NrLCBmbGFncyk7CisJYnVmLT52Yi5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfQUNUSVZFOworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBvbWFwNGlzc192aWRlb19jYW5jZWxfc3RyZWFtIC0gQ2FuY2VsIHN0cmVhbSBvbiBhIHZpZGVvIG5vZGUKKyAqIEB2aWRlbzogSVNTIHZpZGVvIG9iamVjdAorICoKKyAqIENhbmNlbGxpbmcgYSBzdHJlYW0gbWFyayBhbGwgYnVmZmVycyBvbiB0aGUgdmlkZW8gbm9kZSBhcyBlcnJvbmVvdXMgYW5kIG1ha2VzCisgKiBzdXJlIG5vIG5ldyBidWZmZXIgY2FuIGJlIHF1ZXVlZC4KKyAqLwordm9pZCBvbWFwNGlzc192aWRlb19jYW5jZWxfc3RyZWFtKHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnFsb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnZpZGVvLT5kbWFxdWV1ZSkpIHsKKwkJc3RydWN0IGlzc19idWZmZXIgKmJ1ZjsKKworCQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hcXVldWUsIHN0cnVjdCBpc3NfYnVmZmVyLAorCQkJCSAgICAgICBsaXN0KTsKKwkJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJfQorCisJdmlkZW8tPmVycm9yID0gdHJ1ZTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5xbG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBpb2N0bHMKKyAqLworCitzdGF0aWMgaW50Citpc3NfdmlkZW9fcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJc3RybGNweShjYXAtPmRyaXZlciwgSVNTX1ZJREVPX0RSSVZFUl9OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgdmlkZW8tPnZpZGVvLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKwlzdHJsY3B5KGNhcC0+YnVzX2luZm8sICJtZWRpYSIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisKKwlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQljYXAtPmRldmljZV9jYXBzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwllbHNlCisJCWNhcC0+ZGV2aWNlX2NhcHMgPSBWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX0RFVklDRV9DQVBTIHwgVjRMMl9DQVBfU1RSRUFNSU5HCisJCQkgIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fZW51bV9mb3JtYXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSBmLT5pbmRleDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKGYtPnR5cGUgIT0gdmlkZW8tPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gX19pc3NfdmlkZW9fZ2V0X2Zvcm1hdCh2aWRlbywgJmZvcm1hdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgKytpKSB7CisJCWNvbnN0IHN0cnVjdCBpc3NfZm9ybWF0X2luZm8gKmluZm8gPSAmZm9ybWF0c1tpXTsKKworCQlpZiAoZm9ybWF0LmNvZGUgIT0gaW5mby0+Y29kZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbmRleCA9PSAwKSB7CisJCQlmLT5waXhlbGZvcm1hdCA9IGluZm8tPnBpeGVsZm9ybWF0OworCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgaW5mby0+ZGVzY3JpcHRpb24sCisJCQkJc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWluZGV4LS07CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19nZXRfZm9ybWF0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmb3JtYXQpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZoKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlpZiAoZm9ybWF0LT50eXBlICE9IHZpZGVvLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnZpZGVvLT5tdXRleCk7CisJKmZvcm1hdCA9IHZmaC0+Zm9ybWF0OworCW11dGV4X3VubG9jaygmdmlkZW8tPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fc2V0X2Zvcm1hdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm9ybWF0KQoreworCXN0cnVjdCBpc3NfdmlkZW9fZmggKnZmaCA9IHRvX2lzc192aWRlb19maChmaCk7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm10OworCisJaWYgKGZvcm1hdC0+dHlwZSAhPSB2aWRlby0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ2aWRlby0+bXV0ZXgpOworCisJLyogRmlsbCB0aGUgYnl0ZXNwZXJsaW5lIGFuZCBzaXplaW1hZ2UgZmllbGRzIGJ5IGNvbnZlcnRpbmcgdG8gbWVkaWEgYnVzCisJICogZm9ybWF0IGFuZCBiYWNrIHRvIHBpeGVsIGZvcm1hdC4KKwkgKi8KKwlpc3NfdmlkZW9fcGl4X3RvX21idXMoJmZvcm1hdC0+Zm10LnBpeCwgJmZtdCk7CisJaXNzX3ZpZGVvX21idXNfdG9fcGl4KHZpZGVvLCAmZm10LCAmZm9ybWF0LT5mbXQucGl4KTsKKworCXZmaC0+Zm9ybWF0ID0gKmZvcm1hdDsKKworCW11dGV4X3VubG9jaygmdmlkZW8tPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX3RyeV9mb3JtYXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCBmbXQ7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXY7CisJdTMyIHBhZDsKKwlpbnQgcmV0OworCisJaWYgKGZvcm1hdC0+dHlwZSAhPSB2aWRlby0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdWJkZXYgPSBpc3NfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywgJnBhZCk7CisJaWYgKHN1YmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlzc192aWRlb19waXhfdG9fbWJ1cygmZm9ybWF0LT5mbXQucGl4LCAmZm10LmZvcm1hdCk7CisKKwlmbXQucGFkID0gcGFkOworCWZtdC53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHBhZCwgZ2V0X2ZtdCwgTlVMTCwgJmZtdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlzc192aWRlb19tYnVzX3RvX3BpeCh2aWRlbywgJmZtdC5mb3JtYXQsICZmb3JtYXQtPmZtdC5waXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXApCit7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OworCWludCByZXQ7CisKKwlzdWJkZXYgPSBpc3NfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywgTlVMTCk7CisJaWYgKHN1YmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnZpZGVvLT5tdXRleCk7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBjcm9wY2FwLCBjcm9wY2FwKTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0ID09IC1FTk9JT0NUTENNRCA/IC1FTk9UVFkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19nZXRfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgZm9ybWF0OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OworCXUzMiBwYWQ7CisJaW50IHJldDsKKworCXN1YmRldiA9IGlzc192aWRlb19yZW1vdGVfc3ViZGV2KHZpZGVvLCAmcGFkKTsKKwlpZiAoc3ViZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVHJ5IHRoZSBnZXQgY3JvcCBvcGVyYXRpb24gZmlyc3QgYW5kIGZhbGxiYWNrIHRvIGdldCBmb3JtYXQgaWYgbm90CisJICogaW1wbGVtZW50ZWQuCisJICovCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBnX2Nyb3AsIGNyb3ApOworCWlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQlyZXR1cm4gcmV0OworCisJZm9ybWF0LnBhZCA9IHBhZDsKKwlmb3JtYXQud2hpY2ggPSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCBwYWQsIGdldF9mbXQsIE5VTEwsICZmb3JtYXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0ID09IC1FTk9JT0NUTENNRCA/IC1FTk9UVFkgOiByZXQ7CisKKwljcm9wLT5jLmxlZnQgPSAwOworCWNyb3AtPmMudG9wID0gMDsKKwljcm9wLT5jLndpZHRoID0gZm9ybWF0LmZvcm1hdC53aWR0aDsKKwljcm9wLT5jLmhlaWdodCA9IGZvcm1hdC5mb3JtYXQuaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19zZXRfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGlzc192aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OworCWludCByZXQ7CisKKwlzdWJkZXYgPSBpc3NfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywgTlVMTCk7CisJaWYgKHN1YmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnZpZGVvLT5tdXRleCk7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBzX2Nyb3AsIGNyb3ApOworCW11dGV4X3VubG9jaygmdmlkZW8tPm11dGV4KTsKKworCXJldHVybiByZXQgPT0gLUVOT0lPQ1RMQ01EID8gLUVOT1RUWSA6IHJldDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX2dldF9wYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZoKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlpZiAodmlkZW8tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgfHwKKwkgICAgdmlkZW8tPnR5cGUgIT0gYS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoYSwgMCwgc2l6ZW9mKCphKSk7CisJYS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCWEtPnBhcm0ub3V0cHV0LmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJYS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lID0gdmZoLT50aW1lcGVyZnJhbWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX3NldF9wYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZoKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlpZiAodmlkZW8tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgfHwKKwkgICAgdmlkZW8tPnR5cGUgIT0gYS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID09IDApCisJCWEtPnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IDE7CisKKwl2ZmgtPnRpbWVwZXJmcmFtZSA9IGEtPnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYikKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB0b19pc3NfdmlkZW9fZmgoZmgpOworCisJcmV0dXJuIHZiMl9yZXFidWZzKCZ2ZmgtPnF1ZXVlLCByYik7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB0b19pc3NfdmlkZW9fZmgoZmgpOworCisJcmV0dXJuIHZiMl9xdWVyeWJ1ZigmdmZoLT5xdWV1ZSwgYik7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCBpc3NfdmlkZW9fZmggKnZmaCA9IHRvX2lzc192aWRlb19maChmaCk7CisKKwlyZXR1cm4gdmIyX3FidWYoJnZmaC0+cXVldWUsIGIpOworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZoKTsKKworCXJldHVybiB2YjJfZHFidWYoJnZmaC0+cXVldWUsIGIsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworLyoKKyAqIFN0cmVhbSBtYW5hZ2VtZW50CisgKgorICogRXZlcnkgSVNTIHBpcGVsaW5lIGhhcyBhIHNpbmdsZSBpbnB1dCBhbmQgYSBzaW5nbGUgb3V0cHV0LiBUaGUgaW5wdXQgY2FuIGJlCisgKiBlaXRoZXIgYSBzZW5zb3Igb3IgYSB2aWRlbyBub2RlLiBUaGUgb3V0cHV0IGlzIGFsd2F5cyBhIHZpZGVvIG5vZGUuCisgKgorICogQXMgZXZlcnkgcGlwZWxpbmUgaGFzIGFuIG91dHB1dCB2aWRlbyBub2RlLCB0aGUgSVNTIHZpZGVvIG9iamVjdHMgYXQgdGhlCisgKiBwaXBlbGluZSBvdXRwdXQgc3RvcmVzIHRoZSBwaXBlbGluZSBzdGF0ZS4gSXQgdHJhY2tzIHRoZSBzdHJlYW1pbmcgc3RhdGUgb2YKKyAqIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQsIGFzIHdlbGwgYXMgdGhlIGF2YWlsYWJpbGl0eSBvZiBidWZmZXJzLgorICoKKyAqIEluIHNlbnNvci10by1tZW1vcnkgbW9kZSwgZnJhbWVzIGFyZSBhbHdheXMgYXZhaWxhYmxlIGF0IHRoZSBwaXBlbGluZSBpbnB1dC4KKyAqIFN0YXJ0aW5nIHRoZSBzZW5zb3IgdXN1YWxseSByZXF1aXJlcyBJMkMgdHJhbnNmZXJzIGFuZCBtdXN0IGJlIGRvbmUgaW4KKyAqIGludGVycnVwdGlibGUgY29udGV4dC4gVGhlIHBpcGVsaW5lIGlzIHN0YXJ0ZWQgYW5kIHN0b3BwZWQgc3luY2hyb25vdXNseQorICogdG8gdGhlIHN0cmVhbSBvbi9vZmYgY29tbWFuZHMuIEFsbCBtb2R1bGVzIGluIHRoZSBwaXBlbGluZSB3aWxsIGdldCB0aGVpcgorICogc3ViZGV2IHNldCBzdHJlYW0gaGFuZGxlciBjYWxsZWQuIFRoZSBtb2R1bGUgYXQgdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUgbXVzdAorICogZGVsYXkgc3RhcnRpbmcgdGhlIGhhcmR3YXJlIHVudGlsIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSBhdCBpdHMgb3V0cHV0LgorICoKKyAqIEluIG1lbW9yeS10by1tZW1vcnkgbW9kZSwgc3RhcnRpbmcvc3RvcHBpbmcgdGhlIHN0cmVhbSByZXF1aXJlcworICogc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQuIElTUyBtb2R1bGVzIGNhbid0IGJlIHN0b3BwZWQKKyAqIGluIHRoZSBtaWRkbGUgb2YgYSBmcmFtZSwgYW5kIGF0IGxlYXN0IHNvbWUgb2YgdGhlIG1vZHVsZXMgc2VlbSB0byBiZWNvbWUKKyAqIGJ1c3kgYXMgc29vbiBhcyB0aGV5J3JlIHN0YXJ0ZWQsIGV2ZW4gaWYgdGhleSBkb24ndCByZWNlaXZlIGEgZnJhbWUgc3RhcnQKKyAqIGV2ZW50LiBGb3IgdGhhdCByZWFzb24gZnJhbWVzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIHNpbmdsZS1zaG90IG1vZGUuIFRoZQorICogZHJpdmVyIG5lZWRzIHRvIHdhaXQgdW50aWwgYSBmcmFtZSBpcyBjb21wbGV0ZWx5IHByb2Nlc3NlZCBhbmQgd3JpdHRlbiB0bworICogbWVtb3J5IGJlZm9yZSByZXN0YXJ0aW5nIHRoZSBwaXBlbGluZSBmb3IgdGhlIG5leHQgZnJhbWUuIFBpcGVsaW5lZAorICogcHJvY2Vzc2luZyBtaWdodCBiZSBwb3NzaWJsZSBidXQgcmVxdWlyZXMgbW9yZSB0ZXN0aW5nLgorICoKKyAqIFN0cmVhbSBzdGFydCBtdXN0IGJlIGRlbGF5ZWQgdW50aWwgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGF0IGJvdGggdGhlIGlucHV0CisgKiBhbmQgb3V0cHV0LiBUaGUgcGlwZWxpbmUgbXVzdCBiZSBzdGFydGVkIGluIHRoZSB2aWRlb2J1ZiBxdWV1ZSBjYWxsYmFjayB3aXRoCisgKiB0aGUgYnVmZmVycyBxdWV1ZSBzcGlubG9jayBoZWxkLiBUaGUgbW9kdWxlcyBzdWJkZXYgc2V0IHN0cmVhbSBvcGVyYXRpb24gbXVzdAorICogbm90IHNsZWVwLgorICovCitzdGF0aWMgaW50Citpc3NfdmlkZW9fc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB0b19pc3NfdmlkZW9fZmgoZmgpOworCXN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5X2dyYXBoIGdyYXBoOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eTsKKwllbnVtIGlzc19waXBlbGluZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgaXNzX3BpcGVsaW5lICpwaXBlOworCXN0cnVjdCBpc3NfdmlkZW8gKmZhcl9lbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKHR5cGUgIT0gdmlkZW8tPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdmlkZW8tPnN0cmVhbV9sb2NrKTsKKworCS8qIFN0YXJ0IHN0cmVhbWluZyBvbiB0aGUgcGlwZWxpbmUuIE5vIGxpbmsgdG91Y2hpbmcgYW4gZW50aXR5IGluIHRoZQorCSAqIHBpcGVsaW5lIGNhbiBiZSBhY3RpdmF0ZWQgb3IgZGVhY3RpdmF0ZWQgb25jZSBzdHJlYW1pbmcgaXMgc3RhcnRlZC4KKwkgKi8KKwlwaXBlID0gdmlkZW8tPnZpZGVvLmVudGl0eS5waXBlCisJICAgICA/IHRvX2lzc19waXBlbGluZSgmdmlkZW8tPnZpZGVvLmVudGl0eSkgOiAmdmlkZW8tPnBpcGU7CisJcGlwZS0+ZXh0ZXJuYWwgPSBOVUxMOworCXBpcGUtPmV4dGVybmFsX3JhdGUgPSAwOworCXBpcGUtPmV4dGVybmFsX2JwcCA9IDA7CisJcGlwZS0+ZW50aXRpZXMgPSAwOworCisJaWYgKHZpZGVvLT5pc3MtPnBkYXRhLT5zZXRfY29uc3RyYWludHMpCisJCXZpZGVvLT5pc3MtPnBkYXRhLT5zZXRfY29uc3RyYWludHModmlkZW8tPmlzcywgdHJ1ZSk7CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfcGlwZWxpbmVfc3RhcnQoJnZpZGVvLT52aWRlby5lbnRpdHksICZwaXBlLT5waXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfbWVkaWFfZW50aXR5X3BpcGVsaW5lX3N0YXJ0OworCisJZW50aXR5ID0gJnZpZGVvLT52aWRlby5lbnRpdHk7CisJbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfc3RhcnQoJmdyYXBoLCBlbnRpdHkpOworCXdoaWxlICgoZW50aXR5ID0gbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfbmV4dCgmZ3JhcGgpKSkKKwkJcGlwZS0+ZW50aXRpZXMgfD0gMSA8PCBlbnRpdHktPmlkOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGZvcm1hdCBtYXRjaGVzIHRoZSBvdXRwdXQgb2YKKwkgKiB0aGUgY29ubmVjdGVkIHN1YmRldi4KKwkgKi8KKwlyZXQgPSBpc3NfdmlkZW9fY2hlY2tfZm9ybWF0KHZpZGVvLCB2ZmgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pc3NfdmlkZW9fY2hlY2tfZm9ybWF0OworCisJdmlkZW8tPmJwbF9wYWRkaW5nID0gcmV0OworCXZpZGVvLT5icGxfdmFsdWUgPSB2ZmgtPmZvcm1hdC5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCS8qIEZpbmQgdGhlIElTUyB2aWRlbyBub2RlIGNvbm5lY3RlZCBhdCB0aGUgZmFyIGVuZCBvZiB0aGUgcGlwZWxpbmUgYW5kCisJICogdXBkYXRlIHRoZSBwaXBlbGluZS4KKwkgKi8KKwlmYXJfZW5kID0gaXNzX3ZpZGVvX2Zhcl9lbmQodmlkZW8pOworCisJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlzdGF0ZSA9IElTU19QSVBFTElORV9TVFJFQU1fT1VUUFVUIHwgSVNTX1BJUEVMSU5FX0lETEVfT1VUUFVUOworCQlwaXBlLT5pbnB1dCA9IGZhcl9lbmQ7CisJCXBpcGUtPm91dHB1dCA9IHZpZGVvOworCX0gZWxzZSB7CisJCWlmIChmYXJfZW5kID09IE5VTEwpIHsKKwkJCXJldCA9IC1FUElQRTsKKwkJCWdvdG8gZXJyX2lzc192aWRlb19jaGVja19mb3JtYXQ7CisJCX0KKworCQlzdGF0ZSA9IElTU19QSVBFTElORV9TVFJFQU1fSU5QVVQgfCBJU1NfUElQRUxJTkVfSURMRV9JTlBVVDsKKwkJcGlwZS0+aW5wdXQgPSB2aWRlbzsKKwkJcGlwZS0+b3V0cHV0ID0gZmFyX2VuZDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGlwZS0+bG9jaywgZmxhZ3MpOworCXBpcGUtPnN0YXRlICY9IH5JU1NfUElQRUxJTkVfU1RSRUFNOworCXBpcGUtPnN0YXRlIHw9IHN0YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKKworCS8qIFNldCB0aGUgbWF4aW11bSB0aW1lIHBlciBmcmFtZSBhcyB0aGUgdmFsdWUgcmVxdWVzdGVkIGJ5IHVzZXJzcGFjZS4KKwkgKiBUaGlzIGlzIGEgc29mdCBsaW1pdCB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGlmIHRoZSBoYXJkd2FyZSBkb2Vzbid0CisJICogc3VwcG9ydCB0aGUgcmVxdWVzdCBsaW1pdC4KKwkgKi8KKwlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCisJCXBpcGUtPm1heF90aW1lcGVyZnJhbWUgPSB2ZmgtPnRpbWVwZXJmcmFtZTsKKworCXZpZGVvLT5xdWV1ZSA9ICZ2ZmgtPnF1ZXVlOworCUlOSVRfTElTVF9IRUFEKCZ2aWRlby0+ZG1hcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZ2aWRlby0+cWxvY2spOworCXZpZGVvLT5lcnJvciA9IGZhbHNlOworCWF0b21pY19zZXQoJnBpcGUtPmZyYW1lX251bWJlciwgLTEpOworCisJcmV0ID0gdmIyX3N0cmVhbW9uKCZ2ZmgtPnF1ZXVlLCB0eXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfaXNzX3ZpZGVvX2NoZWNrX2Zvcm1hdDsKKworCS8qIEluIHNlbnNvci10by1tZW1vcnkgbW9kZSwgdGhlIHN0cmVhbSBjYW4gYmUgc3RhcnRlZCBzeW5jaHJvbm91c2x5CisJICogdG8gdGhlIHN0cmVhbSBvbiBjb21tYW5kLiBJbiBtZW1vcnktdG8tbWVtb3J5IG1vZGUsIGl0IHdpbGwgYmUKKwkgKiBzdGFydGVkIHdoZW4gYnVmZmVycyBhcmUgcXVldWVkIG9uIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQuCisJICovCisJaWYgKHBpcGUtPmlucHV0ID09IE5VTEwpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJcmV0ID0gb21hcDRpc3NfcGlwZWxpbmVfc2V0X3N0cmVhbShwaXBlLAorCQkJCQkgICAgICBJU1NfUElQRUxJTkVfU1RSRUFNX0NPTlRJTlVPVVMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX29tYXA0aXNzX3NldF9zdHJlYW07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnZpZGVvLT5kbWFxdWV1ZSkpCisJCQl2aWRlby0+ZG1hcXVldWVfZmxhZ3MgfD0gSVNTX1ZJREVPX0RNQVFVRVVFX1VOREVSUlVOOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cWxvY2ssIGZsYWdzKTsKKwl9CisKKwltdXRleF91bmxvY2soJnZpZGVvLT5zdHJlYW1fbG9jayk7CisJcmV0dXJuIDA7CisKK2Vycl9vbWFwNGlzc19zZXRfc3RyZWFtOgorCXZiMl9zdHJlYW1vZmYoJnZmaC0+cXVldWUsIHR5cGUpOworZXJyX2lzc192aWRlb19jaGVja19mb3JtYXQ6CisJbWVkaWFfZW50aXR5X3BpcGVsaW5lX3N0b3AoJnZpZGVvLT52aWRlby5lbnRpdHkpOworZXJyX21lZGlhX2VudGl0eV9waXBlbGluZV9zdGFydDoKKwlpZiAodmlkZW8tPmlzcy0+cGRhdGEtPnNldF9jb25zdHJhaW50cykKKwkJdmlkZW8tPmlzcy0+cGRhdGEtPnNldF9jb25zdHJhaW50cyh2aWRlby0+aXNzLCBmYWxzZSk7CisJdmlkZW8tPnF1ZXVlID0gTlVMTDsKKworCW11dGV4X3VubG9jaygmdmlkZW8tPnN0cmVhbV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citpc3NfdmlkZW9fc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZoKTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGlzc19waXBlbGluZSAqcGlwZSA9IHRvX2lzc19waXBlbGluZSgmdmlkZW8tPnZpZGVvLmVudGl0eSk7CisJZW51bSBpc3NfcGlwZWxpbmVfc3RhdGUgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0eXBlICE9IHZpZGVvLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnZpZGVvLT5zdHJlYW1fbG9jayk7CisKKwlpZiAoIXZiMl9pc19zdHJlYW1pbmcoJnZmaC0+cXVldWUpKQorCQlnb3RvIGRvbmU7CisKKwkvKiBVcGRhdGUgdGhlIHBpcGVsaW5lIHN0YXRlLiAqLworCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXN0YXRlID0gSVNTX1BJUEVMSU5FX1NUUkVBTV9PVVRQVVQKKwkJICAgICAgfCBJU1NfUElQRUxJTkVfUVVFVUVfT1VUUFVUOworCWVsc2UKKwkJc3RhdGUgPSBJU1NfUElQRUxJTkVfU1RSRUFNX0lOUFVUCisJCSAgICAgIHwgSVNTX1BJUEVMSU5FX1FVRVVFX0lOUFVUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKKwlwaXBlLT5zdGF0ZSAmPSB+c3RhdGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlwZS0+bG9jaywgZmxhZ3MpOworCisJLyogU3RvcCB0aGUgc3RyZWFtLiAqLworCW9tYXA0aXNzX3BpcGVsaW5lX3NldF9zdHJlYW0ocGlwZSwgSVNTX1BJUEVMSU5FX1NUUkVBTV9TVE9QUEVEKTsKKwl2YjJfc3RyZWFtb2ZmKCZ2ZmgtPnF1ZXVlLCB0eXBlKTsKKwl2aWRlby0+cXVldWUgPSBOVUxMOworCisJaWYgKHZpZGVvLT5pc3MtPnBkYXRhLT5zZXRfY29uc3RyYWludHMpCisJCXZpZGVvLT5pc3MtPnBkYXRhLT5zZXRfY29uc3RyYWludHModmlkZW8tPmlzcywgZmFsc2UpOworCW1lZGlhX2VudGl0eV9waXBlbGluZV9zdG9wKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnZpZGVvLT5zdHJlYW1fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzc192aWRlb19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQoreworCWlmIChpbnB1dC0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmxjcHkoaW5wdXQtPm5hbWUsICJjYW1lcmEiLCBzaXplb2YoaW5wdXQtPm5hbWUpKTsKKwlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgKmlucHV0KQoreworCSppbnB1dCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNzX3ZpZGVvX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaW5wdXQpCit7CisJcmV0dXJuIGlucHV0ID09IDAgPyAwIDogLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBpc3NfdmlkZW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAJCT0gaXNzX3ZpZGVvX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCAgICAgICAgPSBpc3NfdmlkZW9fZW51bV9mb3JtYXQsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwCQk9IGlzc192aWRlb19nZXRfZm9ybWF0LAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcAkJPSBpc3NfdmlkZW9fc2V0X2Zvcm1hdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAkJPSBpc3NfdmlkZW9fdHJ5X2Zvcm1hdCwKKwkudmlkaW9jX2dfZm10X3ZpZF9vdXQJCT0gaXNzX3ZpZGVvX2dldF9mb3JtYXQsCisJLnZpZGlvY19zX2ZtdF92aWRfb3V0CQk9IGlzc192aWRlb19zZXRfZm9ybWF0LAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0CQk9IGlzc192aWRlb190cnlfZm9ybWF0LAorCS52aWRpb2NfY3JvcGNhcAkJCT0gaXNzX3ZpZGVvX2Nyb3BjYXAsCisJLnZpZGlvY19nX2Nyb3AJCQk9IGlzc192aWRlb19nZXRfY3JvcCwKKwkudmlkaW9jX3NfY3JvcAkJCT0gaXNzX3ZpZGVvX3NldF9jcm9wLAorCS52aWRpb2NfZ19wYXJtCQkJPSBpc3NfdmlkZW9fZ2V0X3BhcmFtLAorCS52aWRpb2Nfc19wYXJtCQkJPSBpc3NfdmlkZW9fc2V0X3BhcmFtLAorCS52aWRpb2NfcmVxYnVmcwkJCT0gaXNzX3ZpZGVvX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZgkJPSBpc3NfdmlkZW9fcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQkJPSBpc3NfdmlkZW9fcWJ1ZiwKKwkudmlkaW9jX2RxYnVmCQkJPSBpc3NfdmlkZW9fZHFidWYsCisJLnZpZGlvY19zdHJlYW1vbgkJPSBpc3NfdmlkZW9fc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYJCT0gaXNzX3ZpZGVvX3N0cmVhbW9mZiwKKwkudmlkaW9jX2VudW1faW5wdXQJCT0gaXNzX3ZpZGVvX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0CQkJPSBpc3NfdmlkZW9fZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQJCQk9IGlzc192aWRlb19zX2lucHV0LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgZmlsZSBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCBpc3NfdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGlzc192aWRlb19maCAqaGFuZGxlOworCXN0cnVjdCB2YjJfcXVldWUgKnE7CisJaW50IHJldCA9IDA7CisKKwloYW5kbGUgPSBremFsbG9jKHNpemVvZigqaGFuZGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXY0bDJfZmhfaW5pdCgmaGFuZGxlLT52ZmgsICZ2aWRlby0+dmlkZW8pOworCXY0bDJfZmhfYWRkKCZoYW5kbGUtPnZmaCk7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2VyLCBpbml0aWFsaXNlIHRoZSBwaXBlbGluZS4gKi8KKwlpZiAob21hcDRpc3NfZ2V0KHZpZGVvLT5pc3MpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gb21hcDRpc3NfcGlwZWxpbmVfcG1fdXNlKCZ2aWRlby0+dmlkZW8uZW50aXR5LCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlvbWFwNGlzc19wdXQodmlkZW8tPmlzcyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl2aWRlby0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgodmlkZW8tPmlzcy0+ZGV2KTsKKwlpZiAoSVNfRVJSKHZpZGVvLT5hbGxvY19jdHgpKSB7CisJCXJldCA9IFBUUl9FUlIodmlkZW8tPmFsbG9jX2N0eCk7CisJCW9tYXA0aXNzX3B1dCh2aWRlby0+aXNzKTsKKwkJZ290byBkb25lOworCX0KKworCXEgPSAmaGFuZGxlLT5xdWV1ZTsKKworCXEtPnR5cGUgPSB2aWRlby0+dHlwZTsKKwlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOworCXEtPmRydl9wcml2ID0gaGFuZGxlOworCXEtPm9wcyA9ICZpc3NfdmlkZW9fdmIyb3BzOworCXEtPm1lbV9vcHMgPSAmdmIyX2RtYV9jb250aWdfbWVtb3BzOworCXEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNzX2J1ZmZlcik7CisJcS0+dGltZXN0YW1wX3R5cGUgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUM7CisKKwlyZXQgPSB2YjJfcXVldWVfaW5pdChxKTsKKwlpZiAocmV0KSB7CisJCW9tYXA0aXNzX3B1dCh2aWRlby0+aXNzKTsKKwkJZ290byBkb25lOworCX0KKworCW1lbXNldCgmaGFuZGxlLT5mb3JtYXQsIDAsIHNpemVvZihoYW5kbGUtPmZvcm1hdCkpOworCWhhbmRsZS0+Zm9ybWF0LnR5cGUgPSB2aWRlby0+dHlwZTsKKwloYW5kbGUtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IDE7CisKKwloYW5kbGUtPnZpZGVvID0gdmlkZW87CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmhhbmRsZS0+dmZoOworCitkb25lOgorCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZmhfZGVsKCZoYW5kbGUtPnZmaCk7CisJCWtmcmVlKGhhbmRsZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc3NfdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfZmggKnZmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICpoYW5kbGUgPSB0b19pc3NfdmlkZW9fZmgodmZoKTsKKworCS8qIERpc2FibGUgc3RyZWFtaW5nIGFuZCBmcmVlIHRoZSBidWZmZXJzIHF1ZXVlIHJlc291cmNlcy4gKi8KKwlpc3NfdmlkZW9fc3RyZWFtb2ZmKGZpbGUsIHZmaCwgdmlkZW8tPnR5cGUpOworCisJb21hcDRpc3NfcGlwZWxpbmVfcG1fdXNlKCZ2aWRlby0+dmlkZW8uZW50aXR5LCAwKTsKKworCS8qIFJlbGVhc2UgdGhlIHZpZGVvYnVmMiBxdWV1ZSAqLworCXZiMl9xdWV1ZV9yZWxlYXNlKCZoYW5kbGUtPnF1ZXVlKTsKKworCS8qIFJlbGVhc2UgdGhlIGZpbGUgaGFuZGxlLiAqLworCXY0bDJfZmhfZGVsKHZmaCk7CisJa2ZyZWUoaGFuZGxlKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJb21hcDRpc3NfcHV0KHZpZGVvLT5pc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXNzX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGlzc192aWRlb19maCAqdmZoID0gdG9faXNzX3ZpZGVvX2ZoKGZpbGUtPnByaXZhdGVfZGF0YSk7CisKKwlyZXR1cm4gdmIyX3BvbGwoJnZmaC0+cXVldWUsIGZpbGUsIHdhaXQpOworfQorCitzdGF0aWMgaW50IGlzc192aWRlb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaXNzX3ZpZGVvX2ZoICp2ZmggPSB0b19pc3NfdmlkZW9fZmgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKworCXJldHVybiB2YjJfbW1hcCgmdmZoLT5xdWV1ZSwgdm1hKTsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBpc3NfdmlkZW9fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCisJLm9wZW4gPSBpc3NfdmlkZW9fb3BlbiwKKwkucmVsZWFzZSA9IGlzc192aWRlb19yZWxlYXNlLAorCS5wb2xsID0gaXNzX3ZpZGVvX3BvbGwsCisJLm1tYXAgPSBpc3NfdmlkZW9fbW1hcCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1MgdmlkZW8gY29yZQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXNzX3ZpZGVvX29wZXJhdGlvbnMgaXNzX3ZpZGVvX2R1bW15X29wcyA9IHsKK307CisKK2ludCBvbWFwNGlzc192aWRlb19pbml0KHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmRpcmVjdGlvbjsKKwlpbnQgcmV0OworCisJc3dpdGNoICh2aWRlby0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlkaXJlY3Rpb24gPSAib3V0cHV0IjsKKwkJdmlkZW8tPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQlkaXJlY3Rpb24gPSAiaW5wdXQiOworCQl2aWRlby0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmdmlkZW8tPnZpZGVvLmVudGl0eSwgMSwgJnZpZGVvLT5wYWQsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfaW5pdCgmdmlkZW8tPm11dGV4KTsKKwlhdG9taWNfc2V0KCZ2aWRlby0+YWN0aXZlLCAwKTsKKworCXNwaW5fbG9ja19pbml0KCZ2aWRlby0+cGlwZS5sb2NrKTsKKwltdXRleF9pbml0KCZ2aWRlby0+c3RyZWFtX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGV2aWNlLiAqLworCWlmICh2aWRlby0+b3BzID09IE5VTEwpCisJCXZpZGVvLT5vcHMgPSAmaXNzX3ZpZGVvX2R1bW15X29wczsKKworCXZpZGVvLT52aWRlby5mb3BzID0gJmlzc192aWRlb19mb3BzOworCXNucHJpbnRmKHZpZGVvLT52aWRlby5uYW1lLCBzaXplb2YodmlkZW8tPnZpZGVvLm5hbWUpLAorCQkgIk9NQVA0IElTUyAlcyAlcyIsIG5hbWUsIGRpcmVjdGlvbik7CisJdmlkZW8tPnZpZGVvLnZmbF90eXBlID0gVkZMX1RZUEVfR1JBQkJFUjsKKwl2aWRlby0+dmlkZW8ucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5OworCXZpZGVvLT52aWRlby5pb2N0bF9vcHMgPSAmaXNzX3ZpZGVvX2lvY3RsX29wczsKKwl2aWRlby0+cGlwZS5zdHJlYW1fc3RhdGUgPSBJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQ7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmdmlkZW8tPnZpZGVvLCB2aWRlbyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbWFwNGlzc192aWRlb19jbGVhbnVwKHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvKQoreworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwltdXRleF9kZXN0cm95KCZ2aWRlby0+c3RyZWFtX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJnZpZGVvLT5tdXRleCk7Cit9CisKK2ludCBvbWFwNGlzc192aWRlb19yZWdpc3RlcihzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbywgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwl2aWRlby0+dmlkZW8udjRsMl9kZXYgPSB2ZGV2OworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ2aWRlby0+dmlkZW8sIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycih2aWRlby0+aXNzLT5kZXYsCisJCQkiJXM6IGNvdWxkIG5vdCByZWdpc3RlciB2aWRlbyBkZXZpY2UgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBvbWFwNGlzc192aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvKQoreworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZ2aWRlby0+dmlkZW8pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc192aWRlby5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc192aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGU0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBUSSBPTUFQNCBJU1MgVjRMMiBEcml2ZXIgLSBHZW5lcmljIHZpZGVvIG5vZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFNlcmdpbyBBZ3VpcnJlIDxzZXJnaW8uYS5hZ3VpcnJlQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgT01BUDRfSVNTX1ZJREVPX0gKKyNkZWZpbmUgT01BUDRfSVNTX1ZJREVPX0gKKworI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYS1lbnRpdHkuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisKKyNkZWZpbmUgSVNTX1ZJREVPX0RSSVZFUl9OQU1FCQkiaXNzdmlkZW8iCisjZGVmaW5lIElTU19WSURFT19EUklWRVJfVkVSU0lPTgkiMC4wLjIiCisKK3N0cnVjdCBpc3NfZGV2aWNlOworc3RydWN0IGlzc192aWRlbzsKK3N0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQ7CitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0OworCisvKgorICogc3RydWN0IGlzc19mb3JtYXRfaW5mbyAtIElTUyBtZWRpYSBidXMgZm9ybWF0IGluZm9ybWF0aW9uCisgKiBAY29kZTogVjRMMiBtZWRpYSBidXMgZm9ybWF0IGNvZGUKKyAqIEB0cnVuY2F0ZWQ6IFY0TDIgbWVkaWEgYnVzIGZvcm1hdCBjb2RlIGZvciB0aGUgc2FtZSBmb3JtYXQgdHJ1bmNhdGVkIHRvIDEwCisgKgliaXRzLiBJZGVudGljYWwgdG8gQGNvZGUgaWYgdGhlIGZvcm1hdCBpcyAxMCBiaXRzIHdpZGUgb3IgbGVzcy4KKyAqIEB1bmNvbXByZXNzZWQ6IFY0TDIgbWVkaWEgYnVzIGZvcm1hdCBjb2RlIGZvciB0aGUgY29ycmVzcG9uZGluZyB1bmNvbXByZXNzZWQKKyAqCWZvcm1hdC4gSWRlbnRpY2FsIHRvIEBjb2RlIGlmIHRoZSBmb3JtYXQgaXMgbm90IERQQ00gY29tcHJlc3NlZC4KKyAqIEBmbGF2b3I6IFY0TDIgbWVkaWEgYnVzIGZvcm1hdCBjb2RlIGZvciB0aGUgc2FtZSBwaXhlbCBsYXlvdXQgYnV0CisgKglzaGlmdGVkIHRvIGJlIDggYml0cyBwZXIgcGl4ZWwuID0wIGlmIGZvcm1hdCBpcyBub3Qgc2hpZnRhYmxlLgorICogQHBpeGVsZm9ybWF0OiBWNEwyIHBpeGVsIGZvcm1hdCBGQ0MgaWRlbnRpZmllcgorICogQGJwcDogQml0cyBwZXIgcGl4ZWwKKyAqIEBkZXNjcmlwdGlvbjogSHVtYW4tcmVhZGFibGUgZm9ybWF0IGRlc2NyaXB0aW9uCisgKi8KK3N0cnVjdCBpc3NfZm9ybWF0X2luZm8geworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSB0cnVuY2F0ZWQ7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIHVuY29tcHJlc3NlZDsKKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgZmxhdm9yOworCXUzMiBwaXhlbGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgYnBwOworCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOworfTsKKworZW51bSBpc3NfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHsKKwlJU1NfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQgPSAwLAorCUlTU19QSVBFTElORV9TVFJFQU1fQ09OVElOVU9VUyA9IDEsCisJSVNTX1BJUEVMSU5FX1NUUkVBTV9TSU5HTEVTSE9UID0gMiwKK307CisKK2VudW0gaXNzX3BpcGVsaW5lX3N0YXRlIHsKKwkvKiBUaGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQgb24gdGhlIGlucHV0IHZpZGVvIG5vZGUuICovCisJSVNTX1BJUEVMSU5FX1NUUkVBTV9JTlBVVCA9IDEsCisJLyogVGhlIHN0cmVhbSBoYXMgYmVlbiBzdGFydGVkIG9uIHRoZSBvdXRwdXQgdmlkZW8gbm9kZS4gKi8KKwlJU1NfUElQRUxJTkVfU1RSRUFNX09VVFBVVCA9ICgxIDw8IDEpLAorCS8qIEF0IGxlYXN0IG9uZSBidWZmZXIgaXMgcXVldWVkIG9uIHRoZSBpbnB1dCB2aWRlbyBub2RlLiAqLworCUlTU19QSVBFTElORV9RVUVVRV9JTlBVVCA9ICgxIDw8IDIpLAorCS8qIEF0IGxlYXN0IG9uZSBidWZmZXIgaXMgcXVldWVkIG9uIHRoZSBvdXRwdXQgdmlkZW8gbm9kZS4gKi8KKwlJU1NfUElQRUxJTkVfUVVFVUVfT1VUUFVUID0gKDEgPDwgMyksCisJLyogVGhlIGlucHV0IGVudGl0eSBpcyBpZGxlLCByZWFkeSB0byBiZSBzdGFydGVkLiAqLworCUlTU19QSVBFTElORV9JRExFX0lOUFVUID0gKDEgPDwgNCksCisJLyogVGhlIG91dHB1dCBlbnRpdHkgaXMgaWRsZSwgcmVhZHkgdG8gYmUgc3RhcnRlZC4gKi8KKwlJU1NfUElQRUxJTkVfSURMRV9PVVRQVVQgPSAoMSA8PCA1KSwKKwkvKiBUaGUgcGlwZWxpbmUgaXMgY3VycmVudGx5IHN0cmVhbWluZy4gKi8KKwlJU1NfUElQRUxJTkVfU1RSRUFNID0gKDEgPDwgNiksCit9OworCisvKgorICogc3RydWN0IGlzc19waXBlbGluZSAtIEFuIE9NQVA0IElTUyBoYXJkd2FyZSBwaXBlbGluZQorICogQGVudGl0aWVzOiBCaXRtYXNrIG9mIGVudGl0aWVzIGluIHRoZSBwaXBlbGluZSAoaW5kZXhlZCBieSBlbnRpdHkgSUQpCisgKiBAZXJyb3I6IEEgaGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNhcHR1cmUKKyAqLworc3RydWN0IGlzc19waXBlbGluZSB7CisJc3RydWN0IG1lZGlhX3BpcGVsaW5lIHBpcGU7CisJc3BpbmxvY2tfdCBsb2NrOwkJLyogUGlwZWxpbmUgc3RhdGUgYW5kIHF1ZXVlIGZsYWdzICovCisJdW5zaWduZWQgaW50IHN0YXRlOworCWVudW0gaXNzX3BpcGVsaW5lX3N0cmVhbV9zdGF0ZSBzdHJlYW1fc3RhdGU7CisJc3RydWN0IGlzc192aWRlbyAqaW5wdXQ7CisJc3RydWN0IGlzc192aWRlbyAqb3V0cHV0OworCXVuc2lnbmVkIGludCBlbnRpdGllczsKKwlhdG9taWNfdCBmcmFtZV9udW1iZXI7CisJYm9vbCBkb19wcm9wYWdhdGlvbjsgLyogb2YgZnJhbWUgbnVtYmVyICovCisJYm9vbCBlcnJvcjsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCBtYXhfdGltZXBlcmZyYW1lOworCXN0cnVjdCB2NGwyX3N1YmRldiAqZXh0ZXJuYWw7CisJdW5zaWduZWQgaW50IGV4dGVybmFsX3JhdGU7CisJaW50IGV4dGVybmFsX2JwcDsKK307CisKKyNkZWZpbmUgdG9faXNzX3BpcGVsaW5lKF9fZSkgXAorCWNvbnRhaW5lcl9vZigoX19lKS0+cGlwZSwgc3RydWN0IGlzc19waXBlbGluZSwgcGlwZSkKKworc3RhdGljIGlubGluZSBpbnQgaXNzX3BpcGVsaW5lX3JlYWR5KHN0cnVjdCBpc3NfcGlwZWxpbmUgKnBpcGUpCit7CisJcmV0dXJuIHBpcGUtPnN0YXRlID09IChJU1NfUElQRUxJTkVfU1RSRUFNX0lOUFVUIHwKKwkJCSAgICAgICBJU1NfUElQRUxJTkVfU1RSRUFNX09VVFBVVCB8CisJCQkgICAgICAgSVNTX1BJUEVMSU5FX1FVRVVFX0lOUFVUIHwKKwkJCSAgICAgICBJU1NfUElQRUxJTkVfUVVFVUVfT1VUUFVUIHwKKwkJCSAgICAgICBJU1NfUElQRUxJTkVfSURMRV9JTlBVVCB8CisJCQkgICAgICAgSVNTX1BJUEVMSU5FX0lETEVfT1VUUFVUKTsKK30KKworLyoKKyAqIHN0cnVjdCBpc3NfYnVmZmVyIC0gSVNTIGJ1ZmZlcgorICogQGJ1ZmZlcjogSVNTIHZpZGVvIGJ1ZmZlcgorICogQGlzc19hZGRyOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgKi8KK3N0cnVjdCBpc3NfYnVmZmVyIHsKKwkvKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHZiMl9idWZmZXIJdmI7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCWRtYV9hZGRyX3QgaXNzX2FkZHI7Cit9OworCisjZGVmaW5lIHRvX2lzc19idWZmZXIoYnVmKQljb250YWluZXJfb2YoYnVmLCBzdHJ1Y3QgaXNzX2J1ZmZlciwgYnVmZmVyKQorCitlbnVtIGlzc192aWRlb19kbWFxdWV1ZV9mbGFncyB7CisJLyogU2V0IGlmIERNQSBxdWV1ZSBiZWNvbWVzIGVtcHR5IHdoZW4gSVNTX1BJUEVMSU5FX1NUUkVBTV9DT05USU5VT1VTICovCisJSVNTX1ZJREVPX0RNQVFVRVVFX1VOREVSUlVOID0gKDEgPDwgMCksCisJLyogU2V0IHdoZW4gcXVldWluZyBidWZmZXIgdG8gYW4gZW1wdHkgRE1BIHF1ZXVlICovCisJSVNTX1ZJREVPX0RNQVFVRVVFX1FVRVVFRCA9ICgxIDw8IDEpLAorfTsKKworI2RlZmluZSBpc3NfdmlkZW9fZG1hcXVldWVfZmxhZ3NfY2xyKHZpZGVvKQlcCisJCQkoeyAodmlkZW8pLT5kbWFxdWV1ZV9mbGFncyA9IDA7IH0pCisKKy8qCisgKiBzdHJ1Y3QgaXNzX3ZpZGVvX29wZXJhdGlvbnMgLSBJU1MgdmlkZW8gb3BlcmF0aW9ucworICogQHF1ZXVlOglSZXN1bWUgc3RyZWFtaW5nIHdoZW4gYSBidWZmZXIgaXMgcXVldWVkLiBDYWxsZWQgb24gVklESU9DX1FCVUYKKyAqCQlpZiB0aGVyZSB3YXMgbm8gYnVmZmVyIHByZXZpb3VzbHkgcXVldWVkLgorICovCitzdHJ1Y3QgaXNzX3ZpZGVvX29wZXJhdGlvbnMgeworCWludCgqcXVldWUpKHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvLCBzdHJ1Y3QgaXNzX2J1ZmZlciAqYnVmZmVyKTsKK307CisKK3N0cnVjdCBpc3NfdmlkZW8geworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmlkZW87CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJc3RydWN0IG1lZGlhX3BhZCBwYWQ7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkvKiBmb3JtYXQgYW5kIGNyb3Agc2V0dGluZ3MgKi8KKwlhdG9taWNfdCBhY3RpdmU7CisKKwlzdHJ1Y3QgaXNzX2RldmljZSAqaXNzOworCisJdW5zaWduZWQgaW50IGNhcHR1cmVfbWVtOworCXVuc2lnbmVkIGludCBicGxfYWxpZ25tZW50OwkvKiBhbGlnbm1lbnQgdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQgYnBsX3plcm9fcGFkZGluZzsJLyogd2hldGhlciB0aGUgYWxpZ25tZW50IGlzIG9wdGlvbmFsICovCisJdW5zaWduZWQgaW50IGJwbF9tYXg7CQkvKiBtYXhpbXVtIGJ5dGVzIHBlciBsaW5lIHZhbHVlICovCisJdW5zaWduZWQgaW50IGJwbF92YWx1ZTsJCS8qIGJ5dGVzIHBlciBsaW5lIHZhbHVlICovCisJdW5zaWduZWQgaW50IGJwbF9wYWRkaW5nOwkvKiBwYWRkaW5nIGF0IGVuZCBvZiBsaW5lICovCisKKwkvKiBQaXBlbGluZSBzdGF0ZSAqLworCXN0cnVjdCBpc3NfcGlwZWxpbmUgcGlwZTsKKwlzdHJ1Y3QgbXV0ZXggc3RyZWFtX2xvY2s7CS8qIHBpcGVsaW5lIGFuZCBzdHJlYW0gc3RhdGVzICovCisJYm9vbCBlcnJvcjsKKworCS8qIFZpZGVvIGJ1ZmZlcnMgcXVldWUgKi8KKwlzdHJ1Y3QgdmIyX3F1ZXVlICpxdWV1ZTsKKwlzcGlubG9ja190IHFsb2NrOwkJLyogcHJvdGVjdHMgZG1hcXVldWUgYW5kIGVycm9yICovCisJc3RydWN0IGxpc3RfaGVhZCBkbWFxdWV1ZTsKKwllbnVtIGlzc192aWRlb19kbWFxdWV1ZV9mbGFncyBkbWFxdWV1ZV9mbGFnczsKKwlzdHJ1Y3QgdmIyX2FsbG9jX2N0eCAqYWxsb2NfY3R4OworCisJY29uc3Qgc3RydWN0IGlzc192aWRlb19vcGVyYXRpb25zICpvcHM7Cit9OworCisjZGVmaW5lIHRvX2lzc192aWRlbyh2ZGV2KQljb250YWluZXJfb2YodmRldiwgc3RydWN0IGlzc192aWRlbywgdmlkZW8pCisKK3N0cnVjdCBpc3NfdmlkZW9fZmggeworCXN0cnVjdCB2NGwyX2ZoIHZmaDsKKwlzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbzsKKwlzdHJ1Y3QgdmIyX3F1ZXVlIHF1ZXVlOworCXN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisJc3RydWN0IHY0bDJfZnJhY3QgdGltZXBlcmZyYW1lOworfTsKKworI2RlZmluZSB0b19pc3NfdmlkZW9fZmgoZmgpCWNvbnRhaW5lcl9vZihmaCwgc3RydWN0IGlzc192aWRlb19maCwgdmZoKQorI2RlZmluZSBpc3NfdmlkZW9fcXVldWVfdG9faXNzX3ZpZGVvX2ZoKHEpIFwKKwkJCQljb250YWluZXJfb2YocSwgc3RydWN0IGlzc192aWRlb19maCwgcXVldWUpCisKK2ludCBvbWFwNGlzc192aWRlb19pbml0KHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgb21hcDRpc3NfdmlkZW9fY2xlYW51cChzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyk7CitpbnQgb21hcDRpc3NfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGlzc192aWRlbyAqdmlkZW8sCisJCQkgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KTsKK3ZvaWQgb21hcDRpc3NfdmlkZW9fdW5yZWdpc3RlcihzdHJ1Y3QgaXNzX3ZpZGVvICp2aWRlbyk7CitzdHJ1Y3QgaXNzX2J1ZmZlciAqb21hcDRpc3NfdmlkZW9fYnVmZmVyX25leHQoc3RydWN0IGlzc192aWRlbyAqdmlkZW8pOwordm9pZCBvbWFwNGlzc192aWRlb19jYW5jZWxfc3RyZWFtKHN0cnVjdCBpc3NfdmlkZW8gKnZpZGVvKTsKK3N0cnVjdCBtZWRpYV9wYWQgKm9tYXA0aXNzX3ZpZGVvX3JlbW90ZV9wYWQoc3RydWN0IGlzc192aWRlbyAqdmlkZW8pOworCitjb25zdCBzdHJ1Y3QgaXNzX2Zvcm1hdF9pbmZvICoKK29tYXA0aXNzX3ZpZGVvX2Zvcm1hdF9pbmZvKGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKTsKKworI2VuZGlmIC8qIE9NQVA0X0lTU19WSURFT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFiYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACitjb25maWcgVVNCX1NOOUMxMDIKKwl0cmlzdGF0ZSAiVVNCIFNOOUMxeHggUEMgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCAoREVQUkVDQVRFRCkiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIE1FRElBX1VTQl9TVVBQT1JUCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCwgcGxlYXNlIHVzZSB0aGUgZ3NwY2Egc29uaXhiIGFuZAorCSAgc29uaXhqIG1vZHVsZXMgaW5zdGVhZC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIFNPTmlYIFNOOUMxMDEsCisJICBTTjlDMTAyLCBTTjlDMTAzLCBTTjlDMTA1IGFuZCBTTjlDMTIwIFBDIENhbWVyYSBDb250cm9sbGVycy4KKworCSAgU2VlIDxmaWxlOmRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDIudHh0PiBmb3IgbW9yZSBpbmZvLgorCisJICBJZiB5b3UgaGF2ZSB3ZWJjYW1zIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIGFuZCBub3QgYnkKKwkgIHRoZSBnc3BjYSBkcml2ZXIsIHRoZW4gY29udGFjdCB0aGUgbGludXgtbWVkaWEgbWFpbGluZ2xpc3QuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNuOWMxMDIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDIuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0CnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyLnR4dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb25maWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX2NvbmZpZy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2NvbmZpZy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfY29yZS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX21pMDM0My5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9taTAzNDMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX21pMDM0My5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX21pMDM0My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfbWkwMzYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX21pMDM2MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfbWkwMzYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfbWkwMzYwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9tdDl2MTExLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX210OXYxMTEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX210OXYxMTEuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9tdDl2MTExLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX292NzY2MC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX292NzY2MC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzY2MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfc2Vuc29yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX3RhczUxMTBjMWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3VzYi9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3RhczUxMTBjMWIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl90YXM1MTEwZC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3NuOWMxMDIvc245YzEwMl90YXM1MTMwZDFiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS91c2Ivc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl90YXM1MTMwZDFiLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLWVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKaW5kZXggZDU4MmM1Yi4uY2U5ZTVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDItZW5jLmMKQEAgLTk2NCw3ICs5NjQsNyBAQAogewogCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCXJldHVybiBzb2xvX3NldF92aWRlb190eXBlKHNvbG9fZW5jLT5zb2xvX2Rldiwgc3RkICYgVjRMMl9TVERfUEFMKTsKKwlyZXR1cm4gc29sb19zZXRfdmlkZW9fdHlwZShzb2xvX2VuYy0+c29sb19kZXYsIHN0ZCAmIFY0TDJfU1REXzYyNV81MCk7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXY0bDIuYwppbmRleCA3YjI2ZGUzLi40N2U3MmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc29sb19zZXRfdmlkZW9fdHlwZShzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2LCBib29sIHR5cGUpCitpbnQgc29sb19zZXRfdmlkZW9fdHlwZShzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2LCBib29sIGlzXzUwaHopCiB7CiAJaW50IGk7CiAKQEAgLTUzNyw3ICs1MzcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBzb2xvX2Rldi0+bnJfY2hhbnM7IGkrKykKIAkJaWYgKHZiMl9pc19idXN5KCZzb2xvX2Rldi0+djRsMl9lbmNbaV0tPnZpZHEpKQogCQkJcmV0dXJuIC1FQlVTWTsKLQlzb2xvX2Rldi0+dmlkZW9fdHlwZSA9IHR5cGU7CisJc29sb19kZXYtPnZpZGVvX3R5cGUgPSBpc181MGh6ID8gU09MT19WT19GTVRfVFlQRV9QQUwgOgorCQkJCQkgU09MT19WT19GTVRfVFlQRV9OVFNDOwogCS8qIFJlY29uZmlndXJlIGZvciB0aGUgbmV3IHN0YW5kYXJkICovCiAJc29sb19kaXNwX2luaXQoc29sb19kZXYpOwogCXNvbG9fZW5jX2luaXQoc29sb19kZXYpOwpAQCAtNTUxLDcgKzU1Miw3IEBACiB7CiAJc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlyZXR1cm4gc29sb19zZXRfdmlkZW9fdHlwZShzb2xvX2Rldiwgc3RkICYgVjRMMl9TVERfUEFMKTsKKwlyZXR1cm4gc29sb19zZXRfdmlkZW9fdHlwZShzb2xvX2Rldiwgc3RkICYgVjRMMl9TVERfNjI1XzUwKTsKIH0KIAogc3RhdGljIGludCBzb2xvX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAuaAppbmRleCBmMWJiYjhjLi44OTY0ZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAuaApAQCAtMzk4LDcgKzM5OCw3IEBACiAJCSAgICAgIGludCBkZXNjX2NudCk7CiAKIC8qIEdsb2JhbCBzX3N0ZCBpb2N0bCAqLwotaW50IHNvbG9fc2V0X3ZpZGVvX3R5cGUoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiwgYm9vbCB0eXBlKTsKK2ludCBzb2xvX3NldF92aWRlb190eXBlKHN0cnVjdCBzb2xvX2RldiAqc29sb19kZXYsIGJvb2wgaXNfNTBoeik7CiB2b2lkIHNvbG9fdXBkYXRlX21vZGUoc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMpOwogCiAvKiBTZXQgdGhlIHRocmVzaG9sZCBmb3IgbW90aW9uIGRldGVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTVkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL0tjb25maWcKQEAgLTAsMCArMSwxMSBAQAorY29uZmlnIFI4ODIxQUUKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4ODIxQUUgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgorCWRlcGVuZHMgb24gbQorCXNlbGVjdCBXSVJFTEVTU19FWFQKKwlzZWxlY3QgV0VYVF9QUklWCisJc2VsZWN0IEVFUFJPTV85M0NYNgorCXNlbGVjdCBDUllQVE8KKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBJZiBidWlsdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcjg4MjFhZS5rby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjNiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL01ha2VmaWxlCkBAIC0wLDAgKzEsMzUgQEAKK1BDSV9NQUlOX09CSlMJOj0gYmFzZS5vCVwKKwkJcmMubwlcCisJCWRlYnVnLm8JXAorCQlyZWdkLm8JXAorCQllZnVzZS5vCVwKKwkJY2FtLm8JXAorCQlwcy5vCVwKKwkJY29yZS5vCVwKKwkJc3RhdHMubwlcCisJCXBjaS5vCVwKKworQlRfQ09FWElTVF9PQkpTOj0JYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5vXAorCQkJYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5vXAorCQkJYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5vXAorCQkJYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5vXAorCQkJYnRjb2V4aXN0L3J0bF9idGMubwlcCisKK1BDSV84ODIxQUVfSEFMX09CSlM6PQlcCisJcnRsODgyMWFlL2h3Lm8JCVwKKwlydGw4ODIxYWUvdGFibGUubwkJXAorCXJ0bDg4MjFhZS9zdy5vCQlcCisJcnRsODgyMWFlL3RyeC5vCQlcCisJcnRsODgyMWFlL2xlZC5vCQlcCisJcnRsODgyMWFlL2Z3Lm8JCVwKKwlydGw4ODIxYWUvcGh5Lm8JCVwKKwlydGw4ODIxYWUvcmYubwkJXAorCXJ0bDg4MjFhZS9kbS5vCQlcCisJcnRsODgyMWFlL3B3cnNlcS5vCVwKKwlydGw4ODIxYWUvcHdyc2VxY21kLm8JXAorCXJ0bDg4MjFhZS9oYWxfYnRjLm8JXAorCXJ0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5vCVwKKworcnRsODgyMWFlLW9ianMgKz0gJChCVF9DT0VYSVNUX09CSlMpICQoUENJX01BSU5fT0JKUykgJChQQ0lfODgyMUFFX0hBTF9PQkpTKQorCitvYmotJChDT05GSUdfUjg4MjFBRSkgKz0gcnRsODgyMWFlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU3NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1JlYWx0ZWsgODgyMUFFIFBDSSB3aWZpIGRyaXZlciBUT0RPOgorICAtIHJlbW92ZSBidWlsdC1pbiBidGNvZXhpc3QgbW9kdWxlIHdoZW4gdGhlICJyZWFsIiBvbmUgZ2V0cyB1cHN0cmVhbQorICAtIHJlbW92ZSBidWlsdC1pbiBydGx3aWZpIGNvZGUgYnkgcG9ydGluZyBkcml2ZXIgdG8gdXNlIHRoZSAicmVhbCIgb25lCisgICAgaW4gdGhlIGRyaXZlcnMvbmV0LyBkaXJlY3RvcnkuCisgIC0gZml4IHVwIGNvZGluZyBzdHlsZSBpc3N1ZXMKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgZm9yIHRoaXMgZHJpdmVyIHRvOgorCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+CithbmQgdGhlIDxkZXZlbEBkcml2ZXJkZXYub3N1b3NsLm9yZz4gbWFpbGluZyBsaXN0LgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzkzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuYwpAQCAtMCwwICsxLDE4NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJ3aWZpLmgiCisjaW5jbHVkZSAicmMuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisjaW5jbHVkZSAiZWZ1c2UuaCIKKyNpbmNsdWRlICJjYW0uaCIKKyNpbmNsdWRlICJwcy5oIgorI2luY2x1ZGUgInJlZ2QuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworLyoKKyAqTk9USUNFISEhOiBUaGlzIGZpbGUgd2lsbCBiZSB2ZXJ5IGJpZywgd2UgaHNvdWxkCisgKmtlZXAgaXQgY2xlYXIgdW5kZXIgZm9sbHdpbmcgcm9sZXM6CisgKgorICpUaGlzIGZpbGUgaW5jbHVkZSBmb2xsd2luZyBwYXJ0LCBzbywgaWYgeW91IGFkZCBuZXcKKyAqZnVuY3Rpb25zIGludG8gdGhpcyBmaWxlLCBwbGVhc2UgY2hlY2sgd2hpY2ggcGFydCBpdAorICpzaG91bGQgaW5jbHVkZXMuIG9yIGNoZWNrIGlmIHlvdSBzaG91bGQgYWRkIG5ldyBwYXJ0CisgKmZvciB0aGlzIGZpbGU6CisgKgorICoxKSBtYWM4MDIxMSBpbml0IGZ1bmN0aW9ucworICoyKSB0eCBpbmZvcm1hdGlvbiBmdW5jdGlvbnMKKyAqMykgZnVuY3Rpb25zIGNhbGxlZCBieSBjb3JlLmMKKyAqNCkgd3EgJiB0aW1lciBjYWxsYmFjayBmdW5jdGlvbnMKKyAqNSkgZnJhbWUgcHJvY2VzcyBmdW5jdGlvbnMKKyAqNikgSU9UIGZ1bmN0aW9ucworICo3KSBzeXNmcyBmdW5jdGlvbnMKKyAqOCkgdmlmIGZ1bmN0aW9ucworICo5KSAuLi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbWFjODAyMTEgaW5pdCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydGxfY2hhbm5lbHRhYmxlXzJnW10gPSB7CisJey5jZW50ZXJfZnJlcSA9IDI0MTIsLmh3X3ZhbHVlID0gMSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDE3LC5od192YWx1ZSA9IDIsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQyMiwuaHdfdmFsdWUgPSAzLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MjcsLmh3X3ZhbHVlID0gNCx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDMyLC5od192YWx1ZSA9IDUsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQzNywuaHdfdmFsdWUgPSA2LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NDIsLmh3X3ZhbHVlID0gNyx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDQ3LC5od192YWx1ZSA9IDgsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ1MiwuaHdfdmFsdWUgPSA5LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NTcsLmh3X3ZhbHVlID0gMTAsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ2MiwuaHdfdmFsdWUgPSAxMSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDY3LC5od192YWx1ZSA9IDEyLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NzIsLmh3X3ZhbHVlID0gMTMsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ4NCwuaHdfdmFsdWUgPSAxNCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydGxfY2hhbm5lbHRhYmxlXzVnW10gPSB7CisJey5jZW50ZXJfZnJlcSA9IDUxODAsLmh3X3ZhbHVlID0gMzYsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTIwMCwuaHdfdmFsdWUgPSA0MCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjIwLC5od192YWx1ZSA9IDQ0LH0sCisJey5jZW50ZXJfZnJlcSA9IDUyNDAsLmh3X3ZhbHVlID0gNDgsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTI2MCwuaHdfdmFsdWUgPSA1Mix9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjgwLC5od192YWx1ZSA9IDU2LH0sCisJey5jZW50ZXJfZnJlcSA9IDUzMDAsLmh3X3ZhbHVlID0gNjAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTMyMCwuaHdfdmFsdWUgPSA2NCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTAwLC5od192YWx1ZSA9IDEwMCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTIwLC5od192YWx1ZSA9IDEwNCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTQwLC5od192YWx1ZSA9IDEwOCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTYwLC5od192YWx1ZSA9IDExMix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTgwLC5od192YWx1ZSA9IDExNix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjAwLC5od192YWx1ZSA9IDEyMCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjIwLC5od192YWx1ZSA9IDEyNCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjQwLC5od192YWx1ZSA9IDEyOCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjYwLC5od192YWx1ZSA9IDEzMix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjgwLC5od192YWx1ZSA9IDEzNix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzAwLC5od192YWx1ZSA9IDE0MCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzQ1LC5od192YWx1ZSA9IDE0OSx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzY1LC5od192YWx1ZSA9IDE1Myx9LAorCXsuY2VudGVyX2ZyZXEgPSA1Nzg1LC5od192YWx1ZSA9IDE1Nyx9LAorCXsuY2VudGVyX2ZyZXEgPSA1ODA1LC5od192YWx1ZSA9IDE2MSx9LAorCXsuY2VudGVyX2ZyZXEgPSA1ODI1LC5od192YWx1ZSA9IDE2NSx9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBydGxfcmF0ZXRhYmxlXzJnW10gPSB7CisJey5iaXRyYXRlID0gMTAsLmh3X3ZhbHVlID0gMHgwMCx9LAorCXsuYml0cmF0ZSA9IDIwLC5od192YWx1ZSA9IDB4MDEsfSwKKwl7LmJpdHJhdGUgPSA1NSwuaHdfdmFsdWUgPSAweDAyLH0sCisJey5iaXRyYXRlID0gMTEwLC5od192YWx1ZSA9IDB4MDMsfSwKKwl7LmJpdHJhdGUgPSA2MCwuaHdfdmFsdWUgPSAweDA0LH0sCisJey5iaXRyYXRlID0gOTAsLmh3X3ZhbHVlID0gMHgwNSx9LAorCXsuYml0cmF0ZSA9IDEyMCwuaHdfdmFsdWUgPSAweDA2LH0sCisJey5iaXRyYXRlID0gMTgwLC5od192YWx1ZSA9IDB4MDcsfSwKKwl7LmJpdHJhdGUgPSAyNDAsLmh3X3ZhbHVlID0gMHgwOCx9LAorCXsuYml0cmF0ZSA9IDM2MCwuaHdfdmFsdWUgPSAweDA5LH0sCisJey5iaXRyYXRlID0gNDgwLC5od192YWx1ZSA9IDB4MGEsfSwKKwl7LmJpdHJhdGUgPSA1NDAsLmh3X3ZhbHVlID0gMHgwYix9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBydGxfcmF0ZXRhYmxlXzVnW10gPSB7CisJey5iaXRyYXRlID0gNjAsLmh3X3ZhbHVlID0gMHgwNCx9LAorCXsuYml0cmF0ZSA9IDkwLC5od192YWx1ZSA9IDB4MDUsfSwKKwl7LmJpdHJhdGUgPSAxMjAsLmh3X3ZhbHVlID0gMHgwNix9LAorCXsuYml0cmF0ZSA9IDE4MCwuaHdfdmFsdWUgPSAweDA3LH0sCisJey5iaXRyYXRlID0gMjQwLC5od192YWx1ZSA9IDB4MDgsfSwKKwl7LmJpdHJhdGUgPSAzNjAsLmh3X3ZhbHVlID0gMHgwOSx9LAorCXsuYml0cmF0ZSA9IDQ4MCwuaHdfdmFsdWUgPSAweDBhLH0sCisJey5iaXRyYXRlID0gNTQwLC5od192YWx1ZSA9IDB4MGIsfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHJ0bF9iYW5kXzJnaHogPSB7CisJLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLAorCisJLmNoYW5uZWxzID0gcnRsX2NoYW5uZWx0YWJsZV8yZywKKwkubl9jaGFubmVscyA9IEFSUkFZX1NJWkUocnRsX2NoYW5uZWx0YWJsZV8yZyksCisKKwkuYml0cmF0ZXMgPSBydGxfcmF0ZXRhYmxlXzJnLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShydGxfcmF0ZXRhYmxlXzJnKSwKKworCS5odF9jYXAgPSB7MH0sCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBydGxfYmFuZF81Z2h6ID0geworCS5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwKKworCS5jaGFubmVscyA9IHJ0bF9jaGFubmVsdGFibGVfNWcsCisJLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHJ0bF9jaGFubmVsdGFibGVfNWcpLAorCisJLmJpdHJhdGVzID0gcnRsX3JhdGV0YWJsZV81ZywKKwkubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUocnRsX3JhdGV0YWJsZV81ZyksCisKKwkuaHRfY2FwID0gezB9LAorfTsKKworc3RhdGljIGNvbnN0IHU4IHRpZF90b19hY1tdID0geworCTIsIC8qIElFRUU4MDIxMV9BQ19CRSAqLworCTMsIC8qIElFRUU4MDIxMV9BQ19CSyAqLworCTMsIC8qIElFRUU4MDIxMV9BQ19CSyAqLworCTIsIC8qIElFRUU4MDIxMV9BQ19CRSAqLworCTEsIC8qIElFRUU4MDIxMV9BQ19WSSAqLworCTEsIC8qIElFRUU4MDIxMV9BQ19WSSAqLworCTAsIC8qIElFRUU4MDIxMV9BQ19WTyAqLworCTAsIC8qIElFRUU4MDIxMV9BQ19WTyAqLworfTsKKwordTggcnRsX3RpZF90b19hYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdGlkKQoreworCXJldHVybiB0aWRfdG9fYWNbdGlkXTsKK30KKworc3RhdGljIHZvaWQgX3J0bF9pbml0X2h3X2h0X2NhcGFiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlodF9jYXAtPmh0X3N1cHBvcnRlZCA9IHRydWU7CisJaHRfY2FwLT5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8CisJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKKwkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAorCSAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCB8IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5kaXNhYmxlX2Ftc2R1XzhrKQorCQlodF9jYXAtPmNhcCAmPSB+SUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFU7CisKKwkvKgorCSAqTWF4aW11bSBsZW5ndGggb2YgQU1QRFUgdGhhdCB0aGUgU1RBIGNhbiByZWNlaXZlLgorCSAqTGVuZ3RoID0gMiBeICgxMyArIG1heF9hbXBkdV9sZW5ndGhfZXhwKSAtIDEgKG9jdGV0cykKKwkgKi8KKwlodF9jYXAtPmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOworCisJLypNaW5pbXVtIE1QRFUgc3RhcnQgc3BhY2luZyAsICovCisJaHRfY2FwLT5hbXBkdV9kZW5zaXR5ID0gSUVFRTgwMjExX0hUX01QRFVfREVOU0lUWV8xNjsKKworCWh0X2NhcC0+bWNzLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRDsKKworCS8qCisJICpody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdCisJICpiYXNlIG9uIGFudF9udW0KKwkgKnJ4X21hc2s6IFJYIG1hc2sKKwkgKmlmIHJ4X2FudCA9MSByeF9tYXNrWzBdPTB4ZmY7PT0+TUNTMC1NQ1M3CisJICppZiByeF9hbnQgPTIgcnhfbWFza1sxXT0weGZmOz09Pk1DUzgtTUNTMTUKKwkgKmlmIHJ4X2FudCA+PTMgcnhfbWFza1syXT0weGZmOworCSAqaWYgQldfNDAgcnhfbWFza1s0XT0weDAxOworCSAqaGlnaGVzdCBzdXBwb3J0ZWQgUlggcmF0ZQorCSAqLworCWlmIChydGxwcml2LT5kbS5zdXBwX3BoeW1vZGVfc3dpdGNoKSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0VNRVJHLCAoIlN1cHBvcnQgcGh5IG1vZGUgc3dpdGNoXG4iKSk7CisKKwkJaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4RkY7CisJCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweEZGOworCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKKworCQlodF9jYXAtPm1jcy5yeF9oaWdoZXN0ID0gTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1OworCX0gZWxzZSB7CisJCWlmIChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzFUMlIgfHwKKwkJCQlnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzJUMlIpIHsKKworCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csICgiMVQyUiBvciAyVDJSXG4iKSk7CisKKwkJCWh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOworCQkJaHRfY2FwLT5tY3MucnhfbWFza1sxXSA9IDB4RkY7CisJCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKKworCQkJaHRfY2FwLT5tY3MucnhfaGlnaGVzdCA9IE1BWF9CSVRfUkFURV80ME1IWl9NQ1MxNTsKKwkJfSBlbHNlIGlmIChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzFUMVIpIHsKKworCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csICgiMVQxUlxuIikpOworCisJCQlodF9jYXAtPm1jcy5yeF9tYXNrWzBdID0gMHhGRjsKKwkJCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweDAwOworCQkJaHRfY2FwLT5tY3MucnhfbWFza1s0XSA9IDB4MDE7CisKKwkJCWh0X2NhcC0+bWNzLnJ4X2hpZ2hlc3QgPSBNQVhfQklUX1JBVEVfNDBNSFpfTUNTNzsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bF9pbml0X21hYzgwMjExKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX21hYyAqcnRsbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisKKworCWlmIChydGxoYWwtPm1hY3BoeW1vZGUgPT0gU0lOR0xFTUFDX1NJTkdMRVBIWSAmJgorCSAgICBydGxoYWwtPmJhbmRzZXQgPT0gQkFORF9PTl9CT1RIKSB7CisJCS8qIDE6IDIuNCBHIGJhbmRzICovCisJCS8qIDwxPiB1c2UgIG1hYy0+YmFuZHMgYXMgbWVtIGZvciBody0+d2lwaHktPmJhbmRzICovCisJCXNiYW5kID0gJihydGxtYWMtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdKTsKKworCQkvKiA8Mj4gc2V0IGh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0KKwkJICogdG8gZGVmYXVsdCB2YWx1ZSgxVDFSKSAqLworCQltZW1jcHkoJihydGxtYWMtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdKSwgJnJ0bF9iYW5kXzJnaHosCisJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQpKTsKKworCQkvKiA8Mz4gaW5pdCBodCBjYXAgYmFzZSBvbiBhbnRfbnVtICovCisJCV9ydGxfaW5pdF9od19odF9jYXBhYihodywgJnNiYW5kLT5odF9jYXApOworCisJCS8qIDw0PiBzZXQgbWFjLT5zYmFuZCB0byB3aXBoeS0+c2JhbmQgKi8KKwkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9IHNiYW5kOworCisJCS8qIDI6IDUgRyBiYW5kcyAqLworCQkvKiA8MT4gdXNlICBtYWMtPmJhbmRzIGFzIG1lbSBmb3IgaHctPndpcGh5LT5iYW5kcyAqLworCQlzYmFuZCA9ICYocnRsbWFjLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSk7CisKKwkJLyogPDI+IHNldCBody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdCisJCSAqIHRvIGRlZmF1bHQgdmFsdWUoMVQxUikgKi8KKwkJbWVtY3B5KCYocnRsbWFjLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSksICZydGxfYmFuZF81Z2h6LAorCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kKSk7CisKKwkJLyogPDM+IGluaXQgaHQgY2FwIGJhc2Ugb24gYW50X251bSAqLworCQlfcnRsX2luaXRfaHdfaHRfY2FwYWIoaHcsICZzYmFuZC0+aHRfY2FwKTsKKworCQkvKiA8ND4gc2V0IG1hYy0+c2JhbmQgdG8gd2lwaHktPnNiYW5kICovCisJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBzYmFuZDsKKwl9IGVsc2UgeworCQlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykgeworCQkJLyogPDE+IHVzZSAgbWFjLT5iYW5kcyBhcyBtZW0gZm9yIGh3LT53aXBoeS0+YmFuZHMgKi8KKwkJCXNiYW5kID0gJihydGxtYWMtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdKTsKKworCQkJLyogPDI+IHNldCBody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdCisJCQkgKiB0byBkZWZhdWx0IHZhbHVlKDFUMVIpICovCisJCQltZW1jcHkoJihydGxtYWMtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdKSwKKwkJCSAgICAgICAmcnRsX2JhbmRfMmdoeiwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCkpOworCisJCQkvKiA8Mz4gaW5pdCBodCBjYXAgYmFzZSBvbiBhbnRfbnVtICovCisJCQlfcnRsX2luaXRfaHdfaHRfY2FwYWIoaHcsICZzYmFuZC0+aHRfY2FwKTsKKworCQkJLyogPDQ+IHNldCBtYWMtPnNiYW5kIHRvIHdpcGh5LT5zYmFuZCAqLworCQkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9IHNiYW5kOworCQl9IGVsc2UgaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKSB7CisJCQkvKiA8MT4gdXNlICBtYWMtPmJhbmRzIGFzIG1lbSBmb3IgaHctPndpcGh5LT5iYW5kcyAqLworCQkJc2JhbmQgPSAmKHJ0bG1hYy0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0pOworCisJCQkvKiA8Mj4gc2V0IGh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0KKwkJCSAqIHRvIGRlZmF1bHQgdmFsdWUoMVQxUikgKi8KKwkJCW1lbWNweSgmKHJ0bG1hYy0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0pLAorCQkJICAgICAgICZydGxfYmFuZF81Z2h6LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kKSk7CisKKwkJCS8qIDwzPiBpbml0IGh0IGNhcCBiYXNlIG9uIGFudF9udW0gKi8KKwkJCV9ydGxfaW5pdF9od19odF9jYXBhYihodywgJnNiYW5kLT5odF9jYXApOworCisJCQkvKiA8ND4gc2V0IG1hYy0+c2JhbmQgdG8gd2lwaHktPnNiYW5kICovCisJCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gc2JhbmQ7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19FTUVSRywgKCJFcnIgQkFORCAlZFxuIiwKKwkJCQkgcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlKSk7CisJCX0KKwl9CisJLyogPDU+IHNldCBodyBjYXBzICovCisJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAorCSAgICBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw0LDApKQorCSAgICBJRUVFODAyMTFfSFdfQkVBQ09OX0ZJTFRFUiB8CisjZW5kaWYKKwkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKKwkgICAgSUVFRTgwMjExX0hXX1JFUE9SVFNfVFhfQUNLX1NUQVRVUyB8CisJICAgIElFRUU4MDIxMV9IV19DT05ORUNUSU9OX01PTklUT1IgfAorCSAgICAvKiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfQ1FNX1JTU0kgfCAqLworCSAgICBJRUVFODAyMTFfSFdfTUZQX0NBUEFCTEUgfCAwOworCisJLyogc3dscHMgb3IgaHdscHMgaGFzIGJlZW4gc2V0IGluIGRpZmYgY2hpcCBpbiBpbml0X3N3X3ZhcnMgKi8KKwlpZiAocnRscHJpdi0+cHNjLmJfc3djdHJsX2xwcykKKwkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CisJICAgIAkJSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLIHwKKwkgICAgCQkvKiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19QUyB8ICovCisJCQkwOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM3KSkKKwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9BUCkgfAorCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwKKwkgICAgQklUKE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHwKKwkgICAgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHwKKwkgICAgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTyk7CisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9BUCkgfAorCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwKKwkgICAgQklUKE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIDsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KSkKKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSUJTU19SU047CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywzLDApKQorCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7CisjZW5kaWYKKworCWh3LT53aXBoeS0+cnRzX3RocmVzaG9sZCA9IDIzNDc7CisKKwlody0+cXVldWVzID0gQUNfTUFYOworCWh3LT5leHRyYV90eF9oZWFkcm9vbSA9IFJUTF9UWF9IRUFERVJfU0laRTsKKworCS8qIFRPRE86IENvcnJlY3QgdGhpcyB2YWx1ZSBmb3Igb3VyIGh3ICovCisJLyogVE9ETzogZGVmaW5lIHRoZXNlIGhhcmQgY29kZSB2YWx1ZSAqLworCWh3LT5tYXhfbGlzdGVuX2ludGVydmFsID0gMTA7CisJaHctPm1heF9yYXRlX3RyaWVzID0gNDsKKwkvKiBody0+bWF4X3JhdGVzID0gMTsgKi8KKwlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsX3N0YV9pbmZvKTsKKyNpZmRlZiBWSUZfVE9ETworCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBydGxfdmlmX2luZm8pOworI2VuZGlmCisKKwkvKiA8Nj4gbWFjIGFkZHJlc3MgKi8KKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihydGxlZnVzZS0+ZGV2X2FkZHIpKSB7CisJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBydGxlZnVzZS0+ZGV2X2FkZHIpOworCX0gZWxzZSB7CisJCXU4IHJ0bG1hY1tdID0geyAweDAwLCAweGUwLCAweDRjLCAweDgxLCAweDkyLCAweDAwIH07CisJCWdldF9yYW5kb21fYnl0ZXMoKHJ0bG1hYyArIChFVEhfQUxFTiAtIDEpKSwgMSk7CisJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBydGxtYWMpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBfcnRsX2luaXRfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwkvKiA8MT4gdGltZXIgKi8KKwlpbml0X3RpbWVyKCZydGxwcml2LT53b3Jrcy53YXRjaGRvZ190aW1lcik7CisJc2V0dXBfdGltZXIoJnJ0bHByaXYtPndvcmtzLndhdGNoZG9nX3RpbWVyLAorCQkgICAgcnRsX3dhdGNoX2RvZ190aW1lcl9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpaHcpOworCWluaXRfdGltZXIoJnJ0bHByaXYtPndvcmtzLmR1YWxtYWNfZWFzeWNvbmN1cnJlbnRfcmV0cnl0aW1lcik7CisJc2V0dXBfdGltZXIoJnJ0bHByaXYtPndvcmtzLmR1YWxtYWNfZWFzeWNvbmN1cnJlbnRfcmV0cnl0aW1lciwKKwkJICAgIHJ0bF9lYXN5X2NvbmN1cnJlbnRfcmV0cnl0aW1lcl9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpaHcpOworCS8qIDwyPiB3b3JrIHF1ZXVlICovCisJcnRscHJpdi0+d29ya3MuaHcgPSBodzsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykpCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCXJ0bHByaXYtPndvcmtzLnJ0bF93cSA9IGFsbG9jX3dvcmtxdWV1ZShydGxwcml2LT5jZmctPm5hbWUsIDAsIDApOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2Vsc2UKKwlydGxwcml2LT53b3Jrcy5ydGxfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKHJ0bHByaXYtPmNmZy0+bmFtZSk7CisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0bHByaXYtPndvcmtzLndhdGNoZG9nX3dxLAorCQkJICAodm9pZCAqKXJ0bF93YXRjaGRvZ193cV9jYWxsYmFjayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0bHByaXYtPndvcmtzLmlwc19uaWNfb2ZmX3dxLAorCQkJICAodm9pZCAqKXJ0bF9pcHNfbmljX29mZl93cV9jYWxsYmFjayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0bHByaXYtPndvcmtzLnBzX3dvcmssCisJCQkgICh2b2lkICopcnRsX3N3bHBzX3dxX2NhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcnRscHJpdi0+d29ya3MucHNfcmZvbl93cSwKKwkJCSAgKHZvaWQgKilydGxfc3dscHNfcmZvbl93cV9jYWxsYmFjayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0bHByaXYtPndvcmtzLmZ3ZXZ0X3dxLAorCQkJICAodm9pZCAqKXJ0bF9md2V2dF93cV9jYWxsYmFjayk7CisKK30KKwordm9pZCBydGxfZGVpbml0X2RlZmVycmVkX3dvcmsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJZGVsX3RpbWVyX3N5bmMoJnJ0bHByaXYtPndvcmtzLndhdGNoZG9nX3RpbWVyKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ0bHByaXYtPndvcmtzLndhdGNoZG9nX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZydGxwcml2LT53b3Jrcy5pcHNfbmljX29mZl93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnRscHJpdi0+d29ya3MucHNfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnRscHJpdi0+d29ya3MucHNfcmZvbl93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnRscHJpdi0+d29ya3MuZndldnRfd3EpOworfQorCit2b2lkIHJ0bF9pbml0X3Jma2lsbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlib29sIHJhZGlvX3N0YXRlOworCWJvb2wgYmxvY2tlZDsKKwl1OCB2YWxpZCA9IDA7CisKKwkvKnNldCBpbml0IHN0YXRlIHRvIG9uICovCisJcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA9IDE7CisJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShody0+d2lwaHksIDApOworCisJcmFkaW9fc3RhdGUgPSBydGxwcml2LT5jZmctPm9wcy0+cmFkaW9fb25vZmZfY2hlY2tpbmcoaHcsICZ2YWxpZCk7CisKKwlpZiAodmFsaWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRsd2lmaTogd2lyZWxlc3Mgc3dpdGNoIGlzICVzXG4iLAorCQkgICAgICAgcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA/ICJvbiIgOiAib2ZmIik7CisKKwkJcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA9IHJhZGlvX3N0YXRlOworCisJCWJsb2NrZWQgPSAocnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA9PSAxKSA/IDAgOiAxOworCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGh3LT53aXBoeSwgYmxvY2tlZCk7CisJfQorCisJd2lwaHlfcmZraWxsX3N0YXJ0X3BvbGxpbmcoaHctPndpcGh5KTsKK30KKwordm9pZCBydGxfZGVpbml0X3Jma2lsbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl3aXBoeV9yZmtpbGxfc3RvcF9wb2xsaW5nKGh3LT53aXBoeSk7Cit9CisKKyNpZmRlZiBWSUZfVE9ETworc3RhdGljIHZvaWQgcnRsX2luaXRfdmlmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCUlOSVRfTElTVF9IRUFEKCZydGxwcml2LT52aWZfcHJpdi52aWZfbGlzdCk7CisKKwlydGxwcml2LT52aWZfcHJpdi52aWZzID0gMDsKK30KKyNlbmRpZgorCitpbnQgcnRsX2luaXRfY29yZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKnJ0bG1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKworCS8qIDwxPiBpbml0IG1hYzgwMjExICovCisJX3J0bF9pbml0X21hYzgwMjExKGh3KTsKKwlydGxtYWMtPmh3ID0gaHc7CisJcnRsbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTk9MSU5LOworCisJLyogPDI+IHJhdGUgY29udHJvbCByZWdpc3RlciAqLworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gInJ0bF9yYyI7CisKKwkvKgorCSAqIDwzPiBpbml0IENSREEgbXVzdCBjb21lIGFmdGVyIGluaXQKKwkgKiBtYWM4MDIxMSBodyAgaW4gX3J0bF9pbml0X21hYzgwMjExLgorCSAqLworCWlmIChydGxfcmVnZF9pbml0KGh3LCBydGxfcmVnX25vdGlmaWVyKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoIlJFR0QgaW5pdCBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogPDQ+IGxvY2tzICovCisJbXV0ZXhfaW5pdCgmcnRscHJpdi0+bG9ja3MuY29uZl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLmlwc19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5oMmNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuZW50cnlfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuY2NrX2FuZF9yd19wYWdlYV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuY2hlY2tfc2VuZHBrdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwkvKiA8NT4gaW5pdCBsaXN0ICovCisJSU5JVF9MSVNUX0hFQUQoJnJ0bHByaXYtPmVudHJ5X2xpc3QpOworCisJLyogPDY+IGluaXQgZGVmZXJyZWQgd29yayAqLworCV9ydGxfaW5pdF9kZWZlcnJlZF93b3JrKGh3KTsKKworCS8qIDw3PiAqLworI2lmZGVmIFZJRl9UT0RPCisJcnRsX2luaXRfdmlmKGh3KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRsX2RlaW5pdF9jb3JlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworfQorCit2b2lkIHJ0bF9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfaHdfcmVnKGh3LCBIV19WQVJfUkNSLCAodTggKikgKCZtYWMtPnJ4X2NvbmYpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR4IGluZm9ybWF0aW9uIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfcnRsX3F1cmV5X3Nob3J0cHJlYW1ibGVfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICp0Y2JfZGVzYywKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHJhdGVfZmxhZyA9IGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3M7CisKKwl0Y2JfZGVzYy0+dXNlX3Nob3J0cHJlYW1ibGUgPSBmYWxzZTsKKworCS8qIDFNIGNhbiBvbmx5IHVzZSBMb25nIFByZWFtYmxlLiAxMUIgc3BlYyAqLworCWlmICh0Y2JfZGVzYy0+aHdfcmF0ZSA9PSBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0NDS19SQVRFMU1dKQorCQlyZXR1cm47CisJZWxzZSBpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSkKKwkJdGNiX2Rlc2MtPnVzZV9zaG9ydHByZWFtYmxlID0gdHJ1ZTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgX3J0bF9xdWVyeV9zaG9ydGdpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqdGNiX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQoreworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdTggcmF0ZV9mbGFnID0gaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFnczsKKwl1OCBzZ2lfNDAgPSAwLCBzZ2lfMjAgPSAwLCBid180MCA9IDA7CisJdGNiX2Rlc2MtPnVzZV9zaG9ydGdpID0gZmFsc2U7CisKKwlpZiAoc3RhID09IE5VTEwpCisJCXJldHVybjsKKworCXNnaV80MCA9IHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOworCXNnaV8yMCA9IHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworCisJaWYgKCEoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSkKKwkJcmV0dXJuOworCisJaWYgKCFzZ2lfNDAgJiYgIXNnaV8yMCkKKwkJcmV0dXJuOworCisJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCWJ3XzQwID0gbWFjLT5id180MDsKKwllbHNlIGlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQkgbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJIG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCisJCWJ3XzQwID0gc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7CisKKwlpZiAoKGJ3XzQwID09IHRydWUpICYmIHNnaV80MCkKKwkJdGNiX2Rlc2MtPnVzZV9zaG9ydGdpID0gdHJ1ZTsKKwllbHNlIGlmICgoYndfNDAgPT0gZmFsc2UpICYmIHNnaV8yMCkKKwkJdGNiX2Rlc2MtPnVzZV9zaG9ydGdpID0gdHJ1ZTsKKworCWlmICghKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkpCisJCXRjYl9kZXNjLT51c2Vfc2hvcnRnaSA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBfcnRsX3F1ZXJ5X3Byb3RlY3Rpb25fbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqdGNiX2Rlc2MsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggcmF0ZV9mbGFnID0gaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFnczsKKworCS8qIENvbW1vbiBTZXR0aW5ncyAqLworCXRjYl9kZXNjLT5iX3J0c19zdGJjID0gZmFsc2U7CisJdGNiX2Rlc2MtPmJfY3RzX2VuYWJsZSA9IGZhbHNlOworCXRjYl9kZXNjLT5ydHNfc2MgPSAwOworCXRjYl9kZXNjLT5iX3J0c19idyA9IGZhbHNlOworCXRjYl9kZXNjLT5iX3J0c191c2Vfc2hvcnRwcmVhbWJsZSA9IGZhbHNlOworCXRjYl9kZXNjLT5iX3J0c191c2Vfc2hvcnRnaSA9IGZhbHNlOworCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfQ1RTX1BST1RFQ1QpIHsKKwkJLyogVXNlIENUUy10by1TRUxGIGluIHByb3RlY3Rpb24gbW9kZS4gKi8KKwkJdGNiX2Rlc2MtPmJfcnRzX2VuYWJsZSA9IHRydWU7CisJCXRjYl9kZXNjLT5iX2N0c19lbmFibGUgPSB0cnVlOworCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX09GRE1fUkFURTI0TV07CisJfSBlbHNlIGlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKKwkJLyogVXNlIFJUUy1DVFMgaW4gcHJvdGVjdGlvbiBtb2RlLiAqLworCQl0Y2JfZGVzYy0+Yl9ydHNfZW5hYmxlID0gdHJ1ZTsKKwkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19PRkRNX1JBVEUyNE1dOworCX0KK30KKworc3RhdGljIHZvaWQgX3J0bF90eHJhdGVfc2VsZWN0bW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeSA9IE5VTEw7CisJdTggcmF0cl9pbmRleCA9IDc7CisKKwlpZiAoc3RhKSB7CisJCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopIHN0YS0+ZHJ2X3ByaXY7CisJCXJhdHJfaW5kZXggPSBzdGFfZW50cnktPnJhdHJfaW5kZXg7CisJfQorCWlmICghdGNiX2Rlc2MtPmRpc2FibGVfcmF0ZWZhbGxiYWNrIHx8ICF0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlKSB7CisJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IDA7CisJCX0gZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CisJCQlpZiAodGNiX2Rlc2MtPmJfbXVsdGljYXN0IHx8IHRjYl9kZXNjLT5iX2Jyb2FkY2FzdCkgeworCQkJCXRjYl9kZXNjLT5od19yYXRlID0KKwkJCQkgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19DQ0tfUkFURTJNXTsKKwkJCQl0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlID0gMTsKKwkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX01DOworCQkJfSBlbHNlIHsKKwkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IHJhdHJfaW5kZXg7CisJCQl9CisJCX0gZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gcmF0cl9pbmRleDsKKwkJfQorCX0KKworCWlmIChydGxwcml2LT5kbS5iX3VzZXJhbWFzaykgeworCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IHJhdHJfaW5kZXg7CisJCS8qIFRPRE8gd2Ugd2lsbCBkaWZmZXJlbnRpYXRlIGFkaG9jIGFuZCBzdGF0aW9uIGZ1dHJ1ZSAgKi8KKwkJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwkJCXRjYl9kZXNjLT5tYWNfaWQgPSAwOworCisJCQlpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpIHsKKwkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HQjsKKwkJCX0gZWxzZSBpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykgeworCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7CisJCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfRykgeworCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfR0I7CisJCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfQikgeworCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfQjsKKwkJCX0gZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9BKSB7CisJCQkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19HOworCQkJfQorCQl9IGVsc2UgaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQkJaWYgKE5VTEwgIT0gc3RhKSB7CisJCQkJaWYgKHN0YS0+YWlkID4gMCkgeworCQkJCQl0Y2JfZGVzYy0+bWFjX2lkID0gc3RhLT5haWQgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXRjYl9kZXNjLT5tYWNfaWQgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGNiX2Rlc2MtPm1hY19pZCA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGxfcXVlcnlfYmFuZHdpZHRoX21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQkgICAgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKworCXRjYl9kZXNjLT5iX3BhY2tldF9idyA9IGZhbHNlOworCWlmICghc3RhKQorCQlyZXR1cm47CisJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8CisJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwkJaWYgKCEoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB8fAorCQkJIShzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkpCisJCQlyZXR1cm47CisJfSBlbHNlIGlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCWlmICghbWFjLT5id180MCB8fCAhKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkpCisJCXJldHVybjsKKwl9CisJaWYgKHRjYl9kZXNjLT5iX211bHRpY2FzdCB8fCB0Y2JfZGVzYy0+Yl9icm9hZGNhc3QpCisJCXJldHVybjsKKworCS8qdXNlIGxlZ2VuY3kgcmF0ZSwgc2hhbGwgdXNlIDIwTUh6ICovCisJaWYgKHRjYl9kZXNjLT5od19yYXRlIDw9IHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfUkNfT0ZETV9SQVRFNTRNXSkKKwkJcmV0dXJuOworCisJdGNiX2Rlc2MtPmJfcGFja2V0X2J3ID0gdHJ1ZTsKK30KKworc3RhdGljIHU4IF9ydGxfZ2V0X2hpZ2hlc3Rfbl9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCBod19yYXRlOworCisJaWYgKChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzJUMlIpICYmIChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSE9MCkpCisJCWh3X3JhdGUgPSBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0hUX1JBVEVNQ1MxNV07CisJZWxzZQorCQlod19yYXRlID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19IVF9SQVRFTUNTN107CisKKwlyZXR1cm4gaHdfcmF0ZTsKK30KKwordm9pZCBydGxfZ2V0X3RjYl9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqcnRsbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSBydGxfZ2V0X2hkcihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqdHhyYXRlOworCXUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKworCXR4cmF0ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgaW5mbyk7CisJaWYgKHR4cmF0ZSAhPSBOVUxMKQorCQl0Y2JfZGVzYy0+aHdfcmF0ZSA9IHR4cmF0ZS0+aHdfdmFsdWU7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CisJCS8qCisJCSAqd2Ugc2V0IGRhdGEgcmF0ZSBJTlggMAorCQkgKmluIHJ0bF9yYy5jICAgaWYgc2tiIGlzIHNwZWNpYWwgZGF0YSBvcgorCQkgKm1ndCB3aGljaCBuZWVkIGxvdyBkYXRhIHJhdGUuCisJCSAqLworCisJCS8qCisJCSAqU28gdGNiX2Rlc2MtPmh3X3JhdGUgaXMganVzdCB1c2VkIGZvcgorCQkgKnNwZWNpYWwgZGF0YSBhbmQgbWd0IGZyYW1lcworCQkgKi8KKwkJaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID09IDAgfHwKKwkJCQlpZWVlODAyMTFfaXNfbnVsbGZ1bmMoZmMpKSB7CisJCQl0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTUM7CisKKwkJCXRjYl9kZXNjLT5kaXNhYmxlX3JhdGVmYWxsYmFjayA9IDE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICpiZWNhdXNlIGh3IHdpbGwgbmVydmVyIHVzZSBod19yYXRlCisJCQkgKndoZW4gdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSA9IGZhbHNlCisJCQkgKnNvIHdlIG5ldmVyIHNldCBoaWdoZXN0IE4gcmF0ZSBoZXJlLAorCQkJICphbmQgTiByYXRlIHdpbGwgYWxsIGJlIGNvbnRyb2xlZCBieSBGVworCQkJICp3aGVuIHRjYl9kZXNjLT51c2VfZHJpdmVyX3JhdGUgPSBmYWxzZQorCQkJICovCisJCQlpZiAoc3RhICYmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpKSB7CisJCQkJdGNiX2Rlc2MtPmh3X3JhdGUgPSBfcnRsX2dldF9oaWdoZXN0X25fcmF0ZShodywgc3RhKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYocnRsbWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCQkJCQl0Y2JfZGVzYy0+aHdfcmF0ZSA9CisJCQkJCSAgICBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0NDS19SQVRFMTFNXTsKKwkJCQl9IGVsc2UgeworCQkJCQl0Y2JfZGVzYy0+aHdfcmF0ZSA9CisJCQkJCSAgICBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX09GRE1fUkFURTU0TV07CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9nZXRfREEoaGRyKSkpCisJCQl0Y2JfZGVzYy0+Yl9tdWx0aWNhc3QgPSAxOworCQllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfZ2V0X0RBKGhkcikpKQorCQkJdGNiX2Rlc2MtPmJfYnJvYWRjYXN0ID0gMTsKKworCQlfcnRsX3R4cmF0ZV9zZWxlY3Rtb2RlKGh3LCBzdGEsIHRjYl9kZXNjKTsKKwkJX3J0bF9xdWVyeV9iYW5kd2lkdGhfbW9kZShodywgc3RhLCB0Y2JfZGVzYyk7CisJCV9ydGxfcXVyZXlfc2hvcnRwcmVhbWJsZV9tb2RlKGh3LCB0Y2JfZGVzYywgaW5mbyk7CisJCV9ydGxfcXVlcnlfc2hvcnRnaShodywgc3RhLCB0Y2JfZGVzYywgaW5mbyk7CisJCV9ydGxfcXVlcnlfcHJvdGVjdGlvbl9tb2RlKGh3LCB0Y2JfZGVzYywgaW5mbyk7CisJfSBlbHNlIHsKKwkJdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSA9IHRydWU7CisJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTUM7CisJCXRjYl9kZXNjLT5kaXNhYmxlX3JhdGVmYWxsYmFjayA9IDE7CisJCXRjYl9kZXNjLT5tYWNfaWQgPSAwOworCQl0Y2JfZGVzYy0+Yl9wYWNrZXRfYncgPSBmYWxzZTsKKwl9Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX2dldF90Y2JfZGVzYyk7CisKK2Jvb2wgcnRsX3R4X21nbXRfcHJvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MTYgZmMgPSBydGxfZ2V0X2ZjKHNrYik7CisKKwlpZiAocnRscHJpdi0+ZG0uc3VwcF9waHltb2RlX3N3aXRjaCAmJgorCQltYWMtPmxpbmtfc3RhdGUgPCBNQUM4MDIxMV9MSU5LRUQgJiYKKwkJKGllZWU4MDIxMV9pc19hdXRoKGZjKSB8fCBpZWVlODAyMTFfaXNfcHJvYmVfcmVxKGZjKSkpIHsKKwkJaWYgKHJ0bHByaXYtPmNmZy0+b3BzLT5jaGVja19zd2l0Y2hfdG9fZG1kcCkKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5jaGVja19zd2l0Y2hfdG9fZG1kcChodyk7CisJfQorCWlmIChpZWVlODAyMTFfaXNfYXV0aChmYykpIHsKKwkJUlRfVFJBQ0UoQ09NUF9TRU5ELCBEQkdfRE1FU0csICgiTUFDODAyMTFfTElOS0lOR1xuIikpOworCQlydGxfaXBzX25pY19vbihodyk7CisKKwkJbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTElOS0lORzsKKwkJLyogRHVsIG1hYyAqLworCQlydGxwcml2LT5waHkuYl9uZWVkX2lxayA9IHRydWU7CisKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IHNrX2J1ZmYgKnJ0bF9tYWtlX2RlbF9iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnNhLAorCQkJCXU4ICpic3NpZCwgdTE2IHRpZCk7Citib29sIHJ0bF9hY3Rpb25fcHJvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaXNfdHgpCit7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gcnRsX2dldF9oZHIoc2tiKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTE2IGZjID0gcnRsX2dldF9mYyhza2IpOworCXU4ICphY3QgPSAodTggKikgKCgodTggKikgc2tiLT5kYXRhICsgTUFDODAyMTFfM0FERFJfTEVOKSk7CisJdTggY2F0ZWdvcnk7CisKKwlpZiAoIWllZWU4MDIxMV9pc19hY3Rpb24oZmMpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWNhdGVnb3J5ID0gKmFjdDsKKwlhY3QrKzsKKwlzd2l0Y2ggKGNhdGVnb3J5KSB7CisJY2FzZSBBQ1RfQ0FUX0JBOgorCQlzd2l0Y2ggKCphY3QpIHsKKwkJY2FzZSBBQ1RfQUREQkFSRVE6CisJCQlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlSVF9UUkFDRSgoQ09NUF9TRU5EIHwgQ09NUF9SRUNWKSwgREJHX0RNRVNHLAorCQkJCSAoIiVzIEFDVF9BRERCQVJFUSBGcm9tIDolcE1cbiIsCisJCQkJICBpc190eCA/ICJUeCIgOiAiUngiLCBoZHItPmFkZHIyKSk7CisJCQlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoInJlcSBcbiIpLAorCQkgICAgICAJc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlpZiAoIWlzX3R4KSB7CisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CisJCQkJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJCQl1MTYgY2FwYWIgPSAwLCB0aWQgPSAwOworCQkJCXN0cnVjdCBydGxfdGlkX2RhdGEgKnRpZF9kYXRhOworCQkJCXN0cnVjdCBza19idWZmICpza2JfZGVsYmEgPSBOVUxMOworCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cyA9IHsgMCB9OworCisJCQkJcmN1X3JlYWRfbG9jaygpOworCQkJCXN0YSA9IHJ0bF9maW5kX3N0YShodywgaGRyLT5hZGRyMyk7CisJCQkJaWYgKHN0YSA9PSBOVUxMKSB7CisJCQkJCVJUX1RSQUNFKChDT01QX1NFTkQgfCBDT01QX1JFQ1YpLAorCQkJCQkJIERCR19FTUVSRywgKCJzdGEgaXMgTlVMTFxuIikpOworCQkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQkJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKilzdGEtPmRydl9wcml2OworCQkJCWlmICghc3RhX2VudHJ5KSB7CisJCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJY2FwYWIgPSBsZTE2X3RvX2NwdShtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5jYXBhYik7CisJCQkJdGlkID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLKSA+PiAyOworCQkJCXRpZF9kYXRhID0gJnN0YV9lbnRyeS0+dGlkc1t0aWRdOworCQkJCWlmICh0aWRfZGF0YS0+YWdnLnJ4X2FnZ19zdGF0ZSA9PQorCQkJCSAgICBSVExfUlhfQUdHX1NUQVJUKSB7CisJCQkJCXNrYl9kZWxiYSA9IHJ0bF9tYWtlX2RlbF9iYShodywKKwkJCQkJCQkJICAgIGhkci0+YWRkcjIsCisJCQkJCQkJCSAgICBoZHItPmFkZHIzLAorCQkJCQkJCQkgICAgdGlkKTsKKwkJCQkJaWYgKHNrYl9kZWxiYSkgeworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKKwkJCQkJCXJ4X3N0YXR1cy5mcmVxID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5jZW50ZXJfZnJlcTsKKwkJCQkJCXJ4X3N0YXR1cy5iYW5kID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOworI2Vsc2UKKwkJCQkJCXJ4X3N0YXR1cy5mcmVxID0gaHctPmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJCQkJCQlyeF9zdGF0dXMuYmFuZCA9IGh3LT5jb25mLmNoYW5uZWwtPmJhbmQ7CisjZW5kaWYKKwkJCQkJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCQkJCQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19NQUNUSU1FX01QRFU7CisJCQkJCQlyeF9zdGF0dXMucmF0ZV9pZHggPSAwOworCQkJCQkJcnhfc3RhdHVzLnNpZ25hbCA9IDUwICsgMTA7CisJCQkJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYl9kZWxiYSksICZyeF9zdGF0dXMsCisJCQkJCQkJCXNpemVvZihyeF9zdGF0dXMpKTsKKwkJCQkJCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csCisJCQkJCQkJCSgiZmFrZSBkZWxcbiIpLCBza2JfZGVsYmEtPmRhdGEsCisJCQkJCQkJCXNrYl9kZWxiYS0+bGVuKTsKKwkJCQkJCWllZWU4MDIxMV9yeF9pcnFzYWZlKGh3LCBza2JfZGVsYmEpOworCQkJCQl9CisJCQkJfQorCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQUNUX0FEREJBUlNQOgorCQkJUlRfVFJBQ0UoKENPTVBfU0VORCB8IENPTVBfUkVDViksIERCR19ETUVTRywKKwkJCQkgKCIlcyBBQ1RfQUREQkFSU1AgRnJvbSA6JXBNXG4iLAorCQkJCSAgaXNfdHggPyAiVHgiIDogIlJ4IiwgaGRyLT5hZGRyMikpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUX0RFTEJBOgorCQkJUlRfVFJBQ0UoKENPTVBfU0VORCB8IENPTVBfUkVDViksIERCR19ETUVTRywKKwkJCQkgKCJBQ1RfQUREQkFERUwgRnJvbSA6JXBNXG4iLCBoZHItPmFkZHIyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLypzaG91bGQgY2FsbCBiZWZvcmUgc29mdHdhcmUgZW5jKi8KK3U4IHJ0bF9pc19zcGVjaWFsX2RhdGEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IsIHU4IGlzX3R4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwl1MTYgZmMgPSBydGxfZ2V0X2ZjKHNrYik7CisJdTE2IGV0aGVyX3R5cGU7CisJdTggbWFjX2hkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXA7CisKKwlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkKKwkJZ290byBlbmQ7CisKKworCWlwID0gKHN0cnVjdCBpcGhkciAqKSgodTggKikgc2tiLT5kYXRhICsgbWFjX2hkcl9sZW4gKworCQkJICAgICAgU05BUF9TSVpFICsgUFJPVE9DX1RZUEVfU0laRSk7CisJZXRoZXJfdHlwZSA9ICoodTE2ICopICgodTggKikgc2tiLT5kYXRhICsgbWFjX2hkcl9sZW4gKyBTTkFQX1NJWkUpOworCWV0aGVyX3R5cGUgPSBudG9ocyhldGhlcl90eXBlKTsKKworCWlmIChFVEhfUF9JUCA9PSBldGhlcl90eXBlKSB7CisJCWlmIChJUFBST1RPX1VEUCA9PSBpcC0+cHJvdG9jb2wpIHsKKwkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IChzdHJ1Y3QgdWRwaGRyICopKCh1OCAqKSBpcCArCisJCQkJCQkJICAgICAgIChpcC0+aWhsIDw8IDIpKTsKKwkJCWlmICgoKCgodTggKikgdWRwKVsxXSA9PSA2OCkgJiYKKwkJCSAgICAgKCgodTggKikgdWRwKVszXSA9PSA2NykpIHx8CisJCQkgICAgKCgoKHU4ICopIHVkcClbMV0gPT0gNjcpICYmCisJCQkgICAgICgoKHU4ICopIHVkcClbM10gPT0gNjgpKSkgeworCQkJCS8qCisJCQkJICogNjggOiBVRFAgQk9PVFAgY2xpZW50CisJCQkJICogNjcgOiBVRFAgQk9PVFAgc2VydmVyCisJCQkJICovCisJCQkJUlRfVFJBQ0UoKENPTVBfU0VORCB8IENPTVBfUkVDViksCisJCQkJCSBEQkdfRE1FU0csICgiZGhjcCAlcyAhIVxuIiwKKwkJCQkJCSAgICAgKGlzX3R4KSA/ICJUeCIgOiAiUngiKSk7CisKKwkJCQlpZiAoaXNfdHgpIHsKKwkJCQkJcnRscHJpdi0+cmEuaXNfc3BlY2lhbF9kYXRhID0gdHJ1ZTsKKwkJCQkJcnRsX2xwc19sZWF2ZShodyk7CisJCQkJCXBwc2MtPmxhc3RfZGVsYXlscHNfc3RhbXBfamlmZmllcyA9CisJCQkJCQkJCQlqaWZmaWVzOworCQkJCX0KKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChFVEhfUF9BUlAgPT0gZXRoZXJfdHlwZSkgeworCQlpZiAoaXNfdHgpIHsKKwkJCXJ0bHByaXYtPnJhLmlzX3NwZWNpYWxfZGF0YSA9IHRydWU7CisJCQlydGxfbHBzX2xlYXZlKGh3KTsKKwkJCXBwc2MtPmxhc3RfZGVsYXlscHNfc3RhbXBfamlmZmllcyA9IGppZmZpZXM7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKEVUSF9QX1BBRSA9PSBldGhlcl90eXBlKSB7CisJCVJUX1RSQUNFKChDT01QX1NFTkQgfCBDT01QX1JFQ1YpLCBEQkdfRE1FU0csCisJCQkgKCI4MDIuMVggJXMgRUFQT0wgcGt0ISFcbiIsIChpc190eCkgPyAiVHgiIDogIlJ4IikpOworCisJCWlmIChpc190eCkgeworCQkJcnRscHJpdi0+cmEuaXNfc3BlY2lhbF9kYXRhID0gdHJ1ZTsKKwkJCXJ0bF9scHNfbGVhdmUoaHcpOworCQkJcHBzYy0+bGFzdF9kZWxheWxwc19zdGFtcF9qaWZmaWVzID0gamlmZmllczsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoMHg4NkREID09IGV0aGVyX3R5cGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCitlbmQ6CisJcnRscHJpdi0+cmEuaXNfc3BlY2lhbF9kYXRhID0gZmFsc2U7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnVuY3Rpb25zIGNhbGxlZCBieSBjb3JlLmMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHJ0bF90eF9hZ2dfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfdGlkX2RhdGEgKnRpZF9kYXRhOworCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeSA9IE5VTEw7CisKKwlpZiAoc3RhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KHRpZCA+PSBNQVhfVElEX0NPVU5UKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKXN0YS0+ZHJ2X3ByaXY7CisJaWYgKCFzdGFfZW50cnkpCisJCXJldHVybiAtRU5YSU87CisJdGlkX2RhdGEgPSAmc3RhX2VudHJ5LT50aWRzW3RpZF07CisKKwlSVF9UUkFDRShDT01QX1NFTkQsIERCR19ETUVTRywKKwkJICgib24gcmEgPSAlcE0gdGlkID0gJWQgc2VxOiVkXG4iLCBzdGEtPmFkZHIsIHRpZCwKKwkJICB0aWRfZGF0YS0+c2VxX251bWJlcikpOworCisJKnNzbiA9IHRpZF9kYXRhLT5zZXFfbnVtYmVyOworCXRpZF9kYXRhLT5hZ2cuYWdnX3N0YXRlID0gUlRMX0FHR19TVEFSVDsKKworCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCXJldHVybiAwOworfQorCitpbnQgcnRsX3R4X2FnZ19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKworCWlmIChzdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN0YS0+YWRkcikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoInJhID0gTlVMTFxuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlSVF9UUkFDRShDT01QX1NFTkQsIERCR19ETUVTRywKKwkJICgib24gcmEgPSAlcE0gdGlkID0gJWRcbiIsIHN0YS0+YWRkciwgdGlkKSk7CisKKwlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopc3RhLT5kcnZfcHJpdjsKKwl0aWRfZGF0YSA9ICZzdGFfZW50cnktPnRpZHNbdGlkXTsKKwlzdGFfZW50cnktPnRpZHNbdGlkXS5hZ2cuYWdnX3N0YXRlID0gUlRMX0FHR19TVE9QOworCisJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bF9yeF9hZ2dfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKworCWlmIChzdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopc3RhLT5kcnZfcHJpdjsKKwlpZiAoIXN0YV9lbnRyeSkKKwkJcmV0dXJuIC1FTlhJTzsKKwl0aWRfZGF0YSA9ICZzdGFfZW50cnktPnRpZHNbdGlkXTsKKworCVJUX1RSQUNFKENPTVBfUkVDViwgREJHX0RNRVNHLAorCQkgKCJvbiByYSA9ICVwTSB0aWQgPSAlZCBzZXE6JWRcbiIsIHN0YS0+YWRkciwgdGlkLAorCQkgdGlkX2RhdGEtPnNlcV9udW1iZXIpKTsKKworCXRpZF9kYXRhLT5hZ2cucnhfYWdnX3N0YXRlID0gUlRMX1JYX0FHR19TVEFSVDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bF9yeF9hZ2dfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKworCWlmIChzdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN0YS0+YWRkcikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoInJhID0gTlVMTFxuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlSVF9UUkFDRShDT01QX1NFTkQsIERCR19ETUVTRywKKwkJICgib24gcmEgPSAlcE0gdGlkID0gJWRcbiIsIHN0YS0+YWRkciwgdGlkKSk7CisKKwlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopc3RhLT5kcnZfcHJpdjsKKwl0aWRfZGF0YSA9ICZzdGFfZW50cnktPnRpZHNbdGlkXTsKKwlzdGFfZW50cnktPnRpZHNbdGlkXS5hZ2cucnhfYWdnX3N0YXRlID0gUlRMX1JYX0FHR19TVE9QOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRsX3R4X2FnZ19vcGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3RpZF9kYXRhICp0aWRfZGF0YTsKKwlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnkgPSBOVUxMOworCisJaWYgKHN0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3RhLT5hZGRyKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgicmEgPSBOVUxMXG4iKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX0RNRVNHLAorCQkgKCJvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwgc3RhLT5hZGRyLCB0aWQpKTsKKworCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKilzdGEtPmRydl9wcml2OworCXRpZF9kYXRhID0gJnN0YV9lbnRyeS0+dGlkc1t0aWRdOworCXN0YV9lbnRyeS0+dGlkc1t0aWRdLmFnZy5hZ2dfc3RhdGUgPSBSVExfQUdHX09QRVJBVElPTkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB3cSAmIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJvYW1pbmcgKi8KK3ZvaWQgcnRsX2JlYWNvbl9zdGF0aXN0aWMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisKKwlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybjsKKworCWlmIChydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlIDwgTUFDODAyMTFfTElOS0VEKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBpZiB0aGlzIHJlYWxseSBpcyBhIGJlYWNvbiAqLworCWlmICghaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJCSFpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm47CisKKwkvKiBtaW4uIGJlYWNvbiBsZW5ndGggKyBGQ1NfTEVOICovCisJaWYgKHNrYi0+bGVuIDw9IDQwICsgRkNTX0xFTikKKwkJcmV0dXJuOworCisJLyogYW5kIG9ubHkgYmVhY29ucyBmcm9tIHRoZSBhc3NvY2lhdGVkIEJTU0lELCBwbGVhc2UgKi8KKwlpZiAoZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIzLCBydGxwcml2LT5tYWM4MDIxMS5ic3NpZCkpCisJCXJldHVybjsKKworCXJ0bHByaXYtPmxpbmtfaW5mby5iY25fcnhfaW5wZXJpb2QgKys7Cit9CisKK3ZvaWQgcnRsX3dhdGNoZG9nX3dxX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0bF93b3JrcyAqcnRsd29ya3MgPSBjb250YWluZXJfb2ZfZHdvcmtfcnRsKGRhdGEsCisJCQkJCQkJICAgIHN0cnVjdCBydGxfd29ya3MsCisJCQkJCQkJICAgIHdhdGNoZG9nX3dxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHJ0bHdvcmtzLT5odzsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCWJvb2wgYl9idXN5dHJhZmZpYyA9IGZhbHNlOworCWJvb2wgYl90eF9idXN5X3RyYWZmaWMgPSBmYWxzZTsKKwlib29sIGJfcnhfYnVzeV90cmFmZmljID0gZmFsc2U7CisJYm9vbCBiX2hpZ2hlcl9idXN5dHJhZmZpYyA9IGZhbHNlOworCWJvb2wgYl9oaWdoZXJfYnVzeXJ4dHJhZmZpYyA9IGZhbHNlOworCXU4IGlkeCwgdGlkOworCXUzMiByeF9jbnRfaW5wNGVyaW9kID0gMDsKKwl1MzIgdHhfY250X2lucDRlcmlvZCA9IDA7CisJdTMyIGF2ZXJfcnhfY250X2lucGVyaW9kID0gMDsKKwl1MzIgYXZlcl90eF9jbnRfaW5wZXJpb2QgPSAwOworCXUzMiBhdmVyX3RpZHR4X2lucGVyaW9kW01BWF9USURfQ09VTlRdID0gezB9OworCXUzMiB0aWR0eF9pbnA0ZXJpb2RbTUFYX1RJRF9DT1VOVF0gPSB7MH07CisJYm9vbCBiZW50ZXJfcHMgPSBmYWxzZTsKKworCWlmIChpc19oYWxfc3RvcChydGxoYWwpKQorCQlyZXR1cm47CisKKwkvKiA8MT4gRGV0ZXJtaW5lIGlmIGFjdGlvbiBmcmFtZSBpcyBhbGxvd2VkICovCisJaWYgKG1hYy0+bGlua19zdGF0ZSA+IE1BQzgwMjExX05PTElOSykgeworCQlpZiAobWFjLT5jbnRfYWZ0ZXJfbGlua2VkIDwgMjApCisJCQltYWMtPmNudF9hZnRlcl9saW5rZWQrKzsKKwl9IGVsc2UgeworCQltYWMtPmNudF9hZnRlcl9saW5rZWQgPSAwOworCX0KKworCS8qIDwyPiB0byBjaGVjayBpZiB0cmFmZmljIGJ1c3ksIGlmCisJICogYnVzeXRyYWZmaWMgd2UgZG9uJ3QgY2hhbmdlIGNoYW5uZWwgKi8KKwlpZiAobWFjLT5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgeworCisJCS8qICgxKSBnZXQgYXZlcl9yeF9jbnRfaW5wZXJpb2QgJiBhdmVyX3R4X2NudF9pbnBlcmlvZCAqLworCQlmb3IgKGlkeCA9IDA7IGlkeCA8PSAyOyBpZHgrKykgeworCQkJcnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbjRwZXJpb2RbaWR4XSA9CisJCQkgICAgcnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbjRwZXJpb2RbaWR4ICsgMV07CisJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2luNHBlcmlvZFtpZHhdID0KKwkJCSAgICBydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2luNHBlcmlvZFtpZHggKyAxXTsKKwkJfQorCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2luNHBlcmlvZFszXSA9CisJCSAgICBydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kOworCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2luNHBlcmlvZFszXSA9CisJCSAgICBydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8PSAzOyBpZHgrKykgeworCQkJcnhfY250X2lucDRlcmlvZCArPQorCQkJICAgIHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW40cGVyaW9kW2lkeF07CisJCQl0eF9jbnRfaW5wNGVyaW9kICs9CisJCQkgICAgcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbjRwZXJpb2RbaWR4XTsKKwkJfQorCQlhdmVyX3J4X2NudF9pbnBlcmlvZCA9IHJ4X2NudF9pbnA0ZXJpb2QgLyA0OworCQlhdmVyX3R4X2NudF9pbnBlcmlvZCA9IHR4X2NudF9pbnA0ZXJpb2QgLyA0OworCisJCS8qICgyKSBjaGVjayB0cmFmZmljIGJ1c3kgKi8KKwkJaWYgKGF2ZXJfcnhfY250X2lucGVyaW9kID4gMTAwIHx8IGF2ZXJfdHhfY250X2lucGVyaW9kID4gMTAwKSB7CisJCQliX2J1c3l0cmFmZmljID0gdHJ1ZTsKKwkJCWlmIChhdmVyX3J4X2NudF9pbnBlcmlvZCA+IGF2ZXJfdHhfY250X2lucGVyaW9kKQorCQkJCWJfcnhfYnVzeV90cmFmZmljID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQliX3R4X2J1c3lfdHJhZmZpYyA9IGZhbHNlOworCQl9CisKKwkJLyogSGlnaGVyIFR4L1J4IGRhdGEuICovCisJCWlmIChhdmVyX3J4X2NudF9pbnBlcmlvZCA+IDQwMDAgfHwKKwkJCWF2ZXJfdHhfY250X2lucGVyaW9kID4gNDAwMCkgeworCQkJYl9oaWdoZXJfYnVzeXRyYWZmaWMgPSB0cnVlOworCisJCQkvKiBFeHRyZW1lbHkgaGlnaCBSeCBkYXRhLiAqLworCQkJaWYgKGF2ZXJfcnhfY250X2lucGVyaW9kID4gNTAwMCkKKwkJCQliX2hpZ2hlcl9idXN5cnh0cmFmZmljID0gdHJ1ZTsKKwkJfQorCisJCS8qIGNoZWNrIGV2ZXJ5IHRpZCdzIHR4IHRyYWZmaWMgKi8KKwkJZm9yICh0aWQgPSAwOyB0aWQgPD0gNzsgdGlkKyspIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDw9IDI7IGlkeCsrKQorCQkJCXJ0bHByaXYtPmxpbmtfaW5mby50aWR0eF9pbjRwZXJpb2RbdGlkXVtpZHhdID0KKwkJCQkJcnRscHJpdi0+bGlua19pbmZvLnRpZHR4X2luNHBlcmlvZFt0aWRdCisJCQkJCVtpZHggKyAxXTsKKwkJCXJ0bHByaXYtPmxpbmtfaW5mby50aWR0eF9pbjRwZXJpb2RbdGlkXVszXSA9CisJCQkJcnRscHJpdi0+bGlua19pbmZvLnRpZHR4X2lucGVyaW9kW3RpZF07CisKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDw9IDM7IGlkeCsrKQorCQkJCXRpZHR4X2lucDRlcmlvZFt0aWRdICs9CisJCQkJICAgcnRscHJpdi0+bGlua19pbmZvLnRpZHR4X2luNHBlcmlvZFt0aWRdW2lkeF07CisJCQlhdmVyX3RpZHR4X2lucGVyaW9kW3RpZF0gPSB0aWR0eF9pbnA0ZXJpb2RbdGlkXSAvIDQ7CisJCQlpZiAoYXZlcl90aWR0eF9pbnBlcmlvZFt0aWRdID4gNTAwMCkKKwkJCQlydGxwcml2LT5saW5rX2luZm8uaGlnaGVyX2J1c3l0eHRyYWZmaWNbdGlkXSA9CisJCQkJCQkJCQl0cnVlOworCQkJZWxzZQorCQkJCXJ0bHByaXYtPmxpbmtfaW5mby5oaWdoZXJfYnVzeXR4dHJhZmZpY1t0aWRdID0KKwkJCQkJCQkJCWZhbHNlOworCQl9CisKKwkJaWYgKCgocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCArCisJCSAgICAgIHJ0bHByaXYtPmxpbmtfaW5mby5udW1fdHhfaW5wZXJpb2QpID4gOCkgfHwKKwkJICAgIChydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kID4gMikpCisJCQliZW50ZXJfcHMgPSBmYWxzZTsKKwkJZWxzZQorCQkJYmVudGVyX3BzID0gdHJ1ZTsKKworCQkvKiBMZWlzdXJlUFMgb25seSB3b3JrIGluIGluZnJhIG1vZGUuICovCisJCWlmIChiZW50ZXJfcHMpCisJCQlydGxfbHBzX2VudGVyKGh3KTsKKwkJZWxzZQorCQkJcnRsX2xwc19sZWF2ZShodyk7CisJfQorCisJcnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCA9IDA7CisJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCA9IDA7CisJZm9yICh0aWQgPSAwOyB0aWQgPD0gNzsgdGlkKyspCisJCXJ0bHByaXYtPmxpbmtfaW5mby50aWR0eF9pbnBlcmlvZFt0aWRdID0gMDsKKworCXJ0bHByaXYtPmxpbmtfaW5mby5iX2J1c3l0cmFmZmljID0gYl9idXN5dHJhZmZpYzsKKwlydGxwcml2LT5saW5rX2luZm8uYl9yeF9idXN5X3RyYWZmaWMgPSBiX3J4X2J1c3lfdHJhZmZpYzsKKwlydGxwcml2LT5saW5rX2luZm8uYl90eF9idXN5X3RyYWZmaWMgPSBiX3R4X2J1c3lfdHJhZmZpYzsKKwlydGxwcml2LT5saW5rX2luZm8uYl9oaWdoZXJfYnVzeXRyYWZmaWMgPSBiX2hpZ2hlcl9idXN5dHJhZmZpYzsKKwlydGxwcml2LT5saW5rX2luZm8uYl9oaWdoZXJfYnVzeXJ4dHJhZmZpYyA9IGJfaGlnaGVyX2J1c3lyeHRyYWZmaWM7CisKKwkvKiA8Mz4gRE0gKi8KKwlydGxwcml2LT5jZmctPm9wcy0+ZG1fd2F0Y2hkb2coaHcpOworCisJLyogPDQ+IHJvYW1pbmcgKi8KKwlpZiAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX0xJTktFRCAmJgorCQkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQlpZiAoKHJ0bHByaXYtPmxpbmtfaW5mby5iY25fcnhfaW5wZXJpb2QgKworCQkJcnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCkgPT0gMCkgeworCQkJcnRscHJpdi0+bGlua19pbmZvLnJvYW1fdGltZXMrKzsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRE1FU0csICgiQVAgb2ZmIGZvciAlZCBzXG4iLAorCQkJCShydGxwcml2LT5saW5rX2luZm8ucm9hbV90aW1lcyAqIDIpKSk7CisKKwkJCS8qIGlmIHdlIGNhbid0IHJlY3YgYmVhY29uIGZvciAxMHMsCisJCQkgKiB3ZSBzaG91bGQgcmVjb25uZWN0IHRoaXMgQVAgKi8KKwkJCWlmIChydGxwcml2LT5saW5rX2luZm8ucm9hbV90aW1lcyA+PSA1KSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkJICgiQVAgb2ZmLCB0cnkgdG8gcmVjb25uZWN0IG5vd1xuIikpOworCQkJCXJ0bHByaXYtPmxpbmtfaW5mby5yb2FtX3RpbWVzID0gMDsKKwkJCQlpZWVlODAyMTFfY29ubmVjdGlvbl9sb3NzKHJ0bHByaXYtPm1hYzgwMjExLnZpZik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlydGxwcml2LT5saW5rX2luZm8ucm9hbV90aW1lcyA9IDA7CisJCX0KKwl9CisJcnRscHJpdi0+bGlua19pbmZvLmJjbl9yeF9pbnBlcmlvZCA9IDA7Cit9CisKK3ZvaWQgcnRsX3dhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAoc3RydWN0IGllZWU4MDIxMV9odyAqKWRhdGE7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcXVldWVfZGVsYXllZF93b3JrKHJ0bHByaXYtPndvcmtzLnJ0bF93cSwKKwkJCSAgICZydGxwcml2LT53b3Jrcy53YXRjaGRvZ193cSwgMCk7CisKKwltb2RfdGltZXIoJnJ0bHByaXYtPndvcmtzLndhdGNoZG9nX3RpbWVyLAorCQkgIGppZmZpZXMgKyBNU0VDUyhSVExfV0FUQ0hfRE9HX1RJTUUpKTsKK30KK3ZvaWQgcnRsX2Z3ZXZ0X3dxX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0bF93b3JrcyAqcnRsd29ya3MgPQorCQljb250YWluZXJfb2ZfZHdvcmtfcnRsKGRhdGEsIHN0cnVjdCBydGxfd29ya3MsIGZ3ZXZ0X3dxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHJ0bHdvcmtzLT5odzsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+YzJoX2NvbW1hbmRfaGFuZGxlKGh3KTsKK30KK3ZvaWQgcnRsX2Vhc3lfY29uY3VycmVudF9yZXRyeXRpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h3ICopZGF0YTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpidWRkeV9wcml2ID0gcnRscHJpdi0+YnVkZHlfcHJpdjsKKworCWlmKGJ1ZGR5X3ByaXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KGh3KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmcmFtZSBwcm9jZXNzIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCAqcnRsX2ZpbmRfaWUodTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHU4IGllKQoreworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9ICh2b2lkICopZGF0YTsKKwl1OCAqcG9zLCAqZW5kOworCisJcG9zID0gKHU4ICopbWdtdC0+dS5iZWFjb24udmFyaWFibGU7CisJZW5kID0gZGF0YSArIGxlbjsKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKHBvc1swXSA9PSBpZSkKKwkJCXJldHVybiBwb3M7CisKKwkJcG9zICs9IDIgKyBwb3NbMV07CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiB3aGVuIHdlIHVzZSAyIHJ4IGFudHMgd2Ugc2VuZCBJRUVFODAyMTFfU01QU19PRkYgKi8KKy8qIHdoZW4gd2UgdXNlIDEgcnggYW50IHdlIHNlbmQgSUVFRTgwMjExX1NNUFNfU1RBVElDICovCitzdHJ1Y3Qgc2tfYnVmZiAqcnRsX21ha2Vfc21wc19hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBlbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wcywKKwkJCQkgICAgIHU4ICpkYSwgdTggKmJzc2lkKQoreworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXRfY29tcGF0ICphY3Rpb25fZnJhbWU7CisKKwkvKiAyNyA9IGhlYWRlciArIGNhdGVnb3J5ICsgYWN0aW9uICsgc21wcyBtb2RlICovCisJc2tiID0gZGV2X2FsbG9jX3NrYigyNyArIGh3LT5leHRyYV90eF9oZWFkcm9vbSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBody0+ZXh0cmFfdHhfaGVhZHJvb20pOworCWFjdGlvbl9mcmFtZSA9ICh2b2lkICopc2tiX3B1dChza2IsIDI3KTsKKwltZW1zZXQoYWN0aW9uX2ZyYW1lLCAwLCAyNyk7CisJbWVtY3B5KGFjdGlvbl9mcmFtZS0+ZGEsIGRhLCBFVEhfQUxFTik7CisJbWVtY3B5KGFjdGlvbl9mcmFtZS0+c2EsIHJ0bGVmdXNlLT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhY3Rpb25fZnJhbWUtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCWFjdGlvbl9mcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CisJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfSFQ7CisJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51Lmh0X3NtcHMuYWN0aW9uID0gV0xBTl9IVF9BQ1RJT05fU01QUzsKKwlzd2l0Y2ggKHNtcHMpIHsKKwljYXNlIElFRUU4MDIxMV9TTVBTX0FVVE9NQVRJQzovKiAwICovCisJY2FzZSBJRUVFODAyMTFfU01QU19OVU1fTU9ERVM6LyogNCAqLworCQlXQVJOX09OKDEpOworCWNhc2UgSUVFRTgwMjExX1NNUFNfT0ZGOi8qIDEgKi8gLypNSU1PX1BTX05PTElNSVQqLworCQlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLnUuaHRfc21wcy5zbXBzX2NvbnRyb2wgPQorCQkJCVdMQU5fSFRfU01QU19DT05UUk9MX0RJU0FCTEVEOy8qIDAgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6LyogMiAqLyAvKk1JTU9fUFNfU1RBVElDKi8KKwkJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51Lmh0X3NtcHMuc21wc19jb250cm9sID0KKwkJCQlXTEFOX0hUX1NNUFNfQ09OVFJPTF9TVEFUSUM7LyogMSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TTVBTX0RZTkFNSUM6LyogMyAqLyAvKk1JTU9fUFNfRFlOQU1JQyovCisJCWFjdGlvbl9mcmFtZS0+dS5hY3Rpb24udS5odF9zbXBzLnNtcHNfY29udHJvbCA9CisJCQkJV0xBTl9IVF9TTVBTX0NPTlRST0xfRFlOQU1JQzsvKiAzICovCisJCWJyZWFrOworCX0KKworCXJldHVybiBza2I7Cit9CisKK2ludCBydGxfc2VuZF9zbXBzX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJIGVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBydGxfdGNiX2Rlc2MgdGNiX2Rlc2M7CisJdTggYnNzaWRbRVRIX0FMRU5dID0gezB9OworCisJbWVtc2V0KCZ0Y2JfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBydGxfdGNiX2Rlc2MpKTsKKworCWlmIChydGxwcml2LT5tYWM4MDIxMS5hY3Rfc2Nhbm5pbmcpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlpZiAoIXN0YSkKKwkJZ290byBlcnJfZnJlZTsKKworCWlmICh1bmxpa2VseShpc19oYWxfc3RvcChydGxoYWwpIHx8IHBwc2MtPnJmcHdyX3N0YXRlICE9IEVSRk9OKSkKKwkJZ290byBlcnJfZnJlZTsKKworCWlmICghdGVzdF9iaXQoUlRMX1NUQVRVU19JTlRFUkZBQ0VfU1RBUlQsICZydGxwcml2LT5zdGF0dXMpKQorCQlnb3RvIGVycl9mcmVlOworCisJaWYgKHJ0bHByaXYtPm1hYzgwMjExLm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKKwkJbWVtY3B5KGJzc2lkLCBydGxwcml2LT5lZnVzZS5kZXZfYWRkciwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KGJzc2lkLCBydGxwcml2LT5tYWM4MDIxMS5ic3NpZCwgRVRIX0FMRU4pOworCisJc2tiID0gcnRsX21ha2Vfc21wc19hY3Rpb24oaHcsIHNtcHMsIHN0YS0+YWRkciwgYnNzaWQpOworCS8qIHRoaXMgaXMgYSB0eXBlID0gbWdtdCAqIHN0eXBlID0gYWN0aW9uIGZyYW1lICovCisJaWYgKHNrYikgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeSA9CisJCQkoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKSBzdGEtPmRydl9wcml2OworCQlzdGFfZW50cnktPm1pbW9fcHMgPSBzbXBzOworCQkvKiBydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX3JhdGVfdGJsKGh3LCBzdGEsIDApOyAqLworCisJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gMDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCisJCWluZm8tPmJhbmQgPSBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmJhbmQ7CisjZWxzZQorCQlpbmZvLT5iYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisJCWluZm8tPmNvbnRyb2wuc3RhID0gc3RhOworCQlydGxwcml2LT5pbnRmX29wcy0+YWRhcHRlcl90eChodywgc2tiLCAmdGNiX2Rlc2MpOworI2Vsc2UKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJCXJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3R4KGh3LCBzdGEsIHNrYiwgJnRjYl9kZXNjKTsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwl9CisJcmV0dXJuIDE7CisKK2Vycl9mcmVlOgorCXJldHVybiAwOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9zZW5kX3NtcHNfYWN0aW9uKTsKKworLyogYmVjYXVzZSBtYWM4MDIxMSBoYXZlIGlzc3VlcyB3aGVuIGNhbiByZWNlaXZlIGRlbCBiYQorICogc28gaGVyZSB3ZSBqdXN0IG1ha2UgYSBmYWtlIGRlbF9iYSBpZiB3ZSByZWNlaXZlIGEgYmFfcmVxCisgKiBidXQgcnhfYWdnIHdhcyBvcGVuZWQgdG8gbGV0IG1hYzgwMjExIHJlbGVhc2Ugc29tZSBiYQorICogcmVsYXRlZCByZXNvdXJjZXMsIHNvIHBsZWFzZSB0aGlzIGRlbF9iYSBmb3IgdHggKi8KK3N0cnVjdCBza19idWZmICpydGxfbWFrZV9kZWxfYmEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJdTggKnNhLCB1OCAqYnNzaWQsIHUxNiB0aWQpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqYWN0aW9uX2ZyYW1lOworCXUxNiBwYXJhbXM7CisKKwkvKiAyNyA9IGhlYWRlciArIGNhdGVnb3J5ICsgYWN0aW9uICsgc21wcyBtb2RlICovCisJc2tiID0gZGV2X2FsbG9jX3NrYigzNCArIGh3LT5leHRyYV90eF9oZWFkcm9vbSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBody0+ZXh0cmFfdHhfaGVhZHJvb20pOworCWFjdGlvbl9mcmFtZSA9ICh2b2lkICopc2tiX3B1dChza2IsIDM0KTsKKwltZW1zZXQoYWN0aW9uX2ZyYW1lLCAwLCAzNCk7CisJbWVtY3B5KGFjdGlvbl9mcmFtZS0+c2EsIHNhLCBFVEhfQUxFTik7CisJbWVtY3B5KGFjdGlvbl9mcmFtZS0+ZGEsIHJ0bGVmdXNlLT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhY3Rpb25fZnJhbWUtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCWFjdGlvbl9mcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CisJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfQkFDSzsKKwlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLnUuZGVsYmEuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9ERUxCQTsKKwlwYXJhbXMgPSAodTE2KSgxIDw8IDExKTsgCS8qIGJpdCAxMSBpbml0aWF0b3IgKi8KKwlwYXJhbXMgfD0gKHUxNikodGlkIDw8IDEyKTsgCQkvKiBiaXQgMTU6MTIgVElEIG51bWJlciAqLworCisJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlID0KKwkJY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fUVNUQV9USU1FT1VUKTsKKworCXJldHVybiBza2I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJT1QgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIHJ0bF9jaGtfdmVuZG9yX291aXN1YihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHN0cnVjdCBvY3RldF9zdHJpbmcgdmVuZG9yX2llKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlib29sIG1hdGNoZWQgPSBmYWxzZTsKKwlzdGF0aWMgdTggYXRoY2FwXzFbXSA9IHsgMHgwMCwgMHgwMywgMHg3RiB9OworCXN0YXRpYyB1OCBhdGhjYXBfMltdID0geyAweDAwLCAweDEzLCAweDc0IH07CisJc3RhdGljIHU4IGJyb2FkY2FwXzFbXSA9IHsgMHgwMCwgMHgxMCwgMHgxOCB9OworCXN0YXRpYyB1OCBicm9hZGNhcF8yW10gPSB7IDB4MDAsIDB4MGEsIDB4ZjcgfTsKKwlzdGF0aWMgdTggYnJvYWRjYXBfM1tdID0geyAweDAwLCAweDA1LCAweGI1IH07CisJc3RhdGljIHU4IHJhY2FwW10gPSB7IDB4MDAsIDB4MGMsIDB4NDMgfTsKKwlzdGF0aWMgdTggY2lzY29jYXBbXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiB9OworCXN0YXRpYyB1OCBtYXJ2Y2FwW10gPSB7IDB4MDAsIDB4NTAsIDB4NDMgfTsKKworCWlmIChtZW1jbXAodmVuZG9yX2llLm9jdGV0LCBhdGhjYXBfMSwgMykgPT0gMCB8fAorCQltZW1jbXAodmVuZG9yX2llLm9jdGV0LCBhdGhjYXBfMiwgMykgPT0gMCkgeworCQlydGxwcml2LT5tYWM4MDIxMS52ZW5kb3IgPSBQRUVSX0FUSDsKKwkJbWF0Y2hlZCA9IHRydWU7CisJfSBlbHNlIGlmIChtZW1jbXAodmVuZG9yX2llLm9jdGV0LCBicm9hZGNhcF8xLCAzKSA9PSAwIHx8CisJCW1lbWNtcCh2ZW5kb3JfaWUub2N0ZXQsIGJyb2FkY2FwXzIsIDMpID09IDAgfHwKKwkJbWVtY21wKHZlbmRvcl9pZS5vY3RldCwgYnJvYWRjYXBfMywgMykgPT0gMCkgeworCQlydGxwcml2LT5tYWM4MDIxMS52ZW5kb3IgPSBQRUVSX0JST0FEOworCQltYXRjaGVkID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKG1lbWNtcCh2ZW5kb3JfaWUub2N0ZXQsIHJhY2FwLCAzKSA9PSAwKSB7CisJCXJ0bHByaXYtPm1hYzgwMjExLnZlbmRvciA9IFBFRVJfUkFMOworCQltYXRjaGVkID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKG1lbWNtcCh2ZW5kb3JfaWUub2N0ZXQsIGNpc2NvY2FwLCAzKSA9PSAwKSB7CisJCXJ0bHByaXYtPm1hYzgwMjExLnZlbmRvciA9IFBFRVJfQ0lTQ087CisJCW1hdGNoZWQgPSB0cnVlOworCX0gZWxzZSBpZiAobWVtY21wKHZlbmRvcl9pZS5vY3RldCwgbWFydmNhcCwgMykgPT0gMCkgeworCQlydGxwcml2LT5tYWM4MDIxMS52ZW5kb3IgPSBQRUVSX01BUlY7CisJCW1hdGNoZWQgPSB0cnVlOworCX0KKworCXJldHVybiBtYXRjaGVkOworfQorCitib29sIHJ0bF9maW5kXzIyMV9pZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmRhdGEsCisJCXVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHZvaWQgKilkYXRhOworCXN0cnVjdCBvY3RldF9zdHJpbmcgdmVuZG9yX2llOworCXU4ICpwb3MsICplbmQ7CisKKwlwb3MgPSAodTggKiltZ210LT51LmJlYWNvbi52YXJpYWJsZTsKKwllbmQgPSBkYXRhICsgbGVuOworCXdoaWxlIChwb3MgPCBlbmQpIHsKKwkJaWYgKHBvc1swXSA9PSAyMjEpIHsKKwkJCXZlbmRvcl9pZS5sZW5ndGggPSBwb3NbMV07CisJCQl2ZW5kb3JfaWUub2N0ZXQgPSAmcG9zWzJdOworCQkJaWYgKHJ0bF9jaGtfdmVuZG9yX291aXN1YihodywgdmVuZG9yX2llKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXBvcyArPSAyICsgcG9zWzFdOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgcnRsX3JlY29nbml6ZV9wZWVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilkYXRhOworCXUzMiB2ZW5kb3IgPSBQRUVSX1VOS05PV047CisKKwlzdGF0aWMgdTggYXAzXzFbM10gPSB7IDB4MDAsIDB4MTQsIDB4YmYgfTsKKwlzdGF0aWMgdTggYXAzXzJbM10gPSB7IDB4MDAsIDB4MWEsIDB4NzAgfTsKKwlzdGF0aWMgdTggYXAzXzNbM10gPSB7IDB4MDAsIDB4MWQsIDB4N2UgfTsKKwlzdGF0aWMgdTggYXA0XzFbM10gPSB7IDB4MDAsIDB4OTAsIDB4Y2MgfTsKKwlzdGF0aWMgdTggYXA0XzJbM10gPSB7IDB4MDAsIDB4MGUsIDB4MmUgfTsKKwlzdGF0aWMgdTggYXA0XzNbM10gPSB7IDB4MDAsIDB4MTgsIDB4MDIgfTsKKwlzdGF0aWMgdTggYXA0XzRbM10gPSB7IDB4MDAsIDB4MTcsIDB4M2YgfTsKKwlzdGF0aWMgdTggYXA0XzVbM10gPSB7IDB4MDAsIDB4MWMsIDB4ZGYgfTsKKwlzdGF0aWMgdTggYXA1XzFbM10gPSB7IDB4MDAsIDB4MWMsIDB4ZjAgfTsKKwlzdGF0aWMgdTggYXA1XzJbM10gPSB7IDB4MDAsIDB4MjEsIDB4OTEgfTsKKwlzdGF0aWMgdTggYXA1XzNbM10gPSB7IDB4MDAsIDB4MjQsIDB4MDEgfTsKKwlzdGF0aWMgdTggYXA1XzRbM10gPSB7IDB4MDAsIDB4MTUsIDB4ZTkgfTsKKwlzdGF0aWMgdTggYXA1XzVbM10gPSB7IDB4MDAsIDB4MTcsIDB4OUEgfTsKKwlzdGF0aWMgdTggYXA1XzZbM10gPSB7IDB4MDAsIDB4MTgsIDB4RTcgfTsKKwlzdGF0aWMgdTggYXA2XzFbM10gPSB7IDB4MDAsIDB4MTcsIDB4OTQgfTsKKwlzdGF0aWMgdTggYXA3XzFbM10gPSB7IDB4MDAsIDB4MTQsIDB4YTQgfTsKKworCWlmIChtYWMtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlyZXR1cm47CisKKwlpZiAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX05PTElOSykgeworCQltYWMtPnZlbmRvciA9IFBFRVJfVU5LTk9XTjsKKwkJcmV0dXJuOworCX0KKworCWlmIChtYWMtPmNudF9hZnRlcl9saW5rZWQgPiAyKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBpZiB0aGlzIHJlYWxseSBpcyBhIGJlYWNvbiAqLworCWlmICghaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm47CisKKwkvKiBtaW4uIGJlYWNvbiBsZW5ndGggKyBGQ1NfTEVOICovCisJaWYgKGxlbiA8PSA0MCArIEZDU19MRU4pCisJCXJldHVybjsKKworCS8qIGFuZCBvbmx5IGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBCU1NJRCwgcGxlYXNlICovCisJaWYgKGV0aGVyX2FkZHJfZXF1YWwoaGRyLT5hZGRyMywgcnRscHJpdi0+bWFjODAyMTEuYnNzaWQpKQorCQlyZXR1cm47CisKKwlpZiAocnRsX2ZpbmRfMjIxX2llKGh3LCBkYXRhLCBsZW4pKSB7CisJCXZlbmRvciA9IG1hYy0+dmVuZG9yOworCX0KKworCWlmICgobWVtY21wKG1hYy0+YnNzaWQsIGFwNV8xLCAzKSA9PSAwKSB8fAorCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV8yLCAzKSA9PSAwKSB8fAorCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV8zLCAzKSA9PSAwKSB8fAorCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV80LCAzKSA9PSAwKSB8fAorCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV81LCAzKSA9PSAwKSB8fAorCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV82LCAzKSA9PSAwKSB8fAorCQl2ZW5kb3IgPT0gUEVFUl9BVEgpIHsKKwkJdmVuZG9yID0gUEVFUl9BVEg7CisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELCAoIj0+YXRoIGZpbmRcbiIpKTsKKwl9IGVsc2UgaWYgKChtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzQsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzUsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzEsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzIsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXA0XzMsIDMpID09IDApIHx8CisJCXZlbmRvciA9PSBQRUVSX1JBTCkgeworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCI9PnJhbCBmaW5kblxuIikpOworCQl2ZW5kb3IgPSBQRUVSX1JBTDsKKwl9IGVsc2UgaWYgKG1lbWNtcChtYWMtPmJzc2lkLCBhcDZfMSwgMykgPT0gMCB8fAorCQl2ZW5kb3IgPT0gUEVFUl9DSVNDTykgeworCQl2ZW5kb3IgPSBQRUVSX0NJU0NPOworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCI9PmNpc2NvIGZpbmRcbiIpKTsKKwl9IGVsc2UgaWYgKChtZW1jbXAobWFjLT5ic3NpZCwgYXAzXzEsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXAzXzIsIDMpID09IDApIHx8CisJCShtZW1jbXAobWFjLT5ic3NpZCwgYXAzXzMsIDMpID09IDApIHx8CisJCXZlbmRvciA9PSBQRUVSX0JST0FEKSB7CisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELCAoIj0+YnJvYWQgZmluZFxuIikpOworCQl2ZW5kb3IgPSBQRUVSX0JST0FEOworCX0gZWxzZSBpZiAobWVtY21wKG1hYy0+YnNzaWQsIGFwN18xLCAzKSA9PSAwIHx8CisJCXZlbmRvciA9PSBQRUVSX01BUlYpIHsKKwkJdmVuZG9yID0gUEVFUl9NQVJWOworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCI9Pm1hcnYgZmluZFxuIikpOworCX0KKworCW1hYy0+dmVuZG9yID0gdmVuZG9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3lzZnMgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzc2l6ZV90IHJ0bF9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBydGxwcml2LT5kYmcuZ2xvYmFsX2RlYnVnbGV2ZWwpOworfQorCitzdGF0aWMgc3NpemVfdCBydGxfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwl9IGVsc2UgeworCQlydGxwcml2LT5kYmcuZ2xvYmFsX2RlYnVnbGV2ZWwgPSB2YWw7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZWJ1Z2xldmVsOiV4XG4iLAorCQkJcnRscHJpdi0+ZGJnLmdsb2JhbF9kZWJ1Z2xldmVsKTsKKwl9CisKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgcnRsX3Nob3dfZGVidWdfbGV2ZWwsIHJ0bF9zdG9yZV9kZWJ1Z19sZXZlbCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpydGxfc3lzZnNfZW50cmllc1tdID0geworCisJJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCisKKwlOVUxMCit9OworCisvKgorICogIm5hbWUiIGlzIGZvbGRlciBuYW1lIHdpdGNoIHdpbGwgYmUKKyAqIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5IGxpa2UgOgorICogc3lzL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFjLjQvCisgKiAwMDAwOjA2OjAwLjAvcnRsX3N5c2ZzCisgKi8KK3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcnRsX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9ICJydGxzeXNmcyIsCisJLmF0dHJzID0gcnRsX3N5c2ZzX2VudHJpZXMsCit9OworCisjaWZkZWYgVklGX1RPRE8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB2aWYgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV92aWYgKgorcnRsX2dldF92aWYoc3RydWN0IHJ0bF92aWZfaW5mbyAqdmlmX3ByaXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXZpZl9wcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiwgZHJ2X3ByaXYpOworfQorCisvKiBQcm90ZWN0ZWQgYnkgYXItPm11dGV4IG9yIFJDVSAqLworc3RydWN0IGllZWU4MDIxMV92aWYgKnJ0bF9nZXRfbWFpbl92aWYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfdmlmX2luZm8gKmN2aWY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjdmlmLCAmcnRscHJpdi0+dmlmX3ByaXYudmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN2aWYtPmFjdGl2ZSkKKwkJCXJldHVybiBydGxfZ2V0X3ZpZihjdmlmKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX21haW5fdmlmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJYm9vbCByZXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmV0ID0gKHJ0bF9nZXRfbWFpbl92aWYoaHcpID09IHZpZik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworYm9vbCBydGxfc2V0X3ZpZl9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBydGxfdmlmX2luZm8gKnZpZl9pbmZvID0gKHZvaWQgKikgdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IHZpZl9pZCA9IC0xOworCisJaWYgKHJ0bHByaXYtPnZpZl9wcml2LnZpZnMgPj0gTUFYX1ZJUlRVQUxfTUFDKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoInZpZiBudW1iZXIgY2FuIG5vdCBiaWdnZXIgdGhhbiAlZCwgbm93IHZpZnMgaXM6JWRcbiIsCisJCQkgIE1BWF9WSVJUVUFMX01BQywgcnRscHJpdi0+dmlmX3ByaXYudmlmcykpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCXZpZl9pZCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKCZydGxwcml2LT52aWZfcHJpdi52aWZfYml0bWFwLAorCQkJCQkgTUFYX1ZJUlRVQUxfTUFDLCAwKTsKKwlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfRE1FU0csCisJCSAoIiVzIHZpZF9pZDolZFxuIiwgX19mdW5jX18sIHZpZl9pZCkpOworCisJaWYgKHZpZl9pZCA8IDApIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlCVUdfT04ocnRscHJpdi0+dmlmX3ByaXYudmlmW3ZpZl9pZF0uaWQgIT0gdmlmX2lkKTsKKwl2aWZfaW5mby0+YWN0aXZlID0gdHJ1ZTsKKwl2aWZfaW5mby0+aWQgPSB2aWZfaWQ7CisJdmlmX2luZm8tPmVuYWJsZV9iZWFjb24gPSBmYWxzZTsKKwlydGxwcml2LT52aWZfcHJpdi52aWZzKys7CisJaWYgKHJ0bHByaXYtPnZpZl9wcml2LnZpZnMgPiAxKSB7CisJCXJ0bHByaXYtPnBzYy5iX2luYWN0aXZlcHMgPSBmYWxzZTsKKwkJcnRscHJpdi0+cHNjLmJfc3djdHJsX2xwcyA9IGZhbHNlOworCQlydGxwcml2LT5wc2MuYl9md2N0cmxfbHBzID0gZmFsc2U7CisJfQorCisJbGlzdF9hZGRfdGFpbF9yY3UoJnZpZl9pbmZvLT5saXN0LCAmcnRscHJpdi0+dmlmX3ByaXYudmlmX2xpc3QpOworCXJjdV9hc3NpZ25fcG9pbnRlcihydGxwcml2LT52aWZfcHJpdi52aWZbdmlmX2lkXS52aWYsIHZpZik7CisKKwlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfRE1FU0csICgidmlmYWRkcmVzczolcCAlcCAlcFxuIiwKKwkJIHJ0bHByaXYtPnZpZl9wcml2LnZpZlt2aWZfaWRdLnZpZiwgdmlmLCBydGxfZ2V0X21haW5fdmlmKGh3KSkpOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisKKyNpZiAwCitNT0RVTEVfQVVUSE9SKCJsaXpoYW9taW5nCTxjaGFvbWluZ19saUByZWFsc2lsLmNvbS5jbj4iKTsKK01PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgV2xhbkZBRQk8d2xhbmZhZUByZWFsdGVrLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkxhcnJ5IEZpbmdlcgk8TGFycnkuRkluZ2VyQGx3ZmluZ2VyLm5ldD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbHRlayA4MDIuMTFuIFBDSSB3aXJlbGVzcyBjb3JlIik7CisjZW5kaWYKK3N0cnVjdCBydGxfZ2xvYmFsX3ZhciBnbG9iYWxfdmFyID0ge307CisKK2ludCBydGxfY29yZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWlmIChydGxfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCkpCisJCXByaW50ayhLRVJOX0RFQlVHICJydGw6IFVuYWJsZSB0byByZWdpc3RlciBydGxfcmMsIgorCQkJICAidXNlIGRlZmF1bHQgUkMgISFcbiIpOworCisJLyogYWRkIHByb2MgZm9yIGRlYnVnICovCisJcnRsX3Byb2NfYWRkX3RvcGRpcigpOworCisJLyogaW5pdCBzb21lIGdsb2JhbCB2YXJzICovCisJSU5JVF9MSVNUX0hFQUQoJmdsb2JhbF92YXIuZ2xiX3ByaXZfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmdsb2JhbF92YXIuZ2xiX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGxfY29yZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qUkMqLworICAgCXJ0bF9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworCisJLyogYWRkIHByb2MgZm9yIGRlYnVnICovCisJcnRsX3Byb2NfcmVtb3ZlX3RvcGRpcigpOworfQorCisjaWYgMAorbW9kdWxlX2luaXQocnRsX2NvcmVfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocnRsX2NvcmVfbW9kdWxlX2V4aXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2Jhc2UuaApAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVExfQkFTRV9IX18KKyNkZWZpbmUgX19SVExfQkFTRV9IX18KKworI2luY2x1ZGUgImNvbXBhdC5oIgorCitlbnVtIGFwX3BlZXIgeworCVBFRVJfVU5LTk9XTiA9IDAsCisJUEVFUl9SVEwgPSAxLAorCVBFRVJfUlRMXzkyU0UgPSAyLAorCVBFRVJfQlJPQUQgPSAzLAorCVBFRVJfUkFMID0gNCwKKwlQRUVSX0FUSCA9IDUsCisJUEVFUl9DSVNDTyA9IDYsCisJUEVFUl9NQVJWID0gNywKKwlQRUVSX0FJUkdPID0gOSwKKwlQRUVSX01BWCA9IDEwLAorfSA7CisKKyNkZWZpbmUgUlRMX0RVTU1ZX09GRlNFVAkwCisjZGVmaW5lIFJUTF9EVU1NWV9VTklUCQk4CisjZGVmaW5lIFJUTF9UWF9EVU1NWV9TSVpFCShSVExfRFVNTVlfT0ZGU0VUICogUlRMX0RVTU1ZX1VOSVQpCisjZGVmaW5lIFJUTF9UWF9ERVNDX1NJWkUJMzIKKyNkZWZpbmUgUlRMX1RYX0hFQURFUl9TSVpFCShSVExfVFhfREVTQ19TSVpFICsgUlRMX1RYX0RVTU1ZX1NJWkUpCisKKyNkZWZpbmUgSFRfQU1TRFVfU0laRV80SyAJMzgzOQorI2RlZmluZSBIVF9BTVNEVV9TSVpFXzhLIAk3OTM1CisKKyNkZWZpbmUgTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1IAkzMDAJLyogTWJwcyAqLworI2RlZmluZSBNQVhfQklUX1JBVEVfNDBNSFpfTUNTNyAJMTUwCS8qIE1icHMgKi8KKworI2RlZmluZSBSVExfUkFURV9DT1VOVF9MRUdBQ1kJCTEyCisjZGVmaW5lIFJUTF9DSEFOTkVMX0NPVU5UCQkxNAorCisjZGVmaW5lIEZSQU1FX09GRlNFVF9GUkFNRV9DT05UUk9MCTAKKyNkZWZpbmUgRlJBTUVfT0ZGU0VUX0RVUkFUSU9OCQkyCisjZGVmaW5lIEZSQU1FX09GRlNFVF9BRERSRVNTMQkJNAorI2RlZmluZSBGUkFNRV9PRkZTRVRfQUREUkVTUzIJCTEwCisjZGVmaW5lIEZSQU1FX09GRlNFVF9BRERSRVNTMwkJMTYKKyNkZWZpbmUgRlJBTUVfT0ZGU0VUX1NFUVVFTkNFCQkyMgorI2RlZmluZSBGUkFNRV9PRkZTRVRfQUREUkVTUzQJCTI0CisKKyNkZWZpbmUgU0VUXzgwMjExX0hEUl9GUkFNRV9DT05UUk9MKF9oZHIsIF92YWwpCQlcCisJV1JJVEVFRjJCWVRFKF9oZHIsIF92YWwpCisjZGVmaW5lIFNFVF84MDIxMV9IRFJfVFlQRV9BTkRfU1VCVFlQRShfaGRyLCBfdmFsKQlcCisJV1JJVEVFRjFCWVRFKF9oZHIsIF92YWwpCisjZGVmaW5lIFNFVF84MDIxMV9IRFJfUFdSX01HTlQoX2hkciwgX3ZhbCkJCVwKKwlTRVRfQklUU19UT19MRV8yQllURShfaGRyLCAxMiwgMSwgX3ZhbCkKKyNkZWZpbmUgU0VUXzgwMjExX0hEUl9UT19EUyhfaGRyLCBfdmFsKQkJCVwKKwlTRVRfQklUU19UT19MRV8yQllURShfaGRyLCA4LCAxLCBfdmFsKQorCisjZGVmaW5lIFNFVF84MDIxMV9QU19QT0xMX0FJRChfaGRyLCBfdmFsKQkJXAorCVdSSVRFRUYyQllURSgoKHU4KikoX2hkcikpKzIsIF92YWwpCisjZGVmaW5lIFNFVF84MDIxMV9QU19QT0xMX0JTU0lEKF9oZHIsIF92YWwpCQlcCisJQ1BfTUFDQUREUigoKHU4KikoX2hkcikpKzQsICh1OCopKF92YWwpKQorI2RlZmluZSBTRVRfODAyMTFfUFNfUE9MTF9UQShfaGRyLCBfdmFsKQkJXAorCUNQX01BQ0FERFIoKCh1OCopKF9oZHIpKSsxMCwgKHU4KikoX3ZhbCkpCisKKyNkZWZpbmUgU0VUXzgwMjExX0hEUl9EVVJBVElPTihfaGRyLCBfdmFsKQlcCisJV1JJVEVFRjJCWVRFKCh1OCopKF9oZHIpK0ZSQU1FX09GRlNFVF9EVVJBVElPTiwgX3ZhbCkKKyNkZWZpbmUgU0VUXzgwMjExX0hEUl9BRERSRVNTMShfaGRyLCBfdmFsKQlcCisJQ1BfTUFDQUREUigodTgqKShfaGRyKStGUkFNRV9PRkZTRVRfQUREUkVTUzEsICh1OCopKF92YWwpKQorI2RlZmluZSBTRVRfODAyMTFfSERSX0FERFJFU1MyKF9oZHIsIF92YWwpIAlcCisJQ1BfTUFDQUREUigodTgqKShfaGRyKStGUkFNRV9PRkZTRVRfQUREUkVTUzIsICh1OCopKF92YWwpKQorI2RlZmluZSBTRVRfODAyMTFfSERSX0FERFJFU1MzKF9oZHIsIF92YWwpIAlcCisJQ1BfTUFDQUREUigodTgqKShfaGRyKStGUkFNRV9PRkZTRVRfQUREUkVTUzMsICh1OCopKF92YWwpKQorI2RlZmluZSBTRVRfODAyMTFfSERSX0ZSQUdNRU5UX1NFUVVFTkNFKF9oZHIsIF92YWwpICBcCisJV1JJVEVFRjJCWVRFKCh1OCopKF9oZHIpK0ZSQU1FX09GRlNFVF9TRVFVRU5DRSwgX3ZhbCkKKworI2RlZmluZSBTRVRfQkVBQ09OX1BST0JFX1JTUF9USU1FX1NUQU1QX0xPVyhfX3BoZHIsIF9fdmFsKSAJXAorCVdSSVRFRUY0QllURSgoKHU4KikoX19waGRyKSkgKyAyNCwgX192YWwpCisjZGVmaW5lIFNFVF9CRUFDT05fUFJPQkVfUlNQX1RJTUVfU1RBTVBfSElHSChfX3BoZHIsIF9fdmFsKSBcCisJV1JJVEVFRjRCWVRFKCgodTgqKShfX3BoZHIpKSArIDI4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0JFQUNPTl9QUk9CRV9SU1BfQkVBQ09OX0lOVEVSVkFMKF9fcGhkciwgX192YWwpIFwKKwlXUklURUVGMkJZVEUoKCh1OCopKF9fcGhkcikpICsgMzIsIF9fdmFsKQorI2RlZmluZSBHRVRfQkVBQ09OX1BST0JFX1JTUF9DQVBBQklMSVRZX0lORk8oX19waGRyKSAJCVwKKwlSRUFERUYyQllURSgoKHU4KikoX19waGRyKSkgKyAzNCkKKyNkZWZpbmUgU0VUX0JFQUNPTl9QUk9CRV9SU1BfQ0FQQUJJTElUWV9JTkZPKF9fcGhkciwgX192YWwpIFwKKwlXUklURUVGMkJZVEUoKCh1OCopKF9fcGhkcikpICsgMzQsIF9fdmFsKQorI2RlZmluZSBNQVNLX0JFQUNPTl9QUk9CRV9SU1BfQ0FQQUJJTElUWV9JTkZPKF9fcGhkciwgX192YWwpIFwKKwlTRVRfQkVBQ09OX1BST0JFX1JTUF9DQVBBQklMSVRZX0lORk8oX19waGRyLCBcCisJKEdFVF9CRUFDT05fUFJPQkVfUlNQX0NBUEFCSUxJVFlfSU5GTyhfX3BoZHIpICYgKH4oX192YWwpKSkpCisKK2ludCBydGxfaW5pdF9jb3JlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2RlaW5pdF9jb3JlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2luaXRfcmZraWxsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2RlaW5pdF9yZmtpbGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCit2b2lkIHJ0bF93YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgcnRsX2RlaW5pdF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworYm9vbCBydGxfYWN0aW9uX3Byb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IsIHU4IGlzX3R4KTsKK2Jvb2wgcnRsX3R4X21nbXRfcHJvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit1OCBydGxfaXNfc3BlY2lhbF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBpc190eCk7CisKK3ZvaWQgcnRsX2JlYWNvbl9zdGF0aXN0aWMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBydGxfd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitpbnQgcnRsX3R4X2FnZ19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKiBzc24pOworaW50IHJ0bF90eF9hZ2dfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKTsKK2ludCBydGxfdHhfYWdnX29wZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKTsKK2ludCBydGxfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOworaW50IHJ0bF9yeF9hZ2dfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwordm9pZCBydGxfd2F0Y2hkb2dfd3FfY2FsbGJhY2sodm9pZCAqZGF0YSk7Cit2b2lkIHJ0bF9md2V2dF93cV9jYWxsYmFjayh2b2lkICpkYXRhKTsKKwordm9pZCBydGxfZ2V0X3RjYl9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjKTsKKworaW50IHJ0bF9zZW5kX3NtcHNfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQllbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wcyk7Cit1OCAqcnRsX2ZpbmRfaWUodTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHU4IGllKTsKK3ZvaWQgcnRsX3JlY29nbml6ZV9wZWVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7Cit1OCBydGxfdGlkX3RvX2FjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0aWQpOworZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcnRsX2F0dHJpYnV0ZV9ncm91cDsKK3ZvaWQgcnRsX2Vhc3lfY29uY3VycmVudF9yZXRyeXRpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gc3RydWN0IHJ0bF9nbG9iYWxfdmFyIGdsb2JhbF92YXI7CisKKyNpZmRlZiBWSUZfVE9ETworc3RydWN0IGllZWU4MDIxMV92aWYgKnJ0bF9nZXRfbWFpbl92aWYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworYm9vbCBydGxfc2V0X3ZpZl9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9IYWxCdGM4ODEyYTFBbnQuYwpAQCAtMCwwICsxLDM5NzYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIGZpbGUgaXMgZm9yIDg4MTJhMWFudCBDby1leGlzdCBtZWNoYW5pc20KKy8vCisvLyBIaXN0b3J5CisvLyAyMDEyLzExLzE1IENvc2EgZmlyc3QgY2hlY2sgaW4uCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGluY2x1ZGUgZmlsZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSAiaGFsYnRfcHJlY29tcC5oIgorI2lmIDEKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHbG9iYWwgdmFyaWFibGVzLCB0aGVzZSBhcmUgc3RhdGljIHZhcmlhYmxlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBDT0VYX0RNXzg4MTJBXzFBTlQJCUdMQ29leERtODgxMmExQW50Oworc3RhdGljIFBDT0VYX0RNXzg4MTJBXzFBTlQgCWNvZXhfZG09JkdMQ29leERtODgxMmExQW50Oworc3RhdGljIENPRVhfU1RBXzg4MTJBXzFBTlQJCUdMQ29leFN0YTg4MTJhMUFudDsKK3N0YXRpYyBQQ09FWF9TVEFfODgxMkFfMUFOVAljb2V4X3N0YT0mR0xDb2V4U3RhODgxMmExQW50OworCitjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzg4MTJhMUFudFtdPXsKKwkiQlQgSW5mb1t3aWZpIGZ3XSIsCisJIkJUIEluZm9bYnQgcnNwXSIsCisJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0Yzg4MTJhMWFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgMAordm9pZAoraGFsYnRjODgxMmExYW50X1JlZzB4NTUwQml0MygKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWJTZXQKKwkpCit7CisJdTFCeXRlCXUxdG1wPTA7CisJCisJdTF0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg1NTApOworCWlmKGJTZXQpCisJeworCQl1MXRtcCB8PSBCSVQzOworCX0KKwllbHNlCisJeworCQl1MXRtcCAmPSB+QklUMzsKKwl9CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDU1MCwgdTF0bXApOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgc2V0IDB4NTUwWzNdPSVkXG4iLCAoYlNldD8gMTowKSkpOworfQorI2VuZGlmCit1MUJ5dGUKK2hhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgKKwl1MUJ5dGUJCQlsZXZlbF9udW0sCisJdTFCeXRlCQkJcnNzaV90aHJlc2gsCisJdTFCeXRlCQkJcnNzaV90aHJlc2gxCisJKQoreworCXM0Qnl0ZQkJCWJ0X3Jzc2k9MDsKKwl1MUJ5dGUJCQlidF9yc3NpX3N0YXRlOworCisJYnRfcnNzaSA9IGNvZXhfc3RhLT5idF9yc3NpOworCisJaWYobGV2ZWxfbnVtID09IDIpCisJewkJCQorCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQorCQkJeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidF9yc3NpIDwgcnNzaV90aHJlc2gpCisJCQl7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKGxldmVsX251bSA9PSAzKQorCXsKKwkJaWYocnNzaV90aHJlc2ggPiByc3NpX3RocmVzaDEpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHRocmVzaCBlcnJvciEhXG4iKSk7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCQl9CisJCQorCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQorCQkJeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCisJCXsKKwkJCWlmKGJ0X3Jzc2kgPj0gKHJzc2lfdGhyZXNoMStCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODgxMkFfMUFOVCkpCisJCQl7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKKwkJCX0KKwkJCWVsc2UgaWYoYnRfcnNzaSA8IHJzc2lfdGhyZXNoKQorCQkJeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoYnRfcnNzaSA8IHJzc2lfdGhyZXNoMSkKKwkJCXsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOworCQkJfQorCQl9CisJfQorCQkKKwljb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPSBidF9yc3NpX3N0YXRlOworCisJcmV0dXJuIGJ0X3Jzc2lfc3RhdGU7Cit9CisKK3UxQnl0ZQoraGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCXUxQnl0ZQkJCWluZGV4LAorCSAJdTFCeXRlCQkJbGV2ZWxfbnVtLAorCSAJdTFCeXRlCQkJcnNzaV90aHJlc2gsCisJIAl1MUJ5dGUJCQlyc3NpX3RocmVzaDEKKwkpCit7CisJczRCeXRlCQkJd2lmaV9yc3NpPTA7CisJdTFCeXRlCQkJd2lmaV9yc3NpX3N0YXRlOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpX3Jzc2kpOworCQorCWlmKGxldmVsX251bSA9PSAyKQorCXsKKwkJaWYoIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkJKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCisJCXsKKwkJCWlmKHdpZmlfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZih3aWZpX3Jzc2kgPCByc3NpX3RocmVzaCkKKwkJCXsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYobGV2ZWxfbnVtID09IDMpCisJeworCQlpZihyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHRocmVzaCBlcnJvciEhXG4iKSk7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOworCQl9CisJCQorCQlpZiggKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYod2lmaV9yc3NpID49IChyc3NpX3RocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODgxMkFfMUFOVCkpCisJCQl7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKKwkJeworCQkJaWYod2lmaV9yc3NpID49IChyc3NpX3RocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlIGlmKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoKQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYod2lmaV9yc3NpIDwgcnNzaV90aHJlc2gxKQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisJCQorCWNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9IHdpZmlfcnNzaV9zdGF0ZTsKKworCXJldHVybiB3aWZpX3Jzc2lfc3RhdGU7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAorCSAgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXN0YXRpYyBCT09MRUFOCXByZV9idF9kaXNhYmxlZD1mYWxzZTsKKwlzdGF0aWMgdTRCeXRlCQlidF9kaXNhYmxlX2NudD0wOworCUJPT0xFQU4JCQlidF9hY3RpdmU9dHJ1ZSwgYnRfZGlzYWJsZV9ieTY4PWZhbHNlLCBidF9kaXNhYmxlZD1mYWxzZTsKKwl1NEJ5dGUJCQl1NF90bXA9MDsKKworCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKKworCWlmKAljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCA9PSAwICYmCisJCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID09IDAgJiYKKwkJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAwICYmCisJCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfcnggPT0gMCkKKwl7CisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCX0KKwlpZigJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMHhmZmZmICYmCisJCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID09IDB4ZmZmZiAmJgorCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4ID09IDB4ZmZmZiAmJgorCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDB4ZmZmZikKKwl7CisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCX0KKwlpZihidF9hY3RpdmUpCisJeworCQlidF9kaXNhYmxlX2NudCA9IDA7CisJCWJ0X2Rpc2FibGVkID0gZmFsc2U7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJ0X2Rpc2FibGVkKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJYnRfZGlzYWJsZV9jbnQrKzsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKKwkJCQlidF9kaXNhYmxlX2NudCkpOworCQlpZihidF9kaXNhYmxlX2NudCA+PSAyIHx8YnRfZGlzYWJsZV9ieTY4KQorCQl7CisJCQlidF9kaXNhYmxlZCA9IHRydWU7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZidF9kaXNhYmxlZCk7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWQgISFcbiIpKTsKKwkJfQorCX0KKwlpZihwcmVfYnRfZGlzYWJsZWQgIT0gYnRfZGlzYWJsZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLCAKKwkJCShwcmVfYnRfZGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksIAorCQkJKGJ0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CisJCXByZV9idF9kaXNhYmxlZCA9IGJ0X2Rpc2FibGVkOworCQlpZighYnRfZGlzYWJsZWQpCisJCXsKKwkJfQorCQllbHNlCisJCXsKKwkJfQorCX0KK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X01vbml0b3JCdEN0cigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXU0Qnl0ZSAJCQlyZWdfaHBfdHhfcngsIHJlZ19scF90eF9yeCwgdTRfdG1wOworCXU0Qnl0ZQkJCXJlZ19ocF90eD0wLCByZWdfaHBfcng9MCwgcmVnX2xwX3R4PTAsIHJlZ19scF9yeD0wOworCXUxQnl0ZQkJCXUxX3RtcDsKKwkKKwlyZWdfaHBfdHhfcnggPSAweDc3MDsKKwlyZWdfbHBfdHhfcnggPSAweDc3NDsKKworCXU0X3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfaHBfdHhfcngpOworCXJlZ19ocF90eCA9IHU0X3RtcCAmIGJNYXNrTFdvcmQ7CisJcmVnX2hwX3J4ID0gKHU0X3RtcCAmIGJNYXNrSFdvcmQpPj4xNjsKKworCXU0X3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfbHBfdHhfcngpOworCXJlZ19scF90eCA9IHU0X3RtcCAmIGJNYXNrTFdvcmQ7CisJcmVnX2xwX3J4ID0gKHU0X3RtcCAmIGJNYXNrSFdvcmQpPj4xNjsKKwkJCisJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPSByZWdfaHBfdHg7CisJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfcnggPSByZWdfaHBfcng7CisJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9IHJlZ19scF90eDsKKwljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID0gcmVnX2xwX3J4OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEhpZ2ggUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0leCglZCkvJXgoJWQpXG4iLCAKKwkJcmVnX2hwX3R4X3J4LCByZWdfaHBfdHgsIHJlZ19ocF90eCwgcmVnX2hwX3J4LCByZWdfaHBfcngpKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgTG93IFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9JXgoJWQpLyV4KCVkKVxuIiwgCisJCXJlZ19scF90eF9yeCwgcmVnX2xwX3R4LCByZWdfbHBfdHgsIHJlZ19scF9yeCwgcmVnX2xwX3J4KSk7CisKKwkvLyByZXNldCBjb3VudGVyCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHhjKTsKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X1F1ZXJ5QnRJbmZvKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CQorCXUxQnl0ZQlkYXRhTGVuPTM7CisJdTFCeXRlCWJ1Zls1XSA9IHswfTsKKwlzdGF0aWMJdTRCeXRlCWJ0SW5mb0NudD0wOworCisJaWYoIWJ0SW5mb0NudCB8fAorCQkoY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtCVF9JTkZPX1NSQ184ODEyQV8xQU5UX0JUX1JTUF0tYnRJbmZvQ250KT4yKQorCXsKKwkJYnVmWzBdID0gZGF0YUxlbjsKKwkJYnVmWzFdID0gMHgxOwkvLyBwb2xsaW5nIGVuYWJsZSwgMT1lbmFibGUsIDA9ZGlzYWJsZQorCQlidWZbMl0gPSAweDI7CS8vIHBvbGxpbmcgdGltZSBpbiBzZWNvbmRzCisJCWJ1ZlszXSA9IDB4MTsJLy8gYXV0byByZXBvcnQgZW5hYmxlLCAxPWVuYWJsZSwgMD1kaXNhYmxlCisJCQkKKwkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9JTkZPLCAoUFZPSUQpJmJ1ZlswXSk7CisJfQorCWJ0SW5mb0NudCA9IGNvZXhfc3RhLT5idF9pbmZvX2MyaF9jbnRbQlRfSU5GT19TUkNfODgxMkFfMUFOVF9CVF9SU1BdOworfQordTFCeXRlCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uQWxnb3JpdGhtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJQk9PTEVBTgkJCQlidF9oc19vbj1mYWxzZTsKKwl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKKwl1MUJ5dGUJCQkJbnVtX29mX2RpZmZfcHJvZmlsZT0wOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CisJCisJaWYoIXN0YWNrX2luZm8tPmJ0X2xpbmtfZXhpc3QpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIE5vIHByb2ZpbGUgZXhpc3RzISEhXG4iKSk7CisJCXJldHVybiBhbGdvcml0aG07CisJfQorCisJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQorCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CisJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQorCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CisJaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQorCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CisJaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKKwkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOworCQorCWlmKG51bV9vZl9kaWZmX3Byb2ZpbGUgPT0gMSkKKwl7CisJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gb25seVxuIikpOworCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEIG9ubHlcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9CisJCQllbHNlIGlmKHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQIG9ubHlcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19BMkRQOworCQkJfQorCQkJZWxzZSBpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCisJCQl7CisJCQkJaWYoYnRfaHNfb24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihIUykgb25seVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5IUzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oRURSKSBvbmx5XG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1fb2ZfZGlmZl9wcm9maWxlID09IDIpCisJeworCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCisJCXsKKwkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRFxuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRDsKKwkJCX0KKwkJCWVsc2UgaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgPT0+IFNDT1xuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzsKKwkJCX0KKwkJCWVsc2UgaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQorCQkJeworCQkJCWlmKGJ0X2hzX29uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oRURSKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5hMmRwX2V4aXN0ICkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKKwkJCX0KKwkJCWVsc2UgaWYoIHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJgorCQkJCXN0YWNrX2luZm8tPnBhbl9leGlzdCApCisJCQl7CisJCQkJaWYoYnRfaHNfb24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgUEFOKEVEUilcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKCBzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5hMmRwX2V4aXN0ICkKKwkJCXsKKwkJCQlpZihidF9oc19vbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEVEUilcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UgaWYobnVtX29mX2RpZmZfcHJvZmlsZSA9PSAzKQorCXsKKwkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQorCQl7CisJCQlpZiggc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9CisJCQllbHNlIGlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgKQorCQkJeworCQkJCWlmKGJ0X2hzX29uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggc3RhY2tfaW5mby0+cGFuX2V4aXN0ICYmCisJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCisJCQl7CisJCQkJaWYoYnRfaHNfb24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQICsgUEFOKEVEUikgPT0+IEhJRFxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5hMmRwX2V4aXN0ICkKKwkJCXsKKwkJCQlpZihidF9oc19vbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1fb2ZfZGlmZl9wcm9maWxlID49IDMpCisJeworCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCisJCXsKKwkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCQlzdGFja19pbmZvLT5hMmRwX2V4aXN0ICkKKwkJCXsKKwkJCQlpZihidF9oc19vbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKKworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oRURSKT09PlBBTihFRFIpK0hJRFxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBhbGdvcml0aG07Cit9CisKK0JPT0xFQU4KK2hhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCUJPT0xFQU4JCXJldD1mYWxzZTsKKwlCT09MRUFOCQlidF9oc19vbj1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CisJczRCeXRlCQlidF9oc19yc3NpPTA7CisKKwlpZighYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbikpCisJCXJldHVybiBmYWxzZTsKKwlpZighYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmKCFidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1M0X0hTX1JTU0ksICZidF9oc19yc3NpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYod2lmaV9jb25uZWN0ZWQpCisJeworCQlpZihidF9oc19vbikKKwkJeworCQkJaWYoYnRfaHNfcnNzaSA+IDM3KQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgSFMgbW9kZSEhXG4iKSk7CisJCQkJcmV0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgV2lmaSBpcyBjb25uZWN0ZWQhIVxuIikpOworCQkJcmV0ID0gdHJ1ZTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0RndEYWNTd2luZ0xldmVsKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAl1MUJ5dGUJCQlkYWNfc3dpbmdfbHZsCisJKQoreworCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKworCS8vIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKKwkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKKwloMmNfcGFyYW1ldGVyWzBdID0gZGFjX3N3aW5nX2x2bDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBTZXQgRGFjIFN3aW5nIExldmVsPTB4JXhcbiIsIGRhY19zd2luZ19sdmwpKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2ND0weCV4XG4iLCBoMmNfcGFyYW1ldGVyWzBdKSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjQsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0RndEZWNCdFB3cigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWRlY19idF9wd3IKKwkpCit7CisJdTFCeXRlCWRhdGFMZW49MzsKKwl1MUJ5dGUJYnVmWzVdID0gezB9OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXNcbiIsIAorCQkJKGRlY19idF9wd3I/ICJZZXMhISI6Ik5vISEiKSkpOworCisJYnVmWzBdID0gZGF0YUxlbjsKKwlidWZbMV0gPSAweDM7CQkvLyBPUF9Db2RlCisJYnVmWzJdID0gMHgxOwkJLy8gT1BfQ29kZV9MZW5ndGgKKwlpZihkZWNfYnRfcHdyKQorCQlidWZbM10gPSAweDE7CS8vIE9QX0NvZGVfQ29udGVudAorCWVsc2UKKwkJYnVmWzNdID0gMHgwOworCQkKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9DVFJMX0JUX0NPRVgsIChQVk9JRCkmYnVmWzBdKTsJCit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCisJIAlCT09MRUFOCQkJZGVjX2J0X3B3cgorCSkKK3sKKwlyZXR1cm47CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgPSAlc1xuIiwgIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoZGVjX2J0X3B3cik/ICJPTiI6Ik9GRiIpKSk7CisJY29leF9kbS0+Y3VyX2RlY19idF9wd3IgPSBkZWNfYnRfcHdyOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfZGVjX2J0X3B3cj0lZCwgY3VyX2RlY19idF9wd3I9JWRcbiIsIAorCQkJY29leF9kbS0+cHJlX2RlY19idF9wd3IsIGNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyKSk7CisKKwkJaWYoY29leF9kbS0+cHJlX2RlY19idF9wd3IgPT0gY29leF9kbS0+Y3VyX2RlY19idF9wd3IpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0RndEZWNCdFB3cihidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyKTsKKworCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyID0gY29leF9kbS0+Y3VyX2RlY19idF9wd3I7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRGd0J0TG5hQ29uc3RyYWluKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KKwkpCit7CisJdTFCeXRlCWRhdGFMZW49MzsKKwl1MUJ5dGUJYnVmWzVdID0gezB9OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBCVCBMTkEgQ29uc3RyYWluOiAlc1xuIiwgCisJCShidF9sbmFfY29uc19vbj8gIk9OISEiOiJPRkYhISIpKSk7CisKKwlidWZbMF0gPSBkYXRhTGVuOworCWJ1ZlsxXSA9IDB4MjsJCS8vIE9QX0NvZGUKKwlidWZbMl0gPSAweDE7CQkvLyBPUF9Db2RlX0xlbmd0aAorCWlmKGJ0X2xuYV9jb25zX29uKQorCQlidWZbM10gPSAweDE7CS8vIE9QX0NvZGVfQ29udGVudAorCWVsc2UKKwkJYnVmWzNdID0gMHgwOworCQkKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9DVFJMX0JUX0NPRVgsIChQVk9JRCkmYnVmWzBdKTsJCit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRCdExuYUNvbnN0cmFpbigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCisJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBCVCBDb25zdHJhaW4gPSAlc1xuIiwgIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIjoiIiksICgoYnRfbG5hX2NvbnNfb24pPyAiT04iOiJPRkYiKSkpOworCWNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbiA9IGJ0X2xuYV9jb25zX29uOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRMbmFDb25zdHJhaW49JWQsIGJDdXJCdExuYUNvbnN0cmFpbj0lZFxuIiwgCisJCQljb2V4X2RtLT5iUHJlQnRMbmFDb25zdHJhaW4sIGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbikpOworCisJCWlmKGNvZXhfZG0tPmJQcmVCdExuYUNvbnN0cmFpbiA9PSBjb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4pIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0RndCdExuYUNvbnN0cmFpbihidGNvZXhpc3QsIGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbik7CisKKwljb2V4X2RtLT5iUHJlQnRMbmFDb25zdHJhaW4gPSBjb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW47Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRGd0J0UHNkTW9kZSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJYnRfcHNkX21vZGUKKwkpCit7CisJdTFCeXRlCWRhdGFMZW49MzsKKwl1MUJ5dGUJYnVmWzVdID0gezB9OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBCVCBQU0QgbW9kZT0weCV4XG4iLCAKKwkJYnRfcHNkX21vZGUpKTsKKworCWJ1ZlswXSA9IGRhdGFMZW47CisJYnVmWzFdID0gMHg0OwkJCS8vIE9QX0NvZGUKKwlidWZbMl0gPSAweDE7CQkJLy8gT1BfQ29kZV9MZW5ndGgKKwlidWZbM10gPSBidF9wc2RfbW9kZTsJLy8gT1BfQ29kZV9Db250ZW50CisJCQorCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0NUUkxfQlRfQ09FWCwgKFBWT0lEKSZidWZbMF0pOwkKK30KKworCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0QnRQc2RNb2RlKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKKwkgCXUxQnl0ZQkJCWJ0X3BzZF9tb2RlCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgUFNEIG1vZGUgPSAweCV4XG4iLCAgCisJCShmb3JjZV9leGVjPyAiZm9yY2UiOiIiKSwgYnRfcHNkX21vZGUpKTsKKwljb2V4X2RtLT5iQ3VyQnRQc2RNb2RlID0gYnRfcHNkX21vZGU7CisKKwlpZighZm9yY2VfZXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVCdFBzZE1vZGU9MHgleCwgYkN1ckJ0UHNkTW9kZT0weCV4XG4iLCAKKwkJCWNvZXhfZG0tPmJQcmVCdFBzZE1vZGUsIGNvZXhfZG0tPmJDdXJCdFBzZE1vZGUpKTsKKworCQlpZihjb2V4X2RtLT5iUHJlQnRQc2RNb2RlID09IGNvZXhfZG0tPmJDdXJCdFBzZE1vZGUpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0RndCdFBzZE1vZGUoYnRjb2V4aXN0LCBjb2V4X2RtLT5iQ3VyQnRQc2RNb2RlKTsKKworCWNvZXhfZG0tPmJQcmVCdFBzZE1vZGUgPSBjb2V4X2RtLT5iQ3VyQnRQc2RNb2RlOworfQorCisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRCdEF1dG9SZXBvcnQoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQllbmFibGVfYXV0b19yZXBvcnQKKwkpCit7CisjaWYgMAorCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKwkKKwloMmNfcGFyYW1ldGVyWzBdID0gMDsKKworCWlmKGVuYWJsZV9hdXRvX3JlcG9ydCkKKwl7CisJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUMDsKKwl9CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgQlQgRlcgYXV0byByZXBvcnQgOiAlcywgRlcgd3JpdGUgMHg2OD0weCV4XG4iLCAKKwkJKGVuYWJsZV9hdXRvX3JlcG9ydD8gIkVuYWJsZWQhISI6IkRpc2FibGVkISEiKSwgaDJjX3BhcmFtZXRlclswXSkpOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY4LCAxLCBoMmNfcGFyYW1ldGVyKTsJCisjZWxzZQorCisjZW5kaWYKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0J0QXV0b1JlcG9ydCgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCisJIAlCT09MRUFOCQkJZW5hYmxlX2F1dG9fcmVwb3J0CisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgQXV0byByZXBvcnQgPSAlc1xuIiwgIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoZW5hYmxlX2F1dG9fcmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKSk7CisJY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0ID0gZW5hYmxlX2F1dG9fcmVwb3J0OworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfYnRfYXV0b19yZXBvcnQ9JWQsIGN1cl9idF9hdXRvX3JlcG9ydD0lZFxuIiwgCisJCQljb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQsIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCkpOworCisJCWlmKGNvZXhfZG0tPnByZV9idF9hdXRvX3JlcG9ydCA9PSBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0QnRBdXRvUmVwb3J0KGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0KTsKKworCWNvZXhfZG0tPnByZV9idF9hdXRvX3JlcG9ydCA9IGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydDsKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAorCSAJdTFCeXRlCQkJZndfZGFjX3N3aW5nX2x2bAorCSkKK3sKKwlyZXR1cm47CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsICAKKwkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd19kYWNfc3dpbmdfbHZsKSk7CisJY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwgPSBmd19kYWNfc3dpbmdfbHZsOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfZndfZGFjX3N3aW5nX2x2bD0lZCwgY3VyX2Z3X2RhY19zd2luZ19sdmw9JWRcbiIsIAorCQkJY29leF9kbS0+cHJlX2Z3X2RhY19zd2luZ19sdmwsIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKSk7CisKKwkJaWYoY29leF9kbS0+cHJlX2Z3X2RhY19zd2luZ19sdmwgPT0gY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpIAorCQkJcmV0dXJuOworCX0KKworCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RhY1N3aW5nTGV2ZWwoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bCk7CisKKwljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJcnhfcmZfc2hyaW5rX29uCisJKQoreworCWlmKHJ4X3JmX3Nocmlua19vbikKKwl7CisJCS8vU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCAweGYwZmY3KTsKKwl9CisJZWxzZQorCXsKKwkJLy9SZXN1bWUgUkYgUnggTFBGIGNvcm5lcgorCQkvLyBBZnRlciBpbml0aWFsaXplZCwgd2UgY2FuIHVzZSBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwCisJCWlmKGJ0Y29leGlzdC0+YkluaXRpbGl6ZWQpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIGNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXApOworCQl9CisJfQorfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfUmZTaHJpbmsoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAorCSAJQk9PTEVBTgkJCXJ4X3JmX3Nocmlua19vbgorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gUnggUkYgU2hyaW5rID0gJXNcbiIsICAKKwkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKHJ4X3JmX3Nocmlua19vbik/ICJPTiI6Ik9GRiIpKSk7CisJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmsgPSByeF9yZl9zaHJpbmtfb247CisKKwlpZighZm9yY2VfZXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9yZl9yeF9scGZfc2hyaW5rPSVkLCBjdXJfcmZfcnhfbHBmX3Nocmluaz0lZFxuIiwgCisJCQljb2V4X2RtLT5wcmVfcmZfcnhfbHBmX3NocmluaywgY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmspKTsKKworCQlpZihjb2V4X2RtLT5wcmVfcmZfcnhfbHBmX3NocmluayA9PSBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluaykgCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg4MTJhMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3Nocmluayk7CisKKwljb2V4X2RtLT5wcmVfcmZfcnhfbHBmX3NocmluayA9IGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlsb3dfcGVuYWx0eV9yYQorCSkKK3sKKwl1MUJ5dGUJdTFfdG1wOworCisJdTFfdG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NGZkKTsKKwl1MV90bXAgfD0gQklUMDsKKwlpZihsb3dfcGVuYWx0eV9yYSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBUeCByYXRlIGFkYXB0aXZlLCBzZXQgbG93IHBlbmFsdHkhIVxuIikpOworCQl1MV90bXAgJj0gfkJJVDI7CisJfQorCWVsc2UKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBUeCByYXRlIGFkYXB0aXZlLCBzZXQgbm9ybWFsISFcbiIpKTsKKwkJdTFfdG1wIHw9IEJJVDI7CisJfQorCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmZCwgdTFfdG1wKTsKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCisJIAlCT09MRUFOCQkJbG93X3BlbmFsdHlfcmEKKwkpCit7CisJcmV0dXJuOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBMb3dQZW5hbHR5UkEgPSAlc1xuIiwgIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgobG93X3BlbmFsdHlfcmEpPyAiT04iOiJPRkYiKSkpOworCWNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSA9IGxvd19wZW5hbHR5X3JhOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfbG93X3BlbmFsdHlfcmE9JWQsIGN1cl9sb3dfcGVuYWx0eV9yYT0lZFxuIiwgCisJCQljb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEsIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSkpOworCisJCWlmKGNvZXhfZG0tPnByZV9sb3dfcGVuYWx0eV9yYSA9PSBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmEpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmEpOworCisJY29leF9kbS0+cHJlX2xvd19wZW5hbHR5X3JhID0gY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0RGFjU3dpbmdSZWcoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCXU0Qnl0ZQkJCWxldmVsCisJKQoreworCXUxQnl0ZQl2YWw9KHUxQnl0ZSlsZXZlbDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBXcml0ZSBTd0RhY1N3aW5nID0gMHgleFxuIiwgbGV2ZWwpKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHhjNWIsIDB4M2UsIHZhbCk7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlzd19kYWNfc3dpbmdfb24sCisJIAl1NEJ5dGUJCQlzd19kYWNfc3dpbmdfbHZsCisJKQoreworCWlmKHN3X2RhY19zd2luZ19vbikKKwl7CisJCWhhbGJ0Yzg4MTJhMWFudF9TZXREYWNTd2luZ1JlZyhidGNvZXhpc3QsIHN3X2RhY19zd2luZ19sdmwpOworCX0KKwllbHNlCisJeworCQloYWxidGM4ODEyYTFhbnRfU2V0RGFjU3dpbmdSZWcoYnRjb2V4aXN0LCAweDE4KTsKKwl9Cit9CisKKwordm9pZAoraGFsYnRjODgxMmExYW50X0RhY1N3aW5nKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKKwkgCUJPT0xFQU4JCQlkYWNfc3dpbmdfb24sCisJIAl1NEJ5dGUJCQlkYWNfc3dpbmdfbHZsCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nX2x2bD0weCV4XG4iLCAgCisJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChkYWNfc3dpbmdfb24pPyAiT04iOiJPRkYiKSwgZGFjX3N3aW5nX2x2bCkpOworCWNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24gPSBkYWNfc3dpbmdfb247CisJY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwgPSBkYWNfc3dpbmdfbHZsOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfZGFjX3N3aW5nX29uPSVkLCBwcmVfZGFjX3N3aW5nX2x2bD0weCV4LCBjdXJfZGFjX3N3aW5nX29uPSVkLCBjdXJfZGFjX3N3aW5nX2x2bD0weCV4XG4iLCAKKwkJCWNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24sIGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfbHZsLAorCQkJY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbiwgY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwpKTsKKworCQlpZiggKGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24gPT0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbikgJiYKKwkJCShjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9PSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCkgKQorCQkJcmV0dXJuOworCX0KKwlkZWxheV9tcygzMCk7CisJaGFsYnRjODgxMmExYW50X1NldFN3RnVsbFRpbWVEYWNTd2luZyhidGNvZXhpc3QsIGRhY19zd2luZ19vbiwgZGFjX3N3aW5nX2x2bCk7CisKKwljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbjsKKwljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0QWRjQmFja09mZigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWFkY19iYWNrX29mZgorCSkKK3sKKwlpZihhZGNfYmFja19vZmYpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPbiFcbiIpKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4OGRiLCAweDYwLCAweDMpOworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPZmYhXG4iKSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BZGNCYWNrT2ZmKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKKwkgCUJPT0xFQU4JCQlhZGNfYmFja19vZmYKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIEFkY0JhY2tPZmYgPSAlc1xuIiwgIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoYWRjX2JhY2tfb2ZmKT8gIk9OIjoiT0ZGIikpKTsKKwljb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmID0gYWRjX2JhY2tfb2ZmOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfYWRjX2JhY2tfb2ZmPSVkLCBjdXJfYWRjX2JhY2tfb2ZmPSVkXG4iLCAKKwkJCWNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpKTsKKworCQlpZihjb2V4X2RtLT5wcmVfYWRjX2JhY2tfb2ZmID09IGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0QWRjQmFja09mZihidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpOworCisJY29leF9kbS0+cHJlX2FkY19iYWNrX29mZiA9IGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmY7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRBZ2NUYWJsZSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWFnY190YWJsZV9lbgorCSkKK3sKKwl1MUJ5dGUJCXJzc2lfYWRqdXN0X3ZhbD0wOworCQorCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwMjAwMCk7CisJaWYoYWdjX3RhYmxlX2VuKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDNmYTU4KTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDM3YTU4KTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDJmYTU4KTsKKwkJcnNzaV9hZGp1c3RfdmFsID0gODsKKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzOTI1OCk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzMTI1OCk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyOTI1OCk7CisJfQorCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwKTsKKworCS8vIHNldCByc3NpX2FkanVzdF92YWwgZm9yIHdpZmkgbW9kdWxlLgorCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpX2FkanVzdF92YWwpOworfQorCisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCisJIAlCT09MRUFOCQkJYWdjX3RhYmxlX2VuCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgJXMgQWdjIFRhYmxlXG4iLCAgCisJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChhZ2NfdGFibGVfZW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CisJY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbiA9IGFnY190YWJsZV9lbjsKKworCWlmKCFmb3JjZV9leGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2FnY190YWJsZV9lbj0lZCwgY3VyX2FnY190YWJsZV9lbj0lZFxuIiwgCisJCQljb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuLCBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKSk7CisKKwkJaWYoY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiA9PSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODgxMmExYW50X1NldEFnY1RhYmxlKGJ0Y29leGlzdCwgYWdjX3RhYmxlX2VuKTsKKworCWNvZXhfZG0tPnByZV9hZ2NfdGFibGVfZW4gPSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0Q29leFRhYmxlKAorCSAJUEJUQ19DT0VYSVNUCWJ0Y29leGlzdCwKKwkgCXU0Qnl0ZQkJdmFsMHg2YzAsCisJIAl1NEJ5dGUJCXZhbDB4NmM0LAorCSAJdTRCeXRlCQl2YWwweDZjOCwKKwkgCXUxQnl0ZQkJdmFsMHg2Y2MKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzA9MHgleFxuIiwgdmFsMHg2YzApKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCB2YWwweDZjMCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjND0weCV4XG4iLCB2YWwweDZjNCkpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQsIHZhbDB4NmM0KTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4PTB4JXhcbiIsIHZhbDB4NmM4KSk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2M9MHgleFxuIiwgdmFsMHg2Y2MpKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAorCSAJdTRCeXRlCQkJdmFsMHg2YzAsCisJIAl1NEJ5dGUJCQl2YWwweDZjNCwKKwkgCXU0Qnl0ZQkJCXZhbDB4NmM4LAorCSAJdTFCeXRlCQkJdmFsMHg2Y2MKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB3cml0ZSBDb2V4IFRhYmxlIDB4NmMwPTB4JXgsIDB4NmM0PTB4JXgsIDB4NmM4PTB4JXgsIDB4NmNjPTB4JXhcbiIsIAorCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIHZhbDB4NmMwLCB2YWwweDZjNCwgdmFsMHg2YzgsIHZhbDB4NmNjKSk7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM0ID0gdmFsMHg2YzQ7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM4ID0gdmFsMHg2Yzg7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CisKKwlpZighZm9yY2VfZXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV92YWwweDZjMD0weCV4LCBwcmVfdmFsMHg2YzQ9MHgleCwgcHJlX3ZhbDB4NmM4PTB4JXgsIHByZV92YWwweDZjYz0weCV4ICEhXG4iLCAKKwkJCWNvZXhfZG0tPnByZV92YWwweDZjMCwgY29leF9kbS0+cHJlX3ZhbDB4NmM0LCBjb2V4X2RtLT5wcmVfdmFsMHg2YzgsIGNvZXhfZG0tPnByZV92YWwweDZjYykpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJfdmFsMHg2YzA9MHgleCwgY3VyX3ZhbDB4NmM0PTB4JXgsIGN1cl92YWwweDZjOD0weCV4LCBjdXJfdmFsMHg2Y2M9MHgleCAhIVxuIiwgCisJCQljb2V4X2RtLT5jdXJfdmFsMHg2YzAsIGNvZXhfZG0tPmN1cl92YWwweDZjNCwgY29leF9kbS0+Y3VyX3ZhbDB4NmM4LCBjb2V4X2RtLT5jdXJfdmFsMHg2Y2MpKTsKKwkKKwkJaWYoIChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgorCQkJKGNvZXhfZG0tPnByZV92YWwweDZjNCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzQpICYmCisJCQkoY29leF9kbS0+cHJlX3ZhbDB4NmM4ID09IGNvZXhfZG0tPmN1cl92YWwweDZjOCkgJiYKKwkJCShjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSApCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg4MTJhMWFudF9TZXRDb2V4VGFibGUoYnRjb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CisKKwljb2V4X2RtLT5wcmVfdmFsMHg2YzAgPSBjb2V4X2RtLT5jdXJfdmFsMHg2YzA7CisJY29leF9kbS0+cHJlX3ZhbDB4NmM0ID0gY29leF9kbS0+Y3VyX3ZhbDB4NmM0OworCWNvZXhfZG0tPnByZV92YWwweDZjOCA9IGNvZXhfZG0tPmN1cl92YWwweDZjODsKKwljb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPSBjb2V4X2RtLT5jdXJfdmFsMHg2Y2M7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQllbmFibGUKKwkpCit7CisJdTFCeXRlCWRhdGFMZW49MzsKKwl1MUJ5dGUJYnVmWzVdID0gezB9OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sICVzIEJUIElnbm9yZSBXbGFuX0FjdFxuIiwKKwkJKGVuYWJsZT8gIkVuYWJsZSI6IkRpc2FibGUiKSkpOworCisJYnVmWzBdID0gZGF0YUxlbjsKKwlidWZbMV0gPSAweDE7CQkJLy8gT1BfQ29kZQorCWJ1ZlsyXSA9IDB4MTsJCQkvLyBPUF9Db2RlX0xlbmd0aAorCWlmKGVuYWJsZSkKKwkJYnVmWzNdID0gMHgxOyAJCS8vIE9QX0NvZGVfQ29udGVudAorCWVsc2UKKwkJYnVmWzNdID0gMHgwOworCQkKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9DVFJMX0JUX0NPRVgsIChQVk9JRCkmYnVmWzBdKTsJCit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9JZ25vcmVXbGFuQWN0KAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKKwkgCUJPT0xFQU4JCQllbmFibGUKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLCAKKwkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoZW5hYmxlPyAiT04iOiJPRkYiKSkpOworCWNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QgPSBlbmFibGU7CisKKwlpZighZm9yY2VfZXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9pZ25vcmVfd2xhbl9hY3QgPSAlZCwgY3VyX2lnbm9yZV93bGFuX2FjdCA9ICVkISFcbiIsIAorCQkJY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCwgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkpOworCisJCWlmKGNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QgPT0gY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODgxMmExYW50X1NldEZ3SWdub3JlV2xhbkFjdChidGNvZXhpc3QsIGVuYWJsZSk7CisKKwljb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0ID0gY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdDsKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAl1MUJ5dGUJCQlieXRlMSwKKwkgCXUxQnl0ZQkJCWJ5dGUyLAorCSAJdTFCeXRlCQkJYnl0ZTMsCisJIAl1MUJ5dGUJCQlieXRlNCwKKwkgCXUxQnl0ZQkJCWJ5dGU1CisJKQoreworCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbNV0gPXswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSBieXRlMTsJCisJaDJjX3BhcmFtZXRlclsxXSA9IGJ5dGUyOwkKKwloMmNfcGFyYW1ldGVyWzJdID0gYnl0ZTM7CisJaDJjX3BhcmFtZXRlclszXSA9IGJ5dGU0OworCWgyY19wYXJhbWV0ZXJbNF0gPSBieXRlNTsKKworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVswXSA9IGJ5dGUxOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsxXSA9IGJ5dGUyOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSA9IGJ5dGUzOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVszXSA9IGJ5dGU0OworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVs0XSA9IGJ5dGU1OworCQorCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDYwKDVieXRlcyk9MHgleCUwOHhcbiIsIAorCQloMmNfcGFyYW1ldGVyWzBdLCAKKwkJaDJjX3BhcmFtZXRlclsxXTw8MjR8aDJjX3BhcmFtZXRlclsyXTw8MTZ8aDJjX3BhcmFtZXRlclszXTw8OHxoMmNfcGFyYW1ldGVyWzRdKSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjAsIDUsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfU2V0THBzUnB3bSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJbHBzX3ZhbCwKKwkgCXUxQnl0ZQkJCXJwd21fdmFsCisJKQoreworCXUxQnl0ZQlscHM9bHBzX3ZhbDsKKwl1MUJ5dGUJcnB3bT1ycHdtX3ZhbDsKKwkKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfTFBTLCAmbHBzKTsKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfUlBXTSwgJnJwd20pOworCQorCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0lOQ19GT1JDRV9FWEVDX1BXUl9DTURfQ05ULCBOVUxMKTsKK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0xwc1Jwd20oCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAorCSAJdTFCeXRlCQkJbHBzX3ZhbCwKKwkgCXUxQnl0ZQkJCXJwd21fdmFsCisJKQoreworCUJPT0xFQU4JYkZvcmNlRXhlY1B3ckNtZD1mYWxzZTsKKwkKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHNldCBscHMvcnB3bT0weCV4LzB4JXggXG4iLCAKKwkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCBscHNfdmFsLCBycHdtX3ZhbCkpOworCWNvZXhfZG0tPmN1cl9scHMgPSBscHNfdmFsOworCWNvZXhfZG0tPmN1cl9ycHdtID0gcnB3bV92YWw7CisKKwlpZighZm9yY2VfZXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9scHMvY3VyX2xwcz0weCV4LzB4JXgsIHByZV9ycHdtL2N1cl9ycHdtPTB4JXgvMHgleCEhXG4iLCAKKwkJCWNvZXhfZG0tPnByZV9scHMsIGNvZXhfZG0tPmN1cl9scHMsIGNvZXhfZG0tPnByZV9ycHdtLCBjb2V4X2RtLT5jdXJfcnB3bSkpOworCisJCWlmKCAoY29leF9kbS0+cHJlX2xwcyA9PSBjb2V4X2RtLT5jdXJfbHBzKSAmJgorCQkJKGNvZXhfZG0tPnByZV9ycHdtID09IGNvZXhfZG0tPmN1cl9ycHdtKSApCisJCXsKKwkJCXJldHVybjsKKwkJfQorCX0KKwloYWxidGM4ODEyYTFhbnRfU2V0THBzUnB3bShidGNvZXhpc3QsIGxwc192YWwsIHJwd21fdmFsKTsKKworCWNvZXhfZG0tPnByZV9scHMgPSBjb2V4X2RtLT5jdXJfbHBzOworCWNvZXhfZG0tPnByZV9ycHdtID0gY29leF9kbS0+Y3VyX3Jwd207Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoCisJIAlQQlRDX0NPRVhJU1QJYnRjb2V4aXN0LAkKKwkgCUJPT0xFQU4JCXNocmlua19yeF9scGYsCisJIAlCT09MRUFOIAlsb3dfcGVuYWx0eV9yYSwKKwkgCUJPT0xFQU4JCWxpbWl0ZWRfZGlnLCAKKwkgCUJPT0xFQU4JCWJ0X2xuYV9jb25zdHJhaW4KKwkpIAoreworCS8vaGFsYnRjODgxMmExYW50X1JmU2hyaW5rKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHNocmlua19yeF9scGYpOworCS8vaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBsb3dfcGVuYWx0eV9yYSk7CisKKwkvL25vIGxpbWl0ZWQgRElHCisJLy9oYWxidGM4ODEyYTFhbnRfU2V0QnRMbmFDb25zdHJhaW4oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgYnRfbG5hX2NvbnN0cmFpbik7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoCisJIAlQQlRDX0NPRVhJU1QJYnRjb2V4aXN0LAkKKwkgCUJPT0xFQU4JCWFnY190YWJsZV9zaGlmdCwKKwkgCUJPT0xFQU4gCWFkY19iYWNrX29mZiwKKwkgCUJPT0xFQU4JCXN3X2RhY19zd2luZywKKwkgCXU0Qnl0ZQkJZGFjX3N3aW5nX2x2bAorCSkKK3sKKwkvL2hhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZ2NfdGFibGVfc2hpZnQpOworCS8vaGFsYnRjODgxMmExYW50X0FkY0JhY2tPZmYoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgYWRjX2JhY2tfb2ZmKTsKKwkvL2hhbGJ0Yzg4MTJhMWFudF9EYWNTd2luZyhidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBzd19kYWNfc3dpbmcsIGRhY19zd2luZ19sdmwpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfUHNUZG1hKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKKwkgCUJPT0xFQU4JCQl0dXJuX29uLAorCSAJdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlCT09MRUFOCQkJYlR1cm5PbkJ5Q250PWZhbHNlOworCXUxQnl0ZQkJCXBzVGRtYVR5cGVCeUNudD0wLCByc3NpX2FkanVzdF92YWw9MDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgdHVybiAlcyBQUyBURE1BLCB0eXBlPSVkXG4iLCAKKwkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAodHVybl9vbj8gIk9OIjoiT0ZGIiksIHR5cGUpKTsKKwljb2V4X2RtLT5jdXJfcHNfdGRtYV9vbiA9IHR1cm5fb247CisJY29leF9kbS0+Y3VyX3BzX3RkbWEgPSB0eXBlOworCisJaWYoIWZvcmNlX2V4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfcHNfdGRtYV9vbiA9ICVkLCBjdXJfcHNfdGRtYV9vbiA9ICVkISFcbiIsIAorCQkJY29leF9kbS0+cHJlX3BzX3RkbWFfb24sIGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKSk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9wc190ZG1hID0gJWQsIGN1cl9wc190ZG1hID0gJWQhIVxuIiwgCisJCQljb2V4X2RtLT5wcmVfcHNfdGRtYSwgY29leF9kbS0+Y3VyX3BzX3RkbWEpKTsKKworCQlpZiggKGNvZXhfZG0tPnByZV9wc190ZG1hX29uID09IGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKSAmJgorCQkJKGNvZXhfZG0tPnByZV9wc190ZG1hID09IGNvZXhfZG0tPmN1cl9wc190ZG1hKSApCisJCQlyZXR1cm47CisJfQorCWlmKHR1cm5fb24pCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQkJZGVmYXVsdDoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4NTgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg0OCk7CisJCQkJcnNzaV9hZGp1c3RfdmFsID0gMTE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHgxMiwgMHgxMiwgMHgwLCAweDQ4KTsKKwkJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4NDApOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxNCwgMHgwKTsKKwkJCQlyc3NpX2FkanVzdF92YWwgPSAxNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDYxLCAweDE1LCAweDMsIDB4MzEsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4MCwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDEzLCAweGMsIDB4NSwgMHgwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgkKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDk6CQorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4YSwgMHhhLCAweDAsIDB4NDgpOworCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDE4OworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoJCisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHhhLCAweGEsIDB4MCwgMHg0MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDExOgkKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDUsIDB4NSwgMHgwLCAweDQ4KTsKKwkJCQlyc3NpX2FkanVzdF92YWwgPSAyMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlYiwgMHhhLCAweDMsIDB4MzEsIDB4MTgpOworCQkJCWJyZWFrOworCisJCQljYXNlIDE1OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YSwgMHgzLCAweDgsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxMCwgMHgwKTsKKwkJCQlyc3NpX2FkanVzdF92YWwgPSAxODsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxODoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CisJCQkJcnNzaV9hZGp1c3RfdmFsID0gMTQ7CisJCQkJYnJlYWs7CQkJCisJCQkJCisJCQljYXNlIDIwOgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4MjUsIDB4MjUsIDB4MCwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjE6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg5MywgMHgyMCwgMHgzLCAweDEwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjI6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHg4LCAweDgsIDB4MCwgMHg0MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIzOgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MjUsIDB4MywgMHgzMSwgMHgxOCk7CisJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTUsIDB4MywgMHgzMSwgMHgxOCk7CisJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI1OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4YSwgMHgzLCAweDMxLCAweDE4KTsKKwkJCQlyc3NpX2FkanVzdF92YWwgPSAyMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjY6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOworCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDIyOworCQkJCWJyZWFrOworCQkJY2FzZSAyNzoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4OTgpOworCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDIyOworCQkJCWJyZWFrOworCQkJY2FzZSAyODoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDY5LCAweDI1LCAweDMsIDB4MzEsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI5OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4YWIsIDB4MWEsIDB4MWEsIDB4MSwgMHg4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzA6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg5MywgMHgxNSwgMHgzLCAweDE0LCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSAzMToKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAwLCAweDU4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhhYiwgMHhhLCAweDMsIDB4MzEsIDB4ODgpOworCQkJCWJyZWFrOworCQkJY2FzZSAzMzoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGEzLCAweDI1LCAweDMsIDB4MzAsIDB4ODgpOworCQkJCWJyZWFrOworCQkJY2FzZSAzNDoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4OCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM1OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4MCwgMHg4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzY6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHgxMiwgMHgzLCAweDE0LCAweDU4KTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBkaXNhYmxlIFBTIHRkbWEKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJCWNhc2UgODoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCk7CisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHg0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCWRlZmF1bHQ6CisJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDApOworCQkJCWRlbGF5X21zKDUpOworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4MjApOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4OTJjLCAweDQpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CisJCQkJZGVsYXlfbXMoNSk7CisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHgyMCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcnNzaV9hZGp1c3RfdmFsID0wOworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl8xQU5UX0NPRVhfVFlQRSwgJnJzc2lfYWRqdXN0X3ZhbCk7CisKKwkvLyB1cGRhdGUgcHJlIHN0YXRlCisJY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPSBjb2V4X2RtLT5jdXJfcHNfdGRtYV9vbjsKKwljb2V4X2RtLT5wcmVfcHNfdGRtYSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQ29leEFsbE9mZigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCS8vIGZ3IGFsbCBvZmYKKwloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJLy8gc3cgYWxsIG9mZgorCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKKworCisJLy8gaHcgYWxsIG9mZgorCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfV2lmaVBhcmFBZGp1c3QoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQllbmFibGUKKwkpCit7CisJaWYoZW5hYmxlKQorCXsKKwkJaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwl9CisJZWxzZQorCXsKKwkJaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJfQorfQorCitCT09MRUFOCitoYWxidGM4ODEyYTFhbnRfSXNDb21tb25BY3Rpb24oCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwlCT09MRUFOCQkJY29tbW9uPWZhbHNlLCB3aWZpX2Nvbm5lY3RlZD1mYWxzZSwgd2lmaV9idXN5PWZhbHNlOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisKKwkvL2hhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCisJaWYoIXdpZmlfY29ubmVjdGVkICYmIAorCQlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIG5vbiBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCQkKKyAJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisKKwkJY29tbW9uID0gdHJ1ZTsKKwl9CisJZWxzZSBpZih3aWZpX2Nvbm5lY3RlZCAmJiAKKwkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOworCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCisgICAgICAJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisKKwkJY29tbW9uID0gdHJ1ZTsKKwl9CisJZWxzZSBpZighd2lmaV9jb25uZWN0ZWQgJiYgCisJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisKKwkJY29tbW9uID0gdHJ1ZTsKKwl9CisJZWxzZSBpZih3aWZpX2Nvbm5lY3RlZCAmJiAKKwkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIGNvbm5lY3RlZCArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKKwkJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMShidGNvZXhpc3QsdHJ1ZSx0cnVlLHRydWUsdHJ1ZSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOworCisJCWNvbW1vbiA9IHRydWU7CisJfQorCWVsc2UgaWYoIXdpZmlfY29ubmVjdGVkICYmIAorCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gY29leF9kbS0+YnRfc3RhdHVzKSApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgQnVzeSEhXG4iKSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisJCQorCQljb21tb24gPSB0cnVlOworCX0KKwllbHNlCisJeworCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCx0cnVlLHRydWUsdHJ1ZSx0cnVlKTsKKwkJCisJCWNvbW1vbiA9IGZhbHNlOworCX0KKwkKKwlyZXR1cm4gY29tbW9uOworfQorCisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwlzdGF0aWMgczRCeXRlCQl1cCxkbixtLG4sd2FpdF9jb3VudDsKKwlzNEJ5dGUJCQlyZXN1bHQ7ICAgLy8wOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbgorCXUxQnl0ZQkJCXJldHJ5X2NvdW50PTAsIGJ0X2luZm9fZXh0OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBoYWxidGM4ODEyYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKKwlpZihjb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCkKKwl7CisJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gZmFsc2U7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGZpcnN0IHJ1biBUZG1hRHVyYXRpb25BZGp1c3QoKSEhXG4iKSk7CisKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDI7CisJCS8vPT09PT09PT09PT09CisJCXVwID0gMDsKKwkJZG4gPSAwOworCQltID0gMTsKKwkJbj0gMzsKKwkJcmVzdWx0ID0gMDsKKwkJd2FpdF9jb3VudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJcmV0cnlfY291bnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OworCQlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlfY291bnQgPSAlZFxuIiwgcmV0cnlfY291bnQpKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCB3YWl0X2NvdW50PSVkXG4iLCAKKwkJCXVwLCBkbiwgbSwgbiwgd2FpdF9jb3VudCkpOworCQlyZXN1bHQgPSAwOworCQl3YWl0X2NvdW50Kys7IAorCQkgIAorCQlpZihyZXRyeV9jb3VudCA9PSAwKSAgLy8gbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXArKzsKKwkJCWRuLS07CisKKwkJCWlmIChkbiA8PSAwKQorCQkJCWRuID0gMDsJCQkJIAorCisJCQlpZih1cCA+PSBuKQkvLyBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQl3YWl0X2NvdW50ID0gMDsgCisJCQkJbiA9IDM7CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQlyZXN1bHQgPSAxOyAKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBJbmNyZWFzZSB3aWZpIGR1cmF0aW9uISFcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChyZXRyeV9jb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXAtLTsgCisJCQlkbisrOworCisJCQlpZiAodXAgPD0gMCkKKwkJCQl1cCA9IDA7CisKKwkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQlpZiAod2FpdF9jb3VudCA8PSAyKQorCQkJCQltKys7IC8vIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4KKwkJCQllbHNlCisJCQkJCW0gPSAxOworCisJCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCisJCQkJCW0gPSAyMDsKKworCQkJCW4gPSAzKm07CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQl3YWl0X2NvdW50ID0gMDsKKwkJCQlyZXN1bHQgPSAtMTsgCisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOworCQkJfQorCQl9CisJCWVsc2UgIC8vcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbgorCQl7CisJCQlpZiAod2FpdF9jb3VudCA9PSAxKQorCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJZWxzZQorCQkJCW0gPSAxOworCisJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQltID0gMjA7CisKKwkJCW4gPSAzKm07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQl3YWl0X2NvdW50ID0gMDsgCisJCQlyZXN1bHQgPSAtMTsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpKTsKKwkJfQorCisJCWlmKHJlc3VsdCA9PSAtMSkKKwkJeworCQkJaWYoIChCVF9JTkZPXzg4MTJBXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0X2luZm9fZXh0KSkgJiYKKwkJCQkoKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHx8KGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpKSApCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gOTsKKwkJCX0KKwkJCWVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkKKwkJCXsKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOworCQkJfQorCQkJZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CisJCQl9CisJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDExOworCQkJfQorCQl9CisJCWVsc2UgaWYocmVzdWx0ID09IDEpCisJCXsKKwkJCWlmKCAoQlRfSU5GT184ODEyQV8xQU5UX0EyRFBfQkFTSUNfUkFURShidF9pbmZvX2V4dCkpICYmCisJCQkJKChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB8fChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSkgKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CisJCQl9CisJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CisJCQl9CisJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKKwkJCX0KKwkJCWVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikKKwkJCXsKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOworCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxOworCQkJfQorCQl9CisKKwkJaWYoIGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDEgJiYKKwkJCWNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDIgJiYKKwkJCWNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDkgJiYKKwkJCWNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDExICkKKwkJeworCQkJLy8gcmVjb3ZlciB0byBwcmV2aW91cyBhZGp1c3QgdHlwZQorCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCBjb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlKTsKKwkJfQorCX0KK30KKwordTFCeXRlCitoYWxidGM4ODEyYTFhbnRfUHNUZG1hVHlwZUJ5V2lmaVJzc2koCisJIAlzNEJ5dGUJd2lmaV9yc3NpLAorCSAJczRCeXRlCXByZV93aWZpX3Jzc2ksCisJIAl1MUJ5dGUJd2lmaV9yc3NpX3RocmVzaAorCSkKK3sKKwl1MUJ5dGUJcHNfdGRtYV90eXBlPTA7CisJCisJaWYod2lmaV9yc3NpID4gcHJlX3dpZmlfcnNzaSkKKwl7CisJCWlmKHdpZmlfcnNzaSA+ICh3aWZpX3Jzc2lfdGhyZXNoKzUpKQorCQl7CisJCQlwc190ZG1hX3R5cGUgPSAyNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBzX3RkbWFfdHlwZSA9IDI1OworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHdpZmlfcnNzaSA+IHdpZmlfcnNzaV90aHJlc2gpCisJCXsKKwkJCXBzX3RkbWFfdHlwZSA9IDI2OworCQl9CisJCWVsc2UKKwkJeworCQkJcHNfdGRtYV90eXBlID0gMjU7CisJCX0KKwl9CisKKwlyZXR1cm4gcHNfdGRtYV90eXBlOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJQk9PTEVBTgkJCW5ld19wc19zdGF0ZQorCSkKK3sKKwl1MUJ5dGUJbHBzX21vZGU9MHgwOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9MUFNfTU9ERSwgJmxwc19tb2RlKTsKKwkKKwlpZihscHNfbW9kZSkJLy8gYWxyZWFkeSB1bmRlciBMUFMgc3RhdGUKKwl7CisJCWlmKG5ld19wc19zdGF0ZSkJCQorCQl7CisJCQkvLyBrZWVwIHN0YXRlIHVuZGVyIExQUywgZG8gbm90aGluZy4KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHdpbGwgbGVhdmUgTFBTIHN0YXRlLCB0dXJuIG9mZiBwc1RkbWEgZmlyc3QKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOworCQl9CisJfQorCWVsc2UJCQkJCQkvLyBOTyBQUyBzdGF0ZQorCXsKKwkJaWYobmV3X3BzX3N0YXRlKQorCQl7CisJCQkvLyB3aWxsIGVudGVyIExQUyBzdGF0ZSwgdHVybiBvZmYgcHNUZG1hIGZpcnN0CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGtlZXAgc3RhdGUgdW5kZXIgTk8gUFMgc3RhdGUsIGRvIG5vdGhpbmcuCisJCX0KKwl9Cit9CisKKy8vIFNDTyBvbmx5IG9yIFNDTytQQU4oSFMpCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uU2NvKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJdTFCeXRlCXdpZmlfcnNzaV9zdGF0ZTsKKwl1NEJ5dGUJd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOworCisJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisKKwlpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCSAgaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJICBoYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisJCX0JCQorCX0KK30KKworCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJdTFCeXRlCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsJCisJdTRCeXRlCXdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsZmFsc2UsZmFsc2UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOworCQl9CQkKKwl9Cit9CisKKy8vQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uQTJkcCgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOworCXU0Qnl0ZQkJd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOworCQl9CQkKKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BMmRwUGFuSHMoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7CisJdTRCeXRlCQl3aWZpX2J3OworCisJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CisKKwloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmKGhhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cihidGNvZXhpc3QpKQorCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQkKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisJCX0JCQorCX0KK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkcigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOworCXU0Qnl0ZQkJd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOworCQl9CisJfQorfQorCisKKy8vUEFOKEhTKSBvbmx5Cit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuSHMoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1NEJ5dGUJCXdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJeworCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gZncgbWVjaGFuaXNtCisJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCQl9CisKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KK30KKworLy9QQU4oRURSKStBMkRQCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuRWRyQTJkcCgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlLCBidF9pbmZvX2V4dDsKKwl1NEJ5dGUJCXdpZmlfYnc7CisKKwlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckhpZCgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOworCXU0Qnl0ZQkJd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJewkJCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisJCX0KKwl9Cit9CisKKy8vIEhJRCtBMkRQK1BBTihFRFIpCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcigKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlLCBidF9pbmZvX2V4dDsKKwl1NEJ5dGUJCXdpZmlfYnc7CisKKwlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJewkKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWRBMmRwKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OworCXU0Qnl0ZQkJd2lmaV9idzsKKworCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOworCisJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJewkJCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOworCQl9CisJfQorfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uSHMoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCUJPT0xFQU4JCQloc19jb25uZWN0aW5nCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGZvciBIUywgaHNfY29ubmVjdGluZz0lZCEhIVxuIiwgaHNfY29ubmVjdGluZykpOworCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOworCisJaWYoaHNfY29ubmVjdGluZykKKwl7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGZmZmYsIDB4Myk7CisJfQorCWVsc2UKKwl7CisJCWlmKChjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCtjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCsKKwkJCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHgrY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCk8PTEyMDApCisJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHhhYWFhYWFhYSwgMHhhYWFhYWFhYSwgMHhmZmZmLCAweDMpOworCQllbHNlCisJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmLCAweDMpOwkKKwl9Cit9CisKKwordm9pZAoraGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwlCT09MRUFOCQloc19jb25uZWN0aW5nPWZhbHNlOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLCAmaHNfY29ubmVjdGluZyk7CisJCisJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKworCWlmKGhzX2Nvbm5lY3RpbmcpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhTIGlzIGNvbm5lY3RpbmchISFcbiIpKTsKKwkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOworCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlCT09MRUFOCQkJaHNfY29ubmVjdGluZz1mYWxzZTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfQ09OTkVDVElORywgJmhzX2Nvbm5lY3RpbmcpOworCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisKKwlpZihoc19jb25uZWN0aW5nKQorCXsKKwkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7CisJfQorCWVsc2UgaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCXsKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCX0KKwllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKK3sKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCX0KKwllbHNlIGlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKKwkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQorCXsKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyOCk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCX0KKwllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwl7CisJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzUpOworCQllbHNlCisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI5KTsKKwkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJfQorCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCisJCXsKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOCk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YWVhNWFlYSwgMHg1YWVhNWFlYSwgMHhmZmZmLCAweDMpOworCX0KKwllbHNlIAorCXsKKwkJLy9lcnJvciBjb25kaXRpb24sIHNob3VsZCBub3QgcmVhY2ggaGVyZSwgcmVjb3JkIGVycm9yIG51bWJlciBmb3IgZGVidWdnaW5nLgorCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSAxOworCX0KK30KKwordm9pZAoraGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwkKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbkNvbm5lY3RlZFNjYW4oKT09PT5cbiIpKTsKKworCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKKwl7CisJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOworCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKKwkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CisKKwkJLy8gcHNUZG1hCisJCWlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb25Db25uZWN0ZWRTY2FuKCksIGJ0IGlzIHVuZGVyIGlucXVpcnkvcGFnZSBzY2FuXG4iKSk7CisJCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CisJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CisJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CisJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwkJfQorCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJeworCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQorCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzNCk7CisJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKKwkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMyk7CisJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJfQorCQllbHNlIAorCQl7CisJCQkvL2Vycm9yIGNvbmRpdGlvbiwgc2hvdWxkIG5vdCByZWFjaCBoZXJlCisJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSAyOworCQl9CisJfQorCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uQ29ubmVjdGVkU2NhbigpPD09PVxuIikpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSkKK3sKKwlQQlRDX1NUQUNLX0lORk8Jc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOworCisJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKworCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKKwl7CQorCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJfQorCWVsc2UKKwl7CisJCWlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJeworCQkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQorCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CisJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CisJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjgpOworCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJCX0KKwkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCisJCXsKKwkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM1KTsKKwkJCWVsc2UKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI5KTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOworCQl9CisJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YWVhNWFlYSwgMHg1YWVhNWFlYSwgMHhmZmZmLCAweDMpOworCQl9CisJCWVsc2UgCisJCXsKKwkJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUKKwkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDM7CisJCX0KKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlCT09MRUFOIAl3aWZpX2Nvbm5lY3RlZD1mYWxzZSwgd2lmaV9idXN5PWZhbHNlLCBidF9oc19vbj1mYWxzZTsKKwlCT09MRUFOCQlzY2FuPWZhbHNlLCBsaW5rPWZhbHNlLCByb2FtPWZhbHNlOworCUJPT0xFQU4JCWhzX2Nvbm5lY3Rpbmc9ZmFsc2UsIHVuZGVyNHdheT1mYWxzZTsKKwl1NEJ5dGUJCXdpZmlfYnc7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpPT09PlxuIikpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKKwlpZighd2lmaV9jb25uZWN0ZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgbm90IGNvbm5lY3RlZDw9PT1cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV80X1dBWV9QUk9HUkVTUywgJnVuZGVyNHdheSk7CisJaWYodW5kZXI0d2F5KQorCXsKKwkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTcGVjaWFsUGFja2V0KGJ0Y29leGlzdCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBpcyB1bmRlciA0d2F5PD09PVxuIikpOworCQlyZXR1cm47CisJfQorCQorCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfQ09OTkVDVElORywgJmhzX2Nvbm5lY3RpbmcpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZsaW5rKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOworCWlmKHNjYW4gfHwgbGluayB8fCByb2FtKQorCXsKKwkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKGJ0Y29leGlzdCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBpcyB1bmRlciBzY2FuPD09PVxuIikpOworCQlyZXR1cm47CisJfQorCQorCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsJCisJaWYoIXdpZmlfYnVzeSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBhc3NvY2lhdGVkLWlkbGUhISFcbiIpKTsKKwkJaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOworCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOworCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBidCBpcyB1bmRlciBpbnF1aXJ5L3BhZ2Ugc2NhbiEhIVxuIikpOworCQkJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzIpOworCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOworCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJCXsKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOworCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjYsIDB4MCk7CisJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwkJCX0KKwkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyNiwgMHgwKTsKKwkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCQkJfQorCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCisJCQl7CisJCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmIHN0YWNrX2luZm8tPm51bU9mTGluaz09MSkKKwkJCQl7CisJCQkJCS8vIGhpZCBvbmx5CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKwkJCQkJCisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOworCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOworCQkJCX0KKwkJCQllbHNlCisJCQkJewkJCQkKKwkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOworCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKworCQkJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QpCisJCQkJCXsKKwkJCQkJCWlmKHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpCisJCQkJCQl7CisJCQkJCQkJLy8gaGlkK2EyZHAKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCisJCQkJCQl7CisJCQkJCQkJaWYoYnRfaHNfb24pCisJCQkJCQkJeworCQkJCQkJCQkvLyBoaWQraHMKKwkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gaGlkK3BhbgorCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCX0KKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA0OworCQkJCQkJfQorCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKKwkJCQkJeworCQkJCQkJaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQorCQkJCQkJeworCQkJCQkJCWlmKGJ0X2hzX29uKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gYTJkcCtocworCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQkvLyBhMmRwK3BhbgorCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM2KTsKKwkJCQkJCQl9CisJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIGEyZHAgb25seQorCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woYnRjb2V4aXN0KTsKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKKwkJCQkJeworCQkJCQkJLy8gcGFuIG9ubHkKKwkJCQkJCWlmKGJ0X2hzX29uKQorCQkJCQkJeworCQkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIHRlbXAgc3RhdGUsIGRvIG5vdGhpbmchISEKKwkJCQkJCS8vRGJnUHJpbnQoImVycm9yIDYsIGNvZXhfZG0tPmJ0X3N0YXR1cz0lZFxuIiwgY29leF9kbS0+YnRfc3RhdHVzKTsKKwkJCQkJCS8vRGJnUHJpbnQoImVycm9yIDYsIHN0YWNrX2luZm8tPm51bU9mTGluaz0lZCwgc3RhY2tfaW5mby0+aGlkX2V4aXN0PSVkLCBzdGFja19pbmZvLT5hMmRwX2V4aXN0PSVkLCBzdGFja19pbmZvLT5wYW5fZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnNjb19leGlzdD0lZFxuIiwgCisJCQkJCQkJLy9zdGFja19pbmZvLT5udW1PZkxpbmssIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5zY29fZXhpc3QpOworCQkJCQkJLy9jb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA2OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKKwkJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgorCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKKwkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWFlYTVhZWEsIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKKwkJCX0KKwkJCWVsc2UgCisJCQl7CisJCQkJLy9lcnJvciBjb25kaXRpb24sIHNob3VsZCBub3QgcmVhY2ggaGVyZQorCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDc7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGJ1c3khISFcbiIpKTsKKwkJaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoYnRfaHNfb24pCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBIUyBpcyB1bmRlciBwcm9ncmVzcyEhIVxuIikpOworCQkJCS8vRGJnUHJpbnQoImNvZXhfZG0tPmJ0X3N0YXR1cyA9IDB4JXhcbiIsIGNvZXhfZG0tPmJ0X3N0YXR1cyk7CisJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7CisJCQl9CisJCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJCXsKKwkJCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCisJCQkJeworCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKKwkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOworCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YTVhNWE1YSwgMHg1YTVhNWE1YSwgMHhmZmZmLCAweDMpOworCQkJfQorCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCisJCQl7CisJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKwkJCQlpZihidF9oc19vbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSFMgaXMgdW5kZXIgcHJvZ3Jlc3MhISFcbiIpKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YTVhNWE1YSwgMHg1YTVhNWE1YSwgMHhmZmZmLCAweDMpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQorCQkJeworCQkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJiBzdGFja19pbmZvLT5udW1PZkxpbms9PTEpCisJCQkJeworCQkJCQkvLyBoaWQgb25seQorCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKKwkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCisJCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisJCQkJCQorCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVmZmY1ZmZmLCAweDVmZmY1ZmZmLCAweGZmZmYsIDB4Myk7CisJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOworCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKworCQkJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QpCisJCQkJCXsKKwkJCQkJCWlmKHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpCisJCQkJCQl7CisJCQkJCQkJLy8gaGlkK2EyZHAKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCisJCQkJCQl7CisJCQkJCQkJaWYoYnRfaHNfb24pCisJCQkJCQkJeworCQkJCQkJCQkvLyBoaWQraHMKKwkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gaGlkK3BhbgorCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCX0KKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA4OworCQkJCQkJfQorCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKKwkJCQkJeworCQkJCQkJaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQorCQkJCQkJeworCQkJCQkJCWlmKGJ0X2hzX29uKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gYTJkcCtocworCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQkvLyBhMmRwK3BhbgorCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM2KTsKKwkJCQkJCQl9CisJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CisJCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIGEyZHAgb25seQorCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woYnRjb2V4aXN0KTsKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKKwkJCQkJeworCQkJCQkJLy8gcGFuIG9ubHkKKwkJCQkJCWlmKGJ0X2hzX29uKQorCQkJCQkJeworCQkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJCQkJCX0KKwkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vRGJnUHJpbnQoImVycm9yIDEwLCBzdGFja19pbmZvLT5udW1PZkxpbms9JWQsIHN0YWNrX2luZm8tPmhpZF9leGlzdD0lZCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdD0lZCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0PSVkLCBzdGFja19pbmZvLT5zY29fZXhpc3Q9JWRcbiIsIAorCQkJCQkJCS8vc3RhY2tfaW5mby0+bnVtT2ZMaW5rLCBzdGFja19pbmZvLT5oaWRfZXhpc3QsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3QsIHN0YWNrX2luZm8tPnBhbl9leGlzdCwgc3RhY2tfaW5mby0+c2NvX2V4aXN0KTsKKwkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDEwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKKwkJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQorCQkJeworCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgorCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisKKwkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKKwkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWFlYTVhZWEsIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKKwkJCX0KKwkJCWVsc2UgCisJCQl7CisJCQkJLy9EYmdQcmludCgiZXJyb3IgMTEsIGNvZXhfZG0tPmJ0X3N0YXR1cz0lZFxuIiwgY29leF9kbS0+YnRfc3RhdHVzKTsKKwkJCQkvL0RiZ1ByaW50KCJlcnJvciAxMSwgc3RhY2tfaW5mby0+bnVtT2ZMaW5rPSVkLCBzdGFja19pbmZvLT5oaWRfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnBhbl9leGlzdD0lZCwgc3RhY2tfaW5mby0+c2NvX2V4aXN0PSVkXG4iLCAKKwkJCQkJLy9zdGFja19pbmZvLT5udW1PZkxpbmssIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5zY29fZXhpc3QpOworCQkJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUKKwkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSAxMTsKKwkJCX0KKwkJfQorCX0KKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpPD09PVxuIikpOworfQorCit2b2lkCitoYWxidGM4ODEyYTFhbnRfUnVuU3dDb2V4aXN0TWVjaGFuaXNtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJQk9PTEVBTgkJCQl3aWZpX3VuZGVyNWc9ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CisJdTFCeXRlCQkJCWJ0X2luZm9fb3JpZ2luYWw9MCwgYnRfcmV0cnlfY250PTA7CisJdTFCeXRlCQkJCWFsZ29yaXRobT0wOworCisJcmV0dXJuOworCWlmKHN0YWNrX2luZm8tPmJQcm9maWxlTm90aWZpZWQpCisJeworCQlhbGdvcml0aG0gPSBoYWxidGM4ODEyYTFhbnRfQWN0aW9uQWxnb3JpdGhtKGJ0Y29leGlzdCk7CisJCWNvZXhfZG0tPmN1cl9hbGdvcml0aG0gPSBhbGdvcml0aG07CQkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pKTsKKworCQlpZihoYWxidGM4ODEyYTFhbnRfSXNDb21tb25BY3Rpb24oYnRjb2V4aXN0KSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gY29tbW9uLlxuIikpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pCisJCQl7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19TQ086CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblNjbyhidGNvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElELlxuIikpOworCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkKGJ0Y29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUC5cbiIpKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkEyZHAoYnRjb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBBMkRQK1BBTihIUykuXG4iKSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BMmRwUGFuSHMoYnRjb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFI6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOworCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuRWRyKGJ0Y29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFOSFM6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5IcyhidGNvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckEyZHAoYnRjb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5FZHJIaWQoYnRjb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRCtBMkRQK1BBTi5cbiIpKTsKKwkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIoYnRjb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWRBMmRwKGJ0Y29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4QWxsT2ZmKGJ0Y29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJY29leF9kbS0+cHJlX2FsZ29yaXRobSA9IGNvZXhfZG0tPmN1cl9hbGdvcml0aG07CisJCX0KKwl9Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJQk9PTEVBTgkJCQl3aWZpX3VuZGVyNWc9ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKT09PT5cbiIpKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXI1Zyk7CisKKwlpZih3aWZpX3VuZGVyNWcpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciA1RyA8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgTWFudWFsIENUUkwgPD09PVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYoYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciBTdG9wIENvZXggRE0gPD09PVxuIikpOworCQlyZXR1cm47CisJfQorCisJaGFsYnRjODgxMmExYW50X1J1blN3Q29leGlzdE1lY2hhbmlzbShidGNvZXhpc3QpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKKwlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGJ0IGlzIGRpc2FibGVkISEhXG4iKSk7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKKwkJaWYod2lmaV9idXN5KQorCQl7CQkJCisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CisJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CisJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwkJfQorCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwl9CisJZWxzZSBpZihjb2V4X3N0YS0+dW5kZXJfaXBzKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIElQUyAhISFcbiIpKTsKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMCk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCQloYWxidGM4ODEyYTFhbnRfV2lmaVBhcmFBZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSk7CisJfQorCWVsc2UgaWYoIXdpZmlfY29ubmVjdGVkKQorCXsKKwkJQk9PTEVBTglzY2FuPWZhbHNlLCBsaW5rPWZhbHNlLCByb2FtPWZhbHNlOworCQkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGlzIG5vbiBjb25uZWN0ZWQtaWRsZSAhISFcbiIpKTsKKworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOworCisJCWlmKHNjYW4gfHwgbGluayB8fCByb2FtKQorCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4oYnRjb2V4aXN0KTsKKwkJZWxzZQorCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoYnRjb2V4aXN0KTsKKwl9CisJZWxzZQkvLyB3aWZpIExQUy9CdXN5CisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgTk9UIHVuZGVyIElQUyEhIVxuIikpOworCQloYWxidGM4ODEyYTFhbnRfV2lmaVBhcmFBZGp1c3QoYnRjb2V4aXN0LCB0cnVlKTsKKwkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoYnRjb2V4aXN0KTsKKwl9CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCk8PT09XG4iKSk7Cit9CisKK3ZvaWQKK2hhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CQorCUJPT0xFQU4JCXdpZmlfY29ubmVjdGVkPWZhbHNlOworCS8vIGZvcmNlIHRvIHJlc2V0IGNvZXggbWVjaGFuaXNtCisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmd2lmaV9jb25uZWN0ZWQpOworCWlmKCF3aWZpX2Nvbm5lY3RlZCkgLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJeworCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChidGNvZXhpc3QpOworCX0KKwllbHNlCS8vIHdpZmkgaXMgY29ubmVjdGVkCisJeworCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChidGNvZXhpc3QpOworCX0KKworCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgNik7CisJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UpOworCisJLy8gc3cgYWxsIG9mZgorCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlKTsKKwloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0Yzg4MTJhMWFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggRVhoYWxidGM4ODEyYTFhbnRfCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfSW5pdEh3Q29uZmlnKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJdTRCeXRlCXU0X3RtcD0wOworCXUyQnl0ZQl1MlRtcD0wOworCXUxQnl0ZQl1MV90bXA9MDsKKworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCAxQW50IEluaXQgSFcgQ29uZmlnISFcbiIpKTsKKworCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCisJY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCA9IAorCQlidGNvZXhpc3QtPmJ0Y19nZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOworCQorCS8vYW50IHN3IGNvbnRyb2wgdG8gQlQKKwkgYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDkwMCwgMHgwMDAwMDQwMCk7CisJIGJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmQsIDB4MSk7CisJIGJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHhjYjMsIDB4NzcpOworCSBidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4Y2I3LCAweDQwKTsJCisKKwkvLyAweDc5MFs1OjBdPTB4NQorCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDc5MCk7CisJdTFfdG1wICY9IDB4YzA7CisJdTFfdG1wIHw9IDB4NTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzkwLCB1MV90bXApOworCisJLy8gUFRBIHBhcmFtZXRlcgorCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg2Y2MsIDB4MCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgMHhmZmZmKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmM0LCAweDU1NTU1NTU1KTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCAweDU1NTU1NTU1KTsKKworCS8vIGNvZXggcGFyYW1ldGVycworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgsIDB4MSk7CisKKwkvLyBlbmFibGUgY291bnRlciBzdGF0aXN0aWNzCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHg0KTsKKworCS8vIGVuYWJsZSBQVEEKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NDAsIDB4MjApOworCisJLy8gYnQgY2xvY2sgcmVsYXRlZAorCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDQpOworCXUxX3RtcCB8PSBCSVQ3OworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg0LCB1MV90bXApOworCisJLy8gYnQgY2xvY2sgcmVsYXRlZAorCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDcpOworCXUxX3RtcCB8PSBCSVQxOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3LCB1MV90bXApOworfQorCit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXggTWVjaGFuaXNtIEluaXQhIVxuIikpOworCisJYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gPSBmYWxzZTsKKworCWhhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKGJ0Y29leGlzdCk7Cit9CisKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0Rpc3BsYXlDb2V4SW5mbygKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CisJKQoreworCVBCVENfQk9BUkRfSU5GTwkJYm9hcmRfaW5mbz0mYnRjb2V4aXN0LT5ib2FyZEluZm87CisJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJcHUxQnl0ZQkJCQljbGlfYnVmPWJ0Y29leGlzdC0+Y2xpX2J1ZjsKKwl1MUJ5dGUJCQkJdTFfdG1wWzRdLCBpLCBidF9pbmZvX2V4dCwgcHNUZG1hQ2FzZT0wOworCXU0Qnl0ZQkJCQl1NF90bXBbNF07CisJQk9PTEVBTgkJCQlyb2FtPWZhbHNlLCBzY2FuPWZhbHNlLCBsaW5rPWZhbHNlLCB3aWZpX3VuZGVyNWc9ZmFsc2U7CisJQk9PTEVBTgkJCQlidF9oc19vbj1mYWxzZSwgd2lmaV9idXN5PWZhbHNlOworCXM0Qnl0ZQkJCQl3aWZpX3Jzc2k9MCwgYnRfaHNfcnNzaT0wOworCXU0Qnl0ZQkJCQl3aWZpX2J3LCB3aWZpVHJhZmZpY0RpcjsKKwl1MUJ5dGUJCQkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubDsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQlQgQ29leGlzdCBpbmZvXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W1VuZGVyIE1hbnVhbCBDb250cm9sXT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCX0KKwlpZihidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKKwl7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQ29leCBpcyBTVE9QUEVEXT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCX0KKworCWlmKCFib2FyZF9pbmZvLT5iQnRFeGlzdCkKKwl7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCXJldHVybjsKKwl9CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkFudCBQRyBudW1iZXIvIEFudCBtZWNoYW5pc206IiwgXAorCQlib2FyZF9pbmZvLT5wZ0FudE51bSwgYm9hcmRfaW5mby0+YnRkbUFudE51bSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOwkKKwkKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKKwkJKChzdGFja19pbmZvLT5iUHJvZmlsZU5vdGlmaWVkKT8gIlllcyI6Ik5vIiksIHN0YWNrX2luZm8tPmhjaVZlcnNpb24pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfRldfVkVSKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9ET1QxMV9DSE5MLCAmd2lmaURvdDExQ2hubCk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0hTX0NITkwsICZ3aWZpSHNDaG5sKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLCBcCisJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0NobmwsIGJ0X2hzX29uKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAiLCAiSDJDIFdpZmkgaW5mb3JtIGJ0IGNobmwgSW5mbyIsIFwKKwkJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0sIGNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdLAorCQljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpX3Jzc2kpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICJXaWZpIHJzc2kvIEhTIHJzc2kiLCBcCisJCXdpZmlfcnNzaSwgYnRfaHNfcnNzaSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZzY2FuKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmcm9hbSk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLCAiV2lmaSBsaW5rLyByb2FtLyBzY2FuIiwgXAorCQlsaW5rLCByb2FtLCBzY2FuKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZ3aWZpX3VuZGVyNWcpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT04sICZ3aWZpVHJhZmZpY0Rpcik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlcy8gJXMgIiwgIldpZmkgc3RhdHVzIiwgXAorCQkod2lmaV91bmRlcjVnPyAiNUciOiIyLjRHIiksCisJCSgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpX2J3KT8gIkxlZ2FjeSI6ICgoKEJUQ19XSUZJX0JXX0hUNDA9PXdpZmlfYncpPyAiSFQ0MCI6IkhUMjAiKSkpLAorCQkoKCF3aWZpX2J1c3kpPyAiaWRsZSI6ICgoQlRDX1dJRklfVFJBRkZJQ19UWD09d2lmaVRyYWZmaWNEaXIpPyAidXBsaW5rIjoiZG93bmxpbmsiKSkpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsIFwKKwkJKChjb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSk/KCJpbnF1aXJ5L3BhZ2Ugc2NhbiIpOigoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cyk/ICJub24tY29ubmVjdGVkIGlkbGUiOgorCQkoICAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKT8gImNvbm5lY3RlZC1pZGxlIjoiYnVzeSIpKSksCisJCWNvZXhfc3RhLT5idF9yc3NpLCBjb2V4X3N0YS0+YnRfcmV0cnlfY250KTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisJCisJaWYoc3RhY2tfaW5mby0+YlByb2ZpbGVOb3RpZmllZCkKKwl7CQkJCisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCisJCQlzdGFja19pbmZvLT5zY29fZXhpc3QsIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5hMmRwX2V4aXN0KTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOwkKKworCQlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsKKwl9CisKKwlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyIsICJCVCBJbmZvIEEyRFAgcmF0ZSIsIFwKKwkJKGJ0X2luZm9fZXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOwkKKworCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODgxMkFfMUFOVF9NQVg7IGkrKykKKwl7CisJCWlmKGNvZXhfc3RhLT5idF9pbmZvX2MyaF9jbnRbaV0pCisJCXsJCQkJCisJCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4KCVkKSIsIEdMQnRJbmZvU3JjODgxMmExQW50W2ldLCBcCisJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzBdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bMV0sCisJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzJdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bM10sCisJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzRdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNV0sCisJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzZdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W2ldKTsKKwkJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJfQorCX0KKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8lcywgKDB4JXgvMHgleCkiLCAiUFMgc3RhdGUsIElQUy9MUFMsIChscHMvcnB3bSkiLCBcCisJCSgoY29leF9zdGEtPnVuZGVyX2lwcz8gIklQUyBPTiI6IklQUyBPRkYiKSksCisJCSgoY29leF9zdGEtPnVuZGVyX2xwcz8gIkxQUyBPTiI6IkxQUyBPRkYiKSksIAorCQlidGNvZXhpc3QtPmJ0X2luZm8ubHBzMUFudCwgCisJCWJ0Y29leGlzdC0+YnRfaW5mby5ycHdtMUFudCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9GV19QV1JfTU9ERV9DTUQpOworCisJaWYoIWJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQkvLyBTdyBtZWNoYW5pc20JCisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQvICVkICIsICJTTTFbU2hSZi8gTHBSQS8gTGltRGlnLyBidExuYV0iLCBcCisJCQljb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluaywgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhLCBjb2V4X2RtLT5saW1pdGVkX2RpZywgY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsIFwKKwkJCWNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQorCQkvLyBGdyBtZWNoYW5pc20JCQorCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOwkKKworCQlwc1RkbWFDYXNlID0gY29leF9kbS0+Y3VyX3BzX3RkbWE7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBjYXNlLSVkIiwgIlBTIFRETUEiLCBcCisJCQljb2V4X2RtLT5wc190ZG1hX3BhcmFbMF0sIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVsxXSwKKwkJCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSwgY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdLAorCQkJY29leF9kbS0+cHNfdGRtYV9wYXJhWzRdLCBwc1RkbWFDYXNlKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXggIiwgIkxhdGVzdCBlcnJvciBjb25kaXRpb24oc2hvdWxkIGJlIDApIiwgXAorCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQkKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJEZWNCdFB3ci8gSWduV2xhbkFjdCIsIFwKKwkJCWNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyLCBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCX0KKworCS8vIEh3IHNldHRpbmcJCQorCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgc2V0dGluZ109PT09PT09PT09PT0iKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CQorCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICJSRi1BLCAweDFlIGluaXRWYWwiLCBcCisJCWNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXApOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXUxX3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDc3OCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDc3OCIsIFwKKwkJdTFfdG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisJCisJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4OTJjKTsKKwl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg5MzApOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg5MmMvIDB4OTMwIiwgXAorCQkodTFfdG1wWzBdKSwgdTRfdG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MV90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0MCk7CisJdTFfdG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NGYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg0MC8gMHg0ZiIsIFwKKwkJdTFfdG1wWzBdLCB1MV90bXBbMV0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDU1MCk7CisJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NTIyKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIFwKKwkJdTRfdG1wWzBdLCB1MV90bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGM1MCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAorCQl1NF90bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworI2lmIDAKKwl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhmNDgpOworCXU0X3RtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGY0Yyk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweGY0OC8gMHhmNGMgKEZBIGNudCkiLCBcCisJCXU0X3RtcFswXSwgdTRfdG1wWzFdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisjZW5kaWYKKworCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjMCk7CisJdTRfdG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmM0KTsKKwl1NF90bXBbMl0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzgpOworCXUxX3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDZjYyk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleC8gMHgleCIsICIweDZjMC8weDZjNC8weDZjOC8weDZjYyhjb2V4VGFibGUpIiwgXAorCQl1NF90bXBbMF0sIHU0X3RtcFsxXSwgdTRfdG1wWzJdLCB1MV90bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3MChocCByeFszMToxNl0vdHhbMTU6MF0pIiwgXAorCQljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCwgY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHgpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzQobHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKKwkJY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCwgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCQorCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9DT0VYX1NUQVRJU1RJQ1MpOworfQorCisKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0lwc05vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJdHlwZQorCSkKK3sKKwl1NEJ5dGUJdTRfdG1wPTA7CisKKwlpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8CWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQorCQlyZXR1cm47CisKKwlpZihCVENfSVBTX0VOVEVSID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBJUFMgRU5URVIgbm90aWZ5XG4iKSk7CisJCWNvZXhfc3RhLT51bmRlcl9pcHMgPSB0cnVlOworCisJCS8vIDB4NGNbMjNdPTEKKwkJdTRfdG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NGMpOworCQl1NF90bXAgfD0gQklUMjM7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0YywgdTRfdG1wKTsKKwkJCisJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4QWxsT2ZmKGJ0Y29leGlzdCk7CisJfQorCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIExFQVZFIG5vdGlmeVxuIikpOworCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gZmFsc2U7CisJCS8vaGFsYnRjODgxMmExYW50X0luaXRDb2V4RG0oYnRjb2V4aXN0KTsKKwl9Cit9CisKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0xwc05vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8IGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQorCQlyZXR1cm47CisKKwlpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIEVOQUJMRSBub3RpZnlcbiIpKTsKKwkJY29leF9zdGEtPnVuZGVyX2xwcyA9IHRydWU7CisJfQorCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIERJU0FCTEUgbm90aWZ5XG4iKSk7CisJCWNvZXhfc3RhLT51bmRlcl9scHMgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X1NjYW5Ob3RpZnkoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCXUxQnl0ZQkJCXR5cGUKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPIAlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJQk9PTEVBTiAJCXdpZmlfY29ubmVjdGVkPWZhbHNlOwkKKworCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHxidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKKwkJcmV0dXJuOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKKwlpZihCVENfU0NBTl9TVEFSVCA9PSB0eXBlKQorCXsJCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gU1RBUlQgbm90aWZ5XG4iKSk7CisJCWlmKCF3aWZpX2Nvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJCXsKKwkJCS8vc2V0IDB4NTUwWzNdPTEgYmVmb3JlIFBzVGRtYQorCQkJLy9oYWxidGM4ODEyYTFhbnRfUmVnMHg1NTBCaXQzKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihidGNvZXhpc3QpOworCQl9CisJCWVsc2UJLy8gd2lmaSBpcyBjb25uZWN0ZWQKKwkJeworCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKGJ0Y29leGlzdCk7CisJCX0KKwl9CisJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIikpOworCQlpZighd2lmaV9jb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgorCQl7CisJCQkvL2hhbGJ0Yzg4MTJhMWFudF9SZWcweDU1MEJpdDMoYnRjb2V4aXN0LCBmYWxzZSk7CisJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChidGNvZXhpc3QpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoYnRjb2V4aXN0KTsKKwkJfQorCX0KK30KKwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfQ29ubmVjdE5vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlQQlRDX1NUQUNLX0lORk8gCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlCT09MRUFOCQkJd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CQorCisJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQorCQlyZXR1cm47CisKKwlpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOworCQlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCisJCXsJCQkKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4oYnRjb2V4aXN0KTsKKwkJfQorCX0KKwllbHNlIGlmKEJUQ19BU1NPQ0lBVEVfRklOSVNIID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpKTsKKwkJCisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CisJCWlmKCF3aWZpX2Nvbm5lY3RlZCkgLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJCXsKKwkJCS8vaGFsYnRjODgxMmExYW50X1JlZzB4NTUwQml0MyhidGNvZXhpc3QsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKGJ0Y29leGlzdCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChidGNvZXhpc3QpOworCQl9CisJfQorfQorCit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9NZWRpYVN0YXR1c05vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKKwkgCXUxQnl0ZQkJCQl0eXBlCisJKQoreworCXUxQnl0ZQkJCWRhdGFMZW49NTsKKwl1MUJ5dGUJCQlidWZbNl0gPSB7MH07CisJdTFCeXRlCQkJaDJjX3BhcmFtZXRlclszXSA9ezB9OworCUJPT0xFQU4JCQl3aWZpX3VuZGVyNWc9ZmFsc2U7CisJdTRCeXRlCQkJd2lmaV9idzsKKwl1MUJ5dGUJCQl3aWZpX2NlbnRyYWxfY2hubDsKKworCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHxidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKKwkJcmV0dXJuOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLCAmd2lmaV91bmRlcjVnKTsKKworCS8vIG9ubHkgMi40RyB3ZSBuZWVkIHRvIGluZm9ybSBidCB0aGUgY2hubCBtYXNrCisJaWYoIXdpZmlfdW5kZXI1ZykKKwl7CisJCWlmKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpCisJCXsKKwkJCWgyY19wYXJhbWV0ZXJbMF0gPSAweDE7CisJCX0KKwkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9DRU5UUkFMX0NITkwsICZ3aWZpX2NlbnRyYWxfY2hubCk7CisJCWgyY19wYXJhbWV0ZXJbMV0gPSB3aWZpX2NlbnRyYWxfY2hubDsKKwkJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQorCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MzA7CisJCWVsc2UKKwkJCWgyY19wYXJhbWV0ZXJbMl0gPSAweDIwOworCX0KKwkJCisJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0gPSBoMmNfcGFyYW1ldGVyWzBdOworCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdID0gaDJjX3BhcmFtZXRlclsxXTsKKwljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSA9IGgyY19wYXJhbWV0ZXJbMl07CisJCisJYnVmWzBdID0gZGF0YUxlbjsKKwlidWZbMV0gPSAweDU7CQkJCS8vIE9QX0NvZGUKKwlidWZbMl0gPSAweDM7CQkJCS8vIE9QX0NvZGVfTGVuZ3RoCisJYnVmWzNdID0gaDJjX3BhcmFtZXRlclswXTsgCS8vIE9QX0NvZGVfQ29udGVudAorCWJ1Zls0XSA9IGgyY19wYXJhbWV0ZXJbMV07CisJYnVmWzVdID0gaDJjX3BhcmFtZXRlclsyXTsKKwkJCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQkKK30KKwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKKwkgCXUxQnl0ZQkJCQl0eXBlCisJKQoreworCUJPT0xFQU4gCWJTZWN1cml0eUxpbms9ZmFsc2U7CisKKwlpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8YnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCisJCXJldHVybjsKKworCS8vaWYodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBzcGVjaWFsIFBhY2tldCglZCkgbm90aWZ5XG4iLCB0eXBlKSk7CisJCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKKwkJeworCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOworCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CQorCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTcGVjaWFsUGFja2V0KGJ0Y29leGlzdCk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0J0SW5mb05vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJcHUxQnl0ZQkJCXRtcF9idWYsCisJIAl1MUJ5dGUJCQlsZW5ndGgKKwkpCit7CisJdTFCeXRlCQkJYnRfaW5mbz0wOworCXUxQnl0ZQkJCWksIHJzcF9zb3VyY2U9MDsKKwlzdGF0aWMgdTRCeXRlCQlzZXRfYnRfbG5hX2NudD0wLCBzZXRfYnRfcHNkX21vZGU9MDsKKwlCT09MRUFOCQkJYnRfYnVzeT1mYWxzZSwgbGltaXRlZF9kaWc9ZmFsc2U7CisJQk9PTEVBTgkJCXdpZmlfY29ubmVjdGVkPWZhbHNlOworCUJPT0xFQU4JCQliUmVqQXBBZ2dQa3Q9ZmFsc2U7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpPT09PlxuIikpOworCisKKwlyc3Bfc291cmNlID0gdG1wX2J1ZlswXSYweGY7CisJaWYocnNwX3NvdXJjZSA+PSBCVF9JTkZPX1NSQ184ODEyQV8xQU5UX01BWCkKKwkJcnNwX3NvdXJjZSA9IEJUX0lORk9fU1JDXzg4MTJBXzFBTlRfV0lGSV9GVzsKKwljb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W3JzcF9zb3VyY2VdKys7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBCdCBpbmZvWyVkXSwgbGVuZ3RoPSVkLCBoZXggZGF0YT1bIiwgcnNwX3NvdXJjZSwgbGVuZ3RoKSk7CisJZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwl7CisJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVtpXSA9IHRtcF9idWZbaV07CisJCWlmKGkgPT0gMSkKKwkJCWJ0X2luZm8gPSB0bXBfYnVmW2ldOworCQlpZihpID09IGxlbmd0aC0xKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTJ4XVxuIiwgdG1wX2J1ZltpXSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUyeCwgIiwgdG1wX2J1ZltpXSkpOworCQl9CisJfQorCisJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIHJldHVybiBmb3IgTWFudWFsIENUUkw8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisJaWYoYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIENvZXggU1RPUFBFRCEhPD09PVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYoQlRfSU5GT19TUkNfODgxMkFfMUFOVF9XSUZJX0ZXICE9IHJzcF9zb3VyY2UpCisJeworCQljb2V4X3N0YS0+YnRfcmV0cnlfY250ID0KKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVsyXTsKKworCQljb2V4X3N0YS0+YnRfcnNzaSA9CisJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1bM10qMisxMDsKKworCQljb2V4X3N0YS0+YnRfaW5mb19leHQgPSAKKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVs0XTsKKworCQkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCisJCS8vIGJlY2F1c2UgYnQgaXMgcmVzZXQgYW5kIGxvc3Mgb2YgdGhlIGluZm8uCisJCWlmKCAoY29leF9zdGEtPmJ0X2luZm9fZXh0ICYgQklUMSkgKQorCQl7CQkJCisJCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmd2lmaV9jb25uZWN0ZWQpOworCQkJaWYod2lmaV9jb25uZWN0ZWQpCisJCQl7CisJCQkJRVhoYWxidGM4ODEyYTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoYnRjb2V4aXN0LCBCVENfTUVESUFfQ09OTkVDVCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJRVhoYWxidGM4ODEyYTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoYnRjb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7CisJCQl9CisKKwkJCXNldF9idF9wc2RfbW9kZSA9IDA7CisJCX0KKworCQkvLyB0ZXN0LWNoaXAgYnQgcGF0Y2ggZG9lc24ndCBzdXBwb3J0LCB0ZW1wb3JhcnkgcmVtb3ZlLgorCQkvLyBuZWVkIHRvIGFkZCBiYWNrIHdoZW4gbXAtY2hpcC4gMTIvMjAvMjAxMgorI2lmIDAJCQorCQlpZihzZXRfYnRfcHNkX21vZGUgPD0gMykKKwkJew0KKwkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRCdFBzZE1vZGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAweGQpOworCQkJc2V0X2J0X3BzZF9tb2RlKys7CisJCX0KKwkJCisJCWlmKGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbikKKwkJeworCQkJaWYoIChjb2V4X3N0YS0+YnRfaW5mb19leHQgJiBCSVQyKSApCisJCQl7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoc2V0X2J0X2xuYV9jbnQgPD0gMykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRCdExuYUNvbnN0cmFpbihidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCQkJCQlzZXRfYnRfbG5hX2NudCsrOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXNldF9idF9sbmFfY250ID0gMDsKKwkJfQorI2VuZGlmCisJCS8vIHRlc3QtY2hpcCBidCBwYXRjaCBvbmx5IHJzcCB0aGUgc3RhdHVzIGZvciBCVF9SU1AsIAorCQkvLyBzbyB0ZW1wb3Jhcnkgd2UgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBvbmx5IHVuZGVyIEJUX1JTUAorCQlpZihCVF9JTkZPX1NSQ184ODEyQV8xQU5UX0JUX1JTUCA9PSByc3Bfc291cmNlKQorCQl7CisJCQlpZiggKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDMpICkKKwkJCXsKKwkJCSNpZiAwLy8gdGVtcCBkaXNhYmxlIGJlY2F1c2UgYnQgcGF0Y2ggcmVwb3J0IHRoZSB3cm9uZyB2YWx1ZS4KKwkJCQloYWxidGM4ODEyYTFhbnRfSWdub3JlV2xhbkFjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIGZhbHNlKTsKKwkJCSNlbmRpZgorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEJUIGFscmVhZHkgTk9UIGlnbm9yZSBXbGFuIGFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLgorCQkJfQorCisJCQlpZiggKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDQpICkKKwkJCXsKKwkJCQkvLyBCVCBhdXRvIHJlcG9ydCBhbHJlYWR5IGVuYWJsZWQsIGRvIG5vdGhpbmcKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQloYWxidGM4ODEyYTFhbnRfQnRBdXRvUmVwb3J0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CisJCQl9CisJCX0KKwl9CisJCQorCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCisJaWYoYnRfaW5mbyAmIEJUX0lORk9fODgxMkFfMUFOVF9CX0lOUV9QQUdFKQorCXsKKwkJY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgPSB0cnVlOworCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRTsKKwl9CisJZWxzZQorCXsKKwkJY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgPSBmYWxzZTsKKwkJaWYoIShidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX0NPTk5FQ1RJT04pKQorCQl7CisJCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEU7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBub24tY29ubmVjdGVkIGlkbGUhISFcbiIpKTsKKwkJfQorCQllbHNlIGlmKGJ0X2luZm8gPT0gQlRfSU5GT184ODEyQV8xQU5UX0JfQ09OTkVDVElPTikJLy8gY29ubmVjdGlvbiBleGlzdHMgYnV0IG5vIGJ1c3kKKwkJeworCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOworCQl9CQkKKwkJZWxzZSBpZigoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9TQ09fRVNDTykgfHwKKwkJCShidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX1NDT19CVVNZKSkKKwkJeworCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1k7CisJCQliUmVqQXBBZ2dQa3QgPSB0cnVlOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgc2NvIGJ1c3khISFcbiIpKTsKKwkJfQorCQllbHNlIGlmKGJ0X2luZm8mQlRfSU5GT184ODEyQV8xQU5UX0JfQUNMX0JVU1kpCisJCXsKKwkJCWlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZICE9IGNvZXhfZG0tPmJ0X3N0YXR1cykKKwkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CisJCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWTsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IGFjbCBidXN5ISEhXG4iKSk7CisJCX0KKyNpZiAwCisJCWVsc2UgaWYoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9TQ09fRVNDTykKKwkJeworCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgYWNsL3NjbyBidXN5ISEhXG4iKSk7CisJCX0KKyNlbmRpZgorCQllbHNlCisJCXsKKwkJCS8vRGJnUHJpbnQoImVycm9yLCB1bmRlZmluZWQgYnRfaW5mbz0weCV4XG4iLCBidF9pbmZvKTsKKwkJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX01BWDsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IG5vbi1kZWZpbmVkIHN0YXRlISEhXG4iKSk7CisJCX0KKworCQkvLyBzZW5kIGRlbGV0ZSBCQSB0byBkaXNhYmxlIGFnZ3JlZ2F0aW9uCisJCS8vYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9UT19SRUpfQVBfQUdHX1BLVCwgJmJSZWpBcEFnZ1BrdCk7CisJfQorCisJaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCisJeworCQlidF9idXN5ID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJYnRfYnVzeSA9IGZhbHNlOworCX0KKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwgJmJ0X2J1c3kpOworCisJaWYoYnRfYnVzeSkKKwl7CisJCWxpbWl0ZWRfZGlnID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJbGltaXRlZF9kaWcgPSBmYWxzZTsKKwl9CisJY29leF9kbS0+bGltaXRlZF9kaWcgPSBsaW1pdGVkX2RpZzsKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0xJTUlURURfRElHLCAmbGltaXRlZF9kaWcpOworCisJaGFsYnRjODgxMmExYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oYnRjb2V4aXN0KTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpPD09PVxuIikpOworfQorCit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9TdGFja09wZXJhdGlvbk5vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKKwkgCXUxQnl0ZQkJCQl0eXBlCisJKQoreworCWlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX1NUQVJUID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIHN0YXJ0IG5vdGlmeVxuIikpOworCX0KKwllbHNlIGlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX0ZJTklTSCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBmaW5pc2ggbm90aWZ5XG4iKSk7CisJfQorfQorCit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9IYWx0Tm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0CisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKSk7CisKKwloYWxidGM4ODEyYTFhbnRfSWdub3JlV2xhbkFjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSwgMCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmLCAweGYpOworCWhhbGJ0Yzg4MTJhMWFudF9XaWZpUGFyYUFkanVzdChidGNvZXhpc3QsIGZhbHNlKTsKK30KKwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfUG5wTm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJCXBucFN0YXRlCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFBucCBub3RpZnlcbiIpKTsKKworCWlmKEJUQ19XSUZJX1BOUF9TTEVFUCA9PSBwbnBTdGF0ZSkKKwl7CisJCWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtID0gdHJ1ZTsKKwkJaGFsYnRjODgxMmExYW50X0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKKwkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwkKKwl9CisJZWxzZSBpZihCVENfV0lGSV9QTlBfV0FLRV9VUCA9PSBwbnBTdGF0ZSkKKwl7CisJCQorCX0KK30KKwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfUGVyaW9kaWNhbCgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdAorCSkKK3sKKwlCT09MRUFOCQkJd2lmaV91bmRlcjVnPWZhbHNlOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQZXJpb2RpY2FsKCk9PT0+XG4iKSk7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgMUFudCBQZXJpb2RpY2FsISFcbiIpKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXI1Zyk7CisKKwlpZih3aWZpX3VuZGVyNWcpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBlcmlvZGljYWwoKSwgcmV0dXJuIGZvciA1Rzw9PT1cbiIpKTsKKwkJaGFsYnRjODgxMmExYW50X0NvZXhBbGxPZmYoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKworCWhhbGJ0Yzg4MTJhMWFudF9RdWVyeUJ0SW5mbyhidGNvZXhpc3QpOworCWhhbGJ0Yzg4MTJhMWFudF9Nb25pdG9yQnRDdHIoYnRjb2V4aXN0KTsKKwloYWxidGM4ODEyYTFhbnRfTW9uaXRvckJ0RW5hYmxlRGlzYWJsZShidGNvZXhpc3QpOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUGVyaW9kaWNhbCgpPD09PVxuIikpOworfQorCit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9EYmdDb250cm9sKAorCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAorCSAJdTFCeXRlCQkJCW9wQ29kZSwKKwkgCXUxQnl0ZQkJCQlvcExlbiwKKwkgCXB1MUJ5dGUJCQkJcERhdGEKKwkpCit7CisJc3dpdGNoKG9wQ29kZSkKKwl7CisJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9OT1JNQUw6CisJCQlidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gZmFsc2U7CisJCQloYWxidGM4ODEyYTFhbnRfSW5pdENvZXhEbShidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9XSUZJX09OTFk6CisJCQlidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gdHJ1ZTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKKwkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwkKKwkJCWJyZWFrOworCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfQlRfT05MWToKKwkJCS8vIHRvZG8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvSGFsQnRjODgxMmExQW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiZGFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5oCkBAIC0wLDAgKzEsMjA1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgZm9yIDg4MTJBXzFBTlQgQlQgQ28tZXhpc3QgZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lCUJUX0lORk9fODgxMkFfMUFOVF9CX0ZUUAkJCQkJCUJJVDcKKyNkZWZpbmUJQlRfSU5GT184ODEyQV8xQU5UX0JfQTJEUAkJCQkJQklUNgorI2RlZmluZQlCVF9JTkZPXzg4MTJBXzFBTlRfQl9ISUQJCQkJCQlCSVQ1CisjZGVmaW5lCUJUX0lORk9fODgxMkFfMUFOVF9CX1NDT19CVVNZCQkJCUJJVDQKKyNkZWZpbmUJQlRfSU5GT184ODEyQV8xQU5UX0JfQUNMX0JVU1kJCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzg4MTJBXzFBTlRfQl9JTlFfUEFHRQkJCQlCSVQyCisjZGVmaW5lCUJUX0lORk9fODgxMkFfMUFOVF9CX1NDT19FU0NPCQkJCUJJVDEKKyNkZWZpbmUJQlRfSU5GT184ODEyQV8xQU5UX0JfQ09OTkVDVElPTgkJCQlCSVQwCisKKyNkZWZpbmUJQlRfSU5GT184ODEyQV8xQU5UX0EyRFBfQkFTSUNfUkFURShfQlRfSU5GT19FWFRfKQlcCisJCSgoKF9CVF9JTkZPX0VYVF8mQklUMCkpPyB0cnVlOmZhbHNlKQorCisjZGVmaW5lCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84ODEyQV8xQU5UCQkyCisKKyNkZWZpbmUgIAorI2RlZmluZSBPVVQKKwordHlwZWRlZiBlbnVtIF9CVF9JTkZPX1NSQ184ODEyQV8xQU5UeworCUJUX0lORk9fU1JDXzg4MTJBXzFBTlRfV0lGSV9GVwkJCT0gMHgwLAorCUJUX0lORk9fU1JDXzg4MTJBXzFBTlRfQlRfUlNQCQkJCT0gMHgxLAorCUJUX0lORk9fU1JDXzg4MTJBXzFBTlRfQlRfQUNUSVZFX1NFTkQJCT0gMHgyLAorCUJUX0lORk9fU1JDXzg4MTJBXzFBTlRfTUFYCit9QlRfSU5GT19TUkNfODgxMkFfMUFOVCwqUEJUX0lORk9fU1JDXzg4MTJBXzFBTlQ7CisKK3R5cGVkZWYgZW51bSBfQlRfODgxMkFfMUFOVF9CVF9TVEFUVVN7CisJQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFCT0gMHgwLAorCUJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFCQk9IDB4MSwKKwlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRQkJCQk9IDB4MiwKKwlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWQkJCQk9IDB4MywKKwlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWQkJCQk9IDB4NCwKKwlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kJCQk9IDB4NSwKKwlCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19NQVgKK31CVF84ODEyQV8xQU5UX0JUX1NUQVRVUywqUEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX0JUXzg4MTJBXzFBTlRfQ09FWF9BTEdPeworCUJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1VOREVGSU5FRAkJCT0gMHgwLAorCUJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTwkJCQk9IDB4MSwKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQJCQkJPSAweDIsCisJQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUAkJCQk9IDB4MywKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTCQk9IDB4NCwKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFIJCQk9IDB4NSwKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5IUwkJCT0gMHg2LAorCUJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQCQk9IDB4NywKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElECQk9IDB4OCwKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFIJPSAweDksCisJQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFAJCQk9IDB4YSwKKwlCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19NQVgJCQkJPSAweGIsCit9QlRfODgxMkFfMUFOVF9DT0VYX0FMR08sKlBCVF84ODEyQV8xQU5UX0NPRVhfQUxHTzsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPRVhfRE1fODgxMkFfMUFOVHsKKwkvLyBmdyBtZWNoYW5pc20KKwlib29sCQlwcmVfZGVjX2J0X3B3cjsKKwlib29sCQljdXJfZGVjX2J0X3B3cjsKKwlib29sCQliUHJlQnRMbmFDb25zdHJhaW47CisJYm9vbAkJYkN1ckJ0TG5hQ29uc3RyYWluOworCXU4CQliUHJlQnRQc2RNb2RlOworCXU4CQliQ3VyQnRQc2RNb2RlOworCXU4CQlwcmVfZndfZGFjX3N3aW5nX2x2bDsKKwl1OAkJY3VyX2Z3X2RhY19zd2luZ19sdmw7CisJYm9vbAkJY3VyX2lnbm9yZV93bGFuX2FjdDsKKwlib29sCQlwcmVfaWdub3JlX3dsYW5fYWN0OworCXU4CQlwcmVfcHNfdGRtYTsKKwl1OAkJY3VyX3BzX3RkbWE7CisJdTgJCXBzX3RkbWFfcGFyYVs1XTsKKwl1OAkJcHNfdGRtYV9kdV9hZGpfdHlwZTsKKwlib29sCQlyZXNldF90ZG1hX2FkanVzdDsKKwlib29sCQlwcmVfcHNfdGRtYV9vbjsKKwlib29sCQljdXJfcHNfdGRtYV9vbjsKKwlib29sCQlwcmVfYnRfYXV0b19yZXBvcnQ7CisJYm9vbAkJY3VyX2J0X2F1dG9fcmVwb3J0OworCXU4CQlwcmVfbHBzOworCXU4CQljdXJfbHBzOworCXU4CQlwcmVfcnB3bTsKKwl1OAkJY3VyX3Jwd207CisKKwkvLyBzdyBtZWNoYW5pc20KKwlib29sCQlwcmVfcmZfcnhfbHBmX3NocmluazsKKwlib29sCQljdXJfcmZfcnhfbHBmX3NocmluazsKKwl1MzIJCWJ0X3JmMHgxZV9iYWNrdXA7CisJYm9vbCAJcHJlX2xvd19wZW5hbHR5X3JhOworCWJvb2wJCWN1cl9sb3dfcGVuYWx0eV9yYTsKKwlib29sCQlwcmVfZGFjX3N3aW5nX29uOworCXUzMgkJcHJlX2RhY19zd2luZ19sdmw7CisJYm9vbAkJY3VyX2RhY19zd2luZ19vbjsKKwl1MzIJCWN1cl9kYWNfc3dpbmdfbHZsOworCWJvb2wJCXByZV9hZGNfYmFja19vZmY7CisJYm9vbAkJY3VyX2FkY19iYWNrX29mZjsKKwlib29sIAlwcmVfYWdjX3RhYmxlX2VuOworCWJvb2wJCWN1cl9hZ2NfdGFibGVfZW47CisJdTMyCQlwcmVfdmFsMHg2YzA7CisJdTMyCQljdXJfdmFsMHg2YzA7CisJdTMyCQlwcmVfdmFsMHg2YzQ7CisJdTMyCQljdXJfdmFsMHg2YzQ7CisJdTMyCQlwcmVfdmFsMHg2Yzg7CisJdTMyCQljdXJfdmFsMHg2Yzg7CisJdTgJCXByZV92YWwweDZjYzsKKwl1OAkJY3VyX3ZhbDB4NmNjOworCWJvb2wJCWxpbWl0ZWRfZGlnOworCisJLy8gYWxnb3JpdGhtIHJlbGF0ZWQKKwl1OAkJcHJlX2FsZ29yaXRobTsKKwl1OAkJY3VyX2FsZ29yaXRobTsKKwl1OAkJYnRfc3RhdHVzOworCXU4CQl3aWZpX2NobmxfaW5mb1szXTsKKworCXU4CQllcnJvcl9jb25kaXRpb247Cit9IENPRVhfRE1fODgxMkFfMUFOVCwgKlBDT0VYX0RNXzg4MTJBXzFBTlQ7CisKK3R5cGVkZWYgc3RydWN0IF9DT0VYX1NUQV84ODEyQV8xQU5UeworCWJvb2wJCQkJCXVuZGVyX2xwczsKKwlib29sCQkJCQl1bmRlcl9pcHM7CisJdTMyCQkJCQloaWdoX3ByaW9yaXR5X3R4OworCXUzMgkJCQkJaGlnaF9wcmlvcml0eV9yeDsKKwl1MzIJCQkJCWxvd19wcmlvcml0eV90eDsKKwl1MzIJCQkJCWxvd19wcmlvcml0eV9yeDsKKwl1OAkJCQkJYnRfcnNzaTsKKwl1OAkJCQkJcHJlX2J0X3Jzc2lfc3RhdGU7CisJdTgJCQkJCXByZV93aWZpX3Jzc2lfc3RhdGVbNF07CisJYm9vbAkJCQkJYzJoX2J0X2luZm9fcmVxX3NlbnQ7CisJdTgJCQkJCWJ0X2luZm9fYzJoW0JUX0lORk9fU1JDXzg4MTJBXzFBTlRfTUFYXVsxMF07CisJdTMyCQkJCQlidF9pbmZvX2MyaF9jbnRbQlRfSU5GT19TUkNfODgxMkFfMUFOVF9NQVhdOworCWJvb2wJCQkJCWMyaF9idF9pbnF1aXJ5X3BhZ2U7CisJdTgJCQkJCWJ0X3JldHJ5X2NudDsKKwl1OAkJCQkJYnRfaW5mb19leHQ7Cit9Q09FWF9TVEFfODgxMkFfMUFOVCwgKlBDT0VYX1NUQV84ODEyQV8xQU5UOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgbm90aWZ5IGNvZXggbW9kdWxlLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9Jbml0SHdDb25maWcoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSk7Cit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfSXBzTm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAl1OAkJCXR5cGUKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfTHBzTm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAl1OAkJCXR5cGUKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfU2Nhbk5vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAorCSAJdTgJCQl0eXBlCisJKTsKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0Nvbm5lY3ROb3RpZnkoCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKKwkgCXU4CQkJdHlwZQorCSk7Cit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9NZWRpYVN0YXR1c05vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKKwkgCXU4CQkJCXR5cGUKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKKwkgCXU4CQkJCXR5cGUKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfQnRJbmZvTm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCisJIAl1OAkJCSp0bXBfYnVmLAorCSAJdTgJCQlsZW5ndGgKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCisJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QsCisJIAl1OAkJCQl0eXBlCisJKTsKK3ZvaWQKK0VYaGFsYnRjODgxMmExYW50X0hhbHROb3RpZnkoCisJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfUG5wTm90aWZ5KAorCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAorCSAJdTgJCQkJcG5wU3RhdGUKKwkpOwordm9pZAorRVhoYWxidGM4ODEyYTFhbnRfUGVyaW9kaWNhbCgKKwkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdAorCSk7Cit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9EaXNwbGF5Q29leEluZm8oCisJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAorCSk7Cit2b2lkCitFWGhhbGJ0Yzg4MTJhMWFudF9EYmdDb250cm9sKAorCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAorCSAJdTgJCQkJb3BDb2RlLAorCSAJdTgJCQkJb3BMZW4sCisJIAl1OCAJCQkJKnBEYXRhCisJKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTk5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jCkBAIC0wLDAgKzEsMTYxNCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgZmlsZSBpcyBmb3IgUlRMODcyM0EgQ28tZXhpc3QgbWVjaGFuaXNtCisvLworLy8gSGlzdG9yeQorLy8gMjAxMi8wOC8yMiBDb3NhIGZpcnN0IGNoZWNrIGluLgorLy8gMjAxMi8xMS8xNCBDb3NhIFJldmlzZSBmb3IgODcyM0EgMUFudCBvdXQgc291cmNpbmcuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGluY2x1ZGUgZmlsZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSAiTXBfUHJlY29tcC5oIgorI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHbG9iYWwgdmFyaWFibGVzLCB0aGVzZSBhcmUgc3RhdGljIHZhcmlhYmxlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBDT0VYX0RNXzg3MjNBXzFBTlQJR0xDb2V4RG04NzIzYTFBbnQ7CitzdGF0aWMgUENPRVhfRE1fODcyM0FfMUFOVCAJcENvZXhEbT0mR0xDb2V4RG04NzIzYTFBbnQ7CitzdGF0aWMgQ09FWF9TVEFfODcyM0FfMUFOVAlHTENvZXhTdGE4NzIzYTFBbnQ7CitzdGF0aWMgUENPRVhfU1RBXzg3MjNBXzFBTlQJcENvZXhTdGE9JkdMQ29leFN0YTg3MjNhMUFudDsKKworY29uc3QgY2hhciAqY29uc3QgR0xCdEluZm9TcmM4NzIzYTFBbnRbXT17CisJIkJUIEluZm9bd2lmaSBmd10iLAorCSJCVCBJbmZvW2J0IHJzcF0iLAorCSJCVCBJbmZvW2J0IGF1dG8gcmVwb3J0XSIsCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG8gdHlwZSBpZiBuZWVkZWQKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBoYWxidGM4NzIzYTFhbnRfCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVk9JRAoraGFsYnRjODcyM2ExYW50X1JlZzB4NTUwQml0MygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJTZXQKKwkpCit7CisJdTFCeXRlCXUxdG1wPTA7CisJCisJdTF0bXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDU1MCk7CisJaWYoYlNldCkKKwl7CisJCXUxdG1wIHw9IEJJVDM7CisJfQorCWVsc2UKKwl7CisJCXUxdG1wICY9IH5CSVQzOworCX0KKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg1NTAsIHUxdG1wKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHNldCAweDU1MFszXT0lZFxuIiwgKGJTZXQ/IDE6MCkpKTsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X05vdGlmeUZ3U2NhbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJc2NhblR5cGUKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OworCQorCWlmKEJUQ19TQ0FOX1NUQVJUID09IHNjYW5UeXBlKQorCQlIMkNfUGFyYW1ldGVyWzBdID0gMHgxOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIE5vdGlmeSBGVyBmb3Igd2lmaSBzY2FuLCB3cml0ZSAweDNiPTB4JXhcbiIsIAorCQlIMkNfUGFyYW1ldGVyWzBdKSk7CisKKwlwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgzYiwgMSwgSDJDX1BhcmFtZXRlcik7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9RdWVyeUJ0SW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OworCisJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKKworCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUMDsJLy8gdHJpZ2dlcgorCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIFF1ZXJ5IEJ0IEluZm8sIEZXIHdyaXRlIDB4Mzg9MHgleFxuIiwgCisJCUgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDM4LCAxLCBIMkNfUGFyYW1ldGVyKTsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X1NldFN3UmZSeExwZkNvcm5lcigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KKwkpCit7CisJaWYoYlJ4UmZTaHJpbmtPbikKKwl7CisJCS8vU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIDB4ZjBmZjcpOworCX0KKwllbHNlCisJeworCQkvL1Jlc3VtZSBSRiBSeCBMUEYgY29ybmVyCisJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCisJCWlmKHBCdENvZXhpc3QtPmluaXRpbGl6ZWQpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CisJCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgcENvZXhEbS0+YnRSZjB4MWVCYWNrdXApOworCQl9CisJfQorfQorCitWT0lECitoYWxidGM4NzIzYTFhbnRfUmZTaHJpbmsoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliUnhSZlNocmlua09uCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBSeCBSRiBTaHJpbmsgPSAlc1xuIiwgIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYlJ4UmZTaHJpbmtPbik/ICJPTiI6Ik9GRiIpKSk7CisJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlUmZSeExwZlNocmluaz0lZCwgYkN1clJmUnhMcGZTaHJpbms9JWRcbiIsIAorCQkJcENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmssIHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKSk7CisKKwkJaWYocENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmsgPT0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYTFhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKTsKKworCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKKwkpCit7CisJdTFCeXRlCXRtcFUxOworCisJdG1wVTEgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDRmZCk7CisJdG1wVTEgfD0gQklUMDsKKwlpZihiTG93UGVuYWx0eVJhKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CisJCXRtcFUxICY9IH5CSVQyOworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IG5vcm1hbCEhXG4iKSk7CisJCXRtcFUxIHw9IEJJVDI7CisJfQorCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9Mb3dQZW5hbHR5UmEoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliTG93UGVuYWx0eVJhCisJKQoreworCXJldHVybjsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gTG93UGVuYWx0eVJBID0gJXNcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEgPSBiTG93UGVuYWx0eVJhOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlTG93UGVuYWx0eVJhPSVkLCBiQ3VyTG93UGVuYWx0eVJhPSVkXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKKworCQlpZihwQ29leERtLT5iUHJlTG93UGVuYWx0eVJhID09IHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSk7CisKKwlwQ29leERtLT5iUHJlTG93UGVuYWx0eVJhID0gcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYTsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X1NldENvZXhUYWJsZSgKKwlJTglQQlRDX0NPRVhJU1QJcEJ0Q29leGlzdCwKKwlJTgl1NEJ5dGUJCXZhbDB4NmMwLAorCUlOCXU0Qnl0ZQkJdmFsMHg2YzgsCisJSU4JdTFCeXRlCQl2YWwweDZjYworCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjMD0weCV4XG4iLCB2YWwweDZjMCkpOworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjMCwgdmFsMHg2YzApOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Yzg9MHgleFxuIiwgdmFsMHg2YzgpKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgsIHZhbDB4NmM4KTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKSk7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9Db2V4VGFibGUoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCXU0Qnl0ZQkJCXZhbDB4NmMwLAorCUlOCXU0Qnl0ZQkJCXZhbDB4NmM4LAorCUlOCXUxQnl0ZQkJCXZhbDB4NmNjCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgd3JpdGUgQ29leCBUYWJsZSAweDZjMD0weCV4LCAweDZjOD0weCV4LCAweDZjYz0weCV4XG4iLCAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKSk7CisJcENvZXhEbS0+Y3VyVmFsMHg2YzAgPSB2YWwweDZjMDsKKwlwQ29leERtLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OworCXBDb2V4RG0tPmN1clZhbDB4NmNjID0gdmFsMHg2Y2M7CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIHByZVZhbDB4NmMwPTB4JXgsIHByZVZhbDB4NmM4PTB4JXgsIHByZVZhbDB4NmNjPTB4JXggISFcbiIsIAorCQkJcENvZXhEbS0+cHJlVmFsMHg2YzAsIHBDb2V4RG0tPnByZVZhbDB4NmM4LCBwQ29leERtLT5wcmVWYWwweDZjYykpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMD0weCV4LCBjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLCAKKwkJCXBDb2V4RG0tPmN1clZhbDB4NmMwLCBwQ29leERtLT5jdXJWYWwweDZjOCwgcENvZXhEbS0+Y3VyVmFsMHg2Y2MpKTsKKwkKKwkJaWYoIChwQ29leERtLT5wcmVWYWwweDZjMCA9PSBwQ29leERtLT5jdXJWYWwweDZjMCkgJiYKKwkJCShwQ29leERtLT5wcmVWYWwweDZjOCA9PSBwQ29leERtLT5jdXJWYWwweDZjOCkgJiYKKwkJCShwQ29leERtLT5wcmVWYWwweDZjYyA9PSBwQ29leERtLT5jdXJWYWwweDZjYykgKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYTFhbnRfU2V0Q29leFRhYmxlKHBCdENvZXhpc3QsIHZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpOworCisJcENvZXhEbS0+cHJlVmFsMHg2YzAgPSBwQ29leERtLT5jdXJWYWwweDZjMDsKKwlwQ29leERtLT5wcmVWYWwweDZjOCA9IHBDb2V4RG0tPmN1clZhbDB4NmM4OworCXBDb2V4RG0tPnByZVZhbDB4NmNjID0gcENvZXhEbS0+Y3VyVmFsMHg2Y2M7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRW5hYmxlCisJKQoreworCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKKwkJCisJaWYoYkVuYWJsZSkKKwl7CisJCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUMDsJCS8vIGZ1bmN0aW9uIGVuYWJsZQorCX0KKwkKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgc2V0IEZXIGZvciBCVCBJZ25vcmUgV2xhbl9BY3QsIEZXIHdyaXRlIDB4MjU9MHgleFxuIiwgCisJCUgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDI1LCAxLCBIMkNfUGFyYW1ldGVyKTsJCit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9JZ25vcmVXbGFuQWN0KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYkVuYWJsZQorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIChiRW5hYmxlPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0ID0gYkVuYWJsZTsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0LCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCkpOworCisJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYTFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOworCisJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QgPSBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdDsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlLAorCUlOCXUxQnl0ZQkJCWJ5dGUxLAorCUlOCXUxQnl0ZQkJCWJ5dGUyLAorCUlOCXUxQnl0ZQkJCWJ5dGUzLAorCUlOCXUxQnl0ZQkJCWJ5dGU0LAorCUlOCXUxQnl0ZQkJCWJ5dGU1CisJKQoreworCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbNV0gPXswfTsKKwl1MUJ5dGUJCQlyZWFsQnl0ZTE9Ynl0ZTEsIHJlYWxCeXRlNT1ieXRlNTsKKwlCT09MRUFOCQkJYkFwRW5hYmxlPUZBTFNFOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQVBfTU9ERV9FTkFCTEUsICZiQXBFbmFibGUpOworCisJLy8gYnl0ZTFbMTowXSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEKKwkvLyBmb3IgMkFudCBidCBjb2V4aXN0LCBpZiBieXRlMSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEKKwlpZihieXRlMSkKKwl7CisJCWlmKGJBcEVuYWJsZSkKKwkJeworCQkJaWYodHlwZSAhPSA1ICYmIHR5cGUgIT0gMTIpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgRlcgZm9yIDFBbnQgQVAgbW9kZVxuIikpOworCQkJCXJlYWxCeXRlMSAmPSB+QklUNDsKKwkJCQlyZWFsQnl0ZTEgfD0gQklUNTsKKworCQkJCXJlYWxCeXRlNSB8PSBCSVQ1OworCQkJCXJlYWxCeXRlNSAmPSB+QklUNjsKKwkJCX0KKwkJfQorCX0KKwlIMkNfUGFyYW1ldGVyWzBdID0gcmVhbEJ5dGUxOwkKKwlIMkNfUGFyYW1ldGVyWzFdID0gYnl0ZTI7CQorCUgyQ19QYXJhbWV0ZXJbMl0gPSBieXRlMzsKKwlIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CisJSDJDX1BhcmFtZXRlcls0XSA9IHJlYWxCeXRlNTsKKworCXBDb2V4RG0tPnBzVGRtYVBhcmFbMF0gPSByZWFsQnl0ZTE7CisJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOworCXBDb2V4RG0tPnBzVGRtYVBhcmFbMl0gPSBieXRlMzsKKwlwQ29leERtLT5wc1RkbWFQYXJhWzNdID0gYnl0ZTQ7CisJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IHJlYWxCeXRlNTsKKwkKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKKwkJSDJDX1BhcmFtZXRlclswXSwgCisJCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOworCisJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4M2EsIDUsIEgyQ19QYXJhbWV0ZXIpOworfQorCitWT0lECitoYWxidGM4NzIzYTFhbnRfUHNUZG1hKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYlR1cm5PbiwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgdHVybiAlcyBQUyBURE1BLCB0eXBlPSVkXG4iLCAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoYlR1cm5Pbj8gIk9OIjoiT0ZGIiksIHR5cGUpKTsJCQorCXBDb2V4RG0tPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247CisJcENvZXhEbS0+Y3VyUHNUZG1hID0gdHlwZTsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsIAorCQkJcENvZXhEbS0+YlByZVBzVGRtYU9uLCBwQ29leERtLT5iQ3VyUHNUZG1hT24pKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlUHNUZG1hID0gJWQsIGN1clBzVGRtYSA9ICVkISFcbiIsIAorCQkJcENvZXhEbS0+cHJlUHNUZG1hLCBwQ29leERtLT5jdXJQc1RkbWEpKTsKKworCQlpZiggKHBDb2V4RG0tPmJQcmVQc1RkbWFPbiA9PSBwQ29leERtLT5iQ3VyUHNUZG1hT24pICYmCisJCQkocENvZXhEbS0+cHJlUHNUZG1hID09IHBDb2V4RG0tPmN1clBzVGRtYSkgKQorCQkJcmV0dXJuOworCX0JCisJaWYocENvZXhEbS0+YkN1clBzVGRtYU9uKQorCXsKKwkJc3dpdGNoKHBDb2V4RG0tPmN1clBzVGRtYSkKKwkJeworCQkJY2FzZSAxOgorCQkJZGVmYXVsdDoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgxYSwgMHgxYSwgMHgwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgxMiwgMHgxMiwgMHgwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgzZiwgMHgzLCAweDEwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgxNSwgMHgzLCAweDEwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweGE5LCAweDE1LCAweDMsIDB4MzUsIDB4YzApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIDg6IAorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDk6IAorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweGEsIDB4YSwgMHgwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CQorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweGEsIDB4YSwgMHgwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CQorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweDUsIDB4NSwgMHgwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4YTksIDB4YSwgMHgzLCAweDE1LCAweGMwKTsKKwkJCQlicmVhazsKKwkKKwkJCWNhc2UgMTg6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKKwkJCQlicmVhazsJCQkKKworCQkJY2FzZSAyMDoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgyYSwgMHgyYSwgMHgwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyMToKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgyMCwgMHgzLCAweDEwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjI6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4MWEsIDB4MWEsIDB4MiwgMHg0MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIzOgorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweDEyLCAweDEyLCAweDIsIDB4NDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyNDoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHhhLCAweGEsIDB4MiwgMHg0MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI1OgorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweDUsIDB4NSwgMHgyLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjY6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjc6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4NSwgMHg1LCAweDIsIDB4NDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyODoKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgzLCAweDJmLCAweDJmLCAweDAsIDB4MCk7CisJCQkJYnJlYWs7CisKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBkaXNhYmxlIFBTIHRkbWEKKwkJc3dpdGNoKHBDb2V4RG0tPmN1clBzVGRtYSkKKwkJeworCQkJY2FzZSA4OgorCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCk7CQkKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCWRlZmF1bHQ6CisJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKKwkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUocEJ0Q29leGlzdCwgMHg4NjAsIDB4MjEwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgOToKKwkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDApOworCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShwQnRDb2V4aXN0LCAweDg2MCwgMHgxMTApOworCQkJCWJyZWFrOworCisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcHJlIHN0YXRlCisJcENvZXhEbS0+YlByZVBzVGRtYU9uID0gcENvZXhEbS0+YkN1clBzVGRtYU9uOworCXBDb2V4RG0tPnByZVBzVGRtYSA9IHBDb2V4RG0tPmN1clBzVGRtYTsKK30KKworCitWT0lECitoYWxidGM4NzIzYTFhbnRfQ29leEFsbE9mZigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJLy8gZncgYWxsIG9mZgorCWhhbGJ0Yzg3MjNhMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCisJLy8gc3cgYWxsIG9mZgorCWhhbGJ0Yzg3MjNhMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKworCS8vIGh3IGFsbCBvZmYKKwloYWxidGM4NzIzYTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9Jbml0Q29leERtKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwkvLyBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbQorCWhhbGJ0Yzg3MjNhMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X0J0RW5hYmxlQWN0aW9uKAorCUlOIAlQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJaGFsYnRjODcyM2ExYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOworfQorCitWT0lECitoYWxidGM4NzIzYTFhbnRfTW9uaXRvckJ0Q3RyKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1NEJ5dGUgCQkJcmVnSFBUeFJ4LCByZWdMUFR4UngsIHU0VG1wOworCXU0Qnl0ZQkJCXJlZ0hQVHg9MCwgcmVnSFBSeD0wLCByZWdMUFR4PTAsIHJlZ0xQUng9MDsKKwl1MUJ5dGUJCQl1MVRtcDsKKwkKKwlyZWdIUFR4UnggPSAweDc3MDsKKwlyZWdMUFR4UnggPSAweDc3NDsKKworCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnSFBUeFJ4KTsKKwlyZWdIUFR4ID0gdTRUbXAgJiBNQVNLTFdPUkQ7CisJcmVnSFBSeCA9ICh1NFRtcCAmIE1BU0tIV09SRCk+PjE2OworCisJdTRUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCByZWdMUFR4UngpOworCXJlZ0xQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKKwlyZWdMUFJ4ID0gKHU0VG1wICYgTUFTS0hXT1JEKT4+MTY7CisJCQorCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9IHJlZ0hQVHg7CisJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKKwlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9IHJlZ0xQVHg7CisJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPSByZWdMUFJ4OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEhpZ2ggUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0weCV4KCVkKS8weCV4KCVkKVxuIiwgCisJCXJlZ0hQVHhSeCwgcmVnSFBUeCwgcmVnSFBUeCwgcmVnSFBSeCwgcmVnSFBSeCkpOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBMb3cgUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0weCV4KCVkKS8weCV4KCVkKVxuIiwgCisJCXJlZ0xQVHhSeCwgcmVnTFBUeCwgcmVnTFBUeCwgcmVnTFBSeCwgcmVnTFBSeCkpOworCisJLy8gcmVzZXQgY291bnRlcgorCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc2ZSwgMHhjKTsKK30KKworVk9JRAoraGFsYnRjODcyM2ExYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUoCisJSU4gCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlzdGF0aWMgQk9PTEVBTgliUHJlQnREaXNhYmxlZD1GQUxTRTsKKwlzdGF0aWMgdTRCeXRlCWJ0RGlzYWJsZUNudD0wOworCUJPT0xFQU4JCQliQnRBY3RpdmU9dHJ1ZSwgYkJ0RGlzYWJsZWQ9RkFMU0U7CisKKwkvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGJ0IGlzIGRpc2FibGVkCisJCisJaWYoCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9PSAwICYmCisJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID09IDAgJiYKKwkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPT0gMCkKKwl7CisJCWJCdEFjdGl2ZSA9IEZBTFNFOworCX0KKwlpZigJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgorCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPT0gMHhmZmZmICYmCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCA9PSAweGZmZmYpCisJeworCQliQnRBY3RpdmUgPSBGQUxTRTsKKwl9CisJaWYoYkJ0QWN0aXZlKQorCXsKKwkJYnREaXNhYmxlQ250ID0gMDsKKwkJYkJ0RGlzYWJsZWQgPSBGQUxTRTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZiQnREaXNhYmxlZCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkICEhXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCWJ0RGlzYWJsZUNudCsrOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgYnQgYWxsIGNvdW50ZXJzPTAsICVkIHRpbWVzISFcbiIsIAorCQkJCWJ0RGlzYWJsZUNudCkpOworCQlpZihidERpc2FibGVDbnQgPj0gMikKKwkJeworCQkJYkJ0RGlzYWJsZWQgPSB0cnVlOworCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZiQnREaXNhYmxlZCk7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWQgISFcbiIpKTsKKwkJfQorCX0KKwlpZihiUHJlQnREaXNhYmxlZCAhPSBiQnREaXNhYmxlZCkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsIAorCQkJKGJQcmVCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLCAKKwkJCShiQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSkpOworCQliUHJlQnREaXNhYmxlZCA9IGJCdERpc2FibGVkOworCQlpZighYkJ0RGlzYWJsZWQpCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMWFudF9CdEVuYWJsZUFjdGlvbihwQnRDb2V4aXN0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTk9STUFMX0xQUywgTlVMTCk7CisJCX0KKwl9Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMWFudF9UZG1hRHVyYXRpb25BZGp1c3QoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXN0YXRpYyBzNEJ5dGUJCXVwLGRuLG0sbixXYWl0Q291bnQ7CisJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KKwl1MUJ5dGUJCQlyZXRyeUNvdW50PTA7CisJdTFCeXRlCQkJYnRTdGF0ZTsKKwlCT09MRUFOCQkJYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKKwl1NEJ5dGUJCQl3aWZpQnc7CisJCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCWJ0U3RhdGUgPSBwQ29leERtLT5idFN0YXR1czsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0KClcbiIpKTsKKwlpZihwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQgIT0gcENvZXhEbS0+cHNUZG1hTW9uaXRvckNudCkKKwl7CisJCXBDb2V4RG0tPnBzVGRtYU1vbml0b3JDbnQgPSAwOworCQlwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQgPSAwOworCX0KKwlpZihwQ29leERtLT5wc1RkbWFNb25pdG9yQ250ID09IDApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGZpcnN0IHJ1biBCVCBBMkRQICsgV2lGaSBidXN5IHN0YXRlISFcbiIpKTsKKwkJaWYoYnRTdGF0ZSA9PSBCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9PTkxZX0JVU1kpCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOworCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIyKTsKKwkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIyOworCQl9CisJCS8vPT09PT09PT09PT09CisJCXVwID0gMDsKKwkJZG4gPSAwOworCQltID0gMTsKKwkJbj0gMzsKKwkJcmVzdWx0ID0gMDsKKwkJV2FpdENvdW50ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy9hY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgorCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CisJCXJlc3VsdCA9IDA7CisJCVdhaXRDb3VudCsrOyAKKwkJICAKKwkJaWYocmV0cnlDb3VudCA9PSAwKSAgLy8gbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXArKzsKKwkJCWRuLS07CisKKwkJCWlmIChkbiA8PSAwKQorCQkJCWRuID0gMDsgCQkJIAorCisJCQlpZih1cCA+PSBuKSAvLyBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQlXYWl0Q291bnQgPSAwOyAKKwkJCQluID0gMzsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCXJlc3VsdCA9IDE7IAorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSW5jcmVhc2Ugd2lmaSBkdXJhdGlvbiEhXG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocmV0cnlDb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXAtLTsgCisJCQlkbisrOworCisJCQlpZiAodXAgPD0gMCkKKwkJCQl1cCA9IDA7CisKKwkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQlpZiAoV2FpdENvdW50IDw9IDIpCisJCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJCWVsc2UKKwkJCQkJbSA9IDE7CisKKwkJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQkJbSA9IDIwOworCisJCQkJbiA9IDMqbTsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCVdhaXRDb3VudCA9IDA7CQorCQkJCXJlc3VsdCA9IC0xOyAKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcjwzISFcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlICAvL3JldHJ5IGNvdW50ID4gMywgpXWtbjGmuCByZXRyeSBjb3VudCA+IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJeworCQkJaWYgKFdhaXRDb3VudCA9PSAxKQorCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJZWxzZQorCQkJCW0gPSAxOworCisJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQltID0gMjA7CisKKwkJCW4gPSAzKm07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQlXYWl0Q291bnQgPSAwOyAKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7CisJCX0KKwkJCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQlQgVHhSeCBjb3VudGVyIEgrTCA8PSAxMjAwXG4iKSk7CisJCQlpZihidFN0YXRlICE9IEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX09OTFlfQlVTWSkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIE5PVCBBQ0wgb25seSBidXN5IVxuIikpOworCQkJCWlmKEJUQ19XSUZJX0JXX0hUNDAgIT0gd2lmaUJ3KQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCAyME1IelxuIikpOworCQkJCQlpZihyZXN1bHQgPT0gLTEpCisJCQkJCXsKKwkJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyMikKKwkJCQkJCXsKKwkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyMyk7CisJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjM7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyMykKKwkJCQkJCXsKKwkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNCk7CisJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjQ7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyNCkKKwkJCQkJCXsKKwkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNSk7CisJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjU7CisJCQkJCQl9CisJCQkJCX0gCisJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQorCQkJCQl7CisJCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjUpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjQpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI0OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjQpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjMpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIzOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjMpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjIpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIyOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vIGVycm9yIGhhbmRsZSwgaWYgbm90IGluIHRoZSBmb2xsb3dpbmcgc3RhdGUsCisJCQkJCS8vIHNldCBwc1RkbWEgYWdhaW4uCisJCQkJCWlmKCAocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDIyKSAmJgorCQkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyMykgJiYKKwkJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjQpICYmCisJCQkJCQkocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDI1KSApCisJCQkJCXsKKwkJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgZHVyYXRpb24gY2FzZSBvdXQgb2YgaGFuZGxlISFcbiIpKTsKKwkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIzKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIzOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgNDBNSHpcbiIpKTsKKwkJCQkJaWYocmVzdWx0ID09IC0xKQorCQkJCQl7CisJCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjMpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjQpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI0OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjQpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjUpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjUpCisJCQkJCQl7CisJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjcpOworCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI3OworCQkJCQkJfQorCQkJCQl9IAorCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKKwkJCQkJeworCQkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDI3KQorCQkJCQkJeworCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI1KTsKKwkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDI1KQorCQkJCQkJeworCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI0KTsKKwkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDI0KQorCQkJCQkJeworCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIzKTsKKwkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyMzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBlcnJvciBoYW5kbGUsIGlmIG5vdCBpbiB0aGUgZm9sbG93aW5nIHN0YXRlLAorCQkJCQkvLyBzZXQgcHNUZG1hIGFnYWluLgorCQkJCQlpZiggKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyMykgJiYKKwkJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjQpICYmCisJCQkJCQkocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDI1KSAmJgorCQkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyNykgKQorCQkJCQl7CisJCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGR1cmF0aW9uIGNhc2Ugb3V0IG9mIGhhbmRsZSEhXG4iKSk7CisJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFDTCBvbmx5IGJ1c3lcbiIpKTsKKwkJCQlpZiAocmVzdWx0ID09IC0xKQorCQkJCXsKKwkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gZXJyb3IgaGFuZGxlLCBpZiBub3QgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZSwKKwkJCQkvLyBzZXQgcHNUZG1hIGFnYWluLgorCQkJCWlmKCAocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDEpICYmCisJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMikgJiYKKwkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSA5KSAmJgorCQkJCQkocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDExKSApCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGR1cmF0aW9uIGNhc2Ugb3V0IG9mIGhhbmRsZSEhXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNvcmRlZCBvbmUgKHdoZW4gc2NhbiwgZGhjcC4uLiksIAorCS8vIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkIG9uZS4KKwlpZihwQ29leERtLT5jdXJQc1RkbWEgIT0gcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hPSVkLCByZWNvcmRQc1RkbWE9JWRcbiIsIAorCQkJcENvZXhEbS0+Y3VyUHNUZG1hLCBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpKTsKKworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOworCisJCWlmKCAhYlNjYW4gJiYgIWJMaW5rICYmCSFiUm9hbSkKKwkJeworCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgcm9hbWluZy9saW5rL3NjYW4gaXMgdW5kZXIgcHJvZ3Jlc3MsIHdpbGwgYWRqdXN0IG5leHQgdGltZSEhIVxuIikpOworCQl9CisJfQorCXBDb2V4RG0tPnBzVGRtYU1vbml0b3JDbnQrKzsKK30KKworCitWT0lECitoYWxidGM4NzIzYTFhbnRfQ29leEZvcldpZmlDb25uZWN0KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYldpZmlCdXN5PUZBTFNFOworCXUxQnl0ZQkJYnRTdGF0ZSwgYnRJbmZvT3JpZ2luYWw9MDsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKworCWJ0U3RhdGUgPSBwQ29leERtLT5idFN0YXR1czsKKwlidEluZm9PcmlnaW5hbCA9IHBDb2V4U3RhLT5idEluZm9DMmhbQlRfSU5GT19TUkNfODcyM0FfMUFOVF9CVF9SU1BdWzBdOworCisJaWYoYldpZmlDb25uZWN0ZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgY29ubmVjdGVkISFcbiIpKTsKKwkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CisJCQorCQlpZiggIWJXaWZpQnVzeSAmJgorCQkJKChCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT04gPT0gYnRTdGF0ZSkgfHwKKwkJCShCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRSA9PSBidFN0YXRlKSkgKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFtXaWZpIGlzIGlkbGVdIG9yIFtCdCBpcyBub24gY29ubmVjdGVkIGlkbGUgb3IgQnQgaXMgY29ubmVjdGVkIGlkbGVdISFcbiIpKTsKKworCQkJaWYoQlRfU1RBVEVfODcyM0FfMUFOVF9OT19DT05ORUNUSU9OID09IGJ0U3RhdGUpCisJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOworCQkJZWxzZSBpZihCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRSA9PSBidFN0YXRlKQorCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKKworCQkJcEJ0Q29leGlzdC0+YnRjX3NldEJiUmVnKHBCdENvZXhpc3QsIDB4ODgwLCAweGZmMDAwMDAwLCAweGMwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCAoQlRfU1RBVEVfODcyM0FfMUFOVF9TQ09fT05MWV9CVVNZID09IGJ0U3RhdGUpIHx8CisJCQkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX1NDT19CVVNZID09IGJ0U3RhdGUpIHx8CisJCQkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX0JVU1kgPT0gYnRTdGF0ZSkgfHwKKwkJCQkoQlRfU1RBVEVfODcyM0FfMUFOVF9ISURfU0NPX0JVU1kgPT0gYnRTdGF0ZSkgKQorCQkJeworCQkJCXBCdENvZXhpc3QtPmJ0Y19zZXRCYlJlZyhwQnRDb2V4aXN0LCAweDg4MCwgMHhmZjAwMDAwMCwgMHg2MCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEJ0Q29leGlzdC0+YnRjX3NldEJiUmVnKHBCdENvZXhpc3QsIDB4ODgwLCAweGZmMDAwMDAwLCAweGMwKTsKKwkJCX0KKwkJCXN3aXRjaChidFN0YXRlKQorCQkJeworCQkJCWNhc2UgQlRfU1RBVEVfODcyM0FfMUFOVF9OT19DT05ORUNUSU9OOgorCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRToKKwkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfSU5RX09SX1BBRzoKKwkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfU0NPX09OTFlfQlVTWToKKwkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX1NDT19CVVNZOgorCQkJCWNhc2UgQlRfU1RBVEVfODcyM0FfMUFOVF9ISURfQlVTWToKKwkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX1NDT19CVVNZOgorCQkJCQloYWxidGM4NzIzYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX09OTFlfQlVTWToKKwkJCQkJaWYgKGJ0SW5mb09yaWdpbmFsJkJUX0lORk9fODcyM0FfMUFOVF9CX0EyRFApCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihidEluZm9PcmlnaW5hbCZCVF9JTkZPXzg3MjNBXzFBTlRfQl9GVFApCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIChidEluZm9PcmlnaW5hbCZCVF9JTkZPXzg3MjNBXzFBTlRfQl9BMkRQKSAmJgorCQkJCQkJCShidEluZm9PcmlnaW5hbCZCVF9JTkZPXzg3MjNBXzFBTlRfQl9GVFApICkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGVycm9yISEhLCB1bmRlZmluZWQgY2FzZSBpbiBoYWxidGM4NzIzYTFhbnRfQ29leEZvcldpZmlDb25uZWN0KCkhIVxuIikpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgZGlzY29ubmVjdGVkISFcbiIpKTsKKwl9CisKKwlwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQrKzsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHdvcmsgYXJvdW5kIGZ1bmN0aW9uIHN0YXJ0IHdpdGggd2FfaGFsYnRjODcyM2ExYW50XworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZPSUQKK3dhX2hhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQzJoKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCXRtcDFiPTB4MDsKKwl1NEJ5dGUJY3VyQzJoVG90YWxDbnQ9MHgwOworCXN0YXRpYyB1NEJ5dGUJcHJlQzJoVG90YWxDbnQ9MHgwLCBzYW1lQ250UG9sbGluZ1RpbWU9MHgwOworCisJY3VyQzJoVG90YWxDbnQrPXBDb2V4U3RhLT5idEluZm9DMmhDbnRbQlRfSU5GT19TUkNfODcyM0FfMUFOVF9CVF9SU1BdOworCisJaWYoY3VyQzJoVG90YWxDbnQgPT0gcHJlQzJoVG90YWxDbnQpCisJeworCQlzYW1lQ250UG9sbGluZ1RpbWUrKzsKKwl9CisJZWxzZQorCXsKKwkJcHJlQzJoVG90YWxDbnQgPSBjdXJDMmhUb3RhbENudDsKKwkJc2FtZUNudFBvbGxpbmdUaW1lID0gMDsKKwl9CisKKwlpZihzYW1lQ250UG9sbGluZ1RpbWUgPj0gMikKKwl7CisJCXRtcDFiID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYpOworCQlpZih0bXAxYiAhPSAweDApCisJCXsKKwkJCXBDb2V4U3RhLT5jMmhIYW5nRGV0ZWN0Q250Kys7CisJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYsIDB4MCk7CisJCX0KKwl9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBFWGhhbGJ0Yzg3MjNhMWFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9Jbml0SHdDb25maWcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCAxQW50IEluaXQgSFcgQ29uZmlnISFcbiIpKTsKKworCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCisJcENvZXhEbS0+YnRSZjB4MWVCYWNrdXAgPSAKKwkJcEJ0Q29leGlzdC0+YnRjX2dldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOworCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NDAsIDB4MjApOworCisJLy8gZW5hYmxlIGNvdW50ZXIgc3RhdGlzdGljcworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc2ZSwgMHg0KTsKKwkKKwkvLyBjb2V4IHRhYmxlCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjLCAweDApOwkJCS8vIDEtQW50IGNvZXgKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgsIDB4ZmZmZik7CQkvLyB3aWZpIGJyZWFrIHRhYmxlCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0LCAweDU1NTU1NTU1KTsJLy9jb2V4IHRhYmxlCisKKwkvLyBhbnRlbm5hIHN3aXRjaCBjb250cm9sIHBhcmFtZXRlcgorCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDg1OCwgMHhhYWFhYWFhYSk7CisJCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzJieXRlKHBCdENvZXhpc3QsIDB4ODYwLCAweDIxMCk7CS8vc2V0IGFudGVubmEgYXQgd2lmaSBzaWRlIGlmIEFOVFNXIGlzIHNvZnR3YXJlIGNvbnRyb2wKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg4NzAsIDB4MzAwKTsJLy9TUERUKGNvbm5lY3RlZCB3aXRoIFRSU1cpIGNvbnRyb2wgYnkgaGFyZHdhcmUgUFRBCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4ODc0LCAweDIyODA0MDAwKTsJLy9BTlRTVyBrZWVwIGJ5IEdOVF9CVAorCisJLy8gY29leGlzdGVuY2UgcGFyYW1ldGVycworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCwgMHgxKTsJLy8gZW5hYmxlIFJUSyBtb2RlIFBUQQorfQorCitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9Jbml0Q29leERtKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQ29leCBNZWNoYW5pc20gSW5pdCEhXG4iKSk7CisJCisJaGFsYnRjODcyM2ExYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0Rpc3BsYXlDb2V4SW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJc3RydWN0IGJ0Y19ib2FyZF9pbmZvICoJCXBCb2FyZEluZm89JnBCdENvZXhpc3QtPmJvYXJkX2luZm87CisJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOworCXB1MUJ5dGUJCQkJY2xpQnVmPXBCdENvZXhpc3QtPmNsaV9idWY7CisJdTFCeXRlCQkJCXUxVG1wWzRdLCBpLCBidEluZm9FeHQsIHBzVGRtYUNhc2U9MDsKKwl1NEJ5dGUJCQkJdTRUbXBbNF07CisJQk9PTEVBTgkJCQliUm9hbT1GQUxTRSwgYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiV2lmaVVuZGVyNUc9RkFMU0U7CisJQk9PTEVBTgkJCQliQnRIc09uPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CisJczRCeXRlCQkJCXdpZmlSc3NpPTAsIGJ0SHNSc3NpPTA7CisJdTRCeXRlCQkJCXdpZmlCdywgd2lmaVRyYWZmaWNEaXI7CisJdTFCeXRlCQkJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0Nobmw7CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQlQgQ29leGlzdCBpbmZvXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJaWYoIXBCb2FyZEluZm8tPmJ0X2V4aXN0KQorCXsKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiQW50IFBHIG51bWJlci8gQW50IG1lY2hhbmlzbToiLCBcCisJCXBCb2FyZEluZm8tPnBnX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X251bSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCQorCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCXsKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiW0FjdGlvbiBNYW51YWwgY29udHJvbF0hISIpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwl9CisJCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKKwkJKChwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKT8gIlllcyI6Ik5vIiksIHBTdGFja0luZm8tPmhjaVZlcnNpb24pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsICZ3aWZpRG90MTFDaG5sKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9IU19DSE5MLCAmd2lmaUhzQ2hubCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLCBcCisJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0NobmwsIGJCdEhzT24pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAiLCAiSDJDIFdpZmkgaW5mb3JtIGJ0IGNobmwgSW5mbyIsIFwKKwkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzBdLCBwQ29leERtLT53aWZpQ2hubEluZm9bMV0sCisJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1syXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRIc1Jzc2kpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIldpZmkgcnNzaS8gSFMgcnNzaSIsIFwKKwkJd2lmaVJzc2ksIGJ0SHNSc3NpKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLCAiV2lmaSBiTGluay8gYlJvYW0vIGJTY2FuIiwgXAorCQliTGluaywgYlJvYW0sIGJTY2FuKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLCAmYldpZmlVbmRlcjVHKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT04sICZ3aWZpVHJhZmZpY0Rpcik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVzLyAlcyAiLCAiV2lmaSBzdGF0dXMiLCBcCisJCShiV2lmaVVuZGVyNUc/ICI1RyI6IjIuNEciKSwKKwkJKChCVENfV0lGSV9CV19MRUdBQ1k9PXdpZmlCdyk/ICJMZWdhY3kiOiAoKChCVENfV0lGSV9CV19IVDQwPT13aWZpQncpPyAiSFQ0MCI6IkhUMjAiKSkpLAorCQkoKCFiV2lmaUJ1c3kpPyAiaWRsZSI6ICgoQlRDX1dJRklfVFJBRkZJQ19UWD09d2lmaVRyYWZmaWNEaXIpPyAidXBsaW5rIjoiZG93bmxpbmsiKSkpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsIFwKKwkJKChwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKTooKEJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpPyAiaWRsZSI6KCAgKEJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKT8gImNvbm5lY3RlZC1pZGxlIjoiYnVzeSIpKSksCisJCXBDb2V4U3RhLT5idFJzc2ksIHBDb2V4U3RhLT5idFJldHJ5Q250KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwlpZihwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKQorCXsJCQkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwgXAorCQkJcFN0YWNrSW5mby0+YlNjb0V4aXN0LCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QsIHBTdGFja0luZm8tPmJQYW5FeGlzdCwgcFN0YWNrSW5mby0+YkEyZHBFeGlzdCk7CisJCUNMX1BSSU5URihjbGlCdWYpOwkKKworCQlwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOworCX0KKworCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyIsICJCVCBJbmZvIEEyRFAgcmF0ZSIsIFwKKwkJKGJ0SW5mb0V4dCZCSVQwKT8gIkJhc2ljIHJhdGUiOiJFRFIgcmF0ZSIpOworCUNMX1BSSU5URihjbGlCdWYpOwkKKworCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODcyM0FfMUFOVF9NQVg7IGkrKykKKwl7CisJCWlmKHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pCisJCXsJCQkJCisJCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngoJWQpIiwgR0xCdEluZm9TcmM4NzIzYTFBbnRbaV0sIFwKKwkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzBdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzFdLAorCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMl0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bM10sCisJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs0XSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs1XSwKKwkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzZdLCBwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKTsKKwkJCUNMX1BSSU5URihjbGlCdWYpOworCQl9CisJfQorCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCIsICJ3cml0ZSAweDFhZj0weDAgbnVtIiwgXAorCQlwQ29leFN0YS0+YzJoSGFuZ0RldGVjdENudCk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJCisJLy8gU3cgbWVjaGFuaXNtCQorCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkIiwgIlNNMVtTaFJmLyBMcFJBLyBMaW1EaWddIiwgXAorCQlwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaywgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSwgcENvZXhEbS0+bGltaXRlZF9kaWcpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJLy8gRncgbWVjaGFuaXNtCQkKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bRncgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlCdWYpOwkKKwkKKwlpZighcEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlwc1RkbWFDYXNlID0gcENvZXhEbS0+Y3VyUHNUZG1hOworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBjYXNlLSVkIiwgIlBTIFRETUEiLCBcCisJCQlwQ29leERtLT5wc1RkbWFQYXJhWzBdLCBwQ29leERtLT5wc1RkbWFQYXJhWzFdLAorCQkJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSwgcENvZXhEbS0+cHNUZG1hUGFyYVszXSwKKwkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbNF0sIHBzVGRtYUNhc2UpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAiLCAiSWduV2xhbkFjdCIsIFwKKwkJCXBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJfQorCisJLy8gSHcgc2V0dGluZwkJCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIlJGLUEsIDB4MWUgaW5pdFZhbCIsIFwKKwkJcENvZXhEbS0+YnRSZjB4MWVCYWNrdXApOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCk7CisJdTFUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc4Myk7CisJdTFUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc5Nik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwgIjB4Nzc4LyAweDc4My8gMHg3OTYiLCBcCisJCXUxVG1wWzBdLCB1MVRtcFsxXSwgdTFUbXBbMl0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDg4MCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4ODgwIiwgXAorCQl1NFRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NDApOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQwIiwgXAorCQl1MVRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NTUwKTsKKwl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NTIyKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg1NTAoYmNuIGN0cmwpLzB4NTIyIiwgXAorCQl1NFRtcFswXSwgdTFUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDQ4NCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4NDg0KHJhdGUgYWRhcHRpdmUpIiwgXAorCQl1NFRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4YzUwKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHhjNTAoZGlnKSIsIFwKKwkJdTRUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhMCk7CisJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhNCk7CisJdTRUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhOCk7CisJdTRUbXBbM10gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhYyk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4ZGEwLzB4ZGE0LzB4ZGE4LzB4ZGFjKEZBIGNudCkiLCBcCisJCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0sIHU0VG1wWzNdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzApOworCXU0VG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzQpOworCXU0VG1wWzJdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgpOworCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleC8gMHgleCIsICIweDZjMC8weDZjNC8weDZjOC8weDZjYyhjb2V4VGFibGUpIiwgXAorCQl1NFRtcFswXSwgdTRUbXBbMV0sIHU0VG1wWzJdLCB1MVRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3MCAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKKwkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4LCBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgpOworCUNMX1BSSU5URihjbGlCdWYpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4LCBwQ29leFN0YS0+bG93UHJpb3JpdHlUeCk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwkvLyBUeCBtZ250IHF1ZXVlIGhhbmcgb3Igbm90LCAweDQxYiBzaG91bGQgPSAweGYsIGV4OiAweGQgPT0+aGFuZworCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MWIpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQxYiAobWdudFEgaGFuZyBjaGsgPT0gMHhmKSIsIFwKKwkJdTFUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOwkKKworCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cit9CisKKworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfSXBzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCWlmKEJUQ19JUFNfRU5URVIgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBFTlRFUiBub3RpZnlcbiIpKTsKKwkJaGFsYnRjODcyM2ExYW50X0NvZXhBbGxPZmYocEJ0Q29leGlzdCk7CisJfQorCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIExFQVZFIG5vdGlmeVxuIikpOworCQkvL2hhbGJ0Yzg3MjNhMWFudF9Jbml0Q29leERtKHBCdENvZXhpc3QpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfTHBzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCWlmKEJUQ19MUFNfRU5BQkxFID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIikpOworCX0KKwllbHNlIGlmKEJUQ19MUFNfRElTQUJMRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIERJU0FCTEUgbm90aWZ5XG4iKSk7CisJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X1NjYW5Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpCit7CisJQk9PTEVBTgkJYldpZmlDb25uZWN0ZWQ9RkFMU0U7CisJCisJaGFsYnRjODcyM2ExYW50X05vdGlmeUZ3U2NhbihwQnRDb2V4aXN0LCB0eXBlKTsKKworCWlmKHBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCkKKwl7CisJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsgCisJfQorCWVsc2UKKwl7CisJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKwkJaWYoQlRDX1NDQU5fU1RBUlQgPT0gdHlwZSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpKTsKKwkJCWlmKCFiV2lmaUNvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJCQl7CisJCQkJLy9zZXQgMHg1NTBbM109MSBiZWZvcmUgUHNUZG1hCisJCQkJaGFsYnRjODcyM2ExYW50X1JlZzB4NTUwQml0MyhwQnRDb2V4aXN0LCB0cnVlKTsKKwkJCX0KKworCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CisJCX0KKwkJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBGSU5JU0ggbm90aWZ5XG4iKSk7CisJCQlpZighYldpZmlDb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsgCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODcyM2ExYW50X0NvZXhGb3JXaWZpQ29ubmVjdChwQnRDb2V4aXN0KTsKKwkJCX0KKwkJfQorCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfQ29ubmVjdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRTsKKwkJCisJaWYocEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkKQorCXsKKwkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOyAKKwl9CisJZWxzZQorCXsKKwkJaWYoQlRDX0FTU09DSUFURV9TVEFSVCA9PSB0eXBlKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOworCQkJLy9zZXQgMHg1NTBbM109MSBiZWZvcmUgUHNUZG1hCisJCQloYWxidGM4NzIzYTFhbnRfUmVnMHg1NTBCaXQzKHBCdENvZXhpc3QsIHRydWUpOworCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CS8vIGV4dGVuZCB3aWZpIHNsb3QJCisJCX0KKwkJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpKTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKwkJCWlmKCFiV2lmaUNvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJCQl7CisJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMWFudF9Db2V4Rm9yV2lmaUNvbm5lY3QocEJ0Q29leGlzdCk7CisJCQl9CisJCX0KKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X01lZGlhU3RhdHVzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJaWYoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGNvbm5lY3Qgbm90aWZ5XG4iKSk7CisJfQorCWVsc2UKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKSk7CisJfQorfQorCitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9TcGVjaWFsUGFja2V0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJaWYodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBESENQIFBhY2tldCBub3RpZnlcbiIpKTsKKwkJaWYocEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkKQorCQl7CisJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOSk7CQorCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTgpOworCQl9CQkKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0J0SW5mb05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKKwlJTgl1MUJ5dGUJCQlsZW5ndGgKKwkpCit7CisJdTFCeXRlCQkJYnRJbmZvPTA7CisJdTFCeXRlCQkJaSwgcnNwU291cmNlPTA7CisJQk9PTEVBTgkJCWJCdEhzT249RkFMU0UsIGJCdEJ1c3k9RkFMU0UsIGJGb3JjZUxwcz1GQUxTRTsKKworCXBDb2V4U3RhLT5iQzJoQnRJbmZvUmVxU2VudCA9IEZBTFNFOworCQorCXJzcFNvdXJjZSA9IEJUX0lORk9fU1JDXzg3MjNBXzFBTlRfQlRfUlNQOworCXBDb2V4U3RhLT5idEluZm9DMmhDbnRbcnNwU291cmNlXSsrOworCisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsIHJzcFNvdXJjZSwgbGVuZ3RoKSk7CisJZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwl7CisJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVtpXSA9IHRtcEJ1ZltpXTsKKwkJaWYoaSA9PSAwKQorCQkJYnRJbmZvID0gdG1wQnVmW2ldOworCQlpZihpID09IGxlbmd0aC0xKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTAyeF1cbiIsIHRtcEJ1ZltpXSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUwMngsICIsIHRtcEJ1ZltpXSkpOworCQl9CisJfQorCisJaWYoQlRfSU5GT19TUkNfODcyM0FfMUFOVF9XSUZJX0ZXICE9IHJzcFNvdXJjZSkKKwl7CisJCXBDb2V4U3RhLT5idFJldHJ5Q250ID0KKwkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVsxXTsKKworCQlwQ29leFN0YS0+YnRSc3NpID0KKwkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVsyXSoyKzEwOworCisJCXBDb2V4U3RhLT5idEluZm9FeHQgPSAKKwkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVszXTsKKwl9CisJCQorCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKKwkvLyBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbgorCWlmKGJ0SW5mbyAmIEJUX0lORk9fODcyM0FfMUFOVF9CX0lOUV9QQUdFKQorCXsKKwkJcENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJcENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlID0gRkFMU0U7CisJfQorCWJ0SW5mbyAmPSB+QklUMjsKKwlpZighKGJ0SW5mbyAmIEJJVDApKQorCXsKKwkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT047CisJCWJGb3JjZUxwcyA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQliRm9yY2VMcHMgPSB0cnVlOworCQlpZihidEluZm8gPT0gMHgxKQorCQl7CisJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfQ09OTkVDVF9JRExFOworCQl9CisJCWVsc2UgaWYoYnRJbmZvID09IDB4OSkKKwkJeworCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9PTkxZX0JVU1k7CisJCQliQnRCdXN5ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKGJ0SW5mbyA9PSAweDEzKQorCQl7CisJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfU0NPX09OTFlfQlVTWTsKKwkJCWJCdEJ1c3kgPSB0cnVlOworCQl9CisJCWVsc2UgaWYoYnRJbmZvID09IDB4MWIpCisJCXsKKwkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfU1RBVEVfODcyM0FfMUFOVF9BQ0xfU0NPX0JVU1k7CisJCQliQnRCdXN5ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKGJ0SW5mbyA9PSAweDI5KQorCQl7CisJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX0JVU1k7CisJCQliQnRCdXN5ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKGJ0SW5mbyA9PSAweDNiKQorCQl7CisJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX1NDT19CVVNZOworCQkJYkJ0QnVzeSA9IHRydWU7CisJCX0KKwl9CisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwgJmJCdEJ1c3kpOworCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmJCdEJ1c3kpOworCWlmKGJGb3JjZUxwcykKKwkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOworCWVsc2UKKwkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9OT1JNQUxfTFBTLCBOVUxMKTsKKworCWlmKCAoQlRfU1RBVEVfODcyM0FfMUFOVF9OT19DT05ORUNUSU9OID09IHBDb2V4RG0tPmJ0U3RhdHVzKSB8fAorCQkoQlRfU1RBVEVfODcyM0FfMUFOVF9DT05ORUNUX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKKwkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfU1RBVEVfODcyM0FfMUFOVF9JTlFfT1JfUEFHOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSkKK3sKKwlpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9TVEFSVCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBzdGFydCBub3RpZnlcbiIpKTsKKwl9CisJZWxzZSBpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9GSU5JU0ggPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgZmluaXNoIG5vdGlmeVxuIikpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfSGFsdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CisJKQoreworCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UsIDApOworCQorCWhhbGJ0Yzg3MjNhMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMWFudF9SZlNocmluayhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CisKKwloYWxidGM4NzIzYTFhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKKwlFWGhhbGJ0Yzg3MjNhMWFudF9NZWRpYVN0YXR1c05vdGlmeShwQnRDb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X1BlcmlvZGljYWwoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAorCSkKK3sKKwlCT09MRUFOCQliU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJSb2FtPUZBTFNFLCBiV2lmaUNvbm5lY3RlZD1GQUxTRTsKKwkKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCAxQW50IFBlcmlvZGljYWwhIVxuIikpOworCQorCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKworCS8vIHdvcmsgYXJvdW5kIGZvciBjMmggaGFuZworCXdhX2hhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQzJoKHBCdENvZXhpc3QpOwkKKworCWhhbGJ0Yzg3MjNhMWFudF9RdWVyeUJ0SW5mbyhwQnRDb2V4aXN0KTsKKwloYWxidGM4NzIzYTFhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOworCWhhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKHBCdENvZXhpc3QpOworCisJCisJaWYoYlNjYW4pCisJCXJldHVybjsKKwlpZihiTGluaykKKwkJcmV0dXJuOworCisJaWYoYldpZmlDb25uZWN0ZWQpCisJeworCQlpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsKKwkJCQorCQkJaGFsYnRjODcyM2ExYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2ExYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTFhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJCWhhbGJ0Yzg3MjNhMWFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2ExYW50X0NvZXhGb3JXaWZpQ29ubmVjdChwQnRDb2V4aXN0KTsKKwkJfQorCX0KKwllbHNlCisJeworCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisKKwkJaGFsYnRjODcyM2ExYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwl9Cit9CisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTkyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5oCkBAIC0wLDAgKzEsMTc2IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgZm9yIDg3MjNBIDFBbnQgQlQgQ28tZXhpc3QgZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lCUJUX0lORk9fODcyM0FfMUFOVF9CX0ZUUAkJCQkJCUJJVDcKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8xQU5UX0JfQTJEUAkJCQkJQklUNgorI2RlZmluZQlCVF9JTkZPXzg3MjNBXzFBTlRfQl9ISUQJCQkJCQlCSVQ1CisjZGVmaW5lCUJUX0lORk9fODcyM0FfMUFOVF9CX1NDT19CVVNZCQkJCUJJVDQKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8xQU5UX0JfQUNMX0JVU1kJCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzg3MjNBXzFBTlRfQl9JTlFfUEFHRQkJCQlCSVQyCisjZGVmaW5lCUJUX0lORk9fODcyM0FfMUFOVF9CX1NDT19FU0NPCQkJCUJJVDEKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8xQU5UX0JfQ09OTkVDVElPTgkJCQlCSVQwCisKK3R5cGVkZWYgZW51bSBfQlRfU1RBVEVfODcyM0FfMUFOVHsKKwlCVF9TVEFURV84NzIzQV8xQU5UX0RJU0FCTEVECQkJCT0gMCwKKwlCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT04JCT0gMSwKKwlCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRQkJPSAyLAorCUJUX1NUQVRFXzg3MjNBXzFBTlRfSU5RX09SX1BBRwkJCT0gMywKKwlCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9PTkxZX0JVU1kJCT0gNCwKKwlCVF9TVEFURV84NzIzQV8xQU5UX1NDT19PTkxZX0JVU1kJCT0gNSwKKwlCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9TQ09fQlVTWQkJCT0gNiwKKwlCVF9TVEFURV84NzIzQV8xQU5UX0hJRF9CVVNZCQkJCT0gNywKKwlCVF9TVEFURV84NzIzQV8xQU5UX0hJRF9TQ09fQlVTWQkJCT0gOCwKKwlCVF9TVEFURV84NzIzQV8xQU5UX01BWAorfUJUX1NUQVRFXzg3MjNBXzFBTlQsICpQQlRfU1RBVEVfODcyM0FfMUFOVDsKKworI2RlZmluZQkJQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzFBTlQJCTIKKwordHlwZWRlZiBlbnVtIF9CVF9JTkZPX1NSQ184NzIzQV8xQU5UeworCUJUX0lORk9fU1JDXzg3MjNBXzFBTlRfV0lGSV9GVwkJCT0gMHgwLAorCUJUX0lORk9fU1JDXzg3MjNBXzFBTlRfQlRfUlNQCQkJCT0gMHgxLAorCUJUX0lORk9fU1JDXzg3MjNBXzFBTlRfQlRfQUNUSVZFX1NFTkQJCT0gMHgyLAorCUJUX0lORk9fU1JDXzg3MjNBXzFBTlRfTUFYCit9QlRfSU5GT19TUkNfODcyM0FfMUFOVCwqUEJUX0lORk9fU1JDXzg3MjNBXzFBTlQ7CisKK3R5cGVkZWYgZW51bSBfQlRfODcyM0FfMUFOVF9CVF9TVEFUVVN7CisJQlRfODcyM0FfMUFOVF9CVF9TVEFUVVNfSURMRQkJCQk9IDB4MCwKKwlCVF84NzIzQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRQk9IDB4MSwKKwlCVF84NzIzQV8xQU5UX0JUX1NUQVRVU19OT05fSURMRQkJCT0gMHgyLAorCUJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTX01BWAorfUJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTLCpQQlRfODcyM0FfMUFOVF9CVF9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfQlRfODcyM0FfMUFOVF9DT0VYX0FMR097CisJQlRfODcyM0FfMUFOVF9DT0VYX0FMR09fVU5ERUZJTkVECQkJPSAweDAsCisJQlRfODcyM0FfMUFOVF9DT0VYX0FMR09fU0NPCQkJCT0gMHgxLAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX0hJRAkJCQk9IDB4MiwKKwlCVF84NzIzQV8xQU5UX0NPRVhfQUxHT19BMkRQCQkJCT0gMHgzLAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUgkJCT0gMHg0LAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX1BBTkhTCQkJPSAweDUsCisJQlRfODcyM0FfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFAJCT0gMHg2LAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQJCT0gMHg3LAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUgk9IDB4OCwKKwlCVF84NzIzQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUAkJCT0gMHg5LAorCUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPX01BWAorfUJUXzg3MjNBXzFBTlRfQ09FWF9BTEdPLCpQQlRfODcyM0FfMUFOVF9DT0VYX0FMR087CisKK3R5cGVkZWYgc3RydWN0IF9DT0VYX0RNXzg3MjNBXzFBTlR7CisJLy8gZncgbWVjaGFuaXNtCisJQk9PTEVBTgkJYkN1cklnbm9yZVdsYW5BY3Q7CisJQk9PTEVBTgkJYlByZUlnbm9yZVdsYW5BY3Q7CisJdTFCeXRlCQlwcmVQc1RkbWE7CisJdTFCeXRlCQljdXJQc1RkbWE7CisJdTFCeXRlCQlwc1RkbWFQYXJhWzVdOworCXUxQnl0ZQkJcHNUZG1hRHVBZGpUeXBlOworCXU0Qnl0ZQkJcHNUZG1hTW9uaXRvckNudDsKKwl1NEJ5dGUJCXBzVGRtYUdsb2JhbENudDsKKwlCT09MRUFOCQliUmVzZXRUZG1hQWRqdXN0OworCUJPT0xFQU4JCWJQcmVQc1RkbWFPbjsKKwlCT09MRUFOCQliQ3VyUHNUZG1hT247CisKKwkvLyBzdyBtZWNoYW5pc20KKwlCT09MRUFOCQliUHJlUmZSeExwZlNocmluazsKKwlCT09MRUFOCQliQ3VyUmZSeExwZlNocmluazsKKwl1NEJ5dGUJCWJ0UmYweDFlQmFja3VwOworCUJPT0xFQU4gCWJQcmVMb3dQZW5hbHR5UmE7CisJQk9PTEVBTgkJYkN1ckxvd1BlbmFsdHlSYTsKKwl1NEJ5dGUJCXByZVZhbDB4NmMwOworCXU0Qnl0ZQkJY3VyVmFsMHg2YzA7CisJdTRCeXRlCQlwcmVWYWwweDZjODsKKwl1NEJ5dGUJCWN1clZhbDB4NmM4OworCXUxQnl0ZQkJcHJlVmFsMHg2Y2M7CisJdTFCeXRlCQljdXJWYWwweDZjYzsKKwlCT09MRUFOCQlsaW1pdGVkX2RpZzsKKworCS8vIGFsZ29yaXRobSByZWxhdGVkCisJdTFCeXRlCQlwcmVBbGdvcml0aG07CisJdTFCeXRlCQljdXJBbGdvcml0aG07CisJdTFCeXRlCQlidFN0YXR1czsKKwl1MUJ5dGUJCXdpZmlDaG5sSW5mb1szXTsKK30gQ09FWF9ETV84NzIzQV8xQU5ULCAqUENPRVhfRE1fODcyM0FfMUFOVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPRVhfU1RBXzg3MjNBXzFBTlR7CisJdTRCeXRlCQkJCQloaWdoUHJpb3JpdHlUeDsKKwl1NEJ5dGUJCQkJCWhpZ2hQcmlvcml0eVJ4OworCXU0Qnl0ZQkJCQkJbG93UHJpb3JpdHlUeDsKKwl1NEJ5dGUJCQkJCWxvd1ByaW9yaXR5Ung7CisJdTFCeXRlCQkJCQlidFJzc2k7CisJdTFCeXRlCQkJCQlwcmVCdFJzc2lTdGF0ZTsKKwl1MUJ5dGUJCQkJCXByZUJ0UnNzaVN0YXRlMTsKKwl1MUJ5dGUJCQkJCXByZVdpZmlSc3NpU3RhdGVbNF07CisJQk9PTEVBTgkJCQkJYkMyaEJ0SW5mb1JlcVNlbnQ7CisJdTFCeXRlCQkJCQlidEluZm9DMmhbQlRfSU5GT19TUkNfODcyM0FfMUFOVF9NQVhdWzEwXTsKKwl1NEJ5dGUJCQkJCWJ0SW5mb0MyaENudFtCVF9JTkZPX1NSQ184NzIzQV8xQU5UX01BWF07CisJQk9PTEVBTgkJCQkJYkMyaEJ0SW5xdWlyeVBhZ2U7CisJdTFCeXRlCQkJCQlidFJldHJ5Q250OworCXUxQnl0ZQkJCQkJYnRJbmZvRXh0OworCS8vQk9PTEVBTgkJCQkJYkhvbGRGb3JTdGFja09wZXJhdGlvbjsKKwkvL3UxQnl0ZQkJCQkJYkhvbGRQZXJpb2RDbnQ7CisJLy8gdGhpcyBpcyBmb3IgYzJoIGhhbmcgd29yay1hcm91bmQKKwl1NEJ5dGUJCQkJCWMyaEhhbmdEZXRlY3RDbnQ7Cit9Q09FWF9TVEFfODcyM0FfMUFOVCwgKlBDT0VYX1NUQV84NzIzQV8xQU5UOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgbm90aWZ5IGNvZXggbW9kdWxlLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9Jbml0SHdDb25maWcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0luaXRDb2V4RG0oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0lwc05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9McHNOb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfU2Nhbk5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9Db25uZWN0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X01lZGlhU3RhdHVzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0J0SW5mb05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKKwlJTgl1MUJ5dGUJCQlsZW5ndGgKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMWFudF9IYWx0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTFhbnRfUGVyaW9kaWNhbCgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2ExYW50X0Rpc3BsYXlDb2V4SW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidF9wcmVjb21wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidF9wcmVjb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzOGJhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0X3ByZWNvbXAuaApAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX19IQUxCVF9QUkVDT01QX0hfXworI2RlZmluZSBfX0hBTEJUX1BSRUNPTVBfSF9fCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgIi4uL2VmdXNlLmgiCisjaW5jbHVkZSAiLi4vYmFzZS5oIgorI2luY2x1ZGUgIi4uL3JlZ2QuaCIKKyNpbmNsdWRlICIuLi9jYW0uaCIKKyNpbmNsdWRlICIuLi9wcy5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgIi4uL3J0bDg4MjFhZS9yZWcuaCIKKyNpbmNsdWRlICIuLi9ydGw4ODIxYWUvZGVmLmgiCisjaW5jbHVkZSAiLi4vcnRsODgyMWFlL3BoeS5oIgorI2luY2x1ZGUgIi4uL3J0bDg4MjFhZS9kbS5oIgorI2luY2x1ZGUgIi4uL3J0bDg4MjFhZS9mdy5oIgorI2luY2x1ZGUgIi4uL3J0bDg4MjFhZS9sZWQuaCIKKyNpbmNsdWRlICIuLi9ydGw4ODIxYWUvaHcuaCIKKyNpbmNsdWRlICIuLi9ydGw4ODIxYWUvcHdyc2VxY21kLmgiCisjaW5jbHVkZSAiLi4vcnRsODgyMWFlL3B3cnNlcS5oIgorCisjaW5jbHVkZSAiaGFsYnRjb3V0c3JjLmgiCisKKworI2luY2x1ZGUgImhhbGJ0YzgxOTJlMmFudC5oIgorI2luY2x1ZGUgImhhbGJ0Yzg3MjNiMWFudC5oIgorI2luY2x1ZGUgImhhbGJ0Yzg3MjNiMmFudC5oIgorCisKKworI2RlZmluZSBHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlcikJcGFkYXB0ZXIKKworCisjZGVmaW5lIEJJVDAJMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxCTB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMgkweDAwMDAwMDA0CisjZGVmaW5lIEJJVDMJMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0CTB4MDAwMDAwMTAKKyNkZWZpbmUgQklUNQkweDAwMDAwMDIwCisjZGVmaW5lIEJJVDYJMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3CTB4MDAwMDAwODAKKyNkZWZpbmUgQklUOAkweDAwMDAwMTAwCisjZGVmaW5lIEJJVDkJMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMAkweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExCTB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIJMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMwkweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0CTB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUJMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNgkweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3CTB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTgJMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOQkweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwCTB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEJMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMgkweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQJMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNQkweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2CTB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcJMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOAkweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5CTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAJMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMQkweDgwMDAwMDAwCisKKyNkZWZpbmUJTUFTS0JZVEUwICAgICAgICAgICAgICAgIAkweGZmCisjZGVmaW5lCU1BU0tCWVRFMSAgICAgICAgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCU1BU0tCWVRFMiAgICAgICAgICAgICAgICAJMHhmZjAwMDAKKyNkZWZpbmUJTUFTS0JZVEUzICAgICAgICAgICAgICAgIAkweGZmMDAwMDAwCisjZGVmaW5lCU1BU0tIV09SRCAgICAgICAgICAgICAgICAJMHhmZmZmMDAwMAorI2RlZmluZQlNQVNLTFdPUkQgICAgICAgICAgICAgICAgCTB4MDAwMGZmZmYKKyNkZWZpbmUJTUFTS0RXT1JECQkJMHhmZmZmZmZmZgorI2RlZmluZQlNQVNLMTJCSVRTCQkJMHhmZmYKKyNkZWZpbmUJTUFTS0g0QklUUwkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTUFTS09GRE1fRAkJCTB4ZmZjMDAwMDAKKyNkZWZpbmUJTUFTS0NDSwkJCQkweDNmM2YzZjNmCisKKyNlbmRpZgkvKiBfX0hBTEJUX1BSRUNPTVBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2QwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYwpAQCAtMCwwICsxLDM4OTEgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIGZpbGUgaXMgZm9yIDgxOTJlMWFudCBDby1leGlzdCBtZWNoYW5pc20KKy8vCisvLyBIaXN0b3J5CisvLyAyMDEyLzExLzE1IENvc2EgZmlyc3QgY2hlY2sgaW4uCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGluY2x1ZGUgZmlsZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSAiTXBfUHJlY29tcC5oIgorI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHbG9iYWwgdmFyaWFibGVzLCB0aGVzZSBhcmUgc3RhdGljIHZhcmlhYmxlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBDT0VYX0RNXzgxOTJFXzFBTlQJCUdMQ29leERtODE5MmUxQW50Oworc3RhdGljIFBDT0VYX0RNXzgxOTJFXzFBTlQgCXBDb2V4RG09JkdMQ29leERtODE5MmUxQW50Oworc3RhdGljIENPRVhfU1RBXzgxOTJFXzFBTlQJCUdMQ29leFN0YTgxOTJlMUFudDsKK3N0YXRpYyBQQ09FWF9TVEFfODE5MkVfMUFOVAlwQ29leFN0YT0mR0xDb2V4U3RhODE5MmUxQW50OworCitjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzgxOTJlMUFudFtdPXsKKwkiQlQgSW5mb1t3aWZpIGZ3XSIsCisJIkJUIEluZm9bYnQgcnNwXSIsCisJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKK307CisKK3U0Qnl0ZQlHTENvZXhWZXJEYXRlODE5MmUxQW50PTIwMTMwNzI5OwordTRCeXRlCUdMQ29leFZlcjgxOTJlMUFudD0weDEwOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG8gdHlwZSBpZiBuZWVkZWQKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBoYWxidGM4MTkyZTFhbnRfCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordTFCeXRlCitoYWxidGM4MTkyZTFhbnRfQnRSc3NpU3RhdGUoCisJdTFCeXRlCQkJbGV2ZWxOdW0sCisJdTFCeXRlCQkJcnNzaVRocmVzaCwKKwl1MUJ5dGUJCQlyc3NpVGhyZXNoMQorCSkKK3sKKwlzNEJ5dGUJCQlidFJzc2k9MDsKKwl1MUJ5dGUJCQlidFJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CisKKwlidFJzc2kgPSBwQ29leFN0YS0+YnRSc3NpOworCisJaWYobGV2ZWxOdW0gPT0gMikKKwl7CQkJCisJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQorCQl7CisJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzFBTlQpKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCisJCQl7CisJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYobGV2ZWxOdW0gPT0gMykKKwl7CisJCWlmKHJzc2lUaHJlc2ggPiByc3NpVGhyZXNoMSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgdGhyZXNoIGVycm9yISFcbiIpKTsKKwkJCXJldHVybiBwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CisJCX0KKwkJCisJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQorCQl7CisJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzFBTlQpKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCQkocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKKwkJeworCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoMStCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMUFOVCkpCisJCQl7CisJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlIGlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCisJCQl7CisJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gxKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKKwkJCX0KKwkJfQorCX0KKwkJCisJcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID0gYnRSc3NpU3RhdGU7CisKKwlyZXR1cm4gYnRSc3NpU3RhdGU7Cit9CisKK3UxQnl0ZQoraGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCWluZGV4LAorCUlOCXUxQnl0ZQkJCWxldmVsTnVtLAorCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gsCisJSU4JdTFCeXRlCQkJcnNzaVRocmVzaDEKKwkpCit7CisJczRCeXRlCQkJd2lmaVJzc2k9MDsKKwl1MUJ5dGUJCQl3aWZpUnNzaVN0YXRlPXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpUnNzaSk7CisJCisJaWYobGV2ZWxOdW0gPT0gMikKKwl7CisJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQorCQl7CisJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMUFOVCkpCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoKQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKGxldmVsTnVtID09IDMpCisJeworCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIikpOworCQkJcmV0dXJuIHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKKwkJfQorCQkKKwkJaWYoIChwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCisJCXsKKwkJCWlmKHdpZmlSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKKwkJCXsKKwkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIChwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCisJCXsKKwkJCWlmKHdpZmlSc3NpID49IChyc3NpVGhyZXNoMStCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMUFOVCkpCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CisJCQl9CisJCQllbHNlIGlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaCkKKwkJCXsKKwkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoMSkKKwkJCXsKKwkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisJCQorCXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9IHdpZmlSc3NpU3RhdGU7CisKKwlyZXR1cm4gd2lmaVJzc2lTdGF0ZTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1VwZGF0ZXJhX21hc2soCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQkJYkZvcmNlRXhlYywKKwlJTgl1MUJ5dGUJCQkJdHlwZSwKKwlJTgl1NEJ5dGUJCQkJcmF0ZU1hc2sKKwkpCit7CisJaWYoQlRDX1JBVEVfRElTQUJMRSA9PSB0eXBlKQorCXsKKwkJcENvZXhEbS0+Y3VycmFfbWFzayB8PSByYXRlTWFzazsJCS8vIGRpc2FibGUgcmF0ZQorCX0KKwllbHNlIGlmKEJUQ19SQVRFX0VOQUJMRSA9PSB0eXBlKQorCXsKKwkJcENvZXhEbS0+Y3VycmFfbWFzayAmPSB+cmF0ZU1hc2s7CS8vIGVuYWJsZSByYXRlCisJfQorCQorCWlmKCBiRm9yY2VFeGVjIHx8IChwQ29leERtLT5wcmVyYV9tYXNrICE9IHBDb2V4RG0tPmN1cnJhX21hc2spKQorCXsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9VUERBVEVfcmFfbWFzaywgJnBDb2V4RG0tPmN1cnJhX21hc2spOworCX0KKwlwQ29leERtLT5wcmVyYV9tYXNrID0gcENvZXhEbS0+Y3VycmFfbWFzazsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X01vbml0b3JCdEN0cigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTRCeXRlIAkJCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKKwl1NEJ5dGUJCQlyZWdIUFR4PTAsIHJlZ0hQUng9MCwgcmVnTFBUeD0wLCByZWdMUFJ4PTA7CisJdTFCeXRlCQkJdTFUbXA7CisJCisJcmVnSFBUeFJ4ID0gMHg3NzA7CisJcmVnTFBUeFJ4ID0gMHg3NzQ7CisKKwl1NFRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIHJlZ0hQVHhSeCk7CisJcmVnSFBUeCA9IHU0VG1wICYgTUFTS0xXT1JEOworCXJlZ0hQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKKworCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnTFBUeFJ4KTsKKwlyZWdMUFR4ID0gdTRUbXAgJiBNQVNLTFdPUkQ7CisJcmVnTFBSeCA9ICh1NFRtcCAmIE1BU0tIV09SRCk+PjE2OworCQkKKwlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPSByZWdIUFR4OworCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9IHJlZ0hQUng7CisJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPSByZWdMUFR4OworCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBIaWdoIFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsIAorCQlyZWdIUFR4UngsIHJlZ0hQVHgsIHJlZ0hQVHgsIHJlZ0hQUngsIHJlZ0hQUngpKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgTG93IFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsIAorCQlyZWdMUFR4UngsIHJlZ0xQVHgsIHJlZ0xQVHgsIHJlZ0xQUngsIHJlZ0xQUngpKTsKKworCS8vIHJlc2V0IGNvdW50ZXIKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NmUsIDB4Yyk7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9RdWVyeUJ0SW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OworCisJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKKworCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUMDsJLy8gdHJpZ2dlcgorCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIFF1ZXJ5IEJ0IEluZm8sIEZXIHdyaXRlIDB4NjE9MHgleFxuIiwgCisJCUgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDYxLCAxLCBIMkNfUGFyYW1ldGVyKTsKK30KKworQk9PTEVBTgoraGFsYnRjODE5MmUxYW50X0lzV2lmaVN0YXR1c0NoYW5nZWQoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXN0YXRpYyBCT09MRUFOCWJQcmVXaWZpQnVzeT1GQUxTRSwgYlByZVVuZGVyNHdheT1GQUxTRSwgYlByZUJ0SHNPbj1GQUxTRTsKKwlCT09MRUFOCWJXaWZpQnVzeT1GQUxTRSwgYlVuZGVyNHdheT1GQUxTRSwgYkJ0SHNPbj1GQUxTRTsKKwlCT09MRUFOCWJXaWZpQ29ubmVjdGVkPUZBTFNFOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZiV2lmaUJ1c3kpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV80X1dBWV9QUk9HUkVTUywgJmJVbmRlcjR3YXkpOworCisJaWYoYldpZmlDb25uZWN0ZWQpCisJeworCQlpZihiV2lmaUJ1c3kgIT0gYlByZVdpZmlCdXN5KQorCQl7CisJCQliUHJlV2lmaUJ1c3kgPSBiV2lmaUJ1c3k7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZihiVW5kZXI0d2F5ICE9IGJQcmVVbmRlcjR3YXkpCisJCXsKKwkJCWJQcmVVbmRlcjR3YXkgPSBiVW5kZXI0d2F5OworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYoYkJ0SHNPbiAhPSBiUHJlQnRIc09uKQorCQl7CisJCQliUHJlQnRIc09uID0gYkJ0SHNPbjsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfVXBkYXRlQnRMaW5rSW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKworCXBCdExpbmtJbmZvLT5iQnRMaW5rRXhpc3QgPSBwQ29leFN0YS0+YkJ0TGlua0V4aXN0OworCXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgPSBwQ29leFN0YS0+YlNjb0V4aXN0OworCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ID0gcENvZXhTdGEtPmJBMmRwRXhpc3Q7CisJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCA9IHBDb2V4U3RhLT5iUGFuRXhpc3Q7CisJcEJ0TGlua0luZm8tPmJIaWRFeGlzdCA9IHBDb2V4U3RhLT5iSGlkRXhpc3Q7CisKKwkvLyBjaGVjayBpZiBTY28gb25seQorCWlmKCBwQnRMaW5rSW5mby0+YlNjb0V4aXN0ICYmCisJCSFwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCAmJgorCQkhcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgorCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCisJCXBCdExpbmtJbmZvLT5iU2NvT25seSA9IHRydWU7CisJZWxzZQorCQlwQnRMaW5rSW5mby0+YlNjb09ubHkgPSBGQUxTRTsKKworCS8vIGNoZWNrIGlmIEEyZHAgb25seQorCWlmKCAhcEJ0TGlua0luZm8tPmJTY29FeGlzdCAmJgorCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCAmJgorCQkhcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgorCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCisJCXBCdExpbmtJbmZvLT5iQTJkcE9ubHkgPSB0cnVlOworCWVsc2UKKwkJcEJ0TGlua0luZm8tPmJBMmRwT25seSA9IEZBTFNFOworCisJLy8gY2hlY2sgaWYgUGFuIG9ubHkKKwlpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKKwkJIXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCisJCXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKKwkJIXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQorCQlwQnRMaW5rSW5mby0+YlBhbk9ubHkgPSB0cnVlOworCWVsc2UKKwkJcEJ0TGlua0luZm8tPmJQYW5Pbmx5ID0gRkFMU0U7CisJCisJLy8gY2hlY2sgaWYgSGlkIG9ubHkKKwlpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKKwkJIXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCisJCSFwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICYmCisJCXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQorCQlwQnRMaW5rSW5mby0+YkhpZE9ubHkgPSB0cnVlOworCWVsc2UKKwkJcEJ0TGlua0luZm8tPmJIaWRPbmx5ID0gRkFMU0U7Cit9CisKK3UxQnl0ZQoraGFsYnRjODE5MmUxYW50X0FjdGlvbkFsZ29yaXRobSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlCT09MRUFOCQkJCWJCdEhzT249RkFMU0U7CisJdTFCeXRlCQkJCWFsZ29yaXRobT1CVF84MTkyRV8xQU5UX0NPRVhfQUxHT19VTkRFRklORUQ7CisJdTFCeXRlCQkJCW51bU9mRGlmZlByb2ZpbGU9MDsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKKwkJCisJaWYoIXBCdExpbmtJbmZvLT5iQnRMaW5rRXhpc3QpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIE5vIEJUIGxpbmsgZXhpc3RzISEhXG4iKSk7CisJCXJldHVybiBhbGdvcml0aG07CisJfQorCisJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmKHBCdExpbmtJbmZvLT5iSGlkRXhpc3QpCisJCW51bU9mRGlmZlByb2ZpbGUrKzsKKwlpZihwQnRMaW5rSW5mby0+YlBhbkV4aXN0KQorCQludW1PZkRpZmZQcm9maWxlKys7CisJaWYocEJ0TGlua0luZm8tPmJBMmRwRXhpc3QpCisJCW51bU9mRGlmZlByb2ZpbGUrKzsKKwkKKwlpZihudW1PZkRpZmZQcm9maWxlID09IDEpCisJeworCQlpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7CisJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ087CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEIG9ubHlcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9CisJCQllbHNlIGlmKHBCdExpbmtJbmZvLT5iQTJkcEV4aXN0KQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCBvbmx5XG4iKSk7CisJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fQTJEUDsKKwkJCX0KKwkJCWVsc2UgaWYocEJ0TGlua0luZm8tPmJQYW5FeGlzdCkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oSFMpIG9ubHlcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFOSFM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA9PSAyKQorCXsKKwkJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKKwkJeworCQkJaWYocEJ0TGlua0luZm8tPmJIaWRFeGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRFxuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRDsKKwkJCX0KKwkJCWVsc2UgaWYocEJ0TGlua0luZm8tPmJBMmRwRXhpc3QpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQID09PiBTQ09cbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ087CisJCQl9CisJCQllbHNlIGlmKHBCdExpbmtJbmZvLT5iUGFuRXhpc3QpCisJCQl7CisJCQkJaWYoYkJ0SHNPbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEhTKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ087CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKKwkJCX0KKwkJCWVsc2UgaWYoIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QgJiYKKwkJCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEhTKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID09IDMpCisJeworCQlpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQorCQl7CisJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIEEyRFAgPT0+IEhJRFxuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRDsKKwkJCX0KKwkJCWVsc2UgaWYoIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QgJiYKKwkJCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQICsgUEFOKEhTKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ087CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKKwkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCisJCQl7CisJCQkJaWYoYkJ0SHNPbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID49IDMpCisJeworCQlpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQorCQl7CisJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgorCQkJCXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKKwkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCisJCQl7CisJCQkJaWYoYkJ0SHNPbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKKworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oRURSKT09PlBBTihFRFIpK0hJRFxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBhbGdvcml0aG07Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRGd0RhY1N3aW5nTGV2ZWwoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCWRhY1N3aW5nTHZsCisJKQoreworCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKKworCS8vIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKKwkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKKwlIMkNfUGFyYW1ldGVyWzBdID0gZGFjU3dpbmdMdmw7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNTd2luZ0x2bCkpOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDY0PTB4JXhcbiIsIEgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDY0LCAxLCBIMkNfUGFyYW1ldGVyKTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldEZ3RGVjQnRQd3IoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQlkZWNCdFB3ckx2bAorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CisJCisJSDJDX1BhcmFtZXRlclswXSA9IGRlY0J0UHdyTHZsOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIGxldmVsID0gJWQsIEZXIHdyaXRlIDB4NjI9MHgleFxuIiwgCisJCWRlY0J0UHdyTHZsLCBIMkNfUGFyYW1ldGVyWzBdKSk7CisKKwlwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2MiwgMSwgSDJDX1BhcmFtZXRlcik7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCQliRm9yY2VFeGVjLAorCUlOCXUxQnl0ZQkJCQlkZWNCdFB3ckx2bAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIERlYyBCVCBwb3dlciBsZXZlbCA9ICVkXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgZGVjQnRQd3JMdmwpKTsKKwlwQ29leERtLT5jdXJCdERlY1B3ckx2bCA9IGRlY0J0UHdyTHZsOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBCdERlY1B3ckx2bD0lZCwgY3VyQnREZWNQd3JMdmw9JWRcbiIsIAorCQkJcENvZXhEbS0+cHJlQnREZWNQd3JMdmwsIHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsKSk7CisKKwkJaWYocENvZXhEbS0+cHJlQnREZWNQd3JMdmwgPT0gcENvZXhEbS0+Y3VyQnREZWNQd3JMdmwpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTFhbnRfU2V0RndEZWNCdFB3cihwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJCdERlY1B3ckx2bCk7CisKKwlwQ29leERtLT5wcmVCdERlY1B3ckx2bCA9IHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfU2V0RndCdExuYUNvbnN0cmFpbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJCdExuYUNvbnNPbgorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzJdID17MH07CisJCisJSDJDX1BhcmFtZXRlclswXSA9IDB4MzsJLy8gb3BDb2RlLCAweDM9QlRfU0VUX0xOQV9DT05TVFJBSU4KKworCWlmKGJCdExuYUNvbnNPbikKKwl7CisJCUgyQ19QYXJhbWV0ZXJbMV0gfD0gQklUMDsKKwl9CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgc2V0IEJUIExOQSBDb25zdHJhaW46ICVzLCBGVyB3cml0ZSAweDY5PTB4JXhcbiIsIAorCQkoYkJ0TG5hQ29uc09uPyAiT04hISI6Ik9GRiEhIiksIAorCQlIMkNfUGFyYW1ldGVyWzBdPDw4fEgyQ19QYXJhbWV0ZXJbMV0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDY5LCAyLCBIMkNfUGFyYW1ldGVyKTsJCit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRCdExuYUNvbnN0cmFpbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JQk9PTEVBTgkJCWJCdExuYUNvbnNPbgorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIENvbnN0cmFpbiA9ICVzXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UiOiIiKSwgKChiQnRMbmFDb25zT24pPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJCdExuYUNvbnN0cmFpbiA9IGJCdExuYUNvbnNPbjsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUJ0TG5hQ29uc3RyYWluPSVkLCBiQ3VyQnRMbmFDb25zdHJhaW49JWRcbiIsIAorCQkJcENvZXhEbS0+YlByZUJ0TG5hQ29uc3RyYWluLCBwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW4pKTsKKworCQlpZihwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4gPT0gcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUxYW50X1NldEZ3QnRMbmFDb25zdHJhaW4ocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKKworCXBDb2V4RG0tPmJQcmVCdExuYUNvbnN0cmFpbiA9IHBDb2V4RG0tPmJDdXJCdExuYUNvbnN0cmFpbjsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldEZ3QnRQc2RNb2RlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQlidFBzZE1vZGUKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsyXSA9ezB9OworCQorCUgyQ19QYXJhbWV0ZXJbMF0gPSAweDI7CS8vIG9wQ29kZSwgMHgyPUJUX1NFVF9QU0RfTU9ERQorCisJSDJDX1BhcmFtZXRlclsxXSA9IGJ0UHNkTW9kZTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgQlQgUFNEIG1vZGU9MHgleCwgRlcgd3JpdGUgMHg2OT0weCV4XG4iLCAKKwkJSDJDX1BhcmFtZXRlclsxXSwgCisJCUgyQ19QYXJhbWV0ZXJbMF08PDh8SDJDX1BhcmFtZXRlclsxXSkpOworCisJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjksIDIsIEgyQ19QYXJhbWV0ZXIpOwkKK30KKworCitWT0lECitoYWxidGM4MTkyZTFhbnRfU2V0QnRQc2RNb2RlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTgl1MUJ5dGUJCQlidFBzZE1vZGUKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBCVCBQU0QgbW9kZSA9IDB4JXhcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSI6IiIpLCBidFBzZE1vZGUpKTsKKwlwQ29leERtLT5iQ3VyQnRQc2RNb2RlID0gYnRQc2RNb2RlOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRQc2RNb2RlPTB4JXgsIGJDdXJCdFBzZE1vZGU9MHgleFxuIiwgCisJCQlwQ29leERtLT5iUHJlQnRQc2RNb2RlLCBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKSk7CisKKwkJaWYocENvZXhEbS0+YlByZUJ0UHNkTW9kZSA9PSBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUxYW50X1NldEZ3QnRQc2RNb2RlKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJCdFBzZE1vZGUpOworCisJcENvZXhEbS0+YlByZUJ0UHNkTW9kZSA9IHBDb2V4RG0tPmJDdXJCdFBzZE1vZGU7Cit9CisKKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldEJ0QXV0b1JlcG9ydCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJFbmFibGVBdXRvUmVwb3J0CisJKQoreworCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKKwkKKwlIMkNfUGFyYW1ldGVyWzBdID0gMDsKKworCWlmKGJFbmFibGVBdXRvUmVwb3J0KQorCXsKKwkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQwOworCX0KKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBCVCBGVyBhdXRvIHJlcG9ydCA6ICVzLCBGVyB3cml0ZSAweDY4PTB4JXhcbiIsIAorCQkoYkVuYWJsZUF1dG9SZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDY4LCAxLCBIMkNfUGFyYW1ldGVyKTsJCit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9CdEF1dG9SZXBvcnQoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliRW5hYmxlQXV0b1JlcG9ydAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJFbmFibGVBdXRvUmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKSk7CisJcENvZXhEbS0+YkN1ckJ0QXV0b1JlcG9ydCA9IGJFbmFibGVBdXRvUmVwb3J0OworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRBdXRvUmVwb3J0PSVkLCBiQ3VyQnRBdXRvUmVwb3J0PSVkXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVCdEF1dG9SZXBvcnQsIHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpKTsKKworCQlpZihwQ29leERtLT5iUHJlQnRBdXRvUmVwb3J0ID09IHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTFhbnRfU2V0QnRBdXRvUmVwb3J0KHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpOworCisJcENvZXhEbS0+YlByZUJ0QXV0b1JlcG9ydCA9IHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQ7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Gd0RhY1N3aW5nTHZsKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTgl1MUJ5dGUJCQlmd0RhY1N3aW5nTHZsCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IEZXIERhYyBTd2luZyBsZXZlbCA9ICVkXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgZndEYWNTd2luZ0x2bCkpOworCXBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwgPSBmd0RhY1N3aW5nTHZsOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCBjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLCAKKwkJCXBDb2V4RG0tPnByZUZ3RGFjU3dpbmdMdmwsIHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpKTsKKworCQlpZihwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID09IHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpIAorCQkJcmV0dXJuOworCX0KKworCWhhbGJ0YzgxOTJlMWFudF9TZXRGd0RhY1N3aW5nTGV2ZWwocEJ0Q29leGlzdCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCk7CisKKwlwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bDsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldFN3UmZSeExwZkNvcm5lcigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KKwkpCit7CisJaWYoYlJ4UmZTaHJpbmtPbikKKwl7CisJCS8vU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIDB4ZjBmZjcpOworCX0KKwllbHNlCisJeworCQkvL1Jlc3VtZSBSRiBSeCBMUEYgY29ybmVyCisJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCisJCWlmKHBCdENvZXhpc3QtPmluaXRpbGl6ZWQpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CisJCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgcENvZXhEbS0+YnRSZjB4MWVCYWNrdXApOworCQl9CisJfQorfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfUmZTaHJpbmsoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliUnhSZlNocmlua09uCisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBSeCBSRiBTaHJpbmsgPSAlc1xuIiwgIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYlJ4UmZTaHJpbmtPbik/ICJPTiI6Ik9GRiIpKSk7CisJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlUmZSeExwZlNocmluaz0lZCwgYkN1clJmUnhMcGZTaHJpbms9JWRcbiIsIAorCQkJcENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmssIHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKSk7CisKKwkJaWYocENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmsgPT0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTFhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKTsKKworCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKKwkpCit7CisJdTFCeXRlCXRtcFUxOworCisJdG1wVTEgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDRmZCk7CisJdG1wVTEgfD0gQklUMDsKKwlpZihiTG93UGVuYWx0eVJhKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CisJCXRtcFUxICY9IH5CSVQyOworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IG5vcm1hbCEhXG4iKSk7CisJCXRtcFUxIHw9IEJJVDI7CisJfQorCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Mb3dQZW5hbHR5UmEoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliTG93UGVuYWx0eVJhCisJKQoreworCXJldHVybjsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gTG93UGVuYWx0eVJBID0gJXNcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEgPSBiTG93UGVuYWx0eVJhOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlTG93UGVuYWx0eVJhPSVkLCBiQ3VyTG93UGVuYWx0eVJhPSVkXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKKworCQlpZihwQ29leERtLT5iUHJlTG93UGVuYWx0eVJhID09IHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpIAorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSk7CisKKwlwQ29leERtLT5iUHJlTG93UGVuYWx0eVJhID0gcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldERhY1N3aW5nUmVnKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1NEJ5dGUJCQlsZXZlbAorCSkKK3sKKwl1MUJ5dGUJdmFsPSh1MUJ5dGUpbGV2ZWw7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgV3JpdGUgU3dEYWNTd2luZyA9IDB4JXhcbiIsIGxldmVsKSk7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2socEJ0Q29leGlzdCwgMHg4ODMsIDB4M2UsIHZhbCk7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliU3dEYWNTd2luZ09uLAorCUlOCXU0Qnl0ZQkJCXN3RGFjU3dpbmdMdmwKKwkpCit7CisJaWYoYlN3RGFjU3dpbmdPbikKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9TZXREYWNTd2luZ1JlZyhwQnRDb2V4aXN0LCBzd0RhY1N3aW5nTHZsKTsKKwl9CisJZWxzZQorCXsKKwkJaGFsYnRjODE5MmUxYW50X1NldERhY1N3aW5nUmVnKHBCdENvZXhpc3QsIDB4MTgpOworCX0KK30KKworCitWT0lECitoYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliRGFjU3dpbmdPbiwKKwlJTgl1NEJ5dGUJCQlkYWNTd2luZ0x2bAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gRGFjU3dpbmc9JXMsIGRhY1N3aW5nTHZsPTB4JXhcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJEYWNTd2luZ09uKT8gIk9OIjoiT0ZGIiksIGRhY1N3aW5nTHZsKSk7CisJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24gPSBiRGFjU3dpbmdPbjsKKwlwQ29leERtLT5jdXJEYWNTd2luZ0x2bCA9IGRhY1N3aW5nTHZsOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwgYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsIAorCQkJcENvZXhEbS0+YlByZURhY1N3aW5nT24sIHBDb2V4RG0tPnByZURhY1N3aW5nTHZsLAorCQkJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24sIHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsKSk7CisKKwkJaWYoIChwQ29leERtLT5iUHJlRGFjU3dpbmdPbiA9PSBwQ29leERtLT5iQ3VyRGFjU3dpbmdPbikgJiYKKwkJCShwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9PSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkgKQorCQkJcmV0dXJuOworCX0KKwltZGVsYXkoMzApOworCWhhbGJ0YzgxOTJlMWFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocEJ0Q29leGlzdCwgYkRhY1N3aW5nT24sIGRhY1N3aW5nTHZsKTsKKworCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT247CisJcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bDsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldEFkY0JhY2tPZmYoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliQWRjQmFja09mZgorCSkKK3sKKwlpZihiQWRjQmFja09mZikKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9uIVxuIikpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgzKTsKKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT2ZmIVxuIikpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKKwl9Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BZGNCYWNrT2ZmKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYkFkY0JhY2tPZmYKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIEFkY0JhY2tPZmYgPSAlc1xuIiwgIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFkY0JhY2tPZmYpPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmID0gYkFkY0JhY2tPZmY7CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZGNCYWNrT2ZmPSVkLCBiQ3VyQWRjQmFja09mZj0lZFxuIiwgCisJCQlwQ29leERtLT5iUHJlQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpKTsKKworCQlpZihwQ29leERtLT5iUHJlQWRjQmFja09mZiA9PSBwQ29leERtLT5iQ3VyQWRjQmFja09mZikgCisJCQlyZXR1cm47CisJfQorCWhhbGJ0YzgxOTJlMWFudF9TZXRBZGNCYWNrT2ZmKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmKTsKKworCXBDb2V4RG0tPmJQcmVBZGNCYWNrT2ZmID0gcENvZXhEbS0+YkN1ckFkY0JhY2tPZmY7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRBZ2NUYWJsZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJBZ2NUYWJsZUVuCisJKQoreworCXUxQnl0ZQkJcnNzaUFkanVzdFZhbD0wOworCQorCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDAyMDAwKTsKKwlpZihiQWdjVGFibGVFbikKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT24hXG4iKSk7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDNmYTU4KTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MzdhNTgpOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyZmE1OCk7CisJCXJzc2lBZGp1c3RWYWwgPSA4OworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQWdjIFRhYmxlIE9mZiFcbiIpKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MzkyNTgpOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzMTI1OCk7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDI5MjU4KTsKKwl9CisJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4ZWYsIDB4ZmZmZmYsIDB4MCk7CisKKwkvLyBzZXQgcnNzaUFkanVzdFZhbCBmb3Igd2lmaSBtb2R1bGUuCisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfQUdDX1RBQkxFX09OLCAmcnNzaUFkanVzdFZhbCk7Cit9CisKKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FnY1RhYmxlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyAlcyBBZ2MgVGFibGVcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJBZ2NUYWJsZUVuKT8gIkVuYWJsZSI6IkRpc2FibGUiKSkpOworCXBDb2V4RG0tPmJDdXJBZ2NUYWJsZUVuID0gYkFnY1RhYmxlRW47CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwgCisJCQlwQ29leERtLT5iUHJlQWdjVGFibGVFbiwgcENvZXhEbS0+YkN1ckFnY1RhYmxlRW4pKTsKKworCQlpZihwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9PSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikgCisJCQlyZXR1cm47CisJfQorCWhhbGJ0YzgxOTJlMWFudF9TZXRBZ2NUYWJsZShwQnRDb2V4aXN0LCBiQWdjVGFibGVFbik7CisKKwlwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9IHBDb2V4RG0tPmJDdXJBZ2NUYWJsZUVuOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfU2V0Q29leFRhYmxlKAorCUlOCVBCVENfQ09FWElTVAlwQnRDb2V4aXN0LAorCUlOCXU0Qnl0ZQkJdmFsMHg2YzAsCisJSU4JdTRCeXRlCQl2YWwweDZjNCwKKwlJTgl1NEJ5dGUJCXZhbDB4NmM4LAorCUlOCXUxQnl0ZQkJdmFsMHg2Y2MKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzA9MHgleFxuIiwgdmFsMHg2YzApKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzAsIHZhbDB4NmMwKTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM0PTB4JXhcbiIsIHZhbDB4NmM0KSk7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0LCB2YWwweDZjNCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjOD0weCV4XG4iLCB2YWwweDZjOCkpOworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2M9MHgleFxuIiwgdmFsMHg2Y2MpKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MsIHZhbDB4NmNjKTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JdTRCeXRlCQkJdmFsMHg2YzAsCisJSU4JdTRCeXRlCQkJdmFsMHg2YzQsCisJSU4JdTRCeXRlCQkJdmFsMHg2YzgsCisJSU4JdTFCeXRlCQkJdmFsMHg2Y2MKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB3cml0ZSBDb2V4IFRhYmxlIDB4NmMwPTB4JXgsIDB4NmM0PTB4JXgsIDB4NmM4PTB4JXgsIDB4NmNjPTB4JXhcbiIsIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIHZhbDB4NmMwLCB2YWwweDZjNCwgdmFsMHg2YzgsIHZhbDB4NmNjKSk7CisJcENvZXhEbS0+Y3VyVmFsMHg2YzAgPSB2YWwweDZjMDsKKwlwQ29leERtLT5jdXJWYWwweDZjNCA9IHZhbDB4NmM0OworCXBDb2V4RG0tPmN1clZhbDB4NmM4ID0gdmFsMHg2Yzg7CisJcENvZXhEbS0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlVmFsMHg2YzA9MHgleCwgcHJlVmFsMHg2YzQ9MHgleCwgcHJlVmFsMHg2Yzg9MHgleCwgcHJlVmFsMHg2Y2M9MHgleCAhIVxuIiwgCisJCQlwQ29leERtLT5wcmVWYWwweDZjMCwgcENvZXhEbS0+cHJlVmFsMHg2YzQsIHBDb2V4RG0tPnByZVZhbDB4NmM4LCBwQ29leERtLT5wcmVWYWwweDZjYykpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMD0weCV4LCBjdXJWYWwweDZjND0weCV4LCBjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLCAKKwkJCXBDb2V4RG0tPmN1clZhbDB4NmMwLCBwQ29leERtLT5jdXJWYWwweDZjNCwgcENvZXhEbS0+Y3VyVmFsMHg2YzgsIHBDb2V4RG0tPmN1clZhbDB4NmNjKSk7CisJCisJCWlmKCAocENvZXhEbS0+cHJlVmFsMHg2YzAgPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzApICYmCisJCQkocENvZXhEbS0+cHJlVmFsMHg2YzQgPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzQpICYmCisJCQkocENvZXhEbS0+cHJlVmFsMHg2YzggPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzgpICYmCisJCQkocENvZXhEbS0+cHJlVmFsMHg2Y2MgPT0gcENvZXhEbS0+Y3VyVmFsMHg2Y2MpICkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUxYW50X1NldENvZXhUYWJsZShwQnRDb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CisKKwlwQ29leERtLT5wcmVWYWwweDZjMCA9IHBDb2V4RG0tPmN1clZhbDB4NmMwOworCXBDb2V4RG0tPnByZVZhbDB4NmM0ID0gcENvZXhEbS0+Y3VyVmFsMHg2YzQ7CisJcENvZXhEbS0+cHJlVmFsMHg2YzggPSBwQ29leERtLT5jdXJWYWwweDZjODsKKwlwQ29leERtLT5wcmVWYWwweDZjYyA9IHBDb2V4RG0tPmN1clZhbDB4NmNjOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQkJYkZvcmNlRXhlYywKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSkKK3sKKwlzd2l0Y2godHlwZSkKKwl7CisJCWNhc2UgMDoKKwkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmZmYsIDB4Myk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDU1NTU1NTU1LCAweDVhNWE1YTVhLCAweGZmZmZmZiwgMHgzKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWE1YTVhNWEsIDB4NWE1YTVhNWEsIDB4ZmZmZmZmLCAweDMpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHhhYWFhYWFhYSwgMHhhYWFhYWFhYSwgMHhmZmZmZmYsIDB4Myk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZiwgMHgzKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZmZmLCAweDMpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NWZmNTVmZiwgMHg1YTVhNWE1YSwgMHhmZmZmZmYsIDB4Myk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGRkZmZkZGZmLCAweGRkZmZkZGZmLCAweGZmZmZmZiwgMHgzKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NTVmZjU1ZmYsIDB4NWFmYTVhZmEsIDB4ZmZmZmZmLCAweDMpOworCQkJYnJlYWs7CQkKKwkJY2FzZSA5OgorCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDVmNWY1ZjVmLCAweDVmNWY1ZjVmLCAweGZmZmZmZiwgMHgzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkVuYWJsZQorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CisJCQorCWlmKGJFbmFibGUpCisJeworCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CQkvLyBmdW5jdGlvbiBlbmFibGUKKwl9CisJCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBGVyBmb3IgQlQgSWdub3JlIFdsYW5fQWN0LCBGVyB3cml0ZSAweDYzPTB4JXhcbiIsIAorCQlIMkNfUGFyYW1ldGVyWzBdKSk7CisKKwlwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2MywgMSwgSDJDX1BhcmFtZXRlcik7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYkVuYWJsZQorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIChiRW5hYmxlPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0ID0gYkVuYWJsZTsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0LCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCkpOworCisJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOworCisJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QgPSBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdDsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQlieXRlMSwKKwlJTgl1MUJ5dGUJCQlieXRlMiwKKwlJTgl1MUJ5dGUJCQlieXRlMywKKwlJTgl1MUJ5dGUJCQlieXRlNCwKKwlJTgl1MUJ5dGUJCQlieXRlNQorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzVdID17MH07CisKKwlIMkNfUGFyYW1ldGVyWzBdID0gYnl0ZTE7CQorCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsJCisJSDJDX1BhcmFtZXRlclsyXSA9IGJ5dGUzOworCUgyQ19QYXJhbWV0ZXJbM10gPSBieXRlNDsKKwlIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7CisKKwlwQ29leERtLT5wc1RkbWFQYXJhWzBdID0gYnl0ZTE7CisJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOworCXBDb2V4RG0tPnBzVGRtYVBhcmFbMl0gPSBieXRlMzsKKwlwQ29leERtLT5wc1RkbWFQYXJhWzNdID0gYnl0ZTQ7CisJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IGJ5dGU1OworCQorCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDYwKDVieXRlcyk9MHgleCUwOHhcbiIsIAorCQlIMkNfUGFyYW1ldGVyWzBdLCAKKwkJSDJDX1BhcmFtZXRlclsxXTw8MjR8SDJDX1BhcmFtZXRlclsyXTw8MTZ8SDJDX1BhcmFtZXRlclszXTw8OHxIMkNfUGFyYW1ldGVyWzRdKSk7CisKKwlwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2MCwgNSwgSDJDX1BhcmFtZXRlcik7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9TZXRMcHNScHdtKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQlscHNWYWwsCisJSU4JdTFCeXRlCQkJcnB3bVZhbAorCSkKK3sKKwl1MUJ5dGUJbHBzPWxwc1ZhbDsKKwl1MUJ5dGUJcnB3bT1ycHdtVmFsOworCQorCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9VMV8xQU5UX0xQUywgJmxwcyk7CisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfUlBXTSwgJnJwd20pOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfTHBzUnB3bSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JdTFCeXRlCQkJbHBzVmFsLAorCUlOCXUxQnl0ZQkJCXJwd21WYWwKKwkpCit7CisJQk9PTEVBTgliRm9yY2VFeGVjUHdyQ21kPUZBTFNFOworCQorCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IGxwcy9ycHdtPTB4JXgvMHgleCBcbiIsIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIGxwc1ZhbCwgcnB3bVZhbCkpOworCXBDb2V4RG0tPmN1ckxwcyA9IGxwc1ZhbDsKKwlwQ29leERtLT5jdXJScHdtID0gcnB3bVZhbDsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlTHBzL2N1ckxwcz0weCV4LzB4JXgsIHByZVJwd20vY3VyUnB3bT0weCV4LzB4JXghIVxuIiwgCisJCQlwQ29leERtLT5wcmVMcHMsIHBDb2V4RG0tPmN1ckxwcywgcENvZXhEbS0+cHJlUnB3bSwgcENvZXhEbS0+Y3VyUnB3bSkpOworCisJCWlmKCAocENvZXhEbS0+cHJlTHBzID09IHBDb2V4RG0tPmN1ckxwcykgJiYKKwkJCShwQ29leERtLT5wcmVScHdtID09IHBDb2V4RG0tPmN1clJwd20pICkKKwkJeworCQkJcmV0dXJuOworCQl9CisJfQorCWhhbGJ0YzgxOTJlMWFudF9TZXRMcHNScHdtKHBCdENvZXhpc3QsIGxwc1ZhbCwgcnB3bVZhbCk7CisKKwlwQ29leERtLT5wcmVMcHMgPSBwQ29leERtLT5jdXJMcHM7CisJcENvZXhEbS0+cHJlUnB3bSA9IHBDb2V4RG0tPmN1clJwd207Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEoCisJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCQorCUlOCUJPT0xFQU4JCWJTaHJpbmtSeExQRiwKKwlJTglCT09MRUFOIAliTG93UGVuYWx0eVJBLAorCUlOCUJPT0xFQU4JCWxpbWl0ZWRfZGlnLCAKKwlJTglCT09MRUFOCQliQlRMTkFDb25zdHJhaW4KKwkpIAoreworCS8vaGFsYnRjODE5MmUxYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiU2hyaW5rUnhMUEYpOworCS8vaGFsYnRjODE5MmUxYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgYkxvd1BlbmFsdHlSQSk7CisKKwkvL25vIGxpbWl0ZWQgRElHCisJLy9oYWxidGM4MTkyZTFhbnRfU2V0QnRMbmFDb25zdHJhaW4ocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJCVExOQUNvbnN0cmFpbik7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIoCisJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCQorCUlOCUJPT0xFQU4JCWJBR0NUYWJsZVNoaWZ0LAorCUlOCUJPT0xFQU4gCWJBRENCYWNrT2ZmLAorCUlOCUJPT0xFQU4JCWJTV0RBQ1N3aW5nLAorCUlOCXU0Qnl0ZQkJZGFjU3dpbmdMdmwKKwkpCit7CisJLy9oYWxidGM4MTkyZTFhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJBR0NUYWJsZVNoaWZ0KTsKKwkvL2hhbGJ0YzgxOTJlMWFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQURDQmFja09mZik7CisJLy9oYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJTV0RBQ1N3aW5nLCBkYWNTd2luZ0x2bCk7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Qc1RkbWEoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliVHVybk9uLAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpCit7CisJQk9PTEVBTgkJCWJUdXJuT25CeUNudD1GQUxTRTsKKwl1MUJ5dGUJCQlwc1RkbWFUeXBlQnlDbnQ9MCwgcnNzaUFkanVzdFZhbD0wOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIChiVHVybk9uPyAiT04iOiJPRkYiKSwgdHlwZSkpOworCXBDb2V4RG0tPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247CisJcENvZXhEbS0+Y3VyUHNUZG1hID0gdHlwZTsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsIAorCQkJcENvZXhEbS0+YlByZVBzVGRtYU9uLCBwQ29leERtLT5iQ3VyUHNUZG1hT24pKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlUHNUZG1hID0gJWQsIGN1clBzVGRtYSA9ICVkISFcbiIsIAorCQkJcENvZXhEbS0+cHJlUHNUZG1hLCBwQ29leERtLT5jdXJQc1RkbWEpKTsKKworCQlpZiggKHBDb2V4RG0tPmJQcmVQc1RkbWFPbiA9PSBwQ29leERtLT5iQ3VyUHNUZG1hT24pICYmCisJCQkocENvZXhEbS0+cHJlUHNUZG1hID09IHBDb2V4RG0tPmN1clBzVGRtYSkgKQorCQkJcmV0dXJuOworCX0KKwlpZihiVHVybk9uKQorCXsKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJCWRlZmF1bHQ6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NTMsIDB4MmMsIDB4MDMsIDB4MTAsIDB4NTApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDJjLCAweDAzLCAweDEwLCAweDUwKTsKKwkJCQlyc3NpQWRqdXN0VmFsID0gMTE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NTMsIDB4MjUsIDB4MDMsIDB4MTAsIDB4NTApOworCQkJCXJzc2lBZGp1c3RWYWwgPSAxNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg5MywgMHgyNSwgMHgzLCAweDEwLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg5MywgMHgxNSwgMHgzLCAweDE0LCAweDApOworCQkJCXJzc2lBZGp1c3RWYWwgPSAxNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg2MSwgMHgxNSwgMHgzLCAweDMxLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGEsIDB4MywgMHgwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGMsIDB4NSwgMHgwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgkKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg5MywgMHgyNSwgMHgzLCAweDEwLCAweDApOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgkKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgxZSwgMHgwMywgMHgxMCwgMHg1MCk7CisJCQkJcnNzaUFkanVzdFZhbCA9IDE4OworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoJCisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOworCQkJCWJyZWFrOworCQkJY2FzZSAxMToJCisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NTMsIDB4MTIsIDB4MDMsIDB4MTAsIDB4NTApOworCQkJCXJzc2lBZGp1c3RWYWwgPSAyMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZWIsIDB4YSwgMHgzLCAweDMxLCAweDE4KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxNToKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4OCwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxMCwgMHgwKTsKKwkJCQlyc3NpQWRqdXN0VmFsID0gMTg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMTg6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKKwkJCQlyc3NpQWRqdXN0VmFsID0gMTQ7CisJCQkJYnJlYWs7CQkJCisJCQkJCisJCQljYXNlIDIwOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweDI1LCAweDI1LCAweDAsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIxOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDIwLCAweDMsIDB4MTAsIDB4NDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyMjoKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHg4LCAweDgsIDB4MCwgMHg0MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIzOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4MTgpOworCQkJCXJzc2lBZGp1c3RWYWwgPSAyMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjQ6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTUsIDB4MywgMHgzMSwgMHgxOCk7CisJCQkJcnNzaUFkanVzdFZhbCA9IDIyOworCQkJCWJyZWFrOworCQkJY2FzZSAyNToKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOworCQkJCXJzc2lBZGp1c3RWYWwgPSAyMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjY6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4YSwgMHgzLCAweDMxLCAweDE4KTsKKwkJCQlyc3NpQWRqdXN0VmFsID0gMjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI3OgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4OTgpOworCQkJCXJzc2lBZGp1c3RWYWwgPSAyMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjg6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NjksIDB4MjUsIDB4MywgMHgzMSwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjk6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4MWEsIDB4MWEsIDB4MSwgMHgxMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMwOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDE1LCAweDMsIDB4MTQsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMxOgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAwLCAweDU4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4YSwgMHgzLCAweDMxLCAweDkwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzM6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4MjUsIDB4MywgMHgzMCwgMHg5MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM0OgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4MTApOworCQkJCWJyZWFrOworCQkJY2FzZSAzNToKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHgwLCAweDEwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzY6CisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZDMsIDB4MTIsIDB4MywgMHgxNCwgMHg1MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM3OgorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDI1LCAweDMsIDB4MTAsIDB4NTApOworCQkJCWJyZWFrOworCQkJY2FzZSAzODoKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxMiwgMHgxMiwgMHhlMSwgMHg5MCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gZGlzYWJsZSBQUyB0ZG1hCisJCXN3aXRjaCh0eXBlKQorCQl7CisJCQljYXNlIDg6CQkvLzB4Nzc4ID0gMSwgYW50MlBUQQorCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCk7CisJCQkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjLCAweDQpOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgkJLy8weDc3OCA9IDEsIGFudDJCVAorCQkJZGVmYXVsdDoKKwkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDApOworCQkJCW1kZWxheSg1KTsKKwkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4MjApOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgkJLy8weDc3OCA9IDEsIGFudDJXSUZJCisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKKwkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4NCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgkvLzB4Nzc4ID0gMywgYW50MkJUCisJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKKwkJCQltZGVsYXkoNSk7CisJCQkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjLCAweDIwKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyc3NpQWRqdXN0VmFsID0wOworCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SXzFBTlRfQ09FWF9UWVBFLCAmcnNzaUFkanVzdFZhbCk7CisKKwkvLyB1cGRhdGUgcHJlIHN0YXRlCisJcENvZXhEbS0+YlByZVBzVGRtYU9uID0gcENvZXhEbS0+YkN1clBzVGRtYU9uOworCXBDb2V4RG0tPnByZVBzVGRtYSA9IHBDb2V4RG0tPmN1clBzVGRtYTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1NldFN3aXRjaFNzVHlwZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXNzVHlwZQorCSkKK3sKKwl1MUJ5dGUJbWltb1BzPUJUQ19NSU1PX1BTX0RZTkFNSUM7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJFQUwgc2V0IFNTIFR5cGUgPSAlZFxuIiwgc3NUeXBlKSk7CisKKwlpZihzc1R5cGUgPT0gMSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEJUQ19SQVRFX0RJU0FCTEUsIDB4ZmZmMDAwMDApOwkvLyBkaXNhYmxlIDJzcworCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCAwKTsKKwkJLy8gc3dpdGNoIG9mZG0gcGF0aAorCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsIDB4MTEpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhkMDQsIDB4MSk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDkwYywgMHg4MTExMTExMSk7CisJCS8vIHN3aXRjaCBjY2sgcGF0Y2gKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2socEJ0Q29leGlzdCwgMHhlNzcsIDB4NCwgMHgxKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YTA3LCAweDgxKTsKKwkJbWltb1BzPUJUQ19NSU1PX1BTX1NUQVRJQzsKKwl9CisJZWxzZSBpZihzc1R5cGUgPT0gMikKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEJUQ19SQVRFX0VOQUJMRSwgMHhmZmYwMDAwMCk7CS8vIGVuYWJsZSAyc3MKKwkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgOCk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweGMwNCwgMHgzMyk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweGQwNCwgMHgzKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4OTBjLCAweDgxMTIxMzEzKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2socEJ0Q29leGlzdCwgMHhlNzcsIDB4NCwgMHgwKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YTA3LCAweDQxKTsKKwkJbWltb1BzPUJUQ19NSU1PX1BTX0RZTkFNSUM7CisJfQorCQorCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfU0VORF9NSU1PX1BTLCAmbWltb1BzKTsJLy8gc2V0IHJ4IDFzcyBvciAyc3MKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCQliRm9yY2VFeGVjLAorCUlOCXUxQnl0ZQkJCQluZXdTc1R5cGUKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCAlcyBTd2l0Y2ggU1MgVHlwZSA9ICVkXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgbmV3U3NUeXBlKSk7CisJcENvZXhEbS0+Y3VyU3NUeXBlID0gbmV3U3NUeXBlOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlpZihwQ29leERtLT5wcmVTc1R5cGUgPT0gcENvZXhEbS0+Y3VyU3NUeXBlKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUxYW50X1NldFN3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJTc1R5cGUpOworCisJcENvZXhEbS0+cHJlU3NUeXBlID0gcENvZXhEbS0+Y3VyU3NUeXBlOworfQorCitWT0lECitoYWxidGM4MTkyZTFhbnRfQ29leEFsbE9mZigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKworCS8vIHN3IGFsbCBvZmYKKwloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOworCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKworCisJLy8gaHcgYWxsIG9mZgorCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cit9CisKK0JPT0xFQU4KK2hhbGJ0YzgxOTJlMWFudF9Jc0NvbW1vbkFjdGlvbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJQk9PTEVBTgkJCWJDb21tb249RkFMU0UsIGJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CisKKwlpZighYldpZmlDb25uZWN0ZWQgJiYgCisJCUJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOwkJCisgCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOworCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CisKKwkJYkNvbW1vbiA9IHRydWU7CisJfQorCWVsc2UgaWYoYldpZmlDb25uZWN0ZWQgJiYgCisJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOworICAgICAgCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSxGQUxTRSk7CisJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKworCQliQ29tbW9uID0gdHJ1ZTsKKwl9CisJZWxzZSBpZighYldpZmlDb25uZWN0ZWQgJiYgCisJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKKwkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKKwkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOworCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlIGlmKGJXaWZpQ29ubmVjdGVkICYmIAorCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CisJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCx0cnVlLHRydWUsdHJ1ZSx0cnVlKTsKKwkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOworCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlIGlmKCFiV2lmaUNvbm5lY3RlZCAmJiAKKwkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKSApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgQnVzeSEhXG4iKSk7CisJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSxGQUxTRSk7CisJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlCisJeworCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLHRydWUsdHJ1ZSk7CisJCQorCQliQ29tbW9uID0gRkFMU0U7CisJfQorCQorCXJldHVybiBiQ29tbW9uOworfQorCisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl3aWZpU3RhdHVzCisJKQoreworCXN0YXRpYyBzNEJ5dGUJCXVwLGRuLG0sbixXYWl0Q291bnQ7CisJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KKwl1MUJ5dGUJCQlyZXRyeUNvdW50PTAsIGJ0SW5mb0V4dDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKKworCWlmKCAoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CisJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CisJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TUEVDSUFMX1BLVCA9PSB3aWZpU3RhdHVzKSApCisJeworCQlpZiggcENvZXhEbS0+Y3VyUHNUZG1hICE9IDEgJiYKKwkJCXBDb2V4RG0tPmN1clBzVGRtYSAhPSAyICYmCisJCQlwQ29leERtLT5jdXJQc1RkbWEgIT0gMyAmJgorCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CisKKwkJCXVwID0gMDsKKwkJCWRuID0gMDsKKwkJCW0gPSAxOworCQkJbj0gMzsKKwkJCXJlc3VsdCA9IDA7CisJCQlXYWl0Q291bnQgPSAwOworCQl9CQkKKwkJcmV0dXJuOworCX0KKworCWlmKCFwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpCisJeworCQlwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QgPSB0cnVlOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOworCisJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkvLz09PT09PT09PT09PQorCQl1cCA9IDA7CisJCWRuID0gMDsKKwkJbSA9IDE7CisJCW49IDM7CisJCXJlc3VsdCA9IDA7CisJCVdhaXRDb3VudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OworCQlidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCBXYWl0Q291bnQ9JWRcbiIsIAorCQkJdXAsIGRuLCBtLCBuLCBXYWl0Q291bnQpKTsKKwkJcmVzdWx0ID0gMDsKKwkJV2FpdENvdW50Kys7IAorCQkgIAorCQlpZihyZXRyeUNvdW50ID09IDApICAvLyBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgorCQl7CisJCQl1cCsrOworCQkJZG4tLTsKKworCQkJaWYgKGRuIDw9IDApCisJCQkJZG4gPSAwOwkJCQkgCisKKwkJCWlmKHVwID49IG4pCS8vIGlmILNzxPIgbiCt0zKs7SByZXRyeSBjb3VudKywMCwgq2i91bxlV2lGaSBkdXJhdGlvbgorCQkJeworCQkJCVdhaXRDb3VudCA9IDA7IAorCQkJCW4gPSAzOworCQkJCXVwID0gMDsKKwkJCQlkbiA9IDA7CisJCQkJcmVzdWx0ID0gMTsgCisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgSW5jcmVhc2Ugd2lmaSBkdXJhdGlvbiEhXG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocmV0cnlDb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXAtLTsgCisJCQlkbisrOworCisJCQlpZiAodXAgPD0gMCkKKwkJCQl1cCA9IDA7CisKKwkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQlpZiAoV2FpdENvdW50IDw9IDIpCisJCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJCWVsc2UKKwkJCQkJbSA9IDE7CisKKwkJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQkJbSA9IDIwOworCisJCQkJbiA9IDMqbTsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCVdhaXRDb3VudCA9IDA7CisJCQkJcmVzdWx0ID0gLTE7IAorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcjwzISFcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlICAvL3JldHJ5IGNvdW50ID4gMywgpXWtbjGmuCByZXRyeSBjb3VudCA+IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJeworCQkJaWYgKFdhaXRDb3VudCA9PSAxKQorCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJZWxzZQorCQkJCW0gPSAxOworCisJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQltID0gMjA7CisKKwkJCW4gPSAzKm07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQlXYWl0Q291bnQgPSAwOyAKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPjMhIVxuIikpOworCQl9CisKKwkJaWYocmVzdWx0ID09IC0xKQorCQl7CisJCQlpZiggKEJUX0lORk9fODE5MkVfMUFOVF9BMkRQX0JBU0lDX1JBVEUoYnRJbmZvRXh0KSkgJiYKKwkJCQkoKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKSB8fChwQ29leERtLT5jdXJQc1RkbWEgPT0gMikpICkKKwkJCXsKKwkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OworCQkJfQorCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKKwkJCXsKKwkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkJfQorCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKKwkJCXsKKwkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OworCQkJfQorCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCXsKKwkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQl9CisJCX0KKwkJZWxzZSBpZihyZXN1bHQgPT0gMSkKKwkJeworCQkJaWYoIChCVF9JTkZPXzgxOTJFXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0SW5mb0V4dCkpICYmCisJCQkJKChwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkgfHwocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpKSApCisJCQl7CisJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKKwkJCX0KKwkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQorCQkJeworCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CisJCQl9CisJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQorCQkJeworCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CisJCQl9CisJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJeworCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOworCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CisJCQl9CisJCX0KKworCQlpZiggcENvZXhEbS0+Y3VyUHNUZG1hICE9IDEgJiYKKwkJCXBDb2V4RG0tPmN1clBzVGRtYSAhPSAyICYmCisJCQlwQ29leERtLT5jdXJQc1RkbWEgIT0gOSAmJgorCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDExICkKKwkJeworCQkJLy8gcmVjb3ZlciB0byBwcmV2aW91cyBhZGp1c3QgdHlwZQorCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKTsKKwkJfQorCX0KK30KKwordTFCeXRlCitoYWxidGM4MTkyZTFhbnRfUHNUZG1hVHlwZUJ5V2lmaVJzc2koCisJSU4JczRCeXRlCXdpZmlSc3NpLAorCUlOCXM0Qnl0ZQlwcmVXaWZpUnNzaSwKKwlJTgl1MUJ5dGUJd2lmaVJzc2lUaHJlc2gKKwkpCit7CisJdTFCeXRlCXBzVGRtYVR5cGU9MDsKKwkKKwlpZih3aWZpUnNzaSA+IHByZVdpZmlSc3NpKQorCXsKKwkJaWYod2lmaVJzc2kgPiAod2lmaVJzc2lUaHJlc2grNSkpCisJCXsKKwkJCXBzVGRtYVR5cGUgPSAyNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBzVGRtYVR5cGUgPSAyNTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZih3aWZpUnNzaSA+IHdpZmlSc3NpVGhyZXNoKQorCQl7CisJCQlwc1RkbWFUeXBlID0gMjY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwc1RkbWFUeXBlID0gMjU7CisJCX0KKwl9CisKKwlyZXR1cm4gcHNUZG1hVHlwZTsKK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliTmV3UHNTdGF0ZQorCSkKK3sKKwl1MUJ5dGUJbHBzTW9kZT0weDA7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfTFBTX01PREUsICZscHNNb2RlKTsKKwkKKwlpZihscHNNb2RlKQkvLyBhbHJlYWR5IHVuZGVyIExQUyBzdGF0ZQorCXsKKwkJaWYoYk5ld1BzU3RhdGUpCQkKKwkJeworCQkJLy8ga2VlcCBzdGF0ZSB1bmRlciBMUFMsIGRvIG5vdGhpbmcuCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB3aWxsIGxlYXZlIExQUyBzdGF0ZSwgdHVybiBvZmYgcHNUZG1hIGZpcnN0CisJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJCX0KKwl9CisJZWxzZQkJCQkJCS8vIE5PIFBTIHN0YXRlCisJeworCQlpZihiTmV3UHNTdGF0ZSkKKwkJeworCQkJLy8gd2lsbCBlbnRlciBMUFMgc3RhdGUsIHR1cm4gb2ZmIHBzVGRtYSBmaXJzdAorCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8ga2VlcCBzdGF0ZSB1bmRlciBOTyBQUyBzdGF0ZSwgZG8gbm90aGluZy4KKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJcHNUeXBlLAorCUlOCXUxQnl0ZQkJCQlscHNWYWwsCisJSU4JdTFCeXRlCQkJCXJwd21WYWwKKwkpCit7CisJQk9PTEVBTgkJYkxvd1B3ckRpc2FibGU9RkFMU0U7CisKKwlzd2l0Y2gocHNUeXBlKQorCXsKKwkJY2FzZSBCVENfUFNfV0lGSV9OQVRJVkU6CisJCQkvLyByZWNvdmVyIHRvIG9yaWdpbmFsIDMyayBsb3cgcG93ZXIgc2V0dGluZworCQkJYkxvd1B3ckRpc2FibGUgPSBGQUxTRTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsICZiTG93UHdyRGlzYWJsZSk7CisJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX05PUk1BTF9MUFMsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgQlRDX1BTX0xQU19PTjoKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIHRydWUpOworCQkJaGFsYnRjODE5MmUxYW50X0xwc1Jwd20ocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGxwc1ZhbCwgcnB3bVZhbCk7CisJCQkvLyB3aGVuIGNvZXggZm9yY2UgdG8gZW50ZXIgTFBTLCBkbyBub3QgZW50ZXIgMzJrIGxvdyBwb3dlci4KKwkJCWJMb3dQd3JEaXNhYmxlID0gdHJ1ZTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsICZiTG93UHdyRGlzYWJsZSk7CisJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIEJUQ19QU19MUFNfT0ZGOgorCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgRkFMU0UpOworCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlPbmx5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsJCit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAorCUlOIAlQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJc3RhdGljIEJPT0xFQU4JYlByZUJ0RGlzYWJsZWQ9RkFMU0U7CisJc3RhdGljIHU0Qnl0ZQkJYnREaXNhYmxlQ250PTA7CisJQk9PTEVBTgkJCWJCdEFjdGl2ZT10cnVlLCBiQnREaXNhYmxlZD1GQUxTRTsKKworCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKKworCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMCAmJgorCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPT0gMCAmJgorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAwICYmCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDApCisJeworCQliQnRBY3RpdmUgPSBGQUxTRTsKKwl9CisJaWYoCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKKwkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDB4ZmZmZiAmJgorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKKwkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPT0gMHhmZmZmKQorCXsKKwkJYkJ0QWN0aXZlID0gRkFMU0U7CisJfQorCWlmKGJCdEFjdGl2ZSkKKwl7CisJCWJ0RGlzYWJsZUNudCA9IDA7CisJCWJCdERpc2FibGVkID0gRkFMU0U7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZW5hYmxlZCAhIVxuIikpOworCX0KKwllbHNlCisJeworCQlidERpc2FibGVDbnQrKzsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKKwkJCQlidERpc2FibGVDbnQpKTsKKwkJaWYoYnREaXNhYmxlQ250ID49IDIpCisJCXsKKwkJCWJCdERpc2FibGVkID0gdHJ1ZTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU9ubHkocEJ0Q29leGlzdCk7CisJCX0KKwl9CisJaWYoYlByZUJ0RGlzYWJsZWQgIT0gYkJ0RGlzYWJsZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLCAKKwkJCShiUHJlQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSwgCisJCQkoYkJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIikpKTsKKwkJYlByZUJ0RGlzYWJsZWQgPSBiQnREaXNhYmxlZDsKKwkJaWYoIWJCdERpc2FibGVkKQorCQl7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CisJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX05PUk1BTF9MUFMsIE5VTEwpOworCQl9CisJfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vCVNvZnR3YXJlIENvZXggTWVjaGFuaXNtIHN0YXJ0CisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gU0NPIG9ubHkgb3IgU0NPK1BBTihIUykKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25TY28oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQl3aWZpUnNzaVN0YXRlOworCXU0Qnl0ZQl3aWZpQnc7CisKKwl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOworCQorCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCSAgaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSAgaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CisJCX0JCQorCX0KK30KKworCitWT0lECitoYWxidGM4MTkyZTFhbnRfQWN0aW9uSGlkKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1MUJ5dGUJd2lmaVJzc2lTdGF0ZTsJCisJdTRCeXRlCXdpZmlCdzsKKworCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQkJCisJfQorfQorCisvL0EyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKQorVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHAoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZTsKKwl1NEJ5dGUJCXdpZmlCdzsKKworCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CisJCX0JCQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHBQYW5IcygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCBidEluZm9FeHQ7CisJdTRCeXRlCQl3aWZpQnc7CisKKwlidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OworCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CisJCX0JCQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkcigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOworCXU0Qnl0ZQkJd2lmaUJ3OworCisJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQorCX0KK30KKworCisvL1BBTihIUykgb25seQorVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkhzKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCXdpZmlSc3NpU3RhdGU7CisJdTRCeXRlCQl3aWZpQnc7CisKKwl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOworCQl9CisJfQorfQorCisvL1BBTihFRFIpK0EyRFAKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5FZHJBMmRwKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIGJ0SW5mb0V4dDsKKwl1NEJ5dGUJCXdpZmlCdzsKKworCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CisJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkckhpZCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOworCXU0Qnl0ZQkJd2lmaUJ3OworCisJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJewkJCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOworCQl9CisJfQorfQorCisvLyBISUQrQTJEUCtQQU4oRURSKQorVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgYnRJbmZvRXh0OworCXU0Qnl0ZQkJd2lmaUJ3OworCisJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKKwl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJewkKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHAoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgYnRJbmZvRXh0OworCXU0Qnl0ZQkJd2lmaUJ3OworCisJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKKwl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJewkJCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CisJCX0KKwl9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8JTm9uLVNvZnR3YXJlIENvZXggTWVjaGFuaXNtIHN0YXJ0CisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CisJQk9PTEVBTgkJCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYkJ0SHNPbj1GQUxTRTsKKwkKKwkvLyBOb3RlOgorCS8vIERvIG5vdCBkbyBEYWNTd2luZyBoZXJlLCB1c2Ugb3JpZ2luYWwgc2V0dGluZy4KKwkKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CisJaWYoYkJ0SHNPbikKKwkJcmV0dXJuOworCisJaWYoIWJXaWZpQ29ubmVjdGVkKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOworCQkKKwkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKworCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CisJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJfQorCWVsc2UgaWYoIChwQnRMaW5rSW5mby0+YlNjb0V4aXN0KSB8fAorCQkJKHBCdExpbmtJbmZvLT5iSGlkT25seSkgKQorCXsKKwkJLy8gU0NPL0hJRC1vbmx5IGJ1c3kKKwkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOworCQkKKwkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKworCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CisJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfTFBTX09OLCAweDUwLCAweDApOworCisJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisKKwkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOworCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3koCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl3aWZpU3RhdHVzCisJKQoreworCVBCVENfQlRfTElOS19JTkZPIHBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CisJdTFCeXRlCQlidFJzc2lTdGF0ZT1CVENfUlNTSV9TVEFURV9ISUdIOworCisJaWYoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09IHdpZmlTdGF0dXMpCisJewkJCisJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQorCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CisJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJfQorCWVsc2UKKwl7CisJCWlmKHBCdExpbmtJbmZvLT5iSGlkT25seSkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQkKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBkZWMgYnQgcG93ZXIgZm9yIGRpZmYgbGV2ZWwKKwkJCWJ0UnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X0J0UnNzaVN0YXRlKDMsIDM0LCA0Mik7CisJCQlpZiggKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJCQkoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpICkKKwkJCXsKKwkJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQkJfQorCQkJZWxzZSBpZiggKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCQkJKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSApCisJCQl7CisJCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJCX0KKwkJCWVsc2UgaWYoIChidFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJCQkoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCQl7CisJCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwkJCX0KKworCQkJLy8gc3cgZGFjU3dpbmcKKwkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMHhjKTsKKworCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCA3KTsJCQkKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlQQlRDX0JUX0xJTktfSU5GTyBwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gZm9yIEhTISEhXG4iKSk7CisKKwloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CisKKwlpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpCisJeworCQkvLyBlcnJvciwgc2hvdWxkIG5vdCBiZSBoZXJlCisJCXBDb2V4RG0tPmVycm9yQ29uZGl0aW9uID0gMTsKKwl9CisJZWxzZSBpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisKKwkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDEwKTsKKwkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwl9CisJZWxzZSBpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cyAmJiAKKwkJCSFwQnRDb2V4aXN0LT5idF9saW5rX2luZm8uYkhpZE9ubHkpCisJeworCQlpZihwQ29leERtLT5jdXJTc1R5cGUgPT0gMSkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMTApOworCQkJLy9oYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzOCk7CisJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQl9CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCisJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9CVVNZKTsKKwl9Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkQnRBY2xCdXN5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJd2lmaVN0YXR1cworCSkKK3sKKwlQQlRDX0JUX0xJTktfSU5GTyBwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOworCisJaWYocEJ0TGlua0luZm8tPmJIaWRPbmx5KQorCXsKKwkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwgd2lmaVN0YXR1cyk7CisJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOworCQlyZXR1cm47CisJfQorCQorCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisKKwlpZiggKHBCdExpbmtJbmZvLT5iQTJkcE9ubHkpIHx8CisJCShwQnRMaW5rSW5mby0+YkhpZEV4aXN0JiZwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkgKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X1RkbWFEdXJhdGlvbkFkanVzdEZvckFjbChwQnRDb2V4aXN0LCB3aWZpU3RhdHVzKTsKKwl9CisJZWxzZSBpZiggKHBCdExpbmtJbmZvLT5iUGFuT25seSkgfHwKKwkJCShwQnRMaW5rSW5mby0+YkhpZEV4aXN0JiZwQnRMaW5rSW5mby0+YlBhbkV4aXN0KSApCisJeworCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCWlmKCAoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CisJCQkoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTiA9PSB3aWZpU3RhdHVzKSB8fAorCQkJKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUID09IHdpZmlTdGF0dXMpICkKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCQllbHNlCisJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOworCX0KKwkJCisJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKK30KKworCitWT0lECitoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJLy8gcG93ZXIgc2F2ZSBzdGF0ZQorCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKKworCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisKKwloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CisJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsJCit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CisKKwloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCisJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOworCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cit9CisKK1ZPSUQKK2hhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJLy8gcG93ZXIgc2F2ZSBzdGF0ZQorCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzICYmICFwQnRDb2V4aXN0LT5idF9saW5rX2luZm8uYkhpZE9ubHkpCisJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfTFBTX09OLCAweDUwLCAweDApOworCWVsc2UKKwkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOworCisJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpCisJeworCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LAorCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTik7CisJfQorCWVsc2UgaWYoIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgfHwKKwkJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCisJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOKTsKKwl9CisJZWxzZQorCXsJCQorCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKKwkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOworCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCX0KK30KKworCitWT0lECitoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCS8vIHBvd2VyIHNhdmUgc3RhdGUKKwlpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cyAmJiAhcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvLmJIaWRPbmx5KQorCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX0xQU19PTiwgMHg1MCwgMHgwKTsKKwllbHNlCisJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKKworCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRCdEFjbEJ1c3kocEJ0Q29leGlzdCwKKwkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUKTsKKwl9CisJZWxzZQorCXsJCQorCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKKwkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOworCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCUJPT0xFQU4gCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CisJQk9PTEVBTiAJYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKKwlCT09MRUFOIAliVW5kZXI0d2F5PUZBTFNFOworCXU0Qnl0ZQkJd2lmaUJ3OworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKT09PT5cbiIpKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKwlpZighYldpZmlDb25uZWN0ZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgbm90IGNvbm5lY3RlZDw9PT1cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJXzRfV0FZX1BST0dSRVNTLCAmYlVuZGVyNHdheSk7CisJaWYoYlVuZGVyNHdheSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldChwQnRDb2V4aXN0KTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKSwgcmV0dXJuIGZvciB3aWZpIGlzIHVuZGVyIDR3YXk8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKKwlpZihiU2NhbiB8fCBiTGluayB8fCBiUm9hbSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbihwQnRDb2V4aXN0KTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKSwgcmV0dXJuIGZvciB3aWZpIGlzIHVuZGVyIHNjYW48PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBwb3dlciBzYXZlIHN0YXRlCisJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMgJiYgIXBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mby5iSGlkT25seSkKKwkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19MUFNfT04sIDB4NTAsIDB4MCk7CisJZWxzZQorCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsJCisJaWYoIWJXaWZpQnVzeSkKKwl7CisJCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LCAKKwkJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9JRExFKTsKKwkJfQorCQllbHNlIGlmKCAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CisJCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCisJCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfSURMRSk7CisJCX0KKwkJZWxzZQorCQl7CQkJCQorCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOworCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpCisJCXsJCQkJCisJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCX0KKwkJZWxzZSBpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKKwkJewkJCQkKKwkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsJCQkKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJfQorCQllbHNlIGlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKQorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LAorCQkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0JVU1kpOworCQl9CisJCWVsc2UgaWYoIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgfHwKKwkJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwKKwkJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9CVVNZKTsKKwkJfQorCQllbHNlIAorCQl7CQkJCQorCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOworCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1J1blN3Q29leGlzdE1lY2hhbmlzbSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJQk9PTEVBTgkJCQliV2lmaVVuZGVyNUc9RkFMU0UsIGJXaWZpQnVzeT1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0U7CisJdTFCeXRlCQkJCWJ0SW5mb09yaWdpbmFsPTAsIGJ0UmV0cnlDbnQ9MDsKKwl1MUJ5dGUJCQkJYWxnb3JpdGhtPTA7CisKKwlyZXR1cm47CisKKwlhbGdvcml0aG0gPSBoYWxidGM4MTkyZTFhbnRfQWN0aW9uQWxnb3JpdGhtKHBCdENvZXhpc3QpOworCXBDb2V4RG0tPmN1ckFsZ29yaXRobSA9IGFsZ29yaXRobTsKKworCWlmKGhhbGJ0YzgxOTJlMWFudF9Jc0NvbW1vbkFjdGlvbihwQnRDb2V4aXN0KSkKKwl7CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaChwQ29leERtLT5jdXJBbGdvcml0aG0pCisJCXsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOgorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uU2NvKHBCdENvZXhpc3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ6CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElELlxuIikpOworCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWQocEJ0Q29leGlzdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0EyRFA6CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUC5cbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQTJkcChwQnRDb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzoKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBBMkRQK1BBTihIUykuXG4iKSk7CisJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHBQYW5IcyhwQnRDb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSOgorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOworCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5FZHIocEJ0Q29leGlzdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkhTOgorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKSk7CisJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkhzKHBCdENvZXhpc3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRyQTJkcChwQnRDb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CisJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkckhpZChwQnRDb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRCtBMkRQK1BBTi5cbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcihwQnRDb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA6CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKSk7CisJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHAocEJ0Q29leGlzdCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CisJCQkJaGFsYnRjODE5MmUxYW50X0NvZXhBbGxPZmYocEJ0Q29leGlzdCk7CisJCQkJYnJlYWs7CisJCX0KKwkJcENvZXhEbS0+cHJlQWxnb3JpdGhtID0gcENvZXhEbS0+Y3VyQWxnb3JpdGhtOworCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CisJQk9PTEVBTgliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYkJ0SHNPbj1GQUxTRTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpPT09PlxuIikpOworCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciBNYW51YWwgQ1RSTCA8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZihwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpLCByZXR1cm4gZm9yIFN0b3AgQ29leCBETSA8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZihwQ29leFN0YS0+YlVuZGVySXBzKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIElQUyAhISFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwkKKwloYWxidGM4MTkyZTFhbnRfUnVuU3dDb2V4aXN0TWVjaGFuaXNtKHBCdENvZXhpc3QpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkocEJ0Q29leGlzdCk7CisJCXJldHVybjsKKwl9CisKKwkvLyAxc3Mgb3IgMnNzCisJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCX0KKwllbHNlIGlmKGJCdEhzT24pCisJeworCQlpZihwQnRMaW5rSW5mby0+YkhpZE9ubHkpCisJCQloYWxidGM4MTkyZTFhbnRfU3dpdGNoU3NUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJZWxzZQorCQkJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJfQorCWVsc2UKKwkJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCisJaWYoYkJ0SHNPbikKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IcyhwQnRDb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKwlpZighYldpZmlDb25uZWN0ZWQpCisJeworCQlCT09MRUFOCWJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYlJvYW09RkFMU0U7CisJCQorCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgbm9uIGNvbm5lY3RlZC1pZGxlICEhIVxuIikpOworCisJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CisJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CisJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CisKKwkJaWYoYlNjYW4gfHwgYkxpbmsgfHwgYlJvYW0pCisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihwQnRDb2V4aXN0KTsKKwkJZWxzZQorCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQocEJ0Q29leGlzdCk7CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKHBCdENvZXhpc3QpOworCX0KK30KKworVk9JRAoraGFsYnRjODE5MmUxYW50X0luaXRDb2V4RG0oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQorewkKKwkvLyBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbQorCWhhbGJ0YzgxOTJlMWFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDYpOworCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAwKTsKKworCS8vIHN3IGFsbCBvZmYKKwloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOworCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKKworCWhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMik7CisKKwloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCA4KTsKKwloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMCk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0YzgxOTJlMWFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggRVhoYWxidGM4MTkyZTFhbnRfCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSW5pdEh3Q29uZmlnKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1NEJ5dGUJdTRUbXA9MDsKKwl1MTYJdTJUbXA9MDsKKwl1MUJ5dGUJdTFUbXA9MDsKKworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCAxQW50IEluaXQgSFcgQ29uZmlnISFcbiIpKTsKKworCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCisJcENvZXhEbS0+YnRSZjB4MWVCYWNrdXAgPSAKKwkJcEJ0Q29leGlzdC0+YnRjX2dldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOworCisJLy8gYW50ZW5uYSBzdyBjdHJsIHRvIGJ0CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGYsIDB4Nik7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTQ0LCAweDI0KTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg5MzAsIDB4NzAwNzAwKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4MjApOworCWlmKHBCdENvZXhpc3QtPmNoaXBJbnRlcmZhY2UgPT0gQlRDX0lOVEZfVVNCKQorCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2NCwgMHgzMDQzMDAwNCk7CisJZWxzZQorCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2NCwgMHgzMDAzMDAwNCk7CisKKwloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMCk7CisKKwkvLyBhbnRlbm5hIHN3aXRjaCBjb250cm9sIHBhcmFtZXRlcgorCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDg1OCwgMHg1NTU1NTU1NSk7CisKKwkvLyBjb2V4IHBhcmFtZXRlcnMKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgsIDB4MSk7CisJLy8gMHg3OTBbNTowXT0weDUKKwl1MVRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NzkwKTsKKwl1MVRtcCAmPSAweGMwOworCXUxVG1wIHw9IDB4NTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3OTAsIHUxVG1wKTsKKworCS8vIGVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NmUsIDB4NCk7CisKKwkvLyBlbmFibGUgUFRBCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NDAsIDB4MjApOworCS8vIGVuYWJsZSBtYWlsYm94IGludGVyZmFjZQorCXUyVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMmJ5dGUocEJ0Q29leGlzdCwgMHg0MCk7CisJdTJUbXAgfD0gQklUOTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUocEJ0Q29leGlzdCwgMHg0MCwgdTJUbXApOworCisJLy8gZW5hYmxlIFBUQSBJMkMgbWFpbGJveCAKKwl1MVRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4MTAxKTsKKwl1MVRtcCB8PSBCSVQ0OworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDEwMSwgdTFUbXApOworCisJLy8gZW5hYmxlIGJ0IGNsb2NrIHdoZW4gd2lmaSBpcyBkaXNhYmxlZC4KKwl1MVRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4OTMpOworCXUxVG1wIHw9IEJJVDA7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTMsIHUxVG1wKTsKKwkvLyBlbmFibGUgYnQgY2xvY2sgd2hlbiBzdXNwZW5kLgorCXUxVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3KTsKKwl1MVRtcCB8PSBCSVQwOworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDcsIHUxVG1wKTsKK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSW5pdENvZXhEbSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXggTWVjaGFuaXNtIEluaXQhIVxuIikpOworCisJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gPSBGQUxTRTsKKwkKKwloYWxidGM4MTkyZTFhbnRfSW5pdENvZXhEbShwQnRDb2V4aXN0KTsKK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfRGlzcGxheUNvZXhJbmZvKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKgkJcEJvYXJkSW5mbz0mcEJ0Q29leGlzdC0+Ym9hcmRfaW5mbzsKKwlQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CisJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlwdTFCeXRlCQkJCWNsaUJ1Zj1wQnRDb2V4aXN0LT5jbGlfYnVmOworCXUxQnl0ZQkJCQl1MVRtcFs0XSwgaSwgYnRJbmZvRXh0LCBwc1RkbWFDYXNlPTA7CisJdTRCeXRlCQkJCXU0VG1wWzRdOworCUJPT0xFQU4JCQkJYlJvYW09RkFMU0UsIGJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYldpZmlVbmRlcjVHPUZBTFNFOworCUJPT0xFQU4JCQkJYkJ0SHNPbj1GQUxTRSwgYldpZmlCdXN5PUZBTFNFOworCXM0Qnl0ZQkJCQl3aWZpUnNzaT0wLCBidEhzUnNzaT0wOworCXU0Qnl0ZQkJCQl3aWZpQncsIHdpZmlUcmFmZmljRGlyOworCXUxQnl0ZQkJCQl3aWZpRG90MTFDaG5sLCB3aWZpSHNDaG5sOworCXU0Qnl0ZQkJCQlmd1Zlcj0wLCBidFBhdGNoVmVyPTA7CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQlQgQ29leGlzdCBpbmZvXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bVW5kZXIgTWFudWFsIENvbnRyb2xdPT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlCdWYpOworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJfQkKKwlpZihwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKKwl7CisJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtDb2V4IGlzIFNUT1BQRURdPT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlCdWYpOworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJfQorCisJaWYoIXBCb2FyZEluZm8tPmJ0X2V4aXN0KQorCXsKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiQW50IFBHIG51bWJlci8gQW50IG1lY2hhbmlzbToiLCBcCisJCXBCb2FyZEluZm8tPnBnX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X251bSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCQorCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlZCIsICJCVCBzdGFjay8gaGNpIGV4dCB2ZXIiLCBcCisJCSgocFN0YWNrSW5mby0+YlByb2ZpbGVOb3RpZmllZCk/ICJZZXMiOiJObyIpLCBwU3RhY2tJbmZvLT5oY2lWZXJzaW9uKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9CVF9QQVRDSF9WRVIsICZidFBhdGNoVmVyKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd1Zlcik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZF8lZC8gMHgleC8gMHgleCglZCkiLCAiQ29leFZlci8gRndWZXIvIFBhdGNoVmVyIiwgXAorCQlHTENvZXhWZXJEYXRlODE5MmUxQW50LCBHTENvZXhWZXI4MTkyZTFBbnQsIGZ3VmVyLCBidFBhdGNoVmVyLCBidFBhdGNoVmVyKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9ET1QxMV9DSE5MLCAmd2lmaURvdDExQ2hubCk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlIc0NobmwpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCglZCkiLCAiRG90MTEgY2hhbm5lbCAvIEhzQ2hubChIc01vZGUpIiwgXAorCQl3aWZpRG90MTFDaG5sLCB3aWZpSHNDaG5sLCBiQnRIc09uKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggIiwgIkgyQyBXaWZpIGluZm9ybSBidCBjaG5sIEluZm8iLCBcCisJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSwgcENvZXhEbS0+d2lmaUNobmxJbmZvWzFdLAorCQlwQ29leERtLT53aWZpQ2hubEluZm9bMl0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X1dJRklfUlNTSSwgJndpZmlSc3NpKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0SHNSc3NpKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICJXaWZpIHJzc2kvIEhTIHJzc2kiLCBcCisJCXdpZmlSc3NpLCBidEhzUnNzaSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQgIiwgIldpZmkgYkxpbmsvIGJSb2FtLyBiU2NhbiIsIFwKKwkJYkxpbmssIGJSb2FtLCBiU2Nhbik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJmJXaWZpVW5kZXI1Ryk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZiV2lmaUJ1c3kpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX1RSQUZGSUNfRElSRUNUSU9OLCAmd2lmaVRyYWZmaWNEaXIpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlcy8gJXMgIiwgIldpZmkgc3RhdHVzIiwgXAorCQkoYldpZmlVbmRlcjVHPyAiNUciOiIyLjRHIiksCisJCSgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpQncpPyAiTGVnYWN5IjogKCgoQlRDX1dJRklfQldfSFQ0MD09d2lmaUJ3KT8gIkhUNDAiOiJIVDIwIikpKSwKKwkJKCghYldpZmlCdXN5KT8gImlkbGUiOiAoKEJUQ19XSUZJX1RSQUZGSUNfVFg9PXdpZmlUcmFmZmljRGlyKT8gInVwbGluayI6ImRvd25saW5rIikpKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IFslcy8gJWQvICVkXSAiLCAiQlQgW3N0YXR1cy8gcnNzaS8gcmV0cnlDbnRdIiwgXAorCQkoKHBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCk/ICgiZGlzYWJsZWQiKToJKChwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKTooKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJub24tY29ubmVjdGVkIGlkbGUiOgorCQkoICAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpPyAiY29ubmVjdGVkLWlkbGUiOiJidXN5IikpKSksCisJCXBDb2V4U3RhLT5idFJzc2ksIHBDb2V4U3RhLT5idFJldHJ5Q250KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCisJCXBCdExpbmtJbmZvLT5iU2NvRXhpc3QsIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QsIHBCdExpbmtJbmZvLT5iUGFuRXhpc3QsIHBCdExpbmtJbmZvLT5iQTJkcEV4aXN0KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwlwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOwkKKworCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyIsICJCVCBJbmZvIEEyRFAgcmF0ZSIsIFwKKwkJKGJ0SW5mb0V4dCZCSVQwKT8gIkJhc2ljIHJhdGUiOiJFRFIgcmF0ZSIpOworCUNMX1BSSU5URihjbGlCdWYpOwkKKworCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODE5MkVfMUFOVF9NQVg7IGkrKykKKwl7CisJCWlmKHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pCisJCXsJCQkJCisJCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngoJWQpIiwgR0xCdEluZm9TcmM4MTkyZTFBbnRbaV0sIFwKKwkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzBdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzFdLAorCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMl0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bM10sCisJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs0XSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs1XSwKKwkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzZdLCBwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKTsKKwkJCUNMX1BSSU5URihjbGlCdWYpOworCQl9CisJfQorCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvJXMsICgweCV4LzB4JXgpIiwgIlBTIHN0YXRlLCBJUFMvTFBTLCAobHBzL3Jwd20pIiwgXAorCQkoKHBDb2V4U3RhLT5iVW5kZXJJcHM/ICJJUFMgT04iOiJJUFMgT0ZGIikpLAorCQkoKHBDb2V4U3RhLT5iVW5kZXJMcHM/ICJMUFMgT04iOiJMUFMgT0ZGIikpLCAKKwkJcEJ0Q29leGlzdC0+YnRJbmZvLmxwczFBbnQsIAorCQlwQnRDb2V4aXN0LT5idEluZm8ucnB3bV8xYW50KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwlwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9GV19QV1JfTU9ERV9DTUQpOworCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJTUyBUeXBlIiwgXAorCQlwQ29leERtLT5jdXJTc1R5cGUpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJaWYoIXBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCXsKKwkJLy8gU3cgbWVjaGFuaXNtCQorCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkLyAlZCAiLCAiU00xW1NoUmYvIExwUkEvIExpbURpZy8gYnRMbmFdIiwgXAorCQkJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmssIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmxpbWl0ZWRfZGlnLCBwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW4pOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsIFwKKwkJCXBDb2V4RG0tPmJDdXJBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckRhY1N3aW5nT24sIHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8gJXMvICVkICIsICJEZWxCQS8gQnRDdHJsQWdnLyBBZ2dTaXplIiwgXAorCQkJKHBCdENvZXhpc3QtPmJ0SW5mby5yZWplY3RfYWdnX3BrdD8gIlllcyI6Ik5vIiksIChwQnRDb2V4aXN0LT5idEluZm8uYl9idF9jdHJsX2FnZ19idWZfc2l6ZT8gIlllcyI6Ik5vIiksCisJCQkJcEJ0Q29leGlzdC0+YnRJbmZvLmFnZ0J1ZlNpemUpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJSYXRlIE1hc2siLCBcCisJCQkJcEJ0Q29leGlzdC0+YnRJbmZvLnJhX21hc2spOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwkJLy8gRncgbWVjaGFuaXNtCQkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCisJCXBzVGRtYUNhc2UgPSBwQ29leERtLT5jdXJQc1RkbWE7CisJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQgKGF1dG86JWQpIiwgIlBTIFRETUEiLCBcCisJCQlwQ29leERtLT5wc1RkbWFQYXJhWzBdLCBwQ29leERtLT5wc1RkbWFQYXJhWzFdLAorCQkJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSwgcENvZXhEbS0+cHNUZG1hUGFyYVszXSwKKwkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbNF0sIHBzVGRtYUNhc2UsIHBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCk7CisJCUNMX1BSSU5URihjbGlCdWYpOworCisJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLCAiTGF0ZXN0IGVycm9yIGNvbmRpdGlvbihzaG91bGQgYmUgMCkiLCBcCisJCQlwQ29leERtLT5lcnJvckNvbmRpdGlvbik7CisJCUNMX1BSSU5URihjbGlCdWYpOworCQkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkRlY0J0UHdyTHZsLyBJZ25XbGFuQWN0IiwgXAorCQkJcENvZXhEbS0+Y3VyQnREZWNQd3JMdmwsIHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJfQorCisJLy8gSHcgc2V0dGluZwkJCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIlJGLUEsIDB4MWUgaW5pdFZhbCIsIFwKKwkJcENvZXhEbS0+YnRSZjB4MWVCYWNrdXApOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGMwNCk7CisJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGQwNCk7CisJdTRUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDkwYyk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwgIjB4YzA0LyAweGQwNC8gMHg5MGMiLCBcCisJCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4Nzc4IiwgXAorCQl1MVRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJCisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDkyYyk7CisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDkzMCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4OTJjLyAweDkzMCIsIFwKKwkJKHUxVG1wWzBdKSwgdTRUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDQwKTsKKwl1MVRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NGYpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweDQwLyAweDRmIiwgXAorCQl1MVRtcFswXSwgdTFUbXBbMV0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDU1MCk7CisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDUyMik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIFwKKwkJdTRUbXBbMF0sIHUxVG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNTApOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAorCQl1NFRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmMwKTsKKwl1NFRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0KTsKKwl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4KTsKKwl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKKwkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKKwkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4LCBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgpOworCUNMX1BSSU5URihjbGlCdWYpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4LCBwQ29leFN0YS0+bG93UHJpb3JpdHlUeCk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisjaWYoQlRfQVVUT19SRVBPUlRfT05MWV84MTkyRV8xQU5UID09IDEpCisJaGFsYnRjODE5MmUxYW50X01vbml0b3JCdEN0cihwQnRDb2V4aXN0KTsKKyNlbmRpZgorCQorCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cit9CisKKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSXBzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCXU0Qnl0ZQl1NFRtcD0wOworCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCisJCXJldHVybjsKKworCWlmKEJUQ19JUFNfRU5URVIgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBFTlRFUiBub3RpZnlcbiIpKTsKKwkJcENvZXhTdGEtPmJVbmRlcklwcyA9IHRydWU7CisJCWhhbGJ0YzgxOTJlMWFudF9Db2V4QWxsT2ZmKHBCdENvZXhpc3QpOworCX0KKwllbHNlIGlmKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpKTsKKwkJcENvZXhTdGEtPmJVbmRlcklwcyA9IEZBTFNFOworCX0KK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfTHBzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8IHBCdENvZXhpc3QtPmJTdG9wQ29leERtKQorCQlyZXR1cm47CisKKwlpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIEVOQUJMRSBub3RpZnlcbiIpKTsKKwkJcENvZXhTdGEtPmJVbmRlckxwcyA9IHRydWU7CisJfQorCWVsc2UgaWYoQlRDX0xQU19ESVNBQkxFID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpKTsKKwkJcENvZXhTdGEtPmJVbmRlckxwcyA9IEZBTFNFOworCX0KK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfU2Nhbk5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlCT09MRUFOIAkJYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CQorCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKKwkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gfHwKKwkJcEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkICkKKwkJcmV0dXJuOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkocEJ0Q29leGlzdCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihiQnRIc09uKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKHBCdENvZXhpc3QpOworCQlyZXR1cm47CisJfQorCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOworCWlmKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpCisJewkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpKTsKKwkJaWYoIWJXaWZpQ29ubmVjdGVkKQkvLyBub24tY29ubmVjdGVkIHNjYW4KKwkJeworCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4ocEJ0Q29leGlzdCk7CisJCX0KKwkJZWxzZQkvLyB3aWZpIGlzIGNvbm5lY3RlZAorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4ocEJ0Q29leGlzdCk7CisJCX0KKwl9CisJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIikpOworCQlpZighYldpZmlDb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgorCQl7CisJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChwQnRDb2V4aXN0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKHBCdENvZXhpc3QpOworCQl9CisJfQorfQorCitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9Db25uZWN0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCUJPT0xFQU4JYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CisKKwlpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fAorCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAorCQlwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQgKQorCQlyZXR1cm47CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CisJaWYocENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0SW5xdWlyeShwQnRDb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKGJCdEhzT24pCisJeworCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSHMocEJ0Q29leGlzdCk7CisJCXJldHVybjsKKwl9CisKKwlpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOworCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihwQnRDb2V4aXN0KTsKKwl9CisJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQ09OTkVDVCBGSU5JU0ggbm90aWZ5XG4iKSk7CisJCQorCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CisJCWlmKCFiV2lmaUNvbm5lY3RlZCkgLy8gbm9uLWNvbm5lY3RlZCBzY2FuCisJCXsKKwkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKHBCdENvZXhpc3QpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWQocEJ0Q29leGlzdCk7CisJCX0KKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X01lZGlhU3RhdHVzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclszXSA9ezB9OworCXU0Qnl0ZQkJCXdpZmlCdzsKKwl1MUJ5dGUJCQl3aWZpQ2VudHJhbENobmw7CisKKwlpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fAorCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAorCQlwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQgKQorCQlyZXR1cm47CisKKwlpZihCVENfTUVESUFfQ09OTkVDVCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTUVESUEgY29ubmVjdCBub3RpZnlcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTUVESUEgZGlzY29ubmVjdCBub3RpZnlcbiIpKTsKKwl9CisKKwkvLyBvbmx5IDIuNEcgd2UgbmVlZCB0byBpbmZvcm0gYnQgdGhlIGNobmwgbWFzaworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0NFTlRSQUxfQ0hOTCwgJndpZmlDZW50cmFsQ2hubCk7CisJaWYoIChCVENfTUVESUFfQ09OTkVDVCA9PSB0eXBlKSAmJgorCQkod2lmaUNlbnRyYWxDaG5sIDw9IDE0KSApCisJeworCQlIMkNfUGFyYW1ldGVyWzBdID0gMHgxOworCQlIMkNfUGFyYW1ldGVyWzFdID0gd2lmaUNlbnRyYWxDaG5sOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisJCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MzA7CisJCWVsc2UKKwkJCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDIwOworCX0KKwkJCisJcENvZXhEbS0+d2lmaUNobmxJbmZvWzBdID0gSDJDX1BhcmFtZXRlclswXTsKKwlwQ29leERtLT53aWZpQ2hubEluZm9bMV0gPSBIMkNfUGFyYW1ldGVyWzFdOworCXBDb2V4RG0tPndpZmlDaG5sSW5mb1syXSA9IEgyQ19QYXJhbWV0ZXJbMl07CisJCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjY9MHgleFxuIiwgCisJCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOworCisJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjYsIDMsIEgyQ19QYXJhbWV0ZXIpOworfQorCitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9TcGVjaWFsUGFja2V0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJQk9PTEVBTgliQnRIc09uPUZBTFNFOworCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKKwkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gfHwKKwkJcEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkICkKKwkJcmV0dXJuOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKKwl7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkocEJ0Q29leGlzdCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihiQnRIc09uKQorCXsKKwkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKHBCdENvZXhpc3QpOworCQlyZXR1cm47CisJfQorCisJaWYoIEJUQ19QQUNLRVRfREhDUCA9PSB0eXBlIHx8CisJCUJUQ19QQUNLRVRfRUFQT0wgPT0gdHlwZSApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBzcGVjaWFsIFBhY2tldCglZCkgbm90aWZ5XG4iLCB0eXBlKSk7CisJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldChwQnRDb2V4aXN0KTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X0J0SW5mb05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKKwlJTgl1MUJ5dGUJCQlsZW5ndGgKKwkpCit7CisJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwl1MUJ5dGUJCQkJYnRJbmZvPTA7CisJdTFCeXRlCQkJCWksIHJzcFNvdXJjZT0wOworCXN0YXRpYyB1NEJ5dGUJCXNldEJ0UHNkTW9kZT0wOworCUJPT0xFQU4JCQkJYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7CisJQk9PTEVBTgkJCQliV2lmaUNvbm5lY3RlZD1GQUxTRTsKKwlCT09MRUFOCQkJCWJfYnRfY3RybF9hZ2dfYnVmX3NpemU9RkFMU0U7CisKKwlwQ29leFN0YS0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBGQUxTRTsKKworCXJzcFNvdXJjZSA9IHRtcEJ1ZlswXSYweGY7CisJaWYocnNwU291cmNlID49IEJUX0lORk9fU1JDXzgxOTJFXzFBTlRfTUFYKQorCQlyc3BTb3VyY2UgPSBCVF9JTkZPX1NSQ184MTkyRV8xQU5UX1dJRklfRlc7CisJcENvZXhTdGEtPmJ0SW5mb0MyaENudFtyc3BTb3VyY2VdKys7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBCdCBpbmZvWyVkXSwgbGVuZ3RoPSVkLCBoZXggZGF0YT1bIiwgcnNwU291cmNlLCBsZW5ndGgpKTsKKwlmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorCXsKKwkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdW2ldID0gdG1wQnVmW2ldOworCQlpZihpID09IDEpCisJCQlidEluZm8gPSB0bXBCdWZbaV07CisJCWlmKGkgPT0gbGVuZ3RoLTEpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4XVxuIiwgdG1wQnVmW2ldKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTAyeCwgIiwgdG1wQnVmW2ldKSk7CisJCX0KKwl9CisKKwlpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIEJUIGlzIGRpc2FibGVkIDw9PT1cbiIpKTsKKwkJcmV0dXJuOworCX0JCisKKwlpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIHJldHVybiBmb3IgTWFudWFsIENUUkw8PT09XG4iKSk7CisJCXJldHVybjsKKwl9CisJaWYocEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIENvZXggU1RPUFBFRCEhPD09PVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYoQlRfSU5GT19TUkNfODE5MkVfMUFOVF9XSUZJX0ZXICE9IHJzcFNvdXJjZSkKKwl7CisJCXBDb2V4U3RhLT5idFJldHJ5Q250ID0JLy8gWzM6MF0KKwkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVsyXSYweGY7CisKKwkJcENvZXhTdGEtPmJ0UnNzaSA9CisJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bM10qMisxMDsKKworCQlwQ29leFN0YS0+YnRJbmZvRXh0ID0gCisJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bNF07CisKKwkJLy8gSGVyZSB3ZSBuZWVkIHRvIHJlc2VuZCBzb21lIHdpZmkgaW5mbyB0byBCVAorCQkvLyBiZWNhdXNlIGJ0IGlzIHJlc2V0IGFuZCBsb3NzIG9mIHRoZSBpbmZvLgorCQlpZiggKHBDb2V4U3RhLT5idEluZm9FeHQgJiBCSVQxKSApCisJCXsJCQkKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQlQgZXh0IGluZm8gYml0MSBjaGVjaywgc2VuZCB3aWZpIEJXJkNobmwgdG8gQlQhIVxuIikpOworCQkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOworCQkJaWYoYldpZmlDb25uZWN0ZWQpCisJCQl7CisJCQkJRVhoYWxidGM4MTkyZTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkocEJ0Q29leGlzdCwgQlRDX01FRElBX0NPTk5FQ1QpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUVYaGFsYnRjODE5MmUxYW50X01lZGlhU3RhdHVzTm90aWZ5KHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKKwkJCX0KKworCQkJc2V0QnRQc2RNb2RlID0gMDsKKwkJfQorCisJCS8vIHRlc3QtY2hpcCBidCBwYXRjaCBvbmx5IHJzcCB0aGUgc3RhdHVzIGZvciBCVF9SU1AsIAorCQkvLyBzbyB0ZW1wb3Jhcnkgd2UgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBvbmx5IHVuZGVyIEJUX1JTUAorCQlpZihCVF9JTkZPX1NSQ184MTkyRV8xQU5UX0JUX1JTUCA9PSByc3BTb3VyY2UpCisJCXsKKwkJCWlmKCAocENvZXhTdGEtPmJ0SW5mb0V4dCAmIEJJVDMpICkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDMgY2hlY2ssIHNldCBCVCBOT1QgdG8gaWdub3JlIFdsYW4gYWN0aXZlISFcbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gQlQgYWxyZWFkeSBOT1QgaWdub3JlIFdsYW4gYWN0aXZlLCBkbyBub3RoaW5nIGhlcmUuCisJCQl9CisjaWYoQlRfQVVUT19SRVBPUlRfT05MWV84MTkyRV8xQU5UID09IDApCisJCQlpZiggKHBDb2V4U3RhLT5idEluZm9FeHQgJiBCSVQ0KSApCisJCQl7CisJCQkJLy8gQlQgYXV0byByZXBvcnQgYWxyZWFkeSBlbmFibGVkLCBkbyBub3RoaW5nCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCVCBleHQgaW5mbyBiaXQ0IGNoZWNrLCBzZXQgQlQgdG8gZW5hYmxlIEF1dG8gUmVwb3J0ISFcbiIpKTsKKwkJCQloYWxidGM4MTkyZTFhbnRfQnRBdXRvUmVwb3J0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisJCQorCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCisJaWYoYnRJbmZvICYgQlRfSU5GT184MTkyRV8xQU5UX0JfSU5RX1BBR0UpCisJCXBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSA9IHRydWU7CisJZWxzZQorCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSBGQUxTRTsKKworCS8vIHNldCBsaW5rIGV4aXN0IHN0YXR1cworCWlmKCEoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0NPTk5FQ1RJT04pKQorCXsKKwkJcENvZXhTdGEtPmJCdExpbmtFeGlzdCA9IEZBTFNFOworCQlwQ29leFN0YS0+YlBhbkV4aXN0ID0gRkFMU0U7CisJCXBDb2V4U3RhLT5iQTJkcEV4aXN0ID0gRkFMU0U7CisJCXBDb2V4U3RhLT5iSGlkRXhpc3QgPSBGQUxTRTsKKwkJcENvZXhTdGEtPmJTY29FeGlzdCA9IEZBTFNFOworCX0KKwllbHNlIC8vIGNvbm5lY3Rpb24gZXhpc3RzIAorCXsKKwkJcENvZXhTdGEtPmJCdExpbmtFeGlzdCA9IHRydWU7CisJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0ZUUCkKKwkJCXBDb2V4U3RhLT5iUGFuRXhpc3QgPSB0cnVlOworCQllbHNlCisJCQlwQ29leFN0YS0+YlBhbkV4aXN0ID0gRkFMU0U7CisJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0EyRFApCisJCQlwQ29leFN0YS0+YkEyZHBFeGlzdCA9IHRydWU7CisJCWVsc2UKKwkJCXBDb2V4U3RhLT5iQTJkcEV4aXN0ID0gRkFMU0U7CisJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0hJRCkKKwkJCXBDb2V4U3RhLT5iSGlkRXhpc3QgPSB0cnVlOworCQllbHNlCisJCQlwQ29leFN0YS0+YkhpZEV4aXN0ID0gRkFMU0U7CisJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX1NDT19FU0NPKQorCQkJcENvZXhTdGEtPmJTY29FeGlzdCA9IHRydWU7CisJCWVsc2UKKwkJCXBDb2V4U3RhLT5iU2NvRXhpc3QgPSBGQUxTRTsKKwl9CisKKwloYWxidGM4MTkyZTFhbnRfVXBkYXRlQnRMaW5rSW5mbyhwQnRDb2V4aXN0KTsKKworCWlmKCEoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0NPTk5FQ1RJT04pKQorCXsKKwkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEU7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IG5vbi1jb25uZWN0ZWQgaWRsZSEhIVxuIikpOworCX0KKwllbHNlIGlmKGJ0SW5mbyA9PSBCVF9JTkZPXzgxOTJFXzFBTlRfQl9DT05ORUNUSU9OKQkvLyBjb25uZWN0aW9uIGV4aXN0cyBidXQgbm8gYnVzeQorCXsKKwkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKKwl9CQkKKwllbHNlIGlmKChidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfU0NPX0VTQ08pIHx8CisJCShidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfU0NPX0JVU1kpKQorCXsKKwkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgc2NvIGJ1c3khISFcbiIpKTsKKwl9CisJZWxzZSBpZiggKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9BQ0xfQlVTWSkgfHwKKwkJCShidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfQTJEUCkgfHwKKwkJCShidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfRlRQKSApCisJeworCQlpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSAhPSBwQ29leERtLT5idFN0YXR1cykKKwkJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOworCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBhY2wgYnVzeSEhIVxuIikpOworCX0KKwllbHNlCisJeworCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX01BWDsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgbm9uLWRlZmluZWQgc3RhdGUhISFcbiIpKTsKKwl9CisKKwkvLyByYSBtYXNrIGNoZWNrCisJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCB8fCBwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQorCXsKKwkJaGFsYnRjODE5MmUxYW50X1VwZGF0ZXJhX21hc2socEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEJUQ19SQVRFX0RJU0FCTEUsIDB4MDAwMDAwMDMpOwkvLyBkaXNhYmxlIHR4IGNjayAxTS8yTQorCX0KKwllbHNlCisJeworCQloYWxidGM4MTkyZTFhbnRfVXBkYXRlcmFfbWFzayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgQlRDX1JBVEVfRU5BQkxFLCAweDAwMDAwMDAzKTsJLy8gZW5hYmxlIHR4IGNjayAxTS8yTQorCX0KKwkKKwlpZiggKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKSB8fAorCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CisJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCWJCdEJ1c3kgPSB0cnVlOworCQlsaW1pdGVkX2RpZyA9IHRydWU7CisJCWlmKHBCdExpbmtJbmZvLT5iSGlkRXhpc3QpCisJCQliX2J0X2N0cmxfYWdnX2J1Zl9zaXplID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJYkJ0QnVzeSA9IEZBTFNFOworCQlsaW1pdGVkX2RpZyA9IEZBTFNFOworCX0KKwlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfVFJBRkZJQ19CVVNZLCAmYkJ0QnVzeSk7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8JQWdncmVnYXRpb24gcmVsYXRlZCBzZXR0aW5nCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIGlmIHNjbywgcmVqZWN0IEFkZEJBCisJLy9wQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfVE9fUkVKX0FQX0FHR19QS1QsICZiUmVqQXBBZ2dQa3QpOworCisJLy8gZGVjaWRlIEJUIGNvbnRyb2wgYWdncmVnYXRpb24gYnVmIHNpemUgb3Igbm90CisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0NUUkxfQUdHX1NJWkUsICZiX2J0X2N0cmxfYWdnX2J1Zl9zaXplKTsKKwkvLyByZWFsIHVwZGF0ZSBhZ2dyZWdhdGlvbiBzZXR0aW5nCisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9BR0dSRUdBVEVfQ1RSTCwgTlVMTCk7CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcENvZXhEbS0+bGltaXRlZF9kaWcgPSBsaW1pdGVkX2RpZzsKKwlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfTElNSVRFRF9ESUcsICZsaW1pdGVkX2RpZyk7CisKKwloYWxidGM4MTkyZTFhbnRfUnVuQ29leGlzdE1lY2hhbmlzbShwQnRDb2V4aXN0KTsKK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSkKK3sKKwlpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9TVEFSVCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBzdGFydCBub3RpZnlcbiIpKTsKKwl9CisJZWxzZSBpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9GSU5JU0ggPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgZmluaXNoIG5vdGlmeVxuIikpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSGFsdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKSk7CisKKwlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSA9IHRydWU7CisJaGFsYnRjODE5MmUxYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CisKKwloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CisJCisJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMCk7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGYsIDB4Zik7CisKKwlFWGhhbGJ0YzgxOTJlMWFudF9NZWRpYVN0YXR1c05vdGlmeShwQnRDb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7Cit9CisKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1BucE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQlwbnBTdGF0ZQorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBQbnAgbm90aWZ5XG4iKSk7CisKKwlpZihCVENfV0lGSV9QTlBfU0xFRVAgPT0gcG5wU3RhdGUpCisJeworCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSA9IHRydWU7CisJCWhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CisJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsJCisJfQorCWVsc2UgaWYoQlRDX1dJRklfUE5QX1dBS0VfVVAgPT0gcG5wU3RhdGUpCisJeworCQkKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1BlcmlvZGljYWwoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAorCSkKK3sKKwlzdGF0aWMgdTFCeXRlCQlkaXNWZXJJbmZvQ250PTA7CisJdTRCeXRlCQkJCWZ3VmVyPTAsIGJ0UGF0Y2hWZXI9MDsKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKgkJcEJvYXJkSW5mbz0mcEJ0Q29leGlzdC0+Ym9hcmRfaW5mbzsKKwlQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sID09PT09PT09PT09PT09PT09PT09PT09PT09UGVyaW9kaWNhbD09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikpOworCisJaWYoZGlzVmVySW5mb0NudCA8PSA1KQorCXsKKwkJZGlzVmVySW5mb0NudCArPSAxOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQW50IFBHIE51bS8gQW50IE1lY2gvIEFudCBQb3MgPSAlZC8gJWQvICVkXG4iLCBcCisJCQlwQm9hcmRJbmZvLT5wZ19hbnRfbnVtLCBwQm9hcmRJbmZvLT5idGRtX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X3BvcykpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQlQgc3RhY2svIGhjaSBleHQgdmVyID0gJXMgLyAlZFxuIiwgXAorCQkJKChwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKT8gIlllcyI6Ik5vIiksIHBTdGFja0luZm8tPmhjaVZlcnNpb24pKTsKKwkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwgJmJ0UGF0Y2hWZXIpOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd1Zlcik7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBDb2V4VmVyLyBGd1Zlci8gUGF0Y2hWZXIgPSAlZF8leC8gMHgleC8gMHgleCglZClcbiIsIFwKKwkJCUdMQ29leFZlckRhdGU4MTkyZTFBbnQsIEdMQ29leFZlcjgxOTJlMUFudCwgZndWZXIsIGJ0UGF0Y2hWZXIsIGJ0UGF0Y2hWZXIpKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKKwl9CisjaWYoQlRfQVVUT19SRVBPUlRfT05MWV84MTkyRV8xQU5UID09IDApCisJaGFsYnRjODE5MmUxYW50X1F1ZXJ5QnRJbmZvKHBCdENvZXhpc3QpOworCWhhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRDdHIocEJ0Q29leGlzdCk7CisJaGFsYnRjODE5MmUxYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUocEJ0Q29leGlzdCk7CisjZWxzZQorCWlmKCBoYWxidGM4MTkyZTFhbnRfSXNXaWZpU3RhdHVzQ2hhbmdlZChwQnRDb2V4aXN0KSB8fAorCQlwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpCisJeworCQloYWxidGM4MTkyZTFhbnRfUnVuQ29leGlzdE1lY2hhbmlzbShwQnRDb2V4aXN0KTsKKwl9CisjZW5kaWYKK30KKworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfRGJnQ29udHJvbCgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQlvcENvZGUsCisJSU4JdTFCeXRlCQkJCW9wTGVuLAorCUlOCXB1MUJ5dGUJCQkJcERhdGEKKwkpCit7CisJc3dpdGNoKG9wQ29kZSkKKwl7CisJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9OT1JNQUw6CisJCQlwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCA9IEZBTFNFOworCQkJaGFsYnRjODE5MmUxYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVENfREJHX1NFVF9DT0VYX1dJRklfT05MWToKKwkJCXBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gdHJ1ZTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKKwkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsJCisJCQlicmVhazsKKwkJY2FzZSBCVENfREJHX1NFVF9DT0VYX0JUX09OTFk6CisJCQkvLyB0b2RvCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTliNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuaApAQCAtMCwwICsxLDIyNiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaGUgZm9sbG93aW5nIGlzIGZvciA4MTkyRV8xQU5UIEJUIENvLWV4aXN0IGRlZmluaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZQlCVF9BVVRPX1JFUE9SVF9PTkxZXzgxOTJFXzFBTlQJCQkJMAorCisjZGVmaW5lCUJUX0lORk9fODE5MkVfMUFOVF9CX0ZUUAkJCQkJCUJJVDcKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8xQU5UX0JfQTJEUAkJCQkJQklUNgorI2RlZmluZQlCVF9JTkZPXzgxOTJFXzFBTlRfQl9ISUQJCQkJCQlCSVQ1CisjZGVmaW5lCUJUX0lORk9fODE5MkVfMUFOVF9CX1NDT19CVVNZCQkJCUJJVDQKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8xQU5UX0JfQUNMX0JVU1kJCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzgxOTJFXzFBTlRfQl9JTlFfUEFHRQkJCQlCSVQyCisjZGVmaW5lCUJUX0lORk9fODE5MkVfMUFOVF9CX1NDT19FU0NPCQkJCUJJVDEKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8xQU5UX0JfQ09OTkVDVElPTgkJCQlCSVQwCisKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8xQU5UX0EyRFBfQkFTSUNfUkFURShfQlRfSU5GT19FWFRfKQlcCisJCSgoKF9CVF9JTkZPX0VYVF8mQklUMCkpPyB0cnVlOkZBTFNFKQorCisjZGVmaW5lCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UCQkyCisKK3R5cGVkZWYgZW51bSBfQlRfSU5GT19TUkNfODE5MkVfMUFOVHsKKwlCVF9JTkZPX1NSQ184MTkyRV8xQU5UX1dJRklfRlcJCQk9IDB4MCwKKwlCVF9JTkZPX1NSQ184MTkyRV8xQU5UX0JUX1JTUAkJCQk9IDB4MSwKKwlCVF9JTkZPX1NSQ184MTkyRV8xQU5UX0JUX0FDVElWRV9TRU5ECQk9IDB4MiwKKwlCVF9JTkZPX1NSQ184MTkyRV8xQU5UX01BWAorfUJUX0lORk9fU1JDXzgxOTJFXzFBTlQsKlBCVF9JTkZPX1NSQ184MTkyRV8xQU5UOworCit0eXBlZGVmIGVudW0gX0JUXzgxOTJFXzFBTlRfQlRfU1RBVFVTeworCUJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRQk9IDB4MCwKKwlCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRQkJPSAweDEsCisJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfSU5RX1BBR0UJCQkJPSAweDIsCisJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kJCQkJPSAweDMsCisJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kJCQkJPSAweDQsCisJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZCQkJPSAweDUsCisJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTUFYCit9QlRfODE5MkVfMUFOVF9CVF9TVEFUVVMsKlBCVF84MTkyRV8xQU5UX0JUX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9CVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTeworCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFCQkJCT0gMHgwLAorCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9BU1NPX0FVVEhfU0NBTgkJPSAweDEsCisJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTgkJCQkJPSAweDIsCisJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU1BFQ0lBTF9QS1QJCQkJPSAweDMsCisJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfSURMRQkJCQkJPSAweDQsCisJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfQlVTWQkJCQkJPSAweDUsCisJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19NQVgKK31CVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTLCpQQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9CVF84MTkyRV8xQU5UX0NPRVhfQUxHT3sKKwlCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19VTkRFRklORUQJCQk9IDB4MCwKKwlCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ08JCQkJPSAweDEsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElECQkJCT0gMHgyLAorCUJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0EyRFAJCQkJPSAweDMsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUwkJPSAweDQsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSCQkJPSAweDUsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFOSFMJCQk9IDB4NiwKKwlCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUAkJPSAweDcsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRAkJPSAweDgsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSCT0gMHg5LAorCUJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQCQkJPSAweGEsCisJQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fTUFYCQkJCT0gMHhiLAorfUJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPLCpQQlRfODE5MkVfMUFOVF9DT0VYX0FMR087CisKK3R5cGVkZWYgc3RydWN0IF9DT0VYX0RNXzgxOTJFXzFBTlR7CisJLy8gZncgbWVjaGFuaXNtCisJdTFCeXRlCQlwcmVCdERlY1B3ckx2bDsKKwl1MUJ5dGUJCWN1ckJ0RGVjUHdyTHZsOworCUJPT0xFQU4JCWJQcmVCdExuYUNvbnN0cmFpbjsKKwlCT09MRUFOCQliQ3VyQnRMbmFDb25zdHJhaW47CisJdTFCeXRlCQliUHJlQnRQc2RNb2RlOworCXUxQnl0ZQkJYkN1ckJ0UHNkTW9kZTsKKwl1MUJ5dGUJCXByZUZ3RGFjU3dpbmdMdmw7CisJdTFCeXRlCQljdXJGd0RhY1N3aW5nTHZsOworCUJPT0xFQU4JCWJDdXJJZ25vcmVXbGFuQWN0OworCUJPT0xFQU4JCWJQcmVJZ25vcmVXbGFuQWN0OworCXUxQnl0ZQkJcHJlUHNUZG1hOworCXUxQnl0ZQkJY3VyUHNUZG1hOworCXUxQnl0ZQkJcHNUZG1hUGFyYVs1XTsKKwl1MUJ5dGUJCXBzVGRtYUR1QWRqVHlwZTsKKwlCT09MRUFOCQliQXV0b1RkbWFBZGp1c3Q7CisJQk9PTEVBTgkJYlByZVBzVGRtYU9uOworCUJPT0xFQU4JCWJDdXJQc1RkbWFPbjsKKwlCT09MRUFOCQliUHJlQnRBdXRvUmVwb3J0OworCUJPT0xFQU4JCWJDdXJCdEF1dG9SZXBvcnQ7CisJdTFCeXRlCQlwcmVMcHM7CisJdTFCeXRlCQljdXJMcHM7CisJdTFCeXRlCQlwcmVScHdtOworCXUxQnl0ZQkJY3VyUnB3bTsKKworCS8vIHN3IG1lY2hhbmlzbQorCUJPT0xFQU4JCWJQcmVSZlJ4THBmU2hyaW5rOworCUJPT0xFQU4JCWJDdXJSZlJ4THBmU2hyaW5rOworCXU0Qnl0ZQkJYnRSZjB4MWVCYWNrdXA7CisJQk9PTEVBTiAJYlByZUxvd1BlbmFsdHlSYTsKKwlCT09MRUFOCQliQ3VyTG93UGVuYWx0eVJhOworCUJPT0xFQU4JCWJQcmVEYWNTd2luZ09uOworCXU0Qnl0ZQkJcHJlRGFjU3dpbmdMdmw7CisJQk9PTEVBTgkJYkN1ckRhY1N3aW5nT247CisJdTRCeXRlCQljdXJEYWNTd2luZ0x2bDsKKwlCT09MRUFOCQliUHJlQWRjQmFja09mZjsKKwlCT09MRUFOCQliQ3VyQWRjQmFja09mZjsKKwlCT09MRUFOIAliUHJlQWdjVGFibGVFbjsKKwlCT09MRUFOCQliQ3VyQWdjVGFibGVFbjsKKwl1NEJ5dGUJCXByZVZhbDB4NmMwOworCXU0Qnl0ZQkJY3VyVmFsMHg2YzA7CisJdTRCeXRlCQlwcmVWYWwweDZjNDsKKwl1NEJ5dGUJCWN1clZhbDB4NmM0OworCXU0Qnl0ZQkJcHJlVmFsMHg2Yzg7CisJdTRCeXRlCQljdXJWYWwweDZjODsKKwl1MUJ5dGUJCXByZVZhbDB4NmNjOworCXUxQnl0ZQkJY3VyVmFsMHg2Y2M7CisJQk9PTEVBTgkJbGltaXRlZF9kaWc7CisKKwkvLyBhbGdvcml0aG0gcmVsYXRlZAorCXUxQnl0ZQkJcHJlQWxnb3JpdGhtOworCXUxQnl0ZQkJY3VyQWxnb3JpdGhtOworCXUxQnl0ZQkJYnRTdGF0dXM7CisJdTFCeXRlCQl3aWZpQ2hubEluZm9bM107CisKKwl1MUJ5dGUJCXByZVNzVHlwZTsKKwl1MUJ5dGUJCWN1clNzVHlwZTsKKworCXU0Qnl0ZQkJcHJlcmFfbWFzazsKKwl1NEJ5dGUJCWN1cnJhX21hc2s7CisKKwl1MUJ5dGUJCWVycm9yQ29uZGl0aW9uOworfSBDT0VYX0RNXzgxOTJFXzFBTlQsICpQQ09FWF9ETV84MTkyRV8xQU5UOworCit0eXBlZGVmIHN0cnVjdCBfQ09FWF9TVEFfODE5MkVfMUFOVHsKKwlCT09MRUFOCQkJCQliQnRMaW5rRXhpc3Q7CisJQk9PTEVBTgkJCQkJYlNjb0V4aXN0OworCUJPT0xFQU4JCQkJCWJBMmRwRXhpc3Q7CisJQk9PTEVBTgkJCQkJYkhpZEV4aXN0OworCUJPT0xFQU4JCQkJCWJQYW5FeGlzdDsKKworCUJPT0xFQU4JCQkJCWJVbmRlckxwczsKKwlCT09MRUFOCQkJCQliVW5kZXJJcHM7CisJdTRCeXRlCQkJCQloaWdoUHJpb3JpdHlUeDsKKwl1NEJ5dGUJCQkJCWhpZ2hQcmlvcml0eVJ4OworCXU0Qnl0ZQkJCQkJbG93UHJpb3JpdHlUeDsKKwl1NEJ5dGUJCQkJCWxvd1ByaW9yaXR5Ung7CisJdTFCeXRlCQkJCQlidFJzc2k7CisJdTFCeXRlCQkJCQlwcmVCdFJzc2lTdGF0ZTsKKwl1MUJ5dGUJCQkJCXByZVdpZmlSc3NpU3RhdGVbNF07CisJQk9PTEVBTgkJCQkJYkMyaEJ0SW5mb1JlcVNlbnQ7CisJdTFCeXRlCQkJCQlidEluZm9DMmhbQlRfSU5GT19TUkNfODE5MkVfMUFOVF9NQVhdWzEwXTsKKwl1NEJ5dGUJCQkJCWJ0SW5mb0MyaENudFtCVF9JTkZPX1NSQ184MTkyRV8xQU5UX01BWF07CisJQk9PTEVBTgkJCQkJYkMyaEJ0SW5xdWlyeVBhZ2U7CisJdTFCeXRlCQkJCQlidFJldHJ5Q250OworCXUxQnl0ZQkJCQkJYnRJbmZvRXh0OworfUNPRVhfU1RBXzgxOTJFXzFBTlQsICpQQ09FWF9TVEFfODE5MkVfMUFOVDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaGUgZm9sbG93aW5nIGlzIGludGVyZmFjZSB3aGljaCB3aWxsIG5vdGlmeSBjb2V4IG1vZHVsZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSW5pdEh3Q29uZmlnKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9Jbml0Q29leERtKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9JcHNOb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfTHBzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1NjYW5Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfQ29ubmVjdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9NZWRpYVN0YXR1c05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1NwZWNpYWxQYWNrZXROb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9CdEluZm9Ob3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXB1MUJ5dGUJCQl0bXBCdWYsCisJSU4JdTFCeXRlCQkJbGVuZ3RoCisJKTsKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1N0YWNrT3BlcmF0aW9uTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfSGFsdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODE5MmUxYW50X1BucE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQlwbnBTdGF0ZQorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9QZXJpb2RpY2FsKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpOworVk9JRAorRVhoYWxidGM4MTkyZTFhbnRfRGlzcGxheUNvZXhJbmZvKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSk7CitWT0lECitFWGhhbGJ0YzgxOTJlMWFudF9EYmdDb250cm9sKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCW9wQ29kZSwKKwlJTgl1MUJ5dGUJCQkJb3BMZW4sCisJSU4JcHUxQnl0ZSAJCQlwRGF0YQorCSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWM3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYwpAQCAtMCwwICsxLDQyNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBmaWxlIGlzIGZvciBSVEw4MTkyRSBDby1leGlzdCBtZWNoYW5pc20KKyAqCisgKiBIaXN0b3J5CisgKiAyMDEyLzExLzE1IENvc2EgZmlyc3QgY2hlY2sgaW4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImhhbGJ0X3ByZWNvbXAuaCIKKyNpZiAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgY29leF9kbV84MTkyZV8yYW50IGdsY29leF9kbV84MTkyZV8yYW50Oworc3RhdGljIHN0cnVjdCBjb2V4X2RtXzgxOTJlXzJhbnQgKmNvZXhfZG0gPSAmZ2xjb2V4X2RtXzgxOTJlXzJhbnQ7CitzdGF0aWMgc3RydWN0IGNvZXhfc3RhXzgxOTJlXzJhbnQgZ2xjb2V4X3N0YV84MTkyZV8yYW50Oworc3RhdGljIHN0cnVjdCBjb2V4X3N0YV84MTkyZV8yYW50ICpjb2V4X3N0YSA9ICZnbGNvZXhfc3RhXzgxOTJlXzJhbnQ7CisKK2NvbnN0IGNoYXIgKmNvbnN0IEdMQnRJbmZvU3JjODE5MmUyQW50W109eworCSJCVCBJbmZvW3dpZmkgZnddIiwKKwkiQlQgSW5mb1tidCByc3BdIiwKKwkiQlQgSW5mb1tidCBhdXRvIHJlcG9ydF0iLAorfTsKKwordTMyIGdsY29leF92ZXJfZGF0ZV84MTkyZV8yYW50ID0gMjAxMzA5MDI7Cit1MzIgZ2xjb2V4X3Zlcl84MTkyZV8yYW50ID0gMHgzNDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIGxvY2FsIGZ1bmN0aW9uIHByb3RvIHR5cGUgaWYgbmVlZGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBoYWxidGM4MTkyZTJhbnRfCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBoYWxidGM4MTkyZTJhbnRfYnRyc3NpX3N0YXRlKHU4IGxldmVsX251bSwgdTggcnNzaV90aHJlc2gsIHU4IHJzc2lfdGhyZXNoMSkKK3sKKwlpbnQgYnRyc3NpPTA7CisJdTggYnRyc3NpX3N0YXRlID0gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCisJYnRyc3NpID0gY29leF9zdGEtPmJ0X3Jzc2k7CisKKwlpZiAobGV2ZWxfbnVtID09IDIpIHsKKwkJaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCSAgIkJUIFJzc2kgcHJlIHN0YXRlPUxPV1xuIik7CisJCQlpZiAoYnRyc3NpID49IChyc3NpX3RocmVzaCArCisJCQkJICAgICAgIEJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8yQU5UKSkgeworCQkJCWJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIkJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkgICJCVCBSc3NpIHByZSBzdGF0ZT1ISUdIXG4iKTsKKwkJCWlmIChidHJzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIik7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGxldmVsX251bSA9PSAzKSB7CisJCWlmIChyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJICAiQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIik7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCQl9CisKKwkJaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCSAgIkJUIFJzc2kgcHJlIHN0YXRlPUxPV1xuIik7CisJCQlpZihidHJzc2kgPj0gKHJzc2lfdGhyZXNoICsKKwkJCQkgICAgICBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMkFOVCkpIHsKKwkJCQlidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIkJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09CisJCQkgICAgQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJICAgKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PQorCQkJICAgIEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgcHJlIHN0YXRlPU1FRElVTVxuIik7CisJCQlpZiAoYnRyc3NpID49IChyc3NpX3RocmVzaDEgKworCQkJCSAgICAgICBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMkFOVCkpIHsKKwkJCQlidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKTsKKwkJCX0gZWxzZSBpZiAoYnRyc3NpIDwgcnNzaV90aHJlc2gpIHsKKwkJCQlidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIkJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCSAgIkJUIFJzc2kgcHJlIHN0YXRlPUhJR0hcbiIpOworCQkJaWYgKGJ0cnNzaSA8IHJzc2lfdGhyZXNoMSkgeworCQkJCWJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIik7CisJCQl9CisJCX0KKwl9CisKKwljb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPSBidHJzc2lfc3RhdGU7CisKKwlyZXR1cm4gYnRyc3NpX3N0YXRlOworfQorCit1OCBoYWxidGM4MTkyZTJhbnRfd2lmaXJzc2lfc3RhdGUoc3RydWN0IGJ0Y19jb2V4aXN0ICogYnRjb2V4aXN0LCB1OCBpbmRleCwKKwkJCQkgIHU4IGxldmVsX251bSwgdTggcnNzaV90aHJlc2gsIHU4IHJzc2lfdGhyZXNoMSkKK3sKKwlpbnQgd2lmaXJzc2kgPSAwOworCXU4IHdpZmlyc3NpX3N0YXRlID0gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpcnNzaSk7CisKKwlpZiAobGV2ZWxfbnVtID09IDIpIHsKKwkJaWYgKChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJICAgICBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCSAgICAoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09CisJCSAgICAgQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCQlpZiAod2lmaXJzc2kgPj0gKHJzc2lfdGhyZXNoICsKKwkJCQkJIEJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8yQU5UKSkgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIndpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpOworIAkJCX0KKyAJCX0gZWxzZSB7CisJCQlpZiAod2lmaXJzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAid2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpOworCQkJfSBlbHNlIHsKKwkJCQl3aWZpcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIndpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChsZXZlbF9udW0gPT0gMykgeworCQlpZiAocnNzaV90aHJlc2ggPiByc3NpX3RocmVzaDEpIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJICAid2lmaSBSU1NJIHRocmVzaCBlcnJvciEhXG4iKTsKKwkJCXJldHVybiBjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF07CisJCX0KKworCQlpZiAoKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkgICAgIEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJICAgICBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCWlmICh3aWZpcnNzaSA+PSAocnNzaV90aHJlc2ggKworCQkJCQkgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzJBTlQpKSB7CisJCQkJd2lmaXJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJCSAgICBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCQkgICAoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09CisJCQkgICAgQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCQlpZiAod2lmaXJzc2kgPj0gKHJzc2lfdGhyZXNoMSArCisJCQkJCSBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMkFOVCkpIHsKKwkJCQl3aWZpcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIGlmICh3aWZpcnNzaSA8IHJzc2lfdGhyZXNoKSB7CisJCQkJd2lmaXJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHdpZmlyc3NpIDwgcnNzaV90aHJlc2gxKSB7CisJCQkJd2lmaXJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJ3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAid2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIik7CisJCQl9CisJCX0KKwl9CisKKwljb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPSB3aWZpcnNzaV9zdGF0ZTsKKworCXJldHVybiB3aWZpcnNzaV9zdGF0ZTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfbW9uaXRvcl9idF9lbmFibGVfZGlzYWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdGF0aWMgYm9vbCBwcmVfYnRfZGlzYWJsZWQgPSBmYWxzZTsKKwlzdGF0aWMgdTMyIGJ0X2Rpc2FibGVfY250ID0gMDsKKwlib29sIGJ0X2FjdGl2ZSA9IHRydWUsIGJ0X2Rpc2FibGVkID0gZmFsc2U7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGJ0IGlzIGRpc2FibGVkICovCisKKwlpZiAoY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAwICYmCisJICAgIGNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDApCisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4ID09IDB4ZmZmZiAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCA9PSAweGZmZmYpCisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGJ0X2FjdGl2ZSkgeworCQlidF9kaXNhYmxlX2NudCA9IDA7CisJCWJ0X2Rpc2FibGVkID0gZmFsc2U7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwKKwkJCQkgICAmYnRfZGlzYWJsZWQpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJCSAgIltCVENvZXhdLCBCVCBpcyBlbmFibGVkICEhXG4iKTsKKwl9IGVsc2UgeworCQlidF9kaXNhYmxlX2NudCsrOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJCSAgIltCVENvZXhdLCBidCBhbGwgY291bnRlcnM9MCwgJWQgdGltZXMhIVxuIiwKKwkJCSAgYnRfZGlzYWJsZV9jbnQpOworCQlpZiAoYnRfZGlzYWJsZV9jbnQgPj0gMikgeworCQkJYnRfZGlzYWJsZWQgPSB0cnVlOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLAorCQkJCQkgICAmYnRfZGlzYWJsZWQpOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCQkJICAiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKTsKKwkJfQorCX0KKwlpZiAocHJlX2J0X2Rpc2FibGVkICE9IGJ0X2Rpc2FibGVkKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkJICAiW0JUQ29leF0sIEJUIGlzIGZyb20gJXMgdG8gJXMhIVxuIiwKKwkJCSAgKHByZV9idF9kaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSwKKwkJCSAgKGJ0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKTsKKwkJcHJlX2J0X2Rpc2FibGVkID0gYnRfZGlzYWJsZWQ7CisJfQorfQorCit1MzIgaGFsYnRjODE5MmUyYW50X2RlY2lkZXJhX21hc2soc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICB1OCBzc3R5cGUsIHUzMiByYV9tYXNrdHlwZSkKK3sKKwl1MzIgZGlzcmFfbWFzayA9IDB4MDsKKworCXN3aXRjaCAocmFfbWFza3R5cGUpIHsKKwljYXNlIDA6IC8qIG5vcm1hbCBtb2RlICovCisJCWlmIChzc3R5cGUgPT0gMikKKwkJCWRpc3JhX21hc2sgPSAweDA7CS8qIGVuYWJsZSAyc3MgKi8KKwkJZWxzZQorCQkJZGlzcmFfbWFzayA9IDB4ZmZmMDAwMDA7LyogZGlzYWJsZSAyc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAxOiAvKiBkaXNhYmxlIGNjayAxLzIgKi8KKwkJaWYoc3N0eXBlID09IDIpCisJCQlkaXNyYV9tYXNrID0gMHgwMDAwMDAwMzsvKiBlbmFibGUgMnNzICovCisJCWVsc2UKKwkJCWRpc3JhX21hc2sgPSAweGZmZjAwMDAzOy8qIGRpc2FibGUgMnNzICovCisJCWJyZWFrOworCWNhc2UgMjogLyogZGlzYWJsZSBjY2sgMS8yLzUuNSwgb2ZkbSA2LzkvMTIvMTgvMjQsIG1jcyAwLzEvMi8zLzQgKi8KKwkJaWYoc3N0eXBlID09IDIpCisJCQlkaXNyYV9tYXNrID0gMHgwMDAxZjFmNzsvKiBlbmFibGUgMnNzICovCisJCWVsc2UKKwkJCWRpc3JhX21hc2sgPSAweGZmZjFmMWY3Oy8qIGRpc2FibGUgMnNzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBkaXNyYV9tYXNrOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9VcGRhdGVyYV9tYXNrKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgZm9yY2VfZXhlYywgdTMyIGRpc19yYXRlbWFzaykKK3sKKwljb2V4X2RtLT5jdXJyYV9tYXNrID0gZGlzX3JhdGVtYXNrOworCisJaWYgKGZvcmNlX2V4ZWMgfHwgKGNvZXhfZG0tPnByZXJhX21hc2sgIT0gY29leF9kbS0+Y3VycmFfbWFzaykpCisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX1VQREFURV9yYV9tYXNrLAorCQkJCSAgICZjb2V4X2RtLT5jdXJyYV9tYXNrKTsKKwljb2V4X2RtLT5wcmVyYV9tYXNrID0gY29leF9kbS0+Y3VycmFfbWFzazsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYXV0b3JhdGVfZmFsbGJhY2tfcmV0cnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgYm9vbCBmb3JjZV9leGVjLCB1OCB0eXBlKQoreworCWJvb2wgd2lmaV91bmRlcl9ibW9kZSA9IGZhbHNlOworCisJY29leF9kbS0+Y3VyX2FyZnJ0eXBlID0gdHlwZTsKKworCWlmIChmb3JjZV9leGVjIHx8IChjb2V4X2RtLT5wcmVfYXJmcnR5cGUgIT0gY29leF9kbS0+Y3VyX2FyZnJ0eXBlKSkgeworCQlzd2l0Y2ggKGNvZXhfZG0tPmN1cl9hcmZydHlwZSkgeworCQljYXNlIDA6CS8qIG5vcm1hbCBtb2RlICovCisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NDMwLAorCQkJCQkJICAgY29leF9kbS0+YmFja3VwX2FyZnJfY250MSk7CisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NDM0LAorCQkJCQkJICAgY29leF9kbS0+YmFja3VwX2FyZnJfY250Mik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJCQkJICAgQlRDX0dFVF9CTF9XSUZJX1VOREVSX0JfTU9ERSwKKwkJCQkJICAgJndpZmlfdW5kZXJfYm1vZGUpOworCQkJaWYgKHdpZmlfdW5kZXJfYm1vZGUpIHsKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NDMwLAorCQkJCQkJCSAgIDB4MCk7CisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDQzNCwKKwkJCQkJCQkgICAweDAxMDEwMTAxKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDQzMCwKKwkJCQkJCQkgICAweDApOworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0MzQsCisJCQkJCQkJICAgMHgwNDAzMDIwMSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJY29leF9kbS0+cHJlX2FyZnJ0eXBlID0gY29leF9kbS0+Y3VyX2FyZnJ0eXBlOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9yZXRyeWxpbWl0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCWJvb2wgZm9yY2VfZXhlYywgdTggdHlwZSkKK3sKKwljb2V4X2RtLT5jdXJfcmV0cnlsaW1pdF90eXBlID0gdHlwZTsKKworCWlmIChmb3JjZV9leGVjIHx8IChjb2V4X2RtLT5wcmVfcmV0cnlsaW1pdF90eXBlICE9CisJCQkgICBjb2V4X2RtLT5jdXJfcmV0cnlsaW1pdF90eXBlKSkgeworCQlzd2l0Y2ggKGNvZXhfZG0tPmN1cl9yZXRyeWxpbWl0X3R5cGUpIHsKKwkJCWNhc2UgMDoJLyogbm9ybWFsIG1vZGUgKi8KKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4NDJhLAorCQkJCQkJICAgIGNvZXhfZG0tPmJhY2t1cF9yZXRyeWxpbWl0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJLyogcmV0cnkgbGltaXQ9OCAqLworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzJieXRlKGJ0Y29leGlzdCwgMHg0MmEsCisJCQkJCQkJICAgMHgwODA4KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwljb2V4X2RtLT5wcmVfcmV0cnlsaW1pdF90eXBlID0gY29leF9kbS0+Y3VyX3JldHJ5bGltaXRfdHlwZTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYW1wZHVfbWF4dGltZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICBib29sIGZvcmNlX2V4ZWMsIHU4IHR5cGUpCit7CisJY29leF9kbS0+Y3VyX2FtcGR1dGltZV90eXBlID0gdHlwZTsKKworCWlmIChmb3JjZV9leGVjIHx8IChjb2V4X2RtLT5wcmVfYW1wZHV0aW1lX3R5cGUgIT0KKwkJCSAgIGNvZXhfZG0tPmN1cl9hbXBkdXRpbWVfdHlwZSkpIHsKKwkJc3dpdGNoIChjb2V4X2RtLT5jdXJfYW1wZHV0aW1lX3R5cGUpIHsKKwkJY2FzZSAwOgkvKiBub3JtYWwgbW9kZSAqLworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDQ1NiwKKwkJCQkJCWNvZXhfZG0tPmJhY2t1cF9hbXBkdV9tYXh0aW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIEFNUERVIHRpbXcgPSAweDM4ICogMzJ1cyAqLworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDQ1NiwgMHgzOCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJY29leF9kbS0+cHJlX2FtcGR1dGltZV90eXBlID0gY29leF9kbS0+Y3VyX2FtcGR1dGltZV90eXBlOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3R4KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCWJvb2wgZm9yY2VfZXhlYywgdTggcmFfbWFza3R5cGUsIHU4IGFyZnJfdHlwZSwKKwkJCQl1OCByZXRyeWxpbWl0X3R5cGUsIHU4IGFtcGR1dGltZV90eXBlKQoreworCXUzMiBkaXNyYV9tYXNrID0gMHgwOworCisJY29leF9kbS0+Y3VycmFfbWFza3R5cGUgPSByYV9tYXNrdHlwZTsKKwlkaXNyYV9tYXNrID0gaGFsYnRjODE5MmUyYW50X2RlY2lkZXJhX21hc2soYnRjb2V4aXN0LAorCQkJCQkJICAgY29leF9kbS0+Y3VyX3NzdHlwZSwKKwkJCQkJCSAgIHJhX21hc2t0eXBlKTsKKwloYWxidGM4MTkyZTJhbnRfVXBkYXRlcmFfbWFzayhidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIGRpc3JhX21hc2spOworCisJaGFsYnRjODE5MmUyYW50X2F1dG9yYXRlX2ZhbGxiYWNrX3JldHJ5KGJ0Y29leGlzdCwgZm9yY2VfZXhlYywKKwkJCQkJCWFyZnJfdHlwZSk7CisJaGFsYnRjODE5MmUyYW50X3JldHJ5bGltaXQoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCByZXRyeWxpbWl0X3R5cGUpOworCWhhbGJ0YzgxOTJlMmFudF9hbXBkdV9tYXh0aW1lKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgYW1wZHV0aW1lX3R5cGUpOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3J4KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCWJvb2wgZm9yY2VfZXhlYywgYm9vbCByZWpfYXBfYWdnX3BrdCwKKwkJCQlib29sIGJfYnRfY3RybF9hZ2dfYnVmX3NpemUsCisJCQkJdTggYWdnX2J1Zl9zaXplKQoreworCWJvb2wgcmVqZWN0X3J4X2FnZyA9IHJlal9hcF9hZ2dfcGt0OworCWJvb2wgYnRfY3RybF9yeF9hZ2dfc2l6ZSA9IGJfYnRfY3RybF9hZ2dfYnVmX3NpemU7CisJdTggcnhfYWdnX3NpemUgPSBhZ2dfYnVmX3NpemU7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJUnggQWdncmVnYXRpb24gcmVsYXRlZCBzZXR0aW5nCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX1RPX1JFSl9BUF9BR0dfUEtULAorCQkJICAgJnJlamVjdF9yeF9hZ2cpOworCS8qIGRlY2lkZSBCVCBjb250cm9sIGFnZ3JlZ2F0aW9uIGJ1ZiBzaXplIG9yIG5vdCAqLworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfQ1RSTF9BR0dfU0laRSwKKwkJCSAgICZidF9jdHJsX3J4X2FnZ19zaXplKTsKKwkvKiBhZ2dyZWdhdGlvbiBidWYgc2l6ZSwgb25seSB3b3JrCisJICogd2hlbiBCVCBjb250cm9sIFJ4IGFnZ3JlZ2F0aW9uIHNpemUuICovCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9VMV9BR0dfQlVGX1NJWkUsICZyeF9hZ2dfc2l6ZSk7CisJLyogcmVhbCB1cGRhdGUgYWdncmVnYXRpb24gc2V0dGluZyAqLworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0FHR1JFR0FURV9DVFJMLCBOVUxMKTsKKworCit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X21vbml0b3JfYnRfY3RyKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXUzMiByZWdfaHBfdHhyeCwgcmVnX2xwX3R4cngsIHUzMnRtcDsKKwl1MzIgcmVnX2hwX3R4ID0gMCwgcmVnX2hwX3J4ID0gMCwgcmVnX2xwX3R4ID0gMCwgcmVnX2xwX3J4ID0gMDsKKworCXJlZ19ocF90eHJ4ID0gMHg3NzA7CisJcmVnX2xwX3R4cnggPSAweDc3NDsKKworCXUzMnRtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfaHBfdHhyeCk7CisJcmVnX2hwX3R4ID0gdTMydG1wICYgTUFTS0xXT1JEOworCXJlZ19ocF9yeCA9ICh1MzJ0bXAgJiBNQVNLSFdPUkQpPj4xNjsKKworCXUzMnRtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfbHBfdHhyeCk7CisJcmVnX2xwX3R4ID0gdTMydG1wICYgTUFTS0xXT1JEOworCXJlZ19scF9yeCA9ICh1MzJ0bXAgJiBNQVNLSFdPUkQpPj4xNjsKKworCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4ID0gcmVnX2hwX3R4OworCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID0gcmVnX2hwX3J4OworCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHggPSByZWdfbHBfdHg7CisJY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCA9IHJlZ19scF9yeDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkgICJbQlRDb2V4XSBIaWdoIFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsCisJCSAgcmVnX2hwX3R4cngsIHJlZ19ocF90eCwgcmVnX2hwX3R4LCByZWdfaHBfcngsIHJlZ19ocF9yeCk7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCSAgIltCVENvZXhdIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLAorCQkgIHJlZ19scF90eHJ4LCByZWdfbHBfdHgsIHJlZ19scF90eCwgcmVnX2xwX3J4LCByZWdfbHBfcngpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmUsIDB4Yyk7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3F1ZXJ5YnRfaW5mbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID17MH07CisKKwljb2V4X3N0YS0+YzJoX2J0X2luZm9fcmVxX3NlbnQgPSB0cnVlOworCisJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOwkvKiB0cmlnZ2VyICovCisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIFF1ZXJ5IEJ0IEluZm8sIEZXIHdyaXRlIDB4NjE9MHgleFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MSwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK2Jvb2wgaGFsYnRjODE5MmUyYW50X2lzd2lmaV9zdGF0dXNfY2hhbmdlZChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdGF0aWMgYm9vbCBwcmVfd2lmaV9idXN5ID0gZmFsc2U7CisJc3RhdGljIGJvb2wgcHJlX3VuZGVyXzR3YXkgPSBmYWxzZSwgcHJlX2J0X2hzb24gPSBmYWxzZTsKKwlib29sIHdpZmlfYnVzeSA9IGZhbHNlLCB1bmRlcl80d2F5ID0gZmFsc2UsIGJ0X2hzb24gPSBmYWxzZTsKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELAorCQkJICAgJndpZmlfY29ubmVjdGVkKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc29uKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1MsCisJCQkgICAmdW5kZXJfNHdheSk7CisKKwlpZiAod2lmaV9jb25uZWN0ZWQpIHsKKwkJaWYgKHdpZmlfYnVzeSAhPSBwcmVfd2lmaV9idXN5KSB7CisJCQlwcmVfd2lmaV9idXN5ID0gd2lmaV9idXN5OworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKHVuZGVyXzR3YXkgIT0gcHJlX3VuZGVyXzR3YXkpIHsKKwkJCXByZV91bmRlcl80d2F5ID0gdW5kZXJfNHdheTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChidF9oc29uICE9IHByZV9idF9oc29uKSB7CisJCQlwcmVfYnRfaHNvbiA9IGJ0X2hzb247CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfdXBkYXRlX2J0bGlua19pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBidGNfYnRfbGlua19pbmZvICpidF9saW5rX2luZm8gPSAmYnRjb2V4aXN0LT5idF9saW5rX2luZm87CisJYm9vbCBidF9oc29uID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzb24pOworCisJYnRfbGlua19pbmZvLT5idF9saW5rX2V4aXN0ID0gY29leF9zdGEtPmJ0X2xpbmtfZXhpc3Q7CisJYnRfbGlua19pbmZvLT5zY29fZXhpc3QgPSBjb2V4X3N0YS0+c2NvX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCA9IGNvZXhfc3RhLT5hMmRwX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ID0gY29leF9zdGEtPnBhbl9leGlzdDsKKwlidF9saW5rX2luZm8tPmhpZF9leGlzdCA9IGNvZXhfc3RhLT5oaWRfZXhpc3Q7CisKKwkvKiB3b3JrIGFyb3VuZCBmb3IgSFMgbW9kZS4gKi8KKwlpZiAoYnRfaHNvbikgeworCQlidF9saW5rX2luZm8tPnBhbl9leGlzdCA9IHRydWU7CisJCWJ0X2xpbmtfaW5mby0+YnRfbGlua19leGlzdCA9IHRydWU7CisJfQorCisJLyogY2hlY2sgaWYgU2NvIG9ubHkgKi8KKwlpZiAoYnRfbGlua19pbmZvLT5zY29fZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCAmJgorCSAgICAhYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQlidF9saW5rX2luZm8tPnNjb19vbmx5ID0gdHJ1ZTsKKwllbHNlCisJCWJ0X2xpbmtfaW5mby0+c2NvX29ubHkgPSBmYWxzZTsKKworCS8qIGNoZWNrIGlmIEEyZHAgb25seSAqLworCWlmICghYnRfbGlua19pbmZvLT5zY29fZXhpc3QgJiYKKwkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmCisJICAgICFidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCSAgICAhYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpCisJCWJ0X2xpbmtfaW5mby0+YTJkcF9vbmx5ID0gdHJ1ZTsKKwllbHNlCisJCWJ0X2xpbmtfaW5mby0+YTJkcF9vbmx5ID0gZmFsc2U7CisKKwkvKiBjaGVjayBpZiBQYW4gb25seSAqLworCWlmICghYnRfbGlua19pbmZvLT5zY29fZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCAmJgorCSAgICBidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCSAgICAhYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpCisJCWJ0X2xpbmtfaW5mby0+cGFuX29ubHkgPSB0cnVlOworCWVsc2UKKwkJYnRfbGlua19pbmZvLT5wYW5fb25seSA9IGZhbHNlOworCisJLyogY2hlY2sgaWYgSGlkIG9ubHkgKi8KKwlpZiAoIWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ICYmCisJICAgICFidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmCisJICAgIGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQlidF9saW5rX2luZm8tPmhpZF9vbmx5ID0gdHJ1ZTsKKwllbHNlCisJCWJ0X2xpbmtfaW5mby0+aGlkX29ubHkgPSBmYWxzZTsKK30KKwordTggaGFsYnRjODE5MmUyYW50X2FjdGlvbl9hbGdvcml0aG0oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IGJ0Y19idF9saW5rX2luZm8gKmJ0X2xpbmtfaW5mbyA9ICZidGNvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlzdHJ1Y3QgYnRjX3N0YWNrX2luZm8gKnN0YWNrX2luZm8gPSAmYnRjb2V4aXN0LT5zdGFja19pbmZvOworCWJvb2wgYnRfaHNvbj1mYWxzZTsKKwl1OCBhbGdvcml0aG0gPSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19VTkRFRklORUQ7CisJdTggbnVtT2ZEaWZmUHJvZmlsZSA9IDA7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzb24pOworCisJaWYgKCFidF9saW5rX2luZm8tPmJ0X2xpbmtfZXhpc3QpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiTm8gQlQgbGluayBleGlzdHMhISFcbiIpOworCQlyZXR1cm4gYWxnb3JpdGhtOworCX0KKworCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpCisJCW51bU9mRGlmZlByb2ZpbGUrKzsKKworCWlmIChudW1PZkRpZmZQcm9maWxlID09IDEpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiU0NPIG9ubHlcbiIpOworCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOworCQl9IGVsc2UgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJISUQgb25seVxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEOworCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIkEyRFAgb25seVxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fQTJEUDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNvbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJQQU4oSFMpIG9ubHlcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFOSFM7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiUEFOKEVEUikgb25seVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCQlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChudW1PZkRpZmZQcm9maWxlID09IDIpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIlNDTyArIEhJRFxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOworCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIlNDTyArIEEyRFAgPT0+IFNDT1xuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNvbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJTQ08gKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIlNDTyArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJCUJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1NDT19QQU47CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJaWYgKHN0YWNrX2luZm8tPm51bV9vZl9oaWQgPj0gMikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJISUQqMiArIEEyRFBcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiSElEICsgQTJEUFxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkJICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNvbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJISUQgKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIkhJRCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCQkJCSAgIGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCWlmIChidF9oc29uKSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIkEyRFAgKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX0EyRFBfUEFOSFM7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiQTJEUCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobnVtT2ZEaWZmUHJvZmlsZSA9PSAzKSB7CisJCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpOworCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkJICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNvbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJTQ08gKyBISUQgKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIlNDTyArIEhJRCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJCUJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1NDT19QQU47CisJCQkJfQorCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCQkJCSAgIGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCWlmIChidF9oc29uKSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIlNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIlNDTyArIEEyRFAgKyBQQU4oRURSKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCAmJgorCQkJICAgIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJaWYgKGJ0X2hzb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiSElEICsgQTJEUCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiSElEICsgQTJEUCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobnVtT2ZEaWZmUHJvZmlsZSA+PSAzKSB7CisJCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNvbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJFcnJvclNDTytISUQrQTJEUCtQQU4oSFMpXG4iKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIlNDTytISUQrQTJEUCtQQU4oRURSKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBhbGdvcml0aG07Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3NldGZ3X2RhY19zd2luZ2xldmVsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgIHU4IGRhY19zd2luZ2x2bCkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID17MH07CisKKwkvKiBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlIG9mIGRhY3N3aW5nCisJICogMHgxOC8gMHgxMC8gMHhjLyAweDgvIDB4NC8gMHg2ICovCisJaDJjX3BhcmFtZXRlclswXSA9IGRhY19zd2luZ2x2bDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNfc3dpbmdsdmwpOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2ND0weCV4XG4iLCBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2NCwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3NldF9md2RlY19idHB3cihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgIHU4IGRlY19idHB3cl9sdmwpCit7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCisJaDJjX3BhcmFtZXRlclswXSA9IGRlY19idHB3cl9sdmw7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0gZGVjcmVhc2UgQnQgUG93ZXIgbGV2ZWwgPSAlZCwgRlcgd3JpdGUgMHg2Mj0weCV4XG4iLAorCQkgIGRlY19idHB3cl9sdmwsIGgyY19wYXJhbWV0ZXJbMF0pOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYyLCAxLCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJICAgICAgIGJvb2wgZm9yY2VfZXhlYywgdTggZGVjX2J0cHdyX2x2bCkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgbGV2ZWwgPSAlZFxuIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIGRlY19idHB3cl9sdmwpOworCWNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyID0gZGVjX2J0cHdyX2x2bDsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIHByZUJ0RGVjUHdyTHZsPSVkLCBjdXJCdERlY1B3ckx2bD0lZFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX2RlY19idF9wd3IsIGNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyKTsKKwl9CisJaGFsYnRjODE5MmUyYW50X3NldF9md2RlY19idHB3cihidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyKTsKKworCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyID0gY29leF9kbS0+Y3VyX2RlY19idF9wd3I7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3NldF9idF9hdXRvcmVwb3J0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICAgICBib29sIGVuYWJsZV9hdXRvcmVwb3J0KQoreworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCisJaWYgKGVuYWJsZV9hdXRvcmVwb3J0KQorCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEJUIEZXIGF1dG8gcmVwb3J0IDogJXMsIEZXIHdyaXRlIDB4Njg9MHgleFxuIiwKKwkJICAoZW5hYmxlX2F1dG9yZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksCisJCSAgaDJjX3BhcmFtZXRlclswXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjgsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9idF9hdXRvcmVwb3J0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBlbmFibGVfYXV0b3JlcG9ydCkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyBCVCBBdXRvIHJlcG9ydCA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwKKwkJICAoKGVuYWJsZV9hdXRvcmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKTsKKwljb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQgPSBlbmFibGVfYXV0b3JlcG9ydDsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0gYlByZUJ0QXV0b1JlcG9ydD0lZCwgYkN1ckJ0QXV0b1JlcG9ydD0lZFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX2J0X2F1dG9fcmVwb3J0LAorCQkJICBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQpOworCisJCWlmIChjb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQgPT0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0KQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4MTkyZTJhbnRfc2V0X2J0X2F1dG9yZXBvcnQoYnRjb2V4aXN0LAorCQkJCQkgIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCk7CisKKwljb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQgPSBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQ7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgIGJvb2wgZm9yY2VfZXhlYywgdTggZndfZGFjX3N3aW5nbHZsKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywKKwkJICAiW0JUQ29leF0sICVzIHNldCBGVyBEYWMgU3dpbmcgbGV2ZWwgPSAlZFxuIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIGZ3X2RhY19zd2luZ2x2bCk7CisJY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwgPSBmd19kYWNfc3dpbmdsdmw7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdIHByZUZ3RGFjU3dpbmdMdmw9JWQsIGN1ckZ3RGFjU3dpbmdMdmw9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9md19kYWNfc3dpbmdfbHZsLAorCQkJICBjb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bCk7CisKKwkJaWYgKGNvZXhfZG0tPnByZV9md19kYWNfc3dpbmdfbHZsID09CisJCSAgICBjb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bCkKKwkJCXJldHVybjsKKwl9CisKKwloYWxidGM4MTkyZTJhbnRfc2V0ZndfZGFjX3N3aW5nbGV2ZWwoYnRjb2V4aXN0LAorCQkJCQkgICAgIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKTsKKworCWNvZXhfZG0tPnByZV9md19kYWNfc3dpbmdfbHZsID0gY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmw7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3NldF9zd19yZl9yeF9scGZfY29ybmVyKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgIGJvb2wgcnhfcmZfc2hyaW5rX29uKQoreworCWlmIChyeF9yZl9zaHJpbmtfb24pIHsKKwkJLyogU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIgKi8KKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCQkgICJbQlRDb2V4XSwgU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIhIVxuIik7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwKKwkJCQkJICAweGZmZmZmLCAweGZmZmZjKTsKKwl9IGVsc2UgeworCQkvKiBSZXN1bWUgUkYgUnggTFBGIGNvcm5lcgorCQkgKiBBZnRlciBpbml0aWFsaXplZCwgd2UgY2FuIHVzZSBjb2V4X2RtLT5idFJmMHgxZUJhY2t1cCAqLworCQlpZiAoYnRjb2V4aXN0LT5pbml0aWxpemVkKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCQkgICJbQlRDb2V4XSwgUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIhIVxuIik7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsCisJCQkJCQkgIDB4ZmZmZmYsCisJCQkJCQkgIGNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXApOworCQl9CisJfQorfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9yZl9zaHJpbmsoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkgICAgICAgYm9vbCBmb3JjZV9leGVjLCBib29sIHJ4X3JmX3Nocmlua19vbikKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csCisJCSAgIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChyeF9yZl9zaHJpbmtfb24pPyAiT04iOiJPRkYiKSk7CisJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmsgPSByeF9yZl9zaHJpbmtfb247CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdYlByZVJmUnhMcGZTaHJpbms9JWQsYkN1clJmUnhMcGZTaHJpbms9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9yZl9yeF9scGZfc2hyaW5rLAorCQkJICBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3Nocmluayk7CisKKwkJaWYgKGNvZXhfZG0tPnByZV9yZl9yeF9scGZfc2hyaW5rID09CisJCSAgICBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluaykKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUyYW50X3NldF9zd19yZl9yeF9scGZfY29ybmVyKGJ0Y29leGlzdCwKKwkJCQkJCWNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKTsKKworCWNvZXhfZG0tPnByZV9yZl9yeF9scGZfc2hyaW5rID0gY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbms7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3NldF9zd19wZW5hbHR5X3R4X3JhdGVhZGFwdGl2ZSgKKwkJCQkJCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkJYm9vbCBsb3dfcGVuYWx0eV9yYSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzZdID17MH07CisKKwloMmNfcGFyYW1ldGVyWzBdID0gMHg2OwkvKiBvcENvZGUsIDB4Nj0gUmV0cnlfUGVuYWx0eSAqLworCisJaWYgKGxvd19wZW5hbHR5X3JhKSB7CisJCWgyY19wYXJhbWV0ZXJbMV0gfD0gQklUMDsKKwkJLyogbm9ybWFsIHJhdGUgZXhjZXB0IE1DUzcvNi81LCBPRkRNNTQvNDgvMzYgKi8KKwkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MDA7CisJCWgyY19wYXJhbWV0ZXJbM10gPSAweGY3OyAgLyogTUNTNyBvciBPRkRNNTQgKi8KKwkJaDJjX3BhcmFtZXRlcls0XSA9IDB4Zjg7ICAvKiBNQ1M2IG9yIE9GRE00OCAqLworCQloMmNfcGFyYW1ldGVyWzVdID0gMHhmOTsgIC8qIE1DUzUgb3IgT0ZETTM2ICovCisJfQorCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsCisJCSAgIltCVENvZXhdLCBzZXQgV2lGaSBMb3ctUGVuYWx0eSBSZXRyeTogJXMiLAorCQkgIChsb3dfcGVuYWx0eV9yYT8gIk9OISEiOiJPRkYhISIpKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2OSwgNiwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2xvd19wZW5hbHR5X3JhKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICBib29sIGZvcmNlX2V4ZWMsIGJvb2wgbG93X3BlbmFsdHlfcmEpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBMb3dQZW5hbHR5UkEgPSAlc1xuIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgobG93X3BlbmFsdHlfcmEpPyAiT04iOiJPRkYiKSk7CisJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhID0gbG93X3BlbmFsdHlfcmE7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdIGJQcmVMb3dQZW5hbHR5UmE9JWQsIGJDdXJMb3dQZW5hbHR5UmE9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9sb3dfcGVuYWx0eV9yYSwKKwkJCSAgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKTsKKworCQlpZiAoY29leF9kbS0+cHJlX2xvd19wZW5hbHR5X3JhID09CisJCSAgICBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmEpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0YzgxOTJlMmFudF9zZXRfc3dfcGVuYWx0eV90eF9yYXRlYWRhcHRpdmUoYnRjb2V4aXN0LAorCQkJCQkJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKTsKKworCWNvZXhfZG0tPnByZV9sb3dfcGVuYWx0eV9yYSA9IGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfc2V0X2RhY19zd2luZ3JlZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgICB1MzIgbGV2ZWwpCit7CisJdTggdmFsID0gKHU4KWxldmVsOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCSAgIltCVENvZXhdLCBXcml0ZSBTd0RhY1N3aW5nID0gMHgleFxuIiwgbGV2ZWwpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDg4MywgMHgzZSwgdmFsKTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfc2V0c3dfZnVsbHRpbWVfZGFjc3dpbmcoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgYm9vbCBzd19kYWNfc3dpbmdvbiwKKwkJCQkJICAgICB1MzIgc3dfZGFjX3N3aW5nbHZsKQoreworCWlmIChzd19kYWNfc3dpbmdvbikKKwkJaGFsYnRjODE5MmUyYW50X3NldF9kYWNfc3dpbmdyZWcoYnRjb2V4aXN0LCBzd19kYWNfc3dpbmdsdmwpOworCWVsc2UKKwkJaGFsYnRjODE5MmUyYW50X3NldF9kYWNfc3dpbmdyZWcoYnRjb2V4aXN0LCAweDE4KTsKK30KKworCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9EYWNTd2luZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCSAgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBkYWNfc3dpbmdvbiwKKwkJCSAgICAgIHUzMiBkYWNfc3dpbmdsdmwpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nbHZsPTB4JXhcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLAorCQkgICgoZGFjX3N3aW5nb24pPyAiT04iOiJPRkYiKSwgZGFjX3N3aW5nbHZsKTsKKwljb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uID0gZGFjX3N3aW5nb247CisJY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwgPSBkYWNfc3dpbmdsdmw7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwgIiwKKwkJCSAgY29leF9kbS0+cHJlX2RhY19zd2luZ19vbiwKKwkJCSAgY29leF9kbS0+cHJlX2RhY19zd2luZ19sdmwpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsCisJCQkgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sCisJCQkgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsKTsKKworCQlpZiAoKGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24gPT0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbikgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9PSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCkpCisJCQlyZXR1cm47CisJfQorCW1kZWxheSgzMCk7CisJaGFsYnRjODE5MmUyYW50X3NldHN3X2Z1bGx0aW1lX2RhY3N3aW5nKGJ0Y29leGlzdCwgZGFjX3N3aW5nb24sCisJCQkJCQlkYWNfc3dpbmdsdmwpOworCisJY29leF9kbS0+cHJlX2RhY19zd2luZ19vbiA9IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb247CisJY29leF9kbS0+cHJlX2RhY19zd2luZ19sdmwgPSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bDsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfc2V0X2FkY19iYWNrb2ZmKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICAgYm9vbCBhZGNfYmFja29mZikKK3sKKwlpZihhZGNfYmFja29mZikKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT24hXG4iKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4YzA1LCAweDMwLCAweDMpOworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCSAgIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9mZiFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHhjMDUsIDB4MzAsIDB4MSk7CisJfQorfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9hZGNfYmFja29mZihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgYm9vbCBmb3JjZV9leGVjLCBib29sIGFkY19iYWNrb2ZmKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzIHR1cm4gQWRjQmFja09mZiA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChhZGNfYmFja29mZik/ICJPTiI6Ik9GRiIpKTsKKwljb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmID0gYWRjX2JhY2tvZmY7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpOworCisJCWlmIChjb2V4X2RtLT5wcmVfYWRjX2JhY2tfb2ZmID09IGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0YzgxOTJlMmFudF9zZXRfYWRjX2JhY2tvZmYoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKTsKKworCWNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYgPSBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9zZXRfYWdjX3RhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgYWdjX3RhYmxlX2VuKQoreworCisJLyogQkIgQUdDIEdhaW4gVGFibGUgKi8KKwlpZiAoYWdjX3RhYmxlX2VuKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEFnYyBUYWJsZSBPbiFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweDBhMUEwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHgwOTFCMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4MDgxQzAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweDA3MUQwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHgwNjFFMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4MDUxRjAwMDEpOworCX0gZWxzZSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEFnYyBUYWJsZSBPZmYhXG4iKTsKKwkgCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4YWExQTAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweGE5MUIwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHhhODFDMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4YTcxRDAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweGE2MUUwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHhhNTFGMDAwMSk7CisJfQorfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9BZ2NUYWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCSAgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBhZ2NfdGFibGVfZW4pCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgJXMgQWdjIFRhYmxlXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwKKwkJICAoKGFnY190YWJsZV9lbik/ICJFbmFibGUiOiJEaXNhYmxlIikpOworCWNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4gPSBhZ2NfdGFibGVfZW47CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlQWdjVGFibGVFbj0lZCwgYkN1ckFnY1RhYmxlRW49JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4pOworCisJCWlmIChjb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuID09IGNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4pCisJCQlyZXR1cm47CisJfQorCWhhbGJ0YzgxOTJlMmFudF9zZXRfYWdjX3RhYmxlKGJ0Y29leGlzdCwgYWdjX3RhYmxlX2VuKTsKKworCWNvZXhfZG0tPnByZV9hZ2NfdGFibGVfZW4gPSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9zZXRfY29leF90YWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgdTMyIHZhbDB4NmMwLCB1MzIgdmFsMHg2YzQsCisJCQkJICAgIHUzMiB2YWwweDZjOCwgdTggdmFsMHg2Y2MpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCSAgIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCB2YWwweDZjMCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJICAiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzQ9MHgleFxuIiwgdmFsMHg2YzQpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQsIHZhbDB4NmM0KTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjOD0weCV4XG4iLCB2YWwweDZjOCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCSAgIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGUoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIGJvb2wgZm9yY2VfZXhlYywKKwkJCQl1MzIgdmFsMHg2YzAsIHUzMiB2YWwweDZjNCwKKwkJCQl1MzIgdmFsMHg2YzgsIHU4IHZhbDB4NmNjKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIHZhbDB4NmMwKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csCisJCSAgIjB4NmM0PTB4JXgsIDB4NmM4PTB4JXgsIDB4NmNjPTB4JXhcbiIsCisJCSAgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM0ID0gdmFsMHg2YzQ7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM4ID0gdmFsMHg2Yzg7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjND0weCV4LCAiLAorCQkJICBjb2V4X2RtLT5wcmVfdmFsMHg2YzAsIGNvZXhfZG0tPnByZV92YWwweDZjNCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsCisJCQkgICJwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfdmFsMHg2YzgsIGNvZXhfZG0tPnByZV92YWwweDZjYyk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgY3VyVmFsMHg2YzA9MHgleCwgY3VyVmFsMHg2YzQ9MHgleCwgXG4iLAorCQkJICBjb2V4X2RtLT5jdXJfdmFsMHg2YzAsIGNvZXhfZG0tPmN1cl92YWwweDZjNCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsCisJCQkgICJjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLAorCQkJICBjb2V4X2RtLT5jdXJfdmFsMHg2YzgsIGNvZXhfZG0tPmN1cl92YWwweDZjYyk7CisKKwkJaWYgKChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgorCQkgICAgKGNvZXhfZG0tPnByZV92YWwweDZjNCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzQpICYmCisJCSAgICAoY29leF9kbS0+cHJlX3ZhbDB4NmM4ID09IGNvZXhfZG0tPmN1cl92YWwweDZjOCkgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUyYW50X3NldF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgdmFsMHg2YzAsIHZhbDB4NmM0LAorCQkJCSAgICAgICB2YWwweDZjOCwgdmFsMHg2Y2MpOworCisJY29leF9kbS0+cHJlX3ZhbDB4NmMwID0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwOworCWNvZXhfZG0tPnByZV92YWwweDZjNCA9IGNvZXhfZG0tPmN1cl92YWwweDZjNDsKKwljb2V4X2RtLT5wcmVfdmFsMHg2YzggPSBjb2V4X2RtLT5jdXJfdmFsMHg2Yzg7CisJY29leF9kbS0+cHJlX3ZhbDB4NmNjID0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICBib29sIGZvcmNlX2V4ZWMsIHU4IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgorCQloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4NWE1YTVhNWEsIDB4ZmZmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDE6CisJCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHg1YTVhNWE1YSwKKwkJCQkJICAgMHg1YTVhNWE1YSwgMHhmZmZmZmYsIDB4Myk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGUoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCAweDU1NTU1NTU1LAorCQkJCQkgICAweDVmZmI1ZmZiLCAweGZmZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4ZGZmZmRmZmYsCisJCQkJCSAgIDB4NWZkYjVmZGIsIDB4ZmZmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHhkZmZmZGZmZiwKKwkJCQkJICAgMHg1ZmZiNWZmYiwgMHhmZmZmZmYsIDB4Myk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfc2V0X2Z3X2lnbm9yZV93bGFuYWN0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICBib29sIGVuYWJsZSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID17MH07CisKKwlpZiAoZW5hYmxlKQorCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVDA7IC8qIGZ1bmN0aW9uIGVuYWJsZSAqLworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsCisJCSAgIltCVENvZXhdc2V0IEZXIGZvciBCVCBJZ25vcmUgV2xhbl9BY3QsIEZXIHdyaXRlIDB4NjM9MHgleFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MywgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X0lnbm9yZVdsYW5BY3Qoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgYm9vbCBmb3JjZV9leGVjLCBib29sIGVuYWJsZSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKGVuYWJsZT8gIk9OIjoiT0ZGIikpOworCWNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QgPSBlbmFibGU7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlSWdub3JlV2xhbkFjdCA9ICVkICIsCisJCQkgIGNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLAorCQkJICBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKKworCQlpZiAoY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCA9PQorCQkgICAgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUyYW50X3NldF9md19pZ25vcmVfd2xhbmFjdChidGNvZXhpc3QsIGVuYWJsZSk7CisKKwljb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0ID0gY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdDsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IGJ5dGUxLAorCQkJCSB1OCBieXRlMiwgdTggYnl0ZTMsIHU4IGJ5dGU0LCB1OCBieXRlNSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzVdID17MH07CisKKwloMmNfcGFyYW1ldGVyWzBdID0gYnl0ZTE7CisJaDJjX3BhcmFtZXRlclsxXSA9IGJ5dGUyOworCWgyY19wYXJhbWV0ZXJbMl0gPSBieXRlMzsKKwloMmNfcGFyYW1ldGVyWzNdID0gYnl0ZTQ7CisJaDJjX3BhcmFtZXRlcls0XSA9IGJ5dGU1OworCisJY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdID0gYnl0ZTE7CisJY29leF9kbS0+cHNfdGRtYV9wYXJhWzFdID0gYnl0ZTI7CisJY29leF9kbS0+cHNfdGRtYV9wYXJhWzJdID0gYnl0ZTM7CisJY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdID0gYnl0ZTQ7CisJY29leF9kbS0+cHNfdGRtYV9wYXJhWzRdID0gYnl0ZTU7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjAoNWJ5dGVzKT0weCV4JTA4eFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdLAorCQkgIGgyY19wYXJhbWV0ZXJbMV0gPDwgMjQgfCBoMmNfcGFyYW1ldGVyWzJdIDw8IDE2IHwKKwkJICBoMmNfcGFyYW1ldGVyWzNdIDw8IDggfCBoMmNfcGFyYW1ldGVyWzRdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MCwgNSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgYm9vbCBzaHJpbmtfcnhfbHBmLCBib29sIGxvd19wZW5hbHR5X3JhLAorCQkJCSAgIGJvb2wgbGltaXRlZF9kaWcsIGJvb2wgYnRsYW5fY29uc3RyYWluKQoreworCWhhbGJ0YzgxOTJlMmFudF9yZl9zaHJpbmsoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgc2hyaW5rX3J4X2xwZik7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgYm9vbCBhZ2NfdGFibGVfc2hpZnQsIGJvb2wgYWRjX2JhY2tvZmYsCisJCQkJICAgYm9vbCBzd19kYWNfc3dpbmcsIHUzMiBkYWNfc3dpbmdsdmwpCit7CisJaGFsYnRjODE5MmUyYW50X0FnY1RhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGFnY190YWJsZV9zaGlmdCk7CisJaGFsYnRjODE5MmUyYW50X0RhY1N3aW5nKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHN3X2RhY19zd2luZywKKwkJCQkgZGFjX3N3aW5nbHZsKTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfcHNfdGRtYShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCSAgICAgYm9vbCBmb3JjZV9leGVjLCBib29sIHR1cm5fb24sIHU4IHR5cGUpCit7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAodHVybl9vbj8gIk9OIjoiT0ZGIiksIHR5cGUpOworCWNvZXhfZG0tPmN1cl9wc190ZG1hX29uID0gdHVybl9vbjsKKwljb2V4X2RtLT5jdXJfcHNfdGRtYSA9IHR5cGU7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlUHNUZG1hT24gPSAlZCwgYkN1clBzVGRtYU9uID0gJWQhIVxuIiwKKwkJCSAgY29leF9kbS0+cHJlX3BzX3RkbWFfb24sIGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBwcmVQc1RkbWEgPSAlZCwgY3VyUHNUZG1hID0gJWQhIVxuIiwKKwkJCSAgY29leF9kbS0+cHJlX3BzX3RkbWEsIGNvZXhfZG0tPmN1cl9wc190ZG1hKTsKKworCQlpZiAoKGNvZXhfZG0tPnByZV9wc190ZG1hX29uID09IGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKSAmJgorCQkgICAgKGNvZXhfZG0tPnByZV9wc190ZG1hID09IGNvZXhfZG0tPmN1cl9wc190ZG1hKSkKKwkJCXJldHVybjsKKwl9CisJaWYgKHR1cm5fb24pIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgMToKKwkJZGVmYXVsdDoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MWEsCisJCQkJCQkgICAgMHgxYSwgMHhlMSwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxMiwKKwkJCQkJCSAgICAweDEyLCAweGUxLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFjLAorCQkJCQkJICAgIDB4MywgMHhmMSwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxMCwKKwkJCQkJCSAgICAweDMsIDB4ZjEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MWEsCisJCQkJCQkgICAgMHgxYSwgMHg2MCwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxMiwKKwkJCQkJCSAgICAgMHgxMiwgMHg2MCwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYywKKwkJCQkJCSAgICAweDMsIDB4NzAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4YTMsIDB4MTAsCisJCQkJCQkgICAgMHgzLCAweDcwLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFhLAorCQkJCQkJICAgIDB4MWEsIDB4ZTEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDEyLAorCQkJCQkJICAgIDB4MTIsIDB4ZTEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMTE6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFjLAorCQkJCQkJICAgIDB4MywgMHhmMSwgMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTAsCisJCQkJCQkgICAgMHgzLCAweGYxLCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIDEzOgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYSwKKwkJCQkJCSAgICAweDFhLCAweGUwLCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIDE0OgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxMiwKKwkJCQkJCSAgICAweDEyLCAweGUwLCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJaGFsYnRjODE5MmUyYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYywKKwkJCQkJCSAgICAweDMsIDB4ZjAsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDEyLAorCQkJCQkJICAgIDB4MywgMHhmMCwgMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSAxNzoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4NjEsIDB4MjAsCisJCQkJCQkgICAgMHgwMywgMHgxMCwgMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSAxODoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4NSwKKwkJCQkJCSAgICAweDUsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMTk6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LAorCQkJCQkJICAgIDB4MjUsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMjA6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LAorCQkJCQkJICAgIDB4MjUsIDB4NjAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMjE6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDE1LAorCQkJCQkJICAgIDB4MDMsIDB4NzAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgNzE6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFhLAorCQkJCQkJICAgIDB4MWEsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIFBTIHRkbWEgKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMDoKKwkJCWhhbGJ0YzgxOTJlMmFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OCwgMHgwLCAweDAsCisJCQkJCQkgICAgMHgwLCAweDApOworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHg0KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQloYWxidGM4MTkyZTJhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwgMHgwLAorCQkJCQkJICAgIDB4OCwgMHgwKTsKKwkJCW1kZWxheSg1KTsKKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4MjApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgcHJlIHN0YXRlICovCisJY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPSBjb2V4X2RtLT5jdXJfcHNfdGRtYV9vbjsKKwljb2V4X2RtLT5wcmVfcHNfdGRtYSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9zZXRfc3dpdGNoX3NzdHlwZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggc3N0eXBlKQoreworCXU4IG1pbW9wcyA9IEJUQ19NSU1PX1BTX0RZTkFNSUM7CisJdTMyIGRpc3JhX21hc2sgPSAweDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCSAgIltCVENvZXhdLCBSRUFMIHNldCBTUyBUeXBlID0gJWRcbiIsIHNzdHlwZSk7CisKKwlkaXNyYV9tYXNrID0gaGFsYnRjODE5MmUyYW50X2RlY2lkZXJhX21hc2soYnRjb2V4aXN0LCBzc3R5cGUsCisJCQkJCQkgICBjb2V4X2RtLT5jdXJyYV9tYXNrdHlwZSk7CisJaGFsYnRjODE5MmUyYW50X1VwZGF0ZXJhX21hc2soYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBkaXNyYV9tYXNrKTsKKworCWlmIChzc3R5cGUgPT0gMSkgeworCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIGZhbHNlLCAxKTsKKwkJLyogc3dpdGNoIG9mZG0gcGF0aCAqLworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4YzA0LCAweDExKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweGQwNCwgMHgxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDkwYywgMHg4MTExMTExMSk7CisJCS8qIHN3aXRjaCBjY2sgcGF0Y2ggKi8KKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4ZTc3LCAweDQsIDB4MSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHhhMDcsIDB4ODEpOworCQltaW1vcHM9QlRDX01JTU9fUFNfU1RBVElDOworCX0gZWxzZSBpZiAoc3N0eXBlID09IDIpIHsKKwkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSwgMCk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHhjMDQsIDB4MzMpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4ZDA0LCAweDMpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4OTBjLCAweDgxMTIxMzEzKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4ZTc3LCAweDQsIDB4MCk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHhhMDcsIDB4NDEpOworCQltaW1vcHM9QlRDX01JTU9fUFNfRFlOQU1JQzsKKwl9CisJLyogc2V0IHJ4IDFzcyBvciAyc3MgKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9TRU5EX01JTU9fUFMsICZtaW1vcHMpOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9zd2l0Y2hfc3N0eXBlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgZm9yY2VfZXhlYywgdTggbmV3X3NzdHlwZSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCSAgIltCVENvZXhdLCAlcyBTd2l0Y2ggU1MgVHlwZSA9ICVkXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgbmV3X3NzdHlwZSk7CisJY29leF9kbS0+Y3VyX3NzdHlwZSA9IG5ld19zc3R5cGU7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJaWYgKGNvZXhfZG0tPnByZV9zc3R5cGUgPT0gY29leF9kbS0+Y3VyX3NzdHlwZSkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODE5MmUyYW50X3NldF9zd2l0Y2hfc3N0eXBlKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX3NzdHlwZSk7CisKKwljb2V4X2RtLT5wcmVfc3N0eXBlID0gY29leF9kbS0+Y3VyX3NzdHlwZTsKK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfY29leF9hbGxvZmYoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJLyogZncgYWxsIG9mZiAqLworCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisKKwkvKiBzdyBhbGwgb2ZmICovCisJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAweDE4KTsKKworCS8qIGh3IGFsbCBvZmYgKi8KKwloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2luaXRfY29leF9kbShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKiBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbSAqLworCisJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSwgMSk7CisJaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDYpOworCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAwKTsKKworCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDApOworCWhhbGJ0YzgxOTJlMmFudF9zd2l0Y2hfc3N0eXBlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMik7CisKKwloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDB4MTgpOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9hY3Rpb25fYnRfaW5xdWlyeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlib29sIGxvd19wd3JfZGlzYWJsZSA9IHRydWU7CisKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwKKwkJCSAgICZsb3dfcHdyX2Rpc2FibGUpOworCisJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisKKwloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCisJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAweDE4KTsKK30KKworYm9vbCBoYWxidGM4MTkyZTJhbnRfaXNfY29tbW9uX2FjdGlvbihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCWJvb2wgY29tbW9uID0gZmFsc2UsIHdpZmlfY29ubmVjdGVkID0gZmFsc2UsIHdpZmlfYnVzeSA9IGZhbHNlOworCWJvb2wgYnRfaHNvbiA9IGZhbHNlLCBsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNvbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZ3aWZpX2J1c3kpOworCisJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0IHx8IGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQloYWxidGM4MTkyZTJhbnRfbGltaXRlZF90eChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxLCAwLCAwLCAwKTsKKwllbHNlCisJCWhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3R4KGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDAsIDAsIDAsIDApOworCisJaWYgKCF3aWZpX2Nvbm5lY3RlZCkgeworCQlsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsCisJCQkJICAgJmxvd19wd3JfZGlzYWJsZSk7CisKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIFdpZmkgbm9uLWNvbm5lY3RlZCBpZGxlISFcbiIpOworCisJCWlmICgoQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09CisJCSAgICAgY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCQkgICAgKEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09CisJCSAgICAgY29leF9kbS0+YnRfc3RhdHVzKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgICAgIDIpOworCQkJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgIE5PUk1BTF9FWEVDLCAxKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLAorCQkJCQkJMCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJICAgICAgMSk7CisJCQloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDApOworCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsCisJCQkJCQkxKTsKKwkJfQorCisJCWhhbGJ0YzgxOTJlMmFudF9md19kYWNfc3dpbmdsdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisKKyAJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgICAgZmFsc2UpOworCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisJCQkJCSAgICAgIDB4MTgpOworCisJCWNvbW1vbiA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PQorCQkgICAgY29leF9kbS0+YnRfc3RhdHVzKSB7CisJCQlsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsCisJCQkJCSAgIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCQkJCQkgICAmbG93X3B3cl9kaXNhYmxlKTsKKworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIldpZmkgY29ubmVjdGVkICsgQlQgbm9uIGNvbm5lY3RlZC1pZGxlISFcbiIpOworCisJCQloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJICAgICAgMik7CisJCQloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDEpOworCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsCisJCQkJCQkwKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9md19kYWNfc3dpbmdsdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQk2KTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCisJCQljb21tb24gPSB0cnVlOworCQl9IGVsc2UgaWYgKEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09CisJCQkgICBjb2V4X2RtLT5idF9zdGF0dXMpIHsKKwkJCWxvd19wd3JfZGlzYWJsZSA9IHRydWU7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LAorCQkJCQkgICBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwKKwkJCQkJICAgJmxvd19wd3JfZGlzYWJsZSk7CisKKwkJCWlmIChidF9oc29uKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJXaWZpIGNvbm5lY3RlZCArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpOworCisJCQloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJICAgICAgMik7CisJCQloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDEpOworCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsCisJCQkJCQkwKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9md19kYWNfc3dpbmdsdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQk2KTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisKKwkJCWNvbW1vbiA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlsb3dfcHdyX2Rpc2FibGUgPSB0cnVlOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwKKwkJCQkJICAgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsCisJCQkJCSAgICZsb3dfcHdyX2Rpc2FibGUpOworCisJCQlpZiAod2lmaV9idXN5KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJXaWZpIENvbm5lY3RlZC1CdXN5ICsgQlQgQnVzeSEhXG4iKTsKKwkJCQljb21tb24gPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJXaWZpIENvbm5lY3RlZC1JZGxlICsgQlQgQnVzeSEhXG4iKTsKKworCQkJCWhhbGJ0YzgxOTJlMmFudF9zd2l0Y2hfc3N0eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgICBOT1JNQUxfRVhFQywgMSk7CisJCQkJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgMik7CisJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQl0cnVlLCAyMSk7CisJCQkJaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLCA2KTsKKwkJCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwKKwkJCQkJCQkgIE5PUk1BTF9FWEVDLCAwKTsKKwkJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLAorCQkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwKKwkJCQkJCQkgICAgICBmYWxzZSk7CisJCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwKKwkJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsCisJCQkJCQkJICAgICAgMHgxOCk7CisJCQkJY29tbW9uID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gY29tbW9uOworfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICBib29sIHNjb19oaWQsIGJvb2wgdHhfcGF1c2UsCisJCQkJCSAgdTggbWF4X2ludGVydmFsKQoreworCXN0YXRpYyBpbnQgdXAsIGRuLCBtLCBuLCB3YWl0X2NudDsKKwkvKiAwOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLAorCSAqIC0xOiBkZWNyZWFzZSBXaUZpIGR1cmF0aW9uICovCisJaW50IHJlc3VsdDsKKwl1OCByZXRyeV9jbnQgPSAwOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0KClcbiIpOworCisJaWYgKCFjb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0KSB7CisJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSB0cnVlOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGZpcnN0IHJ1biBUZG1hRHVyYXRpb25BZGp1c3QoKSEhXG4iKTsKKwkJaWYgKHNjb19oaWQpIHsKKwkJCWlmICh0eF9wYXVzZSkgeworCQkJCWlmIChtYXhfaW50ZXJ2YWwgPT0gMSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMzsKKwkJCQl9IGVsc2UgaWYgKG1heF9pbnRlcnZhbCA9PSAyKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE0OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDMpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAobWF4X2ludGVydmFsID09IDEpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDIpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTApOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTA7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMykgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodHhfcGF1c2UpIHsKKwkJCQlpZiAobWF4X2ludGVydmFsID09IDEpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA1OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDIpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA2OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDMpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChtYXhfaW50ZXJ2YWwgPT0gMSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMikgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDI7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMykgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAzOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXVwID0gMDsKKwkJZG4gPSAwOworCQltID0gMTsKKwkJbj0gMzsKKwkJcmVzdWx0ID0gMDsKKwkJd2FpdF9jbnQgPSAwOworCX0gZWxzZSB7CisJCS8qIGFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCisJCXJldHJ5X2NudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgcmV0cnlfY250ID0gJWRcbiIsIHJldHJ5X2NudCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCB3YWl0X2NudD0lZFxuIiwKKwkJCSAgdXAsIGRuLCBtLCBuLCB3YWl0X2NudCk7CisJCXJlc3VsdCA9IDA7CisJCXdhaXRfY250Kys7CisJCS8qIG5vIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uICovCisJCWlmIChyZXRyeV9jbnQgPT0gMCkgeworCQkJdXArKzsKKwkJCWRuLS07CisKKwkJCWlmIChkbiA8PSAwKQorCQkJCWRuID0gMDsKKworCQkJaWYgKHVwID49IG4pIHsKKwkJCQl3YWl0X2NudCA9IDA7CisJCQkJbiA9IDM7CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQlyZXN1bHQgPSAxOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF1JbmNyZWFzZSB3aWZpIGR1cmF0aW9uISFcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKHJldHJ5X2NudCA8PSAzKSB7CisJCQl1cC0tOworCQkJZG4rKzsKKworCQkJaWYgKHVwIDw9IDApCisJCQkJdXAgPSAwOworCisJCQlpZiAoZG4gPT0gMikgeworCQkJCWlmICh3YWl0X2NudCA8PSAyKQorCQkJCQltKys7CisJCQkJZWxzZQorCQkJCQltID0gMTsKKworCQkJCWlmIChtID49IDIwKQorCQkJCQltID0gMjA7CisKKwkJCQluID0gMyAqIG07CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQl3YWl0X2NudCA9IDA7CisJCQkJcmVzdWx0ID0gLTE7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJSZWR1Y2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnk8M1xuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod2FpdF9jbnQgPT0gMSkKKwkJCQltKys7CisJCQllbHNlCisJCQkJbSA9IDE7CisKKwkJCWlmIChtID49IDIwKQorCQkJCW0gPSAyMDsKKworCQkJbiA9IDMqbTsKKwkJCXVwID0gMDsKKwkJCWRuID0gMDsKKwkJCXdhaXRfY250ID0gMDsKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkgICJEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKTsKKwkJfQorCisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgbWF4IEludGVydmFsID0gJWRcbiIsIG1heF9pbnRlcnZhbCk7CisJCWlmIChtYXhfaW50ZXJ2YWwgPT0gMSkgeworCQkJaWYgKHR4X3BhdXNlKSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKTsKKworCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3MSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDU7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA2OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDc7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA0KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDgpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gODsKKwkJCQl9CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTMpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNDsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTIpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTYpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTY7CisJCQkJfQorCisJCQkJaWYgKHJlc3VsdCA9PSAtMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDY7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDcpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDc7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDgpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDg7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTQ7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTU7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTUpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTY7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA2KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDEzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMzsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpOworCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA1KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcxKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDcxOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDI7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA0OworCQkJCX0KKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTApOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTA7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE2KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEyKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDEyOworCQkJCX0KKworCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDcxKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAzKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA5KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTApOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDEwOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEwKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTEpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDExOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTIpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDEyOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgeworIAkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDQpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAzOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAyKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAyOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA3MSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNzE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTIpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTA7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA5KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA5OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG1heF9pbnRlcnZhbCA9PSAyKSB7CisJCQlpZiAodHhfcGF1c2UpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkJCSAgIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIik7CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA2OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA2KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDY7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAzKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDQpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA4OworCQkJCX0KKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gOSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNDsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEwKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE0OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTU7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNjsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA9PSAtMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDY7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDcpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDc7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDgpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDg7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTQ7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTU7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTUpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTY7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA2KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpOworCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA1KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNDsKKwkJCQl9CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEzKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDEwOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTApOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTA7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE2KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEyKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDEyOworCQkJCX0KKwkJCQlpZiAocmVzdWx0ID09IC0xKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAzKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA5KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTApOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDEwOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEwKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTEpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDExOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTIpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDEyOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNCkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDMpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDM7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDIpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDI7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDIpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDI7CisJCQkJCX0gZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTApOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDEwOworCQkJCQl9IGVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDMpIHsKKwkJCWlmICh0eF9wYXVzZSkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKTsKKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDc7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNCkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA4KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDg7CisJCQkJfQorCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA5KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTU7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEyKSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE2KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE2OworCQkJCX0KKwkJCQlpZiAocmVzdWx0ID09IC0xKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA1KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA2KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgOCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgODsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMykgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDE2KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNjsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA3OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDcpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA3OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA3OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE2KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE0KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkJCSAgIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIik7CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDUpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAzOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA0OworCQkJCX0KKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTEpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTE7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDExOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTYpIHsKKwkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTI7CisJCQkJfQorCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAzOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAzOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCA0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA0OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgICB0cnVlLCAxMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTI7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA0KSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAzKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJICAgIGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICAgdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIHRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoCisJICogdGhlIHJlY29yZGVkIG9uZSAod2hlbiBzY2FuLCBkaGNwLi4uKSwKKwkgKiB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZCBvbmUuICovCisJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IGNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpIHsKKwkJYm9vbCBzY2FuID0gZmFsc2UsIGxpbmsgPSBmYWxzZSwgcm9hbSA9IGZhbHNlOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIFBzVGRtYSB0eXBlIGRpc21hdGNoISEhLCAiICk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJjdXJQc1RkbWE9JWQsIHJlY29yZFBzVGRtYT0lZFxuIiwKKwkJCSAgY29leF9kbS0+Y3VyX3BzX3RkbWEsIGNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpOworCisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmcm9hbSk7CisKKwkJaWYgKCAhc2NhbiAmJiAhbGluayAmJiAhcm9hbSkKKwkJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQl0cnVlLAorCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSk7CisJCWVsc2UKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCSAgIltCVENvZXhdLCByb2FtaW5nL2xpbmsvc2NhbiBpcyB1bmRlciBwcm9ncmVzcywgd2lsbCBhZGp1c3QgbmV4dCB0aW1lISEhXG4iKTsKKwl9Cit9CisKKy8qIFNDTyBvbmx5IG9yIFNDTytQQU4oSFMpICovCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9hY3Rpb25fc2NvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlyc3NpX3N0YXRlLCBidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X3dpZmlyc3NpX3N0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMTUsIDApOworCisJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJaGFsYnRjODE5MmUyYW50X2xpbWl0ZWRfcngoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIGZhbHNlLCAweDgpOworCisJaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKKworCWJ0cnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF9idHJzc2lfc3RhdGUoMywgMzQsIDQyKTsKKworCWlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkgICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKKwkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJfQorCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwkvKiBzdyBtZWNoYW5pc20gKi8KKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDYpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4Nik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4Nik7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4Nik7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2FjdGlvbl9zY29fcGFuKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlyc3NpX3N0YXRlLCBidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X3dpZmlyc3NpX3N0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMTUsIDApOworCisJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJaGFsYnRjODE5MmUyYW50X2xpbWl0ZWRfcngoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIGZhbHNlLCAweDgpOworCisJaGFsYnRjODE5MmUyYW50X2Z3X2RhY19zd2luZ2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKKworCWJ0cnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF9idHJzc2lfc3RhdGUoMywgMzQsIDQyKTsKKworCWlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkgICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwl9CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4Nik7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHg2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHg2KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHg2KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX2hpZChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpcnNzaV9zdGF0ZSwgYnRyc3NpX3N0YXRlPUJUQ19SU1NJX1NUQVRFX0hJR0g7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpcnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF93aWZpcnNzaV9zdGF0ZShidGNvZXhpc3QsIDAsIDIsIDE1LCAwKTsKKwlidHJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfYnRyc3NpX3N0YXRlKDMsIDM0LCA0Mik7CisKKwloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfbGltaXRlZF9yeChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgZmFsc2UsIDB4OCk7CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMyk7CisKKwlpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJICAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEzKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCX0KKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworIAkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisgCQl9IGVsc2UgeworIAkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qIEEyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKSAqLwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX2EyZHAoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaXJzc2lfc3RhdGUsIGJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJdTMyIHdpZmlfYnc7CisJYm9vbCBsb25nX2Rpc3QgPSBmYWxzZTsKKworCXdpZmlyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X3dpZmlyc3NpX3N0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMTUsIDApOworCWJ0cnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF9idHJzc2lfc3RhdGUoMywgMzQsIDQyKTsKKworCWlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVyB8fAorCSAgICAgYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSAmJgorCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XIHx8CisJICAgICB3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEEyZHAsIHdpZmkvYnQgcnNzaSBib3RoIExPVyEhXG4iKTsKKwkJbG9uZ19kaXN0ID0gdHJ1ZTsKKwl9CisJaWYgKGxvbmdfZGlzdCkgeworCQloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwkJaGFsYnRjODE5MmUyYW50X2xpbWl0ZWRfcngoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIHRydWUsCisJCQkJCSAgIDB4NCk7CisJfSBlbHNlIHsKKwkJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJCWhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3J4KGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgMHg4KTsKKwl9CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYgKGxvbmdfZGlzdCkKKwkJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCWVsc2UKKwkJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCisKKwlpZiAobG9uZ19kaXN0KSB7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE3KTsKKwkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IGZhbHNlOworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCX0gZWxzZSB7CisJCWlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSwKKwkJCQkJCQkgICAgIHRydWUsIDEpOworCQkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKKwkJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSwKKwkJCQkJCQkgICAgIGZhbHNlLCAxKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSwKKwkJCQkJCQkgICAgIGZhbHNlLCAxKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisJCX0KKwl9CisKKwkvKiBzdyBtZWNoYW5pc20gKi8KKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisgCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODE5MmUyYW50X2FjdGlvbl9hMmRwX3Bhbl9ocyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpcnNzaV9zdGF0ZSwgYnRyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X3dpZmlyc3NpX3N0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMTUsIDApOworCWJ0cnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF9idHJzc2lfc3RhdGUoMywgMzQsIDQyKTsKKworCWhhbGJ0YzgxOTJlMmFudF9zd2l0Y2hfc3N0eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCWhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3J4KGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCBmYWxzZSwgMHg4KTsKKworCWhhbGJ0YzgxOTJlMmFudF9md19kYWNfc3dpbmdsdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCisJaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCSAgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwgMik7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKKwkJaGFsYnRjODE5MmUyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAyKTsKKwkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgMik7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisJfQorCisJLyogc3cgbWVjaGFuaXNtICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworIAkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIHRydWUsIDB4Nik7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgdHJ1ZSwgMHg2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgdHJ1ZSwgMHg2KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgdHJ1ZSwgMHg2KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX3Bhbl9lZHIoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaXJzc2lfc3RhdGUsIGJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpcnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF93aWZpcnNzaV9zdGF0ZShidGNvZXhpc3QsIDAsIDIsIDE1LCAwKTsKKwlidHJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfYnRyc3NpX3N0YXRlKDMsIDM0LCA0Mik7CisKKwloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfbGltaXRlZF9yeChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgZmFsc2UsIDB4OCk7CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCisJaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCSAgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCQloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisJCWhhbGJ0YzgxOTJlMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOworCX0KKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCisvKiBQQU4oSFMpIG9ubHkgKi8KK3ZvaWQgaGFsYnRjODE5MmUyYW50X2FjdGlvbl9wYW5faHMoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaXJzc2lfc3RhdGUsIGJ0cnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpcnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF93aWZpcnNzaV9zdGF0ZShidGNvZXhpc3QsIDAsIDIsIDE1LCAwKTsKKwlidHJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfYnRyc3NpX3N0YXRlKDMsIDM0LCA0Mik7CisKKwloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfbGltaXRlZF9yeChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgZmFsc2UsIDB4OCk7CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCisJaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCSAgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDQpOworCX0KKwloYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKworLyogUEFOKEVEUikrQTJEUCAqLwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX3Bhbl9lZHJfYTJkcChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpcnNzaV9zdGF0ZSwgYnRyc3NpX3N0YXRlPUJUQ19SU1NJX1NUQVRFX0hJR0g7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpcnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF93aWZpcnNzaV9zdGF0ZShidGNvZXhpc3QsIDAsIDIsIDE1LCAwKTsKKwlidHJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfYnRyc3NpX3N0YXRlKDMsIDM0LCA0Mik7CisKKwloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfbGltaXRlZF9yeChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgZmFsc2UsIDB4OCk7CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJICAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0YzgxOTJlMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIGZhbHNlLCB0cnVlLCAzKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgIDMpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJaGFsYnRjODE5MmUyYW50X2RlY19idHB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKKwkJaGFsYnRjODE5MmUyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAzKTsKKwl9CisKKwkvKiBzdyBtZWNoYW5pc20JKi8KKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX3Bhbl9lZHJfaGlkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlyc3NpX3N0YXRlLCBidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCXUzMiB3aWZpX2J3OworCisJd2lmaXJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfd2lmaXJzc2lfc3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAxNSwgMCk7CisJYnRyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X2J0cnNzaV9zdGF0ZSgzLCAzNCwgNDIpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwloYWxidGM4MTkyZTJhbnRfc3dpdGNoX3NzdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwloYWxidGM4MTkyZTJhbnRfbGltaXRlZF9yeChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgZmFsc2UsIDB4OCk7CisKKwloYWxidGM4MTkyZTJhbnRfZndfZGFjX3N3aW5nbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDMpOworCisJaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCSAgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCSAgICAgICAgaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJICAgICAgICBoYWxidGM4MTkyZTJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CisJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDQpOworCSAgICAgICAgaGFsYnRjODE5MmUyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCX0KKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qIEhJRCtBMkRQK1BBTihFRFIpICovCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9hY3Rpb25faGlkX2EyZHBfcGFuX2VkcihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpcnNzaV9zdGF0ZSwgYnRyc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X3dpZmlyc3NpX3N0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMTUsIDApOworCWJ0cnNzaV9zdGF0ZSA9IGhhbGJ0YzgxOTJlMmFudF9idHJzc2lfc3RhdGUoMywgMzQsIDQyKTsKKworCWhhbGJ0YzgxOTJlMmFudF9zd2l0Y2hfc3N0eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCWhhbGJ0YzgxOTJlMmFudF9saW1pdGVkX3J4KGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCBmYWxzZSwgMHg4KTsKKworCWhhbGJ0YzgxOTJlMmFudF9md19kYWNfc3dpbmdsdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWhhbGJ0YzgxOTJlMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAzKTsKKworCWlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLCAzKTsKKwl9IGVsc2UgaWYgKChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkgICAoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwgMyk7CisJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDQpOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwgMyk7CisJfQorCisJLyogc3cgbWVjaGFuaXNtICovCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX2hpZF9hMmRwKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlyc3NpX3N0YXRlLCBidHJzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCXUzMiB3aWZpX2J3OworCisJd2lmaXJzc2lfc3RhdGUgPSBoYWxidGM4MTkyZTJhbnRfd2lmaXJzc2lfc3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAxNSwgMCk7CisJYnRyc3NpX3N0YXRlID0gaGFsYnRjODE5MmUyYW50X2J0cnNzaV9zdGF0ZSgzLCAzNCwgNDIpOworCisJaGFsYnRjODE5MmUyYW50X3N3aXRjaF9zc3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJaGFsYnRjODE5MmUyYW50X2xpbWl0ZWRfcngoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIGZhbHNlLCAweDgpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwloYWxidGM4MTkyZTJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMyk7CisKKwlpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJICAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCWhhbGJ0YzgxOTJlMmFudF9kZWNfYnRwd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0YzgxOTJlMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIHRydWUsIHRydWUsIDIpOworCX0gZWxzZSBpZiAoKGJ0cnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSAJeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDIpOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwgMik7CisJfSBlbHNlIGlmICgoYnRyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgIChidHJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQloYWxidGM4MTkyZTJhbnRfZGVjX2J0cHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDQpOworCQloYWxidGM4MTkyZTJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwgMik7CisJfQorCisJLyogc3cgbWVjaGFuaXNtICovCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlyc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaXJzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODE5MmUyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4MTkyZTJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4MTkyZTJhbnRfcnVuX2NvZXhpc3RfbWVjaGFuaXNtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IGFsZ29yaXRobSA9IDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCSAgIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCk9PT0+XG4iKTsKKworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCByZXR1cm4gZm9yIE1hbnVhbCBDVFJMIDw9PT1cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNvZXhfc3RhLT51bmRlcl9pcHMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIHdpZmkgaXMgdW5kZXIgSVBTICEhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlhbGdvcml0aG0gPSBoYWxidGM4MTkyZTJhbnRfYWN0aW9uX2FsZ29yaXRobShidGNvZXhpc3QpOworCWlmIChjb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSAmJgorCSAgICAoQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFOSFMgIT0gYWxnb3JpdGhtKSkgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQlQgaXMgdW5kZXIgaW5xdWlyeS9wYWdlIHNjYW4gISFcbiIpOworCQloYWxidGM4MTkyZTJhbnRfYWN0aW9uX2J0X2lucXVpcnkoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKworCWNvZXhfZG0tPmN1cl9hbGdvcml0aG0gPSBhbGdvcml0aG07CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkgICJbQlRDb2V4XSwgQWxnb3JpdGhtID0gJWQgXG4iLCBjb2V4X2RtLT5jdXJfYWxnb3JpdGhtKTsKKworCWlmIChoYWxidGM4MTkyZTJhbnRfaXNfY29tbW9uX2FjdGlvbihidGNvZXhpc3QpKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQgY29tbW9uLlxuIik7CisJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAoY29leF9kbS0+Y3VyX2FsZ29yaXRobSAhPSBjb2V4X2RtLT5wcmVfYWxnb3JpdGhtKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0gcHJlQWxnb3JpdGhtPSVkLCBjdXJBbGdvcml0aG09JWRcbiIsCisJCQkJICBjb2V4X2RtLT5wcmVfYWxnb3JpdGhtLAorCQkJCSAgY29leF9kbS0+Y3VyX2FsZ29yaXRobSk7CisJCQljb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0ID0gZmFsc2U7CisJCX0KKwkJc3dpdGNoIChjb2V4X2RtLT5jdXJfYWxnb3JpdGhtKSB7CisJCWNhc2UgQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gU0NPLlxuIik7CisJCQloYWxidGM4MTkyZTJhbnRfYWN0aW9uX3NjbyhidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fU0NPX1BBTjoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTytQQU4oRURSKS5cbiIpOworCQkJaGFsYnRjODE5MmUyYW50X2FjdGlvbl9zY29fcGFuKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19ISUQ6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9hY3Rpb25faGlkKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gQTJEUC5cbiIpOworCQkJaGFsYnRjODE5MmUyYW50X2FjdGlvbl9hMmRwKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gQTJEUCtQQU4oSFMpLlxuIik7CisJCQloYWxidGM4MTkyZTJhbnRfYWN0aW9uX2EyZHBfcGFuX2hzKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFI6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKS5cbiIpOworCQkJaGFsYnRjODE5MmUyYW50X2FjdGlvbl9wYW5fZWRyKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5IUzoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9hY3Rpb25fcGFuX2hzKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTitBMkRQLlxuIik7CisJCQloYWxidGM4MTkyZTJhbnRfYWN0aW9uX3Bhbl9lZHJfYTJkcChidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpK0hJRC5cbiIpOworCQkJaGFsYnRjODE5MmUyYW50X2FjdGlvbl9wYW5fZWRyX2hpZChidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIik7CisJCQloYWxidGM4MTkyZTJhbnRfYWN0aW9uX2hpZF9hMmRwX3Bhbl9lZHIoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKTsKKwkJCWhhbGJ0YzgxOTJlMmFudF9hY3Rpb25faGlkX2EyZHAoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gdW5rbm93biEhXG4iKTsKKwkJCS8qIGhhbGJ0YzgxOTJlMmFudF9jb2V4X2FsbG9mZihidGNvZXhpc3QpOyAqLworCQkJYnJlYWs7CisJCX0KKwkJY29leF9kbS0+cHJlX2FsZ29yaXRobSA9IGNvZXhfZG0tPmN1cl9hbGdvcml0aG07CisJfQorfQorCit2b2lkIGhhbGJ0YzgxOTJlMmFudF9pbml0X2h3Y29uZmlnKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCBib29sIGJhY2t1cCkKK3sKKwl1MTYgdTE2dG1wID0gMDsKKwl1OCB1OHRtcCA9IDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJICAiW0JUQ29leF0sIDJBbnQgSW5pdCBIVyBDb25maWchIVxuIik7CisKKwlpZiAoYmFja3VwKSB7CisJCS8qIGJhY2t1cCByZiAweDFlIHZhbHVlICovCisJCWNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXAgPQorCQkJYnRjb2V4aXN0LT5idGNfZ2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLAorCQkJCQkJICAweDFlLCAweGZmZmZmKTsKKworCQljb2V4X2RtLT5iYWNrdXBfYXJmcl9jbnQxID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsCisJCQkJCQkJCSAgICAgIDB4NDMwKTsKKwkJY29leF9kbS0+YmFja3VwX2FyZnJfY250MiA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgIDB4NDM0KTsKKwkJY29leF9kbS0+YmFja3VwX3JldHJ5bGltaXQgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzJieXRlKAorCQkJCQkJCQkgICAgYnRjb2V4aXN0LAorCQkJCQkJCQkgICAgMHg0MmEpOworCQljb2V4X2RtLT5iYWNrdXBfYW1wZHVfbWF4dGltZSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoCisJCQkJCQkJCSAgICBidGNvZXhpc3QsCisJCQkJCQkJCSAgICAweDQ1Nik7CisJfQorCisJLyogYW50ZW5uYSBzdyBjdHJsIHRvIGJ0ICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmLCAweDYpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5NDQsIDB4MjQpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg5MzAsIDB4NzAwNzAwKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4OTJjLCAweDIwKTsKKwlpZiAoYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9PSBCVENfSU5URl9VU0IpCisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2NCwgMHgzMDQzMDAwNCk7CisJZWxzZQorCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NjQsIDB4MzAwMzAwMDQpOworCisJaGFsYnRjODE5MmUyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMCk7CisKKwkvKiBhbnRlbm5hIHN3aXRjaCBjb250cm9sIHBhcmFtZXRlciAqLworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg4NTgsIDB4NTU1NTU1NTUpOworCisJLyogY29leCBwYXJhbWV0ZXJzICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc3OCwgMHgzKTsKKwkvKiAweDc5MFs1OjBdPTB4NSAqLworCXU4dG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NzkwKTsKKwl1OHRtcCAmPSAweGMwOworCXU4dG1wIHw9IDB4NTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzkwLCB1OHRtcCk7CisKKwkvKiBlbmFibGUgY291bnRlciBzdGF0aXN0aWNzICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHg0KTsKKworCS8qIGVuYWJsZSBQVEEgKi8KKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NDAsIDB4MjApOworCS8qIGVuYWJsZSBtYWlsYm94IGludGVyZmFjZSAqLworCXUxNnRtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMmJ5dGUoYnRjb2V4aXN0LCAweDQwKTsKKwl1MTZ0bXAgfD0gQklUOTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4NDAsIHUxNnRtcCk7CisKKwkvKiBlbmFibGUgUFRBIEkyQyBtYWlsYm94ICAqLworCXU4dG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4MTAxKTsKKwl1OHRtcCB8PSBCSVQ0OworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHgxMDEsIHU4dG1wKTsKKworCS8qIGVuYWJsZSBidCBjbG9jayB3aGVuIHdpZmkgaXMgZGlzYWJsZWQuICovCisJdTh0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg5Myk7CisJdTh0bXAgfD0gQklUMDsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4OTMsIHU4dG1wKTsKKwkvKiBlbmFibGUgYnQgY2xvY2sgd2hlbiBzdXNwZW5kLiAqLworCXU4dG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4Nyk7CisJdTh0bXAgfD0gQklUMDsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NywgdTh0bXApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0YzgxOTJlMmFudF8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEVYaGFsYnRjODE5MmUyYW50XworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfaW5pdF9od2NvbmZpZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwloYWxidGM4MTkyZTJhbnRfaW5pdF9od2NvbmZpZyhidGNvZXhpc3QsIHRydWUpOworfQorCit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9pbml0X2NvZXhfZG0oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsCisJCSAgIltCVENvZXhdLCBDb2V4IE1lY2hhbmlzbSBJbml0ISFcbiIpOworCWhhbGJ0YzgxOTJlMmFudF9pbml0X2NvZXhfZG0oYnRjb2V4aXN0KTsKK30KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfZGlzcGxheV9jb2V4X2luZm8oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IGJ0Y19ib2FyZF9pbmZvICpib2FyZF9pbmZvID0gJmJ0Y29leGlzdC0+Ym9hcmRfaW5mbzsKKwlzdHJ1Y3QgYnRjX3N0YWNrX2luZm8qc3RhY2tfaW5mbyA9ICZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJdTggKmNsaV9idWYgPSBidGNvZXhpc3QtPmNsaV9idWY7CisJdTggdTh0bXBbNF0sIGksIGJ0X2luZm9fZXh0LCBwc190ZG1hX2Nhc2UgPSAwOworCXUxNiB1MTZ0bXBbNF07CisJdTMyIHUzMnRtcFs0XTsKKwlib29sIHJvYW0gPSBmYWxzZSwgc2NhbiA9IGZhbHNlLCBsaW5rID0gZmFsc2UsIHdpZmlfdW5kZXJfNWcgPSBmYWxzZTsKKwlib29sIGJ0X2hzb24gPSBmYWxzZSwgd2lmaV9idXN5ID0gZmFsc2U7CisJaW50IHdpZmlyc3NpID0gMCwgYnRfaHNfcnNzaSA9IDA7CisJdTMyIHdpZmlfYncsIHdpZmlfdHJhZmZpY19kaXI7CisJdTggd2lmaV9kb3QxMV9jaG5sLCB3aWZpX2hzX2Nobmw7CisJdTMyIGZ3X3ZlciA9IDAsIGJ0X3BhdGNoX3ZlciA9IDA7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJICAgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlpZiAoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkgeworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJCSAgICJcclxuID09PT09PT09PT09W1VuZGVyIE1hbnVhbCBDb250cm9sXT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCQkgICAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCX0KKworCWlmICghYm9hcmRfaW5mby0+YnRfZXhpc3QpIHsKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuIEJUIG5vdCBleGlzdHMgISEhIik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJcmV0dXJuOworCX0KKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiQW50IFBHIG51bWJlci8gQW50IG1lY2hhbmlzbToiLAorCQkgICBib2FyZF9pbmZvLT5wZ19hbnRfbnVtLCBib2FyZF9pbmZvLT5idGRtX2FudF9udW0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLAorCQkgICAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwKKwkJICAgKChzdGFja19pbmZvLT5wcm9maWxlX25vdGlmaWVkKSA/ICJZZXMiIDogIk5vIiksCisJCSAgIHN0YWNrX2luZm8tPmhjaV92ZXJzaW9uKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwgJmJ0X3BhdGNoX3Zlcik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0ZXX1ZFUiwgJmZ3X3Zlcik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCSAgICJcclxuICUtMzVzID0gJWRfJWQvIDB4JXgvIDB4JXgoJWQpIiwKKwkJICAgIkNvZXhWZXIvIEZ3VmVyLyBQYXRjaFZlciIsCisJCSAgIGdsY29leF92ZXJfZGF0ZV84MTkyZV8yYW50LCBnbGNvZXhfdmVyXzgxOTJlXzJhbnQsCisJCSAgIGZ3X3ZlciwgYnRfcGF0Y2hfdmVyLCBidF9wYXRjaF92ZXIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNvbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsCisJCQkgICAmd2lmaV9kb3QxMV9jaG5sKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlfaHNfY2hubCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCglZCkiLAorCQkgICAiRG90MTEgY2hhbm5lbCAvIEhzTW9kZShIc0NobmwpIiwKKwkJICAgd2lmaV9kb3QxMV9jaG5sLCBidF9oc29uLCB3aWZpX2hzX2NobmwpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsCisJCSAgICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0sCisJCSAgIGNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdLCBjb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpcnNzaSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRfaHNfcnNzaSk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwKKwkJICAgIldpZmkgcnNzaS8gSFMgcnNzaSIsIHdpZmlyc3NpLCBidF9oc19yc3NpKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZyb2FtKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsCisJCSAgICJXaWZpIGxpbmsvIHJvYW0vIHNjYW4iLCBsaW5rLCByb2FtLCBzY2FuKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZ3aWZpX3VuZGVyXzVnKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX1RSQUZGSUNfRElSRUNUSU9OLAorCQkJICAgJndpZmlfdHJhZmZpY19kaXIpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJXMvICVzICIsCisJCSAgICJXaWZpIHN0YXR1cyIsICh3aWZpX3VuZGVyXzVnID8gIjVHIiA6ICIyLjRHIiksCisJCSAgICgoQlRDX1dJRklfQldfTEVHQUNZID09IHdpZmlfYncpID8gIkxlZ2FjeSIgOgorCQkgICAJKCgoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSA/ICJIVDQwIiA6ICJIVDIwIikpKSwKKwkJICAgKCghd2lmaV9idXN5KSA/ICJpZGxlIiA6CisJCSAgIAkoKEJUQ19XSUZJX1RSQUZGSUNfVFggPT0gd2lmaV90cmFmZmljX2RpcikgPworCQkJCSJ1cGxpbmsiIDogImRvd25saW5rIikpKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwKKwkJICAgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsCisJCSAgICgoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKSA/ICgiZGlzYWJsZWQiKSA6CisJCSAgICAoKGNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlKSA/CisJCSAgICAgKCJpbnF1aXJ5L3BhZ2Ugc2NhbiIpIDoKKwkJICAgICAgKChCVF84MTkyRV8yQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0KKwkJCWNvZXhfZG0tPmJ0X3N0YXR1cykgPyAibm9uLWNvbm5lY3RlZCBpZGxlIiA6CisJCQkgKChCVF84MTkyRV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PQorCQkJICAgY29leF9kbS0+YnRfc3RhdHVzKSA/ICJjb25uZWN0ZWQtaWRsZSIgOiAiYnVzeSIpKSkpLAorCQkgICBjb2V4X3N0YS0+YnRfcnNzaSwgY29leF9zdGEtPmJ0X3JldHJ5X2NudCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCAvICVkIC8gJWQiLAorCQkgICAiU0NPL0hJRC9QQU4vQTJEUCIsIHN0YWNrX2luZm8tPnNjb19leGlzdCwKKwkJICAgc3RhY2tfaW5mby0+aGlkX2V4aXN0LCBzdGFja19pbmZvLT5wYW5fZXhpc3QsCisJCSAgIHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsKKworCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwKKwkJICAgIkJUIEluZm8gQTJEUCByYXRlIiwKKwkJICAgKGJ0X2luZm9fZXh0JkJJVDApID8gIkJhc2ljIHJhdGUiIDogIkVEUiByYXRlIik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJZm9yIChpPTA7IGk8QlRfSU5GT19TUkNfODE5MkVfMkFOVF9NQVg7IGkrKykgeworCQlpZiAoY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtpXSkgeworCQkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCQkJICAgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIsCisJCQkJICAgR0xCdEluZm9TcmM4MTkyZTJBbnRbaV0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzBdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVsxXSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bMl0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzNdKTsKKwkJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkJCSAgICIlMDJ4ICUwMnggJTAyeCglZCkiLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVs0XSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNV0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzZdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaF9jbnRbaV0pOworCQkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQl9CisJfQorCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvJXMiLAorCQkgICAiUFMgc3RhdGUsIElQUy9MUFMiLAorCQkgICAoKGNvZXhfc3RhLT51bmRlcl9pcHMgPyAiSVBTIE9OIiA6ICJJUFMgT0ZGIikpLAorCQkgICAoKGNvZXhfc3RhLT51bmRlcl9scHMgPyAiTFBTIE9OIiA6ICJMUFMgT0ZGIikpKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisJYnRjb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKGJ0Y29leGlzdCwgQlRDX0RCR19ESVNQX0ZXX1BXUl9NT0RFX0NNRCk7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJTUyBUeXBlIiwKKwkJICAgY29leF9kbS0+Y3VyX3NzdHlwZSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJLyogU3cgbWVjaGFuaXNtCSovCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwKKwkJICAgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQgIiwKKwkJICAgIlNNMVtTaFJmLyBMcFJBLyBMaW1EaWddIiwgY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmssCisJCSAgIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSwgY29leF9kbS0+bGltaXRlZF9kaWcpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsCisJCSAgICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsCisJCSAgIGNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYsCisJCSAgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJSYXRlIE1hc2siLAorCQkgICBidGNvZXhpc3QtPmJ0X2luZm8ucmFfbWFzayk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJLyogRncgbWVjaGFuaXNtCSovCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwKKwkJICAgIj09PT09PT09PT09PVtGdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJcHNfdGRtYV9jYXNlID0gY29leF9kbS0+Y3VyX3BzX3RkbWE7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCSAgICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQgKGF1dG86JWQpIiwKKwkJICAgIlBTIFRETUEiLCBjb2V4X2RtLT5wc190ZG1hX3BhcmFbMF0sCisJCSAgIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVsxXSwgY29leF9kbS0+cHNfdGRtYV9wYXJhWzJdLAorCQkgICBjb2V4X2RtLT5wc190ZG1hX3BhcmFbM10sIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVs0XSwKKwkJICAgcHNfdGRtYV9jYXNlLCBjb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0KTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwKKwkJICAgIkRlY0J0UHdyLyBJZ25XbGFuQWN0IiwKKwkJICAgY29leF9kbS0+Y3VyX2RlY19idF9wd3IsIGNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCS8qIEh3IHNldHRpbmcgKi8KKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLAorCQkgICAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsCisJCSAgICJSRi1BLCAweDFlIGluaXRWYWwiLCBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LzB4JXgvMHgleC8weCV4IiwKKwkJICAgImJhY2t1cCBBUkZSMS9BUkZSMi9STC9BTWF4VGltZSIsIGNvZXhfZG0tPmJhY2t1cF9hcmZyX2NudDEsCisJCSAgIGNvZXhfZG0tPmJhY2t1cF9hcmZyX2NudDIsIGNvZXhfZG0tPmJhY2t1cF9yZXRyeWxpbWl0LAorCQkgICBjb2V4X2RtLT5iYWNrdXBfYW1wZHVfbWF4dGltZSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NDMwKTsKKwl1MzJ0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0MzQpOworCXUxNnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMmJ5dGUoYnRjb2V4aXN0LCAweDQyYSk7CisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0NTYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvMHgleC8weCV4LzB4JXgiLAorCQkgICAiMHg0MzAvMHg0MzQvMHg0MmEvMHg0NTYiLAorCQkgICB1MzJ0bXBbMF0sIHUzMnRtcFsxXSwgdTE2dG1wWzBdLCB1OHRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4YzA0KTsKKwl1MzJ0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhkMDQpOworCXUzMnRtcFsyXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDkwYyk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsCisJCSAgICIweGMwNC8gMHhkMDQvIDB4OTBjIiwgdTMydG1wWzBdLCB1MzJ0bXBbMV0sIHUzMnRtcFsyXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg3NzgiLAorCQkgICB1OHRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMpOworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDkzMCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsCisJCSAgICIweDkyYy8gMHg5MzAiLCAodTh0bXBbMF0pLCB1MzJ0bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXU4dG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NDApOworCXU4dG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NGYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLAorCQkgICAiMHg0MC8gMHg0ZiIsIHU4dG1wWzBdLCB1OHRtcFsxXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NTUwKTsKKwl1OHRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDUyMik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsCisJCSAgICIweDU1MChiY24gY3RybCkvMHg1MjIiLCB1MzJ0bXBbMF0sIHU4dG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhjNTApOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHhjNTAoZGlnKSIsCisJCSAgIHUzMnRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmMwKTsKKwl1MzJ0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQpOworCXUzMnRtcFsyXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCk7CisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg2Y2MpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsCisJCSAgIHUzMnRtcFswXSwgdTMydG1wWzFdLCB1MzJ0bXBbMl0sIHU4dG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLAorCQkgICAiMHg3NzAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsCisJCSAgIGNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4LCBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsCisJCSAgICIweDc3NChscCByeFszMToxNl0vdHhbMTU6MF0pIiwKKwkJICAgY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCwgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMkFOVCA9PSAxKQorCWhhbGJ0YzgxOTJlMmFudF9tb25pdG9yX2J0X2N0cihidGNvZXhpc3QpOworI2VuZGlmCisJYnRjb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKGJ0Y29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cit9CisKKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfaXBzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSkKK3sKKwlpZiAoQlRDX0lQU19FTlRFUiA9PSB0eXBlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgSVBTIEVOVEVSIG5vdGlmeVxuIik7CisJCWNvZXhfc3RhLT51bmRlcl9pcHMgPSB0cnVlOworCQloYWxidGM4MTkyZTJhbnRfY29leF9hbGxvZmYoYnRjb2V4aXN0KTsKKwl9IGVsc2UgaWYgKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gZmFsc2U7CisJfQorfQorCit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9scHNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKQoreworCWlmIChCVENfTFBTX0VOQUJMRSA9PSB0eXBlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgTFBTIEVOQUJMRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfbHBzID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKEJUQ19MUFNfRElTQUJMRSA9PSB0eXBlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgTFBTIERJU0FCTEUgbm90aWZ5XG4iKTsKKwkJY29leF9zdGEtPnVuZGVyX2xwcyA9IGZhbHNlOworCX0KK30KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfc2Nhbl9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJaWYgKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpOworCWVsc2UgaWYoQlRDX1NDQU5fRklOSVNIID09IHR5cGUpCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgU0NBTiBGSU5JU0ggbm90aWZ5XG4iKTsKK30KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfY29ubmVjdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJaWYgKEJUQ19BU1NPQ0lBVEVfU1RBUlQgPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIik7CisJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQorCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIENPTk5FQ1QgRklOSVNIIG5vdGlmeVxuIik7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X21lZGlhX3N0YXR1c19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICB1OCB0eXBlKQoreworCXU4IGgyY19wYXJhbWV0ZXJbM10gPXswfTsKKwl1MzIgd2lmaV9idzsKKwl1OCB3aWZpX2NlbnRlcl9jaG5sOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKKwkgICAgYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gfHwKKwkgICAgYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwlpZiAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBNRURJQSBjb25uZWN0IG5vdGlmeVxuIik7CisJZWxzZQorCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKTsKKworCS8qIG9ubHkgMi40RyB3ZSBuZWVkIHRvIGluZm9ybSBidCB0aGUgY2hubCBtYXNrICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0NFTlRSQUxfQ0hOTCwKKwkJCSAgICZ3aWZpX2NlbnRlcl9jaG5sKTsKKwlpZiAoKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpICYmCisJICAgICh3aWZpX2NlbnRlcl9jaG5sIDw9IDE0KSkgeworCQloMmNfcGFyYW1ldGVyWzBdID0gMHgxOworCQloMmNfcGFyYW1ldGVyWzFdID0gd2lmaV9jZW50ZXJfY2hubDsKKwkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJCQloMmNfcGFyYW1ldGVyWzJdID0gMHgzMDsKKwkJZWxzZQorCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MjA7CisJfQorCisJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0gPSBoMmNfcGFyYW1ldGVyWzBdOworCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdID0gaDJjX3BhcmFtZXRlclsxXTsKKwljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSA9IGgyY19wYXJhbWV0ZXJbMl07CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjY9MHgleFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdIDw8IDE2IHwgaDJjX3BhcmFtZXRlclsxXSA8PCA4IHwKKwkJICBoMmNfcGFyYW1ldGVyWzJdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2NiwgMywgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X3NwZWNpYWxfcGFja2V0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgICAgdTggdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCisgCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIERIQ1AgUGFja2V0IG5vdGlmeVxuIik7CisgfQorCit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9idF9pbmZvX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgICAgdTggKnRtcF9idWYsIHU4IGxlbmd0aCApCit7CisJdTggYnRfaW5mbyA9IDA7CisJdTggaSwgcnNwU291cmNlID0gMDsKKwlib29sIGJ0X2J1c3kgPSBmYWxzZSwgbGltaXRlZF9kaWcgPSBmYWxzZTsKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2U7CisKKwljb2V4X3N0YS0+YzJoX2J0X2luZm9fcmVxX3NlbnQgPSBmYWxzZTsKKworCXJzcFNvdXJjZSA9IHRtcF9idWZbMF0gJiAweGY7CisJaWYgKHJzcFNvdXJjZSA+PSBCVF9JTkZPX1NSQ184MTkyRV8yQU5UX01BWCkKKwkJcnNwU291cmNlID0gQlRfSU5GT19TUkNfODE5MkVfMkFOVF9XSUZJX0ZXOworCWNvZXhfc3RhLT5idF9pbmZvX2MyaF9jbnRbcnNwU291cmNlXSsrOworCisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJICAiW0JUQ29leF0sIEJ0IGluZm9bJWRdLCBsZW5ndGg9JWQsIGhleCBkYXRhPVsiLAorCQkgIHJzcFNvdXJjZSwgbGVuZ3RoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcFNvdXJjZV1baV0gPSB0bXBfYnVmW2ldOworCQlpZiAoaSA9PSAxKQorCQkJYnRfaW5mbyA9IHRtcF9idWZbaV07CisJCWlmIChpID09IGxlbmd0aC0xKQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCQkgICIweCUwMnhdXG4iLCB0bXBfYnVmW2ldKTsKKwkJZWxzZQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCQkgICIweCUwMngsICIsIHRtcF9idWZbaV0pOworCX0KKworCWlmIChCVF9JTkZPX1NSQ184MTkyRV8yQU5UX1dJRklfRlcgIT0gcnNwU291cmNlKSB7CisJCWNvZXhfc3RhLT5idF9yZXRyeV9jbnQgPQkvKiBbMzowXSAqLworCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcFNvdXJjZV1bMl0gJiAweGY7CisKKwkJY29leF9zdGEtPmJ0X3Jzc2kgPQorCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcFNvdXJjZV1bM10gKiAyICsgMTA7CisKKwkJY29leF9zdGEtPmJ0X2luZm9fZXh0ID0KKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3BTb3VyY2VdWzRdOworCisJCS8qIEhlcmUgd2UgbmVlZCB0byByZXNlbmQgc29tZSB3aWZpIGluZm8gdG8gQlQKKwkJICogYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4gKi8KKwkJaWYgKChjb2V4X3N0YS0+YnRfaW5mb19leHQgJiBCSVQxKSkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgImJpdDEsIHNlbmQgd2lmaSBCVyZDaG5sIHRvIEJUISFcbiIpOworCQkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCQkJICAgJndpZmlfY29ubmVjdGVkKTsKKwkJCWlmICh3aWZpX2Nvbm5lY3RlZCkKKwkJCQlleF9oYWxidGM4MTkyZTJhbnRfbWVkaWFfc3RhdHVzX25vdGlmeSgKKwkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJQlRDX01FRElBX0NPTk5FQ1QpOworCQkJZWxzZQorCQkJCWV4X2hhbGJ0YzgxOTJlMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KAorCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQlCVENfTUVESUFfRElTQ09OTkVDVCk7CisJCX0KKworCQlpZiAoKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDMpKSB7CisJCQlpZiAoIWJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgJiYKKwkJCSAgICAhYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgImJpdDMsIEJUIE5PVCBpZ25vcmUgV2xhbiBhY3RpdmUhXG4iKTsKKwkJCQloYWxidGM4MTkyZTJhbnRfSWdub3JlV2xhbkFjdChidGNvZXhpc3QsCisJCQkJCQkJICAgICAgRk9SQ0VfRVhFQywKKwkJCQkJCQkgICAgICBmYWxzZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBCVCBhbHJlYWR5IE5PVCBpZ25vcmUgV2xhbiBhY3RpdmUsCisJCQkgKiBkbyBub3RoaW5nIGhlcmUuICovCisJCX0KKworI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMkFOVCA9PSAwKQorCQlpZiAoKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDQpKSB7CisJCQkvKiBCVCBhdXRvIHJlcG9ydCBhbHJlYWR5IGVuYWJsZWQsIGRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKKwkJCWhhbGJ0YzgxOTJlMmFudF9idF9hdXRvcmVwb3J0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywKKwkJCQkJCSAgICAgIHRydWUpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbiAqLworCWlmKGJ0X2luZm8gJiBCVF9JTkZPXzgxOTJFXzJBTlRfQl9JTlFfUEFHRSkKKwkJY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgPSB0cnVlOworCWVsc2UKKwkJY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgPSBmYWxzZTsKKworCS8qIHNldCBsaW5rIGV4aXN0IHN0YXR1cyAqLworCWlmICghKGJ0X2luZm8mQlRfSU5GT184MTkyRV8yQU5UX0JfQ09OTkVDVElPTikpIHsKKwkJY29leF9zdGEtPmJ0X2xpbmtfZXhpc3QgPSBmYWxzZTsKKwkJY29leF9zdGEtPnBhbl9leGlzdCA9IGZhbHNlOworCQljb2V4X3N0YS0+YTJkcF9leGlzdCA9IGZhbHNlOworCQljb2V4X3N0YS0+aGlkX2V4aXN0ID0gZmFsc2U7CisJCWNvZXhfc3RhLT5zY29fZXhpc3QgPSBmYWxzZTsKKwl9IGVsc2Ugey8qIGNvbm5lY3Rpb24gZXhpc3RzICovCisJCWNvZXhfc3RhLT5idF9saW5rX2V4aXN0ID0gdHJ1ZTsKKwkJaWYgKGJ0X2luZm8gJiBCVF9JTkZPXzgxOTJFXzJBTlRfQl9GVFApCisJCQljb2V4X3N0YS0+cGFuX2V4aXN0ID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29leF9zdGEtPnBhbl9leGlzdCA9IGZhbHNlOworCQlpZiAoYnRfaW5mbyAmIEJUX0lORk9fODE5MkVfMkFOVF9CX0EyRFApCisJCQljb2V4X3N0YS0+YTJkcF9leGlzdCA9IHRydWU7CisJCWVsc2UKKwkJCWNvZXhfc3RhLT5hMmRwX2V4aXN0ID0gZmFsc2U7CisJCWlmIChidF9pbmZvICYgQlRfSU5GT184MTkyRV8yQU5UX0JfSElEKQorCQkJY29leF9zdGEtPmhpZF9leGlzdCA9IHRydWU7CisJCWVsc2UKKwkJCWNvZXhfc3RhLT5oaWRfZXhpc3QgPSBmYWxzZTsKKwkJaWYgKGJ0X2luZm8gJiBCVF9JTkZPXzgxOTJFXzJBTlRfQl9TQ09fRVNDTykKKwkJCWNvZXhfc3RhLT5zY29fZXhpc3QgPSB0cnVlOworCQllbHNlCisJCQljb2V4X3N0YS0+c2NvX2V4aXN0ID0gZmFsc2U7CisJfQorCisJaGFsYnRjODE5MmUyYW50X3VwZGF0ZV9idGxpbmtfaW5mbyhidGNvZXhpc3QpOworCisJaWYgKCEoYnRfaW5mbyZCVF9JTkZPXzgxOTJFXzJBTlRfQl9DT05ORUNUSU9OKSkgeworCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84MTkyRV8yQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEU7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBCVCBOb24tQ29ubmVjdGVkIGlkbGUhISFcbiIpOworCX0gZWxzZSBpZiAoYnRfaW5mbyA9PSBCVF9JTkZPXzgxOTJFXzJBTlRfQl9DT05ORUNUSU9OKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgYnRfaW5mb05vdGlmeSgpLCBCVCBDb25uZWN0ZWQtaWRsZSEhIVxuIik7CisJfSBlbHNlIGlmICgoYnRfaW5mbyZCVF9JTkZPXzgxOTJFXzJBTlRfQl9TQ09fRVNDTykgfHwKKwkJICAgKGJ0X2luZm8mQlRfSU5GT184MTkyRV8yQU5UX0JfU0NPX0JVU1kpKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX1NDT19CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgYnRfaW5mb05vdGlmeSgpLCBCVCBTQ08gYnVzeSEhIVxuIik7CisJfSBlbHNlIGlmIChidF9pbmZvJkJUX0lORk9fODE5MkVfMkFOVF9CX0FDTF9CVVNZKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX0FDTF9CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgYnRfaW5mb05vdGlmeSgpLCBCVCBBQ0wgYnVzeSEhIVxuIik7CisJfSBlbHNlIHsKKwkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfTUFYOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XWJ0X2luZm9Ob3RpZnkoKSwgQlQgTm9uLURlZmluZWQgc3RhdGUhISFcbiIpOworCX0KKworCWlmICgoQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCSAgICAoQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCSAgICAoQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJYnRfYnVzeSA9IHRydWU7CisJCWxpbWl0ZWRfZGlnID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlidF9idXN5ID0gZmFsc2U7CisJCWxpbWl0ZWRfZGlnID0gZmFsc2U7CisJfQorCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9UUkFGRklDX0JVU1ksICZidF9idXN5KTsKKworCWNvZXhfZG0tPmxpbWl0ZWRfZGlnID0gbGltaXRlZF9kaWc7CisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmxpbWl0ZWRfZGlnKTsKKworCWhhbGJ0YzgxOTJlMmFudF9ydW5fY29leGlzdF9tZWNoYW5pc20oYnRjb2V4aXN0KTsKK30KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfc3RhY2tfb3BlcmF0aW9uX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgICAgIHU4IHR5cGUpCit7CisJaWYgKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX1NUQVJUID09IHR5cGUpCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCSAgICAgICAgICAiW0JUQ29leF0gU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBzdGFydCBub3RpZnlcbiIpOworCWVsc2UgaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfRklOSVNIID09IHR5cGUpCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCSAgICAgICAgICAiW0JUQ29leF0gU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBmaW5pc2ggbm90aWZ5XG4iKTsKK30KKwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfaGFsdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgIltCVENvZXhdLCBIYWx0IG5vdGlmeVxuIik7CisKKwloYWxidGM4MTkyZTJhbnRfSWdub3JlV2xhbkFjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCWV4X2hhbGJ0YzgxOTJlMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KGJ0Y29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOworfQorCit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0YXRpYyB1OCBkaXNfdmVyX2luZm9fY250ID0gMDsKKwl1MzIgZndfdmVyID0gMCwgYnRfcGF0Y2hfdmVyID0gMDsKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKmJvYXJkX2luZm89JmJ0Y29leGlzdC0+Ym9hcmRfaW5mbzsKKwlzdHJ1Y3QgYnRjX3N0YWNrX2luZm8gKnN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJICAiPT09PT09PT09PT09PT09PT09PT09PT1QZXJpb2RpY2FsPT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCWlmIChkaXNfdmVyX2luZm9fY250IDw9IDUpIHsKKwkJZGlzX3Zlcl9pbmZvX2NudCArPSAxOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiQW50IFBHIE51bS8gQW50IE1lY2gvIEFudCBQb3MgPSAlZC8gJWQvICVkXG4iLAorCQkJICBib2FyZF9pbmZvLT5wZ19hbnRfbnVtLCBib2FyZF9pbmZvLT5idGRtX2FudF9udW0sCisJCQkgIGJvYXJkX2luZm8tPmJ0ZG1fYW50X3Bvcyk7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiQlQgc3RhY2svIGhjaSBleHQgdmVyID0gJXMgLyAlZFxuIiwKKwkJCSAgKChzdGFja19pbmZvLT5wcm9maWxlX25vdGlmaWVkKSA/ICJZZXMiIDogIk5vIiksCisJCQkgIHN0YWNrX2luZm8tPmhjaV92ZXJzaW9uKTsKKwkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9CVF9QQVRDSF9WRVIsCisJCQkJICAgJmJ0X3BhdGNoX3Zlcik7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd192ZXIpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIkNvZXhWZXIvIEZ3VmVyLyBQYXRjaFZlciA9ICVkXyV4LyAweCV4LyAweCV4KCVkKVxuIiwKKwkJCSAgZ2xjb2V4X3Zlcl9kYXRlXzgxOTJlXzJhbnQsIGdsY29leF92ZXJfODE5MmVfMmFudCwKKwkJCSAgZndfdmVyLCBidF9wYXRjaF92ZXIsIGJ0X3BhdGNoX3Zlcik7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwl9CisKKyNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzgxOTJFXzJBTlQgPT0gMCkKKwloYWxidGM4MTkyZTJhbnRfcXVlcnlidF9pbmZvKGJ0Y29leGlzdCk7CisJaGFsYnRjODE5MmUyYW50X21vbml0b3JfYnRfY3RyKGJ0Y29leGlzdCk7CisJaGFsYnRjODE5MmUyYW50X21vbml0b3JfYnRfZW5hYmxlX2Rpc2FibGUoYnRjb2V4aXN0KTsKKyNlbHNlCisJaWYgKGhhbGJ0YzgxOTJlMmFudF9pc3dpZmlfc3RhdHVzX2NoYW5nZWQoYnRjb2V4aXN0KSB8fAorCSAgICBjb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0KQorCQloYWxidGM4MTkyZTJhbnRfcnVuX2NvZXhpc3RfbWVjaGFuaXNtKGJ0Y29leGlzdCk7CisjZW5kaWYKK30KKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUyYW50LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEwOWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMmFudC5oCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgVGhlIGZvbGxvd2luZyBpcyBmb3IgODE5MkUgMkFudCBCVCBDby1leGlzdCBkZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMkFOVAkJCTAKKworI2RlZmluZQlCVF9JTkZPXzgxOTJFXzJBTlRfQl9GVFAJCQlCSVQ3CisjZGVmaW5lCUJUX0lORk9fODE5MkVfMkFOVF9CX0EyRFAJCQlCSVQ2CisjZGVmaW5lCUJUX0lORk9fODE5MkVfMkFOVF9CX0hJRAkJCUJJVDUKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8yQU5UX0JfU0NPX0JVU1kJCQlCSVQ0CisjZGVmaW5lCUJUX0lORk9fODE5MkVfMkFOVF9CX0FDTF9CVVNZCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzgxOTJFXzJBTlRfQl9JTlFfUEFHRQkJCUJJVDIKKyNkZWZpbmUJQlRfSU5GT184MTkyRV8yQU5UX0JfU0NPX0VTQ08JCQlCSVQxCisjZGVmaW5lCUJUX0lORk9fODE5MkVfMkFOVF9CX0NPTk5FQ1RJT04JCQlCSVQwCisKKyNkZWZpbmUgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzJBTlQJCTIKKworZW51bSBidF9pbmZvX3NyY184MTkyZV8yYW50eworCUJUX0lORk9fU1JDXzgxOTJFXzJBTlRfV0lGSV9GVwkJCT0gMHgwLAorCUJUX0lORk9fU1JDXzgxOTJFXzJBTlRfQlRfUlNQCQkJPSAweDEsCisJQlRfSU5GT19TUkNfODE5MkVfMkFOVF9CVF9BQ1RJVkVfU0VORAkJPSAweDIsCisJQlRfSU5GT19TUkNfODE5MkVfMkFOVF9NQVgKK307CisKK2VudW0gYnRfODE5MmVfMmFudF9idF9zdGF0dXN7CisJQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFCT0gMHgwLAorCUJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFCQk9IDB4MSwKKwlCVF84MTkyRV8yQU5UX0JUX1NUQVRVU19JTlFfUEFHRQkJPSAweDIsCisJQlRfODE5MkVfMkFOVF9CVF9TVEFUVVNfQUNMX0JVU1kJCT0gMHgzLAorCUJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX1NDT19CVVNZCQk9IDB4NCwKKwlCVF84MTkyRV8yQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kJCT0gMHg1LAorCUJUXzgxOTJFXzJBTlRfQlRfU1RBVFVTX01BWAorfTsKKworZW51bSBidF84MTkyZV8yYW50X2NvZXhfYWxnb3sKKwlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19VTkRFRklORUQJCT0gMHgwLAorCUJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1NDTwkJCT0gMHgxLAorCUJUXzgxOTJFXzJBTlRfQ09FWF9BTEdPX1NDT19QQU4JCQk9IDB4MiwKKwlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19ISUQJCQk9IDB4MywKKwlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19BMkRQCQkJPSAweDQsCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUwkJPSAweDUsCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFORURSCQkJPSAweDYsCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFOSFMJCQk9IDB4NywKKwlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUAkJPSAweDgsCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRAkJPSAweDksCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSCQk9IDB4YSwKKwlCVF84MTkyRV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUAkJPSAweGIsCisJQlRfODE5MkVfMkFOVF9DT0VYX0FMR09fTUFYCQkJPSAweGMKK307CisKK3N0cnVjdCBjb2V4X2RtXzgxOTJlXzJhbnR7CisJLyogZncgbWVjaGFuaXNtICovCisJdTggcHJlX2RlY19idF9wd3I7CisJdTggY3VyX2RlY19idF9wd3I7CisJdTggcHJlX2Z3X2RhY19zd2luZ19sdmw7CisJdTggY3VyX2Z3X2RhY19zd2luZ19sdmw7CisJYm9vbCBjdXJfaWdub3JlX3dsYW5fYWN0OworCWJvb2wgcHJlX2lnbm9yZV93bGFuX2FjdDsKKwl1OCBwcmVfcHNfdGRtYTsKKwl1OCBjdXJfcHNfdGRtYTsKKwl1OCBwc190ZG1hX3BhcmFbNV07CisJdTggcHNfdGRtYV9kdV9hZGpfdHlwZTsKKwlib29sIHJlc2V0X3RkbWFfYWRqdXN0OworCWJvb2wgYXV0b190ZG1hX2FkanVzdDsKKwlib29sIHByZV9wc190ZG1hX29uOworCWJvb2wgY3VyX3BzX3RkbWFfb247CisJYm9vbCBwcmVfYnRfYXV0b19yZXBvcnQ7CisJYm9vbCBjdXJfYnRfYXV0b19yZXBvcnQ7CisKKwkvKiBzdyBtZWNoYW5pc20gKi8KKwlib29sIHByZV9yZl9yeF9scGZfc2hyaW5rOworCWJvb2wgY3VyX3JmX3J4X2xwZl9zaHJpbms7CisJdTMyIGJ0X3JmMHgxZV9iYWNrdXA7CisJYm9vbCBwcmVfbG93X3BlbmFsdHlfcmE7CisJYm9vbCBjdXJfbG93X3BlbmFsdHlfcmE7CisJYm9vbCBwcmVfZGFjX3N3aW5nX29uOworCXUzMiBwcmVfZGFjX3N3aW5nX2x2bDsKKwlib29sIGN1cl9kYWNfc3dpbmdfb247CisJdTMyIGN1cl9kYWNfc3dpbmdfbHZsOworCWJvb2wgcHJlX2FkY19iYWNrX29mZjsKKwlib29sIGN1cl9hZGNfYmFja19vZmY7CisJYm9vbCBwcmVfYWdjX3RhYmxlX2VuOworCWJvb2wgY3VyX2FnY190YWJsZV9lbjsKKwl1MzIgcHJlX3ZhbDB4NmMwOworCXUzMiBjdXJfdmFsMHg2YzA7CisJdTMyIHByZV92YWwweDZjNDsKKwl1MzIgY3VyX3ZhbDB4NmM0OworCXUzMiBwcmVfdmFsMHg2Yzg7CisJdTMyIGN1cl92YWwweDZjODsKKwl1OCBwcmVfdmFsMHg2Y2M7CisJdTggY3VyX3ZhbDB4NmNjOworCWJvb2wgbGltaXRlZF9kaWc7CisKKwl1MzIgYmFja3VwX2FyZnJfY250MTsJLyogQXV0byBSYXRlIEZhbGxiYWNrIFJldHJ5IGNudCAqLworCXUzMiBiYWNrdXBfYXJmcl9jbnQyOwkvKiBBdXRvIFJhdGUgRmFsbGJhY2sgUmV0cnkgY250ICovCisJdTE2IGJhY2t1cF9yZXRyeWxpbWl0OworCXU4IGJhY2t1cF9hbXBkdV9tYXh0aW1lOworCisJLyogYWxnb3JpdGhtIHJlbGF0ZWQgKi8KKwl1OCBwcmVfYWxnb3JpdGhtOworCXU4IGN1cl9hbGdvcml0aG07CisJdTggYnRfc3RhdHVzOworCXU4IHdpZmlfY2hubF9pbmZvWzNdOworCisJdTggcHJlX3NzdHlwZTsKKwl1OCBjdXJfc3N0eXBlOworCisJdTMyIHByZXJhX21hc2s7CisJdTMyIGN1cnJhX21hc2s7CisJdTggY3VycmFfbWFza3R5cGU7CisJdTggcHJlX2FyZnJ0eXBlOworCXU4IGN1cl9hcmZydHlwZTsKKwl1OCBwcmVfcmV0cnlsaW1pdF90eXBlOworCXU4IGN1cl9yZXRyeWxpbWl0X3R5cGU7CisJdTggcHJlX2FtcGR1dGltZV90eXBlOworCXU4IGN1cl9hbXBkdXRpbWVfdHlwZTsKK307CisKK3N0cnVjdCBjb2V4X3N0YV84MTkyZV8yYW50eworCWJvb2wgYnRfbGlua19leGlzdDsKKwlib29sIHNjb19leGlzdDsKKwlib29sIGEyZHBfZXhpc3Q7CisJYm9vbCBoaWRfZXhpc3Q7CisJYm9vbCBwYW5fZXhpc3Q7CisKKwlib29sIHVuZGVyX2xwczsKKwlib29sIHVuZGVyX2lwczsKKwl1MzIgaGlnaF9wcmlvcml0eV90eDsKKwl1MzIgaGlnaF9wcmlvcml0eV9yeDsKKwl1MzIgbG93X3ByaW9yaXR5X3R4OworCXUzMiBsb3dfcHJpb3JpdHlfcng7CisJdTggYnRfcnNzaTsKKwl1OCBwcmVfYnRfcnNzaV9zdGF0ZTsKKwl1OCBwcmVfd2lmaV9yc3NpX3N0YXRlWzRdOworCWJvb2wgYzJoX2J0X2luZm9fcmVxX3NlbnQ7CisJdTggYnRfaW5mb19jMmhbQlRfSU5GT19TUkNfODE5MkVfMkFOVF9NQVhdWzEwXTsKKwl1MzIgYnRfaW5mb19jMmhfY250W0JUX0lORk9fU1JDXzgxOTJFXzJBTlRfTUFYXTsKKwlib29sIGMyaF9idF9pbnF1aXJ5X3BhZ2U7CisJdTggYnRfcmV0cnlfY250OworCXU4IGJ0X2luZm9fZXh0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgIFRoZSBmb2xsb3dpbmcgaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgbm90aWZ5IGNvZXggbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9pbml0X2h3Y29uZmlnKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X2luaXRfY29leF9kbShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9pcHNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKTsKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X2xwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfc2Nhbl9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfY29ubmVjdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfbWVkaWFfc3RhdHVzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4MTkyZTJhbnRfc3BlY2lhbF9wYWNrZXRfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgICB1OCB0eXBlKTsKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X2J0X2luZm9fbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICAgICB1OCAqdG1wQnVmLHU4IGxlbmd0aCk7Cit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9zdGFja19vcGVyYXRpb25fbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgICAgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9oYWx0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4X2hhbGJ0YzgxOTJlMmFudF9wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhfaGFsYnRjODE5MmUyYW50X2Rpc3BsYXlfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYTJhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBkNmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMKQEAgLTAsMCArMSwzNzgwIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyBmaWxlIGlzIGZvciBSVEw4NzIzQSBDby1leGlzdCBtZWNoYW5pc20KKy8vCisvLyBIaXN0b3J5CisvLyAyMDEyLzA4LzIyIENvc2EgZmlyc3QgY2hlY2sgaW4uCisvLyAyMDEyLzExLzE0IENvc2EgUmV2aXNlIGZvciA4NzIzQSAyQW50IG91dCBzb3VyY2luZy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW5jbHVkZSBmaWxlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpbmNsdWRlICJNcF9QcmVjb21wLmgiCisjaWYoQlRfMzBfU1VQUE9SVCA9PSAxKQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEdsb2JhbCB2YXJpYWJsZXMsIHRoZXNlIGFyZSBzdGF0aWMgdmFyaWFibGVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIENPRVhfRE1fODcyM0FfMkFOVAlHTENvZXhEbTg3MjNhMkFudDsKK3N0YXRpYyBQQ09FWF9ETV84NzIzQV8yQU5UIAlwQ29leERtPSZHTENvZXhEbTg3MjNhMkFudDsKK3N0YXRpYyBDT0VYX1NUQV84NzIzQV8yQU5UCUdMQ29leFN0YTg3MjNhMkFudDsKK3N0YXRpYyBQQ09FWF9TVEFfODcyM0FfMkFOVAlwQ29leFN0YT0mR0xDb2V4U3RhODcyM2EyQW50OworCitjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzg3MjNhMkFudFtdPXsKKwkiQlQgSW5mb1t3aWZpIGZ3XSIsCisJIkJUIEluZm9bYnQgcnNwXSIsCisJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0Yzg3MjNhMmFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitCT09MRUFOCitoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJQk9PTEVBTgkJYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYlJvYW09RkFMU0U7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CisKKwlpZihiV2lmaUNvbm5lY3RlZCkKKwkJcmV0dXJuIEZBTFNFOworCWlmKGJTY2FuKQorCQlyZXR1cm4gRkFMU0U7CisJaWYoYkxpbmspCisJCXJldHVybiBGQUxTRTsKKwlpZihiUm9hbSkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIHRydWU7Cit9CisKK3UxQnl0ZQoraGFsYnRjODcyM2EyYW50X0J0UnNzaVN0YXRlKAorCXUxQnl0ZQkJCWxldmVsTnVtLAorCXUxQnl0ZQkJCXJzc2lUaHJlc2gsCisJdTFCeXRlCQkJcnNzaVRocmVzaDEKKwkpCit7CisJczRCeXRlCQkJYnRSc3NpPTA7CisJdTFCeXRlCQkJYnRSc3NpU3RhdGU9cENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOworCisJYnRSc3NpID0gcENvZXhTdGEtPmJ0UnNzaTsKKworCWlmKGxldmVsTnVtID09IDIpCisJewkJCQorCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQV8yQU5UKSkKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidFJzc2kgPCByc3NpVGhyZXNoKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKGxldmVsTnVtID09IDMpCisJeworCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHRocmVzaCBlcnJvciEhXG4iKSk7CisJCQlyZXR1cm4gcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOworCQl9CisJCQorCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQV8yQU5UKSkKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIChwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCisJCXsKKwkJCWlmKGJ0UnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfQorCQkJZWxzZSBpZihidFJzc2kgPCByc3NpVGhyZXNoKQorCQkJeworCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidFJzc2kgPCByc3NpVGhyZXNoMSkKKwkJCXsKKwkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisJCQorCXBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9IGJ0UnNzaVN0YXRlOworCisJcmV0dXJuIGJ0UnNzaVN0YXRlOworfQorCit1MUJ5dGUKK2hhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQlpbmRleCwKKwlJTgl1MUJ5dGUJCQlsZXZlbE51bSwKKwlJTgl1MUJ5dGUJCQlyc3NpVGhyZXNoLAorCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gxCisJKQoreworCXM0Qnl0ZQkJCXdpZmlSc3NpPTA7CisJdTFCeXRlCQkJd2lmaVJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOworCQorCWlmKGxldmVsTnVtID09IDIpCisJeworCQlpZiggKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKKwkJeworCQkJaWYod2lmaVJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaCkKKwkJCXsKKwkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihsZXZlbE51bSA9PSAzKQorCXsKKwkJaWYocnNzaVRocmVzaCA+IHJzc2lUaHJlc2gxKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgdGhyZXNoIGVycm9yISFcbiIpKTsKKwkJCXJldHVybiBwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CisJCX0KKwkJCisJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQorCQl7CisJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0FfMkFOVCkpCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKQorCQl7CisJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfQorCQkJZWxzZSBpZih3aWZpUnNzaSA8IHJzc2lUaHJlc2gpCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaDEpCisJCQl7CisJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOworCQkJfQorCQl9CisJfQorCQkKKwlwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPSB3aWZpUnNzaVN0YXRlOworCisJcmV0dXJuIHdpZmlSc3NpU3RhdGU7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9JbmRpY2F0ZVdpZmlDaG5sQndJbmZvKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclszXSA9ezB9OworCXU0Qnl0ZQkJCXdpZmlCdzsKKwl1MUJ5dGUJCQl3aWZpQ2VudHJhbENobmw7CisJCisJLy8gb25seSAyLjRHIHdlIG5lZWQgdG8gaW5mb3JtIGJ0IHRoZSBjaG5sIG1hc2sKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9DRU5UUkFMX0NITkwsICZ3aWZpQ2VudHJhbENobmwpOworCWlmKCAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkgJiYKKwkJKHdpZmlDZW50cmFsQ2hubCA8PSAxNCkgKQorCXsKKwkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKKwkJSDJDX1BhcmFtZXRlclsxXSA9IHdpZmlDZW50cmFsQ2hubDsKKwkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCQlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwkJCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDMwOworCQllbHNlCisJCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgyMDsKKwl9CisJCQorCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSA9IEgyQ19QYXJhbWV0ZXJbMF07CisJcENvZXhEbS0+d2lmaUNobmxJbmZvWzFdID0gSDJDX1BhcmFtZXRlclsxXTsKKwlwQ29leERtLT53aWZpQ2hubEluZm9bMl0gPSBIMkNfUGFyYW1ldGVyWzJdOworCQorCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDE5PTB4JXhcbiIsIAorCQlIMkNfUGFyYW1ldGVyWzBdPDwxNnxIMkNfUGFyYW1ldGVyWzFdPDw4fEgyQ19QYXJhbWV0ZXJbMl0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDE5LCAzLCBIMkNfUGFyYW1ldGVyKTsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1F1ZXJ5QnRJbmZvKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CisKKwlwQ29leFN0YS0+YkMyaEJ0SW5mb1JlcVNlbnQgPSB0cnVlOworCisJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQwOwkvLyB0cmlnZ2VyCisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHgzOD0weCV4XG4iLCAKKwkJSDJDX1BhcmFtZXRlclswXSkpOworCisJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MzgsIDEsIEgyQ19QYXJhbWV0ZXIpOworfQordTFCeXRlCitoYWxidGM4NzIzYTJhbnRfQWN0aW9uQWxnb3JpdGhtKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CisJQk9PTEVBTgkJCQliQnRIc09uPUZBTFNFLCBiQnRCdXN5PUZBTFNFLCBsaW1pdGVkX2RpZz1GQUxTRTsKKwl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKKwl1MUJ5dGUJCQkJbnVtT2ZEaWZmUHJvZmlsZT0wOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCisJLy89PT09PT09PT09PT09PT09PT09PT09CisJLy8gaGVyZSB3ZSBnZXQgQlQgc3RhdHVzIGZpcnN0CisJLy89PT09PT09PT09PT09PT09PT09PT09CisJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFOworCQorCWlmKChwU3RhY2tJbmZvLT5iU2NvRXhpc3QpIHx8KGJCdEhzT24pIHx8KHBTdGFja0luZm8tPmJIaWRFeGlzdCkpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvciBISUQgb3IgSFMgZXhpc3RzLCBzZXQgQlQgbm9uLWlkbGUgISEhXG4iKSk7CisJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CisJfQorCWVsc2UKKwl7CisJCS8vIEEyZHAgcHJvZmlsZQorCQlpZiggKHBCdENvZXhpc3QtPnN0YWNrX2luZm8ubnVtT2ZMaW5rID09IDEpICYmCisJCQkocFN0YWNrSW5mby0+YkEyZHBFeGlzdCkgKQorCQl7CQkKKwkJCWlmKCAocENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4KSA8IDEwMCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAsIGxvdyBwcmlvcml0eSB0eCtyeCA8IDEwMCwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7CisJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAsIGxvdyBwcmlvcml0eSB0eCtyeCA+PSAxMDAsIHNldCBCVCBub24taWRsZSEhIVxuIikpOworCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CisJCQl9CisJCX0KKwkJLy8gUGFuIHByb2ZpbGUKKwkJaWYoIChwQnRDb2V4aXN0LT5zdGFja19pbmZvLm51bU9mTGluayA9PSAxKSAmJgorCQkJKHBTdGFja0luZm8tPmJQYW5FeGlzdCkgKQorCQl7CQkKKwkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBsb3cgcHJpb3JpdHkgdHgrcnggPCA2MDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOworCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYocENvZXhTdGEtPmxvd1ByaW9yaXR5VHgpCisJCQkJeworCQkJCQlpZigocENvZXhTdGEtPmxvd1ByaW9yaXR5UnggL3BDb2V4U3RhLT5sb3dQcmlvcml0eVR4KT45ICkKKwkJCQkJeworCQkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4sIGxvdyBwcmlvcml0eSByeC90eCA+IDksIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOworCQkJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKKwkJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOworCQkJfQorCQl9CisJCS8vIFBhbitBMmRwIHByb2ZpbGUKKwkJaWYoIChwQnRDb2V4aXN0LT5zdGFja19pbmZvLm51bU9mTGluayA9PSAyKSAmJgorCQkJKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpICYmCisJCQkocFN0YWNrSW5mby0+YlBhbkV4aXN0KSApCisJCXsKKwkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOK0EyRFAsIGxvdyBwcmlvcml0eSB0eCtyeCA8IDYwMCwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7CisJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihwQ29leFN0YS0+bG93UHJpb3JpdHlUeCkKKwkJCQl7CisJCQkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlSeCAvcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgpPjkgKQorCQkJCQl7CisJCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBsb3cgcHJpb3JpdHkgcngvdHggPiA5LCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKKwkJCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZihCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSAhPSBwQ29leERtLT5idFN0YXR1cykKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKKwkJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOworCQkJfQorCQl9CisJfQorCWlmKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0lETEUgIT0gcENvZXhEbS0+YnRTdGF0dXMpCisJeworCQliQnRCdXN5ID0gdHJ1ZTsKKwkJbGltaXRlZF9kaWcgPSB0cnVlOworCX0KKwllbHNlCisJeworCQliQnRCdXN5ID0gRkFMU0U7CisJCWxpbWl0ZWRfZGlnID0gRkFMU0U7CisJfQorCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9UUkFGRklDX0JVU1ksICZiQnRCdXN5KTsKKwlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfTElNSVRFRF9ESUcsICZsaW1pdGVkX2RpZyk7CisJLy89PT09PT09PT09PT09PT09PT09PT09CisKKwlpZighcFN0YWNrSW5mby0+YkJ0TGlua0V4aXN0KQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOworCQlyZXR1cm4gYWxnb3JpdGhtOworCX0KKworCWlmKHBTdGFja0luZm8tPmJTY29FeGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmKHBTdGFja0luZm8tPmJQYW5FeGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCWlmKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpCisJCW51bU9mRGlmZlByb2ZpbGUrKzsKKwkKKwlpZihudW1PZkRpZmZQcm9maWxlID09IDEpCisJeworCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPIG9ubHlcbiIpKTsKKwkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEOworCQkJfQorCQkJZWxzZSBpZihwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCBvbmx5XG4iKSk7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUDsKKwkJCX0KKwkJCWVsc2UgaWYocFN0YWNrSW5mby0+YlBhbkV4aXN0KQorCQkJeworCQkJCWlmKGJCdEhzT24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihIUykgb25seVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5IUzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oRURSKSBvbmx5XG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID09IDIpCisJeworCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCisJCXsKKwkJCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRFxuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDsKKwkJCX0KKwkJCWVsc2UgaWYocFN0YWNrSW5mby0+YkEyZHBFeGlzdCkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgPT0+IFNDT1xuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzsKKwkJCX0KKwkJCWVsc2UgaWYocFN0YWNrSW5mby0+YlBhbkV4aXN0KQorCQkJeworCQkJCWlmKGJCdEhzT24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fU0NPOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIHBTdGFja0luZm8tPmJIaWRFeGlzdCAmJgorCQkJCXBTdGFja0luZm8tPmJBMmRwRXhpc3QgKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOworCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJfQorCQkJZWxzZSBpZiggcFN0YWNrSW5mby0+YkhpZEV4aXN0ICYmCisJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCisJCQkJcFN0YWNrSW5mby0+YkEyZHBFeGlzdCApCisJCQl7CisJCQkJaWYoYkJ0SHNPbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEVEUilcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA9PSAzKQorCXsKKwkJaWYocFN0YWNrSW5mby0+YlNjb0V4aXN0KQorCQl7CisJCQlpZiggcFN0YWNrSW5mby0+YkhpZEV4aXN0ICYmCisJCQkJcFN0YWNrSW5mby0+YkEyZHBFeGlzdCApCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9CisJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKKwkJCQlwU3RhY2tJbmZvLT5iUGFuRXhpc3QgKQorCQkJeworCQkJCWlmKGJCdEhzT24pCisJCQkJeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgUEFOKEVEUilcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iUGFuRXhpc3QgJiYKKwkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQICsgUEFOKEhTKVxuIikpOworCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19TQ087CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiggcFN0YWNrSW5mby0+YkhpZEV4aXN0ICYmCisJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCisJCQkJcFN0YWNrSW5mby0+YkEyZHBFeGlzdCApCisJCQl7CisJCQkJaWYoYkJ0SHNPbikKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID49IDMpCisJeworCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCisJCXsKKwkJCWlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKKwkJCQlwU3RhY2tJbmZvLT5iUGFuRXhpc3QgJiYKKwkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKKwkJCXsKKwkJCQlpZihiQnRIc09uKQorCQkJCXsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgQTJEUCArIFBBTihFRFIpPT0+UEFOKEVEUikrSElEXG4iKSk7CisJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGFsZ29yaXRobTsKK30KKworQk9PTEVBTgoraGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlCT09MRUFOCQliUmV0PUZBTFNFOworCUJPT0xFQU4JCWJCdEhzT249RkFMU0UsIGJXaWZpQ29ubmVjdGVkPUZBTFNFOworCXM0Qnl0ZQkJYnRIc1Jzc2k9MDsKKworCWlmKCFwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbikpCisJCXJldHVybiBGQUxTRTsKKwlpZighcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpKQorCQlyZXR1cm4gRkFMU0U7CisJaWYoIXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRIc1Jzc2kpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZihiV2lmaUNvbm5lY3RlZCkKKwl7CisJCWlmKGJCdEhzT24pCisJCXsKKwkJCWlmKGJ0SHNSc3NpID4gMzcpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKKwkJCQliUmV0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgV2lmaSBpcyBjb25uZWN0ZWQhIVxuIikpOworCQkJYlJldCA9IHRydWU7CisJCX0KKwl9CisJCisJcmV0dXJuIGJSZXQ7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9TZXRGd0RhY1N3aW5nTGV2ZWwoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCWRhY1N3aW5nTHZsCisJKQoreworCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKKworCS8vIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKKwkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKKwlIMkNfUGFyYW1ldGVyWzBdID0gZGFjU3dpbmdMdmw7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNTd2luZ0x2bCkpOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDI5PTB4JXhcbiIsIEgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDI5LCAxLCBIMkNfUGFyYW1ldGVyKTsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1NldEZ3RGVjQnRQd3IoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRGVjQnRQd3IKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OworCQorCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOworCisJaWYoYkRlY0J0UHdyKQorCXsKKwkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQxOworCX0KKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBkZWNyZWFzZSBCdCBQb3dlciA6ICVzLCBGVyB3cml0ZSAweDIxPTB4JXhcbiIsIAorCQkoYkRlY0J0UHdyPyAiWWVzISEiOiJObyEhIiksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKKworCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDIxLCAxLCBIMkNfUGFyYW1ldGVyKTsJCit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JQk9PTEVBTgkJCWJEZWNCdFB3cgorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIERlYyBCVCBwb3dlciA9ICVzXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKChiRGVjQnRQd3IpPyAiT04iOiJPRkYiKSkpOworCXBDb2V4RG0tPmJDdXJEZWNCdFB3ciA9IGJEZWNCdFB3cjsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZURlY0J0UHdyPSVkLCBiQ3VyRGVjQnRQd3I9JWRcbiIsIAorCQkJcENvZXhEbS0+YlByZURlY0J0UHdyLCBwQ29leERtLT5iQ3VyRGVjQnRQd3IpKTsKKworCQlpZihwQ29leERtLT5iUHJlRGVjQnRQd3IgPT0gcENvZXhEbS0+YkN1ckRlY0J0UHdyKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2EyYW50X1NldEZ3RGVjQnRQd3IocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckRlY0J0UHdyKTsKKworCXBDb2V4RG0tPmJQcmVEZWNCdFB3ciA9IHBDb2V4RG0tPmJDdXJEZWNCdFB3cjsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCXUxQnl0ZQkJCWZ3RGFjU3dpbmdMdmwKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd0RhY1N3aW5nTHZsKSk7CisJcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCA9IGZ3RGFjU3dpbmdMdmw7CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZUZ3RGFjU3dpbmdMdmw9JWQsIGN1ckZ3RGFjU3dpbmdMdmw9JWRcbiIsIAorCQkJcENvZXhEbS0+cHJlRndEYWNTd2luZ0x2bCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkpOworCisJCWlmKHBDb2V4RG0tPnByZUZ3RGFjU3dpbmdMdmwgPT0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkgCisJCQlyZXR1cm47CisJfQorCisJaGFsYnRjODcyM2EyYW50X1NldEZ3RGFjU3dpbmdMZXZlbChwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsKTsKKworCXBDb2V4RG0tPnByZUZ3RGFjU3dpbmdMdmwgPSBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYlJ4UmZTaHJpbmtPbgorCSkKK3sKKwlpZihiUnhSZlNocmlua09uKQorCXsKKwkJLy9TaHJpbmsgUkYgUnggTFBGIGNvcm5lcgorCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIhIVxuIikpOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgMHhmMGZmNyk7CisJfQorCWVsc2UKKwl7CisJCS8vUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIKKwkJLy8gQWZ0ZXIgaW5pdGlhbGl6ZWQsIHdlIGNhbiB1c2UgcENvZXhEbS0+YnRSZjB4MWVCYWNrdXAKKwkJaWYocEJ0Q29leGlzdC0+aW5pdGlsaXplZCkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCBwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CisJCX0KKwl9Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9SZlNocmluaygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKChiUnhSZlNocmlua09uKT8gIk9OIjoiT0ZGIikpKTsKKwlwQ29leERtLT5iQ3VyUmZSeExwZlNocmluayA9IGJSeFJmU2hyaW5rT247CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCBiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwgCisJCQlwQ29leERtLT5iUHJlUmZSeExwZlNocmluaywgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspKTsKKworCQlpZihwQ29leERtLT5iUHJlUmZSeExwZlNocmluayA9PSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykgCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd1JmUnhMcGZDb3JuZXIocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspOworCisJcENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmsgPSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluazsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkxvd1BlbmFsdHlSYQorCSkKK3sKKwl1MUJ5dGUJdG1wVTE7CisKKwl0bXBVMSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkKTsKKwl0bXBVMSB8PSBCSVQwOworCWlmKGJMb3dQZW5hbHR5UmEpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IGxvdyBwZW5hbHR5ISFcbiIpKTsKKwkJdG1wVTEgJj0gfkJJVDI7CisJfQorCWVsc2UKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBUeCByYXRlIGFkYXB0aXZlLCBzZXQgbm9ybWFsISFcbiIpKTsKKwkJdG1wVTEgfD0gQklUMjsKKwl9CisKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQsIHRtcFUxKTsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKKwkpCit7CisJcmV0dXJuOworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBMb3dQZW5hbHR5UkEgPSAlc1xuIiwgIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkxvd1BlbmFsdHlSYSk/ICJPTiI6Ik9GRiIpKSk7CisJcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVMb3dQZW5hbHR5UmE9JWQsIGJDdXJMb3dQZW5hbHR5UmE9JWRcbiIsIAorCQkJcENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSwgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSkpOworCisJCWlmKHBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPT0gcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSkgCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZShwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhKTsKKworCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYlN3RGFjU3dpbmdPbiwKKwlJTgl1NEJ5dGUJCQlzd0RhY1N3aW5nTHZsCisJKQoreworCWlmKGJTd0RhY1N3aW5nT24pCisJeworCQlwQnRDb2V4aXN0LT5idGNfc2V0QmJSZWcocEJ0Q29leGlzdCwgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3RGFjU3dpbmdMdmwpOworCX0KKwllbHNlCisJeworCQlwQnRDb2V4aXN0LT5idGNfc2V0QmJSZWcocEJ0Q29leGlzdCwgMHg4ODAsIDB4ZmYwMDAwMDAsIDB4YzApOworCX0KK30KKworCitWT0lECitoYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliRGFjU3dpbmdPbiwKKwlJTgl1NEJ5dGUJCQlkYWNTd2luZ0x2bAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gRGFjU3dpbmc9JXMsIGRhY1N3aW5nTHZsPTB4JXhcbiIsICAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJEYWNTd2luZ09uKT8gIk9OIjoiT0ZGIiksIGRhY1N3aW5nTHZsKSk7CisJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24gPSBiRGFjU3dpbmdPbjsKKwlwQ29leERtLT5jdXJEYWNTd2luZ0x2bCA9IGRhY1N3aW5nTHZsOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwgYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsIAorCQkJcENvZXhEbS0+YlByZURhY1N3aW5nT24sIHBDb2V4RG0tPnByZURhY1N3aW5nTHZsLAorCQkJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24sIHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsKSk7CisKKwkJaWYoIChwQ29leERtLT5iUHJlRGFjU3dpbmdPbiA9PSBwQ29leERtLT5iQ3VyRGFjU3dpbmdPbikgJiYKKwkJCShwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9PSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkgKQorCQkJcmV0dXJuOworCX0KKwltZGVsYXkoMzApOworCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocEJ0Q29leGlzdCwgYkRhY1N3aW5nT24sIGRhY1N3aW5nTHZsKTsKKworCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT247CisJcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bDsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1NldEFkY0JhY2tPZmYoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliQWRjQmFja09mZgorCSkKK3sKKwlpZihiQWRjQmFja09mZikKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9uIVxuIikpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsMHgzYTA3NjExKTsKKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT2ZmIVxuIikpOwkJCisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGMwNCwweDNhMDU2MTEpOworCX0KK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliQWRjQmFja09mZgorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gQWRjQmFja09mZiA9ICVzXG4iLCAgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKChiQWRjQmFja09mZik/ICJPTiI6Ik9GRiIpKSk7CisJcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYgPSBiQWRjQmFja09mZjsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUFkY0JhY2tPZmY9JWQsIGJDdXJBZGNCYWNrT2ZmPSVkXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVBZGNCYWNrT2ZmLCBwQ29leERtLT5iQ3VyQWRjQmFja09mZikpOworCisJCWlmKHBDb2V4RG0tPmJQcmVBZGNCYWNrT2ZmID09IHBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2EyYW50X1NldEFkY0JhY2tPZmYocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpOworCisJcENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPSBwQ29leERtLT5iQ3VyQWRjQmFja09mZjsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1NldEFnY1RhYmxlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KKwkpCit7CisJdTFCeXRlCQlyc3NpQWRqdXN0VmFsPTA7CisKKwlpZihiQWdjVGFibGVFbikKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT24hXG4iKSk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDRlMWMwMDAxKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGQxZDAwMDEpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg0YzFlMDAwMSk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDRiMWYwMDAxKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGEyMDAwMDEpOworCQkKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4ZGMwMDApOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHg5MDAwMCk7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDUxMDAwKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4MTIwMDApOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxYSwgMHhmZmZmZiwgMHgwMDM1NSk7CisJCQorCQlyc3NpQWRqdXN0VmFsID0gNjsKKwl9CisJZWxzZQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDY0MWMwMDAxKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjMxZDAwMDEpOworCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg2MjFlMDAwMSk7CisJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDYxMWYwMDAxKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjAyMDAwMDEpOworCisJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDMyMDAwKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4NzEwMDApOworCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHhiMDAwMCk7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweGZjMDAwKTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWEsIDB4ZmZmZmYsIDB4MzAzNTUpOworCX0KKworCS8vIHNldCByc3NpQWRqdXN0VmFsIGZvciB3aWZpIG1vZHVsZS4KKwlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpQWRqdXN0VmFsKTsKK30KKworCitWT0lECitoYWxidGM4NzIzYTJhbnRfQWdjVGFibGUoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAorCUlOCUJPT0xFQU4JCQliQWdjVGFibGVFbgorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzICVzIEFnYyBUYWJsZVxuIiwgIAorCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFnY1RhYmxlRW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CisJcENvZXhEbS0+YkN1ckFnY1RhYmxlRW4gPSBiQWdjVGFibGVFbjsKKworCWlmKCFiRm9yY2VFeGVjKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUFnY1RhYmxlRW49JWQsIGJDdXJBZ2NUYWJsZUVuPSVkXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikpOworCisJCWlmKHBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuID09IHBDb2V4RG0tPmJDdXJBZ2NUYWJsZUVuKSAKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2EyYW50X1NldEFnY1RhYmxlKHBCdENvZXhpc3QsIGJBZ2NUYWJsZUVuKTsKKworCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuID0gcENvZXhEbS0+YkN1ckFnY1RhYmxlRW47Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9TZXRDb2V4VGFibGUoCisJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCisJSU4JdTRCeXRlCQl2YWwweDZjMCwKKwlJTgl1NEJ5dGUJCXZhbDB4NmM4LAorCUlOCXUxQnl0ZQkJdmFsMHg2Y2MKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzA9MHgleFxuIiwgdmFsMHg2YzApKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzAsIHZhbDB4NmMwKTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4PTB4JXhcbiIsIHZhbDB4NmM4KSk7CisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4LCB2YWwweDZjOCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjYz0weCV4XG4iLCB2YWwweDZjYykpOworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDZjYywgdmFsMHg2Y2MpOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTgl1NEJ5dGUJCQl2YWwweDZjMCwKKwlJTgl1NEJ5dGUJCQl2YWwweDZjOCwKKwlJTgl1MUJ5dGUJCQl2YWwweDZjYworCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCisJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgdmFsMHg2YzAsIHZhbDB4NmM4LCB2YWwweDZjYykpOworCXBDb2V4RG0tPmN1clZhbDB4NmMwID0gdmFsMHg2YzA7CisJcENvZXhEbS0+Y3VyVmFsMHg2YzggPSB2YWwweDZjODsKKwlwQ29leERtLT5jdXJWYWwweDZjYyA9IHZhbDB4NmNjOworCisJaWYoIWJGb3JjZUV4ZWMpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLCAKKwkJCXBDb2V4RG0tPnByZVZhbDB4NmMwLCBwQ29leERtLT5wcmVWYWwweDZjOCwgcENvZXhEbS0+cHJlVmFsMHg2Y2MpKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgY3VyVmFsMHg2YzA9MHgleCwgY3VyVmFsMHg2Yzg9MHgleCwgY3VyVmFsMHg2Y2M9MHgleCAhIVxuIiwgCisJCQlwQ29leERtLT5jdXJWYWwweDZjMCwgcENvZXhEbS0+Y3VyVmFsMHg2YzgsIHBDb2V4RG0tPmN1clZhbDB4NmNjKSk7CisJCisJCWlmKCAocENvZXhEbS0+cHJlVmFsMHg2YzAgPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzApICYmCisJCQkocENvZXhEbS0+cHJlVmFsMHg2YzggPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzgpICYmCisJCQkocENvZXhEbS0+cHJlVmFsMHg2Y2MgPT0gcENvZXhEbS0+Y3VyVmFsMHg2Y2MpICkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2EyYW50X1NldENvZXhUYWJsZShwQnRDb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKTsKKworCXBDb2V4RG0tPnByZVZhbDB4NmMwID0gcENvZXhEbS0+Y3VyVmFsMHg2YzA7CisJcENvZXhEbS0+cHJlVmFsMHg2YzggPSBwQ29leERtLT5jdXJWYWwweDZjODsKKwlwQ29leERtLT5wcmVWYWwweDZjYyA9IHBDb2V4RG0tPmN1clZhbDB4NmNjOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfU2V0RndJZ25vcmVXbGFuQWN0KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkVuYWJsZQorCSkKK3sKKwl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CisJCQorCWlmKGJFbmFibGUpCisJeworCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CQkvLyBmdW5jdGlvbiBlbmFibGUKKwl9CisJCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBGVyBmb3IgQlQgSWdub3JlIFdsYW5fQWN0LCBGVyB3cml0ZSAweDI1PTB4JXhcbiIsIAorCQlIMkNfUGFyYW1ldGVyWzBdKSk7CisKKwlwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgyNSwgMSwgSDJDX1BhcmFtZXRlcik7CQorfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCisJSU4JQk9PTEVBTgkJCWJFbmFibGUKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLCAKKwkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoYkVuYWJsZT8gIk9OIjoiT0ZGIikpKTsKKwlwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVJZ25vcmVXbGFuQWN0ID0gJWQsIGJDdXJJZ25vcmVXbGFuQWN0ID0gJWQhIVxuIiwgCisJCQlwQ29leERtLT5iUHJlSWdub3JlV2xhbkFjdCwgcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3QpKTsKKworCQlpZihwQ29leERtLT5iUHJlSWdub3JlV2xhbkFjdCA9PSBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2EyYW50X1NldEZ3SWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBiRW5hYmxlKTsKKworCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID0gcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3Q7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJYnl0ZTEsCisJSU4JdTFCeXRlCQkJYnl0ZTIsCisJSU4JdTFCeXRlCQkJYnl0ZTMsCisJSU4JdTFCeXRlCQkJYnl0ZTQsCisJSU4JdTFCeXRlCQkJYnl0ZTUKKwkpCit7CisJdTFCeXRlCQkJSDJDX1BhcmFtZXRlcls1XSA9ezB9OworCisJSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwkKKwlIMkNfUGFyYW1ldGVyWzFdID0gYnl0ZTI7CQorCUgyQ19QYXJhbWV0ZXJbMl0gPSBieXRlMzsKKwlIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CisJSDJDX1BhcmFtZXRlcls0XSA9IGJ5dGU1OworCisJcENvZXhEbS0+cHNUZG1hUGFyYVswXSA9IGJ5dGUxOworCXBDb2V4RG0tPnBzVGRtYVBhcmFbMV0gPSBieXRlMjsKKwlwQ29leERtLT5wc1RkbWFQYXJhWzJdID0gYnl0ZTM7CisJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OworCXBDb2V4RG0tPnBzVGRtYVBhcmFbNF0gPSBieXRlNTsKKwkKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKKwkJSDJDX1BhcmFtZXRlclswXSwgCisJCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOworCisJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4M2EsIDUsIEgyQ19QYXJhbWV0ZXIpOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfUHNUZG1hKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKKwlJTglCT09MRUFOCQkJYlR1cm5PbiwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKQoreworCXU0Qnl0ZQlidFR4UnhDbnQ9MDsKKworCWJ0VHhSeENudCA9IHBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCtwQ29leFN0YS0+aGlnaFByaW9yaXR5UngrCisJCQkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrcENvZXhTdGEtPmxvd1ByaW9yaXR5Ung7CisKKwlpZihidFR4UnhDbnQgPiAzMDAwKQorCXsJCQorCQlwQ29leERtLT5iQ3VyUHNUZG1hT24gPSB0cnVlOworCQlwQ29leERtLT5jdXJQc1RkbWEgPSA4OworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIHR1cm4gT04gUFMgVERNQSwgdHlwZT0lZCBmb3IgQlQgdHgvcnggY291bnRlcnM9JWQoPjMwMDApXG4iLCAKKwkJCXBDb2V4RG0tPmN1clBzVGRtYSwgYnRUeFJ4Q250KSk7CisJfQorCWVsc2UKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgdHVybiAlcyBQUyBURE1BLCB0eXBlPSVkXG4iLCAKKwkJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJUdXJuT24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7CQkKKwkJcENvZXhEbS0+YkN1clBzVGRtYU9uID0gYlR1cm5PbjsKKwkJcENvZXhEbS0+Y3VyUHNUZG1hID0gdHlwZTsKKwl9CisKKwlpZighYkZvcmNlRXhlYykKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVQc1RkbWFPbiA9ICVkLCBiQ3VyUHNUZG1hT24gPSAlZCEhXG4iLCAKKwkJCXBDb2V4RG0tPmJQcmVQc1RkbWFPbiwgcENvZXhEbS0+YkN1clBzVGRtYU9uKSk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZVBzVGRtYSA9ICVkLCBjdXJQc1RkbWEgPSAlZCEhXG4iLCAKKwkJCXBDb2V4RG0tPnByZVBzVGRtYSwgcENvZXhEbS0+Y3VyUHNUZG1hKSk7CisKKwkJaWYoIChwQ29leERtLT5iUHJlUHNUZG1hT24gPT0gcENvZXhEbS0+YkN1clBzVGRtYU9uKSAmJgorCQkJKHBDb2V4RG0tPnByZVBzVGRtYSA9PSBwQ29leERtLT5jdXJQc1RkbWEpICkKKwkJCXJldHVybjsKKwl9CQorCWlmKHBDb2V4RG0tPmJDdXJQc1RkbWFPbikKKwl7CisJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCisJCXsKKwkJCWNhc2UgMToKKwkJCWRlZmF1bHQ6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4ZTEsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDEyLCAweDEyLCAweGUxLCAweDk4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweGEsIDB4ZTEsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGEzLCAweDUsIDB4NSwgMHhlMSwgMHg4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4NjAsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDEyLCAweDEyLCAweDYwLCAweDk4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweGEsIDB4NjAsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSA4OiAKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhhMywgMHg1LCAweDUsIDB4NjAsIDB4ODApOworCQkJCWJyZWFrOworCQkJY2FzZSA5OiAKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHhlMSwgMHg5OCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgkKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxMiwgMHgxMiwgMHhlMSwgMHg5OCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDExOgkKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweGEsIDB4ZTEsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHg1LCAweDUsIDB4ZTEsIDB4OTgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMzoKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHg2MCwgMHg5OCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE0OgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDEyLCAweDEyLCAweDYwLCAweDk4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4YSwgMHhhLCAweDYwLCAweDk4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4NSwgMHg1LCAweDYwLCAweDk4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTc6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4MmYsIDB4MmYsIDB4NjAsIDB4ODApOworCQkJCWJyZWFrOworCQkJY2FzZSAxODoKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHg1LCAweDUsIDB4ZTEsIDB4OTgpOworCQkJCWJyZWFrOwkJCQorCQkJY2FzZSAxOToKKwkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgyNSwgMHgyNSwgMHhlMSwgMHg5OCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIwOgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDI1LCAweDI1LCAweDYwLCAweDk4KTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBkaXNhYmxlIFBTIHRkbWEKKwkJc3dpdGNoKHBDb2V4RG0tPmN1clBzVGRtYSkKKwkJeworCQkJY2FzZSAwOgorCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwcmUgc3RhdGUKKwlwQ29leERtLT5iUHJlUHNUZG1hT24gPSBwQ29leERtLT5iQ3VyUHNUZG1hT247CisJcENvZXhEbS0+cHJlUHNUZG1hID0gcENvZXhEbS0+Y3VyUHNUZG1hOworfQorCisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9Db2V4QWxsT2ZmKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwkvLyBmdyBhbGwgb2ZmCisJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOworCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCisJLy8gc3cgYWxsIG9mZgorCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCisJLy8gaHcgYWxsIG9mZgorCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCS8vIGZvcmNlIHRvIHJlc2V0IGNvZXggbWVjaGFuaXNtCisJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMCk7CisJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMHgyMCk7CisJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CisKKwloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMHhjMCk7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9CdElucXVpcnlQYWdlKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlCT09MRUFOCWJMb3dQd3JEaXNhYmxlPXRydWU7CisJCisJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwgJmJMb3dQd3JEaXNhYmxlKTsKKworCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfQnRFbmFibGVBY3Rpb24oCisJSU4gCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRTsKKwkKKwkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCisJLy8gYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4JCQkJCQkKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CisJaWYoYldpZmlDb25uZWN0ZWQpCisJeworCQloYWxidGM4NzIzYTJhbnRfSW5kaWNhdGVXaWZpQ2hubEJ3SW5mbyhwQnRDb2V4aXN0LCBCVENfTUVESUFfQ09OTkVDVCk7CisJfQorCWVsc2UKKwl7CisJCWhhbGJ0Yzg3MjNhMmFudF9JbmRpY2F0ZVdpZmlDaG5sQndJbmZvKHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKKwl9CisKKwloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQnRDdHIoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXU0Qnl0ZSAJCQlyZWdIUFR4UngsIHJlZ0xQVHhSeCwgdTRUbXA7CisJdTRCeXRlCQkJcmVnSFBUeD0wLCByZWdIUFJ4PTAsIHJlZ0xQVHg9MCwgcmVnTFBSeD0wOworCXUxQnl0ZQkJCXUxVG1wOworCQorCXJlZ0hQVHhSeCA9IDB4NzcwOworCXJlZ0xQVHhSeCA9IDB4Nzc0OworCisJdTRUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCByZWdIUFR4UngpOworCXJlZ0hQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKKwlyZWdIUFJ4ID0gKHU0VG1wICYgTUFTS0hXT1JEKT4+MTY7CisKKwl1NFRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIHJlZ0xQVHhSeCk7CisJcmVnTFBUeCA9IHU0VG1wICYgTUFTS0xXT1JEOworCXJlZ0xQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKKwkJCisJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4ID0gcmVnSFBUeDsKKwlwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPSByZWdIUFJ4OworCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKKwlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCA9IHJlZ0xQUng7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgSGlnaCBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKKwkJcmVnSFBUeFJ4LCByZWdIUFR4LCByZWdIUFR4LCByZWdIUFJ4LCByZWdIUFJ4KSk7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKKwkJcmVnTFBUeFJ4LCByZWdMUFR4LCByZWdMUFR4LCByZWdMUFJ4LCByZWdMUFJ4KSk7CisKKwkvLyByZXNldCBjb3VudGVyCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweGMpOworfQorCitWT0lECitoYWxidGM4NzIzYTJhbnRfTW9uaXRvckJ0RW5hYmxlRGlzYWJsZSgKKwlJTiAJUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXN0YXRpYyBCT09MRUFOCWJQcmVCdERpc2FibGVkPUZBTFNFOworCXN0YXRpYyB1NEJ5dGUJYnREaXNhYmxlQ250PTA7CisJQk9PTEVBTgkJCWJCdEFjdGl2ZT10cnVlLCBiQnREaXNhYmxlZD1GQUxTRTsKKworCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKKworCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMCAmJgorCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPT0gMCAmJgorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAwICYmCisJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDApCisJeworCQliQnRBY3RpdmUgPSBGQUxTRTsKKwl9CisJaWYoCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKKwkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDB4ZmZmZiAmJgorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKKwkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPT0gMHhmZmZmKQorCXsKKwkJYkJ0QWN0aXZlID0gRkFMU0U7CisJfQorCWlmKGJCdEFjdGl2ZSkKKwl7CisJCWJ0RGlzYWJsZUNudCA9IDA7CisJCWJCdERpc2FibGVkID0gRkFMU0U7CisJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZW5hYmxlZCAhIVxuIikpOworCX0KKwllbHNlCisJeworCQlidERpc2FibGVDbnQrKzsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKKwkJCQlidERpc2FibGVDbnQpKTsKKwkJaWYoYnREaXNhYmxlQ250ID49IDIpCisJCXsKKwkJCWJCdERpc2FibGVkID0gdHJ1ZTsKKwkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CisJCX0KKwl9CisJaWYoYlByZUJ0RGlzYWJsZWQgIT0gYkJ0RGlzYWJsZWQpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLCAKKwkJCShiUHJlQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSwgCisJCQkoYkJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIikpKTsKKwkJYlByZUJ0RGlzYWJsZWQgPSBiQnREaXNhYmxlZDsKKwkJaWYoIWJCdERpc2FibGVkKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQnRFbmFibGVBY3Rpb24ocEJ0Q29leGlzdCk7CisJCX0KKwl9Cit9CisKK0JPT0xFQU4KK2hhbGJ0Yzg3MjNhMmFudF9Jc0NvbW1vbkFjdGlvbigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOworCUJPT0xFQU4JCQliQ29tbW9uPUZBTFNFLCBiV2lmaUNvbm5lY3RlZD1GQUxTRTsKKwlCT09MRUFOCQkJYkxvd1B3ckRpc2FibGU9RkFMU0U7CisKKwlpZighcFN0YWNrSW5mby0+YkJ0TGlua0V4aXN0KQorCXsKKwkJYkxvd1B3ckRpc2FibGUgPSBGQUxTRTsKKwkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwgJmJMb3dQd3JEaXNhYmxlKTsKKwl9CisJZWxzZQorCXsKKwkJYkxvd1B3ckRpc2FibGUgPSB0cnVlOworCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOworCX0KKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKKworCWlmKGhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAorCQlCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIGlkbGUgKyBCdCBpZGxlISFcbiIpKTsKKwkJCQorCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCisJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKworCQliQ29tbW9uID0gdHJ1ZTsKKwl9CisJZWxzZSBpZighaGFsYnRjODcyM2EyYW50X0lzV2lmaUlkbGUocEJ0Q29leGlzdCkgJiYgCisJCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbi1pZGxlICsgQlQgaWRsZSEhXG4iKSk7CisKKwkJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisKKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlIGlmKGhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAorCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBpZGxlICsgQnQgY29ubmVjdGVkIGlkbGUhIVxuIikpOworCQkKKwkJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKworCQloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDIwKTsKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisKKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlIGlmKCFoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZShwQnRDb2V4aXN0KSAmJiAKKwkJKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uLWlkbGUgKyBCdCBjb25uZWN0ZWQgaWRsZSEhXG4iKSk7CisKKwkJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKworCQloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDIwKTsKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisKKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlIGlmKGhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAorCQkJKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgaWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKKwkJCisJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCisJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJCisJCWJDb21tb24gPSB0cnVlOworCX0KKwllbHNlCisJeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uLWlkbGUgKyBCVCBub24taWRsZSEhXG4iKSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CisJCQorCQliQ29tbW9uID0gRkFMU0U7CisJfQorCQorCXJldHVybiBiQ29tbW9uOworfQorVk9JRAoraGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JQk9PTEVBTgkJCWJTY29IaWQsCisJSU4JQk9PTEVBTgkJCWJUeFBhdXNlLAorCUlOCXUxQnl0ZQkJCW1heEludGVydmFsCisJKQoreworCXN0YXRpYyBzNEJ5dGUJCXVwLGRuLG0sbixXYWl0Q291bnQ7CisJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KKwl1MUJ5dGUJCQlyZXRyeUNvdW50PTA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIFRkbWFEdXJhdGlvbkFkanVzdCgpXG4iKSk7CisKKwlpZihwQ29leERtLT5iUmVzZXRUZG1hQWRqdXN0KQorCXsKKwkJcENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCA9IEZBTFNFOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOworCQl7CisJCQlpZihiU2NvSGlkKQorCQkJeworCQkJCWlmKGJUeFBhdXNlKQorCQkJCXsKKwkJCQkJaWYobWF4SW50ZXJ2YWwgPT0gMSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTM7CQorCQkJCQl9CisJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CQorCQkJCQl9CisJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMykKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYobWF4SW50ZXJ2YWwgPT0gMSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwkKKwkJCQkJfQorCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwkKKwkJCQkJfQorCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoYlR4UGF1c2UpCisJCQkJeworCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDU7CQorCQkJCQl9CisJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OwkKKwkJCQkJfQorCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CQorCQkJCQl9CisJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwkKKwkJCQkJfQorCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLz09PT09PT09PT09PQorCQl1cCA9IDA7CisJCWRuID0gMDsKKwkJbSA9IDE7CisJCW49IDM7CisJCXJlc3VsdCA9IDA7CisJCVdhaXRDb3VudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCBXYWl0Q291bnQ9JWRcbiIsIAorCQkJdXAsIGRuLCBtLCBuLCBXYWl0Q291bnQpKTsKKwkJcmVzdWx0ID0gMDsKKwkJV2FpdENvdW50Kys7IAorCQkgIAorCQlpZihyZXRyeUNvdW50ID09IDApICAvLyBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgorCQl7CisJCQl1cCsrOworCQkJZG4tLTsKKworCQkJaWYgKGRuIDw9IDApCisJCQkJZG4gPSAwOwkJCQkgCisKKwkJCWlmKHVwID49IG4pCS8vIGlmILNzxPIgbiCt0zKs7SByZXRyeSBjb3VudKywMCwgq2i91bxlV2lGaSBkdXJhdGlvbgorCQkJeworCQkJCVdhaXRDb3VudCA9IDA7IAorCQkJCW4gPSAzOworCQkJCXVwID0gMDsKKwkJCQlkbiA9IDA7CisJCQkJcmVzdWx0ID0gMTsgCisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgSW5jcmVhc2Ugd2lmaSBkdXJhdGlvbiEhXG4iKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocmV0cnlDb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KKwkJeworCQkJdXAtLTsgCisJCQlkbisrOworCisJCQlpZiAodXAgPD0gMCkKKwkJCQl1cCA9IDA7CisKKwkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJCXsKKwkJCQlpZiAoV2FpdENvdW50IDw9IDIpCisJCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJCWVsc2UKKwkJCQkJbSA9IDE7CisKKwkJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQkJbSA9IDIwOworCisJCQkJbiA9IDMqbTsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCVdhaXRDb3VudCA9IDA7CisJCQkJcmVzdWx0ID0gLTE7IAorCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcjwzISFcbiIpKTsKKwkJCX0KKwkJfQorCQllbHNlICAvL3JldHJ5IGNvdW50ID4gMywgpXWtbjGmuCByZXRyeSBjb3VudCA+IDMsIKtovdWvtldpRmkgZHVyYXRpb24KKwkJeworCQkJaWYgKFdhaXRDb3VudCA9PSAxKQorCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgorCQkJZWxzZQorCQkJCW0gPSAxOworCisJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KKwkJCQltID0gMjA7CisKKwkJCW4gPSAzKm07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQlXYWl0Q291bnQgPSAwOyAKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPjMhIVxuIikpOworCQl9CisKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgbWF4IEludGVydmFsID0gJWRcbiIsIG1heEludGVydmFsKSk7CisJCWlmKG1heEludGVydmFsID09IDEpCisJCXsKKwkJCWlmKGJUeFBhdXNlKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7CisKKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA1OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OworCQkJCX0KKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEzKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTM7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CisJCQkJfQorCQkJCQorCQkJCWlmKHJlc3VsdCA9PSAtMSkKKwkJCQl7CQkJCQkKKwkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE2OworCQkJCQl9CisJCQkJfSAKKwkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKKwkJCQl7CisJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE0OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOworCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CisJCQkJfQorCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOworCQkJCX0KKwkJCQkKKwkJCQlpZihyZXN1bHQgPT0gLTEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKKwkJCQkJfQorCQkJCX0gCisJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMikKKwkJeworCQkJaWYoYlR4UGF1c2UpCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OworCQkJCX0KKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CisJCQkJfQorCQkJCWlmKHJlc3VsdCA9PSAtMSkKKwkJCQl7CisJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KSAKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE0OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTYpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CisJCQkJCX0KKwkJCQl9IAorCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQorCQkJCXsKKwkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDgpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OworCQkJCQl9CQkJCQkKKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpKTsKKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA0OworCQkJCX0KKwkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTMpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOworCQkJCX0KKwkJCQlpZihyZXN1bHQgPT0gLTEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKKwkJCQkJfQorCQkJCX0gCisJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAzKQorCQl7CisJCQlpZihiVHhQYXVzZSkKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOworCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CisJCQkJfQorCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEyKQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTYpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKKwkJCQl9CisJCQkJaWYocmVzdWx0ID09IC0xKQorCQkJCXsKKwkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpIAorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gODsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKKwkJCQkJfQorCQkJCX0gCisJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCisJCQkJeworCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CisJCQkJCX0JCQkJCQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOworCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CisJCQkJfQorCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQkJfQorCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQorCQkJCXsKKwkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKKwkJCQl9CisJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCisJCQkJeworCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCX0KKwkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKKwkJCQl7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKKwkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTI7CisJCQkJfQorCQkJCWlmKHJlc3VsdCA9PSAtMSkKKwkJCQl7CisJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOworCQkJCQl9CisJCQkJfSAKKwkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKKwkJCQl7CisJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKKwkJCQkJeworCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCisJCQkJCXsKKwkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKKwkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOworCQkJCQl9CisJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQorCQkJCQl7CisJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNvcmRlZCBvbmUgKHdoZW4gc2NhbiwgZGhjcC4uLiksIAorCS8vIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkIG9uZS4KKwlpZihwQ29leERtLT5jdXJQc1RkbWEgIT0gcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKQorCXsKKwkJQk9PTEVBTgliU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJSb2FtPUZBTFNFOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hPSVkLCByZWNvcmRQc1RkbWE9JWRcbiIsIAorCQkJcENvZXhEbS0+Y3VyUHNUZG1hLCBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpKTsKKworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOworCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOworCQkKKwkJaWYoICFiU2NhbiAmJiAhYkxpbmsgJiYgIWJSb2FtKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcm9hbWluZy9saW5rL3NjYW4gaXMgdW5kZXIgcHJvZ3Jlc3MsIHdpbGwgYWRqdXN0IG5leHQgdGltZSEhIVxuIikpOworCQl9CisJfQorfQorCisvLyBTQ08gb25seSBvciBTQ08rUEFOKEhTKQorVk9JRAoraGFsYnRjODcyM2EyYW50X0FjdGlvblNjbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxOworCXU0Qnl0ZQl3aWZpQnc7CisKKwlpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCQorCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20JCQorCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwl9CisJZWxzZQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKKwkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CisJCQorCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOworCQl9CisJCQorCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQkJCisJfQorfQorCisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWQoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMTsKKwl1NEJ5dGUJd2lmaUJ3OworCisJaWYoaGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKHBCdENvZXhpc3QpKQorCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEzKTsKKwkJfQorCisJCS8vIHN3IG1lY2hhbmlzbQorCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJfQorCWVsc2UKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CisJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOworCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEzKTsKKwkJfQorCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCQl9CQkKKwl9Cit9CisKKy8vQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpCitWT0lECitoYWxidGM4NzIzYTJhbnRfQWN0aW9uQTJkcCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OworCXU0Qnl0ZQkJd2lmaUJ3OworCisJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKKworCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisJCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKKworCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkcgorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIEZBTFNFLCAzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCBGQUxTRSwgMSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMSk7CisJCQl9CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20JCQorCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwl9CisJZWxzZQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKKwkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CisJCQorCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkcgorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIEZBTFNFLCAzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCBGQUxTRSwgMSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMSk7CisJCQl9CisJCX0KKwkJCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCQl9CQkKKwl9Cit9CisKK1ZPSUQKK2hhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHIoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKKwl1NEJ5dGUJCXdpZmlCdzsKKwkKKwlidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OworCisJaWYoaGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKHBCdENvZXhpc3QpKQorCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UJCisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKwlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CisJCQkKKwkJLy8gZncgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJfQorCWVsc2UKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CisJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOworCQkKKwkJLy8gZncgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCX0KK30KKworCisvL1BBTihIUykgb25seQorVk9JRAoraGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkhzKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwl1MUJ5dGUJCXdpZmlSc3NpU3RhdGU7CisJdTRCeXRlCQl3aWZpQnc7CisKKwloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJeworCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOworCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCX0KKwkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCisJCS8vIHN3IG1lY2hhbmlzbQkJCisJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCX0KKwllbHNlCisJeworCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOworCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwl9Cit9CisKKy8vUEFOKEVEUikrQTJEUAorVk9JRAoraGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkckEyZHAoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKKwl1NEJ5dGUJCXdpZmlCdzsKKworCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CisKKwlpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKKworCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CisJCQl9CisJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CisJCQl9CisJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOworCQkJfQorCQl9CisKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCX0KKwllbHNlCisJeworCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOworCQl3aWZpUnNzaVN0YXRlMSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDQ3LCAwKTsKKwkJCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKKwkJCX0KKwkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKKwkJCX0KKwkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CisJCQl9CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkckhpZCgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMTsKKwl1NEJ5dGUJCXdpZmlCdzsKKworCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJeworCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOworCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7IAorCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOyAKKwkJfQorCisJCS8vIHN3IG1lY2hhbmlzbQorCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwl9CisJZWxzZQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKKwkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CisJCQorCQkvLyBmdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQl9CisJCQorCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOworCQl9CisJCWVsc2UKKwkJeworCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwl9Cit9CisKKy8vIEhJRCtBMkRQK1BBTihFRFIpCitWT0lECitoYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcigKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OworCXU0Qnl0ZQkJd2lmaUJ3OworCisJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKKworCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCQorCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CisJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCisJeworCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOworCQkJCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CisJCQl9CisJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKKwkJCX0KKwkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOworCQkJfQorCQl9CisJCQorCQkvLyBzdyBtZWNoYW5pc20KKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJfQorCWVsc2UKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CisJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOworCQkKKwkJLy8gZncgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKKwkJCX0KKwkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTYpOworCQkJfQorCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CisJCQl9CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X0FjdGlvbkhpZEEyZHAoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKKwl1NEJ5dGUJCXdpZmlCdzsKKworCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CisKKwlpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCisJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQkKKwkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOworCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQorCXsKKwkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKKwkJCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAzKTsKKwkJCX0KKwkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCisJCQl7CisJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCBGQUxTRSwgMSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIHRydWUsIDMpOworCQkJfQorCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIHRydWUsIDEpOworCQkJfQorCQl9CisJCQorCQkvLyBzdyBtZWNoYW5pc20KKwkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJfQorCWVsc2UKKwl7CisJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CisJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOworCQkKKwkJLy8gZncgbWVjaGFuaXNtCisJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCisJCXsKKwkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgdHJ1ZSwgRkFMU0UsIDMpOworCQkJfQorCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKKwkJCXsKKwkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAxKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgdHJ1ZSwgdHJ1ZSwgMyk7CisJCQl9CisJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQorCQkJeworCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgdHJ1ZSwgdHJ1ZSwgMSk7CisJCQl9CisJCX0KKworCQkvLyBzdyBtZWNoYW5pc20KKwkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKKwkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CisJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKKwkJfQorCX0KK30KKworVk9JRAoraGFsYnRjODcyM2EyYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKKwl1MUJ5dGUJCQkJYnRJbmZvT3JpZ2luYWw9MCwgYnRSZXRyeUNudD0wOworCXUxQnl0ZQkJCQlhbGdvcml0aG09MDsKKworCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBNYW51YWwgY29udHJvbCEhIVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYocFN0YWNrSW5mby0+YlByb2ZpbGVOb3RpZmllZCkKKwl7CisJCWlmKHBDb2V4U3RhLT5iSG9sZEZvclN0YWNrT3BlcmF0aW9uKQorCQl7CisJCQkvLyBpZiBidCBpbnF1aXJ5L3BhZ2UvcGFpciwgZG8gbm90IGV4ZWN1dGUuCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWFsZ29yaXRobSA9IGhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25BbGdvcml0aG0ocEJ0Q29leGlzdCk7CisJCWlmKHBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCAmJiAoQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFOSFMhPWFsZ29yaXRobSkpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSxIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLCAKKwkJCQlwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQpKTsKKwkJCWlmKHBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCA+PSA2KQorCQkJeworCQkJCXBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCA9IDA7CisJCQkJLy8gbmV4dCB0aW1lIHRoZSBjb2V4aXN0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlc2V0IGFnYWluLgorCQkJfQorCQkJZWxzZQorCQkJCXBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCsrOworCQkJcmV0dXJuOworCQl9CisKKwkJcENvZXhEbS0+Y3VyQWxnb3JpdGhtID0gYWxnb3JpdGhtOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFsZ29yaXRobSA9ICVkIFxuIiwgcENvZXhEbS0+Y3VyQWxnb3JpdGhtKSk7CisJCWlmKGhhbGJ0Yzg3MjNhMmFudF9Jc0NvbW1vbkFjdGlvbihwQnRDb2V4aXN0KSkKKwkJeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQgY29tbW9uLlxuIikpOworCQkJcENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihwQ29leERtLT5jdXJBbGdvcml0aG0gIT0gcENvZXhEbS0+cHJlQWxnb3JpdGhtKQorCQkJeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgcHJlQWxnb3JpdGhtPSVkLCBjdXJBbGdvcml0aG09JWRcbiIsIAorCQkJCQlwQ29leERtLT5wcmVBbGdvcml0aG0sIHBDb2V4RG0tPmN1ckFsZ29yaXRobSkpOworCQkJCXBDb2V4RG0tPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOworCQkJfQorCQkJc3dpdGNoKHBDb2V4RG0tPmN1ckFsZ29yaXRobSkKKwkJCXsKKwkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKKwkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblNjbyhwQnRDb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQ6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWQocEJ0Q29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25BMmRwKHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOworCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uUGFuRWRyKHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkhTOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKKwkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkhzKHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHJBMmRwKHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ6CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHJIaWQocEJ0Q29leGlzdCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgorCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOworCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcihwQnRDb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOworCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcChwQnRDb2V4aXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CisJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4QWxsT2ZmKHBCdENvZXhpc3QpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCXBDb2V4RG0tPnByZUFsZ29yaXRobSA9IHBDb2V4RG0tPmN1ckFsZ29yaXRobTsKKwkJfQorCX0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHdvcmsgYXJvdW5kIGZ1bmN0aW9uIHN0YXJ0IHdpdGggd2FfaGFsYnRjODcyM2EyYW50XworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZPSUQKK3dhX2hhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQzJoKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpCit7CisJdTFCeXRlCXRtcDFiPTB4MDsKKwl1NEJ5dGUJY3VyQzJoVG90YWxDbnQ9MHgwOworCXN0YXRpYyB1NEJ5dGUJcHJlQzJoVG90YWxDbnQ9MHgwLCBzYW1lQ250UG9sbGluZ1RpbWU9MHgwOworCisJY3VyQzJoVG90YWxDbnQrPXBDb2V4U3RhLT5idEluZm9DMmhDbnRbQlRfSU5GT19TUkNfODcyM0FfMkFOVF9CVF9SU1BdOworCisJaWYoY3VyQzJoVG90YWxDbnQgPT0gcHJlQzJoVG90YWxDbnQpCisJeworCQlzYW1lQ250UG9sbGluZ1RpbWUrKzsKKwl9CisJZWxzZQorCXsKKwkJcHJlQzJoVG90YWxDbnQgPSBjdXJDMmhUb3RhbENudDsKKwkJc2FtZUNudFBvbGxpbmdUaW1lID0gMDsKKwl9CisKKwlpZihzYW1lQ250UG9sbGluZ1RpbWUgPj0gMikKKwl7CisJCXRtcDFiID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYpOworCQlpZih0bXAxYiAhPSAweDApCisJCXsKKwkJCXBDb2V4U3RhLT5jMmhIYW5nRGV0ZWN0Q250Kys7CisJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYsIDB4MCk7CisJCX0KKwl9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBFWGhhbGJ0Yzg3MjNhMmFudF8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9Jbml0SHdDb25maWcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCXU0Qnl0ZQl1NFRtcD0wOworCXUxQnl0ZQl1MVRtcD0wOworCisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIDJBbnQgSW5pdCBIVyBDb25maWchIVxuIikpOworCisJLy8gYmFja3VwIHJmIDB4MWUgdmFsdWUKKwlwQ29leERtLT5idFJmMHgxZUJhY2t1cCA9IAorCQlwQnRDb2V4aXN0LT5idGNfZ2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZik7CisKKwkvLyBFbmFibGUgY291bnRlciBzdGF0aXN0aWNzCisJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweDQpOworCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCwgMHgzKTsKKwlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MCwgMHgyMCk7Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBDb2V4IE1lY2hhbmlzbSBJbml0ISFcbiIpKTsKKwkKKwloYWxidGM4NzIzYTJhbnRfSW5pdENvZXhEbShwQnRDb2V4aXN0KTsKK30KKworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfRGlzcGxheUNvZXhJbmZvKAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAorCSkKK3sKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKgkJcEJvYXJkSW5mbz0mcEJ0Q29leGlzdC0+Ym9hcmRfaW5mbzsKKwlQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CisJcHUxQnl0ZQkJCQljbGlCdWY9cEJ0Q29leGlzdC0+Y2xpX2J1ZjsKKwl1MUJ5dGUJCQkJdTFUbXBbNF0sIGksIGJ0SW5mb0V4dCwgcHNUZG1hQ2FzZT0wOworCXU0Qnl0ZQkJCQl1NFRtcFs0XTsKKwlCT09MRUFOCQkJCWJSb2FtPUZBTFNFLCBiU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJXaWZpVW5kZXI1Rz1GQUxTRTsKKwlCT09MRUFOCQkJCWJCdEhzT249RkFMU0UsIGJXaWZpQnVzeT1GQUxTRTsKKwlzNEJ5dGUJCQkJd2lmaVJzc2k9MCwgYnRIc1Jzc2k9MDsKKwl1NEJ5dGUJCQkJd2lmaUJ3LCB3aWZpVHJhZmZpY0RpcjsKKwl1MUJ5dGUJCQkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubDsKKworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlpZighcEJvYXJkSW5mby0+YnRfZXhpc3QpCisJeworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkJcmV0dXJuOworCX0KKworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJBbnQgUEcgbnVtYmVyLyBBbnQgbWVjaGFuaXNtOiIsIFwKKwkJcEJvYXJkSW5mby0+cGdfYW50X251bSwgcEJvYXJkSW5mby0+YnRkbV9hbnRfbnVtKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsJCisJCisJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICJbQWN0aW9uIE1hbnVhbCBjb250cm9sXSEhIik7CisJCUNMX1BSSU5URihjbGlCdWYpOworCX0KKwkKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLCAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwgXAorCQkoKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpPyAiWWVzIjoiTm8iKSwgcFN0YWNrSW5mby0+aGNpVmVyc2lvbik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfRE9UMTFfQ0hOTCwgJndpZmlEb3QxMUNobmwpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0hTX0NITkwsICZ3aWZpSHNDaG5sKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQoJWQpIiwgIkRvdDExIGNoYW5uZWwgLyBIc0NobmwoSHNNb2RlKSIsIFwKKwkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubCwgYkJ0SHNPbik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgXAorCQlwQ29leERtLT53aWZpQ2hubEluZm9bMF0sIHBDb2V4RG0tPndpZmlDaG5sSW5mb1sxXSwKKwkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpUnNzaSk7CisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X0hTX1JTU0ksICZidEhzUnNzaSk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiV2lmaSByc3NpLyBIUyByc3NpIiwgXAorCQl3aWZpUnNzaSwgYnRIc1Jzc2kpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsICJXaWZpIGJMaW5rLyBiUm9hbS8gYlNjYW4iLCBcCisJCWJMaW5rLCBiUm9hbSwgYlNjYW4pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZiV2lmaVVuZGVyNUcpOworCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKKwlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwgJndpZmlUcmFmZmljRGlyKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJXMvICVzICIsICJXaWZpIHN0YXR1cyIsIFwKKwkJKGJXaWZpVW5kZXI1Rz8gIjVHIjoiMi40RyIpLAorCQkoKEJUQ19XSUZJX0JXX0xFR0FDWT09d2lmaUJ3KT8gIkxlZ2FjeSI6ICgoKEJUQ19XSUZJX0JXX0hUNDA9PXdpZmlCdyk/ICJIVDQwIjoiSFQyMCIpKSksCisJCSgoIWJXaWZpQnVzeSk/ICJpZGxlIjogKChCVENfV0lGSV9UUkFGRklDX1RYPT13aWZpVHJhZmZpY0Rpcik/ICJ1cGxpbmsiOiJkb3dubGluayIpKSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IFslcy8gJWQvICVkXSAiLCAiQlQgW3N0YXR1cy8gcnNzaS8gcmV0cnlDbnRdIiwgXAorCQkoKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSk/KCJpbnF1aXJ5L3BhZ2Ugc2NhbiIpOigoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJpZGxlIjooICAoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpPyAiY29ubmVjdGVkLWlkbGUiOiJidXN5IikpKSwKKwkJcENvZXhTdGEtPmJ0UnNzaSwgcENvZXhTdGEtPmJ0UmV0cnlDbnQpOworCUNMX1BSSU5URihjbGlCdWYpOworCQorCWlmKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpCisJewkJCQorCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCisJCQlwU3RhY2tJbmZvLT5iU2NvRXhpc3QsIHBTdGFja0luZm8tPmJIaWRFeGlzdCwgcFN0YWNrSW5mby0+YlBhbkV4aXN0LCBwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KTsKKwkJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCisJCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0JUX0xJTktfSU5GTyk7CisJfQorCisJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwgIkJUIEluZm8gQTJEUCByYXRlIiwgXAorCQkoYnRJbmZvRXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CQorCisJZm9yKGk9MDsgaTxCVF9JTkZPX1NSQ184NzIzQV8yQU5UX01BWDsgaSsrKQorCXsKKwkJaWYocENvZXhTdGEtPmJ0SW5mb0MyaENudFtpXSkKKwkJewkJCQkKKwkJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCglZCkiLCBHTEJ0SW5mb1NyYzg3MjNhMkFudFtpXSwgXAorCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMF0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bMV0sCisJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVsyXSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVszXSwKKwkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzRdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzVdLAorCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bNl0sIHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pOworCQkJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJCX0KKwl9CisKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIiwgIndyaXRlIDB4MWFmPTB4MCBudW0iLCBcCisJCXBDb2V4U3RhLT5jMmhIYW5nRGV0ZWN0Q250KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwkvLyBTdyBtZWNoYW5pc20JCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W1N3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQiLCAiU00xW1NoUmYvIExwUkEvIExpbURpZ10iLCBcCisJCXBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhLCBwQ29leERtLT5saW1pdGVkX2RpZyk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsIFwKKwkJcENvZXhEbS0+YkN1ckFnY1RhYmxlRW4sIHBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmLCBwQ29leERtLT5iQ3VyRGFjU3dpbmdPbiwgcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJLy8gRncgbWVjaGFuaXNtCQkKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bRncgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlCdWYpOwkKKwkKKwlpZighcEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJeworCQlwc1RkbWFDYXNlID0gcENvZXhEbS0+Y3VyUHNUZG1hOworCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBjYXNlLSVkIiwgIlBTIFRETUEiLCBcCisJCQlwQ29leERtLT5wc1RkbWFQYXJhWzBdLCBwQ29leERtLT5wc1RkbWFQYXJhWzFdLAorCQkJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSwgcENvZXhEbS0+cHNUZG1hUGFyYVszXSwKKwkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbNF0sIHBzVGRtYUNhc2UpOworCQlDTF9QUklOVEYoY2xpQnVmKTsKKwkKKwkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkRlY0J0UHdyLyBJZ25XbGFuQWN0IiwgXAorCQkJcENvZXhEbS0+YkN1ckRlY0J0UHdyLCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCk7CisJCUNMX1BSSU5URihjbGlCdWYpOworCX0KKworCS8vIEh3IHNldHRpbmcJCQorCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtIdyBzZXR0aW5nXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlCdWYpOwkKKworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICJSRi1BLCAweDFlIGluaXRWYWwiLCBcCisJCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgpOworCXUxVG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3ODMpOworCXUxVG1wWzJdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3OTYpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsICIweDc3OC8gMHg3ODMvIDB4Nzk2IiwgXAorCQl1MVRtcFswXSwgdTFUbXBbMV0sIHUxVG1wWzJdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg4ODApOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDg4MCIsIFwKKwkJdTRUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDQwKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MCIsIFwKKwkJdTFUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDU1MCk7CisJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDUyMik7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIFwKKwkJdTRUbXBbMF0sIHUxVG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg0ODQpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQ4NChyYXRlIGFkYXB0aXZlKSIsIFwKKwkJdTRUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGM1MCk7CisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4YzUwKGRpZykiLCBcCisJCXU0VG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKworCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTApOworCXU0VG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTQpOworCXU0VG1wWzJdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTgpOworCXU0VG1wWzNdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYWMpOworCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleC8gMHgleCIsICIweGRhMC8weGRhNC8weGRhOC8weGRhYyhGQSBjbnQpIiwgXAorCQl1NFRtcFswXSwgdTRUbXBbMV0sIHU0VG1wWzJdLCB1NFRtcFszXSk7CisJQ0xfUFJJTlRGKGNsaUJ1Zik7CisKKwl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmMwKTsKKwl1NFRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0KTsKKwl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4KTsKKwl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKKwkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXBbMF0pOworCUNMX1BSSU5URihjbGlCdWYpOworCisJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzAgKGhwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCisJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCwgcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4KTsKKwlDTF9QUklOVEYoY2xpQnVmKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3NChscCByeFszMToxNl0vdHhbMTU6MF0pIiwgXAorCQlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCwgcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgpOworCUNMX1BSSU5URihjbGlCdWYpOworCisJLy8gVHggbWdudCBxdWV1ZSBoYW5nIG9yIG5vdCwgMHg0MWIgc2hvdWxkID0gMHhmLCBleDogMHhkID09PmhhbmcKKwl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NDFiKTsKKwlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MWIgKG1nbnRRIGhhbmcgY2hrID09IDB4ZikiLCBcCisJCXUxVG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpQnVmKTsJCisKKwlwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9DT0VYX1NUQVRJU1RJQ1MpOworfQorCisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0lwc05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlpZihCVENfSVBTX0VOVEVSID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBJUFMgRU5URVIgbm90aWZ5XG4iKSk7CisJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4QWxsT2ZmKHBCdENvZXhpc3QpOworCX0KKwllbHNlIGlmKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpKTsKKwkJLy9oYWxidGM4NzIzYTJhbnRfSW5pdENvZXhEbShwQnRDb2V4aXN0KTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0xwc05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIEVOQUJMRSBub3RpZnlcbiIpKTsKKwl9CisJZWxzZSBpZihCVENfTFBTX0RJU0FCTEUgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBESVNBQkxFIG5vdGlmeVxuIikpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfU2Nhbk5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlpZihCVENfU0NBTl9TVEFSVCA9PSB0eXBlKQorCXsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpKTsKKwl9CisJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIikpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfQ29ubmVjdE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSkKK3sKKwlpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOworCX0KKwllbHNlIGlmKEJUQ19BU1NPQ0lBVEVfRklOSVNIID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpKTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X01lZGlhU3RhdHVzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJaWYoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGNvbm5lY3Qgbm90aWZ5XG4iKSk7CisJfQorCWVsc2UKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKSk7CisJfQorCisJaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8ocEJ0Q29leGlzdCwgdHlwZSk7Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X1NwZWNpYWxQYWNrZXROb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQkJdHlwZQorCSkKK3sKKwlpZih0eXBlID09IEJUQ19QQUNLRVRfREhDUCkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIERIQ1AgUGFja2V0IG5vdGlmeVxuIikpOworCX0KK30KKworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfQnRJbmZvTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglwdTFCeXRlCQkJdG1wQnVmLAorCUlOCXUxQnl0ZQkJCWxlbmd0aAorCSkKK3sKKwl1MUJ5dGUJCQlidEluZm89MDsKKwl1MUJ5dGUJCQlpLCByc3BTb3VyY2U9MDsKKwlCT09MRUFOCQkJYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7CisJQk9PTEVBTgkJCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiQnRIc09uPUZBTFNFOworCisJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gRkFMU0U7CisJCisJcnNwU291cmNlID0gQlRfSU5GT19TUkNfODcyM0FfMkFOVF9CVF9SU1A7CisJcENvZXhTdGEtPmJ0SW5mb0MyaENudFtyc3BTb3VyY2VdKys7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBCdCBpbmZvWyVkXSwgbGVuZ3RoPSVkLCBoZXggZGF0YT1bIiwgcnNwU291cmNlLCBsZW5ndGgpKTsKKwlmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorCXsKKwkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdW2ldID0gdG1wQnVmW2ldOworCQlpZihpID09IDApCisJCQlidEluZm8gPSB0bXBCdWZbaV07CisJCWlmKGkgPT0gbGVuZ3RoLTEpCisJCXsKKwkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4XVxuIiwgdG1wQnVmW2ldKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTAyeCwgIiwgdG1wQnVmW2ldKSk7CisJCX0KKwl9CisKKwlpZihCVF9JTkZPX1NSQ184NzIzQV8yQU5UX1dJRklfRlcgIT0gcnNwU291cmNlKQorCXsKKwkJcENvZXhTdGEtPmJ0UmV0cnlDbnQgPQorCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzFdOworCisJCXBDb2V4U3RhLT5idFJzc2kgPQorCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzJdKjIrMTA7CisKKwkJcENvZXhTdGEtPmJ0SW5mb0V4dCA9IAorCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzNdOworCX0KKwkJCisJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOworCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCisJaWYoYnRJbmZvICYgQlRfSU5GT184NzIzQV8yQU5UX0JfSU5RX1BBR0UpCisJeworCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSB0cnVlOworCX0KKwllbHNlCisJeworCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSBGQUxTRTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X1N0YWNrT3BlcmF0aW9uTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpCit7CisJaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfU1RBUlQgPT0gdHlwZSkKKwl7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgc3RhcnQgbm90aWZ5XG4iKSk7CisJCXBDb2V4U3RhLT5iSG9sZEZvclN0YWNrT3BlcmF0aW9uID0gdHJ1ZTsKKwkJcENvZXhTdGEtPmJIb2xkUGVyaW9kQ250ID0gMTsKKwkJaGFsYnRjODcyM2EyYW50X0J0SW5xdWlyeVBhZ2UocEJ0Q29leGlzdCk7CisJfQorCWVsc2UgaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfRklOSVNIID09IHR5cGUpCisJeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIGZpbmlzaCBub3RpZnlcbiIpKTsKKwkJcENvZXhTdGEtPmJIb2xkRm9yU3RhY2tPcGVyYXRpb24gPSBGQUxTRTsKKwl9Cit9CisKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0hhbHROb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAorCSkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBIYWx0IG5vdGlmeVxuIikpOworCisJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CisJRVhoYWxidGM4NzIzYTJhbnRfTWVkaWFTdGF0dXNOb3RpZnkocEJ0Q29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOworfQorCitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9QZXJpb2RpY2FsKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgMkFudCBQZXJpb2RpY2FsISFcbiIpKTsKKworCS8vIHdvcmsgYXJvdW5kIGZvciBjMmggaGFuZworCXdhX2hhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQzJoKHBCdENvZXhpc3QpOworCQorCWhhbGJ0Yzg3MjNhMmFudF9RdWVyeUJ0SW5mbyhwQnRDb2V4aXN0KTsKKwloYWxidGM4NzIzYTJhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOworCWhhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKHBCdENvZXhpc3QpOworCisJaGFsYnRjODcyM2EyYW50X1J1bkNvZXhpc3RNZWNoYW5pc20ocEJ0Q29leGlzdCk7Cit9CisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZDM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5oCkBAIC0wLDAgKzEsMTc5IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgZm9yIDg3MjNBIDJBbnQgQlQgQ28tZXhpc3QgZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lCUJUX0lORk9fODcyM0FfMkFOVF9CX0ZUUAkJCQkJCUJJVDcKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8yQU5UX0JfQTJEUAkJCQkJQklUNgorI2RlZmluZQlCVF9JTkZPXzg3MjNBXzJBTlRfQl9ISUQJCQkJCQlCSVQ1CisjZGVmaW5lCUJUX0lORk9fODcyM0FfMkFOVF9CX1NDT19CVVNZCQkJCUJJVDQKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8yQU5UX0JfQUNMX0JVU1kJCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzg3MjNBXzJBTlRfQl9JTlFfUEFHRQkJCQlCSVQyCisjZGVmaW5lCUJUX0lORk9fODcyM0FfMkFOVF9CX1NDT19FU0NPCQkJCUJJVDEKKyNkZWZpbmUJQlRfSU5GT184NzIzQV8yQU5UX0JfQ09OTkVDVElPTgkJCQlCSVQwCisKKyNkZWZpbmUJCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQV8yQU5UCQkyCisKK3R5cGVkZWYgZW51bSBfQlRfSU5GT19TUkNfODcyM0FfMkFOVHsKKwlCVF9JTkZPX1NSQ184NzIzQV8yQU5UX1dJRklfRlcJCQk9IDB4MCwKKwlCVF9JTkZPX1NSQ184NzIzQV8yQU5UX0JUX1JTUAkJCQk9IDB4MSwKKwlCVF9JTkZPX1NSQ184NzIzQV8yQU5UX0JUX0FDVElWRV9TRU5ECQk9IDB4MiwKKwlCVF9JTkZPX1NSQ184NzIzQV8yQU5UX01BWAorfUJUX0lORk9fU1JDXzg3MjNBXzJBTlQsKlBCVF9JTkZPX1NSQ184NzIzQV8yQU5UOworCit0eXBlZGVmIGVudW0gX0JUXzg3MjNBXzJBTlRfQlRfU1RBVFVTeworCUJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0lETEUJCQkJPSAweDAsCisJQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUJPSAweDEsCisJQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUJCQk9IDB4MiwKKwlCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19NQVgKK31CVF84NzIzQV8yQU5UX0JUX1NUQVRVUywqUEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX0JUXzg3MjNBXzJBTlRfQ09FWF9BTEdPeworCUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRAkJCT0gMHgwLAorCUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTwkJCQk9IDB4MSwKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQJCQkJPSAweDIsCisJQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUAkJCQk9IDB4MywKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFIJCQk9IDB4NCwKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5IUwkJCT0gMHg1LAorCUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQCQk9IDB4NiwKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElECQk9IDB4NywKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFIJPSAweDgsCisJQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFAJCQk9IDB4OSwKKwlCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19NQVgKK31CVF84NzIzQV8yQU5UX0NPRVhfQUxHTywqUEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPOworCit0eXBlZGVmIHN0cnVjdCBfQ09FWF9ETV84NzIzQV8yQU5UeworCS8vIGZ3IG1lY2hhbmlzbQorCUJPT0xFQU4JCWJQcmVEZWNCdFB3cjsKKwlCT09MRUFOCQliQ3VyRGVjQnRQd3I7CisJLy9CT09MRUFOCQliUHJlQnRMbmFDb25zdHJhaW47CisJLy9CT09MRUFOCQliQ3VyQnRMbmFDb25zdHJhaW47CisJLy91MUJ5dGUJCWJQcmVCdFBzZE1vZGU7CisJLy91MUJ5dGUJCWJDdXJCdFBzZE1vZGU7CisJdTFCeXRlCQlwcmVGd0RhY1N3aW5nTHZsOworCXUxQnl0ZQkJY3VyRndEYWNTd2luZ0x2bDsKKwlCT09MRUFOCQliQ3VySWdub3JlV2xhbkFjdDsKKwlCT09MRUFOCQliUHJlSWdub3JlV2xhbkFjdDsKKwl1MUJ5dGUJCXByZVBzVGRtYTsKKwl1MUJ5dGUJCWN1clBzVGRtYTsKKwl1MUJ5dGUJCXBzVGRtYVBhcmFbNV07CisJdTFCeXRlCQlwc1RkbWFEdUFkalR5cGU7CisJQk9PTEVBTgkJYlJlc2V0VGRtYUFkanVzdDsKKwlCT09MRUFOCQliUHJlUHNUZG1hT247CisJQk9PTEVBTgkJYkN1clBzVGRtYU9uOworCS8vQk9PTEVBTgkJYlByZUJ0QXV0b1JlcG9ydDsKKwkvL0JPT0xFQU4JCWJDdXJCdEF1dG9SZXBvcnQ7CisKKwkvLyBzdyBtZWNoYW5pc20KKwlCT09MRUFOCQliUHJlUmZSeExwZlNocmluazsKKwlCT09MRUFOCQliQ3VyUmZSeExwZlNocmluazsKKwl1NEJ5dGUJCWJ0UmYweDFlQmFja3VwOworCUJPT0xFQU4gCWJQcmVMb3dQZW5hbHR5UmE7CisJQk9PTEVBTgkJYkN1ckxvd1BlbmFsdHlSYTsKKwlCT09MRUFOCQliUHJlRGFjU3dpbmdPbjsKKwl1NEJ5dGUJCXByZURhY1N3aW5nTHZsOworCUJPT0xFQU4JCWJDdXJEYWNTd2luZ09uOworCXU0Qnl0ZQkJY3VyRGFjU3dpbmdMdmw7CisJQk9PTEVBTgkJYlByZUFkY0JhY2tPZmY7CisJQk9PTEVBTgkJYkN1ckFkY0JhY2tPZmY7CisJQk9PTEVBTiAJYlByZUFnY1RhYmxlRW47CisJQk9PTEVBTgkJYkN1ckFnY1RhYmxlRW47CisJdTRCeXRlCQlwcmVWYWwweDZjMDsKKwl1NEJ5dGUJCWN1clZhbDB4NmMwOworCXU0Qnl0ZQkJcHJlVmFsMHg2Yzg7CisJdTRCeXRlCQljdXJWYWwweDZjODsKKwl1MUJ5dGUJCXByZVZhbDB4NmNjOworCXUxQnl0ZQkJY3VyVmFsMHg2Y2M7CisJQk9PTEVBTgkJbGltaXRlZF9kaWc7CisKKwkvLyBhbGdvcml0aG0gcmVsYXRlZAorCXUxQnl0ZQkJcHJlQWxnb3JpdGhtOworCXUxQnl0ZQkJY3VyQWxnb3JpdGhtOworCXUxQnl0ZQkJYnRTdGF0dXM7CisJdTFCeXRlCQl3aWZpQ2hubEluZm9bM107Cit9IENPRVhfRE1fODcyM0FfMkFOVCwgKlBDT0VYX0RNXzg3MjNBXzJBTlQ7CisKK3R5cGVkZWYgc3RydWN0IF9DT0VYX1NUQV84NzIzQV8yQU5UeworCXU0Qnl0ZQkJCQkJaGlnaFByaW9yaXR5VHg7CisJdTRCeXRlCQkJCQloaWdoUHJpb3JpdHlSeDsKKwl1NEJ5dGUJCQkJCWxvd1ByaW9yaXR5VHg7CisJdTRCeXRlCQkJCQlsb3dQcmlvcml0eVJ4OworCXUxQnl0ZQkJCQkJYnRSc3NpOworCXUxQnl0ZQkJCQkJcHJlQnRSc3NpU3RhdGU7CisJdTFCeXRlCQkJCQlwcmVCdFJzc2lTdGF0ZTE7CisJdTFCeXRlCQkJCQlwcmVXaWZpUnNzaVN0YXRlWzRdOworCUJPT0xFQU4JCQkJCWJDMmhCdEluZm9SZXFTZW50OworCXUxQnl0ZQkJCQkJYnRJbmZvQzJoW0JUX0lORk9fU1JDXzg3MjNBXzJBTlRfTUFYXVsxMF07CisJdTRCeXRlCQkJCQlidEluZm9DMmhDbnRbQlRfSU5GT19TUkNfODcyM0FfMkFOVF9NQVhdOworCUJPT0xFQU4JCQkJCWJDMmhCdElucXVpcnlQYWdlOworCXUxQnl0ZQkJCQkJYnRSZXRyeUNudDsKKwl1MUJ5dGUJCQkJCWJ0SW5mb0V4dDsKKwlCT09MRUFOCQkJCQliSG9sZEZvclN0YWNrT3BlcmF0aW9uOworCXUxQnl0ZQkJCQkJYkhvbGRQZXJpb2RDbnQ7CisJLy8gdGhpcyBpcyBmb3IgYzJoIGhhbmcgd29yay1hcm91bmQKKwl1NEJ5dGUJCQkJCWMyaEhhbmdEZXRlY3RDbnQ7Cit9Q09FWF9TVEFfODcyM0FfMkFOVCwgKlBDT0VYX1NUQV84NzIzQV8yQU5UOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgbm90aWZ5IGNvZXggbW9kdWxlLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9Jbml0SHdDb25maWcoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0lwc05vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9McHNOb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfU2Nhbk5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJdHlwZQorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9Db25uZWN0Tm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTgl1MUJ5dGUJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X01lZGlhU3RhdHVzTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCisJSU4JdTFCeXRlCQkJCXR5cGUKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0hhbHROb3RpZnkoCisJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9QZXJpb2RpY2FsKAorCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKKwkpOworVk9JRAorRVhoYWxidGM4NzIzYTJhbnRfQnRJbmZvTm90aWZ5KAorCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKKwlJTglwdTFCeXRlCQkJdG1wQnVmLAorCUlOCXUxQnl0ZQkJCWxlbmd0aAorCSk7CitWT0lECitFWGhhbGJ0Yzg3MjNhMmFudF9TdGFja09wZXJhdGlvbk5vdGlmeSgKKwlJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAorCUlOCXUxQnl0ZQkJCQl0eXBlCisJKTsKK1ZPSUQKK0VYaGFsYnRjODcyM2EyYW50X0Rpc3BsYXlDb2V4SW5mbygKKwlJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKKwkpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTRiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjFhbnQuYwpAQCAtMCwwICsxLDQxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgZmlsZSBpcyBmb3IgUlRMODcyM0IgQ28tZXhpc3QgbWVjaGFuaXNtCisgKgorICogSGlzdG9yeQorICogMjAxMi8xMS8xNSBDb3NhIGZpcnN0IGNoZWNrIGluLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJoYWxidF9wcmVjb21wLmgiCisjaWYgMQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGNvZXhfZG1fODcyM2JfMWFudCBnbGNvZXhfZG1fODcyM2JfMWFudDsKK3N0YXRpYyBzdHJ1Y3QgY29leF9kbV84NzIzYl8xYW50ICpjb2V4X2RtID0gJmdsY29leF9kbV84NzIzYl8xYW50Oworc3RhdGljIHN0cnVjdCBjb2V4X3N0YV84NzIzYl8xYW50IGdsY29leF9zdGFfODcyM2JfMWFudDsKK3N0YXRpYyBzdHJ1Y3QgY29leF9zdGFfODcyM2JfMWFudCAqY29leF9zdGEgPSAmZ2xjb2V4X3N0YV84NzIzYl8xYW50OworCitjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzg3MjNiMUFudFtdPXsKKwkiQlQgSW5mb1t3aWZpIGZ3XSIsCisJIkJUIEluZm9bYnQgcnNwXSIsCisJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKK307CisKK3UzMiBnbGNvZXhfdmVyX2RhdGVfODcyM2JfMWFudCA9IDIwMTMwOTA2OwordTMyIGdsY29leF92ZXJfODcyM2JfMWFudCA9IDB4NDU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxvY2FsIGZ1bmN0aW9uIHByb3RvIHR5cGUgaWYgbmVlZGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBoYWxidGM4NzIzYjFhbnRfCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUodTggbGV2ZWxfbnVtLCB1OCByc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKQoreworCXMzMiBidF9yc3NpPTA7CisJdTggYnRfcnNzaV9zdGF0ZSA9IGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZTsKKworCWJ0X3Jzc2kgPSBjb2V4X3N0YS0+YnRfcnNzaTsKKworCWlmIChsZXZlbF9udW0gPT0gMil7CisJCWlmICgoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCQlpZiAoYnRfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQl8xQU5UKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJ0X3Jzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBIaWdoXG4iKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobGV2ZWxfbnVtID09IDMpIHsKKwkJaWYgKHJzc2lfdGhyZXNoID4gcnNzaV90aHJlc2gxKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIik7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCQl9CisKKwkJaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCWlmIChidF9yc3NpID49IHJzc2lfdGhyZXNoICsKKwkJCQkJQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzFBTlQpIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSAiCisJCQkJCSAgInN3aXRjaCB0byBNZWRpdW1cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0KKwkJCQkJQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJICAoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09CisJCQkgIAkJQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCQlpZiAoYnRfcnNzaSA+PSByc3NpX3RocmVzaDEgKworCQkJCQlCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0JfMUFOVCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSAiCisJCQkJCSAgInN3aXRjaCB0byBIaWdoXG4iKTsKKwkJCX0gZWxzZSBpZiAoYnRfcnNzaSA8IHJzc2lfdGhyZXNoKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSAiCisJCQkJCSAgInN0YXkgYXQgTWVkaXVtXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChidF9yc3NpIDwgcnNzaV90aHJlc2gxKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTWVkaXVtXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IEhpZ2hcbiIpOworCQkJfQorCQl9CisJfQorCisJY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID0gYnRfcnNzaV9zdGF0ZTsKKworCXJldHVybiBidF9yc3NpX3N0YXRlOworfQorCit1OCBoYWxidGM4NzIzYjFhbnRfd2lmaV9yc3NpX3N0YXRlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIHU4IGluZGV4LCB1OCBsZXZlbF9udW0sCisJCQkJICAgdTggcnNzaV90aHJlc2gsIHU4IHJzc2lfdGhyZXNoMSkKK3sKKwlzMzIgd2lmaV9yc3NpPTA7CisJdTggd2lmaV9yc3NpX3N0YXRlID0gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpX3Jzc2kpOworCisJaWYgKGxldmVsX251bSA9PSAyKSB7CisJCWlmICgoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09CisJCQkJCUJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJICAgIAkJCUJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYgKHdpZmlfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQl8xQU5UKSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gSGlnaFxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN0YXkgYXQgTG93XG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh3aWZpX3Jzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN0YXkgYXQgSGlnaFxuIik7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGxldmVsX251bSA9PSAzKSB7CisJCWlmIChyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHRocmVzaCBlcnJvciEhXG4iKTsKKwkJCXJldHVybiBjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF07CisJCX0KKworCQlpZiAoKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkJCQkJQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkgICAgCQkJCUJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYgKHdpZmlfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJCSBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0JfMUFOVCkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTWVkaXVtXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJCQkJCUJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCSAgIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJCQkJCUJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQkJaWYgKHdpZmlfcnNzaSA+PSByc3NpX3RocmVzaDEgKworCQkJCQkgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzFBTlQpIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN3aXRjaCB0byBIaWdoXG4iKTsKKwkJCX0gZWxzZSBpZiAod2lmaV9yc3NpIDwgcnNzaV90aHJlc2gpIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN0YXkgYXQgTWVkaXVtXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh3aWZpX3Jzc2kgPCByc3NpX3RocmVzaDEpIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIE1lZGl1bVxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IEhpZ2hcbiIpOworCQkJfQorCQl9CisJfQorCisJY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID0gd2lmaV9yc3NpX3N0YXRlOworCisJcmV0dXJuIHdpZmlfcnNzaV9zdGF0ZTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfdXBkYXRlcmFfbWFzayhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICBib29sIGZvcmNlX2V4ZWMsIHUzMiBkaXNfcmF0ZV9tYXNrKQoreworCWNvZXhfZG0tPmN1cnJhX21hc2sgPSBkaXNfcmF0ZV9tYXNrOworCisJaWYgKGZvcmNlX2V4ZWMgfHwgKGNvZXhfZG0tPnByZXJhX21hc2sgIT0gY29leF9kbS0+Y3VycmFfbWFzaykpCisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX1VQREFURV9yYV9tYXNrLAorCQkJCSAgICZjb2V4X2RtLT5jdXJyYV9tYXNrKTsKKworCWNvZXhfZG0tPnByZXJhX21hc2sgPSBjb2V4X2RtLT5jdXJyYV9tYXNrOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hdXRvX3JhdGVfZmFsbGJhY2tfcmV0cnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgIGJvb2wgZm9yY2VfZXhlYywgdTggdHlwZSkKK3sKKwlib29sIHdpZmlfdW5kZXJfYm1vZGUgPSBmYWxzZTsKKworCWNvZXhfZG0tPmN1cl9hcmZyX3R5cGUgPSB0eXBlOworCisJaWYgKGZvcmNlX2V4ZWMgfHwgKGNvZXhfZG0tPnByZV9hcmZyX3R5cGUgIT0gY29leF9kbS0+Y3VyX2FyZnJfdHlwZSkpIHsKKwkJc3dpdGNoIChjb2V4X2RtLT5jdXJfYXJmcl90eXBlKSB7CisJCWNhc2UgMDoJLyogbm9ybWFsIG1vZGUgKi8KKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0MzAsCisJCQkJCQkgICBjb2V4X2RtLT5iYWNrdXBfYXJmcl9jbnQxKTsKKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0MzQsCisJCQkJCQkgICBjb2V4X2RtLT5iYWNrdXBfYXJmcl9jbnQyKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LAorCQkJCQkgICBCVENfR0VUX0JMX1dJRklfVU5ERVJfQl9NT0RFLAorCQkJCQkgICAmd2lmaV91bmRlcl9ibW9kZSk7CisJCQlpZiAod2lmaV91bmRlcl9ibW9kZSkgeworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAweDQzMCwgMHgwKTsKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsCisJCQkJCQkJICAgMHg0MzQsIDB4MDEwMTAxMDEpOworCQkJfSBlbHNlIHsKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsCisJCQkJCQkJICAgMHg0MzAsIDB4MCk7CisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgIDB4NDM0LCAweDA0MDMwMjAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwljb2V4X2RtLT5wcmVfYXJmcl90eXBlID0gY29leF9kbS0+Y3VyX2FyZnJfdHlwZTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfcmV0cnlfbGltaXQoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJIGJvb2wgZm9yY2VfZXhlYywgdTggdHlwZSkKK3sKKwljb2V4X2RtLT5jdXJfcmV0cnlfbGltaXRfdHlwZSA9IHR5cGU7CisKKwlpZiAoZm9yY2VfZXhlYyB8fCAoY29leF9kbS0+cHJlX3JldHJ5X2xpbWl0X3R5cGUgIT0KKwkJCSAgIGNvZXhfZG0tPmN1cl9yZXRyeV9saW1pdF90eXBlKSkgeworCisJCXN3aXRjaCAoY29leF9kbS0+Y3VyX3JldHJ5X2xpbWl0X3R5cGUpIHsKKwkJY2FzZSAwOgkvKiBub3JtYWwgbW9kZSAqLworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUoYnRjb2V4aXN0LCAweDQyYSwKKwkJCQkJCSAgIGNvZXhfZG0tPmJhY2t1cF9yZXRyeV9saW1pdCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiByZXRyeSBsaW1pdD04ICovCisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4NDJhLCAweDA4MDgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWNvZXhfZG0tPnByZV9yZXRyeV9saW1pdF90eXBlID0gY29leF9kbS0+Y3VyX3JldHJ5X2xpbWl0X3R5cGU7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FtcGR1X21heHRpbWUoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgYm9vbCBmb3JjZV9leGVjLCB1OCB0eXBlKQoreworCWNvZXhfZG0tPmN1cl9hbXBkdV90aW1lX3R5cGUgPSB0eXBlOworCisJaWYgKGZvcmNlX2V4ZWMgfHwgKGNvZXhfZG0tPnByZV9hbXBkdV90aW1lX3R5cGUgIT0KKwkJY29leF9kbS0+Y3VyX2FtcGR1X3RpbWVfdHlwZSkpIHsKKwkJc3dpdGNoIChjb2V4X2RtLT5jdXJfYW1wZHVfdGltZV90eXBlKSB7CisJCQljYXNlIDA6CS8qIG5vcm1hbCBtb2RlICovCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDQ1NiwKKwkJCQkJCWNvZXhfZG0tPmJhY2t1cF9hbXBkdV9tYXhfdGltZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CS8qIEFNUERVIHRpbXcgPSAweDM4ICogMzJ1cyAqLworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAweDQ1NiwgMHgzOCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCisJY29leF9kbS0+cHJlX2FtcGR1X3RpbWVfdHlwZSA9IGNvZXhfZG0tPmN1cl9hbXBkdV90aW1lX3R5cGU7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2xpbWl0ZWRfdHgoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJYm9vbCBmb3JjZV9leGVjLCB1OCByYV9tYXNrVHlwZSwgdTggYXJmcl90eXBlLAorCQkJCXU4IHJldHJ5X2xpbWl0X3R5cGUsIHU4IGFtcGR1X3RpbWVfdHlwZSkKK3sKKwlzd2l0Y2ggKHJhX21hc2tUeXBlKSB7CisJY2FzZSAwOgkvKiBub3JtYWwgbW9kZSAqLworCQloYWxidGM4NzIzYjFhbnRfdXBkYXRlcmFfbWFzayhidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4MCk7CisJCWJyZWFrOworCWNhc2UgMToJLyogZGlzYWJsZSBjY2sgMS8yICovCisJCWhhbGJ0Yzg3MjNiMWFudF91cGRhdGVyYV9tYXNrKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywKKwkJCQkJICAgICAgMHgwMDAwMDAwMyk7CisJCWJyZWFrOworCS8qIGRpc2FibGUgY2NrIDEvMi81LjUsIG9mZG0gNi85LzEyLzE4LzI0LCBtY3MgMC8xLzIvMy80Ki8KKwljYXNlIDI6CisJCWhhbGJ0Yzg3MjNiMWFudF91cGRhdGVyYV9tYXNrKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywKKwkJCQkJICAgICAgMHgwMDAxZjFmNyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWhhbGJ0Yzg3MjNiMWFudF9hdXRvX3JhdGVfZmFsbGJhY2tfcmV0cnkoYnRjb2V4aXN0LCBmb3JjZV9leGVjLAorCQkJCQkJIGFyZnJfdHlwZSk7CisJaGFsYnRjODcyM2IxYW50X3JldHJ5X2xpbWl0KGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgcmV0cnlfbGltaXRfdHlwZSk7CisJaGFsYnRjODcyM2IxYW50X2FtcGR1X21heHRpbWUoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCBhbXBkdV90aW1lX3R5cGUpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9saW1pdGVkX3J4KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCWJvb2wgZm9yY2VfZXhlYywgYm9vbCByZWpfYXBfYWdnX3BrdCwKKwkJCQlib29sIGJfYnRfY3RybF9hZ2dfYnVmX3NpemUsIHU4IGFnZ19idWZfc2l6ZSkKK3sKKwlib29sIHJlamVjdF9yeF9hZ2cgPSByZWpfYXBfYWdnX3BrdDsKKwlib29sIGJ0X2N0cmxfcnhfYWdnX3NpemUgPSBiX2J0X2N0cmxfYWdnX2J1Zl9zaXplOworCXU4IHJ4QWdnU2l6ZSA9IGFnZ19idWZfc2l6ZTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJUnggQWdncmVnYXRpb24gcmVsYXRlZCBzZXR0aW5nCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9UT19SRUpfQVBfQUdHX1BLVCwKKwkJCSAgICZyZWplY3RfcnhfYWdnKTsKKwkvKiBkZWNpZGUgQlQgY29udHJvbCBhZ2dyZWdhdGlvbiBidWYgc2l6ZSBvciBub3QgICovCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9DVFJMX0FHR19TSVpFLAorCQkJICAgJmJ0X2N0cmxfcnhfYWdnX3NpemUpOworCS8qIGFnZ3JlZ2F0aW9uIGJ1ZiBzaXplLCBvbmx5IHdvcmsKKwkgKndoZW4gQlQgY29udHJvbCBSeCBhZ2dyZWdhdGlvbiBzaXplLiAgKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxX0FHR19CVUZfU0laRSwgJnJ4QWdnU2l6ZSk7CisJLyogcmVhbCB1cGRhdGUgYWdncmVnYXRpb24gc2V0dGluZyAgKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9BR0dSRUdBVEVfQ1RSTCwgTlVMTCk7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X21vbml0b3JfYnRfY3RyKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXUzMiByZWdfaHBfdHhyeCwgcmVnX2xwX3R4cngsIHUzMnRtcDsKKwl1MzIgcmVnX2hwX3R4ID0gMCwgcmVnX2hwX3J4ID0gMDsKKwl1MzIgcmVnX2xwX3R4ID0gMCwgcmVnX2xwX3J4ID0gMDsKKworCXJlZ19ocF90eHJ4ID0gMHg3NzA7CisJcmVnX2xwX3R4cnggPSAweDc3NDsKKworCXUzMnRtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfaHBfdHhyeCk7CisJcmVnX2hwX3R4ID0gdTMydG1wICYgTUFTS0xXT1JEOworCXJlZ19ocF9yeCA9ICh1MzJ0bXAgJiBNQVNLSFdPUkQpID4+IDE2OworCisJdTMydG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIHJlZ19scF90eHJ4KTsKKwlyZWdfbHBfdHggPSB1MzJ0bXAgJiBNQVNLTFdPUkQ7CisJcmVnX2xwX3J4ID0gKHUzMnRtcCAmIE1BU0tIV09SRCkgPj4gMTY7CisKKwljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCA9IHJlZ19ocF90eDsKKwljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9IHJlZ19ocF9yeDsKKwljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4ID0gcmVnX2xwX3R4OworCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfcnggPSByZWdfbHBfcng7CisKKwkvKiByZXNldCBjb3VudGVyICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHhjKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfcXVlcnlfYnRfaW5mbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID0gezB9OworCisJY29leF9zdGEtPmMyaF9idF9pbmZvX3JlcV9zZW50ID0gdHJ1ZTsKKworCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUMDsJLyogdHJpZ2dlciovCisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIFF1ZXJ5IEJ0IEluZm8sIEZXIHdyaXRlIDB4NjE9MHgleFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MSwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK2Jvb2wgaGFsYnRjODcyM2IxYW50X2lzX3dpZmlfc3RhdHVzX2NoYW5nZWQoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RhdGljIGJvb2wgcHJlX3dpZmlfYnVzeSA9IGZhbHNlOworCXN0YXRpYyBib29sIHByZV91bmRlcl80d2F5ID0gZmFsc2UsIHByZV9idF9oc19vbiA9IGZhbHNlOworCWJvb2wgd2lmaV9idXN5ID0gZmFsc2UsIHVuZGVyXzR3YXkgPSBmYWxzZSwgYnRfaHNfb24gPSBmYWxzZTsKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELAorCQkJICAgJndpZmlfY29ubmVjdGVkKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisgCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV80X1dBWV9QUk9HUkVTUywKKwkJCSAgICZ1bmRlcl80d2F5KTsKKworCWlmICh3aWZpX2Nvbm5lY3RlZCkgeworCQlpZiAod2lmaV9idXN5ICE9IHByZV93aWZpX2J1c3kpIHsKKwkJCXByZV93aWZpX2J1c3kgPSB3aWZpX2J1c3k7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAodW5kZXJfNHdheSAhPSBwcmVfdW5kZXJfNHdheSkgeworCQkJcHJlX3VuZGVyXzR3YXkgPSB1bmRlcl80d2F5OworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGJ0X2hzX29uICE9IHByZV9idF9oc19vbikgeworCQkJcHJlX2J0X2hzX29uID0gYnRfaHNfb247CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfdXBkYXRlX2J0X2xpbmtfaW5mbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCWJvb2wgYnRfaHNfb24gPSBmYWxzZTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCisJYnRfbGlua19pbmZvLT5idF9saW5rX2V4aXN0ID0gY29leF9zdGEtPmJ0X2xpbmtfZXhpc3Q7CisJYnRfbGlua19pbmZvLT5zY29fZXhpc3QgPSBjb2V4X3N0YS0+c2NvX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCA9IGNvZXhfc3RhLT5hMmRwX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ID0gY29leF9zdGEtPnBhbl9leGlzdDsKKwlidF9saW5rX2luZm8tPmhpZF9leGlzdCA9IGNvZXhfc3RhLT5oaWRfZXhpc3Q7CisKKwkvKiB3b3JrIGFyb3VuZCBmb3IgSFMgbW9kZS4gKi8KKwlpZiAoYnRfaHNfb24pIHsKKwkJYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgPSB0cnVlOworCQlidF9saW5rX2luZm8tPmJ0X2xpbmtfZXhpc3QgPSB0cnVlOworCX0KKworCS8qIGNoZWNrIGlmIFNjbyBvbmx5ICovCisJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmhpZF9leGlzdCkKKwkJYnRfbGlua19pbmZvLT5zY29fb25seSA9IHRydWU7CisJZWxzZQorCQlidF9saW5rX2luZm8tPnNjb19vbmx5ID0gZmFsc2U7CisKKwkvKiBjaGVjayBpZiBBMmRwIG9ubHkgKi8KKwlpZiAoIWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ICYmIGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCAmJgorCSAgICAhYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYgIWJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQlidF9saW5rX2luZm8tPmEyZHBfb25seSA9IHRydWU7CisJZWxzZQorCQlidF9saW5rX2luZm8tPmEyZHBfb25seSA9IGZhbHNlOworCisJLyogY2hlY2sgaWYgUGFuIG9ubHkgKi8KKwlpZiAoIWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgJiYKKwkgICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYgIWJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQlidF9saW5rX2luZm8tPnBhbl9vbmx5ID0gdHJ1ZTsKKwllbHNlCisJCWJ0X2xpbmtfaW5mby0+cGFuX29ubHkgPSBmYWxzZTsKKworCS8qIGNoZWNrIGlmIEhpZCBvbmx5ICovCisJaWYgKCFidF9saW5rX2luZm8tPnNjb19leGlzdCAmJiAhYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmCisJICAgICFidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJiBidF9saW5rX2luZm8tPmhpZF9leGlzdCApCisJCWJ0X2xpbmtfaW5mby0+aGlkX29ubHkgPSB0cnVlOworCWVsc2UKKwkJYnRfbGlua19pbmZvLT5oaWRfb25seSA9IGZhbHNlOworfQorCit1OCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX2FsZ29yaXRobShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCWJvb2wgYnRfaHNfb24gPSBmYWxzZTsKKwl1OCBhbGdvcml0aG0gPSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19VTkRFRklORUQ7CisJdTggbnVtT2ZEaWZmUHJvZmlsZSA9IDA7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKKworCWlmICghYnRfbGlua19pbmZvLT5idF9saW5rX2V4aXN0KSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBObyBCVCBsaW5rIGV4aXN0cyEhIVxuIik7CisJCXJldHVybiBhbGdvcml0aG07CisJfQorCisJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KQorCQludW1PZkRpZmZQcm9maWxlKys7CisJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KQorCQludW1PZkRpZmZQcm9maWxlKys7CisJaWYgKGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0KQorCQludW1PZkRpZmZQcm9maWxlKys7CisJaWYgKGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkKKwkJbnVtT2ZEaWZmUHJvZmlsZSsrOworCisJaWYgKG51bU9mRGlmZlByb2ZpbGUgPT0gMSkgeworCQlpZiAoYnRfbGlua19pbmZvLT5zY29fZXhpc3QpIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9IFNDTyBvbmx5XG4iKTsKKwkJCWFsZ29yaXRobSA9IEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX1NDTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSBISUQgb25seVxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEOworCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gQTJEUCBvbmx5XG4iKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19BMkRQOworCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCkgeworCQkJCWlmIChidF9oc19vbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9ICIKKwkJCQkJCSAgIlBBTihIUykgb25seVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCQlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19QQU5IUzsKKwkJCQl9IGVsc2UgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9ICIKKwkJCQkJCSAgIlBBTihFRFIpIG9ubHlcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobnVtT2ZEaWZmUHJvZmlsZSA9PSAyKSB7CisJCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9IFNDTyArIEhJRFxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEOworCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkgICJTQ08gKyBBMkRQID09PiBTQ09cbiIpOworCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX1NDTzsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgIgorCQkJCQkJICAiPSBTQ08gKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fU0NPOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlICIKKwkJCQkJCSAgIj0gU0NPICsgUEFOKEVEUilcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkgICJISUQgKyBBMkRQXG4iKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQkgICBidF9saW5rX2luZm8tPnBhbl9leGlzdCkgeworCQkJCWlmIChidF9oc19vbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9ICIKKwkJCQkJCSAgIkhJRCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSAiCisJCQkJCQkgICJISUQgKyBQQU4oRURSKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCQkgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSAiCisJCQkJCQkgICJBMkRQICsgUEFOKEhTKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkJICAiQTJEUCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobnVtT2ZEaWZmUHJvZmlsZSA9PSAzKSB7CisJCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUHJvZmlsZSA9ICIKKwkJCQkJICAiU0NPICsgSElEICsgQTJEUCA9PT4gSElEXG4iKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkJICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSAiCisJCQkJCQkgICJTQ08gKyBISUQgKyBQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkJICAiU0NPICsgSElEICsgUEFOKEVEUilcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmCisJCQkJICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJaWYgKGJ0X2hzX29uKSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkJICAiU0NPICsgQTJEUCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19TQ087CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSBTQ08gKyAiCisJCQkJCQkgICJBMkRQICsgUEFOKEVEUikgPT0+IEhJRFxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCAmJgorCQkJICAgIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJaWYgKGJ0X2hzX29uKSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBCVCBQcm9maWxlID0gIgorCQkJCQkJICAiSElEICsgQTJEUCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSAiCisJCQkJCQkgICJISUQgKyBBMkRQICsgUEFOKEVEUilcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobnVtT2ZEaWZmUHJvZmlsZSA+PSAzKSB7CisJCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEVycm9yISEhICIKKwkJCQkJCSAgIkJUIFByb2ZpbGUgPSBTQ08gKyAiCisJCQkJCQkgICJISUQgKyBBMkRQICsgUEFOKEhTKVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEJUIFByb2ZpbGUgPSAiCisJCQkJCQkgICJTQ08gKyBISUQgKyBBMkRQICsgUEFOKEVEUikiCisJCQkJCQkgICI9PT5QQU4oRURSKStISURcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYWxnb3JpdGhtOworfQorCitib29sIGhhbGJ0Yzg3MjNiMWFudF9uZWVkX3RvX2RlY19idF9wd3Ioc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlib29sIGJ0X2hzX29uID0gZmFsc2UsIHdpZmlfY29ubmVjdGVkID0gZmFsc2U7CisJczMyIGJ0X2hzX3Jzc2kgPSAwOworCXU4IGJ0X3Jzc2lfc3RhdGU7CisKKwlpZiAoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELAorCQkJCSZ3aWZpX2Nvbm5lY3RlZCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgMzUsIDApOworCisJaWYgKHdpZmlfY29ubmVjdGVkKSB7CisJCWlmIChidF9oc19vbikgeworCQkJaWYgKGJ0X2hzX3Jzc2kgPiAzNykKKwkJCQlyZXQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJaWYgKChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkgICAgKGJ0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkKKwkJCQlyZXQgPSB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X2Z3X2RhY19zd2luZ19sZXZlbChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgIHU4IGRhY19zd2luZ19sdmwpCit7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9IHswfTsKKworCS8qIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKKwkgKiAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYgKi8KKwloMmNfcGFyYW1ldGVyWzBdID0gZGFjX3N3aW5nX2x2bDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNfc3dpbmdfbHZsKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjQ9MHgleFxuIiwgaDJjX3BhcmFtZXRlclswXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjQsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfZGVjX2J0X3B3cihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgICAgYm9vbCBkZWNfYnRfcHdyKQoreworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPSB7MH07CisKKwloMmNfcGFyYW1ldGVyWzBdID0gMDsKKworCWlmIChkZWNfYnRfcHdyKQorCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVDE7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXMsIEZXIHdyaXRlIDB4NjI9MHgleFxuIiwKKwkJICAoZGVjX2J0X3B3cj8gIlllcyEhIjoiTm8hISIpLGgyY19wYXJhbWV0ZXJbMF0pOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYyLCAxLCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQlib29sIGZvcmNlX2V4ZWMsIGJvb2wgZGVjX2J0X3B3cikKK3sKKwlyZXR1cm47CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgJXMgRGVjIEJUIHBvd2VyID0gJXNcbiIsCisJCSAgKGZvcmNlX2V4ZWMgPyAiZm9yY2UgdG8iIDogIiIpLCAoZGVjX2J0X3B3ciA/ICJPTiIgOiAiT0ZGIikpOworCWNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyID0gZGVjX2J0X3B3cjsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVEZWNCdFB3cj0lZCwgYkN1ckRlY0J0UHdyPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOworCisJCWlmIChjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciA9PSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IxYW50X3NldF9md19kZWNfYnRfcHdyKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOworCisJY29leF9kbS0+cHJlX2RlY19idF9wd3IgPSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cjsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X2J0X2F1dG9fcmVwb3J0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQlib29sIGVuYWJsZV9hdXRvX3JlcG9ydCkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID0gezB9OworCisJaDJjX3BhcmFtZXRlclswXSA9IDA7CisKKwlpZiAoZW5hYmxlX2F1dG9fcmVwb3J0KQorCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEJUIEZXIGF1dG8gcmVwb3J0IDogJXMsIEZXIHdyaXRlIDB4Njg9MHgleFxuIiwKKwkJICAoZW5hYmxlX2F1dG9fcmVwb3J0PyAiRW5hYmxlZCEhIjoiRGlzYWJsZWQhISIpLAorCQkgIGgyY19wYXJhbWV0ZXJbMF0pOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY4LCAxLCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYnRfYXV0b19yZXBvcnQoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBlbmFibGVfYXV0b19yZXBvcnQpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgJXMgQlQgQXV0byByZXBvcnQgPSAlc1xuIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksCisJCSAgKChlbmFibGVfYXV0b19yZXBvcnQpPyAiRW5hYmxlZCI6IkRpc2FibGVkIikpOworCWNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCA9IGVuYWJsZV9hdXRvX3JlcG9ydDsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVCdEF1dG9SZXBvcnQ9JWQsICIKKwkJCSAgImJDdXJCdEF1dG9SZXBvcnQ9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9idF9hdXRvX3JlcG9ydCwKKwkJCSAgY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0KTsKKworCQlpZiAoY29leF9kbS0+cHJlX2J0X2F1dG9fcmVwb3J0ID09IGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IxYW50X3NldF9idF9hdXRvX3JlcG9ydChidGNvZXhpc3QsCisJCQkJCSAgIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCk7CisKKwljb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQgPSBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQ7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICAgYm9vbCBmb3JjZV9leGVjLCB1OCBmd19kYWNfc3dpbmdfbHZsKQoreworCXJldHVybjsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd19kYWNfc3dpbmdfbHZsKTsKKwljb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bCA9IGZ3X2RhY19zd2luZ19sdmw7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCAiCisJCQkgICJjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCwKKwkJCSAgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpOworCisJCWlmIChjb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCA9PQorCQkgICAgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpCisJCQlyZXR1cm47CisJfQorCisJaGFsYnRjODcyM2IxYW50X3NldF9md19kYWNfc3dpbmdfbGV2ZWwoYnRjb2V4aXN0LAorCQkJCQkgICAgICAgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpOworCisJY29leF9kbS0+cHJlX2Z3X2RhY19zd2luZ19sdmwgPSBjb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bDsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgYm9vbCByeF9yZl9zaHJpbmtfb24pCit7CisJaWYgKHJ4X3JmX3Nocmlua19vbikgeworCQkvKlNocmluayBSRiBSeCBMUEYgY29ybmVyICovCisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsCisJCQkJCSAgMHhmZmZmZiwgMHhmZmZmNyk7CisJfSBlbHNlIHsKKwkJLypSZXN1bWUgUkYgUnggTFBGIGNvcm5lcgorCQkgKiBBZnRlciBpbml0aWFsaXplZCwgd2UgY2FuIHVzZSBjb2V4X2RtLT5idFJmMHgxZUJhY2t1cCAqLworCQlpZiAoYnRjb2V4aXN0LT5pbml0aWxpemVkKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCQkgICJbQlRDb2V4XSwgUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIhIVxuIik7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsCisJCQkJCQkgIDB4MWUsIDB4ZmZmZmYsCisJCQkJCQkgIGNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXApOworCQl9CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9yZl9zaHJpbmsoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkgICAgICAgYm9vbCBmb3JjZV9leGVjLCBib29sIHJ4X3JmX3Nocmlua19vbikKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csCisJCSAgIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwKKwkJICAoKHJ4X3JmX3Nocmlua19vbik/ICJPTiI6Ik9GRiIpKTsKKwljb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluayA9IHJ4X3JmX3Nocmlua19vbjsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCAiCisJCQkgICJiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmssCisJCQkgIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKTsKKworCQlpZiAoY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmsgPT0KKwkJICAgIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjFhbnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoYnRjb2V4aXN0LAorCQkJCQkJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmspOworCisJY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmsgPSBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluazsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X3N3X3BlbmFsdHlfdHhfcmF0ZV9hZGFwdGl2ZSgKKwkJCQkJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCWJvb2wgbG93X3BlbmFsdHlfcmEpCit7CisJdTggaDJjX3BhcmFtZXRlcls2XSA9IHswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSAweDY7CS8qIG9wQ29kZSwgMHg2PSBSZXRyeV9QZW5hbHR5ICovCisKKwlpZiAobG93X3BlbmFsdHlfcmEpIHsKKwkJaDJjX3BhcmFtZXRlclsxXSB8PSBCSVQwOworCQkvKm5vcm1hbCByYXRlIGV4Y2VwdCBNQ1M3LzYvNSwgT0ZETTU0LzQ4LzM2ICovCisJCWgyY19wYXJhbWV0ZXJbMl0gPSAweDAwOworCQloMmNfcGFyYW1ldGVyWzNdID0gMHhmNzsgIC8qTUNTNyBvciBPRkRNNTQgKi8KKwkJaDJjX3BhcmFtZXRlcls0XSA9IDB4Zjg7ICAvKk1DUzYgb3IgT0ZETTQ4ICovCisJCWgyY19wYXJhbWV0ZXJbNV0gPSAweGY5OyAgLypNQ1M1IG9yIE9GRE0zNiAqLworCX0KKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IFdpRmkgTG93LVBlbmFsdHkgUmV0cnk6ICVzIiwKKwkJICAobG93X3BlbmFsdHlfcmEgPyAiT04hISIgOiAiT0ZGISEiKSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjksIDYsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9sb3dfcGVuYWx0eV9yYShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgYm9vbCBmb3JjZV9leGVjLCBib29sIGxvd19wZW5hbHR5X3JhKQoreworCWNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSA9IGxvd19wZW5hbHR5X3JhOworCisJaWYgKCFmb3JjZV9leGVjKSB7CisJCWlmIChjb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEgPT0gY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjFhbnRfc2V0X3N3X3BlbmFsdHlfdHhfcmF0ZV9hZGFwdGl2ZShidGNvZXhpc3QsCisJCQkJCQljb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmEpOworCisJY29leF9kbS0+cHJlX2xvd19wZW5hbHR5X3JhID0gY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9zZXRfZGFjX3N3aW5nX3JlZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTMyIGxldmVsKQoreworCXU4IHZhbCA9ICh1OCkgbGV2ZWw7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJICAiW0JUQ29leF0sIFdyaXRlIFN3RGFjU3dpbmcgPSAweCV4XG4iLCBsZXZlbCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4ODgzLCAweDNlLCB2YWwpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9zZXRfc3dfZnVsbF90aW1lX2RhY19zd2luZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJCWJvb2wgc3dfZGFjX3N3aW5nX29uLAorCQkJCQkJdTMyIHN3X2RhY19zd2luZ19sdmwpCit7CisJaWYgKHN3X2RhY19zd2luZ19vbikKKwkJaGFsYnRjODcyM2IxYW50X3NldF9kYWNfc3dpbmdfcmVnKGJ0Y29leGlzdCwgc3dfZGFjX3N3aW5nX2x2bCk7CisJZWxzZQorCQloYWxidGM4NzIzYjFhbnRfc2V0X2RhY19zd2luZ19yZWcoYnRjb2V4aXN0LCAweDE4KTsKK30KKworCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9kYWNfc3dpbmcoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIGJvb2wgZm9yY2VfZXhlYywKKwkJCSAgICAgICBib29sIGRhY19zd2luZ19vbiwgdTMyIGRhY19zd2luZ19sdmwpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nX2x2bD0weCV4XG4iLAorCQkgIChmb3JjZV9leGVjID8gImZvcmNlIHRvIiA6ICIiKSwgKGRhY19zd2luZ19vbiA/ICJPTiIgOiAiT0ZGIiksCisJCSAgZGFjX3N3aW5nX2x2bCk7CisKKwljb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uID0gZGFjX3N3aW5nX29uOworCWNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsID0gZGFjX3N3aW5nX2x2bDsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVEYWNTd2luZ09uPSVkLCBwcmVEYWNTd2luZ0x2bD0weCV4LCAiCisJCQkgICJiQ3VyRGFjU3dpbmdPbj0lZCwgY3VyRGFjU3dpbmdMdmw9MHgleFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX2RhY19zd2luZ19vbiwgY29leF9kbS0+cHJlX2RhY19zd2luZ19sdmwsCisJCQkgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sCisJCQkgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsKTsKKworCQlpZiAoKGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24gPT0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbikgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9PSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCkpCisJCQlyZXR1cm47CisJfQorCW1kZWxheSgzMCk7CisJaGFsYnRjODcyM2IxYW50X3NldF9zd19mdWxsX3RpbWVfZGFjX3N3aW5nKGJ0Y29leGlzdCwgZGFjX3N3aW5nX29uLAorCQkJCQkJICAgZGFjX3N3aW5nX2x2bCk7CisKKwljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbjsKKwljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9zZXRfYWRjX2JhY2tvZmYoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICBib29sIGFkY19iYWNrb2ZmKQoreworCWlmIChhZGNfYmFja29mZikgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCSAgIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9uIVxuIik7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgzKTsKKwl9IGVsc2UgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCSAgIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9mZiFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg4ZGIsIDB4NjAsIDB4MSk7CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hZGNfYmFja29mZihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgYm9vbCBmb3JjZV9leGVjLCBib29sIGFkY19iYWNrb2ZmKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzIHR1cm4gQWRjQmFja09mZiA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjID8gImZvcmNlIHRvIiA6ICIiKSwgKGFkY19iYWNrb2ZmID8gIk9OIiA6ICJPRkYiKSk7CisJY29leF9kbS0+Y3VyX2FkY19iYWNrb2ZmID0gYWRjX2JhY2tvZmY7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9hZGNfYmFja29mZiwgY29leF9kbS0+Y3VyX2FkY19iYWNrb2ZmKTsKKworCQlpZihjb2V4X2RtLT5wcmVfYWRjX2JhY2tvZmYgPT0gY29leF9kbS0+Y3VyX2FkY19iYWNrb2ZmKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjFhbnRfc2V0X2FkY19iYWNrb2ZmKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2FkY19iYWNrb2ZmKTsKKworCWNvZXhfZG0tPnByZV9hZGNfYmFja29mZiA9CisJCWNvZXhfZG0tPmN1cl9hZGNfYmFja29mZjsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X2FnY190YWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICBib29sIGFkY190YWJsZV9lbikKK3sKKwl1OCByc3NpX2FkanVzdF92YWwgPSAwOworCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsCisJCUJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDAyMDAwKTsKKwlpZiAoYWRjX3RhYmxlX2VuKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsCisJCQkJCSAgMHhmZmZmZiwgMHgzZmE1OCk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwKKwkJCQkJICAweGZmZmZmLCAweDM3YTU4KTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLAorCQkJCQkgIDB4ZmZmZmYsIDB4MmZhNTgpOworCQlyc3NpX2FkanVzdF92YWwgPSA4OworCX0gZWxzZSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLAorCQkJCQkgIDB4ZmZmZmYsIDB4MzkyNTgpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsCisJCQkJCSAgMHhmZmZmZiwgMHgzMTI1OCk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwKKwkJCQkJICAweGZmZmZmLCAweDI5MjU4KTsKKwl9CisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDApOworCisJLyogc2V0IHJzc2lfYWRqdXN0X3ZhbCBmb3Igd2lmaSBtb2R1bGUuICovCisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SX0FHQ19UQUJMRV9PTiwKKwkJCSAgICZyc3NpX2FkanVzdF92YWwpOworfQorCisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FnY190YWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCSAgICAgICBib29sIGZvcmNlX2V4ZWMsIGJvb2wgYWRjX3RhYmxlX2VuKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzICVzIEFnYyBUYWJsZVxuIiwKKwkJICAoZm9yY2VfZXhlYyA/ICJmb3JjZSB0byIgOiAiIiksCisJCSAgKGFkY190YWJsZV9lbiA/ICJFbmFibGUiIDogIkRpc2FibGUiKSk7CisJY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbiA9IGFkY190YWJsZV9lbjsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiwKKwkJCSAgY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbik7CisKKwkJaWYoY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiA9PSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjFhbnRfc2V0X2FnY190YWJsZShidGNvZXhpc3QsIGFkY190YWJsZV9lbik7CisKKwljb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuID0gY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbjsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X2NvZXhfdGFibGUoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgIHUzMiB2YWwweDZjMCwgdTMyIHZhbDB4NmM0LAorCQkJCSAgICB1MzIgdmFsMHg2YzgsIHU4IHZhbDB4NmNjKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjMD0weCV4XG4iLCB2YWwweDZjMCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjMCwgdmFsMHg2YzApOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCSAgIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM0PTB4JXhcbiIsIHZhbDB4NmM0KTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmM0LCB2YWwweDZjNCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJICAiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Yzg9MHgleFxuIiwgdmFsMHg2YzgpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzgsIHZhbDB4NmM4KTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjYz0weCV4XG4iLCB2YWwweDZjYyk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDZjYywgdmFsMHg2Y2MpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorIAkJCQlib29sIGZvcmNlX2V4ZWMsIHUzMiB2YWwweDZjMCwKKyAJCQkJdTMyIHZhbDB4NmM0LCB1MzIgdmFsMHg2YzgsCisgCQkJCXU4IHZhbDB4NmNjKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwiCisJCSAgIiAweDZjND0weCV4LCAweDZjYz0weCV4XG4iLCAoZm9yY2VfZXhlYyA/ICJmb3JjZSB0byIgOiAiIiksCisJCSAgdmFsMHg2YzAsIHZhbDB4NmM0LCB2YWwweDZjYyk7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM0ID0gdmFsMHg2YzQ7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM4ID0gdmFsMHg2Yzg7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJaWYgKChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgorCQkgICAgKGNvZXhfZG0tPnByZV92YWwweDZjNCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzQpICYmCisJCSAgICAoY29leF9kbS0+cHJlX3ZhbDB4NmM4ID09IGNvZXhfZG0tPmN1cl92YWwweDZjOCkgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IxYW50X3NldF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgdmFsMHg2YzAsIHZhbDB4NmM0LAorCQkJCSAgICAgICB2YWwweDZjOCwgdmFsMHg2Y2MpOworCisJY29leF9kbS0+cHJlX3ZhbDB4NmMwID0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwOworCWNvZXhfZG0tPnByZV92YWwweDZjNCA9IGNvZXhfZG0tPmN1cl92YWwweDZjNDsKKwljb2V4X2RtLT5wcmVfdmFsMHg2YzggPSBjb2V4X2RtLT5jdXJfdmFsMHg2Yzg7CisJY29leF9kbS0+cHJlX3ZhbDB4NmNjID0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICBib29sIGZvcmNlX2V4ZWMsIHU4IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgorCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4NTU1NTU1NTUsIDB4ZmZmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDE6CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHg1NTU1NTU1NSwKKwkJCQkJICAgMHg1YTVhNWE1YSwgMHhmZmZmZmYsIDB4Myk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGUoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCAweDVhNWE1YTVhLAorCQkJCQkgICAweDVhNWE1YTVhLCAweGZmZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4YWFhYWFhYWEsIDB4ZmZmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHg1NTU1NTU1NSwKKwkJCQkJICAgMHg1YWFhNWFhYSwgMHhmZmZmZmYsIDB4Myk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGUoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCAweDVhNWE1YTVhLAorCQkJCQkgICAweGFhYWE1YTVhLCAweGZmZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4YWFhYTVhNWEsIDB4ZmZmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDc6CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHg1YWZhNWFmYSwKKwkJCQkJICAgMHg1YWZhNWFmYSwgMHhmZmZmZmYsIDB4Myk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQlib29sIGVuYWJsZSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID0gezB9OworCisJaWYgKGVuYWJsZSkKKwkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOwkvKiBmdW5jdGlvbiBlbmFibGUgKi8KKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IEZXIGZvciBCVCBJZ25vcmUgV2xhbl9BY3QsIgorCQkgICIgRlcgd3JpdGUgMHg2Mz0weCV4XG4iLCBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MywgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2lnbm9yZV93bGFuX2FjdChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBlbmFibGUpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBJZ25vcmUgV2xhbkFjdCAlc1xuIiwKKwkJICAoZm9yY2VfZXhlYyA/ICJmb3JjZSB0byIgOiAiIiksIChlbmFibGUgPyAiT04iIDogIk9GRiIpKTsKKwljb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0ID0gZW5hYmxlOworCisJaWYgKCFmb3JjZV9leGVjKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgIgorCQkJICAiYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0LAorCQkJICBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKKworCQlpZiAoY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCA9PQorCQkgICAgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IxYW50X1NldEZ3SWdub3JlV2xhbkFjdChidGNvZXhpc3QsIGVuYWJsZSk7CisKKwljb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0ID0gY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdDsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgIHU4IGJ5dGUxLCB1OCBieXRlMiwgdTggYnl0ZTMsCisJCQkJICAgIHU4IGJ5dGU0LCB1OCBieXRlNSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzVdID0gezB9OworCXU4IHJlYWxfYnl0ZTEgPSBieXRlMSwgcmVhbF9ieXRlNSA9IGJ5dGU1OworCWJvb2wgYXBfZW5hYmxlID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQVBfTU9ERV9FTkFCTEUsCisJCQkgICAmYXBfZW5hYmxlKTsKKworCWlmIChhcF9lbmFibGUpIHsKKwkJaWYgKChieXRlMSAmIEJJVDQpICYmICEoYnl0ZTEgJiBCSVQ1KSkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCQkgICJbQlRDb2V4XSwgRlcgZm9yIDFBbnQgQVAgbW9kZVxuIik7CisJCQlyZWFsX2J5dGUxICY9IH5CSVQ0OworCQkJcmVhbF9ieXRlMSB8PSBCSVQ1OworCisJCQlyZWFsX2J5dGU1IHw9IEJJVDU7CisJCQlyZWFsX2J5dGU1ICY9IH5CSVQ2OworCQl9CisJfQorCisJaDJjX3BhcmFtZXRlclswXSA9IHJlYWxfYnl0ZTE7CisJaDJjX3BhcmFtZXRlclsxXSA9IGJ5dGUyOworCWgyY19wYXJhbWV0ZXJbMl0gPSBieXRlMzsKKwloMmNfcGFyYW1ldGVyWzNdID0gYnl0ZTQ7CisJaDJjX3BhcmFtZXRlcls0XSA9IHJlYWxfYnl0ZTU7CisKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbMF0gPSByZWFsX2J5dGUxOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsxXSA9IGJ5dGUyOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSA9IGJ5dGUzOworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVszXSA9IGJ5dGU0OworCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVs0XSA9IHJlYWxfYnl0ZTU7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIFBTLVRETUEgSDJDIGNtZCA9MHgleCUwOHhcbiIsCisJCSAgaDJjX3BhcmFtZXRlclswXSwKKwkJICBoMmNfcGFyYW1ldGVyWzFdIDw8IDI0IHwKKwkJICBoMmNfcGFyYW1ldGVyWzJdIDw8IDE2IHwKKwkJICBoMmNfcGFyYW1ldGVyWzNdIDw8IDggfAorCQkgIGgyY19wYXJhbWV0ZXJbNF0pOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYwLCA1LCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfU2V0THBzUnB3bShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQl1OCBscHNfdmFsLCB1OCBycHdtX3ZhbCkKK3sKKwl1OCBscHMgPSBscHNfdmFsOworCXU4IHJwd20gPSBycHdtX3ZhbDsKKworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfMUFOVF9MUFMsICZscHMpOworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfMUFOVF9SUFdNLCAmcnB3bSk7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X0xwc1Jwd20oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIGJvb2wgZm9yY2VfZXhlYywKKwkJCSAgICAgdTggbHBzX3ZhbCwgdTggcnB3bV92YWwpCit7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyBzZXQgbHBzL3Jwd209MHgleC8weCV4IFxuIiwKKwkJICAoZm9yY2VfZXhlYyA/ICJmb3JjZSB0byIgOiAiIiksIGxwc192YWwsIHJwd21fdmFsKTsKKwljb2V4X2RtLT5jdXJfbHBzID0gbHBzX3ZhbDsKKwljb2V4X2RtLT5jdXJfcnB3bSA9IHJwd21fdmFsOworCisJaWYgKCFmb3JjZV9leGVjKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgTFBTLVJ4QmVhY29uTW9kZT0weCV4ICwgTFBTLVJQV009MHgleCEhXG4iLAorCQkJICBjb2V4X2RtLT5jdXJfbHBzLCBjb2V4X2RtLT5jdXJfcnB3bSk7CisKKwkJaWYgKChjb2V4X2RtLT5wcmVfbHBzID09IGNvZXhfZG0tPmN1cl9scHMpICYmCisJCSAgICAoY29leF9kbS0+cHJlX3Jwd20gPT0gY29leF9kbS0+Y3VyX3Jwd20pKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCSAgIltCVENvZXhdLCBMUFMtUlBXTV9MYXN0PTB4JXgiCisJCQkJICAiICwgTFBTLVJQV01fTm93PTB4JXghIVxuIiwKKwkJCQkgIGNvZXhfZG0tPnByZV9ycHdtLCBjb2V4X2RtLT5jdXJfcnB3bSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKwloYWxidGM4NzIzYjFhbnRfU2V0THBzUnB3bShidGNvZXhpc3QsIGxwc192YWwsIHJwd21fdmFsKTsKKworCWNvZXhfZG0tPnByZV9scHMgPSBjb2V4X2RtLT5jdXJfbHBzOworCWNvZXhfZG0tPnByZV9ycHdtID0gY29leF9kbS0+Y3VyX3Jwd207Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgYm9vbCBzaHJpbmtfcnhfbHBmLCBib29sIGxvd19wZW5hbHR5X3JhLAorCQkJCSAgIGJvb2wgbGltaXRlZF9kaWcsIGJvb2wgYnRfbG5hX2NvbnN0cmFpbikKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJICAiW0JUQ29leF0sIFNNMVtTaFJmLyBMcFJBLyBMaW1EaWcvIGJ0TG5hXSA9ICVkICVkICVkICVkXG4iLAorCQkgIHNocmlua19yeF9scGYsIGxvd19wZW5hbHR5X3JhLCBsaW1pdGVkX2RpZywgYnRfbG5hX2NvbnN0cmFpbik7CisKKwloYWxidGM4NzIzYjFhbnRfbG93X3BlbmFsdHlfcmEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgbG93X3BlbmFsdHlfcmEpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgYWdjX3RhYmxlX3NoaWZ0LCBib29sIGFkY19iYWNrb2ZmLAorCQkJCSAgIGJvb2wgc3dfZGFjX3N3aW5nLCB1MzIgZGFjX3N3aW5nX2x2bCkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJICAiW0JUQ29leF0sIFNNMltBZ2NULyBBZGNCLyBTd0RhY1N3aW5nKGx2bCldID0gJWQgJWQgJWRcbiIsCisJCSAgYWdjX3RhYmxlX3NoaWZ0LCBhZGNfYmFja29mZiwgc3dfZGFjX3N3aW5nKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfU2V0QW50UGF0aChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQl1OCBhbnRfcG9zX3R5cGUsIGJvb2wgaW5pdF9od19jZmcsCisJCQkJYm9vbCB3aWZpX29mZikKK3sKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKmJvYXJkX2luZm8gPSAmYnRjb2V4aXN0LT5ib2FyZF9pbmZvOworCXUzMiBmd192ZXIgPSAwLCB1MzJ0bXAgPSAwOworCWJvb2wgcGdfZXh0X3N3aXRjaCA9IGZhbHNlOworCWJvb2wgdXNlX2V4dF9zd2l0Y2ggPSBmYWxzZTsKKwl1OCBoMmNfcGFyYW1ldGVyWzJdID0gezB9OworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9FWFRfU1dJVENILCAmcGdfZXh0X3N3aXRjaCk7CisJLyogWzMxOjE2XT1mdyB2ZXIsIFsxNTowXT1mdyBzdWIgdmVyICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0ZXX1ZFUiwgJmZ3X3Zlcik7CisKKworCWlmICgoZndfdmVyIDwgMHhjMDAwMCkgfHwgcGdfZXh0X3N3aXRjaCkKKwkJdXNlX2V4dF9zd2l0Y2ggPSB0cnVlOworCisJaWYgKGluaXRfaHdfY2ZnKXsKKwkJLypCVCBzZWxlY3QgczAvczEgaXMgY29udHJvbGxlZCBieSBXaUZpICovCisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDY3LCAweDIwLCAweDEpOworCisJCS8qRm9yY2UgR05UX0JUIHRvIE5vcm1hbCAqLworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg3NjUsIDB4MTgsIDB4MCk7CisJfSBlbHNlIGlmICh3aWZpX29mZikgeworCQkvKkZvcmNlIEdOVF9CVCB0byBIaWdoICovCisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDc2NSwgMHgxOCwgMHgzKTsKKwkJLypCVCBzZWxlY3QgczAvczEgaXMgY29udHJvbGxlZCBieSBCVCAqLworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg2NywgMHgyMCwgMHgwKTsKKworCQkvKiAweDRjWzI0OjIzXT0wMCwgU2V0IEFudGVubmEgY29udHJvbCBieSBCVF9SRkVfQ1RSTAorCQkgKiBCVCBWZW5kb3IgMHhhYz0weGYwMDIgKi8KKwkJdTMydG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NGMpOworCQl1MzJ0bXAgJj0gfkJJVDIzOworCQl1MzJ0bXAgJj0gfkJJVDI0OworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NGMsIHUzMnRtcCk7CisJfQorCisJaWYgKHVzZV9leHRfc3dpdGNoKSB7CisJCWlmIChpbml0X2h3X2NmZykgeworCQkJLyogMHg0Y1syM109MCwgMHg0Y1syNF09MSAgQW50ZW5uYSBjb250cm9sIGJ5IFdML0JUICovCisJCQl1MzJ0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0Yyk7CisJCQl1MzJ0bXAgJj0gfkJJVDIzOworCQkJdTMydG1wIHw9IEJJVDI0OworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDRjLCB1MzJ0bXApOworCisJCQlpZiAoYm9hcmRfaW5mby0+YnRkbV9hbnRfcG9zID09CisJCQkgICAgQlRDX0FOVEVOTkFfQVRfTUFJTl9QT1JUKSB7CisJCQkJLyogTWFpbiBBbnQgdG8gIEJUIGZvciBJUFMgY2FzZSAweDRjWzIzXT0xICovCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsCisJCQkJCQkJCSAgIDB4NjQsIDB4MSwKKwkJCQkJCQkJICAgMHgxKTsKKworCQkJCS8qdGVsbCBmaXJtd2FyZSAibm8gYW50ZW5uYSBpbnZlcnNlIiovCisJCQkJaDJjX3BhcmFtZXRlclswXSA9IDA7CisJCQkJaDJjX3BhcmFtZXRlclsxXSA9IDE7ICAvKmV4dCBzd2l0Y2ggdHlwZSovCisJCQkJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY1LCAyLAorCQkJCQkJCWgyY19wYXJhbWV0ZXIpOworCQkJfSBlbHNlIHsKKwkJCQkvKkF1eCBBbnQgdG8gIEJUIGZvciBJUFMgY2FzZSAweDRjWzIzXT0xICovCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsCisJCQkJCQkJCSAgIDB4NjQsIDB4MSwKKwkJCQkJCQkJICAgMHgwKTsKKworCQkJCS8qdGVsbCBmaXJtd2FyZSAiYW50ZW5uYSBpbnZlcnNlIiovCisJCQkJaDJjX3BhcmFtZXRlclswXSA9IDE7CisJCQkJaDJjX3BhcmFtZXRlclsxXSA9IDE7ICAvKmV4dCBzd2l0Y2ggdHlwZSovCisJCQkJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY1LCAyLAorCQkJCQkJCWgyY19wYXJhbWV0ZXIpOworCQkJfQorCQl9CisKKwkJLyogZml4ZWQgaW50ZXJuYWwgc3dpdGNoIGZpcnN0Ki8KKwkJLyogZml4ZWQgaW50ZXJuYWwgc3dpdGNoIFMxLT5XaUZpLCBTMC0+QlQqLworCQlpZiAoYm9hcmRfaW5mby0+YnRkbV9hbnRfcG9zID09IEJUQ19BTlRFTk5BX0FUX01BSU5fUE9SVCkKKyAJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LCAweDApOworCQllbHNlLyogZml4ZWQgaW50ZXJuYWwgc3dpdGNoIFMwLT5XaUZpLCBTMS0+QlQqLworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUoYnRjb2V4aXN0LCAweDk0OCwgMHgyODApOworCisJCS8qIGV4dCBzd2l0Y2ggc2V0dGluZyAqLworCQlzd2l0Y2ggKGFudF9wb3NfdHlwZSkgeworCQljYXNlIEJUQ19BTlRfUEFUSF9XSUZJOgorCQkJaWYgKGJvYXJkX2luZm8tPmJ0ZG1fYW50X3BvcyA9PQorCQkJICAgIEJUQ19BTlRFTk5BX0FUX01BSU5fUE9SVCkKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgMHg5MmMsIDB4MywKKwkJCQkJCQkJICAgMHgxKTsKKwkJCWVsc2UKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgMHg5MmMsIDB4MywKKwkJCQkJCQkJICAgMHgyKTsKKwkJCWJyZWFrOworCQljYXNlIEJUQ19BTlRfUEFUSF9CVDoKKwkJCWlmIChib2FyZF9pbmZvLT5idGRtX2FudF9wb3MgPT0KKwkJCSAgICBCVENfQU5URU5OQV9BVF9NQUlOX1BPUlQpCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsCisJCQkJCQkJICAgIAkgICAweDkyYywgMHgzLAorCQkJCQkJCSAgICAJICAgMHgyKTsKKwkJCWVsc2UKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgCSAgIDB4OTJjLCAweDMsCisJCQkJCQkJICAgIAkgICAweDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgQlRDX0FOVF9QQVRIX1BUQToKKwkJCWlmIChib2FyZF9pbmZvLT5idGRtX2FudF9wb3MgPT0KKwkJCSAgICBCVENfQU5URU5OQV9BVF9NQUlOX1BPUlQpCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsCisJCQkJCQkJICAgIAkgICAweDkyYywgMHgzLAorCQkJCQkJCSAgICAJICAgMHgxKTsKKwkJCWVsc2UKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgCSAgIDB4OTJjLCAweDMsCisJCQkJCQkJICAgIAkgICAweDIpOworCQkJYnJlYWs7CisJCX0KKworCX0gZWxzZSB7CisJCWlmIChpbml0X2h3X2NmZykgeworCQkJLyogMHg0Y1syM109MSwgMHg0Y1syNF09MCAgQW50ZW5uYSBjb250cm9sIGJ5IDB4NjQqLworCQkJdTMydG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NGMpOworCQkJdTMydG1wIHw9IEJJVDIzOworCQkJdTMydG1wICY9IH5CSVQyNDsKKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0YywgdTMydG1wKTsKKworCQkJaWYgKGJvYXJkX2luZm8tPmJ0ZG1fYW50X3BvcyA9PQorCQkJICAgIEJUQ19BTlRFTk5BX0FUX01BSU5fUE9SVCkgeworCQkJCS8qTWFpbiBBbnQgdG8gIFdpRmkgZm9yIElQUyBjYXNlIDB4NGNbMjNdPTEqLworCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LAorCQkJCQkJCQkgICAweDY0LCAweDEsCisJCQkJCQkJCSAgIDB4MCk7CisKKwkJCQkvKnRlbGwgZmlybXdhcmUgIm5vIGFudGVubmEgaW52ZXJzZSIqLworCQkJCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCQkJCWgyY19wYXJhbWV0ZXJbMV0gPSAwOyAgLyppbnRlcm5hbCBzd2l0Y2ggdHlwZSovCisJCQkJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY1LCAyLAorCQkJCQkJCWgyY19wYXJhbWV0ZXIpOworCQkJfSBlbHNlIHsKKwkJCQkvKkF1eCBBbnQgdG8gIEJUIGZvciBJUFMgY2FzZSAweDRjWzIzXT0xKi8KKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgMHg2NCwgMHgxLAorCQkJCQkJCQkgICAweDEpOworCisJCQkJLyp0ZWxsIGZpcm13YXJlICJhbnRlbm5hIGludmVyc2UiKi8KKwkJCQloMmNfcGFyYW1ldGVyWzBdID0gMTsKKwkJCQloMmNfcGFyYW1ldGVyWzFdID0gMDsgIC8qaW50ZXJuYWwgc3dpdGNoIHR5cGUqLworCQkJCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2NSwgMiwKKwkJCQkJCQloMmNfcGFyYW1ldGVyKTsKKwkJCX0KKwkJfQorCisJCS8qIGZpeGVkIGV4dGVybmFsIHN3aXRjaCBmaXJzdCovCisJCS8qTWFpbi0+V2lGaSwgQXV4LT5CVCovCisJCWlmKGJvYXJkX2luZm8tPmJ0ZG1fYW50X3BvcyA9PSBCVENfQU5URU5OQV9BVF9NQUlOX1BPUlQpCisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg5MmMsCisJCQkJCQkJICAgMHgzLCAweDEpOworCQllbHNlLypNYWluLT5CVCwgQXV4LT5XaUZpICovCisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg5MmMsCisJCQkJCQkJICAgMHgzLCAweDIpOworCisJCS8qIGludGVybmFsIHN3aXRjaCBzZXR0aW5nKi8KKwkJc3dpdGNoIChhbnRfcG9zX3R5cGUpIHsKKwkJY2FzZSBCVENfQU5UX1BBVEhfV0lGSToKKwkJCWlmKGJvYXJkX2luZm8tPmJ0ZG1fYW50X3BvcyA9PSBCVENfQU5URU5OQV9BVF9NQUlOX1BPUlQpCisJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUoYnRjb2V4aXN0LCAweDk0OCwKKwkJCQkJCQkgICAweDApOworCQkJZWxzZQorCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzJieXRlKGJ0Y29leGlzdCwgMHg5NDgsCisJCQkJCQkJICAgMHgyODApOworCQkJYnJlYWs7CisJCWNhc2UgQlRDX0FOVF9QQVRIX0JUOgorCQkJaWYoYm9hcmRfaW5mby0+YnRkbV9hbnRfcG9zID09IEJUQ19BTlRFTk5BX0FUX01BSU5fUE9SVCkKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LAorCQkJCQkJCSAgIDB4MjgwKTsKKwkJCWVsc2UKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LAorCQkJCQkJCSAgIDB4MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBCVENfQU5UX1BBVEhfUFRBOgorCQkJaWYoYm9hcmRfaW5mby0+YnRkbV9hbnRfcG9zID09IEJUQ19BTlRFTk5BX0FUX01BSU5fUE9SVCkKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LAorCQkJCQkJCSAgIDB4MjAwKTsKKwkJCWVsc2UKKwkJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LAorCQkJCQkJCSAgIDB4ODApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIGJvb2wgZm9yY2VfZXhlYywKKwkJCSAgICAgYm9vbCB0dXJuX29uLCB1OCB0eXBlKQoreworCWJvb2wgd2lmaV9idXN5ID0gZmFsc2U7CisJdTggcnNzaV9hZGp1c3RfdmFsID0gMDsKKworCWNvZXhfZG0tPmN1cl9wc190ZG1hX29uID0gdHVybl9vbjsKKwljb2V4X2RtLT5jdXJfcHNfdGRtYSA9IHR5cGU7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkgICJbQlRDb2V4XSwgKioqKioqKiogVERNQShvbiwgJWQpICoqKioqKioqKlxuIiwKKwkJCQkgIGNvZXhfZG0tPmN1cl9wc190ZG1hKTsKKwkJZWxzZQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkgICJbQlRDb2V4XSwgKioqKioqKiogVERNQShvZmYsICVkKSAqKioqKioqKlxuIiwKKwkJCQkgIGNvZXhfZG0tPmN1cl9wc190ZG1hKTsKKworCisJCWlmICgoY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPT0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb24pICYmCisJCSAgICAoY29leF9kbS0+cHJlX3BzX3RkbWEgPT0gY29leF9kbS0+Y3VyX3BzX3RkbWEpKQorCQkJcmV0dXJuOworCX0KKwlpZiAodHVybl9vbikgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJZGVmYXVsdDoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4NTEsIDB4MWEsCisJCQkJCQkgICAgICAgMHgxYSwgMHgwLCAweDUwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAod2lmaV9idXN5KQorCQkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4NTEsCisJCQkJCQkJICAgICAgIDB4M2EsIDB4MDMsCisJCQkJCQkJICAgICAgIDB4MTAsIDB4NTApOworCQkJZWxzZQorCQkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsMHg1MSwKKwkJCQkJCQkgICAgICAgMHgzYSwgMHgwMywKKwkJCQkJCQkgICAgICAgMHgxMCwgMHg1MSk7CisKKwkJCXJzc2lfYWRqdXN0X3ZhbCA9IDExOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmICh3aWZpX2J1c3kpCisJCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwKKwkJCQkJCQkgICAgICAgMHgyYiwgMHgwMywKKwkJCQkJCQkgICAgICAgMHgxMCwgMHg1MCk7CisJCQllbHNlCisJCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwKKwkJCQkJCQkgICAgICAgMHgyYiwgMHgwMywKKwkJCQkJCQkgICAgICAgMHgxMCwgMHg1MSk7CisJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDUxLCAweDFkLAorCQkJCQkJICAgICAgIDB4MWQsIDB4MCwgMHg1Mik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg5MywgMHgxNSwKKwkJCQkJCSAgICAgICAweDMsIDB4MTQsIDB4MCk7CisJCQlyc3NpX2FkanVzdF92YWwgPSAxNzsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDYxLCAweDE1LAorCQkJCQkJICAgICAgIDB4MywgMHgxMSwgMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg2MSwgMHgyMCwKKwkJCQkJCSAgICAgICAweDMsIDB4MTEsIDB4MTMpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YywKKwkJCQkJCSAgICAgICAweDUsIDB4MCwgMHgwKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LAorCQkJCQkJICAgICAgIDB4MywgMHgxMCwgMHgwKTsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlpZih3aWZpX2J1c3kpCisJCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwKKwkJCQkJCQkgICAgICAgMHgyMSwgMHgzLAorCQkJCQkJCSAgICAgICAweDEwLCAweDUwKTsKKwkJCWVsc2UKKwkJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDUxLAorCQkJCQkJCSAgICAgICAweDIxLCAweDMsCisJCQkJCQkJICAgICAgIDB4MTAsIDB4NTApOworCQkJcnNzaV9hZGp1c3RfdmFsID0gMTg7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YSwKKwkJCQkJCSAgICAgICAweGEsIDB4MCwgMHg0MCk7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCWlmICh3aWZpX2J1c3kpCisJCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwKKwkJCQkJCQkgICAgICAgMHgxNSwgMHgwMywKKwkJCQkJCQkgICAgICAgMHgxMCwgMHg1MCk7CisJCQllbHNlCisJCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwKKwkJCQkJCQkgICAgICAgMHgxNSwgMHgwMywKKwkJCQkJCQkgICAgICAgMHgxMCwgMHg1MCk7CisJCQlyc3NpX2FkanVzdF92YWwgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MSwgMHgwYSwKKwkJCQkJCSAgICAgICAweDBhLCAweDAsIDB4NTApOworCQkJYnJlYWs7CisJCWNhc2UgMTM6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDUxLCAweDE1LAorCQkJCQkJICAgICAgIDB4MTUsIDB4MCwgMHg1MCk7CisJCQlicmVhazsKKwkJY2FzZSAxNDoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4NTEsIDB4MjEsCisJCQkJCQkgICAgICAgMHgzLCAweDEwLCAweDUyKTsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHhhLAorCQkJCQkJICAgICAgIDB4MywgMHg4LCAweDApOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDE1LAorCQkJCQkJICAgICAgIDB4MywgMHgxMCwgMHgwKTsKKwkJCXJzc2lfYWRqdXN0X3ZhbCA9IDE4OworCQkJYnJlYWs7CisJCWNhc2UgMTg6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LAorCQkJCQkJICAgICAgIDB4MywgMHgxMCwgMHgwKTsKKwkJCXJzc2lfYWRqdXN0X3ZhbCA9IDE0OworCQkJYnJlYWs7CisJCWNhc2UgMjA6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDYxLCAweDM1LAorCQkJCQkJICAgICAgIDB4MDMsIDB4MTEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMjE6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDYxLCAweDE1LAorCQkJCQkJICAgICAgIDB4MDMsIDB4MTEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMjI6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDYxLCAweDI1LAorCQkJCQkJICAgICAgIDB4MDMsIDB4MTEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMjM6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LAorCQkJCQkJICAgICAgIDB4MywgMHgzMSwgMHgxOCk7CisJCQlyc3NpX2FkanVzdF92YWwgPSAyMjsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxNSwKKwkJCQkJCSAgICAgICAweDMsIDB4MzEsIDB4MTgpOworCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CisJCQlicmVhazsKKwkJY2FzZSAyNToKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4YSwKKwkJCQkJCSAgICAgICAweDMsIDB4MzEsIDB4MTgpOworCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CisJCQlicmVhazsKKwkJY2FzZSAyNjoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4YSwKKwkJCQkJCSAgICAgICAweDMsIDB4MzEsIDB4MTgpOworCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CisJCQlicmVhazsKKwkJY2FzZSAyNzoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MjUsCisJCQkJCQkgICAgICAgMHgzLCAweDMxLCAweDk4KTsKKwkJCXJzc2lfYWRqdXN0X3ZhbCA9IDIyOworCQkJYnJlYWs7CisJCWNhc2UgMjg6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDY5LCAweDI1LAorCQkJCQkJICAgICAgIDB4MywgMHgzMSwgMHgwKTsKKwkJCWJyZWFrOworCQljYXNlIDI5OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhhYiwgMHgxYSwKKwkJCQkJCSAgICAgICAweDFhLCAweDEsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMzA6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDUxLCAweDE0LAorCQkJCQkJICAgICAgIDB4MywgMHgxMCwgMHg1MCk7CisJCQlicmVhazsKKwkJY2FzZSAzMToKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsCisJCQkJCQkgICAgICAgMHgxYSwgMCwgMHg1OCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4NjEsIDB4YSwKKwkJCQkJCSAgICAgICAweDMsIDB4MTAsIDB4MCk7CisJCQlicmVhazsKKwkJY2FzZSAzMzoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4YTMsIDB4MjUsCisJCQkJCQkgICAgICAgMHgzLCAweDMwLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDM0OgorCQkJaGFsYnRjODcyM2IxYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHg1MywgMHgxYSwKKwkJCQkJCSAgICAgICAweDFhLCAweDAsIDB4MTApOworCQkJYnJlYWs7CisJCWNhc2UgMzU6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDYzLCAweDFhLAorCQkJCQkJICAgICAgIDB4MWEsIDB4MCwgMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSAzNjoKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MTIsCisJCQkJCQkgICAgICAgMHgzLCAweDE0LCAweDUwKTsKKwkJCWJyZWFrOworCQkvKiBTb2Z0QVAgb25seSB3aXRoIG5vIHN0YSBhc3NvY2lhdGVkLEJUIGRpc2FibGUgLAorCQkgKiBURE1BIG1vZGUgZm9yIHBvd2VyIHNhdmluZworCQkgKiBoZXJlIHNvZnRhcCBtb2RlIHNjcmVlbiBvZmYgd2lsbCBjb3N0IDcwLTgwbUEgZm9yIHBob25lICovCisJCWNhc2UgNDA6CisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDIzLCAweDE4LAorCQkJCQkJICAgICAgIDB4MDAsIDB4MTAsIDB4MjQpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSA4OiAvKlBUQSBDb250cm9sICovCisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDgsIDB4MCwKKwkJCQkJCSAgICAgICAweDAsIDB4MCwgMHgwKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9TZXRBbnRQYXRoKGJ0Y29leGlzdCwgQlRDX0FOVF9QQVRIX1BUQSwKKwkJCQkJCSAgIGZhbHNlLCBmYWxzZSk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OiAgLypTb2Z0d2FyZSBjb250cm9sLCBBbnRlbm5hIGF0IEJUIHNpZGUgKi8KKwkJCWhhbGJ0Yzg3MjNiMWFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLAorCQkJCQkJICAgICAgIDB4MCwgMHgwLCAweDApOworCQkJaGFsYnRjODcyM2IxYW50X1NldEFudFBhdGgoYnRjb2V4aXN0LCBCVENfQU5UX1BBVEhfQlQsCisJCQkJCQkgICBmYWxzZSwgZmFsc2UpOworCQkJYnJlYWs7CisJCWNhc2UgOTogICAvKlNvZnR3YXJlIGNvbnRyb2wsIEFudGVubmEgYXQgV2lGaSBzaWRlICovCisJCQloYWxidGM4NzIzYjFhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwKKwkJCQkJCSAgICAgICAweDAsIDB4MCwgMHgwKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9TZXRBbnRQYXRoKGJ0Y29leGlzdCwgQlRDX0FOVF9QQVRIX1dJRkksCisJCQkJCQkgICBmYWxzZSwgZmFsc2UpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcnNzaV9hZGp1c3RfdmFsID0gMDsKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LAorCQkJICAgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SXzFBTlRfQ09FWF9UWVBFLAorCQkJICAgJnJzc2lfYWRqdXN0X3ZhbCk7CisKKwkvKiB1cGRhdGUgcHJlIHN0YXRlICovCisJY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPSBjb2V4X2RtLT5jdXJfcHNfdGRtYV9vbjsKKwljb2V4X2RtLT5wcmVfcHNfdGRtYSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9jb2V4X2FsbG9mZihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKiBmdyBhbGwgb2ZmICovCisJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJLyogc3cgYWxsIG9mZiAqLworCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMHgxOCk7CisKKworCS8qIGh3IGFsbCBvZmYgKi8KKwloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cit9CisKK2Jvb2wgaGFsYnRjODcyM2IxYW50X2lzX2NvbW1vbl9hY3Rpb24oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJYm9vbCBjb21tb20gPSBmYWxzZSwgd2lmaV9jb25uZWN0ZWQgPSBmYWxzZTsKKwlib29sIHdpZmlfYnVzeSA9IGZhbHNlOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZ3aWZpX2J1c3kpOworCisJaWYgKCF3aWZpX2Nvbm5lY3RlZCAmJgorCSAgICBCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArICIKKwkJCSAgIkJUIG5vbiBjb25uZWN0ZWQtaWRsZSEhXG4iKTsKKwkJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworIAkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisKKwkJY29tbW9tID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKHdpZmlfY29ubmVjdGVkICYmCisJCSAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0KKwkJICAgIGNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIFdpZmkgY29ubmVjdGVkICsgIgorCQkJICAiQlQgbm9uIGNvbm5lY3RlZC1pZGxlISFcbiIpOworCQloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisgICAgICAJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCisJCWNvbW1vbSA9IHRydWU7CisJfSBlbHNlIGlmICghd2lmaV9jb25uZWN0ZWQgJiYKKwkJICAgKEJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09CisJCSAgICBjb2V4X2RtLT5idF9zdGF0dXMpKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArICIKKwkJCSAgIkJUIGNvbm5lY3RlZC1pZGxlISFcbiIpOworCQloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCisJCWNvbW1vbSA9IHRydWU7CisJfSBlbHNlIGlmICh3aWZpX2Nvbm5lY3RlZCAmJgorCQkgICAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0KKwkJICAgIGNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIFdpZmkgY29ubmVjdGVkICsgQlQgY29ubmVjdGVkLWlkbGUhIVxuIik7CisJCWhhbGJ0Yzg3MjNiMWFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisKKwkJY29tbW9tID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCF3aWZpX2Nvbm5lY3RlZCAmJgorCQkgICAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0KKwkJICAgIGNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBCdXN5ISFcbiIpKTsKKwkJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKworCQljb21tb20gPSB0cnVlOworCX0gZWxzZSB7CisJCWlmICh3aWZpX2J1c3kpCisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIFdpZmkgQ29ubmVjdGVkLUJ1c3kiCisJCQkJICAiICsgQlQgQnVzeSEhXG4iKTsKKwkJZWxzZQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBXaWZpIENvbm5lY3RlZC1JZGxlIgorCQkJCSAgIiArIEJUIEJ1c3khIVxuIik7CisKKwkJY29tbW9tID0gZmFsc2U7CisJfQorCisJcmV0dXJuIGNvbW1vbTsKK30KKworCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF90ZG1hX2R1cmF0aW9uX2FkanVzdF9mb3JfYWNsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkJICB1OCB3aWZpX3N0YXR1cykKK3sKKwlzdGF0aWMgczMyIHVwLCBkbiwgbSwgbiwgd2FpdF9jb3VudDsKKwkvKiAwOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLAorCSAqIC0xOiBkZWNyZWFzZSBXaUZpIGR1cmF0aW9uICovCisJczMyIHJlc3VsdDsKKwl1OCByZXRyeV9jb3VudCA9IDAsIGJ0X2luZm9fZXh0OworCXN0YXRpYyBib29sIHByZV93aWZpX2J1c3kgPSBmYWxzZTsKKwlib29sIHdpZmlfYnVzeSA9IGZhbHNlOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpOworCisJaWYgKEJUXzg3MjNCXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0JVU1kgPT0gd2lmaV9zdGF0dXMpCisJCXdpZmlfYnVzeSA9IHRydWU7CisJZWxzZQorCQl3aWZpX2J1c3kgPSBmYWxzZTsKKworCWlmICgoQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09CisJCQkJCQkJIHdpZmlfc3RhdHVzKSB8fAorCSAgICAoQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTiA9PSB3aWZpX3N0YXR1cykgfHwKKwkgICAgKEJUXzg3MjNCXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUID09IHdpZmlfc3RhdHVzKSkgeworCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgIT0gMSAmJiBjb2V4X2RtLT5jdXJfcHNfdGRtYSAhPSAyICYmCisJCSAgICBjb2V4X2RtLT5jdXJfcHNfdGRtYSAhPSAzICYmIGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDkpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQl0cnVlLCA5KTsKKwkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQltID0gMTsKKwkJCW4gPSAzOworCQkJcmVzdWx0ID0gMDsKKwkJCXdhaXRfY291bnQgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QpIHsKKwkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IHRydWU7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpOworCisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOworCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKKworCQl1cCA9IDA7CisJCWRuID0gMDsKKwkJbSA9IDE7CisJCW4gPSAzOworCQlyZXN1bHQgPSAwOworCQl3YWl0X2NvdW50ID0gMDsKKwl9IGVsc2UgeworCQkvKmFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCisJCXJldHJ5X2NvdW50ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKKwkJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CisJCXJlc3VsdCA9IDA7CisJCXdhaXRfY291bnQrKzsKKwkJLyogbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24gKi8KKwkJaWYgKHJldHJ5X2NvdW50ID09IDApIHsKKwkJCXVwKys7CisJCQlkbi0tOworCisJCQlpZiAoZG4gPD0gMCkKKwkJCQlkbiA9IDA7CisKKwkJCWlmICh1cCA+PSBuKSB7CisJCQkJd2FpdF9jb3VudCA9IDA7CisJCQkJbiA9IDM7CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQlyZXN1bHQgPSAxOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgIgorCQkJCQkgICJkdXJhdGlvbiEhXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChyZXRyeV9jb3VudCA8PSAzKSB7CisJCQl1cC0tOworCQkJZG4rKzsKKworCQkJaWYgKHVwIDw9IDApCisJCQkJdXAgPSAwOworCisJCQlpZiAoZG4gPT0gMikgeworCQkJCWlmICh3YWl0X2NvdW50IDw9IDIpCisJCQkJCW0rKzsKKwkJCQllbHNlCisJCQkJCW0gPSAxOworCisJCQkJaWYgKG0gPj0gMjApCisJCQkJCW0gPSAyMDsKKworCQkJCW4gPSAzICogbTsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCXdhaXRfY291bnQgPSAwOworCQkJCXJlc3VsdCA9IC0xOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24iCisJCQkJCSAgIiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod2FpdF9jb3VudCA9PSAxKQorCQkJCW0rKzsKKwkJCWVsc2UKKwkJCQltID0gMTsKKworCQkJaWYgKG0gPj0gMjApCisJCQkJbSA9IDIwOworCisJCQluID0gMyAqIG07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQl3YWl0X2NvdW50ID0gMDsKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkgICJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiIKKwkJCQkgICIgZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpOworCQl9CisKKwkJaWYgKHJlc3VsdCA9PSAtMSkgeworCQkJaWYgKChCVF9JTkZPXzg3MjNCXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0X2luZm9fZXh0KSkgJiYKKwkJCSAgICAoKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHx8CisJCQkgICAgIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSkpIHsKKwkJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCXRydWUsIDkpOworCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQl0cnVlLCAyKTsKKwkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKKwkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikgeworCQkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CisJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCXRydWUsIDExKTsKKwkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTE7CisJCQl9CisJCX0gZWxzZSBpZihyZXN1bHQgPT0gMSkgeworCQkJaWYgKChCVF9JTkZPXzg3MjNCXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0X2luZm9fZXh0KSkgJiYKKwkJCSAgICAoKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHx8CisJCQkgICAgIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSkpIHsKKwkJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCXRydWUsIDkpOworCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CisJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCXRydWUsIDIpOworCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOworCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQl0cnVlLCAxKTsKKwkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsJICAvKm5vIGNoYW5nZSAqLworCQkJLyppZiBidXN5IC8gaWRsZSBjaGFuZ2UgKi8KKwkJCWlmICh3aWZpX2J1c3kgIT0gcHJlX3dpZmlfYnVzeSkgeworCQkJCXByZV93aWZpX2J1c3kgPSB3aWZpX2J1c3k7CisJCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLAorCQkJCQkJICAgICAgICB0cnVlLAorCQkJCQkJICAgICAgICBjb2V4X2RtLT5jdXJfcHNfdGRtYSk7CisJCQl9CisKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkJICAiW0JUQ29leF0sKioqKioqKioqIFRETUEob24sICVkKSAqKioqKioqKlxuIiwKKwkJCQkgIGNvZXhfZG0tPmN1cl9wc190ZG1hKTsKKwkJfQorCisJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSAhPSAxICYmIGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDIgJiYKKwkJICAgIGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDkgJiYgY29leF9kbS0+Y3VyX3BzX3RkbWEgIT0gMTEpIHsKKwkJCS8qIHJlY292ZXIgdG8gcHJldmlvdXMgYWRqdXN0IHR5cGUgKi8KKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsCisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlKTsKKwkJfQorCX0KK30KKwordTggaGFsYnRjODcyM2IxYW50X3BzX3RkbWFfdHlwZV9ieV93aWZpX3Jzc2koczMyIHdpZmlfcnNzaSwgczMyIHByZV93aWZpX3Jzc2ksCisJCQkJCSAgICAgdTggd2lmaV9yc3NpX3RocmVzaCkKK3sKKwl1OCBwc190ZG1hX3R5cGU9MDsKKworCWlmICh3aWZpX3Jzc2kgPiBwcmVfd2lmaV9yc3NpKSB7CisJCWlmICh3aWZpX3Jzc2kgPiAod2lmaV9yc3NpX3RocmVzaCArIDUpKQorCQkJcHNfdGRtYV90eXBlID0gMjY7CisJCWVsc2UKKwkJCXBzX3RkbWFfdHlwZSA9IDI1OworCX0gZWxzZSAgeworCQlpZiAod2lmaV9yc3NpID4gd2lmaV9yc3NpX3RocmVzaCkKKyAJCQlwc190ZG1hX3R5cGUgPSAyNjsKKyAJCWVsc2UKKyAJCQlwc190ZG1hX3R5cGUgPSAyNTsKKyAJfQorCisJcmV0dXJuIHBzX3RkbWFfdHlwZTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJCSAgYm9vbCBuZXdfcHNfc3RhdGUpCit7CisJdTggbHBzX21vZGUgPSAweDA7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX0xQU19NT0RFLCAmbHBzX21vZGUpOworCisJaWYgKGxwc19tb2RlKSB7CS8qIGFscmVhZHkgdW5kZXIgTFBTIHN0YXRlICovCisJCWlmIChuZXdfcHNfc3RhdGUpIHsKKwkJCS8qIGtlZXAgc3RhdGUgdW5kZXIgTFBTLCBkbyBub3RoaW5nLiAqLworCQl9IGVsc2UgeworCQkJLyogd2lsbCBsZWF2ZSBMUFMgc3RhdGUsIHR1cm4gb2ZmIHBzVGRtYSBmaXJzdCAqLworCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCWZhbHNlLCAwKTsKKwkJfQorCX0gZWxzZSB7CS8qIE5PIFBTIHN0YXRlICovCisJCWlmIChuZXdfcHNfc3RhdGUpIHsKKwkJCS8qIHdpbGwgZW50ZXIgTFBTIHN0YXRlLCB0dXJuIG9mZiBwc1RkbWEgZmlyc3QgKi8KKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQlmYWxzZSwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBrZWVwIHN0YXRlIHVuZGVyIE5PIFBTIHN0YXRlLCBkbyBub3RoaW5nLiAqLworCQl9CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9wb3dlcl9zYXZlX3N0YXRlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICAgIHU4IHBzX3R5cGUsIHU4IGxwc192YWwsCisJCQkJICAgICAgdTggcnB3bV92YWwpCit7CisJYm9vbCBsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKworCXN3aXRjaCAocHNfdHlwZSkgeworCWNhc2UgQlRDX1BTX1dJRklfTkFUSVZFOgorCQkvKiByZWNvdmVyIHRvIG9yaWdpbmFsIDMyayBsb3cgcG93ZXIgc2V0dGluZyAqLworCQlsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsCisJCQkJICAgJmxvd19wd3JfZGlzYWJsZSk7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX05PUk1BTF9MUFMsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEJUQ19QU19MUFNfT046CisJCWhhbGJ0Yzg3MjNiMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CisJCWhhbGJ0Yzg3MjNiMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGxwc192YWwsCisJCQkJCXJwd21fdmFsKTsKKwkJLyogd2hlbiBjb2V4IGZvcmNlIHRvIGVudGVyIExQUywgZG8gbm90IGVudGVyIDMyayBsb3cgcG93ZXIuICovCisJCWxvd19wd3JfZGlzYWJsZSA9IHRydWU7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCQkJCSAgICZsb3dfcHdyX2Rpc2FibGUpOworCQkvKiBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4JICovCisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgQlRDX1BTX0xQU19PRkY6CisJCWhhbGJ0Yzg3MjNiMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOworCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX29ubHkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfbW9uaXRvcl9idF9lbmFibGVfZGlzYWJsZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdGF0aWMgYm9vbCBwcmVfYnRfZGlzYWJsZWQgPSBmYWxzZTsKKwlzdGF0aWMgdTMyIGJ0X2Rpc2FibGVfY250ID0gMDsKKwlib29sIGJ0X2FjdGl2ZSA9IHRydWUsIGJ0X2Rpc2FibGVkID0gZmFsc2U7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGJ0IGlzIGRpc2FibGVkICovCisKKwlpZiAoY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAwICYmCisJICAgIGNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDApCisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4ID09IDB4ZmZmZiAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCA9PSAweGZmZmYpCisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGJ0X2FjdGl2ZSkgeworCQlidF9kaXNhYmxlX2NudCA9IDA7CisJCWJ0X2Rpc2FibGVkID0gZmFsc2U7CisgCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsCisJCQkJICAgJmJ0X2Rpc2FibGVkKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCQkgICJbQlRDb2V4XSwgQlQgaXMgZW5hYmxlZCAhIVxuIik7CisJfSBlbHNlIHsKKwkJYnRfZGlzYWJsZV9jbnQrKzsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCQkgICJbQlRDb2V4XSwgYnQgYWxsIGNvdW50ZXJzPTAsICVkIHRpbWVzISFcbiIsCisJCQkgIGJ0X2Rpc2FibGVfY250KTsKKwkJaWYgKGJ0X2Rpc2FibGVfY250ID49IDIpIHsKKwkJCWJ0X2Rpc2FibGVkID0gdHJ1ZTsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwKKwkJCQkJICAgJmJ0X2Rpc2FibGVkKTsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkJCSAgIltCVENvZXhdLCBCVCBpcyBkaXNhYmxlZCAhIVxuIik7CisJCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfb25seShidGNvZXhpc3QpOworCQl9CisJfQorCWlmIChwcmVfYnRfZGlzYWJsZWQgIT0gYnRfZGlzYWJsZWQpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCQkgICJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLAorCQkJICAocHJlX2J0X2Rpc2FibGVkID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiksCisJCQkgIChidF9kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpKTsKKwkJcHJlX2J0X2Rpc2FibGVkID0gYnRfZGlzYWJsZWQ7CisJCWlmICghYnRfZGlzYWJsZWQpIHsKKwkJfSBlbHNlIHsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywKKwkJCQkJICAgTlVMTCk7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9OT1JNQUxfTFBTLAorCQkJCQkgICBOVUxMKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNvZnR3YXJlIENvZXggTWVjaGFuaXNtIHN0YXJ0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNDTyBvbmx5IG9yIFNDTytQQU4oSFMpICovCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fc2NvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9CisJCWhhbGJ0Yzg3MjNiMWFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CisKKwloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKKworCWlmIChoYWxidGM4NzIzYjFhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCSAgCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJICAJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJICAJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkgIAkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHN3IG1lY2hhbmlzbSAqLworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKworCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faGlkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMWFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfYnRfcnNzaV9zdGF0ZSgyLCA1MCwgMCk7CisKKwloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjFhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsCisJCUJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpICovCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fYTJkcChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZiAoaGFsYnRjODcyM2IxYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX2EyZHBfcGFuX2hzKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7CisJdTMyIHdpZmlfYnc7CisKKwlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZiAoaGFsYnRjODcyM2IxYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKyAJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FjdGlvbl9wYW5fZWRyKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMWFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfYnRfcnNzaV9zdGF0ZSgyLCA1MCwgMCk7CisKKwloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjFhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHN3IG1lY2hhbmlzbSAqLworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCisKKy8qIFBBTihIUykgb25seSAqLwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX3Bhbl9ocyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJLyogZncgbWVjaGFuaXNtICovCisJCWlmKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKQorCQkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGZ3IG1lY2hhbmlzbSAqLworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKQorCQkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKworLypQQU4oRURSKStBMkRQICovCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fcGFuX2Vkcl9hMmRwKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7CisJdTMyIHdpZmlfYnc7CisKKwlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDI1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgNTAsIDApOworCisJaGFsYnRjODcyM2IxYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZiAoaGFsYnRjODcyM2IxYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjFhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LAorCQlCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX3Bhbl9lZHJfaGlkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMWFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMjUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjFhbnRfYnRfcnNzaV9zdGF0ZSgyLCA1MCwgMCk7CisKKwloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjFhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qIEhJRCtBMkRQK1BBTihFRFIpICovCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faGlkX2EyZHBfcGFuX2VkcihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OworCXUzMiB3aWZpX2J3OworCisJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJICAwLCAyLCAyNSwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMWFudF9idF9yc3NpX3N0YXRlKDIsIDUwLCAwKTsKKworCWhhbGJ0Yzg3MjNiMWFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYgKGhhbGJ0Yzg3MjNiMWFudF9uZWVkX3RvX2RlY19idF9wd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCWVsc2UKKwkJaGFsYnRjODcyM2IxYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCS8qIHN3IG1lY2hhbmlzbSAqLworCQlpZigod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FjdGlvbl9oaWRfYTJkcChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OworCXUzMiB3aWZpX2J3OworCisJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJICAwLCAyLCAyNSwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMWFudF9idF9yc3NpX3N0YXRlKDIsIDUwLCAwKTsKKworCWlmIChoYWxidGM4NzIzYjFhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjFhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IxYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCU5vbi1Tb2Z0d2FyZSBDb2V4IE1lY2hhbmlzbSBzdGFydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaGFsYnRjODcyM2IxYW50X2FjdGlvbl9ocyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKKwloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX2J0X2lucXVpcnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IGJ0Y19idF9saW5rX2luZm8gKmJ0X2xpbmtfaW5mbyA9ICZidGNvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2UsIGFwX2VuYWJsZSA9IGZhbHNlOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0FQX01PREVfRU5BQkxFLAorCQkJICAgJmFwX2VuYWJsZSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisKKwlpZiAoIXdpZmlfY29ubmVjdGVkKSB7CisJCWhhbGJ0Yzg3MjNiMWFudF9wb3dlcl9zYXZlX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCSBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKKwkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0IHx8IGJ0X2xpbmtfaW5mby0+aGlkX29ubHkpIHsKKwkJLyogU0NPL0hJRC1vbmx5IGJ1c3kgKi8KKwkJaGFsYnRjODcyM2IxYW50X3Bvd2VyX3NhdmVfc3RhdGUoYnRjb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsCisJCQkJCQkgMHgwLCAweDApOworCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwl9IGVsc2UgeworCQlpZiAoYXBfZW5hYmxlKQorCQkJaGFsYnRjODcyM2IxYW50X3Bvd2VyX3NhdmVfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSBCVENfUFNfV0lGSV9OQVRJVkUsCisJCQkJCQkJIDB4MCwgMHgwKTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IxYW50X3Bvd2VyX3NhdmVfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSBCVENfUFNfTFBTX09OLAorCQkJCQkJCSAweDUwLCAweDQpOworCisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMwKTsKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX2J0X3Njb19oaWRfb25seV9idXN5KHN0cnVjdCBidGNfY29leGlzdCAqIGJ0Y29leGlzdCwKKwkJCQkJCSB1OCB3aWZpX3N0YXR1cykKK3sKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCWJvb2wgd2lmaV9jb25uZWN0ZWQgPSBmYWxzZTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsCisJCQkgICAmd2lmaV9jb25uZWN0ZWQpOworCisJLyogdGRtYSBhbmQgY29leCB0YWJsZSAqLworCisJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJfSBlbHNlIHsgLyogSElEICovCisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOworCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNSk7CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9jb25uZWN0ZWRfYnRfYWNsX2J1c3koCisJCQkJCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQl1OCB3aWZpX3N0YXR1cykKK3sKKwl1OCBidF9yc3NpX3N0YXRlOworCisJc3RydWN0IGJ0Y19idF9saW5rX2luZm8gKmJ0X2xpbmtfaW5mbyA9ICZidGNvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IxYW50X2J0X3Jzc2lfc3RhdGUoMiwgMjgsIDApOworCisJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX29ubHkpIHsgIC8qSElEICovCisJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fYnRfc2NvX2hpZF9vbmx5X2J1c3koYnRjb2V4aXN0LAorCQkJCQkJCSAgICB3aWZpX3N0YXR1cyk7CisJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5hMmRwX29ubHkpIHsgLypBMkRQICovCisJCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKGJ0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworIAkJCSBoYWxidGM4NzIzYjFhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3RfZm9yX2FjbChidGNvZXhpc3QsCisJCQkgCQkJCQkgICB3aWZpX3N0YXR1cyk7CisJCX0gZWxzZSB7IC8qZm9yIGxvdyBCVCBSU1NJICovCisJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJdHJ1ZSwgMTEpOworCQkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IGZhbHNlOworCQl9CisKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeyAvKkhJRCtBMkRQICovCisJCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKGJ0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCXRydWUsIDE0KTsKKwkJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSBmYWxzZTsKKwkJfSBlbHNlIHsgLypmb3IgbG93IEJUIFJTU0kqLworCQkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCXRydWUsIDE0KTsKKwkJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSBmYWxzZTsKKwkJfQorCisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwkgLypQQU4oT1BQLEZUUCksIEhJRCtQQU4oT1BQLEZUUCkgKi8KKwl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+cGFuX29ubHkgfHwKKwkJICAgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0KSkgeworCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQljb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0ID0gZmFsc2U7CisJIC8qQTJEUCtQQU4oT1BQLEZUUCksIEhJRCtBMkRQK1BBTihPUFAsRlRQKSovCisJfSBlbHNlIGlmICgoYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0KSB8fAorCQkgICAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmCisJCSAgICBidF9saW5rX2luZm8tPnBhbl9leGlzdCkpIHsKKwkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOworCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJCWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QgPSBmYWxzZTsKKwl9IGVsc2UgeworCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CisJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKKwkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IGZhbHNlOworCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfbm90X2Nvbm5lY3RlZChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKiBwb3dlciBzYXZlIHN0YXRlICovCisJaGFsYnRjODcyM2IxYW50X3Bvd2VyX3NhdmVfc3RhdGUoYnRjb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsCisJCQkJCSAweDAsIDB4MCk7CisKKwkvKiB0ZG1hIGFuZCBjb2V4IHRhYmxlICovCisJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOworCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfbm90X2Nvbm5lY3RlZF9hc3NvX2F1dGhfc2NhbigKKwkJCQkJCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWhhbGJ0Yzg3MjNiMWFudF9wb3dlcl9zYXZlX3N0YXRlKGJ0Y29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLAorCQkJCQkgMHgwLCAweDApOworCisJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjIpOworCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IGJ0Y19idF9saW5rX2luZm8gKmJ0X2xpbmtfaW5mbyA9ICZidGNvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKworCWhhbGJ0Yzg3MjNiMWFudF9wb3dlcl9zYXZlX3N0YXRlKGJ0Y29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLAorCQkJCQkgMHgwLCAweDApOworCisJLyogdGRtYSBhbmQgY29leCB0YWJsZSAqLworCWlmIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCAmJgorCQkgICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQl0cnVlLCAyMik7CisJCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDEpOworCSAJfSBlbHNlIHsKKwkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjApOworCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJCX0KKwl9IGVsc2UgaWYgKChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJCSAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0KKwkJICAgIGNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9idF9zY29faGlkX29ubHlfYnVzeShidGNvZXhpc3QsCisJCQkJQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTik7CisJfSBlbHNlIHsKKwkJaGFsYnRjODcyM2IxYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjApOworCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9jb25uZWN0ZWRfc3BlY2lhbF9wYWNrZXQoCisJCQkJCQlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlib29sIGhzX2Nvbm5lY3RpbmcgPSBmYWxzZTsKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLCAmaHNfY29ubmVjdGluZyk7CisKKwloYWxidGM4NzIzYjFhbnRfcG93ZXJfc2F2ZV9zdGF0ZShidGNvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwKKwkJCQkJIDB4MCwgMHgwKTsKKworCS8qIHRkbWEgYW5kIGNvZXggdGFibGUgKi8KKwlpZiAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB7CisJCWlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgJiYgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQl0cnVlLCAyMik7CisJCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDEpOworCSAJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQl0cnVlLCAyMCk7CisJCQloYWxidGM4NzIzYjFhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDEpOworCSAJfQorCX0gZWxzZSB7CisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIwKTsKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEpOworCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfY29ubmVjdGVkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWJvb2wgd2lmaV9idXN5ID0gZmFsc2U7CisJYm9vbCBzY2FuID0gZmFsc2UsIGxpbmsgPSBmYWxzZSwgcm9hbSA9IGZhbHNlOworCWJvb2wgdW5kZXJfNHdheSA9IGZhbHNlLCBhcF9lbmFibGUgPSBmYWxzZTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJICAiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpPT09PlxuIik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1MsCisJCQkgICAmdW5kZXJfNHdheSk7CisJaWYgKHVuZGVyXzR3YXkpIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX2Nvbm5lY3RlZF9zcGVjaWFsX3BhY2tldChidGNvZXhpc3QpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksICIKKwkJCSAgInJldHVybiBmb3Igd2lmaSBpcyB1bmRlciA0d2F5PD09PVxuIik7CisJCXJldHVybjsKKwl9CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZyb2FtKTsKKworCWlmIChzY2FuIHx8IGxpbmsgfHwgcm9hbSkgeworCQloYWxidGM4NzIzYjFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4oYnRjb2V4aXN0KTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCAiCisJCQkgICJyZXR1cm4gZm9yIHdpZmkgaXMgdW5kZXIgc2Nhbjw9PT1cbiIpOworCQlyZXR1cm47CisJfQorCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0FQX01PREVfRU5BQkxFLAorCQkJICAgJmFwX2VuYWJsZSk7CisJLyogcG93ZXIgc2F2ZSBzdGF0ZSAqLworCWlmICghYXBfZW5hYmxlICYmCisJICAgIEJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cyAmJgorCSAgICAhYnRjb2V4aXN0LT5idF9saW5rX2luZm8uaGlkX29ubHkpCisJCWhhbGJ0Yzg3MjNiMWFudF9wb3dlcl9zYXZlX3N0YXRlKGJ0Y29leGlzdCwgQlRDX1BTX0xQU19PTiwKKwkJCQkJCSAweDUwLCAweDQpOworCWVsc2UKKwkJaGFsYnRjODcyM2IxYW50X3Bvd2VyX3NhdmVfc3RhdGUoYnRjb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsCisJCQkJCQkgMHgwLCAweDApOworCisJLyogdGRtYSBhbmQgY29leCB0YWJsZSAqLworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsCisJCUJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKKwlpZiAoIXdpZmlfYnVzeSkgeworCQlpZiAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB7CisJCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfY29ubmVjdGVkX2J0X2FjbF9idXN5KGJ0Y29leGlzdCwKKwkJCQkgICAgICBCVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9JRExFKTsKKwkJfSBlbHNlIGlmICgoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0KKwkJCQkJCWNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKKwkJCSAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0KKwkJCSAgIAkJCWNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fYnRfc2NvX2hpZF9vbmx5X2J1c3koYnRjb2V4aXN0LAorCQkJCSAgICAgQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfSURMRSk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJZmFsc2UsIDgpOworCQkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgIE5PUk1BTF9FWEVDLCAyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9jb25uZWN0ZWRfYnRfYWNsX2J1c3koYnRjb2V4aXN0LAorCQkJCSAgICBCVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9CVVNZKTsKKwkJfSBlbHNlIGlmICgoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0KKwkJCQkJCWNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKKwkJCSAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0KKwkJCSAgIAkJCWNvZXhfZG0tPmJ0X3N0YXR1cykpIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fYnRfc2NvX2hpZF9vbmx5X2J1c3koYnRjb2V4aXN0LAorCQkJCSAgICBCVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9CVVNZKTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsCisJCQkJCQkJICAgICBOT1JNQUxfRVhFQywgMik7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X3J1bl9zd19jb2V4aXN0X21lY2hhbmlzbShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCBhbGdvcml0aG0gPSAwOworCisJYWxnb3JpdGhtID0gaGFsYnRjODcyM2IxYW50X2FjdGlvbl9hbGdvcml0aG0oYnRjb2V4aXN0KTsKKwljb2V4X2RtLT5jdXJfYWxnb3JpdGhtID0gYWxnb3JpdGhtOworCisJaWYgKGhhbGJ0Yzg3MjNiMWFudF9pc19jb21tb25fYWN0aW9uKGJ0Y29leGlzdCkpIHsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pIHsKKwkJY2FzZSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19TQ086CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBTQ08uXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fc2NvKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISUQ6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBISUQuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faGlkKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUC5cbiIpOworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9hMmRwKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gIgorCQkJCSAgIkEyRFArUEFOKEhTKS5cbiIpOworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9hMmRwX3Bhbl9ocyhidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gUEFOKEVEUikuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fcGFuX2VkcihidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFOSFM6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBIUyBtb2RlLlxuIik7CisJCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX3Bhbl9ocyhidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpOworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9wYW5fZWRyX2EyZHAoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSAiCisJCQkJICAiUEFOKEVEUikrSElELlxuIik7CisJCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX3Bhbl9lZHJfaGlkKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSAiCisJCQkJICAiSElEK0EyRFArUEFOLlxuIik7CisJCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX2hpZF9hMmRwX3Bhbl9lZHIoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faGlkX2EyZHAoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gIgorCQkJCSAgImNvZXhpc3QgQWxsIE9mZiEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWNvZXhfZG0tPnByZV9hbGdvcml0aG0gPSBjb2V4X2RtLT5jdXJfYWxnb3JpdGhtOworCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjFhbnRfcnVuX2NvZXhpc3RfbWVjaGFuaXNtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBidGNfYnRfbGlua19pbmZvICpidF9saW5rX2luZm8gPSAmYnRjb2V4aXN0LT5idF9saW5rX2luZm87CisJYm9vbCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlLCBidF9oc19vbiA9IGZhbHNlOworCWJvb2wgbGltaXRlZF9kaWcgPSBmYWxzZSwgYkluY3JlYXNlU2NhbkRldk51bSA9IGZhbHNlOworCWJvb2wgYl9idF9jdHJsX2FnZ19idWZfc2l6ZSA9IGZhbHNlOworCXU4IGFnZ19idWZfc2l6ZSA9IDU7CisJdTggd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJICAiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKT09PT5cbiIpOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgIgorCQkJICAicmV0dXJuIGZvciBNYW51YWwgQ1RSTCA8PT09XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChidGNvZXhpc3QtPnN0b3BfY29leF9kbSkgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpLCAiCisJCQkgICJyZXR1cm4gZm9yIFN0b3AgQ29leCBETSA8PT09XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb2V4X3N0YS0+dW5kZXJfaXBzKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIElQUyAhISFcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJICAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJICAgIChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSkgeworCQlsaW1pdGVkX2RpZyA9IHRydWU7CisJCWJJbmNyZWFzZVNjYW5EZXZOdW0gPSB0cnVlOworCX0KKworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfTElNSVRFRF9ESUcsICZsaW1pdGVkX2RpZyk7CisJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9JTkNfU0NBTl9ERVZfTlVNLAorCQkJICAgJmJJbmNyZWFzZVNjYW5EZXZOdW0pOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisKKwlpZiAoIWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmhpZF9leGlzdCkgeworCQloYWxidGM4NzIzYjFhbnRfbGltaXRlZF90eChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAwLCAwLCAwLCAwKTsKKwl9IGVsc2UgeworCQlpZiAod2lmaV9jb25uZWN0ZWQpIHsKKwkJCXdpZmlfcnNzaV9zdGF0ZSA9CisJCQkJaGFsYnRjODcyM2IxYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJCTEsIDIsIDMwLCAwKTsKKwkJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQkJaGFsYnRjODcyM2IxYW50X2xpbWl0ZWRfdHgoYnRjb2V4aXN0LAorCQkJCQkJCSAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCSAgIDEsIDEsIDEsIDEpOworCQkJfSBlbHNlIHsKKwkJCQloYWxidGM4NzIzYjFhbnRfbGltaXRlZF90eChidGNvZXhpc3QsCisJCQkJCQkJICAgTk9STUFMX0VYRUMsCisJCQkJCQkJICAgMSwgMSwgMSwgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjFhbnRfbGltaXRlZF90eChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJICAgMCwgMCwgMCwgMCk7CisJCX0KKwl9CisKKwlpZiAoYnRfbGlua19pbmZvLT5zY29fZXhpc3QpIHsKKwkJYl9idF9jdHJsX2FnZ19idWZfc2l6ZSA9IHRydWU7CisJCWFnZ19idWZfc2l6ZSA9IDB4MzsKKwl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0KSB7CisJCWJfYnRfY3RybF9hZ2dfYnVmX3NpemUgPSB0cnVlOworCQlhZ2dfYnVmX3NpemUgPSAweDU7CisgCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0IHx8IGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0KSB7CisJCWJfYnRfY3RybF9hZ2dfYnVmX3NpemUgPSB0cnVlOworCQlhZ2dfYnVmX3NpemUgPSAweDg7CisJfQorCWhhbGJ0Yzg3MjNiMWFudF9saW1pdGVkX3J4KGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLAorCQkJCSAgIGJfYnRfY3RybF9hZ2dfYnVmX3NpemUsIGFnZ19idWZfc2l6ZSk7CisKKwloYWxidGM4NzIzYjFhbnRfcnVuX3N3X2NvZXhpc3RfbWVjaGFuaXNtKGJ0Y29leGlzdCk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKKworCWlmIChjb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSkgeworCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX2J0X2lucXVpcnkoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoYnRfaHNfb24pIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9ocyhidGNvZXhpc3QpOworCQlyZXR1cm47CisJfQorCisKKwlpZiAoIXdpZmlfY29ubmVjdGVkKSB7CisJCWJvb2wgc2NhbiA9IGZhbHNlLCBsaW5rID0gZmFsc2UsIHJvYW0gPSBmYWxzZTsKKworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgd2lmaSBpcyBub24gY29ubmVjdGVkLWlkbGUgISEhXG4iKTsKKworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOworCisJCWlmIChzY2FuIHx8IGxpbmsgfHwgcm9hbSkKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9ub3RfY29ubmVjdGVkX2Fzc29fYXV0aF9zY2FuKGJ0Y29leGlzdCk7CisJCWVsc2UKKwkJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9ub3RfY29ubmVjdGVkKGJ0Y29leGlzdCk7CisJfSBlbHNlIHsgLyogd2lmaSBMUFMvQnVzeSAqLworCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX3dpZmlfY29ubmVjdGVkKGJ0Y29leGlzdCk7CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9pbml0X2NvZXhfZG0oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJLyogZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20gKi8KKwloYWxidGM4NzIzYjFhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDYpOworCWhhbGJ0Yzg3MjNiMWFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UpOworCisJLyogc3cgYWxsIG9mZiAqLworCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCWhhbGJ0Yzg3MjNiMWFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSwgZmFsc2UsIGZhbHNlLCAweDE4KTsKKworCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UsIDgpOworCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDApOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMWFudF9pbml0X2h3X2NvbmZpZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgYm9vbCBiYWNrdXApCit7CisJdTMyIHUzMnRtcCA9IDA7CisJdTggdTh0bXAgPSAwOworCXUzMiBjbnRfYnRfY2FsX2NoayA9IDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJICAiW0JUQ29leF0sIDFBbnQgSW5pdCBIVyBDb25maWchIVxuIik7CisKKwlpZiAoYmFja3VwKSB7LyogYmFja3VwIHJmIDB4MWUgdmFsdWUgKi8KKwkJY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCA9CisJCQlidGNvZXhpc3QtPmJ0Y19nZXRfcmZfcmVnKGJ0Y29leGlzdCwKKwkJCQkJCSAgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOworCisJCWNvZXhfZG0tPmJhY2t1cF9hcmZyX2NudDEgPQorCQkJYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NDMwKTsKKwkJY29leF9kbS0+YmFja3VwX2FyZnJfY250MiA9CisJCQlidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0MzQpOworCQljb2V4X2RtLT5iYWNrdXBfcmV0cnlfbGltaXQgPQorCQkJYnRjb2V4aXN0LT5idGNfcmVhZF8yYnl0ZShidGNvZXhpc3QsIDB4NDJhKTsKKwkJY29leF9kbS0+YmFja3VwX2FtcGR1X21heF90aW1lID0KKwkJCWJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDQ1Nik7CisJfQorCisJLyogV2lGaSBnb3RvIHN0YW5kYnkgd2hpbGUgR05UX0JUIDAtLT4xICovCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsIDB4ZmZmZmYsIDB4NzgwKTsKKwkvKiBCVCBnb3RvIHN0YW5kYnkgd2hpbGUgR05UX0JUIDEtLT4wICovCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDIsIDB4ZmZmZmYsIDB4NTAwKTsKKworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5NzQsIDB4ZmYpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDk0NCwgMHgzLCAweDMpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MzAsIDB4NzcpOworCisKKwkvKiBCVCBjYWxpYnJhdGlvbiBjaGVjayAqLworCXdoaWxlIChjbnRfYnRfY2FsX2NoayA8PSAyMCkgeworCQl1MzJ0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0OWQpOworCQljbnRfYnRfY2FsX2NoaysrOworCQlpZiAodTMydG1wICYgQklUMCkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsCisJCQkJICAiW0JUQ29leF0sICMjIyMjIyMjIyMjIEJUICIKKwkJCQkgICJjYWxpYnJhdGlvbihjbnQ9JWQpICMjIyMjIyMjIyMjXG4iLAorCQkJCSAgY250X2J0X2NhbF9jaGspOworCQkJbWRlbGF5KDUwKTsKKwkJfSBlbHNlIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJCSAgIltCVENvZXhdLCAqKioqKioqKioqIEJUIE5PVCAiCisJCQkJICAiY2FsaWJyYXRpb24gKGNudD0lZCkqKioqKioqKioqXG4iLAorCQkJCSAgY250X2J0X2NhbF9jaGspOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiAweDc5MFs1OjBdPTB4NSAqLworCXU4dG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NzkwKTsKKwl1OHRtcCAmPSAweGMwOworCXU4dG1wIHw9IDB4NTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzkwLCB1OHRtcCk7CisKKwkvKiBFbmFibGUgY291bnRlciBzdGF0aXN0aWNzICovCisJLyoweDc2ZVszXSA9MSwgV0xBTl9BY3QgY29udHJvbCBieSBQVEEgKi8KKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzZlLCAweGMpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgsIDB4MSk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4NDAsIDB4MjAsIDB4MSk7CisKKwkvKkFudGVubmEgY29uZmlnICovCisJaGFsYnRjODcyM2IxYW50X1NldEFudFBhdGgoYnRjb2V4aXN0LCBCVENfQU5UX1BBVEhfUFRBLCB0cnVlLCBmYWxzZSk7CisJLyogUFRBIHBhcmFtZXRlciAqLworCWhhbGJ0Yzg3MjNiMWFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDApOworCit9CisKK3ZvaWQgaGFsYnRjODcyM2IxYW50X3dpZmlfb2ZmX2h3X2NmZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKiBzZXQgd2xhbl9hY3QgdG8gbG93ICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd29yayBhcm91bmQgZnVuY3Rpb24gc3RhcnQgd2l0aCB3YV9oYWxidGM4NzIzYjFhbnRfCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEVYaGFsYnRjODcyM2IxYW50XworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9pbml0X2h3Y29uZmlnKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWhhbGJ0Yzg3MjNiMWFudF9pbml0X2h3X2NvbmZpZyhidGNvZXhpc3QsIHRydWUpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9pbml0X2NvZXhfZG0oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsCisJCSAgIltCVENvZXhdLCBDb2V4IE1lY2hhbmlzbSBJbml0ISFcbiIpOworCisJYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gPSBmYWxzZTsKKworCWhhbGJ0Yzg3MjNiMWFudF9pbml0X2NvZXhfZG0oYnRjb2V4aXN0KTsKKworCWhhbGJ0Yzg3MjNiMWFudF9xdWVyeV9idF9pbmZvKGJ0Y29leGlzdCk7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODcyM2IxYW50X2Rpc3BsYXlfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICZidGNvZXhpc3QtPmJvYXJkX2luZm87CisJc3RydWN0IGJ0Y19zdGFja19pbmZvICpzdGFja19pbmZvID0gJmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCXU4ICpjbGlfYnVmID0gYnRjb2V4aXN0LT5jbGlfYnVmOworCXU4IHU4dG1wWzRdLCBpLCBidF9pbmZvX2V4dCwgcHNUZG1hQ2FzZT0wOworCXUxNiB1MTZ0bXBbNF07CisJdTMyIHUzMnRtcFs0XTsKKwlib29sIHJvYW0gPSBmYWxzZSwgc2NhbiA9IGZhbHNlOworCWJvb2wgbGluayA9IGZhbHNlLCB3aWZpX3VuZGVyXzVnID0gZmFsc2U7CisJYm9vbCBidF9oc19vbiA9IGZhbHNlLCB3aWZpX2J1c3kgPSBmYWxzZTsKKwlzMzIgd2lmaV9yc3NpID0wLCBidF9oc19yc3NpID0gMDsKKwl1MzIgd2lmaV9idywgd2lmaV90cmFmZmljX2RpciwgZmFfb2ZkbSwgZmFfY2NrOworCXU4IHdpZmlfZG90MTFfY2hubCwgd2lmaV9oc19jaG5sOworCXUzMiBmd192ZXIgPSAwLCBidF9wYXRjaF92ZXIgPSAwOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCSAgICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpIHsKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCQkgICAiXHJcbiA9PT09PT09PT09PT1bVW5kZXIgTWFudWFsIENvbnRyb2xdPT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkJICAgIlxyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKwl9CisJaWYgKGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKSB7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkJICAgIlxyXG4gPT09PT09PT09PT09W0NvZXggaXMgU1RPUFBFRF09PT09PT09PT09PT0iKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJCSAgICJcclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJfQorCisJaWYgKCFib2FyZF9pbmZvLT5idF9leGlzdCkgeworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQlyZXR1cm47CisJfQorCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCIsCisJCSAgICJBbnQgUEcgTnVtLyBBbnQgTWVjaC8gQW50IFBvczoiLCBcCisJCSAgIGJvYXJkX2luZm8tPnBnX2FudF9udW0sIGJvYXJkX2luZm8tPmJ0ZG1fYW50X251bSwKKwkJICAgYm9hcmRfaW5mby0+YnRkbV9hbnRfcG9zKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwKKwkJICAgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKKwkJICAgKChzdGFja19pbmZvLT5wcm9maWxlX25vdGlmaWVkKT8gIlllcyI6Ik5vIiksCisJCSAgIHN0YWNrX2luZm8tPmhjaV92ZXJzaW9uKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwgJmJ0X3BhdGNoX3Zlcik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0ZXX1ZFUiwgJmZ3X3Zlcik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCSAgICJcclxuICUtMzVzID0gJWRfJXgvIDB4JXgvIDB4JXgoJWQpIiwKKwkJICAgIkNvZXhWZXIvIEZ3VmVyLyBQYXRjaFZlciIsIFwKKwkJICAgZ2xjb2V4X3Zlcl9kYXRlXzg3MjNiXzFhbnQsIGdsY29leF92ZXJfODcyM2JfMWFudCwKKwkJICAgZndfdmVyLCBidF9wYXRjaF92ZXIsIGJ0X3BhdGNoX3Zlcik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsCisJCQkgICAmd2lmaV9kb3QxMV9jaG5sKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlfaHNfY2hubCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCglZCkiLAorCQkgICAiRG90MTEgY2hhbm5lbCAvIEhzQ2hubChIc01vZGUpIiwgXAorCQkgICB3aWZpX2RvdDExX2NobmwsIHdpZmlfaHNfY2hubCwgYnRfaHNfb24pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsCisJCSAgICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgXAorCQkgICBjb2V4X2RtLT53aWZpX2NobmxfaW5mb1swXSwgY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMV0sCisJCSAgIGNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzJdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1M0X1dJRklfUlNTSSwgJndpZmlfcnNzaSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRfaHNfcnNzaSk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwKKwkJICAgIldpZmkgcnNzaS8gSFMgcnNzaSIsIHdpZmlfcnNzaSwgYnRfaHNfcnNzaSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZzY2FuKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmcm9hbSk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLAorCQkiV2lmaSBsaW5rLyByb2FtLyBzY2FuIiwgbGluaywgcm9hbSwgc2Nhbik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCxCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsCisJCQkgICAmd2lmaV91bmRlcl81Zyk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZ3aWZpX2J1c3kpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwKKwkJCSAgICZ3aWZpX3RyYWZmaWNfZGlyKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJXMvICVzICIsCisJCSAgICJXaWZpIHN0YXR1cyIsICh3aWZpX3VuZGVyXzVnPyAiNUciOiIyLjRHIiksCisJCSAgICgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpX2J3KT8gIkxlZ2FjeSI6CisJCQkoKChCVENfV0lGSV9CV19IVDQwPT13aWZpX2J3KT8gIkhUNDAiOiJIVDIwIikpKSwKKwkJICAgKCghd2lmaV9idXN5KT8gImlkbGUiOgorCQkJKChCVENfV0lGSV9UUkFGRklDX1RYPT13aWZpX3RyYWZmaWNfZGlyKT8KKwkJCQkidXBsaW5rIjoiZG93bmxpbmsiKSkpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwKKwkJIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsCisJCSgoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKT8gKCJkaXNhYmxlZCIpOgorCQkgICgoY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKToKKwkJICAgICgoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cyk/CisJCSAgICAgICJub24tY29ubmVjdGVkIGlkbGUiOgorCQkJKChCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpPworCQkJICAiY29ubmVjdGVkLWlkbGUiOiJidXN5IikpKSksCisJCQkgICAgY29leF9zdGEtPmJ0X3Jzc2ksIGNvZXhfc3RhLT5idF9yZXRyeV9jbnQpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCAvICVkIC8gJWQiLAorCQkiU0NPL0hJRC9QQU4vQTJEUCIsIGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0LAorCQlidF9saW5rX2luZm8tPmhpZF9leGlzdCwgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QsCisJCWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOworCisJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLAorCQkgICAiQlQgSW5mbyBBMkRQIHJhdGUiLAorCQkgICAoYnRfaW5mb19leHQgJiBCSVQwKSA/ICJCYXNpYyByYXRlIiA6ICJFRFIgcmF0ZSIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBCVF9JTkZPX1NSQ184NzIzQl8xQU5UX01BWDsgaSsrKSB7CisJCWlmIChjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W2ldKSB7CisJCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJCQkgICAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCglZCkiLAorCQkJCSAgIEdMQnRJbmZvU3JjODcyM2IxQW50W2ldLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVswXSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bMV0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzJdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVszXSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNF0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzVdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVs2XSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W2ldKTsKKwkJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJfQorCX0KKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJICAgIlxyXG4gJS0zNXMgPSAlcy8lcywgKDB4JXgvMHgleCkiLAorCQkgICAiUFMgc3RhdGUsIElQUy9MUFMsIChscHMvcnB3bSkiLCBcCisJCSAgICgoY29leF9zdGEtPnVuZGVyX2lwcz8gIklQUyBPTiI6IklQUyBPRkYiKSksCisJCSAgICgoY29leF9zdGEtPnVuZGVyX2xwcz8gIkxQUyBPTiI6IkxQUyBPRkYiKSksCisJCSAgIGJ0Y29leGlzdC0+YnRfaW5mby5scHNfMWFudCwKKwkJICAgYnRjb2V4aXN0LT5idF9pbmZvLnJwd21fMWFudCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9GV19QV1JfTU9ERV9DTUQpOworCisJaWYgKCFidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKSB7CisJCS8qIFN3IG1lY2hhbmlzbQkqLworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLAorCQkJICAgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsCisgCQkJICAgIlNNMVtTaFJmLyBMcFJBLyBMaW1EaWddIiwgXAorIAkJCSAgIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rLAorCQkJICAgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhLAorCQkJICAgYnRjb2V4aXN0LT5idF9pbmZvLmxpbWl0ZWRfZGlnKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJCSAgICJcclxuICUtMzVzID0gJWQvICVkLyAlZCgweCV4KSAiLAorCQkJICAgIlNNMltBZ2NULyBBZGNCLyBTd0RhY1N3aW5nKGx2bCldIiwgXAorCQkJICAgY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbiwKKwkJCSAgIGNvZXhfZG0tPmN1cl9hZGNfYmFja29mZiwKKwkJCSAgIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sCisJCQkgICBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCk7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKworCisJCUNMX1BSSU5URihjbGlfYnVmKTsKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLAorCQkJICAgIlJhdGUgTWFzayIsIGJ0Y29leGlzdC0+YnRfaW5mby5yYV9tYXNrKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJCS8qIEZ3IG1lY2hhbmlzbQkqLworCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLAorCQkJICAgIj09PT09PT09PT09PVtGdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKworCQlwc1RkbWFDYXNlID0gY29leF9kbS0+Y3VyX3BzX3RkbWE7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkJICAgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJICAgImNhc2UtJWQgKGF1dG86JWQpIiwKKwkJCSAgICJQUyBURE1BIiwgY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdLAorCQkJICAgY29leF9kbS0+cHNfdGRtYV9wYXJhWzFdLCBjb2V4X2RtLT5wc190ZG1hX3BhcmFbMl0sCisJCQkgICBjb2V4X2RtLT5wc190ZG1hX3BhcmFbM10sIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVs0XSwKKwkJCSAgIHBzVGRtYUNhc2UsIGNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLAorCQkJICAgIkxhdGVzdCBlcnJvciBjb25kaXRpb24oc2hvdWxkIGJlIDApIiwgXAorCQkJICAgY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uKTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLAorCQkJICAgIkRlY0J0UHdyLyBJZ25XbGFuQWN0IiwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IsCisJCQkgICBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKKwkJQ0xfUFJJTlRGKGNsaV9idWYpOworCX0KKworCS8qIEh3IHNldHRpbmcgKi8KKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLAorCQkgICAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsCisJCSAgICJSRi1BLCAweDFlIGluaXRWYWwiLCBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8weCV4LzB4JXgvMHgleCIsCisJCSAgICJiYWNrdXAgQVJGUjEvQVJGUjIvUkwvQU1heFRpbWUiLCBjb2V4X2RtLT5iYWNrdXBfYXJmcl9jbnQxLAorCQkgICBjb2V4X2RtLT5iYWNrdXBfYXJmcl9jbnQyLCBjb2V4X2RtLT5iYWNrdXBfcmV0cnlfbGltaXQsCisJCSAgIGNvZXhfZG0tPmJhY2t1cF9hbXBkdV9tYXhfdGltZSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NDMwKTsKKwl1MzJ0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0MzQpOworCXUxNnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMmJ5dGUoYnRjb2V4aXN0LCAweDQyYSk7CisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0NTYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvMHgleC8weCV4LzB4JXgiLAorCQkgICAiMHg0MzAvMHg0MzQvMHg0MmEvMHg0NTYiLAorCQkgICB1MzJ0bXBbMF0sIHUzMnRtcFsxXSwgdTE2dG1wWzBdLCB1OHRtcFswXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgpOworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjYyk7CisJdTMydG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4ODgwKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwKKwkJICAgIjB4Nzc4LzB4NmNjLzB4ODgwWzI5OjI1XSIsIHU4dG1wWzBdLCB1MzJ0bXBbMF0sCisJCSAgICh1MzJ0bXBbMV0gJiAweDNlMDAwMDAwKSA+PiAyNSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4OTQ4KTsKKwl1OHRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDY3KTsKKwl1OHRtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDc2NSk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsCisJCSAgICIweDk0OC8gMHg2N1s1XSAvIDB4NzY1IiwKKwkJICAgdTMydG1wWzBdLCAoKHU4dG1wWzBdICYgMHgyMCk+PiA1KSwgdTh0bXBbMV0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDkyYyk7CisJdTMydG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4OTMwKTsKKwl1MzJ0bXBbMl0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg5NDQpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiMHg5MmNbMTowXS8gMHg5MzBbNzowXS8weDk0NFsxOjBdIiwKKwkJICAgdTMydG1wWzBdICYgMHgzLCB1MzJ0bXBbMV0gJiAweGZmLCB1MzJ0bXBbMl0gJiAweDMpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXU4dG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4MzkpOworCXU4dG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NDApOworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDRjKTsKKwl1OHRtcFsyXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDY0KTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwKKwkJICAgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwKKwkJICAgIjB4MzhbMTFdLzB4NDAvMHg0Y1syNDoyM10vMHg2NFswXSIsCisJCSAgICgodTh0bXBbMF0gJiAweDgpPj4zKSwgdTh0bXBbMV0sCisJCSAgICgodTMydG1wWzBdICYgMHgwMTgwMDAwMCkgPj4gMjMpLCB1OHRtcFsyXSAmIDB4MSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NTUwKTsKKwl1OHRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDUyMik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsCisJCSAgICIweDU1MChiY24gY3RybCkvMHg1MjIiLCB1MzJ0bXBbMF0sIHU4dG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhjNTApOworCXU4dG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NDljKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwKKwkJICAgIjB4YzUwKGRpZykvMHg0OWMobnVsbC1kcm9wKSIsIHUzMnRtcFswXSAmIDB4ZmYsIHU4dG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhkYTApOworCXUzMnRtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGRhNCk7CisJdTMydG1wWzJdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4ZGE4KTsKKwl1MzJ0bXBbM10gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhjZjApOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHhhNWIpOworCXU4dG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4YTVjKTsKKworCWZhX29mZG0gPSAoKHUzMnRtcFswXSAmIDB4ZmZmZjAwMDApID4+IDE2KSArCisJCSAgKCh1MzJ0bXBbMV0gJiAweGZmZmYwMDAwKSA+PiAxNikgKworCQkgICAodTMydG1wWzFdICYgMHhmZmZmKSArCisJCSAgICh1MzJ0bXBbMl0gJiAweGZmZmYpICsgXAorCQkgICgodTMydG1wWzNdICYgMHhmZmZmMDAwMCkgPj4gMTYpICsKKwkJICAgKHUzMnRtcFszXSAmIDB4ZmZmZikgOworCWZhX2NjayA9ICh1OHRtcFswXSA8PCA4KSArIHU4dG1wWzFdOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsCisJCSAgICJPRkRNLUNDQS9PRkRNLUZBL0NDSy1GQSIsCisJCSAgIHUzMnRtcFswXSAmIDB4ZmZmZiwgZmFfb2ZkbSwgZmFfY2NrKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzApOworCXUzMnRtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjNCk7CisJdTMydG1wWzJdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmM4KTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwKKwkJICAgIjB4NmMwLzB4NmM0LzB4NmM4KGNvZXhUYWJsZSkiLAorCQkgICB1MzJ0bXBbMF0sIHUzMnRtcFsxXSwgdTMydG1wWzJdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLAorCQkgICAiMHg3NzAoaGlnaC1wcmkgcngvdHgpIiwgY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfcngsCisJCSAgIGNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4KTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwKKwkJICAgIjB4Nzc0KGxvdy1wcmkgcngvdHgpIiwgY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCwKKwkJICAgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODcyM0JfMUFOVCA9PSAxKQorCWhhbGJ0Yzg3MjNiMWFudF9tb25pdG9yX2J0X2N0cihidGNvZXhpc3QpOworI2VuZGlmCisJYnRjb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKGJ0Y29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cit9CisKKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfaXBzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSkKK3sKKworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8IGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQorCQlyZXR1cm47CisKKwlpZiAoQlRDX0lQU19FTlRFUiA9PSB0eXBlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgSVBTIEVOVEVSIG5vdGlmeVxuIik7CisJCWNvZXhfc3RhLT51bmRlcl9pcHMgPSB0cnVlOworCisJCWhhbGJ0Yzg3MjNiMWFudF9TZXRBbnRQYXRoKGJ0Y29leGlzdCwgQlRDX0FOVF9QQVRIX0JULAorCQkJCQkgICBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLyogc2V0IFBUQSBjb250cm9sICovCisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAwKTsKKwkJaGFsYnRjODcyM2IxYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCU5PUk1BTF9FWEVDLCAwKTsKKwl9IGVsc2UgaWYgKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gZmFsc2U7CisKKwkJaGFsYnRjODcyM2IxYW50X3J1bl9jb2V4aXN0X21lY2hhbmlzbShidGNvZXhpc3QpOworCX0KK30KKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfbHBzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSkKK3sKKwlpZiAoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fCBidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKKwkJcmV0dXJuOworCisJaWYgKEJUQ19MUFNfRU5BQkxFID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIik7CisJCWNvZXhfc3RhLT51bmRlcl9scHMgPSB0cnVlOworCX0gZWxzZSBpZiAoQlRDX0xQU19ESVNBQkxFID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfbHBzID0gZmFsc2U7CisJfQorfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9zY2FuX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSkKK3sKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2UsIGJ0X2hzX29uID0gZmFsc2U7CisKKwlpZiAoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fCBidGNvZXhpc3QtPnN0b3BfY29leF9kbSB8fAorCSAgICBidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCisJCXJldHVybjsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsCisJCQkgICAmd2lmaV9jb25uZWN0ZWQpOworCisJaGFsYnRjODcyM2IxYW50X3F1ZXJ5X2J0X2luZm8oYnRjb2V4aXN0KTsKKworCWlmIChjb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSkgeworCQloYWxidGM4NzIzYjFhbnRfYWN0aW9uX2J0X2lucXVpcnkoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoYnRfaHNfb24pIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9ocyhidGNvZXhpc3QpOworCQlyZXR1cm47CisJfQorCisJaWYgKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBTQ0FOIFNUQVJUIG5vdGlmeVxuIik7CisJCWlmICghd2lmaV9jb25uZWN0ZWQpCS8qIG5vbi1jb25uZWN0ZWQgc2NhbiAqLworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX25vdF9jb25uZWN0ZWRfYXNzb19hdXRoX3NjYW4oYnRjb2V4aXN0KTsKKwkJZWxzZQkvKiB3aWZpIGlzIGNvbm5lY3RlZCAqLworCQkJaGFsYnRjODcyM2IxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKGJ0Y29leGlzdCk7CisJfSBlbHNlIGlmIChCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIik7CisJCWlmICghd2lmaV9jb25uZWN0ZWQpCS8qIG5vbi1jb25uZWN0ZWQgc2NhbiAqLworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX25vdF9jb25uZWN0ZWQoYnRjb2V4aXN0KTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX2Nvbm5lY3RlZChidGNvZXhpc3QpOworCX0KK30KKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfY29ubmVjdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJYm9vbCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlLCBidF9oc19vbiA9IGZhbHNlOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwgYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gfHwKKwkgICAgYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKKwlpZiAoY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UpIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9idF9pbnF1aXJ5KGJ0Y29leGlzdCk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGJ0X2hzX29uKSB7CisJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faHMoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIik7CisJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25fd2lmaV9ub3RfY29ubmVjdGVkX2Fzc29fYXV0aF9zY2FuKGJ0Y29leGlzdCk7CisJfSBlbHNlIGlmIChCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgQ09OTkVDVCBGSU5JU0ggbm90aWZ5XG4iKTsKKworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELAorCQkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisJCWlmICghd2lmaV9jb25uZWN0ZWQpIC8qIG5vbi1jb25uZWN0ZWQgc2NhbiAqLworCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX25vdF9jb25uZWN0ZWQoYnRjb2V4aXN0KTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX2Nvbm5lY3RlZChidGNvZXhpc3QpOworCX0KK30KKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfbWVkaWFfc3RhdHVzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgIHU4IHR5cGUpCit7CisJdTggaDJjX3BhcmFtZXRlclszXSA9ezB9OworCXUzMiB3aWZpX2J3OworCXU4IHdpZmlDZW50cmFsQ2hubDsKKworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8IGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtIHx8CisJICAgIGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCApCisJCXJldHVybjsKKworCWlmIChCVENfTUVESUFfQ09OTkVDVCA9PSB0eXBlKQorCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIE1FRElBIGNvbm5lY3Qgbm90aWZ5XG4iKTsKKwllbHNlCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgTUVESUEgZGlzY29ubmVjdCBub3RpZnlcbiIpOworCisJLyogb25seSAyLjRHIHdlIG5lZWQgdG8gaW5mb3JtIGJ0IHRoZSBjaG5sIG1hc2sgKi8KKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLAorCQkJICAgJndpZmlDZW50cmFsQ2hubCk7CisKKwlpZiAoKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpICYmCisJICAgICh3aWZpQ2VudHJhbENobmwgPD0gMTQpKSB7CisJCWgyY19wYXJhbWV0ZXJbMF0gPSAweDA7CisJCWgyY19wYXJhbWV0ZXJbMV0gPSB3aWZpQ2VudHJhbENobmw7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCQlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQorCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MzA7CisJCWVsc2UKKwkJCWgyY19wYXJhbWV0ZXJbMl0gPSAweDIwOworCX0KKworCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzBdID0gaDJjX3BhcmFtZXRlclswXTsKKwljb2V4X2RtLT53aWZpX2NobmxfaW5mb1sxXSA9IGgyY19wYXJhbWV0ZXJbMV07CisJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMl0gPSBoMmNfcGFyYW1ldGVyWzJdOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsCisJCSAgIltCVENvZXhdLCBGVyB3cml0ZSAweDY2PTB4JXhcbiIsCisJCSAgaDJjX3BhcmFtZXRlclswXSA8PCAxNiB8IGgyY19wYXJhbWV0ZXJbMV0gPDwgOCB8CisJCSAgaDJjX3BhcmFtZXRlclsyXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjYsIDMsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9zcGVjaWFsX3BhY2tldF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgIHU4IHR5cGUpCit7CisJYm9vbCBidF9oc19vbiA9IGZhbHNlOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwgYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gfHwKKwkgICAgYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwljb2V4X3N0YS0+c3BlY2lhbF9wa3RfcGVyaW9kX2NudCA9IDA7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKKwlpZiAoY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UpIHsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl9idF9pbnF1aXJ5KGJ0Y29leGlzdCk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGJ0X2hzX29uKSB7CisJCWhhbGJ0Yzg3MjNiMWFudF9hY3Rpb25faHMoYnRjb2V4aXN0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChCVENfUEFDS0VUX0RIQ1AgPT0gdHlwZSB8fAorCQlCVENfUEFDS0VUX0VBUE9MID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBzcGVjaWFsIFBhY2tldCglZCkgbm90aWZ5XG4iLCB0eXBlKTsKKwkJaGFsYnRjODcyM2IxYW50X2FjdGlvbl93aWZpX2Nvbm5lY3RlZF9zcGVjaWFsX3BhY2tldChidGNvZXhpc3QpOworCX0KK30KKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfYnRfaW5mb19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICAgIHU4ICp0bXBfYnVmLCB1OCBsZW5ndGgpCit7CisJdTggYnRfaW5mbyA9IDA7CisJdTggaSwgcnNwX3NvdXJjZSA9IDA7CisJYm9vbCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlOworCWJvb2wgYnRfYnVzeSA9IGZhbHNlOworCisJY29leF9zdGEtPmMyaF9idF9pbmZvX3JlcV9zZW50ID0gZmFsc2U7CisKKwlyc3Bfc291cmNlID0gdG1wX2J1ZlswXSAmIDB4ZjsKKwlpZiAocnNwX3NvdXJjZSA+PSBCVF9JTkZPX1NSQ184NzIzQl8xQU5UX01BWCkKKwkJcnNwX3NvdXJjZSA9IEJUX0lORk9fU1JDXzg3MjNCXzFBTlRfV0lGSV9GVzsKKwljb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W3JzcF9zb3VyY2VdKys7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkgICJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsCisJCSAgcnNwX3NvdXJjZSwgbGVuZ3RoKTsKKwlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1baV0gPSB0bXBfYnVmW2ldOworCQlpZiAoaSA9PSAxKQorCQkJYnRfaW5mbyA9IHRtcF9idWZbaV07CisJCWlmIChpID09IGxlbmd0aCAtIDEpCisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJCSAgIjB4JTAyeF1cbiIsIHRtcF9idWZbaV0pOworCQllbHNlCisJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJCSAgIjB4JTAyeCwgIiwgdG1wX2J1ZltpXSk7CisJfQorCisJaWYgKEJUX0lORk9fU1JDXzg3MjNCXzFBTlRfV0lGSV9GVyAhPSByc3Bfc291cmNlKSB7CisJCWNvZXhfc3RhLT5idF9yZXRyeV9jbnQgPQkvKiBbMzowXSAqLworCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdWzJdICYgMHhmOworCisJCWNvZXhfc3RhLT5idF9yc3NpID0KKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVszXSAqIDIgKyAxMDsKKworCQljb2V4X3N0YS0+YnRfaW5mb19leHQgPQorCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdWzRdOworCisJCS8qIEhlcmUgd2UgbmVlZCB0byByZXNlbmQgc29tZSB3aWZpIGluZm8gdG8gQlQKKwkJICogYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4qLworCQlpZihjb2V4X3N0YS0+YnRfaW5mb19leHQgJiBCSVQxKQorCQl7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDEgY2hlY2ssICIKKwkJCQkgICJzZW5kIHdpZmkgQlcmQ2hubCB0byBCVCEhXG4iKTsKKwkJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsCisJCQkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisJCQlpZih3aWZpX2Nvbm5lY3RlZCkKKwkJCQlleF9oYWxidGM4NzIzYjFhbnRfbWVkaWFfc3RhdHVzX25vdGlmeShidGNvZXhpc3QsCisJCQkJCQkJICAgICBCVENfTUVESUFfQ09OTkVDVCk7CisJCQllbHNlCisJCQkJZXhfaGFsYnRjODcyM2IxYW50X21lZGlhX3N0YXR1c19ub3RpZnkoYnRjb2V4aXN0LAorCQkJCQkJCSAgQlRDX01FRElBX0RJU0NPTk5FQ1QpOworCQl9CisKKwkJaWYgKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDMpIHsKKwkJCWlmICghYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCAmJgorCQkJICAgICFidGNvZXhpc3QtPnN0b3BfY29leF9kbSkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDMgY2hlY2ssICIKKwkJCQkJICAic2V0IEJUIE5PVCBpZ25vcmUgV2xhbiBhY3RpdmUhIVxuIik7CisJCQkJaGFsYnRjODcyM2IxYW50X2lnbm9yZV93bGFuX2FjdChidGNvZXhpc3QsCisJCQkJCQkJCUZPUkNFX0VYRUMsCisJCQkJCQkJCWZhbHNlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEJUIGFscmVhZHkgTk9UIGlnbm9yZSBXbGFuIGFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLiovCisJCX0KKyNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzg3MjNCXzFBTlQgPT0gMCkKKwkJaWYgKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDQpIHsKKwkJCS8qIEJUIGF1dG8gcmVwb3J0IGFscmVhZHkgZW5hYmxlZCwgZG8gbm90aGluZyAqLworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IxYW50X2J0X2F1dG9fcmVwb3J0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywKKwkJCQkJCSAgICAgICB0cnVlKTsKKwkJfQorI2VuZGlmCisJfQorCisJLyogY2hlY2sgQklUMiBmaXJzdCA9PT4gY2hlY2sgaWYgYnQgaXMgdW5kZXIgaW5xdWlyeSBvciBwYWdlIHNjYW4gKi8KKwlpZiAoYnRfaW5mbyAmIEJUX0lORk9fODcyM0JfMUFOVF9CX0lOUV9QQUdFKQorCQljb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSA9IHRydWU7CisJZWxzZQorCQljb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSA9IGZhbHNlOworCisJLyogc2V0IGxpbmsgZXhpc3Qgc3RhdHVzICovCisJaWYgKCEoYnRfaW5mbyAmIEJUX0lORk9fODcyM0JfMUFOVF9CX0NPTk5FQ1RJT04pKSB7CisJCWNvZXhfc3RhLT5idF9saW5rX2V4aXN0ID0gZmFsc2U7CisJCWNvZXhfc3RhLT5wYW5fZXhpc3QgPSBmYWxzZTsKKwkJY29leF9zdGEtPmEyZHBfZXhpc3QgPSBmYWxzZTsKKwkJY29leF9zdGEtPmhpZF9leGlzdCA9IGZhbHNlOworCQljb2V4X3N0YS0+c2NvX2V4aXN0ID0gZmFsc2U7CisJfSBlbHNlIHsgLyogY29ubmVjdGlvbiBleGlzdHMgKi8KKwkJY29leF9zdGEtPmJ0X2xpbmtfZXhpc3QgPSB0cnVlOworCQlpZiAoYnRfaW5mbyAmIEJUX0lORk9fODcyM0JfMUFOVF9CX0ZUUCkKKwkJCWNvZXhfc3RhLT5wYW5fZXhpc3QgPSB0cnVlOworCQllbHNlCisJCQljb2V4X3N0YS0+cGFuX2V4aXN0ID0gZmFsc2U7CisJCWlmIChidF9pbmZvICYgQlRfSU5GT184NzIzQl8xQU5UX0JfQTJEUCkKKwkJCWNvZXhfc3RhLT5hMmRwX2V4aXN0ID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29leF9zdGEtPmEyZHBfZXhpc3QgPSBmYWxzZTsKKwkJaWYgKGJ0X2luZm8gJiBCVF9JTkZPXzg3MjNCXzFBTlRfQl9ISUQpCisJCQljb2V4X3N0YS0+aGlkX2V4aXN0ID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29leF9zdGEtPmhpZF9leGlzdCA9IGZhbHNlOworCQlpZiAoYnRfaW5mbyAmIEJUX0lORk9fODcyM0JfMUFOVF9CX1NDT19FU0NPKQorCQkJY29leF9zdGEtPnNjb19leGlzdCA9IHRydWU7CisJCWVsc2UKKwkJCWNvZXhfc3RhLT5zY29fZXhpc3QgPSBmYWxzZTsKKwl9CisKKwloYWxidGM4NzIzYjFhbnRfdXBkYXRlX2J0X2xpbmtfaW5mbyhidGNvZXhpc3QpOworCisJaWYgKCEoYnRfaW5mbyZCVF9JTkZPXzg3MjNCXzFBTlRfQl9DT05ORUNUSU9OKSkgeworCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEU7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgIgorCQkJICAiQlQgTm9uLUNvbm5lY3RlZCBpZGxlISEhXG4iKTsKKwkvKiBjb25uZWN0aW9uIGV4aXN0cyBidXQgbm8gYnVzeSAqLworCX0gZWxzZSBpZiAoYnRfaW5mbyA9PSBCVF9JTkZPXzg3MjNCXzFBTlRfQl9DT05ORUNUSU9OKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIEJUIENvbm5lY3RlZC1pZGxlISEhXG4iKTsKKwl9IGVsc2UgaWYgKChidF9pbmZvICYgQlRfSU5GT184NzIzQl8xQU5UX0JfU0NPX0VTQ08pIHx8CisJCShidF9pbmZvICYgQlRfSU5GT184NzIzQl8xQU5UX0JfU0NPX0JVU1kpKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksICIKKwkJCSAgIkJUIFNDTyBidXN5ISEhXG4iKTsKKwl9IGVsc2UgaWYgKGJ0X2luZm8gJiBCVF9JTkZPXzg3MjNCXzFBTlRfQl9BQ0xfQlVTWSkgeworCQlpZiAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgIT0gY29leF9kbS0+YnRfc3RhdHVzKQorCQkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IGZhbHNlOworCisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIEJUIEFDTCBidXN5ISEhXG4iKTsKKwl9IGVsc2UgeworCQljb2V4X2RtLT5idF9zdGF0dXMgPQorCQkJQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfTUFYOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIEJUIE5vbi1EZWZpbmVkIHN0YXRlISFcbiIpOworCX0KKworCWlmICgoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCSAgICAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAorCSAgICAoQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykpCisJCWJ0X2J1c3kgPSB0cnVlOworCWVsc2UKKwkJYnRfYnVzeSA9IGZhbHNlOworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfVFJBRkZJQ19CVVNZLCAmYnRfYnVzeSk7CisKKwloYWxidGM4NzIzYjFhbnRfcnVuX2NvZXhpc3RfbWVjaGFuaXNtKGJ0Y29leGlzdCk7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODcyM2IxYW50X2hhbHRfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICJbQlRDb2V4XSwgSGFsdCBub3RpZnlcbiIpOworCisJYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0gPSB0cnVlOworCisJaGFsYnRjODcyM2IxYW50X1NldEFudFBhdGgoYnRjb2V4aXN0LCBCVENfQU5UX1BBVEhfQlQsIGZhbHNlLCB0cnVlKTsKKworCWhhbGJ0Yzg3MjNiMWFudF93aWZpX29mZl9od19jZmcoYnRjb2V4aXN0KTsKKwloYWxidGM4NzIzYjFhbnRfaWdub3JlX3dsYW5fYWN0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CisKKwloYWxidGM4NzIzYjFhbnRfcG93ZXJfc2F2ZV9zdGF0ZShidGNvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwKKwkJCQkJIDB4MCwgMHgwKTsKKwloYWxidGM4NzIzYjFhbnRfcHNfdGRtYShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIGZhbHNlLCAwKTsKKworCWV4X2hhbGJ0Yzg3MjNiMWFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KGJ0Y29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9wbnBfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCBwbnBfc3RhdGUpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgIltCVENvZXhdLCBQbnAgbm90aWZ5XG4iKTsKKworCWlmIChCVENfV0lGSV9QTlBfU0xFRVAgPT0gcG5wX3N0YXRlKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgUG5wIG5vdGlmeSB0byBTTEVFUFxuIik7CisJCWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtID0gdHJ1ZTsKKwkJaGFsYnRjODcyM2IxYW50X2lnbm9yZV93bGFuX2FjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYjFhbnRfcG93ZXJfc2F2ZV9zdGF0ZShidGNvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwKKwkJCQkJCSAweDAsIDB4MCk7CisJCWhhbGJ0Yzg3MjNiMWFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKKwl9IGVsc2UgaWYgKEJUQ19XSUZJX1BOUF9XQUtFX1VQID09IHBucF9zdGF0ZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIFBucCBub3RpZnkgdG8gV0FLRSBVUFxuIik7CisJCWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtID0gZmFsc2U7CisJCWhhbGJ0Yzg3MjNiMWFudF9pbml0X2h3X2NvbmZpZyhidGNvZXhpc3QsIGZhbHNlKTsKKwkJaGFsYnRjODcyM2IxYW50X2luaXRfY29leF9kbShidGNvZXhpc3QpOworCQloYWxidGM4NzIzYjFhbnRfcXVlcnlfYnRfaW5mbyhidGNvZXhpc3QpOworCX0KK30KKwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfcGVyaW9kaWNhbChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKmJvYXJkX2luZm8gPSAmYnRjb2V4aXN0LT5ib2FyZF9pbmZvOworCXN0cnVjdCBidGNfc3RhY2tfaW5mbyAqc3RhY2tfaW5mbyA9ICZidGNvZXhpc3QtPnN0YWNrX2luZm87CisJc3RhdGljIHU4IGRpc192ZXJfaW5mb19jbnQgPSAwOworCXUzMiBmd192ZXIgPSAwLCBidF9wYXRjaF92ZXIgPSAwOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkgICJbQlRDb2V4XSwgPT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSAgIlBlcmlvZGljYWw9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRpc192ZXJfaW5mb19jbnQgPD0gNSkgeworCQlkaXNfdmVyX2luZm9fY250ICs9IDE7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiW0JUQ29leF0sICoqKioqKioqKioqKioqKioqKioqKioqKioiCisJCQkgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIltCVENvZXhdLCBBbnQgUEcgTnVtLyBBbnQgTWVjaC8gIgorCQkJICAiQW50IFBvcyA9ICVkLyAlZC8gJWRcbiIsIFwKKwkJCSAgYm9hcmRfaW5mby0+cGdfYW50X251bSwgYm9hcmRfaW5mby0+YnRkbV9hbnRfbnVtLAorCQkJICBib2FyZF9pbmZvLT5idGRtX2FudF9wb3MpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIltCVENvZXhdLCBCVCBzdGFjay8gaGNpIGV4dCB2ZXIgPSAlcyAvICVkXG4iLCBcCisJCQkgICgoc3RhY2tfaW5mby0+cHJvZmlsZV9ub3RpZmllZCk/ICJZZXMiOiJObyIpLAorCQkJICBzdGFja19pbmZvLT5oY2lfdmVyc2lvbik7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfQlRfUEFUQ0hfVkVSLAorCQkJCSAgICZidF9wYXRjaF92ZXIpOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfRldfVkVSLCAmZndfdmVyKTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsCisJCQkgICJbQlRDb2V4XSwgQ29leFZlci8gRndWZXIvIFBhdGNoVmVyICIKKwkJCSAgIj0gJWRfJXgvIDB4JXgvIDB4JXgoJWQpXG4iLCBcCisJCQkgIGdsY29leF92ZXJfZGF0ZV84NzIzYl8xYW50LAorCQkJICBnbGNvZXhfdmVyXzg3MjNiXzFhbnQsIGZ3X3ZlciwKKwkJCSAgYnRfcGF0Y2hfdmVyLCBidF9wYXRjaF92ZXIpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIltCVENvZXhdLCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKwkJCSAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwl9CisKKyNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzg3MjNCXzFBTlQgPT0gMCkKKwloYWxidGM4NzIzYjFhbnRfcXVlcnlfYnRfaW5mbyhidGNvZXhpc3QpOworCWhhbGJ0Yzg3MjNiMWFudF9tb25pdG9yX2J0X2N0cihidGNvZXhpc3QpOworCWhhbGJ0Yzg3MjNiMWFudF9tb25pdG9yX2J0X2VuYWJsZV9kaXNhYmxlKGJ0Y29leGlzdCk7CisjZWxzZQorCWlmIChoYWxidGM4NzIzYjFhbnRfaXNfd2lmaV9zdGF0dXNfY2hhbmdlZChidGNvZXhpc3QpIHx8CisJICAgIGNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QpIHsKKwkJaWYgKGNvZXhfc3RhLT5zcGVjaWFsX3BrdF9wZXJpb2RfY250ID4gMikKKwkJCWhhbGJ0Yzg3MjNiMWFudF9ydW5fY29leGlzdF9tZWNoYW5pc20oYnRjb2V4aXN0KTsKKwl9CisKKwljb2V4X3N0YS0+c3BlY2lhbF9wa3RfcGVyaW9kX2NudCsrOworI2VuZGlmCit9CisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IxYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlMjkyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5oCkBAIC0wLDAgKzEsMTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIGZvbGxvd2luZyBpcyBmb3IgODcyM0IgMUFOVCBCVCBDby1leGlzdCBkZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQlRfQVVUT19SRVBPUlRfT05MWV84NzIzQl8xQU5UCQkJMQorCisjZGVmaW5lCUJUX0lORk9fODcyM0JfMUFOVF9CX0ZUUAkJCUJJVDcKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8xQU5UX0JfQTJEUAkJCUJJVDYKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8xQU5UX0JfSElECQkJQklUNQorI2RlZmluZQlCVF9JTkZPXzg3MjNCXzFBTlRfQl9TQ09fQlVTWQkJCUJJVDQKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8xQU5UX0JfQUNMX0JVU1kJCQlCSVQzCisjZGVmaW5lCUJUX0lORk9fODcyM0JfMUFOVF9CX0lOUV9QQUdFCQkJQklUMgorI2RlZmluZQlCVF9JTkZPXzg3MjNCXzFBTlRfQl9TQ09fRVNDTwkJCUJJVDEKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8xQU5UX0JfQ09OTkVDVElPTgkJCUJJVDAKKworI2RlZmluZQlCVF9JTkZPXzg3MjNCXzFBTlRfQTJEUF9CQVNJQ19SQVRFKF9CVF9JTkZPX0VYVF8pCVwKKwkJKCgoX0JUX0lORk9fRVhUXyZCSVQwKSk/IHRydWU6ZmFsc2UpCisKKyNkZWZpbmUJQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzFBTlQJCTIKKwordHlwZWRlZiBlbnVtIF9CVF9JTkZPX1NSQ184NzIzQl8xQU5UeworCUJUX0lORk9fU1JDXzg3MjNCXzFBTlRfV0lGSV9GVwkJCT0gMHgwLAorCUJUX0lORk9fU1JDXzg3MjNCXzFBTlRfQlRfUlNQCQkJPSAweDEsCisJQlRfSU5GT19TUkNfODcyM0JfMUFOVF9CVF9BQ1RJVkVfU0VORAkJPSAweDIsCisJQlRfSU5GT19TUkNfODcyM0JfMUFOVF9NQVgKK31CVF9JTkZPX1NSQ184NzIzQl8xQU5ULCpQQlRfSU5GT19TUkNfODcyM0JfMUFOVDsKKwordHlwZWRlZiBlbnVtIF9CVF84NzIzQl8xQU5UX0JUX1NUQVRVU3sKKwlCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUJPSAweDAsCisJQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUJCT0gMHgxLAorCUJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFCQk9IDB4MiwKKwlCVF84NzIzQl8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWQkJPSAweDMsCisJQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kJCT0gMHg0LAorCUJUXzg3MjNCXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWQkJPSAweDUsCisJQlRfODcyM0JfMUFOVF9CVF9TVEFUVVNfTUFYCit9QlRfODcyM0JfMUFOVF9CVF9TVEFUVVMsKlBCVF84NzIzQl8xQU5UX0JUX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9CVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTeworCUJUXzg3MjNCXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFCQkJPSAweDAsCisJQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOCQk9IDB4MSwKKwlCVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOCQkJPSAweDIsCisJQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU1BFQ0lBTF9QS1QJCQk9IDB4MywKKwlCVF84NzIzQl8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9JRExFCQkJPSAweDQsCisJQlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfQlVTWQkJCT0gMHg1LAorCUJUXzg3MjNCXzFBTlRfV0lGSV9TVEFUVVNfTUFYCit9QlRfODcyM0JfMUFOVF9XSUZJX1NUQVRVUywqUEJUXzg3MjNCXzFBTlRfV0lGSV9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfQlRfODcyM0JfMUFOVF9DT0VYX0FMR097CisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fVU5ERUZJTkVECQk9IDB4MCwKKwlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19TQ08JCQk9IDB4MSwKKwlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISUQJCQk9IDB4MiwKKwlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19BMkRQCQkJPSAweDMsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUwkJPSAweDQsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSCQkJPSAweDUsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFOSFMJCQk9IDB4NiwKKwlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUAkJPSAweDcsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRAkJPSAweDgsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSCQk9IDB4OSwKKwlCVF84NzIzQl8xQU5UX0NPRVhfQUxHT19ISURfQTJEUAkJPSAweGEsCisJQlRfODcyM0JfMUFOVF9DT0VYX0FMR09fTUFYCQkJPSAweGIsCit9QlRfODcyM0JfMUFOVF9DT0VYX0FMR08sKlBCVF84NzIzQl8xQU5UX0NPRVhfQUxHTzsKKworc3RydWN0IGNvZXhfZG1fODcyM2JfMWFudHsKKwkvKiBmdyBtZWNoYW5pc20gKi8KKwlib29sIHByZV9kZWNfYnRfcHdyOworCWJvb2wgY3VyX2RlY19idF9wd3I7CisJdTggcHJlX2Z3X2RhY19zd2luZ19sdmw7CisJdTggY3VyX2Z3X2RhY19zd2luZ19sdmw7CisJYm9vbCBjdXJfaWdub3JlX3dsYW5fYWN0OworCWJvb2wgcHJlX2lnbm9yZV93bGFuX2FjdDsKKwl1OCBwcmVfcHNfdGRtYTsKKwl1OCBjdXJfcHNfdGRtYTsKKwl1OCBwc190ZG1hX3BhcmFbNV07CisJdTggcHNfdGRtYV9kdV9hZGpfdHlwZTsKKwlib29sIGF1dG9fdGRtYV9hZGp1c3Q7CisJYm9vbCBwcmVfcHNfdGRtYV9vbjsKKwlib29sIGN1cl9wc190ZG1hX29uOworCWJvb2wgcHJlX2J0X2F1dG9fcmVwb3J0OworCWJvb2wgY3VyX2J0X2F1dG9fcmVwb3J0OworCXU4IHByZV9scHM7CisJdTggY3VyX2xwczsKKwl1OCBwcmVfcnB3bTsKKwl1OCBjdXJfcnB3bTsKKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWJvb2wgcHJlX3JmX3J4X2xwZl9zaHJpbms7CisJYm9vbCBjdXJfcmZfcnhfbHBmX3NocmluazsKKwl1MzIgYnRfcmYweDFlX2JhY2t1cDsKKwlib29sIHByZV9sb3dfcGVuYWx0eV9yYTsKKwlib29sIGN1cl9sb3dfcGVuYWx0eV9yYTsKKwlib29sIHByZV9kYWNfc3dpbmdfb247CisJdTMyIHByZV9kYWNfc3dpbmdfbHZsOworCWJvb2wgY3VyX2RhY19zd2luZ19vbjsKKwl1MzIgY3VyX2RhY19zd2luZ19sdmw7CisJYm9vbCBwcmVfYWRjX2JhY2tvZmY7CisJYm9vbCBjdXJfYWRjX2JhY2tvZmY7CisJYm9vbCBwcmVfYWdjX3RhYmxlX2VuOworCWJvb2wgY3VyX2FnY190YWJsZV9lbjsKKwl1MzIgcHJlX3ZhbDB4NmMwOworCXUzMiBjdXJfdmFsMHg2YzA7CisJdTMyIHByZV92YWwweDZjNDsKKwl1MzIgY3VyX3ZhbDB4NmM0OworCXUzMiBwcmVfdmFsMHg2Yzg7CisJdTMyIGN1cl92YWwweDZjODsKKwl1OCBwcmVfdmFsMHg2Y2M7CisJdTggY3VyX3ZhbDB4NmNjOworCWJvb2wgbGltaXRlZF9kaWc7CisKKwl1MzIgYmFja3VwX2FyZnJfY250MTsJLyogQXV0byBSYXRlIEZhbGxiYWNrIFJldHJ5IGNudCAqLworCXUzMiBiYWNrdXBfYXJmcl9jbnQyOwkvKiBBdXRvIFJhdGUgRmFsbGJhY2sgUmV0cnkgY250ICovCisJdTE2IGJhY2t1cF9yZXRyeV9saW1pdDsKKwl1OCBiYWNrdXBfYW1wZHVfbWF4X3RpbWU7CisKKwkvKiBhbGdvcml0aG0gcmVsYXRlZCAqLworCXU4IHByZV9hbGdvcml0aG07CisJdTggY3VyX2FsZ29yaXRobTsKKwl1OCBidF9zdGF0dXM7CisJdTggd2lmaV9jaG5sX2luZm9bM107CisKKwl1MzIgcHJlcmFfbWFzazsKKwl1MzIgY3VycmFfbWFzazsKKwl1OCBwcmVfYXJmcl90eXBlOworCXU4IGN1cl9hcmZyX3R5cGU7CisJdTggcHJlX3JldHJ5X2xpbWl0X3R5cGU7CisJdTggY3VyX3JldHJ5X2xpbWl0X3R5cGU7CisJdTggcHJlX2FtcGR1X3RpbWVfdHlwZTsKKwl1OCBjdXJfYW1wZHVfdGltZV90eXBlOworCisJdTggZXJyb3JfY29uZGl0aW9uOworfTsKKworc3RydWN0IGNvZXhfc3RhXzg3MjNiXzFhbnR7CisJYm9vbCBidF9saW5rX2V4aXN0OworCWJvb2wgc2NvX2V4aXN0OworCWJvb2wgYTJkcF9leGlzdDsKKwlib29sIGhpZF9leGlzdDsKKwlib29sIHBhbl9leGlzdDsKKworCWJvb2wgdW5kZXJfbHBzOworCWJvb2wgdW5kZXJfaXBzOworCXUzMiBzcGVjaWFsX3BrdF9wZXJpb2RfY250OworCXUzMiBoaWdoX3ByaW9yaXR5X3R4OworCXUzMiBoaWdoX3ByaW9yaXR5X3J4OworCXUzMiBsb3dfcHJpb3JpdHlfdHg7CisJdTMyIGxvd19wcmlvcml0eV9yeDsKKwl1OCBidF9yc3NpOworCXU4IHByZV9idF9yc3NpX3N0YXRlOworCXU4IHByZV93aWZpX3Jzc2lfc3RhdGVbNF07CisJYm9vbCBjMmhfYnRfaW5mb19yZXFfc2VudDsKKwl1OCBidF9pbmZvX2MyaFtCVF9JTkZPX1NSQ184NzIzQl8xQU5UX01BWF1bMTBdOworCXUzMiBidF9pbmZvX2MyaF9jbnRbQlRfSU5GT19TUkNfODcyM0JfMUFOVF9NQVhdOworCWJvb2wgYzJoX2J0X2lucXVpcnlfcGFnZTsKKwl1OCBidF9yZXRyeV9jbnQ7CisJdTggYnRfaW5mb19leHQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIGZvbGxvd2luZyBpcyBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBub3RpZnkgY29leCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZXhfaGFsYnRjODcyM2IxYW50X2luaXRfaHdjb25maWcoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpOwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfaW5pdF9jb2V4X2RtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhfaGFsYnRjODcyM2IxYW50X2lwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfbHBzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9zY2FuX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9jb25uZWN0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9zcGVjaWFsX3BhY2tldF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4NzIzYjFhbnRfYnRfaW5mb19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICAgIHU4ICp0bXBidWYsIHU4IGxlbmd0aCk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9oYWx0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9wbnBfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCBwbnBTdGF0ZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMWFudF9wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhfaGFsYnRjODcyM2IxYW50X2Rpc3BsYXlfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IxYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IyYW50LmMKQEAgLTAsMCArMSw0MTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGZpbGUgaXMgZm9yIFJUTDg3MjNCIENvLWV4aXN0IG1lY2hhbmlzbQorICoKKyAqIEhpc3RvcnkKKyAqIDIwMTIvMTEvMTUgQ29zYSBmaXJzdCBjaGVjayBpbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJoYWxidF9wcmVjb21wLmgiCisjaWYgMQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHbG9iYWwgdmFyaWFibGVzLCB0aGVzZSBhcmUgc3RhdGljIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBjb2V4X2RtXzg3MjNiXzJhbnQgZ2xjb2V4X2RtXzg3MjNiXzJhbnQ7CitzdGF0aWMgc3RydWN0IGNvZXhfZG1fODcyM2JfMmFudCAqY29leF9kbSA9ICZnbGNvZXhfZG1fODcyM2JfMmFudDsKK3N0YXRpYyBzdHJ1Y3QgY29leF9zdGFfODcyM2JfMmFudCBnbGNvZXhfc3RhXzg3MjNiXzJhbnQ7CitzdGF0aWMgc3RydWN0IGNvZXhfc3RhXzg3MjNiXzJhbnQgKmNvZXhfc3RhID0gJmdsY29leF9zdGFfODcyM2JfMmFudDsKKworY29uc3QgY2hhciAqY29uc3QgZ2xidF9pbmZvX3NyY184NzIzYl8yYW50W10gPSB7CisJIkJUIEluZm9bd2lmaSBmd10iLAorCSJCVCBJbmZvW2J0IHJzcF0iLAorCSJCVCBJbmZvW2J0IGF1dG8gcmVwb3J0XSIsCit9OworCit1MzIgZ2xjb2V4X3Zlcl9kYXRlXzg3MjNiXzJhbnQgPSAyMDEzMTExMzsKK3UzMiBnbGNvZXhfdmVyXzg3MjNiXzJhbnQgPSAweDNmOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxvY2FsIGZ1bmN0aW9uIHByb3RvIHR5cGUgaWYgbmVlZGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxvY2FsIGZ1bmN0aW9uIHN0YXJ0IHdpdGggaGFsYnRjODcyM2IyYW50XworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggaGFsYnRjODcyM2IyYW50X2J0X3Jzc2lfc3RhdGUodTggbGV2ZWxfbnVtLCB1OCByc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKQoreworCXMzMiBidF9yc3NpID0gMDsKKwl1OCBidF9yc3NpX3N0YXRlID0gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCisJYnRfcnNzaSA9IGNvZXhfc3RhLT5idF9yc3NpOworCisJaWYgKGxldmVsX251bSA9PSAyKSB7CisJCWlmICgoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7CisJCQlpZiAoYnRfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJICAgICAgIEJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQl8yQU5UKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJ0X3Jzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBIaWdoXG4iKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobGV2ZWxfbnVtID09IDMpIHsKKwkJaWYgKHJzc2lfdGhyZXNoID4gcnNzaV90aHJlc2gxKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIik7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOworCQl9CisKKwkJaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCWlmIChidF9yc3NpID49IHJzc2lfdGhyZXNoICsKKwkJCQkgICAgICAgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzJBTlQpIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSAiCisJCQkJCSAgInN3aXRjaCB0byBNZWRpdW1cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBMb3dcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0KKwkJCQkJCUJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCSAgIChjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0KKwkJCSAgIAkJCUJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgeworCQkJaWYgKGJ0X3Jzc2kgPj0gcnNzaV90aHJlc2gxICsKKwkJCQkgICAgICAgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzJBTlQpIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gSGlnaFxuIik7CisJCQl9IGVsc2UgaWYgKGJ0X3Jzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IE1lZGl1bVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYnRfcnNzaSA8IHJzc2lfdGhyZXNoMSkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIE1lZGl1bVxuIik7CisJCQl9IGVsc2UgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBIaWdoXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9IGJ0X3Jzc2lfc3RhdGU7CisKKwlyZXR1cm4gYnRfcnNzaV9zdGF0ZTsKK30KKwordTggaGFsYnRjODcyM2IyYW50X3dpZmlfcnNzaV9zdGF0ZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICB1OCBpbmRleCwgdTggbGV2ZWxfbnVtLAorCQkJCSAgIHU4IHJzc2lfdGhyZXNoLCB1OCByc3NpX3RocmVzaDEpCit7CisJczMyIHdpZmlfcnNzaT0wOworCXU4IHdpZmlfcnNzaV9zdGF0ZSA9IGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaV9yc3NpKTsKKworCWlmIChsZXZlbF9udW0gPT0gMikgeworCQlpZiAoKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkJCQkJQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkgICAgKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkgICAgCQkJCUJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYgKHdpZmlfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJCSBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0JfMkFOVCkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IExvd1xuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod2lmaV9yc3NpIDwgcnNzaV90aHJlc2gpIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIExvd1xuIik7CisJCQl9IGVsc2UgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IEhpZ2hcbiIpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChsZXZlbF9udW0gPT0gMykgeworCQlpZiAocnNzaV90aHJlc2ggPiByc3NpX3RocmVzaDEpIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIik7CisJCQlyZXR1cm4gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOworCQl9CisKKwkJaWYgKChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJCQkJCUJUQ19SU1NJX1NUQVRFX0xPVykgfHwKKwkJICAgIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0KKwkJICAgIAkJCQlCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKKwkJCWlmKHdpZmlfcnNzaSA+PSByc3NpX3RocmVzaCArCisJCQkJCUJUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQl8yQU5UKSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN3aXRjaCB0byBNZWRpdW1cbiIpOworCQkJfSBlbHNlIHsKKwkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzdGF5IGF0IExvd1xuIik7CisJCQl9CisJCX0gZWxzZSBpZiAoKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkJCQkJQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAorCQkJICAgKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PQorCQkJICAgCQkJQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7CisJCQlpZiAod2lmaV9yc3NpID49IHJzc2lfdGhyZXNoMSArCisJCQkJCSBCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0JfMkFOVCkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3dpdGNoIHRvIEhpZ2hcbiIpOworCQkJfSBlbHNlIGlmICh3aWZpX3Jzc2kgPCByc3NpX3RocmVzaCkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fV0lGSV9SU1NJX1NUQVRFLAorCQkJCQkgICJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlICIKKwkJCQkJICAic3RheSBhdCBNZWRpdW1cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoMSkgeworCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19XSUZJX1JTU0lfU1RBVEUsCisJCQkJCSAgIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgIgorCQkJCQkgICJzd2l0Y2ggdG8gTWVkaXVtXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1dJRklfUlNTSV9TVEFURSwKKwkJCQkJICAiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSAiCisJCQkJCSAgInN0YXkgYXQgSGlnaFxuIik7CisJCQl9CisJCX0KKwl9CisKKwljb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPSB3aWZpX3Jzc2lfc3RhdGU7CisKKwlyZXR1cm4gd2lmaV9yc3NpX3N0YXRlOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9tb25pdG9yX2J0X2VuYWJsZV9kaXNhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0YXRpYyBib29sIHByZV9idF9kaXNhYmxlZCA9IGZhbHNlOworCXN0YXRpYyB1MzIgYnRfZGlzYWJsZV9jbnQgPSAwOworCWJvb2wgYnRfYWN0aXZlID0gdHJ1ZSwgYnRfZGlzYWJsZWQgPSBmYWxzZTsKKworCS8qIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQgKi8KKwlpZiAoY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAwICYmCisJICAgIGNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHggPT0gMCAmJgorCSAgICBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDApCisJCWJ0X2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4ID09IDB4ZmZmZiAmJgorCSAgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKKwkgICAgY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCA9PSAweGZmZmYpCisJCWJ0X2FjdGl2ZSA9IHRydWU7CisKKwlpZiAoYnRfYWN0aXZlKSB7CisJCWJ0X2Rpc2FibGVfY250ID0gMDsKKwkJYnRfZGlzYWJsZWQgPSBmYWxzZTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLAorCQkJCSAgICZidF9kaXNhYmxlZCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkJICAiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpOworCX0gZWxzZSB7CisJCWJ0X2Rpc2FibGVfY250Kys7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkJICAiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLAorCQkJICBidF9kaXNhYmxlX2NudCk7CisJCWlmIChidF9kaXNhYmxlX2NudCA+PSAyKSB7CisJCQlidF9kaXNhYmxlZCA9IHRydWU7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsCisJCQkJCSAgICZidF9kaXNhYmxlZCk7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJCQkgICJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWQgISFcbiIpOworCQl9CisJfQorCisJaWYgKHByZV9idF9kaXNhYmxlZCAhPSBidF9kaXNhYmxlZCkgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwKKwkJCSAgIltCVENvZXhdLCBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsCisJCQkgIChwcmVfYnRfZGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksCisJCQkgIChidF9kaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSk7CisKKwkJcHJlX2J0X2Rpc2FibGVkID0gYnRfZGlzYWJsZWQ7CisJCWlmICghYnRfZGlzYWJsZWQpIHsKKwkJfSBlbHNlIHsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfbW9uaXRvcl9idF9jdHIoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTMyIHJlZ19ocF90eHJ4LCByZWdfbHBfdHhyeCwgdTMydG1wOworCXUzMiByZWdfaHBfdHggPSAwLCByZWdfaHBfcnggPSAwOworCXUzMiByZWdfbHBfdHggPSAwLCByZWdfbHBfcnggPSAwOworCisJcmVnX2hwX3R4cnggPSAweDc3MDsKKwlyZWdfbHBfdHhyeCA9IDB4Nzc0OworCisJdTMydG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIHJlZ19ocF90eHJ4KTsKKwlyZWdfaHBfdHggPSB1MzJ0bXAgJiBNQVNLTFdPUkQ7CisJcmVnX2hwX3J4ID0gKHUzMnRtcCAmIE1BU0tIV09SRCkgPj4gMTY7CisKKwl1MzJ0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgcmVnX2xwX3R4cngpOworCXJlZ19scF90eCA9IHUzMnRtcCAmIE1BU0tMV09SRDsKKwlyZWdfbHBfcnggPSAodTMydG1wICYgTUFTS0hXT1JEKSA+PiAxNjsKKworCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3R4ID0gcmVnX2hwX3R4OworCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID0gcmVnX2hwX3J4OworCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHggPSByZWdfbHBfdHg7CisJY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCA9IHJlZ19scF9yeDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLAorCQkgICJbQlRDb2V4XSwgSGlnaCBQcmlvcml0eSBUeC9SeChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsCisJCSAgcmVnX2hwX3R4cngsIHJlZ19ocF90eCwgcmVnX2hwX3R4LCByZWdfaHBfcngsIHJlZ19ocF9yeCk7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsCisJCSAgIltCVENvZXhdLCBMb3cgUHJpb3JpdHkgVHgvUngocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLAorCQkgIHJlZ19scF90eHJ4LCByZWdfbHBfdHgsIHJlZ19scF90eCwgcmVnX2xwX3J4LCByZWdfbHBfcngpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmUsIDB4Yyk7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X3F1ZXJ5X2J0X2luZm8oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCisJY29leF9zdGEtPmMyaF9idF9pbmZvX3JlcV9zZW50ID0gdHJ1ZTsKKworCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUMDsJLyogdHJpZ2dlciAqLworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsCisJCSAgIltCVENvZXhdLCBRdWVyeSBCdCBJbmZvLCBGVyB3cml0ZSAweDYxPTB4JXhcbiIsCisJCSAgaDJjX3BhcmFtZXRlclswXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjEsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCitib29sIGhhbGJ0Yzg3MjNiMmFudF9pc193aWZpX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0YXRpYyBib29sIHByZV93aWZpX2J1c3kgPSBmYWxzZTsKKwlzdGF0aWMgYm9vbCBwcmVfdW5kZXJfNHdheSA9IGZhbHNlOworCXN0YXRpYyBib29sIHByZV9idF9oc19vbiA9IGZhbHNlOworCWJvb2wgd2lmaV9idXN5ID0gZmFsc2UsIHVuZGVyXzR3YXkgPSBmYWxzZSwgYnRfaHNfb24gPSBmYWxzZTsKKwlib29sIHdpZmlfY29ubmVjdGVkID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELAorCQkJICAgJndpZmlfY29ubmVjdGVkKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJXzRfV0FZX1BST0dSRVNTLAorCQkJICAgJnVuZGVyXzR3YXkpOworCisJaWYgKHdpZmlfY29ubmVjdGVkKSB7CisJCWlmICh3aWZpX2J1c3kgIT0gcHJlX3dpZmlfYnVzeSkgeworCQkJcHJlX3dpZmlfYnVzeSA9IHdpZmlfYnVzeTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKHVuZGVyXzR3YXkgIT0gcHJlX3VuZGVyXzR3YXkpIHsKKwkJCXByZV91bmRlcl80d2F5ID0gdW5kZXJfNHdheTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKGJ0X2hzX29uICE9IHByZV9idF9oc19vbikgeworCQkJcHJlX2J0X2hzX29uID0gYnRfaHNfb247CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfdXBkYXRlX2J0X2xpbmtfaW5mbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKnN0cnVjdCBidGNfc3RhY2tfaW5mbyAqc3RhY2tfaW5mbyA9ICZidGNvZXhpc3QtPnN0YWNrX2luZm87Ki8KKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCWJvb2wgYnRfaHNfb24gPSBmYWxzZTsKKworI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODcyM0JfMkFOVCA9PSAxKSAvKiBwcm9maWxlIGZyb20gYnQgcGF0Y2ggKi8KKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKKworCWJ0X2xpbmtfaW5mby0+YnRfbGlua19leGlzdCA9IGNvZXhfc3RhLT5idF9saW5rX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ID0gY29leF9zdGEtPnNjb19leGlzdDsKKwlidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgPSBjb2V4X3N0YS0+YTJkcF9leGlzdDsKKwlidF9saW5rX2luZm8tPnBhbl9leGlzdCA9IGNvZXhfc3RhLT5wYW5fZXhpc3Q7CisJYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgPSBjb2V4X3N0YS0+aGlkX2V4aXN0OworCisJLyogd29yayBhcm91bmQgZm9yIEhTIG1vZGUuICovCisJaWYgKGJ0X2hzX29uKSB7CisJCWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ID0gdHJ1ZTsKKwkJYnRfbGlua19pbmZvLT5idF9saW5rX2V4aXN0ID0gdHJ1ZTsKKwl9CisjZWxzZQkvKiBwcm9maWxlIGZyb20gYnQgc3RhY2sgKi8KKwlidF9saW5rX2luZm8tPmJ0X2xpbmtfZXhpc3QgPSBzdGFja19pbmZvLT5idF9saW5rX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0ID0gc3RhY2tfaW5mby0+c2NvX2V4aXN0OworCWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCA9IHN0YWNrX2luZm8tPmEyZHBfZXhpc3Q7CisJYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgPSBzdGFja19pbmZvLT5wYW5fZXhpc3Q7CisJYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgPSBzdGFja19pbmZvLT5oaWRfZXhpc3Q7CisKKwkvKmZvciB3aW4tOCBzdGFjayBISUQgcmVwb3J0IGVycm9yKi8KKwlpZiAoIXN0YWNrX2luZm8tPmhpZF9leGlzdCkKKwkJc3RhY2tfaW5mby0+aGlkX2V4aXN0ID0gY29leF9zdGEtPmhpZF9leGlzdDsKKwkvKnN5bmMgIEJUSW5mbyB3aXRoIEJUIGZpcm13YXJlIGFuZCBzdGFjayovCisJLyogd2hlbiBzdGFjayBISUQgcmVwb3J0IGVycm9yLCBoZXJlIHdlIHVzZSB0aGUgaW5mbyBmcm9tIGJ0IGZ3LiovCisJaWYgKCFzdGFja19pbmZvLT5idF9saW5rX2V4aXN0KQorCQlzdGFja19pbmZvLT5idF9saW5rX2V4aXN0ID0gY29leF9zdGEtPmJ0X2xpbmtfZXhpc3Q7CisjZW5kaWYKKwkvKiBjaGVjayBpZiBTY28gb25seSAqLworCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCAmJiAhYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmCisJICAgICFidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJiAhYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpCisJCWJ0X2xpbmtfaW5mby0+c2NvX29ubHkgPSB0cnVlOworCWVsc2UKKwkJYnRfbGlua19pbmZvLT5zY29fb25seSA9IGZhbHNlOworCisJLyogY2hlY2sgaWYgQTJkcCBvbmx5ICovCisJaWYgKCFidF9saW5rX2luZm8tPnNjb19leGlzdCAmJiBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QgJiYKKwkgICAgIWJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmhpZF9leGlzdCkKKwkJYnRfbGlua19pbmZvLT5hMmRwX29ubHkgPSB0cnVlOworCWVsc2UKKwkJYnRfbGlua19pbmZvLT5hMmRwX29ubHkgPSBmYWxzZTsKKworCS8qIGNoZWNrIGlmIFBhbiBvbmx5ICovCisJaWYgKCFidF9saW5rX2luZm8tPnNjb19leGlzdCAmJiAhYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0ICYmCisJICAgIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0ICYmICFidF9saW5rX2luZm8tPmhpZF9leGlzdCkKKwkJYnRfbGlua19pbmZvLT5wYW5fb25seSA9IHRydWU7CisJZWxzZQorCQlidF9saW5rX2luZm8tPnBhbl9vbmx5ID0gZmFsc2U7CisKKwkvKiBjaGVjayBpZiBIaWQgb25seSAqLworCWlmICghYnRfbGlua19pbmZvLT5zY29fZXhpc3QgJiYgIWJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCAmJgorCSAgICAhYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYgYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpCisJCWJ0X2xpbmtfaW5mby0+aGlkX29ubHkgPSB0cnVlOworCWVsc2UKKwkJYnRfbGlua19pbmZvLT5oaWRfb25seSA9IGZhbHNlOworfQorCit1OCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX2FsZ29yaXRobShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyAqYnRfbGlua19pbmZvPSZidGNvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKKwlib29sIGJ0X2hzX29uID0gZmFsc2U7CisJdTggYWxnb3JpdGhtID0gQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fVU5ERUZJTkVEOworCXU4IG51bV9vZl9kaWZmX3Byb2ZpbGUgPSAwOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CisKKwlpZiAoIWJ0X2xpbmtfaW5mby0+YnRfbGlua19leGlzdCkgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgTm8gQlQgbGluayBleGlzdHMhISFcbiIpOworCQlyZXR1cm4gYWxnb3JpdGhtOworCX0KKworCWlmIChidF9saW5rX2luZm8tPnNjb19leGlzdCkKKwkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCkKKwkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCkKKwkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOworCWlmIChidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpCisJCW51bV9vZl9kaWZmX3Byb2ZpbGUrKzsKKworCWlmIChudW1fb2ZfZGlmZl9wcm9maWxlID09IDEpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIFNDTyBvbmx5XG4iKTsKKwkJCWFsZ29yaXRobSA9IEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1NDTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChidF9saW5rX2luZm8tPmhpZF9leGlzdCkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJICAiW0JUQ29leF0sIEhJRCBvbmx5XG4iKTsKKwkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19ISUQ7CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJICAiW0JUQ29leF0sIEEyRFAgb25seVxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fQTJEUDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIFBBTihIUykgb25seVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCQlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5IUzsKKwkJCQl9IGVsc2UgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCQlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChudW1fb2ZfZGlmZl9wcm9maWxlID09IDIpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBTQ08gKyBISURcbiIpOworCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJICAiW0JUQ29leF0sIFNDTyArIEEyRFAgPT0+IFNDT1xuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19TQ087CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIFNDTyArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5hMmRwX2V4aXN0KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJbQlRDb2V4XSwgSElEICsgQTJEUFxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CisJCQl9IGVsc2UgaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkJICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19ISUQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCQkJCSAgIGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCWlmIChidF9oc19vbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzsKKwkJCQl9IGVsc2UgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSxBMkRQICsgUEFOKEVEUilcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChudW1fb2ZfZGlmZl9wcm9maWxlID09IDMpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQIgorCQkJCQkgICIgPT0+IEhJRFxuIik7CisJCQkJYWxnb3JpdGhtID0gQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCQkgICBidF9saW5rX2luZm8tPnBhbl9leGlzdCkgeworCQkJCWlmIChidF9oc19vbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgU0NPICsgSElEICsgIgorCQkJCQkJICAiUEFOKEhTKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBTQ08gKyBISUQgKyAiCisJCQkJCQkgICJQQU4oRURSKVxuIik7CisJCQkJCWFsZ29yaXRobSA9CisJCQkJCSAgICBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCQkgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIFNDTyArIEEyRFAgKyAiCisJCQkJCQkgICJQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIFNDTyArIEEyRFAgKyAiCisJCQkJCQkgICJQQU4oRURSKSA9PT4gSElEXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJ0X2xpbmtfaW5mby0+aGlkX2V4aXN0ICYmCisJCQkgICAgYnRfbGlua19pbmZvLT5wYW5fZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpIHsKKwkJCQlpZiAoYnRfaHNfb24pIHsKKwkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkJICAiW0JUQ29leF0sIEhJRCArIEEyRFAgKyAiCisJCQkJCQkgICJQQU4oSFMpXG4iKTsKKwkJCQkJYWxnb3JpdGhtID0KKwkJCQkJICAgIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBISUQgKyBBMkRQICsgIgorCQkJCQkJICAiUEFOKEVEUilcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChudW1fb2ZfZGlmZl9wcm9maWxlID49IDMpIHsKKwkJaWYgKGJ0X2xpbmtfaW5mby0+c2NvX2V4aXN0KSB7CisJCQlpZiAoYnRfbGlua19pbmZvLT5oaWRfZXhpc3QgJiYKKwkJCSAgICBidF9saW5rX2luZm8tPnBhbl9leGlzdCAmJgorCQkJICAgIGJ0X2xpbmtfaW5mby0+YTJkcF9leGlzdCkgeworCQkJCWlmIChidF9oc19vbikgeworCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCQkgICJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEIgorCQkJCQkJICAiICsgQTJEUCArIFBBTihIUylcbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkJCSAgIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQICsiCisJCQkJCQkgICIgUEFOKEVEUik9PT5QQU4oRURSKStISURcbiIpOworCQkJCQlhbGdvcml0aG0gPQorCQkJCQkgICAgQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYWxnb3JpdGhtOworfQorCitib29sIGhhbGJ0Yzg3MjNiMmFudF9uZWVkX3RvX2RlY19idF9wd3Ioc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJYm9vbCBiUmV0ID0gZmFsc2U7CisJYm9vbCBidF9oc19vbiA9IGZhbHNlLCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlOworCXMzMiBidF9oc19yc3NpPTA7CisJdTggYnRfcnNzaV9zdGF0ZTsKKworCWlmICghYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJCUJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LAorCQkJQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJCUJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IyYW50X2J0X3Jzc2lfc3RhdGUoMiwgMjksIDApOworCisJaWYgKHdpZmlfY29ubmVjdGVkKSB7CisJCWlmIChidF9oc19vbikgeworCQkJaWYgKGJ0X2hzX3Jzc2kgPiAzNykgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywKKwkJCQkJICAiW0JUQ29leF0sIE5lZWQgdG8gZGVjcmVhc2UgYnQgIgorCQkJCQkgICJwb3dlciBmb3IgSFMgbW9kZSEhXG4iKTsKKwkJCQliUmV0ID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJICAgIChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCQkJCSAgIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0ICIKKwkJCQkJICAicG93ZXIgZm9yIFdpZmkgaXMgY29ubmVjdGVkISFcbiIpOworCQkJCWJSZXQgPSB0cnVlOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGJSZXQ7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X3NldF9md19kYWNfc3dpbmdfbGV2ZWwoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICB1OCBkYWNfc3dpbmdfbHZsKQoreworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKworCS8qIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKKwkgKiAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYgKi8KKwloMmNfcGFyYW1ldGVyWzBdID0gZGFjX3N3aW5nX2x2bDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNfc3dpbmdfbHZsKTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjQ9MHgleFxuIiwgaDJjX3BhcmFtZXRlclswXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjQsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfZGVjX2J0X3B3cihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgICAgYm9vbCBkZWNfYnRfcHdyKQoreworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPSB7MH07CisKKwloMmNfcGFyYW1ldGVyWzBdID0gMDsKKworCWlmIChkZWNfYnRfcHdyKQorCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVDE7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXMsIEZXIHdyaXRlIDB4NjI9MHgleFxuIiwKKwkJICAoZGVjX2J0X3B3cj8gIlllcyEhIjoiTm8hISIpLCBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2MiwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3Ioc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJYm9vbCBmb3JjZV9leGVjLCBib29sIGRlY19idF9wd3IpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgJXMgRGVjIEJUIHBvd2VyID0gJXNcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoZGVjX2J0X3B3cj8gIk9OIjoiT0ZGIikpOworCWNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyID0gZGVjX2J0X3B3cjsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVEZWNCdFB3cj0lZCwgYkN1ckRlY0J0UHdyPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOworCisJCWlmIChjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciA9PSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IyYW50X3NldF9md19kZWNfYnRfcHdyKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOworCisJY29leF9kbS0+cHJlX2RlY19idF9wd3IgPSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cjsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc2V0X2J0X2F1dG9fcmVwb3J0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQlib29sIGVuYWJsZV9hdXRvX3JlcG9ydCkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID0gezB9OworCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCisJaWYgKGVuYWJsZV9hdXRvX3JlcG9ydCkKKwkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsCisJCSAgIltCVENvZXhdLCBCVCBGVyBhdXRvIHJlcG9ydCA6ICVzLCBGVyB3cml0ZSAweDY4PTB4JXhcbiIsCisJCSAgKGVuYWJsZV9hdXRvX3JlcG9ydD8gIkVuYWJsZWQhISI6IkRpc2FibGVkISEiKSwKKwkJICBoMmNfcGFyYW1ldGVyWzBdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2OCwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X2J0X2F1dG9fcmVwb3J0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICBib29sIGZvcmNlX2V4ZWMsIGJvb2wgZW5hYmxlX2F1dG9fcmVwb3J0KQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywKKwkJICAiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLAorCQkgICgoZW5hYmxlX2F1dG9fcmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKTsKKwljb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQgPSBlbmFibGVfYXV0b19yZXBvcnQ7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlQnRBdXRvUmVwb3J0PSVkLCAiCisJCQkgICJiQ3VyQnRBdXRvUmVwb3J0PSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQsCisJCQkgIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCk7CisKKwkJaWYgKGNvZXhfZG0tPnByZV9idF9hdXRvX3JlcG9ydCA9PSBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNiMmFudF9zZXRfYnRfYXV0b19yZXBvcnQoYnRjb2V4aXN0LAorCQkJCQkgICBjb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQpOworCisJY29leF9kbS0+cHJlX2J0X2F1dG9fcmVwb3J0ID0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0OworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgICAgIGJvb2wgZm9yY2VfZXhlYywgdTggZndfZGFjX3N3aW5nX2x2bCkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd19kYWNfc3dpbmdfbHZsKTsKKwljb2V4X2RtLT5jdXJfZndfZGFjX3N3aW5nX2x2bCA9IGZ3X2RhY19zd2luZ19sdmw7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCAiCisJCQkgICJjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCwKKwkJCSAgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpOworCisJCWlmKGNvZXhfZG0tPnByZV9md19kYWNfc3dpbmdfbHZsID09CisJCSAgIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKQorCQkJcmV0dXJuOworCX0KKworCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfZGFjX3N3aW5nX2xldmVsKGJ0Y29leGlzdCwKKwkJCQkJICAgICAgIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKTsKKwljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfc3dfcmZfcnhfbHBmX2Nvcm5lcihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgICBib29sIHJ4X3JmX3Nocmlua19vbikKK3sKKwlpZiAocnhfcmZfc2hyaW5rX29uKSB7CisJCS8qIFNocmluayBSRiBSeCBMUEYgY29ybmVyICovCisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsCisJCQkJCSAgMHhmZmZmZiwgMHhmZmZmYyk7CisJfSBlbHNlIHsKKwkJLyogUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIgKi8KKwkJLyogQWZ0ZXIgaW5pdGlhbGl6ZWQsIHdlIGNhbiB1c2UgY29leF9kbS0+YnRSZjB4MWVCYWNrdXAgKi8KKwkJaWYgKGJ0Y29leGlzdC0+aW5pdGlsaXplZCkgeworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCQkJICAiW0JUQ29leF0sIFJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpOworCQkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDFlLAorCQkJCQkJICAweGZmZmZmLAorCQkJCQkJICBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwKTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfcmZfc2hyaW5rKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJICAgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCByeF9yZl9zaHJpbmtfb24pCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBSeCBSRiBTaHJpbmsgPSAlc1xuIiwKKwkJICAoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIChyeF9yZl9zaHJpbmtfb24/ICJPTiI6Ik9GRiIpKTsKKwljb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluayA9IHJ4X3JmX3Nocmlua19vbjsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCAiCisJCQkgICJiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwKKwkJCSAgY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmssCisJCQkgIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKTsKKworCQlpZiAoY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmsgPT0KKwkJICAgIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjJhbnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoYnRjb2V4aXN0LAorCQkJCQkJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmspOworCisJY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmsgPSBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluazsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc2V0X3N3X3BlbmFsdHlfdHhyYXRlX2FkYXB0aXZlKAorCQkJCQkJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCQlib29sIGxvd19wZW5hbHR5X3JhKQoreworCXU4IGgyY19wYXJhbWV0ZXJbNl0gPXswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSAweDY7CS8qIG9wQ29kZSwgMHg2PSBSZXRyeV9QZW5hbHR5Ki8KKworCWlmIChsb3dfcGVuYWx0eV9yYSkgeworCQloMmNfcGFyYW1ldGVyWzFdIHw9IEJJVDA7CisJCS8qbm9ybWFsIHJhdGUgZXhjZXB0IE1DUzcvNi81LCBPRkRNNTQvNDgvMzYqLworCQloMmNfcGFyYW1ldGVyWzJdID0gMHgwMDsKKwkJaDJjX3BhcmFtZXRlclszXSA9IDB4Zjc7ICAvKk1DUzcgb3IgT0ZETTU0Ki8KKwkJaDJjX3BhcmFtZXRlcls0XSA9IDB4Zjg7ICAvKk1DUzYgb3IgT0ZETTQ4Ki8KKwkJaDJjX3BhcmFtZXRlcls1XSA9IDB4Zjk7ICAvKk1DUzUgb3IgT0ZETTM2Ki8KKwl9CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIHNldCBXaUZpIExvdy1QZW5hbHR5IFJldHJ5OiAlcyIsCisJCSAgKGxvd19wZW5hbHR5X3JhPyAiT04hISI6Ik9GRiEhIikpOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDY5LCA2LCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfbG93X3BlbmFsdHlfcmEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBsb3dfcGVuYWx0eV9yYSkKK3sKKwkvKnJldHVybjsgKi8KKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csCisJCSAgIltCVENvZXhdLCAlcyB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKGxvd19wZW5hbHR5X3JhPyAiT04iOiJPRkYiKSk7CisJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhID0gbG93X3BlbmFsdHlfcmE7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlTG93UGVuYWx0eVJhPSVkLCAiCisJCQkgICJiQ3VyTG93UGVuYWx0eVJhPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEsCisJCQkgIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSk7CisKKwkJaWYgKGNvZXhfZG0tPnByZV9sb3dfcGVuYWx0eV9yYSA9PSBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmEpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNiMmFudF9zZXRfc3dfcGVuYWx0eV90eHJhdGVfYWRhcHRpdmUoYnRjb2V4aXN0LAorCQkJCQkJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKTsKKworCWNvZXhfZG0tPnByZV9sb3dfcGVuYWx0eV9yYSA9IGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc2V0X2RhY19zd2luZ19yZWcoc3RydWN0IGJ0Y19jb2V4aXN0ICogYnRjb2V4aXN0LAorCQkJCSAgICAgICB1MzIgbGV2ZWwpCit7CisJdTggdmFsID0gKHU4KSBsZXZlbDsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJICAiW0JUQ29leF0sIFdyaXRlIFN3RGFjU3dpbmcgPSAweCV4XG4iLCBsZXZlbCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4ODgzLCAweDNlLCB2YWwpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfc3dfZnVsbHRpbWVfZGFjX3N3aW5nKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgICAgYm9vbCBzd19kYWNfc3dpbmdfb24sCisJCQkJCSAgICAgICB1MzIgc3dfZGFjX3N3aW5nX2x2bCkKK3sKKwlpZihzd19kYWNfc3dpbmdfb24pCisJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZGFjX3N3aW5nX3JlZyhidGNvZXhpc3QsIHN3X2RhY19zd2luZ19sdmwpOworCWVsc2UKKwkJaGFsYnRjODcyM2IyYW50X3NldF9kYWNfc3dpbmdfcmVnKGJ0Y29leGlzdCwgMHgxOCk7Cit9CisKKwordm9pZCBoYWxidGM4NzIzYjJhbnRfZGFjX3N3aW5nKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJICAgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBkYWNfc3dpbmdfb24sCisJCQkgICAgICAgdTMyIGRhY19zd2luZ19sdmwpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nX2x2bD0weCV4XG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwKKwkJICAoZGFjX3N3aW5nX29uPyAiT04iOiJPRkYiKSwgZGFjX3N3aW5nX2x2bCk7CisJY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbiA9IGRhY19zd2luZ19vbjsKKwljb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCA9IGRhY19zd2luZ19sdmw7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwiCisJCQkgICIgYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24sIGNvZXhfZG0tPnByZV9kYWNfc3dpbmdfbHZsLAorCQkJICBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uLAorCQkJICBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCk7CisKKwkJaWYgKChjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID09IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24pICYmCisJCSAgICAoY29leF9kbS0+cHJlX2RhY19zd2luZ19sdmwgPT0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwpKQorCQkJcmV0dXJuOworCX0KKwltZGVsYXkoMzApOworCWhhbGJ0Yzg3MjNiMmFudF9zZXRfc3dfZnVsbHRpbWVfZGFjX3N3aW5nKGJ0Y29leGlzdCwgZGFjX3N3aW5nX29uLAorCQkJCQkJICBkYWNfc3dpbmdfbHZsKTsKKworCWNvZXhfZG0tPnByZV9kYWNfc3dpbmdfb24gPSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uOworCWNvZXhfZG0tPnByZV9kYWNfc3dpbmdfbHZsID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmw7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X3NldF9hZGNfYmFja29mZihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICAgIGJvb2wgYWRjX2JhY2tvZmYpCit7CisJaWYgKGFkY19iYWNrb2ZmKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT24hXG4iKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4YzA1LCAweDMwLCAweDMpOworCX0gZWxzZSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT2ZmIVxuIik7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweGMwNSwgMHgzMCwgMHgxKTsKKwl9Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X2FkY19iYWNrb2ZmKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSBib29sIGZvcmNlX2V4ZWMsIGJvb2wgYWRjX2JhY2tvZmYpCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoYWRjX2JhY2tvZmY/ICJPTiI6Ik9GRiIpKTsKKwljb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmID0gYWRjX2JhY2tvZmY7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYsCisJCQkgIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpOworCisJCWlmIChjb2V4X2RtLT5wcmVfYWRjX2JhY2tfb2ZmID09IGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNiMmFudF9zZXRfYWRjX2JhY2tvZmYoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKTsKKworCWNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYgPSBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfYWdjX3RhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSAgIGJvb2wgYWdjX3RhYmxlX2VuKQoreworCXU4IHJzc2lfYWRqdXN0X3ZhbCA9IDA7CisKKwkvKiAgQkIgQUdDIEdhaW4gVGFibGUgKi8KKwlpZiAoYWdjX3RhYmxlX2VuKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEJCIEFnYyBUYWJsZSBPbiFcbiIpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweDZlMUEwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHg2ZDFCMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4NmMxQzAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweDZiMUQwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHg2YTFFMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4NjkxRjAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweDY4MjAwMDAxKTsKKwl9IGVsc2UgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJCSAgIltCVENvZXhdLCBCQiBBZ2MgVGFibGUgT2ZmIVxuIik7CisJIAlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweGFhMUEwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHhhOTFCMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4YTgxQzAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweGE3MUQwMDAxKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweGM3OCwgMHhhNjFFMDAwMSk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHhjNzgsIDB4YTUxRjAwMDEpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4Yzc4LCAweGE0MjAwMDAxKTsKKwl9CisKKworCS8qIFJGIEdhaW4gKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4ZWYsIDB4ZmZmZmYsIDB4MDIwMDApOworCWlmIChhZ2NfdGFibGVfZW4pIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCQkgICJbQlRDb2V4XSwgQWdjIFRhYmxlIE9uIVxuIik7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwKKwkJCQkJICAweGZmZmZmLCAweDM4ZmZmKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLAorCQkJCQkgIDB4ZmZmZmYsIDB4MzhmZmUpOworCX0gZWxzZSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLAorCQkJCQkgIDB4ZmZmZmYsIDB4MzgwYzMpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsCisJCQkJCSAgMHhmZmZmZiwgMHgyOGNlNik7CisJfQorCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwKTsKKworCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZCwgMHhmZmZmZiwgMHgxKTsKKworCWlmIChhZ2NfdGFibGVfZW4pIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCQkgICJbQlRDb2V4XSwgQWdjIFRhYmxlIE9uIVxuIik7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHg0MCwKKwkJCQkJICAweGZmZmZmLCAweDM4ZmZmKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDQwLAorCQkJCQkgIDB4ZmZmZmYsIDB4MzhmZmUpOworCX0gZWxzZSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkJICAiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKTsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDQwLAorCQkJCQkgIDB4ZmZmZmYsIDB4MzgwYzMpOworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4NDAsCisJCQkJCSAgMHhmZmZmZiwgMHgyOGNlNik7CisJfQorCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZCwgMHhmZmZmZiwgMHgwKTsKKworCS8qIHNldCByc3NpQWRqdXN0VmFsIGZvciB3aWZpIG1vZHVsZS4gKi8KKwlpZiAoYWdjX3RhYmxlX2VuKQorCQlyc3NpX2FkanVzdF92YWwgPSA4OworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sCisJCQkgICAmcnNzaV9hZGp1c3RfdmFsKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWdjX3RhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJICAgICAgIGJvb2wgZm9yY2VfZXhlYywgYm9vbCBhZ2NfdGFibGVfZW4pCit7CisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLAorCQkgICJbQlRDb2V4XSwgJXMgJXMgQWdjIFRhYmxlXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwKKwkJICAoYWdjX3RhYmxlX2VuPyAiRW5hYmxlIjoiRGlzYWJsZSIpKTsKKwljb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuID0gYWdjX3RhYmxlX2VuOworCisJaWYgKCFmb3JjZV9leGVjKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgYlByZUFnY1RhYmxlRW49JWQsIGJDdXJBZ2NUYWJsZUVuPSVkXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuLCBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKTsKKworCQlpZiAoY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiA9PSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKQorCQkJcmV0dXJuOworCX0KKwloYWxidGM4NzIzYjJhbnRfc2V0X2FnY190YWJsZShidGNvZXhpc3QsIGFnY190YWJsZV9lbik7CisKKwljb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuID0gY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbjsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc2V0X2NvZXhfdGFibGUoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgIHUzMiB2YWwweDZjMCwgdTMyIHZhbDB4NmM0LAorCQkJCSAgICB1MzIgdmFsMHg2YzgsIHU4IHZhbDB4NmNjKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjMD0weCV4XG4iLCB2YWwweDZjMCk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjMCwgdmFsMHg2YzApOworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsCisJCSAgIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM0PTB4JXhcbiIsIHZhbDB4NmM0KTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmM0LCB2YWwweDZjNCk7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywKKwkJICAiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Yzg9MHgleFxuIiwgdmFsMHg2YzgpOworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzgsIHZhbDB4NmM4KTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLAorCQkgICJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjYz0weCV4XG4iLCB2YWwweDZjYyk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDZjYywgdmFsMHg2Y2MpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCWJvb2wgZm9yY2VfZXhlYywgdTMyIHZhbDB4NmMwLAorCQkJCXUzMiB2YWwweDZjNCwgdTMyIHZhbDB4NmM4LAorCQkJCXU4IHZhbDB4NmNjKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywKKwkJICAiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwiCisJCSAgIiAweDZjND0weCV4LCAweDZjOD0weCV4LCAweDZjYz0weCV4XG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgdmFsMHg2YzAsCisJCSAgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM0ID0gdmFsMHg2YzQ7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmM4ID0gdmFsMHg2Yzg7CisJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CisKKwlpZiAoIWZvcmNlX2V4ZWMpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCAiCisJCQkgICJwcmVWYWwweDZjND0weCV4LCBwcmVWYWwweDZjOD0weCV4LCAiCisJCQkgICJwcmVWYWwweDZjYz0weCV4ICEhXG4iLAorCQkJICBjb2V4X2RtLT5wcmVfdmFsMHg2YzAsIGNvZXhfZG0tPnByZV92YWwweDZjNCwKKwkJCSAgY29leF9kbS0+cHJlX3ZhbDB4NmM4LCBjb2V4X2RtLT5wcmVfdmFsMHg2Y2MpOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGN1clZhbDB4NmMwPTB4JXgsICIKKwkJCSAgImN1clZhbDB4NmM0PTB4JXgsIGN1clZhbDB4NmM4PTB4JXgsICIKKwkJCSAgImN1clZhbDB4NmNjPTB4JXggISFcbiIsCisJCQkgIGNvZXhfZG0tPmN1cl92YWwweDZjMCwgY29leF9kbS0+Y3VyX3ZhbDB4NmM0LAorCQkJICBjb2V4X2RtLT5jdXJfdmFsMHg2YzgsIGNvZXhfZG0tPmN1cl92YWwweDZjYyk7CisKKwkJaWYgKChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgorCQkgICAgKGNvZXhfZG0tPnByZV92YWwweDZjNCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzQpICYmCisJCSAgICAoY29leF9kbS0+cHJlX3ZhbDB4NmM4ID09IGNvZXhfZG0tPmN1cl92YWwweDZjOCkgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSkKKwkJCXJldHVybjsKKwl9CisJaGFsYnRjODcyM2IyYW50X3NldF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgdmFsMHg2YzAsIHZhbDB4NmM0LAorCQkJCSAgICAgICB2YWwweDZjOCwgdmFsMHg2Y2MpOworCisJY29leF9kbS0+cHJlX3ZhbDB4NmMwID0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwOworCWNvZXhfZG0tPnByZV92YWwweDZjNCA9IGNvZXhfZG0tPmN1cl92YWwweDZjNDsKKwljb2V4X2RtLT5wcmVfdmFsMHg2YzggPSBjb2V4X2RtLT5jdXJfdmFsMHg2Yzg7CisJY29leF9kbS0+cHJlX3ZhbDB4NmNjID0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICBib29sIGZvcmNlX2V4ZWMsIHU4IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTU1NTU1NTUsCisJCQkJCSAgIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NWE1YTVhNWEsCisJCQkJCSAgIDB4NWE1YTVhNWEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4YWFhYWFhYWEsCisJCQkJCSAgIDB4YWFhYWFhYWEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4ZmZmZmZmZmYsCisJCQkJCSAgIDB4ZmZmZmZmZmYsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NWZmZjVmZmYsCisJCQkJCSAgIDB4NWZmZjVmZmYsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTVmZjU1ZmYsCisJCQkJCSAgIDB4NWE1YTVhNWEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTVmZjU1ZmYsCisJCQkJCSAgIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NWFlYTVhZWEsCisJCQkJCSAgIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTVmZjU1ZmYsCisJCQkJCSAgIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGUoYnRjb2V4aXN0LCBmb3JjZV9leGVjLCAweDU1ZmY1NWZmLAorCQkJCQkgICAweDVhZmY1YWZmLCAweGZmZmYsIDB4Myk7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlKGJ0Y29leGlzdCwgZm9yY2VfZXhlYywgMHg1NWZmNTVmZiwKKwkJCQkJICAgMHg1YTVmNWE1ZiwgMHhmZmZmLCAweDMpOworCQlicmVhazsKKwljYXNlIDEyOgorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZShidGNvZXhpc3QsIGZvcmNlX2V4ZWMsIDB4NTVmZjU1ZmYsCisJCQkJCSAgIDB4NWY1ZjVmNWYsIDB4ZmZmZiwgMHgzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfaWdub3JlX3dsYW5fYWN0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgYm9vbCBlbmFibGUpCit7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCisJaWYgKGVuYWJsZSkKKwkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOy8qIGZ1bmN0aW9uIGVuYWJsZSovCisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIHNldCBGVyBmb3IgQlQgSWdub3JlIFdsYW5fQWN0LCAiCisJCSAgIkZXIHdyaXRlIDB4NjM9MHgleFxuIiwgaDJjX3BhcmFtZXRlclswXSk7CisKKwlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjMsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9pZ25vcmVfd2xhbl9hY3Qoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICBib29sIGZvcmNlX2V4ZWMsIGJvb2wgZW5hYmxlKQoreworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywKKwkJICAiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsCisJCSAgKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoZW5hYmxlPyAiT04iOiJPRkYiKSk7CisJY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCA9IGVuYWJsZTsKKworCWlmICghZm9yY2VfZXhlYykgeworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIGJQcmVJZ25vcmVXbGFuQWN0ID0gJWQsICIKKwkJCSAgImJDdXJJZ25vcmVXbGFuQWN0ID0gJWQhIVxuIiwKKwkJCSAgY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCwKKwkJCSAgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCk7CisKKwkJaWYgKGNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QgPT0KKwkJICAgIGNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QpCisJCQlyZXR1cm47CisJfQorCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfaWdub3JlX3dsYW5fYWN0KGJ0Y29leGlzdCwgZW5hYmxlKTsKKworCWNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QgPSBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0OworfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggYnl0ZTEsCisJCQkJICAgIHU4IGJ5dGUyLCB1OCBieXRlMywgdTggYnl0ZTQsIHU4IGJ5dGU1KQoreworCXU4IGgyY19wYXJhbWV0ZXJbNV0gPXswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSBieXRlMTsKKwloMmNfcGFyYW1ldGVyWzFdID0gYnl0ZTI7CisJaDJjX3BhcmFtZXRlclsyXSA9IGJ5dGUzOworCWgyY19wYXJhbWV0ZXJbM10gPSBieXRlNDsKKwloMmNfcGFyYW1ldGVyWzRdID0gYnl0ZTU7CisKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbMF0gPSBieXRlMTsKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbMV0gPSBieXRlMjsKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbMl0gPSBieXRlMzsKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbM10gPSBieXRlNDsKKwljb2V4X2RtLT5wc190ZG1hX3BhcmFbNF0gPSBieXRlNTsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLAorCQkgICJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2MCg1Ynl0ZXMpPTB4JXglMDh4XG4iLAorCQkgIGgyY19wYXJhbWV0ZXJbMF0sCisJCSAgaDJjX3BhcmFtZXRlclsxXSA8PCAyNCB8IGgyY19wYXJhbWV0ZXJbMl0gPDwgMTYgfAorCQkgIGgyY19wYXJhbWV0ZXJbM10gPDwgOCB8IGgyY19wYXJhbWV0ZXJbNF0pOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYwLCA1LCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICBib29sIHNocmlua19yeF9scGYsIGJvb2wgbG93X3BlbmFsdHlfcmEsCisJCQkJICAgYm9vbCBsaW1pdGVkX2RpZywgYm9vbCBidF9sbmFfY29uc3RyYWluKQoreworCS8qCisJdTMyCXdpZmlfYnc7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmKEJUQ19XSUZJX0JXX0hUNDAgIT0gd2lmaV9idykgIC8vb25seSBzaHJpbmsgUkYgUnggTFBGIGZvciBIVDQwCisJeworCQlpZiAoc2hyaW5rX3J4X2xwZikKKwkJCXNocmlua19yeF9scGYgPSBmYWxzZTsKKwl9CisJKi8KKworCWhhbGJ0Yzg3MjNiMmFudF9yZl9zaHJpbmsoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgc2hyaW5rX3J4X2xwZik7CisJaGFsYnRjODcyM2IyYW50X2xvd19wZW5hbHR5X3JhKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGxvd19wZW5hbHR5X3JhKTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgICBib29sIGFnY190YWJsZV9zaGlmdCwgYm9vbCBhZGNfYmFja29mZiwKKwkJCQkgICBib29sIHN3X2RhY19zd2luZywgdTMyIGRhY19zd2luZ19sdmwpCit7CisJaGFsYnRjODcyM2IyYW50X2FnY190YWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZ2NfdGFibGVfc2hpZnQpOworCS8qaGFsYnRjODcyM2IyYW50X2FkY19iYWNrb2ZmKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGFkY19iYWNrb2ZmKTsqLworCWhhbGJ0Yzg3MjNiMmFudF9kYWNfc3dpbmcoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgc3dfZGFjX3N3aW5nLAorCQkJCSAgZGFjX3N3aW5nX2x2bCk7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X3NldF9hbnRfcGF0aChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgIHU4IGFudHBvc190eXBlLCBib29sIGluaXRfaHdjZmcsCisJCQkJICBib29sIHdpZmlfb2ZmKQoreworCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICZidGNvZXhpc3QtPmJvYXJkX2luZm87CisJdTMyIGZ3X3ZlciA9IDAsIHUzMnRtcD0wOworCWJvb2wgcGdfZXh0X3N3aXRjaCA9IGZhbHNlOworCWJvb2wgdXNlX2V4dF9zd2l0Y2ggPSBmYWxzZTsKKwl1OCBoMmNfcGFyYW1ldGVyWzJdID17MH07CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0VYVF9TV0lUQ0gsICZwZ19leHRfc3dpdGNoKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfRldfVkVSLCAmZndfdmVyKTsKKworCWlmICgoZndfdmVyPDB4YzAwMDApIHx8IHBnX2V4dF9zd2l0Y2gpCisJCXVzZV9leHRfc3dpdGNoID0gdHJ1ZTsKKworCWlmIChpbml0X2h3Y2ZnKSB7CisJCS8qIDB4NGNbMjNdPTAsIDB4NGNbMjRdPTEgIEFudGVubmEgY29udHJvbCBieSBXTC9CVCAqLworCQl1MzJ0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0Yyk7CisJCXUzMnRtcCAmPSB+QklUMjM7CisJCXUzMnRtcCB8PSBCSVQyNDsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDRjLCB1MzJ0bXApOworCisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5NzQsIDB4ZmYpOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg5NDQsIDB4MywgMHgzKTsKKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkzMCwgMHg3Nyk7CisJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDY3LCAweDIwLCAweDEpOworCisJCS8qIEZvcmNlIEdOVF9CVCB0byBsb3cgKi8KKwkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4NzY1LCAweDE4LCAweDApOworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LCAweDApOworCisJCWlmIChib2FyZF9pbmZvLT5idGRtX2FudF9wb3MgPT0gQlRDX0FOVEVOTkFfQVRfTUFJTl9QT1JUKSB7CisJCQkvKiB0ZWxsIGZpcm13YXJlICJubyBhbnRlbm5hIGludmVyc2UiICovCisJCQloMmNfcGFyYW1ldGVyWzBdID0gMDsKKwkJCWgyY19wYXJhbWV0ZXJbMV0gPSAxOyAgLyogZXh0IHN3aXRjaCB0eXBlICovCisJCQlidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjUsIDIsCisJCQkJCQloMmNfcGFyYW1ldGVyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRlbGwgZmlybXdhcmUgImFudGVubmEgaW52ZXJzZSIgKi8KKwkJCWgyY19wYXJhbWV0ZXJbMF0gPSAxOworCQkJaDJjX3BhcmFtZXRlclsxXSA9IDE7ICAvKiBleHQgc3dpdGNoIHR5cGUgKi8KKwkJCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2NSwgMiwKKwkJCQkJCWgyY19wYXJhbWV0ZXIpOworCQl9CisJfQorCisJLyogZXh0IHN3aXRjaCBzZXR0aW5nICovCisJaWYgKHVzZV9leHRfc3dpdGNoKSB7CisJCSAvKiBmaXhlZCBpbnRlcm5hbCBzd2l0Y2ggUzEtPldpRmksIFMwLT5CVCAqLworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShidGNvZXhpc3QsIDB4OTQ4LCAweDApOworCQlzd2l0Y2ggKGFudHBvc190eXBlKSB7CisJCWNhc2UgQlRDX0FOVF9XSUZJX0FUX01BSU46CisJCQkvKiBleHQgc3dpdGNoIG1haW4gYXQgd2lmaSAqLworCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4OTJjLAorCQkJCQkJCSAgIDB4MywgMHgxKTsKKwkJCWJyZWFrOworCQljYXNlIEJUQ19BTlRfV0lGSV9BVF9BVVg6CisJCQkvKiBleHQgc3dpdGNoIGF1eCBhdCB3aWZpICovCisJCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAweDkyYywgMHgzLCAweDIpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgewkvKiBpbnRlcm5hbCBzd2l0Y2ggKi8KKwkJLyogZml4ZWQgZXh0IHN3aXRjaCAqLworCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg5MmMsIDB4MywgMHgxKTsKKwkJc3dpdGNoIChhbnRwb3NfdHlwZSkgeworCQljYXNlIEJUQ19BTlRfV0lGSV9BVF9NQUlOOgorCQkJLyogZml4ZWQgaW50ZXJuYWwgc3dpdGNoIFMxLT5XaUZpLCBTMC0+QlQgKi8KKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzJieXRlKGJ0Y29leGlzdCwgMHg5NDgsIDB4MCk7CisJCQlicmVhazsKKwkJY2FzZSBCVENfQU5UX1dJRklfQVRfQVVYOgorCQkJLyogZml4ZWQgaW50ZXJuYWwgc3dpdGNoIFMwLT5XaUZpLCBTMS0+QlQgKi8KKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzJieXRlKGJ0Y29leGlzdCwgMHg5NDgsIDB4MjgwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIGJvb2wgZm9yY2VfZXhlYywKKwkJCSAgICAgYm9vbCB0dXJuX29uLCB1OCB0eXBlKQoreworCisJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLAorCQkgICJbQlRDb2V4XSwgJXMgdHVybiAlcyBQUyBURE1BLCB0eXBlPSVkXG4iLAorCQkgIChmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKHR1cm5fb24/ICJPTiI6Ik9GRiIpLCB0eXBlKTsKKwljb2V4X2RtLT5jdXJfcHNfdGRtYV9vbiA9IHR1cm5fb247CisJY29leF9kbS0+Y3VyX3BzX3RkbWEgPSB0eXBlOworCisJaWYgKCFmb3JjZV9leGVjKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9wc190ZG1hX29uLCBjb2V4X2RtLT5jdXJfcHNfdGRtYV9vbik7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgcHJlUHNUZG1hID0gJWQsIGN1clBzVGRtYSA9ICVkISFcbiIsCisJCQkgIGNvZXhfZG0tPnByZV9wc190ZG1hLCBjb2V4X2RtLT5jdXJfcHNfdGRtYSk7CisKKwkJaWYgKChjb2V4X2RtLT5wcmVfcHNfdGRtYV9vbiA9PSBjb2V4X2RtLT5jdXJfcHNfdGRtYV9vbikgJiYKKwkJICAgIChjb2V4X2RtLT5wcmVfcHNfdGRtYSA9PSBjb2V4X2RtLT5jdXJfcHNfdGRtYSkpCisJCQlyZXR1cm47CisJfQorCWlmICh0dXJuX29uKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIDE6CisJCWRlZmF1bHQ6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFhLAorCQkJCQkJICAgICAgIDB4MWEsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTIsCisJCQkJCQkgICAgICAgMHgxMiwgMHhlMSwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYywKKwkJCQkJCSAgICAgICAweDMsIDB4ZjEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTAsCisJCQkJCQkgICAgICAgMHgwMywgMHhmMSwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYSwKKwkJCQkJCSAgICAgICAweDFhLCAweDYwLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDEyLAorCQkJCQkJICAgICAgIDB4MTIsIDB4NjAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MWMsCisJCQkJCQkgICAgICAgMHgzLCAweDcwLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGEzLCAweDEwLAorCQkJCQkJICAgICAgIDB4MywgMHg3MCwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYSwKKwkJCQkJCSAgICAgICAweDFhLCAweGUxLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxMiwKKwkJCQkJCSAgICAgICAweDEyLCAweGUxLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHhhLAorCQkJCQkJICAgICAgIDB4YSwgMHhlMSwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4NSwKKwkJCQkJCSAgICAgICAweDUsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMTM6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFhLAorCQkJCQkJICAgICAgIDB4MWEsIDB4NjAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMTQ6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDEyLAorCQkJCQkJICAgICAgIDB4MTIsIDB4NjAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweGEsCisJCQkJCQkgICAgICAgMHhhLCAweDYwLCAweDkwKTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaGFsYnRjODcyM2IyYW50X3NldF9md19wc190ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHg1LAorCQkJCQkJICAgICAgIDB4NSwgMHg2MCwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSAxNzoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4YTMsIDB4MmYsCisJCQkJCQkgICAgICAgMHgyZiwgMHg2MCwgMHg5MCk7CisJCQlicmVhazsKKwkJY2FzZSAxODoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4NSwKKwkJCQkJCSAgICAgICAweDUsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMTk6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LAorCQkJCQkJICAgICAgIDB4MjUsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMjA6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LAorCQkJCQkJICAgICAgIDB4MjUsIDB4NjAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgMjE6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDE1LAorCQkJCQkJICAgICAgIDB4MDMsIDB4NzAsIDB4OTApOworCQkJYnJlYWs7CisJCWNhc2UgNzE6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDFhLAorCQkJCQkJICAgICAgIDB4MWEsIDB4ZTEsIDB4OTApOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIFBTIHRkbWEgKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgMDoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsCisJCQkJCQkgICAgICAgMHg0MCwgMHgwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQloYWxidGM4NzIzYjJhbnRfc2V0X2Z3X3BzX3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwgMHgwLAorCQkJCQkJICAgICAgIDB4NDgsIDB4MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zZXRfZndfcHNfdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsCisJCQkJCQkgICAgICAgMHg0MCwgMHgwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogdXBkYXRlIHByZSBzdGF0ZSAqLworCWNvZXhfZG0tPnByZV9wc190ZG1hX29uID0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb247CisJY29leF9kbS0+cHJlX3BzX3RkbWEgPSBjb2V4X2RtLT5jdXJfcHNfdGRtYTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfY29leF9hbGxvZmYoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJLyogZncgYWxsIG9mZiAqLworCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAxKTsKKwloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKwloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwkvKiBzdyBhbGwgb2ZmICovCisJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAweDE4KTsKKworCS8qIGh3IGFsbCBvZmYgKi8KKwlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwgMHhmZmZmZiwgMHgwKTsKKwloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cit9CisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X2luaXRfY29leF9kbShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwkvKiBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbSovCisKKwloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIGZhbHNlLCAxKTsKKwloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDYpOworCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UpOworCisJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAweDE4KTsKK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX2J0X2lucXVpcnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJYm9vbCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlOworCWJvb2wgbG93X3B3cl9kaXNhYmxlID0gdHJ1ZTsKKworCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCQkJICAgJmxvd19wd3JfZGlzYWJsZSk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCSAgICZ3aWZpX2Nvbm5lY3RlZCk7CisKKwlpZiAod2lmaV9jb25uZWN0ZWQpIHsKKwkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDcpOworCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKKwl9IGVsc2UgeworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAxKTsKKwl9CisJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCA2KTsKKwloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDB4MTgpOworCisJY29leF9kbS0+bmVlZF9yZWNvdmVyXzB4OTQ4ID0gdHJ1ZTsKKwljb2V4X2RtLT5iYWNrdXBfMHg5NDggPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzJieXRlKGJ0Y29leGlzdCwgMHg5NDgpOworCisJaGFsYnRjODcyM2IyYW50X3NldF9hbnRfcGF0aChidGNvZXhpc3QsIEJUQ19BTlRfV0lGSV9BVF9BVVgsCisJCQkJICAgICBmYWxzZSwgZmFsc2UpOworfQorCitib29sIGhhbGJ0Yzg3MjNiMmFudF9pc19jb21tb25fYWN0aW9uKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWJvb2wgYkNvbW1vbiA9IGZhbHNlLCB3aWZpX2Nvbm5lY3RlZCA9IGZhbHNlOworCWJvb2wgd2lmaV9idXN5ID0gZmFsc2U7CisJYm9vbCBidF9oc19vbiA9IGZhbHNlLCBsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsCisJCQkgICAmd2lmaV9jb25uZWN0ZWQpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKKworCWlmICghd2lmaV9jb25uZWN0ZWQpIHsKKwkJbG93X3B3cl9kaXNhYmxlID0gZmFsc2U7CisJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCQkJCSAgICZsb3dfcHdyX2Rpc2FibGUpOworCisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBXaWZpIG5vbi1jb25uZWN0ZWQgaWRsZSEhXG4iKTsKKworCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwgMHhmZmZmZiwKKwkJCQkJICAweDApOworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CisJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAxKTsKKwkJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworIAkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLAorCQkJCQkgICAgICBmYWxzZSk7CisJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKwkJCQkJICAgICAgMHgxOCk7CisKKwkJYkNvbW1vbiA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKEJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PQorCQkgICAgY29leF9kbS0+YnRfc3RhdHVzKSB7CisJCQlsb3dfcHdyX2Rpc2FibGUgPSBmYWxzZTsKKwkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsCisJCQkJCSAgIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCQkJCQkgICAmbG93X3B3cl9kaXNhYmxlKTsKKworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBXaWZpIGNvbm5lY3RlZCArICIKKwkJCQkgICJCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIik7CisKKwkJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLAorCQkJCQkJICAweGZmZmZmLCAweDApOworCQkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLAorCQkJCQkJMSk7CisJCQloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCSAweGIpOworCQkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKworCSAgICAgIAkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisKKwkJCWJDb21tb24gPSB0cnVlOworCQl9IGVsc2UgaWYgKEJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09CisJCQkgICBjb2V4X2RtLT5idF9zdGF0dXMpIHsKKwkJCWxvd19wd3JfZGlzYWJsZSA9IHRydWU7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LAorCQkJCQkgICBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwKKwkJCQkJICAgJmxvd19wd3JfZGlzYWJsZSk7CisKKwkJCWlmKGJ0X2hzX29uKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyAiCisJCQkJICAiQlQgY29ubmVjdGVkLWlkbGUhIVxuIik7CisKKwkJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLAorCQkJCQkJICAweGZmZmZmLCAweDApOworCQkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgIE5PUk1BTF9FWEVDLCAwKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLAorCQkJCQkJMSk7CisJCQloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLAorCQkJCQkJCSAweGIpOworCQkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCSAgIGZhbHNlKTsKKworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKworCQkJYkNvbW1vbiA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlsb3dfcHdyX2Rpc2FibGUgPSB0cnVlOworCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwKKwkJCQkJICAgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsCisJCQkJCSAgICZsb3dfcHdyX2Rpc2FibGUpOworCisJCQlpZiAod2lmaV9idXN5KSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCQkgICJbQlRDb2V4XSwgV2lmaSBDb25uZWN0ZWQtQnVzeSArICIKKwkJCQkJICAiQlQgQnVzeSEhXG4iKTsKKwkJCQliQ29tbW9uID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWlmKGJ0X2hzX29uKQorCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJCSAgIltCVENvZXhdLCBXaWZpIENvbm5lY3RlZC1JZGxlICsgIgorCQkJCQkgICJCVCBCdXN5ISFcbiIpOworCisJCQkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLAorCQkJCQkJCSAgMHgxLCAweGZmZmZmLCAweDApOworCQkJCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsCisJCQkJCQkJCSAgICBOT1JNQUxfRVhFQywKKwkJCQkJCQkJICAgIDcpOworCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQkJdHJ1ZSwgMjEpOworCQkJCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwKKwkJCQkJCQkJIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgMHhiKTsKKwkJCQlpZiAoaGFsYnRjODcyM2IyYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQkJCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsCisJCQkJCQkJCSAgIE5PUk1BTF9FWEVDLAorCQkJCQkJCQkgICB0cnVlKTsKKwkJCQllbHNlCisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwKKwkJCQkJCQkJICAgTk9STUFMX0VYRUMsCisJCQkJCQkJCSAgIGZhbHNlKTsKKwkJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLAorCQkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwKKwkJCQkJCQkgICAgICBmYWxzZSk7CisJCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwKKwkJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsCisJCQkJCQkJICAgICAgMHgxOCk7CisJCQkJYkNvbW1vbiA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYkNvbW1vbjsKK30KK3ZvaWQgaGFsYnRjODcyM2IyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgIGJvb2wgc2NvX2hpZCwgYm9vbCB0eF9wYXVzZSwKKwkJCQkJICB1OCBtYXhfaW50ZXJ2YWwpCit7CisJc3RhdGljIHMzMiB1cCwgZG4sIG0sIG4sIHdhaXRfY291bnQ7CisJLyowOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbiovCisJczMyIHJlc3VsdDsKKwl1OCByZXRyeUNvdW50PTA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsCisJCSAgIltCVENvZXhdLCBUZG1hRHVyYXRpb25BZGp1c3QoKVxuIik7CisKKwlpZiAoIWNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QpIHsKKwkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IHRydWU7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpOworCQlpZiAoc2NvX2hpZCkgeworCQkJaWYgKHR4X3BhdXNlKSB7CisJCQkJaWYgKG1heF9pbnRlcnZhbCA9PSAxKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDEzOworCQkJCX1lbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMikgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNDsKKwkJCQl9IGVsc2UgaWYgKG1heF9pbnRlcnZhbCA9PSAzKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0gZWxzZSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYobWF4X2ludGVydmFsID09IDEpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDIpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTApOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTA7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMykgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodHhfcGF1c2UpIHsKKwkJCQlpZiAobWF4X2ludGVydmFsID09IDEpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA1OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDIpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA2OworCQkJCX0gZWxzZSBpZiAobWF4X2ludGVydmFsID09IDMpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChtYXhfaW50ZXJ2YWwgPT0gMSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMikgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDI7CisJCQkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMykgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAzOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXVwID0gMDsKKwkJZG4gPSAwOworCQltID0gMTsKKwkJbj0gMzsKKwkJcmVzdWx0ID0gMDsKKwkJd2FpdF9jb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJLyphY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiovCisJCXJldHJ5Q291bnQgPSBjb2V4X3N0YS0+YnRfcmV0cnlfY250OworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCk7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkgICJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCB3YWl0X2NvdW50PSVkXG4iLAorCQkJICB1cCwgZG4sIG0sIG4sIHdhaXRfY291bnQpOworCQlyZXN1bHQgPSAwOworCQl3YWl0X2NvdW50Kys7CisJCSAvKiBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiovCisJCWlmIChyZXRyeUNvdW50ID09IDApIHsKKwkJCXVwKys7CisJCQlkbi0tOworCisJCQlpZiAoZG4gPD0gMCkKKwkJCQlkbiA9IDA7CisKKwkJCWlmICh1cCA+PSBuKSB7CisJCQkJd2FpdF9jb3VudCA9IDA7CisJCQkJbiA9IDM7CisJCQkJdXAgPSAwOworCQkJCWRuID0gMDsKKwkJCQlyZXN1bHQgPSAxOworIAkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisgCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJbQlRDb2V4XSwgSW5jcmVhc2Ugd2lmaSAiCisJCQkJCSAgImR1cmF0aW9uISFcbiIpOworCQkJfS8qIDw9MyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiovCisJCX0gZWxzZSBpZiAocmV0cnlDb3VudCA8PSAzKSB7CisJCQl1cC0tOworCQkJZG4rKzsKKworCQkJaWYgKHVwIDw9IDApCisJCQkJdXAgPSAwOworCisJCQlpZiAoZG4gPT0gMikgeworCQkJCWlmICh3YWl0X2NvdW50IDw9IDIpCisJCQkJCW0rKzsKKwkJCQllbHNlCisJCQkJCW0gPSAxOworCisJCQkJaWYgKG0gPj0gMjApCisJCQkJCW0gPSAyMDsKKworCQkJCW4gPSAzICogbTsKKwkJCQl1cCA9IDA7CisJCQkJZG4gPSAwOworCQkJCXdhaXRfY291bnQgPSAwOworCQkJCXJlc3VsdCA9IC0xOworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gIgorCQkJCQkgICJmb3IgcmV0cnlDb3VudGVyPDMhIVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod2FpdF9jb3VudCA9PSAxKQorCQkJCW0rKzsKKwkJCWVsc2UKKwkJCQltID0gMTsKKworCQkJaWYgKG0gPj0gMjApCisJCQkJbSA9IDIwOworCisJCQluID0gMyAqIG07CisJCQl1cCA9IDA7CisJCQlkbiA9IDA7CisJCQl3YWl0X2NvdW50ID0gMDsKKwkJCXJlc3VsdCA9IC0xOworCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkgICJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiAiCisJCQkJICAiZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpOworCQl9CisKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCSAgIltCVENvZXhdLCBtYXggSW50ZXJ2YWwgPSAlZFxuIiwgbWF4X2ludGVydmFsKTsKKwkJaWYgKG1heF9pbnRlcnZhbCA9PSAxKSB7CisJCQlpZiAodHhfcGF1c2UpIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkJCSAgIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIik7CisKKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNzEpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA1OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDU7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDYpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNjsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNCkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA4KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDg7CisJCQkJfQorCisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTMpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNDsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTIpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTYpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTY7CisJCQkJfQorCisJCQkJaWYgKHJlc3VsdCA9PSAtMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA2OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDg7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTQ7CisJCQkJCX0gZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE2OworCQkJCQl9CisJCQkJfSAgZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDY7CisJCQkJCX0gZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA2KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDU7CisJCQkJCX0gZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTQpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE0OworCQkJCQl9IGVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTM7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKTsKKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3MSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3MTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNDsKKwkJCQl9CisKKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgOSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTApOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTA7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTYpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTI7CisJCQkJfQorCisJCQkJaWYgKHJlc3VsdCA9PSAtMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNzEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDI7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICAzOworCQkJCQl9IGVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA0OworCQkJCQl9IGVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gOSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMDsKKyAJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTI7CisJCQkJCX0KKwkJCQl9ICBlbHNlIGlmIChyZXN1bHQgPT0gMSkgeworCQkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICAzOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcxKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICA3MTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDkpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA5OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYobWF4X2ludGVydmFsID09IDIpIHsKKwkJCWlmICh0eF9wYXVzZSkgeworCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwKKwkJCQkJICBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKKwkJCQkJICAiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKTsKKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA2KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDY7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDYpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNjsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDMpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNCkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA4KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDg7CisJCQkJfQorCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA5KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE0OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTQpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTQ7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEyKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE2KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE2OworCQkJCX0KKwkJCQlpZiAocmVzdWx0ID09IC0xKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA1KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDY7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA3OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDcpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA4KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgODsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE2KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNjsKKwkJCQkJfQorCQkJCX0gIGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDc7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA2OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA2KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgNjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE0KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxNDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpOworCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA1KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDYpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMik7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA4KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNDsKKwkJCQl9CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEzKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDEwOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTQpeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMDsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDExOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTYpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTI7CisJCQkJfQorCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDM7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA0OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMCk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTA7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTI7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA0KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDM7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDIpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICAyOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAyKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMjsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMDsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDEwKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChtYXhfaW50ZXJ2YWwgPT0gMykgeworCQkJaWYgKHR4X3BhdXNlKSB7CisJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLAorCQkJCQkgIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCQkgICJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpOworCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gNzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA3OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDc7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA0KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDgpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gODsKKwkJCQl9CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTU7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxNSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxNTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDExKSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDE1KTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDE1OworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTIpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTYpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTY7CisJCQkJfQorCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDUpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA2KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDc7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDgpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA4OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEzKSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE0KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTYpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE2OworCQkJCQl9CisJCQkJfSAgZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCA3KTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgNzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDc7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDcpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA3OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE2KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE0KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTUpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgIDE1OworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sCisJCQkJCSAgQUxHT19UUkFDRV9GV19ERVRBSUwsCisJCQkJCSAgIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIik7CisJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDUpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAzOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gNikgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDM7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA3KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMzsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDgpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgNCk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA0OworCQkJCX0KKwkJCQlpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTMpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTEpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTE7CisJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxNCkgeworCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKKwkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDE1KSB7CisJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDExOworCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTYpIHsKKwkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMTIpOworCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTI7CisJCQkJfQorCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJCQkJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDM7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDQpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICA0OworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTApIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMSk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTE7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAxMik7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgMTI7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisJCQkJCWlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA0KSB7CisJCQkJCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYSgKKwkJCQkJCQkJYnRjb2V4aXN0LAorCQkJCQkJCQlOT1JNQUxfRVhFQywKKwkJCQkJCQkJdHJ1ZSwgMyk7CisJCQkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0KKwkJCQkJCQkJCSAgICAgIDM7CisJCQkJCX0gZWxzZSBpZiAoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMykgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDMpOworCQkJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9CisJCQkJCQkJCQkgICAgICAzOworCQkJCQl9IGVsc2UgaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpIHsKKwkJCQkJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKAorCQkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJCU5PUk1BTF9FWEVDLAorCQkJCQkJCQl0cnVlLCAzKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAgMzsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMikgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfSBlbHNlIGlmIChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMCkgeworCQkJCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoCisJCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQkJTk9STUFMX0VYRUMsCisJCQkJCQkJCXRydWUsIDExKTsKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPQorCQkJCQkJCQkJICAgICAxMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qaWYgY3VycmVudCBQc1RkbWEgbm90IG1hdGNoIHdpdGggdGhlIHJlY29yZGVkIG9uZSAod2hlbiBzY2FuLCBkaGNwLi4pLAorCSAqdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCBpdCBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQgb25lLiovCisJaWYgKGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IGNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpIHsKKwkJYm9vbCBzY2FuID0gZmFsc2UsIGxpbmsgPSBmYWxzZSwgcm9hbSA9IGZhbHNlOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJICAiW0JUQ29leF0sIFBzVGRtYSB0eXBlIGRpc21hdGNoISEhLCAiCisJCQkgICJjdXJQc1RkbWE9JWQsIHJlY29yZFBzVGRtYT0lZFxuIiwKKwkJCSAgY29leF9kbS0+Y3VyX3BzX3RkbWEsIGNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpOworCisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmcm9hbSk7CisKKwkJaWYgKCFzY2FuICYmICFsaW5rICYmICFyb2FtKQorCQkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwKKwkJCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpOworCQllbHNlCisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLAorCQkJCSAgIltCVENvZXhdLCByb2FtaW5nL2xpbmsvc2NhbiBpcyB1bmRlciIKKwkJCQkgICIgcHJvZ3Jlc3MsIHdpbGwgYWRqdXN0IG5leHQgdGltZSEhIVxuIik7CisJfQorfQorCisvKiBTQ08gb25seSBvciBTQ08rUEFOKEhTKSAqLwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX3NjbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGU7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjJhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDE1LCAwKTsKKworCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLCAweGZmZmZmLCAweDApOworCisJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CisKKwlpZiAoaGFsYnRjODcyM2IyYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJLypmb3IgU0NPIHF1YWxpdHkgYXQgMTFiL2cgbW9kZSovCisJaWYgKEJUQ19XSUZJX0JXX0xFR0FDWSA9PSB3aWZpX2J3KQorCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CisJZWxzZSAgLypmb3IgU0NPIHF1YWxpdHkgJiB3aWZpIHBlcmZvcm1hbmNlIGJhbGFuY2UgYXQgMTFuIG1vZGUqLworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgOCk7CisKKwkvKmZvciB2b2ljZSBxdWFsaXR5ICovCisJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOworCisJLyogc3cgbWVjaGFuaXNtICovCisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIHRydWUsIDB4NCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICB0cnVlLCAweDQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgdHJ1ZSwgMHg0KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICB0cnVlLCAweDQpOworCQl9CisJfQorfQorCisKK3ZvaWQgaGFsYnRjODcyM2IyYW50X2FjdGlvbl9oaWQoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOworCXUzMiB3aWZpX2J3OworCisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IyYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJICAwLCAyLCAxNSwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF9idF9yc3NpX3N0YXRlKDIsIDI5LCAwKTsKKworCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLCAweGZmZmZmLCAweDApOworCisJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZiAoaGFsYnRjODcyM2IyYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaWYgKEJUQ19XSUZJX0JXX0xFR0FDWSA9PSB3aWZpX2J3KSAvKi9mb3IgSElEIGF0IDExYi9nIG1vZGUqLworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNyk7CisJZWxzZSAgLypmb3IgSElEIHF1YWxpdHkgJiB3aWZpIHBlcmZvcm1hbmNlIGJhbGFuY2UgYXQgMTFuIG1vZGUqLworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgOSk7CisKKwlpZiAoKGJ0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkgICAgKGJ0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkKKwkJaGFsYnRjODcyM2IyYW50X3BzX3RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CisJZWxzZQorCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CisKKwkvKiBzdyBtZWNoYW5pc20gKi8KKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworIAkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKyAJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCisvKkEyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKSovCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25fYTJkcChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIHdpZmlfcnNzaV9zdGF0ZTEsIGJ0X3Jzc2lfc3RhdGU7CisJdTMyIHdpZmlfYnc7CisJdTggYXBfbnVtID0gMDsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMTUsIDApOworCXdpZmlfcnNzaV9zdGF0ZTEgPSBoYWxidGM4NzIzYjJhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAxLCAyLCA0MCwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF9idF9yc3NpX3N0YXRlKDIsIDI5LCAwKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfQVBfTlVNLCAmYXBfbnVtKTsKKworCS8qIGRlZmluZSB0aGUgb2ZmaWNlIGVudmlyb25tZW50ICovCisJLyogZHJpdmVyIGRvbid0IGtub3cgQVAgbnVtIGluIExpbnV4LCBzbyB3ZSB3aWxsIG5ldmVyIGVudGVyIHRoaXMgaWYgKi8KKwlpZiAoYXBfbnVtID49IDEwICYmIEJUQ19SU1NJX0hJR0god2lmaV9yc3NpX3N0YXRlMSkpIHsKKwkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsIDB4ZmZmZmYsCisJCQkJCSAgMHgwKTsKKwkJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKwkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDApOworCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMSk7CisKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCQlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICB0cnVlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICB0cnVlLCAweDE4KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsIDB4ZmZmZmYsIDB4MCk7CisKKwloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjJhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDcpOworCisJaWYgKChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJICAgIChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpCisJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsZmFsc2UsIGZhbHNlLCAxKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsZmFsc2UsIHRydWUsIDEpOworCisJLyogc3cgbWVjaGFuaXNtICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisgCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX2EyZHBfcGFuX2hzKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMTUsIDApOworCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsIDB4ZmZmZmYsIDB4MCk7CisKKwloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjJhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDcpOworCisJaGFsYnRjODcyM2IyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsIDIpOworCisJLyogc3cgbWVjaGFuaXNtICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisgCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25fcGFuX2VkcihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7CisJdTMyIHdpZmlfYnc7CisKKwl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjJhbnRfd2lmaV9yc3NpX3N0YXRlKGJ0Y29leGlzdCwKKwkJCQkJCQkgIDAsIDIsIDE1LCAwKTsKKwlidF9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IyYW50X2J0X3Jzc2lfc3RhdGUoMiwgMjksIDApOworCisJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsIDB4ZmZmZmYsIDB4MCk7CisKKwloYWxidGM4NzIzYjJhbnRfZndfZGFjX3N3aW5nX2x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKKworCWlmIChoYWxidGM4NzIzYjJhbnRfbmVlZF90b19kZWNfYnRfcHdyKGJ0Y29leGlzdCkpCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOworCWVsc2UKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOworCisJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDEwKTsKKworCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCSAgICAoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKQorCQloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF9wc190ZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOworCisJLyogc3cgbWVjaGFuaXNtICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCisKKy8qUEFOKEhTKSBvbmx5Ki8KK3ZvaWQgaGFsYnRjODcyM2IyYW50X2FjdGlvbl9wYW5faHMoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaV9yc3NpX3N0YXRlOworCXUzMiB3aWZpX2J3OworCisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IyYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJICAwLCAyLCAxNSwgMCk7CisKKwlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwgMHhmZmZmZiwgMHgwKTsKKworCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNyk7CisKKwloYWxidGM4NzIzYjJhbnRfcHNfdGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9Cit9CisKKy8qUEFOKEVEUikrQTJEUCovCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25fcGFuX2Vkcl9hMmRwKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMTUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjJhbnRfYnRfcnNzaV9zdGF0ZSgyLCAyOSwgMCk7CisKKwlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwgMHhmZmZmZiwgMHgwKTsKKworCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYgKGhhbGJ0Yzg3MjNiMmFudF9uZWVkX3RvX2RlY19idF9wd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCSAgICAoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsTk9STUFMX0VYRUMsIDEyKTsKKwkJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKKwkJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIGZhbHNlLAorCQkJCQkJCSAgICAgdHJ1ZSwgMyk7CisJCWVsc2UKKwkJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIGZhbHNlLAorCQkJCQkJCSAgICAgZmFsc2UsIDMpOworCX0gZWxzZSB7CisJCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA3KTsKKwkJaGFsYnRjODcyM2IyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UsIHRydWUsIDMpOworCX0KKworCS8qIHN3IG1lY2hhbmlzbQkqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX3Bhbl9lZHJfaGlkKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMTUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjJhbnRfYnRfcnNzaV9zdGF0ZSgyLCAyOSwgMCk7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisKKwlpZiAoaGFsYnRjODcyM2IyYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCSAgICAoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsCisJCQkJCQkJIDMpOworCQkJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwKKwkJCQkJCQkgICAgIE5PUk1BTF9FWEVDLCAxMSk7CisJCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwKKwkJCQkJCSAgMHhmZmZmZiwgMHg3ODApOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywKKwkJCQkJCQkgNik7CisJCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgICAgTk9STUFMX0VYRUMsIDcpOworCQkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDEsCisJCQkJCQkgIDB4ZmZmZmYsIDB4MCk7CisJCX0KKwkJaGFsYnRjODcyM2IyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsIDIpOworCX0gZWxzZSB7CisJCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCQloYWxidGM4NzIzYjJhbnRfY29leF90YWJsZV93aXRoX3R5cGUoYnRjb2V4aXN0LE5PUk1BTF9FWEVDLCAxMSk7CisJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLCAweGZmZmZmLAorCQkJCQkgIDB4MCk7CisJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIHRydWUsIHRydWUsIDIpOworCX0KKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKyAJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSl7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCisvKiBISUQrQTJEUCtQQU4oRURSKSAqLwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX2hpZF9hMmRwX3Bhbl9lZHIoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOworCXUzMiB3aWZpX2J3OworCisJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODcyM2IyYW50X3dpZmlfcnNzaV9zdGF0ZShidGNvZXhpc3QsCisJCQkJCQkJICAwLCAyLCAxNSwgMCk7CisJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF9idF9yc3NpX3N0YXRlKDIsIDI5LCAwKTsKKworCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxLCAweGZmZmZmLCAweDApOworCisJaGFsYnRjODcyM2IyYW50X2Z3X2RhY19zd2luZ19sdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CisKKwlpZiAoaGFsYnRjODcyM2IyYW50X25lZWRfdG9fZGVjX2J0X3B3cihidGNvZXhpc3QpKQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKKwllbHNlCisJCWhhbGJ0Yzg3MjNiMmFudF9kZWNfYnRfcHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCisJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDcpOworCisJaWYgKChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJICAgIChidF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJaWYgKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKKwkJCWhhbGJ0Yzg3MjNiMmFudF90ZG1hX2R1cmF0aW9uX2FkanVzdChidGNvZXhpc3QsIHRydWUsCisJCQkJCQkJICAgICB0cnVlLCAyKTsKKwkJZWxzZQorCQkJaGFsYnRjODcyM2IyYW50X3RkbWFfZHVyYXRpb25fYWRqdXN0KGJ0Y29leGlzdCwgdHJ1ZSwKKwkJCQkJCQkgICAgIGZhbHNlLCAzKTsKKwl9IGVsc2UgeworCQloYWxidGM4NzIzYjJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLCAzKTsKKwl9CisKKwkvKiBzdyBtZWNoYW5pc20gKi8KKwlpZiAoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KSB7CisJCWlmICgod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CisJCSAgICAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20xKGJ0Y29leGlzdCwgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9IGVsc2UgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMihidGNvZXhpc3QsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICAgIGZhbHNlLCAweDE4KTsKKwkJfQorCX0KK30KKwordm9pZCBoYWxidGM4NzIzYjJhbnRfYWN0aW9uX2hpZF9hMmRwKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXU4IHdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKKwl1MzIgd2lmaV9idzsKKworCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg3MjNiMmFudF93aWZpX3Jzc2lfc3RhdGUoYnRjb2V4aXN0LAorCQkJCQkJCSAgMCwgMiwgMTUsIDApOworCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4NzIzYjJhbnRfYnRfcnNzaV9zdGF0ZSgyLCAyOSwgMCk7CisKKwlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MSwgMHhmZmZmZiwgMHgwKTsKKworCWhhbGJ0Yzg3MjNiMmFudF9md19kYWNfc3dpbmdfbHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOworCisJaWYgKGhhbGJ0Yzg3MjNiMmFudF9uZWVkX3RvX2RlY19idF9wd3IoYnRjb2V4aXN0KSkKKwkJaGFsYnRjODcyM2IyYW50X2RlY19idF9wd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CisJZWxzZQorCQloYWxidGM4NzIzYjJhbnRfZGVjX2J0X3B3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CisKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKKworCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X3RhYmxlX3dpdGhfdHlwZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA3KTsKKworCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCSAgICAoYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKQorCQloYWxidGM4NzIzYjJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCBmYWxzZSwgMik7CisJZWxzZQorCQloYWxidGM4NzIzYjJhbnRfdGRtYV9kdXJhdGlvbl9hZGp1c3QoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLCAyKTsKKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpIHsKKwkJaWYgKCh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJICAgICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgeworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTEoYnRjb2V4aXN0LCB0cnVlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIHRydWUsIHRydWUsCisJCQkJCQkgICAgICBmYWxzZSwgZmFsc2UpOworCQkJaGFsYnRjODcyM2IyYW50X3N3X21lY2hhbmlzbTIoYnRjb2V4aXN0LCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkgICAgKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgICAgICBmYWxzZSwgMHgxOCk7CisJCX0gZWxzZSB7CisJCQloYWxidGM4NzIzYjJhbnRfc3dfbWVjaGFuaXNtMShidGNvZXhpc3QsIGZhbHNlLCB0cnVlLAorCQkJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9zd19tZWNoYW5pc20yKGJ0Y29leGlzdCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgICAgZmFsc2UsIDB4MTgpOworCQl9CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF9ydW5fY29leGlzdF9tZWNoYW5pc20oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJdTggYWxnb3JpdGhtID0gMDsKKworCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJICAiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKT09PT5cbiIpOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgIgorCQkJICAicmV0dXJuIGZvciBNYW51YWwgQ1RSTCA8PT09XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb2V4X3N0YS0+dW5kZXJfaXBzKSB7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIElQUyAhISFcbiIpOworCQlyZXR1cm47CisJfQorCisJYWxnb3JpdGhtID0gaGFsYnRjODcyM2IyYW50X2FjdGlvbl9hbGdvcml0aG0oYnRjb2V4aXN0KTsKKwlpZiAoY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgJiYKKwkgICAgKEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkhTICE9IGFsZ29yaXRobSkpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEJUIGlzIHVuZGVyIGlucXVpcnkvcGFnZSBzY2FuICEhXG4iKTsKKwkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9idF9pbnF1aXJ5KGJ0Y29leGlzdCk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAoY29leF9kbS0+bmVlZF9yZWNvdmVyXzB4OTQ4KSB7CisJCQljb2V4X2RtLT5uZWVkX3JlY292ZXJfMHg5NDggPSBmYWxzZTsKKwkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzJieXRlKGJ0Y29leGlzdCwgMHg5NDgsCisJCQkJCQkgICBjb2V4X2RtLT5iYWNrdXBfMHg5NDgpOworCQl9CisJfQorCisJY29leF9kbS0+Y3VyX2FsZ29yaXRobSA9IGFsZ29yaXRobTsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICJbQlRDb2V4XSwgQWxnb3JpdGhtID0gJWQgXG4iLAorCQkgIGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pOworCisJaWYgKGhhbGJ0Yzg3MjNiMmFudF9pc19jb21tb25fYWN0aW9uKGJ0Y29leGlzdCkpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEFjdGlvbiAyLUFudCBjb21tb24uXG4iKTsKKwkJY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWlmIChjb2V4X2RtLT5jdXJfYWxnb3JpdGhtICE9IGNvZXhfZG0tPnByZV9hbGdvcml0aG0pIHsKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgcHJlQWxnb3JpdGhtPSVkLCAiCisJCQkJICAiY3VyQWxnb3JpdGhtPSVkXG4iLCBjb2V4X2RtLT5wcmVfYWxnb3JpdGhtLAorCQkJCSAgY29leF9kbS0+Y3VyX2FsZ29yaXRobSk7CisJCQljb2V4X2RtLT5hdXRvX3RkbWFfYWRqdXN0ID0gZmFsc2U7CisJCX0KKwkJc3dpdGNoIChjb2V4X2RtLT5jdXJfYWxnb3JpdGhtKSB7CisJCWNhc2UgQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fU0NPOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpOworCQkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9zY28oYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRDoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25faGlkKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsICIKKwkJCQkgICJhbGdvcml0aG0gPSBBMkRQLlxuIik7CisJCQloYWxidGM4NzIzYjJhbnRfYWN0aW9uX2EyZHAoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0EyRFBfUEFOSFM6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgIgorCQkJCSAgImFsZ29yaXRobSA9IEEyRFArUEFOKEhTKS5cbiIpOworCQkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9hMmRwX3Bhbl9ocyhidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgQlRfODcyM0JfMkFOVF9DT0VYX0FMR09fUEFORURSOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsICIKKwkJCQkgICJhbGdvcml0aG0gPSBQQU4oRURSKS5cbiIpOworCQkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9wYW5fZWRyKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5IUzoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCAiCisJCQkJICAiYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpOworCQkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9wYW5faHMoYnRjb2V4aXN0KTsKKwkJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCAiCisJCQkJICAiYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25fcGFuX2Vkcl9hMmRwKGJ0Y29leGlzdCk7CisJCQlicmVhazsKKwkJY2FzZSBCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsICIKKwkJCQkgICJhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9hY3Rpb25fcGFuX2Vkcl9oaWQoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjoKKwkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCQkgICJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCAiCisJCQkJICAiYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIik7CisJCQloYWxidGM4NzIzYjJhbnRfYWN0aW9uX2hpZF9hMmRwX3Bhbl9lZHIoYnRjb2V4aXN0KTsKKwkJCWJyZWFrOworCQljYXNlIEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgorCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJCSAgIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsICIKKwkJCQkgICJhbGdvcml0aG0gPSBISUQrQTJEUC5cbiIpOworCQkJaGFsYnRjODcyM2IyYW50X2FjdGlvbl9oaWRfYTJkcChidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgIgorCQkJCSAgImFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9jb2V4X2FsbG9mZihidGNvZXhpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJY29leF9kbS0+cHJlX2FsZ29yaXRobSA9IGNvZXhfZG0tPmN1cl9hbGdvcml0aG07CisJfQorfQorCit2b2lkIGhhbGJ0Yzg3MjNiMmFudF93aWZpb2ZmX2h3Y2ZnKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCS8qIHNldCB3bGFuX2FjdCB0byBsb3cgKi8KKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzZlLCAweDQpOworCS8qIEZvcmNlIEdOVF9CVCB0byBIaWdoICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4NzY1LCAweDE4LCAweDMpOworCS8qIEJUIHNlbGVjdCBzMC9zMSBpcyBjb250cm9sbGVkIGJ5IEJUICovCisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhidGNvZXhpc3QsIDB4NjcsIDB4MjAsIDB4MCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0Yzg3MjNiMmFudF8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggRVhoYWxidGM4NzIzYjJhbnRfCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfaW5pdF9od2NvbmZpZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwl1OCB1OHRtcCA9IDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJICAiW0JUQ29leF0sIDJBbnQgSW5pdCBIVyBDb25maWchIVxuIik7CisJY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCA9CisJCWJ0Y29leGlzdC0+YnRjX2dldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZik7CisKKwkvKiAweDc5MFs1OjBdPTB4NSAqLworCXU4dG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NzkwKTsKKwl1OHRtcCAmPSAweGMwOworCXU4dG1wIHw9IDB4NTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzkwLCB1OHRtcCk7CisKKworCS8qQW50ZW5uYSBjb25maWcJKi8KKwloYWxidGM4NzIzYjJhbnRfc2V0X2FudF9wYXRoKGJ0Y29leGlzdCwgQlRDX0FOVF9XSUZJX0FUX01BSU4sCisJCQkJICAgICB0cnVlLCBmYWxzZSk7CisKKworCisKKwkvKiBQVEEgcGFyYW1ldGVyICovCisJaGFsYnRjODcyM2IyYW50X2NvZXhfdGFibGVfd2l0aF90eXBlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMCk7CisKKwkvKiBFbmFibGUgY291bnRlciBzdGF0aXN0aWNzICovCisJLyoweDc2ZVszXSA9MSwgV0xBTl9BY3QgY29udHJvbCBieSBQVEEqLworCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmUsIDB4Yyk7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc3OCwgMHgzKTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg0MCwgMHgyMCwgMHgxKTsKK30KKwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfaW5pdF9jb2V4X2RtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkgICJbQlRDb2V4XSwgQ29leCBNZWNoYW5pc20gSW5pdCEhXG4iKTsKKwloYWxidGM4NzIzYjJhbnRfaW5pdF9jb2V4X2RtKGJ0Y29leGlzdCk7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X2Rpc3BsYXlfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICZidGNvZXhpc3QtPmJvYXJkX2luZm87CisJc3RydWN0IGJ0Y19zdGFja19pbmZvICpzdGFja19pbmZvID0gJmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyogYnRfbGlua19pbmZvID0gJmJ0Y29leGlzdC0+YnRfbGlua19pbmZvOworCXU4ICpjbGlfYnVmID0gYnRjb2V4aXN0LT5jbGlfYnVmOworCXU4IHU4dG1wWzRdLCBpLCBidF9pbmZvX2V4dCwgcHNfdGRtYV9jYXNlPTA7CisJdTMyIHUzMnRtcFs0XTsKKwlib29sIHJvYW0gPSBmYWxzZSwgc2NhbiA9IGZhbHNlOworCWJvb2wgbGluayA9IGZhbHNlLCB3aWZpX3VuZGVyXzVnID0gZmFsc2U7CisJYm9vbCBidF9oc19vbiA9IGZhbHNlLCB3aWZpX2J1c3kgPSBmYWxzZTsKKwlzMzIgd2lmaV9yc3NpID0gMCwgYnRfaHNfcnNzaSA9IDA7CisJdTMyIHdpZmlfYncsIHdpZmlfdHJhZmZpY19kaXIsIGZhX29mZG0sIGZhX2NjazsKKwl1OCB3aWZpX2RvdDExX2NobmwsIHdpZmlfaHNfY2hubDsKKwl1MzIgZndfdmVyID0gMCwgYnRfcGF0Y2hfdmVyID0gMDsKKwl1OCBhcF9udW0gPSAwOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCSAgICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpIHsKKwkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCQkgICAiXHJcbiA9PT09PT09PT09W1VuZGVyIE1hbnVhbCBDb250cm9sXT09PT09PT09PT09PSIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkJICAgIlxyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisJCUNMX1BSSU5URihjbGlfYnVmKTsKKwl9CisKKwlpZiAoIWJvYXJkX2luZm8tPmJ0X2V4aXN0KSB7CisJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOworCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCXJldHVybjsKKwl9CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwKKwkJICAgIkFudCBQRyBudW1iZXIvIEFudCBtZWNoYW5pc206IiwKKwkJICAgYm9hcmRfaW5mby0+cGdfYW50X251bSwgYm9hcmRfaW5mby0+YnRkbV9hbnRfbnVtKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwKKwkJICAgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsCisJCSAgICgoc3RhY2tfaW5mby0+cHJvZmlsZV9ub3RpZmllZCk/ICJZZXMiOiJObyIpLAorCQkgICBzdGFja19pbmZvLT5oY2lfdmVyc2lvbik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9CVF9QQVRDSF9WRVIsICZidF9wYXRjaF92ZXIpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd192ZXIpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyA9ICVkXyV4LyAweCV4LyAweCV4KCVkKSIsCisJCSAgICJDb2V4VmVyLyBmd192ZXIvIFBhdGNoVmVyIiwKKwkJICAgZ2xjb2V4X3Zlcl9kYXRlXzg3MjNiXzJhbnQsIGdsY29leF92ZXJfODcyM2JfMmFudCwKKwkJICAgZndfdmVyLCBidF9wYXRjaF92ZXIsIGJ0X3BhdGNoX3Zlcik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsCisJCQkgICAmd2lmaV9kb3QxMV9jaG5sKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlfaHNfY2hubCk7CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsCisJCSAgICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLAorCQkgICB3aWZpX2RvdDExX2NobmwsIHdpZmlfaHNfY2hubCwgYnRfaHNfb24pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsCisJCSAgICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0sCisJCSAgIGNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdLCBjb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpX3Jzc2kpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfQVBfTlVNLCAmYXBfbnVtKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkIiwKKwkJICAgIldpZmkgcnNzaS8gSFMgcnNzaS8gQVAjIiwgd2lmaV9yc3NpLCBidF9oc19yc3NpLCBhcF9udW0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZsaW5rKTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQgIiwKKwkJICAgIldpZmkgbGluay8gcm9hbS8gc2NhbiIsIGxpbmssIHJvYW0sIHNjYW4pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXJfNWcpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOworCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT04sCisJCQkgICAmd2lmaV90cmFmZmljX2Rpcik7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlcy8gJXMgIiwKKwkJICAgIldpZmkgc3RhdHVzIiwgKHdpZmlfdW5kZXJfNWc/ICI1RyI6IjIuNEciKSwKKwkJICAgKChCVENfV0lGSV9CV19MRUdBQ1kgPT0gd2lmaV9idyk/ICJMZWdhY3kiOgorCQkgICAoKChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpPyAiSFQ0MCI6IkhUMjAiKSkpLAorCQkgICAoKCF3aWZpX2J1c3kpPyAiaWRsZSI6CisJCSAgICgoQlRDX1dJRklfVFJBRkZJQ19UWCA9PXdpZmlfdHJhZmZpY19kaXIpP1wKKwkJICAgInVwbGluayI6ImRvd25saW5rIikpKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwKKwkJICAgIlNDTy9ISUQvUEFOL0EyRFAiLAorCQkgICBidF9saW5rX2luZm8tPnNjb19leGlzdCwgYnRfbGlua19pbmZvLT5oaWRfZXhpc3QsCisJCSAgIGJ0X2xpbmtfaW5mby0+cGFuX2V4aXN0LCBidF9saW5rX2luZm8tPmEyZHBfZXhpc3QpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsKKworCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwKKwkJICAgIkJUIEluZm8gQTJEUCByYXRlIiwKKwkJICAgKGJ0X2luZm9fZXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJZm9yIChpPTA7IGk8QlRfSU5GT19TUkNfODcyM0JfMkFOVF9NQVg7IGkrKykgeworCQlpZiAoY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtpXSkgeworCQkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsCisJCQkJICAgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAiCisJCQkJICAgIiUwMnggJTAyeCAlMDJ4ICUwMngoJWQpIiwKKwkJCQkgICBnbGJ0X2luZm9fc3JjXzg3MjNiXzJhbnRbaV0sIFwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bMF0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzFdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVsyXSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bM10sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzRdLAorCQkJCSAgIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVs1XSwKKwkJCQkgICBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNl0sCisJCQkJICAgY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtpXSk7CisJCQlDTF9QUklOVEYoY2xpX2J1Zik7CisJCX0KKwl9CisKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8lcyIsCisJCSAgICJQUyBzdGF0ZSwgSVBTL0xQUyIsCisJCSAgICgoY29leF9zdGEtPnVuZGVyX2lwcz8gIklQUyBPTiI6IklQUyBPRkYiKSksCisJCSAgICgoY29leF9zdGEtPnVuZGVyX2xwcz8gIkxQUyBPTiI6IkxQUyBPRkYiKSkpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfRldfUFdSX01PREVfQ01EKTsKKworCS8qIFN3IG1lY2hhbmlzbQkqLworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsCisgCQkgICAiU00xW1NoUmYvIExwUkEvIExpbURpZ10iLCBjb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluaywKKwkJICAgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhLCBjb2V4X2RtLT5saW1pdGVkX2RpZyk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQoMHgleCkgIiwKKwkJICAgIlNNMltBZ2NULyBBZGNCLyBTd0RhY1N3aW5nKGx2bCldIiwKKwkJICAgY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbiwgY29leF9kbS0+Y3VyX2FkY19iYWNrX29mZiwKKwkJICAgY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbiwgY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCS8qIEZ3IG1lY2hhbmlzbQkqLworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsCisJCSAgICI9PT09PT09PT09PT1bRncgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXBzX3RkbWFfY2FzZSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBjYXNlLSVkIChhdXRvOiVkKSIsCisJCSAgICJQUyBURE1BIiwgY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdLAorCQkgICBjb2V4X2RtLT5wc190ZG1hX3BhcmFbMV0sIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSwKKwkJICAgY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdLCBjb2V4X2RtLT5wc190ZG1hX3BhcmFbNF0sCisJCSAgIHBzX3RkbWFfY2FzZSwgY29leF9kbS0+YXV0b190ZG1hX2FkanVzdCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsCisJCSAgICJEZWNCdFB3ci8gSWduV2xhbkFjdCIsIGNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyLAorCQkgICBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwkvKiBIdyBzZXR0aW5nICovCisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwKKwkJICAgIj09PT09PT09PT09PVtIdyBzZXR0aW5nXT09PT09PT09PT09PSIpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLAorCQkgICAiUkYtQSwgMHgxZSBpbml0VmFsIiwgY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgpOworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDg4MCk7CisJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsCisJCSAgICIweDc3OC8weDg4MFsyOToyNV0iLCB1OHRtcFswXSwKKwkJICAgKHUzMnRtcFswXSYweDNlMDAwMDAwKSA+PiAyNSk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg5NDgpOworCXU4dG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NjcpOworCXU4dG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NzY1KTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwKKwkJICAgIjB4OTQ4LyAweDY3WzVdIC8gMHg3NjUiLAorCQkgICB1MzJ0bXBbMF0sICgodTh0bXBbMF0mMHgyMCk+PiA1KSwgdTh0bXBbMV0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDkyYyk7CisJdTMydG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4OTMwKTsKKwl1MzJ0bXBbMl0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg5NDQpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiMHg5MmNbMTowXS8gMHg5MzBbNzowXS8weDk0NFsxOjBdIiwKKwkJICAgdTMydG1wWzBdJjB4MywgdTMydG1wWzFdJjB4ZmYsIHUzMnRtcFsyXSYweDMpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHgzOSk7CisJdTh0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0MCk7CisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NGMpOworCXU4dG1wWzJdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NjQpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiMHgzOFsxMV0vMHg0MC8weDRjWzI0OjIzXS8weDY0WzBdIiwKKwkJICAgKCh1OHRtcFswXSAmIDB4OCk+PjMpLCB1OHRtcFsxXSwKKwkJICAgKCh1MzJ0bXBbMF0mMHgwMTgwMDAwMCk+PjIzKSwgdTh0bXBbMl0mMHgxKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg1NTApOworCXU4dG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NTIyKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwKKwkJICAgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIHUzMnRtcFswXSwgdTh0bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCXUzMnRtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGM1MCk7CisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0OWMpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLAorCQkgICAiMHhjNTAoZGlnKS8weDQ5YyhudWxsLWRyb3ApIiwgdTMydG1wWzBdJjB4ZmYsIHU4dG1wWzBdKTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisKKwl1MzJ0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhkYTApOworCXUzMnRtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGRhNCk7CisJdTMydG1wWzJdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4ZGE4KTsKKwl1MzJ0bXBbM10gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhjZjApOworCisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHhhNWIpOworCXU4dG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4YTVjKTsKKworCWZhX29mZG0gPSAoKHUzMnRtcFswXSYweGZmZmYwMDAwKSA+PiAxNikgKworCQkgICgodTMydG1wWzFdJjB4ZmZmZjAwMDApID4+IDE2KSArCisJCSAgICh1MzJ0bXBbMV0gJiAweGZmZmYpICsKKwkJICAgKHUzMnRtcFsyXSAmIDB4ZmZmZikgKworCQkgICgodTMydG1wWzNdJjB4ZmZmZjAwMDApID4+IDE2KSArCisJCSAgICh1MzJ0bXBbM10gJiAweGZmZmYpIDsKKwlmYV9jY2sgPSAodTh0bXBbMF0gPDwgOCkgKyB1OHRtcFsxXTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiT0ZETS1DQ0EvT0ZETS1GQS9DQ0stRkEiLCBcCisJCSAgIHUzMnRtcFswXSYweGZmZmYsIGZhX29mZG0sIGZhX2Njayk7CisJQ0xfUFJJTlRGKGNsaV9idWYpOworCisJdTMydG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmMwKTsKKwl1MzJ0bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQpOworCXUzMnRtcFsyXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCk7CisJdTh0bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg2Y2MpOworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLAorCQkgICAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLAorCQkgICAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKKwkJICAgdTMydG1wWzBdLCB1MzJ0bXBbMV0sIHUzMnRtcFsyXSwgdTh0bXBbMF0pOworCUNMX1BSSU5URihjbGlfYnVmKTsKKworCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsCisJCSAgICIweDc3MChoaWdoLXByaSByeC90eCkiLAorCQkgICBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCwgY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHgpOworCUNMX1BSSU5URihjbGlfYnVmKTsKKwlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLAorCQkgICAiMHg3NzQobG93LXByaSByeC90eCkiLCBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4LAorCQkgICBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4KTsKKwlDTF9QUklOVEYoY2xpX2J1Zik7CisjaWYoQlRfQVVUT19SRVBPUlRfT05MWV84NzIzQl8yQU5UID09IDEpCisJaGFsYnRjODcyM2IyYW50X21vbml0b3JfYnRfY3RyKGJ0Y29leGlzdCk7CisjZW5kaWYKKwlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LAorCUJUQ19EQkdfRElTUF9DT0VYX1NUQVRJU1RJQ1MpOworfQorCisKK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X2lwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJaWYgKEJUQ19JUFNfRU5URVIgPT0gdHlwZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIElQUyBFTlRFUiBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gdHJ1ZTsKKwkJaGFsYnRjODcyM2IyYW50X3dpZmlvZmZfaHdjZmcoYnRjb2V4aXN0KTsKKwkJaGFsYnRjODcyM2IyYW50X2lnbm9yZV93bGFuX2FjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCQloYWxidGM4NzIzYjJhbnRfY29leF9hbGxvZmYoYnRjb2V4aXN0KTsKKwl9IGVsc2UgaWYgKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkgeworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gZmFsc2U7CisJCWV4X2hhbGJ0Yzg3MjNiMmFudF9pbml0X2h3Y29uZmlnKGJ0Y29leGlzdCk7CisJCWhhbGJ0Yzg3MjNiMmFudF9pbml0X2NvZXhfZG0oYnRjb2V4aXN0KTsKKwkJaGFsYnRjODcyM2IyYW50X3F1ZXJ5X2J0X2luZm8oYnRjb2V4aXN0KTsKKwl9Cit9CisKK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X2xwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJaWYgKEJUQ19MUFNfRU5BQkxFID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIik7CisJCWNvZXhfc3RhLT51bmRlcl9scHMgPSB0cnVlOworCX0gZWxzZSBpZiAoQlRDX0xQU19ESVNBQkxFID09IHR5cGUpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpOworCQljb2V4X3N0YS0+dW5kZXJfbHBzID0gZmFsc2U7CisJfQorfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9zY2FuX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSkKK3sKKwlpZiAoQlRDX1NDQU5fU1RBUlQgPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBTQ0FOIFNUQVJUIG5vdGlmeVxuIik7CisJZWxzZSBpZiAoQlRDX1NDQU5fRklOSVNIID09IHR5cGUpCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgU0NBTiBGSU5JU0ggbm90aWZ5XG4iKTsKK30KKwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfY29ubmVjdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJaWYgKEJUQ19BU1NPQ0lBVEVfU1RBUlQgPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIik7CisJZWxzZSBpZiAoQlRDX0FTU09DSUFURV9GSU5JU0ggPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgdTggdHlwZSkKK3sKKwl1OCBoMmNfcGFyYW1ldGVyWzNdID17MH07CisJdTMyIHdpZmlfYnc7CisJdTggd2lmaV9jZW50cmFsX2Nobmw7CisKKwlpZiAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCSAgIltCVENvZXhdLCBNRURJQSBjb25uZWN0IG5vdGlmeVxuIik7CisJZWxzZQorCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkJICAiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKTsKKworCS8qIG9ubHkgMi40RyB3ZSBuZWVkIHRvIGluZm9ybSBidCB0aGUgY2hubCBtYXNrICovCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwKKwkJQlRDX0dFVF9VMV9XSUZJX0NFTlRSQUxfQ0hOTCwgJndpZmlfY2VudHJhbF9jaG5sKTsKKwlpZiAoKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpICYmCisJICAgICh3aWZpX2NlbnRyYWxfY2hubCA8PSAxNCkpIHsKKwkJaDJjX3BhcmFtZXRlclswXSA9IDB4MTsKKwkJaDJjX3BhcmFtZXRlclsxXSA9IHdpZmlfY2VudHJhbF9jaG5sOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LAorCQkJQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CisJCWlmIChCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCisJCQloMmNfcGFyYW1ldGVyWzJdID0gMHgzMDsKKwkJZWxzZQorCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MjA7CisJfQorCisJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMF0gPSBoMmNfcGFyYW1ldGVyWzBdOworCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdID0gaDJjX3BhcmFtZXRlclsxXTsKKwljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSA9IGgyY19wYXJhbWV0ZXJbMl07CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywKKwkJICAiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjY9MHgleFxuIiwKKwkJICBoMmNfcGFyYW1ldGVyWzBdIDw8IDE2IHwgaDJjX3BhcmFtZXRlclsxXSA8PCA4IHwKKwkJICBoMmNfcGFyYW1ldGVyWzJdKTsKKworCWJ0Y29leGlzdC0+YnRjX2ZpbGxfaDJjKGJ0Y29leGlzdCwgMHg2NiwgMywgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X3NwZWNpYWxfcGFja2V0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkJICAgICAgdTggdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkgICJbQlRDb2V4XSwgREhDUCBQYWNrZXQgbm90aWZ5XG4iKTsKK30KKwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfYnRfaW5mb19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICAgIHU4ICp0bXBidWYsIHU4IGxlbmd0aCkKK3sKKwl1OCBidEluZm8gPSAwOworCXU4IGksIHJzcF9zb3VyY2UgPSAwOworCWJvb2wgYnRfYnVzeSA9IGZhbHNlLCBsaW1pdGVkX2RpZyA9IGZhbHNlOworCWJvb2wgd2lmaV9jb25uZWN0ZWQgPSBmYWxzZTsKKworCWNvZXhfc3RhLT5jMmhfYnRfaW5mb19yZXFfc2VudCA9IGZhbHNlOworCisJcnNwX3NvdXJjZSA9IHRtcGJ1ZlswXSYweGY7CisJaWYocnNwX3NvdXJjZSA+PSBCVF9JTkZPX1NSQ184NzIzQl8yQU5UX01BWCkKKwkJcnNwX3NvdXJjZSA9IEJUX0lORk9fU1JDXzg3MjNCXzJBTlRfV0lGSV9GVzsKKwljb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W3JzcF9zb3VyY2VdKys7CisKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLAorCQkgICJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsCisJCSAgcnNwX3NvdXJjZSwgbGVuZ3RoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdW2ldID0gdG1wYnVmW2ldOworCQlpZiAoaSA9PSAxKQorCQkJYnRJbmZvID0gdG1wYnVmW2ldOworCQlpZiAoaSA9PSBsZW5ndGgtMSkKKwkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksCisJCQkJICAiMHglMDJ4XVxuIiwgdG1wYnVmW2ldKTsKKwkJZWxzZQorCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwKKwkJCQkgICIweCUwMngsICIsIHRtcGJ1ZltpXSk7CisJfQorCisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpIHsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCAiCisJCQkgICJyZXR1cm4gZm9yIE1hbnVhbCBDVFJMPD09PVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQlRfSU5GT19TUkNfODcyM0JfMkFOVF9XSUZJX0ZXICE9IHJzcF9zb3VyY2UpIHsKKwkJY29leF9zdGEtPmJ0X3JldHJ5X2NudCA9CS8qIFszOjBdKi8KKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVsyXSAmIDB4ZjsKKworCQljb2V4X3N0YS0+YnRfcnNzaSA9CisJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1bM10gKiAyICsgMTA7CisKKwkJY29leF9zdGEtPmJ0X2luZm9fZXh0ID0KKwkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVs0XTsKKworCQkvKiBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCisJCSAgICAgYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4qLworCQlpZiAoKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDEpKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDEgY2hlY2ssIgorCQkJCSAgIiBzZW5kIHdpZmkgQlcmQ2hubCB0byBCVCEhXG4iKTsKKwkJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwKKwkJCQkJICAgJndpZmlfY29ubmVjdGVkKTsKKwkJCWlmICh3aWZpX2Nvbm5lY3RlZCkKKwkJCQlleF9oYWxidGM4NzIzYjJhbnRfbWVkaWFfc3RhdHVzX25vdGlmeSgKKwkJCQkJCQlidGNvZXhpc3QsCisJCQkJCQkJQlRDX01FRElBX0NPTk5FQ1QpOworCQkJZWxzZQorCQkJCWV4X2hhbGJ0Yzg3MjNiMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KAorCQkJCQkJCWJ0Y29leGlzdCwKKwkJCQkJCQlCVENfTUVESUFfRElTQ09OTkVDVCk7CisJCX0KKworCQlpZiAoKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDMpKSB7CisJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkJICAiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDMgY2hlY2ssICIKKwkJCQkgICJzZXQgQlQgTk9UIHRvIGlnbm9yZSBXbGFuIGFjdGl2ZSEhXG4iKTsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9pZ25vcmVfd2xhbl9hY3QoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLAorCQkJCQkJCWZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJUIGFscmVhZHkgTk9UIGlnbm9yZSBXbGFuIGFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLiovCisJCX0KKyNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzg3MjNCXzJBTlQgPT0gMCkKKwkJaWYgKChjb2V4X3N0YS0+YnRfaW5mb19leHQgJiBCSVQ0KSkgeworCQkJLyogQlQgYXV0byByZXBvcnQgYWxyZWFkeSBlbmFibGVkLCBkbyBub3RoaW5nKi8KKwkJfSBlbHNlIHsKKwkJCWhhbGJ0Yzg3MjNiMmFudF9idF9hdXRvX3JlcG9ydChidGNvZXhpc3QsIEZPUkNFX0VYRUMsCisJCQkJCQkgICAgICAgdHJ1ZSk7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuKi8KKwlpZiAoYnRJbmZvICYgQlRfSU5GT184NzIzQl8yQU5UX0JfSU5RX1BBR0UpCisJCWNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlID0gdHJ1ZTsKKwllbHNlCisJCWNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlID0gZmFsc2U7CisKKwkvKiBzZXQgbGluayBleGlzdCBzdGF0dXMqLworCWlmICghKGJ0SW5mbyAmIEJUX0lORk9fODcyM0JfMkFOVF9CX0NPTk5FQ1RJT04pKSB7CisJCWNvZXhfc3RhLT5idF9saW5rX2V4aXN0ID0gZmFsc2U7CisJCWNvZXhfc3RhLT5wYW5fZXhpc3QgPSBmYWxzZTsKKwkJY29leF9zdGEtPmEyZHBfZXhpc3QgPSBmYWxzZTsKKwkJY29leF9zdGEtPmhpZF9leGlzdCA9IGZhbHNlOworCQljb2V4X3N0YS0+c2NvX2V4aXN0ID0gZmFsc2U7CisJfSBlbHNlIHsvLyBjb25uZWN0aW9uIGV4aXN0cworCQljb2V4X3N0YS0+YnRfbGlua19leGlzdCA9IHRydWU7CisJCWlmIChidEluZm8gJiBCVF9JTkZPXzg3MjNCXzJBTlRfQl9GVFApCisJCQljb2V4X3N0YS0+cGFuX2V4aXN0ID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29leF9zdGEtPnBhbl9leGlzdCA9IGZhbHNlOworCQlpZiAoYnRJbmZvICYgQlRfSU5GT184NzIzQl8yQU5UX0JfQTJEUCkKKwkJCWNvZXhfc3RhLT5hMmRwX2V4aXN0ID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29leF9zdGEtPmEyZHBfZXhpc3QgPSBmYWxzZTsKKwkJaWYgKGJ0SW5mbyAmIEJUX0lORk9fODcyM0JfMkFOVF9CX0hJRCkKKwkJCWNvZXhfc3RhLT5oaWRfZXhpc3QgPSB0cnVlOworCQllbHNlCisJCQljb2V4X3N0YS0+aGlkX2V4aXN0ID0gZmFsc2U7CisJCWlmIChidEluZm8gJiBCVF9JTkZPXzg3MjNCXzJBTlRfQl9TQ09fRVNDTykKKwkJCWNvZXhfc3RhLT5zY29fZXhpc3QgPSB0cnVlOworCQllbHNlCisJCQljb2V4X3N0YS0+c2NvX2V4aXN0ID0gZmFsc2U7CisJfQorCisJaGFsYnRjODcyM2IyYW50X3VwZGF0ZV9idF9saW5rX2luZm8oYnRjb2V4aXN0KTsKKworCWlmICghKGJ0SW5mbyAmIEJUX0lORk9fODcyM0JfMkFOVF9CX0NPTk5FQ1RJT04pKSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCAiCisJCQkgICJCVCBOb24tQ29ubmVjdGVkIGlkbGUhISFcbiIpOworCS8qIGNvbm5lY3Rpb24gZXhpc3RzIGJ1dCBubyBidXN5ICovCisJfSBlbHNlIGlmIChidEluZm8gPT0gQlRfSU5GT184NzIzQl8yQU5UX0JfQ09OTkVDVElPTikgeworCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBCVCBDb25uZWN0ZWQtaWRsZSEhIVxuIik7CisJfSBlbHNlIGlmICgoYnRJbmZvICYgQlRfSU5GT184NzIzQl8yQU5UX0JfU0NPX0VTQ08pIHx8CisJCSAgIChidEluZm8gJiBCVF9JTkZPXzg3MjNCXzJBTlRfQl9TQ09fQlVTWSkpIHsKKwkJY29leF9kbS0+YnRfc3RhdHVzID0KKwkJCUJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX1NDT19CVVNZOworCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCQkgICJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIEJUIFNDTyBidXN5ISEhXG4iKTsKKwl9IGVsc2UgaWYgKGJ0SW5mbyZCVF9JTkZPXzg3MjNCXzJBTlRfQl9BQ0xfQlVTWSkgeworCQljb2V4X2RtLT5idF9zdGF0dXMgPQorCQkJQlRfODcyM0JfMkFOVF9CVF9TVEFUVVNfQUNMX0JVU1k7CisJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwKKwkJCSAgIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgQlQgQUNMIGJ1c3khISFcbiIpOworCX0gZWxzZSB7CisJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX01BWDsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLAorCQkJICAiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCAiCisJCQkgICJCVCBOb24tRGVmaW5lZCBzdGF0ZSEhIVxuIik7CisJfQorCisJaWYgKChCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJICAgIChCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CisJICAgIChCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSkgeworCQlidF9idXN5ID0gdHJ1ZTsKKwkJbGltaXRlZF9kaWcgPSB0cnVlOworCX0gZWxzZSB7CisJCWJ0X2J1c3kgPSBmYWxzZTsKKwkJbGltaXRlZF9kaWcgPSBmYWxzZTsKKwl9CisKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwgJmJ0X2J1c3kpOworCisJY29leF9kbS0+bGltaXRlZF9kaWcgPSBsaW1pdGVkX2RpZzsKKwlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0xJTUlURURfRElHLCAmbGltaXRlZF9kaWcpOworCisJaGFsYnRjODcyM2IyYW50X3J1bl9jb2V4aXN0X21lY2hhbmlzbShidGNvZXhpc3QpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9oYWx0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKTsKKworCWhhbGJ0Yzg3MjNiMmFudF93aWZpb2ZmX2h3Y2ZnKGJ0Y29leGlzdCk7CisJaGFsYnRjODcyM2IyYW50X2lnbm9yZV93bGFuX2FjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOworCWV4X2hhbGJ0Yzg3MjNiMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KGJ0Y29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOworfQorCit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICZidGNvZXhpc3QtPmJvYXJkX2luZm87CisJc3RydWN0IGJ0Y19zdGFja19pbmZvICpzdGFja19pbmZvID0gJmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKKwlzdGF0aWMgdTggZGlzX3Zlcl9pbmZvX2NudCA9IDA7CisJdTMyIGZ3X3ZlciA9IDAsIGJ0X3BhdGNoX3ZlciA9IDA7CisKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsCisJCSAgIltCVENvZXhdLCA9PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJICAiUGVyaW9kaWNhbD09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwlpZiAoZGlzX3Zlcl9pbmZvX2NudCA8PSA1KSB7CisJCWRpc192ZXJfaW5mb19jbnQgKz0gMTsKKwkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsCisJCQkgICJbQlRDb2V4XSwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKwkJCSAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiW0JUQ29leF0sIEFudCBQRyBOdW0vIEFudCBNZWNoLyAiCisJCQkgICJBbnQgUG9zID0gJWQvICVkLyAlZFxuIiwgYm9hcmRfaW5mby0+cGdfYW50X251bSwKKwkJCSAgYm9hcmRfaW5mby0+YnRkbV9hbnRfbnVtLCBib2FyZF9pbmZvLT5idGRtX2FudF9wb3MpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIltCVENvZXhdLCBCVCBzdGFjay8gaGNpIGV4dCB2ZXIgPSAlcyAvICVkXG4iLAorCQkJICAoKHN0YWNrX2luZm8tPnByb2ZpbGVfbm90aWZpZWQpPyAiWWVzIjoiTm8iKSwKKwkJCSAgc3RhY2tfaW5mby0+aGNpX3ZlcnNpb24pOworCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwKKwkJCQkgICAmYnRfcGF0Y2hfdmVyKTsKKwkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0ZXX1ZFUiwgJmZ3X3Zlcik7CisJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULAorCQkJICAiW0JUQ29leF0sIENvZXhWZXIvIGZ3X3Zlci8gUGF0Y2hWZXIgPSAiCisJCQkgICIlZF8leC8gMHgleC8gMHgleCglZClcbiIsCisJCQkgIGdsY29leF92ZXJfZGF0ZV84NzIzYl8yYW50LCBnbGNvZXhfdmVyXzg3MjNiXzJhbnQsCisJCQkgIGZ3X3ZlciwgYnRfcGF0Y2hfdmVyLCBidF9wYXRjaF92ZXIpOworCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwKKwkJCSAgIltCVENvZXhdLCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKwkJCSAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwl9CisKKyNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzg3MjNCXzJBTlQgPT0gMCkKKwloYWxidGM4NzIzYjJhbnRfcXVlcnlfYnRfaW5mbyhidGNvZXhpc3QpOworCWhhbGJ0Yzg3MjNiMmFudF9tb25pdG9yX2J0X2N0cihidGNvZXhpc3QpOworCWhhbGJ0Yzg3MjNiMmFudF9tb25pdG9yX2J0X2VuYWJsZV9kaXNhYmxlKGJ0Y29leGlzdCk7CisjZWxzZQorCWlmIChoYWxidGM4NzIzYjJhbnRfaXNfd2lmaV9zdGF0dXNfY2hhbmdlZChidGNvZXhpc3QpIHx8CisJICAgIGNvZXhfZG0tPmF1dG9fdGRtYV9hZGp1c3QpCisJCWhhbGJ0Yzg3MjNiMmFudF9ydW5fY29leGlzdF9tZWNoYW5pc20oYnRjb2V4aXN0KTsKKyNlbmRpZgorfQorCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzc4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuaApAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIGZvbGxvd2luZyBpcyBmb3IgODcyM0IgMkFudCBCVCBDby1leGlzdCBkZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlCVF9BVVRPX1JFUE9SVF9PTkxZXzg3MjNCXzJBTlQJCQkxCisKKworI2RlZmluZQlCVF9JTkZPXzg3MjNCXzJBTlRfQl9GVFAJCQlCSVQ3CisjZGVmaW5lCUJUX0lORk9fODcyM0JfMkFOVF9CX0EyRFAJCQlCSVQ2CisjZGVmaW5lCUJUX0lORk9fODcyM0JfMkFOVF9CX0hJRAkJCUJJVDUKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8yQU5UX0JfU0NPX0JVU1kJCQlCSVQ0CisjZGVmaW5lCUJUX0lORk9fODcyM0JfMkFOVF9CX0FDTF9CVVNZCQkJQklUMworI2RlZmluZQlCVF9JTkZPXzg3MjNCXzJBTlRfQl9JTlFfUEFHRQkJCUJJVDIKKyNkZWZpbmUJQlRfSU5GT184NzIzQl8yQU5UX0JfU0NPX0VTQ08JCQlCSVQxCisjZGVmaW5lCUJUX0lORk9fODcyM0JfMkFOVF9CX0NPTk5FQ1RJT04JCQlCSVQwCisKKyNkZWZpbmUgQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNCXzJBTlQJCTIKKwordHlwZWRlZiBlbnVtIF9CVF9JTkZPX1NSQ184NzIzQl8yQU5UeworCUJUX0lORk9fU1JDXzg3MjNCXzJBTlRfV0lGSV9GVwkJCT0gMHgwLAorCUJUX0lORk9fU1JDXzg3MjNCXzJBTlRfQlRfUlNQCQkJPSAweDEsCisJQlRfSU5GT19TUkNfODcyM0JfMkFOVF9CVF9BQ1RJVkVfU0VORAkJPSAweDIsCisJQlRfSU5GT19TUkNfODcyM0JfMkFOVF9NQVgKK31CVF9JTkZPX1NSQ184NzIzQl8yQU5ULCpQQlRfSU5GT19TUkNfODcyM0JfMkFOVDsKKwordHlwZWRlZiBlbnVtIF9CVF84NzIzQl8yQU5UX0JUX1NUQVRVU3sKKwlCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUJPSAweDAsCisJQlRfODcyM0JfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUJCT0gMHgxLAorCUJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX0lOUV9QQUdFCQk9IDB4MiwKKwlCVF84NzIzQl8yQU5UX0JUX1NUQVRVU19BQ0xfQlVTWQkJPSAweDMsCisJQlRfODcyM0JfMkFOVF9CVF9TVEFUVVNfU0NPX0JVU1kJCT0gMHg0LAorCUJUXzg3MjNCXzJBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWQkJPSAweDUsCisJQlRfODcyM0JfMkFOVF9CVF9TVEFUVVNfTUFYCit9QlRfODcyM0JfMkFOVF9CVF9TVEFUVVMsKlBCVF84NzIzQl8yQU5UX0JUX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9CVF84NzIzQl8yQU5UX0NPRVhfQUxHT3sKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19VTkRFRklORUQJCT0gMHgwLAorCUJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1NDTwkJCT0gMHgxLAorCUJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRAkJCT0gMHgyLAorCUJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0EyRFAJCQk9IDB4MywKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTCQk9IDB4NCwKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFIJCQk9IDB4NSwKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5IUwkJCT0gMHg2LAorCUJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQCQk9IDB4NywKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElECQk9IDB4OCwKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFIJCT0gMHg5LAorCUJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQCQk9IDB4YSwKKwlCVF84NzIzQl8yQU5UX0NPRVhfQUxHT19NQVgJCQk9IDB4YiwKK31CVF84NzIzQl8yQU5UX0NPRVhfQUxHTywqUEJUXzg3MjNCXzJBTlRfQ09FWF9BTEdPOworCitzdHJ1Y3QgY29leF9kbV84NzIzYl8yYW50eworCS8qIGZ3IG1lY2hhbmlzbSAqLworCWJvb2wgcHJlX2RlY19idF9wd3I7CisJYm9vbCBjdXJfZGVjX2J0X3B3cjsKKwl1OCBwcmVfZndfZGFjX3N3aW5nX2x2bDsKKwl1OCBjdXJfZndfZGFjX3N3aW5nX2x2bDsKKwlib29sIGN1cl9pZ25vcmVfd2xhbl9hY3Q7CisJYm9vbCBwcmVfaWdub3JlX3dsYW5fYWN0OworCXU4IHByZV9wc190ZG1hOworCXU4IGN1cl9wc190ZG1hOworCXU4IHBzX3RkbWFfcGFyYVs1XTsKKwl1OCBwc190ZG1hX2R1X2Fkal90eXBlOworCWJvb2wgcmVzZXRfdGRtYV9hZGp1c3Q7CisJYm9vbCBhdXRvX3RkbWFfYWRqdXN0OworCWJvb2wgcHJlX3BzX3RkbWFfb247CisJYm9vbCBjdXJfcHNfdGRtYV9vbjsKKwlib29sIHByZV9idF9hdXRvX3JlcG9ydDsKKwlib29sIGN1cl9idF9hdXRvX3JlcG9ydDsKKworCS8qIHN3IG1lY2hhbmlzbSAqLworCWJvb2wgcHJlX3JmX3J4X2xwZl9zaHJpbms7CisJYm9vbCBjdXJfcmZfcnhfbHBmX3NocmluazsKKwl1MzIgYnRfcmYweDFlX2JhY2t1cDsKKwlib29sIHByZV9sb3dfcGVuYWx0eV9yYTsKKwlib29sIGN1cl9sb3dfcGVuYWx0eV9yYTsKKwlib29sIHByZV9kYWNfc3dpbmdfb247CisJdTMyIHByZV9kYWNfc3dpbmdfbHZsOworCWJvb2wgY3VyX2RhY19zd2luZ19vbjsKKwl1MzIgY3VyX2RhY19zd2luZ19sdmw7CisJYm9vbCBwcmVfYWRjX2JhY2tfb2ZmOworCWJvb2wgY3VyX2FkY19iYWNrX29mZjsKKwlib29sIHByZV9hZ2NfdGFibGVfZW47CisJYm9vbCBjdXJfYWdjX3RhYmxlX2VuOworCXUzMiBwcmVfdmFsMHg2YzA7CisJdTMyIGN1cl92YWwweDZjMDsKKwl1MzIgcHJlX3ZhbDB4NmM0OworCXUzMiBjdXJfdmFsMHg2YzQ7CisJdTMyIHByZV92YWwweDZjODsKKwl1MzIgY3VyX3ZhbDB4NmM4OworCXU4IHByZV92YWwweDZjYzsKKwl1OCBjdXJfdmFsMHg2Y2M7CisJYm9vbCBsaW1pdGVkX2RpZzsKKworCS8qIGFsZ29yaXRobSByZWxhdGVkICovCisJdTggcHJlX2FsZ29yaXRobTsKKwl1OCBjdXJfYWxnb3JpdGhtOworCXU4IGJ0X3N0YXR1czsKKwl1OCB3aWZpX2NobmxfaW5mb1szXTsKKworCWJvb2wgbmVlZF9yZWNvdmVyXzB4OTQ4OworCXUxNiBiYWNrdXBfMHg5NDg7Cit9OworCitzdHJ1Y3QgY29leF9zdGFfODcyM2JfMmFudHsKKwlib29sIGJ0X2xpbmtfZXhpc3Q7CisJYm9vbCBzY29fZXhpc3Q7CisJYm9vbCBhMmRwX2V4aXN0OworCWJvb2wgaGlkX2V4aXN0OworCWJvb2wgcGFuX2V4aXN0OworCisJYm9vbCB1bmRlcl9scHM7CisJYm9vbCB1bmRlcl9pcHM7CisJdTMyIGhpZ2hfcHJpb3JpdHlfdHg7CisJdTMyIGhpZ2hfcHJpb3JpdHlfcng7CisJdTMyIGxvd19wcmlvcml0eV90eDsKKwl1MzIgbG93X3ByaW9yaXR5X3J4OworCXU4IGJ0X3Jzc2k7CisJdTggcHJlX2J0X3Jzc2lfc3RhdGU7CisJdTggcHJlX3dpZmlfcnNzaV9zdGF0ZVs0XTsKKwlib29sIGMyaF9idF9pbmZvX3JlcV9zZW50OworCXU4IGJ0X2luZm9fYzJoW0JUX0lORk9fU1JDXzg3MjNCXzJBTlRfTUFYXVsxMF07CisJdTMyIGJ0X2luZm9fYzJoX2NudFtCVF9JTkZPX1NSQ184NzIzQl8yQU5UX01BWF07CisJYm9vbCBjMmhfYnRfaW5xdWlyeV9wYWdlOworCXU4IGJ0X3JldHJ5X2NudDsKKwl1OCBidF9pbmZvX2V4dDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBmb2xsb3dpbmcgaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgbm90aWZ5IGNvZXggbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X2luaXRfaHdjb25maWcoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpOwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfaW5pdF9jb2V4X2RtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhfaGFsYnRjODcyM2IyYW50X2lwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfbHBzX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9zY2FuX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9jb25uZWN0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCQkgICAgdTggdHlwZSk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9zcGVjaWFsX3BhY2tldF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJCSAgICAgIHU4IHR5cGUpOwordm9pZCBleF9oYWxidGM4NzIzYjJhbnRfYnRfaW5mb19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsCisJCQkJICAgICAgIHU4ICp0bXBidWYsIHU4IGxlbmd0aCk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9oYWx0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqIGJ0Y29leGlzdCk7Cit2b2lkIGV4X2hhbGJ0Yzg3MjNiMmFudF9kaXNwbGF5X2NvZXhfaW5mbyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jCkBAIC0wLDAgKzEsMTE4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMyBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoYWxidF9wcmVjb21wLmgiCisKKy8qI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkqLworI2lmIDEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKmNvbnN0IGJ0X3Byb2ZpbGVfc3RyaW5nW109eworCSJOT05FIiwKKwkiQTJEUCIsCisJIlBBTiIsCisJIkhJRCIsCisJIlNDTyIsCit9OworCitjb25zdCBjaGFyICpjb25zdCBidF9zcGVjX3N0cmluZ1tdPXsKKwkiMS4wYiIsCisJIjEuMSIsCisJIjEuMiIsCisJIjIuMCtFRFIiLAorCSIyLjErRURSIiwKKwkiMy4wK0hTIiwKKwkiNC4wIiwKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGJ0X2xpbmtfcm9sZV9zdHJpbmdbXT17CisJIk1hc3RlciIsCisJIlNsYXZlIiwKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGgyY19zdGF0ZV9zdHJpbmdbXT17CisJInN1Y2Nlc3NmdWwiLAorCSJoMmMgYnVzeSIsCisJInJmIG9mZiIsCisJImZ3IG5vdCByZWFkIiwKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGlvX3N0YXRlX3N0cmluZ1tdPXsKKwkiSU9fU1RBVFVTX1NVQ0NFU1MiLAorCSJJT19TVEFUVVNfRkFJTF9DQU5OT1RfSU8iLAorCSJJT19TVEFUVVNfRkFJTF9SRl9PRkYiLAorCSJJT19TVEFUVVNfRkFJTF9GV19SRUFEX0NMRUFSX1RJTUVPVVQiLAorCSJJT19TVEFUVVNfRkFJTF9XQUlUX0lPX0VWRU5UX1RJTUVPVVQiLAorCSJJT19TVEFUVVNfSU5WQUxJRF9MRU4iLAorCSJJT19TVEFUVVNfSU9fSURMRV9RVUVVRV9FTVBUWSIsCisJIklPX1NUQVRVU19JT19JTlNFUlRfV0FJVF9RVUVVRV9GQUlMIiwKKwkiSU9fU1RBVFVTX1VOS05PV05fRkFJTCIsCisJIklPX1NUQVRVU19XUk9OR19MRVZFTCIsCisJIklPX1NUQVRVU19IMkNfU1RPUFBFRCIsCit9OworCitzdHJ1Y3QgYnRjX2NvZXhpc3QgZ2xfYnRfY29leGlzdDsKKwordTMyIGJ0Y19kYmdfdHlwZVtCVENfTVNHX01BWF07Cit1OCBidGNfZGJnX2J1ZlsxMDBdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJRGVidWcgcmVsYXRlZCBmdW5jdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWlmICghYnRjb2V4aXN0LT5iaW5kZWQgfHwgTlVMTCA9PSBidGNvZXhpc3QtPmFkYXB0ZXIpCisJCXJldHVybiBmYWxzZTsKKwkKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoYWxidGNfaXNfd2lmaV9idXN5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdikKK3sKKworCWlmIChydGxwcml2LT5saW5rX2luZm8uYl9idXN5dHJhZmZpYykKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKwordm9pZCBoYWxidGNfZGJnX2luaXQodm9pZCkKK3sKKwl1OCBpOworCisJZm9yIChpID0gMDsgaSA8IEJUQ19NU0dfTUFYOyBpKyspCisJCWJ0Y19kYmdfdHlwZVtpXSA9IDA7CisKKwlidGNfZGJnX3R5cGVbQlRDX01TR19JTlRFUkZBQ0VdCQkJPSAJXAorLy8JCQlJTlRGX0lOSVQJCQkJfAorLy8JCQlJTlRGX05PVElGWQkJCQl8CisJCQkwOworCQorCWJ0Y19kYmdfdHlwZVtCVENfTVNHX0FMR09SSVRITV0JCQk9IAlcCisvLwkJCUFMR09fQlRfUlNTSV9TVEFURQkJCXwKKy8vCQkJQUxHT19XSUZJX1JTU0lfU1RBVEUJCQl8CisvLwkJCUFMR09fQlRfTU9OSVRPUgkJCQl8CisvLwkJCUFMR09fVFJBQ0UJCQkJfAorLy8JCQlBTEdPX1RSQUNFX0ZXCQkJCXwKKy8vCQkJQUxHT19UUkFDRV9GV19ERVRBSUwJCQl8CisvLwkJCUFMR09fVFJBQ0VfRldfRVhFQwkJCXwKKy8vCQkJQUxHT19UUkFDRV9TVwkJCQl8CisvLwkJCUFMR09fVFJBQ0VfU1dfREVUQUlMCQkJfAorLy8JCQlBTEdPX1RSQUNFX1NXX0VYRUMJCQl8CisJCQkwOworfQorCitib29sIGhhbGJ0Y19pc19od19tYWlsYm94X2V4aXN0KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXJldHVybiB0cnVlOworfQorCitib29sIGhhbGJ0Y19pc19idDQwKHN0cnVjdCBydGxfcHJpdiAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBhZGFwdGVyOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJYm9vbCBpc19odDQwID0gdHJ1ZTsKKwllbnVtIGh0X2NoYW5uZWxfd2lkdGggYncgPSBydGxwaHktPmN1cnJlbnRfY2hhbl9idzsKKwkKKwkKKwlpZiAoYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJaXNfaHQ0MCA9IGZhbHNlOworCWVsc2UgaWYgKGJ3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApCisJCWlzX2h0NDAgPSB0cnVlOworCisJcmV0dXJuIGlzX2h0NDA7Cit9CisKK2Jvb2wgaGFsYnRjX2xlZ2FjeShzdHJ1Y3QgcnRsX3ByaXYgKmFkYXB0ZXIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxwcml2KTsKKwkKKwlib29sIGlzX2xlZ2FjeSA9IGZhbHNlOworCisJaWYgKChtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB8fCAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfQikpCisJCWlzX2xlZ2FjeSA9IHRydWU7CisKKwlyZXR1cm4gaXNfbGVnYWN5OworfQorCitib29sIGhhbGJ0Y19pc193aWZpX3VwbGluayhzdHJ1Y3QgcnRsX3ByaXYgKmFkYXB0ZXIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYWRhcHRlcjsKKwkKKwlpZiAocnRscHJpdi0+bGlua19pbmZvLmJfdHhfYnVzeV90cmFmZmljKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKwordTMyIGhhbGJ0Y19nZXRfd2lmaV9idyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSAKKwkJKHN0cnVjdCBydGxfcHJpdiAqKWJ0Y29leGlzdC0+YWRhcHRlcjsKKwl1MzIgd2lmaV9idyA9IEJUQ19XSUZJX0JXX0hUMjA7CisJCisJaWYgKGhhbGJ0Y19pc19idDQwKHJ0bHByaXYpKXsKKwkJd2lmaV9idyA9IEJUQ19XSUZJX0JXX0hUNDA7CQorCX0gZWxzZSB7CisJCWlmKGhhbGJ0Y19sZWdhY3kocnRscHJpdikpCisJCQl3aWZpX2J3ID0gQlRDX1dJRklfQldfTEVHQUNZOworCQllbHNlCisJCQl3aWZpX2J3ID0gQlRDX1dJRklfQldfSFQyMDsKKwl9CisJcmV0dXJuIHdpZmlfYnc7Cit9CisKK3U4IGhhbGJ0Y19nZXRfd2lmaV9jZW50cmFsX2Nobmwoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCXN0cnVjdCBydGxfcGh5IAkqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IGNobmwgPSAxOworCQorCisJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsICE9IDApCisJCWNobmwgPSBydGxwaHktPmN1cnJlbnRfY2hhbm5lbDsKKwlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsIAorCQkgICJoYWxidGNfZ2V0X3dpZmlfY2VudHJhbF9jaG5sOiVkXG4iLGNobmwpOworCXJldHVybiBjaG5sOworfQorCit2b2lkIGhhbGJ0Y19sZWF2ZV9scHMoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2OworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjOworCWJvb2wgYXBfZW5hYmxlID0gZmFsc2U7CisJCisJcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlwcHNjID0gcnRsX3BzYyhydGxwcml2KTsKKwkKKwlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQVBfTU9ERV9FTkFCTEUsCisJCQkgICAmYXBfZW5hYmxlKTsKKwkKKwlpZiAoYXBfZW5hYmxlKSB7CisJCXByaW50aygiaGFsYnRjX2xlYXZlX2xwcygpPC0tZG9udCBsZWF2ZSBscHMgdW5kZXIgQVAgbW9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlidGNvZXhpc3QtPmJ0X2luZm8uYnRfY3RybF9scHMgPSB0cnVlOworCWJ0Y29leGlzdC0+YnRfaW5mby5idF9scHNfb24gPSBmYWxzZTsKK30KKwordm9pZCBoYWxidGNfZW50ZXJfbHBzKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdjsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYzsKKwlib29sIGFwX2VuYWJsZSA9IGZhbHNlOworCQorCXJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisJcHBzYyA9IHJ0bF9wc2MocnRscHJpdik7CisJCisJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0FQX01PREVfRU5BQkxFLCAKKwkJCSAgICZhcF9lbmFibGUpOworCQorCWlmIChhcF9lbmFibGUpIHsKKwkJcHJpbnRrKCJoYWxidGNfZW50ZXJfbHBzKCk8LS1kb250IGVudGVyIGxwcyB1bmRlciBBUCBtb2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKwkKKwlidGNvZXhpc3QtPmJ0X2luZm8uYnRfY3RybF9scHMgPSB0cnVlOworCWJ0Y29leGlzdC0+YnRfaW5mby5idF9scHNfb24gPSBmYWxzZTsKK30KKwordm9pZCBoYWxidGNfbm9ybWFsX2xwcyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlpZiAoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2N0cmxfbHBzKSB7CisJCWJ0Y29leGlzdC0+YnRfaW5mby5idF9scHNfb24gPSBmYWxzZTsKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2N0cmxfbHBzID0gZmFsc2U7CisJfQorCQkKK30KKwordm9pZCBoYWxidGNfbGVhdmVfbG93X3Bvd2VyKHZvaWQpCit7Cit9CisKK3ZvaWQgaGFsYnRjX25vbWFsX2xvd19wb3dlcih2b2lkKQoreworfQorCit2b2lkIGhhbGJ0Y19kaXNhYmxlX2xvd19wb3dlcih2b2lkKQoreworfQorCit2b2lkIGhhbGJ0Y19hZ2dyZWdhdGlvbl9jaGVjayh2b2lkKQoreworfQorCisKK3UzMiBoYWxidGNfZ2V0X2J0X3BhdGNoX3ZlcnNpb24oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7CisJcmV0dXJuIDA7Cit9CisKK3MzMiBoYWxidGNfZ2V0X3dpZmlfcnNzaShzdHJ1Y3QgcnRsX3ByaXYgKmFkYXB0ZXIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYWRhcHRlcjsKKwlzMzIJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9IDA7CisJCisJaWYgKHJ0bHByaXYtPm1hYzgwMjExLmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKQorCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gCisJCQlydGxwcml2LT5kbS51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCWVsc2UgLyogYXNzb2NpYXRlZCBlbnRyeSBwd2RiICovCisJCXVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPQorCQkJcnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwlyZXR1cm4gdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKK30KKworYm9vbCBoYWxidGNfZ2V0KHZvaWQgKnZvaWRfYnRjb2V4aXN0LCB1OCBnZXRfdHlwZSwgdm9pZCAqb3V0X2J1ZikKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKil2b2lkX2J0Y29leGlzdDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwlib29sICpib29sX3RtcCA9IChib29sKilvdXRfYnVmOworCWludCAqczMyX3RtcCA9IChpbnQqKW91dF9idWY7CisJdTMyICp1MzJfdG1wID0gKHUzMiopb3V0X2J1ZjsKKwl1OCAqdThfdG1wID0gKHU4KilvdXRfYnVmOworCWJvb2wgdG1wID0gZmFsc2U7CisKKworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybiBmYWxzZTsKKwkKKworCXN3aXRjaCAoZ2V0X3R5cGUpeworCWNhc2UgQlRDX0dFVF9CTF9IU19PUEVSQVRJT046CisJCSpib29sX3RtcCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfSFNfQ09OTkVDVElORzoKKwkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRDoKKwkJaWYgKHJ0bHByaXYtPm1hYzgwMjExLmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKQorCQkJdG1wID0gdHJ1ZTsKKwkJCQkKKwkJKmJvb2xfdG1wID0gdG1wOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9CVVNZOgorCQlpZihoYWxidGNfaXNfd2lmaV9idXN5KHJ0bHByaXYpKQorCQkJKmJvb2xfdG1wID0gdHJ1ZTsKKwkJZWxzZQorCQkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX1NDQU46CisJCWlmIChtYWMtPmFjdF9zY2FubmluZyA9PSB0cnVlKQorCQkJKmJvb2xfdG1wID0gdHJ1ZTsKKwkJZWxzZQorCQkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX0xJTks6CisJCWlmIChtYWMtPmxpbmtfc3RhdGUgPT0gTUFDODAyMTFfTElOS0lORykKKwkJCSpib29sX3RtcCA9IHRydWU7CisJCWVsc2UKKwkJCSpib29sX3RtcCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9ST0FNOgkvKlRPRE8qLworCQlpZiAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX0xJTktJTkcpCisJCQkqYm9vbF90bXAgPSB0cnVlOworCQllbHNlCisJCQkqYm9vbF90bXAgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1M6CS8qVE9ETyovCisJCQkqYm9vbF90bXAgPSBmYWxzZTsKKworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RzoKKwkJKmJvb2xfdG1wID0gZmFsc2U7IC8qVE9ETyovCisJCQorCWNhc2UgQlRDX0dFVF9CTF9XSUZJX0RIQ1A6CS8qVE9ETyovCisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX1NPRlRBUF9JRExFOgorCQkqYm9vbF90bXAgPSB0cnVlOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9TT0ZUQVBfTElOS0lORzoKKwkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX0lOX0VBUkxZX1NVU1BFTkQ6CisJCSpib29sX3RtcCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9BUF9NT0RFX0VOQUJMRToKKwkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9CTF9XSUZJX0VOQUJMRV9FTkNSWVBUSU9OOgorCQlpZiAoTk9fRU5DUllQVElPTiA9PSBydGxwcml2LT5zZWMucGFpcndpc2VfZW5jX2FsZ29yaXRobSkKKwkJCSpib29sX3RtcCA9IGZhbHNlOworCQllbHNlCisJCQkqYm9vbF90bXAgPSB0cnVlOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl9CX01PREU6CisJCSpib29sX3RtcCA9IGZhbHNlOyAvKlRPRE8qLworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfQkxfRVhUX1NXSVRDSDoKKwkJKmJvb2xfdG1wID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9TNF9XSUZJX1JTU0k6CisJCSpzMzJfdG1wID0gaGFsYnRjX2dldF93aWZpX3Jzc2kocnRscHJpdik7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9TNF9IU19SU1NJOgkvKlRPRE8qLworCQkqczMyX3RtcCA9IGhhbGJ0Y19nZXRfd2lmaV9yc3NpKHJ0bHByaXYpOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfVTRfV0lGSV9CVzoKKwkJKnUzMl90bXAgPSBoYWxidGNfZ2V0X3dpZmlfYncoYnRjb2V4aXN0KTsKKwkJYnJlYWs7CisJY2FzZSBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT046CisJCWlmIChoYWxidGNfaXNfd2lmaV91cGxpbmsocnRscHJpdikpCisJCQkqdTMyX3RtcCA9IEJUQ19XSUZJX1RSQUZGSUNfVFg7CisJCWVsc2UKKwkJCSp1MzJfdG1wID0gQlRDX1dJRklfVFJBRkZJQ19SWDsKKwkJYnJlYWs7CisJY2FzZSBCVENfR0VUX1U0X1dJRklfRldfVkVSOgorCQkqdTMyX3RtcCA9IHJ0bGhhbC0+ZndfdmVyc2lvbjsKKwkJYnJlYWs7CisJY2FzZSBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUjoKKwkJKnUzMl90bXAgPSBoYWxidGNfZ2V0X2J0X3BhdGNoX3ZlcnNpb24oYnRjb2V4aXN0KTsKKwkJYnJlYWs7CisJY2FzZSBCVENfR0VUX1UxX1dJRklfRE9UMTFfQ0hOTDoKKwkJKnU4X3RtcCA9IHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsOworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfVTFfV0lGSV9DRU5UUkFMX0NITkw6CisJCSp1OF90bXAgPSBoYWxidGNfZ2V0X3dpZmlfY2VudHJhbF9jaG5sKGJ0Y29leGlzdCk7CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9VMV9XSUZJX0hTX0NITkw6CisJCSp1OF90bXAgPSAxOy8qIEJUX09wZXJhdGVDaG5sKHJ0bHByaXYpOyAqLworCQlicmVhazsKKwljYXNlIEJUQ19HRVRfVTFfTUFDX1BIWV9NT0RFOgorCQkqdThfdG1wID0gQlRDX01QX1VOS05PV047CisJCWJyZWFrOworCWNhc2UgQlRDX0dFVF9VMV9BUF9OVU06CisJCS8qIGRyaXZlciBkb24ndCBrbm93IEFQIG51bSBpbiBMaW51eCwgCisJCSAqIFNvLCB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgaXMgbm90IHJpZ2h0ICovCisJCSp1OF90bXAgPSAxOy8qIHBEZWZNZ250SW5mby0+TnVtQnNzRGVzYzRRdWVyeTsgKi8KKwkJYnJlYWs7CisKKwkvKioqKioqKioqKioqKiAxQW50ICoqKioqKioqKioqKioqLworCWNhc2UgQlRDX0dFVF9VMV9MUFNfTU9ERToKKwkJKnU4X3RtcCA9IGJ0Y29leGlzdC0+cHdyX21vZGVfdmFsWzBdOworCQlicmVhazsKKwkJCQkJCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiB0cnVlOworfQorCitib29sIGhhbGJ0Y19zZXQodm9pZCAqdm9pZF9idGNvZXhpc3QsIHU4IHNldF90eXBlLCB2b2lkICppbl9idWYpCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAoc3RydWN0IGJ0Y19jb2V4aXN0ICopdm9pZF9idGNvZXhpc3Q7CisJYm9vbCAqYm9vbF90bXAgPSAoYm9vbCAqKWluX2J1ZjsKKwl1OCAqdThfdG1wID0gKHU4ICopaW5fYnVmOworCXUzMiAqdTMyX3RtcCA9ICh1MzIgKilpbl9idWY7CisJCisJCisJaWYgKCFoYWxidGNfaXNfYnRfY29leGlzdF9hdmFpbGFibGUoYnRjb2V4aXN0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChzZXRfdHlwZSkgeworCS8qIHNldCBzb21lIGJvb2wgdHlwZSB2YXJpYWJsZXMuICovCisJY2FzZSBCVENfU0VUX0JMX0JUX0RJU0FCTEU6CisJCWJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCA9ICpib29sX3RtcDsKKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWToKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2J1c3kgPSAqYm9vbF90bXA7CisJCWJyZWFrOworCWNhc2UgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRzoKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmxpbWl0ZWRfZGlnID0gKmJvb2xfdG1wOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQkxfRk9SQ0VfVE9fUk9BTToKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmZvcmNlX3RvX3JvYW0gPSAqYm9vbF90bXA7CisJCWJyZWFrOworCWNhc2UgQlRDX1NFVF9CTF9UT19SRUpfQVBfQUdHX1BLVDoKKwkJYnRjb2V4aXN0LT5idF9pbmZvLnJlamVjdF9hZ2dfcGt0ID0gKmJvb2xfdG1wOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQkxfQlRfQ1RSTF9BR0dfU0laRToKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmJfYnRfY3RybF9idWZfc2l6ZSA9ICpib29sX3RtcDsKKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX0JMX0lOQ19TQ0FOX0RFVl9OVU06CisJCWJ0Y29leGlzdC0+YnRfaW5mby5pbmNyZWFzZV9zY2FuX2Rldl9udW0gPSAqYm9vbF90bXA7CisJCWJyZWFrOworCQkvKiBzZXQgc29tZSB1MUJ5dGUgdHlwZSB2YXJpYWJsZXMuICovCisJY2FzZSBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfQUdDX1RBQkxFX09OOgorCQlidGNvZXhpc3QtPmJ0X2luZm8ucnNzaV9hZGp1c3RfZm9yX2FnY190YWJsZV9vbiA9ICp1OF90bXA7CisJCWJyZWFrOworCWNhc2UgQlRDX1NFVF9VMV9BR0dfQlVGX1NJWkU6CisJCWJ0Y29leGlzdC0+YnRfaW5mby5hZ2dfYnVmX3NpemUgPSAqdThfdG1wOworCQlicmVhazsKKwkJLyogdGhlIGZvbGxvd2luZyBhcmUgc29tZSBhY3Rpb24gd2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgKi8KKwljYXNlIEJUQ19TRVRfQUNUX0dFVF9CVF9SU1NJOgorCQkvKkJUSENJX1NlbmRHZXRCdFJzc2lFdmVudChydGxwcml2KTsqLworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQUNUX0FHR1JFR0FURV9DVFJMOgorCQloYWxidGNfYWdncmVnYXRpb25fY2hlY2soKTsKKwkJYnJlYWs7CisKKwkJLyogMUFudCAqLworCWNhc2UgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SXzFBTlRfQ09FWF9UWVBFOgorCQlidGNvZXhpc3QtPmJ0X2luZm8ucnNzaV9hZGp1c3RfZm9yXzFhbnRfY29leF90eXBlID0gKnU4X3RtcDsKKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX1VJX1NDQU5fU0lHX0NPTVBFTlNBVElPTjoKKwkvKglydGxwcml2LT5tbG1lcHJpdi5zY2FuX2NvbXBlbnNhdGlvbiA9ICp1OF90bXA7ICAqLworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfVTFfMUFOVF9MUFM6CisJCWJ0Y29leGlzdC0+YnRfaW5mby5scHNfMWFudCA9ICp1OF90bXA7CisJCWJyZWFrOworCWNhc2UgQlRDX1NFVF9VMV8xQU5UX1JQV006CisJCWJ0Y29leGlzdC0+YnRfaW5mby5ycHdtXzFhbnQgPSAqdThfdG1wOworCQlicmVhazsKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSBzb21lIGFjdGlvbiB3aGljaCB3aWxsIGJlIHRyaWdnZXJlZCAgKi8KKwljYXNlIEJUQ19TRVRfQUNUX0xFQVZFX0xQUzoKKwkJaGFsYnRjX2xlYXZlX2xwcyhidGNvZXhpc3QpOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQUNUX0VOVEVSX0xQUzoKKwkJaGFsYnRjX2VudGVyX2xwcyhidGNvZXhpc3QpOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQUNUX05PUk1BTF9MUFM6CisJCWhhbGJ0Y19ub3JtYWxfbHBzKGJ0Y29leGlzdCk7CisJCWJyZWFrOworCWNhc2UgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVI6CisJCWhhbGJ0Y19kaXNhYmxlX2xvd19wb3dlcigpOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQUNUX1VQREFURV9yYV9tYXNrOgorCQlidGNvZXhpc3QtPmJ0X2luZm8ucmFfbWFzayA9ICp1MzJfdG1wOworCQlicmVhazsKKwljYXNlIEJUQ19TRVRfQUNUX1NFTkRfTUlNT19QUzoKKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX0FDVF9JTkNfRk9SQ0VfRVhFQ19QV1JfQ01EX0NOVDoKKwkJYnRjb2V4aXN0LT5idF9pbmZvLmZvcmNlX2V4ZWNfcHdyX2NtZF9jbnQrKzsKKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX0FDVF9DVFJMX0JUX0lORk86IC8qd2FpdCBmb3IgODgxMi84ODIxKi8KKwkJYnJlYWs7CisJY2FzZSBCVENfU0VUX0FDVF9DVFJMX0JUX0NPRVg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBoYWxidGNfZGlzcGxheV9jb2V4X3N0YXRpc3RpY3Moc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7Cit9CisKK3ZvaWQgaGFsYnRjX2Rpc3BsYXlfYnRfbGlua19pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworfQorCit2b2lkIGhhbGJ0Y19kaXNwbGF5X2J0X2Z3X2luZm8oc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpCit7Cit9CisKK3ZvaWQgaGFsYnRjX2Rpc3BsYXlfZndfcHdyX21vZGVfY21kKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSU8gcmVsYXRlZCBmdW5jdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGhhbGJ0Y19yZWFkXzFieXRlKHZvaWQgKmJ0X2NvbnRleHQsIHUzMiByZWdfYWRkcikKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwkKKwlyZXR1cm4JcnRsX3JlYWRfYnl0ZShydGxwcml2LCByZWdfYWRkcik7Cit9CisKKwordTE2IGhhbGJ0Y19yZWFkXzJieXRlKHZvaWQgKmJ0X2NvbnRleHQsIHUzMiByZWdfYWRkcikKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKworCXJldHVybglydGxfcmVhZF93b3JkKHJ0bHByaXYsIHJlZ19hZGRyKTsKK30KKworCit1MzIgaGFsYnRjX3JlYWRfNGJ5dGUodm9pZCAqYnRfY29udGV4dCwgdTMyIHJlZ19hZGRyKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gKHN0cnVjdCBidGNfY29leGlzdCAqKWJ0X2NvbnRleHQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCQorCXJldHVybglydGxfcmVhZF9kd29yZChydGxwcml2LCByZWdfYWRkcik7Cit9CisKKwordm9pZCBoYWxidGNfd3JpdGVfMWJ5dGUodm9pZCAqYnRfY29udGV4dCwgdTMyIHJlZ19hZGRyLCB1OCBkYXRhKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gKHN0cnVjdCBidGNfY29leGlzdCAqKWJ0X2NvbnRleHQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcmVnX2FkZHIsIGRhdGEpOworfQorCit2b2lkIGhhbGJ0Y19iaXRtYXNrX3dyaXRlXzFieXRlKHZvaWQgKmJ0X2NvbnRleHQsIHUzMiByZWdfYWRkciwgCisJCQkJdTggYml0X21hc2ssIHU4IGRhdGEpCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAoc3RydWN0IGJ0Y19jb2V4aXN0ICopYnRfY29udGV4dDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisJdTggb3JpZ2luYWxfdmFsdWUsIGJpdF9zaGlmdCA9IDA7CisJdTggaTsKKworCWlmIChiaXRfbWFzayAhPSBNQVNLRFdPUkQpIHsvKmlmIG5vdCAiZG91YmxlIHdvcmQiIHdyaXRlKi8KKwkJb3JpZ2luYWxfdmFsdWUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIHJlZ19hZGRyKTsJCisJCWZvciAoaT0wOyBpPD03OyBpKyspIHsKKwkJCWlmKChiaXRfbWFzaz4+aSkmMHgxKQorCQkJCWJyZWFrOworCQl9CisJCWJpdF9zaGlmdCA9IGk7CisJCWRhdGEgPSAob3JpZ2luYWxfdmFsdWUgJiAofmJpdF9tYXNrKSkgfCAKKwkJCSgoZGF0YSA8PCBiaXRfc2hpZnQpICYgYml0X21hc2spOworCX0KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCByZWdfYWRkciwgZGF0YSk7Cit9CisKKwordm9pZCBoYWxidGNfd3JpdGVfMmJ5dGUodm9pZCAqYnRfY29udGV4dCwgdTMyIHJlZ19hZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIHJlZ19hZGRyLCBkYXRhKTsKK30KKworCit2b2lkIGhhbGJ0Y193cml0ZV80Ynl0ZSh2b2lkICpidF9jb250ZXh0LCB1MzIgcmVnX2FkZHIsIHUzMiBkYXRhKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gCisJCShzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCByZWdfYWRkciwgZGF0YSk7Cit9CisKKwordm9pZCBoYWxidGNfc2V0X21hY3JlZyh2b2lkICpidF9jb250ZXh0LCB1MzIgcmVnX2FkZHIsIHUzMiBiaXRfbWFzaywgdTMyIGRhdGEpCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAoc3RydWN0IGJ0Y19jb2V4aXN0ICopYnRfY29udGV4dDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisKKwlydGxfc2V0X2JicmVnKHJ0bHByaXYtPm1hYzgwMjExLmh3LCByZWdfYWRkciwgYml0X21hc2ssIGRhdGEpOworfQorCisKK3UzMiBoYWxidGNfZ2V0X21hY3JlZyh2b2lkICpidF9jb250ZXh0LCB1MzIgcmVnX2FkZHIsIHUzMiBiaXRfbWFzaykKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKworCXJldHVybiBydGxfZ2V0X2JicmVnKHJ0bHByaXYtPm1hYzgwMjExLmh3LCByZWdfYWRkciwgYml0X21hc2spOworfQorCisKK3ZvaWQgaGFsYnRjX3NldF9iYnJlZyh2b2lkICpidF9jb250ZXh0LCB1MzIgcmVnX2FkZHIsIHUzMiBiaXRfbWFzaywgdTMyIGRhdGEpCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAoc3RydWN0IGJ0Y19jb2V4aXN0ICopYnRfY29udGV4dDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisKKwlydGxfc2V0X2JicmVnKHJ0bHByaXYtPm1hYzgwMjExLmh3LCByZWdfYWRkciwgYml0X21hc2ssIGRhdGEpOworfQorCisKK3UzMiBoYWxidGNfZ2V0X2JicmVnKHZvaWQgKmJ0X2NvbnRleHQsIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gKHN0cnVjdCBidGNfY29leGlzdCAqKWJ0X2NvbnRleHQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCisJcmV0dXJuIHJ0bF9nZXRfYmJyZWcocnRscHJpdi0+bWFjODAyMTEuaHcscmVnX2FkZHIsIGJpdF9tYXNrKTsKK30KKworCit2b2lkIGhhbGJ0Y19zZXRfcmZyZWcodm9pZCAqYnRfY29udGV4dCwgdTggcmZfcGF0aCwgdTMyIHJlZ19hZGRyLCAKKwkJICAgICAgdTMyIGJpdF9tYXNrLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9IChzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKworCXJ0bF9zZXRfcmZyZWcocnRscHJpdi0+bWFjODAyMTEuaHcsIHJmX3BhdGgsIHJlZ19hZGRyLCBiaXRfbWFzaywgZGF0YSk7Cit9CisKKwordTMyIGhhbGJ0Y19nZXRfcmZyZWcodm9pZCAqYnRfY29udGV4dCwgdTggcmZfcGF0aCwgdTMyIHJlZ19hZGRyLCB1MzIgYml0X21hc2spCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAoc3RydWN0IGJ0Y19jb2V4aXN0ICopYnRfY29udGV4dDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisKKwlyZXR1cm4gcnRsX2dldF9yZnJlZyhydGxwcml2LT5tYWM4MDIxMS5odywgcmZfcGF0aCwgcmVnX2FkZHIsIGJpdF9tYXNrKTsKK30KKworCit2b2lkIGhhbGJ0Y19maWxsX2gyY19jbWQodm9pZCAqYnRfY29udGV4dCwgdTggZWxlbWVudF9pZCwgCisJCQkgdTMyIGNtZF9sZW4sIHU4ICpjbWRfYnVmKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gKHN0cnVjdCBidGNfY29leGlzdCAqKWJ0X2NvbnRleHQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCQorCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX2gyY19jbWQocnRscHJpdi0+bWFjODAyMTEuaHcsIGVsZW1lbnRfaWQsIAorCQkJCQljbWRfbGVuLCBjbWRfYnVmKTsKK30KKwordm9pZCBoYWxidGNfZGlzcGxheV9kYmdfbXNnKHZvaWQgKmJ0X2NvbnRleHQsIHU4IGRpc3BfdHlwZSkKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9CShzdHJ1Y3QgYnRjX2NvZXhpc3QgKilidF9jb250ZXh0OworCXN3aXRjaCAoZGlzcF90eXBlKSB7CisJY2FzZSBCVENfREJHX0RJU1BfQ09FWF9TVEFUSVNUSUNTOgorCQloYWxidGNfZGlzcGxheV9jb2V4X3N0YXRpc3RpY3MoYnRjb2V4aXN0KTsKKwkJYnJlYWs7CisJY2FzZSBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPOgorCQloYWxidGNfZGlzcGxheV9idF9saW5rX2luZm8oYnRjb2V4aXN0KTsKKwkJYnJlYWs7CisJY2FzZSBCVENfREJHX0RJU1BfQlRfRldfVkVSOgorCQloYWxidGNfZGlzcGxheV9idF9md19pbmZvKGJ0Y29leGlzdCk7CisJCWJyZWFrOworCWNhc2UgQlRDX0RCR19ESVNQX0ZXX1BXUl9NT0RFX0NNRDoKKwkJaGFsYnRjX2Rpc3BsYXlfZndfcHdyX21vZGVfY21kKGJ0Y29leGlzdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworYm9vbCBoYWxidGNfdW5kZXJfaXBzKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRscHJpdik7CisJZW51bSByZl9wd3JzdGF0ZSBydHN0YXRlOworCQorCWlmIChwcHNjLT5iX2luYWN0aXZlcHMpIHsKKwkJcnRzdGF0ZSA9IHBwc2MtPnJmcHdyX3N0YXRlOworCisJCWlmIChydHN0YXRlICE9IEVSRk9OICYmCisJCSAgICBwcHNjLT5yZm9mZl9yZWFzb24gPT0gUkZfQ0hBTkdFX0JZX0lQUykgeworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEV4dGVybiBmdW5jdGlvbnMgY2FsbGVkIGJ5IG90aGVyIG1vZHVsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBleGhhbGJ0Y19pbml0bGl6ZV92YXJpYWJsZXMoc3RydWN0IHJ0bF9wcml2ICphZGFwdGVyKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gJmdsX2J0X2NvZXhpc3Q7CisKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2JpbmQrKzsKKwkKKwloYWxidGNfZGJnX2luaXQoKTsKKworCWlmIChidGNvZXhpc3QtPmJpbmRlZCkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJYnRjb2V4aXN0LT5iaW5kZWQgPSB0cnVlOworCisjaWYgKCBkZWZpbmVkKENPTkZJR19QQ0lfSENJKSkKKwlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfUENJOworI2VsaWYgKCBkZWZpbmVkKENPTkZJR19VU0JfSENJKSkKKwlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfVVNCOworI2VsaWYgKCBkZWZpbmVkKENPTkZJR19TRElPX0hDSSkpCisJYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1NESU87CisjZWxpZiAoIGRlZmluZWQoQ09ORklHX0dTUElfSENJKSkKKwlidGNvZXhpc3QtPmNoaXBfaW50ZXJmYWNlID0gQlRDX0lOVEZfR1NQSTsKKyNlbHNlCisJYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1VOS05PV047CisjZW5kaWYKKworCWlmIChOVUxMID09IGJ0Y29leGlzdC0+YWRhcHRlcikKKwkJYnRjb2V4aXN0LT5hZGFwdGVyID0gYWRhcHRlcjsKKworCWJ0Y29leGlzdC0+c3RhY2tfaW5mby5wcm9maWxlX25vdGlmaWVkID0gZmFsc2U7CisKKwlidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlID0gaGFsYnRjX3JlYWRfMWJ5dGU7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUgPSBoYWxidGNfd3JpdGVfMWJ5dGU7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayA9IGhhbGJ0Y19iaXRtYXNrX3dyaXRlXzFieXRlOworCWJ0Y29leGlzdC0+YnRjX3JlYWRfMmJ5dGUgPSBoYWxidGNfcmVhZF8yYnl0ZTsKKwlidGNvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZSA9IGhhbGJ0Y193cml0ZV8yYnl0ZTsKKwlidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlID0gaGFsYnRjX3JlYWRfNGJ5dGU7CisJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUgPSBoYWxidGNfd3JpdGVfNGJ5dGU7CisKKwlidGNvZXhpc3QtPmJ0Y19zZXRfYmJfcmVnID0gaGFsYnRjX3NldF9iYnJlZzsKKwlidGNvZXhpc3QtPmJ0Y19nZXRfYmJfcmVnID0gaGFsYnRjX2dldF9iYnJlZzsKKworCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcgPSBoYWxidGNfc2V0X3JmcmVnOworCWJ0Y29leGlzdC0+YnRjX2dldF9yZl9yZWcgPSBoYWxidGNfZ2V0X3JmcmVnOworCisJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMgPSBoYWxidGNfZmlsbF9oMmNfY21kOworCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyA9IGhhbGJ0Y19kaXNwbGF5X2RiZ19tc2c7CisJCisJYnRjb2V4aXN0LT5idGNfZ2V0ID0gaGFsYnRjX2dldDsKKwlidGNvZXhpc3QtPmJ0Y19zZXQgPSBoYWxidGNfc2V0OworCisJYnRjb2V4aXN0LT5jbGlfYnVmID0gJmJ0Y19kYmdfYnVmWzBdOworCisJYnRjb2V4aXN0LT5idF9pbmZvLmJfYnRfY3RybF9idWZfc2l6ZSA9IGZhbHNlOworCWJ0Y29leGlzdC0+YnRfaW5mby5hZ2dfYnVmX3NpemUgPSA1OworCisJYnRjb2V4aXN0LT5idF9pbmZvLmluY3JlYXNlX3NjYW5fZGV2X251bSA9IGZhbHNlOworCXJldHVybiB0cnVlOworfQorCit2b2lkIGV4aGFsYnRjX2luaXRfaHdfY29uZmlnKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwkKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2luaXRfaHdfY29uZmlnKys7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0JFKSB7CisJCWlmIChidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDIpCisJCQlleF9oYWxidGM4NzIzYjJhbnRfaW5pdF9od2NvbmZpZyhidGNvZXhpc3QpOworCQllbHNlIGlmKGJ0Y29leGlzdC0+Ym9hcmRfaW5mby5idGRtX2FudF9udW0gPT0gMSkKKwkJCWV4X2hhbGJ0Yzg3MjNiMWFudF9pbml0X2h3Y29uZmlnKGJ0Y29leGlzdCk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkJZXhfaGFsYnRjODE5MmUyYW50X2luaXRfaHdjb25maWcoYnRjb2V4aXN0KTsKKwl9CisJCit9CisKK3ZvaWQgZXhoYWxidGNfaW5pdF9jb2V4X2RtKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwkKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2luaXRfY29leF9kbSsrOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X2luaXRfY29leF9kbShidGNvZXhpc3QpOwkJCisJCWVsc2UgaWYoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAxKQorCQkJZXhfaGFsYnRjODcyM2IxYW50X2luaXRfY29leF9kbShidGNvZXhpc3QpOworCX0gZWxzZSBpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkVFKSB7CisJCWV4X2hhbGJ0YzgxOTJlMmFudF9pbml0X2NvZXhfZG0oYnRjb2V4aXN0KTsKKwl9CisJCisJYnRjb2V4aXN0LT5pbml0aWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBleGhhbGJ0Y19pcHNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwl1OCBpcHNfdHlwZTsKKworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2lwc19ub3RpZnkrKzsKKwlpZiAoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkKKwkJcmV0dXJuOworCisJaWYgKEVSRk9GRiA9PSB0eXBlKQorCQlpcHNfdHlwZSA9IEJUQ19JUFNfRU5URVI7CisJZWxzZQorCQlpcHNfdHlwZSA9IEJUQ19JUFNfTEVBVkU7CisKKwloYWxidGNfbGVhdmVfbG93X3Bvd2VyKCk7CisJCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X2lwc19ub3RpZnkoYnRjb2V4aXN0LCBpcHNfdHlwZSk7CisJCWVsc2UgaWYoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAxKQorCQkJZXhfaGFsYnRjODcyM2IxYW50X2lwc19ub3RpZnkoYnRjb2V4aXN0LCBpcHNfdHlwZSk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkJZXhfaGFsYnRjODE5MmUyYW50X2lwc19ub3RpZnkoYnRjb2V4aXN0LCBpcHNfdHlwZSk7CisJfQorCisJaGFsYnRjX25vbWFsX2xvd19wb3dlcigpOworfQorCit2b2lkIGV4aGFsYnRjX2xwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXU4IGxwc190eXBlOworCisJaWYgKCFoYWxidGNfaXNfYnRfY29leGlzdF9hdmFpbGFibGUoYnRjb2V4aXN0KSkKKwkJcmV0dXJuOworCWJ0Y29leGlzdC0+c3RhdGlzdGljcy5jbnRfbHBzX25vdGlmeSsrOworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCQlyZXR1cm47CisJCisJaWYgKEVBQ1RJVkUgPT0gdHlwZSkKKwkJbHBzX3R5cGUgPSBCVENfTFBTX0RJU0FCTEU7CisJZWxzZQorCQlscHNfdHlwZSA9IEJUQ19MUFNfRU5BQkxFOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X2xwc19ub3RpZnkoYnRjb2V4aXN0LCBscHNfdHlwZSk7CisJCWVsc2UgaWYoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAxKQorCQkJZXhfaGFsYnRjODcyM2IxYW50X2xwc19ub3RpZnkoYnRjb2V4aXN0LCBscHNfdHlwZSk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkJZXhfaGFsYnRjODE5MmUyYW50X2xwc19ub3RpZnkoYnRjb2V4aXN0LCBscHNfdHlwZSk7CisJfQorfQorCit2b2lkIGV4aGFsYnRjX3NjYW5fbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwl1OCBzY2FuX3R5cGU7CisKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisJYnRjb2V4aXN0LT5zdGF0aXN0aWNzLmNudF9zY2FuX25vdGlmeSsrOworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCQlyZXR1cm47CisKKwlpZiAodHlwZSkKKwkJc2Nhbl90eXBlID0gQlRDX1NDQU5fU1RBUlQ7CisJZWxzZQorCQlzY2FuX3R5cGUgPSBCVENfU0NBTl9GSU5JU0g7CisKKwloYWxidGNfbGVhdmVfbG93X3Bvd2VyKCk7CisJCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X3NjYW5fbm90aWZ5KGJ0Y29leGlzdCwgc2Nhbl90eXBlKTsKKwkJZWxzZSBpZihidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDEpCisJCQlleF9oYWxidGM4NzIzYjFhbnRfc2Nhbl9ub3RpZnkoYnRjb2V4aXN0LCBzY2FuX3R5cGUpOworCX0gZWxzZSBpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkVFKSB7CisJCWV4X2hhbGJ0YzgxOTJlMmFudF9zY2FuX25vdGlmeShidGNvZXhpc3QsIHNjYW5fdHlwZSk7CisJfQorCisJaGFsYnRjX25vbWFsX2xvd19wb3dlcigpOworfQorCit2b2lkIGV4aGFsYnRjX2Nvbm5lY3Rfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCBhY3Rpb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXU4IGFzc29fdHlwZTsKKworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2Nvbm5lY3Rfbm90aWZ5Kys7CisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJCXJldHVybjsKKworCWlmIChhY3Rpb24pCisJCWFzc29fdHlwZSA9IEJUQ19BU1NPQ0lBVEVfU1RBUlQ7CisJZWxzZQorCQlhc3NvX3R5cGUgPSBCVENfQVNTT0NJQVRFX0ZJTklTSDsKKworCWhhbGJ0Y19sZWF2ZV9sb3dfcG93ZXIoKTsKKwkKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0JFKSB7CisJCWlmIChidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDIpCisJCQlleF9oYWxidGM4NzIzYjJhbnRfY29ubmVjdF9ub3RpZnkoYnRjb2V4aXN0LCBhc3NvX3R5cGUpOworCQllbHNlIGlmKGJ0Y29leGlzdC0+Ym9hcmRfaW5mby5idGRtX2FudF9udW0gPT0gMSkKKwkJCWV4X2hhbGJ0Yzg3MjNiMWFudF9jb25uZWN0X25vdGlmeShidGNvZXhpc3QsIGFzc29fdHlwZSk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkJZXhfaGFsYnRjODE5MmUyYW50X2Nvbm5lY3Rfbm90aWZ5KGJ0Y29leGlzdCwgYXNzb190eXBlKTsKKwl9CisKKwloYWxidGNfbm9tYWxfbG93X3Bvd2VyKCk7Cit9CisKK3ZvaWQgZXhoYWxidGNfbWVkaWFzdGF0dXNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCAKKwkJCQkgZW51bSBydF9tZWRpYV9zdGF0dXMgbWVkaWFfc3RhdHVzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IGJ0Y29leGlzdC0+YWRhcHRlcjsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwl1OCBzdGF0dXM7CisKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisJYnRjb2V4aXN0LT5zdGF0aXN0aWNzLmNudF9tZWRpYV9zdGF0dXNfbm90aWZ5Kys7CisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJCXJldHVybjsKKworCWlmIChSVF9NRURJQV9DT05ORUNUID09IG1lZGlhX3N0YXR1cykKKwkJc3RhdHVzID0gQlRDX01FRElBX0NPTk5FQ1Q7CisJZWxzZQorCQlzdGF0dXMgPSBCVENfTUVESUFfRElTQ09OTkVDVDsKKworCWhhbGJ0Y19sZWF2ZV9sb3dfcG93ZXIoKTsKKwkKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0JFKSB7CisJCWlmIChidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDIpCisJCQlleF9oYWxidGM4NzIzYjJhbnRfbWVkaWFfc3RhdHVzX25vdGlmeShidGNvZXhpc3QsIHN0YXR1cyk7CisJCWVsc2UgaWYoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAxKQorCQkJZXhfaGFsYnRjODcyM2IxYW50X21lZGlhX3N0YXR1c19ub3RpZnkoYnRjb2V4aXN0LCBzdGF0dXMpOworCX0gZWxzZSBpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkVFKSB7CisJCWV4X2hhbGJ0YzgxOTJlMmFudF9tZWRpYV9zdGF0dXNfbm90aWZ5KGJ0Y29leGlzdCwgc3RhdHVzKTsKKwl9CisKKwloYWxidGNfbm9tYWxfbG93X3Bvd2VyKCk7Cit9CisKK3ZvaWQgZXhoYWxidGNfc3BlY2lhbF9wYWNrZXRfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCBwa3RfdHlwZSkKK3sKKwl1OCBwYWNrZXRfdHlwZTsKKworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X3NwZWNpYWxfcGFja2V0X25vdGlmeSsrOworCWlmIChidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQorCQlyZXR1cm47CisKKwkvKmlmKFBBQ0tFVF9ESENQID09IHBrdF90eXBlKSovCisJCXBhY2tldF90eXBlID0gQlRDX1BBQ0tFVF9ESENQOworCS8qZWxzZSBpZihQQUNLRVRfRUFQT0wgPT0gcGt0X3R5cGUpCisJCXBhY2tldF90eXBlID0gQlRDX1BBQ0tFVF9FQVBPTDsKKwllbHNlCisJCXBhY2tldF90eXBlID0gQlRDX1BBQ0tFVF9VTktOT1dOOyovCisKKwloYWxidGNfbGVhdmVfbG93X3Bvd2VyKCk7CisKKwlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQlleF9oYWxidGM4NzIzYjJhbnRfc3BlY2lhbF9wYWNrZXRfbm90aWZ5KGJ0Y29leGlzdCwKKwkJCQkJCQkgcGFja2V0X3R5cGUpOworCWVsc2UgaWYgKGJ0Y29leGlzdC0+Ym9hcmRfaW5mby5idGRtX2FudF9udW0gPT0gMSkKKwkJZXhfaGFsYnRjODcyM2IxYW50X3NwZWNpYWxfcGFja2V0X25vdGlmeShidGNvZXhpc3QsCisJCQkJCQkJIHBhY2tldF90eXBlKTsKKworCWhhbGJ0Y19ub21hbF9sb3dfcG93ZXIoKTsKK30KKwordm9pZCBleGhhbGJ0Y19idF9pbmZvX25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgCisJCQkgICAgIHU4ICp0bXBfYnVmLCB1OCBsZW5ndGgpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gYnRjb2V4aXN0LT5hZGFwdGVyOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKwlidGNvZXhpc3QtPnN0YXRpc3RpY3MuY250X2J0X2luZm9fbm90aWZ5Kys7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0JFKSB7CisJCWlmIChidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDIpCisJCQlleF9oYWxidGM4NzIzYjJhbnRfYnRfaW5mb19ub3RpZnkoYnRjb2V4aXN0LCB0bXBfYnVmLCBsZW5ndGgpOworCQllbHNlIGlmKGJ0Y29leGlzdC0+Ym9hcmRfaW5mby5idGRtX2FudF9udW0gPT0gMSkKKwkJCWV4X2hhbGJ0Yzg3MjNiMWFudF9idF9pbmZvX25vdGlmeShidGNvZXhpc3QsIHRtcF9idWYsIGxlbmd0aCk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkvLwlleF9oYWxidGM4MTkyZTJhbnRfYnRfaW5mb19ub3RpZnkoYnRjb2V4aXN0LCB0bXBfYnVmLCBsZW5ndGgpOworCX0KK30KKwordm9pZCBleGhhbGJ0Y19zdGFja19vcGVyYXRpb25fbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKQoreworCXU4IHN0YWNrX29wX3R5cGU7CisKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisJYnRjb2V4aXN0LT5zdGF0aXN0aWNzLmNudF9zdGFja19vcGVyYXRpb25fbm90aWZ5Kys7CisJaWYgKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCisJCXJldHVybjsKKworCXN0YWNrX29wX3R5cGUgPSBCVENfU1RBQ0tfT1BfTk9ORTsKK30KKwordm9pZCBleGhhbGJ0Y19oYWx0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRscHJpdik7CisJaWYgKCFoYWxidGNfaXNfYnRfY29leGlzdF9hdmFpbGFibGUoYnRjb2V4aXN0KSkKKwkJcmV0dXJuOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X2hhbHRfbm90aWZ5KGJ0Y29leGlzdCk7CisJCWVsc2UgaWYoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAxKQorCQkJZXhfaGFsYnRjODcyM2IxYW50X2hhbHRfbm90aWZ5KGJ0Y29leGlzdCk7CisJfSBlbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUUpIHsKKwkJZXhfaGFsYnRjODE5MmUyYW50X2hhbHRfbm90aWZ5KGJ0Y29leGlzdCk7CisJfQorfQorCit2b2lkIGV4aGFsYnRjX3BucF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHBucF9zdGF0ZSkKK3sKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47Cit9CisKK3ZvaWQgZXhoYWxidGNfcGVyaW9kaWNhbChzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBidGNvZXhpc3QtPmFkYXB0ZXI7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRscHJpdik7CisJaWYgKCFoYWxidGNfaXNfYnRfY29leGlzdF9hdmFpbGFibGUoYnRjb2V4aXN0KSkKKwkJcmV0dXJuOworCWJ0Y29leGlzdC0+c3RhdGlzdGljcy5jbnRfcGVyaW9kaWNhbCsrOworCisJaGFsYnRjX2xlYXZlX2xvd19wb3dlcigpOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSkgeworCQlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQkJZXhfaGFsYnRjODcyM2IyYW50X3BlcmlvZGljYWwoYnRjb2V4aXN0KTsKKwkJZWxzZSBpZihidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDEpCisJCQlleF9oYWxidGM4NzIzYjFhbnRfcGVyaW9kaWNhbChidGNvZXhpc3QpOworCX0gZWxzZSBpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkVFKSB7CisJCWV4X2hhbGJ0YzgxOTJlMmFudF9wZXJpb2RpY2FsKGJ0Y29leGlzdCk7CisJfQorCisJaGFsYnRjX25vbWFsX2xvd19wb3dlcigpOworfQorCit2b2lkIGV4aGFsYnRjX2RiZ19jb250cm9sKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCAKKwkJCSAgdTggY29kZSwgdTggbGVuLCB1OCAqZGF0YSkKK3sKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisJYnRjb2V4aXN0LT5zdGF0aXN0aWNzLmNudF9kYmdfY3RybCsrOworfQorCit2b2lkIGV4aGFsYnRjX3N0YWNrX3VwZGF0ZV9wcm9maWxlX2luZm8oKQoreworfQorCit2b2lkIGV4aGFsYnRjX3VwZGF0ZV9taW5fYnRfcnNzaShjaGFyIGJ0X3Jzc2kpCit7CisJc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QgPSAmZ2xfYnRfY29leGlzdDsKKworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKworCWJ0Y29leGlzdC0+c3RhY2tfaW5mby5taW5fYnRfcnNzaSA9IGJ0X3Jzc2k7Cit9CisKKwordm9pZCBleGhhbGJ0Y19zZXRfaGNpX3ZlcnNpb24odTE2IGhjaV92ZXJzaW9uKQoreworCXN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0ID0gJmdsX2J0X2NvZXhpc3Q7CisKKwlpZiAoIWhhbGJ0Y19pc19idF9jb2V4aXN0X2F2YWlsYWJsZShidGNvZXhpc3QpKQorCQlyZXR1cm47CisKKwlidGNvZXhpc3QtPnN0YWNrX2luZm8uaGNpX3ZlcnNpb24gPSBoY2lfdmVyc2lvbjsKK30KKwordm9pZCBleGhhbGJ0Y19zZXRfYnRfcGF0Y2hfdmVyc2lvbih1MTYgYnRfaGNpX3ZlcnNpb24sIHUxNiBidF9wYXRjaF92ZXJzaW9uKSAKK3sKKwlzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCA9ICZnbF9idF9jb2V4aXN0OworCisJaWYgKCFoYWxidGNfaXNfYnRfY29leGlzdF9hdmFpbGFibGUoYnRjb2V4aXN0KSkKKwkJcmV0dXJuOworCisJYnRjb2V4aXN0LT5idF9pbmZvLmJ0X3JlYWxfZndfdmVyID0gYnRfcGF0Y2hfdmVyc2lvbjsKKwlidGNvZXhpc3QtPmJ0X2luZm8uYnRfaGNpX3ZlciA9IGJ0X2hjaV92ZXJzaW9uOworfQorCit2b2lkIGV4aGFsYnRjX3NldF9idF9leGlzdChib29sIGJ0X2V4aXN0KQoreworCWdsX2J0X2NvZXhpc3QuYm9hcmRfaW5mby5idF9leGlzdCA9IGJ0X2V4aXN0OworfQorCit2b2lkIGV4aGFsYnRjX3NldF9jaGlwX3R5cGUodTggY2hpcF90eXBlKQoreworCXN3aXRjaCAoY2hpcF90eXBlKSB7CisJZGVmYXVsdDoKKwljYXNlIEJUXzJXSVJFOgorCWNhc2UgQlRfSVNTQ18zV0lSRToKKwljYXNlIEJUX0FDQ0VMOgorCWNhc2UgQlRfUlRMODc1NjoKKwkJZ2xfYnRfY29leGlzdC5ib2FyZF9pbmZvLmJ0X2NoaXBfdHlwZSA9IEJUQ19DSElQX1VOREVGOworCQlicmVhazsKKwljYXNlIEJUX0NTUl9CQzQ6CisJCWdsX2J0X2NvZXhpc3QuYm9hcmRfaW5mby5idF9jaGlwX3R5cGUgPSBCVENfQ0hJUF9DU1JfQkM0OworCQlicmVhazsKKwljYXNlIEJUX0NTUl9CQzg6CisJCWdsX2J0X2NvZXhpc3QuYm9hcmRfaW5mby5idF9jaGlwX3R5cGUgPSBCVENfQ0hJUF9DU1JfQkM4OworCQlicmVhazsKKwljYXNlIEJUX1JUTDg3MjNBOgorCQlnbF9idF9jb2V4aXN0LmJvYXJkX2luZm8uYnRfY2hpcF90eXBlID0gQlRDX0NISVBfUlRMODcyM0E7CisJCWJyZWFrOworCWNhc2UgQlRfUlRMODgyMUE6CisJCWdsX2J0X2NvZXhpc3QuYm9hcmRfaW5mby5idF9jaGlwX3R5cGUgPSBCVENfQ0hJUF9SVEw4ODIxOworCQlicmVhazsKKwljYXNlIEJUX1JUTDg3MjNCOgorCQlnbF9idF9jb2V4aXN0LmJvYXJkX2luZm8uYnRfY2hpcF90eXBlID0gQlRDX0NISVBfUlRMODcyM0I7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBleGhhbGJ0Y19zZXRfYW50X251bSh1OCB0eXBlLCB1OCBhbnRfbnVtKQoreworCWlmIChCVF9DT0VYX0FOVF9UWVBFX1BHID09IHR5cGUpIHsKKwkJZ2xfYnRfY29leGlzdC5ib2FyZF9pbmZvLnBnX2FudF9udW0gPSBhbnRfbnVtOworCQlnbF9idF9jb2V4aXN0LmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID0gYW50X251bTsKKwl9IGVsc2UgaWYgKEJUX0NPRVhfQU5UX1RZUEVfQU5URElWID09IHR5cGUpIHsKKwkJZ2xfYnRfY29leGlzdC5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9IGFudF9udW07CisJfQorfQorCit2b2lkIGV4aGFsYnRjX2Rpc3BsYXlfYnRfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KQoreworCWlmICghaGFsYnRjX2lzX2J0X2NvZXhpc3RfYXZhaWxhYmxlKGJ0Y29leGlzdCkpCisJCXJldHVybjsKKwkKKwlpZiAoYnRjb2V4aXN0LT5ib2FyZF9pbmZvLmJ0ZG1fYW50X251bSA9PSAyKQorCQlleF9oYWxidGM4NzIzYjJhbnRfZGlzcGxheV9jb2V4X2luZm8oYnRjb2V4aXN0KTsKKwllbHNlIGlmIChidGNvZXhpc3QtPmJvYXJkX2luZm8uYnRkbV9hbnRfbnVtID09IDEpCisJCWV4X2hhbGJ0Yzg3MjNiMWFudF9kaXNwbGF5X2NvZXhfaW5mbyhidGNvZXhpc3QpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGNvdXRzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODc3OThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmgKQEAgLTAsMCArMSw1NDkgQEAKKyNpZm5kZWYJX19IQUxCVENfT1VUX1NSQ19IX18KKyNkZWZpbmUgX19IQUxCVENfT1VUX1NSQ19IX18KKworI2luY2x1ZGUJIi4uL3dpZmkuaCIKKworI2RlZmluZQkJTk9STUFMX0VYRUMJCQkJZmFsc2UKKyNkZWZpbmUJCUZPUkNFX0VYRUMJCQkJdHJ1ZQorCisjZGVmaW5lCQlCVENfUkZfQQkJCQlSRjkwX1BBVEhfQQorI2RlZmluZQkJQlRDX1JGX0IJCQkJUkY5MF9QQVRIX0IKKyNkZWZpbmUJCUJUQ19SRl9DCQkJCVJGOTBfUEFUSF9DCisjZGVmaW5lCQlCVENfUkZfRAkJCQlSRjkwX1BBVEhfRAorCisjZGVmaW5lCQlCVENfU01TUAkJCQlTSU5HTEVNQUNfU0lOR0xFUEhZCisjZGVmaW5lCQlCVENfRE1EUAkJCQlEVUFMTUFDX0RVQUxQSFkKKyNkZWZpbmUJCUJUQ19ETVNQCQkJCURVQUxNQUNfU0lOR0xFUEhZCisjZGVmaW5lCQlCVENfTVBfVU5LTk9XTgkJCQkweGZmCisKKyNkZWZpbmUgCUlOCisjZGVmaW5lIAlPVVQKKworI2RlZmluZSAJQlRfVE1QX0JVRl9TSVpFIAkJCTEwMAorCisjZGVmaW5lCQlCVF9DT0VYX0FOVF9UWVBFX1BHCQkJMAorI2RlZmluZQkJQlRfQ09FWF9BTlRfVFlQRV9BTlRESVYJCQkxCisjZGVmaW5lCQlCVF9DT0VYX0FOVF9UWVBFX0RFVEVDVEVECQkyCisKKyNkZWZpbmUJCUJUQ19NSU1PX1BTX1NUQVRJQwkJCTAKKyNkZWZpbmUJCUJUQ19NSU1PX1BTX0RZTkFNSUMJCQkxCisKKyNkZWZpbmUJCUJUQ19SQVRFX0RJU0FCTEUJCQkwCisjZGVmaW5lCQlCVENfUkFURV9FTkFCTEUJCQkJMQorCisvKiBzaW5nbGUgQW50ZW5uYSBkZWZpbml0aW9uICovCisjZGVmaW5lCQlCVENfQU5UX1BBVEhfV0lGSQkJCTAKKyNkZWZpbmUJCUJUQ19BTlRfUEFUSF9CVAkJCQkxCisjZGVmaW5lCQlCVENfQU5UX1BBVEhfUFRBCQkJMgorLyogZHVhbCBBbnRlbm5hIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJCUJUQ19BTlRfV0lGSV9BVF9NQUlOCQkJMAorI2RlZmluZQkJQlRDX0FOVF9XSUZJX0FUX0FVWAkJCTEKKy8qIGNvdXBsZXIgQW50ZW5uYSBkZWZpbml0aW9uICovCisjZGVmaW5lCQlCVENfQU5UX1dJRklfQVRfQ1BMX01BSU4JCTAKKyNkZWZpbmUJCUJUQ19BTlRfV0lGSV9BVF9DUExfQVVYCQkJMQorCitlbnVtIGJ0Y19jaGlwX2ludGVyZmFjZXsKKwlCVENfSU5URl9VTktOT1dOCT0gMCwKKwlCVENfSU5URl9QQ0kJCT0gMSwKKwlCVENfSU5URl9VU0IJCT0gMiwKKwlCVENfSU5URl9TRElPCQk9IDMsCisJQlRDX0lOVEZfR1NQSQkJPSA0LAorCUJUQ19JTlRGX01BWAorfTsKKworZW51bSBidGNfY2hpcF90eXBleworCUJUQ19DSElQX1VOREVGCQk9IDAsCisJQlRDX0NISVBfQ1NSX0JDNAk9IDEsCisJQlRDX0NISVBfQ1NSX0JDOAk9IDIsCisJQlRDX0NISVBfUlRMODcyM0EgCT0gMywKKwlCVENfQ0hJUF9SVEw4ODIxCT0gNCwKKwlCVENfQ0hJUF9SVEw4NzIzQiAJPSA1LAorCUJUQ19DSElQX01BWAorfTsKKworZW51bSBidGNfbXNnX3R5cGV7CisJQlRDX01TR19JTlRFUkZBQ0UJPSAweDAsCisJQlRDX01TR19BTEdPUklUSE0JPSAweDEsCisJQlRDX01TR19NQVgKK307CisKK2V4dGVybiB1MzIgYnRjX2RiZ190eXBlW107CisKKy8qIGZvbGxvd2luZyBpcyBmb3IgQlRDX01TR19JTlRFUkZBQ0UgKi8KKyNkZWZpbmUJCUlOVEZfSU5JVAkJCQlCSVQwCisjZGVmaW5lCQlJTlRGX05PVElGWQkJCQlCSVQyCisKKy8qIGZvbGxvd2luZyBpcyBmb3IgQlRDX0FMR09SSVRITSAqLworI2RlZmluZQkJQUxHT19CVF9SU1NJX1NUQVRFCQkJQklUMAorI2RlZmluZQkJQUxHT19XSUZJX1JTU0lfU1RBVEUJCQlCSVQxCisjZGVmaW5lCQlBTEdPX0JUX01PTklUT1IJCQkJQklUMgorI2RlZmluZQkJQUxHT19UUkFDRQkJCQlCSVQzCisjZGVmaW5lCQlBTEdPX1RSQUNFX0ZXCQkJCUJJVDQKKyNkZWZpbmUJCUFMR09fVFJBQ0VfRldfREVUQUlMCQkJQklUNQorI2RlZmluZQkJQUxHT19UUkFDRV9GV19FWEVDCQkJQklUNgorI2RlZmluZQkJQUxHT19UUkFDRV9TVwkJCQlCSVQ3CisjZGVmaW5lCQlBTEdPX1RSQUNFX1NXX0RFVEFJTAkJCUJJVDgKKyNkZWZpbmUJCUFMR09fVFJBQ0VfU1dfRVhFQwkJCUJJVDkKKworCisKKyNkZWZpbmUJQ0xfU1BSSU5URglzbnByaW50ZgorI2RlZmluZQlDTF9QUklOVEYJcHJpbnRrCisKKyNkZWZpbmUJQlRDX1BSSU5UKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyLCAuLi4pCQlcCisJZG8geyAJCQkJCQkJXAorCQlpZiAodW5saWtlbHkoYnRjX2RiZ190eXBlW2RiZ3R5cGVdICYgZGJnZmxhZykpIHtcCisJCQlwcmludGsocHJpbnRzdHIsICMjX19WQV9BUkdTX18pOwlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lCUJUQ19QUklOVF9GKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyLCAuLi4pCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICh1bmxpa2VseShidGNfZGJnX3R5cGVbZGJndHlwZV0gJiBkYmdmbGFnKSkge1wKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiwgX19mdW5jX18pOwlcCisJCQlwcmludGsocHJpbnRzdHIsICMjX19WQV9BUkdTX18pOwlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lCUJUQ19QUklOVF9BRERSKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyLCBfcHRyKQlcCisJZG8geyAJCQkJCQkJXAorCQlpZih1bmxpa2VseShidGNfZGJnX3R5cGVbZGJndHlwZV0gJiBkYmdmbGFnKSkgewlcCisJCQlpbnQgX19pOwkJCQlcCisJCQl1OCogX19wdHIgPSAodTgqKV9QdHI7CQkJXAorCQkJcHJpbnRrIHByaW50c3RyOwkJCVwKKwkJCWZvciggX19pID0gMDsgX19pIDwgNjsgX19pKysgKQkJXAorCQkJCXByaW50aygiJTAyWCVzIiwgX19wdHJbX19pXSwgKF9faT09NSk/IiI6Ii0iKTtcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsJCVwKKwkJfVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgQlRDX1BSSU5UX0RBVEEoZGJndHlwZSwgZGJnZmxhZywgX3RpdGxlc3RyaW5nLCBfaGV4ZGF0YSwgX2hleGRhdGFsZW4pIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmKHVubGlrZWx5KGJ0Y19kYmdfdHlwZVtkYmd0eXBlXSAmIGRiZ2ZsYWcpICkJeyAJXAorCQkJaW50IF9faTsJCQkJCVwKKwkJCXU4ICpfX3B0ciA9ICh1OCopX2hleGRhdGE7CQkJXAorCQkJcHJpbnRrKF90aXRsZXN0cmluZyk7CQkJCVwKKwkJCWZvciggX19pID0gMDsgX19pIDwgKGludClfaGV4ZGF0YWxlbjsgX19pKysgKSB7CVwKKwkJCQlwcmludGsoIiUwMlglcyIsIF9fcHRyW19faV0sICgoKF9faSArIDEpICUgNCkgXAorCQkJCQkJCT09IDApPyIgICI6IiAiKTtcCisJCQkJaWYgKCgoX19pICsgMSkgJSAxNikgPT0gMCkJCVwKKwkJCQkJcHJpbnRrKCJcbiIpOwkJCVwKKwkJCX0JCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsJCQlcCisJCX0gCQkJCQkJCVwKKwl9IHdoaWxlKDApCisKKworI2RlZmluZQlCVENfUlNTSV9ISUdIKF9yc3NpXykgXAorCSgoX3Jzc2lfPT1CVENfUlNTSV9TVEFURV9ISUdIIHx8IF9yc3NpXz09QlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSA/IFwKKwl0cnVlIDogZmFsc2UpCisKKyNkZWZpbmUJQlRDX1JTU0lfTUVESVVNKF9yc3NpXykJXAorCSgoX3Jzc2lfPT1CVENfUlNTSV9TVEFURV9NRURJVU0gfHwgX3Jzc2lfPT1CVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkgXAorCT8gdHJ1ZSA6IGZhbHNlKQorCisjZGVmaW5lCUJUQ19SU1NJX0xPVyhfcnNzaV8pIFwKKwkoKF9yc3NpXz09QlRDX1JTU0lfU1RBVEVfTE9XIHx8IF9yc3NpXz09QlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpID8gXAorCXRydWUgOiBmYWxzZSkKKworCitlbnVtIGJ0Y19wb3dlcl9zYXZlX3R5cGUgeworCUJUQ19QU19XSUZJX05BVElWRSA9IDAsCisJQlRDX1BTX0xQU19PTiA9IDEsCisJQlRDX1BTX0xQU19PRkYgPSAyLAorCUJUQ19QU19MUFNfTUFYCit9OworCitzdHJ1Y3QgYnRjX2JvYXJkX2luZm8geworCS8qIFRoZSBmb2xsb3dpbmcgaXMgc29tZSBib2FyZCBpbmZvcm1hdGlvbiAqLworCXU4IGJ0X2NoaXBfdHlwZTsKKwl1OCBwZ19hbnRfbnVtOwkvKiBwZyBhbnQgbnVtYmVyICovCisJdTggYnRkbV9hbnRfbnVtOwkvKiBhbnQgbnVtYmVyIGZvciBidGRtICovCisJdTggYnRkbV9hbnRfcG9zOworCWJvb2wgYnRfZXhpc3Q7Cit9OworCitlbnVtIGJ0Y19kYmdfb3Bjb2RleworCUJUQ19EQkdfU0VUX0NPRVhfTk9STUFMID0gMHgwLAorCUJUQ19EQkdfU0VUX0NPRVhfV0lGSV9PTkxZID0gMHgxLAorCUJUQ19EQkdfU0VUX0NPRVhfQlRfT05MWSA9IDB4MiwKKwlCVENfREJHX01BWAorfTsKKworZW51bSBidGNfcnNzaV9zdGF0ZXsKKwlCVENfUlNTSV9TVEFURV9ISUdIID0gMHgwLAorCUJUQ19SU1NJX1NUQVRFX01FRElVTSA9IDB4MSwKKwlCVENfUlNTSV9TVEFURV9MT1cgPSAweDIsCisJQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIID0gMHgzLAorCUJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNID0gMHg0LAorCUJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XID0gMHg1LAorCUJUQ19SU1NJX01BWAorfTsKKworZW51bSBidGNfd2lmaV9yb2xleworCUJUQ19ST0xFX1NUQVRJT04gPSAweDAsCisJQlRDX1JPTEVfQVAgPSAweDEsCisJQlRDX1JPTEVfSUJTUyA9IDB4MiwKKwlCVENfUk9MRV9IU19NT0RFID0gMHgzLAorCUJUQ19ST0xFX01BWAorfTsKKworZW51bSBidGNfd2lmaV9id19tb2RleworCUJUQ19XSUZJX0JXX0xFR0FDWSA9IDB4MCwKKwlCVENfV0lGSV9CV19IVDIwID0gMHgxLAorCUJUQ19XSUZJX0JXX0hUNDAgPSAweDIsCisJQlRDX1dJRklfQldfTUFYCit9OworCitlbnVtIGJ0Y193aWZpX3RyYWZmaWNfZGlyeworCUJUQ19XSUZJX1RSQUZGSUNfVFggPSAweDAsCisJQlRDX1dJRklfVFJBRkZJQ19SWCA9IDB4MSwKKwlCVENfV0lGSV9UUkFGRklDX01BWAorfTsKKworZW51bSBidGNfd2lmaV9wbnB7CisJQlRDX1dJRklfUE5QX1dBS0VfVVAgPSAweDAsCisJQlRDX1dJRklfUE5QX1NMRUVQID0gMHgxLAorCUJUQ19XSUZJX1BOUF9NQVgKK307CisKKworZW51bSBidGNfZ2V0X3R5cGV7CisJLyogdHlwZSBib29sICovCisJQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sCisJQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLAorCUJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsCisJQlRDX0dFVF9CTF9XSUZJX0JVU1ksCisJQlRDX0dFVF9CTF9XSUZJX1NDQU4sCisJQlRDX0dFVF9CTF9XSUZJX0xJTkssCisJQlRDX0dFVF9CTF9XSUZJX0RIQ1AsCisJQlRDX0dFVF9CTF9XSUZJX1NPRlRBUF9JRExFLAorCUJUQ19HRVRfQkxfV0lGSV9TT0ZUQVBfTElOS0lORywKKwlCVENfR0VUX0JMX1dJRklfSU5fRUFSTFlfU1VTUEVORCwKKwlCVENfR0VUX0JMX1dJRklfUk9BTSwKKwlCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1MsCisJQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLAorCUJUQ19HRVRfQkxfV0lGSV9BUF9NT0RFX0VOQUJMRSwKKwlCVENfR0VUX0JMX1dJRklfRU5BQkxFX0VOQ1JZUFRJT04sCisJQlRDX0dFVF9CTF9XSUZJX1VOREVSX0JfTU9ERSwKKwlCVENfR0VUX0JMX0VYVF9TV0lUQ0gsCisKKwkvKiB0eXBlIHM0Qnl0ZSAqLworCUJUQ19HRVRfUzRfV0lGSV9SU1NJLAorCUJUQ19HRVRfUzRfSFNfUlNTSSwKKworCS8qIHR5cGUgdTMyICovCisJQlRDX0dFVF9VNF9XSUZJX0JXLAorCUJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwKKwlCVENfR0VUX1U0X1dJRklfRldfVkVSLAorCUJUQ19HRVRfVTRfQlRfUEFUQ0hfVkVSLAorCisJLyogdHlwZSB1MUJ5dGUgKi8KKwlCVENfR0VUX1UxX1dJRklfRE9UMTFfQ0hOTCwKKwlCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLAorCUJUQ19HRVRfVTFfV0lGSV9IU19DSE5MLAorCUJUQ19HRVRfVTFfTUFDX1BIWV9NT0RFLAorCUJUQ19HRVRfVTFfQVBfTlVNLAorCisJLyogZm9yIDFBbnQgKi8KKwlCVENfR0VUX1UxX0xQU19NT0RFLAorCUJUQ19HRVRfQkxfQlRfU0NPX0JVU1ksCisKKwkvKiBmb3IgdGVzdCBtb2RlICovCisJQlRDX0dFVF9EUklWRVJfVEVTVF9DRkcsCisjaWYgMAorCUJUQ19HRVRfVTFfTFBTLAorCUJUQ19HRVRfVTFfUlBXTSwKKyNlbmRpZgorCUJUQ19HRVRfTUFYCit9OworCisKK2VudW0gYnRjX3NldF90eXBleworCS8qIHR5cGUgYm9vbCAqLworCUJUQ19TRVRfQkxfQlRfRElTQUJMRSwKKwlCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwKKwlCVENfU0VUX0JMX0JUX0xJTUlURURfRElHLAorCUJUQ19TRVRfQkxfRk9SQ0VfVE9fUk9BTSwKKwlCVENfU0VUX0JMX1RPX1JFSl9BUF9BR0dfUEtULAorCUJUQ19TRVRfQkxfQlRfQ1RSTF9BR0dfU0laRSwKKwlCVENfU0VUX0JMX0lOQ19TQ0FOX0RFVl9OVU0sCisKKwkvKiB0eXBlIHUxQnl0ZSAqLworCUJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sCisJQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SXzFBTlRfQ09FWF9UWVBFLAorCUJUQ19TRVRfVUlfU0NBTl9TSUdfQ09NUEVOU0FUSU9OLAorCUJUQ19TRVRfVTFfQUdHX0JVRl9TSVpFLAorCisJLyogdHlwZSB0cmlnZ2VyIHNvbWUgYWN0aW9uICovCisJQlRDX1NFVF9BQ1RfR0VUX0JUX1JTU0ksCisJQlRDX1NFVF9BQ1RfQUdHUkVHQVRFX0NUUkwsCisKKwkvKioqKioqKioqIGZvciAxQW50ICoqKioqKioqKiovCisJLyogdHlwZSBib29sICovCisJQlRDX1NFVF9CTF9CVF9TQ09fQlVTWSwKKwkvKiB0eXBlIHUxQnl0ZSAqLworCUJUQ19TRVRfVTFfMUFOVF9MUFMsCisJQlRDX1NFVF9VMV8xQU5UX1JQV00sCisJLyogdHlwZSB0cmlnZ2VyIHNvbWUgYWN0aW9uICovCisJQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLAorCUJUQ19TRVRfQUNUX0VOVEVSX0xQUywKKwlCVENfU0VUX0FDVF9OT1JNQUxfTFBTLAorCUJUQ19TRVRfQUNUX0lOQ19GT1JDRV9FWEVDX1BXUl9DTURfQ05ULAorCUJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLAorCUJUQ19TRVRfQUNUX1VQREFURV9yYV9tYXNrLAorCUJUQ19TRVRfQUNUX1NFTkRfTUlNT19QUywKKwkvKiBCVCBDb2V4IHJlbGF0ZWQgKi8KKwlCVENfU0VUX0FDVF9DVFJMX0JUX0lORk8sCisJQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLAorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQlRDX1NFVF9NQVgKK307CisKK2VudW0gYnRjX2RiZ19kaXNwX3R5cGV7CisJQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyA9IDB4MCwKKwlCVENfREJHX0RJU1BfQlRfTElOS19JTkZPID0gMHgxLAorCUJUQ19EQkdfRElTUF9CVF9GV19WRVIgPSAweDIsCisJQlRDX0RCR19ESVNQX0ZXX1BXUl9NT0RFX0NNRCA9IDB4MywKKwlCVENfREJHX0RJU1BfTUFYCit9OworCitlbnVtIGJ0Y19ub3RpZnlfdHlwZV9pcHN7CisJQlRDX0lQU19MRUFWRSA9IDB4MCwKKwlCVENfSVBTX0VOVEVSID0gMHgxLAorCUJUQ19JUFNfTUFYCit9OworCitlbnVtIGJ0Y19ub3RpZnlfdHlwZV9scHN7CisJQlRDX0xQU19ESVNBQkxFID0gMHgwLAorCUJUQ19MUFNfRU5BQkxFID0gMHgxLAorCUJUQ19MUFNfTUFYCit9OworCitlbnVtIGJ0Y19ub3RpZnlfdHlwZV9zY2FueworCUJUQ19TQ0FOX0ZJTklTSCA9IDB4MCwKKwlCVENfU0NBTl9TVEFSVCA9IDB4MSwKKwlCVENfU0NBTl9NQVgKK307CisKK2VudW0gYnRjX25vdGlmeV90eXBlX2Fzc29jaWF0ZXsKKwlCVENfQVNTT0NJQVRFX0ZJTklTSCA9IDB4MCwKKwlCVENfQVNTT0NJQVRFX1NUQVJUID0gMHgxLAorCUJUQ19BU1NPQ0lBVEVfTUFYCit9OworCitlbnVtIGJ0Y19ub3RpZnlfdHlwZV9tZWRpYV9zdGF0dXN7CisJQlRDX01FRElBX0RJU0NPTk5FQ1QgPSAweDAsCisJQlRDX01FRElBX0NPTk5FQ1QgPSAweDEsCisJQlRDX01FRElBX01BWAorfTsKKworZW51bSBidGNfbm90aWZ5X3R5cGVfc3BlY2lhbF9wYWNrZXR7CisJQlRDX1BBQ0tFVF9VTktOT1dOID0gMHgwLAorCUJUQ19QQUNLRVRfREhDUCA9IDB4MSwKKwlCVENfUEFDS0VUX0FSUCA9IDB4MiwKKwlCVENfUEFDS0VUX0VBUE9MID0gMHgzLAorCUJUQ19QQUNLRVRfTUFYCit9OworCitlbnVtIGJ0Y19ub3RpZnlfdHlwZV9zdGFja19vcGVyYXRpb257CisJQlRDX1NUQUNLX09QX05PTkUgPSAweDAsCisJQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfU1RBUlQgPSAweDEsCisJQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfRklOSVNIID0gMHgyLAorCUJUQ19TVEFDS19PUF9NQVgKK307CisKKwordHlwZWRlZiB1OCAoKmJmcF9idGNfcjEpKHZvaWQgKmJ0Y19jb250ZXh0LCB1MzIgcmVnX2FkZHIpOworCit0eXBlZGVmIHUxNiAoKmJmcF9idGNfcjIpKHZvaWQgKmJ0Y19jb250ZXh0LCB1MzIgcmVnX2FkZHIpOworCit0eXBlZGVmIHUzMiAoKmJmcF9idGNfcjQpKHZvaWQgKmJ0Y19jb250ZXh0LCB1MzIgcmVnX2FkZHIpOworCit0eXBlZGVmIHZvaWQgKCpiZnBfYnRjX3cxKSh2b2lkICpidGNfY29udGV4dCwgdTMyIHJlZ19hZGRyLCB1OCBkYXRhKTsKKwordHlwZWRlZiB2b2lkICgqYmZwX2J0Y193MV9iaXRfbWFrKSh2b2lkICpidGNfY29udGV4dCwgdTMyIHJlZ19hZGRyLAorCQkJCSAgIHU4IGJpdF9tYXNrLCB1OCBkYXRhMWIpOworCit0eXBlZGVmIHZvaWQgKCpiZnBfYnRjX3cyKSh2b2lkICpidGNfY29udGV4dCwgdTMyIHJlZ19hZGRyLCB1MTYgZGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoKmJmcF9idGNfdzQpKHZvaWQgKmJ0Y19jb250ZXh0LCB1MzIgcmVnX2FkZHIsIHUzMiBkYXRhKTsKKwordHlwZWRlZiB2b2lkICgqYmZwX2J0Y193cl8xYnl0ZV9iaXRfbWFzaykodm9pZCAqYnRjX2NvbnRleHQsIHUzMiByZWdfYWRkciwKKwkJCQkJICB1OCBiaXRfbWFzaywgdTggZGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoKmJmcF9idGNfc2V0X2JiX3JlZykodm9pZCAqYnRjX2NvbnRleHQsIHUzMiByZWdfYWRkciwKKwkJCQkgICB1MzIgYml0X21hc2ssIHUzMiBkYXRhKTsKKwordHlwZWRlZiB1MzIgKCpiZnBfYnRjX2dldF9iYl9yZWcpKHZvaWQgKmJ0Y19jb250ZXh0LCB1MzIgcmVnX2FkZHIsCisJCQkJICB1MzIgYml0X21hc2spOworCit0eXBlZGVmIHZvaWQgKCpiZnBfYnRjX3NldF9yZl9yZWcpKHZvaWQgKmJ0Y19jb250ZXh0LCB1OCByZl9wYXRoLCB1MzIgcmVnX2FkZHIsCisJCQkJICAgdTMyIGJpdF9tYXNrLCB1MzIgZGF0YSk7CisKK3R5cGVkZWYgdTMyICgqYmZwX2J0Y19nZXRfcmZfcmVnKSh2b2lkICpidGNfY29udGV4dCwgdTggcmZfcGF0aCwKKwkJCQkgIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrKTsKKwordHlwZWRlZiB2b2lkICgqYmZwX2J0Y19maWxsX2gyYykodm9pZCAqYnRjX2NvbnRleHQsIHU4IGVsZW1lbnRfaWQsCisJCQkJIHUzMiBjbWRfbGVuLCB1OCAqY21kX2J1ZmZlcik7CisKK3R5cGVkZWYJYm9vbCAoKmJmcF9idGNfZ2V0KSh2b2lkICpidGNvZXhpc3QsIHU4IGdldF90eXBlLCB2b2lkICpvdXRfYnVmKTsKKwordHlwZWRlZglib29sICgqYmZwX2J0Y19zZXQpKHZvaWQgKmJ0Y29leGlzdCwgdTggc2V0X3R5cGUsIHZvaWQgKmluX2J1Zik7CisKK3R5cGVkZWYgdm9pZCAoKmJmcF9idGNfZGlzcF9kYmdfbXNnKSh2b2lkICpidGNvZXhpc3QsIHU4IGRpc3BfdHlwZSk7CisKK3N0cnVjdCBidGNfYnRfaW5mbyB7CisJYm9vbCBidF9kaXNhYmxlZDsKKwl1OCByc3NpX2FkanVzdF9mb3JfYWdjX3RhYmxlX29uOworCXU4IHJzc2lfYWRqdXN0X2Zvcl8xYW50X2NvZXhfdHlwZTsKKwlib29sIGJ0X2J1c3k7CisJdTggYWdnX2J1Zl9zaXplOworCWJvb2wgbGltaXRlZF9kaWc7CisJYm9vbCByZWplY3RfYWdnX3BrdDsKKwlib29sIGJfYnRfY3RybF9idWZfc2l6ZTsKKwlib29sIGluY3JlYXNlX3NjYW5fZGV2X251bTsKKwl1MTYgYnRfaGNpX3ZlcjsKKwl1MTYgYnRfcmVhbF9md192ZXI7CisJdTggYnRfZndfdmVyOworCisJLyogdGhlIGZvbGxvd2luZyBpcyBmb3IgMUFudCBzb2x1dGlvbiAqLworCWJvb2wgYnRfY3RybF9scHM7CisJYm9vbCBidF9wd3Jfc2F2ZV9tb2RlOworCWJvb2wgYnRfbHBzX29uOworCWJvb2wgZm9yY2VfdG9fcm9hbTsKKwl1OCBmb3JjZV9leGVjX3B3cl9jbWRfY250OworCXU4IGxwc18xYW50OworCXU4IHJwd21fMWFudDsKKwl1MzIgcmFfbWFzazsKK307CisKK3N0cnVjdCBidGNfc3RhY2tfaW5mbyB7CisJYm9vbCBwcm9maWxlX25vdGlmaWVkOworCXUxNiBoY2lfdmVyc2lvbjsJLyogc3RhY2sgaGNpIHZlcnNpb24gKi8KKwl1OCBudW1fb2ZfbGluazsKKwlib29sIGJ0X2xpbmtfZXhpc3Q7CisJYm9vbCBzY29fZXhpc3Q7CisJYm9vbCBhY2xfZXhpc3Q7CisJYm9vbCBhMmRwX2V4aXN0OworCWJvb2wgaGlkX2V4aXN0OworCXU4IG51bV9vZl9oaWQ7CisJYm9vbCBwYW5fZXhpc3Q7CisJYm9vbCB1bmtub3duX2FjbF9leGlzdDsKKwljaGFyIG1pbl9idF9yc3NpOworfTsKKworc3RydWN0IGJ0Y19zdGF0aXN0aWNzIHsKKwl1MzIgY250X2JpbmQ7CisJdTMyIGNudF9pbml0X2h3X2NvbmZpZzsKKwl1MzIgY250X2luaXRfY29leF9kbTsKKwl1MzIgY250X2lwc19ub3RpZnk7CisJdTMyIGNudF9scHNfbm90aWZ5OworCXUzMiBjbnRfc2Nhbl9ub3RpZnk7CisJdTMyIGNudF9jb25uZWN0X25vdGlmeTsKKwl1MzIgY250X21lZGlhX3N0YXR1c19ub3RpZnk7CisJdTMyIGNudF9zcGVjaWFsX3BhY2tldF9ub3RpZnk7CisJdTMyIGNudF9idF9pbmZvX25vdGlmeTsKKwl1MzIgY250X3BlcmlvZGljYWw7CisJdTMyIGNudF9zdGFja19vcGVyYXRpb25fbm90aWZ5OworCXUzMiBjbnRfZGJnX2N0cmw7Cit9OworCitzdHJ1Y3QgYnRjX2J0X2xpbmtfaW5mbyB7CisJYm9vbCBidF9saW5rX2V4aXN0OworCWJvb2wgc2NvX2V4aXN0OworCWJvb2wgc2NvX29ubHk7CisJYm9vbCBhMmRwX2V4aXN0OworCWJvb2wgYTJkcF9vbmx5OworCWJvb2wgaGlkX2V4aXN0OworCWJvb2wgaGlkX29ubHk7CisJYm9vbCBwYW5fZXhpc3Q7CisJYm9vbCBwYW5fb25seTsKK307CisKK2VudW0gYnRjX2FudGVubmFfcG9zIHsKKwlCVENfQU5URU5OQV9BVF9NQUlOX1BPUlQgPSAweDEsCisJQlRDX0FOVEVOTkFfQVRfQVVYX1BPUlQgPSAweDIsCit9OworCitzdHJ1Y3QgYnRjX2NvZXhpc3QgeworCS8qIG1ha2Ugc3VyZSBvbmx5IG9uZSBhZGFwdGVyIGNhbiBiaW5kIHRoZSBkYXRhIGNvbnRleHQgICovCisJYm9vbCBiaW5kZWQ7CisJLyogZGVmYXVsdCBhZGFwdGVyICovCisJdm9pZCAqYWRhcHRlcjsKKwlzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gYm9hcmRfaW5mbzsKKwkvKiBzb21lIGJ0IGluZm8gcmVmZXJlbmNlZCBieSBub24tYnQgbW9kdWxlICovCisJc3RydWN0IGJ0Y19idF9pbmZvIGJ0X2luZm87CisJc3RydWN0IGJ0Y19zdGFja19pbmZvIHN0YWNrX2luZm87CisJZW51bSBidGNfY2hpcF9pbnRlcmZhY2UJY2hpcF9pbnRlcmZhY2U7CisJc3RydWN0IGJ0Y19idF9saW5rX2luZm8gYnRfbGlua19pbmZvOworCisJYm9vbCBpbml0aWxpemVkOworCWJvb2wgc3RvcF9jb2V4X2RtOworCWJvb2wgbWFudWFsX2NvbnRyb2w7CisJdTggKmNsaV9idWY7CisJc3RydWN0IGJ0Y19zdGF0aXN0aWNzIHN0YXRpc3RpY3M7CisJdTggcHdyX21vZGVfdmFsWzEwXTsKKworCS8qIGZ1bmN0aW9uIHBvaW50ZXJzCisJICogaW8gcmVsYXRlZCAqLworCWJmcF9idGNfcjEgYnRjX3JlYWRfMWJ5dGU7CisJYmZwX2J0Y193MSBidGNfd3JpdGVfMWJ5dGU7CisJYmZwX2J0Y193MV9iaXRfbWFrIGJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrOworCWJmcF9idGNfcjIgYnRjX3JlYWRfMmJ5dGU7CisJYmZwX2J0Y193MiBidGNfd3JpdGVfMmJ5dGU7CisJYmZwX2J0Y19yNCBidGNfcmVhZF80Ynl0ZTsKKwliZnBfYnRjX3c0IGJ0Y193cml0ZV80Ynl0ZTsKKworCWJmcF9idGNfc2V0X2JiX3JlZyBidGNfc2V0X2JiX3JlZzsKKwliZnBfYnRjX2dldF9iYl9yZWcgYnRjX2dldF9iYl9yZWc7CisKKworCWJmcF9idGNfc2V0X3JmX3JlZyBidGNfc2V0X3JmX3JlZzsKKwliZnBfYnRjX2dldF9yZl9yZWcgYnRjX2dldF9yZl9yZWc7CisKKworCWJmcF9idGNfZmlsbF9oMmMgYnRjX2ZpbGxfaDJjOworCisJYmZwX2J0Y19kaXNwX2RiZ19tc2cgYnRjX2Rpc3BfZGJnX21zZzsKKworCWJmcF9idGNfZ2V0IGJ0Y19nZXQ7CisJYmZwX2J0Y19zZXQgYnRjX3NldDsKK307CisKK2Jvb2wgaGFsYnRjX2lzX3dpZmlfdXBsaW5rKHN0cnVjdCBydGxfcHJpdiAqYWRhcHRlcik7CisKKworZXh0ZXJuIHN0cnVjdCBidGNfY29leGlzdCBnbF9idF9jb2V4aXN0OworCitib29sIGV4aGFsYnRjX2luaXRsaXplX3ZhcmlhYmxlcyhzdHJ1Y3QgcnRsX3ByaXYqIGFkYXB0ZXIpOwordm9pZCBleGhhbGJ0Y19pbml0X2h3X2NvbmZpZyhzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4aGFsYnRjX2luaXRfY29leF9kbShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCk7Cit2b2lkIGV4aGFsYnRjX2lwc19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleGhhbGJ0Y19scHNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKTsKK3ZvaWQgZXhoYWxidGNfc2Nhbl9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHR5cGUpOwordm9pZCBleGhhbGJ0Y19jb25uZWN0X25vdGlmeShzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwgdTggYWN0aW9uKTsKK3ZvaWQgZXhoYWxidGNfbWVkaWFzdGF0dXNfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LAorCQkJCSBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtZWRpYV9zdGF0dXMpOwordm9pZCBleGhhbGJ0Y19zcGVjaWFsX3BhY2tldF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IHBrdF90eXBlKTsKK3ZvaWQgZXhoYWxidGNfYnRfaW5mb19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4ICp0bXBfYnVmLAorCQkJICAgICB1OCBsZW5ndGgpOwordm9pZCBleGhhbGJ0Y19zdGFja19vcGVyYXRpb25fbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCB0eXBlKTsKK3ZvaWQgZXhoYWxidGNfaGFsdF9ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpOwordm9pZCBleGhhbGJ0Y19wbnBfbm90aWZ5KHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0LCB1OCBwbnBfc3RhdGUpOwordm9pZCBleGhhbGJ0Y19wZXJpb2RpY2FsKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhoYWxidGNfZGJnX2NvbnRyb2woc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QsIHU4IGNvZGUsIHU4IGxlbiwKKwkJCSAgdTggKmRhdGEpOwordm9pZCBleGhhbGJ0Y19zdGFja191cGRhdGVfcHJvZmlsZV9pbmZvKHZvaWQpOwordm9pZCBleGhhbGJ0Y19zZXRfaGNpX3ZlcnNpb24odTE2IGhjaV92ZXJzaW9uKTsKK3ZvaWQgZXhoYWxidGNfc2V0X2J0X3BhdGNoX3ZlcnNpb24odTE2IGJ0X2hjaV92ZXJzaW9uLCB1MTYgYnRfcGF0Y2hfdmVyc2lvbik7Cit2b2lkIGV4aGFsYnRjX3VwZGF0ZV9taW5fYnRfcnNzaShjaGFyIGJ0X3Jzc2kpOwordm9pZCBleGhhbGJ0Y19zZXRfYnRfZXhpc3QoYm9vbCBidF9leGlzdCk7Cit2b2lkIGV4aGFsYnRjX3NldF9jaGlwX3R5cGUodTggY2hpcF90eXBlKTsKK3ZvaWQgZXhoYWxidGNfc2V0X2FudF9udW0odTggdHlwZSwgdTggYW50X251bSk7Cit2b2lkIGV4aGFsYnRjX2Rpc3BsYXlfYnRfY29leF9pbmZvKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhoYWxidGNfc2lnbmFsX2NvbXBlbnNhdGlvbihzdHJ1Y3QgYnRjX2NvZXhpc3QgKmJ0Y29leGlzdCwKKwkJCQkgIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KTsKK3ZvaWQgZXhoYWxidGNfbHBzX2xlYXZlKHN0cnVjdCBidGNfY29leGlzdCAqYnRjb2V4aXN0KTsKK3ZvaWQgZXhoYWxidGNfbG93X3dpZmlfdHJhZmZpY19ub3RpZnkoc3RydWN0IGJ0Y19jb2V4aXN0ICpidGNvZXhpc3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9ydGxfYnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9ydGxfYnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1M2YxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L3J0bF9idGMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAicnRsX2J0Yy5oIgorI2luY2x1ZGUgImhhbGJ0X3ByZWNvbXAuaCIKKworc3RydWN0IHJ0bF9idGNfb3BzIHJ0bF9idGNfb3BlcmF0aW9uID17CisJLmJ0Y19pbml0X3ZhcmlhYmxlcyA9IHJ0bF9idGNfaW5pdF92YXJpYWJsZXMsCisJLmJ0Y19pbml0X2hhbF92YXJzID0gcnRsX2J0Y19pbml0X2hhbF92YXJzLAorCS5idGNfaW5pdF9od19jb25maWcgPSBydGxfYnRjX2luaXRfaHdfY29uZmlnLAorCS5idGNfaXBzX25vdGlmeSA9IHJ0bF9idGNfaXBzX25vdGlmeSwKKwkuYnRjX3NjYW5fbm90aWZ5ID0gcnRsX2J0Y19zY2FuX25vdGlmeSwKKwkuYnRjX2Nvbm5lY3Rfbm90aWZ5ID0gcnRsX2J0Y19jb25uZWN0X25vdGlmeSwKKwkuYnRjX21lZGlhc3RhdHVzX25vdGlmeSA9IHJ0bF9idGNfbWVkaWFzdGF0dXNfbm90aWZ5LAorCS5idGNfcGVyaW9kaWNhbCA9IHJ0bF9idGNfcGVyaW9kaWNhbCwKKwkuYnRjX2hhbHRfbm90aWZ5ID0gcnRsX2J0Y19oYWx0X25vdGlmeSwKKwkuYnRjX2J0aW5mb19ub3RpZnkgPSBydGxfYnRjX2J0aW5mb19ub3RpZnksCisJLmJ0Y19pc19saW1pdGVkX2RpZyA9IHJ0bF9idGNfaXNfbGltaXRlZF9kaWcsCisJLmJ0Y19pc19kaXNhYmxlX2VkY2FfdHVyYm8gPSBydGxfYnRjX2lzX2Rpc2FibGVfZWRjYV90dXJibywKKwkuYnRjX2lzX2J0X2Rpc2FibGVkID0gcnRsX2J0Y19pc19idF9kaXNhYmxlZCwKK307CisKKwordm9pZCBydGxfYnRjX2luaXRfdmFyaWFibGVzKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdikKK3sKKworCWV4aGFsYnRjX2luaXRsaXplX3ZhcmlhYmxlcyhydGxwcml2KTsKK30KKwordm9pZCBydGxfYnRjX2luaXRfaGFsX3ZhcnMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KQoreworCXU4IGFudF9udW07CisJdTggYnRfZXhpc3Q7CisJdTggYnRfdHlwZTsKKwlhbnRfbnVtID0gcnRsX2dldF9od3BnX2FudF9udW0ocnRscHJpdik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csICgiJXMsIGFudE51bSBpcyAlZFxuIiwgX19mdW5jX18sIGFudF9udW0pKTsKKworCWJ0X2V4aXN0ID0gcnRsX2dldF9od3BnX2J0X2V4aXN0KHJ0bHByaXYpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0RNRVNHLCAoIiVzLCBidF9leGlzdCBpcyAlZFxuIiwgX19mdW5jX18sIGJ0X2V4aXN0KSk7CisJZXhoYWxidGNfc2V0X2J0X2V4aXN0KGJ0X2V4aXN0KTsKKworCWJ0X3R5cGUgPSBydGxfZ2V0X2h3cGdfYnRfdHlwZShydGxwcml2KTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywgKCIlcywgYnRfdHlwZSBpcyAlZFxuIiwgX19mdW5jX18sIGJ0X3R5cGUpKTsKKwlleGhhbGJ0Y19zZXRfY2hpcF90eXBlKGJ0X3R5cGUpOworCisJZXhoYWxidGNfc2V0X2FudF9udW0oQlRfQ09FWF9BTlRfVFlQRV9QRywgYW50X251bSk7CisKK30KKworCit2b2lkIHJ0bF9idGNfaW5pdF9od19jb25maWcoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KQoreworCWV4aGFsYnRjX2luaXRfaHdfY29uZmlnKCZnbF9idF9jb2V4aXN0KTsKKwlleGhhbGJ0Y19pbml0X2NvZXhfZG0oJmdsX2J0X2NvZXhpc3QpOworfQorCisKK3ZvaWQgcnRsX2J0Y19pcHNfbm90aWZ5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggdHlwZSkKK3sKKwlleGhhbGJ0Y19pcHNfbm90aWZ5KCZnbF9idF9jb2V4aXN0LCB0eXBlKTsKK30KKworCit2b2lkIHJ0bF9idGNfc2Nhbl9ub3RpZnkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBzY2FudHlwZSkKK3sKKwlleGhhbGJ0Y19zY2FuX25vdGlmeSgmZ2xfYnRfY29leGlzdCwgc2NhbnR5cGUpOworfQorCisKK3ZvaWQgcnRsX2J0Y19jb25uZWN0X25vdGlmeShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IGFjdGlvbikKK3sKKwlleGhhbGJ0Y19jb25uZWN0X25vdGlmeSgmZ2xfYnRfY29leGlzdCwgYWN0aW9uKTsKK30KKworCit2b2lkIHJ0bF9idGNfbWVkaWFzdGF0dXNfbm90aWZ5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKK3sKKwlleGhhbGJ0Y19tZWRpYXN0YXR1c19ub3RpZnkoJmdsX2J0X2NvZXhpc3QsIG1zdGF0dXMpOworfQorCit2b2lkIHJ0bF9idGNfcGVyaW9kaWNhbChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisvLwlydGxfYnRfZG1fbW9uaXRvcigpOworCWV4aGFsYnRjX3BlcmlvZGljYWwoJmdsX2J0X2NvZXhpc3QpOworfQorCit2b2lkIHJ0bF9idGNfaGFsdF9ub3RpZnkodm9pZCkKK3sKKwlleGhhbGJ0Y19oYWx0X25vdGlmeSgmZ2xfYnRfY29leGlzdCk7Cit9CisKK3ZvaWQgcnRsX2J0Y19idGluZm9fbm90aWZ5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggKiB0bXBfYnVmLCB1OCBsZW5ndGgpCit7CisJZXhoYWxidGNfYnRfaW5mb19ub3RpZnkoJmdsX2J0X2NvZXhpc3QsIHRtcF9idWYsIGxlbmd0aCk7Cit9CisKK2Jvb2wgcnRsX2J0Y19pc19saW1pdGVkX2RpZyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJcmV0dXJuIGdsX2J0X2NvZXhpc3QuYnRfaW5mby5saW1pdGVkX2RpZzsKK30KKworYm9vbCBydGxfYnRjX2lzX2Rpc2FibGVfZWRjYV90dXJibyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJYm9vbCBidF9jaGFuZ2VfZWRjYSA9IGZhbHNlOworCXUzMiBjdXJfZWRjYV92YWw7CisJdTMyIGVkY2FfYnRfaHNfdXBsaW5rID0gMHg1ZWE0MmIsIGVkY2FfYnRfaHNfZG93bmxpbmsgPSAweDVlYTQyYjsKKwl1MzIgZWRjYV9oczsKKwl1MzIgZWRjYV9hZGRyID0gMHg1MDQ7CisKKwljdXJfZWRjYV92YWwgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBlZGNhX2FkZHIpOworCWlmIChoYWxidGNfaXNfd2lmaV91cGxpbmsocnRscHJpdikpeworCQlpZiAoY3VyX2VkY2FfdmFsICE9IGVkY2FfYnRfaHNfdXBsaW5rKXsKKwkJCWVkY2FfaHMgPSBlZGNhX2J0X2hzX3VwbGluazsKKwkJCWJ0X2NoYW5nZV9lZGNhID0gdHJ1ZTsKKwkJfQorCX1lbHNleworCQlpZiAoY3VyX2VkY2FfdmFsICE9IGVkY2FfYnRfaHNfZG93bmxpbmspeworCQkJZWRjYV9ocyA9IGVkY2FfYnRfaHNfZG93bmxpbms7CisJCQlidF9jaGFuZ2VfZWRjYSA9IHRydWU7CisJCX0KKwl9CisKKwlpZihidF9jaGFuZ2VfZWRjYSkKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIGVkY2FfYWRkciwgZWRjYV9ocyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBydGxfYnRjX2lzX2J0X2Rpc2FibGVkKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdikKK3sKKwlpZiAoZ2xfYnRfY29leGlzdC5idF9pbmZvLmJ0X2Rpc2FibGVkKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IHJ0bF9idGNfb3BzICpydGxfYnRjX2dldF9vcHNfcG9pbnRlcih2b2lkKQoreworCXJldHVybiAmcnRsX2J0Y19vcGVyYXRpb247Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX2J0Y19nZXRfb3BzX3BvaW50ZXIpOworCit1OCBydGxfZ2V0X2h3cGdfYW50X251bShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJdTggbnVtOworCisJaWYgKHJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5hbnRfbnVtID09IEFOVF9YMikKKwkJbnVtID0gMjsKKwllbHNlCisJCW51bSA9IDE7CisKKwlyZXR1cm4gbnVtOworfQorCisjaWYgMAorZW51bSBydF9tZWRpYV9zdGF0dXMgbWdudF9saW5rX3N0YXR1c19xdWVyeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisgICAgc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKyAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyAgICBtX3N0YXR1cyA9IFJUX01FRElBX0RJU0NPTk5FQ1Q7CisKKyAgICB1OCBiaWJzcyA9IChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgPyAxIDogMDsKKworICAgIGlmKGJpYnNzIHx8IHJ0bHByaXYtPm1hYzgwMjExLmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSB7CisgICAgICAgICAgICBtX3N0YXR1cyA9IFJUX01FRElBX0NPTk5FQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIG1fc3RhdHVzOworfQorI2VuZGlmCisKK3U4IHJ0bF9nZXRfaHdwZ19idF9leGlzdChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJcmV0dXJuIHJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5idGNvZXhpc3Q7Cit9CisKK3U4IHJ0bF9nZXRfaHdwZ19idF90eXBlKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdikKK3sKKwlyZXR1cm4gcnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19pbmZvLmJ0X3R5cGU7Cit9CisKKworI2lmIDAKKworTU9EVUxFX0FVVEhPUigiUGFnZSBIZQk8cGFnZV9oZUByZWFsc2lsLmNvbS5jbj4iKTsKK01PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgV2xhbkZBRQk8d2xhbmZhZUByZWFsdGVrLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkxhcnJ5IEZpbmdlcgk8TGFycnkuRkluZ2VyQGx3ZmluZ2VyLm5ldD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbHRlayA4MDIuMTFuIFBDSSB3aXJlbGVzcyBjb3JlIik7CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0bF9idGNvZXhpc3RfbW9kdWxlX2luaXQodm9pZCkKK3sKKworCS8vcHJpbnRrKCIlcywgcnRscHJpdi0+YnRjX29wcy5idGNfaW5pdF92YXJpYWJsZXMgYWRkciBpcyAlcFxuIiwgX19mdW5jX18sIHJ0bHByaXYtPmJ0Y19vcHMuYnRjX2luaXRfdmFyaWFibGVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRsX2J0Y29leGlzdF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQocnRsX2J0Y29leGlzdF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChydGxfYnRjb2V4aXN0X21vZHVsZV9leGl0KTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L3J0bF9idGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L3J0bF9idGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJmYmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvcnRsX2J0Yy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVExfQlRDX0hfXworI2RlZmluZSBfX1JUTF9CVENfSF9fCisKKyNpbmNsdWRlICJoYWxidF9wcmVjb21wLmgiCisKKworCit2b2lkIHJ0bF9idGNfaW5pdF92YXJpYWJsZXMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKK3ZvaWQgcnRsX2J0Y19pbml0X2hhbF92YXJzKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Cit2b2lkIHJ0bF9idGNfaW5pdF9od19jb25maWcoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKK3ZvaWQgcnRsX2J0Y19pcHNfbm90aWZ5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggdHlwZSk7Cit2b2lkIHJ0bF9idGNfc2Nhbl9ub3RpZnkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBzY2FudHlwZSk7Cit2b2lkIHJ0bF9idGNfY29ubmVjdF9ub3RpZnkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBhY3Rpb24pOwordm9pZCBydGxfYnRjX21lZGlhc3RhdHVzX25vdGlmeShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIGVudW0gcnRfbWVkaWFfc3RhdHVzIG1zdGF0dXMpOwordm9pZCBydGxfYnRjX3BlcmlvZGljYWwoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKK3ZvaWQgcnRsX2J0Y19oYWx0X25vdGlmeSh2b2lkKTsKK3ZvaWQgcnRsX2J0Y19idGluZm9fbm90aWZ5KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggKiB0bXBCdWYsIHU4IGxlbmd0aCk7Citib29sIHJ0bF9idGNfaXNfbGltaXRlZF9kaWcoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKK2Jvb2wgcnRsX2J0Y19pc19kaXNhYmxlX2VkY2FfdHVyYm8oc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKK2Jvb2wgcnRsX2J0Y19pc19idF9kaXNhYmxlZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCisKKy8vZXh0ZXJuIHN0cnVjdCBydGxfYnRjX29wcyBydGxfYnRjX29wZXJhdGlvbjsKK2V4dGVybiBzdHJ1Y3QgcnRsX2J0Y19vcHMgKnJ0bF9idGNfZ2V0X29wc19wb2ludGVyKHZvaWQpOworCit1OCBydGxfZ2V0X2h3cGdfYW50X251bShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwordTggcnRsX2dldF9od3BnX2J0X2V4aXN0KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Cit1OCBydGxfZ2V0X2h3cGdfYnRfdHlwZShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworLy9lbnVtIHJ0X21lZGlhX3N0YXR1cyBtZ250X2xpbmtfc3RhdHVzX3F1ZXJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworCisKKworCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY2FtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzQzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NhbS5jCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ3aWZpLmgiCisjaW5jbHVkZSAiY2FtLmgiCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDIsMCkpCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjZW5kaWYKKwordm9pZCBydGxfY2FtX3Jlc2V0X3NlY19pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCXJ0bHByaXYtPnNlYy51c2VfZGVmYXVsdGtleSA9IGZhbHNlOworCXJ0bHByaXYtPnNlYy5wYWlyd2lzZV9lbmNfYWxnb3JpdGhtID0gTk9fRU5DUllQVElPTjsKKwlydGxwcml2LT5zZWMuZ3JvdXBfZW5jX2FsZ29yaXRobSA9IE5PX0VOQ1JZUFRJT047CisJbWVtc2V0KHJ0bHByaXYtPnNlYy5rZXlfYnVmLCAwLCBLRVlfQlVGX1NJWkUgKiBNQVhfS0VZX0xFTik7CisJbWVtc2V0KHJ0bHByaXYtPnNlYy5rZXlfbGVuLCAwLCBLRVlfQlVGX1NJWkUpOworCXJ0bHByaXYtPnNlYy5wYWlyd2lzZV9rZXkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBydGxfY2FtX3Byb2dyYW1fZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBlbnRyeV9ubywKKwkJCSAgIHU4ICptYWNfYWRkciwgdTggKmtleV9jb250XzEyOCwgdTE2IHVzX2NvbmZpZykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwl1MzIgdGFyZ2V0X2NvbW1hbmQ7CisJdTMyIHRhcmdldF9jb250ZW50ID0gMDsKKwl1OCBlbnRyeV9pOworCisJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX1NFQywgREJHX0RNRVNHLCAiS2V5IGNvbnRlbnQgOiIsCisJCQlrZXlfY29udF8xMjgsIDE2KTsKKworCWZvciAoZW50cnlfaSA9IDA7IGVudHJ5X2kgPCBDQU1fQ09OVEVOVF9DT1VOVDsgZW50cnlfaSsrKSB7CisJCXRhcmdldF9jb21tYW5kID0gZW50cnlfaSArIENBTV9DT05URU5UX0NPVU5UICogZW50cnlfbm87CisJCXRhcmdldF9jb21tYW5kID0gdGFyZ2V0X2NvbW1hbmQgfCBCSVQoMzEpIHwgQklUKDE2KTsKKworCQlpZiAoZW50cnlfaSA9PSAwKSB7CisJCQl0YXJnZXRfY29udGVudCA9ICh1MzIpICgqKG1hY19hZGRyICsgMCkpIDw8IDE2IHwKKwkJCSAgICAodTMyKSAoKihtYWNfYWRkciArIDEpKSA8PCAyNCB8ICh1MzIpIHVzX2NvbmZpZzsKKworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tXQ0FNSV0sCisJCQkJCXRhcmdldF9jb250ZW50KTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLAorCQkJCQl0YXJnZXRfY29tbWFuZCk7CisKKwkJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJCQkgKCJXUklURSAleDogJXggXG4iLAorCQkJCSAgcnRscHJpdi0+Y2ZnLT5tYXBzW1dDQU1JXSwgdGFyZ2V0X2NvbnRlbnQpKTsKKwkJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJCQkgKCJUaGUgS2V5IElEIGlzICVkXG4iLCBlbnRyeV9ubykpOworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAorCQkJCSAoIldSSVRFICV4OiAleCBcbiIsCisJCQkJICBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLCB0YXJnZXRfY29tbWFuZCkpOworCisJCX0gZWxzZSBpZiAoZW50cnlfaSA9PSAxKSB7CisKKwkJCXRhcmdldF9jb250ZW50ID0gKHUzMikgKCoobWFjX2FkZHIgKyA1KSkgPDwgMjQgfAorCQkJICAgICh1MzIpICgqKG1hY19hZGRyICsgNCkpIDw8IDE2IHwKKwkJCSAgICAodTMyKSAoKihtYWNfYWRkciArIDMpKSA8PCA4IHwKKwkJCSAgICAodTMyKSAoKihtYWNfYWRkciArIDIpKTsKKworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tXQ0FNSV0sCisJCQkJCXRhcmdldF9jb250ZW50KTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLAorCQkJCQl0YXJnZXRfY29tbWFuZCk7CisKKwkJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJCQkgKCJXUklURSBBNDogJXggXG4iLCB0YXJnZXRfY29udGVudCkpOworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAorCQkJCSAoIldSSVRFIEEwOiAleCBcbiIsIHRhcmdldF9jb21tYW5kKSk7CisKKwkJfSBlbHNlIHsKKworCQkJdGFyZ2V0X2NvbnRlbnQgPQorCQkJICAgICh1MzIpICgqKGtleV9jb250XzEyOCArIChlbnRyeV9pICogNCAtIDgpICsgMykpIDw8CisJCQkgICAgMjQgfCAodTMyKSAoKihrZXlfY29udF8xMjggKyAoZW50cnlfaSAqIDQgLSA4KSArIDIpKQorCQkJICAgIDw8IDE2IHwKKwkJCSAgICAodTMyKSAoKihrZXlfY29udF8xMjggKyAoZW50cnlfaSAqIDQgLSA4KSArIDEpKSA8PCA4CisJCQkgICAgfCAodTMyKSAoKihrZXlfY29udF8xMjggKyAoZW50cnlfaSAqIDQgLSA4KSArIDApKTsKKworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tXQ0FNSV0sCisJCQkJCXRhcmdldF9jb250ZW50KTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLAorCQkJCQl0YXJnZXRfY29tbWFuZCk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAorCQkJCSAoIldSSVRFIEE0OiAleCBcbiIsIHRhcmdldF9jb250ZW50KSk7CisJCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0xPVUQsCisJCQkJICgiV1JJVEUgQTA6ICV4IFxuIiwgdGFyZ2V0X2NvbW1hbmQpKTsKKwkJfQorCX0KKworCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJICgiYWZ0ZXIgc2V0IGtleSwgdXNjb25maWc6JXhcbiIsIHVzX2NvbmZpZykpOworfQorCit1OCBydGxfY2FtX2FkZF9vbmVfZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICptYWNfYWRkciwKKwkJCSB1MzIgdWxfa2V5X2lkLCB1MzIgdWxfZW50cnlfaWR4LCB1MzIgdWxfZW5jX2FsZywKKwkJCSB1MzIgdWxfZGVmYXVsdF9rZXksIHU4ICprZXlfY29udGVudCkKK3sKKwl1MzIgdXNfY29uZmlnOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCisJCSAoIkVudHJ5Tm86JXgsIHVsS2V5SWQ9JXgsIHVsRW5jQWxnPSV4LCAiCisJCSAgInVsVXNlREs9JXggTWFjQWRkciAlcE1cbiIsCisJCSAgdWxfZW50cnlfaWR4LCB1bF9rZXlfaWQsIHVsX2VuY19hbGcsCisJCSAgdWxfZGVmYXVsdF9rZXksIG1hY19hZGRyKSk7CisKKwlpZiAodWxfa2V5X2lkID09IFRPVEFMX0NBTV9FTlRSWSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJ1bEtleUlkIGV4Y2VlZCFcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVsX2RlZmF1bHRfa2V5ID09IDEpIHsKKwkJdXNfY29uZmlnID0gQ0ZHX1ZBTElEIHwgKCh1MTYpICh1bF9lbmNfYWxnKSA8PCAyKTsKKwl9IGVsc2UgeworCQl1c19jb25maWcgPSBDRkdfVkFMSUQgfCAoKHVsX2VuY19hbGcpIDw8IDIpIHwgdWxfa2V5X2lkOworCX0KKworCXJ0bF9jYW1fcHJvZ3JhbV9lbnRyeShodywgdWxfZW50cnlfaWR4LCBtYWNfYWRkciwKKwkJCSAgICAgICh1OCAqKSBrZXlfY29udGVudCwgdXNfY29uZmlnKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csICgiZW5kIFxuIikpOworCisJcmV0dXJuIDE7CisKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfY2FtX2FkZF9vbmVfZW50cnkpOworCitpbnQgcnRsX2NhbV9kZWxldGVfb25lX2VudHJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICB1OCAqbWFjX2FkZHIsIHUzMiB1bF9rZXlfaWQpCit7CisJdTMyIHVsX2NvbW1hbmQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJrZXlfaWR4OiVkXG4iLCB1bF9rZXlfaWQpKTsKKworCXVsX2NvbW1hbmQgPSB1bF9rZXlfaWQgKiBDQU1fQ09OVEVOVF9DT1VOVDsKKwl1bF9jb21tYW5kID0gdWxfY29tbWFuZCB8IEJJVCgzMSkgfCBCSVQoMTYpOworCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tXQ0FNSV0sIDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLCB1bF9jb21tYW5kKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCisJCSAoInJ0bF9jYW1fZGVsZXRlX29uZV9lbnRyeSgpOiBXUklURSBBNDogJXggXG4iLCAwKSk7CisJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJICgicnRsX2NhbV9kZWxldGVfb25lX2VudHJ5KCk6IFdSSVRFIEEwOiAleCBcbiIsIHVsX2NvbW1hbmQpKTsKKworCXJldHVybiAwOworCit9CisvL0VYUE9SVF9TWU1CT0wocnRsX2NhbV9kZWxldGVfb25lX2VudHJ5KTsKKwordm9pZCBydGxfY2FtX3Jlc2V0X2FsbF9lbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1MzIgdWxfY29tbWFuZDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwl1bF9jb21tYW5kID0gQklUKDMxKSB8IEJJVCgzMCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tSV0NBTV0sIHVsX2NvbW1hbmQpOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9jYW1fcmVzZXRfYWxsX2VudHJ5KTsKKwordm9pZCBydGxfY2FtX21hcmtfaW52YWxpZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdWNfaW5kZXgpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJdTMyIHVsX2NvbW1hbmQ7CisJdTMyIHVsX2NvbnRlbnQ7CisJdTMyIHVsX2VuY19hbGdvID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1NFQ19DQU1fQUVTXTsKKworCXN3aXRjaCAocnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0pIHsKKwljYXNlIFdFUDQwX0VOQ1JZUFRJT046CisJCXVsX2VuY19hbGdvID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1NFQ19DQU1fV0VQNDBdOworCQlicmVhazsKKwljYXNlIFdFUDEwNF9FTkNSWVBUSU9OOgorCQl1bF9lbmNfYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX1dFUDEwNF07CisJCWJyZWFrOworCWNhc2UgVEtJUF9FTkNSWVBUSU9OOgorCQl1bF9lbmNfYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX1RLSVBdOworCQlicmVhazsKKwljYXNlIEFFU0NDTVBfRU5DUllQVElPTjoKKwkJdWxfZW5jX2FsZ28gPSBydGxwcml2LT5jZmctPm1hcHNbU0VDX0NBTV9BRVNdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1bF9lbmNfYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX0FFU107CisJfQorCisJdWxfY29udGVudCA9ICh1Y19pbmRleCAmIDMpIHwgKCh1MTYpICh1bF9lbmNfYWxnbykgPDwgMik7CisKKwl1bF9jb250ZW50IHw9IEJJVCgxNSk7CisJdWxfY29tbWFuZCA9IENBTV9DT05URU5UX0NPVU5UICogdWNfaW5kZXg7CisJdWxfY29tbWFuZCA9IHVsX2NvbW1hbmQgfCBCSVQoMzEpIHwgQklUKDE2KTsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbV0NBTUldLCB1bF9jb250ZW50KTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW1JXQ0FNXSwgdWxfY29tbWFuZCk7CisKKwlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkgKCJydGxfY2FtX21hcmtfaW52YWxpZCgpOiBXUklURSBBNDogJXggXG4iLCB1bF9jb250ZW50KSk7CisJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJICgicnRsX2NhbV9tYXJrX2ludmFsaWQoKTogV1JJVEUgQTA6ICV4IFxuIiwgdWxfY29tbWFuZCkpOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9jYW1fbWFya19pbnZhbGlkKTsKKwordm9pZCBydGxfY2FtX2VtcHR5X2VudHJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB1Y19pbmRleCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwl1MzIgdWxfY29tbWFuZDsKKwl1MzIgdWxfY29udGVudDsKKwl1MzIgdWxfZW5jYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX0FFU107CisJdTggZW50cnlfaTsKKworCXN3aXRjaCAocnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0pIHsKKwljYXNlIFdFUDQwX0VOQ1JZUFRJT046CisJCXVsX2VuY2FsZ28gPSBydGxwcml2LT5jZmctPm1hcHNbU0VDX0NBTV9XRVA0MF07CisJCWJyZWFrOworCWNhc2UgV0VQMTA0X0VOQ1JZUFRJT046CisJCXVsX2VuY2FsZ28gPSBydGxwcml2LT5jZmctPm1hcHNbU0VDX0NBTV9XRVAxMDRdOworCQlicmVhazsKKwljYXNlIFRLSVBfRU5DUllQVElPTjoKKwkJdWxfZW5jYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX1RLSVBdOworCQlicmVhazsKKwljYXNlIEFFU0NDTVBfRU5DUllQVElPTjoKKwkJdWxfZW5jYWxnbyA9IHJ0bHByaXYtPmNmZy0+bWFwc1tTRUNfQ0FNX0FFU107CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVsX2VuY2FsZ28gPSBydGxwcml2LT5jZmctPm1hcHNbU0VDX0NBTV9BRVNdOworCX0KKworCWZvciAoZW50cnlfaSA9IDA7IGVudHJ5X2kgPCBDQU1fQ09OVEVOVF9DT1VOVDsgZW50cnlfaSsrKSB7CisKKwkJaWYgKGVudHJ5X2kgPT0gMCkgeworCQkJdWxfY29udGVudCA9CisJCQkgICAgKHVjX2luZGV4ICYgMHgwMykgfCAoKHUxNikgKHVsX2VuY2FsZ28pIDw8IDIpOworCQkJdWxfY29udGVudCB8PSBCSVQoMTUpOworCisJCX0gZWxzZSB7CisJCQl1bF9jb250ZW50ID0gMDsKKwkJfQorCisJCXVsX2NvbW1hbmQgPSBDQU1fQ09OVEVOVF9DT1VOVCAqIHVjX2luZGV4ICsgZW50cnlfaTsKKwkJdWxfY29tbWFuZCA9IHVsX2NvbW1hbmQgfCBCSVQoMzEpIHwgQklUKDE2KTsKKworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW1dDQU1JXSwgdWxfY29udGVudCk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLCB1bF9jb21tYW5kKTsKKworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0xPVUQsCisJCQkgKCJydGxfY2FtX2VtcHR5X2VudHJ5KCk6IFdSSVRFIEE0OiAleCBcbiIsCisJCQkgIHVsX2NvbnRlbnQpKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAorCQkJICgicnRsX2NhbV9lbXB0eV9lbnRyeSgpOiBXUklURSBBMDogJXggXG4iLAorCQkJICB1bF9jb21tYW5kKSk7CisJfQorCit9CisvL0VYUE9SVF9TWU1CT0wocnRsX2NhbV9lbXB0eV9lbnRyeSk7CisKK3U4IHJ0bF9jYW1fZ2V0X2ZyZWVfZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpzdGFfYWRkcikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGJpdG1hcCA9IChydGxwcml2LT5zZWMuaHdzZWNfY2FtX2JpdG1hcCkgPj4gNDsKKwl1OCBlbnRyeV9pZHggPSAwOworCXU4IGksICphZGRyOworCisJaWYgKE5VTEwgPT0gc3RhX2FkZHIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19FTUVSRywKKwkJCSgic3RhX2FkZHIgaXMgTlVMTC5cbiIpKTsKKwkJcmV0dXJuIFRPVEFMX0NBTV9FTlRSWTsKKwl9CisJLyogRG9lcyBTVEEgYWxyZWFkeSBleGlzdD8gKi8KKwlmb3IgKGkgPSA0OyBpIDwgVE9UQUxfQ0FNX0VOVFJZOyBpKyspIHsKKwkJYWRkciA9IHJ0bHByaXYtPnNlYy5od3NlY19jYW1fc3RhX2FkZHJbaV07CisJCWlmKG1lbWNtcChhZGRyLCBzdGFfYWRkciwgRVRIX0FMRU4pID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisJLyogR2V0IGEgZnJlZSBDQU0gZW50cnkuICovCisJZm9yIChlbnRyeV9pZHggPSA0OyBlbnRyeV9pZHggPCBUT1RBTF9DQU1fRU5UUlk7IGVudHJ5X2lkeCsrKSB7CisJCWlmICgoYml0bWFwICYgQklUKDApKSA9PSAwKSB7CisJCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0VNRVJHLAorCQkJCSgiLS0tLS1od3NlY19jYW1fYml0bWFwOiAweCV4IGVudHJ5X2lkeD0lZFxuIiwKKwkJCQkgcnRscHJpdi0+c2VjLmh3c2VjX2NhbV9iaXRtYXAsIGVudHJ5X2lkeCkpOworCQkJcnRscHJpdi0+c2VjLmh3c2VjX2NhbV9iaXRtYXAgfD0gQklUKDApIDw8IGVudHJ5X2lkeDsKKwkJCW1lbWNweShydGxwcml2LT5zZWMuaHdzZWNfY2FtX3N0YV9hZGRyW2VudHJ5X2lkeF0sCisJCQkgICAgICAgc3RhX2FkZHIsIEVUSF9BTEVOKTsKKwkJCXJldHVybiBlbnRyeV9pZHg7CisJCX0KKwkJYml0bWFwID0gYml0bWFwID4+MTsKKwl9CisJcmV0dXJuIFRPVEFMX0NBTV9FTlRSWTsKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfY2FtX2dldF9mcmVlX2VudHJ5KTsKKwordm9pZCBydGxfY2FtX2RlbF9lbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnN0YV9hZGRyKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgYml0bWFwOworCXU4IGksICphZGRyOworCisJaWYgKE5VTEwgPT0gc3RhX2FkZHIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19FTUVSRywKKwkJCSgic3RhX2FkZHIgaXMgTlVMTC5cbiIpKTsKKwl9CisKKwlpZiAoKHN0YV9hZGRyWzBdfHN0YV9hZGRyWzFdfHN0YV9hZGRyWzJdfHN0YV9hZGRyWzNdfFwKKwkJCQlzdGFfYWRkcls0XXxzdGFfYWRkcls1XSkgPT0gMCkgeworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0VNRVJHLAorCQkJKCJzdGFfYWRkciBpcyAwMDowMDowMDowMDowMDowMC5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBEb2VzIFNUQSBhbHJlYWR5IGV4aXN0PyAqLworCWZvciAoaSA9IDQ7IGkgPCBUT1RBTF9DQU1fRU5UUlk7IGkrKykgeworCQlhZGRyID0gcnRscHJpdi0+c2VjLmh3c2VjX2NhbV9zdGFfYWRkcltpXTsKKwkJYml0bWFwID0gKHJ0bHByaXYtPnNlYy5od3NlY19jYW1fYml0bWFwKSA+PiBpOworCQlpZiAoKChiaXRtYXAgJiBCSVQoMCkpID09IEJJVCgwKSkgJiYKKwkJICAgIChtZW1jbXAoYWRkciwgc3RhX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSkgeworCQkJLyogUmVtb3ZlIGZyb20gSFcgU2VjdXJpdHkgQ0FNICovCisJCQltZW1zZXQocnRscHJpdi0+c2VjLmh3c2VjX2NhbV9zdGFfYWRkcltpXSwgMCwgRVRIX0FMRU4pOworCQkJcnRscHJpdi0+c2VjLmh3c2VjX2NhbV9iaXRtYXAgJj0gfihCSVQoMCkgPDwgaSk7CisJCQlwcmludGsoIiYmJiYmJiYmJmRlbCBlbnRyeSAlZFxuIixpKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX2NhbV9kZWxfZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jYW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2ZmE2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY2FtLmgKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVExfQ0FNX0hfCisjZGVmaW5lIF9fUlRMX0NBTV9IXworCisjZGVmaW5lIENBTV9DT05URU5UX0NPVU5UIAkJCQk4CisKKyNkZWZpbmUgQ0ZHX0RFRkFVTFRfS0VZICAJCQkJQklUKDUpCisjZGVmaW5lIENGR19WQUxJRCAgICAgICAgCQkJCUJJVCgxNSkKKworI2RlZmluZSBQQUlSV0lTRV9LRVlJRFgJCQkJCTAKKyNkZWZpbmUgQ0FNX1BBSVJXSVNFX0tFWV9QT1NJVElPTgkJCTQKKworI2RlZmluZQlDQU1fQ09ORklHX1VTRURLCQkJCTEKKyNkZWZpbmUJQ0FNX0NPTkZJR19OT19VU0VESwkJCQkwCisKK2V4dGVybiB2b2lkIHJ0bF9jYW1fcmVzZXRfYWxsX2VudHJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2V4dGVybiB1OCBydGxfY2FtX2FkZF9vbmVfZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICptYWNfYWRkciwKKwkJCQl1MzIgdWxfa2V5X2lkLCB1MzIgdWxfZW50cnlfaWR4LCB1MzIgdWxfZW5jX2FsZywKKwkJCQl1MzIgdWxfZGVmYXVsdF9rZXksIHU4ICprZXlfY29udGVudCk7CitpbnQgcnRsX2NhbV9kZWxldGVfb25lX2VudHJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqbWFjX2FkZHIsCisJCQkgICAgIHUzMiB1bF9rZXlfaWQpOwordm9pZCBydGxfY2FtX21hcmtfaW52YWxpZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdWNfaW5kZXgpOwordm9pZCBydGxfY2FtX2VtcHR5X2VudHJ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB1Y19pbmRleCk7Cit2b2lkIHJ0bF9jYW1fcmVzZXRfc2VjX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordTggcnRsX2NhbV9nZXRfZnJlZV9lbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnN0YV9hZGRyKTsKK3ZvaWQgcnRsX2NhbV9kZWxfZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpzdGFfYWRkcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNjljYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29tcGF0LmgKQEAgLTAsMCArMSwxMjUgQEAKKyNpZm5kZWYgX19SVExfQ09NUEFUX0hfXworI2RlZmluZSBfX1JUTF9DT01QQVRfSF9fCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI5KSkKKy8qCisgKiBVc2UgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHNhbWUgc3VzcGVuZCBhbmQgcmVzdW1lIGNhbGxiYWNrcyBmb3Igc3VzcGVuZAorICogdG8gUkFNIGFuZCBoaWJlcm5hdGlvbi4KKyAqLworI2RlZmluZSBTSU1QTEVfREVWX1BNX09QUyhuYW1lLCBzdXNwZW5kX2ZuLCByZXN1bWVfZm4pIFwKK3N0cnVjdCBkZXZfcG1fb3BzIG5hbWUgPSB7IFwKKwkuc3VzcGVuZCA9IHN1c3BlbmRfZm4sIFwKKwkucmVzdW1lID0gcmVzdW1lX2ZuLCBcCisJLmZyZWV6ZSA9IHN1c3BlbmRfZm4sIFwKKwkudGhhdyA9IHJlc3VtZV9mbiwgXAorCS5wb3dlcm9mZiA9IHN1c3BlbmRfZm4sIFwKKwkucmVzdG9yZSA9IHJlc3VtZV9mbiwgXAorfQorCisjZGVmaW5lIGNvbXBhdF9wY2lfc3VzcGVuZChmbikJCQkJCQlcCisJaW50IGZuIyNfY29tcGF0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpIAlcCisJewkJCQkJCQkJXAorCQlpbnQgcjsJCQkJCQkJXAorCQkJCQkJCQkJXAorCQlyID0gZm4oJnBkZXYtPmRldik7CQkJCQlcCisJCWlmIChyKQkJCQkJCQlcCisJCQlyZXR1cm4gcjsJCQkJCVwKKwkJCQkJCQkJCVwKKwkJcGNpX3NhdmVfc3RhdGUocGRldik7CQkJCQlcCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsJCQkJXAorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CQkJXAorCQkJCQkJCQkJXAorCQlyZXR1cm4gMDsJCQkJCQlcCisJfQorCisjZGVmaW5lIGNvbXBhdF9wY2lfcmVzdW1lKGZuKQkJCQkJCVwKKwlpbnQgZm4jI19jb21wYXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCQkJCVwKKwl7CQkJCQkJCQlcCisJCWludCByOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsJCQlcCisJCXIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsJCQkJXAorCQlpZiAocikJCQkJCQkJXAorCQkJcmV0dXJuIHI7CQkJCQlcCisJCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwkJCQlcCisJCQkJCQkJCQlcCisJCXJldHVybiBmbigmcGRldi0+ZGV2KTsJCQkJCVwKKwl9CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzkpKQorI2RlZmluZSBSWF9GTEFHX01BQ1RJTUVfTVBEVSBSWF9GTEFHX1RTRlQKKyNlbHNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDgsMCkpCisjZGVmaW5lIFJYX0ZMQUdfTUFDVElNRV9NUERVIFJYX0ZMQUdfTUFDVElNRV9TVEFSVAorI2Vsc2UKKyNlbmRpZgorLy8jZGVmaW5lIE5FVERFVl9UWF9PSworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKKyNkZWZpbmUgSUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVQgSUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVRfVFgKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX21nbXRfY29tcGF0IHsKKwlfX2xlMTYgZnJhbWVfY29udHJvbDsKKwlfX2xlMTYgZHVyYXRpb247CisJdTggZGFbNl07CisJdTggc2FbNl07CisJdTggYnNzaWRbNl07CisJX19sZTE2IHNlcV9jdHJsOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IGNhdGVnb3J5OworCQkJdW5pb24geworCQkJCXN0cnVjdCB7CisJCQkJCXU4IGFjdGlvbl9jb2RlOworCQkJCQl1OCBkaWFsb2dfdG9rZW47CisJCQkJCXU4IHN0YXR1c19jb2RlOworCQkJCQl1OCB2YXJpYWJsZVswXTsKKwkJCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB3bWVfYWN0aW9uOworCQkJCXN0cnVjdHsKKwkJCQkJdTggYWN0aW9uX2NvZGU7CisJCQkJCXU4IGRpYWxvZ190b2tlbjsKKwkJCQkJX19sZTE2IGNhcGFiOworCQkJCQlfX2xlMTYgdGltZW91dDsKKwkJCQkJX19sZTE2IHN0YXJ0X3NlcV9udW07CisJCQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhZGRiYV9yZXE7CisJCQkJc3RydWN0eworCQkJCQl1OCBhY3Rpb25fY29kZTsKKwkJCQkJdTggZGlhbG9nX3Rva2VuOworCQkJCQlfX2xlMTYgc3RhdHVzOworCQkJCQlfX2xlMTYgY2FwYWI7CisJCQkJCV9fbGUxNiB0aW1lb3V0OworCQkJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWRkYmFfcmVzcDsKKwkJCQlzdHJ1Y3R7CisJCQkJCXU4IGFjdGlvbl9jb2RlOworCQkJCQlfX2xlMTYgcGFyYW1zOworCQkJCQlfX2xlMTYgcmVhc29uX2NvZGU7CisJCQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBkZWxiYTsKKwkJCQlzdHJ1Y3R7CisJCQkJCXU4IGFjdGlvbl9jb2RlOworCQkJCQkvKiBjYXBhYl9pbmZvIGZvciBvcGVuIGFuZCBjb25maXJtLAorCQkJCQkgKiByZWFzb24gZm9yIGNsb3NlCisJCQkJCSAqLworCQkJCQlfX2xlMTYgYXV4OworCQkJCQkvKiBGb2xsb3dlZCBpbiBwbGlua19jb25maXJtIGJ5IHN0YXR1cworCQkJCQkgKiBjb2RlLCBBSUQgYW5kIHN1cHBvcnRlZCByYXRlcywKKwkJCQkJICogYW5kIGRpcmVjdGx5IGJ5IHN1cHBvcnRlZCByYXRlcyBpbgorCQkJCQkgKiBwbGlua19vcGVuIGFuZCBwbGlua19jbG9zZQorCQkJCQkgKi8KKwkJCQkJdTggdmFyaWFibGVbMF07CisJCQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBwbGlua19hY3Rpb247CisJCQkJc3RydWN0eworCQkJCQl1OCBhY3Rpb25fY29kZTsKKwkJCQkJdTggdmFyaWFibGVbMF07CisJCQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBtZXNoX2FjdGlvbjsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1OCBhY3Rpb247CisJCQkJCXU4IHNtcHNfY29udHJvbDsKKwkJCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBodF9zbXBzOworCQkJfSB1OworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhY3Rpb247CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkZTYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jCkBAIC0wLDAgKzEsMTQ2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ3aWZpLmgiCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNhbS5oIgorI2luY2x1ZGUgImJhc2UuaCIKKyNpbmNsdWRlICJwcy5oIgorCisjaW5jbHVkZSAiYnRjb2V4aXN0L3J0bF9idGMuaCIKKworLyptdXRleCBmb3Igc3RhcnQgJiBzdG9wIGlzIG11c3QgaGVyZS4gKi8KK3N0YXRpYyBpbnQgcnRsX29wX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCisJaWYgKCFpc19oYWxfc3RvcChydGxoYWwpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXRlc3RfYml0KFJUTF9TVEFUVVNfSU5URVJGQUNFX1NUQVJULCAmcnRscHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuIDA7CisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MuY29uZl9tdXRleCk7CisJZXJyID0gcnRscHJpdi0+aW50Zl9vcHMtPmFkYXB0ZXJfc3RhcnQoaHcpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJ0bF93YXRjaF9kb2dfdGltZXJfY2FsbGJhY2soKHVuc2lnbmVkIGxvbmcpaHcpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBydGxfb3Bfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJaWYgKGlzX2hhbF9zdG9wKHJ0bGhhbCkpCisJCXJldHVybjsKKworCS8qIGhlcmUgaXMgbXVzdCwgYmVjYXVzZSBhZGhvYyBkbyBzdG9wIGFuZCBzdGFydCwKKwkgKiBidXQgc3RvcCB3aXRoIFJGT0ZGIG1heSBjYXVzZSBzb21ldGhpbmcgd3JvbmcsCisJICogbGlrZSBhZGhvYyBUUCAqLworCWlmICh1bmxpa2VseShwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpKQorCQlydGxfaXBzX25pY19vbihodyk7CisKKwltdXRleF9sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKKworCW1hYy0+bGlua19zdGF0ZSA9IE1BQzgwMjExX05PTElOSzsKKwltZW1zZXQobWFjLT5ic3NpZCwgMCwgNik7CisJbWFjLT52ZW5kb3IgPSBQRUVSX1VOS05PV047CisKKwkvKnJlc2V0IHNlYyBpbmZvICovCisJcnRsX2NhbV9yZXNldF9zZWNfaW5mbyhodyk7CisKKwlydGxfZGVpbml0X2RlZmVycmVkX3dvcmsoaHcpOworCXJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3N0b3AoaHcpOworCisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKK30KKworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzkpKQorc3RhdGljIGludCBydGxfb3BfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF90Y2JfZGVzYyB0Y2JfZGVzYzsKKwltZW1zZXQoJnRjYl9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IHJ0bF90Y2JfZGVzYykpOworCisJaWYgKHVubGlrZWx5KGlzX2hhbF9zdG9wKHJ0bGhhbCkgfHwgcHBzYy0+cmZwd3Jfc3RhdGUgIT0gRVJGT04pKQorCQlnb3RvIGVycl9mcmVlOworCisJaWYgKCF0ZXN0X2JpdChSVExfU1RBVFVTX0lOVEVSRkFDRV9TVEFSVCwgJnJ0bHByaXYtPnN0YXR1cykpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlpZiAoIXJ0bHByaXYtPmludGZfb3BzLT53YWl0cV9pbnNlcnQoaHcsIHNrYikpCisJCXJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3R4KGh3LCBza2IsICZ0Y2JfZGVzYyk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitlcnJfZnJlZToKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisjZWxzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCitzdGF0aWMgdm9pZCBydGxfb3BfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KK3N0YXRpYyB2b2lkIHJ0bF9vcF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworeworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfdGNiX2Rlc2MgdGNiX2Rlc2M7CisJbWVtc2V0KCZ0Y2JfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBydGxfdGNiX2Rlc2MpKTsKKworCWlmICh1bmxpa2VseShpc19oYWxfc3RvcChydGxoYWwpIHx8IHBwc2MtPnJmcHdyX3N0YXRlICE9IEVSRk9OKSkKKwkJZ290byBlcnJfZnJlZTsKKworCWlmICghdGVzdF9iaXQoUlRMX1NUQVRVU19JTlRFUkZBQ0VfU1RBUlQsICZydGxwcml2LT5zdGF0dXMpKQorCQlnb3RvIGVycl9mcmVlOworCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKKwlpZiAoIXJ0bHByaXYtPmludGZfb3BzLT53YWl0cV9pbnNlcnQoaHcsIHNrYikpCisJCXJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3R4KGh3LCBza2IsICZ0Y2JfZGVzYyk7CisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlpZiAoIXJ0bHByaXYtPmludGZfb3BzLT53YWl0cV9pbnNlcnQoaHcsIGNvbnRyb2wtPnN0YSwgc2tiKSkKKwkgICAgICAgIHJ0bHByaXYtPmludGZfb3BzLT5hZGFwdGVyX3R4KGh3LCBjb250cm9sLT5zdGEsIHNrYiwgJnRjYl9kZXNjKTsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlyZXR1cm47CisKK2Vycl9mcmVlOgorCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuOworfQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCitzdGF0aWMgaW50IHJ0bF9vcF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCWludCBlcnIgPSAwOworCisJaWYgKG1hYy0+dmlmKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoInZpZiBoYXMgYmVlbiBzZXQhISBtYWMtPnZpZiA9IDB4JXBcbiIsIG1hYy0+dmlmKSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKy8qVGhpcyBmbGFnIGlzIG5vdCBkZWZpbmVkIGJlZm9yZSBrZXJuZWwgMy40Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKKwl2aWYtPmRyaXZlcl9mbGFncyB8PSBJRUVFODAyMTFfVklGX0JFQUNPTl9GSUxURVI7CisjZW5kaWYKKworCXJ0bF9pcHNfbmljX29uKGh3KTsKKworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM3KSkKKwlzd2l0Y2ggKGllZWU4MDIxMV92aWZfdHlwZV9wMnAodmlmKSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwkJbWFjLT5wMnAgPSBQMlBfUk9MRV9DTElFTlQ7CisJCS8qZmFsbCB0aHJvdWdoKi8KKyNlbHNlCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCXN3aXRjaCAodmlmLT50eXBlKSB7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlpZiAobWFjLT5iZWFjb25fZW5hYmxlZCA9PSAxKSB7CisJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCQkgKCJOTDgwMjExX0lGVFlQRV9TVEFUSU9OIFxuIikpOworCQkJbWFjLT5iZWFjb25fZW5hYmxlZCA9IDA7CisJCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX2ludGVycnVwdF9tYXNrKGh3LCAwLAorCQkJCQlydGxwcml2LT5jZmctPm1hcHNbUlRMX0lCU1NfSU5UX01BU0tTXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkgKCJOTDgwMjExX0lGVFlQRV9BREhPQyBcbiIpKTsKKworCQltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9MSU5LRUQ7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfYmNuX3JlZyhodyk7CisJCWlmIChydGxwcml2LT5ydGxoYWwuY3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpCisJCQltYWMtPmJhc2ljX3JhdGVzID0gMHhmZmY7CisJCWVsc2UKKwkJCW1hYy0+YmFzaWNfcmF0ZXMgPSAweGZmMDsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9CQVNJQ19SQVRFLAorCQkJCSh1OCAqKSAoJm1hYy0+YmFzaWNfcmF0ZXMpKTsKKworCQlicmVhazsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykpCisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCW1hYy0+cDJwID0gUDJQX1JPTEVfR087CisJCS8qZmFsbCB0aHJvdWdoKi8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCSAoIk5MODAyMTFfSUZUWVBFX0FQIFxuIikpOworCisJCW1hYy0+bGlua19zdGF0ZSA9IE1BQzgwMjExX0xJTktFRDsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9iY25fcmVnKGh3KTsKKwkJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykKKwkJCW1hYy0+YmFzaWNfcmF0ZXMgPSAweGZmZjsKKwkJZWxzZQorCQkJbWFjLT5iYXNpY19yYXRlcyA9IDB4ZmYwOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0JBU0lDX1JBVEUsCisJCQkJCSAgICAgICh1OCAqKSAoJm1hYy0+YmFzaWNfcmF0ZXMpKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgorCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCSAoIk5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgXG4iKSk7CisKKwkJbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTElOS0VEOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Jjbl9yZWcoaHcpOworCQlpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKQorCQkJbWFjLT5iYXNpY19yYXRlcyA9IDB4ZmZmOworCQllbHNlCisJCQltYWMtPmJhc2ljX3JhdGVzID0gMHhmZjA7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQkFTSUNfUkFURSwKKwkJCQkodTggKikgKCZtYWMtPmJhc2ljX3JhdGVzKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJvcGVyYXRpb24gbW9kZSAlZCBpcyBub3Qgc3VwcG9ydCFcbiIsIHZpZi0+dHlwZSkpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgVklGX1RPRE8KKwlpZiAoIXJ0bF9zZXRfdmlmX2luZm8oaHcsIHZpZikpCisJCWdvdG8gb3V0OworI2VuZGlmCisKKwlpZiAobWFjLT5wMnApIHsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkgKCJwMnAgcm9sZSAleCBcbiIsdmlmLT50eXBlKSk7CisJCW1hYy0+YmFzaWNfcmF0ZXMgPSAweGZmMDsvKmRpc2FibGUgY2NrIHJhdGUgZm9yIHAycCovCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQkFTSUNfUkFURSwKKwkJCQkodTggKikgKCZtYWMtPmJhc2ljX3JhdGVzKSk7CisJfQorCW1hYy0+dmlmID0gdmlmOworCW1hYy0+b3Btb2RlID0gdmlmLT50eXBlOworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfbmV0d29ya190eXBlKGh3LCB2aWYtPnR5cGUpOworCW1lbWNweShtYWMtPm1hY19hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0VUSEVSX0FERFIsIG1hYy0+bWFjX2FkZHIpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBydGxfb3BfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworCisJLyogRnJlZSBiZWFjb24gcmVzb3VyY2VzICovCisJaWYgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHx8CisJICAgICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHx8CisJICAgICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkpIHsKKwkJaWYgKG1hYy0+YmVhY29uX2VuYWJsZWQgPT0gMSkgeworCQkJbWFjLT5iZWFjb25fZW5hYmxlZCA9IDA7CisJCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX2ludGVycnVwdF9tYXNrKGh3LCAwLAorCQkJCQlydGxwcml2LT5jZmctPm1hcHNbUlRMX0lCU1NfSU5UX01BU0tTXSk7CisJCX0KKwl9CisKKwkvKgorCSAqTm90ZTogV2UgYXNzdW1lIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEIGFzCisJICpOTyBMSU5LIGZvciBvdXIgaGFyZHdhcmUuCisJICovCisJbWFjLT5wMnAgPSAwOworCW1hYy0+dmlmID0gTlVMTDsKKwltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9OT0xJTks7CisJbWVtc2V0KG1hYy0+YnNzaWQsIDAsIDYpOworCW1hYy0+dmVuZG9yID0gUEVFUl9VTktOT1dOOworCW1hYy0+b3Btb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9uZXR3b3JrX3R5cGUoaHcsIG1hYy0+b3Btb2RlKTsKKworCW11dGV4X3VubG9jaygmcnRscHJpdi0+bG9ja3MuY29uZl9tdXRleCk7Cit9CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KK3N0YXRpYyBpbnQgcnRsX29wX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICBlbnVtIG5sODAyMTFfaWZ0eXBlIG5ld190eXBlLCBib29sIHAycCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IHJldDsKKwlydGxfb3BfcmVtb3ZlX2ludGVyZmFjZShodywgdmlmKTsKKworCXZpZi0+dHlwZSA9IG5ld190eXBlOworCXZpZi0+cDJwID0gcDJwOworCXJldCA9IHJ0bF9vcF9hZGRfaW50ZXJmYWNlKGh3LCB2aWYpOworCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELAorCQkgKCIgcDJwICAleFxuIixwMnApKTsKKwlyZXR1cm4gcmV0OworfQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworc3RhdGljIGludCBydGxfb3BfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKworCWlmIChtYWMtPnNraXBfc2NhbikKKwkJcmV0dXJuIDE7CisKKworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0xJU1RFTl9JTlRFUlZBTCkgewkvKiBCSVQoMikgKi8KKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkgKCJJRUVFODAyMTFfQ09ORl9DSEFOR0VfTElTVEVOX0lOVEVSVkFMXG4iKSk7CisJfQorCisJLypGb3IgSVBTICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkgeworCQlpZiAoaHctPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKQorCQkJcnRsX2lwc19uaWNfb2ZmKGh3KTsKKwkJZWxzZQorCQkJcnRsX2lwc19uaWNfb24oaHcpOworCX0gZWxzZSB7CisJCS8qCisJCSAqYWx0aG91Z2ggcmZvZmYgbWF5IG5vdCBjYXVzZSBieSBpcHMsIGJ1dCB3ZSB3aWxsCisJCSAqY2hlY2sgdGhlIHJlYXNvbiBpbiBzZXRfcmZfcG93ZXJfc3RhdGUgZnVuY3Rpb24KKwkJICovCisJCWlmICh1bmxpa2VseShwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpKQorCQkJcnRsX2lwc19uaWNfb24oaHcpOworCX0KKworCS8qRm9yIExQUyAqLworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ0bHByaXYtPndvcmtzLnBzX3dvcmspOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZydGxwcml2LT53b3Jrcy5wc19yZm9uX3dxKTsKKwkJaWYgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpIHsKKwkJCXJ0bHByaXYtPnBzYy5zd19wc19lbmFibGVkID0gdHJ1ZTsKKwkJCS8qIHNsZWVwIGhlcmUgaXMgbXVzdCwgb3Igd2UgbWF5IHJlY3YgdGhlIGJlYWNvbiBhbmQKKwkJCSAqIGNhdXNlIG1hYzgwMjExIGludG8gd3JvbmcgcHMgc3RhdGUsIHRoaXMgd2lsbCBjYXVzZQorCQkJICogcG93ZXIgc2F2ZSBudWxsZnVuYyBzZW5kIGZhaWwsIGFuZCBmdXJ0aGVyIGNhdXNlCisJCQkgKiBwa3QgbG9zcywgU28gc2xlZXAgbXVzdCBxdWlja2x5IGJ1dCBub3QgaW1tZWRpYXRseQorCQkJICogYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgbnVsbGZ1bmMgc2VuZCBieSBtYWM4MDIxMQorCQkJICogZmFpbCwgYW5kIGNhdXNlIHBrdCBsb3NzLCB3ZSBoYXZlIHRlc3RlZCB0aGF0IDVtQQorCQkJICogaXMgd29ya2VkIHZlcnkgd2VsbCAqLworCQkJaWYgKCFydGxwcml2LT5wc2MubXVsdGlfYnVmZmVyZWQpCisJCQkJcXVldWVfZGVsYXllZF93b3JrKHJ0bHByaXYtPndvcmtzLnJ0bF93cSwKKwkJCQkJCSAgICZydGxwcml2LT53b3Jrcy5wc193b3JrLAorCQkJCQkJICAgTVNFQ1MoNSkpOworCQl9IGVsc2UgeworCQkJcnRsX3N3bHBzX3JmX2F3YWtlKGh3KTsKKwkJCXJ0bHByaXYtPnBzYy5zd19wc19lbmFibGVkID0gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9SRVRSWV9MSU1JVFMpIHsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkgKCJJRUVFODAyMTFfQ09ORl9DSEFOR0VfUkVUUllfTElNSVRTICV4XG4iLAorCQkJICBody0+Y29uZi5sb25nX2ZyYW1lX21heF90eF9jb3VudCkpOworCQltYWMtPnJldHJ5X2xvbmcgPSBody0+Y29uZi5sb25nX2ZyYW1lX21heF90eF9jb3VudDsKKwkJbWFjLT5yZXRyeV9zaG9ydCA9IGh3LT5jb25mLmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50OworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX1JFVFJZX0xJTUlULAorCQkJCSh1OCAqKSAoJmh3LT5jb25mLmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KSk7CisJfQorCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgeworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKKwkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuOworCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSA9CisJCQkJY2ZnODAyMTFfZ2V0X2NoYW5kZWZfdHlwZSgmKGh3LT5jb25mLmNoYW5kZWYpKTsKKyNlbHNlCisJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGh3LT5jb25mLmNoYW5uZWw7CisJCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlID0gaHctPmNvbmYuY2hhbm5lbF90eXBlOworI2VuZGlmCisJCXU4IHdpZGVfY2hhbiA9ICh1OCkgY2hhbm5lbC0+aHdfdmFsdWU7CisKKwkJaWYgKG1hYy0+YWN0X3NjYW5uaW5nKQorCQkJbWFjLT5uX2NoYW5uZWxzKys7CisKKwkJaWYgKHJ0bHByaXYtPmRtLnN1cHBfcGh5bW9kZV9zd2l0Y2ggJiYKKwkJCW1hYy0+bGlua19zdGF0ZSA8IE1BQzgwMjExX0xJTktFRCAmJgorCQkJIW1hYy0+YWN0X3NjYW5uaW5nKSB7CisJCQlpZiAocnRscHJpdi0+Y2ZnLT5vcHMtPmNoZWNrX3N3aXRjaF90b19kbWRwKQorCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5jaGVja19zd2l0Y2hfdG9fZG1kcChodyk7CisJCX0KKworCQkvKgorCQkgKmJlY2F1c2Ugd2Ugc2hvdWxkIGJhY2sgY2hhbm5lbCB0bworCQkgKmN1cnJlbnRfbmV0d29yay5jaGFuIGluIGluIHNjYW5uaW5nLAorCQkgKlNvIGlmIHNldF9jaGFuID09IGN1cnJlbnRfbmV0d29yay5jaGFuCisJCSAqd2Ugc2hvdWxkIHNldCBpdC4KKwkJICpiZWNhdXNlIG1hYzgwMjExIHRlbGwgdXMgd3JvbmcgYnc0MAorCQkgKmluZm8gZm9yIGNpc2NvMTI1MyBidzIwLCBzbyB3ZSBtb2RpZnkKKwkJICppdCBoZXJlIGJhc2VkIG9uIFVQUEVSICYgTE9XRVIKKwkJICovCisJCXN3aXRjaCAoY2hhbm5lbF90eXBlKSB7CisJCQljYXNlIE5MODAyMTFfQ0hBTl9IVDIwOgorCQkJY2FzZSBOTDgwMjExX0NIQU5fTk9fSFQ6CisJCQkJLyogU0MgKi8KKwkJCQltYWMtPmN1cl80MF9wcmltZV9zYyA9CisJCQkJCVBSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKKwkJCQlydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7CisJCQkJbWFjLT5id180MCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgorCQkJCS8qIFNDICovCisJCQkJbWFjLT5jdXJfNDBfcHJpbWVfc2MgPSBQUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKKwkJCQlydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9CisJCQkJCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDA7CisJCQkJbWFjLT5id180MCA9IHRydWU7CisKKwkJCQkvKndpZGUgY2hhbm5lbCAqLworCQkJCXdpZGVfY2hhbiAtPSAyOworCisJCQkJYnJlYWs7CisJCQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKKwkJCQkvKiBTQyAqLworCQkJCW1hYy0+Y3VyXzQwX3ByaW1lX3NjID0gUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7CisJCQkJcnRscGh5LT5jdXJyZW50X2NoYW5fYncgPQorCQkJCQlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOworCQkJCW1hYy0+YndfNDAgPSB0cnVlOworCisJCQkJLyp3aWRlIGNoYW5uZWwgKi8KKwkJCQl3aWRlX2NoYW4gKz0gMjsKKworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQltYWMtPmJ3XzQwID0gZmFsc2U7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkJCSgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZCBcbiIpKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh3aWRlX2NoYW4gPD0gMCkKKwkJCXdpZGVfY2hhbiA9IDE7CisKKwkJLyogaW4gc2Nhbm5pbmcsIHdoZW4gYmVmb3JlIHdlIG9mZmNoYW5uZWwgd2UgbWF5IHNlbmQgYSBwcz0xCisJCSAqIG51bGwgdG8gQVAsIGFuZCB0aGVuIHdlIG1heSBzZW5kIGEgcHMgPSAwIG51bGwgdG8gQVAgcXVpY2tseSwKKwkJICogYnV0IGZpcnN0IG51bGwgaGF2ZSBjYXVzZSBBUCdzIHB1dCBsb3RzIG9mIHBhY2tldCB0byBodyB0eAorCQkgKiBidWZmZXIsIHRoZXNlIHBhY2tldCBtdXN0IGJlIHR4IGJlZm9yZSBvZmYgY2hhbm5lbCBzbyB3ZSBtdXN0CisJCSAqIGRlbGF5IG1vcmUgdGltZSB0byBsZXQgQVAgZmx1c2ggdGhlc2UgcGFja2V0cyBiZWZvcmUKKwkJICogb2ZmY2hhbm5lbCwgb3IgZGlzLWFzc29jaWF0aW9uIG9yIGRlbGV0ZSBCQSB3aWxsIGhhcHBlbiBieSBBUAorCQkgKi8KKwkJaWYgKHJ0bHByaXYtPm1hYzgwMjExLm9mZmNoYW5fZGVsZXkpIHsKKwkJCXJ0bHByaXYtPm1hYzgwMjExLm9mZmNoYW5fZGVsZXkgPSBmYWxzZTsKKwkJCW1kZWxheSg1MCk7CisJCX0KKworCQlydGxwaHktPmN1cnJlbnRfY2hhbm5lbCA9IHdpZGVfY2hhbjsKKworCQlydGxwcml2LT5jZmctPm9wcy0+c3dpdGNoX2NoYW5uZWwoaHcpOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2NoYW5uZWxfYWNjZXNzKGh3KTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9id19tb2RlKGh3LAorCQkJY2hhbm5lbF90eXBlKTsKKwl9CisKKwltdXRleF91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9vcF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgICAgdW5zaWduZWQgaW50ICpuZXdfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisKKwkqbmV3X2ZsYWdzICY9IFJUTF9TVVBQT1JURURfRklMVEVSUzsKKwlpZiAoMCA9PSBjaGFuZ2VkX2ZsYWdzKQorCQlyZXR1cm47CisKKwkvKlRPRE86IHdlIGRpc2FibGUgYnJvYWRjYXNlIG5vdywgc28gZW5hYmxlIGhlcmUgKi8KKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9BTExNVUxUSSkgeworCQlpZiAoKm5ld19mbGFncyAmIEZJRl9BTExNVUxUSSkgeworCQkJbWFjLT5yeF9jb25mIHw9IHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfUkNSX0FNXSB8CisJCQkgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19SQ1JfQUJdOworCQkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkJICgiRW5hYmxlIHJlY2VpdmUgbXVsdGljYXN0IGZyYW1lLlxuIikpOworCQl9IGVsc2UgeworCQkJbWFjLT5yeF9jb25mICY9IH4ocnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19SQ1JfQU1dIHwKKwkJCQkJICBydGxwcml2LT5jZmctPm1hcHNbTUFDX1JDUl9BQl0pOworCQkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkJICgiRGlzYWJsZSByZWNlaXZlIG11bHRpY2FzdCBmcmFtZS5cbiIpKTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0ZDU0ZBSUwpIHsKKwkJaWYgKCpuZXdfZmxhZ3MgJiBGSUZfRkNTRkFJTCkgeworCQkJbWFjLT5yeF9jb25mIHw9IHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfUkNSX0FDUkMzMl07CisJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCQkgKCJFbmFibGUgcmVjZWl2ZSBGQ1MgZXJyb3IgZnJhbWUuXG4iKSk7CisJCX0gZWxzZSB7CisJCQltYWMtPnJ4X2NvbmYgJj0gfnJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfUkNSX0FDUkMzMl07CisJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCQkgKCJEaXNhYmxlIHJlY2VpdmUgRkNTIGVycm9yIGZyYW1lLlxuIikpOworCQl9CisJfQorCisJLyogaWYgc3NpZCBub3Qgc2V0IHRvIGh3IGRvbid0IGNoZWNrIGJzc2lkCisJICogaGVyZSBqdXN0IHVzZWQgZm9yIGxpbmtlZCBzY2FubmluZywgJiBsaW5rZWQKKwkgKiBhbmQgbm9saW5rIGNoZWNrIGJzc2lkIGlzIHNldCBpbiBzZXQgbmV0d29ya190eXBlICovCisJaWYgKChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpICYmCisJCShtYWMtPmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSkgeworCQlpZiAobWFjLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJCW1hYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwkJCWlmICgqbmV3X2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Noa19ic3NpZChodywgZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Noa19ic3NpZChodywgdHJ1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKSB7CisJCWlmICgqbmV3X2ZsYWdzICYgRklGX0NPTlRST0wpIHsKKwkJCW1hYy0+cnhfY29uZiB8PSBydGxwcml2LT5jZmctPm1hcHNbTUFDX1JDUl9BQ0ZdOworCisJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCQkgKCJFbmFibGUgcmVjZWl2ZSBjb250cm9sIGZyYW1lLlxuIikpOworCQl9IGVsc2UgeworCQkJbWFjLT5yeF9jb25mICY9IH5ydGxwcml2LT5jZmctPm1hcHNbTUFDX1JDUl9BQ0ZdOworCQkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkJICgiRGlzYWJsZSByZWNlaXZlIGNvbnRyb2wgZnJhbWUuXG4iKSk7CisJCX0KKwl9CisKKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9PVEhFUl9CU1MpIHsKKwkJaWYgKCpuZXdfZmxhZ3MgJiBGSUZfT1RIRVJfQlNTKSB7CisJCQltYWMtPnJ4X2NvbmYgfD0gcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19SQ1JfQUFQXTsKKwkJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELAorCQkJCSAoIkVuYWJsZSByZWNlaXZlIG90aGVyIEJTUydzIGZyYW1lLlxuIikpOworCQl9IGVsc2UgeworCQkJbWFjLT5yeF9jb25mICY9IH5ydGxwcml2LT5jZmctPm1hcHNbTUFDX1JDUl9BQVBdOworCQkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0xPVUQsCisJCQkJICgiRGlzYWJsZSByZWNlaXZlIG90aGVyIEJTUydzIGZyYW1lLlxuIikpOworCQl9CisJfQorfQorc3RhdGljIGludCBydGxfb3Bfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWw9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeTsKKworCWlmIChzdGEpIHsKKwkJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKikgc3RhLT5kcnZfcHJpdjsKKwkJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5lbnRyeV9saXN0X2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZzdGFfZW50cnktPmxpc3QsICZydGxwcml2LT5lbnRyeV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmVudHJ5X2xpc3RfbG9jayk7CisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisJCQlpZiAoc3RhLT5zdXBwX3JhdGVzWzBdIDw9IDB4ZikKKwkJCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCQlpZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkID09IHRydWUpCisJCQkJc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzI0RzsKKworCQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisJCX0gZWxzZSBpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fNUcpIHsKKwkJCXN0YV9lbnRyeS0+d2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQTsKKwkJCWlmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQgPT0gdHJ1ZSkKKwkJCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fMjRHOworCisJCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQkJCXN0YV9lbnRyeS0+d2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQTsKKwkJfQorCQkvKmRpc2FibGUgY2NrIHJhdGUgZm9yIHAycCovCisJCWlmIChtYWMtPnAycCkKKwkJCXN0YS0+c3VwcF9yYXRlc1swXSAmPSAweGZmZmZmZmYwOworCisJCW1lbWNweShzdGFfZW50cnktPm1hY19hZGRyLCBzdGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0RNRVNHLAorCQkJKCJBZGQgc3RhIGFkZHIgaXMgJXBNXG4iLHN0YS0+YWRkcikpOworCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX3JhdGVfdGJsKGh3LCBzdGEsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bF9vcF9zdGFfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5OworCWlmIChzdGEpIHsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX0RNRVNHLAorCQkJKCJSZW1vdmUgc3RhIGFkZHIgaXMgJXBNXG4iLHN0YS0+YWRkcikpOworCQlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKSBzdGEtPmRydl9wcml2OworCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSAwOworCQlzdGFfZW50cnktPnJhdHJfaW5kZXggPSAwOworCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmVudHJ5X2xpc3RfbG9jayk7CisJCWxpc3RfZGVsKCZzdGFfZW50cnktPmxpc3QpOworCQlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZW50cnlfbGlzdF9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IF9ydGxfZ2V0X2hhbF9xbnVtKHUxNiBxdWV1ZSkKK3sKKwlpbnQgcW51bTsKKworCXN3aXRjaCAocXVldWUpIHsKKwljYXNlIDA6CisJCXFudW0gPSBBQzNfVk87CisJCWJyZWFrOworCWNhc2UgMToKKwkJcW51bSA9IEFDMl9WSTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlxbnVtID0gQUMwX0JFOworCQlicmVhazsKKwljYXNlIDM6CisJCXFudW0gPSBBQzFfQks7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXFudW0gPSBBQzBfQkU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcW51bTsKK30KKworLyoKKyAqZm9yIG1hYzgwMjExIFZPPTAsIFZJPTEsIEJFPTIsIEJLPTMKKyAqZm9yIHJ0bDgxOXggIEJFPTAsIEJLPTEsIFZJPTIsIFZPPTMKKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywyLDApKQorc3RhdGljIGludCBydGxfb3BfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAorCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW0pCisjZWxzZQorc3RhdGljIGludCBydGxfb3BfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IHF1ZXVlLAorCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW0pCisjZW5kaWYKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlpbnQgYWNpOworCisJaWYgKHF1ZXVlID49IEFDX01BWCkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJxdWV1ZSBudW1iZXIgJWQgaXMgaW5jb3JyZWN0IVxuIiwgcXVldWUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWNpID0gX3J0bF9nZXRfaGFsX3FudW0ocXVldWUpOworCW1hYy0+YWNbYWNpXS5haWZzID0gcGFyYW0tPmFpZnM7CisJbWFjLT5hY1thY2ldLmN3X21pbiA9IHBhcmFtLT5jd19taW47CisJbWFjLT5hY1thY2ldLmN3X21heCA9IHBhcmFtLT5jd19tYXg7CisJbWFjLT5hY1thY2ldLnR4X29wID0gcGFyYW0tPnR4b3A7CisJbWVtY3B5KCZtYWMtPmVkY2FfcGFyYW1bYWNpXSwgcGFyYW0sIHNpemVvZigqcGFyYW0pKTsKKwlydGxwcml2LT5jZmctPm9wcy0+c2V0X3FvcyhodywgYWNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsX29wX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAorCQkJCSAgICB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRscHJpdik7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworCWlmICgodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB8fAorCSAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB8fAorCSAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpKSB7CisJCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikgfHwKKwkJICAgIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQgJiYKKwkJICAgICBic3NfY29uZi0+ZW5hYmxlX2JlYWNvbikpIHsKKwkJCWlmIChtYWMtPmJlYWNvbl9lbmFibGVkID09IDApIHsKKwkJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfRE1FU0csCisJCQkJCSAoIkJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEIFxuIikpOworCisJCQkJLypzdGFydCBodyBiZWFjb24gaW50ZXJydXB0LiAqLworCQkJCS8qcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9iY25fcmVnKGh3KTsgKi8KKwkJCQltYWMtPmJlYWNvbl9lbmFibGVkID0gMTsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX2ludGVycnVwdF9tYXNrKGh3LAorCQkJCQkJcnRscHJpdi0+Y2ZnLT5tYXBzCisJCQkJCQlbUlRMX0lCU1NfSU5UX01BU0tTXSwgMCk7CisKKwkJCQlpZiAocnRscHJpdi0+Y2ZnLT5vcHMtPmxpbmtlZF9zZXRfcmVnKQorCQkJCQlydGxwcml2LT5jZmctPm9wcy0+bGlua2VkX3NldF9yZWcoaHcpOworCQkJfQorCQl9CisJCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEICYmCisJCQkhYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24pKXsKKwkJCWlmIChtYWMtPmJlYWNvbl9lbmFibGVkID09IDEpIHsKKwkJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfRE1FU0csCisJCQkJCSAoIkFESE9DIERJU0FCTEUgQkVBQ09OXG4iKSk7CisKKwkJCQltYWMtPmJlYWNvbl9lbmFibGVkID0gMDsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX2ludGVycnVwdF9tYXNrKGh3LCAwLAorCQkJCQkJcnRscHJpdi0+Y2ZnLT5tYXBzCisJCQkJCQlbUlRMX0lCU1NfSU5UX01BU0tTXSk7CisJCQl9CisJCX0KKwkJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UKSB7CisJCQlSVF9UUkFDRShDT01QX0JFQUNPTiwgREJHX1RSQUNFLAorCQkJCSAoIkJTU19DSEFOR0VEX0JFQUNPTl9JTlRcbiIpKTsKKwkJCW1hYy0+YmVhY29uX2ludGVydmFsID0gYnNzX2NvbmYtPmJlYWNvbl9pbnQ7CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Jjbl9pbnR2KGh3KTsKKwkJfQorCX0KKworCS8qVE9ETzogcmVmZXJlbmNlIHRvIGVudW0gaWVlZTgwMjExX2Jzc19jaGFuZ2UgKi8KKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0FTU09DKSB7CisJCWlmIChic3NfY29uZi0+YXNzb2MpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBOVUxMOworCQkJLyogd2Ugc2hvdWxkIHJlc2V0IGFsbCBzZWMgaW5mbyAmIGNhbQorCQkJICogYmVmb3JlIHNldCBjYW0gYWZ0ZXIgbGlua2VkLCB3ZSBzaG91bGQgbm90CisJCQkgKiByZXNldCBpbiBkaXNhc3NvYywgdGhhdCB3aWxsIGNhdXNlIHRraXAtPndlcAorCQkJICogZmFpbCBiZWNhdXNlIHNvbWUgZmxhZyB3aWxsIGJlIHdyb25nICovCisJCQkvKiByZXNldCBzZWMgaW5mbyAqLworCQkJcnRsX2NhbV9yZXNldF9zZWNfaW5mbyhodyk7CisJCQkvKiByZXNldCBjYW0gdG8gZml4IHdlcCBmYWlsIGlzc3VlCisJCQkgKiB3aGVuIGNoYW5nZSBmcm9tIHdwYSB0byB3ZXAgKi8KKwkJCXJ0bF9jYW1fcmVzZXRfYWxsX2VudHJ5KGh3KTsKKworCQkJbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTElOS0VEOworCQkJbWFjLT5jbnRfYWZ0ZXJfbGlua2VkID0gMDsKKwkJCW1hYy0+YXNzb2NfaWQgPSBic3NfY29uZi0+YWlkOworCQkJbWVtY3B5KG1hYy0+YnNzaWQsIGJzc19jb25mLT5ic3NpZCwgNik7CisKKwkJCWlmIChydGxwcml2LT5jZmctPm9wcy0+bGlua2VkX3NldF9yZWcpCisJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxpbmtlZF9zZXRfcmVnKGh3KTsKKworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKHZpZiwgKHU4Kilic3NfY29uZi0+YnNzaWQpOworCisJCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgc3RhKQorCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT51cGRhdGVfcmF0ZV90YmwoaHcsIHN0YSwgMCk7CisJCQlSVF9UUkFDRShDT01QX0VBU1lfQ09OQ1VSUkVOVCwgREJHX0xPVUQsCisJCQkJCSgic2VuZCBQUyBTVEFUSUMgZnJhbWUgXG4iKSk7CisJCQlpZiAocnRscHJpdi0+ZG0uc3VwcF9waHltb2RlX3N3aXRjaCkgeworCQkJCWlmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCisJCQkJCXJ0bF9zZW5kX3NtcHNfYWN0aW9uKGh3LCBzdGEsCisJCQkJCQkJSUVFRTgwMjExX1NNUFNfU1RBVElDKTsKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCisJCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfRE1FU0csCisJCQkJICgiQlNTX0NIQU5HRURfQVNTT0NcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYWMtPmxpbmtfc3RhdGUgPT0gTUFDODAyMTFfTElOS0VEKQorCQkJCXJ0bF9scHNfbGVhdmUoaHcpOworCQkJaWYgKHBwc2MtPnAycF9wc19pbmZvLnAycF9wc19tb2RlPiBQMlBfUFNfTk9ORSkKKwkJCQlydGxfcDJwX3BzX2NtZChodywgUDJQX1BTX0RJU0FCTEUpOworCQkJbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTk9MSU5LOworCQkJbWVtc2V0KG1hYy0+YnNzaWQsIDAsIDYpOworCQkJbWFjLT52ZW5kb3IgPSBQRUVSX1VOS05PV047CisKKwkJCWlmIChydGxwcml2LT5kbS5zdXBwX3BoeW1vZGVfc3dpdGNoKSB7CisJCQkJaWYgKHJ0bHByaXYtPmNmZy0+b3BzLT5jaGVja19zd2l0Y2hfdG9fZG1kcCkKKwkJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmNoZWNrX3N3aXRjaF90b19kbWRwKGh3KTsKKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19ETUVTRywKKwkJCQkgKCJCU1NfQ0hBTkdFRF9VTl9BU1NPQ1xuIikpOworCQl9CisJfQorCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfQ1RTX1BST1QpIHsKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX1RSQUNFLAorCQkJICgiQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UXG4iKSk7CisJCW1hYy0+dXNlX2N0c19wcm90ZWN0ID0gYnNzX2NvbmYtPnVzZV9jdHNfcHJvdDsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgeworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwKKwkJCSAoIkJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSB1c2Ugc2hvcnQgcHJlYW1ibGU6JXggXG4iLAorCQkJICBic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKSk7CisKKwkJbWFjLT5zaG9ydF9wcmVhbWJsZSA9IGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGU7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQUNLX1BSRUFNQkxFLAorCQkJCQkgICAgICAodTggKikgKCZtYWMtPnNob3J0X3ByZWFtYmxlKSk7CisJfQorCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfU0xPVCkgeworCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfVFJBQ0UsCisJCQkgKCJCU1NfQ0hBTkdFRF9FUlBfU0xPVFxuIikpOworCisJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3Nsb3QpCisJCQltYWMtPnNsb3RfdGltZSA9IFJUTF9TTE9UX1RJTUVfOTsKKwkJZWxzZQorCQkJbWFjLT5zbG90X3RpbWUgPSBSVExfU0xPVF9USU1FXzIwOworCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfU0xPVF9USU1FLAorCQkJCQkgICAgICAodTggKikgKCZtYWMtPnNsb3RfdGltZSkpOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CisKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX1RSQUNFLAorCQkJICgiQlNTX0NIQU5HRURfSFRcbiIpKTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsICh1OCopYnNzX2NvbmYtPmJzc2lkKTsKKwkJaWYgKHN0YSkgeworCQkJaWYgKHN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPgorCQkJICAgIG1hYy0+Y3VycmVudF9hbXBkdV9kZW5zaXR5KQorCQkJCW1hYy0+Y3VycmVudF9hbXBkdV9kZW5zaXR5ID0KKwkJCQkgICAgc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eTsKKwkJCWlmIChzdGEtPmh0X2NhcC5hbXBkdV9mYWN0b3IgPAorCQkJICAgIG1hYy0+Y3VycmVudF9hbXBkdV9mYWN0b3IpCisJCQkJbWFjLT5jdXJyZW50X2FtcGR1X2ZhY3RvciA9CisJCQkJICAgIHN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvcjsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX1NIT1JUR0lfREVOU0lUWSwKKwkJCQkJICAgICAgKHU4ICopICgmbWFjLT5tYXhfbXNzX2RlbnNpdHkpKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9BTVBEVV9GQUNUT1IsCisJCQkJCSAgICAgICZtYWMtPmN1cnJlbnRfYW1wZHVfZmFjdG9yKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0UsCisJCQkJCSAgICAgICZtYWMtPmN1cnJlbnRfYW1wZHVfZGVuc2l0eSk7CisJfQorCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgeworCQl1MzIgYmFzaWNfcmF0ZXM7CisJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBOVUxMOworCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQlNTSUQsCisJCQkJCSAgICAgICh1OCAqKSBic3NfY29uZi0+YnNzaWQpOworCisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19ETUVTRywKKwkJCSAoImJzc2lkOiAlcE1cbiIsIGJzc19jb25mLT5ic3NpZCkpOworCisJCW1hYy0+dmVuZG9yID0gUEVFUl9VTktOT1dOOworCQltZW1jcHkobWFjLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCA2KTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9uZXR3b3JrX3R5cGUoaHcsIHZpZi0+dHlwZSk7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCAodTgqKWJzc19jb25mLT5ic3NpZCk7CisJCWlmICghc3RhKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKSB7CisJCQltYWMtPm1vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhLT5zdXBwX3JhdGVzWzBdIDw9IDB4ZikKKwkJCQltYWMtPm1vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCQllbHNlCisJCQkJbWFjLT5tb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCQl9CisKKwkJaWYgKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkgeworCQkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpCisJCQkJbWFjLT5tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzI0RzsKKwkJCWVsc2UKKwkJCQltYWMtPm1vZGUgPSBXSVJFTEVTU19NT0RFX05fNUc7CisJCX0KKworCQkvKiBqdXN0IHN0YXRpb24gbmVlZCBpdCwgYmVjYXVzZSBpYnNzICYgYXAgbW9kZSB3aWxsCisJCSAqIHNldCBpbiBzdGFfYWRkLCBhbmQgd2lsbCBiZSBOVUxMIGhlcmUgKi8KKwkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCQlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnk7CisJCQlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKSBzdGEtPmRydl9wcml2OworCQkJc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlID0gbWFjLT5tb2RlOworCQl9CisKKwkJaWYgKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkgeworCQkJbWFjLT5odF9lbmFibGUgPSB0cnVlOworCisJCQkvKgorCQkJICogZm9yIGNpc2NvIDEyNTIgYncyMCBpdCdzIHdyb25nCisJCQkgKiBpZiAoaHRfY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApIHsKKwkJCSAqIAltYWMtPmJ3XzQwID0gdHJ1ZTsKKwkJCSAqIH0KKwkJCSAqICovCisJCX0KKworCQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSB7CisJCQkvKiBmb3IgNUcgbXVzdCA8PCBSQVRFXzZNX0lOREVYPTQsCisJCQkgKiBiZWNhdXNlIDVHIGhhdmUgbm8gY2NrIHJhdGUqLworCQkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKQorCQkJCWJhc2ljX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzWzFdIDw8IDQ7CisJCQllbHNlCisJCQkJYmFzaWNfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbMF07CisKKwkJCW1hYy0+YmFzaWNfcmF0ZXMgPSBiYXNpY19yYXRlczsKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQkFTSUNfUkFURSwKKwkJCQkJKHU4ICopICgmYmFzaWNfcmF0ZXMpKTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKwkvKgorCSAqIEZvciBGVyBMUFMgYW5kIEtlZXAgQWxpdmU6CisJICogVG8gdGVsbCBmaXJtd2FyZSB3ZSBoYXZlIGNvbm5lY3RlZAorCSAqIHRvIGFuIEFQLiBGb3IgOTJTRS9DRSBwb3dlciBzYXZlIHYyLgorCSAqLworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKKwkJaWYgKGJzc19jb25mLT5hc3NvYykgeworCQkJdTgga2VlcF9hbGl2ZSA9IDEwOworCQkJdTggbXN0YXR1cyA9IFJUX01FRElBX0NPTk5FQ1Q7CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9LRUVQX0FMSVZFLAorCQkJCQkJICAgICAgKHU4ICopICgma2VlcF9hbGl2ZSkpOworCisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9IMkNfRldfSk9JTkJTU1JQVCwKKwkJCQkJCSAgICAgICh1OCAqKSAoJm1zdGF0dXMpKTsKKwkJCXBwc2MtPnJlcG9ydF9saW5rZWQgPSB0cnVlOworCisJCX0gZWxzZSB7CisKKwkJCXU4IG1zdGF0dXMgPSBSVF9NRURJQV9ESVNDT05ORUNUOworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJCQkgICAgICBIV19WQVJfSDJDX0ZXX0pPSU5CU1NSUFQsCisJCQkJCQkgICAgICAodTggKikgKCZtc3RhdHVzKSk7CisJCQlwcHNjLT5yZXBvcnRfbGlua2VkID0gZmFsc2U7CisKKwkJfQorCisJCWlmIChydGxwcml2LT5jZmctPm9wcy0+Z2V0X2J0Y19zdGF0dXMoKSl7CisJCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX29wcy0+YnRjX21lZGlhc3RhdHVzX25vdGlmeSgKKwkJCQkJCXJ0bHByaXYsIHBwc2MtPnJlcG9ydF9saW5rZWQpOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywyLDApKQorc3RhdGljIHU2NCBydGxfb3BfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKKyNlbHNlCitzdGF0aWMgdTY0IHJ0bF9vcF9nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQorI2VuZGlmCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU2NCB0c2Y7CisKKwlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywgSFdfVkFSX0NPUlJFQ1RfVFNGLCAodTggKikgKCZ0c2YpKTsKKwlyZXR1cm4gdHNmOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDIsMCkpCitzdGF0aWMgdm9pZCBydGxfb3Bfc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU2NCB0c2YpCisjZWxzZQorc3RhdGljIHZvaWQgcnRsX29wX3NldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU2NCB0c2YpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwl1OCBiaWJzcyA9IChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgPyAxIDogMDsKKworCW1hYy0+dHNmID0gdHNmOworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQ09SUkVDVF9UU0YsICh1OCAqKSAoJmJpYnNzKSk7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMiwwKSkKK3N0YXRpYyB2b2lkIHJ0bF9vcF9yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCisjZWxzZQorc3RhdGljIHZvaWQgcnRsX29wX3Jlc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKKyNlbmRpZgoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB0bXAgPSAwOworCisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9EVUFMX1RTRl9SU1QsICh1OCAqKSAoJnRtcCkpOworfQorCitzdGF0aWMgdm9pZCBydGxfb3Bfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNUQV9OT1RJRllfU0xFRVA6CisJCWJyZWFrOworCWNhc2UgU1RBX05PVElGWV9BV0FLRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHJ0bF9vcF9hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzkpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkJCSAgICAgICAsdTggYnVmX3NpemUKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkJCSAgICAgICApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKKwkJUlRfVFJBQ0UoQ09NUF9NQUM4MDIxMSwgREJHX1RSQUNFLAorCQkJICgiSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOiBUSUQ6JWRcbiIsIHRpZCkpOworCQlyZXR1cm4gcnRsX3R4X2FnZ19zdGFydChodywgdmlmLCBzdGEsIHRpZCwgc3NuKTsKKwkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDksMCkpCisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9DT05UOgorCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0g6CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSF9DT05UOgorI2Vsc2UKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgorI2VuZGlmCisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19UUkFDRSwKKwkJCSAoIklFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOiBUSUQ6JWRcbiIsIHRpZCkpOworCQlyZXR1cm4gcnRsX3R4X2FnZ19zdG9wKGh3LCB2aWYsIHN0YSwgdGlkKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19UUkFDRSwKKwkJCSAoIklFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDpUSUQ6JWRcbiIsIHRpZCkpOworCQlydGxfdHhfYWdnX29wZXIoaHcsIHN0YSwgdGlkKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19UUkFDRSwKKwkJCSAoIklFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDpUSUQ6JWRcbiIsIHRpZCkpOworCQlyZXR1cm4gcnRsX3J4X2FnZ19zdGFydChodywgc3RhLCB0aWQpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOgorCQlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfVFJBQ0UsCisJCQkgKCJJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDpUSUQ6JWRcbiIsIHRpZCkpOworCQlyZXR1cm4gcnRsX3J4X2FnZ19zdG9wKGh3LCBzdGEsIHRpZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJJRUVFODAyMTFfQU1QRFVfRVJSISEhITpcbiIpKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsX29wX3N3X3NjYW5fc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisKKwlSVF9UUkFDRShDT01QX01BQzgwMjExLCBEQkdfTE9VRCwgKCJcbiIpKTsKKwltYWMtPmFjdF9zY2FubmluZyA9IHRydWU7CisJLypydGxwcml2LT5idGNvcHMtPmJ0Y19zY2FuX25vdGlmeShydGxwcml2LCAwKTsgKi8KKwlpZiAocnRscHJpdi0+bGlua19pbmZvLmJfaGlnaGVyX2J1c3l0cmFmZmljKSB7CisJCW1hYy0+c2tpcF9zY2FuID0gdHJ1ZTsKKwkJcmV0dXJuOworCX0KKworCWlmIChydGxwcml2LT5kbS5zdXBwX3BoeW1vZGVfc3dpdGNoKSB7CisJCWlmIChydGxwcml2LT5jZmctPm9wcy0+Y2hlY2tfc3dpdGNoX3RvX2RtZHApCisJCQlydGxwcml2LT5jZmctPm9wcy0+Y2hlY2tfc3dpdGNoX3RvX2RtZHAoaHcpOworCX0KKworCWlmIChtYWMtPmxpbmtfc3RhdGUgPT0gTUFDODAyMTFfTElOS0VEKSB7CisJCXJ0bF9scHNfbGVhdmUoaHcpOworCQltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9MSU5LRURfU0NBTk5JTkc7CisJfSBlbHNlIHsKKwkJcnRsX2lwc19uaWNfb24oaHcpOworCX0KKworCS8qIER1bCBtYWMgKi8KKwlydGxwcml2LT5ydGxoYWwuYl9sb2FkX2ltcmFuZGlxa19zZXR0aW5nX2ZvcjJnID0gZmFsc2U7CisKKwlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIExFRF9DVExfU0lURV9TVVJWRVkpOworCisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNjYW5fb3BlcmF0aW9uX2JhY2t1cChodywgU0NBTl9PUFRfQkFDS1VQX0JBTkQwKTsKKworfQorCitzdGF0aWMgdm9pZCBydGxfb3Bfc3dfc2Nhbl9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKworCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELCAoIlxuIikpOworCW1hYy0+YWN0X3NjYW5uaW5nID0gZmFsc2U7CisJbWFjLT5za2lwX3NjYW4gPSBmYWxzZTsKKwlpZiAocnRscHJpdi0+bGlua19pbmZvLmJfaGlnaGVyX2J1c3l0cmFmZmljKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBwMnAgd2lsbCB1c2UgMS82LzExIHRvIHNjYW4gKi8KKwlpZiAobWFjLT5uX2NoYW5uZWxzID09IDMpCisJCW1hYy0+cDJwX2luX3VzZSA9IHRydWU7CisJZWxzZQorCQltYWMtPnAycF9pbl91c2UgPSBmYWxzZTsKKwltYWMtPm5fY2hhbm5lbHMgPSAwOworCS8qIER1bCBtYWMgKi8KKwlydGxwcml2LT5ydGxoYWwuYl9sb2FkX2ltcmFuZGlxa19zZXR0aW5nX2ZvcjJnID0gZmFsc2U7CisKKwlpZiAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX0xJTktFRF9TQ0FOTklORykgeworCQltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9MSU5LRUQ7CisJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCQkvKiBmaXggZndscHMgaXNzdWUgKi8KKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfbmV0d29ya190eXBlKGh3LCBtYWMtPm9wbW9kZSk7CisJCX0KKwl9CisKKwlydGxwcml2LT5jZmctPm9wcy0+c2Nhbl9vcGVyYXRpb25fYmFja3VwKGh3LCBTQ0FOX09QVF9SRVNUT1JFKTsKKwkvKiBydGxwcml2LT5idGNvcHMtPmJ0Y19zY2FuX25vdGlmeShydGxwcml2LCAxKTsgKi8KK30KKworc3RhdGljIGludCBydGxfb3Bfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTgga2V5X3R5cGUgPSBOT19FTkNSWVBUSU9OOworCXU4IGtleV9pZHg7CisJYm9vbCBncm91cF9rZXkgPSBmYWxzZTsKKwlib29sIHdlcF9vbmx5ID0gZmFsc2U7CisJaW50IGVyciA9IDA7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IGJjYXN0X2FkZHJbRVRIX0FMRU5dID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisJdTggemVyb19hZGRyW0VUSF9BTEVOXSA9IHsgMCB9OworCisJaWYgKHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+c3dfY3J5cHRvIHx8IHJ0bHByaXYtPnNlYy51c2Vfc3dfc2VjKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoIm5vdCBvcGVuIGh3IGVuY3J5cHRpb25cbiIpKTsKKwkJcmV0dXJuIC1FTk9TUEM7CS8qVXNlciBkaXNhYmxlZCBIVy1jcnlwdG8gKi8KKwl9CisJLyogVG8gc3VwcG9ydCBJQlNTLCB1c2Ugc3ctY3J5cHRvIGZvciBHVEsgKi8KKwlpZigoKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgfHwKKwkgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSkgJiYKKwkgICAhKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkgKCIlcyBoYXJkd2FyZSBiYXNlZCBlbmNyeXB0aW9uIGZvciBrZXlpZHg6ICVkLCBtYWM6ICVwTVxuIiwKKwkJICBjbWQgPT0gU0VUX0tFWSA/ICJVc2luZyIgOiAiRGlzYWJsaW5nIiwga2V5LT5rZXlpZHgsCisJCSAgc3RhID8gc3RhLT5hZGRyIDogYmNhc3RfYWRkcikpOworCXJ0bHByaXYtPnNlYy5iZWluZ19zZXRrZXkgPSB0cnVlOworCXJ0bF9pcHNfbmljX29uKGh3KTsKKwltdXRleF9sb2NrKCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKKwkvKiA8MT4gZ2V0IGVuY3J5cHRpb24gYWxnICovCisKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykpCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQlrZXlfdHlwZSA9IFdFUDQwX0VOQ1JZUFRJT047CisJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csICgiYWxnOldFUDQwXG4iKSk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoImFsZzpXRVAxMDRcbiIpKTsKKwkJa2V5X3R5cGUgPSBXRVAxMDRfRU5DUllQVElPTjsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlrZXlfdHlwZSA9IFRLSVBfRU5DUllQVElPTjsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6VEtJUFxuIikpOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCWtleV90eXBlID0gQUVTQ0NNUF9FTkNSWVBUSU9OOworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoImFsZzpDQ01QXG4iKSk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6CisJCS8qIEhXIGRvbid0IHN1cHBvcnQgQ01BQyBlbmNyeXB0aW9uLAorCQkgKiB1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXB0aW9uICovCisJCWtleV90eXBlID0gQUVTQ01BQ19FTkNSWVBUSU9OOworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoImFsZzpDTUFDXG4iKSk7CisJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCisJCQkJKCJIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwaXRvbiwgIgorCQkJCSJ1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXBpdG9uXG4iKSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dF91bmxvY2s7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoImFsZ19lcnI6JXghISEhOlxuIiwga2V5LT5jaXBoZXIpKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbHNlCisJc3dpdGNoIChrZXktPmFsZykgeworCWNhc2UgQUxHX1dFUDoKKwkJaWYgKGtleS0+a2V5bGVuID09IFdMQU5fS0VZX0xFTl9XRVA0MCkgeworCQkJa2V5X3R5cGUgPSBXRVA0MF9FTkNSWVBUSU9OOworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6V0VQNDBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csCisJCQkJICgiYWxnOldFUDEwNFxuIikpOworCQkJa2V5X3R5cGUgPSBXRVAxMDRfRU5DUllQVElPTjsKKwkJfQorCQlicmVhazsKKwljYXNlIEFMR19US0lQOgorCQlrZXlfdHlwZSA9IFRLSVBfRU5DUllQVElPTjsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6VEtJUFxuIikpOworCQlicmVhazsKKwljYXNlIEFMR19DQ01QOgorCQlrZXlfdHlwZSA9IEFFU0NDTVBfRU5DUllQVElPTjsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6Q0NNUFxuIikpOworCQlicmVhazsKKwljYXNlIEFMR19BRVNfQ01BQzoKKwkJLypIVyBkb24ndCBzdXBwb3J0IENNQUMgZW5jcnlwdGlvbiwgdXNlIHNvZnR3YXJlIENNQUMgZW5jcnlwdGlvbiAqLworCQlrZXlfdHlwZSA9IEFFU0NNQUNfRU5DUllQVElPTjsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6Q01BQ1xuIikpOworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkJICgiSFcgZG9uJ3Qgc3VwcG9ydCBDTUFDIGVuY3J5cGl0b24sICIKKwkJCSAgInVzZSBzb2Z0d2FyZSBDTUFDIGVuY3J5cGl0b25cbiIpKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X3VubG9jazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiYWxnX2VycjoleCEhISE6XG4iLCBrZXktPmFsZykpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCWlmKGtleV90eXBlID09IFdFUDQwX0VOQ1JZUFRJT04gfHwKKwkJCWtleV90eXBlID09IFdFUDEwNF9FTkNSWVBUSU9OIHx8CisJCQl2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCXJ0bHByaXYtPnNlYy51c2VfZGVmYXVsdGtleSA9IHRydWU7CisKKwkvKiA8Mj4gZ2V0IGtleV9pZHggKi8KKwlrZXlfaWR4ID0gKHU4KSAoa2V5LT5rZXlpZHgpOworCWlmIChrZXlfaWR4ID4gMykKKwkJZ290byBvdXRfdW5sb2NrOworCS8qIDwzPiBpZiBwYWlyd2lzZSBrZXkgZW5hYmxlX2h3X3NlYyAqLworCWdyb3VwX2tleSA9ICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSk7CisKKwkvKiB3ZXAgYWx3YXlzIGJlIGdyb3VwIGtleSwgYnV0IHRoZXJlIGFyZSB0d28gY29uZGl0aW9uczoKKwkgKiAxKSB3ZXAgb25seTogaXMganVzdCBmb3Igd2VwIGVuYywgaW4gdGhpcyBjb25kaXRpb24KKwkgKiBydGxwcml2LT5zZWMucGFpcndpc2VfZW5jX2FsZ29yaXRobSA9PSBOT19FTkNSWVBUSU9OCisJICogd2lsbCBiZSB0cnVlICYgZW5hYmxlX2h3X3NlYyB3aWxsIGJlIHNldCB3aGVuIHdlcAorCSAqIGtlIHNldHRpbmcuCisJICogMikgd2VwKGdyb3VwKSArIEFFUyhwYWlyd2lzZSk6IHNvbWUgQVAgbGlrZSBjaXNjbworCSAqIG1heSB1c2UgaXQsIGluIHRoaXMgY29uZGl0aW9uIGVuYWJsZV9od19zZWMgd2lsbCBub3QKKwkgKiBiZSBzZXQgd2hlbiB3ZXAga2V5IHNldHRpbmcgKi8KKwkvKiB3ZSBtdXN0IHJlc2V0IHNlY19pbmZvIGFmdGVyIGxpbmdrZWQgYmVmb3JlIHNldCBrZXksCisJICogb3Igc29tZSBmbGFnIHdpbGwgYmUgd3JvbmcqLworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwkJaWYgKCFncm91cF9rZXkgfHwga2V5X3R5cGUgPT0gV0VQNDBfRU5DUllQVElPTiB8fAorCQkJa2V5X3R5cGUgPT0gV0VQMTA0X0VOQ1JZUFRJT04pIHsKKwkJCWlmIChncm91cF9rZXkpIHsKKwkJCQl3ZXBfb25seSA9IHRydWU7CisJCQl9CisJCQlydGxwcml2LT5jZmctPm9wcy0+ZW5hYmxlX2h3X3NlYyhodyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKCFncm91cF9rZXkpIHx8ICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHx8CisJICAgIAkgICAgcnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0gPT0gTk9fRU5DUllQVElPTikgeworCQkJaWYgKHJ0bHByaXYtPnNlYy5wYWlyd2lzZV9lbmNfYWxnb3JpdGhtID09CisJCQkgICAgTk9fRU5DUllQVElPTiAmJgorCQkgICAgCSAgIChrZXlfdHlwZSA9PSBXRVA0MF9FTkNSWVBUSU9OIHx8CisJCSAgICAJICAgIGtleV90eXBlID09IFdFUDEwNF9FTkNSWVBUSU9OKSkKKwkJCQl3ZXBfb25seSA9IHRydWU7CisJCQlydGxwcml2LT5zZWMucGFpcndpc2VfZW5jX2FsZ29yaXRobSA9IGtleV90eXBlOworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkgKCJzZXQgZW5hYmxlX2h3X3NlYywga2V5X3R5cGU6JXgoT1BFTjowIFdFUDQwOiIKKwkJCQkgICIxIFRLSVA6MiBBRVM6NCBXRVAxMDQ6NSlcbiIsIGtleV90eXBlKSk7CisJCQlydGxwcml2LT5jZmctPm9wcy0+ZW5hYmxlX2h3X3NlYyhodyk7CisJCX0KKwl9CisJLyogPDQ+IHNldCBrZXkgYmFzZWQgb24gY21kICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFVF9LRVk6CisJCWlmICh3ZXBfb25seSkgeworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkgKCJzZXQgV0VQKGdyb3VwL3BhaXJ3aXNlKSBrZXlcbiIpKTsKKwkJCS8qIFBhaXJ3aXNlIGtleSB3aXRoIGFuIGFzc2lnbmVkIE1BQyBhZGRyZXNzLiAqLworCQkJcnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0gPSBrZXlfdHlwZTsKKwkJCXJ0bHByaXYtPnNlYy5ncm91cF9lbmNfYWxnb3JpdGhtID0ga2V5X3R5cGU7CisJCQkvKnNldCBsb2NhbCBidWYgYWJvdXQgd2VwIGtleS4gKi8KKwkJCW1lbWNweShydGxwcml2LT5zZWMua2V5X2J1ZltrZXlfaWR4XSwKKwkJCSAgICAgICBrZXktPmtleSwga2V5LT5rZXlsZW4pOworCQkJcnRscHJpdi0+c2VjLmtleV9sZW5ba2V5X2lkeF0gPSBrZXktPmtleWxlbjsKKwkJCW1lbWNweShtYWNfYWRkciwgemVyb19hZGRyLCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoZ3JvdXBfa2V5KSB7CS8qIGdyb3VwIGtleSAqLworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkgKCJzZXQgZ3JvdXAga2V5XG4iKSk7CisJCQkvKiBncm91cCBrZXkgKi8KKwkJCXJ0bHByaXYtPnNlYy5ncm91cF9lbmNfYWxnb3JpdGhtID0ga2V5X3R5cGU7CisJCQkvKnNldCBsb2NhbCBidWYgYWJvdXQgZ3JvdXAga2V5LiAqLworCQkJbWVtY3B5KHJ0bHByaXYtPnNlYy5rZXlfYnVmW2tleV9pZHhdLAorCQkJICAgICAgIGtleS0+a2V5LCBrZXktPmtleWxlbik7CisJCQlydGxwcml2LT5zZWMua2V5X2xlbltrZXlfaWR4XSA9IGtleS0+a2V5bGVuOworCQkJbWVtY3B5KG1hY19hZGRyLCBiY2FzdF9hZGRyLCBFVEhfQUxFTik7CisJCX0gZWxzZSB7CS8qIHBhaXJ3aXNlIGtleSAqLworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkgKCJzZXQgcGFpcndpc2Uga2V5XG4iKSk7CisJCQlpZiAoIXN0YSkgeworCQkJCVJUX0FTU0VSVChmYWxzZSwgKCJwYWlyd2lzZSBrZXkgd2l0aG5vdCIKKwkJCQkJCSAgIm1hY19hZGRyXG4iKSk7CisKKwkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCQkvKiBQYWlyd2lzZSBrZXkgd2l0aCBhbiBhc3NpZ25lZCBNQUMgYWRkcmVzcy4gKi8KKwkJCXJ0bHByaXYtPnNlYy5wYWlyd2lzZV9lbmNfYWxnb3JpdGhtID0ga2V5X3R5cGU7CisJCQkvKnNldCBsb2NhbCBidWYgYWJvdXQgcGFpcndpc2Uga2V5LiAqLworCQkJbWVtY3B5KHJ0bHByaXYtPnNlYy5rZXlfYnVmW1BBSVJXSVNFX0tFWUlEWF0sCisJCQkgICAgICAga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwkJCXJ0bHByaXYtPnNlYy5rZXlfbGVuW1BBSVJXSVNFX0tFWUlEWF0gPSBrZXktPmtleWxlbjsKKwkJCXJ0bHByaXYtPnNlYy5wYWlyd2lzZV9rZXkgPQorCQkJICAgIHJ0bHByaXYtPnNlYy5rZXlfYnVmW1BBSVJXSVNFX0tFWUlEWF07CisJCQltZW1jcHkobWFjX2FkZHIsIHN0YS0+YWRkciwgRVRIX0FMRU4pOworCQl9CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfa2V5KGh3LCBrZXlfaWR4LCBtYWNfYWRkciwKKwkJCQkJICAgZ3JvdXBfa2V5LCBrZXlfdHlwZSwgd2VwX29ubHksCisJCQkJCSAgIGZhbHNlKTsKKwkJLyogPDU+IHRlbGwgbWFjODAyMTEgZG8gc29tZXRoaW5nOiAqLworCQkvKm11c3QgdXNlIHN3IGdlbmVyYXRlIElWLCBvciBjYW4gbm90IHdvcmsgISEhIS4gKi8KKwkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisJCWtleS0+aHdfa2V5X2lkeCA9IGtleV9pZHg7CisJCWlmIChrZXlfdHlwZSA9PSBUS0lQX0VOQ1JZUFRJT04pCisJCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOworCQkvKnVzZSBzb2Z0d2FyZSBDQ01QIGVuY3J5cHRpb24gZm9yIG1hbmFnZW1lbnQgZnJhbWVzIChNRlApICovCisJCWlmIChrZXlfdHlwZSA9PSBBRVNDQ01QX0VOQ1JZUFRJT04pCisJCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkJICgiZGlzYWJsZSBrZXkgZGVsZXRlIG9uZSBlbnRyeVxuIikpOworCQkvKnNldCBsb2NhbCBidWYgYWJvdXQgd2VwIGtleS4gKi8KKwkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQkJdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwkJCWlmIChzdGEpCisJCQkJcnRsX2NhbV9kZWxfZW50cnkoaHcsIHN0YS0+YWRkcik7CisJCX0KKwkJbWVtc2V0KHJ0bHByaXYtPnNlYy5rZXlfYnVmW2tleV9pZHhdLCAwLCBrZXktPmtleWxlbik7CisJCXJ0bHByaXYtPnNlYy5rZXlfbGVuW2tleV9pZHhdID0gMDsKKwkJbWVtY3B5KG1hY19hZGRyLCB6ZXJvX2FkZHIsIEVUSF9BTEVOKTsKKwkJLyoKKwkJICptYWM4MDIxMSB3aWxsIGRlbGV0ZSBlbnRyeXMgb25lIGJ5IG9uZSwKKwkJICpzbyBkb24ndCB1c2UgcnRsX2NhbV9yZXNldF9hbGxfZW50cnkKKwkJICpvciBjbGVhciBhbGwgZW50cnkgaGVyZS4KKwkJICovCisJCXJ0bF9jYW1fZGVsZXRlX29uZV9lbnRyeShodywgbWFjX2FkZHIsIGtleV9pZHgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiY21kX2VycjoleCEhISE6XG4iLCBjbWQpKTsKKwl9CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcnRscHJpdi0+bG9ja3MuY29uZl9tdXRleCk7CisJcnRscHJpdi0+c2VjLmJlaW5nX3NldGtleSA9IGZhbHNlOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9vcF9yZmtpbGxfcG9sbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlib29sIHJhZGlvX3N0YXRlOworCWJvb2wgYmxvY2tlZDsKKwl1OCB2YWxpZCA9IDA7CisKKwlpZiAoIXRlc3RfYml0KFJUTF9TVEFUVVNfSU5URVJGQUNFX1NUQVJULCAmcnRscHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MuY29uZl9tdXRleCk7CisKKwkvKmlmIFJhZGlvIE9uIHJldHVybiB0cnVlIGhlcmUgKi8KKwlyYWRpb19zdGF0ZSA9IHJ0bHByaXYtPmNmZy0+b3BzLT5yYWRpb19vbm9mZl9jaGVja2luZyhodywgJnZhbGlkKTsKKworCWlmICh2YWxpZCkgeworCQlpZiAodW5saWtlbHkocmFkaW9fc3RhdGUgIT0gcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSkpIHsKKwkJCXJ0bHByaXYtPnJma2lsbC5yZmtpbGxfc3RhdGUgPSByYWRpb19zdGF0ZTsKKworCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCSAoS0VSTl9JTkZPICJ3aXJlbGVzcyByYWRpbyBzd2l0Y2ggdHVybmVkICVzXG4iLAorCQkJCSAgcmFkaW9fc3RhdGUgPyAib24iIDogIm9mZiIpKTsKKworCQkJYmxvY2tlZCA9IChydGxwcml2LT5yZmtpbGwucmZraWxsX3N0YXRlID09IDEpID8gMCA6IDE7CisJCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGh3LT53aXBoeSwgYmxvY2tlZCk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBtYWM4MDIxMSB0byBmbHVzaCB0eCBidWZmZXIKKyAqIGJlZm9yZSBzd2l0Y2ggY2hhbm5sZSBvciBwb3dlciBzYXZlLCBvciB0eCBidWZmZXIgcGFja2V0CisgKiBtYXliZSBzZW5kIGFmdGVyIG9mZmNoYW5uZWwgb3IgcmYgc2xlZXAsIHRoaXMgbWF5IGNhdXNlCisgKiBkaXMtYXNzb2NpYXRpb24gYnkgQVAgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCitzdGF0aWMgdm9pZCBydGxfb3BfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAocnRscHJpdi0+aW50Zl9vcHMtPmZsdXNoKQorCQlydGxwcml2LT5pbnRmX29wcy0+Zmx1c2goaHcsIHF1ZXVlcywgZHJvcCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcnRsX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJaWYgKHJ0bHByaXYtPmludGZfb3BzLT5mbHVzaCkKKwkJcnRscHJpdi0+aW50Zl9vcHMtPmZsdXNoKGh3LCBkcm9wKTsKK30KKyNlbmRpZgorCitjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBydGxfb3BzID0geworCS5zdGFydCA9IHJ0bF9vcF9zdGFydCwKKwkuc3RvcCA9IHJ0bF9vcF9zdG9wLAorCS50eCA9IHJ0bF9vcF90eCwKKwkuYWRkX2ludGVyZmFjZSA9IHJ0bF9vcF9hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlID0gcnRsX29wX3JlbW92ZV9pbnRlcmZhY2UsCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkuY2hhbmdlX2ludGVyZmFjZSA9IHJ0bF9vcF9jaGFuZ2VfaW50ZXJmYWNlLAorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCS5jb25maWcgPSBydGxfb3BfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyID0gcnRsX29wX2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF9rZXkgPSBydGxfb3Bfc2V0X2tleSwKKwkuY29uZl90eCA9IHJ0bF9vcF9jb25mX3R4LAorCS5ic3NfaW5mb19jaGFuZ2VkID0gcnRsX29wX2Jzc19pbmZvX2NoYW5nZWQsCisJLmdldF90c2YgPSBydGxfb3BfZ2V0X3RzZiwKKwkuc2V0X3RzZiA9IHJ0bF9vcF9zZXRfdHNmLAorCS5yZXNldF90c2YgPSBydGxfb3BfcmVzZXRfdHNmLAorCS5zdGFfbm90aWZ5ID0gcnRsX29wX3N0YV9ub3RpZnksCisJLmFtcGR1X2FjdGlvbiA9IHJ0bF9vcF9hbXBkdV9hY3Rpb24sCisJLnN3X3NjYW5fc3RhcnQgPSBydGxfb3Bfc3dfc2Nhbl9zdGFydCwKKwkuc3dfc2Nhbl9jb21wbGV0ZSA9IHJ0bF9vcF9zd19zY2FuX2NvbXBsZXRlLAorCS5yZmtpbGxfcG9sbCA9IHJ0bF9vcF9yZmtpbGxfcG9sbCwKKwkuc3RhX2FkZCA9IHJ0bF9vcF9zdGFfYWRkLAorCS5zdGFfcmVtb3ZlID0gcnRsX29wX3N0YV9yZW1vdmUsCisJLmZsdXNoID0gcnRsX29wX2ZsdXNoLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNDdkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMX0NPUkVfSF9fCisjZGVmaW5lIF9fUlRMX0NPUkVfSF9fCisKKyNkZWZpbmUgUlRMX1NVUFBPUlRFRF9GSUxURVJTCQlcCisJKEZJRl9QUk9NSVNDX0lOX0JTUyB8IFwKKwlGSUZfQUxMTVVMVEkgfCBGSUZfQ09OVFJPTCB8IFwKKwlGSUZfT1RIRVJfQlNTIHwgXAorCUZJRl9GQ1NGQUlMIHwgXAorCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCisjZGVmaW5lIFJUTF9TVVBQT1JURURfQ1RSTF9GSUxURVIJMHhGRgorCitleHRlcm4gY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgcnRsX29wczsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDUxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmMKQEAgLTAsMCArMSw5ODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRtaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0bWlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAid2lmaS5oIgorI2luY2x1ZGUgImNhbS5oIgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorI2RlZmluZSBHRVRfSU5PREVfREFUQShfX25vZGUpCQlQREVfREFUQShfX25vZGUpCisjZWxzZQorI2RlZmluZSBHRVRfSU5PREVfREFUQShfX25vZGUpCQlQREUoX19ub2RlKS0+ZGF0YQorI2VuZGlmCisKKwordm9pZCBydGxfZGJncF9mbGFnX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGk7CisKKwlydGxwcml2LT5kYmcuZ2xvYmFsX2RlYnVnbGV2ZWwgPSBEQkdfRE1FU0c7CisKKwlydGxwcml2LT5kYmcuZ2xvYmFsX2RlYnVnY29tcG9uZW50cyA9CisJCUNPTVBfRVJSIHwKKwkJQ09NUF9GVyB8CisJCUNPTVBfSU5JVCB8CisJCUNPTVBfUkVDViB8CisJCUNPTVBfU0VORCB8CisJICAJQ09NUF9NTE1FIHwKKwkgIAlDT01QX1NDQU4gfAorCSAgCUNPTVBfSU5UUiB8CisJICAJQ09NUF9MRUQgfAorCSAgCUNPTVBfU0VDIHwKKwkgIAlDT01QX0JFQUNPTiB8CisJICAJQ09NUF9SQVRFIHwKKwkgIAlDT01QX1JYREVTQyB8CisJICAJQ09NUF9ESUcgfAorCSAgCUNPTVBfVFhBR0MgfAorCQlDT01QX1BPV0VSIHwKKwkgIAlDT01QX1BPV0VSX1RSQUNLSU5HIHwKKwkgIAlDT01QX0JCX1BPV0VSU0FWSU5HIHwKKwkgIAlDT01QX1NXQVMgfAorCSAgCUNPTVBfUkYgfAorCSAgCUNPTVBfVFVSQk8gfAorCSAgCUNPTVBfUkFUUiB8CisJICAJQ09NUF9DTUQgfAorCSAgCUNPTVBfRUFTWV9DT05DVVJSRU5UIHwKKwkgIAlDT01QX0VGVVNFIHwKKwkgIAlDT01QX1FPUyB8IENPTVBfTUFDODAyMTEgfCBDT01QX1JFR0QgfAorCQlDT01QX0NIQU4gfAorCQlDT01QX0JUX0NPRVhJU1QgfAorCQlDT01QX0lRSyB8CisJCTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgREJHUF9UWVBFX01BWDsgaSsrKQorCQlydGxwcml2LT5kYmcuZGJncF90eXBlW2ldID0gMDsKKworCS8qSW5pdCBEZWJ1ZyBmbGFnIGVuYWJsZSBjb25kaXRpb24gKi8KK30KKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3RvcGRpcjsKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X21hY18wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCBpLCBuLCBwYWdlOworCWludCBtYXggPSAweGZmOworCXBhZ2UgPSAweDAwMDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbiArIHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgaSsrLCBuICs9IDQpCisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAgICAiLAorCQkJCSAgIHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIChwYWdlIHwgbikpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX21hY18wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfbWFjXzAsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX21hY18wID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX21hY18wLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfbWFjXzEoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4MTAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgKHBhZ2UgfCBuKSkpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fbWFjXzEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9tYWNfMSwgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfbWFjXzEgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fbWFjXzEsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9tYWNfMihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgaSwgbiwgcGFnZTsKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlID0gMHgyMDA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDsgKSB7CisJCXNlcV9wcmludGYobSwgIlxuJTguOHggICIsIG4gKyBwYWdlKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IGkrKywgbiArPSA0KQorCQkJc2VxX3ByaW50ZihtLCAiJTguOHggICAgIiwKKwkJCQkgICBydGxfcmVhZF9kd29yZChydGxwcml2LCAocGFnZSB8IG4pKSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9tYWNfMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X21hY18yLCBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19tYWNfMiA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9tYWNfMiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X21hY18zKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCBpLCBuLCBwYWdlOworCWludCBtYXggPSAweGZmOworCXBhZ2UgPSAweDMwMDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbiArIHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgaSsrLCBuICs9IDQpCisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAgICAiLAorCQkJCSAgIHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIChwYWdlIHwgbikpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX21hY18zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfbWFjXzMsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX21hY18zID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX21hY18zLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfbWFjXzQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4NDAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgKHBhZ2UgfCBuKSkpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fbWFjXzQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9tYWNfNCwgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfbWFjXzQgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fbWFjXzQsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9tYWNfNShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgaSwgbiwgcGFnZTsKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlID0gMHg1MDA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDsgKSB7CisJCXNlcV9wcmludGYobSwgIlxuJTguOHggICIsIG4gKyBwYWdlKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IGkrKywgbiArPSA0KQorCQkJc2VxX3ByaW50ZihtLCAiJTguOHggICAgIiwKKwkJCQkgICBydGxfcmVhZF9kd29yZChydGxwcml2LCAocGFnZSB8IG4pKSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9tYWNfNShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X21hY181LCBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19tYWNfNSA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9tYWNfNSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X21hY182KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCBpLCBuLCBwYWdlOworCWludCBtYXggPSAweGZmOworCXBhZ2UgPSAweDYwMDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbiArIHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgaSsrLCBuICs9IDQpCisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAgICAiLAorCQkJCSAgIHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIChwYWdlIHwgbikpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX21hY182KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfbWFjXzYsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX21hY182ID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX21hY182LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfbWFjXzcoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4NzAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgKHBhZ2UgfCBuKSkpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fbWFjXzcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9tYWNfNywgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfbWFjXzcgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fbWFjXzcsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9iYl84KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4ODAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX2dldF9iYnJlZyhodywgKHBhZ2UgfCBuKSwgMHhmZmZmZmZmZikpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fYmJfOChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X2JiXzgsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX2JiXzggPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fYmJfOCwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X2JiXzkoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlpbnQgaSwgbiwgcGFnZTsKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlID0gMHg5MDA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDsgKSB7CisJCXNlcV9wcmludGYobSwgIlxuJTguOHggICIsIG4gKyBwYWdlKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IGkrKywgbiArPSA0KQorCQkJc2VxX3ByaW50ZihtLCAiJTguOHggICAgIiwKKwkJCQkgICBydGxfZ2V0X2JicmVnKGh3LCAocGFnZSB8IG4pLCAweGZmZmZmZmZmKSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9iYl85KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfYmJfOSwgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfYmJfOSA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9iYl85LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfYmJfYShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCWludCBpLCBuLCBwYWdlOworCWludCBtYXggPSAweGZmOworCXBhZ2UgPSAweGEwMDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbiArIHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgaSsrLCBuICs9IDQpCisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAgICAiLAorCQkJCSAgIHJ0bF9nZXRfYmJyZWcoaHcsIChwYWdlIHwgbiksIDB4ZmZmZmZmZmYpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX2JiX2Eoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9iYl9hLCBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19iYl9hID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX2JiX2EsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9iYl9iKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4YjAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX2dldF9iYnJlZyhodywgKHBhZ2UgfCBuKSwgMHhmZmZmZmZmZikpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fYmJfYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X2JiX2IsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX2JiX2IgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fYmJfYiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X2JiX2Moc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlpbnQgaSwgbiwgcGFnZTsKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlID0gMHhjMDA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDsgKSB7CisJCXNlcV9wcmludGYobSwgIlxuJTguOHggICIsIG4gKyBwYWdlKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IGkrKywgbiArPSA0KQorCQkJc2VxX3ByaW50ZihtLCAiJTguOHggICAgIiwKKwkJCQkgICBydGxfZ2V0X2JicmVnKGh3LCAocGFnZSB8IG4pLCAweGZmZmZmZmZmKSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9iYl9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfYmJfYywgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfYmJfYyA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9iYl9jLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfYmJfZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCWludCBpLCBuLCBwYWdlOworCWludCBtYXggPSAweGZmOworCXBhZ2UgPSAweGQwMDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbiArIHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgaSsrLCBuICs9IDQpCisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAgICAiLAorCQkJCSAgIHJ0bF9nZXRfYmJyZWcoaHcsIChwYWdlIHwgbiksIDB4ZmZmZmZmZmYpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX2JiX2Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9iYl9kLCBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19iYl9kID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX2JiX2QsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9iYl9lKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IG0tPnByaXZhdGU7CisJaW50IGksIG4sIHBhZ2U7CisJaW50IG1heCA9IDB4ZmY7CisJcGFnZSA9IDB4ZTAwOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlzZXFfcHJpbnRmKG0sICJcbiU4Ljh4ICAiLCBuICsgcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBpKyssIG4gKz0gNCkKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX2dldF9iYnJlZyhodywgKHBhZ2UgfCBuKSwgMHhmZmZmZmZmZikpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fYmJfZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X2JiX2UsIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX2JiX2UgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fYmJfZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnRsX3Byb2NfZ2V0X2JiX2Yoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlpbnQgaSwgbiwgcGFnZTsKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlID0gMHhmMDA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDsgKSB7CisJCXNlcV9wcmludGYobSwgIlxuJTguOHggICIsIG4gKyBwYWdlKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IGkrKywgbiArPSA0KQorCQkJc2VxX3ByaW50ZihtLCAiJTguOHggICAgIiwKKwkJCQkgICBydGxfZ2V0X2JicmVnKGh3LCAocGFnZSB8IG4pLCAweGZmZmZmZmZmKSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9iYl9mKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfYmJfZiwgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfYmJfZiA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9iYl9mLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfcmVnX3JmX2Eoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlpbnQgaSwgbjsKKwlpbnQgbWF4ID0gMHg0MDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDEsIGkrKykKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIG4sIDB4ZmZmZmZmZmYpKTsKKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX3JmX2Eoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9yZWdfcmZfYSwgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfcmZfYSA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9yZl9hLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfcmVnX3JmX2Ioc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlpbnQgaSwgbjsKKwlpbnQgbWF4ID0gMHg0MDsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4OyApIHsKKwkJc2VxX3ByaW50ZihtLCAiXG4lOC44eCAgIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDEsIGkrKykKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICAgICIsCisJCQkJICAgcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0IsIG4sCisJCQkJICAgCQkgMHhmZmZmZmZmZikpOworCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fcmZfYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X3JlZ19yZl9iLCBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19yZl9iID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX3JmX2IsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9jYW1fcmVnaXN0ZXJfMShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgdGFyZ2V0X2NtZCA9IDA7CisJdTMyIHRhcmdldF92YWw9MDsKKwl1OCBlbnRyeV9pPTA7CisJdTMyIHVsc3RhdHVzOworCWludCBpID0gMTAwLCBqID0gMDsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJc2VxX3B1dHMobSwKKwkgICAgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0VDVVJJVFkgQ0FNICgwLTEwKSAjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKworCWZvciAoaiA9IDA7IGogPCAxMTsgaisrKSB7CisJCXNlcV9wcmludGYobSwgIlxuRDogICUyeCA+ICIsIGopOworCSAJZm9yIChlbnRyeV9pID0gMDsgZW50cnlfaSA8IENBTV9DT05URU5UX0NPVU5UOyBlbnRyeV9pKyspIHsKKwkgICAJCS8qIHBvbGxpbmcgYml0LCBhbmQgTm8gV3JpdGUgZW5hYmxlLCBhbmQgYWRkcmVzcyAgKi8KKwkJCXRhcmdldF9jbWQgPSBlbnRyeV9pICsgQ0FNX0NPTlRFTlRfQ09VTlQgKiBqOworCQkJdGFyZ2V0X2NtZCA9IHRhcmdldF9jbWQgfCBCSVQoMzEpOworCisJCQkvKiBDaGVjayBwb2xsaW5nIGJpdCBpcyBjbGVhciAqLworCQkJd2hpbGUgKChpLS0pID49IDApIHsKKwkJCQl1bHN0YXR1cyA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsCisJCQkJCQlydGxwcml2LT5jZmctPm1hcHNbUldDQU1dKTsKKwkJCQlpZiAodWxzdGF0dXMgJiBCSVQoMzEpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCSAgCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW1JXQ0FNXSwKKwkJCQkJdGFyZ2V0X2NtZCk7CisJICAJIAl0YXJnZXRfdmFsID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwKKwkJCQkJCSAgICBydGxwcml2LT5jZmctPm1hcHNbUkNBTU9dKTsKKwkJCXNlcV9wcmludGYobSwgIiU4Ljh4ICIsIHRhcmdldF92YWwpOworCSAJfQorCX0KKwlzZXFfcHV0cyhtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbF9wcm9jX29wZW5fY2FtXzEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0bF9wcm9jX2dldF9jYW1fcmVnaXN0ZXJfMSwKKwkJCSAgIEdFVF9JTk9ERV9EQVRBKGlub2RlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVfb3BzX2NhbV8xID0geworCS5vcGVuID0gZGxfcHJvY19vcGVuX2NhbV8xLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBydGxfcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIHRhcmdldF9jbWQgPSAwOworCXUzMiB0YXJnZXRfdmFsID0gMDsKKwl1OCBlbnRyeV9pID0gMDsKKwl1MzIgdWxzdGF0dXM7CisJaW50IGkgPSAxMDAsIGogPSAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlzZXFfcHV0cyhtLAorCSAgICAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIFNFQ1VSSVRZIENBTSAoMTEtMjEpICMjIyMjIyMjIyMjIyMjIyMjI1xuICIpOworCisJZm9yIChqID0gMTE7IGogPCAyMjsgaisrKSB7CisJCXNlcV9wcmludGYobSwgIlxuRDogICUyeCA+ICIsIGopOworCSAJZm9yIChlbnRyeV9pID0gMDsgZW50cnlfaSA8IENBTV9DT05URU5UX0NPVU5UOyBlbnRyeV9pKyspIHsKKwkJCXRhcmdldF9jbWQgPSBlbnRyeV9pICsgQ0FNX0NPTlRFTlRfQ09VTlQgKiBqOworCQkJdGFyZ2V0X2NtZCA9IHRhcmdldF9jbWQgfCBCSVQoMzEpOworCisJCQl3aGlsZSAoKGktLSkgPj0gMCkgeworCQkJCXVsc3RhdHVzID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwKKwkJCQkJCXJ0bHByaXYtPmNmZy0+bWFwc1tSV0NBTV0pOworCQkJCWlmICh1bHN0YXR1cyAmIEJJVCgzMSkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJICAJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbUldDQU1dLAorCQkJCQl0YXJnZXRfY21kKTsKKwkgIAkgCXRhcmdldF92YWwgPSBydGxfcmVhZF9kd29yZChydGxwcml2LAorCQkJCQkJICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tSQ0FNT10pOworCQkJc2VxX3ByaW50ZihtLCAiJTguOHggIiwgdGFyZ2V0X3ZhbCk7CisJIAl9CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl9jYW1fMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRsX3Byb2NfZ2V0X2NhbV9yZWdpc3Rlcl8yLAorCQkJICAgR0VUX0lOT0RFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZV9vcHNfY2FtXzIgPSB7CisJLm9wZW4gPSBkbF9wcm9jX29wZW5fY2FtXzIsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ0bF9wcm9jX2dldF9jYW1fcmVnaXN0ZXJfMyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBtLT5wcml2YXRlOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgdGFyZ2V0X2NtZCA9IDA7CisJdTMyIHRhcmdldF92YWwgPSAwOworCXU4IGVudHJ5X2kgPSAwOworCXUzMiB1bHN0YXR1czsKKwlpbnQgaSA9IDEwMCwgaiA9IDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCXNlcV9wdXRzKG0sCisJICAgICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMgU0VDVVJJVFkgQ0FNICgyMi0zMSkgIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisKKwlmb3IgKGogPSAyMjsgaiA8IFRPVEFMX0NBTV9FTlRSWTsgaisrKSB7CisJCXNlcV9wcmludGYobSwgIlxuRDogICUyeCA+ICIsIGopOworCSAJZm9yIChlbnRyeV9pID0gMDsgZW50cnlfaSA8IENBTV9DT05URU5UX0NPVU5UOyBlbnRyeV9pKyspIHsKKwkJCXRhcmdldF9jbWQgPSBlbnRyeV9pK0NBTV9DT05URU5UX0NPVU5UKmo7CisJCQl0YXJnZXRfY21kID0gdGFyZ2V0X2NtZCB8IEJJVCgzMSk7CisKKwkJCXdoaWxlICgoaS0tKSA+PSAwKSB7CisJCQkJdWxzdGF0dXMgPSBydGxfcmVhZF9kd29yZChydGxwcml2LAorCQkJCQkJcnRscHJpdi0+Y2ZnLT5tYXBzW1JXQ0FNXSk7CisJCQkJaWYgKHVsc3RhdHVzICYgQklUKDMxKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkgIAkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tSV0NBTV0sCisJCQkJCXRhcmdldF9jbWQpOworCSAgCSAJdGFyZ2V0X3ZhbCA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsCisJCQkJCQkgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW1JDQU1PXSk7CisJCQlzZXFfcHJpbnRmKG0sICIlOC44eCAiLCB0YXJnZXRfdmFsKTsKKwkgCX0KKwl9CisJc2VxX3B1dHMobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGxfcHJvY19vcGVuX2NhbV8zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBydGxfcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzMsCisJCQkgICBHRVRfSU5PREVfREFUQShpbm9kZSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWxlX29wc19jYW1fMyA9IHsKKwkub3BlbiA9IGRsX3Byb2Nfb3Blbl9jYW1fMywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3ZvaWQgcnRsX3Byb2NfYWRkX29uZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJc25wcmludGYocnRscHJpdi0+ZGJnLnByb2NfbmFtZSwgMTgsICIleC0leC0leC0leC0leC0leCIsCisJCXJ0bGVmdXNlLT5kZXZfYWRkclswXSwgcnRsZWZ1c2UtPmRldl9hZGRyWzFdLAorCQlydGxlZnVzZS0+ZGV2X2FkZHJbMl0sIHJ0bGVmdXNlLT5kZXZfYWRkclszXSwKKwkJcnRsZWZ1c2UtPmRldl9hZGRyWzRdLCBydGxlZnVzZS0+ZGV2X2FkZHJbNV0pOworCisJcnRscHJpdi0+ZGJnLnByb2NfZGlyID0gcHJvY19ta2RpcihydGxwcml2LT5kYmcucHJvY19uYW1lLCBwcm9jX3RvcGRpcik7CisJaWYgKCFydGxwcml2LT5kYmcucHJvY19kaXIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRU1FUkcsICgiVW5hYmxlIHRvIGluaXQgIgorCQkJIi9wcm9jL25ldC8lcy8lc1xuIiwgcnRscHJpdi0+Y2ZnLT5uYW1lLAorCQkJcnRscHJpdi0+ZGJnLnByb2NfbmFtZSkpOworCQlyZXR1cm47CisJfQorCisJZW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKCJtYWMtMCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfbWFjXzAsIGh3KTsKKwlpZiAoIWVudHJ5KQorCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19FTUVSRywKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtMFxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy0xIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY18xLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtMVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy0yIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY18yLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtMlxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy0zIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY18zLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtM1xuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy00IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY180LCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtNFxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy01IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY181LCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtNVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy02IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY182LCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtNlxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoIm1hYy03IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX21hY183LCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9tYWMtN1xuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLTgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfOCwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItOFxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLTkiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfOSwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItOVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWEiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfYSwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItYVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWIiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfYiwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItYlxuIiwKKwkJICAgICAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWMiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfYywgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItY1xuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWQiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfZCwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItZFxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfZSwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItZVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImJiLWYiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfYmJfZiwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvYmItZlxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoInJmLWEiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfcmZfYSwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvcmYtYVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoInJmLWIiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgcnRscHJpdi0+ZGJnLnByb2NfZGlyLCAmZmlsZV9vcHNfcmZfYiwgaHcpOworCWlmICghZW50cnkpCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgQ09NUF9FUlIsCisJCQkgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvJXMvJXMvcmYtYlxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImNhbS0xIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX2NhbV8xLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9jYW0tMVxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImNhbS0yIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX2NhbV8yLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9jYW0tMlxuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7CisKKwllbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoImNhbS0zIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJIHJ0bHByaXYtPmRiZy5wcm9jX2RpciwgJmZpbGVfb3BzX2NhbV8zLCBodyk7CisJaWYgKCFlbnRyeSkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBDT01QX0VSUiwKKwkJCSAoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC8lcy8lcy9jYW0tM1xuIiwKKwkJCSAgcnRscHJpdi0+Y2ZnLT5uYW1lLCBydGxwcml2LT5kYmcucHJvY19uYW1lKSk7Cit9CisKK3ZvaWQgcnRsX3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAocnRscHJpdi0+ZGJnLnByb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtMCIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtMSIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtMiIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtMyIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtNCIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtNSIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtNiIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWMtNyIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJiYi04IiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImJiLTkiLCBydGxwcml2LT5kYmcucHJvY19kaXIpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYmItYSIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJiYi1iIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImJiLWMiLCBydGxwcml2LT5kYmcucHJvY19kaXIpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYmItZCIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJiYi1lIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImJiLWYiLCBydGxwcml2LT5kYmcucHJvY19kaXIpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmYtYSIsIHJ0bHByaXYtPmRiZy5wcm9jX2Rpcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZi1iIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImNhbS0xIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImNhbS0yIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImNhbS0zIiwgcnRscHJpdi0+ZGJnLnByb2NfZGlyKTsKKworCQlyZW1vdmVfcHJvY19lbnRyeShydGxwcml2LT5kYmcucHJvY19uYW1lLCBwcm9jX3RvcGRpcik7CisKKwkJcnRscHJpdi0+ZGJnLnByb2NfZGlyID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgcnRsX3Byb2NfYWRkX3RvcGRpcih2b2lkKQoreworCXByb2NfdG9wZGlyID0gcHJvY19ta2RpcigicnRsd2lmaSIsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KKwordm9pZCBydGxfcHJvY19yZW1vdmVfdG9wZGlyKHZvaWQpCit7CisJaWYgKHByb2NfdG9wZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeSgicnRsd2lmaSIsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViNjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuaApAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVExfREVCVUdfSF9fCisjZGVmaW5lIF9fUlRMX0RFQlVHX0hfXworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlEZWJ1ZyBsZXZlbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqRmF0YWwgYnVnLgorICpGb3IgZXhhbXBsZSwgVHgvUngvSU8gbG9ja2VkIHVwLAorICptZW1vcnkgYWNjZXNzIHZpb2xhdGlvbiwKKyAqcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsZWQsCisgKnVuZXhwZWN0ZWQgSFcgYmVoYXZpb3IsIEhXIEJVRworICphbmQgc28gb24uCisgKi8KKyNkZWZpbmUgREJHX0VNRVJHCQkJMAorCisvKgorICpBYm5vcm1hbCwgcmFyZSwgb3IgdW5leHBldGVkIGNhc2VzLgorICpGb3IgZXhhbXBsZSwgUGFja2V0L0lPIEN0bCBjYW5jZWxlZCwKKyAqZGV2aWNlIHN1cHJpc2VseSB1bnJlbW92ZWQgYW5kIHNvIG9uLgorICovCisjZGVmaW5lCURCR19XQVJOSU5HCQkJMgorCisvKgorICpOb3JtYWwgY2FzZSBkcml2ZXIgZGV2ZWxvcGVyIHNob3VsZAorICpvcGVuLCB3ZSBjYW4gc2VlIGxpbmsgc3RhdHVzIGxpa2UKKyAqYXNzb2MvQWRkQkEvREhDUC9hZGFwdGVyIHN0YXJ0IGFuZAorICpzbyBvbiBiYXNpYyBhbmQgdXNlZnVsIGluZnJvbWF0aW9ucy4KKyAqLworI2RlZmluZSBEQkdfRE1FU0cJCQkzCisKKy8qCisgKk5vcm1hbCBjYXNlIHdpdGggdXNlZnVsIGluZm9ybWF0aW9uCisgKmFib3V0IGN1cnJlbnQgU1cgb3IgSFcgc3RhdGUuCisgKkZvciBleGFtcGxlLCBUeC9SeCBkZXNjcmlwdG9yIHRvIGZpbGwsCisgKlR4L1J4IGRlc2NyaXB0b3IgY29tcGxldGVkIHN0YXR1cywKKyAqU1cgcHJvdG9jb2wgc3RhdGUgY2hhbmdlLCBkeW5hbWljCisgKm1lY2hhbmlzbSBzdGF0ZSBjaGFuZ2UgYW5kIHNvIG9uLgorICovCisjZGVmaW5lIERCR19MT1VECQkJNAorCisvKgorICpOb3JtYWwgY2FzZSB3aXRoIGRldGFpbCBleGVjdXRpb24KKyAqZmxvdyBvciBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZQlEQkdfVFJBQ0UJCQk1CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJRGVmaW5lIHRoZSBydF90cmFjZSBjb21wb25lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTVBfRVJSCQkJQklUKDApCisjZGVmaW5lIENPTVBfRlcJCQkJQklUKDEpCisjZGVmaW5lIENPTVBfSU5JVAkJCUJJVCgyKQkvKkZvciBpbml0L2RlaW5pdCAqLworI2RlZmluZSBDT01QX1JFQ1YJCQlCSVQoMykJLypGb3IgUnguICovCisjZGVmaW5lIENPTVBfU0VORAkJCUJJVCg0KQkvKkZvciBUeC4gKi8KKyNkZWZpbmUgQ09NUF9NTE1FCQkJQklUKDUpCS8qRm9yIE1MTUUuICovCisjZGVmaW5lIENPTVBfU0NBTgkJCUJJVCg2KQkvKkZvciBTY2FuLiAqLworI2RlZmluZSBDT01QX0lOVFIJCQlCSVQoNykJLypGb3IgaW50ZXJydXB0IFJlbGF0ZWQuICovCisjZGVmaW5lIENPTVBfTEVECQkJQklUKDgpCS8qRm9yIExFRC4gKi8KKyNkZWZpbmUgQ09NUF9TRUMJCQlCSVQoOSkJLypGb3Igc2VjLiAqLworI2RlZmluZSBDT01QX0JFQUNPTgkJCUJJVCgxMCkJLypGb3IgYmVhY29uLiAqLworI2RlZmluZSBDT01QX1JBVEUJCQlCSVQoMTEpCS8qRm9yIHJhdGUuICovCisjZGVmaW5lIENPTVBfUlhERVNDCQkJQklUKDEyKQkvKkZvciByeCBkZXNjLiAqLworI2RlZmluZSBDT01QX0RJRwkJCUJJVCgxMykJLypGb3IgRElHICovCisjZGVmaW5lIENPTVBfVFhBR0MJCQlCSVQoMTQpCS8qRm9yIFR4IHBvd2VyICovCisjZGVmaW5lIENPTVBfSElQV1IJCQlCSVQoMTUpCS8qRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtICovCisjZGVmaW5lIENPTVBfUE9XRVIJCQlCSVQoMTYpCS8qRm9yIGxwcy9pcHMvYXNwbS4gKi8KKyNkZWZpbmUgQ09NUF9QT1dFUl9UUkFDS0lORwlCSVQoMTcpCS8qRm9yIFRYIFBPV0VSIFRSQUNLSU5HICovCisjZGVmaW5lIENPTVBfQkJfUE9XRVJTQVZJTkcJQklUKDE4KQorI2RlZmluZSBDT01QX1NXQVMJCQlCSVQoMTkpCS8qRm9yIFNXIEFudGVubmEgU3dpdGNoICovCisjZGVmaW5lIENPTVBfUkYJCQkJQklUKDIwKQkvKkZvciBSRi4gKi8KKyNkZWZpbmUgQ09NUF9UVVJCTwkJCUJJVCgyMSkJLypGb3IgRURDQSBUVVJCTy4gKi8KKyNkZWZpbmUgQ09NUF9SQVRSCQkJQklUKDIyKQorI2RlZmluZSBDT01QX0NNRAkJCUJJVCgyMykKKyNkZWZpbmUgQ09NUF9FRlVTRQkJCUJJVCgyNCkKKyNkZWZpbmUgQ09NUF9RT1MJCQlCSVQoMjUpCisjZGVmaW5lIENPTVBfTUFDODAyMTEJCUJJVCgyNikKKyNkZWZpbmUgQ09NUF9SRUdECQkJQklUKDI3KQorI2RlZmluZSBDT01QX0NIQU4JCQlCSVQoMjgpCisjZGVmaW5lIENPTVBfRUFTWV9DT05DVVJSRU5UIAkJQklUKDI5KQorI2RlZmluZSBDT01QX0JUX0NPRVhJU1QJCQlCSVQoMzApCisjZGVmaW5lIENPTVBfSVFLCQkJQklUKDMxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCURlZmluZSB0aGUgcnRfcHJpbnQgY29tcG9uZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVmaW5lIEVFUFJPTSBhbmQgRUZVU0UgIGNoZWNrIG1vZHVsZSBiaXQqLworI2RlZmluZSBFRVBST01fVwkJCUJJVCgwKQorI2RlZmluZSBFRlVTRV9QRwkJCUJJVCgxKQorI2RlZmluZSBFRlVTRV9SRUFEX0FMTAkJQklUKDIpCisKKy8qIERlZmluZSBpbml0IGNoZWNrIGZvciBtb2R1bGUgYml0Ki8KKyNkZWZpbmUJSU5JVF9FRVBST00JCQlCSVQoMCkKKyNkZWZpbmUJSU5JVF9UeFBvd2VyCQlCSVQoMSkKKyNkZWZpbmUJSU5JVF9JUUsJCQlCSVQoMikKKyNkZWZpbmUJSU5JVF9SRgkJCQlCSVQoMykKKworLyogRGVmaW5lIFBIWS1CQi9SRi9NQUMgY2hlY2sgbW9kdWxlIGJpdCAqLworI2RlZmluZQlQSFlfQkJSCQkJCUJJVCgwKQorI2RlZmluZQlQSFlfQkJXCQkJCUJJVCgxKQorI2RlZmluZQlQSFlfUkZSCQkJCUJJVCgyKQorI2RlZmluZQlQSFlfUkZXCQkJCUJJVCgzKQorI2RlZmluZQlQSFlfTUFDUgkJCUJJVCg0KQorI2RlZmluZQlQSFlfTUFDVwkJCUJJVCg1KQorI2RlZmluZQlQSFlfQUxMUgkJCUJJVCg2KQorI2RlZmluZQlQSFlfQUxMVwkJCUJJVCg3KQorI2RlZmluZQlQSFlfVFhQV1IJCQlCSVQoOCkKKyNkZWZpbmUJUEhZX1BXUkRJRkYJCQlCSVQoOSkKKworLyogRGVmaW5lIER5bmFtaWMgTWVjaGFuaXNtIGNoZWNrIG1vZHVsZSBiaXQgLS0+IEZETSAqLworI2RlZmluZSBXQV9JT1QJCQkJQklUKDApCisjZGVmaW5lIERNX1BXREIJCQkJQklUKDEpCisjZGVmaW5lIERNX01PTklUT1IJCQlCSVQoMikKKyNkZWZpbmUgRE1fRElHCQkJCUJJVCgzKQorI2RlZmluZSBETV9FRENBX1RVUkJPCQlCSVQoNCkKKworZW51bSBkYmdwX2ZsYWdfZSB7CisJRlFPUyA9IDAsCisJRlRYID0gMSwKKwlGUlggPSAyLAorCUZTRUMgPSAzLAorCUZNR05UID0gNCwKKwlGTUxNRSA9IDUsCisJRlJFU09VUkNFID0gNiwKKwlGQkVBQ09OID0gNywKKwlGSVNSID0gOCwKKwlGUEhZID0gOSwKKwlGTVAgPSAxMCwKKwlGRUVQUk9NID0gMTEsCisJRlBXUiA9IDEyLAorCUZETSA9IDEzLAorCUZEQkdDdHJsID0gMTQsCisJRkMySCA9IDE1LAorCUZCVCA9IDE2LAorCUZJTklUID0gMTcsCisJRklPQ1RMID0gMTgsCisJREJHUF9UWVBFX01BWAorfTsKKworI2RlZmluZSBSVF9BU1NFUlQoX2V4cCxmbXQpCQkJCVwKKwlkbyB7IFwKKwkJaWYoIShfZXhwKSkJewkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczolcygpOiAiLCBLQlVJTERfTU9ETkFNRSwgXAorCQkJX19mdW5jX18pOwlcCisJCQlwcmludGsgZm10OwkJCVwKKwkJfSBcCisJfSB3aGlsZSgwKTsKKworI2RlZmluZQlSVF9ESVNQKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyKQorCisjZGVmaW5lIFJUX1RSQUNFKGNvbXAsIGxldmVsLCBmbXQpXAorCWRvIHsgXAorCQlpZih1bmxpa2VseSgoKGNvbXApICYgcnRscHJpdi0+ZGJnLmdsb2JhbF9kZWJ1Z2NvbXBvbmVudHMpICYmIFwKKwkJCSgobGV2ZWwpIDw9IHJ0bHByaXYtPmRiZy5nbG9iYWxfZGVidWdsZXZlbCkpKSB7XAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzLSVkOiVzKCk6PCVseC0leD4gIiwgXAorCQkJS0JVSUxEX01PRE5BTUUsIFwKKwkJCXJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCwgX19mdW5jX18sIFwKKwkJCWluX2ludGVycnVwdCgpLCBpbl9hdG9taWMoKSk7CVwKKwkJCXByaW50ayBmbXQ7IAkJCVwKKwkJfVwKKwl9IHdoaWxlKDApOworCisjZGVmaW5lIFJUUFJJTlQocnRscHJpdiwgZGJndHlwZSwgZGJnZmxhZywgcHJpbnRzdHIpCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAodW5saWtlbHkocnRscHJpdi0+ZGJnLmRiZ3BfdHlwZVtkYmd0eXBlXSAmIGRiZ2ZsYWcpKSB7IFwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiwgS0JVSUxEX01PRE5BTUUpOwlcCisJCQlwcmludGsgcHJpbnRzdHI7CQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlKDApOworCisjZGVmaW5lIFJUX1BSSU5UX0RBVEEocnRscHJpdiwgX2NvbXAsIF9sZXZlbCwgX3RpdGxlc3RyaW5nLCBfaGV4ZGF0YSwgXAorCQlfaGV4ZGF0YWxlbikgXAorCWRvIHtcCisJCWlmKHVubGlrZWx5KCgoX2NvbXApICYgcnRscHJpdi0+ZGJnLmdsb2JhbF9kZWJ1Z2NvbXBvbmVudHMgKSAmJlwKKwkJCShfbGV2ZWwgPD0gcnRscHJpdi0+ZGJnLmdsb2JhbF9kZWJ1Z2xldmVsICkpKQl7IFwKKwkJCWludCBfX2k7CQkJCQlcCisJCQl1OCoJcHRyID0gKHU4KilfaGV4ZGF0YTsJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIsIEtCVUlMRF9NT0ROQU1FKTsJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkluIHByb2Nlc3MgXCIlc1wiIChwaWQgJWkpOiIsIFwKKwkJCQkJY3VycmVudC0+Y29tbSwgCVwKKwkJCQkJY3VycmVudC0+cGlkKTsgXAorCQkJcHJpbnRrKF90aXRsZXN0cmluZyk7CQlcCisJCQlmb3IoIF9faT0wOyBfX2k8KGludClfaGV4ZGF0YWxlbjsgX19pKysgKSB7CVwKKwkJCQlwcmludGsoIiUwMlglcyIsIHB0cltfX2ldLCAoKChfX2kgKyAxKSAlIDQpIFwKKwkJCQkJCQk9PSAwKT8iICAiOiIgIik7XAorCQkJCWlmICgoKF9faSArIDEpICUgMTYpID09IDApCVwKKwkJCQkJcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwkJCVwKKwkJfSBcCisJfSB3aGlsZSgwKTsKKwordm9pZCBydGxfZGJncF9mbGFnX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGxfcHJvY19hZGRfb25lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bF9wcm9jX2FkZF90b3BkaXIodm9pZCk7Cit2b2lkIHJ0bF9wcm9jX3JlbW92ZV90b3BkaXIodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMxOWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5jCkBAIC0wLDAgKzEsMTI4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVG1lIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAid2lmaS5oIgorI2luY2x1ZGUgImVmdXNlLmgiCisjaW5jbHVkZSAiYnRjb2V4aXN0L2hhbGJ0X3ByZWNvbXAuaCIKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMiwwKSkKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdTggTUFYX1BHUEtUX1NJWkUgPSA5Oworc3RhdGljIGNvbnN0IHU4IFBHUEtUX0RBVEFfU0laRSA9IDg7CitzdGF0aWMgY29uc3QgaW50IEVGVVNFX01BWF9TSVpFID0gNTEyOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVmdXNlX21hcCBSVEw4NzEyX1NESU9fRUZVU0VfVEFCTEVbXSA9IHsKKwl7MCwgMCwgMCwgMn0sCisJezAsIDEsIDAsIDJ9LAorCXswLCAyLCAwLCAyfSwKKwl7MSwgMCwgMCwgMX0sCisJezEsIDAsIDEsIDF9LAorCXsxLCAxLCAwLCAxfSwKKwl7MSwgMSwgMSwgM30sCisJezEsIDMsIDAsIDE3fSwKKwl7MywgMywgMSwgNDh9LAorCXsxMCwgMCwgMCwgNn0sCisJezEwLCAzLCAwLCAxfSwKKwl7MTAsIDMsIDEsIDF9LAorCXsxMSwgMCwgMCwgMjh9Cit9OworCitzdGF0aWMgdm9pZCBlZnVzZV9zaGFkb3dfcmVhZF8xYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwKKwkJCQkgICAgdTggKiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBlZnVzZV9zaGFkb3dfcmVhZF8yYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwKKwkJCQkgICAgdTE2ICogdmFsdWUpOworc3RhdGljIHZvaWQgZWZ1c2Vfc2hhZG93X3JlYWRfNGJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBvZmZzZXQsCisJCQkJICAgIHUzMiAqIHZhbHVlKTsKK3N0YXRpYyB2b2lkIGVmdXNlX3NoYWRvd193cml0ZV8xYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwKKwkJCQkgICAgIHU4IHZhbHVlKTsKK3N0YXRpYyB2b2lkIGVmdXNlX3NoYWRvd193cml0ZV8yYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwKKwkJCQkgICAgIHUxNiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBlZnVzZV9zaGFkb3dfd3JpdGVfNGJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBvZmZzZXQsCisJCQkJICAgICB1MzIgdmFsdWUpOworc3RhdGljIGludCBlZnVzZV9vbmVfYnl0ZV93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHIsCisJCQkJdTggZGF0YSk7CitzdGF0aWMgdm9pZCBlZnVzZV9yZWFkX2FsbF9tYXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICogZWZ1c2UpOworc3RhdGljIGludCBlZnVzZV9wZ19wYWNrZXRfcmVhZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggb2Zmc2V0LAorCQkJCXU4ICpkYXRhKTsKK3N0YXRpYyBpbnQgZWZ1c2VfcGdfcGFja2V0X3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBvZmZzZXQsCisJCQkJIHU4IHdvcmRfZW4sIHU4ICogZGF0YSk7CitzdGF0aWMgdm9pZCBlZnVzZV93b3JkX2VuYWJsZV9kYXRhX3JlYWQodTggd29yZF9lbiwgdTggKiBzb3VyZGF0YSwKKwkJCQkJdTggKiB0YXJnZXRkYXRhKTsKK3N0YXRpYyB1OCBlZnVzZV93b3JkX2VuYWJsZV9kYXRhX3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICB1MTYgZWZ1c2VfYWRkciwgdTggd29yZF9lbiwgdTggKiBkYXRhKTsKK3N0YXRpYyB2b2lkIGVmdXNlX3Bvd2VyX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYndyaXRlLAorCQkJCQl1OCBwd3JzdGF0ZSk7CitzdGF0aWMgdTE2IGVmdXNlX2dldF9jdXJyZW50X3NpemUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworc3RhdGljIHU4IGVmdXNlX2NhbGN1bGF0ZV93b3JkX2NudHModTggd29yZF9lbik7CisKK3ZvaWQgZWZ1c2VfaW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggYnl0ZXRlbXA7CisJdTggdGVtcDsKKworCWJ5dGV0ZW1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dICsgMSk7CisJdGVtcCA9IGJ5dGV0ZW1wIHwgMHgyMDsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dICsgMSwgdGVtcCk7CisKKwlieXRldGVtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19JU09fQ1RSTF0gKyAxKTsKKwl0ZW1wID0gYnl0ZXRlbXAgJiAweEZFOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfSVNPX0NUUkxdICsgMSwgdGVtcCk7CisKKwlieXRldGVtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMyk7CisJdGVtcCA9IGJ5dGV0ZW1wIHwgMHg4MDsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzLCB0ZW1wKTsKKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4MkY4LCAweDMpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMywgMHg3Mik7CisKK30KKwordTggZWZ1c2VfcmVhZF8xYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHJlc3MpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGRhdGE7CisJdTggYnl0ZXRlbXA7CisJdTggdGVtcDsKKwl1MzIgayA9IDA7CisJY29uc3QgdTMyIGVmdXNlX3JlYWxfY29udGVudF9sZW4gPQorCQlydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfUkVBTF9DT05URU5UX1NJWkVdOworCisJaWYgKGFkZHJlc3MgPCBlZnVzZV9yZWFsX2NvbnRlbnRfbGVuKSB7CisJCXRlbXAgPSBhZGRyZXNzICYgMHhGRjsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMSwKKwkJCSAgICAgICB0ZW1wKTsKKwkJYnl0ZXRlbXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCSBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAyKTsKKwkJdGVtcCA9ICgoYWRkcmVzcyA+PiA4KSAmIDB4MDMpIHwgKGJ5dGV0ZW1wICYgMHhGQyk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDIsCisJCQkgICAgICAgdGVtcCk7CisKKwkJYnl0ZXRlbXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCSBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAzKTsKKwkJdGVtcCA9IGJ5dGV0ZW1wICYgMHg3RjsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMywKKwkJCSAgICAgICB0ZW1wKTsKKworCQlieXRldGVtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDMpOworCQl3aGlsZSAoIShieXRldGVtcCAmIDB4ODApKSB7CisJCQlieXRldGVtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJCSBydGxwcml2LT5jZmctPgorCQkJCQkJIG1hcHNbRUZVU0VfQ1RSTF0gKyAzKTsKKwkJCWsrKzsKKwkJCWlmIChrID09IDEwMDApIHsKKwkJCQlrID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlkYXRhID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0pOworCQlyZXR1cm4gZGF0YTsKKwl9IGVsc2UKKwkJcmV0dXJuIDB4RkY7CisKK30KKy8vRVhQT1JUX1NZTUJPTChlZnVzZV9yZWFkXzFieXRlKTsKKwordm9pZCBlZnVzZV93cml0ZV8xYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBieXRldGVtcDsKKwl1OCB0ZW1wOworCXUzMiBrID0gMDsKKwljb25zdCB1MzIgZWZ1c2VfcmVhbF9jb250ZW50X2xlbiA9CisJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9SRUFMX0NPTlRFTlRfU0laRV07CisKKwlSVF9UUkFDRShDT01QX0VGVVNFLCBEQkdfTE9VRCwKKwkJICgiQWRkcj0leCBEYXRhID0leFxuIiwgYWRkcmVzcywgdmFsdWUpKTsKKworCWlmIChhZGRyZXNzIDwgZWZ1c2VfcmVhbF9jb250ZW50X2xlbikgeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0sIHZhbHVlKTsKKworCQl0ZW1wID0gYWRkcmVzcyAmIDB4RkY7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDEsCisJCQkgICAgICAgdGVtcCk7CisJCWJ5dGV0ZW1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJCQkgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMik7CisKKwkJdGVtcCA9ICgoYWRkcmVzcyA+PiA4KSAmIDB4MDMpIHwgKGJ5dGV0ZW1wICYgMHhGQyk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsCisJCQkgICAgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMiwgdGVtcCk7CisKKwkJYnl0ZXRlbXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCSBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAzKTsKKwkJdGVtcCA9IGJ5dGV0ZW1wIHwgMHg4MDsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwKKwkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAzLCB0ZW1wKTsKKworCQlieXRldGVtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDMpOworCisJCXdoaWxlIChieXRldGVtcCAmIDB4ODApIHsKKwkJCWJ5dGV0ZW1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJCQkJIHJ0bHByaXYtPmNmZy0+CisJCQkJCQkgbWFwc1tFRlVTRV9DVFJMXSArIDMpOworCQkJaysrOworCQkJaWYgKGsgPT0gMTAwKSB7CisJCQkJayA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKK30KKwordm9pZCByZWFkX2VmdXNlX2J5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBfb2Zmc2V0LCB1OCAqcGJ1ZikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIHZhbHVlMzI7CisJdTggcmVhZGJ5dGU7CisJdTE2IHJldHJ5OworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMSwKKwkJICAgICAgIChfb2Zmc2V0ICYgMHhmZikpOworCXJlYWRieXRlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAyLAorCQkgICAgICAgKChfb2Zmc2V0ID4+IDgpICYgMHgwMykgfCAocmVhZGJ5dGUgJiAweGZjKSk7CisKKwlyZWFkYnl0ZSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMyk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMywKKwkJICAgICAgIChyZWFkYnl0ZSAmIDB4N2YpKTsKKworCXJldHJ5ID0gMDsKKwl2YWx1ZTMyID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdKTsKKwl3aGlsZSAoISgoKHZhbHVlMzIgPj4gMjQpICYgMHhmZikgJiAweDgwKSAmJiAocmV0cnkgPCAxMDAwMCkpIHsKKwkJdmFsdWUzMiA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsCisJCQkJCSBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0pOworCQlyZXRyeSsrOworCX0KKworCXVkZWxheSg1MCk7CisJdmFsdWUzMiA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSk7CisKKwkqcGJ1ZiA9ICh1OCkgKHZhbHVlMzIgJiAweGZmKTsKK30KKwordm9pZCByZWFkX2VmdXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXU4IGVmdXNlX3RibFtydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfSFdTRVRfTUFYX1NJWkVdXTsKKwl1OCBydGVtcDhbMV07CisJdTE2IGVmdXNlX2FkZHIgPSAwOworCXU4IG9mZnNldCwgd3JlbjsKKwl1OCB1MXRlbXAgPSAwOworCXUxNiBpOworCXUxNiBqOworCWNvbnN0IHUxNiBlZnVzZV9tYXhfc2VjdGlvbiA9CisJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9NQVhfU0VDVElPTl9NQVBdOworCWNvbnN0IHUzMiBlZnVzZV9yZWFsX2NvbnRlbnRfbGVuID0KKwkJcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1JFQUxfQ09OVEVOVF9TSVpFXTsKKwl1MTYgZWZ1c2Vfd29yZFtlZnVzZV9tYXhfc2VjdGlvbl1bRUZVU0VfTUFYX1dPUkRfVU5JVF07CisJdTE2IGVmdXNlX3V0aWxpemVkID0gMDsKKwl1OCBlZnVzZV91c2FnZTsKKworCWlmICgoX29mZnNldCArIF9zaXplX2J5dGUpID4gcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSkgeworCQlSVF9UUkFDRShDT01QX0VGVVNFLCBEQkdfTE9VRCwKKwkJCSAoInJlYWRfZWZ1c2UoKTogSW52YWxpZCBvZmZzZXQoJSN4KSB3aXRoIHJlYWQgIgorCQkJICAiYnl0ZXMoJSN4KSEhXG4iLCBfb2Zmc2V0LCBfc2l6ZV9ieXRlKSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZWZ1c2VfbWF4X3NlY3Rpb247IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGorKykKKwkJCWVmdXNlX3dvcmRbaV1bal0gPSAweEZGRkY7CisKKwlyZWFkX2VmdXNlX2J5dGUoaHcsIGVmdXNlX2FkZHIsIHJ0ZW1wOCk7CisJaWYgKCpydGVtcDggIT0gMHhGRikgeworCQllZnVzZV91dGlsaXplZCsrOworCQlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sIEVGVVNFX1JFQURfQUxMLAorCQkJKCJBZGRyPSVkXG4iLCBlZnVzZV9hZGRyKSk7CisJCWVmdXNlX2FkZHIrKzsKKwl9CisKKwl3aGlsZSAoKCpydGVtcDggIT0gMHhGRikgJiYgKGVmdXNlX2FkZHIgPCBlZnVzZV9yZWFsX2NvbnRlbnRfbGVuKSkgeworCQkvKiAgQ2hlY2sgUEcgaGVhZGVyIGZvciBzZWN0aW9uIG51bS4gICovCisJCWlmKCgqcnRlbXA4ICYgMHgxRiApID09IDB4MEYpIHsvKiBleHRlbmRlZCBoZWFkZXIgKi8KKwkJCXUxdGVtcCA9KCAoKnJ0ZW1wOCAmIDB4RTApID4+IDUpOworCQkJcmVhZF9lZnVzZV9ieXRlKGh3LCBlZnVzZV9hZGRyLCBydGVtcDgpOworCisJCQlpZigoKnJ0ZW1wOCAmIDB4MEYpID09IDB4MEYpIHsKKwkJCQllZnVzZV9hZGRyKys7CisJCQkJcmVhZF9lZnVzZV9ieXRlKGh3LCBlZnVzZV9hZGRyLCBydGVtcDgpOworCisJCQkJaWYgKCpydGVtcDggIT0gMHhGRiAmJgorCQkJCSAgICAoZWZ1c2VfYWRkciA8IGVmdXNlX3JlYWxfY29udGVudF9sZW4pKSB7CisJCQkJCWVmdXNlX2FkZHIrKzsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCW9mZnNldCA9ICgoKnJ0ZW1wOCAmIDB4RjApID4+IDEpIHwgdTF0ZW1wOworCQkJCXdyZW4gPSAoKnJ0ZW1wOCAmIDB4MEYpOworCQkJCWVmdXNlX2FkZHIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW9mZnNldCA9ICgoKnJ0ZW1wOCA+PiA0KSAmIDB4MGYpOworCQkJd3JlbiA9ICgqcnRlbXA4ICYgMHgwZik7CisJCX0KKworCQlpZiAob2Zmc2V0IDwgZWZ1c2VfbWF4X3NlY3Rpb24pIHsKKwkJCVJUUFJJTlQocnRscHJpdiwgRkVFUFJPTSwgRUZVU0VfUkVBRF9BTEwsCisJCQkJKCJvZmZzZXQtJWQgV29yZGVuPSV4XG4iLCBvZmZzZXQsIHdyZW4pKTsKKworCQkJZm9yIChpID0gMDsgaSA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGkrKykgeworCQkJCWlmICghKHdyZW4gJiAweDAxKSkgeworCQkJCQlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sCisJCQkJCQlFRlVTRV9SRUFEX0FMTCwgKCJBZGRyPSVkXG4iLAorCQkJCQkJCQkgZWZ1c2VfYWRkcikpOworCisJCQkJCXJlYWRfZWZ1c2VfYnl0ZShodywgZWZ1c2VfYWRkciwgcnRlbXA4KTsKKwkJCQkJZWZ1c2VfYWRkcisrOworCQkJCQllZnVzZV91dGlsaXplZCsrOworCQkJCQllZnVzZV93b3JkW29mZnNldF1baV0gPSAoKnJ0ZW1wOCAmCisJCQkJCQkJCSAweGZmKTsKKworCQkJCQlpZiAoZWZ1c2VfYWRkciA+PQorCQkJCQkgICAgZWZ1c2VfcmVhbF9jb250ZW50X2xlbikKKwkJCQkJCWJyZWFrOworCisJCQkJCVJUUFJJTlQocnRscHJpdiwgRkVFUFJPTSwKKwkJCQkJCUVGVVNFX1JFQURfQUxMLCAoIkFkZHI9JWRcbiIsCisJCQkJCQkJCSBlZnVzZV9hZGRyKSk7CisKKwkJCQkJcmVhZF9lZnVzZV9ieXRlKGh3LCBlZnVzZV9hZGRyLCBydGVtcDgpOworCQkJCQllZnVzZV9hZGRyKys7CisJCQkJCWVmdXNlX3V0aWxpemVkKys7CisJCQkJCWVmdXNlX3dvcmRbb2Zmc2V0XVtpXSB8PQorCQkJCQkgICAgKCgodTE2KSAqIHJ0ZW1wOCA8PCA4KSAmIDB4ZmYwMCk7CisKKwkJCQkJaWYgKGVmdXNlX2FkZHIgPj0gZWZ1c2VfcmVhbF9jb250ZW50X2xlbikKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXdyZW4gPj49IDE7CisJCQl9CisJCX0KKworCQlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sIEVGVVNFX1JFQURfQUxMLAorCQkJKCJBZGRyPSVkXG4iLCBlZnVzZV9hZGRyKSk7CisJCXJlYWRfZWZ1c2VfYnl0ZShodywgZWZ1c2VfYWRkciwgcnRlbXA4KTsKKwkJaWYgKCpydGVtcDggIT0gMHhGRiAmJiAoZWZ1c2VfYWRkciA8IGVmdXNlX3JlYWxfY29udGVudF9sZW4pKSB7CisJCQllZnVzZV91dGlsaXplZCsrOworCQkJZWZ1c2VfYWRkcisrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGVmdXNlX21heF9zZWN0aW9uOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGorKykgeworCQkJZWZ1c2VfdGJsWyhpICogOCkgKyAoaiAqIDIpXSA9CisJCQkgICAgKGVmdXNlX3dvcmRbaV1bal0gJiAweGZmKTsKKwkJCWVmdXNlX3RibFsoaSAqIDgpICsgKChqICogMikgKyAxKV0gPQorCQkJICAgICgoZWZ1c2Vfd29yZFtpXVtqXSA+PiA4KSAmIDB4ZmYpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IF9zaXplX2J5dGU7IGkrKykKKwkJcGJ1ZltpXSA9IGVmdXNlX3RibFtfb2Zmc2V0ICsgaV07CisKKwlydGxlZnVzZS0+ZWZ1c2VfdXNlZGJ5dGVzID0gZWZ1c2VfdXRpbGl6ZWQ7CisJZWZ1c2VfdXNhZ2UgPSAodTgpICgoZWZ1c2VfdXRpbGl6ZWQgKiAxMDApIC8gZWZ1c2VfcmVhbF9jb250ZW50X2xlbik7CisJcnRsZWZ1c2UtPmVmdXNlX3VzZWRwZXJjZW50YWdlID0gZWZ1c2VfdXNhZ2U7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9FRlVTRV9CWVRFUywKKwkJCQkgICAgICAodTggKikgJiBlZnVzZV91dGlsaXplZCk7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9FRlVTRV9VU0FHRSwKKwkJCQkgICAgICAodTggKikgJiBlZnVzZV91c2FnZSk7Cit9CisKK2Jvb2wgZWZ1c2Vfc2hhZG93X3VwZGF0ZV9jaGsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggc2VjdGlvbl9pZHgsIGksIEJhc2U7CisJdTE2IHdvcmRzX25lZWQgPSAwLCBoZHJfbnVtID0gMCwgdG90YWxieXRlcywgZWZ1c2VfdXNlZDsKKwlib29sIGJ3b3JkY2hhbmdlZCwgYnJlc3VsdCA9IHRydWU7CisKKwlmb3IgKHNlY3Rpb25faWR4ID0gMDsgc2VjdGlvbl9pZHggPCAxNjsgc2VjdGlvbl9pZHgrKykgeworCQlCYXNlID0gc2VjdGlvbl9pZHggKiA4OworCQlid29yZGNoYW5nZWQgPSBmYWxzZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSA9IGkgKyAyKSB7CisJCQlpZiAoKHJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdW0Jhc2UgKyBpXSAhPQorCQkJICAgICBydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW0Jhc2UgKyBpXSkgfHwKKwkJCSAgICAocnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9JTklUX01BUF1bQmFzZSArIGkgKyAxXSAhPQorCQkJICAgICBydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW0Jhc2UgKyBpICsKKwkJCQkJCQkJICAgMV0pKSB7CisJCQkJd29yZHNfbmVlZCsrOworCQkJCWJ3b3JkY2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0KKworCQlpZiAoYndvcmRjaGFuZ2VkID09IHRydWUpCisJCQloZHJfbnVtKys7CisJfQorCisJdG90YWxieXRlcyA9IGhkcl9udW0gKyB3b3Jkc19uZWVkICogMjsKKwllZnVzZV91c2VkID0gcnRsZWZ1c2UtPmVmdXNlX3VzZWRieXRlczsKKworCWlmICgodG90YWxieXRlcyArIGVmdXNlX3VzZWQpID49IChFRlVTRV9NQVhfU0laRSAtCisJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU19MRU5dKSkKKwkJYnJlc3VsdCA9IGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9FRlVTRSwgREJHX0xPVUQsCisJCSAoImVmdXNlX3NoYWRvd191cGRhdGVfY2hrKCk6IHRvdGFsYnl0ZXMoJSN4KSwgIgorCQkgICJoZHJfbnVtKCUjeCksIHdvcmRzX25lZWQoJSN4KSwgZWZ1c2VfdXNlZCglZClcbiIsCisJCSAgdG90YWxieXRlcywgaGRyX251bSwgd29yZHNfbmVlZCwgZWZ1c2VfdXNlZCkpOworCisJcmV0dXJuIGJyZXN1bHQ7Cit9CisKK3ZvaWQgZWZ1c2Vfc2hhZG93X3JlYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUsCisJCSAgICAgICB1MTYgb2Zmc2V0LCB1MzIgKnZhbHVlKQoreworCWlmICh0eXBlID09IDEpCisJCWVmdXNlX3NoYWRvd19yZWFkXzFieXRlKGh3LCBvZmZzZXQsICh1OCAqKSB2YWx1ZSk7CisJZWxzZSBpZiAodHlwZSA9PSAyKQorCQllZnVzZV9zaGFkb3dfcmVhZF8yYnl0ZShodywgb2Zmc2V0LCAodTE2ICopIHZhbHVlKTsKKwllbHNlIGlmICh0eXBlID09IDQpCisJCWVmdXNlX3NoYWRvd19yZWFkXzRieXRlKGh3LCBvZmZzZXQsICh1MzIgKikgdmFsdWUpOworCit9CisKK3ZvaWQgZWZ1c2Vfc2hhZG93X3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlLCB1MTYgb2Zmc2V0LAorCQkJCXUzMiB2YWx1ZSkKK3sKKwlpZiAodHlwZSA9PSAxKQorCQllZnVzZV9zaGFkb3dfd3JpdGVfMWJ5dGUoaHcsIG9mZnNldCwgKHU4KSB2YWx1ZSk7CisJZWxzZSBpZiAodHlwZSA9PSAyKQorCQllZnVzZV9zaGFkb3dfd3JpdGVfMmJ5dGUoaHcsIG9mZnNldCwgKHUxNikgdmFsdWUpOworCWVsc2UgaWYgKHR5cGUgPT0gNCkKKwkJZWZ1c2Vfc2hhZG93X3dyaXRlXzRieXRlKGh3LCBvZmZzZXQsICh1MzIpIHZhbHVlKTsKKworfQorCitib29sIGVmdXNlX3NoYWRvd191cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTE2IGksIG9mZnNldCwgYmFzZTsKKwl1OCB3b3JkX2VuID0gMHgwRjsKKwl1OCBmaXJzdF9wZyA9IGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9FRlVTRSwgREJHX0xPVUQsICgiXG4iKSk7CisKKwlpZiAoIWVmdXNlX3NoYWRvd191cGRhdGVfY2hrKGh3KSkgeworCQllZnVzZV9yZWFkX2FsbF9tYXAoaHcsICZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVswXSk7CisJCW1lbWNweSgmcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVswXSwKKwkJICAgICAgICZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVswXSwKKwkJICAgICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9IV1NFVF9NQVhfU0laRV0pOworCisJCVJUX1RSQUNFKENPTVBfRUZVU0UsIERCR19MT1VELAorCQkJICgiZWZ1c2Ugb3V0IG9mIGNhcGFjaXR5ISFcbiIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwllZnVzZV9wb3dlcl9zd2l0Y2goaHcsIHRydWUsIHRydWUpOworCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAxNjsgb2Zmc2V0KyspIHsKKworCQl3b3JkX2VuID0gMHgwRjsKKwkJYmFzZSA9IG9mZnNldCAqIDg7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKGZpcnN0X3BnID09IHRydWUpIHsKKworCQkJCXdvcmRfZW4gJj0gfihCSVQoaSAvIDIpKTsKKworCQkJCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdW2Jhc2UgKyBpXSA9CisJCQkJICAgIHJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bYmFzZSArIGldOworCQkJfSBlbHNlIHsKKworCQkJCWlmIChydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVtiYXNlICsgaV0gIT0KKwkJCQkgICAgcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtiYXNlICsgaV0pIHsKKwkJCQkJd29yZF9lbiAmPSB+KEJJVChpIC8gMikpOworCisJCQkJCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdW2Jhc2UgKyBpXSA9CisJCQkJCSAgICBydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW2Jhc2UgKyBpXTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAod29yZF9lbiAhPSAweDBGKSB7CisJCQl1OCB0bXBkYXRhWzhdOworCQkJbWVtY3B5KHRtcGRhdGEsICgmcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtiYXNlXSksIDgpOworCQkJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSAgICAgICgiVS1lZnVzZVxuIiksIHRtcGRhdGEsIDgpOworCisJCQlpZiAoIWVmdXNlX3BnX3BhY2tldF93cml0ZShodywgKHU4KSBvZmZzZXQsIHdvcmRfZW4sCisJCQkJCQkgICB0bXBkYXRhKSkgeworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJICgiUEcgc2VjdGlvbiglI3gpIGZhaWwhIVxuIiwgb2Zmc2V0KSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCWVmdXNlX3Bvd2VyX3N3aXRjaChodywgdHJ1ZSwgZmFsc2UpOworCWVmdXNlX3JlYWRfYWxsX21hcChodywgJnJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdWzBdKTsKKworCW1lbWNweSgmcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVswXSwKKwkgICAgICAgJnJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdWzBdLAorCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfSFdTRVRfTUFYX1NJWkVdKTsKKworCVJUX1RSQUNFKENPTVBfRUZVU0UsIERCR19MT1VELCAoIlxuIikpOworCXJldHVybiB0cnVlOworfQorCit2b2lkIHJ0bF9lZnVzZV9zaGFkb3dfbWFwX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKworCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gdHJ1ZSkgeworCQltZW1zZXQoKCZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVswXSksCisJCQkweEZGLCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfSFdTRVRfTUFYX1NJWkVdKTsKKwl9IGVsc2UgeworCQllZnVzZV9yZWFkX2FsbF9tYXAoaHcsICZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVswXSk7CisJfQorCisJbWVtY3B5KCZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdWzBdLAorCQkJJnJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdWzBdLAorCQkJcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSk7CisKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfZWZ1c2Vfc2hhZG93X21hcF91cGRhdGUpOworCit2b2lkIGVmdXNlX2ZvcmNlX3dyaXRlX3ZlbmRvcl9JZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1OCB0bXBkYXRhWzhdID0geyAweEZGLCAweEZGLCAweEVDLCAweDEwLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisKKwllZnVzZV9wb3dlcl9zd2l0Y2goaHcsIHRydWUsIHRydWUpOworCisJZWZ1c2VfcGdfcGFja2V0X3dyaXRlKGh3LCAxLCAweEQsIHRtcGRhdGEpOworCisJZWZ1c2VfcG93ZXJfc3dpdGNoKGh3LCB0cnVlLCBmYWxzZSk7CisKK30KKwordm9pZCBlZnVzZV9yZV9wZ19zZWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBzZWN0aW9uX2lkeCkKK3sKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfc2hhZG93X3JlYWRfMWJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHUxNiBvZmZzZXQsIHU4ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCSp2YWx1ZSA9IHJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0XTsKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfc2hhZG93X3JlYWRfMmJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHUxNiBvZmZzZXQsIHUxNiAqdmFsdWUpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKworCSp2YWx1ZSA9IHJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0XTsKKwkqdmFsdWUgfD0gcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtvZmZzZXQgKyAxXSA8PCA4OworCit9CisKK3N0YXRpYyB2b2lkIGVmdXNlX3NoYWRvd19yZWFkXzRieXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICB1MTYgb2Zmc2V0LCB1MzIgKnZhbHVlKQoreworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisKKwkqdmFsdWUgPSBydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW29mZnNldF07CisJKnZhbHVlIHw9IHJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0ICsgMV0gPDwgODsKKwkqdmFsdWUgfD0gcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtvZmZzZXQgKyAyXSA8PCAxNjsKKwkqdmFsdWUgfD0gcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtvZmZzZXQgKyAzXSA8PCAyNDsKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfc2hhZG93X3dyaXRlXzFieXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgdTE2IG9mZnNldCwgdTggdmFsdWUpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKworCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0XSA9IHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBlZnVzZV9zaGFkb3dfd3JpdGVfMmJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICB1MTYgb2Zmc2V0LCB1MTYgdmFsdWUpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKworCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0XSA9IHZhbHVlICYgMHgwMEZGOworCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiA4OworCit9CisKK3N0YXRpYyB2b2lkIGVmdXNlX3NoYWRvd193cml0ZV80Ynl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCisJcnRsZWZ1c2UtPmVmdXNlX21hcFtFRlVTRV9NT0RJRllfTUFQXVtvZmZzZXRdID0KKwkgICAgKHU4KSAodmFsdWUgJiAweDAwMDAwMEZGKTsKKwlydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW29mZnNldCArIDFdID0KKwkgICAgKHU4KSAoKHZhbHVlID4+IDgpICYgMHgwMDAwRkYpOworCXJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfTU9ESUZZX01BUF1bb2Zmc2V0ICsgMl0gPQorCSAgICAodTgpICgodmFsdWUgPj4gMTYpICYgMHgwMEZGKTsKKwlydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX01PRElGWV9NQVBdW29mZnNldCArIDNdID0KKwkgICAgKHU4KSAoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworCit9CisKK2ludCBlZnVzZV9vbmVfYnl0ZV9yZWFkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgYWRkciwgdTggKmRhdGEpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHRtcGlkeCA9IDA7CisJaW50IGJyZXN1bHQ7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAxLAorCQkgICAgICAgKHU4KSAoYWRkciAmIDB4ZmYpKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0gKyAyLAorCQkgICAgICAgKCh1OCkgKChhZGRyID4+IDgpICYgMHgwMykpIHwKKwkJICAgICAgIChydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJICAgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMikgJgorCQkJMHhGQykpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMywgMHg3Mik7CisKKwl3aGlsZSAoISgweDgwICYgcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJCSAgICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDMpKQorCSAgICAgICAmJiAodG1waWR4IDwgMTAwKSkgeworCQl0bXBpZHgrKzsKKwl9CisKKwlpZiAodG1waWR4IDwgMTAwKSB7CisJCSpkYXRhID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0pOworCQlicmVzdWx0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkqZGF0YSA9IDB4ZmY7CisJCWJyZXN1bHQgPSBmYWxzZTsKKwl9CisJcmV0dXJuIGJyZXN1bHQ7Cit9CisvL0VYUE9SVF9TWU1CT0woZWZ1c2Vfb25lX2J5dGVfcmVhZCk7CisKK3N0YXRpYyBpbnQgZWZ1c2Vfb25lX2J5dGVfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBhZGRyLCB1OCBkYXRhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB0bXBpZHggPSAwOworCWJvb2wgYnJlc3VsdDsKKworCVJUX1RSQUNFKENPTVBfRUZVU0UsIERCR19MT1VELAorCQkgKCJBZGRyID0gJXggRGF0YT0leFxuIiwgYWRkciwgZGF0YSkpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwKKwkJICAgICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDEsICh1OCkgKGFkZHIgJiAweGZmKSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMiwKKwkJICAgICAgIChydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsKKwkJCSAyKSAmIDB4RkMpIHwgKHU4KSAoKGFkZHIgPj4gOCkgJiAweDAzKSk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ1RSTF0sIGRhdGEpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9DVFJMXSArIDMsIDB4RjIpOworCisJd2hpbGUgKCgweDgwICYgcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJCSAgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0NUUkxdICsgMykpCisJICAgICAgICYmICh0bXBpZHggPCAxMDApKSB7CisJCXRtcGlkeCsrOworCX0KKworCWlmICh0bXBpZHggPCAxMDApCisJCWJyZXN1bHQgPSB0cnVlOworCWVsc2UKKwkJYnJlc3VsdCA9IGZhbHNlOworCisJcmV0dXJuIGJyZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGVmdXNlX3JlYWRfYWxsX21hcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKiBlZnVzZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJZWZ1c2VfcG93ZXJfc3dpdGNoKGh3LCBmYWxzZSwgdHJ1ZSk7CisJcmVhZF9lZnVzZShodywgMCwgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSwgZWZ1c2UpOworCWVmdXNlX3Bvd2VyX3N3aXRjaChodywgZmFsc2UsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgZWZ1c2VfcmVhZF9kYXRhX2Nhc2UxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgKmVmdXNlX2FkZHIsCisJCQkJdTggZWZ1c2VfZGF0YSwgdTggb2Zmc2V0LCB1OCAqdG1wZGF0YSwKKwkJCQl1OCAqcmVhZHN0YXRlKQoreworCWJvb2wgYmRhdGFlbXB0eSA9IHRydWU7CisJdTggaG9mZnNldDsKKwl1OCB0bXBpZHg7CisJdTggaHdvcmRlbjsKKwl1OCB3b3JkX2NudHM7CisKKwlob2Zmc2V0ID0gKGVmdXNlX2RhdGEgPj4gNCkgJiAweDBGOworCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKKwl3b3JkX2NudHMgPSBlZnVzZV9jYWxjdWxhdGVfd29yZF9jbnRzKGh3b3JkZW4pOworCisJaWYgKGhvZmZzZXQgPT0gb2Zmc2V0KSB7CisJCWZvciAodG1waWR4ID0gMDsgdG1waWR4IDwgd29yZF9jbnRzICogMjsgdG1waWR4KyspIHsKKwkJCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCAqZWZ1c2VfYWRkciArIDEgKyB0bXBpZHgsCisJCQkJCQkmZWZ1c2VfZGF0YSkpIHsKKwkJCQl0bXBkYXRhW3RtcGlkeF0gPSBlZnVzZV9kYXRhOworCQkJCWlmIChlZnVzZV9kYXRhICE9IDB4ZmYpCisJCQkJCWJkYXRhZW1wdHkgPSB0cnVlOworCQkJfQorCQl9CisKKwkJaWYgKGJkYXRhZW1wdHkgPT0gdHJ1ZSkgeworCQkJKnJlYWRzdGF0ZSA9IFBHX1NUQVRFX0RBVEE7CisJCX0gZWxzZSB7CisJCQkqZWZ1c2VfYWRkciA9ICplZnVzZV9hZGRyICsgKHdvcmRfY250cyAqIDIpICsgMTsKKwkJCSpyZWFkc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisJCX0KKworCX0gZWxzZSB7CisJCSplZnVzZV9hZGRyID0gKmVmdXNlX2FkZHIgKyAod29yZF9jbnRzICogMikgKyAxOworCQkqcmVhZHN0YXRlID0gUEdfU1RBVEVfSEVBREVSOworCX0KK30KKworc3RhdGljIGludCBlZnVzZV9wZ19wYWNrZXRfcmVhZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggb2Zmc2V0LCB1OCAqZGF0YSkKK3sKKwl1OCByZWFkc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisKKwlib29sIGJjb250aW51YWwgPSB0cnVlOworCisJdTggZWZ1c2VfZGF0YSwgd29yZF9jbnRzID0gMDsKKwl1MTYgZWZ1c2VfYWRkciA9IDA7CisJdTggaHdvcmRlbiA9IDA7CisJdTggdG1wZGF0YVs4XTsKKworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKwlpZiAob2Zmc2V0ID4gMTUpCisJCXJldHVybiBmYWxzZTsKKworCW1lbXNldChkYXRhLCAweGZmLCBQR1BLVF9EQVRBX1NJWkUgKiBzaXplb2YodTgpKTsKKwltZW1zZXQodG1wZGF0YSwgMHhmZiwgUEdQS1RfREFUQV9TSVpFICogc2l6ZW9mKHU4KSk7CisKKwl3aGlsZSAoYmNvbnRpbnVhbCAmJiAoZWZ1c2VfYWRkciA8IEVGVVNFX01BWF9TSVpFKSkgeworCQlpZiAocmVhZHN0YXRlICYgUEdfU1RBVEVfSEVBREVSKSB7CisJCQlpZiAoZWZ1c2Vfb25lX2J5dGVfcmVhZChodywgZWZ1c2VfYWRkciwgJmVmdXNlX2RhdGEpCisJCQkgICAgJiYgKGVmdXNlX2RhdGEgIT0gMHhGRikpCisJCQkJZWZ1c2VfcmVhZF9kYXRhX2Nhc2UxKGh3LCAmZWZ1c2VfYWRkciwgZWZ1c2VfZGF0YSwgb2Zmc2V0LAorCQkJCQkJCXRtcGRhdGEsICZyZWFkc3RhdGUpOworCQkJZWxzZQorCQkJCWJjb250aW51YWwgPSBmYWxzZTsKKwkJfSBlbHNlIGlmIChyZWFkc3RhdGUgJiBQR19TVEFURV9EQVRBKSB7CisJCQllZnVzZV93b3JkX2VuYWJsZV9kYXRhX3JlYWQoaHdvcmRlbiwgdG1wZGF0YSwgZGF0YSk7CisJCQllZnVzZV9hZGRyID0gZWZ1c2VfYWRkciArICh3b3JkX2NudHMgKiAyKSArIDE7CisJCQlyZWFkc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisJCX0KKworCX0KKworCWlmICgoZGF0YVswXSA9PSAweGZmKSAmJiAoZGF0YVsxXSA9PSAweGZmKSAmJgorCSAgICAoZGF0YVsyXSA9PSAweGZmKSAmJiAoZGF0YVszXSA9PSAweGZmKSAmJgorCSAgICAoZGF0YVs0XSA9PSAweGZmKSAmJiAoZGF0YVs1XSA9PSAweGZmKSAmJgorCSAgICAoZGF0YVs2XSA9PSAweGZmKSAmJiAoZGF0YVs3XSA9PSAweGZmKSkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJcmV0dXJuIHRydWU7CisKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfd3JpdGVfZGF0YV9jYXNlMShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2ICplZnVzZV9hZGRyLAorCQkJCXU4IGVmdXNlX2RhdGEsIHU4IG9mZnNldCwgaW50ICpiY29udGludWFsLAorCQkJCXU4ICp3cml0ZV9zdGF0ZSwgc3RydWN0IHBncGt0X3N0cnVjdCAqdGFyZ2V0X3BrdCwKKwkJCQlpbnQgKnJlcGVhdF90aW1lcywgaW50ICpicmVzdWx0LCB1OCB3b3JkX2VuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcGdwa3Rfc3RydWN0IHRtcF9wa3Q7CisJaW50IGJkYXRhZW1wdHkgPSB0cnVlOworCXU4IG9yaWdpbmFsZGF0YVs4ICogc2l6ZW9mKHU4KV07CisJdTggYmFkd29yZGVuID0gMHgwRjsKKwl1OCBtYXRjaF93b3JkX2VuLCB0bXBfd29yZF9lbjsKKwl1OCB0bXBpbmRleDsKKwl1OCB0bXBfaGVhZGVyID0gZWZ1c2VfZGF0YTsKKwl1OCB0bXBfd29yZF9jbnRzOworCisJdG1wX3BrdC5vZmZzZXQgPSAodG1wX2hlYWRlciA+PiA0KSAmIDB4MEY7CisJdG1wX3BrdC53b3JkX2VuID0gdG1wX2hlYWRlciAmIDB4MEY7CisJdG1wX3dvcmRfY250cyA9IGVmdXNlX2NhbGN1bGF0ZV93b3JkX2NudHModG1wX3BrdC53b3JkX2VuKTsKKworCWlmICh0bXBfcGt0Lm9mZnNldCAhPSB0YXJnZXRfcGt0LT5vZmZzZXQpIHsKKwkJKmVmdXNlX2FkZHIgPSAqZWZ1c2VfYWRkciArICh0bXBfd29yZF9jbnRzICogMikgKyAxOworCQkqd3JpdGVfc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisJfSBlbHNlIHsKKwkJZm9yICh0bXBpbmRleCA9IDA7IHRtcGluZGV4IDwgKHRtcF93b3JkX2NudHMgKiAyKTsgdG1waW5kZXgrKykgeworCQkJaWYgKGVmdXNlX29uZV9ieXRlX3JlYWQoaHcsCisJCQkJCQkoKmVmdXNlX2FkZHIgKyAxICsgdG1waW5kZXgpLAorCQkJCQkJJmVmdXNlX2RhdGEpICYmIChlZnVzZV9kYXRhICE9IDB4RkYpKQorCQkJCWJkYXRhZW1wdHkgPSBmYWxzZTsKKwkJfQorCisJCWlmIChiZGF0YWVtcHR5ID09IGZhbHNlKSB7CisJCQkqZWZ1c2VfYWRkciA9ICplZnVzZV9hZGRyICsgKHRtcF93b3JkX2NudHMgKiAyKSArIDE7CisJCQkqd3JpdGVfc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisJCX0gZWxzZSB7CisJCQltYXRjaF93b3JkX2VuID0gMHgwRjsKKwkJCWlmICghKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDApKSB8CisJCQkgICAgKHRtcF9wa3Qud29yZF9lbiAmIEJJVCgwKSkpKQorCQkJCW1hdGNoX3dvcmRfZW4gJj0gKH5CSVQoMCkpOworCisJCQlpZiAoISgodGFyZ2V0X3BrdC0+d29yZF9lbiAmIEJJVCgxKSkgfAorCQkJICAgICh0bXBfcGt0LndvcmRfZW4gJiBCSVQoMSkpKSkKKwkJCQltYXRjaF93b3JkX2VuICY9ICh+QklUKDEpKTsKKworCQkJaWYgKCEoKHRhcmdldF9wa3QtPndvcmRfZW4gJiBCSVQoMikpIHwKKwkJCSAgICAodG1wX3BrdC53b3JkX2VuICYgQklUKDIpKSkpCisJCQkJbWF0Y2hfd29yZF9lbiAmPSAofkJJVCgyKSk7CisKKwkJCWlmICghKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDMpKSB8CisJCQkgICAgKHRtcF9wa3Qud29yZF9lbiAmIEJJVCgzKSkpKQorCQkJCW1hdGNoX3dvcmRfZW4gJj0gKH5CSVQoMykpOworCisJCQlpZiAoKG1hdGNoX3dvcmRfZW4gJiAweDBGKSAhPSAweDBGKSB7CisJCQkJYmFkd29yZGVuID0gZWZ1c2Vfd29yZF9lbmFibGVfZGF0YV93cml0ZShodywKKwkJCQkJCQkqZWZ1c2VfYWRkciArIDEsCisJCQkJCQkJdG1wX3BrdC53b3JkX2VuLAorCQkJCQkJCXRhcmdldF9wa3QtPmRhdGEpOworCisJCQkJaWYgKDB4MEYgIT0gKGJhZHdvcmRlbiAmIDB4MEYpKQl7CisJCQkJCXU4IHJlb3JnX29mZnNldCA9IG9mZnNldDsKKwkJCQkJdTggcmVvcmdfd29yZGVuID0gYmFkd29yZGVuOworCQkJCQllZnVzZV9wZ19wYWNrZXRfd3JpdGUoaHcsIHJlb3JnX29mZnNldCwKKwkJCQkJCQkgICAgICByZW9yZ193b3JkZW4sCisJCQkJCQkJICAgICAgb3JpZ2luYWxkYXRhKTsKKwkJCQl9CisKKwkJCQl0bXBfd29yZF9lbiA9IDB4MEY7CisJCQkJaWYgKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDApKSBeCisJCQkJICAgIChtYXRjaF93b3JkX2VuICYgQklUKDApKSkKKwkJCQkJdG1wX3dvcmRfZW4gJj0gKH5CSVQoMCkpOworCisJCQkJaWYgKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDEpKSBeCisJCQkJICAgIChtYXRjaF93b3JkX2VuICYgQklUKDEpKSkKKwkJCQkJdG1wX3dvcmRfZW4gJj0gKH5CSVQoMSkpOworCisJCQkJaWYgKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDIpKSBeCisJCQkJICAgIChtYXRjaF93b3JkX2VuICYgQklUKDIpKSkKKwkJCQkJdG1wX3dvcmRfZW4gJj0gKH5CSVQoMikpOworCisJCQkJaWYgKCh0YXJnZXRfcGt0LT53b3JkX2VuICYgQklUKDMpKSBeCisJCQkJICAgIChtYXRjaF93b3JkX2VuICYgQklUKDMpKSkKKwkJCQkJdG1wX3dvcmRfZW4gJj0gKH5CSVQoMykpOworCisJCQkJaWYgKCh0bXBfd29yZF9lbiAmIDB4MEYpICE9IDB4MEYpIHsKKwkJCQkJKmVmdXNlX2FkZHIgPSBlZnVzZV9nZXRfY3VycmVudF9zaXplKGh3KTsKKwkJCQkJdGFyZ2V0X3BrdC0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJCQl0YXJnZXRfcGt0LT53b3JkX2VuID0gdG1wX3dvcmRfZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJKmJjb250aW51YWwgPSBmYWxzZTsKKwkJCQl9CisJCQkJKndyaXRlX3N0YXRlID0gUEdfU1RBVEVfSEVBREVSOworCQkJCSpyZXBlYXRfdGltZXMgKz0gMTsKKwkJCQlpZiAoKnJlcGVhdF90aW1lcyA+IEVGVVNFX1JFUEVBVF9USFJFU0hPTERfKSB7CisJCQkJCSpiY29udGludWFsID0gZmFsc2U7CisJCQkJCSpicmVzdWx0ID0gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqZWZ1c2VfYWRkciArPSAoMiAqIHRtcF93b3JkX2NudHMpICsgMTsKKwkJCQl0YXJnZXRfcGt0LT5vZmZzZXQgPSBvZmZzZXQ7CisJCQkJdGFyZ2V0X3BrdC0+d29yZF9lbiA9IHdvcmRfZW47CisJCQkJKndyaXRlX3N0YXRlID0gUEdfU1RBVEVfSEVBREVSOworCQkJfQorCQl9CisJfQorCVJUUFJJTlQocnRscHJpdiwgRkVFUFJPTSwgRUZVU0VfUEcsICgiZWZ1c2UgUEdfU1RBVEVfSEVBREVSLTFcbiIpKTsKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfd3JpdGVfZGF0YV9jYXNlMihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2ICplZnVzZV9hZGRyLAorCQkJCSAgIGludCAqYmNvbnRpbnVhbCwgdTggKndyaXRlX3N0YXRlLAorCQkJCSAgIHN0cnVjdCBwZ3BrdF9zdHJ1Y3QgdGFyZ2V0X3BrdCwKKwkJCQkgICBpbnQgKnJlcGVhdF90aW1lcywgaW50ICpicmVzdWx0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcGdwa3Rfc3RydWN0IHRtcF9wa3Q7CisJdTggcGdfaGVhZGVyOworCXU4IHRtcF9oZWFkZXI7CisJdTggb3JpZ2luYWxkYXRhWzggKiBzaXplb2YodTgpXTsKKwl1OCB0bXBfd29yZF9jbnRzOworCXU4IGJhZHdvcmRlbiA9IDB4MEY7CisKKwlwZ19oZWFkZXIgPSAoKHRhcmdldF9wa3Qub2Zmc2V0IDw8IDQpICYgMHhmMCkgfCB0YXJnZXRfcGt0LndvcmRfZW47CisJZWZ1c2Vfb25lX2J5dGVfd3JpdGUoaHcsICplZnVzZV9hZGRyLCBwZ19oZWFkZXIpOworCWVmdXNlX29uZV9ieXRlX3JlYWQoaHcsICplZnVzZV9hZGRyLCAmdG1wX2hlYWRlcik7CisKKwlpZiAodG1wX2hlYWRlciA9PSBwZ19oZWFkZXIpIHsKKwkJKndyaXRlX3N0YXRlID0gUEdfU1RBVEVfREFUQTsKKwl9IGVsc2UgaWYgKHRtcF9oZWFkZXIgPT0gMHhGRikgeworCQkqd3JpdGVfc3RhdGUgPSBQR19TVEFURV9IRUFERVI7CisJCSpyZXBlYXRfdGltZXMgKz0gMTsKKwkJaWYgKCpyZXBlYXRfdGltZXMgPiBFRlVTRV9SRVBFQVRfVEhSRVNIT0xEXykgeworCQkJKmJjb250aW51YWwgPSBmYWxzZTsKKwkJCSpicmVzdWx0ID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQl0bXBfcGt0Lm9mZnNldCA9ICh0bXBfaGVhZGVyID4+IDQpICYgMHgwRjsKKwkJdG1wX3BrdC53b3JkX2VuID0gdG1wX2hlYWRlciAmIDB4MEY7CisKKwkJdG1wX3dvcmRfY250cyA9IGVmdXNlX2NhbGN1bGF0ZV93b3JkX2NudHModG1wX3BrdC53b3JkX2VuKTsKKworCQltZW1zZXQob3JpZ2luYWxkYXRhLCAweGZmLCAgOCAqIHNpemVvZih1OCkpOworCisJCWlmIChlZnVzZV9wZ19wYWNrZXRfcmVhZChodywgdG1wX3BrdC5vZmZzZXQsIG9yaWdpbmFsZGF0YSkpIHsKKwkJCWJhZHdvcmRlbiA9IGVmdXNlX3dvcmRfZW5hYmxlX2RhdGFfd3JpdGUoaHcsCisJCQkJCQkJCSplZnVzZV9hZGRyICsgMSwKKwkJCQkJCQkJdG1wX3BrdC53b3JkX2VuLAorCQkJCQkJCQlvcmlnaW5hbGRhdGEpOworCisJCQlpZiAoMHgwRiAhPSAoYmFkd29yZGVuICYgMHgwRikpIHsKKwkJCQl1OCByZW9yZ19vZmZzZXQgPSB0bXBfcGt0Lm9mZnNldDsKKwkJCQl1OCByZW9yZ193b3JkZW4gPSBiYWR3b3JkZW47CisJCQkJZWZ1c2VfcGdfcGFja2V0X3dyaXRlKGh3LCByZW9yZ19vZmZzZXQsCisJCQkJCQkgICAgICByZW9yZ193b3JkZW4sCisJCQkJCQkgICAgICBvcmlnaW5hbGRhdGEpOworCQkJCSplZnVzZV9hZGRyID0gZWZ1c2VfZ2V0X2N1cnJlbnRfc2l6ZShodyk7CisJCQl9IGVsc2UgeworCQkJCSplZnVzZV9hZGRyID0gKmVmdXNlX2FkZHIgKworCQkJCQkgICAgICAodG1wX3dvcmRfY250cyAqIDIpICsgMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSplZnVzZV9hZGRyID0gKmVmdXNlX2FkZHIgKyAodG1wX3dvcmRfY250cyAqIDIpICsgMTsKKwkJfQorCisJCSp3cml0ZV9zdGF0ZSA9IFBHX1NUQVRFX0hFQURFUjsKKwkJKnJlcGVhdF90aW1lcyArPSAxOworCQlpZiAoKnJlcGVhdF90aW1lcyA+IEVGVVNFX1JFUEVBVF9USFJFU0hPTERfKSB7CisJCQkqYmNvbnRpbnVhbCA9IGZhbHNlOworCQkJKmJyZXN1bHQgPSBmYWxzZTsKKwkJfQorCisJCVJUUFJJTlQocnRscHJpdiwgRkVFUFJPTSwgRUZVU0VfUEcsCisJCQkoImVmdXNlIFBHX1NUQVRFX0hFQURFUi0yXG4iKSk7CisJfQorfQorCitzdGF0aWMgaW50IGVmdXNlX3BnX3BhY2tldF93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgdTggb2Zmc2V0LCB1OCB3b3JkX2VuLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHBncGt0X3N0cnVjdCB0YXJnZXRfcGt0OworCXU4IHdyaXRlX3N0YXRlID0gUEdfU1RBVEVfSEVBREVSOworCWludCBiY29udGludWFsID0gdHJ1ZSwgYmRhdGFlbXB0eSA9IHRydWUsIGJyZXN1bHQgPSB0cnVlOworCXUxNiBlZnVzZV9hZGRyID0gMDsKKwl1OCBlZnVzZV9kYXRhOworCXU4IHRhcmdldF93b3JkX2NudHMgPSAwOworCXU4IGJhZHdvcmRlbiA9IDB4MEY7CisJc3RhdGljIGludCByZXBlYXRfdGltZXMgPSAwOworCisJaWYgKGVmdXNlX2dldF9jdXJyZW50X3NpemUoaHcpID49IChFRlVTRV9NQVhfU0laRSAtCisJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU19MRU5dKSkgeworCQlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sIEVGVVNFX1BHLAorCQkJKCJlZnVzZV9wZ19wYWNrZXRfd3JpdGUgZXJyb3IgXG4iKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl0YXJnZXRfcGt0Lm9mZnNldCA9IG9mZnNldDsKKwl0YXJnZXRfcGt0LndvcmRfZW4gPSB3b3JkX2VuOworCisJbWVtc2V0KHRhcmdldF9wa3QuZGF0YSwgMHhGRiwgIDggKiBzaXplb2YodTgpKTsKKworCWVmdXNlX3dvcmRfZW5hYmxlX2RhdGFfcmVhZCh3b3JkX2VuLCBkYXRhLCB0YXJnZXRfcGt0LmRhdGEpOworCXRhcmdldF93b3JkX2NudHMgPSBlZnVzZV9jYWxjdWxhdGVfd29yZF9jbnRzKHRhcmdldF9wa3Qud29yZF9lbik7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sIEVGVVNFX1BHLCAoImVmdXNlIFBvd2VyIE9OXG4iKSk7CisKKwl3aGlsZSAoYmNvbnRpbnVhbCAmJiAoZWZ1c2VfYWRkciA8IChFRlVTRV9NQVhfU0laRSAtCisJCXJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU19MRU5dKSkpIHsKKworCQlpZiAod3JpdGVfc3RhdGUgPT0gUEdfU1RBVEVfSEVBREVSKSB7CisJCQliZGF0YWVtcHR5ID0gdHJ1ZTsKKwkJCWJhZHdvcmRlbiA9IDB4MEY7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZFRVBST00sIEVGVVNFX1BHLAorCQkJCSgiZWZ1c2UgUEdfU1RBVEVfSEVBREVSXG4iKSk7CisKKwkJCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCBlZnVzZV9hZGRyLCAmZWZ1c2VfZGF0YSkgJiYKKwkJCSAgICAoZWZ1c2VfZGF0YSAhPSAweEZGKSkKKwkJCQllZnVzZV93cml0ZV9kYXRhX2Nhc2UxKGh3LCAmZWZ1c2VfYWRkciwKKwkJCQkJCSAgICAgICBlZnVzZV9kYXRhLCBvZmZzZXQsCisJCQkJCQkgICAgICAgJmJjb250aW51YWwsCisJCQkJCQkgICAgICAgJndyaXRlX3N0YXRlLAorCQkJCQkJICAgICAgICZ0YXJnZXRfcGt0LAorCQkJCQkJICAgICAgICZyZXBlYXRfdGltZXMsICZicmVzdWx0LAorCQkJCQkJICAgICAgIHdvcmRfZW4pOworCQkJZWxzZQorCQkJCWVmdXNlX3dyaXRlX2RhdGFfY2FzZTIoaHcsICZlZnVzZV9hZGRyLAorCQkJCQkJICAgICAgICZiY29udGludWFsLAorCQkJCQkJICAgICAgICZ3cml0ZV9zdGF0ZSwKKwkJCQkJCSAgICAgICB0YXJnZXRfcGt0LAorCQkJCQkJICAgICAgICZyZXBlYXRfdGltZXMsCisJCQkJCQkgICAgICAgJmJyZXN1bHQpOworCisJCX0gZWxzZSBpZiAod3JpdGVfc3RhdGUgPT0gUEdfU1RBVEVfREFUQSkgeworCQkJUlRQUklOVChydGxwcml2LCBGRUVQUk9NLCBFRlVTRV9QRywKKwkJCQkoImVmdXNlIFBHX1NUQVRFX0RBVEFcbiIpKTsKKwkJCWJhZHdvcmRlbiA9IDB4MGY7CisJCQliYWR3b3JkZW4gPQorCQkJICAgIGVmdXNlX3dvcmRfZW5hYmxlX2RhdGFfd3JpdGUoaHcsIGVmdXNlX2FkZHIgKyAxLAorCQkJCQkJCSB0YXJnZXRfcGt0LndvcmRfZW4sCisJCQkJCQkJIHRhcmdldF9wa3QuZGF0YSk7CisKKwkJCWlmICgoYmFkd29yZGVuICYgMHgwRikgPT0gMHgwRikgeworCQkJCWJjb250aW51YWwgPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJZWZ1c2VfYWRkciA9CisJCQkJICAgIGVmdXNlX2FkZHIgKyAoMiAqIHRhcmdldF93b3JkX2NudHMpICsgMTsKKworCQkJCXRhcmdldF9wa3Qub2Zmc2V0ID0gb2Zmc2V0OworCQkJCXRhcmdldF9wa3Qud29yZF9lbiA9IGJhZHdvcmRlbjsKKwkJCQl0YXJnZXRfd29yZF9jbnRzID0KKwkJCQkgICAgZWZ1c2VfY2FsY3VsYXRlX3dvcmRfY250cyh0YXJnZXRfcGt0LgorCQkJCQkJCSAgICAgIHdvcmRfZW4pOworCQkJCXdyaXRlX3N0YXRlID0gUEdfU1RBVEVfSEVBREVSOworCQkJCXJlcGVhdF90aW1lcysrOworCQkJCWlmIChyZXBlYXRfdGltZXMgPiBFRlVTRV9SRVBFQVRfVEhSRVNIT0xEXykgeworCQkJCQliY29udGludWFsID0gZmFsc2U7CisJCQkJCWJyZXN1bHQgPSBmYWxzZTsKKwkJCQl9CisJCQkJUlRQUklOVChydGxwcml2LCBGRUVQUk9NLCBFRlVTRV9QRywKKwkJCQkJKCJlZnVzZSBQR19TVEFURV9IRUFERVItM1xuIikpOworCQkJfQorCQl9CisJfQorCisJaWYgKGVmdXNlX2FkZHIgPj0gKEVGVVNFX01BWF9TSVpFIC0KKwkJcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX09PQl9QUk9URUNUX0JZVEVTX0xFTl0pKSB7CisJCVJUX1RSQUNFKENPTVBfRUZVU0UsIERCR19MT1VELAorCQkJICgiZWZ1c2VfYWRkciglI3gpIE91dCBvZiBzaXplISFcbiIsIGVmdXNlX2FkZHIpKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZWZ1c2Vfd29yZF9lbmFibGVfZGF0YV9yZWFkKHU4IHdvcmRfZW4sIHU4ICogc291cmRhdGEsCisJCQkJCXU4ICp0YXJnZXRkYXRhKQoreworCWlmICghKHdvcmRfZW4gJiBCSVQoMCkpKSB7CisJCXRhcmdldGRhdGFbMF0gPSBzb3VyZGF0YVswXTsKKwkJdGFyZ2V0ZGF0YVsxXSA9IHNvdXJkYXRhWzFdOworCX0KKworCWlmICghKHdvcmRfZW4gJiBCSVQoMSkpKSB7CisJCXRhcmdldGRhdGFbMl0gPSBzb3VyZGF0YVsyXTsKKwkJdGFyZ2V0ZGF0YVszXSA9IHNvdXJkYXRhWzNdOworCX0KKworCWlmICghKHdvcmRfZW4gJiBCSVQoMikpKSB7CisJCXRhcmdldGRhdGFbNF0gPSBzb3VyZGF0YVs0XTsKKwkJdGFyZ2V0ZGF0YVs1XSA9IHNvdXJkYXRhWzVdOworCX0KKworCWlmICghKHdvcmRfZW4gJiBCSVQoMykpKSB7CisJCXRhcmdldGRhdGFbNl0gPSBzb3VyZGF0YVs2XTsKKwkJdGFyZ2V0ZGF0YVs3XSA9IHNvdXJkYXRhWzddOworCX0KK30KKworc3RhdGljIHU4IGVmdXNlX3dvcmRfZW5hYmxlX2RhdGFfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHUxNiBlZnVzZV9hZGRyLCB1OCB3b3JkX2VuLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTE2IHRtcGFkZHI7CisJdTE2IHN0YXJ0X2FkZHIgPSBlZnVzZV9hZGRyOworCXU4IGJhZHdvcmRlbiA9IDB4MEY7CisJdTggdG1wZGF0YVs4XTsKKworCW1lbXNldCh0bXBkYXRhLCAweGZmLCBQR1BLVF9EQVRBX1NJWkUpOworCVJUX1RSQUNFKENPTVBfRUZVU0UsIERCR19MT1VELAorCQkgKCJ3b3JkX2VuID0gJXggZWZ1c2VfYWRkcj0leFxuIiwgd29yZF9lbiwgZWZ1c2VfYWRkcikpOworCisJaWYgKCEod29yZF9lbiAmIEJJVCgwKSkpIHsKKwkJdG1wYWRkciA9IHN0YXJ0X2FkZHI7CisJCWVmdXNlX29uZV9ieXRlX3dyaXRlKGh3LCBzdGFydF9hZGRyKyssIGRhdGFbMF0pOworCQllZnVzZV9vbmVfYnl0ZV93cml0ZShodywgc3RhcnRfYWRkcisrLCBkYXRhWzFdKTsKKworCQllZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCB0bXBhZGRyLCAmdG1wZGF0YVswXSk7CisJCWVmdXNlX29uZV9ieXRlX3JlYWQoaHcsIHRtcGFkZHIgKyAxLCAmdG1wZGF0YVsxXSk7CisJCWlmICgoZGF0YVswXSAhPSB0bXBkYXRhWzBdKSB8fCAoZGF0YVsxXSAhPSB0bXBkYXRhWzFdKSkKKwkJCWJhZHdvcmRlbiAmPSAofkJJVCgwKSk7CisJfQorCisJaWYgKCEod29yZF9lbiAmIEJJVCgxKSkpIHsKKwkJdG1wYWRkciA9IHN0YXJ0X2FkZHI7CisJCWVmdXNlX29uZV9ieXRlX3dyaXRlKGh3LCBzdGFydF9hZGRyKyssIGRhdGFbMl0pOworCQllZnVzZV9vbmVfYnl0ZV93cml0ZShodywgc3RhcnRfYWRkcisrLCBkYXRhWzNdKTsKKworCQllZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCB0bXBhZGRyLCAmdG1wZGF0YVsyXSk7CisJCWVmdXNlX29uZV9ieXRlX3JlYWQoaHcsIHRtcGFkZHIgKyAxLCAmdG1wZGF0YVszXSk7CisJCWlmICgoZGF0YVsyXSAhPSB0bXBkYXRhWzJdKSB8fCAoZGF0YVszXSAhPSB0bXBkYXRhWzNdKSkKKwkJCWJhZHdvcmRlbiAmPSAofkJJVCgxKSk7CisJfQorCisJaWYgKCEod29yZF9lbiAmIEJJVCgyKSkpIHsKKwkJdG1wYWRkciA9IHN0YXJ0X2FkZHI7CisJCWVmdXNlX29uZV9ieXRlX3dyaXRlKGh3LCBzdGFydF9hZGRyKyssIGRhdGFbNF0pOworCQllZnVzZV9vbmVfYnl0ZV93cml0ZShodywgc3RhcnRfYWRkcisrLCBkYXRhWzVdKTsKKworCQllZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCB0bXBhZGRyLCAmdG1wZGF0YVs0XSk7CisJCWVmdXNlX29uZV9ieXRlX3JlYWQoaHcsIHRtcGFkZHIgKyAxLCAmdG1wZGF0YVs1XSk7CisJCWlmICgoZGF0YVs0XSAhPSB0bXBkYXRhWzRdKSB8fCAoZGF0YVs1XSAhPSB0bXBkYXRhWzVdKSkKKwkJCWJhZHdvcmRlbiAmPSAofkJJVCgyKSk7CisJfQorCisJaWYgKCEod29yZF9lbiAmIEJJVCgzKSkpIHsKKwkJdG1wYWRkciA9IHN0YXJ0X2FkZHI7CisJCWVmdXNlX29uZV9ieXRlX3dyaXRlKGh3LCBzdGFydF9hZGRyKyssIGRhdGFbNl0pOworCQllZnVzZV9vbmVfYnl0ZV93cml0ZShodywgc3RhcnRfYWRkcisrLCBkYXRhWzddKTsKKworCQllZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCB0bXBhZGRyLCAmdG1wZGF0YVs2XSk7CisJCWVmdXNlX29uZV9ieXRlX3JlYWQoaHcsIHRtcGFkZHIgKyAxLCAmdG1wZGF0YVs3XSk7CisJCWlmICgoZGF0YVs2XSAhPSB0bXBkYXRhWzZdKSB8fCAoZGF0YVs3XSAhPSB0bXBkYXRhWzddKSkKKwkJCWJhZHdvcmRlbiAmPSAofkJJVCgzKSk7CisJfQorCisJcmV0dXJuIGJhZHdvcmRlbjsKK30KKworc3RhdGljIHZvaWQgZWZ1c2VfcG93ZXJfc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBid3JpdGUsIHU4IHB3cnN0YXRlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4IHRlbXB2YWw7CisJdTE2IHRtcFYxNjsKKworCWlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwl7CisJCWlmIChwd3JzdGF0ZSA9PSB0cnVlKQorCQl7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQUNDRVNTXSwgMHg2OSk7CisKKwkJCS8vIDEuMlYgUG93ZXI6IEZyb20gVkRET04gd2l0aCBQb3dlciBDdXQoMHgwMDAwaFsxNV0pLCBkZWZ1YWx0IHZhbGlkCisJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0lTT19DVFJMXSk7CisKKwkJCXByaW50aygiU1lTX0lTT19DVFJMPSUwNHguXG4iLHRtcFYxNik7CisJCQlpZiggISAodG1wVjE2ICYgUFdDX0VWMTJWICkgKXsKKwkJCQl0bXBWMTYgfD0gUFdDX0VWMTJWIDsKKwkJCQkgLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLFJFR19TWVNfSVNPX0NUUkwsdG1wVjE2KTsKKwkJCX0KKwkJCS8vIFJlc2V0OiAweDAwMDBoWzI4XSwgZGVmYXVsdCB2YWxpZAorIAkJCXRtcFYxNiA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfRlVOQ19FTl0pOworCQkJcHJpbnRrKCJTWVNfRlVOQ19FTj0lMDR4LlxuIix0bXBWMTYpOworCQkJaWYoICEodG1wVjE2ICYgRkVOX0VMRFIpICl7CisJCQkJdG1wVjE2IHw9IEZFTl9FTERSIDsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dLCB0bXBWMTYpOworCQkJfQorCisJCQkvLyBDbG9jazogR2F0ZWQoMHgwMDA4aFs1XSkgOE0oMHgwMDA4aFsxXSkgY2xvY2sgZnJvbSBBTkEsIGRlZmF1bHQgdmFsaWQKKwkJCXRtcFYxNiA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfQ0xLXSApOworCQkJcHJpbnRrKCJTWVNfQ0xLPSUwNHguXG4iLHRtcFYxNik7CisJCQlpZiggKCEodG1wVjE2ICYgTE9BREVSX0NMS19FTikgKSAgfHwoISh0bXBWMTYgJiBBTkE4TSkgKSApCisJCQl7CisJCQkJdG1wVjE2IHw9IChMT0FERVJfQ0xLX0VOIHxBTkE4TSApIDsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbU1lTX0NMS10sIHRtcFYxNik7CisJCQl9CisKKwkJCWlmKGJ3cml0ZSA9PSB0cnVlKQorCQkJeworCQkJCS8vIEVuYWJsZSBMRE8gMi41ViBiZWZvcmUgcmVhZC93cml0ZSBhY3Rpb24KKwkJCQl0ZW1wdmFsID0gcnRsX3JlYWRfd29yZChydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMyk7CisJCQkJcHJpbnRrKCJFRlVTRV9URVNUPSUwNHguXG4iLHRtcFYxNik7CisJCQkJdGVtcHZhbCAmPSB+KEJJVCgzKSB8IEJJVCg0KSB8QklUKDUpIHwgQklUKDYpKTsKKwkJCQl0ZW1wdmFsIHw9IChWT0xUQUdFX1YyNSA8PCAzKTsKKwkJCQl0ZW1wdmFsIHw9IEJJVCg3KTsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMywgdGVtcHZhbCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQUNDRVNTXSwgMHgwMCk7CisJCQlpZihid3JpdGUgPT0gdHJ1ZSl7CisJCQkJLy8gRGlzYWJsZSBMRE8gMi41ViBhZnRlciByZWFkL3dyaXRlIGFjdGlvbgorCQkJCXRlbXB2YWwgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzKTsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMywgKHRlbXB2YWwgJiAweDdGKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHB3cnN0YXRlID09IHRydWUgJiYgKHJ0bGhhbC0+aHdfdHlwZSAhPQorCQkJSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UpKSB7CisKKwkJCWlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSkKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQUNDRVNTXSwKKwkJCQkJCTB4NjkpOworCisJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0lTT19DVFJMXSk7CisJCQlpZiAoISh0bXBWMTYgJiBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfUFdDX0VWMTJWXSkpIHsKKwkJCQl0bXBWMTYgfD0gcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1BXQ19FVjEyVl07CisJCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwKKwkJCQkJICAgICAgIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfSVNPX0NUUkxdLAorCQkJCQkgICAgICAgdG1wVjE2KTsKKwkJCX0KKworCQkJdG1wVjE2ID0gcnRsX3JlYWRfd29yZChydGxwcml2LAorCQkJCQkgICAgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19GVU5DX0VOXSk7CisJCQlpZiAoISh0bXBWMTYgJiBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfRkVOX0VMRFJdKSkgeworCQkJCXRtcFYxNiB8PSBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfRkVOX0VMRFJdOworCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dLCB0bXBWMTYpOworCQkJfQorCisJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tTWVNfQ0xLXSk7CisJCQlpZiAoKCEodG1wVjE2ICYgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0xPQURFUl9DTEtfRU5dKSkgfHwKKwkJCSAgICAoISh0bXBWMTYgJiBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQU5BOE1dKSkpIHsKKwkJCQl0bXBWMTYgfD0gKHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9MT0FERVJfQ0xLX0VOXSB8CisJCQkJCSAgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9BTkE4TV0pOworCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0NMS10sIHRtcFYxNik7CisJCQl9CisJCX0KKworCQlpZiAocHdyc3RhdGUgPT0gdHJ1ZSkgeworCQkJaWYgKGJ3cml0ZSA9PSB0cnVlKSB7CisJCQkJdGVtcHZhbCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJCQlydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKworCQkJCQkJCTMpOworCisJCQkJaWYgKHJ0bGhhbC0+aHdfdHlwZSAhPSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJTRSkgeworCQkJCQl0ZW1wdmFsICY9IDB4MEY7CisJCQkJCXRlbXB2YWwgfD0gKFZPTFRBR0VfVjI1IDw8IDQpOworCQkJCX0KKworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzLAorCQkJCQkgICAgICAgKHRlbXB2YWwgfCAweDgwKSk7CisJCQl9CisKKwkJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UpIHsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ0xLXSwKKwkJCQkJCQkweDAzKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE4OEVFKQorCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9BQ0NFU1NdLCAwKTsKKworCQkJaWYgKGJ3cml0ZSA9PSB0cnVlKSB7CisJCQkJdGVtcHZhbCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJCQlydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKworCQkJCQkJCTMpOworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsCisJCQkJCSAgICAgICBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfVEVTVF0gKyAzLAorCQkJCQkgICAgICAgKHRlbXB2YWwgJiAweDdGKSk7CisJCQl9CisKKwkJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UpIHsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQ0xLXSwKKwkJCQkJCQkweDAyKTsKKwkJCX0KKworCQl9CisJfQorCit9CisKK3N0YXRpYyB1MTYgZWZ1c2VfZ2V0X2N1cnJlbnRfc2l6ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlpbnQgYmNvbnRpbnVhbCA9IHRydWU7CisJdTE2IGVmdXNlX2FkZHIgPSAwOworCXU4IGhvZmZzZXQsIGh3b3JkZW47CisJdTggZWZ1c2VfZGF0YSwgd29yZF9jbnRzOworCisJd2hpbGUgKGJjb250aW51YWwgJiYgZWZ1c2Vfb25lX2J5dGVfcmVhZChodywgZWZ1c2VfYWRkciwgJmVmdXNlX2RhdGEpCisJICAgICAgICYmIChlZnVzZV9hZGRyIDwgRUZVU0VfTUFYX1NJWkUpKSB7CisJCWlmIChlZnVzZV9kYXRhICE9IDB4RkYpIHsKKwkJCWhvZmZzZXQgPSAoZWZ1c2VfZGF0YSA+PiA0KSAmIDB4MEY7CisJCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7CisJCQl3b3JkX2NudHMgPSBlZnVzZV9jYWxjdWxhdGVfd29yZF9jbnRzKGh3b3JkZW4pOworCQkJZWZ1c2VfYWRkciA9IGVmdXNlX2FkZHIgKyAod29yZF9jbnRzICogMikgKyAxOworCQl9IGVsc2UgeworCQkJYmNvbnRpbnVhbCA9IGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIGVmdXNlX2FkZHI7Cit9CisKK3N0YXRpYyB1OCBlZnVzZV9jYWxjdWxhdGVfd29yZF9jbnRzKHU4IHdvcmRfZW4pCit7CisJdTggd29yZF9jbnRzID0gMDsKKwlpZiAoISh3b3JkX2VuICYgQklUKDApKSkKKwkJd29yZF9jbnRzKys7CisJaWYgKCEod29yZF9lbiAmIEJJVCgxKSkpCisJCXdvcmRfY250cysrOworCWlmICghKHdvcmRfZW4gJiBCSVQoMikpKQorCQl3b3JkX2NudHMrKzsKKwlpZiAoISh3b3JkX2VuICYgQklUKDMpKSkKKwkJd29yZF9jbnRzKys7CisJcmV0dXJuIHdvcmRfY250czsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZmNiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2VmdXNlLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMX0VGVVNFX0hfCisjZGVmaW5lIF9fUlRMX0VGVVNFX0hfCisKKyNkZWZpbmUgRUZVU0VfSUNfSURfT0ZGU0VUCQk1MDYKKworLyoKKyNkZWZpbmUgRUZVU0VfUkVBTF9DT05URU5UX0xFTgk1MTIKKyNkZWZpbmUgRUZVU0VfTUFQX0xFTgkJCTEyOAorI2RlZmluZSBFRlVTRV9NQVhfU0VDVElPTgkJMTYKKyNkZWZpbmUgRUZVU0VfTUFYX1dPUkRfVU5JVAkJNAorI2RlZmluZSBFRlVTRV9JQ19JRF9PRkZTRVQJCTUwNgorKi8KKworI2RlZmluZSBFRlVTRV9NQVhfV09SRF9VTklUCQk0CisKKyNkZWZpbmUgRUZVU0VfSU5JVF9NQVAJCQkwCisjZGVmaW5lIEVGVVNFX01PRElGWV9NQVAJCTEKKworI2RlZmluZSBQR19TVEFURV9IRUFERVIgCQkweDAxCisjZGVmaW5lIFBHX1NUQVRFX1dPUkRfMAkJCTB4MDIKKyNkZWZpbmUgUEdfU1RBVEVfV09SRF8xCQkJMHgwNAorI2RlZmluZSBQR19TVEFURV9XT1JEXzIJCQkweDA4CisjZGVmaW5lIFBHX1NUQVRFX1dPUkRfMwkJCTB4MTAKKyNkZWZpbmUgUEdfU1RBVEVfREFUQQkJCTB4MjAKKworI2RlZmluZSBQR19TV0JZVEVfSAkJCTB4MDEKKyNkZWZpbmUgUEdfU1dCWVRFX0wJCQkweDAyCisKKyNkZWZpbmUgX1BPV0VST05fREVMQVlfCisjZGVmaW5lIF9QUkVfRVhFQ1VURV9SRUFEX0NNRF8KKworI2RlZmluZSBFRlVTRV9SRVBFQVRfVEhSRVNIT0xEXwkJMworI2RlZmluZSBFRlVTRV9FUlJPRV9IQU5ETEUJCTEKKworc3RydWN0IGVmdXNlX21hcCB7CisJdTggb2Zmc2V0OworCXU4IHdvcmRfc3RhcnQ7CisJdTggYnl0ZV9zdGFydDsKKwl1OCBieXRlX2NudHM7Cit9OworCitzdHJ1Y3QgcGdwa3Rfc3RydWN0IHsKKwl1OCBvZmZzZXQ7CisJdTggd29yZF9lbjsKKwl1OCBkYXRhWzhdOworfTsKKworZW51bSBlZnVzZV9kYXRhX2l0ZW0geworCUVGVVNFX0NISVBfSUQgPSAwLAorCUVGVVNFX0xET19TRVRUSU5HLAorCUVGVVNFX0NMS19TRVRUSU5HLAorCUVGVVNFX1NESU9fU0VUVElORywKKwlFRlVTRV9DQ0NSLAorCUVGVVNFX1NESU9fTU9ERSwKKwlFRlVTRV9PQ1IsCisJRUZVU0VfRjBDSVMsCisJRUZVU0VfRjFDSVMsCisJRUZVU0VfTUFDX0FERFIsCisJRUZVU0VfRUVQUk9NX1ZFUiwKKwlFRlVTRV9DSEFOX1BMQU4sCisJRUZVU0VfVFhQV19UQUIKK307CisKK2VudW0geworCVZPTFRBR0VfVjI1ID0gMHgwMywKKwlMRE9FMjVfU0hJRlQgPSAyOCwKK307CisKK3N0cnVjdCBlZnVzZV9wcml2IHsKKwl1OCBpZFsyXTsKKwl1OCBsZG9fc2V0dGluZ1syXTsKKwl1OCBjbGtfc2V0dGluZ1syXTsKKwl1OCBjY2NyOworCXU4IHNkaW9fbW9kZTsKKwl1OCBvY3JbM107CisJdTggY2lzMFsxN107CisJdTggY2lzMVs0OF07CisJdTggbWFjX2FkZHJbNl07CisJdTggZWVwcm9tX3Zlcm5vOworCXU4IGNoYW5uZWxfcGxhbjsKKwl1OCB0eF9wb3dlcl9iWzE0XTsKKwl1OCB0eF9wb3dlcl9nWzE0XTsKK307CisKK2V4dGVybiB2b2lkIHJlYWRfZWZ1c2VfYnl0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IF9vZmZzZXQsIHU4ICpwYnVmKTsKK2V4dGVybiB2b2lkIGVmdXNlX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHU4IGVmdXNlX3JlYWRfMWJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBhZGRyZXNzKTsKK2V4dGVybiBpbnQgZWZ1c2Vfb25lX2J5dGVfcmVhZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGFkZHIsIHU4ICpkYXRhKTsKK2V4dGVybiB2b2lkIGVmdXNlX3dyaXRlXzFieXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgYWRkcmVzcywgdTggdmFsdWUpOworZXh0ZXJuIHZvaWQgcmVhZF9lZnVzZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IF9vZmZzZXQsCisJCSAgICAgICB1MTYgX3NpemVfYnl0ZSwgdTggKiBwYnVmKTsKK2V4dGVybiB2b2lkIGVmdXNlX3NoYWRvd19yZWFkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlLAorCQkJICAgICAgdTE2IG9mZnNldCwgdTMyICogdmFsdWUpOworZXh0ZXJuIHZvaWQgZWZ1c2Vfc2hhZG93X3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlLAorCQkJICAgICAgIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSk7CitleHRlcm4gYm9vbCBlZnVzZV9zaGFkb3dfdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2V4dGVybiBib29sIGVmdXNlX3NoYWRvd191cGRhdGVfY2hrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2V4dGVybiB2b2lkIHJ0bF9lZnVzZV9zaGFkb3dfbWFwX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CitleHRlcm4gdm9pZCBlZnVzZV9mb3JjZV93cml0ZV92ZW5kb3JfSWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHZvaWQgZWZ1c2VfcmVfcGdfc2VjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggc2VjdGlvbl9pZHgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE2NTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYwpAQCAtMCwwICsxLDI1NDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIndpZmkuaCIKKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisjaW5jbHVkZSAicHMuaCIKKyNpbmNsdWRlICJlZnVzZS5oIgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywyLDApKQorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1MTYgcGNpYnJpZGdlX3ZlbmRvcnNbUENJX0JSSURHRV9WRU5ET1JfTUFYXSA9IHsKKwlJTlRFTF9WRU5ET1JfSUQsCisJQVRJX1ZFTkRPUl9JRCwKKwlBTURfVkVORE9SX0lELAorCVNJU19WRU5ET1JfSUQKK307CisKK3N0YXRpYyBjb25zdCB1OCBhY190b19od3FbXSA9IHsKKwlWT19RVUVVRSwKKwlWSV9RVUVVRSwKKwlCRV9RVUVVRSwKKwlCS19RVUVVRQorfTsKKwordTggX3J0bF9tYWNfdG9faHdxdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKwl1OCBxdWV1ZV9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCisJaWYgKHVubGlrZWx5KGllZWU4MDIxMV9pc19iZWFjb24oZmMpKSkKKwkJcmV0dXJuIEJFQUNPTl9RVUVVRTsKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpIHx8IGllZWU4MDIxMV9pc19jdGwoZmMpKQorCQlyZXR1cm4gTUdOVF9RVUVVRTsKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MlNFKQorCQlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSkKKwkJCXJldHVybiBISUdIX1FVRVVFOworCisJcmV0dXJuIGFjX3RvX2h3cVtxdWV1ZV9pbmRleF07Cit9CisKKy8qIFVwZGF0ZSBQQ0kgZGVwZW5kZW50IGRlZmF1bHQgc2V0dGluZ3MqLworc3RhdGljIHZvaWQgX3J0bF9wY2lfdXBkYXRlX2RlZmF1bHRfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXU4IHBjaWJyaWRnZV92ZW5kb3IgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvcjsKKwl1OCBpbml0X2FzcG07CisKKwlwcHNjLT5yZWdfcmZwc19sZXZlbCA9IDA7CisJcHBzYy0+Yl9zdXBwb3J0X2FzcG0gPSAwOworCisJLypVcGRhdGUgUENJIEFTUE0gc2V0dGluZyAqLworCXBwc2MtPmNvbnN0X2FtZHBjaV9hc3BtID0gcnRscGNpLT5jb25zdF9hbWRwY2lfYXNwbTsKKwlzd2l0Y2ggKHJ0bHBjaS0+Y29uc3RfcGNpX2FzcG0pIHsKKwljYXNlIDA6CisJCS8qTm8gQVNQTSAqLworCQlicmVhazsKKworCWNhc2UgMToKKwkJLypBU1BNIGR5bmFtaWNhbGx5IGVuYWJsZWQvZGlzYWJsZS4gKi8KKwkJcHBzYy0+cmVnX3JmcHNfbGV2ZWwgfD0gUlRfUkZfTFBTX0xFVkVMX0FTUE07CisJCWJyZWFrOworCisJY2FzZSAyOgorCQkvKkFTUE0gd2l0aCBDbG9jayBSZXEgZHluYW1pY2FsbHkgZW5hYmxlZC9kaXNhYmxlLiAqLworCQlwcHNjLT5yZWdfcmZwc19sZXZlbCB8PSAoUlRfUkZfTFBTX0xFVkVMX0FTUE0gfAorCQkJCQkgUlRfUkZfT0ZGX0xFVkxfQ0xLX1JFUSk7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQkvKgorCQkgKiBBbHdheXMgZW5hYmxlIEFTUE0gYW5kIENsb2NrIFJlcQorCQkgKiBmcm9tIGluaXRpYWxpemF0aW9uIHRvIGhhbHQuCisJCSAqICovCisJCXBwc2MtPnJlZ19yZnBzX2xldmVsICY9IH4oUlRfUkZfTFBTX0xFVkVMX0FTUE0pOworCQlwcHNjLT5yZWdfcmZwc19sZXZlbCB8PSAoUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0gfAorCQkJCQkgUlRfUkZfT0ZGX0xFVkxfQ0xLX1JFUSk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQkvKgorCQkgKiBBbHdheXMgZW5hYmxlIEFTUE0gd2l0aG91dCBDbG9jayBSZXEKKwkJICogZnJvbSBpbml0aWFsaXphdGlvbiB0byBoYWx0LgorCQkgKiAqLworCQlwcHNjLT5yZWdfcmZwc19sZXZlbCAmPSB+KFJUX1JGX0xQU19MRVZFTF9BU1BNIHwKKwkJCQkJICBSVF9SRl9PRkZfTEVWTF9DTEtfUkVRKTsKKwkJcHBzYy0+cmVnX3JmcHNfbGV2ZWwgfD0gUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE07CisJCWJyZWFrOworCX0KKworCXBwc2MtPnJlZ19yZnBzX2xldmVsIHw9IFJUX1JGX09GRl9MRVZMX0hBTFRfTklDOworCisJLypVcGRhdGUgUmFkaW8gT0ZGIHNldHRpbmcgKi8KKwlzd2l0Y2ggKHJ0bHBjaS0+Y29uc3RfaHdzd19yZm9mZl9kMykgeworCWNhc2UgMToKKwkJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfTFBTX0xFVkVMX0FTUE0pCisJCQlwcHNjLT5yZWdfcmZwc19sZXZlbCB8PSBSVF9SRl9PRkZfTEVWTF9BU1BNOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfTFBTX0xFVkVMX0FTUE0pCisJCQlwcHNjLT5yZWdfcmZwc19sZXZlbCB8PSBSVF9SRl9PRkZfTEVWTF9BU1BNOworCQlwcHNjLT5yZWdfcmZwc19sZXZlbCB8PSBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQzsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBwc2MtPnJlZ19yZnBzX2xldmVsIHw9IFJUX1JGX09GRl9MRVZMX1BDSV9EMzsKKwkJYnJlYWs7CisJfQorCisJLypTZXQgSFcgZGVmaW5pdGlvbiB0byBkZXRlcm1pbmUgaWYgaXQgc3VwcG9ydHMgQVNQTS4gKi8KKwlzd2l0Y2ggKHJ0bHBjaS0+Y29uc3Rfc3VwcG9ydF9wY2lhc3BtKSB7CisJY2FzZSAwOnsKKwkJCS8qTm90IHN1cHBvcnQgQVNQTS4gKi8KKwkJCWJvb2wgYl9zdXBwb3J0X2FzcG0gPSBmYWxzZTsKKwkJCXBwc2MtPmJfc3VwcG9ydF9hc3BtID0gYl9zdXBwb3J0X2FzcG07CisJCQlicmVhazsKKwkJfQorCWNhc2UgMTp7CisJCQkvKlN1cHBvcnQgQVNQTS4gKi8KKwkJCWJvb2wgYl9zdXBwb3J0X2FzcG0gPSB0cnVlOworCQkJYm9vbCBiX3N1cHBvcnRfYmFja2Rvb3IgPSB0cnVlOworCQkJcHBzYy0+Yl9zdXBwb3J0X2FzcG0gPSBiX3N1cHBvcnRfYXNwbTsKKworCQkJLyppZihwcml2LT5vZW1faWQgPT0gUlRfQ0lEX1RPU0hJQkEgJiYKKwkJCSAgICFwcml2LT5uZGlzX2FkYXB0ZXIuYW1kX2wxX3BhdGNoKQorCQkJICAgYl9zdXBwb3J0X2JhY2tkb29yID0gZmFsc2U7ICovCisKKwkJCXBwc2MtPmJfc3VwcG9ydF9iYWNrZG9vciA9IGJfc3VwcG9ydF9iYWNrZG9vcjsKKworCQkJYnJlYWs7CisJCX0KKwljYXNlIDI6CisJCS8qQVNQTSB2YWx1ZSBzZXQgYnkgY2hpcHNldC4gKi8KKwkJaWYgKHBjaWJyaWRnZV92ZW5kb3IgPT0gUENJX0JSSURHRV9WRU5ET1JfSU5URUwpIHsKKwkJCWJvb2wgYl9zdXBwb3J0X2FzcG0gPSB0cnVlOworCQkJcHBzYy0+Yl9zdXBwb3J0X2FzcG0gPSBiX3N1cHBvcnRfYXNwbTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgXG4iKSk7CisJCWJyZWFrOworCX0KKworCS8qIHRvc2hpYmEgYXNwbSBpc3N1ZSwgdG9zaGliYSB3aWxsIHNldCBhc3BtIHNlbGZseQorCSAqIHNvIHdlIHNob3VsZCBub3Qgc2V0IGFzcG0gaW4gZHJpdmVyICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocnRscGNpLT5wZGV2LCAweDgwLCAmaW5pdF9hc3BtKTsKKwlpZiAocnRscHJpdi0+cnRsaGFsLmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UgJiYKKwkJaW5pdF9hc3BtID09IDB4NDMpCisJCXBwc2MtPmJfc3VwcG9ydF9hc3BtID0gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIF9ydGxfcGNpX3BsYXRmb3JtX3N3aXRjaF9kZXZpY2VfcGNpX2FzcG0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgICAgIHU4IHZhbHVlKQoreworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlib29sIGJyZXN1bHQgPSBmYWxzZTsKKworCWlmIChydGxoYWwtPmh3X3R5cGUgIT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UpCisJCXZhbHVlIHw9IDB4NDA7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocnRscGNpLT5wZGV2LCAweDgwLCB2YWx1ZSk7CisKKwlyZXR1cm4gYnJlc3VsdDsKK30KKworLypXaGVuIHdlIHNldCAweDAxIHRvIGVuYWJsZSBjbGsgcmVxdWVzdC4gU2V0IDB4MCB0byBkaXNhYmxlIGNsayByZXEuKi8KK3N0YXRpYyBib29sIF9ydGxfcGNpX3N3aXRjaF9jbGtfcmVxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBicmVzdWx0ID0gZmFsc2U7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocnRscGNpLT5wZGV2LCAweDgxLCB2YWx1ZSk7CisJYnJlc3VsdCA9IHRydWU7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MlNFKQorCQl1ZGVsYXkoMTAwKTsKKworCXJldHVybiBicmVzdWx0OworfQorCisvKkRpc2FibGUgUlRMODE5MlNFIEFTUE0gJiBEaXNhYmxlIFBjaSBCcmlkZ2UgQVNQTSovCitzdGF0aWMgdm9pZCBydGxfcGNpX2Rpc2FibGVfYXNwbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXU4IHBjaWJyaWRnZV92ZW5kb3IgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvcjsKKwl1MzIgcGNpY2ZnX2FkZHJwb3J0ID0gcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWNmZ19hZGRycG9ydDsKKwl1OCBudW00Ynl0ZXMgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIubnVtNGJ5dGVzOworCS8qUmV0cmlldmUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4gKi8KKwl1OCBsaW5rY3RybF9yZWcgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIubGlua2N0cmxfcmVnOworCXUxNiBwY2licmlkZ2VfbGlua2N0cmxyZWcgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIuCisJCQkJcGNpYnJpZGdlX2xpbmtjdHJscmVnOworCXUxNiBhc3BtbGV2ZWwgPSAwOworCisJaWYgKCFwcHNjLT5iX3N1cHBvcnRfYXNwbSkKKwkJcmV0dXJuOworCisJaWYgKHBjaWJyaWRnZV92ZW5kb3IgPT0gUENJX0JSSURHRV9WRU5ET1JfVU5LTk9XTikgeworCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfVFJBQ0UsCisJCQkgKCJQQ0koQnJpZGdlKSBVTktOT1dOLlxuIikpOworCisJCXJldHVybjsKKwl9CisKKwlpZiAocHBzYy0+cmVnX3JmcHNfbGV2ZWwgJiBSVF9SRl9PRkZfTEVWTF9DTEtfUkVRKSB7CisJCVJUX0NMRUFSX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0NMS19SRVEpOworCQlfcnRsX3BjaV9zd2l0Y2hfY2xrX3JlcShodywgMHgwKTsKKwl9CisKKwlpZiAoMSkgeworCQkvKmZvciBwcm9taXNpbmcgZGV2aWNlIHdpbGwgaW4gTDAgc3RhdGUgYWZ0ZXIgYW4gSS9PLiAqLworCQl1OCB0bXBfdTFiOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShydGxwY2ktPnBkZXYsIDB4ODAsICZ0bXBfdTFiKTsKKwl9CisKKwkvKlNldCBjb3JyZXNwb25kaW5nIHZhbHVlLiAqLworCWFzcG1sZXZlbCB8PSBCSVQoMCkgfCBCSVQoMSk7CisJbGlua2N0cmxfcmVnICY9IH5hc3BtbGV2ZWw7CisJcGNpYnJpZGdlX2xpbmtjdHJscmVnICY9IH4oQklUKDApIHwgQklUKDEpKTsKKworCV9ydGxfcGNpX3BsYXRmb3JtX3N3aXRjaF9kZXZpY2VfcGNpX2FzcG0oaHcsIGxpbmtjdHJsX3JlZyk7CisJdWRlbGF5KDUwKTsKKworCS8qNCBEaXNhYmxlIFBjaSBCcmlkZ2UgQVNQTSAqLworCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWxvbmcoUENJX0NPTkZfQUREUkVTUywKKwkJCQkgICAgIHBjaWNmZ19hZGRycG9ydCArIChudW00Ynl0ZXMgPDwgMikpOworCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWNoYXIoUENJX0NPTkZfREFUQSwgcGNpYnJpZGdlX2xpbmtjdHJscmVnKTsKKworCXVkZWxheSg1MCk7CisKK30KKworLyoKKyAqRW5hYmxlIFJUTDgxOTJTRSBBU1BNICYgRW5hYmxlIFBjaSBCcmlkZ2UgQVNQTSBmb3IKKyAqcG93ZXIgc2F2aW5nIFdlIHNob3VsZCBmb2xsb3cgdGhlIHNlcXVlbmNlIHRvIGVuYWJsZQorICpSVEw4MTkyU0UgZmlyc3QgdGhlbiBlbmFibGUgUGNpIEJyaWRnZSBBU1BNCisgKm9yIHRoZSBzeXN0ZW0gd2lsbCBzaG93IGJsdWVzY3JlZW4uCisgKi8KK3N0YXRpYyB2b2lkIHJ0bF9wY2lfZW5hYmxlX2FzcG0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwl1OCBwY2licmlkZ2VfdmVuZG9yID0gcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV92ZW5kb3I7CisJdTMyIHBjaWNmZ19hZGRycG9ydCA9IHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2ljZmdfYWRkcnBvcnQ7CisJdTggbnVtNGJ5dGVzID0gcGNpcHJpdi0+bmRpc19hZGFwdGVyLm51bTRieXRlczsKKwl1MTYgYXNwbWxldmVsOworCXU4IHVfcGNpYnJpZGdlX2FzcG1zZXR0aW5nOworCXU4IHVfZGV2aWNlX2FzcG1zZXR0aW5nOworCisJaWYgKCFwcHNjLT5iX3N1cHBvcnRfYXNwbSkKKwkJcmV0dXJuOworCisJaWYgKHBjaWJyaWRnZV92ZW5kb3IgPT0gUENJX0JSSURHRV9WRU5ET1JfVU5LTk9XTikgeworCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfVFJBQ0UsCisJCQkgKCJQQ0koQnJpZGdlKSBVTktOT1dOLlxuIikpOworCQlyZXR1cm47CisJfQorCisJLyo0IEVuYWJsZSBQY2kgQnJpZGdlIEFTUE0gKi8KKwlydGxfcGNpX3Jhd193cml0ZV9wb3J0X3Vsb25nKFBDSV9DT05GX0FERFJFU1MsCisJCQkJICAgICBwY2ljZmdfYWRkcnBvcnQgKyAobnVtNGJ5dGVzIDw8IDIpKTsKKworCXVfcGNpYnJpZGdlX2FzcG1zZXR0aW5nID0KKwkgICAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9saW5rY3RybHJlZyB8CisJICAgIHJ0bHBjaS0+Y29uc3RfaG9zdHBjaV9hc3BtX3NldHRpbmc7CisKKwlpZiAocGNpYnJpZGdlX3ZlbmRvciA9PSBQQ0lfQlJJREdFX1ZFTkRPUl9JTlRFTCkKKwkJdV9wY2licmlkZ2VfYXNwbXNldHRpbmcgJj0gfkJJVCgwKTsKKworCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWNoYXIoUENJX0NPTkZfREFUQSwgdV9wY2licmlkZ2VfYXNwbXNldHRpbmcpOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiUGxhdGZvcm1FbmFibGVBU1BNKCk6IFdyaXRlIHJlZ1sleF0gPSAleFxuIiwKKwkJICAocGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9wY2llaGRyX29mZnNldCArIDB4MTApLAorCQkgIHVfcGNpYnJpZGdlX2FzcG1zZXR0aW5nKSk7CisKKwl1ZGVsYXkoNTApOworCisJLypHZXQgQVNQTSBsZXZlbCAod2l0aC93aXRob3V0IENsb2NrIFJlcSkgKi8KKwlhc3BtbGV2ZWwgPSBydGxwY2ktPmNvbnN0X2RldmljZXBjaV9hc3BtX3NldHRpbmc7CisJdV9kZXZpY2VfYXNwbXNldHRpbmcgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIubGlua2N0cmxfcmVnOworCisJLypfcnRsX3BjaV9wbGF0Zm9ybV9zd2l0Y2hfZGV2aWNlX3BjaV9hc3BtKGRldiwqLworCS8qKHByaXYtPm5kaXNfYWRhcHRlci5saW5rY3RybF9yZWcgfCBBU1BNTGV2ZWwpKTsgKi8KKworCXVfZGV2aWNlX2FzcG1zZXR0aW5nIHw9IGFzcG1sZXZlbDsKKworCV9ydGxfcGNpX3BsYXRmb3JtX3N3aXRjaF9kZXZpY2VfcGNpX2FzcG0oaHcsIHVfZGV2aWNlX2FzcG1zZXR0aW5nKTsKKworCWlmIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX09GRl9MRVZMX0NMS19SRVEpIHsKKwkJX3J0bF9wY2lfc3dpdGNoX2Nsa19yZXEoaHcsIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmCisJCQkJCSAgICAgUlRfUkZfT0ZGX0xFVkxfQ0xLX1JFUSkgPyAxIDogMCk7CisJCVJUX1NFVF9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9DTEtfUkVRKTsKKwl9CisJdWRlbGF5KDEwMCk7Cit9CisKK3N0YXRpYyBib29sIHJ0bF9wY2lfZ2V0X2FtZF9sMV9wYXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXUzMiBwY2ljZmdfYWRkcnBvcnQgPSBwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpY2ZnX2FkZHJwb3J0OworCisJYm9vbCBzdGF0dXMgPSBmYWxzZTsKKwl1OCBvZmZzZXRfZTA7CisJdW5zaWduZWQgb2Zmc2V0X2U0OworCisJcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91bG9uZyhQQ0lfQ09ORl9BRERSRVNTLAorCQkJcGNpY2ZnX2FkZHJwb3J0ICsgMHhFMCk7CisJcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91Y2hhcihQQ0lfQ09ORl9EQVRBLCAweEEwKTsKKworCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWxvbmcoUENJX0NPTkZfQUREUkVTUywKKwkJCXBjaWNmZ19hZGRycG9ydCArIDB4RTApOworCXJ0bF9wY2lfcmF3X3JlYWRfcG9ydF91Y2hhcihQQ0lfQ09ORl9EQVRBLCAmb2Zmc2V0X2UwKTsKKworCWlmIChvZmZzZXRfZTAgPT0gMHhBMCkgeworCQlydGxfcGNpX3Jhd193cml0ZV9wb3J0X3Vsb25nKFBDSV9DT05GX0FERFJFU1MsCisJCQkJCSAgICAgcGNpY2ZnX2FkZHJwb3J0ICsgMHhFNCk7CisJCXJ0bF9wY2lfcmF3X3JlYWRfcG9ydF91bG9uZyhQQ0lfQ09ORl9EQVRBLCAmb2Zmc2V0X2U0KTsKKwkJaWYgKG9mZnNldF9lNCAmIEJJVCgyMykpCisJCQlzdGF0dXMgPSB0cnVlOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM1KSkKK3N0YXRpYyB1OCBfcnRsX3BjaV9nZXRfcGNpZWhkcl9vZmZzZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJdTggY2FwYWJpbGl0eV9vZmZzZXQ7CisJdTggbnVtNGJ5dGVzID0gMHgzNC80OworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJdTMyIHBjaWNmZ19hZGRyX3BvcnQgPSAocGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9idXNudW0gPDwgMTYpfAorCQkJICAgICAgIChwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX2Rldm51bSA8PCAxMSl8CisJCQkgICAgICAgKHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfZnVuY251bSA8PCA4KXwKKwkJCSAgICAgICAoMSA8PCAzMSk7CisKKwlydGxfcGNpX3Jhd193cml0ZV9wb3J0X3Vsb25nKFBDSV9DT05GX0FERFJFU1MgLCBwY2ljZmdfYWRkcl9wb3J0CisJCQkJCQkJKyAobnVtNGJ5dGVzIDw8IDIpKTsKKwlydGxfcGNpX3Jhd19yZWFkX3BvcnRfdWNoYXIoUENJX0NPTkZfREFUQSwgJmNhcGFiaWxpdHlfb2Zmc2V0KTsKKwl3aGlsZSAoY2FwYWJpbGl0eV9vZmZzZXQgIT0gMCkgeworCQlzdHJ1Y3QgcnRsX3BjaV9jYXBhYmlsaXRpZXNfaGVhZGVyIGNhcGFiaWxpdHlfaGRyOworCisJCW51bTRieXRlcyA9IGNhcGFiaWxpdHlfb2Zmc2V0IC8gNDsKKwkJLyogUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBjYXBhYmlsaXR5IGF0ICB0aGlzIG9mZnNldC4KKwkJICogSWYgdGhlIHJldHJpZXZlZCBjYXBhYmlsaXR5IGlzIG5vdCB0aGUgcG93ZXIgbWFuYWdlbWVudAorCQkgKiBjYXBhYmlsaXR5IHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLCBmb2xsb3cgdGhlIGxpbmsgdG8KKwkJICogdGhlIG5leHQgY2FwYWJpbGl0eSBhbmQgY29udGludWUgbG9vcGluZy4KKwkJICovCisJCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWxvbmcoUENJX0NPTkZfQUREUkVTUyAsIAorCQkJCQkgICAgIHBjaWNmZ19hZGRyX3BvcnQgKyAKKwkJCQkJICAgICAobnVtNGJ5dGVzIDw8IDIpKTsKKwkJcnRsX3BjaV9yYXdfcmVhZF9wb3J0X3VzaG9ydChQQ0lfQ09ORl9EQVRBLAorCQkJCQkgICAgICh1MTYqKSZjYXBhYmlsaXR5X2hkcik7CisJCS8qIEZvdW5kIHRoZSBQQ0kgZXhwcmVzcyBjYXBhYmlsaXR5LiAqLworCQlpZiAoY2FwYWJpbGl0eV9oZHIuY2FwYWJpbGl0eV9pZCA9PSAKKwkJICAgIFBDSV9DQVBBQklMSVRZX0lEX1BDSV9FWFBSRVNTKQorCQkJYnJlYWs7CisJCWVsc2UKKyAgICAgICAgCQljYXBhYmlsaXR5X29mZnNldCA9IGNhcGFiaWxpdHlfaGRyLm5leHQ7CisJfQorCXJldHVybiBjYXBhYmlsaXR5X29mZnNldDsKK30KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKworYm9vbCBydGxfcGNpX2NoZWNrX2J1ZGR5X3ByaXYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisgICAgICAgIAkJICAgICAgc3RydWN0IHJ0bF9wcml2ICoqYnVkZHlfcHJpdikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlib29sIGJfZmluZF9idWRkeV9wcml2ID0gZmFsc2U7CisJc3RydWN0IHJ0bF9wcml2ICp0ZW1wX3ByaXYgPSBOVUxMOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnRlbXBfcGNpcHJpdiA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnJ0bHByaXYtPmdsYl92YXItPmdsYl9wcml2X2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF9wcml2LCAmcnRscHJpdi0+Z2xiX3Zhci0+Z2xiX3ByaXZfbGlzdCwKKwkJCWxpc3QpIHsKKwkJCWlmICh0ZW1wX3ByaXYpIHsKKwkJCQl0ZW1wX3BjaXByaXYgPSAKKwkJCQkJKHN0cnVjdCBydGxfcGNpX3ByaXYgKil0ZW1wX3ByaXYtPnByaXY7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkJKCgicGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIgJXggXG4iKSwKKwkJCQkJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIpKTsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCQkoKCJ0ZW1wX3BjaXByaXYtPm5kaXNfYWRhcHRlci5mdW5jbnVtYmVyICV4IFxuIiksCisJCQkJCXRlbXBfcGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIpKTsKKworCQkJCWlmICgocGNpcHJpdi0+bmRpc19hZGFwdGVyLmJ1c251bWJlciA9PQorCQkJCQl0ZW1wX3BjaXByaXYtPm5kaXNfYWRhcHRlci5idXNudW1iZXIpICYmCisJCQkJICAgIChwY2lwcml2LT5uZGlzX2FkYXB0ZXIuZGV2bnVtYmVyID09CisJCQkJICAgIHRlbXBfcGNpcHJpdi0+bmRpc19hZGFwdGVyLmRldm51bWJlcikgJiYKKwkJCQkgICAgKHBjaXByaXYtPm5kaXNfYWRhcHRlci5mdW5jbnVtYmVyICE9CisJCQkJICAgIHRlbXBfcGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIpKSB7CisJCQkJCWJfZmluZF9idWRkeV9wcml2ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJKCgiYl9maW5kX2J1ZGR5X3ByaXYgJWQgXG4iKSwgYl9maW5kX2J1ZGR5X3ByaXYpKTsKKworCWlmIChiX2ZpbmRfYnVkZHlfcHJpdikKKwkJKmJ1ZGR5X3ByaXYgPSB0ZW1wX3ByaXY7CisKKwlyZXR1cm4gYl9maW5kX2J1ZGR5X3ByaXY7Cit9CisKK3ZvaWQgcnRsX3BjaV9nZXRfbGlua2NvbnRyb2xfZmllbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwl1OCBjYXBhYmlsaXR5b2Zmc2V0ID0gcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9wY2llaGRyX29mZnNldDsKKwl1MzIgcGNpY2ZnX2FkZHJwb3J0ID0gcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWNmZ19hZGRycG9ydDsKKwl1OCBsaW5rY3RybF9yZWc7CisJdTggbnVtNGJieXRlczsKKworCW51bTRiYnl0ZXMgPSAoY2FwYWJpbGl0eW9mZnNldCArIDB4MTApIC8gNDsKKworCS8qUmVhZCAgTGluayBDb250cm9sIFJlZ2lzdGVyICovCisJcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91bG9uZyhQQ0lfQ09ORl9BRERSRVNTLAorCQkJCSAgICAgcGNpY2ZnX2FkZHJwb3J0ICsgKG51bTRiYnl0ZXMgPDwgMikpOworCXJ0bF9wY2lfcmF3X3JlYWRfcG9ydF91Y2hhcihQQ0lfQ09ORl9EQVRBLCAmbGlua2N0cmxfcmVnKTsKKworCXBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfbGlua2N0cmxyZWcgPSBsaW5rY3RybF9yZWc7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9wY2lfcGFyc2VfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisKKwl1OCB0bXA7CisJaW50IHBvczsKKwl1OCBsaW5rY3RybF9yZWc7CisKKwkvKkxpbmsgQ29udHJvbCBSZWdpc3RlciAqLworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmbGlua2N0cmxfcmVnKTsKKwlwY2lwcml2LT5uZGlzX2FkYXB0ZXIubGlua2N0cmxfcmVnID0gbGlua2N0cmxfcmVnOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCSAoIkxpbmsgQ29udHJvbCBSZWdpc3RlciA9JXhcbiIsCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLmxpbmtjdHJsX3JlZykpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg5OCwgJnRtcCk7CisJdG1wIHw9IEJJVCg0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg5OCwgdG1wKTsKKworCXRtcCA9IDB4MTc7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NzBmLCB0bXApOworfQorCitzdGF0aWMgdm9pZCBydGxfcGNpX2luaXRfYXNwbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKworCV9ydGxfcGNpX3VwZGF0ZV9kZWZhdWx0X3NldHRpbmcoaHcpOworCisJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0pIHsKKwkJLypBbHdheXMgZW5hYmxlIEFTUE0gJiBDbG9jayBSZXEuICovCisJCXJ0bF9wY2lfZW5hYmxlX2FzcG0oaHcpOworCQlSVF9TRVRfUFNfTEVWRUwocHBzYywgUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0pOworCX0KKworfQorCitzdGF0aWMgdm9pZCBfcnRsX3BjaV9pb19oYW5kbGVyX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcnRscHJpdi0+aW8uZGV2ID0gZGV2OworCisJcnRscHJpdi0+aW8ud3JpdGU4X2FzeW5jID0gcGNpX3dyaXRlOF9hc3luYzsKKwlydGxwcml2LT5pby53cml0ZTE2X2FzeW5jID0gcGNpX3dyaXRlMTZfYXN5bmM7CisJcnRscHJpdi0+aW8ud3JpdGUzMl9hc3luYyA9IHBjaV93cml0ZTMyX2FzeW5jOworCisJcnRscHJpdi0+aW8ucmVhZDhfc3luYyA9IHBjaV9yZWFkOF9zeW5jOworCXJ0bHByaXYtPmlvLnJlYWQxNl9zeW5jID0gcGNpX3JlYWQxNl9zeW5jOworCXJ0bHByaXYtPmlvLnJlYWQzMl9zeW5jID0gcGNpX3JlYWQzMl9zeW5jOworCit9CisKK3N0YXRpYyBib29sIF9ydGxfcGNpX3VwZGF0ZV9lYXJseW1vZGVfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjLCAKKwkJCQkJICAgdTggdGlkKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCBhZGRpdGlvbmxlbiA9IEZDU19MRU47CisJc3RydWN0IHNrX2J1ZmYgKm5leHRfc2tiOworCQkKKwkvKiBoZXJlIG9wZW4gaXMgNCwgd2VwL3RraXAgaXMgOCwgYWVzIGlzIDEyKi8KKwlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCisJCWFkZGl0aW9ubGVuICs9IGluZm8tPmNvbnRyb2wuaHdfa2V5LT5pY3ZfbGVuOworCisJLyogVGhlIG1vc3Qgc2tiIG51bSBpcyA2ICovCisJdGNiX2Rlc2MtPmVtcGt0X251bSA9IDA7CisJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKKwlza2JfcXVldWVfd2FsaygmcnRscHJpdi0+bWFjODAyMTEuc2tiX3dhaXRxW3RpZF0sIG5leHRfc2tiKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqbmV4dF9pbmZvID0gCisJCQkJCUlFRUU4MDIxMV9TS0JfQ0IobmV4dF9za2IpOworCQlpZiAobmV4dF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKKwkJCXRjYl9kZXNjLT5lbXBrdF9sZW5bdGNiX2Rlc2MtPmVtcGt0X251bV0gPQorCQkJCW5leHRfc2tiLT5sZW4gKyBhZGRpdGlvbmxlbjsKKwkJCXRjYl9kZXNjLT5lbXBrdF9udW0rKzsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNrYl9xdWV1ZV9pc19sYXN0KCZydGxwcml2LT5tYWM4MDIxMS5za2Jfd2FpdHFbdGlkXSwgCisJCQkJICAgICAgbmV4dF9za2IpKQorCQkJYnJlYWs7CisKKwkJaWYgKHRjYl9kZXNjLT5lbXBrdF9udW0gPj0gcnRsaGFsLT5tYXhfZWFybHltb2RlX251bSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3Mud2FpdHFfbG9jayk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qIGp1c3QgZm9yIGVhcmx5IG1vZGUgbm93ICovCitzdGF0aWMgdm9pZCBfcnRsX3BjaV90eF9jaGtfd2FpdHEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IE5VTEw7CisJaW50IHRpZDsgLyogc2hvdWxkIGJlIGludCAqLworCQorCWlmICghcnRscHJpdi0+cnRsaGFsLmJfZWFybHltb2RlX2VuYWJsZSkKKwkJcmV0dXJuOwkKKwlpZiAocnRscHJpdi0+ZG0uc3VwcF9waHltb2RlX3N3aXRjaCAmJgorCQkocnRscHJpdi0+ZWFzeV9jb25jdXJyZW50X2N0bC5ic3dpdGNoX2luX3Byb2Nlc3MgfHwKKwkJKHJ0bHByaXYtPmJ1ZGR5X3ByaXYgJiYgCisJCSBydGxwcml2LT5idWRkeV9wcml2LT5lYXN5X2NvbmN1cnJlbnRfY3RsLmJzd2l0Y2hfaW5fcHJvY2VzcykpKQorCQlyZXR1cm47CisJLyogd2UganVzZSB1c2UgZW0gZm9yIEJFL0JLL1ZJL1ZPICovCisJZm9yICh0aWQgPSA3OyB0aWQgPj0gMDsgdGlkLS0pIHsKKwkJdTggaHdfcXVldWUgPSBhY190b19od3FbcnRsX3RpZF90b19hYyhodywgdGlkKV07CisJCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcnRscGNpLT50eF9yaW5nW2h3X3F1ZXVlXTsKKwkJd2hpbGUgKCFtYWMtPmFjdF9zY2FubmluZyAmJiAKKwkJICAgICAgIHJ0bHByaXYtPnBzYy5yZnB3cl9zdGF0ZSA9PSBFUkZPTikgeworCQkJc3RydWN0IHJ0bF90Y2JfZGVzYyB0Y2JfZGVzYzsKKwkJCW1lbXNldCgmdGNiX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgcnRsX3RjYl9kZXNjKSk7CQkJCisKKwkJCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3Mud2FpdHFfbG9jayk7CisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbWFjLT5za2Jfd2FpdHFbdGlkXSkgJiYKKwkJCSAgICAocmluZy0+ZW50cmllcyAtIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA+IAorCQkJICAgICBydGxoYWwtPm1heF9lYXJseW1vZGVfbnVtKSkgeworCQkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZtYWMtPnNrYl93YWl0cVt0aWRdKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLndhaXRxX2xvY2spOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLndhaXRxX2xvY2spOworCisJCQkvKiBTb21lIG1hY2FkZHIgY2FuJ3QgZG8gZWFybHkgbW9kZS4gbGlrZQorCQkJICogbXVsdGljYXN0L2Jyb2FkY2FzdC9ub19xb3MgZGF0YSAqLworCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwkJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCisJCQkJX3J0bF9wY2lfdXBkYXRlX2Vhcmx5bW9kZV9pbmZvKGh3LCBza2IsIAorCQkJCQkJCSAgICAgICAmdGNiX2Rlc2MsIHRpZCk7CisKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQorCQkJcnRscHJpdi0+aW50Zl9vcHMtPmFkYXB0ZXJfdHgoaHcsIHNrYiwgJnRjYl9kZXNjKTsKKyNlbHNlCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCQkJcnRscHJpdi0+aW50Zl9vcHMtPmFkYXB0ZXJfdHgoaHcsIE5VTEwsIHNrYiwgJnRjYl9kZXNjKTsKKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bF9wY2lfdHhfaXNyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1twcmlvXTsKKworCXdoaWxlIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCQl1MTYgZmM7CisJCXU4IHRpZDsKKwkJdTggKmVudHJ5OworCisJCQorCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKKwkJCWVudHJ5ID0gKHU4ICopKCZyaW5nLT5idWZmZXJfZGVzY1tyaW5nLT5pZHhdKTsKKwkJZWxzZQorCQkJZW50cnkgPSAodTggKikoJnJpbmctPmRlc2NbcmluZy0+aWR4XSk7CisKKwkJaWYgKCFydGxwcml2LT5jZmctPm9wcy0+aXNfdHhfZGVzY19jbG9zZWQoaHcsIHByaW8sIHJpbmctPmlkeCkpCisJCQlyZXR1cm47CisJCQkKKwkJcmluZy0+aWR4ID0gKHJpbmctPmlkeCArIDEpICUgcmluZy0+ZW50cmllczsKKwkJCisJCXNrYiA9IF9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKKwkJCisJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCSBsZTMyX3RvX2NwdShydGxwcml2LT5jZmctPm9wcy0+CisJCQkJCSAgICAgZ2V0X2Rlc2MoKHU4ICopIGVudHJ5LCB0cnVlLAorCQkJCQkJICAgICAgSFdfREVTQ19UWEJVRkZfQUREUikpLAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJLyogcmVtb3ZlIGVhcmx5IG1vZGUgaGVhZGVyICovCisJCWlmKHJ0bHByaXYtPnJ0bGhhbC5iX2Vhcmx5bW9kZV9lbmFibGUpCisJCQlza2JfcHVsbChza2IsIEVNX0hEUl9MRU4pOworCisJCVJUX1RSQUNFKChDT01QX0lOVFIgfCBDT01QX1NFTkQpLCBEQkdfVFJBQ0UsCisJCQkgKCJuZXcgcmluZy0+aWR4OiVkLCAiCisJCQkgICJmcmVlOiBza2JfcXVldWVfbGVuOiVkLCBmcmVlOiBzZXE6JWRcbiIsCisJCQkgIHJpbmctPmlkeCwKKwkJCSAgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpLAorCQkJICAqKHUxNiAqKSAoc2tiLT5kYXRhICsgMjIpKSk7CisKKwkJaWYocHJpbyA9PSBUWENNRF9RVUVVRSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJZ290byB0eF9zdGF0dXNfb2s7CisKKwkJfQorCisJCS8qIGZvciBzdyBMUFMsIGp1c3QgYWZ0ZXIgTlVMTCBza2Igc2VuZCBvdXQsIHdlIGNhbgorCQkgKiBzdXJlIEFQIGtvd24gd2UgYXJlIHNsZWVwZWQsIG91ciB3ZSBzaG91bGQgbm90IGxldAorCQkgKiByZiB0byBzbGVlcCovCisJCWZjID0gcnRsX2dldF9mYyhza2IpOworCQlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSkgeworCQkJaWYoaWVlZTgwMjExX2hhc19wbShmYykpIHsKKwkJCQlydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGV5ID0gdHJ1ZTsKKwkJCQlydGxwcml2LT5wc2Muc3RhdGVfaW5hcCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoaWVlZTgwMjExX2lzX2FjdGlvbihmYykpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfbWdtdF9jb21wYXQgKmFjdGlvbl9mcmFtZSA9CisJCQkJKHN0cnVjdCBpZWVlODAyMTFfbWdtdF9jb21wYXQgKilza2ItPmRhdGE7CisJCQlpZiAoYWN0aW9uX2ZyYW1lLT51LmFjdGlvbi51Lmh0X3NtcHMuYWN0aW9uID09CisJCQkJV0xBTl9IVF9BQ1RJT05fU01QUykgeworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlnb3RvIHR4X3N0YXR1c19vazsKKwkJCX0KKwkJfQorCisJCS8qIHVwZGF0ZSB0aWQgdHggcGt0IG51bSAqLworCQl0aWQgPSBydGxfZ2V0X3RpZChza2IpOworCQlpZiAodGlkIDw9IDcpCisJCQlydGxwcml2LT5saW5rX2luZm8udGlkdHhfaW5wZXJpb2RbdGlkXSsrOworCisJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJCWllZWU4MDIxMV90eF9pbmZvX2NsZWFyX3N0YXR1cyhpbmZvKTsKKworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJCS8qaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50ID0gMTsgKi8KKworCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoaHcsIHNrYik7CisKKwkJaWYgKChyaW5nLT5lbnRyaWVzIC0gc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKQorCQkJCT09IDIpIHsKKworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19MT1VELAorCQkJCQkoIm1vcmUgZGVzYyBsZWZ0LCB3YWtlIgorCQkJCQkgInNrYl9xdWV1ZUAlZCxyaW5nLT5pZHggPSAlZCwiCisJCQkJCSAic2tiX3F1ZXVlX2xlbiA9IDB4JWRcbiIsCisJCQkJCSBwcmlvLCByaW5nLT5pZHgsCisJCQkJCSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpKTsKKworCQkJaWVlZTgwMjExX3dha2VfcXVldWUoaHcsCisJCQkJCXNrYl9nZXRfcXVldWVfbWFwcGluZworCQkJCQkoc2tiKSk7CisJCX0KK3R4X3N0YXR1c19vazoKKwkJc2tiID0gTlVMTDsKKwl9CisKKwlpZiAoKChydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kICsKKwkJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCkgPiA4KSB8fAorCQkocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCA+IDIpKSB7CisJCXJ0bF9scHNfbGVhdmUoaHcpOworCX0KK30KKworc3RhdGljIGludCBfcnRsX3BjaV9pbml0X29uZV9yeGRlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggKmVudHJ5LCBpbnQgcnhyaW5nX2lkeCwgaW50IGRlc2NfaWR4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXUzMiBidWZmZXJhZGRyZXNzOworCXU4IHRtcF9vbmUgPSAxOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ0bHBjaS0+cnhidWZmZXJzaXplKTsJCisJaWYgKCFza2IpCisJCXJldHVybiAwOworCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5yeF9idWZbZGVzY19pZHhdID0gc2tiOworCisJLyoganVzdCBzZXQgc2tiLT5jYiB0byBtYXBwaW5nIGFkZHIKKwkgKiBmb3IgcGNpX3VubWFwX3NpbmdsZSB1c2UgKi8KKwkqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpID0gcGNpX21hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCXNrYl90YWlsX3BvaW50ZXIoc2tiKSwgcnRscGNpLT5yeGJ1ZmZlcnNpemUsCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwlidWZmZXJhZGRyZXNzID0gY3B1X3RvX2xlMzIoKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSk7CisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihydGxwY2ktPnBkZXYsIGJ1ZmZlcmFkZHJlc3MpKQorCQlyZXR1cm4gMDsKKwlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgeworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsIAorCQkJCQkgICAgSFdfREVTQ19SWF9QUkVQQVJFLAorCQkJCQkgICAgKHU4ICopICYgYnVmZmVyYWRkcmVzcyk7CisJfSBlbHNlIHsJCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJCQkJCSAgICBIV19ERVNDX1JYQlVGRl9BRERSLAorCQkJCQkgICAgKHU4ICopICYgYnVmZmVyYWRkcmVzcyk7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJCQkJCSAgICBIV19ERVNDX1JYUEtUX0xFTiwKKwkJCQkJICAgICh1OCAqKSAmIHJ0bHBjaS0+cnhidWZmZXJzaXplKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLCAKKwkJCQkJICAgIEhXX0RFU0NfUlhPV04sCisJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKKy8qIGlub3JkZXIgdG8gcmVjZWl2ZSA4SyBBTVNEVSB3ZSBoYXZlIHNldCBza2IgdG8KKyAqIDkxMDBieXRlcyBpbiBpbml0IHJ4IHJpbmcsIGJ1dCBpZiB0aGlzIHBhY2tldCBpcworICogbm90IGEgQU1TRFUsIHRoaXMgc28gYmlnIHBhY2tldCB3aWxsIGJlIHNlbnQgdG8KKyAqIFRDUC9JUCBkaXJlY3RseSwgdGhpcyBjYXVzZSBiaWcgcGFja2V0IHBpbmcgZmFpbAorICogbGlrZTogInBpbmcgLXMgNjU1MDciLCBzbyBoZXJlIHdlIHdpbGwgcmVhbGxvYyBza2IKKyAqIGJhc2VkIG9uIHRoZSB0cnVlIHNpemUgb2YgcGFja2V0LCBJIHRoaW5rIG1hYzgwMjExCisgKiBkbyBpdCB3aWxsIGJlIGJldHRlciwgYnV0IG5vdyBtYWM4MDIxMSBoYXZlbid0ICovCisKKy8qIGJ1dCBzb21lIHBsYXRmb3JtIHdpbGwgZmFpbCB3aGVuIGFsbG9jIHNrYiBzb21ldGltZXMuCisgKiBpbiB0aGlzIGNvbmRpdGlvbiwgd2Ugd2lsbCBzZW5kIHRoZSBvbGQgc2tiIHRvCisgKiBtYWM4MDIxMSBkaXJlY3RseSwgdGhpcyB3aWxsIG5vdCBjYXVzZSBhbnkgb3RoZXIKKyAqIGlzc3VlcywgYnV0IG9ubHkgYmUgbG9zdGVkIGJ5IFRDUC9JUCAqLworc3RhdGljIHZvaWQgX3J0bF9wY2lfcnhfdG9fbWFjODAyMTEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzKQoreworCWlmICh1bmxpa2VseSghcnRsX2FjdGlvbl9wcm9jKGh3LCBza2IsIGZhbHNlKSkpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqdXNrYiA9IE5VTEw7CisJCXU4ICpwZGF0YTsKKwkJCisJCXVza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuICsgMTI4KTsKKwkJaWYgKGxpa2VseSh1c2tiKSkgeworCQkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQih1c2tiKSwgJnJ4X3N0YXR1cywKKwkJCQkJc2l6ZW9mKHJ4X3N0YXR1cykpOworCQkJcGRhdGEgPSAodTggKilza2JfcHV0KHVza2IsIHNrYi0+bGVuKTsKKwkJCW1lbWNweShwZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJCQlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgdXNrYik7CisJCX0gZWxzZSB7CisJCQlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgc2tiKTsKKwkJfQkKKwl9Cit9CisKKy8qaHNpc3IgaW50ZXJydXB0IGhhbmRsZXIqLworc3RhdGljIHZvaWQgX3J0bF9wY2lfaHNfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19IU0lTUl0sIAorCQkgICAgICAgcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hTSVNSXSkgfCAKKwkJICAgICAgIHJ0bHBjaS0+c3lzX2lycV9tYXNrKTsKKworCQorfQorc3RhdGljIHZvaWQgX3J0bF9wY2lfcnhfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCWludCByeHJpbmdfaWR4ID0gUlRMX1BDSV9SWF9NUERVX1FVRVVFOworCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzID0geyAwIH07CisJdW5zaWduZWQgaW50IGNvdW50ID0gcnRscGNpLT5yeHJpbmdjb3VudDsKKwlib29sIHVuaWNhc3QgPSBmYWxzZTsKKwl1OCBod19xdWV1ZSA9IDA7CisJdW5zaWduZWQgaW50IHJ4X3JlbWFpbmVkX2NudDsKKwl1OCBvd247CisJdTggdG1wX29uZTsKKworCXN0cnVjdCBydGxfc3RhdHMgc3RhdHVzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJfTsKKwkKKwkvKlJYIE5PUk1BTCBQS1QgKi8KKwl3aGlsZSAoY291bnQtLSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCQl1MTYgZmM7CisJCXUxNiBsZW47CisJCS8qcnggYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJc3RydWN0IHJ0bF9yeF9idWZmZXJfZGVzYyAqYnVmZmVyX2Rlc2MgPSBOVUxMOworCQkvKmlmIHVzZSBuZXcgdHJ4IGZsb3csIGl0IG1lYW5zIHdpZmkgaW5mbyAqLworCQlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKnBkZXNjID0gTlVMTDsKKwkJLypyeCBwa3QgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5yeF9idWZbCisJCQkJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHhdOworCQkKKwkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJCXJ4X3JlbWFpbmVkX2NudCA9IAorCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5yeF9kZXNjX2J1ZmZfcmVtYWluZWRfY250KGh3LAorCQkJCQkJCQkgICAgICBod19xdWV1ZSk7CisJCQlpZiAocnhfcmVtYWluZWRfY250IDwgMSkgCisJCQkJcmV0dXJuOworCQkJCisJCX0gZWxzZSB7CS8qIHJ4IGRlc2NyaXB0b3IgKi8KKwkJCXBkZXNjID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjWworCQkJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHhdOworCQkJCisJCQlvd24gPSAodTgpIHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKikgcGRlc2MsCisJCQkJCQkJICAgICAgIGZhbHNlLCAKKwkJCQkJCQkgICAgICAgSFdfREVTQ19PV04pOworCQkJaWYgKG93bikgLyogd2FpdCBkYXRhIHRvIGJlIGZpbGxlZCBieSBoYXJkd2FyZSAqLworCQkJCXJldHVybjsKKwkJfQorCQkKKwkJLyogR2V0IGhlcmUgbWVhbnM6IGRhdGEgaXMgZmlsbGVkIGFscmVhZHkqLworCQkvKiBBQUFBQUF0dGVudGlvbiAhISEKKwkJICogV2UgY2FuIE5PVCBhY2Nlc3MgJ3NrYicgYmVmb3JlICdwY2lfdW5tYXBfc2luZ2xlJyAqLworCQlwY2lfdW5tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwgKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSwKKwkJCSAJIHJ0bHBjaS0+cnhidWZmZXJzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkKKwkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJCWJ1ZmZlcl9kZXNjID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzY1sKKwkJCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4XTsKKwkJCS8qbWVhbnMgcnggd2lmaSBpbmZvKi8KKwkJCXBkZXNjID0gKHN0cnVjdCBydGxfcnhfZGVzYyAqKXNrYi0+ZGF0YTsKKwkJfQorCQkKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnF1ZXJ5X3J4X2Rlc2MoaHcsICZzdGF0dXMsCisJCQkJCQkgJnJ4X3N0YXR1cywgKHU4ICopIHBkZXNjLCBza2IpOworCQkJCisJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQorCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnJ4X2NoZWNrX2RtYV9vayhodywgCisJCQkJCQkJICAgKHU4ICopYnVmZmVyX2Rlc2MsIAorCQkJCQkJCSAgIGh3X3F1ZXVlKTsKKworCQkJCisJCWxlbiA9IHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfZGVzYygodTggKilwZGVzYywgZmFsc2UsIAorCQkJCQkJICBIV19ERVNDX1JYUEtUX0xFTik7CisJCQkKKwkJaWYgKHNrYi0+ZW5kIC0gc2tiLT50YWlsID4gbGVuKSB7CisJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQkKKwkJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXR1cy5yeF9kcnZpbmZvX3NpemUgKyAKKwkJCQkJCSBzdGF0dXMucnhfYnVmc2hpZnQgKyAyNCk7CisJCQllbHNlCisJCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0dXMucnhfZHJ2aW5mb19zaXplICsgCisJCQkJCQkgc3RhdHVzLnJ4X2J1ZnNoaWZ0KTsKKworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJza2ItPmVuZCAtIHNrYi0+dGFpbCA9ICVkLCBsZW4gaXMgJWRcbiIsIAorCQkJICAgICAgIHNrYi0+ZW5kIC0gc2tiLT50YWlsLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKwkJCQorCQlydGxwcml2LT5jZmctPm9wcy0+cnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlcihodywgc3RhdHVzLCBza2IpOworCisJCS8qCisJCSAqTk9USUNFIFRoaXMgY2FuIG5vdCBiZSB1c2UgZm9yIG1hYzgwMjExLAorCQkgKnRoaXMgaXMgZG9uZSBpbiBtYWM4MDIxMSBjb2RlLAorCQkgKmlmIHlvdSBkb25lIGhlcmUgc2VjIERIQ1Agd2lsbCBmYWlsCisJCSAqc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCQkgKi8KKworCQloZHIgPSBydGxfZ2V0X2hkcihza2IpOworCQlmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKwkJCisJCWlmICghc3RhdHVzLmJfY3JjICYmICFzdGF0dXMuYl9od2Vycm9yKSB7CisJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksICZyeF9zdGF0dXMsIAorCQkJICAgICAgIHNpemVvZihyeF9zdGF0dXMpKTsKKworCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CisJCQkJOy8qVE9ETyovCisJCQl9IGVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CisJCQkgCTsvKlRPRE8qLworCQkJfSBlbHNlIHsKKwkJCQl1bmljYXN0ID0gdHJ1ZTsKKwkJCQlydGxwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCArPSBza2ItPmxlbjsKKwkJCX0KKworCQkJcnRsX2lzX3NwZWNpYWxfZGF0YShodywgc2tiLCBmYWxzZSk7CisKKwkJCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIExFRF9DVExfUlgpOworCisJCQkJaWYgKHVuaWNhc3QpCisJCQkJCXJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QrKzsKKwkJCX0KKworCQkJLyogc3RhdGljIGJjbiBmb3Igcm9hbWluZyAqLworCQkJcnRsX2JlYWNvbl9zdGF0aXN0aWMoaHcsIHNrYik7CisJCQlydGxfcDJwX2luZm8oaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsJCisJCQkvKiBmb3Igc3cgbHBzICovCisJCQlydGxfc3dscHNfYmVhY29uKGh3LCAodm9pZCopc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlydGxfcmVjb2duaXplX3BlZXIoaHcsICh2b2lkKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCWlmICgocnRscHJpdi0+bWFjODAyMTEub3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgorCQkJICAgIChydGxwcml2LT5ydGxoYWwuY3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpJiYKKwkJCSAgICAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykgfHwgCisJCQkgICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfSBlbHNlIHsKKwkJCQlfcnRsX3BjaV9yeF90b19tYWM4MDIxMShodywgc2tiLCByeF9zdGF0dXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQorCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgeworCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwICs9IDE7CisJCQlydGxwY2ktPnJ4X3JpbmdbaHdfcXVldWVdLm5leHRfcnhfcnAgJT0gCisJCQkJCQkJUlRMX1BDSV9NQVhfUlhfQ09VTlQ7CisKKworCQkJcnhfcmVtYWluZWRfY250LS07CisJCQlpZiAoMS8qcnhfcmVtYWluZWRfY250ID09IDAqLykgeworCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIDB4M0I0LCAKKwkJCQkJcnRscGNpLT5yeF9yaW5nW2h3X3F1ZXVlXS5uZXh0X3J4X3JwKTsKKwkJCX0KKwkJfQorCQlpZiAoKChydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kICsKKwkJICAgICAgcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCkgPiA4KSB8fAorCQkgICAgKHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QgPiAyKSkgeworCQkJcnRsX2xwc19sZWF2ZShodyk7CisJCX0KKworCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgeworCQkJX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKilidWZmZXJfZGVzYywgCisJCQkJCQkgcnhyaW5nX2lkeCwKKwkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwkJCQorCQl9IGVsc2UgeworCQkJX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKilwZGVzYywgcnhyaW5nX2lkeCwKKwkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwkJCQorCisJCQlpZiAocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9PSAKKwkJCSAgICBydGxwY2ktPnJ4cmluZ2NvdW50IC0gMSkKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBwZGVzYywgCisJCQkJCQkJICAgIGZhbHNlLCAKKwkJCQkJCQkgICAgSFdfREVTQ19SWEVSTywKKwkJCQkJCQkgICAgKHU4ICopICYgdG1wX29uZSk7CisJCX0KKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IAorCQkJCShydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ICsgMSkgJSAKKwkJCQlydGxwY2ktPnJ4cmluZ2NvdW50OworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IF9ydGxfcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfaWQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnRhID0gMDsKKwl1MzIgaW50YiA9IDA7CisKKwkKKworCWlmIChydGxwY2ktPmlycV9lbmFibGVkID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jayxmbGFncyk7CisKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hJTVJdLCAweDApOworCQorCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSElNUkVdLCAweDApOworCisKKwkvKnJlYWQgSVNSOiA0LzhieXRlcyAqLworCXJ0bHByaXYtPmNmZy0+b3BzLT5pbnRlcnJ1cHRfcmVjb2duaXplZChodywgJmludGEsICZpbnRiKTsKKworCisJLypTaGFyZWQgSVJRIG9yIEhXIGRpc2FwcGFyZWQgKi8KKwlpZiAoIWludGEgfHwgaW50YSA9PSAweGZmZmYpCisJCWdvdG8gZG9uZTsKKwkvKjwxPiBiZWFjb24gcmVsYXRlZCAqLworCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfVEJET0tdKSB7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoImJlYWNvbiBvayBpbnRlcnJ1cHQhXG4iKSk7CisJfQorCisJaWYgKHVubGlrZWx5KGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9UQkRFUl0pKSB7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoImJlYWNvbiBlcnIgaW50ZXJydXB0IVxuIikpOworCX0KKworCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfQkRPS10pIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsICgiYmVhY29uIGludGVycnVwdCFcbiIpKTsKKwl9CisKKwlpZiAoaW50YSAmIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfSU1SX0JjbkludF0pIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsCisJCQkgKCJwcmVwYXJlIGJlYWNvbiBmb3IgaW50ZXJydXB0IVxuIikpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcnFfcHJlcGFyZV9iY25fdGFza2xldCk7CisJfQorCisKKwkvKjwyPiB0eCByZWxhdGVkICovCisJaWYgKHVubGlrZWx5KGludGIgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9UWEZPVlddKSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19UUkFDRSwgKCJJTVJfVFhGT1ZXIVxuIikpOworCisJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9NR05URE9LXSkgeworCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwgKCJNYW5hZ2Ugb2sgaW50ZXJydXB0IVxuIikpOworCQlfcnRsX3BjaV90eF9pc3IoaHcsIE1HTlRfUVVFVUUpOworCX0KKworCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfSElHSERPS10pIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsICgiSElHSF9RVUVVRSBvayBpbnRlcnJ1cHQhXG4iKSk7CisJCV9ydGxfcGNpX3R4X2lzcihodywgSElHSF9RVUVVRSk7CisJfQorCisJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9CS0RPS10pIHsKKwkJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCsrOworCisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoIkJLIFR4IE9LIGludGVycnVwdCFcbiIpKTsKKwkJX3J0bF9wY2lfdHhfaXNyKGh3LCBCS19RVUVVRSk7CisJfQorCisJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9CRURPS10pIHsKKwkJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCsrOworCisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoIkJFIFRYIE9LIGludGVycnVwdCFcbiIpKTsKKwkJX3J0bF9wY2lfdHhfaXNyKGh3LCBCRV9RVUVVRSk7CisJfQorCisJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9WSURPS10pIHsKKwkJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCsrOworCisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoIlZJIFRYIE9LIGludGVycnVwdCFcbiIpKTsKKwkJX3J0bF9wY2lfdHhfaXNyKGh3LCBWSV9RVUVVRSk7CisJfQorCisJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9WT0RPS10pIHsKKwkJcnRscHJpdi0+bGlua19pbmZvLm51bV90eF9pbnBlcmlvZCsrOworCisJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAoIlZvIFRYIE9LIGludGVycnVwdCFcbiIpKTsKKwkJX3J0bF9wY2lfdHhfaXNyKGh3LCBWT19RVUVVRSk7CisJfQorCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJTRSkgeworCQlpZiAoaW50YSAmIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfSU1SX0NPTURPS10pIHsKKwkJCXJ0bHByaXYtPmxpbmtfaW5mby5udW1fdHhfaW5wZXJpb2QrKzsKKworCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsCisJCQkJICgiQ01EIFRYIE9LIGludGVycnVwdCFcbiIpKTsKKwkJCV9ydGxfcGNpX3R4X2lzcihodywgVFhDTURfUVVFVUUpOworCQl9CisJfQorCisJLyo8Mz4gcnggcmVsYXRlZCAqLworCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfUk9LXSkgeworCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwgKCJSeCBvayBpbnRlcnJ1cHQhXG4iKSk7CisKKwkJX3J0bF9wY2lfcnhfaW50ZXJydXB0KGh3KTsKKworCX0KKworCWlmICh1bmxpa2VseShpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfUkRVXSkpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJICgicnggZGVzY3JpcHRvciB1bmF2YWlsYWJsZSFcbiIpKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhiNCwgQklUKDEpICk7CisJCV9ydGxfcGNpX3J4X2ludGVycnVwdChodyk7CisJfQorCisJaWYgKHVubGlrZWx5KGludGIgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9SWEZPVlddKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsICgicnggb3ZlcmZsb3cgIVxuIikpOworCQlfcnRsX3BjaV9yeF9pbnRlcnJ1cHQoaHcpOworCX0KKworCS8qPDQ+IGZ3IHJlbGF0ZWQqLworCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQUUpIHsKKwkJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9DMkhDTURdKSB7CisJCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwgCisJCQkJICgiZmlybXdhcmUgaW50ZXJydXB0IVxuIikpOworCQkJcXVldWVfZGVsYXllZF93b3JrKHJ0bHByaXYtPndvcmtzLnJ0bF93cSwKKwkJCQkJICAgJnJ0bHByaXYtPndvcmtzLmZ3ZXZ0X3dxLCAwKTsKKwkJfQorCX0KKworCS8qPDU+IGhzaXNyIHJlbGF0ZWQqLworCS8qIE9ubHkgODE4OEVFICYgODcyM0JFIFN1cHBvcnRlZC4KKwkgKiBJZiBPdGhlciBJQ3MgQ29tZSBpbiwgU3lzdGVtIHdpbGwgY29ycnVwdCwKKwkgKiBiZWNhdXNlIG1hcHNbUlRMX0lNUl9IU0lTUl9JTkRdICYgbWFwc1tNQUNfSFNJU1JdCisJICogYXJlIG5vdCBpbml0aWFsaXplZCovCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSB8fAorCSAgICBydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQkUpIHsKKwkJaWYgKHVubGlrZWx5KGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9IU0lTUl9JTkRdKSkgeworCQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCBEQkdfVFJBQ0UsIAorCQkJCQkgKCJoc2lzciBpbnRlcnJ1cHQhXG4iKSk7CisJCQlfcnRsX3BjaV9oc19pbnRlcnJ1cHQoaHcpOworCQl9CisJfQorCQorCisJaWYocnRscHJpdi0+cnRsaGFsLmJfZWFybHltb2RlX2VuYWJsZSkKKwkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXJxX3Rhc2tsZXQpOworCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSElNUl0sCisJCQlydGxwY2ktPmlycV9tYXNrWzBdKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19ISU1SRV0sCisJCQlydGxwY2ktPmlycV9tYXNrWzFdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOworCQorCXJldHVybiBJUlFfSEFORExFRDsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgX3J0bF9wY2lfaXJxX3Rhc2tsZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJX3J0bF9wY2lfdHhfY2hrX3dhaXRxKGh3KTsKK30KKworc3RhdGljIHZvaWQgX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnBza2IgPSBOVUxMOworCXN0cnVjdCBydGxfdHhfZGVzYyAqcGRlc2MgPSBOVUxMOworCXN0cnVjdCBydGxfdGNiX2Rlc2MgdGNiX2Rlc2M7CisJLypUaGlzIGlzIGZvciBuZXcgdHJ4IGZsb3cqLworCXN0cnVjdCBydGxfdHhfYnVmZmVyX2Rlc2MgKnBidWZmZXJfZGVzYyA9IE5VTEw7CisJdTggdGVtcF9vbmUgPSAxOworCisJbWVtc2V0KCZ0Y2JfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBydGxfdGNiX2Rlc2MpKTsKKwlyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1tCRUFDT05fUVVFVUVdOworCXBza2IgPSBfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7CisJaWYgKHBza2IpCisJCWtmcmVlX3NrYihwc2tiKTsKKworCS8qTkI6IHRoZSBiZWFjb24gZGF0YSBidWZmZXIgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZC4gKi8KKwlwc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIG1hYy0+dmlmKTsKKwlpZiAocHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisJaGRyID0gcnRsX2dldF9oZHIocHNrYik7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocHNrYik7CisJcGRlc2MgPSAmcmluZy0+ZGVzY1swXTsKKwlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKKwkJcGJ1ZmZlcl9kZXNjID0gJnJpbmctPmJ1ZmZlcl9kZXNjWzBdOworCQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsIAorCQkJCSAgICAgICAgKHU4ICopcGJ1ZmZlcl9kZXNjLCBpbmZvLCBwc2tiLCAKKwkJCQkgICAgICAgIEJFQUNPTl9RVUVVRSwgJnRjYl9kZXNjKTsKKyNlbHNlCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLAorCQkJCQkodTggKilwYnVmZmVyX2Rlc2MsIGluZm8sIE5VTEwsIHBza2IsIAorCQkJCQlCRUFDT05fUVVFVUUsICZ0Y2JfZGVzYyk7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisKKwlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgcHNrYik7CisKKwlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBwZGVzYywgdHJ1ZSwgSFdfREVTQ19PV04sCisJCQkJICAgICh1OCAqKSAmIHRlbXBfb25lKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgX3J0bF9wY2lfaW5pdF90cnhfdmFyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXU4IGk7CisJdTE2IGRlc2NfbnVtOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJFRSkKKwkJZGVzY19udW0gPSBUWF9ERVNDX05VTV85MkU7CisJZWxzZQorCQlkZXNjX251bSA9IFJUX1RYREVTQ19OVU07CisJCisJZm9yIChpID0gMDsgaSA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspIHsKKwkJcnRscGNpLT50eHJpbmdjb3VudFtpXSA9IGRlc2NfbnVtOworCX0KKwkvKgorCSAqd2UganVzdCBhbGxvYyAyIGRlc2MgZm9yIGJlYWNvbiBxdWV1ZSwKKwkgKmJlY2F1c2Ugd2UganVzdCBuZWVkIGZpcnN0IGRlc2MgaW4gaHcgYmVhY29uLgorCSAqLworCXJ0bHBjaS0+dHhyaW5nY291bnRbQkVBQ09OX1FVRVVFXSA9IDI7CisKKwkvKgorCSAqQkUgcXVldWUgbmVlZCBtb3JlIGRlc2NyaXB0b3IgZm9yIHBlcmZvcm1hbmNlCisJICpjb25zaWRlcmF0aW9uIG9yLCBObyBtb3JlIHR4IGRlc2Mgd2lsbCBoYXBwZW4sCisJICphbmQgbWF5IGNhdXNlIG1hYzgwMjExIG1lbSBsZWFrYWdlLgorCSAqLworCWlmIChydGxfcHJpdihodyktPnVzZV9uZXdfdHJ4X2Zsb3cgPT0gZmFsc2UpCisJCXJ0bHBjaS0+dHhyaW5nY291bnRbQkVfUVVFVUVdID0gUlRfVFhERVNDX05VTV9CRV9RVUVVRTsKKworCXJ0bHBjaS0+cnhidWZmZXJzaXplID0gOTEwMDsJLyoyMDQ4LzEwMjQ7ICovCisJcnRscGNpLT5yeHJpbmdjb3VudCA9IFJUTF9QQ0lfTUFYX1JYX0NPVU5UOwkvKjY0OyAqLworfQorCitzdGF0aWMgdm9pZCBfcnRsX3BjaV9pbml0X3N0cnVjdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCisJcnRscHJpdi0+cnRsaGFsLnVwX2ZpcnN0X3RpbWUgPSB0cnVlOworCXJ0bHByaXYtPnJ0bGhhbC5iZWluZ19pbml0X2FkYXB0ZXIgPSBmYWxzZTsKKworCXJ0bGhhbC0+aHcgPSBodzsKKwlydGxwY2ktPnBkZXYgPSBwZGV2OworCisJLypUeC9SeCByZWxhdGVkIHZhciAqLworCV9ydGxfcGNpX2luaXRfdHJ4X3Zhcihodyk7CisKKwkvKklCU1MqLyBtYWMtPmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKKworCS8qQU1QRFUqLworCW1hYy0+bWluX3NwYWNlX2NmZyA9IDA7CisJbWFjLT5tYXhfbXNzX2RlbnNpdHkgPSAwOworCS8qc2V0IHNhbmUgQU1QRFUgZGVmYXVsdHMgKi8KKwltYWMtPmN1cnJlbnRfYW1wZHVfZGVuc2l0eSA9IDc7CisJbWFjLT5jdXJyZW50X2FtcGR1X2ZhY3RvciA9IDM7CisKKwkvKlFPUyovCisJcnRscGNpLT5hY21fbWV0aG9kID0gZUFjbVdheTJfU1c7CisKKwkvKnRhc2sgKi8KKwl0YXNrbGV0X2luaXQoJnJ0bHByaXYtPndvcmtzLmlycV90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlfcnRsX3BjaV9pcnFfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylodyk7CisJdGFza2xldF9pbml0KCZydGxwcml2LT53b3Jrcy5pcnFfcHJlcGFyZV9iY25fdGFza2xldCwKKwkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylodyk7Cit9CisKK3N0YXRpYyBpbnQgX3J0bF9wY2lfaW5pdF90eF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSB1bnNpZ25lZCBpbnQgcHJpbywgdW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF90eF9idWZmZXJfZGVzYyAqYnVmZmVyX2Rlc2M7CisJc3RydWN0IHJ0bF90eF9kZXNjICpkZXNjOworCWRtYV9hZGRyX3QgYnVmZmVyX2Rlc2NfZG1hLCBkZXNjX2RtYTsKKwl1MzIgbmV4dGRlc2NhZGRyZXNzOworCWludCBpOworCisJLyogYWxsb2MgdHggYnVmZmVyIGRlc2MgZm9yIG5ldyB0cnggZmxvdyovCisJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJYnVmZmVyX2Rlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCisJCQkJCSAgICBzaXplb2YoKmJ1ZmZlcl9kZXNjKSAqIGVudHJpZXMsIAorCQkJCQkgICAgJmJ1ZmZlcl9kZXNjX2RtYSk7CisKKwkJaWYgKCFidWZmZXJfZGVzYyB8fCAodW5zaWduZWQgbG9uZylidWZmZXJfZGVzYyAmIDB4RkYpIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgiQ2Fubm90IGFsbG9jYXRlIFRYIHJpbmcgKHByaW8gPSAlZClcbiIsIAorCQkJCSBwcmlvKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChidWZmZXJfZGVzYywgMCwgc2l6ZW9mKCpidWZmZXJfZGVzYykgKiBlbnRyaWVzKTsKKwkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmJ1ZmZlcl9kZXNjID0gYnVmZmVyX2Rlc2M7CisJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5idWZmZXJfZGVzY19kbWEgPSBidWZmZXJfZGVzY19kbWE7CisJCQorCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uY3VyX3R4X3JwID0gMDsKKwkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmN1cl90eF93cCA9IDA7CisJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5hdmxfZGVzYyA9IGVudHJpZXM7CisKKwl9CisJCisJLyogYWxsb2MgZG1hIGZvciB0aGlzIHJpbmcgKi8KKwlkZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAorCQkJCSAgICBzaXplb2YoKmRlc2MpICogZW50cmllcywgJmRlc2NfZG1hKTsKKworCWlmICghZGVzYyB8fCAodW5zaWduZWQgbG9uZylkZXNjICYgMHhGRikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiQ2Fubm90IGFsbG9jYXRlIFRYIHJpbmcgKHByaW8gPSAlZClcbiIsIHByaW8pKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykgKiBlbnRyaWVzKTsKKwlydGxwY2ktPnR4X3JpbmdbcHJpb10uZGVzYyA9IGRlc2M7CisJcnRscGNpLT50eF9yaW5nW3ByaW9dLmRtYSA9IGRlc2NfZG1hOworCQorCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5pZHggPSAwOworCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5lbnRyaWVzID0gZW50cmllczsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZydGxwY2ktPnR4X3JpbmdbcHJpb10ucXVldWUpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoInF1ZXVlOiVkLCByaW5nX2FkZHI6JXBcbiIsIHByaW8sIGRlc2MpKTsKKworCS8qIGluaXQgZXZlcnkgZGVzYyBpbiB0aGlzIHJpbmcgKi8KKwlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9PSBmYWxzZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCQluZXh0ZGVzY2FkZHJlc3MgPSBjcHVfdG9fbGUzMigodTMyKSBkZXNjX2RtYSArCisJCQkJCQkgICAgICAoKGkgKwkxKSAlIGVudHJpZXMpICoKKwkJCQkJCSAgICAgIHNpemVvZigqZGVzYykpOworCisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSAmIChkZXNjW2ldKSwKKwkJCQkJCSAgICB0cnVlLCAKKwkJCQkJCSAgICBIV19ERVNDX1RYX05FWFRERVNDX0FERFIsCisJCQkJCQkgICAgKHU4ICopICYgbmV4dGRlc2NhZGRyZXNzKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcnRsX3BjaV9pbml0X3J4X3Jpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCByeHJpbmdfaWR4KQoreworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJaW50IGk7CisJCisJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJc3RydWN0IHJ0bF9yeF9idWZmZXJfZGVzYyAqZW50cnkgPSBOVUxMOworCQkvKiBhbGxvYyBkbWEgZm9yIHRoaXMgcmluZyAqLworCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgPSAKKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKKwkJCQkJIHNpemVvZigqcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLgorCQkJCQkgICAgICAgIGJ1ZmZlcl9kZXNjKSAqIAorCQkJCQkgICAgICAgIHJ0bHBjaS0+cnhyaW5nY291bnQsIAorCQkJCQkgJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kbWEpOworCQlpZiAoIXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzYyB8fAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjICYgMHhGRikgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgKCJDYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIikpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQltZW1zZXQocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjLCAwLAorCQkgICAgICAgc2l6ZW9mKCpydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MpICoKKwkJICAgICAgIHJ0bHBjaS0+cnhyaW5nY291bnQpOworCisJCS8qIGluaXQgZXZlcnkgZGVzYyBpbiB0aGlzIHJpbmcgKi8KKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsJCQkKKwkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzY1tpXTsKKwkJCWlmICghX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKillbnRyeSwgCisJCQkJCQkgICAgICByeHJpbmdfaWR4LCBpKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBydGxfcnhfZGVzYyAqZW50cnkgPSBOVUxMOworCQl1OCB0bXBfb25lID0gMTsKKwkJLyogYWxsb2MgZG1hIGZvciB0aGlzIHJpbmcgKi8KKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgPSAKKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKKwkJCQkJIHNpemVvZigqcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLgorCQkJCQkgICAgICAgIGRlc2MpICogcnRscGNpLT5yeHJpbmdjb3VudCwgCisJCQkJCSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRtYSk7CisJCWlmICghcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgfHwKKwkJICAgICh1bnNpZ25lZCBsb25nKXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjICYgMHhGRikgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgCisJCQkJICgiQ2Fubm90IGFsbG9jYXRlIFJYIHJpbmdcbiIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjLCAwLAorCQkgICAgICAgc2l6ZW9mKCpydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYykgKgorCQkgICAgICAgcnRscGNpLT5yeHJpbmdjb3VudCk7CisKKwkJLyogaW5pdCBldmVyeSBkZXNjIGluIHRoaXMgcmluZyAqLworCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewkJCQorCQkJZW50cnkgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2NbaV07CisJCQlpZiAoIV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopZW50cnksIAorCQkJCQkJICAgICAgcnhyaW5nX2lkeCwgaSkpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLAorCQkJCQkgICAgSFdfREVTQ19SWEVSTywgKHU4ICopICYgdG1wX29uZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfcnRsX3BjaV9mcmVlX3R4X3Jpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICB1bnNpZ25lZCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1twcmlvXTsKKworCS8qIGZyZWUgZXZlcnkgZGVzYyBpbiB0aGlzIHJpbmcgKi8KKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CisJCXU4ICplbnRyeTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKKwkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCisJCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+YnVmZmVyX2Rlc2NbcmluZy0+aWR4XSk7CisJCWVsc2UKKwkJCWVudHJ5ID0gKHU4ICopKCZyaW5nLT5kZXNjW3JpbmctPmlkeF0pOworCisJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCSBsZTMyX3RvX2NwdShydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoCisJCQkJICh1OCAqKSBlbnRyeSwgdHJ1ZSwgSFdfREVTQ19UWEJVRkZfQUREUikpLAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOworCX0KKworCS8qIGZyZWUgZG1hIG9mIHRoaXMgcmluZyAqLworCXBjaV9mcmVlX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAorCQkJICAgIHNpemVvZigqcmluZy0+ZGVzYykgKiByaW5nLT5lbnRyaWVzLAorCQkJICAgIHJpbmctPmRlc2MsIHJpbmctPmRtYSk7CisJcmluZy0+ZGVzYyA9IE5VTEw7CisJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCisJCQkJICAgIHNpemVvZigqcmluZy0+YnVmZmVyX2Rlc2MpICogcmluZy0+ZW50cmllcywKKwkJCQkgICAgcmluZy0+YnVmZmVyX2Rlc2MsIHJpbmctPmJ1ZmZlcl9kZXNjX2RtYSk7CisJCXJpbmctPmJ1ZmZlcl9kZXNjID0gTlVMTDsKKwl9CQorfQorCitzdGF0aWMgdm9pZCBfcnRsX3BjaV9mcmVlX3J4X3Jpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCByeHJpbmdfaWR4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCWludCBpOworCisJLyogZnJlZSBldmVyeSBkZXNjIGluIHRoaXMgcmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5yeF9idWZbaV07CisJCWlmICghc2tiKQorCQkJY29udGludWU7CisKKwkJcGNpX3VubWFwX3NpbmdsZShydGxwY2ktPnBkZXYsICooKGRtYV9hZGRyX3QgKikgc2tiLT5jYiksCisJCQkJIHJ0bHBjaS0+cnhidWZmZXJzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKiBmcmVlIGRtYSBvZiB0aGlzIHJpbmcgKi8KKwlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKKwkJCQkgICAgc2l6ZW9mKCpydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uCisJCQkJICAgICAgICAgICBidWZmZXJfZGVzYykgKiBydGxwY2ktPnJ4cmluZ2NvdW50LAorCQkJCSAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MsCisJCQkJICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kbWEpOworCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgPSBOVUxMOworCX0gZWxzZSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocnRscGNpLT5wZGV2LAorCQkJCSAgICBzaXplb2YoKnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjKSAqCisJCQkJICAgIHJ0bHBjaS0+cnhyaW5nY291bnQsCisJCQkJICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjLAorCQkJCSAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZG1hKTsKKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBfcnRsX3BjaV9pbml0X3RyeF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJaW50IHJldDsKKwlpbnQgaSwgcnhyaW5nX2lkeDsKKworCS8qIHJ4cmluZ19pZHggMDpSWF9NUERVX1FVRVVFCisJICogcnhyaW5nX2lkeCAxOlJYX0NNRF9RVUVVRSAqLworCWZvciAocnhyaW5nX2lkeCA9IDA7IHJ4cmluZ19pZHggPCBSVExfUENJX01BWF9SWF9RVUVVRTsgcnhyaW5nX2lkeCsrKSB7CisJCXJldCA9IF9ydGxfcGNpX2luaXRfcnhfcmluZyhodywgcnhyaW5nX2lkeCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7CisJCXJldCA9IF9ydGxfcGNpX2luaXRfdHhfcmluZyhodywgaSwgcnRscGNpLT50eHJpbmdjb3VudFtpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9mcmVlX3JpbmdzOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9yaW5nczoKKwlmb3IgKHJ4cmluZ19pZHggPSAwOyByeHJpbmdfaWR4IDwgUlRMX1BDSV9NQVhfUlhfUVVFVUU7IHJ4cmluZ19pZHgrKykKKwkJX3J0bF9wY2lfZnJlZV9yeF9yaW5nKGh3LCByeHJpbmdfaWR4KTsKKworCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKQorCQlpZiAocnRscGNpLT50eF9yaW5nW2ldLmRlc2MgfHwgCisJCSAgICBydGxwY2ktPnR4X3JpbmdbaV0uYnVmZmVyX2Rlc2MpCisJCQlfcnRsX3BjaV9mcmVlX3R4X3JpbmcoaHcsIGkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3J0bF9wY2lfZGVpbml0X3RyeF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXUzMiBpLCByeHJpbmdfaWR4OworCisJLypmcmVlIHJ4IHJpbmdzICovCisJZm9yIChyeHJpbmdfaWR4ID0gMDsgcnhyaW5nX2lkeCA8IFJUTF9QQ0lfTUFYX1JYX1FVRVVFOyByeHJpbmdfaWR4KyspCisJCV9ydGxfcGNpX2ZyZWVfcnhfcmluZyhodywgcnhyaW5nX2lkeCk7CisKKwkvKmZyZWUgdHggcmluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykKKwkJX3J0bF9wY2lfZnJlZV90eF9yaW5nKGh3LCBpKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRsX3BjaV9yZXNldF90cnhfcmluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlpbnQgaSwgcnhyaW5nX2lkeDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHRtcF9vbmUgPSAxOworCS8qIHJ4cmluZ19pZHggMDpSWF9NUERVX1FVRVVFICovCisJLyogcnhyaW5nX2lkeCAxOlJYX0NNRF9RVUVVRSAqLworCWZvciAocnhyaW5nX2lkeCA9IDA7IHJ4cmluZ19pZHggPCBSVExfUENJX01BWF9SWF9RVUVVRTsgcnhyaW5nX2lkeCsrKSB7CisJCS8qIGZvcmNlIHRoZSByeF9yaW5nW1JYX01QRFVfUVVFVUUvCisJCSAqIFJYX0NNRF9RVUVVRV0uaWR4IHRvIHRoZSBmaXJzdCBvbmUgKi8KKwkJLypuZXcgdHJ4IGZsb3csIGRvIG5vdGhpbmcqLworCQlpZiAoKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cgPT0gZmFsc2UpICYmIAorCQkgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjKSB7CisJCQlzdHJ1Y3QgcnRsX3J4X2Rlc2MgKmVudHJ5ID0gTlVMTDsKKworCQkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgeworCQkJCWVudHJ5ID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5kZXNjW2ldOwkJCQorCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCAKKwkJCQkJCQkgICAgZmFsc2UsCisJCQkJCQkJICAgIEhXX0RFU0NfUlhPV04sIAorCQkJCQkJCSAgICAodTggKikgJiB0bXBfb25lKTsJCQorCQkJfQorCQl9CisJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPSAwOwl9CisKKwkvKiBhZnRlciByZXNldCwgcmVsZWFzZSBwcmV2aW91cyBwZW5kaW5nIHBhY2tldCwKKwkgKiBhbmQgZm9yY2UgdGhlICB0eCBpZHggdG8gdGhlIGZpcnN0IG9uZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7CisJCWlmIChydGxwY2ktPnR4X3JpbmdbaV0uZGVzYyB8fCAKKwkJCXJ0bHBjaS0+dHhfcmluZ1tpXS5idWZmZXJfZGVzYykgeworCQkJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZydGxwY2ktPnR4X3JpbmdbaV07CisKKwkJCXdoaWxlIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpIHsKKwkJCQl1OCAqZW50cnk7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IAorCQkJCQlfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7CisJCQkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCisJCQkJCWVudHJ5ID0gKHU4ICopKCZyaW5nLT5idWZmZXJfZGVzYworCQkJCQkJCQlbcmluZy0+aWR4XSk7CisJCQkJZWxzZQorCQkJCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+ZGVzY1tyaW5nLT5pZHhdKTsKKworCQkJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCQlsZTMyX3RvX2NwdShydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoCisJCQkJCQkJKHU4ICopZW50cnksIHRydWUsCisJCQkJCQkJSFdfREVTQ19UWEJVRkZfQUREUikpLAorCQkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJcmluZy0+aWR4ID0gKHJpbmctPmlkeCArIDEpICUgcmluZy0+ZW50cmllczsKKwkJCX0KKwkJCXJpbmctPmlkeCA9IDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQorc3RhdGljIGJvb2wgcnRsX3BjaV90eF9jaGtfd2FpdHFfaW5zZXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCAKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKKyNlbHNlCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworc3RhdGljIGJvb2wgcnRsX3BjaV90eF9jaGtfd2FpdHFfaW5zZXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworeworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQorCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gaW5mby0+Y29udHJvbC5zdGE7CisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKwl1OCB0aWQgPSBydGxfZ2V0X3RpZChza2IpOworCXUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKworCWlmKCFzdGEpCisJCXJldHVybiBmYWxzZTsKKwlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKXN0YS0+ZHJ2X3ByaXY7CisKKwlpZiAoIXJ0bHByaXYtPnJ0bGhhbC5iX2Vhcmx5bW9kZV9lbmFibGUpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChpZWVlODAyMTFfaXNfcHNwb2xsKGZjKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHN0YV9lbnRyeS0+dGlkc1t0aWRdLmFnZy5hZ2dfc3RhdGUgIT0gUlRMX0FHR19PUEVSQVRJT05BTCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChfcnRsX21hY190b19od3F1ZXVlKGh3LCBza2IpID4gVk9fUVVFVUUpCisJCXJldHVybiBmYWxzZTsKKwlpZiAodGlkID4gNykKKwkJcmV0dXJuIGZhbHNlOworCS8qIG1heWJlIGV2ZXJ5IHRpZCBzaG91bGQgYmUgY2hlY2tlZCAqLworCWlmICghcnRscHJpdi0+bGlua19pbmZvLmhpZ2hlcl9idXN5dHh0cmFmZmljW3RpZF0pCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3Mud2FpdHFfbG9jayk7CisJc2tiX3F1ZXVlX3RhaWwoJnJ0bHByaXYtPm1hYzgwMjExLnNrYl93YWl0cVt0aWRdLCBza2IpOworCXNwaW5fdW5sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKKworCXJldHVybiB0cnVlOworfQorCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKK2ludCBydGxfcGNpX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpCisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KK3N0YXRpYyBpbnQgcnRsX3BjaV90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworeworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnkgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQorCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBpbmZvLT5jb250cm9sLnN0YTsKKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOworCXN0cnVjdCBydGxfdHhfZGVzYyAqcGRlc2M7CisJc3RydWN0IHJ0bF90eF9idWZmZXJfZGVzYyAqcHR4X2JkX2Rlc2MgPSBOVUxMOworCXUxNiBpZHg7CisJdTggb3duOworCXU4IHRlbXBfb25lID0gMTsKKwl1OCBod19xdWV1ZSA9IF9ydGxfbWFjX3RvX2h3cXVldWUoaHcsIHNrYik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gcnRsX2dldF9oZHIoc2tiKTsKKwl1MTYgZmMgPSBydGxfZ2V0X2ZjKHNrYik7CisJdTggKnBkYV9hZGRyID0gaGRyLT5hZGRyMTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCS8qc3NuICovCisJdTggdGlkID0gMDsKKwl1MTYgc2VxX251bWJlciA9IDA7CisKKworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCXJ0bF90eF9tZ210X3Byb2MoaHcsIHNrYik7CisKKwlpZiAocnRscHJpdi0+cHNjLnN3X3BzX2VuYWJsZWQpIHsKKwkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSAmJiAhaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSAmJgorCQkgICAgIWllZWU4MDIxMV9oYXNfcG0oZmMpKQorCQkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BNKTsKKwl9CisKKwlydGxfYWN0aW9uX3Byb2MoaHcsIHNrYiwgdHJ1ZSk7CisKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGRhX2FkZHIpKQorCQlydGxwcml2LT5zdGF0cy50eGJ5dGVzbXVsdGljYXN0ICs9IHNrYi0+bGVuOworCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBkYV9hZGRyKSkKKwkJcnRscHJpdi0+c3RhdHMudHhieXRlc2Jyb2FkY2FzdCArPSBza2ItPmxlbjsKKwllbHNlCisJCXJ0bHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IHNrYi0+bGVuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CisJcmluZyA9ICZydGxwY2ktPnR4X3JpbmdbaHdfcXVldWVdOworCWlmIChod19xdWV1ZSAhPSBCRUFDT05fUVVFVUUpIHsKKwkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCisJCQlpZHggPSByaW5nLT5jdXJfdHhfd3A7CisJCWVsc2UKKwkJCWlkeCA9IChyaW5nLT5pZHggKyBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpICUKKwkJCSAgICAgIHJpbmctPmVudHJpZXM7CisJfSBlbHNlIHsKKwkJaWR4ID0gMDsKKwl9CisKKwlwZGVzYyA9ICZyaW5nLT5kZXNjW2lkeF07CisJCisJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJcHR4X2JkX2Rlc2MgPSAmcmluZy0+YnVmZmVyX2Rlc2NbaWR4XTsKKwl9IGVsc2UgewkKKwkJb3duID0gKHU4KSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLAorCQkJCXRydWUsIEhXX0RFU0NfT1dOKTsKKworCQlpZiAoKG93biA9PSAxKSAmJiAoaHdfcXVldWUgIT0gQkVBQ09OX1FVRVVFKSkgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJCSAoIk5vIG1vcmUgVFggZGVzY0AlZCwgcmluZy0+aWR4ID0gJWQsIgorCQkJCSAgImlkeCA9ICVkLCBza2JfcXVldWVfbGVuID0gMHglZFxuIiwKKwkJCQkgIGh3X3F1ZXVlLCByaW5nLT5pZHgsIGlkeCwKKwkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgCisJCQkJCSAgICAgICBmbGFncyk7CisJCQlyZXR1cm4gc2tiLT5sZW47CisJCX0KKwl9CisJCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJdGlkID0gcnRsX2dldF90aWQoc2tiKTsKKwkJaWYgKHN0YSkgeworCQkJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKilzdGEtPmRydl9wcml2OworCQkJc2VxX251bWJlciA9IChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIAorCQkJCSAgICAgIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNDsKKwkJCXNlcV9udW1iZXIgKz0gMTsKKworCQkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKQorCQkJCXN0YV9lbnRyeS0+dGlkc1t0aWRdLnNlcV9udW1iZXIgPSBzZXFfbnVtYmVyOworCQl9CisJfQorCisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LCBMRURfQ1RMX1RYKTsKKworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsIAorCQkJCQkodTggKilwdHhfYmRfZGVzYywgaW5mbywgc2tiLCAKKwkJCQkJaHdfcXVldWUsIHB0Y2JfZGVzYyk7CisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywgCisJCQkJCSh1OCAqKXB0eF9iZF9kZXNjLCBpbmZvLCBzdGEsIHNrYiwgCisJCQkJCWh3X3F1ZXVlLCBwdGNiX2Rlc2MpOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCisJX19za2JfcXVldWVfdGFpbCgmcmluZy0+cXVldWUsIHNrYik7CisJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgcGRlc2MsIHRydWUsCisJCQkJCSAgICBIV19ERVNDX09XTiwgKHU4ICopICYgaHdfcXVldWUpOworCX0gZWxzZSB7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIHBkZXNjLCB0cnVlLAorCQkJCQkgICAgSFdfREVTQ19PV04sICh1OCAqKSAmIHRlbXBfb25lKTsKKwl9CisKKwlpZiAoKHJpbmctPmVudHJpZXMgLSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpIDwgMiAmJgorCSAgICBod19xdWV1ZSAhPSBCRUFDT05fUVVFVUUpIHsKKworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0xPVUQsCisJCQkgKCJsZXNzIGRlc2MgbGVmdCwgc3RvcCBza2JfcXVldWVAJWQsICIKKwkJCSAgInJpbmctPmlkeCA9ICVkLCIKKwkJCSAgImlkeCA9ICVkLCBza2JfcXVldWVfbGVuID0gMHglZFxuIiwKKwkJCSAgaHdfcXVldWUsIHJpbmctPmlkeCwgaWR4LAorCQkJICBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpKTsKKworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShodywgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+dHhfcG9sbGluZyhodywgaHdfcXVldWUpOworCisJcmV0dXJuIDA7Cit9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorc3RhdGljIHZvaWQgcnRsX3BjaV9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHJ0bF9wY2lfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCkKKyNlbmRpZgoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1MTYgaSA9IDA7CisJaW50IHF1ZXVlX2lkOworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmc7CisJCisJaWYgKG1hYy0+c2tpcF9zY2FuKQorCQlyZXR1cm47CisJCisJZm9yIChxdWV1ZV9pZCA9IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UIC0gMTsgcXVldWVfaWQgPj0gMDspIHsKKwkJdTMyIHF1ZXVlX2xlbjsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCisJCWlmICgoKHF1ZXVlcyA+PiBxdWV1ZV9pZCkgJiAweDEpID09IDApIHsKKwkJCXF1ZXVlX2lkLS07CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCXJpbmcgPSAmcGNpcHJpdi0+ZGV2LnR4X3JpbmdbcXVldWVfaWRdOworCQlxdWV1ZV9sZW4gPSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSk7CisJCWlmIChxdWV1ZV9sZW4gPT0gMCB8fCBxdWV1ZV9pZCA9PSBCRUFDT05fUVVFVUUgfHwKKwkJCXF1ZXVlX2lkID09IFRYQ01EX1FVRVVFKSB7CisJCQlxdWV1ZV9pZC0tOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQltc2xlZXAoNSk7CisJCQlpKys7CisJCX0KKworCQkvKiB3ZSBqdXN0IHdhaXQgMXMgZm9yIGFsbCBxdWV1ZXMgKi8KKwkJaWYgKHJ0bHByaXYtPnBzYy5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYgfHwKKwkJCWlzX2hhbF9zdG9wKHJ0bGhhbCkgfHwgaSA+PSAyMDApCisJCQlyZXR1cm47CisJfQorfQorCit2b2lkIHJ0bF9wY2lfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJX3J0bF9wY2lfZGVpbml0X3RyeF9yaW5nKGh3KTsKKworCXN5bmNocm9uaXplX2lycShydGxwY2ktPnBkZXYtPmlycSk7CisJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7CisKKwlmbHVzaF93b3JrcXVldWUocnRscHJpdi0+d29ya3MucnRsX3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShydGxwcml2LT53b3Jrcy5ydGxfd3EpOworCit9CisKK2ludCBydGxfcGNpX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgZXJyOworCisJX3J0bF9wY2lfaW5pdF9zdHJ1Y3QoaHcsIHBkZXYpOworCisJZXJyID0gX3J0bF9wY2lfaW5pdF90cnhfcmluZyhodyk7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgidHggcmluZyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBydGxfcGNpX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJaW50IGVyciA9IDA7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csICgiIHJ0bF9wY2lfc3RhcnQgXG4iKSk7CisJcnRsX3BjaV9yZXNldF90cnhfcmluZyhodyk7CisKKwlydGxwcml2LT5ydGxoYWwuZHJpdmVyX2lzX2dvaW5ndG9fdW5sb2FkID0gZmFsc2U7CisJZXJyID0gcnRscHJpdi0+Y2ZnLT5vcHMtPmh3X2luaXQoaHcpOworCWlmIChlcnIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCQkgKCJGYWlsZWQgdG8gY29uZmlnIGhhcmR3YXJlIGVyciAleCFcbiIsZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmVuYWJsZV9pbnRlcnJ1cHQoaHcpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiZW5hYmxlX2ludGVycnVwdCBPS1xuIikpOworCisJcnRsX2luaXRfcnhfY29uZmlnKGh3KTsKKworCS8qc2hvdWxkIGFmdGVyIGFkYXB0ZXIgc3RhcnQgYW5kIGludGVycnVwdCBlbmFibGUuICovCisJc2V0X2hhbF9zdGFydChydGxoYWwpOworCisJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpOworCisJcnRscHJpdi0+cnRsaGFsLnVwX2ZpcnN0X3RpbWUgPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0RNRVNHLCAoInJ0bF9wY2lfc3RhcnQgT0tcbiIpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGxfcGNpX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggUkZJblByb2dyZXNzVGltZU91dCA9IDA7CisKKwkvKgorCSAqc2hvdWxkIGJlZm9yZSBkaXNhYmxlIGludGVycnJ1cHQmYWRhcHRlcgorCSAqYW5kIHdpbGwgZG8gaXQgaW1tZWRpYXRlbHkuCisJICovCisJc2V0X2hhbF9zdG9wKHJ0bGhhbCk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+ZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOworCisJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwl3aGlsZSAocHBzYy0+cmZjaGFuZ2VfaW5wcm9ncmVzcykgeworCQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJCWlmIChSRkluUHJvZ3Jlc3NUaW1lT3V0ID4gMTAwKSB7CisJCQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5KDEpOworCQlSRkluUHJvZ3Jlc3NUaW1lT3V0Kys7CisJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJfQorCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSB0cnVlOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKworCXJ0bHByaXYtPnJ0bGhhbC5kcml2ZXJfaXNfZ29pbmd0b191bmxvYWQgPSB0cnVlOworCXJ0bHByaXYtPmNmZy0+b3BzLT5od19kaXNhYmxlKGh3KTsKKwlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIExFRF9DVExfUE9XRVJfT0ZGKTsKKworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJcHBzYy0+cmZjaGFuZ2VfaW5wcm9ncmVzcyA9IGZhbHNlOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKworCXJ0bF9wY2lfZW5hYmxlX2FzcG0oaHcpOworfQorCitzdGF0aWMgYm9vbCBfcnRsX3BjaV9maW5kX2FkYXB0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfcGRldiA9IHBkZXYtPmJ1cy0+c2VsZjsKKwl1MTYgdmVuZGVyaWQ7CisJdTE2IGRldmljZWlkOworCXU4IHJldmlzaW9uaWQ7CisJdTE2IGlycWxpbmU7CisJdTggdG1wOworCisJdmVuZGVyaWQgPSBwZGV2LT52ZW5kb3I7CisJZGV2aWNlaWQgPSBwZGV2LT5kZXZpY2U7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4LCAmcmV2aXNpb25pZCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHgzQywgJmlycWxpbmUpOworCisJaWYgKGRldmljZWlkID09IFJUTF9QQ0lfODE5Ml9ESUQgfHwKKwkgICAgZGV2aWNlaWQgPT0gUlRMX1BDSV8wMDQ0X0RJRCB8fAorCSAgICBkZXZpY2VpZCA9PSBSVExfUENJXzAwNDdfRElEIHx8CisJICAgIGRldmljZWlkID09IFJUTF9QQ0lfODE5MlNFX0RJRCB8fAorCSAgICBkZXZpY2VpZCA9PSBSVExfUENJXzgxNzRfRElEIHx8CisJICAgIGRldmljZWlkID09IFJUTF9QQ0lfODE3M19ESUQgfHwKKwkgICAgZGV2aWNlaWQgPT0gUlRMX1BDSV84MTcyX0RJRCB8fAorCSAgICBkZXZpY2VpZCA9PSBSVExfUENJXzgxNzFfRElEKSB7CisJCXN3aXRjaCAocmV2aXNpb25pZCkgeworCQljYXNlIFJUTF9QQ0lfUkVWSVNJT05fSURfODE5MlBDSUU6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywKKwkJCQkgKCI4MTkyRSBpcyBmb3VuZCBidXQgbm90IHN1cHBvcnRlZCBub3ctIgorCQkJCSAgInZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRTsKKwkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIFJUTF9QQ0lfUkVWSVNJT05fSURfODE5MlNFOgorCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCQkJICgiODE5MlNFIGlzIGZvdW5kIC0gIgorCQkJCSAgInZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkgKCJFcnI6IFVua25vd24gZGV2aWNlIC0gIgorCQkJCSAgInZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0U7CisJCQlicmVhazsKKworCQl9CisJfWVsc2UgaWYoZGV2aWNlaWQgPT0gUlRMX1BDSV84NzIzQUVfRElEKSB7CisJCXJ0bGhhbC0+aHdfdHlwZSA9IEhBUkRXQVJFX1RZUEVfUlRMODcyM0FFOworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywKKwkJCSAoIjg3MjNBRSBQQ0ktRSBpcyBmb3VuZCAtICIKKwkJCSAgInZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCX0gZWxzZSBpZiAoZGV2aWNlaWQgPT0gUlRMX1BDSV84MTkyQ0VUX0RJRCB8fAorCQkgICBkZXZpY2VpZCA9PSBSVExfUENJXzgxOTJDRV9ESUQgfHwKKwkJICAgZGV2aWNlaWQgPT0gUlRMX1BDSV84MTkxQ0VfRElEIHx8CisJCSAgIGRldmljZWlkID09IFJUTF9QQ0lfODE4OENFX0RJRCkgeworCQlydGxoYWwtPmh3X3R5cGUgPSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJDRTsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCQkgKCI4MTkyQyBQQ0ktRSBpcyBmb3VuZCAtICIKKwkJCSAgInZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCX0gZWxzZSBpZiAoZGV2aWNlaWQgPT0gUlRMX1BDSV84MTkyREVfRElEIHx8CisJCSAgIGRldmljZWlkID09IFJUTF9QQ0lfODE5MkRFX0RJRDIpIHsKKwkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyREU7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0RNRVNHLAorCQkJICgiODE5MkQgUENJLUUgaXMgZm91bmQgLSAiCisJCQkgICJ2aWQvZGlkPSV4LyV4XG4iLCB2ZW5kZXJpZCwgZGV2aWNlaWQpKTsKKwl9ZWxzZSBpZihkZXZpY2VpZCA9PSBSVExfUENJXzgxODhFRV9ESUQpeworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTg4RUU7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsCisJCQkJICgiRmluZCBhZGFwdGVyLCBIYXJkd2FyZSB0eXBlIGlzIDgxODhFRVxuIikpOworCX1lbHNlIGlmIChkZXZpY2VpZCA9PSBSVExfUENJXzg3MjNCRV9ESUQpeworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQkU7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsCisJCQkJICgiRmluZCBhZGFwdGVyLCBIYXJkd2FyZSB0eXBlIGlzIDg3MjNCRVxuIikpOworCX1lbHNlIGlmIChkZXZpY2VpZCA9PSBSVExfUENJXzgxOTJFRV9ESUQpeworCQkJcnRsaGFsLT5od190eXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRUU7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsCisJCQkJICgiRmluZCBhZGFwdGVyLCBIYXJkd2FyZSB0eXBlIGlzIDgxOTJFRVxuIikpOworCX1lbHNlIGlmIChkZXZpY2VpZCA9PSBSVExfUENJXzg4MjFBRV9ESUQpIHsKKwkJCXJ0bGhhbC0+aHdfdHlwZSA9IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFOworCQkJUlRfVFJBQ0UoQ09NUF9JTklULERCR19MT1VELAorCQkJCSgiRmluZCBhZGFwdGVyLCBIYXJkd2FyZSB0eXBlIGlzIDg4MjFBRVxuIikpOworCX1lbHNlIGlmIChkZXZpY2VpZCA9PSBSVExfUENJXzg4MTJBRV9ESUQpIHsKKwkJCXJ0bGhhbC0+aHdfdHlwZSA9IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFOworCQkJUlRfVFJBQ0UoQ09NUF9JTklULERCR19MT1VELAorCQkJCSgiRmluZCBhZGFwdGVyLCBIYXJkd2FyZSB0eXBlIGlzIDg4MTJBRVxuIikpOworCX1lbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJICgiRXJyOiBVbmtub3duIGRldmljZSAtIgorCQkJICAiIHZpZC9kaWQ9JXgvJXhcbiIsIHZlbmRlcmlkLCBkZXZpY2VpZCkpOworCisJCXJ0bGhhbC0+aHdfdHlwZSA9IFJUTF9ERUZBVUxUX0hBUkRXQVJFX1RZUEU7CisJfQorCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJERSkgeworCQlpZiAocmV2aXNpb25pZCA9PSAwIHx8IHJldmlzaW9uaWQgPT0gMSkgeworCQkJaWYgKHJldmlzaW9uaWQgPT0gMCkgeworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJCSAoIkZpbmQgOTJERSBNQUMwLlxuIikpOworCQkJCXJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPSAwOworCQkJfSBlbHNlIGlmIChyZXZpc2lvbmlkID09IDEpIHsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCQkgKCJGaW5kIDkyREUgTUFDMS5cbiIpKTsKKwkJCQlydGxoYWwtPmludGVyZmFjZWluZGV4ID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiVW5rbm93biBkZXZpY2UgLSAiCisJCQkJICJWZW5kb3JJRC9EZXZpY2VJRD0leC8leCwgUmV2aXNpb249JXhcbiIsCisJCQkJIHZlbmRlcmlkLCBkZXZpY2VpZCwgcmV2aXNpb25pZCkpOworCQkJcnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9IDA7CisJCX0KKwl9CisJCisJLyogOTJlZSB1c2UgbmV3IHRyeCBmbG93ICovCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJFRSkKKwkJcnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9IHRydWU7CisJZWxzZQorCQlydGxwcml2LT51c2VfbmV3X3RyeF9mbG93ID0gZmFsc2U7CisJCisJLypmaW5kIGJ1cyBpbmZvICovCisJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmJ1c251bWJlciA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCXBjaXByaXYtPm5kaXNfYWRhcHRlci5kZXZudW1iZXIgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CisKKwkvKmZpbmQgYnJpZGdlIGluZm8gKi8KKwlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvciA9IFBDSV9CUklER0VfVkVORE9SX1VOS05PV047CisJLyogc29tZSBBUk0gaGF2ZSBubyBicmlkZ2VfcGRldiBhbmQgd2lsbCBjcmFzaCBoZXJlIAorCSAqIHNvIHdlIHNob3VsZCBjaGVjayBpZiBicmlkZ2VfcGRldiBpcyBOVUxMICovCisJaWYgKGJyaWRnZV9wZGV2KSB7CisJCXBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yaWQgPSBicmlkZ2VfcGRldi0+dmVuZG9yOworCQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBDSV9CUklER0VfVkVORE9SX01BWDsgdG1wKyspIHsKKwkJCWlmIChicmlkZ2VfcGRldi0+dmVuZG9yID09IHBjaWJyaWRnZV92ZW5kb3JzW3RtcF0pIHsKKwkJCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvciA9IHRtcDsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywKKwkJCQkJICgiUGNpIEJyaWRnZSBWZW5kb3IgaXMgZm91bmQgaW5kZXg6ICVkXG4iLAorCQkJCQkgIHRtcCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yICE9CisJICAgIFBDSV9CUklER0VfVkVORE9SX1VOS05PV04pIHsKKwkJcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9idXNudW0gPQorCQkgICAgYnJpZGdlX3BkZXYtPmJ1cy0+bnVtYmVyOworCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX2Rldm51bSA9CisJCSAgICBQQ0lfU0xPVChicmlkZ2VfcGRldi0+ZGV2Zm4pOworCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX2Z1bmNudW0gPQorCQkgICAgUENJX0ZVTkMoYnJpZGdlX3BkZXYtPmRldmZuKTsKKwkJcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWNmZ19hZGRycG9ydCA9CisJCSAgICAocGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9idXNudW0gPDwgMTYpIHwKKwkJICAgIChwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX2Rldm51bSA8PCAxMSkgfAorCQkgICAgKHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfZnVuY251bSA8PCA4KSB8ICgxIDw8IDMxKTsKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNSkpCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3BjaWVoZHJfb2Zmc2V0ID0KKwkJICAgIHBjaV9wY2llX2NhcChicmlkZ2VfcGRldik7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjZWxzZQorCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3BjaWVoZHJfb2Zmc2V0ID0KKwkJCV9ydGxfcGNpX2dldF9wY2llaGRyX29mZnNldChodyk7CisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJCXBjaXByaXYtPm5kaXNfYWRhcHRlci5udW00Ynl0ZXMgPQorCQkgICAgKHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfcGNpZWhkcl9vZmZzZXQgKyAweDEwKSAvIDQ7CisKKwkJcnRsX3BjaV9nZXRfbGlua2NvbnRyb2xfZmllbGQoaHcpOworCisJCWlmIChwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvciA9PQorCQkgICAgUENJX0JSSURHRV9WRU5ET1JfQU1EKSB7CisJCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIuYW1kX2wxX3BhdGNoID0KKwkJCSAgICBydGxfcGNpX2dldF9hbWRfbDFfcGF0Y2goaHcpOworCQl9CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCSAoInBjaWRldiBidXNudW1iZXI6ZGV2bnVtYmVyOmZ1bmNudW1iZXI6IgorCQkgICJ2ZW5kb3I6bGlua19jdGwgJWQ6JWQ6JWQ6JXg6JXhcbiIsCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLmJ1c251bWJlciwKKwkJICBwY2lwcml2LT5uZGlzX2FkYXB0ZXIuZGV2bnVtYmVyLAorCQkgIHBjaXByaXYtPm5kaXNfYWRhcHRlci5mdW5jbnVtYmVyLAorCQkgIHBkZXYtPnZlbmRvciwgcGNpcHJpdi0+bmRpc19hZGFwdGVyLmxpbmtjdHJsX3JlZykpOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCSAoInBjaV9icmlkZ2UgYnVzbnVtYmVyOmRldm51bWJlcjpmdW5jbnVtYmVyOnZlbmRvcjoiCisJCSAgInBjaWVfY2FwOmxpbmtfY3RsX3JlZzphbWQgJWQ6JWQ6JWQ6JXg6JXg6JXg6JXhcbiIsCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9idXNudW0sCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9kZXZudW0sCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV9mdW5jbnVtLAorCQkgIHBjaWJyaWRnZV92ZW5kb3JzW3BjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yXSwKKwkJICBwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3BjaWVoZHJfb2Zmc2V0LAorCQkgIHBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfbGlua2N0cmxyZWcsCisJCSAgcGNpcHJpdi0+bmRpc19hZGFwdGVyLmFtZF9sMV9wYXRjaCkpOworCisJcnRsX3BjaV9wYXJzZV9jb25maWd1cmF0aW9uKHBkZXYsIGh3KTsKKwlsaXN0X2FkZF90YWlsKCZydGxwcml2LT5saXN0LCAmcnRscHJpdi0+Z2xiX3Zhci0+Z2xiX3ByaXZfbGlzdCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgcnRsX3BjaV9pbnRyX21vZGVfbXNpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHBjaXByaXYpOworCWludCByZXQ7CisJcmV0ID0gcGNpX2VuYWJsZV9tc2kocnRscGNpLT5wZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKHJ0bHBjaS0+cGRldi0+aXJxLCAmX3J0bF9wY2lfaW50ZXJydXB0LAorCQkJICBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGh3KTsKKwlpZiAocmV0IDwgMCkgeworCQlwY2lfZGlzYWJsZV9tc2kocnRscGNpLT5wZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlydGxwY2ktPnVzaW5nX21zaSA9IHRydWU7CisJCisJUlRfVFJBQ0UoQ09NUF9JTklUfENPTVBfSU5UUiwgREJHX0RNRVNHLCAoIk1TSSBJbnRlcnJ1cHQgTW9kZSFcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGxfcGNpX2ludHJfbW9kZV9sZWdhY3koc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocGNpcHJpdik7CisJaW50IHJldDsKKwkKKwlyZXQgPSByZXF1ZXN0X2lycShydGxwY2ktPnBkZXYtPmlycSwgJl9ydGxfcGNpX2ludGVycnVwdCwKKwkJCSAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBodyk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlydGxwY2ktPnVzaW5nX21zaSA9IGZhbHNlOworCVJUX1RSQUNFKENPTVBfSU5JVHxDT01QX0lOVFIsIERCR19ETUVTRywgCisJCSAoIlBpbi1iYXNlZCBJbnRlcnJ1cHQgTW9kZSFcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGxfcGNpX2ludHJfbW9kZV9kZWNpZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihwY2lwcml2KTsKKwlpbnQgcmV0OworCWlmIChydGxwY2ktPm1zaV9zdXBwb3J0ID09IHRydWUpIHsKKwkJcmV0ID0gcnRsX3BjaV9pbnRyX21vZGVfbXNpKGh3KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXQgPSBydGxfcGNpX2ludHJfbW9kZV9sZWdhY3koaHcpOworCX0gZWxzZSB7CisJCXJldCA9IHJ0bF9wY2lfaW50cl9tb2RlX2xlZ2FjeShodyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHRoaXMgaXMgdXNlZCBmb3Igb3RoZXIgbW9kdWxlcyBnZXQKKyAqIGh3IHBvaW50ZXIgaW4gcnRsX3BjaV9nZXRfaHdfcG9pbnRlciAqLworc3RydWN0IGllZWU4MDIxMV9odyAqaHdfZXhwb3J0ID0gTlVMTDsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw4LDApKQoraW50IHJ0bF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCisKKyNlbHNlCitpbnQgX19kZXZpbml0IHJ0bF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorI2VuZGlmCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBOVUxMOworCisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gTlVMTDsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gTlVMTDsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpOworCXVuc2lnbmVkIGxvbmcgcG1lbV9zdGFydCwgcG1lbV9sZW4sIHBtZW1fZmxhZ3M7CisJaW50IGVycjsKKworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlSVF9BU1NFUlQoZmFsc2UsCisJCQkgICgiJXMgOiBDYW5ub3QgZW5hYmxlIG5ldyBQQ0kgZGV2aWNlXG4iLAorCQkJICAgcGNpX25hbWUocGRldikpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKKwkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCQkJUlRfQVNTRVJUKGZhbHNlLCAoIlVuYWJsZSB0byBvYnRhaW4gMzJiaXQgRE1BICIKKwkJCQkJICAiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IHJ0bF9wY2lfcHJpdikgKworCQkJCXNpemVvZihzdHJ1Y3QgcnRsX3ByaXYpLCAmcnRsX29wcyk7CisJaWYgKCFodykgeworCQlSVF9BU1NFUlQoZmFsc2UsCisJCQkgICgiJXMgOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iLCBwY2lfbmFtZShwZGV2KSkpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwxOworCX0KKwlod19leHBvcnQgPSBodzsKKworCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmcGRldi0+ZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOworCisJcnRscHJpdiA9IGh3LT5wcml2OworCXBjaXByaXYgPSAodm9pZCAqKXJ0bHByaXYtPnByaXY7CisJcGNpcHJpdi0+ZGV2LnBkZXYgPSBwZGV2OworCisJLyogaW5pdCBjZmcgJiBpbnRmX29wcyAqLworCXJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2UgPSBJTlRGX1BDSTsKKwlydGxwcml2LT5jZmcgPSAoc3RydWN0IHJ0bF9oYWxfY2ZnICopKGlkLT5kcml2ZXJfZGF0YSk7CisJcnRscHJpdi0+aW50Zl9vcHMgPSAmcnRsX3BjaV9vcHM7CisJcnRscHJpdi0+Z2xiX3ZhciA9ICZnbG9iYWxfdmFyOworCisJLyoKKwkgKmluaXQgZGJncCBmbGFncyBiZWZvcmUgYWxsCisJICpvdGhlciBmdW5jdGlvbnMsIGJlY2F1c2Ugd2Ugd2lsbAorCSAqdXNlIGl0IGluIG90aGVyIGZ1bnRpb25zIGxpa2UKKwkgKlJUX1RSQUNFL1JUX1BSSU5UL1JUTF9QUklOVF9EQVRBCisJICp5b3UgY2FuIG5vdCB1c2UgdGhlc2UgbWFjcm8KKwkgKmJlZm9yZSB0aGlzCisJICovCisJcnRsX2RiZ3BfZmxhZ19pbml0KGh3KTsKKworCS8qIE1FTSBtYXAgKi8KKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAoZXJyKSB7CisJCVJUX0FTU0VSVChmYWxzZSwgKCJDYW4ndCBvYnRhaW4gUENJIHJlc291cmNlc1xuIikpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcnRscHJpdi0+Y2ZnLT5iYXJfaWQpOworCXBtZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBydGxwcml2LT5jZmctPmJhcl9pZCk7CisJcG1lbV9mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBydGxwcml2LT5jZmctPmJhcl9pZCk7CisKKwkvKnNoYXJlZCBtZW0gc3RhcnQgKi8KKwlydGxwcml2LT5pby5wY2lfbWVtX3N0YXJ0ID0KKwkJCSh1bnNpZ25lZCBsb25nKXBjaV9pb21hcChwZGV2LAorCQkJcnRscHJpdi0+Y2ZnLT5iYXJfaWQsIHBtZW1fbGVuKTsKKwlpZiAocnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCA9PSAwKSB7CisJCVJUX0FTU0VSVChmYWxzZSwgKCJDYW4ndCBtYXAgUENJIG1lbVxuIikpOworCQlnb3RvIGZhaWwyOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0RNRVNHLAorCQkgKCJtZW0gbWFwcGVkIHNwYWNlOiBzdGFydDogMHglMDhseCBsZW46JTA4bHggIgorCQkgICJmbGFnczolMDhseCwgYWZ0ZXIgbWFwOjB4JTA4bHhcbiIsCisJCSAgcG1lbV9zdGFydCwgcG1lbV9sZW4sIHBtZW1fZmxhZ3MsCisJCSAgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCkpOworCisJLyogRGlzYWJsZSBDbGsgUmVxdWVzdCAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgxLCAwKTsKKwkvKiBsZWF2ZSBEMyBtb2RlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDQsIDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDA0LCAweDA2KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHgwNCwgMHgwNyk7CisKKwkvKiBmaW5kIGFkYXB0ZXIgKi8KKwkvKiBpZiBjaGlwIG5vdCBzdXBwb3J0LCB3aWxsIHJldHVybiBmYWxzZSAqLworCWlmKCFfcnRsX3BjaV9maW5kX2FkYXB0ZXIocGRldiwgaHcpKQorCQlnb3RvIGZhaWwzOworCisJLyogSW5pdCBJTyBoYW5kbGVyICovCisJX3J0bF9wY2lfaW9faGFuZGxlcl9pbml0KCZwZGV2LT5kZXYsIGh3KTsKKworCS8qbGlrZSByZWFkIGVlcHJvbSBhbmQgc28gb24gKi8KKwlydGxwcml2LT5jZmctPm9wcy0+cmVhZF9lZXByb21faW5mbyhodyk7CisKKwlpZiAocnRscHJpdi0+Y2ZnLT5vcHMtPmluaXRfc3dfdmFycyhodykpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgKCJDYW4ndCBpbml0X3N3X3ZhcnMuXG4iKSk7CisJCWdvdG8gZmFpbDM7CisJfQorCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmluaXRfc3dfbGVkcyhodyk7CisKKwkvKmFzcG0gKi8KKwlydGxfcGNpX2luaXRfYXNwbShodyk7CisKKwkvKiBJbml0IG1hYzgwMjExIHN3ICovCisJZXJyID0gcnRsX2luaXRfY29yZShodyk7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiQ2FuJ3QgYWxsb2NhdGUgc3cgZm9yIG1hYzgwMjExLlxuIikpOworCQlnb3RvIGZhaWwzOworCX0KKworCS8qIEluaXQgUENJIHN3ICovCisJZXJyID0gIXJ0bF9wY2lfaW5pdChodywgcGRldik7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoIkZhaWxlZCB0byBpbml0IFBDSS5cbiIpKTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpOworCWlmIChlcnIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIkNhbid0IHJlZ2lzdGVyIG1hYzgwMjExIGh3LlxuIikpOworCQlnb3RvIGZhaWwzOworCX0gZWxzZSB7CisJCXJ0bHByaXYtPm1hYzgwMjExLm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOworCX0KKwkvKiB0aGUgd2lwaHkgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZWQgdG8gCisJICogY2ZnODAyMTEgcHJpb3IgdG8gcmVndWxhdG9yeV9oaW50ICovCisJaWYgKHJlZ3VsYXRvcnlfaGludChody0+d2lwaHksIHJ0bHByaXYtPnJlZ2QuYWxwaGEyKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsICgicmVndWxhdG9yeV9oaW50IGZhaWxcbiIpKTsKKwl9CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmcnRsX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBkZXZpY2UgYXR0cmlidXRlc1xuIikpOworCQlnb3RvIGZhaWwzOworCX0KKwkvKiBhZGQgZm9yIHByb3YgKi8KKwlydGxfcHJvY19hZGRfb25lKGh3KTsKKworCS8qaW5pdCByZmtpbGwgKi8KKwlydGxfaW5pdF9yZmtpbGwoaHcpOworCisJcnRscGNpID0gcnRsX3BjaWRldihwY2lwcml2KTsKKworCWVyciA9IHJ0bF9wY2lfaW50cl9tb2RlX2RlY2lkZShodyk7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywKKwkJCSAoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIsCisJCQkgIHdpcGh5X25hbWUoaHctPndpcGh5KSkpOworCQlnb3RvIGZhaWwzOworCX0gZWxzZSB7CisJCXJ0bHBjaS0+aXJxX2FsbG9jID0gMTsKKwl9CisKKwlzZXRfYml0KFJUTF9TVEFUVVNfSU5URVJGQUNFX1NUQVJULCAmcnRscHJpdi0+c3RhdHVzKTsKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJ0bF9kZWluaXRfY29yZShodyk7CisJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOworCisJaWYgKHJ0bHByaXYtPmlvLnBjaV9tZW1fc3RhcnQgIT0gMCkKKwkJcGNpX2lvdW5tYXAocGRldiwgKHZvaWQgKilydGxwcml2LT5pby5wY2lfbWVtX3N0YXJ0KTsKKworZmFpbDI6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZmFpbDE6CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gLUVOT0RFVjsKKworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcHJvYmUpOworCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICpydGxfcGNpX2dldF9od19wb2ludGVyKHZvaWQpCit7CisJcmV0dXJuIGh3X2V4cG9ydDsKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfcGNpX2dldF9od19wb2ludGVyKTsKKwordm9pZCBydGxfcGNpX2Rpc2Nvbm5lY3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocGNpcHJpdik7CisJc3RydWN0IHJ0bF9tYWMgKnJ0bG1hYyA9IHJ0bF9tYWMocnRscHJpdik7CisKKwljbGVhcl9iaXQoUlRMX1NUQVRVU19JTlRFUkZBQ0VfU1RBUlQsICZydGxwcml2LT5zdGF0dXMpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnJ0bF9hdHRyaWJ1dGVfZ3JvdXApOworCisJLyogYWRkIGZvciBwcm92ICovCisJcnRsX3Byb2NfcmVtb3ZlX29uZShodyk7CisJCisKKwkvKmllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IHdpbGwgY2FsbCBvcHNfc3RvcCAqLworCWlmIChydGxtYWMtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPT0gMSkgeworCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhodyk7CisJCXJ0bG1hYy0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7CisJfSBlbHNlIHsKKwkJcnRsX2RlaW5pdF9kZWZlcnJlZF93b3JrKGh3KTsKKwkJcnRscHJpdi0+aW50Zl9vcHMtPmFkYXB0ZXJfc3RvcChodyk7CisJfQorCisJLypkZWluaXQgcmZraWxsICovCisJcnRsX2RlaW5pdF9yZmtpbGwoaHcpOworCisJcnRsX3BjaV9kZWluaXQoaHcpOworCXJ0bF9kZWluaXRfY29yZShodyk7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPmRlaW5pdF9zd192YXJzKGh3KTsKKworCWlmIChydGxwY2ktPmlycV9hbGxvYykgeworCQlzeW5jaHJvbml6ZV9pcnEocnRscGNpLT5wZGV2LT5pcnEpOworCQlmcmVlX2lycShydGxwY2ktPnBkZXYtPmlycSwgaHcpOworCQlydGxwY2ktPmlycV9hbGxvYyA9IDA7CisJfQorCisJaWYgKHJ0bHBjaS0+dXNpbmdfbXNpID09IHRydWUpCisJCXBjaV9kaXNhYmxlX21zaShydGxwY2ktPnBkZXYpOworCisJbGlzdF9kZWwoJnJ0bHByaXYtPmxpc3QpOworCWlmIChydGxwcml2LT5pby5wY2lfbWVtX3N0YXJ0ICE9IDApIHsKKwkJcGNpX2lvdW5tYXAocGRldiwgKHZvaWQgKilydGxwcml2LT5pby5wY2lfbWVtX3N0YXJ0KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwl9CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlydGxfcGNpX2Rpc2FibGVfYXNwbShodyk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZWVlODAyMTFfZnJlZV9odyhodyk7Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9kaXNjb25uZWN0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgora2VybmVsIHBjaSBwb3dlciBzdGF0ZSBkZWZpbmU6CitQQ0lfRDAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCitQQ0lfRDEgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDEpCitQQ0lfRDIgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDIpCitQQ0lfRDNob3QgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCitQQ0lfRDNjb2xkICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDQpCitQQ0lfVU5LTk9XTiAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDUpCisKK1RoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc3lzdGVtCitnb2VzIGludG8gc3VzcGVuZCBzdGF0ZSBtYWM4MDIxMSB3aWxsCitjYWxsIHJ0bF9tYWNfc3RvcCgpIGZyb20gdGhlIG1hYzgwMjExCitzdXNwZW5kIGZ1bmN0aW9uIGZpcnN0LCBTbyB0aGVyZSBpcworbm8gbmVlZCB0byBjYWxsIGh3X2Rpc2FibGUgaGVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcnRsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+aHdfc3VzcGVuZChodyk7CisJcnRsX2RlaW5pdF9yZmtpbGwoaHcpOworCisJcmV0dXJuIDA7Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9zdXNwZW5kKTsKKworaW50IHJ0bF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+aHdfcmVzdW1lKGh3KTsKKwlydGxfaW5pdF9yZmtpbGwoaHcpOworCQorCXJldHVybiAwOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfcmVzdW1lKTsKKworc3RydWN0IHJ0bF9pbnRmX29wcyBydGxfcGNpX29wcyA9IHsKKwkucmVhZF9lZnVzZV9ieXRlID0gcmVhZF9lZnVzZV9ieXRlLAorCS5hZGFwdGVyX3N0YXJ0ID0gcnRsX3BjaV9zdGFydCwKKwkuYWRhcHRlcl9zdG9wID0gcnRsX3BjaV9zdG9wLAorCS5jaGVja19idWRkeV9wcml2ID0gcnRsX3BjaV9jaGVja19idWRkeV9wcml2LAorCS5hZGFwdGVyX3R4ID0gcnRsX3BjaV90eCwKKwkuZmx1c2ggPSBydGxfcGNpX2ZsdXNoLAorCS5yZXNldF90cnhfcmluZyA9IHJ0bF9wY2lfcmVzZXRfdHJ4X3JpbmcsCisJLndhaXRxX2luc2VydCA9IHJ0bF9wY2lfdHhfY2hrX3dhaXRxX2luc2VydCwKKworCS5kaXNhYmxlX2FzcG0gPSBydGxfcGNpX2Rpc2FibGVfYXNwbSwKKwkuZW5hYmxlX2FzcG0gPSBydGxfcGNpX2VuYWJsZV9hc3BtLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjA2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oCkBAIC0wLDAgKzEsMzUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTF9QQ0lfSF9fCisjZGVmaW5lIF9fUlRMX1BDSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorLyoKKzE6IE1TRFUgcGFja2V0IHF1ZXVlLAorMjogUnggQ29tbWFuZCBRdWV1ZQorKi8KKyNkZWZpbmUgUlRMX1BDSV9SWF9NUERVX1FVRVVFCQkJMAorI2RlZmluZSBSVExfUENJX1JYX0NNRF9RVUVVRQkJCTEKKyNkZWZpbmUgUlRMX1BDSV9NQVhfUlhfUVVFVUUJCQkyCisKKyNkZWZpbmUgUlRMX1BDSV9NQVhfUlhfQ09VTlQJCQk1MTIvLzY0CisjZGVmaW5lIFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UCQk5CisKKyNkZWZpbmUgUlRfVFhERVNDX05VTQkJCQkxMjgKKyNkZWZpbmUgVFhfREVTQ19OVU1fOTJFCQkJCTUxMgorI2RlZmluZSBSVF9UWERFU0NfTlVNX0JFX1FVRVVFCQkJMjU2CisKKyNkZWZpbmUgQktfUVVFVUUJCQkJMAorI2RlZmluZSBCRV9RVUVVRQkJCQkxCisjZGVmaW5lIFZJX1FVRVVFCQkJCTIKKyNkZWZpbmUgVk9fUVVFVUUJCQkJMworI2RlZmluZSBCRUFDT05fUVVFVUUJCQkJNAorI2RlZmluZSBUWENNRF9RVUVVRQkJCQk1CisjZGVmaW5lIE1HTlRfUVVFVUUJCQkJNgorI2RlZmluZSBISUdIX1FVRVVFCQkJCTcKKyNkZWZpbmUgSENDQV9RVUVVRQkJCQk4CisKKyNkZWZpbmUgUlRMX1BDSV9ERVZJQ0UodmVuZCwgZGV2LCBjZmcpICBcCisJLnZlbmRvciA9ICh2ZW5kKSwgXAorCS5kZXZpY2UgPSAoZGV2KSwgXAorCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCBcCisJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsXAorCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkmKGNmZykKKworI2RlZmluZSBJTlRFTF9WRU5ET1JfSUQJCQkJMHg4MDg2CisjZGVmaW5lIFNJU19WRU5ET1JfSUQJCQkJMHgxMDM5CisjZGVmaW5lIEFUSV9WRU5ET1JfSUQJCQkJMHgxMDAyCisjZGVmaW5lIEFUSV9ERVZJQ0VfSUQJCQkJMHg3OTE0CisjZGVmaW5lIEFNRF9WRU5ET1JfSUQJCQkJMHgxMDIyCisKKyNkZWZpbmUgUENJX01BWF9CUklER0VfTlVNQkVSCQkJMjU1CisjZGVmaW5lIFBDSV9NQVhfREVWSUNFUwkJCQkzMgorI2RlZmluZSBQQ0lfTUFYX0ZVTkNUSU9OCQkJOAorCisjZGVmaW5lIFBDSV9DT05GX0FERFJFU1MgICAJMHgwQ0Y4CS8qUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgQWRkcmVzcyAqLworI2RlZmluZSBQQ0lfQ09ORl9EQVRBCQkweDBDRkMJLypQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBEYXRhICovCisKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9ERVYJCTB4MDYKKyNkZWZpbmUgUENJX1NVQkNMQVNTX0JSX1BDSV9UT19QQ0kJMHgwNAorI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9JRF9QQ0lfRVhQUkVTUwkweDEwCisjZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJMHgxMAorCisjZGVmaW5lIFUxRE9OVENBUkUgCQkJMHhGRgorI2RlZmluZSBVMkRPTlRDQVJFIAkJCTB4RkZGRgorI2RlZmluZSBVNERPTlRDQVJFIAkJCTB4RkZGRkZGRkYKKworI2RlZmluZSBSVExfUENJXzgxOTJfRElECTB4ODE5MgkvKjgxOTIgUENJLUUgKi8KKyNkZWZpbmUgUlRMX1BDSV84MTkyU0VfRElECTB4ODE5MgkvKjgxOTIgU0UgKi8KKyNkZWZpbmUgUlRMX1BDSV84MTc0X0RJRAkweDgxNzQJLyo4MTkyIFNFICovCisjZGVmaW5lIFJUTF9QQ0lfODE3M19ESUQJMHg4MTczCS8qODE5MSBTRSBDcmFiICovCisjZGVmaW5lIFJUTF9QQ0lfODE3Ml9ESUQJMHg4MTcyCS8qODE5MSBTRSBSRSAqLworI2RlZmluZSBSVExfUENJXzgxNzFfRElECTB4ODE3MQkvKjgxOTEgU0UgVW5pY3JvbiAqLworI2RlZmluZSBSVExfUENJXzAwNDVfRElECTB4MDA0NQkvKjgxOTAgUENJIGZvciBDZXJhZ2EgKi8KKyNkZWZpbmUgUlRMX1BDSV8wMDQ2X0RJRAkweDAwNDYJLyo4MTkwIENhcmRidXMgZm9yIENlcmFnYSAqLworI2RlZmluZSBSVExfUENJXzAwNDRfRElECTB4MDA0NAkvKjgxOTJlIFBDSUUgZm9yIENlcmFnYSAqLworI2RlZmluZSBSVExfUENJXzAwNDdfRElECTB4MDA0NwkvKjgxOTJlIEV4cHJlc3MgQ2FyZCBmb3IgQ2VyYWdhICovCisjZGVmaW5lIFJUTF9QQ0lfNzAwRl9ESUQJMHg3MDBGCisjZGVmaW5lIFJUTF9QQ0lfNzAxRl9ESUQJMHg3MDFGCisjZGVmaW5lIFJUTF9QQ0lfRExJTktfRElECTB4MzMwNAorI2RlZmluZSBSVExfUENJXzg3MjNBRV9ESUQJMHg4NzIzCS8qODcyM2UgKi8KKyNkZWZpbmUgUlRMX1BDSV84MTkyQ0VUX0RJRAkweDgxOTEJLyo4MTkyY2UgKi8KKyNkZWZpbmUgUlRMX1BDSV84MTkyQ0VfRElECTB4ODE3OAkvKjgxOTJjZSAqLworI2RlZmluZSBSVExfUENJXzgxOTFDRV9ESUQJMHg4MTc3CS8qODE5MmNlICovCisjZGVmaW5lIFJUTF9QQ0lfODE4OENFX0RJRAkweDgxNzYJLyo4MTkyY2UgKi8KKyNkZWZpbmUgUlRMX1BDSV84MTkyQ1VfRElECTB4ODE5MQkvKjgxOTJjZSAqLworI2RlZmluZSBSVExfUENJXzgxOTJERV9ESUQJMHg4MTkzCS8qODE5MmRlICovCisjZGVmaW5lIFJUTF9QQ0lfODE5MkRFX0RJRDIJMHgwMDJCCS8qOTJERSovCisjZGVmaW5lIFJUTF9QQ0lfODE4OEVFX0RJRAkweDgxNzkgIC8qODE4OGVlKi8KKyNkZWZpbmUgUlRMX1BDSV84NzIzQkVfRElECTB4QjcyMyAgLyo4NzIzYmUqLworI2RlZmluZSBSVExfUENJXzgxOTJFRV9ESUQJMHg4MThCCS8qODE5MmVlKi8KKyNkZWZpbmUgUlRMX1BDSV84ODIxQUVfRElECTB4ODgyMQkvKjg4MjFhZSovCisjZGVmaW5lIFJUTF9QQ0lfODgxMkFFX0RJRAkweDg4MTIJLyo4ODEyYWUqLworCisvKjgxOTIgc3VwcG9ydCAxNiBwYWdlcyBvZiBJTyByZWdpc3RlcnMqLworI2RlZmluZSBSVExfTUVNX01BUFBFRF9JT19SQU5HRV84MTkwUENJIAkweDEwMDAKKyNkZWZpbmUgUlRMX01FTV9NQVBQRURfSU9fUkFOR0VfODE5MlBDSUUJMHg0MDAwCisjZGVmaW5lIFJUTF9NRU1fTUFQUEVEX0lPX1JBTkdFXzgxOTJTRQkJMHg0MDAwCisjZGVmaW5lIFJUTF9NRU1fTUFQUEVEX0lPX1JBTkdFXzgxOTJDRQkJMHg0MDAwCisjZGVmaW5lIFJUTF9NRU1fTUFQUEVEX0lPX1JBTkdFXzgxOTJERQkJMHg0MDAwCisKKyNkZWZpbmUgUlRMX1BDSV9SRVZJU0lPTl9JRF84MTkwUENJCQkweDAwCisjZGVmaW5lIFJUTF9QQ0lfUkVWSVNJT05fSURfODE5MlBDSUUJCTB4MDEKKyNkZWZpbmUgUlRMX1BDSV9SRVZJU0lPTl9JRF84MTkyU0UJCTB4MTAKKyNkZWZpbmUgUlRMX1BDSV9SRVZJU0lPTl9JRF84MTkyQ0UJCTB4MQorI2RlZmluZSBSVExfUENJX1JFVklTSU9OX0lEXzgxOTJERQkJMHgwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SRUFMVEVLCQkweDEwZWMKKworI2RlZmluZSBSVExfREVGQVVMVF9IQVJEV0FSRV9UWVBFCUhBUkRXQVJFX1RZUEVfUlRMODE5MkNFCisKK2VudW0gcGNpX2JyaWRnZV92ZW5kb3IgeworCVBDSV9CUklER0VfVkVORE9SX0lOVEVMID0gMHgwLAkvKjBiJzAwMDAsMDAwMSAqLworCVBDSV9CUklER0VfVkVORE9SX0FUSSwJCS8qMGInMDAwMCwwMDEwKi8KKwlQQ0lfQlJJREdFX1ZFTkRPUl9BTUQsCQkvKjBiJzAwMDAsMDEwMCovCisJUENJX0JSSURHRV9WRU5ET1JfU0lTLAkJLyowYicwMDAwLDEwMDAqLworCVBDSV9CUklER0VfVkVORE9SX1VOS05PV04sCS8qMGInMDEwMCwwMDAwKi8KKwlQQ0lfQlJJREdFX1ZFTkRPUl9NQVgsCQorfTsKKworc3RydWN0IHJ0bF9wY2lfY2FwYWJpbGl0aWVzX2hlYWRlciB7CisgICAgdTggY2FwYWJpbGl0eV9pZDsKKyAgICB1OCBuZXh0OworfTsKKworLyogSW4gbmV3IFRSWCBmbG93LCBCdWZmZXJfZGVzYyBpcyBuZXcgY29uY2VwdCAKKyAgKiBCdXQgVFggd2lmaSBpbmZvID09IFRYIGRlc2NyaXB0b3IgaW4gb2xkIGZsb3cKKyAgKiBSWCB3aWZpIGluZm8gPT0gUlggZGVzY3JpcHRvciBpbiBvbGQgZmxvdyAqLworc3RydWN0IHJ0bF90eF9idWZmZXJfZGVzYyB7CisjaWYgKFJUTDgxOTJFRV9TRUdfTlVNID09IDIpCisJdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjhdOyAvL3NlZyA9IDgKKyNlbGlmIChSVEw4MTkyRUVfU0VHX05VTSA9PSAxKQorCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSo0XTsgLy9zZWcgPSA0CisjZWxpZiAoUlRMODE5MkVFX1NFR19OVU0gPT0gMCkKKwl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqMl07IC8vc2VnID0gMgorI2VuZGlmCit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsX3R4X2Rlc2Mgey8qb2xkOiB0eCBkZXNjKi8vKm5ldzogdHggd2lmaSBpbmZvKi8KKwl1MzIgZHdvcmRbMTZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bF9yeF9idWZmZXJfZGVzYyB7IC8qcnggYnVmZmVyIGRlc2MqLworCXUzMiBkd29yZFsyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxfcnhfZGVzYyB7IC8qb2xkOiByeCBkZXNjKi8vKm5ldzogcnggd2lmaSBpbmZvKi8KKwl1MzIgZHdvcmRbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsX3R4X2NtZF9kZXNjIHsKKwl1MzIgZHdvcmRbMTZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bDgxOTJfdHhfcmluZyB7CisJc3RydWN0IHJ0bF90eF9kZXNjICpkZXNjOyAvKnR4IGRlc2MgLyB0eCB3aWZpIGluZm8qLworCWRtYV9hZGRyX3QgZG1hOyAvKnR4IGRlc2MgZG1hIG1lbW9yeSAvIHR4IHdpZmkgaW5mbyBkbWEgbWVtb3J5Ki8KKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBlbnRyaWVzOworCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CisJLyphZGQgZm9yIG5ldyB0cnggZmxvdyovCisJc3RydWN0IHJ0bF90eF9idWZmZXJfZGVzYyAqYnVmZmVyX2Rlc2M7IC8qdHggYnVmZmVyIGRlc2NyaXB0b3IqLworCWRtYV9hZGRyX3QgYnVmZmVyX2Rlc2NfZG1hOyAvKnR4IGJ1ZmZlcmQgZGVzYyBkbWEgbWVtb3J5Ki8KKwl1MTYgYXZsX2Rlc2M7IC8qIGF2YWlsYWJsZV9kZXNjX3RvX3dyaXRlICovCisJdTE2IGN1cl90eF93cDsgLyogY3VycmVudF90eF93cml0ZV9wb2ludCAqLworCXUxNiBjdXJfdHhfcnA7IC8qIGN1cnJlbnRfdHhfcmVhZF9wb2ludCAqLworfTsKKworc3RydWN0IHJ0bDgxOTJfcnhfcmluZyB7CisJc3RydWN0IHJ0bF9yeF9kZXNjICpkZXNjOy8qZm9yIG9sZCB0cnggZmxvdywgbm90IHVlc2QgaW4gbmV3IHRyeCovCisJLypkbWEgbWF0Y2hlcyBlaXRoZXIgJ2Rlc2MnIG9yICdidWZmZXJfZGVzYycqLworCWRtYV9hZGRyX3QgZG1hOworCXVuc2lnbmVkIGludCBpZHg7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X2J1ZltSVExfUENJX01BWF9SWF9DT1VOVF07CisJLyphZGQgZm9yIG5ldyB0cnggZmxvdyovCisJc3RydWN0IHJ0bF9yeF9idWZmZXJfZGVzYyAqYnVmZmVyX2Rlc2M7IC8qcnggYnVmZmVyIGRlc2NyaXB0b3IqLworCXUxNiBuZXh0X3J4X3JwOyAvKiBuZXh0X3J4X3JlYWRfcG9pbnQgKi8KK307CisKK3N0cnVjdCBydGxfcGNpIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlib29sIGlycV9lbmFibGVkOworCisJLypUeCAqLworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgdHhfcmluZ1tSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVF07CisJaW50IHR4cmluZ2NvdW50W1JUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UXTsKKwl1MzIgdHJhbnNtaXRfY29uZmlnOworCisJLypSeCAqLworCXN0cnVjdCBydGw4MTkyX3J4X3JpbmcgcnhfcmluZ1tSVExfUENJX01BWF9SWF9RVUVVRV07CisJaW50IHJ4cmluZ2NvdW50OworCXUxNiByeGJ1ZmZlcnNpemU7CisJdTMyIHJlY2VpdmVfY29uZmlnOworCisJLyppcnEgKi8KKwl1OCBpcnFfYWxsb2M7CisJdTMyIGlycV9tYXNrWzJdOworCXUzMiBzeXNfaXJxX21hc2s7CisKKwkvKkJjbiBjb250cm9sIHJlZ2lzdGVyIHNldHRpbmcgKi8KKwl1MzIgcmVnX2Jjbl9jdHJsX3ZhbDsKKworCSAvKkFTUE0qLyB1OCBjb25zdF9wY2lfYXNwbTsKKwl1OCBjb25zdF9hbWRwY2lfYXNwbTsKKwl1OCBjb25zdF9od3N3X3Jmb2ZmX2QzOworCXU4IGNvbnN0X3N1cHBvcnRfcGNpYXNwbTsKKwkvKnBjaS1lIGJyaWRnZSAqLworCXU4IGNvbnN0X2hvc3RwY2lfYXNwbV9zZXR0aW5nOworCS8qcGNpLWUgZGV2aWNlICovCisJdTggY29uc3RfZGV2aWNlcGNpX2FzcG1fc2V0dGluZzsKKwkvKklmIGl0IHN1cHBvcnRzIEFTUE0sIE9mZnNldFs1NjBoXSA9IDB4NDAsCisJICAgb3RoZXJ3aXNlIE9mZnNldFs1NjBoXSA9IDB4MDAuICovCisJYm9vbCBiX3N1cHBvcnRfYXNwbTsKKwlib29sIGJfc3VwcG9ydF9iYWNrZG9vcjsKKworCS8qUU9TICYgRURDQSAqLworCWVudW0gYWNtX21ldGhvZCBhY21fbWV0aG9kOworCisJdTE2IHNob3J0cmV0cnlfbGltaXQ7CisJdTE2IGxvbmdyZXRyeV9saW1pdDsKKwkKKwkvKiBNU0kgc3VwcG9ydCAqLworCWJvb2wgbXNpX3N1cHBvcnQ7CisJYm9vbCB1c2luZ19tc2k7Cit9OworCitzdHJ1Y3QgbXBfYWRhcHRlciB7CisJdTggbGlua2N0cmxfcmVnOworCisJdTggYnVzbnVtYmVyOworCXU4IGRldm51bWJlcjsKKwl1OCBmdW5jbnVtYmVyOworCisJdTggcGNpYnJpZGdlX2J1c251bTsKKwl1OCBwY2licmlkZ2VfZGV2bnVtOworCXU4IHBjaWJyaWRnZV9mdW5jbnVtOworCisJdTggcGNpYnJpZGdlX3ZlbmRvcjsKKwl1MTYgcGNpYnJpZGdlX3ZlbmRvcmlkOworCXUxNiBwY2licmlkZ2VfZGV2aWNlaWQ7CisKKwl1MzIgcGNpY2ZnX2FkZHJwb3J0OworCXU4IG51bTRieXRlczsKKworCXU4IHBjaWJyaWRnZV9wY2llaGRyX29mZnNldDsKKwl1OCBwY2licmlkZ2VfbGlua2N0cmxyZWc7CisKKwlib29sIGFtZF9sMV9wYXRjaDsKK307CisKK3N0cnVjdCBydGxfcGNpX3ByaXYgeworCXN0cnVjdCBydGxfcGNpIGRldjsKKwlzdHJ1Y3QgbXBfYWRhcHRlciBuZGlzX2FkYXB0ZXI7CisJc3RydWN0IHJ0bF9sZWRfY3RsIGxlZGN0bDsKKwlzdHJ1Y3QgYnRfY29leGlzdF9pbmZvIGJ0Y29leGlzdDsKK307CisKKyNkZWZpbmUgcnRsX3BjaXByaXYoaHcpCQkoKChzdHJ1Y3QgcnRsX3BjaV9wcml2ICopKHJ0bF9wcml2KGh3KSktPnByaXYpKQorI2RlZmluZSBydGxfcGNpZGV2KHBjaXByaXYpCSgmKChwY2lwcml2KS0+ZGV2KSkKKworaW50IHJ0bF9wY2lfcmVzZXRfdHJ4X3Jpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCitleHRlcm4gc3RydWN0IHJ0bF9pbnRmX29wcyBydGxfcGNpX29wczsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw4LDApKQoraW50IHJ0bF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworI2Vsc2UKK2ludCBfX2RldmluaXQgcnRsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworI2VuZGlmCit2b2lkIHJ0bF9wY2lfZGlzY29ubmVjdChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitpbnQgcnRsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgcnRsX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RhdGljIGlubGluZSB1OCBwY2lfcmVhZDhfc3luYyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKQoreworCXJldHVybiAweGZmICYgcmVhZGIoKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBwY2lfcmVhZDE2X3N5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwY2lfcmVhZDMyX3N5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3dyaXRlOF9hc3luYyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1OCB2YWwpCit7CisJd3JpdGViKHZhbCwgKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3dyaXRlMTZfYXN5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgICAgdTMyIGFkZHIsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3dyaXRlMzJfYXN5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgICAgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgKHU4IF9faW9tZW0gKikgcnRscHJpdi0+aW8ucGNpX21lbV9zdGFydCArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91bG9uZyh1MzIgcG9ydCwgdTMyIHZhbCkKK3sKKwlvdXRsKHZhbCwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxfcGNpX3Jhd193cml0ZV9wb3J0X3VjaGFyKHUzMiBwb3J0LCB1OCB2YWwpCit7CisJb3V0Yih2YWwsIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3BjaV9yYXdfcmVhZF9wb3J0X3VjaGFyKHUzMiBwb3J0LCB1OCAqIHB2YWwpCit7CisJKnB2YWwgPSBpbmIocG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxfcGNpX3Jhd19yZWFkX3BvcnRfdXNob3J0KHUzMiBwb3J0LCB1MTYgKiBwdmFsKQoreworCSpwdmFsID0gaW53KHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3BjaV9yYXdfcmVhZF9wb3J0X3Vsb25nKHUzMiBwb3J0LCB1MzIgKiBwdmFsKQoreworCSpwdmFsID0gaW5sKHBvcnQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJmZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wcy5jCkBAIC0wLDAgKzEsMTAyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ3aWZpLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorI2luY2x1ZGUgInBzLmgiCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDIsMCkpCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJidGNvZXhpc3QvcnRsX2J0Yy5oIgorCitib29sIHJ0bF9wc19lbmFibGVfbmljKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCWJvb2wgaW5pdF9zdGF0dXMgPSB0cnVlOworCisJLyo8MT4gcmVzZXQgdHJ4IHJpbmcgKi8KKwlpZiAocnRsaGFsLT5pbnRlcmZhY2UgPT0gSU5URl9QQ0kpCisJCXJ0bHByaXYtPmludGZfb3BzLT5yZXNldF90cnhfcmluZyhodyk7CisKKwlpZiAoaXNfaGFsX3N0b3AocnRsaGFsKSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLCAoIkRyaXZlciBpcyBhbHJlYWR5IGRvd24hXG4iKSk7CisKKwkvKjwyPiBFbmFibGUgQWRhcHRlciAqLworCXJ0bHByaXYtPmNmZy0+b3BzLT5od19pbml0KGh3KTsKKwlSVF9DTEVBUl9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQyk7CisJLyppbml0X3N0YXR1cyA9IGZhbHNlOyAqLworCisJLyo8Mz4gRW5hYmxlIEludGVycnVwdCAqLworCXJ0bHByaXYtPmNmZy0+b3BzLT5lbmFibGVfaW50ZXJydXB0KGh3KTsKKworCS8qPGVuYWJsZSB0aW1lcj4gKi8KKwlydGxfd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKCh1bnNpZ25lZCBsb25nKWh3KTsKKworCXJldHVybiBpbml0X3N0YXR1czsKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfcHNfZW5hYmxlX25pYyk7CisKK2Jvb2wgcnRsX3BzX2Rpc2FibGVfbmljKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCWJvb2wgc3RhdHVzID0gdHJ1ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwkvKjwxPiBTdG9wIGFsbCB0aW1lciAqLworCXJ0bF9kZWluaXRfZGVmZXJyZWRfd29yayhodyk7CisKKwkvKjwyPiBEaXNhYmxlIEludGVycnVwdCAqLworCXJ0bHByaXYtPmNmZy0+b3BzLT5kaXNhYmxlX2ludGVycnVwdChodyk7CisKKwkvKjwzPiBEaXNhYmxlIEFkYXB0ZXIgKi8KKwlydGxwcml2LT5jZmctPm9wcy0+aHdfZGlzYWJsZShodyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9wc19kaXNhYmxlX25pYyk7CisKK2Jvb2wgcnRsX3BzX3NldF9yZl9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSBlbnVtIHJmX3B3cnN0YXRlIHN0YXRlX3Rvc2V0LAorCQkJIHUzMiBjaGFuZ2Vzb3VyY2UsIGJvb2wgcHJvdGVjdF9vcl9ub3QpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCWVudW0gcmZfcHdyc3RhdGUgcnRzdGF0ZTsKKwlib29sIGJfYWN0aW9uYWxsb3dlZCA9IGZhbHNlOworCXUxNiByZndhaXRfY250ID0gMDsKKworCS8qcHJvdGVjdF9vcl9ub3QgPSB0cnVlOyAqLworCisJaWYgKHByb3RlY3Rfb3Jfbm90KQorCQlnb3RvIG5vX3Byb3RlY3Q7CisKKwkvKgorCSAqT25seSBvbmUgdGhyZWFkIGNhbiBjaGFuZ2UKKwkgKnRoZSBSRiBzdGF0ZSBhdCBvbmUgdGltZSwgYW5kIG90aGVycworCSAqc2hvdWxkIHdhaXQgdG8gYmUgZXhlY3V0ZWQuCisJICovCisJd2hpbGUgKHRydWUpIHsKKwkJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwkJaWYgKHBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKKwkJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJCSAoIlJGIENoYW5nZSBpbiBwcm9ncmVzcyEiCisJCQkJICAiV2FpdCB0byBzZXQuLnN0YXRlX3Rvc2V0KCVkKS5cbiIsCisJCQkJICBzdGF0ZV90b3NldCkpOworCisJCQkvKiBTZXQgUkYgYWZ0ZXIgdGhlIHByZXZpb3VzIGFjdGlvbiBpcyBkb25lLiAgKi8KKwkJCXdoaWxlIChwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzKSB7CisJCQkJcmZ3YWl0X2NudCsrOworCQkJCW1kZWxheSgxKTsKKwkJCQkvKgorCQkJCSAqV2FpdCB0b28gbG9uZywgcmV0dXJuIGZhbHNlIHRvIGF2b2lkCisJCQkJICp0byBiZSBzdHVjayBoZXJlLgorCQkJCSAqLworCQkJCWlmIChyZndhaXRfY250ID4gMTAwKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitub19wcm90ZWN0OgorCXJ0c3RhdGUgPSBwcHNjLT5yZnB3cl9zdGF0ZTsKKworCXN3aXRjaCAoc3RhdGVfdG9zZXQpIHsKKwljYXNlIEVSRk9OOgorCQlwcHNjLT5yZm9mZl9yZWFzb24gJj0gKH5jaGFuZ2Vzb3VyY2UpOworCisJCWlmICgoY2hhbmdlc291cmNlID09IFJGX0NIQU5HRV9CWV9IVykgJiYKKwkJICAgIChwcHNjLT5iX2h3cmFkaW9vZmYgPT0gdHJ1ZSkpIHsKKwkJCXBwc2MtPmJfaHdyYWRpb29mZiA9IGZhbHNlOworCQl9CisKKwkJaWYgKCFwcHNjLT5yZm9mZl9yZWFzb24pIHsKKwkJCXBwc2MtPnJmb2ZmX3JlYXNvbiA9IDA7CisJCQliX2FjdGlvbmFsbG93ZWQgPSB0cnVlOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIEVSRk9GRjoKKworCQlpZiAoKGNoYW5nZXNvdXJjZSA9PSBSRl9DSEFOR0VfQllfSFcpICYmCisJCSAgICAocHBzYy0+Yl9od3JhZGlvb2ZmID09IGZhbHNlKSkgeworCQkJcHBzYy0+Yl9od3JhZGlvb2ZmID0gdHJ1ZTsKKwkJfQorCisJCXBwc2MtPnJmb2ZmX3JlYXNvbiB8PSBjaGFuZ2Vzb3VyY2U7CisJCWJfYWN0aW9uYWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBFUkZTTEVFUDoKKwkJcHBzYy0+cmZvZmZfcmVhc29uIHw9IGNoYW5nZXNvdXJjZTsKKwkJYl9hY3Rpb25hbGxvd2VkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVhazsKKwl9CisKKwlpZiAoYl9hY3Rpb25hbGxvd2VkKQorCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X3JmX3Bvd2VyX3N0YXRlKGh3LCBzdGF0ZV90b3NldCk7CisKKwlpZiAoIXByb3RlY3Rfb3Jfbm90KSB7CisJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCX0KKworCXJldHVybiBiX2FjdGlvbmFsbG93ZWQ7Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX3BzX3NldF9yZl9zdGF0ZSk7CisKK3N0YXRpYyB2b2lkIF9ydGxfcHNfaW5hY3RpdmVfcHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisKKwlwcHNjLT5iX3N3cmZfcHJvY2Vzc2luZyA9IHRydWU7CisKKwlpZiAocHBzYy0+aW5hY3RpdmVfcHdyc3RhdGUgPT0gRVJGT04gJiYgcnRsaGFsLT5pbnRlcmZhY2UgPT0gSU5URl9QQ0kpIHsKKwkJaWYgKChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX09GRl9MRVZMX0FTUE0pICYmCisJCSAgICBSVF9JTl9QU19MRVZFTChwcHNjLCBSVF9QU19MRVZFTF9BU1BNKSAmJgorCQkgICAgcnRsaGFsLT5pbnRlcmZhY2UgPT0gSU5URl9QQ0kpIHsKKwkJCXJ0bHByaXYtPmludGZfb3BzLT5kaXNhYmxlX2FzcG0oaHcpOworCQkJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSk7CisJCX0KKwl9CisKKwlpZiAocnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9idGNfc3RhdHVzKCkpeworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX29wcy0+YnRjX2lwc19ub3RpZnkocnRscHJpdiwKKwkJCQkJCXBwc2MtPmluYWN0aXZlX3B3cnN0YXRlKTsKKwl9CisJcnRsX3BzX3NldF9yZl9zdGF0ZShodywgcHBzYy0+aW5hY3RpdmVfcHdyc3RhdGUsCisJCQkgICAgUkZfQ0hBTkdFX0JZX0lQUywgZmFsc2UpOworCisJaWYgKHBwc2MtPmluYWN0aXZlX3B3cnN0YXRlID09IEVSRk9GRiAmJgorCSAgICBydGxoYWwtPmludGVyZmFjZSA9PSBJTlRGX1BDSSkgeworCQlpZiAocHBzYy0+cmVnX3JmcHNfbGV2ZWwgJiBSVF9SRl9PRkZfTEVWTF9BU1BNICYmCisJCSAgICAhUlRfSU5fUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSkpIHsKKwkJCXJ0bHByaXYtPmludGZfb3BzLT5lbmFibGVfYXNwbShodyk7CisJCQlSVF9TRVRfUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSk7CisJCX0KKwl9CisKKwlwcHNjLT5iX3N3cmZfcHJvY2Vzc2luZyA9IGZhbHNlOworfQorCit2b2lkIHJ0bF9pcHNfbmljX29mZl93cV9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGxfd29ya3MgKnJ0bHdvcmtzID0KKwkgICAgY29udGFpbmVyX29mX2R3b3JrX3J0bChkYXRhLCBzdHJ1Y3QgcnRsX3dvcmtzLCBpcHNfbmljX29mZl93cSk7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBydGx3b3Jrcy0+aHc7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwllbnVtIHJmX3B3cnN0YXRlIHJ0c3RhdGU7CisKKwlpZiAobWFjLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsICgibm90IHN0YXRpb24gcmV0dXJuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWFjLT5wMnBfaW5fdXNlKQorCQlyZXR1cm47CisKKwlpZiAobWFjLT5saW5rX3N0YXRlID4gTUFDODAyMTFfTk9MSU5LKQorCQlyZXR1cm47CisKKwlpZiAoaXNfaGFsX3N0b3AocnRsaGFsKSkKKwkJcmV0dXJuOworCisJaWYgKHJ0bHByaXYtPnNlYy5iZWluZ19zZXRrZXkpCisJCXJldHVybjsKKworCWlmKHJ0bHByaXYtPmNmZy0+b3BzLT5idF90dXJuX29mZl9idF9jb2V4aXN0X2JlZm9yZV9lbnRlcl9scHMpCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5idF90dXJuX29mZl9idF9jb2V4aXN0X2JlZm9yZV9lbnRlcl9scHMoaHcpOworCisJaWYgKHBwc2MtPmJfaW5hY3RpdmVwcykgeworCQlydHN0YXRlID0gcHBzYy0+cmZwd3Jfc3RhdGU7CisKKwkJLyoKKwkJICpEbyBub3QgZW50ZXIgSVBTIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKwkJICooMSkgUkYgaXMgYWxyZWFkeSBPRkYgb3IgU2xlZXAKKwkJICooMikgYl9zd3JmX3Byb2Nlc3NpbmcgKGluZGljYXRlcyB0aGUgSVBTIGlzIHN0aWxsIHVuZGVyIGdvaW5nKQorCQkgKigzKSBDb25uZWN0dGVkIChvbmx5IGRpc2Nvbm5lY3RlZCBjYW4gdHJpZ2dlciBJUFMpCisJCSAqKDQpIElCU1MgKHNlbmQgQmVhY29uKQorCQkgKig1KSBBUCBtb2RlIChzZW5kIEJlYWNvbikKKwkJICooNikgbW9uaXRvciBtb2RlIChyY3YgcGFja2V0KQorCQkgKi8KKworCQlpZiAocnRzdGF0ZSA9PSBFUkZPTiAmJgorCQkgICAgIXBwc2MtPmJfc3dyZl9wcm9jZXNzaW5nICYmCisJCSAgICAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX05PTElOSykgJiYKKwkJICAgICFtYWMtPmFjdF9zY2FubmluZykgeworCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsCisJCQkJICgiSVBTRW50ZXIoKTogVHVybiBvZmYgUkYuXG4iKSk7CisKKwkJCXBwc2MtPmluYWN0aXZlX3B3cnN0YXRlID0gRVJGT0ZGOworCQkJcHBzYy0+Yl9pbl9wb3dlcnNhdmVtb2RlID0gdHJ1ZTsKKworCQkJLypydGxfcGNpX3Jlc2V0X3RyeF9yaW5nKGh3KTsgKi8KKwkJCV9ydGxfcHNfaW5hY3RpdmVfcHMoaHcpOworCQl9CisJfQorfQorCit2b2lkIHJ0bF9pcHNfbmljX29mZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwkvKgorCSAqYmVjYXVzZSB3aGVuIGxpbmsgd2l0aCBhcCwgbWFjODAyMTEgd2lsbCBhc2sgdXMKKwkgKnRvIGRpc2FibGUgbmljIHF1aWNrbHkgYWZ0ZXIgc2NhbiBiZWZvcmUgbGlua2luZywKKwkgKnRoaXMgd2lsbCBjYXVzZSBsaW5rIGZhaWxlZCwgc28gd2UgZGVsYXkgMTAwbXMgaGVyZQorCSAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhydGxwcml2LT53b3Jrcy5ydGxfd3EsCisJCQkgICAmcnRscHJpdi0+d29ya3MuaXBzX25pY19vZmZfd3EsIE1TRUNTKDEwMCkpOworfQorCisvKiBOT1RJQ0U6IGFueSBvcG1vZGUgc2hvdWxkIGV4YyBuaWNfb24sIG9yIGRpc2FibGUgd2l0aG91dAorICogbmljX29uIG1heSBzb21ldGhpbmcgd3JvbmcsIGxpa2UgYWRob2MgVFAqLwordm9pZCBydGxfaXBzX25pY19vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJZW51bSByZl9wd3JzdGF0ZSBydHN0YXRlOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnRscHJpdi0+d29ya3MuaXBzX25pY19vZmZfd3EpOworCisJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jayk7CisJaWYgKHBwc2MtPmJfaW5hY3RpdmVwcykgeworCQlydHN0YXRlID0gcHBzYy0+cmZwd3Jfc3RhdGU7CisKKwkJaWYgKHJ0c3RhdGUgIT0gRVJGT04gJiYKKwkJICAgICFwcHNjLT5iX3N3cmZfcHJvY2Vzc2luZyAmJgorCQkgICAgcHBzYy0+cmZvZmZfcmVhc29uIDw9IFJGX0NIQU5HRV9CWV9JUFMpIHsKKworCQkJcHBzYy0+aW5hY3RpdmVfcHdyc3RhdGUgPSBFUkZPTjsKKwkJCXBwc2MtPmJfaW5fcG93ZXJzYXZlbW9kZSA9IGZhbHNlOworCQkJX3J0bF9wc19pbmFjdGl2ZV9wcyhodyk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmlwc19sb2NrKTsKK30KKworLypmb3IgRlcgTFBTKi8KKworLyoKKyAqRGV0ZXJtaW5lIGlmIHdlIGNhbiBzZXQgRncgaW50byBQUyBtb2RlCisgKmluIGN1cnJlbnQgY29uZGl0aW9uLlJldHVybiB0cnVlIGlmIGl0CisgKmNhbiBlbnRlciBQUyBtb2RlLgorICovCitzdGF0aWMgYm9vbCBydGxfZ2V0X2Z3bHBzX2RvemUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJdTMyIHBzX3RpbWVkaWZmOworCisJcHNfdGltZWRpZmYgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQorCQkJCSAgICAgICBwcHNjLT5sYXN0X2RlbGF5bHBzX3N0YW1wX2ppZmZpZXMpOworCisJaWYgKHBzX3RpbWVkaWZmIDwgMjAwMCkgeworCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwKKwkJCSAoIkRlbGF5IGVudGVyIEZ3IExQUyBmb3IgREhDUCwgQVJQLCIKKwkJCSAgIiBvciBFQVBPTCBleGNoYW5naW5nIHN0YXRlLlxuIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKG1hYy0+bGlua19zdGF0ZSAhPSBNQUM4MDIxMV9MSU5LRUQpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIENoYW5nZSBjdXJyZW50IGFuZCBkZWZhdWx0IHByZWFtYmxlIG1vZGUuKi8KK3ZvaWQgcnRsX2xwc19zZXRfcHNtb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBydF9wc21vZGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBlbnRlcl9md2xwczsKKworCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmV0dXJuOworCisJaWYgKG1hYy0+bGlua19zdGF0ZSAhPSBNQUM4MDIxMV9MSU5LRUQpCisJCXJldHVybjsKKworCWlmIChwcHNjLT5kb3QxMV9wc21vZGUgPT0gcnRfcHNtb2RlKQorCQlyZXR1cm47CisKKwkvKiBVcGRhdGUgcG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuICovCisJcHBzYy0+ZG90MTFfcHNtb2RlID0gcnRfcHNtb2RlOworCisJLyoKKwkgKjxGVyBjb250cm9sIExQUz4KKwkgKjEuIEVudGVyIFBTIG1vZGUKKwkgKiAgIFNldCBSUFdNIHRvIEZ3IHRvIHR1cm4gUkYgb2ZmIGFuZCBzZW5kIEgyQyBmd19wd3Jtb2RlCisJICogICBjbWQgdG8gc2V0IEZ3IGludG8gUFMgbW9kZS4KKwkgKjIuIExlYXZlIFBTIG1vZGUKKwkgKiAgIFNlbmQgSDJDIGZ3X3B3cm1vZGUgY21kIHRvIEZ3IHRvIHNldCBGdyBpbnRvIEFjdGl2ZQorCSAqICAgbW9kZSBhbmQgc2V0IFJQV00gdG8gdHVybiBSRiBvbi4KKwkgKi8KKworCWlmICgocHBzYy0+Yl9md2N0cmxfbHBzKSAmJiBwcHNjLT5yZXBvcnRfbGlua2VkKSB7CisJCWlmIChwcHNjLT5kb3QxMV9wc21vZGUgPT0gRUFDVElWRSkgeworCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCSAoIkZXIExQUyBsZWF2ZSBwc19tb2RlOiV4XG4iLAorCQkJCSAgRldfUFNfQUNUSVZFX01PREUpKTsKKwkJCWVudGVyX2Z3bHBzID0gZmFsc2U7CisJCQlwcHNjLT5wd3JfbW9kZSA9IEZXX1BTX0FDVElWRV9NT0RFOworCQkJcHBzYy0+c21hcnRfcHMgPSAwOworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9GV19MUFNfQUNUSU9OLAorCQkJCQkJICAgICAgKHU4ICopKCZlbnRlcl9md2xwcykpOworCQkJaWYgKHBwc2MtPnAycF9wc19pbmZvLm9wcF9wcykKKwkJCQlydGxfcDJwX3BzX2NtZChodyxQMlBfUFNfRU5BQkxFKTsKKworCQl9IGVsc2UgeworCQkJaWYgKHJ0bF9nZXRfZndscHNfZG96ZShodykpIHsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfRE1FU0csCisJCQkJCSAoIkZXIExQUyBlbnRlciBwc19tb2RlOiV4XG4iLAorCQkJCQkgcHBzYy0+ZndjdHJsX3BzbW9kZSkpOworCQkJCWVudGVyX2Z3bHBzID0gdHJ1ZTsKKwkJCQlwcHNjLT5wd3JfbW9kZSA9IHBwc2MtPmZ3Y3RybF9wc21vZGU7CisJCQkJcHBzYy0+c21hcnRfcHMgPSAyOworCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LAorCQkJCQkJCUhXX1ZBUl9GV19MUFNfQUNUSU9OLAorCQkJCQkJCSh1OCAqKSgmZW50ZXJfZndscHMpKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXNldCB0aGUgcG93ZXIgc2F2ZSByZWxhdGVkIHBhcmFtZXRlcnMuICovCisJCQkJcHBzYy0+ZG90MTFfcHNtb2RlID0gRUFDVElWRTsKKwkJCX0KKwkJfQorCX0KK30KKworLypFbnRlciB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuKi8KK3ZvaWQgcnRsX2xwc19lbnRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisKKwlpZiAoIXBwc2MtPmJfZndjdHJsX2xwcykKKwkJcmV0dXJuOworCisJaWYgKHJ0bHByaXYtPnNlYy5iZWluZ19zZXRrZXkpCisJCXJldHVybjsKKworCWlmIChydGxwcml2LT5saW5rX2luZm8uYl9idXN5dHJhZmZpYykKKwkJcmV0dXJuOworCisJLypzbGVlcCBhZnRlciBsaW5rZWQgMTBzLCB0byBsZXQgREhDUCBhbmQgNC13YXkgaGFuZHNoYWtlIG9rIGVub3VnaCEhICovCisJaWYgKG1hYy0+Y250X2FmdGVyX2xpbmtlZCA8IDUpCisJCXJldHVybjsKKworCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmV0dXJuOworCisJaWYgKG1hYy0+bGlua19zdGF0ZSAhPSBNQUM4MDIxMV9MSU5LRUQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisKKwkvKiBJZGxlIGZvciBhIHdoaWxlIGlmIHdlIGNvbm5lY3QgdG8gQVAgYSB3aGlsZSBhZ28uICovCisJaWYgKG1hYy0+Y250X2FmdGVyX2xpbmtlZCA+PSAyKSB7CisJCWlmIChwcHNjLT5kb3QxMV9wc21vZGUgPT0gRUFDVElWRSkgeworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkJICgiRW50ZXIgODAyLjExIHBvd2VyIHNhdmUgbW9kZS4uLlxuIikpOworCisJCQlydGxfbHBzX3NldF9wc21vZGUoaHcsIEVBVVRPUFMpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworfQorCisvKkxlYXZlIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4qLwordm9pZCBydGxfbHBzX2xlYXZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisKKwlpZiAocHBzYy0+Yl9md2N0cmxfbHBzKSB7CisJCWlmIChwcHNjLT5kb3QxMV9wc21vZGUgIT0gRUFDVElWRSkgeworCisJCQkvKkZJWCBNRSAqLworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmVuYWJsZV9pbnRlcnJ1cHQoaHcpOworCisJCQlpZiAocHBzYy0+cmVnX3JmcHNfbGV2ZWwgJiBSVF9SRl9MUFNfTEVWRUxfQVNQTSAmJgorCQkJICAgIFJUX0lOX1BTX0xFVkVMKHBwc2MsIFJUX1BTX0xFVkVMX0FTUE0pICYmCisJCQkgICAgcnRsaGFsLT5pbnRlcmZhY2UgPT0gSU5URl9QQ0kpIHsKKwkJCQlydGxwcml2LT5pbnRmX29wcy0+ZGlzYWJsZV9hc3BtKGh3KTsKKwkJCQlSVF9DTEVBUl9QU19MRVZFTChwcHNjLCBSVF9QU19MRVZFTF9BU1BNKTsKKwkJCX0KKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkJICgiQnVzeSBUcmFmZmljLExlYXZlIDgwMi4xMSBwb3dlciBzYXZlLi5cbiIpKTsKKworCQkJcnRsX2xwc19zZXRfcHNtb2RlKGh3LCBFQUNUSVZFKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7Cit9CisKKy8qIEZvciBzdyBMUFMqLwordm9pZCBydGxfc3dscHNfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdGltX2llICp0aW1faWU7CisJdTggKnRpbTsKKwl1OCB0aW1fbGVuOworCWJvb2wgdV9idWZmZWQ7CisJYm9vbCBtX2J1ZmZlZDsKKworCWlmIChtYWMtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlyZXR1cm47CisKKwlpZiAoIXJ0bHByaXYtPnBzYy5iX3N3Y3RybF9scHMpCisJCXJldHVybjsKKworCWlmIChydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlICE9IE1BQzgwMjExX0xJTktFRCkKKwkJcmV0dXJuOworCisJaWYgKCFydGxwcml2LT5wc2Muc3dfcHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKHJ0bHByaXYtPnBzYy5iX2Z3Y3RybF9scHMpCisJCXJldHVybjsKKworCWlmIChsaWtlbHkoIShody0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKSkpCisJCXJldHVybjsKKworCS8qIGNoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgYmVhY29uICovCisJaWYgKCFpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXJldHVybjsKKworCS8qIG1pbi4gYmVhY29uIGxlbmd0aCArIEZDU19MRU4gKi8KKwlpZiAobGVuIDw9IDQwICsgRkNTX0xFTikKKwkJcmV0dXJuOworCisJLyogYW5kIG9ubHkgYmVhY29ucyBmcm9tIHRoZSBhc3NvY2lhdGVkIEJTU0lELCBwbGVhc2UgKi8KKwlpZiAoZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIzLCBydGxwcml2LT5tYWM4MDIxMS5ic3NpZCkpCisJCXJldHVybjsKKworCXJ0bHByaXYtPnBzYy5sYXN0X2JlYWNvbiA9IGppZmZpZXM7CisKKwl0aW0gPSBydGxfZmluZF9pZShkYXRhLCBsZW4gLSBGQ1NfTEVOLCBXTEFOX0VJRF9USU0pOworCWlmICghdGltKQorCQlyZXR1cm47CisKKwlpZiAodGltWzFdIDwgc2l6ZW9mKCp0aW1faWUpKQorCQlyZXR1cm47CisKKwl0aW1fbGVuID0gdGltWzFdOworCXRpbV9pZSA9IChzdHJ1Y3QgaWVlZTgwMjExX3RpbV9pZSAqKSAmdGltWzJdOworCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzUpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlpZiAoIVdBUk5fT05fT05DRSghaHctPmNvbmYucHNfZHRpbV9wZXJpb2QpKQorCQlydGxwcml2LT5wc2MuZHRpbV9jb3VudGVyID0gdGltX2llLT5kdGltX2NvdW50OworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2Vsc2UKKwlpZiAoIVdBUk5fT05fT05DRSghbWFjLT52aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kKSkKKwkJcnRscHJpdi0+cHNjLmR0aW1fY291bnRlciA9IHRpbV9pZS0+ZHRpbV9jb3VudDsKKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKworCS8qIENoZWNrIHdoZW5ldmVyIHRoZSBQSFkgY2FuIGJlIHR1cm5lZCBvZmYgYWdhaW4uICovCisKKwkvKiAxLiBXaGF0IGFib3V0IGJ1ZmZlcmVkIHVuaWNhc3QgdHJhZmZpYyBmb3Igb3VyIEFJRD8gKi8KKwl1X2J1ZmZlZCA9IGllZWU4MDIxMV9jaGVja190aW0odGltX2llLCB0aW1fbGVuLAorCQkJCSAgICAgICBydGxwcml2LT5tYWM4MDIxMS5hc3NvY19pZCk7CisKKwkvKiAyLiBNYXliZSB0aGUgQVAgd2FudHMgdG8gc2VuZCBtdWx0aWNhc3QvYnJvYWRjYXN0IGRhdGE/ICovCisJbV9idWZmZWQgPSB0aW1faWUtPmJpdG1hcF9jdHJsICYgMHgwMTsKKwlydGxwcml2LT5wc2MubXVsdGlfYnVmZmVyZWQgPSBtX2J1ZmZlZDsKKworCS8qIHVuaWNhc3Qgd2lsbCBwcm9jZXNzIGJ5IG1hYzgwMjExIHRocm91Z2gKKwkgKiBzZXQgfklFRUU4MDIxMV9DT05GX1BTLCBTbyB3ZSBqdXN0IGNoZWNrCisJICogbXVsdGljYXN0IGZyYW1lcyBoZXJlICovCisJaWYgKCFtX2J1ZmZlZCApIHsvLyYmKSB7Ly8gIXJ0bHByaXYtPnBzYy50eF9kb2luZykgeworCQkvKiBiYWNrIHRvIGxvdy1wb3dlciBsYW5kLiBhbmQgZGVsYXkgaXMKKwkJICogcHJldmVudCBudWxsIHBvd2VyIHNhdmUgZnJhbWUgdHggZmFpbCAqLworCQlxdWV1ZV9kZWxheWVkX3dvcmsocnRscHJpdi0+d29ya3MucnRsX3dxLAorCQkJCSAgICZydGxwcml2LT53b3Jrcy5wc193b3JrLCBNU0VDUyg1KSk7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0RNRVNHLAorCQkJICgidV9idWZmZXJkOiAleCwgbV9idWZmZXJlZDogJXhcbiIsCisJCQkgIHVfYnVmZmVkLCBtX2J1ZmZlZCkpOworCX0KK30KKwordm9pZCBydGxfc3dscHNfcmZfYXdha2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJaWYgKCFydGxwcml2LT5wc2MuYl9zd2N0cmxfbHBzKQorCQlyZXR1cm47CisJaWYgKG1hYy0+bGlua19zdGF0ZSAhPSBNQUM4MDIxMV9MSU5LRUQpCisJCXJldHVybjsKKworCWlmIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX0xQU19MRVZFTF9BU1BNICYmCisJICAgIFJUX0lOX1BTX0xFVkVMKHBwc2MsIFJUX1BTX0xFVkVMX0FTUE0pKSB7CisJCXJ0bHByaXYtPmludGZfb3BzLT5kaXNhYmxlX2FzcG0oaHcpOworCQlSVF9DTEVBUl9QU19MRVZFTChwcHNjLCBSVF9QU19MRVZFTF9BU1BNKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworCXJ0bF9wc19zZXRfcmZfc3RhdGUoaHcsIEVSRk9OLCBSRl9DSEFOR0VfQllfUFMsIGZhbHNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7Cit9CisKK3ZvaWQgcnRsX3N3bHBzX3Jmb25fd3FfY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3dvcmtzICpydGx3b3JrcyA9CisJICAgIGNvbnRhaW5lcl9vZl9kd29ya19ydGwoZGF0YSwgc3RydWN0IHJ0bF93b3JrcywgcHNfcmZvbl93cSk7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBydGx3b3Jrcy0+aHc7CisKKwlydGxfc3dscHNfcmZfYXdha2UoaHcpOworfQorCit2b2lkIHJ0bF9zd2xwc19yZl9zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJdTggc2xlZXBfaW50djsKKworCWlmICghcnRscHJpdi0+cHNjLnN3X3BzX2VuYWJsZWQpCisJCXJldHVybjsKKworCWlmICgocnRscHJpdi0+c2VjLmJlaW5nX3NldGtleSkgfHwKKwkgICAgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSkKKwkJcmV0dXJuOworCisJLypzbGVlcCBhZnRlciBsaW5rZWQgMTBzLCB0byBsZXQgREhDUCBhbmQgNC13YXkgaGFuZHNoYWtlIG9rIGVub3VnaCEhICovCisJaWYgKChtYWMtPmxpbmtfc3RhdGUgIT0gTUFDODAyMTFfTElOS0VEKSB8fCAobWFjLT5jbnRfYWZ0ZXJfbGlua2VkIDwgNSkpCisJCXJldHVybjsKKworCWlmIChydGxwcml2LT5saW5rX2luZm8uYl9idXN5dHJhZmZpYykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwlpZiAocnRscHJpdi0+cHNjLnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKKwkJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisJcnRsX3BzX3NldF9yZl9zdGF0ZShodywgRVJGU0xFRVAsIFJGX0NIQU5HRV9CWV9QUyxmYWxzZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworCisJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfT0ZGX0xFVkxfQVNQTSAmJgorCSAgICAhUlRfSU5fUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSkpIHsKKwkJcnRscHJpdi0+aW50Zl9vcHMtPmVuYWJsZV9hc3BtKGh3KTsKKwkJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1BTX0xFVkVMX0FTUE0pOworCX0KKworCS8qIGhlcmUgaXMgcG93ZXIgc2F2ZSBhbGcsIHdoZW4gdGhpcyBiZWFjb24gaXMgRFRJTQorCSAqIHdlIHdpbGwgc2V0IHNsZWVwIHRpbWUgdG8gZHRpbV9wZXJpb2QgKiBuOworCSAqIHdoZW4gdGhpcyBiZWFjb24gaXMgbm90IERUSU0sIHdlIHdpbGwgc2V0IHNsZWVwCisJICogdGltZSB0byBzbGVlcF9pbnR2ID0gcnRscHJpdi0+cHNjLmR0aW1fY291bnRlciBvcgorCSAqIE1BWF9TV19MUFNfU0xFRVBfSU5UVihkZWZhdWx0IHNldCB0byA1KSAqLworCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzUpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlpZiAocnRscHJpdi0+cHNjLmR0aW1fY291bnRlciA9PSAwKSB7CisJCWlmIChody0+Y29uZi5wc19kdGltX3BlcmlvZCA9PSAxKQorCQkJc2xlZXBfaW50diA9IGh3LT5jb25mLnBzX2R0aW1fcGVyaW9kICogMjsKKwkJZWxzZQorCQkJc2xlZXBfaW50diA9IGh3LT5jb25mLnBzX2R0aW1fcGVyaW9kOworCX0gZWxzZSB7CisJCXNsZWVwX2ludHYgPSBydGxwcml2LT5wc2MuZHRpbV9jb3VudGVyOworCX0KKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbHNlCisJaWYgKHJ0bHByaXYtPnBzYy5kdGltX2NvdW50ZXIgPT0gMCkgeworCQlpZiAobWFjLT52aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kID09IDEpCisJCQlzbGVlcF9pbnR2ID0gbWFjLT52aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kICogMjsKKwkJZWxzZQorCQkJc2xlZXBfaW50diA9IG1hYy0+dmlmLT5ic3NfY29uZi5kdGltX3BlcmlvZDsKKwl9IGVsc2UgeworCQlzbGVlcF9pbnR2ID0gcnRscHJpdi0+cHNjLmR0aW1fY291bnRlcjsKKwl9CisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisKKwlpZiAoc2xlZXBfaW50diA+IE1BWF9TV19MUFNfU0xFRVBfSU5UVikKKwkJc2xlZXBfaW50diA9IE1BWF9TV19MUFNfU0xFRVBfSU5UVjsKKworCS8qIHRoaXMgcHJpbnQgc2hvdWxkIGFsd2F5cyBiZSBkdGltX2NvbnRlciA9IDAgJgorCSAqIHNsZWVwICA9IGR0aW1fcGVyaW9kLCB0aGF0IG1lYW9ucywgd2Ugc2hvdWxkCisJICogYXdha2UgYmVmb3JlIGV2ZXJ5IGR0aW0gKi8KKwlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfRE1FU0csCisJCSAoImR0aW1fY291bnRlcjoleCB3aWxsIHNsZWVwIDolZCBiZWFjb25faW50dlxuIiwKKwkJICBydGxwcml2LT5wc2MuZHRpbV9jb3VudGVyLCBzbGVlcF9pbnR2KSk7CisKKwkvKiB3ZSB0ZXN0ZWQgdGhhdCA0MG1zIGlzIGVub3VnaCBmb3Igc3cgJiBodyBzdyBkZWxheSAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhydGxwcml2LT53b3Jrcy5ydGxfd3EsICZydGxwcml2LT53b3Jrcy5wc19yZm9uX3dxLAorCQkJTVNFQ1Moc2xlZXBfaW50diAqIG1hYy0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50IC0gNDApKTsKK30KKworCit2b2lkIHJ0bF9zd2xwc193cV9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGxfd29ya3MgKnJ0bHdvcmtzID0KKwkJY29udGFpbmVyX29mX2R3b3JrX3J0bChkYXRhLCBzdHJ1Y3QgcnRsX3dvcmtzLCBwc193b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHJ0bHdvcmtzLT5odzsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJYm9vbCBwcyA9IGZhbHNlOworCisJcHMgPSAoaHctPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9QUyk7CisKKwkvKiB3ZSBjYW4gc2xlZXAgYWZ0ZXIgcHMgbnVsbCBzZW5kIG9rICovCisJaWYgKHJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwKSB7CisJCXJ0bF9zd2xwc19yZl9zbGVlcChodyk7CisKKwkJaWYgKHJ0bHByaXYtPnBzYy5zdGF0ZSAmJiAhcHMpIHsKKwkJCXJ0bHByaXYtPnBzYy5zbGVlcF9tcyA9CisJCQkJamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KKwkJCQkJCSBydGxwcml2LT5wc2MubGFzdF9hY3Rpb24pOworCQl9CisKKwkJaWYgKHBzKQorCQkJcnRscHJpdi0+cHNjLmxhc3Rfc2xlcHQgPSBqaWZmaWVzOworCisJCXJ0bHByaXYtPnBzYy5sYXN0X2FjdGlvbiA9IGppZmZpZXM7CisJCXJ0bHByaXYtPnBzYy5zdGF0ZSA9IHBzOworCX0KK30KKworCit2b2lkIHJ0bF9wMnBfbm9hX2llKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IHJ0bF9wMnBfcHNfaW5mbyAqcDJwaW5mbyA9ICYocnRscHJpdi0+cHNjLnAycF9wc19pbmZvKTsKKwl1OCAqcG9zLCAqZW5kLCAqaWU7CisJdTE2IG5vYV9sZW47CisJc3RhdGljIHU4IHAycF9vdWlfaWVfdHlwZVs0XSA9IHsweDUwLCAweDZmLCAweDlhLCAweDA5fTsKKwl1OCBub2FfbnVtLCBpbmRleCxpLCBub2FfaW5kZXggPSAwOworCWJvb2wgZmluZF9wMnBfaWUgPSBmYWxzZSAsIGZpbmRfcDJwX3BzX2llID0gZmFsc2U7CisJcG9zID0gKHU4ICopbWdtdC0+dS5iZWFjb24udmFyaWFibGU7CisJZW5kID0gZGF0YSArIGxlbjsKKwlpZSA9IE5VTEw7CisKKwl3aGlsZSAocG9zICsgMSA8IGVuZCkgeworCisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKQorCQkJcmV0dXJuOworCisJCWlmIChwb3NbMF0gPT0gMjIxICYmIHBvc1sxXSA+IDQpIHsKKwkJCWlmIChtZW1jbXAoJnBvc1syXSwgcDJwX291aV9pZV90eXBlLCA0KSA9PSAwKSB7CisJCQkJaWUgPSBwb3MgKyAyKzQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcG9zICs9IDIgKyBwb3NbMV07CisJfQorCisJaWYgKGllID09IE5VTEwpCisJCXJldHVybjsKKwlmaW5kX3AycF9pZSA9IHRydWU7CisJLyp0byBmaW5kIG5vYSBpZSovCisJd2hpbGUgKGllICsgMSA8IGVuZCkgeworCQlub2FfbGVuID0gUkVBREVGMkJZVEUoJmllWzFdKTsKKwkJaWYgKGllICsgMyArIGllWzFdID4gZW5kKQorCQkJcmV0dXJuOworCisJCWlmIChpZVswXSA9PSAxMikgeworCQkJZmluZF9wMnBfcHNfaWUgPSB0cnVlOworCQkJaWYgKCAobm9hX2xlbiAtIDIpICUgMTMgIT0gMCl7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkJICgiUDJQIG5vdGljZSBvZiBhYnNlbmNlOiAiCisJCQkJCSAgImludmFsaWQgbGVuZ3RoLiVkXG4iLG5vYV9sZW4pKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCW5vYV9udW0gPSAobm9hX2xlbiAtIDIpIC8gMTM7CisJCQl9CisJCQlub2FfaW5kZXggPSBpZVszXTsKKwkJCWlmIChydGxwcml2LT5wc2MucDJwX3BzX2luZm8ucDJwX3BzX21vZGUgPT0gUDJQX1BTX05PTkUKKwkJCSAgICB8fCBub2FfaW5kZXggIT0gcDJwaW5mby0+bm9hX2luZGV4KSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsCisJCQkJCSAoInVwZGF0ZSBOT0EgaWUuXG4iKSk7CisJCQkJcDJwaW5mby0+bm9hX2luZGV4ID0gbm9hX2luZGV4OworCQkJCXAycGluZm8tPm9wcF9wcz0gKGllWzRdID4+IDcpOworCQkJCXAycGluZm8tPmN0d2luZG93ID0gaWVbNF0gJiAweDdGOworCQkJCXAycGluZm8tPm5vYV9udW0gPSBub2FfbnVtOworCQkJCWluZGV4ID0gNTsKKwkJCQlmb3IgKGkgPSAwOyBpPCBub2FfbnVtOyBpKyspeworCQkJCQlwMnBpbmZvLT5ub2FfY291bnRfdHlwZVtpXSA9CisJCQkJCQkJUkVBREVGMUJZVEUoaWUraW5kZXgpOworCQkJCQlpbmRleCArPSAxOworCQkJCQlwMnBpbmZvLT5ub2FfZHVyYXRpb25baV0gPQorCQkJCQkJCVJFQURFRjRCWVRFKGllK2luZGV4KTsKKwkJCQkJaW5kZXggKz0gNDsKKwkJCQkJcDJwaW5mby0+bm9hX2ludGVydmFsW2ldID0KKwkJCQkJCQlSRUFERUY0QllURShpZStpbmRleCk7CisJCQkJCWluZGV4ICs9IDQ7CisJCQkJCXAycGluZm8tPm5vYV9zdGFydF90aW1lW2ldID0KKwkJCQkJCQlSRUFERUY0QllURShpZStpbmRleCk7CisJCQkJCWluZGV4ICs9IDQ7CisJCQkJfQorCisJCQkJaWYgKHAycGluZm8tPm9wcF9wcyA9PSAxKSB7CisJCQkJCXAycGluZm8tPnAycF9wc19tb2RlID0gUDJQX1BTX0NUV0lORE9XOworCQkJCQkvKiBEcml2ZXIgc2hvdWxkIHdhaXQgTFBTCisJCQkJCSAqIGVudGVyaW5nIENUV2luZG93Ki8KKwkJCQkJaWYgKHJ0bHByaXYtPnBzYy5iX2Z3X2N1cnJlbnRfaW5wc21vZGUpeworCQkJCQkJcnRsX3AycF9wc19jbWQoaHcsCisJCQkJCQkJICAgICAgIFAyUF9QU19FTkFCTEUpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChwMnBpbmZvLT5ub2FfbnVtID4gMCkgeworCQkJCQlwMnBpbmZvLT5wMnBfcHNfbW9kZSA9IFAyUF9QU19OT0E7CisJCQkJCXJ0bF9wMnBfcHNfY21kKGh3LCBQMlBfUFNfRU5BQkxFKTsKKwkJCQl9IGVsc2UgaWYgKHAycGluZm8tPnAycF9wc19tb2RlID4gUDJQX1BTX05PTkUpIHsKKwkJCQkJcnRsX3AycF9wc19jbWQoaHcsIFAyUF9QU19ESVNBQkxFKTsKKwkJCQl9CisJCQl9CisKKwkJYnJlYWs7CisJCX0KKwkJaWUgKz0gMyArIG5vYV9sZW47CisJfQorCisJaWYgKGZpbmRfcDJwX2llID09IHRydWUpIHsKKwkJaWYgKChwMnBpbmZvLT5wMnBfcHNfbW9kZSA+IFAyUF9QU19OT05FKSAmJgorCQkgICAgKGZpbmRfcDJwX3BzX2llID09IGZhbHNlKSkKKwkJCXJ0bF9wMnBfcHNfY21kKGh3LCBQMlBfUFNfRElTQUJMRSk7CisJfQorfQorCit2b2lkIHJ0bF9wMnBfYWN0aW9uX2llKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IHJ0bF9wMnBfcHNfaW5mbyAqcDJwaW5mbyA9ICYocnRscHJpdi0+cHNjLnAycF9wc19pbmZvKTsKKwlib29sIGZpbmRfcDJwX2llID0gZmFsc2UgLCBmaW5kX3AycF9wc19pZSA9IGZhbHNlOworCXU4IG5vYV9udW0sIGluZGV4LGksIG5vYV9pbmRleCA9IDA7CisJdTggKnBvcywgKmVuZCwgKmllOworCXUxNiBub2FfbGVuOworCXN0YXRpYyB1OCBwMnBfb3VpX2llX3R5cGVbNF0gPSB7MHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX07CisKKwlwb3MgPSAodTggKikgJm1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OworCWVuZCA9IGRhdGEgKyBsZW47CisJaWUgPSBOVUxMOworCisJaWYgKHBvc1swXSA9PSAweDdmICkgeworCQlpZiAobWVtY21wKCZwb3NbMV0sIHAycF9vdWlfaWVfdHlwZSwgNCkgPT0gMCkgeworCQkJaWUgPSBwb3MgKyAzKzQ7CisJCX0KKwl9CisKKwlpZiAoaWUgPT0gTlVMTCkKKwkJcmV0dXJuOworCWZpbmRfcDJwX2llID0gdHJ1ZTsKKworCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCAoImFjdGlvbiBmcmFtZSBmaW5kIFAyUCBJRS5cbiIpKTsKKwkvKnRvIGZpbmQgbm9hIGllKi8KKwl3aGlsZSAoaWUgKyAxIDwgZW5kKSB7CisJCW5vYV9sZW4gPSBSRUFERUYyQllURSgmaWVbMV0pOworCQlpZiAoaWUgKyAzICsgaWVbMV0gPiBlbmQpCisJCQlyZXR1cm47CisKKwkJaWYgKGllWzBdID09IDEyKSB7CisJCQlSVF9UUkFDRShDT01QX0ZXLCBEQkdfTE9VRCwgKCJmaW5kIE5PQSBJRS5cbiIpKTsKKwkJCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9GVywgREJHX0xPVUQsICgibm9hIGllICIpLAorCQkJCSAgICAgIGllLCBub2FfbGVuKTsKKwkJCWZpbmRfcDJwX3BzX2llID0gdHJ1ZTsKKwkJCWlmICggKG5vYV9sZW4gLSAyKSAlIDEzICE9IDApeworCQkJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELAorCQkJCQkgKCJQMlAgbm90aWNlIG9mIGFic2VuY2U6ICIKKwkJCQkJICAiaW52YWxpZCBsZW5ndGguJWRcbiIsbm9hX2xlbikpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJbm9hX251bSA9IChub2FfbGVuIC0gMikgLyAxMzsKKwkJCX0KKwkJCW5vYV9pbmRleCA9IGllWzNdOworCQkJaWYgKHJ0bHByaXYtPnBzYy5wMnBfcHNfaW5mby5wMnBfcHNfbW9kZSA9PSBQMlBfUFNfTk9ORQorCQkJICAgIHx8IG5vYV9pbmRleCAhPSBwMnBpbmZvLT5ub2FfaW5kZXgpIHsKKwkJCQlwMnBpbmZvLT5ub2FfaW5kZXggPSBub2FfaW5kZXg7CisJCQkJcDJwaW5mby0+b3BwX3BzPSAoaWVbNF0gPj4gNyk7CisJCQkJcDJwaW5mby0+Y3R3aW5kb3cgPSBpZVs0XSAmIDB4N0Y7CisJCQkJcDJwaW5mby0+bm9hX251bSA9IG5vYV9udW07CisJCQkJaW5kZXggPSA1OworCQkJCWZvciAoaSA9IDA7IGk8IG5vYV9udW07IGkrKyl7CisJCQkJCXAycGluZm8tPm5vYV9jb3VudF90eXBlW2ldID0KKwkJCQkJCQlSRUFERUYxQllURShpZStpbmRleCk7CisJCQkJCWluZGV4ICs9IDE7CisJCQkJCXAycGluZm8tPm5vYV9kdXJhdGlvbltpXSA9CisJCQkJCQkJUkVBREVGNEJZVEUoaWUraW5kZXgpOworCQkJCQlpbmRleCArPSA0OworCQkJCQlwMnBpbmZvLT5ub2FfaW50ZXJ2YWxbaV0gPQorCQkJCQkJCVJFQURFRjRCWVRFKGllK2luZGV4KTsKKwkJCQkJaW5kZXggKz0gNDsKKwkJCQkJcDJwaW5mby0+bm9hX3N0YXJ0X3RpbWVbaV0gPQorCQkJCQkJCVJFQURFRjRCWVRFKGllK2luZGV4KTsKKwkJCQkJaW5kZXggKz0gNDsKKwkJCQl9CisKKwkJCQlpZiAocDJwaW5mby0+b3BwX3BzID09IDEpIHsKKwkJCQkJcDJwaW5mby0+cDJwX3BzX21vZGUgPSBQMlBfUFNfQ1RXSU5ET1c7CisJCQkJCS8qIERyaXZlciBzaG91bGQgd2FpdCBMUFMKKwkJCQkJICogZW50ZXJpbmcgQ1RXaW5kb3cgKi8KKwkJCQkJaWYgKHJ0bHByaXYtPnBzYy5iX2Z3X2N1cnJlbnRfaW5wc21vZGUpeworCQkJCQkJcnRsX3AycF9wc19jbWQoaHcsCisJCQkJCQkJICAgICAgIFAyUF9QU19FTkFCTEUpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChwMnBpbmZvLT5ub2FfbnVtID4gMCkgeworCQkJCQlwMnBpbmZvLT5wMnBfcHNfbW9kZSA9IFAyUF9QU19OT0E7CisJCQkJCXJ0bF9wMnBfcHNfY21kKGh3LCBQMlBfUFNfRU5BQkxFKTsKKwkJCQl9IGVsc2UgaWYgKHAycGluZm8tPnAycF9wc19tb2RlID4gUDJQX1BTX05PTkUpIHsKKwkJCQkJcnRsX3AycF9wc19jbWQoaHcsIFAyUF9QU19ESVNBQkxFKTsKKwkJCQl9CisJCQl9CisKKwkJYnJlYWs7CisJCX0KKwkJaWUgKz0gMyArIG5vYV9sZW47CisJfQorCisKK30KKworCit2b2lkIHJ0bF9wMnBfcHNfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LHU4IHAycF9wc19zdGF0ZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnJ0bHBzID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcDJwX3BzX2luZm8gICpwMnBpbmZvID0gJihydGxwcml2LT5wc2MucDJwX3BzX2luZm8pOworCisJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsICgiIHAycCBzdGF0ZSAleFxuIixwMnBfcHNfc3RhdGUpKTsKKwlzd2l0Y2ggKHAycF9wc19zdGF0ZSkgeworCQljYXNlIFAyUF9QU19ESVNBQkxFOgorCQkJcDJwaW5mby0+cDJwX3BzX3N0YXRlID0gcDJwX3BzX3N0YXRlOworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJCQkgICBIV19WQVJfSDJDX0ZXX1AyUF9QU19PRkZMT0FELAorCQkJCQkJICAgKHU4ICopKCZwMnBfcHNfc3RhdGUpKTsKKworCQkJcDJwaW5mby0+bm9hX2luZGV4ID0gMDsKKwkJCXAycGluZm8tPmN0d2luZG93ID0gMDsKKwkJCXAycGluZm8tPm9wcF9wcyA9IDA7CisJCQlwMnBpbmZvLT5ub2FfbnVtID0gMDsKKwkJCXAycGluZm8tPnAycF9wc19tb2RlID0gUDJQX1BTX05PTkU7CisJCQlpZiAocnRscHMtPmJfZndfY3VycmVudF9pbnBzbW9kZSA9PSB0cnVlKSB7CisJCQkJaWYgKHJ0bHBzLT5zbWFydF9wcyA9PSAwKSB7CisJCQkJCXJ0bHBzLT5zbWFydF9wcyA9IDI7CisJCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LAorCQkJCQkJICAgIEhXX1ZBUl9IMkNfRldfUFdSTU9ERSwKKwkJCQkJCSAgICAodTggKikoJnJ0bHBzLT5wd3JfbW9kZSkpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUDJQX1BTX0VOQUJMRToKKwkJCWlmIChwMnBpbmZvLT5wMnBfcHNfbW9kZSA+IFAyUF9QU19OT05FKSB7CisJCQkJcDJwaW5mby0+cDJwX3BzX3N0YXRlID0gcDJwX3BzX3N0YXRlOworCisJCQkJaWYgKHAycGluZm8tPmN0d2luZG93ID4gMCkgeworCQkJCQlpZiAocnRscHMtPnNtYXJ0X3BzICE9IDApeworCQkJCQkJcnRscHMtPnNtYXJ0X3BzID0gMDsKKwkJCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKAorCQkJCQkJICAgIGh3LCBIV19WQVJfSDJDX0ZXX1BXUk1PREUsCisJCQkJCQkgICAgKHU4ICopKCZydGxwcy0+cHdyX21vZGUpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCUhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQsCisJCQkJCQkodTggKikoJnAycF9wc19zdGF0ZSkpOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQMlBfUFNfU0NBTjoKKwkJY2FzZSBQMlBfUFNfU0NBTl9ET05FOgorCQljYXNlIFAyUF9QU19BTExTVEFTTEVFUDoKKwkJCWlmIChwMnBpbmZvLT5wMnBfcHNfbW9kZSA+IFAyUF9QU19OT05FKSB7CisJCQkJcDJwaW5mby0+cDJwX3BzX3N0YXRlID0gcDJwX3BzX3N0YXRlOworCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LAorCQkJCQkJSFdfVkFSX0gyQ19GV19QMlBfUFNfT0ZGTE9BRCwKKwkJCQkJCSh1OCAqKSgmcDJwX3BzX3N0YXRlKSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJfQorCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCAoIiBjdHdpbmRvdyAleCBvcHBwcyAleCBcbiIsCisJCSAJCSAgICAgcDJwaW5mby0+Y3R3aW5kb3cscDJwaW5mby0+b3BwX3BzKSk7CisJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsICgiY291bnQgJXggZHVyYXRpb24gJXggaW5kZXggJXggaW50ZXJ2YWwgJXgiCisJCQkJICAgICAiIHN0YXJ0IHRpbWUgJXggbm9hIG51bSAleFxuIiwKKwkJCQkgICAgIHAycGluZm8tPm5vYV9jb3VudF90eXBlWzBdLAorCQkJCSAgICAgcDJwaW5mby0+bm9hX2R1cmF0aW9uWzBdLAorCQkJCSAgICAgcDJwaW5mby0+bm9hX2luZGV4LAorCQkJCSAgICAgcDJwaW5mby0+bm9hX2ludGVydmFsWzBdLAorCQkJCSAgICAgcDJwaW5mby0+bm9hX3N0YXJ0X3RpbWVbMF0sCisJCQkJICAgICBwMnBpbmZvLT5ub2FfbnVtKSk7CisJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsICgiZW5kXG4iKSk7Cit9CisKK3ZvaWQgcnRsX3AycF9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAodm9pZCAqKSBkYXRhOworCisJaWYgKCFtYWMtPnAycCkKKwkJcmV0dXJuOworCWlmIChtYWMtPmxpbmtfc3RhdGUgIT0gTUFDODAyMTFfTElOS0VEKQorCQlyZXR1cm47CisJLyogbWluLiBiZWFjb24gbGVuZ3RoICsgRkNTX0xFTiAqLworCWlmIChsZW4gPD0gNDAgKyBGQ1NfTEVOKQorCQlyZXR1cm47CisKKwkvKiBhbmQgb25seSBiZWFjb25zIGZyb20gdGhlIGFzc29jaWF0ZWQgQlNTSUQsIHBsZWFzZSAqLworCWlmIChldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjMsIHJ0bHByaXYtPm1hYzgwMjExLmJzc2lkKSkKKwkJcmV0dXJuOworCisJLyogY2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBiZWFjb24gKi8KKwlpZiAoIShpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKKwkgICAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpIHx8CisJICAgICAgaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpKSkKKwkJcmV0dXJuOworCisJaWYgKGllZWU4MDIxMV9pc19hY3Rpb24oaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlydGxfcDJwX2FjdGlvbl9pZShodyxkYXRhLGxlbiAtIEZDU19MRU4pOworCX0gZWxzZSB7CisJCXJ0bF9wMnBfbm9hX2llKGh3LGRhdGEsbGVuIC0gRkNTX0xFTik7CisJfQorCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0ZWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JFQUxURUtfUlRMX1BDSV9QU19IX18KKyNkZWZpbmUgX19SRUFMVEVLX1JUTF9QQ0lfUFNfSF9fCisKKyNkZWZpbmUgTUFYX1NXX0xQU19TTEVFUF9JTlRWCTUKKworYm9vbCBydGxfcHNfc2V0X3JmX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIGVudW0gcmZfcHdyc3RhdGUgc3RhdGVfdG9zZXQsIHUzMiBjaGFuZ2Vzb3VyY2UsCisJCQkgYm9vbCBwcm90ZWN0X29yX25vdCk7Citib29sIHJ0bF9wc19lbmFibGVfbmljKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2Jvb2wgcnRsX3BzX2Rpc2FibGVfbmljKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2lwc19uaWNfb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsX2lwc19uaWNfb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGxfaXBzX25pY19vZmZfd3FfY2FsbGJhY2sodm9pZCAqZGF0YSk7Cit2b2lkIHJ0bF9scHNfZW50ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGxfbHBzX2xlYXZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwordm9pZCBydGxfbHBzX3NldF9wc21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHJ0X3BzbW9kZSk7CisKK3ZvaWQgcnRsX3N3bHBzX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIHJ0bF9zd2xwc193cV9jYWxsYmFjayh2b2lkICpkYXRhKTsKK3ZvaWQgcnRsX3N3bHBzX3Jmb25fd3FfY2FsbGJhY2sodm9pZCAqZGF0YSk7Cit2b2lkIHJ0bF9zd2xwc19yZl9hd2FrZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bF9zd2xwc19yZl9zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bF9wMnBfcHNfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LHU4IHAycF9wc19zdGF0ZSk7Cit2b2lkIHJ0bF9wMnBfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg3ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yYy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIndpZmkuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisjaW5jbHVkZSAicmMuaCIKKworLyoKKyAqRmluZHMgdGhlIGhpZ2hlc3QgcmF0ZSBpbmRleCB3ZSBjYW4gdXNlCisgKmlmIHNrYiBpcyBzcGVjaWFsIGRhdGEgbGlrZSBESENQL0VBUE9MLCB3ZSBzZXQgc2hvdWxkCisgKml0IHRvIGxvd2VzdCByYXRlIENDS18xTSwgb3RoZXJ3aXNlIHdlIHNldCByYXRlIHRvCisgKmhpZ2hlc3QgcmF0ZSBiYXNlZCBvbiB3aXJlbGVzcyBtb2RlIHVzZWQgZm9yIGl3Y29uZmlnCisgKnNob3cgVHggcmF0ZS4KKyAqLworc3RhdGljIHU4IF9ydGxfcmNfZ2V0X2hpZ2hlc3Rfcml4KHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIG5vdF9kYXRhKQoreworCXN0cnVjdCBydGxfbWFjICpydGxtYWMgPSBydGxfbWFjKHJ0bHByaXYpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKKwl1OCB3aXJlbGVzc19tb2RlID0gMDsKKworCS8qCisJICp0aGlzIHJhdGUgaXMgbm8gdXNlIGZvciB0cnVlIHJhdGUsIGZpcm13YXJlCisJICp3aWxsIGNvbnRyb2wgcmF0ZSBhdCBhbGwgaXQganVzdCB1c2VkIGZvcgorCSAqMS5zaG93IGluIGl3Y29uZmlnIGluIEIvRyBtb2RlCisJICoyLmluIHJ0bF9nZXRfdGNiX2Rlc2Mgd2hlbiB3ZSBjaGVjayByYXRlIGlzCisJICogICAgICAxTSB3ZSB3aWxsIG5vdCB1c2UgRlcgcmF0ZSBidXQgdXNlciByYXRlLgorCSAqLworCWlmIChydGxtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCSAgICBydGxtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCSAgICBydGxtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CisJCWlmIChzdGEpIHsKKwkJCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopIHN0YS0+ZHJ2X3ByaXY7CisJCQl3aXJlbGVzc19tb2RlID0gc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQl3aXJlbGVzc19tb2RlID0gcnRsbWFjLT5tb2RlOworCX0KKworCWlmIChydGxfaXNfc3BlY2lhbF9kYXRhKHJ0bHByaXYtPm1hYzgwMjExLmh3LCBza2IsIHRydWUpIHx8IG5vdF9kYXRhKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKKwkJCQlyZXR1cm4gQl9NT0RFX01BWF9SSVg7CisJCQl9IGVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7CisJCQkJcmV0dXJuIEdfTU9ERV9NQVhfUklYOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZ2V0X3JmX3R5cGUocnRscGh5KSAhPSBSRl8yVDJSKQorCQkJCQlyZXR1cm4gTl9NT0RFX01DUzdfUklYOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIE5fTU9ERV9NQ1MxNV9SSVg7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX0EpIHsKKwkJCQlyZXR1cm4gQV9NT0RFX01BWF9SSVg7CisJCQl9IGVsc2UgeworCQkJCWlmIChnZXRfcmZfdHlwZShydGxwaHkpICE9IFJGXzJUMlIpCisJCQkJCXJldHVybiBOX01PREVfTUNTN19SSVg7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gTl9NT0RFX01DUzE1X1JJWDsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bF9yY19yYXRlX3NldF9zZXJpZXMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjLAorCQkJCSAgICB1OCB0cmllcywgY2hhciByaXgsIGludCBydHNjdHNlbmFibGUsCisJCQkJICAgIGJvb2wgbm90X2RhdGEpCit7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRscHJpdik7CisJdTggc2dpXzIwID0gMCwgc2dpXzQwID0gMDsKKworCWlmIChzdGEpIHsKKwkJc2dpXzIwID0gc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisJCXNnaV80MCA9IHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOworCX0KKwlyYXRlLT5jb3VudCA9IHRyaWVzOworCXJhdGUtPmlkeCA9IHJpeCA+PSAweDAwID8gcml4IDogMHgwMDsKKworCWlmICghbm90X2RhdGEpIHsKKwkJaWYgKHR4cmMtPnNob3J0X3ByZWFtYmxlKQorCQkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRTsKKwkJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQkJaWYgKHN0YSAmJiAoc3RhLT5odF9jYXAuY2FwICYKKwkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApKQorCQkJCXJhdGUtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg7CisJCX0gZWxzZSB7CisJCQlpZiAobWFjLT5id180MCkKKwkJCQlyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOworCQl9CisJCWlmIChzZ2lfMjAgfHwgc2dpXzQwKQorCQkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOworCQlpZiAoc3RhICYmIHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKKwkJCXJhdGUtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGxfZ2V0X3JhdGUodm9pZCAqcHByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgdm9pZCAqcHJpdl9zdGEsCisJCQkgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlX2NvbnRyb2wgKnR4cmMpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcHByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cmMtPnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyYXRlcyA9IHR4X2luZm8tPmNvbnRyb2wucmF0ZXM7CisJX19sZTE2IGZjID0gcnRsX2dldF9mYyhza2IpOworCXU4IHRyeV9wZXJfcmF0ZSwgaSwgcml4OworCWJvb2wgbm90X2RhdGEgPSAhaWVlZTgwMjExX2lzX2RhdGEoZmMpOworCisJaWYgKHJhdGVfY29udHJvbF9zZW5kX2xvdyhzdGEsIHByaXZfc3RhLCB0eHJjKSkKKwkJcmV0dXJuOworCisJcml4ID0gX3J0bF9yY19nZXRfaGlnaGVzdF9yaXgocnRscHJpdiwgc3RhLCBza2IsIG5vdF9kYXRhKTsKKwl0cnlfcGVyX3JhdGUgPSAxOworCV9ydGxfcmNfcmF0ZV9zZXRfc2VyaWVzKHJ0bHByaXYsIHN0YSwgJnJhdGVzWzBdLCB0eHJjLAorCQkJCXRyeV9wZXJfcmF0ZSwgcml4LCAxLCBub3RfZGF0YSk7CisKKwlpZiAoIW5vdF9kYXRhKSB7CisJCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspCisJCQlfcnRsX3JjX3JhdGVfc2V0X3NlcmllcyhydGxwcml2LCBzdGEsICZyYXRlc1tpXSwKKwkJCQkJCXR4cmMsIGksIChyaXggLSBpKSwgMSwKKwkJCQkJCW5vdF9kYXRhKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIF9ydGxfdHhfYWdncl9jaGVjayhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsCisJCQkgICAgICAgc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5LCB1MTYgdGlkKQoreworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bHByaXYpOworCisJaWYgKG1hYy0+YWN0X3NjYW5uaW5nKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBtYWMtPmNudF9hZnRlcl9saW5rZWQgPCAzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RhX2VudHJ5LT50aWRzW3RpZF0uYWdnLmFnZ19zdGF0ZSA9PSBSVExfQUdHX1NUT1ApCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKm1hYzgwMjExIFJhdGUgQ29udHJvbCBjYWxsYmFja3MqLworc3RhdGljIHZvaWQgcnRsX3R4X3N0YXR1cyh2b2lkICpwcHJpdiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHBwcml2OworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bHByaXYpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSBydGxfZ2V0X2hkcihza2IpOworCV9fbGUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKwlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnk7CisKKwlpZiAoIXByaXZfc3RhIHx8ICFpZWVlODAyMTFfaXNfZGF0YShmYykpCisJCXJldHVybjsKKworCWlmIChydGxfaXNfc3BlY2lhbF9kYXRhKG1hYy0+aHcsIHNrYiwgdHJ1ZSkpCisJCXJldHVybjsKKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfZ2V0X0RBKGhkcikpIHx8CisJICAgIGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9nZXRfREEoaGRyKSkpCisJCXJldHVybjsKKworCWlmIChzdGEpIHsKKwkJLyogQ2hlY2sgaWYgYWdncmVnYXRpb24gaGFzIHRvIGJlIGVuYWJsZWQgZm9yIHRoaXMgdGlkICovCisJCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopIHN0YS0+ZHJ2X3ByaXY7CisJCWlmICgoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkID09IHRydWUpICYmCisJCQkJIShza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpKSB7CisJCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQkJCXU4IHRpZCA9IHJ0bF9nZXRfdGlkKHNrYik7CisJCQkJaWYgKF9ydGxfdHhfYWdncl9jaGVjayhydGxwcml2LCBzdGFfZW50cnksCisJCQkJCQkgICAgICAgdGlkKSkgeworCQkJCQlzdGFfZW50cnktPnRpZHNbdGlkXS5hZ2cuYWdnX3N0YXRlID0KKwkJCQkJCVJUTF9BR0dfUFJPR1JFU1M7CisJCQkJCS8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisJCQkJCS8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJCQkJCWllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLAorCQkJCQkJCQkgICAgICA1MDAwKTsKKwkJCQkJLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2Vsc2UKKwkJCQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQpOworI2VuZGlmCisJCQkJCS8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBydGxfcmF0ZV9pbml0KHZvaWQgKnBwcml2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKK3sKK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw1LDApKQorc3RhdGljIHZvaWQgcnRsX3JhdGVfdXBkYXRlKHZvaWQgKnBwcml2LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAorCQkJICAgIHUzMiBjaGFuZ2VkLAorCQkJICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgb3Blcl9jaGFuX3R5cGUpCit7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcnRsX3JhdGVfdXBkYXRlKHZvaWQgKnBwcml2LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKKwkJCSAgICB1MzIgY2hhbmdlZCkKK3sKK30KKyNlbmRpZgorc3RhdGljIHZvaWQgKnJ0bF9yYXRlX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlyZXR1cm4gcnRscHJpdjsKK30KKworc3RhdGljIHZvaWQgcnRsX3JhdGVfZnJlZSh2b2lkICpydGxwcml2KQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgKnJ0bF9yYXRlX2FsbG9jX3N0YSh2b2lkICpwcHJpdiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcHByaXY7CisJc3RydWN0IHJ0bF9yYXRlX3ByaXYgKnJhdGVfcHJpdjsKKworCXJhdGVfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGxfcmF0ZV9wcml2KSwgZ2ZwKTsKKwlpZiAoIXJhdGVfcHJpdikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgcmMgc3RydWN0dXJlXG4iKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJ0bHByaXYtPnJhdGVfcHJpdiA9IHJhdGVfcHJpdjsKKworCXJldHVybiByYXRlX3ByaXY7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9yYXRlX2ZyZWVfc3RhKHZvaWQgKnJ0bHByaXYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKK3sKKwlzdHJ1Y3QgcnRsX3JhdGVfcHJpdiAqcmF0ZV9wcml2ID0gcHJpdl9zdGE7CisJa2ZyZWUocmF0ZV9wcml2KTsKK30KKworc3RhdGljIHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHJ0bF9yYXRlX29wcyA9IHsKKwkubW9kdWxlID0gTlVMTCwKKwkubmFtZSA9ICJydGxfcmMiLAorCS5hbGxvYyA9IHJ0bF9yYXRlX2FsbG9jLAorCS5mcmVlID0gcnRsX3JhdGVfZnJlZSwKKwkuYWxsb2Nfc3RhID0gcnRsX3JhdGVfYWxsb2Nfc3RhLAorCS5mcmVlX3N0YSA9IHJ0bF9yYXRlX2ZyZWVfc3RhLAorCS5yYXRlX2luaXQgPSBydGxfcmF0ZV9pbml0LAorCS5yYXRlX3VwZGF0ZSA9IHJ0bF9yYXRlX3VwZGF0ZSwKKwkudHhfc3RhdHVzID0gcnRsX3R4X3N0YXR1cywKKwkuZ2V0X3JhdGUgPSBydGxfZ2V0X3JhdGUsCit9OworCitpbnQgcnRsX3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZydGxfcmF0ZV9vcHMpOworfQorCit2b2lkIHJ0bF9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKQoreworCWllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigmcnRsX3JhdGVfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZhMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMX1JDX0hfXworI2RlZmluZSBfX1JUTF9SQ19IX18KKworI2RlZmluZSBCX01PREVfTUFYX1JJWCAzCisjZGVmaW5lIEdfTU9ERV9NQVhfUklYIDExCisjZGVmaW5lIEFfTU9ERV9NQVhfUklYIDcKKworLyogaW4gbWFjODAyMTEgbWNzMC1tY3MxNSBpcyBpZHgwLWlkeDE1Ki8KKyNkZWZpbmUgTl9NT0RFX01DUzdfUklYIDcKKyNkZWZpbmUgTl9NT0RFX01DUzE1X1JJWCAxNQorCitzdHJ1Y3QgcnRsX3JhdGVfcHJpdiB7CisJdTggaHRfY2FwOworfTsKKworaW50IHJ0bF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7Cit2b2lkIHJ0bF9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODlmMTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMKQEAgLTAsMCArMSw1MDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAid2lmaS5oIgorI2luY2x1ZGUgInJlZ2QuaCIKKworc3RhdGljIHN0cnVjdCBjb3VudHJ5X2NvZGVfdG9fZW51bV9yZCBhbGxDb3VudHJpZXNbXSA9IHsKKwl7Q09VTlRSWV9DT0RFX0ZDQywgIlVTIn0sCisJe0NPVU5UUllfQ09ERV9JQywgIlVTIn0sCisJe0NPVU5UUllfQ09ERV9FVFNJLCAiRUMifSwKKwl7Q09VTlRSWV9DT0RFX1NQQUlOLCAiRUMifSwKKwl7Q09VTlRSWV9DT0RFX0ZSQU5DRSwgIkVDIn0sCisJe0NPVU5UUllfQ09ERV9NS0ssICJKUCJ9LAorCXtDT1VOVFJZX0NPREVfTUtLMSwgIkpQIn0sCisJe0NPVU5UUllfQ09ERV9JU1JBRUwsICJFQyJ9LAorCXtDT1VOVFJZX0NPREVfVEVMRUMsICJKUCJ9LAorCXtDT1VOVFJZX0NPREVfTUlDLCAiSlAifSwKKwl7Q09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4sICJKUCJ9LAorCXtDT1VOVFJZX0NPREVfV09STERfV0lERV8xMywgIkVDIn0sCisJe0NPVU5UUllfQ09ERV9URUxFQ19ORVRHRUFSLCAiRUMifSwKK307CisKKy8qCisgKk9ubHkgdGhlc2UgY2hhbm5lbHMgYWxsIGFsbG93IGFjdGl2ZQorICpzY2FuIG9uIGFsbCB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbnMKKyAqLworI2RlZmluZSBSVEw4MTl4XzJHSFpfQ0gwMV8xMQlcCisJUkVHX1JVTEUoMjQxMi0xMCwgMjQ2MisxMCwgNDAsIDAsIDIwLCAwKQorCisvKgorICpXZSBlbmFibGUgYWN0aXZlIHNjYW4gb24gdGhlc2UgYSBjYXNlCisgKmJ5IGNhc2UgYmFzaXMgYnkgcmVndWxhdG9yeSBkb21haW4KKyAqLworI2RlZmluZSBSVEw4MTl4XzJHSFpfQ0gxMl8xMwlcCisJUkVHX1JVTEUoMjQ2Ny0xMCwgMjQ3MisxMCwgNDAsIDAsIDIwLFwKKwlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pCisKKyNkZWZpbmUgUlRMODE5eF8yR0haX0NIMTQJXAorCVJFR19SVUxFKDI0ODQtMTAsIDI0ODQrMTAsIDQwLCAwLCAyMCwgXAorCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiB8IFwKKwlOTDgwMjExX1JSRl9OT19PRkRNKQorCisvKiA1RyBjaGFuIDM2IC0gY2hhbiA2NCovCisjZGVmaW5lIFJUTDgxOXhfNUdIWl81MTUwXzUzNTAJXAorCVJFR19SVUxFKDUxNTAtMTAsIDUzNTArMTAsIDQwLCAwLCAzMCwgXAorCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiB8IFwKKwlOTDgwMjExX1JSRl9OT19JQlNTKQorCisvKiA1RyBjaGFuIDEwMCAtIGNoYW4gMTY1Ki8KKyNkZWZpbmUgUlRMODE5eF81R0haXzU0NzBfNTg1MAlcCisJUkVHX1JVTEUoNTQ3MC0xMCwgNTg1MCsxMCwgNDAsIDAsIDMwLCBcCisJTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOIHwgXAorCU5MODAyMTFfUlJGX05PX0lCU1MpCisKKy8qIDVHIGNoYW4gMTQ5IC0gY2hhbiAxNjUqLworI2RlZmluZSBSVEw4MTl4XzVHSFpfNTcyNV81ODUwCVwKKwlSRUdfUlVMRSg1NzI1LTEwLCA1ODUwKzEwLCA0MCwgMCwgMzAsIFwKKwlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4gfCBcCisJTkw4MDIxMV9SUkZfTk9fSUJTUykKKworI2RlZmluZSBSVEw4MTl4XzVHSFpfQUxMCVwKKwlSVEw4MTl4XzVHSFpfNTE1MF81MzUwLCBSVEw4MTl4XzVHSFpfNTQ3MF81ODUwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBydGxfcmVnZG9tXzExID0geworCS5uX3JlZ19ydWxlcyA9IDEsCisJLmFscGhhMiA9ICI5OSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJICAgICAgUlRMODE5eF8yR0haX0NIMDFfMTEsCisJCSAgICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBydGxfcmVnZG9tXzEyXzEzID0geworCS5uX3JlZ19ydWxlcyA9IDIsCisJLmFscGhhMiA9ICI5OSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJICAgICAgUlRMODE5eF8yR0haX0NIMDFfMTEsCisJCQkgIFJUTDgxOXhfMkdIWl9DSDEyXzEzLAorCQkgICAgICB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gcnRsX3JlZ2RvbV9ub19taWRiYW5kID0geworCS5uX3JlZ19ydWxlcyA9IDMsCisJLmFscGhhMiA9ICI5OSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJICAgICAgUlRMODE5eF8yR0haX0NIMDFfMTEsCisJCQkgIFJUTDgxOXhfNUdIWl81MTUwXzUzNTAsCisJCQkgIFJUTDgxOXhfNUdIWl81NzI1XzU4NTAsCisJCSAgICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBydGxfcmVnZG9tXzYwXzY0ID0geworCS5uX3JlZ19ydWxlcyA9IDMsCisJLmFscGhhMiA9ICI5OSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJICAgICAgUlRMODE5eF8yR0haX0NIMDFfMTEsCisJCQkgIFJUTDgxOXhfMkdIWl9DSDEyXzEzLAorCQkJICBSVEw4MTl4XzVHSFpfNTcyNV81ODUwLAorCQkgICAgICB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gcnRsX3JlZ2RvbV8xNF82MF82NCA9IHsKKwkubl9yZWdfcnVsZXMgPSA0LAorCS5hbHBoYTIgPSAiOTkiLAorCS5yZWdfcnVsZXMgPSB7CisJCSAgICAgIFJUTDgxOXhfMkdIWl9DSDAxXzExLAorCQkJICBSVEw4MTl4XzJHSFpfQ0gxMl8xMywKKwkJCSAgUlRMODE5eF8yR0haX0NIMTQsCisJCQkgIFJUTDgxOXhfNUdIWl81NzI1XzU4NTAsCisJCSAgICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBydGxfcmVnZG9tXzE0ID0geworCS5uX3JlZ19ydWxlcyA9IDMsCisJLmFscGhhMiA9ICI5OSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJICAgICAgUlRMODE5eF8yR0haX0NIMDFfMTEsCisJCQkgIFJUTDgxOXhfMkdIWl9DSDEyXzEzLAorCQkJICBSVEw4MTl4XzJHSFpfQ0gxNCwKKwkJICAgICAgfQorfTsKKworc3RhdGljIGJvb2wgX3J0bF9pc19yYWRhcl9mcmVxKHUxNiBjZW50ZXJfZnJlcSkKK3sKKwlyZXR1cm4gKGNlbnRlcl9mcmVxID49IDUyNjAgJiYgY2VudGVyX2ZyZXEgPD0gNTcwMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGxfcmVnX2FwcGx5X2JlYWNvbmluZ19mbGFncyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBlbnVtIG5sODAyMTFfcmVnX2luaXRpYXRvciBpbml0aWF0b3IpCit7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJlZ19ydWxlOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgaW50IGk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsOSwwKSkKKwl1MzIgYmFuZHdpZHRoID0gMDsKKwlpbnQgcjsKKyNlbmRpZgorCisJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgeworCisJCWlmICghd2lwaHktPmJhbmRzW2JhbmRdKQorCQkJY29udGludWU7CisKKwkJc2JhbmQgPSB3aXBoeS0+YmFuZHNbYmFuZF07CisKKwkJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJCWNoID0gJnNiYW5kLT5jaGFubmVsc1tpXTsKKwkJCWlmIChfcnRsX2lzX3JhZGFyX2ZyZXEoY2gtPmNlbnRlcl9mcmVxKSB8fAorCQkJICAgIChjaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikpCisJCQkJY29udGludWU7CisJCQlpZiAoaW5pdGlhdG9yID09IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFKSB7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDksMCkpCisJCQkJcmVnX3J1bGUgPSBmcmVxX3JlZ19pbmZvKHdpcGh5LCBjaC0+Y2VudGVyX2ZyZXEpOworCQkJCWlmIChJU19FUlIocmVnX3J1bGUpKQorCQkJCQljb250aW51ZTsKKyNlbHNlCisJCQkJciA9IGZyZXFfcmVnX2luZm8od2lwaHksIGNoLT5jZW50ZXJfZnJlcSwKKwkJCQkJCSAgYmFuZHdpZHRoLCAmcmVnX3J1bGUpOworCQkJCWlmIChyKQorCQkJCQljb250aW51ZTsKKyNlbmRpZgorCisJCQkJLyoKKwkJCQkgKklmIDExZCBoYWQgYSBydWxlIGZvciB0aGlzIGNoYW5uZWwgZW5zdXJlCisJCQkJICp3ZSBlbmFibGUgYWRob2MvYmVhY29uaW5nIGlmIGl0IGFsbG93cyB1cyB0bworCQkJCSAqdXNlIGl0LiBOb3RlIHRoYXQgd2Ugd291bGQgaGF2ZSBkaXNhYmxlZCBpdAorCQkJCSAqYnkgYXBwbHlpbmcgb3VyIHN0YXRpYyB3b3JsZCByZWdkb21haW4gYnkKKwkJCQkgKmRlZmF1bHQgZHVyaW5nIGluaXQsIHByaW9yIHRvIGNhbGxpbmcgb3VyCisJCQkJICpyZWd1bGF0b3J5X2hpbnQoKS4KKwkJCQkgKi8KKworCQkJCWlmICghKHJlZ19ydWxlLT5mbGFncyAmIE5MODAyMTFfUlJGX05PX0lCU1MpKQorCQkJCQljaC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9DSEFOX05PX0lCU1M7CisJCQkJaWYgKCEocmVnX3J1bGUtPmZsYWdzICYKKwkJCQkgICAgICBOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pKQorCQkJCQljaC0+ZmxhZ3MgJj0KKwkJCQkJICAgIH5JRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU47CisJCQl9IGVsc2UgeworCQkJCWlmIChjaC0+YmVhY29uX2ZvdW5kKQorCQkJCQljaC0+ZmxhZ3MgJj0gfihJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKKwkJCQkJCSAgIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTik7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIEFsbG93cyBhY3RpdmUgc2NhbiBzY2FuIG9uIENoIDEyIGFuZCAxMyAqLworc3RhdGljIHZvaWQgX3J0bF9yZWdfYXBwbHlfYWN0aXZlX3NjYW5fZmxhZ3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBlbnVtIG5sODAyMTFfcmVnX2luaXRpYXRvcgorCQkJCQkgICAgIGluaXRpYXRvcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJlZ19ydWxlOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDksMCkpCisJdTMyIGJhbmR3aWR0aCA9IDA7CisJaW50IHI7CisjZW5kaWYKKworCWlmICghd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdKQorCQlyZXR1cm47CisJc2JhbmQgPSB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisKKwkvKgorCSAqSWYgbm8gY291bnRyeSBJRSBoYXMgYmVlbiByZWNlaXZlZCBhbHdheXMgZW5hYmxlIGFjdGl2ZSBzY2FuCisJICpvbiB0aGVzZSBjaGFubmVscy4gVGhpcyBpcyBvbmx5IGRvbmUgZm9yIHNwZWNpZmljIHJlZ3VsYXRvcnkgU0tVcworCSAqLworCWlmIChpbml0aWF0b3IgIT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUpIHsKKwkJY2ggPSAmc2JhbmQtPmNoYW5uZWxzWzExXTsJLyogQ0ggMTIgKi8KKwkJaWYgKGNoLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikKKwkJCWNoLT5mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOworCQljaCA9ICZzYmFuZC0+Y2hhbm5lbHNbMTJdOwkvKiBDSCAxMyAqLworCQlpZiAoY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKQorCQkJY2gtPmZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU47CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqSWYgYSBjb3VudHJ5IElFIGhhcyBiZWVuIHJlY2lldmVkIGNoZWNrIGl0cyBydWxlIGZvciB0aGlzCisJICpjaGFubmVsIGZpcnN0IGJlZm9yZSBlbmFibGluZyBhY3RpdmUgc2Nhbi4gVGhlIHBhc3NpdmUgc2NhbgorCSAqd291bGQgaGF2ZSBiZWVuIGVuZm9yY2VkIGJ5IHRoZSBpbml0aWFsIHByb2Nlc3Npbmcgb2Ygb3VyCisJICpjdXN0b20gcmVndWxhdG9yeSBkb21haW4uCisJICovCisKKwljaCA9ICZzYmFuZC0+Y2hhbm5lbHNbMTFdOwkvKiBDSCAxMiAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw5LDApKQorCXJlZ19ydWxlID0gZnJlcV9yZWdfaW5mbyh3aXBoeSwgY2gtPmNlbnRlcl9mcmVxKTsKKwlpZiAoIUlTX0VSUihyZWdfcnVsZSkpIHsKKyNlbHNlCisJciA9IGZyZXFfcmVnX2luZm8od2lwaHksIGNoLT5jZW50ZXJfZnJlcSwgYmFuZHdpZHRoLCAmcmVnX3J1bGUpOworCWlmICghcikgeworI2VuZGlmCisJCWlmICghKHJlZ19ydWxlLT5mbGFncyAmIE5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTikpCisJCQlpZiAoY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKQorCQkJCWNoLT5mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOworCX0KKworCWNoID0gJnNiYW5kLT5jaGFubmVsc1sxMl07CS8qIENIIDEzICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDksMCkpCisJcmVnX3J1bGUgPSBmcmVxX3JlZ19pbmZvKHdpcGh5LCBjaC0+Y2VudGVyX2ZyZXEpOworCWlmICghSVNfRVJSKHJlZ19ydWxlKSkgeworI2Vsc2UKKwlyID0gZnJlcV9yZWdfaW5mbyh3aXBoeSwgY2gtPmNlbnRlcl9mcmVxLCBiYW5kd2lkdGgsICZyZWdfcnVsZSk7CisJaWYgKCFyKSB7CisjZW5kaWYKKwkJaWYgKCEocmVnX3J1bGUtPmZsYWdzICYgTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOKSkKKwkJCWlmIChjaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pCisJCQkJY2gtPmZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU47CisJfQorfQorCisvKgorICpBbHdheXMgYXBwbHkgUmFkYXIvREZTIHJ1bGVzIG9uCisgKmZyZXEgcmFuZ2UgNTI2MCBNSHogLSA1NzAwIE1IegorICovCitzdGF0aWMgdm9pZCBfcnRsX3JlZ19hcHBseV9yYWRhcl9mbGFncyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSkKKwkJcmV0dXJuOworCisJc2JhbmQgPSB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fY2hhbm5lbHM7IGkrKykgeworCQljaCA9ICZzYmFuZC0+Y2hhbm5lbHNbaV07CisJCWlmICghX3J0bF9pc19yYWRhcl9mcmVxKGNoLT5jZW50ZXJfZnJlcSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKldlIGFsd2F5cyBlbmFibGUgcmFkYXIgZGV0ZWN0aW9uL0RGUyBvbiB0aGlzCisJCSAqZnJlcXVlbmN5IHJhbmdlLiBBZGRpdGlvbmFsbHkgd2UgYWxzbyBhcHBseSBvbgorCQkgKnRoaXMgZnJlcXVlbmN5IHJhbmdlOgorCQkgKi0gSWYgU1RBIG1vZGUgZG9lcyBub3QgeWV0IGhhdmUgREZTIHN1cHBvcnRzIGRpc2FibGUKKwkJICogYWN0aXZlIHNjYW5uaW5nCisJCSAqLSBJZiBhZGhvYyBtb2RlIGRvZXMgbm90IHN1cHBvcnQgREZTIHlldCB0aGVuIGRpc2FibGUKKwkJICogYWRob2MgaW4gdGhlIGZyZXF1ZW5jeS4KKwkJICotIElmIEFQIG1vZGUgZG9lcyBub3QgeWV0IHN1cHBvcnQgcmFkYXIgZGV0ZWN0aW9uL0RGUworCQkgKmRvIG5vdCBhbGxvdyBBUCBtb2RlCisJCSAqLworCQlpZiAoIShjaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpCisJCQljaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUkFEQVIgfAorCQkJICAgIElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAorCQkJICAgIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGxfcmVnX2FwcGx5X3dvcmxkX2ZsYWdzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIGVudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIGluaXRpYXRvciwKKwkJCQkgICAgICAgc3RydWN0IHJ0bF9yZWd1bGF0b3J5ICpyZWcpCit7CisJX3J0bF9yZWdfYXBwbHlfYmVhY29uaW5nX2ZsYWdzKHdpcGh5LCBpbml0aWF0b3IpOworCV9ydGxfcmVnX2FwcGx5X2FjdGl2ZV9zY2FuX2ZsYWdzKHdpcGh5LCBpbml0aWF0b3IpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgX3J0bF9kdW1wX2NoYW5uZWxfbWFwKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CisJCWlmICghd2lwaHktPmJhbmRzW2JhbmRdKQorCQkJY29udGludWU7CisJCXNiYW5kID0gd2lwaHktPmJhbmRzW2JhbmRdOworCQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKKwkJCWNoID0gJnNiYW5kLT5jaGFubmVsc1tpXTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX3J0bF9yZWdfbm90aWZpZXJfYXBwbHkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0LAorCQkJCSAgIHN0cnVjdCBydGxfcmVndWxhdG9yeSAqcmVnKQoreworCS8qIFdlIGFsd2F5cyBhcHBseSB0aGlzICovCisJX3J0bF9yZWdfYXBwbHlfcmFkYXJfZmxhZ3Mod2lwaHkpOworCisJc3dpdGNoIChyZXF1ZXN0LT5pbml0aWF0b3IpIHsKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6CisJY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRToKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSOgorCQlicmVhazsKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFOgorCQlfcnRsX3JlZ19hcHBseV93b3JsZF9mbGFncyh3aXBoeSwgcmVxdWVzdC0+aW5pdGlhdG9yLCByZWcpOworCQlicmVhazsKKwl9CisKKwlfcnRsX2R1bXBfY2hhbm5lbF9tYXAod2lwaHkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqX3J0bF9yZWdkb21haW5fc2VsZWN0KAorCQkJCQkJc3RydWN0IHJ0bF9yZWd1bGF0b3J5ICpyZWcpCit7CisJc3dpdGNoIChyZWctPmNvdW50cnlfY29kZSkgeworCWNhc2UgQ09VTlRSWV9DT0RFX0ZDQzoKKwkJcmV0dXJuICZydGxfcmVnZG9tX25vX21pZGJhbmQ7CisJY2FzZSBDT1VOVFJZX0NPREVfSUM6CisJCXJldHVybiAmcnRsX3JlZ2RvbV8xMTsKKwljYXNlIENPVU5UUllfQ09ERV9FVFNJOgorCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDX05FVEdFQVI6CisJCXJldHVybiAmcnRsX3JlZ2RvbV82MF82NDsKKwljYXNlIENPVU5UUllfQ09ERV9TUEFJTjoKKwljYXNlIENPVU5UUllfQ09ERV9GUkFOQ0U6CisJY2FzZSBDT1VOVFJZX0NPREVfSVNSQUVMOgorCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM6CisJCXJldHVybiAmcnRsX3JlZ2RvbV8xMl8xMzsKKwljYXNlIENPVU5UUllfQ09ERV9NS0s6CisJY2FzZSBDT1VOVFJZX0NPREVfTUtLMToKKwljYXNlIENPVU5UUllfQ09ERV9URUxFQzoKKwljYXNlIENPVU5UUllfQ09ERV9NSUM6CisJCXJldHVybiAmcnRsX3JlZ2RvbV8xNF82MF82NDsKKwljYXNlIENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOOgorCQlyZXR1cm4gJnJ0bF9yZWdkb21fMTQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuICZydGxfcmVnZG9tX25vX21pZGJhbmQ7CisJfQorfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDksMCkpCitzdGF0aWMgaW50IF9ydGxfcmVnZF9pbml0X3dpcGh5KHN0cnVjdCBydGxfcmVndWxhdG9yeSAqcmVnLAorCQkJCXN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJdm9pZCAoKnJlZ19ub3RpZmllcikgKHN0cnVjdCB3aXBoeSAqIHdpcGh5LAorCQkJCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICoKKwkJCQkJCSAgICAgcmVxdWVzdCkpCisjZWxzZQorc3RhdGljIGludCBfcnRsX3JlZ2RfaW5pdF93aXBoeShzdHJ1Y3QgcnRsX3JlZ3VsYXRvcnkgKnJlZywKKwkJCQlzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCWludCAoKnJlZ19ub3RpZmllcikgKHN0cnVjdCB3aXBoeSAqIHdpcGh5LAorCQkJCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICoKKwkJCQkJCSAgICAgcmVxdWVzdCkpCisjZW5kaWYKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnZDsKKworCXdpcGh5LT5yZWdfbm90aWZpZXIgPSByZWdfbm90aWZpZXI7CisKKwl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWTsKKwl3aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfU1RSSUNUX1JFR1VMQVRPUlk7CisJd2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTOworCisJcmVnZCA9IF9ydGxfcmVnZG9tYWluX3NlbGVjdChyZWcpOworCXdpcGh5X2FwcGx5X2N1c3RvbV9yZWd1bGF0b3J5KHdpcGh5LCByZWdkKTsKKwlfcnRsX3JlZ19hcHBseV9yYWRhcl9mbGFncyh3aXBoeSk7CisJX3J0bF9yZWdfYXBwbHlfd29ybGRfZmxhZ3Mod2lwaHksIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVIsIHJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY291bnRyeV9jb2RlX3RvX2VudW1fcmQgKl9ydGxfcmVnZF9maW5kX2NvdW50cnkodTE2IGNvdW50cnljb2RlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxsQ291bnRyaWVzKTsgaSsrKSB7CisJCWlmIChhbGxDb3VudHJpZXNbaV0uY291bnRyeWNvZGUgPT0gY291bnRyeWNvZGUpCisJCQlyZXR1cm4gJmFsbENvdW50cmllc1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsOSwwKSkKK2ludCBydGxfcmVnZF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgIHZvaWQgKCpyZWdfbm90aWZpZXIpIChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkpCisjZWxzZQoraW50IHJ0bF9yZWdkX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgaW50ICgqcmVnX25vdGlmaWVyKSAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKKwlzdHJ1Y3QgY291bnRyeV9jb2RlX3RvX2VudW1fcmQgKmNvdW50cnkgPSBOVUxMOworCisJaWYgKHdpcGh5ID09IE5VTEwgfHwgJnJ0bHByaXYtPnJlZ2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpbml0IGNvdW50cnlfY29kZSBmcm9tIGVmdXNlIGNoYW5uZWwgcGxhbiAqLworCXJ0bHByaXYtPnJlZ2QuY291bnRyeV9jb2RlID0gcnRscHJpdi0+ZWZ1c2UuY2hhbm5lbF9wbGFuOworCisJUlRfVFJBQ0UoQ09NUF9SRUdELCBEQkdfVFJBQ0UsCisJCSAoS0VSTl9ERUJVRyAicnRsOiBFRVBST00gcmVnZG9tYWluOiAweCUweFxuIiwKKwkJICBydGxwcml2LT5yZWdkLmNvdW50cnlfY29kZSkpOworCisJaWYgKHJ0bHByaXYtPnJlZ2QuY291bnRyeV9jb2RlID49IENPVU5UUllfQ09ERV9NQVgpIHsKKwkJUlRfVFJBQ0UoQ09NUF9SRUdELCBEQkdfRE1FU0csCisJCQkgKEtFUk5fREVCVUcgInJ0bDogRUVQUk9NIGluZGljYXRlcyBpbnZhbGlkIGNvbnRyeSBjb2RlIgorCQkJICAid29ybGQgd2lkZSAxMyBzaG91bGQgYmUgdXNlZFxuIikpOworCisJCXJ0bHByaXYtPnJlZ2QuY291bnRyeV9jb2RlID0gQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM7CisJfQorCisJY291bnRyeSA9IF9ydGxfcmVnZF9maW5kX2NvdW50cnkocnRscHJpdi0+cmVnZC5jb3VudHJ5X2NvZGUpOworCisJaWYgKGNvdW50cnkpIHsKKwkJcnRscHJpdi0+cmVnZC5hbHBoYTJbMF0gPSBjb3VudHJ5LT5pc29fbmFtZVswXTsKKwkJcnRscHJpdi0+cmVnZC5hbHBoYTJbMV0gPSBjb3VudHJ5LT5pc29fbmFtZVsxXTsKKwl9IGVsc2UgeworCQlydGxwcml2LT5yZWdkLmFscGhhMlswXSA9ICcwJzsKKwkJcnRscHJpdi0+cmVnZC5hbHBoYTJbMV0gPSAnMCc7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9SRUdELCBEQkdfVFJBQ0UsCisJCSAoS0VSTl9ERUJVRyAicnRsOiBDb3VudHJ5IGFscGhhMiBiZWluZyB1c2VkOiAlYyVjXG4iLAorCQkgIHJ0bHByaXYtPnJlZ2QuYWxwaGEyWzBdLCBydGxwcml2LT5yZWdkLmFscGhhMlsxXSkpOworCisJX3J0bF9yZWdkX2luaXRfd2lwaHkoJnJ0bHByaXYtPnJlZ2QsIHdpcGh5LCByZWdfbm90aWZpZXIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsOSwwKSkKK3ZvaWQgcnRsX3JlZ19ub3RpZmllcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gd2lwaHlfdG9faWVlZTgwMjExX2h3KHdpcGh5KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlSVF9UUkFDRShDT01QX1JFR0QsIERCR19MT1VELCAoIlxuIikpOworCisJX3J0bF9yZWdfbm90aWZpZXJfYXBwbHkod2lwaHksIHJlcXVlc3QsICZydGxwcml2LT5yZWdkKTsKK30KKyNlbHNlCitpbnQgcnRsX3JlZ19ub3RpZmllcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gd2lwaHlfdG9faWVlZTgwMjExX2h3KHdpcGh5KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlSVF9UUkFDRShDT01QX1JFR0QsIERCR19MT1VELCAoIlxuIikpOworCisJcmV0dXJuIF9ydGxfcmVnX25vdGlmaWVyX2FwcGx5KHdpcGh5LCByZXF1ZXN0LCAmcnRscHJpdi0+cmVnZCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMX1JFR0RfSF9fCisjZGVmaW5lIF9fUlRMX1JFR0RfSF9fCisKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fTk9fSUJTUwkJMTw8MgorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4JMTw8MQorI2RlZmluZSBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZCUJJVCgwKQorI2RlZmluZSBXSVBIWV9GTEFHX1NUUklDVF9SRUdVTEFUT1JZCUJJVCgxKQorI2RlZmluZSBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTCUJJVCgyKQorCitzdHJ1Y3QgY291bnRyeV9jb2RlX3RvX2VudW1fcmQgeworCXUxNiBjb3VudHJ5Y29kZTsKKwljb25zdCBjaGFyICppc29fbmFtZTsKK307CisKK2VudW0gY291bnRyeV9jb2RlX3R5cGVfdCB7CisJQ09VTlRSWV9DT0RFX0ZDQyA9IDAsCisJQ09VTlRSWV9DT0RFX0lDID0gMSwKKwlDT1VOVFJZX0NPREVfRVRTSSA9IDIsCisJQ09VTlRSWV9DT0RFX1NQQUlOID0gMywKKwlDT1VOVFJZX0NPREVfRlJBTkNFID0gNCwKKwlDT1VOVFJZX0NPREVfTUtLID0gNSwKKwlDT1VOVFJZX0NPREVfTUtLMSA9IDYsCisJQ09VTlRSWV9DT0RFX0lTUkFFTCA9IDcsCisJQ09VTlRSWV9DT0RFX1RFTEVDID0gOCwKKwlDT1VOVFJZX0NPREVfTUlDID0gOSwKKwlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTiA9IDEwLAorCUNPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzID0gMTEsCisJQ09VTlRSWV9DT0RFX1RFTEVDX05FVEdFQVIgPSAxMiwKKworCS8qYWRkIG5ldyBjaGFubmVsIHBsYW4gYWJvdmUgdGhpcyBsaW5lICovCisJQ09VTlRSWV9DT0RFX01BWAorfTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw5LDApKQoraW50IHJ0bF9yZWdkX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgdm9pZCAoKnJlZ19ub3RpZmllcikgKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KSk7Cit2b2lkIHJ0bF9yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCk7CisjZWxzZQoraW50IHJ0bF9yZWdkX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgaW50ICgqcmVnX25vdGlmaWVyKSAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkpOworaW50IHJ0bF9yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9idGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YWMxODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9idGMuaApAQCAtMCwwICsxLDg3IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiogbW9yZSBkZXRhaWxzLgorICoqCisgKiogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICoqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICoqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoqCisgKiogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqKgorICoqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9CVENfSF9fCisjZGVmaW5lIF9fUlRMODgyMUFFX0JUQ19IX18KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICJoYWxfYnRfY29leGlzdC5oIgorCitzdHJ1Y3QgYnRfY29leGlzdF9jMmhfaW5mbyB7CisJdTggbm9fcGFyc2VfYzJoOworCXU4IGhhc19jMmg7Cit9OworCitzdHJ1Y3QgYnRkbV84ODIxYWUgeworCWJvb2wgYl9hbGxfb2ZmOworCWJvb2wgYl9hZ2NfdGFibGVfZW47CisJYm9vbCBiX2FkY19iYWNrX29mZl9vbjsKKwlib29sIGIyX2FudF9oaWRfZW47CisJYm9vbCBiX2xvd19wZW5hbHR5X3JhdGVfYWRhcHRpdmU7CisJYm9vbCBiX3JmX3J4X2xwZl9zaHJpbms7CisJYm9vbCBiX3JlamVjdF9hZ2dyZV9wa3Q7CisJYm9vbCBiX3RyYV90ZG1hX29uOworCXU4IHRyYV90ZG1hX25hdjsKKwl1OCB0cmFfdGRtYV9hbnQ7CisJYm9vbCBiX3RkbWFfb247CisJdTggdGRtYV9hbnQ7CisJdTggdGRtYV9uYXY7CisJdTggdGRtYV9kYWNfc3dpbmc7CisJdTggZndfZGFjX3N3aW5nX2x2bDsKKwlib29sIGJfcHNfdGRtYV9vbjsKKwl1OCBwc190ZG1hX2J5dGVbNV07CisJYm9vbCBiX3B0YV9vbjsKKwl1MzIgdmFsXzB4NmMwOworCXUzMiB2YWxfMHg2Yzg7CisJdTMyIHZhbF8weDZjYzsKKwlib29sIGJfc3dfZGFjX3N3aW5nX29uOworCXUzMiBzd19kYWNfc3dpbmdfbHZsOworCXUzMiB3bGFuX2FjdF9oaTsKKwl1MzIgd2xhbl9hY3RfbG87CisJdTMyIGJ0X3JldHJ5X2luZGV4OworCWJvb2wgYl9kZWNfYnRfcHdyOworCWJvb2wgYl9pZ25vcmVfd2xhbl9hY3Q7Cit9OworCitzdHJ1Y3QgYnRfY29leGlzdF84ODIxYWUgeworCXUzMiBoaWdoX3ByaW9yaXR5X3R4OworCXUzMiBoaWdoX3ByaW9yaXR5X3J4OworCXUzMiBsb3dfcHJpb3JpdHlfdHg7CisJdTMyIGxvd19wcmlvcml0eV9yeDsKKwl1OCBjMmhfYnRfaW5mbzsKKwlib29sIGJfYzJoX2J0X2luZm9fcmVxX3NlbnQ7CisJYm9vbCBiX2MyaF9idF9pbnF1aXJ5X3BhZ2U7CisJdTMyIGJ0X2lucV9wYWdlX3N0YXJ0X3RpbWU7CisJdTggYnRfcmV0cnlfY250OworCXU4IGMyaF9idF9pbmZvX29yaWdpbmFsOworCXU4IGJ0X2lucXVpcnlfcGFnZV9jbnQ7CisJc3RydWN0IGJ0ZG1fODgyMWFlIGJ0ZG07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlYmRlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RlZi5oCkBAIC0wLDAgKzEsNDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9ERUZfSF9fCisjZGVmaW5lIF9fUlRMODgyMUFFX0RFRl9IX18KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEJJVCA3IEhUIFJhdGUqLworLypUeEhUID0gMCovCisjZGVmaW5lCU1HTl8xTQkJCQkweDAyCisjZGVmaW5lCU1HTl8yTQkJCQkweDA0CisjZGVmaW5lCU1HTl81XzVNCQkJMHgwYgorI2RlZmluZQlNR05fMTFNCQkJCTB4MTYKKworI2RlZmluZQlNR05fNk0JCQkJMHgwYworI2RlZmluZQlNR05fOU0JCQkJMHgxMgorI2RlZmluZQlNR05fMTJNCQkJCTB4MTgKKyNkZWZpbmUJTUdOXzE4TQkJCQkweDI0CisjZGVmaW5lCU1HTl8yNE0JCQkJMHgzMAorI2RlZmluZQlNR05fMzZNCQkJCTB4NDgKKyNkZWZpbmUJTUdOXzQ4TQkJCQkweDYwCisjZGVmaW5lCU1HTl81NE0JCQkJMHg2YworCisvLyBUeEhUID0gMQorI2RlZmluZQlNR05fTUNTMAkJCTB4ODAKKyNkZWZpbmUJTUdOX01DUzEJCQkweDgxCisjZGVmaW5lCU1HTl9NQ1MyCQkJMHg4MgorI2RlZmluZQlNR05fTUNTMwkJCTB4ODMKKyNkZWZpbmUJTUdOX01DUzQJCQkweDg0CisjZGVmaW5lCU1HTl9NQ1M1CQkJMHg4NQorI2RlZmluZQlNR05fTUNTNgkJCTB4ODYKKyNkZWZpbmUJTUdOX01DUzcJCQkweDg3CisjZGVmaW5lCU1HTl9NQ1M4CQkJMHg4OAorI2RlZmluZQlNR05fTUNTOQkJCTB4ODkKKyNkZWZpbmUJTUdOX01DUzEwCQkJMHg4YQorI2RlZmluZQlNR05fTUNTMTEJCQkweDhiCisjZGVmaW5lCU1HTl9NQ1MxMgkJCTB4OGMKKyNkZWZpbmUJTUdOX01DUzEzCQkJMHg4ZAorI2RlZmluZQlNR05fTUNTMTQJCQkweDhlCisjZGVmaW5lCU1HTl9NQ1MxNQkJCTB4OGYKKy8vVkhUIHJhdGUKKyNkZWZpbmUJTUdOX1ZIVDFTU19NQ1MwCQkweDkwCisjZGVmaW5lCU1HTl9WSFQxU1NfTUNTMQkJMHg5MQorI2RlZmluZQlNR05fVkhUMVNTX01DUzIJCTB4OTIKKyNkZWZpbmUJTUdOX1ZIVDFTU19NQ1MzCQkweDkzCisjZGVmaW5lCU1HTl9WSFQxU1NfTUNTNAkJMHg5NAorI2RlZmluZQlNR05fVkhUMVNTX01DUzUJCTB4OTUKKyNkZWZpbmUJTUdOX1ZIVDFTU19NQ1M2CQkweDk2CisjZGVmaW5lCU1HTl9WSFQxU1NfTUNTNwkJMHg5NworI2RlZmluZQlNR05fVkhUMVNTX01DUzgJCTB4OTgKKyNkZWZpbmUJTUdOX1ZIVDFTU19NQ1M5CQkweDk5CisjZGVmaW5lCU1HTl9WSFQyU1NfTUNTMAkJMHg5YQorI2RlZmluZQlNR05fVkhUMlNTX01DUzEJCTB4OWIKKyNkZWZpbmUJTUdOX1ZIVDJTU19NQ1MyCQkweDljCisjZGVmaW5lCU1HTl9WSFQyU1NfTUNTMwkJMHg5ZAorI2RlZmluZQlNR05fVkhUMlNTX01DUzQJCTB4OWUKKyNkZWZpbmUJTUdOX1ZIVDJTU19NQ1M1CQkweDlmCisjZGVmaW5lCU1HTl9WSFQyU1NfTUNTNgkJMHhhMAorI2RlZmluZQlNR05fVkhUMlNTX01DUzcJCTB4YTEKKyNkZWZpbmUJTUdOX1ZIVDJTU19NQ1M4CQkweGEyCisjZGVmaW5lCU1HTl9WSFQyU1NfTUNTOQkJMHhhMworCisjZGVmaW5lCU1HTl9WSFQzU1NfTUNTMAkJMHhhNAorI2RlZmluZQlNR05fVkhUM1NTX01DUzEJCTB4YTUKKyNkZWZpbmUJTUdOX1ZIVDNTU19NQ1MyCQkweGE2CisjZGVmaW5lCU1HTl9WSFQzU1NfTUNTMwkJMHhhNworI2RlZmluZQlNR05fVkhUM1NTX01DUzQJCTB4YTgKKyNkZWZpbmUJTUdOX1ZIVDNTU19NQ1M1CQkweGE5CisjZGVmaW5lCU1HTl9WSFQzU1NfTUNTNgkJMHhhYQorI2RlZmluZQlNR05fVkhUM1NTX01DUzcJCTB4YWIKKyNkZWZpbmUJTUdOX1ZIVDNTU19NQ1M4CQkweGFjCisjZGVmaW5lCU1HTl9WSFQzU1NfTUNTOQkJMHhhZAorCisjZGVmaW5lCU1HTl9NQ1MwX1NHCQkJMHhjMAorI2RlZmluZQlNR05fTUNTMV9TRwkJCTB4YzEKKyNkZWZpbmUJTUdOX01DUzJfU0cJCQkweGMyCisjZGVmaW5lCU1HTl9NQ1MzX1NHCQkJMHhjMworI2RlZmluZQlNR05fTUNTNF9TRwkJCTB4YzQKKyNkZWZpbmUJTUdOX01DUzVfU0cJCQkweGM1CisjZGVmaW5lCU1HTl9NQ1M2X1NHCQkJMHhjNgorI2RlZmluZQlNR05fTUNTN19TRwkJCTB4YzcKKyNkZWZpbmUJTUdOX01DUzhfU0cJCQkweGM4CisjZGVmaW5lCU1HTl9NQ1M5X1NHCQkJMHhjOQorI2RlZmluZQlNR05fTUNTMTBfU0cJCTB4Y2EKKyNkZWZpbmUJTUdOX01DUzExX1NHCQkweGNiCisjZGVmaW5lCU1HTl9NQ1MxMl9TRwkJMHhjYworI2RlZmluZQlNR05fTUNTMTNfU0cJCTB4Y2QKKyNkZWZpbmUJTUdOX01DUzE0X1NHCQkweGNlCisjZGVmaW5lCU1HTl9NQ1MxNV9TRwkJMHhjZgorCisjZGVmaW5lCU1HTl9VTktOT1dOCQkJMHhmZgorCisKKy8qIDMwIG1zICovCisjZGVmaW5lCVdJRklfTkFWX1VQUEVSX1VTCQkJCTMwMDAwCisjZGVmaW5lIEhBTF85MkNfTkFWX1VQUEVSX1VOSVQJCQkxMjgKKworI2RlZmluZSBIQUxfUkVUUllfTElNSVRfSU5GUkEJCQkJNDgKKyNkZWZpbmUgSEFMX1JFVFJZX0xJTUlUX0FQX0FESE9DCQkJNworCisjZGVmaW5lIFJFU0VUX0RFTEFZXzgxODUJCQkJCTIwCisKKyNkZWZpbmUgUlRfSUJTU19JTlRfTUFTS1MJKElNUl9CQ05JTlQgfCBJTVJfVEJET0sgfCBJTVJfVEJERVIpCisjZGVmaW5lIFJUX0FDX0lOVF9NQVNLUwkJKElNUl9WSURPSyB8IElNUl9WT0RPSyB8IElNUl9CRURPS3xJTVJfQktET0spCisKKyNkZWZpbmUgTlVNX09GX0ZJUk1XQVJFX1FVRVVFCQkJCTEwCisjZGVmaW5lIE5VTV9PRl9QQUdFU19JTl9GVwkJCQkJMHgxMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJCQkweDA3CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCQkJMHgwNworI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkJCTB4MDcKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JCQkweDA3CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJCTB4MAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJCQkweDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkJMHgwMgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9ISUdICQkweDAyCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkJCTB4MgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJCQkweEExCisKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQktfRFRNCQkweDAyNgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRV9EVE0JCTB4MDQ4CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJX0RUTQkJMHgwNDgKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk9fRFRNCQkweDAyNgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUJfRFRNCQkweDAwCisKKyNkZWZpbmUgTUFYX1JYX0RNQV9CVUZGRVJfU0laRQkJCQkweDNFODAKKworCisjZGVmaW5lIE1BWF9MSU5FU19IV0NPTkZJR19UWFQJCQkJMTAwMAorI2RlZmluZSBNQVhfQllURVNfTElORV9IV0NPTkZJR19UWFQJCQkyNTYKKworI2RlZmluZSBTV19USFJFRV9XSVJFCQkJCQkJMAorI2RlZmluZSBIV19USFJFRV9XSVJFCQkJCQkJMgorCisjZGVmaW5lIEJUX0RFTU9fQk9BUkQJCQkJCQkwCisjZGVmaW5lIEJUX1FBX0JPQVJECQkJCQkJCTEKKyNkZWZpbmUgQlRfRlBHQQkJCQkJCQkJMgorCisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKKyNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQorI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCisKKyNkZWZpbmUgTUFYX0gyQ19RVUVVRV9OVU0JCQkJCTEwCisKKyNkZWZpbmUgUlhfTVBEVV9RVUVVRQkJCQkJCTAKKyNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCQkJMQorI2RlZmluZSBSWF9NQVhfUVVFVUUJCQkJCQkyCisjZGVmaW5lIEFDMlFVRVVFSUQoX0FDKQkJCQkJCShfQUMpCisKKyNkZWZpbmUJQzJIX1JYX0NNRF9IRFJfTEVOCQkJCQk4CisjZGVmaW5lCUdFVF9DMkhfQ01EX0NNRF9MRU4oX19wcnhoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoX19wcnhoZHIpLCAwLCAxNikKKyNkZWZpbmUJR0VUX0MySF9DTURfRUxFTUVOVF9JRChfX3ByeGhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKF9fcHJ4aGRyKSwgMTYsIDgpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0NNRF9TRVEoX19wcnhoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoX19wcnhoZHIpLCAyNCwgNykKKyNkZWZpbmUJR0VUX0MySF9DTURfQ09OVElOVUUoX19wcnhoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoX19wcnhoZHIpLCAzMSwgMSkKKyNkZWZpbmUJR0VUX0MySF9DTURfQ09OVEVOVChfX3ByeGhkcikJCVwKKwkoKHU4KikoX19wcnhoZHIpICsgQzJIX1JYX0NNRF9IRFJfTEVOKQorCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0VMRU1FTlRfSUQoX19wY21kZmJoZHIpCVwKKwlMRV9CSVRTX1RPXzRCWVRFKChfX3BjbWRmYmhkciksIDAsIDgpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9MRU4oX19wY21kZmJoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoX19wY21kZmJoZHIpLCA4LCA4KQorI2RlZmluZQlHRVRfQzJIX0NNRF9GRUVEQkFDS19DQ1hfQ01EX0NOVChfX3BjbWRmYmhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKF9fcGNtZGZiaGRyKSwgMTYsIDE2KQorI2RlZmluZQlHRVRfQzJIX0NNRF9GRUVEQkFDS19DQ1hfTUFDX0lEKF9fcGNtZGZiaGRyKQlcCisJTEVfQklUU19UT180QllURSgoKF9fcGNtZGZiaGRyKSArIDQpLCAwLCA1KQorI2RlZmluZQlHRVRfQzJIX0NNRF9GRUVEQkFDS19DQ1hfVkFMSUQoX19wY21kZmJoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoKF9fcGNtZGZiaGRyKSArIDQpLCA3LCAxKQorI2RlZmluZQlHRVRfQzJIX0NNRF9GRUVEQkFDS19DQ1hfUkVUUllfQ05UKF9fcGNtZGZiaGRyKQlcCisJTEVfQklUU19UT180QllURSgoKF9fcGNtZGZiaGRyKSArIDQpLCA4LCA1KQorI2RlZmluZQlHRVRfQzJIX0NNRF9GRUVEQkFDS19DQ1hfVE9LKF9fcGNtZGZiaGRyKQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgMTUsIDEpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9RU0VMKF9fcGNtZGZiaGRyKQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgMTYsIDQpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9TRVEoX19wY21kZmJoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoKF9fcGNtZGZiaGRyKSArIDQpLCAyMCwgMTIpCisKKyNkZWZpbmUgQ0hJUF9CT05ESU5HX0lERU5USUZJRVIoX3ZhbHVlKQkoKChfdmFsdWUpPj4yMikmMHgzKQorCisjZGVmaW5lIENISVBfODgxMgkJCQlCSVQoMikKKyNkZWZpbmUgQ0hJUF84ODIxCQkJCShCSVQoMCl8QklUKDIpKQorCisjZGVmaW5lIENISVBfODgyMUEJCQkJCQkoQklUKDApfEJJVCgyKSkKKyNkZWZpbmUgTk9STUFMX0NISVAgIAkJCQkJQklUKDMpCisjZGVmaW5lIFJGX1RZUEVfMVQxUgkJCQkJKH4oQklUKDQpfEJJVCg1KXxCSVQoNikpKQorI2RlZmluZSBSRl9UWVBFXzFUMlIJCQkJCUJJVCg0KQorI2RlZmluZSBSRl9UWVBFXzJUMlIJCQkJCUJJVCg1KQorI2RlZmluZSBDSElQX1ZFTkRPUl9VTUMJCQkJCUJJVCg3KQorI2RlZmluZSBCX0NVVF9WRVJTSU9OCQkJCQlCSVQoMTIpCisjZGVmaW5lIENfQ1VUX1ZFUlNJT04JCQkJCUJJVCgxMykKKyNkZWZpbmUgRF9DVVRfVkVSU0lPTgkJCQkJKChCSVQoMTIpfEJJVCgxMykpKQorI2RlZmluZSBFX0NVVF9WRVJTSU9OCQkJCQlCSVQoMTQpCisjZGVmaW5lCVJGX1JMX0lECQkJCQkJKEJJVCgzMSl8QklUKDMwKXxCSVQoMjkpfEJJVCgyOCkpCisKKworCitlbnVtIHZlcnNpb25fODgyMWFlIHsKKwlWRVJTSU9OX1RFU1RfQ0hJUF8xVDFSXzg4MTIgPSAweDAwMDQsCisJVkVSU0lPTl9URVNUX0NISVBfMlQyUl84ODEyID0gMHgwMDI0LAorCVZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF8xVDFSXzg4MTIgPSAweDEwMGMsCisJVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzJUMlJfODgxMiA9IDB4MTAyYywKKwlWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfMVQxUl84ODEyX0NfQ1VUID0gMHgyMDBjLAorCVZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF8yVDJSXzg4MTJfQ19DVVQgPSAweDIwMmMsCisJVkVSU0lPTl9URVNUX0NISVBfODgyMSA9IDB4MDAwNSwKKwlWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfODgyMSA9IDB4MDAwZCwKKwlWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfODgyMV9CX0NVVCA9IDB4MTAwZCwKKwlWRVJTSU9OX1VOS05PV04gPSAweEZGLAorfTsKKworZW51bSB2aHRfZGF0YV9zY3sKKwlWSFRfREFUQV9TQ19ET05PVF9DQVJFID0gMCwKKwlWSFRfREFUQV9TQ18yMF9VUFBFUl9PRl84ME1IWiA9IDEsCisJVkhUX0RBVEFfU0NfMjBfTE9XRVJfT0ZfODBNSFogPSAyLAorCVZIVF9EQVRBX1NDXzIwX1VQUEVSU1RfT0ZfODBNSFogPSAzLAorCVZIVF9EQVRBX1NDXzIwX0xPV0VTVF9PRl84ME1IWiA9IDQsCisJVkhUX0RBVEFfU0NfMjBfUkVDVjEgPSA1LAorCVZIVF9EQVRBX1NDXzIwX1JFQ1YyID0gNiwKKwlWSFRfREFUQV9TQ18yMF9SRUNWMyA9IDcsCisJVkhUX0RBVEFfU0NfMjBfUkVDVjQgPSA4LAorCVZIVF9EQVRBX1NDXzQwX1VQUEVSX09GXzgwTUhaID0gOSwKKwlWSFRfREFUQV9TQ180MF9MT1dFUl9PRl84ME1IWiA9IDEwLAorfTsKKworCisvKiBNQVNLICovCisjZGVmaW5lIElDX1RZUEVfTUFTSwkJCQkJKEJJVCgwKXxCSVQoMSl8QklUKDIpKQorI2RlZmluZSBDSElQX1RZUEVfTUFTSyAJCQkJCUJJVCgzKQorI2RlZmluZSBSRl9UWVBFX01BU0sJCQkJCShCSVQoNCl8QklUKDUpfEJJVCg2KSkKKyNkZWZpbmUgTUFOVUZBQ1RVRVJfTUFTSwkJCQlCSVQoNykKKyNkZWZpbmUgUk9NX1ZFUlNJT05fTUFTSwkJCQkoQklUKDExKXxCSVQoMTApfEJJVCg5KXxCSVQoOCkpCisjZGVmaW5lIENVVF9WRVJTSU9OX01BU0sJCQkJKEJJVCgxNSl8QklUKDE0KXxCSVQoMTMpfEJJVCgxMikpCisKKy8qIEdldCBlbGVtZW50ICovCisjZGVmaW5lIEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikJCQkoKHZlcnNpb24pICYgSUNfVFlQRV9NQVNLKQorI2RlZmluZSBHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikJCQkoKHZlcnNpb24pICYgQ0hJUF9UWVBFX01BU0spCisjZGVmaW5lIEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikJCQkoKHZlcnNpb24pICYgUkZfVFlQRV9NQVNLKQorI2RlZmluZSBHRVRfQ1ZJRF9NQU5VRkFDVFVFUih2ZXJzaW9uKQkJKCh2ZXJzaW9uKSAmIE1BTlVGQUNUVUVSX01BU0spCisjZGVmaW5lIEdFVF9DVklEX1JPTV9WRVJTSU9OKHZlcnNpb24pCQkoKHZlcnNpb24pICYgUk9NX1ZFUlNJT05fTUFTSykKKyNkZWZpbmUgR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikJCSgodmVyc2lvbikgJiBDVVRfVkVSU0lPTl9NQVNLKQorCisjZGVmaW5lIElTXzFUMVIodmVyc2lvbikJCQkoKEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikpPyBmYWxzZSA6IHRydWUpCisjZGVmaW5lIElTXzFUMlIodmVyc2lvbikJCQkoKEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikgPT0gUkZfVFlQRV8xVDJSKVwKKwkJCQkJCQkJCT8gdHJ1ZSA6IGZhbHNlKQorI2RlZmluZSBJU18yVDJSKHZlcnNpb24pCQkJKChHRVRfQ1ZJRF9SRl9UWVBFKHZlcnNpb24pID09IFJGX1RZUEVfMlQyUilcCisJCQkJCQkJCQk/IHRydWUgOiBmYWxzZSkKKworI2RlZmluZSBJU184ODEyX1NFUklFUyh2ZXJzaW9uKQkJCSgoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzg4MTIpPyBcCisJCQkJCQkJCQkJdHJ1ZSA6IGZhbHNlKQorI2RlZmluZSBJU184ODIxX1NFUklFUyh2ZXJzaW9uKQkJCSgoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzg4MjEpPyBcCisJCQkJCQkJCQkJdHJ1ZSA6IGZhbHNlKQorCisjZGVmaW5lIElTX1ZFTkRPUl84ODEyQV9URVNUX0NISVAodmVyc2lvbikJKChJU184ODEyX1NFUklFUyh2ZXJzaW9uKSkgPyBcCisJCQkJCQkJCQkJCQkoKElTX05PUk1BTF9DSElQKHZlcnNpb24pKSA/IFwKKwkJCQkJCQkJCQkJCWZhbHNlIDogdHJ1ZSkgOiBmYWxzZSkKKyNkZWZpbmUgSVNfVkVORE9SXzg4MTJBX01QX0NISVAodmVyc2lvbikJCSgoSVNfODgxMl9TRVJJRVModmVyc2lvbikpID8gXAorCQkJCQkJCQkJCQkJKChJU19OT1JNQUxfQ0hJUCh2ZXJzaW9uKSkgPyBcCisJCQkJCQkJCQkJCQl0cnVlIDogZmFsc2UpIDogZmFsc2UpCisjZGVmaW5lIElTX1ZFTkRPUl84ODEyQV9DX0NVVCh2ZXJzaW9uKQkJKChJU184ODEyX1NFUklFUyh2ZXJzaW9uKSkgPyBcCisJCQkJCQkJCQkJCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQ19DVVRfVkVSU0lPTikgPyBcCisJCQkJCQkJCQkJCXRydWUgOiBmYWxzZSkgOiBmYWxzZSkKKworI2RlZmluZSBJU19WRU5ET1JfODgyMUFfVEVTVF9DSElQKHZlcnNpb24pCSgoSVNfODgyMV9TRVJJRVModmVyc2lvbikpID8gXAorCQkJCQkJCQkJCQkJKChJU19OT1JNQUxfQ0hJUCh2ZXJzaW9uKSkgPyBcCisJCQkJCQkJCQkJCQlmYWxzZSA6IHRydWUpIDogZmFsc2UpCisjZGVmaW5lIElTX1ZFTkRPUl84ODIxQV9NUF9DSElQKHZlcnNpb24pCQkoKElTXzg4MjFfU0VSSUVTKHZlcnNpb24pKSA/IFwKKwkJCQkJCQkJCQkJCSgoSVNfTk9STUFMX0NISVAodmVyc2lvbikpID8gXAorCQkJCQkJCQkJCQkJdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKQorI2RlZmluZSBJU19WRU5ET1JfODgyMUFfQl9DVVQodmVyc2lvbikJCSgoSVNfODgyMV9TRVJJRVModmVyc2lvbikpID8gXAorCQkJCQkJCQkJCQkJKChHRVRfQ1ZJRF9DVVRfVkVSU0lPTih2ZXJzaW9uKSA9PSBCX0NVVF9WRVJTSU9OKSA/IFwKKwkJCQkJCQkJCQkJCXRydWUgOiBmYWxzZSkgOiBmYWxzZSkKKworCitlbnVtIHJmX29wdHlwZSB7CisJUkZfT1BfQllfU1dfM1dJUkUgPSAwLAorCVJGX09QX0JZX0ZXLAorCVJGX09QX01BWAorfTsKKworZW51bSByZl9wb3dlcl9zdGF0ZSB7CisJUkZfT04sCisJUkZfT0ZGLAorCVJGX1NMRUVQLAorCVJGX1NIVVRfRE9XTiwKK307CisKK2VudW0gcG93ZXJfc2F2ZV9tb2RlIHsKKwlQT1dFUl9TQVZFX01PREVfQUNUSVZFLAorCVBPV0VSX1NBVkVfTU9ERV9TQVZFLAorfTsKKworZW51bSBwb3dlcl9wb2xvY3lfY29uZmlnIHsKKwlQT1dFUkNGR19NQVhfUE9XRVJfU0FWSU5HUywKKwlQT1dFUkNGR19HTE9CQUxfUE9XRVJfU0FWSU5HUywKKwlQT1dFUkNGR19MT0NBTF9QT1dFUl9TQVZJTkdTLAorCVBPV0VSQ0ZHX0xFTk9WTywKK307CisKK2VudW0gaW50ZXJmYWNlX3NlbGVjdF9wY2kgeworCUlOVEZfU0VMMV9NSU5JQ0FSRCA9IDAsCisJSU5URl9TRUwwX1BDSUUgPSAxLAorCUlOVEZfU0VMMl9SU1YgPSAyLAorCUlOVEZfU0VMM19SU1YgPSAzLAorfTsKKworZW51bSBoYWxfZndfYzJoX2NtZF9pZCB7CisJSEFMX0ZXX0MySF9DTURfUmVhZF9NQUNSRUcgPSAwLAorCUhBTF9GV19DMkhfQ01EX1JlYWRfQkJSRUcgPSAxLAorCUhBTF9GV19DMkhfQ01EX1JlYWRfUkZSRUcgPSAyLAorCUhBTF9GV19DMkhfQ01EX1JlYWRfRUVQUk9NID0gMywKKwlIQUxfRldfQzJIX0NNRF9SZWFkX0VGVVNFID0gNCwKKwlIQUxfRldfQzJIX0NNRF9SZWFkX0NBTSA9IDUsCisJSEFMX0ZXX0MySF9DTURfR2V0X0Jhc2ljUmF0ZSA9IDYsCisJSEFMX0ZXX0MySF9DTURfR2V0X0RhdGFSYXRlID0gNywKKwlIQUxfRldfQzJIX0NNRF9TdXJ2ZXkgPSA4LAorCUhBTF9GV19DMkhfQ01EX1N1cnZleURvbmUgPSA5LAorCUhBTF9GV19DMkhfQ01EX0pvaW5Cc3MgPSAxMCwKKwlIQUxfRldfQzJIX0NNRF9BZGRTVEEgPSAxMSwKKwlIQUxfRldfQzJIX0NNRF9EZWxTVEEgPSAxMiwKKwlIQUxfRldfQzJIX0NNRF9BdGltRG9uZSA9IDEzLAorCUhBTF9GV19DMkhfQ01EX1RYX1JlcG9ydCA9IDE0LAorCUhBTF9GV19DMkhfQ01EX0NDWF9SZXBvcnQgPSAxNSwKKwlIQUxfRldfQzJIX0NNRF9EVE1fUmVwb3J0ID0gMTYsCisJSEFMX0ZXX0MySF9DTURfVFhfUmF0ZV9TdGF0aXN0aWNzID0gMTcsCisJSEFMX0ZXX0MySF9DTURfQzJITEJLID0gMTgsCisJSEFMX0ZXX0MySF9DTURfQzJIREJHID0gMTksCisJSEFMX0ZXX0MySF9DTURfQzJIRkVFREJBQ0sgPSAyMCwKKwlIQUxfRldfQzJIX0NNRF9NQVgKK307CisKK2VudW0gcnRsX2Rlc2NfcXNlbCB7CisJUVNMVF9CSyA9IDB4MiwKKwlRU0xUX0JFID0gMHgwLAorCVFTTFRfVkkgPSAweDUsCisJUVNMVF9WTyA9IDB4NywKKwlRU0xUX0JFQUNPTiA9IDB4MTAsCisJUVNMVF9ISUdIID0gMHgxMSwKKwlRU0xUX01HTlQgPSAweDEyLAorCVFTTFRfQ01EID0gMHgxMywKK307CisKK2VudW0gcnRsX2Rlc2M4ODIxYWVfcmF0ZSB7CisJREVTQ19SQVRFMU0gPSAweDAwLAorCURFU0NfUkFURTJNID0gMHgwMSwKKwlERVNDX1JBVEU1XzVNID0gMHgwMiwKKwlERVNDX1JBVEUxMU0gPSAweDAzLAorCisJREVTQ19SQVRFNk0gPSAweDA0LAorCURFU0NfUkFURTlNID0gMHgwNSwKKwlERVNDX1JBVEUxMk0gPSAweDA2LAorCURFU0NfUkFURTE4TSA9IDB4MDcsCisJREVTQ19SQVRFMjRNID0gMHgwOCwKKwlERVNDX1JBVEUzNk0gPSAweDA5LAorCURFU0NfUkFURTQ4TSA9IDB4MGEsCisJREVTQ19SQVRFNTRNID0gMHgwYiwKKworCURFU0NfUkFURU1DUzAgPSAweDBjLAorCURFU0NfUkFURU1DUzEgPSAweDBkLAorCURFU0NfUkFURU1DUzIgPSAweDBlLAorCURFU0NfUkFURU1DUzMgPSAweDBmLAorCURFU0NfUkFURU1DUzQgPSAweDEwLAorCURFU0NfUkFURU1DUzUgPSAweDExLAorCURFU0NfUkFURU1DUzYgPSAweDEyLAorCURFU0NfUkFURU1DUzcgPSAweDEzLAorCURFU0NfUkFURU1DUzggPSAweDE0LAorCURFU0NfUkFURU1DUzkgPSAweDE1LAorCURFU0NfUkFURU1DUzEwID0gMHgxNiwKKwlERVNDX1JBVEVNQ1MxMSA9IDB4MTcsCisJREVTQ19SQVRFTUNTMTIgPSAweDE4LAorCURFU0NfUkFURU1DUzEzID0gMHgxOSwKKwlERVNDX1JBVEVNQ1MxNCA9IDB4MWEsCisJREVTQ19SQVRFTUNTMTUgPSAweDFiLAorCURFU0NfUkFURVZIVDFTU19NQ1MwID0gMHgxYywKKwlERVNDX1JBVEVWSFQxU1NfTUNTMSA9IDB4MWQsCisJREVTQ19SQVRFVkhUMVNTX01DUzIgPSAweDFlLAorCURFU0NfUkFURVZIVDFTU19NQ1MzID0gMHgxZiwKKwlERVNDX1JBVEVWSFQxU1NfTUNTNCA9IDB4MjAsCisJREVTQ19SQVRFVkhUMVNTX01DUzUgPSAweDIxLAorCURFU0NfUkFURVZIVDFTU19NQ1M2ID0gMHgyMiwKKwlERVNDX1JBVEVWSFQxU1NfTUNTNyA9IDB4MjMsCisJREVTQ19SQVRFVkhUMVNTX01DUzggPSAweDI0LAorCURFU0NfUkFURVZIVDFTU19NQ1M5ID0gMHgyNSwKKwlERVNDX1JBVEVWSFQyU1NfTUNTMCA9IDB4MjYsCisJREVTQ19SQVRFVkhUMlNTX01DUzEgPSAweDI3LAorCURFU0NfUkFURVZIVDJTU19NQ1MyID0gMHgyOCwKKwlERVNDX1JBVEVWSFQyU1NfTUNTMyA9IDB4MjksCisJREVTQ19SQVRFVkhUMlNTX01DUzQgPSAweDJhLAorCURFU0NfUkFURVZIVDJTU19NQ1M1ID0gMHgyYiwKKwlERVNDX1JBVEVWSFQyU1NfTUNTNiA9IDB4MmMsCisJREVTQ19SQVRFVkhUMlNTX01DUzcgPSAweDJkLAorCURFU0NfUkFURVZIVDJTU19NQ1M4ID0gMHgyZSwKKwlERVNDX1JBVEVWSFQyU1NfTUNTOSA9IDB4MmYsCit9OworCitlbnVtIHJ4X3BhY2tldF90eXBleworCU5PUk1BTF9SWCwKKwlUWF9SRVBPUlQxLAorCVRYX1JFUE9SVDIsCisJSElTX1JFUE9SVCwKKwlDMkhfUEFDS0VULAorfTsKKworc3RydWN0IHBoeV9zdHNfY2NrXzg4MjFhZV90IHsKKwl1OCBhZGNfcHdkYl9YWzRdOworCXU4IHNxX3JwdDsKKwl1OCBjY2tfYWdjX3JwdDsKK307CisKK3N0cnVjdCBoMmNfY21kXzg4MjFhZSB7CisJdTggZWxlbWVudF9pZDsKKwl1MzIgY21kX2xlbjsKKwl1OCAqcF9jbWRidWZmZXI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzQyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jCkBAIC0wLDAgKzEsMzA0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAiLi4vYmFzZS5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlZi5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgImRtLmgiCisjaW5jbHVkZSAiZncuaCIKKyNpbmNsdWRlICJ0cnguaCIKKyNpbmNsdWRlICIuLi9idGNvZXhpc3QvcnRsX2J0Yy5oIgorCitzdHJ1Y3QgZGlnX3QgZG1fZGlndGFibGU7CitzdGF0aWMgc3RydWN0IHBzX3QgZG1fcHN0YWJsZTsKKworc3RhdGljIGNvbnN0IHUzMiBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlW1RYU0NBTEVfVEFCTEVfU0laRV0gPQoreworCTB4MDgxLCAvLyAwLCAgLTEyLjBkQgorCTB4MDg4LCAvLyAxLCAgLTExLjVkQgorCTB4MDkwLCAvLyAyLCAgLTExLjBkQgorCTB4MDk5LCAvLyAzLCAgLTEwLjVkQgorCTB4MEEyLCAvLyA0LCAgLTEwLjBkQgorCTB4MEFDLCAvLyA1LCAgLTkuNWRCCisJMHgwQjYsIC8vIDYsICAtOS4wZEIKKwkweDBDMCwgLy8gNywgIC04LjVkQgorCTB4MENDLCAvLyA4LCAgLTguMGRCCisJMHgwRDgsIC8vIDksICAtNy41ZEIKKwkweDBFNSwgLy8gMTAsIC03LjBkQgorCTB4MEYyLCAvLyAxMSwgLTYuNWRCCisJMHgxMDEsIC8vIDEyLCAtNi4wZEIKKwkweDExMCwgLy8gMTMsIC01LjVkQgorCTB4MTIwLCAvLyAxNCwgLTUuMGRCCisJMHgxMzEsIC8vIDE1LCAtNC41ZEIKKwkweDE0MywgLy8gMTYsIC00LjBkQgorCTB4MTU2LCAvLyAxNywgLTMuNWRCCisJMHgxNkEsIC8vIDE4LCAtMy4wZEIKKwkweDE4MCwgLy8gMTksIC0yLjVkQgorCTB4MTk3LCAvLyAyMCwgLTIuMGRCCisJMHgxQUYsIC8vIDIxLCAtMS41ZEIKKwkweDFDOCwgLy8gMjIsIC0xLjBkQgorCTB4MUUzLCAvLyAyMywgLTAuNWRCCisJMHgyMDAsIC8vIDI0LCArMCAgZEIKKwkweDIxRSwgLy8gMjUsICswLjVkQgorCTB4MjNFLCAvLyAyNiwgKzEuMGRCCisJMHgyNjEsIC8vIDI3LCArMS41ZEIKKwkweDI4NSwgLy8gMjgsICsyLjBkQgorCTB4MkFCLCAvLyAyOSwgKzIuNWRCCisJMHgyRDMsIC8vIDMwLCArMy4wZEIKKwkweDJGRSwgLy8gMzEsICszLjVkQgorCTB4MzJCLCAvLyAzMiwgKzQuMGRCCisJMHgzNUMsIC8vIDMzLCArNC41ZEIKKwkweDM4RSwgLy8gMzQsICs1LjBkQgorCTB4M0M0LCAvLyAzNSwgKzUuNWRCCisJMHgzRkUgIC8vIDM2LCArNi4wZEIKK307CisKK3N0YXRpYyBjb25zdCB1MzIgcnRsODgyMWFlX3R4c2NhbGluZ190YWJsZVtUWFNDQUxFX1RBQkxFX1NJWkVdID0geworCTB4MDgxLCAvLyAwLCAgLTEyLjBkQgorCTB4MDg4LCAvLyAxLCAgLTExLjVkQgorCTB4MDkwLCAvLyAyLCAgLTExLjBkQgorCTB4MDk5LCAvLyAzLCAgLTEwLjVkQgorCTB4MEEyLCAvLyA0LCAgLTEwLjBkQgorCTB4MEFDLCAvLyA1LCAgLTkuNWRCCisJMHgwQjYsIC8vIDYsICAtOS4wZEIKKwkweDBDMCwgLy8gNywgIC04LjVkQgorCTB4MENDLCAvLyA4LCAgLTguMGRCCisJMHgwRDgsIC8vIDksICAtNy41ZEIKKwkweDBFNSwgLy8gMTAsIC03LjBkQgorCTB4MEYyLCAvLyAxMSwgLTYuNWRCCisJMHgxMDEsIC8vIDEyLCAtNi4wZEIKKwkweDExMCwgLy8gMTMsIC01LjVkQgorCTB4MTIwLCAvLyAxNCwgLTUuMGRCCisJMHgxMzEsIC8vIDE1LCAtNC41ZEIKKwkweDE0MywgLy8gMTYsIC00LjBkQgorCTB4MTU2LCAvLyAxNywgLTMuNWRCCisJMHgxNkEsIC8vIDE4LCAtMy4wZEIKKwkweDE4MCwgLy8gMTksIC0yLjVkQgorCTB4MTk3LCAvLyAyMCwgLTIuMGRCCisJMHgxQUYsIC8vIDIxLCAtMS41ZEIKKwkweDFDOCwgLy8gMjIsIC0xLjBkQgorCTB4MUUzLCAvLyAyMywgLTAuNWRCCisJMHgyMDAsIC8vIDI0LCArMCAgZEIKKwkweDIxRSwgLy8gMjUsICswLjVkQgorCTB4MjNFLCAvLyAyNiwgKzEuMGRCCisJMHgyNjEsIC8vIDI3LCArMS41ZEIKKwkweDI4NSwgLy8gMjgsICsyLjBkQgorCTB4MkFCLCAvLyAyOSwgKzIuNWRCCisJMHgyRDMsIC8vIDMwLCArMy4wZEIKKwkweDJGRSwgLy8gMzEsICszLjVkQgorCTB4MzJCLCAvLyAzMiwgKzQuMGRCCisJMHgzNUMsIC8vIDMzLCArNC41ZEIKKwkweDM4RSwgLy8gMzQsICs1LjBkQgorCTB4M0M0LCAvLyAzNSwgKzUuNWRCCisJMHgzRkUgIC8vIDM2LCArNi4wZEIKK307CisKK3N0YXRpYyBjb25zdCB1MzIgb2ZkbXN3aW5nX3RhYmxlW10gPSB7CisJMHgwYjQwMDAyZCwgLy8gMCwgIC0xNS4wZEIKKwkweDBjMDAwMDMwLCAvLyAxLCAgLTE0LjVkQgorCTB4MGNjMDAwMzMsIC8vIDIsICAtMTQuMGRCCisJMHgwZDgwMDAzNiwgLy8gMywgIC0xMy41ZEIKKwkweDBlNDAwMDM5LCAvLyA0LCAgLTEzLjBkQgorCTB4MGYwMDAwM2MsIC8vIDUsICAtMTIuNWRCCisJMHgxMDAwMDA0MCwgLy8gNiwgIC0xMi4wZEIKKwkweDExMDAwMDQ0LCAvLyA3LCAgLTExLjVkQgorCTB4MTIwMDAwNDgsIC8vIDgsICAtMTEuMGRCCisJMHgxMzAwMDA0YywgLy8gOSwgIC0xMC41ZEIKKwkweDE0NDAwMDUxLCAvLyAxMCwgLTEwLjBkQgorCTB4MTU4MDAwNTYsIC8vIDExLCAtOS41ZEIKKwkweDE2YzAwMDViLCAvLyAxMiwgLTkuMGRCCisJMHgxODAwMDA2MCwgLy8gMTMsIC04LjVkQgorCTB4MTk4MDAwNjYsIC8vIDE0LCAtOC4wZEIKKwkweDFiMDAwMDZjLCAvLyAxNSwgLTcuNWRCCisJMHgxYzgwMDA3MiwgLy8gMTYsIC03LjBkQgorCTB4MWU0MDAwNzksIC8vIDE3LCAtNi41ZEIKKwkweDIwMDAwMDgwLCAvLyAxOCwgLTYuMGRCCisJMHgyMjAwMDA4OCwgLy8gMTksIC01LjVkQgorCTB4MjQwMDAwOTAsIC8vIDIwLCAtNS4wZEIKKwkweDI2MDAwMDk4LCAvLyAyMSwgLTQuNWRCCisJMHgyODgwMDBhMiwgLy8gMjIsIC00LjBkQgorCTB4MmFjMDAwYWIsIC8vIDIzLCAtMy41ZEIKKwkweDJkNDAwMGI1LCAvLyAyNCwgLTMuMGRCCisJMHgzMDAwMDBjMCwgLy8gMjUsIC0yLjVkQgorCTB4MzJjMDAwY2IsIC8vIDI2LCAtMi4wZEIKKwkweDM1YzAwMGQ3LCAvLyAyNywgLTEuNWRCCisJMHgzOTAwMDBlNCwgLy8gMjgsIC0xLjBkQgorCTB4M2M4MDAwZjIsIC8vIDI5LCAtMC41ZEIKKwkweDQwMDAwMTAwLCAvLyAzMCwgKzBkQgorCTB4NDNjMDAxMGYsIC8vIDMxLCArMC41ZEIKKwkweDQ3YzAwMTFmLCAvLyAzMiwgKzEuMGRCCisJMHg0YzAwMDEzMCwgLy8gMzMsICsxLjVkQgorCTB4NTA4MDAxNDIsIC8vIDM0LCArMi4wZEIKKwkweDU1NDAwMTU1LCAvLyAzNSwgKzIuNWRCCisJMHg1YTQwMDE2OSwgLy8gMzYsICszLjBkQgorCTB4NWZjMDAxN2YsIC8vIDM3LCArMy41ZEIKKwkweDY1NDAwMTk1LCAvLyAzOCwgKzQuMGRCCisJMHg2YjgwMDFhZSwgLy8gMzksICs0LjVkQgorCTB4NzFjMDAxYzcsIC8vIDQwLCArNS4wZEIKKwkweDc4ODAwMWUyLCAvLyA0MSwgKzUuNWRCCisJMHg3ZjgwMDFmZSAgLy8gNDIsICs2LjBkQgorfTsKKworc3RhdGljIGNvbnN0IHU4IGNja3N3aW5nX3RhYmxlX2NoMWNoMTNbQ0NLX1RBQkxFX1NJWkVdWzhdID0geworCXsweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA0LCAweDAzLCAweDAxLCAweDAxfSwJLy8gIDAsIC0xNi4wZEIKKwl7MHgwOSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNSwgMHgwMywgMHgwMSwgMHgwMX0sCS8vICAxLCAtMTUuNWRCCisJezB4MGEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDF9LAkvLyAgMiwgLTE1LjBkQgorCXsweDBhLCAweDBhLCAweDA5LCAweDA3LCAweDA1LCAweDAzLCAweDAyLCAweDAxfSwJLy8gIDMsIC0xNC41ZEIKKwl7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMX0sCS8vICA0LCAtMTQuMGRCCisJezB4MGIsIDB4MGIsIDB4MGEsIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDF9LAkvLyAgNSwgLTEzLjVkQgorCXsweDBjLCAweDBjLCAweDBhLCAweDA5LCAweDA2LCAweDA0LCAweDAyLCAweDAxfSwJLy8gIDYsIC0xMy4wZEIKKwl7MHgwZCwgMHgwYywgMHgwYiwgMHgwOSwgMHgwNywgMHgwNCwgMHgwMiwgMHgwMX0sCS8vICA3LCAtMTIuNWRCCisJezB4MGQsIDB4MGQsIDB4MGMsIDB4MGEsIDB4MDcsIDB4MDUsIDB4MDIsIDB4MDF9LAkvLyAgOCwgLTEyLjBkQgorCXsweDBlLCAweDBlLCAweDBjLCAweDBhLCAweDA4LCAweDA1LCAweDAyLCAweDAxfSwJLy8gIDksIC0xMS41ZEIKKwl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0sCS8vIDEwLCAtMTEuMGRCCisJezB4MTAsIDB4MTAsIDB4MGUsIDB4MGIsIDB4MDgsIDB4MDUsIDB4MDMsIDB4MDF9LAkvLyAxMSwgLTEwLjVkQgorCXsweDExLCAweDExLCAweDBmLCAweDBjLCAweDA5LCAweDA2LCAweDAzLCAweDAxfSwJLy8gMTIsIC0xMC4wZEIKKwl7MHgxMiwgMHgxMiwgMHgwZiwgMHgwYywgMHgwOSwgMHgwNiwgMHgwMywgMHgwMX0sCS8vIDEzLCAtOS41ZEIKKwl7MHgxMywgMHgxMywgMHgxMCwgMHgwZCwgMHgwYSwgMHgwNiwgMHgwMywgMHgwMX0sCS8vIDE0LCAtOS4wZEIKKwl7MHgxNCwgMHgxNCwgMHgxMSwgMHgwZSwgMHgwYiwgMHgwNywgMHgwMywgMHgwMn0sCS8vIDE1LCAtOC41ZEIKKwl7MHgxNiwgMHgxNSwgMHgxMiwgMHgwZiwgMHgwYiwgMHgwNywgMHgwNCwgMHgwMX0sCS8vIDE2LCAtOC4wZEIKKwl7MHgxNywgMHgxNiwgMHgxMywgMHgxMCwgMHgwYywgMHgwOCwgMHgwNCwgMHgwMn0sCS8vIDE3LCAtNy41ZEIKKwl7MHgxOCwgMHgxNywgMHgxNSwgMHgxMSwgMHgwYywgMHgwOCwgMHgwNCwgMHgwMn0sCS8vIDE4LCAtNy4wZEIKKwl7MHgxYSwgMHgxOSwgMHgxNiwgMHgxMiwgMHgwZCwgMHgwOSwgMHgwNCwgMHgwMn0sCS8vIDE5LCAtNi41ZEIKKyAgICB7MHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMn0sCS8vIDIwLCAtNi4wZEIKKwl7MHgxZCwgMHgxYywgMHgxOCwgMHgxNCwgMHgwZiwgMHgwYSwgMHgwNSwgMHgwMn0sCS8vIDIxLCAtNS41ZEIKKwl7MHgxZiwgMHgxZSwgMHgxYSwgMHgxNSwgMHgxMCwgMHgwYSwgMHgwNSwgMHgwMn0sCS8vIDIyLCAtNS4wZEIKKwl7MHgyMCwgMHgyMCwgMHgxYiwgMHgxNiwgMHgxMSwgMHgwOCwgMHgwNSwgMHgwMn0sCS8vIDIzLCAtNC41ZEIKKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sCS8vIDI0LCAtNC4wZEIKKwl7MHgyNCwgMHgyMywgMHgxZiwgMHgxOSwgMHgxMywgMHgwYywgMHgwNiwgMHgwM30sCS8vIDI1LCAtMy41ZEIKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sCS8vIDI2LCAtMy4wZEIKKwl7MHgyOCwgMHgyOCwgMHgyMiwgMHgxYywgMHgxNSwgMHgwZCwgMHgwNywgMHgwM30sCS8vIDI3LCAtMi41ZEIKKwl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNiwgMHgwZSwgMHgwNywgMHgwM30sCS8vIDI4LCAtMi4wZEIKKwl7MHgyZCwgMHgyZCwgMHgyNywgMHgxZiwgMHgxOCwgMHgwZiwgMHgwOCwgMHgwM30sCS8vIDI5LCAtMS41ZEIKKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sCS8vIDMwLCAtMS4wZEIKKwl7MHgzMywgMHgzMiwgMHgyYiwgMHgyMywgMHgxYSwgMHgxMSwgMHgwOCwgMHgwNH0sCS8vIDMxLCAtMC41ZEIKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNH0gCS8vIDMyLCArMGRCCit9OworCitzdGF0aWMgY29uc3QgdTggY2Nrc3dpbmdfdGFibGVfY2gxNFtDQ0tfVEFCTEVfU0laRV1bOF09IHsKKwl7MHgwOSwgMHgwOCwgMHgwNywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vICAwLCAtMTYuMGRCCisJezB4MDksIDB4MDksIDB4MDgsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAgMSwgLTE1LjVkQgorCXsweDBhLCAweDA5LCAweDA4LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gIDIsIC0xNS4wZEIKKwl7MHgwYSwgMHgwYSwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vICAzLCAtMTQuNWRCCisJezB4MGIsIDB4MGEsIDB4MDksIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAgNCwgLTE0LjBkQgorCXsweDBiLCAweDBiLCAweDBhLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gIDUsIC0xMy41ZEIKKwl7MHgwYywgMHgwYywgMHgwYSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vICA2LCAtMTMuMGRCCisJezB4MGQsIDB4MGMsIDB4MGIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAgNywgLTEyLjVkQgorCXsweDBkLCAweDBkLCAweDBjLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gIDgsIC0xMi4wZEIKKwl7MHgwZSwgMHgwZSwgMHgwYywgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vICA5LCAtMTEuNWRCCisJezB4MGYsIDB4MGYsIDB4MGQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxMCwgLTExLjBkQgorCXsweDEwLCAweDEwLCAweDBlLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMTEsIC0xMC41ZEIKKwl7MHgxMSwgMHgxMSwgMHgwZiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEyLCAtMTAuMGRCCisJezB4MTIsIDB4MTIsIDB4MGYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxMywgLTkuNWRCCisJezB4MTMsIDB4MTMsIDB4MTAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxNCwgLTkuMGRCCisJezB4MTQsIDB4MTQsIDB4MTEsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxNSwgLTguNWRCCisJezB4MTYsIDB4MTUsIDB4MTIsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxNiwgLTguMGRCCisJezB4MTcsIDB4MTYsIDB4MTMsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxNywgLTcuNWRCCisJezB4MTgsIDB4MTcsIDB4MTUsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxOCwgLTcuMGRCCisJezB4MWEsIDB4MTksIDB4MTYsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAxOSwgLTYuNWRCCisJezB4MWIsIDB4MWEsIDB4MTcsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyMCwgLTYuMGRCCisJezB4MWQsIDB4MWMsIDB4MTgsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyMSwgLTUuNWRCCisJezB4MWYsIDB4MWUsIDB4MWEsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyMiwgLTUuMGRCCisJezB4MjAsIDB4MjAsIDB4MWIsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyMywgLTQuNWRCCisJezB4MjIsIDB4MjEsIDB4MWQsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyNCwgLTQuMGRCCisJezB4MjQsIDB4MjMsIDB4MWYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyNSwgLTMuNWRCCisJezB4MjYsIDB4MjUsIDB4MjEsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyNiwgLTMuMGRCCisJezB4MjgsIDB4MjgsIDB4MjQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyNywgLTIuNWRCCisJezB4MmIsIDB4MmEsIDB4MjUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyOCwgLTIuMGRCCisJezB4MmQsIDB4MmQsIDB4MTcsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAyOSwgLTEuNWRCCisJezB4MzAsIDB4MmYsIDB4MjksIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAzMCwgLTEuMGRCCisJezB4MzMsIDB4MzIsIDB4MmIsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAkvLyAzMSwgLTAuNWRCCisJezB4MzYsIDB4MzUsIDB4MmUsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9IAkvLyAzMiwgKzBkQgorfTsKKworc3RhdGljIGNvbnN0IHUzMiBlZGNhX3NldHRpbmdfZGxbUEVFUl9NQVhdID0geworCTB4YTQ0ZiwgCS8qIDAgVU5LTk9XTiAqLworIAkweDVlYTQ0ZiwJLyogMSBSRUFMVEVLXzkwICovCisJMHg1ZTQzMjIsCS8qIDIgUkVBTFRFS185MlNFICovCisJMHg1ZWE0MmIsCQkvKiAzIEJST0FECSovCisJMHhhNDRmLAkJLyogNCBSQUwgKi8KKwkweGE2MzAsCQkvKiA1IEFUSCAqLworCTB4NWVhNjMwLAkJLyogNiBDSVNDTyAqLworCTB4NWVhNDJiLAkJLyogNyBNQVJWRUxMICovCit9OworCitzdGF0aWMgY29uc3QgdTMyIGVkY2Ffc2V0dGluZ191bFtQRUVSX01BWF0gPSB7CisJMHg1ZTQzMjIsIAkvKiAwIFVOS05PV04gKi8KKwkweGE0NGYsCQkvKiAxIFJFQUxURUtfOTAgKi8KKwkweDVlYTQ0ZiwJLyogMiBSRUFMVEVLXzkyU0UgKi8KKwkweDVlYTMyYiwgCS8qIDMgQlJPQUQgKi8KKwkweDVlYTQyMiwJLyogNCBSQUwgKi8KKwkweDVlYTMyMiwgCS8qIDUgQVRIICovCisJMHgzZWE0MzAsCS8qIDYgQ0lTQ08gKi8KKwkweDVlYTQ0ZiwJLyogNyBNQVJWICovCit9OworCitzdGF0aWMgdTggcnRsODgxOGVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfcF90eHB3cnRyYWNrW10gPQorCXswLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDl9Oworc3RhdGljIHU4IHJ0bDg4MThlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25fdHhwd3J0cmFja1tdID0KKwl7MCwgMCwgMCwgMiwgMiwgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExfTsKKworCit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Jfbl90eHB3cnRyYWNrW10gICAgPQorCXswLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDgsICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExfTsKK3U4IHJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wX3R4cHdydHJhY2tbXSAgICA9CisJezAsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDl9OwordTggcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25fdHhwd3J0cmFja1tdICAgID0KKwl7MCwgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMX07Cit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcF90eHB3cnRyYWNrW10gICAgPQorCXswLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5fTsKK3U4IHJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uX3R4cHdydHJhY2tbXSA9CisJezAsIDEsIDEsIDEsIDIsIDIsIDIsIDMsIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTF9OwordTggcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX3BfdHhwd3J0cmFja1tdID0KKwl7MCwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOX07Cit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2Ffbl90eHB3cnRyYWNrW10gPQorCXswLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExfTsKK3U4IHJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wX3R4cHdydHJhY2tbXSA9CisJezAsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDl9OworCit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9uX3R4cHdydHJhY2tbXVtERUxUQV9TV0lOR0lEWF9TSVpFXSA9IHsKKwl7MCwgMSwgMSwgMiwgMiwgMiwgMywgMywgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxM30sCisJezAsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDQsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgMTN9LAorCXswLCAxLCAxLCAyLCAzLCAzLCA0LCA0LCA1LCAgNiwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE2LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4fSwKK307Cit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wX3R4cHdydHJhY2tbXVtERUxUQV9TV0lOR0lEWF9TSVpFXSA9IHsKKwl7MCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMX0sCisJezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTF9LAorCXswLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExfSwKK307Cit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9uX3R4cHdydHJhY2tbXVtERUxUQV9TV0lOR0lEWF9TSVpFXSA9IHsKKwl7MCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxM30sCisJezAsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTN9LAorCXswLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA1LCAgNiwgIDcsICA4LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4fSwKK307Cit1OCBydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wX3R4cHdydHJhY2tbXVtERUxUQV9TV0lOR0lEWF9TSVpFXSA9IHsKKwl7MCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMX0sCisJezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTF9LAorCXswLCAxLCAxLCAyLCAzLCAzLCA0LCA0LCA1LCAgNiwgIDYsICA3LCAgNywgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExfSwKK307CisKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uX3R4cHdydHJhY2tbXSA9CisJezAsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDUsIDYsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTB9OwordTggcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3BfdHhwd3J0cmFja1tdICA9CisJezAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyfTsKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uX3R4cHdydHJhY2tbXSAgPQorCXswLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2LCA3LCA3LCA3LCA4LCA4LCA4LCA5LCA5LCA5LCAxMCwgMTAsIDEwfTsKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wX3R4cHdydHJhY2tbXSA9CisJezAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyfTsKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uX3R4cHdydHJhY2tbXSA9CisJezAsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDUsIDYsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTB9OwordTggcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX3BfdHhwd3J0cmFja1tdID0KKwl7MCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTJ9OwordTggcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25fdHhwd3J0cmFja1tdID0KKwl7MCwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNSwgNSwgNSwgNiwgNiwgNiwgNywgNywgNywgOCwgOCwgOCwgOSwgOSwgOSwgMTAsIDEwLCAxMH07Cit1OCBydGw4ODIxYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfcF90eHB3cnRyYWNrW10gPQorCXswLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMn07CisKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25fdHhwd3J0cmFja1tdW0RFTFRBX1NXSU5HSURYX1NJWkVdID0geworCXswLCAwLCAxLCAyLCAzLCAzLCA0LCA1LCA2LCA2LCA3LCA4LCA5LCA5LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNn0sCisJezAsIDAsIDEsIDIsIDMsIDMsIDQsIDUsIDYsIDYsIDcsIDgsIDksIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2fSwKKwl7MCwgMCwgMSwgMiwgMywgMywgNCwgNSwgNiwgNiwgNywgOCwgOSwgOSwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTZ9LAorfTsKKwordTggcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcF90eHB3cnRyYWNrW11bREVMVEFfU1dJTkdJRFhfU0laRV0gPSB7CisJezAsIDAsIDEsIDIsIDMsIDMsIDQsIDUsIDYsIDYsIDcsIDgsIDksIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2fSwKKwl7MCwgMCwgMSwgMiwgMywgMywgNCwgNSwgNiwgNiwgNywgOCwgOSwgOSwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTZ9LAorCXswLCAwLCAxLCAyLCAzLCAzLCA0LCA1LCA2LCA2LCA3LCA4LCA5LCA5LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNn0sCit9OworCit1OCBydGw4ODIxYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9uX3R4cHdydHJhY2tbXVtERUxUQV9TV0lOR0lEWF9TSVpFXSA9IHsKKwl7MCwgMCwgMSwgMiwgMywgMywgNCwgNSwgNiwgNiwgNywgOCwgOSwgOSwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTZ9LAorCXswLCAwLCAxLCAyLCAzLCAzLCA0LCA1LCA2LCA2LCA3LCA4LCA5LCA5LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNn0sCisJezAsIDAsIDEsIDIsIDMsIDMsIDQsIDUsIDYsIDYsIDcsIDgsIDksIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2fSwKK307CisKK3U4IHJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3BfdHhwd3J0cmFja1tdW0RFTFRBX1NXSU5HSURYX1NJWkVdID0geworCXswLCAwLCAxLCAyLCAzLCAzLCA0LCA1LCA2LCA2LCA3LCA4LCA5LCA5LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNn0sCisJezAsIDAsIDEsIDIsIDMsIDMsIDQsIDUsIDYsIDYsIDcsIDgsIDksIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2fSwKKwl7MCwgMCwgMSwgMiwgMywgMywgNCwgNSwgNiwgNiwgNywgOCwgOSwgOSwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTZ9LAorfTsKKwordm9pZCBydGw4ODEyYWVfZG1fcmVhZF9hbmRfY29uZmlnX3R4cG93ZXJfdHJhY2soCisgCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIj09PT4gcnRsODgyMWFlX2RtX3JlYWRfYW5kX2NvbmZpZ190eHBvd2VyX3RyYWNrXG4iKSk7CisKKworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcCwKKwkJcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BfdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uLAorCQlydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Ffbl90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3AsCisJCXJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfbiwKKwkJcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX3AsCisJCXJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfbiwKKwkJcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9wLAorCQlydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfcF90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX24sCisJCXJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3AsCisJCXJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3BfdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSozKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfbiwKKwkJcnRsODgxMmFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2Ffbl90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKjMpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wLAorCQlydGw4ODEyYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUqMyk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX24sCisJCXJ0bDg4MTJhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSozKTsKK30KKwordm9pZCBydGw4ODIxYWVfZG1fcmVhZF9hbmRfY29uZmlnX3R4cG93ZXJfdHJhY2soCisgCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIj09PT4gcnRsODgyMWFlX2RtX3JlYWRfYW5kX2NvbmZpZ190eHBvd2VyX3RyYWNrXG4iKSk7CisKKworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcCwKKwkJcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BfdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uLAorCQlydGw4ODIxYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Ffbl90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3AsCisJCXJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfbiwKKwkJcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX3AsCisJCXJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfbiwKKwkJcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9wLAorCQlydGw4ODIxYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfcF90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX24sCisJCXJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUpOworCisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3AsCisJCXJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX3BfdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSozKTsKKwltZW1jcHkocnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfbiwKKwkJcnRsODgyMWFlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2Ffbl90eHB3cnRyYWNrLCBERUxUQV9TV0lOR0lEWF9TSVpFKjMpOworCW1lbWNweShydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wLAorCQlydGw4ODIxYWVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wX3R4cHdydHJhY2ssIERFTFRBX1NXSU5HSURYX1NJWkUqMyk7CisJbWVtY3B5KHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX24sCisJCXJ0bDg4MjFhZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25fdHhwd3J0cmFjaywgREVMVEFfU1dJTkdJRFhfU0laRSozKTsKK30KKworCisKKyNkZWZpbmUgCUNBTENVTEFURV9TV0lOR1RBTEJFX09GRlNFVChfb2Zmc2V0LCBfZGlyZWN0aW9uLCBfc2l6ZSwgX2RlbHRhVGhlcm1hbCkgXAorCQkJCQlkbyB7XAorCQkJCQkJZm9yKF9vZmZzZXQgPSAwOyBfb2Zmc2V0IDwgX3NpemU7IF9vZmZzZXQrKylcCisJCQkJCQl7XAorCQkJCQkJCWlmKF9kZWx0YVRoZXJtYWwgPCB0aGVybWFsX3RocmVzaG9sZFtfZGlyZWN0aW9uXVtfb2Zmc2V0XSlcCisJCQkJCQkJe1wKKwkJCQkJCQkJaWYoX29mZnNldCAhPSAwKVwKKwkJCQkJCQkJCV9vZmZzZXQtLTtcCisJCQkJCQkJCWJyZWFrO1wKKwkJCQkJCQl9XAorCQkJCQkJfQkJCVwKKwkJCQkJCWlmKF9vZmZzZXQgPj0gX3NpemUpXAorCQkJCQkJCV9vZmZzZXQgPSBfc2l6ZS0xO1wKKwkJCQkJfSB3aGlsZSgwKQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX3R4cG93ZXJfdHJhY2tfYWRqdXN0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCQkJICAgdTggdHlwZSx1OCAqcGRpcmVjdGlvbiwKKwkJCQkJCQkJCQkJCSAgIHUzMiAqcG91dHdyaXRlX3ZhbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwl1OCBwd3JfdmFsID0gMDsKKworCWlmICh0eXBlID09IDApeworCQlpZiAocnRscHJpdi0+ZG0uYmJfc3dpbmdfaWR4X29mZG1bUkY5MF9QQVRIX0FdIDw9CisJCQlydGxwcml2LT5kbS5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW1JGOTBfUEFUSF9BXSkgeworCQkJKnBkaXJlY3Rpb24gPSAxOworCQkJcHdyX3ZhbCA9IHJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW1JGOTBfUEFUSF9BXSAtIHJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbVtSRjkwX1BBVEhfQV07CisJCX0gZWxzZSB7CisJCQkqcGRpcmVjdGlvbiA9IDI7CisJCQlwd3JfdmFsID0gcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtW1JGOTBfUEFUSF9BXSAtIHJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW1JGOTBfUEFUSF9BXTsKKwkJfQorCX0gZWxzZSBpZiAodHlwZSA9PTEpIHsKKwkJaWYgKHJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrIDw9IHJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UpIHsKKwkJCSpwZGlyZWN0aW9uID0gMTsKKwkJCXB3cl92YWwgPSBydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlIC0gcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2s7CisJCX0gZWxzZSB7CisJCQkqcGRpcmVjdGlvbiA9IDI7CisJCQlwd3JfdmFsID0gcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2sgLSBydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlOworCQl9CisJfQorCisJaWYgKHB3cl92YWwgPj0gVFhQV1JUUkFDS19NQVhfSURYICYmICgqcGRpcmVjdGlvbiA9PSAxKSkKKwkJcHdyX3ZhbCA9IFRYUFdSVFJBQ0tfTUFYX0lEWDsKKworCSpwb3V0d3JpdGVfdmFsID0gcHdyX3ZhbCB8KHB3cl92YWwgPDwgOCl8KHB3cl92YWwgPDwgMTYpIHwgKHB3cl92YWwgPDwgMjQpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9jbGVhcl90eHBvd2VyX3RyYWNraW5nX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxwcml2KTsKKwl1OCBwID0gMDsKKwlydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlID0gcnRsZG0tPmRlZmF1bHRfY2NrX2luZGV4OworCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrID0gcnRsZG0tPmRlZmF1bHRfY2NrX2luZGV4OworCXJ0bGRtLT5jY2tfaW5kZXggPSAwOworCisJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUkZfUEFUSDsgKytwKSB7CisJCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW3BdID0gcnRsZG0tPmRlZmF1bHRfb2ZkbV9pbmRleDsKKwkJcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtW3BdID0gcnRsZG0tPmRlZmF1bHRfb2ZkbV9pbmRleDsKKwkJcnRsZG0tPm9mZG1faW5kZXhbcF0gPSBydGxkbS0+ZGVmYXVsdF9vZmRtX2luZGV4OworCisJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF0gPSAwOworCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbcF0gPSAwOworCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhfbGFzdFtwXSA9IDA7CisKKwkJcnRsZG0tPmFib3NsdXRlX29mZG1fc3dpbmdfaWR4W3BdID0gMDsgICAgLypJbml0aWFsIE1peCBtb2RlIHBvd2VyIHRyYWNraW5nKi8KKwkJcnRsZG0tPnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcF0gPSAwOworCX0KKworCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2EgPSBmYWxzZTsgICAgICAgLypJbml0aWFsIGF0IE1vZGlmeSBUeCBTY2FsaW5nIE1vZGUqLworCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2IgPSBmYWxzZTsgICAgICAgLypJbml0aWFsIGF0IE1vZGlmeSBUeCBTY2FsaW5nIE1vZGUqLworCXJ0bGRtLT5yZW1uYW50X2Nja19pZHggPSAwOworCXJ0bGRtLT50aGVybWFsdmFsdWUgPSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcjsKKwlydGxkbS0+dGhlcm1hbHZhbHVlX2lxayA9IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyOworCXJ0bGRtLT50aGVybWFsdmFsdWVfbGNrID0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXI7Cit9CisKK3U4ICBydGw4ODIxYWVfZG1fZ2V0X3N3aW5nX2luZGV4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggaSA9IDA7CisJdTMyICBiYl9zd2luZzsKKworCWJiX3N3aW5nID1ydGw4ODIxYWVfcGh5X3F1ZXJ5X2JiX3JlZyhodywgcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlLCBSRjkwX1BBVEhfQSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhTQ0FMRV9UQUJMRV9TSVpFOyArK2kpCisJCWlmICggYmJfc3dpbmcgPT0gcnRsODgyMWFlX3R4c2NhbGluZ190YWJsZVtpXSkKKwkJCWJyZWFrOworCisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZ190aGVybWFsbWV0ZXIoCisJCQkJc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZG0gKnJ0bGRtID0gcnRsX2RtKHJ0bHByaXYpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bHByaXYpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggZGVmYXVsdF9zd2luZ19pbmRleCAgPSAwOworCXU4IHAgPSAwOworCisJcnRscHJpdi0+ZG0udHhwb3dlcl90cmFja19jb250cm9sID0gdHJ1ZTsKKwlydGxkbS0+dGhlcm1hbHZhbHVlID0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXI7CisJcnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWsgPSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcjsKKwlydGxkbS0+dGhlcm1hbHZhbHVlX2xjayA9IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJcnRsODgxMmFlX2RtX3JlYWRfYW5kX2NvbmZpZ190eHBvd2VyX3RyYWNrKGh3KTsKKwllbHNlCisJCXJ0bDg4MjFhZV9kbV9yZWFkX2FuZF9jb25maWdfdHhwb3dlcl90cmFjayhodyk7CisKKwlkZWZhdWx0X3N3aW5nX2luZGV4ID0gcnRsODgyMWFlX2RtX2dldF9zd2luZ19pbmRleChodyk7CisKKwlydGxkbS0+ZGVmYXVsdF9vZmRtX2luZGV4ID0gKGRlZmF1bHRfc3dpbmdfaW5kZXggPT0gVFhTQ0FMRV9UQUJMRV9TSVpFKSA/IDI0IDogZGVmYXVsdF9zd2luZ19pbmRleDsKKwlydGxkbS0+ZGVmYXVsdF9jY2tfaW5kZXggPSAyNDsKKworCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UgPSBydGxkbS0+ZGVmYXVsdF9jY2tfaW5kZXg7CisJcnRsZG0tPmNja19pbmRleCA9IHJ0bGRtLT5kZWZhdWx0X2Nja19pbmRleDsKKworCWZvciAocCA9IFJGOTBfUEFUSF9BOyBwIDwgTUFYX1JGX1BBVEg7ICsrcCkKKwl7CisJCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW3BdID0gcnRsZG0tPmRlZmF1bHRfb2ZkbV9pbmRleDsKKwkgICAJcnRsZG0tPm9mZG1faW5kZXhbcF0gPSBydGxkbS0+ZGVmYXVsdF9vZmRtX2luZGV4OworCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbcF0gPSAwOworCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdID0gMDsKKwkJcnRsZG0tPmRlbHRhX3Bvd2VyX2luZGV4X2xhc3RbcF0gPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODgyMWFlX2RtX2luaXRfZHluYW1pY19iYl9wb3dlcnNhdmluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlkbV9wc3RhYmxlLnByZV9jY2FzdGF0ZSA9IENDQV9NQVg7CisJZG1fcHN0YWJsZS5jdXJfY2Nhc2F0ZSA9IENDQV9NQVg7CisJZG1fcHN0YWJsZS5wcmVfcmZzdGF0ZSA9IFJGX01BWDsKKwlkbV9wc3RhYmxlLmN1cl9yZnN0YXRlID0gUkZfTUFYOworCWRtX3BzdGFibGUucnNzaV92YWxfbWluID0gMDsKKwlkbV9wc3RhYmxlLmluaXRpYWxpemUgPSAwOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9kbV9kaWdpbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwkvL2RtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9IHRydWU7CisJZG1fZGlndGFibGUuY3VyX2lndmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEFBR0NDT1JFMSwgMHg3Zik7CisJLypkbV9kaWd0YWJsZS5wcmVfaWd2YWx1ZSA9IDA7CisJZG1fZGlndGFibGUuY3Vyc3RhX2Nvbm5lY3RjdGF0ZSA9IERJR19TVEFfRElTQ09OTkVDVDsKKwlkbV9kaWd0YWJsZS5wcmVzdGFfY29ubmVjdHN0YXRlID0gRElHX1NUQV9ESVNDT05ORUNUOworCWRtX2RpZ3RhYmxlLmN1cm11bHRpc3RhX2Nvbm5lY3RzdGF0ZSA9IERJR19NVUxUSVNUQV9ESVNDT05ORUNUOyovCisJZG1fZGlndGFibGUucnNzaV9sb3d0aHJlc2ggPSBETV9ESUdfVEhSRVNIX0xPVzsKKwlkbV9kaWd0YWJsZS5yc3NpX2hpZ2h0aHJlc2ggPSBETV9ESUdfVEhSRVNIX0hJR0g7CisJZG1fZGlndGFibGUuZmFfbG93dGhyZXNoID0gRE1fRkFMU0VBTEFSTV9USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLmZhX2hpZ2h0aHJlc2ggPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdIOworCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01BWDsKKwlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU47CisJZG1fZGlndGFibGUuYmFja29mZl92YWwgPSBETV9ESUdfQkFDS09GRl9ERUZBVUxUOworCWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsX3JhbmdlX21heCA9IERNX0RJR19CQUNLT0ZGX01BWDsKKwlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbF9yYW5nZV9taW4gPSBETV9ESUdfQkFDS09GRl9NSU47CisJZG1fZGlndGFibGUucHJlX2Nja19jY2FfdGhyZXMgPSAweGZmOworCWRtX2RpZ3RhYmxlLmN1cl9jY2tfY2NhX3RocmVzID0gMHg4MzsKKwlkbV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpID0gRE1fRElHX01JTjsKKwlkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPSAwOworCWRtX2RpZ3RhYmxlLnJlY292ZXJfY250ID0gMDsKKwlkbV9kaWd0YWJsZS5kaWdfZHluYW1pY19taW5fMCA9IERNX0RJR19NSU47CisJZG1fZGlndGFibGUuZGlnX2R5bmFtaWNfbWluXzEgPSBETV9ESUdfTUlOOworCWRtX2RpZ3RhYmxlLmJfbWVkaWFfY29ubmVjdF8wID0gZmFsc2U7CisJZG1fZGlndGFibGUuYl9tZWRpYV9jb25uZWN0XzEgPSBmYWxzZTsKKwlydGxwcml2LT5kbS5iX2RtX2luaXRpYWxnYWluX2VuYWJsZSA9IHRydWU7CisJZG1fZGlndGFibGUuYnQzMF9jdXJfaWdpID0gMHgzMjsKK30KKworc3RhdGljIHZvaWQgcnRsODgyMWFlX2RtX2luaXRfZHluYW1pY190eHBvd2VyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCXJ0bHByaXYtPmRtLmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gZmFsc2U7CisKKwlydGxwcml2LT5kbS5sYXN0X2R0cF9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7CisJcnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlydGxwcml2LT5kbS5iY3VycmVudF90dXJib19lZGNhID0gZmFsc2U7CisJcnRscHJpdi0+ZG0uYmlzX2FueV9ub25iZXBrdHMgPSBmYWxzZTsKKwlydGxwcml2LT5kbS5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1faW5pdF9yYXRlX2FkYXB0aXZlX21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCByYXRlX2FkYXB0aXZlICpwX3JhID0gJihydGxwcml2LT5yYSk7CisKKwlwX3JhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfSU5JVDsKKwlwX3JhLT5wcmVfcmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0lOSVQ7CisKKwlydGxwcml2LT5kbS5kbV90eXBlID0gRE1fVFlQRV9CWURSSVZFUjsKKwlpZiAocnRscHJpdi0+ZG0uZG1fdHlwZSA9PSBETV9UWVBFX0JZRFJJVkVSKQorCQlydGxwcml2LT5kbS5iX3VzZXJhbWFzayA9IHRydWU7CisJZWxzZQorCQlydGxwcml2LT5kbS5iX3VzZXJhbWFzayA9IGZhbHNlOworCisJcF9yYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmEgPSA1MDsKKwlwX3JhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhID0gMjA7Cit9CisKKworc3RhdGljIHZvaWQgcnRsODgyMWFlX2RtX2luaXRfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5kbS5idHhwb3dlcl90cmFja2luZyA9IHRydWU7CisJcnRscHJpdi0+ZG0uYnR4cG93ZXJfdHJhY2tpbmdpbml0ID0gZmFsc2U7CisJcnRscHJpdi0+ZG0udHhwb3dlcmNvdW50ID0gMDsKKwlydGxwcml2LT5kbS50eHBvd2VyX3RyYWNrX2NvbnRyb2wgPSB0cnVlOworCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZSA9IDA7CisKKwlydGxwcml2LT5kbS5vZmRtX2luZGV4WzBdID0gMzA7CisJcnRscHJpdi0+ZG0uY2NrX2luZGV4ID0gMjA7CisKKwlydGxwcml2LT5kbS5iYl9zd2luZ19pZHhfY2NrX2Jhc2UgPSBydGxwcml2LT5kbS5jY2tfaW5kZXg7CisKKworCXJ0bHByaXYtPmRtLmJiX3N3aW5nX2lkeF9vZmRtW1JGOTBfUEFUSF9BXSA9IHJ0bHByaXYtPmRtLm9mZG1faW5kZXhbMF07CisJcnRscHJpdi0+ZG0uYmJfc3dpbmdfaWR4X29mZG1bUkY5MF9QQVRIX0JdID0gcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFswXTsKKwlydGxwcml2LT5kbS5kZWx0YV9wb3dlcl9pbmRleFswXSA9IDA7CisJcnRscHJpdi0+ZG0uZGVsdGFfcG93ZXJfaW5kZXhfbGFzdFswXSA9IDA7CisJcnRscHJpdi0+ZG0ucG93ZXJfaW5kZXhfb2Zmc2V0WzBdID0gMDsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkgKCIgIHJ0bHByaXYtPmRtLmJ0eHBvd2VyX3RyYWNraW5nID0gJWRcbiIsCisJCSAgcnRscHJpdi0+ZG0uYnR4cG93ZXJfdHJhY2tpbmcpKTsKK30KKworCit2b2lkIHJ0bDg4MjFhZV9kbV9pbml0X2R5bmFtaWNfYXRjX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5kbS5jcnlzdGFsX2NhcCA9IHJ0bHByaXYtPmVmdXNlLmNyeXN0YWxjYXA7CisKKwlydGxwcml2LT5kbS5hdGNfc3RhdHVzID0gcnRsX2dldF9iYnJlZyhodywgUk9GRE0xX0NGT1RSQUNLSU5HLCBCSVQoMTEpKTsKKwlydGxwcml2LT5kbS5jZm9fdGhyZXNob2xkID0gQ0ZPX1RIUkVTSE9MRF9YVEFMOworfQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwlydGxwaHktPmJfaXFrX2luX3Byb2dyZXNzID0gZmFsc2U7CisJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKworCXJ0bHByaXYtPmRtLmRtX3R5cGUgPSBETV9UWVBFX0JZRFJJVkVSOworCXJ0bDg4MjFhZV9kbV9kaWdpbml0KGh3KTsKKwlydGw4ODIxYWVfZG1faW5pdF9yYXRlX2FkYXB0aXZlX21hc2soaHcpOworCXJ0bDg4MTJhZV9kbV9wYXRoX2RpdmVyc2l0eV9pbml0KGh3KTsKKwlydGw4ODIxYWVfZG1faW5pdF9lZGNhX3R1cmJvKGh3KTsKKwlydGw4ODIxYWVfZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nX3RoZXJtYWxtZXRlcihodyk7CisjaWYgMQorCXJ0bDg4MjFhZV9kbV9pbml0X2R5bmFtaWNfYmJfcG93ZXJzYXZpbmcoaHcpOworCXJ0bDg4MjFhZV9kbV9pbml0X2R5bmFtaWNfdHhwb3dlcihodyk7CisJcnRsODgyMWFlX2RtX2luaXRfdHhwb3dlcl90cmFja2luZyhodyk7CisjZW5kaWYKKwlydGw4ODIxYWVfZG1faW5pdF9keW5hbWljX2F0Y19zd2l0Y2goaHcpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9maW5kX21pbmltdW1fcnNzaShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9kaWcgKnJ0bF9kbV9kaWcgPSAmKHJ0bHByaXYtPmRtLmRtX2RpZ3RhYmxlKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxwcml2KTsKKworCS8qIERldGVybWluZSB0aGUgbWluaW11bSBSU1NJICAqLworCWlmICgobWFjLT5saW5rX3N0YXRlIDwgTUFDODAyMTFfTElOS0VEKSAmJgorCSAgICAocnRscHJpdi0+ZG0uZW50cnlfbWluX3VuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA9PSAwKSkgeworCQlydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPSAwOworCQlSVF9UUkFDRShDT01QX0JCX1BPV0VSU0FWSU5HLCBEQkdfTE9VRCwKKwkJCSAoIk5vdCBjb25uZWN0ZWQgdG8gYW55IFxuIikpOworCX0KKwlpZiAobWFjLT5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgeworCQlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCQlydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPQorCQkJICAgIHJ0bHByaXYtPmRtLmVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGI7CisJCQlSVF9UUkFDRShDT01QX0JCX1BPV0VSU0FWSU5HLCBEQkdfTE9VRCwKKwkJCQkgKCJBUCBDbGllbnQgUFdEQiA9IDB4JWx4IFxuIiwKKwkJCQkgIHJ0bHByaXYtPmRtLmVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGIpKTsKKwkJfSBlbHNlIHsKKwkJCXJ0bF9kbV9kaWctPm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSA9CisJCQkgICAgcnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwkJCVJUX1RSQUNFKENPTVBfQkJfUE9XRVJTQVZJTkcsIERCR19MT1VELAorCQkJCSAoIlNUQSBEZWZhdWx0IFBvcnQgUFdEQiA9IDB4JXggXG4iLAorCQkJCSAgcnRsX2RtX2RpZy0+bWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtKSk7CisJCX0KKwl9IGVsc2UgeworCQlydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPQorCQkgICAgcnRscHJpdi0+ZG0uZW50cnlfbWluX3VuZGVjb3JhdGVkc21vb3RoZWRfcHdkYjsKKwkJUlRfVFJBQ0UoQ09NUF9CQl9QT1dFUlNBVklORywgREJHX0xPVUQsCisJCQkgKCJBUCBFeHQgUG9ydCBvciBkaXNjb25uZXQgUFdEQiA9IDB4JXggXG4iLAorCQkJICBydGxfZG1fZGlnLT5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0pKTsKKwl9CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0lZFxuIiwKKwkJCXJ0bF9kbV9kaWctPm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSkpOworfQorCisjaWYgMAordm9pZCAgcnRsODgxMmFlX2RtX3Jzc2lfZHVtcF90b19yZWdpc3RlcigKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodworCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSQV9SU1NJX0RVTVAsIEFkYXB0ZXItPlJ4U3RhdHMuUnhSU1NJUGVyY2VudGFnZVswXSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkJfUlNTSV9EVU1QLCBBZGFwdGVyLT5SeFN0YXRzLlJ4UlNTSVBlcmNlbnRhZ2VbMV0pOworCisJLyogUnggRVZNKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSUzFfUlhfRVZNX0RVTVAsIEFkYXB0ZXItPlJ4U3RhdHMuUnhFVk1kYm1bMF0pOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJTMl9SWF9FVk1fRFVNUCwgQWRhcHRlci0+UnhTdGF0cy5SeEVWTWRibVsxXSk7CisKKwkvKlJ4IFNOUiovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkFfUlhfU05SX0RVTVAsICh1MUJ5dGUpKEFkYXB0ZXItPlJ4U3RhdHMuUnhTTlJkQlswXSkpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJCX1JYX1NOUl9EVU1QLCAodTFCeXRlKShBZGFwdGVyLT5SeFN0YXRzLlJ4U05SZEJbMV0pKTsKKworCS8qUnggQ2ZvX1Nob3J0Ki8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSQV9DRk9fU0hPUlRfRFVNUCwgQWRhcHRlci0+UnhTdGF0cy5SeENmb1Nob3J0WzBdKTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSQl9DRk9fU0hPUlRfRFVNUCwgQWRhcHRlci0+UnhTdGF0cy5SeENmb1Nob3J0WzFdKTsKKworCS8qUnggQ2ZvX1RhaWwqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJBX0NGT19MT05HX0RVTVAsIEFkYXB0ZXItPlJ4U3RhdHMuUnhDZm9UYWlsWzBdKTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSQl9DRk9fTE9OR19EVU1QLCBBZGFwdGVyLT5SeFN0YXRzLlJ4Q2ZvVGFpbFsxXSk7CisKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfZG1fY2hlY2tfcnNzaV9tb25pdG9yKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpkcnZfcHJpdjsKKwl1OCBoMmNfcGFyYW1ldGVyWzNdID0geyAwIH07CisJbG9uZyB0bXBfZW50cnlfbWF4X3B3ZGIgPSAwLCB0bXBfZW50cnlfbWluX3B3ZGIgPSAweGZmOworCisKKwkvKiBBUCAmIEFESE9DICYgTUVTSCAqLworCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZW50cnlfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydl9wcml2LCAmcnRscHJpdi0+ZW50cnlfbGlzdCwgbGlzdCkgeworCQlpZihkcnZfcHJpdi0+cnNzaV9zdGF0LnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCB0bXBfZW50cnlfbWluX3B3ZGIpCisJCQl0bXBfZW50cnlfbWluX3B3ZGIgPSBkcnZfcHJpdi0+cnNzaV9zdGF0LnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisJCWlmKGRydl9wcml2LT5yc3NpX3N0YXQudW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+IHRtcF9lbnRyeV9tYXhfcHdkYikKKwkJCXRtcF9lbnRyeV9tYXhfcHdkYiA9IGRydl9wcml2LT5yc3NpX3N0YXQudW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKworCQkvKmgyY19wYXJhbWV0ZXJbMl0gPSAodTgpIChydGxwcml2LT5kbS51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiICYgMHhGRik7CisJCWgyY19wYXJhbWV0ZXJbMV0gPSAweDIwOworCQloMmNfcGFyYW1ldGVyWzBdID0gIGRydl9wcml2LT5yc3NpX3N0YXQ7CisJCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIEgyQ19SU1NJX1JFUE9SVCwgMywgaDJjX3BhcmFtZXRlcik7Ki8KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmVudHJ5X2xpc3RfbG9jayk7CisKKwkvKiBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCisJaWYgKHRtcF9lbnRyeV9tYXhfcHdkYiAhPSAwKSB7CisJCXJ0bHByaXYtPmRtLmVudHJ5X21heF91bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPSB0bXBfZW50cnlfbWF4X3B3ZGI7CisJCVJUUFJJTlQocnRscHJpdiwgRkRNLCBETV9QV0RCLCAoIkVudHJ5TWF4UFdEQiA9IDB4JWx4KCVsZClcbiIsCisJCQl0bXBfZW50cnlfbWF4X3B3ZGIsIHRtcF9lbnRyeV9tYXhfcHdkYikpOworCX0gZWxzZSB7CisJCXJ0bHByaXYtPmRtLmVudHJ5X21heF91bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPSAwOworCX0KKwkvKiBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCisJaWYgKHRtcF9lbnRyeV9taW5fcHdkYiAhPSAweGZmKSB7CisJCXJ0bHByaXYtPmRtLmVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPSB0bXBfZW50cnlfbWluX3B3ZGI7CisJCVJUUFJJTlQocnRscHJpdiwgRkRNLCBETV9QV0RCLCAoIkVudHJ5TWluUFdEQiA9IDB4JWx4KCVsZClcbiIsCisJCQkJCXRtcF9lbnRyeV9taW5fcHdkYiwgdG1wX2VudHJ5X21pbl9wd2RiKSk7CisJfSBlbHNlIHsKKwkJcnRscHJpdi0+ZG0uZW50cnlfbWluX3VuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA9IDA7CisJfQorCS8qIEluZGljYXRlIFJ4IHNpZ25hbCBzdHJlbmd0aCB0byBGVy4gKi8KKwlpZiAocnRscHJpdi0+ZG0uYl91c2VyYW1hc2spIHsKKwkJaDJjX3BhcmFtZXRlclsyXSA9ICh1OCkgKHJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgJiAweEZGKTsKKwkJaDJjX3BhcmFtZXRlclsxXSA9IDB4MjA7CisJCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCQlydGw4ODIxYWVfZmlsbF9oMmNfY21kKGh3LCBIMkNfUlNTSV9SRVBPUlQsIDMsIGgyY19wYXJhbWV0ZXIpOworCX0gZWxzZSB7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NGZlLCBydGxwcml2LT5kbS51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKTsKKwl9CisJcnRsODgyMWFlX2RtX2ZpbmRfbWluaW11bV9yc3NpKGh3KTsKKwlkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gPSBydGxwcml2LT5kbS5kbV9kaWd0YWJsZS5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG07Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX3dyaXRlX2Nja19jY2FfdGhyZXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGN1cnJlbnRfY2NhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChkbV9kaWd0YWJsZS5jdXJfY2NrX2NjYV90aHJlcyAhPSBjdXJyZW50X2NjYSkKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgRE1fUkVHX0NDS19DQ0FfMTFBQywgY3VycmVudF9jY2EpOworCisJZG1fZGlndGFibGUucHJlX2Nja19jY2FfdGhyZXMgPSBkbV9kaWd0YWJsZS5jdXJfY2NrX2NjYV90aHJlczsKKwlkbV9kaWd0YWJsZS5jdXJfY2NrX2NjYV90aHJlcyA9IGN1cnJlbnRfY2NhOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV93cml0ZV9kaWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGN1cnJlbnRfaWdpKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpZihkbV9kaWd0YWJsZS5zdG9wX2RpZykKKwkJcmV0dXJuOworCisJaWYgKGRtX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlICE9IGN1cnJlbnRfaWdpKXsKKwkJcnRsX3NldF9iYnJlZyhodywgRE1fUkVHX0lHSV9BXzExQUMsIERNX0JJVF9JR0lfMTFBQywgY3VycmVudF9pZ2kpOworCQlpZiAocnRscHJpdi0+cGh5LnJmX3R5cGUgIT0gUkZfMVQxUikKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIERNX1JFR19JR0lfQl8xMUFDLCBETV9CSVRfSUdJXzExQUMsIGN1cnJlbnRfaWdpKTsKKwl9CisJLy9kbV9kaWd0YWJsZS5wcmVfaWd2YWx1ZSA9IGRtX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlOworCWRtX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlID0gY3VycmVudF9pZ2k7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9kbV9kaWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCBkaWdfZHluYW1pY19taW47CisJdTggZGlnX21heF9vZl9taW47CisJYm9vbCBmaXJzdF9jb25uZWN0LCBmaXJzdF9kaXNjb25uZWN0OworCXU4IGRtX2RpZ19tYXgsIGRtX2RpZ19taW4sIG9mZnNldDsKKwl1OCBjdXJyZW50X2lnaSA9ZG1fZGlndGFibGUuY3VyX2lndmFsdWU7CisKKworCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwoInJ0bDg4MjFhZV9kbV9kaWcoKT09PlxuIikpOworCisKKwlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcgPT0gdHJ1ZSkgeworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsKCJydGw4ODIxYWVfZG1fZGlnKCkgUmV0dXJuOiBJbiBTY2FuIFByb2dyZXNzIFxuIikpOworCSAgICAJcmV0dXJuOworCX0KKworCS8qYWRkIGJ5IE5laWwgQ2hlbiB0byBhdm9pZCBQU0QgaXMgcHJvY2Vzc2luZyovCisJZGlnX2R5bmFtaWNfbWluID0gZG1fZGlndGFibGUuZGlnX2R5bmFtaWNfbWluXzA7CisJZmlyc3RfY29ubmVjdCA9IChtYWMtPmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSAmJgorCQkJKGRtX2RpZ3RhYmxlLmJfbWVkaWFfY29ubmVjdF8wID09IGZhbHNlKTsKKwlmaXJzdF9kaXNjb25uZWN0ID0gKG1hYy0+bGlua19zdGF0ZSA8IE1BQzgwMjExX0xJTktFRCkgJiYKKwkJCShkbV9kaWd0YWJsZS5iX21lZGlhX2Nvbm5lY3RfMCA9PSB0cnVlKTsKKworCS8qMSBCb3VuZGFyeSBEZWNpc2lvbiovCisKKworCWRtX2RpZ19tYXggPSAweDVBOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSAhPSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkKKwkJZG1fZGlnX21pbiA9IERNX0RJR19NSU47CisJZWxzZQorCQlkbV9kaWdfbWluID0gMHgxQzsKKworCWRpZ19tYXhfb2ZfbWluID0gRE1fRElHX01BWF9BUDsKKworCWlmIChtYWMtPmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSB7CisJCWlmIChydGxoYWwtPmh3X3R5cGUgIT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJCQlvZmZzZXQgPSAyMDsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gMTA7CisKKwkJaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gKyBvZmZzZXQpID4gZG1fZGlnX21heCkKKwkJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gZG1fZGlnX21heDsKKwkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsX21pbiArIG9mZnNldCkgPCBkbV9kaWdfbWluKQorCQkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXggPSBkbV9kaWdfbWluOworCQllbHNlCisJCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9IGRtX2RpZ3RhYmxlLnJzc2lfdmFsX21pbiArIG9mZnNldDsKKworCQlpZihydGxwcml2LT5kbS5iX29uZV9lbnRyeV9vbmx5KXsKKwkJCW9mZnNldCA9IDA7CisKKwkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gLSBvZmZzZXQgPCBkbV9kaWdfbWluKQorCQkJCWRpZ19keW5hbWljX21pbiA9IGRtX2RpZ19taW47CisJCQllbHNlIGlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gLSBvZmZzZXQgPiBkaWdfbWF4X29mX21pbikKKwkJCQlkaWdfZHluYW1pY19taW4gPSBkaWdfbWF4X29mX21pbjsKKwkJCWVsc2UKKwkJCQlkaWdfZHluYW1pY19taW4gPSBkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gLSBvZmZzZXQ7CisKKwkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkoInJ0bDg4MjFhZV9kbV9kaWcoKSA6IGJPbmVFbnRyeU9ubHk9VFJVRSwgIGRpZ19keW5hbWljX21pbj0weCV4XG4iLAorCQkJCWRpZ19keW5hbWljX21pbikpOworCQkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELAorCQkJCSgicnRsODgyMWFlX2RtX2RpZygpIDogZG1fZGlndGFibGUucnNzaV92YWxfbWluPSVkIixkbV9kaWd0YWJsZS4KKwkJCQlyc3NpX3ZhbF9taW4pKTsKKwkJfSBlbHNlIHsKKwkJCWRpZ19keW5hbWljX21pbiA9IGRtX2RpZ19taW47CisJCX0KKwl9IGVsc2UgeworCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9IGRtX2RpZ19tYXg7CisJCWRpZ19keW5hbWljX21pbiA9IGRtX2RpZ19taW47CisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCSgicnRsODgyMWFlX2RtX2RpZygpIDogTm8gTGlua1xuIikpOworCX0KKworCWlmIChydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA+IDEwMDAwKSB7CisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBBYm5vcm5hbGx5IGZhbHNlIGFsYXJtIGNhc2UuIFxuIikpOworCisJCWlmIChkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgIT0gMykKKwkJICAgICAgICBkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQrKzsKKwkJaWYgKGRtX2RpZ3RhYmxlLmZvcmJpZGRlbl9pZ2kgPCBjdXJyZW50X2lnaSkgeworCQkJZG1fZGlndGFibGUuZm9yYmlkZGVuX2lnaSA9IGN1cnJlbnRfaWdpOworCQkJZG1fZGlndGFibGUubGFyZ2VfZmFfaGl0ID0gMTsKKwkJfQorCisJCWlmIChkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPj0gMykgeworCQkJaWYoKGRtX2RpZ3RhYmxlLmZvcmJpZGRlbl9pZ2kgKyAxKSA+IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4KQorCQkJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXg7CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSAoZG1fZGlndGFibGUuZm9yYmlkZGVuX2lnaSArIDEpOworCQkJZG1fZGlndGFibGUucmVjb3Zlcl9jbnQgPSAzNjAwOworCQl9CisKKwl9IGVsc2UgeworCQkvKlJlY292ZXJ5IG1lY2hhbmlzbSBmb3IgSUdJIGxvd2VyIGJvdW5kKi8KKwkJaWYgKGRtX2RpZ3RhYmxlLnJlY292ZXJfY250ICE9IDApCisJCQlkbV9kaWd0YWJsZS5yZWNvdmVyX2NudCAtLTsKKwkJZWxzZSB7CisJCQlpZiAoZG1fZGlndGFibGUubGFyZ2VfZmFfaGl0IDwgMykgeworCQkJCWlmICgoZG1fZGlndGFibGUuZm9yYmlkZGVuX2lnaSAtMSkgPCBkaWdfZHluYW1pY19taW4pIHsKKwkJCQkJZG1fZGlndGFibGUuZm9yYmlkZGVuX2lnaSA9IGRpZ19keW5hbWljX21pbjsKKwkJCQkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSBkaWdfZHluYW1pY19taW47CisJCQkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBOb3JtYWwgQ2FzZTogQXQgTG93ZXIgQm91bmRcbiIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkbV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpIC0tOworCQkJCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IChkbV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpICsgMSk7CisJCQkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBOb3JtYWwgQ2FzZTogQXBwcm9hY2ggTG93ZXIgQm91bmRcbiIpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRtX2RpZ3RhYmxlLmxhcmdlX2ZhX2hpdCA9IDA7CisJCQl9CisJCX0KKwl9CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELAorCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogcERNX0RpZ1RhYmxlLT5MYXJnZUZBSGl0PSVkXG4iLAorCQlkbV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQpKTsKKworCWlmIChydGxwcml2LT5kbS5kYmdpbmZvLm51bV9xcnlfYmVhY29uX3BrdCA8IDEwKQorCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IGRtX2RpZ19taW47CisKKwlpZiAoZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPiBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCkKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heDsKKworCS8qQWRqdXN0IGluaXRpYWwgZ2FpbiBieSBmYWxzZSBhbGFybSovCisJaWYgKG1hYy0+bGlua19zdGF0ZSA+PSBNQUM4MDIxMV9MSU5LRUQpIHsKKwkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELAorCQkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IERJRyBBZnRlckxpbmtcbiIpKTsKKwkJaWYgKGZpcnN0X2Nvbm5lY3QpIHsKKwkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW4gPD0gZGlnX21heF9vZl9taW4pCisJCQkJY3VycmVudF9pZ2kgPSBkbV9kaWd0YWJsZS5yc3NpX3ZhbF9taW47CisJCQllbHNlCisJCQkJY3VycmVudF9pZ2kgPSBkaWdfbWF4X29mX21pbjsKKwkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkoInJ0bDg4MjFhZV9kbV9kaWc6IEZpcnN0IENvbm5lY3RcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmKHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfYWxsID4gRE1fRElHX0ZBX1RIMikKKwkJCQljdXJyZW50X2lnaSA9IGN1cnJlbnRfaWdpICsgNDsKKwkJCWVsc2UgaWYgKHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfYWxsID4gRE1fRElHX0ZBX1RIMSkKKwkJCQljdXJyZW50X2lnaSA9IGN1cnJlbnRfaWdpICsgMjsKKwkJCWVsc2UgaWYocnRscHJpdi0+ZmFsc2VhbG1fY250LmNudF9hbGwgPCBETV9ESUdfRkFfVEgwKQorCQkJCWN1cnJlbnRfaWdpID0gY3VycmVudF9pZ2kgLSAyOworCisJCQlpZigocnRscHJpdi0+ZG0uZGJnaW5mby5udW1fcXJ5X2JlYWNvbl9wa3QgPCAxMCkKKwkJCQkmJihydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA8IERNX0RJR19GQV9USDEpKSB7CisJCQkJY3VycmVudF9pZ2kgPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbjsKKwkJCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsCisJCQkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBCZWFjb24gaXMgbGVzcyB0aGFuIDEwIGFuZCBGQSBpcyBsZXNzIHRoYW4gNzY4LCBJR0kgR09FUyBUTyAweDFFISEhISEhISEhISEhXG4iKSk7CisJCQl9CisJCX0KKwl9ICBlbHNleworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsCisJCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogRElHIEJlZm9yZUxpbmtcbiIpKTsKKwkJaWYgKGZpcnN0X2Rpc2Nvbm5lY3QpeworCQkJY3VycmVudF9pZ2kgPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbjsKKwkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogRmlyc3QgRGlzQ29ubmVjdCBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qMjAxMi4wMy4zMCBMdWtlTGVlOiBlbmFibGUgRElHIGJlZm9yZSBsaW5rIGJ1dCB3aXRoIHZlcnkgaGlnaCB0aHJlc2hvbGRzKi8KKwkgICAgICAgCWlmIChydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA+IDIwMDApCisJCQkJY3VycmVudF9pZ2kgPSBjdXJyZW50X2lnaSArIDQ7CisJCQllbHNlIGlmIChydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA+IDYwMCkKKwkJCQljdXJyZW50X2lnaSA9IGN1cnJlbnRfaWdpICsgMjsKKwkJCWVsc2UgaWYocnRscHJpdi0+ZmFsc2VhbG1fY250LmNudF9hbGwgPCAzMDApCisJCQkJY3VycmVudF9pZ2kgPSBjdXJyZW50X2lnaSAtIDI7CisJCQlpZiAoY3VycmVudF9pZ2kgPj0gMHgzZSkKKwkJCQljdXJyZW50X2lnaSA9IDB4M2U7CisJCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsKCJydGw4ODIxYWVfZG1fZGlnKCk6IEVuZ2xhbmQgRElHIFxuIikpOworCQl9CisJfQorCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IERJRyBFbmQgQWRqdXN0IElHSVxuIikpOworCS8qIENoZWNrIGluaXRpYWwgZ2FpbiBieSB1cHBlci9sb3dlciBib3VuZCovCisKKwlpZiAoY3VycmVudF9pZ2kgPiBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCkKKwkJY3VycmVudF9pZ2kgPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heDsKKwlpZiAoY3VycmVudF9pZ2kgPCBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbikKKwkJY3VycmVudF9pZ2kgPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbjsKKworCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IHJ4X2dhaW5fcmFuZ2VfbWF4PTB4JXgsIHJ4X2dhaW5fcmFuZ2VfbWluPTB4JXhcbiIsCisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4LCBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbikpOworCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKKwkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IFRvdGFsRkE9JWRcbiIsIHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfYWxsKSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELAorCQkoInJ0bDg4MjFhZV9kbV9kaWcoKTogQ3VySUdWYWx1ZT0weCV4XG4iLCBjdXJyZW50X2lnaSkpOworCisJcnRsODgyMWFlX2RtX3dyaXRlX2RpZyhodywgY3VycmVudF9pZ2kpOworCWRtX2RpZ3RhYmxlLmJfbWVkaWFfY29ubmVjdF8wPSAoKG1hYy0+bGlua19zdGF0ZSA+PSBNQUM4MDIxMV9MSU5LRUQpID8gdHJ1ZSA6ZmFsc2UpOworCWRtX2RpZ3RhYmxlLmRpZ19keW5hbWljX21pbl8wID0gZGlnX2R5bmFtaWNfbWluOworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfZG1fY29tbW9uX2luZm9fc2VsZl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGNudCA9IDA7CisJc3RydWN0IHJ0bF9zdGFfaW5mbyAqZHJ2X3ByaXY7CisKKwlydGxwcml2LT5kbS5iX29uZV9lbnRyeV9vbmx5ID0gZmFsc2U7CisKKwlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkJcnRscHJpdi0+bWFjODAyMTEubGlua19zdGF0ZSA+PSBNQUM4MDIxMV9MSU5LRUQpIHsKKwkJcnRscHJpdi0+ZG0uYl9vbmVfZW50cnlfb25seSA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCXJ0bHByaXYtPm1hYzgwMjExLm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCQlydGxwcml2LT5tYWM4MDIxMS5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgeworCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmVudHJ5X2xpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJ2X3ByaXYsICZydGxwcml2LT5lbnRyeV9saXN0LCBsaXN0KSB7CisJCQljbnQgKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmVudHJ5X2xpc3RfbG9jayk7CisKKwkJaWYgKGNudCA9PSAxKQorCQkJcnRscHJpdi0+ZG0uYl9vbmVfZW50cnlfb25seSA9IHRydWU7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9kbV9mYWxzZV9hbGFybV9jb3VudGVyX3N0YXRpc3RpY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0aXN0aWNzICpmYWxzZWFsbV9jbnQgPSAmKHJ0bHByaXYtPmZhbHNlYWxtX2NudCk7CisJdTMyIGNja19lbmFibGUgPTA7CisKKwkvKnJlYWQgT0ZETSBGQSBjb3VudGVyKi8KKwlmYWxzZWFsbV9jbnQtPmNudF9vZmRtX2ZhaWwgPSBydGxfZ2V0X2JicmVnKGh3LCBPRE1fUkVHX09GRE1fRkFfMTFBQywgQk1BU0tMV09SRCk7CisJZmFsc2VhbG1fY250LT5jbnRfY2NrX2ZhaWwgPSBydGxfZ2V0X2JicmVnKGh3LCBPRE1fUkVHX0NDS19GQV8xMUFDLCBCTUFTS0xXT1JEKTsKKworCWNja19lbmFibGUgPSAgcnRsX2dldF9iYnJlZyhodywgT0RNX1JFR19CQl9SWF9QQVRIXzExQUMsIEJJVCgyOCkpOworCWlmIChjY2tfZW5hYmxlKSAgLyppZihwRE1fT2RtLT5wQmFuZFR5cGUgPT0gT0RNX0JBTkRfMl80RykqLworCQlmYWxzZWFsbV9jbnQtPmNudF9hbGwgPSBmYWxzZWFsbV9jbnQtPmNudF9vZmRtX2ZhaWwgKyBmYWxzZWFsbV9jbnQtPmNudF9jY2tfZmFpbDsKKwllbHNlCisJCWZhbHNlYWxtX2NudC0+Y250X2FsbCA9IGZhbHNlYWxtX2NudC0+Y250X29mZG1fZmFpbDsKKworCS8qcmVzZXQgT0ZETSBGQSBjb3V0bmVyKi8KKwlydGxfc2V0X2JicmVnKGh3LCBPRE1fUkVHX09GRE1fRkFfUlNUXzExQUMsIEJJVCgxNyksIDEpOworCXJ0bF9zZXRfYmJyZWcoaHcsIE9ETV9SRUdfT0ZETV9GQV9SU1RfMTFBQywgQklUKDE3KSwgMCk7CisJLyogcmVzZXQgQ0NLIEZBIGNvdW50ZXIqLworCXJ0bF9zZXRfYmJyZWcoaHcsICBPRE1fUkVHX0NDS19GQV9SU1RfMTFBQywgQklUKDE1KSwgMCk7CisJcnRsX3NldF9iYnJlZyhodywgIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMUFDLCBCSVQoMTUpLCAxKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgKCJDbnRfQ2NrX2ZhaWw9JWRcbiIsCisJCQlmYWxzZWFsbV9jbnQtPmNudF9jY2tfZmFpbCkpOworCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgKCJjbnRfb2ZkbV9mYWlsPSVkXG4iLAorCQkJZmFsc2VhbG1fY250LT5jbnRfb2ZkbV9mYWlsKSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIlRvdGFsIEZhbHNlIEFsYXJtPSVkXG4iLAorCQkJZmFsc2VhbG1fY250LT5jbnRfYWxsKSk7Cit9CisKK3ZvaWQgcnRsODgxMmFlX2RtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmdfdGhlcm1hbG1ldGVyKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RhdGljIHU4IHRtX3RyaWdnZXIgPSAwOworCisJaWYgKCFydGxwcml2LT5kbS5idHhwb3dlcl90cmFja2luZykKKwkJcmV0dXJuOworCisJaWYgKCF0bV90cmlnZ2VyKSB7CisJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCBSRl9UX01FVEVSXzg4RSwgQklUKDE3KXxCSVQoMTYpLCAweDAzKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkgKCJUcmlnZ2VyIDg4MTIgVGhlcm1hbCBNZXRlciEhXG4iKSk7CisJCXRtX3RyaWdnZXIgPSAxOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkgKCJTY2hlZHVsZSBUeFBvd2VyVHJhY2tpbmcgZGlyZWN0IGNhbGwhIVxuIikpOworCQlydGw4ODEyYWVfZG1fdHhwb3dlcl90cmFja2luZ19jYWxsYmFja190aGVybWFsbWV0ZXIoaHcpOworCQl0bV90cmlnZ2VyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9kbV9pcV9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisKKwlpZiAobWFjLT5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgeworCQkvKmlmICgoKnJ0bGRtLT5wX2NoYW5uZWwgIT0gcnRsZG0tPnByZV9jaGFubmVsICkKKwkJCSYmICghbWFjLT5hY3Rfc2Nhbm5pbmcpKSB7CisJCQlydGxkbS0+cHJlX2NoYW5uZWwgPSAqcnRsZG0tPnBfY2hhbm5lbDsKKwkJCXJ0bGRtLT5saW5rZWRfaW50ZXJ2YWwgPSAwOworCQl9Ki8KKworCQlpZihydGxkbS0+bGlua2VkX2ludGVydmFsIDwgMykKKwkJCXJ0bGRtLT5saW5rZWRfaW50ZXJ2YWwgKys7CisKKwkJaWYocnRsZG0tPmxpbmtlZF9pbnRlcnZhbCA9PSAyKQorCQl7CisJCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJCXJ0bDg4MTJhZV9waHlfaXFfY2FsaWJyYXRlKGh3LCBmYWxzZSk7CisJCQllbHNlCisJCQkJcnRsODgyMWFlX3BoeV9pcV9jYWxpYnJhdGUoaHcsIGZhbHNlKTsKKwkJfQorCX0gZWxzZSB7CisJCXJ0bGRtLT5saW5rZWRfaW50ZXJ2YWwgPSAwOworCX0KK30KKworCit2b2lkIHJ0bDg4MTJhZV9nZXRfZGVsdGFfc3dpbmdfdGFibGUoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggKip0ZW1wZXJhdHVyZV91cF9hLAorCXU4ICoqdGVtcGVyYXR1cmVfZG93bl9hLAorCXU4ICoqdGVtcGVyYXR1cmVfdXBfYiwKKwl1OCAqKnRlbXBlcmF0dXJlX2Rvd25fYgorCSkKK3sKKyAgIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXU4IGNoYW5uZWwgPSBydGxwaHktPmN1cnJlbnRfY2hhbm5lbDsKKwl1OCByYXRlID0gcnRsZG0tPnR4X3JhdGU7CisKKworCWlmICggMSA8PSBjaGFubmVsICYmIGNoYW5uZWwgPD0gMTQpIHsKKwkJaWYgKFJYX0hBTF9JU19DQ0tfUkFURShyYXRlKSkgeworCQkgICAgICAgICp0ZW1wZXJhdHVyZV91cF9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX3A7CisJCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9uOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV91cF9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX3A7CisJCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uOworCQl9IGVsc2UgeworCQkgICAgICAgICp0ZW1wZXJhdHVyZV91cF9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3A7CisJCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV91cF9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3A7CisJCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uOworCQl9CisgCX0gZWxzZSBpZiAoIDM2IDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSA2NCkgeworCSAgICAgICAgKnRlbXBlcmF0dXJlX3VwX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wWzBdOworCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bMF07CisJICAgICAgICAqdGVtcGVyYXR1cmVfdXBfYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX3BbMF07CisJICAgICAgICAqdGVtcGVyYXR1cmVfZG93bl9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfblswXTsKKyAgICAJfSBlbHNlIGlmICggMTAwIDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSAxNDApIHsKKwkJKnRlbXBlcmF0dXJlX3VwX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wWzFdOworCQkqdGVtcGVyYXR1cmVfZG93bl9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfblsxXTsKKwkJKnRlbXBlcmF0dXJlX3VwX2IgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wWzFdOworCQkqdGVtcGVyYXR1cmVfZG93bl9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfblsxXTsKKyAgICAJfSBlbHNlIGlmICggMTQ5IDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSAxNzMpIHsKKwkJKnRlbXBlcmF0dXJlX3VwX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wWzJdOworCQkqdGVtcGVyYXR1cmVfZG93bl9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfblsyXTsKKwkJKnRlbXBlcmF0dXJlX3VwX2IgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wWzJdOworCQkqdGVtcGVyYXR1cmVfZG93bl9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfblsyXTsKKyAgICAJfSBlbHNlIHsKKwkgICAgKnRlbXBlcmF0dXJlX3VwX2EgPSAodTgqKXJ0bDg4MThlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX3BfdHhwd3J0cmFjazsKKwkgICAgKnRlbXBlcmF0dXJlX2Rvd25fYSA9KHU4KilydGw4ODE4ZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uX3R4cHdydHJhY2s7CisJICAgICp0ZW1wZXJhdHVyZV91cF9iID0gKHU4KilydGw4ODE4ZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wX3R4cHdydHJhY2s7CisJICAgICp0ZW1wZXJhdHVyZV9kb3duX2IgPSAodTgqKXJ0bDg4MThlX2RlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25fdHhwd3J0cmFjazsKKyAgICAJfQorCisJcmV0dXJuOworfQorCit2b2lkIHJ0bDg4MTJhZV9waHlfbGNjYWxpYnJhdGUoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsICgiPT09PiBydGw4ODEyYWVfcGh5X2xjY2FsaWJyYXRlXG4iKSk7CisKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwgKCI8PT09IHJ0bDg4MTJhZV9waHlfbGNjYWxpYnJhdGVcbiIpKTsKKworfQorCit2b2lkIHJ0bDg4MTJhZV9kbV91cGRhdGVfaW5pdF9yYXRlKAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4IHJhdGUKKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZG0JKnJ0bGRtID0gcnRsX2RtKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCBwID0gMDsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIkdldCBDMkggQ29tbWFuZCEgUmF0ZT0weCV4XG4iLCByYXRlKSk7CisKKwlydGxkbS0+dHhfcmF0ZSA9IHJhdGU7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKXsKKwkJcnRsODgyMWFlX2RtX3R4cHdyX3RyYWNrX3NldF9wd3IoaHcsIE1JWF9NT0RFLCBSRjkwX1BBVEhfQSwgMCk7CisJfQorCWVsc2UKKwl7CisJCWZvciAocCA9IFJGOTBfUEFUSF9BOyBwIDwgTUFYX1BBVEhfTlVNXzg4MTJBOyBwKyspCisJCXsKKwkJCXJ0bDg4MTJhZV9kbV90eHB3cl90cmFja19zZXRfcHdyKGh3LCBCQlNXSU5HLCBwLCAwKTsKKwkJfQorCX0KKworfQorCit1OCBydGw4ODEyYWVfaHdfcmF0ZV90b19tcmF0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCByYXRlCisJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCByZXRfcmF0ZSA9IE1HTl8xTTsKKworCisJc3dpdGNoKHJhdGUpCisJeworCQljYXNlIERFU0NfUkFURTFNOgkJcmV0X3JhdGUgPSBNR05fMU07CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEUyTToJCXJldF9yYXRlID0gTUdOXzJNOwkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFNV81TToJCXJldF9yYXRlID0gTUdOXzVfNU07CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEUxMU06CQlyZXRfcmF0ZSA9IE1HTl8xMU07CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEU2TToJCXJldF9yYXRlID0gTUdOXzZNOwkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFOU06CQlyZXRfcmF0ZSA9IE1HTl85TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTEyTToJCXJldF9yYXRlID0gTUdOXzEyTTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTE4TToJCXJldF9yYXRlID0gTUdOXzE4TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTI0TToJCXJldF9yYXRlID0gTUdOXzI0TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTM2TToJCXJldF9yYXRlID0gTUdOXzM2TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTQ4TToJCXJldF9yYXRlID0gTUdOXzQ4TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURTU0TToJCXJldF9yYXRlID0gTUdOXzU0TTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzA6CXJldF9yYXRlID0gTUdOX01DUzA7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1MxOglyZXRfcmF0ZSA9IE1HTl9NQ1MxOwkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTMjoJcmV0X3JhdGUgPSBNR05fTUNTMjsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzM6CXJldF9yYXRlID0gTUdOX01DUzM7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1M0OglyZXRfcmF0ZSA9IE1HTl9NQ1M0OwkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTNToJcmV0X3JhdGUgPSBNR05fTUNTNTsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzY6CXJldF9yYXRlID0gTUdOX01DUzY7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1M3OglyZXRfcmF0ZSA9IE1HTl9NQ1M3OwkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTODoJcmV0X3JhdGUgPSBNR05fTUNTODsJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzk6CXJldF9yYXRlID0gTUdOX01DUzk7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1MxMDoJcmV0X3JhdGUgPSBNR05fTUNTMTA7CWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzExOglyZXRfcmF0ZSA9IE1HTl9NQ1MxMTsJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTMTI6CXJldF9yYXRlID0gTUdOX01DUzEyOwlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1MxMzoJcmV0X3JhdGUgPSBNR05fTUNTMTM7CWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzE0OglyZXRfcmF0ZSA9IE1HTl9NQ1MxNDsJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTMTU6CXJldF9yYXRlID0gTUdOX01DUzE1OwlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMDoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzA7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMToJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzE7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMjoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzI7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMzoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzM7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNDoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzQ7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNToJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzU7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNjoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzY7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNzoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzc7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTODoJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzg7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTOToJcmV0X3JhdGUgPSBNR05fVkhUMVNTX01DUzk7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMDoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzA7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMToJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzE7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMjoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzI7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMzoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzM7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNDoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzQ7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNToJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzU7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNjoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzY7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNzoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzc7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTODoJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzg7CQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTOToJcmV0X3JhdGUgPSBNR05fVkhUMlNTX01DUzk7CQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJId1JhdGVUb01SYXRlODgxMigpOiBOb24gc3VwcG9ydGVkIFJhdGUgWyV4XSEhIVxuIixyYXRlICkpOworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXRfcmF0ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CW9kbV9UeFB3clRyYWNrU2V0UHdyODhFKCkKKyAqCisgKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpZ24gdG8gZmxhZy4KKyAqCQkJCU9GRE0gJiBDQ0sgYXJlIGFsbCBkaWZmZXJlbnQuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDQvMjMvMjAxMglNSEMJCUNyZWF0ZSBWZXJzaW9uIDAuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBydGw4ODEyYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3cihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwllbnVtIHB3cl90cmFja19jb250cm9sX21ldGhvZCBtZXRob2QsIHU4IHJmX3BhdGgsIHU4IGNoYW5uZWxfbWFwcGVkX2luZGV4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtCSpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTMyIGZpbmFsX2JiX3N3aW5nX2lkeFsyXTsKKwl1OCBwd3JfdHJhY2tpbmdfbGltaXQgPSAyNjsgLyorMS4wZEIqLworCXU4IHR4X3JhdGUgPSAweEZGOworCXM4IGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPSAwOworCisJaWYocnRsZG0tPnR4X3JhdGUgIT0gMHhGRikKKwkJdHhfcmF0ZSA9IHJ0bDg4MTJhZV9od19yYXRlX3RvX21yYXRlKGh3LCBydGxkbS0+dHhfcmF0ZSk7CisKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIj09PT5ydGw4ODEyYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3clxuIikpOworCisJaWYodHhfcmF0ZSAhPSAweEZGKSB7IC8qMjAxMzA0MjkgTWltaWMgTW9kaWZ5IEhpZ2ggUmF0ZSBCQlN3aW5nIExpbWl0LiovCisJCS8qQ0NLKi8KKwkJaWYoKHR4X3JhdGUgPj0gTUdOXzFNKSAmJiAodHhfcmF0ZSA8PSBNR05fMTFNKSkKKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDMyOyAvKis0ZEIqLworCQkvKk9GRE0qLworCQllbHNlIGlmKCh0eF9yYXRlID49IE1HTl82TSkgJiYgKHR4X3JhdGUgPD0gTUdOXzQ4TSkpCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl81NE0pCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyODsgLyorMmRCKi8KKwkJLypIVCovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzApICYmICh0eF9yYXRlIDw9IE1HTl9NQ1MyKSkgLypRUFNLL0JQU0sqLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMzQ7IC8qKzVkQiovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzMpICYmICh0eF9yYXRlIDw9IE1HTl9NQ1M0KSkgLyoxNlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fTUNTNSkgJiYgKHR4X3JhdGUgPD0gTUdOX01DUzcpKSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI4OyAvKisyZEIqLworCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzgpICYmICh0eF9yYXRlIDw9IE1HTl9NQ1MxMCkpIC8qUVBTSy9CUFNLKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDM0OyAvKis1ZEIqLworCQllbHNlIGlmKCh0eF9yYXRlID49IE1HTl9NQ1MxMSkgJiYgKHR4X3JhdGUgPD0gTUdOX01DUzEyKSkgLyoxNlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fTUNTMTMpICYmICh0eF9yYXRlIDw9IE1HTl9NQ1MxNSkpIC8qNjRRQU0qLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMjg7IC8qKzJkQiovCisKKwkJLyoyIFZIVCovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX1ZIVDFTU19NQ1MwKSAmJiAodHhfcmF0ZSA8PSBNR05fVkhUMVNTX01DUzIpKSAvKlFQU0svQlBTSyovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzNDsgLyorNWRCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fVkhUMVNTX01DUzMpICYmICh0eF9yYXRlIDw9IE1HTl9WSFQxU1NfTUNTNCkpIC8qMTZRQU0qLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMzA7IC8qKzNkQiovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX1ZIVDFTU19NQ1M1KSYmKHR4X3JhdGUgPD0gTUdOX1ZIVDFTU19NQ1M2KSkgLyo2NFFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyODsgLyorMmRCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl9WSFQxU1NfTUNTNykgLyo2NFFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyNjsgLyorMWRCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl9WSFQxU1NfTUNTOCkgLyoyNTZRQU0qLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMjQ7IC8qKzBkQiovCisJCWVsc2UgaWYodHhfcmF0ZSA9PSBNR05fVkhUMVNTX01DUzkpIC8qMjU2UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDIyOyAvKi0xZEIqLworCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX1ZIVDJTU19NQ1MwKSYmKHR4X3JhdGUgPD0gTUdOX1ZIVDJTU19NQ1MyKSkgLypRUFNLL0JQU0sqLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMzQ7IC8qKzVkQiovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX1ZIVDJTU19NQ1MzKSYmKHR4X3JhdGUgPD0gTUdOX1ZIVDJTU19NQ1M0KSkgLyoxNlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fVkhUMlNTX01DUzUpJiYodHhfcmF0ZSA8PSBNR05fVkhUMlNTX01DUzYpKSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI4OyAvKisyZEIqLworCQllbHNlIGlmKHR4X3JhdGUgPT0gTUdOX1ZIVDJTU19NQ1M3KSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI2OyAvKisxZEIqLworCQllbHNlIGlmKHR4X3JhdGUgPT0gTUdOX1ZIVDJTU19NQ1M4KSAvKjI1NlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyNDsgLyorMGRCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl9WSFQyU1NfTUNTOSkgLyoyNTZRQU0qLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMjI7IC8qLTFkQiovCisJCWVsc2UKKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI0OworCX0KKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJKCJUeFJhdGU9MHgleCwgUHdyVHJhY2tpbmdMaW1pdD0lZFxuIiwgdHhfcmF0ZSwgcHdyX3RyYWNraW5nX2xpbWl0KSk7CisKKworCWlmIChtZXRob2QgPT0gQkJTV0lORykgeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgiPT09PnJ0bDg4MTJhZV9kbV90eHB3cl90cmFja19zZXRfcHdyXG4iKSk7CisKKwkJaWYgKHJmX3BhdGggPT0gUkY5MF9QQVRIX0EpIHsKKwkJCWZpbmFsX2JiX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0gPQorCQkJCShydGxkbS0+b2ZkbV9pbmRleFtSRjkwX1BBVEhfQV0gPiBwd3JfdHJhY2tpbmdfbGltaXQpID8KKwkJCQlwd3JfdHJhY2tpbmdfbGltaXQgOiBydGxkbS0+b2ZkbV9pbmRleFtSRjkwX1BBVEhfQV07CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoInBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5PRkRNX2luZGV4W09ETV9SRl9QQVRIX0FdPSVkLCBcCisJCQkJcERNX09kbS0+UmVhbEJiU3dpbmdJZHhbT0RNX1JGX1BBVEhfQV09JWRcbiIsCisJCQkJcnRsZG0tPm9mZG1faW5kZXhbUkY5MF9QQVRIX0FdLCBmaW5hbF9iYl9zd2luZ19pZHhbUkY5MF9QQVRIX0FdKSk7CisKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1RYU0NBTEUsIDB4RkZFMDAwMDAsIHJ0bDg4MTJhZV90eHNjYWxpbmdfdGFibGVbZmluYWxfYmJfc3dpbmdfaWR4W1JGOTBfUEFUSF9BXV0pOworCQl9IGVsc2UgeworCQkJZmluYWxfYmJfc3dpbmdfaWR4W1JGOTBfUEFUSF9CXSA9CisJCQkJcnRsZG0tPm9mZG1faW5kZXhbUkY5MF9QQVRIX0JdID4gcHdyX3RyYWNraW5nX2xpbWl0ID8gXAorCQkJCXB3cl90cmFja2luZ19saW1pdCA6IHJ0bGRtLT5vZmRtX2luZGV4W1JGOTBfUEFUSF9CXTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgicERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLk9GRE1faW5kZXhbT0RNX1JGX1BBVEhfQl09JWQsIFwKKwkJCQlwRE1fT2RtLT5SZWFsQmJTd2luZ0lkeFtPRE1fUkZfUEFUSF9CXT0lZFxuIiwKKwkJCQlydGxkbS0+b2ZkbV9pbmRleFtSRjkwX1BBVEhfQl0sIGZpbmFsX2JiX3N3aW5nX2lkeFtSRjkwX1BBVEhfQl0pKTsKKworCQkJcnRsX3NldF9iYnJlZyhodywgUkJfVFhTQ0FMRSwgMHhGRkUwMDAwMCwgcnRsODgxMmFlX3R4c2NhbGluZ190YWJsZVtmaW5hbF9iYl9zd2luZ19pZHhbUkY5MF9QQVRIX0JdXSk7CisJCX0KKwl9IGVsc2UgaWYgKG1ldGhvZCA9PSBNSVhfTU9ERSkgeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgicERNX09kbS0+RGVmYXVsdE9mZG1JbmRleD0lZCwgXAorCQkJcERNX09kbS0+QWJvc2x1dGVfT0ZETVN3aW5nSWR4W1JGUGF0aF09JWQsIFJGX1BhdGggPSAlZFxuIiwKKwkJCXJ0bGRtLT5kZWZhdWx0X29mZG1faW5kZXgsIHJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSwKKwkJCXJmX3BhdGggKSk7CisKKworCQlmaW5hbF9vZmRtX3N3aW5nX2luZGV4ID0gcnRsZG0tPmRlZmF1bHRfb2ZkbV9pbmRleCArIHJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXTsKKworCQlpZiAocmZfcGF0aCA9PSBSRjkwX1BBVEhfQSkgeworCQkJaWYoZmluYWxfb2ZkbV9zd2luZ19pbmRleCA+IHB3cl90cmFja2luZ19saW1pdCkgeyAgICAgLypCQlN3aW5nIGhpZ2hlciB0aGVuIExpbWl0Ki8KKworCQkJCXJ0bGRtLT5yZW1uYW50X2Nja19pZHggPSBmaW5hbF9vZmRtX3N3aW5nX2luZGV4IC0gcHdyX3RyYWNraW5nX2xpbWl0OworCQkJCS8qIENDSyBGb2xsb3cgdGhlIHNhbWUgY29tcGVuc2F0ZSB2YWx1ZSBhcyBQYXRoIEEqLworCQkJCXJ0bGRtLT5yZW1uYW50X29mZG1fc3dpbmdfaWR4W3JmX3BhdGhdID0gZmluYWxfb2ZkbV9zd2luZ19pbmRleCAtIHB3cl90cmFja2luZ19saW1pdDsKKworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1RYU0NBTEUsIDB4RkZFMDAwMDAsIHJ0bDg4MTJhZV90eHNjYWxpbmdfdGFibGVbcHdyX3RyYWNraW5nX2xpbWl0XSk7CisKKwkJCQlydGxkbS0+bW9kaWZ5X3R4YWdjX2ZsYWdfcGF0aF9hID0gdHJ1ZTsKKworCQkJCS8qU2V0IFR4QUdDIFBhZ2UgQ3t9OyovCisJCQkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCwgUkY5MF9QQVRIX0EpOworCisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSgiKioqKioqUGF0aF9BIE92ZXIgQkJTd2luZyBMaW1pdCAsIFB3clRyYWNraW5nTGltaXQgPSAlZCAsIFJlbW5hbnQgVHhBR0MgVmFsdWUgPSAlZCBcbiIsCisJCQkJCXB3cl90cmFja2luZ19saW1pdCwgcnRsZG0tPnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF0pKTsKKwkJCX0gZWxzZSBpZiAoZmluYWxfb2ZkbV9zd2luZ19pbmRleCA8IDApIHsKKwkJCQlydGxkbS0+cmVtbmFudF9jY2tfaWR4ID0gZmluYWxfb2ZkbV9zd2luZ19pbmRleDsKKwkJCQkvKiBDQ0sgRm9sbG93IHRoZSBzYW1lIGNvbXBlbnNhdGUgdmFsdWUgYXMgUGF0aCBBKi8KKwkJCQlydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSA9IGZpbmFsX29mZG1fc3dpbmdfaW5kZXg7CisKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9UWFNDQUxFLCAweEZGRTAwMDAwLCBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlWzBdKTsKKworCQkJCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2EgPSB0cnVlOworCisJCQkJLypTZXQgVHhBR0MgUGFnZSBDe307Ki8KKwkJCQlydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2xldmVsX2J5X3BhdGgoaHcsIHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsLCBSRjkwX1BBVEhfQSk7CisKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkJKCIqKioqKipQYXRoX0EgTG93ZXIgdGhlbiBCQlN3aW5nIGxvd2VyIGJvdW5kICAwICwgUmVtbmFudCBUeEFHQyBWYWx1ZSA9ICVkIFxuIiwKKwkJCQkJIHJ0bGRtLT5yZW1uYW50X29mZG1fc3dpbmdfaWR4W3JmX3BhdGhdKSk7CisJCQl9IGVsc2UgeworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1RYU0NBTEUsIDB4RkZFMDAwMDAsIHJ0bDg4MTJhZV90eHNjYWxpbmdfdGFibGVbZmluYWxfb2ZkbV9zd2luZ19pbmRleF0pOworCisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSgiKioqKioqUGF0aF9BIENvbXBlbnNhdGUgd2l0aCBCQlN3aW5nICwgRmluYWxfT0ZETV9Td2luZ19JbmRleCA9ICVkIFxuIiwKKwkJCQkJZmluYWxfb2ZkbV9zd2luZ19pbmRleCkpOworCisJCQkJaWYocnRsZG0tPm1vZGlmeV90eGFnY19mbGFnX3BhdGhfYSkgeyAvKklmIFR4QUdDIGhhcyBjaGFuZ2VkLCByZXNldCBUeEFHQyBhZ2FpbiovCisJCQkJCXJ0bGRtLT5yZW1uYW50X2Nja19pZHggPSAwOworCQkJCQlydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSA9IDA7CisKKwkJCQkJLypTZXQgVHhBR0MgUGFnZSBDe307Ki8KKwkJCQkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCwgUkY5MF9QQVRIX0EpOworCisJCQkJCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2EgPSBmYWxzZTsKKworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkJCSgiKioqKioqUGF0aF9BIHBETV9PZG0tPk1vZGlmeV9UeEFHQ19GbGFnID0gRkFMU0UgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJmX3BhdGggPT0gUkY5MF9QQVRIX0IpIHsKKwkJCWlmKGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPiBwd3JfdHJhY2tpbmdfbGltaXQpIHsgICAgLypCQlN3aW5nIGhpZ2hlciB0aGVuIExpbWl0Ki8KKwkJCQlydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSA9IGZpbmFsX29mZG1fc3dpbmdfaW5kZXggLSBwd3JfdHJhY2tpbmdfbGltaXQ7CisKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBSQl9UWFNDQUxFLCAweEZGRTAwMDAwLCBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlW3B3cl90cmFja2luZ19saW1pdF0pOworCisJCQkJcnRsZG0tPm1vZGlmeV90eGFnY19mbGFnX3BhdGhfYiA9IHRydWU7CisKKwkJCQkvKlNldCBUeEFHQyBQYWdlIEV7fTsqLworCQkJCXJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwsIFJGOTBfUEFUSF9CKTsKKworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkoIioqKioqKlBhdGhfQiBPdmVyIEJCU3dpbmcgTGltaXQgLCBQd3JUcmFja2luZ0xpbWl0ID0gJWQgLCBSZW1uYW50IFR4QUdDIFZhbHVlID0gJWQgXG4iLAorCQkJCQlwd3JfdHJhY2tpbmdfbGltaXQsIHJ0bGRtLT5yZW1uYW50X29mZG1fc3dpbmdfaWR4W3JmX3BhdGhdKSk7CisJCQl9IGVsc2UgaWYgKGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPCAwKSB7CisJCQkJcnRsZG0tPnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF0gPSBmaW5hbF9vZmRtX3N3aW5nX2luZGV4OworCisJCQkJcnRsX3NldF9iYnJlZyhodywgUkJfVFhTQ0FMRSwgMHhGRkUwMDAwMCwgcnRsODgxMmFlX3R4c2NhbGluZ190YWJsZVswXSk7CisKKwkJCQlydGxkbS0+bW9kaWZ5X3R4YWdjX2ZsYWdfcGF0aF9iID0gdHJ1ZTsKKworCQkJCS8qU2V0IFR4QUdDIFBhZ2UgRXt9OyovCisJCQkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCwgUkY5MF9QQVRIX0IpOworCisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSgiKioqKioqUGF0aF9CIExvd2VyIHRoZW4gQkJTd2luZyBsb3dlciBib3VuZCAgMCAsIFJlbW5hbnQgVHhBR0MgVmFsdWUgPSAlZCBcbiIsCisJCQkJCXJ0bGRtLT5yZW1uYW50X29mZG1fc3dpbmdfaWR4W3JmX3BhdGhdICkpOworCQkJfSBlbHNlIHsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBSQl9UWFNDQUxFLCAweEZGRTAwMDAwLCBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlW2ZpbmFsX29mZG1fc3dpbmdfaW5kZXhdKTsKKworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkoIioqKioqKlBhdGhfQiBDb21wZW5zYXRlIHdpdGggQkJTd2luZyAsIEZpbmFsX09GRE1fU3dpbmdfSW5kZXggPSAlZCBcbiIsCisJCQkJCWZpbmFsX29mZG1fc3dpbmdfaW5kZXgpKTsKKworCQkJCWlmKHJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2IpIHsgLypJZiBUeEFHQyBoYXMgY2hhbmdlZCwgcmVzZXQgVHhBR0MgYWdhaW4qLworCQkJCQlydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSA9IDA7CisKKwkJCQkJLypTZXQgVHhBR0MgUGFnZSBFe307Ki8KKwkJCQkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCwgUkY5MF9QQVRIX0IpOworCisJCQkJCXJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2IgPSBmYWxzZTsKKworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkJCSgiKioqKioqUGF0aF9CIHBETV9PZG0tPk1vZGlmeV9UeEFHQ19GbGFnID0gRkFMU0UgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlyZXR1cm47CisJfQorfQorCit2b2lkIHJ0bDg4MTJhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcgorCShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2RtCSpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXU4IHRoZXJtYWxfdmFsdWUgPSAwLCBkZWx0YSwgZGVsdGFfbGNrLCBkZWx0YV9pcWssIHAgPSAwLCBpID0gMDsKKwl1OCB0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCA9IDA7CisJdTMyIHRoZXJtYWxfdmFsdWVfYXZnID0gMDsKKworCXU4IG9mZG1fbWluX2luZGV4ID0gNjsgIC8qT0ZETSBCQiBTd2luZyBzaG91bGQgYmUgbGVzcyB0aGFuICszLjBkQiwgd2hpY2ggaXMgcmVxdWlyZWQgYnkgQXJ0aHVyKi8KKwl1OCBpbmRleF9mb3JfY2hhbm5lbCA9IDA7IC8qIEdldFJpZ2h0Q2hubFBsYWNlZm9ySVFLKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCkqLworCisJLyogMS4gVGhlIGZvbGxvd2luZyBUV08gdGFibGVzIGRlY2lkZSB0aGUgZmluYWwgaW5kZXggb2YgT0ZETS9DQ0sgc3dpbmcgdGFibGUuKi8KKwl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hOworCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYTsKKwl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9iOworCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYjsKKworCS8qMi4gSW5pdGlsaXphdGlvbiAoIDcgc3RlcHMgaW4gdG90YWwgKSovCisJcnRsODgxMmFlX2dldF9kZWx0YV9zd2luZ190YWJsZShodywgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYSwKKwkJCQkJCQkJCSh1OCoqKSZkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYSwKKwkJCQkJCQkJCSAgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYiwKKwkJCQkJCQkJCSAgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90ZG93bl9iKTsKKworCXJ0bGRtLT5idHhwb3dlcl90cmFja2luZ2luaXQgPSB0cnVlOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSgiPT09PnJ0bDg4MTJhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlciwgXAorCQkgXG4gcERNX09kbS0+QmJTd2luZ0lkeENja0Jhc2U6ICVkLCBwRE1fT2RtLT5CYlN3aW5nSWR4T2ZkbUJhc2VbQV06XAorCQkgJWQsIHBETV9PZG0tPkRlZmF1bHRPZmRtSW5kZXg6ICVkXG4iLAorCQlydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlLAorCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtSRjkwX1BBVEhfQV0sCisJCXJ0bGRtLT5kZWZhdWx0X29mZG1faW5kZXgpKTsKKworCXRoZXJtYWxfdmFsdWUgPSAodTgpcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1RfTUVURVJfODgxMkEsIDB4ZmMwMCk7CS8qMHg0MjogUkYgUmVnWzE1OjEwXSA4OEUqLworCWlmKCAhIHJ0bGRtLT50eHBvd2VyX3RyYWNrX2NvbnRyb2wgfHwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPT0gMCB8fAorCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9PSAweEZGKQorICAgICAgICAJcmV0dXJuOworCisKKwkvKiAzLiBJbml0aWFsaXplIFRoZXJtYWxWYWx1ZXMgb2YgUkZDYWxpYnJhdGVJbmZvKi8KKworCWlmKHJ0bGhhbC0+cmVsb2FkdHhwb3dlcmluZGV4KQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoInJlbG9hZCBvZmRtIGluZGV4IGZvciBiYW5kIHN3aXRjaFxuIikpOworCX0KKworCS8qNC4gQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhlcm1hbCBtZXRlciovCisJcnRsZG0tPnRoZXJtYWx2YWx1ZV9hdmdbcnRsZG0tPnRoZXJtYWx2YWx1ZV9hdmdfaW5kZXhdID0gdGhlcm1hbF92YWx1ZTsKKwlydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z19pbmRleCsrOworCWlmKHJ0bGRtLT50aGVybWFsdmFsdWVfYXZnX2luZGV4ID09IEFWR19USEVSTUFMX05VTV84ODEyQSkKKwkJLypBdmVyYWdlIHRpbWVzID0gIGMuQXZlcmFnZVRoZXJtYWxOdW0qLworCQlydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z19pbmRleCA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBBVkdfVEhFUk1BTF9OVU1fODgxMkE7IGkrKykKKwl7CisJCWlmKHJ0bGRtLT50aGVybWFsdmFsdWVfYXZnW2ldKQorCQl7CisJCQl0aGVybWFsX3ZhbHVlX2F2ZyArPSBydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z1tpXTsKKwkJCXRoZXJtYWxfdmFsdWVfYXZnX2NvdW50Kys7CisJCX0KKwl9CisKKwlpZih0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCkgLypDYWxjdWxhdGUgQXZlcmFnZSBUaGVybWFsVmFsdWUgYWZ0ZXIgYXZlcmFnZSBlbm91Z2ggdGltZXMqLworCXsKKwkJdGhlcm1hbF92YWx1ZSA9ICh1OCkodGhlcm1hbF92YWx1ZV9hdmcgLyB0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJBVkcgVGhlcm1hbCBNZXRlciA9IDB4JVgsIEVGVVNFIFRoZXJtYWwgQmFzZSA9IDB4JVhcbiIsCisJCQl0aGVybWFsX3ZhbHVlLCBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikpOworCX0KKworCS8qNS4gQ2FsY3VsYXRlIGRlbHRhLCBkZWx0YV9MQ0ssIGRlbHRhX0lRSy4qLworCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcm1hbCB2YWx1ZSBjaGFuZ2VzIG9yIG5vdC4qLworCWRlbHRhID0gKHRoZXJtYWxfdmFsdWUgPiBydGxkbS0+dGhlcm1hbHZhbHVlKSA/IFwKKwkJKHRoZXJtYWxfdmFsdWUgLSBydGxkbS0+dGhlcm1hbHZhbHVlKTogXAorCQkocnRsZG0tPnRoZXJtYWx2YWx1ZSAtIHRoZXJtYWxfdmFsdWUpOworCWRlbHRhX2xjayA9ICh0aGVybWFsX3ZhbHVlID4gcnRsZG0tPnRoZXJtYWx2YWx1ZV9sY2spID8gXAorCQkodGhlcm1hbF92YWx1ZSAtIHJ0bGRtLT50aGVybWFsdmFsdWVfbGNrKSA6IFwKKwkJKHJ0bGRtLT50aGVybWFsdmFsdWVfbGNrIC0gdGhlcm1hbF92YWx1ZSk7CisJZGVsdGFfaXFrID0gKHRoZXJtYWxfdmFsdWUgPiBydGxkbS0+dGhlcm1hbHZhbHVlX2lxaykgPyBcCisJCSh0aGVybWFsX3ZhbHVlIC0gcnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWspIDogXAorCQkocnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWsgLSB0aGVybWFsX3ZhbHVlKTsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIihkZWx0YSwgZGVsdGFfTENLLCBkZWx0YV9JUUspID0gKCVkLCAlZCwgJWQpXG4iLAorCQlkZWx0YSwgZGVsdGFfbGNrLCBkZWx0YV9pcWspKTsKKworCS8qIDYuIElmIG5lY2Vzc2FyeSwgZG8gTENLLgkqLworCisJaWYgKGRlbHRhX2xjayA+PSBJUUtfVEhSRVNIT0xEKSAvKkRlbHRhIHRlbXBlcmF0dXJlIGlzIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIDIwIGNlbnRpZ3JhZGUuKi8KKwl7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJkZWx0YV9MQ0soJWQpID49IFRocmVzaG9sZF9JUUsoJWQpXG4iLAorCQkJZGVsdGFfbGNrLCBJUUtfVEhSRVNIT0xEKSk7CisJCXJ0bGRtLT50aGVybWFsdmFsdWVfbGNrID0gdGhlcm1hbF92YWx1ZTsKKwkJcnRsODgxMmFlX3BoeV9sY2NhbGlicmF0ZShodyk7CisJfQorCisJLyo3LiBJZiBuZWNlc3NhcnksIG1vdmUgdGhlIGluZGV4IG9mIHN3aW5nIHRhYmxlIHRvIGFkanVzdCBUeCBwb3dlci4qLworCisJaWYgKGRlbHRhID4gMCAmJiBydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sKQorCXsKKwkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcnJlbmNlLiovCisJICAgIAlkZWx0YSA9IHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA/IFwKKwkJICAgIAkodGhlcm1hbF92YWx1ZSAtIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSA6IFwKKwkJICAgIAkocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsX3ZhbHVlKTsKKworCQlpZiAoZGVsdGEgPj0gVFhQV1JfVFJBQ0tfVEFCTEVfU0laRSkKKwkJCWRlbHRhID0gVFhQV1JfVFJBQ0tfVEFCTEVfU0laRSAtIDE7CisKKwkJLyo3LjEgVGhlIEZpbmFsIFBvd2VyIEluZGV4ID0gQmFzZUluZGV4ICsgUG93ZXJJbmRleE9mZnNldCovCisKKwkJaWYodGhlcm1hbF92YWx1ZSA+IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSB7CisKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJICAgIAkJKCJkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2FbJWRdID0gJWRcbiIsCisJCQkgICAgCQlkZWx0YSwgZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hW2RlbHRhXSkpOworCQkJcnRsZG0tPmRlbHRhX3Bvd2VyX2luZGV4X2xhc3RbUkY5MF9QQVRIX0FdID0gcnRsZG0tPmRlbHRhX3Bvd2VyX2luZGV4W1JGOTBfUEFUSF9BXTsKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQV0gPSBkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2FbZGVsdGFdOworCisJCQlydGxkbS0+YWJvc2x1dGVfb2ZkbV9zd2luZ19pZHhbUkY5MF9QQVRIX0FdID0gIGRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYVtkZWx0YV07CisJCQkvKlJlY29yZCBkZWx0YSBzd2luZyBmb3IgbWl4IG1vZGUgcG93ZXIgdHJhY2tpbmcqLworCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgiKioqKioqVGVtcCBpcyBoaWdoZXIgYW5kIHBETV9PZG0tPkFib3NsdXRlX09GRE1Td2luZ0lkeFtPRE1fUkZfUEFUSF9BXSA9ICVkXG4iLAorCQkJcnRsZG0tPmFib3NsdXRlX29mZG1fc3dpbmdfaWR4W1JGOTBfUEFUSF9BXSkpOworCisKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYlslZF0gPSAlZFxuIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsIGRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYltkZWx0YV0pKTsKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W1JGOTBfUEFUSF9CXSA9IHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQl07CisJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbUkY5MF9QQVRIX0JdID0gZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9iW2RlbHRhXTsKKworCQkJcnRsZG0tPmFib3NsdXRlX29mZG1fc3dpbmdfaWR4W1JGOTBfUEFUSF9CXSA9ICBkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2JbZGVsdGFdOworCQkJLypSZWNvcmQgZGVsdGEgc3dpbmcgZm9yIG1peCBtb2RlIHBvd2VyIHRyYWNraW5nKi8KKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoIioqKioqKlRlbXAgaXMgaGlnaGVyIGFuZCBwRE1fT2RtLT5BYm9zbHV0ZV9PRkRNU3dpbmdJZHhbT0RNX1JGX1BBVEhfQl0gPSAlZFxuIiwKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQl0pKTsKKworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKyAgICAgICAgICAgICAgIAkgCSgiZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2FbJWRdID0gJWRcbiIsCisgICAgICAgICAgICAgICAJIAlkZWx0YSwgZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2FbZGVsdGFdKSk7CisKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W1JGOTBfUEFUSF9BXSA9IHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQV07CisJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbUkY5MF9QQVRIX0FdID0gLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYVtkZWx0YV07CisKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0gPSAgLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYVtkZWx0YV07CisJCQkvKiBSZWNvcmQgZGVsdGEgc3dpbmcgZm9yIG1peCBtb2RlIHBvd2VyIHRyYWNraW5nKi8KKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCIqKioqKipUZW1wIGlzIGxvd2VyIGFuZCBwRE1fT2RtLT5BYm9zbHV0ZV9PRkRNU3dpbmdJZHhbT0RNX1JGX1BBVEhfQV0gPSAlZFxuIiwKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0pKTsKKworCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKyAgICAgICAgICAgICAgICAJCSgiZGVsdGFTd2luZ1RhYmxlSWR4X1RET1dOX0JbJWRdID0gJWRcbiIsCisgICAgICAgICAgICAgICAgCQlkZWx0YSwgZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2JbZGVsdGFdKSk7CisKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W1JGOTBfUEFUSF9CXSA9IHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQl07CisJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbUkY5MF9QQVRIX0JdID0gLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYltkZWx0YV07CisKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQl0gPSAgLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYltkZWx0YV07CisJCQkvKlJlY29yZCBkZWx0YSBzd2luZyBmb3IgbWl4IG1vZGUgcG93ZXIgdHJhY2tpbmcqLworCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgiKioqKioqVGVtcCBpcyBsb3dlciBhbmQgcERNX09kbS0+QWJvc2x1dGVfT0ZETVN3aW5nSWR4W09ETV9SRl9QQVRIX0JdID0gJWRcbiIsCisJCQlydGxkbS0+YWJvc2x1dGVfb2ZkbV9zd2luZ19pZHhbUkY5MF9QQVRIX0JdKSk7CisgCQl9CisKKwkJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUEFUSF9OVU1fODgxMkE7IHArKykKKyAgICAgICAgCXsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkgICAgICAgICAgICAgICAgKCJcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gW1BhdGgtJWNdIFwKKwkJICAgICAgICAgICAgICAgIENhbGN1bGF0aW5nIFBvd2VySW5kZXhPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsCisJCSAgICAgICAgICAgICAgICAocCA9PSBSRjkwX1BBVEhfQSA/ICdBJyA6ICdCJykpKTsKKworCQkgICAgCWlmIChydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbcF0gPT0gcnRsZG0tPmRlbHRhX3Bvd2VyX2luZGV4X2xhc3RbcF0pCisJCQkJLypJZiBUaGVybWFsIHZhbHVlIGNoYW5nZXMgYnV0IGxvb2t1cCB0YWJsZSB2YWx1ZSBzdGlsbCB0aGUgc2FtZSovCisJCSAgICAJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF0gPSAwOworCQkgICAgCWVsc2UKKwkJICAgIAkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXSA9CisJCSAgICAJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbcF0gLSBydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhfbGFzdFtwXTsKKwkJCQkvKlBvd2VyIEluZGV4IERpZmYgYmV0d2VlbiAyIHRpbWVzIFBvd2VyIFRyYWNraW5nKi8KKworCQkgICAgCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkgICAgCQkoIltQYXRoLSVjXSBQb3dlckluZGV4T2Zmc2V0KCVkKSA9IERlbHRhUG93ZXJJbmRleCglZCkgLSBEZWx0YVBvd2VySW5kZXhMYXN0KCVkKVxuIiwKKyAgICAgICAgICAgICAgICAJCShwID09IFJGOTBfUEFUSF9BID8gJ0EnIDogJ0InKSwKKyAgICAgICAgICAgICAgICAJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF0sCisgICAgICAgICAgICAgICAgCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbcF0gLAorICAgICAgICAgICAgICAgIAkJcnRsZG0tPmRlbHRhX3Bvd2VyX2luZGV4X2xhc3RbcF0pKTsKKworCSAgICAJCXJ0bGRtLT5vZmRtX2luZGV4W3BdID0KKwkJCQkJcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtX2Jhc2VbcF0gKyBydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdOworCQkgICAgCXJ0bGRtLT5jY2tfaW5kZXggPQorCQkJCQlydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlICsgcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXTsKKworCQkgICAgCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrID0gcnRsZG0tPmNja19pbmRleDsKKwkJICAgCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbVtwXSA9IHJ0bGRtLT5vZmRtX2luZGV4W3BdOworCisJICAgICAgICAgICAJLyoqKioqKioqKioqKipQcmludCBCQiBTd2luZyBCYXNlIGFuZCBJbmRleCBPZmZzZXQqKioqKioqKioqKioqLworCisJCSAgICAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSAgICAJCSgiVGhlICdDQ0snIGZpbmFsIGluZGV4KCVkKSA9IEJhc2VJbmRleCglZCkgKyBQb3dlckluZGV4T2Zmc2V0KCVkKVxuIiwKKwkJICAgIAkJcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2ssCisJCSAgICAJCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UsCisJCSAgICAJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF0pKTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgiVGhlICdPRkRNJyBmaW5hbCBpbmRleCglZCkgPSBCYXNlSW5kZXhbJWNdKCVkKSArIFBvd2VySW5kZXhPZmZzZXQoJWQpXG4iLAorCQkgICAJCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbVtwXSwKKwkJICAgCQkocCA9PSBSRjkwX1BBVEhfQSA/ICdBJyA6ICdCJyksCisJCSAgIAkJcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtX2Jhc2VbcF0sCisJCSAgIAkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXSkpOworCisJCSAgICAJLyo3LjEgSGFuZGxlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgb2YgaW5kZXguKi8KKworCisJCQlpZihydGxkbS0+b2ZkbV9pbmRleFtwXSA+IFRYU0NBTEVfVEFCTEVfU0laRSAtMSkKKwkJCXsKKwkJCQlydGxkbS0+b2ZkbV9pbmRleFtwXSA9IFRYU0NBTEVfVEFCTEVfU0laRSAtMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHJ0bGRtLT5vZmRtX2luZGV4W3BdIDwgb2ZkbV9taW5faW5kZXgpCisJCQl7CisJCQkJcnRsZG0tPm9mZG1faW5kZXhbcF0gPSBvZmRtX21pbl9pbmRleDsKKwkJCX0KKwkJfQorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKyAgICAgICAgICAgIAkJKCJcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XAorICAgICAgICAgICAgCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikpOworCQlpZihydGxkbS0+Y2NrX2luZGV4ID4gVFhTQ0FMRV9UQUJMRV9TSVpFIC0xKQorCQkJcnRsZG0tPmNja19pbmRleCA9IFRYU0NBTEVfVEFCTEVfU0laRSAtMTsKKwkJZWxzZSBpZiAocnRsZG0tPmNja19pbmRleCA8IDApCisJCQlydGxkbS0+Y2NrX2luZGV4ID0gMDsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgiVGhlIHRoZXJtYWwgbWV0ZXIgaXMgdW5jaGFuZ2VkIG9yIFR4UG93ZXJUcmFja2luZyBPRkYoJWQpOiBcCisJCQlUaGVybWFsVmFsdWU6ICVkICwgcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlRoZXJtYWxWYWx1ZTogJWRcbiIsCisJCQlydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sLAorCQkJdGhlcm1hbF92YWx1ZSwKKwkJCXJ0bGRtLT50aGVybWFsdmFsdWUpKTsKKworCSAgICAJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUEFUSF9OVU1fODgxMkE7IHArKykKKwkJICAgIAlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdID0gMDsKKwl9CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSgiVHhQb3dlclRyYWNraW5nOiBbQ0NLXSBTd2luZyBDdXJyZW50IEluZGV4OiAlZCwgU3dpbmcgQmFzZSBJbmRleDogJWRcbiIsCisJCXJ0bGRtLT5jY2tfaW5kZXgsIHJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UpKTsgICAgICAgLypQcmludCBTd2luZyBiYXNlICYgY3VycmVudCovCisJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUEFUSF9OVU1fODgxMkE7IHArKykKKwl7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJUeFBvd2VyVHJhY2tpbmc6IFtPRkRNXSBTd2luZyBDdXJyZW50IEluZGV4OiAlZCwgU3dpbmcgQmFzZSBJbmRleFslY106ICVkXG4iLAorCQkJcnRsZG0tPm9mZG1faW5kZXhbcF0sCisJCQkocCA9PSBSRjkwX1BBVEhfQSA/ICdBJyA6ICdCJyksCisJCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtwXSkpOworCX0KKworCWlmICgocnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtSRjkwX1BBVEhfQV0gIT0gMCB8fAorCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W1JGOTBfUEFUSF9CXSAhPSAwICkgJiYKKyAgICAgCSAJcnRsZG0tPnR4cG93ZXJfdHJhY2tfY29udHJvbCkKKwl7CisJCS8qNy4yIENvbmZpZ3VyZSB0aGUgU3dpbmcgVGFibGUgdG8gYWRqdXN0IFR4IFBvd2VyLiovCisJCS8qQWx3YXlzIFRSVUUgYWZ0ZXIgVHggUG93ZXIgaXMgYWRqdXN0ZWQgYnkgcG93ZXIgdHJhY2tpbmcuKi8KKwkJLyoKKwkJICAyMDEyLzA0LzIzIE1IIEFjY29yZGluZyB0byBMdWtlJ3Mgc3VnZ2VzdGlvbiwgd2UgY2FuIG5vdCB3cml0ZSBCQiBkaWdpdGFsCisJCSAgdG8gaW5jcmVhc2UgVFggcG93ZXIuIE90aGVyd2lzZSwgRVZNIHdpbGwgYmUgYmFkLgorCisJCSAgMjAxMi8wNC8yNSBNSCBBZGQgZm9yIHR4IHBvd2VyIHRyYWNraW5nIHRvIHNldCB0eCBwb3dlciBpbiB0eCBhZ2MgZm9yIDg4RS4KKwkJKi8KKwkJaWYgKHRoZXJtYWxfdmFsdWUgPiBydGxkbS0+dGhlcm1hbHZhbHVlKQorCQl7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoIlRlbXBlcmF0dXJlIEluY3JlYXNpbmcoQSk6IGRlbHRhX3BpOiAlZCAsIGRlbHRhX3Q6ICVkLCBOb3dfdDogJWQsIEVGVVNFX3Q6ICVkLCBMYXN0X3Q6ICVkXG4iLAorCQkJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbUkY5MF9QQVRIX0FdLAorCQkJCWRlbHRhLCB0aGVybWFsX3ZhbHVlLAorCQkJCXJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyLAorCQkJCXJ0bGRtLT50aGVybWFsdmFsdWUpKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJUZW1wZXJhdHVyZSBJbmNyZWFzaW5nKEIpOiBkZWx0YV9waTogJWQgLCBkZWx0YV90OiAlZCwgTm93X3Q6ICVkLCBFRlVTRV90OiAlZCwgTGFzdF90OiAlZFxuIiwKKwkJCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W1JGOTBfUEFUSF9CXSwKKwkJCQlkZWx0YSwgdGhlcm1hbF92YWx1ZSwKKwkJCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciwKKwkJCQlydGxkbS0+dGhlcm1hbHZhbHVlKSk7CisKKwkJfSBlbHNlIGlmICh0aGVybWFsX3ZhbHVlIDwgcnRsZG0tPnRoZXJtYWx2YWx1ZSkgeyAvKkxvdyB0ZW1wZXJhdHVyZSovCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoIlRlbXBlcmF0dXJlIERlY3JlYXNpbmcoQSk6IGRlbHRhX3BpOiAlZCAsIGRlbHRhX3Q6ICVkLCBOb3dfdDogJWQsIEVGVVNFX3Q6ICVkLCBMYXN0X3Q6ICVkXG4iLAorCQkJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbUkY5MF9QQVRIX0FdLAorCQkJCWRlbHRhLCB0aGVybWFsX3ZhbHVlLAorCQkJCXJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyLAorCQkJCXJ0bGRtLT50aGVybWFsdmFsdWUpKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJUZW1wZXJhdHVyZSBEZWNyZWFzaW5nKEIpOiBkZWx0YV9waTogJWQgLCBkZWx0YV90OiAlZCwgTm93X3Q6ICVkLCBFRlVTRV90OiAlZCwgTGFzdF90OiAlZFxuIiwKKwkJCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W1JGOTBfUEFUSF9CXSwKKwkJCQlkZWx0YSwgdGhlcm1hbF92YWx1ZSwKKwkJCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciwKKwkJCQlydGxkbS0+dGhlcm1hbHZhbHVlKSk7CisJCX0KKworCQlpZiAodGhlcm1hbF92YWx1ZSA+IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSB7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoIlRlbXBlcmF0dXJlKCVkKSBoaWdoZXIgdGhhbiBQRyB2YWx1ZSglZClcbiIsCisJCQkJdGhlcm1hbF92YWx1ZSwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpKTsKKworCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoIioqKioqKioqKipFbnRlciBQT1dFUiBUcmFja2luZyBNSVhfTU9ERSoqKioqKioqKipcbiIpKTsKKwkJCWZvciAocCA9IFJGOTBfUEFUSF9BOyBwIDwgTUFYX1BBVEhfTlVNXzg4MTJBOyBwKyspCisJCQkJCXJ0bDg4MTJhZV9kbV90eHB3cl90cmFja19zZXRfcHdyKGh3LCBNSVhfTU9ERSwgcCwgMCk7CisKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgiVGVtcGVyYXR1cmUoJWQpIGxvd2VyIHRoYW4gUEcgdmFsdWUoJWQpXG4iLAorCQkJCXRoZXJtYWxfdmFsdWUsIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSk7CisKKworCSAgICAgICAgICAgIAlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoIioqKioqKioqKipFbnRlciBQT1dFUiBUcmFja2luZyBNSVhfTU9ERSoqKioqKioqKipcbiIpKTsKKwkJCWZvciAocCA9IFJGOTBfUEFUSF9BOyBwIDwgTUFYX1BBVEhfTlVNXzg4MTJBOyBwKyspCisJCQkJcnRsODgxMmFlX2RtX3R4cHdyX3RyYWNrX3NldF9wd3IoaHcsIE1JWF9NT0RFLCBwLCBpbmRleF9mb3JfY2hhbm5lbCk7CisKKwkJfQorCisJCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UgPSBydGxkbS0+YmJfc3dpbmdfaWR4X2NjazsgICAvKlJlY29yZCBsYXN0IHRpbWUgUG93ZXIgVHJhY2tpbmcgcmVzdWx0IGFzIGJhc2UuKi8KKwkJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUEFUSF9OVU1fODgxMkE7IHArKykKKwkJCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtwXSA9IHJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbVtwXTsKKworCSAJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkoInBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWUgPSAlZCBUaGVybWFsVmFsdWU9ICVkXG4iLAorCQkJCQlydGxkbS0+dGhlcm1hbHZhbHVlLCB0aGVybWFsX3ZhbHVlKSk7CisKKwkJcnRsZG0tPnRoZXJtYWx2YWx1ZSA9IHRoZXJtYWxfdmFsdWU7ICAgICAgICAgLypSZWNvcmQgbGFzdCBQb3dlciBUcmFja2luZyBUaGVybWFsIFZhbHVlKi8KKworCX0KKwkvKkRlbHRhIHRlbXBlcmF0dXJlIGlzIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIDIwIGNlbnRpZ3JhZGUgKFdoZW4gdGhyZXNob2xkIGlzIDgpLiovCisJaWYgKChkZWx0YV9pcWsgPj0gSVFLX1RIUkVTSE9MRCkpIHsKKworCQlpZiAoICFydGxwaHktPmJfaXFrX2luX3Byb2dyZXNzKSB7CisKKwkJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCQkJcnRscGh5LT5iX2lxa19pbl9wcm9ncmVzcyA9IHRydWU7CisJCQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCisJCQlydGw4ODEyYWVfZG9faXFrKGh3LCBkZWx0YV9pcWssIHRoZXJtYWxfdmFsdWUsIDgpOworCisJCQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwkJCXJ0bHBoeS0+Yl9pcWtfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisJCX0KKwl9CisKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJKCI8PT09cnRsODgxMmFlX2RtX3R4cG93ZXJfdHJhY2tpbmdfY2FsbGJhY2tfdGhlcm1hbG1ldGVyXG4iKSk7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZ2V0X2RlbHRhX3N3aW5nX3RhYmxlKAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4ICoqdGVtcGVyYXR1cmVfdXBfYSwKKwl1OCAqKnRlbXBlcmF0dXJlX2Rvd25fYSwKKwl1OCAqKnRlbXBlcmF0dXJlX3VwX2IsCisJdTggKip0ZW1wZXJhdHVyZV9kb3duX2IKKwkpCit7CisgICAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwl1OCBjaGFubmVsID0gcnRscGh5LT5jdXJyZW50X2NoYW5uZWw7CisJdTggcmF0ZSA9IHJ0bGRtLT50eF9yYXRlOworCisKKwlpZiAoIDEgPD0gY2hhbm5lbCAmJiBjaGFubmVsIDw9IDE0KSB7CisJCWlmIChSWF9IQUxfSVNfQ0NLX1JBVEUocmF0ZSkpIHsKKwkJICAgICAgICAqdGVtcGVyYXR1cmVfdXBfYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV9kb3duX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2FfbjsKKwkJICAgICAgICAqdGVtcGVyYXR1cmVfdXBfYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9wOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV9kb3duX2IgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfbjsKKwkJfSBlbHNlIHsKKwkJICAgICAgICAqdGVtcGVyYXR1cmVfdXBfYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV9kb3duX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfbjsKKwkJICAgICAgICAqdGVtcGVyYXR1cmVfdXBfYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wOworCQkgICAgICAgICp0ZW1wZXJhdHVyZV9kb3duX2IgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfbjsKKwkJfQorIAl9IGVsc2UgaWYgKCAzNiA8PSBjaGFubmVsICYmIGNoYW5uZWwgPD0gNjQpIHsKKwkgICAgICAgICp0ZW1wZXJhdHVyZV91cF9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfcFswXTsKKwkgICAgICAgICp0ZW1wZXJhdHVyZV9kb3duX2EgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9uWzBdOworCSAgICAgICAgKnRlbXBlcmF0dXJlX3VwX2IgPSBydGxkbS0+ZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9wWzBdOworCSAgICAgICAgKnRlbXBlcmF0dXJlX2Rvd25fYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25bMF07CisgICAgCX0gZWxzZSBpZiAoIDEwMCA8PSBjaGFubmVsICYmIGNoYW5uZWwgPD0gMTQwKSB7CisJCSp0ZW1wZXJhdHVyZV91cF9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfcFsxXTsKKwkJKnRlbXBlcmF0dXJlX2Rvd25fYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bMV07CisJCSp0ZW1wZXJhdHVyZV91cF9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcFsxXTsKKwkJKnRlbXBlcmF0dXJlX2Rvd25fYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25bMV07CisgICAgCX0gZWxzZSBpZiAoIDE0OSA8PSBjaGFubmVsICYmIGNoYW5uZWwgPD0gMTczKSB7CisJCSp0ZW1wZXJhdHVyZV91cF9hID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfcFsyXTsKKwkJKnRlbXBlcmF0dXJlX2Rvd25fYSA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bMl07CisJCSp0ZW1wZXJhdHVyZV91cF9iID0gcnRsZG0tPmRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcFsyXTsKKwkJKnRlbXBlcmF0dXJlX2Rvd25fYiA9IHJ0bGRtLT5kZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX25bMl07CisgICAgCX0gZWxzZSB7CisJICAgICp0ZW1wZXJhdHVyZV91cF9hID0gKHU4KilydGw4ODE4ZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wX3R4cHdydHJhY2s7CisJICAgICp0ZW1wZXJhdHVyZV9kb3duX2EgPSh1OCopcnRsODgxOGVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Jfbl90eHB3cnRyYWNrOworCSAgICAqdGVtcGVyYXR1cmVfdXBfYiA9ICh1OCopcnRsODgxOGVfZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfcF90eHB3cnRyYWNrOworCSAgICAqdGVtcGVyYXR1cmVfZG93bl9iID0gKHU4KilydGw4ODE4ZV9kZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uX3R4cHdydHJhY2s7CisgICAgCX0KKworCXJldHVybjsKK30KKwordm9pZCBydGw4ODIxYWVfcGh5X2xjY2FsaWJyYXRlKAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELCAoIj09PT4gcnRsODgxMmFlX3BoeV9sY2NhbGlicmF0ZVxuIikpOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsICgiPD09PSBydGw4ODEyYWVfcGh5X2xjY2FsaWJyYXRlXG4iKSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CW9kbV9UeFB3clRyYWNrU2V0UHdyODhFKCkKKyAqCisgKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpZ24gdG8gZmxhZy4KKyAqCQkJCU9GRE0gJiBDQ0sgYXJlIGFsbCBkaWZmZXJlbnQuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDQvMjMvMjAxMglNSEMJCUNyZWF0ZSBWZXJzaW9uIDAuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBydGw4ODIxYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3cihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwllbnVtIHB3cl90cmFja19jb250cm9sX21ldGhvZCBtZXRob2QsIHU4IHJmX3BhdGgsIHU4IGNoYW5uZWxfbWFwcGVkX2luZGV4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtCSpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTMyIGZpbmFsX2JiX3N3aW5nX2lkeFsxXTsKKwl1OCBwd3JfdHJhY2tpbmdfbGltaXQgPSAyNjsgLyorMS4wZEIqLworCXU4IHR4X3JhdGUgPSAweEZGOworCXM4IGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPSAwOworCisJaWYocnRsZG0tPnR4X3JhdGUgIT0gMHhGRikKKwkJdHhfcmF0ZSA9IHJ0bDg4MTJhZV9od19yYXRlX3RvX21yYXRlKGh3LCBydGxkbS0+dHhfcmF0ZSk7CisKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIj09PT5ydGw4ODEyYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3clxuIikpOworCisJaWYodHhfcmF0ZSAhPSAweEZGKSB7IC8qMjAxMzA0MjkgTWltaWMgTW9kaWZ5IEhpZ2ggUmF0ZSBCQlN3aW5nIExpbWl0LiovCisJCS8qQ0NLKi8KKwkJaWYoKHR4X3JhdGUgPj0gTUdOXzFNKSAmJiAodHhfcmF0ZSA8PSBNR05fMTFNKSkKKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDMyOyAvKis0ZEIqLworCQkvKk9GRE0qLworCQllbHNlIGlmKCh0eF9yYXRlID49IE1HTl82TSkgJiYgKHR4X3JhdGUgPD0gTUdOXzQ4TSkpCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl81NE0pCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyODsgLyorMmRCKi8KKwkJLypIVCovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzApICYmICh0eF9yYXRlIDw9IE1HTl9NQ1MyKSkgLypRUFNLL0JQU0sqLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMzQ7IC8qKzVkQiovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzMpICYmICh0eF9yYXRlIDw9IE1HTl9NQ1M0KSkgLyoxNlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fTUNTNSkgJiYgKHR4X3JhdGUgPD0gTUdOX01DUzcpKSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI4OyAvKisyZEIqLworI2lmIDAKKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fTUNTOCkgJiYgKHR4X3JhdGUgPD0gTUdOX01DUzEwKSkgLypRUFNLL0JQU0sqLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMzQ7IC8qKzVkQiovCisJCWVsc2UgaWYoKHR4X3JhdGUgPj0gTUdOX01DUzExKSAmJiAodHhfcmF0ZSA8PSBNR05fTUNTMTIpKSAvKjE2UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDMwOyAvKiszZEIqLworCQllbHNlIGlmKCh0eF9yYXRlID49IE1HTl9NQ1MxMykgJiYgKHR4X3JhdGUgPD0gTUdOX01DUzE1KSkgLyo2NFFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyODsgLyorMmRCKi8KKyNlbmRpZgorCQkvKjIgVkhUKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fVkhUMVNTX01DUzApICYmICh0eF9yYXRlIDw9IE1HTl9WSFQxU1NfTUNTMikpIC8qUVBTSy9CUFNLKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDM0OyAvKis1ZEIqLworCQllbHNlIGlmKCh0eF9yYXRlID49IE1HTl9WSFQxU1NfTUNTMykgJiYgKHR4X3JhdGUgPD0gTUdOX1ZIVDFTU19NQ1M0KSkgLyoxNlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAzMDsgLyorM2RCKi8KKwkJZWxzZSBpZigodHhfcmF0ZSA+PSBNR05fVkhUMVNTX01DUzUpJiYodHhfcmF0ZSA8PSBNR05fVkhUMVNTX01DUzYpKSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI4OyAvKisyZEIqLworCQllbHNlIGlmKHR4X3JhdGUgPT0gTUdOX1ZIVDFTU19NQ1M3KSAvKjY0UUFNKi8KKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI2OyAvKisxZEIqLworCQllbHNlIGlmKHR4X3JhdGUgPT0gTUdOX1ZIVDFTU19NQ1M4KSAvKjI1NlFBTSovCisJCQlwd3JfdHJhY2tpbmdfbGltaXQgPSAyNDsgLyorMGRCKi8KKwkJZWxzZSBpZih0eF9yYXRlID09IE1HTl9WSFQxU1NfTUNTOSkgLyoyNTZRQU0qLworCQkJcHdyX3RyYWNraW5nX2xpbWl0ID0gMjI7IC8qLTFkQiovCisJCWVsc2UKKwkJCXB3cl90cmFja2luZ19saW1pdCA9IDI0OworCX0KKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJKCJUeFJhdGU9MHgleCwgUHdyVHJhY2tpbmdMaW1pdD0lZFxuIiwgdHhfcmF0ZSwgcHdyX3RyYWNraW5nX2xpbWl0KSk7CisKKworCWlmIChtZXRob2QgPT0gQkJTV0lORykgeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSgiPT09PnJ0bDg4MTJhZV9kbV90eHB3cl90cmFja19zZXRfcHdyXG4iKSk7CisKKwkJaWYgKHJmX3BhdGggPT0gUkY5MF9QQVRIX0EpIHsKKwkJCWZpbmFsX2JiX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0gPQorCQkJCShydGxkbS0+b2ZkbV9pbmRleFtSRjkwX1BBVEhfQV0gPiBwd3JfdHJhY2tpbmdfbGltaXQpID8KKwkJCQlwd3JfdHJhY2tpbmdfbGltaXQgOiBydGxkbS0+b2ZkbV9pbmRleFtSRjkwX1BBVEhfQV07CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkoInBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5PRkRNX2luZGV4W09ETV9SRl9QQVRIX0FdPSVkLCBcCisJCQkJcERNX09kbS0+UmVhbEJiU3dpbmdJZHhbT0RNX1JGX1BBVEhfQV09JWRcbiIsCisJCQkJcnRsZG0tPm9mZG1faW5kZXhbUkY5MF9QQVRIX0FdLCBmaW5hbF9iYl9zd2luZ19pZHhbUkY5MF9QQVRIX0FdKSk7CisKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1RYU0NBTEUsIDB4RkZFMDAwMDAsIHJ0bDg4MTJhZV90eHNjYWxpbmdfdGFibGVbZmluYWxfYmJfc3dpbmdfaWR4W1JGOTBfUEFUSF9BXV0pOworCQl9CisJfSBlbHNlIGlmIChtZXRob2QgPT0gTUlYX01PREUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoInBETV9PZG0tPkRlZmF1bHRPZmRtSW5kZXg9JWQsIFwKKwkJCXBETV9PZG0tPkFib3NsdXRlX09GRE1Td2luZ0lkeFtSRlBhdGhdPSVkLCBSRl9QYXRoID0gJWRcbiIsCisJCQlydGxkbS0+ZGVmYXVsdF9vZmRtX2luZGV4LCBydGxkbS0+YWJvc2x1dGVfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF0sCisJCQlyZl9wYXRoICkpOworCisKKwkJZmluYWxfb2ZkbV9zd2luZ19pbmRleCA9IHJ0bGRtLT5kZWZhdWx0X29mZG1faW5kZXggKyBydGxkbS0+YWJvc2x1dGVfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF07CisKKwkJaWYgKHJmX3BhdGggPT0gUkY5MF9QQVRIX0EpIHsKKwkJCWlmKGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPiBwd3JfdHJhY2tpbmdfbGltaXQpIHsgICAgIC8qQkJTd2luZyBoaWdoZXIgdGhlbiBMaW1pdCovCisKKwkJCQlydGxkbS0+cmVtbmFudF9jY2tfaWR4ID0gZmluYWxfb2ZkbV9zd2luZ19pbmRleCAtIHB3cl90cmFja2luZ19saW1pdDsKKwkJCQkvKiBDQ0sgRm9sbG93IHRoZSBzYW1lIGNvbXBlbnNhdGUgdmFsdWUgYXMgUGF0aCBBKi8KKwkJCQlydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSA9IGZpbmFsX29mZG1fc3dpbmdfaW5kZXggLSBwd3JfdHJhY2tpbmdfbGltaXQ7CisKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9UWFNDQUxFLCAweEZGRTAwMDAwLCBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlW3B3cl90cmFja2luZ19saW1pdF0pOworCisJCQkJcnRsZG0tPm1vZGlmeV90eGFnY19mbGFnX3BhdGhfYSA9IHRydWU7CisKKwkJCQkvKlNldCBUeEFHQyBQYWdlIEN7fTsqLworCQkJCXJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwsIFJGOTBfUEFUSF9BKTsKKworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkoIioqKioqKlBhdGhfQSBPdmVyIEJCU3dpbmcgTGltaXQgLCBQd3JUcmFja2luZ0xpbWl0ID0gJWQgLCBSZW1uYW50IFR4QUdDIFZhbHVlID0gJWQgXG4iLAorCQkJCQlwd3JfdHJhY2tpbmdfbGltaXQsIHJ0bGRtLT5yZW1uYW50X29mZG1fc3dpbmdfaWR4W3JmX3BhdGhdKSk7CisJCQl9IGVsc2UgaWYgKGZpbmFsX29mZG1fc3dpbmdfaW5kZXggPCAwKSB7CisJCQkJcnRsZG0tPnJlbW5hbnRfY2NrX2lkeCA9IGZpbmFsX29mZG1fc3dpbmdfaW5kZXg7CisJCQkJLyogQ0NLIEZvbGxvdyB0aGUgc2FtZSBjb21wZW5zYXRlIHZhbHVlIGFzIFBhdGggQSovCisJCQkJcnRsZG0tPnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF0gPSBmaW5hbF9vZmRtX3N3aW5nX2luZGV4OworCisJCQkJcnRsX3NldF9iYnJlZyhodywgUkFfVFhTQ0FMRSwgMHhGRkUwMDAwMCwgcnRsODgxMmFlX3R4c2NhbGluZ190YWJsZVswXSk7CisKKwkJCQlydGxkbS0+bW9kaWZ5X3R4YWdjX2ZsYWdfcGF0aF9hID0gdHJ1ZTsKKworCQkJCS8qU2V0IFR4QUdDIFBhZ2UgQ3t9OyovCisJCQkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCwgUkY5MF9QQVRIX0EpOworCisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSgiKioqKioqUGF0aF9BIExvd2VyIHRoZW4gQkJTd2luZyBsb3dlciBib3VuZCAgMCAsIFJlbW5hbnQgVHhBR0MgVmFsdWUgPSAlZCBcbiIsCisJCQkJCSBydGxkbS0+cmVtbmFudF9vZmRtX3N3aW5nX2lkeFtyZl9wYXRoXSkpOworCQkJfSBlbHNlIHsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9UWFNDQUxFLCAweEZGRTAwMDAwLCBydGw4ODEyYWVfdHhzY2FsaW5nX3RhYmxlW2ZpbmFsX29mZG1fc3dpbmdfaW5kZXhdKTsKKworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkoIioqKioqKlBhdGhfQSBDb21wZW5zYXRlIHdpdGggQkJTd2luZyAsIEZpbmFsX09GRE1fU3dpbmdfSW5kZXggPSAlZCBcbiIsCisJCQkJCWZpbmFsX29mZG1fc3dpbmdfaW5kZXgpKTsKKworCQkJCWlmKHJ0bGRtLT5tb2RpZnlfdHhhZ2NfZmxhZ19wYXRoX2EpIHsgLypJZiBUeEFHQyBoYXMgY2hhbmdlZCwgcmVzZXQgVHhBR0MgYWdhaW4qLworCQkJCQlydGxkbS0+cmVtbmFudF9jY2tfaWR4ID0gMDsKKwkJCQkJcnRsZG0tPnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcmZfcGF0aF0gPSAwOworCisJCQkJCS8qU2V0IFR4QUdDIFBhZ2UgQ3t9OyovCisJCQkJCXJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwsIFJGOTBfUEFUSF9BKTsKKworCQkJCQlydGxkbS0+bW9kaWZ5X3R4YWdjX2ZsYWdfcGF0aF9hID0gZmFsc2U7CisKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCQkoIioqKioqKlBhdGhfQSBwRE1fT2RtLT5Nb2RpZnlfVHhBR0NfRmxhZyA9IEZBTFNFIFxuIikpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KK30KKworCit2b2lkIHJ0bDg4MjFhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcgorCShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2RtCSpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXU4IHRoZXJtYWxfdmFsdWUgPSAwLCBkZWx0YSwgZGVsdGFfbGNrLCBkZWx0YV9pcWssIHAgPSAwLCBpID0gMDsKKwl1OCB0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCA9IDA7CisJdTMyIHRoZXJtYWxfdmFsdWVfYXZnID0gMDsKKworCXU4IG9mZG1fbWluX2luZGV4ID0gNjsgIC8qT0ZETSBCQiBTd2luZyBzaG91bGQgYmUgbGVzcyB0aGFuICszLjBkQiwgd2hpY2ggaXMgcmVxdWlyZWQgYnkgQXJ0aHVyKi8KKwl1OCBpbmRleF9mb3JfY2hhbm5lbCA9IDA7IC8qIEdldFJpZ2h0Q2hubFBsYWNlZm9ySVFLKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCkqLworCisJLyogMS4gVGhlIGZvbGxvd2luZyBUV08gdGFibGVzIGRlY2lkZSB0aGUgZmluYWwgaW5kZXggb2YgT0ZETS9DQ0sgc3dpbmcgdGFibGUuKi8KKwl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hOworCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYTsKKwl1OCAqZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9iOworCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYjsKKworCS8qMi4gSW5pdGlsaXphdGlvbiAoIDcgc3RlcHMgaW4gdG90YWwgKSovCisJcnRsODgyMWFlX2dldF9kZWx0YV9zd2luZ190YWJsZShodywgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYSwKKwkJCQkJCQkJCSh1OCoqKSZkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYSwKKwkJCQkJCQkJCSAgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYiwKKwkJCQkJCQkJCSAgKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90ZG93bl9iKTsKKworCXJ0bGRtLT5idHhwb3dlcl90cmFja2luZ2luaXQgPSB0cnVlOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSgiPT09PnJ0bDg4MTJhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlciwgXAorCQkgXG4gcERNX09kbS0+QmJTd2luZ0lkeENja0Jhc2U6ICVkLCBwRE1fT2RtLT5CYlN3aW5nSWR4T2ZkbUJhc2VbQV06XAorCQkgJWQsIHBETV9PZG0tPkRlZmF1bHRPZmRtSW5kZXg6ICVkXG4iLAorCQlydGxkbS0+YmJfc3dpbmdfaWR4X2Nja19iYXNlLAorCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtSRjkwX1BBVEhfQV0sCisJCXJ0bGRtLT5kZWZhdWx0X29mZG1faW5kZXgpKTsKKworCXRoZXJtYWxfdmFsdWUgPSAodTgpcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1RfTUVURVJfODgxMkEsIDB4ZmMwMCk7CS8qMHg0MjogUkYgUmVnWzE1OjEwXSA4OEUqLworCWlmKCAhIHJ0bGRtLT50eHBvd2VyX3RyYWNrX2NvbnRyb2wgfHwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPT0gMCB8fAorCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9PSAweEZGKQorICAgICAgICAJcmV0dXJuOworCisKKwkvKiAzLiBJbml0aWFsaXplIFRoZXJtYWxWYWx1ZXMgb2YgUkZDYWxpYnJhdGVJbmZvKi8KKworCWlmKHJ0bGhhbC0+cmVsb2FkdHhwb3dlcmluZGV4KQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoInJlbG9hZCBvZmRtIGluZGV4IGZvciBiYW5kIHN3aXRjaFxuIikpOworCX0KKworCS8qNC4gQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhlcm1hbCBtZXRlciovCisJcnRsZG0tPnRoZXJtYWx2YWx1ZV9hdmdbcnRsZG0tPnRoZXJtYWx2YWx1ZV9hdmdfaW5kZXhdID0gdGhlcm1hbF92YWx1ZTsKKwlydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z19pbmRleCsrOworCWlmKHJ0bGRtLT50aGVybWFsdmFsdWVfYXZnX2luZGV4ID09IEFWR19USEVSTUFMX05VTV84ODEyQSkKKwkJLypBdmVyYWdlIHRpbWVzID0gIGMuQXZlcmFnZVRoZXJtYWxOdW0qLworCQlydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z19pbmRleCA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBBVkdfVEhFUk1BTF9OVU1fODgxMkE7IGkrKykKKwl7CisJCWlmKHJ0bGRtLT50aGVybWFsdmFsdWVfYXZnW2ldKQorCQl7CisJCQl0aGVybWFsX3ZhbHVlX2F2ZyArPSBydGxkbS0+dGhlcm1hbHZhbHVlX2F2Z1tpXTsKKwkJCXRoZXJtYWxfdmFsdWVfYXZnX2NvdW50Kys7CisJCX0KKwl9CisKKwlpZih0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCkgLypDYWxjdWxhdGUgQXZlcmFnZSBUaGVybWFsVmFsdWUgYWZ0ZXIgYXZlcmFnZSBlbm91Z2ggdGltZXMqLworCXsKKwkJdGhlcm1hbF92YWx1ZSA9ICh1OCkodGhlcm1hbF92YWx1ZV9hdmcgLyB0aGVybWFsX3ZhbHVlX2F2Z19jb3VudCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJBVkcgVGhlcm1hbCBNZXRlciA9IDB4JVgsIEVGVVNFIFRoZXJtYWwgQmFzZSA9IDB4JVhcbiIsCisJCQl0aGVybWFsX3ZhbHVlLCBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikpOworCX0KKworCS8qNS4gQ2FsY3VsYXRlIGRlbHRhLCBkZWx0YV9MQ0ssIGRlbHRhX0lRSy4qLworCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcm1hbCB2YWx1ZSBjaGFuZ2VzIG9yIG5vdC4qLworCWRlbHRhID0gKHRoZXJtYWxfdmFsdWUgPiBydGxkbS0+dGhlcm1hbHZhbHVlKSA/IFwKKwkJKHRoZXJtYWxfdmFsdWUgLSBydGxkbS0+dGhlcm1hbHZhbHVlKTogXAorCQkocnRsZG0tPnRoZXJtYWx2YWx1ZSAtIHRoZXJtYWxfdmFsdWUpOworCWRlbHRhX2xjayA9ICh0aGVybWFsX3ZhbHVlID4gcnRsZG0tPnRoZXJtYWx2YWx1ZV9sY2spID8gXAorCQkodGhlcm1hbF92YWx1ZSAtIHJ0bGRtLT50aGVybWFsdmFsdWVfbGNrKSA6IFwKKwkJKHJ0bGRtLT50aGVybWFsdmFsdWVfbGNrIC0gdGhlcm1hbF92YWx1ZSk7CisJZGVsdGFfaXFrID0gKHRoZXJtYWxfdmFsdWUgPiBydGxkbS0+dGhlcm1hbHZhbHVlX2lxaykgPyBcCisJCSh0aGVybWFsX3ZhbHVlIC0gcnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWspIDogXAorCQkocnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWsgLSB0aGVybWFsX3ZhbHVlKTsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIihkZWx0YSwgZGVsdGFfTENLLCBkZWx0YV9JUUspID0gKCVkLCAlZCwgJWQpXG4iLAorCQlkZWx0YSwgZGVsdGFfbGNrLCBkZWx0YV9pcWspKTsKKworCS8qIDYuIElmIG5lY2Vzc2FyeSwgZG8gTENLLgkqLworCisJaWYgKGRlbHRhX2xjayA+PSBJUUtfVEhSRVNIT0xEKSAvKkRlbHRhIHRlbXBlcmF0dXJlIGlzIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIDIwIGNlbnRpZ3JhZGUuKi8KKwl7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJkZWx0YV9MQ0soJWQpID49IFRocmVzaG9sZF9JUUsoJWQpXG4iLAorCQkJZGVsdGFfbGNrLCBJUUtfVEhSRVNIT0xEKSk7CisJCXJ0bGRtLT50aGVybWFsdmFsdWVfbGNrID0gdGhlcm1hbF92YWx1ZTsKKwkJcnRsODgyMWFlX3BoeV9sY2NhbGlicmF0ZShodyk7CisJfQorCisJLyo3LiBJZiBuZWNlc3NhcnksIG1vdmUgdGhlIGluZGV4IG9mIHN3aW5nIHRhYmxlIHRvIGFkanVzdCBUeCBwb3dlci4qLworCisJaWYgKGRlbHRhID4gMCAmJiBydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sKQorCXsKKwkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcnJlbmNlLiovCisJICAgIAlkZWx0YSA9IHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA/IFwKKwkJICAgIAkodGhlcm1hbF92YWx1ZSAtIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSA6IFwKKwkJICAgIAkocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsX3ZhbHVlKTsKKworCQlpZiAoZGVsdGEgPj0gVFhTQ0FMRV9UQUJMRV9TSVpFKQorCQkJZGVsdGEgPSBUWFNDQUxFX1RBQkxFX1NJWkUgLSAxOworCisJCS8qNy4xIFRoZSBGaW5hbCBQb3dlciBJbmRleCA9IEJhc2VJbmRleCArIFBvd2VySW5kZXhPZmZzZXQqLworCisJCWlmKHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikgeworCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSAgICAJCSgiZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hWyVkXSA9ICVkXG4iLAorCQkJICAgIAkJZGVsdGEsIGRlbHRhX3N3aW5nX3RhYmxlX2lkeF90dXBfYVtkZWx0YV0pKTsKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W1JGOTBfUEFUSF9BXSA9IHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQV07CisJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbUkY5MF9QQVRIX0FdID0gZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hW2RlbHRhXTsKKworCQkJcnRsZG0tPmFib3NsdXRlX29mZG1fc3dpbmdfaWR4W1JGOTBfUEFUSF9BXSA9ICBkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2FbZGVsdGFdOworCQkJLypSZWNvcmQgZGVsdGEgc3dpbmcgZm9yIG1peCBtb2RlIHBvd2VyIHRyYWNraW5nKi8KKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoIioqKioqKlRlbXAgaXMgaGlnaGVyIGFuZCBwRE1fT2RtLT5BYm9zbHV0ZV9PRkRNU3dpbmdJZHhbT0RNX1JGX1BBVEhfQV0gPSAlZFxuIiwKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0pKTsKKworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKyAgICAgICAgICAgICAgIAkgCSgiZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2FbJWRdID0gJWRcbiIsCisgICAgICAgICAgICAgICAJIAlkZWx0YSwgZGVsdGFfc3dpbmdfdGFibGVfaWR4X3Rkb3duX2FbZGVsdGFdKSk7CisKKwkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W1JGOTBfUEFUSF9BXSA9IHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtSRjkwX1BBVEhfQV07CisJCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhbUkY5MF9QQVRIX0FdID0gLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYVtkZWx0YV07CisKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0gPSAgLTEgKiBkZWx0YV9zd2luZ190YWJsZV9pZHhfdGRvd25fYVtkZWx0YV07CisJCQkvKiBSZWNvcmQgZGVsdGEgc3dpbmcgZm9yIG1peCBtb2RlIHBvd2VyIHRyYWNraW5nKi8KKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCIqKioqKipUZW1wIGlzIGxvd2VyIGFuZCBwRE1fT2RtLT5BYm9zbHV0ZV9PRkRNU3dpbmdJZHhbT0RNX1JGX1BBVEhfQV0gPSAlZFxuIiwKKwkJCXJ0bGRtLT5hYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtSRjkwX1BBVEhfQV0pKTsKKyAJCX0KKworCQlmb3IgKHAgPSBSRjkwX1BBVEhfQTsgcCA8IE1BWF9QQVRIX05VTV84ODIxQTsgcCsrKQorICAgICAgICAJeworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSAgICAgICAgICAgICAgICAoIlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBbUGF0aC0lY10gXAorCQkgICAgICAgICAgICAgICAgQ2FsY3VsYXRpbmcgUG93ZXJJbmRleE9mZnNldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwKKwkJICAgICAgICAgICAgICAgIChwID09IFJGOTBfUEFUSF9BID8gJ0EnIDogJ0InKSkpOworCisJCSAgICAJaWYgKHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtwXSA9PSBydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhfbGFzdFtwXSkKKwkJCQkvKklmIFRoZXJtYWwgdmFsdWUgY2hhbmdlcyBidXQgbG9va3VwIHRhYmxlIHZhbHVlIHN0aWxsIHRoZSBzYW1lKi8KKwkJICAgIAkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXSA9IDA7CisJCSAgICAJZWxzZQorCQkgICAgCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdID0KKwkJICAgIAkJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtwXSAtIHJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleF9sYXN0W3BdOworCQkJCS8qUG93ZXIgSW5kZXggRGlmZiBiZXR3ZWVuIDIgdGltZXMgUG93ZXIgVHJhY2tpbmcqLworCisJCSAgICAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSAgICAJCSgiW1BhdGgtJWNdIFBvd2VySW5kZXhPZmZzZXQoJWQpID0gRGVsdGFQb3dlckluZGV4KCVkKSAtIERlbHRhUG93ZXJJbmRleExhc3QoJWQpXG4iLAorICAgICAgICAgICAgICAgIAkJKHAgPT0gUkY5MF9QQVRIX0EgPyAnQScgOiAnQicpLAorICAgICAgICAgICAgICAgIAkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXSwKKyAgICAgICAgICAgICAgICAJCXJ0bGRtLT5kZWx0YV9wb3dlcl9pbmRleFtwXSAsCisgICAgICAgICAgICAgICAgCQlydGxkbS0+ZGVsdGFfcG93ZXJfaW5kZXhfbGFzdFtwXSkpOworCisJICAgIAkJcnRsZG0tPm9mZG1faW5kZXhbcF0gPQorCQkJCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtwXSArIHJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF07CisJCSAgICAJcnRsZG0tPmNja19pbmRleCA9CisJCQkJCXJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrX2Jhc2UgKyBydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdOworCisJCSAgICAJcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2sgPSBydGxkbS0+Y2NrX2luZGV4OworCQkgICAJcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtW3BdID0gcnRsZG0tPm9mZG1faW5kZXhbcF07CisKKwkgICAgICAgICAgIAkvKioqKioqKioqKioqKlByaW50IEJCIFN3aW5nIEJhc2UgYW5kIEluZGV4IE9mZnNldCoqKioqKioqKioqKiovCisKKwkJICAgIAlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJICAgIAkJKCJUaGUgJ0NDSycgZmluYWwgaW5kZXgoJWQpID0gQmFzZUluZGV4KCVkKSArIFBvd2VySW5kZXhPZmZzZXQoJWQpXG4iLAorCQkgICAgCQlydGxkbS0+YmJfc3dpbmdfaWR4X2NjaywKKwkJICAgIAkJcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2tfYmFzZSwKKwkJICAgIAkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtwXSkpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJUaGUgJ09GRE0nIGZpbmFsIGluZGV4KCVkKSA9IEJhc2VJbmRleFslY10oJWQpICsgUG93ZXJJbmRleE9mZnNldCglZClcbiIsCisJCSAgIAkJcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtW3BdLAorCQkgICAJCShwID09IFJGOTBfUEFUSF9BID8gJ0EnIDogJ0InKSwKKwkJICAgCQlydGxkbS0+YmJfc3dpbmdfaWR4X29mZG1fYmFzZVtwXSwKKwkJICAgCQlydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W3BdKSk7CisKKwkJICAgIAkvKjcuMSBIYW5kbGUgYm91bmRhcnkgY29uZGl0aW9ucyBvZiBpbmRleC4qLworCisKKwkJCWlmKHJ0bGRtLT5vZmRtX2luZGV4W3BdID4gVFhTQ0FMRV9UQUJMRV9TSVpFIC0xKQorCQkJeworCQkJCXJ0bGRtLT5vZmRtX2luZGV4W3BdID0gVFhTQ0FMRV9UQUJMRV9TSVpFIC0xOworCQkJfQorCQkJZWxzZSBpZiAocnRsZG0tPm9mZG1faW5kZXhbcF0gPCBvZmRtX21pbl9pbmRleCkKKwkJCXsKKwkJCQlydGxkbS0+b2ZkbV9pbmRleFtwXSA9IG9mZG1fbWluX2luZGV4OworCQkJfQorCQl9CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorICAgICAgICAgICAgCQkoIlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cCisgICAgICAgICAgICAJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKSk7CisJCWlmKHJ0bGRtLT5jY2tfaW5kZXggPiBUWFNDQUxFX1RBQkxFX1NJWkUgLTEpCisJCQlydGxkbS0+Y2NrX2luZGV4ID0gVFhTQ0FMRV9UQUJMRV9TSVpFIC0xOworCQllbHNlIGlmIChydGxkbS0+Y2NrX2luZGV4IDwgMCkKKwkJCXJ0bGRtLT5jY2tfaW5kZXggPSAwOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJKCJUaGUgdGhlcm1hbCBtZXRlciBpcyB1bmNoYW5nZWQgb3IgVHhQb3dlclRyYWNraW5nIE9GRiglZCk6IFwKKwkJCVRoZXJtYWxWYWx1ZTogJWQgLCBwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlOiAlZFxuIiwKKwkJCXJ0bGRtLT50eHBvd2VyX3RyYWNrX2NvbnRyb2wsCisJCQl0aGVybWFsX3ZhbHVlLAorCQkJcnRsZG0tPnRoZXJtYWx2YWx1ZSkpOworCisJICAgIAlmb3IgKHAgPSBSRjkwX1BBVEhfQTsgcCA8IE1BWF9QQVRIX05VTV84ODIxQTsgcCsrKQorCQkgICAgCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbcF0gPSAwOworCX0KKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJKCJUeFBvd2VyVHJhY2tpbmc6IFtDQ0tdIFN3aW5nIEN1cnJlbnQgSW5kZXg6ICVkLCBTd2luZyBCYXNlIEluZGV4OiAlZFxuIiwKKwkJcnRsZG0tPmNja19pbmRleCwgcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2tfYmFzZSkpOyAgICAgICAvKlByaW50IFN3aW5nIGJhc2UgJiBjdXJyZW50Ki8KKwlmb3IgKHAgPSBSRjkwX1BBVEhfQTsgcCA8IE1BWF9QQVRIX05VTV84ODIxQTsgcCsrKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkoIlR4UG93ZXJUcmFja2luZzogW09GRE1dIFN3aW5nIEN1cnJlbnQgSW5kZXg6ICVkLCBTd2luZyBCYXNlIEluZGV4WyVjXTogJWRcbiIsCisJCQlydGxkbS0+b2ZkbV9pbmRleFtwXSwKKwkJCShwID09IFJGOTBfUEFUSF9BID8gJ0EnIDogJ0InKSwKKwkJCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW3BdKSk7CisJfQorCisJaWYgKChydGxkbS0+cG93ZXJfaW5kZXhfb2Zmc2V0W1JGOTBfUEFUSF9BXSAhPSAwIHx8CisJCXJ0bGRtLT5wb3dlcl9pbmRleF9vZmZzZXRbUkY5MF9QQVRIX0JdICE9IDAgKSAmJgorICAgICAJIAlydGxkbS0+dHhwb3dlcl90cmFja19jb250cm9sKQorCXsKKwkJLyo3LjIgQ29uZmlndXJlIHRoZSBTd2luZyBUYWJsZSB0byBhZGp1c3QgVHggUG93ZXIuKi8KKwkJLypBbHdheXMgVFJVRSBhZnRlciBUeCBQb3dlciBpcyBhZGp1c3RlZCBieSBwb3dlciB0cmFja2luZy4qLworCQkvKgorCQkgIDIwMTIvMDQvMjMgTUggQWNjb3JkaW5nIHRvIEx1a2UncyBzdWdnZXN0aW9uLCB3ZSBjYW4gbm90IHdyaXRlIEJCIGRpZ2l0YWwKKwkJICB0byBpbmNyZWFzZSBUWCBwb3dlci4gT3RoZXJ3aXNlLCBFVk0gd2lsbCBiZSBiYWQuCisKKwkJICAyMDEyLzA0LzI1IE1IIEFkZCBmb3IgdHggcG93ZXIgdHJhY2tpbmcgdG8gc2V0IHR4IHBvd2VyIGluIHR4IGFnYyBmb3IgODhFLgorCQkqLworCQlpZiAodGhlcm1hbF92YWx1ZSA+IHJ0bGRtLT50aGVybWFsdmFsdWUpCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgiVGVtcGVyYXR1cmUgSW5jcmVhc2luZyhBKTogZGVsdGFfcGk6ICVkICwgZGVsdGFfdDogJWQsIE5vd190OiAlZCwgRUZVU0VfdDogJWQsIExhc3RfdDogJWRcbiIsCisJCQkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtSRjkwX1BBVEhfQV0sCisJCQkJZGVsdGEsIHRoZXJtYWxfdmFsdWUsCisJCQkJcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIsCisJCQkJcnRsZG0tPnRoZXJtYWx2YWx1ZSkpOworCQl9IGVsc2UgaWYgKHRoZXJtYWxfdmFsdWUgPCBydGxkbS0+dGhlcm1hbHZhbHVlKSB7IC8qTG93IHRlbXBlcmF0dXJlKi8KKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgiVGVtcGVyYXR1cmUgRGVjcmVhc2luZyhBKTogZGVsdGFfcGk6ICVkICwgZGVsdGFfdDogJWQsIE5vd190OiAlZCwgRUZVU0VfdDogJWQsIExhc3RfdDogJWRcbiIsCisJCQkJcnRsZG0tPnBvd2VyX2luZGV4X29mZnNldFtSRjkwX1BBVEhfQV0sCisJCQkJZGVsdGEsIHRoZXJtYWxfdmFsdWUsCisJCQkJcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIsCisJCQkJcnRsZG0tPnRoZXJtYWx2YWx1ZSkpOworCQl9CisKKwkJaWYgKHRoZXJtYWxfdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikgeworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJUZW1wZXJhdHVyZSglZCkgaGlnaGVyIHRoYW4gUEcgdmFsdWUoJWQpXG4iLAorCQkJCXRoZXJtYWxfdmFsdWUsIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSk7CisKKworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCIqKioqKioqKioqRW50ZXIgUE9XRVIgVHJhY2tpbmcgTUlYX01PREUqKioqKioqKioqXG4iKSk7CisJCQlmb3IgKHAgPSBSRjkwX1BBVEhfQTsgcCA8IE1BWF9QQVRIX05VTV84ODIxQTsgcCsrKQorCQkJCQlydGw4ODIxYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3cihodywgTUlYX01PREUsIHAsIGluZGV4X2Zvcl9jaGFubmVsKTsKKworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJKCJUZW1wZXJhdHVyZSglZCkgbG93ZXIgdGhhbiBQRyB2YWx1ZSglZClcbiIsCisJCQkJdGhlcm1hbF92YWx1ZSwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpKTsKKworCisJICAgICAgICAgICAgCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSgiKioqKioqKioqKkVudGVyIFBPV0VSIFRyYWNraW5nIE1JWF9NT0RFKioqKioqKioqKlxuIikpOworCQkJZm9yIChwID0gUkY5MF9QQVRIX0E7IHAgPCBNQVhfUEFUSF9OVU1fODgyMUE7IHArKykKKwkJCQlydGw4ODEyYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3cihodywgTUlYX01PREUsIHAsIGluZGV4X2Zvcl9jaGFubmVsKTsKKworCQl9CisKKwkJcnRsZG0tPmJiX3N3aW5nX2lkeF9jY2tfYmFzZSA9IHJ0bGRtLT5iYl9zd2luZ19pZHhfY2NrOyAgIC8qUmVjb3JkIGxhc3QgdGltZSBQb3dlciBUcmFja2luZyByZXN1bHQgYXMgYmFzZS4qLworCQlmb3IgKHAgPSBSRjkwX1BBVEhfQTsgcCA8IE1BWF9QQVRIX05VTV84ODIxQTsgcCsrKQorCQkJCXJ0bGRtLT5iYl9zd2luZ19pZHhfb2ZkbV9iYXNlW3BdID0gcnRsZG0tPmJiX3N3aW5nX2lkeF9vZmRtW3BdOworCisJIAkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSgicERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlRoZXJtYWxWYWx1ZSA9ICVkIFRoZXJtYWxWYWx1ZT0gJWRcbiIsCisJCQkJCXJ0bGRtLT50aGVybWFsdmFsdWUsIHRoZXJtYWxfdmFsdWUpKTsKKworCQlydGxkbS0+dGhlcm1hbHZhbHVlID0gdGhlcm1hbF92YWx1ZTsgICAgICAgICAvKlJlY29yZCBsYXN0IFBvd2VyIFRyYWNraW5nIFRoZXJtYWwgVmFsdWUqLworCisJfQorCS8qRGVsdGEgdGVtcGVyYXR1cmUgaXMgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gMjAgY2VudGlncmFkZSAoV2hlbiB0aHJlc2hvbGQgaXMgOCkuKi8KKwlpZiAoKGRlbHRhX2lxayA+PSBJUUtfVEhSRVNIT0xEKSkgeworCisJCWlmICggIXJ0bHBoeS0+Yl9pcWtfaW5fcHJvZ3Jlc3MpIHsKKworCQkJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisJCQlydGxwaHktPmJfaXFrX2luX3Byb2dyZXNzID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisKKwkJCXJ0bDg4MjFhZV9kb19pcWsoaHcsIGRlbHRhX2lxaywgdGhlcm1hbF92YWx1ZSwgOCk7CisKKwkJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCQkJcnRscGh5LT5iX2lxa19pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwkJfQorCX0KKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkoIjw9PT1ydGw4ODEyYWVfZG1fdHhwb3dlcl90cmFja2luZ19jYWxsYmFja190aGVybWFsbWV0ZXJcbiIpKTsKK30KKworCit2b2lkIHJ0bDg4MjFhZV9kbV9jaGVja190eHBvd2VyX3RyYWNraW5nX3RoZXJtYWxtZXRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RhdGljIHU4IHRtX3RyaWdnZXIgPSAwOworCisJLy9pZiAoIXJ0bHByaXYtPmRtLmJ0eHBvd2VyX3RyYWNraW5nKQorCS8vCXJldHVybjsKKworCWlmICghdG1fdHJpZ2dlcikgeworCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgUkZfVF9NRVRFUl84OEUsIEJJVCgxNyl8QklUKDE2KSwKKwkJCSAgICAgIDB4MDMpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSAoIlRyaWdnZXIgODgyMWFlIFRoZXJtYWwgTWV0ZXIhIVxuIikpOworCQl0bV90cmlnZ2VyID0gMTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJICgiU2NoZWR1bGUgVHhQb3dlclRyYWNraW5nICEhXG4iKSk7CisKKwkJcnRsODgyMWFlX2RtX3R4cG93ZXJfdHJhY2tpbmdfY2FsbGJhY2tfdGhlcm1hbG1ldGVyKGh3KTsKKwkJdG1fdHJpZ2dlciA9IDA7CisJfQorfQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX3JlZnJlc2hfcmF0ZV9hZGFwdGl2ZV9tYXNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJhdGVfYWRhcHRpdmUgKnBfcmEgPSAmKHJ0bHByaXYtPnJhKTsKKwl1MzIgbG93X3Jzc2l0aHJlc2hfZm9yX3JhID0gcF9yYS0+bG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhOworCXUzMiBoaWdoX3Jzc2l0aHJlc2hfZm9yX3JhID0gcF9yYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJdTggZ29fdXBfZ2FwID0gNTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gTlVMTDsKKworCWlmIChpc19oYWxfc3RvcChydGxoYWwpKSB7CisJCVJUX1RSQUNFKENPTVBfUkFURSwgREJHX0xPVUQsCisJCQkgKCJkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXJ0bHByaXYtPmRtLmJfdXNlcmFtYXNrKSB7CisJCVJUX1RSQUNFKENPTVBfUkFURSwgREJHX0xPVUQsCisJCQkgKCJkcml2ZXIgZG9lcyBub3QgY29udHJvbCByYXRlIGFkYXB0aXZlIG1hc2tcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtYWMtPmxpbmtfc3RhdGUgPT0gTUFDODAyMTFfTElOS0VEICYmCisJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKworCQlzd2l0Y2ggKHBfcmEtPnByZV9yYXRyX3N0YXRlKSB7CisJCQljYXNlIERNX1JBVFJfU1RBX01JRERMRToKKwkJCQloaWdoX3Jzc2l0aHJlc2hfZm9yX3JhICs9IGdvX3VwX2dhcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fUkFUUl9TVEFfTE9XOgorCQkJCWhpZ2hfcnNzaXRocmVzaF9mb3JfcmEgKz0gZ29fdXBfZ2FwOworCQkJCWxvd19yc3NpdGhyZXNoX2Zvcl9yYSArPSBnb191cF9nYXA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPgorCQkgICAgKGxvbmcpaGlnaF9yc3NpdGhyZXNoX2Zvcl9yYSkKKwkJCXBfcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9ISUdIOworCQllbHNlIGlmIChydGxwcml2LT5kbS51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4KKwkJCSAobG9uZylsb3dfcnNzaXRocmVzaF9mb3JfcmEpCisJCQlwX3JhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTUlERExFOworCQllbHNlCisJCQlwX3JhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOworCisJCWlmIChwX3JhLT5wcmVfcmF0cl9zdGF0ZSAhPSBwX3JhLT5yYXRyX3N0YXRlICkgeworCQkJUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfTE9VRCwKKwkJCQkgKCJSU1NJID0gJWxkXG4iLAorCQkJCSAgcnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikpOworCQkJUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfTE9VRCwKKwkJCQkgKCJSU1NJX0xFVkVMID0gJWRcbiIsIHBfcmEtPnJhdHJfc3RhdGUpKTsKKwkJCVJUX1RSQUNFKENPTVBfUkFURSwgREJHX0xPVUQsCisJCQkJICgiUHJlU3RhdGUgPSAlZCwgQ3VyU3RhdGUgPSAlZFxuIiwKKwkJCQkgIHBfcmEtPnByZV9yYXRyX3N0YXRlLCBwX3JhLT5yYXRyX3N0YXRlKSk7CisKKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJCXN0YSA9IHJ0bF9maW5kX3N0YShodywgbWFjLT5ic3NpZCk7CisJCQlpZiAoc3RhKQorCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnVwZGF0ZV9yYXRlX3RibChodywgc3RhLCBwX3JhLT5yYXRyX3N0YXRlKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCisJCQlwX3JhLT5wcmVfcmF0cl9zdGF0ZSA9IHBfcmEtPnJhdHJfc3RhdGU7CisJCX0KKwl9Cit9CisKK2Jvb2wgcnRsODgyMWFlX2RtX2lzX2VkY2FfdHVyYm9fZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAocnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19vcHMtPmJ0Y19pc19kaXNhYmxlX2VkY2FfdHVyYm8ocnRscHJpdikpCisJCXJldHVybiB0cnVlOworCWlmIChydGxwcml2LT5tYWM4MDIxMS5tb2RlID09IFdJUkVMRVNTX01PREVfQikKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2VkY2FfY2hvb3NlX3RyYWZmaWNfaWR4KAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1NjQgY3VyX3R4X2J5dGVzLCB1NjQgY3VyX3J4X2J5dGVzLCBib29sIGJfYmlhc19vbl9yeCwKKwlib29sICpwYl9pc19jdXJfcmRsX3N0YXRlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmKGJfYmlhc19vbl9yeCkKKwl7CisJCWlmIChjdXJfdHhfYnl0ZXMgPiAoY3VyX3J4X2J5dGVzKjQpKSB7CisJCQkqcGJfaXNfY3VyX3JkbF9zdGF0ZSA9IGZhbHNlOworCQkJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCisJCQkJKCJVcGxpbmsgVHJhZmZpY1xuICIpKTsKKwkJfSBlbHNlIHsKKwkJCSpwYl9pc19jdXJfcmRsX3N0YXRlID0gdHJ1ZTsKKwkJCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAorCQkJCSgiQmFsYW5jZSBUcmFmZmljXG4iKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3VyX3J4X2J5dGVzID4gKGN1cl90eF9ieXRlcyo0KSkgeworCQkJKnBiX2lzX2N1cl9yZGxfc3RhdGUgPSB0cnVlOworCQkJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCisJCQkJKCJEb3dubGluawlUcmFmZmljXG4iKSk7CisJCX0gZWxzZSB7CisJCQkqcGJfaXNfY3VyX3JkbF9zdGF0ZSA9IGZhbHNlOworCQkJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCisJCQkJKCJCYWxhbmNlIFRyYWZmaWNcbiIpKTsKKwkJfQorCX0KKwlyZXR1cm4gOworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfZG1fY2hlY2tfZWRjYV90dXJibyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9ICBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKworCS8qS2VlcCBwYXN0IFR4L1J4IHBhY2tldCBjb3VudCBmb3IgUlQtdG8tUlQgRURDQSB0dXJiby4qLworCXVuc2lnbmVkIGxvbmcgY3VyX3R4X29rX2NudCA9IDA7CisJdW5zaWduZWQgbG9uZyBjdXJfcnhfb2tfY250ID0gMDsKKwl1MzIgZWRjYV9iZV91bCA9IDB4NWVhNDJiOworCXUzMiBlZGNhX2JlX2RsID0gMHg1ZWE0MmI7CisJdTMyIGVkY2FfYmUgPSAweDVlYTQyYjsKKwl1OCBpb3RfcGVlciA9IDA7CisJYm9vbCAqcGJfaXNfY3VyX3JkbF9zdGF0ZSA9IE5VTEw7CisJYm9vbCBiX2xhc3RfaXNfY3VyX3JkbF9zdGF0ZSA9IGZhbHNlOworCWJvb2wgYl9iaWFzX29uX3J4ID0gZmFsc2U7CisJYm9vbCBiX2VkY2FfdHVyYm9fb24gPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAorCQkoInJ0bDg4MjFhZV9kbV9jaGVja19lZGNhX3R1cmJvPT09PT0+IikpOworCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAorCQkoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLAorCQlydGxfcmVhZF9kd29yZChydGxwcml2LCBETV9SRUdfRURDQV9CRV8xMU4pKSk7CisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlsaXN0IHBhcmFtdGVyIGZvciBkaWZmZXJlbnQgcGxhdGZvcm0KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwliX2xhc3RfaXNfY3VyX3JkbF9zdGF0ZSA9IHJ0bHByaXYtPmRtLmJpc19jdXJfcmRsc3RhdGU7CisJcGJfaXNfY3VyX3JkbF9zdGF0ZSA9ICYoIHJ0bHByaXYtPmRtLmJpc19jdXJfcmRsc3RhdGUpOworCisJY3VyX3R4X29rX2NudCA9IHJ0bHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gcnRsZG0tPmxhc3RfdHhfb2tfY250OworCWN1cl9yeF9va19jbnQgPSBydGxwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIHJ0bGRtLT5sYXN0X3J4X29rX2NudDsKKworCXJ0bGRtLT5sYXN0X3R4X29rX2NudCA9IHJ0bHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0OworCXJ0bGRtLT5sYXN0X3J4X29rX2NudCA9IHJ0bHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OworCisJaW90X3BlZXIgPSBydGxwcml2LT5tYWM4MDIxMS52ZW5kb3I7CisJYl9iaWFzX29uX3J4ID0gKGlvdF9wZWVyID09IFBFRVJfUkFMIHx8IGlvdF9wZWVyID09IFBFRVJfQVRIKSA/CisJCSAgICAgICB0cnVlIDogZmFsc2U7CisJYl9lZGNhX3R1cmJvX29uID0gKCghcnRscHJpdi0+ZG0uYmlzX2FueV9ub25iZXBrdHMpICYmCisJCQkgICAoIXJ0bHByaXYtPmRtLmJfZGlzYWJsZV9mcmFtZWJ1cnN0aW5nKSkgPworCQkJICAgdHJ1ZSA6IGZhbHNlOworCisJLyppZiAocnRsODgyMWFlX2RtX2lzX2VkY2FfdHVyYm9fZGlzYWJsZShodykpCisJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsqLworCisJaWYgKChpb3RfcGVlciA9PSBQRUVSX0NJU0NPKSAmJiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpKQorCXsKKwkJZWRjYV9iZV9kbCA9IGVkY2Ffc2V0dGluZ19kbFtpb3RfcGVlcl07CisJCWVkY2FfYmVfdWwgPSBlZGNhX3NldHRpbmdfdWxbaW90X3BlZXJdOworCX0KKworCVJUX1RSQUNFKENPTVBfVFVSQk8sIERCR19MT1VELAorCQkoImJJc0FueU5vbkJFUGt0cyA6IDB4JXggIGJEaXNhYmxlRnJhbWVCdXJzdGluZyA6IDB4JXggIFxuIiwKKwkJcnRscHJpdi0+ZG0uYmlzX2FueV9ub25iZXBrdHMsIHJ0bHByaXYtPmRtLmJfZGlzYWJsZV9mcmFtZWJ1cnN0aW5nKSk7CisKKwlSVF9UUkFDRShDT01QX1RVUkJPLCBEQkdfTE9VRCwKKwkJCSgiYkVkY2FUdXJib09uIDogMHgleCBiQmlhc09uUnggOiAweCV4XG4iLAorCQkJYl9lZGNhX3R1cmJvX29uLCBiX2JpYXNfb25fcngpKTsKKworCWlmIChiX2VkY2FfdHVyYm9fb24pIHsKKwkJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCisJCQkoImN1clR4T2tDbnQgOiAweCVseCBcbiIsY3VyX3R4X29rX2NudCkpOworCQlSVF9UUkFDRShDT01QX1RVUkJPLCBEQkdfTE9VRCwKKwkJCSgiY3VyUnhPa0NudCA6IDB4JWx4IFxuIixjdXJfcnhfb2tfY250KSk7CisJCWlmKGJfYmlhc19vbl9yeCkKKwkJCXJ0bDg4MjFhZV9kbV9lZGNhX2Nob29zZV90cmFmZmljX2lkeChodywgY3VyX3R4X29rX2NudCwKKwkJCQljdXJfcnhfb2tfY250LCB0cnVlLCBwYl9pc19jdXJfcmRsX3N0YXRlKTsKKwkJZWxzZQorCQkJcnRsODgyMWFlX2RtX2VkY2FfY2hvb3NlX3RyYWZmaWNfaWR4KGh3LCBjdXJfdHhfb2tfY250LAorCQkJCWN1cl9yeF9va19jbnQsIGZhbHNlLCBwYl9pc19jdXJfcmRsX3N0YXRlKTsKKworCQllZGNhX2JlID0gKCgqcGJfaXNfY3VyX3JkbF9zdGF0ZSkgPT0gdHJ1ZSkgPyBlZGNhX2JlX2RsIDogZWRjYV9iZV91bDsKKworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgRE1fUkVHX0VEQ0FfQkVfMTFOLCBlZGNhX2JlKTsKKworCQlSVF9UUkFDRShDT01QX1RVUkJPLCBEQkdfTE9VRCwKKwkJCSgiRURDQSBUdXJibyBvbjogRURDQV9CRToweCV4XG4iLCBlZGNhX2JlKSk7CisKKwkJcnRscHJpdi0+ZG0uYmN1cnJlbnRfdHVyYm9fZWRjYSA9IHRydWU7CisKKwkJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCisJCQkoIkVEQ0FfQkVfREwgOiAweCV4ICBFRENBX0JFX1VMIDogMHgleCAgRURDQV9CRSA6IDB4JXggIFxuIiwKKwkJCWVkY2FfYmVfZGwsIGVkY2FfYmVfdWwsIGVkY2FfYmUpKTsKKwl9IGVsc2UgeworCQlpZiAocnRscHJpdi0+ZG0uYmN1cnJlbnRfdHVyYm9fZWRjYSkgeworCQkJdTggdG1wID0gQUMwX0JFOworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9BQ19QQVJBTSwKKwkJCQkJCSAgICAgICh1OCAqKSAoJnRtcCkpOworCQl9CisJCXJ0bHByaXYtPmRtLmJjdXJyZW50X3R1cmJvX2VkY2EgPSBmYWxzZTsKKwl9CisKKy8qIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ6ICovCisJcnRscHJpdi0+ZG0uYmlzX2FueV9ub25iZXBrdHMgPSBmYWxzZTsKKwlydGxkbS0+bGFzdF90eF9va19jbnQgPSBydGxwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwlydGxkbS0+bGFzdF9yeF9va19jbnQgPSBydGxwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKK30KKworc3RhdGljIHZvaWQgcnRsODgyMWFlX2RtX2Nja19wYWNrZXRfZGV0ZWN0aW9uX3RocmVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggY3VyX2Nja19jY2FfdGhyZXNoOworCisJaWYgKHJ0bHByaXYtPm1hYzgwMjExLmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSB7CisJCS8qZG1fZGlndGFibGUucnNzaV92YWxfbWluID0gcnRsODgyMWFlX2RtX2luaXRpYWxfZ2Fpbl9taW5fcHdkYihodyk7Ki8KKwkJaWYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsX21pbiA+IDI1KQorCQkJY3VyX2Nja19jY2FfdGhyZXNoID0gMHhjZDsKKwkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsX21pbiA8PSAyNSkgJiYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsX21pbiA+IDEwKSkKKwkJCWN1cl9jY2tfY2NhX3RocmVzaCA9IDB4ODM7CisJCWVsc2UgeworCQkJaWYgKHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfY2NrX2ZhaWwgPiAxMDAwKQorCQkJCWN1cl9jY2tfY2NhX3RocmVzaCA9IDB4ODM7CisJCQllbHNlCisJCQkJY3VyX2Nja19jY2FfdGhyZXNoID0gMHg0MDsKKwkJfQorCisJfSBlbHNlIHsKKwkJaWYgKHJ0bHByaXYtPmZhbHNlYWxtX2NudC5jbnRfY2NrX2ZhaWwgPiAxMDAwKQorCQkJY3VyX2Nja19jY2FfdGhyZXNoID0gMHg4MzsKKwkJZWxzZQorCQkJY3VyX2Nja19jY2FfdGhyZXNoID0gMHg0MDsKKwl9CisKKwlpZiAoZG1fZGlndGFibGUuY3VyX2Nja19jY2FfdGhyZXMgIT0gY3VyX2Nja19jY2FfdGhyZXNoKSB7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJDQ0swX0NDQSwgTUFTS0JZVEUyLCBjdXJfY2NrX2NjYV90aHJlc2gpOworCX0KKworCWRtX2RpZ3RhYmxlLnByZV9jY2tfY2NhX3RocmVzID0gZG1fZGlndGFibGUuY3VyX2Nja19jY2FfdGhyZXM7CisJZG1fZGlndGFibGUuY3VyX2Nja19jY2FfdGhyZXMgPSBjdXJfY2NrX2NjYV90aHJlc2g7CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19UUkFDRSwKKwkJICgiQ0NLIGNjYSB0aHJlc2ggaG9sZCA9JXhcbiIsIGRtX2RpZ3RhYmxlLmN1cl9jY2tfY2NhX3RocmVzKSk7CisKK30KKwordm9pZCBydGw4ODIxYWVfZG1fZHluYW1pY19lZGNjYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJYm9vbCBiX2Z3X2N1cnJlbnRfaW5fcHNfbW9kZSA9IGZhbHNlOworCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9od19yZWcoaHcsSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsIFwKKwkJKHU4KikoJmJfZndfY3VycmVudF9pbl9wc19tb2RlKSk7CisJaWYgKGJfZndfY3VycmVudF9pbl9wc19tb2RlKQorCQlyZXR1cm47Cit9CisKK3ZvaWQgcnRsODgxMmFlX2RtX3VwZGF0ZV90eHBhdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHBhdGgpCit7CisJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAocnRsZG0tPnJlc3BfdHhfcGF0aCAhPSBwYXRoKSB7CisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgXAorCQkJKCJOZWVkIHRvIFVwZGF0ZSBUeCBQYXRoXG4iKSk7CisJCWlmIChwYXRoID09IFJGOTBfUEFUSF9BKSB7CisJCQkvKlR4IGJ5IFJlZyovCisJCQlydGxfc2V0X2JicmVnKGh3LCAweDgwYywgMHhGRkYwLCAweDExMSk7CisJCQkgLypSZXNwIFR4IGJ5IFR4aW5mbyovCisJCQlydGxfc2V0X2JicmVnKGh3LCAweDZkOCwgQklUKDcpIHwgQklUKDYpLCAxKTsKKwkJfSBlbHNlIHsKKwkJCS8qVHggYnkgUmVnKi8KKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODBjLCAweEZGRjAsIDB4MjIyKTsKKwkJCSAvKlJlc3AgVHggYnkgVHhpbmZvKi8KKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4NmQ4LCBCSVQoNykgfEJJVCg2KSwgMik7CisJCX0KKwl9CisJcnRsZG0tPnJlc3BfdHhfcGF0aCA9IHBhdGg7CisJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCBcCisJCSgiUGF0aD0lc1xuIiwocGF0aCA9PSBSRjkwX1BBVEhfQSkgPyAgXAorCQkiUkY5MF9QQVRIX0EiOiJSRjkwX1BBVEhfQSIpKTsKK30KKwordm9pZCBydGw4ODEyYWVfZG1fcGF0aF9kaXZlcnNpdHlfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCisJLy9ydGxfc2V0X2JicmVnKGh3LCAweDgwYyAsIEJJVCgyOSksIDEpOyAvKlR4IHBhdGggZnJvbSBSZWcqLworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODBjICwgMHhGRkYwLCAweDExMSk7IC8qVHggYnkgUmVnKi8KKwlydGxfc2V0X2JicmVnKGh3LCAweDZkOCAsIEJJVCg3KSB8IEJJVCg2KSwgMSk7IC8qUmVzcCBUeCBieSBUeGluZm8qLworCXJ0bDg4MTJhZV9kbV91cGRhdGVfdHhwYXRoKGh3LCBSRjkwX1BBVEhfQSk7CisKKwlydGxkbS0+cGF0aF9zZWwgPSAxOyAvKiBUeEluZm8gZGVmYXVsdCBhdCBwYXRoLUEqLworfQorCit2b2lkIHJ0bDgxMmFlX2RtX3NldF90eHBhdGhfYnlfdHhpbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4ICpwZGVzYykKK3sKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCisJU0VUX1RYX0RFU0NfVFhfQU5UKHBkZXNjLCBydGxkbS0+cGF0aF9zZWwpOworfQorCit2b2lkIHJ0bDg4MTJhZV9kbV9wYXRoX3N0YXRpc3RpY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyIHJzc2lfYSwgdTMyIHJzc2lfYikKK3sKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCisJcnRsZG0tPnBhdGhhX3N1bSArPSByc3NpX2E7CisJcnRsZG0tPnBhdGhhX2NudCArKzsKKworCXJ0bGRtLT5wYXRoYl9zdW0gKz0gcnNzaV9iOworCXJ0bGRtLT5wYXRoYl9jbnQgKys7Cit9CisKK3ZvaWQgcnRsODgxMmFlX2RtX3BhdGhfZGl2ZXJzaXR5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdTMyCXJzc2lfYXZnX2EgPSAwOworCXUzMiByc3NpX2F2Z19iID0gMDsKKwl1MzIgbG9jYWxfbWluX3Jzc2kgPSAwOworCXUzMiBtaW5fcnNzaSA9IDB4RkY7CisJdTggdHhfcmVzcF9wYXRoPTAsIHRhcmdldF9wYXRoOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBOVUxMOworCisJc3RhID0gcnRsX2ZpbmRfc3RhKGh3LCBtYWMtPmJzc2lkKTsKKwlpZiAoc3RhKSB7CisJCS8qQ2FjdWxhdGUgUlNTSSBwZXIgUGF0aCovCisJCXJzc2lfYXZnX2EgPSAocnRsZG0tPnBhdGhhX2NudCAhPSAwKSA/IFwKKwkJCShydGxkbS0+cGF0aGFfc3VtIC8gcnRsZG0tPnBhdGhhX2NudCkgOiAwOworCQlyc3NpX2F2Z19iID0gKHJ0bGRtLT5wYXRoYl9jbnQgIT0gMCkgPyBcCisJCQkocnRsZG0tPnBhdGhiX3N1bSAvIHJ0bGRtLT5wYXRoYl9jbnQpIDogMDsKKworCQl0YXJnZXRfcGF0aCA9IChyc3NpX2F2Z19hID09IHJzc2lfYXZnX2IpID8gcnRsZG0tPnJlc3BfdHhfcGF0aCA6IFwKKwkJCSgocnNzaV9hdmdfYT49cnNzaV9hdmdfYikgPyBSRjkwX1BBVEhfQSA6IFJGOTBfUEFUSF9CKTsKKworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCBcCisJCQkoImFzc29jX2lkPSVkLCBQYXRoQV9TdW09JWQsIFBhdGhBX0NudD0lZFxuIiwgXAorCQkJbWFjLT5hc3NvY19pZCwgcnRsZG0tPnBhdGhhX3N1bSwgcnRsZG0tPnBhdGhhX2NudCkpOworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCBcCisJCQkoImFzc29jX2lkPSVkLCBQYXRoQl9TdW09JWQsIFBhdGhCX0NudD0lZFxuIiwgXAorCQkJbWFjLT5hc3NvY19pZCwgcnRsZG0tPnBhdGhiX3N1bSwgcnRsZG0tPnBhdGhiX2NudCkpOworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCBcCisJCQkoImFzc29jX2lkPSVkLCBSc3NpQXZnQT0gJWQsIFJzc2lBdmdCPSAlZFxuIiwgXAorCQkJbWFjLT5hc3NvY19pZCwgcnNzaV9hdmdfYSwgcnNzaV9hdmdfYikpOworCisJCS8qU2VsZWN0IFJlc3AgVHggUGF0aCovCisJCWxvY2FsX21pbl9yc3NpID0gKHJzc2lfYXZnX2EgPiByc3NpX2F2Z19iKSA/ICByc3NpX2F2Z19iIDogcnNzaV9hdmdfYTsKKwkJaWYobG9jYWxfbWluX3Jzc2kgIDwgbWluX3Jzc2kpCisJCXsKKwkJCW1pbl9yc3NpID0gbG9jYWxfbWluX3Jzc2k7CisJCQl0eF9yZXNwX3BhdGggPSB0YXJnZXRfcGF0aDsKKwkJfQorCisJCS8qU2VsZWN0IFR4IERFU0MqLworCQlpZih0YXJnZXRfcGF0aCA9PSBSRjkwX1BBVEhfQSkKKwkJCXJ0bGRtLT5wYXRoX3NlbCA9IDE7CisJCWVsc2UKKwkJCXJ0bGRtLT5wYXRoX3NlbCA9IDI7CisKKwkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19UUkFDRSwgXAorCQkJKCJUeCBmcm9tIFR4SW5mbywgVGFyZ2V0UGF0aD0lc1xuIiwgXAorCQkJKHRhcmdldF9wYXRoPT1SRjkwX1BBVEhfQSkgPyBcCisJCQkiT0RNX1JGX1BBVEhfQSI6Ik9ETV9SRl9QQVRIX0IiKSk7CisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfVFJBQ0UsIFwKKwkJCSgicERNX1BhdGhEaXYtPlBhdGhTZWw9ICVkXG4iLCBcCisJCQlydGxkbS0+cGF0aF9zZWwpKTsKKwl9CisJcnRsZG0tPnBhdGhhX2NudCA9IDA7CisJcnRsZG0tPnBhdGhhX3N1bSA9IDA7CisJcnRsZG0tPnBhdGhiX2NudCA9IDA7CisJcnRsZG0tPnBhdGhiX3N1bSA9IDA7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2R5bmFtaWNfYXRjX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwl1OCBjcnlzdGFsX2NhcDsKKwl1MzIgcGFja2V0X2NvdW50OworCWludCBjZm9fa2h6X2EsY2ZvX2toel9iLGNmb19hdmUgPSAwLCBhZGp1c3RfeHRhbCA9IDA7CisJaW50IGNmb19hdmVfZGlmZjsKKworCWlmIChydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlIDwgTUFDODAyMTFfTElOS0VEKXsKKwkJLyoxLkVuYWJsZSBBVEMqLworCQlpZiAocnRsZG0tPmF0Y19zdGF0dXMgPT0gQVRDX1NUQVRVU19PRkYpCisJCXsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGQ19BUkVBLCBCSVQoMTQpLCBBVENfU1RBVFVTX09OKTsKKwkJCXJ0bGRtLT5hdGNfc3RhdHVzID0gQVRDX1NUQVRVU19PTjsKKwkJfQorCisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgXAorCQkJKCJydGw4ODIxYWVfZG1fZHluYW1pY19hdGNfc3dpdGNoKCk6IE5vIGxpbmshIVxuIikpOworCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsIFwKKwkJCSgicnRsODgyMWFlX2RtX2R5bmFtaWNfYXRjX3N3aXRjaCgpOiBhdGNfc3RhdHVzID0gJWRcbiIsIFwKKwkJCXJ0bGRtLT5hdGNfc3RhdHVzKSk7CisKKwkJaWYgKHJ0bGRtLT5jcnlzdGFsX2NhcCAhPSBydGxwcml2LT5lZnVzZS5jcnlzdGFsY2FwKQorCQl7CisJCQlydGxkbS0+Y3J5c3RhbF9jYXAgPSBydGxwcml2LT5lZnVzZS5jcnlzdGFsY2FwOworCQkJY3J5c3RhbF9jYXAgPSBydGxkbS0+Y3J5c3RhbF9jYXAgJiAweDNmOworCQkJY3J5c3RhbF9jYXAgPSBjcnlzdGFsX2NhcCAmIDB4M2Y7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRUdfTUFDX1BIWV9DVFJMLCBcCisJCQkJMHg3ZmY4MDAwMCwgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCBcCisJCQkoInJ0bDg4MjFhZV9kbV9keW5hbWljX2F0Y19zd2l0Y2goKTogY3J5c3RhbF9jYXAgPSAweCV4XG4iLCBcCisJCQlydGxkbS0+Y3J5c3RhbF9jYXApKTsKKwl9ZWxzZXsKKwkJLyoxLiBDYWxjdWxhdGUgQ0ZPIGZvciBwYXRoLUEgJiBwYXRoLUIqLworCQljZm9fa2h6X2EgPSAoaW50KShydGxkbS0+Y2ZvX3RhaWxbMF0gKiAzMTI1KSAvIDEyODA7CisJCWNmb19raHpfYiA9IChpbnQpKHJ0bGRtLT5jZm9fdGFpbFsxXSAqIDMxMjUpIC8gMTI4MDsKKwkJcGFja2V0X2NvdW50ID0gcnRsZG0tPnBhY2tldF9jb3VudDsKKworCQkvKjIuTm8gbmV3IHBhY2tldCovCisJCWlmIChwYWNrZXRfY291bnQgPT0gcnRsZG0tPnBhY2tldF9jb3VudF9wcmUpIHsKKwkJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgXAorCQkJCSgicnRsODgyMWFlX2RtX2R5bmFtaWNfYXRjX3N3aXRjaCgpOiBwYWNrZXQgY291bnRlciBkb2Vzbid0IGNoYW5nZVxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJcnRsZG0tPnBhY2tldF9jb3VudF9wcmUgPSBwYWNrZXRfY291bnQ7CisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgXAorCQkJKCJydGw4ODIxYWVfZG1fZHluYW1pY19hdGNfc3dpdGNoKCk6IHBhY2tldCBjb3VudGVyID0gJWRcbiIsIFwKKwkJCXJ0bGRtLT5wYWNrZXRfY291bnQpKTsKKworCQkvKjMuQXZlcmFnZSBDRk8qLworCQlpZiAocnRscHJpdi0+cGh5LnJmX3R5cGUgPT0gUkZfMVQxUikKKwkJCWNmb19hdmUgPSBjZm9fa2h6X2E7CisJCWVsc2UKKwkJCWNmb19hdmUgPSAoY2ZvX2toel9hICsgY2ZvX2toel9iKSA+PiAxOworCisJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgXAorCQkJKCJydGw4ODIxYWVfZG1fZHluYW1pY19hdGNfc3dpdGNoKCk6IgorCQkJImNmb19raHpfYSA9ICVka0h6LCBjZm9fa2h6X2IgPSAlZGtIeiwgY2ZvX2F2ZSA9ICVka0h6XG4iLAorCQkJY2ZvX2toel9hLCBjZm9fa2h6X2IsIGNmb19hdmUpKTsKKworCQkvKjQuQXZvaWQgYWJub3JtYWwgbGFyZ2UgQ0ZPKi8KKwkJY2ZvX2F2ZV9kaWZmID0gKHJ0bGRtLT5jZm9fYXZlX3ByZSA+PSBjZm9fYXZlKT8KKwkJCQkJCShydGxkbS0+Y2ZvX2F2ZV9wcmUgLSBjZm9fYXZlKToKKwkJCQkJCShjZm9fYXZlIC0gcnRsZG0tPmNmb19hdmVfcHJlKTsKKworCQlpZiAoY2ZvX2F2ZV9kaWZmID4gMjAgJiYgcnRsZG0tPmxhcmdlX2Nmb19oaXQgPT0gMCl7CisJCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsIFwKKwkJCQkoInJ0bDg4MjFhZV9kbV9keW5hbWljX2F0Y19zd2l0Y2goKTogZmlyc3QgbGFyZ2UgQ0ZPIGhpdFxuIikpOworCQkJcnRsZG0tPmxhcmdlX2Nmb19oaXQgPSAxOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJCXJ0bGRtLT5sYXJnZV9jZm9faGl0ID0gMDsKKworCQlydGxkbS0+Y2ZvX2F2ZV9wcmUgPSBjZm9fYXZlOworCisJCS8qQ0ZPIHRyYWNraW5nIGJ5IGFkanVzdGluZyBYdGFsIGNhcC4qLworCisJCS8qMS5EeW5hbWljIFh0YWwgdGhyZXNob2xkKi8KKwkJaWYgKGNmb19hdmUgPj0gLXJ0bGRtLT5jZm9fdGhyZXNob2xkICYmCisJCQljZm9fYXZlIDw9IHJ0bGRtLT5jZm9fdGhyZXNob2xkICYmCisJCQlydGxkbS0+aXNfZnJlZXplID09IDApeworCQkJaWYgKHJ0bGRtLT5jZm9fdGhyZXNob2xkID09IENGT19USFJFU0hPTERfWFRBTCl7CisJCQkJcnRsZG0tPmNmb190aHJlc2hvbGQgPSBDRk9fVEhSRVNIT0xEX1hUQUwgKyAxMDsKKwkJCQlydGxkbS0+aXNfZnJlZXplID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlydGxkbS0+Y2ZvX3RocmVzaG9sZCA9IENGT19USFJFU0hPTERfWFRBTDsKKwkJfQorCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsIFwKKwkJCSgicnRsODgyMWFlX2RtX2R5bmFtaWNfYXRjX3N3aXRjaCgpOiBEeW5hbWljIHRocmVzaG9sZCA9ICVkXG4iLCBcCisJCQlydGxkbS0+Y2ZvX3RocmVzaG9sZCkpOworCisJCS8qIDIuQ2FsY3VsYXRlIFh0YWwgb2Zmc2V0Ki8KKwkJaWYgKGNmb19hdmUgPiBydGxkbS0+Y2ZvX3RocmVzaG9sZCAmJiBydGxkbS0+Y3J5c3RhbF9jYXAgPCAweDNmKQorCQkJYWRqdXN0X3h0YWwgPSAoKGNmb19hdmUgLSBDRk9fVEhSRVNIT0xEX1hUQUwpID4+IDIpICsgMTsKKwkJZWxzZSBpZiAoKGNmb19hdmUgPCAtcnRscHJpdi0+ZG0uY2ZvX3RocmVzaG9sZCkgJiYgcnRscHJpdi0+ZG0uY3J5c3RhbF9jYXAgPiAwKQorCQkJYWRqdXN0X3h0YWwgPSAoKGNmb19hdmUgKyBDRk9fVEhSRVNIT0xEX1hUQUwpID4+IDIpIC0gMTsKKwkJUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCBcCisJCQkoInJ0bDg4MjFhZV9kbV9keW5hbWljX2F0Y19zd2l0Y2goKTogIgorCQkJIkNyeXN0YWwgY2FwID0gMHgleCwgQ3J5c3RhbCBjYXAgb2Zmc2V0ID0gJWRcbiIsCisJCQlydGxkbS0+Y3J5c3RhbF9jYXAsIGFkanVzdF94dGFsKSk7CisKKwkJLyozLkFkanVkdCBDcnlzdGFsIENhcC4qLworCQlpZiAoYWRqdXN0X3h0YWwgIT0gMCl7CisJCQlydGxkbS0+aXNfZnJlZXplID0gMDsKKwkJCXJ0bGRtLT5jcnlzdGFsX2NhcCArPSBhZGp1c3RfeHRhbDsKKworCQkJaWYgKHJ0bGRtLT5jcnlzdGFsX2NhcCA+IDB4M2YpCisJCQkJcnRsZG0tPmNyeXN0YWxfY2FwID0gMHgzZjsKKwkJCWVsc2UgaWYgKHJ0bGRtLT5jcnlzdGFsX2NhcCA8IDApCisJCQkJcnRsZG0tPmNyeXN0YWxfY2FwID0gMDsKKworCQkJY3J5c3RhbF9jYXAgPSBydGxkbS0+Y3J5c3RhbF9jYXAgJiAweDNmOworCQkJY3J5c3RhbF9jYXAgPSBjcnlzdGFsX2NhcCAmIDB4M2Y7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRUdfTUFDX1BIWV9DVFJMLCBcCisJCQkJMHg3ZmY4MDAwMCwgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CisJCQlSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsIFwKKwkJCQkoInJ0bDg4MjFhZV9kbV9keW5hbWljX2F0Y19zd2l0Y2goKTogTmV3IGNyeXN0YWwgY2FwID0gMHgleCBcbiIsIFwKKwkJCQlydGxkbS0+Y3J5c3RhbF9jYXApKTsKKwkJfQorCX0KKworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV93YXRjaGRvZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlib29sIGJfZndfY3VycmVudF9pbnBzbW9kZSA9IGZhbHNlOworCWJvb2wgYl9md19wc19hd2FrZSA9IHRydWU7CisKKwlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywgSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsCisJCQkJICAgICAgKHU4ICopICgmYl9md19jdXJyZW50X2lucHNtb2RlKSk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywgSFdfVkFSX0ZXTFBTX1JGX09OLAorCQkJCSAgICAgICh1OCAqKSAoJmJfZndfcHNfYXdha2UpKTsKKworCWlmKHBwc2MtPnAycF9wc19pbmZvLnAycF9wc19tb2RlKQorCQliX2Z3X3BzX2F3YWtlID0gZmFsc2U7CisKKwlpZigocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT04pICYmCisJCSgoIWJfZndfY3VycmVudF9pbnBzbW9kZSkgJiYgYl9md19wc19hd2FrZSkgJiYKKwkJKCFwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzKSkgeworCQlydGw4ODIxYWVfZG1fY29tbW9uX2luZm9fc2VsZl91cGRhdGUoaHcpOworCQlydGw4ODIxYWVfZG1fZmFsc2VfYWxhcm1fY291bnRlcl9zdGF0aXN0aWNzKGh3KTsKKwkJcnRsODgyMWFlX2RtX2NoZWNrX3Jzc2lfbW9uaXRvcihodyk7CisJCXJ0bDg4MjFhZV9kbV9kaWcoaHcpOworCQlydGw4ODIxYWVfZG1fZHluYW1pY19lZGNjYShodyk7CisJCXJ0bDg4MjFhZV9kbV9jY2tfcGFja2V0X2RldGVjdGlvbl90aHJlc2goaHcpOworCQlydGw4ODIxYWVfZG1fcmVmcmVzaF9yYXRlX2FkYXB0aXZlX21hc2soaHcpOworCQlydGw4ODIxYWVfZG1fY2hlY2tfZWRjYV90dXJibyhodyk7CisJCXJ0bDg4MjFhZV9kbV9keW5hbWljX2F0Y19zd2l0Y2goaHcpOworCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJcnRsODgxMmFlX2RtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmdfdGhlcm1hbG1ldGVyKGh3KTsKKwkJZWxzZQorCQkJcnRsODgyMWFlX2RtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmdfdGhlcm1hbG1ldGVyKGh3KTsKKwkJcnRsODgyMWFlX2RtX2lxX2NhbGlicmF0ZShodyk7CisJCWlmIChydGxwcml2LT5jZmctPm9wcy0+Z2V0X2J0Y19zdGF0dXMoKSl7CisJCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX29wcy0+YnRjX3BlcmlvZGljYWwocnRscHJpdik7CisJCX0KKwl9CisKKwlydGxwcml2LT5kbS5kYmdpbmZvLm51bV9xcnlfYmVhY29uX3BrdCA9IDA7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX3NldF90eF9hbnRfYnlfdHhfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCSAgIHU4ICpwZGVzYywgdTMyIG1hY19pZCkKK3sKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgZmFzdF9hbnRfdHJhaW5uaW5nICpwZmF0X3RhYmxlPSAmKHJ0bGRtLT5mYXRfdGFibGUpOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSAhPSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJcmV0dXJuOworCisJaWYgKChydGxlZnVzZS0+YW50ZW5uYV9kaXZfdHlwZSA9PSBDR19UUlhfSFdfQU5URElWKSB8fAorCQkocnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPT0gQ0dfVFJYX0hXX0FOVERJVikpeworCQlTRVRfVFhfREVTQ19UWF9BTlQocGRlc2MsIHBmYXRfdGFibGUtPmFudHNlbF9hW21hY19pZF0pOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5oCkBAIC0wLDAgKzEsNDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfX1JUTDg4MjFBRV9ETV9IX18KKyNkZWZpbmUgX19SVEw4ODIxQUVfRE1fSF9fCisKKyNkZWZpbmUJTUFJTl9BTlQJMAorI2RlZmluZQlBVVhfQU5UCTEKKyNkZWZpbmUJTUFJTl9BTlRfQ0dfVFJYCTEKKyNkZWZpbmUJQVVYX0FOVF9DR19UUlgJMAorI2RlZmluZQlNQUlOX0FOVF9DR0NTX1JYCTAKKyNkZWZpbmUJQVVYX0FOVF9DR0NTX1JYCTEKKworI2RlZmluZQlUWFNDQUxFX1RBQkxFX1NJWkUgMzcKKworLypSRiBSRUcgTElTVCovCisjZGVmaW5lCURNX1JFR19SRl9NT0RFXzExTgkJCQkweDAwCisjZGVmaW5lCURNX1JFR19SRl8wQl8xMU4JCQkJMHgwQgorI2RlZmluZQlETV9SRUdfQ0hOQldfMTFOCQkJCTB4MTgKKyNkZWZpbmUJRE1fUkVHX1RfTUVURVJfMTFOCQkJCTB4MjQKKyNkZWZpbmUJRE1fUkVHX1JGXzI1XzExTgkJCQkweDI1CisjZGVmaW5lCURNX1JFR19SRl8yNl8xMU4JCQkJMHgyNgorI2RlZmluZQlETV9SRUdfUkZfMjdfMTFOCQkJCTB4MjcKKyNkZWZpbmUJRE1fUkVHX1JGXzJCXzExTgkJCQkweDJCCisjZGVmaW5lCURNX1JFR19SRl8yQ18xMU4JCQkJMHgyQworI2RlZmluZQlETV9SRUdfUlhSRl9BM18xMU4JCQkJMHgzQworI2RlZmluZQlETV9SRUdfVF9NRVRFUl85MkRfMTFOCQkJMHg0MgorI2RlZmluZQlETV9SRUdfVF9NRVRFUl84OEVfMTFOCQkJMHg0MgorCisKKworLypCQiBSRUcgTElTVCovCisvKlBBR0UgOCAqLworI2RlZmluZQlETV9SRUdfQkJfQ1RSTF8xMU4JCQkJMHg4MDAKKyNkZWZpbmUJRE1fUkVHX1JGX1BJTl8xMU4JCQkJMHg4MDQKKyNkZWZpbmUJRE1fUkVHX1BTRF9DVFJMXzExTgkJCQkweDgwOAorI2RlZmluZQlETV9SRUdfVFhfQU5UX0NUUkxfMTFOCQkJMHg4MEMKKyNkZWZpbmUJRE1fUkVHX0JCX1BXUl9TQVY1XzExTgkJCTB4ODE4CisjZGVmaW5lCURNX1JFR19DQ0tfUlBUX0ZPUk1BVF8xMU4JCTB4ODI0CisjZGVmaW5lCURNX1JFR19SWF9ERUZVQUxUX0FfMTFOCQkweDg1OAorI2RlZmluZQlETV9SRUdfUlhfREVGVUFMVF9CXzExTgkJMHg4NUEKKyNkZWZpbmUJRE1fUkVHX0JCX1BXUl9TQVYzXzExTgkJCTB4ODVDCisjZGVmaW5lCURNX1JFR19BTlRTRUxfQ1RSTF8xMU4JCQkweDg2MAorI2RlZmluZQlETV9SRUdfUlhfQU5UX0NUUkxfMTFOCQkJMHg4NjQKKyNkZWZpbmUJRE1fUkVHX1BJTl9DVFJMXzExTgkJCQkweDg3MAorI2RlZmluZQlETV9SRUdfQkJfUFdSX1NBVjFfMTFOCQkJMHg4NzQKKyNkZWZpbmUJRE1fUkVHX0FOVFNFTF9QQVRIXzExTgkJCTB4ODc4CisjZGVmaW5lCURNX1JFR19CQl8zV0lSRV8xMU4JCQkweDg4QworI2RlZmluZQlETV9SRUdfU0NfQ05UXzExTgkJCQkweDhDNAorI2RlZmluZQlETV9SRUdfUFNEX0RBVEFfMTFOCQkJMHg4QjQKKy8qUEFHRSA5Ki8KKyNkZWZpbmUJRE1fUkVHX0FOVF9NQVBQSU5HMV8xMU4JCTB4OTE0CisjZGVmaW5lCURNX1JFR19BTlRfTUFQUElORzJfMTFOCQkweDkxOAorLypQQUdFIEEqLworI2RlZmluZQlETV9SRUdfQ0NLX0FOVERJVl9QQVJBMV8xMU4JMHhBMDAKKyNkZWZpbmUJRE1fUkVHX0NDS19DQ0FfMTFOCQkJMHhBMEEKKyNkZWZpbmUJRE1fUkVHX0NDS19DQ0FfMTFBQwkJCTB4QTBBCisjZGVmaW5lCURNX1JFR19DQ0tfQU5URElWX1BBUkEyXzExTgkweEEwQworI2RlZmluZQlETV9SRUdfQ0NLX0FOVERJVl9QQVJBM18xMU4JMHhBMTAKKyNkZWZpbmUJRE1fUkVHX0NDS19BTlRESVZfUEFSQTRfMTFOCTB4QTE0CisjZGVmaW5lCURNX1JFR19DQ0tfRklMVEVSX1BBUkExXzExTgkweEEyMgorI2RlZmluZQlETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBMl8xMU4JMHhBMjMKKyNkZWZpbmUJRE1fUkVHX0NDS19GSUxURVJfUEFSQTNfMTFOCTB4QTI0CisjZGVmaW5lCURNX1JFR19DQ0tfRklMVEVSX1BBUkE0XzExTgkweEEyNQorI2RlZmluZQlETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNV8xMU4JMHhBMjYKKyNkZWZpbmUJRE1fUkVHX0NDS19GSUxURVJfUEFSQTZfMTFOCTB4QTI3CisjZGVmaW5lCURNX1JFR19DQ0tfRklMVEVSX1BBUkE3XzExTgkweEEyOAorI2RlZmluZQlETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBOF8xMU4JMHhBMjkKKyNkZWZpbmUJRE1fUkVHX0NDS19GQV9SU1RfMTFOCQkJMHhBMkMKKyNkZWZpbmUJRE1fUkVHX0NDS19GQV9NU0JfMTFOCQkJMHhBNTgKKyNkZWZpbmUJRE1fUkVHX0NDS19GQV9MU0JfMTFOCQkJMHhBNUMKKyNkZWZpbmUJRE1fUkVHX0NDS19DQ0FfQ05UXzExTgkJCTB4QTYwCisjZGVmaW5lCURNX1JFR19CQl9QV1JfU0FWNF8xMU4JCQkweEE3NAorLypQQUdFIEIgKi8KKyNkZWZpbmUJRE1fUkVHX0xOQV9TV0lUQ0hfMTFOCQkJMHhCMkMKKyNkZWZpbmUJRE1fUkVHX1BBVEhfU1dJVENIXzExTgkJCTB4QjMwCisjZGVmaW5lCURNX1JFR19SU1NJX0NUUkxfMTFOCQkJMHhCMzgKKyNkZWZpbmUJRE1fUkVHX0NPTkZJR19BTlRBXzExTgkJCTB4QjY4CisjZGVmaW5lCURNX1JFR19SU1NJX0JUXzExTgkJCQkweEI5QworLypQQUdFIEMgKi8KKyNkZWZpbmUJRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOCQkweEMwMAorI2RlZmluZQlETV9SRUdfUlhfUEFUSF8xMU4JCQkJMHhDMDQKKyNkZWZpbmUJRE1fUkVHX1RSTVVYXzExTgkJCQkweEMwOAorI2RlZmluZQlETV9SRUdfT0ZETV9GQV9SU1RDXzExTgkJMHhDMEMKKyNkZWZpbmUJRE1fUkVHX1JYSVFJX01BVFJJWF8xMU4JCTB4QzE0CisjZGVmaW5lCURNX1JFR19UWElRS19NQVRSSVhfTFNCMV8xMU4JMHhDNEMKKyNkZWZpbmUJRE1fUkVHX0lHSV9BXzExTgkJCQkweEM1MAorI2RlZmluZQlETV9SRUdfSUdJX0FfMTFBQwkJCQkweEM1MAorI2RlZmluZQlETV9SRUdfQU5URElWX1BBUkEyXzExTgkJMHhDNTQKKyNkZWZpbmUJRE1fUkVHX0lHSV9CXzExTgkJCQkJMHhDNTgKKyNkZWZpbmUJRE1fUkVHX0lHSV9CXzExQUMJCQkJCTB4RTUwCisjZGVmaW5lCURNX1JFR19BTlRESVZfUEFSQTNfMTFOCQkweEM1QworI2RlZmluZQlETV9SRUdfQkJfUFdSX1NBVjJfMTFOCQkJMHhDNzAKKyNkZWZpbmUJRE1fUkVHX1JYX09GRl8xMU4JCQkJMHhDN0MKKyNkZWZpbmUJRE1fUkVHX1RYSVFLX01BVFJJWEFfMTFOCQkweEM4MAorI2RlZmluZQlETV9SRUdfVFhJUUtfTUFUUklYQl8xMU4JCTB4Qzg4CisjZGVmaW5lCURNX1JFR19UWElRS19NQVRSSVhBX0xTQjJfMTFOCTB4Qzk0CisjZGVmaW5lCURNX1JFR19UWElRS19NQVRSSVhCX0xTQjJfMTFOCTB4QzlDCisjZGVmaW5lCURNX1JFR19SWElRS19NQVRSSVhfTFNCXzExTgkweENBMAorI2RlZmluZQlETV9SRUdfQU5URElWX1BBUkExXzExTgkJMHhDQTQKKyNkZWZpbmUJRE1fUkVHX09GRE1fRkFfVFlQRTFfMTFOCQkweENGMAorLypQQUdFIEQgKi8KKyNkZWZpbmUJRE1fUkVHX09GRE1fRkFfUlNURF8xMU4JCTB4RDAwCisjZGVmaW5lCURNX1JFR19PRkRNX0ZBX1RZUEUyXzExTgkJMHhEQTAKKyNkZWZpbmUJRE1fUkVHX09GRE1fRkFfVFlQRTNfMTFOCQkweERBNAorI2RlZmluZQlETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4JCTB4REE4CisvKlBBR0UgRSAqLworI2RlZmluZQlETV9SRUdfVFhBR0NfQV82XzE4XzExTgkJMHhFMDAKKyNkZWZpbmUJRE1fUkVHX1RYQUdDX0FfMjRfNTRfMTFOCQkweEUwNAorI2RlZmluZQlETV9SRUdfVFhBR0NfQV8xX01DUzMyXzExTgkweEUwOAorI2RlZmluZQlETV9SRUdfVFhBR0NfQV9NQ1MwXzNfMTFOCQkweEUxMAorI2RlZmluZQlETV9SRUdfVFhBR0NfQV9NQ1M0XzdfMTFOCQkweEUxNAorI2RlZmluZQlETV9SRUdfVFhBR0NfQV9NQ1M4XzExXzExTgkweEUxOAorI2RlZmluZQlETV9SRUdfVFhBR0NfQV9NQ1MxMl8xNV8xMU4JMHhFMUMKKyNkZWZpbmUJRE1fUkVHX0ZQR0EwX0lRS18xMU4JCQkweEUyOAorI2RlZmluZQlETV9SRUdfVFhJUUtfVE9ORV9BXzExTgkJMHhFMzAKKyNkZWZpbmUJRE1fUkVHX1JYSVFLX1RPTkVfQV8xMU4JCTB4RTM0CisjZGVmaW5lCURNX1JFR19UWElRS19QSV9BXzExTgkJCTB4RTM4CisjZGVmaW5lCURNX1JFR19SWElRS19QSV9BXzExTgkJCTB4RTNDCisjZGVmaW5lCURNX1JFR19UWElRS18xMU4JCQkJMHhFNDAKKyNkZWZpbmUJRE1fUkVHX1JYSVFLXzExTgkJCQkweEU0NAorI2RlZmluZQlETV9SRUdfSVFLX0FHQ19QVFNfMTFOCQkJMHhFNDgKKyNkZWZpbmUJRE1fUkVHX0lRS19BR0NfUlNQXzExTgkJCTB4RTRDCisjZGVmaW5lCURNX1JFR19CTFVFVE9PVEhfMTFOCQkJMHhFNkMKKyNkZWZpbmUJRE1fUkVHX1JYX1dBSVRfQ0NBXzExTgkJCTB4RTcwCisjZGVmaW5lCURNX1JFR19UWF9DQ0tfUkZPTl8xMU4JCQkweEU3NAorI2RlZmluZQlETV9SRUdfVFhfQ0NLX0JCT05fMTFOCQkJMHhFNzgKKyNkZWZpbmUJRE1fUkVHX09GRE1fUkZPTl8xMU4JCQkweEU3QworI2RlZmluZQlETV9SRUdfT0ZETV9CQk9OXzExTgkJCTB4RTgwCisjZGVmaW5lIERNX1JFR19UWDJSWF8xMU4JCQkJMHhFODQKKyNkZWZpbmUJRE1fUkVHX1RYMlRYXzExTgkJCQkweEU4OAorI2RlZmluZQlETV9SRUdfUlhfQ0NLXzExTgkJCQkweEU4QworI2RlZmluZQlETV9SRUdfUlhfT0ZETV8xMU4JCQkJMHhFRDAKKyNkZWZpbmUJRE1fUkVHX1JYX1dBSVRfUklGU18xMU4JCTB4RUQ0CisjZGVmaW5lCURNX1JFR19SWDJSWF8xMU4JCQkJMHhFRDgKKyNkZWZpbmUJRE1fUkVHX1NUQU5EQllfMTFOCQkJCTB4RURDCisjZGVmaW5lCURNX1JFR19TTEVFUF8xMU4JCQkJMHhFRTAKKyNkZWZpbmUJRE1fUkVHX1BNUERfQU5BRU5fMTFOCQkJMHhFRUMKKworCisvKk1BQyBSRUcgTElTVCovCisjZGVmaW5lCURNX1JFR19CQl9SU1RfMTFOCQkJCTB4MDIKKyNkZWZpbmUJRE1fUkVHX0FOVFNFTF9QSU5fMTFOCQkJMHg0QworI2RlZmluZQlETV9SRUdfRUFSTFlfTU9ERV8xMU4JCQkweDREMAorI2RlZmluZQlETV9SRUdfUlNTSV9NT05JVE9SXzExTgkJMHg0RkUKKyNkZWZpbmUJRE1fUkVHX0VEQ0FfVk9fMTFOCQkJCTB4NTAwCisjZGVmaW5lCURNX1JFR19FRENBX1ZJXzExTgkJCQkweDUwNAorI2RlZmluZQlETV9SRUdfRURDQV9CRV8xMU4JCQkJMHg1MDgKKyNkZWZpbmUJRE1fUkVHX0VEQ0FfQktfMTFOCQkJCTB4NTBDCisjZGVmaW5lCURNX1JFR19UWFBBVVNFXzExTgkJCQkweDUyMgorI2RlZmluZQlETV9SRUdfUkVTUF9UWF8xMU4JCQkJMHg2RDgKKyNkZWZpbmUJRE1fUkVHX0FOVF9UUkFJTl9QQVJBMV8xMU4JMHg3YjAKKyNkZWZpbmUJRE1fUkVHX0FOVF9UUkFJTl9QQVJBMl8xMU4JMHg3YjQKKworCisvKkRJRyBSZWxhdGVkKi8KKyNkZWZpbmUJRE1fQklUX0lHSV8xMU4JCQkJCTB4MDAwMDAwN0YKKyNkZWZpbmUJRE1fQklUX0lHSV8xMUFDCQkJCQkweEZGRkZGRkZGCisKKworCisjZGVmaW5lIEhBTF9ETV9ESUdfRElTQUJMRQkJCUJJVCgwKQorI2RlZmluZSBIQUxfRE1fSElQV1JfRElTQUJMRQkJQklUKDEpCisKKyNkZWZpbmUgT0ZETV9UQUJMRV9MRU5HVEggCQkJNDMKKyNkZWZpbmUgQ0NLX1RBQkxFX0xFTkdUSCAJCQkzMworCisjZGVmaW5lIE9GRE1fVEFCTEVfU0laRSAJCQkzNworI2RlZmluZSBDQ0tfVEFCTEVfU0laRQkJCQkzMworCisjZGVmaW5lIEJXX0FVVE9fU1dJVENIX0hJR0hfTE9XCQkyNQorI2RlZmluZSBCV19BVVRPX1NXSVRDSF9MT1dfSElHSAkJMzAKKworI2RlZmluZSBETV9ESUdfVEhSRVNIX0hJR0gJCQk0MAorI2RlZmluZSBETV9ESUdfVEhSRVNIX0xPVwkJCTM1CisKKyNkZWZpbmUgRE1fRkFMU0VBTEFSTV9USFJFU0hfTE9XCTQwMAorI2RlZmluZSBETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdICTEwMDAKKworI2RlZmluZSBETV9ESUdfTUFYCQkJCQkweDNlCisjZGVmaW5lIERNX0RJR19NSU4JCQkJCTB4MWUKKworI2RlZmluZSBETV9ESUdfTUFYX0FQCQkJCTB4MzIKKyNkZWZpbmUgRE1fRElHX01JTl9BUAkJCQkweDIwCisKKyNkZWZpbmUgRE1fRElHX0ZBX1VQUEVSCQkJCTB4M2UKKyNkZWZpbmUgRE1fRElHX0ZBX0xPV0VSCQkJCTB4MWUKKyNkZWZpbmUgRE1fRElHX0ZBX1RIMAkJCQkweDIwMAorI2RlZmluZSBETV9ESUdfRkFfVEgxCQkJCTB4MzAwCisjZGVmaW5lIERNX0RJR19GQV9USDIJCQkJMHg0MDAKKworI2RlZmluZSBETV9ESUdfQkFDS09GRl9NQVgJCQkxMgorI2RlZmluZSBETV9ESUdfQkFDS09GRl9NSU4JCQktNAorI2RlZmluZSBETV9ESUdfQkFDS09GRl9ERUZBVUxUCQkxMAorCisjZGVmaW5lIFJYUEFUSFNFTEVDVElPTl9TU19USF9sT1cJMzAKKyNkZWZpbmUgUlhQQVRIU0VMRUNUSU9OX0RJRkZfVEgJCTE4CisKKyNkZWZpbmUgRE1fUkFUUl9TVEFfSU5JVAkJCTAKKyNkZWZpbmUgRE1fUkFUUl9TVEFfSElHSAkJCTEKKyNkZWZpbmUgRE1fUkFUUl9TVEFfTUlERExFCQkJMgorI2RlZmluZSBETV9SQVRSX1NUQV9MT1cJCQkJMworCisjZGVmaW5lIENUUzJTRUxGX1RIVkFMCQkJCTMwCisjZGVmaW5lIFJFR0MzOF9USAkJCQkJMjAKKworI2RlZmluZSBXQUlPVFRIVmFsCQkJCQkyNQorCisjZGVmaW5lIFRYSElHSFBXUkxFVkVMX05PUk1BTAkJMAorI2RlZmluZSBUWEhJR0hQV1JMRVZFTF9MRVZFTDEJCTEKKyNkZWZpbmUgVFhISUdIUFdSTEVWRUxfTEVWRUwyCQkyCisjZGVmaW5lIFRYSElHSFBXUkxFVkVMX0JUMQkJCTMKKyNkZWZpbmUgVFhISUdIUFdSTEVWRUxfQlQyCQkJNAorCisjZGVmaW5lIERNX1RZUEVfQllGVwkJCQkwCisjZGVmaW5lIERNX1RZUEVfQllEUklWRVIJCQkxCisKKyNkZWZpbmUgVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTFZMMgk3NAorI2RlZmluZSBUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwxCTY3CisjZGVmaW5lIFRYUFdSVFJBQ0tfTUFYX0lEWCA2CisKKy8qIER5bmFtaWMgQVRDIHN3aXRjaCAqLworI2RlZmluZSBBVENfU1RBVFVTX09GRgkJCQkweDAJCQkvKiBlbmFibGUgKi8KKyNkZWZpbmUJQVRDX1NUQVRVU19PTgkJCQkweDEJCQkvKiBkaXNhYmxlICovCisjZGVmaW5lCUNGT19USFJFU0hPTERfWFRBTAkJCTEwCQkJLyoga0h6ICovCisjZGVmaW5lCUNGT19USFJFU0hPTERfQVRDCQkJODAJCQkvKiBrSHogKi8KKworI2RlZmluZSBBVkdfVEhFUk1BTF9OVU1fODgxMkEJNAorI2RlZmluZSBUWFBXUl9UUkFDS19UQUJMRV9TSVpFIAkzMAorI2RlZmluZSBNQVhfUEFUSF9OVU1fODgxMkEJCTIKKyNkZWZpbmUgTUFYX1BBVEhfTlVNXzg4MjFBCQkxCisKKworc3RydWN0IHBzX3QgeworCXU4IHByZV9jY2FzdGF0ZTsKKwl1OCBjdXJfY2Nhc2F0ZTsKKwl1OCBwcmVfcmZzdGF0ZTsKKwl1OCBjdXJfcmZzdGF0ZTsKKwl1OCBpbml0aWFsaXplOworCWxvbmcgcnNzaV92YWxfbWluOworCit9OworCitzdHJ1Y3QgZGlnX3QgeworCXU4IGRpZ19lbmFibGVfZmxhZzsKKwl1OCBkaWdfZXh0X3BvcnRfc3RhZ2U7CisJdTMyIHJzc2lfbG93dGhyZXNoOworCXUzMiByc3NpX2hpZ2h0aHJlc2g7CisKKwl1MzIgZmFfbG93dGhyZXNoOworCXUzMiBmYV9oaWdodGhyZXNoOworCisJdTggY3Vyc3RhX2Nvbm5lY3RjdGF0ZTsKKwl1OCBwcmVzdGFfY29ubmVjdHN0YXRlOworCXU4IGN1cm11bHRpc3RhX2Nvbm5lY3RzdGF0ZTsKKworCXU4IHByZV9pZ3ZhbHVlOworCXU4IGN1cl9pZ3ZhbHVlOworCXU4IGJ0MzBfY3VyX2lnaTsKKwl1OCBiYWNrdXBfaWd2YWx1ZTsKKwl1OCBzdG9wX2RpZzsKKworCWNoYXIgYmFja29mZl92YWw7CisJY2hhciBiYWNrb2ZmX3ZhbF9yYW5nZV9tYXg7CisJY2hhciBiYWNrb2ZmX3ZhbF9yYW5nZV9taW47CisJdTggcnhfZ2Fpbl9yYW5nZV9tYXg7CisJdTggcnhfZ2Fpbl9yYW5nZV9taW47CisJdTggcnNzaV92YWxfbWluOworCisJdTggcHJlX2Nja19jY2FfdGhyZXM7CisJdTggY3VyX2Nja19jY2FfdGhyZXM7CisJdTggcHJlX2Nja19wZF9zdGF0ZTsKKwl1OCBjdXJfY2NrX3BkX3N0YXRlOworCisJdTggbGFyZ2VfZmFfaGl0OworCXU4IGZvcmJpZGRlbl9pZ2k7CisJdTMyIHJlY292ZXJfY250OworCisJdTggZGlnX2R5bmFtaWNfbWluXzA7CisJdTggZGlnX2R5bmFtaWNfbWluXzE7CisJYm9vbCBiX21lZGlhX2Nvbm5lY3RfMDsKKwlib29sIGJfbWVkaWFfY29ubmVjdF8xOworCisJdTMyIGFudGRpdl9yc3NpX21heDsKKwl1MzIgcnNzaV9tYXg7Cit9OworCisKK2VudW0gRkFUX1NUQVRFIHsKKwlGQVRfTk9STUFMX1NUQVRFCT0gMCwKKwlGQVRfVFJBSU5JTkdfU1RBVEUgPSAxLAorfTsKKworZW51bSB0YWdfZHluYW1pY19pbml0X2dhaW5fb3BlcmF0aW9uX3R5cGVfZGVmaW5pdGlvbiB7CisJRElHX1RZUEVfVEhSRVNIX0hJR0ggPSAwLAorCURJR19UWVBFX1RIUkVTSF9MT1cgPSAxLAorCURJR19UWVBFX0JBQ0tPRkYgPSAyLAorCURJR19UWVBFX1JYX0dBSU5fTUlOID0gMywKKwlESUdfVFlQRV9SWF9HQUlOX01BWCA9IDQsCisJRElHX1RZUEVfRU5BQkxFID0gNSwKKwlESUdfVFlQRV9ESVNBQkxFID0gNiwKKwlESUdfT1BfVFlQRV9NQVgKK307CisKK2VudW0gdGFnX2Nja19wYWNrZXRfZGV0ZWN0aW9uX3RocmVzaG9sZF90eXBlX2RlZmluaXRpb24geworCUNDS19QRF9TVEFHRV9Mb3dSc3NpID0gMCwKKwlDQ0tfUERfU1RBR0VfSGlnaFJzc2kgPSAxLAorCUNDS19GQV9TVEFHRV9Mb3cgPSAyLAorCUNDS19GQV9TVEFHRV9IaWdoID0gMywKKwlDQ0tfUERfU1RBR0VfTUFYID0gNCwKK307CisKK2VudW0gZG1fMXJfY2NhX2UgeworCUNDQV8xUiA9IDAsCisJQ0NBXzJSID0gMSwKKwlDQ0FfTUFYID0gMiwKK307CisKK2VudW0gZG1fcmZfZSB7CisJUkZfU0FWRSA9IDAsCisJUkZfTk9STUFMID0gMSwKKwlSRl9NQVggPSAyLAorfTsKKworZW51bSBkbV9zd19hbnRfc3dpdGNoX2UgeworCUFOU19BTlRFTk5BX0IgPSAxLAorCUFOU19BTlRFTk5BX0EgPSAyLAorCUFOU19BTlRFTk5BX01BWCA9IDMsCit9OworCitlbnVtIGRtX2RpZ19leHRfcG9ydF9hbGdfZSB7CisJRElHX0VYVF9QT1JUX1NUQUdFXzAgPSAwLAorCURJR19FWFRfUE9SVF9TVEFHRV8xID0gMSwKKwlESUdfRVhUX1BPUlRfU1RBR0VfMiA9IDIsCisJRElHX0VYVF9QT1JUX1NUQUdFXzMgPSAzLAorCURJR19FWFRfUE9SVF9TVEFHRV9NQVggPSA0LAorfTsKKworZW51bSBkbV9kaWdfY29ubmVjdF9lIHsKKwlESUdfU1RBX0RJU0NPTk5FQ1QgPSAwLAorCURJR19TVEFfQ09OTkVDVCA9IDEsCisJRElHX1NUQV9CRUZPUkVfQ09OTkVDVCA9IDIsCisJRElHX01VTFRJU1RBX0RJU0NPTk5FQ1QgPSAzLAorCURJR19NVUxUSVNUQV9DT05ORUNUID0gNCwKKwlESUdfQ09OTkVDVF9NQVgKK307CisKK2VudW0gcHdyX3RyYWNrX2NvbnRyb2xfbWV0aG9kIHsKKwlCQlNXSU5HLAorCVRYQUdDLAorCU1JWF9NT0RFCit9OworCisjZGVmaW5lIEJUX1JTU0lfU1RBVEVfTk9STUFMX1BPV0VSICAgICAgQklUX09GRlNFVF9MRU5fTUFTS18zMigwLCAxKQorI2RlZmluZSBCVF9SU1NJX1NUQVRFX0FNRFBVX09GRiAgICAgICAgIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoMSwgMSkKKyNkZWZpbmUgQlRfUlNTSV9TVEFURV9TUEVDSUFMX0xPVyAgICAgICBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDIsIDEpCisjZGVmaW5lIEJUX1JTU0lfU1RBVEVfQkdfRURDQV9MT1cgICAgICAgQklUX09GRlNFVF9MRU5fTUFTS18zMigzLCAxKQorI2RlZmluZSBCVF9SU1NJX1NUQVRFX1RYUE9XRVJfTE9XICAgICAgIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoNCwgMSkKKyNkZWZpbmUgR0VUX1VOREVDT1JBVEVEX0FWRVJBR0VfUlNTSShfcHJpdikgICAgIFwKKyAgICAgICAgKCgoc3RydWN0IHJ0bF9wcml2ICopKF9wcml2KSktPm1hYzgwMjExLm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyk/ICBcCisgICAgICAgICgoKHN0cnVjdCBydGxfcHJpdiAqKShfcHJpdikpLT5kbS5lbnRyeV9taW5fdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiKTogIFwKKyAgICAgICAgKCgoc3RydWN0IHJ0bF9wcml2ICopKF9wcml2KSktPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpCisKK2V4dGVybiBzdHJ1Y3QgZGlnX3QgZG1fZGlndGFibGU7Cit2b2lkIHJ0bDg4MjFhZV9kbV9zZXRfdHhfYW50X2J5X3R4X2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkgICB1OCAqcGRlc2MsIHUzMiBtYWNfaWQpOwordm9pZCBydGw4ODIxYWVfZG1fYW50X3NlbF9zdGF0aXN0aWNzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCQkgIHU4IGFudHNlbF90cl9tdXgsIHUzMiBtYWNfaWQsCisJCQkJCQkJCQkJCSAgdTMyIHJ4X3B3ZGJfYWxsKTsKK3ZvaWQgcnRsODgyMWFlX2RtX2Zhc3RfYW50ZW5uYV90cmFpbm5pbmdfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgcnRsODgyMWFlX2RtX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fd2F0Y2hkb2coc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fd3JpdGVfZGlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjdXJyZW50X2lnaSk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZ190aGVybWFsbWV0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1faW5pdF9yYXRlX2FkYXB0aXZlX21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fdHhwb3dlcl90cmFja19hZGp1c3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkgICB1OCB0eXBlLHU4ICpwZGlyZWN0aW9uLAorCQkJCQkJCQkJCQkJICAgdTMyICpwb3V0d3JpdGVfdmFsKTsKK3ZvaWQgcnRsODgyMWFlX2RtX2NsZWFyX3R4cG93ZXJfdHJhY2tpbmdfc3RhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fd3JpdGVfY2NrX2NjYV90aHJlcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY3VycmVudF9jY2EpOwordm9pZCBydGw4ODIxYWVfZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nX3RoZXJtYWxtZXRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MTJhZV9kbV9wYXRoX2RpdmVyc2l0eShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MTJhZV9kbV9wYXRoX2RpdmVyc2l0eV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgxMmFlX2RtX3BhdGhfc3RhdGlzdGljcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgcnNzaV9hLCB1MzIgcnNzaV9iKTsKK3ZvaWQgcnRsODEyYWVfZG1fc2V0X3R4cGF0aF9ieV90eGluZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggKnBkZXNjKTsKK3ZvaWQgcnRsODgxMmFlX2RtX3R4cHdyX3RyYWNrX3NldF9wd3Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQllbnVtIHB3cl90cmFja19jb250cm9sX21ldGhvZCBtZXRob2QsCisJCQkJCQkJCQkJCQl1OCByZl9wYXRoLAorCQkJCQkJCQkJCQkJdTggY2hhbm5lbF9tYXBwZWRfaW5kZXgpOwordm9pZCBydGw4ODIxYWVfZG1fdHhwd3JfdHJhY2tfc2V0X3B3cihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwllbnVtIHB3cl90cmFja19jb250cm9sX21ldGhvZCBtZXRob2QsIHU4IHJmX3BhdGgsIHU4IGNoYW5uZWxfbWFwcGVkX2luZGV4KTsKKwordm9pZCBydGw4ODEyYWVfZG1fdXBkYXRlX2luaXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggcmF0ZSk7Cit1OCBydGw4ODEyYWVfaHdfcmF0ZV90b19tcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggcmF0ZSk7Cit2b2lkIHJ0bDg4MTJhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2Z3LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODNjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jCkBAIC0wLDAgKzEsMTM0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAiLi4vcGNpLmgiCisjaW5jbHVkZSAiLi4vYmFzZS5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlZi5oIgorI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAiZG0uaCIKKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9lbmFibGVfZndfZG93bmxvYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB0bXA7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCAweDA1KTsKKworCQl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMICsgMik7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMICsgMiwgdG1wICYgMHhmNyk7CisKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCk7CisJCS8vcHJpbnRrKCIweDgwPSUwMnguXG4iLHRtcCk7CisJfSBlbHNlIHsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCB0bXAgJiAweGZlKTsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCk7CisJCS8vcHJpbnRrKCIweDgwPSUwMnguXG4iLHRtcCk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZndfYmxvY2tfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgY29uc3QgdTggKmJ1ZmZlciwgdTMyIHNpemUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBibG9ja1NpemUgPSBzaXplb2YodTMyKTsKKwl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgKnB1NEJ5dGVQdHIgPSAodTMyICopIGJ1ZmZlcjsKKwl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCisJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CisJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgaSsrKSB7CisJCW9mZnNldCA9IGkgKiBibG9ja1NpemU7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAoRldfODgyMUFFX1NUQVJUX0FERFJFU1MgKyBvZmZzZXQpLAorCQkJCSoocHU0Qnl0ZVB0ciArIGkpKTsKKwl9CisKKwlpZiAocmVtYWluU2l6ZSkgeworCQlvZmZzZXQgPSBibG9ja0NvdW50ICogYmxvY2tTaXplOworCQlidWZmZXJQdHIgKz0gb2Zmc2V0OworCQlmb3IgKGkgPSAwOyBpIDwgcmVtYWluU2l6ZTsgaSsrKSB7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoRldfODgyMUFFX1NUQVJUX0FERFJFU1MgKworCQkJCQkJIG9mZnNldCArIGkpLCAqKGJ1ZmZlclB0ciArIGkpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9md19wYWdlX3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgdTMyIHBhZ2UsIGNvbnN0IHU4ICpidWZmZXIsIHUzMiBzaXplKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB2YWx1ZTg7CisJdTggdThwYWdlID0gKHU4KSAocGFnZSAmIDB4MDcpOworCisJdmFsdWU4ID0gKHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01DVUZXREwgKyAyKSAmIDB4RjgpIHwgdThwYWdlOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKFJFR19NQ1VGV0RMICsgMiksIHZhbHVlOCk7CisJX3J0bDg4MjFhZV9md19ibG9ja193cml0ZShodywgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9maWxsX2R1bW15KHU4ICpwZndidWYsIHUzMiAqcGZ3bGVuKQoreworCXUzMiBmd2xlbiA9ICpwZndsZW47CisJdTggcmVtYWluID0gKHU4KSAoZndsZW4gJSA0KTsKKworCXJlbWFpbiA9IChyZW1haW4gPT0gMCkgPyAwIDogKDQgLSByZW1haW4pOworCisJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJcGZ3YnVmW2Z3bGVuXSA9IDA7CisJCWZ3bGVuKys7CisJCXJlbWFpbi0tOworCX0KKworCSpwZndsZW4gPSBmd2xlbjsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV93cml0ZV9mdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgCQkJCQkgIGVudW0gdmVyc2lvbl84ODIxYWUgdmVyc2lvbiwKKwkJCSAgICAgCQkJCQkgIHU4ICpidWZmZXIsIHUzMiBzaXplKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgcGFnZU51bXMsIHJlbWFpblNpemU7CisJdTMyIHBhZ2UsIG9mZnNldDsKKworCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCAoIkZXIHNpemUgaXMgJWQgYnl0ZXMsXG4iLCBzaXplKSk7CisKKwlfcnRsODgyMWFlX2ZpbGxfZHVtbXkoYnVmZmVyUHRyLCAmc2l6ZSk7CisKKwlwYWdlTnVtcyA9IHNpemUgLyBGV184ODIxQUVfUEFHRV9TSVpFOworCXJlbWFpblNpemUgPSBzaXplICUgRldfODgyMUFFX1BBR0VfU0laRTsKKworCWlmIChwYWdlTnVtcyA+IDgpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlBhZ2UgbnVtYmVycyBzaG91bGQgbm90IGdyZWF0ZXIgdGhlbiA4XG4iKSk7CisJfQorCisJZm9yIChwYWdlID0gMDsgcGFnZSA8IHBhZ2VOdW1zOyBwYWdlKyspIHsKKwkJb2Zmc2V0ID0gcGFnZSAqIEZXXzg4MjFBRV9QQUdFX1NJWkU7CisJCV9ydGw4ODIxYWVfZndfcGFnZV93cml0ZShodywgcGFnZSwgKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJICAgICAgRldfODgyMUFFX1BBR0VfU0laRSk7CisJfQorCisJaWYgKHJlbWFpblNpemUpIHsKKwkJb2Zmc2V0ID0gcGFnZU51bXMgKiBGV184ODIxQUVfUEFHRV9TSVpFOworCQlwYWdlID0gcGFnZU51bXM7CisJCV9ydGw4ODIxYWVfZndfcGFnZV93cml0ZShodywgcGFnZSwgKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJICAgICAgcmVtYWluU2l6ZSk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgX3J0bDg4MjFhZV9md19mcmVlX3RvX2dvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgZXJyID0gLUVJTzsKKwl1MzIgY291bnRlciA9IDA7CisJdTMyIHZhbHVlMzI7CisKKwlkbyB7CisJCXZhbHVlMzIgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfTUNVRldETCk7CisJfSB3aGlsZSAoKGNvdW50ZXIrKyA8IEZXXzg4MjFBRV9QT0xMSU5HX1RJTUVPVVRfQ09VTlQpICYmCisJCSAoISh2YWx1ZTMyICYgRldETF9DSEtTVU1fUlBUKSkpOworCisJaWYgKGNvdW50ZXIgPj0gRldfODgyMUFFX1BPTExJTkdfVElNRU9VVF9DT1VOVCkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0xPVUQsCisJCQkgKCJjaGtzdW0gcmVwb3J0IGZhaWxsICEgUkVHX01DVUZXREw6MHglMDh4IC5cbiIsCisJCQkgIHZhbHVlMzIpKTsKKwkJZ290byBleGl0OworCX0KKworCVJUX1RSQUNFKENPTVBfRlcsIERCR19FTUVSRywKKwkJICgiQ2hlY2tzdW0gcmVwb3J0IE9LICEgUkVHX01DVUZXREw6MHglMDh4IC5cbiIsIHZhbHVlMzIpKTsKKworCXZhbHVlMzIgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfTUNVRldETCk7CisJdmFsdWUzMiB8PSBNQ1VGV0RMX1JEWTsKKwl2YWx1ZTMyICY9IH5XSU5USU5JX1JEWTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX01DVUZXREwsIHZhbHVlMzIpOworCisJcnRsODgyMWFlX2Zpcm13YXJlX3NlbGZyZXNldChodyk7CisKKwljb3VudGVyID0gMDsKKwlkbyB7CisJCXZhbHVlMzIgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfTUNVRldETCk7CisJCWlmICh2YWx1ZTMyICYgV0lOVElOSV9SRFkpIHsKKwkJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELAorCQkJCSAoIlBvbGxpbmcgRlcgcmVhZHkgc3VjY2VzcyEhIFJFR19NQ1VGV0RMOjB4JTA4eCAuXG4iLAorCQkJCSAgdmFsdWUzMikpOworCQkJZXJyID0gMDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXVkZWxheShGV184ODIxQUVfUE9MTElOR19ERUxBWSk7CisKKwl9IHdoaWxlIChjb3VudGVyKysgPCBGV184ODIxQUVfUE9MTElOR19USU1FT1VUX0NPVU5UKTsKKworCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCSAoIlBvbGxpbmcgRlcgcmVhZHkgZmFpbCEhIFJFR19NQ1VGV0RMOjB4JTA4eCAuXG4iLCB2YWx1ZTMyKSk7CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IHJ0bDg4MjFhZV9kb3dubG9hZF9mdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwlib29sIGJ1c2Vfd2FrZV9vbl93bGFuX2Z3CisJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGw4ODIxYV9maXJtd2FyZV9oZWFkZXIgKnBmd2hlYWRlcjsKKwl1OCAqcGZ3ZGF0YTsKKwl1MzIgZndzaXplOworCWludCBlcnI7CisJZW51bSB2ZXJzaW9uXzg4MjFhZSB2ZXJzaW9uID0gcnRsaGFsLT52ZXJzaW9uOworCisJaWYoIXJ0bGhhbC0+cGZpcm13YXJlKQorCQlyZXR1cm4gMTsKKworCXBmd2hlYWRlciA9IChzdHJ1Y3QgcnRsODgyMWFfZmlybXdhcmVfaGVhZGVyICopcnRsaGFsLT5wZmlybXdhcmU7CisJcGZ3ZGF0YSA9ICh1OCAqKSBydGxoYWwtPnBmaXJtd2FyZTsKKwlmd3NpemUgPSBydGxoYWwtPmZ3c2l6ZTsKKwlSVF9UUkFDRShDT01QX0ZXLCBEQkdfRE1FU0csCisJCSAoIm5vcm1hbCBGaXJtd2FyZSBTSVpFICVkIFxuIixmd3NpemUpKTsKKworCWlmIChJU19GV19IRUFERVJfRVhJU1RfODgxMihwZndoZWFkZXIpIHx8IElTX0ZXX0hFQURFUl9FWElTVF84ODIxKHBmd2hlYWRlcikpIHsKKwkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0RNRVNHLAorCQkJICgiRmlybXdhcmUgVmVyc2lvbiglZCksIFNpZ25hdHVyZSglI3gpLFNpemUoJWQpXG4iLAorCQkJICBwZndoZWFkZXItPnZlcnNpb24sIHBmd2hlYWRlci0+c2lnbmF0dXJlLAorCQkJICAoaW50KXNpemVvZihzdHJ1Y3QgcnRsODgyMWFfZmlybXdhcmVfaGVhZGVyKSkpOworCisJCXBmd2RhdGEgPSBwZndkYXRhICsgc2l6ZW9mKHN0cnVjdCBydGw4ODIxYV9maXJtd2FyZV9oZWFkZXIpOworCQlmd3NpemUgPSBmd3NpemUgLSBzaXplb2Yoc3RydWN0IHJ0bDg4MjFhX2Zpcm13YXJlX2hlYWRlcik7CisJfQorCisJaWYocnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCkgJiBCSVQoNykpeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCwgMHgwMCk7CisJCXJ0bDg4MjFhZV9maXJtd2FyZV9zZWxmcmVzZXQoaHcpOworCX0KKwlfcnRsODgyMWFlX2VuYWJsZV9md19kb3dubG9hZChodywgdHJ1ZSk7CisJX3J0bDg4MjFhZV93cml0ZV9mdyhodywgdmVyc2lvbiwgcGZ3ZGF0YSwgZndzaXplKTsKKwlfcnRsODgyMWFlX2VuYWJsZV9md19kb3dubG9hZChodywgZmFsc2UpOworCisJZXJyID0gX3J0bDg4MjFhZV9md19mcmVlX3RvX2dvKGh3KTsKKwlpZiAoZXJyKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJGaXJtd2FyZSBpcyBub3QgcmVhZHkgdG8gcnVuIVxuIikpOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELAorCQkJICgiRmlybXdhcmUgaXMgcmVhZHkgdG8gcnVuIVxuIikpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGJveG51bSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdmFsX2htZXRmcjsKKwlib29sIHJlc3VsdCA9IGZhbHNlOworCisJdmFsX2htZXRmciA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0hNRVRGUik7CisJaWYgKCgodmFsX2htZXRmciA+PiBib3hudW0pICYgQklUKDApKSA9PSAwKQorCQlyZXN1bHQgPSB0cnVlOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZmlsbF9oMmNfY29tbWFuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHU4IGVsZW1lbnRfaWQsIHUzMiBjbWRfbGVuLCB1OCAqcF9jbWRidWZmZXIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggYm94bnVtID0wOworCXUxNiBib3hfcmVnID0gMCwgYm94X2V4dHJlZyA9IDA7CisJdTggdTFiX3RtcCA9IDA7CisJYm9vbCBpc2Z3X3JlYWQgPSBmYWxzZTsKKwl1OCBidWZfaW5kZXggPSAwOworCWJvb2wgYndyaXRlX3N1Y2VzcyA9IGZhbHNlOworCXU4IHdhaXRfaDJjX2xpbW1pdCA9IDEwMDsKKwkvKnU4IHdhaXRfd3JpdGVoMmNfbGltbWl0ID0gMTAwOyovCisJdTggYm94Y29udGVudFs0XSwgYm94ZXh0Y29udGVudFs0XTsKKwl1MzIgaDJjX3dhaXRjb3VudGVyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWcgPTA7CisJdTggaWR4ID0wOworCisJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELCAoImNvbWUgaW5cbiIpKTsKKworCXdoaWxlICh0cnVlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5oMmNfbG9jaywgZmxhZyk7CisJCWlmIChydGxoYWwtPmJfaDJjX3NldGlucHJvZ3Jlc3MpIHsKKwkJCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJCQkgKCJIMkMgc2V0IGluIHByb2dyZXNzISBXYWl0IHRvIHNldC4uIgorCQkJCSAgImVsZW1lbnRfaWQoJWQpLlxuIiwgZWxlbWVudF9pZCkpOworCisJCQl3aGlsZSAocnRsaGFsLT5iX2gyY19zZXRpbnByb2dyZXNzKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaDJjX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZyk7CisJCQkJaDJjX3dhaXRjb3VudGVyKys7CisJCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAorCQkJCQkgKCJXYWl0IDEwMCB1cyAoJWQgdGltZXMpLi4uXG4iLAorCQkJCQkgIGgyY193YWl0Y291bnRlcikpOworCQkJCXVkZWxheSgxMDApOworCisJCQkJaWYgKGgyY193YWl0Y291bnRlciA+IDEwMDApCisJCQkJCXJldHVybjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuaDJjX2xvY2ssCisJCQkJCQkgIGZsYWcpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaDJjX2xvY2ssIGZsYWcpOworCQl9IGVsc2UgeworCQkJcnRsaGFsLT5iX2gyY19zZXRpbnByb2dyZXNzID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLCBmbGFnKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJd2hpbGUgKCFid3JpdGVfc3VjZXNzKSB7CisJLypjb3NhIHJlbW92ZSB0aGlzIGJlY2F1c2UgbmV2ZXIgcmVhY2ggdGhpcy4qLworI2lmIDAKKwkJd2FpdF93cml0ZWgyY19saW1taXQtLTsKKwkJaWYgKHdhaXRfd3JpdGVoMmNfbGltbWl0ID09IDApIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgiV3JpdGUgSDJDIGZhaWwgYmVjYXVzZSBubyB0cmlnZ2VyICIKKwkJCQkgICJmb3IgRlcgSU5UIVxuIikpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCWJveG51bSA9IHJ0bGhhbC0+bGFzdF9obWVib3hudW07CisJCXN3aXRjaCAoYm94bnVtKSB7CisJCWNhc2UgMDoKKwkJCWJveF9yZWcgPSBSRUdfSE1FQk9YXzA7CisJCQlib3hfZXh0cmVnID0gUkVHX0hNRUJPWF9FWFRfMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlib3hfcmVnID0gUkVHX0hNRUJPWF8xOworCQkJYm94X2V4dHJlZyA9IFJFR19ITUVCT1hfRVhUXzE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYm94X3JlZyA9IFJFR19ITUVCT1hfMjsKKwkJCWJveF9leHRyZWcgPSBSRUdfSE1FQk9YX0VYVF8yOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWJveF9yZWcgPSBSRUdfSE1FQk9YXzM7CisJCQlib3hfZXh0cmVnID0gUkVHX0hNRUJPWF9FWFRfMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyBcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaXNmd19yZWFkID0gZmFsc2U7CisJCXUxYl90bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DUik7CisKKwkJaWYgKHUxYl90bXAgIT0gMHhFQSkKKwkJCWlzZndfcmVhZCA9IHRydWU7CisJCWVsc2UgeworCQkJaWYoIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RYRE1BX1NUQVRVUykgPT0gMHhFQSB8fAorCQkJCXJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RYUEtUX0VNUFRZKSA9PSAweEVBKQorCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfQ0ZHMSArIDMsIDB4RkYpOworCQl9CisKKwkJaWYgKGlzZndfcmVhZCA9PSB0cnVlKSB7CisJCQl3YWl0X2gyY19saW1taXQgPSAxMDA7CisJCQlpc2Z3X3JlYWQgPSBfcnRsODgyMWFlX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CisJCQl3aGlsZSAoIWlzZndfcmVhZCkgeworCQkJCS8qd2FpdCB1bnRpbCBGdyByZWFkKi8KKwkJCQl3YWl0X2gyY19saW1taXQtLTsKKwkJCQlpZiAod2FpdF9oMmNfbGltbWl0ID09IDApIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAorCQkJCQkJICgiV2F0aW5nIHRvbyBsb25nIGZvciBGVyByZWFkICIKKwkJCQkJCSAgImNsZWFyIEhNRUJveCglZCkhXG4iLCBib3hudW0pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJdWRlbGF5KDEwKTsKKworCQkJCWlzZndfcmVhZCA9IF9ydGw4ODIxYWVfY2hlY2tfZndfcmVhZF9sYXN0X2gyYyhodywgYm94bnVtKTsKKwkJCQl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDEzMCk7CisJCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAorCQkJCQkgKCJXYXRpbmcgZm9yIEZXIHJlYWQgY2xlYXIgSE1FQm94KCVkKSEhISAiCisJCQkJCSAgIjB4MTMwID0gJTJ4XG4iLCBib3hudW0sIHUxYl90bXApKTsKKwkJCX0KKwkJfQorCisJCWlmICghaXNmd19yZWFkKSB7CisJCQlSVF9UUkFDRShDT01QX0NNRCwgREJHX0xPVUQsCisJCQkJICgiV3JpdGUgSDJDIHJlZ2lzdGVyIEJPWFslZF0gZmFpbCEhISEhICIKKwkJCQkgICJGdyBkbyBub3QgcmVhZC4gXG4iLCBib3hudW0pKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWVtc2V0KGJveGNvbnRlbnQsIDAsIHNpemVvZihib3hjb250ZW50KSk7CisJCW1lbXNldChib3hleHRjb250ZW50LCAwLCBzaXplb2YoYm94ZXh0Y29udGVudCkpOworCQlib3hjb250ZW50WzBdID0gZWxlbWVudF9pZDsKKwkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAorCQkJICgiV3JpdGUgZWxlbWVudF9pZCBib3hfcmVnKCU0eCkgPSAlMnggXG4iLAorCQkJICBib3hfcmVnLCBlbGVtZW50X2lkKSk7CisKKwkJc3dpdGNoIChjbWRfbGVuKSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQkvKmJveGNvbnRlbnRbMF0gJj0gfihCSVQoNykpOyovCisJCQltZW1jcHkoKHU4ICopIChib3hjb250ZW50KSArIDEsCisJCQkgICAgICAgcF9jbWRidWZmZXIgKyBidWZfaW5kZXgsIGNtZF9sZW4pOworCisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKSB7CisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgYm94X3JlZyArIGlkeCwKKwkJCQkJICAgICAgIGJveGNvbnRlbnRbaWR4XSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJLypib3hjb250ZW50WzBdIHw9IChCSVQoNykpOyovCisJCQltZW1jcHkoKHU4ICopIChib3hleHRjb250ZW50KSwKKwkJCSAgICAgICBwX2NtZGJ1ZmZlciArIGJ1Zl9pbmRleCszLCBjbWRfbGVuLTMpOworCQkJbWVtY3B5KCh1OCAqKSAoYm94Y29udGVudCkgKyAxLAorCQkJICAgICAgIHBfY21kYnVmZmVyICsgYnVmX2luZGV4LCAzKTsKKworCQkJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykgeworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGJveF9leHRyZWcgKyBpZHgsCisJCQkJCSAgICAgICBib3hleHRjb250ZW50W2lkeF0pOworCQkJfQorCisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKSB7CisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgYm94X3JlZyArIGlkeCwKKwkJCQkJICAgICAgIGJveGNvbnRlbnRbaWR4XSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCWJ3cml0ZV9zdWNlc3MgPSB0cnVlOworCisJCXJ0bGhhbC0+bGFzdF9obWVib3hudW0gPSBib3hudW0gKyAxOworCQlpZiAocnRsaGFsLT5sYXN0X2htZWJveG51bSA9PSA0KQorCQkJcnRsaGFsLT5sYXN0X2htZWJveG51bSA9IDA7CisKKwkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAorCQkJICgicEhhbERhdGEtPmxhc3RfaG1lYm94bnVtICA9ICVkXG4iLAorCQkJICBydGxoYWwtPmxhc3RfaG1lYm94bnVtKSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLCBmbGFnKTsKKwlydGxoYWwtPmJfaDJjX3NldGlucHJvZ3Jlc3MgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5oMmNfbG9jaywgZmxhZyk7CisKKwlSVF9UUkFDRShDT01QX0NNRCwgREJHX0xPVUQsICgiZ28gb3V0XG4iKSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSB1OCBlbGVtZW50X2lkLCB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKQoreworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTMyIHRtcF9jbWRidWZbMl07CisKKwlpZiAocnRsaGFsLT5iZndfcmVhZHkgPT0gZmFsc2UpIHsKKwkJUlRfQVNTRVJUKGZhbHNlLCAoInJldHVybiBIMkMgY21kIGJlY2F1c2Ugb2YgRncgIgorCQkJCSAgImRvd25sb2FkIGZhaWwhISFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCh0bXBfY21kYnVmLCAwLCA4KTsKKwltZW1jcHkodG1wX2NtZGJ1ZiwgcF9jbWRidWZmZXIsIGNtZF9sZW4pOworCV9ydGw4ODIxYWVfZmlsbF9oMmNfY29tbWFuZChodywgZWxlbWVudF9pZCwgY21kX2xlbiwgKHU4ICopICYgdG1wX2NtZGJ1Zik7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgcnRsODgyMWFlX2Zpcm13YXJlX3NlbGZyZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1OCB1MWJfdG1wOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCisJaWYocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCXsKKwkJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1JTVl9DVFJMKzEpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwrMSwgKHUxYl90bXAgJiAofkJJVCgzKSkpKTsKKwl9ZWxzZSB7CisJCXUxYl90bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19SU1ZfQ1RSTCsxKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JTVl9DVFJMKzEsICh1MWJfdG1wICYgKH5CSVQoMCkpKSk7CisJfQorCisJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOKzEpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTisxLCAodTFiX3RtcCAmICh+QklUKDIpKSkpOworCXVkZWxheSg1MCk7CisKKwlpZihydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJeworCQl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwrMSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SU1ZfQ1RSTCsxLCAodTFiX3RtcCB8IEJJVCgzKSkpOworCX1lbHNlIHsKKwkJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1JTVl9DVFJMKzEpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwrMSwgKHUxYl90bXAgfCBCSVQoMCkpKTsKKwl9CisKKwl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4rMSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOKzEsICh1MWJfdG1wIHwgQklUKDIpKSk7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIiAgXzgwNTFSZXNldDg4MTJhZSgpOiA4MDUxIHJlc2V0IHN1Y2Nlc3MgLlxuIikpOworCit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9md19wd3Jtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbW9kZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdTFfaDJjX3NldF9wd3Jtb2RlW0gyQ184ODIxQUVfUFdFTU9ERV9MRU5HVEhdID0geyAwIH07CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJdTggcmxibSxwb3dlcl9zdGF0ZSA9IDA7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiRlcgTFBTIG1vZGUgPSAlZFxuIiwgbW9kZSkpOworCisJU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fTU9ERSh1MV9oMmNfc2V0X3B3cm1vZGUsICgobW9kZSkgPyAxIDogMCkpOworCXJsYm0gPSAwOy8qWUosdGVtcCwxMjAzMTYuIEZXIG5vdyBub3Qgc3VwcG9ydCBSTEJNPTIuKi8KKwlTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9STEJNKHUxX2gyY19zZXRfcHdybW9kZSwgcmxibSk7CisJU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fU01BUlRfUFModTFfaDJjX3NldF9wd3Jtb2RlLCAocnRscHJpdi0+bWFjODAyMTEucDJwKSA/IHBwc2MtPnNtYXJ0X3BzIDogMSk7CisJU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fQVdBS0VfSU5URVJWQUwodTFfaDJjX3NldF9wd3Jtb2RlLCBwcHNjLT5yZWdfbWF4X2xwc19hd2FrZWludHZsKTsKKwlTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9BTExfUVVFVUVfVUFQU0QodTFfaDJjX3NldF9wd3Jtb2RlLCAwKTsKKwlpZihtb2RlID09IEZXX1BTX0FDVElWRV9NT0RFKQorCXsKKwkJcG93ZXJfc3RhdGUgfD0gRldfUFdSX1NUQVRFX0FDVElWRTsKKwl9CisJZWxzZQorCXsKKwkJcG93ZXJfc3RhdGUgfD0gRldfUFdSX1NUQVRFX1JGX09GRjsKKwl9CisJU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fUFdSX1NUQVRFKHUxX2gyY19zZXRfcHdybW9kZSwgcG93ZXJfc3RhdGUpOworCisJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkgICAgICAicnRsOTJjX3NldF9md19wd3Jtb2RlKCk6IHUxX2gyY19zZXRfcHdybW9kZSBcbiIsCisJCSAgICAgIHUxX2gyY19zZXRfcHdybW9kZSwgSDJDXzg4MjFBRV9QV0VNT0RFX0xFTkdUSCk7CisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgSDJDXzg4MjFBRV9TRVRQV1JNT0RFLCBIMkNfODgyMUFFX1BXRU1PREVfTEVOR1RILCB1MV9oMmNfc2V0X3B3cm1vZGUpOworCit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9md19qb2luYnNzX3JlcG9ydF9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG1zdGF0dXMpCit7CisJdTggdTFfam9pbmJzc3JwdF9wYXJtWzFdID0geyAwIH07CisKKwlTRVRfSDJDQ01EX0pPSU5CU1NSUFRfUEFSTV9PUE1PREUodTFfam9pbmJzc3JwdF9wYXJtLCBtc3RhdHVzKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIEgyQ184ODIxQUVfSk9JTkJTU1JQVCwgMSwgdTFfam9pbmJzc3JwdF9wYXJtKTsKK30KKwordm9pZCBydGw4ODIxYWVfc2V0X2Z3X2FwX29mZl9sb2FkX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgIHU4IGFwX29mZmxvYWRfZW5hYmxlKQoreworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdTggdTFfYXBvZmZsb2FkX3Bhcm1bSDJDXzg4MjFBRV9BUF9PRkZMT0FEX0xFTkdUSF0gPSB7IDAgfTsKKworCVNFVF9IMkNDTURfQVBfT0ZGTE9BRF9PTih1MV9hcG9mZmxvYWRfcGFybSwgYXBfb2ZmbG9hZF9lbmFibGUpOworCVNFVF9IMkNDTURfQVBfT0ZGTE9BRF9ISURERU4odTFfYXBvZmZsb2FkX3Bhcm0sIG1hYy0+YmhpZGRlbnNzaWQpOworCVNFVF9IMkNDTURfQVBfT0ZGTE9BRF9ERU5ZQU5ZKHUxX2Fwb2ZmbG9hZF9wYXJtLCAwKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIEgyQ184ODIxQUVfQVBfT0ZGTE9BRCwgSDJDXzg4MjFBRV9BUF9PRkZMT0FEX0xFTkdUSCwgdTFfYXBvZmZsb2FkX3Bhcm0pOworCit9CisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfY21kX3NlbmRfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZzsKKwlzdHJ1Y3QgcnRsX3R4X2Rlc2MgKnBkZXNjOworCXU4IG93bjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpwc2tiID0gTlVMTDsKKworCXJpbmcgPSAmcnRscGNpLT50eF9yaW5nW0JFQUNPTl9RVUVVRV07CisKKwlwc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOworCWlmIChwc2tiKQorCQlrZnJlZV9za2IocHNrYik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKKworCXBkZXNjID0gJnJpbmctPmRlc2NbMF07CisJb3duID0gKHU4KSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLCB0cnVlLCBIV19ERVNDX09XTik7CisKKwlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9jbWRkZXNjKGh3LCAodTggKikgcGRlc2MsIDEsIDEsIHNrYik7CisKKwlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgc2tiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CisKKwlydGxwcml2LT5jZmctPm9wcy0+dHhfcG9sbGluZyhodywgQkVBQ09OX1FVRVVFKTsKKworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJFQUNPTl9QRwkJMCAvKiAtPjEgKi8KKyNkZWZpbmUgUFNQT0xMX1BHCQkyCisjZGVmaW5lIE5VTExfUEcJCQkzCisjZGVmaW5lIFBST0JFUlNQX1BHCQk0IC8qIC0+NSAqLworCisjZGVmaW5lIEJFQUNPTl9QR184ODEyCQkwCisjZGVmaW5lIFBTUE9MTF9QR184ODEyCQkxCisjZGVmaW5lIE5VTExfUEdfODgxMgkJCTIKKyNkZWZpbmUgUFJPQkVSU1BfUEdfODgxMgkJMworCisjZGVmaW5lIEJFQUNPTl9QR184ODIxCQkwCisjZGVmaW5lIFBTUE9MTF9QR184ODIxCQkxCisjZGVmaW5lIE5VTExfUEdfODgyMQkJCTIKKyNkZWZpbmUgUFJPQkVSU1BfUEdfODgyMQkJMworCisjZGVmaW5lIFRPVEFMX1JFU0VSVkVEX1BLVF9MRU5fODgxMgkyMDQ4CisjZGVmaW5lIFRPVEFMX1JFU0VSVkVEX1BLVF9MRU5fODgyMQkxMDI0CisKKworc3RhdGljIHU4IHJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MjFbVE9UQUxfUkVTRVJWRURfUEtUX0xFTl84ODIxXSA9IHsKKwkvKiBwYWdlIDAgKi8KKwkweDgwLCAweDAwLCAweDAwLCAweDAwLCAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkweGZmLCAweGZmLCAweDAwLCAweGUwLCAgMHg0YywgMHgwMiwgMHhlMiwgMHg2NCwKKwkweDQwLCAweDE2LCAweDlmLCAweDIzLCAgMHhkNCwgMHg0NiwgMHgyMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDY0LCAweDAwLCAweDIwLCAweDA0LCAgMHgwMCwgMHgwNiwgMHg2NCwgMHg2YywKKwkweDY5LCAweDZlLCAweDZiLCAweDMxLCAgMHgwMSwgMHgwOCwgMHg4MiwgMHg4NCwKKwkweDhiLCAweDk2LCAweDBjLCAweDE4LCAgMHgzMCwgMHg0OCwgMHgwMywgMHgwMSwKKwkweDBiLCAweDA2LCAweDAyLCAweDAwLCAgMHgwMCwgMHgyYSwgMHgwMSwgMHg4YiwKKwkweDMyLCAweDA0LCAweDEyLCAweDI0LCAgMHg2MCwgMHg2YywgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDEwLCAweDAwLCAweDI4LCAweDhjLCAgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBwYWdlIDEgKi8KKwkweGE0LCAweDEwLCAweDAxLCAweGMwLCAgMHg0MCwgMHgxNiwgMHg5ZiwgMHgyMywKKwkweGQ0LCAweDQ2LCAweDAwLCAweGUwLCAgMHg0YywgMHgwMiwgMHhlMiwgMHg2NCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDE4LCAweDAwLCAweDI4LCAweDhjLCAgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDgwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBwYWdlIDIgKi8KKwkweDQ4LCAweDAxLCAweDAwLCAweDAwLCAgMHg0MCwgMHgxNiwgMHg5ZiwgMHgyMywKKwkweGQ0LCAweDQ2LCAweDAwLCAweGUwLCAgMHg0YywgMHgwMiwgMHhlMiwgMHg2NCwKKwkweDQwLCAweDE2LCAweDlmLCAweDIzLCAgMHhkNCwgMHg0NiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDFhLCAweDAwLCAweDI4LCAweDhjLCAgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDgwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBwYWdlIDMgKi8KKwkweGM4LCAweDAxLCAweDAwLCAweDAwLCAgMHg0MCwgMHgxNiwgMHg5ZiwgMHgyMywKKwkweGQ0LCAweDQ2LCAweDAwLCAweGUwLCAgMHg0YywgMHgwMiwgMHhlMiwgMHg2NCwKKwkweDQwLCAweDE2LCAweDlmLCAweDIzLCAgMHhkNCwgMHg0NiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKKworc3RhdGljIHU4IHJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MTJbVE9UQUxfUkVTRVJWRURfUEtUX0xFTl84ODEyXSA9IHsKKyAJMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHhFMCwgIDB4NEMsIDB4MDIsIDB4NTMsIDB4RTUsCisJMHhFMCwgMHg0NiwgMHg5QSwgMHg1NywgIDB4NzEsIDB4MzAsIDB4MjAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHg2NCwgMHgwMCwgMHgzMCwgMHgwNCwgIDB4MDAsIDB4MEMsIDB4NEUsIDB4NDUsCisJMHg1NCwgMHg0NywgMHg0NSwgMHg0MSwgIDB4NTIsIDB4NUYsIDB4MzEsIDB4MzUsCisJMHgzMCwgMHg0RSwgMHgwMSwgMHgwOCwgIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsCisJMHgwQywgMHgxMiwgMHgxOCwgMHgyNCwgIDB4MDMsIDB4MDEsIDB4MDMsIDB4MDYsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgyQSwgIDB4MDEsIDB4OEEsIDB4MzIsIDB4MDQsCisJMHgzMCwgMHg0OCwgMHg2MCwgMHg2QywgIDB4REQsIDB4MTgsIDB4MDAsIDB4NTAsCisJMHhGMiwgMHgwMSwgMHgwMSwgMHgwMCwgIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHg1MCwgIDB4RjIsIDB4MDIsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHgyOCwgMHg4QywgIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsCisJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKwkweEE0LCAweDEwLCAweDAyLCAweEMwLCAgMHhFMCwgMHg0NiwgMHg5QSwgMHg1NywKKwkweDcxLCAweDMwLCAweDAwLCAweEUwLCAgMHg0QywgMHgwMiwgMHg1MywgMHhFNSwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDE4LCAweDAwLCAweDI4LCAweDhDLCAgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKwkweDA0LCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDgwLCAweDAwLCAweDAwLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworCTB4NDgsIDB4MDEsIDB4MDAsIDB4MDAsICAweEUwLCAweDQ2LCAweDlBLCAweDU3LAorCTB4NzEsIDB4MzAsIDB4MDAsIDB4RTAsICAweDRDLCAweDAyLCAweDUzLCAweEU1LAorCTB4RTAsIDB4NDYsIDB4OUEsIDB4NTcsICAweDcxLCAweDMwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MUEsIDB4MDAsIDB4MjgsIDB4OEMsICAweDAwLCAweDEyLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAxLCAweDAwLCAweDAwLAorCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCisJMHhDOCwgMHgwMSwgMHgwMCwgMHgwMCwgIDB4RTAsIDB4NDYsIDB4OUEsIDB4NTcsCisJMHg3MSwgMHgzMCwgMHgwMCwgMHhFMCwgIDB4NEMsIDB4MDIsIDB4NTMsIDB4RTUsCisJMHhFMCwgMHg0NiwgMHg5QSwgMHg1NywgIDB4NzEsIDB4MzAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCit2b2lkIHJ0bDg4MTJhZV9zZXRfZndfcnN2ZHBhZ2Vwa3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9kbF9maW5pc2hlZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKworCXUzMiB0b3RhbHBhY2tldGxlbjsKKwlib29sIHJ0c3RhdHVzOworCXU4IHUxUnN2ZFBhZ2VMb2NbNV0gPSB7IDAgfTsKKwlib29sIGJfZGxvayA9IGZhbHNlOworCisJdTgqIGJlYWNvbjsKKwl1OCogcF9wc3BvbGw7CisJdTgqIG51bGxmdW5jOworCXU4KiBwX3Byb2JlcnNwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJKDEpIGJlYWNvbgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJYmVhY29uID0gJnJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MTJbQkVBQ09OX1BHXzg4MTIgKiA1MTJdOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzIoYmVhY29uLCBtYWMtPm1hY19hZGRyKTsKKwlTRVRfODAyMTFfSERSX0FERFJFU1MzKGJlYWNvbiwgbWFjLT5ic3NpZCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkoMikgcHMtcG9sbAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwX3BzcG9sbCA9ICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODEyW1BTUE9MTF9QR184ODEyICogNTEyXTsKKwlTRVRfODAyMTFfUFNfUE9MTF9BSUQocF9wc3BvbGwsIChtYWMtPmFzc29jX2lkIHwgMHhjMDAwKSk7CisJU0VUXzgwMjExX1BTX1BPTExfQlNTSUQocF9wc3BvbGwsIG1hYy0+YnNzaWQpOworCVNFVF84MDIxMV9QU19QT0xMX1RBKHBfcHNwb2xsLCBtYWMtPm1hY19hZGRyKTsKKworCVNFVF9IMkNDTURfUlNWRFBBR0VfTE9DX1BTUE9MTCh1MVJzdmRQYWdlTG9jLCBQU1BPTExfUEdfODgxMik7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJKDMpIG51bGwgZGF0YQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbnVsbGZ1bmMgPSAmcmVzZXJ2ZWRfcGFnZV9wYWNrZXRfODgxMltOVUxMX1BHXzg4MTIqIDUxMl07CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMShudWxsZnVuYywgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihudWxsZnVuYywgbWFjLT5tYWNfYWRkcik7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMyhudWxsZnVuYywgbWFjLT5ic3NpZCk7CisKKwlTRVRfSDJDQ01EX1JTVkRQQUdFX0xPQ19OVUxMX0RBVEEodTFSc3ZkUGFnZUxvYywgTlVMTF9QR184ODEyKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJKDQpIHByb2JlIHJlc3BvbnNlCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcF9wcm9iZXJzcCA9ICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODEyW1BST0JFUlNQX1BHXzg4MTIgKiA1MTJdOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzEocF9wcm9iZXJzcCwgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihwX3Byb2JlcnNwLCBtYWMtPm1hY19hZGRyKTsKKwlTRVRfODAyMTFfSERSX0FERFJFU1MzKHBfcHJvYmVyc3AsIG1hYy0+YnNzaWQpOworCisJU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFJPQkVfUlNQKHUxUnN2ZFBhZ2VMb2MsIFBST0JFUlNQX1BHXzg4MTIpOworCisJdG90YWxwYWNrZXRsZW4gPSBUT1RBTF9SRVNFUlZFRF9QS1RfTEVOXzg4MTI7CisKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJICAgICAgInJ0bDg4MjFhZV9zZXRfZndfcnN2ZHBhZ2Vwa3QoKTogSFdfVkFSX1NFVF9UWF9DTUQ6IEFMTCBcbiIsCisJCSAgICAgICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODEyWzBdLCB0b3RhbHBhY2tldGxlbik7CisJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkgICAgICAicnRsODgyMWFlX3NldF9md19yc3ZkcGFnZXBrdCgpOiBIV19WQVJfU0VUX1RYX0NNRDogQUxMIFxuIiwKKwkJICAgICAgdTFSc3ZkUGFnZUxvYywgMyk7CisKKworCXNrYiA9IGRldl9hbGxvY19za2IodG90YWxwYWNrZXRsZW4pOworCW1lbWNweSgodTggKikgc2tiX3B1dChza2IsIHRvdGFscGFja2V0bGVuKSwKKwkgICAgICAgJnJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MTIsIHRvdGFscGFja2V0bGVuKTsKKworCXJ0c3RhdHVzID0gX3J0bDg4MjFhZV9jbWRfc2VuZF9wYWNrZXQoaHcsIHNrYik7CisKKwlpZiAocnRzdGF0dXMpCisJCWJfZGxvayA9IHRydWU7CisKKwlpZiAoYl9kbG9rKSB7CisJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJICgiU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGdy5cbiIpKTsKKwkJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkJCSJIMkNfUlNWRFBBR0U6XG4iLAorCQkJCXUxUnN2ZFBhZ2VMb2MsIDMpOworCQlydGw4ODIxYWVfZmlsbF9oMmNfY21kKGh3LCBIMkNfODgyMUFFX1JTVkRQQUdFLAorCQkJCSAgICBzaXplb2YodTFSc3ZkUGFnZUxvYyksIHUxUnN2ZFBhZ2VMb2MpOworCX0gZWxzZQorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3IEZBSUwhISEhISEuXG4iKSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9md19yc3ZkcGFnZXBrdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBiX2RsX2ZpbmlzaGVkKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJdTMyIHRvdGFscGFja2V0bGVuOworCWJvb2wgcnRzdGF0dXM7CisJdTggdTFSc3ZkUGFnZUxvY1s1XSA9IHsgMCB9OworCWJvb2wgYl9kbG9rID0gZmFsc2U7CisKKwl1OCogYmVhY29uOworCXU4KiBwX3BzcG9sbDsKKwl1OCogbnVsbGZ1bmM7CisJdTgqIHBfcHJvYmVyc3A7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkoMSkgYmVhY29uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwliZWFjb24gPSAmcmVzZXJ2ZWRfcGFnZV9wYWNrZXRfODgyMVtCRUFDT05fUEdfODgyMSAqIDI1Nl07CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihiZWFjb24sIG1hYy0+bWFjX2FkZHIpOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzMoYmVhY29uLCBtYWMtPmJzc2lkKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCSgyKSBwcy1wb2xsCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBfcHNwb2xsID0gJnJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MjFbUFNQT0xMX1BHXzg4MjEgKiAyNTZdOworCVNFVF84MDIxMV9QU19QT0xMX0FJRChwX3BzcG9sbCwgKG1hYy0+YXNzb2NfaWQgfCAweGMwMDApKTsKKwlTRVRfODAyMTFfUFNfUE9MTF9CU1NJRChwX3BzcG9sbCwgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX1BTX1BPTExfVEEocF9wc3BvbGwsIG1hYy0+bWFjX2FkZHIpOworCisJU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFNQT0xMKHUxUnN2ZFBhZ2VMb2MsIFBTUE9MTF9QR184ODIxKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkoMykgbnVsbCBkYXRhCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwludWxsZnVuYyA9ICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODIxW05VTExfUEdfODgyMSAqIDI1Nl07CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMShudWxsZnVuYywgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihudWxsZnVuYywgbWFjLT5tYWNfYWRkcik7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMyhudWxsZnVuYywgbWFjLT5ic3NpZCk7CisKKwlTRVRfSDJDQ01EX1JTVkRQQUdFX0xPQ19OVUxMX0RBVEEodTFSc3ZkUGFnZUxvYywgTlVMTF9QR184ODIxKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJKDQpIHByb2JlIHJlc3BvbnNlCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcF9wcm9iZXJzcCA9ICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODIxW1BST0JFUlNQX1BHXzg4MjEgKiAyNTZdOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzEocF9wcm9iZXJzcCwgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihwX3Byb2JlcnNwLCBtYWMtPm1hY19hZGRyKTsKKwlTRVRfODAyMTFfSERSX0FERFJFU1MzKHBfcHJvYmVyc3AsIG1hYy0+YnNzaWQpOworCisJU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFJPQkVfUlNQKHUxUnN2ZFBhZ2VMb2MsIFBST0JFUlNQX1BHXzg4MjEpOworCisJdG90YWxwYWNrZXRsZW4gPSBUT1RBTF9SRVNFUlZFRF9QS1RfTEVOXzg4MjE7CisKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJICAgICAgInJ0bDg4MjFhZV9zZXRfZndfcnN2ZHBhZ2Vwa3QoKTogSFdfVkFSX1NFVF9UWF9DTUQ6IEFMTCBcbiIsCisJCSAgICAgICZyZXNlcnZlZF9wYWdlX3BhY2tldF84ODIxWzBdLCB0b3RhbHBhY2tldGxlbik7CisJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkgICAgICAicnRsODgyMWFlX3NldF9md19yc3ZkcGFnZXBrdCgpOiBIV19WQVJfU0VUX1RYX0NNRDogQUxMIFxuIiwKKwkJICAgICAgdTFSc3ZkUGFnZUxvYywgMyk7CisKKworCXNrYiA9IGRldl9hbGxvY19za2IodG90YWxwYWNrZXRsZW4pOworCW1lbWNweSgodTggKikgc2tiX3B1dChza2IsIHRvdGFscGFja2V0bGVuKSwKKwkgICAgICAgJnJlc2VydmVkX3BhZ2VfcGFja2V0Xzg4MjEsIHRvdGFscGFja2V0bGVuKTsKKworCXJ0c3RhdHVzID0gX3J0bDg4MjFhZV9jbWRfc2VuZF9wYWNrZXQoaHcsIHNrYik7CisKKwlpZiAocnRzdGF0dXMpCisJCWJfZGxvayA9IHRydWU7CisKKwlpZiAoYl9kbG9rKSB7CisJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJICgiU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGdy5cbiIpKTsKKwkJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkJCSJIMkNfUlNWRFBBR0U6XG4iLAorCQkJCXUxUnN2ZFBhZ2VMb2MsIDMpOworCQlydGw4ODIxYWVfZmlsbF9oMmNfY21kKGh3LCBIMkNfODgyMUFFX1JTVkRQQUdFLAorCQkJCSAgICBzaXplb2YodTFSc3ZkUGFnZUxvYyksIHUxUnN2ZFBhZ2VMb2MpOworCX0gZWxzZQorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3IEZBSUwhISEhISEuXG4iKSk7Cit9CisKKy8qU2hvdWQgY2hlY2sgRlcgc3VwcG9ydCBwMnAgb3Igbm90LiovCit2b2lkIHJ0bDg4MjFhZV9zZXRfcDJwX2N0d19wZXJpb2RfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjdHdpbmRvdykKK3sKKwl1OCB1MV9jdHdpbmRvd19wZXJpb2RbMV0gPXsgY3R3aW5kb3d9OworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgSDJDXzg4MjFBRV9QMlBfUFNfQ1RXX0NNRCwgMSwgdTFfY3R3aW5kb3dfcGVyaW9kKTsKKworfQorCit2b2lkIHJ0bDg4MjFhZV9zZXRfcDJwX3BzX29mZmxvYWRfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBwMnBfcHNfc3RhdGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpydGxwcyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcDJwX3BzX2luZm8gKnAycGluZm8gPSAmKHJ0bHBzLT5wMnBfcHNfaW5mbyk7CisJc3RydWN0IHAycF9wc19vZmZsb2FkX3QgKnAycF9wc19vZmZsb2FkID0gJnJ0bGhhbC0+cDJwX3BzX29mZmxvYWQ7CisJdTgJaTsKKwl1MTYJY3R3aW5kb3c7CisJdTMyCXN0YXJ0X3RpbWUsIHRzZl9sb3c7CisKKwlzd2l0Y2gocDJwX3BzX3N0YXRlKQorCXsKKwkJY2FzZSBQMlBfUFNfRElTQUJMRToKKwkJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCgiUDJQX1BTX0RJU0FCTEUgXG4iKSk7CisJCQltZW1zZXQocDJwX3BzX29mZmxvYWQsIDAsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgUDJQX1BTX0VOQUJMRToKKwkJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCgiUDJQX1BTX0VOQUJMRSBcbiIpKTsKKwkJCS8qIHVwZGF0ZSBDVFdpbmRvdyB2YWx1ZS4gKi8KKwkJCWlmKCBwMnBpbmZvLT5jdHdpbmRvdyA+IDAgKQorCQkJeworCQkJCXAycF9wc19vZmZsb2FkLT5DVFdpbmRvd19FbiA9IDE7CisJCQkJY3R3aW5kb3cgPSBwMnBpbmZvLT5jdHdpbmRvdzsKKwkJCQlydGw4ODIxYWVfc2V0X3AycF9jdHdfcGVyaW9kX2NtZChodywgY3R3aW5kb3cpOworCQkJfQorCisJCQkvKiBodyBvbmx5IHN1cHBvcnQgMiBzZXQgb2YgTm9BICovCisJCQlmb3IoIGk9MCA7IGk8cDJwaW5mby0+bm9hX251bSA7IGkrKykKKwkJCXsKKwkJCQkvKiBUbyBjb250cm9sIHRoZSByZWdpc3RlciBzZXR0aW5nIGZvciB3aGljaCBOT0EqLworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NWNmLCAoaSA8PCA0KSk7CisJCQkJaWYoaSA9PSAwKQorCQkJCQlwMnBfcHNfb2ZmbG9hZC0+Tm9BMF9FbiA9IDE7CisJCQkJZWxzZQorCQkJCQlwMnBfcHNfb2ZmbG9hZC0+Tm9BMV9FbiA9IDE7CisKKwkJCQkvKiBjb25maWcgUDJQIE5vQSBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4NUUwLCBwMnBpbmZvLT5ub2FfZHVyYXRpb25baV0pOworCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDVFNCwgcDJwaW5mby0+bm9hX2ludGVydmFsW2ldKTsKKworCQkJCS8qR2V0IEN1cnJlbnQgFFRTRiB2YWx1ZSAqLworCQkJCXRzZl9sb3cgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfVFNGVFIpOworCisJCQkJc3RhcnRfdGltZSA9IHAycGluZm8tPm5vYV9zdGFydF90aW1lW2ldOworCQkJCWlmKHAycGluZm8tPm5vYV9jb3VudF90eXBlW2ldICE9IDEpCisJCQkJeworCQkJCQl3aGlsZSggc3RhcnRfdGltZSA8PSAodHNmX2xvdysoNTAqMTAyNCkgKSApIHsKKwkJCQkJCXN0YXJ0X3RpbWUgKz0gcDJwaW5mby0+bm9hX2ludGVydmFsW2ldOworCQkJCQkJaWYocDJwaW5mby0+bm9hX2NvdW50X3R5cGVbaV0gIT0gMjU1KQorCQkJCQkJCXAycGluZm8tPm5vYV9jb3VudF90eXBlW2ldLS07CisJCQkJCX0KKwkJCQl9CisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4NUU4LCBzdGFydF90aW1lKTsKKwkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg1RUMsIHAycGluZm8tPm5vYV9jb3VudF90eXBlW2ldICk7CisKKwkJCX0KKworCQkJaWYoIChwMnBpbmZvLT5vcHBfcHMgPT0gMSkgfHwgKHAycGluZm8tPm5vYV9udW0gPiAwKSApCisJCQl7CisJCQkJLyogcnN0IHAycCBjaXJjdWl0ICovCisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0RVQUxfVFNGX1JTVCwgQklUKDQpKTsKKworCQkJCXAycF9wc19vZmZsb2FkLT5PZmZsb2FkX0VuID0gMTsKKworCQkJCWlmKFAyUF9ST0xFX0dPID09IHJ0bHByaXYtPm1hYzgwMjExLnAycCkKKwkJCQl7CisJCQkJCXAycF9wc19vZmZsb2FkLT5yb2xlPSAxOworCQkJCQlwMnBfcHNfb2ZmbG9hZC0+QWxsU3RhU2xlZXAgPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwMnBfcHNfb2ZmbG9hZC0+cm9sZT0gMDsKKwkJCQl9CisKKwkJCQlwMnBfcHNfb2ZmbG9hZC0+ZGlzY292ZXJ5ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFAyUF9QU19TQ0FOOgorCQkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsKCJQMlBfUFNfU0NBTiBcbiIpKTsKKwkJCXAycF9wc19vZmZsb2FkLT5kaXNjb3ZlcnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgUDJQX1BTX1NDQU5fRE9ORToKKwkJCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELCgiUDJQX1BTX1NDQU5fRE9ORSBcbiIpKTsKKwkJCXAycF9wc19vZmZsb2FkLT5kaXNjb3ZlcnkgPSAwOworCQkJcDJwaW5mby0+cDJwX3BzX3N0YXRlID0gUDJQX1BTX0VOQUJMRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgSDJDXzg4MjFBRV9QMlBfUFNfT0ZGTE9BRCwgMSwgKHU4ICopcDJwX3BzX29mZmxvYWQpOworCit9CisKK3ZvaWQgcnRsODgxMmFlX2MyaF9yYV9yZXBvcnRfaGFuZGxlcigKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCAqY21kX2J1ZiwKKwl1OCBjbWRfbGVuCispCit7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCByYXRlID0gY21kX2J1ZlswXSAmIDB4M0Y7CisKKwlydGxoYWwtPmN1cnJlbnRfcmFfcmF0ZT0gcnRsODgxMmFlX2h3X3JhdGVfdG9fbXJhdGUoaHcsIHJhdGUpOworCisJcnRsODgxMmFlX2RtX3VwZGF0ZV9pbml0X3JhdGUoaHcsIHJhdGUpOworfQorCisKK3ZvaWQgX3J0bDg4MTJhZV9jMmhfY29udGVudF9wYXJzaW5nKAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4IGMyaF9jbWRfaWQsCisJdTggYzJoX2NtZF9sZW4sCisJdTggKnRtcF9idWYKKykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlzd2l0Y2ggKGMyaF9jbWRfaWQpIHsKKwljYXNlIEMySF84ODEyX0RCRzoKKwkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX0xPVUQsKCJbQzJIXSwgQzJIXzg4MTJfREJHISFcbiIpKTsKKwkJYnJlYWs7CisKKwljYXNlIEMySF84ODEyX1JBX1JQVDoKKwkJcnRsODgxMmFlX2MyaF9yYV9yZXBvcnRfaGFuZGxlcihodywgdG1wX2J1ZiwgYzJoX2NtZF9sZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworfQorCit2b2lkIHJ0bDg4MTJhZV9jMmhfcGFja2V0X2hhbmRsZXIoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggKmJ1ZmZlciwKKwl1OCBsZW5ndGgKKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGMyaF9jbWRfaWQ9MCwgYzJoX2NtZF9zZXE9MCwgYzJoX2NtZF9sZW49MDsKKwl1OCAqdG1wX2J1Zj1OVUxMOworCisJYzJoX2NtZF9pZCA9IGJ1ZmZlclswXTsKKwljMmhfY21kX3NlcSA9IGJ1ZmZlclsxXTsKKwljMmhfY21kX2xlbiA9IGxlbmd0aCAtMjsKKwl0bXBfYnVmID0gYnVmZmVyICsgMjsKKworCVJUX1RSQUNFKENPTVBfRlcsIERCR19MT1VELAorCQkoIltDMkggcGFja2V0XSwgYzJoQ21kSWQ9MHgleCwgYzJoQ21kU2VxPTB4JXgsIGMyaENtZExlbj0lZFxuIiwKKwkJYzJoX2NtZF9pZCwgYzJoX2NtZF9zZXEsIGMyaF9jbWRfbGVuKSk7CisKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfRlcsIERCR19MT1VELAorCQkiW0MySCBwYWNrZXRdLCBDb250ZW50IEhleDpcbiIsIHRtcF9idWYsIGMyaF9jbWRfbGVuKTsKKwlfcnRsODgxMmFlX2MyaF9jb250ZW50X3BhcnNpbmcoaHcsIGMyaF9jbWRfaWQsIGMyaF9jbWRfbGVuLCB0bXBfYnVmKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGVlYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuaApAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9fRldfX0hfXworI2RlZmluZSBfX1JUTDg4MjFBRV9fRldfX0hfXworCisjZGVmaW5lIEZXXzg4MjFBRV9TSVpFCQkJCQkweDgwMDAKKyNkZWZpbmUgRldfODgyMUFFX1NUQVJUX0FERFJFU1MJCQkweDEwMDAKKyNkZWZpbmUgRldfODgyMUFFX0VORF9BRERSRVNTCQkJMHg1RkZGCisjZGVmaW5lIEZXXzg4MjFBRV9QQUdFX1NJWkUJCQkJNDA5NgorI2RlZmluZSBGV184ODIxQUVfUE9MTElOR19ERUxBWQkJCTUKKyNkZWZpbmUgRldfODgyMUFFX1BPTExJTkdfVElNRU9VVF9DT1VOVAk2MDAwCisKKyNkZWZpbmUgSVNfRldfSEVBREVSX0VYSVNUXzg4MTIoX3Bmd2hkcikJXAorCSgoX3Bmd2hkci0+c2lnbmF0dXJlJjB4RkZGMCkgPT0gMHg5NTAwICkKKworI2RlZmluZSBJU19GV19IRUFERVJfRVhJU1RfODgyMShfcGZ3aGRyKQlcCisJKChfcGZ3aGRyLT5zaWduYXR1cmUmMHhGRkYwKSA9PSAweDIxMDAgKQorCisjZGVmaW5lIFVTRV9PTERfV09XTEFOX0RFQlVHX0ZXIDAKKworI2RlZmluZSBIMkNfODgyMUFFX1JTVkRQQUdFX0xPQ19MRU4JCTUKKyNkZWZpbmUgSDJDXzg4MjFBRV9QV0VNT0RFX0xFTkdUSAkJCTUKKyNkZWZpbmUgSDJDXzg4MjFBRV9KT0lOQlNTUlBUX0xFTkdUSAkJMQorI2RlZmluZSBIMkNfODgyMUFFX0FQX09GRkxPQURfTEVOR1RICQkzCisjZGVmaW5lIEgyQ184ODIxQUVfV09XTEFOX0xFTkdUSAkJCTMKKyNkZWZpbmUgSDJDXzg4MjFBRV9LRUVQX0FMSVZFX0NUUkxfTEVOR1RICTMKKyNpZihVU0VfT0xEX1dPV0xBTl9ERUJVR19GVyA9PSAwKQorI2RlZmluZSBIMkNfODgyMUFFX1JFTU9URV9XQUtFX0NUUkxfTEVOCTEKKyNlbHNlCisjZGVmaW5lIEgyQ184ODIxQUVfUkVNT1RFX1dBS0VfQ1RSTF9MRU4JMworI2VuZGlmCisjZGVmaW5lIEgyQ184ODIxQUVfQU9BQ19HTE9CQUxfSU5GT19MRU4JMgorI2RlZmluZSBIMkNfODgyMUFFX0FPQUNfUlNWRFBBR0VfTE9DX0xFTgk3CisKKworLyogRncgUFMgc3RhdGUgZm9yIFJQV00uCisqQklUWzI6MF0gPSBIVyBzdGF0ZQorKkJJVFszXSA9IFByb3RvY29sIFBTIHN0YXRlLCAgIDE6IHJlZ2lzdGVyIGFjdGl2ZSBzdGF0ZSAsIDA6IHJlZ2lzdGVyIHNsZWVwIHN0YXRlCisqQklUWzRdID0gc3ViLXN0YXRlCisqLworI2RlZmluZQlGV19QU19HT19PTgkJCUJJVCgwKQorI2RlZmluZQlGV19QU19UWF9OVUxMCQkJQklUKDEpCisjZGVmaW5lCUZXX1BTX1JGX09OCQkJQklUKDIpCisjZGVmaW5lCUZXX1BTX1JFR0lTVEVSX0FDVElWRQlCSVQoMykKKworI2RlZmluZQlGV19QU19EUFMgICAgCQlCSVQoMCkKKyNkZWZpbmUJRldfUFNfTENMSyAgIAkJKEZXX1BTX0RQUykKKyNkZWZpbmUJRldfUFNfUkZfT0ZGICAgCQlCSVQoMSkKKyNkZWZpbmUJRldfUFNfQUxMX09OICAgCQlCSVQoMikKKyNkZWZpbmUJRldfUFNfU1RfQUNUSVZFICAJQklUKDMpCisjZGVmaW5lCUZXX1BTX0lTUl9FTkFCTEUgICAgCUJJVCg0KQorI2RlZmluZQlGV19QU19JTVJfRU5BQkxFCUJJVCg1KQorCisKKyNkZWZpbmUJRldfUFNfQUNLICAgIAkJQklUKDYpCisjZGVmaW5lCUZXX1BTX1RPR0dMRSAgIAkJQklUKDcpCisKKyAvKiA4ODIxQUUgUlBXTSB2YWx1ZSovCisgLyogQklUWzBdID0gMTogMzJrLCAwOiA0ME0qLworI2RlZmluZQlGV19QU19DTE9DS19PRkYJCUJJVCgwKQkJLyogMzJrKi8KKyNkZWZpbmUJRldfUFNfQ0xPQ0tfT04JCTAJCS8qNDBNKi8KKworI2RlZmluZQlGV19QU19TVEFURV9NQVNLICAJCSgweDBGKQorI2RlZmluZQlGV19QU19TVEFURV9IV19NQVNLIAkoMHgwNykKKyNkZWZpbmUJRldfUFNfU1RBVEVfSU5UX01BU0sgCSgweDNGKQkvKklTUl9FTkFCTEUsIElNUl9FTkFCTEUsIGFuZCBQUyBtb2RlIHNob3VsZCBiZSBpbmhlcml0ZWQuKi8KKworI2RlZmluZQlGV19QU19TVEFURSh4KSAgIAkJKEZXX1BTX1NUQVRFX01BU0sgJiAoeCkpCisjZGVmaW5lCUZXX1BTX1NUQVRFX0hXKHgpIAkJKEZXX1BTX1NUQVRFX0hXX01BU0sgJiAoeCkpCisjZGVmaW5lCUZXX1BTX1NUQVRFX0lOVCh4KSAgIAkoRldfUFNfU1RBVEVfSU5UX01BU0sgJiAoeCkpCisjZGVmaW5lCUZXX1BTX0lTUl9WQUwoeCkJCSgoeCkgJiAweDcwKQorI2RlZmluZQlGV19QU19JTVJfTUFTSyh4KSAgIAkoKHgpICYgMHhERikKKyNkZWZpbmUJRldfUFNfS0VFUF9JTVIoeCkJCSgoeCkgJiAweDIwKQorCisKKyNkZWZpbmUJRldfUFNfU1RBVEVfUzAJCShGV19QU19EUFMpCisjZGVmaW5lCUZXX1BTX1NUQVRFX1MxCQkoRldfUFNfTENMSykKKyNkZWZpbmUJRldfUFNfU1RBVEVfUzIJCShGV19QU19SRl9PRkYpCisjZGVmaW5lCUZXX1BTX1NUQVRFX1MzCQkoRldfUFNfQUxMX09OKQorI2RlZmluZQlGV19QU19TVEFURV9TNAkJKChGV19QU19TVF9BQ1RJVkUpIHwgKEZXX1BTX0FMTF9PTikpCisKKyNkZWZpbmUJRldfUFNfU1RBVEVfQUxMX09OXzg4MjFBRQkoRldfUFNfQ0xPQ0tfT04pIC8qICgoRldfUFNfUkZfT04pIHwgKEZXX1BTX1JFR0lTVEVSX0FDVElWRSkpKi8KKyNkZWZpbmUJRldfUFNfU1RBVEVfUkZfT05fODgyMUFFCShGV19QU19DTE9DS19PTikgLyogKEZXX1BTX1JGX09OKSovCisjZGVmaW5lCUZXX1BTX1NUQVRFX1JGX09GRl84ODIxQUUJKEZXX1BTX0NMT0NLX09OKSAvKiAweDAqLworI2RlZmluZQlGV19QU19TVEFURV9SRl9PRkZfTE9XX1BXUl84ODIxQUUJKEZXX1BTX0NMT0NLX09GRikgLyogKEZXX1BTX1NUQVRFX1JGX09GRikqLworCisjZGVmaW5lCUZXX1BTX1NUQVRFX0FMTF9PTl85MkMJKEZXX1BTX1NUQVRFX1M0KQorI2RlZmluZQlGV19QU19TVEFURV9SRl9PTl85MkMJCShGV19QU19TVEFURV9TMykKKyNkZWZpbmUJRldfUFNfU1RBVEVfUkZfT0ZGXzkyQwkoRldfUFNfU1RBVEVfUzIpCisjZGVmaW5lCUZXX1BTX1NUQVRFX1JGX09GRl9MT1dfUFdSXzkyQwkoRldfUFNfU1RBVEVfUzEpCisKKworLyogRm9yIDg4MjFBRSBIMkMgUHdyTW9kZSBDbWQgSUQgNS4qLworI2RlZmluZQlGV19QV1JfU1RBVEVfQUNUSVZFCSgoRldfUFNfUkZfT04pIHwgKEZXX1BTX1JFR0lTVEVSX0FDVElWRSkpCisjZGVmaW5lCUZXX1BXUl9TVEFURV9SRl9PRkYJMAorCisjZGVmaW5lCUZXX1BTX0lTX0FDSyh4KSAgCQkoKHgpICYgRldfUFNfQUNLICkKKyNkZWZpbmUJRldfUFNfSVNfQ0xLX09OKHgpIAkJKCh4KSAmIChGV19QU19SRl9PRkYgfEZXX1BTX0FMTF9PTiApKQorI2RlZmluZQlGV19QU19JU19SRl9PTih4KSAgCQkoKHgpICYgKEZXX1BTX0FMTF9PTikpCisjZGVmaW5lCUZXX1BTX0lTX0FDVElWRSh4KSAgCQkoKHgpICYgKEZXX1BTX1NUX0FDVElWRSkpCisjZGVmaW5lCUZXX1BTX0lTX0NQV01fSU5UKHgpCSgoeCkgJiAweDQwKQorCisjZGVmaW5lCUZXX0NMUl9QU19TVEFURSh4KSAJCSgoeCkgPSAoKHgpICYgKDB4RjApKSkKKworI2RlZmluZQlJU19JTl9MT1dfUE9XRVJfU1RBVEVfODgyMUFFKEZ3UFNTdGF0ZSkJCVwKKwkJCShGV19QU19TVEFURShGd1BTU3RhdGUpID09IEZXX1BTX0NMT0NLX09GRikKKworI2RlZmluZQlGV19QV1JfU1RBVEVfQUNUSVZFCSgoRldfUFNfUkZfT04pIHwgKEZXX1BTX1JFR0lTVEVSX0FDVElWRSkpCisjZGVmaW5lCUZXX1BXUl9TVEFURV9SRl9PRkYJMAorCitzdHJ1Y3QgcnRsODgyMWFfZmlybXdhcmVfaGVhZGVyIHsKKwl1MTYgc2lnbmF0dXJlOworCXU4IGNhdGVnb3J5OworCXU4IGZ1bmN0aW9uOworCXUxNiB2ZXJzaW9uOworCXU4IHN1YnZlcnNpb247CisJdTggcnN2ZDE7CisJdTggbW9udGg7CisJdTggZGF0ZTsKKwl1OCBob3VyOworCXU4IG1pbnV0ZTsKKwl1MTYgcmFtY29kZVNpemU7CisJdTE2IHJzdmQyOworCXUzMiBzdm5pbmRleDsKKwl1MzIgcnN2ZDM7CisJdTMyIHJzdmQ0OworCXUzMiByc3ZkNTsKK307CisKK2VudW0gcnRsODgxMl9jMmhfZXZ0eworCUMySF84ODEyX0RCRyA9IDAsCisJQzJIXzg4MTJfTEIgPSAxLAorCUMySF84ODEyX1RYQkYgPSAyLAorCUMySF84ODEyX1RYX1JFUE9SVCA9IDMsCisJQzJIXzg4MTJfQlRfSU5GTyA9IDksCisJQzJIXzg4MTJfQlRfTVAgPSAxMSwKKwlDMkhfODgxMl9SQV9SUFQ9MTIsCisKKwlDMkhfODgxMl9GV19TV0NITkwgPSAweDEwLAorCUMySF84ODEyX0lRS19GSU5JU0ggPSAweDExLAorCU1BWF84ODEyX0MySEVWRU5UCit9OworCitlbnVtIHJ0bDg4MjFhX2gyY19jbWQgeworCUgyQ184ODIxQUVfUlNWRFBBR0UgPSAwLAorCUgyQ184ODIxQUVfSk9JTkJTU1JQVCA9IDEsCisJSDJDXzg4MjFBRV9TQ0FOID0gMiwKKwlIMkNfODgyMUFFX0tFRVBfQUxJVkVfQ1RSTCA9IDMsCisJSDJDXzg4MjFBRV9ESVNDT05ORUNUX0RFQ0lTSU9OID0gNCwKKyNpZihVU0VfT0xEX1dPV0xBTl9ERUJVR19GVyA9PSAxKQorCUgyQ184ODIxQUVfV09fV0xBTiA9IDUsCisjZW5kaWYKKwlIMkNfODgyMUFFX0lOSVRfT0ZGTE9BRCA9IDYsCisjaWYoVVNFX09MRF9XT1dMQU5fREVCVUdfRlcgPT0gMSkKKwlIMkNfODgyMUFFX1JFTU9URV9XQUtFX0NUUkwgPSA3LAorI2VuZGlmCisJSDJDXzg4MjFBRV9BUF9PRkZMT0FEID0gOCwKKwlIMkNfODgyMUFFX0JDTl9SU1ZEUEFHRSA9IDksCisJSDJDXzg4MjFBRV9QUk9CRVJTUF9SU1ZEUEFHRSA9IDEwLAorCisJSDJDXzg4MjFBRV9TRVRQV1JNT0RFID0gMHgyMCwKKwlIMkNfODgyMUFFX1BTX1RVTklOR19QQVJBID0gMHgyMSwKKwlIMkNfODgyMUFFX1BTX1RVTklOR19QQVJBMiA9IDB4MjIsCisJSDJDXzg4MjFBRV9QU19MUFNfUEFSQSA9IDB4MjMsCisJSDJDXzg4MjFBRV9QMlBfUFNfT0ZGTE9BRCA9IDAyNCwKKworI2lmKFVTRV9PTERfV09XTEFOX0RFQlVHX0ZXID09IDApCisJSDJDXzg4MjFBRV9XT19XTEFOID0gMHg4MCwKKwlIMkNfODgyMUFFX1JFTU9URV9XQUtFX0NUUkwgPSAweDgxLAorCUgyQ184ODIxQUVfQU9BQ19HTE9CQUxfSU5GTyA9IDB4ODIsCisJSDJDXzg4MjFBRV9BT0FDX1JTVkRQQUdFID0gMHg4MywKKyNlbmRpZgorCUgyQ19SU1NJX1JFUE9SVCA9IDB4NDIsCisJSDJDXzg4MjFBRV9SQV9NQVNLID0gMHg0MCwKKwlIMkNfODgyMUFFX1NFTEVDVElWRV9TVVNQRU5EX1JPRl9DTUQsCisJSDJDXzg4MjFBRV9QMlBfUFNfTU9ERSwKKwlIMkNfODgyMUFFX1BTRF9SRVNVTFQsCisJLypOb3QgZGVmaW5lZCBDVFcgQ01EIGZvciBQMlAgeWV0Ki8KKwlIMkNfODgyMUFFX1AyUF9QU19DVFdfQ01ELAorCU1BWF84ODIxQUVfSDJDQ01ECit9OworCisjZGVmaW5lIHBhZ2VudW1fMTI4KF9sZW4pCQkodTMyKSgoKF9sZW4pPj43KSArICgoX2xlbikmMHg3RiA/IDE6MCkpCisKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfV09XTEFOX0ZVTkNfRU5BQkxFKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDAsIDEsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX1dPV0xBTl9QQVRURVJOX01BVENIX0VOQUJMRShfX3BIMkNDbWQsIF9fVmFsdWUpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAxLCAxLCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9XT1dMQU5fTUFHSUNfUEtUX0VOQUJMRShfX3BIMkNDbWQsIF9fVmFsdWUpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAyLCAxLCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9XT1dMQU5fVU5JQ0FTVF9QS1RfRU5BQkxFKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDMsIDEsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX1dPV0xBTl9BTExfUEtUX0RST1AoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgNCwgMSwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfV09XTEFOX0dQSU9fQUNUSVZFKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgNSwgMSwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfV09XTEFOX1JFS0VZX1dBS0VfVVAoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgNiwgMSwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfV09XTEFOX0RJU0NPTk5FQ1RfV0FLRV9VUChfX3BIMkNDbWQsIF9fVmFsdWUpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCA3LCAxLCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9XT1dMQU5fR1BJT05VTShfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcEgyQ0NtZCkrMSwgMCwgOCwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfV09XTEFOX0dQSU9fRFVSQVRJT04oX19wSDJDQ21kLCBfX1ZhbHVlKQkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsyLCAwLCA4LCBfX1ZhbHVlKQorCisKKyNkZWZpbmUgU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fTU9ERShfX3BoMmNjbWQsIF9fdmFsKQkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BoMmNjbWQsIDAsIDgsIF9fdmFsKQorI2RlZmluZSBTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9STEJNKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsxLCAwLCA0LCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9TTUFSVF9QUyhfX3BIMkNDbWQsIF9fVmFsdWUpCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsxLCA0LCA0LCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9BV0FLRV9JTlRFUlZBTChfX3BIMkNDbWQsIF9fVmFsdWUpCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsyLCAwLCA4LCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9BTExfUVVFVUVfVUFQU0QoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzMsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF9IMkNDTURfUFdSTU9ERV9QQVJNX1BXUl9TVEFURShfX3BIMkNDbWQsIF9fVmFsdWUpCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSs0LCAwLCA4LCBfX1ZhbHVlKQorI2RlZmluZSBHRVRfODgyMUFFX0gyQ0NNRF9QV1JNT0RFX1BBUk1fTU9ERShfX3BIMkNDbWQpCQlcCisJTEVfQklUU19UT18xQllURShfX3BIMkNDbWQsIDAsIDgpCisKKyNkZWZpbmUgU0VUX0gyQ0NNRF9KT0lOQlNTUlBUX1BBUk1fT1BNT0RFKF9fcGgyY2NtZCwgX192YWwpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19waDJjY21kLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFJPQkVfUlNQKF9fcGgyY2NtZCwgX192YWwpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19waDJjY21kLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFNQT0xMKF9fcGgyY2NtZCwgX192YWwpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcGgyY2NtZCkrMSwgMCwgOCwgX192YWwpCisjZGVmaW5lIFNFVF9IMkNDTURfUlNWRFBBR0VfTE9DX05VTExfREFUQShfX3BoMmNjbWQsIF9fdmFsKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BoMmNjbWQpKzIsIDAsIDgsIF9fdmFsKQorCisvKiBBUF9PRkZMT0FEICovCisjZGVmaW5lIFNFVF9IMkNDTURfQVBfT0ZGTE9BRF9PTihfX3BIMkNDbWQsIF9fVmFsdWUpCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF9IMkNDTURfQVBfT0ZGTE9BRF9ISURERU4oX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzEsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF9IMkNDTURfQVBfT0ZGTE9BRF9ERU5ZQU5ZKF9fcEgyQ0NtZCwgX19WYWx1ZSkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzIsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF9IMkNDTURfQVBfT0ZGTE9BRF9XQUtFVVBfRVZUX1JQVChfX3BIMkNDbWQsIF9fVmFsdWUpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcEgyQ0NtZCkrMywgMCwgOCwgX19WYWx1ZSkKKworLyogS2VlcCBBbGl2ZSBDb250cm9sKi8KKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfS0VFUF9BTElWRV9FTkFCTEUoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAwLCAxLCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9LRUVQX0FMSVZFX0FDQ1BFUFRfVVNFUl9ERUZJTkVEKF9fcEgyQ0NtZCwgX19WYWx1ZSkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgMSwgMSwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfS0VFUF9BTElWRV9QRVJJT0QoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcEgyQ0NtZCkrMSwgMCwgOCwgX19WYWx1ZSkKKworLypSRU1PVEVfV0FLRV9DVFJMICovCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX1JFTU9URV9XQUtFX0NUUkxfRU4oX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAwLCAxLCBfX1ZhbHVlKQorI2lmKFVTRV9PTERfV09XTEFOX0RFQlVHX0ZXID09IDApCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX1JFTU9URV9XQUtFX0NUUkxfQVJQX09GRkxPQURfRU4oX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAxLCAxLCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9SRU1PVEVfV0FLRV9DVFJMX05EUF9PRkZMT0FEX0VOKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgMiwgMSwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfUkVNT1RFX1dBS0VfQ1RSTF9HVEtfT0ZGTE9BRF9FTihfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDMsIDEsIF9fVmFsdWUpCisjZWxzZQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9SRU1PVEVfV0FLRV9DVFJMX1BBSVJXSVNFX0VOQ19BTEcoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzEsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX1JFTU9URV9XQUtFX0NUUkxfR1JPVVBfRU5DX0FMRyhfX3BIMkNDbWQsIF9fVmFsdWUpCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcEgyQ0NtZCkrMiwgMCwgOCwgX19WYWx1ZSkKKyNlbmRpZgorCisvKiBHVEtfT0ZGTE9BRCAqLworI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9BT0FDX0dMT0JBTF9JTkZPX1BBSVJXSVNFX0VOQ19BTEcoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcEgyQ0NtZCwgMCwgOCwgX19WYWx1ZSkKKyNkZWZpbmUgU0VUXzg4MjFBRV9IMkNDTURfQU9BQ19HTE9CQUxfSU5GT19HUk9VUF9FTkNfQUxHKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsxLCAwLCA4LCBfX1ZhbHVlKQorCisvKiBBT0FDX1JTVkRQQUdFX0xPQyAqLworI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9BT0FDX1JTVkRQQUdFX0xPQ19SRU1PVEVfV0FLRV9DVFJMX0lORk8oX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpLCAwLCA4LCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9BT0FDX1JTVkRQQUdFX0xPQ19BUlBfUlNQKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19wSDJDQ21kKSsxLCAwLCA4LCBfX1ZhbHVlKQorI2RlZmluZSBTRVRfODgyMUFFX0gyQ0NNRF9BT0FDX1JTVkRQQUdFX0xPQ19ORUlHSEJPUl9BRFYoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzIsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX0FPQUNfUlNWRFBBR0VfTE9DX0dUS19SU1AoX19wSDJDQ21kLCBfX1ZhbHVlKQkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKChfX3BIMkNDbWQpKzMsIDAsIDgsIF9fVmFsdWUpCisjZGVmaW5lIFNFVF84ODIxQUVfSDJDQ01EX0FPQUNfUlNWRFBBR0VfTE9DX0dUS19JTkZPKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcEgyQ0NtZCkrNCwgMCwgOCwgX19WYWx1ZSkKKworaW50IHJ0bDg4MjFhZV9kb3dubG9hZF9mdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQlib29sIGJ1c2Vfd2FrZV9vbl93bGFuX2Z3KTsKK3ZvaWQgcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggZWxlbWVudF9pZCwKKwkJCSB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKTsKK3ZvaWQgcnRsODgyMWFlX2Zpcm13YXJlX3NlbGZyZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9zZXRfZndfcHdybW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG1vZGUpOwordm9pZCBydGw4ODIxYWVfc2V0X2Z3X2pvaW5ic3NfcmVwb3J0X2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbXN0YXR1cyk7Cit2b2lkIHJ0bDg4MjFhZV9zZXRfZndfYXBfb2ZmX2xvYWRfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCAgdTggYXBfb2ZmbG9hZF9lbmFibGUpOwordm9pZCBydGw4ODIxYWVfc2V0X2Z3X3JzdmRwYWdlcGt0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZGxfZmluaXNoZWQpOwordm9pZCBydGw4ODEyYWVfc2V0X2Z3X3JzdmRwYWdlcGt0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZGxfZmluaXNoZWQpOwordm9pZCBydGw4ODIxYWVfc2V0X3AycF9wc19vZmZsb2FkX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggcDJwX3BzX3N0YXRlKTsKK3ZvaWQgcnRsODgxMmFlX2MyaF9wYWNrZXRfaGFuZGxlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmJ1ZmZlciwgdTggbGVuZ3RoKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlZTc3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaGFsX2J0X2NvZXhpc3QuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiaGFsX2J0Yy5oIgorCitzdGF0aWMgYm9vbCBidF9vcGVyYXRpb25fb24gPSBmYWxzZTsKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfcmVqZWN0X2FwX2FnZ3JlZ2F0ZWRfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfcmVqZWN0KQoreworI2lmIDAKKwlzdHJ1Y3QgcnRsX3ByaXYgcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlQUlhfVFNfUkVDT1JECQkJcFJ4VHMgPSBOVUxMOworCisJaWYoYl9yZWplY3QpeworCQkvLyBEbyBub3QgYWxsb3cgcmVjZWl2aW5nIEEtTVBEVSBhZ2dyZWdhdGlvbi4KKwkJaWYgKHJ0bHByaXYtPm1hYzgwMjExLnZlbmRvciA9PSBQRUVSX0NJU0NPKSB7CisJCQkJaWYgKHBIVEluZm8tPmJBY2NlcHRBZGRiYVJlcSkgeworCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRfRGlzYWxsb3cgQU1QRFUgXG4iKSk7CisJCQkJCXBIVEluZm8tPmJBY2NlcHRBZGRiYVJlcSA9IEZBTFNFOworCQkJCQlpZihHZXRUcyhBZGFwdGVyLCAoUFRTX0NPTU1PTl9JTkZPKikoJnBSeFRzKSwgcE1nbnRJbmZvLT5Cc3NpZCwgMCwgUlhfRElSLCBGQUxTRSkpCisJCQkJCQlUc0luaXREZWxCQShBZGFwdGVyLCAoUFRTX0NPTU1PTl9JTkZPKXBSeFRzLCBSWF9ESVIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFwSFRJbmZvLT5iQWNjZXB0QWRkYmFSZXEpIHsKKwkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJUX0FsbG93IEFNUERVIEJUIElkbGVcbiIpKTsKKwkJCQkJcEhUSW5mby0+YkFjY2VwdEFkZGJhUmVxID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZihydGxwcml2LT5tYWM4MDIxMS52ZW5kb3IgPT0gUEVFUl9DSVNDTykgeworCQkJCWlmICghcEhUSW5mby0+YkFjY2VwdEFkZGJhUmVxKSB7CisJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVF9BbGxvdyBBTVBEVSBcbiIpKTsKKwkJCQkJcEhUSW5mby0+YkFjY2VwdEFkZGJhUmVxID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorfQorCit2b2lkIF9ydGw4ODIxYWVfZG1fYnRfY2hlY2tfd2lmaV9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKK3N0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKK3N0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CitzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCitpZiAocnRscHJpdi0+bGlua19pbmZvLmJfYnVzeXRyYWZmaWMpIHsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0lETEU7CisKKwlpZihydGxwcml2LT5saW5rX2luZm8uYl90eF9idXN5X3RyYWZmaWMpIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKKwl9IGVsc2UgeworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKKwl9CisKKwlpZihydGxwcml2LT5saW5rX2luZm8uYl9yeF9idXN5X3RyYWZmaWMpIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LOworCX0gZWxzZSB7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfRE9XTkxJTks7CisJfQorfSBlbHNlIHsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfSURMRTsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LOworfQorCitpZiAocnRscHJpdi0+bWFjODAyMTEubW9kZSA9PSBXSVJFTEVTU19NT0RFX0cKKwl8fCBydGxwcml2LT5tYWM4MDIxMS5tb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1k7CisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOworCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfSFQ0MDsKK30gZWxzZSB7CisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1k7CisJaWYocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkgeworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfSFQ0MDsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOworCX0gZWxzZSB7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7CisJfQorfQorCitpZiAoYnRfb3BlcmF0aW9uX29uKSB7CisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVDMwOworfSBlbHNlIHsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVDMwOworfQorfQorCisKK3U4IHJ0bDg4MjFhZV9kbV9idF9jaGVja19jb2V4X3Jzc2lfc3RhdGUxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTgJbGV2ZWxfbnVtLCB1OAlyc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKQorCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJbG9uZyB1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPSAwOworCXU4IGJ0X3Jzc2lfc3RhdGUgPSAwOworCisJdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiID0gIHJ0bDg4MjFhZV9kbV9idF9nZXRfcnhfc3MoaHcpOworCisJaWYobGV2ZWxfbnVtID09IDIpIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOworCisJCWlmKCAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkJKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYodW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiID49IChyc3NpX3RocmVzaCArIEJUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZih1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZihsZXZlbF9udW0gPT0gMykgeworCQlpZihyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSB0aHJlc2ggZXJyb3IhIVxuIikpOworCQkJcmV0dXJuIHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZTsKKwkJfQorCisJCWlmKCAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkJKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYodW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiID49IChyc3NpX3RocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0gZWxzZSBpZiggKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCShydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJlX3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKKwkJCWlmKHVuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA+PSAocnNzaV90aHJlc2gxICsgQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOworCQkJfSBlbHNlIGlmKHVuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA8IHJzc2lfdGhyZXNoKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTE9XOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZih1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPCByc3NpX3RocmVzaDEpIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJlX3Jzc2lfc3RhdGUxID0gYnRfcnNzaV9zdGF0ZTsKKworCXJldHVybiBidF9yc3NpX3N0YXRlOworfQorCit1OCBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTgJbGV2ZWxfbnVtLCB1OAlyc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWxvbmcgdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiID0gMDsKKwl1OCBidF9yc3NpX3N0YXRlID0gMDsKKworCXVuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA9IHJ0bDg4MjFhZV9kbV9idF9nZXRfcnhfc3MoaHcpOworCisJaWYgKGxldmVsX251bSA9PSAyKSB7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07CisKKwkJaWYgKChydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJlX3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9MT1cpIHx8CisJCQkocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKXsKKwkJCWlmICh1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIKKwkJCQk+PSAocnNzaV90aHJlc2ggKyBCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQl8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlCisJCQkJCSY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPCByc3NpX3RocmVzaCkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQl8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUKKwkJCQkJJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAobGV2ZWxfbnVtID09IDMpIHsKKwkJaWYgKHJzc2lfdGhyZXNoID4gcnNzaV90aHJlc2gxKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCQkoIltETV1bQlRdLCBSU1NJIHRocmVzaCBlcnJvciEhXG4iKSk7CisJCQlyZXR1cm4gcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlOworCQl9CisJCWlmICgocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAorCQkJKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgeworCQkJaWYodW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiCisJCQkJPj0gKHJzc2lfdGhyZXNoICsgQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQl8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUKKwkJCQkJJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQkmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCQkJKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJCQkoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcmVfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKKwkJCShydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJlX3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKKwkJCWlmICh1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIKKwkJCQk+PSAocnNzaV90aHJlc2gxICsgQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgeworCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUKKwkJCQkJfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQkmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlCisJCQkJCSY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKKwkJCX0gZWxzZSBpZih1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPCByc3NpX3RocmVzaCkKKwkJCXsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUKKwkJCQkJfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlCisJCQkJCSY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlCisJCQkJCSY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkJCSgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOworCQkJfSBlbHNlIHsKKwkJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCQkJKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYodW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiIDwgcnNzaV90aHJlc2gxKSB7CisJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlCisJCQkJCXw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTTsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQkmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZQorCQkJCQkmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJCQkoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKKwkJCX0gZWxzZSB7CisJCQlidF9yc3NpX3N0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCQkoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOworCQkJfQorCQl9CisJfQorCisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3ByZV9yc3NpX3N0YXRlID0gYnRfcnNzaV9zdGF0ZTsKKwlyZXR1cm4gYnRfcnNzaV9zdGF0ZTsKK30KK2xvbmcgcnRsODgyMWFlX2RtX2J0X2dldF9yeF9zcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJbG9uZyB1bmRlY29yYXRlZHNtb290aGVkX3B3ZGIgPSAwOworCisJaWYgKHJ0bHByaXYtPm1hYzgwMjExLmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKSB7CisJCXVuZGVjb3JhdGVkc21vb3RoZWRfcHdkYiA9IEdFVF9VTkRFQ09SQVRFRF9BVkVSQUdFX1JTU0kocnRscHJpdik7CisJfSBlbHNlIHsKKwkJdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiCisJCQk9IHJ0bHByaXYtPmRtLmVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGI7CisJfQorCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoInJ0bDg4MjFhZV9kbV9idF9nZXRfcnhfc3MoKSA9ICVsZFxuIiwgdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiKSk7CisKKwlyZXR1cm4gdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYWxhbmNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCWJvb2wgYl9iYWxhbmNlX29uLCB1OCBtczAsIHU4IG1zMSkKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBoMmNfcGFyYW1ldGVyWzNdID17MH07CisKKwlpZiAoYl9iYWxhbmNlX29uKSB7CisJCWgyY19wYXJhbWV0ZXJbMl0gPSAxOworCQloMmNfcGFyYW1ldGVyWzFdID0gbXMxOworCQloMmNfcGFyYW1ldGVyWzBdID0gbXMwOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9md19jb2V4aXN0X2FsbF9vZmYgPSBmYWxzZTsKKwl9IGVsc2UgeworCQloMmNfcGFyYW1ldGVyWzJdID0gMDsKKwkJaDJjX3BhcmFtZXRlclsxXSA9IDA7CisJCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCX0KKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9iYWxhbmNlX29uID0gYl9iYWxhbmNlX29uOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0RNXVtCVF0sIEJhbGFuY2U9WyVzOiVkbXM6JWRtc10sIHdyaXRlIDB4Yz0weCV4XG4iLAorCQliX2JhbGFuY2Vfb24/Ik9OIjoiT0ZGIiwgbXMwLCBtczEsCisJCWgyY19wYXJhbWV0ZXJbMF08PDE2IHwgaDJjX3BhcmFtZXRlclsxXTw8OCB8IGgyY19wYXJhbWV0ZXJbMl0pKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4YywgMywgaDJjX3BhcmFtZXRlcik7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfYWdjX3RhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCisJaWYgKHR5cGUgPT0gQlRfQUdDVEFCTEVfT0ZGKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltCVF1BR0NUYWJsZSBPZmYhXG4iKSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3OCwweDY0MWMwMDAxKTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzc4LDB4NjMxZDAwMDEpOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjNzgsMHg2MjFlMDAwMSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3OCwweDYxMWYwMDAxKTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzc4LDB4NjAyMDAwMDEpOworCisJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX3JlZyhodywgUkY5MF9QQVRIX0EsCisJCQkJCVJGX1JYX0FHQ19IUCwgMHhmZmZmZiwgMHgzMjAwMCk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX3JlZyhodywgUkY5MF9QQVRIX0EsCisJCQkJCVJGX1JYX0FHQ19IUCwgMHhmZmZmZiwgMHg3MTAwMCk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX3JlZyhodywgUkY5MF9QQVRIX0EsCisJCQkJCVJGX1JYX0FHQ19IUCwgMHhmZmZmZiwgMHhiMDAwMCk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX3JlZyhodywgUkY5MF9QQVRIX0EsCisJCQkJCVJGX1JYX0FHQ19IUCwgMHhmZmZmZiwgMHhmYzAwMCk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX3JlZyhodywgUkY5MF9QQVRIX0EsCisJCQkJCVJGX1JYX0cxLCAweGZmZmZmLCAweDMwMzU1KTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gQlRfQUdDVEFCTEVfT04pIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUXUFHQ1RhYmxlIE9uIVxuIikpOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjNzgsMHg0ZTFjMDAwMSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3OCwweDRkMWQwMDAxKTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzc4LDB4NGMxZTAwMDEpOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjNzgsMHg0YjFmMDAwMSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3OCwweDRhMjAwMDAxKTsKKworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLAorCQkJCQlSRl9SWF9BR0NfSFAsIDB4ZmZmZmYsIDB4ZGMwMDApOworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLAorCQkJCQlSRl9SWF9BR0NfSFAsIDB4ZmZmZmYsIDB4OTAwMDApOworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLAorCQkJCQlSRl9SWF9BR0NfSFAsIDB4ZmZmZmYsIDB4NTEwMDApOworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLAorCQkJCQlSRl9SWF9BR0NfSFAsIDB4ZmZmZmYsIDB4MTIwMDApOworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLAorCQkJCQlSRl9SWF9HMSwgMHhmZmZmZiwgMHgwMDM1NSk7CisKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfc3dfY29leGlzdF9hbGxfb2ZmID0gZmFsc2U7CisJfQorfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYl9iYWNrX29mZl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKworCWlmICh0eXBlID09IEJUX0JCX0JBQ0tPRkZfT0ZGKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltCVF1CQkJhY2tPZmZMZXZlbCBPZmYhXG4iKSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGMwNCwweDNhMDU2MTEpOworCX0gZWxzZSBpZiAodHlwZSA9PSBCVF9CQl9CQUNLT0ZGX09OKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltCVF1CQkJhY2tPZmZMZXZlbCBPbiFcbiIpKTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzA0LDB4M2EwNzYxMSk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX3N3X2NvZXhpc3RfYWxsX29mZiA9IGZhbHNlOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfZndfY29leF9hbGxfb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoInJ0bDg4MjFhZV9kbV9idF9md19jb2V4X2FsbF9vZmYoKVxuIikpOworCisJaWYocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfZndfY29leGlzdF9hbGxfb2ZmKQorCQlyZXR1cm47CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJydGw4ODIxYWVfZG1fYnRfZndfY29leF9hbGxfb2ZmKCksIHJlYWwgRG9cbiIpKTsKKwlydGw4ODIxYWVfZG1fYnRfZndfY29leF9hbGxfb2ZmXzg3MjNhKGh3KTsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9md19jb2V4aXN0X2FsbF9vZmYgPSB0cnVlOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zd19jb2V4X2FsbF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJydGw4ODIxYWVfZG1fYnRfc3dfY29leF9hbGxfb2ZmKClcbiIpKTsKKworCWlmKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX3N3X2NvZXhpc3RfYWxsX29mZikKKwkJcmV0dXJuOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgicnRsODgyMWFlX2RtX2J0X3N3X2NvZXhfYWxsX29mZigpLCByZWFsIERvXG4iKSk7CisJcnRsODgyMWFlX2RtX2J0X3N3X2NvZXhfYWxsX29mZl84NzIzYShodyk7CisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfc3dfY29leGlzdF9hbGxfb2ZmID0gdHJ1ZTsKK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfaHdfY29leF9hbGxfb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgicnRsODgyMWFlX2RtX2J0X2h3X2NvZXhfYWxsX29mZigpXG4iKSk7CisKKwlpZihydGxwY2lwcml2LT5idGNvZXhpc3QuYl9od19jb2V4aXN0X2FsbF9vZmYpCisJCXJldHVybjsKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJydGw4ODIxYWVfZG1fYnRfaHdfY29leF9hbGxfb2ZmKCksIHJlYWwgRG9cbiIpKTsKKworCXJ0bDg4MjFhZV9kbV9idF9od19jb2V4X2FsbF9vZmZfODcyM2EoaHcpOworCisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfaHdfY29leGlzdF9hbGxfb2ZmID0gdHJ1ZTsKK30KKwordm9pZCBydGw4ODIxYWVfYnRkbV9jb2V4X2FsbF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJcnRsODgyMWFlX2RtX2J0X2Z3X2NvZXhfYWxsX29mZihodyk7CisJcnRsODgyMWFlX2RtX2J0X3N3X2NvZXhfYWxsX29mZihodyk7CisJcnRsODgyMWFlX2RtX2J0X2h3X2NvZXhfYWxsX29mZihodyk7Cit9CisKK2Jvb2wgcnRsODgyMWFlX2RtX2J0X2lzX2NvZXhpc3Rfc3RhdGVfY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCisJaWYoKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5wcmV2aW91c19zdGF0ZQorCQk9PSBydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSkKKwkJJiYgKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5wcmV2aW91c19zdGF0ZV9oCisJCT09IHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2gpKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBydGw4ODIxYWVfZG1fYnRfaXNfd2lmaV91cF9saW5rKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChydGxwcml2LT5saW5rX2luZm8uYl90eF9idXN5X3RyYWZmaWMpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTljYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaApAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9IQUxfQlRfQ09FWElTVF9IX18KKyNkZWZpbmUgX19SVEw4ODIxQUVfSEFMX0JUX0NPRVhJU1RfSF9fCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisKKy8qIFRoZSByZWcgZGVmaW5lIGlzIGZvciA4NzIzICovCisjZGVmaW5lCVJFR19ISUdIX1BSSU9SSVRZX1RYUlgJCQkweDc3MAorI2RlZmluZQlSRUdfTE9XX1BSSU9SSVRZX1RYUlgJCQkweDc3NAorCisjZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIX1RPTAkJCTYKKyNkZWZpbmUgQlRfRldfQ09FWF9USFJFU0hfMjAJCQkyMAorI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8yMwkJCTIzCisjZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzI1CQkJMjUKKyNkZWZpbmUgQlRfRldfQ09FWF9USFJFU0hfMzAJCQkzMAorI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8zNQkJCTM1CisjZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQwCQkJNDAKKyNkZWZpbmUgQlRfRldfQ09FWF9USFJFU0hfNDUJCQk0NQorI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF80NwkJCTQ3CisjZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzUwCQkJNTAKKyNkZWZpbmUgQlRfRldfQ09FWF9USFJFU0hfNTUJCQk1NQorCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlQzMAkJCQlCSVQoMCkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0hUMjAJCQlCSVQoMSkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0hUNDAJCQlCSVQoMikKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0xFR0FDWQkJQklUKDMpCisKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XCQlCSVQoNCkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTUVESVVNCUJJVCg1KQorI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdICUJJVCg2KQorI2RlZmluZSBCVF9DT0VYX1NUQVRFX0RFQ19CVF9QT1dFUgkJQklUKDcpCisKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0lETEUJCQlCSVQoOCkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSwkJQklUKDkpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSwkJQklUKDEwKQorCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfSU5RX1BBR0UJCQlCSVQoMTEpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfSURMRQkJCUJJVCgxMikKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9VUExJTksJCQlCSVQoMTMpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfRE9XTkxJTksJCUJJVCgxNCkKKworI2RlZmluZSBCVF9DT0VYX1NUQVRFX0hPTERfRk9SX0JUX09QRVJBVElPTglCSVQoMTUpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUlNTSV9MT1cJCUJJVCgxOSkKKworI2RlZmluZSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElECQlCSVQoMjApCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQCQlCSVQoMjEpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU4JCUJJVCgyMikKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1NDTwkJQklUKDIzKQorCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTE9XCQlCSVQoMjQpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNCUJJVCgyNSkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdICQlCSVQoMjYpCisKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVElORk9fQ09NTU9OCQkJQklUKDMwKQorI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUSU5GT19CX0hJRF9TQ09FU0NPCUJJVCgzMSkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVElORk9fQl9GVFBfQTJEUAkJQklUKDI5KQorCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzAJCUJJVCgwKQorI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0NOVF9MRVZFTF8xCQlCSVQoMSkKKyNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMgkJQklUKDIpCisjZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzMJCUJJVCgzKQorCisjZGVmaW5lIEJUX1JTU0lfU1RBVEVfSElHSAkJCTAKKyNkZWZpbmUgQlRfUlNTSV9TVEFURV9NRURJVU0JCTEKKyNkZWZpbmUgQlRfUlNTSV9TVEFURV9MT1cJCQkyCisjZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdICQkzCisjZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0JNAorI2RlZmluZSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XCQk1CisKKyNkZWZpbmUJQlRfQUdDVEFCTEVfT0ZGCQkJCTAKKyNkZWZpbmUJQlRfQUdDVEFCTEVfT04JCQkJMQorI2RlZmluZQlCVF9CQl9CQUNLT0ZGX09GRgkJCTAKKyNkZWZpbmUJQlRfQkJfQkFDS09GRl9PTgkJCTEKKyNkZWZpbmUJQlRfRldfTkFWX09GRgkJCQkwCisjZGVmaW5lCUJUX0ZXX05BVl9PTgkJCQkxCisKKyNkZWZpbmUJQlRfQ09FWF9NRUNIX05PTkUJCQkwCisjZGVmaW5lCUJUX0NPRVhfTUVDSF9TQ08JCQkxCisjZGVmaW5lCUJUX0NPRVhfTUVDSF9ISUQJCQkyCisjZGVmaW5lCUJUX0NPRVhfTUVDSF9BMkRQCQkJMworI2RlZmluZQlCVF9DT0VYX01FQ0hfUEFOCQkJNAorI2RlZmluZQlCVF9DT0VYX01FQ0hfSElEX0EyRFAJCTUKKyNkZWZpbmUJQlRfQ09FWF9NRUNIX0hJRF9QQU4JCTYKKyNkZWZpbmUJQlRfQ09FWF9NRUNIX1BBTl9BMkRQCQk3CisjZGVmaW5lCUJUX0NPRVhfTUVDSF9ISURfU0NPX0VTQ08JOAorI2RlZmluZQlCVF9DT0VYX01FQ0hfRlRQX0EyRFAJCTkKKyNkZWZpbmUJQlRfQ09FWF9NRUNIX0NPTU1PTgkJCTEwCisjZGVmaW5lCUJUX0NPRVhfTUVDSF9NQVgJCQkxMQorCisjZGVmaW5lCUJUX0RCR19QUk9GSUxFX05PTkUJCQkwCisjZGVmaW5lCUJUX0RCR19QUk9GSUxFX1NDTwkJCTEKKyNkZWZpbmUJQlRfREJHX1BST0ZJTEVfSElECQkJMgorI2RlZmluZQlCVF9EQkdfUFJPRklMRV9BMkRQCQkJMworI2RlZmluZQlCVF9EQkdfUFJPRklMRV9QQU4JCQk0CisjZGVmaW5lCUJUX0RCR19QUk9GSUxFX0hJRF9BMkRQCQk1CisjZGVmaW5lCUJUX0RCR19QUk9GSUxFX0hJRF9QQU4JCTYKKyNkZWZpbmUJQlRfREJHX1BST0ZJTEVfUEFOX0EyRFAJCTcKKyNkZWZpbmUJQlRfREJHX1BST0ZJTEVfTUFYCQkJOQorCisjZGVmaW5lCUJUSU5GT19CX0ZUUAkJCQkJQklUKDcpCisjZGVmaW5lCUJUSU5GT19CX0EyRFAJCQkJCUJJVCg2KQorI2RlZmluZQlCVElORk9fQl9ISUQJCQkJCUJJVCg1KQorI2RlZmluZQlCVElORk9fQl9TQ09fQlVTWQkJCQlCSVQoNCkKKyNkZWZpbmUJQlRJTkZPX0JfQUNMX0JVU1kJCQkJQklUKDMpCisjZGVmaW5lCUJUSU5GT19CX0lOUV9QQUdFCQkJCUJJVCgyKQorI2RlZmluZQlCVElORk9fQl9TQ09fRVNDTwkJCQlCSVQoMSkKKyNkZWZpbmUJQlRJTkZPX0JfQ09OTkVDVElPTgkJCQlCSVQoMCkKKworCit2b2lkIHJ0bDg4MjFhZV9idGRtX2NvZXhfYWxsX29mZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9md19jb2V4X2FsbF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zd19jb2V4X2FsbF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fYnRfaHdfY29leF9hbGxfb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2xvbmcgcnRsODgyMWFlX2RtX2J0X2dldF9yeF9zcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYWxhbmNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJYm9vbCBiX2JhbGFuY2Vfb24sIHU4IG1zMCwgdTggbXMxKTsKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2FnY190YWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHllcCk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYl9iYWNrX29mZl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSk7Cit1OCBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTgJbGV2ZWxfbnVtLCB1OAlyc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKTsKK3U4IHJ0bDg4MjFhZV9kbV9idF9jaGVja19jb2V4X3Jzc2lfc3RhdGUxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgICAgICAgICAgICAgICAgICAgICB1OCAgbGV2ZWxfbnVtLCB1OCAgIHJzc2lfdGhyZXNoLCB1OCByc3NpX3RocmVzaDEpOwordm9pZCBfcnRsODgyMWFlX2RtX2J0X2NoZWNrX3dpZmlfc3RhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fYnRfcmVqZWN0X2FwX2FnZ3JlZ2F0ZWRfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJYm9vbCBiX3JlamVjdCk7CisKKyNpZiAwCitWT0lECitCVERNX1BXREJNb25pdG9yKAorCSAJUEFEQVBURVIJQWRhcHRlcgorCSk7CisKK0JPT0xFQU4KK0JURE1fRElHQnlCVFJTU0koCisJIAkJUEFEQVBURVIJQWRhcHRlcgorCSk7CisjZW5kaWYKK2Jvb2wgcnRsODgyMWFlX2RtX2J0X2lzX2NvZXhpc3Rfc3RhdGVfY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Citib29sIHJ0bDg4MjFhZV9kbV9idF9pc193aWZpX3VwX2xpbmsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM4NmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0Yy5jCkBAIC0wLDAgKzEsMjA2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiaGFsX2J0Yy5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVmLmgiCisjaW5jbHVkZSAiLi4vYnRjb2V4aXN0L3J0bF9idGMuaCIKKworc3RhdGljIHN0cnVjdCBidF9jb2V4aXN0Xzg4MjFhZSBoYWxfY29leF84ODIxYWU7CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3R1cm5fb2ZmX2J0X2NvZXhpc3RfYmVmb3JlX2VudGVyX2xwcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKyAgICBzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKworCWlmKCFydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfY29leGlzdGVuY2UpCisJCXJldHVybjsKKworCWlmKHBwc2MtPmJfaW5hY3RpdmVwcykgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywoIltCVF1bRE1dLCBCZWZvcmUgZW50ZXIgSVBTLCB0dXJuIG9mZiBhbGwgQ29leGlzdCBETVxuIikpOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSA9IDA7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5wcmV2aW91c19zdGF0ZSA9IDA7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2ggPSAwOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QucHJldmlvdXNfc3RhdGVfaCA9IDA7CisJCXJ0bDg4MjFhZV9idGRtX2NvZXhfYWxsX29mZihodyk7CisJfQorfQorCisKK2VudW0gcnRfbWVkaWFfc3RhdHVzIG1nbnRfbGlua19zdGF0dXNfcXVlcnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisgICAgc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworICAgIHN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgICAgbV9zdGF0dXMgPSBSVF9NRURJQV9ESVNDT05ORUNUOworCisgICAgdTggYmlic3MgPSAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpID8gMSA6IDA7CisKKyAgICBpZihiaWJzcyB8fCBydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgeworICAgICAgICAgICAgbV9zdGF0dXMgPSBSVF9NRURJQV9DT05ORUNUOworICAgIH0KKworICAgIHJldHVybiBtX3N0YXR1czsKK30KKwordm9pZCBydGxfODgyMWFlX2J0X3dpZmlfbWVkaWFfc3RhdHVzX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBtc3RhdHVzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggaDJjX3BhcmFtZXRlclszXSA9ezB9OworCXU4IGNobmw7CisKKwlpZighcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X2NvZXhpc3RlbmNlKQorCQlyZXR1cm47CisKKwlpZihSVF9NRURJQV9DT05ORUNUID09IG1zdGF0dXMpCisJCWgyY19wYXJhbWV0ZXJbMF0gPSAweDE7IC8vIDA6IGRpc2Nvbm5lY3RlZCwgMTpjb25uZWN0ZWQKKwllbHNlCisJCWgyY19wYXJhbWV0ZXJbMF0gPSAweDA7CisKKwlpZihtZ250X2xpbmtfc3RhdHVzX3F1ZXJ5KGh3KSkJeworCQljaG5sID0gcnRscGh5LT5jdXJyZW50X2NoYW5uZWw7CisJCWgyY19wYXJhbWV0ZXJbMV0gPSBjaG5sOworCX0KKworCWlmKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApeworCQloMmNfcGFyYW1ldGVyWzJdID0gMHgzMDsKKwl9IGVsc2UgeworCQloMmNfcGFyYW1ldGVyWzJdID0gMHgyMDsKKwl9CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywoIltCVENvZXhdLCBGVyB3cml0ZSAweDE5PTB4JXhcbiIsCisJCWgyY19wYXJhbWV0ZXJbMF08PDE2fGgyY19wYXJhbWV0ZXJbMV08PDh8aDJjX3BhcmFtZXRlclsyXSkpOworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgxOSwgMywgaDJjX3BhcmFtZXRlcik7CisKK30KKworCitib29sIHJ0bDg4MjFhZV9kbV9idF9pc193aWZpX2J1c3koc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWlmKHJ0bHByaXYtPmxpbmtfaW5mby5iX2J1c3l0cmFmZmljIHx8CisJCXJ0bHByaXYtPmxpbmtfaW5mby5iX3J4X2J1c3lfdHJhZmZpYyB8fAorCQlydGxwcml2LT5saW5rX2luZm8uYl90eF9idXN5X3RyYWZmaWMpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTggYnl0ZTEsIHU4IGJ5dGUyLCB1OCBieXRlMywgdTggYnl0ZTQsIHU4IGJ5dGU1KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBoMmNfcGFyYW1ldGVyWzVdID17MH07CisJaDJjX3BhcmFtZXRlclswXSA9IGJ5dGUxOworCWgyY19wYXJhbWV0ZXJbMV0gPSBieXRlMjsKKwloMmNfcGFyYW1ldGVyWzJdID0gYnl0ZTM7CisJaDJjX3BhcmFtZXRlclszXSA9IGJ5dGU0OworCWgyY19wYXJhbWV0ZXJbNF0gPSBieXRlNTsKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg0Ynl0ZXMpPTB4JXglOHhcbiIsCisJCWgyY19wYXJhbWV0ZXJbMF0sIGgyY19wYXJhbWV0ZXJbMV08PDI0IHwgaDJjX3BhcmFtZXRlclsyXTw8MTYgfCBoMmNfcGFyYW1ldGVyWzNdPDw4IHwgaDJjX3BhcmFtZXRlcls0XSkpOworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4M2EsIDUsIGgyY19wYXJhbWV0ZXIpOworfQorCitib29sIHJ0bDg4MjFhZV9kbV9idF9uZWVkX3RvX2RlY19idF9wd3Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAobWdudF9saW5rX3N0YXR1c19xdWVyeShodykgPT0gUlRfTUVESUFfQ09OTkVDVCkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyXG4iKSk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfREVDX0JUX1BPV0VSOworCQkJcmV0dXJuIHRydWU7CisJfQorCisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfREVDX0JUX1BPV0VSOworCXJldHVybiBmYWxzZTsKK30KKworCitib29sIHJ0bDg4MjFhZV9kbV9idF9pc19zYW1lX2NvZXhpc3Rfc3RhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisKKwlpZiAoKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5wcmV2aW91c19zdGF0ZQorCQk9PSBydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSkKKwkJJiYocnRscGNpcHJpdi0+YnRjb2V4aXN0LnByZXZpb3VzX3N0YXRlX2gKKwkJPT0gcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGVfaCkpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkJKCJbRE1dW0JUXSwgQ29leGlzdCBzdGF0ZSBkbyBub3QgY2hhbmchIVxuIikpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCQkoIltETV1bQlRdLCBDb2V4aXN0IHN0YXRlIGNoYW5nZWQhIVxuIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zZXRfY29leF90YWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCXUzMiB2YWxfMHg2YzAsIHUzMiB2YWxfMHg2YzgsIHUzMiB2YWxfMHg2Y2MpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgic2V0IGNvZXggdGFibGUsIHNldCAweDZjMD0weCV4XG4iLCB2YWxfMHg2YzApKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg2YzAsIHZhbF8weDZjMCk7CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4PTB4JXhcbiIsIHZhbF8weDZjOCkpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDZjOCwgdmFsXzB4NmM4KTsKKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2M9MHgleFxuIiwgdmFsXzB4NmNjKSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg2Y2MsIHZhbF8weDZjYyk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9od19wdGFfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBiX21vZGUpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAoQlRfUFRBX01PREVfT04gPT0gYl9tb2RlKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIlBUQSBtb2RlIG9uLCAiKSk7CisJCS8qICBFbmFibGUgR1BJTyAwLzEvMi8zLzggcGlucyBmb3IgYnQgKi8KKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg0MCwgMHgyMCk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX2h3X2NvZXhpc3RfYWxsX29mZiA9IGZhbHNlOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIlBUQSBtb2RlIG9mZlxuIikpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDQwLCAweDApOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAoQlRfUkZfUlhfTFBGX0NPUk5FUl9TSFJJTksgPT0gdHlwZSkgeworCQkvKiBTaHJpbmsgUkYgUnggTFBGIGNvcm5lciwgMHgxZVs3OjRdPTExMTEgPT0+IFsxMTo0XSBieSBKZW55dSAqLworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJTaHJpbmsgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CisJCS8qIFBIWV9TZXRSRlJlZyhBZGFwdGVyLCAoUkZfUkFESU9fUEFUSF9FKVBhdGhBLCAweDFlLCAweGYwLCAweGYpOyAqLworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIFJGOTBfUEFUSF9BLCAweDFlLCAweGZmZmZmLCAweGYwZmY3KTsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfc3dfY29leGlzdF9hbGxfb2ZmID0gZmFsc2U7CisJfSBlbHNlIGlmKEJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FID09IHR5cGUpIHsKKwkJLypSZXN1bWUgUkYgUnggTFBGIGNvcm5lciovCisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIlJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKKwkJLyogUEhZX1NldFJGUmVnKEFkYXB0ZXIsIChSRl9SQURJT19QQVRIX0UpUGF0aEEsIDB4MWUsIDB4ZjAsCisJCSAqIHBIYWxEYXRhLT5idGNvZXhpc3QuQnRSZlJlZ09yaWdpbjFFKTsgKi8KKwkJcnRsODgyMWFlX3BoeV9zZXRfcmZfcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgxZSwgMHhmZmZmZiwKKwkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9yZnJlZ19vcmlnaW5fMWUpOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X3N3X3BlbmFsdHlfdHhfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQkJCQkJdTggcmFfdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwl1OCB0bXBfdTE7CisKKwl0bXBfdTEgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIDB4NGZkKTsKKwl0bXBfdTEgfD0gQklUKDApOworCWlmIChCVF9UWF9SQVRFX0FEQVBUSVZFX0xPV19QRU5BTFRZID09IHJhX3R5cGUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IGxvdyBwZW5hbHR5ISFcbiIpKTsKKwkJdG1wX3UxICY9IH5CSVQoMik7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX3N3X2NvZXhpc3RfYWxsX29mZiA9IGZhbHNlOworCX0gZWxzZSBpZihCVF9UWF9SQVRFX0FEQVBUSVZFX05PUk1BTCA9PSByYV90eXBlKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIlR4IHJhdGUgYWRhcHRpdmUsIHNldCBub3JtYWwhIVxuIikpOworCQl0bXBfdTEgfD0gQklUKDIpOworCX0KKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NGZkLCB0bXBfdTEpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9idGRtX3N0cnVjdHVyZV9yZWxvYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkJc3RydWN0IGJ0ZG1fODgyMWFlCSpwX2J0ZG0pCit7CisJcF9idGRtLT5iX2FsbF9vZmYgPSBmYWxzZTsKKwlwX2J0ZG0tPmJfYWdjX3RhYmxlX2VuID0gZmFsc2U7CisJcF9idGRtLT5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCXBfYnRkbS0+YjJfYW50X2hpZF9lbiA9IGZhbHNlOworCXBfYnRkbS0+Yl9sb3dfcGVuYWx0eV9yYXRlX2FkYXB0aXZlID0gZmFsc2U7CisJcF9idGRtLT5iX3JmX3J4X2xwZl9zaHJpbmsgPSBmYWxzZTsKKwlwX2J0ZG0tPmJfcmVqZWN0X2FnZ3JlX3BrdD0gZmFsc2U7CisKKwlwX2J0ZG0tPmJfdGRtYV9vbiA9IGZhbHNlOworCXBfYnRkbS0+dGRtYV9hbnQgPSBURE1BXzJBTlQ7CisJcF9idGRtLT50ZG1hX25hdiA9IFRETUFfTkFWX09GRjsKKwlwX2J0ZG0tPnRkbWFfZGFjX3N3aW5nID0gVERNQV9EQUNfU1dJTkdfT0ZGOworCXBfYnRkbS0+ZndfZGFjX3N3aW5nX2x2bCA9IDB4MjA7CisKKwlwX2J0ZG0tPmJfdHJhX3RkbWFfb24gPSBmYWxzZTsKKwlwX2J0ZG0tPnRyYV90ZG1hX2FudCA9IFRETUFfMkFOVDsKKwlwX2J0ZG0tPnRyYV90ZG1hX25hdiA9IFRETUFfTkFWX09GRjsKKwlwX2J0ZG0tPmJfaWdub3JlX3dsYW5fYWN0ID0gZmFsc2U7CisKKwlwX2J0ZG0tPmJfcHNfdGRtYV9vbiA9IGZhbHNlOworCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzBdID0gMHgwOworCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzFdID0gMHgwOworCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzJdID0gMHgwOworCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzNdID0gMHg4OworCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzRdID0gMHgwOworCisJcF9idGRtLT5iX3B0YV9vbiA9IHRydWU7CisJcF9idGRtLT52YWxfMHg2YzAgPSAweDVhNWFhYWFhOworCXBfYnRkbS0+dmFsXzB4NmM4ID0gMHhjYzsKKwlwX2J0ZG0tPnZhbF8weDZjYyA9IDB4MzsKKworCXBfYnRkbS0+Yl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwlwX2J0ZG0tPnN3X2RhY19zd2luZ19sdmwgPSAweGMwOworCXBfYnRkbS0+d2xhbl9hY3RfaGkgPSAweDIwOworCXBfYnRkbS0+d2xhbl9hY3RfbG8gPSAweDEwOworCXBfYnRkbS0+YnRfcmV0cnlfaW5kZXggPSAyOworCisJcF9idGRtLT5iX2RlY19idF9wd3IgPSBmYWxzZTsKK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfYnRkbV9zdHJ1Y3R1cmVfcmVsb2FkX2FsbF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkJc3RydWN0IGJ0ZG1fODgyMWFlCSpwX2J0ZG0pCit7CisJcnRsODgyMWFlX2RtX2J0X2J0ZG1fc3RydWN0dXJlX3JlbG9hZChodywgcF9idGRtKTsKKwlwX2J0ZG0tPmJfYWxsX29mZiA9IHRydWU7CisJcF9idGRtLT5iX3B0YV9vbiA9IGZhbHNlOworCXBfYnRkbS0+d2xhbl9hY3RfaGkgPSAweDEwOworfQorCitib29sIHJ0bDg4MjFhZV9kbV9idF9pc18yX2FudF9jb21tb25fYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBidGRtXzg4MjFhZSBidGRtODgyMWFlOworCWJvb2wgYl9jb21tb24gPSBmYWxzZTsKKworCXJ0bDg4MjFhZV9kbV9idF9idGRtX3N0cnVjdHVyZV9yZWxvYWQoaHcsICZidGRtODgyMWFlKTsKKworCWlmKCFydGw4ODIxYWVfZG1fYnRfaXNfd2lmaV9idXN5KGh3KQorCQkmJiAhcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfYnRfYnVzeSkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiV2lmaSBpZGxlICsgQnQgaWRsZSwgYnQgY29leCBtZWNoYW5pc20gYWx3YXlzIG9mZiEhXG4iKSk7CisJCXJ0bDg4MjFhZV9kbV9idF9idGRtX3N0cnVjdHVyZV9yZWxvYWRfYWxsX29mZihodywgJmJ0ZG04ODIxYWUpOworCQliX2NvbW1vbiA9IHRydWU7CisJfSBlbHNlIGlmIChydGw4ODIxYWVfZG1fYnRfaXNfd2lmaV9idXN5KGh3KQorCQkmJiAhcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfYnRfYnVzeSkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiV2lmaSBub24taWRsZSArIEJ0IGRpc2FibGVkL2lkbGUhIVxuIikpOworCQlidGRtODgyMWFlLmJfbG93X3BlbmFsdHlfcmF0ZV9hZGFwdGl2ZSA9IHRydWU7CisJCWJ0ZG04ODIxYWUuYl9yZl9yeF9scGZfc2hyaW5rID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUuYl9yZWplY3RfYWdncmVfcGt0ID0gZmFsc2U7CisKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQlidGRtODgyMWFlLmJfc3dfZGFjX3N3aW5nX29uID0gZmFsc2U7CisKKwkJYnRkbTg4MjFhZS5iX3B0YV9vbiA9IHRydWU7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmMwID0gMHg1YTVhYWFhYTsKKwkJYnRkbTg4MjFhZS52YWxfMHg2YzggPSAweGNjY2M7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmNjID0gMHgzOworCisJCWJ0ZG04ODIxYWUuYl90ZG1hX29uID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PRkY7CisJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IGZhbHNlOworCisJCWJfY29tbW9uID0gdHJ1ZTsKKwl9ZWxzZSBpZiAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfYnRfYnVzeSkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiQnQgbm9uLWlkbGUhXG4iKSk7CisJCWlmKG1nbnRfbGlua19zdGF0dXNfcXVlcnkoaHcpID09IFJUX01FRElBX0NPTk5FQ1QpeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSBjb25uZWN0aW9uIGV4aXN0XG4iKSkKKwkJCWJfY29tbW9uID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCQkoIk5vIFdpZmkgY29ubmVjdGlvbiFcbiIpKTsKKwkJCWJ0ZG04ODIxYWUuYl9yZl9yeF9scGZfc2hyaW5rID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl9sb3dfcGVuYWx0eV9yYXRlX2FkYXB0aXZlID0gZmFsc2U7CisJCQlidGRtODgyMWFlLmJfcmVqZWN0X2FnZ3JlX3BrdCA9IGZhbHNlOworCisJCQkvKiBzdyBtZWNoYW5pc20gKi8KKwkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKworCQkJYnRkbTg4MjFhZS5iX3B0YV9vbiA9IHRydWU7CisJCQlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NTU1NTU1NTU7CisJCQlidGRtODgyMWFlLnZhbF8weDZjOCA9IDB4MDAwMGZmZmY7CisJCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKworCQkJYnRkbTg4MjFhZS5iX3RkbWFfb24gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PRkY7CisJCQlidGRtODgyMWFlLmIyX2FudF9oaWRfZW4gPSBmYWxzZTsKKworCQkJYl9jb21tb24gPSB0cnVlOworCQl9CisJfQorCisJaWYgKHJ0bDg4MjFhZV9kbV9idF9uZWVkX3RvX2RlY19idF9wd3IoaHcpKSB7CisJCWJ0ZG04ODIxYWUuYl9kZWNfYnRfcHdyID0gdHJ1ZTsKKwl9CisKKwlpZihiX2NvbW1vbikKKwkJIHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRJTkZPX0NPTU1PTjsKKworCWlmIChiX2NvbW1vbiAmJiBydGw4ODIxYWVfZG1fYnRfaXNfY29leGlzdF9zdGF0ZV9jaGFuZ2VkKGh3KSkKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9idF9kbShodywgJmJ0ZG04ODIxYWUpOworCisJcmV0dXJuIGJfY29tbW9uOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zZXRfc3dfZnVsbF90aW1lX2RhY19zd2luZygKKwkJc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBib29sIGJfc3dfZGFjX3N3aW5nX29uLCB1MzIgc3dfZGFjX3N3aW5nX2x2bCkKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChiX3N3X2RhY19zd2luZ19vbikgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCSgiW0JUQ29leF0sIFN3RGFjU3dpbmcgPSAweCV4XG4iLCBzd19kYWNfc3dpbmdfbHZsKSk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X2JiX3JlZyhodywgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3X2RhY19zd2luZ19sdmwpOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9zd19jb2V4aXN0X2FsbF9vZmYgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgU3dEYWNTd2luZyBPZmYhXG4iKSk7CisJCXJ0bDg4MjFhZV9waHlfc2V0X2JiX3JlZyhodywgMHg4ODAsIDB4ZmYwMDAwMDAsIDB4YzApOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2RlY19idF9wd3IoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZGVjX2J0X3B3cikKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBoMmNfcGFyYW1ldGVyWzFdID17MH07CisKKwloMmNfcGFyYW1ldGVyWzBdID0gMDsKKworCWlmIChiX2RlY19idF9wd3IpIHsKKwkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQoMSk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX2Z3X2NvZXhpc3RfYWxsX29mZiA9IGZhbHNlOworCX0KKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCBkZWNyZWFzZSBCdCBQb3dlciA6ICVzLCB3cml0ZSAweDIxPTB4JXhcbiIsCisJCShiX2RlY19idF9wd3I/ICJZZXMhISI6Ik5vISEiKSwgaDJjX3BhcmFtZXRlclswXSkpOworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgyMSwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCWJvb2wgYl9lbmFibGUsIGJvb2wgYl9kYWNfc3dpbmdfb24pCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCisJaWYgKGJfZW5hYmxlKSB7CisJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDApOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9md19jb2V4aXN0X2FsbF9vZmYgPSBmYWxzZTsKKwl9CisJaWYgKGJfZGFjX3N3aW5nX29uKSB7CisJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDEpOyAvKiBEYWMgU3dpbmcgZGVmYXVsdCBlbmFibGUgKi8KKwl9CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0JUQ29leF0sIHR1cm4gMi1BbnQrSElEIG1vZGUgJXMsIERBQ1N3aW5nOiVzLCB3cml0ZSAweDE1PTB4JXhcbiIsCisJCShiX2VuYWJsZSA/ICJPTiEhIjoiT0ZGISEiKSwgKGJfZGFjX3N3aW5nX29uID8gIk9OIjoiT0ZGIiksCisJCWgyY19wYXJhbWV0ZXJbMF0pKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4MTUsIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zZXRfZndfdGRtYV9jdHJsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCWJvb2wgYl9lbmFibGUsIHU4IGFudF9udW0sIHU4IG5hdl9lbiwgdTggZGFjX3N3aW5nX2VuKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKwl1OCBoMmNfcGFyYW1ldGVyMVsxXSA9IHswfTsKKworCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCWgyY19wYXJhbWV0ZXIxWzBdID0gMDsKKworCWlmKGJfZW5hYmxlKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJKCJbQlRDb2V4XSwgc2V0IEJUIFBUQSB1cGRhdGUgbWFuYWdlciB0byB0cmlnZ2VyIHVwZGF0ZSEhXG4iKSk7CisJCWgyY19wYXJhbWV0ZXIxWzBdIHw9IEJJVCgwKTsKKworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCSgiW0JUQ29leF0sIHR1cm4gVERNQSBtb2RlIE9OISFcbiIpKTsKKwkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQoMCk7CQkvKiBmdW5jdGlvbiBlbmFibGUgKi8KKwkJaWYgKFRETUFfMUFOVCA9PSBhbnRfbnVtKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVERNQV8xQU5UXG4iKSk7CisJCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVCgxKTsKKwkJfSBlbHNlIGlmKFRETUFfMkFOVCA9PSBhbnRfbnVtKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVERNQV8yQU5UXG4iKSk7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVW5rbm93biBBbnRcbiIpKTsKKwkJfQorCisJCWlmIChURE1BX05BVl9PRkYgPT0gbmF2X2VuKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVERNQV9OQVZfT0ZGXG4iKSk7CisJCX0gZWxzZSBpZiAoVERNQV9OQVZfT04gPT0gbmF2X2VuKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVERNQV9OQVZfT05cbiIpKTsKKwkJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDIpOworCQl9CisKKwkJaWYgKFRETUFfREFDX1NXSU5HX09GRiA9PSBkYWNfc3dpbmdfZW4pIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJCSgiW0JUQ29leF0sIFRETUFfREFDX1NXSU5HX09GRlxuIikpOworCQl9IGVsc2UgaWYoVERNQV9EQUNfU1dJTkdfT04gPT0gZGFjX3N3aW5nX2VuKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCQkoIltCVENvZXhdLCBURE1BX0RBQ19TV0lOR19PTlxuIikpOworCQkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQoNCk7CisJCX0KKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfZndfY29leGlzdF9hbGxfb2ZmID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkoIltCVENvZXhdLCBzZXQgQlQgUFRBIHVwZGF0ZSBtYW5hZ2VyIHRvIG5vIHVwZGF0ZSEhXG4iKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJKCJbQlRDb2V4XSwgdHVybiBURE1BIG1vZGUgT0ZGISFcbiIpKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJbQlRDb2V4XSwgRlcyQW50VERNQSwgd3JpdGUgMHgyNj0weCV4XG4iLCBoMmNfcGFyYW1ldGVyMVswXSkpOworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4MjYsIDEsIGgyY19wYXJhbWV0ZXIxKTsKKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCBGVzJBbnRURE1BLCB3cml0ZSAweDE0PTB4JXhcbiIsIGgyY19wYXJhbWV0ZXJbMF0pKTsKKwlydGw4ODIxYWVfZmlsbF9oMmNfY21kKGh3LCAweDE0LCAxLCBoMmNfcGFyYW1ldGVyKTsKKworCWlmICghYl9lbmFibGUpIHsKKwkJLyogZGVsYXlfbXMoMik7CisJCSAqIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoQWRhcHRlciwgMHg3NzgsIDB4MSk7ICovCisJfQorfQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9md19pZ25vcmVfd2xhbl9hY3QoIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZW5hYmxlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPXswfTsKKworCWlmIChiX2VuYWJsZSkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSWdub3JlIFdsYW5fQWN0ICEhXG4iKSk7CisJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDApOwkJLy8gZnVuY3Rpb24gZW5hYmxlCisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX2Z3X2NvZXhpc3RfYWxsX29mZiA9IGZhbHNlOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltCVENvZXhdLCBCVCBkb24ndCBpZ25vcmUgV2xhbl9BY3QgISFcbiIpKTsKKwl9CisKKyAgICBSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgc2V0IEZXIGZvciBCVCBJZ25vcmUgV2xhbl9BY3QsIHdyaXRlIDB4MjU9MHgleFxuIiwKKwkJaDJjX3BhcmFtZXRlclswXSkpOworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgyNSwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCWJvb2wgYl9lbmFibGUsIHU4IGFudF9udW0sIHU4IG5hdl9lbgorCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwkvL3N0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisKKwl1OCBoMmNfcGFyYW1ldGVyWzJdID17MH07CisKKworCWlmIChiX2VuYWJsZSkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCSgiW0JUQ29leF0sIHR1cm4gVFRETUEgbW9kZSBPTiEhXG4iKSk7CisJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDApOwkJLy8gZnVuY3Rpb24gZW5hYmxlCisJCWlmIChURE1BXzFBTlQgPT0gYW50X251bSkgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIFRURE1BXzFBTlRcbiIpKTsKKwkJCWgyY19wYXJhbWV0ZXJbMF0gfD0gQklUKDEpOworCQl9IGVsc2UgaWYgKFRETUFfMkFOVCA9PSBhbnRfbnVtKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJbQlRDb2V4XSwgVFRETUFfMkFOVFxuIikpOworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIFVua25vd24gQW50XG4iKSk7CisJCX0KKworCQlpZiAoVERNQV9OQVZfT0ZGID09IG5hdl9lbikgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIFRURE1BX05BVl9PRkZcbiIpKTsKKwkJfSBlbHNlIGlmIChURE1BX05BVl9PTiA9PSBuYXZfZW4pIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIltCVENvZXhdLCBUVERNQV9OQVZfT05cbiIpKTsKKwkJCWgyY19wYXJhbWV0ZXJbMV0gfD0gQklUKDApOworCQl9CisKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfZndfY29leGlzdF9hbGxfb2ZmID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkoIltCVENvZXhdLCB0dXJuIFRURE1BIG1vZGUgT0ZGISFcbiIpKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJbQlRDb2V4XSwgRlcgVHJhZGl0aW9uYWwgVERNQSwgd3JpdGUgMHgzMz0weCV4XG4iLAorCQloMmNfcGFyYW1ldGVyWzBdIDw8IDh8IGgyY19wYXJhbWV0ZXJbMV0pKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4MzMsIDIsIGgyY19wYXJhbWV0ZXIpOworfQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9md19kYWNfc3dpbmdfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkJdTggZGFjX3N3aW5nX2x2bCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCWgyY19wYXJhbWV0ZXJbMF0gPSBkYWNfc3dpbmdfbHZsOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0JUQ29leF0sIFNldCBEYWMgU3dpbmcgTGV2ZWw9MHgleFxuIiwgZGFjX3N3aW5nX2x2bCkpOworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCB3cml0ZSAweDI5PTB4JXhcbiIsIGgyY19wYXJhbWV0ZXJbMF0pKTsKKworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4MjksIDEsIGgyY19wYXJhbWV0ZXIpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfaGlkX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9lbmFibGUpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCWgyY19wYXJhbWV0ZXJbMF0gPSAwOworCisJaWYoYl9lbmFibGUpeworCQloMmNfcGFyYW1ldGVyWzBdIHw9IEJJVCgwKTsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfZndfY29leGlzdF9hbGxfb2ZmID0gZmFsc2U7CisJfQorCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCBTZXQgQlQgSElEIGluZm9ybWF0aW9uPTB4JXhcbiIsIGJfZW5hYmxlKSk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0JUQ29leF0sIHdyaXRlIDB4MjQ9MHgleFxuIiwgaDJjX3BhcmFtZXRlclswXSkpOworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgyNCwgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9md19idF9yZXRyeV9pbmRleChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQl1OCByZXRyeV9pbmRleCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggaDJjX3BhcmFtZXRlclsxXSA9ezB9OworCWgyY19wYXJhbWV0ZXJbMF0gPSByZXRyeV9pbmRleDsKKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCBTZXQgQlQgUmV0cnkgSW5kZXg9JWRcbiIsIHJldHJ5X2luZGV4KSk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0JUQ29leF0sIHdyaXRlIDB4MjM9MHgleFxuIiwgaDJjX3BhcmFtZXRlclswXSkpOworCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgyMywgMSwgaDJjX3BhcmFtZXRlcik7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9md193bGFuX2FjdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJdTggd2xhbl9hY3RfaGksIHU4IHdsYW5fYWN0X2xvKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBoMmNfcGFyYW1ldGVyX2hpWzFdID17MH07CisJdTggaDJjX3BhcmFtZXRlcl9sb1sxXSA9ezB9OworCWgyY19wYXJhbWV0ZXJfaGlbMF0gPSB3bGFuX2FjdF9oaTsKKwloMmNfcGFyYW1ldGVyX2xvWzBdID0gd2xhbl9hY3RfbG87CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJbQlRDb2V4XSwgU2V0IFdMQU5fQUNUIEhpOkxvPTB4JXgvMHgleFxuIiwgd2xhbl9hY3RfaGksIHdsYW5fYWN0X2xvKSk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCSgiW0JUQ29leF0sIHdyaXRlIDB4MjI9MHgleFxuIiwgaDJjX3BhcmFtZXRlcl9oaVswXSkpOworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkoIltCVENvZXhdLCB3cml0ZSAweDExPTB4JXhcbiIsIGgyY19wYXJhbWV0ZXJfbG9bMF0pKTsKKworCS8qIFdMQU5fQUNUID0gSGlnaCBkdXJhdGlvbiwgdW5pdDptcyAqLworCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIDB4MjIsIDEsIGgyY19wYXJhbWV0ZXJfaGkpOworCS8qICBXTEFOX0FDVCA9IExvdyBkdXJhdGlvbiwgdW5pdDozKjYyNXVzICovCisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgMHgxMSwgMSwgaDJjX3BhcmFtZXRlcl9sbyk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3NldF9idF9kbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGJ0ZG1fODgyMWFlICpwX2J0ZG0pCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdgkqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3ByaXYJKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IGJ0ZG1fODgyMWFlICpwX2J0ZG1fODgyMWFlID0gJmhhbF9jb2V4Xzg4MjFhZS5idGRtOworCXU4IGk7CisKKwlib29sIGJfZndfY3VycmVudF9pbnBzbW9kZSA9IGZhbHNlOworICAgIGJvb2wgYl9md19wc19hd2FrZSA9IHRydWU7CisKKyAgICBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywgSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgKHU4ICopICgmYl9md19jdXJyZW50X2lucHNtb2RlKSk7CisgICAgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9od19yZWcoaHcsIEhXX1ZBUl9GV0xQU19SRl9PTiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAodTggKikgKCZiX2Z3X3BzX2F3YWtlKSk7CisKKwkvLyBjaGVjayBuZXcgc2V0dGluZyBpcyBkaWZmZXJlbnQgd2l0aCB0aGUgb2xkIG9uZSwKKwkvLyBpZiBhbGwgdGhlIHNhbWUsIGRvbid0IGRvIHRoZSBzZXR0aW5nIGFnYWluLgorCWlmIChtZW1jbXAocF9idGRtXzg4MjFhZSwgcF9idGRtLCBzaXplb2Yoc3RydWN0IGJ0ZG1fODgyMWFlKSkgPT0gMCkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIHRoZSBzYW1lIGNvZXhpc3Qgc2V0dGluZywgcmV0dXJuISFcbiIpKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CS8vc2F2ZSB0aGUgbmV3IGNvZXhpc3Qgc2V0dGluZworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIFVQREFURSBUTyBORVcgQ09FWCBTRVRUSU5HISFcbiIpKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYkFsbE9mZj0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPmJfYWxsX29mZiwgcF9idGRtLT5iX2FsbF9vZmYpKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYl9hZ2NfdGFibGVfZW49MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX2FnY190YWJsZV9lbiwgcF9idGRtLT5iX2FnY190YWJsZV9lbikpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBiX2FkY19iYWNrX29mZl9vbj0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPmJfYWRjX2JhY2tfb2ZmX29uLCBwX2J0ZG0tPmJfYWRjX2JhY2tfb2ZmX29uKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IGIyX2FudF9oaWRfZW49MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iMl9hbnRfaGlkX2VuLCBwX2J0ZG0tPmIyX2FudF9oaWRfZW4pKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYkxvd1BlbmFsdHlSYXRlQWRhcHRpdmU9MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX2xvd19wZW5hbHR5X3JhdGVfYWRhcHRpdmUsCisJCQlwX2J0ZG0tPmJfbG93X3BlbmFsdHlfcmF0ZV9hZGFwdGl2ZSkpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBiUmZSeExwZlNocmluaz0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPmJfcmZfcnhfbHBmX3NocmluaywgcF9idGRtLT5iX3JmX3J4X2xwZl9zaHJpbmspKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYlJlamVjdEFnZ3JlUGt0PTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+Yl9yZWplY3RfYWdncmVfcGt0LCBwX2J0ZG0tPmJfcmVqZWN0X2FnZ3JlX3BrdCkpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBiX3RkbWFfb249MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX3RkbWFfb24sIHBfYnRkbS0+Yl90ZG1hX29uKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IHRkbWFBbnQ9MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT50ZG1hX2FudCwgcF9idGRtLT50ZG1hX2FudCkpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyB0ZG1hTmF2PTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+dGRtYV9uYXYsIHBfYnRkbS0+dGRtYV9uYXYpKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgdGRtYV9kYWNfc3dpbmc9MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT50ZG1hX2RhY19zd2luZywgcF9idGRtLT50ZG1hX2RhY19zd2luZykpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBmd19kYWNfc3dpbmdfbHZsPTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+ZndfZGFjX3N3aW5nX2x2bCwgcF9idGRtLT5md19kYWNfc3dpbmdfbHZsKSk7CisKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYlRyYVRkbWFPbj0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPmJfdHJhX3RkbWFfb24sIHBfYnRkbS0+Yl90cmFfdGRtYV9vbikpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyB0cmFUZG1hQW50PTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+dHJhX3RkbWFfYW50LCBwX2J0ZG0tPnRyYV90ZG1hX2FudCkpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyB0cmFUZG1hTmF2PTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+dHJhX3RkbWFfbmF2LCBwX2J0ZG0tPnRyYV90ZG1hX25hdikpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBiUHNUZG1hT249MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX3BzX3RkbWFfb24sIHBfYnRkbS0+Yl9wc190ZG1hX29uKSk7CisJCWZvcihpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgcHNUZG1hQnl0ZVtpXT0weCV4LyAweCV4IFxuIiwKKwkJCQlwX2J0ZG1fODgyMWFlLT5wc190ZG1hX2J5dGVbaV0sIHBfYnRkbS0+cHNfdGRtYV9ieXRlW2ldKSk7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYklnbm9yZVdsYW5BY3Q9MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX2lnbm9yZV93bGFuX2FjdCwgcF9idGRtLT5iX2lnbm9yZV93bGFuX2FjdCkpOworCisKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYlB0YU9uPTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+Yl9wdGFfb24sIHBfYnRkbS0+Yl9wdGFfb24pKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgdmFsXzB4NmMwPTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+dmFsXzB4NmMwLCBwX2J0ZG0tPnZhbF8weDZjMCkpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyB2YWxfMHg2Yzg9MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT52YWxfMHg2YzgsIHBfYnRkbS0+dmFsXzB4NmM4KSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IHZhbF8weDZjYz0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPnZhbF8weDZjYywgcF9idGRtLT52YWxfMHg2Y2MpKTsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBvcmlnaW5hbC9uZXcgYl9zd19kYWNfc3dpbmdfb249MHgleC8gMHgleCBcbiIsCisJCQlwX2J0ZG1fODgyMWFlLT5iX3N3X2RhY19zd2luZ19vbiwgcF9idGRtLT5iX3N3X2RhY19zd2luZ19vbikpOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIG9yaWdpbmFsL25ldyBzd19kYWNfc3dpbmdfbHZsPTB4JXgvIDB4JXggXG4iLAorCQkJcF9idGRtXzg4MjFhZS0+c3dfZGFjX3N3aW5nX2x2bCwgcF9idGRtLT5zd19kYWNfc3dpbmdfbHZsKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IHdsYW5BY3RIaT0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPndsYW5fYWN0X2hpLCBwX2J0ZG0tPndsYW5fYWN0X2hpKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IHdsYW5BY3RMbz0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPndsYW5fYWN0X2xvLCBwX2J0ZG0tPndsYW5fYWN0X2xvKSk7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCQkJKCJbQlRDb2V4XSwgb3JpZ2luYWwvbmV3IGJ0UmV0cnlJbmRleD0weCV4LyAweCV4IFxuIiwKKwkJCXBfYnRkbV84ODIxYWUtPmJ0X3JldHJ5X2luZGV4LCBwX2J0ZG0tPmJ0X3JldHJ5X2luZGV4KSk7CisKKwkJbWVtY3B5KHBfYnRkbV84ODIxYWUsIHBfYnRkbSwgc2l6ZW9mKHN0cnVjdCBidGRtXzg4MjFhZSkpOworCX0KKwkvKgorCSAqIEhlcmUgd2Ugb25seSBjb25zaWRlciB3aGVuIEJ0IE9wZXJhdGlvbgorCSAqIGlucXVpcnkvcGFnaW5nL3BhaXJpbmcgaXMgT04KKwkgKiB3ZSBvbmx5IG5lZWQgdG8gdHVybiBvZmYgVERNQSAqLworCisJaWYgKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX2hvbGRfZm9yX2J0X29wZXJhdGlvbikgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCSgiW0JUQ29leF0sIHNldCB0byBpZ25vcmUgd2xhbkFjdCBmb3IgQlQgT1AhIVxuIikpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2lnbm9yZV93bGFuX2FjdChodywgdHJ1ZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocF9idGRtLT5iX2FsbF9vZmYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsCisJCQkoIltCVENvZXhdLCBkaXNhYmxlIGFsbCBjb2V4aXN0IG1lY2hhbmlzbSAhIVxuIikpOworCQlydGw4ODIxYWVfYnRkbV9jb2V4X2FsbF9vZmYoaHcpOworCQlyZXR1cm47CisJfQorCisJcnRsODgyMWFlX2RtX2J0X3JlamVjdF9hcF9hZ2dyZWdhdGVkX3BhY2tldChodywgcF9idGRtLT5iX3JlamVjdF9hZ2dyZV9wa3QpOworCisJaWYocF9idGRtLT5iX2xvd19wZW5hbHR5X3JhdGVfYWRhcHRpdmUpCisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfc3dfcGVuYWx0eV90eF9yYXRlX2FkYXB0aXZlKGh3LAorCQkJQlRfVFhfUkFURV9BREFQVElWRV9MT1dfUEVOQUxUWSk7CisJZWxzZQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X3N3X3BlbmFsdHlfdHhfcmF0ZV9hZGFwdGl2ZShodywKKwkJCUJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMKTsKKworCWlmKHBfYnRkbS0+Yl9yZl9yeF9scGZfc2hyaW5rKQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoaHcsIEJUX1JGX1JYX0xQRl9DT1JORVJfU0hSSU5LKTsKKwllbHNlCisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfc3dfcmZfcnhfbHBmX2Nvcm5lcihodywgQlRfUkZfUlhfTFBGX0NPUk5FUl9SRVNVTUUpOworCisJaWYocF9idGRtLT5iX2FnY190YWJsZV9lbikKKwkJcnRsODgyMWFlX2RtX2J0X2FnY190YWJsZShodywgQlRfQUdDVEFCTEVfT04pOworCWVsc2UKKwkJcnRsODgyMWFlX2RtX2J0X2FnY190YWJsZShodywgQlRfQUdDVEFCTEVfT0ZGKTsKKworCWlmKHBfYnRkbS0+Yl9hZGNfYmFja19vZmZfb24pCisJCXJ0bDg4MjFhZV9kbV9idF9iYl9iYWNrX29mZl9sZXZlbChodywgQlRfQkJfQkFDS09GRl9PTik7CisJZWxzZQorCQlydGw4ODIxYWVfZG1fYnRfYmJfYmFja19vZmZfbGV2ZWwoaHcsIEJUX0JCX0JBQ0tPRkZfT0ZGKTsKKworCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfcmV0cnlfaW5kZXgoaHcsIHBfYnRkbS0+YnRfcmV0cnlfaW5kZXgpOworCisJcnRsODgyMWFlX2RtX2J0X3NldF9md19kYWNfc3dpbmdfbGV2ZWwoaHcsIHBfYnRkbS0+ZndfZGFjX3N3aW5nX2x2bCk7CisJcnRsODgyMWFlX2RtX2J0X3NldF9md193bGFuX2FjdChodywgcF9idGRtLT53bGFuX2FjdF9oaSwgcF9idGRtLT53bGFuX2FjdF9sbyk7CisKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2NvZXhfdGFibGUoaHcsIHBfYnRkbS0+dmFsXzB4NmMwLAorCQlwX2J0ZG0tPnZhbF8weDZjOCwgcF9idGRtLT52YWxfMHg2Y2MpOworCXJ0bDg4MjFhZV9kbV9idF9zZXRfaHdfcHRhX21vZGUoaHcsIHBfYnRkbS0+Yl9wdGFfb24pOworCisJLyoKKwkgKiBOb3RlOiBUaGVyZSBpcyBhIGNvbnN0cmFpbnQgYmV0d2VlbiBURE1BIGFuZCAyQW50SElECisJICogT25seSBvbmUgb2YgMkFudEhpZCBhbmQgdGRtYSBjYW4gYmUgdHVybiBvbgorCSAqIFdlIHNob3VsZCB0dXJuIG9mZiB0aG9zZSBtZWNoYW5pc21zIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGZpcnN0CisJICogYW5kIHRoZW4gdHVybiBvbiB0aG9zZSBtZWNoYW5pc21zIHNob3VsZCBiZSB0dXJuZWQgb24uCisJKi8KKyNpZiAxCisJaWYocF9idGRtLT5iMl9hbnRfaGlkX2VuKSB7CisJCS8vIHR1cm4gb2ZmIHRkbWEKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190cmFfdGRtYV9jdHJsKGh3LCBwX2J0ZG0tPmJfdHJhX3RkbWFfb24sCisJCQkJCQkJcF9idGRtLT50cmFfdGRtYV9hbnQsIHBfYnRkbS0+dHJhX3RkbWFfbmF2KTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIGZhbHNlLCBwX2J0ZG0tPnRkbWFfYW50LAorCQkJCQkJCXBfYnRkbS0+dGRtYV9uYXYsIHBfYnRkbS0+dGRtYV9kYWNfc3dpbmcpOworCisJCS8vIHR1cm4gb2ZmIFBzdGRtYQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2lnbm9yZV93bGFuX2FjdChodywgcF9idGRtLT5iX2lnbm9yZV93bGFuX2FjdCk7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfM2EoaHcsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsgCS8vIEFudGVubmEgY29udHJvbCBieSBQVEEsIDB4ODcwID0gMHgzMDAuCisKKwkJLy8gdHVybiBvbiAyQW50SGlkCisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfaGlkX2luZm8oaHcsIHRydWUpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZChodywgdHJ1ZSwgdHJ1ZSk7CisJfSBlbHNlIGlmKHBfYnRkbS0+Yl90ZG1hX29uKSB7CisJCS8vIHR1cm4gb2ZmIDJBbnRIaWQKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md19idF9oaWRfaW5mbyhodywgZmFsc2UpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZChodywgZmFsc2UsIGZhbHNlKTsKKworCQkvLyB0dXJuIG9mZiBwc3RkbWEKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md19pZ25vcmVfd2xhbl9hY3QoaHcsIHBfYnRkbS0+Yl9pZ25vcmVfd2xhbl9hY3QpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKGh3LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7IAkvLyBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzAwLgorCisJCS8vIHR1cm4gb24gdGRtYQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoaHcsIHBfYnRkbS0+Yl90cmFfdGRtYV9vbiwgcF9idGRtLT50cmFfdGRtYV9hbnQsIHBfYnRkbS0+dHJhX3RkbWFfbmF2KTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIHRydWUsIHBfYnRkbS0+dGRtYV9hbnQsIHBfYnRkbS0+dGRtYV9uYXYsIHBfYnRkbS0+dGRtYV9kYWNfc3dpbmcpOworCX0gZWxzZSBpZihwX2J0ZG0tPmJfcHNfdGRtYV9vbikgeworCQkvLyB0dXJuIG9mZiAyQW50SGlkCisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfaGlkX2luZm8oaHcsIGZhbHNlKTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md18yX2FudF9oaWQoaHcsIGZhbHNlLCBmYWxzZSk7CisKKwkJLy8gdHVybiBvZmYgdGRtYQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoaHcsIHBfYnRkbS0+Yl90cmFfdGRtYV9vbiwgcF9idGRtLT50cmFfdGRtYV9hbnQsIHBfYnRkbS0+dHJhX3RkbWFfbmF2KTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIGZhbHNlLCBwX2J0ZG0tPnRkbWFfYW50LCBwX2J0ZG0tPnRkbWFfbmF2LCBwX2J0ZG0tPnRkbWFfZGFjX3N3aW5nKTsKKworCQkvLyB0dXJuIG9uIHBzdGRtYQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2lnbm9yZV93bGFuX2FjdChodywgcF9idGRtLT5iX2lnbm9yZV93bGFuX2FjdCk7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfM2EoaHcsCisJCQlwX2J0ZG0tPnBzX3RkbWFfYnl0ZVswXSwKKwkJCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzFdLAorCQkJcF9idGRtLT5wc190ZG1hX2J5dGVbMl0sCisJCQlwX2J0ZG0tPnBzX3RkbWFfYnl0ZVszXSwKKwkJCXBfYnRkbS0+cHNfdGRtYV9ieXRlWzRdKTsKKwl9IGVsc2UgeworCQkvLyB0dXJuIG9mZiAyQW50SGlkCisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfaGlkX2luZm8oaHcsIGZhbHNlKTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md18yX2FudF9oaWQoaHcsIGZhbHNlLCBmYWxzZSk7CisKKwkJLy8gdHVybiBvZmYgdGRtYQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoaHcsIHBfYnRkbS0+Yl90cmFfdGRtYV9vbiwgcF9idGRtLT50cmFfdGRtYV9hbnQsIHBfYnRkbS0+dHJhX3RkbWFfbmF2KTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIGZhbHNlLCBwX2J0ZG0tPnRkbWFfYW50LCBwX2J0ZG0tPnRkbWFfbmF2LCBwX2J0ZG0tPnRkbWFfZGFjX3N3aW5nKTsKKworCQkvLyB0dXJuIG9mZiBwc3RkbWEKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md19pZ25vcmVfd2xhbl9hY3QoaHcsIHBfYnRkbS0+Yl9pZ25vcmVfd2xhbl9hY3QpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKGh3LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7IAkvLyBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzAwLgorCX0KKyNlbHNlCisJaWYgKHBfYnRkbS0+Yl90ZG1hX29uKSB7CisJCWlmKHBfYnRkbS0+Yl9wc190ZG1hX29uKSB7CisJCX0gZWxzZSB7CisJCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKGh3LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CisJCX0KKwkJLyogVHVybiBvZmYgMkFudEhJRCBmaXJzdCB0aGVuIHR1cm4gdGRtYSBPTiAqLworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2J0X2hpZF9pbmZvKGh3LCBmYWxzZSk7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfMl9hbnRfaGlkKGh3LCBmYWxzZSwgZmFsc2UpOworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoaHcsIHBfYnRkbS0+Yl90cmFfdGRtYV9vbiwgcF9idGRtLT50cmFfdGRtYV9hbnQsIHBfYnRkbS0+dHJhX3RkbWFfbmF2KTsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIHRydWUsCisJCQlwX2J0ZG0tPnRkbWFfYW50LCBwX2J0ZG0tPnRkbWFfbmF2LCBwX2J0ZG0tPnRkbWFfZGFjX3N3aW5nKTsKKwl9IGVsc2UgeworCQkvKiBUdXJuIG9mZiB0ZG1hIGZpcnN0IHRoZW4gdHVybiAyQW50SElEIE9OIGlmIG5lZWQgKi8KKwkJcnRsODgyMWFlX2RtX2J0X3NldF9md190cmFfdGRtYV9jdHJsKGh3LCBwX2J0ZG0tPmJfdHJhX3RkbWFfb24sIHBfYnRkbS0+dHJhX3RkbWFfYW50LCBwX2J0ZG0tPnRyYV90ZG1hX25hdik7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfdGRtYV9jdHJsKGh3LCBmYWxzZSwgcF9idGRtLT50ZG1hX2FudCwKKwkJCXBfYnRkbS0+dGRtYV9uYXYsIHBfYnRkbS0+dGRtYV9kYWNfc3dpbmcpOworCQlpZiAocF9idGRtLT5iMl9hbnRfaGlkX2VuKSB7CisJCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2J0X2hpZF9pbmZvKGh3LCB0cnVlKTsKKwkJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfMl9hbnRfaGlkKGh3LCB0cnVlLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfYnRfaGlkX2luZm8oaHcsIGZhbHNlKTsKKwkJCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfMl9hbnRfaGlkKGh3LCBmYWxzZSwgZmFsc2UpOworCQl9CisJCWlmKHBfYnRkbS0+Yl9wc190ZG1hX29uKSB7CisJCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKGh3LCBwX2J0ZG0tPnBzX3RkbWFfYnl0ZVswXSwgcF9idGRtLT5wc190ZG1hX2J5dGVbMV0sCisJCQkJcF9idGRtLT5wc190ZG1hX2J5dGVbMl0sIHBfYnRkbS0+cHNfdGRtYV9ieXRlWzNdLCBwX2J0ZG0tPnBzX3RkbWFfYnl0ZVs0XSk7CisJCX0gZWxzZSB7CisJCQlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzNhKGh3LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogTm90ZToKKwkgKiBXZSBzaG91bGQgYWRkIGRlbGF5IGZvciBtYWtpbmcgc3VyZSBzdyBEYWNTd2luZyBjYW4gYmUgc2V0IHN1Y2Vzc2Z1bGx5LgorCSAqIGJlY2F1c2Ugb2YgdGhhdCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZCgpIGFuZCBydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RkbWFfY3RybCgpCisJICogd2lsbCBvdmVyd3JpdGUgdGhlIHJlZyAweDg4MC4KKwkqLworCW1kZWxheSgzMCk7CisJcnRsODgyMWFlX2RtX2J0X3NldF9zd19mdWxsX3RpbWVfZGFjX3N3aW5nKGh3LAorCQlwX2J0ZG0tPmJfc3dfZGFjX3N3aW5nX29uLCBwX2J0ZG0tPnN3X2RhY19zd2luZ19sdmwpOworCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfZGVjX2J0X3B3cihodywgcF9idGRtLT5iX2RlY19idF9wd3IpOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9idF9zdGF0ZV91cGRhdGVfMl9hbnRfaGlkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBidXN5ISFcbiIpKTsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9idF9idXN5ID0gdHJ1ZTsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9JRExFOworfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9idF9zdGF0ZV91cGRhdGVfMl9hbnRfcGFuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCWJvb2wgYl9pZGxlID0gZmFsc2U7CisKKwlpZiAoaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV90eCA+PQorCQloYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3J4KSB7CisJCWlmKChoYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3R4LworCQkJaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV9yeCkgPiAxMCkgeworCQkJYl9pZGxlID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmKChoYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3J4LworCQkJaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV90eCkgPiAxMCkgeworCQkJYl9pZGxlID0gdHJ1ZTsKKwkJfQorCX0KKworCWlmKCFiX2lkbGUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIFBBTiBidXN5ISFcbiIpKTsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfYnRfYnVzeSA9IHRydWU7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX0lETEU7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIFBBTiBpZGxlISFcbiIpKTsKKwl9Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0XzJfYW50X3Njb19hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IGJ0ZG1fODgyMWFlIGJ0ZG04ODIxYWU7CisJdTggYnRfcnNzaV9zdGF0ZTsKKworCXJ0bDg4MjFhZV9kbV9idF9idGRtX3N0cnVjdHVyZV9yZWxvYWQoaHcsICZidGRtODgyMWFlKTsKKwlidGRtODgyMWFlLmJfcmZfcnhfbHBmX3NocmluayA9IHRydWU7CisJYnRkbTg4MjFhZS5iX2xvd19wZW5hbHR5X3JhdGVfYWRhcHRpdmUgPSB0cnVlOworCWJ0ZG04ODIxYWUuYl9yZWplY3RfYWdncmVfcGt0ID0gZmFsc2U7CisKKwlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJIVDQwXG4iKSk7CisJCS8qICBjb2V4IHRhYmxlICovCisJCWJ0ZG04ODIxYWUudmFsXzB4NmMwID0gMHg1YTVhYWFhYTsKKwkJYnRkbTg4MjFhZS52YWxfMHg2YzggPSAweGNjOworCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKwkJLyogc3cgbWVjaGFuaXNtICovCisJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IHRydWU7CisJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJLyogZncgbWVjaGFuaXNtICovCisJCWJ0ZG04ODIxYWUuYl90ZG1hX29uID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PRkY7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKKwkJYnRfcnNzaV9zdGF0ZQorCQkJPSBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKGh3LCAyLCBCVF9GV19DT0VYX1RIUkVTSF80NywgMCk7CisKKwkJLyogY29leCB0YWJsZSAqLworCQlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NWE1YWFhYWE7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmM4ID0gMHhjYzsKKwkJYnRkbTg4MjFhZS52YWxfMHg2Y2MgPSAweDM7CisJCS8qIHN3IG1lY2hhbmlzbSAqLworCQlpZiAoKGJ0X3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKGJ0X3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkgeworCQkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IHRydWU7CisJCQlidGRtODgyMWFlLmJfYWRjX2JhY2tfb2ZmX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJfQorCQkvKiBmdyBtZWNoYW5pc20gKi8KKwkJYnRkbTg4MjFhZS5iX3RkbWFfb24gPSBmYWxzZTsKKwkJYnRkbTg4MjFhZS50ZG1hX2RhY19zd2luZyA9IFRETUFfREFDX1NXSU5HX09GRjsKKwl9CisKKwlpZiAocnRsODgyMWFlX2RtX2J0X25lZWRfdG9fZGVjX2J0X3B3cihodykpIHsKKwkJYnRkbTg4MjFhZS5iX2RlY19idF9wd3IgPSB0cnVlOworCX0KKworCWlmKHJ0bDg4MjFhZV9kbV9idF9pc19jb2V4aXN0X3N0YXRlX2NoYW5nZWQoaHcpKQorCQlydGw4ODIxYWVfZG1fYnRfc2V0X2J0X2RtKGh3LCAmYnRkbTg4MjFhZSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0XzJfYW50X2hpZF9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IGJ0ZG1fODgyMWFlIGJ0ZG04ODIxYWU7CisJdTggYnRfcnNzaV9zdGF0ZTsKKworCXJ0bDg4MjFhZV9kbV9idF9idGRtX3N0cnVjdHVyZV9yZWxvYWQoaHcsICZidGRtODgyMWFlKTsKKworCWJ0ZG04ODIxYWUuYl9yZl9yeF9scGZfc2hyaW5rID0gdHJ1ZTsKKwlidGRtODgyMWFlLmJfbG93X3BlbmFsdHlfcmF0ZV9hZGFwdGl2ZSA9IHRydWU7CisJYnRkbTg4MjFhZS5iX3JlamVjdF9hZ2dyZV9wa3QgPSBmYWxzZTsKKworCS8vIGNvZXggdGFibGUKKwlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NTU1NTU1NTU7CisJYnRkbTg4MjFhZS52YWxfMHg2YzggPSAweGZmZmY7CisJYnRkbTg4MjFhZS52YWxfMHg2Y2MgPSAweDM7CisJYnRkbTg4MjFhZS5iX2lnbm9yZV93bGFuX2FjdCA9IHRydWU7CisKKwlpZihydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIkhUNDBcbiIpKTsKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQlidGRtODgyMWFlLmJfc3dfZGFjX3N3aW5nX29uID0gZmFsc2U7CisKKwkJLy8gZncgbWVjaGFuaXNtCisJCWJ0ZG04ODIxYWUuYl9wc190ZG1hX29uID0gdHJ1ZTsKKwkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4ZjsKKwkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGY7CisJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHgwOworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisKKwkJYnRkbTg4MjFhZS5iX3RyYV90ZG1hX29uID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUuYl90ZG1hX29uID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PRkY7CisJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IGZhbHNlOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7CisJCWJ0X3Jzc2lfc3RhdGUgPQorCQkJcnRsODgyMWFlX2RtX2J0X2NoZWNrX2NvZXhfcnNzaV9zdGF0ZShodywgMiwgNDcsIDApOworCisJCWlmKCAoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKKwkJCS8vIHN3IG1lY2hhbmlzbQorCQkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IHRydWU7CisJCQlidGRtODgyMWFlLnN3X2RhY19zd2luZ19sdmwgPSAweDIwOworCisJCQkvLyBmdyBtZWNoYW5pc20KKwkJCWJ0ZG04ODIxYWUuYl9wc190ZG1hX29uID0gZmFsc2U7CisJCQlidGRtODgyMWFlLmJfdGRtYV9vbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS50ZG1hX2RhY19zd2luZyA9IFRETUFfREFDX1NXSU5HX09GRjsKKwkJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKKwkJCS8vIHN3IG1lY2hhbmlzbQorCQkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCisJCQkvLyBmdyBtZWNoYW5pc20KKwkJCWJ0ZG04ODIxYWUuYl9wc190ZG1hX29uID0gZmFsc2U7CisJCQlidGRtODgyMWFlLmJfdGRtYV9vbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS50ZG1hX2RhY19zd2luZyA9IFRETUFfREFDX1NXSU5HX09GRjsKKwkJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IHRydWU7CisJCQlidGRtODgyMWFlLmZ3X2RhY19zd2luZ19sdmwgPSAweDIwOworCQl9CisJfQorCisJaWYgKHJ0bDg4MjFhZV9kbV9idF9uZWVkX3RvX2RlY19idF9wd3IoaHcpKSB7CisJCWJ0ZG04ODIxYWUuYl9kZWNfYnRfcHdyID0gdHJ1ZTsKKwl9CisKKwlpZiAocnRsODgyMWFlX2RtX2J0X2lzX2NvZXhpc3Rfc3RhdGVfY2hhbmdlZChodykpIHsKKwkJcnRsODgyMWFlX2RtX2J0X3NldF9idF9kbShodywgJmJ0ZG04ODIxYWUpOworCX0KK30KKworCit2b2lkIHJ0bDg4MjFhZV9kbV9idF8yX2FudF8yX2RwX2FjdGlvbl9ub19wcm9maWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBidGRtXzg4MjFhZSBidGRtODgyMWFlOworCXU4IGJ0X3Jzc2lfc3RhdGU7CisKKwlydGw4ODIxYWVfZG1fYnRfYnRkbV9zdHJ1Y3R1cmVfcmVsb2FkKGh3LCAmYnRkbTg4MjFhZSk7CisKKwlidGRtODgyMWFlLmJfcmZfcnhfbHBmX3NocmluayA9IHRydWU7CisJYnRkbTg4MjFhZS5iX2xvd19wZW5hbHR5X3JhdGVfYWRhcHRpdmUgPSB0cnVlOworCWJ0ZG04ODIxYWUuYl9yZWplY3RfYWdncmVfcGt0ID0gZmFsc2U7CisKKwlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJIVDQwXG4iKSk7CisJCWlmIChydGw4ODIxYWVfZG1fYnRfaXNfd2lmaV91cF9saW5rKGh3KSkgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiV2lmaSBVcGxpbmtcbiIpKTsKKwkJCS8qIGNvZXggdGFibGUgKi8KKwkJCWJ0ZG04ODIxYWUudmFsXzB4NmMwID0gMHg1YTVhNWE1YTsKKwkJCWJ0ZG04ODIxYWUudmFsXzB4NmM4ID0gMHhjY2NjOworCQkJYnRkbTg4MjFhZS52YWxfMHg2Y2MgPSAweDM7CisJCQkvLyBzdyBtZWNoYW5pc20KKwkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCQkJLy8gZncgbWVjaGFuaXNtCisJCQlidGRtODgyMWFlLmJfdHJhX3RkbWFfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS5iX3RkbWFfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS50ZG1hX2RhY19zd2luZyA9IFRETUFfREFDX1NXSU5HX09OOworCQkJYnRkbTg4MjFhZS5iMl9hbnRfaGlkX2VuID0gZmFsc2U7CisJCQkvL2J0U3BlYyA9IEJUSENJX0dldEJUQ29yZVNwZWNCeVByb2YoQWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKTsKKwkJCS8vaWYoYnRTcGVjID49IEJUX1NQRUNfMl8xX0VEUikKKwkJCXsKKwkJCQlidGRtODgyMWFlLndsYW5fYWN0X2hpID0gMHgxMDsKKwkJCQlidGRtODgyMWFlLndsYW5fYWN0X2xvID0gMHgxMDsKKwkJCX0KKwkJCS8vZWxzZQorCQkJLy97CisJCQkJLy9idGRtODgyMWFlLndsYW5BY3RIaSA9IDB4MjA7CisJCQkJLy9idGRtODgyMWFlLndsYW5BY3RMbyA9IDB4MjA7CisJCQkvL30KKwkJCWJ0ZG04ODIxYWUuYnRfcmV0cnlfaW5kZXggPSAyOworCQkJYnRkbTg4MjFhZS5md19kYWNfc3dpbmdfbHZsID0gMHgxODsKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIldpZmkgRG93bmxpbmtcbiIpKTsKKwkJCS8vIGNvZXggdGFibGUKKwkJCWJ0ZG04ODIxYWUudmFsXzB4NmMwID0gMHg1YTVhNWE1YTsKKwkJCWJ0ZG04ODIxYWUudmFsXzB4NmM4ID0gMHhjYzsKKwkJCWJ0ZG04ODIxYWUudmFsXzB4NmNjID0gMHgzOworCQkJLy8gc3cgbWVjaGFuaXNtCisJCQlidGRtODgyMWFlLmJfYWdjX3RhYmxlX2VuID0gZmFsc2U7CisJCQlidGRtODgyMWFlLmJfYWRjX2JhY2tfb2ZmX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJCS8vIGZ3IG1lY2hhbmlzbQorCQkJYnRkbTg4MjFhZS5iX3RyYV90ZG1hX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl90ZG1hX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PTjsKKwkJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IGZhbHNlOworCQkJLy9idFNwZWMgPSBCVEhDSV9HZXRCVENvcmVTcGVjQnlQcm9mKEFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCk7CisJCQkvL2lmKGJ0U3BlYyA+PSBCVF9TUEVDXzJfMV9FRFIpCisJCQl7CisJCQkJYnRkbTg4MjFhZS53bGFuX2FjdF9oaSA9IDB4MTA7CisJCQkJYnRkbTg4MjFhZS53bGFuX2FjdF9sbyA9IDB4MTA7CisJCQl9CisJCQkvL2Vsc2UKKwkJCS8veworCQkJLy8JYnRkbTg4MjFhZS53bGFuQWN0SGkgPSAweDIwOworCQkJLy8JYnRkbTg4MjFhZS53bGFuQWN0TG8gPSAweDIwOworCQkJLy99CisJCQlidGRtODgyMWFlLmJ0X3JldHJ5X2luZGV4ID0gMjsKKwkJCWJ0ZG04ODIxYWUuZndfZGFjX3N3aW5nX2x2bCA9IDB4NDA7CisJCX0KKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOworCQlidF9yc3NpX3N0YXRlID0gcnRsODgyMWFlX2RtX2J0X2NoZWNrX2NvZXhfcnNzaV9zdGF0ZShodywgMiwgQlRfRldfQ09FWF9USFJFU0hfNDcsIDApOworCisJCWlmKHJ0bDg4MjFhZV9kbV9idF9pc193aWZpX3VwX2xpbmsoaHcpKQorCQl7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJXaWZpIFVwbGlua1xuIikpOworCQkJLy8gY29leCB0YWJsZQorCQkJYnRkbTg4MjFhZS52YWxfMHg2YzAgPSAweDVhNWE1YTVhOworCQkJYnRkbTg4MjFhZS52YWxfMHg2YzggPSAweGNjY2M7CisJCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKwkJCS8vIHN3IG1lY2hhbmlzbQorCQkJaWYoIChidF9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCQkoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOworCQkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSB0cnVlOworCQkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSB0cnVlOworCQkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKKwkJCQlidGRtODgyMWFlLmJfYWdjX3RhYmxlX2VuID0gZmFsc2U7CisJCQkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJCX0KKwkJCS8vIGZ3IG1lY2hhbmlzbQorCQkJYnRkbTg4MjFhZS5iX3RyYV90ZG1hX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl90ZG1hX29uID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUudGRtYV9kYWNfc3dpbmcgPSBURE1BX0RBQ19TV0lOR19PTjsKKwkJCWJ0ZG04ODIxYWUuYjJfYW50X2hpZF9lbiA9IGZhbHNlOworCQkJLy9idFNwZWMgPSBCVEhDSV9HZXRCVENvcmVTcGVjQnlQcm9mKEFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCk7CisJCQkvL2lmKGJ0U3BlYyA+PSBCVF9TUEVDXzJfMV9FRFIpCisJCQl7CisJCQkJYnRkbTg4MjFhZS53bGFuX2FjdF9oaSA9IDB4MTA7CisJCQkJYnRkbTg4MjFhZS53bGFuX2FjdF9sbyA9IDB4MTA7CisJCQl9CisJCQkvL2Vsc2UKKwkJCS8veworCQkJCS8vYnRkbTg4MjFhZS53bGFuQWN0SGkgPSAweDIwOworCQkJCS8vYnRkbTg4MjFhZS53bGFuQWN0TG8gPSAweDIwOworCQkJLy99CisJCQlidGRtODgyMWFlLmJ0X3JldHJ5X2luZGV4ID0gMjsKKwkJCWJ0ZG04ODIxYWUuZndfZGFjX3N3aW5nX2x2bCA9IDB4MTg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJXaWZpIERvd25saW5rXG4iKSk7CisJCQkvLyBjb2V4IHRhYmxlCisJCQlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NWE1YTVhNWE7CisJCQlidGRtODgyMWFlLnZhbF8weDZjOCA9IDB4Y2M7CisJCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKwkJCS8vIHN3IG1lY2hhbmlzbQorCQkJaWYoIChidF9yc3NpX3N0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKKwkJCQkoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOworCQkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSB0cnVlOworCQkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSB0cnVlOworCQkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOworCQkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJCQlidGRtODgyMWFlLmJfYWRjX2JhY2tfb2ZmX29uID0gZmFsc2U7CisJCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCQkJfQorCQkJLy8gZncgbWVjaGFuaXNtCisJCQlidGRtODgyMWFlLmJfdHJhX3RkbWFfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS5iX3RkbWFfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS50ZG1hX2RhY19zd2luZyA9IFRETUFfREFDX1NXSU5HX09OOworCQkJYnRkbTg4MjFhZS5iMl9hbnRfaGlkX2VuID0gZmFsc2U7CisJCQkvL2J0U3BlYyA9IEJUSENJX0dldEJUQ29yZVNwZWNCeVByb2YoQWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKTsKKwkJCS8vaWYoYnRTcGVjID49IEJUX1NQRUNfMl8xX0VEUikKKwkJCXsKKwkJCQlidGRtODgyMWFlLndsYW5fYWN0X2hpID0gMHgxMDsKKwkJCQlidGRtODgyMWFlLndsYW5fYWN0X2xvID0gMHgxMDsKKwkJCX0KKwkJCS8vZWxzZQorCQkJLy97CisJCQkJLy9idGRtODgyMWFlLndsYW5BY3RIaSA9IDB4MjA7CisJCQkJLy9idGRtODgyMWFlLndsYW5BY3RMbyA9IDB4MjA7CisJCQkvL30KKwkJCWJ0ZG04ODIxYWUuYnRfcmV0cnlfaW5kZXggPSAyOworCQkJYnRkbTg4MjFhZS5md19kYWNfc3dpbmdfbHZsID0gMHg0MDsKKwkJfQorCX0KKworCWlmIChydGw4ODIxYWVfZG1fYnRfbmVlZF90b19kZWNfYnRfcHdyKGh3KSkgeworCQlidGRtODgyMWFlLmJfZGVjX2J0X3B3ciA9IHRydWU7CisJfQorCisJaWYgKHJ0bDg4MjFhZV9kbV9idF9pc19jb2V4aXN0X3N0YXRlX2NoYW5nZWQoaHcpKSB7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfYnRfZG0oaHcsICZidGRtODgyMWFlKTsKKwl9Cit9CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEJURE1fCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordTMyIHJ0bDg4MjFhZV9kbV9idF90eF9yeF9jb3V0ZXJfaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1MzIJY291bnRlcnM9MDsKKworCWNvdW50ZXJzID0gaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfdHggKyBoYWxfY29leF84ODIxYWUuaGlnaF9wcmlvcml0eV9yeCA7CisJcmV0dXJuIGNvdW50ZXJzOworfQorCit1MzIgcnRsODgyMWFlX2RtX2J0X3R4X3J4X2NvdXRlcl9sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXUzMiBjb3VudGVycz0wOworCisJY291bnRlcnMgPSBoYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3R4ICsgaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV9yeCA7CisJcmV0dXJuIGNvdW50ZXJzOworfQorCit1OCBydGw4ODIxYWVfZG1fYnRfYnRfdHhfcnhfY291bnRlcl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwl1MzIJYnRfdHhfcnhfY250ID0gMDsKKwl1OAlidF90eF9yeF9jbnRfbHZsID0gMDsKKworCWJ0X3R4X3J4X2NudCA9IHJ0bDg4MjFhZV9kbV9idF90eF9yeF9jb3V0ZXJfaChodykKKwkJCQkrIHJ0bDg4MjFhZV9kbV9idF90eF9yeF9jb3V0ZXJfbChodyk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCSgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPSAlZFxuIiwgYnRfdHhfcnhfY250KSk7CisKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZV9oICY9IH5cCisJCSAoQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMCB8IEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzF8CisJCSAgQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMik7CisKKwlpZiAoYnRfdHhfcnhfY250ID49IEJUX1RYUlhfQ05UX1RIUkVTXzMpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzIGF0IGxldmVsIDNcbiIpKTsKKwkJYnRfdHhfcnhfY250X2x2bCA9IEJUX1RYUlhfQ05UX0xFVkVMXzM7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2ggfD0gQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMzsKKwl9IGVsc2UgaWYoYnRfdHhfcnhfY250ID49IEJUX1RYUlhfQ05UX1RIUkVTXzIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzIGF0IGxldmVsIDJcbiIpKTsKKwkJYnRfdHhfcnhfY250X2x2bCA9IEJUX1RYUlhfQ05UX0xFVkVMXzI7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2ggfD0gQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMjsKKwl9IGVsc2UgaWYoYnRfdHhfcnhfY250ID49IEJUX1RYUlhfQ05UX1RIUkVTXzEpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzIGF0IGxldmVsIDFcbiIpKTsKKwkJYnRfdHhfcnhfY250X2x2bCA9IEJUX1RYUlhfQ05UX0xFVkVMXzE7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2ggIHw9IEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzE7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzIGF0IGxldmVsIDBcbiIpKTsKKwkJYnRfdHhfcnhfY250X2x2bCA9IEJUX1RYUlhfQ05UX0xFVkVMXzA7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlX2ggfD0gQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMDsKKwl9CisJcmV0dXJuIGJ0X3R4X3J4X2NudF9sdmw7Cit9CisKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfMl9hbnRfaGlkX3Njb19lc2NvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBidGRtXzg4MjFhZSBidGRtODgyMWFlOworCisJdTggYnRfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTE7CisJdTgJYnRfdHhfcnhfY250X2x2bCA9IDA7CisKKwlydGw4ODIxYWVfZG1fYnRfYnRkbV9zdHJ1Y3R1cmVfcmVsb2FkKGh3LCAmYnRkbTg4MjFhZSk7CisKKworCWJ0ZG04ODIxYWUuYl9yZl9yeF9scGZfc2hyaW5rID0gdHJ1ZTsKKwlidGRtODgyMWFlLmJfbG93X3BlbmFsdHlfcmF0ZV9hZGFwdGl2ZSA9IHRydWU7CisJYnRkbTg4MjFhZS5iX3JlamVjdF9hZ2dyZV9wa3QgPSBmYWxzZTsKKworCWJ0X3R4X3J4X2NudF9sdmwgPSBydGw4ODIxYWVfZG1fYnRfYnRfdHhfcnhfY291bnRlcl9sZXZlbChodyk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPSAlZFxuIiwgYnRfdHhfcnhfY250X2x2bCkpOworCisJaWYocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkKKwl7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIkhUNDBcbiIpKTsKKwkJLy8gY29leCB0YWJsZQorCQlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NTU1NTU1NTU7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmM4ID0gMHhmZmZmOworCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKworCQkvLyBzdyBtZWNoYW5pc20KKwkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IGZhbHNlOworCQlidGRtODgyMWFlLmJfYWRjX2JhY2tfb2ZmX29uID0gZmFsc2U7CisJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKworCQkvLyBmdyBtZWNoYW5pc20KKwkJYnRkbTg4MjFhZS5iX3BzX3RkbWFfb24gPSB0cnVlOworCQlpZiAoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8yKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA+PSAxNDAwXG4iKSk7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4NTsKKwkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHg1OworCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDI7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCX0gZWxzZSBpZihidF90eF9yeF9jbnRfbHZsID09IEJUX1RYUlhfQ05UX0xFVkVMXzEpIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzID49IDEyMDAgJiYgPCAxNDAwXG4iKSk7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4YTsKKwkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHhhOworCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDI7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA8IDEyMDBcbiIpKTsKKwkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHhmOworCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGY7CisJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4MjsKKwkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzRdID0gMHg4MDsKKwkJfQorCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7CisJCWJ0X3Jzc2lfc3RhdGUgPSBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKGh3LCAyLCA0NywgMCk7CisJCWJ0X3Jzc2lfc3RhdGUxID0gcnRsODgyMWFlX2RtX2J0X2NoZWNrX2NvZXhfcnNzaV9zdGF0ZTEoaHcsIDIsIDI3LCAwKTsKKworCQkvLyBjb2V4IHRhYmxlCisJCWJ0ZG04ODIxYWUudmFsXzB4NmMwID0gMHg1NTU1NTU1NTsKKwkJYnRkbTg4MjFhZS52YWxfMHg2YzggPSAweGZmZmY7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmNjID0gMHgzOworCisJCS8vIHN3IG1lY2hhbmlzbQorCQlpZiggKGJ0X3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKGJ0X3Jzc2lfc3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7CisJCQlidGRtODgyMWFlLmJfYWdjX3RhYmxlX2VuID0gdHJ1ZTsKKwkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSB0cnVlOworCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKKwkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9hZGNfYmFja19vZmZfb24gPSBmYWxzZTsKKwkJCWJ0ZG04ODIxYWUuYl9zd19kYWNfc3dpbmdfb24gPSBmYWxzZTsKKwkJfQorCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlidGRtODgyMWFlLmJfcHNfdGRtYV9vbiA9IHRydWU7CisJCWlmKCAoYnRfcnNzaV9zdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAorCQkJKGJ0X3Jzc2lfc3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKKwkJCS8vIG9ubHkgcnNzaSBoaWdoIHdlIG5lZWQgdG8gZG8gdGhpcywKKwkJCS8vIHdoZW4gcnNzaSBsb3csIHRoZSB2YWx1ZSB3aWxsIG1vZGlmaWVkIGJ5IGZ3CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDg4MywgMHg0MCk7CisJCQlpZihidF90eF9yeF9jbnRfbHZsID09IEJUX1RYUlhfQ05UX0xFVkVMXzIpIHsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA+PSAxNDAwXG4iKSk7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHg1OworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHg1OworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHg4MzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8xKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTIwMCAmJiA8IDE0MDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDgzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzRdID0gMHg4MDsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPCAxMjAwXG4iKSk7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHhmOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHhmOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHg4MzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7CisJCQlpZihidF90eF9yeF9jbnRfbHZsID09IEJUX1RYUlhfQ05UX0xFVkVMXzIpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTQwMFxuIikpOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4MjsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8xKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTIwMCAmJiA8IDE0MDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDI7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA8IDEyMDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDI7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfQorCQl9CisJfQorCisJaWYgKHJ0bDg4MjFhZV9kbV9idF9uZWVkX3RvX2RlY19idF9wd3IoaHcpKSB7CisJCWJ0ZG04ODIxYWUuYl9kZWNfYnRfcHdyID0gdHJ1ZTsKKwl9CisKKwkvLyBBbHdheXMgaWdub3JlIFdsYW5BY3QgaWYgYkhpZHxiU0NPQnVzeXxiU0NPZVNDTworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCSgiW0JUQ29leF0sIEJUIGJ0SW5xUGFnZVN0YXJ0VGltZSA9IDB4JXgsIGJ0VHhSeENudEx2bCA9ICVkXG4iLAorCQloYWxfY29leF84ODIxYWUuYnRfaW5xX3BhZ2Vfc3RhcnRfdGltZSwgYnRfdHhfcnhfY250X2x2bCkpOworCWlmKCAoaGFsX2NvZXhfODgyMWFlLmJ0X2lucV9wYWdlX3N0YXJ0X3RpbWUpIHx8CisJCShCVF9UWFJYX0NOVF9MRVZFTF8zID09IGJ0X3R4X3J4X2NudF9sdmwpICkgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCSgiW0JUQ29leF0sIFNldCBCVCBpbnF1aXJ5IC8gcGFnZSBzY2FuIDB4M2Egc2V0dGluZ1xuIikpOworCQlidGRtODgyMWFlLmJfcHNfdGRtYV9vbiA9IHRydWU7CisJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweDU7CisJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHg1OworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4MjsKKwkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCX0KKworCWlmKHJ0bDg4MjFhZV9kbV9idF9pc19jb2V4aXN0X3N0YXRlX2NoYW5nZWQoaHcpKSB7CisJCXJ0bDg4MjFhZV9kbV9idF9zZXRfYnRfZG0oaHcsICZidGRtODgyMWFlKTsKKwl9Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0XzJfYW50X2Z0cF9hMmRwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBidGRtXzg4MjFhZSBidGRtODgyMWFlOworCisJdTggYnRfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTE7CisJdTMyIGJ0X3R4X3J4X2NudF9sdmwgPSAwOworCisJcnRsODgyMWFlX2RtX2J0X2J0ZG1fc3RydWN0dXJlX3JlbG9hZChodywgJmJ0ZG04ODIxYWUpOworCisJYnRkbTg4MjFhZS5iX3JmX3J4X2xwZl9zaHJpbmsgPSB0cnVlOworCWJ0ZG04ODIxYWUuYl9sb3dfcGVuYWx0eV9yYXRlX2FkYXB0aXZlID0gdHJ1ZTsKKwlidGRtODgyMWFlLmJfcmVqZWN0X2FnZ3JlX3BrdCA9IGZhbHNlOworCisJYnRfdHhfcnhfY250X2x2bCA9IHJ0bDg4MjFhZV9kbV9idF9idF90eF9yeF9jb3VudGVyX2xldmVsKGh3KTsKKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzID0gJWRcbiIsIGJ0X3R4X3J4X2NudF9sdmwpKTsKKworCWlmKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApCisJeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJIVDQwXG4iKSk7CisJCWJ0X3Jzc2lfc3RhdGUgPSBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKGh3LCAyLCAzNywgMCk7CisKKwkJLy8gY29leCB0YWJsZQorCQlidGRtODgyMWFlLnZhbF8weDZjMCA9IDB4NTU1NTU1NTU7CisJCWJ0ZG04ODIxYWUudmFsXzB4NmM4ID0gMHhmZmZmOworCQlidGRtODgyMWFlLnZhbF8weDZjYyA9IDB4MzsKKworCQkvLyBzdyBtZWNoYW5pc20KKwkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IGZhbHNlOworCQlidGRtODgyMWFlLmJfYWRjX2JhY2tfb2ZmX29uID0gdHJ1ZTsKKwkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCisJCS8vIGZ3IG1lY2hhbmlzbQorCQlidGRtODgyMWFlLmJfcHNfdGRtYV9vbiA9IHRydWU7CisJCWlmICgoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKKwkJCWlmIChidF90eF9yeF9jbnRfbHZsID09IEJUX1RYUlhfQ05UX0xFVkVMXzIpIHsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA+PSAxNDAwXG4iKSk7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHg1OworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHg1OworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHg4MTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8xKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTIwMCAmJiA8IDE0MDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDgxOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzRdID0gMHg4MDsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPCAxMjAwXG4iKSk7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHhmOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHhmOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHg4MTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2kgbG93IFxuIikpOworCQkJaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8yKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTQwMFxuIikpOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4MDsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8xKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTIwMCAmJiA8IDE0MDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDA7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA8IDEyMDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDA7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKKwkJYnRfcnNzaV9zdGF0ZSA9IHJ0bDg4MjFhZV9kbV9idF9jaGVja19jb2V4X3Jzc2lfc3RhdGUoaHcsIDIsIDQ3LCAwKTsKKwkJYnRfcnNzaV9zdGF0ZTEgPSBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlMShodywgMiwgMjcsIDApOworCisJCS8vIGNvZXggdGFibGUKKwkJYnRkbTg4MjFhZS52YWxfMHg2YzAgPSAweDU1NTU1NTU1OworCQlidGRtODgyMWFlLnZhbF8weDZjOCA9IDB4ZmZmZjsKKwkJYnRkbTg4MjFhZS52YWxfMHg2Y2MgPSAweDM7CisKKwkJLy8gc3cgbWVjaGFuaXNtCisJCWlmKCAoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkoYnRfcnNzaV9zdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKKwkJCWJ0ZG04ODIxYWUuYl9hZ2NfdGFibGVfZW4gPSB0cnVlOworCQkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IHRydWU7CisJCQlidGRtODgyMWFlLmJfc3dfZGFjX3N3aW5nX29uID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJXaWZpIHJzc2kgbG93IFxuIikpOworCQkJYnRkbTg4MjFhZS5iX2FnY190YWJsZV9lbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX2FkY19iYWNrX29mZl9vbiA9IGZhbHNlOworCQkJYnRkbTg4MjFhZS5iX3N3X2RhY19zd2luZ19vbiA9IGZhbHNlOworCQl9CisKKwkJLy8gZncgbWVjaGFuaXNtCisJCWJ0ZG04ODIxYWUuYl9wc190ZG1hX29uID0gdHJ1ZTsKKwkJaWYoIChidF9yc3NpX3N0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8CisJCQkoYnRfcnNzaV9zdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKKwkJCS8vIG9ubHkgcnNzaSBoaWdoIHdlIG5lZWQgdG8gZG8gdGhpcywKKwkJCS8vIHdoZW4gcnNzaSBsb3csIHRoZSB2YWx1ZSB3aWxsIG1vZGlmaWVkIGJ5IGZ3CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDg4MywgMHg0MCk7CisJCQlpZiAoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8yKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTQwMFxuIikpOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4ODE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfSBlbHNlIGlmKGJ0X3R4X3J4X2NudF9sdmwgPT0gQlRfVFhSWF9DTlRfTEVWRUxfMSkgeworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzID49IDEyMDAgJiYgPCAxNDAwXG4iKSk7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMF0gPSAweGEzOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHhhOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzJdID0gMHhhOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzNdID0gMHg4MTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgeworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzIDwgMTIwMFxuIikpOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4ZjsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4ZjsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4ODE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfQorCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiV2lmaSByc3NpLTEgbG93IFxuIikpOworCQkJaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8yKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTQwMFxuIikpOworCQkJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzBdID0gMHhhMzsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsxXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4NTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVszXSA9IDB4MDsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJCQl9IGVsc2UgaWYoYnRfdHhfcnhfY250X2x2bCA9PSBCVF9UWFJYX0NOVF9MRVZFTF8xKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQ29leF0sIEJUIFR4UnggQ291bnRlcnMgPj0gMTIwMCAmJiA8IDE0MDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGE7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDA7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA8IDEyMDBcbiIpKTsKKwkJCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMV0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbMl0gPSAweGY7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDA7CisJCQkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbNF0gPSAweDgwOworCQkJfQorCQl9CisJfQorCisJaWYocnRsODgyMWFlX2RtX2J0X25lZWRfdG9fZGVjX2J0X3B3cihodykpIHsKKwkJYnRkbTg4MjFhZS5iX2RlY19idF9wd3IgPSB0cnVlOworCX0KKworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLAorCSAgICAgICAoIltCVENvZXhdLCBCVCBidElucVBhZ2VTdGFydFRpbWUgPSAweCV4LCBidFR4UnhDbnRMdmwgPSAlZFxuIiwKKwkgICAgICAgIGhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lLCBidF90eF9yeF9jbnRfbHZsKSk7CisKKwlpZiggKGhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lKSB8fAorCQkoQlRfVFhSWF9DTlRfTEVWRUxfMyA9PSBidF90eF9yeF9jbnRfbHZsKSApCisJeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCQkoIltCVENvZXhdLCBTZXQgQlQgaW5xdWlyeSAvIHBhZ2Ugc2NhbiAweDNhIHNldHRpbmdcbiIpKTsKKwkJYnRkbTg4MjFhZS5iX3BzX3RkbWFfb24gPSB0cnVlOworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVswXSA9IDB4YTM7CisJCWJ0ZG04ODIxYWUucHNfdGRtYV9ieXRlWzFdID0gMHg1OworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVsyXSA9IDB4NTsKKwkJYnRkbTg4MjFhZS5wc190ZG1hX2J5dGVbM10gPSAweDgzOworCQlidGRtODgyMWFlLnBzX3RkbWFfYnl0ZVs0XSA9IDB4ODA7CisJfQorCisJaWYocnRsODgyMWFlX2RtX2J0X2lzX2NvZXhpc3Rfc3RhdGVfY2hhbmdlZChodykpeworCQlydGw4ODIxYWVfZG1fYnRfc2V0X2J0X2RtKGh3LCAmYnRkbTg4MjFhZSk7CisJfQorfQorCit2b2lkIHJ0bDg4MjFhZV9kbV9idF9pbnFfcGFnZV9tb25pdG9yKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBjdXJfdGltZTsKKwljdXJfdGltZSA9IGppZmZpZXM7CisJaWYgKGhhbF9jb2V4Xzg4MjFhZS5iX2MyaF9idF9pbnF1aXJ5X3BhZ2UpIHsKKwkJLy9wSGFsRGF0YS0+YnRjb2V4aXN0LmhhbENvZXg4ODIxYWUuYnRJbnF1aXJ5UGFnZUNudCsrOworCQkvLyBidCBpbnF1aXJ5IG9yIHBhZ2UgaXMgc3RhcnRlZC4KKwkJaWYoaGFsX2NvZXhfODgyMWFlLmJ0X2lucV9wYWdlX3N0YXJ0X3RpbWUgPT0gMCl7CisJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAgfD0gQlRfQ09FWF9TVEFURV9CVF9JTlFfUEFHRTsKKwkJCWhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lID0gY3VyX3RpbWU7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJCQkoIltCVENvZXhdLCBCVCBJbnF1aXJ5L3BhZ2UgaXMgc3RhcnRlZCBhdCB0aW1lIDogMHgleCBcbiIsCisJCQkJaGFsX2NvZXhfODgyMWFlLmJ0X2lucV9wYWdlX3N0YXJ0X3RpbWUpKTsKKwkJfQorCX0KKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywKKwkJKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlIHN0YXJ0ZWQgdGltZSA6IDB4JXgsIGN1cl90aW1lIDogMHgleCBcbiIsCisJCWhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lLCBjdXJfdGltZSkpOworCisJaWYgKGhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lKSB7CisJCWlmICgoKChsb25nKWN1cl90aW1lIC0gKGxvbmcpaGFsX2NvZXhfODgyMWFlLmJ0X2lucV9wYWdlX3N0YXJ0X3RpbWUpIC8gSFopID49IDEwKSB7CisJCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgICgiW0JUQ29leF0sIEJUIElucXVpcnkvcGFnZSA+PSAxMHNlYyEhISIpKTsKKwkJCWhhbF9jb2V4Xzg4MjFhZS5idF9pbnFfcGFnZV9zdGFydF90aW1lID0gMDsKKwkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlICY9fiBCVF9DT0VYX1NUQVRFX0JUX0lOUV9QQUdFOworCQl9CisJfQorCisjaWYgMAorCWlmIChoYWxfY29leF84ODIxYWUuYl9jMmhfYnRfaW5xdWlyeV9wYWdlKSB7CisJCWhhbF9jb2V4Xzg4MjFhZS5iX2MyaF9idF9pbnF1aXJ5X3BhZ2UrKzsKKwkJLy8gYnQgaW5xdWlyeSBvciBwYWdlIGlzIHN0YXJ0ZWQuCisJfSBpZihoYWxfY29leF84ODIxYWUuYl9jMmhfYnRfaW5xdWlyeV9wYWdlKSB7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfSU5RX1BBR0U7CisJCWlmKGhhbF9jb2V4Xzg4MjFhZS5idF9pbnF1aXJ5X3BhZ2VfY250ID49IDQpCisJCQloYWxfY29leF84ODIxYWUuYnRfaW5xdWlyeV9wYWdlX2NudCA9IDA7CisJCWhhbF9jb2V4Xzg4MjFhZS5idF9pbnF1aXJ5X3BhZ2VfY250Kys7CisJfSBlbHNlIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgJj1+IEJUX0NPRVhfU1RBVEVfQlRfSU5RX1BBR0U7CisJfQorI2VuZGlmCit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3Jlc2V0X2FjdGlvbl9wcm9maWxlX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+XAorCQkoQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRCB8IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQfAorCQlCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOIHwgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1NDTyk7CisKKwlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+XAorCQkoQlRfQ09FWF9TVEFURV9CVElORk9fQ09NTU9OIHwgQlRfQ09FWF9TVEFURV9CVElORk9fQl9ISURfU0NPRVNDT3wKKwkJQlRfQ09FWF9TVEFURV9CVElORk9fQl9GVFBfQTJEUCk7Cit9CisKK3ZvaWQgX3J0bDg4MjFhZV9kbV9idF9jb2V4aXN0XzJfYW50KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXU4IGJ0X3JldHJ5X2NudDsKKwl1OCBidF9pbmZvX29yaWdpbmFsOworCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdIEdldCBidCBpbmZvIGJ5IGZ3ISFcbiIpKTsKKworCV9ydGw4ODIxYWVfZG1fYnRfY2hlY2tfd2lmaV9zdGF0ZShodyk7CisKKwlpZiAoaGFsX2NvZXhfODgyMWFlLmJfYzJoX2J0X2luZm9fcmVxX3NlbnQpIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLAorCQkJCSgiW0JUQ29leF0gYzJoIGZvciBidF9pbmZvIG5vdCByY3ZkIHlldCEhXG4iKSk7CisJfQorCisJYnRfcmV0cnlfY250ID0gaGFsX2NvZXhfODgyMWFlLmJ0X3JldHJ5X2NudDsKKwlidF9pbmZvX29yaWdpbmFsID0gaGFsX2NvZXhfODgyMWFlLmMyaF9idF9pbmZvX29yaWdpbmFsOworCisJLy8gd2hlbiBidCBpbnF1aXJ5IG9yIHBhZ2Ugc2Nhbiwgd2UgaGF2ZSB0byBzZXQgaDJjIDB4MjUKKwkvLyBpZ25vcmUgd2xhbmFjdCBmb3IgY29udGludW91cyA0eDJzZWNzCisJcnRsODgyMWFlX2RtX2J0X2lucV9wYWdlX21vbml0b3IoaHcpOworCXJ0bDg4MjFhZV9kbV9idF9yZXNldF9hY3Rpb25fcHJvZmlsZV9zdGF0ZShodyk7CisKKwlpZihydGw4ODIxYWVfZG1fYnRfaXNfMl9hbnRfY29tbW9uX2FjdGlvbihodykpIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3Byb2ZpbGVfY2FzZSA9IEJUX0NPRVhfTUVDSF9DT01NT047CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcm9maWxlX2FjdGlvbj0gQlRfQ09FWF9NRUNIX0NPTU1PTjsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiQWN0aW9uIDItQW50IGNvbW1vbi5cbiIpKTsKKwl9IGVsc2UgeworCQlpZiggKGJ0X2luZm9fb3JpZ2luYWwgJiBCVElORk9fQl9ISUQpIHx8CisJCQkoYnRfaW5mb19vcmlnaW5hbCAmIEJUSU5GT19CX1NDT19CVVNZKSB8fAorCQkJKGJ0X2luZm9fb3JpZ2luYWwgJiBCVElORk9fQl9TQ09fRVNDTykgKSB7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVElORk9fQl9ISURfU0NPRVNDTzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJvZmlsZV9jYXNlID0gQlRfQ09FWF9NRUNIX0hJRF9TQ09fRVNDTzsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJvZmlsZV9hY3Rpb24gPSBCVF9DT0VYX01FQ0hfSElEX1NDT19FU0NPOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVEluZm86IGJIaWR8YlNDT0J1c3l8YlNDT2VTQ09cbiIpKTsKKwkJCQlydGw4ODIxYWVfZG1fYnRfMl9hbnRfaGlkX3Njb19lc2NvKGh3KTsKKwkJfSBlbHNlIGlmKCAoYnRfaW5mb19vcmlnaW5hbCAmIEJUSU5GT19CX0ZUUCkgfHwKKwkJCQkoYnRfaW5mb19vcmlnaW5hbCAmIEJUSU5GT19CX0EyRFApICkgeworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRJTkZPX0JfRlRQX0EyRFA7CisJCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3Byb2ZpbGVfY2FzZSA9IEJUX0NPRVhfTUVDSF9GVFBfQTJEUDsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJvZmlsZV9hY3Rpb24gPSBCVF9DT0VYX01FQ0hfRlRQX0EyRFA7CisJCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiQlRJbmZvOiBiRlRQfGJBMkRQXG4iKSk7CisJCQkJcnRsODgyMWFlX2RtX2J0XzJfYW50X2Z0cF9hMmRwKGh3KTsKKwkJfSBlbHNlIHsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUSU5GT19CX0hJRF9TQ09FU0NPOworCQkJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9wcm9maWxlX2Nhc2UgPSBCVF9DT0VYX01FQ0hfTk9ORTsKKwkJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfcHJvZmlsZV9hY3Rpb249IEJUX0NPRVhfTUVDSF9OT05FOworCQkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVENvZXhdLCBCVEluZm86IHVuZGVmaW5lZCBjYXNlISEhIVxuIikpOworCQkJCXJ0bDg4MjFhZV9kbV9idF8yX2FudF9oaWRfc2NvX2VzY28oaHcpOworCQl9CisJfQorfQorCit2b2lkIF9ydGw4ODIxYWVfZG1fYnRfY29leGlzdF8xX2FudChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2h3X2NvZXhfYWxsX29mZl84NzIzYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2NvZXhfdGFibGUoaHcsIDB4NWE1YWFhYWEsIDB4Y2MsIDB4Myk7CisJcnRsODgyMWFlX2RtX2J0X3NldF9od19wdGFfbW9kZShodywgdHJ1ZSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2Z3X2NvZXhfYWxsX29mZl84NzIzYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2lnbm9yZV93bGFuX2FjdChodywgZmFsc2UpOworCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfM2EoaHcsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3XzJfYW50X2hpZChodywgZmFsc2UsIGZhbHNlKTsKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X3RyYV90ZG1hX2N0cmwoaHcsIGZhbHNlLCBURE1BXzJBTlQsIFRETUFfTkFWX09GRik7CisJcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoaHcsIGZhbHNlLCBURE1BXzJBTlQsCisJCQkJVERNQV9OQVZfT0ZGLCBURE1BX0RBQ19TV0lOR19PRkYpOworCXJ0bDg4MjFhZV9kbV9idF9zZXRfZndfZGFjX3N3aW5nX2xldmVsKGh3LCAwKTsKKwlydGw4ODIxYWVfZG1fYnRfc2V0X2Z3X2J0X2hpZF9pbmZvKGh3LCBmYWxzZSk7CisJcnRsODgyMWFlX2RtX2J0X3NldF9md19idF9yZXRyeV9pbmRleChodywgMik7CisJcnRsODgyMWFlX2RtX2J0X3NldF9md193bGFuX2FjdChodywgMHgxMCwgMHgxMCk7CisJcnRsODgyMWFlX2RtX2J0X3NldF9md19kZWNfYnRfcHdyKGh3LCBmYWxzZSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3N3X2NvZXhfYWxsX29mZl84NzIzYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlydGw4ODIxYWVfZG1fYnRfYWdjX3RhYmxlKGh3LCBCVF9BR0NUQUJMRV9PRkYpOworCXJ0bDg4MjFhZV9kbV9idF9iYl9iYWNrX29mZl9sZXZlbChodywgQlRfQkJfQkFDS09GRl9PRkYpOworCXJ0bDg4MjFhZV9kbV9idF9yZWplY3RfYXBfYWdncmVnYXRlZF9wYWNrZXQoaHcsIGZhbHNlKTsKKworCXJ0bDg4MjFhZV9kbV9idF9zZXRfc3dfcGVuYWx0eV90eF9yYXRlX2FkYXB0aXZlKGh3LAorCQkJCQkJCUJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMKTsKKwlydGw4ODIxYWVfZG1fYnRfc2V0X3N3X3JmX3J4X2xwZl9jb3JuZXIoaHcsIEJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FKTsKKwlydGw4ODIxYWVfZG1fYnRfc2V0X3N3X2Z1bGxfdGltZV9kYWNfc3dpbmcoaHcsIGZhbHNlLCAweGMwKTsKK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfcXVlcnlfYnRfaW5mb3JtYXRpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGgyY19wYXJhbWV0ZXJbMV0gPSB7MH07CisKKwloYWxfY29leF84ODIxYWUuYl9jMmhfYnRfaW5mb19yZXFfc2VudCA9IHRydWU7CisKKwloMmNfcGFyYW1ldGVyWzBdIHw9ICBCSVQoMCk7CisKKwlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJKCJRdWVyeSBCdCBpbmZvcm1hdGlvbiwgd3JpdGUgMHgzOD0weCV4XG4iLCBoMmNfcGFyYW1ldGVyWzBdKSk7CisKKwlydGw4ODIxYWVfZmlsbF9oMmNfY21kKGh3LCAweDM4LCAxLCBoMmNfcGFyYW1ldGVyKTsKK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfYnRfaHdfY291bnRlcnNfbW9uaXRvcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwl1MzIgcmVnX2hwX3R4X3J4LCByZWdfbHBfdHhfcngsIHUzMl90bXA7CisJdTMyIHJlZ19ocF90eD0wLCByZWdfaHBfcng9MCwgcmVnX2xwX3R4PTAsIHJlZ19scF9yeD0wOworCisJcmVnX2hwX3R4X3J4ID0gUkVHX0hJR0hfUFJJT1JJVFlfVFhSWDsKKwlyZWdfbHBfdHhfcnggPSBSRUdfTE9XX1BSSU9SSVRZX1RYUlg7CisKKwl1MzJfdG1wID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgcmVnX2hwX3R4X3J4KTsKKwlyZWdfaHBfdHggPSB1MzJfdG1wICYgTUFTS0xXT1JEOworCXJlZ19ocF9yeCA9ICh1MzJfdG1wICYgTUFTS0hXT1JEKT4+MTY7CisKKwl1MzJfdG1wID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgcmVnX2xwX3R4X3J4KTsKKwlyZWdfbHBfdHggPSB1MzJfdG1wICYgTUFTS0xXT1JEOworCXJlZ19scF9yeCA9ICh1MzJfdG1wICYgTUFTS0hXT1JEKT4+MTY7CisKKwlpZihydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXIgPiAxKSB7CisJCXJlZ19ocF90eCAlPSBydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXI7CisJCXJlZ19ocF9yeCAlPSBydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXI7CisJCXJlZ19scF90eCAlPSBydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXI7CisJCXJlZ19scF9yeCAlPSBydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXI7CisJfQorCisJaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfdHggPSByZWdfaHBfdHg7CisJaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfcnggPSByZWdfaHBfcng7CisJaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV90eCA9IHJlZ19scF90eDsKKwloYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3J4ID0gcmVnX2xwX3J4OworCisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCSgiSGlnaCBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPSV4KCVkKS8leCglZClcbiIsCisJCXJlZ19ocF90eF9yeCwgcmVnX2hwX3R4LCByZWdfaHBfdHgsIHJlZ19ocF9yeCwgcmVnX2hwX3J4KSk7CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCSgiTG93IFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9JXgoJWQpLyV4KCVkKVxuIiwKKwkJcmVnX2xwX3R4X3J4LCByZWdfbHBfdHgsIHJlZ19scF90eCwgcmVnX2xwX3J4LCByZWdfbHBfcngpKTsKKwlydGxwY2lwcml2LT5idGNvZXhpc3QubHBzX2NvdW50ZXIgPSAwOworCS8vcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg3NmUsIDB4Yyk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2J0X2VuYWJsZV9kaXNhYmxlX2NoZWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCWJvb2wgYnRfYWxpZmUgPSB0cnVlOworCisJaWYgKGhhbF9jb2V4Xzg4MjFhZS5oaWdoX3ByaW9yaXR5X3R4ID09IDAgJiYKKwkJaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfcnggPT0gMCAmJgorCQloYWxfY29leF84ODIxYWUubG93X3ByaW9yaXR5X3R4ID09IDAgJiYKKwkJaGFsX2NvZXhfODgyMWFlLmxvd19wcmlvcml0eV9yeCA9PSAwKSB7CisJCWJ0X2FsaWZlID0gZmFsc2U7CisJfQorCWlmIChoYWxfY29leF84ODIxYWUuaGlnaF9wcmlvcml0eV90eCA9PSAweGVhZWEgJiYKKwkJaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfcnggPT0gMHhlYWVhICYmCisJCWhhbF9jb2V4Xzg4MjFhZS5sb3dfcHJpb3JpdHlfdHggPT0gMHhlYWVhICYmCisJCWhhbF9jb2V4Xzg4MjFhZS5sb3dfcHJpb3JpdHlfcnggPT0gMHhlYWVhKSB7CisJCWJ0X2FsaWZlID0gZmFsc2U7CisJfQorCWlmIChoYWxfY29leF84ODIxYWUuaGlnaF9wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKKwkJaGFsX2NvZXhfODgyMWFlLmhpZ2hfcHJpb3JpdHlfcnggPT0gMHhmZmZmICYmCisJCWhhbF9jb2V4Xzg4MjFhZS5sb3dfcHJpb3JpdHlfdHggPT0gMHhmZmZmICYmCisJCWhhbF9jb2V4Xzg4MjFhZS5sb3dfcHJpb3JpdHlfcnggPT0gMHhmZmZmKSB7CisJCWJ0X2FsaWZlID0gZmFsc2U7CisJfQorCWlmIChidF9hbGlmZSkgeworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfYWN0aXZlX3plcm9fY250ID0gMDsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfY3VyX2J0X2Rpc2FibGVkID0gZmFsc2U7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIjg4MjFBRSBCVCBpcyBlbmFibGVkICEhXG4iKSk7CisJfSBlbHNlIHsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X2FjdGl2ZV96ZXJvX2NudCsrOworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19UUkFDRSwKKwkJCSgiODgyMUFFIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLAorCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X2FjdGl2ZV96ZXJvX2NudCkpOworCQlpZiAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X2FjdGl2ZV96ZXJvX2NudCA+PSAyKSB7CisJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9jdXJfYnRfZGlzYWJsZWQgPSB0cnVlOworCQkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiODgyMUFFIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CisJCX0KKwl9CisJaWYgKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX3ByZV9idF9kaXNhYmxlZCAhPQorCQlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9jdXJfYnRfZGlzYWJsZWQpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiODgyMUFFIEJUIGlzIGZyb20gJXMgdG8gJXMhIVxuIiwKKwkJCShydGxwY2lwcml2LT5idGNvZXhpc3QuYl9wcmVfYnRfZGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksCisJCQkocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfY3VyX2J0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX3ByZV9idF9kaXNhYmxlZAorCQkJPSBydGxwY2lwcml2LT5idGNvZXhpc3QuYl9jdXJfYnRfZGlzYWJsZWQ7CisJfQorfQorCisKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2NvZXhpc3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisKKwlydGw4ODIxYWVfZG1fYnRfcXVlcnlfYnRfaW5mb3JtYXRpb24oaHcpOworCXJ0bDg4MjFhZV9kbV9idF9idF9od19jb3VudGVyc19tb25pdG9yKGh3KTsKKwlydGw4ODIxYWVfZG1fYnRfYnRfZW5hYmxlX2Rpc2FibGVfY2hlY2soaHcpOworCisJaWYgKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9hbnRfbnVtID09IEFOVF9YMikgeworCQlSVF9UUkFDRShDT01QX0JUX0NPRVhJU1QsIERCR19ETUVTRywgKCJbQlRDb2V4XSwgMiBBbnQgbWVjaGFuaXNtXG4iKSk7CisJCV9ydGw4ODIxYWVfZG1fYnRfY29leGlzdF8yX2FudChodyk7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfVFJBQ0UsICgiW0JUQ29leF0sIDEgQW50IG1lY2hhbmlzbVxuIikpOworCQlfcnRsODgyMWFlX2RtX2J0X2NvZXhpc3RfMV9hbnQoaHcpOworCX0KKworCWlmICghcnRsODgyMWFlX2RtX2J0X2lzX3NhbWVfY29leGlzdF9zdGF0ZShodykpIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCQkoIltCVENvZXhdLCBDb2V4aXN0IFN0YXRlW2JpdE1hcF0gY2hhbmdlIGZyb20gMHgleCU4eCB0byAweCV4JTh4XG4iLAorCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LnByZXZpb3VzX3N0YXRlX2gsCisJCQlydGxwY2lwcml2LT5idGNvZXhpc3QucHJldmlvdXNfc3RhdGUsCisJCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZV9oLAorCQkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGUpKTsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LnByZXZpb3VzX3N0YXRlCisJCQk9IHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5jdXJyZW50X3N0YXRlOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QucHJldmlvdXNfc3RhdGVfaAorCQkJPSBydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZV9oOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZG1fYnRfcGFyc2VfYnRfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKiB0bXBfYnVmLCB1OCBsZW4pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJdTggYnRfaW5mbzsKKwl1OCBpOworCisJaGFsX2NvZXhfODgyMWFlLmJfYzJoX2J0X2luZm9fcmVxX3NlbnQgPSBmYWxzZTsKKwloYWxfY29leF84ODIxYWUuYnRfcmV0cnlfY250ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgPT0gMCkgeworCQkJaGFsX2NvZXhfODgyMWFlLmMyaF9idF9pbmZvX29yaWdpbmFsID0gdG1wX2J1ZltpXTsKKwkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCWhhbF9jb2V4Xzg4MjFhZS5idF9yZXRyeV9jbnQgPSB0bXBfYnVmW2ldOworCQl9CisJCWlmKGkgPT0gbGVuLTEpIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIjB4JTJ4XSIsIHRtcF9idWZbaV0pKTsKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX1RSQUNFLCAoIjB4JTJ4LCAiLCB0bXBfYnVmW2ldKSk7CisJCX0KKwl9CisJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCisJCSgiQlQgaW5mbyBidF9pbmZvIChEYXRhKT0gMHgleFxuIixoYWxfY29leF84ODIxYWUuYzJoX2J0X2luZm9fb3JpZ2luYWwpKTsKKwlidF9pbmZvID0gaGFsX2NvZXhfODgyMWFlLmMyaF9idF9pbmZvX29yaWdpbmFsOworCisJaWYoYnRfaW5mbyAmIEJJVCgyKSl7CisJCWhhbF9jb2V4Xzg4MjFhZS5iX2MyaF9idF9pbnF1aXJ5X3BhZ2UgPSB0cnVlOworCX0gZWxzZSB7CisJCWhhbF9jb2V4Xzg4MjFhZS5iX2MyaF9idF9pbnF1aXJ5X3BhZ2UgPSBmYWxzZTsKKwl9CisKKwlpZiAoYnRfaW5mbyAmIEJUSU5GT19CX0NPTk5FQ1RJT04pIHsKKwkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csICgiW0JUQzJIXSwgQlRJbmZvOiBiQ29ubmVjdD10cnVlXG4iKSk7CisJCXJ0bHBjaXByaXYtPmJ0Y29leGlzdC5iX2J0X2J1c3kgPSB0cnVlOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9JRExFOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLCAoIltCVEMySF0sIEJUSW5mbzogYkNvbm5lY3Q9ZmFsc2VcbiIpKTsKKwkJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfYnRfYnVzeSA9IGZhbHNlOworCQlydGxwY2lwcml2LT5idGNvZXhpc3QuY3VycmVudF9zdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX0lETEU7CisJfQorfQordm9pZCBydGxfODgyMWFlX2MyaF9jb21tYW5kX2hhbmRsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IGMyaF9ldnRfaGRyIGMyaF9ldmVudDsKKwl1OCAqIHB0bXBfYnVmID0gTlVMTDsKKwl1OCBpbmRleCA9IDA7CisJdTggdTFiX3RtcCA9IDA7CisJbWVtc2V0KCZjMmhfZXZlbnQsIDAsIHNpemVvZihjMmhfZXZlbnQpKTsKKwl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQzJIRVZUX01TR19OT1JNQUwpOworCVJUX1RSQUNFKENPTVBfRlcsIERCR19ETUVTRywKKwkJKCImJiYmJiY6IFJFR19DMkhFVlRfTVNHX05PUk1BTCBpcyAweCV4XG4iLCB1MWJfdG1wKSk7CisJYzJoX2V2ZW50LmNtZF9pZCA9IHUxYl90bXAgJiAweEY7CisJYzJoX2V2ZW50LmNtZF9sZW4gPSAodTFiX3RtcCAmIDB4RjApID4+IDQ7CisJYzJoX2V2ZW50LmNtZF9zZXEgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DMkhFVlRfTVNHX05PUk1BTCArIDEpOworCVJUX1RSQUNFKENPTVBfRlcsIERCR19ETUVTRywgKCJjbWRfaWQ6ICVkLCBjbWRfbGVuOiAlZCwgY21kX3NlcTogJWRcbiIsCisJCWMyaF9ldmVudC5jbWRfaWQgLCBjMmhfZXZlbnQuY21kX2xlbiwgYzJoX2V2ZW50LmNtZF9zZXEpKTsKKwl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDAxQUYpOworCWlmICh1MWJfdG1wID09IEMySF9FVlRfSE9TVF9DTE9TRSkgeworCQlyZXR1cm47CisJfSBlbHNlIGlmICh1MWJfdG1wICE9IEMySF9FVlRfRldfQ0xPU0UpIHsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgxQUYsIDB4MDApOworCQlyZXR1cm47CisJfQorCXB0bXBfYnVmID0gKHU4ICopIGttYWxsb2MoYzJoX2V2ZW50LmNtZF9sZW4sIEdGUF9LRVJORUwpOworCWlmKHB0bXBfYnVmID09IE5VTEwpIHsKKwkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX1RSQUNFLCAoIm1hbGxvYyBjbWQgYnVmIGZhaWxlZFxuIikpOworCQlyZXR1cm47CisJfQorCisJLyogUmVhZCB0aGUgY29udGVudCAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGMyaF9ldmVudC5jbWRfbGVuOyBpbmRleCArKykgeworCQlwdG1wX2J1ZltpbmRleF0gPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DMkhFVlRfTVNHX05PUk1BTCArIDIrIGluZGV4KTsKKwl9CisKKwlzd2l0Y2goYzJoX2V2ZW50LmNtZF9pZCkgeworCQljYXNlIEMySF9CVF9SU1NJOgorCQkJYnJlYWs7CisKKwljYXNlIEMySF9CVF9PUF9NT0RFOgorCQkJYnJlYWs7CisKKwljYXNlIEJUX0lORk86CisJCVJUX1RSQUNFKENPTVBfRlcsIERCR19UUkFDRSwKKwkJCSgiQlQgaW5mbyBCeXRlWzBdIChJRCkgaXMgMHgleFxuIiwgYzJoX2V2ZW50LmNtZF9pZCkpOworCQlSVF9UUkFDRShDT01QX0ZXLCBEQkdfVFJBQ0UsCisJCQkoIkJUIGluZm8gQnl0ZVsxXSAoU2VxKSBpcyAweCV4XG4iLCBjMmhfZXZlbnQuY21kX3NlcSkpOworCQlSVF9UUkFDRShDT01QX0ZXLCBEQkdfVFJBQ0UsCisJCQkoIkJUIGluZm8gQnl0ZVsyXSAoRGF0YSk9IDB4JXhcbiIsIHB0bXBfYnVmWzBdKSk7CisKKwkJaWYgKHJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfYnRjX3N0YXR1cygpKXsKKwkJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfb3BzLT5idGNfYnRpbmZvX25vdGlmeShydGxwcml2LCBwdG1wX2J1ZiwgYzJoX2V2ZW50LmNtZF9sZW4pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmKHB0bXBfYnVmKQorCQlrZnJlZShwdG1wX2J1Zik7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDAxQUYsIEMySF9FVlRfSE9TVF9DTE9TRSk7Cit9CisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NDc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuaApAQCAtMCwwICsxLDE2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9IQUxfQlRDX0hfXworI2RlZmluZSBfX1JUTDg4MjFBRV9IQUxfQlRDX0hfXworCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgImJ0Yy5oIgorI2luY2x1ZGUgImhhbF9idF9jb2V4aXN0LmgiCisKKyNkZWZpbmUJQlRfVFhSWF9DTlRfVEhSRVNfMQkJCQkxMjAwCisjZGVmaW5lCUJUX1RYUlhfQ05UX1RIUkVTXzIJCQkJMTQwMAorI2RlZmluZQlCVF9UWFJYX0NOVF9USFJFU18zCQkJCTMwMDAKKyNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMAkJCQkwCS8vIDwgMTIwMAorI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8xCQkJCTEJLy8gPj0gMTIwMCAmJiA8IDE0MDAKKyNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMgkJCQkyCS8vID49IDE0MDAKKyNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMwkJCQkzCisKKworCisjZGVmaW5lCUJUX0NPRVhfRElTQUJMRQkJMAorI2RlZmluZQlCVF9RX1BLVF9PRkYJCTAKKyNkZWZpbmUJQlRfUV9QS1RfT04JCQkxCisKKyNkZWZpbmUJQlRfVFhfUFdSX09GRgkJMAorI2RlZmluZQlCVF9UWF9QV1JfT04JCTEKKworLyogVERNQSBtb2RlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJVERNQV8yQU5UCQkJMAorI2RlZmluZQlURE1BXzFBTlQJCQkxCisjZGVmaW5lCVRETUFfTkFWX09GRgkJMAorI2RlZmluZQlURE1BX05BVl9PTgkJCTEKKyNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT0ZGCTAKKyNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT04JMQorCisvKiBQVEEgbW9kZSByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJQlRfUFRBX01PREVfT0ZGCQkwCisjZGVmaW5lCUJUX1BUQV9NT0RFX09OCQkxCisKKy8qIFBlbmFsdHkgVHggUmF0ZSBBZGFwdGl2ZSAqLworI2RlZmluZQlCVF9UWF9SQVRFX0FEQVBUSVZFX05PUk1BTAkwCisjZGVmaW5lCUJUX1RYX1JBVEVfQURBUFRJVkVfTE9XX1BFTkFMVFkJMQorCisvKiBSRiBDb3JuZXIgKi8KKyNkZWZpbmUJQlRfUkZfUlhfTFBGX0NPUk5FUl9SRVNVTUUJMAorI2RlZmluZQlCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSwkxCisKKyNkZWZpbmUgQzJIX0VWVF9IT1NUX0NMT1NFCQkweDAwCisjZGVmaW5lIEMySF9FVlRfRldfQ0xPU0UJCTB4RkYKKworZW51bSBidF90cmFmZmljX21vZGUgeworCUJUX01PVE9SX0VYVF9CRSA9IDB4MDAsCisJQlRfTU9UT1JfRVhUX0dVTCA9IDB4MDEsCisJQlRfTU9UT1JfRVhUX0dVQiA9IDB4MDIsCisJQlRfTU9UT1JfRVhUX0dVTEIgPSAweDAzCit9OworCitlbnVtIGJ0X3RyYWZmaWNfbW9kZV9wcm9maWxlIHsKKwlCVF9QUk9GSUxFX05PTkUsCisJQlRfUFJPRklMRV9BMkRQLAorCUJUX1BST0ZJTEVfUEFOLAorCUJUX1BST0ZJTEVfSElELAorCUJUX1BST0ZJTEVfU0NPCit9OworCitlbnVtIGhjaV9leHRfYnRfb3BlcmF0aW9uIHsKKwlIQ0lfQlRfT1BfTk9ORSA9IDB4MCwKKwlIQ0lfQlRfT1BfSU5RVUlSRV9TVEFSVAk9IDB4MSwKKwlIQ0lfQlRfT1BfSU5RVUlSRV9GSU5JU0ggPSAweDIsCisJSENJX0JUX09QX1BBR0lOR19TVEFSVCA9IDB4MywKKwlIQ0lfQlRfT1BfUEFHSU5HX1NVQ0NFU1MgPSAweDQsCisJSENJX0JUX09QX1BBR0lOR19VTlNVQ0NFU1MgPSAweDUsCisJSENJX0JUX09QX1BBSVJJTkdfU1RBUlQgPSAweDYsCisJSENJX0JUX09QX1BBSVJJTkdfRklOSVNIID0gMHg3LAorCUhDSV9CVF9PUF9CVF9ERVZfRU5BQkxFID0gMHg4LAorCUhDSV9CVF9PUF9CVF9ERVZfRElTQUJMRSA9IDB4OSwKKwlIQ0lfQlRfT1BfTUFYLAorfTsKKworZW51bSBidF9zcGVjIHsKKwlCVF9TUEVDXzFfMF9iID0gMHgwMCwKKwlCVF9TUEVDXzFfMSA9IDB4MDEsCisJQlRfU1BFQ18xXzIgPSAweDAyLAorCUJUX1NQRUNfMl8wX0VEUiA9IDB4MDMsCisJQlRfU1BFQ18yXzFfRURSID0gMHgwNCwKKwlCVF9TUEVDXzNfMF9IUyA9IDB4MDUsCisJQlRfU1BFQ180XzAgPSAweDA2Cit9OworCitzdHJ1Y3QgYzJoX2V2dF9oZHIgeworICAgICAgICB1OCBjbWRfaWQ7CisgICAgICAgIHU4IGNtZF9sZW47CisgICAgICAgIHU4IGNtZF9zZXE7Cit9OworCitlbnVtIGJ0X3N0YXRleworCUJUX0lORk9fU1RBVEVfRElTQUJMRUQgPSAwLAorCUJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTiA9IDEsCisJQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUgPSAyLAorCUJUX0lORk9fU1RBVEVfSU5RX09SX1BBRyA9IDMsCisJQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZID0gNCwKKwlCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kgPSA1LAorCUJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZID0gNiwKKwlCVF9JTkZPX1NUQVRFX0hJRF9CVVNZID0gNywKKwlCVF9JTkZPX1NUQVRFX0hJRF9TQ09fQlVTWSA9IDgsCisJQlRfSU5GT19TVEFURV9NQVggPSA3Cit9OworCitlbnVtIHJ0bDg3MjNiZV9jMmhfZXZ0IHsKKwlDMkhfREJHID0gMCwKKwlDMkhfVFNGID0gMSwKKwlDMkhfQVBfUlBUX1JTUCA9IDIsCisJQzJIX0NDWF9UWF9SUFQgPSAzLAkvLyBUaGUgRlcgbm90aWZ5IHRoZSByZXBvcnQgb2YgdGhlIHNwZWNpZmljIHR4IHBhY2tldC4KKwlDMkhfQlRfUlNTSSA9IDQsCisJQzJIX0JUX09QX01PREUgPSA1LAorCUMySF9IV19JTkZPX0VYQ0ggPSAxMCwKKwlDMkhfQzJIX0gyQ19URVNUID0gMTEsCisJQlRfSU5GTyA9IDksCisJTUFYX0MySEVWRU5UCit9OworCisKKwordm9pZCBydGw4ODIxYWVfZG1fYnRfZndfY29leF9hbGxfb2ZmXzg3MjNhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X3N3X2NvZXhfYWxsX29mZl84NzIzYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9od19jb2V4X2FsbF9vZmZfODcyM2Eoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfZG1fYnRfY29leGlzdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9kbV9idF9zZXRfYnRfZG0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBidGRtXzg4MjFhZSAqcF9idGRtKTsKK3ZvaWQgcnRsXzg4MjFhZV9jMmhfY29tbWFuZF9oYW5kbGUoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKK3ZvaWQgcnRsXzg4MjFhZV9idF93aWZpX21lZGlhX3N0YXR1c19ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBib29sIG1zdGF0dXMpOwordm9pZCBydGw4ODIxYWVfZG1fYnRfdHVybl9vZmZfYnRfY29leGlzdF9iZWZvcmVfZW50ZXJfbHBzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkN2ExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMKQEAgLTAsMCArMSwzMzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICIuLi9lZnVzZS5oIgorI2luY2x1ZGUgIi4uL2Jhc2UuaCIKKyNpbmNsdWRlICIuLi9yZWdkLmgiCisjaW5jbHVkZSAiLi4vY2FtLmgiCisjaW5jbHVkZSAiLi4vcHMuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAibGVkLmgiCisjaW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJwd3JzZXFjbWQuaCIKKyNpbmNsdWRlICJwd3JzZXEuaCIKKyNpbmNsdWRlICJidGMuaCIKKyNpbmNsdWRlICIuLi9idGNvZXhpc3QvcnRsX2J0Yy5oIgorCisjZGVmaW5lIExMVF9DT05GSUcJNQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3JldHVybl9iZWFjb25fcXVldWVfc2tiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcnRscGNpLT50eF9yaW5nW0JFQUNPTl9RVUVVRV07CisKKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CisJCXN0cnVjdCBydGxfdHhfZGVzYyAqZW50cnkgPSAmcmluZy0+ZGVzY1tyaW5nLT5pZHhdOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOworCisJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCSBsZTMyX3RvX2NwdShydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoCisJCQkJICh1OCAqKSBlbnRyeSwgdHJ1ZSwgSFdfREVTQ19UWEJVRkZfQUREUikpLAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOworCX0KKworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3NldF9iY25fY3RybF9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgdTggc2V0X2JpdHMsIHU4IGNsZWFyX2JpdHMpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwY2ktPnJlZ19iY25fY3RybF92YWwgfD0gc2V0X2JpdHM7CisJcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsICY9IH5jbGVhcl9iaXRzOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTl9DVFJMLCAodTgpIHJ0bHBjaS0+cmVnX2Jjbl9jdHJsX3ZhbCk7Cit9CisKK3ZvaWQgX3J0bDg4MjFhZV9zdG9wX3R4X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdG1wMWJ5dGU7CisKKwl0bXAxYnl0ZSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCArIDIsIHRtcDFieXRlICYgKH5CSVQoNikpKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVEJUVF9QUk9ISUJJVCArIDEsIDB4NjQpOworCXRtcDFieXRlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfVEJUVF9QUk9ISUJJVCArIDIpOworCXRtcDFieXRlICY9IH4oQklUKDApKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVEJUVF9QUk9ISUJJVCArIDIsIHRtcDFieXRlKTsKK30KKwordm9pZCBfcnRsODgyMWFlX3Jlc3VtZV90eF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHRtcDFieXRlOworCisJdG1wMWJ5dGUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19GV0hXX1RYUV9DVFJMICsgMik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLCB0bXAxYnl0ZSB8IEJJVCg2KSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweGZmKTsKKwl0bXAxYnl0ZSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAyKTsKKwl0bXAxYnl0ZSB8PSBCSVQoMCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAyLCB0bXAxYnl0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZW5hYmxlX2Jjbl9zdWJfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlfcnRsODgyMWFlX3NldF9iY25fY3RybF9yZWcoaHcsIDAsIEJJVCgxKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZGlzYWJsZV9iY25fc3ViX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJX3J0bDg4MjFhZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCBCSVQoMSksIDApOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3NldF9md19jbG9ja19vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCBycHdtX3ZhbCwgYm9vbCBiX25lZWRfdHVybl9vZmZfY2trKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCWJvb2wgYl9zdXBwb3J0X3JlbW90ZV93YWtlX3VwOworCXUzMiBjb3VudCA9IDAsaXNyX3JlZ2FkZHIsY29udGVudDsKKwlib29sIGJfc2NoZWR1bGVfdGltZXIgPSBiX25lZWRfdHVybl9vZmZfY2trOworCXJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfaHdfcmVnKGh3LCBIQUxfREVGX1dPV0xBTiwKKwkJCQkJKHU4ICopICgmYl9zdXBwb3J0X3JlbW90ZV93YWtlX3VwKSk7CisKKwlpZiAoIXJ0bGhhbC0+YmZ3X3JlYWR5KQorCQlyZXR1cm47CisJaWYgKCFydGxwcml2LT5wc2MuYl9md19jdXJyZW50X2lucHNtb2RlKQorCQlyZXR1cm47CisKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQlpZiAocnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcykgeworCQkJd2hpbGUgKHJ0bGhhbC0+YmZ3X2Nsa19jaGFuZ2VfaW5fcHJvZ3Jlc3MpIHsKKwkJCQlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJCQkJY291bnQrKzsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCQlpZiAoY291bnQgPiAxMDAwKQorCQkJCQlyZXR1cm47CisJCQkJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXJ0bGhhbC0+YmZ3X2Nsa19jaGFuZ2VfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwkJfQorCX0KKworCWlmIChJU19JTl9MT1dfUE9XRVJfU1RBVEVfODgyMUFFKHJ0bGhhbC0+ZndfcHNfc3RhdGUpKSB7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfaHdfcmVnKGh3LCBIV19WQVJfU0VUX1JQV00sCisJCQkJCSh1OCAqKSAoJnJwd21fdmFsKSk7CisJCWlmIChGV19QU19JU19BQ0socnB3bV92YWwpKSB7CisJCQlpc3JfcmVnYWRkciA9IFJFR19ISVNSOworCQkJY29udGVudCA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIGlzcl9yZWdhZGRyKTsKKwkJCXdoaWxlICghKGNvbnRlbnQgJiBJTVJfQ1BXTSkgJiYgKGNvdW50IDwgNTAwKSkgeworCQkJCXVkZWxheSg1MCk7CisJCQkJY291bnQrKzsKKwkJCQljb250ZW50ID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgaXNyX3JlZ2FkZHIpOworCQkJfQorCisJCQlpZiAoY29udGVudCAmIElNUl9DUFdNKSB7CisJCQlydGxfd3JpdGVfd29yZChydGxwcml2LGlzcl9yZWdhZGRyLCAweDAxMDApOworCQkJcnRsaGFsLT5md19wc19zdGF0ZSA9IEZXX1BTX1NUQVRFX1JGX09OXzg4MjFBRTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoIlJlY2VpdmUgQ1BXTSBJTlQhISEgU2V0IHBIYWxEYXRhLT5Gd1BTU3RhdGUgPSAlWFxuIiwgcnRsaGFsLT5md19wc19zdGF0ZSkpOworCQkJfQorCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwkJcnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJCWlmIChiX3NjaGVkdWxlX3RpbWVyKSB7CisJCQltb2RfdGltZXIoJnJ0bHByaXYtPndvcmtzLmZ3X2Nsb2Nrb2ZmX3RpbWVyLAorCQkJCSAgamlmZmllcyArIE1TRUNTKDEwKSk7CisJCX0KKworCX0gZWxzZSAgeworCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQlydGxoYWwtPmJmd19jbGtfY2hhbmdlX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy5md19wc19sb2NrKTsKKwl9CisKKworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3NldF9md19jbG9ja19vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggcnB3bV92YWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOworCWVudW0gcmZfcHdyc3RhdGUgcnRzdGF0ZTsKKwlib29sIGJfc2NoZWR1bGVfdGltZXIgPSBmYWxzZTsKKwl1OCBxdWV1ZTsKKworCWlmICghcnRsaGFsLT5iZndfcmVhZHkpCisJCXJldHVybjsKKwlpZiAoIXJ0bHByaXYtPnBzYy5iX2Z3X2N1cnJlbnRfaW5wc21vZGUpCisJCXJldHVybjsKKwlpZiAoIXJ0bGhhbC0+YmFsbG93X3N3X3RvX2NoYW5nZV9od2NsYykKKwkJcmV0dXJuOworCXJ0bHByaXYtPmNmZy0+b3BzLT5nZXRfaHdfcmVnKGh3LEhXX1ZBUl9SRl9TVEFURSwodTggKikoJnJ0c3RhdGUpKTsKKwlpZiAocnRzdGF0ZSA9PSBFUkZPRkYgfHxydGxwcml2LT5wc2MuaW5hY3RpdmVfcHdyc3RhdGUgPT1FUkZPRkYpCisJCXJldHVybjsKKworCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOyBxdWV1ZSsrKSB7CisJCXJpbmcgPSAmcnRscGNpLT50eF9yaW5nW3F1ZXVlXTsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkgeworCQkJYl9zY2hlZHVsZV90aW1lciA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiX3NjaGVkdWxlX3RpbWVyKSB7CisJCW1vZF90aW1lcigmcnRscHJpdi0+d29ya3MuZndfY2xvY2tvZmZfdGltZXIsCisJCQkJCSAgamlmZmllcyArIE1TRUNTKDEwKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRldfUFNfU1RBVEUocnRsaGFsLT5md19wc19zdGF0ZSkgIT0gRldfUFNfU1RBVEVfUkZfT0ZGX0xPV19QV1JfODgyMUFFKSB7CisJCXNwaW5fbG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJCWlmICghcnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcykgeworCQkJcnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcyA9IHRydWU7CisJCQlzcGluX3VubG9ja19iaCgmcnRscHJpdi0+bG9ja3MuZndfcHNfbG9jayk7CisJCQlydGxoYWwtPmZ3X3BzX3N0YXRlID0gRldfUFNfU1RBVEUocnB3bV92YWwpOworCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0hJU1IsIDB4MDEwMCk7CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX1NFVF9SUFdNLAorCQkJCSh1OCAqKSAoJnJwd21fdmFsKSk7CisJCQlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQkJcnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQkJbW9kX3RpbWVyKCZydGxwcml2LT53b3Jrcy5md19jbG9ja29mZl90aW1lciwKKwkJCQkJICBqaWZmaWVzICsgTVNFQ1MoMTApKTsKKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3NldF9md19wc19yZl9vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1OCBycHdtX3ZhbCA9IDA7CisJcnB3bV92YWwgfD0gKEZXX1BTX1NUQVRFX1JGX09GRl84ODIxQUUgfCBGV19QU19BQ0spOworCV9ydGw4ODIxYWVfc2V0X2Z3X2Nsb2NrX29uKGh3LCBycHdtX3ZhbCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZndscHNfbGVhdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBiX2Z3X2N1cnJlbnRfaW5wcyA9IGZhbHNlOworCXU4IHJwd21fdmFsID0gMCxmd19wd3Jtb2RlID0gRldfUFNfQUNUSVZFX01PREU7CisKKwlpZiAocHBzYy0+Yl9sb3dfcG93ZXJfZW5hYmxlKXsKKwkJcnB3bV92YWwgPSAoRldfUFNfU1RBVEVfQUxMX09OXzg4MjFBRXxGV19QU19BQ0spOy8qIFJGIG9uICovCisJCV9ydGw4ODIxYWVfc2V0X2Z3X2Nsb2NrX29uKGh3LCBycHdtX3ZhbCwgZmFsc2UpOworCQlydGxoYWwtPmJhbGxvd19zd190b19jaGFuZ2VfaHdjbGMgPSBmYWxzZTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9IMkNfRldfUFdSTU9ERSwKKwkJCQkodTggKikgKCZmd19wd3Jtb2RlKSk7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfRldfUFNNT0RFX1NUQVRVUywKKwkJCQkodTggKikgKCZiX2Z3X2N1cnJlbnRfaW5wcykpOworCX0gZWxzZSB7CisJCXJwd21fdmFsID0gRldfUFNfU1RBVEVfQUxMX09OXzg4MjFBRTsJLyogUkYgb24gKi8KKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9TRVRfUlBXTSwKKwkJCQkodTggKikgKCZycHdtX3ZhbCkpOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0gyQ19GV19QV1JNT0RFLAorCQkJCSh1OCAqKSAoJmZ3X3B3cm1vZGUpKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9GV19QU01PREVfU1RBVFVTLAorCQkJCSh1OCAqKSAoJmJfZndfY3VycmVudF9pbnBzKSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfZndscHNfZW50ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBiX2Z3X2N1cnJlbnRfaW5wcyA9IHRydWU7CisJdTggcnB3bV92YWw7CisKKwlpZiAocHBzYy0+Yl9sb3dfcG93ZXJfZW5hYmxlKXsKKwkJcnB3bV92YWwgPSBGV19QU19TVEFURV9SRl9PRkZfTE9XX1BXUl84ODIxQUU7CS8qIFJGIG9mZiAqLworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQlIV19WQVJfRldfUFNNT0RFX1NUQVRVUywKKwkJCQkodTggKikgKCZiX2Z3X2N1cnJlbnRfaW5wcykpOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQlIV19WQVJfSDJDX0ZXX1BXUk1PREUsCisJCQkJKHU4ICopICgmcHBzYy0+ZndjdHJsX3BzbW9kZSkpOworCQlydGxoYWwtPmJhbGxvd19zd190b19jaGFuZ2VfaHdjbGMgPSB0cnVlOworCQlfcnRsODgyMWFlX3NldF9md19jbG9ja19vZmYoaHcsIHJwd21fdmFsKTsKKworCisJfSBlbHNlIHsKKwkJcnB3bV92YWwgPSBGV19QU19TVEFURV9SRl9PRkZfODgyMUFFOwkvKiBSRiBvZmYgKi8KKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsCisJCQkJKHU4ICopICgmYl9md19jdXJyZW50X2lucHMpKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJSFdfVkFSX0gyQ19GV19QV1JNT0RFLAorCQkJCSh1OCAqKSAoJnBwc2MtPmZ3Y3RybF9wc21vZGUpKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJSFdfVkFSX1NFVF9SUFdNLAorCQkJCSh1OCAqKSAoJnJwd21fdmFsKSk7CisJfQorCit9CisKK3ZvaWQgcnRsODgyMWFlX2dldF9od19yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisKKwlzd2l0Y2ggKHZhcmlhYmxlKSB7CisJY2FzZSBIV19WQVJfRVRIRVJfQUREUjoKKwkJKigodTMyICopKHZhbCkpID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX01BQ0lEKTsKKwkJKigodTE2ICopKHZhbCs0KSkgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsIFJFR19NQUNJRCArIDQpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9CU1NJRDoKKwkJKigodTMyICopKHZhbCkpID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX0JTU0lEKTsKKwkJKigodTE2ICopKHZhbCs0KSkgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsIFJFR19CU1NJRCs0KTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfTUVESUFfU1RBVFVTOgorCQl2YWxbMF0gPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DUisyKSAmIDB4MzsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfU0xPVF9USU1FOgorCQkqKCh1OCAqKSh2YWwpKSA9IG1hYy0+c2xvdF90aW1lOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9CRUFDT05fSU5URVJWQUw6CisJCSooKHUxNiAqKSh2YWwpKSA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX0JDTl9JTlRFUlZBTCk7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX0FUSU1fV0lORE9XOgorCQkqKCh1MTYgKikodmFsKSkgPSAgcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfQVRJTVdORCk7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX1JDUjoKKwkJKigodTMyICopICh2YWwpKSA9IHJ0bHBjaS0+cmVjZWl2ZV9jb25maWc7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX1JGX1NUQVRFOgorCQkqKChlbnVtIHJmX3B3cnN0YXRlICopKHZhbCkpID0gcHBzYy0+cmZwd3Jfc3RhdGU7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX0ZXTFBTX1JGX09OOnsKKwkJCWVudW0gcmZfcHdyc3RhdGUgcmZTdGF0ZTsKKwkJCXUzMiB2YWxfcmNyOworCisJCQlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9SRl9TVEFURSwKKwkJCQkJCSAgICAgICh1OCAqKSAoJnJmU3RhdGUpKTsKKwkJCWlmIChyZlN0YXRlID09IEVSRk9GRikgeworCQkJCSooKGJvb2wgKikgKHZhbCkpID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsX3JjciA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IpOworCQkJCXZhbF9yY3IgJj0gMHgwMDA3MDAwMDsKKwkJCQlpZiAodmFsX3JjcikKKwkJCQkJKigoYm9vbCAqKSAodmFsKSkgPSBmYWxzZTsKKwkJCQllbHNlCisJCQkJCSooKGJvb2wgKikgKHZhbCkpID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfRldfUFNNT0RFX1NUQVRVUzoKKwkJKigoYm9vbCAqKSAodmFsKSkgPSBwcHNjLT5iX2Z3X2N1cnJlbnRfaW5wc21vZGU7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX0NPUlJFQ1RfVFNGOnsKKwkJCXU2NCB0c2Y7CisJCQl1MzIgKnB0c2ZfbG93ID0gKHUzMiAqKSAmIHRzZjsKKwkJCXUzMiAqcHRzZl9oaWdoID0gKCh1MzIgKikgJiB0c2YpICsgMTsKKworCQkJKnB0c2ZfaGlnaCA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIChSRUdfVFNGVFIgKyA0KSk7CisJCQkqcHRzZl9sb3cgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfVFNGVFIpOworCisJCQkqKCh1NjQgKikgKHZhbCkpID0gdHNmOworCisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIix2YXJpYWJsZSkpOworCQlicmVhazsKKwl9Cit9CisKKwordm9pZCBydGw4ODIxYWVfc2V0X2h3X3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdmFyaWFibGUsIHU4ICp2YWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggaWR4OworCisJc3dpdGNoICh2YXJpYWJsZSkgeworCWNhc2UgSFdfVkFSX0VUSEVSX0FERFI6eworCQkJZm9yIChpZHggPSAwOyBpZHggPCBFVEhfQUxFTjsgaWR4KyspIHsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoUkVHX01BQ0lEICsgaWR4KSwKKwkJCQkJICAgICAgIHZhbFtpZHhdKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfQkFTSUNfUkFURTp7CisJCQl1MTYgYl9yYXRlX2NmZyA9ICgodTE2ICopIHZhbClbMF07CisJCQl1OCByYXRlX2luZGV4ID0gMDsKKwkJCWJfcmF0ZV9jZmcgPSBiX3JhdGVfY2ZnICYgMHgxNWY7CisJCQliX3JhdGVfY2ZnIHw9IDB4MDE7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlJTUiwgYl9yYXRlX2NmZyAmIDB4ZmYpOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JSU1IgKyAxLAorCQkJCSAgICAgICAoYl9yYXRlX2NmZyA+PiA4KSAmIDB4ZmYpOworCQkJd2hpbGUgKGJfcmF0ZV9jZmcgPiAweDEpIHsKKwkJCQliX3JhdGVfY2ZnID0gKGJfcmF0ZV9jZmcgPj4gMSk7CisJCQkJcmF0ZV9pbmRleCsrOworCQkJfQorCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0lOSVJUU19SQVRFX1NFTCwKKwkJCQkgICAgICAgcmF0ZV9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFdfVkFSX0JTU0lEOnsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgRVRIX0FMRU47IGlkeCsrKSB7CisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKFJFR19CU1NJRCArIGlkeCksCisJCQkJCSAgICAgICB2YWxbaWR4XSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFdfVkFSX1NJRlM6eworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NJRlNfQ1RYICsgMSwgdmFsWzBdKTsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TSUZTX1RSWCArIDEsIHZhbFsxXSk7CisKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TUEVDX1NJRlMgKyAxLCB2YWxbMF0pOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BQ19TUEVDX1NJRlMgKyAxLCB2YWxbMF0pOworCisJCQlpZiAoIW1hYy0+aHRfZW5hYmxlKQorCQkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19SRVNQX1NJRlNfT0ZETSwKKwkJCQkJICAgICAgIDB4MGUwZSk7CisJCQllbHNlCisJCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1JFU1BfU0lGU19PRkRNLAorCQkJCQkgICAgICAgKigodTE2ICopIHZhbCkpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIEhXX1ZBUl9TTE9UX1RJTUU6eworCQkJdTggZV9hY2k7CisKKwkJCVJUX1RSQUNFKENPTVBfTUxNRSwgREJHX0xPVUQsCisJCQkJICgiSFdfVkFSX1NMT1RfVElNRSAleFxuIiwgdmFsWzBdKSk7CisKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TTE9ULCB2YWxbMF0pOworCisJCQlmb3IgKGVfYWNpID0gMDsgZV9hY2kgPCBBQ19NQVg7IGVfYWNpKyspIHsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCQkgICAgICBIV19WQVJfQUNfUEFSQU0sCisJCQkJCQkJICAgICAgKHU4ICopICgmZV9hY2kpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfQUNLX1BSRUFNQkxFOnsKKwkJCXU4IHJlZ190bXA7CisJCQl1OCBzaG9ydF9wcmVhbWJsZSA9IChib29sKSAoKih1OCAqKSB2YWwpOworCQkJcmVnX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RSWFBUQ0xfQ1RMKzIpOworCQkJaWYgKHNob3J0X3ByZWFtYmxlKXsKKwkJCQlyZWdfdG1wIHw9IEJJVCgxKTsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFJYUFRDTF9DVEwgKyAyLCByZWdfdG1wKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVnX3RtcCAmPSAofkJJVCgxKSk7CisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RSWFBUQ0xfQ1RMICsgMiwgcmVnX3RtcCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFdfVkFSX1dQQV9DT05GSUc6CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TRUNDRkcsICooKHU4ICopIHZhbCkpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0U6eworCQkJdTggbWluX3NwYWNpbmdfdG9fc2V0OworCQkJdTggc2VjX21pbl9zcGFjZTsKKworCQkJbWluX3NwYWNpbmdfdG9fc2V0ID0gKigodTggKikgdmFsKTsKKwkJCWlmIChtaW5fc3BhY2luZ190b19zZXQgPD0gNykgeworCQkJCXNlY19taW5fc3BhY2UgPSAwOworCisJCQkJaWYgKG1pbl9zcGFjaW5nX3RvX3NldCA8IHNlY19taW5fc3BhY2UpCisJCQkJCW1pbl9zcGFjaW5nX3RvX3NldCA9IHNlY19taW5fc3BhY2U7CisKKwkJCQltYWMtPm1pbl9zcGFjZV9jZmcgPSAoKG1hYy0+bWluX3NwYWNlX2NmZyAmCisJCQkJCQkgICAgICAgMHhmOCkgfAorCQkJCQkJICAgICAgbWluX3NwYWNpbmdfdG9fc2V0KTsKKworCQkJCSp2YWwgPSBtaW5fc3BhY2luZ190b19zZXQ7CisKKwkJCQlSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELAorCQkJCQkgKCJTZXQgSFdfVkFSX0FNUERVX01JTl9TUEFDRTogJSN4XG4iLAorCQkJCQkgIG1hYy0+bWluX3NwYWNlX2NmZykpOworCisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FNUERVX01JTl9TUEFDRSwKKwkJCQkJICAgICAgIG1hYy0+bWluX3NwYWNlX2NmZyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFdfVkFSX1NIT1JUR0lfREVOU0lUWTp7CisJCQl1OCBkZW5zaXR5X3RvX3NldDsKKworCQkJZGVuc2l0eV90b19zZXQgPSAqKCh1OCAqKSB2YWwpOworCQkJbWFjLT5taW5fc3BhY2VfY2ZnIHw9IChkZW5zaXR5X3RvX3NldCA8PCAzKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwKKwkJCQkgKCJTZXQgSFdfVkFSX1NIT1JUR0lfREVOU0lUWTogJSN4XG4iLAorCQkJCSAgbWFjLT5taW5fc3BhY2VfY2ZnKSk7CisKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BTVBEVV9NSU5fU1BBQ0UsCisJCQkJICAgICAgIG1hYy0+bWluX3NwYWNlX2NmZyk7CisKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfQU1QRFVfRkFDVE9SOnsKKwkJCXUzMglhbXBkdV9sZW4gPSAgKCooKHU4ICopdmFsKSk7CisJCQlpZihydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpIHsKKwkJCQlpZihhbXBkdV9sZW4gPCBWSFRfQUdHX1NJWkVfMTI4SykKKwkJCQkJYW1wZHVfbGVuID0gKDB4MjAwMCA8PCAoKigodTggKil2YWwpKSkgLTE7CisJCQkJZWxzZQorCQkJCQlhbXBkdV9sZW4gPSAweDFmZmZmOworCQkJfSBlbHNlIGlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkgeworCQkJCWlmKGFtcGR1X2xlbiA8IEhUX0FHR19TSVpFXzY0SykKKwkJCQkJYW1wZHVfbGVuID0gKDB4MjAwMCA8PCAoKigodTggKil2YWwpKSkgLTE7CisJCQkJZWxzZQorCQkJCQlhbXBkdV9sZW4gPSAweGZmZmY7CisJCQl9CisJCQlhbXBkdV9sZW4gfD0gQklUKDMxKTsKKworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsCisJCQkJUkVHX0FNUERVX01BWF9MRU5HVEhfODgxMiwgYW1wZHVfbGVuKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfQUNfUEFSQU06eworCQkJdTggZV9hY2kgPSAqKCh1OCAqKSB2YWwpOworCQkJcnRsODgyMWFlX2RtX2luaXRfZWRjYV90dXJibyhodyk7CisKKwkJCWlmIChydGxwY2ktPmFjbV9tZXRob2QgIT0gZUFjbVdheTJfU1cpCisJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJCQkJICAgICAgSFdfVkFSX0FDTV9DVFJMLAorCQkJCQkJCSAgICAgICh1OCAqKSAoJmVfYWNpKSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFdfVkFSX0FDTV9DVFJMOnsKKwkJCXU4IGVfYWNpID0gKigodTggKikgdmFsKTsKKwkJCXVuaW9uIGFjaV9haWZzbiAqcF9hY2lfYWlmc24gPQorCQkJICAgICh1bmlvbiBhY2lfYWlmc24gKikoJihtYWMtPmFjWzBdLmFpZnMpKTsKKwkJCXU4IGFjbSA9IHBfYWNpX2FpZnNuLT5mLmFjbTsKKwkJCXU4IGFjbV9jdHJsID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQUNNSFdDVFJMKTsKKworCQkJYWNtX2N0cmwgPQorCQkJICAgIGFjbV9jdHJsIHwgKChydGxwY2ktPmFjbV9tZXRob2QgPT0gMikgPyAweDAgOiAweDEpOworCisJCQlpZiAoYWNtKSB7CisJCQkJc3dpdGNoIChlX2FjaSkgeworCQkJCWNhc2UgQUMwX0JFOgorCQkJCQlhY21fY3RybCB8PSBBY21Id19CZXFFbjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBQzJfVkk6CisJCQkJCWFjbV9jdHJsIHw9IEFjbUh3X1ZpcUVuOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFDM19WTzoKKwkJCQkJYWNtX2N0cmwgfD0gQWNtSHdfVm9xRW47CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJCSAoIkhXX1ZBUl9BQ01fQ1RSTCBhY20gc2V0ICIKKwkJCQkJCSAgImZhaWxlZDogZUFDSSBpcyAlZFxuIiwgYWNtKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChlX2FjaSkgeworCQkJCWNhc2UgQUMwX0JFOgorCQkJCQlhY21fY3RybCAmPSAofkFjbUh3X0JlcUVuKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBQzJfVkk6CisJCQkJCWFjbV9jdHJsICY9ICh+QWNtSHdfVmlxRW4pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFDM19WTzoKKwkJCQkJYWNtX2N0cmwgJj0gKH5BY21Id19CZXFFbik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyBcbiIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlSVF9UUkFDRShDT01QX1FPUywgREJHX1RSQUNFLAorCQkJCSAoIlNldEh3UmVnODE5MHBjaSgpOiBbSFdfVkFSX0FDTV9DVFJMXSAiCisJCQkJICAiV3JpdGUgMHglWFxuIiwgYWNtX2N0cmwpKTsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BQ01IV0NUUkwsIGFjbV9jdHJsKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfUkNSOnsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCAoKHUzMiAqKSAodmFsKSlbMF0pOworCQkJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyA9ICgodTMyICopICh2YWwpKVswXTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfUkVUUllfTElNSVQ6eworCQkJdTggcmV0cnlfbGltaXQgPSAoKHU4ICopICh2YWwpKVswXTsKKworCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1JMLAorCQkJCSAgICAgICByZXRyeV9saW1pdCA8PCBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCB8CisJCQkJICAgICAgIHJldHJ5X2xpbWl0IDw8IFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIEhXX1ZBUl9EVUFMX1RTRl9SU1Q6CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19EVUFMX1RTRl9SU1QsIChCSVQoMCkgfCBCSVQoMSkpKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfRUZVU0VfQllURVM6CisJCXJ0bGVmdXNlLT5lZnVzZV91c2VkYnl0ZXMgPSAqKCh1MTYgKikgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfRUZVU0VfVVNBR0U6CisJCXJ0bGVmdXNlLT5lZnVzZV91c2VkcGVyY2VudGFnZSA9ICooKHU4ICopIHZhbCk7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX0lPX0NNRDoKKwkJcnRsODgyMWFlX3BoeV9zZXRfaW9fY21kKGh3LCAoKihlbnVtIGlvX3R5cGUgKil2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfU0VUX1JQV006eworCQkJdTggcnB3bV92YWw7CisKKwkJCXJwd21fdmFsID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUENJRV9IUlBXTSk7CisJCQl1ZGVsYXkoMSk7CisKKwkJCWlmIChycHdtX3ZhbCAmIEJJVCg3KSkgeworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0hSUFdNLAorCQkJCQkgICAgICAgKCoodTggKikgdmFsKSk7CisJCQl9IGVsc2UgeworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0hSUFdNLAorCQkJCQkgICAgICAgKCgqKHU4ICopIHZhbCkgfCBCSVQoNykpKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwljYXNlIEhXX1ZBUl9IMkNfRldfUFdSTU9ERTp7CisJCQlydGw4ODIxYWVfc2V0X2Z3X3B3cm1vZGVfY21kKGh3LCAoKih1OCAqKSB2YWwpKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfRldfUFNNT0RFX1NUQVRVUzoKKwkJcHBzYy0+Yl9md19jdXJyZW50X2lucHNtb2RlID0gKigoYm9vbCAqKSB2YWwpOworCQlicmVhazsKKworCWNhc2UgSFdfVkFSX1JFU1VNRV9DTEtfT046CisJCV9ydGw4ODIxYWVfc2V0X2Z3X3BzX3JmX29uKGh3KTsKKwkJYnJlYWs7CisKKwljYXNlIEhXX1ZBUl9GV19MUFNfQUNUSU9OOnsKKwkJYm9vbCBiX2VudGVyX2Z3bHBzID0gKigoYm9vbCAqKSB2YWwpOworCisJCWlmIChiX2VudGVyX2Z3bHBzKQorCQkJX3J0bDg4MjFhZV9md2xwc19lbnRlcihodyk7CisJCSBlbHNlCisJCQlfcnRsODgyMWFlX2Z3bHBzX2xlYXZlKGh3KTsKKworCQkgYnJlYWs7CisJCX0KKworCWNhc2UgSFdfVkFSX0gyQ19GV19KT0lOQlNTUlBUOnsKKwkJCXU4IG1zdGF0dXMgPSAoKih1OCAqKSB2YWwpOworCQkJdTggdG1wX3JlZ2NyLCB0bXBfcmVnNDIyLGJjbnZhbGlkX3JlZzsKKwkJCXU4IGNvdW50ID0gMCwgZGxiY25fY291bnQgPSAwOworCQkJYm9vbCBiX3JlY292ZXIgPSBmYWxzZTsKKworCQkJaWYgKG1zdGF0dXMgPT0gUlRfTUVESUFfQ09OTkVDVCkgeworCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfQUlELAorCQkJCQkJCSAgICAgIE5VTEwpOworCisJCQkJdG1wX3JlZ2NyID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAxKTsKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAxLAorCQkJCQkgICAgICAgKHRtcF9yZWdjciB8IEJJVCgwKSkpOworCisJCQkJX3J0bDg4MjFhZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCAwLCBCSVQoMykpOworCQkJCV9ydGw4ODIxYWVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDQpLCAwKTsKKworCQkJCXRtcF9yZWc0MjIgPQorCQkJCSAgICBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCQkgIFJFR19GV0hXX1RYUV9DVFJMICsgMik7CisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAorCQkJCQkgICAgICAgdG1wX3JlZzQyMiAmICh+QklUKDYpKSk7CisJCQkJaWYgKHRtcF9yZWc0MjIgJiBCSVQoNikpCisJCQkJCWJfcmVjb3ZlciA9IHRydWU7CisKKwkJCQlkbyB7CisJCQkJCWJjbnZhbGlkX3JlZyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RERUNUUkwrMik7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UREVDVFJMKzIsKGJjbnZhbGlkX3JlZyB8IEJJVCgwKSkpOworCQkJCQlfcnRsODgyMWFlX3JldHVybl9iZWFjb25fcXVldWVfc2tiKGh3KTsKKworCQkJCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJCQkJcnRsODgxMmFlX3NldF9md19yc3ZkcGFnZXBrdChodywgMCk7CisJCQkJCWVsc2UKKwkJCQkJCXJ0bDg4MjFhZV9zZXRfZndfcnN2ZHBhZ2Vwa3QoaHcsIDApOworCQkJCQliY252YWxpZF9yZWcgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19UREVDVFJMKzIpOworCQkJCQljb3VudCA9IDA7CisJCQkJCXdoaWxlICghKGJjbnZhbGlkX3JlZyAmIEJJVCgwKSkgJiYgY291bnQgPDIwKXsKKwkJCQkJCWNvdW50Kys7CisJCQkJCQl1ZGVsYXkoMTApOworCQkJCQkJYmNudmFsaWRfcmVnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfVERFQ1RSTCsyKTsKKwkJCQkJfQorCQkJCQlkbGJjbl9jb3VudCsrOworCQkJCX0gd2hpbGUgKCEoYmNudmFsaWRfcmVnICYgQklUKDApKSAmJiBkbGJjbl9jb3VudCA8NSk7CisKKwkJCQlpZiAoYmNudmFsaWRfcmVnICYgQklUKDApKQorCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVERFQ1RSTCsyLCBCSVQoMCkpOworCisJCQkJX3J0bDg4MjFhZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCBCSVQoMyksIDApOworCQkJCV9ydGw4ODIxYWVfc2V0X2Jjbl9jdHJsX3JlZyhodywgMCwgQklUKDQpKTsKKworCQkJCWlmIChiX3JlY292ZXIpIHsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwKKwkJCQkJCSAgICAgICBSRUdfRldIV19UWFFfQ1RSTCArIDIsCisJCQkJCQkgICAgICAgdG1wX3JlZzQyMik7CisJCQkJfQorCisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0NSICsgMSwKKwkJCQkJICAgICAgICh0bXBfcmVnY3IgJiB+KEJJVCgwKSkpKTsKKwkJCX0KKwkJCXJ0bDg4MjFhZV9zZXRfZndfam9pbmJzc19yZXBvcnRfY21kKGh3LCAoKih1OCAqKSB2YWwpKTsKKworCQkJYnJlYWs7CisJCX0KKwljYXNlIEhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQ6eworCQlydGw4ODIxYWVfc2V0X3AycF9wc19vZmZsb2FkX2NtZChodywgKCoodTggKikgdmFsKSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSFdfVkFSX0FJRDp7CisJCQl1MTYgdTJidG1wOworCQkJdTJidG1wID0gcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfQkNOX1BTUl9SUFQpOworCQkJdTJidG1wICY9IDB4QzAwMDsKKwkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19CQ05fUFNSX1JQVCwgKHUyYnRtcCB8CisJCQkJCQltYWMtPmFzc29jX2lkKSk7CisKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfQ09SUkVDVF9UU0Y6eworCQkJdTggYnR5cGVfaWJzcyA9ICgodTggKikgKHZhbCkpWzBdOworCisJCQlpZiAoYnR5cGVfaWJzcyA9PSB0cnVlKQorCQkJCV9ydGw4ODIxYWVfc3RvcF90eF9iZWFjb24oaHcpOworCisJCQlfcnRsODgyMWFlX3NldF9iY25fY3RybF9yZWcoaHcsIDAsIEJJVCgzKSk7CisKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVFNGVFIsCisJCQkJCSh1MzIpIChtYWMtPnRzZiAmIDB4ZmZmZmZmZmYpKTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVFNGVFIgKyA0LAorCQkJCQkodTMyKSAoKG1hYy0+dHNmID4+IDMyKSAmIDB4ZmZmZmZmZmYpKTsKKworCQkJX3J0bDg4MjFhZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCBCSVQoMyksIDApOworCisJCQlpZiAoYnR5cGVfaWJzcyA9PSB0cnVlKQorCQkJCV9ydGw4ODIxYWVfcmVzdW1lX3R4X2JlYWNvbihodyk7CisKKwkJCWJyZWFrOworCisJCX0KKwljYXNlIEhXX1ZBUl9OQVZfVVBQRVI6IHsKKwkJCXUzMgl1c19uYXZfdXBwZXIgPSAoKHUzMikqdmFsKTsKKworCQkJaWYodXNfbmF2X3VwcGVyID4gSEFMXzkyQ19OQVZfVVBQRVJfVU5JVCAqIDB4RkYpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklUICwgREJHX1dBUk5JTkcsCisJCQkJCSgiVGhlIHNldHRpbmcgdmFsdWUgKDB4JTA4WCB1cykgb2YgTkFWX1VQUEVSIgorCQkJCQkgIiBpcyBsYXJnZXIgdGhhbiAoJWQgKiAweEZGKSEhIVxuIiwKKwkJCQkJIHVzX25hdl91cHBlciwgSEFMXzkyQ19OQVZfVVBQRVJfVU5JVCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX05BVl9VUFBFUiwKKwkJCQkoKHU4KSgodXNfbmF2X3VwcGVyICsgSEFMXzkyQ19OQVZfVVBQRVJfVU5JVCAtIDEpIC8gSEFMXzkyQ19OQVZfVVBQRVJfVU5JVCkpKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIV19WQVJfS0VFUF9BTElWRTogeworCQkJdTggYXJyYXlbMl07CisJCQlhcnJheVswXSA9IDB4ZmY7CisJCQlhcnJheVsxXSA9ICooKHU4ICopdmFsKTsKKwkJCXJ0bDg4MjFhZV9maWxsX2gyY19jbWQoaHcsIEgyQ184ODIxQUVfS0VFUF9BTElWRV9DVFJMLCAyLCBhcnJheSk7CisJCX0KKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoInN3aXRjaCBjYXNlICIKKwkJCQkJCQkibm90IHByb2Nlc3MgJXhcbiIsdmFyaWFibGUpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX2xsdF93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGFkZHJlc3MsIHUzMiBkYXRhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlib29sIHN0YXR1cyA9IHRydWU7CisJbG9uZyBjb3VudCA9IDA7CisJdTMyIHZhbHVlID0gX0xMVF9JTklUX0FERFIoYWRkcmVzcykgfAorCSAgICBfTExUX0lOSVRfREFUQShkYXRhKSB8IF9MTFRfT1AoX0xMVF9XUklURV9BQ0NFU1MpOworCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19MTFRfSU5JVCwgdmFsdWUpOworCisJZG8geworCQl2YWx1ZSA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19MTFRfSU5JVCk7CisJCWlmIChfTExUX05PX0FDVElWRSA9PSBfTExUX09QX1ZBTFVFKHZhbHVlKSkKKwkJCWJyZWFrOworCisJCWlmIChjb3VudCA+IFBPTExJTkdfTExUX1RIUkVTSE9MRCkgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkgKCJGYWlsZWQgdG8gcG9sbGluZyB3cml0ZSBMTFQgZG9uZSBhdCAiCisJCQkJICAiYWRkcmVzcyAlZCFcbiIsIGFkZHJlc3MpKTsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgrK2NvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfbGx0X3RhYmxlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXVuc2lnbmVkIHNob3J0IGk7CisJdTggdHhwa3RidWZfYm5keTsKKwl1OCBtYXhQYWdlOworCWJvb2wgc3RhdHVzOworCisJbWF4UGFnZSA9IDI1NTsKKwl0eHBrdGJ1Zl9ibmR5ID0gMHhGODsKKworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RSWEZGX0JORFksIHR4cGt0YnVmX2JuZHkpOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19UUlhGRl9CTkRZICsgMiwgTUFYX1JYX0RNQV9CVUZGRVJfU0laRSAtIDEpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RERUNUUkwgKyAxLCB0eHBrdGJ1Zl9ibmR5KTsKKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UWFBLVEJVRl9CQ05RX0JETlksIHR4cGt0YnVmX2JuZHkpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UWFBLVEJVRl9NR1FfQkROWSwgdHhwa3RidWZfYm5keSk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUEJQLCAweDMxKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhfRFJWSU5GT19TWiwgMHg0KTsKKworCWZvciAoaSA9IDA7IGkgPCAodHhwa3RidWZfYm5keSAtIDEpOyBpKyspIHsKKwkJc3RhdHVzID0gX3J0bDg4MjFhZV9sbHRfd3JpdGUoaHcsIGksIGkgKyAxKTsKKwkJaWYgKHRydWUgIT0gc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBfcnRsODgyMWFlX2xsdF93cml0ZShodywgKHR4cGt0YnVmX2JuZHkgLSAxKSwgMHhGRik7CisJaWYgKHRydWUgIT0gc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJZm9yIChpID0gdHhwa3RidWZfYm5keTsgaSA8IG1heFBhZ2U7IGkrKykgeworCQlzdGF0dXMgPSBfcnRsODgyMWFlX2xsdF93cml0ZShodywgaSwgKGkgKyAxKSk7CisJCWlmICh0cnVlICE9IHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gX3J0bDg4MjFhZV9sbHRfd3JpdGUoaHcsIG1heFBhZ2UsIHR4cGt0YnVmX2JuZHkpOworCWlmICh0cnVlICE9IHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUlFQTiwgMHg4MGU3MDgwOCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JRUE5fTlBRLCAweDAwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX2dlbl9yZWZyZXNoX2xlZF9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2xlZCAqcExlZDAgPSAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQwKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC51cF9maXJzdF90aW1lKQorCQlyZXR1cm47CisKKwlpZiAocHBzYy0+cmZvZmZfcmVhc29uID09IFJGX0NIQU5HRV9CWV9JUFMpCisJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJCQlydGw4ODEyYWVfc3dfbGVkX29uKGh3LCBwTGVkMCk7CisJCWVsc2UKKwkJCXJ0bDg4MjFhZV9zd19sZWRfb24oaHcsIHBMZWQwKTsKKwllbHNlIGlmIChwcHNjLT5yZm9mZl9yZWFzb24gPT0gUkZfQ0hBTkdFX0JZX0lOSVQpCisJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJCQlydGw4ODEyYWVfc3dfbGVkX29uKGh3LCBwTGVkMCk7CisJCWVsc2UKKwkJCXJ0bDg4MjFhZV9zd19sZWRfb24oaHcsIHBMZWQwKTsKKwllbHNlCisJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJCQlydGw4ODEyYWVfc3dfbGVkX29mZihodywgcExlZDApOworCQllbHNlCisJCQlydGw4ODIxYWVfc3dfbGVkX29mZihodywgcExlZDApOworfQorCitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX2luaXRfbWFjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisKKwl1OCBieXRldG1wID0gMDsKKwl1MTYgd29yZHRtcCA9IDA7CisJYm9vbCBiX21hY19mdW5jX2VuYWJsZSA9IHJ0bGhhbC0+Yl9tYWNfZnVuY19lbmFibGU7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwsIDB4MDApOworCisJLypBdXRvIFBvd2VyIERvd24gdG8gQ0hJUC1vZmYgU3RhdGUqLworCWJ5dGV0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19BUFNfRlNNQ08gKyAxKSAmICh+QklUKDcpKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgYnl0ZXRtcCk7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKSB7CisJCS8qIEhXIFBvd2VyIG9uIHNlcXVlbmNlKi8KKwkJaWYoIXJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZyhydGxwcml2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKKwkJCVBXUl9JTlRGX1BDSV9NU0ssIFJUTDg4MTJfTklDX0VOQUJMRV9GTE9XKSkgeworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCxEQkdfTE9VRCwoImluaXQgODgxMiBNQUMgRmFpbCBhcyBwb3dlciBvbiBmYWlsdXJlXG4iKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJLyogSFcgUG93ZXIgb24gc2VxdWVuY2UgKi8KKwkJaWYgKCFydGxfaGFsX3B3cnNlcWNtZHBhcnNpbmcocnRscHJpdiwgUFdSX0NVVF9BX01TSywgUFdSX0ZBQl9BTExfTVNLLAorCQkJUFdSX0lOVEZfUENJX01TSywgUlRMODgyMUFfTklDX0VOQUJMRV9GTE9XKSl7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsKCJpbml0IDg4MjEgTUFDIEZhaWwgYXMgcG93ZXIgb24gZmFpbHVyZVxuIikpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0FQU19GU01DTykgfCBCSVQoNCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FQU19GU01DTywgYnl0ZXRtcCk7CisKKwlieXRldG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQ1IpOworCWJ5dGV0bXAgPSAweGZmOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DUiwgYnl0ZXRtcCk7CisJbWRlbGF5KDIpOworCisJYnl0ZXRtcCB8PSAweDdmOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19IV1NFUV9DVFJMLCBieXRldG1wKTsKKwltZGVsYXkoMik7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKSB7CisJCWJ5dGV0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19TWVNfQ0ZHICsgMyk7CisJCWlmIChieXRldG1wICYgQklUKDApKSB7CisJCQlieXRldG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDdjKTsKKwkJCWJ5dGV0bXAgfD0gQklUKDYpOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg3YywgYnl0ZXRtcCk7CisJCX0KKwl9CisKKwlieXRldG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfR1BJT19NVVhDRkcgKyAxKTsKKwlieXRldG1wICY9IH5CSVQoNCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0dQSU9fTVVYQ0ZHICsgMSwgYnl0ZXRtcCk7CisKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfQ1IsIDB4MmZmKTsKKworCWlmICghYl9tYWNfZnVuY19lbmFibGUpIHsKKwkJaWYgKCFfcnRsODgyMWFlX2xsdF90YWJsZV9pbml0KGh3KSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJU1IsIDB4ZmZmZmZmZmYpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElTUkUsIDB4ZmZmZmZmZmYpOworCisJLyogRW5hYmxlIEZXIEJlYW1mb3JtZXIgSW50ZXJydXB0ICovCisJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0ZXSU1SICsgMyk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0ZXSU1SICsgMywgYnl0ZXRtcCB8IEJJVCg2KSk7CisKKwl3b3JkdG1wID0gcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfVFJYRE1BX0NUUkwpOworCXdvcmR0bXAgJj0gMHhmOworCXdvcmR0bXAgfD0gMHhGNUIxOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19UUlhETUFfQ1RSTCwgd29yZHRtcCk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCArIDEsIDB4MUYpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfUlhGTFRNQVAyLCAweEZGRkYpOworCS8qbG93IGFkZHJlc3MqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQkNOUV9ERVNBLAorCQkJcnRscGNpLT50eF9yaW5nW0JFQUNPTl9RVUVVRV0uZG1hICYgRE1BX0JJVF9NQVNLKDMyKSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19NR1FfREVTQSwKKwkJCXJ0bHBjaS0+dHhfcmluZ1tNR05UX1FVRVVFXS5kbWEgJiBETUFfQklUX01BU0soMzIpKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1ZPUV9ERVNBLAorCQkJcnRscGNpLT50eF9yaW5nW1ZPX1FVRVVFXS5kbWEgJiBETUFfQklUX01BU0soMzIpKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1ZJUV9ERVNBLAorCQkJcnRscGNpLT50eF9yaW5nW1ZJX1FVRVVFXS5kbWEgJiBETUFfQklUX01BU0soMzIpKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0JFUV9ERVNBLAorCQkJcnRscGNpLT50eF9yaW5nW0JFX1FVRVVFXS5kbWEgJiBETUFfQklUX01BU0soMzIpKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0JLUV9ERVNBLAorCQkJcnRscGNpLT50eF9yaW5nW0JLX1FVRVVFXS5kbWEgJiBETUFfQklUX01BU0soMzIpKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hRX0RFU0EsCisJCQlydGxwY2ktPnR4X3JpbmdbSElHSF9RVUVVRV0uZG1hICYgRE1BX0JJVF9NQVNLKDMyKSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SWF9ERVNBLAorCQkJcnRscGNpLT5yeF9yaW5nW1JYX01QRFVfUVVFVUVdLmRtYSAmIERNQV9CSVRfTUFTSygzMikpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1BDSUVfQ1RSTF9SRUcgKyAzLCAweDc3KTsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSU5UX01JRywgMCk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU0VDT05EQVJZX0NDQV9DVFJMLCAweDMpOworCV9ydGw4ODIxYWVfZ2VuX3JlZnJlc2hfbGVkX3N0YXRlKGh3KTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX2h3X2NvbmZpZ3VyZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwl1MzIgcmVnX3Jyc3I7CisKKwlyZWdfcnJzciA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1JSU1IsIHJlZ19ycnNyKTsKKwkvKiBBUkZCIHRhYmxlIDkgZm9yIDExYWMgNUcgMlNTICovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19BUkZSMCArIDQsIDB4ZmZmZmYwMDApOworCS8qIEFSRkIgdGFibGUgMTAgZm9yIDExYWMgNUcgMVNTICovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19BUkZSMSArIDQsIDB4MDAzZmYwMDApOworCS8qIEFSRkIgdGFibGUgMTEgZm9yIDExYWMgMjRHIDFTUyAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQVJGUjIsIDB4MDAwMDAwMTUpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQVJGUjIgKyA0LCAweDAwM2ZmMDAwKTsKKwkvKiBBUkZCIHRhYmxlIDEyIGZvciAxMWFjIDI0RyAxU1MgKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FSRlIzLCAweDAwMDAwMDE1KTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FSRlIzICsgNCwgMHhmZmNmZjAwMCk7CisJLyogMHg0MjBbN10gPSAwICwgZW5hYmxlIHJldHJ5IEFNUERVIGluIG5ldyBBTVBEIG5vdCBzaW5nYWwgTVBEVS4gKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCwgMHgxRjAwKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQU1QRFVfTUFYX1RJTUUsIDB4NzApOworCisJLypTZXQgcmV0cnkgbGltaXQqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19STCwgMHgwNzA3KTsKKworCisJLyogU2V0IERhdGEgLyBSZXNwb25zZSBhdXRvIHJhdGUgZmFsbGFjayByZXRyeSBjb3VudCovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19EQVJGUkMsIDB4MDEwMDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfREFSRlJDICsgNCwgMHgwNzA2MDUwNCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SQVJGUkMsIDB4MDEwMDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkFSRlJDICsgNCwgMHgwNzA2MDUwNCk7CisKKwlydGxwY2ktPnJlZ19iY25fY3RybF92YWwgPSAweDFkOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05fQ1RSTCwgcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsKTsKKworCS8qIFRCVFQgcHJvaGliaXQgaG9sZCB0aW1lLiBTdWdnZXN0ZWQgYnkgZGVzaWduZXIgVGltQ2hlbi4gKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVEJUVF9QUk9ISUJJVCArIDEsMHhmZik7IC8vIDggbXMKKworCS8qIEFHR1JfQktfVElNRSBSZWc1MUEgMHgxNiAqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19OQVZfUFJPVF9MRU4sIDB4MDA0MCk7CisKKwkvKkZvciBSeCBUUC4gU3VnZ2VzdGVkIGJ5IFNEMSBSaWNoYXJkLiBBZGRlZCBieSB0eW5saS4gMjAxMC4wNC4xMi4qLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfRkFTVF9FRENBX0NUUkwsIDB4MDMwODY2NjYpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0hUX1NJTkdMRV9BTVBEVSwgMHg4MCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JYX1BLVF9MSU1JVCwgMHgyMCk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX01BWF9BR0dSX05VTSwgMHgxRjFGKTsKK30KKworc3RhdGljIHUxNiBfcnRsODgyMWFlX21kaW9fcmVhZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IGFkZHIpCit7CisJdTE2IHJldCA9IDA7CisJdTggdG1wID0gMCwgY291bnQgPSAwOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01ESU9fQ1RMLCBhZGRyIHwgQklUKDYpKTsKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NRElPX0NUTCkgJiBCSVQoNikgOworCWNvdW50ID0gMDsKKwl3aGlsZSAodG1wICYmIGNvdW50IDwgMjApIHsKKwkJdWRlbGF5KDEwKTsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTURJT19DVEwpICYgQklUKDYpOworCQljb3VudCsrOworCX0KKwlpZiAoMCA9PSB0bXApCisJCXJldCA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX01ESU9fUkRBVEEpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfcnRsODgyMWFlX21kaW9fd3JpdGUoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwl1OCB0bXAgPSAwLCBjb3VudCA9IDA7CisKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfTURJT19XREFUQSwgZGF0YSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01ESU9fQ1RMLCBhZGRyIHwgQklUKDUpKTsKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NRElPX0NUTCkgJiBCSVQoNSkgOworCWNvdW50ID0gMDsKKwl3aGlsZSAodG1wICYmIGNvdW50IDwgMjApIHsKKwkJdWRlbGF5KDEwKTsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTURJT19DVEwpICYgQklUKDUpOworCQljb3VudCsrOworCX0KK30KKworc3RhdGljIHU4IF9ydGw4ODIxYWVfZGJpX3JlYWQoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MTYgYWRkcikKK3sKKwl1MTYgcmVhZF9hZGRyID0gYWRkciAmIDB4ZmZmYzsKKwl1OCB0bXAgPSAwLCBjb3VudCA9IDAsIHJldCA9IDA7CisKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfREJJX0FERFIsIHJlYWRfYWRkcik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0RCSV9GTEFHLCAweDIpOworCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0RCSV9GTEFHKTsKKwljb3VudCA9IDA7CisJd2hpbGUgKHRtcCAmJiBjb3VudCA8IDIwKSB7CisJCXVkZWxheSgxMCk7CisJCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0RCSV9GTEFHKTsKKwkJY291bnQrKzsKKwl9CisJaWYgKDAgPT0gdG1wKSB7CisJCXJlYWRfYWRkciA9IFJFR19EQklfUkRBVEEgKyBhZGRyICUgNDsKKwkJcmV0ID0gcnRsX3JlYWRfd29yZChydGxwcml2LCByZWFkX2FkZHIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9ydGw4ODIxYWVfZGJpX3dyaXRlKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTE2IGFkZHIsIHU4IGRhdGEpCit7CisJdTggdG1wID0gMCwgY291bnQgPSAwOworCXUxNiB3cnRpZV9hZGRyLCByZW1haW5kZXIgPSBhZGRyICUgNDsKKworCXdydGllX2FkZHIgPSBSRUdfREJJX1dEQVRBICsgcmVtYWluZGVyOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHdydGllX2FkZHIsIGRhdGEpOworCisJd3J0aWVfYWRkciA9IChhZGRyICYgMHhmZmZjKSB8IChCSVQoMCkgPDwgKHJlbWFpbmRlciArIDEyKSk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0RCSV9BRERSLCB3cnRpZV9hZGRyKTsKKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19EQklfRkxBRywgMHgxKTsKKworCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0RCSV9GTEFHKTsKKwljb3VudCA9IDA7CisJd2hpbGUgKHRtcCAmJiBjb3VudCA8IDIwKSB7CisJCXVkZWxheSgxMCk7CisJCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0RCSV9GTEFHKTsKKwkJY291bnQrKzsKKwl9CisKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9lbmFibGVfYXNwbV9iYWNrX2Rvb3Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggdG1wOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkgeworCQlpZiAoX3J0bDg4MjFhZV9tZGlvX3JlYWQocnRscHJpdiwgMHgwNCkgIT0gMHg4NTQ0KQorCQkJX3J0bDg4MjFhZV9tZGlvX3dyaXRlKHJ0bHByaXYsIDB4MDQsIDB4ODU0NCk7CisKKwkJaWYgKF9ydGw4ODIxYWVfbWRpb19yZWFkKHJ0bHByaXYsIDB4MGIpICE9IDB4MDA3MCkKKwkJCV9ydGw4ODIxYWVfbWRpb193cml0ZShydGxwcml2LCAweDBiLCAweDAwNzApOworCX0KKworCXRtcCA9IF9ydGw4ODIxYWVfZGJpX3JlYWQocnRscHJpdiwgMHg3MGYpOworCV9ydGw4ODIxYWVfZGJpX3dyaXRlKHJ0bHByaXYsIDB4NzBmLCB0bXAgfCBCSVQoNykpOworCisJdG1wID0gX3J0bDg4MjFhZV9kYmlfcmVhZChydGxwcml2LCAweDcxOSk7CisJX3J0bDg4MjFhZV9kYmlfd3JpdGUocnRscHJpdiwgMHg3MTksIHRtcCB8IEJJVCgzKSB8IEJJVCg0KSk7CisKKwlpZihydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJeworCQl0bXAgID0gX3J0bDg4MjFhZV9kYmlfcmVhZChydGxwcml2LCAweDcxOCk7CisJCV9ydGw4ODIxYWVfZGJpX3dyaXRlKHJ0bHByaXYsIDB4NzE4LCB0bXB8QklUKDQpKTsKKwl9Cit9CisKK3ZvaWQgcnRsODgyMWFlX2VuYWJsZV9od19zZWN1cml0eV9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHNlY19yZWdfdmFsdWU7CisJdTggdG1wOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCSAoIlBhaXJ3aXNlRW5jQWxnb3JpdGhtID0gJWQgR3JvdXBFbmNBbGdvcml0aG0gPSAlZFxuIiwKKwkJICBydGxwcml2LT5zZWMucGFpcndpc2VfZW5jX2FsZ29yaXRobSwKKwkJICBydGxwcml2LT5zZWMuZ3JvdXBfZW5jX2FsZ29yaXRobSkpOworCisJaWYgKHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+c3dfY3J5cHRvIHx8IHJ0bHByaXYtPnNlYy51c2Vfc3dfc2VjKSB7CisJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfRE1FU0csICgibm90IG9wZW4gaHcgZW5jcnlwdGlvblxuIikpOworCQlyZXR1cm47CisJfQorCisJc2VjX3JlZ192YWx1ZSA9IFNDUl9UeEVuY0VuYWJsZSB8IFNDUl9SeERlY0VuYWJsZTsKKworCWlmIChydGxwcml2LT5zZWMudXNlX2RlZmF1bHRrZXkpIHsKKwkJc2VjX3JlZ192YWx1ZSB8PSBTQ1JfVHhVc2VESzsKKwkJc2VjX3JlZ192YWx1ZSB8PSBTQ1JfUnhVc2VESzsKKwl9CisKKwlzZWNfcmVnX3ZhbHVlIHw9IChTQ1JfUlhCQ1VTRURLIHwgU0NSX1RYQkNVU0VESyk7CisKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DUiArIDEpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DUiArIDEsIHRtcCB8IEJJVCgxKSk7CisKKwlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkgKCJUaGUgU0VDUi12YWx1ZSAleCBcbiIsIHNlY19yZWdfdmFsdWUpKTsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfV1BBX0NPTkZJRywgJnNlY19yZWdfdmFsdWUpOworCit9CisKKyNpZiAwCitib29sIF9ydGw4ODIxYWVfY2hlY2tfcGNpZV9kbWFfaGFuZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdG1wOworCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0RCSV9DVFJMKzMpOworCWlmICghKHRtcCZCSVQoMikpKSB7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19EQklfQ1RSTCszLCB0bXB8QklUKDIpKTsKKwkJbWRlbGF5KDEwMCk7CisJfQorCisJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfREJJX0NUUkwrMyk7CisJaWYgKHRtcCZCSVQoMCkgfHwgdG1wJkJJVCgxKSkgeworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJKCJydGw4ODIxYWVfY2hlY2tfcGNpZV9kbWFfaGFuZygpOiBUUlVFISBSZXNldCBQQ0lFIERNQSFcbiIpKTsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwordm9pZCBfcnRsODgyMWFlX3Jlc2V0X3BjaWVfaW50ZXJmYWNlX2RtYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQlib29sIG1hY19wb3dlcl9vbiwgYm9vbCB3YXRjaF9kb2cpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHRtcDsKKwlib29sIHJlbGVhc2VfbWFjX3J4X3BhdXNlOworCXU4IGJhY2t1cF9wY2llX2RtYV9wYXVzZTsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiX3J0bDg4MjFhZV9yZXNldF9wY2llX2ludGVyZmFjZV9kbWEoKVxuIikpOworCisJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwpOworCXRtcCAmPSB+QklUKDEpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SU1ZfQ1RSTCwgdG1wKTsKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19QTUNfREJHX0NUUkwyKTsKKwl0bXAgfD0gQklUMjsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUE1DX0RCR19DVFJMMiwgdG1wKTsKKworCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1JYRE1BX0NPTlRST0wpOworCWlmICh0bXAgJiBCSVQoMikpIHsKKwkJcmVsZWFzZV9tYWNfcnhfcGF1c2UgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhETUFfQ09OVFJPTCwgdG1wIHwgQklUKDIpKTsKKwkJcmVsZWFzZV9tYWNfcnhfcGF1c2UgPSB0cnVlOworCX0KKwliYWNrdXBfcGNpZV9kbWFfcGF1c2UgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHKzEpOworCWlmIChiYWNrdXBfcGNpZV9kbWFfcGF1c2UgIT0gMHhGRikKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1BDSUVfQ1RSTF9SRUcrMSwgMHhGRik7CisKKwlpZiAobWFjX3Bvd2VyX29uKQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IsIDApOworCisJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4rMSk7CisJdG1wICY9IH5CSVQoMCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOKzEsIHRtcCk7CisKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTisxKTsKKwl0bXAgfD0gfkJJVCgwKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4rMSwgdG1wKTsKKworCWlmIChtYWNfcG93ZXJfb24pCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DUiwgMHhGRik7CisKKwl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NQUNfUEhZX0NUUkxfTk9STUFMKzIpOworCXRtcCB8PSBCSVQxOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQUNfUEhZX0NUUkxfTk9STUFMKzIsIHRtcCk7CisKKwlpZiAod2F0Y2hfZG9nKSB7CisJCXUzMiBycXBuID0gMDsKKwkJdTMyIHJxcG5fbnBxID0gMDsKKwkJdTggdHhfcGFnZV9ib3VuZGFyeSA9IF9SUVBOX0luaXRfODgxMkUoQWRhcHRlciwgJnJxcG5fbnBxLCAmcnFwbik7CisKKwkJaWYoTExUX3RhYmxlX2luaXRfODgxMihBZGFwdGVyLCBUWF9QQUdFX0JPVU5EQVJZLCBSUVBOLCBSUVBOX05QUSkgPT0gUlRfU1RBVFVTX0ZBSUxVUkUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJCVBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKwkJCVBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKworCQkJLy8gPDE+IFJlc2V0IFR4IGRlc2NyaXB0b3IKKwkJCUFkYXB0ZXItPkhhbEZ1bmMuUmVzZXRUeERlc2NIYW5kbGVyKEFkYXB0ZXIsQWRhcHRlci0+TnVtVHhEZXNjKTsKKworCQkJLy8gPDI+IFJlc2V0IFJ4IGRlc2NyaXB0b3IKKwkJCUFkYXB0ZXItPkhhbEZ1bmMuUmVzZXRSeERlc2NIYW5kbGVyKEFkYXB0ZXIsQWRhcHRlci0+TnVtUnhEZXNjKTsKKworCQkJLy8gPDM+IFJlc2V0IFJGRHMKKwkJCUZyZWVSRkRzKCBBZGFwdGVyLCBUUlVFKTsKKworCQkJLy8gPDQ+IFJlc2V0IFRDQnMKKwkJCUZyZWVUQ0JzKCBBZGFwdGVyLCBUUlVFKTsKKworCQkJLy8gV2Ugc2hvdWxkIHNldCBhbGwgUnggZGVzYyBvd24gYml0IHRvIDEgdG8gcHJldmVudCBmcm9tIFJEVSBhZnRlciBlbmFibGUgUnggRE1BLiAyMDEzLjAyLjE4LCBieSB0eW5saS4KKwkJCVByZXBhcmVBbGxSeERlc2NCdWZmZXIoQWRhcHRlcik7CisKKwkJCVBsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKwkJCVBsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKworCQkJLy8KKwkJCS8vIEluaXRpYWxpemUgVFJ4IERNQSBhZGRyZXNzLgorCQkJLy8KKwkJCS8vIEJlY2F1c2Ugc2V0IDB4MTAwIHRvIDB4MCB3aWxsIGNhdXNlIHRoZSBSeCBkZXNjcmlwdG9yIGFkZHJlc3MgMHgzNDAgYmUgY2xlYXJlZCB0byB6ZXJvIG9uIDg4RUUsCisJCQkvLyB3ZSBzaG91bGQgcmUtaW5pdGlhbGl6ZSBSeCBkZXNjLiBhZGRyZXNzIGJlZm9yZSBlbmFibGUgRE1BLiAyMDEyLjExLjA3LiBieSB0eW5saS4KKwkJCUluaXRUUnhEZXNjSHdBZGRyZXNzODgxMkFFKEFkYXB0ZXIpOworCQl9CisKKwkJLy8gSW4gTUFDIHBvd2VyIG9uIHN0YXRlLCBCQiBhbmQgUkYgbWF5YmUgaW4gT04gc3RhdGUsIGlmIHdlIHJlbGVhc2UgVFJ4IERNQSBoZXJlCisJCS8vIGl0IHdpbGwgY2F1c2UgcGFja2V0cyB0byBiZSBzdGFydGVkIHRvIFR4L1J4LCBzbyB3ZSByZWxlYXNlIFR4L1J4IERNQSBsYXRlci4KKwkJaWYoIWJJbk1BQ1Bvd2VyT24gfHwgYkluV2F0Y2hEb2cpCisJCXsKKwkJCS8vIDguIHJlbGVhc2UgVFJYIERNQQorCQkJLy93cml0ZSAweDI4NCBiaXRbMThdID0gMSdiMAorCQkJLy93cml0ZSAweDMwMSA9IDB4MDAKKwkJCWlmKGJSZWxlYXNlTUFDUnhQYXVzZSkKKwkJCXsKKwkJCQl1MVRtcCA9IFBsYXRmb3JtRUZJT1JlYWQxQnl0ZShBZGFwdGVyLCBSRUdfUlhETUFfQ09OVFJPTCk7CisJCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShBZGFwdGVyLCBSRUdfUlhETUFfQ09OVFJPTCwgKHUxVG1wJn5CSVQyKSk7CisJCQl9CisJCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKEFkYXB0ZXIsIAlSRUdfUENJRV9DVFJMX1JFRysxLCBCYWNrVXBQY2llRE1BUGF1c2UpOworCQl9CisKKwkJaWYoSVNfSEFSRFdBUkVfVFlQRV84ODIxRShBZGFwdGVyKSkKKwkJeworCQkJLy85LiBsb2NrIHN5c3RlbSByZWdpc3RlcgorCQkJLy8JIHdyaXRlIDB4Q0MgYml0WzJdID0gMSdiMAorCQkJdTFUbXAgPSBQbGF0Zm9ybUVGSU9SZWFkMUJ5dGUoQWRhcHRlciwgUkVHX1BNQ19EQkdfQ1RSTDJfODcyM0IpOworCQkJdTFUbXAgJj0gfihCSVQyKTsKKwkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoQWRhcHRlciwgUkVHX1BNQ19EQkdfQ1RSTDJfODcyM0IsIHUxVG1wKTsKKwkJfQorCisJCXJldHVybiBSVF9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvLyBTdGF0aWMgTWFjSUQgTWFwcGluZyAoY2YuIFVzZWQgaW4gTWFjSWREb1N0YXRpY01hcHBpbmcpIC0tLS0tLS0tLS0KKyNkZWZpbmUgTUFDX0lEX1NUQVRJQ19GT1JfREVGQVVMVF9QT1JUCQkJCTAKKyNkZWZpbmUgTUFDX0lEX1NUQVRJQ19GT1JfQlJPQURDQVNUX01VTFRJQ0FTVAkJMQorI2RlZmluZSBNQUNfSURfU1RBVElDX0ZPUl9CVF9DTElFTlRfU1RBUlQJCQkJMgorI2RlZmluZSBNQUNfSURfU1RBVElDX0ZPUl9CVF9DTElFTlRfRU5ECQkJCTMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgcnRsODgyMWFlX21hY2lkX2luaXRpYWxpemVfbWVkaWFzdGF0dXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4CW1lZGlhX3JwdFs0XSA9IHtSVF9NRURJQV9DT05ORUNULCAxLCBcCisJCU1BQ19JRF9TVEFUSUNfRk9SX0JST0FEQ0FTVF9NVUxUSUNBU1QsIFwKKwkJTUFDX0lEX1NUQVRJQ19GT1JfQlRfQ0xJRU5UX0VORH07CisKKwlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgXAorCQlIV19WQVJfSDJDX0ZXX01FRElBU1RBVFVTUlBULCBtZWRpYV9ycHQpOworCisJUlRfVFJBQ0UoQ09NUF9JTklULERCR19MT1VELCBcCisJCSgiSW5pdGlhbGl6ZSBNYWNJZCBtZWRpYSBzdGF0dXM6IGZyb20gJWQgdG8gJWRcbiIsIFwKKwkJTUFDX0lEX1NUQVRJQ19GT1JfQlJPQURDQVNUX01VTFRJQ0FTVCwgXAorCQlNQUNfSURfU1RBVElDX0ZPUl9CVF9DTElFTlRfRU5EKSk7Cit9CisKK2ludCBydGw4ODIxYWVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCWJvb2wgcnRzdGF0dXMgPSB0cnVlOworCWludCBlcnI7CisJdTggdG1wX3UxYjsKKwl1MzIgbmF2X3VwcGVyID0gV0lGSV9OQVZfVVBQRVJfVVM7CisKKwlydGxwcml2LT5ydGxoYWwuYmVpbmdfaW5pdF9hZGFwdGVyID0gdHJ1ZTsKKwlydGxwcml2LT5pbnRmX29wcy0+ZGlzYWJsZV9hc3BtKGh3KTsKKworCS8qWVAgd293bGFuIG5vdCBjb25zaWRlcmVkKi8KKworCXRtcF91MWIgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19DUik7CisJaWYgKHRtcF91MWIhPTAgJiYgdG1wX3UxYiAhPSAweEVBKSB7CisJCXJ0bGhhbC0+Yl9tYWNfZnVuY19lbmFibGUgPSB0cnVlOworCQlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsKCIgTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uLlxuIikpOworCX0gZWxzZSB7CisJCXJ0bGhhbC0+Yl9tYWNfZnVuY19lbmFibGUgPSBmYWxzZTsKKwkJcnRsaGFsLT5md19wc19zdGF0ZSA9IEZXX1BTX1NUQVRFX0FMTF9PTl84ODIxQUU7CisJfQorCisvKglpZiAoX3J0bDg4MjFhZV9jaGVja19wY2llX2RtYV9oYW5nKGh3KSkgeworCQlfcnRsODgyMWFlX3Jlc2V0X3BjaWVfaW50ZXJmYWNlX2RtYShodyxydGxoYWwtPmJfbWFjX2Z1bmNfZW5hYmxlLGZhbHNlKTsKKwkJcnRsaGFsLT5iX21hY19mdW5jX2VuYWJsZSA9IGZhbHNlOworCX0gKi8KKworCXJ0c3RhdHVzID0gX3J0bDg4MjFhZV9pbml0X21hYyhodyk7CisJaWYgKHJ0c3RhdHVzICE9IHRydWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgKCJJbml0IE1BQyBmYWlsZWRcbiIpKTsKKwkJZXJyID0gMTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl0bXBfdTFiID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfU1lTX0NGRyk7CisJdG1wX3UxYiAmPSAweDdGOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfQ0ZHLCB0bXBfdTFiKTsKKworCWVyciA9IHJ0bDg4MjFhZV9kb3dubG9hZF9mdyhodywgZmFsc2UpOworCWlmIChlcnIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJICgiRmFpbGVkIHRvIGRvd25sb2FkIEZXLiBJbml0IEhXICIKKwkJCSAgIndpdGhvdXQgRlcgbm93Li5cbiIpKTsKKwkJZXJyID0gMTsKKwkJcnRsaGFsLT5iZndfcmVhZHkgPSBmYWxzZTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlydGxoYWwtPmJmd19yZWFkeSA9IHRydWU7CisJfQorCXJ0bGhhbC0+ZndfcHNfc3RhdGUgPSBGV19QU19TVEFURV9BTExfT05fODgyMUFFOworCXJ0bGhhbC0+YmZ3X2Nsa19jaGFuZ2VfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlydGxoYWwtPmJhbGxvd19zd190b19jaGFuZ2VfaHdjbGMgPSBmYWxzZTsKKwlydGxoYWwtPmxhc3RfaG1lYm94bnVtID0gMDsKKworCS8qU0lDX0luaXQoQWRhcHRlcik7CisJaWYocEhhbERhdGEtPkFNUERVQnVyc3RNb2RlKQorCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKEFkYXB0ZXIsUkVHX0FNUERVX0JVUlNUX01PREVfODgxMiwgIDB4N0YpOyovCisKKwlydGw4ODIxYWVfcGh5X21hY19jb25maWcoaHcpOworCS8qIGJlY2F1c2UgbGFzdCBmdW5jdGlvbiBtb2RpZnkgUkNSLCBzbyB3ZSB1cGRhdGUKKwkgKiByY3IgdmFyIGhlcmUsIG9yIFRQIHdpbGwgdW5zdGFibGUgZm9yIHJlY2VpdmVfY29uZmlnCisJICogaXMgd3JvbmcsIFJYIFJDUl9BQ1JDMzIgd2lsbCBjYXVzZSBUUCB1bnN0YWJlbCAmIFJ4CisJICogUkNSX0FQUF9JQ1Ygd2lsbCBjYXVzZSBtYWM4MDIxMSB1bmFzc29jIGZvciBjaXNjbyAxMjUyCisJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IpOworCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgJj0gfihSQ1JfQUNSQzMyIHwgUkNSX0FJQ1YpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsqLworCXJ0bDg4MjFhZV9waHlfYmJfY29uZmlnKGh3KTsKKworCXJ0bDg4MjFhZV9waHlfcmZfY29uZmlnKGh3KTsKKworCV9ydGw4ODIxYWVfaHdfY29uZmlndXJlKGh3KTsKKworCXJ0bDg4MjFhZV9waHlfc3dpdGNoX3dpcmVsZXNzYmFuZChodywgQkFORF9PTl8yXzRHKTsKKworCS8qc2V0IHdpcmVsZXNzIG1vZGUqLworCisJcnRsaGFsLT5iX21hY19mdW5jX2VuYWJsZSA9IHRydWU7CisKKwlydGxfY2FtX3Jlc2V0X2FsbF9lbnRyeShodyk7CisKKwlydGw4ODIxYWVfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZyhodyk7CisKKwlwcHNjLT5yZnB3cl9zdGF0ZSA9IEVSRk9OOworCisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9FVEhFUl9BRERSLCBtYWMtPm1hY19hZGRyKTsKKwlfcnRsODgyMWFlX2VuYWJsZV9hc3BtX2JhY2tfZG9vcihodyk7CisJcnRscHJpdi0+aW50Zl9vcHMtPmVuYWJsZV9hc3BtKGh3KTsKKworCS8vcnRsODgyMWFlX2J0X2h3X2luaXQoaHcpOworCXJ0bHByaXYtPnJ0bGhhbC5iZWluZ19pbml0X2FkYXB0ZXIgPSBmYWxzZTsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfTkFWX1VQUEVSLCAodTggKikmbmF2X3VwcGVyKTsKKworCS8vcnRsODgyMWFlX2RtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoaHcpOworCS8vcnRsODgyMWFlX3BoeV9sY19jYWxpYnJhdGUoaHcpOworCisJLyogUmVsZWFzZSBSeCBETUEqLworCXRtcF91MWIgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19SWERNQV9DT05UUk9MKTsKKwlpZiAodG1wX3UxYiAmIEJJVCgyKSkgeworCQkvKiBSZWxlYXNlIFJ4IERNQSBpZiBuZWVkZWQqLworCQl0bXBfdTFiICY9IH5CSVQoMik7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SWERNQV9DT05UUk9MLCB0bXBfdTFiKTsKKwl9CisKKwkvKiBSZWxlYXNlIFR4L1J4IFBDSUUgRE1BIGlmKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUENJRV9DVFJMX1JFRyArIDEsIDApOworCisJcnRsODgyMWFlX2RtX2luaXQoaHcpOworCXJ0bDg4MjFhZV9tYWNpZF9pbml0aWFsaXplX21lZGlhc3RhdHVzKGh3KTsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgicnRsODgyMWFlX2h3X2luaXQoKSA8PT09PVxuIikpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBlbnVtIHZlcnNpb25fODgyMWFlIF9ydGw4ODIxYWVfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwllbnVtIHZlcnNpb25fODgyMWFlIHZlcnNpb24gPSBWRVJTSU9OX1VOS05PV047CisJdTMyIHZhbHVlMzI7CisKKwl2YWx1ZTMyID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX1NZU19DRkcxKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIlJlYWRDaGlwVmVyc2lvbjg4MTJBIDB4RjAgPSAweCV4IFxuIiwgdmFsdWUzMikpOworCisKKworCWlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJcnRscGh5LT5yZl90eXBlID0gUkZfMlQyUjsKKwllbHNlIGlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkKKwkJcnRscGh5LT5yZl90eXBlID0gUkZfMVQxUjsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiUkZfVHlwZSBpcyAleCEhXG4iLCBydGxwaHktPnJmX3R5cGUpKTsKKworCisJaWYgKHZhbHVlMzIgJiBUUlBfVkFVWF9FTikKKwl7CisJCWlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJeworCQkJaWYocnRscGh5LT5yZl90eXBlID09IFJGXzJUMlIpCisJCQkJdmVyc2lvbiA9IFZFUlNJT05fVEVTVF9DSElQXzJUMlJfODgxMjsKKwkJCWVsc2UKKwkJCQl2ZXJzaW9uID0gVkVSU0lPTl9URVNUX0NISVBfMVQxUl84ODEyOworCQl9CisJCWVsc2UKKwkJCXZlcnNpb24gPSBWRVJTSU9OX1RFU1RfQ0hJUF84ODIxOworCX0gZWxzZSB7CisJCWlmKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJeworCQkJdTMyCXJ0bF9pZCA9ICgodmFsdWUzMiAmIENISVBfVkVSX1JUTF9NQVNLKSA+PiAxMikgKzEgOworCisJCQlpZihydGxwaHktPnJmX3R5cGUgPT0gUkZfMlQyUikKKwkJCQl2ZXJzaW9uID0gKGVudW0gdmVyc2lvbl84ODIxYWUpKENISVBfODgxMiB8IE5PUk1BTF9DSElQIHwgUkZfVFlQRV8yVDJSKTsKKwkJCWVsc2UKKwkJCQl2ZXJzaW9uID0gKGVudW0gdmVyc2lvbl84ODIxYWUpKENISVBfODgxMiB8IE5PUk1BTF9DSElQKTsKKworCQkJdmVyc2lvbiA9IChlbnVtIHZlcnNpb25fODgyMWFlKSh2ZXJzaW9ufCAocnRsX2lkIDw8IDEyKSk7CisJCX0KKwkJZWxzZSBpZihydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJCXsKKwkJCXUzMglydGxfaWQgPSB2YWx1ZTMyICYgQ0hJUF9WRVJfUlRMX01BU0s7CisKKwkJCXZlcnNpb24gPSAoZW51bSB2ZXJzaW9uXzg4MjFhZSkoQ0hJUF84ODIxIHwgTk9STUFMX0NISVAgfCBydGxfaWQpOworCQl9CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiQ2hpcCBSRiBUeXBlOiAlc1xuIiwgKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8yVDJSKSA/CisJCSAgIlJGXzJUMlIiIDogIlJGXzFUMVIiKSk7CisKKwlpZihydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJeworCQkvKldMX0hXUk9GX0VOLiovCisJCXZhbHVlMzIgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfTVVMVElfRlVOQ19DVFJMKTsKKwkJcnRscGh5LT5od19yb2ZfZW5hYmxlPSAoKHZhbHVlMzIgJiBXTF9IV1JPRl9FTikgPyAxIDogMCk7CisJfQorCisJc3dpdGNoKHZlcnNpb24pCisJeworCQljYXNlIFZFUlNJT05fVEVTVF9DSElQXzFUMVJfODgxMjoKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFZFUlNJT05fVEVTVF9DSElQXzFUMVJfODgxMi5cbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFZFUlNJT05fVEVTVF9DSElQXzJUMlJfODgxMjoKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFZFUlNJT05fVEVTVF9DSElQXzJUMlJfODgxMi5cbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF8xVDFSXzg4MTI6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSgiQ2hpcCBWZXJzaW9uIElEOiBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfMVQxUl84ODEyLlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzJUMlJfODgxMjoKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF8yVDJSXzg4MTIuXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfMVQxUl84ODEyX0NfQ1VUOgorCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkoIkNoaXAgVmVyc2lvbiBJRDogVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzFUMVJfODgxMiBDIENVVC5cbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF8yVDJSXzg4MTJfQ19DVVQ6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSgiQ2hpcCBWZXJzaW9uIElEOiBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfMlQyUl84ODEyIEMgQ1VULlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgVkVSU0lPTl9URVNUX0NISVBfODgyMToKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFZFUlNJT05fVEVTVF9DSElQXzg4MjEuXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfODgyMToKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJKCJDaGlwIFZlcnNpb24gSUQ6IFZFUlNJT05fTk9STUFMX1RTTUNfQ0hJUF84ODIxIEEgQ1VULlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzg4MjFfQl9DVVQ6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSgiQ2hpcCBWZXJzaW9uIElEOiBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfODgyMSBCIENVVC5cbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkoIkNoaXAgVmVyc2lvbiBJRDogVW5rbm93ICgweCVYKS5cbiIsIHZlcnNpb24pKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiB2ZXJzaW9uOworfQorCitzdGF0aWMgaW50IF9ydGw4ODIxYWVfc2V0X21lZGlhX3N0YXR1cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggYnRfbXNyID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBNU1IpOworCWVudW0gbGVkX2N0bF9tb2RlIGxlZGFjdGlvbiA9IExFRF9DVExfTk9fTElOSzsKKwlidF9tc3IgJj0gMHhmYzsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQkNOX0NUUkwsIDApOworCVJUX1RSQUNFKENPTVBfQkVBQ09OLCBEQkdfTE9VRCwKKwkJKCJjbGVhciAweDU1MCB3aGVuIHNldCBIV19WQVJfTUVESUFfU1RBVFVTXG4iKSk7CisKKwlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCB8fAorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJX3J0bDg4MjFhZV9zdG9wX3R4X2JlYWNvbihodyk7CisJCV9ydGw4ODIxYWVfZW5hYmxlX2Jjbl9zdWJfZnVuYyhodyk7CisJfSBlbHNlIGlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8CisJCXR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJX3J0bDg4MjFhZV9yZXN1bWVfdHhfYmVhY29uKGh3KTsKKwkJX3J0bDg4MjFhZV9kaXNhYmxlX2Jjbl9zdWJfZnVuYyhodyk7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLCgiU2V0IEhXX1ZBUl9NRURJQV9TVEFUVVM6ICIKKwkJCSAgIk5vIHN1Y2ggbWVkaWEgc3RhdHVzKCV4KS5cbiIsIHR5cGUpKTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgorCQlidF9tc3IgfD0gTVNSX05PTElOSzsKKwkJbGVkYWN0aW9uID0gTEVEX0NUTF9MSU5LOworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwgKCJTZXQgTmV0d29yayB0eXBlIHRvIE5PIExJTkshXG4iKSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWJ0X21zciB8PSBNU1JfQURIT0M7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIlNldCBOZXR3b3JrIHR5cGUgdG8gQWQgSG9jIVxuIikpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWJ0X21zciB8PSBNU1JfSU5GUkE7CisJCWxlZGFjdGlvbiA9IExFRF9DVExfTElOSzsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsICgiU2V0IE5ldHdvcmsgdHlwZSB0byBTVEEhXG4iKSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCWJ0X21zciB8PSBNU1JfQVA7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIlNldCBOZXR3b3JrIHR5cGUgdG8gQVAhXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgiTmV0d29yayB0eXBlICVkIG5vdCBzdXBwb3J0IVxuIiwgdHlwZSkpOworCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisKKwl9CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoTVNSKSwgYnRfbXNyKTsKKwlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIGxlZGFjdGlvbik7CisJaWYgKChidF9tc3IgJiAweGZjKSA9PSBNU1JfQVApCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CisJZWxzZQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOVENGRyArIDEsIDB4NjYpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9jaGVja19ic3NpZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBjaGVja19ic3NpZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwl1MzIgcmVnX3JjciA9IHJ0bHBjaS0+cmVjZWl2ZV9jb25maWc7CisKKwlpZiAocnRscHJpdi0+cHNjLnJmcHdyX3N0YXRlICE9IEVSRk9OKQorCQlyZXR1cm47CisKKwlpZiAoY2hlY2tfYnNzaWQgPT0gdHJ1ZSkgeworCQlyZWdfcmNyIHw9IChSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTik7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfUkNSLAorCQkJCQkgICAgICAodTggKikgKCZyZWdfcmNyKSk7CisJCV9ydGw4ODIxYWVfc2V0X2Jjbl9jdHJsX3JlZyhodywgMCwgQklUKDQpKTsKKwl9IGVsc2UgaWYgKGNoZWNrX2Jzc2lkID09IGZhbHNlKSB7CisJCXJlZ19yY3IgJj0gKH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pKTsKKwkJX3J0bDg4MjFhZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCBCSVQoNCksIDApOworCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCUhXX1ZBUl9SQ1IsICh1OCAqKSAoJnJlZ19yY3IpKTsKKwl9CisKK30KKworaW50IHJ0bDg4MjFhZV9zZXRfbmV0d29ya190eXBlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJydGw4ODIxYWVfc2V0X25ldHdvcmtfdHlwZSFcbiIpKTsKKworCWlmIChfcnRsODgyMWFlX3NldF9tZWRpYV9zdGF0dXMoaHcsIHR5cGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAocnRscHJpdi0+bWFjODAyMTEubGlua19zdGF0ZSA9PSBNQUM4MDIxMV9MSU5LRUQpIHsKKwkJaWYgKHR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQlydGw4ODIxYWVfc2V0X2NoZWNrX2Jzc2lkKGh3LCB0cnVlKTsKKwl9IGVsc2UgeworCQlydGw4ODIxYWVfc2V0X2NoZWNrX2Jzc2lkKGh3LCBmYWxzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGRvbid0IHNldCBSRUdfRURDQV9CRV9QQVJBTSBoZXJlIGJlY2F1c2UgbWFjODAyMTEgd2lsbCBzZW5kIHBrdCB3aGVuIHNjYW4gKi8KK3ZvaWQgcnRsODgyMWFlX3NldF9xb3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBhY2kpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXJ0bDg4MjFhZV9kbV9pbml0X2VkY2FfdHVyYm8oaHcpOworCXN3aXRjaCAoYWNpKSB7CisJY2FzZSBBQzFfQks6CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfRURDQV9CS19QQVJBTSwgMHhhNDRmKTsKKwkJYnJlYWs7CisJY2FzZSBBQzBfQkU6CisJCS8qIHJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfRURDQV9CRV9QQVJBTSwgdTRiX2FjX3BhcmFtKTsgKi8KKwkJYnJlYWs7CisJY2FzZSBBQzJfVkk6CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfRURDQV9WSV9QQVJBTSwgMHg1ZTQzMjIpOworCQlicmVhazsKKwljYXNlIEFDM19WTzoKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19FRENBX1ZPX1BBUkFNLCAweDJmMzIyMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX0FTU0VSVChmYWxzZSwgKCJpbnZhbGlkIGFjaTogJWQgIVxuIiwgYWNpKSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUiwgcnRscGNpLT5pcnFfbWFza1swXSAmIDB4RkZGRkZGRkYpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUkUsIHJ0bHBjaS0+aXJxX21hc2tbMV0gJiAweEZGRkZGRkZGKTsKKwlydGxwY2ktPmlycV9lbmFibGVkID0gdHJ1ZTsKKwkvKiB0aGVyZSBhcmUgc29tZSBDMkggQ01EcyBoYXZlIGJlZW4gc2VudCBiZWZvcmUgc3lzdGVtIGludGVycnVwdCBpcyBlbmFibGVkLCBlLmcuLCBDMkgsIENQV00uCisJKlNvIHdlIG5lZWQgdG8gY2xlYXIgYWxsIEMySCBldmVudHMgdGhhdCBGVyBoYXMgbm90aWZpZWQsIG90aGVyd2lzZSBGVyB3b24ndCBzY2hlZHVsZSBhbnkgY29tbWFuZHMgYW55bW9yZS4KKwkqLworCS8vcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0MySEVWVF9DTEVBUiwgMCk7CisJLyplbmFibGUgc3lzdGVtIGludGVycnVwdCovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19IU0lNUiwgcnRscGNpLT5zeXNfaXJxX21hc2sgJiAweEZGRkZGRkZGKTsKK30KKwordm9pZCBydGw4ODIxYWVfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVIsIElNUl9ESVNBQkxFRCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISU1SRSwgSU1SX0RJU0FCTEVEKTsKKwlydGxwY2ktPmlycV9lbmFibGVkID0gZmFsc2U7CisJc3luY2hyb25pemVfaXJxKHJ0bHBjaS0+cGRldi0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9wb3dlcm9mZl9hZGFwdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4IHUxYl90bXA7CisKKwlydGxoYWwtPmJfbWFjX2Z1bmNfZW5hYmxlID0gZmFsc2U7CisKKwlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKSB7CisJLyogQ29tYm8gKFBDSWUgKyBVU0IpIENhcmQgYW5kIFBDSWUtTUYgQ2FyZCAqLworCS8qIDEuIFJ1biBMUFMgV0wgUkZPRkYgZmxvdyAqLworCQkvL1JUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiPT09PT0+Q2FyZERpc2FibGVSVEw4ODEyRSxSVEw4ODIxQV9OSUNfTFBTX0VOVEVSX0ZMT1dcbiIpKTsKKwkJcnRsX2hhbF9wd3JzZXFjbWRwYXJzaW5nKHJ0bHByaXYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLAorCQkJUFdSX0lOVEZfUENJX01TSywgUlRMODgyMUFfTklDX0xQU19FTlRFUl9GTE9XKTsKKwl9CisJLyogMi4gMHgxRls3OjBdID0gMCAqLworCS8qIHR1cm4gb2ZmIFJGICovCisJLy9ydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUkZfQ1RSTCwgMHgwMCk7CisJaWYgKChydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMKSAmIEJJVCg3KSkgJiYKKwkJcnRsaGFsLT5iZndfcmVhZHkgKSB7CisJCXJ0bDg4MjFhZV9maXJtd2FyZV9zZWxmcmVzZXQoaHcpOworCX0KKworCS8qIFJlc2V0IE1DVS4gU3VnZ2VzdGVkIGJ5IEZpbGVuLiAqLworCXUxYl90bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTisxKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4rMSwgKHUxYl90bXAgJiAofkJJVCgyKSkpKTsKKworCS8qIGcuCU1DVUZXREwgMHg4MFsxOjBdPTAJICovCisJLyogcmVzZXQgTUNVIHJlYWR5IHN0YXR1cyAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCAweDAwKTsKKworCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpIHsKKwkJLyogSFcgY2FyZCBkaXNhYmxlIGNvbmZpZ3VyYXRpb24uICovCisJCXJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZyhydGxwcml2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKKwkJCVBXUl9JTlRGX1BDSV9NU0ssIFJUTDg4MjFBX05JQ19ESVNBQkxFX0ZMT1cpOworCX0gZWxzZSB7CisJCS8qIEhXIGNhcmQgZGlzYWJsZSBjb25maWd1cmF0aW9uLiAqLworCQlydGxfaGFsX3B3cnNlcWNtZHBhcnNpbmcocnRscHJpdiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssCisJCQlQV1JfSU5URl9QQ0lfTVNLLCBSVEw4ODEyX05JQ19ESVNBQkxFX0ZMT1cpOworCX0KKworCS8qIFJlc2V0IE1DVSBJTyBXcmFwcGVyICovCisJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1JTVl9DVFJMICsgMSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JTVl9DVFJMICsgMSwgKHUxYl90bXAgJiAofkJJVCgwKSkpKTsKKwl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwgKyAxKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwgKyAxLCB1MWJfdG1wIHwgQklUKDApKTsKKworCS8qIDcuIFJTVl9DVFJMIDB4MUNbNzowXSA9IDB4MEUgKi8KKwkvKiBsb2NrIElTTy9DTEsvUG93ZXIgY29udHJvbCByZWdpc3RlciAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SU1ZfQ1RSTCwgMHgwZSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2NhcmRfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG9wbW9kZTsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoInJ0bDg4MjFhZV9jYXJkX2Rpc2FibGUuXG4iKSk7CisKKwltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9OT0xJTks7CisJb3Btb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CisJX3J0bDg4MjFhZV9zZXRfbWVkaWFfc3RhdHVzKGh3LCBvcG1vZGUpOworCWlmIChydGxwcml2LT5ydGxoYWwuZHJpdmVyX2lzX2dvaW5ndG9fdW5sb2FkIHx8CisJICAgIHBwc2MtPnJmb2ZmX3JlYXNvbiA+IFJGX0NIQU5HRV9CWV9QUykKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LCBMRURfQ1RMX1BPV0VSX09GRik7CisJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwlfcnRsODgyMWFlX3Bvd2Vyb2ZmX2FkYXB0ZXIoaHcpOworCisJLyogYWZ0ZXIgcG93ZXIgb2ZmIHdlIHNob3VsZCBkbyBpcWsgYWdhaW4gKi8KKwlydGxwcml2LT5waHkuaXFrX2luaXRpYWxpemVkID0gZmFsc2U7Cit9CisKK3ZvaWQgcnRsODgyMWFlX2ludGVycnVwdF9yZWNvZ25pemVkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgdTMyICpwX2ludGEsIHUzMiAqcF9pbnRiKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJKnBfaW50YSA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIElTUikgJiBydGxwY2ktPmlycV9tYXNrWzBdOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBJU1IsICpwX2ludGEpOworCisKKwkqcF9pbnRiID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX0hJU1JFKSAmIHJ0bHBjaS0+aXJxX21hc2tbMV07CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISVNSRSwgKnBfaW50Yik7CisKK30KKworCit2b2lkIHJ0bDg4MjFhZV9zZXRfYmVhY29uX3JlbGF0ZWRfcmVnaXN0ZXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwl1MTYgYmNuX2ludGVydmFsLCBhdGltX3dpbmRvdzsKKworCWJjbl9pbnRlcnZhbCA9IG1hYy0+YmVhY29uX2ludGVydmFsOworCWF0aW1fd2luZG93ID0gMjsJLypGSVggTUVSR0UgKi8KKwlydGw4ODIxYWVfZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19BVElNV05ELCBhdGltX3dpbmRvdyk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0JDTl9JTlRFUlZBTCwgYmNuX2ludGVydmFsKTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfQkNOVENGRywgMHg2NjBmKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhUU0ZfT0ZGU0VUX0NDSywgMHgxOCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JYVFNGX09GRlNFVF9PRkRNLCAweDE4KTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDYwNiwgMHgzMCk7CisJcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsIHw9IEJJVCgzKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOX0NUUkwsICh1OCkgcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsKTsKKwlydGw4ODIxYWVfZW5hYmxlX2ludGVycnVwdChodyk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9iZWFjb25faW50ZXJ2YWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdTE2IGJjbl9pbnRlcnZhbCA9IG1hYy0+YmVhY29uX2ludGVydmFsOworCisJUlRfVFJBQ0UoQ09NUF9CRUFDT04sIERCR19ETUVTRywKKwkJICgiYmVhY29uX2ludGVydmFsOiVkXG4iLCBiY25faW50ZXJ2YWwpKTsKKwlydGw4ODIxYWVfZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19CQ05fSU5URVJWQUwsIGJjbl9pbnRlcnZhbCk7CisJcnRsODgyMWFlX2VuYWJsZV9pbnRlcnJ1cHQoaHcpOworfQorCit2b2lkIHJ0bDg4MjFhZV91cGRhdGVfaW50ZXJydXB0X21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisKKwlSVF9UUkFDRShDT01QX0lOVFIsIERCR19MT1VELAorCQkgKCJhZGRfbXNyOiV4LCBybV9tc3I6JXhcbiIsIGFkZF9tc3IsIHJtX21zcikpOworCisJaWYgKGFkZF9tc3IpCisJCXJ0bHBjaS0+aXJxX21hc2tbMF0gfD0gYWRkX21zcjsKKwlpZiAocm1fbXNyKQorCQlydGxwY2ktPmlycV9tYXNrWzBdICY9ICh+cm1fbXNyKTsKKwlydGw4ODIxYWVfZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOworCXJ0bDg4MjFhZV9lbmFibGVfaW50ZXJydXB0KGh3KTsKK30KKworc3RhdGljIHU4IF9ydGw4ODIxYWVfZ2V0X2NobmxfZ3JvdXAodTggY2hubCkKK3sKKwl1OCBncm91cCA9IDA7CisKKwlpZiAoY2hubCA8PSAxNCkgeworCQlpZiAoMSA8PSBjaG5sICYmIGNobmwgPD0gMiApCisJCQlncm91cCA9IDA7CisgICAgICAgIGVsc2UgaWYgKDMgPD0gY2hubCAmJiBjaG5sIDw9IDUgKQorCQkJZ3JvdXAgPSAxOworICAgICAgICBlbHNlIGlmICg2IDw9IGNobmwgJiYgY2hubCA8PSA4ICkKKwkJCWdyb3VwID0gMjsKKyAgICAgICAgZWxzZSBpZiAoOSA8PSBjaG5sICYmIGNobmwgPD0gMTEpCisJCQlncm91cCA9IDM7CisgICAgICAgIGVsc2UgLyppZiAoMTIgPD0gY2hubCAmJiBjaG5sIDw9IDE0KSovCisJCQlncm91cCA9IDQ7CisJfSBlbHNlIHsKKwkJaWYgKDM2IDw9IGNobmwgJiYgY2hubCA8PSA0MikKKwkJCWdyb3VwID0gMDsKKyAgICAgICAgZWxzZSBpZiAoNDQgPD0gY2hubCAmJiBjaG5sIDw9IDQ4KQorCQkJZ3JvdXAgPSAxOworICAgICAgICBlbHNlIGlmICg1MCA8PSBjaG5sICYmIGNobmwgPD0gNTgpCisJCQlncm91cCA9IDI7CisgICAgICAgIGVsc2UgaWYgKDYwIDw9IGNobmwgJiYgY2hubCA8PSA2NCkKKwkJCWdyb3VwID0gMzsKKyAgICAgICAgZWxzZSBpZiAoMTAwIDw9IGNobmwgJiYgY2hubCA8PSAxMDYpCisJCQlncm91cCA9IDQ7CisgICAgICAgIGVsc2UgaWYgKDEwOCA8PSBjaG5sICYmIGNobmwgPD0gMTE0KQorCQkJZ3JvdXAgPSA1OworICAgICAgICBlbHNlIGlmICgxMTYgPD0gY2hubCAmJiBjaG5sIDw9IDEyMikKKwkJCWdyb3VwID0gNjsKKyAgICAgICAgZWxzZSBpZiAoMTI0IDw9IGNobmwgJiYgY2hubCA8PSAxMzApCisJCQlncm91cCA9IDc7CisgICAgICAgIGVsc2UgaWYgKDEzMiA8PSBjaG5sICYmIGNobmwgPD0gMTM4KQorCQkJZ3JvdXAgPSA4OworICAgICAgICBlbHNlIGlmICgxNDAgPD0gY2hubCAmJiBjaG5sIDw9IDE0NCkKKwkJCWdyb3VwID0gOTsKKyAgICAgICAgZWxzZSBpZiAoMTQ5IDw9IGNobmwgJiYgY2hubCA8PSAxNTUpCisJCQlncm91cCA9IDEwOworICAgICAgICBlbHNlIGlmICgxNTcgPD0gY2hubCAmJiBjaG5sIDw9IDE2MSkKKwkJCWdyb3VwID0gMTE7CisgICAgICAgIGVsc2UgaWYgKDE2NSA8PSBjaG5sICYmIGNobmwgPD0gMTcxKQorCQkJZ3JvdXAgPSAxMjsKKyAgICAgICAgZWxzZSBpZiAoMTczIDw9IGNobmwgJiYgY2hubCA8PSAxNzcpCisJCQlncm91cCA9IDEzOworCQllbHNlCisJCQkvKlJUX1RSQUNFKENPTVBfRUZVU0UsREJHX0xPVUQsCisJCQkJKCI1RywgQ2hhbm5lbCAlZCBpbiBHcm91cCBub3QgZm91bmQgXG4iLGNobmwpKTsqLworCQkJUlRfQVNTRVJUKCFDT01QX0VGVVNFLAorCQkJCSgiNUcsIENoYW5uZWwgJWQgaW4gR3JvdXAgbm90IGZvdW5kIFxuIixjaG5sKSk7CisJfQorCXJldHVybiBncm91cDsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9yZWFkX3Bvd2VyX3ZhbHVlX2Zyb21wcm9tKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXN0cnVjdCB0eHBvd2VyX2luZm9fMmcgKnB3cmluZm8yNGcsCisJc3RydWN0IHR4cG93ZXJfaW5mb181ZyAqcHdyaW5mbzVnLAorCWJvb2wgYXV0b2xvYWRfZmFpbCwKKwl1OCAqaHdpbmZvKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgcmZQYXRoLCBlZUFkZHI9RUVQUk9NX1RYX1BXUl9JTlgsIGdyb3VwLFR4Q291bnQ9MDsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiaGFsX1JlYWRQb3dlclZhbHVlRnJvbVBST004ODIxYWUoKTogUFJPTUNvbnRlbnRbMHgleF09MHgleFxuIiwgKGVlQWRkcisxKSwgaHdpbmZvW2VlQWRkcisxXSkpOworCWlmICgweEZGID09IGh3aW5mb1tlZUFkZHIrMV0pICAvKllKLGFkZCwxMjAzMTYqLworCQlhdXRvbG9hZF9mYWlsID0gdHJ1ZTsKKworCWlmIChhdXRvbG9hZF9mYWlsKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJhdXRvIGxvYWQgZmFpbCA6IFVzZSBEZWZhdWx0IHZhbHVlIVxuIikpOworCQlmb3IgKHJmUGF0aCA9IDAgOyByZlBhdGggPCBNQVhfUkZfUEFUSCA7IHJmUGF0aCsrKSB7CisJCQkvKjIuNEcgZGVmYXVsdCB2YWx1ZSovCisJCQlmb3IgKGdyb3VwID0gMCA7IGdyb3VwIDwgTUFYX0NITkxfR1JPVVBfMjRHOyBncm91cCsrKSB7CisJCQkJcHdyaW5mbzI0Zy0+aW5kZXhfY2NrX2Jhc2VbcmZQYXRoXVtncm91cF0gPQkweDJEOworCQkJCXB3cmluZm8yNGctPmluZGV4X2J3NDBfYmFzZVtyZlBhdGhdW2dyb3VwXSA9IDB4MkQ7CisJCQl9CisJCQlmb3IgKFR4Q291bnQgPSAwO1R4Q291bnQgPCBNQVhfVFhfQ09VTlQ7VHhDb3VudCsrKSB7CisJCQkJaWYgKFR4Q291bnQgPT0gMCkgeworCQkJCQlwd3JpbmZvMjRnLT5idzIwX2RpZmZbcmZQYXRoXVswXSA9IDB4MDI7CisJCQkJCXB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdWzBdID0gMHgwNDsKKwkJCQl9IGVsc2UgeworCQkJCQlwd3JpbmZvMjRnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4RkU7CisJCQkJCXB3cmluZm8yNGctPmJ3NDBfZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHhGRTsKKwkJCQkJcHdyaW5mbzI0Zy0+Y2NrX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9CTB4RkU7CisJCQkJCXB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHhGRTsKKwkJCQl9CisJCQl9CisJCQkvKjVHIGRlZmF1bHQgdmFsdWUqLworCQkJZm9yIChncm91cCA9IDAgOyBncm91cCA8IE1BWF9DSE5MX0dST1VQXzVHOyBncm91cCsrKQorCQkJCXB3cmluZm81Zy0+aW5kZXhfYnc0MF9iYXNlW3JmUGF0aF1bZ3JvdXBdID0gMHgyQTsKKworCQkJZm9yIChUeENvdW50ID0gMDsgVHhDb3VudCA8IE1BWF9UWF9DT1VOVDsgVHhDb3VudCsrKSB7CisJCQkJaWYgKFR4Q291bnQgPT0gMCkgeworCQkJCQlwd3JpbmZvNWctPm9mZG1fZGlmZltyZlBhdGhdWzBdID0gMHgwNDsKKwkJCQkJcHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVswXSA9IDB4MDA7CisJCQkJCXB3cmluZm81Zy0+Ync4MF9kaWZmW3JmUGF0aF1bMF0gPSAweEZFOworCQkJCQlwd3JpbmZvNWctPmJ3MTYwX2RpZmZbcmZQYXRoXVswXSA9IDB4RkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVswXSA9IDB4RkU7CisJCQkJCXB3cmluZm81Zy0+YncyMF9kaWZmW3JmUGF0aF1bMF0gPSAweEZFOworCQkJCQlwd3JpbmZvNWctPmJ3NDBfZGlmZltyZlBhdGhdWzBdID0gMHhGRTsKKwkJCQkJcHdyaW5mbzVnLT5idzgwX2RpZmZbcmZQYXRoXVswXSA9IDB4RkU7CisJCQkJCXB3cmluZm81Zy0+YncxNjBfZGlmZltyZlBhdGhdWzBdID0gMHhGRTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworCXJ0bF9wcml2KGh3KS0+ZWZ1c2UuYl90eHB3cl9mcm9tZXByb20gPSB0cnVlOworCisJZm9yIChyZlBhdGggPSAwIDsgcmZQYXRoIDwgTUFYX1JGX1BBVEggOyByZlBhdGgrKykgeworCQkvKjIuNEcgZGVmYXVsdCB2YWx1ZSovCisJCWZvciAoZ3JvdXAgPSAwIDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUF8yNEc7IGdyb3VwKyspIHsKKwkJCXB3cmluZm8yNGctPmluZGV4X2Nja19iYXNlW3JmUGF0aF1bZ3JvdXBdID0gaHdpbmZvW2VlQWRkcisrXTsKKwkJCWlmIChwd3JpbmZvMjRnLT5pbmRleF9jY2tfYmFzZVtyZlBhdGhdW2dyb3VwXSA9PSAweEZGKQorCQkJCXB3cmluZm8yNGctPmluZGV4X2Nja19iYXNlW3JmUGF0aF1bZ3JvdXBdID0gMHgyRDsKKwkJfQorCQlmb3IgKGdyb3VwID0gMCA7IGdyb3VwIDwgTUFYX0NITkxfR1JPVVBfMjRHIC0gMTsgZ3JvdXArKykgeworCQkJcHdyaW5mbzI0Zy0+aW5kZXhfYnc0MF9iYXNlW3JmUGF0aF1bZ3JvdXBdID0gaHdpbmZvW2VlQWRkcisrXTsKKwkJCWlmIChwd3JpbmZvMjRnLT5pbmRleF9idzQwX2Jhc2VbcmZQYXRoXVtncm91cF0gPT0gMHhGRikKKwkJCQlwd3JpbmZvMjRnLT5pbmRleF9idzQwX2Jhc2VbcmZQYXRoXVtncm91cF0gPSAweDJEOworCQl9CisJCWZvciAoVHhDb3VudCA9IDA7IFR4Q291bnQgPCBNQVhfVFhfQ09VTlQ7IFR4Q291bnQgKyspIHsKKwkJCWlmIChUeENvdW50ID09IDApIHsKKwkJCQlwd3JpbmZvMjRnLT5idzQwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDA7CisJCQkJaWYgKGh3aW5mb1tlZUFkZHJdID09IDB4RkYpIHsKKwkJCQkJcHdyaW5mbzI0Zy0+YncyMF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAweDAyOworCQkJCX0gZWxzZSB7CisJCQkJCXB3cmluZm8yNGctPmJ3MjBfZGlmZltyZlBhdGhdW1R4Q291bnRdID0gKGh3aW5mb1tlZUFkZHJdICYgMHhmMCkgPj4gNDsKKwkJCQkJaWYgKHB3cmluZm8yNGctPmJ3MjBfZGlmZltyZlBhdGhdW1R4Q291bnRdICYgQklUKDMpKQkvKmJpdCBzaWduIG51bWJlciB0byA4IGJpdCBzaWduIG51bWJlciovCisJCQkJCQlwd3JpbmZvMjRnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSB8PSAweEYwOworCQkJCX0KKworCQkJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKSB7CisJCQkJCXB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHgwNDsKKwkJCQl9IGVsc2UgeworCQkJCQlwd3JpbmZvMjRnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IChod2luZm9bZWVBZGRyXSAmIDB4MGYpOworCQkJCQlpZihwd3JpbmZvMjRnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSAmIEJJVCgzKSkJCS8qYml0IHNpZ24gbnVtYmVyIHRvIDggYml0IHNpZ24gbnVtYmVyKi8KKwkJCQkJCXB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdIHw9IDB4RjA7CisJCQkJfQorCQkJCXB3cmluZm8yNGctPmNja19kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAwOworCQkJCWVlQWRkcisrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaHdpbmZvW2VlQWRkcl0gPT0gMHhGRikgeworCQkJCQlwd3JpbmZvMjRnLT5idzQwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4RkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHdyaW5mbzI0Zy0+Ync0MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAoaHdpbmZvW2VlQWRkcl0mMHhmMCkgPj4gNDsKKwkJCQkJaWYgKHB3cmluZm8yNGctPmJ3NDBfZGlmZltyZlBhdGhdW1R4Q291bnRdICYgQklUKDMpKQorCQkJCQkJcHdyaW5mbzI0Zy0+Ync0MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCQl9CisKKwkJCQlpZiAoaHdpbmZvW2VlQWRkcl0gPT0gMHhGRikgeworCQkJCQlwd3JpbmZvMjRnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4RkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHdyaW5mbzI0Zy0+YncyMF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAoaHdpbmZvW2VlQWRkcl0gJiAweDBmKTsKKwkJCQkJaWYgKHB3cmluZm8yNGctPmJ3MjBfZGlmZltyZlBhdGhdW1R4Q291bnRdICYgQklUKDMpKQorCQkJCQkJcHdyaW5mbzI0Zy0+YncyMF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCQl9CisKKwkJCQllZUFkZHIrKzsKKworCQkJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKSB7CisJCQkJCXB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHhGRTsKKwkJCQl9IGVsc2UgeworCQkJCQlwd3JpbmZvMjRnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IChod2luZm9bZWVBZGRyXSAmIDB4ZjApID4+IDQ7CisJCQkJCWlmKHB3cmluZm8yNGctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdICYgQklUKDMpKQorCQkJCQkJcHdyaW5mbzI0Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCQl9CisKKwkJCQlpZiAoaHdpbmZvW2VlQWRkcl0gPT0gMHhGRikgeworCQkJCQlwd3JpbmZvMjRnLT5jY2tfZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHhGRTsKKwkJCQl9IGVsc2UgeworCQkJCQlwd3JpbmZvMjRnLT5jY2tfZGlmZltyZlBhdGhdW1R4Q291bnRdID0JKGh3aW5mb1tlZUFkZHJdICYgMHgwZik7CisJCQkJCWlmKHB3cmluZm8yNGctPmNja19kaWZmW3JmUGF0aF1bVHhDb3VudF0gJiBCSVQoMykpCisJCQkJCQlwd3JpbmZvMjRnLT5jY2tfZGlmZltyZlBhdGhdW1R4Q291bnRdIHw9IDB4RjA7CisJCQkJfQorCQkJCWVlQWRkcisrOworCQkJfQorCQl9CisKKwkJLyo1RyBkZWZhdWx0IHZhbHVlKi8KKwkJZm9yIChncm91cCA9IDAgOyBncm91cCA8IE1BWF9DSE5MX0dST1VQXzVHOyBncm91cCArKykgeworCQkJcHdyaW5mbzVnLT5pbmRleF9idzQwX2Jhc2VbcmZQYXRoXVtncm91cF0gPSBod2luZm9bZWVBZGRyKytdOworCQkJaWYgKHB3cmluZm81Zy0+aW5kZXhfYnc0MF9iYXNlW3JmUGF0aF1bZ3JvdXBdID09IDB4RkYpCisJCQkJcHdyaW5mbzVnLT5pbmRleF9idzQwX2Jhc2VbcmZQYXRoXVtncm91cF0gPSAweEZFOworCQl9CisKKwkJZm9yIChUeENvdW50ID0gMDsgVHhDb3VudCA8IE1BWF9UWF9DT1VOVDsgVHhDb3VudCsrKSB7CisJCQlpZiAoVHhDb3VudCA9PSAwKSB7CisJCQkJcHdyaW5mbzVnLT5idzQwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDA7CisJCQkJaWYgKGh3aW5mb1tlZUFkZHJdID09IDB4RkYpIHsKKwkJCQkJcHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4MDsKKwkJCQl9IGVsc2UgeworCQkJCQlwd3JpbmZvNWctPmJ3MjBfZGlmZltyZlBhdGhdWzBdID0gKGh3aW5mb1tlZUFkZHJdICYgMHhmMCkgPj4gNDsKKwkJCQkJaWYocHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSAmIEJJVCgzKSkKKwkJCQkJCXB3cmluZm81Zy0+YncyMF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCQl9CisKKwkJCQlpZiAoaHdpbmZvW2VlQWRkcl0gPT0gMHhGRikgeworCQkJCQlwd3JpbmZvNWctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHg0OworCQkJCX0gZWxzZSB7CisJCQkJCXB3cmluZm81Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bMF0gPSAoaHdpbmZvW2VlQWRkcl0gJiAweDBmKTsKKwkJCQkJaWYocHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSAmIEJJVCgzKSkKKwkJCQkJCXB3cmluZm81Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCQl9CisJCQkJZWVBZGRyKys7CisJCQl9IGVsc2UgeworCQkJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKSB7CisJCQkJCXB3cmluZm81Zy0+Ync0MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAweEZFOworCQkJCX0gZWxzZSB7CisJCQkJCXB3cmluZm81Zy0+Ync0MF9kaWZmW3JmUGF0aF1bVHhDb3VudF09IChod2luZm9bZWVBZGRyXSAmIDB4ZjApID4+IDQ7CisJCQkJCWlmKHB3cmluZm81Zy0+Ync0MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gJiBCSVQoMykpCisJCQkJCQlwd3JpbmZvNWctPmJ3NDBfZGlmZltyZlBhdGhdW1R4Q291bnRdIHw9IDB4RjA7CisJCQkJfQorCisJCQkJaWYgKGh3aW5mb1tlZUFkZHJdID09IDB4RkYpIHsKKwkJCQkJcHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4RkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IChod2luZm9bZWVBZGRyXSAmIDB4MGYpOworCQkJCQlpZihwd3JpbmZvNWctPmJ3MjBfZGlmZltyZlBhdGhdW1R4Q291bnRdICYgQklUKDMpKQorCQkJCQkJcHdyaW5mbzVnLT5idzIwX2RpZmZbcmZQYXRoXVtUeENvdW50XSB8PSAweEYwOworCQkJCX0KKwkJCQllZUFkZHIrKzsKKwkJCX0KKwkJfQorCisJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKSB7CisJCQlwd3JpbmZvNWctPm9mZG1fZGlmZltyZlBhdGhdWzFdID0gMHhGRTsKKwkJCXB3cmluZm81Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bMl0gPSAweEZFOworCQl9IGVsc2UgeworCQkJcHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVsxXSA9CShod2luZm9bZWVBZGRyXSAmIDB4ZjApID4+IDQ7CisJCQlwd3JpbmZvNWctPm9mZG1fZGlmZltyZlBhdGhdWzJdID0JKGh3aW5mb1tlZUFkZHJdICYgMHgwZik7CisJCX0KKwkJZWVBZGRyKys7CisJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKQorCQkJcHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVszXSA9IDB4RkU7CisJCWVsc2UKKwkJCXB3cmluZm81Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bM10gPSAoaHdpbmZvW2VlQWRkcl0gJiAweDBmKTsKKworCQllZUFkZHIrKzsKKworCQlmb3IgKFR4Q291bnQgPSAxOyBUeENvdW50IDwgTUFYX1RYX0NPVU5UOyBUeENvdW50KyspIHsKKwkJCWlmIChwd3JpbmZvNWctPm9mZG1fZGlmZltyZlBhdGhdW1R4Q291bnRdID09IDB4RkYpCisJCQkJcHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9IDB4RkU7CisJCQllbHNlIGlmKHB3cmluZm81Zy0+b2ZkbV9kaWZmW3JmUGF0aF1bVHhDb3VudF0gJiBCSVQoMykpCisJCQkJcHdyaW5mbzVnLT5vZmRtX2RpZmZbcmZQYXRoXVtUeENvdW50XSB8PSAweEYwOworCQl9CisJCWZvciAoVHhDb3VudCA9IDA7IFR4Q291bnQgPCBNQVhfVFhfQ09VTlQ7IFR4Q291bnQrKykgeworCQkJaWYgKGh3aW5mb1tlZUFkZHJdID09IDB4RkYpIHsKKwkJCQlwd3JpbmZvNWctPmJ3ODBfZGlmZltyZlBhdGhdW1R4Q291bnRdID0gMHhGRTsKKwkJCX0gZWxzZSB7CisJCQkJcHdyaW5mbzVnLT5idzgwX2RpZmZbcmZQYXRoXVtUeENvdW50XSA9CShod2luZm9bZWVBZGRyXSAmIDB4ZjApID4+IDQ7CisJCQkJaWYocHdyaW5mbzVnLT5idzgwX2RpZmZbcmZQYXRoXVtUeENvdW50XSAmIEJJVCgzKSkJCS8vNGJpdCBzaWduIG51bWJlciB0byA4IGJpdCBzaWduIG51bWJlcgorCQkJCQlwd3JpbmZvNWctPmJ3ODBfZGlmZltyZlBhdGhdW1R4Q291bnRdIHw9IDB4RjA7CisJCQl9CisKKwkJCWlmIChod2luZm9bZWVBZGRyXSA9PSAweEZGKSB7CisJCQkJcHdyaW5mbzVnLT5idzE2MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gPSAweEZFOworCQkJfSBlbHNlIHsKKwkJCQlwd3JpbmZvNWctPmJ3MTYwX2RpZmZbcmZQYXRoXVtUeENvdW50XT0JKGh3aW5mb1tlZUFkZHJdICYgMHgwZik7CisJCQkJaWYocHdyaW5mbzVnLT5idzE2MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gJiBCSVQoMykpCQkvLzRiaXQgc2lnbiBudW1iZXIgdG8gOCBiaXQgc2lnbiBudW1iZXIKKwkJCQkJcHdyaW5mbzVnLT5idzE2MF9kaWZmW3JmUGF0aF1bVHhDb3VudF0gfD0gMHhGMDsKKwkJCX0KKwkJCWVlQWRkcisrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfcnRsODgxMmFlX3JlYWRfdHhwb3dlcl9pbmZvX2Zyb21faHdwZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCSBib29sIGF1dG9sb2FkX2ZhaWwsCisJCQkJCQkgdTggKmh3aW5mbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgdHhwb3dlcl9pbmZvXzJnIHB3cmluZm8yNGc7CisJc3RydWN0IHR4cG93ZXJfaW5mb181ZyBwd3JpbmZvNWc7CisJdTggY2hhbm5lbDVnW0NIQU5ORUxfTUFYX05VTUJFUl81R10gPQorCQkJCSB7MzYsMzgsNDAsNDIsNDQsNDYsNDgsNTAsNTIsNTQsNTYsNTgsNjAsNjIsNjQsMTAwLDEwMiwxMDQsMTA2LDEwOCwxMTAsMTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQsMTE2LDExOCwxMjAsMTIyLDEyNCwxMjYsMTI4LDEzMCwxMzIsMTM0LDEzNiwxMzgsMTQwLDE0MiwxNDQsMTQ5LDE1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTUzLDE1NSwxNTcsMTU5LDE2MSwxNjMsMTY1LDE2NywxNjgsMTY5LDE3MSwxNzMsMTc1LDE3N307CisJdTggY2hhbm5lbDVnXzgwbVtDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNXSA9IHs0MiwgNTgsIDEwNiwgMTIyLCAxMzgsIDE1NSwgMTcxfTsKKwl1OCByZl9wYXRoLCBpbmRleDsKKwl1OCBpOworCisJX3J0bDg4MjFhZV9yZWFkX3Bvd2VyX3ZhbHVlX2Zyb21wcm9tKGh3LCAmcHdyaW5mbzI0ZywgJnB3cmluZm81ZywgYXV0b2xvYWRfZmFpbCwgaHdpbmZvKTsKKworCWZvciAocmZfcGF0aCA9IDA7IHJmX3BhdGggPCAyOyByZl9wYXRoKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfTUFYX05VTUJFUl8yRzsgaSsrKSB7CisJCQlpbmRleCA9IF9ydGw4ODIxYWVfZ2V0X2NobmxfZ3JvdXAoaSArIDEpOworCisJCQlpZiAoaSA9PSBDSEFOTkVMX01BWF9OVU1CRVJfMkcgLSAxKSB7CisJCQkJcnRsZWZ1c2UtPnR4cHdybGV2ZWxfY2NrW3JmX3BhdGhdW2ldID0KKwkJCQkJcHdyaW5mbzI0Zy5pbmRleF9jY2tfYmFzZVtyZl9wYXRoXVs1XTsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW3JmX3BhdGhdW2ldID0KKwkJCQkJcHdyaW5mbzI0Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQkJfSBlbHNlIHsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9jY2tbcmZfcGF0aF1baV0gPQorCQkJCQlwd3JpbmZvMjRnLmluZGV4X2Nja19iYXNlW3JmX3BhdGhdW2luZGV4XTsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW3JmX3BhdGhdW2ldID0KKwkJCQkJcHdyaW5mbzI0Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfTUFYX05VTUJFUl81RzsgaSsrKSB7CisJCQlpbmRleCA9IF9ydGw4ODIxYWVfZ2V0X2NobmxfZ3JvdXAoY2hhbm5lbDVnW2ldKTsKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19idzQwYmFzZVtyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNOyBpKyspIHsKKwkJCXU4IHVwcGVyLCBsb3dlcjsKKwkJCWluZGV4ID0gX3J0bDg4MjFhZV9nZXRfY2hubF9ncm91cChjaGFubmVsNWdfODBtW2ldKTsKKwkJCXVwcGVyID0gcHdyaW5mbzVnLmluZGV4X2J3NDBfYmFzZVtyZl9wYXRoXVtpbmRleF07CisJCQlsb3dlciA9IHB3cmluZm81Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXggKyAxXTsKKworCQkJcnRsZWZ1c2UtPnR4cHdyXzVnX2J3ODBiYXNlW3JmX3BhdGhdW2ldID0gKHVwcGVyICsgbG93ZXIpIC8gMjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX0NPVU5UOyBpKyspIHsKKwkJCXJ0bGVmdXNlLT50eHB3cl9jY2tkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5jY2tfZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9sZWdhY3lodGRpZmZbcmZfcGF0aF1baV0gPSBwd3JpbmZvMjRnLm9mZG1fZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9odDIwZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm8yNGcuYncyMF9kaWZmW3JmX3BhdGhdW2ldOworCQkJcnRsZWZ1c2UtPnR4cHdyX2h0NDBkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5idzQwX2RpZmZbcmZfcGF0aF1baV07CisKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19vZmRtZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5vZmRtX2RpZmZbcmZfcGF0aF1baV07CisJCQlydGxlZnVzZS0+dHhwd3JfNWdfYncyMGRpZmZbcmZfcGF0aF1baV0gPSBwd3JpbmZvNWcuYncyMF9kaWZmW3JmX3BhdGhdW2ldOworCQkJcnRsZWZ1c2UtPnR4cHdyXzVnX2J3NDBkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzVnLmJ3NDBfZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19idzgwZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5idzgwX2RpZmZbcmZfcGF0aF1baV07CisJCX0KKwl9CisKKwlpZiAoIWF1dG9sb2FkX2ZhaWwpeworCQlydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgPQorCQkJaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05dICYgMHgwNzsvKmJpdDB+MiovCisJCWlmIChod2luZm9bRUVQUk9NX1JGX0JPQVJEX09QVElPTl0gPT0gMHhGRikKKwkJCXJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSA9IDA7CisJfSBlbHNlIHsKKwkJcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID0gMDsKKwl9CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX1R4UG93ZXIsCisJKCJlZXByb21fcmVndWxhdG9yeSA9IDB4JXhcbiIsIHJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSApKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9yZWFkX3R4cG93ZXJfaW5mb19mcm9tX2h3cGcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgYm9vbCBhdXRvbG9hZF9mYWlsLAorCQkJCQkJIHU4ICpod2luZm8pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHR4cG93ZXJfaW5mb18yZyBwd3JpbmZvMjRnOworCXN0cnVjdCB0eHBvd2VyX2luZm9fNWcgcHdyaW5mbzVnOworCXU4IGNoYW5uZWw1Z1tDSEFOTkVMX01BWF9OVU1CRVJfNUddID0KKwkJCQl7MzYsMzgsNDAsNDIsNDQsNDYsNDgsNTAsNTIsNTQsNTYsNTgsNjAsNjIsNjQsMTAwLDEwMiwxMDQsMTA2LDEwOCwxMTAsMTEyLAorICAgICAgICAgICAgICAgICAxMTQsMTE2LDExOCwxMjAsMTIyLDEyNCwxMjYsMTI4LDEzMCwxMzIsMTM0LDEzNiwxMzgsMTQwLDE0MiwxNDQsMTQ5LDE1MSwKKyAgICAgICAgICAgICAgICAgMTUzLDE1NSwxNTcsMTU5LDE2MSwxNjMsMTY1LDE2NywxNjgsMTY5LDE3MSwxNzMsMTc1LDE3N307CisJdTggY2hhbm5lbDVnXzgwbVtDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNXSA9IHs0MiwgNTgsIDEwNiwgMTIyLCAxMzgsIDE1NSwgMTcxfTsKKwl1OCByZl9wYXRoLCBpbmRleDsKKwl1OCBpOworCisJX3J0bDg4MjFhZV9yZWFkX3Bvd2VyX3ZhbHVlX2Zyb21wcm9tKGh3LCAmcHdyaW5mbzI0ZywgJnB3cmluZm81ZywgYXV0b2xvYWRfZmFpbCwgaHdpbmZvKTsKKworCWZvciAocmZfcGF0aCA9IDA7IHJmX3BhdGggPCAyOyByZl9wYXRoKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfTUFYX05VTUJFUl8yRzsgaSsrKSB7CisJCQlpbmRleCA9IF9ydGw4ODIxYWVfZ2V0X2NobmxfZ3JvdXAoaSArIDEpOworCisJCQlpZiAoaSA9PSBDSEFOTkVMX01BWF9OVU1CRVJfMkcgLSAxKSB7CisJCQkJcnRsZWZ1c2UtPnR4cHdybGV2ZWxfY2NrW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5pbmRleF9jY2tfYmFzZVtyZl9wYXRoXVs1XTsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQkJfSBlbHNlIHsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9jY2tbcmZfcGF0aF1baV0gPSBwd3JpbmZvMjRnLmluZGV4X2Nja19iYXNlW3JmX3BhdGhdW2luZGV4XTsKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfTUFYX05VTUJFUl81RzsgaSsrKSB7CisJCQlpbmRleCA9IF9ydGw4ODIxYWVfZ2V0X2NobmxfZ3JvdXAoY2hhbm5lbDVnW2ldKTsKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19idzQwYmFzZVtyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXhdOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNOyBpKyspIHsKKwkJCXU4IHVwcGVyLCBsb3dlcjsKKwkJCWluZGV4ID0gX3J0bDg4MjFhZV9nZXRfY2hubF9ncm91cChjaGFubmVsNWdfODBtW2ldKTsKKwkJCXVwcGVyID0gcHdyaW5mbzVnLmluZGV4X2J3NDBfYmFzZVtyZl9wYXRoXVtpbmRleF07CisJCQlsb3dlciA9IHB3cmluZm81Zy5pbmRleF9idzQwX2Jhc2VbcmZfcGF0aF1baW5kZXggKyAxXTsKKworCQkJcnRsZWZ1c2UtPnR4cHdyXzVnX2J3ODBiYXNlW3JmX3BhdGhdW2ldID0gKHVwcGVyICsgbG93ZXIpIC8gMjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX0NPVU5UOyBpKyspIHsKKwkJCXJ0bGVmdXNlLT50eHB3cl9jY2tkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5jY2tfZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9sZWdhY3lodGRpZmZbcmZfcGF0aF1baV0gPSBwd3JpbmZvMjRnLm9mZG1fZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9odDIwZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm8yNGcuYncyMF9kaWZmW3JmX3BhdGhdW2ldOworCQkJcnRsZWZ1c2UtPnR4cHdyX2h0NDBkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzI0Zy5idzQwX2RpZmZbcmZfcGF0aF1baV07CisKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19vZmRtZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5vZmRtX2RpZmZbcmZfcGF0aF1baV07CisJCQlydGxlZnVzZS0+dHhwd3JfNWdfYncyMGRpZmZbcmZfcGF0aF1baV0gPSBwd3JpbmZvNWcuYncyMF9kaWZmW3JmX3BhdGhdW2ldOworCQkJcnRsZWZ1c2UtPnR4cHdyXzVnX2J3NDBkaWZmW3JmX3BhdGhdW2ldID0gcHdyaW5mbzVnLmJ3NDBfZGlmZltyZl9wYXRoXVtpXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl81Z19idzgwZGlmZltyZl9wYXRoXVtpXSA9IHB3cmluZm81Zy5idzgwX2RpZmZbcmZfcGF0aF1baV07CisJCX0KKwl9CisKKwlpZiAoIWF1dG9sb2FkX2ZhaWwpeworCQlydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgPSBod2luZm9bRUVQUk9NX1JGX0JPQVJEX09QVElPTl0gJiAweDA3Oy8qYml0MH4yKi8KKwkJaWYgKGh3aW5mb1tFRVBST01fUkZfQk9BUkRfT1BUSU9OXSA9PSAweEZGKQorCQkJcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID0gMDsKKwl9IGVsc2UgeworCQlydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgPSAwOworCX0KKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfVHhQb3dlciwKKwkoImVlcHJvbV9yZWd1bGF0b3J5ID0gMHgleFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ICkpOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgxMmFlX3JlYWRfYWRhcHRlcl9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfcHNldWRvX3Rlc3QgKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwl1MTYgaSwgdXN2YWx1ZTsKKwl1OCBod2luZm9bSFdTRVRfTUFYX1NJWkVdOworCXUxNiBlZXByb21faWQ7CisKKwlpZiAoYl9wc2V1ZG9fdGVzdCkgeworCQkvKiBuZWVkIGFkZCAqLworCX0KKworCWlmIChydGxlZnVzZS0+ZXByb210eXBlID09IEVFUFJPTV9CT09UX0VGVVNFKSB7CisJCXJ0bF9lZnVzZV9zaGFkb3dfbWFwX3VwZGF0ZShodyk7CisJCW1lbWNweShod2luZm8sICZydGxlZnVzZS0+ZWZ1c2VfbWFwW0VGVVNFX0lOSVRfTUFQXVswXSwKKwkJICAgICAgIEhXU0VUX01BWF9TSVpFKTsKKwl9IGVsc2UgaWYgKHJ0bGVmdXNlLT5lcHJvbXR5cGUgPT0gRUVQUk9NXzkzQzQ2KSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJSVEw4MTlYIE5vdCBib290IGZyb20gZWVwcm9tLCBjaGVjayBpdCAhISIpKTsKKwl9CisKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoIk1BUCBcbiIpLAorCQkgICAgICBod2luZm8sIEhXU0VUX01BWF9TSVpFKTsKKworCWVlcHJvbV9pZCA9ICooKHUxNiAqKSAmIGh3aW5mb1swXSk7CisJaWYgKGVlcHJvbV9pZCAhPSBSVExfRUVQUk9NX0lEKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoIkVFUFJPTSBJRCglI3gpIGlzIGludmFsaWQhIVxuIiwgZWVwcm9tX2lkKSk7CisJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9IHRydWU7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJBdXRvbG9hZCBPS1xuIikpOworCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPSBmYWxzZTsKKwl9CisKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnID09IHRydWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlJUTDg4MTJBRSBhdXRvbG9hZF9mYWlsZmxhZywgY2hlY2sgaXQgISEiKSk7CisJCXJldHVybjsKKwl9CisKKwlydGxlZnVzZS0+ZWVwcm9tX3ZlcnNpb24gPSAqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9WRVJTSU9OXTsKKwlpZiAocnRsZWZ1c2UtPmVlcHJvbV92ZXJzaW9uID09IDB4ZmYpCisJCQlydGxlZnVzZS0+ZWVwcm9tX3ZlcnNpb24gPSAwOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIHZlcnNpb246IDB4JTJ4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX3ZlcnNpb24pKTsKKworCXJ0bGVmdXNlLT5lZXByb21fdmlkID0gKih1MTYgKikgJmh3aW5mb1tFRVBST01fVklEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX2RpZCA9ICoodTE2ICopICZod2luZm9bRUVQUk9NX0RJRF07CisJcnRsZWZ1c2UtPmVlcHJvbV9zdmlkID0gKih1MTYgKikgJmh3aW5mb1tFRVBST01fU1ZJRF07CisJcnRsZWZ1c2UtPmVlcHJvbV9zbWlkID0gKih1MTYgKikgJmh3aW5mb1tFRVBST01fU01JRF07CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NSWQgPSAweCU0eFxuIiwgZWVwcm9tX2lkKSk7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIFZJRCA9IDB4JTR4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX3ZpZCkpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTSBESUQgPSAweCU0eFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9kaWQpKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gU1ZJRCA9IDB4JTR4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX3N2aWQpKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gU01JRCA9IDB4JTR4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX3NtaWQpKTsKKworCS8qY3VzdG9tZXIgSUQqLworCXJ0bGVmdXNlLT5lZXByb21fb2VtaWQgPSAqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9DVVNUT01FUl9JRF07CisJaWYgKHJ0bGVmdXNlLT5lZXByb21fb2VtaWQgPT0gMHhGRikKKwkJcnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCA9IDA7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gQ3VzdG9tZXIgSUQ6IDB4JTJ4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX29lbWlkKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCXVzdmFsdWUgPSAqKHUxNiAqKSAmIGh3aW5mb1tFRVBST01fTUFDX0FERFIgKyBpXTsKKwkJKigodTE2ICopICgmcnRsZWZ1c2UtPmRldl9hZGRyW2ldKSkgPSB1c3ZhbHVlOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0RNRVNHLAorCQkgKCJkZXZfYWRkcjogJXBNXG4iLCBydGxlZnVzZS0+ZGV2X2FkZHIpKTsKKworCV9ydGw4ODEyYWVfcmVhZF90eHBvd2VyX2luZm9fZnJvbV9od3BnKGh3LAorCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcsIGh3aW5mbyk7CisKKwkvKmJvYXJkIHR5cGUqLworCXJ0bGVmdXNlLT5ib2FyZF90eXBlID0gKCgoKih1OCAqKSAmIGh3aW5mb1tFRVBST01fUkZfQk9BUkRfT1BUSU9OXSkgJiAweEUwICkgPj4gNSk7CisJaWYgKCgqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05dKSA9PSAweGZmICkKKwkJcnRsZWZ1c2UtPmJvYXJkX3R5cGUgPSAwOworCXJ0bGhhbC0+Ym9hZF90eXBlID0gcnRsZWZ1c2UtPmJvYXJkX3R5cGU7CisKKwlydGw4ODEyYWVfcmVhZF9idF9jb2V4aXN0X2luZm9fZnJvbV9od3BnKGh3LAorCQkJcnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnLCBod2luZm8pOworCisJcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9ICoodTggKikgJiBod2luZm9bRUVQUk9NX0NIQU5ORUxQTEFOXTsKKwlpZiAocnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9PSAweGZmKQorCQlydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID0gMHg3RjsKKworCS8qIHNldCBjaGFubmVsIHBhbG4gdG8gd29ybGQgd2lkZSAxMyAqLworCS8vcnRsZWZ1c2UtPmNoYW5uZWxfcGxhbiA9ICh1OCkgcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbjsKKworCS8qcGFyc2UgeHRhbCovCisJcnRsZWZ1c2UtPmNyeXN0YWxjYXAgPSBod2luZm9bRUVQUk9NX1hUQUxfODgyMUFFXTsKKwlpZiAoIHJ0bGVmdXNlLT5jcnlzdGFsY2FwID09IDB4RkYgKQorCQlydGxlZnVzZS0+Y3J5c3RhbGNhcCA9IDB4MjA7CisKKwlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9ICoodTggKikgJiBod2luZm9bRUVQUk9NX1RIRVJNQUxfTUVURVJdOworCWlmICgocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPT0gMHhmZikgfHxydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgKQorCXsKKwkJcnRsZWZ1c2UtPmJfYXBrX3RoZXJtYWxtZXRlcmlnbm9yZSA9IHRydWU7CisJCXJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyID0gMHhmZjsKKwl9CisKKwlydGxlZnVzZS0+dGhlcm1hbG1ldGVyWzBdID0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXI7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgidGhlcm1hbG1ldGVyID0gMHgleFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpKTsKKworCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gZmFsc2UpIHsKKwkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X2NmZyA9ICoodTggKikgJiBod2luZm9bRUVQUk9NX1JGX0JPQVJEX09QVElPTl0gJiAweDE4ID4+IDM7CisJCWlmICgqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05dID09IDB4ZmYpCisJCQlydGxlZnVzZS0+YW50ZW5uYV9kaXZfY2ZnID0gMHgwMDsKKwkJLyppZiAoQlRfMWFudCgpKQorCQkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X2NmZyA9IDA7Ki8KKwkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPSAqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9SRl9BTlRFTk5BX09QVF84OEVdOworCQlpZiAocnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPT0gMHhGRikKKwkJeworCQkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPSBGSVhFRF9IV19BTlRESVY7CisJCX0KKwl9IGVsc2UgeworCQlydGxlZnVzZS0+YW50ZW5uYV9kaXZfY2ZnID0gMDsKKwkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPSAwOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSgiU1dBUzogYkh3QW50RGl2ID0gJXgsIFRSeEFudERpdlR5cGUgPSAleFxuIiwKKyAgICAgICAgICAgICAgICBydGxlZnVzZS0+YW50ZW5uYV9kaXZfY2ZnLCBydGxlZnVzZS0+YW50ZW5uYV9kaXZfdHlwZSkpOworCisJLypIYWxfUmVhZFBBVHlwZV84ODIxQSgpKi8KKwkvKkhhbF9FZnVzZVBhcnNlUmF0ZUluZGljYXRpb25PcHRpb244ODIxQSgpKi8KKwkvKkhhbF9SZWFkRWZ1c2VQQ0llQ2FwODgyMUFFKCkqLworCisJcGNpcHJpdi0+bGVkY3RsLmJsZWRfb3BlbmRyYWluID0gdHJ1ZTsKKworCWlmIChydGxoYWwtPm9lbV9pZCA9PSBSVF9DSURfREVGQVVMVCkgeworCQlzd2l0Y2ggKHJ0bGVmdXNlLT5lZXByb21fb2VtaWQpIHsKKwkJY2FzZSBSVF9DSURfREVGQVVMVDoKKwkJCWJyZWFrOworCQljYXNlIEVFUFJPTV9DSURfVE9TSElCQToKKwkJCXJ0bGhhbC0+b2VtX2lkID0gUlRfQ0lEX1RPU0hJQkE7CisJCQlicmVhazsKKwkJY2FzZSBFRVBST01fQ0lEX0NDWDoKKwkJCXJ0bGhhbC0+b2VtX2lkID0gUlRfQ0lEX0NDWDsKKwkJCWJyZWFrOworCQljYXNlIEVFUFJPTV9DSURfUU1JOgorCQkJcnRsaGFsLT5vZW1faWQgPSBSVF9DSURfODE5eF9RTUk7CisJCQlicmVhazsKKwkJY2FzZSBFRVBST01fQ0lEX1dIUUw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfcmVhZF9hZGFwdGVyX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9wc2V1ZG9fdGVzdCApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXUxNiBpLCB1c3ZhbHVlOworCXU4IGh3aW5mb1tIV1NFVF9NQVhfU0laRV07CisJdTE2IGVlcHJvbV9pZDsKKworCWlmIChiX3BzZXVkb190ZXN0KSB7CisJCS8qIG5lZWQgYWRkICovCisJfQorCisJaWYgKHJ0bGVmdXNlLT5lcHJvbXR5cGUgPT0gRUVQUk9NX0JPT1RfRUZVU0UpIHsKKwkJcnRsX2VmdXNlX3NoYWRvd19tYXBfdXBkYXRlKGh3KTsKKwkJbWVtY3B5KGh3aW5mbywgJnJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdWzBdLAorCQkgICAgICAgSFdTRVRfTUFYX1NJWkUpOworCX0gZWxzZSBpZiAocnRsZWZ1c2UtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNDYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlJUTDgxOVggTm90IGJvb3QgZnJvbSBlZXByb20sIGNoZWNrIGl0ICEhIikpOworCX0KKworCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csICgiTUFQIFxuIiksCisJCSAgICAgIGh3aW5mbywgSFdTRVRfTUFYX1NJWkUpOworCisJZWVwcm9tX2lkID0gKigodTE2ICopICYgaHdpbmZvWzBdKTsKKwlpZiAoZWVwcm9tX2lkICE9IFJUTF9FRVBST01fSUQpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJICgiRUVQUk9NIElEKCUjeCkgaXMgaW52YWxpZCEhXG4iLCBlZXByb21faWQpKTsKKwkJcnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIkF1dG9sb2FkIE9LXG4iKSk7CisJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9IGZhbHNlOworCX0KKworCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gdHJ1ZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiUlRMODgxMkFFIGF1dG9sb2FkX2ZhaWxmbGFnLCBjaGVjayBpdCAhISIpKTsKKwkJcmV0dXJuOworCX0KKworCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9ICoodTggKikgJiBod2luZm9bRUVQUk9NX1ZFUlNJT05dOworCWlmIChydGxlZnVzZS0+ZWVwcm9tX3ZlcnNpb24gPT0gMHhmZikKKwkJCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9IDA7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gdmVyc2lvbjogMHglMnhcbiIsIHJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbikpOworCisJcnRsZWZ1c2UtPmVlcHJvbV92aWQgPSAqKHUxNiAqKSAmaHdpbmZvW0VFUFJPTV9WSURdOworCXJ0bGVmdXNlLT5lZXByb21fZGlkID0gKih1MTYgKikgJmh3aW5mb1tFRVBST01fRElEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX3N2aWQgPSAqKHUxNiAqKSAmaHdpbmZvW0VFUFJPTV9TVklEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX3NtaWQgPSAqKHUxNiAqKSAmaHdpbmZvW0VFUFJPTV9TTUlEXTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST01JZCA9IDB4JTR4XG4iLCBlZXByb21faWQpKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gVklEID0gMHglNHhcbiIsIHJ0bGVmdXNlLT5lZXByb21fdmlkKSk7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIERJRCA9IDB4JTR4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX2RpZCkpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTSBTVklEID0gMHglNHhcbiIsIHJ0bGVmdXNlLT5lZXByb21fc3ZpZCkpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTSBTTUlEID0gMHglNHhcbiIsIHJ0bGVmdXNlLT5lZXByb21fc21pZCkpOworCisJLypjdXN0b21lciBJRCovCisJcnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCA9ICoodTggKikgJiBod2luZm9bRUVQUk9NX0NVU1RPTUVSX0lEXTsKKwlpZiAocnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCA9PSAweEZGKQorCQlydGxlZnVzZS0+ZWVwcm9tX29lbWlkID0gMDsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsIHJ0bGVmdXNlLT5lZXByb21fb2VtaWQpKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwkJdXN2YWx1ZSA9ICoodTE2ICopICYgaHdpbmZvW0VFUFJPTV9NQUNfQUREUiArIGldOworCQkqKCh1MTYgKikgKCZydGxlZnVzZS0+ZGV2X2FkZHJbaV0pKSA9IHVzdmFsdWU7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csCisJCSAoImRldl9hZGRyOiAlcE1cbiIsIHJ0bGVmdXNlLT5kZXZfYWRkcikpOworCisJX3J0bDg4MjFhZV9yZWFkX3R4cG93ZXJfaW5mb19mcm9tX2h3cGcoaHcsCisJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKKworCS8qYm9hcmQgdHlwZSovCisJcnRsZWZ1c2UtPmJvYXJkX3R5cGUgPSAoKCgqKHU4ICopICYgaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05dKSAmIDB4RTAgKSA+PiA1KTsKKwlpZiAoKCoodTggKikgJiBod2luZm9bRUVQUk9NX1JGX0JPQVJEX09QVElPTl0pID09IDB4ZmYgKQorCQlydGxlZnVzZS0+Ym9hcmRfdHlwZSA9IDA7CisJcnRsaGFsLT5ib2FkX3R5cGUgPSBydGxlZnVzZS0+Ym9hcmRfdHlwZTsKKworCXJ0bDg4MjFhZV9yZWFkX2J0X2NvZXhpc3RfaW5mb19mcm9tX2h3cGcoaHcsCisJCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcsIGh3aW5mbyk7CisKKwlydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID0gKih1OCAqKSAmIGh3aW5mb1tFRVBST01fQ0hBTk5FTFBMQU5dOworCWlmIChydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID09IDB4ZmYpCisJCXJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPSAweDdGOworCisJLyogc2V0IGNoYW5uZWwgcGFsbiB0byB3b3JsZCB3aWRlIDEzICovCisJLy9ydGxlZnVzZS0+Y2hhbm5lbF9wbGFuID0gKHU4KSBydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuOworCisJLypwYXJzZSB4dGFsKi8KKwlydGxlZnVzZS0+Y3J5c3RhbGNhcCA9IGh3aW5mb1tFRVBST01fWFRBTF84ODIxQUVdOworCWlmICggcnRsZWZ1c2UtPmNyeXN0YWxjYXAgPT0gMHhGRiApCisJCXJ0bGVmdXNlLT5jcnlzdGFsY2FwID0gMHgyMDsKKworCXJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyID0gKih1OCAqKSAmIGh3aW5mb1tFRVBST01fVEhFUk1BTF9NRVRFUl07CisJaWYgKChydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9PSAweGZmKSB8fHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyApCisJeworCQlydGxlZnVzZS0+Yl9hcGtfdGhlcm1hbG1ldGVyaWdub3JlID0gdHJ1ZTsKKwkJcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPSAweDE4OworCX0KKworCXJ0bGVmdXNlLT50aGVybWFsbWV0ZXJbMF0gPSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcjsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJ0aGVybWFsbWV0ZXIgPSAweCV4XG4iLCBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikpOworCisJaWYgKHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9PSBmYWxzZSkgeworCQlydGxlZnVzZS0+YW50ZW5uYV9kaXZfY2ZnID0gKCoodTggKikgJiBod2luZm9bRUVQUk9NX1JGX0JPQVJEX09QVElPTl0gJiBCSVQoMykpP3RydWU6ZmFsc2U7CisJCS8qaWYgKEJUXzFhbnQoKSkKKwkJCXJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl9jZmcgPSAwOyovCisKKwkJcnRsZWZ1c2UtPmFudGVubmFfZGl2X3R5cGUgPSBDR19UUlhfSFdfQU5URElWOworCX0gZWxzZSB7CisJCXJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl9jZmcgPSAwOworCQlydGxlZnVzZS0+YW50ZW5uYV9kaXZfdHlwZSA9IDA7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJKCJTV0FTOiBiSHdBbnREaXYgPSAleCwgVFJ4QW50RGl2VHlwZSA9ICV4XG4iLAorICAgICAgICAgICAgICAgIHJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl9jZmcsIHJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl90eXBlKSk7CisKKwlwY2lwcml2LT5sZWRjdGwuYmxlZF9vcGVuZHJhaW4gPSB0cnVlOworCisJaWYgKHJ0bGhhbC0+b2VtX2lkID09IFJUX0NJRF9ERUZBVUxUKSB7CisJCXN3aXRjaCAocnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCkgeworCQljYXNlIFJUX0NJRF9ERUZBVUxUOgorCQkJYnJlYWs7CisJCWNhc2UgRUVQUk9NX0NJRF9UT1NISUJBOgorCQkJcnRsaGFsLT5vZW1faWQgPSBSVF9DSURfVE9TSElCQTsKKwkJCWJyZWFrOworCQljYXNlIEVFUFJPTV9DSURfQ0NYOgorCQkJcnRsaGFsLT5vZW1faWQgPSBSVF9DSURfQ0NYOworCQkJYnJlYWs7CisJCWNhc2UgRUVQUk9NX0NJRF9RTUk6CisJCQlydGxoYWwtPm9lbV9pZCA9IFJUX0NJRF84MTl4X1FNSTsKKwkJCWJyZWFrOworCQljYXNlIEVFUFJPTV9DSURfV0hRTDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLypzdGF0aWMgdm9pZCBfcnRsODgyMWFlX2hhbF9jdXN0b21pemVkX2JlaGF2aW9yKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisKKwlwY2lwcml2LT5sZWRjdGwuYmxlZF9vcGVuZHJhaW4gPSB0cnVlOworCXN3aXRjaCAocnRsaGFsLT5vZW1faWQpIHsKKwljYXNlIFJUX0NJRF84MTl4X0hQOgorCQlwY2lwcml2LT5sZWRjdGwuYmxlZF9vcGVuZHJhaW4gPSB0cnVlOworCQlicmVhazsKKwljYXNlIFJUX0NJRF84MTl4X0xlbm92bzoKKwljYXNlIFJUX0NJRF9ERUZBVUxUOgorCWNhc2UgUlRfQ0lEX1RPU0hJQkE6CisJY2FzZSBSVF9DSURfQ0NYOgorCWNhc2UgUlRfQ0lEXzgxOXhfQWNlcjoKKwljYXNlIFJUX0NJRF9XSFFMOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywKKwkJICgiUlQgQ3VzdG9taXplZCBJRDogMHglMDJYXG4iLCBydGxoYWwtPm9lbV9pZCkpOworfSovCisKK3ZvaWQgcnRsODgyMWFlX3JlYWRfZWVwcm9tX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4IHRtcF91MWI7CisKKwlydGxoYWwtPnZlcnNpb24gPSBfcnRsODgyMWFlX3JlYWRfY2hpcF92ZXJzaW9uKGh3KTsKKworCWlmIChnZXRfcmZfdHlwZShydGxwaHkpID09IFJGXzFUMVIpCisJCXJ0bHByaXYtPmRtLmJyZnBhdGhfcnhlbmFibGVbMF0gPSB0cnVlOworCWVsc2UKKwkJcnRscHJpdi0+ZG0uYnJmcGF0aF9yeGVuYWJsZVswXSA9CisJCSAgICBydGxwcml2LT5kbS5icmZwYXRoX3J4ZW5hYmxlWzFdID0gdHJ1ZTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIlZlcnNpb25JRCA9IDB4JTR4XG4iLAorCQkJCQkJcnRsaGFsLT52ZXJzaW9uKSk7CisKKwl0bXBfdTFiID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfOTM0NkNSKTsKKwlpZiAodG1wX3UxYiAmIEJJVCg0KSkgeworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19ETUVTRywgKCJCb290IGZyb20gRUVQUk9NXG4iKSk7CisJCXJ0bGVmdXNlLT5lcHJvbXR5cGUgPSBFRVBST01fOTNDNDY7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfRE1FU0csICgiQm9vdCBmcm9tIEVGVVNFXG4iKSk7CisJCXJ0bGVmdXNlLT5lcHJvbXR5cGUgPSBFRVBST01fQk9PVF9FRlVTRTsKKwl9CisKKwlpZiAodG1wX3UxYiAmIEJJVCg1KSkgeworCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIkF1dG9sb2FkIE9LXG4iKSk7CisJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9IGZhbHNlOworCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJX3J0bDg4MTJhZV9yZWFkX2FkYXB0ZXJfaW5mbyhodywgZmFsc2UpOworCQllbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJCQlfcnRsODgyMWFlX3JlYWRfYWRhcHRlcl9pbmZvKGh3LCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgiQXV0b2xvYWQgRVJSISFcbiIpKTsKKwl9CisJLypoYWxfUmVhZFJGVHlwZV84ODEyQSgpKi8KKwkvL19ydGw4ODIxYWVfaGFsX2N1c3RvbWl6ZWRfYmVoYXZpb3IoaHcpOworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfdXBkYXRlX2hhbF9yYXRlX3RhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpydGxwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUzMiByYXRyX3ZhbHVlOworCXU4IHJhdHJfaW5kZXggPSAwOworCXU4IGJfbm1vZGUgPSBtYWMtPmh0X2VuYWJsZTsKKwl1OCBtaW1vX3BzID0gSUVFRTgwMjExX1NNUFNfT0ZGOworCXUxNiBzaG9ydGdpX3JhdGU7CisJdTMyIHRtcF9yYXRyX3ZhbHVlOworCXU4IGJfY3VydHhid180MG1oeiA9IG1hYy0+YndfNDA7CisJdTggYl9jdXJzaG9ydGdpXzQwbWh6ID0gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSA/CisJCQkJMSA6IDA7CisJdTggYl9jdXJzaG9ydGdpXzIwbWh6ID0gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/CisJCQkJMSA6IDA7CisJZW51bSB3aXJlbGVzc19tb2RlIHdpcmVsZXNzbW9kZSA9IG1hYy0+bW9kZTsKKworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykKKwkJcmF0cl92YWx1ZSA9IHN0YS0+c3VwcF9yYXRlc1sxXSA8PCA0OworCWVsc2UKKwkJcmF0cl92YWx1ZSA9IHN0YS0+c3VwcF9yYXRlc1swXTsKKwlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCXJhdHJfdmFsdWUgPSAweGZmZjsKKwlyYXRyX3ZhbHVlIHw9IChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSA8PCAyMCB8CisJCQlzdGEtPmh0X2NhcC5tY3MucnhfbWFza1swXSA8PCAxMik7CisJc3dpdGNoICh3aXJlbGVzc21vZGUpIHsKKwljYXNlIFdJUkVMRVNTX01PREVfQjoKKwkJaWYgKHJhdHJfdmFsdWUgJiAweDAwMDAwMDBjKQorCQkJcmF0cl92YWx1ZSAmPSAweDAwMDAwMDBkOworCQllbHNlCisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDAwMGY7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9HOgorCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjU7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKKwljYXNlIFdJUkVMRVNTX01PREVfTl81RzoKKwkJYl9ubW9kZSA9IDE7CisJCWlmIChtaW1vX3BzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQykgeworCQkJcmF0cl92YWx1ZSAmPSAweDAwMDdGMDA1OworCQl9IGVsc2UgeworCQkJdTMyIHJhdHJfbWFzazsKKworCQkJaWYgKGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMVQyUiB8fAorCQkJICAgIGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMVQxUikKKwkJCQlyYXRyX21hc2sgPSAweDAwMGZmMDA1OworCQkJZWxzZQorCQkJCXJhdHJfbWFzayA9IDB4MGYwZmYwMDU7CisKKwkJCXJhdHJfdmFsdWUgJj0gcmF0cl9tYXNrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDBmZjBmZjsKKwkJZWxzZQorCQkJcmF0cl92YWx1ZSAmPSAweDBmMGZmMGZmOworCisJCWJyZWFrOworCX0KKworCWlmICggKHJ0bHBjaXByaXYtPmJ0Y29leGlzdC5idF9jb2V4aXN0ZW5jZSkgJiYKKwkgICAgIChydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfY29leGlzdF90eXBlID09IEJUX0NTUl9CQzQpICYmCisJICAgICAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X2N1cl9zdGF0ZSkgJiYKKwkgICAgIChydGxwY2lwcml2LT5idGNvZXhpc3QuYnRfYW50X2lzb2xhdGlvbikgJiYKKwkgICAgICgocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3NlcnZpY2UgPT0gQlRfU0NPKXx8CisJICAgICAocnRscGNpcHJpdi0+YnRjb2V4aXN0LmJ0X3NlcnZpY2UgPT0gQlRfQlVTWSkpICkKKwkJcmF0cl92YWx1ZSAmPSAweDBmZmZjZmMwOworCWVsc2UKKwkJcmF0cl92YWx1ZSAmPSAweDBGRkZGRkZGOworCisJaWYgKGJfbm1vZGUgJiYgKChiX2N1cnR4YndfNDBtaHogJiYKKwkJCSBiX2N1cnNob3J0Z2lfNDBtaHopIHx8ICghYl9jdXJ0eGJ3XzQwbWh6ICYmCisJCQkJCQkgYl9jdXJzaG9ydGdpXzIwbWh6KSkpIHsKKworCQlyYXRyX3ZhbHVlIHw9IDB4MTAwMDAwMDA7CisJCXRtcF9yYXRyX3ZhbHVlID0gKHJhdHJfdmFsdWUgPj4gMTIpOworCisJCWZvciAoc2hvcnRnaV9yYXRlID0gMTU7IHNob3J0Z2lfcmF0ZSA+IDA7IHNob3J0Z2lfcmF0ZS0tKSB7CisJCQlpZiAoKDEgPDwgc2hvcnRnaV9yYXRlKSAmIHRtcF9yYXRyX3ZhbHVlKQorCQkJCWJyZWFrOworCQl9CisKKwkJc2hvcnRnaV9yYXRlID0gKHNob3J0Z2lfcmF0ZSA8PCAxMikgfCAoc2hvcnRnaV9yYXRlIDw8IDgpIHwKKwkJICAgIChzaG9ydGdpX3JhdGUgPDwgNCkgfCAoc2hvcnRnaV9yYXRlKTsKKwl9CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FSRlIwICsgcmF0cl9pbmRleCAqIDQsIHJhdHJfdmFsdWUpOworCisJUlRfVFJBQ0UoQ09NUF9SQVRSLCBEQkdfRE1FU0csCisJCSAoIiV4XG4iLCBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfQVJGUjApKSk7Cit9CisKKworc3RhdGljIHU4IF9ydGw4ODIxYWVfbXJhdGVfaWR4X3RvX2FyZnJfaWQoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHJhdGVfaW5kZXgsCisJZW51bSB3aXJlbGVzc19tb2RlIHdpcmVsZXNzbW9kZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCByZXQgPSAwOworCXN3aXRjaChyYXRlX2luZGV4KXsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19OR0I6CisJCQlpZihydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikKKwkJCQlyZXQgPSAxOworCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCQk7YnJlYWs7CisJCWNhc2UgUkFUUl9JTlhfV0lSRUxFU1NfTjoKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19ORzoKKwkJCWlmKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKQorCQkJCXJldCA9IDU7CisJCQllbHNlCisJCQkJcmV0ID0gNDsKKwkJCTticmVhazsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19OQjoKKwkJCWlmKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKQorCQkJCXJldCA9IDM7CisJCQllbHNlCisJCQkJcmV0ID0gMjsKKwkJCTticmVhazsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19HQjoKKwkJCXJldCA9IDY7CisJCQlicmVhazsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19HOgorCQkJcmV0ID0gNzsKKwkJCWJyZWFrOworCQljYXNlIFJBVFJfSU5YX1dJUkVMRVNTX0I6CisJCQlyZXQgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgUkFUUl9JTlhfV0lSRUxFU1NfTUM6CisJCQlpZiAoKHdpcmVsZXNzbW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpCisJCQkJfHwgKHdpcmVsZXNzbW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpCisJCQkJfHwgKHdpcmVsZXNzbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKQorCQkJCXx8ICh3aXJlbGVzc21vZGUgPT0gV0lSRUxFU1NfTU9ERV9BQ18yNEcpKQorCQkJCXJldCA9IDY7CisJCQllbHNlCisJCQkJcmV0ID0gNzsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19BQ181TjoKKwkJCWlmKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKQorCQkJCXJldCA9IDEwOworCQkJZWxzZQorCQkJCXJldCA9IDk7CisJCQlicmVhazsKKwkJY2FzZSBSQVRSX0lOWF9XSVJFTEVTU19BQ18yNE46CisJCQlpZihydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzgwKQorCQkJeworCQkJCWlmKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKQorCQkJCQlyZXQgPSAxMDsKKwkJCQllbHNlCisJCQkJCXJldCA9IDk7CisJCQl9IGVsc2UgeworCQkJCWlmKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKQorCQkJCQlyZXQgPSAxMTsKKwkJCQllbHNlCisJCQkJCXJldCA9IDEyOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAwO2JyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfdXBkYXRlX2hhbF9yYXRlX21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHJzc2lfbGV2ZWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfc3RhX2luZm8gKiBzdGFfZW50cnkgPSBOVUxMOworCXUzMiByYXRyX2JpdG1hcDsKKwl1OCByYXRyX2luZGV4OworCXU4IGJfY3VydHhid180MG1oeiA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkKKwkJCQk/IDEgOiAwOworCXU4IGJfY3Vyc2hvcnRnaV80MG1oeiA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkgPworCQkJCTEgOiAwOworCXU4IGJfY3Vyc2hvcnRnaV8yMG1oeiA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkgPworCQkJCTEgOiAwOworCWVudW0gd2lyZWxlc3NfbW9kZSB3aXJlbGVzc21vZGUgPSAwOworCWJvb2wgYl9zaG9ydGdpID0gZmFsc2U7CisJdTggcmF0ZV9tYXNrWzddOworCXU4IG1hY2lkID0gMDsKKwl1OCBtaW1vX3BzID0gSUVFRTgwMjExX1NNUFNfT0ZGOworCisJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKikgc3RhLT5kcnZfcHJpdjsKKwl3aXJlbGVzc21vZGUgPSBzdGFfZW50cnktPndpcmVsZXNzX21vZGU7CisJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKKwkJYl9jdXJ0eGJ3XzQwbWh6ID0gbWFjLT5id180MDsKKwllbHNlIGlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQltYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJbWFjaWQgPSBzdGEtPmFpZCArIDE7CisKKwlyYXRyX2JpdG1hcCA9IHN0YS0+c3VwcF9yYXRlc1swXTsKKworCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmF0cl9iaXRtYXAgPSAweGZmZjsKKworCXJhdHJfYml0bWFwIHw9IChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSA8PCAyMCB8CisJCQlzdGEtPmh0X2NhcC5tY3MucnhfbWFza1swXSA8PCAxMik7CisvKm1hYyBpZCBvd25lciovCisJc3dpdGNoICh3aXJlbGVzc21vZGUpIHsKKwljYXNlIFdJUkVMRVNTX01PREVfQjoKKwkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0I7CisJCWlmIChyYXRyX2JpdG1hcCAmIDB4MDAwMDAwMGMpCisJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDAwMDBkOworCQllbHNlCisJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDAwMDBmOworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfRzoKKwkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOworCisJCWlmIChyc3NpX2xldmVsID09IDEpCisJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDAwZjAwOworCQllbHNlIGlmIChyc3NpX2xldmVsID09IDIpCisJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDAwZmYwOworCQllbHNlCisJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDAwZmY1OworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfQToKKwkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0c7CisJCXJhdHJfYml0bWFwICY9IDB4MDAwMDBmZjA7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKKwljYXNlIFdJUkVMRVNTX01PREVfTl81RzoKKwkJaWYgKHdpcmVsZXNzbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKQorCQkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HQjsKKwkJZWxzZQorCQkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HOworCisJCWlmIChtaW1vX3BzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQyAgfHwgbWltb19wcyA9PSBJRUVFODAyMTFfU01QU19EWU5BTUlDKSB7CisJCQlpZiAocnNzaV9sZXZlbCA9PSAxKQorCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwNzAwMDA7CisJCQllbHNlIGlmIChyc3NpX2xldmVsID09IDIpCisJCQkJcmF0cl9iaXRtYXAgJj0gMHgwMDA3ZjAwMDsKKwkJCWVsc2UKKwkJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDdmMDA1OworCQl9IGVsc2UgeworCQkJaWYgKCBydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikgeworCQkJCWlmIChiX2N1cnR4YndfNDBtaHopIHsKKwkJCQkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZjAwMDA7CisJCQkJCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gMikKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMTU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZjAwMDA7CisJCQkJCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gMikKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoYl9jdXJ0eGJ3XzQwbWh6KSB7CisJCQkJCWlmIChyc3NpX2xldmVsID09IDEpCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmYwMDAwOworCQkJCQllbHNlIGlmIChyc3NpX2xldmVsID09IDIpCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmZmMDAwOworCQkJCQllbHNlCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmZmMDE1OworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyc3NpX2xldmVsID09IDEpCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmYwMDAwOworCQkJCQllbHNlIGlmIChyc3NpX2xldmVsID09IDIpCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmZmMDAwOworCQkJCQllbHNlCisJCQkJCQlyYXRyX2JpdG1hcCAmPSAweDBmZmZmMDA1OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoKGJfY3VydHhid180MG1oeiAmJiBiX2N1cnNob3J0Z2lfNDBtaHopIHx8CisJCSAgICAoIWJfY3VydHhid180MG1oeiAmJiBiX2N1cnNob3J0Z2lfMjBtaHopKSB7CisKKwkJCWlmIChtYWNpZCA9PSAwKQorCQkJCWJfc2hvcnRnaSA9IHRydWU7CisJCQllbHNlIGlmIChtYWNpZCA9PSAxKQorCQkJCWJfc2hvcnRnaSA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXSVJFTEVTU19NT0RFX0FDXzI0RzoKKwkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0FDXzI0TjsKKwkJaWYocnNzaV9sZXZlbCA9PSAxKQorCQkJcmF0cl9iaXRtYXAgJj0gMHhmYzNmMDAwMDsKKwkJZWxzZSBpZihyc3NpX2xldmVsID09IDIpCisJCQlyYXRyX2JpdG1hcCAmPSAweGZmZmZmMDAwOworCQllbHNlCisJCQlyYXRyX2JpdG1hcCAmPSAweGZmZmZmZmZmOworCQlicmVhazsKKworCWNhc2UgV0lSRUxFU1NfTU9ERV9BQ181RzoKKwkJcmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0FDXzVOOworCisJCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikKKwkJeworCQkJaWYocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJeworCQkJCWlmKHJzc2lfbGV2ZWwgPT0gMSkJCQkJLyphZGQgYnkgR2FyeSBmb3IgYWMtc2VyaWVzKi8KKwkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwMDNmODAwMDsKKwkJCQllbHNlIGlmIChyc3NpX2xldmVsID09IDIpCisJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAzZmYwMDA7CisJCQkJZWxzZQorCQkJCQlyYXRyX2JpdG1hcCAmPSAweDAwM2ZmMDEwOworCQkJfQorCQkJZWxzZQorCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMTA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihyc3NpX2xldmVsID09IDEpCQkJCS8qIGFkZCBieSBHYXJ5IGZvciBhYy1zZXJpZXMqLworCQkJCXJhdHJfYml0bWFwICY9IDB4ZmUzZjgwMDA7ICAgICAgIC8qVkhUIDJTUyBNQ1MzfjkqLworCQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSAyKQorCQkJCXJhdHJfYml0bWFwICY9IDB4ZmZmZmYwMDA7ICAgICAgIC8qVkhUIDJTUyBNQ1MwfjkqLworCQkJZWxzZQorCQkJCXJhdHJfYml0bWFwICY9IDB4ZmZmZmYwMTA7ICAgICAgIC8qQWxsKi8KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJhdHJfaW5kZXggPSBSQVRSX0lOWF9XSVJFTEVTU19OR0I7CisKKwkJaWYgKHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCQkJcmF0cl9iaXRtYXAgJj0gMHgwMDBmZjBmZjsKKwkJZWxzZQorCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmZjBmZjsKKwkJYnJlYWs7CisKKwl9CisKKwlzdGFfZW50cnktPnJhdHJfaW5kZXggPSByYXRyX2luZGV4OworCisJUlRfVFJBQ0UoQ09NUF9SQVRSLCBEQkdfRE1FU0csCisJCSAoInJhdHJfYml0bWFwIDoleFxuIiwgcmF0cl9iaXRtYXApKTsKKwkqKHUzMiAqKSAmIHJhdGVfbWFzayA9IEVGNEJZVEUoKHJhdHJfYml0bWFwICYgMHgwZmZmZmZmZikgfAorCQkJCSAgICAgICAocmF0cl9pbmRleCA8PCAyOCkpOworCXJhdGVfbWFza1swXSA9IG1hY2lkOworCXJhdGVfbWFza1sxXSA9IF9ydGw4ODIxYWVfbXJhdGVfaWR4X3RvX2FyZnJfaWQoaHcsIHJhdHJfaW5kZXgsIHdpcmVsZXNzbW9kZSkgfCAoYl9zaG9ydGdpID8gMHg4MCA6IDB4MDApOworCXJhdGVfbWFza1syXSA9IGJfY3VydHhid180MG1oejsKKwkvKiBpZiAocHJveF9wcml2LT5wcm94aW1fbW9kZWluZm8tPnBvd2VyX291dHB1dCA+IDApCisJCXJhdGVfbWFza1syXSB8PSBCSVQoNik7ICovCisKKwlyYXRlX21hc2tbM10gPSAodTgpKHJhdHJfYml0bWFwICYgMHgwMDAwMDBmZik7CisJcmF0ZV9tYXNrWzRdID0gKHU4KSgocmF0cl9iaXRtYXAgJiAweDAwMDBmZjAwKSA+PjgpOworCXJhdGVfbWFza1s1XSA9ICh1OCkoKHJhdHJfYml0bWFwICYgMHgwMGZmMDAwMCkgPj4gMTYpOworCXJhdGVfbWFza1s2XSA9ICh1OCkoKHJhdHJfYml0bWFwICYgMHhmZjAwMDAwMCkgPj4gMjQpOworCisJUlRfVFJBQ0UoQ09NUF9SQVRSLCBEQkdfRE1FU0csICgiUmF0ZV9pbmRleDoleCwgIgorCQkJCQkJICJyYXRyX3ZhbDoleCwgJXg6JXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJCQkgcmF0cl9pbmRleCwgcmF0cl9iaXRtYXAsCisJCQkJCQkgcmF0ZV9tYXNrWzBdLCByYXRlX21hc2tbMV0sCisJCQkJCQkgcmF0ZV9tYXNrWzJdLCByYXRlX21hc2tbM10sCisJCQkJCQkgcmF0ZV9tYXNrWzRdLCByYXRlX21hc2tbNV0sCisJCQkJCQkgcmF0ZV9tYXNrWzZdKSk7CisJcnRsODgyMWFlX2ZpbGxfaDJjX2NtZChodywgSDJDXzg4MjFBRV9SQV9NQVNLLCA3LCByYXRlX21hc2spOworCV9ydGw4ODIxYWVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDMpLCAwKTsKK30KKwordm9pZCBydGw4ODIxYWVfdXBkYXRlX2hhbF9yYXRlX3RibChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggcnNzaV9sZXZlbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaWYgKHJ0bHByaXYtPmRtLmJfdXNlcmFtYXNrKQorCQlydGw4ODIxYWVfdXBkYXRlX2hhbF9yYXRlX21hc2soaHcsIHN0YSwgcnNzaV9sZXZlbCk7CisJZWxzZQorCQkvKlJUX1RSQUNFKENPTVBfUkFUUixEQkdfTE9VRCwoInJ0bDg4MjFhZV91cGRhdGVfaGFsX3JhdGVfdGJsKCk6IEVycm9yISA4ODIxYWUgRlcgUkEgT25seSIpKTsqLworCQlydGw4ODIxYWVfdXBkYXRlX2hhbF9yYXRlX3RhYmxlKGh3LCBzdGEpOworfQorCit2b2lkIHJ0bDg4MjFhZV91cGRhdGVfY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwl1MTYgc2lmc190aW1lcjsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfU0xPVF9USU1FLAorCQkJCSAgICAgICh1OCAqKSAmIG1hYy0+c2xvdF90aW1lKTsKKwlpZiAoIW1hYy0+aHRfZW5hYmxlKQorCQlzaWZzX3RpbWVyID0gMHgwYTBhOworCWVsc2UKKwkJc2lmc190aW1lciA9IDB4MGUwZTsKKwlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX1NJRlMsICh1OCAqKSAmIHNpZnNfdGltZXIpOworfQorCitib29sIHJ0bDg4MjFhZV9ncGlvX3JhZGlvX29uX29mZl9jaGVja2luZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKiB2YWxpZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwllbnVtIHJmX3B3cnN0YXRlIGVfcmZwb3dlcnN0YXRlX3Rvc2V0LCBjdXJfcmZzdGF0ZTsKKwl1OCB1MXRtcCA9IDA7CisJYm9vbCBiX2FjdHVhbGx5c2V0ID0gZmFsc2U7CisKKwlpZiAocnRscHJpdi0+cnRsaGFsLmJlaW5nX2luaXRfYWRhcHRlcikKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHBwc2MtPmJfc3dyZl9wcm9jZXNzaW5nKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCWlmIChwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzKSB7CisJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSB0cnVlOworCQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJfQorCisJY3VyX3Jmc3RhdGUgPSBwcHNjLT5yZnB3cl9zdGF0ZTsKKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19HUElPX0lPX1NFTF8yLAorCQkJCQlydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19HUElPX0lPX1NFTF8yKSAmIH4oQklUKDEpKSk7CisKKwl1MXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0dQSU9fUElOX0NUUkxfMik7CisKKwlpZiAocnRscGh5LT5wb2xhcml0eV9jdGwpIHsKKwkJZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPSAodTF0bXAgJiBCSVQoMSkpID8gRVJGT0ZGIDogRVJGT047CisJfSBlbHNlIHsKKwkJZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPSAodTF0bXAgJiBCSVQoMSkpID8gRVJGT04gOiBFUkZPRkY7CisJfQorCisJaWYgKChwcHNjLT5iX2h3cmFkaW9vZmYgPT0gdHJ1ZSkgJiYgKGVfcmZwb3dlcnN0YXRlX3Rvc2V0ID09IEVSRk9OKSkgeworCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfRE1FU0csCisJCQkgKCJHUElPQ2hhbmdlUkYgIC0gSFcgUmFkaW8gT04sIFJGIE9OXG4iKSk7CisKKwkJZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPSBFUkZPTjsKKwkJcHBzYy0+Yl9od3JhZGlvb2ZmID0gZmFsc2U7CisJCWJfYWN0dWFsbHlzZXQgPSB0cnVlOworCX0gZWxzZSBpZiAoKHBwc2MtPmJfaHdyYWRpb29mZiA9PSBmYWxzZSkKKwkJICAgJiYgKGVfcmZwb3dlcnN0YXRlX3Rvc2V0ID09IEVSRk9GRikpIHsKKwkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJICgiR1BJT0NoYW5nZVJGICAtIEhXIFJhZGlvIE9GRiwgUkYgT0ZGXG4iKSk7CisKKwkJZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPSBFUkZPRkY7CisJCXBwc2MtPmJfaHdyYWRpb29mZiA9IHRydWU7CisJCWJfYWN0dWFsbHlzZXQgPSB0cnVlOworCX0KKworCWlmIChiX2FjdHVhbGx5c2V0KSB7CisJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CisJCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCX0gZWxzZSB7CisJCWlmIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKQorCQkJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKworCQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOworCQlwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrKTsKKwl9CisKKwkqdmFsaWQgPSAxOworCXJldHVybiAhcHBzYy0+Yl9od3JhZGlvb2ZmOworCit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBrZXlfaW5kZXgsCisJCSAgICAgdTggKnBfbWFjYWRkciwgYm9vbCBpc19ncm91cCwgdTggZW5jX2FsZ28sCisJCSAgICAgYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggKm1hY2FkZHIgPSBwX21hY2FkZHI7CisJdTMyIGVudHJ5X2lkID0gMDsKKwlib29sIGlzX3BhaXJ3aXNlID0gZmFsc2U7CisKKwlzdGF0aWMgdTggY2FtX2NvbnN0X2FkZHJbNF1bNl0gPSB7CisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzfQorCX07CisJc3RhdGljIHU4IGNhbV9jb25zdF9icm9hZFtdID0geworCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCisJfTsKKworCWlmIChjbGVhcl9hbGwpIHsKKwkJdTggaWR4ID0gMDsKKwkJdTggY2FtX29mZnNldCA9IDA7CisJCXU4IGNsZWFyX251bWJlciA9IDU7CisKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJjbGVhcl9hbGxcbiIpKTsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNsZWFyX251bWJlcjsgaWR4KyspIHsKKwkJCXJ0bF9jYW1fbWFya19pbnZhbGlkKGh3LCBjYW1fb2Zmc2V0ICsgaWR4KTsKKwkJCXJ0bF9jYW1fZW1wdHlfZW50cnkoaHcsIGNhbV9vZmZzZXQgKyBpZHgpOworCisJCQlpZiAoaWR4IDwgNSkgeworCQkJCW1lbXNldChydGxwcml2LT5zZWMua2V5X2J1ZltpZHhdLCAwLAorCQkJCSAgICAgICBNQVhfS0VZX0xFTik7CisJCQkJcnRscHJpdi0+c2VjLmtleV9sZW5baWR4XSA9IDA7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCXN3aXRjaCAoZW5jX2FsZ28pIHsKKwkJY2FzZSBXRVA0MF9FTkNSWVBUSU9OOgorCQkJZW5jX2FsZ28gPSBDQU1fV0VQNDA7CisJCQlicmVhazsKKwkJY2FzZSBXRVAxMDRfRU5DUllQVElPTjoKKwkJCWVuY19hbGdvID0gQ0FNX1dFUDEwNDsKKwkJCWJyZWFrOworCQljYXNlIFRLSVBfRU5DUllQVElPTjoKKwkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CisJCQlicmVhazsKKwkJY2FzZSBBRVNDQ01QX0VOQ1JZUFRJT046CisJCQllbmNfYWxnbyA9IENBTV9BRVM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgic3dpdGNoIGNhc2UgIgorCQkJCQkJCQkibm90IHByb2Nlc3MgXG4iKSk7CisJCQllbmNfYWxnbyA9IENBTV9US0lQOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaXNfd2Vwa2V5IHx8IHJ0bHByaXYtPnNlYy51c2VfZGVmYXVsdGtleSkgeworCQkJbWFjYWRkciA9IGNhbV9jb25zdF9hZGRyW2tleV9pbmRleF07CisJCQllbnRyeV9pZCA9IGtleV9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19ncm91cCkgeworCQkJCW1hY2FkZHIgPSBjYW1fY29uc3RfYnJvYWQ7CisJCQkJZW50cnlfaWQgPSBrZXlfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgeworCQkJCQllbnRyeV9pZCA9IHJ0bF9jYW1fZ2V0X2ZyZWVfZW50cnkoaHcsIHBfbWFjYWRkcik7CisJCQkJCWlmIChlbnRyeV9pZCA+PSAgVE9UQUxfQ0FNX0VOVFJZKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0VNRVJHLAorCQkJCQkJCQkoIkNhbiBub3QgZmluZCBmcmVlIGh3IHNlY3VyaXR5IGNhbSBlbnRyeVxuIikpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZW50cnlfaWQgPSBDQU1fUEFJUldJU0VfS0VZX1BPU0lUSU9OOworCQkJCX0KKworCQkJCWtleV9pbmRleCA9IFBBSVJXSVNFX0tFWUlEWDsKKwkJCQlpc19wYWlyd2lzZSA9IHRydWU7CisJCQl9CisJCX0KKworCQlpZiAocnRscHJpdi0+c2VjLmtleV9sZW5ba2V5X2luZGV4XSA9PSAwKSB7CisJCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAorCQkJCSAoImRlbGV0ZSBvbmUgZW50cnksIGVudHJ5X2lkIGlzICVkXG4iLGVudHJ5X2lkKSk7CisJCQlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQkJcnRsX2NhbV9kZWxfZW50cnkoaHcsIHBfbWFjYWRkcik7CisJCQlydGxfY2FtX2RlbGV0ZV9vbmVfZW50cnkoaHcsIHBfbWFjYWRkciwgZW50cnlfaWQpOworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhZGQgb25lIGVudHJ5XG4iKSk7CisJCQlpZiAoaXNfcGFpcndpc2UpIHsKKwkJCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLCAoInNldCBQYWlyd2lhc2Uga2V5XG4iKSk7CisKKwkJCQlydGxfY2FtX2FkZF9vbmVfZW50cnkoaHcsIG1hY2FkZHIsIGtleV9pbmRleCwKKwkJCQkJCSAgICAgIGVudHJ5X2lkLCBlbmNfYWxnbywKKwkJCQkJCSAgICAgIENBTV9DT05GSUdfTk9fVVNFREssCisJCQkJCQkgICAgICBydGxwcml2LT5zZWMua2V5X2J1ZltrZXlfaW5kZXhdKTsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJzZXQgZ3JvdXAga2V5XG4iKSk7CisKKwkJCQlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJCQkJcnRsX2NhbV9hZGRfb25lX2VudHJ5KGh3LAorCQkJCQkJCXJ0bGVmdXNlLT5kZXZfYWRkciwKKwkJCQkJCQlQQUlSV0lTRV9LRVlJRFgsCisJCQkJCQkJQ0FNX1BBSVJXSVNFX0tFWV9QT1NJVElPTiwKKwkJCQkJCQllbmNfYWxnbywKKwkJCQkJCQlDQU1fQ09ORklHX05PX1VTRURLLAorCQkJCQkJCXJ0bHByaXYtPnNlYy5rZXlfYnVmCisJCQkJCQkJW2VudHJ5X2lkXSk7CisJCQkJfQorCisJCQkJcnRsX2NhbV9hZGRfb25lX2VudHJ5KGh3LCBtYWNhZGRyLCBrZXlfaW5kZXgsCisJCQkJCQllbnRyeV9pZCwgZW5jX2FsZ28sCisJCQkJCQlDQU1fQ09ORklHX05PX1VTRURLLAorCQkJCQkJcnRscHJpdi0+c2VjLmtleV9idWZbZW50cnlfaWRdKTsKKwkJCX0KKworCQl9CisJfQorfQorCisKK3ZvaWQgcnRsODgxMmFlX3JlYWRfYnRfY29leGlzdF9pbmZvX2Zyb21faHdwZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgYm9vbCBhdXRvX2xvYWRfZmFpbCwgdTggKmh3aW5mbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdmFsdWU7CisKKwlpZiAoIWF1dG9fbG9hZF9mYWlsKSB7CisJCXZhbHVlID0gKih1OCAqKSAmIGh3aW5mb1tFRVBST01fUkZfQk9BUkRfT1BUSU9OXTsKKwkJaWYgKCgodmFsdWUgJiAweGUwKSA+PiA1KSA9PSAweDEpCisJCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX2luZm8uYnRjb2V4aXN0ID0gMTsKKwkJZWxzZQorCQkJcnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19pbmZvLmJ0Y29leGlzdCA9IDA7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5idF90eXBlID0gQlRfUlRMODgxMkE7CisKKwkJdmFsdWUgPSBod2luZm9bRUVQUk9NX1JGX0JUX1NFVFRJTkddOworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX2luZm8uYW50X251bSA9ICh2YWx1ZSAmIDB4MSk7CisJfSBlbHNlIHsKKwkJcnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19pbmZvLmJ0Y29leGlzdCA9IDA7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5idF90eXBlID0gQlRfUlRMODgxMkE7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5hbnRfbnVtID0gQU5UX1gyOworCX0KKwkvKm1vdmUgQlRfSW5pdEhhbFZhcnMoKSB0byBpbml0X3N3X3ZhcnMqLworfQorCit2b2lkIHJ0bDg4MjFhZV9yZWFkX2J0X2NvZXhpc3RfaW5mb19mcm9tX2h3cGcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgIGJvb2wgYXV0b19sb2FkX2ZhaWwsIHU4ICpod2luZm8pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHZhbHVlOworCXUzMiB0bXB1XzMyOworCisJaWYgKCFhdXRvX2xvYWRfZmFpbCkgeworCQl0bXB1XzMyID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX01VTFRJX0ZVTkNfQ1RSTCk7CisJCWlmKHRtcHVfMzIgJiBCSVQoMTgpKQorCQkJcnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19pbmZvLmJ0Y29leGlzdCA9IDE7CisJCWVsc2UKKwkJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5idGNvZXhpc3QgPSAwOworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX2luZm8uYnRfdHlwZSA9IEJUX1JUTDg4MjFBOworCisJCXZhbHVlID0gaHdpbmZvW0VFUFJPTV9SRl9CVF9TRVRUSU5HXTsKKwkJcnRscHJpdi0+YnRjb2V4aXN0LmJ0Y19pbmZvLmFudF9udW0gPSAodmFsdWUgJiAweDEpOworCX0gZWxzZSB7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfaW5mby5idGNvZXhpc3QgPSAwOworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX2luZm8uYnRfdHlwZSA9IEJUX1JUTDg4MjFBOworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX2luZm8uYW50X251bSA9IEFOVF9YMjsKKwl9CisJLyptb3ZlIEJUX0luaXRIYWxWYXJzKCkgdG8gaW5pdF9zd192YXJzKi8KK30KKwordm9pZCBydGw4ODIxYWVfYnRfcmVnX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyogaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcnRscGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKworCS8qIDA6TG93LCAxOkhpZ2gsIDI6RnJvbSBFZnVzZS4gKi8KKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9yZWdfYnRfaXNvID0gMjsKKwkvKiAwOklkbGUsIDE6Tm9uZS1TQ08sIDI6U0NPLCAzOkZyb20gQ291bnRlci4gKi8KKwlydGxwY2lwcml2LT5idGNvZXhpc3QuYl9yZWdfYnRfc2NvPSAzOworCS8qIDA6RGlzYWJsZSBCVCBjb250cm9sIEEtTVBEVSwgMTpFbmFibGUgQlQgY29udHJvbCBBLU1QRFUuICovCisJcnRscGNpcHJpdi0+YnRjb2V4aXN0LmJfcmVnX2J0X3Njbz0gMDsKK30KKworCit2b2lkIHJ0bDg4MjFhZV9idF9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcqIGh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChydGxwcml2LT5jZmctPm9wcy0+Z2V0X2J0Y19zdGF0dXMoKSl7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfb3BzLT5idGNfaW5pdF9od19jb25maWcocnRscHJpdik7CisJfQorfQorCit2b2lkIHJ0bDg4MjFhZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworfQorCit2b2lkIHJ0bDg4MjFhZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7Cit9CisKKy8qIFR1cm4gb24gQUFQIChSQ1I6Yml0IDApIGZvciBwcm9taWN1b3VzIG1vZGUuICovCit2b2lkIHJ0bDg4MjFhZV9hbGxvd19hbGxfZGVzdGFkZHIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJYm9vbCBhbGxvd19hbGxfZGEsIGJvb2wgd3JpdGVfaW50b19yZWcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisKKwlpZiAoYWxsb3dfYWxsX2RhKSAvKiBTZXQgQklUMCAqLworCQlydGxwY2ktPnJlY2VpdmVfY29uZmlnIHw9IFJDUl9BQVA7CisJZWxzZSAvKiBDbGVhciBCSVQwICovCisJCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgJj0gflJDUl9BQVA7CisKKwlpZih3cml0ZV9pbnRvX3JlZykKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IsIHJ0bHBjaS0+cmVjZWl2ZV9jb25maWcpOworCisKKwlSVF9UUkFDRShDT01QX1RVUkJPIHwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJKCJyZWNlaXZlX2NvbmZpZz0weCUwOFgsIHdyaXRlX2ludG9fcmVnPSVkXG4iLAorCQlydGxwY2ktPnJlY2VpdmVfY29uZmlnLCB3cml0ZV9pbnRvX3JlZyApKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiNmJmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmgKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVEw4ODIxQUVfSFdfSF9fCisjZGVmaW5lIF9fUlRMODgyMUFFX0hXX0hfXworCit2b2lkIHJ0bDg4MjFhZV9nZXRfaHdfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YXJpYWJsZSwgdTggKnZhbCk7Cit2b2lkIHJ0bDg4MjFhZV9yZWFkX2VlcHJvbV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwordm9pZCBydGw4ODIxYWVfaW50ZXJydXB0X3JlY29nbml6ZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCSB1MzIgKnBfaW50YSwgdTMyICpwX2ludGIpOworaW50IHJ0bDg4MjFhZV9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgyMWFlX2NhcmRfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgyMWFlX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2ludCBydGw4ODIxYWVfc2V0X25ldHdvcmtfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKK3ZvaWQgcnRsODgyMWFlX3NldF9jaGVja19ic3NpZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBjaGVja19ic3NpZCk7Cit2b2lkIHJ0bDg4MjFhZV9zZXRfcW9zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgYWNpKTsKK3ZvaWQgcnRsODgyMWFlX3NldF9iZWFjb25fcmVsYXRlZF9yZWdpc3RlcnMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfc2V0X2JlYWNvbl9pbnRlcnZhbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV91cGRhdGVfaW50ZXJydXB0X21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQl1MzIgYWRkX21zciwgdTMyIHJtX21zcik7Cit2b2lkIHJ0bDg4MjFhZV9zZXRfaHdfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YXJpYWJsZSwgdTggKnZhbCk7Cit2b2lkIHJ0bDg4MjFhZV91cGRhdGVfaGFsX3JhdGVfdGJsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQkJCQkJCQl1OCByc3NpX2xldmVsKTsKK3ZvaWQgcnRsODgyMWFlX3VwZGF0ZV9jaGFubmVsX2FjY2Vzc19zZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2Jvb2wgcnRsODgyMWFlX2dwaW9fcmFkaW9fb25fb2ZmX2NoZWNraW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqdmFsaWQpOwordm9pZCBydGw4ODIxYWVfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIga2V5X2luZGV4LAorCQkgICAgIAkJCQl1OCAqcF9tYWNhZGRyLCBib29sIGlzX2dyb3VwLCB1OCBlbmNfYWxnbywKKwkJICAgICAJCQkJYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKTsKKwordm9pZCBydGw4ODIxYWVfcmVhZF9idF9jb2V4aXN0X2luZm9fZnJvbV9od3BnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCQkJCQkJYm9vbCBhdXRvbG9hZF9mYWlsLAorCQkJCQkJCQkJCQkJCQkJdTgqIGh3aW5mbyk7Cit2b2lkIHJ0bDg4MTJhZV9yZWFkX2J0X2NvZXhpc3RfaW5mb19mcm9tX2h3cGcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkJCQlib29sIGF1dG9sb2FkX2ZhaWwsCisJCQkJCQkJCQkJCQkJCQl1OCogaHdpbmZvKTsKK3ZvaWQgcnRsODgyMWFlX2J0X3JlZ19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcqIGh3KTsKK3ZvaWQgcnRsODgyMWFlX2J0X2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyogaHcpOwordm9pZCBydGw4ODIxYWVfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCSAgYm9vbCBhbGxvd19hbGxfZGEsCisJCQkJCQkJCQkJICBib29sIHdyaXRlX2ludG9fcmVnKTsKK3ZvaWQgX3J0bDg4MjFhZV9zdG9wX3R4X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIF9ydGw4ODIxYWVfcmVzdW1lX3R4X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwYTRmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2xlZC5jCkBAIC0wLDAgKzEsMjM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJyZWcuaCIKKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9pbml0X2xlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIAkJCQkJIHN0cnVjdCBydGxfbGVkICpwbGVkLAorCQkJICAgICAgCQkJCQkgZW51bSBydGxfbGVkX3BpbiBsZWRwaW4pCit7CisJcGxlZC0+aHcgPSBodzsKKwlwbGVkLT5sZWRwaW4gPSBsZWRwaW47CisJcGxlZC0+Yl9sZWRvbiA9IGZhbHNlOworfQorCit2b2lkIHJ0bDg4MjFhZV9zd19sZWRfb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKQoreworCXU4IGxlZGNmZzsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlSVF9UUkFDRShDT01QX0xFRCwgREJHX0xPVUQsCisJCSAoIkxlZEFkZHI6JVggbGVkcGluPSVkXG4iLCBSRUdfTEVEQ0ZHMiwgcGxlZC0+bGVkcGluKSk7CisKKwlzd2l0Y2ggKHBsZWQtPmxlZHBpbikgeworCWNhc2UgTEVEX1BJTl9HUElPMDoKKwkJYnJlYWs7CisJY2FzZSBMRURfUElOX0xFRDA6CisJCWxlZGNmZyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzIpOworCQlsZWRjZmcgJj0gfkJJVCg2KTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwKKwkJCSAgICAgICBSRUdfTEVEQ0ZHMiwgKGxlZGNmZyAmIDB4ZjApIHwgQklUKDUpKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfUElOX0xFRDE6CisJCWxlZGNmZyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzEpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMSwgbGVkY2ZnICYgMHgxMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyBcbiIpKTsKKwkJYnJlYWs7CisJfQorCXBsZWQtPmJfbGVkb24gPSB0cnVlOworfQorCit2b2lkIHJ0bDg4MTJhZV9zd19sZWRfb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKQoreworCXUxNiAJbGVkcmVnID0gUkVHX0xFRENGRzE7CisJdTggCWxlZGNmZyA9IDA7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJc3dpdGNoIChwbGVkLT5sZWRwaW4pIHsKKwkJY2FzZSBMRURfUElOX0xFRDA6CisJCQlsZWRyZWcgPSBSRUdfTEVEQ0ZHMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTEVEX1BJTl9MRUQxOgorCQkJbGVkcmVnID0gUkVHX0xFRENGRzI7CisJCQlicmVhazsKKworCQljYXNlIExFRF9QSU5fR1BJTzA6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlSVF9UUkFDRShDT01QX0xFRCwgREJHX0xPVUQsICgiSW4gU3dMZWRPbiwgTGVkQWRkcjolWCBMRURQSU49JWQgXG4iLCBsZWRyZWcsIHBsZWQtPmxlZHBpbikpOworCisJbGVkY2ZnID0gIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgbGVkcmVnKTsKKwlsZWRjZmcgfD0gQklUKDUpOyAvKlNldCAweDRjWzIxXSovCisJbGVkY2ZnICY9IH4oQklUKDcpIHwgQklUKDYpIHwgQklUKDMpIHxCSVQoMikgfCBCSVQoMSkgfEJJVCgwKSk7CisJCS8qQ2xlYXIgMHg0Y1syMzoyMl0gYW5kIDB4NGNbMTk6MTZdKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBsZWRyZWcsIGxlZGNmZyk7IC8qU1cgY29udHJvbCBsZWQwIG9uLiovCisJcGxlZC0+Yl9sZWRvbiA9IHRydWU7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3N3X2xlZF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCXU4IGxlZGNmZzsKKworCVJUX1RSQUNFKENPTVBfTEVELCBEQkdfTE9VRCwKKwkJICgiTGVkQWRkcjolWCBsZWRwaW49JWRcbiIsIFJFR19MRURDRkcyLCBwbGVkLT5sZWRwaW4pKTsKKworCWxlZGNmZyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzIpOworCisJc3dpdGNoIChwbGVkLT5sZWRwaW4pIHsKKwljYXNlIExFRF9QSU5fR1BJTzA6CisJCWJyZWFrOworCWNhc2UgTEVEX1BJTl9MRUQwOgorCQlsZWRjZmcgJj0gMHhmMDsKKwkJaWYgKHBjaXByaXYtPmxlZGN0bC5ibGVkX29wZW5kcmFpbiA9PSB0cnVlKSB7CisJCQlsZWRjZmcgJj0gMHg5MDsgLyogU2V0IHRvIHNvZnR3YXJlIGNvbnRyb2wuICovCisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMiwgKGxlZGNmZ3xCSVQoMykpKTsKKwkJCWxlZGNmZyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQ19QSU5NVVhfQ0ZHKTsKKwkJCWxlZGNmZyAmPSAweEZFOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BQ19QSU5NVVhfQ0ZHLCBsZWRjZmcpOworCQl9CisJCWVsc2UgeworCQkJbGVkY2ZnICY9IH5CSVQoNik7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMiwKKwkJCQkJKGxlZGNmZyB8IEJJVCgzKSB8IEJJVCg1KSkpOworCQl9CisJCWJyZWFrOworCWNhc2UgTEVEX1BJTl9MRUQxOgorCQlsZWRjZmcgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19MRURDRkcxKTsKKwkJbGVkY2ZnICY9IDB4MTA7IC8qIFNldCB0byBzb2Z0d2FyZSBjb250cm9sLiAqLworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMSwgbGVkY2ZnfEJJVCgzKSk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVhazsKKwl9CisJcGxlZC0+Yl9sZWRvbiA9IGZhbHNlOworfQorCit2b2lkIHJ0bDg4MTJhZV9zd19sZWRfb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX2xlZCAqcGxlZCl7CisJdTE2IGxlZHJlZyA9IFJFR19MRURDRkcxOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCisJc3dpdGNoKHBsZWQtPmxlZHBpbikKKwl7CisJCWNhc2UgTEVEX1BJTl9MRUQwOgorCQkJbGVkcmVnID0gUkVHX0xFRENGRzE7CisJCQlicmVhazsKKworCQljYXNlIExFRF9QSU5fTEVEMToKKwkJCWxlZHJlZyA9IFJFR19MRURDRkcyOworCQkJYnJlYWs7CisKKwkJY2FzZSBMRURfUElOX0dQSU8wOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9MRUQsREJHX0xPVUQsKCJJbiBTd0xlZE9mZixMZWRBZGRyOiVYIExFRFBJTj0lZFxuIiwgbGVkcmVnLCBwbGVkLT5sZWRwaW4pKTsKKworCWlmKHBjaXByaXYtPmxlZGN0bC5ibGVkX29wZW5kcmFpbiA9PSB0cnVlKSAvKk9wZW4tZHJhaW4gYXJyYW5nZW1lbnQgZm9yIGNvbnRyb2xsaW5nIHRoZSBMRUQqLworCXsKKwkJdTggbGVkY2ZnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAgbGVkcmVnKTsKKworCQlsZWRyZWcgJj0gMHhkMDsgLyogU2V0IHRvIHNvZnR3YXJlIGNvbnRyb2wuKi8KKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgbGVkcmVnLCAobGVkY2ZnIHwgQklUKDMpKSk7CisKKwkJLypPcGVuLWRyYWluIGFycmFuZ2VtZW50Ki8KKwkJbGVkY2ZnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUFDX1BJTk1VWF9DRkcpOworCQlsZWRjZmcgJj0gMHhGRTsvKlNldCBHUElPWzhdIHRvIGlucHV0IG1vZGUqLworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDX1BJTk1VWF9DRkcsIGxlZGNmZyk7CisJfQorCWVsc2UKKwl7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGxlZHJlZywgMHgyOCk7CisJfQorCisJcGxlZC0+Yl9sZWRvbiA9IGZhbHNlOworfQorCit2b2lkIHJ0bDg4MjFhZV9pbml0X3N3X2xlZHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlfcnRsODgyMWFlX2luaXRfbGVkKGh3LCAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQwKSwgTEVEX1BJTl9MRUQwKTsKKwlfcnRsODgyMWFlX2luaXRfbGVkKGh3LCAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQxKSwgTEVEX1BJTl9MRUQxKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9zd19sZWRfY29udHJvbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uKQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9sZWQgKnBMZWQwID0gJihwY2lwcml2LT5sZWRjdGwuc3dfbGVkMCk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzd2l0Y2ggKGxlZGFjdGlvbikgeworCWNhc2UgTEVEX0NUTF9QT1dFUl9PTjoKKwljYXNlIExFRF9DVExfTElOSzoKKwljYXNlIExFRF9DVExfTk9fTElOSzoKKwkJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJCXJ0bDg4MTJhZV9zd19sZWRfb24oaHcsIHBMZWQwKTsKKwkJZWxzZQorCQkJcnRsODgyMWFlX3N3X2xlZF9vbihodywgcExlZDApOworCQlicmVhazsKKwljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgorCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKVwKKwkJCXJ0bDg4MTJhZV9zd19sZWRfb2ZmKGh3LCBwTGVkMCk7CisJCWVsc2UKKwkJCXJ0bDg4MjFhZV9zd19sZWRfb2ZmKGh3LCBwTGVkMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfbGVkX2NvbnRyb2woc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQllbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJaWYgKChwcHNjLT5yZm9mZl9yZWFzb24gPiBSRl9DSEFOR0VfQllfUFMpICYmCisJICAgIChsZWRhY3Rpb24gPT0gTEVEX0NUTF9UWCB8fAorCSAgICAgbGVkYWN0aW9uID09IExFRF9DVExfUlggfHwKKwkgICAgIGxlZGFjdGlvbiA9PSBMRURfQ1RMX1NJVEVfU1VSVkVZIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9OT19MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9TVEFSVF9UT19MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9QT1dFUl9PTikpIHsKKwkJcmV0dXJuOworCX0KKwlSVF9UUkFDRShDT01QX0xFRCwgREJHX0xPVUQsICgibGVkYWN0aW9uICVkLCBcbiIsCisJCQkJbGVkYWN0aW9uKSk7CisJX3J0bDg4MjFhZV9zd19sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2xlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvbGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZTQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2xlZC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMODgyMUFFX0xFRF9IX18KKyNkZWZpbmUgX19SVEw4ODIxQUVfTEVEX0hfXworCit2b2lkIHJ0bDg4MjFhZV9pbml0X3N3X2xlZHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw4ODIxYWVfc3dfbGVkX29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX2xlZCAqcGxlZCk7Cit2b2lkIHJ0bDg4MTJhZV9zd19sZWRfb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKTsKK3ZvaWQgcnRsODgyMWFlX3N3X2xlZF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKTsKK3ZvaWQgcnRsODgxMmFlX3N3X2xlZF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKTsKK3ZvaWQgcnRsODgyMWFlX2xlZF9jb250cm9sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyZmNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jCkBAIC0wLDAgKzEsNTUyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAiLi4vcGNpLmgiCisjaW5jbHVkZSAiLi4vcHMuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJyZi5oIgorI2luY2x1ZGUgImRtLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJ0cnguaCIKKyNpbmNsdWRlICIuLi9idGNvZXhpc3QvaGFsYnRfcHJlY29tcC5oIgorI2luY2x1ZGUgImh3LmgiCisKKyNkZWZpbmUgUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKSBkbyB7IGkgKz0gMjsgdjEgPSBhcnJheV90YWJsZVtpXTsgdjIgPSBhcnJheV90YWJsZVtpKzFdOyB9IHdoaWxlKDApCisKK3N0YXRpYyB1MzIgX3J0bDg4MjFhZV9waHlfcmZfc2VyaWFsX3JlYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgZW51bSByYWRpb19wYXRoIHJmcGF0aCwgdTMyIG9mZnNldCk7CitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3BoeV9yZl9zZXJpYWxfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCWVudW0gcmFkaW9fcGF0aCByZnBhdGgsIHUzMiBvZmZzZXQsCisJCQkJCXUzMiBkYXRhKTsKK3N0YXRpYyB1MzIgX3J0bDg4MjFhZV9waHlfY2FsY3VsYXRlX2JpdF9zaGlmdCh1MzIgYml0bWFzayk7CitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX3BoeV9iYjg4MjFhX2NvbmZpZ19wYXJhZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CitzdGF0aWMgYm9vbCBfcnRsODgxMmFlX3BoeV9jb25maWdfbWFjX3dpdGhfaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX3BoeV9jb25maWdfbWFjX3dpdGhfaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX3BoeV9jb25maWdfYmJfd2l0aF9oZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTggY29uZmlndHlwZSk7CitzdGF0aWMgYm9vbCBfcnRsODgxMmFlX3BoeV9jb25maWdfYmJfd2l0aF9oZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTggY29uZmlndHlwZSk7CitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX3BoeV9jb25maWdfYmJfd2l0aF9wZ2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgIHU4IGNvbmZpZ3R5cGUpOworc3RhdGljIGJvb2wgX3J0bDg4MTJhZV9waHlfY29uZmlnX2JiX3dpdGhfcGdoZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJdTggY29uZmlndHlwZSk7CitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3BoeV9pbml0X2JiX3JmX3JlZ2lzdGVyX2RlZmluaXRpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCitzdGF0aWMgbG9uZyBfcnRsODgyMWFlX3BoeV90eHB3cl9pZHhfdG9fZGJtKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgZW51bSB3aXJlbGVzc19tb2RlIHdpcmVsZXNzbW9kZSwKKwkJCQkJIHU4IHR4cHdyaWR4KTsKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3JmX29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X2lvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwordm9pZCBydGw4ODEyYWVfZml4c3B1cigKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwllbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZF93aWR0aCwKKwl1OCBjaGFubmVsCispCit7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKworCS8qQyBjdXQgSXRlbTEyIEFEQyBGSUZPIENMT0NLKi8KKwlpZihJU19WRU5ET1JfODgxMkFfQ19DVVQocnRsaGFsLT52ZXJzaW9uKSkKKwl7CisJCWlmKGJhbmRfd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCAmJiBjaGFubmVsID09IDExKQorCQkJcnRsX3NldF9iYnJlZyhodywgUlJGTU9ELCAweEMwMCwgMHgzKQk7CisJCQkvKiAweDhBQ1sxMToxMF0gPSAyJ2IxMSovCisJCWVsc2UKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHhDMDAsIDB4Mik7CisJCQkvKiAweDhBQ1sxMToxMF0gPSAyJ2IxMCovCisKKworCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdWxkIHRvIHJlc29sdmUKKwkJMjQ4ME1oeiBzcHVyIGJ5IHNldHRpbmcgQURDIGNsb2NrIGFzIDE2ME0uIChBc2tlZCBieSBCaW5zb24pKi8KKwkJaWYgKGJhbmRfd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCAmJgorCQkJKGNoYW5uZWwgPT0gMTMgfHwgY2hhbm5lbCA9PSAxNCkpIHsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgzMDAsIDB4Myk7CisJCQkvKjB4OEFDWzk6OF0gPSAyJ2IxMSovCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQURDX0JVRl9DTEssIEJJVCgzMCksIDEpOworCQkJLyogMHg4QzRbMzBdID0gMSovCisJCX0gZWxzZSBpZiAoYmFuZF93aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwICYmCisJCQljaGFubmVsID09IDExKSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSQURDX0JVRl9DTEssIEJJVCgzMCksIDEpOworCQkJLyoweDhDNFszMF0gPSAxKi8KKwkJfSBlbHNlIGlmIChiYW5kX3dpZHRoICE9IEhUX0NIQU5ORUxfV0lEVEhfODApIHsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgzMDAsIDB4Mik7CisJCQkvKjB4OEFDWzk6OF0gPSAyJ2IxMCovCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQURDX0JVRl9DTEssIEJJVCgzMCksIDApOworCQkJLyoweDhDNFszMF0gPSAwKi8KKwkJfQorCX0KKwllbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJeworCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdWxkIHRvIHJlc29sdmUKKwkJMjQ4ME1oeiBzcHVyIGJ5IHNldHRpbmcgQURDIGNsb2NrIGFzIDE2ME0uIChBc2tlZCBieSBCaW5zb24pKi8KKwkJaWYgKGJhbmRfd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCAmJgorCQkJKGNoYW5uZWwgPT0gMTMgfHwgY2hhbm5lbCA9PSAxNCkpCisJCQlydGxfc2V0X2JicmVnKGh3LCBSUkZNT0QsIDB4MzAwLCAweDMpOworCQkJLyoweDhBQ1s5OjhdID0gMTEqLworCQllbHNlIGlmIChjaGFubmVsICA8PSAxNCkgLyoyLjRHIG9ubHkqLworCQkJcnRsX3NldF9iYnJlZyhodywgUlJGTU9ELCAweDMwMCwgMHgyKTsKKwkJCS8qMHg4QUNbOTo4XSA9IDEwKi8KKwl9CisKK30KKwordTMyIHJ0bDg4MjFhZV9waHlfcXVlcnlfYmJfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiByZXR1cm52YWx1ZSwgb3JpZ2luYWx2YWx1ZSwgYml0c2hpZnQ7CisKKwlSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCAiCisJCQkJCSAgICAgICAiYml0bWFzayglI3gpXG4iLCByZWdhZGRyLAorCQkJCQkgICAgICAgYml0bWFzaykpOworCW9yaWdpbmFsdmFsdWUgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCByZWdhZGRyKTsKKwliaXRzaGlmdCA9IF9ydGw4ODIxYWVfcGh5X2NhbGN1bGF0ZV9iaXRfc2hpZnQoYml0bWFzayk7CisJcmV0dXJudmFsdWUgPSAob3JpZ2luYWx2YWx1ZSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OworCisJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX1RSQUNFLCAoIkJCUiBNQVNLPTB4JXggIgorCQkJCQkgICAgICAgIkFkZHJbMHgleF09MHgleFxuIiwgYml0bWFzaywKKwkJCQkJICAgICAgIHJlZ2FkZHIsIG9yaWdpbmFsdmFsdWUpKTsKKworCXJldHVybiByZXR1cm52YWx1ZTsKKworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X2JiX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBvcmlnaW5hbHZhbHVlLCBiaXRzaGlmdDsKKworCVJUX1RSQUNFKENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksIGJpdG1hc2soJSN4KSwiCisJCQkJCSAgICAgICAiIGRhdGEoJSN4KVxuIiwgcmVnYWRkciwgYml0bWFzaywKKwkJCQkJICAgICAgIGRhdGEpKTsKKworCWlmIChiaXRtYXNrICE9IE1BU0tEV09SRCkgeworCQlvcmlnaW5hbHZhbHVlID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgcmVnYWRkcik7CisJCWJpdHNoaWZ0ID0gX3J0bDg4MjFhZV9waHlfY2FsY3VsYXRlX2JpdF9zaGlmdChiaXRtYXNrKTsKKwkJZGF0YSA9ICgob3JpZ2luYWx2YWx1ZSAmICh+Yml0bWFzaykpIHwgKChkYXRhIDw8IGJpdHNoaWZ0KSAmIGJpdG1hc2spKTsKKwl9CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcmVnYWRkciwgZGF0YSk7CisKKwlSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCBiaXRtYXNrKCUjeCksIgorCQkJCQkgICAgICAgIiBkYXRhKCUjeClcbiIsIHJlZ2FkZHIsIGJpdG1hc2ssCisJCQkJCSAgICAgICBkYXRhKSk7CisKK30KKwordTMyIHJ0bDg4MjFhZV9waHlfcXVlcnlfcmZfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIGVudW0gcmFkaW9fcGF0aCByZnBhdGgsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIG9yaWdpbmFsX3ZhbHVlLCByZWFkYmFja192YWx1ZSwgYml0c2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVJUX1RSQUNFKENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksICIKKwkJCQkJICAgICAgICJyZnBhdGgoJSN4KSwgYml0bWFzayglI3gpXG4iLAorCQkJCQkgICAgICAgcmVnYWRkciwgcmZwYXRoLCBiaXRtYXNrKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfbG9jaywgZmxhZ3MpOworCisKKwlvcmlnaW5hbF92YWx1ZSA9IF9ydGw4ODIxYWVfcGh5X3JmX3NlcmlhbF9yZWFkKGh3LHJmcGF0aCwgcmVnYWRkcik7CisJYml0c2hpZnQgPSBfcnRsODgyMWFlX3BoeV9jYWxjdWxhdGVfYml0X3NoaWZ0KGJpdG1hc2spOworCXJlYWRiYWNrX3ZhbHVlID0gKG9yaWdpbmFsX3ZhbHVlICYgYml0bWFzaykgPj4gYml0c2hpZnQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisKKwlSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsCisJCSAoInJlZ2FkZHIoJSN4KSwgcmZwYXRoKCUjeCksICIKKwkJICAiYml0bWFzayglI3gpLCBvcmlnaW5hbF92YWx1ZSglI3gpXG4iLAorCQkgIHJlZ2FkZHIsIHJmcGF0aCwgYml0bWFzaywgb3JpZ2luYWxfdmFsdWUpKTsKKworCXJldHVybiByZWFkYmFja192YWx1ZTsKK30KKwordm9pZCBydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAorCQkJICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIG9yaWdpbmFsX3ZhbHVlLCBiaXRzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX1RSQUNFLAorCQkgKCJyZWdhZGRyKCUjeCksIGJpdG1hc2soJSN4KSwgZGF0YSglI3gpLCByZnBhdGgoJSN4KVxuIiwKKwkJICByZWdhZGRyLCBiaXRtYXNrLCBkYXRhLCByZnBhdGgpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisKKwlpZiAoYml0bWFzayAhPSBSRlJFR19PRkZTRVRfTUFTSykgeworCQkJb3JpZ2luYWxfdmFsdWUgPSBfcnRsODgyMWFlX3BoeV9yZl9zZXJpYWxfcmVhZChodywKKwkJCQkJCQkJICAgIHJmcGF0aCwKKwkJCQkJCQkJICAgIHJlZ2FkZHIpOworCQkJYml0c2hpZnQgPSBfcnRsODgyMWFlX3BoeV9jYWxjdWxhdGVfYml0X3NoaWZ0KGJpdG1hc2spOworCQkJZGF0YSA9CisJCQkgICAgKChvcmlnaW5hbF92YWx1ZSAmICh+Yml0bWFzaykpIHwKKwkJCSAgICAgKGRhdGEgPDwgYml0c2hpZnQpKTsKKwkJfQorCisJX3J0bDg4MjFhZV9waHlfcmZfc2VyaWFsX3dyaXRlKGh3LCByZnBhdGgsIHJlZ2FkZHIsIGRhdGEpOworCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisKKwlSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCAiCisJCQkJCSAgICAgICAiYml0bWFzayglI3gpLCBkYXRhKCUjeCksIHJmcGF0aCglI3gpXG4iLAorCQkJCQkgICAgICAgcmVnYWRkciwgYml0bWFzaywgZGF0YSwgcmZwYXRoKSk7CisKK30KKworc3RhdGljIHUzMiBfcnRsODgyMWFlX3BoeV9yZl9zZXJpYWxfcmVhZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCWJvb2wgYl9pc19waV9tb2RlID1mYWxzZTsKKwl1MzIgcmV0dmFsdWUgPSAwOworCisJLyogMjAwOS8wNi8xNyBNSCBXZSBjYW4gbm90IGV4ZWN1dGUgSU8gZm9yIHBvd2VyIHNhdmUgb3Igb3RoZXIgYWNjaWRlbnQgbW9kZS4qLworCWlmIChSVF9DQU5OT1RfSU8oaHcpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgicmV0dXJuIGFsbCBvbmVcbiIpKTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCisJLyogPDIwMTIwODA5LCBLb3JkYW4+IENDQSBPRkYod2hlbiBlbnRlcmluZyksIGFza2VkIGJ5IEphbWVzIHRvIGF2b2lkIHJlYWRpbmcgdGhlIHdyb25nIHZhbHVlLgorCSAgICA8MjAxMjA4MjgsIEtvcmRhbj4gVG9nZ2xpbmcgQ0NBIHdvdWxkIGFmZmVjdCBSRiAweDAsIHNraXAgaXQhKi8KKwlpZiAob2Zmc2V0ICE9IDB4MCAmJgorCQkhKChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJCXx8IChJU19WRU5ET1JfODgxMkFfQ19DVVQocnRsaGFsLT52ZXJzaW9uKSkpKQorCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NBT05TRUMsIDB4OCwgMSk7CisKKwlvZmZzZXQgJj0gMHhmZjsKKworCWlmIChyZnBhdGggPT0gUkY5MF9QQVRIX0EpCisJCWJfaXNfcGlfbW9kZSA9IChib29sKSBydGxfZ2V0X2JicmVnKGh3LCAweEMwMCwgMHg0KTsKKwllbHNlIGlmIChyZnBhdGggPT0gUkY5MF9QQVRIX0IpCisJCWJfaXNfcGlfbW9kZSA9IChib29sKSBydGxfZ2V0X2JicmVnKGh3LCAweEUwMCwgMHg0KTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIFJIU1NJUkVBRF84ODIxQUUsIDB4ZmYsIG9mZnNldCk7CisKKwlpZiAoKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkKKwkJfHwgKElTX1ZFTkRPUl84ODEyQV9DX0NVVChydGxoYWwtPnZlcnNpb24pKSkKKwkJdWRlbGF5KDIwKTsKKworCWlmIChiX2lzX3BpX21vZGUpCisJeworCQlpZiAocmZwYXRoID09IFJGOTBfUEFUSF9BKSB7CisJCQlyZXR2YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJBX1BJUkVBRF84ODIxQSwgQkxTU0lSRUFEQkFDS0RBVEEpOworCQl9CisJCWVsc2UgaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQil7CisJCQlyZXR2YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJCX1BJUkVBRF84ODIxQSwgQkxTU0lSRUFEQkFDS0RBVEEpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChyZnBhdGggPT0gUkY5MF9QQVRIX0EpIHsKKwkJCXJldHZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgUkFfU0lSRUFEXzg4MjFBLCBCTFNTSVJFQURCQUNLREFUQSk7CisJCX0KKwkJZWxzZSBpZiAocmZwYXRoID09IFJGOTBfUEFUSF9CKXsKKwkJCXJldHZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgUkJfU0lSRUFEXzg4MjFBLCBCTFNTSVJFQURCQUNLREFUQSk7CisJCX0KKwl9CisKKwkvKjwyMDEyMDgwOSwgS29yZGFuPiBDQ0EgT04od2hlbiBleGl0aW5nKSwgYXNrZWQgYnkgSmFtZXMgdG8gYXZvaWQgcmVhZGluZyB0aGUgd3JvbmcgdmFsdWUuCisJICAgIDwyMDEyMDgyOCwgS29yZGFuPiBUb2dnbGluZyBDQ0Egd291bGQgYWZmZWN0IFJGIDB4MCwgc2tpcCBpdCEqLworCWlmIChvZmZzZXQgIT0gMHgwICYmICAhICgocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKQorCQl8fCAoSVNfVkVORE9SXzg4MTJBX0NfQ1VUKHJ0bGhhbC0+dmVyc2lvbikpKSkKKwkJcnRsX3NldF9iYnJlZyhodywgUkNDQU9OU0VDLCAweDgsIDApOworCXJldHVybiByZXR2YWx1ZTsKK30KKworI2lmIDAKK3N0YXRpYyB1MzIgX3J0bDg4MjFhZV9waHlfcmZfc2VyaWFsX3JlYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgZW51bSByYWRpb19wYXRoIHJmcGF0aCwgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgYmJfcmVnX2RlZiAqcHBoeXJlZyA9ICZydGxwaHktPnBoeXJlZ19kZWZbcmZwYXRoXTsKKwl1MzIgbmV3b2Zmc2V0OworCXUzMiB0bXBsb25nLCB0bXBsb25nMjsKKwl1OCByZnBpX2VuYWJsZSA9IDA7CisJdTMyIHJldHZhbHVlOworCisJb2Zmc2V0ICY9IDB4ZmY7CisJbmV3b2Zmc2V0ID0gb2Zmc2V0OworCWlmIChSVF9DQU5OT1RfSU8oaHcpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgicmV0dXJuIGFsbCBvbmVcbiIpKTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCXRtcGxvbmcgPSBydGxfZ2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjIsIE1BU0tEV09SRCk7CisJaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQSkKKwkJdG1wbG9uZzIgPSB0bXBsb25nOworCWVsc2UKKwkJdG1wbG9uZzIgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsIE1BU0tEV09SRCk7CisJdG1wbG9uZzIgPSAodG1wbG9uZzIgJiAofkJMU1NJUkVBREFERFJFU1MpKSB8CisJICAgIChuZXdvZmZzZXQgPDwgMjMpIHwgQkxTU0lSRUFERURHRTsKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjIsIE1BU0tEV09SRCwKKwkJICAgICAgdG1wbG9uZyAmICh+QkxTU0lSRUFERURHRSkpOworCW1kZWxheSgxKTsKKwlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsIE1BU0tEV09SRCwgdG1wbG9uZzIpOworCW1kZWxheSgxKTsKKwkvKnJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMiwgTUFTS0RXT1JELAorCQkgICAgICB0bXBsb25nIHwgQkxTU0lSRUFERURHRSk7Ki8KKwltZGVsYXkoMSk7CisJaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQSkKKwkJcmZwaV9lbmFibGUgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMSwKKwkJCQkJCSBCSVQoOCkpOworCWVsc2UgaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQikKKwkJcmZwaV9lbmFibGUgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9YQl9IU1NJUEFSQU1FVEVSMSwKKwkJCQkJCSBCSVQoOCkpOworCWlmIChyZnBpX2VuYWJsZSkKKwkJcmV0dmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmxzc2lfcmVhZGJhY2twaSwKKwkJCQkJIEJMU1NJUkVBREJBQ0tEQVRBKTsKKwllbHNlCisJCXJldHZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgcHBoeXJlZy0+cmZsc3NpX3JlYWRiYWNrLAorCQkJCQkgQkxTU0lSRUFEQkFDS0RBVEEpOworCVJUX1RSQUNFKENPTVBfUkYsIERCR19UUkFDRSwgKCJSRlItJWQgQWRkclsweCV4XT0weCV4XG4iLAorCQkJCQkgICAgICAgcmZwYXRoLCBwcGh5cmVnLT5yZmxzc2lfcmVhZGJhY2ssCisJCQkJCSAgICAgICByZXR2YWx1ZSkpOworCXJldHVybiByZXR2YWx1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3BoeV9yZl9zZXJpYWxfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCWVudW0gcmFkaW9fcGF0aCByZnBhdGgsIHUzMiBvZmZzZXQsCisJCQkJCXUzMiBkYXRhKQoreworCXUzMiBkYXRhX2FuZF9hZGRyOworCXUzMiBuZXdvZmZzZXQ7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IGJiX3JlZ19kZWYgKnBwaHlyZWcgPSAmcnRscGh5LT5waHlyZWdfZGVmW3JmcGF0aF07CisKKwlpZiAoUlRfQ0FOTk9UX0lPKGh3KSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoInN0b3BcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlvZmZzZXQgJj0gMHhmZjsKKwluZXdvZmZzZXQgPSBvZmZzZXQ7CisJZGF0YV9hbmRfYWRkciA9ICgobmV3b2Zmc2V0IDw8IDIwKSB8IChkYXRhICYgMHgwMDBmZmZmZikpICYgMHgwZmZmZmZmZjsKKwlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZjN3aXJlX29mZnNldCwgTUFTS0RXT1JELCBkYXRhX2FuZF9hZGRyKTsKKwlSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgiUkZXLSVkIEFkZHJbMHgleF09MHgleFxuIiwKKwkJCQkJICAgICAgIHJmcGF0aCwgcHBoeXJlZy0+cmYzd2lyZV9vZmZzZXQsCisJCQkJCSAgICAgICBkYXRhX2FuZF9hZGRyKSk7Cit9CisKK3N0YXRpYyB1MzIgX3J0bDg4MjFhZV9waHlfY2FsY3VsYXRlX2JpdF9zaGlmdCh1MzIgYml0bWFzaykKK3sKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykgeworCQlpZiAoKChiaXRtYXNrID4+IGkpICYgMHgxKSA9PSAxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCitib29sIHJ0bDg4MjFhZV9waHlfbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCWJvb2wgcnRzdGF0dXMgPSAwOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJcnRzdGF0dXMgPSBfcnRsODgxMmFlX3BoeV9jb25maWdfbWFjX3dpdGhfaGVhZGVyZmlsZShodyk7CisJZWxzZQorCQlydHN0YXR1cyA9IF9ydGw4ODIxYWVfcGh5X2NvbmZpZ19tYWNfd2l0aF9oZWFkZXJmaWxlKGh3KTsKKworCXJldHVybiBydHN0YXR1czsKK30KKworYm9vbCBydGw4ODIxYWVfcGh5X2JiX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlib29sIHJ0c3RhdHVzID0gdHJ1ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggcmVndmFsOworCXU4IGNyeXN0YWxfY2FwOworCS8vdTMyIHRtcDsKKworCV9ydGw4ODIxYWVfcGh5X2luaXRfYmJfcmZfcmVnaXN0ZXJfZGVmaW5pdGlvbihodyk7CisKKwlyZWd2YWwgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTik7CisJcmVndmFsIHw9IHJlZ3ZhbCB8IEZFTl9QQ0lFQTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4sIHJlZ3ZhbCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLAorCQkJCXJlZ3ZhbCB8IEZFTl9CQl9HTEJfUlNUTiB8IEZFTl9CQlJTVEIpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JGX0NUUkwsIDB4Nyk7LypSRl9FTiB8IFJGX1JTVEIgfCBSRl9TRE1SU1RCKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfT1BUX0NUUkwgKyAyLCAweDcpOy8qUkZfRU4gfCBSRl9SU1RCIHwgUkZfU0RNUlNUQiovCisKKwlydHN0YXR1cyA9IF9ydGw4ODIxYWVfcGh5X2JiODgyMWFfY29uZmlnX3BhcmFmaWxlKGh3KTsKKworCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJeworCQljcnlzdGFsX2NhcCA9IHJ0bGVmdXNlLT5jcnlzdGFsY2FwICYgMHgzRjsKKwkJcnRsX3NldF9iYnJlZyhodywgUkVHX01BQ19QSFlfQ1RSTCwgMHg3RkY4MDAwMCwgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CisJfWVsc2V7CisJCWNyeXN0YWxfY2FwID0gcnRsZWZ1c2UtPmNyeXN0YWxjYXAgJiAweDNGOworCQlydGxfc2V0X2JicmVnKGh3LCBSRUdfTUFDX1BIWV9DVFJMLCAweEZGRjAwMCwgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CisJfQorCXJ0bHBoeS0+cmVnXzgzNyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHg4MzcpOworCisJcmV0dXJuIHJ0c3RhdHVzOworfQorCitib29sIHJ0bDg4MjFhZV9waHlfcmZfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXJldHVybiBydGw4ODIxYWVfcGh5X3JmNjA1Ml9jb25maWcoaHcpOworfQorCisKK3UzMiBwaHlfZ2V0X3R4X2JiX3N3aW5nXzg4MTJBKAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4IAliYW5kLAorCXU4IAlyZl9wYXRoCisJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZG0gKnJ0bGRtID0gcnRsX2RtKHJ0bHByaXYpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisKKwljaGFyIGJiX3N3aW5nXzJnID0gKGNoYXIpICgtMSAqIDB4RkYpOworCWNoYXIgYmJfc3dpbmdfNWcgPSAoY2hhcikgKC0xICogMHhGRik7CisJdTMyICBvdXQgPSAweDIwMDsKKwljb25zdCBjaGFyIGF1dG9fdGVtcCA9IC0xOworCisJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwKKwkJKCI9PT0+IFBIWV9HZXRUeEJCU3dpbmdfODgxMkEsIGJiU3dpbmdfMkc6ICVkLCBiYlN3aW5nXzVHOiAlZFxuIiwKKwkJKGludCliYl9zd2luZ18yZywgKGludCliYl9zd2luZ181ZykpOworCisgICAgaWYgKCBydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcpIHsKKyAgICAgICAgCWlmICggYmFuZCA9PSBCQU5EX09OXzJfNEcgKSB7CisJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl8yZyA9IGJiX3N3aW5nXzJnOworCQkJaWYgICAgICAoYmJfc3dpbmdfMmcgPT0gMCkgIG91dCA9IDB4MjAwOyAvLyAgMCBkQgorCQkJZWxzZSBpZiAoYmJfc3dpbmdfMmcgPT0gLTMpIG91dCA9IDB4MTZBOyAvLyAtMyBkQgorCQkJZWxzZSBpZiAoYmJfc3dpbmdfMmcgPT0gLTYpIG91dCA9IDB4MTAxOyAvLyAtNiBkQgorCQkJZWxzZSBpZiAoYmJfc3dpbmdfMmcgPT0gLTkpIG91dCA9IDB4MEI2OyAvLyAtOSBkQgorCQkJZWxzZSB7CisJCQkgICAgICAgIHJ0bGRtLT5iYl9zd2luZ19kaWZmXzJnID0gMDsKKwkJCSAgICAgICAgb3V0ID0gMHgyMDA7CisJCQl9CisKKwkJfSBlbHNlIGlmICggYmFuZCA9PSBCQU5EX09OXzVHICkgeworCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfNWcgPSBiYl9zd2luZ181ZzsKKwkJCWlmICAgICAgKGJiX3N3aW5nXzVnID09IDApICBvdXQgPSAweDIwMDsgLy8gIDAgZEIKKwkJCWVsc2UgaWYgKGJiX3N3aW5nXzVnID09IC0zKSBvdXQgPSAweDE2QTsgLy8gLTMgZEIKKwkJCWVsc2UgaWYgKGJiX3N3aW5nXzVnID09IC02KSBvdXQgPSAweDEwMTsgLy8gLTYgZEIKKwkJCWVsc2UgaWYgKGJiX3N3aW5nXzVnID09IC05KSBvdXQgPSAweDBCNjsgLy8gLTkgZEIKKwkJCWVsc2UgeworCQkJCWlmICggcnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKSB7CisJCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzVnID0gLTM7CisJCQkJCW91dCA9IDB4MTZBOworCQkJCX0gZWxzZSAgeworCQkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl81ZyA9IDA7CisJCQkJCW91dCA9IDB4MjAwOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlICB7CisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfMmcgPSAtMzsKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl81ZyA9IC0zOworCQkJCW91dCA9IDB4MTZBOyAvLyAtMyBkQgorCQl9CisJfQorCWVsc2UKKwl7CisJICAgIHUzMiBzd2luZyA9IDAsIHN3aW5nX2EgPSAwLCBzd2luZ19iID0gMDsKKworCSAgICBpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpCisJICAgIHsKKwkJCWlmICgweEZGID09IGF1dG9fdGVtcCkKKwkJCXsKKwkJCQllZnVzZV9zaGFkb3dfcmVhZChodywgMSwgMHhDNiwgKHUzMiAqKSZzd2luZyk7CisJCQkJc3dpbmcgPSAoc3dpbmcgPT0gMHhGRikgPyAweDAwIDogc3dpbmc7CisJCQl9CisJCQllbHNlIGlmIChiYl9zd2luZ18yZyA9PSAgMCkgc3dpbmcgPSAweDAwOyAvLyAgMCBkQgorCQkJZWxzZSBpZiAoYmJfc3dpbmdfMmcgPT0gLTMpIHN3aW5nID0gMHgwNTsgLy8gLTMgZEIKKwkJCWVsc2UgaWYgKGJiX3N3aW5nXzJnID09IC02KSBzd2luZyA9IDB4MEE7IC8vIC02IGRCCisJCQllbHNlIGlmIChiYl9zd2luZ18yZyA9PSAtOSkgc3dpbmcgPSAweEZGOyAvLyAtOSBkQgorCQkJZWxzZSBzd2luZyA9IDB4MDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoMHhGRiA9PSBhdXRvX3RlbXApCisJCQl7CisJCQkJZWZ1c2Vfc2hhZG93X3JlYWQoaHcsIDEsIDB4QzcsICh1MzIgKikmc3dpbmcpOworCQkJCXN3aW5nID0gKHN3aW5nID09IDB4RkYpID8gMHgwMCA6IHN3aW5nOworCQkJfQorCQkJZWxzZSBpZiAoYmJfc3dpbmdfNWcgPT0gIDApIHN3aW5nID0gMHgwMDsgLy8gIDAgZEIKKwkJCWVsc2UgaWYgKGJiX3N3aW5nXzVnID09IC0zKSBzd2luZyA9IDB4MDU7IC8vIC0zIGRCCisJCQllbHNlIGlmIChiYl9zd2luZ181ZyA9PSAtNikgc3dpbmcgPSAweDBBOyAvLyAtNiBkQgorCQkJZWxzZSBpZiAoYmJfc3dpbmdfNWcgPT0gLTkpIHN3aW5nID0gMHhGRjsgLy8gLTkgZEIKKwkJCWVsc2Ugc3dpbmcgPSAweDAwOworCQl9CisKKwkJc3dpbmdfYSA9IChzd2luZyAmIDB4MykgPj4gMDsgLy8gMHhDNi9DN1sxOjBdCisJCXN3aW5nX2IgPSAoc3dpbmcgJiAweEMpID4+IDI7IC8vIDB4QzYvQzdbMzoyXQorCQlSVF9UUkFDRShDT01QX1NDQU4sIERCR19MT1VELAorCQkoIj09PT4gUEhZX0dldFR4QkJTd2luZ184ODEyQSwgc3dpbmdBOiAweCVYLCBzd2luZ0I6IDB4JVhcbiIsCisJCXN3aW5nX2EsIHN3aW5nX2IpKTsKKworCQkvLzMgUGF0aC1BCisJCWlmIChzd2luZ19hID09IDB4MCkgeworCQkJaWYgKGJhbmQgPT0gQkFORF9PTl8yXzRHKQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzJnID0gMDsKKwkJCWVsc2UKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl81ZyA9IDA7CisJCQlvdXQgPSAweDIwMDsgLy8gMCBkQgorCQl9IGVsc2UgaWYgKHN3aW5nX2EgPT0gMHgxKSB7CisJCQlpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpCisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfMmcgPSAtMzsKKwkJCWVsc2UKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl81ZyA9IC0zOworCQkJb3V0ID0gMHgxNkE7IC8vIC0zIGRCCisJCX0gZWxzZSBpZiAoc3dpbmdfYSA9PSAweDIpIHsKKwkJCWlmIChiYW5kID09IEJBTkRfT05fMl80RykKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl8yZyA9IC02OworCQkJZWxzZQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzVnID0gLTY7CisJCQlvdXQgPSAweDEwMTsgLy8gLTYgZEIKKwkJfSBlbHNlIGlmIChzd2luZ19hID09IDB4MykgeworCQkJaWYgKGJhbmQgPT0gQkFORF9PTl8yXzRHKQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzJnID0gLTk7CisJCQllbHNlCisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfNWcgPSAtOTsKKwkJCW91dCA9IDB4MEI2OyAvLyAtOSBkQgorCQl9CisKKwkJCS8vMyBQYXRoLUIKKwkJaWYgKHN3aW5nX2IgPT0gMHgwKSB7CisJCQlpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpCisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfMmcgPSAwOworCQkJZWxzZQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzVnID0gMDsKKwkJCW91dCA9IDB4MjAwOyAvLyAwIGRCCisJCX0gZWxzZSBpZiAoc3dpbmdfYiA9PSAweDEpIHsKKwkJCWlmIChiYW5kID09IEJBTkRfT05fMl80RykKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl8yZyA9IC0zOworCQkJZWxzZQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzVnID0gLTM7CisJCQlvdXQgPSAweDE2QTsgLy8gLTMgZEIKKwkJfSBlbHNlIGlmIChzd2luZ19iID09IDB4MikgeworCQkJaWYgKGJhbmQgPT0gQkFORF9PTl8yXzRHKQorCQkJCXJ0bGRtLT5iYl9zd2luZ19kaWZmXzJnID0gLTY7CisJCQllbHNlCisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfNWcgPSAtNjsKKwkJCW91dCA9IDB4MTAxOyAvLyAtNiBkQgorCQl9IGVsc2UgaWYgKHN3aW5nX2IgPT0gMHgzKSB7CisJCQlpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpCisJCQkJcnRsZG0tPmJiX3N3aW5nX2RpZmZfMmcgPSAtOTsKKwkJCWVsc2UKKwkJCQlydGxkbS0+YmJfc3dpbmdfZGlmZl81ZyA9IC05OworCQkJb3V0ID0gMHgwQjY7IC8vIC05IGRCCisJCX0KKwl9CisKKwlSVF9UUkFDRShDT01QX1NDQU4sIERCR19MT1VELAorCQkoIjw9PT0gUEhZX0dldFR4QkJTd2luZ184ODEyQSwgb3V0ID0gMHglWFxuIiwgb3V0KSk7CisJIHJldHVybiBvdXQ7Cit9Cit2b2lkIHJ0bDg4MjFhZV9waHlfc3dpdGNoX3dpcmVsZXNzYmFuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYmFuZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxwcml2KTsKKwl1OCBjdXJyZW50X2JhbmQgPSBydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGU7CisJdTMyIHR4cGF0aCwgcnhwYXRoOworCS8vdTggaSwgdmFsdWU4OworCWNoYXIgYmJfZGlmZl9iZXR3ZWVuX2JhbmQ7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIlxuIikpOworCXR4cGF0aCA9IHJ0bDg4MjFhZV9waHlfcXVlcnlfYmJfcmVnKGh3LCBSVFhQQVRILCAweGYwKTsKKwlyeHBhdGggPSBydGw4ODIxYWVfcGh5X3F1ZXJ5X2JiX3JlZyhodywgUkNDS19SWCwgMHgwZjAwMDAwMCk7CisJcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID0gKGVudW0gYmFuZF90eXBlKSBiYW5kOworCS8qIHJlY29uZmlnIEJCL1JGIGFjY29yZGluZyB0byB3aXJlbGVzcyBtb2RlICovCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpIHsKKwkJLyogQkIgJiBSRiBDb25maWcgKi8KKwkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19ETUVTRywgKCIyLjRHXG4iKSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNQ0NLRU4sIEJPRkRNRU58QkNDS0VOLCAweDAzKTsKKworCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKSB7CisJCQkvKiAweENCMFsxNToxMl0gPSAweDcgKExOQV9PbikqLworCQkJcnRsX3NldF9iYnJlZyhodywgUkFfUkZFX1BJTk1VWCwgMHhGMDAwLCAweDcpOworCQkJLyogMHhDQjBbNzo0XSA9IDB4NyAoUEFQRV9BKSovCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9SRkVfUElOTVVYLCAweEYwLCAweDcpOworCQl9CisKKwkJaWYocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCAweDgzMCwgMHhFLCAweDQpOwkvKjB4ODMwWzM6MV0gPSAweDQqLworCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MzQsIDB4MywgMHgxKTsJLyoweDgzNFsxOjBdID0gMHgxKi8KKwkJfQorCisJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9UWFNDQUxFLCAweEYwMCwgMCk7IC8vIDB4QzFDWzExOjhdID0gMAorCQllbHNlCisJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgMHgzLCAwKTsJLy8gMHg4MkNbMTowXSA9IDJiJzAwCisKKwkJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkgeworCQkJcnRsX3NldF9iYnJlZyhodywgUkFfUkZFX1BJTk1VWCwgQk1BU0tEV09SRCwgMHg3Nzc3Nzc3Nyk7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSQl9SRkVfUElOTVVYLCBCTUFTS0RXT1JELCAweDc3Nzc3Nzc3KTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1JGRV9JTlYsIDB4M2ZmMDAwMDAsIDB4MDAwKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJCX1JGRV9JTlYsIDB4M2ZmMDAwMDAsIDB4MDAwKTsKKwkJfQorCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWFBBVEgsIDB4ZjAsIHR4cGF0aCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJDQ0tfUlgsIDB4MGYwMDAwMDAsIHJ4cGF0aCk7CisKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0NDS19DSEVDSywgMHgwKTsKKwl9IGVsc2Ugey8qIDVHIGJhbmQgKi8KKwkJdTE2IGNvdW50LCByZWdfNDFhOworCQlSVF9UUkFDRShDT01QX0NNRCwgREJHX0RNRVNHLCAoIjVHXG4iKSk7CisKKwkJaWYocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgyMUFFKSB7CisJCQkvKjB4Q0IwWzE1OjEyXSA9IDB4NSAoTE5BX09uKSovCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9SRkVfUElOTVVYLCAweEYwMDAsIDB4NSk7CisJCQkvKjB4Q0IwWzc6NF0gPSAweDQgKFBBUEVfQSkqLworCQkJcnRsX3NldF9iYnJlZyhodywgUkFfUkZFX1BJTk1VWCwgMHhGMCwgMHg0KTsKKwkJfQorCQkvKkNDS19DSEVDS19lbiovCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DQ0tfQ0hFQ0ssIDB4ODApOworCisJCWNvdW50ID0gMDsKKwkJcmVnXzQxYSA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX1RYUEtUX0VNUFRZKTsKKwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwgKCJSZWc0MUEgdmFsdWUgJWQiLCByZWdfNDFhKSk7CisJCXJlZ180MWEgJj0gMHgzMDsKKwkJd2hpbGUgKChyZWdfNDFhIT0gMHgzMCkgJiYgKGNvdW50IDwgNTApKSB7CisJCQl1ZGVsYXkoNTApOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwgKCJEZWxheSA1MHVzIFxuIikpOworCisJCQlyZWdfNDFhID0gcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfVFhQS1RfRU1QVFkpOworCQkJcmVnXzQxYSAmPSAweDMwOworCQkJY291bnQrKzsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgREJHX0xPVUQsICgiUmVnNDFBIHZhbHVlICVkIiwgcmVnXzQxYSkpOworCQl9CisJCWlmIChjb3VudCAhPSAwKQorCQkJUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwKKwkJCSgiUEhZX1N3aXRjaFdpcmVsZXNzQmFuZDg4MTIoKTogU3dpdGNoIHRvIDVHIEJhbmQuICIKKwkJCSJDb3VudCA9ICVkIHJlZzQxQT0weCV4XG4iLCBjb3VudCwgcmVnXzQxYSkpOworCisJCS8vIDIwMTIvMDIvMDEsIFNpbmRhIGFkZCByZWdpc3RyeSB0byBzd2l0Y2ggd29ya2Fyb3VuZCB3aXRob3V0IGxvbmctcnVuIHZlcmlmaWNhdGlvbiBmb3Igc2NhbiBpc3N1ZS4KKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE1DQ0tFTiwgQk9GRE1FTnxCQ0NLRU4sIDB4MDMpOworCisJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpIHsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODMwLCAweEUsIDB4Myk7CS8qMHg4MzBbMzoxXSA9IDB4MyovCisJCQlydGxfc2V0X2JicmVnKGh3LCAweDgzNCwgMHgzLCAweDIpOwkvKjB4ODM0WzE6MF0gPSAweDIqLworCQl9CisKKwkJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkgeworCQkJLyogQUdDIHRhYmxlIHNlbGVjdCAqLworCQkJcnRsX3NldF9iYnJlZyhodywgUkFfVFhTQ0FMRSwgMHhGMDAsIDEpOyAvKiAweEMxQ1sxMTo4XSA9IDEqLworCQl9IGVsc2UKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCAweDMsIDEpOwkvLyAweDgyQ1sxOjBdID0gMidiMDAKKworCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSQV9SRkVfUElOTVVYLCBCTUFTS0RXT1JELCAweDc3MzM3Nzc3KTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJCX1JGRV9QSU5NVVgsIEJNQVNLRFdPUkQsIDB4NzczMzc3NzcpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkFfUkZFX0lOViwgMHgzZmYwMDAwMCwgMHgwMTApOworCQkJcnRsX3NldF9iYnJlZyhodywgUkJfUkZFX0lOViwgMHgzZmYwMDAwMCwgMHgwMTApOworCQl9CisKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYUEFUSCwgMHhmMCwgdHhwYXRoKTsKKwkJcnRsX3NldF9iYnJlZyhodywgUkNDS19SWCwgMHgwZjAwMDAwMCwgcnhwYXRoKTsKKworCQlSVF9UUkFDRShDT01QX1NDQU4sIERCR19MT1VELAorCQkJKCI9PT5QSFlfU3dpdGNoV2lyZWxlc3NCYW5kODgxMigpIEJBTkRfT05fNUcgc2V0dGluZ3MgT0ZETSBpbmRleCAweCV4XG4iLAorCQkJcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFtSRjkwX1BBVEhfQV0pKTsKKwl9CisKKwlpZiAoKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSkgfHwKKwkJCShydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpKSB7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBX1RYU0NBTEUsIDB4RkZFMDAwMDAsCisJCQkJCQkgcGh5X2dldF90eF9iYl9zd2luZ184ODEyQShodywgYmFuZCwgUkY5MF9QQVRIX0EpKTsgLy8gMHhDMUNbMzE6MjFdCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJCX1RYU0NBTEUsIDB4RkZFMDAwMDAsCisJCQkJCQkgcGh5X2dldF90eF9iYl9zd2luZ184ODEyQShodywgYmFuZCwgUkY5MF9QQVRIX0IpKTsgLy8gMHhFMUNbMzE6MjFdCisKKwkJLyogPDIwMTIxMDA1LCBLb3JkYW4+IFdoZW4gVHhQb3dlclRyYWNrIGlzIE9OLCB3ZSBzaG91bGQgdGFrZSBjYXJlIG9mIHRoZSBjaGFuZ2Ugb2YgQkIgc3dpbmcuCisJCSAgICBUaGF0IGlzLCByZXNldCBhbGwgaW5mbyB0byB0cmlnZ2VyIFR4IHBvd2VyIHRyYWNraW5nLiovCisJCWlmIChiYW5kICE9IGN1cnJlbnRfYmFuZCkgeworCQkJYmJfZGlmZl9iZXR3ZWVuX2JhbmQgPSAocnRsZG0tPmJiX3N3aW5nX2RpZmZfMmcgLSBydGxkbS0+YmJfc3dpbmdfZGlmZl81Zyk7CisJCQliYl9kaWZmX2JldHdlZW5fYmFuZCA9IChiYW5kID09IEJBTkRfT05fMl80RykgPyBiYl9kaWZmX2JldHdlZW5fYmFuZCA6ICgtMSAqIGJiX2RpZmZfYmV0d2Vlbl9iYW5kKTsKKwkJCXJ0bGRtLT5kZWZhdWx0X29mZG1faW5kZXggKz0gYmJfZGlmZl9iZXR3ZWVuX2JhbmQgKiAyOworCQl9CisJCXJ0bDg4MjFhZV9kbV9jbGVhcl90eHBvd2VyX3RyYWNraW5nX3N0YXRlKGh3KTsKKwl9CisKKwlSVF9UUkFDRShDT01QX1NDQU4sIERCR19UUkFDRSwKKwkJKCI8PT1ydGw4ODIxYWVfcGh5X3N3aXRjaF93aXJlbGVzc2JhbmQoKTpTd2l0Y2ggQmFuZCBPSy5cbiIpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfY2hlY2tfY29uZGl0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCWNvbnN0IHUzMiAgQ29uZGl0aW9uCisJKQoreworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwl1MzIgX2JvYXJkID0gcnRsZWZ1c2UtPmJvYXJkX3R5cGU7IC8qbmVlZCBlZnVzZSBkZWZpbmUqLworCXUzMiBfaW50ZXJmYWNlID0gcnRsaGFsLT5pbnRlcmZhY2U7CisJdTMyIF9wbGF0Zm9ybSA9IDB4MDg7LypTdXBwb3J0UGxhdGZvcm0gKi8KKwl1MzIgY29uZCA9IENvbmRpdGlvbjsKKworCWlmICggQ29uZGl0aW9uID09IDB4Q0RDRENEQ0QgKQorCQlyZXR1cm4gdHJ1ZTsKKworCWNvbmQgPSBDb25kaXRpb24gJiAweEZGOworCWlmICggKF9ib2FyZCAhPSBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHhGRikKKwkJcmV0dXJuIGZhbHNlOworCisJY29uZCA9IENvbmRpdGlvbiAmIDB4RkYwMDsKKwljb25kID0gY29uZCA+PiA4OworCWlmICggKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKKwkJcmV0dXJuIGZhbHNlOworCisJY29uZCA9IENvbmRpdGlvbiAmIDB4RkYwMDAwOworCWNvbmQgPSBjb25kID4+IDE2OworCWlmICggKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfY29uZmlnX3JmX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgYWRkciwKKwl1MzIgZGF0YSwKKwllbnVtIHJhZGlvX3BhdGggcmZwYXRoLAorCXUzMiByZWdhZGRyCisJKQoreworCWlmICggYWRkciA9PSAweGZlIHx8IGFkZHIgPT0gMHhmZmUpIHsKKwkJbWRlbGF5KDUwKTsKKwl9IGVsc2UgeworCQlydGxfc2V0X3JmcmVnKGh3LCByZnBhdGgsIHJlZ2FkZHIsIFJGUkVHX09GRlNFVF9NQVNLLCBkYXRhKTsKKwkJdWRlbGF5KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9jb25maWdfcmZfcmFkaW9fYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJdTMyIGNvbnRlbnQgPSAweDEwMDA7IC8qUkYgQ29udGVudDogcmFkaW9fYV90eHQqLworCXUzMiBtYXNrZm9ycGh5c2V0ID0gKHUzMikoY29udGVudCAmIDB4RTAwMCk7CisKKwlfcnRsODgyMWFlX2NvbmZpZ19yZl9yZWcoaHcsIGFkZHIsIGRhdGEsIFJGOTBfUEFUSF9BLCBhZGRyIHwgbWFza2ZvcnBoeXNldCk7CisKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9jb25maWdfcmZfcmFkaW9fYihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJdTMyIGNvbnRlbnQgPSAweDEwMDE7IC8qUkYgQ29udGVudDogcmFkaW9fYl90eHQqLworCXUzMiBtYXNrZm9ycGh5c2V0ID0gKHUzMikoY29udGVudCAmIDB4RTAwMCk7CisKKwlfcnRsODgyMWFlX2NvbmZpZ19yZl9yZWcoaHcsIGFkZHIsIGRhdGEsIFJGOTBfUEFUSF9CLCBhZGRyIHwgbWFza2ZvcnBoeXNldCk7CisKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MTJhZV9jb25maWdfYmJfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXUzMiBhZGRyLCB1MzIgZGF0YSkKK3sKKwlpZiAoIGFkZHIgPT0gMHhmZSkgeworCQltZGVsYXkoNTApOworCX0gZWxzZSBpZiAoIGFkZHIgPT0gMHhmZCkKKwkJbWRlbGF5KDUpOworCWVsc2UgaWYgKCBhZGRyID09IDB4ZmMpCisJCW1kZWxheSgxKTsKKwllbHNlIGlmICggYWRkciA9PSAweGZiKQorCQl1ZGVsYXkoNTApOworCWVsc2UgaWYgKCBhZGRyID09IDB4ZmEpCisJCXVkZWxheSg1KTsKKwllbHNlIGlmICggYWRkciA9PSAweGY5KQorCQl1ZGVsYXkoMSk7CisJZWxzZSB7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIGFkZHIsIE1BU0tEV09SRCxkYXRhKTsKKwl9CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX2NvbmZpZ19iYl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyIGFkZHIsIHUzMiBkYXRhKQoreworCWlmICggYWRkciA9PSAweGZlKSB7CisJCW1kZWxheSg1MCk7CisJfSBlbHNlIGlmICggYWRkciA9PSAweGZkKQorCQltZGVsYXkoNSk7CisJZWxzZSBpZiAoIGFkZHIgPT0gMHhmYykKKwkJbWRlbGF5KDEpOworCWVsc2UgaWYgKCBhZGRyID09IDB4ZmIpCisJCXVkZWxheSg1MCk7CisJZWxzZSBpZiAoIGFkZHIgPT0gMHhmYSkKKwkJdWRlbGF5KDUpOworCWVsc2UgaWYgKCBhZGRyID09IDB4ZjkpCisJCXVkZWxheSgxKTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIGFkZHIsIE1BU0tEV09SRCxkYXRhKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfcGh5X2luaXRfdHhfcG93ZXJfYnlfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXU4IGJhbmQsIHJmcGF0aCwgdHhudW0sIHJhdGVfc2VjdGlvbjsKKworCWZvciAoIGJhbmQgPSBCQU5EX09OXzJfNEc7IGJhbmQgPD0gQkFORF9PTl81RzsgKytiYW5kICkKKwkJZm9yICggcmZwYXRoID0gMDsgcmZwYXRoIDwgVFhfUFdSX0JZX1JBVEVfTlVNX1JGOyArK3JmcGF0aCApCisJCQlmb3IgKCB0eG51bSA9IDA7IHR4bnVtIDwgVFhfUFdSX0JZX1JBVEVfTlVNX1JGOyArK3R4bnVtICkKKwkJCQlmb3IgKCByYXRlX3NlY3Rpb24gPSAwOyByYXRlX3NlY3Rpb24gPCBUWF9QV1JfQllfUkFURV9OVU1fU0VDVElPTjsgKytyYXRlX3NlY3Rpb24gKQorCQkJCQlydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W2JhbmRdW3JmcGF0aF1bdHhudW1dW3JhdGVfc2VjdGlvbl0gPSAwOworfQorCit2b2lkIF9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2J5X3JhdGVfYmFzZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQkJICAgdTggYmFuZCwgdTggcGF0aCwKKwkJCQkJCQkJCQkJCQkJICAgdTggcmF0ZV9zZWN0aW9uLAorCQkJCQkJCQkJCQkJCQkgICB1OCB0eG51bSwgdTggdmFsdWUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlpZiAocGF0aCA+IFJGOTBfUEFUSF9EKSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkoIkludmFsaWQgUmYgUGF0aCAlZCBpbiBwaHlfU2V0VHhQb3dlckJ5UmF0QmFzZSgpXG4iLCBwYXRoKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpIHsKKwkJc3dpdGNoIChyYXRlX3NlY3Rpb24pIHsKKwkJY2FzZSBDQ0s6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV8yNGdbcGF0aF1bdHhudW1dWzBdID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBPRkRNOgorCQkJcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfMjRnW3BhdGhdW3R4bnVtXVsxXSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSFRfTUNTMF9NQ1M3OgorCQkJcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfMjRnW3BhdGhdW3R4bnVtXVsyXSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSFRfTUNTOF9NQ1MxNToKKwkJCXJ0bHBoeS0+dHhwd3JfYnlfcmF0ZV9iYXNlXzI0Z1twYXRoXVt0eG51bV1bM10gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFZIVF8xU1NNQ1MwXzFTU01DUzk6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV8yNGdbcGF0aF1bdHhudW1dWzRdID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWSFRfMlNTTUNTMF8yU1NNQ1M5OgorCQkJcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfMjRnW3BhdGhdW3R4bnVtXVs1XSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoICJJbnZhbGlkIFJhdGVTZWN0aW9uICVkIGluIEJhbmQgMi40RywgUmYgUGF0aCAlZCwgJWRUeCBpbiBQSFlfU2V0VHhQb3dlckJ5UmF0ZUJhc2UoKVxuIiwKKwkJCQkJIHJhdGVfc2VjdGlvbiwgcGF0aCwgdHhudW0gKSApOworCQkJYnJlYWs7CisJCX07CisJfSBlbHNlIGlmIChiYW5kID09IEJBTkRfT05fNUcpIHsKKwkJc3dpdGNoIChyYXRlX3NlY3Rpb24pIHsKKwkJY2FzZSBPRkRNOgorCQkJcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfNWdbcGF0aF1bdHhudW1dWzBdID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBIVF9NQ1MwX01DUzc6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV81Z1twYXRoXVt0eG51bV1bMV0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEhUX01DUzhfTUNTMTU6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV81Z1twYXRoXVt0eG51bV1bMl0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFZIVF8xU1NNQ1MwXzFTU01DUzk6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV81Z1twYXRoXVt0eG51bV1bM10gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFZIVF8yU1NNQ1MwXzJTU01DUzk6CisJCQlydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV81Z1twYXRoXVt0eG51bV1bNF0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkoIkludmFsaWQgUmF0ZVNlY3Rpb24gJWQgaW4gQmFuZCA1RywgUmYgUGF0aCAlZCwgIgorCQkJCSIlZFR4IGluIFBIWV9TZXRUeFBvd2VyQnlSYXRlQmFzZSgpXG4iLAorCQkJCXJhdGVfc2VjdGlvbiwgcGF0aCwgdHhudW0pKTsKKwkJCWJyZWFrOworCQl9OworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkoIkludmFsaWQgQmFuZCAlZCBpbiBQSFlfU2V0VHhQb3dlckJ5UmF0ZUJhc2UoKVxuIiwgYmFuZCkpOworCX0KKworfQorCit1OCBfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkJCQkJCQkJCSB1OCBiYW5kLCB1OCBwYXRoLAorCQkJCQkJCQkJCQkJCQkgdTggdHhudW0sIHU4IHJhdGVfc2VjdGlvbikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCB2YWx1ZSA9IDA7CisKKwlpZiAocGF0aCA+IFJGOTBfUEFUSF9EKSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkoIkludmFsaWQgUmYgUGF0aCAlZCBpbiBQSFlfR2V0VHhQb3dlckJ5UmF0ZUJhc2UoKVxuIiwgcGF0aCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYmFuZCA9PSBCQU5EX09OXzJfNEcpIHsKKwkJc3dpdGNoIChyYXRlX3NlY3Rpb24pIHsKKwkJY2FzZSBDQ0s6CisJCQl2YWx1ZSA9IHJ0bHBoeS0+dHhwd3JfYnlfcmF0ZV9iYXNlXzI0Z1twYXRoXVt0eG51bV1bMF07CisJCQlicmVhazsKKwkJY2FzZSBPRkRNOgorCQkJdmFsdWUgPSBydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV8yNGdbcGF0aF1bdHhudW1dWzFdOworCQkJYnJlYWs7CisJCWNhc2UgSFRfTUNTMF9NQ1M3OgorCQkJdmFsdWUgPSBydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV8yNGdbcGF0aF1bdHhudW1dWzJdOworCQkJYnJlYWs7CisJCWNhc2UgSFRfTUNTOF9NQ1MxNToKKwkJCXZhbHVlID0gcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfMjRnW3BhdGhdW3R4bnVtXVszXTsKKwkJCWJyZWFrOworCQljYXNlIFZIVF8xU1NNQ1MwXzFTU01DUzk6CisJCQl2YWx1ZSA9IHJ0bHBoeS0+dHhwd3JfYnlfcmF0ZV9iYXNlXzI0Z1twYXRoXVt0eG51bV1bNF07CisJCQlicmVhazsKKwkJY2FzZSBWSFRfMlNTTUNTMF8yU1NNQ1M5OgorCQkJdmFsdWUgPSBydGxwaHktPnR4cHdyX2J5X3JhdGVfYmFzZV8yNGdbcGF0aF1bdHhudW1dWzVdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSgiSW52YWxpZCBSYXRlU2VjdGlvbiAlZCBpbiBCYW5kIDIuNEcsIFJmIFBhdGggJWQsIgorCQkJCSIgJWRUeCBpbiBQSFlfR2V0VHhQb3dlckJ5UmF0ZUJhc2UoKVxuIiwKKwkJCQlyYXRlX3NlY3Rpb24sIHBhdGgsIHR4bnVtKSk7CisJCQlicmVhazsKKwkJfTsKKwl9IGVsc2UgaWYgKGJhbmQgPT0gQkFORF9PTl81RykgeworCQlzd2l0Y2ggKHJhdGVfc2VjdGlvbikgeworCQljYXNlIE9GRE06CisJCQl2YWx1ZSA9IHJ0bHBoeS0+dHhwd3JfYnlfcmF0ZV9iYXNlXzVnW3BhdGhdW3R4bnVtXVswXTsKKwkJCWJyZWFrOworCQljYXNlIEhUX01DUzBfTUNTNzoKKwkJCXZhbHVlID0gcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfNWdbcGF0aF1bdHhudW1dWzFdOworCQkJYnJlYWs7CisJCWNhc2UgSFRfTUNTOF9NQ1MxNToKKwkJCXZhbHVlID0gcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfNWdbcGF0aF1bdHhudW1dWzJdOworCQkJYnJlYWs7CisJCWNhc2UgVkhUXzFTU01DUzBfMVNTTUNTOToKKwkJCXZhbHVlID0gcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfNWdbcGF0aF1bdHhudW1dWzNdOworCQkJYnJlYWs7CisJCWNhc2UgVkhUXzJTU01DUzBfMlNTTUNTOToKKwkJCXZhbHVlID0gcnRscGh5LT50eHB3cl9ieV9yYXRlX2Jhc2VfNWdbcGF0aF1bdHhudW1dWzRdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSgiSW52YWxpZCBSYXRlU2VjdGlvbiAlZCBpbiBCYW5kIDVHLCBSZiBQYXRoICVkLCIKKwkJCQkiICVkVHggaW4gUEhZX0dldFR4UG93ZXJCeVJhdGVCYXNlKClcbiIsCisJCQkJcmF0ZV9zZWN0aW9uLCBwYXRoLCB0eG51bSkpOworCQkJYnJlYWs7CisJCX07CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSgiSW52YWxpZCBCYW5kICVkIGluIFBIWV9HZXRUeFBvd2VyQnlSYXRlQmFzZSgpXG4iLCBiYW5kKSk7CisJfQorCisJcmV0dXJuIHZhbHVlOworCit9Cit2b2lkIF9ydGw4ODIxYWVfcGh5X3N0b3JlX3R4cG93ZXJfYnlfcmF0ZV9iYXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXUxNiByYXdWYWx1ZSA9IDA7CisJdTggYmFzZSA9IDAsIHBhdGggPSAwOworCisJZm9yIChwYXRoID0gUkY5MF9QQVRIX0E7IHBhdGggPD0gUkY5MF9QQVRIX0I7ICsrcGF0aCkgeworCQlyYXdWYWx1ZSA9ICh1MTYpIChydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcGF0aF1bUkZfMVRYXVswXSA+PiAyNCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fMl80RywgcGF0aCwgQ0NLLCBSRl8xVFgsIGJhc2UpOworCisJCXJhd1ZhbHVlID0gKHUxNikgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtwYXRoXVtSRl8xVFhdWzJdID4+IDI0KSAmIDB4RkY7CisJCWJhc2UgPSAocmF3VmFsdWUgPj4gNCkgKiAxMCArIChyYXdWYWx1ZSAmIDB4Rik7CisJCV9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCBwYXRoLCBPRkRNLCBSRl8xVFgsIGJhc2UgKTsKKworCQlyYXdWYWx1ZSA9ICh1MTYpIChydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcGF0aF1bUkZfMVRYXVs0XSA+PiAyNCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fMl80RywgcGF0aCwgSFRfTUNTMF9NQ1M3LCBSRl8xVFgsIGJhc2UgKTsKKworCQlyYXdWYWx1ZSA9ICh1MTYpIChydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcGF0aF1bUkZfMlRYXVs2XSA+PiAyNCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fMl80RywgcGF0aCwgSFRfTUNTOF9NQ1MxNSwgUkZfMlRYLCBiYXNlICk7CisKKwkJcmF3VmFsdWUgPSAodTE2KSAocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzJfNEddW3BhdGhdW1JGXzFUWF1bOF0gPj4gMjQpICYgMHhGRjsKKwkJYmFzZSA9IChyYXdWYWx1ZSA+PiA0KSAqIDEwICsgKHJhd1ZhbHVlICYgMHhGKTsKKwkJX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfYnlfcmF0ZV9iYXNlKGh3LCBCQU5EX09OXzJfNEcsIHBhdGgsIFZIVF8xU1NNQ1MwXzFTU01DUzksIFJGXzFUWCwgYmFzZSApOworCisJCXJhd1ZhbHVlID0gKHUxNikgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtwYXRoXVtSRl8yVFhdWzExXSA+PiA4KSAmIDB4RkY7CisJCWJhc2UgPSAocmF3VmFsdWUgPj4gNCkgKiAxMCArIChyYXdWYWx1ZSAmIDB4Rik7CisJCV9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCBwYXRoLCBWSFRfMlNTTUNTMF8yU1NNQ1M5LCBSRl8yVFgsIGJhc2UgKTsKKworCQlyYXdWYWx1ZSA9ICh1MTYpIChydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3BhdGhdW1JGXzFUWF1bMl0gPj4gMjQpICYgMHhGRjsKKwkJYmFzZSA9IChyYXdWYWx1ZSA+PiA0KSAqIDEwICsgKHJhd1ZhbHVlICYgMHhGKTsKKwkJX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfYnlfcmF0ZV9iYXNlKGh3LCBCQU5EX09OXzVHLCBwYXRoLCBPRkRNLCBSRl8xVFgsIGJhc2UgKTsKKworCQlyYXdWYWx1ZSA9ICh1MTYpIChydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3BhdGhdW1JGXzFUWF1bNF0gPj4gMjQpICYgMHhGRjsKKwkJYmFzZSA9IChyYXdWYWx1ZSA+PiA0KSAqIDEwICsgKHJhd1ZhbHVlICYgMHhGKTsKKwkJX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfYnlfcmF0ZV9iYXNlKGh3LCBCQU5EX09OXzVHLCBwYXRoLCBIVF9NQ1MwX01DUzcsIFJGXzFUWCwgYmFzZSApOworCisJCXJhd1ZhbHVlID0gKHUxNikgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcGF0aF1bUkZfMlRYXVs2XSA+PiAyNCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fNUcsIHBhdGgsIEhUX01DUzhfTUNTMTUsIFJGXzJUWCwgYmFzZSApOworCisJCXJhd1ZhbHVlID0gKHUxNikgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcGF0aF1bUkZfMVRYXVs4XSA+PiAyNCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fNUcsIHBhdGgsIFZIVF8xU1NNQ1MwXzFTU01DUzksIFJGXzFUWCwgYmFzZSApOworCisJCXJhd1ZhbHVlID0gKHUxNikgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcGF0aF1bUkZfMlRYXVsxMV0gPj4gOCkgJiAweEZGOworCQliYXNlID0gKHJhd1ZhbHVlID4+IDQpICogMTAgKyAocmF3VmFsdWUgJiAweEYpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fNUcsIHBhdGgsIFZIVF8yU1NNQ1MwXzJTU01DUzksIFJGXzJUWCwgYmFzZSApOworCX0KK30KKwordm9pZCBfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUodTMyICpkYXRhLCB1OCBzdGFydCwKKwkJCQkJCQkJCQkJCQkJCQl1OCBlbmQsIHU4IGJhc2VfdmFsKQoreworCWNoYXIgaSA9IDA7CisJdTggdGVtcF92YWx1ZSA9IDA7CisJdTMyIHRlbXBfZGF0YSA9IDA7CisKKwlmb3IgKGkgPSAzOyBpID49IDA7IC0taSkKKwl7CisJCWlmIChpID49IHN0YXJ0ICYmIGkgPD0gZW5kKSB7CisJCQkvLyBHZXQgdGhlIGV4YWN0IHZhbHVlCisJCQl0ZW1wX3ZhbHVlID0gKHU4KSAoKmRhdGEgPj4gKGkgKiA4KSkgJiAweEY7CisJCQl0ZW1wX3ZhbHVlICs9ICgodTgpICgoKmRhdGEgPj4gKGkgKiA4ICsgNCkpICYgMHhGKSkgKiAxMDsKKworCQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSB0byBhIHJlbGF0aXZlIHZhbHVlCisJCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPiBiYXNlX3ZhbCkgPyB0ZW1wX3ZhbHVlIC0gYmFzZV92YWwgOiBiYXNlX3ZhbCAtIHRlbXBfdmFsdWU7CisJCX0gZWxzZSB7CisJCQl0ZW1wX3ZhbHVlID0gKHU4KSAoKmRhdGEgPj4gKGkgKiA4KSkgJiAweEZGOworCQl9CisJCXRlbXBfZGF0YSA8PD0gODsKKwkJdGVtcF9kYXRhIHw9IHRlbXBfdmFsdWU7CisJfQorCSpkYXRhID0gdGVtcF9kYXRhOworfQorCit2b2lkIF9ydGw4ODIxYWVfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggYmFzZSA9IDAsIHJmUGF0aCA9IDA7CisKKwlmb3IgKHJmUGF0aCA9IFJGOTBfUEFUSF9BOyByZlBhdGggPD0gUkY5MF9QQVRIX0I7ICsrcmZQYXRoKSB7CisJCWJhc2UgPSBfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fMl80RywgcmZQYXRoLCBSRl8xVFgsIENDSyk7CisJCVJUX0RJU1AoIEZQSFksIFBIWV9UWFBXUiwgKCAiYmFzZSBvZiAyLjRHIENDSyAxVFg6ICVkXG4iLCBiYXNlICkgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8xVFhdWzBdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCByZlBhdGgsIFJGXzFUWCwgT0ZETSApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgMi40RyBPRkRNIDFUWDogJWRcbiIsIGJhc2UgKSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtyZlBhdGhdW1JGXzFUWF1bMV0gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8xVFhdWzJdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCByZlBhdGgsIFJGXzFUWCwgSFRfTUNTMF9NQ1M3ICk7CisJCVJUX0RJU1AoIEZQSFksIFBIWV9UWFBXUiwgKCAiYmFzZSBvZiAyLjRHIEhUTUNTMC03IDFUWDogJWRcbiIsIGJhc2UgKSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtyZlBhdGhdW1JGXzFUWF1bM10gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8xVFhdWzRdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCByZlBhdGgsIFJGXzJUWCwgSFRfTUNTOF9NQ1MxNSApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgMi40RyBIVE1DUzgtMTUgMlRYOiAlZFxuIiwgYmFzZSApICk7CisKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8yVFhdWzVdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8yVFhdWzZdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCByZlBhdGgsIFJGXzFUWCwgVkhUXzFTU01DUzBfMVNTTUNTOSApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgMi40RyBWSFQxU1NNQ1MwLTkgMVRYOiAlZFxuIiwgYmFzZSApICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzJfNEddW3JmUGF0aF1bUkZfMVRYXVs3XSApLAorCQkJMCwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtyZlBhdGhdW1JGXzFUWF1bOF0gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fMl80R11bcmZQYXRoXVtSRl8xVFhdWzldICksCisJCQkwLCAxLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl8yXzRHLCByZlBhdGgsIFJGXzJUWCwgVkhUXzJTU01DUzBfMlNTTUNTOSApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgMi40RyBWSFQyU1NNQ1MwLTkgMlRYOiAlZFxuIiwgYmFzZSApICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzJfNEddW3JmUGF0aF1bUkZfMVRYXVs5XSApLAorCQkJMiwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl8yXzRHXVtyZlBhdGhdW1JGXzJUWF1bMTBdICksCisJCQkwLCAzLCBiYXNlICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzJfNEddW3JmUGF0aF1bUkZfMlRYXVsxMV0gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKworCQliYXNlID0gX3J0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfYnlfcmF0ZV9iYXNlKGh3LCBCQU5EX09OXzVHLCByZlBhdGgsIFJGXzFUWCwgT0ZETSApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgNUcgT0ZETSAxVFg6ICVkXG4iLCBiYXNlICkgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3JmUGF0aF1bUkZfMVRYXVsxXSApLAorCQkJMCwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcmZQYXRoXVtSRl8xVFhdWzJdICksCisJCQkwLCAzLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl81RywgcmZQYXRoLCBSRl8xVFgsIEhUX01DUzBfTUNTNyApOworCQlSVF9ESVNQKCBGUEhZLCBQSFlfVFhQV1IsICggImJhc2Ugb2YgNUcgSFRNQ1MwLTcgMVRYOiAlZFxuIiwgYmFzZSApICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzVHXVtyZlBhdGhdW1JGXzFUWF1bM10gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3JmUGF0aF1bUkZfMVRYXVs0XSApLAorCQkJMCwgMywgYmFzZSApOworCisJCWJhc2UgPSBfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fNUcsIHJmUGF0aCwgUkZfMlRYLCBIVF9NQ1M4X01DUzE1ICk7CisJCVJUX0RJU1AoIEZQSFksIFBIWV9UWFBXUiwgKCAiYmFzZSBvZiA1RyBIVE1DUzgtMTUgMlRYOiAlZFxuIiwgYmFzZSApICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzVHXVtyZlBhdGhdW1JGXzJUWF1bNV0gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3JmUGF0aF1bUkZfMlRYXVs2XSApLAorCQkJMCwgMywgYmFzZSApOworCisJCWJhc2UgPSBfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9ieV9yYXRlX2Jhc2UoaHcsIEJBTkRfT05fNUcsIHJmUGF0aCwgUkZfMVRYLCBWSFRfMVNTTUNTMF8xU1NNQ1M5ICk7CisJCVJUX0RJU1AoIEZQSFksIFBIWV9UWFBXUiwgKCAiYmFzZSBvZiA1RyBWSFQxU1NNQ1MwLTkgMVRYOiAlZFxuIiwgYmFzZSApICk7CisJCV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgKKwkJCSYocnRscGh5LT50eF9wb3dlcl9ieV9yYXRlX29mZnNldFtCQU5EX09OXzVHXVtyZlBhdGhdW1JGXzFUWF1bN10gKSwKKwkJCTAsIDMsIGJhc2UgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3JmUGF0aF1bUkZfMVRYXVs4XSApLAorCQkJMCwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcmZQYXRoXVtSRl8xVFhdWzldICksCisJCQkwLCAxLCBiYXNlICk7CisKKwkJYmFzZSA9IF9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2J5X3JhdGVfYmFzZShodywgQkFORF9PTl81RywgcmZQYXRoLCBSRl8yVFgsIFZIVF8yU1NNQ1MwXzJTU01DUzkgKTsKKwkJUlRfRElTUCggRlBIWSwgUEhZX1RYUFdSLCAoICJiYXNlIG9mIDVHIFZIVDJTU01DUzAtOSAyVFg6ICVkXG4iLCBiYXNlICkgKTsKKwkJX3BoeV9jb252ZXJ0X3R4cG93ZXJfZGJtX3RvX3JlbGF0aXZlX3ZhbHVlKAorCQkJJihydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W0JBTkRfT05fNUddW3JmUGF0aF1bUkZfMVRYXVs5XSApLAorCQkJMiwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcmZQYXRoXVtSRl8yVFhdWzEwXSApLAorCQkJMCwgMywgYmFzZSApOworCQlfcGh5X2NvbnZlcnRfdHhwb3dlcl9kYm1fdG9fcmVsYXRpdmVfdmFsdWUoCisJCQkmKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbQkFORF9PTl81R11bcmZQYXRoXVtSRl8yVFhdWzExXSApLAorCQkJMCwgMywgYmFzZSApOworCX0KKworCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19UUkFDRSwKKwkJKCI8PT09X3J0bDg4MjFhZV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZSgpXG4iKSk7CisKK30KKwordm9pZCBfcnRsODgyMWFlX3BoeV90eHBvd2VyX2J5X3JhdGVfY29uZmlndXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlfcnRsODgyMWFlX3BoeV9zdG9yZV90eHBvd2VyX2J5X3JhdGVfYmFzZShodyk7CisJX3J0bDg4MjFhZV9waHlfY29udmVydF90eHBvd2VyX2RibV90b19yZWxhdGl2ZV92YWx1ZShodyk7Cit9CisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfcGh5X2JiODgyMWFfY29uZmlnX3BhcmFmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlib29sIHJ0c3RhdHVzOworCisJLypUWCBQT1dFUiBMSU1JVAorCSAgICBQSFlfSW5pdFR4UG93ZXJMaW1pdAorCSAgICBQSFlfQ29uZmlnUkZXaXRoQ3VzdG9tUG93ZXJMaW1pdFRhYmxlUGFyYUZpbGUqLworCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJCXJ0c3RhdHVzID0gX3J0bDg4MTJhZV9waHlfY29uZmlnX2JiX3dpdGhfaGVhZGVyZmlsZShodywKKwkJCQkJCQkJQkFTRUJBTkRfQ09ORklHX1BIWV9SRUcpOworCWVsc2V7CisJCXJ0c3RhdHVzID0gX3J0bDg4MjFhZV9waHlfY29uZmlnX2JiX3dpdGhfaGVhZGVyZmlsZShodywKKwkJCQkJCQkJQkFTRUJBTkRfQ09ORklHX1BIWV9SRUcpOworCX0KKwlpZiAocnRzdGF0dXMgIT0gdHJ1ZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAoIldyaXRlIEJCIFJlZyBGYWlsISEiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJX3J0bDg4MjFhZV9waHlfaW5pdF90eF9wb3dlcl9ieV9yYXRlKGh3KTsKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnID09IGZhbHNlKSB7CisJCS8vcnRscGh5LT5wd3Jncm91cF9jbnQgPSAwOworCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJcnRzdGF0dXMgPSBfcnRsODgxMmFlX3BoeV9jb25maWdfYmJfd2l0aF9wZ2hlYWRlcmZpbGUoaHcsCisJCQkJCQkJCSAgIEJBU0VCQU5EX0NPTkZJR19QSFlfUkVHKTsKKwkJZWxzZXsKKwkJCXJ0c3RhdHVzID0gX3J0bDg4MjFhZV9waHlfY29uZmlnX2JiX3dpdGhfcGdoZWFkZXJmaWxlKGh3LAorCQkJCQkJCQkgICBCQVNFQkFORF9DT05GSUdfUEhZX1JFRyk7CisJCX0KKwl9CisJaWYgKHJ0c3RhdHVzICE9IHRydWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywgKCJCQl9QRyBSZWcgRmFpbCEhIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJX3J0bDg4MjFhZV9waHlfdHhwb3dlcl9ieV9yYXRlX2NvbmZpZ3VyYXRpb24oaHcpOworCisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSkKKwkJcnRzdGF0dXMgPSBfcnRsODgxMmFlX3BoeV9jb25maWdfYmJfd2l0aF9oZWFkZXJmaWxlKGh3LAorCQkJCQkJCSBCQVNFQkFORF9DT05GSUdfQUdDX1RBQik7CisJZWxzZQorCQlydHN0YXR1cyA9IF9ydGw4ODIxYWVfcGh5X2NvbmZpZ19iYl93aXRoX2hlYWRlcmZpbGUoaHcsCisJCQkJCQkJIEJBU0VCQU5EX0NPTkZJR19BR0NfVEFCKTsKKworCWlmIChydHN0YXR1cyAhPSB0cnVlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsICgiQUdDIFRhYmxlIEZhaWxcbiIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlydGxwaHktPmJjY2tfaGlnaF9wb3dlciA9IChib29sKSAocnRsX2dldF9iYnJlZyhodywKKwkJCQkJCQlSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjIsCisJCQkJCQkJMHgyMDApKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgX3J0bDg4MTJhZV9waHlfY29uZmlnX21hY193aXRoX2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBpLCB2MSwgdjI7CisJdTMyIGFycmF5bGVuZ3RoOworCXUzMiAqcHRyYXJyYXk7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwgKCJSZWFkIHJ0bDg4MTJBRV9NQUNfUkVHX0FycmF5XG4iKSk7CisJYXJyYXlsZW5ndGggPSBSVEw4ODEyQUVNQUNfMVRfQVJSQVlMRU47CisJcHRyYXJyYXkgPSBSVEw4ODEyQUVfTUFDX1JFR19BUlJBWTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJJbWc6UlRMODgxMkFFX01BQ19SRUdfQVJSQVkgTEVOICVkXG4iLGFycmF5bGVuZ3RoKSk7CisJZm9yIChpID0gMDsgaSA8IGFycmF5bGVuZ3RoOyBpICs9IDIpIHsKKwkJdjEgPSBwdHJhcnJheVtpXTsKKwkJdjIgPSAodTgpIHB0cmFycmF5W2kgKyAxXTsKKwkJaWYgKHYxPDB4Q0RDRENEQ0QpIHsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHYxLCAodTgpIHYyKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKSB7CisJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCVJFQURfTkVYVF9QQUlSKHB0cmFycmF5LCB2MSwgdjIsIGkpOworCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgYXJyYXlsZW5ndGggLTIpCisJCQkJCVJFQURfTkVYVF9QQUlSKHB0cmFycmF5LCB2MSwgdjIsIGkpOworCisJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQl9IGVsc2Ugey8qQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuKi8KKwkJCQlSRUFEX05FWFRfUEFJUihwdHJhcnJheSwgdjEsIHYyLCBpKTsKKwkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCisJCQkJCSAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuZ3RoIC0yKSB7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsdjEsdjIpOworCQkJCQlSRUFEX05FWFRfUEFJUihwdHJhcnJheSwgdjEsIHYyLCBpKTsKKwkJCQl9CisKKwkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBhcnJheWxlbmd0aCAtMikKKwkJCQkJUkVBRF9ORVhUX1BBSVIocHRyYXJyYXksIHYxLCB2MiwgaSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfcGh5X2NvbmZpZ19tYWNfd2l0aF9oZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaSwgdjEsIHYyOworCXUzMiBhcnJheWxlbmd0aDsKKwl1MzIgKnB0cmFycmF5OworCisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsICgiUmVhZCBydGw4ODIxQUVfTUFDX1JFR19BcnJheVxuIikpOworCWFycmF5bGVuZ3RoID0gUlRMODgyMUFFTUFDXzFUX0FSUkFZTEVOOworCXB0cmFycmF5ID0gUlRMODgyMUFFX01BQ19SRUdfQVJSQVk7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiSW1nOlJUTDg4MjFBRV9NQUNfUkVHX0FSUkFZIExFTiAlZFxuIixhcnJheWxlbmd0aCkpOworCWZvciAoaSA9IDA7IGkgPCBhcnJheWxlbmd0aDsgaSArPSAyKSB7CisJCXYxID0gcHRyYXJyYXlbaV07CisJCXYyID0gKHU4KSBwdHJhcnJheVtpICsgMV07CisJCWlmICh2MTwweENEQ0RDRENEKSB7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCB2MSwgKHU4KSB2Mik7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICghX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKSB7CisJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCVJFQURfTkVYVF9QQUlSKHB0cmFycmF5LCB2MSwgdjIsIGkpOworCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgYXJyYXlsZW5ndGggLTIpCisJCQkJCVJFQURfTkVYVF9QQUlSKHB0cmFycmF5LCB2MSwgdjIsIGkpOworCisJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQl9IGVsc2Ugey8qQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuKi8KKwkJCQlSRUFEX05FWFRfUEFJUihwdHJhcnJheSwgdjEsIHYyLCBpKTsKKwkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCisJCQkJCSAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuZ3RoIC0yKSB7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsdjEsdjIpOworCQkJCQlSRUFEX05FWFRfUEFJUihwdHJhcnJheSwgdjEsIHYyLCBpKTsKKwkJCQl9CisKKwkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBhcnJheWxlbmd0aCAtMikKKwkJCQkJUkVBRF9ORVhUX1BBSVIocHRyYXJyYXksIHYxLCB2MiwgaSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIF9ydGw4ODEyYWVfcGh5X2NvbmZpZ19iYl93aXRoX2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgIHU4IGNvbmZpZ3R5cGUpCit7CisJaW50IGk7CisJdTMyICphcnJheV90YWJsZTsKKwl1MTYgYXJyYXlsZW47CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiB2MSA9IDAsIHYyID0gMDsKKworCWlmIChjb25maWd0eXBlID09IEJBU0VCQU5EX0NPTkZJR19QSFlfUkVHKSB7CisJCWFycmF5bGVuID0gUlRMODgxMkFFUEhZX1JFR18xVEFSUkFZTEVOOworCQlhcnJheV90YWJsZSA9IFJUTDg4MTJBRV9QSFlfUkVHX0FSUkFZOworCisJCWZvciAoaSA9IDA7IGkgPCBhcnJheWxlbjsgaSArPSAyKSB7CisJCQl2MSA9IGFycmF5X3RhYmxlW2ldOworCQkJdjIgPSBhcnJheV90YWJsZVtpKzFdOworCQkJaWYgKHYxPDB4Q0RDRENEQ0QpIHsKKwkJCQlfcnRsODgxMmFlX2NvbmZpZ19iYl9yZWcoaHcsIHYxLCB2Mik7CisJCQkJY29udGludWU7CisJCQl9IGVsc2Ugey8qVGhpcyBsaW5lIGlzIHRoZSBzdGFydCBsaW5lIG9mIGJyYW5jaC4qLworCQkJCWlmICghX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKSB7CisJCQkJCS8qRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzKi8KKwkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKwkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuIC0yKQorCQkJCQkgICAgUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKworCQkJCQlpIC09IDI7IC8qIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyKi8KKwkJCQl9IGVsc2Ugey8qQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuKi8KKwkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKwkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuIC0yKSB7CisJCQkJCQlfcnRsODgxMmFlX2NvbmZpZ19iYl9yZWcoaHcsdjEsdjIpOworCQkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKwkJCQkJfQorCisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IGFycmF5bGVuIC0yKQorCQkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGNvbmZpZ3R5cGUgPT0gQkFTRUJBTkRfQ09ORklHX0FHQ19UQUIpIHsKKwkJCWFycmF5bGVuID0gUlRMODgxMkFFQUdDVEFCXzFUQVJSQVlMRU47CisJCQlhcnJheV90YWJsZSA9IFJUTDg4MTJBRV9BR0NfVEFCX0FSUkFZOworCisJCQlmb3IgKGkgPSAwOyBpIDwgYXJyYXlsZW47IGkgPSBpICsgMikgeworCQkJCXYxID0gYXJyYXlfdGFibGVbaV07CisJCQkJdjIgPSBhcnJheV90YWJsZVtpKzFdOworCQkJCWlmICh2MSA8IDB4Q0RDRENEQ0QpIHsKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgdjEsIE1BU0tEV09SRCwgdjIpOworCQkJCQl1ZGVsYXkoMSk7CisJCQkJCWNvbnRpbnVlOworCQkJICAgIH0gZWxzZSB7LypUaGlzIGxpbmUgaXMgdGhlIHN0YXJ0IGxpbmUgb2YgYnJhbmNoLiovCisJCQkJCWlmICghX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKSB7CisJCQkJCQkvKkRpc2NhcmQgdGhlIGZvbGxvd2luZyAob2Zmc2V0LCBkYXRhKSBwYWlycyovCisJCQkJCQlSRUFEX05FWFRfUEFJUihhcnJheV90YWJsZSx2MSwgdjIsIGkpOworCQkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgYXJyYXlsZW4gLTIpCisJCQkJCQkgICAgUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsdjEsIHYyLCBpKTsKKworCQkJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQkJCX1lbHNley8qQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuKi8KKwkJCQkJCVJFQURfTkVYVF9QQUlSKGFycmF5X3RhYmxlLHYxLCB2MiwgaSk7CisJCQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCisJCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBhcnJheWxlbiAtMikKKwkJCQkJCXsKKwkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCB2MSwgTUFTS0RXT1JELCB2Mik7CisJCQkJCQkJdWRlbGF5KDEpOworCQkJCQkJCVJFQURfTkVYVF9QQUlSKGFycmF5X3RhYmxlLHYxLCB2MiwgaSk7CisJCQkJCQl9CisKKwkJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IGFycmF5bGVuIC0yKQorCQkJCQkJCVJFQURfTkVYVF9QQUlSKGFycmF5X3RhYmxlLHYxLCB2MiwgaSk7CisJCQkJCX0KKwkJCQl9CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJICgiVGhlIGFnY3RhYl9hcnJheV90YWJsZVswXSBpcyAiCisJCQkJICAiJXggUnRsODE4RUVQSFlfUkVHQXJyYXlbMV0gaXMgJXggXG4iLAorCQkJCSAgYXJyYXlfdGFibGVbaV0sCisJCQkJICBhcnJheV90YWJsZVtpICsgMV0pKTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgX3J0bDg4MjFhZV9waHlfY29uZmlnX2JiX3dpdGhfaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCSAgdTggY29uZmlndHlwZSkKK3sKKwlpbnQgaTsKKwl1MzIgKmFycmF5X3RhYmxlOworCXUxNiBhcnJheWxlbjsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIHYxID0gMCwgdjIgPSAwOworCisJaWYgKGNvbmZpZ3R5cGUgPT0gQkFTRUJBTkRfQ09ORklHX1BIWV9SRUcpIHsKKwkJYXJyYXlsZW4gPSBSVEw4ODIxQUVQSFlfUkVHXzFUQVJSQVlMRU47CisJCWFycmF5X3RhYmxlID0gUlRMODgyMUFFX1BIWV9SRUdfQVJSQVk7CisKKwkJZm9yIChpID0gMDsgaSA8IGFycmF5bGVuOyBpICs9IDIpIHsKKwkJCXYxID0gYXJyYXlfdGFibGVbaV07CisJCQl2MiA9IGFycmF5X3RhYmxlW2krMV07CisJCQlpZiAodjE8MHhDRENEQ0RDRCkgeworCQkJCV9ydGw4ODIxYWVfY29uZmlnX2JiX3JlZyhodywgdjEsIHYyKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7LypUaGlzIGxpbmUgaXMgdGhlIHN0YXJ0IGxpbmUgb2YgYnJhbmNoLiovCisJCQkJaWYgKCFfcnRsODgyMWFlX2NoZWNrX2NvbmRpdGlvbihodyx2MSkpIHsKKwkJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCQlSRUFEX05FWFRfUEFJUihhcnJheV90YWJsZSwgdjEsIHYyLCBpKTsKKwkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuIC0yKQorCQkJCQkgICAgUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsIHYxLCB2MiwgaSk7CisKKwkJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQkJfSBlbHNlIHsvKkNvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiovCisJCQkJCVJFQURfTkVYVF9QQUlSKGFycmF5X3RhYmxlLCB2MSwgdjIsIGkpOworCQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCisJCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgYXJyYXlsZW4gLTIpIHsKKwkJCQkJCV9ydGw4ODIxYWVfY29uZmlnX2JiX3JlZyhodyx2MSx2Mik7CisJCQkJCQlSRUFEX05FWFRfUEFJUihhcnJheV90YWJsZSwgdjEsIHYyLCBpKTsKKwkJCQkJfQorCisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IGFycmF5bGVuIC0yKQorCQkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsIHYxLCB2MiwgaSk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChjb25maWd0eXBlID09IEJBU0VCQU5EX0NPTkZJR19BR0NfVEFCKSB7CisJCQlhcnJheWxlbiA9IFJUTDg4MjFBRUFHQ1RBQl8xVEFSUkFZTEVOOworCQkJYXJyYXlfdGFibGUgPSBSVEw4ODIxQUVfQUdDX1RBQl9BUlJBWTsKKworCQkJZm9yIChpID0gMDsgaSA8IGFycmF5bGVuOyBpID0gaSArIDIpIHsKKwkJCQl2MSA9IGFycmF5X3RhYmxlW2ldOworCQkJCXYyID0gYXJyYXlfdGFibGVbaSsxXTsKKwkJCQlpZiAodjEgPCAweENEQ0RDRENEKSB7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIHYxLCBNQVNLRFdPUkQsIHYyKTsKKwkJCQkJdWRlbGF5KDEpOworCQkJCQljb250aW51ZTsKKwkJCSAgICB9IGVsc2Ugey8qVGhpcyBsaW5lIGlzIHRoZSBzdGFydCBsaW5lIG9mIGJyYW5jaC4qLworCQkJCQlpZiAoIV9ydGw4ODIxYWVfY2hlY2tfY29uZGl0aW9uKGh3LHYxKSkgeworCQkJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsIHYxLCB2MiwgaSk7CisJCQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCisJCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBhcnJheWxlbiAtMikKKwkJCQkJCSAgICBSRUFEX05FWFRfUEFJUihhcnJheV90YWJsZSwgdjEsIHYyLCBpKTsKKworCQkJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQkJCX1lbHNley8qQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuKi8KKwkJCQkJCVJFQURfTkVYVF9QQUlSKGFycmF5X3RhYmxlLCB2MSwgdjIsIGkpOworCQkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgYXJyYXlsZW4gLTIpCisJCQkJCQl7CisJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgdjEsIE1BU0tEV09SRCwgdjIpOworCQkJCQkJCXVkZWxheSgxKTsKKwkJCQkJCQlSRUFEX05FWFRfUEFJUihhcnJheV90YWJsZSwgdjEsIHYyLCBpKTsKKwkJCQkJCX0KKworCQkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgYXJyYXlsZW4gLTIpCisJCQkJCQkJUkVBRF9ORVhUX1BBSVIoYXJyYXlfdGFibGUsIHYxLCB2MiwgaSk7CisJCQkJCX0KKwkJCQl9CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJICgiVGhlIGFnY3RhYl9hcnJheV90YWJsZVswXSBpcyAiCisJCQkJICAiJXggUnRsODE4RUVQSFlfUkVHQXJyYXlbMV0gaXMgJXggXG4iLAorCQkJCSAgYXJyYXlfdGFibGVbaV0sCisJCQkJICBhcnJheV90YWJsZVtpICsgMV0pKTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHU4IF9ydGw4ODIxYWVfZ2V0X3JhdGVfc2VsZWN0aW9uX2luZGV4KHUzMiByZWdhZGRyKQoreworCXU4IGluZGV4ID0gMDsKKworCXJlZ2FkZHIgJj0gMHhGRkY7CisJaWYgKHJlZ2FkZHIgPj0gMHhDMjAgJiYgcmVnYWRkciA8PSAweEM0QykKKwkJaW5kZXggPSAodTgpICgocmVnYWRkciAtIDB4QzIwKSAvIDQpOworCWVsc2UgaWYgKHJlZ2FkZHIgPj0gMHhFMjAgJiYgcmVnYWRkciA8PSAweEU0QykKKwkJaW5kZXggPSAodTgpICgocmVnYWRkciAtIDB4RTIwKSAvIDQpOworCWVsc2UKKwkJUlRfQVNTRVJUKCFDT01QX0lOSVQsCisJCQkoIkludmFsaWQgUmVnQWRkciAweCV4IGluIgorCQkJICJQSFlfR2V0UmF0ZVNlY3Rpb25JbmRleE9mVHhQb3dlckJ5UmF0ZSgpXG4iLHJlZ2FkZHIpKTsKKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9zdG9yZV90eF9wb3dlcl9ieV9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJICAgCQkJCQkJCQkgdTMyIGJhbmQsIHUzMiByZnBhdGgsCisJCQkJCQkgICAJCQkJCQkJCSB1MzIgdHhudW0sIHUzMiByZWdhZGRyLAorCQkJCQkJICAgCQkJCQkJCQkgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IHJhdGVfc2VjdGlvbiA9IF9ydGw4ODIxYWVfZ2V0X3JhdGVfc2VsZWN0aW9uX2luZGV4KHJlZ2FkZHIpOworCisJaWYgKGJhbmQgIT0gQkFORF9PTl8yXzRHICYmIGJhbmQgIT0gQkFORF9PTl81RykKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfV0FSTklORywgKCJJbnZhbGlkIEJhbmQgJWRcbiIsIGJhbmQpKTsKKworCWlmIChyZnBhdGggPiBNQVhfUkZfUEFUSCkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfV0FSTklORywgKCJJbnZhbGlkIFJmUGF0aCAlZFxuIiwgcmZwYXRoKSk7CisKKwlpZiAodHhudW0gPiBNQVhfUkZfUEFUSCkKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfV0FSTklORywgKCJJbnZhbGlkIFR4TnVtICVkXG4iLCB0eG51bSApICk7CisKKwlydGxwaHktPnR4X3Bvd2VyX2J5X3JhdGVfb2Zmc2V0W2JhbmRdW3JmcGF0aF1bdHhudW1dW3JhdGVfc2VjdGlvbl0gPSBkYXRhOworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1dBUk5JTkcsKCAicEhhbERhdGEtPlR4UHdyQnlSYXRlT2Zmc2V0W0JhbmQgJWRdW1JmUGF0aCAlZF1bVHhOdW0gJWRdW1JhdGVTZWN0aW9uICVkXSA9IDB4JXhcbiIsCisJCQliYW5kLCByZnBhdGgsIHR4bnVtLCByYXRlX3NlY3Rpb24sIHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbYmFuZF1bcmZwYXRoXVt0eG51bV1bcmF0ZV9zZWN0aW9uXSkpOworCit9CisKK3N0YXRpYyBib29sIF9ydGw4ODEyYWVfcGh5X2NvbmZpZ19iYl93aXRoX3BnaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCSAgIAkJCQkJCQkJCQkJIHU4IGNvbmZpZ3R5cGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCBpOworCXUzMiAqcGh5X3JlZ2FycmF5X3RhYmxlX3BnOworCXUxNiBwaHlfcmVnYXJyYXlfcGdfbGVuOworCXUzMiB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2OworCisJcGh5X3JlZ2FycmF5X3BnX2xlbiA9IFJUTDg4MTJBRVBIWV9SRUdfQVJSQVlfUEdMRU47CisJcGh5X3JlZ2FycmF5X3RhYmxlX3BnID0gUlRMODgxMkFFX1BIWV9SRUdfQVJSQVlfUEc7CisKKwlpZiAoY29uZmlndHlwZSA9PSBCQVNFQkFORF9DT05GSUdfUEhZX1JFRykgeworCQlmb3IgKGkgPSAwOyBpIDwgcGh5X3JlZ2FycmF5X3BnX2xlbjsgaSArPSA2KSB7CisJCQl2MSA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpXTsKKwkJCXYyID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krMV07CisJCQl2MyA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpKzJdOworCQkJdjQgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSszXTsKKwkJCXY1ID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krNF07CisJCQl2NiA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpKzVdOworCisJCQlpZiAodjE8MHhDRENEQ0RDRCkgeworCQkJCWlmICggKHY0ID09IDB4ZmUpIHx8ICh2NCA9PSAweGZmZSkpCisJCQkJCW1kZWxheSg1MCk7CisJCQkJZWxzZQorCQkJCQkvKl9ydGw4ODIxYWVfc3RvcmVfcHdySW5kZXhfZGlmZnJhdGVfb2Zmc2V0Ki8KKwkJCQkJX3J0bDg4MjFhZV9zdG9yZV90eF9wb3dlcl9ieV9yYXRlKGh3LCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFfcnRsODgyMWFlX2NoZWNrX2NvbmRpdGlvbihodyx2MSkpIHsgLypkb24ndCBuZWVkIHRoZSBod19ib2R5Ki8KKwkJCSAgICAJaSArPSAyOyAvKiBza2lwIHRoZSBwYWlyIG9mIGV4cHJlc3Npb24qLworCQkJICAgICAgICB2MSA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpXTsKKwkJCSAgICAgICAgdjIgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSsxXTsKKwkJCSAgICAgICAgdjMgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSsyXTsKKwkJCSAgICAgICAgd2hpbGUgKHYyICE9IDB4REVBRCkgeworCQkJICAgICAgICAgICAgaSArPSAzOworCQkJICAgICAgICAgICAgdjEgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV07CisJCQkgICAgICAgICAgICB2MiA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpKzFdOworCQkJICAgICAgICAgICAgdjMgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSsyXTsKKwkJCSAgICAgICAgfQorCQkJICAgIH0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisKKwkJUlRfVFJBQ0UoQ09NUF9TRU5ELCBEQkdfVFJBQ0UsCisJCQkgKCJjb25maWd0eXBlICE9IEJhc2VCYW5kX0NvbmZpZ19QSFlfUkVHXG4iKSk7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBfcnRsODgyMWFlX3BoeV9jb25maWdfYmJfd2l0aF9wZ2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgICAJCQkJCQkJCQkJCSB1OCBjb25maWd0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgaTsKKwl1MzIgKnBoeV9yZWdhcnJheV90YWJsZV9wZzsKKwl1MTYgcGh5X3JlZ2FycmF5X3BnX2xlbjsKKwl1MzIgdjEsIHYyLCB2MywgdjQsIHY1LCB2NjsKKworCXBoeV9yZWdhcnJheV9wZ19sZW4gPSBSVEw4ODIxQUVQSFlfUkVHX0FSUkFZX1BHTEVOOworCXBoeV9yZWdhcnJheV90YWJsZV9wZyA9IFJUTDg4MjFBRV9QSFlfUkVHX0FSUkFZX1BHOworCisJaWYgKGNvbmZpZ3R5cGUgPT0gQkFTRUJBTkRfQ09ORklHX1BIWV9SRUcpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBoeV9yZWdhcnJheV9wZ19sZW47IGkgKz0gNikgeworCQkJdjEgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV07CisJCQl2MiA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpKzFdOworCQkJdjMgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSsyXTsKKwkJCXY0ID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krM107CisJCQl2NSA9IHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpKzRdOworCQkJdjYgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSs1XTsKKworCQkJaWYgKHYxPDB4Q0RDRENEQ0QpIHsKKwkJCQlpZiAodjQgPT0gMHhmZSkKKwkJCQkJbWRlbGF5KDUwKTsKKwkJCQllbHNlIGlmICh2NCA9PSAweGZkKQorCQkJCQltZGVsYXkoNSk7CisJCQkJZWxzZSBpZiAodjQgPT0gMHhmYykKKwkJCQkJbWRlbGF5KDEpOworCQkJCWVsc2UgaWYgKHY0ID09IDB4ZmIpCisJCQkJCXVkZWxheSg1MCk7CisJCQkJZWxzZSBpZiAodjQgPT0gMHhmYSkKKwkJCQkJdWRlbGF5KDUpOworCQkJCWVsc2UgaWYgKHY0ID09IDB4ZjkpCisJCQkJCXVkZWxheSgxKTsKKworCQkJCS8qX3J0bDg4MjFhZV9zdG9yZV9wd3JJbmRleF9kaWZmcmF0ZV9vZmZzZXQqLworCQkJCV9ydGw4ODIxYWVfc3RvcmVfdHhfcG93ZXJfYnlfcmF0ZShodywgdjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKSB7IC8qZG9uJ3QgbmVlZCB0aGUgaHdfYm9keSovCisJCQkgICAgCWkgKz0gMjsgLyogc2tpcCB0aGUgcGFpciBvZiBleHByZXNzaW9uKi8KKwkJCSAgICAgICAgdjEgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV07CisJCQkgICAgICAgIHYyID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krMV07CisJCQkgICAgICAgIHYzID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krMl07CisJCQkgICAgICAgIHdoaWxlICh2MiAhPSAweERFQUQpIHsKKwkJCSAgICAgICAgICAgIGkgKz0gMzsKKwkJCSAgICAgICAgICAgIHYxID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2ldOworCQkJICAgICAgICAgICAgdjIgPSBwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSsxXTsKKwkJCSAgICAgICAgICAgIHYzID0gcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2krMl07CisJCQkgICAgICAgIH0KKwkJCSAgICB9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCisJCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX1RSQUNFLAorCQkJICgiY29uZmlndHlwZSAhPSBCYXNlQmFuZF9Db25maWdfUEhZX1JFR1xuIikpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBydGw4ODEyYWVfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAorCQkJCQkgIAkJCQkJCQkJCSBlbnVtIHJhZGlvX3BhdGggcmZwYXRoKQoreworCSNkZWZpbmUgUkVBRF9ORVhUX1JGX1BBSVJfODgxMihyYWRpb2FfYXJyYXlfdGFibGUsdjEsIHYyLCBpKSBkbyB7IGkgKz0gMjsgdjEgPSByYWRpb2FfYXJyYXlfdGFibGVbaV07IHYyID0gcmFkaW9hX2FycmF5X3RhYmxlW2krMV07IH0gd2hpbGUoMCkKKworCWludCBpOworCWJvb2wgcnRzdGF0dXMgPSB0cnVlOworCXUzMiAqcmFkaW9hX2FycmF5X3RhYmxlX2EsICpyYWRpb2FfYXJyYXlfdGFibGVfYjsKKwl1MTYgcmFkaW9hX2FycmF5bGVuX2EsIHJhZGlvYV9hcnJheWxlbl9iOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgdjEgPSAwLCB2MiA9IDA7CisKKwlyYWRpb2FfYXJyYXlsZW5fYSA9IFJUTDg4MTJBRV9SQURJT0FfMVRBUlJBWUxFTjsKKwlyYWRpb2FfYXJyYXlfdGFibGVfYT0gUlRMODgxMkFFX1JBRElPQV9BUlJBWTsKKwlyYWRpb2FfYXJyYXlsZW5fYj0gUlRMODgxMkFFX1JBRElPQl8xVEFSUkFZTEVOOworCXJhZGlvYV9hcnJheV90YWJsZV9iID0gUlRMODgxMkFFX1JBRElPQl9BUlJBWTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJSYWRpb19BOlJUTDg4MjFBRV9SQURJT0FfQVJSQVkgJWRcbiIscmFkaW9hX2FycmF5bGVuX2EpKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIlJhZGlvIE5vICV4XG4iLCByZnBhdGgpKTsKKwlydHN0YXR1cyA9IHRydWU7CisJc3dpdGNoIChyZnBhdGgpIHsKKwljYXNlIFJGOTBfUEFUSF9BOgorCQlmb3IgKGkgPSAwOyBpIDwgcmFkaW9hX2FycmF5bGVuX2E7IGkgPSBpICsgMikgeworCQkJdjEgPSByYWRpb2FfYXJyYXlfdGFibGVfYVtpXTsKKwkJCXYyID0gcmFkaW9hX2FycmF5X3RhYmxlX2FbaSsxXTsKKwkJCWlmICh2MTwweGNkY2RjZGNkKSB7CisJCQkJX3J0bDg4MjFhZV9jb25maWdfcmZfcmFkaW9fYShodyx2MSx2Mik7CisJCQkJY29udGludWU7CisJCQl9ZWxzZXsvKlRoaXMgbGluZSBpcyB0aGUgc3RhcnQgbGluZSBvZiBicmFuY2guKi8KKwkJCQlpZighX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKXsKKwkJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9hLHYxLCB2MiwgaSk7CisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCByYWRpb2FfYXJyYXlsZW5fYS0yKQorCQkJCQkgICAgUkVBRF9ORVhUX1JGX1BBSVJfODgxMihyYWRpb2FfYXJyYXlfdGFibGVfYSx2MSwgdjIsIGkpOworCisJCQkJCWkgLT0gMjsgLyogcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIqLworCQkJCX0gZWxzZSB7LypDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0byBlbmQgb2YgaWYtZWxzZS4qLworCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9hLHYxLCB2MiwgaSk7CisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCByYWRpb2FfYXJyYXlsZW5fYSAtMikgeworCQkJCQkJX3J0bDg4MjFhZV9jb25maWdfcmZfcmFkaW9fYShodyx2MSx2Mik7CisJCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9hLHYxLCB2MiwgaSk7CisJCQkJCX0KKworCQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCByYWRpb2FfYXJyYXlsZW5fYS0yKQorCQkJCQkJUkVBRF9ORVhUX1JGX1BBSVJfODgxMihyYWRpb2FfYXJyYXlfdGFibGVfYSx2MSwgdjIsIGkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9COgorCQlmb3IgKGkgPSAwOyBpIDwgcmFkaW9hX2FycmF5bGVuX2I7IGkgPSBpICsgMikgeworCQkJdjEgPSByYWRpb2FfYXJyYXlfdGFibGVfYltpXTsKKwkJCXYyID0gcmFkaW9hX2FycmF5X3RhYmxlX2JbaSsxXTsKKwkJCWlmICh2MTwweGNkY2RjZGNkKSB7CisJCQkJX3J0bDg4MjFhZV9jb25maWdfcmZfcmFkaW9fYihodyx2MSx2Mik7CisJCQkJY29udGludWU7CisJCQl9ZWxzZXsvKlRoaXMgbGluZSBpcyB0aGUgc3RhcnQgbGluZSBvZiBicmFuY2guKi8KKwkJCQlpZighX3J0bDg4MjFhZV9jaGVja19jb25kaXRpb24oaHcsdjEpKXsKKwkJCQkJLypEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMqLworCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9iLHYxLCB2MiwgaSk7CisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCByYWRpb2FfYXJyYXlsZW5fYi0yKQorCQkJCQkgICAgUkVBRF9ORVhUX1JGX1BBSVJfODgxMihyYWRpb2FfYXJyYXlfdGFibGVfYix2MSwgdjIsIGkpOworCisJCQkJCWkgLT0gMjsgLyogcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIqLworCQkJCX0gZWxzZSB7LypDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0byBlbmQgb2YgaWYtZWxzZS4qLworCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9iLHYxLCB2MiwgaSk7CisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCByYWRpb2FfYXJyYXlsZW5fYi0yKSB7CisJCQkJCQlfcnRsODgyMWFlX2NvbmZpZ19yZl9yYWRpb19iKGh3LHYxLHYyKTsKKwkJCQkJCVJFQURfTkVYVF9SRl9QQUlSXzg4MTIocmFkaW9hX2FycmF5X3RhYmxlX2IsdjEsIHYyLCBpKTsKKwkJCQkJfQorCisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IHJhZGlvYV9hcnJheWxlbl9iLTIpCisJCQkJCQlSRUFEX05FWFRfUkZfUEFJUl84ODEyKHJhZGlvYV9hcnJheV90YWJsZV9iLHYxLCB2MiwgaSk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0M6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyBcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBSRjkwX1BBVEhfRDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBydGw4ODIxYWVfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAorCQkJCQkgIAkJCQkJCQkJCSBlbnVtIHJhZGlvX3BhdGggcmZwYXRoKQoreworCSNkZWZpbmUgUkVBRF9ORVhUX1JGX1BBSVIodjEsIHYyLCBpKSBkbyB7IGkgKz0gMjsgdjEgPSByYWRpb2FfYXJyYXlfdGFibGVbaV07IHYyID0gcmFkaW9hX2FycmF5X3RhYmxlW2krMV07IH0gd2hpbGUoMCkKKworCWludCBpOworCWJvb2wgcnRzdGF0dXMgPSB0cnVlOworCXUzMiAqcmFkaW9hX2FycmF5X3RhYmxlOworCXUxNiByYWRpb2FfYXJyYXlsZW47CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCS8vc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1MzIgdjEgPSAwLCB2MiA9IDA7CisKKwlyYWRpb2FfYXJyYXlsZW4gPSBSVEw4ODIxQUVfUkFESU9BXzFUQVJSQVlMRU47CisJcmFkaW9hX2FycmF5X3RhYmxlID0gUlRMODgyMUFFX1JBRElPQV9BUlJBWTsKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJSYWRpb19BOlJUTDg4MjFBRV9SQURJT0FfQVJSQVkgJWRcbiIscmFkaW9hX2FycmF5bGVuKSk7CisJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJSYWRpbyBObyAleFxuIiwgcmZwYXRoKSk7CisJcnRzdGF0dXMgPSB0cnVlOworCXN3aXRjaCAocmZwYXRoKSB7CisJY2FzZSBSRjkwX1BBVEhfQToKKwkJZm9yIChpID0gMDsgaSA8IHJhZGlvYV9hcnJheWxlbjsgaSA9IGkgKyAyKSB7CisJCQl2MSA9IHJhZGlvYV9hcnJheV90YWJsZVtpXTsKKwkJCXYyID0gcmFkaW9hX2FycmF5X3RhYmxlW2krMV07CisJCQlpZiAodjE8MHhjZGNkY2RjZCkgeworCQkJCV9ydGw4ODIxYWVfY29uZmlnX3JmX3JhZGlvX2EoaHcsdjEsdjIpOworCQkJfWVsc2V7LypUaGlzIGxpbmUgaXMgdGhlIHN0YXJ0IGxpbmUgb2YgYnJhbmNoLiovCisJCQkJaWYoIV9ydGw4ODIxYWVfY2hlY2tfY29uZGl0aW9uKGh3LHYxKSl7CisJCQkJCS8qRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzKi8KKwkJCQkJUkVBRF9ORVhUX1JGX1BBSVIodjEsIHYyLCBpKTsKKwkJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCisJCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IHJhZGlvYV9hcnJheWxlbiAtMikKKwkJCQkJICAgIFJFQURfTkVYVF9SRl9QQUlSKHYxLCB2MiwgaSk7CisKKwkJCQkJaSAtPSAyOyAvKiBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiovCisJCQkJfSBlbHNlIHsvKkNvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiovCisJCQkJCVJFQURfTkVYVF9SRl9QQUlSKHYxLCB2MiwgaSk7CisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKKwkJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgorCQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCByYWRpb2FfYXJyYXlsZW4gLTIpIHsKKwkJCQkJCV9ydGw4ODIxYWVfY29uZmlnX3JmX3JhZGlvX2EoaHcsdjEsdjIpOworCQkJCQkJUkVBRF9ORVhUX1JGX1BBSVIodjEsIHYyLCBpKTsKKwkJCQkJfQorCisJCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IHJhZGlvYV9hcnJheWxlbiAtMikKKwkJCQkJCVJFQURfTkVYVF9SRl9QQUlSKHYxLCB2MiwgaSk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBSRjkwX1BBVEhfQjoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9DOgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgXG4iKSk7CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0Q6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyBcbiIpKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB0cnVlOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfZ2V0X2h3X3JlZ19vcmlnaW5hbHZhbHVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCisJcnRscGh5LT5kZWZhdWx0X2luaXRpYWxnYWluWzBdID0KKwkgICAgKHU4KSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEFBR0NDT1JFMSwgTUFTS0JZVEUwKTsKKwlydGxwaHktPmRlZmF1bHRfaW5pdGlhbGdhaW5bMV0gPQorCSAgICAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsIFJPRkRNMF9YQkFHQ0NPUkUxLCBNQVNLQllURTApOworCXJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblsyXSA9CisJICAgICh1OCkgcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hDQUdDQ09SRTEsIE1BU0tCWVRFMCk7CisJcnRscGh5LT5kZWZhdWx0X2luaXRpYWxnYWluWzNdID0KKwkgICAgKHU4KSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWERBR0NDT1JFMSwgTUFTS0JZVEUwKTsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkgKCJEZWZhdWx0IGluaXRpYWwgZ2FpbiAoYzUwPTB4JXgsICIKKwkJICAiYzU4PTB4JXgsIGM2MD0weCV4LCBjNjg9MHgleCBcbiIsCisJCSAgcnRscGh5LT5kZWZhdWx0X2luaXRpYWxnYWluWzBdLAorCQkgIHJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblsxXSwKKwkJICBydGxwaHktPmRlZmF1bHRfaW5pdGlhbGdhaW5bMl0sCisJCSAgcnRscGh5LT5kZWZhdWx0X2luaXRpYWxnYWluWzNdKSk7CisKKwlydGxwaHktPmZyYW1lc3luYyA9ICh1OCkgcnRsX2dldF9iYnJlZyhodywKKwkJCQkJICAgICAgIFJPRkRNMF9SWERFVEVDVE9SMywgTUFTS0JZVEUwKTsKKwlydGxwaHktPmZyYW1lc3luY19jMzQgPSBydGxfZ2V0X2JicmVnKGh3LAorCQkJCQkgICAgICBST0ZETTBfUlhERVRFQ1RPUjIsIE1BU0tEV09SRCk7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJICgiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleCBcbiIsCisJCSAgUk9GRE0wX1JYREVURUNUT1IzLCBydGxwaHktPmZyYW1lc3luYykpOworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3BoeV9pbml0X2JiX3JmX3JlZ2lzdGVyX2RlZmluaXRpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaW50ZnMgPSBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1c7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmludGZzID0gUkZQR0EwX1hBQl9SRklOVEVSRkFDRVNXOworCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZmludGZvID0gUkZQR0EwX1hBX1JGSU5URVJGQUNFT0U7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmludGZvID0gUkZQR0EwX1hCX1JGSU5URVJGQUNFT0U7CisKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmUgPSBSRlBHQTBfWEFfUkZJTlRFUkZBQ0VPRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmaW50ZmUgPSBSRlBHQTBfWEJfUkZJTlRFUkZBQ0VPRTsKKworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmYzd2lyZV9vZmZzZXQgPSBSQV9MU1NJV1JJVEVfODgyMUE7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZjN3aXJlX29mZnNldCA9IFJCX0xTU0lXUklURV84ODIxQTsKKworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZoc3NpX3BhcmEyID0gUkhTU0lSRUFEXzg4MjFBRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmaHNzaV9wYXJhMiA9IFJIU1NJUkVBRF84ODIxQUU7CisKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmbHNzaV9yZWFkYmFjayA9IFJBX1NJUkVBRF84ODIxQTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmbHNzaV9yZWFkYmFjayA9IFJCX1NJUkVBRF84ODIxQTsKKworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZsc3NpX3JlYWRiYWNrcGkgPSBSQV9QSVJFQURfODgyMUE7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmxzc2lfcmVhZGJhY2twaSA9IFJCX1BJUkVBRF84ODIxQTsKK30KKwordm9pZCBydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2xldmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBsb25nICpwb3dlcmxldmVsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IHR4cHdyX2xldmVsOworCWxvbmcgdHhwd3JfZGJtOworCisJdHhwd3JfbGV2ZWwgPSBydGxwaHktPmN1cl9jY2tfdHhwd3JpZHg7CisJdHhwd3JfZGJtID0gX3J0bDg4MjFhZV9waHlfdHhwd3JfaWR4X3RvX2RibShodywKKwkJCQkJCSBXSVJFTEVTU19NT0RFX0IsIHR4cHdyX2xldmVsKTsKKwl0eHB3cl9sZXZlbCA9IHJ0bHBoeS0+Y3VyX29mZG0yNGdfdHhwd3JpZHg7CisJaWYgKF9ydGw4ODIxYWVfcGh5X3R4cHdyX2lkeF90b19kYm0oaHcsCisJCQkJCSBXSVJFTEVTU19NT0RFX0csCisJCQkJCSB0eHB3cl9sZXZlbCkgPiB0eHB3cl9kYm0pCisJCXR4cHdyX2RibSA9CisJCSAgICBfcnRsODgyMWFlX3BoeV90eHB3cl9pZHhfdG9fZGJtKGh3LCBXSVJFTEVTU19NT0RFX0csCisJCQkJCQkgdHhwd3JfbGV2ZWwpOworCXR4cHdyX2xldmVsID0gcnRscGh5LT5jdXJfb2ZkbTI0Z190eHB3cmlkeDsKKwlpZiAoX3J0bDg4MjFhZV9waHlfdHhwd3JfaWR4X3RvX2RibShodywKKwkJCQkJIFdJUkVMRVNTX01PREVfTl8yNEcsCisJCQkJCSB0eHB3cl9sZXZlbCkgPiB0eHB3cl9kYm0pCisJCXR4cHdyX2RibSA9CisJCSAgICBfcnRsODgyMWFlX3BoeV90eHB3cl9pZHhfdG9fZGJtKGh3LCBXSVJFTEVTU19NT0RFX05fMjRHLAorCQkJCQkJIHR4cHdyX2xldmVsKTsKKwkqcG93ZXJsZXZlbCA9IHR4cHdyX2RibTsKK30KKworc3RhdGljIGJvb2wgX3J0bDg4MjFhZV9waHlfZ2V0X2NobmxfaW5kZXgodTggY2hhbm5lbCwgdTggKmNobmxfaW5kZXgpCit7CisJdTggY2hhbm5lbF81Z1tDSEFOTkVMX01BWF9OVU1CRVJfNUddID0KKwkJCQkgezM2LDM4LDQwLDQyLDQ0LDQ2LDQ4LDUwLDUyLDU0LDU2LDU4LDYwLDYyLDY0LDEwMCwxMDIsMTA0LDEwNiwxMDgsMTEwLDExMiwKKwkJCQkxMTQsMTE2LDExOCwxMjAsMTIyLDEyNCwxMjYsMTI4LDEzMCwxMzIsMTM0LDEzNiwxMzgsMTQwLDE0MiwxNDQsMTQ5LDE1MSwKKwkJCQkxNTMsMTU1LDE1NywxNTksMTYxLDE2MywxNjUsMTY3LDE2OCwxNjksMTcxLDE3MywxNzUsMTc3fTsKKwl1OCBpID0gMDsKKwlib29sIGluXzI0ZyA9IHRydWU7CisKKwlpZiAoY2hhbm5lbCA8PSAxNCkgeworCQlpbl8yNGcgPSB0cnVlOworCQkqY2hubF9pbmRleCA9IGNoYW5uZWwgLSAxOworCX0gZWxzZSB7CisJCWluXzI0ZyA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF81ZykgLyBzaXplb2YodTgpOyArK2kpIHsKKwkJCWlmIChjaGFubmVsXzVnW2ldID09IGNoYW5uZWwpIHsKKwkJCQkqY2hubF9pbmRleCA9IGk7CisJCQkJcmV0dXJuIGluXzI0ZzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaW5fMjRnOworfQorCitzdGF0aWMgY2hhciBfcnRsODgyMWFlX3BoeV9nZXRfcmF0ZXNlY3Rpb25faW50eHBvd2VyX2J5cmF0ZSh1OCBwYXRoLCB1OCByYXRlKQoreworCWNoYXIgcmF0ZV9zZWN0aW9uID0gMDsKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIERFU0NfUkFURTFNOgorCWNhc2UgREVTQ19SQVRFMk06CisJY2FzZSBERVNDX1JBVEU1XzVNOgorCWNhc2UgREVTQ19SQVRFMTFNOgorCQlyYXRlX3NlY3Rpb24gPSAwOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFNk06CisJY2FzZSBERVNDX1JBVEU5TToKKwljYXNlIERFU0NfUkFURTEyTToKKwljYXNlIERFU0NfUkFURTE4TToKKwkJcmF0ZV9zZWN0aW9uID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURTI0TToKKwljYXNlIERFU0NfUkFURTM2TToKKwljYXNlIERFU0NfUkFURTQ4TToKKwljYXNlIERFU0NfUkFURTU0TToKKwkJcmF0ZV9zZWN0aW9uID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzA6CisJY2FzZSBERVNDX1JBVEVNQ1MxOgorCWNhc2UgREVTQ19SQVRFTUNTMjoKKwljYXNlIERFU0NfUkFURU1DUzM6CisJCXJhdGVfc2VjdGlvbiA9IDM7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVNQ1M0OgorCWNhc2UgREVTQ19SQVRFTUNTNToKKwljYXNlIERFU0NfUkFURU1DUzY6CisJY2FzZSBERVNDX1JBVEVNQ1M3OgorCQlyYXRlX3NlY3Rpb24gPSA0OworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFTUNTODoKKwljYXNlIERFU0NfUkFURU1DUzk6CisJY2FzZSBERVNDX1JBVEVNQ1MxMDoKKwljYXNlIERFU0NfUkFURU1DUzExOgorCQlyYXRlX3NlY3Rpb24gPSA1OworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFTUNTMTI6CisJY2FzZSBERVNDX1JBVEVNQ1MxMzoKKwljYXNlIERFU0NfUkFURU1DUzE0OgorCWNhc2UgREVTQ19SQVRFTUNTMTU6CisJCXJhdGVfc2VjdGlvbiA9IDY7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMDoKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MxOgorCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzI6CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMzoKKwkJcmF0ZV9zZWN0aW9uID0gNzsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M0OgorCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzU6CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNjoKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M3OgorCQlyYXRlX3NlY3Rpb24gPSA4OworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzg6CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTOToKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MwOgorCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzE6CisJCXJhdGVfc2VjdGlvbiA9IDk7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMjoKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MzOgorCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzQ6CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNToKKwkJcmF0ZV9zZWN0aW9uID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNjoKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M3OgorCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzg6CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTOToKKwkJcmF0ZV9zZWN0aW9uID0gMTE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUlRfQVNTRVJUKHRydWUsICgiUmF0ZV9TZWN0aW9uIGlzIElsbGVnYWxcbiIpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJhdGVfc2VjdGlvbjsKK30KKworc3RhdGljIGNoYXIgX3J0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfYnlfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQkJICAgdTggYmFuZCwgdTggcGF0aCwgdTggcmF0ZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCBzaGlmdCA9IDAsIHJhdGVfc2VjdGlvbiwgdHhfbnVtOworCWNoYXIgdHhfcHdyX2RpZmYgPSAwOworCisJcmF0ZV9zZWN0aW9uID0gX3J0bDg4MjFhZV9waHlfZ2V0X3JhdGVzZWN0aW9uX2ludHhwb3dlcl9ieXJhdGUocGF0aCwgcmF0ZSk7CisJdHhfbnVtID0gUkZfVFhfTlVNX05PTklNUExFTUVOVDsKKworCWlmICh0eF9udW0gPT0gUkZfVFhfTlVNX05PTklNUExFTUVOVCkgeworCQlpZiAoKHJhdGUgPj0gREVTQ19SQVRFTUNTOCAmJiByYXRlIDw9IERFU0NfUkFURU1DUzE1ICkgfHwKKwkJCShyYXRlID49IERFU0NfUkFURVZIVDJTU19NQ1MyICYmIHJhdGUgPD0gREVTQ19SQVRFVkhUMlNTX01DUzkpKQorCQkJIHR4X251bSA9IFJGXzJUWDsKKwkJZWxzZQorCQkJdHhfbnVtID0gUkZfMVRYOworCX0KKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgREVTQ19SQVRFMU06CXNoaWZ0ID0gMDsJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFMk06CXNoaWZ0ID0gODsJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFNV81TToJc2hpZnQgPSAxNjsJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFMTFNOglzaGlmdCA9IDI0OwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURTZNOglzaGlmdCA9IDA7CQlicmVhazsKKwljYXNlIERFU0NfUkFURTlNOglzaGlmdCA9IDg7ICAgICAgYnJlYWs7CisJY2FzZSBERVNDX1JBVEUxMk06CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURTE4TToJc2hpZnQgPSAyNDsgICAgIGJyZWFrOworCisJY2FzZSBERVNDX1JBVEUyNE06CXNoaWZ0ID0gMDsgICAgCWJyZWFrOworCWNhc2UgREVTQ19SQVRFMzZNOglzaGlmdCA9IDg7ICAgICAgYnJlYWs7CisJY2FzZSBERVNDX1JBVEU0OE06CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURTU0TToJc2hpZnQgPSAyNDsgICAgIGJyZWFrOworCisJY2FzZSBERVNDX1JBVEVNQ1MwOglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MxOglzaGlmdCA9IDg7ICAgICAgYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MyOglzaGlmdCA9IDE2OyAgICAgYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MzOglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzQ6CXNoaWZ0ID0gMDsgCQlicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzU6CXNoaWZ0ID0gODsgICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzY6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzc6CXNoaWZ0ID0gMjQ7ICAgICBicmVhazsKKworCWNhc2UgREVTQ19SQVRFTUNTODoJc2hpZnQgPSAwOyAJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTOToJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTMTA6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzExOglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzEyOglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MxMzoJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTMTQ6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzE1OglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MwOglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMToJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzI6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MzOglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M0OglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTNToJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzY6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M3OglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M4OglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTOToJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzA6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MxOglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MyOglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMzoJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzQ6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M1OglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M2OglzaGlmdCA9IDA7IAkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNzoJc2hpZnQgPSA4OyAgICAgIGJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzg6CXNoaWZ0ID0gMTY7ICAgICBicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M5OglzaGlmdCA9IDI0OyAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCQlSVF9BU1NFUlQodHJ1ZSwgKCJSYXRlX1NlY3Rpb24gaXMgSWxsZWdhbFxuIikpOworCQlicmVhazsKKwl9CisKKwl0eF9wd3JfZGlmZiA9ICh1OCkgKHJ0bHBoeS0+dHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbYmFuZF1bcGF0aF1bdHhfbnVtXVtyYXRlX3NlY3Rpb25dID4+IHNoaWZ0KSAmIDB4ZmY7CisKKwlyZXR1cm4JdHhfcHdyX2RpZmY7Cit9CisKK3N0YXRpYyB1OCBfcnRsODgyMWFlX2dldF90eHBvd2VyX2luZGV4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBwYXRoLAorCQkJCSAgICAgIAkJCQkJCQkgdTggcmF0ZSwgdTggYmFuZHdpZHRoLCB1OCBjaGFubmVsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXU4IGluZGV4ID0gKGNoYW5uZWwgLSAxKTsKKwl1OCB0eHBvd2VyID0gMDsKKwlib29sIGluXzI0ZyA9IGZhbHNlOworCWNoYXIgcG93ZXJkaWZmX2J5cmF0ZSA9IDA7CisKKwlpZiAoKChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSAmJiAoY2hhbm5lbCA+IDE0IHx8IGNoYW5uZWwgPCAxKSkgfHwKKwkJKChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgJiYgKGNoYW5uZWwgPD0gMTQpKSkgeworCQlpbmRleCA9IDA7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELCAoIklsbGVnYWwgY2hhbm5lbCEhXG4iKSk7CisJfQorCisJaW5fMjRnID0gX3J0bDg4MjFhZV9waHlfZ2V0X2NobmxfaW5kZXgoY2hhbm5lbCwgJmluZGV4KTsKKwlpZiAoaW5fMjRnKSB7CisJCWlmIChSWF9IQUxfSVNfQ0NLX1JBVEUocmF0ZSkpCisJCQl0eHBvd2VyID0gcnRsZWZ1c2UtPnR4cHdybGV2ZWxfY2NrW3BhdGhdW2luZGV4XTsKKwkJZWxzZSBpZiAoIERFU0NfUkFURTZNIDw9IHJhdGUgKQorCQkJdHhwb3dlciA9IHJ0bGVmdXNlLT50eHB3cmxldmVsX2h0NDBfMXNbcGF0aF1baW5kZXhdOworCQllbHNlCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwgKCJpbnZhbGlkIHJhdGVcbiIpKTsKKworCQlpZiAoREVTQ19SQVRFNk0gPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURTU0TSAmJiAhUlhfSEFMX0lTX0NDS19SQVRFKHJhdGUpKQorCQkJdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfbGVnYWN5aHRkaWZmW3BhdGhdW1RYXzFTXTsKKworCQlpZiAoYmFuZHdpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjApIHsKKwkJCWlmICgoREVTQ19SQVRFTUNTMCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFTUNTMTUpIHx8CisJCQkJKERFU0NfUkFURVZIVDFTU19NQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVWSFQyU1NfTUNTOSkpCisJCQkJdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfaHQyMGRpZmZbcGF0aF1bVFhfMVNdOworCQkJaWYgKChERVNDX1JBVEVNQ1M4IDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVNQ1MxNSkgfHwKKwkJCQkoREVTQ19SQVRFVkhUMlNTX01DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURVZIVDJTU19NQ1M5KSkKKwkJCQl0eHBvd2VyICs9IHJ0bGVmdXNlLT50eHB3cl9odDIwZGlmZltwYXRoXVtUWF8yU107CisJCX0gZWxzZSBpZiAoYmFuZHdpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApIHsKKwkJCWlmICgoREVTQ19SQVRFTUNTMCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFTUNTMTUpIHx8CisJCQkJKERFU0NfUkFURVZIVDFTU19NQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVWSFQyU1NfTUNTOSkpCisJCQkJdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfaHQ0MGRpZmZbcGF0aF1bVFhfMVNdOworCQkJaWYgKChERVNDX1JBVEVNQ1M4IDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVNQ1MxNSkgfHwKKwkJCQkoREVTQ19SQVRFVkhUMlNTX01DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURVZIVDJTU19NQ1M5KSkKKwkJCQl0eHBvd2VyICs9IHJ0bGVmdXNlLT50eHB3cl9odDQwZGlmZltwYXRoXVtUWF8yU107CisJCX0gZWxzZSBpZiAoYmFuZHdpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfODApIHsKKwkJCWlmICgoREVTQ19SQVRFTUNTMCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFTUNTMTUpIHx8CisJCQkJKERFU0NfUkFURVZIVDFTU19NQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVWSFQyU1NfTUNTOSkpCisJCQkJdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfaHQ0MGRpZmZbcGF0aF1bVFhfMVNdOworCQkJaWYgKChERVNDX1JBVEVNQ1M4IDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVNQ1MxNSkgfHwKKwkJCQkoREVTQ19SQVRFVkhUMlNTX01DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURVZIVDJTU19NQ1M5KSkKKwkJCQl0eHBvd2VyICs9IHJ0bGVmdXNlLT50eHB3cl9odDQwZGlmZltwYXRoXVtUWF8yU107CisJCX0KKworCX0gZWxzZSB7CisJCWlmIChERVNDX1JBVEU2TSA8PSByYXRlKQorCQkJdHhwb3dlciA9IHJ0bGVmdXNlLT50eHB3cl81Z19idzQwYmFzZVtwYXRoXVtpbmRleF07CisJICAgIGVsc2UKKwkgICAgICAgIFJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19XQVJOSU5HLCgiSU5WQUxJRCBSYXRlLlxuIikpOworCisgICAgICAgIGlmIChERVNDX1JBVEU2TSA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFNTRNICYmICFSWF9IQUxfSVNfQ0NLX1JBVEUocmF0ZSkpCisJICAgIAl0eHBvd2VyICs9IHJ0bGVmdXNlLT50eHB3cl81Z19vZmRtZGlmZltwYXRoXVtUWF8xU107CisKKwkgICAgaWYgKGJhbmR3aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKSB7CisJICAgICAgICBpZiAoKERFU0NfUkFURU1DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURU1DUzE1KSB8fAorCQkJCShERVNDX1JBVEVWSFQxU1NfTUNTMCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFVkhUMlNTX01DUzkpKQorCSAgICAJICAgIHR4cG93ZXIgKz0gcnRsZWZ1c2UtPnR4cHdyXzVnX2J3MjBkaWZmW3BhdGhdW1RYXzFTXTsKKwkgICAgICAgIGlmICgoREVTQ19SQVRFTUNTOCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFTUNTMTUpIHx8CisJCQkJKERFU0NfUkFURVZIVDJTU19NQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVWSFQyU1NfTUNTOSkpCisJICAgIAkgICAgdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfNWdfYncyMGRpZmZbcGF0aF1bVFhfMlNdOworCSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKSB7CisJICAgICAgICBpZiAoKERFU0NfUkFURU1DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURU1DUzE1KSB8fAorCQkJCShERVNDX1JBVEVWSFQxU1NfTUNTMCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFVkhUMlNTX01DUzkpKQorCSAgICAJICAgIHR4cG93ZXIgKz0gcnRsZWZ1c2UtPnR4cHdyXzVnX2J3NDBkaWZmW3BhdGhdW1RYXzFTXTsKKwkgICAgICAgIGlmICgoREVTQ19SQVRFTUNTOCA8PSByYXRlICYmIHJhdGUgPD0gREVTQ19SQVRFTUNTMTUpIHx8CisJCQkJKERFU0NfUkFURVZIVDJTU19NQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVWSFQyU1NfTUNTOSkpCisJICAgIAkgICAgdHhwb3dlciArPSBydGxlZnVzZS0+dHhwd3JfNWdfYnc0MGRpZmZbcGF0aF1bVFhfMlNdOworCSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzgwKSB7CisJCQl1OCBjaGFubmVsXzVnXzgwbVtDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNXSA9IHs0MiwgNTgsIDEwNiwgMTIyLCAxMzgsIDE1NSwgMTcxfTsKKwkJCXU4IGkgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsXzVnXzgwbSkgLyBzaXplb2YodTgpOyArK2kpCisJCQkJaWYgKGNoYW5uZWxfNWdfODBtW2ldID09IGNoYW5uZWwpCisJCQkJCWluZGV4ID0gaTsKKworCSAgICAgICAgaWYgKChERVNDX1JBVEVNQ1MwIDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVNQ1MxNSkgfHwKKwkJCQkoREVTQ19SQVRFVkhUMVNTX01DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURVZIVDJTU19NQ1M5KSkKKwkgICAgCSAgICB0eHBvd2VyID0gcnRsZWZ1c2UtPnR4cHdyXzVnX2J3ODBiYXNlW3BhdGhdW2luZGV4XQorCSAgICAJICAgIAkJKyBydGxlZnVzZS0+dHhwd3JfNWdfYnc4MGRpZmZbcGF0aF1bVFhfMVNdOworCSAgICAgICAgaWYgKChERVNDX1JBVEVNQ1M4IDw9IHJhdGUgJiYgcmF0ZSA8PSBERVNDX1JBVEVNQ1MxNSkgfHwKKwkJCQkoREVTQ19SQVRFVkhUMlNTX01DUzAgPD0gcmF0ZSAmJiByYXRlIDw9IERFU0NfUkFURVZIVDJTU19NQ1M5KSkKKwkgICAgCSAgICB0eHBvd2VyID0gcnRsZWZ1c2UtPnR4cHdyXzVnX2J3ODBiYXNlW3BhdGhdW2luZGV4XQorCSAgICAJICAgIAkJKyBydGxlZnVzZS0+dHhwd3JfNWdfYnc4MGRpZmZbcGF0aF1bVFhfMVNdCisJICAgIAkgICAgCQkrIHJ0bGVmdXNlLT50eHB3cl81Z19idzgwZGlmZltwYXRoXVtUWF8yU107CisJICAgIH0KKwl9CisJaWYgKHJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSAhPSAyKQorCQlwb3dlcmRpZmZfYnlyYXRlID0gX3J0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfYnlfcmF0ZShodywKKwkJCQkJCQkJCSh1OCkoIWluXzI0ZyksIHBhdGgsIHJhdGUpOworCisJaWYgKHJhdGUgPT0gREVTQ19SQVRFVkhUMVNTX01DUzggfHwgcmF0ZSA9PSBERVNDX1JBVEVWSFQxU1NfTUNTOSB8fAorCQlyYXRlID09IERFU0NfUkFURVZIVDJTU19NQ1M4IHx8IHJhdGUgPT0gREVTQ19SQVRFVkhUMlNTX01DUzkpCisJCXR4cG93ZXIgLT0gcG93ZXJkaWZmX2J5cmF0ZTsKKwllbHNlCisJCXR4cG93ZXIgKz0gcG93ZXJkaWZmX2J5cmF0ZTsKKworCWlmIChyYXRlID4gREVTQ19SQVRFMTFNKQorCQl0eHBvd2VyICs9IHJ0bHByaXYtPmRtLnJlbW5hbnRfb2ZkbV9zd2luZ19pZHhbcGF0aF07CisJZWxzZQorCQl0eHBvd2VyICs9IHJ0bHByaXYtPmRtLnJlbW5hbnRfY2NrX2lkeDsKKworCWlmICh0eHBvd2VyID4gTUFYX1BPV0VSX0lOREVYKQorCQl0eHBvd2VyID0gTUFYX1BPV0VSX0lOREVYOworCisJcmV0dXJuIHR4cG93ZXI7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2luZGV4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJCQkJCQkJdTggcG93ZXJfaW5kZXgsIHU4IHBhdGgsIHU4IHJhdGUpCit7CisJc3RydWN0IHJ0bF9wcml2KiBydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJaWYgKHBhdGggPT0gUkY5MF9QQVRIX0EpIHsKKyAgICAgICAgc3dpdGNoIChyYXRlKSB7CisgICAgICAgIGNhc2UgREVTQ19SQVRFMU06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX0NDSzExX0NDSzEsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEUyTToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfQ0NLMTFfQ0NLMSwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURTVfNU06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX0NDSzExX0NDSzEsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEUxMU06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX0NDSzExX0NDSzEsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworICAgICAgICBjYXNlIERFU0NfUkFURTZNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNMThfT0ZETTYsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEU5TToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfT0ZETTE4X09GRE02LCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFMTJNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNMThfT0ZETTYsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEUxOE06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX09GRE0xOF9PRkRNNiwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgREVTQ19SQVRFMjRNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFMzZNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFNDhNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFNTRNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBERVNDX1JBVEVNQ1MwOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MwM19NQ1MwMCwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzE6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX01DUzAzX01DUzAwLCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFTUNTMjoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMDNfTUNTMDAsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEVNQ1MzOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MwM19NQ1MwMCwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgREVTQ19SQVRFTUNTNDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMDdfTUNTMDQsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEVNQ1M1OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MwN19NQ1MwNCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzY6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX01DUzA3X01DUzA0LCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFTUNTNzoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMDdfTUNTMDQsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzg6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX01DUzExX01DUzA4LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgREVTQ19SQVRFTUNTOToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMTFfTUNTMDgsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEVNQ1MxMDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMTFfTUNTMDgsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBERVNDX1JBVEVNQ1MxMToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTUNTMTFfTUNTMDgsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzEyOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MxNV9NQ1MxMiwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzEzOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MxNV9NQ1MxMiwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzE0OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MxNV9NQ1MxMiwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIERFU0NfUkFURU1DUzE1OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9NQ1MxNV9NQ1MxMiwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMUlOREVYM19OU1MxSU5ERVgwLCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMUlOREVYM19OU1MxSU5ERVgwLCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMjoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMUlOREVYM19OU1MxSU5ERVgwLCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTMzoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMUlOREVYM19OU1MxSU5ERVgwLCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M0OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MxSU5ERVg3X05TUzFJTkRFWDQsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M1OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MxSU5ERVg3X05TUzFJTkRFWDQsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M2OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MxSU5ERVg3X05TUzFJTkRFWDQsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1M3OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MxSU5ERVg3X05TUzFJTkRFWDQsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzg6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX05TUzJJTkRFWDFfTlNTMUlOREVYOCwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzk6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX05TUzJJTkRFWDFfTlNTMUlOREVYOCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX05TUzJJTkRFWDFfTlNTMUlOREVYOCwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzE6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19BX05TUzJJTkRFWDFfTlNTMUlOREVYOCwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMjoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMklOREVYNV9OU1MySU5ERVgyLCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMzoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMklOREVYNV9OU1MySU5ERVgyLCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMklOREVYNV9OU1MySU5ERVgyLCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTNToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfTlNTMklOREVYNV9OU1MySU5ERVgyLCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M2OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MySU5ERVg5X05TUzJJTkRFWDYsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M3OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MySU5ERVg5X05TUzJJTkRFWDYsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M4OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MySU5ERVg5X05TUzJJTkRFWDYsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M5OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9OU1MySU5ERVg5X05TUzJJTkRFWDYsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiSW52YWxpZCBSYXRlISFcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwYXRoID09IFJGOTBfUEFUSF9CKSB7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSBERVNDX1JBVEUxTToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfQ0NLMTFfQ0NLMSwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFMk06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX0NDSzExX0NDSzEsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURTVfNU06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX0NDSzExX0NDSzEsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURTExTToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfQ0NLMTFfQ0NLMSwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEU2TToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfT0ZETTE4X09GRE02LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEU5TToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfT0ZETTE4X09GRE02LCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEUxMk06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX09GRE0xOF9PRkRNNiwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFMThNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9PRkRNMThfT0ZETTYsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFMjRNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEUzNk06CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX09GRE01NF9PRkRNMjQsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURTQ4TToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfT0ZETTU0X09GRE0yNCwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFNTRNOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9PRkRNNTRfT0ZETTI0LCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzAzX01DUzAwLCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MxOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9NQ1MwM19NQ1MwMCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTMjoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTUNTMDNfTUNTMDAsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzM6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzAzX01DUzAwLCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzQ6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzA3X01DUzA0LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1M1OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9NQ1MwN19NQ1MwNCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTNjoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTUNTMDdfTUNTMDQsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzc6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzA3X01DUzA0LCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURU1DUzg6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzExX01DUzA4LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1M5OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9NQ1MxMV9NQ1MwOCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTMTA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzExX01DUzA4LCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MxMToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTUNTMTFfTUNTMDgsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFTUNTMTI6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzE1X01DUzEyLCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVNQ1MxMzoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTUNTMTVfTUNTMTIsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURU1DUzE0OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9NQ1MxNV9NQ1MxMiwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFTUNTMTU6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX01DUzE1X01DUzEyLCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MwOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MxSU5ERVgzX05TUzFJTkRFWDAsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MxOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MxSU5ERVgzX05TUzFJTkRFWDAsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MyOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MxSU5ERVgzX05TUzFJTkRFWDAsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDFTU19NQ1MzOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MxSU5ERVgzX05TUzFJTkRFWDAsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzQ6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzFJTkRFWDdfTlNTMUlOREVYNCwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzU6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzFJTkRFWDdfTlNTMUlOREVYNCwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzY6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzFJTkRFWDdfTlNTMUlOREVYNCwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMVNTX01DUzc6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzFJTkRFWDdfTlNTMUlOREVYNCwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTODoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTlNTMklOREVYMV9OU1MxSU5ERVg4LCBNQVNLQllURTAsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQxU1NfTUNTOToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTlNTMklOREVYMV9OU1MxSU5ERVg4LCBNQVNLQllURTEsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTlNTMklOREVYMV9OU1MxSU5ERVg4LCBNQVNLQllURTIsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBERVNDX1JBVEVWSFQyU1NfTUNTMToKKwkJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfTlNTMklOREVYMV9OU1MxSU5ERVg4LCBNQVNLQllURTMsIHBvd2VyX2luZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MyOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MySU5ERVg1X05TUzJJTkRFWDIsIE1BU0tCWVRFMCwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1MzOgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MySU5ERVg1X05TUzJJTkRFWDIsIE1BU0tCWVRFMSwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M0OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MySU5ERVg1X05TUzJJTkRFWDIsIE1BU0tCWVRFMiwgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKwljYXNlIERFU0NfUkFURVZIVDJTU19NQ1M1OgorCQlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9OU1MySU5ERVg1X05TUzJJTkRFWDIsIE1BU0tCWVRFMywgcG93ZXJfaW5kZXgpOworCQlicmVhazsKKworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzY6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzJJTkRFWDlfTlNTMklOREVYNiwgTUFTS0JZVEUwLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzc6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzJJTkRFWDlfTlNTMklOREVYNiwgTUFTS0JZVEUxLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzg6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzJJTkRFWDlfTlNTMklOREVYNiwgTUFTS0JZVEUyLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCWNhc2UgREVTQ19SQVRFVkhUMlNTX01DUzk6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX05TUzJJTkRFWDlfTlNTMklOREVYNiwgTUFTS0JZVEUzLCBwb3dlcl9pbmRleCk7CisJCWJyZWFrOworCisgICAgICAgZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiSW52YWxpZCBSYXRlISFcbiIpKTsKKyAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoIkludmFsaWQgUkZQYXRoISFcbiIpKTsKKyAgICB9Cit9CisKK3ZvaWQgX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQl1OCAqYXJyYXksIHU4IHBhdGgsIHU4IGNoYW5uZWwsCisJCQkJCQkJCQkJCQkJdTggc2l6ZSkKK3sKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxfcHJpdihodyktPnBoeSk7CisJdTggaTsKKwl1OCBwb3dlcl9pbmRleDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgeworCQlwb3dlcl9pbmRleCA9IF9ydGw4ODIxYWVfZ2V0X3R4cG93ZXJfaW5kZXgoaHcsIHBhdGgsIGFycmF5W2ldLAorCQkJCQkJCQkJcnRscGh5LT5jdXJyZW50X2NoYW5fYncsIGNoYW5uZWwpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9pbmRleChodywgcG93ZXJfaW5kZXgsIHBhdGgsIGFycmF5W2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfcGh5X3R4cG93ZXJfdHJhaW5pbmdfYnlfcGF0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCQkJCQkJCQkJdTggYncsIHU4IGNoYW5uZWwsIHU4IHBhdGgpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwl1OCBpOworCXUzMiBwb3dlcl9sZXZlbCwgZGF0YSwgb2Zmc2V0OworCisJaWYocGF0aCA+PSBydGxwaHktPm51bV90b3RhbF9yZnBhdGgpCisJCXJldHVybjsKKworCWRhdGEgPSAwOworCWlmIChwYXRoID09IFJGOTBfUEFUSF9BKSB7CisJCXBvd2VyX2xldmVsID0KKwkJCV9ydGw4ODIxYWVfZ2V0X3R4cG93ZXJfaW5kZXgoaHcsIFJGOTBfUEFUSF9BLAorCQkJREVTQ19SQVRFTUNTNywgYncsIGNoYW5uZWwpOworCQlvZmZzZXQgPSAgUkFfVFhQV1JUUkFJTkc7CisJfSBlbHNlIHsKKwkJcG93ZXJfbGV2ZWwgPQorCQkJX3J0bDg4MjFhZV9nZXRfdHhwb3dlcl9pbmRleChodywgUkY5MF9QQVRIX0EsCisJCQlERVNDX1JBVEVNQ1M3LCBidywgY2hhbm5lbCk7CisJCW9mZnNldCA9ICBSQl9UWFBXUlRSQUlORzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmIChpID09IDApCisJCQlwb3dlcl9sZXZlbCA9IHBvd2VyX2xldmVsIC0gMTA7CisJCWVsc2UgaWYgKGkgPT0gMSkKKwkJCXBvd2VyX2xldmVsID0gcG93ZXJfbGV2ZWwgLSA4OworCQllbHNlCisJCQlwb3dlcl9sZXZlbCA9IHBvd2VyX2xldmVsIC0gNjsKKworCQlkYXRhIHw9ICgoKHBvd2VyX2xldmVsID4gMikgPyAocG93ZXJfbGV2ZWwpIDogMikgPDwgKGkgKiA4KSk7CisJfQorCXJ0bF9zZXRfYmJyZWcoaHcsIG9mZnNldCwgMHhmZmZmZmYsIGRhdGEpOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY2hhbm5lbCwgdTggcGF0aCkKK3sKKwkvL3N0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxfcHJpdihodyktPnBoeSk7CisJdTggY2NrX3JhdGVzW10gID0ge0RFU0NfUkFURTFNLCBERVNDX1JBVEUyTSwgREVTQ19SQVRFNV81TSwgREVTQ19SQVRFMTFNfTsKKwl1OCBvZmRtX3JhdGVzW10gID0ge0RFU0NfUkFURTZNLCBERVNDX1JBVEU5TSwgREVTQ19SQVRFMTJNLCBERVNDX1JBVEUxOE0sCisJCQkJCQlERVNDX1JBVEUyNE0sIERFU0NfUkFURTM2TSwgREVTQ19SQVRFNDhNLCBERVNDX1JBVEU1NE19OworCXU4IGh0X3JhdGVzXzF0W10gID0ge0RFU0NfUkFURU1DUzAsIERFU0NfUkFURU1DUzEsIERFU0NfUkFURU1DUzIsIERFU0NfUkFURU1DUzMsCisJCQkJCQkgREVTQ19SQVRFTUNTNCwgREVTQ19SQVRFTUNTNSwgREVTQ19SQVRFTUNTNiwgREVTQ19SQVRFTUNTN307CisJdTggaHRfcmF0ZXNfMnRbXSAgPSB7REVTQ19SQVRFTUNTOCwgREVTQ19SQVRFTUNTOSwgREVTQ19SQVRFTUNTMTAsIERFU0NfUkFURU1DUzExLAorCQkJCQkJIERFU0NfUkFURU1DUzEyLCBERVNDX1JBVEVNQ1MxMywgREVTQ19SQVRFTUNTMTQsIERFU0NfUkFURU1DUzE1fTsKKwl1OCB2aHRfcmF0ZXNfMXRbXSAgPSB7REVTQ19SQVRFVkhUMVNTX01DUzAsIERFU0NfUkFURVZIVDFTU19NQ1MxLCBERVNDX1JBVEVWSFQxU1NfTUNTMiwKKwkJCQkJCURFU0NfUkFURVZIVDFTU19NQ1MzLCBERVNDX1JBVEVWSFQxU1NfTUNTNCwKKwkJCQkJCSAgREVTQ19SQVRFVkhUMVNTX01DUzUsIERFU0NfUkFURVZIVDFTU19NQ1M2LCBERVNDX1JBVEVWSFQxU1NfTUNTNywKKwkJCQkJCSAgREVTQ19SQVRFVkhUMVNTX01DUzgsIERFU0NfUkFURVZIVDFTU19NQ1M5fTsKKwl1OCB2aHRfcmF0ZXNfMnRbXSAgPSB7REVTQ19SQVRFVkhUMlNTX01DUzAsIERFU0NfUkFURVZIVDJTU19NQ1MxLCBERVNDX1JBVEVWSFQyU1NfTUNTMiwKKwkJCQkJCURFU0NfUkFURVZIVDJTU19NQ1MzLCBERVNDX1JBVEVWSFQyU1NfTUNTNCwKKwkJCQkJCSAgREVTQ19SQVRFVkhUMlNTX01DUzUsIERFU0NfUkFURVZIVDJTU19NQ1M2LCBERVNDX1JBVEVWSFQyU1NfTUNTNywKKwkJCQkJCSAgREVTQ19SQVRFVkhUMlNTX01DUzgsIERFU0NfUkFURVZIVDJTU19NQ1M5fTsKKwkvL3U4IGksc2l6ZTsKKwkvL3U4IHBvd2VyX2luZGV4OworCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpCisJCV9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2xldmVsX2J5X3BhdGgoaHcsY2NrX3JhdGVzLHBhdGgsY2hhbm5lbCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2NrX3JhdGVzKSAvIHNpemVvZih1OCkpOworCisJX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChodyxvZmRtX3JhdGVzLHBhdGgsY2hhbm5lbCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvZmRtX3JhdGVzKSAvIHNpemVvZih1OCkpOworCV9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2xldmVsX2J5X3BhdGgoaHcsaHRfcmF0ZXNfMXQscGF0aCxjaGFubmVsLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGh0X3JhdGVzXzF0KSAvIHNpemVvZih1OCkpOworCV9ydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2xldmVsX2J5X3BhdGgoaHcsdmh0X3JhdGVzXzF0LHBhdGgsY2hhbm5lbCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2aHRfcmF0ZXNfMXQpIC8gc2l6ZW9mKHU4KSk7CisKKwlpZiAocnRscGh5LT5udW1fdG90YWxfcmZwYXRoID49IDIpIHsKKwkJX3J0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aChodyxodF9yYXRlc18ydCxwYXRoLGNoYW5uZWwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGh0X3JhdGVzXzJ0KSAvIHNpemVvZih1OCkpOworCQlfcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LHZodF9yYXRlc18ydCxwYXRoLGNoYW5uZWwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZodF9yYXRlc18ydCkgLyBzaXplb2YodTgpKTsKKwl9CisKKwlfcnRsODgyMWFlX3BoeV90eHBvd2VyX3RyYWluaW5nX2J5X3BhdGgoaHcsIHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3LCBjaGFubmVsLCBwYXRoKTsKK30KKy8qanVzdCBpbiBjYXNlLCB3cml0ZSB0eHBvd2VyIGluIERXLCB0byByZWR1Y2UgdGltZSovCisjaWYgMAordm9pZCBfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9pbmRleF9ieV9yYXRlX2FycmF5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjaGFubmVsLAorCQkJCQkJCQkJCQl1OCAqcmF0ZSwgdTggcGF0aCwgdTggYncsIHU4ICpwb3dlcl9pbmRleCwgdTggc2l6ZSkKK3sKKwl1OCBpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXBvd2VyX2luZGV4W2ldID0gX3J0bDg4MjFhZV9nZXRfdHhwb3dlcl9pbmRleChodywgcGF0aCwgcmF0ZVtpXSwgYncsIGNoYW5uZWwpOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWxfYnlfcGF0aDIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNoYW5uZWwsIHU4IHBhdGgpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bF9wcml2KGh3KS0+cGh5KTsKKwl1OCBjY2tfcmF0ZXNbXSAgPSB7REVTQ19SQVRFMU0sIERFU0NfUkFURTJNLCBERVNDX1JBVEU1XzVNLCBERVNDX1JBVEUxMU19OworCXU4IG9mZG1fcmF0ZXNbXSAgPSB7REVTQ19SQVRFNk0sIERFU0NfUkFURTlNLCBERVNDX1JBVEUxMk0sIERFU0NfUkFURTE4TSwKKwkJCQkJCURFU0NfUkFURTI0TSwgREVTQ19SQVRFMzZNLCBERVNDX1JBVEU0OE0sIERFU0NfUkFURTU0TX07CisJdTggaHRfcmF0ZXNfMXRbXSAgPSB7REVTQ19SQVRFTUNTMCwgREVTQ19SQVRFTUNTMSwgREVTQ19SQVRFTUNTMiwgREVTQ19SQVRFTUNTMywKKwkJCQkJCSBERVNDX1JBVEVNQ1M0LCBERVNDX1JBVEVNQ1M1LCBERVNDX1JBVEVNQ1M2LCBERVNDX1JBVEVNQ1M3fTsKKwl1OCBodF9yYXRlc18ydFtdICA9IHtERVNDX1JBVEVNQ1M4LCBERVNDX1JBVEVNQ1M5LCBERVNDX1JBVEVNQ1MxMCwgREVTQ19SQVRFTUNTMTEsCisJCQkJCQkgREVTQ19SQVRFTUNTMTIsIERFU0NfUkFURU1DUzEzLCBERVNDX1JBVEVNQ1MxNCwgREVTQ19SQVRFTUNTMTV9OworCXU4IHZodF9yYXRlc18xdFtdICA9IHtERVNDX1JBVEVWSFQxU1NfTUNTMCwgREVTQ19SQVRFVkhUMVNTX01DUzEsIERFU0NfUkFURVZIVDFTU19NQ1MyLCBERVNDX1JBVEVWSFQxU1NfTUNTMywgREVTQ19SQVRFVkhUMVNTX01DUzQsCisJCQkJCQkgIERFU0NfUkFURVZIVDFTU19NQ1M1LCBERVNDX1JBVEVWSFQxU1NfTUNTNiwgREVTQ19SQVRFVkhUMVNTX01DUzcsIERFU0NfUkFURVZIVDFTU19NQ1M4LCBERVNDX1JBVEVWSFQxU1NfTUNTOX07CisJdTggdmh0X3JhdGVzXzJ0W10gID0ge0RFU0NfUkFURVZIVDJTU19NQ1MwLCBERVNDX1JBVEVWSFQyU1NfTUNTMSwgREVTQ19SQVRFVkhUMlNTX01DUzIsIERFU0NfUkFURVZIVDJTU19NQ1MzLCBERVNDX1JBVEVWSFQyU1NfTUNTNCwKKwkJCQkJCSAgREVTQ19SQVRFVkhUMlNTX01DUzUsIERFU0NfUkFURVZIVDJTU19NQ1M2LCBERVNDX1JBVEVWSFQyU1NfTUNTNywgREVTQ19SQVRFVkhUMlNTX01DUzgsIERFU0NfUkFURVZIVDJTU19NQ1M5fTsKKwl1OCBpLCBqOworCXU4IHB3cmlkeFs0OF0gPSB7MH07CisJdTggY3MgPSBzaXplb2YoY2NrX3JhdGVzKSAvIHNpemVvZih1OCk7CisJdTggb3MgPSBzaXplb2Yob2ZkbV9yYXRlcykgLyBzaXplb2YodTgpOworCXU4IGgxcyA9IHNpemVvZihodF9yYXRlc18xdCkgLyBzaXplb2YodTgpOworCXU4IGgycyA9IHNpemVvZihodF9yYXRlc18ydCkgLyBzaXplb2YodTgpOworCXU4IHYxcyA9IHNpemVvZih2aHRfcmF0ZXNfMXQpIC8gc2l6ZW9mKHU4KTsKKwl1OCB2MnMgPSBzaXplb2Yodmh0X3JhdGVzXzJ0KSAvIHNpemVvZih1OCk7CisKKwl1OCBsZW4sIHN0YXJ0OworCXUzMiByZWdfYWRkciwgcG93ZXJfaW5kZXg7CisJdTggYncgPSBydGxwaHktPmN1cnJlbnRfY2hhbl9idzsKKworCV9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2luZGV4X2J5X3JhdGVfYXJyYXkoaHcsIGNoYW5uZWwsCisJCW9mZG1fcmF0ZXMsIHBhdGgsIGJ3LCAmcHdyaWR4W2NzXSwgb3MpOworCisJX3J0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfaW5kZXhfYnlfcmF0ZV9hcnJheShodywgY2hhbm5lbCwKKwkJaHRfcmF0ZXNfMXQsIHBhdGgsIGJ3LCAmcHdyaWR4W2NzK29zXSwgaDFzKTsKKworCV9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2luZGV4X2J5X3JhdGVfYXJyYXkoaHcsIGNoYW5uZWwsCisJCXZodF9yYXRlc18xdCwgcGF0aCwgYncsICZwd3JpZHhbY3Mrb3MraDFzK2gyc10sIHYxcyk7CisKKworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCV9ydGw4ODIxYWVfcGh5X2dldF90eHBvd2VyX2luZGV4X2J5X3JhdGVfYXJyYXkoaHcsIGNoYW5uZWwsCisJCQljY2tfcmF0ZXMsIHBhdGgsIGJ3LCBwd3JpZHgsIGNzKTsKKworCQlzdGFydCA9IDA7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBjczsKKwl9CisKKwlyZWdfYWRkciA9IChwYXRoID09IDApID8gUlRYQUdDX0FfQ0NLMTFfQ0NLMSA6IFJUWEFHQ19CX0NDSzExX0NDSzE7CisJcmVnX2FkZHIgKz0gc3RhcnQ7CisKKwlsZW4gPSBjcyArIG9zICsgaDFzICsgaDJzICsgdjFzOworCWlmIChydGxwaHktPm51bV90b3RhbF9yZnBhdGggPj0gMikgeworCQlfcnRsODgyMWFlX3BoeV9nZXRfdHhwb3dlcl9pbmRleF9ieV9yYXRlX2FycmF5KGh3LCBjaGFubmVsLAorCQkJaHRfcmF0ZXNfMnQsIHBhdGgsIGJ3LCAmcHdyaWR4W2NzK29zK2gxc10sIGgycyk7CisKKwkJX3J0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfaW5kZXhfYnlfcmF0ZV9hcnJheShodywgY2hhbm5lbCwKKwkJCXZodF9yYXRlc18ydCwgcGF0aCwgYncsICZwd3JpZHhbY3Mrb3MraDFzK2gycyt2MXNdLCB2MnMpOworCisJCWxlbiArPSB2MnM7CisJfQorCWZvciAoaSA9IHN0YXJ0OyBpIDwgbGVuOyBpICs9IDQpIHsKKwkJcG93ZXJfaW5kZXggPSAwOworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorCQkJcG93ZXJfaW5kZXggfD0gKHB3cmlkeFtpK2pdIDw8IChqKjgpKTsKKwkJcnRsX3NldF9iYnJlZyhodywgcmVnX2FkZHIgKyBpLCBNQVNLRFdPUkQsIHBvd2VyX2luZGV4KTsKKwl9CisKKwlfcnRsODgyMWFlX3BoeV90eHBvd2VyX3RyYWluaW5nX2J5X3BhdGgoaHcsIHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3LCBjaGFubmVsLCBwYXRoKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggcGF0aCA9IDA7CisKKwlmb3IgKHBhdGggPSBSRjkwX1BBVEhfQTsgcGF0aCA8IHJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aDsgKytwYXRoICkKKwkJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbF9ieV9wYXRoKGh3LCBjaGFubmVsLCBwYXRoKTsKK30KKworc3RhdGljIGxvbmcgX3J0bDg4MjFhZV9waHlfdHhwd3JfaWR4X3RvX2RibShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIGVudW0gd2lyZWxlc3NfbW9kZSB3aXJlbGVzc21vZGUsCisJCQkJCSB1OCB0eHB3cmlkeCkKK3sKKwlsb25nIG9mZnNldDsKKwlsb25nIHB3cm91dF9kYm07CisKKwlzd2l0Y2ggKHdpcmVsZXNzbW9kZSkgeworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlvZmZzZXQgPSAtNzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJY2FzZSBXSVJFTEVTU19NT0RFX05fMjRHOgorCQlvZmZzZXQgPSAtODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb2Zmc2V0ID0gLTg7CisJCWJyZWFrOworCX0KKwlwd3JvdXRfZGJtID0gdHhwd3JpZHggLyAyICsgb2Zmc2V0OworCXJldHVybiBwd3JvdXRfZGJtOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2Nhbl9vcGVyYXRpb25fYmFja3VwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBvcGVyYXRpb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJZW51bSBpb190eXBlIGlvdHlwZSA9IElPX0NNRF9QQVVTRV9CQU5EMF9ETV9CWV9TQ0FOOworCisJaWYgKCFpc19oYWxfc3RvcChydGxoYWwpKSB7CisJCXN3aXRjaCAob3BlcmF0aW9uKSB7CisJCWNhc2UgU0NBTl9PUFRfQkFDS1VQX0JBTkQwOgorCQkJaW90eXBlID0gSU9fQ01EX1BBVVNFX0JBTkQwX0RNX0JZX1NDQU47CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9JT19DTUQsCisJCQkJCQkgICAgICAodTggKikgJiBpb3R5cGUpOworCisJCQlicmVhazsKKwkJY2FzZSBTQ0FOX09QVF9CQUNLVVBfQkFORDE6CisJCQlpb3R5cGUgPSBJT19DTURfUEFVU0VfQkFORDFfRE1fQllfU0NBTjsKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LAorCQkJCQkJICAgICAgSFdfVkFSX0lPX0NNRCwKKwkJCQkJCSAgICAgICh1OCAqKSAmIGlvdHlwZSk7CisKKwkJCWJyZWFrOworCQljYXNlIFNDQU5fT1BUX1JFU1RPUkU6CisJCQlpb3R5cGUgPSBJT19DTURfUkVTVU1FX0RNX0JZX1NDQU47CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9JT19DTUQsCisJCQkJCQkgICAgICAodTggKikgJiBpb3R5cGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJCSAoIlVua25vd24gU2NhbiBCYWNrdXAgb3BlcmF0aW9uLlxuIikpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfcGh5X3NldF9yZWdfYncoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTggYncpCit7CisJdTE2IHJlZ19yZl9tb2RlX2J3LCB0bXAgPSAwOworCXJlZ19yZl9tb2RlX2J3ID0gcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfVFJYUFRDTF9DVEwpOworCXN3aXRjaCAoYncpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19UUlhQVENMX0NUTCwgcmVnX3JmX21vZGVfYncgJiAweEZFN0YpOworCQlicmVhazsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCXRtcCA9IHJlZ19yZl9tb2RlX2J3IHwgQklUKDcpOworCQlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfVFJYUFRDTF9DVEwsIHRtcCAmIDB4RkVGRik7CisJCWJyZWFrOworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF84MDoKKwkJdG1wID0gcmVnX3JmX21vZGVfYncgfCBCSVQoOCk7CisJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19UUlhQVENMX0NUTCwgdG1wICYgMHhGRjdGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLCgidW5rbm93biBCYW5kd2lkdGg6IDB4JXhcbiIsYncpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdTggX3J0bDg4MjFhZV9waHlfZ2V0X3NlY29uZGFyeV9jaG5sKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYpCit7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxwcml2KTsKKwl1OCBzY19zZXRfNDAgPSAwLCBzY19zZXRfMjAgPTA7CisKKwlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF84MCkgeworCQlpZihtYWMtPmN1cl84MF9wcmltZV9zYyA9PSBQUklNRV9DSE5MX09GRlNFVF9MT1dFUikKKwkJCXNjX3NldF80MCA9IFZIVF9EQVRBX1NDXzQwX0xPV0VSX09GXzgwTUhaOworCQllbHNlIGlmKG1hYy0+Y3VyXzgwX3ByaW1lX3NjID09IFBSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQorCQkJc2Nfc2V0XzQwID0gVkhUX0RBVEFfU0NfNDBfVVBQRVJfT0ZfODBNSFo7CisJCWVsc2UKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJKCJTQ01hcHBpbmc6IE5vdCBDb3JyZWN0IFByaW1hcnk0ME1IeiBTZXR0aW5nIFxuIikpOworCisJCWlmKChtYWMtPmN1cl80MF9wcmltZV9zYyA9PSBQUklNRV9DSE5MX09GRlNFVF9MT1dFUikgJiYKKwkJCShtYWMtPmN1cl84MF9wcmltZV9zYyA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpKQorCQkJc2Nfc2V0XzIwID0gVkhUX0RBVEFfU0NfMjBfTE9XRVNUX09GXzgwTUhaOworCQllbHNlIGlmKChtYWMtPmN1cl80MF9wcmltZV9zYyA9PSBQUklNRV9DSE5MX09GRlNFVF9VUFBFUikgJiYKKwkJCShtYWMtPmN1cl84MF9wcmltZV9zYyA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpKQorCQkJc2Nfc2V0XzIwID0gVkhUX0RBVEFfU0NfMjBfTE9XRVJfT0ZfODBNSFo7CisJCWVsc2UgaWYoKG1hYy0+Y3VyXzQwX3ByaW1lX3NjID09IFBSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKSAmJgorCQkJKG1hYy0+Y3VyXzgwX3ByaW1lX3NjID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUikpCisJCQlzY19zZXRfMjAgPSBWSFRfREFUQV9TQ18yMF9VUFBFUl9PRl84ME1IWjsKKwkJZWxzZSBpZigobWFjLT5jdXJfNDBfcHJpbWVfc2MgPT0gUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpICYmCisJCQkobWFjLT5jdXJfODBfcHJpbWVfc2MgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKSkKKwkJCXNjX3NldF8yMCA9IFZIVF9EQVRBX1NDXzIwX1VQUEVSU1RfT0ZfODBNSFo7CisJCWVsc2UKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJKCJTQ01hcHBpbmc6IE5vdCBDb3JyZWN0IFByaW1hcnk0ME1IeiBTZXR0aW5nIFxuIikpOworCX0gZWxzZSBpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkgeworCQlpZiAobWFjLT5jdXJfNDBfcHJpbWVfc2MgPT0gUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCisJCQlzY19zZXRfMjAgPSBWSFRfREFUQV9TQ18yMF9VUFBFUl9PRl84ME1IWjsKKwkJZWxzZSBpZiAobWFjLT5jdXJfNDBfcHJpbWVfc2MgPT0gUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCisJCQlzY19zZXRfMjAgPSBWSFRfREFUQV9TQ18yMF9MT1dFUl9PRl84ME1IWjsKKwkJZWxzZQorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlNDTWFwcGluZzogTm90IENvcnJlY3QgUHJpbWFyeTQwTUh6IFNldHRpbmcgXG4iKSk7CisJfQorCXJldHVybiAoKHNjX3NldF80MCA8PCA0KSB8IHNjX3NldF8yMCk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3BoeV9zZXRfYndfbW9kZV9jYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCBzdWJfY2hubCA9IDA7CisJdTggbDFwa192YWwgPSAwOworCisJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfVFJBQ0UsCisJCSAoIlN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsCisJCSAgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgPworCQkgICIyME1IeiIgOgorCQkgIChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID8KKwkJICAiNDBNSHoiIDogIjgwTUh6IikpKSkKKworCisKKwlfcnRsODgyMWFlX3BoeV9zZXRfcmVnX2J3KHJ0bHByaXYsIHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3KTsKKwlzdWJfY2hubCA9IF9ydGw4ODIxYWVfcGh5X2dldF9zZWNvbmRhcnlfY2hubChydGxwcml2KTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDA0ODMsIHN1Yl9jaG5sKTsKKworCXN3aXRjaCAocnRscGh5LT5jdXJyZW50X2NoYW5fYncpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgwMDMwMDNDMywgMHgwMDMwMDIwMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBRENfQlVGX0NMSywgQklUKDMwKSwgMCk7CisKKwkJaWYocnRscGh5LT5yZl90eXBlID09IFJGXzJUMlIpCisJCQlydGxfc2V0X2JicmVnKGh3LCBSTDFQRUFLVEgsIDB4MDNDMDAwMDAsIDcpOworCQllbHNlCisJCQlydGxfc2V0X2JicmVnKGh3LCBSTDFQRUFLVEgsIDB4MDNDMDAwMDAsIDgpOworCQlicmVhazsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgwMDMwMDNDMywgMHgwMDMwMDIwMSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJBRENfQlVGX0NMSywgQklUKDMwKSwgMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgzQywgc3ViX2NobmwpOworCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NBT05TRUMsIDB4ZjAwMDAwMDAsIHN1Yl9jaG5sKTsKKworCQlpZihydGxwaHktPnJlZ184MzcgJiBCSVQoMikpCisJCQlsMXBrX3ZhbCA9IDY7CisJCWVsc2UKKwkJeworCQkJaWYocnRscGh5LT5yZl90eXBlID09IFJGXzJUMlIpCisJCQkJbDFwa192YWwgPSA3OworCQkJZWxzZQorCQkJCWwxcGtfdmFsID0gODsKKwkJfQorCQlydGxfc2V0X2JicmVnKGh3LCBSTDFQRUFLVEgsIDB4MDNDMDAwMDAsIGwxcGtfdmFsKTsJLy8gMHg4NDhbMjU6MjJdID0gMHg2CisKKwkJaWYoc3ViX2NobmwgPT0gVkhUX0RBVEFfU0NfMjBfVVBQRVJfT0ZfODBNSFopCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NLX1NZU1RFTSwgQkNDS19TWVNURU0sIDEpOworCQllbHNlCisJCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NLX1NZU1RFTSwgQkNDS19TWVNURU0sIDApOworCQlicmVhazsKKworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF84MDoKKwkJcnRsX3NldF9iYnJlZyhodywgUlJGTU9ELCAweDAwMzAwM0MzLCAweDAwMzAwMjAyKTsgLy8gMHg4YWNbMjEsMjAsOTo2LDEsMF09OCdiMTExMDAwMTAKKwkJcnRsX3NldF9iYnJlZyhodywgUkFEQ19CVUZfQ0xLLCBCSVQoMzApLCAxKTsJCQkvLyAweDhjNFszMF0gPSAxCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJSRk1PRCwgMHgzQywgc3ViX2NobmwpOworCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NBT05TRUMsIDB4ZjAwMDAwMDAsIHN1Yl9jaG5sKTsKKworCQlpZihydGxwaHktPnJlZ184MzcgJiBCSVQoMikpCisJCQlsMXBrX3ZhbCA9IDU7CisJCWVsc2UKKwkJeworCQkJaWYocnRscGh5LT5yZl90eXBlID09IFJGXzJUMlIpCisJCQkJbDFwa192YWwgPSA2OworCQkJZWxzZQorCQkJCWwxcGtfdmFsID0gNzsKKwkJfQorCQlydGxfc2V0X2JicmVnKGh3LCBSTDFQRUFLVEgsIDB4MDNDMDAwMDAsIGwxcGtfdmFsKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgidW5rbm93biBiYW5kd2lkdGg6ICUjWFxuIiwgcnRscGh5LT5jdXJyZW50X2NoYW5fYncpKTsKKwkJYnJlYWs7CisJfQorCisJcnRsODgxMmFlX2ZpeHNwdXIoaHcsIHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCk7CisKKwlydGw4ODIxYWVfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbl9idyk7CisJcnRscGh5LT5zZXRfYndtb2RlX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfU0NBTiwgREJHX0xPVUQsICgiIFxuIikpOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X2J3X21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaF90eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggdG1wX2J3ID0gcnRscGh5LT5jdXJyZW50X2NoYW5fYnc7CisKKwlpZiAocnRscGh5LT5zZXRfYndtb2RlX2lucHJvZ3Jlc3MpCisJCXJldHVybjsKKwlydGxwaHktPnNldF9id21vZGVfaW5wcm9ncmVzcyA9IHRydWU7CisJaWYgKCghaXNfaGFsX3N0b3AocnRsaGFsKSkgJiYgIShSVF9DQU5OT1RfSU8oaHcpKSkgeworCQlydGw4ODIxYWVfcGh5X3NldF9id19tb2RlX2NhbGxiYWNrKGh3KTsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJGQUxTRSBkcml2ZXIgc2xlZXAgb3IgdW5sb2FkXG4iKSk7CisJCXJ0bHBoeS0+c2V0X2J3bW9kZV9pbnByb2dyZXNzID0gZmFsc2U7CisJCXJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID0gdG1wX2J3OworCX0KK30KKwordm9pZCBydGw4ODIxYWVfcGh5X3N3X2NobmxfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCBjaGFubmVsID0gcnRscGh5LT5jdXJyZW50X2NoYW5uZWw7CisJdTggcGF0aDsKKwl1MzIgZGF0YTsKKworCVJUX1RSQUNFKENPTVBfU0NBTiwgREJHX1RSQUNFLAorCQkgKCJzd2l0Y2ggdG8gY2hhbm5lbCVkXG4iLCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCkpOworCWlmIChpc19oYWxfc3RvcChydGxoYWwpKQorCQlyZXR1cm47CisKKwlpZiAoMzYgPD0gY2hhbm5lbCAmJiBjaGFubmVsIDw9IDQ4KQorCQlkYXRhID0gMHg0OTQ7CisJZWxzZSBpZiAoNTAgPD0gY2hhbm5lbCAmJiBjaGFubmVsIDw9IDY0KQorCQlkYXRhID0gMHg0NTM7CisJZWxzZSBpZiAoMTAwIDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSAxMTYpCisJCWRhdGEgPSAweDQ1MjsKKwllbHNlIGlmICgxMTggPD0gY2hhbm5lbCkKKwkJZGF0YSA9IDB4NDEyOworCWVsc2UKKwkJZGF0YSA9IDB4OTZhOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGQ19BUkVBLCAweDFmZmUwMDAwLCBkYXRhKTsKKworCisJZm9yKHBhdGggPSBSRjkwX1BBVEhfQTsgcGF0aCA8IHJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aDsgcGF0aCsrKQorCXsKKwkJaWYgKDM2IDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSA2NCkKKwkJCWRhdGEgPSAweDEwMTsKKwkJZWxzZSBpZiAoMTAwIDw9IGNoYW5uZWwgJiYgY2hhbm5lbCA8PSAxNDApCisJCQlkYXRhID0gMHgzMDE7CisJCWVsc2UgaWYgKDE0MCA8IGNoYW5uZWwpCisJCQlkYXRhID0gMHg1MDE7CisJCWVsc2UKKwkJCWRhdGEgPSAweDAwMDsKKwkJcnRsODgyMWFlX3BoeV9zZXRfcmZfcmVnKGh3LCBwYXRoLCBSRl9DSE5MQlcsCisJCQlCSVQoMTgpfEJJVCgxNyl8QklUKDE2KXxCSVQoOSl8QklUKDgpLCBkYXRhKTsKKworCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIHBhdGgsIFJGX0NITkxCVywKKwkJCUJNQVNLQllURTAsIGNoYW5uZWwpOworCisJCWlmIChjaGFubmVsID4gMTQpIHsKKwkJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODIxQUUpIHsKKwkJCQlpZiAoMzYgPD0gY2hhbm5lbCAmJiBjaGFubmVsIDw9IDY0KQorCQkJCQlkYXRhID0gMHgxMTRFOTsKKwkJCQllbHNlIGlmICgxMDAgPD0gY2hhbm5lbCAmJiBjaGFubmVsIDw9IDE0MCkKKwkJCQkJZGF0YSA9IDB4MTEwRTk7CisJCQkJZWxzZQorCQkJCQlkYXRhID0gMHgxMTBFOTsKKwkJCQlydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoaHcsIHBhdGgsIFJGX0FQSywKKwkJCQkJQlJGUkVHT0ZGU0VUTUFTSywgZGF0YSk7CisJCQl9CisJCX0KKwl9CisJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfVFJBQ0UsICgiXG4iKSk7Cit9CisKK3U4IHJ0bDg4MjFhZV9waHlfc3dfY2hubChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUzMiB0aW1lb3V0ID0gMTAwMCwgdGltZWNvdW50ID0gMDsKKwl1OCBjaGFubmVsID0gcnRscGh5LT5jdXJyZW50X2NoYW5uZWw7CisKKwlpZiAocnRscGh5LT5zd19jaG5sX2lucHJvZ3Jlc3MpCisJCXJldHVybiAwOworCWlmIChydGxwaHktPnNldF9id21vZGVfaW5wcm9ncmVzcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGlzX2hhbF9zdG9wKHJ0bGhhbCkpIHx8IChSVF9DQU5OT1RfSU8oaHcpKSkgeworCQlSVF9UUkFDRShDT01QX0NIQU4sIERCR19MT1VELAorCQkJICgic3dfY2hubF9pbnByb2dyZXNzIGZhbHNlIGRyaXZlciBzbGVlcCBvciB1bmxvYWRcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChydGxwaHktPmxja19pbnByb2dyZXNzICYmIHRpbWVjb3VudCA8IHRpbWVvdXQpIHsKKwkJbWRlbGF5KDUwKTsKKwkJdGltZWNvdW50ICs9IDUwOworCX0KKworCWlmIChydGxwaHktPmN1cnJlbnRfY2hhbm5lbCA+IDE0ICYmIHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSAhPSBCQU5EX09OXzVHKQorCQlydGw4ODIxYWVfcGh5X3N3aXRjaF93aXJlbGVzc2JhbmQoaHcsIEJBTkRfT05fNUcpOworCWVsc2UgaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsIDw9IDE0ICYmIHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSAhPSBCQU5EX09OXzJfNEcpCisJCXJ0bDg4MjFhZV9waHlfc3dpdGNoX3dpcmVsZXNzYmFuZChodywgQkFORF9PTl8yXzRHKTsKKworCXJ0bHBoeS0+c3dfY2hubF9pbnByb2dyZXNzID0gdHJ1ZTsKKwlpZiAoY2hhbm5lbCA9PSAwKQorCQljaGFubmVsID0gMTsKKworCVJUX1RSQUNFKENPTVBfU0NBTiwgREJHX1RSQUNFLAorCQkgKCJzd2l0Y2ggdG8gY2hhbm5lbCVkLCBiYW5kIHR5cGUgaXMgJWRcbiIsIHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsLCBydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUpKTsKKworCXJ0bDg4MjFhZV9waHlfc3dfY2hubF9jYWxsYmFjayhodyk7CisKKwlydGw4ODIxYWVfZG1fY2xlYXJfdHhwb3dlcl90cmFja2luZ19zdGF0ZShodyk7CisJcnRsODgyMWFlX3BoeV9zZXRfdHhwb3dlcl9sZXZlbChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpOworCisJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfVFJBQ0UsICgiXG4iKSk7CisJcnRscGh5LT5zd19jaG5sX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwlyZXR1cm4gMTsKK30KKworI2lmIDAKK3N0YXRpYyB1OCBfcnRsODgyMWFlX3BoeV9wYXRoX2JfaXFrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXUzMiByZWdfZWFjLCByZWdfZWI0LCByZWdfZWJjLCByZWdfZWM0LCByZWdfZWNjOworCXU4IHJlc3VsdCA9IDB4MDA7CisKKwlydGxfc2V0X2JicmVnKGh3LCAweGU2MCwgTUFTS0RXT1JELCAweDAwMDAwMDAyKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU2MCwgTUFTS0RXT1JELCAweDAwMDAwMDAwKTsKKwltZGVsYXkoSVFLX0RFTEFZX1RJTUUpOworCXJlZ19lYWMgPSBydGxfZ2V0X2JicmVnKGh3LCAweGVhYywgTUFTS0RXT1JEKTsKKwlyZWdfZWI0ID0gcnRsX2dldF9iYnJlZyhodywgMHhlYjQsIE1BU0tEV09SRCk7CisJcmVnX2ViYyA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWJjLCBNQVNLRFdPUkQpOworCXJlZ19lYzQgPSBydGxfZ2V0X2JicmVnKGh3LCAweGVjNCwgTUFTS0RXT1JEKTsKKwlyZWdfZWNjID0gcnRsX2dldF9iYnJlZyhodywgMHhlY2MsIE1BU0tEV09SRCk7CisKKwlpZiAoIShyZWdfZWFjICYgQklUKDMxKSkgJiYKKwkgICAgKCgocmVnX2ViNCAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDE0MikgJiYKKwkgICAgKCgocmVnX2ViYyAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDQyKSkKKwkJcmVzdWx0IHw9IDB4MDE7CisJZWxzZQorCQlyZXR1cm4gcmVzdWx0OworCWlmICghKHJlZ19lYWMgJiBCSVQoMzApKSAmJgorCSAgICAoKChyZWdfZWM0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTMyKSAmJgorCSAgICAoKChyZWdfZWNjICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MzYpKQorCQlyZXN1bHQgfD0gMHgwMjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdTggX3J0bDg4MjFhZV9waHlfcGF0aF9hX3J4X2lxayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBjb25maWdfcGF0aGIpCit7CisJdTMyIHJlZ19lYWMsIHJlZ19lOTQsIHJlZ19lOWMsIHJlZ19lYTQsdTMydGVtcDsKKwl1OCByZXN1bHQgPSAweDAwOworCisJLypHZXQgVFhJTVIgU2V0dGluZyovCisJLypNb2RpZnkgUlggSVFLIG1vZGUgdGFibGUqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9JUUssIE1BU0tEV09SRCwgMHgwMDAwMDAwMCk7CisJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1dFX0xVVCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ODAwYTApOworCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCBSRl9SQ0tfT1MsIFJGUkVHX09GRlNFVF9NQVNLLCAweDMwMDAwKTsKKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgUkZfVFhQQV9HMSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwMGYpOworCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCBSRl9UWFBBX0cyLCBSRlJFR19PRkZTRVRfTUFTSywgMHhmMTE3Yik7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0lRSywgTUFTS0RXT1JELCAweDgwODAwMDAwKTsKKworCS8qSVFLIFNldHRpbmcqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJUeF9JUUssIE1BU0tEV09SRCwgMHgwMTAwN2MwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUlJ4X0lRSywgTUFTS0RXT1JELCAweDgxMDA0ODAwKTsKKworCS8qcGF0aCBhIElRSyBzZXR0aW5nKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSVHhfSVFLX1RvbmVfQSwgTUFTS0RXT1JELCAweDEwMDA4YzFjKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSUnhfSVFLX1RvbmVfQSwgTUFTS0RXT1JELCAweDMwMDA4YzFjKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSVHhfSVFLX1BJX0EsIE1BU0tEV09SRCwgMHg4MjE2MDgwNCk7CisJcnRsX3NldF9iYnJlZyhodywgUlJ4X0lRS19QSV9BLCBNQVNLRFdPUkQsIDB4MjgxNjAwMDApOworCisJLypMTyBjYWxpYnJhdGlvbiBTZXR0aW5nKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSSVFLX0FHQ19Sc3AsIE1BU0tEV09SRCwgMHgwMDQ2YTkxMSk7CisJLypvbmUgc2hvdCxwYXRoIEEgTE9LICYgaXFrKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSSVFLX0FHQ19QdHMsIE1BU0tEV09SRCwgMHhmOTAwMDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUklRS19BR0NfUHRzLCBNQVNLRFdPUkQsIDB4ZjgwMDAwMDApOworCisJbWRlbGF5KElRS19ERUxBWV9USU1FKTsKKworCXJlZ19lYWMgPSBydGxfZ2V0X2JicmVnKGh3LCBSUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMiwgTUFTS0RXT1JEKTsKKwlyZWdfZTk0ID0gcnRsX2dldF9iYnJlZyhodywgUlR4X1Bvd2VyX0JlZm9yZV9JUUtfQSwgTUFTS0RXT1JEKTsKKwlyZWdfZTljID0gcnRsX2dldF9iYnJlZyhodywgUlR4X1Bvd2VyX0FmdGVyX0lRS19BLCBNQVNLRFdPUkQpOworCisKKwlpZiAoIShyZWdfZWFjICYgQklUKDI4KSkgJiYKKwkgICAgKCgocmVnX2U5NCAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDE0MikgJiYKKwkgICAgKCgocmVnX2U5YyAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDQyKSkKKwkJcmVzdWx0IHw9IDB4MDE7CisJZWxzZQorCQlyZXR1cm4gcmVzdWx0OworCisJdTMydGVtcCA9IDB4ODAwMDdDMDAgfCAocmVnX2U5NCYweDNGRjAwMDApICB8ICgocmVnX2U5YyYweDNGRjAwMDApID4+IDE2KTsKKwlydGxfc2V0X2JicmVnKGh3LCBSVHhfSVFLLCBNQVNLRFdPUkQsIHUzMnRlbXApOworCS8qUlggSVFLKi8KKwkvKk1vZGlmeSBSWCBJUUsgbW9kZSB0YWJsZSovCisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0lRSywgTUFTS0RXT1JELCAweDAwMDAwMDAwKTsKKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgUkZfV0VfTFVULCBSRlJFR19PRkZTRVRfTUFTSywgMHg4MDBhMCk7CisJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1JDS19PUywgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MzAwMDApOworCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCBSRl9UWFBBX0cxLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMDAwZik7CisJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1RYUEFfRzIsIFJGUkVHX09GRlNFVF9NQVNLLCAweGY3ZmZhKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfSVFLLCBNQVNLRFdPUkQsIDB4ODA4MDAwMDApOworCisJLypJUUsgU2V0dGluZyovCisJcnRsX3NldF9iYnJlZyhodywgUlJ4X0lRSywgTUFTS0RXT1JELCAweDAxMDA0ODAwKTsKKworCS8qcGF0aCBhIElRSyBzZXR0aW5nKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSVHhfSVFLX1RvbmVfQSwgTUFTS0RXT1JELCAweDMwMDA4YzFjKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSUnhfSVFLX1RvbmVfQSwgTUFTS0RXT1JELCAweDEwMDA4YzFjKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSVHhfSVFLX1BJX0EsIE1BU0tEV09SRCwgMHg4MjE2MGMwNSk7CisJcnRsX3NldF9iYnJlZyhodywgUlJ4X0lRS19QSV9BLCBNQVNLRFdPUkQsIDB4MjgxNjBjMDUpOworCisJLypMTyBjYWxpYnJhdGlvbiBTZXR0aW5nKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSSVFLX0FHQ19Sc3AsIE1BU0tEV09SRCwgMHgwMDQ2YTkxMSk7CisJLypvbmUgc2hvdCxwYXRoIEEgTE9LICYgaXFrKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSSVFLX0FHQ19QdHMsIE1BU0tEV09SRCwgMHhmOTAwMDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUklRS19BR0NfUHRzLCBNQVNLRFdPUkQsIDB4ZjgwMDAwMDApOworCisJbWRlbGF5KElRS19ERUxBWV9USU1FKTsKKworCXJlZ19lYWMgPSBydGxfZ2V0X2JicmVnKGh3LCBSUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMiwgTUFTS0RXT1JEKTsKKwlyZWdfZTk0ID0gcnRsX2dldF9iYnJlZyhodywgUlR4X1Bvd2VyX0JlZm9yZV9JUUtfQSwgTUFTS0RXT1JEKTsKKwlyZWdfZTljID0gcnRsX2dldF9iYnJlZyhodywgUlR4X1Bvd2VyX0FmdGVyX0lRS19BLCBNQVNLRFdPUkQpOworCXJlZ19lYTQgPSBydGxfZ2V0X2JicmVnKGh3LCBSUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIsIE1BU0tEV09SRCk7CisKKwlpZiAoIShyZWdfZWFjICYgQklUKDI3KSkgJiYKKwkgICAgKCgocmVnX2VhNCAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDEzMikgJiYKKwkgICAgKCgocmVnX2VhYyAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDM2KSkKKwkJcmVzdWx0IHw9IDB4MDI7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCit1OCBfcnRsODgxMmFlX2dldF9yaWdodF9jaG5sX3BsYWNlX2Zvcl9pcWsodTggY2hubCkKK3sKKwl1OCBjaGFubmVsX2FsbFtUQVJHRVRfQ0hOTF9OVU1fMkdfNUdfODgxMl0gPQorCQl7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMzYsMzgsNDAsNDIsXAorCQk0NCw0Niw0OCw1MCw1Miw1NCw1Niw1OCw2MCw2Miw2NCwxMDAsXAorCQkxMDIsMTA0LDEwNiwxMDgsMTEwLDExMiwxMTQsMTE2LDExOCxcCisJCTEyMCwxMjIsMTI0LDEyNiwxMjgsMTMwLDEzMiwxMzQsMTM2LFwKKwkJMTM4LDE0MCwxNDksMTUxLDE1MywxNTUsMTU3LDE1OSwxNjEsXAorCQkxNjMsMTY1fTsKKwl1OCBwbGFjZSA9IGNobmw7CisKKwlpZihjaG5sID4gMTQpCisJeworCQlmb3IocGxhY2UgPSAxNDsgcGxhY2U8c2l6ZW9mKGNoYW5uZWxfYWxsKTsgcGxhY2UrKykKKwkJeworCQkJaWYoY2hhbm5lbF9hbGxbcGxhY2VdID09IGNobmwpCisJCQl7CisJCQkJcmV0dXJuIHBsYWNlLTEzOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfcnhfZmlsbF9pcWMoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJZW51bSByYWRpb19wYXRoIHBhdGgsCisJdTMyIHJ4X3gsCisJdTMyIHJ4X3kKKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJc3dpdGNoIChwYXRoKSB7CisJY2FzZSBSRjkwX1BBVEhfQToKKwkJeworCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJCQlpZiAocnhfeCA+PiAxID09MHgxMTIgfHwgcnhfeSA+PiAxID09IDB4M2VlKXsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweGMxMCwgMHgwMDAwMDNmZiwgMHgxMDApOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzEwLCAweDAzZmYwMDAwLCAwKTsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCSgiUlhfWCA9ICV4OztSWF9ZID0gJXggPT09PT5maWxsIHRvIElRQ1xuIiwKKwkJCQkJcnhfeCA+PiAxICYgMHgwMDAwMDNmZiwgcnhfeSA+PiAxICYgMHgwMDAwMDNmZikpOworCQkJfQorCQkJZWxzZXsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweGMxMCwgMHgwMDAwMDNmZiwgcnhfeCA+PiAxKTsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweGMxMCwgMHgwM2ZmMDAwMCwgcnhfeSA+PiAxKTsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCSgiUlhfWCA9ICV4OztSWF9ZID0gJXggPT09PT5maWxsIHRvIElRQ1xuIiwKKwkJCQkJcnhfeCA+PiAxICYgMHgwMDAwMDNmZiwgcnhfeSA+PiAxICYgMHgwMDAwMDNmZikpOworCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkJKCIweGMxMCA9ICV4ID09PT0+ZmlsbCB0byBJUUNcbiIsCisJCQkJCXJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIDB4YzEwKSkpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0I6CisJCXsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCQkJaWYgKHJ4X3ggPj4gMSA9PTB4MTEyIHx8IHJ4X3kgPj4gMSA9PSAweDNlZSl7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHhlMTAsIDB4MDAwMDAzZmYsIDB4MTAwKTsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweGUxMCwgMHgwM2ZmMDAwMCwgMCk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkoIlJYX1ggPSAleDs7UlhfWSA9ICV4ID09PT0+ZmlsbCB0byBJUUNcbiIsCisJCQkJCXJ4X3ggPj4gMSAmIDB4MDAwMDAzZmYsIHJ4X3kgPj4gMSAmIDB4MDAwMDAzZmYpKTsKKwkJCX0KKwkJCWVsc2V7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHhlMTAsIDB4MDAwMDAzZmYsIHJ4X3ggPj4gMSk7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHhlMTAsIDB4MDNmZjAwMDAsIHJ4X3kgPj4gMSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkoIlJYX1ggPSAleDs7UlhfWSA9ICV4PT09PT5maWxsIHRvIElRQ1xuICIsCisJCQkJCXJ4X3ggPj4gMSAmIDB4MDAwMDAzZmYsIHJ4X3kgPj4gMSAmIDB4MDAwMDAzZmYpKTsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCSgiMHhlMTAgPSAleD09PT0+ZmlsbCB0byBJUUNcbiIsCisJCQkJCXJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIDB4ZTEwKSkpOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfdHhfZmlsbF9pcWMoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJZW51bSByYWRpb19wYXRoIHBhdGgsCisJdTMyIHR4X3gsCisJdTMyIHR4X3kKKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJc3dpdGNoIChwYXRoKSB7CisJY2FzZSBSRjkwX1BBVEhfQToKKwkJeworCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qWzMxXSA9IDEgLS0+IFBhZ2UgQzEqLworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzkwLCAweDAwMDAwMDgwKTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNjNCwgMHgyMDA0MDAwMCk7CisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYzgsIDB4MjAwMDAwMDApOworCQkJcnRsX3NldF9iYnJlZyhodywgMHhjY2MsIDB4MDAwMDA3ZmYsIHR4X3kpOworCQkJcnRsX3NldF9iYnJlZyhodywgMHhjZDQsIDB4MDAwMDA3ZmYsIHR4X3gpOworCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCSgiVFhfWCA9ICV4OztUWF9ZID0gJXggPT09PT0+IGZpbGwgdG8gSVFDXG4iLAorCQkJCXR4X3ggJiAweDAwMDAwN2ZmLCB0eF95ICYgMHgwMDAwMDdmZikpOworCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCSgiMHhjZDQgPSAleDs7MHhjY2MgPSAleCA9PT09PmZpbGwgdG8gSVFDXG4iLAorCQkJCXJ0bF9nZXRfYmJyZWcoaHcsIDB4Y2Q0LCAweDAwMDAwN2ZmKSwKKwkJCQlydGxfZ2V0X2JicmVnKGh3LCAweGNjYywgMHgwMDAwMDdmZikpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9COgorCQl7CisJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLypbMzFdID0gMSAtLT4gUGFnZSBDMSovCisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlOTAsIDB4MDAwMDAwODApOworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWM0LCAweDIwMDQwMDAwKTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGVjOCwgMHgyMDAwMDAwMCk7CisJCQlydGxfc2V0X2JicmVnKGh3LCAweGVjYywgMHgwMDAwMDdmZiwgdHhfeSk7CisJCQlydGxfc2V0X2JicmVnKGh3LCAweGVkNCwgMHgwMDAwMDdmZiwgdHhfeCk7CisJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJKCJUWF9YID0gJXg7O1RYX1kgPSAleCA9PT09PT4gZmlsbCB0byBJUUNcbiIsCisJCQkJdHhfeCYweDAwMDAwN2ZmLCB0eF95JjB4MDAwMDA3ZmYpKTsKKwkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkoIjB4ZWQ0ID0gJXg7OzB4ZWNjID0gJXggPT09PT5maWxsIHRvIElRQ1xuIiwKKwkJCQlydGxfZ2V0X2JicmVnKGh3LCAweGVkNCwgMHgwMDAwMDdmZiksCisJCQkJcnRsX2dldF9iYnJlZyhodywgMHhlY2MsIDB4MDAwMDA3ZmYpKSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKK30KKwordm9pZCBfcnRsODgxMmFlX2lxa19iYWNrdXBfbWFjYmIoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyICptYWNiYl9iYWNrdXAsCisJdTMyICpiYWNrdXBfbWFjYmJfcmVnLAorCXUzMiBtYWNfYmJfbnVtCisJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCSAvKnNhdmUgTUFDQkIgZGVmYXVsdCB2YWx1ZSovCisJZm9yIChpID0gMDsgaSA8IG1hY19iYl9udW07IGkrKykgeworCQltYWNiYl9iYWNrdXBbaV0gPXJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsYmFja3VwX21hY2JiX3JlZ1tpXSk7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIkJhY2t1cE1hY0JCIFN1Y2Nlc3MhISEhXG4iKSk7Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfYmFja3VwX2FmZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgKmFmZV9iYWNrdXAsCisJdTMyICpiYWNrdXBfYWZlX1JFRywKKwl1MzIgYWZlX251bQorCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGk7CisKKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLypbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwkvKlNhdmUgQUZFIFBhcmFtZXRlcnMgKi8KKyAgICAJZm9yIChpID0gMDsgaSA8IGFmZV9udW07IGkrKyl7CisgICAgICAgIAlhZmVfYmFja3VwW2ldID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgYmFja3VwX2FmZV9SRUdbaV0pOworICAgIAl9CisgICAgCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCJCYWNrdXBBRkUgU3VjY2VzcyEhISFcbiIpKTsKK30KKwordm9pZCBfcnRsODgxMmFlX2lxa19iYWNrdXBfcmYoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyICpyZmFfYmFja3VwLAorCXUzMiAqcmZiX2JhY2t1cCwKKwl1MzIgKmJhY2t1cF9yZl9yZWcsCisJdTMyIHJmX251bQorCSkKK3sKKworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCS8qU2F2ZSBSRiBQYXJhbWV0ZXJzKi8KKyAgICAJZm9yIChpID0gMDsgaSA8IHJmX251bTsgaSsrKXsKKyAgICAgICAgCXJmYV9iYWNrdXBbaV0gPSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgYmFja3VwX3JmX3JlZ1tpXSwgQk1BU0tEV09SRCk7CisgICAgICAgIAlyZmJfYmFja3VwW2ldID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0IsIGJhY2t1cF9yZl9yZWdbaV0sIEJNQVNLRFdPUkQpOworICAgIAl9CisJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIkJhY2t1cFJGIFN1Y2Nlc3MhISEhXG4iKSk7Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfY29uZmlndXJlX21hYygKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodworCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJLyogPT09PT09PT1NQUMgcmVnaXN0ZXIgc2V0dGluZz09PT09PT09Ki8KKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLypbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDUyMiwgMHgzZik7CisJcnRsX3NldF9iYnJlZyhodywgMHg1NTAsIEJJVCgxMSkgfCBCSVQoMyksIDB4MCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg4MDgsIDB4MDApOwkJLypSWCBhbnRlIG9mZiovCisJcnRsX3NldF9iYnJlZyhodywgMHg4MzgsIDB4ZiwgMHhjKTsJCS8qQ0NBIG9mZiovCit9CisKKyNkZWZpbmUgY2FsX251bSAxMAorCit2b2lkIF9ydGw4ODEyYWVfaXFrX3R4KAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4IGNobmxfaWR4CisJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisKKwl1OCBkZWxheV9jb3VudDsKKwl1OCBjYWwwX3JldHJ5LCBjYWwxX3JldHJ5OworCXU4IHR4MF9hdmVyYWdlID0gMCwgdHgxX2F2ZXJhZ2UgPSAwLCByeDBfYXZlcmFnZSA9IDAsIHJ4MV9hdmVyYWdlID0gMDsKKyAgICAJaW50IHR4MF94ID0gMCwgdHgwX3kgPSAwLCByeDBfeCA9IDAsIHJ4MF95ID0gMDsKKwlpbnQgdHhfeDBbY2FsX251bV0sIHR4X3kwW2NhbF9udW1dLCByeF94MFtjYWxfbnVtXSwgcnhfeTBbY2FsX251bV07CisJaW50IHR4MV94ID0gMCwgdHgxX3kgPSAwLCByeDFfeCA9IDAsIHJ4MV95ID0gMDsKKwlpbnQgdHhfeDFbY2FsX251bV0sIHR4X3kxW2NhbF9udW1dLCByeF94MVtjYWxfbnVtXSwgcnhfeTFbY2FsX251bV07CisJYm9vbCB0eDBpcWtvaz0gZmFsc2UsIHJ4MGlxa29rID0gZmFsc2UsIHR4MF9mYWlsID0gdHJ1ZSwgcngwX2ZhaWw7CisJYm9vbCBpcWswX3JlYWR5ID0gZmFsc2UsIHR4MF9maW5pc2ggPSBmYWxzZSwgcngwX2ZpbmlzaCA9IGZhbHNlOworCWJvb2wgdHgxaXFrb2sgPSBmYWxzZSwgcngxaXFrb2sgPSBmYWxzZSwgdHgxX2ZhaWwgPSB0cnVlLCByeDFfZmFpbDsKKwlib29sIGlxazFfcmVhZHkgPSBmYWxzZSwgdHgxX2ZpbmlzaCA9IGZhbHNlLCByeDFfZmluaXNoID0gZmFsc2UsIHZkZl9lbmFibGUgPSBmYWxzZTsKKwlpbnQgaSwgdHhfZHRbM10gPSB7MH0sIHJ4X2R0WzNdID0gezB9LCBpaSwgZHggPSAwLCBkeSA9IDA7CisKKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkoIkJhbmRXaWR0aCA9ICVkLlxuIiwKKwkJCXJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3KSk7CisJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfODApeworCQl2ZGZfZW5hYmxlID0gdHJ1ZTsKKwl9CisJdmRmX2VuYWJsZSA9IGZhbHNlOworCisKKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLypbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwkvKj09PT09PT09UGF0aC1BIEFGRSBhbGwgb249PT09PT09PSovCisJLypQb3J0IDAgREFDL0FEQyBvbiovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzYwLCAweDc3Nzc3Nzc3KTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjNjQsIDB4Nzc3Nzc3NzcpOworCisJLyogUG9ydCAxIERBQy9BREMgb2ZmKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlNjAsIDB4Nzc3Nzc3NzcpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU2NCwgMHg3Nzc3Nzc3Nyk7CisKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjNjgsIDB4MTk3OTE5NzkpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU2OCwgMHgxOTc5MTk3OSk7CisJcnRsX3NldF9iYnJlZyhodywweGMwMCwgMHhmLCAweDQpOy8qaGFyZHdhcmUgMy13aXJlIG9mZiovCisJcnRsX3NldF9iYnJlZyhodywweGUwMCwgMHhmLCAweDQpOy8qaGFyZHdhcmUgMy13aXJlIG9mZiovCisKKwkvKkRBQy9BREMgc2FtcGxpbmcgcmF0ZSAoMTYwIE1IeikqLworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzVjLCBCSVQoMjYpIHwgQklUKDI1KSB8IEJJVCgyNCksIDB4Nyk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlNWMsIEJJVCgyNikgfCBCSVQoMjUpIHwgQklUKDI0KSwgMHg3KTsKKwlydGxfc2V0X2JicmVnKGh3LCAweDhjNCwgQklUKDMwKSwgMHgxKTsKKworICAgICAgICAvKj09PT09PSBQYXRoIEEgVFggSVFLIFJGIFNldHRpbmcgPT09PT09Ki8KKwlydGxfc2V0X2JicmVnKGh3LDB4ODJjLCBCSVQoMzEpLCAweDApOyAvLyBbMzFdID0gMCAtLT4gUGFnZSBDCisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHhlZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4MDAwMik7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHgzMCwgQlJGUkVHT0ZGU0VUTUFTSywgMHgyMDAwMCk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHgzMSwgQlJGUkVHT0ZGU0VUTUFTSywgMHgzZmZmZCk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHgzMiwgQlJGUkVHT0ZGU0VUTUFTSywgMHhmZTgzZik7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHg2NSwgQlJGUkVHT0ZGU0VUTUFTSywgMHg5MzFkNSk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQSwgMHg4ZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4YTAwMSk7CisJLyo9PT09PT0gUGF0aCBBIFRYIElRSyBSRiBTZXR0aW5nID09PT09PSovCisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHhlZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4MDAwMik7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHgzMCwgQlJGUkVHT0ZGU0VUTUFTSywgMHgyMDAwMCk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHgzMSwgQlJGUkVHT0ZGU0VUTUFTSywgMHgzZmZmZCk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHgzMiwgQlJGUkVHT0ZGU0VUTUFTSywgMHhmZTgzZik7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHg2NSwgQlJGUkVHT0ZGU0VUTUFTSywgMHg5MzFkNSk7CisJcnRsX3NldF9yZnJlZyhodyxSRjkwX1BBVEhfQiwgMHg4ZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4YTAwMSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTBjLCAweDAwMDA4MDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhiMDAsIDB4MDMwMDAxMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Yzk0LCBCSVQoMCksIDB4MSk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlOTQsIEJJVCgwKSwgMHgxKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5NzgsIDB4MjkwMDIwMDApOy8qIFRYIChYLFkpKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5N2MsIDB4YTkwMDIwMDApOy8qIFJYIChYLFkpKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NjI5MTApOy8qWzBdOkFHQ19lbiwgWzE1XTppZGFjX0tfTWFzayovCisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qIFszMV0gPSAxIC0tPiBQYWdlIEMxKi8KKworCS8qRXh0ZXJuYWxQQV81RyA9PSAwKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4ODIxNDAzZjEpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU4OCwgMHg4MjE0MDNmMSk7CisKKwlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlKXsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDY4MTYzZTk2KTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZThjLCAweDY4MTYzZTk2KTsKKwl9CisJZWxzZXsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDI4MTYzZTk2KTsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZThjLCAweDI4MTYzZTk2KTsKKwl9CisKKwlpZiAodmRmX2VuYWJsZSl7fQorCWVsc2V7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4MCwgMHgxODAwOGMxMCk7LypUWF9Ub25lX2lkeFs5OjBdLCBUeEtfTWFza1syOV0gVFhfVG9uZSA9IDE2Ki8KKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDM4MDA4YzEwKTsvKlJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XSovCisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNlOCwgMHgwMDAwMDAwMCk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU4MCwgMHgxODAwOGMxMCk7LypUWF9Ub25lX2lkeFs5OjBdLCBUeEtfTWFza1syOV0gVFhfVG9uZSA9IDE2Ki8KKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZTg0LCAweDM4MDA4YzEwKTsvKlJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XSovCisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGVlOCwgMHgwMDAwMDAwMCk7CisKKwkJY2FsMF9yZXRyeSA9IDA7CisJCWNhbDFfcmV0cnkgPSAwOworCQl3aGlsZSgxKXsKKwkJCS8qb25lIHNob3QqLworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMTAwMDAwKTsvKiBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUqLworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDAwMTAwMDAwKTsvKiBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUqLworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGZhMDAwMDAwKTsKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk4MCwgMHhmODAwMDAwMCk7CisKKwkJCW1kZWxheSgxMCk7IC8qRGVsYXkgMjVtcyovCisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAwMDAwMDApOworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDAwMDAwMDAwKTsKKwkJCWRlbGF5X2NvdW50ID0gMDsKKwkJCXdoaWxlICgxKXsKKwkJCQlpZiAoIXR4MF9maW5pc2gpCisJCQkJCWlxazBfcmVhZHkgPSAoYm9vbCkgcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIEJJVCgxMCkpOworCQkJCWlmICghdHgxX2ZpbmlzaCkKKwkJCQkJaXFrMV9yZWFkeSA9IChib29sKSBydGxfZ2V0X2JicmVnKGh3LCAweGQ0MCwgQklUKDEwKSk7CisJCQkJaWYgKChpcWswX3JlYWR5ICYmIGlxazFfcmVhZHkpIHx8IChkZWxheV9jb3VudD4yMCkpCisJCQkJCWJyZWFrOworCQkJCWVsc2V7CisJCQkJbWRlbGF5KDEpOworCQkJCWRlbGF5X2NvdW50Kys7CisJCQkJfQorCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIlRYIGRlbGF5X2NvdW50ID0gJWRcbiIsIGRlbGF5X2NvdW50KSk7CisJCQlpZiAoZGVsYXlfY291bnQgPCAyMCl7CQkJCQkJCS8vIElmIDIwbXMgTm8gUmVzdWx0LCB0aGVuIGNhbF9yZXRyeSsrCisJCQkJLyogPT09PT09PT09PT09VFhJUUsgQ2hlY2s9PT09PT09PT09PT09PSovCisJCQkJdHgwX2ZhaWwgPSAoYm9vbCkgcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIEJJVCgxMikpOworCQkJCXR4MV9mYWlsID0gKGJvb2wpIHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDQwLCBCSVQoMTIpKTsKKwkJCQlpZiAoISh0eDBfZmFpbCB8fCB0eDBfZmluaXNoKSl7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwMjAwMDAwMCk7CisJCQkJCXR4X3gwW3R4MF9hdmVyYWdlXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKSA8PCAyMTsKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDA0MDAwMDAwKTsKKwkJCQkJdHhfeTBbdHgwX2F2ZXJhZ2VdID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIDB4MDdmZjAwMDApIDw8IDIxOworCQkJCQl0eDBpcWtvayA9IHRydWU7CisJCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkJCSgiVFhfWDBbJWRdID0gJXggOzsgVFhfWTBbJWRdID0gJXhcbiIsCisJCQkJCQl0eDBfYXZlcmFnZSwgKHR4X3gwW3R4MF9hdmVyYWdlXSkgPj4gMjEgJiAweDAwMDAwN2ZmLAorCQkJCQkJdHgwX2F2ZXJhZ2UsICh0eF95MFt0eDBfYXZlcmFnZV0pID4+IDIxICYgMHgwMDAwMDdmZikpOworCisJCQkJCXR4MF9hdmVyYWdlKys7CisJCQl9CisJCQllbHNleworCQkJCXR4MGlxa29rID0gZmFsc2U7CisJCQkJY2FsMF9yZXRyeSsrOworCQkJCWlmIChjYWwwX3JldHJ5ID09IDEwKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoISh0eDFfZmFpbCB8fCB0eDFfZmluaXNoKSl7CisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDAyMDAwMDAwKTsKKwkJCQl0eF94MVt0eDFfYXZlcmFnZV0gPSBydGxfZ2V0X2JicmVnKGh3LCAweGQ0MCwgMHgwN2ZmMDAwMCkgPDwgMjE7CisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDA0MDAwMDAwKTsKKwkJCQl0eF95MVt0eDFfYXZlcmFnZV0gPSBydGxfZ2V0X2JicmVnKGh3LCAweGQ0MCwgMHgwN2ZmMDAwMCkgPDwgMjE7CisJCQkJdHgxaXFrb2s9IHRydWU7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkoIlRYX1gxWyVkXSA9ICV4IDs7IFRYX1kxWyVkXSA9ICV4XG4iLAorCQkJCQl0eDFfYXZlcmFnZSwgKHR4X3gxW3R4MV9hdmVyYWdlXSkgPj4gMjEgJiAweDAwMDAwN2ZmLAorCQkJCQl0eDFfYXZlcmFnZSwgKHR4X3kxW3R4MV9hdmVyYWdlXSkgPj4gMjEgJiAweDAwMDAwN2ZmKSk7CisKKwkJCQl0eDFfYXZlcmFnZSsrOworCQkJCX0KKwkJCWVsc2V7CisJCQkJdHgxaXFrb2sgPSBmYWxzZTsKKwkJCQljYWwxX3JldHJ5Kys7CisJCQkJaWYgKGNhbDFfcmV0cnkgPT0gMTApCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2V7CisJCQkJdHgwaXFrb2sgPSBmYWxzZTsKKwkJCQl0eDFpcWtvayA9IGZhbHNlOworCQkJCWNhbDBfcmV0cnkrKzsKKwkJCQljYWwxX3JldHJ5Kys7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkoIkRlbGF5IDIwbXMgVFggSVFLIE5vdCBSZWFkeSEhISEhXG4iKSk7CisJCQkJaWYgKGNhbDBfcmV0cnkgPT0gMTApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR4MF9hdmVyYWdlID49IDIpeworCQkJCWZvciAoaSA9IDA7IGkgPCB0eDBfYXZlcmFnZTsgaSsrKXsKKwkJCQkJZm9yIChpaSA9IGkrMTsgaWkgPHR4MF9hdmVyYWdlOyBpaSsrKXsKKwkJCQkJCWR4ID0gKHR4X3gwW2ldID4+IDIxKSAtICh0eF94MFtpaV0gPj4gMjEpOworCQkJCQkJaWYgKGR4IDwgNCAmJiBkeCA+IC00KXsKKwkJCQkJCQlkeSA9ICh0eF95MFtpXT4+MjEpIC0gKHR4X3kwW2lpXT4+MjEpOworCQkJCQkJCWlmIChkeSA8IDQgJiYgZHkgPiAtNCl7CisJCQkJCQkJCXR4MF94ID0gKCh0eF94MFtpXSA+PiAyMSkgKyAodHhfeDBbaWldID4+IDIxKSkgLyAyOworCQkJCQkJCQl0eDBfeSA9ICgodHhfeTBbaV0gPj4gMjEpICsgKHR4X3kwW2lpXSA+PiAyMSkpIC8gMjsKKwkJCQkJCQkJdHhfeDBbMF0gPSB0eF94MFtpXTsKKwkJCQkJCQkJdHhfeTBbMV0gPSB0eF95MFtpaV07CisJCQkJCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkJCQkJCSgiVFgwX1ggPSAleDs7VFgwX1kgPSAleFxuIiwKKwkJCQkJCQkJCXR4MF94ICYgMHgwMDAwMDdmZiwgdHgwX3kgJiAweDAwMDAwN2ZmKSk7CisJCQkJCQkJCWlmICgocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF84MCkKKwkJCQkJCQkJCSYmIHZkZl9lbmFibGUpIHsKKwkJCQkJCQkJCXR4X2R0WzBdID0gKHR4X2R0W2ldICsgdHhfZHRbaWldKSAvIDI7CisJCQkJCQkJCX0KKwkJCQkJCQkJdHgwX2ZpbmlzaCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHR4MV9hdmVyYWdlID49IDIpeworCQkJCWZvciAoaSA9IDA7IGkgPCB0eDFfYXZlcmFnZTsgaSsrKXsKKwkJCQkJZm9yIChpaSA9IGkrMTsgaWkgPCB0eDFfYXZlcmFnZTsgaWkrKyl7CisJCQkJCQlkeCA9ICh0eF94MVtpXSA+PiAyMSkgLSAodHhfeDFbaWldID4+IDIxKTsKKwkJCQkJCWlmIChkeCA8IDQgJiYgZHggPiAtNCl7CisJCQkJCQkJZHkgPSAodHhfeTFbaV0gPj4gMjEpIC0gKHR4X3kxW2lpXSA+PiAyMSk7CisJCQkJCQkJaWYgKGR5IDwgNCAmJiBkeSA+IC00KXsKKwkJCQkJCQkJdHgxX3ggPSAoKHR4X3gxW2ldID4+IDIxKSArICh0eF94MVtpaV0gPj4gMjEpKSAvIDI7CisJCQkJCQkJCXR4MV95ID0gKCh0eF95MVtpXSA+PiAyMSkgKyAodHhfeTFbaWldID4+IDIxKSkgLyAyOworCQkJCQkJCQl0eF94MVswXSA9IHR4X3gxW2ldOworCQkJCQkJCQl0eF95MVsxXSA9IHR4X3kxW2lpXTsKKwkJCQkJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkJCQkJKCJUWDFfWCA9ICV4OztUWDFfWSA9ICV4XG4iLAorCQkJCQkJCQkJdHgxX3ggJiAweDAwMDAwN2ZmLCB0eDFfeSAmIDB4MDAwMDA3ZmYpKTsKKwkJCQkJCQkJaWYgKChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzgwKQorCQkJCQkJCQkJJiYgdmRmX2VuYWJsZSkgeworCQkJCQkJCQkJdHhfZHRbMF0gPSAodHhfZHRbaV0gKyAgdHhfZHRbaWldKSAvIDI7CisJCQkJCQkJCX0KKwkJCQkJCQkJdHgxX2ZpbmlzaCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCSgiVFgwX0F2ZXJhZ2UgPSAlZCwgVFgxX0F2ZXJhZ2UgPSAlZFxuIiwKKwkJCQl0eDBfYXZlcmFnZSwgdHgxX2F2ZXJhZ2UpKTsKKwkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkoIlRYMF9maW5pc2ggPSAlZCwgVFgxX2ZpbmlzaCA9ICVkXG4iLAorCQkJCXR4MF9maW5pc2gsIHR4MV9maW5pc2gpKTsKKwkJCWlmICh0eDBfZmluaXNoICYmIHR4MV9maW5pc2gpCisJCQkJYnJlYWs7CisJCQlpZiAoKGNhbDBfcmV0cnkgKyB0eDBfYXZlcmFnZSkgPj0gMTAKKwkJCQl8fCAoY2FsMV9yZXRyeSArIHR4MV9hdmVyYWdlKSA+PSAxMCApCisJCQkJYnJlYWs7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJUWEFfY2FsX3JldHJ5ID0gJWRcbiIsIGNhbDBfcmV0cnkpKTsKKwkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJUWEJfY2FsX3JldHJ5ID0gJWRcbiIsIGNhbDFfcmV0cnkpKTsKKworCX0KKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKiBbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHg1OCwgMHg3ZmUwMCwKKwkJcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4OCwgMHhmZmMwMCkpOyAvKkxvYWQgTE9LKi8KKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQiwgMHg1OCwgMHg3ZmUwMCwKKwkJcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0IsIDB4OCwgMHhmZmMwMCkpOyAvKiBMb2FkIExPSyovCisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qWzMxXSA9IDEgLS0+IFBhZ2UgQzEqLworCisKKwlpZiAodmRmX2VuYWJsZSkge30KKwllbHNleworCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLypbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwkJaWYgKHR4MF9maW5pc2gpIHsKKwkJCS8qPT09PT09IFBhdGggQSBSWCBJUUsgUkYgU2V0dGluZz09PT09PSovCisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHhlZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4MDAwMCk7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgxOCwgMHgwMGMwMCwgMHgzKTsgICAgIC8qIEJXIDIwTSovCisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgzMCwgQlJGUkVHT0ZGU0VUTUFTSywgMHgzMDAwMCk7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgzMSwgQlJGUkVHT0ZGU0VUTUFTSywgMHgzZjdmZik7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgzMiwgQlJGUkVHT0ZGU0VUTUFTSywgMHhmZTdiZik7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHg4ZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHg4ODAwMSk7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHg2NSwgQlJGUkVHT0ZGU0VUTUFTSywgMHg5MzFkNik7CisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHhlZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHgwMDAwMCk7CisJCX0KKwkJaWYgKHR4MV9maW5pc2gpeworCQkJLyo9PT09PT0gUGF0aCBCIFJYIElRSyBSRiBTZXR0aW5nPT09PT09Ki8KKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweGVmLCBCUkZSRUdPRkZTRVRNQVNLLCAweDgwMDAwKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDMwLCBCUkZSRUdPRkZTRVRNQVNLLCAweDMwMDAwKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDMxLCBCUkZSRUdPRkZTRVRNQVNLLCAweDNmN2ZmKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDMyLCBCUkZSRUdPRkZTRVRNQVNLLCAweGZlN2JmKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDhmLCBCUkZSRUdPRkZTRVRNQVNLLCAweDg4MDAxKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDY1LCBCUkZSRUdPRkZTRVRNQVNLLCAweDkzMWQxKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweGVmLCBCUkZSRUdPRkZTRVRNQVNLLCAweDAwMDAwKTsKKwkJfQorCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgQklUKDMxKSwgMHgxKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHg5N2MsIEJJVCgzMSksIDB4MCk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDkwYywgMHgwMDAwODAwMCk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk4NCwgMHgwMDQ2YTg5MCk7CisKKwkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qWzMxXSA9IDEgLS0+IFBhZ2UgQzEqLworCQlpZiAodHgwX2ZpbmlzaCkgeworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzgwLCAweDM4MDA4YzEwKTsvKlRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYqLworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDE4MDA4YzEwKTsvKlJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XSovCisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4MDIxNDAxMTkpOworCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDI4MTYwY2MwKTsKKwkJfQorCQlpZiAodHgxX2ZpbmlzaCl7CisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlODAsIDB4MzgwMDhjMTApOy8qVFhfVG9uZV9pZHhbOTowXSwgVHhLX01hc2tbMjldIFRYX1RvbmUgPSAxNiovCisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlODQsIDB4MTgwMDhjMTApOy8qUlhfVG9uZV9pZHhbOTowXSwgUnhLX01hc2tbMjldKi8KKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU4OCwgMHgwMjE0MDExOSk7CisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlOGMsIDB4MjgxNjBjYTApOworCQl9CisgICAgICAgICAgICAgIGNhbDBfcmV0cnkgPSAwOworCQljYWwxX3JldHJ5ID0gMDsKKwkJd2hpbGUoMSl7CisJCSAgICAvKiBvbmUgc2hvdCovCisJCSAgICAJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJCSAgICAJaWYgKHR4MF9maW5pc2gpeworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4OTc4LCAweDAzRkY4MDAwLCAodHhfeDBbcngwX2F2ZXJhZ2UgJSAyXSkgPj4gMjEgJiAweDAwMDAwN2ZmKTsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgMHgwMDAwMDdGRiwgKHR4X3kwW3J4MF9hdmVyYWdlICUgMl0pID4+IDIxICYgMHgwMDAwMDdmZik7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qIFszMV0gPSAxIC0tPiBQYWdlIEMxKi8KKwkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAzMDAwMDApOy8qY2I4WzIwXSCxTiBTSS9QSSCoz6XOxXakwbW5IGlxa19kcGsgbW9kdWxlKi8KKwkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAxMDAwMDApOworCQkJCW1kZWxheSg1KTsgLypEZWxheSAxMG1zKi8KKwkJICAgIAl9CisJCQlpZiAodHgxX2ZpbmlzaCl7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJCQkJcnRsX3NldF9iYnJlZyhodywgMHg5NzgsIDB4MDNGRjgwMDAsICh0eF94MVtyeDFfYXZlcmFnZSAlIDJdKSA+PiAyMSAmIDB4MDAwMDA3ZmYpOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4OTc4LCAweDAwMDAwN0ZGLCAodHhfeTFbcngxX2F2ZXJhZ2UgJSAyXSkgPj4gMjEgJiAweDAwMDAwN2ZmKTsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLypbMzFdID0gMSAtLT4gUGFnZSBDMSovCisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDAwMzAwMDAwKTsvKmNiOFsyMF0gsU4gU0kvUEkgqM+lzsV2pMG1uSBpcWtfZHBrIG1vZHVsZSovCisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDAwMTAwMDAwKTsvKiBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUqLworCQkJfQorCQkJbWRlbGF5KDEwKTsgLypEZWxheSAxMG1zKi8KKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwMDAwMDAwMCk7CisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlYjgsIDB4MDAwMDAwMDApOworCQkJZGVsYXlfY291bnQgPSAwOworCQkJd2hpbGUgKDEpeworCQkJCWlmICghcngwX2ZpbmlzaCAmJiB0eDBfZmluaXNoKQorCQkJCQlpcWswX3JlYWR5ID0gKGJvb2wpIHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTApKTsKKwkJCQlpZiAoIXJ4MV9maW5pc2ggJiYgdHgxX2ZpbmlzaCkKKwkJCQkJaXFrMV9yZWFkeSA9IChib29sKSBydGxfZ2V0X2JicmVnKGh3LCAweGQ0MCwgQklUKDEwKSk7CisJCQkJaWYgKChpcWswX3JlYWR5ICYmIGlxazFfcmVhZHkpfHwoZGVsYXlfY291bnQ+MjApKQorCQkJCQlicmVhazsKKwkJCQllbHNleworCQkJCQltZGVsYXkoMSk7CisJCQkJCWRlbGF5X2NvdW50Kys7CisJCQkJfQorCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCSgiUlggZGVsYXlfY291bnQgPSAlZFxuIiwgZGVsYXlfY291bnQpKTsKKwkJCWlmIChkZWxheV9jb3VudCA8IDIwKXsJLy8gSWYgMjBtcyBObyBSZXN1bHQsIHRoZW4gY2FsX3JldHJ5KysKKwkJCQkvLyA9PT09PT09PT09PT1SWElRSyBDaGVjaz09PT09PT09PT09PT09CisJCQkJcngwX2ZhaWwgPSAoYm9vbCkgcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIEJJVCgxMSkpOworCQkJCXJ4MV9mYWlsID0gKGJvb2wpIHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDQwLCBCSVQoMTEpKTsKKwkJCQlpZiAoIShyeDBfZmFpbCB8fCByeDBfZmluaXNoKSAmJiB0eDBfZmluaXNoKXsKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDA2MDAwMDAwKTsKKwkJCQkJcnhfeDBbcngwX2F2ZXJhZ2VdID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIDB4MDdmZjAwMDApIDw8IDIxOworCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDgwMDAwMDApOworCQkJCQlyeF95MFtyeDBfYXZlcmFnZV0gPSBydGxfZ2V0X2JicmVnKGh3LCAweGQwMCwgMHgwN2ZmMDAwMCkgPDwgMjE7CisJCQkJCXJ4MGlxa29rPSB0cnVlOworCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCQkoIlJYX1gwWyVkXSA9ICV4IDs7IFJYX1kwWyVkXSA9ICV4XG4iLAorCQkJCQkJcngwX2F2ZXJhZ2UsIChyeF94MFtyeDBfYXZlcmFnZV0pID4+IDIxICYgMHgwMDAwMDdmZiwKKwkJCQkJCXJ4MF9hdmVyYWdlLCAocnhfeTBbcngwX2F2ZXJhZ2VdKSA+PiAyMSAmIDB4MDAwMDA3ZmYpKTsKKworCQkJCQlyeDBfYXZlcmFnZSsrOworCQkJCX0KKwkJCQllbHNleworCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCQkoIjEuIFJYQV9jYWxfcmV0cnkgPSAlZFxuIiwgY2FsMF9yZXRyeSkpOworCQkJCQlyeDBpcWtvayA9IGZhbHNlOworCQkJCQljYWwwX3JldHJ5Kys7CisJCQkJCWlmIChjYWwwX3JldHJ5ID09IDEwKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCEocngxX2ZhaWwgfHwgcngxX2ZpbmlzaCkgJiYgdHgxX2ZpbmlzaCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlYjgsIDB4MDYwMDAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJcnhfeDFbcngxX2F2ZXJhZ2VdID0gcnRsX2dldF9iYnJlZyhodywgMHhkNDAsIDB4MDdmZjAwMDApIDw8IDIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDA4MDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJ4X3kxW3J4MV9hdmVyYWdlXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDQwLCAweDA3ZmYwMDAwKSA8PCAyMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJ4MWlxa29rID0gdHJ1ZTsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkJKCJSWF9YMVslZF0gPSAleCA7OyBSWF9ZMVslZF0gPSAleFxuIiwKKwkJCQkJCXJ4MV9hdmVyYWdlLCAocnhfeDFbcngxX2F2ZXJhZ2VdKSA+PiAyMSAmIDB4MDAwMDA3ZmYsCisJCQkJCQlyeDFfYXZlcmFnZSwgKHJ4X3kxW3J4MV9hdmVyYWdlXSkgPj4gMjEgJiAweDAwMDAwN2ZmKSk7CisKKwkJCQkJcngxX2F2ZXJhZ2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICAJZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJ4MWlxa29rPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWNhbDFfcmV0cnkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWlmIChjYWwxX3JldHJ5ID09IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAJCX0KKworCQkJfQorCQkJZWxzZXsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJCSgiMi4gUlhBX2NhbF9yZXRyeSA9ICVkXG4iLCBjYWwwX3JldHJ5KSk7CisJCQkJcngwaXFrb2sgPSBmYWxzZTsKKwkJCQlyeDFpcWtvayA9IGZhbHNlOworCQkJCWNhbDBfcmV0cnkrKzsKKwkJCQljYWwxX3JldHJ5Kys7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCQkoIkRlbGF5IDIwbXMgUlggSVFLIE5vdCBSZWFkeSEhISEhXG4iKSk7CisJCQkgICAgaWYgKGNhbDBfcmV0cnkgPT0gMTApCisJCQkgICAgICAgIGJyZWFrOworCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJCSgiMy4gUlhBX2NhbF9yZXRyeSA9ICVkXG4iLCBjYWwwX3JldHJ5KSk7CisJCQlpZiAocngwX2F2ZXJhZ2UgPj0gMil7CisJCQkJZm9yIChpID0gMDsgaSA8IHJ4MF9hdmVyYWdlOyBpKyspeworCQkJCQlmb3IgKGlpID0gaSsxOyBpaSA8IHJ4MF9hdmVyYWdlOyBpaSsrKXsKKwkJCQkJZHggPSAocnhfeDBbaV0gPj4gMjEpIC0gKHJ4X3gwW2lpXSA+PiAyMSk7CisJCQkJCQlpZiAoZHggPCA0ICYmIGR4ID4gLTQpeworCQkJCQkJZHkgPSAocnhfeTBbaV0gPj4gMjEpIC0gKHJ4X3kwW2lpXSA+PiAyMSk7CisJCQkJCQkJaWYgKGR5IDwgNCAmJiBkeSA+IC00KXsKKwkJCQkJCQkJcngwX3ggPSAoKHJ4X3gwW2ldPj4yMSkgKyAocnhfeDBbaWldID4+IDIxKSkgLyAyOworCQkJCQkJCQlyeDBfeSA9ICgocnhfeTBbaV0+PjIxKSArIChyeF95MFtpaV0gPj4gMjEpKSAvIDI7CisJCQkJCQkJCWlmICgocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF84MCkKKwkJCQkJCQkJCSYmIHZkZl9lbmFibGUpIHsKKwkJCQkJCQkJCXJ4X2R0WzBdID0gKHJ4X2R0W2ldICsgcnhfZHRbaWldKSAvIDI7CisJCQkJCQkJCX0KKwkJCQkJCQkJcngwX2ZpbmlzaCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChyeDFfYXZlcmFnZSA+PSAyKXsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcngxX2F2ZXJhZ2U7IGkrKyl7CisJCQkJCWZvciAoaWkgPSBpKzE7IGlpIDwgcngxX2F2ZXJhZ2U7IGlpKyspeworCQkJCQlkeCA9IChyeF94MVtpXSA+PiAyMSkgLSAocnhfeDFbaWldID4+IDIxKTsKKwkJCQkJCWlmIChkeCA8IDQgJiYgZHggPiAtNCl7CisJCQkJCQlkeSA9IChyeF95MVtpXSA+PiAyMSkgLSAocnhfeTFbaWldID4+IDIxKTsKKwkJCQkJCQlpZiAoZHkgPCA0ICYmIGR5ID4gLTQpeworCQkJCQkJCQlyeDFfeCA9ICgocnhfeDFbaV0gPj4gMjEpICsgKHJ4X3gxW2lpXSA+PiAyMSkpIC8gMjsKKwkJCQkJCQkJcngxX3kgPSAoKHJ4X3kxW2ldID4+IDIxKSArIChyeF95MVtpaV0gPj4gMjEpKSAvIDI7CisJCQkJCQkJCWlmICgocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF84MCkKKwkJCQkJCQkJCSYmIHZkZl9lbmFibGUpIHsKKwkJCQkJCQkJCXJ4X2R0WzBdID0gKHJ4X2R0W2ldICsgcnhfZHRbaWldKSAvIDI7CisJCQkJCQkJCX0KKwkJCQkJCQkJcngxX2ZpbmlzaCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCQkoIlJYMF9BdmVyYWdlID0gJWQsIFJYMV9BdmVyYWdlID0gJWRcbiIsCisJCQkJcngwX2F2ZXJhZ2UsIHJ4MV9hdmVyYWdlKSk7CisJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkJKCJSWDBfZmluaXNoID0gJWQsIFJYMV9maW5pc2ggPSAlZFxuIiwKKwkJCQlyeDBfZmluaXNoLCByeDFfZmluaXNoKSk7CisJCQlpZiAoKHJ4MF9maW5pc2h8fCAhdHgwX2ZpbmlzaCkgJiYgKHJ4MV9maW5pc2ggfHwgIXR4MV9maW5pc2gpICkKKwkJCQlicmVhazsKKwkJCWlmICgoY2FsMF9yZXRyeSArIHJ4MF9hdmVyYWdlKSA+PSAxMAorCQkJCXx8IChjYWwxX3JldHJ5ICsgcngxX2F2ZXJhZ2UpID49IDEwCisJCQkJfHwgcngwX2F2ZXJhZ2UgPT0gMworCQkJCXx8IHJ4MV9hdmVyYWdlID09IDMpCisJCQkJYnJlYWs7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJSWEFfY2FsX3JldHJ5ID0gJWRcbiIsIGNhbDBfcmV0cnkpKTsKKwkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJSWEJfY2FsX3JldHJ5ID0gJWRcbiIsIGNhbDFfcmV0cnkpKTsKKwl9CisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qIFszMV0gPSAwIC0tPiBQYWdlIEMqLworCXN3aXRjaCAocnRscGh5LT5jdXJyZW50X2NoYW5fYncpCisJeworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJeworCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgxOCwgMHgwMGMwMCwgMHgxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfODA6CisJCXsKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4MTgsIDB4MDBjMDAsIDB4MCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLyogWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJLypGaWxsSVFLIFJlc3VsdCovCisJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkoIj09PT09PT09UGF0aF9BID09PT09PT1cbiIpKTsKKworCWlmICh0eDBfZmluaXNoKXsKKwkJX3J0bDg4MTJhZV9pcWtfdHhfZmlsbF9pcWMoaHcsIFJGOTBfUEFUSF9BLCB0eDBfeCwgdHgwX3kpOworCX0KKwllbHNleworCQlfcnRsODgxMmFlX2lxa190eF9maWxsX2lxYyhodywgUkY5MF9QQVRIX0EsIDB4MjAwLCAweDApOworCX0KKworCWlmIChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzgwCisJCXx8IHZkZl9lbmFibGUpeworCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLypbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwkJcnRsX3NldF9iYnJlZyhodywgMHhjZTgsIDB4M2ZmZjAwMDAsIHR4X2R0WzBdICYgMHgwMDAwM2ZmZik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCX0KKworCWlmIChyeDBfZmluaXNoID09IDEpeworCQlfcnRsODgxMmFlX2lxa19yeF9maWxsX2lxYyhodywgUkY5MF9QQVRIX0EsIHJ4MF94LCByeDBfeSk7CisJfQorCWVsc2V7CisJCV9ydGw4ODEyYWVfaXFrX3J4X2ZpbGxfaXFjKGh3LCBSRjkwX1BBVEhfQSwgMHgyMDAsIDB4MCk7CisJfQorCisJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfODAKKwkJfHwgdmRmX2VuYWJsZSl7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDEpOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCQlydGxfc2V0X2JicmVnKGh3LCAweGNlOCwgMHgwMDAwM2ZmZiwgcnhfZHRbMF0gJiAweDAwMDAzZmZmKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qIFszMV0gPSAwIC0tPiBQYWdlIEMqLworCX0KKworCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJKCI9PT09PT09PVBhdGhfQiA9PT09PT09XG4iKSk7CisKKwlpZiAodHgxX2ZpbmlzaCl7CisJCV9ydGw4ODEyYWVfaXFrX3R4X2ZpbGxfaXFjKGh3LCBSRjkwX1BBVEhfQiwgdHgxX3gsIHR4MV95KTsKKwl9CisJZWxzZXsKKwkJX3J0bDg4MTJhZV9pcWtfdHhfZmlsbF9pcWMoaHcsIFJGOTBfUEFUSF9CLCAweDIwMCwgMHgwKTsKKwl9CisKKwlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF84MAorCQl8fCB2ZGZfZW5hYmxlKXsKKwkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8qIFszMV0gPSAwIC0tPiBQYWdlIEMqLworCQlydGxfc2V0X2JicmVnKGh3LCAweGVlOCwgMHgzZmZmMDAwMCwgdHhfZHRbMF0gJiAweDAwMDAzZmZmKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qIFszMV0gPSAwIC0tPiBQYWdlIEMqLworCX0KKworCWlmIChyeDFfZmluaXNoID09IDEpeworCQlfcnRsODgxMmFlX2lxa19yeF9maWxsX2lxYyhodywgUkY5MF9QQVRIX0IsIHJ4MV94LCByeDFfeSk7CisJfQorCWVsc2V7CisJCV9ydGw4ODEyYWVfaXFrX3J4X2ZpbGxfaXFjKGh3LCBSRjkwX1BBVEhfQiwgMHgyMDAsIDB4MCk7CisJfQorCisJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfODAKKwkJfHwgdmRmX2VuYWJsZSl7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDEpOyAvKiBbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwkJcnRsX3NldF9iYnJlZyhodywgMHhlZTgsIDB4MDAwMDNmZmYsIHJ4X2R0WzBdICYgMHgwMDAwM2ZmZik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKiBbMzFdID0gMCAtLT4gUGFnZSBDKi8KKwl9Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfcmVzdG9yZV9yZigKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwllbnVtIHJhZGlvX3BhdGggcGF0aCwKKwl1MzIgKmJhY2t1cF9yZl9yZWcsCisJdTMyICpyZl9iYWNrdXAsCisJdTMyIHJmX3JlZ19udW0KKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBpOworCisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisgICAgCWZvciAoaSA9IDA7IGkgPCByZl9yZWdfbnVtOyBpKyspCisgICAgICAgIAlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCBiYWNrdXBfcmZfcmVnW2ldLCBCUkZSRUdPRkZTRVRNQVNLLCByZl9iYWNrdXBbaV0pOworCisJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHhlZiwgQlJGUkVHT0ZGU0VUTUFTSywgMHgwKTsKKworCXN3aXRjaChwYXRoKXsKKwljYXNlIFJGOTBfUEFUSF9BOgorICAgICAgIHsKKyAgICAgICAJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJSZXN0b3JlUkYgUGF0aCBBIFN1Y2Nlc3MhISEhXG4iKSk7CisgICAgICAgfQorCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9COgorICAgICAgIHsKKyAgICAgICAJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkJKCJSZXN0b3JlUkYgUGF0aCBCIFN1Y2Nlc3MhISEhXG4iKSk7CisgICAgICAgfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfcmVzdG9yZV9hZmUoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyICphZmVfYmFja3VwLAorCXUzMiAqYmFja3VwX2FmZV9yZWcsCisJdTMyIGFmZV9udW0KKwkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCS8qUmVsb2FkIEFGRSBQYXJhbWV0ZXJzICovCisgICAgCWZvciAoaSA9IDA7IGkgPCBhZmVfbnVtOyBpKyspeworICAgICAgICAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIGJhY2t1cF9hZmVfcmVnW2ldLCBhZmVfYmFja3VwW2ldKTsKKyAgICAJfQorCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDEpOyAvKiBbMzFdID0gMSAtLT4gUGFnZSBDMSovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzgwLCAweDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4NCwgMHgwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4MCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDNjMDAwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjOTAsIDB4MDAwMDAwODApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM5NCwgMHgwMDAwMDAwMCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2M0LCAweDIwMDQwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYzgsIDB4MjAwMDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlODAsIDB4MCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZTg0LCAweDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU4OCwgMHgwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlOGMsIDB4M2MwMDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGU5MCwgMHgwMDAwMDA4MCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZTk0LCAweDAwMDAwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhlYzQsIDB4MjAwNDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGVjOCwgMHgyMDAwMDAwMCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4ZWI4LCAweDApOworCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJKCJSZXN0b3JlQUZFIFN1Y2Nlc3MhISEhXG4iKSk7Cit9CisKK3ZvaWQgX3J0bDg4MTJhZV9pcWtfcmVzdG9yZV9tYWNiYigKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1MzIgKm1hY2JiX2JhY2t1cCwKKwl1MzIgKmJhY2t1cF9tYWNiYl9yZWcsCisJdTMyIG1hY2JiX251bQorCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGk7CisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qIFszMV0gPSAwIC0tPiBQYWdlIEMqLworCS8vUmVsb2FkIE1hY0JCIFBhcmFtZXRlcnMKKyAgICAJZm9yIChpID0gMDsgaSA8IG1hY2JiX251bTsgaSsrKXsKKyAgICAgICAgCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBiYWNrdXBfbWFjYmJfcmVnW2ldLCBtYWNiYl9iYWNrdXBbaV0pOworICAgIAl9CisgICAgCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwKKwkJCSgiUmVzdG9yZU1hY0JCIFN1Y2Nlc3MhISEhXG4iKSk7Cit9CisKKyNkZWZpbmUgTUFDQkJfUkVHX05VTSAxMAorI2RlZmluZSBBRkVfUkVHX05VTSAxNAorI2RlZmluZSBSRl9SRUdfTlVNIDMKKworc3RhdGljIHZvaWQgX3J0bDg4MTJhZV9waHlfaXFfY2FsaWJyYXRlKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJdTggY2hhbm5lbCkKK3sKKwl1MzIJbWFjYmJfYmFja3VwW01BQ0JCX1JFR19OVU1dOworCXUzMiBhZmVfYmFja3VwW0FGRV9SRUdfTlVNXTsKKwl1MzIgcmZhX2JhY2t1cFtSRl9SRUdfTlVNXTsKKwl1MzIgcmZiX2JhY2t1cFtSRl9SRUdfTlVNXTsKKwl1MzIgCWJhY2t1cF9tYWNiYl9yZWdbTUFDQkJfUkVHX05VTV0gPSB7MHhiMDAsIDB4NTIwLCAweDU1MCwKKwkJCQkJCQkJCQkJMHg4MDgsIDB4OTBjLCAweGMwMCwgMHhlMDAsCisJCQkJCQkJCQkJCTB4OGM0LDB4ODM4LCAgMHg4MmN9OworCXUzMgliYWNrdXBfYWZlX3JlZ1tBRkVfUkVHX05VTV0gPSB7MHhjNWMsIDB4YzYwLCAweGM2NCwgMHhjNjgsCisJCQkJCQkJCQkJMHhjYjgsIDB4Y2IwLCAweGNiNCwweGU1YywKKwkJCQkJCQkJCQkweGU2MCwgMHhlNjQsIDB4ZTY4LCAweGViOCwKKwkJCQkJCQkJCQkweGViMCwgMHhlYjR9OworCXUzMiAJYmFja3VwX3JmX3JlZ1tSRl9SRUdfTlVNXSA9IHsweDY1LCAweDhmLCAweDB9OworCXU4IAljaG5sX2lkeCA9IF9ydGw4ODEyYWVfZ2V0X3JpZ2h0X2NobmxfcGxhY2VfZm9yX2lxayhjaGFubmVsKTsKKworCV9ydGw4ODEyYWVfaXFrX2JhY2t1cF9tYWNiYihodywgbWFjYmJfYmFja3VwLCBiYWNrdXBfbWFjYmJfcmVnLCBNQUNCQl9SRUdfTlVNKTsKKwlfcnRsODgxMmFlX2lxa19iYWNrdXBfYWZlKGh3LCBhZmVfYmFja3VwLCBiYWNrdXBfYWZlX3JlZywgQUZFX1JFR19OVU0pOworCV9ydGw4ODEyYWVfaXFrX2JhY2t1cF9yZihodywgcmZhX2JhY2t1cCwgcmZiX2JhY2t1cCwgYmFja3VwX3JmX3JlZywgUkZfUkVHX05VTSk7CisKKwlfcnRsODgxMmFlX2lxa19jb25maWd1cmVfbWFjKGh3KTsKKwlfcnRsODgxMmFlX2lxa190eChodywgY2hubF9pZHgpOworCV9ydGw4ODEyYWVfaXFrX3Jlc3RvcmVfcmYoaHcsIFJGOTBfUEFUSF9BLCBiYWNrdXBfcmZfcmVnLCByZmFfYmFja3VwLCBSRl9SRUdfTlVNKTsKKwlfcnRsODgxMmFlX2lxa19yZXN0b3JlX3JmKGh3LCBSRjkwX1BBVEhfQSwgYmFja3VwX3JmX3JlZywgcmZiX2JhY2t1cCwgUkZfUkVHX05VTSk7IC8vIFBBVEhfQSA/CisKKwlfcnRsODgxMmFlX2lxa19yZXN0b3JlX2FmZShodywgYWZlX2JhY2t1cCwgYmFja3VwX2FmZV9yZWcsIEFGRV9SRUdfTlVNKTsKKwlfcnRsODgxMmFlX2lxa19yZXN0b3JlX21hY2JiKGh3LCBtYWNiYl9iYWNrdXAsIGJhY2t1cF9tYWNiYl9yZWcsIE1BQ0JCX1JFR19OVU0pOworfQorCisKK3ZvaWQgX3J0bDg4MjFhZV9pcWtfYmFja3VwX21hY2JiKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJdTMyICptYWNiYl9iYWNrdXAsCisJCXUzMiAqYmFja3VwX21hY2JiX3JlZywKKwkJdTMyIG1hY19iYl9udW0KKwkJKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCS8qc2F2ZSBNQUNCQiBkZWZhdWx0IHZhbHVlKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2JiX251bTsgaSsrKSB7CisJCW1hY2JiX2JhY2t1cFtpXSA9cnRsX3JlYWRfZHdvcmQocnRscHJpdixiYWNrdXBfbWFjYmJfcmVnW2ldKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiQmFja3VwTWFjQkIgU3VjY2VzcyEhISFcbiIpKTsKK30KKwordm9pZCBfcnRsODgyMWFlX2lxa19iYWNrdXBfYWZlKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJdTMyICphZmVfYmFja3VwLAorCQl1MzIgKmJhY2t1cF9hZmVfUkVHLAorCQl1MzIgYWZlX251bQorCQkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBpOworCisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJLypTYXZlIEFGRSBQYXJhbWV0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IGFmZV9udW07IGkrKyl7CisJCWFmZV9iYWNrdXBbaV0gPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBiYWNrdXBfYWZlX1JFR1tpXSk7CisJfQorCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCJCYWNrdXBBRkUgU3VjY2VzcyEhISFcbiIpKTsKK30KKwordm9pZCBfcnRsODgyMWFlX2lxa19iYWNrdXBfcmYoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQl1MzIgKnJmYV9iYWNrdXAsCisJCXUzMiAqcmZiX2JhY2t1cCwKKwkJdTMyICpiYWNrdXBfcmZfcmVnLAorCQl1MzIgcmZfbnVtCisJCSkKK3sKKworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvKlszMV0gPSAwIC0tPiBQYWdlIEMqLworCS8qU2F2ZSBSRiBQYXJhbWV0ZXJzKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmZfbnVtOyBpKyspeworCQlyZmFfYmFja3VwW2ldID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIGJhY2t1cF9yZl9yZWdbaV0sIEJNQVNLRFdPUkQpOworCQlyZmJfYmFja3VwW2ldID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0IsIGJhY2t1cF9yZl9yZWdbaV0sIEJNQVNLRFdPUkQpOworCX0KKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiQmFja3VwUkYgU3VjY2VzcyEhISFcbiIpKTsKK30KKwordm9pZCBfcnRsODgyMWFlX2lxa19jb25maWd1cmVfbWFjKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodworCQkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCS8qID09PT09PT09TUFDIHJlZ2lzdGVyIHNldHRpbmc9PT09PT09PSovCisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHg1MjIsIDB4M2YpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4NTUwLCBCSVQoMTEpIHwgQklUKDMpLCAweDApOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4ODA4LCAweDAwKTsJCS8qUlggYW50ZSBvZmYqLworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODM4LCAweGYsIDB4Yyk7CQkvKkNDQSBvZmYqLworfQorCisKK3ZvaWQgX3J0bDg4MjFhZV9pcWtfdHhfZmlsbF9pcWMoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQllbnVtIHJhZGlvX3BhdGggcGF0aCwKKwkJdTMyIHR4X3gsCisJCXUzMiB0eF95CisJCSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3dpdGNoIChwYXRoKSB7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCQl7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8vIFszMV0gPSAxIC0tPiBQYWdlIEMxCisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzkwLCAweDAwMDAwMDgwKTsKKwkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYzQsIDB4MjAwNDAwMDApOworCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNjOCwgMHgyMDAwMDAwMCk7CisJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjY2MsIDB4MDAwMDA3ZmYsIHR4X3kpOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2Q0LCAweDAwMDAwN2ZmLCB0eF94KTsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiVFhfWCA9ICV4OztUWF9ZID0gJXggPT09PT0+IGZpbGwgdG8gSVFDXG4iLCB0eF94LCB0eF95KSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIjB4Y2Q0ID0gJXg7OzB4Y2NjID0gJXggPT09PT5maWxsIHRvIElRQ1xuIiwgcnRsX2dldF9iYnJlZyhodywgMHhjZDQsIDB4MDAwMDA3ZmYpLCBydGxfZ2V0X2JicmVnKGh3LCAweGNjYywgMHgwMDAwMDdmZikpKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfTsKK30KKworCit2b2lkIF9ydGw4ODIxYWVfaXFrX3J4X2ZpbGxfaXFjKAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJZW51bSByYWRpb19wYXRoIHBhdGgsCisJCXUzMiByeF94LAorCQl1MzIgcnhfeQorCQkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN3aXRjaCAocGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJeworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvLyBbMzFdID0gMCAtLT4gUGFnZSBDCisJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjMTAsIDB4MDAwMDAzZmYsIHJ4X3g+PjEpOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzEwLCAweDAzZmYwMDAwLCByeF95Pj4xKTsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgicnhfeCA9ICV4OztyeF95ID0gJXggPT09PT5maWxsIHRvIElRQ1xuIiwgcnhfeD4+MSwgcnhfeT4+MSkpOworCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCIweGMxMCA9ICV4ID09PT0+ZmlsbCB0byBJUUNcbiIsIHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIDB4YzEwKSkpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9OworfQorCisKKworI2RlZmluZSBjYWxfbnVtIDEwCisKK3ZvaWQgX3J0bDg4MjFhZV9pcWtfdHgoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQllbnVtIHJhZGlvX3BhdGggcGF0aAorCQkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKworCXUzMiAJdHhfZmFpbCwgcnhfZmFpbCwgZGVsYXlfY291bnQsIGlxa19yZWFkeSwgY2FsX3JldHJ5LCBjYWwgPSAwLCB0ZW1wX3JlZzY1OworCWludAl0eF94ID0gMCwgdHhfeSA9IDAsIHJ4X3ggPSAwLCByeF95ID0gMCwgdHhfYXZlcmFnZSA9IDAsIHJ4X2F2ZXJhZ2UgPSAwOworCWludAl0eF94MFtjYWxfbnVtXSwgdHhfeTBbY2FsX251bV0sIHR4X3gwX3J4a1tjYWxfbnVtXSwgdHhfeTBfcnhrW2NhbF9udW1dLCByeF94MFtjYWxfbnVtXSwgcnhfeTBbY2FsX251bV07CisJYm9vbCAJdHgwaXFrb2sgPSBmYWxzZSwgcngwaXFrb2sgPSBmYWxzZTsKKwlib29sICAJdmRmX2VuYWJsZSA9IGZhbHNlOworCWludAlpLCBrLCB2ZGZfeVszXSwgdmRmX3hbM10sIHR4X2R0WzNdLCByeF9kdFszXSwgaWksIGR4ID0gMCwgZHkgPSAwLCB0eF9maW5pc2ggPSAwLCByeF9maW5pc2ggPSAwOworCisKKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCQkoIkJhbmRXaWR0aCA9ICVkLlxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfY2hhbl9idykpOworCWlmIChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSBIVF9DSEFOTkVMX1dJRFRIXzgwKXsKKwkJdmRmX2VuYWJsZSA9IHRydWU7CisJfQorCisJd2hpbGUgKGNhbCA8IGNhbF9udW0pIHsKKwkJc3dpdGNoIChwYXRoKSB7CisJCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJCXsKKwkJCQkJdGVtcF9yZWc2NSA9IHJ0bF9nZXRfcmZyZWcoaHcsIHBhdGgsIDB4NjUsIDB4ZmZmZmZmZmYpOworCQkJCQkvL1BhdGgtQSBMT0sKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MCk7IC8qWzMxXSA9IDAgLS0+IFBhZ2UgQyovCisJCQkJCS8qPT09PT09PT1QYXRoLUEgQUZFIGFsbCBvbj09PT09PT09Ki8KKwkJCQkJLypQb3J0IDAgREFDL0FEQyBvbiovCisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM2MCwgMHg3Nzc3Nzc3Nyk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM2NCwgMHg3Nzc3Nzc3Nyk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM2OCwgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM2YywgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3MCwgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3NCwgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3OCwgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM3YywgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4MCwgMHgxOTc5MTk3OSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4NCwgMHgxOTc5MTk3OSk7CisKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjMDAsIDB4ZiwgMHg0KTsgLypoYXJkd2FyZSAzLXdpcmUgb2ZmKi8KKworCQkJCQkvLyBMT0sgU2V0dGluZworCQkJCQkvLz09PT09PSBMT0sgPT09PT09CisJCQkJCS8qREFDL0FEQyBzYW1wbGluZyByYXRlICgxNjAgTUh6KSovCisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzVjLCBCSVQoMjYpIHwgQklUKDI1KSB8IEJJVCgyNCksIDB4Nyk7CisKKwkJCQkJLy8gMi4gTG9LIFJGIFNldHRpbmcgKGF0IEJXID0gMjBNKQorCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHg4MDAwMik7CisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MTgsIDB4MDBjMDAsIDB4Myk7ICAgICAvLyBCVyAyME0KKwkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MjAwMDApOworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDMxLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMDAzZik7CisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MzIsIFJGUkVHX09GRlNFVF9NQVNLLCAweGYzZmMzKTsKKwkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg2NSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4OTMxZDUpOworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDhmLCBSRlJFR19PRkZTRVRfTUFTSywgMHg4YTAwMSk7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2I4LCAweGYsIDB4ZCk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDkwYywgMHgwMDAwODAwMCk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGIwMCwgMHgwMzAwMDEwMCk7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Yzk0LCBCSVQoMCksIDB4MSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk3OCwgMHgyOTAwMjAwMCk7Ly8gVFggKFgsWSkKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTdjLCAweGE5MDAyMDAwKTsvLyBSWCAoWCxZKQorCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NjI5MTApOy8vIFswXTpBR0NfZW4sIFsxNV06aWRhY19LX01hc2sKKworCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLy8gWzMxXSA9IDEgLS0+IFBhZ2UgQzEKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg4LCAweDgyMTQwM2Y0KTsKKworCQkJCQlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlKQorCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDY4MTYzZTk2KTsKKwkJCQkJZWxzZQorCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDI4MTYzZTk2KTsKKworCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODAsIDB4MTgwMDhjMTApOy8vIFRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDM4MDA4YzEwKTsvLyBSWF9Ub25lX2lkeFs5OjBdLCBSeEtfTWFza1syOV0KKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMTAwMDAwKTsvLyBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGZhMDAwMDAwKTsKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGY4MDAwMDAwKTsKKworCQkJCQltZGVsYXkoMTApOyAvL0RlbGF5IDEwbXMKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMDAwMDAwKTsKKworCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDU4LCAweDdmZTAwLCBydGxfZ2V0X3JmcmVnKGh3LCBwYXRoLCAweDgsIDB4ZmZjMDApKTsgLy8gTG9hZCBMT0sKKworCQkJCQlzd2l0Y2ggKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3KQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQkJeworCQkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDE4LCAweDAwYzAwLCAweDEpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQl7CisJCQkJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MTgsIDB4MDBjMDAsIDB4MCk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKworCQkJCQl9CisKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8vIFszMV0gPSAxIC0tPiBQYWdlIEMxCisKKwkJCQkJLy8gMy4gVFggUkYgU2V0dGluZworCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHg4MDAwMCk7CisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MzAsIFJGUkVHX09GRlNFVF9NQVNLLCAweDIwMDAwKTsKKwkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwM2YpOworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDMyLCBSRlJFR19PRkZTRVRfTUFTSywgMHhmM2ZjMyk7CisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4NjUsIFJGUkVHX09GRlNFVF9NQVNLLCAweDkzMWQ1KTsKKwkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg4ZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4OGEwMDEpOworCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMDAwMCk7CisJCQkJCS8vT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4Y2I4LCAweGYsIDB4ZCk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDkwYywgMHgwMDAwODAwMCk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGIwMCwgMHgwMzAwMDEwMCk7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Yzk0LCBCSVQoMCksIDB4MSk7CisJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk3OCwgMHgyOTAwMjAwMCk7Ly8gVFggKFgsWSkKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTdjLCAweGE5MDAyMDAwKTsvLyBSWCAoWCxZKQorCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NmE5MTApOy8vIFswXTpBR0NfZW4sIFsxNV06aWRhY19LX01hc2sKKworCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLy8gWzMxXSA9IDEgLS0+IFBhZ2UgQzEKKwkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg4LCAweDgyMTQwM2YxKTsKKwkJCQkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSkKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4YywgMHg0MDE2M2U5Nik7CisJCQkJCWVsc2UKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4YywgMHgwMDE2M2U5Nik7CisKKwkJCQkJaWYgKHZkZl9lbmFibGUgPT0gMSl7CisJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiVkRGX2VuYWJsZVxuIikpOworCQkJCQkJZm9yIChrID0gMDtrIDw9IDI7IGsrKyl7CisJCQkJCQkJc3dpdGNoIChrKXsKKwkJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4MCwgMHgxODAwOGMzOCk7Ly8gVFhfVG9uZV9pZHhbOTowXSwgVHhLX01hc2tbMjldIFRYX1RvbmUgPSAxNgorCQkJCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4NCwgMHgzODAwOGMzOCk7Ly8gUlhfVG9uZV9pZHhbOTowXSwgUnhLX01hc2tbMjldCisJCQkJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjZTgsIEJJVCgzMSksIDB4MCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzgwLCBCSVQoMjgpLCAweDApOworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Yzg0LCBCSVQoMjgpLCAweDApOworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2U4LCBCSVQoMzEpLCAweDApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgidmRmX3lbMV0gPSAleDs7O3ZkZl95WzBdID0gJXhcbiIsIHZkZl95WzFdPj4yMSAmIDB4MDAwMDdmZiwgdmRmX3lbMF0+PjIxICYgMHgwMDAwN2ZmKSk7CisJCQkJCQkJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoInZkZl94WzFdID0gJXg7Ozt2ZGZfeFswXSA9ICV4XG4iLCB2ZGZfeFsxXT4+MjEgJiAweDAwMDA3ZmYsIHZkZl94WzBdPj4yMSAmIDB4MDAwMDdmZikpOworCQkJCQkJCQkJCXR4X2R0W2NhbF0gPSAodmRmX3lbMV0+PjIwKS0odmRmX3lbMF0+PjIwKTsKKwkJCQkJCQkJCQl0eF9kdFtjYWxdID0gKCgxNip0eF9kdFtjYWxdKSoxMDAwMC8xNTcwOCk7CisJCQkJCQkJCQkJdHhfZHRbY2FsXSA9ICh0eF9kdFtjYWxdID4+IDEgKSsodHhfZHRbY2FsXSAmIEJJVCgwKSk7CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzgwLCAweDE4MDA4YzIwKTsvLyBUWF9Ub25lX2lkeFs5OjBdLCBUeEtfTWFza1syOV0gVFhfVG9uZSA9IDE2CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDM4MDA4YzIwKTsvLyBSWF9Ub25lX2lkeFs5OjBdLCBSeEtfTWFza1syOV0KKwkJCQkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGNlOCwgQklUKDMxKSwgMHgxKTsKKwkJCQkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGNlOCwgMHgzZmZmMDAwMCwgdHhfZHRbY2FsXSAmIDB4MDAwMDNmZmYpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMTAwMDAwKTsvLyBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUKKwkJCQkJCQljYWxfcmV0cnkgPSAwOworCQkJCQkJCXdoaWxlKDEpeworCQkJCQkJCQkvLyBvbmUgc2hvdAorCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZmEwMDAwMDApOworCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZjgwMDAwMDApOworCisJCQkJCQkJCW1kZWxheSgxMCk7IC8vRGVsYXkgMTBtcworCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAwMDAwMDApOworCQkJCQkJCQlkZWxheV9jb3VudCA9IDA7CisJCQkJCQkJCXdoaWxlICgxKXsKKwkJCQkJCQkJCWlxa19yZWFkeSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTApKTsKKwkJCQkJCQkJCWlmICgofmlxa19yZWFkeSkgfHwgKGRlbGF5X2NvdW50PjIwKSl7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNleworCQkJCQkJCQkJCW1kZWxheSgxKTsKKwkJCQkJCQkJCQlkZWxheV9jb3VudCsrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYgKGRlbGF5X2NvdW50IDwgMjApewkJCQkJCQkvLyBJZiAyMG1zIE5vIFJlc3VsdCwgdGhlbiBjYWxfcmV0cnkrKworCQkJCQkJCQkJLy8gPT09PT09PT09PT09VFhJUUsgQ2hlY2s9PT09PT09PT09PT09PQorCQkJCQkJCQkJdHhfZmFpbCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTIpKTsKKworCQkJCQkJCQkJaWYgKH50eF9mYWlsKXsKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDIwMDAwMDApOworCQkJCQkJCQkJCXZkZl94W2tdID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIDB4MDdmZjAwMDApPDwyMTsKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDQwMDAwMDApOworCQkJCQkJCQkJCXZkZl95W2tdID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIDB4MDdmZjAwMDApPDwyMTsKKwkJCQkJCQkJCQl0eDBpcWtvayA9IHRydWU7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNleworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2NjLCAweDAwMDAwN2ZmLCAweDApOworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2Q0LCAweDAwMDAwN2ZmLCAweDIwMCk7CisJCQkJCQkJCQkJdHgwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCQljYWxfcmV0cnkrKzsKKwkJCQkJCQkJCQlpZiAoY2FsX3JldHJ5ID09IDEwKSB7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJdHgwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCl7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoayA9PSAzKXsKKwkJCQkJCQl0eF94MFtjYWxdID0gdmRmX3hbay0xXSA7CisJCQkJCQkJdHhfeTBbY2FsXSA9IHZkZl95W2stMV07CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQllbHNlIHsKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4MCwgMHgxODAwOGMxMCk7Ly8gVFhfVG9uZV9pZHhbOTowXSwgVHhLX01hc2tbMjldIFRYX1RvbmUgPSAxNgorCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDM4MDA4YzEwKTsvLyBSWF9Ub25lX2lkeFs5OjBdLCBSeEtfTWFza1syOV0KKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwMDEwMDAwMCk7Ly8gY2I4WzIwXSCxTiBTSS9QSSCoz6XOxXakwbW5IGlxa19kcGsgbW9kdWxlCisJCQkJCQljYWxfcmV0cnkgPSAwOworCQkJCQkJd2hpbGUoMSl7CisJCQkJCQkJLy8gb25lIHNob3QKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZmEwMDAwMDApOworCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk4MCwgMHhmODAwMDAwMCk7CisKKwkJCQkJCQltZGVsYXkoMTApOyAvL0RlbGF5IDEwbXMKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAwMDAwMDApOworCQkJCQkJCWRlbGF5X2NvdW50ID0gMDsKKwkJCQkJCQl3aGlsZSAoMSl7CisJCQkJCQkJCWlxa19yZWFkeSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTApKTsKKwkJCQkJCQkJaWYgKCh+aXFrX3JlYWR5KSB8fCAoZGVsYXlfY291bnQ+MjApKSB7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJbWRlbGF5KDEpOworCQkJCQkJCQkJZGVsYXlfY291bnQrKzsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWlmIChkZWxheV9jb3VudCA8IDIwKXsJCQkJCQkJLy8gSWYgMjBtcyBObyBSZXN1bHQsIHRoZW4gY2FsX3JldHJ5KysKKwkJCQkJCQkJLy8gPT09PT09PT09PT09VFhJUUsgQ2hlY2s9PT09PT09PT09PT09PQorCQkJCQkJCQl0eF9mYWlsID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIEJJVCgxMikpOworCisJCQkJCQkJCWlmICh+dHhfZmFpbCl7CisJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDIwMDAwMDApOworCQkJCQkJCQkJdHhfeDBbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDQwMDAwMDApOworCQkJCQkJCQkJdHhfeTBbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQl0eDBpcWtvayA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjY2MsIDB4MDAwMDA3ZmYsIDB4MCk7CisJCQkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGNkNCwgMHgwMDAwMDdmZiwgMHgyMDApOworCQkJCQkJCQkJdHgwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkgeworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2V7CisJCQkJCQkJCXR4MGlxa29rID0gZmFsc2U7CisJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQlpZiAoY2FsX3JldHJ5ID09IDEwKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKworCQkJCQlpZiAodHgwaXFrb2sgPT0gZmFsc2UpCisJCQkJCQlicmVhazsJCQkJLy8gVFhLIGZhaWwsIERvbid0IGRvIFJYSworCisJCQkJCWlmICh2ZGZfZW5hYmxlID09IDEpeworCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjZTgsIEJJVCgzMSksIDB4MCk7ICAgIC8vIFRYIFZERiBEaXNhYmxlCisJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiUlhWREYgU3RhcnRcbiIpKTsKKwkJCQkJCWZvciAoayA9IDA7ayA8PSAyOyBrKyspeworCQkJCQkJCS8vPT09PT09IFJYIG1vZGUgVFhLIChSWEsgU3RlcCAxKSA9PT09PT0KKwkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQkJCS8vIDEuIFRYIFJGIFNldHRpbmcKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHg4MDAwMCk7CisJCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MzAwMDApOworCQkJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MzEsIFJGUkVHX09GRlNFVF9NQVNLLCAweDAwMDI5KTsKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDMyLCBSRlJFR19PRkZTRVRfTUFTSywgMHhkN2ZmYik7CisJCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg2NSwgUkZSRUdfT0ZGU0VUX01BU0ssIHRlbXBfcmVnNjUpOworCQkJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4OGYsIFJGUkVHX09GRlNFVF9NQVNLLCAweDhhMDAxKTsKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMDAwMCk7CisKKwkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGNiOCwgMHhmLCAweGQpOworCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDk3OCwgMHgyOTAwMjAwMCk7Ly8gVFggKFgsWSkKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5N2MsIDB4YTkwMDIwMDApOy8vIFJYIChYLFkpCisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTg0LCAweDAwNDZhOTEwKTsvLyBbMF06QUdDX2VuLCBbMTVdOmlkYWNfS19NYXNrCisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTBjLCAweDAwMDA4MDAwKTsKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhiMDAsIDB4MDMwMDAxMDApOworCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDEpOyAvLyBbMzFdID0gMSAtLT4gUGFnZSBDMQorCQkJCQkJCXN3aXRjaCAoayl7CisJCQkJCQkJCWNhc2UgMDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODAsIDB4MTgwMDhjMzgpOy8vIFRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODQsIDB4MzgwMDhjMzgpOy8vIFJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XQorCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2U4LCBCSVQoMzApLCAweDApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODAsIDB4MDgwMDhjMzgpOy8vIFRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODQsIDB4MjgwMDhjMzgpOy8vIFJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XQorCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2U4LCBCSVQoMzApLCAweDApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiVkRGX1lbMV0gPSAleDs7O1ZERl9ZWzBdID0gJXhcbiIsIHZkZl95WzFdPj4yMSAmIDB4MDAwMDdmZiwgdmRmX3lbMF0+PjIxICYgMHgwMDAwN2ZmKSk7CisJCQkJCQkJCQkJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIlZERl9YWzFdID0gJXg7OztWREZfWFswXSA9ICV4XG4iLCB2ZGZfeFsxXT4+MjEgJiAweDAwMDA3ZmYsIHZkZl94WzBdPj4yMSAmIDB4MDAwMDdmZikpOworCQkJCQkJCQkJCXJ4X2R0W2NhbF0gPSAodmRmX3lbMV0+PjIwKS0odmRmX3lbMF0+PjIwKTsKKwkJCQkJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiUnhfZHQgPSAlZFxuIiwgcnhfZHRbY2FsXSkpOworCQkJCQkJCQkJCXJ4X2R0W2NhbF0gPSAoKDE2KnJ4X2R0W2NhbF0pKjEwMDAwLzEzODIzKTsKKwkJCQkJCQkJCQlyeF9kdFtjYWxdID0gKHJ4X2R0W2NhbF0gPj4gMSApKyhyeF9kdFtjYWxdICYgQklUKDApKTsKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODAsIDB4MTgwMDhjMjApOy8vIFRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYKKwkJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODQsIDB4MzgwMDhjMjApOy8vIFJYX1RvbmVfaWR4Wzk6MF0sIFJ4S19NYXNrWzI5XQorCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2U4LCAweDAwMDAzZmZmLCByeF9kdFtjYWxdICYgMHgwMDAwM2ZmZik7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4ODIxNjAzZTApOworCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4YywgMHg2ODE2M2U5Nik7CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMTAwMDAwKTsvLyBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUKKwkJCQkJCQljYWxfcmV0cnkgPSAwOworCQkJCQkJCXdoaWxlKDEpeworCQkJCQkJCQkvLyBvbmUgc2hvdAorCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZmEwMDAwMDApOworCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZjgwMDAwMDApOworCisJCQkJCQkJCW1kZWxheSgxMCk7IC8vRGVsYXkgMTBtcworCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAwMDAwMDApOworCQkJCQkJCQlkZWxheV9jb3VudCA9IDA7CisJCQkJCQkJCXdoaWxlICgxKXsKKwkJCQkJCQkJCWlxa19yZWFkeSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTApKTsKKwkJCQkJCQkJCWlmICgofmlxa19yZWFkeSl8fChkZWxheV9jb3VudD4yMCkpeworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZXsKKwkJCQkJCQkJCQltZGVsYXkoMSk7CisJCQkJCQkJCQkJZGVsYXlfY291bnQrKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmIChkZWxheV9jb3VudCA8IDIwKXsJCQkJCQkJLy8gSWYgMjBtcyBObyBSZXN1bHQsIHRoZW4gY2FsX3JldHJ5KysKKwkJCQkJCQkJCS8vID09PT09PT09PT09PVRYSVFLIENoZWNrPT09PT09PT09PT09PT0KKwkJCQkJCQkJCXR4X2ZhaWwgPSBydGxfZ2V0X2JicmVnKGh3LCAweGQwMCwgQklUKDEyKSk7CisKKwkJCQkJCQkJCWlmICh+dHhfZmFpbCl7CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAyMDAwMDAwKTsKKwkJCQkJCQkJCQl0eF94MF9yeGtbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDA0MDAwMDAwKTsKKwkJCQkJCQkJCQl0eF95MF9yeGtbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQkJdHgwaXFrb2sgPSB0cnVlOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZXsKKwkJCQkJCQkJCQl0eDBpcWtvayA9IGZhbHNlOworCQkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJCWlmIChjYWxfcmV0cnkgPT0gMTApCisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWVsc2V7CisJCQkJCQkJCQl0eDBpcWtvayA9IGZhbHNlOworCQkJCQkJCQkJY2FsX3JldHJ5Kys7CisJCQkJCQkJCQlpZiAoY2FsX3JldHJ5ID09IDEwKQorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHR4MGlxa29rID09IGZhbHNlKXsgICAvL0lmIFJYIG1vZGUgVFhLIGZhaWwsIHRoZW4gdGFrZSBUWEsgUmVzdWx0CisJCQkJCQkJCXR4X3gwX3J4a1tjYWxdID0gdHhfeDBbY2FsXTsKKwkJCQkJCQkJdHhfeTBfcnhrW2NhbF0gPSB0eF95MFtjYWxdOworCQkJCQkJCQl0eDBpcWtvayA9IHRydWU7CisJCQkJCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCJSWEsgU3RlcCAxIGZhaWxcbiIpKTsKKwkJCQkJCQl9CisKKworCQkJCQkJCS8vPT09PT09IFJYIElRSyA9PT09PT0KKwkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQkJCS8vIDEuIFJYIFJGIFNldHRpbmcKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHg4MDAwMCk7CisJCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MzAwMDApOworCQkJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4MzEsIFJGUkVHX09GRlNFVF9NQVNLLCAweDAwMDJmKTsKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweDMyLCBSRlJFR19PRkZTRVRfTUFTSywgMHhmZmZiYik7CisJCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg4ZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ODgwMDEpOworCQkJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4NjUsIFJGUkVHX09GRlNFVF9NQVNLLCAweDkzMWQ4KTsKKwkJCQkJCQlydGxfc2V0X3JmcmVnKGh3LCBwYXRoLCAweGVmLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMDAwMCk7CisKKwkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgMHgwM0ZGODAwMCwgKHR4X3gwX3J4a1tjYWxdKT4+MjEmMHgwMDAwMDdmZik7CisJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHg5NzgsIDB4MDAwMDA3RkYsICh0eF95MF9yeGtbY2FsXSk+PjIxJjB4MDAwMDA3ZmYpOworCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4OTc4LCBCSVQoMzEpLCAweDEpOworCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4OTdjLCBCSVQoMzEpLCAweDApOworCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2I4LCAweEYsIDB4ZSk7CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTBjLCAweDAwMDA4MDAwKTsKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NmE5MTEpOworCisJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8vIFszMV0gPSAxIC0tPiBQYWdlIEMxCisJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjODAsIEJJVCgyOSksIDB4MSk7CisJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjODQsIEJJVCgyOSksIDB4MCk7CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg4LCAweDAyMTQwMTE5KTsKKworCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4YywgMHgyODE2MGQwMCk7IC8qIHBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2UgPT0gMSAqLworCisJCQkJCQkJaWYgKGs9PTIpeworCQkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGNlOCwgQklUKDMwKSwgMHgxKTsgIC8vUlggVkRGIEVuYWJsZQorCQkJCQkJCX0KKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAxMDAwMDApOy8vIGNiOFsyMF0gsU4gU0kvUEkgqM+lzsV2pMG1uSBpcWtfZHBrIG1vZHVsZQorCisJCQkJCQkJY2FsX3JldHJ5ID0gMDsKKwkJCQkJCQl3aGlsZSgxKXsKKwkJCQkJCQkJLy8gb25lIHNob3QKKwkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGZhMDAwMDAwKTsKKwkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGY4MDAwMDAwKTsKKworCQkJCQkJCQltZGVsYXkoMTApOyAvL0RlbGF5IDEwbXMKKwkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMDAwMDAwKTsKKwkJCQkJCQkJZGVsYXlfY291bnQgPSAwOworCQkJCQkJCQl3aGlsZSAoMSl7CisJCQkJCQkJCQlpcWtfcmVhZHkgPSBydGxfZ2V0X2JicmVnKGh3LCAweGQwMCwgQklUKDEwKSk7CisJCQkJCQkJCQlpZiAoKH5pcWtfcmVhZHkpfHwoZGVsYXlfY291bnQ+MjApKXsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2V7CisJCQkJCQkJCQkJbWRlbGF5KDEpOworCQkJCQkJCQkJCWRlbGF5X2NvdW50Kys7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZiAoZGVsYXlfY291bnQgPCAyMCl7CS8vIElmIDIwbXMgTm8gUmVzdWx0LCB0aGVuIGNhbF9yZXRyeSsrCisJCQkJCQkJCQkvLyA9PT09PT09PT09PT1SWElRSyBDaGVjaz09PT09PT09PT09PT09CisJCQkJCQkJCQlyeF9mYWlsID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIEJJVCgxMSkpOworCQkJCQkJCQkJaWYgKHJ4X2ZhaWwgPT0gMCl7CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDA2MDAwMDAwKTsKKwkJCQkJCQkJCQl2ZGZfeFtrXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDA4MDAwMDAwKTsKKwkJCQkJCQkJCQl2ZGZfeVtrXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQkJcngwaXFrb2sgPSB0cnVlOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZXsKKwkJCQkJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweGMxMCwgMHgwMDAwMDNmZiwgMHgyMDA+PjEpOworCQkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzEwLCAweDAzZmYwMDAwLCAweDA+PjEpOworCQkJCQkJCQkJCXJ4MGlxa29rID0gZmFsc2U7CisJCQkJCQkJCQkJY2FsX3JldHJ5Kys7CisJCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJcngwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQkJaWYgKGsgPT0gMyl7CisJCQkJCQkJcnhfeDBbY2FsXSA9IHZkZl94W2stMV0gOworCQkJCQkJCXJ4X3kwW2NhbF0gPSB2ZGZfeVtrLTFdOworCQkJCQkJfQorCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjZTgsIEJJVCgzMSksIDB4MSk7ICAgIC8vIFRYIFZERiBFbmFibGUKKwkJCQkJfQorCisJCQkJCWVsc2V7CisJCQkJCQkvLz09PT09PSBSWCBtb2RlIFRYSyAoUlhLIFN0ZXAgMSkgPT09PT09CisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQkJLy8gMS4gVFggUkYgU2V0dGluZworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHhlZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ODAwMDApOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MzAwMDApOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwMjkpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ZDdmZmIpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg2NSwgUkZSRUdfT0ZGU0VUX01BU0ssIHRlbXBfcmVnNjUpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg4ZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4OGEwMDEpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHhlZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwMDApOworCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTBjLCAweDAwMDA4MDAwKTsKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGIwMCwgMHgwMzAwMDEwMCk7CisJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NmE5MTApOy8vIFswXTpBR0NfZW4sIFsxNV06aWRhY19LX01hc2sKKworCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8vIFszMV0gPSAxIC0tPiBQYWdlIEMxCisJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODAsIDB4MTgwMDhjMTApOy8vIFRYX1RvbmVfaWR4Wzk6MF0sIFR4S19NYXNrWzI5XSBUWF9Ub25lID0gMTYKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4NCwgMHgzODAwOGMxMCk7Ly8gUlhfVG9uZV9pZHhbOTowXSwgUnhLX01hc2tbMjldCisJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4ODIxNjAzZTApOworCQkJCQkJLy9PRE1fV3JpdGU0Qnl0ZShwRE1fT2RtLCAweGM4YywgMHg2ODE2M2U5Nik7CisJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDAxMDAwMDApOy8vIGNiOFsyMF0gsU4gU0kvUEkgqM+lzsV2pMG1uSBpcWtfZHBrIG1vZHVsZQorCQkJCQkJY2FsX3JldHJ5ID0gMDsKKwkJCQkJCXdoaWxlKDEpeworCQkJCQkJCS8vIG9uZSBzaG90CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGZhMDAwMDAwKTsKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZjgwMDAwMDApOworCisJCQkJCQkJbWRlbGF5KDEwKTsgLy9EZWxheSAxMG1zCisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMDAwMDAwKTsKKwkJCQkJCQlkZWxheV9jb3VudCA9IDA7CisJCQkJCQkJd2hpbGUgKDEpeworCQkJCQkJCQlpcWtfcmVhZHkgPSBydGxfZ2V0X2JicmVnKGh3LCAweGQwMCwgQklUKDEwKSk7CisJCQkJCQkJCWlmICgofmlxa19yZWFkeSl8fChkZWxheV9jb3VudD4yMCkpeworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZXsKKwkJCQkJCQkJCW1kZWxheSgxKTsKKwkJCQkJCQkJCWRlbGF5X2NvdW50Kys7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZGVsYXlfY291bnQgPCAyMCl7CQkJCQkJCS8vIElmIDIwbXMgTm8gUmVzdWx0LCB0aGVuIGNhbF9yZXRyeSsrCisJCQkJCQkJCS8vID09PT09PT09PT09PVRYSVFLIENoZWNrPT09PT09PT09PT09PT0KKwkJCQkJCQkJdHhfZmFpbCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTIpKTsKKworCQkJCQkJCQlpZiAofnR4X2ZhaWwpeworCQkJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAyMDAwMDAwKTsKKwkJCQkJCQkJCXR4X3gwX3J4a1tjYWxdID0gcnRsX2dldF9iYnJlZyhodywgMHhkMDAsIDB4MDdmZjAwMDApPDwyMTsKKwkJCQkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwNDAwMDAwMCk7CisJCQkJCQkJCQl0eF95MF9yeGtbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQl0eDBpcWtvayA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJdHgwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNleworCQkJCQkJCQl0eDBpcWtvayA9IGZhbHNlOworCQkJCQkJCQljYWxfcmV0cnkrKzsKKwkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKworCisJCQkJCQlpZiAodHgwaXFrb2sgPT0gZmFsc2UpeyAgIC8vSWYgUlggbW9kZSBUWEsgZmFpbCwgdGhlbiB0YWtlIFRYSyBSZXN1bHQKKwkJCQkJCQl0eF94MF9yeGtbY2FsXSA9IHR4X3gwW2NhbF07CisJCQkJCQkJdHhfeTBfcnhrW2NhbF0gPSB0eF95MFtjYWxdOworCQkJCQkJCXR4MGlxa29rID0gdHJ1ZTsKKwkJCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiMSIpKTsKKwkJCQkJCX0KKworCisJCQkJCQkvLz09PT09PSBSWCBJUUsgPT09PT09CisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCQkJCQkJLy8gMS4gUlggUkYgU2V0dGluZworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHhlZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ODAwMDApOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MzAwMDApOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwMmYpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHgzMiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ZmZmYmIpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg4ZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ODgwMDEpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHg2NSwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4OTMxZDgpOworCQkJCQkJcnRsX3NldF9yZnJlZyhodywgcGF0aCwgMHhlZiwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDAwMDApOworCisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgMHgwM0ZGODAwMCwgKHR4X3gwX3J4a1tjYWxdKT4+MjEmMHgwMDAwMDdmZik7CisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgMHgwMDAwMDdGRiwgKHR4X3kwX3J4a1tjYWxdKT4+MjEmMHgwMDAwMDdmZik7CisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDk3OCwgQklUKDMxKSwgMHgxKTsKKwkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4OTdjLCBCSVQoMzEpLCAweDApOworCQkJCQkJLy9PRE1fU2V0QkJSZWcocERNX09kbSwgMHhjYjgsIDB4RiwgMHhlKTsKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweDkwYywgMHgwMDAwODAwMCk7CisJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODQsIDB4MDA0NmE5MTEpOworCisJCQkJCQlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgxKTsgLy8gWzMxXSA9IDEgLS0+IFBhZ2UgQzEKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4MCwgMHgzODAwOGMxMCk7Ly8gVFhfVG9uZV9pZHhbOTowXSwgVHhLX01hc2tbMjldIFRYX1RvbmUgPSAxNgorCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Yzg0LCAweDE4MDA4YzEwKTsvLyBSWF9Ub25lX2lkeFs5OjBdLCBSeEtfTWFza1syOV0KKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4OCwgMHgwMjE0MDExOSk7CisKKwkJCQkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4YywgMHgyODE2MGQwMCk7IC8qcERNX09kbS0+U3VwcG9ydEludGVyZmFjZSA9PSAxKi8KKworCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMTAwMDAwKTsvLyBjYjhbMjBdILFOIFNJL1BJIKjPpc7FdqTBtbkgaXFrX2RwayBtb2R1bGUKKworCQkJCQkJY2FsX3JldHJ5ID0gMDsKKwkJCQkJCXdoaWxlKDEpeworCQkJCQkJCS8vIG9uZSBzaG90CisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4OTgwLCAweGZhMDAwMDAwKTsKKwkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHg5ODAsIDB4ZjgwMDAwMDApOworCisJCQkJCQkJbWRlbGF5KDEwKTsgLy9EZWxheSAxMG1zCisJCQkJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2I4LCAweDAwMDAwMDAwKTsKKwkJCQkJCQlkZWxheV9jb3VudCA9IDA7CisJCQkJCQkJd2hpbGUgKDEpeworCQkJCQkJCQlpcWtfcmVhZHkgPSBydGxfZ2V0X2JicmVnKGh3LCAweGQwMCwgQklUKDEwKSk7CisJCQkJCQkJCWlmICgofmlxa19yZWFkeSl8fChkZWxheV9jb3VudD4yMCkpeworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZXsKKwkJCQkJCQkJCW1kZWxheSgxKTsKKwkJCQkJCQkJCWRlbGF5X2NvdW50Kys7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZGVsYXlfY291bnQgPCAyMCl7CS8vIElmIDIwbXMgTm8gUmVzdWx0LCB0aGVuIGNhbF9yZXRyeSsrCisJCQkJCQkJCS8vID09PT09PT09PT09PVJYSVFLIENoZWNrPT09PT09PT09PT09PT0KKwkJCQkJCQkJcnhfZmFpbCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCBCSVQoMTEpKTsKKwkJCQkJCQkJaWYgKHJ4X2ZhaWwgPT0gMCl7CisJCQkJCQkJCQkvKgorCQkJCQkJCQkJICAgT0RNX1dyaXRlNEJ5dGUocERNX09kbSwgMHhjYjgsIDB4MDUwMDAwMDApOworCQkJCQkJCQkJICAgcmVnMSA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweGQwMCwgMHhmZmZmZmZmZik7CisJCQkJCQkJCQkgICBPRE1fV3JpdGU0Qnl0ZShwRE1fT2RtLCAweGNiOCwgMHgwNjAwMDAwMCk7CisJCQkJCQkJCQkgICByZWcyID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIDB4ZDAwLCAweDAwMDAwMDFmKTsKKwkJCQkJCQkJCSAgIERiZ1ByaW50KCJyZWcxID0gJWQsIHJlZzIgPSAlZCIsIHJlZzEsIHJlZzIpOworCQkJCQkJCQkJICAgSW1hZ2VfUG93ZXIgPSAocmVnMjw8MzIpK3JlZzE7CisJCQkJCQkJCQkgICBEYmdQcmludCgiQmVmb3JlIFBXID0gJWRcbiIsIEltYWdlX1Bvd2VyKTsKKwkJCQkJCQkJCSAgIE9ETV9Xcml0ZTRCeXRlKHBETV9PZG0sIDB4Y2I4LCAweDA3MDAwMDAwKTsKKwkJCQkJCQkJCSAgIHJlZzEgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgMHhkMDAsIDB4ZmZmZmZmZmYpOworCQkJCQkJCQkJICAgT0RNX1dyaXRlNEJ5dGUocERNX09kbSwgMHhjYjgsIDB4MDgwMDAwMDApOworCQkJCQkJCQkJICAgcmVnMiA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweGQwMCwgMHgwMDAwMDAxZik7CisJCQkJCQkJCQkgICBJbWFnZV9Qb3dlciA9IChyZWcyPDwzMikrcmVnMTsKKwkJCQkJCQkJCSAgIERiZ1ByaW50KCJBZnRlciBQVyA9ICVkXG4iLCBJbWFnZV9Qb3dlcik7CisJCQkJCQkJCQkgICAqLworCisJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDYwMDAwMDApOworCQkJCQkJCQkJcnhfeDBbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYjgsIDB4MDgwMDAwMDApOworCQkJCQkJCQkJcnhfeTBbY2FsXSA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZDAwLCAweDA3ZmYwMDAwKTw8MjE7CisJCQkJCQkJCQlyeDBpcWtvayA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNleworCQkJCQkJCQkJcnRsX3NldF9iYnJlZyhodywgMHhjMTAsIDB4MDAwMDAzZmYsIDB4MjAwPj4xKTsKKwkJCQkJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YzEwLCAweDAzZmYwMDAwLCAweDA+PjEpOworCQkJCQkJCQkJcngwaXFrb2sgPSBmYWxzZTsKKwkJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQkJaWYgKGNhbF9yZXRyeSA9PSAxMCkKKwkJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2V7CisJCQkJCQkJCXJ4MGlxa29rID0gZmFsc2U7CisJCQkJCQkJCWNhbF9yZXRyeSsrOworCQkJCQkJCQlpZiAoY2FsX3JldHJ5ID09IDEwKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKHR4MGlxa29rKQorCQkJCQkJdHhfYXZlcmFnZSsrOworCQkJCQlpZiAocngwaXFrb2spCisJCQkJCQlyeF9hdmVyYWdlKys7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvLyBbMzFdID0gMCAtLT4gUGFnZSBDCisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIDB4NjUsIFJGUkVHX09GRlNFVF9NQVNLLCB0ZW1wX3JlZzY1KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWNhbCsrOworCX0KKworCS8vIEZpbGxJUUsgUmVzdWx0CisJc3dpdGNoIChwYXRoKXsKKwkJY2FzZSBSRjkwX1BBVEhfQToKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiPT09PT09PT1QYXRoX0EgPT09PT09PVxuIikpOworCQkJCWlmICh0eF9hdmVyYWdlID09IDApCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpID0gMDsgaSA8IHR4X2F2ZXJhZ2U7IGkrKyl7CisJCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCIgVFhfWDBfUlhLWyVkXSA9ICV4IDs7IFRYX1kwX1JYS1slZF0gPSAleFxuIiwgaSwgKHR4X3gwX3J4a1tpXSk+PjIxJjB4MDAwMDA3ZmYsIGksICh0eF95MF9yeGtbaV0pPj4yMSYweDAwMDAwN2ZmKSk7CisJCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCJUWF9YMFslZF0gPSAleCA7OyBUWF9ZMFslZF0gPSAleFxuIiwgaSwgKHR4X3gwW2ldKT4+MjEmMHgwMDAwMDdmZiwgaSwgKHR4X3kwW2ldKT4+MjEmMHgwMDAwMDdmZikpOworCQkJCX0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgdHhfYXZlcmFnZTsgaSsrKXsKKwkJCQkJZm9yIChpaSA9IGkrMTsgaWkgPHR4X2F2ZXJhZ2U7IGlpKyspeworCQkJCQkJZHggPSAodHhfeDBbaV0+PjIxKSAtICh0eF94MFtpaV0+PjIxKTsKKwkJCQkJCWlmIChkeCA8IDMgJiYgZHggPiAtMyl7CisJCQkJCQkJZHkgPSAodHhfeTBbaV0+PjIxKSAtICh0eF95MFtpaV0+PjIxKTsKKwkJCQkJCQlpZiAoZHkgPCAzICYmIGR5ID4gLTMpeworCQkJCQkJCQl0eF94ID0gKCh0eF94MFtpXT4+MjEpICsgKHR4X3gwW2lpXT4+MjEpKS8yOworCQkJCQkJCQl0eF95ID0gKCh0eF95MFtpXT4+MjEpICsgKHR4X3kwW2lpXT4+MjEpKS8yOworCQkJCQkJCQl0eF9maW5pc2ggPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHR4X2ZpbmlzaCA9PSAxKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHR4X2ZpbmlzaCA9PSAxKXsKKwkJCQkJX3J0bDg4MjFhZV9pcWtfdHhfZmlsbF9pcWMoaHcsIHBhdGgsIHR4X3gsIHR4X3kpOyAvLyA/CisJCQkJfQorCQkJCWVsc2V7CisJCQkJCV9ydGw4ODIxYWVfaXFrX3R4X2ZpbGxfaXFjKGh3LCBwYXRoLCAweDIwMCwgMHgwKTsKKwkJCQl9CisKKwkJCQlpZiAocnhfYXZlcmFnZSA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaSA9IDA7IGkgPCByeF9hdmVyYWdlOyBpKyspeworCQkJCQlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiUlhfWDBbJWRdID0gJXggOzsgUlhfWTBbJWRdID0gJXhcbiIsIGksIChyeF94MFtpXSk+PjIxJjB4MDAwMDA3ZmYsIGksIChyeF95MFtpXSk+PjIxJjB4MDAwMDA3ZmYpKTsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IHJ4X2F2ZXJhZ2U7IGkrKyl7CisJCQkJCWZvciAoaWkgPSBpKzE7IGlpIDxyeF9hdmVyYWdlOyBpaSsrKXsKKwkJCQkJCWR4ID0gKHJ4X3gwW2ldPj4yMSkgLSAocnhfeDBbaWldPj4yMSk7CisJCQkJCQlpZiAoZHggPCA0ICYmIGR4ID4gLTQpeworCQkJCQkJCWR5ID0gKHJ4X3kwW2ldPj4yMSkgLSAocnhfeTBbaWldPj4yMSk7CisJCQkJCQkJaWYgKGR5IDwgNCAmJiBkeSA+IC00KXsKKwkJCQkJCQkJcnhfeCA9ICgocnhfeDBbaV0+PjIxKSArIChyeF94MFtpaV0+PjIxKSkvMjsKKwkJCQkJCQkJcnhfeSA9ICgocnhfeTBbaV0+PjIxKSArIChyeF95MFtpaV0+PjIxKSkvMjsKKwkJCQkJCQkJcnhfZmluaXNoID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChyeF9maW5pc2ggPT0gMSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChyeF9maW5pc2ggPT0gMSl7CisJCQkJCV9ydGw4ODIxYWVfaXFrX3J4X2ZpbGxfaXFjKGh3LCBwYXRoLCByeF94LCByeF95KTsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkJX3J0bDg4MjFhZV9pcWtfcnhfZmlsbF9pcWMoaHcsIHBhdGgsIDB4MjAwLCAweDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCit2b2lkIF9ydGw4ODIxYWVfaXFrX3Jlc3RvcmVfcmYoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQllbnVtIHJhZGlvX3BhdGggcGF0aCwKKwkJdTMyKgkJCWJhY2t1cF9yZl9yZWcsCisJCXUzMiogCQkJcmZfYmFja3VwLAorCQl1MzIJCQlyZl9yZWdfbnVtCisJCSkKK3sKKwl1MzIgaTsKKwlzdHJ1Y3QgcnRsX3ByaXYqIHJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCWZvciAoaSA9IDA7IGkgPCBSRl9SRUdfTlVNOyBpKyspCisJCXJ0bF9zZXRfcmZyZWcoaHcsIHBhdGgsIGJhY2t1cF9yZl9yZWdbaV0sIFJGUkVHX09GRlNFVF9NQVNLLCByZl9iYWNrdXBbaV0pOworCisJc3dpdGNoKHBhdGgpeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfSVFLLCBEQkdfTE9VRCwgKCJSZXN0b3JlUkYgUGF0aCBBIFN1Y2Nlc3MhISEhXG4iKSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKwordm9pZCBfcnRsODgyMWFlX2lxa19yZXN0b3JlX2FmZSgKKwkJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCXUzMioJCWFmZV9iYWNrdXAsCisJCXUzMioJCWJhY2t1cF9hZmVfcmVnLAorCQl1MzIJCWFmZV9udW0KKwkJKQoreworCXUzMiBpOworCXN0cnVjdCBydGxfcHJpdiogcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODJjLCBCSVQoMzEpLCAweDApOyAvLyBbMzFdID0gMCAtLT4gUGFnZSBDCisJLy9SZWxvYWQgQUZFIFBhcmFtZXRlcnMKKwlmb3IgKGkgPSAwOyBpIDwgYWZlX251bTsgaSsrKXsKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIGJhY2t1cF9hZmVfcmVnW2ldLCBhZmVfYmFja3VwW2ldKTsKKwl9CisJcnRsX3NldF9iYnJlZyhodywgMHg4MmMsIEJJVCgzMSksIDB4MSk7IC8vIFszMV0gPSAxIC0tPiBQYWdlIEMxCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzgwLCAweDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM4NCwgMHgwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjODgsIDB4MCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4YzhjLCAweDNjMDAwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjOTAsIDB4MDAwMDAwODApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGM5NCwgMHgwMDAwMDAwMCk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIDB4Y2M0LCAweDIwMDQwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgMHhjYzgsIDB4MjAwMDAwMDApOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAweGNiOCwgMHgwKTsKKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsICgiUmVzdG9yZUFGRSBTdWNjZXNzISEhIVxuIikpOworfQorCit2b2lkIF9ydGw4ODIxYWVfaXFrX3Jlc3RvcmVfbWFjYmIoCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQl1MzIqCQltYWNiYl9iYWNrdXAsCisJCXUzMioJCWJhY2t1cF9tYWNiYl9yZWcsCisJCXUzMgkJbWFjYmJfbnVtCisJCSkKK3sKKwl1MzIgaTsKKwlzdHJ1Y3QgcnRsX3ByaXYqIHJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxfc2V0X2JicmVnKGh3LCAweDgyYywgQklUKDMxKSwgMHgwKTsgLy8gWzMxXSA9IDAgLS0+IFBhZ2UgQworCS8vUmVsb2FkIE1hY0JCIFBhcmFtZXRlcnMKKwlmb3IgKGkgPSAwOyBpIDwgbWFjYmJfbnVtOyBpKyspeworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgYmFja3VwX21hY2JiX3JlZ1tpXSwgbWFjYmJfYmFja3VwW2ldKTsKKwl9CisJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELCAoIlJlc3RvcmVNYWNCQiBTdWNjZXNzISEhIVxuIikpOworfQorCisKKyN1bmRlZiBNQUNCQl9SRUdfTlVNCisjdW5kZWYgQUZFX1JFR19OVU0KKyN1bmRlZiBSRl9SRUdfTlVNCisKKyNkZWZpbmUgTUFDQkJfUkVHX05VTSAxMQorI2RlZmluZSBBRkVfUkVHX05VTSAxMgorI2RlZmluZSBSRl9SRUdfTlVNIDMKKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXUzMgltYWNiYl9iYWNrdXBbTUFDQkJfUkVHX05VTV07CisJdTMyIGFmZV9iYWNrdXBbQUZFX1JFR19OVU1dOworCXUzMiByZmFfYmFja3VwW1JGX1JFR19OVU1dOworCXUzMiByZmJfYmFja3VwW1JGX1JFR19OVU1dOworCXUzMiAJYmFja3VwX21hY2JiX3JlZ1tNQUNCQl9SRUdfTlVNXSA9IHsweGIwMCwgMHg1MjAsIDB4NTUwLCAweDgwOCwgMHg5MGMsIDB4YzAwLCAweGM1MCwKKwkJCQkJCQkweGUwMCwgMHhlNTAsIDB4ODM4LCAweDgyY307CisJdTMyCWJhY2t1cF9hZmVfcmVnW0FGRV9SRUdfTlVNXSA9IHsweGM1YywgMHhjNjAsIDB4YzY0LCAweGM2OCwgMHhjNmMsIDB4YzcwLCAweGM3NCwKKwkJCQkJCQkweGM3OCwgMHhjN2MsIDB4YzgwLCAweGM4NCwgMHhjYjh9OworCXUzMiAJYmFja3VwX3JmX3JlZ1tSRl9SRUdfTlVNXSA9IHsweDY1LCAweDhmLCAweDB9OworCisJX3J0bDg4MjFhZV9pcWtfYmFja3VwX21hY2JiKGh3LCBtYWNiYl9iYWNrdXAsIGJhY2t1cF9tYWNiYl9yZWcsIE1BQ0JCX1JFR19OVU0pOworCV9ydGw4ODIxYWVfaXFrX2JhY2t1cF9hZmUoaHcsIGFmZV9iYWNrdXAsIGJhY2t1cF9hZmVfcmVnLCBBRkVfUkVHX05VTSk7CisJX3J0bDg4MjFhZV9pcWtfYmFja3VwX3JmKGh3LCByZmFfYmFja3VwLCByZmJfYmFja3VwLCBiYWNrdXBfcmZfcmVnLCBSRl9SRUdfTlVNKTsKKworCV9ydGw4ODIxYWVfaXFrX2NvbmZpZ3VyZV9tYWMoaHcpOworCV9ydGw4ODIxYWVfaXFrX3R4KGh3LCBSRjkwX1BBVEhfQSk7CisJX3J0bDg4MjFhZV9pcWtfcmVzdG9yZV9yZihodywgUkY5MF9QQVRIX0EsIGJhY2t1cF9yZl9yZWcsIHJmYV9iYWNrdXAsIFJGX1JFR19OVU0pOworCisJX3J0bDg4MjFhZV9pcWtfcmVzdG9yZV9hZmUoaHcsIGFmZV9iYWNrdXAsIGJhY2t1cF9hZmVfcmVnLCBBRkVfUkVHX05VTSk7CisJX3J0bDg4MjFhZV9pcWtfcmVzdG9yZV9tYWNiYihodywgbWFjYmJfYmFja3VwLCBiYWNrdXBfbWFjYmJfcmVnLCBNQUNCQl9SRUdfTlVNKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9waHlfbGNfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGlzMnQpCit7CisJdTggdG1wcmVnOworCXUzMiByZl9hX21vZGUgPSAwLCByZl9iX21vZGUgPSAwLCBsY19jYWw7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJdG1wcmVnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweGQwMyk7CisKKwlpZiAoKHRtcHJlZyAmIDB4NzApICE9IDApCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4ZDAzLCB0bXByZWcgJiAweDhGKTsKKwllbHNlCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UWFBBVVNFLCAweEZGKTsKKworCWlmICgodG1wcmVnICYgMHg3MCkgIT0gMCkgeworCQlyZl9hX21vZGUgPSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgwMCwgTUFTSzEyQklUUyk7CisKKwkJaWYgKGlzMnQpCisJCQlyZl9iX21vZGUgPSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQiwgMHgwMCwKKwkJCQkJCSAgTUFTSzEyQklUUyk7CisKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4MDAsIE1BU0sxMkJJVFMsCisJCQkgICAgICAocmZfYV9tb2RlICYgMHg4RkZGRikgfCAweDEwMDAwKTsKKworCQlpZiAoaXMydCkKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCAweDAwLCBNQVNLMTJCSVRTLAorCQkJCSAgICAgIChyZl9iX21vZGUgJiAweDhGRkZGKSB8IDB4MTAwMDApOworCX0KKwlsY19jYWwgPSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgxOCwgTUFTSzEyQklUUyk7CisKKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHhiMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4ZGZiZTApOworCS8qIHJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCAweDE4LCBNQVNLMTJCSVRTLCBsY19jYWwgfCAweDA4MDAwKTsgKi8KKwlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgxOCwgTUFTSzEyQklUUywgMHg4YzBhKTsKKworCW1kZWxheSgxMDApOworCisJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4YjAsIFJGUkVHX09GRlNFVF9NQVNLLCAweGRmZmUwKTsKKworCWlmICgodG1wcmVnICYgMHg3MCkgIT0gMCkgeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGQwMywgdG1wcmVnKTsKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4MDAsIE1BU0sxMkJJVFMsIHJmX2FfbW9kZSk7CisKKwkJaWYgKGlzMnQpCisJCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQiwgMHgwMCwgTUFTSzEyQklUUywgcmZfYl9tb2RlKTsKKwl9IGVsc2UgeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQQVVTRSwgMHgwMCk7CisJfQorUlRfVFJBQ0UoQ09NUF9JTklULERCR19MT1VELCgiXG4iKSk7CisKK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9waHlfc2V0X3JmcGF0aF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgbWFpbikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJLy9zdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCS8vc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsREJHX0xPVUQsKCJcbiIpKTsKKworCWlmIChtYWluKQorCQlydGxfc2V0X2JicmVnKGh3LCBSQV9SRkVfUElOTVVYICsgNCwgQklUKDI5KSB8IEJJVCgyOCksIDB4MSk7CisJZWxzZQorCQlydGxfc2V0X2JicmVnKGh3LCBSQV9SRkVfUElOTVVYICsgNCwgQklUKDI5KSB8IEJJVCgyOCksIDB4Mik7Cit9CisKKyN1bmRlZiBJUUtfQUREQV9SRUdfTlVNCisjdW5kZWYgSVFLX0RFTEFZX1RJTUUKKwordm9pZCBydGw4ODEyYWVfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBiX3JlY292ZXJ5KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCisJaWYgKCFydGxwaHktPmJfaXFrX2luX3Byb2dyZXNzKQorCXsKKwkJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisJCXJ0bHBoeS0+Yl9pcWtfaW5fcHJvZ3Jlc3MgPSB0cnVlOworCQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCisJCV9ydGw4ODEyYWVfcGh5X2lxX2NhbGlicmF0ZShodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpOworCisJCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCQlydGxwaHktPmJfaXFrX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisJfQorfQorCit2b2lkIHJ0bDg4MTJhZV9yZXNldF9pcWtfcmVzdWx0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IGk7CisKKwlSVF9UUkFDRShDT01QX0lRSywgREJHX0xPVUQsCisJCSgicnRsODgxMmFlX2RtX3Jlc2V0X2lxa19yZXN1bHQ6OiBzZXR0aW5ncyByZWdzICVkIGRlZmF1bHQgcmVncyAlZFxuIiwKKwkJKGludCkoc2l6ZW9mKHJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nKSAvCisJCXNpemVvZihzdHJ1Y3QgaXFrX21hdHJpeF9yZWdzKSksCisJCUlRS19NQVRSSVhfU0VUVElOR1NfTlVNKSk7CisKKwlmb3IoaSA9IDA7IGkgPCBJUUtfTUFUUklYX1NFVFRJTkdTX05VTTsgaSsrKSB7CisJCXsKKwkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzBdID0KKwkJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVsyXSA9CisJCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bNF0gPQorCQkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzZdID0gMHgxMDA7CisKKwkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzFdID0KKwkJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVszXSA9CisJCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bNV0gPQorCQkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzddID0gMHgwOworCisJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS5iX2lxa19kb25lID0gZmFsc2U7CisKKwkJfQorCX0KK30KKwordm9pZCBydGw4ODEyYWVfZG9faXFrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LHU4IGRlbHRhX3RoZXJtYWxfaW5kZXgsCisJdTggdGhlcm1hbF92YWx1ZSwgdTggdGhyZXNob2xkKQoreworCXN0cnVjdCBydGxfZG0JKnJ0bGRtID0gcnRsX2RtKHJ0bF9wcml2KGh3KSk7CisKKwlydGw4ODEyYWVfcmVzZXRfaXFrX3Jlc3VsdChodyk7CisKKwlydGxkbS0+dGhlcm1hbHZhbHVlX2lxaz0gdGhlcm1hbF92YWx1ZTsKKwlydGw4ODEyYWVfcGh5X2lxX2NhbGlicmF0ZShodywgZmFsc2UpOworfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfcmVjb3ZlcnkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlpZiAoIXJ0bHBoeS0+Yl9pcWtfaW5fcHJvZ3Jlc3MpCisJeworCQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwkJcnRscGh5LT5iX2lxa19pbl9wcm9ncmVzcyA9IHRydWU7CisJCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcWtfbG9jayk7CisKKwkJX3J0bDg4MjFhZV9waHlfaXFfY2FsaWJyYXRlKGh3KTsKKworCQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmlxa19sb2NrKTsKKwkJcnRscGh5LT5iX2lxa19pbl9wcm9ncmVzcyA9IGZhbHNlOworCQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MuaXFrX2xvY2spOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfcmVzZXRfaXFrX3Jlc3VsdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1OCBpOworCisJUlRfVFJBQ0UoQ09NUF9JUUssIERCR19MT1VELAorCQkoInJ0bDg4MTJhZV9kbV9yZXNldF9pcWtfcmVzdWx0Ojogc2V0dGluZ3MgcmVncyAlZCBkZWZhdWx0IHJlZ3MgJWRcbiIsCisJCShpbnQpKHNpemVvZihydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZykgLworCQlzaXplb2Yoc3RydWN0IGlxa19tYXRyaXhfcmVncykpLAorCQlJUUtfTUFUUklYX1NFVFRJTkdTX05VTSkpOworCisJZm9yKGkgPSAwOyBpIDwgSVFLX01BVFJJWF9TRVRUSU5HU19OVU07IGkrKykgeworCQl7CisJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVswXSA9CisJCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bMl0gPQorCQkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzRdID0KKwkJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVs2XSA9IDB4MTAwOworCisJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVsxXSA9CisJCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bM10gPQorCQkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzVdID0KKwkJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVs3XSA9IDB4MDsKKworCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0uYl9pcWtfZG9uZSA9IGZhbHNlOworCisJCX0KKwl9Cit9CisKK3ZvaWQgcnRsODgyMWFlX2RvX2lxayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyx1OCBkZWx0YV90aGVybWFsX2luZGV4LAorCXU4IHRoZXJtYWxfdmFsdWUsIHU4IHRocmVzaG9sZCkKK3sKKwlzdHJ1Y3QgcnRsX2RtCSpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCisJcnRsODgyMWFlX3Jlc2V0X2lxa19yZXN1bHQoaHcpOworCisJcnRsZG0tPnRoZXJtYWx2YWx1ZV9pcWs9IHRoZXJtYWxfdmFsdWU7CisJcnRsODgyMWFlX3BoeV9pcV9jYWxpYnJhdGUoaHcsIGZhbHNlKTsKK30KKwordm9pZCBydGw4ODIxYWVfcGh5X2xjX2NhbGlicmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gJihydGxwcml2LT5ydGxoYWwpOworCXUzMiB0aW1lb3V0ID0gMjAwMCwgdGltZWNvdW50ID0gMDsKKworCisJd2hpbGUgKHJ0bHByaXYtPm1hYzgwMjExLmFjdF9zY2FubmluZyAmJiB0aW1lY291bnQgPCB0aW1lb3V0KSB7CisJCXVkZWxheSg1MCk7CisJCXRpbWVjb3VudCArPSA1MDsKKwl9CisKKwlydGxwaHktPmxja19pbnByb2dyZXNzID0gdHJ1ZTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJKCJMQ0s6U3RhcnQhISEgY3VycmVudGJhbmQgJXggZGVsYXkgJWQgbXNcbiIsCisJCSBydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUsIHRpbWVjb3VudCkpOworCisJX3J0bDg4MjFhZV9waHlfbGNfY2FsaWJyYXRlKGh3LCBmYWxzZSk7CisKKwlydGxwaHktPmxja19pbnByb2dyZXNzID0gZmFsc2U7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgZGVsdGEpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlpZiAocnRscGh5LT5iX2Fwa19kb25lKQorCQlyZXR1cm47CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgcnRsODgyMWFlX3BoeV9zZXRfcmZwYXRoX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBibWFpbikKK3sKKwlfcnRsODgyMWFlX3BoeV9zZXRfcmZwYXRoX3N3aXRjaChodywgYm1haW4pOworfQorCitib29sIHJ0bDg4MjFhZV9waHlfc2V0X2lvX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBpb190eXBlIGlvdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlib29sIGJfcG9zdHByb2Nlc3NpbmcgPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfVFJBQ0UsCisJCSAoIi0tPklPIENtZCglI3gpLCBzZXRfaW9faW5wcm9ncmVzcyglZClcbiIsCisJCSAgaW90eXBlLCBydGxwaHktPnNldF9pb19pbnByb2dyZXNzKSk7CisJZG8geworCQlzd2l0Y2ggKGlvdHlwZSkgeworCQljYXNlIElPX0NNRF9SRVNVTUVfRE1fQllfU0NBTjoKKwkJCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfVFJBQ0UsCisJCQkJICgiW0lPIENNRF0gUmVzdW1lIERNIGFmdGVyIHNjYW4uXG4iKSk7CisJCQliX3Bvc3Rwcm9jZXNzaW5nID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIElPX0NNRF9QQVVTRV9CQU5EMF9ETV9CWV9TQ0FOOgorCQljYXNlIElPX0NNRF9QQVVTRV9CQU5EMV9ETV9CWV9TQ0FOOgorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19UUkFDRSwKKwkJCQkgKCJbSU8gQ01EXSBQYXVzZSBETSBiZWZvcmUgc2Nhbi5cbiIpKTsKKwkJCWJfcG9zdHByb2Nlc3NpbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChmYWxzZSk7CisJaWYgKGJfcG9zdHByb2Nlc3NpbmcgJiYgIXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MpIHsKKwkJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IHRydWU7CisJCXJ0bHBoeS0+Y3VycmVudF9pb190eXBlID0gaW90eXBlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcnRsODgyMWFlX3BoeV9zZXRfaW8oaHcpOworCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfVFJBQ0UsICgiSU8gVHlwZSglI3gpXG4iLCBpb3R5cGUpKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcnRsODgyMWFlX3BoeV9zZXRfaW8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlSVF9UUkFDRShDT01QX0NNRCwgREJHX1RSQUNFLAorCQkgKCItLS0+Q21kKCUjeCksIHNldF9pb19pbnByb2dyZXNzKCVkKVxuIiwKKwkJICBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSwgcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcykpOworCXN3aXRjaCAocnRscGh5LT5jdXJyZW50X2lvX3R5cGUpIHsKKwljYXNlIElPX0NNRF9SRVNVTUVfRE1fQllfU0NBTjoKKwkJaWYgKHJ0bHByaXYtPm1hYzgwMjExLm9wbW9kZT09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQkJX3J0bDg4MjFhZV9yZXN1bWVfdHhfYmVhY29uKGh3KTsKKwkJcnRsODgyMWFlX2RtX3dyaXRlX2RpZyhodywgcnRscGh5LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCXJ0bDg4MjFhZV9kbV93cml0ZV9jY2tfY2NhX3RocmVzKGh3LCBydGxwaHktPmluaXRnYWluX2JhY2t1cC5jY2EpOworCQlicmVhazsKKwljYXNlIElPX0NNRF9QQVVTRV9CQU5EMF9ETV9CWV9TQ0FOOgorCQlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCQlfcnRsODgyMWFlX3N0b3BfdHhfYmVhY29uKGh3KTsKKwkJcnRscGh5LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9IGRtX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlOworCQlydGw4ODIxYWVfZG1fd3JpdGVfZGlnKGh3LCAweDE3KTsKKwkJcnRscGh5LT5pbml0Z2Fpbl9iYWNrdXAuY2NhID0gZG1fZGlndGFibGUuY3VyX2Nja19jY2FfdGhyZXM7CisJCXJ0bDg4MjFhZV9kbV93cml0ZV9jY2tfY2NhX3RocmVzKGh3LCAweDQwKTsKKwkJYnJlYWs7CisJY2FzZSBJT19DTURfUEFVU0VfQkFORDFfRE1fQllfU0NBTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVhazsKKwl9CisJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOworCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfVFJBQ0UsCisJCSAoIiglI3gpXG4iLCBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSkpOworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfcGh5X3NldF9yZl9vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1BTMF9DVFJMLCAweDJiKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4sIDB4RTMpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCAweEUzKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQQVVTRSwgMHgwMCk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3BoeV9zZXRfcmZfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RYUEFVU0UsIDB4RkYpOworCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCAweDAwLCBSRlJFR19PRkZTRVRfTUFTSywgMHgwMCk7CisJLypydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTRF9DVFJMLCAweDQwKTsKKwl1NGJfdG1wID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDAsIFJGUkVHX09GRlNFVF9NQVNLKTsKKwl3aGlsZSAodTRiX3RtcCAhPSAwICYmIGRlbGF5ID4gMCkgeworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTRF9DVFJMLCAweDApOworCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgwMCwgUkZSRUdfT0ZGU0VUX01BU0ssIDB4MDApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTRF9DVFJMLCAweDQwKTsKKwkJdTRiX3RtcCA9IHJ0bF9nZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCAwLCBSRlJFR19PRkZTRVRfTUFTSyk7CisJCWRlbGF5LS07CisJfQorCWlmIChkZWxheSA9PSAwKSB7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BUFNEX0NUUkwsIDB4MDApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4sIDB4RTIpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4sIDB4RTMpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQQVVTRSwgMHgwMCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19UUkFDRSwKKwkJCSAoIlN3aXRjaCBSRiB0aW1lb3V0ICEhIS5cbiIpKTsKKwkJcmV0dXJuOworCX0qLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NQUzBfQ1RSTCwgMHgyMik7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wgX3J0bDg4MjFhZV9waHlfc2V0X3JmX3Bvd2VyX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgZW51bSByZl9wd3JzdGF0ZSByZnB3cl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCWJvb2wgYnJlc3VsdCA9IHRydWU7CisJdTggaSwgcXVldWVfaWQ7CisJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9IE5VTEw7CisKKwlzd2l0Y2ggKHJmcHdyX3N0YXRlKSB7CisJY2FzZSBFUkZPTjp7CisJCQlpZiAoKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRikgJiYKKwkJCSAgICBSVF9JTl9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQykpIHsKKwkJCQlib29sIHJ0c3RhdHVzID0gZmFsc2U7CisJCQkJdTMyIEluaXRpYWxpemVDb3VudCA9IDA7CisJCQkJZG8geworCQkJCQlJbml0aWFsaXplQ291bnQrKzsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCQkJICgiSVBTIFNldCBlUmYgbmljIGVuYWJsZVxuIikpOworCQkJCQlydHN0YXR1cyA9IHJ0bF9wc19lbmFibGVfbmljKGh3KTsKKwkJCQl9IHdoaWxlICgocnRzdGF0dXMgIT0gdHJ1ZSkKKwkJCQkJICYmIChJbml0aWFsaXplQ291bnQgPCAxMCkpOworCQkJCVJUX0NMRUFSX1BTX0xFVkVMKHBwc2MsCisJCQkJCQkgIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCQkgKCJTZXQgRVJGT04gc2xlZXBlZDolZCBtc1xuIiwKKwkJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQorCQkJCQkJCSAgIHBwc2MtPgorCQkJCQkJCSAgIGxhc3Rfc2xlZXBfamlmZmllcykpKTsKKwkJCQlwcHNjLT5sYXN0X2F3YWtlX2ppZmZpZXMgPSBqaWZmaWVzOworCQkJCXJ0bDg4MjFhZV9waHlfc2V0X3JmX29uKGh3KTsKKwkJCX0KKwkJCWlmIChtYWMtPmxpbmtfc3RhdGUgPT0gTUFDODAyMTFfTElOS0VEKSB7CisJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LAorCQkJCQkJCSAgICAgICBMRURfQ1RMX0xJTkspOworCQkJfSBlbHNlIHsKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsCisJCQkJCQkJICAgICAgIExFRF9DVExfTk9fTElOSyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgRVJGT0ZGOnsKKwkJCWZvciAocXVldWVfaWQgPSAwLCBpID0gMDsKKwkJCSAgICAgcXVldWVfaWQgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDspIHsKKwkJCQlyaW5nID0gJnBjaXByaXYtPmRldi50eF9yaW5nW3F1ZXVlX2lkXTsKKwkJCQlpZiAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID09IDApIHsKKwkJCQkJcXVldWVfaWQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJCQkJICgiZVJmIE9mZi9TbGVlcDogJWQgdGltZXMgIgorCQkJCQkJICAiVGNiQnVzeVF1ZXVlWyVkXSA9JWQgYmVmb3JlICIKKwkJCQkJCSAgImRvemUhXG4iLCAoaSArIDEpLCBxdWV1ZV9pZCwKKwkJCQkJCSAgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSk7CisKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCQlpZiAoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4KSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJCSAoIlxuIEVSRlNMRUVQOiAlZCB0aW1lcyAiCisJCQkJCQkgICJUY2JCdXN5UXVldWVbJWRdID0gJWQgIVxuIiwKKwkJCQkJCSAgTUFYX0RPWkVfV0FJVElOR19USU1FU185eCwKKwkJCQkJCSAgcXVldWVfaWQsCisJCQkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCQkgKCJJUFMgU2V0IGVSZiBuaWMgZGlzYWJsZVxuIikpOworCQkJCXJ0bF9wc19kaXNhYmxlX25pYyhodyk7CisJCQkJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBwc2MtPnJmb2ZmX3JlYXNvbiA9PSBSRl9DSEFOR0VfQllfSVBTKSB7CisJCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywKKwkJCQkJCQkJICAgICAgIExFRF9DVExfTk9fTElOSyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LAorCQkJCQkJCQkgICAgICAgTEVEX0NUTF9QT1dFUl9PRkYpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJLypjYXNlIEVSRlNMRUVQOnsKKwkJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpCisJCQkJYnJlYWs7CisJCQlmb3IgKHF1ZXVlX2lkID0gMCwgaSA9IDA7CisJCQkgICAgIHF1ZXVlX2lkIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7KSB7CisJCQkJcmluZyA9ICZwY2lwcml2LT5kZXYudHhfcmluZ1txdWV1ZV9pZF07CisJCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA9PSAwKSB7CisJCQkJCXF1ZXVlX2lkKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJCSAoImVSZiBPZmYvU2xlZXA6ICVkIHRpbWVzICIKKwkJCQkJCSAgIlRjYkJ1c3lRdWV1ZVslZF0gPSVkIGJlZm9yZSAiCisJCQkJCQkgICJkb3plIVxuIiwgKGkgKyAxKSwgcXVldWVfaWQsCisJCQkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOworCisJCQkJCXVkZWxheSgxMCk7CisJCQkJCWkrKzsKKwkJCQl9CisJCQkJaWYgKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU185eCkgeworCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkJCQkgKCJcbiBFUkZTTEVFUDogJWQgdGltZXMgIgorCQkJCQkJICAiVGNiQnVzeVF1ZXVlWyVkXSA9ICVkICFcbiIsCisJCQkJCQkgIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgsCisJCQkJCQkgIHF1ZXVlX2lkLAorCQkJCQkJICBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCSAoIlNldCBFUkZTTEVFUCBhd2FrZWQ6JWQgbXNcbiIsCisJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQorCQkJCQkJICAgcHBzYy0+bGFzdF9hd2FrZV9qaWZmaWVzKSkpOworCQkJcHBzYy0+bGFzdF9zbGVlcF9qaWZmaWVzID0gamlmZmllczsKKwkJCV9ydGw4ODIxYWVfcGh5X3NldF9yZl9zbGVlcChodyk7CisJCQlicmVhazsKKwkJfSovCisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzIFxuIikpOworCQlicmVzdWx0ID0gZmFsc2U7CisJCWJyZWFrOworCX0KKwlpZiAoYnJlc3VsdCkKKwkJcHBzYy0+cmZwd3Jfc3RhdGUgPSByZnB3cl9zdGF0ZTsKKwlyZXR1cm4gYnJlc3VsdDsKK30KKworYm9vbCBydGw4ODIxYWVfcGh5X3NldF9yZl9wb3dlcl9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIHJmX3B3cnN0YXRlIHJmcHdyX3N0YXRlKQoreworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJYm9vbCBicmVzdWx0ID0gZmFsc2U7CisKKwlpZiAocmZwd3Jfc3RhdGUgPT0gcHBzYy0+cmZwd3Jfc3RhdGUpCisJCXJldHVybiBicmVzdWx0OworCWJyZXN1bHQgPSBfcnRsODgyMWFlX3BoeV9zZXRfcmZfcG93ZXJfc3RhdGUoaHcsIHJmcHdyX3N0YXRlKTsKKwlyZXR1cm4gYnJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzMmQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9QSFlfSF9fCisjZGVmaW5lIF9fUlRMODgyMUFFX1BIWV9IX18KKworLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VjcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KKyNkZWZpbmUgTUFYX1RYX0NPVU5UCTQKKyNkZWZpbmUJVFhfMVMJCQkwCisjZGVmaW5lCVRYXzJTCQkJMQorI2RlZmluZQlUWF8zUwkJCTIKKyNkZWZpbmUJVFhfNFMJCQkzCisKKyNkZWZpbmUJTUFYX1BPV0VSX0lOREVYCTB4M0YKKworI2RlZmluZSBNQVhfUFJFQ01EX0NOVCAJCQkJMTYKKyNkZWZpbmUgTUFYX1JGREVQRU5EQ01EX0NOVCAJCTE2CisjZGVmaW5lIE1BWF9QT1NUQ01EX0NOVCAJCQkxNgorCisjZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXggCTY0CisKKyNkZWZpbmUgUlRfQ0FOTk9UX0lPKGh3KQkJCWZhbHNlCisjZGVmaW5lIEhJR0hQT1dFUl9SQURJT0FfQVJSQVlMRU4gCTIyCisKKyNkZWZpbmUgSVFLX0FEREFfUkVHX05VTQkJCTE2CisjZGVmaW5lIElRS19CQl9SRUdfTlVNCQkJCTkKKyNkZWZpbmUgTUFYX1RPTEVSQU5DRQkJCQk1CisjZGVmaW5lCUlRS19ERUxBWV9USU1FCQkJCTEwCisjZGVmaW5lCWluZGV4X21hcHBpbmdfTlVNCTE1CisKKyNkZWZpbmUJQVBLX0JCX1JFR19OVU0JCQkJNQorI2RlZmluZQlBUEtfQUZFX1JFR19OVU0JCQkJMTYKKyNkZWZpbmUJQVBLX0NVUlZFX1JFR19OVU0gCQkJNAorI2RlZmluZQlQQVRIX05VTQkJCQkJMgorCisjZGVmaW5lIExPT1BfTElNSVQJCQkJCTUKKyNkZWZpbmUgTUFYX1NUQUxMX1RJTUUJCQkJNTAKKyNkZWZpbmUgQW50ZW5uYURpdmVyc2l0eVZhbHVlCQkweDgwCisjZGVmaW5lIE1BWF9UWFBXUl9JRFhfTk1PREVfOTJTCQk2MworI2RlZmluZSBSZXNldF9DbnRfTGltaXQJCQkJMworCisjZGVmaW5lIElRS19BRERBX1JFR19OVU0JCQkxNgorI2RlZmluZSBJUUtfTUFDX1JFR19OVU0JCQkJNAorCisjZGVmaW5lIFJGNjA1Ml9NQVhfUEFUSAkJCQkyCisKKyNkZWZpbmUgQ1RfT0ZGU0VUX01BQ19BRERSIAkJCTBYMTYKKworI2RlZmluZSBDVF9PRkZTRVRfQ0NLX1RYX1BXUl9JRFgJCQkweDVBCisjZGVmaW5lIENUX09GRlNFVF9IVDQwMVNfVFhfUFdSX0lEWAkJCTB4NjAKKyNkZWZpbmUgQ1RfT0ZGU0VUX0hUNDAyU19UWF9QV1JfSURYX0RJRkYJMHg2NgorI2RlZmluZSBDVF9PRkZTRVRfSFQyMF9UWF9QV1JfSURYX0RJRkYJCTB4NjkKKyNkZWZpbmUgQ1RfT0ZGU0VUX09GRE1fVFhfUFdSX0lEWF9ESUZGCQkweDZDCisKKyNkZWZpbmUgQ1RfT0ZGU0VUX0hUNDBfTUFYX1BXUl9PRkZTRVQJCTB4NkYKKyNkZWZpbmUgQ1RfT0ZGU0VUX0hUMjBfTUFYX1BXUl9PRkZTRVQJCTB4NzIKKworI2RlZmluZSBDVF9PRkZTRVRfQ0hBTk5FTF9QTEFICQkJCTB4NzUKKyNkZWZpbmUgQ1RfT0ZGU0VUX1RIRVJNQUxfTUVURVIJCQkJMHg3OAorI2RlZmluZSBDVF9PRkZTRVRfUkZfT1BUSU9OCQkJCQkweDc5CisjZGVmaW5lIENUX09GRlNFVF9WRVJTSU9OCQkJCQkweDdFCisjZGVmaW5lIENUX09GRlNFVF9DVVNUT01FUl9JRAkJCQkweDdGCisKKyNkZWZpbmUgUlRMODgyMUFFX01BWF9QQVRIX05VTQkJCQkJMgorCisjZGVmaW5lIFRBUkdFVF9DSE5MX05VTV8yR181R184ODEyCTU5CisKK2VudW0gc3djaG5sY21kX2lkIHsKKwlDTURJRF9FTkQsCisJQ01ESURfU0VUX1RYUE9XRVJPV0VSX0xFVkVMLAorCUNNRElEX0JCUkVHV1JJVEUxMCwKKwlDTURJRF9XUklURVBPUlRfVUxPTkcsCisJQ01ESURfV1JJVEVQT1JUX1VTSE9SVCwKKwlDTURJRF9XUklURVBPUlRfVUNIQVIsCisJQ01ESURfUkZfV1JJVEVSRUcsCit9OworCitzdHJ1Y3Qgc3djaG5sY21kIHsKKwllbnVtIHN3Y2hubGNtZF9pZCBjbWRpZDsKKwl1MzIgcGFyYTE7CisJdTMyIHBhcmEyOworCXUzMiBtc2RlbGF5OworfTsKKworZW51bSBodzkwX2Jsb2NrX2UgeworCUhXOTBfQkxPQ0tfTUFDID0gMCwKKwlIVzkwX0JMT0NLX1BIWTAgPSAxLAorCUhXOTBfQkxPQ0tfUEhZMSA9IDIsCisJSFc5MF9CTE9DS19SRiA9IDMsCisJSFc5MF9CTE9DS19NQVhJTVVNID0gNCwKK307CisKK2VudW0gYmFzZWJhbmRfY29uZmlnX3R5cGUgeworCUJBU0VCQU5EX0NPTkZJR19QSFlfUkVHID0gMCwKKwlCQVNFQkFORF9DT05GSUdfQUdDX1RBQiA9IDEsCit9OworCitlbnVtIHJhX29mZnNldF9hcmVhIHsKKwlSQV9PRkZTRVRfTEVHQUNZX09GRE0xLAorCVJBX09GRlNFVF9MRUdBQ1lfT0ZETTIsCisJUkFfT0ZGU0VUX0hUX09GRE0xLAorCVJBX09GRlNFVF9IVF9PRkRNMiwKKwlSQV9PRkZTRVRfSFRfT0ZETTMsCisJUkFfT0ZGU0VUX0hUX09GRE00LAorCVJBX09GRlNFVF9IVF9DQ0ssCit9OworCitlbnVtIGFudGVubmFfcGF0aCB7CisJQU5URU5OQV9OT05FLAorCUFOVEVOTkFfRCwKKwlBTlRFTk5BX0MsCisJQU5URU5OQV9DRCwKKwlBTlRFTk5BX0IsCisJQU5URU5OQV9CRCwKKwlBTlRFTk5BX0JDLAorCUFOVEVOTkFfQkNELAorCUFOVEVOTkFfQSwKKwlBTlRFTk5BX0FELAorCUFOVEVOTkFfQUMsCisJQU5URU5OQV9BQ0QsCisJQU5URU5OQV9BQiwKKwlBTlRFTk5BX0FCRCwKKwlBTlRFTk5BX0FCQywKKwlBTlRFTk5BX0FCQ0QKK307CisKK3N0cnVjdCByX2FudGVubmFfc2VsZWN0X29mZG0geworCXUzMiByX3R4X2FudGVubmE6NDsKKwl1MzIgcl9hbnRfbDo0OworCXUzMiByX2FudF9ub25faHQ6NDsKKwl1MzIgcl9hbnRfaHQxOjQ7CisJdTMyIHJfYW50X2h0Mjo0OworCXUzMiByX2FudF9odF9zMTo0OworCXUzMiByX2FudF9ub25faHRfczE6NDsKKwl1MzIgb2ZkbV90eHNjOjI7CisJdTMyIHJlc2VydmVkOjI7Cit9OworCitzdHJ1Y3Qgcl9hbnRlbm5hX3NlbGVjdF9jY2sgeworCXU4IHJfY2NrcnhfZW5hYmxlXzI6MjsKKwl1OCByX2Nja3J4X2VuYWJsZToyOworCXU4IHJfY2NrdHhfZW5hYmxlOjQ7Cit9OworCisKK3N0cnVjdCBlZnVzZV9jb250ZW50cyB7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IGNja190eF9wb3dlcl9pZHhbNl07CisJdTggaHQ0MF8xc190eF9wb3dlcl9pZHhbNl07CisJdTggaHQ0MF8yc190eF9wb3dlcl9pZHhfZGlmZlszXTsKKwl1OCBodDIwX3R4X3Bvd2VyX2lkeF9kaWZmWzNdOworCXU4IG9mZG1fdHhfcG93ZXJfaWR4X2RpZmZbM107CisJdTggaHQ0MF9tYXhfcG93ZXJfb2Zmc2V0WzNdOworCXU4IGh0MjBfbWF4X3Bvd2VyX29mZnNldFszXTsKKwl1OCBjaGFubmVsX3BsYW47CisJdTggdGhlcm1hbF9tZXRlcjsKKwl1OCByZl9vcHRpb25bNV07CisJdTggdmVyc2lvbjsKKwl1OCBvZW1faWQ7CisJdTggcmVndWxhdG9yeTsKK307CisKK3N0cnVjdCB0eF9wb3dlcl9zdHJ1Y3QgeworCXU4IGNja1tSVEw4ODIxQUVfTUFYX1BBVEhfTlVNXVtDSEFOTkVMX01BWF9OVU1CRVJdOworCXU4IGh0NDBfMXNbUlRMODgyMUFFX01BWF9QQVRIX05VTV1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKKwl1OCBodDQwXzJzW1JUTDg4MjFBRV9NQVhfUEFUSF9OVU1dW0NIQU5ORUxfTUFYX05VTUJFUl07CisJdTggaHQyMF9kaWZmW1JUTDg4MjFBRV9NQVhfUEFUSF9OVU1dW0NIQU5ORUxfTUFYX05VTUJFUl07CisJdTggbGVnYWN5X2h0X2RpZmZbUlRMODgyMUFFX01BWF9QQVRIX05VTV1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKKwl1OCBsZWdhY3lfaHRfdHhwb3dlcmRpZmY7CisJdTggZ3JvdXBodDIwW1JUTDg4MjFBRV9NQVhfUEFUSF9OVU1dW0NIQU5ORUxfTUFYX05VTUJFUl07CisJdTggZ3JvdXBodDQwW1JUTDg4MjFBRV9NQVhfUEFUSF9OVU1dW0NIQU5ORUxfTUFYX05VTUJFUl07CisJdTggcHdyZ3JvdXBfY250OworCXUzMiBtY3Nfb3JpZ2luYWxfb2Zmc2V0WzRdWzE2XTsKK307CitlbnVtIF9BTlRfRElWX1RZUEUKK3sKKwlOT19BTlRESVYJCQkJPSAweEZGLAorCUNHX1RSWF9IV19BTlRESVYJCT0gMHgwMSwKKwlDR0NTX1JYX0hXX0FOVERJViAJCT0gMHgwMiwKKwlGSVhFRF9IV19BTlRESVYgICAgICAgICA9IDB4MDMsCisJQ0dfVFJYX1NNQVJUX0FOVERJVgkJPSAweDA0LAorCUNHQ1NfUlhfU1dfQU5URElWCQk9IDB4MDUsCisKK307CisKK2V4dGVybiB1MzIgcnRsODgyMWFlX3BoeV9xdWVyeV9iYl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X2JiX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpOworZXh0ZXJuIHUzMiBydGw4ODIxYWVfcGh5X3F1ZXJ5X3JmX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgcmVnYWRkciwKKwkJCQkgICB1MzIgYml0bWFzayk7CitleHRlcm4gdm9pZCBydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgcmVnYWRkciwKKwkJCQkgIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7CitleHRlcm4gYm9vbCBydGw4ODIxYWVfcGh5X21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsODgyMWFlX3BoeV9iYl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsODgyMWFlX3BoeV9yZl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9zd2l0Y2hfd2lyZWxlc3NiYW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBiYW5kKTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfZ2V0X2h3X3JlZ19vcmlnaW5hbHZhbHVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfZ2V0X3R4cG93ZXJfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSBsb25nICpwb3dlcmxldmVsKTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3R4cG93ZXJfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNoYW5uZWwpOworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9zY2FuX29wZXJhdGlvbl9iYWNrdXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgdTggb3BlcmF0aW9uKTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X2J3X21vZGVfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9zZXRfYndfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoX3R5cGUpOworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9zd19jaG5sX2NhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2V4dGVybiB1OCBydGw4ODIxYWVfcGh5X3N3X2Nobmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9pcV9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9yZWNvdmVyeSk7CitleHRlcm4gdm9pZCBydGw4ODEyYWVfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBiX3JlY292ZXJ5KTsKK3ZvaWQgcnRsODgyMWFlX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgZGVsdGEpOwordm9pZCBydGw4ODIxYWVfcGh5X2xjX2NhbGlicmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDg4MjFhZV9waHlfc2V0X3JmcGF0aF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYm1haW4pOworYm9vbCBydGw4ODEyYWVfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgZW51bSByYWRpb19wYXRoIHJmcGF0aCk7Citib29sIHJ0bDg4MjFhZV9waHlfY29uZmlnX3JmX3dpdGhfaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoKTsKK2Jvb2wgcnRsODgyMWFlX3BoeV9zZXRfaW9fY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIGlvX3R5cGUgaW90eXBlKTsKK2V4dGVybiBib29sIHJ0bDg4MjFhZV9waHlfc2V0X3JmX3Bvd2VyX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIGVudW0gcmZfcHdyc3RhdGUgcmZwd3Jfc3RhdGUpOwordTggX3J0bDg4MTJhZV9nZXRfcmlnaHRfY2hubF9wbGFjZV9mb3JfaXFrKHU4IGNobmwpOwordm9pZCBydGw4ODIxYWVfcGh5X3NldF90eHBvd2VyX2xldmVsX2J5X3BhdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNoYW5uZWwsIHU4IHBhdGgpOwordm9pZCBydGw4ODEyYWVfZG9faXFrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LHU4IGRlbHRhX3RoZXJtYWxfaW5kZXgsCisJdTggdGhlcm1hbF92YWx1ZSwgdTggdGhyZXNob2xkKTsKK3ZvaWQgcnRsODgyMWFlX2RvX2lxayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyx1OCBkZWx0YV90aGVybWFsX2luZGV4LAorCXU4IHRoZXJtYWxfdmFsdWUsIHU4IHRocmVzaG9sZCk7Cit2b2lkIHJ0bDg4MjFhZV9yZXNldF9pcWtfcmVzdWx0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNGEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5jCkBAIC0wLDAgKzEsMTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInB3cnNlcWNtZC5oIgorI2luY2x1ZGUgInB3cnNlcS5oIgorCisvKgorICAgIGRyaXZlcnMgc2hvdWxkIHBhcnNlIGJlbG93IGFycmF5cyBhbmQgZG8gdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9ucworKi8KKy8vMyBQb3dlciBvbiAgQXJyYXkKK3N0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgxMl9wb3dlcl9vbl9mbG93W1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdPQoreworCVJUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19BQ1QKKwlSVEw4ODEyX1RSQU5TX0VORAorfTsKKworLy8zUmFkaW8gb2ZmIEdQSU8gQXJyYXkKK3N0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgxMl9yYWRpb19vZmZfZmxvd1tSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg4MTJfVFJBTlNfRU5EX1NURVBTXT0KK3sKKwlSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VCisJUlRMODgxMl9UUkFOU19FTkQKK307CisKKy8vM0NhcmQgRGlzYWJsZSBBcnJheQorc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODEyX2NhcmRfZGlzYWJsZV9mbG93WyBSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTCisJKyBSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCisJKyBSVEw4ODEyX1RSQU5TX0VORF9TVEVQUyBdID0KK3sKKwlSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VCisJUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMKKwlSVEw4ODEyX1RSQU5TX0VORAorfTsKKworLy8zIENhcmQgRW5hYmxlIEFycmF5CitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MTJfY2FyZF9lbmFibGVfZmxvd1sgUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCSsgUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUworCSsgUlRMODgxMl9UUkFOU19FTkRfU1RFUFMgXSA9Cit7CisJUlRMODgxMl9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUKKwlSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fQUNUCisJUlRMODgxMl9UUkFOU19FTkQKK307CisKKy8vM1N1c3BlbmQgQXJyYXkKK3N0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgxMl9zdXNwZW5kX2Zsb3dbUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg4MTJfVFJBTlNfRU5EX1NURVBTXT0KK3sKKwlSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VCisJUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX1NVUworCVJUTDg4MTJfVFJBTlNfRU5ECit9OworCisvLzMgUmVzdW1lIEFycmF5CitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MTJfcmVzdW1lX2Zsb3dbUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg4MTJfVFJBTlNfRU5EX1NURVBTXT0KK3sKKwlSVEw4ODEyX1RSQU5TX1NVU19UT19DQVJERU1VCisJUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX0FDVAorCVJUTDg4MTJfVFJBTlNfRU5ECit9OworCisKKworLy8zSFdQRE4gQXJyYXkKK3N0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgxMl9od3Bkbl9mbG93W1JUTDg4MTJfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUytSVEw4ODEyX1RSQU5TX0VORF9TVEVQU109Cit7CisJUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVQorCVJUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19QRE4KKwlSVEw4ODEyX1RSQU5TX0VORAorfTsKKworLy8zIEVudGVyIExQUworc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODEyX2VudGVyX2xwc19mbG93W1JUTDg4MTJfVFJBTlNfQUNUX1RPX0xQU19TVEVQUytSVEw4ODEyX1RSQU5TX0VORF9TVEVQU109Cit7CisJLy9GVyBiZWhhdmlvcgorCVJUTDg4MTJfVFJBTlNfQUNUX1RPX0xQUworCVJUTDg4MTJfVFJBTlNfRU5ECit9OworCisvLzMgTGVhdmUgTFBTCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MTJfbGVhdmVfbHBzX2Zsb3dbUlRMODgxMl9UUkFOU19MUFNfVE9fQUNUX1NURVBTK1JUTDg4MTJfVFJBTlNfRU5EX1NURVBTXT0KK3sKKwkvL0ZXIGJlaGF2aW9yCisJUlRMODgxMl9UUkFOU19MUFNfVE9fQUNUCisJUlRMODgxMl9UUkFOU19FTkQKK307CisKKworLyoKKyAgICBkcml2ZXJzIHNob3VsZCBwYXJzZSBiZWxvdyBhcnJheXMgYW5kIGRvIHRoZSBjb3JyZXNwb25kaW5nIGFjdGlvbnMKKyovCisvKjMgUG93ZXIgb24gIEFycmF5Ki8KK3N0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgyMUFfcG93ZXJfb25fZmxvd1tSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX0FDVF9TVEVQUworCQkJCQkrIFJUTDg4MjFBX1RSQU5TX0VORF9TVEVQU10gPQoreworCVJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fQUNUCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCisvKjNSYWRpbyBvZmYgR1BJTyBBcnJheSAqLworc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODIxQV9yYWRpb19vZmZfZmxvd1tSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCQkJCQkrIFJUTDg4MjFBX1RSQU5TX0VORF9TVEVQU10gPQoreworCVJUTDg4MjFBX1RSQU5TX0FDVF9UT19DQVJERU1VCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCisvKjNDYXJkIERpc2FibGUgQXJyYXkqLworc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODIxQV9jYXJkX2Rpc2FibGVfZmxvd1tSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCQkJCQkrIFJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCisJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXSA9Cit7CisJUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVUKKwlSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMKKwlSVEw4ODIxQV9UUkFOU19FTkQKK307CisKKy8qMyBDYXJkIEVuYWJsZSBBcnJheSovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2NhcmRfZW5hYmxlX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkJKyBSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX0FDVF9TVEVQUyAvKlJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTKi8KKwkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdID0KK3sKKwlSVEw4ODIxQV9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUKKwlSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX0FDVAorCVJUTDg4MjFBX1RSQU5TX0VORAorfTsKKworLyozU3VzcGVuZCBBcnJheSovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX3N1c3BlbmRfZmxvd1tSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCQkJCQkrIFJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTCisJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXSA9Cit7CisJUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVUKKwlSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX1NVUworCVJUTDg4MjFBX1RSQU5TX0VORAorfTsKKworLyozIFJlc3VtZSBBcnJheSovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX3Jlc3VtZV9mbG93W1JUTDg4MjFBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTCisJCQkJCSsgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMKKwkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdID0KK3sKKwlSVEw4ODIxQV9UUkFOU19TVVNfVE9fQ0FSREVNVQorCVJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fQUNUCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCisvKjNIV1BETiBBcnJheSovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2h3cGRuX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkrIFJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCisJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdID0KK3sKKwlSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQorCVJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCisvKjMgRW50ZXIgTFBTICovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2VudGVyX2xwc19mbG93W1JUTDg4MjFBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMKKwkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdID0KK3sKKwkvKkZXIGJlaGF2aW9yKi8KKwlSVEw4ODIxQV9UUkFOU19BQ1RfVE9fTFBTCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCisvKjMgTGVhdmUgTFBTICovCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2xlYXZlX2xwc19mbG93W1JUTDg4MjFBX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMKKwkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdID0KK3sKKwkvKkZXIGJlaGF2aW9yKi8KKwlSVEw4ODIxQV9UUkFOU19MUFNfVE9fQUNUCisJUlRMODgyMUFfVFJBTlNfRU5ECit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzljMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaApAQCAtMCwwICsxLDQxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVEw4ODIxQUVfUFdSU0VRX0hfXworI2RlZmluZSBfX1JUTDg4MjFBRV9QV1JTRVFfSF9fCisKKyNpbmNsdWRlICJwd3JzZXFjbWQuaCIKKyNpbmNsdWRlICIuLi9idGNvZXhpc3QvaGFsYnRfcHJlY29tcC5oIgorCisjZGVmaW5lCVJUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUwkxNQorI2RlZmluZQlSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTCTE1CisjZGVmaW5lCVJUTDg4MTJfVFJBTlNfU1VTX1RPX0NBUkRFTVVfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUwkyNQorI2RlZmluZQlSVEw4ODEyX1RSQU5TX1BETl9UT19DQVJERU1VX1NURVBTCTE1CisjZGVmaW5lCVJUTDg4MTJfVFJBTlNfQUNUX1RPX0xQU19TVEVQUwkxNQorI2RlZmluZQlSVEw4ODEyX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgxMl9UUkFOU19FTkRfU1RFUFMJMQorCisKKyNkZWZpbmUgUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX0FDVCAJCQkJCQkJCQkJCQkJCVwKKwkvKiBmb3JtYXQgKi8JCQkJCQkJCQkJCQkJCQkJXAorCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLwkJCQkJCQkJXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMiwgMH0sLyogZGlzYWJsZSBTVyBMUFMgMHgwNFsxMF09MCovCVwKKwl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfUE9MTElORywgQklUMSwgQklUMX0sLyogd2FpdCB0aWxsIDB4MDRbMTddID0gMSAgICBwb3dlciByZWFkeSovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDcsIDB9LC8qIGRpc2FibGUgSFdQRE4gMHgwNFsxNV09MCovIFwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDMsIDB9LC8qIGRpc2FibGUgV0wgc3VzcGVuZCovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIEJJVDB9LC8qIHBvbGxpbmcgdW50aWwgcmV0dXJuIDAqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1BPTExJTkcsIEJJVDAsIDB9LC8qKi8KKworI2RlZmluZSBSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VCQkJCQkJCQkJCQkJCVwKKwkvKiBmb3JtYXQgKi8JCQkJCQkJCQkJCQkJCQkJXAorCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLwkJCQkJCQkJXAorCXsweDBjMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwNH0sIC8qIDB4YzAwWzc6MF0gPSA0CXR1cm4gb2ZmIDMtd2lyZSAqLwlcCisJezB4MGUwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDA0fSwgLyogMHhlMDBbNzowXSA9IDQJdHVybiBvZmYgMy13aXJlICovCVwKKwl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIDB9LCAvKiAweDJbMF0gPSAwCSBSRVNFVCBCQiwgQ0xPU0UgUkYgKi8JXAorCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9ERUxBWSwgMCwgUFdSU0VRX0RFTEFZX1VTfSwvKkRlbGF5IDF1cyovCVwKKwl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIDB9LCAgLyogV2hvbGUgQkIgaXMgcmVzZXQqLwkJCVwKKwkvKnsweDAwMUYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMH0sLy8weDFGWzc6MF0gPSAwIHR1cm4gb2ZmIFJGKi8JXAorCS8qezB4MDA0RSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ3LCAwfSwvLzB4NENbMjNdID0gMHg0RVs3XSA9IDAsIHN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIHJlZ2lzdGVyIDB4NjVbMl0gKi8JXAorCXsweDAwMDcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgyQX0sIC8qIDB4MDdbNzowXSA9IDB4Mjggc3BzIHB3bSBtb2RlIDB4MmEgZm9yIEJUIGNvZXgqLwlcCisJezB4MDAwOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAyLCAwfSwvKjB4OFsxXSA9IDAgQU5BIGNsayA9NTAwayAqLwlcCisJLyp7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDB8QklUMSwgMH0sIC8vICAweDAyWzE6MF0gPSAwCXJlc2V0IEJCICovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIEJJVDF9LCAvKjB4MDRbOV0gPSAxIHR1cm4gb2ZmIE1BQyBieSBIVyBzdGF0ZSBtYWNoaW5lKi8JXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCBCSVQxLCAwfSwgLyp3YWl0IHRpbGwgMHgwNFs5XSA9IDAgcG9sbGluZyB1bnRpbCByZXR1cm4gMCB0byBkaXNhYmxlKi8KKworI2RlZmluZSBSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fU1VTCQkJCQkJCQkJCQkJCVwKKwkvKiBmb3JtYXQgKi8JCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDQyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RjAsIDB4Y2N9LFwKKwl7MHgwMDQyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RjAsIDB4RUN9LFwKKwl7MHgwMDQzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDd9LC8qIGdwaW8xMSBpbnB1dCBtb2RlLCBncGlvMTB+OCBvdXRwdXQgbW9kZSAqLwlcCisJezB4MDA0NSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvIDB+NyBvdXRwdXQgc2FtZSB2YWx1ZSBhcyBpbnB1dCA/PyAqLwlcCisJezB4MDA0NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweGZmfSwvKiBncGlvMH43IG91dHB1dCBtb2RlICovCVwKKwl7MHgwMDQ3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qIDB4NDdbNzowXSA9IDAwIGdwaW8gbW9kZSAqLwlcCisJezB4MDAwNywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKiBzdXNwZW5kIG9wdGlvbiBhbGwgb2ZmICovCVwKKwl7MHgwMDE0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4ODAsIEJJVDd9LC8qMHgxNFs3XSA9IDEgdHVybiBvbiBaQ0QgKi8JXAorCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgQklUMH0sLyogMHgxNVswXSA9MSB0cnVuIG9uIFpDRCAqLwlcCisJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCBCSVQ0fSwvKjB4MjNbNF0gPSAxIGhwb24gTERPIHNsZWVwIG1vZGUgKi8JXAorCXsweDAwMDgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMiwgMH0sLyoweDhbMV0gPSAwIEFOQSBjbGsgPTUwMGsgKi8JXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMywgQklUM30sIC8qMHgwNFsxMV0gPSAyYicxMSBlbmFibGUgV0wgc3VzcGVuZCBmb3IgUENJZSovCisKKyNkZWZpbmUgUlRMODgxMl9UUkFOU19TVVNfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzLCAwfSwgLyoweDA0WzExXSA9IDJiJzAxZW5hYmxlIFdMIHN1c3BlbmQqLyAgIFwKKwl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MTAsIDB9LC8qMHgyM1s0XSA9IDAgaHBvbiBMRE8gc2xlZXAgbW9kZSBsZWF2ZSAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHRydW4gb2ZmIFpDRCAqLwlcCisJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCAwfSwvKjB4MTRbN10gPSAwIHR1cm4gb2ZmIFpDRCAqLwlcCisJezB4MDA0NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvMH43IGlucHV0IG1vZGUgKi8JXAorCXsweDAwNDMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzExIGlucHV0IG1vZGUsIGdwaW8xMH44IGlucHV0IG1vZGUgKi8KKworI2RlZmluZSBSVEw4ODEyX1RSQU5TX0NBUkRFTVVfVE9fQ0FSRERJUwkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwkvKip7MHgwMTk0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIDB9LCAvLzB4MTk0WzBdPTAgLCBkaXNhYmxlIDMySyBjbG9jayovCVwKKwkvKip7MHgwMDkzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4OTR9LCAvLzB4OTM9MHg5NCAsIDkwWzMwXSA9MCBlbmFibGUgNTAwayBBTkEgY2xvY2sgLnN3aXRjaCBjbG9jayBmcm9tIDEyTSB0byA1MDBLICwgOTAgWzI2XSA9MCBkaXNhYmxlIEVFcHJvbSBsb2FkZXIgY2xvY2sqLwlcCisJezB4MDAwMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQyLCAwfSwgLyoweDAzWzJdID0gMCwgcmVzZXQgODA1MSovCVwKKwl7MHgwMDgwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDV9LCAvKjB4ODA9MDVoIGlmIHJlbG9hZCBmdywgZmlsbCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBob3N0X0NQVSBoYW5kc2hha2UgZmllbGQqLwlcCisJezB4MDA0MiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEYwLCAweGNjfSxcCisJezB4MDA0MiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEYwLCAweEVDfSxcCisJezB4MDA0MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDA3fSwvKiBncGlvMTEgaW5wdXQgbW9kZSwgZ3BpbzEwfjggb3V0cHV0IG1vZGUgKi8JXAorCXsweDAwNDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbyAwfjcgb3V0cHV0IHNhbWUgdmFsdWUgYXMgaW5wdXQgPz8gKi8JXAorCXsweDAwNDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHhmZn0sLyogZ3BpbzB+NyBvdXRwdXQgbW9kZSAqLwlcCisJezB4MDA0NywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKiAweDQ3Wzc6MF0gPSAwMCBncGlvIG1vZGUgKi8JXAorCXsweDAwMTQsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHg4MCwgQklUN30sLyoweDE0WzddID0gMSB0dXJuIG9uIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCBCSVQwfSwvKiAweDE1WzBdID0xIHRydW4gb24gWkNEICovCVwKKwl7MHgwMDEyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qMHgxMlswXSA9IDAgZm9yY2UgUEZNIG1vZGUgKi8JXAorCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgxMCwgQklUNH0sLyoweDIzWzRdID0gMSBocG9uIExETyBzbGVlcCBtb2RlICovCVwKKwl7MHgwMDA4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDIsIDB9LC8qMHg4WzFdID0gMCBBTkEgY2xrID01MDBrICovCVwKKwl7MHgwMDA3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MjB9LCAvKjB4MDc9MHgyMCAsIFNPUCBvcHRpb24gdG8gZGlzYWJsZSBCRy9NQiovCVwKKwl7MHgwMDFmLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIDB9LCAvKjB4MDFmWzFdPTAgLCBkaXNhYmxlIFJGQ18wICBjb250cm9sICBSRUdfUkZfQ1RSTF84ODEyICovCVwKKwl7MHgwMDc2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIDB9LCAvKjB4MDc2WzFdPTAgLCBkaXNhYmxlIFJGQ18xICBjb250cm9sIFJFR19PUFRfQ1RSTF84ODEyICsyICovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDMsIEJJVDN9LCAvKjB4MDRbMTFdID0gMmInMDEgZW5hYmxlIFdMIHN1c3BlbmQqLworCisjZGVmaW5lIFJUTDg4MTJfVFJBTlNfQ0FSRERJU19UT19DQVJERU1VCQkJCQkJCQkJCQkJCVwKKwkvKiBmb3JtYXQgKi8JCQkJCQkJCQkJCQkJCQkJXAorCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLyAgICAgICAgICAgICAgICAgICAgICAgXAorCXsweDAwMTIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgQklUMH0sLyoweDEyWzBdID0gMSBmb3JjZSBQV00gbW9kZSAqLwlcCisJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCAwfSwvKjB4MTRbN10gPSAwIHR1cm4gb2ZmIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHRydW4gb2ZmIFpDRCAqLwlcCisJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCAwfSwvKjB4MjNbNF0gPSAwIGhwb24gTERPIGxlYXZlIHNsZWVwIG1vZGUgKi8JXAorCXsweDAwNDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzB+NyBpbnB1dCBtb2RlICovCVwKKwl7MHgwMDQzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qIGdwaW8xMSBpbnB1dCBtb2RlLCBncGlvMTB+OCBpbnB1dCBtb2RlICovIFwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDIsIDB9LCAvKjB4MDRbMTBdID0gMCwgZW5hYmxlIFNXIExQUyBQQ0lFIG9ubHkqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzLCAwfSwgLyoweDA0WzExXSA9IDJiJzAxZW5hYmxlIFdMIHN1c3BlbmQqLwlcCisJezB4MDAwMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQyLCBCSVQyfSwgLyoweDAzWzJdID0gMSwgZW5hYmxlIDgwNTEqLwlcCisJezB4MDMwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKlBDSWUgRE1BIHN0YXJ0Ki8KKworCisjZGVmaW5lIFJUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19QRE4JCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNywgQklUN30sLyogMHgwNFsxNV0gPSAxKi8KKworI2RlZmluZSBSVEw4ODEyX1RSQU5TX1BETl9UT19DQVJERU1VCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDcsIDB9LC8qIDB4MDRbMTVdID0gMCovCisKKyNkZWZpbmUgUlRMODgxMl9UUkFOU19BQ1RfVE9fTFBTCQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMzAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfUENJX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4RkZ9LC8qUENJZSBETUEgc3RvcCovCVwKKwl7MHgwNTIyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4N0Z9LC8qVHggUGF1c2UqLwkJXAorCXsweDA1RjgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCisJezB4MDVGOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1BPTExJTkcsIDB4RkYsIDB9LC8qU2hvdWxkIGJlIHplcm8gaWYgbm8gcGFja2V0IGlzIHRyYW5zbWl0dGluZyovCVwKKwl7MHgwNUZBLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAorCXsweDA1RkIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCisJezB4MGMwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDA0fSwgLyogMHhjMDBbNzowXSA9IDQJdHVybiBvZmYgMy13aXJlICovCVwKKwl7MHgwZTAwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDR9LCAvKiAweGUwMFs3OjBdID0gNAl0dXJuIG9mZiAzLXdpcmUgKi8JXAorCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgMH0sLypDQ0sgYW5kIE9GRE0gYXJlIGRpc2FibGVkLGFuZCBjbG9jayBhcmUgZ2F0ZWQsYW5kIFJGIGNsb3NlZCovCVwKKwl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfREVMQVksIDAsIFBXUlNFUV9ERUxBWV9VU30sLypEZWxheSAxdXMqLwlcCisJezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQxLCAwfSwgIC8qIFdob2xlIEJCIGlzIHJlc2V0Ki8JCQlcCisJezB4MDEwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAzfSwvKlJlc2V0IE1BQyBUUlgqLwkJCVwKKwl7MHgwMTAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIDB9LC8qY2hlY2sgaWYgcmVtb3ZlZCBsYXRlciovCQlcCisJezB4MDU1MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ1LCBCSVQ1fSwvKlJlc3BvbmQgVHhPSyB0byBzY2hlZHVsZXIqLworCisKKyNkZWZpbmUgUlRMODgxMl9UUkFOU19MUFNfVE9fQUNUCQkJCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCVwKKwl7MHgwMDgwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX1NESU8sUFdSX0NNRF9XUklURSwgMHhGRiwgMHg4NH0sIC8qU0RJTyBSUFdNKi8JXAorCXsweEZFNTgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHg4NH0sIC8qVVNCIFJQV00qLwlcCisJezB4MDM2MSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDg0fSwgLypQQ0llIFJQV00qLwlcCisJezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX0RFTEFZLCAwLCBQV1JTRVFfREVMQVlfTVN9LCAvKkRlbGF5Ki8JXAorCXsweDAwMDgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNCwgMH0sIC8qLgkweDA4WzRdID0gMAkJIHN3aXRjaCBUU0YgdG8gNDBNKi8JXAorCXsweDAxMDksIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCBCSVQ3LCAwfSwgLypQb2xsaW5nIDB4MTA5WzddPTAgIFRTRiBpbiA0ME0qLwkJCVwKKwl7MHgwMDI5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDZ8QklUNywgMH0sIC8qLgkweDI5Wzc6Nl0gPSAyYicwMAkgZW5hYmxlIEJCIGNsb2NrKi8JXAorCXsweDAxMDEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgQklUMX0sIC8qLgkweDEwMVsxXSA9IDEqLwkJCQkJXAorCXsweDAxMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHhGRn0sIC8qLgkweDEwMFs3OjBdID0gMHhGRgkgZW5hYmxlIFdNQUMgVFJYKi8JXAorCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMXxCSVQwLCBCSVQxfEJJVDB9LCAvKi4JMHgwMlsxOjBdID0gMmInMTEJIGVuYWJsZSBCQiBtYWNybyovCVwKKwl7MHgwNTIyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LCAvKi4JMHg1MjIgPSAwKi8KKworI2RlZmluZSBSVEw4ODEyX1RSQU5TX0VORAkJCQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCVwKKwl7MHhGRkZGLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywwLFBXUl9DTURfRU5ELCAwLCAwfSwgLy8KKworCitleHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyAgcnRsODgxMl9wb3dlcl9vbl9mbG93W1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgIHJ0bDg4MTJfcmFkaW9fb2ZmX2Zsb3dbUlRMODgxMl9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4ODEyX1RSQU5TX0VORF9TVEVQU107CitleHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyAgcnRsODgxMl9jYXJkX2Rpc2FibGVfZmxvd1tSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgIHJ0bDg4MTJfY2FyZF9lbmFibGVfZmxvd1tSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgIHJ0bDg4MTJfc3VzcGVuZF9mbG93W1JUTDg4MTJfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODgxMl9UUkFOU19DQVJERU1VX1RPX1NVU19TVEVQUytSVEw4ODEyX1RSQU5TX0VORF9TVEVQU107CitleHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyAgcnRsODgxMl9yZXN1bWVfZmxvd1tSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgIHJ0bDg4MTJfaHdwZG5fZmxvd1tSVEw4ODEyX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg4MTJfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODgxMl9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgIHJ0bDg4MTJfZW50ZXJfbHBzX2Zsb3dbUlRMODgxMl9UUkFOU19BQ1RfVE9fTFBTX1NURVBTK1JUTDg4MTJfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnICBydGw4ODEyX2xlYXZlX2xwc19mbG93W1JUTDg4MTJfVFJBTlNfTFBTX1RPX0FDVF9TVEVQUytSVEw4ODEyX1RSQU5TX0VORF9TVEVQU107CisKKy8qCisJQ2hlY2sgZG9jdW1lbnQgV00tMjAxMzA1MTYtSmFja2llTGF1LVJUTDg4MjFBX1Bvd2VyX0FyY2hpdGVjdHVyZS1SMTAudnNkCisJVGhlcmUgYXJlIDYgSFcgUG93ZXIgU3RhdGVzOgorCTA6IFBPRkYtLVBvd2VyIE9mZgorCTE6IFBETi0tUG93ZXIgRG93bgorCTI6IENBUkRFTVUtLUNhcmQgRW11bGF0aW9uCisJMzogQUNULS1BY3RpdmUgTW9kZQorCTQ6IExQUy0tTG93IFBvd2VyIFN0YXRlCisJNTogU1VTLS1TdXNwZW5kCisKKwlUaGUgdHJhbnNpc2lvbiBmcm9tIGRpZmZlcmVudCBzdGF0ZXMgYXJlIGRlZmluZWQgYmVsb3cKKwlUUkFOU19DQVJERU1VX1RPX0FDVAorCVRSQU5TX0FDVF9UT19DQVJERU1VCisJVFJBTlNfQ0FSREVNVV9UT19TVVMKKwlUUkFOU19TVVNfVE9fQ0FSREVNVQorCVRSQU5TX0NBUkRFTVVfVE9fUEROCisJVFJBTlNfQUNUX1RPX0xQUworCVRSQU5TX0xQU19UT19BQ1QKKworCVRSQU5TX0VORAorKi8KKyNkZWZpbmUJUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMJMjUKKyNkZWZpbmUJUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgyMUFfVFJBTlNfU1VTX1RPX0NBUkRFTVVfU1RFUFMJMTUKKyNkZWZpbmUgUlRMODgyMUFfVFJBTlNfQ0FSRERJU19UT19DQVJERU1VX1NURVBTCTE1CisjZGVmaW5lCVJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCTE1CisjZGVmaW5lCVJUTDg4MjFBX1RSQU5TX1BETl9UT19DQVJERU1VX1NURVBTCTE1CisjZGVmaW5lCVJUTDg4MjFBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMJMTUKKyNkZWZpbmUJUlRMODgyMUFfVFJBTlNfTFBTX1RPX0FDVF9TVEVQUwkxNQorI2RlZmluZQlSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFMJMQorCisKKyNkZWZpbmUgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19BQ1QgCQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDIwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TS3xQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIEJJVDB9LCAvKjB4MjBbMF0gPSAxYicxIGVuYWJsZSBMRE9BMTIgTUFDUk8gYmxvY2sgZm9yIGFsbCBpbnRlcmZhY2UqLyAgIFwKKwl7MHgwMDY3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TS3xQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDQsIDB9LCAvKjB4NjdbMF0gPSAwIHRvIGRpc2FibGUgQlRfR1BTX1NFTCBwaW5zKi8JXAorCXsweDAwMDEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLfFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9ERUxBWSwgMSwgUFdSU0VRX0RFTEFZX01TfSwvKkRlbGF5IDFtcyovICAgXAorCXsweDAwMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLfFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNSwgMH0sIC8qMHgwMFs1XSA9IDFiJzAgcmVsZWFzZSBhbmFsb2cgSXBzIHRvIGRpZ2l0YWwgLDE6aXNvbGF0aW9uKi8gICBcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAoQklUNHxCSVQzfEJJVDIpLCAwfSwvKiBkaXNhYmxlIFNXIExQUyAweDA0WzEwXT0wIGFuZCBXTFNVU19FTiAweDA0WzEyOjExXT0wKi8JXAorCXsweDAwNzUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9QQ0lfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCAsIEJJVDB9LC8qIERpc2FibGUgVVNCIHN1c3BlbmQgKi8JXAorCXsweDAwMDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCBCSVQxLCBCSVQxfSwvKiB3YWl0IHRpbGwgMHgwNFsxN10gPSAxICAgIHBvd2VyIHJlYWR5Ki8JXAorCXsweDAwNzUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9QQ0lfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCAsIDB9LC8qIEVuYWJsZSBVU0Igc3VzcGVuZCAqLwlcCisJezB4MDAwNiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCBCSVQwfSwvKiByZWxlYXNlIFdMT04gcmVzZXQgIDB4MDRbMTZdPTEqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ3LCAwfSwvKiBkaXNhYmxlIEhXUEROIDB4MDRbMTVdPTAqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAoQklUNHxCSVQzKSwgMH0sLyogZGlzYWJsZSBXTCBzdXNwZW5kKi8JXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgQklUMH0sLyogcG9sbGluZyB1bnRpbCByZXR1cm4gMCovCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfUE9MTElORywgQklUMCwgMH0sLyoqLwlcCisJezB4MDA0RiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCBCSVQwfSwvKjB4NENbMjRdID0gMHg0RlswXSA9IDEsIHN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIFdMIEJCICovXAorCXsweDAwNjcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgKEJJVDV8QklUNCksIChCSVQ1fEJJVDQpfSwvKjB4NjZbMTNdID0gMHg2N1s1XSA9IDEsIHN3aXRjaCBmb3IgUEFQRV9HL1BBUEVfQSBmcm9tIFdMIEJCIDsgMHg2NlsxMl0gPSAweDY3WzRdID0gMSwgc3dpdGNoIExOQU9OIGZyb20gV0wgQkIgKi9cCisJezB4MDAyNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ2LCAwfSwvKmFuYXBhcl9tYWM8MTE4PiAsIDB4MjVbNl09MCBieSB3bGFuIHNpbmdsZSBmdW5jdGlvbiovXAorCXsweDAwNDksIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgQklUMX0sLypFbmFibGUgZmFsbGluZyBlZGdlIHRyaWdnZXJpbmcgaW50ZXJydXB0Ki9cCisJezB4MDA2MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQxLCBCSVQxfSwvKkVuYWJsZSBHUElPOSBpbnRlcnJ1cHQgbW9kZSovXAorCXsweDAwNjIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgMH0sLypFbmFibGUgR1BJTzkgaW5wdXQgbW9kZSovXAorCXsweDAwNTgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgQklUMH0sLypFbmFibGUgSFNJU1IgR1BJT1tDOjBdIGludGVycnVwdCovXAorCXsweDAwNUEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgQklUMX0sLypFbmFibGUgSFNJU1IgR1BJTzkgaW50ZXJydXB0Ki9cCisJezB4MDA3QSwgUFdSX0NVVF9URVNUQ0hJUF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4M0F9LC8qMHg3QSA9IDB4M0Egc3RhcnQgQlQqL1wKKwl7MHgwMDJFLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYgLCAweDgyIH0sLyogMHgyQ1syMzoxMl09MHg4MjAgOyBYVEFMIHRyaW0gKi8gXAorCXsweDAwMTAsIFBXUl9DVVRfQV9NU0sgLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ2ICwgQklUNiB9LC8qIDB4MTBbNl09MSA7IE1Qt3O8V7nvqfMweDJDqrqxsajuxXahQba3p+IweDEwWzZds12ssDGkfq/gxf1XTEFOsbGo7iAqLyBcCisKKworI2RlZmluZSBSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDFGLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qMHgxRls3OjBdID0gMCB0dXJuIG9mZiBSRiovCVwKKwl7MHgwMDRGLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDAsIDB9LC8qMHg0Q1syNF0gPSAweDRGWzBdID0gMCwgc3dpdGNoIERQRFRfU0VMX1Agb3V0cHV0IGZyb20gcmVnaXN0ZXIgMHg2NVsyXSAqL1wKKwl7MHgwMDQ5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDEsIDB9LC8qRW5hYmxlIHJpc2luZyBlZGdlIHRyaWdnZXJpbmcgaW50ZXJydXB0Ki8gXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgQklUMX0sIC8qMHgwNFs5XSA9IDEgdHVybiBvZmYgTUFDIGJ5IEhXIHN0YXRlIG1hY2hpbmUqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1BPTExJTkcsIEJJVDEsIDB9LCAvKndhaXQgdGlsbCAweDA0WzldID0gMCBwb2xsaW5nIHVudGlsIHJldHVybiAwIHRvIGRpc2FibGUqLwlcCisJezB4MDAwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0t8UFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ1LCBCSVQ1fSwgLyoweDAwWzVdID0gMWInMSBhbmFsb2cgSXBzIHRvIGRpZ2l0YWwgLDE6aXNvbGF0aW9uKi8gICBcCisJezB4MDAyMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0t8UFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCAwfSwgLyoweDIwWzBdID0gMWInMCBkaXNhYmxlIExET0ExMiBNQUNSTyBibG9jayovICAgXAorCisKKyNkZWZpbmUgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19TVVMJCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ0fEJJVDMsIChCSVQ0fEJJVDMpfSwgLyoweDA0WzEyOjExXSA9IDJiJzExIGVuYWJsZSBXTCBzdXNwZW5kIGZvciBQQ0llKi8JXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLfFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUM3xCSVQ0LCBCSVQzfSwgLyoweDA0WzEyOjExXSA9IDJiJzAxIGVuYWJsZSBXTCBzdXNwZW5kKi8JXAorCXsweDAwMjMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDQsIEJJVDR9LCAvKjB4MjNbNF0gPSAxYicxIDEySCBMRE8gZW50ZXIgc2xlZXAgbW9kZSovICAgXAorCXsweDAwMDcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MjB9LCAvKjB4MDdbNzowXSA9IDB4MjAgU0RJTyBTT1Agb3B0aW9uIHRvIGRpc2FibGUgQkcvTUIvQUNLL1NXUiovICAgXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9QQ0lfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUM3xCSVQ0LCBCSVQzfEJJVDR9LCAvKjB4MDRbMTI6MTFdID0gMmInMTEgZW5hYmxlIFdMIHN1c3BlbmQgZm9yIFBDSWUqLwlcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfV1JJVEUsIEJJVDAsIEJJVDB9LCAvKlNldCBTRElPIHN1c3BlbmQgbG9jYWwgcmVnaXN0ZXIqLwlcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfUE9MTElORywgQklUMSwgMH0sIC8qd2FpdCBwb3dlciBzdGF0ZSB0byBzdXNwZW5kKi8KKworI2RlZmluZSBSVEw4ODIxQV9UUkFOU19TVVNfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDMgfCBCSVQ3LCAwfSwgLypjbGVhciBzdXNwZW5kIGVuYWJsZSBhbmQgcG93ZXIgZG93biBlbmFibGUqLwlcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfV1JJVEUsIEJJVDAsIDB9LCAvKlNldCBTRElPIHN1c3BlbmQgbG9jYWwgcmVnaXN0ZXIqLwlcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfUE9MTElORywgQklUMSwgQklUMX0sIC8qd2FpdCBwb3dlciBzdGF0ZSB0byBzdXNwZW5kKi9cCisJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNCwgMH0sIC8qMHgyM1s0XSA9IDFiJzAgMTJIIExETyBlbnRlciBub3JtYWwgbW9kZSovICAgXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUM3xCSVQ0LCAwfSwgLyoweDA0WzEyOjExXSA9IDJiJzAxZW5hYmxlIFdMIHN1c3BlbmQqLworCisjZGVmaW5lIFJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fQ0FSRERJUwkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDA3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDIwfSwgLyoweDA3PTB4MjAgLCBTT1Agb3B0aW9uIHRvIGRpc2FibGUgQkcvTUIqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0t8UFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzfEJJVDQsIEJJVDN9LCAvKjB4MDRbMTI6MTFdID0gMmInMDEgZW5hYmxlIFdMIHN1c3BlbmQqLwlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQyLCBCSVQyfSwgLyoweDA0WzEwXSA9IDEsIGVuYWJsZSBTVyBMUFMqLwlcCisgICAgICAgIHsweDAwNEEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgMX0sIC8qMHg0OFsxNl0gPSAxIHRvIGVuYWJsZSBHUElPOSBhcyBFWFQgV0FLRVVQKi8gICBcCisJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNCwgQklUNH0sIC8qMHgyM1s0XSA9IDFiJzEgMTJIIExETyBlbnRlciBzbGVlcCBtb2RlKi8gICBcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfV1JJVEUsIEJJVDAsIEJJVDB9LCAvKlNldCBTRElPIHN1c3BlbmQgbG9jYWwgcmVnaXN0ZXIqLwlcCisJezB4MDA4NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9TRElPLFBXUl9DTURfUE9MTElORywgQklUMSwgMH0sIC8qd2FpdCBwb3dlciBzdGF0ZSB0byBzdXNwZW5kKi8KKworI2RlZmluZSBSVEw4ODIxQV9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCisJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzIHwgQklUNywgMH0sIC8qY2xlYXIgc3VzcGVuZCBlbmFibGUgYW5kIHBvd2VyIGRvd24gZW5hYmxlKi8JXAorCXsweDAwODYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfU0RJTyxQV1JfQ01EX1dSSVRFLCBCSVQwLCAwfSwgLypTZXQgU0RJTyBzdXNwZW5kIGxvY2FsIHJlZ2lzdGVyKi8JXAorCXsweDAwODYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfU0RJTyxQV1JfQ01EX1BPTExJTkcsIEJJVDEsIEJJVDF9LCAvKndhaXQgcG93ZXIgc3RhdGUgdG8gc3VzcGVuZCovXAorCXsweDAwNEEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMCwgMH0sIC8qMHg0OFsxNl0gPSAwIHRvIGRpc2FibGUgR1BJTzkgYXMgRVhUIFdBS0VVUCovICAgXAorCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUM3xCSVQ0LCAwfSwgLyoweDA0WzEyOjExXSA9IDJiJzAxZW5hYmxlIFdMIHN1c3BlbmQqL1wKKwl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ0LCAwfSwgLyoweDIzWzRdID0gMWInMCAxMkggTERPIGVudGVyIG5vcm1hbCBtb2RlKi8gICBcCisJezB4MDMwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKlBDSWUgRE1BIHN0YXJ0Ki8KKworCisjZGVmaW5lIFJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCisJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUNCwgQklUNH0sIC8qMHgyM1s0XSA9IDFiJzEgMTJIIExETyBlbnRlciBzbGVlcCBtb2RlKi8gICBcCisJezB4MDAwNywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1NESU9fTVNLfFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDIwfSwgLyoweDA3Wzc6MF0gPSAweDIwIFNPUCBvcHRpb24gdG8gZGlzYWJsZSBCRy9NQi9BQ0svU1dSKi8gICBcCisJezB4MDAwNiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCAwfSwvKiAweDA0WzE2XSA9IDAqL1wKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDcsIEJJVDd9LC8qIDB4MDRbMTVdID0gMSovCisKKyNkZWZpbmUgUlRMODgyMUFfVFJBTlNfUEROX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDcsIDB9LC8qIDB4MDRbMTVdID0gMCovCisKKyNkZWZpbmUgUlRMODgyMUFfVFJBTlNfQUNUX1RPX0xQUwkJCQkJCQkJCQkJCQkJXAorCS8qIGZvcm1hdCAqLwkJCQkJCQkJCQkJCQkJCQlcCisJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCisJezB4MDMwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1BDSV9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweEZGfSwvKlBDSWUgRE1BIHN0b3AqLwlcCisJezB4MDUyMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweEZGfSwvKlR4IFBhdXNlKi8JXAorCXsweDA1RjgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCisJezB4MDVGOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1BPTExJTkcsIDB4RkYsIDB9LC8qU2hvdWxkIGJlIHplcm8gaWYgbm8gcGFja2V0IGlzIHRyYW5zbWl0dGluZyovCVwKKwl7MHgwNUZBLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAorCXsweDA1RkIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCisJezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCAwfSwvKkNDSyBhbmQgT0ZETSBhcmUgZGlzYWJsZWQsYW5kIGNsb2NrIGFyZSBnYXRlZCovCVwKKwl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfREVMQVksIDAsIFBXUlNFUV9ERUxBWV9VU30sLypEZWxheSAxdXMqLwlcCisJezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQxLCAwfSwvKldob2xlIEJCIGlzIHJlc2V0Ki8JXAorCXsweDAxMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwM30sLypSZXNldCBNQUMgVFJYKi8JXAorCXsweDAxMDEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgMH0sLypjaGVjayBpZiByZW1vdmVkIGxhdGVyKi8JXAorCXsweDAwOTMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9TRElPX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDB9LC8qV2hlbiBkcml2ZXIgZW50ZXIgU3VzLyBEaXNhYmxlLCBlbmFibGUgTE9QIGZvciBCVCovCVwKKwl7MHgwNTUzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIEJJVDUsIEJJVDV9LC8qUmVzcG9uZCBUeE9LIHRvIHNjaGVkdWxlciovCVwKKworCisjZGVmaW5lIFJUTDg4MjFBX1RSQU5TX0xQU19UT19BQ1QJCQkJCQkJCQkJCQkJCQlcCisJLyogZm9ybWF0ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiB7IG9mZnNldCwgY3V0X21zaywgZmFiX21za3xpbnRlcmZhY2VfbXNrLCBiYXNlfGNtZCwgbXNrLCB2YWx1ZSB9LCAvLyBjb21tZW50cyBoZXJlKi8JCQkJCQkJCVwKKwl7MHgwMDgwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfU0RJT19NU0ssUFdSX0JBU0VBRERSX1NESU8sUFdSX0NNRF9XUklURSwgMHhGRiwgMHg4NH0sIC8qU0RJTyBSUFdNKi9cCisJezB4RkU1OCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDg0fSwgLypVU0IgUlBXTSovXAorCXsweDAzNjEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9QQ0lfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHg4NH0sIC8qUENJZSBSUFdNKi9cCisJezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX0RFTEFZLCAwLCBQV1JTRVFfREVMQVlfTVN9LCAvKkRlbGF5Ki9cCisJezB4MDAwOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ0LCAwfSwgLyouCTB4MDhbNF0gPSAwCQkgc3dpdGNoIFRTRiB0byA0ME0qL1wKKwl7MHgwMTA5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfUE9MTElORywgQklUNywgMH0sIC8qUG9sbGluZyAweDEwOVs3XT0wICBUU0YgaW4gNDBNKi9cCisJezB4MDAyOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQ2fEJJVDcsIDB9LCAvKi4JMHgyOVs3OjZdID0gMmInMDAJIGVuYWJsZSBCQiBjbG9jayovXAorCXsweDAxMDEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMSwgQklUMX0sIC8qLgkweDEwMVsxXSA9IDEqL1wKKwl7MHgwMTAwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4RkZ9LCAvKi4JMHgxMDBbNzowXSA9IDB4RkYJIGVuYWJsZSBXTUFDIFRSWCovXAorCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMXxCSVQwLCBCSVQxfEJJVDB9LCAvKi4JMHgwMlsxOjBdID0gMmInMTEJIGVuYWJsZSBCQiBtYWNybyovXAorCXsweDA1MjIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMH0sIC8qLgkweDUyMiA9IDAqLworCisjZGVmaW5lIFJUTDg4MjFBX1RSQU5TX0VORAkJCQkJCQkJCQkJCQkJCVwKKwkvKiBmb3JtYXQgKi8JCQkJCQkJCQkJCQkJCQkJXAorCS8qIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sIC8vIGNvbW1lbnRzIGhlcmUqLwkJCQkJCQkJXAorCXsweEZGRkYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLDAsUFdSX0NNRF9FTkQsIDAsIDB9LCAvLworCitleHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODIxQV9wb3dlcl9vbl9mbG93W1JUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fQUNUX1NURVBTCisJCQkJCQkrIFJUTDg4MjFBX1RSQU5TX0VORF9TVEVQU107CitleHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4ODIxQV9yYWRpb19vZmZfZmxvd1tSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCQkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgyMUFfY2FyZF9kaXNhYmxlX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2NhcmRfZW5hYmxlX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMvKlJUTDg4MjFBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTKi8KKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX3N1c3BlbmRfZmxvd1tSVEw4ODIxQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUworCQkJCQkJKyBSVEw4ODIxQV9UUkFOU19DQVJERU1VX1RPX1NVU19TVEVQUworCQkJCQkJKyBSVEw4ODIxQV9UUkFOU19FTkRfU1RFUFNdOworZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODgyMUFfcmVzdW1lX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2h3cGRuX2Zsb3dbUlRMODgyMUFfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2VudGVyX2xwc19mbG93W1JUTDg4MjFBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKK2V4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg4MjFBX2xlYXZlX2xwc19mbG93W1JUTDg4MjFBX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMKKwkJCQkJCSsgUlRMODgyMUFfVFJBTlNfRU5EX1NURVBTXTsKKworLypSVEw4ODEyIFBvd2VyIENvbmZpZ3VyYXRpb24gQ01EcyBmb3IgUENJZSBpbnRlcmZhY2UqLworI2RlZmluZSBSVEw4ODEyX05JQ19QV1JfT05fRkxPVwkJCQlydGw4ODEyX3Bvd2VyX29uX2Zsb3cKKyNkZWZpbmUgUlRMODgxMl9OSUNfUkZfT0ZGX0ZMT1cJCQkJcnRsODgxMl9yYWRpb19vZmZfZmxvdworI2RlZmluZSBSVEw4ODEyX05JQ19ESVNBQkxFX0ZMT1cgCQkJcnRsODgxMl9jYXJkX2Rpc2FibGVfZmxvdworI2RlZmluZSBSVEw4ODEyX05JQ19FTkFCTEVfRkxPVwkJCQlydGw4ODEyX2NhcmRfZW5hYmxlX2Zsb3cKKyNkZWZpbmUgUlRMODgxMl9OSUNfU1VTUEVORF9GTE9XCQkJcnRsODgxMl9zdXNwZW5kX2Zsb3cKKyNkZWZpbmUgUlRMODgxMl9OSUNfUkVTVU1FX0ZMT1cJCQkJcnRsODgxMl9yZXN1bWVfZmxvdworI2RlZmluZSBSVEw4ODEyX05JQ19QRE5fRkxPVwkJCQkJcnRsODgxMl9od3Bkbl9mbG93CisjZGVmaW5lIFJUTDg4MTJfTklDX0xQU19FTlRFUl9GTE9XCQkJcnRsODgxMl9lbnRlcl9scHNfZmxvdworI2RlZmluZSBSVEw4ODEyX05JQ19MUFNfTEVBVkVfRkxPVwkJCXJ0bDg4MTJfbGVhdmVfbHBzX2Zsb3cKKworLyogUlRMODgyMSBQb3dlciBDb25maWd1cmF0aW9uIENNRHMgZm9yIFBDSWUgaW50ZXJmYWNlICovCisjZGVmaW5lIFJUTDg4MjFBX05JQ19QV1JfT05fRkxPVwkJCXJ0bDg4MjFBX3Bvd2VyX29uX2Zsb3cKKyNkZWZpbmUgUlRMODgyMUFfTklDX1JGX09GRl9GTE9XCQkJcnRsODgyMUFfcmFkaW9fb2ZmX2Zsb3cKKyNkZWZpbmUgUlRMODgyMUFfTklDX0RJU0FCTEVfRkxPVwkJCXJ0bDg4MjFBX2NhcmRfZGlzYWJsZV9mbG93CisjZGVmaW5lIFJUTDg4MjFBX05JQ19FTkFCTEVfRkxPVwkJCXJ0bDg4MjFBX2NhcmRfZW5hYmxlX2Zsb3cKKyNkZWZpbmUgUlRMODgyMUFfTklDX1NVU1BFTkRfRkxPVwkJCXJ0bDg4MjFBX3N1c3BlbmRfZmxvdworI2RlZmluZSBSVEw4ODIxQV9OSUNfUkVTVU1FX0ZMT1cJCQlydGw4ODIxQV9yZXN1bWVfZmxvdworI2RlZmluZSBSVEw4ODIxQV9OSUNfUEROX0ZMT1cJCQkJcnRsODgyMUFfaHdwZG5fZmxvdworI2RlZmluZSBSVEw4ODIxQV9OSUNfTFBTX0VOVEVSX0ZMT1cJCQlydGw4ODIxQV9lbnRlcl9scHNfZmxvdworI2RlZmluZSBSVEw4ODIxQV9OSUNfTFBTX0xFQVZFX0ZMT1cJCQlydGw4ODIxQV9sZWF2ZV9scHNfZmxvdworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGJjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwd3JzZXEuaCIKKworCisvKgorKglEZXNjcmlwdGlvbjoKKyoJCVRoaXMgcm91dGluZSBkZWFsIHdpdGggdGhlIFBvd2VyIENvbmZpZ3VyYXRpb24gQ01EcworKgkJIHBhcnNpbmcgZm9yIFJUTDg3MjMvUlRMODE4OEUgU2VyaWVzIElDLgorKglBc3N1bXB0aW9uOgorKgkJV2Ugc2hvdWxkIGZvbGxvdyBzcGVjaWZpYyBmb3JtYXQgd2hpY2ggd2FzIHJlbGVhc2VkIGZyb20gSFcgU0QuCisqCisqCTIwMTEuMDcuMDcsIGFkZGVkIGJ5IFJvZ2VyLgorKi8KK2Jvb2wgcnRsX2hhbF9wd3JzZXFjbWRwYXJzaW5nIChzdHJ1Y3QgcnRsX3ByaXYqIHJ0bHByaXYsIHU4IGN1dF92ZXJzaW9uLAorCQkJCQkJCQkJCXU4IGZhYl92ZXJzaW9uLCB1OCBpbnRlcmZhY2VfdHlwZSwKKwkJCQkJCQkJCQlzdHJ1Y3Qgd2xhbl9wd3JfY2ZnCXB3cmNmZ2NtZFtdKQorCit7CisJc3RydWN0IHdsYW5fcHdyX2NmZyBwd3JfY2ZnX2NtZCA9IHswfTsKKwlib29sIHBvbGxpbmdfYml0ID0gZmFsc2U7CisJdTMyIGFyeV9pZHg9MDsKKwl1OCB2YWx1ZSA9IDA7CisJdTMyIG9mZnNldCA9IDA7CisJdTMyIHBvbGxpbmdfY291bnQgPSAwOworCXUzMiBtYXhfcG9sbGluZ19jbnQgPSA1MDAwOworCisJZG8geworCQlwd3JfY2ZnX2NtZCA9IHB3cmNmZ2NtZFthcnlfaWR4XTsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkoInJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZygpOiBvZmZzZXQoJSN4KSxjdXRfbXNrKCUjeCksIGZhYl9tc2soJSN4KSwiCisJCQkiaW50ZXJmYWNlX21zayglI3gpLCBiYXNlKCUjeCksIGNtZCglI3gpLCBtc2soJSN4KSwgdmFsdWUoJSN4KVxuIiwKKwkJCUdFVF9QV1JfQ0ZHX09GRlNFVChwd3JfY2ZnX2NtZCksIEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKHB3cl9jZmdfY21kKSwKKwkJCUdFVF9QV1JfQ0ZHX0ZBQl9NQVNLKHB3cl9jZmdfY21kKSwgR0VUX1BXUl9DRkdfSU5URl9NQVNLKHB3cl9jZmdfY21kKSwKKwkJCUdFVF9QV1JfQ0ZHX0JBU0UocHdyX2NmZ19jbWQpLCBHRVRfUFdSX0NGR19DTUQocHdyX2NmZ19jbWQpLAorCQkJR0VUX1BXUl9DRkdfTUFTSyhwd3JfY2ZnX2NtZCksIEdFVF9QV1JfQ0ZHX1ZBTFVFKHB3cl9jZmdfY21kKSkpOworCisJCWlmICgoR0VUX1BXUl9DRkdfRkFCX01BU0socHdyX2NmZ19jbWQpJmZhYl92ZXJzaW9uKSAmJgorCQkJKEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKHB3cl9jZmdfY21kKSZjdXRfdmVyc2lvbikgJiYKKwkJCShHRVRfUFdSX0NGR19JTlRGX01BU0socHdyX2NmZ19jbWQpJmludGVyZmFjZV90eXBlKSkgeworCQkJc3dpdGNoIChHRVRfUFdSX0NGR19DTUQocHdyX2NmZ19jbWQpKSB7CisJCQljYXNlIFBXUl9DTURfUkVBRDoKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCQkJKCJydGxfaGFsX3B3cnNlcWNtZHBhcnNpbmcoKTogUFdSX0NNRF9SRUFEXG4iKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUFdSX0NNRF9XUklURTogeworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJCQkoInJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZygpOiBQV1JfQ01EX1dSSVRFXG4iKSk7CisJCQkJb2Zmc2V0ID0gR0VUX1BXUl9DRkdfT0ZGU0VUKHB3cl9jZmdfY21kKTsKKworCQkJCQkvKlJlYWQgdGhlIHZhbHVlIGZyb20gc3lzdGVtIHJlZ2lzdGVyKi8KKwkJCQkJdmFsdWUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIG9mZnNldCk7CisJCQkJCXZhbHVlID0gdmFsdWUgJiAofihHRVRfUFdSX0NGR19NQVNLKHB3cl9jZmdfY21kKSkpOworCQkJCQl2YWx1ZSA9IHZhbHVlIHwgKEdFVF9QV1JfQ0ZHX1ZBTFVFKHB3cl9jZmdfY21kKQorCQkJCQkJCSYgR0VUX1BXUl9DRkdfTUFTSyhwd3JfY2ZnX2NtZCkpOworCisJCQkJCS8qV3JpdGUgdGhlIHZhbHVlIGJhY2sgdG8gc3l0ZW0gcmVnaXN0ZXIqLworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBvZmZzZXQsIHZhbHVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUFdSX0NNRF9QT0xMSU5HOgorCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJCQkoInJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZygpOiBQV1JfQ01EX1BPTExJTkdcbiIpKTsKKwkJCQlwb2xsaW5nX2JpdCA9IGZhbHNlOworCQkJCW9mZnNldCA9IEdFVF9QV1JfQ0ZHX09GRlNFVChwd3JfY2ZnX2NtZCk7CisKKwkJCQlkbyB7CisJCQkJCXZhbHVlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBvZmZzZXQpOworCisJCQkJCXZhbHVlID0gdmFsdWUgJiBHRVRfUFdSX0NGR19NQVNLKHB3cl9jZmdfY21kKTsKKwkJCQkJaWYgKHZhbHVlID09IChHRVRfUFdSX0NGR19WQUxVRShwd3JfY2ZnX2NtZCkKKwkJCQkJCQkmIEdFVF9QV1JfQ0ZHX01BU0socHdyX2NmZ19jbWQpKSkKKwkJCQkJCXBvbGxpbmdfYml0PXRydWU7CisJCQkJCWVsc2UKKwkJCQkJCXVkZWxheSgxMCk7CisKKwkJCQkJaWYgKHBvbGxpbmdfY291bnQrKyA+IG1heF9wb2xsaW5nX2NudCkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfSB3aGlsZSAoIXBvbGxpbmdfYml0KTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIFBXUl9DTURfREVMQVk6CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJCSgicnRsX2hhbF9wd3JzZXFjbWRwYXJzaW5nKCk6IFBXUl9DTURfREVMQVlcbiIpKTsKKwkJCQlpZiAoR0VUX1BXUl9DRkdfVkFMVUUocHdyX2NmZ19jbWQpID09IFBXUlNFUV9ERUxBWV9VUykKKwkJCQkJdWRlbGF5KEdFVF9QV1JfQ0ZHX09GRlNFVChwd3JfY2ZnX2NtZCkpOworCQkJCWVsc2UKKwkJCQkJbWRlbGF5KEdFVF9QV1JfQ0ZHX09GRlNFVChwd3JfY2ZnX2NtZCkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFBXUl9DTURfRU5EOgorCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJCQkoInJ0bF9oYWxfcHdyc2VxY21kcGFyc2luZygpOiBQV1JfQ01EX0VORFxuIikpOworCQkJCXJldHVybiB0cnVlOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVJUX0FTU0VSVChmYWxzZSwKKwkJCQkJKCJydGxfaGFsX3B3cnNlcWNtZHBhcnNpbmcoKTogVW5rbm93biBDTUQhIVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQlhcnlfaWR4Kys7CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxZTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcWNtZC5oCkBAIC0wLDAgKzEsNzEgQEAKKyNpZm5kZWYgX19SVEw4ODIxQUVfUFdSU0VRQ01EX0hfXworI2RlZmluZSBfX1JUTDg4MjFBRV9QV1JTRVFDTURfSF9fCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKlRoZSB2YWx1ZSBvZiBjbWQ6IDQgYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQlQV1JfQ01EX1JFQUQgCQkweDAwCisjZGVmaW5lCVBXUl9DTURfV1JJVEUJMHgwMQorI2RlZmluZQlQV1JfQ01EX1BPTExJTkcJMHgwMgorI2RlZmluZQlQV1JfQ01EX0RFTEFZCTB4MDMKKyNkZWZpbmUJUFdSX0NNRF9FTkQJCTB4MDQKKworLyogZGVmaW5lIHRoZSBiYXNlIGFkZHJlc3Mgb2YgZWFjaCBibG9jayAqLworI2RlZmluZQlQV1JfQkFTRUFERFJfTUFDCTB4MDAKKyNkZWZpbmUJUFdSX0JBU0VBRERSX1VTQgkweDAxCisjZGVmaW5lCVBXUl9CQVNFQUREUl9QQ0lFCTB4MDIKKyNkZWZpbmUJUFdSX0JBU0VBRERSX1NESU8JMHgwMworCisjZGVmaW5lCVBXUl9JTlRGX1NESU9fTVNLCUJJVCgwKQorI2RlZmluZQlQV1JfSU5URl9VU0JfTVNLCUJJVCgxKQorI2RlZmluZQlQV1JfSU5URl9QQ0lfTVNLCUJJVCgyKQorI2RlZmluZQlQV1JfSU5URl9BTExfTVNLCShCSVQoMCl8QklUKDEpfEJJVCgyKXxCSVQoMykpCisKKyNkZWZpbmUJUFdSX0ZBQl9UU01DX01TSwlCSVQoMCkKKyNkZWZpbmUJUFdSX0ZBQl9VTUNfTVNLCQlCSVQoMSkKKyNkZWZpbmUJUFdSX0ZBQl9BTExfTVNLCQkoQklUKDApfEJJVCgxKXxCSVQoMil8QklUKDMpKQorCisjZGVmaW5lCVBXUl9DVVRfVEVTVENISVBfTVNLCUJJVCgwKQorI2RlZmluZQlQV1JfQ1VUX0FfTVNLCQlCSVQoMSkKKyNkZWZpbmUJUFdSX0NVVF9CX01TSwkJQklUKDIpCisjZGVmaW5lCVBXUl9DVVRfQ19NU0sJCUJJVCgzKQorI2RlZmluZQlQV1JfQ1VUX0RfTVNLCQlCSVQoNCkKKyNkZWZpbmUJUFdSX0NVVF9FX01TSwkJQklUKDUpCisjZGVmaW5lCVBXUl9DVVRfRl9NU0sJCUJJVCg2KQorI2RlZmluZQlQV1JfQ1VUX0dfTVNLCQlCSVQoNykKKyNkZWZpbmUJUFdSX0NVVF9BTExfTVNLCQkweEZGCisKKworZW51bSBwd3JzZXFfZGVsYXlfdW5pdCB7CisgICBQV1JTRVFfREVMQVlfVVMsCisgICBQV1JTRVFfREVMQVlfTVMsCit9OworCitzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHsKKwl1MTYgb2Zmc2V0OworCXU4IGN1dF9tc2s7CisJdTggZmFiX21zazo0OworCXU4IGludGVyZmFjZV9tc2s6NDsKKwl1OCBiYXNlOjQ7CisJdTggY21kOjQ7CisJdTggbXNrOworCXU4IHZhbHVlOworCit9OworCisjZGVmaW5lCUdFVF9QV1JfQ0ZHX09GRlNFVChfX1BXUl9DTUQpCV9fUFdSX0NNRC5vZmZzZXQKKyNkZWZpbmUJR0VUX1BXUl9DRkdfQ1VUX01BU0soX19QV1JfQ01EKQlfX1BXUl9DTUQuY3V0X21zaworI2RlZmluZQlHRVRfUFdSX0NGR19GQUJfTUFTSyhfX1BXUl9DTUQpCV9fUFdSX0NNRC5mYWJfbXNrCisjZGVmaW5lCUdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhfX1BXUl9DTUQpCV9fUFdSX0NNRC5pbnRlcmZhY2VfbXNrCisjZGVmaW5lCUdFVF9QV1JfQ0ZHX0JBU0UoX19QV1JfQ01EKQlfX1BXUl9DTUQuYmFzZQorI2RlZmluZQlHRVRfUFdSX0NGR19DTUQoX19QV1JfQ01EKQlfX1BXUl9DTUQuY21kCisjZGVmaW5lCUdFVF9QV1JfQ0ZHX01BU0soX19QV1JfQ01EKQlfX1BXUl9DTUQubXNrCisjZGVmaW5lCUdFVF9QV1JfQ0ZHX1ZBTFVFKF9fUFdSX0NNRCkJX19QV1JfQ01ELnZhbHVlCisKK2Jvb2wgcnRsX2hhbF9wd3JzZXFjbWRwYXJzaW5nKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHU4IGN1dF92ZXJzaW9uLAorCQkJCQkJCQkJICAgdTggZmFiX3ZlcnNpb24sIHU4IGludGVyZmFjZV90eXBlLAorCQkJCQkJCQkJICAgc3RydWN0IHdsYW5fcHdyX2NmZyBwd3JjZmdjbWRbXSk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YzVmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZWcuaApAQCAtMCwwICsxLDI0MjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMODgyMUFFX1JFR19IX18KKyNkZWZpbmUgX19SVEw4ODIxQUVfUkVHX0hfXworCisjZGVmaW5lIFRYUEtUX0JVRl9TRUxFQ1QJCQkJMHg2OQorI2RlZmluZSBSWFBLVF9CVUZfU0VMRUNUCQkJCTB4QTUKKyNkZWZpbmUgRElTQUJMRV9UUlhQS1RfQlVGX0FDQ0VTUwkJCTB4MAorCisjZGVmaW5lIFJFR19TWVNfSVNPX0NUUkwJCQkweDAwMDAKKyNkZWZpbmUgUkVHX1NZU19GVU5DX0VOCQkJCTB4MDAwMgorI2RlZmluZSBSRUdfQVBTX0ZTTUNPCQkJCTB4MDAwNAorI2RlZmluZSBSRUdfU1lTX0NMS1IJCQkJMHgwMDA4CisjZGVmaW5lIFJFR185MzQ2Q1IJCQkJCTB4MDAwQQorI2RlZmluZSBSRUdfRUVfVlBECQkJCQkweDAwMEMKKyNkZWZpbmUgUkVHX0FGRV9NSVNDCQkJCTB4MDAxMAorI2RlZmluZSBSRUdfU1BTMF9DVFJMCQkJCTB4MDAxMQorI2RlZmluZSBSRUdfU1BTX09DUF9DRkcJCQkJMHgwMDE4CisjZGVmaW5lIFJFR19SU1ZfQ1RSTAkJCQkweDAwMUMKKyNkZWZpbmUgUkVHX1JGX0NUUkwJCQkJCTB4MDAxRgorI2RlZmluZSBSRUdfTERPQTE1X0NUUkwJCQkJMHgwMDIwCisjZGVmaW5lIFJFR19MRE9WMTJEX0NUUkwJCQkweDAwMjEKKyNkZWZpbmUgUkVHX0xET0hDSTEyX0NUUkwJCQkweDAwMjIKKyNkZWZpbmUgUkVHX0xQTERPX0NUUkwJCQkJMHgwMDIzCisjZGVmaW5lIFJFR19BRkVfWFRBTF9DVFJMCQkJMHgwMDI0CisjZGVmaW5lIFJFR19BRkVfTERPX0NUUkwgICAgICAgICAgICAgICAgCTB4MDAyNyAvKiAxLjV2IGZvciA4MTg4RUUgdGVzdCBjaGlwLCAxLjR2IGZvciBNUCBjaGlwICovCisjZGVmaW5lIFJFR19BRkVfUExMX0NUUkwJCQkweDAwMjgKKyNkZWZpbmUgUkVHX01BQ19QSFlfQ1RSTAkJCTB4MDAyYworI2RlZmluZSBSRUdfRUZVU0VfQ1RSTAkJCQkweDAwMzAKKyNkZWZpbmUgUkVHX0VGVVNFX1RFU1QJCQkJMHgwMDM0CisjZGVmaW5lIFJFR19QV1JfREFUQQkJCQkweDAwMzgKKyNkZWZpbmUgUkVHX0NBTF9USU1FUgkJCQkweDAwM0MKKyNkZWZpbmUgUkVHX0FDTEtfTU9OCQkJCTB4MDAzRQorI2RlZmluZSBSRUdfR1BJT19NVVhDRkcJCQkweDAwNDAKKyNkZWZpbmUgUkVHX0dQSU9fSU9fU0VMCQkJCTB4MDA0MgorI2RlZmluZSBSRUdfTUFDX1BJTk1VWF9DRkcJCTB4MDA0MworI2RlZmluZSBSRUdfR1BJT19QSU5fQ1RSTAkJCTB4MDA0NAorI2RlZmluZSBSRUdfR1BJT19JTlRNCQkJCTB4MDA0OAorI2RlZmluZSBSRUdfTEVEQ0ZHMAkJCQkJMHgwMDRDCisjZGVmaW5lIFJFR19MRURDRkcxCQkJCQkweDAwNEQKKyNkZWZpbmUgUkVHX0xFRENGRzIJCQkJCTB4MDA0RQorI2RlZmluZSBSRUdfTEVEQ0ZHMwkJCQkJMHgwMDRGCisjZGVmaW5lIFJFR19GU0lNUgkJCQkJMHgwMDUwCisjZGVmaW5lIFJFR19GU0lTUgkJCQkJMHgwMDU0CisjZGVmaW5lIFJFR19IU0lNUgkJCQkJMHgwMDU4CisjZGVmaW5lIFJFR19IU0lTUgkJCQkJMHgwMDVjCisjZGVmaW5lIFJFR19HUElPX1BJTl9DVFJMXzIJCTB4MDA2MAorI2RlZmluZSBSRUdfR1BJT19JT19TRUxfMgkJCTB4MDA2MgorI2RlZmluZSBSRUdfTVVMVElfRlVOQ19DVFJMCQkJMHgwMDY4CisjZGVmaW5lIFJFR19HUElPX09VVFBVVAkJCTB4MDA2YworI2RlZmluZSBSRUdfT1BUX0NUUkwJCQkweDAwNzQKKyNkZWZpbmUgUkVHX0FGRV9YVEFMX0NUUkxfRVhUCQkweDAwNzgKKyNkZWZpbmUgUkVHX1hDS19PVVRfQ1RSTAkJCTB4MDA3YworI2RlZmluZSBSRUdfTUNVRldETAkJCQkweDAwODAKKyNkZWZpbmUgUkVHX1dPTF9FVkVOVAkJCQkweDAwODEKKyNkZWZpbmUgUkVHX01DVVRTVENGRwkJCQkweDAwODQKKworCisjZGVmaW5lIFJFR19ISU1SCQkJCQkweDAwQjAKKyNkZWZpbmUgUkVHX0hJU1IJCQkJCTB4MDBCNAorI2RlZmluZSBSRUdfSElNUkUJCQkJCTB4MDBCOAorI2RlZmluZSBSRUdfSElTUkUJCQkJCTB4MDBCQworCisjZGVmaW5lIFJFR19QTUNfREJHX0NUUkwyCQkJMHgwMENDCisKKyNkZWZpbmUgUkVHX0VGVVNFX0FDQ0VTUwkJCTB4MDBDRgorCisjZGVmaW5lIFJFR19CSVNUX1NDQU4JCQkJMHgwMEQwCisjZGVmaW5lIFJFR19CSVNUX1JQVAkJCQkweDAwRDQKKyNkZWZpbmUgUkVHX0JJU1RfUk9NX1JQVAkJCTB4MDBEOAorI2RlZmluZSBSRUdfVVNCX1NJRV9JTlRGCQkJMHgwMEUwCisjZGVmaW5lIFJFR19QQ0lFX01JT19JTlRGCQkJMHgwMEU0CisjZGVmaW5lIFJFR19QQ0lFX01JT19JTlRECQkJMHgwMEU4CisjZGVmaW5lIFJFR19IUE9OX0ZTTQkJCQkweDAwRUMKKyNkZWZpbmUgUkVHX1NZU19DRkcJCQkJCTB4MDBGMAorI2RlZmluZSBSRUdfR1BJT19PVVRTVFMJCQkJMHgwMEY0CisjZGVmaW5lIFJFR19TWVNfQ0ZHMQkJCQkweDAwRkMKKyNkZWZpbmUgUkVHX1JPTV9WRVJTSU9OCQkJCTB4MDBGRAorCisjZGVmaW5lIFJFR19DUgkJCQkJCTB4MDEwMAorI2RlZmluZSBSRUdfUEJQCQkJCQkJMHgwMTA0CisjZGVmaW5lIFJFR19QS1RfQlVGRl9BQ0NFU1NfQ1RSTAkJCTB4MDEwNgorI2RlZmluZSBSRUdfVFJYRE1BX0NUUkwJCQkJMHgwMTBDCisjZGVmaW5lIFJFR19UUlhGRl9CTkRZCQkJCTB4MDExNAorI2RlZmluZSBSRUdfVFJYRkZfU1RBVFVTCQkJMHgwMTE4CisjZGVmaW5lIFJFR19SWEZGX1BUUgkJCQkweDAxMUMKKworI2RlZmluZSBSRUdfQ1BXTQkJCQkJMHgwMTJGCisjZGVmaW5lIFJFR19GV0lNUgkJCQkJMHgwMTMwCisjZGVmaW5lIFJFR19GV0lTUgkJCQkJMHgwMTM0CisjZGVmaW5lIFJFR19QS1RCVUZfREJHX0NUUkwJCQkweDAxNDAKKyNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9MCQkweDAxNDQKKyNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9ICQkweDAxNDgKKyNkZWZpbmUgUkVHX1JYUEtUQlVGX0NUUkwJCQkJKFJFR19QS1RCVUZfREJHX0NUUkwrMikKKworI2RlZmluZSBSRUdfVEMwX0NUUkwJCQkJMHgwMTUwCisjZGVmaW5lIFJFR19UQzFfQ1RSTAkJCQkweDAxNTQKKyNkZWZpbmUgUkVHX1RDMl9DVFJMCQkJCTB4MDE1OAorI2RlZmluZSBSRUdfVEMzX0NUUkwJCQkJMHgwMTVDCisjZGVmaW5lIFJFR19UQzRfQ1RSTAkJCQkweDAxNjAKKyNkZWZpbmUgUkVHX1RDVU5JVF9CQVNFCQkJCTB4MDE2NAorI2RlZmluZSBSRUdfTUJJU1RfU1RBUlQJCQkJMHgwMTc0CisjZGVmaW5lIFJFR19NQklTVF9ET05FCQkJCTB4MDE3OAorI2RlZmluZSBSRUdfTUJJU1RfRkFJTAkJCQkweDAxN0MKKyNkZWZpbmUgUkVHXzMyS19DVFJMCQkJCQkweDAxOTQKKyNkZWZpbmUgUkVHX0MySEVWVF9NU0dfTk9STUFMCQkweDAxQTAKKyNkZWZpbmUgUkVHX0MySEVWVF9DTEVBUgkJCTB4MDFBRgorI2RlZmluZSBSRUdfQzJIRVZUX01TR19URVNUCQkJMHgwMUI4CisjZGVmaW5lIFJFR19NQ1VUU1RfMQkJCQkweDAxYzAKKyNkZWZpbmUgUkVHX0ZNRVRIUgkJCQkJMHgwMUM4CisjZGVmaW5lIFJFR19ITUVURlIJCQkJCTB4MDFDQworI2RlZmluZSBSRUdfSE1FQk9YXzAJCQkJMHgwMUQwCisjZGVmaW5lIFJFR19ITUVCT1hfMQkJCQkweDAxRDQKKyNkZWZpbmUgUkVHX0hNRUJPWF8yCQkJCTB4MDFEOAorI2RlZmluZSBSRUdfSE1FQk9YXzMJCQkJMHgwMURDCisKKyNkZWZpbmUgUkVHX0xMVF9JTklUCQkJCTB4MDFFMAorI2RlZmluZSBSRUdfQkJfQUNDRUVTU19DVFJMCQkJMHgwMUU4CisjZGVmaW5lIFJFR19CQl9BQ0NFU1NfREFUQQkJCTB4MDFFQworCisjZGVmaW5lIFJFR19ITUVCT1hfRVhUXzAJCQkweDAxRjAKKyNkZWZpbmUgUkVHX0hNRUJPWF9FWFRfMQkJCTB4MDFGNAorI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8yCQkJMHgwMUY4CisjZGVmaW5lIFJFR19ITUVCT1hfRVhUXzMJCQkweDAxRkMKKworI2RlZmluZSBSRUdfUlFQTgkJCQkJMHgwMjAwCisjZGVmaW5lIFJFR19GSUZPUEFHRQkJCQkweDAyMDQKKyNkZWZpbmUgUkVHX1RERUNUUkwJCQkJCTB4MDIwOAorI2RlZmluZSBSRUdfVFhETUFfT0ZGU0VUX0NISwkJMHgwMjBDCisjZGVmaW5lIFJFR19UWERNQV9TVEFUVVMJCQkweDAyMTAKKyNkZWZpbmUgUkVHX1JRUE5fTlBRCQkJCTB4MDIxNAorCisjZGVmaW5lIFJFR19SWERNQV9BR0dfUEdfVEgJCTB4MDI4MAorI2RlZmluZSBSRUdfRldfVVBEX1JEUFRSCQkJMHgwMjg0IC8qIEZXIHNoYWxsIHVwZGF0ZSB0aGlzIHJlZ2lzdGVyIGJlZm9yZSBGVyB3cml0ZSBSWFBLVF9SRUxFQVNFX1BPTEwgdG8gMSAqLworI2RlZmluZSBSRUdfUlhETUFfQ09OVFJPTAkJCTB4MDI4NiAvKiBDb250cm9sIHRoZSBSWCBETUEuKi8KKyNkZWZpbmUgUkVHX1JYUEtUX05VTQkJCQkweDAyODcgLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIGluIFJYUEtUQlVGLgkqLworCisjZGVmaW5lCVJFR19QQ0lFX0NUUkxfUkVHCQkJMHgwMzAwCisjZGVmaW5lCVJFR19JTlRfTUlHCQkJCQkweDAzMDQKKyNkZWZpbmUJUkVHX0JDTlFfREVTQQkJCQkweDAzMDgKKyNkZWZpbmUJUkVHX0hRX0RFU0EJCQkJCTB4MDMxMAorI2RlZmluZQlSRUdfTUdRX0RFU0EJCQkJMHgwMzE4CisjZGVmaW5lCVJFR19WT1FfREVTQQkJCQkweDAzMjAKKyNkZWZpbmUJUkVHX1ZJUV9ERVNBCQkJCTB4MDMyOAorI2RlZmluZQlSRUdfQkVRX0RFU0EJCQkJMHgwMzMwCisjZGVmaW5lCVJFR19CS1FfREVTQQkJCQkweDAzMzgKKyNkZWZpbmUJUkVHX1JYX0RFU0EJCQkJCTB4MDM0MAorCisjZGVmaW5lCVJFR19EQklfV0RBVEEJCQkJMHgwMzQ4CisjZGVmaW5lCVJFR19EQklfUkRBVEEJCQkJMHgwMzRDCisjZGVmaW5lCVJFR19EQklfQUREUgkJCQkweDAzNTAKKyNkZWZpbmUJUkVHX0RCSV9GTEFHCQkJCTB4MDM1MgorI2RlZmluZQlSRUdfTURJT19XREFUQQkJCQkweDAzNTQKKyNkZWZpbmUJUkVHX01ESU9fUkRBVEEJCQkJMHgwMzU2CisjZGVmaW5lCVJFR19NRElPX0NUTAkJCQkweDAzNTgKKyNkZWZpbmUJUkVHX0RCR19TRUwJCQkJCTB4MDM2MAorI2RlZmluZQlSRUdfUENJRV9IUlBXTQkJCQkweDAzNjEKKyNkZWZpbmUJUkVHX1BDSUVfSENQV00JCQkJMHgwMzYzCisjZGVmaW5lCVJFR19VQVJUX0NUUkwJCQkJMHgwMzY0CisjZGVmaW5lCVJFR19XQVRDSF9ET0cJCQkJMHgwMzY4CisjZGVmaW5lCVJFR19VQVJUX1RYX0RFU0EJCQkweDAzNzAKKyNkZWZpbmUJUkVHX1VBUlRfUlhfREVTQQkJCTB4MDM3OAorCisKKyNkZWZpbmUJUkVHX0hEQVFfREVTQV9OT0RFRgkJCTB4MDAwMAorI2RlZmluZQlSRUdfQ01EUV9ERVNBX05PREVGCQkJMHgwMDAwCisKKyNkZWZpbmUgUkVHX1ZPUV9JTkZPUk1BVElPTgkJCTB4MDQwMAorI2RlZmluZSBSRUdfVklRX0lORk9STUFUSU9OCQkJMHgwNDA0CisjZGVmaW5lIFJFR19CRVFfSU5GT1JNQVRJT04JCQkweDA0MDgKKyNkZWZpbmUgUkVHX0JLUV9JTkZPUk1BVElPTgkJCTB4MDQwQworI2RlZmluZSBSRUdfTUdRX0lORk9STUFUSU9OCQkJMHgwNDEwCisjZGVmaW5lIFJFR19IR1FfSU5GT1JNQVRJT04JCQkweDA0MTQKKyNkZWZpbmUgUkVHX0JDTlFfSU5GT1JNQVRJT04JCQkweDA0MTgKKyNkZWZpbmUgUkVHX1RYUEtUX0VNUFRZCQkJCTB4MDQxQQorCisKKyNkZWZpbmUgUkVHX0NQVV9NR1FfSU5GT1JNQVRJT04JCTB4MDQxQworI2RlZmluZSBSRUdfRldIV19UWFFfQ1RSTAkJCTB4MDQyMAorI2RlZmluZSBSRUdfSFdTRVFfQ1RSTAkJCQkweDA0MjMKKyNkZWZpbmUgUkVHX1RYUEtUQlVGX0JDTlFfQkROWQkJMHgwNDI0CisjZGVmaW5lIFJFR19UWFBLVEJVRl9NR1FfQkROWQkJMHgwNDI1CisjZGVmaW5lIFJFR19NVUxUSV9CQ05RX0VOCQkJMHgwNDI2CisjZGVmaW5lIFJFR19NVUxUSV9CQ05RX09GRlNFVAkJMHgwNDI3CisjZGVmaW5lIFJFR19TUEVDX1NJRlMJCQkJMHgwNDI4CisjZGVmaW5lIFJFR19STAkJCQkJCTB4MDQyQQorI2RlZmluZSBSRUdfREFSRlJDCQkJCQkweDA0MzAKKyNkZWZpbmUgUkVHX1JBUkZSQwkJCQkJMHgwNDM4CisjZGVmaW5lIFJFR19SUlNSCQkJCQkweDA0NDAKKyNkZWZpbmUgUkVHX0FSRlIwCQkJCQkweDA0NDQKKyNkZWZpbmUgUkVHX0FSRlIxCQkJCQkweDA0NEMKKyNkZWZpbmUgUkVHX0NDS19DSEVDSwkJCQkweDA0NTQKKyNkZWZpbmUgUkVHX0FNUERVX01BWF9USU1FCQkJMHgwNDU2CisjZGVmaW5lIFJFR19BR0dMRU5fTE1UCQkJCTB4MDQ1OAorI2RlZmluZSBSRUdfQU1QRFVfTUlOX1NQQUNFCQkJMHgwNDVDCisjZGVmaW5lIFJFR19UWFBLVEJVRl9XTUFDX0xCS19CRl9IRAkweDA0NUQKKyNkZWZpbmUgUkVHX0ZBU1RfRURDQV9DVFJMCQkJMHgwNDYwCisjZGVmaW5lIFJFR19SRF9SRVNQX1BLVF9USAkJCTB4MDQ2MworI2RlZmluZSBSRUdfSU5JUlRTX1JBVEVfU0VMCQkJMHgwNDgwCisjZGVmaW5lIFJFR19JTklEQVRBX1JBVEVfU0VMCQkweDA0ODQKKyNkZWZpbmUgUkVHX0FSRlIyCQkJCQkweDA0OEMKKyNkZWZpbmUgUkVHX0FSRlIzCQkJCQkweDA0OTQKKyNkZWZpbmUgUkVHX1BPV0VSX1NUQVRVUwkJCTB4MDRBNAorI2RlZmluZSBSRUdfUE9XRVJfU1RBR0UxCQkJMHgwNEI0CisjZGVmaW5lIFJFR19QT1dFUl9TVEFHRTIJCQkweDA0QjgKKyNkZWZpbmUgUkVHX1BLVF9MSUZFX1RJTUUJCQkweDA0QzAKKyNkZWZpbmUgUkVHX1NUQkNfU0VUVElORwkJCTB4MDRDNAorI2RlZmluZSBSRUdfSFRfU0lOR0xFX0FNUERVCQkJMHgwNEM3CisjZGVmaW5lIFJFR19QUk9UX01PREVfQ1RSTAkJCTB4MDRDOAorI2RlZmluZSBSRUdfTUFYX0FHR1JfTlVNCQkJMHgwNENBCisjZGVmaW5lIFJFR19CQVJfTU9ERV9DVFJMCQkJMHgwNENDCisjZGVmaW5lIFJFR19SQV9UUllfUkFURV9BR0dfTE1UCQkweDA0Q0YKKyNkZWZpbmUgUkVHX0VBUkxZX01PREVfQ09OVFJPTAkJCTB4MDREMAorI2RlZmluZSBSRUdfTlFPU19TRVEJCQkJMHgwNERDCisjZGVmaW5lIFJFR19RT1NfU0VRCQkJCQkweDA0REUKKyNkZWZpbmUgUkVHX05FRURfQ1BVX0hBTkRMRQkJCTB4MDRFMAorI2RlZmluZSBSRUdfUEtUX0xPU0VfUlBUCQkJMHgwNEUxCisjZGVmaW5lIFJFR19QVENMX0VSUl9TVEFUVVMJCQkweDA0RTIKKyNkZWZpbmUgUkVHX1RYX1JQVF9DVFJMCQkJCTB4MDRFQworI2RlZmluZSBSRUdfVFhfUlBUX1RJTUUJCQkJMHgwNEYwCisjZGVmaW5lIFJFR19EVU1NWQkJCQkJMHgwNEZDCisKKyNkZWZpbmUgUkVHX0VEQ0FfVk9fUEFSQU0JCQkweDA1MDAKKyNkZWZpbmUgUkVHX0VEQ0FfVklfUEFSQU0JCQkweDA1MDQKKyNkZWZpbmUgUkVHX0VEQ0FfQkVfUEFSQU0JCQkweDA1MDgKKyNkZWZpbmUgUkVHX0VEQ0FfQktfUEFSQU0JCQkweDA1MEMKKyNkZWZpbmUgUkVHX0JDTlRDRkcJCQkJCTB4MDUxMAorI2RlZmluZSBSRUdfUElGUwkJCQkJMHgwNTEyCisjZGVmaW5lIFJFR19SREdfUElGUwkJCQkweDA1MTMKKyNkZWZpbmUgUkVHX1NJRlNfQ1RYCQkJCTB4MDUxNAorI2RlZmluZSBSRUdfU0lGU19UUlgJCQkJMHgwNTE2CisjZGVmaW5lIFJFR19BR0dSX0JSRUFLX1RJTUUJCQkweDA1MUEKKyNkZWZpbmUgUkVHX1NMT1QJCQkJCTB4MDUxQgorI2RlZmluZSBSRUdfVFhfUFRDTF9DVFJMCQkJMHgwNTIwCisjZGVmaW5lIFJFR19UWFBBVVNFCQkJCQkweDA1MjIKKyNkZWZpbmUgUkVHX0RJU19UWFJFUV9DTFIJCQkweDA1MjMKKyNkZWZpbmUgUkVHX1JEX0NUUkwJCQkJCTB4MDUyNAorI2RlZmluZSBSRUdfVEJUVF9QUk9ISUJJVAkJCTB4MDU0MAorI2RlZmluZSBSRUdfUkRfTkFWX05YVAkJCQkweDA1NDQKKyNkZWZpbmUgUkVHX05BVl9QUk9UX0xFTgkJCTB4MDU0NgorI2RlZmluZSBSRUdfQkNOX0NUUkwJCQkJMHgwNTUwCisjZGVmaW5lIFJFR19VU1RJTUVfVFNGCQkJCTB4MDU1MQorI2RlZmluZSBSRUdfTUJJRF9OVU0JCQkJMHgwNTUyCisjZGVmaW5lIFJFR19EVUFMX1RTRl9SU1QJCQkweDA1NTMKKyNkZWZpbmUgUkVHX0JDTl9JTlRFUlZBTAkJCTB4MDU1NAorI2RlZmluZSBSRUdfTUJTU0lEX0JDTl9TUEFDRQkJMHgwNTU0CisjZGVmaW5lIFJFR19EUlZFUkxZSU5UCQkJCTB4MDU1OAorI2RlZmluZSBSRUdfQkNORE1BVElNCQkJCTB4MDU1OQorI2RlZmluZSBSRUdfQVRJTVdORAkJCQkJMHgwNTVBCisjZGVmaW5lIFJFR19CQ05fTUFYX0VSUgkJCQkweDA1NUQKKyNkZWZpbmUgUkVHX1JYVFNGX09GRlNFVF9DQ0sJCTB4MDU1RQorI2RlZmluZSBSRUdfUlhUU0ZfT0ZGU0VUX09GRE0JCTB4MDU1RgorI2RlZmluZSBSRUdfVFNGVFIJCQkJCTB4MDU2MAorI2RlZmluZSBSRUdfSU5JVF9UU0ZUUgkJCQkweDA1NjQKKyNkZWZpbmUgUkVHX1NFQ09OREFSWV9DQ0FfQ1RSTAkJMHgwNTc3CisjZGVmaW5lIFJFR19QU1RJTUVSCQkJCQkweDA1ODAKKyNkZWZpbmUgUkVHX1RJTUVSMAkJCQkJMHgwNTg0CisjZGVmaW5lIFJFR19USU1FUjEJCQkJCTB4MDU4OAorI2RlZmluZSBSRUdfQUNNSFdDVFJMCQkJCTB4MDVDMAorI2RlZmluZSBSRUdfQUNNUlNUQ1RSTAkJCQkweDA1QzEKKyNkZWZpbmUgUkVHX0FDTUFWRwkJCQkJMHgwNUMyCisjZGVmaW5lIFJFR19WT19BRE1USU1FCQkJCTB4MDVDNAorI2RlZmluZSBSRUdfVklfQURNVElNRQkJCQkweDA1QzYKKyNkZWZpbmUgUkVHX0JFX0FETVRJTUUJCQkJMHgwNUM4CisjZGVmaW5lIFJFR19FRENBX1JBTkRPTV9HRU4JCQkweDA1Q0MKKyNkZWZpbmUgUkVHX05PQV9ERVNDX1NFTAkJCTB4MDVDRgorI2RlZmluZSBSRUdfTk9BX0RFU0NfRFVSQVRJT04JCTB4MDVFMAorI2RlZmluZSBSRUdfTk9BX0RFU0NfSU5URVJWQUwJCTB4MDVFNAorI2RlZmluZSBSRUdfTk9BX0RFU0NfU1RBUlQJCQkweDA1RTgKKyNkZWZpbmUgUkVHX05PQV9ERVNDX0NPVU5UCQkJMHgwNUVDCisjZGVmaW5lIFJFR19TQ0hfVFhfQ01ECQkJCTB4MDVGOAorCisjZGVmaW5lIFJFR19BUFNEX0NUUkwJCQkJMHgwNjAwCisjZGVmaW5lIFJFR19CV09QTU9ERQkJCQkweDA2MDMKKyNkZWZpbmUgUkVHX1RDUgkJCQkJCTB4MDYwNAorI2RlZmluZSBSRUdfUkNSCQkJCQkJMHgwNjA4CisjZGVmaW5lIFJFR19SWF9QS1RfTElNSVQJCQkweDA2MEMKKyNkZWZpbmUgUkVHX1JYX0RMS19USU1FCQkJCTB4MDYwRAorI2RlZmluZSBSRUdfUlhfRFJWSU5GT19TWgkJCTB4MDYwRgorCisjZGVmaW5lIFJFR19NQUNJRAkJCQkJMHgwNjEwCisjZGVmaW5lIFJFR19CU1NJRAkJCQkJMHgwNjE4CisjZGVmaW5lIFJFR19NQVIJCQkJCQkweDA2MjAKKyNkZWZpbmUgUkVHX01CSURDQU1DRkcJCQkJMHgwNjI4CisKKyNkZWZpbmUgUkVHX1VTVElNRV9FRENBCQkJCTB4MDYzOAorI2RlZmluZSBSRUdfTUFDX1NQRUNfU0lGUwkJCTB4MDYzQQorI2RlZmluZSBSRUdfUkVTUF9TSUZTX0NDSwkJCTB4MDYzQworI2RlZmluZSBSRUdfUkVTUF9TSUZTX09GRE0JCQkweDA2M0UKKyNkZWZpbmUgUkVHX0FDS1RPCQkJCQkweDA2NDAKKyNkZWZpbmUgUkVHX0NUUzJUTwkJCQkJMHgwNjQxCisjZGVmaW5lIFJFR19FSUZTCQkJCQkweDA2NDIKKworI2RlZmluZSBSRUdfTkFWX0NUUkwJCQkJMHgwNjUwCisjZGVmaW5lIFJFR19OQVZfVVBQRVIJCQkJMHgwNjUyCisjZGVmaW5lIFJFR19CQUNBTUNNRAkJCQkweDA2NTQKKyNkZWZpbmUgUkVHX0JBQ0FNQ09OVEVOVAkJCTB4MDY1OAorI2RlZmluZSBSRUdfTEJETFkJCQkJCTB4MDY2MAorI2RlZmluZSBSRUdfRldETFkJCQkJCTB4MDY2MQorI2RlZmluZSBSRUdfUlhFUlJfUlBUCQkJCTB4MDY2NAorI2RlZmluZSBSRUdfVFJYUFRDTF9DVEwJCQkJMHgwNjY4CisKKyNkZWZpbmUgUkVHX0NBTUNNRAkJCQkJMHgwNjcwCisjZGVmaW5lIFJFR19DQU1XUklURQkJCQkweDA2NzQKKyNkZWZpbmUgUkVHX0NBTVJFQUQJCQkJCTB4MDY3OAorI2RlZmluZSBSRUdfQ0FNREJHCQkJCQkweDA2N0MKKyNkZWZpbmUgUkVHX1NFQ0NGRwkJCQkJMHgwNjgwCisKKyNkZWZpbmUgUkVHX1dPV19DVFJMCQkJCTB4MDY5MAorI2RlZmluZSBSRUdfUFNTVEFUVVMJCQkJMHgwNjkxCisjZGVmaW5lIFJFR19QU19SWF9JTkZPCQkJCTB4MDY5MgorI2RlZmluZSBSRUdfVUFQU0RfVElECQkJCTB4MDY5MworI2RlZmluZSBSRUdfTFBOQVZfQ1RSTAkJCQkweDA2OTQKKyNkZWZpbmUgUkVHX1dLRk1DQU1fTlVNCQkJCTB4MDY5OAorI2RlZmluZSBSRUdfV0tGTUNBTV9SV0QJCQkJMHgwNjlDCisjZGVmaW5lIFJFR19SWEZMVE1BUDAJCQkJMHgwNkEwCisjZGVmaW5lIFJFR19SWEZMVE1BUDEJCQkJMHgwNkEyCisjZGVmaW5lIFJFR19SWEZMVE1BUDIJCQkJMHgwNkE0CisjZGVmaW5lIFJFR19CQ05fUFNSX1JQVAkJCQkweDA2QTgKKyNkZWZpbmUgUkVHX0NBTEIzMktfQ1RSTAkJCTB4MDZBQworI2RlZmluZSBSRUdfUEtUX01PTl9DVFJMCQkJMHgwNkI0CisjZGVmaW5lIFJFR19CVF9DT0VYX1RBQkxFCQkJMHgwNkMwCisjZGVmaW5lIFJFR19XTUFDX1JFU1BfVFhJTkZPCQkweDA2RDgKKworI2RlZmluZSBSRUdfVVNCX0lORk8JCQkJMHhGRTE3CisjZGVmaW5lIFJFR19VU0JfU1BFQ0lBTF9PUFRJT04JCTB4RkU1NQorI2RlZmluZSBSRUdfVVNCX0RNQV9BR0dfVE8JCQkweEZFNUIKKyNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkJMHhGRTVDCisjZGVmaW5lIFJFR19VU0JfQUdHX1RICQkJCTB4RkU1RAorCisjZGVmaW5lIFJFR19URVNUX1VTQl9UWFFTCQkJMHhGRTQ4CisjZGVmaW5lIFJFR19URVNUX1NJRV9WSUQJCQkweEZFNjAKKyNkZWZpbmUgUkVHX1RFU1RfU0lFX1BJRAkJCTB4RkU2MgorI2RlZmluZSBSRUdfVEVTVF9TSUVfT1BUSU9OQUwJCTB4RkU2NAorI2RlZmluZSBSRUdfVEVTVF9TSUVfQ0hJUlBfSwkJMHhGRTY1CisjZGVmaW5lIFJFR19URVNUX1NJRV9QSFkJCQkweEZFNjYKKyNkZWZpbmUgUkVHX1RFU1RfU0lFX01BQ19BRERSCQkweEZFNzAKKyNkZWZpbmUgUkVHX1RFU1RfU0lFX1NUUklORwkJCTB4RkU4MAorCisjZGVmaW5lIFJFR19OT1JNQUxfU0lFX1ZJRAkJCTB4RkU2MAorI2RlZmluZSBSRUdfTk9STUFMX1NJRV9QSUQJCQkweEZFNjIKKyNkZWZpbmUgUkVHX05PUk1BTF9TSUVfT1BUSU9OQUwJCTB4RkU2NAorI2RlZmluZSBSRUdfTk9STUFMX1NJRV9FUAkJCTB4RkU2NQorI2RlZmluZSBSRUdfTk9STUFMX1NJRV9QSFkJCQkweEZFNjgKKyNkZWZpbmUgUkVHX05PUk1BTF9TSUVfTUFDX0FERFIJCTB4RkU3MAorI2RlZmluZSBSRUdfTk9STUFMX1NJRV9TVFJJTkcJCTB4RkU4MAorCisjZGVmaW5lCUNSOTM0NgkJCQlSRUdfOTM0NkNSCisjZGVmaW5lCU1TUgkJCQkoUkVHX0NSICsgMikKKyNkZWZpbmUJSVNSCQkJCVJFR19ISVNSCisjZGVmaW5lCVRTRlIJCQkJUkVHX1RTRlRSCisKKyNkZWZpbmUJTUFDSURSMAkJCQlSRUdfTUFDSUQKKyNkZWZpbmUJTUFDSURSNAkJCQkoUkVHX01BQ0lEICsgNCkKKworI2RlZmluZSBQQlAJCQkJUkVHX1BCUAorCisjZGVmaW5lCUlEUjAJCQkJTUFDSURSMAorI2RlZmluZQlJRFI0CQkJCU1BQ0lEUjQKKworI2RlZmluZQlVTlVTRURfUkVHSVNURVIJCQkweDFCRgorI2RlZmluZQlEQ0FNCQkJCVVOVVNFRF9SRUdJU1RFUgorI2RlZmluZQlQU1IJCQkJVU5VU0VEX1JFR0lTVEVSCisjZGVmaW5lIEJCQUREUgkJCQlVTlVTRURfUkVHSVNURVIKKyNkZWZpbmUJUEhZREFUQVIJCQlVTlVTRURfUkVHSVNURVIKKworI2RlZmluZQlJTlZBTElEX0JCUkZfVkFMVUUJCTB4MTIzNDU2NzgKKworI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMlQgCQkweDEzCisjZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8xVCAJCTB4MEEKKworI2RlZmluZQlDTURFRVBST01fRU4JCQlCSVQoNSkKKyNkZWZpbmUJQ01ERUVQUk9NX1NFTAkJCUJJVCg0KQorI2RlZmluZQlDTUQ5MzQ2Q1JfOTM1NlNFTAkJQklUKDQpCisjZGVmaW5lCUFVVE9MT0FEX0VFUFJPTQkJCShDTURFRVBST01fRU58Q01ERUVQUk9NX1NFTCkKKyNkZWZpbmUJQVVUT0xPQURfRUZVU0UJCQlDTURFRVBST01fRU4KKworI2RlZmluZQlHUElPU0VMX0dQSU8JCQkwCisjZGVmaW5lCUdQSU9TRUxfRU5CVAkJCUJJVCg1KQorCisjZGVmaW5lCUdQSU9fSU4JCQkJUkVHX0dQSU9fUElOX0NUUkwKKyNkZWZpbmUJR1BJT19PVVQJCQkoUkVHX0dQSU9fUElOX0NUUkwrMSkKKyNkZWZpbmUJR1BJT19JT19TRUwJCQkoUkVHX0dQSU9fUElOX0NUUkwrMikKKyNkZWZpbmUJR1BJT19NT0QJCQkoUkVHX0dQSU9fUElOX0NUUkwrMykKKworLyogICAgICA4NzIzLzgxODhFIEhvc3QgU3lzdGVtIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIChvZmZzZXQgMHg1OCwgMzIgYnl0ZSkgKi8KKyNkZWZpbmUJSFNJTVJfR1BJTzEyXzBfSU5UX0VOCQkJQklUKDApCisjZGVmaW5lCUhTSU1SX1NQU19PQ1BfSU5UX0VOCQkJQklUKDUpCisjZGVmaW5lCUhTSU1SX1JPTl9JTlRfRU4JCQlCSVQoNikKKyNkZWZpbmUJSFNJTVJfUEROX0lOVF9FTgkJCUJJVCg3KQorI2RlZmluZQlIU0lNUl9HUElPOV9JTlRfRU4JCQlCSVQoMjUpCisKKworLyoKKyogICAgICAgODcyMy84MTg4RSBIb3N0IFN5c3RlbSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChvZmZzZXQgMHg1QywgMzIgYnl0ZSkKKyovCisjZGVmaW5lCUhTSVNSX0dQSU8xMl8wX0lOVAkJCUJJVCgwKQorI2RlZmluZQlIU0lTUl9TUFNfT0NQX0lOVAkJCUJJVCg1KQorI2RlZmluZQlIU0lTUl9ST05fSU5UX0VOCQkJQklUKDYpCisjZGVmaW5lCUhTSVNSX1BETklOVAkJCQlCSVQoNykKKyNkZWZpbmUJSFNJU1JfR1BJTzlfSU5UCQkJCUJJVCgyNSkKKworI2RlZmluZQlNU1JfTk9MSU5LCQkJCQkweDAwCisjZGVmaW5lCU1TUl9BREhPQwkJCQkJMHgwMQorI2RlZmluZQlNU1JfSU5GUkEJCQkJCTB4MDIKKyNkZWZpbmUJTVNSX0FQCQkJCQkJMHgwMworCisjZGVmaW5lCVJSU1JfUlNDX09GRlNFVAkJCQkyMQorI2RlZmluZQlSUlNSX1NIT1JUX09GRlNFVAkJCTIzCisjZGVmaW5lCVJSU1JfUlNDX0JXXzQwTQkJCQkweDYwMDAwMAorI2RlZmluZQlSUlNSX1JTQ19VUFNVQkNITkwJCQkweDQwMDAwMAorI2RlZmluZQlSUlNSX1JTQ19MT1dTVUJDSE5MCQkJMHgyMDAwMDAKKyNkZWZpbmUJUlJTUl9TSE9SVAkJCQkJMHg4MDAwMDAKKyNkZWZpbmUJUlJTUl8xTQkJCQkJCUJJVCgwKQorI2RlZmluZQlSUlNSXzJNCQkJCQkJQklUKDEpCisjZGVmaW5lCVJSU1JfNV81TQkJCQkJQklUKDIpCisjZGVmaW5lCVJSU1JfMTFNCQkJCQlCSVQoMykKKyNkZWZpbmUJUlJTUl82TQkJCQkJCUJJVCg0KQorI2RlZmluZQlSUlNSXzlNCQkJCQkJQklUKDUpCisjZGVmaW5lCVJSU1JfMTJNCQkJCQlCSVQoNikKKyNkZWZpbmUJUlJTUl8xOE0JCQkJCUJJVCg3KQorI2RlZmluZQlSUlNSXzI0TQkJCQkJQklUKDgpCisjZGVmaW5lCVJSU1JfMzZNCQkJCQlCSVQoOSkKKyNkZWZpbmUJUlJTUl80OE0JCQkJCUJJVCgxMCkKKyNkZWZpbmUJUlJTUl81NE0JCQkJCUJJVCgxMSkKKyNkZWZpbmUJUlJTUl9NQ1MwCQkJCQlCSVQoMTIpCisjZGVmaW5lCVJSU1JfTUNTMQkJCQkJQklUKDEzKQorI2RlZmluZQlSUlNSX01DUzIJCQkJCUJJVCgxNCkKKyNkZWZpbmUJUlJTUl9NQ1MzCQkJCQlCSVQoMTUpCisjZGVmaW5lCVJSU1JfTUNTNAkJCQkJQklUKDE2KQorI2RlZmluZQlSUlNSX01DUzUJCQkJCUJJVCgxNykKKyNkZWZpbmUJUlJTUl9NQ1M2CQkJCQlCSVQoMTgpCisjZGVmaW5lCVJSU1JfTUNTNwkJCQkJQklUKDE5KQorI2RlZmluZQlCUlNSX0FDS1NIT1JUUE1CCQkJQklUKDIzKQorCisjZGVmaW5lCVJBVFJfMU0JCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lCVJBVFJfMk0JCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCVJBVFJfNTVNCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lCVJBVFJfMTFNCQkJCQkweDAwMDAwMDA4CisjZGVmaW5lCVJBVFJfNk0JCQkJCQkweDAwMDAwMDEwCisjZGVmaW5lCVJBVFJfOU0JCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lCVJBVFJfMTJNCQkJCQkweDAwMDAwMDQwCisjZGVmaW5lCVJBVFJfMThNCQkJCQkweDAwMDAwMDgwCisjZGVmaW5lCVJBVFJfMjRNCQkJCQkweDAwMDAwMTAwCisjZGVmaW5lCVJBVFJfMzZNCQkJCQkweDAwMDAwMjAwCisjZGVmaW5lCVJBVFJfNDhNCQkJCQkweDAwMDAwNDAwCisjZGVmaW5lCVJBVFJfNTRNCQkJCQkweDAwMDAwODAwCisjZGVmaW5lCVJBVFJfTUNTMAkJCQkJMHgwMDAwMTAwMAorI2RlZmluZQlSQVRSX01DUzEJCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUJUkFUUl9NQ1MyCQkJCQkweDAwMDA0MDAwCisjZGVmaW5lCVJBVFJfTUNTMwkJCQkJMHgwMDAwODAwMAorI2RlZmluZQlSQVRSX01DUzQJCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M1CQkJCQkweDAwMDIwMDAwCisjZGVmaW5lCVJBVFJfTUNTNgkJCQkJMHgwMDA0MDAwMAorI2RlZmluZQlSQVRSX01DUzcJCQkJCTB4MDAwODAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M4CQkJCQkweDAwMTAwMDAwCisjZGVmaW5lCVJBVFJfTUNTOQkJCQkJMHgwMDIwMDAwMAorI2RlZmluZQlSQVRSX01DUzEwCQkJCQkweDAwNDAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTEJCQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMgkJCQkJMHgwMTAwMDAwMAorI2RlZmluZQlSQVRSX01DUzEzCQkJCQkweDAyMDAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTQJCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxNQkJCQkJMHgwODAwMDAwMAorCisjZGVmaW5lIFJBVEVfMU0JCQkJCQlCSVQoMCkKKyNkZWZpbmUgUkFURV8yTQkJCQkJCUJJVCgxKQorI2RlZmluZSBSQVRFXzVfNU0JCQkJCUJJVCgyKQorI2RlZmluZSBSQVRFXzExTQkJCQkJQklUKDMpCisjZGVmaW5lIFJBVEVfNk0JCQkJCQlCSVQoNCkKKyNkZWZpbmUgUkFURV85TQkJCQkJCUJJVCg1KQorI2RlZmluZSBSQVRFXzEyTQkJCQkJQklUKDYpCisjZGVmaW5lIFJBVEVfMThNCQkJCQlCSVQoNykKKyNkZWZpbmUgUkFURV8yNE0JCQkJCUJJVCg4KQorI2RlZmluZSBSQVRFXzM2TQkJCQkJQklUKDkpCisjZGVmaW5lIFJBVEVfNDhNCQkJCQlCSVQoMTApCisjZGVmaW5lIFJBVEVfNTRNCQkJCQlCSVQoMTEpCisjZGVmaW5lIFJBVEVfTUNTMAkJCQkJQklUKDEyKQorI2RlZmluZSBSQVRFX01DUzEJCQkJCUJJVCgxMykKKyNkZWZpbmUgUkFURV9NQ1MyCQkJCQlCSVQoMTQpCisjZGVmaW5lIFJBVEVfTUNTMwkJCQkJQklUKDE1KQorI2RlZmluZSBSQVRFX01DUzQJCQkJCUJJVCgxNikKKyNkZWZpbmUgUkFURV9NQ1M1CQkJCQlCSVQoMTcpCisjZGVmaW5lIFJBVEVfTUNTNgkJCQkJQklUKDE4KQorI2RlZmluZSBSQVRFX01DUzcJCQkJCUJJVCgxOSkKKyNkZWZpbmUgUkFURV9NQ1M4CQkJCQlCSVQoMjApCisjZGVmaW5lIFJBVEVfTUNTOQkJCQkJQklUKDIxKQorI2RlZmluZSBSQVRFX01DUzEwCQkJCQlCSVQoMjIpCisjZGVmaW5lIFJBVEVfTUNTMTEJCQkJCUJJVCgyMykKKyNkZWZpbmUgUkFURV9NQ1MxMgkJCQkJQklUKDI0KQorI2RlZmluZSBSQVRFX01DUzEzCQkJCQlCSVQoMjUpCisjZGVmaW5lIFJBVEVfTUNTMTQJCQkJCUJJVCgyNikKKyNkZWZpbmUgUkFURV9NQ1MxNQkJCQkJQklUKDI3KQorCisjZGVmaW5lCVJBVEVfQUxMX0NDSwkJKFJBVFJfMU0gfCBSQVRSXzJNIHwgUkFUUl81NU0gfCBSQVRSXzExTSkKKyNkZWZpbmUJUkFURV9BTExfT0ZETV9BRwkoUkFUUl82TSB8IFJBVFJfOU0gfCBSQVRSXzEyTSB8IFJBVFJfMThNIHxcCisJCQkJCQkJUkFUUl8yNE18IFJBVFJfMzZNIHwgUkFUUl80OE0gfCBSQVRSXzU0TSkKKyNkZWZpbmUJUkFURV9BTExfT0ZETV8xU1MJKFJBVFJfTUNTMCB8IFJBVFJfTUNTMSB8IFJBVFJfTUNTMiB8XAorCQkJCQkJCVJBVFJfTUNTMyB8IFJBVFJfTUNTNCB8IFJBVFJfTUNTNSB8XAorCQkJCQkJCVJBVFJfTUNTNiB8IFJBVFJfTUNTNykKKyNkZWZpbmUJUkFURV9BTExfT0ZETV8yU1MJKFJBVFJfTUNTOCB8IFJBVFJfTUNTOSB8IFJBVFJfTUNTMTAgfFwKKwkJCQkJCQlSQVRSX01DUzExfCBSQVRSX01DUzEyIHwgUkFUUl9NQ1MxMyB8XAorCQkJCQkJCVJBVFJfTUNTMTQgfCBSQVRSX01DUzE1KQorCisjZGVmaW5lCUJXX09QTU9ERV8yME1IWgkJCQlCSVQoMikKKyNkZWZpbmUJQldfT1BNT0RFXzVHCQkJCUJJVCgxKQorI2RlZmluZQlCV19PUE1PREVfMTFKCQkJCUJJVCgwKQorCisjZGVmaW5lCUNBTV9WQUxJRAkJCQkJQklUKDE1KQorI2RlZmluZQlDQU1fTk9UVkFMSUQJCQkJMHgwMDAwCisjZGVmaW5lCUNBTV9VU0VESwkJCQkJQklUKDUpCisKKyNkZWZpbmUJQ0FNX05PTkUJCQkJCTB4MAorI2RlZmluZQlDQU1fV0VQNDAJCQkJCTB4MDEKKyNkZWZpbmUJQ0FNX1RLSVAJCQkJCTB4MDIKKyNkZWZpbmUJQ0FNX0FFUwkJCQkJCTB4MDQKKyNkZWZpbmUJQ0FNX1dFUDEwNAkJCQkJMHgwNQorCisjZGVmaW5lCVRPVEFMX0NBTV9FTlRSWQkJCQkzMgorI2RlZmluZQlIQUxGX0NBTV9FTlRSWQkJCQkxNgorCisjZGVmaW5lCUNBTV9XUklURQkJCQkJQklUKDE2KQorI2RlZmluZQlDQU1fUkVBRAkJCQkJMHgwMDAwMDAwMAorI2RlZmluZQlDQU1fUE9MTElOSUcJCQkJQklUKDMxKQorCisjZGVmaW5lCVNDUl9VU0VESwkJCQkJMHgwMQorI2RlZmluZQlTQ1JfVFhTRUNfRU5BQkxFCQkJMHgwMgorI2RlZmluZQlTQ1JfUlhTRUNfRU5BQkxFCQkJMHgwNAorCisjZGVmaW5lCVdPV19QTUVOCQkJCQlCSVQoMCkKKyNkZWZpbmUJV09XX1dPTUVOCQkJCQlCSVQoMSkKKyNkZWZpbmUJV09XX01BR0lDCQkJCQlCSVQoMikKKyNkZWZpbmUJV09XX1VXRgkJCQkJCUJJVCgzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgIDgxODggSU1SL0lTUiBiaXRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlJTVJfRElTQUJMRUQJCQkweDAKKy8qIElNUiBEVzAoMHgwMDYwLTAwNjMpIEJpdCAwLTMxICovCisjZGVmaW5lCUlNUl9UWENDSwkJCQlCSVQoMzApCQkvKiBUWFJQVCBpbnRlcnJ1cHQgd2hlbiBDQ1ggYml0IG9mIHRoZSBwYWNrZXQgaXMgc2V0CSovCisjZGVmaW5lCUlNUl9QU1RJTUVPVVQJCQlCSVQoMjkpCQkvKiBQb3dlciBTYXZlIFRpbWUgT3V0IEludGVycnVwdCAqLworI2RlZmluZQlJTVJfR1RJTlQ0CQkJCUJJVCgyOCkJCS8qIFdoZW4gR1RJTUVSNCBleHBpcmVzLCB0aGlzIGJpdCBpcyBzZXQgdG8gMQkqLworI2RlZmluZQlJTVJfR1RJTlQzCQkJCUJJVCgyNykJCS8qIFdoZW4gR1RJTUVSMyBleHBpcmVzLCB0aGlzIGJpdCBpcyBzZXQgdG8gMQkqLworI2RlZmluZQlJTVJfVEJERVIJCQkJQklUKDI2KQkJLyogVHJhbnNtaXQgQmVhY29uMCBFcnJvcgkJCSovCisjZGVmaW5lCUlNUl9UQkRPSwkJCQlCSVQoMjUpCQkvKiBUcmFuc21pdCBCZWFjb24wIE9LCQkJKi8KKyNkZWZpbmUJSU1SX1RTRl9CSVQzMl9UT0dHTEUJCUJJVCgyNCkJCS8qIFRTRiBUaW1lciBCSVQzMiB0b2dnbGUgaW5kaWNhdGlvbiBpbnRlcnJ1cHQJCSovCisjZGVmaW5lCUlNUl9CQ05ETUFJTlQwCQkJQklUKDIwKQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMAkJCSovCisjZGVmaW5lCUlNUl9CQ05ET0swCQkJCUJJVCgxNikJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0swCQkJKi8KKyNkZWZpbmUJSU1SX0hTSVNSX0lORF9PTl9JTlQJCUJJVCgxNSkJCS8qIEhTSVNSIEluZGljYXRvciAoSFNJTVIgJiBIU0lTUiBpcyB0cnVlLCB0aGlzIGJpdCBpcyBzZXQgdG8gMSkJCSovCisjZGVmaW5lCUlNUl9CQ05ETUFJTlRfRQkJCUJJVCgxNCkJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IEV4dGVuc2lvbiBmb3IgV2luNwkJCSovCisjZGVmaW5lCUlNUl9BVElNRU5ECQkJCUJJVCgxMikJCS8qIENUV2lkbm93IEVuZCBvciBBVElNIFdpbmRvdyBFbmQgKi8KKyNkZWZpbmUJSU1SX0hJU1IxX0lORF9JTlQJCQlCSVQoMTEpCQkvKiBISVNSMSBJbmRpY2F0b3IgKEhJU1IxICYgSElNUjEgaXMgdHJ1ZSwgdGhpcyBiaXQgaXMgc2V0IHRvIDEpKi8KKyNkZWZpbmUJSU1SX0MySENNRAkJCQlCSVQoMTApCQkvKiBDUFUgdG8gSG9zdCBDb21tYW5kIElOVCBTdGF0dXMsIFdyaXRlIDEgY2xlYXIJKi8KKyNkZWZpbmUJSU1SX0NQV00yCQkJQklUKDkpCQkJLyogQ1BVIHBvd2VyIE1vZGUgZXhjaGFuZ2UgSU5UIFN0YXR1cywgV3JpdGUgMSBjbGVhcgkqLworI2RlZmluZQlJTVJfQ1BXTQkJCQlCSVQoOCkJCQkvKiBDUFUgcG93ZXIgTW9kZSBleGNoYW5nZSBJTlQgU3RhdHVzLCBXcml0ZSAxIGNsZWFyCSovCisjZGVmaW5lCUlNUl9ISUdIRE9LCQkJCUJJVCg3KQkJCS8qIEhpZ2ggUXVldWUgRE1BIE9LCSovCisjZGVmaW5lCUlNUl9NR05URE9LCQkJCUJJVCg2KQkJCS8qIE1hbmFnZW1lbnQgUXVldWUgRE1BIE9LCSovCisjZGVmaW5lCUlNUl9CS0RPSwkJCQlCSVQoNSkJCQkvKiBBQ19CSyBETUEgT0sJCSovCisjZGVmaW5lCUlNUl9CRURPSwkJCQlCSVQoNCkJCS8qIEFDX0JFIERNQSBPSwkqLworI2RlZmluZQlJTVJfVklET0sJCQkJQklUKDMpCQkJLyogQUNfVkkgRE1BIE9LCSovCisjZGVmaW5lCUlNUl9WT0RPSwkJCQlCSVQoMikJCQkvKiBBQ19WTyBETUEgT0sJKi8KKyNkZWZpbmUJSU1SX1JEVQkJCQlCSVQoMSkJCQkvKiBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlCSovCisjZGVmaW5lCUlNUl9ST0sJCQkJQklUKDApCQkJLyogUmVjZWl2ZSBETUEgT0sgKi8KKworLyogSU1SIERXMSgweDAwQjQtMDBCNykgQml0IDAtMzEgKi8KKyNkZWZpbmUJSU1SX0JDTkRNQUlOVDcJCQlCSVQoMjcpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCA3IAkqLworI2RlZmluZQlJTVJfQkNORE1BSU5UNgkJCUJJVCgyNikJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDYJCSovCisjZGVmaW5lCUlNUl9CQ05ETUFJTlQ1CQkJQklUKDI1KQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNQkJKi8KKyNkZWZpbmUJSU1SX0JDTkRNQUlOVDQJCQlCSVQoMjQpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCA0CQkqLworI2RlZmluZQlJTVJfQkNORE1BSU5UMwkJCUJJVCgyMykJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDMJCSovCisjZGVmaW5lCUlNUl9CQ05ETUFJTlQyCQkJQklUKDIyKQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMgkJKi8KKyNkZWZpbmUJSU1SX0JDTkRNQUlOVDEJCQlCSVQoMjEpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAxCQkqLworI2RlZmluZQlJTVJfQkNORE9LNwkJCQlCSVQoMjApCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDcgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzYJCQkJQklUKDE5KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA2ICovCisjZGVmaW5lCUlNUl9CQ05ET0s1CQkJCUJJVCgxOCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNSAqLworI2RlZmluZQlJTVJfQkNORE9LNAkJCQlCSVQoMTcpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDQgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzMJCQkJQklUKDE2KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAzICovCisjZGVmaW5lCUlNUl9CQ05ET0syCQkJCUJJVCgxNSkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMiAqLworI2RlZmluZQlJTVJfQkNORE9LMQkJCQlCSVQoMTQpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDEgKi8KKyNkZWZpbmUJSU1SX0FUSU1FTkRfRQkJQklUKDEzKQkJLyogQVRJTSBXaW5kb3cgRW5kIEV4dGVuc2lvbiBmb3IgV2luNyAqLworI2RlZmluZQlJTVJfVFhFUlIJCQkJQklUKDExKQkJLyogVHggRXJyb3IgRmxhZyBJbnRlcnJ1cHQgU3RhdHVzLCB3cml0ZSAxIGNsZWFyLiAqLworI2RlZmluZQlJTVJfUlhFUlIJCQkJQklUKDEwKQkJLyogUnggRXJyb3IgRmxhZyBJTlQgU3RhdHVzLCBXcml0ZSAxIGNsZWFyICovCisjZGVmaW5lCUlNUl9UWEZPVlcJCQkJQklUKDkpCQkJLyogVHJhbnNtaXQgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZQlJTVJfUlhGT1ZXCQkJCUJJVCg4KQkJCS8qIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLworCisKKyNkZWZpbmUJSFdTRVRfTUFYX1NJWkUJCQkJNTEyCisjZGVmaW5lICAgRUZVU0VfTUFYX1NFQ1RJT04JCQk2NAorI2RlZmluZSAgIEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCQkyNTYKKyNkZWZpbmUgCUVGVVNFX09PQl9QUk9URUNUX0JZVEVTICAgIAkxOCAJLyogUEcgZGF0YSBleGNsdWRlIGhlYWRlciwgZHVtbXkgNyBieXRlcyBmcm9tZSBDUCB0ZXN0IGFuZCByZXNlcnZlZCAxYnl0ZS4qLworCisKKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfVFNTSQkJCQkJMHgwCisjZGVmaW5lIEVFUFJPTV9ERUZBVUxUX1RYUE9XRVJESUZGCQkJMHgwCisjZGVmaW5lIEVFUFJPTV9ERUZBVUxUX0NSWVNUQUxDQVAJCQkweDUKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfQk9BUkRUWVBFCQkJMHgwMgorI2RlZmluZSBFRVBST01fREVGQVVMVF9UWFBPV0VSCQkJCTB4MTAxMAorI2RlZmluZQlFRVBST01fREVGQVVMVF9IVDJUX1RYUFdSCQkJMHgxMAorCisjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX0xFR0FDWUhUVFhQT1dFUkRJRkYJMHgzCisjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX1RIRVJNQUxNRVRFUgkJCTB4MTgKKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfQU5UVFhQT1dFUkRJRkYJCTB4MAorI2RlZmluZQlFRVBST01fREVGQVVMVF9UWFBXRElGRl9DUllTVEFMQ0FQCTB4NQorI2RlZmluZQlFRVBST01fREVGQVVMVF9UWFBPV0VSTEVWRUwJCQkweDIyCisjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX0hUNDBfMlNESUZGCQkJMHgwCisjZGVmaW5lIEVFUFJPTV9ERUZBVUxUX0hUMjBfRElGRgkJCTIKKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfTEVHQUNZSFRUWFBPV0VSRElGRgkweDMKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfSFQ0MF9QV1JNQVhPRkZTRVQJMAorI2RlZmluZSBFRVBST01fREVGQVVMVF9IVDIwX1BXUk1BWE9GRlNFVAkwCisKKyNkZWZpbmUgUkZfT1BUSU9OMQkJCQkJCQkweDc5CisjZGVmaW5lIFJGX09QVElPTjIJCQkJCQkJMHg3QQorI2RlZmluZSBSRl9PUFRJT04zCQkJCQkJCTB4N0IKKyNkZWZpbmUgUkZfT1BUSU9ONAkJCQkJCQkweEMzCisKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfUElECQkJCQkweDEyMzQKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfVklECQkJCQkweDU2NzgKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfQ1VTVE9NRVJJRAkJCTB4QUIKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfU1VCQ1VTVE9NRVJJRAkJMHhDRAorI2RlZmluZSBFRVBST01fREVGQVVMVF9WRVJTSU9OCQkJCTAKKworI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0ZDQwkJCQkweDAKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9JQwkJCQkweDEKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9FVFNJCQkJMHgyCisjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fU1BBSU4JCQkweDMKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9GUkFOQ0UJCQkweDQKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9NS0sJCQkJMHg1CisjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fTUtLMQkJCTB4NgorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0lTUkFFTAkJCTB4NworI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX1RFTEVDCQkJMHg4CisjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fR0xPQkFMX0RPTUFJTgkweDkKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9XT1JMRF9XSURFXzEzCTB4QQorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX05DQwkJCQkweEIKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9CWV9IV19NQVNLCQkweDgwCisKKyNkZWZpbmUgRUVQUk9NX0NJRF9ERUZBVUxUCQkJCQkweDAKKyNkZWZpbmUgRUVQUk9NX0NJRF9UT1NISUJBCQkJCQkweDQKKyNkZWZpbmUJRUVQUk9NX0NJRF9DQ1gJCQkJCQkweDEwCisjZGVmaW5lCUVFUFJPTV9DSURfUU1JCQkJCQkJMHgwRAorI2RlZmluZSBFRVBST01fQ0lEX1dIUUwgCQkJCQkweEZFCisKKyNkZWZpbmUJUlRMX0VFUFJPTV9JRAkJCQkJMHg4MTI5CisKKyNkZWZpbmUgRUVQUk9NX0hQT04JCQkJCQkJMHgwMgorI2RlZmluZSBFRVBST01fQ0xLCQkJCQkJCTB4MDYKKyNkZWZpbmUgRUVQUk9NX1RFU1RSCQkJCQkJMHgwOAorCisKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJDQ0sJCQkweDEwCisjZGVmaW5lCUVFUFJPTV9UWFBPV0VSSFQ0MF8xUwkJMHgxNgorI2RlZmluZSBFRVBST01fVFhQT1dFUkhUMjBESUZGCQkweDFCCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX09GRE1ESUZGCQkweDFCCisKKworCisjZGVmaW5lCUVFUFJPTV9UWF9QV1JfSU5YCQkJCTB4MTAKKworI2RlZmluZQlFRVBST01fQ0hBTk5FTFBMQU4JCQkJCTB4QjgKKyNkZWZpbmUJRUVQUk9NX1hUQUxfODgyMUFFCQkJCQkweEI5CisjZGVmaW5lCUVFUFJPTV9USEVSTUFMX01FVEVSCQkJCTB4QkEKKyNkZWZpbmUJRUVQUk9NX0lRS19MQ0tfODhFCQkJCQkweEJCCisKKyNkZWZpbmUJRUVQUk9NX1JGX0JPQVJEX09QVElPTgkJCTB4QzEKKyNkZWZpbmUJRUVQUk9NX1JGX0ZFQVRVUkVfT1BUSU9OXzg4RQkJMHhDMgorI2RlZmluZQlFRVBST01fUkZfQlRfU0VUVElORwkJCQkweEMzCisjZGVmaW5lCUVFUFJPTV9WRVJTSU9OCQkJCQkweEM0CisjZGVmaW5lCUVFUFJPTV9DVVNUT01FUl9JRAkJCQkJMHhDNQorI2RlZmluZQlFRVBST01fUkZfQU5URU5OQV9PUFRfODhFCQkJMHhDOQorCisjZGVmaW5lCUVFUFJPTV9NQUNfQUREUgkJCQkJMHhEMAorI2RlZmluZSBFRVBST01fVklECQkJCQkJCTB4RDYKKyNkZWZpbmUgRUVQUk9NX0RJRAkJCQkJCQkweEQ4CisjZGVmaW5lIEVFUFJPTV9TVklECQkJCQkJCTB4REEKKyNkZWZpbmUgRUVQUk9NX1NNSUQJCQkJCQkweERDCisKKyNkZWZpbmUJU1RPUEJFQ09OCQkJCQlCSVQoNikKKyNkZWZpbmUJU1RPUEhJR0hUCQkJCQlCSVQoNSkKKyNkZWZpbmUJU1RPUE1HVAkJCQkJCUJJVCg0KQorI2RlZmluZQlTVE9QVk8JCQkJCQlCSVQoMykKKyNkZWZpbmUJU1RPUFZJCQkJCQkJQklUKDIpCisjZGVmaW5lCVNUT1BCRQkJCQkJCUJJVCgxKQorI2RlZmluZQlTVE9QQksJCQkJCQlCSVQoMCkKKworI2RlZmluZQlSQ1JfQVBQRkNTCQkJCQlCSVQoMzEpCisjZGVmaW5lCVJDUl9BUFBfTUlDCQkJCQlCSVQoMzApCisjZGVmaW5lCVJDUl9BUFBfSUNWCQkJCQlCSVQoMjkpCisjZGVmaW5lCVJDUl9BUFBfUEhZU1RfUlhGRgkJCUJJVCgyOCkKKyNkZWZpbmUJUkNSX0FQUF9CQV9TU04JCQkJQklUKDI3KQorI2RlZmluZQlSQ1JfTk9OUU9TX1ZIVAkJCQlCSVQoMjYpCisjZGVmaW5lCVJDUl9FTk1CSUQJCQkJCUJJVCgyNCkKKyNkZWZpbmUJUkNSX0xTSUdFTgkJCQkJQklUKDIzKQorI2RlZmluZQlSQ1JfTUZCRU4JCQkJCUJJVCgyMikKKyNkZWZpbmUJUkNSX0hUQ19MT0NfQ1RSTAkJCUJJVCgxNCkKKyNkZWZpbmUJUkNSX0FNRgkJCQkJCUJJVCgxMykKKyNkZWZpbmUJUkNSX0FDRgkJCQkJCUJJVCgxMikKKyNkZWZpbmUJUkNSX0FERgkJCQkJCUJJVCgxMSkKKyNkZWZpbmUJUkNSX0FJQ1YJCQkJCUJJVCg5KQorI2RlZmluZQlSQ1JfQUNSQzMyCQkJCQlCSVQoOCkKKyNkZWZpbmUJUkNSX0NCU1NJRF9CQ04JCQkJQklUKDcpCisjZGVmaW5lCVJDUl9DQlNTSURfREFUQQkJCQlCSVQoNikKKyNkZWZpbmUJUkNSX0NCU1NJRAkJCQkJUkNSX0NCU1NJRF9EQVRBCisjZGVmaW5lCVJDUl9BUFdSTUdUCQkJCQlCSVQoNSkKKyNkZWZpbmUJUkNSX0FERDMJCQkJCUJJVCg0KQorI2RlZmluZQlSQ1JfQUIJCQkJCQlCSVQoMykKKyNkZWZpbmUJUkNSX0FNCQkJCQkJQklUKDIpCisjZGVmaW5lCVJDUl9BUE0JCQkJCQlCSVQoMSkKKyNkZWZpbmUJUkNSX0FBUAkJCQkJCUJJVCgwKQorI2RlZmluZQlSQ1JfTVhETUFfT0ZGU0VUCQkJOAorI2RlZmluZQlSQ1JfRklGT19PRkZTRVQJCQkJMTMKKworI2RlZmluZSBSU1ZfQ1RSTAkJCQkJMHgwMDFDCisjZGVmaW5lIFJEX0NUUkwJCQkJCQkweDA1MjQKKworI2RlZmluZSBSRUdfVVNCX0lORk8JCQkJMHhGRTE3CisjZGVmaW5lIFJFR19VU0JfU1BFQ0lBTF9PUFRJT04JCTB4RkU1NQorI2RlZmluZSBSRUdfVVNCX0RNQV9BR0dfVE8JCQkweEZFNUIKKyNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkJMHhGRTVDCisjZGVmaW5lIFJFR19VU0JfQUdHX1RICQkJCTB4RkU1RAorCisjZGVmaW5lIFJFR19VU0JfVklECQkJCQkweEZFNjAKKyNkZWZpbmUgUkVHX1VTQl9QSUQJCQkJCTB4RkU2MgorI2RlZmluZSBSRUdfVVNCX09QVElPTkFMCQkJMHhGRTY0CisjZGVmaW5lIFJFR19VU0JfQ0hJUlBfSwkJCQkweEZFNjUKKyNkZWZpbmUgUkVHX1VTQl9QSFkJCQkJCTB4RkU2NgorI2RlZmluZSBSRUdfVVNCX01BQ19BRERSCQkJMHhGRTcwCisjZGVmaW5lIFJFR19VU0JfSFJQV00JCQkJMHhGRTU4CisjZGVmaW5lIFJFR19VU0JfSENQV00JCQkJMHhGRTU3CisKKyNkZWZpbmUgU1cxOF9GUFdNCQkJCQlCSVQoMykKKworI2RlZmluZSBJU09fTUQyUFAJCQkJCUJJVCgwKQorI2RlZmluZSBJU09fVUEyVVNCCQkJCQlCSVQoMSkKKyNkZWZpbmUgSVNPX1VEMkNPUkUJCQkJCUJJVCgyKQorI2RlZmluZSBJU09fUEEyUENJRQkJCQkJQklUKDMpCisjZGVmaW5lIElTT19QRDJDT1JFCQkJCQlCSVQoNCkKKyNkZWZpbmUgSVNPX0lQMk1BQwkJCQkJQklUKDUpCisjZGVmaW5lIElTT19ESU9QCQkJCQlCSVQoNikKKyNkZWZpbmUgSVNPX0RJT0UJCQkJCUJJVCg3KQorI2RlZmluZSBJU09fRUIyQ09SRQkJCQkJQklUKDgpCisjZGVmaW5lIElTT19ESU9SCQkJCQlCSVQoOSkKKworI2RlZmluZSBQV0NfRVYyNVYJCQkJCUJJVCgxNCkKKyNkZWZpbmUgUFdDX0VWMTJWCQkJCQlCSVQoMTUpCisKKyNkZWZpbmUgRkVOX0JCUlNUQgkJCQkJQklUKDApCisjZGVmaW5lIEZFTl9CQl9HTEJfUlNUTgkJCQlCSVQoMSkKKyNkZWZpbmUgRkVOX1VTQkEJCQkJCUJJVCgyKQorI2RlZmluZSBGRU5fVVBMTAkJCQkJQklUKDMpCisjZGVmaW5lIEZFTl9VU0JECQkJCQlCSVQoNCkKKyNkZWZpbmUgRkVOX0RJT19QQ0lFCQkJCUJJVCg1KQorI2RlZmluZSBGRU5fUENJRUEJCQkJCUJJVCg2KQorI2RlZmluZSBGRU5fUFBMTAkJCQkJQklUKDcpCisjZGVmaW5lIEZFTl9QQ0lFRAkJCQkJQklUKDgpCisjZGVmaW5lIEZFTl9ESU9FCQkJCQlCSVQoOSkKKyNkZWZpbmUgRkVOX0NQVUVOCQkJCQlCSVQoMTApCisjZGVmaW5lIEZFTl9EQ09SRQkJCQkJQklUKDExKQorI2RlZmluZSBGRU5fRUxEUgkJCQkJQklUKDEyKQorI2RlZmluZSBGRU5fRElPX1JGCQkJCQlCSVQoMTMpCisjZGVmaW5lIEZFTl9IV1BETgkJCQkJQklUKDE0KQorI2RlZmluZSBGRU5fTVJFR0VOCQkJCQlCSVQoMTUpCisKKyNkZWZpbmUgUEZNX0xEQUxMCQkJCQlCSVQoMCkKKyNkZWZpbmUgUEZNX0FMRE4JCQkJCUJJVCgxKQorI2RlZmluZSBQRk1fTERLUAkJCQkJQklUKDIpCisjZGVmaW5lIFBGTV9XT1dMCQkJCQlCSVQoMykKKyNkZWZpbmUgRW5QRE4JCQkJCQlCSVQoNCkKKyNkZWZpbmUgUEROX1BMCQkJCQkJQklUKDUpCisjZGVmaW5lIEFQRk1fT05NQUMJCQkJCUJJVCg4KQorI2RlZmluZSBBUEZNX09GRgkJCQkJQklUKDkpCisjZGVmaW5lIEFQRk1fUlNNCQkJCQlCSVQoMTApCisjZGVmaW5lIEFGU01fSFNVUwkJCQkJQklUKDExKQorI2RlZmluZSBBRlNNX1BDSUUJCQkJCUJJVCgxMikKKyNkZWZpbmUgQVBETV9NQUMJCQkJCUJJVCgxMykKKyNkZWZpbmUgQVBETV9IT1NUCQkJCQlCSVQoMTQpCisjZGVmaW5lIEFQRE1fSFBETgkJCQkJQklUKDE1KQorI2RlZmluZSBSRFlfTUFDT04JCQkJCUJJVCgxNikKKyNkZWZpbmUgU1VTX0hPU1QJCQkJCUJJVCgxNykKKyNkZWZpbmUgUk9QX0FMRAkJCQkJCUJJVCgyMCkKKyNkZWZpbmUgUk9QX1BXUgkJCQkJCUJJVCgyMSkKKyNkZWZpbmUgUk9QX1NQUwkJCQkJCUJJVCgyMikKKyNkZWZpbmUgU09QX01SU1QJCQkJCUJJVCgyNSkKKyNkZWZpbmUgU09QX0ZVU0UJCQkJCUJJVCgyNikKKyNkZWZpbmUgU09QX0FCRwkJCQkJCUJJVCgyNykKKyNkZWZpbmUgU09QX0FNQgkJCQkJCUJJVCgyOCkKKyNkZWZpbmUgU09QX1JDSwkJCQkJCUJJVCgyOSkKKyNkZWZpbmUgU09QX0E4TQkJCQkJCUJJVCgzMCkKKyNkZWZpbmUgWE9QX0JUQ0sJCQkJCUJJVCgzMSkKKworI2RlZmluZSBBTkFEMTZWX0VOCQkJCQlCSVQoMCkKKyNkZWZpbmUgQU5BOE0JCQkJCQlCSVQoMSkKKyNkZWZpbmUgTUFDU0xQCQkJCQkJQklUKDQpCisjZGVmaW5lIExPQURFUl9DTEtfRU4JCQkJQklUKDUpCisjZGVmaW5lIF84ME1fU1NDX0RJUwkJCQlCSVQoNykKKyNkZWZpbmUgXzgwTV9TU0NfRU5fSE8JCQkJQklUKDgpCisjZGVmaW5lIFBIWV9TU0NfUlNUQgkJCQlCSVQoOSkKKyNkZWZpbmUgU0VDX0NMS19FTgkJCQkJQklUKDEwKQorI2RlZmluZSBNQUNfQ0xLX0VOCQkJCQlCSVQoMTEpCisjZGVmaW5lIFNZU19DTEtfRU4JCQkJCUJJVCgxMikKKyNkZWZpbmUgUklOR19DTEtfRU4JCQkJCUJJVCgxMykKKworI2RlZmluZQlCT09UX0ZST01fRUVQUk9NCQkJQklUKDQpCisjZGVmaW5lCUVFUFJPTV9FTgkJCQkJQklUKDUpCisKKyNkZWZpbmUgQUZFX0JHRU4JCQkJCUJJVCgwKQorI2RlZmluZSBBRkVfTUJFTgkJCQkJQklUKDEpCisjZGVmaW5lIE1BQ19JRF9FTgkJCQkJQklUKDcpCisKKyNkZWZpbmUgV0xPQ0tfQUxMCQkJCQlCSVQoMCkKKyNkZWZpbmUgV0xPQ0tfMDAJCQkJCUJJVCgxKQorI2RlZmluZSBXTE9DS18wNAkJCQkJQklUKDIpCisjZGVmaW5lIFdMT0NLXzA4CQkJCQlCSVQoMykKKyNkZWZpbmUgV0xPQ0tfNDAJCQkJCUJJVCg0KQorI2RlZmluZSBSX0RJU19QUlNUXzAJCQkJQklUKDUpCisjZGVmaW5lIFJfRElTX1BSU1RfMQkJCQlCSVQoNikKKyNkZWZpbmUgTE9DS19BTExfRU4JCQkJCUJJVCg3KQorCisjZGVmaW5lIFJGX0VOCQkJCQkJQklUKDApCisjZGVmaW5lIFJGX1JTVEIJCQkJCQlCSVQoMSkKKyNkZWZpbmUgUkZfU0RNUlNUQgkJCQkJQklUKDIpCisKKyNkZWZpbmUgTERBMTVfRU4JCQkJCUJJVCgwKQorI2RlZmluZSBMREExNV9TVEJZCQkJCQlCSVQoMSkKKyNkZWZpbmUgTERBMTVfT0JVRgkJCQkJQklUKDIpCisjZGVmaW5lIExEQTE1X1JFR19WT1MJCQkJQklUKDMpCisjZGVmaW5lIF9MREExNV9WT0FESih4KQkJCQkoKCh4KSAmIDB4NykgPDwgNCkKKworI2RlZmluZSBMRFYxMl9FTgkJCQkJQklUKDApCisjZGVmaW5lIExEVjEyX1NEQlkJCQkJCUJJVCgxKQorI2RlZmluZSBMUExET19IU00JCQkJCUJJVCgyKQorI2RlZmluZSBMUExET19MU01fRElTCQkJCUJJVCgzKQorI2RlZmluZSBfTERWMTJfVkFESih4KQkJCQkoKCh4KSAmIDB4RikgPDwgNCkKKworI2RlZmluZSBYVEFMX0VOCQkJCQkJQklUKDApCisjZGVmaW5lIFhUQUxfQlNFTAkJCQkJQklUKDEpCisjZGVmaW5lIF9YVEFMX0JPU0MoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDIpCisjZGVmaW5lIF9YVEFMX0NBREooeCkJCQkJKCgoeCkgJiAweEYpIDw8IDQpCisjZGVmaW5lIFhUQUxfR0FURV9VU0IJCQkJQklUKDgpCisjZGVmaW5lIF9YVEFMX1VTQl9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgOSkKKyNkZWZpbmUgWFRBTF9HQVRFX0FGRQkJCQlCSVQoMTEpCisjZGVmaW5lIF9YVEFMX0FGRV9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgMTIpCisjZGVmaW5lIFhUQUxfUkZfR0FURQkJCQlCSVQoMTQpCisjZGVmaW5lIF9YVEFMX1JGX0RSVih4KQkJCQkoKCh4KSAmIDB4MykgPDwgMTUpCisjZGVmaW5lIFhUQUxfR0FURV9ESUcJCQkJQklUKDE3KQorI2RlZmluZSBfWFRBTF9ESUdfRFJWKHgpCQkJKCgoeCkgJiAweDMpIDw8IDE4KQorI2RlZmluZSBYVEFMX0JUX0dBVEUJCQkJQklUKDIwKQorI2RlZmluZSBfWFRBTF9CVF9EUlYoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDIxKQorI2RlZmluZSBfWFRBTF9HUElPKHgpCQkJCSgoKHgpICYgMHg3KSA8PCAyMykKKworI2RlZmluZSBDS0RMWV9BRkUJCQkJCUJJVCgyNikKKyNkZWZpbmUgQ0tETFlfVVNCCQkJCQlCSVQoMjcpCisjZGVmaW5lIENLRExZX0RJRwkJCQkJQklUKDI4KQorI2RlZmluZSBDS0RMWV9CVAkJCQkJQklUKDI5KQorCisjZGVmaW5lIEFQTExfRU4JCQkJCQlCSVQoMCkKKyNkZWZpbmUgQVBMTF8zMjBfRU4JCQkJCUJJVCgxKQorI2RlZmluZSBBUExMX0ZSRUZfU0VMCQkJCUJJVCgyKQorI2RlZmluZSBBUExMX0VER0VfU0VMCQkJCUJJVCgzKQorI2RlZmluZSBBUExMX1dET0dCCQkJCQlCSVQoNCkKKyNkZWZpbmUgQVBMTF9MUEZFTgkJCQkJQklUKDUpCisKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzEzTUhaCQkJMHgxCisjZGVmaW5lIEFQTExfUkVGX0NMS18xOV8yTUhaCQkweDIKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzIwTUhaCQkJMHgzCisjZGVmaW5lIEFQTExfUkVGX0NMS18yNU1IWgkJCTB4NAorI2RlZmluZSBBUExMX1JFRl9DTEtfMjZNSFoJCQkweDUKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzM4XzRNSFoJCTB4NgorI2RlZmluZSBBUExMX1JFRl9DTEtfNDBNSFoJCQkweDcKKworI2RlZmluZSBBUExMXzMyMEVOCQkJCQlCSVQoMTQpCisjZGVmaW5lIEFQTExfODBFTgkJCQkJQklUKDE1KQorI2RlZmluZSBBUExMXzFNRU4JCQkJCUJJVCgyNCkKKworI2RlZmluZSBBTERfRU4JCQkJCQlCSVQoMTgpCisjZGVmaW5lIEVGX1BECQkJCQkJQklUKDE5KQorI2RlZmluZSBFRl9GTEFHCQkJCQkJQklUKDMxKQorCisjZGVmaW5lIEVGX1RSUFQJCQkJCQlCSVQoNykKKyNkZWZpbmUgTERPRTI1X0VOCQkJCQlCSVQoMzEpCisKKyNkZWZpbmUgUlNNX0VOCQkJCQkJQklUKDApCisjZGVmaW5lIFRpbWVyX0VOCQkJCQlCSVQoNCkKKworI2RlZmluZSBUUlNXMEVOCQkJCQkJQklUKDIpCisjZGVmaW5lIFRSU1cxRU4JCQkJCQlCSVQoMykKKyNkZWZpbmUgRVJPTV9FTgkJCQkJCUJJVCg0KQorI2RlZmluZSBFbkJUCQkJCQkJQklUKDUpCisjZGVmaW5lIEVuVWFydAkJCQkJCUJJVCg4KQorI2RlZmluZSBVYXJ0XzkxMAkJCQkJQklUKDkpCisjZGVmaW5lIEVuUE1BQwkJCQkJCUJJVCgxMCkKKyNkZWZpbmUgU0lDX1NXUlNUCQkJCQlCSVQoMTEpCisjZGVmaW5lIEVuU0lDCQkJCQkJQklUKDEyKQorI2RlZmluZSBTSUNfMjMJCQkJCQlCSVQoMTMpCisjZGVmaW5lIEVuSERQCQkJCQkJQklUKDE0KQorI2RlZmluZSBTSUNfTEJLCQkJCQkJQklUKDE1KQorCisjZGVmaW5lIExFRDBQTCAJCQkJCQlCSVQoNCkKKyNkZWZpbmUgTEVEMVBMIAkJCQkJCUJJVCgxMikKKyNkZWZpbmUgTEVEMERJUwkJCQkJCUJJVCg3KQorCisjZGVmaW5lIE1DVUZXRExfRU4JCQkJCUJJVCgwKQorI2RlZmluZSBNQ1VGV0RMX1JEWQkJCQkJQklUKDEpCisjZGVmaW5lIEZXRExfQ0hLU1VNX1JQVAkJCQlCSVQoMikKKyNkZWZpbmUgTUFDSU5JX1JEWQkJCQkJQklUKDMpCisjZGVmaW5lIEJCSU5JX1JEWQkJCQkJQklUKDQpCisjZGVmaW5lIFJGSU5JX1JEWQkJCQkJQklUKDUpCisjZGVmaW5lIFdJTlRJTklfUkRZCQkJCQlCSVQoNikKKyNkZWZpbmUgQ1BSU1QJCQkJCQlCSVQoMjMpCisKKyNkZWZpbmUgWENMS19WTEQJCQkJCUJJVCgwKQorI2RlZmluZSBBQ0xLX1ZMRAkJCQkJQklUKDEpCisjZGVmaW5lIFVDTEtfVkxECQkJCQlCSVQoMikKKyNkZWZpbmUgUENMS19WTEQJCQkJCUJJVCgzKQorI2RlZmluZSBQQ0lSU1RCCQkJCQkJQklUKDQpCisjZGVmaW5lIFYxNV9WTEQJCQkJCQlCSVQoNSkKKyNkZWZpbmUgVFJQX0IxNVZfRU4JCQkJCUJJVCg3KQorI2RlZmluZSBTSUNfSURMRQkJCQkJQklUKDgpCisjZGVmaW5lIEJEX01BQzIJCQkJCQlCSVQoOSkKKyNkZWZpbmUgQkRfTUFDMQkJCQkJCUJJVCgxMCkKKyNkZWZpbmUgSUNfTUFDUEhZX01PREUJCQkJQklUKDExKQorI2RlZmluZSBWRU5ET1JfSUQJCQkJCUJJVCgxOSkKKyNkZWZpbmUgUEFEX0hXUERfSUROCQkJCUJJVCgyMikKKyNkZWZpbmUgVFJQX1ZBVVhfRU4JCQkJCUJJVCgyMykKKyNkZWZpbmUgVFJQX0JUX0VOCQkJCQlCSVQoMjQpCisjZGVmaW5lIEJEX1BLR19TRUwJCQkJCUJJVCgyNSkKKyNkZWZpbmUgQkRfSENJX1NFTAkJCQkJQklUKDI2KQorI2RlZmluZSBUWVBFX0lECQkJCQkJQklUKDI3KQorCisjZGVmaW5lIENISVBfVkVSX1JUTF9NQVNLCQkJMHhGMDAwCisjZGVmaW5lIENISVBfVkVSX1JUTF9TSElGVAkJCTEyCisKKyNkZWZpbmUgUkVHX0xCTU9ERQkJCQkJKFJFR19DUiArIDMpCisKKyNkZWZpbmUgSENJX1RYRE1BX0VOCQkJCUJJVCgwKQorI2RlZmluZSBIQ0lfUlhETUFfRU4JCQkJQklUKDEpCisjZGVmaW5lIFRYRE1BX0VOCQkJCQlCSVQoMikKKyNkZWZpbmUgUlhETUFfRU4JCQkJCUJJVCgzKQorI2RlZmluZSBQUk9UT0NPTF9FTgkJCQkJQklUKDQpCisjZGVmaW5lIFNDSEVEVUxFX0VOCQkJCQlCSVQoNSkKKyNkZWZpbmUgTUFDVFhFTgkJCQkJCUJJVCg2KQorI2RlZmluZSBNQUNSWEVOCQkJCQkJQklUKDcpCisjZGVmaW5lIEVOU1dCQ04JCQkJCQlCSVQoOCkKKyNkZWZpbmUgRU5TRUMJCQkJCQlCSVQoOSkKKworI2RlZmluZSBfTkVUVFlQRSh4KQkJCQkJKCgoeCkgJiAweDMpIDw8IDE2KQorI2RlZmluZSBNQVNLX05FVFRZUEUJCQkJMHgzMDAwMAorI2RlZmluZSBOVF9OT19MSU5LCQkJCQkweDAKKyNkZWZpbmUgTlRfTElOS19BRF9IT0MJCQkJMHgxCisjZGVmaW5lIE5UX0xJTktfQVAJCQkJCTB4MgorI2RlZmluZSBOVF9BU19BUAkJCQkJMHgzCisKKyNkZWZpbmUgX0xCTU9ERSh4KQkJCQkJKCgoeCkgJiAweEYpIDw8IDI0KQorI2RlZmluZSBNQVNLX0xCTU9ERQkJCQkJMHhGMDAwMDAwCisjZGVmaW5lIExPT1BCQUNLX05PUk1BTAkJCQkweDAKKyNkZWZpbmUgTE9PUEJBQ0tfSU1NRURJQVRFTFkJCTB4QgorI2RlZmluZSBMT09QQkFDS19NQUNfREVMQVkJCQkweDMKKyNkZWZpbmUgTE9PUEJBQ0tfUEhZCQkJCTB4MQorI2RlZmluZSBMT09QQkFDS19ETUEJCQkJMHg3CisKKyNkZWZpbmUgR0VUX1JYX1BBR0VfU0laRSh2YWx1ZSkJCSgodmFsdWUpICYgMHhGKQorI2RlZmluZSBHRVRfVFhfUEFHRV9TSVpFKHZhbHVlKQkJKCgodmFsdWUpICYgMHhGMCkgPj4gNCkKKyNkZWZpbmUgX1BTUlhfTUFTSwkJCQkJMHhGCisjZGVmaW5lIF9QU1RYX01BU0sJCQkJCTB4RjAKKyNkZWZpbmUgX1BTUlgoeCkJCQkJCSh4KQorI2RlZmluZSBfUFNUWCh4KQkJCQkJKCh4KSA8PCA0KQorCisjZGVmaW5lIFBCUF82NAkJCQkJCTB4MAorI2RlZmluZSBQQlBfMTI4CQkJCQkJMHgxCisjZGVmaW5lIFBCUF8yNTYJCQkJCQkweDIKKyNkZWZpbmUgUEJQXzUxMgkJCQkJCTB4MworI2RlZmluZSBQQlBfMTAyNAkJCQkJMHg0CisKKyNkZWZpbmUgUlhETUFfQVJCQldfRU4JCQkJQklUKDApCisjZGVmaW5lIFJYU0hGVF9FTgkJCQkJQklUKDEpCisjZGVmaW5lIFJYRE1BX0FHR19FTgkJCQlCSVQoMikKKyNkZWZpbmUgUVNfVk9fUVVFVUUJCQkJCUJJVCg4KQorI2RlZmluZSBRU19WSV9RVUVVRQkJCQkJQklUKDkpCisjZGVmaW5lIFFTX0JFX1FVRVVFCQkJCQlCSVQoMTApCisjZGVmaW5lIFFTX0JLX1FVRVVFCQkJCQlCSVQoMTEpCisjZGVmaW5lIFFTX01BTkFHRVJfUVVFVUUJCQlCSVQoMTIpCisjZGVmaW5lIFFTX0hJR0hfUVVFVUUJCQkJQklUKDEzKQorCisjZGVmaW5lIEhRU0VMX1ZPUQkJCQkJQklUKDApCisjZGVmaW5lIEhRU0VMX1ZJUQkJCQkJQklUKDEpCisjZGVmaW5lIEhRU0VMX0JFUQkJCQkJQklUKDIpCisjZGVmaW5lIEhRU0VMX0JLUQkJCQkJQklUKDMpCisjZGVmaW5lIEhRU0VMX01HVFEJCQkJCUJJVCg0KQorI2RlZmluZSBIUVNFTF9ISVEJCQkJCUJJVCg1KQorCisjZGVmaW5lIF9UWERNQV9ISVFfTUFQKHgpIAkgCQkoKCh4KSYweDMpIDw8IDE0KQorI2RlZmluZSBfVFhETUFfTUdRX01BUCh4KSAJIAkJKCgoeCkmMHgzKSA8PCAxMikKKyNkZWZpbmUgX1RYRE1BX0JLUV9NQVAoeCkgCSAJCSgoKHgpJjB4MykgPDwgMTApCisjZGVmaW5lIF9UWERNQV9CRVFfTUFQKHgpIAkgCQkoKCh4KSYweDMpIDw8IDggKQorI2RlZmluZSBfVFhETUFfVklRX01BUCh4KSAJIAkJKCgoeCkmMHgzKSA8PCA2ICkKKyNkZWZpbmUgX1RYRE1BX1ZPUV9NQVAoeCkgCSAJCSgoKHgpJjB4MykgPDwgNCApCisKKyNkZWZpbmUgUVVFVUVfTE9XCQkJCQkxCisjZGVmaW5lIFFVRVVFX05PUk1BTAkJCQkyCisjZGVmaW5lIFFVRVVFX0hJR0gJCQkJCTMKKworI2RlZmluZSBfTExUX05PX0FDVElWRQkJCQkweDAKKyNkZWZpbmUgX0xMVF9XUklURV9BQ0NFU1MJCQkweDEKKyNkZWZpbmUgX0xMVF9SRUFEX0FDQ0VTUwkJCTB4MgorCisjZGVmaW5lIF9MTFRfSU5JVF9EQVRBKHgpCQkJKCh4KSAmIDB4RkYpCisjZGVmaW5lIF9MTFRfSU5JVF9BRERSKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KQorI2RlZmluZSBfTExUX09QKHgpCQkJCQkoKCh4KSAmIDB4MykgPDwgMzApCisjZGVmaW5lIF9MTFRfT1BfVkFMVUUoeCkJCQkoKCh4KSA+PiAzMCkgJiAweDMpCisKKyNkZWZpbmUgQkJfV1JJVEVfUkVBRF9NQVNLCQkJKEJJVCgzMSkgfCBCSVQoMzApKQorI2RlZmluZSBCQl9XUklURV9FTgkJCQkJQklUKDMwKQorI2RlZmluZSBCQl9SRUFEX0VOCQkJCQlCSVQoMzEpCisKKyNkZWZpbmUgX0hQUSh4KQkJCSgoeCkgJiAweEZGKQorI2RlZmluZSBfTFBRKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KQorI2RlZmluZSBfUFVCUSh4KQkJKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgX05QUSh4KQkJCSgoeCkgJiAweEZGKQorCisjZGVmaW5lIEhQUV9QVUJMSUNfRElTCQlCSVQoMjQpCisjZGVmaW5lIExQUV9QVUJMSUNfRElTCQlCSVQoMjUpCisjZGVmaW5lIExEX1JRUE4JCQlCSVQoMzEpCisKKyNkZWZpbmUgQkNOX1ZBTElECQlCSVQoMTYpCisjZGVmaW5lIEJDTl9IRUFEKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCisjZGVmaW5lCUJDTl9IRUFEX01BU0sJCTB4RkYwMAorCisjZGVmaW5lIEJMS19ERVNDX05VTV9TSElGVAkJCTQKKyNkZWZpbmUgQkxLX0RFU0NfTlVNX01BU0sJCQkweEYKKworI2RlZmluZSBEUk9QX0RBVEFfRU4JCQkJQklUKDkpCisKKyNkZWZpbmUgRU5fQU1QRFVfUlRZX05FVwkJCUJJVCg3KQorCisjZGVmaW5lIF9JTklSVFNNQ1NfU0VMKHgpCQkJKCh4KSAmIDB4M0YpCisKKyNkZWZpbmUgX1NQRUNfU0lGU19DQ0soeCkJCQkoKHgpICYgMHhGRikKKyNkZWZpbmUgX1NQRUNfU0lGU19PRkRNKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KQorCisjZGVmaW5lIFJBVEVfUkVHX0JJVE1BUF9BTEwJCQkweEZGRkZGCisKKyNkZWZpbmUgX1JSU0NfQklUTUFQKHgpCQkJCSgoeCkgJiAweEZGRkZGKQorCisjZGVmaW5lIF9SUlNSX1JTQyh4KQkJCQkoKCh4KSAmIDB4MykgPDwgMjEpCisjZGVmaW5lIFJSU1JfUlNDX1JFU0VSVkVECQkJMHgwCisjZGVmaW5lIFJSU1JfUlNDX1VQUEVSX1NVQkNIQU5ORUwJMHgxCisjZGVmaW5lIFJSU1JfUlNDX0xPV0VSX1NVQkNIQU5ORUwJMHgyCisjZGVmaW5lIFJSU1JfUlNDX0RVUExJQ0FURV9NT0RFCQkweDMKKworI2RlZmluZSBVU0VfU0hPUlRfRzEJCQkJQklUKDIwKQorCisjZGVmaW5lIF9BR0dMTVRfTUNTMCh4KQkJCQkoKHgpICYgMHhGKQorI2RlZmluZSBfQUdHTE1UX01DUzEoeCkJCQkJKCgoeCkgJiAweEYpIDw8IDQpCisjZGVmaW5lIF9BR0dMTVRfTUNTMih4KQkJCQkoKCh4KSAmIDB4RikgPDwgOCkKKyNkZWZpbmUgX0FHR0xNVF9NQ1MzKHgpCQkJCSgoKHgpICYgMHhGKSA8PCAxMikKKyNkZWZpbmUgX0FHR0xNVF9NQ1M0KHgpCQkJCSgoKHgpICYgMHhGKSA8PCAxNikKKyNkZWZpbmUgX0FHR0xNVF9NQ1M1KHgpCQkJCSgoKHgpICYgMHhGKSA8PCAyMCkKKyNkZWZpbmUgX0FHR0xNVF9NQ1M2KHgpCQkJCSgoKHgpICYgMHhGKSA8PCAyNCkKKyNkZWZpbmUgX0FHR0xNVF9NQ1M3KHgpCQkJCSgoKHgpICYgMHhGKSA8PCAyOCkKKworI2RlZmluZQlSRVRSWV9MSU1JVF9TSE9SVF9TSElGVAkJOAorI2RlZmluZQlSRVRSWV9MSU1JVF9MT05HX1NISUZUCQkwCisKKyNkZWZpbmUgX0RBUkZfUkMxKHgpCQkJCSgoeCkgJiAweDFGKQorI2RlZmluZSBfREFSRl9SQzIoeCkJCQkJKCgoeCkgJiAweDFGKSA8PCA4KQorI2RlZmluZSBfREFSRl9SQzMoeCkJCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKKyNkZWZpbmUgX0RBUkZfUkM0KHgpCQkJCSgoKHgpICYgMHgxRikgPDwgMjQpCisjZGVmaW5lIF9EQVJGX1JDNSh4KQkJCQkoKHgpICYgMHgxRikKKyNkZWZpbmUgX0RBUkZfUkM2KHgpCQkJCSgoKHgpICYgMHgxRikgPDwgOCkKKyNkZWZpbmUgX0RBUkZfUkM3KHgpCQkJCSgoKHgpICYgMHgxRikgPDwgMTYpCisjZGVmaW5lIF9EQVJGX1JDOCh4KQkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQorCisjZGVmaW5lIF9SQVJGX1JDMSh4KQkJCQkoKHgpICYgMHgxRikKKyNkZWZpbmUgX1JBUkZfUkMyKHgpCQkJCSgoKHgpICYgMHgxRikgPDwgOCkKKyNkZWZpbmUgX1JBUkZfUkMzKHgpCQkJCSgoKHgpICYgMHgxRikgPDwgMTYpCisjZGVmaW5lIF9SQVJGX1JDNCh4KQkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQorI2RlZmluZSBfUkFSRl9SQzUoeCkJCQkJKCh4KSAmIDB4MUYpCisjZGVmaW5lIF9SQVJGX1JDNih4KQkJCQkoKCh4KSAmIDB4MUYpIDw8IDgpCisjZGVmaW5lIF9SQVJGX1JDNyh4KQkJCQkoKCh4KSAmIDB4MUYpIDw8IDE2KQorI2RlZmluZSBfUkFSRl9SQzgoeCkJCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKKworI2RlZmluZSBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkxNgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVAkJMTIKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQJCTgKKyNkZWZpbmUgQUNfUEFSQU1fQUlGU19PRkZTRVQJCTAKKworI2RlZmluZSBfQUlGUyh4KQkJCQkJKHgpCisjZGVmaW5lIF9FQ1dfTUFYX01JTih4KQkJCQkoKHgpIDw8IDgpCisjZGVmaW5lIF9UWE9QX0xJTUlUKHgpCQkJCSgoeCkgPDwgMTYpCisKKyNkZWZpbmUgX0JDTklGUyh4KQkJCQkJKCh4KSAmIDB4RkYpCisjZGVmaW5lIF9CQ05FQ1coeCkJCQkJCSgoKCh4KSAmIDB4RikpPDwgOCkKKworI2RlZmluZSBfTFJMKHgpCQkJCQkJKCh4KSAmIDB4M0YpCisjZGVmaW5lIF9TUkwoeCkJCQkJCQkoKCh4KSAmIDB4M0YpIDw8IDgpCisKKyNkZWZpbmUgX1NJRlNfQ0NLX0NUWCh4KQkJCSgoeCkgJiAweEZGKQorI2RlZmluZSBfU0lGU19DQ0tfVFJYKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KTsKKworI2RlZmluZSBfU0lGU19PRkRNX0NUWCh4KQkJCSgoeCkgJiAweEZGKQorI2RlZmluZSBfU0lGU19PRkRNX1RSWCh4KQkJCSgoKHgpICYgMHhGRikgPDwgOCk7CisKKyNkZWZpbmUgX1RCVFRfUFJPSElCSVRfSE9MRCh4KQkJKCgoeCkgJiAweEZGKSA8PCA4KQorCisjZGVmaW5lIERJU19FRENBX0NOVF9EV04JCQlCSVQoMTEpCisKKyNkZWZpbmUgRU5fTUJTU0lECQkJCQlCSVQoMSkKKyNkZWZpbmUgRU5fVFhCQ05fUlBUCQkJCUJJVCgyKQorI2RlZmluZQlFTl9CQ05fRlVOQ1RJT04JCQkJQklUKDMpCisKKyNkZWZpbmUgVFNGVFJfUlNUCQkJCQlCSVQoMCkKKyNkZWZpbmUgVFNGVFIxX1JTVAkJCQkJQklUKDEpCisKKyNkZWZpbmUgU1RPUF9CQ05RCQkJCQlCSVQoNikKKworI2RlZmluZQlESVNfVFNGX1VEVDBfTk9STUFMX0NISVAJQklUKDQpCisjZGVmaW5lCURJU19UU0ZfVURUMF9URVNUX0NISVAJCUJJVCg1KQorCisjZGVmaW5lCUFjbUh3X0h3RW4JCQkJCUJJVCgwKQorI2RlZmluZQlBY21Id19CZXFFbgkJCQkJQklUKDEpCisjZGVmaW5lCUFjbUh3X1ZpcUVuCQkJCQlCSVQoMikKKyNkZWZpbmUJQWNtSHdfVm9xRW4JCQkJCUJJVCgzKQorI2RlZmluZQlBY21Id19CZXFTdGF0dXMJCQkJQklUKDQpCisjZGVmaW5lCUFjbUh3X1ZpcVN0YXR1cwkJCQlCSVQoNSkKKyNkZWZpbmUJQWNtSHdfVm9xU3RhdHVzCQkJCUJJVCg2KQorCisjZGVmaW5lIEFQU0RPRkYJCQkJCQlCSVQoNikKKyNkZWZpbmUgQVBTRE9GRl9TVEFUVVMJCQkJQklUKDcpCisKKyNkZWZpbmUgQldfMjBNSFoJCQkJCUJJVCgyKQorCisjZGVmaW5lIFJBVEVfQklUTUFQX0FMTAkJCQkweEZGRkZGCisKKyNkZWZpbmUgUkFURV9SUlNSX0NDS19PTkxZXzFNCQkweEZGRkYxCisKKyNkZWZpbmUgVFNGUlNUCQkJCQkJQklUKDApCisjZGVmaW5lIERJU19HQ0xLCQkJCQlCSVQoMSkKKyNkZWZpbmUgUEFEX1NFTAkJCQkJCUJJVCgyKQorI2RlZmluZSBQV1JfU1QJCQkJCQlCSVQoNikKKyNkZWZpbmUgUFdSQklUX09XX0VOCQkJCUJJVCg3KQorI2RlZmluZSBBQ1JDCQkJCQkJQklUKDgpCisjZGVmaW5lIENGRU5ERk9STQkJCQkJQklUKDkpCisjZGVmaW5lIElDVgkJCQkJCQlCSVQoMTApCisKKyNkZWZpbmUgQUFQCQkJCQkJCUJJVCgwKQorI2RlZmluZSBBUE0JCQkJCQkJQklUKDEpCisjZGVmaW5lIEFNCQkJCQkJCUJJVCgyKQorI2RlZmluZSBBQgkJCQkJCQlCSVQoMykKKyNkZWZpbmUgQUREMwkJCQkJCUJJVCg0KQorI2RlZmluZSBBUFdSTUdUCQkJCQkJQklUKDUpCisjZGVmaW5lIENCU1NJRAkJCQkJCUJJVCg2KQorI2RlZmluZSBDQlNTSURfREFUQQkJCQkJQklUKDYpCisjZGVmaW5lIENCU1NJRF9CQ04JCQkJCUJJVCg3KQorI2RlZmluZSBBQ1JDMzIJCQkJCQlCSVQoOCkKKyNkZWZpbmUgQUlDVgkJCQkJCUJJVCg5KQorI2RlZmluZSBBREYJCQkJCQkJQklUKDExKQorI2RlZmluZSBBQ0YJCQkJCQkJQklUKDEyKQorI2RlZmluZSBBTUYJCQkJCQkJQklUKDEzKQorI2RlZmluZSBIVENfTE9DX0NUUkwJCQkJQklUKDE0KQorI2RlZmluZSBVQ19EQVRBX0VOCQkJCQlCSVQoMTYpCisjZGVmaW5lIEJNX0RBVEFfRU4JCQkJCUJJVCgxNykKKyNkZWZpbmUgTUZCRU4JCQkJCQlCSVQoMjIpCisjZGVmaW5lIExTSUdFTgkJCQkJCUJJVCgyMykKKyNkZWZpbmUgRW5NQklECQkJCQkJQklUKDI0KQorI2RlZmluZSBBUFBfQkFTU04JCQkJCUJJVCgyNykKKyNkZWZpbmUgQVBQX1BIWVNUUwkJCQkJQklUKDI4KQorI2RlZmluZSBBUFBfSUNWCQkJCQkJQklUKDI5KQorI2RlZmluZSBBUFBfTUlDCQkJCQkJQklUKDMwKQorI2RlZmluZSBBUFBfRkNTCQkJCQkJQklUKDMxKQorCisjZGVmaW5lIF9NSU5fU1BBQ0UoeCkJCQkJKCh4KSAmIDB4NykKKyNkZWZpbmUgX1NIT1JUX0dJX1BBRERJTkcoeCkJCSgoKHgpICYgMHgxRikgPDwgMykKKworI2RlZmluZSBSWEVSUl9UWVBFX09GRE1fUFBEVQkJMAorI2RlZmluZSBSWEVSUl9UWVBFX09GRE1fRkFMU0VfQUxBUk0JMQorI2RlZmluZQlSWEVSUl9UWVBFX09GRE1fTVBEVV9PSwkJMgorI2RlZmluZSBSWEVSUl9UWVBFX09GRE1fTVBEVV9GQUlMCTMKKyNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tfUFBEVQkJCTQKKyNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tfRkFMU0VfQUxBUk0JNQorI2RlZmluZSBSWEVSUl9UWVBFX0NDS19NUERVX09LCQk2CisjZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX01QRFVfRkFJTAk3CisjZGVmaW5lIFJYRVJSX1RZUEVfSFRfUFBEVQkJCTgKKyNkZWZpbmUgUlhFUlJfVFlQRV9IVF9GQUxTRV9BTEFSTQk5CisjZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9UT1RBTAkxMAorI2RlZmluZSBSWEVSUl9UWVBFX0hUX01QRFVfT0sJCTExCisjZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9GQUlMCQkxMgorI2RlZmluZSBSWEVSUl9UWVBFX1JYX0ZVTExfRFJPUAkJMTUKKworI2RlZmluZSBSWEVSUl9DT1VOVEVSX01BU0sJCQkweEZGRkZGCisjZGVmaW5lIFJYRVJSX1JQVF9SU1QJCQkJQklUKDI3KQorI2RlZmluZSBfUlhFUlJfUlBUX1NFTCh0eXBlKQkJKCh0eXBlKSA8PCAyOCkKKworI2RlZmluZQlTQ1JfVHhVc2VESwkJCQkJQklUKDApCisjZGVmaW5lCVNDUl9SeFVzZURLCQkJCQlCSVQoMSkKKyNkZWZpbmUJU0NSX1R4RW5jRW5hYmxlCQkJCUJJVCgyKQorI2RlZmluZQlTQ1JfUnhEZWNFbmFibGUJCQkJQklUKDMpCisjZGVmaW5lCVNDUl9TS0J5QTIJCQkJCUJJVCg0KQorI2RlZmluZQlTQ1JfTm9TS01DCQkJCQlCSVQoNSkKKyNkZWZpbmUgU0NSX1RYQkNVU0VESwkJCQlCSVQoNikKKyNkZWZpbmUgU0NSX1JYQkNVU0VESwkJCQlCSVQoNykKKworI2RlZmluZSBYQ0xLX1ZMRAkJCQkJQklUKDApCisjZGVmaW5lIEFDTEtfVkxECQkJCQlCSVQoMSkKKyNkZWZpbmUgVUNMS19WTEQJCQkJCUJJVCgyKQorI2RlZmluZSBQQ0xLX1ZMRAkJCQkJQklUKDMpCisjZGVmaW5lIFBDSVJTVEIJCQkJCQlCSVQoNCkKKyNkZWZpbmUgVjE1X1ZMRAkJCQkJCUJJVCg1KQorI2RlZmluZSBUUlBfQjE1Vl9FTgkJCQkJQklUKDcpCisjZGVmaW5lIFNJQ19JRExFCQkJCQlCSVQoOCkKKyNkZWZpbmUgQkRfTUFDMgkJCQkJCUJJVCg5KQorI2RlZmluZSBCRF9NQUMxCQkJCQkJQklUKDEwKQorI2RlZmluZSBJQ19NQUNQSFlfTU9ERQkJCQlCSVQoMTEpCisjZGVmaW5lIEJUX0ZVTkMJCQkJCQlCSVQoMTYpCisjZGVmaW5lIFZFTkRPUl9JRAkJCQkJQklUKDE5KQorI2RlZmluZSBQQURfSFdQRF9JRE4JCQkJQklUKDIyKQorI2RlZmluZSBUUlBfVkFVWF9FTgkJCQkJQklUKDIzKQorI2RlZmluZSBUUlBfQlRfRU4JCQkJCUJJVCgyNCkKKyNkZWZpbmUgQkRfUEtHX1NFTAkJCQkJQklUKDI1KQorI2RlZmluZSBCRF9IQ0lfU0VMCQkJCQlCSVQoMjYpCisjZGVmaW5lIFRZUEVfSUQJCQkJCQlCSVQoMjcpCisKKyNkZWZpbmUgVVNCX0lTX0hJR0hfU1BFRUQJCQkwCisjZGVmaW5lIFVTQl9JU19GVUxMX1NQRUVECQkJMQorI2RlZmluZSBVU0JfU1BFRURfTUFTSwkJCQlCSVQoNSkKKworI2RlZmluZSBVU0JfTk9STUFMX1NJRV9FUF9NQVNLCQkweEYKKyNkZWZpbmUgVVNCX05PUk1BTF9TSUVfRVBfU0hJRlQJCTQKKworI2RlZmluZSBVU0JfVEVTVF9FUF9NQVNLCQkJMHgzMAorI2RlZmluZSBVU0JfVEVTVF9FUF9TSElGVAkJCTQKKworI2RlZmluZSBVU0JfQUdHX0VOCQkJCQlCSVQoMykKKworI2RlZmluZSBNQUNfQUREUl9MRU4JCQkJNgorI2RlZmluZSBMQVNUX0VOVFJZX09GX1RYX1BLVF9CVUZGRVIJMTc1LyoyNTUgICAgODhlKi8KKworI2RlZmluZSBQT0xMSU5HX0xMVF9USFJFU0hPTEQJCTIwCisjZGVmaW5lIFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVAkJMzAwMAorCisjZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8yVAkJCTB4MTMKKyNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkJMHgwQQorCisjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLIAkoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgRVBST01fQ01EX0NPTkZJRyAJCQkweDMKKyNkZWZpbmUgRVBST01fQ01EX0xPQUQgCQkJCTEKKworI2RlZmluZQlIV1NFVF9NQVhfU0laRV85MlMJCQlIV1NFVF9NQVhfU0laRQorCisjZGVmaW5lCUhBTF84MTkyQ19IV19HUElPX1dQU19CSVQJQklUKDIpCisKKyNkZWZpbmUgUkFfTFNTSVdSSVRFXzg4MjFBCQkJMHhjOTAKKyNkZWZpbmUgUkJfTFNTSVdSSVRFXzg4MjFBCQkJMHhlOTAKKworI2RlZmluZQlSQV9QSVJFQURfODgyMUEJCTB4ZDA0CisjZGVmaW5lCVJCX1BJUkVBRF84ODIxQQkJMHhkNDQKKyNkZWZpbmUJUkFfU0lSRUFEXzg4MjFBCQkweGQwOAorI2RlZmluZQlSQl9TSVJFQURfODgyMUEJCTB4ZDQ4CisKKyNkZWZpbmUJUlBNQUNfUkVTRVQJCQkJCTB4MTAwCisjZGVmaW5lCVJQTUFDX1RYU1RBUlQJCQkJMHgxMDQKKyNkZWZpbmUJUlBNQUNfVFhMRUdBQ1lTSUcJCQkweDEwOAorI2RlZmluZQlSUE1BQ19UWEhUU0lHMQkJCQkweDEwYworI2RlZmluZQlSUE1BQ19UWEhUU0lHMgkJCQkweDExMAorI2RlZmluZQlSUE1BQ19QSFlERUJVRwkJCQkweDExNAorI2RlZmluZQlSUE1BQ19UWFBBQ0tFVE5VTQkJCTB4MTE4CisjZGVmaW5lCVJQTUFDX1RYSURMRQkJCQkweDExYworI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjAJCQkweDEyMAorI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjEJCQkweDEyNAorI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjIJCQkweDEyOAorI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjMJCQkweDEyYworI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjQJCQkweDEzMAorI2RlZmluZQlSUE1BQ19UWE1BQ0hFQURFUjUJCQkweDEzNAorI2RlZmluZQlSUE1BQ19UWERBREFUWVBFCQkJMHgxMzgKKyNkZWZpbmUJUlBNQUNfVFhSQU5ET01TRUVECQkJMHgxM2MKKyNkZWZpbmUJUlBNQUNfQ0NLUExDUFBSRUFNQkxFCQkweDE0MAorI2RlZmluZQlSUE1BQ19DQ0tQTENQSEVBREVSCQkJMHgxNDQKKyNkZWZpbmUJUlBNQUNfQ0NLQ1JDMTYJCQkJMHgxNDgKKyNkZWZpbmUJUlBNQUNfT0ZETVJYQ1JDMzJPSwkJCTB4MTcwCisjZGVmaW5lCVJQTUFDX09GRE1SWENSQzMyRXIJCQkweDE3NAorI2RlZmluZQlSUE1BQ19PRkRNUlhQQVJJVFlFUgkJMHgxNzgKKyNkZWZpbmUJUlBNQUNfT0ZETVJYQ1JDOEVSCQkJMHgxN2MKKyNkZWZpbmUJUlBNQUNfQ0NLQ1JYUkMxNkVSCQkJMHgxODAKKyNkZWZpbmUJUlBNQUNfQ0NLQ1JYUkMzMkVSCQkJMHgxODQKKyNkZWZpbmUJUlBNQUNfQ0NLQ1JYUkMzMk9LCQkJMHgxODgKKyNkZWZpbmUJUlBNQUNfVFhTVEFUVVMJCQkJMHgxOGMKKworI2RlZmluZQlSRlBHQTBfUkZNT0QJCQkJMHg4MDAKKworI2RlZmluZQlSRlBHQTBfVFhJTkZPCQkJCTB4ODA0CisjZGVmaW5lCVJGUEdBMF9QU0RGVU5DVElPTgkJCTB4ODA4CisKKyNkZWZpbmUJUkZQR0EwX1RYR0FJTlNUQUdFCQkJMHg4MGMKKworI2RlZmluZQlSRlBHQTBfUkZUSU1JTkcxCQkJMHg4MTAKKyNkZWZpbmUJUkZQR0EwX1JGVElNSU5HMgkJCTB4ODE0CisKKyNkZWZpbmUJUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIxCTB4ODIwCisjZGVmaW5lCVJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMgkweDgyNAorI2RlZmluZQlSRlBHQTBfWEJfSFNTSVBBUkFNRVRFUjEJMHg4MjgKKyNkZWZpbmUJUkZQR0EwX1hCX0hTU0lQQVJBTUVURVIyCTB4ODJjCisjZGVmaW5lIAlSQ0NBT05TRUMJCQkJCTB4ODM4CisKKyNkZWZpbmUJUkZQR0EwX1hBX0xTU0lQQVJBTUVURVIJCTB4ODQwCisjZGVmaW5lCVJGUEdBMF9YQl9MU1NJUEFSQU1FVEVSCQkweDg0NAorI2RlZmluZQlSTDFQRUFLVEgJCQkJCTB4ODQ4CisKKyNkZWZpbmUJUkZQR0EwX1JGV0FLRVVQUEFSQU1FVEVSCTB4ODUwCisjZGVmaW5lCVJGUEdBMF9SRlNMRUVQVVBQQVJBTUVURVIJMHg4NTQKKworI2RlZmluZQlSRlBHQTBfWEFCX1NXSVRDSENPTlRST0wJMHg4NTgKKyNkZWZpbmUJUkZQR0EwX1hDRF9TV0lUQ0hDT05UUk9MCTB4ODVjCisKKyNkZWZpbmUJUkZQR0EwX1hBX1JGSU5URVJGQUNFT0UJCTB4ODYwCisjZGVmaW5lIFJGQ19BUkVBCQkJCQkweDg2MAorI2RlZmluZQlSRlBHQTBfWEJfUkZJTlRFUkZBQ0VPRQkJMHg4NjQKKworI2RlZmluZQlSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1cJMHg4NzAKKyNkZWZpbmUJUkZQR0EwX1hDRF9SRklOVEVSRkFDRVNXCTB4ODc0CisKKyNkZWZpbmUJckZQR0EwX1hBQl9SRlBBUkFNRVRFUgkJMHg4NzgKKyNkZWZpbmUJckZQR0EwX1hDRF9SRlBBUkFNRVRFUgkJMHg4N2MKKworI2RlZmluZQlSRlBHQTBfQU5BTE9HUEFSQU1FVEVSMQkJMHg4ODAKKyNkZWZpbmUJUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjIJCTB4ODg0CisjZGVmaW5lCVJGUEdBMF9BTkFMT0dQQVJBTUVURVIzCQkweDg4OAorI2RlZmluZQlSRlBHQTBfQU5BTE9HUEFSQU1FVEVSNAkJMHg4OGMKKworI2RlZmluZQlSRlBHQTBfWEFfTFNTSVJFQURCQUNLCQkweDhhMAorI2RlZmluZQlSRlBHQTBfWEJfTFNTSVJFQURCQUNLCQkweDhhNAorI2RlZmluZQlSRlBHQTBfWENfTFNTSVJFQURCQUNLCQkweDhhOAorLy8jZGVmaW5lCVJGUEdBMF9YRF9MU1NJUkVBREJBQ0sJCTB4OGFjCisjZGVmaW5lIFJSRk1PRAkJCQkJCTB4OGFjCisjZGVmaW5lCVJIU1NJUkVBRF84ODIxQUUJCQkweDhiMAorCisjZGVmaW5lCVJGUEdBMF9QU0RSRVBPUlQJCQkweDhiNAorI2RlZmluZQlUUkFOU0NFSVZFQV9IU1BJX1JFQURCQUNLCTB4OGI4CisjZGVmaW5lCVRSQU5TQ0VJVkVCX0hTUElfUkVBREJBQ0sJMHg4YmMKKy8vI2RlZmluZQlSRUdfU0NfQ05UCQkJCQkweDhjNAorI2RlZmluZSBSQURDX0JVRl9DTEsJCQkJMHg4YzQKKyNkZWZpbmUJUkZQR0EwX1hBQl9SRklOVEVSRkFDRVJCCTB4OGUwCisjZGVmaW5lCVJGUEdBMF9YQ0RfUkZJTlRFUkZBQ0VSQgkweDhlNAorCisjZGVmaW5lCVJGUEdBMV9SRk1PRAkJCQkweDkwMAorCisjZGVmaW5lCVJGUEdBMV9UWEJMT0NLCQkJCTB4OTA0CisjZGVmaW5lCVJGUEdBMV9ERUJVR1NFTEVDVAkJCTB4OTA4CisjZGVmaW5lCVJGUEdBMV9UWElORk8JCQkJMHg5MGMKKworI2RlZmluZQlSQ0NLX1NZU1RFTQkJCQkJMHhhMDAKKyNkZWZpbmUJQkNDS19TWVNURU0JCQkJCTB4MTAKKworCisjZGVmaW5lCVJDQ0swX0FGRVNFVFRJTkcJCQkweGEwNAorI2RlZmluZQlSQ0NLMF9DQ0EJCQkJCTB4YTA4CisKKyNkZWZpbmUJUkNDSzBfUlhBR0MxCQkJCTB4YTBjCisjZGVmaW5lCVJDQ0swX1JYQUdDMgkJCQkweGExMAorCisjZGVmaW5lCVJDQ0swX1JYSFAJCQkJCTB4YTE0CisKKyNkZWZpbmUJUkNDSzBfRFNQUEFSQU1FVEVSMQkJCTB4YTE4CisjZGVmaW5lCVJDQ0swX0RTUFBBUkFNRVRFUjIJCQkweGExYworCisjZGVmaW5lCVJDQ0swX1RYRklMVEVSMQkJCQkweGEyMAorI2RlZmluZQlSQ0NLMF9UWEZJTFRFUjIJCQkJMHhhMjQKKyNkZWZpbmUJUkNDSzBfREVCVUdQT1JUCQkJCTB4YTI4CisjZGVmaW5lCVJDQ0swX0ZBTFNFQUxBUk1SRVBPUlQJCTB4YTJjCisjZGVmaW5lCVJDQ0swX1RSU1NJUkVQT1JUICAgICAgICAgCTB4YTUwCisjZGVmaW5lCVJDQ0swX1JYUkVQT1JUICAgICAgICAgICAgCTB4YTU0CisjZGVmaW5lCVJDQ0swX0ZBQ09VTlRFUkxPV0VSICAgICAgCTB4YTVjCisjZGVmaW5lCVJDQ0swX0ZBQ09VTlRFUlVQUEVSICAgICAgCTB4YTU4CisjZGVmaW5lCVJDQ0swX0NDQV9DTlQJCQkweGE2MAorCisKKy8qIFBhZ2VCKDB4QjAwKSAqLworI2RlZmluZQlyUGRwX0FudEEgICAgICAJCQkJCTB4YjAwCisjZGVmaW5lCXJQZHBfQW50QV80ICAgIAkJCQkweGIwNAorI2RlZmluZQlyUGRwX0FudEFfOCAgICAJCQkJMHhiMDgKKyNkZWZpbmUJclBkcF9BbnRBX0MgICAgCQkJCTB4YjBjCisjZGVmaW5lCXJQZHBfQW50QV8xMCAgICAJCQkJMHhiMTAKKyNkZWZpbmUJclBkcF9BbnRBXzE0ICAgIAkJCQkweGIxNAorI2RlZmluZQlyUGRwX0FudEFfMTggICAgCQkJCTB4YjE4CisjZGVmaW5lCXJQZHBfQW50QV8xQyAgICAJCQkJMHhiMWMKKyNkZWZpbmUJclBkcF9BbnRBXzIwICAgIAkJCQkweGIyMAorI2RlZmluZQlyUGRwX0FudEFfMjQgICAgCQkJCTB4YjI0CisKKyNkZWZpbmUJckNvbmZpZ19QbXBkX0FudEEgCQkJMHhiMjgKKyNkZWZpbmUJckNvbmZpZ19yYW02NHgxNgkJCQkweGIyYworCisjZGVmaW5lCXJCbmRBCQkJCQkJMHhiMzAKKyNkZWZpbmUJckhzc2lQYXIJCQkJCQkweGIzNAorCisjZGVmaW5lCXJDb25maWdfQW50QSAJCQkJCTB4YjY4CisjZGVmaW5lCXJDb25maWdfQW50QiAJCQkJCTB4YjZjCisKKyNkZWZpbmUJclBkcF9BbnRCIAkJCQkJMHhiNzAKKyNkZWZpbmUJclBkcF9BbnRCXzQgCQkJCQkweGI3NAorI2RlZmluZQlyUGRwX0FudEJfOCAJCQkJCTB4Yjc4CisjZGVmaW5lCXJQZHBfQW50Ql9DIAkJCQkJMHhiN2MKKyNkZWZpbmUJclBkcF9BbnRCXzEwIAkJCQkJMHhiODAKKyNkZWZpbmUJclBkcF9BbnRCXzE0IAkJCQkJMHhiODQKKyNkZWZpbmUJclBkcF9BbnRCXzE4IAkJCQkJMHhiODgKKyNkZWZpbmUJclBkcF9BbnRCXzFDIAkJCQkJMHhiOGMKKyNkZWZpbmUJclBkcF9BbnRCXzIwIAkJCQkJMHhiOTAKKyNkZWZpbmUJclBkcF9BbnRCXzI0IAkJCQkJMHhiOTQKKworI2RlZmluZQlyQ29uZmlnX1BtcGRfQW50QgkJCTB4Yjk4CisKKyNkZWZpbmUJckJuZEIJCQkJCQkweGJhMAorCisjZGVmaW5lCXJBUEsJCQkJCQkJMHhiZDgKKyNkZWZpbmUJclBtX1J4MF9BbnRBCQkJCTB4YmRjCisjZGVmaW5lCXJQbV9SeDFfQW50QQkJCQkweGJlMAorI2RlZmluZQlyUG1fUngyX0FudEEJCQkJMHhiZTQKKyNkZWZpbmUJclBtX1J4M19BbnRBCQkJCTB4YmU4CisjZGVmaW5lCXJQbV9SeDBfQW50QgkJCQkweGJlYworI2RlZmluZQlyUG1fUngxX0FudEIJCQkJMHhiZjAKKyNkZWZpbmUJclBtX1J4Ml9BbnRCCQkJCTB4YmY0CisjZGVmaW5lCXJQbV9SeDNfQW50QgkJCQkweGJmOAorCisvKlJTU0kgRHVtcCovCisjZGVmaW5lCQlSQV9SU1NJX0RVTVAJCTB4QkYwCisjZGVmaW5lCQlSQl9SU1NJX0RVTVAJCTB4QkYxCisjZGVmaW5lCQlSUzFfUlhfRVZNX0RVTVAJMHhCRjQKKyNkZWZpbmUJCVJTMl9SWF9FVk1fRFVNUAkweEJGNQorI2RlZmluZQkJUkFfUlhfU05SX0RVTVAJCTB4QkY2CisjZGVmaW5lCQlSQl9SWF9TTlJfRFVNUAkJMHhCRjcKKyNkZWZpbmUJCVJBX0NGT19TSE9SVF9EVU1QCTB4QkY4CisjZGVmaW5lCQlSQl9DRk9fU0hPUlRfRFVNUAkweEJGQQorI2RlZmluZQkJUkFfQ0ZPX0xPTkdfRFVNUAkweEJFQworI2RlZmluZQkJUkJfQ0ZPX0xPTkdfRFVNUAkweEJFRQorCisvKlBhZ2UgQyovCisjZGVmaW5lCVJPRkRNMF9MU1RGCQkJCQkweGMwMAorCisjZGVmaW5lCVJPRkRNMF9UUlhQQVRIRU5BQkxFCQkweGMwNAorI2RlZmluZQlST0ZETTBfVFJNVVhQQVIJCQkJMHhjMDgKKyNkZWZpbmUJUk9GRE0wX1RSU1dJU09MQVRJT04JCTB4YzBjCisKKyNkZWZpbmUJUk9GRE0wX1hBUlhBRkUJCQkJMHhjMTAKKyNkZWZpbmUJUk9GRE0wX1hBUlhJUUlNQkFMQU5DRSAgICAJMHhjMTQKKyNkZWZpbmUJUk9GRE0wX1hCUlhBRkUgICAgICAgICAgICAJMHhjMTgKKyNkZWZpbmUJUk9GRE0wX1hCUlhJUUlNQkFMQU5DRSAgICAJMHhjMWMKKyNkZWZpbmUJUk9GRE0wX1hDUlhBRkUgICAgICAgICAgICAJMHhjMjAKKyNkZWZpbmUJUk9GRE0wX1hDUlhJUUlNQkFOTEFOQ0UgICAgCTB4YzI0CisjZGVmaW5lCVJPRkRNMF9YRFJYQUZFICAgICAgICAgICAgCTB4YzI4CisjZGVmaW5lCVJPRkRNMF9YRFJYSVFJTUJBTEFOQ0UgICAgCTB4YzJjCisKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IxCQkJMHhjMzAKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IyCQkJMHhjMzQKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IzCQkJMHhjMzgKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1I0CQkJMHhjM2MKKworI2RlZmluZQlST0ZETTBfUlhEU1AJCQkJMHhjNDAKKyNkZWZpbmUJUk9GRE0wX0NGT0FORERBR0MJCQkweGM0NAorI2RlZmluZQlST0ZETTBfQ0NBRFJPUFRIUkVTSE9MRAkJMHhjNDgKKyNkZWZpbmUJUk9GRE0wX0VDQ0FUSFJFU0hPTEQJCTB4YzRjCisKKyNkZWZpbmUJUk9GRE0wX1hBQUdDQ09SRTEJCQkweGM1MAorI2RlZmluZQlST0ZETTBfWEFBR0NDT1JFMgkJCTB4YzU0CisjZGVmaW5lCVJPRkRNMF9YQkFHQ0NPUkUxCQkJMHhjNTgKKyNkZWZpbmUJUk9GRE0wX1hCQUdDQ09SRTIJCQkweGM1YworI2RlZmluZQlST0ZETTBfWENBR0NDT1JFMQkJCTB4YzYwCisjZGVmaW5lCVJPRkRNMF9YQ0FHQ0NPUkUyCQkJMHhjNjQKKyNkZWZpbmUJUk9GRE0wX1hEQUdDQ09SRTEJCQkweGM2OAorI2RlZmluZQlST0ZETTBfWERBR0NDT1JFMgkJCTB4YzZjCisKKyNkZWZpbmUJUk9GRE0wX0FHQ1BBUkFNRVRFUjEJCTB4YzcwCisjZGVmaW5lCVJPRkRNMF9BR0NQQVJBTUVURVIyCQkweGM3NAorI2RlZmluZQlST0ZETTBfQUdDUlNTSVRBQkxFCQkJMHhjNzgKKyNkZWZpbmUJUk9GRE0wX0hUU1RGQUdDCQkJCTB4YzdjCisKKyNkZWZpbmUJUk9GRE0wX1hBVFhJUUlNQkFMQU5DRQkJMHhjODAKKyNkZWZpbmUJUk9GRE0wX1hBVFhBRkUJCQkJMHhjODQKKyNkZWZpbmUJUk9GRE0wX1hCVFhJUUlNQkFMQU5DRQkJMHhjODgKKyNkZWZpbmUJUk9GRE0wX1hCVFhBRkUJCQkJMHhjOGMKKyNkZWZpbmUJUk9GRE0wX1hDVFhJUUlNQkFMQU5DRQkJMHhjOTAKKyNkZWZpbmUJUk9GRE0wX1hDVFhBRkUgICAgICAgICAgICAJMHhjOTQKKyNkZWZpbmUJUk9GRE0wX1hEVFhJUUlNQkFMQU5DRQkJMHhjOTgKKyNkZWZpbmUJUk9GRE0wX1hEVFhBRkUJCQkJMHhjOWMKKworI2RlZmluZSBST0ZETTBfUlhJUUVYVEFOVEEJCQkweGNhMAorI2RlZmluZQlST0ZETTBfVFhDT0VGRjEJCQkJMHhjYTQKKyNkZWZpbmUJUk9GRE0wX1RYQ09FRkYyCQkJCTB4Y2E4CisjZGVmaW5lCVJPRkRNMF9UWENPRUZGMwkJCQkweGNhYworI2RlZmluZQlST0ZETTBfVFhDT0VGRjQJCQkJMHhjYjAKKyNkZWZpbmUJUk9GRE0wX1RYQ09FRkY1CQkJCTB4Y2I0CisjZGVmaW5lCVJPRkRNMF9UWENPRUZGNgkJCQkweGNiOAorCisvKlBhdGhfQSBSRkUgY290cm9sICovCisjZGVmaW5lCVJBX1JGRV9DVFJMXzg4MTIJCQkJMHhjYjgKKy8qUGF0aF9CIFJGRSBjb250cm9sKi8KKyNkZWZpbmUJUkJfUkZFX0NUUkxfODgxMgkJCQkweGViOAorCisjZGVmaW5lCVJPRkRNMF9SWEhQUEFSQU1FVEVSCQkweGNlMAorI2RlZmluZQlST0ZETTBfVFhQU0VVRE9OT0lTRVdHVAkJMHhjZTQKKyNkZWZpbmUJUk9GRE0wX0ZSQU1FU1lOQwkJCTB4Y2YwCisjZGVmaW5lCVJPRkRNMF9ERlNSRVBPUlQJCQkweGNmNAorCisKKyNkZWZpbmUJUk9GRE0xX0xTVEYJCQkJCTB4ZDAwCisjZGVmaW5lCVJPRkRNMV9UUlhQQVRIRU5BQkxFCQkweGQwNAorCisjZGVmaW5lCVJPRkRNMV9DRjAJCQkJCTB4ZDA4CisjZGVmaW5lCVJPRkRNMV9DU0kxCQkJCQkweGQxMAorI2RlZmluZQlST0ZETTFfU0JECQkJCQkweGQxNAorI2RlZmluZQlST0ZETTFfQ1NJMgkJCQkJMHhkMTgKKyNkZWZpbmUJUk9GRE0xX0NGT1RSQUNLSU5HCQkJMHhkMmMKKyNkZWZpbmUJUk9GRE0xX1RSWE1FU0FVUkUxCQkJMHhkMzQKKyNkZWZpbmUJUk9GRE0xX0lOVEZERVQJCQkJMHhkM2MKKyNkZWZpbmUJUk9GRE0xX1BTRVVET05PSVNFU1RBVEVBQgkweGQ1MAorI2RlZmluZQlST0ZETTFfUFNFVURPTk9JU0VTVEFURUNECTB4ZDU0CisjZGVmaW5lCVJPRkRNMV9SWFBTRVVET05PSVNFV0dUCQkweGQ1OAorCisjZGVmaW5lCVJPRkRNX1BIWUNPVU5URVIxCQkJMHhkYTAKKyNkZWZpbmUJUk9GRE1fUEhZQ09VTlRFUjIJCQkweGRhNAorI2RlZmluZQlST0ZETV9QSFlDT1VOVEVSMwkJCTB4ZGE4CisKKyNkZWZpbmUJUk9GRE1fU0hPUlRDRk9BQgkJCTB4ZGFjCisjZGVmaW5lCVJPRkRNX1NIT1JUQ0ZPQ0QJCQkweGRiMAorI2RlZmluZQlST0ZETV9MT05HQ0ZPQUIJCQkJMHhkYjQKKyNkZWZpbmUJUk9GRE1fTE9OR0NGT0NECQkJCTB4ZGI4CisjZGVmaW5lCVJPRkRNX1RBSUxDRjBBQgkJCQkweGRiYworI2RlZmluZQlST0ZETV9UQUlMQ0YwQ0QJCQkJMHhkYzAKKyNkZWZpbmUJUk9GRE1fUFdNRUFTVVJFMSAgICAgICAgICAJMHhkYzQKKyNkZWZpbmUJUk9GRE1fUFdNRUFTVVJFMiAgICAgICAgICAJMHhkYzgKKyNkZWZpbmUJUk9GRE1fQldSRVBPUlQJCQkJMHhkY2MKKyNkZWZpbmUJUk9GRE1fQUdDUkVQT1JUCQkJCTB4ZGQwCisjZGVmaW5lCVJPRkRNX1JYU05SCQkJCQkweGRkNAorI2RlZmluZQlST0ZETV9SWEVWTUNTSQkJCQkweGRkOAorI2RlZmluZQlST0ZETV9TSUdSRVBPUlQJCQkJMHhkZGMKKworI2RlZmluZSBSVFhBR0NfQV9DQ0sxMV9DQ0sxCQkJMHhjMjAKKyNkZWZpbmUgUlRYQUdDX0FfT0ZETTE4X09GRE02CQkweGMyNAorI2RlZmluZSBSVFhBR0NfQV9PRkRNNTRfT0ZETTI0CQkweGMyOAorI2RlZmluZSBSVFhBR0NfQV9NQ1MwM19NQ1MwMAkJCTB4YzJjCisjZGVmaW5lIFJUWEFHQ19BX01DUzA3X01DUzA0CQkJMHhjMzAKKyNkZWZpbmUgUlRYQUdDX0FfTUNTMTFfTUNTMDgJCQkweGMzNAorI2RlZmluZSBSVFhBR0NfQV9NQ1MxNV9NQ1MxMgkJMHhjMzgKKyNkZWZpbmUgUlRYQUdDX0FfTlNTMUlOREVYM19OU1MxSU5ERVgwCTB4YzNjCisjZGVmaW5lCVJUWEFHQ19BX05TUzFJTkRFWDdfTlNTMUlOREVYNAkweGM0MAorI2RlZmluZQlSVFhBR0NfQV9OU1MySU5ERVgxX05TUzFJTkRFWDgJMHhjNDQKKyNkZWZpbmUJUlRYQUdDX0FfTlNTMklOREVYNV9OU1MySU5ERVgyCTB4YzQ4CisjZGVmaW5lCVJUWEFHQ19BX05TUzJJTkRFWDlfTlNTMklOREVYNgkweGM0YworI2RlZmluZQlSVFhBR0NfQl9DQ0sxMV9DQ0sxCQkJMHhlMjAKKyNkZWZpbmUJUlRYQUdDX0JfT0ZETTE4X09GRE02CQkweGUyNAorI2RlZmluZQlSVFhBR0NfQl9PRkRNNTRfT0ZETTI0CQkweGUyOAorI2RlZmluZQlSVFhBR0NfQl9NQ1MwM19NQ1MwMAkJCTB4ZTJjCisjZGVmaW5lCVJUWEFHQ19CX01DUzA3X01DUzA0CQkJMHhlMzAKKyNkZWZpbmUJUlRYQUdDX0JfTUNTMTFfTUNTMDgJCQkweGUzNAorI2RlZmluZQlSVFhBR0NfQl9NQ1MxNV9NQ1MxMgkJMHhlMzgKKyNkZWZpbmUJUlRYQUdDX0JfTlNTMUlOREVYM19OU1MxSU5ERVgwCTB4ZTNjCisjZGVmaW5lCVJUWEFHQ19CX05TUzFJTkRFWDdfTlNTMUlOREVYNAkweGU0MAorI2RlZmluZQlSVFhBR0NfQl9OU1MySU5ERVgxX05TUzFJTkRFWDgJMHhlNDQKKyNkZWZpbmUJUlRYQUdDX0JfTlNTMklOREVYNV9OU1MySU5ERVgyCTB4ZTQ4CisjZGVmaW5lCVJUWEFHQ19CX05TUzJJTkRFWDlfTlNTMklOREVYNgkweGU0YworCisjZGVmaW5lCVJBX1RYUFdSVFJBSU5HCQkweGM1NAorI2RlZmluZQlSQl9UWFBXUlRSQUlORwkJMHhlNTQKKworCisjZGVmaW5lCVJGUEdBMF9JUUsJCQkJCTB4ZTI4CisjZGVmaW5lCVJUeF9JUUtfVG9uZV9BCQkJCTB4ZTMwCisjZGVmaW5lCVJSeF9JUUtfVG9uZV9BCQkJCTB4ZTM0CisjZGVmaW5lCVJUeF9JUUtfUElfQQkJCQkJMHhlMzgKKyNkZWZpbmUJUlJ4X0lRS19QSV9BCQkJCQkweGUzYworCisjZGVmaW5lCVJUeF9JUUsgCQkJCQkJMHhlNDAKKyNkZWZpbmUJUlJ4X0lRSwkJCQkJCTB4ZTQ0CisjZGVmaW5lCVJJUUtfQUdDX1B0cwkJCQkJMHhlNDgKKyNkZWZpbmUJUklRS19BR0NfUnNwCQkJCQkweGU0YworI2RlZmluZQlSVHhfSVFLX1RvbmVfQgkJCQkweGU1MAorI2RlZmluZQlSUnhfSVFLX1RvbmVfQgkJCQkweGU1NAorI2RlZmluZQlSVHhfSVFLX1BJX0IJCQkJCTB4ZTU4CisjZGVmaW5lCVJSeF9JUUtfUElfQgkJCQkJMHhlNWMKKyNkZWZpbmUJUklRS19BR0NfQ29udAkJCQkweGU2MAorCisjZGVmaW5lCVJCbHVlX1Rvb3RoCQkJCQkweGU2YworI2RlZmluZQlSUnhfV2FpdF9DQ0EJCQkJCTB4ZTcwCisjZGVmaW5lCVJUeF9DQ0tfUkZPTgkJCQkJMHhlNzQKKyNkZWZpbmUJUlR4X0NDS19CQk9OCQkJCTB4ZTc4CisjZGVmaW5lCVJUeF9PRkRNX1JGT04JCQkJMHhlN2MKKyNkZWZpbmUJUlR4X09GRE1fQkJPTgkJCQkweGU4MAorI2RlZmluZQlSVHhfVG9fUngJCQkJCTB4ZTg0CisjZGVmaW5lCVJUeF9Ub19UeAkJCQkJMHhlODgKKyNkZWZpbmUJUlJ4X0NDSwkJCQkJCTB4ZThjCisKKyNkZWZpbmUJUlR4X1Bvd2VyX0JlZm9yZV9JUUtfQQkJMHhlOTQKKyNkZWZpbmUJUlR4X1Bvd2VyX0FmdGVyX0lRS19BCQkJMHhlOWMKKworI2RlZmluZQlSUnhfUG93ZXJfQmVmb3JlX0lRS19BCQkweGVhMAorI2RlZmluZQlSUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIJCTB4ZWE0CisjZGVmaW5lCVJSeF9Qb3dlcl9BZnRlcl9JUUtfQQkJCTB4ZWE4CisjZGVmaW5lCVJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yCQkweGVhYworCisjZGVmaW5lCVJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IJCTB4ZWI0CisjZGVmaW5lCVJUeF9Qb3dlcl9BZnRlcl9JUUtfQgkJCTB4ZWJjCisKKyNkZWZpbmUJUlJ4X1Bvd2VyX0JlZm9yZV9JUUtfQgkJMHhlYzAKKyNkZWZpbmUJUlJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yCQkweGVjNAorI2RlZmluZQlSUnhfUG93ZXJfQWZ0ZXJfSVFLX0IJCQkweGVjOAorI2RlZmluZQlSUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMgkJMHhlY2MKKworI2RlZmluZQlSUnhfT0ZETQkJCQkJMHhlZDAKKyNkZWZpbmUJUlJ4X1dhaXRfUklGUyAJCQkJMHhlZDQKKyNkZWZpbmUJUlJ4X1RPX1J4IAkJCQkJMHhlZDgKKyNkZWZpbmUJUlN0YW5kYnkgCQkJCQkJMHhlZGMKKyNkZWZpbmUJUlNsZWVwIAkJCQkJCTB4ZWUwCisjZGVmaW5lCVJQTVBEX0FOQUVOCQkJCTB4ZWVjCisKKyNkZWZpbmUJUlpFQlJBMV9IU1NJRU5BQkxFCQkJMHgwCisjZGVmaW5lCVJaRUJSQTFfVFJYRU5BQkxFMQkJCTB4MQorI2RlZmluZQlSWkVCUkExX1RSWEVOQUJMRTIJCQkweDIKKyNkZWZpbmUJUlpFQlJBMV9BR0MJCQkJCTB4NAorI2RlZmluZQlSWkVCUkExX0NIQVJHRVBVTVAJCQkweDUKKyNkZWZpbmUJUlpFQlJBMV9DSEFOTkVMCQkJCTB4NworCisjZGVmaW5lCVJaRUJSQTFfVFhHQUlOCQkJCTB4OAorI2RlZmluZQlSWkVCUkExX1RYTFBGCQkJCTB4OQorI2RlZmluZQlSWkVCUkExX1JYTFBGCQkJCTB4YgorI2RlZmluZQlSWkVCUkExX1JYSFBGQ09STkVSCQkJMHhjCisKKyNkZWZpbmUJUkdMT0JBTENUUkwJCQkJCTAKKyNkZWZpbmUJUlJUTDgyNTZfVFhMUEYJCQkJMTkKKyNkZWZpbmUJUlJUTDgyNTZfUlhMUEYJCQkJMTEKKyNkZWZpbmUJUlJUTDgyNThfVFhMUEYJCQkJMHgxMQorI2RlZmluZQlSUlRMODI1OF9SWExQRgkJCQkweDEzCisjZGVmaW5lCVJSVEw4MjU4X1JTU0lMUEYJCQkweGEKKworI2RlZmluZQlSRl9BQwkJCQkJCTB4MDAKKworI2RlZmluZQlSRl9JUUFESl9HMQkJCQkJMHgwMQorI2RlZmluZQlSRl9JUUFESl9HMgkJCQkJMHgwMgorI2RlZmluZQlSRl9QT1dfVFJTVwkJCQkJMHgwNQorCisjZGVmaW5lCVJGX0dBSU5fUlgJCQkJCTB4MDYKKyNkZWZpbmUJUkZfR0FJTl9UWAkJCQkJMHgwNworCisjZGVmaW5lCVJGX1RYTV9JREFDCQkJCQkweDA4CisjZGVmaW5lCVJGX0JTX0lRR0VOCQkJCQkweDBGCisKKyNkZWZpbmUJUkZfTU9ERTEJCQkJCTB4MTAKKyNkZWZpbmUJUkZfTU9ERTIJCQkJCTB4MTEKKworI2RlZmluZQlSRl9SWF9BR0NfSFAJCQkJMHgxMgorI2RlZmluZQlSRl9UWF9BR0MJCQkJCTB4MTMKKyNkZWZpbmUJUkZfQklBUwkJCQkJCTB4MTQKKyNkZWZpbmUJUkZfSVBBCQkJCQkJMHgxNQorI2RlZmluZQlSRl9QT1dfQUJJTElUWQkJCQkweDE3CisjZGVmaW5lCVJGX01PREVfQUcJCQkJCTB4MTgKKyNkZWZpbmUJUlJGQ0hBTk5FTAkJCQkJMHgxOAorI2RlZmluZQlSRl9DSE5MQlcJCQkJCTB4MTgKKyNkZWZpbmUJUkZfVE9QCQkJCQkJMHgxOQorCisjZGVmaW5lCVJGX1JYX0cxCQkJCQkweDFBCisjZGVmaW5lCVJGX1JYX0cyCQkJCQkweDFCCisKKyNkZWZpbmUJUkZfUlhfQkIyCQkJCQkweDFDCisjZGVmaW5lCVJGX1JYX0JCMQkJCQkJMHgxRAorCisjZGVmaW5lCVJGX1JDSzEJCQkJCQkweDFFCisjZGVmaW5lCVJGX1JDSzIJCQkJCQkweDFGCisKKyNkZWZpbmUJUkZfVFhfRzEJCQkJCTB4MjAKKyNkZWZpbmUJUkZfVFhfRzIJCQkJCTB4MjEKKyNkZWZpbmUJUkZfVFhfRzMJCQkJCTB4MjIKKworI2RlZmluZQlSRl9UWF9CQjEJCQkJCTB4MjMKKyNkZWZpbmUJUkZfVF9NRVRFUgkJCQkJMHgyNAorI2RlZmluZQlSRl9UX01FVEVSXzg4RQkJCQkweDQyCisjZGVmaW5lICBSRl9UX01FVEVSXzg4MTJBIAkJMHg0MgorCisjZGVmaW5lCVJGX1NZTl9HMQkJCQkJMHgyNQorI2RlZmluZQlSRl9TWU5fRzIJCQkJCTB4MjYKKyNkZWZpbmUJUkZfU1lOX0czCQkJCQkweDI3CisjZGVmaW5lCVJGX1NZTl9HNAkJCQkJMHgyOAorI2RlZmluZQlSRl9TWU5fRzUJCQkJCTB4MjkKKyNkZWZpbmUJUkZfU1lOX0c2CQkJCQkweDJBCisjZGVmaW5lCVJGX1NZTl9HNwkJCQkJMHgyQgorI2RlZmluZQlSRl9TWU5fRzgJCQkJCTB4MkMKKworI2RlZmluZQlSRl9SQ0tfT1MJCQkJCTB4MzAKKyNkZWZpbmUJUkZfVFhQQV9HMQkJCQkJMHgzMQorI2RlZmluZQlSRl9UWFBBX0cyCQkJCQkweDMyCisjZGVmaW5lCVJGX1RYUEFfRzMJCQkJCTB4MzMKKworI2RlZmluZQlSRl9UWF9CSUFTX0EJCQkJCTB4MzUKKyNkZWZpbmUJUkZfVFhfQklBU19ECQkJCQkweDM2CisjZGVmaW5lCVJGX0xPQkZfOQkJCQkJMHgzOAorI2RlZmluZQlSRl9SWFJGX0EzCQkJCQkweDNDCisjZGVmaW5lCVJGX1RSU1cJCQkJCQkweDNGCisKKyNkZWZpbmUJUkZfVFhSRl9BMgkJCQkJMHg0MQorI2RlZmluZQlSRl9UWFBBX0c0CQkJCQkweDQ2CisjZGVmaW5lCVJGX1RYUEFfQTQJCQkJCTB4NEIKKworI2RlZmluZSBSRl9BUEsJCQkJCQkweDYzCisKKyNkZWZpbmUJUkZfV0VfTFVUCQkJCQkweEVGCisKKyNkZWZpbmUJQkJCUkVTRVRCCQkJCQkweDEwMAorI2RlZmluZQlCR0xPQkFMUkVTRVRCCQkJCTB4MjAwCisjZGVmaW5lCUJPRkRNVFhTVEFSVAkJCQkweDQKKyNkZWZpbmUJQkNDS1RYU1RBUlQJCQkJCTB4OAorI2RlZmluZQlCQ1JDMzJERUJVRwkJCQkJMHgxMDAKKyNkZWZpbmUJQlBNQUNMT09QQkFDSwkJCQkweDEwCisjZGVmaW5lCUJUWExTSUcJCQkJCQkweGZmZmZmZgorI2RlZmluZQlCT0ZETVRYUkFURQkJCQkJMHhmCisjZGVmaW5lCUJPRkRNVFhSRVNFUlZFRAkJCQkweDEwCisjZGVmaW5lCUJPRkRNVFhMRU5HVEgJCQkJMHgxZmZlMAorI2RlZmluZQlCT0ZETVRYUEFSSVRZCQkJCTB4MjAwMDAKKyNkZWZpbmUJQlRYSFRTSUcxCQkJCQkweGZmZmZmZgorI2RlZmluZQlCVFhIVE1DU1JBVEUJCQkJMHg3ZgorI2RlZmluZQlCVFhIVEJXCQkJCQkJMHg4MAorI2RlZmluZQlCVFhIVExFTkdUSAkJCQkJMHhmZmZmMDAKKyNkZWZpbmUJQlRYSFRTSUcyCQkJCQkweGZmZmZmZgorI2RlZmluZQlCVFhIVFNNT09USElORwkJCQkweDEKKyNkZWZpbmUJQlRYSFRTT1VORElORwkJCQkweDIKKyNkZWZpbmUJQlRYSFRSRVNFUlZFRAkJCQkweDQKKyNkZWZpbmUJQlRYSFRBR0dSRUFUSU9OCQkJCTB4OAorI2RlZmluZQlCVFhIVFNUQkMJCQkJCTB4MzAKKyNkZWZpbmUJQlRYSFRBRFZBTkNFQ09ESU5HCQkJMHg0MAorI2RlZmluZQlCVFhIVFNIT1JUR0kJCQkJMHg4MAorI2RlZmluZQlCVFhIVE5VTUJFUkhUX0xURgkJCTB4MzAwCisjZGVmaW5lCUJUWEhUQ1JDOAkJCQkJMHgzZmMwMAorI2RlZmluZQlCQ09VTlRFUlJFU0VUCQkJCTB4MTAwMDAKKyNkZWZpbmUJQk5VTU9GT0ZETVRYCQkJCTB4ZmZmZgorI2RlZmluZQlCTlVNT0ZDQ0tUWAkJCQkJMHhmZmZmMDAwMAorI2RlZmluZQlCVFhJRExFSU5URVJWQUwJCQkJMHhmZmZmCisjZGVmaW5lCUJPRkRNU0VSVklDRQkJCQkweGZmZmYwMDAwCisjZGVmaW5lCUJUWE1BQ0hFQURFUgkJCQkweGZmZmZmZmZmCisjZGVmaW5lCUJUWERBVEFJTklUCQkJCQkweGZmCisjZGVmaW5lCUJUWEhUTU9ERQkJCQkJMHgxMDAKKyNkZWZpbmUJQlRYREFUQVRZUEUJCQkJCTB4MzAwMDAKKyNkZWZpbmUJQlRYUkFORE9NU0VFRAkJCQkweGZmZmZmZmZmCisjZGVmaW5lCUJDQ0tUWFBSRUFNQkxFCQkJCTB4MQorI2RlZmluZQlCQ0NLVFhTRkQJCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUJQkNDS1RYU0lHCQkJCQkweGZmCisjZGVmaW5lCUJDQ0tUWFNFUlZJQ0UJCQkJMHhmZjAwCisjZGVmaW5lCUJDQ0tMRU5HVEhFWFQJCQkJMHg4MDAwCisjZGVmaW5lCUJDQ0tUWExFTkdIVAkJCQkweGZmZmYwMDAwCisjZGVmaW5lCUJDQ0tUWENSQzE2CQkJCQkweGZmZmYKKyNkZWZpbmUJQkNDS1RYU1RBVFVTCQkJCTB4MQorI2RlZmluZQlCT0ZETVRYU1RBVFVTCQkJCTB4MgorI2RlZmluZSBJU19CQl9SRUdfT0ZGU0VUXzkyUyhfT2Zmc2V0KQlcCisJKChfT2Zmc2V0ID49IDB4ODAwKSAmJiAoX09mZnNldCA8PSAweGZmZikpCisKKyNkZWZpbmUJQlJGTU9ECQkJCQkJMHgxCisjZGVmaW5lCUJKQVBBTk1PREUJCQkJCTB4MgorI2RlZmluZQlCQ0NLVFhTQwkJCQkJMHgzMAorLyogQmxvY2sgJiBQYXRoIGVuYWJsZSovCisjZGVmaW5lIFJPRkRNQ0NLRU4JCQkJCTB4ODA4CisjZGVmaW5lCUJDQ0tFTgkJCQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUJQk9GRE1FTgkJCQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUJUlJYUEFUSAkJCQkJCTB4ODA4CS8qIFJ4IGFudGVubmEqLworI2RlZmluZQlCUlhQQVRICQkJCQkJMHhmZgorI2RlZmluZQlSVFhQQVRICQkJCQkJMHg4MGMJLyogVHggYW50ZW5uYSovCisjZGVmaW5lCUJUWFBBVEgJCQkJCQkweDBmZmZmZmZmCisjZGVmaW5lCVJDQ0tfUlgJCQkJCQkweGEwNAkvKiBmb3IgY2NrIHJ4IHBhdGggc2VsZWN0aW9uKi8KKyNkZWZpbmUJQkNDS19SWAkJCQkJCTB4MGMwMDAwMDAKKyNkZWZpbmUJUlZIVExFTl9VU0VfTFNJRwkJCTB4OGMzCS8qIFVzZSBMU0lHIGZvciBWSFQgbGVuZ3RoKi8KKworCisjZGVmaW5lCUJPRkRNUlhBRENQSEFTRSAgICAgICAgICAgCTB4MTAwMDAKKyNkZWZpbmUJQk9GRE1UWERBQ1BIQVNFICAgICAgICAgICAJMHg0MDAwMAorI2RlZmluZQlCWEFUWEFHQyAgICAgICAgICAgICAgICAgIAkweDNmCisKKyNkZWZpbmUJQlhCVFhBR0MgICAgICAgICAgICAgICAgICAJMHhmMDAKKyNkZWZpbmUJQlhDVFhBR0MgICAgICAgICAgICAgICAgICAJMHhmMDAwCisjZGVmaW5lCUJYRFRYQUdDICAgICAgICAgICAgICAgICAgCTB4ZjAwMDAKKworI2RlZmluZQlCUEFTVEFSVCAgICAgICAgICAgICAgICAgIAkweGYwMDAwMDAwCisjZGVmaW5lCUJUUlNUQVJUICAgICAgICAgICAgICAgICAgCTB4MDBmMDAwMDAKKyNkZWZpbmUJQlJGU1RBUlQgICAgICAgICAgICAgICAgICAJMHgwMDAwZjAwMAorI2RlZmluZQlCQkJTVEFSVCAgICAgICAgICAgICAgICAgIAkweDAwMDAwMGYwCisjZGVmaW5lCUJCQkNDS1NUQVJUICAgICAgICAgICAgICAgCTB4MDAwMDAwMGYKKyNkZWZpbmUJQlBBRU5EICAgICAgICAgICAgICAgICAgICAJMHhmCisjZGVmaW5lCUJUUkVORCAgICAgICAgICAgICAgICAgICAgCTB4MGYwMDAwMDAKKyNkZWZpbmUJQlJGRU5EICAgICAgICAgICAgICAgICAgICAJMHgwMDBmMDAwMAorI2RlZmluZQlCQ0NBTUFTSyAgICAgICAgICAgICAgICAgIAkweDAwMDAwMGYwCisjZGVmaW5lCUJSMlJDQ0FNQVNLICAgICAgICAgICAgICAgCTB4MDAwMDBmMDAKKyNkZWZpbmUJQkhTU0lfUjJUREVMQVkgICAgICAgICAgICAJMHhmODAwMDAwMAorI2RlZmluZQlCSFNTSV9UMlJERUxBWSAgICAgICAgICAgIAkweGY4MDAwMAorI2RlZmluZQlCQ09OVFhIU1NJICAgICAgICAgICAgICAgCTB4NDAwCisjZGVmaW5lCUJJR0ZST01DQ0sgICAgICAgICAgICAgICAgCTB4MjAwCisjZGVmaW5lCUJBR0NBRERSRVNTICAgICAgICAgICAgICAgCTB4M2YKKyNkZWZpbmUJQlJYSFBUWCAgICAgICAgICAgICAgICAgICAJMHg3MDAwCisjZGVmaW5lCUJSWEhQMlJYICAgICAgICAgICAgICAgICAgCTB4MzgwMDAKKyNkZWZpbmUJQlJYSFBDQ0tJTkkgICAgICAgICAgICAgICAJMHhjMDAwMAorI2RlZmluZQlCQUdDVFhDT0RFICAgICAgICAgICAgICAgIAkweGMwMDAwMAorI2RlZmluZQlCQUdDUlhDT0RFICAgICAgICAgICAgICAgIAkweDMwMDAwMAorCisjZGVmaW5lCUIzV0lSRURBVEFMRU5HVEggICAgICAgICAgCTB4ODAwCisjZGVmaW5lCUIzV0lSRUFERFJFQUFMRU5HVEggICAgICAgCTB4NDAwCisKKyNkZWZpbmUJQjNXSVJFUkZQT1dFUkRPV04gICAgICAgICAJMHgxCisjZGVmaW5lCUI1R1BBUEVQT0xBUklUWSAgICAgICAgICAgCTB4NDAwMDAwMDAKKyNkZWZpbmUJQjJHUEFQRVBPTEFSSVRZICAgICAgICAgICAJMHg4MDAwMDAwMAorI2RlZmluZQlCUkZTV19UWERFRkFVTFRBTlQgICAgICAgIAkweDMKKyNkZWZpbmUJQlJGU1dfVFhPUFRJT05BTlQgICAgICAgICAJMHgzMAorI2RlZmluZQlCUkZTV19SWERFRkFVTFRBTlQgICAgICAgIAkweDMwMAorI2RlZmluZQlCUkZTV19SWE9QVElPTkFOVCAgICAgICAgIAkweDMwMDAKKyNkZWZpbmUJQlJGU0lfM1dJUkVEQVRBICAgICAgICAgICAJMHgxCisjZGVmaW5lCUJSRlNJXzNXSVJFQ0xPQ0sgICAgICAgICAgCTB4MgorI2RlZmluZQlCUkZTSV8zV0lSRUxPQUQgICAgICAgICAgIAkweDQKKyNkZWZpbmUJQlJGU0lfM1dJUkVSVyAgICAgICAgICAgICAJMHg4CisjZGVmaW5lCUJSRlNJXzNXSVJFICAgICAgICAgICAgICAgCTB4ZgorCisjZGVmaW5lCUJSRlNJX1JGRU5WICAgICAgICAgICAgICAgCTB4MTAKKworI2RlZmluZQlCUkZTSV9UUlNXICAgICAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCUJSRlNJX1RSU1dCICAgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJQlJGU0lfQU5UU1cgICAgICAgICAgICAgICAJMHgxMDAKKyNkZWZpbmUJQlJGU0lfQU5UU1dCICAgICAgICAgICAgICAJMHgyMDAKKyNkZWZpbmUJQlJGU0lfUEFQRSAgICAgICAgICAgICAgICAJMHg0MDAKKyNkZWZpbmUJQlJGU0lfUEFQRTVHICAgICAgICAgICAgICAJMHg4MDAKKyNkZWZpbmUJQkJBTkRTRUxFQ1QgICAgICAgICAgICAgICAJMHgxCisjZGVmaW5lCUJIVFNJRzJfR0kgICAgICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJQkhUU0lHMl9TTU9PVEhJTkcgICAgICAgICAJMHgwMQorI2RlZmluZQlCSFRTSUcyX1NPVU5ESU5HICAgICAgICAgIAkweDAyCisjZGVmaW5lCUJIVFNJRzJfQUdHUkVBVE9OICAgICAgICAgCTB4MDgKKyNkZWZpbmUJQkhUU0lHMl9TVEJDICAgICAgICAgICAgICAJMHgzMAorI2RlZmluZQlCSFRTSUcyX0FEVkNPRElORyAgICAgICAgIAkweDQwCisjZGVmaW5lCUJIVFNJRzJfTlVNT0ZIVExURiAgICAgICAgCTB4MzAwCisjZGVmaW5lCUJIVFNJRzJfQ1JDOCAgICAgICAgICAgICAgCTB4M2ZjCisjZGVmaW5lCUJIVFNJRzFfTUNTICAgICAgICAgICAgICAgCTB4N2YKKyNkZWZpbmUJQkhUU0lHMV9CQU5EV0lEVEggICAgICAgICAJMHg4MAorI2RlZmluZQlCSFRTSUcxX0hUTEVOR1RIICAgICAgICAgIAkweGZmZmYKKyNkZWZpbmUJQkxTSUdfUkFURSAgICAgICAgICAgICAgICAJMHhmCisjZGVmaW5lCUJMU0lHX1JFU0VSVkVEICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJQkxTSUdfTEVOR1RIICAgICAgICAgICAgICAJMHgxZmZmZQorI2RlZmluZQlCTFNJR19QQVJJVFkgICAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCUJDQ0tSWFBIQVNFICAgICAgICAgICAgICAgCTB4NAorCisjZGVmaW5lCUJMU1NJUkVBREFERFJFU1MgICAgICAgICAgCTB4N2Y4MDAwMDAKKyNkZWZpbmUJQkxTU0lSRUFERURHRSAgICAgICAgICAgICAJMHg4MDAwMDAwMAorCisjZGVmaW5lCUJMU1NJUkVBREJBQ0tEQVRBICAgICAgICAgCTB4ZmZmZmYKKworI2RlZmluZQlCTFNTSVJFQURPS0ZMQUcgICAgICAgICAgIAkweDEwMDAKKyNkZWZpbmUJQkNDS1NBTVBMRVJBVEUgICAgICAgICAgICAJMHg4CisjZGVmaW5lCUJSRUdVTEFUT1IwU1RBTkRCWSAgICAgICAgCTB4MQorI2RlZmluZQlCUkVHVUxBVE9SUExMU1RBTkRCWSAgICAgIAkweDIKKyNkZWZpbmUJQlJFR1VMQVRPUjFTVEFOREJZICAgICAgICAJMHg0CisjZGVmaW5lCUJQTExQT1dFUlVQICAgICAgICAgICAgICAgCTB4OAorI2RlZmluZQlCRFBMTFBPV0VSVVAgICAgICAgICAgICAgIAkweDEwCisjZGVmaW5lCUJEQTEwUE9XRVJVUCAgICAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJQkFEN1BPV0VSVVAgICAgICAgICAgICAgICAJMHgyMDAKKyNkZWZpbmUJQkRBNlBPV0VSVVAgICAgICAgICAgICAgICAJMHgyMDAwCisjZGVmaW5lCUJYVEFMUE9XRVJVUCAgICAgICAgICAgICAgCTB4NDAwMAorI2RlZmluZQlCNDBNRENMS1BPV0VSVVAgICAgICAgICAgIAkweDgwMDAKKyNkZWZpbmUJQkRBNkRFQlVHTU9ERSAgICAgICAgICAgICAJMHgyMDAwMAorI2RlZmluZQlCREE2U1dJTkcgICAgICAgICAgICAgICAgIAkweDM4MDAwMAorCisjZGVmaW5lCUJBRENMS1BIQVNFICAgICAgICAgICAgICAgCTB4NDAwMDAwMAorI2RlZmluZQlCODBNQ0xLREVMQVkgICAgICAgICAgICAgIAkweDE4MDAwMDAwCisjZGVmaW5lCUJBRkVXQVRDSERPR0VOQUJMRSAgICAgICAgCTB4MjAwMDAwMDAKKworI2RlZmluZQlCWFRBTENBUDAxICAgICAgICAgICAgICAgIAkweGMwMDAwMDAwCisjZGVmaW5lCUJYVEFMQ0FQMjMgICAgICAgICAgICAgICAgCTB4MworI2RlZmluZQlCWFRBTENBUDkyWAkJCQkJMHgwZjAwMDAwMAorI2RlZmluZSBCWFRBTENBUCAgICAgICAgICAgICAgICAJMHgwZjAwMDAwMAorCisjZGVmaW5lCUJJTlRESUZDTEtFTkFCTEUgICAgICAgICAgCTB4NDAwCisjZGVmaW5lCUJFWFRTSUdDTEtFTkFCTEUgICAgICAgICAJMHg4MDAKKyNkZWZpbmUJQkJBTkRHQVBfTUJJQVNfUE9XRVJVUCAgICAgIDB4MTAwMDAKKyNkZWZpbmUJQkFEMTFTSF9HQUlOICAgICAgICAgICAgICAgCTB4YzAwMDAKKyNkZWZpbmUJQkFEMTFOUFVUX1JBTkdFICAgICAgICAgICAJMHg3MDAwMDAKKyNkZWZpbmUJQkFEMTEwUF9DVVJSRU5UICAgICAgICAgICAgCTB4MzgwMDAwMAorI2RlZmluZQlCTFBBVEhfTE9PUEJBQ0sgICAgICAgICAgICAJMHg0MDAwMDAwCisjZGVmaW5lCUJRUEFUSF9MT09QQkFDSyAgICAgICAgICAgIAkweDgwMDAwMDAKKyNkZWZpbmUJQkFGRV9MT09QQkFDSyAgICAgICAgICAgICAgCTB4MTAwMDAwMDAKKyNkZWZpbmUJQkRBMTBfU1dJTkcgICAgICAgICAgICAgICAgCTB4N2UwCisjZGVmaW5lCUJEQTEwX1JFVkVSU0UgICAgICAgICAgICAgIAkweDgwMAorI2RlZmluZQlCREFfQ0xLX1NPVVJDRSAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lCUJEQTdJTlBVVF9SQU5HRSAgICAgICAgICAgIAkweDYwMDAKKyNkZWZpbmUJQkRBN19HQUlOICAgICAgICAgICAgICAgICAgCTB4MzgwMDAKKyNkZWZpbmUJQkRBN09VVFBVVF9DTV9NT0RFICAgICAgICAgIDB4NDAwMDAKKyNkZWZpbmUJQkRBN0lOUFVUX0NNX01PREUgICAgICAgICAgIDB4MzgwMDAwCisjZGVmaW5lCUJEQTdDVVJSRU5UICAgICAgICAgICAgICAgCTB4YzAwMDAwCisjZGVmaW5lCUJSRUdVTEFUT1JfQURKVVNUICAgICAgICAgIAkweDcwMDAwMDAKKyNkZWZpbmUJQkFEMTFQT1dFUlVQX0FUVFggICAgICAgICAgCTB4MQorI2RlZmluZQlCREExMFBTX0FUVFggICAgICAgICAgICAgICAJMHgxMAorI2RlZmluZQlCQUQxMVBPV0VSVVBfQVRSWCAgICAgICAgICAJMHgxMDAKKyNkZWZpbmUJQkRBMTBQU19BVFJYICAgICAgICAgICAgICAgCTB4MTAwMAorI2RlZmluZQlCQ0NLUlhfQUdDX0ZPUk1BVCAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUJQlBTREZGVF9TQU1QTEVfUE9JTlQgICAgICAgCTB4YzAwMAorI2RlZmluZQlCUFNEX0FWRVJBR0VfTlVNICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lCUJJUVBBVEhfQ09OVFJPTCAgICAgICAgICAgIAkweGMwMAorI2RlZmluZQlCUFNEX0ZSRVEgICAgICAgICAgICAgICAgICAJMHgzZmYKKyNkZWZpbmUJQlBTRF9BTlRFTk5BX1BBVEggICAgICAgICAgIDB4MzAKKyNkZWZpbmUJQlBTRF9JUV9TV0lUQ0ggICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUJQlBTRF9SWF9UUklHR0VSICAgICAgICAgICAgIDB4NDAwMDAwCisjZGVmaW5lCUJQU0RfVFhfVFJJR0dFUiAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lCUJQU0RfU0lORV9UT05FX1NDQUxFICAgICAgICAweDdmMDAwMDAwCisjZGVmaW5lCUJQU0RfUkVQT1JUICAgICAgICAgICAgICAgIAkweGZmZmYKKworI2RlZmluZQlCT0ZETV9UWFNDICAgICAgICAgICAgICAgIAkweDMwMDAwMDAwCisjZGVmaW5lCUJDQ0tfVFhPTiAgICAgICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQk9GRE1fVFhPTiAgICAgICAgICAgICAgICAgCTB4MgorI2RlZmluZQlCREVCVUdfUEFHRSAgICAgICAgICAgICAgICAJMHhmZmYKKyNkZWZpbmUJQkRFQlVHX0lURU0gICAgICAgICAgICAgICAgCTB4ZmYKKyNkZWZpbmUJQkFOVEwgICAgICAgICAgICAgIAkgICAgICAgCTB4MTAKKyNkZWZpbmUJQkFOVF9OT05IVCAgICAgICAgICAgCSAgICAweDEwMAorI2RlZmluZQlCQU5UX0hUMSAgICAgICAgICAgICAgIAkJMHgxMDAwCisjZGVmaW5lCUJBTlRfSFQyICAgICAgICAgICAgICAgICAgIAkweDEwMDAwCisjZGVmaW5lCUJBTlRfSFQxUzEgICAgICAgICAgICAgICAgIAkweDEwMDAwMAorI2RlZmluZQlCQU5UX05PTkhUUzEgICAgICAgICAgICAgICAJMHgxMDAwMDAwCisKKyNkZWZpbmUJQkNDS19CQk1PREUgICAgICAgICAgICAgICAgCTB4MworI2RlZmluZQlCQ0NLX1RYUE9XRVJTQVZJTkcgICAgICAgICAJMHg4MAorI2RlZmluZQlCQ0NLX1JYUE9XRVJTQVZJTkcgICAgICAgICAJMHg0MAorCisjZGVmaW5lCUJDQ0tfU0lERUJBTkQgICAgICAgICAgICAgIAkweDEwCisKKyNkZWZpbmUJQkNDS19TQ1JBTUJMRSAgICAgICAgICAgICAgCTB4OAorI2RlZmluZQlCQ0NLX0FOVERJVkVSU0lUWSAgICAJCTB4ODAwMAorI2RlZmluZQlCQ0NLX0NBUlJJRVJfUkVDT1ZFUlkgICAJMHg0MDAwCisjZGVmaW5lCUJDQ0tfVFhSQVRFICAgICAgICAgICAJCTB4MzAwMAorI2RlZmluZQlCQ0NLX0RDQ0FOQ0VMICAgICAgICAgICAgIAkweDA4MDAKKyNkZWZpbmUJQkNDS19JU0lDQU5DRUwgICAgICAgICAgICAgCTB4MDQwMAorI2RlZmluZQlCQ0NLX01BVENIX0ZJTFRFUiAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUJDQ0tfRVFVQUxJWkVSICAgICAgICAgICAgIAkweDAxMDAKKyNkZWZpbmUJQkNDS19QUkVBTUJMRV9ERVRFQ1QgICAgICAgCTB4ODAwMDAwCisjZGVmaW5lCUJDQ0tfRkFTVF9GQUxTRUNDQSAgICAgICAgICAweDQwMDAwMAorI2RlZmluZQlCQ0NLX0NIX0VTVFNUQVJUICAgICAgICAgICAgMHgzMDAwMDAKKyNkZWZpbmUJQkNDS19DQ0FfQ09VTlQgICAgICAgICAgICAgIDB4MDgwMDAwCisjZGVmaW5lCUJDQ0tfQ1NfTElNICAgICAgICAgICAgICAgIAkweDA3MDAwMAorI2RlZmluZQlCQ0NLX0JJU1RfTU9ERSAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZQlCQ0NLX0NDQU1BU0sgICAgICAgICAgICAgCTB4NDAwMDAwMDAKKyNkZWZpbmUJQkNDS19UWF9EQUNfUEhBU0UgICAgICAgICAJMHg0CisjZGVmaW5lCUJDQ0tfUlhfQURDX1BIQVNFICAgICAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUJQkNDS1JfQ1BfTU9ERSAgICAgICAgIAkgICAJMHgwMTAwCisjZGVmaW5lCUJDQ0tfVFhEQ19PRkZTRVQgICAgICAgICAgIAkweGYwCisjZGVmaW5lCUJDQ0tfUlhEQ19PRkZTRVQgICAgICAgICAgIAkweGYKKyNkZWZpbmUJQkNDS19DQ0FfTU9ERSAgICAgICAgICAgICAgCTB4YzAwMAorI2RlZmluZQlCQ0NLX0ZBTFNFQ1NfTElNICAgICAgICAgICAJMHgzZjAwCisjZGVmaW5lCUJDQ0tfQ1NfUkFUSU8gICAgICAgICAgICAgIAkweGMwMDAwMAorI2RlZmluZQlCQ0NLX0NPUkdCSVRfU0VMICAgICAgICAgICAJMHgzMDAwMDAKKyNkZWZpbmUJQkNDS19QRF9MSU0gICAgICAgICAgICAgICAgCTB4MGYwMDAwCisjZGVmaW5lCUJDQ0tfTkVXQ0NBICAgICAgICAgICAgICAgIAkweDgwMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhIUF9PRl9JRyAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUJQkNDS19SWElHICAgICAgICAgICAgICAgICAgCTB4N2YwMAorI2RlZmluZQlCQ0NLX0xOQV9QT0xBUklUWSAgICAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUJQkNDS19SWDFTVF9CQUlOICAgICAgICAgICAgIDB4N2YwMDAwCisjZGVmaW5lCUJDQ0tfUkZfRVhURU5EICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhBR0NfU0FUTEVWRUwgICAgICAgIAkweDFmMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhBR0NfU0FUQ09VTlQgICAgICAgCTB4ZTAKKyNkZWZpbmUJYkNDS1J4UkZTZXR0bGUgICAgICAgICAgICAJMHgxZgorI2RlZmluZQlCQ0NLX0ZJWEVEX1JYQUdDICAgICAgICAgICAJMHg4MDAwCisjZGVmaW5lCUJDQ0tfQU5URU5OQV9QT0xBUklUWSAgICAgIAkweDIwMDAKKyNkZWZpbmUJQkNDS19UWEZJTFRFUl9UWVBFICAgICAgICAgIDB4MGMwMAorI2RlZmluZQlCQ0NLX1JYQUdDX1JFUE9SVFRZUEUgICAJMHgwMzAwCisjZGVmaW5lCUJDQ0tfUlhEQUdDX0VOICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhEQUdDX1BFUklPRCAgICAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUJQkNDS19SWERBR0NfU0FUTEVWRUwgICAgIAkweDFmMDAwMDAwCisjZGVmaW5lCUJDQ0tfVElNSU5HX1JFQ09WRVJZICAgICAgIAkweDgwMDAwMAorI2RlZmluZQlCQ0NLX1RYQzAgICAgICAgICAgICAgICAgICAJMHgzZjAwMDAKKyNkZWZpbmUJQkNDS19UWEMxICAgICAgICAgICAgICAgICAgCTB4M2YwMDAwMDAKKyNkZWZpbmUJQkNDS19UWEMyICAgICAgICAgICAgICAgICAgCTB4M2YKKyNkZWZpbmUJQkNDS19UWEMzICAgICAgICAgICAgICAgICAgCTB4M2YwMAorI2RlZmluZQlCQ0NLX1RYQzQgICAgICAgICAgICAgICAgICAJMHgzZjAwMDAKKyNkZWZpbmUJQkNDS19UWEM1ICAgICAgICAgICAgICAgICAgCTB4M2YwMDAwMDAKKyNkZWZpbmUJQkNDS19UWEM2ICAgICAgICAgICAgICAgICAgCTB4M2YKKyNkZWZpbmUJQkNDS19UWEM3ICAgICAgICAgICAgICAgICAgCTB4M2YwMAorI2RlZmluZQlCQ0NLX0RFQlVHUE9SVCAgICAgICAgICAgICAJMHhmZjAwMDAKKyNkZWZpbmUJQkNDS19EQUNfREVCVUcgICAgICAgICAgICAgIDB4MGYwMDAwMDAKKyNkZWZpbmUJQkNDS19GQUxTRUFMQVJNX0VOQUJMRSAgICAgIDB4ODAwMAorI2RlZmluZQlCQ0NLX0ZBTFNFQUxBUk1fUkVBRCAgICAgICAgMHg0MDAwCisjZGVmaW5lCUJDQ0tfVFJTU0kgICAgICAgICAgICAgICAgIAkweDdmCisjZGVmaW5lCUJDQ0tfUlhBR0NfUkVQT1JUICAgICAgICAgICAweGZlCisjZGVmaW5lCUJDQ0tfUlhSRVBPUlRfQU5UU0VMICAgICAgIAkweDgwMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhSRVBPUlRfTUZPRkYgICAgICAgIAkweDQwMDAwMDAwCisjZGVmaW5lCUJDQ0tfUlhSRVBPUlRfU1FMT1NTICAgICAJMHgyMDAwMDAwMAorI2RlZmluZQlCQ0NLX1JYUkVQT1JUX1BLVExPU1MgICAgICAJMHgxMDAwMDAwMAorI2RlZmluZQlCQ0NLX1JYUkVQT1JUX0xPQ0tFREJJVCAgICAJMHgwODAwMDAwMAorI2RlZmluZQlCQ0NLX1JYUkVQT1JUX1JBVEVFUlJPUiAgICAJMHgwNDAwMDAwMAorI2RlZmluZQlCQ0NLX1JYUkVQT1JUX1JYUkFURSAgICAgICAJMHgwMzAwMDAwMAorI2RlZmluZQlCQ0NLX1JYRkFfQ09VTlRFUl9MT1dFUiAgICAgMHhmZgorI2RlZmluZQlCQ0NLX1JYRkFfQ09VTlRFUl9VUFBFUiAgICAgMHhmZjAwMDAwMAorI2RlZmluZQlCQ0NLX1JYSFBBR0NfU1RBUlQgICAgICAgICAgMHhlMDAwCisjZGVmaW5lCUJDQ0tfUlhIUEFHQ19GSU5BTCAgICAgICAgICAweDFjMDAKKyNkZWZpbmUJQkNDS19SWEZBTFNFQUxBUk1fRU5BQkxFICAgIDB4ODAwMAorI2RlZmluZQlCQ0NLX0ZBQ09VTlRFUl9GUkVFWkUgICAgICAgMHg0MDAwCisjZGVmaW5lCUJDQ0tfVFhQQVRIX1NFTCAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lCUJDQ0tfREVGQVVMVF9SWFBBVEggICAgICAgICAweGMwMDAwMDAKKyNkZWZpbmUJQkNDS19PUFRJT05fUlhQQVRIICAgICAgICAgIDB4MzAwMDAwMAorCisjZGVmaW5lCUJOVU1fT0ZTVEYgICAgICAgICAgICAgICAgCTB4MworI2RlZmluZQlCU0hJRlRfTCAgICAgICAgICAgICAgICAgCTB4YzAKKyNkZWZpbmUJQkdJX1RIICAgICAgICAgICAgICAgICAgIAkweGMKKyNkZWZpbmUJQlJYUEFUSF9BICAgICAgICAgICAgICAgICAJMHgxCisjZGVmaW5lCUJSWFBBVEhfQiAgICAgICAgICAgICAgICAgCTB4MgorI2RlZmluZQlCUlhQQVRIX0MgICAgICAgICAgICAgICAgIAkweDQKKyNkZWZpbmUJQlJYUEFUSF9EICAgICAgICAgICAgICAgICAJMHg4CisjZGVmaW5lCUJUWFBBVEhfQSAgICAgICAgICAgICAgICAgCTB4MQorI2RlZmluZQlCVFhQQVRIX0IgICAgICAgICAgICAgICAgIAkweDIKKyNkZWZpbmUJQlRYUEFUSF9DICAgICAgICAgICAgICAgICAJMHg0CisjZGVmaW5lCUJUWFBBVEhfRCAgICAgICAgICAgICAgICAgCTB4OAorI2RlZmluZQlCVFJTU0lfRlJFUSAgICAgICAgICAgICAgIAkweDIwMAorI2RlZmluZQlCQURDX0JBQ0tPRkYgICAgICAgICAgICAgIAkweDMwMDAKKyNkZWZpbmUJQkRGSVJfQkFDS09GRiAgICAgICAgICAgICAJMHhjMDAwCisjZGVmaW5lCUJUUlNTSV9MQVRDSF9QSEFTRSAgICAgICAgIAkweDEwMDAwCisjZGVmaW5lCUJSWF9MRENfT0ZGU0VUICAgICAgICAgICAgIAkweGZmCisjZGVmaW5lCUJSWF9RRENfT0ZGU0VUICAgICAgICAgICAgIAkweGZmMDAKKyNkZWZpbmUJQlJYX0RGSVJfTU9ERSAgICAgICAgICAgICAgCTB4MTgwMDAwMAorI2RlZmluZQlCUlhfRENORl9UWVBFICAgICAgICAgICAgICAJMHhlMDAwMDAwCisjZGVmaW5lCUJSWElRSU1CX0EgICAgICAgICAgICAgICAJMHgzZmYKKyNkZWZpbmUJQlJYSVFJTUJfQiAgICAgICAgICAgICAgIAkweGZjMDAKKyNkZWZpbmUJQlJYSVFJTUJfQyAgICAgICAgICAgICAgIAkweDNmMDAwMAorI2RlZmluZQlCUlhJUUlNQl9EICAgICAgICAgICAgICAgCTB4ZmZjMDAwMDAKKyNkZWZpbmUJQkRDX0RDX05PVENIICAgICAgICAgICAgIAkweDYwMDAwCisjZGVmaW5lCUJSWE5CX05PVENIICAgICAgICAgICAgICAJMHgxZjAwMDAwMAorI2RlZmluZQlCUERfVEggICAgICAgICAgICAgICAgICAgCTB4ZgorI2RlZmluZQlCUERfVEhfT1BUMiAgICAgICAgICAgICAgCTB4YzAwMAorI2RlZmluZQlCUFdFRF9USCAgICAgICAgICAgICAgICAgCTB4NzAwCisjZGVmaW5lCUJJRk1GX1dJTl9MICAgICAgICAgICAgICAJMHg4MDAKKyNkZWZpbmUJQlBEX09QVElPTiAgICAgICAgICAgICAgIAkweDEwMDAKKyNkZWZpbmUJQk1GX1dJTl9MICAgICAgICAgICAgICAgIAkweGUwMDAKKyNkZWZpbmUJQkJXX1NFQVJDSF9MICAgICAgICAgICAgIAkweDMwMDAwCisjZGVmaW5lCUJXSU5fRU5IX0wgICAgICAgICAgICAgICAJMHhjMDAwMAorI2RlZmluZQlCQldfVEggICAgICAgICAgICAgICAgICAgCTB4NzAwMDAwCisjZGVmaW5lCUJFRF9USDIgICAgICAgICAgICAgICAgICAJMHgzODAwMDAwCisjZGVmaW5lCUJCV19PUFRJT04gICAgICAgICAgICAgICAJMHg0MDAwMDAwCisjZGVmaW5lCUJSQURJT19USCAgICAgICAgICAgICAgICAJMHgxODAwMDAwMAorI2RlZmluZQlCV0lORE9XX0wgICAgICAgICAgICAgICAgCTB4ZTAwMDAwMDAKKyNkZWZpbmUJQlNCRF9PUFRJT04gICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQkZSQU1FX1RIICAgICAgICAgICAgICAgIAkweDFjCisjZGVmaW5lCUJGU19PUFRJT04gICAgICAgICAgICAgICAJMHg2MAorI2RlZmluZQlCRENfU0xPUEVfQ0hFQ0sgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJQkZHVUFSRF9DT1VOVEVSX0RDX0wgICAgIAkweGUwMAorI2RlZmluZQlCRlJBTUVfV0VJR0hUX1NIT1JUICAgICAgCTB4NzAwMAorI2RlZmluZQlCU1VCX1RVTkUgICAgICAgICAgICAgICAgCTB4ZTAwMDAwCisjZGVmaW5lCUJGUkFNRV9EQ19MRU5HVEggICAgICAgICAJMHhlMDAwMDAwCisjZGVmaW5lCUJTQkRfU1RBUlRfT0ZGU0VUICAgICAgICAJMHgzMDAwMDAwMAorI2RlZmluZQlCRlJBTUVfVEhfMiAgICAgICAgICAgICAgCTB4NworI2RlZmluZQlCRlJBTUVfR0kyX1RIICAgICAgICAgICAgCTB4MzgKKyNkZWZpbmUJQkdJMl9TWU5DX0VOICAgICAgICAgICAgIAkweDQwCisjZGVmaW5lCUJTQVJDSF9TSE9SVF9FQVJMWSAgICAgICAJMHgzMDAKKyNkZWZpbmUJQlNBUkNIX1NIT1JUX0xBVEUgICAgICAgIAkweGMwMAorI2RlZmluZQlCU0FSQ0hfR0kyX0xBVEUgICAgICAgICAgCTB4NzAwMDAKKyNkZWZpbmUJQkNGT0FOVFNVTSAgICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQkNGT0FDQyAgICAgICAgICAgICAgICAgIAkweDIKKyNkZWZpbmUJQkNGT1NUQVJUT0ZGU0VUICAgICAgICAgIAkweGMKKyNkZWZpbmUJQkNGT0xPT1BCQUNLICAgICAgICAgICAgIAkweDcwCisjZGVmaW5lCUJDRk9TVU1XRUlHSFQgICAgICAgICAgICAJMHg4MAorI2RlZmluZQlCREFHQ0VOQUJMRSAgICAgICAgICAgICAgCTB4MTAwMDAKKyNkZWZpbmUJQlRYSVFJTUJfQSAgICAgICAgICAgICAgIAkweDNmZgorI2RlZmluZQlCVFhJUUlNQl9iICAgICAgICAgICAgICAgCTB4ZmMwMAorI2RlZmluZQlCVFhJUUlNQl9DICAgICAgICAgICAgICAgCTB4M2YwMDAwCisjZGVmaW5lCUJUWElRSU1CX0QgICAgICAgICAgICAgICAJMHhmZmMwMDAwMAorI2RlZmluZQlCVFhJRENPRkZTRVQgICAgICAgICAgICAgCTB4ZmYKKyNkZWZpbmUJQlRYSVFEQ09GRlNFVCAgICAgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCUJUWERGSVJNT0RFICAgICAgICAgICAgICAJMHgxMDAwMAorI2RlZmluZQlCVFhQRVNVRE9fTk9JU0VPTiAgICAgICAgIAkweDQwMDAwMDAKKyNkZWZpbmUJQlRYUEVTVURPX05PSVNFX0EgICAgICAgICAJMHhmZgorI2RlZmluZQlCVFhQRVNVRE9fTk9JU0VfQiAgICAgICAgIAkweGZmMDAKKyNkZWZpbmUJQlRYUEVTVURPX05PSVNFX0MgICAgICAgICAJMHhmZjAwMDAKKyNkZWZpbmUJQlRYUEVTVURPX05PSVNFX0QgICAgICAgICAJMHhmZjAwMDAwMAorI2RlZmluZQlCQ0NBX0RST1BPUFRJT04gICAgICAgICAgIAkweDIwMDAwCisjZGVmaW5lCUJDQ0FfRFJPUFRIUkVTICAgICAgICAgICAgCTB4ZmZmMDAwMDAKKyNkZWZpbmUJQkVEQ0NBX0ggICAgICAgICAgICAgICAgIAkweGYKKyNkZWZpbmUJQkVEQ0NBX0wgICAgICAgICAgICAgICAgIAkweGYwCisjZGVmaW5lCUJMQU1CREFfRUQgICAgICAgICAgICAgICAJMHgzMDAKKyNkZWZpbmUJQlJYX0lOSVRJQUxHQUlOICAgICAgICAgICAJMHg3ZgorI2RlZmluZQlCUlhfQU5URElWX0VOICAgICAgICAgICAgICAJMHg4MAorI2RlZmluZQlCUlhfQUdDX0FERFJFU1NfRk9SX0xOQSAgICAgMHg3ZjAwCisjZGVmaW5lCUJSWF9ISUdIUE9XRVJfRkxPVyAgICAgICAgIAkweDgwMDAKKyNkZWZpbmUJQlJYX0FHQ19GUkVFWkVfVEhSRVMgICAgICAgIDB4YzAwMDAKKyNkZWZpbmUJQlJYX0ZSRUVaRVNURVBfQUdDMSAgICAgICAJMHgzMDAwMDAKKyNkZWZpbmUJQlJYX0ZSRUVaRVNURVBfQUdDMiAgICAgICAJMHhjMDAwMDAKKyNkZWZpbmUJQlJYX0ZSRUVaRVNURVBfQUdDMyAgICAgICAJMHgzMDAwMDAwCisjZGVmaW5lCUJSWF9GUkVFWkVTVEVQX0FHQzAgICAgICAgCTB4YzAwMDAwMAorI2RlZmluZQlCUlhSU1NJX0NNUF9FTiAgICAgICAgICAgCTB4MTAwMDAwMDAKKyNkZWZpbmUJQlJYUVVJQ0tfQUdDRU4gICAgICAgICAgICAJMHgyMDAwMDAwMAorI2RlZmluZQlCUlhBR0NfRlJFRVpFX1RIUkVTX01PREUgICAgMHg0MDAwMDAwMAorI2RlZmluZQlCUlhfT1ZFUkZMT1dfQ0hFQ0tUWVBFICAgICAJMHg4MDAwMDAwMAorI2RlZmluZQlCUlhfQUdDU0hJRlQgICAgICAgICAgICAgIAkweDdmCisjZGVmaW5lCUJUUlNXX1RSSV9PTkxZICAgICAgICAgICAJMHg4MAorI2RlZmluZQlCUE9XRVJfVEhSRVMgICAgICAgICAgICAgIAkweDMwMAorI2RlZmluZQlCUlhBR0NfRU4gICAgICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQlJYQUdDX1RPR0VUSEVSX0VOICAgICAgICAgCTB4MgorI2RlZmluZQlCUlhBR0NfTUlOICAgICAgICAgICAgICAgIAkweDQKKyNkZWZpbmUJQlJYSFBfSU5JICAgICAgICAgICAgICAgIAkweDcKKyNkZWZpbmUJQlJYSFBfVFJMTkEgICAgICAgICAgICAgIAkweDcwCisjZGVmaW5lCUJSWEhQX1JTU0kgICAgICAgICAgICAgICAJMHg3MDAKKyNkZWZpbmUJQlJYSFBfQkJQMSAgICAgICAgICAgICAgIAkweDcwMDAKKyNkZWZpbmUJQlJYSFBfQkJQMiAgICAgICAgICAgICAgIAkweDcwMDAwCisjZGVmaW5lCUJSWEhQX0JCUDMgICAgICAgICAgICAgICAJMHg3MDAwMDAKKyNkZWZpbmUJQlJTU0lfSCAgICAgICAgICAgICAgICAgIAkweDdmMDAwMAorI2RlZmluZQlCUlNTSV9HRU4gICAgICAgICAgICAgICAgCTB4N2YwMDAwMDAKKyNkZWZpbmUJQlJYU0VUVExFX1RSU1cgICAgICAgICAgIAkweDcKKyNkZWZpbmUJQlJYU0VUVExFX0xOQSAgICAgICAgICAgIAkweDM4CisjZGVmaW5lCUJSWFNFVFRMRV9SU1NJICAgICAgICAgICAJMHgxYzAKKyNkZWZpbmUJQlJYU0VUVExFX0JCUCAgICAgICAgICAgIAkweGUwMAorI2RlZmluZQlCUlhTRVRUTEVfUlhIUCAgICAgICAgICAgCTB4NzAwMAorI2RlZmluZQlCUlhTRVRUTEVfQU5UU1dfUlNTSSAgICAgCTB4MzgwMDAKKyNkZWZpbmUJQlJYU0VUVExFX0FOVFNXICAgICAgICAgIAkweGMwMDAwCisjZGVmaW5lCUJSWFBST0NFU1NfVElNRV9EQUdDICAgICAgCTB4MzAwMDAwCisjZGVmaW5lCUJSWFNFVFRMRV9IU1NJICAgICAgICAgICAJMHg0MDAwMDAKKyNkZWZpbmUJQlJYUFJPQ0VTU19USU1FX0JCUFBXICAgICAJMHg4MDAwMDAKKyNkZWZpbmUJQlJYQU5URU5OQV9QT1dFUl9TSElGVCAgICAgCTB4MzAwMDAwMAorI2RlZmluZQlCUlNTSV9UQUJMRV9TRUxFQ1QgICAgICAgICAJMHhjMDAwMDAwCisjZGVmaW5lCUJSWEhQX0ZJTkFMICAgICAgICAgICAgICAJMHg3MDAwMDAwCisjZGVmaW5lCUJSWEhQU0VUVExFX0JCUCAgICAgICAgICAJMHg3CisjZGVmaW5lCUJSWEhUU0VUVExFX0hTU0kgICAgICAgICAJMHg4CisjZGVmaW5lCUJSWEhUU0VUVExFX1JYSFAgICAgICAgICAJMHg3MAorI2RlZmluZQlCUlhIVFNFVFRMRV9CQlBQVyAgICAgICAgCTB4ODAKKyNkZWZpbmUJQlJYSFRTRVRUTEVfSURMRSAgICAgICAgIAkweDMwMAorI2RlZmluZQlCUlhIVFNFVFRMRV9SRVNFUlZFRCAgICAgCTB4MWMwMAorI2RlZmluZQlCUlhIVF9SWEhQX0VOICAgICAgICAgICAgICAJMHg4MDAwCisjZGVmaW5lCUJSWEFHQ19GUkVFWkVfVEhSRVMgICAgICAJMHgzMDAwMAorI2RlZmluZQlCUlhBR0NfVE9HRVRIRVJFTiAgICAgICAJMHg0MDAwMAorI2RlZmluZQlCUlhIVEFHQ19NSU4gICAgICAgICAgICAgIAkweDgwMDAwCisjZGVmaW5lCUJSWEhUQUdDX0VOICAgICAgICAgICAgICAgCTB4MTAwMDAwCisjZGVmaW5lCUJSWEhUREFHQ19FTiAgICAgICAgICAgICAgCTB4MjAwMDAwCisjZGVmaW5lCUJSWEhUX1JYSFBfQkJQICAgICAgICAgICAgCTB4MWMwMDAwMAorI2RlZmluZQlCUlhIVF9SWEhQX0ZJTkFMICAgICAgICAgIAkweGUwMDAwMDAwCisjZGVmaW5lCUJSWFBXX1JBRElPX1RIICAgICAgICAgICAgIAkweDMKKyNkZWZpbmUJQlJYUFdfUkFESU9fRU4gICAgICAgICAgICAgCTB4NAorI2RlZmluZQlCUlhNRl9IT0xEICAgICAgICAgICAgICAgIAkweDM4MDAKKyNkZWZpbmUJQlJYUERfREVMQVlfVEgxICAgICAgICAgIAkweDM4CisjZGVmaW5lCUJSWFBEX0RFTEFZX1RIMiAgICAgICAgICAJMHgxYzAKKyNkZWZpbmUJQlJYUERfRENfQ09VTlRfTUFYICAgICAgIAkweDYwMAorI2RlZmluZQlCUlhQRF9ERUxBWV9USCAgICAgICAgICAgCTB4ODAwMAorI2RlZmluZQlCUlhQUk9DRVNTX0RFTEFZICAgICAgICAgCTB4ZjAwMDAKKyNkZWZpbmUJQlJYU0VBUkNIUkFOR0VfR0kyX0VBUkxZIAkweDcwMDAwMAorI2RlZmluZQlCUlhGUkFNRV9GVUFSRF9DT1VOVEVSX0wgCTB4MzgwMDAwMAorI2RlZmluZQlCUlhTR0lfR1VBUkRfTCAgICAgICAgICAgCTB4YzAwMDAwMAorI2RlZmluZQlCUlhTR0lfU0VBUkNIX0wgICAgICAgICAgCTB4MzAwMDAwMDAKKyNkZWZpbmUJQlJYU0dJX1RIICAgICAgICAgICAgICAgIAkweGMwMDAwMDAwCisjZGVmaW5lCUJERlNDTlQwICAgICAgICAgICAgICAgICAJMHhmZgorI2RlZmluZQlCREZTQ05UMSAgICAgICAgICAgICAgICAgCTB4ZmYwMAorI2RlZmluZQlCREZTRkxBRyAgICAgICAgICAgICAgICAgCTB4ZjAwMDAKKyNkZWZpbmUJQk1GX1dFSUdIVF9TVU0gICAgICAgICAgICAgCTB4MzAwMDAwCisjZGVmaW5lCUJNSU5JRFhfVEggICAgICAgICAgICAgICAgCTB4N2YwMDAwMDAKKyNkZWZpbmUJQkRBRk9STUFUICAgICAgICAgICAgICAgIAkweDQwMDAwCisjZGVmaW5lCUJUWENIX0VNVV9FTkFCTEUgICAgICAgICAgIAkweDAxMDAwMDAwCisjZGVmaW5lCUJUUlNXX0lTT0xBVElPTl9BICAgICAgICAgCTB4N2YKKyNkZWZpbmUJQlRSU1dfSVNPTEFUSU9OX0IgICAgICAgICAJMHg3ZjAwCisjZGVmaW5lCUJUUlNXX0lTT0xBVElPTl9DICAgICAgICAgCTB4N2YwMDAwCisjZGVmaW5lCUJUUlNXX0lTT0xBVElPTl9EICAgICAgICAgCTB4N2YwMDAwMDAKKyNkZWZpbmUJQkVYVF9MTkFfR0FJTiAgICAgICAgICAgICAgCTB4N2MwMAorCisjZGVmaW5lCUJTVEJDX0VOICAgICAgICAgICAgICAgICAgCTB4NAorI2RlZmluZQlCQU5URU5OQV9NQVBQSU5HICAgICAgICAgIAkweDEwCisjZGVmaW5lCUJOU1MgICAgICAgICAgICAgICAgICAgICAJMHgyMAorI2RlZmluZQlCQ0ZPX0FOVFNVTV9JRCAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUJQlBIWV9DT1VOVEVSX1JFU0VUICAgICAgICAgCTB4ODAwMDAwMAorI2RlZmluZQlCQ0ZPX1JFUE9SVF9HRVQgICAgICAgICAgICAJMHg0MDAwMDAwCisjZGVmaW5lCUJPRkRNX0NPTlRJTlVFX1RYICAgICAgICAgIAkweDEwMDAwMDAwCisjZGVmaW5lCUJPRkRNX1NJTkdMRV9DQVJSSUVSICAgICAgIAkweDIwMDAwMDAwCisjZGVmaW5lCUJPRkRNX1NJTkdMRV9UT05FICAgICAgICAgIAkweDQwMDAwMDAwCisjZGVmaW5lCUJIVF9ERVRFQ1QgICAgICAgICAgICAgICAgCTB4MTAwCisjZGVmaW5lCUJDRk9FTiAgICAgICAgICAgICAgICAgICAJMHgxMDAwMAorI2RlZmluZQlCQ0ZPVkFMVUUgICAgICAgICAgICAgICAgCTB4ZmZmMDAwMDAKKyNkZWZpbmUJQlNJR1RPTkVfUkUgICAgICAgICAgICAgIAkweDNmCisjZGVmaW5lCUJTSUdUT05FX0lNICAgICAgICAgICAgICAJMHg3ZjAwCisjZGVmaW5lCUJDT1VOVEVSX0NDQSAgICAgICAgICAgICAJMHhmZmZmCisjZGVmaW5lCUJDT1VOVEVSX1BBUklUWUZBSUwgICAgICAJMHhmZmZmMDAwMAorI2RlZmluZQlCQ09VTlRFUl9SQVRFSUxMRUdBTCAgICAgCTB4ZmZmZgorI2RlZmluZQlCQ09VTlRFUl9DUkM4RkFJTCAgICAgICAgCTB4ZmZmZjAwMDAKKyNkZWZpbmUJQkNPVU5URVJfTUNTTk9TVVBQT1JUICAgIAkweGZmZmYKKyNkZWZpbmUJQkNPVU5URVJfRkFTVFNZTkMgICAgICAgIAkweGZmZmYKKyNkZWZpbmUJQlNIT1JUQ0ZPICAgICAgICAgICAgICAgIAkweGZmZgorI2RlZmluZQlCU0hPUlRDRk9UX0xFTkdUSCAgICAgICAgIAkxMgorI2RlZmluZQlCU0hPUlRDRk9GX0xFTkdUSCAgICAgICAgIAkxMQorI2RlZmluZQlCTE9OR0NGTyAgICAgICAgICAgICAgICAgCTB4N2ZmCisjZGVmaW5lCUJMT05HQ0ZPVF9MRU5HVEggICAgICAgICAgCTExCisjZGVmaW5lCUJMT05HQ0ZPRl9MRU5HVEggICAgICAgICAgCTExCisjZGVmaW5lCUJUQUlMQ0ZPICAgICAgICAgICAgICAgICAJMHgxZmZmCisjZGVmaW5lCUJUQUlMQ0ZPVF9MRU5HVEggICAgICAgICAgCTEzCisjZGVmaW5lCUJUQUlMQ0ZPRl9MRU5HVEggICAgICAgICAgCTEyCisjZGVmaW5lCUJOT0lTRV9FTl9QV0RCICAgICAgICAgICAgIAkweGZmZmYKKyNkZWZpbmUJQkNDX1BPV0VSX0RCICAgICAgICAgICAgIAkweGZmZmYwMDAwCisjZGVmaW5lCUJNT0lTRV9QV0RCICAgICAgICAgICAgICAJMHhmZmZmCisjZGVmaW5lCUJQT1dFUk1FQVNUX0xFTkdUSCAgICAgICAgCTEwCisjZGVmaW5lCUJQT1dFUk1FQVNGX0xFTkdUSCAgICAgICAgCTMKKyNkZWZpbmUJQlJYX0hUX0JXICAgICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQlJYU0MgICAgICAgICAgICAgICAgICAgIAkweDYKKyNkZWZpbmUJQlJYX0hUICAgICAgICAgICAgICAgICAgIAkweDgKKyNkZWZpbmUJQk5CX0lOVEZfREVUX09OICAgICAgICAgIAkweDEKKyNkZWZpbmUJQklOVEZfV0lOX0xFTl9DRkcgICAgICAgIAkweDMwCisjZGVmaW5lCUJOQl9JTlRGX1RIX0NGRyAgICAgICAgICAJMHgxYzAKKyNkZWZpbmUJQlJGR0FJTiAgICAgICAgICAgICAgICAgIAkweDNmCisjZGVmaW5lCUJUQUJMRVNFTCAgICAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQlCVFJTVyAgICAgICAgICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJQlJYU05SX0EgICAgICAgICAgICAgICAgIAkweGZmCisjZGVmaW5lCUJSWFNOUl9CICAgICAgICAgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCUJSWFNOUl9DICAgICAgICAgICAgICAgICAJMHhmZjAwMDAKKyNkZWZpbmUJQlJYU05SX0QgICAgICAgICAgICAgICAgIAkweGZmMDAwMDAwCisjZGVmaW5lCUJTTlJfRVZNVF9MRU5HVEggICAgICAgICAgIAk4CisjZGVmaW5lCUJTTlJfRVZNRl9MRU5HVEggICAgICAgICAgIAkxCisjZGVmaW5lCUJDU0kxU1QgICAgICAgICAgICAgICAgICAJMHhmZgorI2RlZmluZQlCQ1NJMk5EICAgICAgICAgICAgICAgICAgCTB4ZmYwMAorI2RlZmluZQlCUlhFVk0xU1QgICAgICAgICAgICAgICAgCTB4ZmYwMDAwCisjZGVmaW5lCUJSWEVWTTJORCAgICAgICAgICAgICAgICAJMHhmZjAwMDAwMAorI2RlZmluZQlCU0lHRVZNICAgICAgICAgICAgICAgICAgCTB4ZmYKKyNkZWZpbmUJQlBXREIgICAgICAgICAgICAgICAgICAgIAkweGZmMDAKKyNkZWZpbmUJQlNHSUVOICAgICAgICAgICAgICAgICAgIAkweDEwMDAwCisKKyNkZWZpbmUJQlNGQUNUT1JfUU1BMSAgICAgICAgICAgICAJMHhmCisjZGVmaW5lCUJTRkFDVE9SX1FNQTIgICAgICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJQlNGQUNUT1JfUU1BMyAgICAgICAgICAgICAJMHhmMDAKKyNkZWZpbmUJQlNGQUNUT1JfUU1BNCAgICAgICAgICAgICAJMHhmMDAwCisjZGVmaW5lCUJTRkFDVE9SX1FNQTUgICAgICAgICAgICAgCTB4ZjAwMDAKKyNkZWZpbmUJQlNGQUNUT1JfUU1BNiAgICAgICAgICAgICAJMHhmMDAwMAorI2RlZmluZQlCU0ZBQ1RPUl9RTUE3ICAgICAgICAgICAgIAkweGYwMDAwMAorI2RlZmluZQlCU0ZBQ1RPUl9RTUE4ICAgICAgICAgICAgIAkweGYwMDAwMDAKKyNkZWZpbmUJQlNGQUNUT1JfUU1BOSAgICAgICAgICAgICAJMHhmMDAwMDAwMAorI2RlZmluZQlCQ1NJX1NDSEVNRSAgICAgICAgICAgICAgIAkweDEwMDAwMAorCisjZGVmaW5lCUJOT0lTRV9MVkxfVE9QX1NFVCAgICAgICAgICAweDMKKyNkZWZpbmUJQkNIU01PT1RIICAgICAgICAgICAgICAgIAkweDQKKyNkZWZpbmUJQkNIU01PT1RIX0NGRzEgICAgICAgICAgICAJMHgzOAorI2RlZmluZQlCQ0hTTU9PVEhfQ0ZHMiAgICAgICAgICAgIAkweDFjMAorI2RlZmluZQlCQ0hTTU9PVEhfQ0ZHMyAgICAgICAgICAgIAkweGUwMAorI2RlZmluZQlCQ0hTTU9PVEhfQ0ZHNCAgICAgICAgICAgIAkweDcwMDAKKyNkZWZpbmUJQk1SQ01PREUgICAgICAgICAgICAgICAgIAkweDgwMDAwMAorI2RlZmluZQlCVEhFVk1DRkcgICAgICAgICAgICAgICAgCTB4NzAwMDAwMAorCisjZGVmaW5lCUJMT09QX0ZJVF9UWVBFICAgICAgICAgICAgIAkweDEKKyNkZWZpbmUJQlVQRF9DRk8gICAgICAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQlCVVBEX0NGT19PRkZEQVRBICAgICAgICAgICAJMHg4MAorI2RlZmluZQlCQURWX1VQRF9DRk8gICAgICAgICAgICAgICAJMHgxMDAKKyNkZWZpbmUJQkFEVl9USU1FX0NUUkwgICAgICAgICAgICAgCTB4ODAwCisjZGVmaW5lCUJVUERfQ0xLTyAgICAgICAgICAgICAgICAgCTB4MTAwMAorI2RlZmluZQlCRkMgICAgICAgICAgICAgICAgICAgICAgCTB4NjAwMAorI2RlZmluZQlCVFJBQ0tJTkdfTU9ERSAgICAgICAgICAgIAkweDgwMDAKKyNkZWZpbmUJQlBIQ01QX0VOQUJMRSAgICAgICAgICAgICAJMHgxMDAwMAorI2RlZmluZQlCVVBEX0NMS09fTFRGICAgICAgICAgICAgICAJMHgyMDAwMAorI2RlZmluZQlCQ09NX0NIX0NGTyAgICAgICAgICAgICAgICAJMHg0MDAwMAorI2RlZmluZQlCQ1NJX0VTVElfTU9ERSAgICAgICAgICAgICAJMHg4MDAwMAorI2RlZmluZQlCQURWX1VQRF9FUVogICAgICAgICAgICAgICAJMHgxMDAwMDAKKyNkZWZpbmUJQlVDSENGRyAgICAgICAgICAgICAgICAgIAkweDcwMDAwMDAKKyNkZWZpbmUJQlVQREVRWiAgICAgICAgICAgICAgICAgIAkweDgwMDAwMDAKKworI2RlZmluZQlCUlhfUEVTVURPX05PSVNFX09OICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZQlCUlhfUEVTVURPX05PSVNFX0EgICAgICAgICAJMHhmZgorI2RlZmluZQlCUlhfUEVTVURPX05PSVNFX0IgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCUJSWF9QRVNVRE9fTk9JU0VfQyAgICAgICAgIAkweGZmMDAwMAorI2RlZmluZQlCUlhfUEVTVURPX05PSVNFX0QgICAgICAgICAJMHhmZjAwMDAwMAorI2RlZmluZQlCUlhfUEVTVURPX05PSVNFU1RBVEVfQSAgICAgMHhmZmZmCisjZGVmaW5lCUJSWF9QRVNVRE9fTk9JU0VTVEFURV9CICAgICAweGZmZmYwMDAwCisjZGVmaW5lCUJSWF9QRVNVRE9fTk9JU0VTVEFURV9DICAgICAweGZmZmYKKyNkZWZpbmUJQlJYX1BFU1VET19OT0lTRVNUQVRFX0QgICAgIDB4ZmZmZjAwMDAKKworI2RlZmluZQlCWkVCUkExX0hTU0lFTkFCTEUgICAgICAgIAkweDgKKyNkZWZpbmUJQlpFQlJBMV9UUlhDT05UUk9MICAgICAgICAJMHhjMDAKKyNkZWZpbmUJQlpFQlJBMV9UUlhHQUlOU0VUVElORyAgICAJMHgwN2YKKyNkZWZpbmUJQlpFQlJBMV9SWENPVU5URVIgICAgICAgICAgCTB4YzAwCisjZGVmaW5lCUJaRUJSQTFfVFhDSEFOR0VQVU1QICAgICAgCTB4MzgKKyNkZWZpbmUJQlpFQlJBMV9SWENIQU5HRVBVTVAgICAgICAJMHg3CisjZGVmaW5lCUJaRUJSQTFfQ0hBTk5FTF9OVU0gICAgICAgIAkweGY4MAorI2RlZmluZQlCWkVCUkExX1RYTFBGQlcgICAgICAgICAgIAkweDQwMAorI2RlZmluZQlCWkVCUkExX1JYTFBGQlcgICAgICAgICAgIAkweDYwMAorCisjZGVmaW5lCUJSVEw4MjU2UkVHX01PREVfQ1RSTDEgICAgICAweDEwMAorI2RlZmluZQlCUlRMODI1NlJFR19NT0RFX0NUUkwwICAgICAgMHg0MAorI2RlZmluZQlCUlRMODI1NlJFR19UWExQRkJXICAgICAgICAgMHgxOAorI2RlZmluZQlCUlRMODI1NlJFR19SWExQRkJXICAgICAgICAgMHg2MDAKKworI2RlZmluZQlCUlRMODI1OF9UWExQRkJXICAgICAgICAgIAkweGMKKyNkZWZpbmUJQlJUTDgyNThfUlhMUEZCVyAgICAgICAgICAJMHhjMDAKKyNkZWZpbmUJQlJUTDgyNThfUlNTSUxQRkJXICAgICAgICAJMHhjMAorCisjZGVmaW5lCUJCWVRFMCAgICAgICAgICAgICAgICAgICAgCTB4MQorI2RlZmluZQlCQllURTEgICAgICAgICAgICAgICAgICAgIAkweDIKKyNkZWZpbmUJQkJZVEUyICAgICAgICAgICAgICAgICAgICAJMHg0CisjZGVmaW5lCUJCWVRFMyAgICAgICAgICAgICAgICAgICAgCTB4OAorI2RlZmluZQlCV09SRDAgICAgICAgICAgICAgICAgICAgIAkweDMKKyNkZWZpbmUJQldPUkQxICAgICAgICAgICAgICAgICAgICAJMHhjCisjZGVmaW5lCUJXT1JEICAgICAgICAgICAgICAgICAgICAJMHhmCisKKyNkZWZpbmUJTUFTS0JZVEUwICAgICAgICAgICAgICAgIAkweGZmCisjZGVmaW5lCU1BU0tCWVRFMSAgICAgICAgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCU1BU0tCWVRFMiAgICAgICAgICAgICAgICAJMHhmZjAwMDAKKyNkZWZpbmUJTUFTS0JZVEUzICAgICAgICAgICAgICAgIAkweGZmMDAwMDAwCisjZGVmaW5lCU1BU0tIV09SRCAgICAgICAgICAgICAgICAJMHhmZmZmMDAwMAorI2RlZmluZQlNQVNLTFdPUkQgICAgICAgICAgICAgICAgCTB4MDAwMGZmZmYKKyNkZWZpbmUJTUFTS0RXT1JECQkJCQkweGZmZmZmZmZmCisjZGVmaW5lCU1BU0sxMkJJVFMJCQkJCTB4ZmZmCisjZGVmaW5lCU1BU0tINEJJVFMJCQkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTUFTS09GRE1fRAkJCQkJMHhmZmMwMDAwMAorI2RlZmluZQlNQVNLQ0NLCQkJCQkJMHgzZjNmM2YzZgorCisjZGVmaW5lCU1BU0s0QklUUyAgICAgICAgICAgICAgCQkweDBmCisjZGVmaW5lCU1BU0syMEJJVFMgICAgICAgICAgICAgCQkweGZmZmZmCisjZGVmaW5lIFJGUkVHX09GRlNFVF9NQVNLCQkJMHhmZmZmZgorCisjZGVmaW5lCUJFTkFCTEUgICAgICAgICAgICAgICAgICAgCTB4MQorI2RlZmluZQlCRElTQUJMRSAgICAgICAgICAgICAgICAgIAkweDAKKworI2RlZmluZQlMRUZUX0FOVEVOTkEgICAgICAgICAgICAgICAJMHgwCisjZGVmaW5lCVJJR0hUX0FOVEVOTkEgICAgICAgICAgICAgIAkweDEKKworI2RlZmluZQlUQ0hFQ0tfVFhTVEFUVVMgICAgICAgICAgICAJNTAwCisjZGVmaW5lCVRVUERBVEVfUlhDT1VOVEVSICAgICAgICAgIAkxMDAKKworI2RlZmluZQlSRUdfVU5fdXNlZF9yZWdpc3RlcgkJMHgwMWJmCisKKy8qIFdPTCBiaXQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUJSEFMOTJDX1dPTF9QVEtfVVBEQVRFX0VWRU5UCQlCSVQoMCkKKyNkZWZpbmUJSEFMOTJDX1dPTF9HVEtfVVBEQVRFX0VWRU5UCQlCSVQoMSkKKyNkZWZpbmUJSEFMOTJDX1dPTF9ESVNBU1NPQ19FVkVOVAkJQklUKDIpCisjZGVmaW5lCUhBTDkyQ19XT0xfREVBVVRIX0VWRU5UCQkJQklUKDMpCisjZGVmaW5lCUhBTDkyQ19XT0xfRldfRElTQ09OTkVDVF9FVkVOVAlCSVQoNCkKKworI2RlZmluZQkJV09MX1JFQVNPTl9QVEtfVVBEQVRFCQlCSVQoMCkKKyNkZWZpbmUJCVdPTF9SRUFTT05fR1RLX1VQREFURQkJQklUKDEpCisjZGVmaW5lCQlXT0xfUkVBU09OX0RJU0FTU09DCQkJQklUKDIpCisjZGVmaW5lCQlXT0xfUkVBU09OX0RFQVVUSAkJCUJJVCgzKQorI2RlZmluZQkJV09MX1JFQVNPTl9GV19ESVNDT05ORUNUCUJJVCg0KQorCisjZGVmaW5lCQlSQV9SRkVfUElOTVVYCTB4Y2IwICAvKiBQYXRoX0EgUkZFIGNvdHJvbCBwaW5tdXgqLworI2RlZmluZQkJUkJfUkZFX1BJTk1VWAkweGViMCAvKiBQYXRoX0IgUkZFIGNvbnRyb2wgcGlubXV4Ki8KKworI2RlZmluZQkJUkFfUkZFX0lOViAweGNiNAorI2RlZmluZQkJUkJfUkZFX0lOViAweGViNAorCisvKiBSWElRQyAqLworI2RlZmluZQkJUkFfUlhJUUNfQUIgICAgCTB4YzEwICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBBICYgQiovCisjZGVmaW5lCQlSQV9SWElRQ19DRCAgICAJMHhjMTQgIC8qUnhJUSBpbWJsYW5jZSBtYXRyaXggY29lZmYuIEMgJiBEKi8KKyNkZWZpbmUJIAlSQV9UWFNDQUxFIAkJMHhjMWMgIC8qIFBhaF9BIFRYIHNjYWxpbmcgZmFjdG9yKi8KKyNkZWZpbmUJCVJCX1RYU0NBTEUgCQkweGUxYyAgLyogUGF0aF9CIFRYIHNjYWxpbmcgZmFjdG9yKi8KKyNkZWZpbmUJCVJCX1JYSVFDX0FCICAgIAkweGUxMCAgLypSeElRIGltYmxhbmNlIG1hdHJpeCBjb2VmZi4gQSAmIEIqLworI2RlZmluZQkJUkJfUlhJUUNfQ0QgICAgCTB4ZTE0ICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBDICYgRCovCisjZGVmaW5lCQlSWElRQ19BQwkJMHgwMmZmICAvKmJpdCBtYXNrIGZvciBJUUMgbWF0cml4IGVsZW1lbnQgQSAmIEMqLworI2RlZmluZQkJUlhJUUNfQkQJCTB4MDJmZjAwMDAgLypiaXQgbWFzayBmb3IgSVFDIG1hdHJpeCBlbGVtZW50IEEgJiBDKi8KKworLyogMiBFRlVTRV9URVNUIChGb3IgUlRMODcyMyBwYXJ0aWFsbHkpICovCisjZGVmaW5lIEVGVVNFX1NFTCh4KQkJCQkJKCgoeCkgJiAweDMpIDw8IDgpCisjZGVmaW5lIEVGVVNFX1NFTF9NQVNLCQkJCTB4MzAwCisjZGVmaW5lIEVGVVNFX1dJRklfU0VMXzAJCQkJMHgwCisKKy8qUkVHX01VTFRJX0ZVTkNfQ1RSTChGb3IgUlRMODcyMyBPbmx5KSovCisjZGVmaW5lCVdMX0hXUEROX0VOCQkJCUJJVCgwKQkvKiBFbmFibGUgR1BJT1s5XSBhcyBXaUZpIEhXIFBEbiBzb3VyY2UqLworI2RlZmluZQlXTF9IV1BETl9TTAkJCQlCSVQoMSkJLyogV2lGaSBIVyBQRG4gcG9sYXJpdHkgY29udHJvbCovCisjZGVmaW5lCVdMX0ZVTkNfRU4JCQkJQklUKDIpCS8vIFdpRmkgZnVuY3Rpb24gZW5hYmxlCisjZGVmaW5lCVdMX0hXUk9GX0VOCQkJCUJJVCgzKQkvLyBFbmFibGUgR1BJT1s5XSBhcyBXaUZpIFJGIEhXIFBEbiBzb3VyY2UKKyNkZWZpbmUJQlRfSFdQRE5fRU4JCQkJQklUKDE2KQkvLyBFbmFibGUgR1BJT1sxMV0gYXMgQlQgSFcgUERuIHNvdXJjZQorI2RlZmluZQlCVF9IV1BETl9TTAkJCQlCSVQoMTcpCS8vIEJUIEhXIFBEbiBwb2xhcml0eSBjb250cm9sCisjZGVmaW5lCUJUX0ZVTkNfRU4JCQkJQklUKDE4KQkvLyBCVCBmdW5jdGlvbiBlbmFibGUKKyNkZWZpbmUJQlRfSFdST0ZfRU4JCQkJQklUKDE5KQkvLyBFbmFibGUgR1BJT1sxMV0gYXMgQlQvR1BTIFJGIEhXIFBEbiBzb3VyY2UKKyNkZWZpbmUJR1BTX0hXUEROX0VOCQkJCUJJVCgyMCkJLy8gRW5hYmxlIEdQSU9bMTBdIGFzIEdQUyBIVyBQRG4gc291cmNlCisjZGVmaW5lCUdQU19IV1BETl9TTAkJCQlCSVQoMjEpCS8vIEdQUyBIVyBQRG4gcG9sYXJpdHkgY29udHJvbAorI2RlZmluZQlHUFNfRlVOQ19FTgkJCQlCSVQoMjIpCS8vIEdQUyBmdW5jdGlvbiBlbmFibGUKKworCisjZGVmaW5lCUJNQVNLQllURTAgICAgICAgICAgICAgICAgCTB4ZmYKKyNkZWZpbmUJQk1BU0tCWVRFMSAgICAgICAgICAgICAgICAJMHhmZjAwCisjZGVmaW5lCUJNQVNLQllURTIgICAgICAgICAgICAgICAgCTB4ZmYwMDAwCisjZGVmaW5lCUJNQVNLQllURTMgICAgICAgICAgICAgICAgCTB4ZmYwMDAwMDAKKyNkZWZpbmUJQk1BU0tIV09SRCAgICAgICAgICAgICAgICAJMHhmZmZmMDAwMAorI2RlZmluZQlCTUFTS0xXT1JEICAgICAgICAgICAgICAgIAkweDAwMDBmZmZmCisjZGVmaW5lCUJNQVNLRFdPUkQgICAgICAgICAgICAgICAgCTB4ZmZmZmZmZmYKKyNkZWZpbmUJQk1BU0sxMkJJVFMJCQkJICAJMHhmZmYKKyNkZWZpbmUJQk1BU0tINEJJVFMJCQkJICAJMHhmMDAwMDAwMAorI2RlZmluZSBCTUFTS09GRE1fRAkJCQkJMHhmZmMwMDAwMAorI2RlZmluZQlCTUFTS0NDSwkJCQkgIAkweDNmM2YzZjNmCisKKyNkZWZpbmUgQlJGUkVHT0ZGU0VUTUFTSwkJCTB4ZmZmZmYKKworI2RlZmluZQlPRE1fUkVHX0NDS19SUFRfRk9STUFUXzExQUMJMHg4MDQKKyNkZWZpbmUJT0RNX1JFR19CQl9SWF9QQVRIXzExQUMJCQkweDgwOAorLypQQUdFIDkqLworI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfUlNUXzExQUMJCTB4OUE0CisvKlBBR0UgQSovCisjZGVmaW5lCU9ETV9SRUdfQ0NLX0NDQV8xMUFDCQkJMHhBMEEKKyNkZWZpbmUJT0RNX1JFR19DQ0tfRkFfUlNUXzExQUMJCQkweEEyQworI2RlZmluZQlPRE1fUkVHX0NDS19GQV8xMUFDCQkJCTB4QTVDCisvKlBBR0UgQyovCisjZGVmaW5lCU9ETV9SRUdfSUdJX0FfMTFBQwkJCQkweEM1MAorLypQQUdFIEUqLworI2RlZmluZQlPRE1fUkVHX0lHSV9CXzExQUMJCQkJMHhFNTAKKy8qUEFHRSBGKi8KKyNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBXzExQUMJCQkweEY0OAorCisKKy8vMiBNQUMgUkVHIExJU1QKKworCisKKworLy9ESUcgUmVsYXRlZAorI2RlZmluZQlPRE1fQklUX0lHSV8xMUFDCQkJCQkweEZGRkZGRkZGCisjZGVmaW5lCU9ETV9CSVRfQ0NLX1JQVF9GT1JNQVRfMTFBQwkJQklUMTYKKyNkZWZpbmUJT0RNX0JJVF9CQl9SWF9QQVRIXzExQUMJCQkweEYKKwordHlwZWRlZiBlbnVtIEFHR1JFX1NJWkV7CisJSFRfQUdHX1NJWkVfOEsgPSAwLAorCUhUX0FHR19TSVpFXzE2SyA9IDEsCisJSFRfQUdHX1NJWkVfMzJLID0gMiwKKwlIVF9BR0dfU0laRV82NEsgPSAzLAorCVZIVF9BR0dfU0laRV8xMjhLID0gNCwKKwlWSFRfQUdHX1NJWkVfMjU2SyA9IDUsCisJVkhUX0FHR19TSVpFXzUxMksgPSA2LAorCVZIVF9BR0dfU0laRV8xMDI0SyA9IDcsCit9QUdHUkVfU0laRV9FLCAqUEFHR1JFX1NJWkVfRTsKKworI2RlZmluZSBSRUdfQU1QRFVfTUFYX0xFTkdUSF84ODEyCTB4MDQ1OAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzFjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZi5jCkBAIC0wLDAgKzEsNDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJyZi5oIgorI2luY2x1ZGUgImRtLmgiCisKK3N0YXRpYyBib29sIF9ydGw4ODIxYWVfcGh5X3JmNjA1Ml9jb25maWdfcGFyYWZpbGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCit2b2lkIHJ0bDg4MjFhZV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGJhbmR3aWR0aCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlzd2l0Y2ggKGJhbmR3aWR0aCkgeworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX0NITkxCVywgQklUKDExKXxCSVQoMTApLCAzKTsKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0IsIFJGX0NITkxCVywgQklUKDExKXxCSVQoMTApLCAzKTsKKwkJYnJlYWs7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgUkZfQ0hOTEJXLCBCSVQoMTEpfEJJVCgxMCksIDEpOworCQlydGxfc2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQiwgUkZfQ0hOTEJXLCBCSVQoMTEpfEJJVCgxMCksIDEpOworCQlicmVhazsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfODA6CisJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCBSRl9DSE5MQlcsIEJJVCgxMSl8QklUKDEwKSwgMCk7CisJCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9CLCBSRl9DSE5MQlcsIEJJVCgxMSl8QklUKDEwKSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJ1bmtub3duIGJhbmR3aWR0aDogJSNYXG4iLCBiYW5kd2lkdGgpKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIHJ0bDg4MjFhZV9waHlfcmY2MDUyX3NldF9jY2tfdHhwb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgdTggKnBwb3dlcmxldmVsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwl1MzIgdHhfYWdjWzJdID0gezAsIDB9LCB0bXB2YWw7CisJYm9vbCB0dXJib19zY2Fub2ZmID0gZmFsc2U7CisJdTggaWR4MSwgaWR4MjsKKwl1OCAqcHRyOworCXU4IGRpcmVjdGlvbjsKKwl1MzIgcHdydHJhY192YWx1ZTsKKworCWlmIChydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgIT0gMCkKKwkJdHVyYm9fc2Nhbm9mZiA9IHRydWU7CisKKwlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcgPT0gdHJ1ZSkgeworCQl0eF9hZ2NbUkY5MF9QQVRIX0FdID0gMHgzZjNmM2YzZjsKKwkJdHhfYWdjW1JGOTBfUEFUSF9CXSA9IDB4M2YzZjNmM2Y7CisKKwkJaWYgKHR1cmJvX3NjYW5vZmYpIHsKKwkJCWZvciAoaWR4MSA9IFJGOTBfUEFUSF9BOyBpZHgxIDw9IFJGOTBfUEFUSF9COyBpZHgxKyspIHsKKwkJCQl0eF9hZ2NbaWR4MV0gPSBwcG93ZXJsZXZlbFtpZHgxXSB8CisJCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCA4KSB8CisJCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCAxNikgfAorCQkJCSAgICAocHBvd2VybGV2ZWxbaWR4MV0gPDwgMjQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpZHgxID0gUkY5MF9QQVRIX0E7IGlkeDEgPD0gUkY5MF9QQVRIX0I7IGlkeDErKykgeworCQkJdHhfYWdjW2lkeDFdID0gcHBvd2VybGV2ZWxbaWR4MV0gfAorCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCA4KSB8CisJCQkgICAgKHBwb3dlcmxldmVsW2lkeDFdIDw8IDE2KSB8CisJCQkgICAgKHBwb3dlcmxldmVsW2lkeDFdIDw8IDI0KTsKKwkJfQorCisJCWlmIChydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgPT0gMCkgeworCQkJdG1wdmFsID0KKwkJCSAgICAocnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0WzBdWzZdKSArCisJCQkgICAgKHJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFswXVs3XSA8PAorCQkJICAgICA4KTsKKwkJCXR4X2FnY1tSRjkwX1BBVEhfQV0gKz0gdG1wdmFsOworCisJCQl0bXB2YWwgPSAocnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0WzBdWzE0XSkgKworCQkJICAgIChydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbMF1bMTVdIDw8CisJCQkgICAgIDI0KTsKKwkJCXR4X2FnY1tSRjkwX1BBVEhfQl0gKz0gdG1wdmFsOworCQl9CisJfQorCisJZm9yIChpZHgxID0gUkY5MF9QQVRIX0E7IGlkeDEgPD0gUkY5MF9QQVRIX0I7IGlkeDErKykgeworCQlwdHIgPSAodTggKikgKCYodHhfYWdjW2lkeDFdKSk7CisJCWZvciAoaWR4MiA9IDA7IGlkeDIgPCA0OyBpZHgyKyspIHsKKwkJCWlmICgqcHRyID4gUkY2MDUyX01BWF9UWF9QV1IpCisJCQkJKnB0ciA9IFJGNjA1Ml9NQVhfVFhfUFdSOworCQkJcHRyKys7CisJCX0KKwl9CisJcnRsODgyMWFlX2RtX3R4cG93ZXJfdHJhY2tfYWRqdXN0KGh3LDEsJmRpcmVjdGlvbiwmcHdydHJhY192YWx1ZSk7CisJaWYgKGRpcmVjdGlvbiA9PTEpeworCQl0eF9hZ2NbMF0gKz0gcHdydHJhY192YWx1ZTsKKwkJdHhfYWdjWzFdICs9IHB3cnRyYWNfdmFsdWU7CisJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gMil7CisJCXR4X2FnY1swXSAtPSBwd3J0cmFjX3ZhbHVlOworCQl0eF9hZ2NbMV0gLT0gcHdydHJhY192YWx1ZTsKKwl9CisJdG1wdmFsID0gdHhfYWdjW1JGOTBfUEFUSF9BXSA7CisJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0FfQ0NLMTFfQ0NLMSwgTUFTS0RXT1JELCB0bXB2YWwpOworCisJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCSgiQ0NLIFBXUiAxfjExTSAocmYtQSkgPSAweCV4IChyZWcgMHgleClcbiIsIHRtcHZhbCwKKwkJIFJUWEFHQ19BX0NDSzExX0NDSzEpKTsKKworCXRtcHZhbCA9IHR4X2FnY1tSRjkwX1BBVEhfQl0gOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJUWEFHQ19CX0NDSzExX0NDSzEsIE1BU0tEV09SRCwgdG1wdmFsKTsKKworCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkoIkNDSyBQV1IgMTFNIChyZi1CKSA9IDB4JXggKHJlZyAweCV4KVxuIiwgdG1wdmFsLAorCQkgUlRYQUdDX0JfQ0NLMTFfQ0NLMSkpOworfQorCitzdGF0aWMgdm9pZCBydGw4ODIxYWVfcGh5X2dldF9wb3dlcl9iYXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHU4ICpwcG93ZXJsZXZlbF9vZmRtLCB1OCAqcHBvd2VybGV2ZWxfYncyMCwgdTggKnBwb3dlcmxldmVsX2J3NDAsIHU4IGNoYW5uZWwsCisJCQkJICAgICAgdTMyICpvZmRtYmFzZSwgdTMyICptY3NiYXNlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXUzMiBwb3dlckJhc2UwLCBwb3dlckJhc2UxOworCXU4IGksIHBvd2VybGV2ZWxbMl07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXBvd2VyQmFzZTAgPSBwcG93ZXJsZXZlbF9vZmRtW2ldOworCisJCXBvd2VyQmFzZTAgPSAocG93ZXJCYXNlMCA8PCAyNCkgfCAocG93ZXJCYXNlMCA8PCAxNikgfAorCQkgICAgKHBvd2VyQmFzZTAgPDwgOCkgfCBwb3dlckJhc2UwOworCQkqKG9mZG1iYXNlICsgaSkgPSBwb3dlckJhc2UwOworCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCSgiIFtPRkRNIHBvd2VyIGJhc2UgaW5kZXggcmYoJWMpID0gMHgleF1cbiIsCisJCQkgKChpID09IDApID8gJ0EnIDogJ0InKSwgKihvZmRtYmFzZSArIGkpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgeworCQkJcG93ZXJsZXZlbFtpXSA9IHBwb3dlcmxldmVsX2J3MjBbaV07CisJCX1lbHNleworCQkJcG93ZXJsZXZlbFtpXSA9IHBwb3dlcmxldmVsX2J3NDBbaV07CisJCX0KKwkJcG93ZXJCYXNlMSA9IHBvd2VybGV2ZWxbaV07CisJCXBvd2VyQmFzZTEgPSAocG93ZXJCYXNlMSA8PCAyNCkgfAorCQkgICAgKHBvd2VyQmFzZTEgPDwgMTYpIHwgKHBvd2VyQmFzZTEgPDwgOCkgfCBwb3dlckJhc2UxOworCisJCSoobWNzYmFzZSArIGkpID0gcG93ZXJCYXNlMTsKKworCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCSgiIFtNQ1MgcG93ZXIgYmFzZSBpbmRleCByZiglYykgPSAweCV4XVxuIiwKKwkJCSAoKGkgPT0gMCkgPyAnQScgOiAnQicpLCAqKG1jc2Jhc2UgKyBpKSkpOworCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV9nZXRfdHhwb3dlcl93cml0ZXZhbF9ieV9yZWd1bGF0b3J5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJICAgICAgIHU4IGNoYW5uZWwsIHU4IGluZGV4LAorCQkJCQkJICAgICAgIHUzMiAqcG93ZXJCYXNlMCwKKwkJCQkJCSAgICAgICB1MzIgKnBvd2VyQmFzZTEsCisJCQkJCQkgICAgICAgdTMyICpwX291dHdyaXRldmFsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggaSwgY2hubGdyb3VwID0gMCwgcHdyX2RpZmZfbGltaXRbNF0scHdyX2RpZmYgPSAwLGN1c3RvbWVyX3B3cl9kaWZmOworCXUzMiB3cml0ZVZhbCwgY3VzdG9tZXJfbGltaXQsIHJmOworCisJZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgeworCQlzd2l0Y2ggKHJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSkgeworCQljYXNlIDA6CisJCQljaG5sZ3JvdXAgPSAwOworCisJCQl3cml0ZVZhbCA9CisJCQkgICAgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W2Nobmxncm91cF1baW5kZXggKworCQkJCQkJCQkJIChyZiA/IDggOiAwKV0KKwkJCSAgICArICgoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDogcG93ZXJCYXNlMVtyZl0pOworCisJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkoIlJUSyBiZXR0ZXIgcGVyZm9ybWFuY2UsICIKKwkJCQkgIndyaXRlVmFsKCVjKSA9IDB4JXhcbiIsCisJCQkJICgocmYgPT0gMCkgPyAnQScgOiAnQicpLCB3cml0ZVZhbCkpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChydGxwaHktPnB3cmdyb3VwX2NudCA9PSAxKQorCQkJCWNobmxncm91cCA9IDA7CisJCQllbHNlIHsKKwkJCQlpZihjaGFubmVsPDMpCisJCQkJCWNobmxncm91cCA9IDA7CisJCQkJZWxzZSBpZiAoY2hhbm5lbCA8NikKKwkJCQkJY2hubGdyb3VwID0gMTsKKwkJCQllbHNlIGlmIChjaGFubmVsIDw5KQorCQkJCQljaG5sZ3JvdXAgPSAyOworCQkJCWVsc2UgaWYgKGNoYW5uZWwgPDEyKQorCQkJCQljaG5sZ3JvdXAgPSAzOworCQkJCWVsc2UgaWYgKGNoYW5uZWwgPCAxNCkKKwkJCQkJY2hubGdyb3VwID0gNDsKKwkJCQllbHNlIGlmIChjaGFubmVsID09IDE0KQorCQkJCQljaG5sZ3JvdXAgPSA1OworCQkJfQorCisJCQl3cml0ZVZhbCA9CisJCQkgICAgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W2Nobmxncm91cF0KKwkJCSAgICBbaW5kZXggKyAocmYgPyA4IDogMCldICsgKChpbmRleCA8IDIpID8KKwkJCQkJCSAgICAgIHBvd2VyQmFzZTBbcmZdIDoKKwkJCQkJCSAgICAgIHBvd2VyQmFzZTFbcmZdKTsKKworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJKCJSZWFsdGVrIHJlZ3VsYXRvcnksIDIwTUh6LCAiCisJCQkJICJ3cml0ZVZhbCglYykgPSAweCV4XG4iLAorCQkJCSAoKHJmID09IDApID8gJ0EnIDogJ0InKSwgd3JpdGVWYWwpKTsKKworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXdyaXRlVmFsID0KKwkJCSAgICAoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKKworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJKCJCZXR0ZXIgcmVndWxhdG9yeSwgIgorCQkJCSAid3JpdGVWYWwoJWMpID0gMHgleFxuIiwKKwkJCQkgKChyZiA9PSAwKSA/ICdBJyA6ICdCJyksIHdyaXRlVmFsKSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJY2hubGdyb3VwID0gMDsKKworCQkJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApIHsKKwkJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkJKCJjdXN0b21lcidzIGxpbWl0LCA0ME1IeiAiCisJCQkJCSAicmYoJWMpID0gMHgleFxuIiwKKwkJCQkJICgocmYgPT0gMCkgPyAnQScgOiAnQicpLAorCQkJCQkgcnRsZWZ1c2UtPnB3cmdyb3VwX2h0NDBbcmZdW2NoYW5uZWwgLQorCQkJCQkJCQkgICAgIDFdKSk7CisJCQl9IGVsc2UgeworCQkJCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkJCQkoImN1c3RvbWVyJ3MgbGltaXQsIDIwTUh6ICIKKwkJCQkJICJyZiglYykgPSAweCV4XG4iLAorCQkJCQkgKChyZiA9PSAwKSA/ICdBJyA6ICdCJyksCisJCQkJCSBydGxlZnVzZS0+cHdyZ3JvdXBfaHQyMFtyZl1bY2hhbm5lbCAtCisJCQkJCQkJCSAgICAgMV0pKTsKKwkJCX0KKworCQkJaWYgKGluZGV4IDwgMikKKwkJCQlwd3JfZGlmZiA9IHJ0bGVmdXNlLT50eHB3cl9sZWdhY3lodGRpZmZbcmZdW2NoYW5uZWwtMV07CisJCQllbHNlIGlmIChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PSAgSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQlwd3JfZGlmZiA9IHJ0bGVmdXNlLT50eHB3cl9odDIwZGlmZltyZl1bY2hhbm5lbC0xXTsKKworCQkJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApCisJCQkJY3VzdG9tZXJfcHdyX2RpZmYgPSBydGxlZnVzZS0+cHdyZ3JvdXBfaHQ0MFtyZl1bY2hhbm5lbC0xXTsKKwkJCWVsc2UKKwkJCQljdXN0b21lcl9wd3JfZGlmZiA9IHJ0bGVmdXNlLT5wd3Jncm91cF9odDIwW3JmXVtjaGFubmVsLTFdOworCisJCQlpZiAocHdyX2RpZmYgPiBjdXN0b21lcl9wd3JfZGlmZikKKwkJCQlwd3JfZGlmZiA9IDA7CisJCQllbHNlCisJCQkJcHdyX2RpZmYgPSBjdXN0b21lcl9wd3JfZGlmZiAtIHB3cl9kaWZmOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJcHdyX2RpZmZfbGltaXRbaV0gPQorCQkJCSAgICAodTgpICgocnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkJCSAgIFtjaG5sZ3JvdXBdW2luZGV4ICsgKHJmID8gOCA6IDApXSAmICgweDdmIDw8CisJCQkJCQkJCQkoaSAqIDgpKSkgPj4gKGkgKiA4KSk7CisKKwkJCQkJaWYocHdyX2RpZmZfbGltaXRbaV0gPiBwd3JfZGlmZikKKwkJCQkJCXB3cl9kaWZmX2xpbWl0W2ldID0gcHdyX2RpZmY7CisJCQl9CisKKwkJCWN1c3RvbWVyX2xpbWl0ID0gKHB3cl9kaWZmX2xpbWl0WzNdIDw8IDI0KSB8CisJCQkgICAgKHB3cl9kaWZmX2xpbWl0WzJdIDw8IDE2KSB8CisJCQkgICAgKHB3cl9kaWZmX2xpbWl0WzFdIDw8IDgpIHwgKHB3cl9kaWZmX2xpbWl0WzBdKTsKKworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJKCJDdXN0b21lcidzIGxpbWl0IHJmKCVjKSA9IDB4JXhcbiIsCisJCQkJICgocmYgPT0gMCkgPyAnQScgOiAnQicpLCBjdXN0b21lcl9saW1pdCkpOworCisJCQl3cml0ZVZhbCA9IGN1c3RvbWVyX2xpbWl0ICsKKwkJCSAgICAoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKKworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJKCJDdXN0b21lciwgd3JpdGVWYWwgcmYoJWMpPSAweCV4XG4iLAorCQkJCSAoKHJmID09IDApID8gJ0EnIDogJ0InKSwgd3JpdGVWYWwpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2hubGdyb3VwID0gMDsKKwkJCXdyaXRlVmFsID0KKwkJCSAgICBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbY2hubGdyb3VwXQorCQkJICAgIFtpbmRleCArIChyZiA/IDggOiAwKV0KKwkJCSAgICArICgoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDogcG93ZXJCYXNlMVtyZl0pOworCisJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkoIlJUSyBiZXR0ZXIgcGVyZm9ybWFuY2UsIHdyaXRlVmFsICIKKwkJCQkgInJmKCVjKSA9IDB4JXhcbiIsCisJCQkJICgocmYgPT0gMCkgPyAnQScgOiAnQicpLCB3cml0ZVZhbCkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgPT0gVFhISUdIUFdSTEVWRUxfQlQxKQorCQkJd3JpdGVWYWwgPSB3cml0ZVZhbCAtIDB4MDYwNjA2MDY7CisJCWVsc2UgaWYgKHJ0bHByaXYtPmRtLmR5bmFtaWNfdHhoaWdocG93ZXJfbHZsID09CisJCQkgVFhISUdIUFdSTEVWRUxfQlQyKQorCQkJd3JpdGVWYWwgPSB3cml0ZVZhbCAtIDB4MGMwYzBjMGM7CisJCSoocF9vdXR3cml0ZXZhbCArIHJmKSA9IHdyaXRlVmFsOworCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDg4MjFhZV93cml0ZV9vZmRtX3Bvd2VyX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHU4IGluZGV4LCB1MzIgKnBWYWx1ZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTE2IHJlZ29mZnNldF9hWzZdID0geworCQlSVFhBR0NfQV9PRkRNMThfT0ZETTYsIFJUWEFHQ19BX09GRE01NF9PRkRNMjQsCisJCVJUWEFHQ19BX01DUzAzX01DUzAwLCBSVFhBR0NfQV9NQ1MwN19NQ1MwNCwKKwkJUlRYQUdDX0FfTUNTMTFfTUNTMDgsIFJUWEFHQ19BX01DUzE1X01DUzEyCisJfTsKKwl1MTYgcmVnb2Zmc2V0X2JbNl0gPSB7CisJCVJUWEFHQ19CX09GRE0xOF9PRkRNNiwgUlRYQUdDX0JfT0ZETTU0X09GRE0yNCwKKwkJUlRYQUdDX0JfTUNTMDNfTUNTMDAsIFJUWEFHQ19CX01DUzA3X01DUzA0LAorCQlSVFhBR0NfQl9NQ1MxMV9NQ1MwOCwgUlRYQUdDX0JfTUNTMTVfTUNTMTIKKwl9OworCXU4IGksIHJmLCBwd3JfdmFsWzRdOworCXUzMiB3cml0ZVZhbDsKKwl1MTYgcmVnb2Zmc2V0OworCisJZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgeworCQl3cml0ZVZhbCA9IHBWYWx1ZVtyZl07CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXB3cl92YWxbaV0gPSAodTgpICgod3JpdGVWYWwgJiAoMHg3ZiA8PAorCQkJCQkJCShpICogOCkpKSA+PiAoaSAqIDgpKTsKKworCQkJaWYgKHB3cl92YWxbaV0gPiBSRjYwNTJfTUFYX1RYX1BXUikKKwkJCQlwd3JfdmFsW2ldID0gUkY2MDUyX01BWF9UWF9QV1I7CisJCX0KKwkJd3JpdGVWYWwgPSAocHdyX3ZhbFszXSA8PCAyNCkgfCAocHdyX3ZhbFsyXSA8PCAxNikgfAorCQkgICAgKHB3cl92YWxbMV0gPDwgOCkgfCBwd3JfdmFsWzBdOworCisJCWlmIChyZiA9PSAwKQorCQkJcmVnb2Zmc2V0ID0gcmVnb2Zmc2V0X2FbaW5kZXhdOworCQllbHNlCisJCQlyZWdvZmZzZXQgPSByZWdvZmZzZXRfYltpbmRleF07CisJCXJ0bF9zZXRfYmJyZWcoaHcsIHJlZ29mZnNldCwgTUFTS0RXT1JELCB3cml0ZVZhbCk7CisKKwkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkoIlNldCAweCV4ID0gJTA4eFxuIiwgcmVnb2Zmc2V0LCB3cml0ZVZhbCkpOworCX0KK30KKwordm9pZCBydGw4ODIxYWVfcGh5X3JmNjA1Ml9zZXRfb2ZkbV90eHBvd2VyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgICB1OCAqcHBvd2VybGV2ZWxfb2ZkbSwgdTggKnBwb3dlcmxldmVsX2J3MjAsIHU4ICpwcG93ZXJsZXZlbF9idzQwLCB1OCBjaGFubmVsKQoreworCXUzMiB3cml0ZVZhbFsyXSwgcG93ZXJCYXNlMFsyXSwgcG93ZXJCYXNlMVsyXTsKKwl1OCBpbmRleDsKKwl1OCBkaXJlY3Rpb247CisJdTMyIHB3cnRyYWNfdmFsdWU7CisKKwlydGw4ODIxYWVfcGh5X2dldF9wb3dlcl9iYXNlKGh3LCBwcG93ZXJsZXZlbF9vZmRtLCBwcG93ZXJsZXZlbF9idzIwLCBwcG93ZXJsZXZlbF9idzQwLAorCQkJCSAgY2hhbm5lbCwgJnBvd2VyQmFzZTBbMF0sICZwb3dlckJhc2UxWzBdKTsKKworCXJ0bDg4MjFhZV9kbV90eHBvd2VyX3RyYWNrX2FkanVzdChodywxLCZkaXJlY3Rpb24sJnB3cnRyYWNfdmFsdWUpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykgeworCQlfcnRsODgyMWFlX2dldF90eHBvd2VyX3dyaXRldmFsX2J5X3JlZ3VsYXRvcnkoaHcsCisJCQkJCQkJICAgY2hhbm5lbCwgaW5kZXgsCisJCQkJCQkJICAgJnBvd2VyQmFzZTBbMF0sCisJCQkJCQkJICAgJnBvd2VyQmFzZTFbMF0sCisJCQkJCQkJICAgJndyaXRlVmFsWzBdKTsKKwkJaWYgKGRpcmVjdGlvbiA9PTEpeworCQkJd3JpdGVWYWxbMF0gKz0gcHdydHJhY192YWx1ZTsKKwkJCXdyaXRlVmFsWzFdICs9IHB3cnRyYWNfdmFsdWU7CisJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IDIpeworCQkJd3JpdGVWYWxbMF0gLT0gcHdydHJhY192YWx1ZTsKKwkJCXdyaXRlVmFsWzFdIC09IHB3cnRyYWNfdmFsdWU7CisJCX0KKwkJX3J0bDg4MjFhZV93cml0ZV9vZmRtX3Bvd2VyX3JlZyhodywgaW5kZXgsICZ3cml0ZVZhbFswXSk7CisJfQorfQorCitib29sIHJ0bDg4MjFhZV9waHlfcmY2MDUyX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikKKwkJcnRscGh5LT5udW1fdG90YWxfcmZwYXRoID0gMTsKKwllbHNlCisJCXJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aCA9IDI7CisKKwlyZXR1cm4gX3J0bDg4MjFhZV9waHlfcmY2MDUyX2NvbmZpZ19wYXJhZmlsZShodyk7CisKK30KKworc3RhdGljIGJvb2wgX3J0bDg4MjFhZV9waHlfcmY2MDUyX2NvbmZpZ19wYXJhZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCS8vdTMyIHU0X3JlZ3ZhbHVlID0gMDsKKwl1OCByZnBhdGg7CisJYm9vbCBydHN0YXR1cyA9IHRydWU7CisJLy9zdHJ1Y3QgYmJfcmVnX2RlZiAqcHBoeXJlZzsKKworCWZvciAocmZwYXRoID0gMDsgcmZwYXRoIDwgcnRscGh5LT5udW1fdG90YWxfcmZwYXRoOyByZnBhdGgrKykgeworCQlzd2l0Y2ggKHJmcGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOiB7CisJCQlpZiAocnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODgxMkFFKQorCQkJCXJ0c3RhdHVzID0gcnRsODgxMmFlX3BoeV9jb25maWdfcmZfd2l0aF9oZWFkZXJmaWxlKGh3LAorCQkJCQkJCQkJKGVudW0gcmFkaW9fcGF0aClyZnBhdGgpOworCQkJZWxzZQorCQkJCXJ0c3RhdHVzID0gcnRsODgyMWFlX3BoeV9jb25maWdfcmZfd2l0aF9oZWFkZXJmaWxlKGh3LAorCQkJCQkJCQkJKGVudW0gcmFkaW9fcGF0aClyZnBhdGgpOworCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgUkY5MF9QQVRIX0I6IHsKKwkJCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCisJCQkJcnRzdGF0dXMgPSBydGw4ODEyYWVfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoaHcsCisJCQkJCQkJCQkoZW51bSByYWRpb19wYXRoKXJmcGF0aCk7CisJCQllbHNlCisJCQkJcnRzdGF0dXMgPSBydGw4ODIxYWVfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoaHcsCisJCQkJCQkJCQkoZW51bSByYWRpb19wYXRoKXJmcGF0aCk7CisJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBSRjkwX1BBVEhfQzoKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAocnRzdGF0dXMgIT0gdHJ1ZSkgeworCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJICgiUmFkaW9bJWRdIEZhaWwhISIsIHJmcGF0aCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwl9CisKKwkvKnB1dCBhcnJheXMgaW4gZG0uYyovCisJLypfcnRsODgyMWFlX2NvbmZpZ19yZl90eHB3cl90cmFja19oZWFkZXJmaWxlKGh3KTsqLworCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIlxuIikpOworCXJldHVybiBydHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjVjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9yZi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMODgyMUFFX1JGX0hfXworI2RlZmluZSBfX1JUTDg4MjFBRV9SRl9IX18KKworI2RlZmluZSBSRjYwNTJfTUFYX1RYX1BXUgkJMHgzRgorI2RlZmluZSBSRjYwNTJfTUFYX1JFRwkJCTB4M0YKKworZXh0ZXJuIHZvaWQgcnRsODgyMWFlX3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgIAkJCQkJCQkJCXU4IGJhbmR3aWR0aCk7CitleHRlcm4gdm9pZCBydGw4ODIxYWVfcGh5X3JmNjA1Ml9zZXRfY2NrX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgIAkJCQkJCQkJCSAgdTggKnBwb3dlcmxldmVsKTsKK2V4dGVybiB2b2lkIHJ0bDg4MjFhZV9waHlfcmY2MDUyX3NldF9vZmRtX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgIAkJCQkJCQkJCSAgIHU4ICpwcG93ZXJsZXZlbF9vZmRtLAorCQkJCQkgICAgICAJCQkJCQkJCQkgICB1OCAqcHBvd2VybGV2ZWxfYncyMCwKKwkJCQkJICAgICAgCQkJCQkJCQkJICAgdTggKnBwb3dlcmxldmVsX2J3NDAsCisJCQkJCSAgICAgIAkJCQkJCQkJCSAgIHU4IGNoYW5uZWwpOworZXh0ZXJuIGJvb2wgcnRsODgyMWFlX3BoeV9yZjYwNTJfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMzQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgIi4uL2NvcmUuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAic3cuaCIKKyNpbmNsdWRlICJ0cnguaCIKKyNpbmNsdWRlICJsZWQuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorI2luY2x1ZGUgImhhbF9idGMuaCIKKyNpbmNsdWRlICIuLi9idGNvZXhpc3QvcnRsX2J0Yy5oIgorCit2b2lkIHJ0bDg4MjFhZV9pbml0X2FzcG1fdmFycyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJLypjbG9zZSBBU1BNIGZvciBBTUQgZGVmYXVsdGx5ICovCisJcnRscGNpLT5jb25zdF9hbWRwY2lfYXNwbSA9IDA7CisKKwkvKgorCSAqIEFTUE0gUFMgbW9kZS4KKwkgKiAwIC0gRGlzYWJsZSBBU1BNLAorCSAqIDEgLSBFbmFibGUgQVNQTSB3aXRob3V0IENsb2NrIFJlcSwKKwkgKiAyIC0gRW5hYmxlIEFTUE0gd2l0aCBDbG9jayBSZXEsCisJICogMyAtIEFsd3lhcyBFbmFibGUgQVNQTSB3aXRoIENsb2NrIFJlcSwKKwkgKiA0IC0gQWx3YXlzIEVuYWJsZSBBU1BNIHdpdGhvdXQgQ2xvY2sgUmVxLgorCSAqIHNldCBkZWZ1bHQgdG8gUlRMODE5MkNFOjMgUlRMODE5MkU6MgorCSAqICovCisJcnRscGNpLT5jb25zdF9wY2lfYXNwbSA9IDM7CisKKwkvKlNldHRpbmcgZm9yIFBDSS1FIGRldmljZSAqLworCXJ0bHBjaS0+Y29uc3RfZGV2aWNlcGNpX2FzcG1fc2V0dGluZyA9IDB4MDM7CisKKwkvKlNldHRpbmcgZm9yIFBDSS1FIGJyaWRnZSAqLworCXJ0bHBjaS0+Y29uc3RfaG9zdHBjaV9hc3BtX3NldHRpbmcgPSAweDAyOworCisJLyoKKwkgKiBJbiBIdy9TdyBSYWRpbyBPZmYgc2l0dWF0aW9uLgorCSAqIDAgLSBEZWZhdWx0LAorCSAqIDEgLSBGcm9tIEFTUE0gc2V0dGluZyB3aXRob3V0IGxvdyBNYWMgUHdyLAorCSAqIDIgLSBGcm9tIEFTUE0gc2V0dGluZyB3aXRoIGxvdyBNYWMgUHdyLAorCSAqIDMgLSBCdXMgRDMKKwkgKiBzZXQgZGVmYXVsdCB0byBSVEw4MTkyQ0U6MCBSVEw4MTkyU0U6MgorCSAqLworCXJ0bHBjaS0+Y29uc3RfaHdzd19yZm9mZl9kMyA9IDA7CisKKwkvKgorCSAqIFRoaXMgc2V0dGluZyB3b3JrcyBmb3IgdGhvc2UgZGV2aWNlIHdpdGgKKwkgKiBiYWNrZG9vciBBU1BNIHNldHRpbmcgc3VjaCBhcyBFUEhZIHNldHRpbmcuCisJICogMCAtIE5vdCBzdXBwb3J0IEFTUE0sCisJICogMSAtIFN1cHBvcnQgQVNQTSwKKwkgKiAyIC0gQWNjb3JkaW5nIHRvIGNoaXBzZXQuCisJICovCisJcnRscGNpLT5jb25zdF9zdXBwb3J0X3BjaWFzcG0gPSAxOworfQorCisvKkluaXRpYWxpemVWYXJpYWJsZXM4ODEyRSovCitpbnQgcnRsODgyMWFlX2luaXRfc3dfdmFycyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJY2hhciAqZndfbmFtZSA9IE5VTEw7CisKKwlydGw4ODIxYWVfYnRfcmVnX2luaXQoaHcpOworCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfb3BzID0gcnRsX2J0Y19nZXRfb3BzX3BvaW50ZXIoKTsKKworCXJ0bHByaXYtPmRtLmJfZG1faW5pdGlhbGdhaW5fZW5hYmxlID0gMTsKKwlydGxwcml2LT5kbS5kbV9mbGFnID0gMDsKKwlydGxwcml2LT5kbS5iX2Rpc2FibGVfZnJhbWVidXJzdGluZyA9IDA7OworCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZSA9IDA7CisJcnRscGNpLT50cmFuc21pdF9jb25maWcgPSBDRkVOREZPUk0gfCBCSVQoMTUpIHwgQklUKDI0KSB8IEJJVCgyNSk7CisKKwltYWMtPmh0X2VuYWJsZSA9IHRydWU7CisKKwlydGxwcml2LT5ydGxoYWwuY3VycmVudF9iYW5kdHlwZSA9IEJBTkRfT05fMl80RzsKKwkvKmZvbGxvd2luZyAyIGlzIGZvciByZWdpc3RlciA1RyBiYW5kLCByZWZlciB0byBfcnRsX2luaXRfbWFjODAyMTEoKSovCisJcnRscHJpdi0+cnRsaGFsLmJhbmRzZXQgPSBCQU5EX09OX0JPVEg7CisJcnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgPSBTSU5HTEVNQUNfU0lOR0xFUEhZOworCisJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyA9IChSQ1JfQVBQRkNTCQkJfAorCQkJCQkJCSAgUkNSX0FQUF9NSUMgCQkJfAorCQkJCQkJCSAgUkNSX0FQUF9JQ1YgCQkJfAorCQkJCQkJCSAgUkNSX0FQUF9QSFlTVF9SWEZGCXwKKwkJCQkJCQkgIFJDUl9OT05RT1NfVkhUCQl8CisJCQkJCQkJICBSQ1JfSFRDX0xPQ19DVFJMCQl8CisJCQkJCQkJICBSQ1JfQU1GIAkJCQl8CisJCQkJCQkJICBSQ1JfQUNGIAkJCQl8CisJCQkJCQkJICBSQ1JfQURGIAkJCQl8CS8qVGhpcyBiaXQgY29udHJvbHMgdGhlIFBTLVBvbGwgcGFja2V0IGZpbHRlci4qLworCQkJCQkJCSAgUkNSX0FJQ1YJCQkJfAorCQkJCQkJCSAgUkNSX0FDUkMzMgkJCXwKKwkJCQkJCQkgIFJDUl9BQgkJCQl8CisJCQkJCQkJICBSQ1JfQU0JCQkJfAorCQkJCQkJCSAgUkNSX0FQTSAJCQkJfAorCQkJCQkJCSAgMCk7CisKKworCXJ0bHBjaS0+aXJxX21hc2tbMF0gPQorCSAgICAgKHUzMikgKElNUl9QU1RJTUVPVVQJCQl8CisJCQkJSU1SX0dUSU5UMyAJCQkJfAorCQkJCS8qSU1SX1RCREVSCQkJCXwKKwkJCQlJTVJfVEJET0sJCQkJfAorCQkJCUlNUl9CQ05ETUFJTlQwIAkJCXwqLworCQkJCUlNUl9IU0lTUl9JTkRfT05fSU5UCXwKKwkJCQlJTVJfQzJIQ01EIAkJCQl8CisJCQkJSU1SX0hJR0hET0sJCQkJfAorCQkJCUlNUl9NR05URE9LCQkJCXwKKwkJCQlJTVJfQktET0sJCQkJfAorCQkJCUlNUl9CRURPSwkJCQl8CisJCQkJSU1SX1ZJRE9LCQkJCXwKKwkJCQlJTVJfVk9ET0sJCQkJfAorCQkJCUlNUl9SRFUJCQkJCXwKKwkJCQlJTVJfUk9LCQkJCQl8CisJCQkJMCk7CisKKwlydGxwY2ktPmlycV9tYXNrWzFdCT0KKwkJICh1MzIpKAlJTVJfUlhGT1ZXIHwKKwkJIAkJSU1SX1RYRk9WVyB8CisJCQkJMCk7CisKKwkvKiBmb3IgTFBTICYgSVBTICovCisJcnRscHJpdi0+cHNjLmJfaW5hY3RpdmVwcyA9IHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+Yl9pbmFjdGl2ZXBzOworCXJ0bHByaXYtPnBzYy5iX3N3Y3RybF9scHMgPSBydGxwcml2LT5jZmctPm1vZF9wYXJhbXMtPmJfc3djdHJsX2xwczsKKwlydGxwcml2LT5wc2MuYl9md2N0cmxfbHBzID0gcnRscHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5iX2Z3Y3RybF9scHM7CisJcnRscHJpdi0+cHNjLmJfcmVnX2Z3Y3RybF9scHMgPSAzOworCXJ0bHByaXYtPnBzYy5yZWdfbWF4X2xwc19hd2FrZWludHZsID0gNTsKKwkvKiBmb3IgQVNQTSwgeW91IGNhbiBjbG9zZSBhc3BtIHRocm91Z2gKKwkgKiBzZXQgY29uc3Rfc3VwcG9ydF9wY2lhc3BtID0gMCAqLworCXJ0bDg4MjFhZV9pbml0X2FzcG1fdmFycyhodyk7CisKKwlpZiAocnRscHJpdi0+cHNjLmJfcmVnX2Z3Y3RybF9scHMgPT0gMSkKKwkJcnRscHJpdi0+cHNjLmZ3Y3RybF9wc21vZGUgPSBGV19QU19NSU5fTU9ERTsKKwllbHNlIGlmIChydGxwcml2LT5wc2MuYl9yZWdfZndjdHJsX2xwcyA9PSAyKQorCQlydGxwcml2LT5wc2MuZndjdHJsX3BzbW9kZSA9IEZXX1BTX01BWF9NT0RFOworCWVsc2UgaWYgKHJ0bHByaXYtPnBzYy5iX3JlZ19md2N0cmxfbHBzID09IDMpCisJCXJ0bHByaXYtPnBzYy5md2N0cmxfcHNtb2RlID0gRldfUFNfRFRJTV9NT0RFOworCisJLyogZm9yIGZpcm13YXJlIGJ1ZiAqLworCXJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUgPSAodTggKikgdm1hbGxvYygweDgwMDApOworCWlmICghcnRscHJpdi0+cnRsaGFsLnBmaXJtd2FyZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiQ2FuJ3QgYWxsb2MgYnVmZmVyIGZvciBmdy5cbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg4MjFhZWZ3LmJpbiI7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3X25hbWUsIHJ0bHByaXYtPmlvLmRldik7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiRmFpbGVkIHRvIHJlcXVlc3QgZmlybXdhcmUhXG4iKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChmaXJtd2FyZS0+c2l6ZSA+IDB4ODAwMCkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiRmlybXdhcmUgaXMgdG9vIGJpZyFcbiIpKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisJCXJldHVybiAxOworCX0KKworCW1lbWNweShydGxwcml2LT5ydGxoYWwucGZpcm13YXJlLCBmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOworCXJ0bHByaXYtPnJ0bGhhbC5md3NpemUgPSBmaXJtd2FyZS0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKworCWlmIChydGxwcml2LT5jZmctPm9wcy0+Z2V0X2J0Y19zdGF0dXMoKSl7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfb3BzLT5idGNfaW5pdF92YXJpYWJsZXMocnRscHJpdik7CisJCXJ0bHByaXYtPmJ0Y29leGlzdC5idGNfb3BzLT5idGNfaW5pdF9oYWxfdmFycyhydGxwcml2KTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIiBGaXJtd2FyZURvd25sb2FkIE9LXG4iKSk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBydGw4ODIxYWVfZGVpbml0X3N3X3ZhcnMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJLy9wcmludGsoIj09PT09PT09PT5ydGw4ODIxYWVfZGVpbml0X3N3X3ZhcnMoKS5cbiIpOworCWlmIChydGxwcml2LT5jZmctPm9wcy0+Z2V0X2J0Y19zdGF0dXMoKSl7CisJCS8vcHJpbnRrKCI9PT09PT09PT0+cnRsODgyMWFlX2RlaW5pdF9zd192YXJzKCkuZ2V0X2J0Y19zdGF0dXNcbiIpOworCQlydGxwcml2LT5idGNvZXhpc3QuYnRjX29wcy0+YnRjX2hhbHRfbm90aWZ5KCk7CisJfQorCWlmIChydGxwcml2LT5ydGxoYWwucGZpcm13YXJlKSB7CisJCS8vcHJpbnRrKCI9PT09PT09PT0+cnRsODgyMWFlX2RlaW5pdF9zd192YXJzKCkucnRscHJpdi0+cnRsaGFsLnBmaXJtd2FyZVxuIik7CisJCXZmcmVlKHJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUpOworCQlydGxwcml2LT5ydGxoYWwucGZpcm13YXJlID0gTlVMTDsKKwl9CisJLy9wcmludGsoIjw9PT09PT09PT1ydGw4ODIxYWVfZGVpbml0X3N3X3ZhcnMoKS5cbiIpOworfQorCit1MzIgcnRsODgxMmFlX3J4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIoCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJc3RydWN0IHJ0bF9zdGF0cyBzdGF0dXMsCisJc3RydWN0IHNrX2J1ZmYgKnNrYgorCSkKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlzd2l0Y2ggKHN0YXR1cy5wYWNrZXRfcmVwb3J0X3R5cGUpIHsKKwkJY2FzZSBOT1JNQUxfUlg6CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQzJIX1BBQ0tFVDoKKwkJCXJ0bDg4MTJhZV9jMmhfcGFja2V0X2hhbmRsZXIoaHcsIHNrYi0+ZGF0YSwgKHU4KSBza2ItPmxlbik7CisJCQlyZXN1bHQgPSAxOworCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCBEQkdfTE9VRCwKKwkJCQkoIj09PT5ydGw4ODIxYWVfcnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlcigpOiAodTgpIHNrYi0+bGVuPSVkXG5cbiIsIHNrYi0+bGVuKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfUkVDViwgREJHX0xPVUQsCisJCQkJKCI9PT0+cnRsODgyMWFlX3J4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIoKTogTm8gdGhpcyBwYWNrZXQgdHlwZSEhXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIGdldCBidCBjb2V4aXN0IHN0YXR1cyAqLworYm9vbCBydGw4ODIxYWVfZ2V0X2J0Y19zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IHJ0bF9oYWxfb3BzIHJ0bDg4MjFhZV9oYWxfb3BzID0geworCS5pbml0X3N3X3ZhcnMgPSBydGw4ODIxYWVfaW5pdF9zd192YXJzLAorCS5kZWluaXRfc3dfdmFycyA9IHJ0bDg4MjFhZV9kZWluaXRfc3dfdmFycywKKwkucmVhZF9lZXByb21faW5mbyA9IHJ0bDg4MjFhZV9yZWFkX2VlcHJvbV9pbmZvLAorCS5pbnRlcnJ1cHRfcmVjb2duaXplZCA9IHJ0bDg4MjFhZV9pbnRlcnJ1cHRfcmVjb2duaXplZCwKKwkuaHdfaW5pdCA9IHJ0bDg4MjFhZV9od19pbml0LAorCS5od19kaXNhYmxlID0gcnRsODgyMWFlX2NhcmRfZGlzYWJsZSwKKwkuaHdfc3VzcGVuZCA9IHJ0bDg4MjFhZV9zdXNwZW5kLAorCS5od19yZXN1bWUgPSBydGw4ODIxYWVfcmVzdW1lLAorCS5lbmFibGVfaW50ZXJydXB0ID0gcnRsODgyMWFlX2VuYWJsZV9pbnRlcnJ1cHQsCisJLmRpc2FibGVfaW50ZXJydXB0ID0gcnRsODgyMWFlX2Rpc2FibGVfaW50ZXJydXB0LAorCS5zZXRfbmV0d29ya190eXBlID0gcnRsODgyMWFlX3NldF9uZXR3b3JrX3R5cGUsCisJLnNldF9jaGtfYnNzaWQgPSBydGw4ODIxYWVfc2V0X2NoZWNrX2Jzc2lkLAorCS5zZXRfcW9zID0gcnRsODgyMWFlX3NldF9xb3MsCisJLnNldF9iY25fcmVnID0gcnRsODgyMWFlX3NldF9iZWFjb25fcmVsYXRlZF9yZWdpc3RlcnMsCisJLnNldF9iY25faW50diA9IHJ0bDg4MjFhZV9zZXRfYmVhY29uX2ludGVydmFsLAorCS51cGRhdGVfaW50ZXJydXB0X21hc2sgPSBydGw4ODIxYWVfdXBkYXRlX2ludGVycnVwdF9tYXNrLAorCS5nZXRfaHdfcmVnID0gcnRsODgyMWFlX2dldF9od19yZWcsCisJLnNldF9od19yZWcgPSBydGw4ODIxYWVfc2V0X2h3X3JlZywKKwkudXBkYXRlX3JhdGVfdGJsID0gcnRsODgyMWFlX3VwZGF0ZV9oYWxfcmF0ZV90YmwsCisJLmZpbGxfdHhfZGVzYyA9IHJ0bDg4MjFhZV90eF9maWxsX2Rlc2MsCisJLmZpbGxfdHhfY21kZGVzYyA9IHJ0bDg4MjFhZV90eF9maWxsX2NtZGRlc2MsCisJLnF1ZXJ5X3J4X2Rlc2MgPSBydGw4ODIxYWVfcnhfcXVlcnlfZGVzYywKKwkuc2V0X2NoYW5uZWxfYWNjZXNzID0gcnRsODgyMWFlX3VwZGF0ZV9jaGFubmVsX2FjY2Vzc19zZXR0aW5nLAorCS5yYWRpb19vbm9mZl9jaGVja2luZyA9IHJ0bDg4MjFhZV9ncGlvX3JhZGlvX29uX29mZl9jaGVja2luZywKKwkuc2V0X2J3X21vZGUgPSBydGw4ODIxYWVfcGh5X3NldF9id19tb2RlLAorCS5zd2l0Y2hfY2hhbm5lbCA9IHJ0bDg4MjFhZV9waHlfc3dfY2hubCwKKwkuZG1fd2F0Y2hkb2cgPSBydGw4ODIxYWVfZG1fd2F0Y2hkb2csCisJLnNjYW5fb3BlcmF0aW9uX2JhY2t1cCA9IHJ0bDg4MjFhZV9waHlfc2Nhbl9vcGVyYXRpb25fYmFja3VwLAorCS5zZXRfcmZfcG93ZXJfc3RhdGUgPSBydGw4ODIxYWVfcGh5X3NldF9yZl9wb3dlcl9zdGF0ZSwKKwkubGVkX2NvbnRyb2wgPSBydGw4ODIxYWVfbGVkX2NvbnRyb2wsCisJLnNldF9kZXNjID0gcnRsODgyMWFlX3NldF9kZXNjLAorCS5nZXRfZGVzYyA9IHJ0bDg4MjFhZV9nZXRfZGVzYywKKwkuaXNfdHhfZGVzY19jbG9zZWQgPSBydGw4ODIxYWVfaXNfdHhfZGVzY19jbG9zZWQsCisJLnR4X3BvbGxpbmcgPSBydGw4ODIxYWVfdHhfcG9sbGluZywKKwkuZW5hYmxlX2h3X3NlYyA9IHJ0bDg4MjFhZV9lbmFibGVfaHdfc2VjdXJpdHlfY29uZmlnLAorCS5zZXRfa2V5ID0gcnRsODgyMWFlX3NldF9rZXksCisJLmluaXRfc3dfbGVkcyA9IHJ0bDg4MjFhZV9pbml0X3N3X2xlZHMsCisJLmFsbG93X2FsbF9kZXN0YWRkciA9IHJ0bDg4MjFhZV9hbGxvd19hbGxfZGVzdGFkZHIsCisJLmdldF9iYnJlZyA9IHJ0bDg4MjFhZV9waHlfcXVlcnlfYmJfcmVnLAorCS5zZXRfYmJyZWcgPSBydGw4ODIxYWVfcGh5X3NldF9iYl9yZWcsCisJLmdldF9yZnJlZyA9IHJ0bDg4MjFhZV9waHlfcXVlcnlfcmZfcmVnLAorCS5zZXRfcmZyZWcgPSBydGw4ODIxYWVfcGh5X3NldF9yZl9yZWcsCisJLmMyaF9jb21tYW5kX2hhbmRsZSA9IHJ0bF84ODIxYWVfYzJoX2NvbW1hbmRfaGFuZGxlLAorCS5idF93aWZpX21lZGlhX3N0YXR1c19ub3RpZnkgPSBydGxfODgyMWFlX2J0X3dpZmlfbWVkaWFfc3RhdHVzX25vdGlmeSwKKwkuYnRfdHVybl9vZmZfYnRfY29leGlzdF9iZWZvcmVfZW50ZXJfbHBzID0gcnRsODgyMWFlX2RtX2J0X3R1cm5fb2ZmX2J0X2NvZXhpc3RfYmVmb3JlX2VudGVyX2xwcywKKwkuZmlsbF9oMmNfY21kID0gcnRsODgyMWFlX2ZpbGxfaDJjX2NtZCwKKwkuZ2V0X2J0Y19zdGF0dXMgPSBydGw4ODIxYWVfZ2V0X2J0Y19zdGF0dXMsCisJLnJ4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIgPSBydGw4ODEyYWVfcnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlciwKK307CisKK3N0cnVjdCBydGxfbW9kX3BhcmFtcyBydGw4ODIxYWVfbW9kX3BhcmFtcyA9IHsKKwkuc3dfY3J5cHRvID0gZmFsc2UsCisJLmJfaW5hY3RpdmVwcyA9IGZhbHNlLC8vdHJ1ZSwKKwkuYl9zd2N0cmxfbHBzID0gZmFsc2UsCisJLmJfZndjdHJsX2xwcyA9IGZhbHNlLCAvL3RydWUsCit9OworCitzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODgyMWFlX2hhbF9jZmcgPSB7CisJLmJhcl9pZCA9IDIsCisJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKKwkubmFtZSA9ICJydGw4ODIxYWVfcGNpIiwKKwkuZndfbmFtZSA9ICJydGx3aWZpL3J0bDg4MjFhZWZ3LmJpbiIsCisJLm9wcyA9ICZydGw4ODIxYWVfaGFsX29wcywKKwkubW9kX3BhcmFtcyA9ICZydGw4ODIxYWVfbW9kX3BhcmFtcywKKwkubWFwc1tTWVNfSVNPX0NUUkxdID0gUkVHX1NZU19JU09fQ1RSTCwKKwkubWFwc1tTWVNfRlVOQ19FTl0gPSBSRUdfU1lTX0ZVTkNfRU4sCisJLm1hcHNbU1lTX0NMS10gPSBSRUdfU1lTX0NMS1IsCisJLm1hcHNbTUFDX1JDUl9BTV0gPSBBTSwKKwkubWFwc1tNQUNfUkNSX0FCXSA9IEFCLAorCS5tYXBzW01BQ19SQ1JfQUNSQzMyXSA9IEFDUkMzMiwKKwkubWFwc1tNQUNfUkNSX0FDRl0gPSBBQ0YsCisJLm1hcHNbTUFDX1JDUl9BQVBdID0gQUFQLAorCS5tYXBzW01BQ19ISU1SXSA9IFJFR19ISU1SLAorCS5tYXBzW01BQ19ISU1SRV0gPSBSRUdfSElNUkUsCisKKworICAgICAgIC5tYXBzW0VGVVNFX0FDQ0VTU10gPSBSRUdfRUZVU0VfQUNDRVNTLAorCisJLm1hcHNbRUZVU0VfVEVTVF0gPSBSRUdfRUZVU0VfVEVTVCwKKwkubWFwc1tFRlVTRV9DVFJMXSA9IFJFR19FRlVTRV9DVFJMLAorCS5tYXBzW0VGVVNFX0NMS10gPSAwLAorCS5tYXBzW0VGVVNFX0NMS19DVFJMXSA9IFJFR19FRlVTRV9DVFJMLAorCS5tYXBzW0VGVVNFX1BXQ19FVjEyVl0gPSBQV0NfRVYxMlYsCisJLm1hcHNbRUZVU0VfRkVOX0VMRFJdID0gRkVOX0VMRFIsCisJLm1hcHNbRUZVU0VfTE9BREVSX0NMS19FTl0gPSBMT0FERVJfQ0xLX0VOLAorCS5tYXBzW0VGVVNFX0FOQThNXSA9IEFOQThNLAorCS5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSA9IEhXU0VUX01BWF9TSVpFLAorCS5tYXBzW0VGVVNFX01BWF9TRUNUSU9OX01BUF0gPSBFRlVTRV9NQVhfU0VDVElPTiwKKwkubWFwc1tFRlVTRV9SRUFMX0NPTlRFTlRfU0laRV0gPSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOLAorCS5tYXBzW0VGVVNFX09PQl9QUk9URUNUX0JZVEVTX0xFTl0gPSBFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUywKKworCS5tYXBzW1JXQ0FNXSA9IFJFR19DQU1DTUQsCisJLm1hcHNbV0NBTUldID0gUkVHX0NBTVdSSVRFLAorCS5tYXBzW1JDQU1PXSA9IFJFR19DQU1SRUFELAorCS5tYXBzW0NBTURCR10gPSBSRUdfQ0FNREJHLAorCS5tYXBzW1NFQ1JdID0gUkVHX1NFQ0NGRywKKwkubWFwc1tTRUNfQ0FNX05PTkVdID0gQ0FNX05PTkUsCisJLm1hcHNbU0VDX0NBTV9XRVA0MF0gPSBDQU1fV0VQNDAsCisJLm1hcHNbU0VDX0NBTV9US0lQXSA9IENBTV9US0lQLAorCS5tYXBzW1NFQ19DQU1fQUVTXSA9IENBTV9BRVMsCisJLm1hcHNbU0VDX0NBTV9XRVAxMDRdID0gQ0FNX1dFUDEwNCwKKworCS5tYXBzW1JUTF9JTVJfQkNORE1BSU5UNl0gPSBJTVJfQkNORE1BSU5UNiwKKwkubWFwc1tSVExfSU1SX0JDTkRNQUlOVDVdID0gSU1SX0JDTkRNQUlOVDUsCisJLm1hcHNbUlRMX0lNUl9CQ05ETUFJTlQ0XSA9IElNUl9CQ05ETUFJTlQ0LAorCS5tYXBzW1JUTF9JTVJfQkNORE1BSU5UM10gPSBJTVJfQkNORE1BSU5UMywKKwkubWFwc1tSVExfSU1SX0JDTkRNQUlOVDJdID0gSU1SX0JDTkRNQUlOVDIsCisJLm1hcHNbUlRMX0lNUl9CQ05ETUFJTlQxXSA9IElNUl9CQ05ETUFJTlQxLAorLyoJLm1hcHNbUlRMX0lNUl9CQ05ET0s4XSA9IElNUl9CQ05ET0s4LCAgICAgKi8gICAvKm5lZWQgY2hlY2sqLworCS5tYXBzW1JUTF9JTVJfQkNORE9LN10gPSBJTVJfQkNORE9LNywKKwkubWFwc1tSVExfSU1SX0JDTkRPSzZdID0gSU1SX0JDTkRPSzYsCisJLm1hcHNbUlRMX0lNUl9CQ05ET0s1XSA9IElNUl9CQ05ET0s1LAorCS5tYXBzW1JUTF9JTVJfQkNORE9LNF0gPSBJTVJfQkNORE9LNCwKKwkubWFwc1tSVExfSU1SX0JDTkRPSzNdID0gSU1SX0JDTkRPSzMsCisJLm1hcHNbUlRMX0lNUl9CQ05ET0syXSA9IElNUl9CQ05ET0syLAorCS5tYXBzW1JUTF9JTVJfQkNORE9LMV0gPSBJTVJfQkNORE9LMSwKKy8qCS5tYXBzW1JUTF9JTVJfVElNRU9VVDJdID0gSU1SX1RJTUVPVVQyLCovCisvKgkubWFwc1tSVExfSU1SX1RJTUVPVVQxXSA9IElNUl9USU1FT1VUMSwqLworCisJLm1hcHNbUlRMX0lNUl9UWEZPVlddID0gSU1SX1RYRk9WVywKKwkubWFwc1tSVExfSU1SX1BTVElNRU9VVF0gPSBJTVJfUFNUSU1FT1VULAorCS5tYXBzW1JUTF9JTVJfQmNuSW50XSA9IElNUl9CQ05ETUFJTlQwLAorCS5tYXBzW1JUTF9JTVJfUlhGT1ZXXSA9IElNUl9SWEZPVlcsCisJLm1hcHNbUlRMX0lNUl9SRFVdID0gSU1SX1JEVSwKKwkubWFwc1tSVExfSU1SX0FUSU1FTkRdID0gSU1SX0FUSU1FTkQsCisJLm1hcHNbUlRMX0lNUl9CRE9LXSA9IElNUl9CQ05ET0swLAorCS5tYXBzW1JUTF9JTVJfTUdOVERPS10gPSBJTVJfTUdOVERPSywKKwkubWFwc1tSVExfSU1SX1RCREVSXSA9IElNUl9UQkRFUiwKKwkubWFwc1tSVExfSU1SX0hJR0hET0tdID0gSU1SX0hJR0hET0ssCisJLm1hcHNbUlRMX0lNUl9UQkRPS10gPSBJTVJfVEJET0ssCisJLm1hcHNbUlRMX0lNUl9CS0RPS10gPSBJTVJfQktET0ssCisJLm1hcHNbUlRMX0lNUl9CRURPS10gPSBJTVJfQkVET0ssCisJLm1hcHNbUlRMX0lNUl9WSURPS10gPSBJTVJfVklET0ssCisJLm1hcHNbUlRMX0lNUl9WT0RPS10gPSBJTVJfVk9ET0ssCisJLm1hcHNbUlRMX0lNUl9ST0tdID0gSU1SX1JPSywKKwkubWFwc1tSVExfSUJTU19JTlRfTUFTS1NdID0gKElNUl9CQ05ETUFJTlQwIHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKSwKKworCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTFNXSA9IERFU0NfUkFURTFNLAorCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTJNXSA9ICBERVNDX1JBVEUyTSwKKwkubWFwc1tSVExfUkNfQ0NLX1JBVEU1XzVNXSA9ICBERVNDX1JBVEU1XzVNLAorCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTExTV0gPSAgREVTQ19SQVRFMTFNLAorCS5tYXBzW1JUTF9SQ19PRkRNX1JBVEU2TV0gPSAgREVTQ19SQVRFNk0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTlNXSA9ICBERVNDX1JBVEU5TSwKKwkubWFwc1tSVExfUkNfT0ZETV9SQVRFMTJNXSA9ICBERVNDX1JBVEUxMk0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTE4TV0gPSAgREVTQ19SQVRFMThNLAorCS5tYXBzW1JUTF9SQ19PRkRNX1JBVEUyNE1dID0gIERFU0NfUkFURTI0TSwKKwkubWFwc1tSVExfUkNfT0ZETV9SQVRFMzZNXSA9ICBERVNDX1JBVEUzNk0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTQ4TV0gPSAgREVTQ19SQVRFNDhNLAorCS5tYXBzW1JUTF9SQ19PRkRNX1JBVEU1NE1dID0gIERFU0NfUkFURTU0TSwKKworCS5tYXBzW1JUTF9SQ19IVF9SQVRFTUNTN10gPSAgREVTQ19SQVRFTUNTNywKKwkubWFwc1tSVExfUkNfSFRfUkFURU1DUzE1XSA9ICBERVNDX1JBVEVNQ1MxNSwKK307CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsOCwwKSkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4ODIxYWVfcGNpX2lkc1tdID0geworICAgICAgICB7UlRMX1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDg4MTIsIHJ0bDg4MjFhZV9oYWxfY2ZnKX0sCisgICAgICAgIHtSVExfUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4ODgyMSwgcnRsODgyMWFlX2hhbF9jZmcpfSwKKyAgICAgICAge30sCit9OworI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4ODIxYWVfcGNpX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1JUTF9QQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg4ODEyLCBydGw4ODIxYWVfaGFsX2NmZyl9LAorCXtSVExfUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4ODgyMSwgcnRsODgyMWFlX2hhbF9jZmcpfSwKKwl7fSwKK307CisjZW5kaWYKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDg4MjFhZV9wY2lfaWRzKTsKKworTU9EVUxFX0FVVEhPUigiUGluZyBZYW48cGluZ195YW5AcmVhbHNpbC5jb20uY24+Iik7CitNT0RVTEVfQVVUSE9SKCJSZWFsdGVrIFdsYW5GQUUJPHdsYW5mYWVAcmVhbHRlay5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWx0ZWsgODgyMWFlIDgwMi4xMWFjIFBDSSB3aXJlbGVzcyIpOworTU9EVUxFX0ZJUk1XQVJFKCJydGx3aWZpL3J0bDg4MjFhZWZ3LmJpbiIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoc3dlbmMsIHJ0bDg4MjFhZV9tb2RfcGFyYW1zLnN3X2NyeXB0bywgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaXBzLCBydGw4ODIxYWVfbW9kX3BhcmFtcy5iX2luYWN0aXZlcHMsIGJvb2wsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKHN3bHBzLCBydGw4ODIxYWVfbW9kX3BhcmFtcy5iX3N3Y3RybF9scHMsIGJvb2wsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKGZ3bHBzLCBydGw4ODIxYWVfbW9kX3BhcmFtcy5iX2Z3Y3RybF9scHMsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzd2VuYywgInVzaW5nIGhhcmR3YXJlIGNyeXB0byAoZGVmYXVsdCAwIFtoYXJkd2FyZV0pXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoaXBzLCAidXNpbmcgbm8gbGluayBwb3dlciBzYXZlIChkZWZhdWx0IDEgaXMgb3BlbilcbiIpOworTU9EVUxFX1BBUk1fREVTQyhmd2xwcywgInVzaW5nIGxpbmtlZCBmdyBjb250cm9sIHBvd2VyIHNhdmUgKGRlZmF1bHQgMSBpcyBvcGVuKVxuIik7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyOSkpCitzdGF0aWMgY29uc3QgU0lNUExFX0RFVl9QTV9PUFMocnRsd2lmaV9wbV9vcHMsIHJ0bF9wY2lfc3VzcGVuZCwgcnRsX3BjaV9yZXN1bWUpOworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI5KSkKK2NvbXBhdF9wY2lfc3VzcGVuZChydGxfcGNpX3N1c3BlbmQpCitjb21wYXRfcGNpX3Jlc3VtZShydGxfcGNpX3Jlc3VtZSkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnRsODgyMWFlX2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5pZF90YWJsZSA9IHJ0bDg4MjFhZV9wY2lfaWRzLAorCS5wcm9iZSA9IHJ0bF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IHJ0bF9wY2lfZGlzY29ubmVjdCwKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI5KSkKKwkuZHJpdmVyLnBtID0gJnJ0bHdpZmlfcG1fb3BzLAorI2VsaWYgZGVmaW5lZChDT05GSUdfUE0pCisJLnN1c3BlbmQgPSBydGxfcGNpX3N1c3BlbmRfY29tcGF0LAorCS5yZXN1bWUgPSBydGxfcGNpX3Jlc3VtZV9jb21wYXQsCisjZW5kaWYKKworfTsKKworCitleHRlcm4gaW50IHJ0bF9jb3JlX21vZHVsZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcnRsX2NvcmVfbW9kdWxlX2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0bDg4MjFhZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBydGxfY29yZV9tb2R1bGVfaW5pdCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvL3ByaW50aygiPT09PT09PT09PT5ydGw4ODIxYWVfbW9kdWxlX2luaXQoKS5cbiIpOworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDg4MjFhZV9kcml2ZXIpOworCWlmIChyZXQpCisJCVJUX0FTU0VSVChmYWxzZSwgKCI6IE5vIGRldmljZSBmb3VuZFxuIikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJ0bDg4MjFhZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnRsODgyMWFlX2RyaXZlcik7CisJcnRsX2NvcmVfbW9kdWxlX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQocnRsODgyMWFlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHJ0bDg4MjFhZV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9zdy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ5YjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuaApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9TV19IX18KKyNkZWZpbmUgX19SVEw4ODIxQUVfU1dfSF9fCisKK2ludCBydGw4ODIxYWVfaW5pdF9zd192YXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgyMWFlX2RlaW5pdF9zd192YXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsODgyMWFlX2luaXRfdmFyX21hcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Citib29sIHJ0bDg4MjFhZV9nZXRfYnRjX3N0YXR1cyh2b2lkKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RhYmxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzRjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90YWJsZS5jCkBAIC0wLDAgKzEsNDAwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIENyZWF0ZWQgb24gIDIwMTAvIDUvMTgsICAxOjQxCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRhYmxlLmgiCit1MzIgUlRMODgxMkFFX1BIWV9SRUdfQVJSQVlbXSA9IHsKKwkJMHg4MDAsIDB4ODAyMEQwMTAsCisJCTB4ODA0LCAweDA4MDExMkUwLAorCQkweDgwOCwgMHgwRTAyODIzMywKKwkJMHg4MEMsIDB4MTIxMzExMTMsCisJCTB4ODEwLCAweDIwMTAxMjYzLAorCQkweDgxNCwgMHgwMjBDM0QxMCwKKwkJMHg4MTgsIDB4MDNBMDAzODUsCisJCTB4ODIwLCAweDAwMDAwMDAwLAorCQkweDgyNCwgMHgwMDAzMEZFMCwKKwkJMHg4MjgsIDB4MDAwMDAwMDAsCisJCTB4ODJDLCAweDAwMjA4M0RELAorCQkweDgzMCwgMHgyQUFBNkM4NiwKKwkJMHg4MzQsIDB4MDAzN0E3MDYsCisJCTB4ODM4LCAweDA2Qzg5QjQ0LAorCQkweDgzQywgMHgwMDAwMDk1QiwKKwkJMHg4NDAsIDB4QzAwMDAwMDEsCisJCTB4ODQ0LCAweDQwMDAzQ0RFLAorCQkweDg0OCwgMHg2MjEwRkY4QiwKKwkJMHg4NEMsIDB4NkNGREZGQjgsCisJCTB4ODUwLCAweDI4ODc0NzA2LAorCQkweDg1NCwgMHgwMDAxNTIwQywKKwkJMHg4NTgsIDB4ODA2MEUwMDAsCisJCTB4ODVDLCAweDc0MjEwMTY4LAorCQkweDg2MCwgMHg2OTI5QzMyMSwKKwkJMHg4NjQsIDB4Nzk3Mjc0MzIsCisJCTB4ODY4LCAweDhDQTdBMzE0LAorCQkweDg2QywgMHgzMzhDMjg3OCwKKwkJMHg4NzAsIDB4MDMzMzMzMzMsCisJCTB4ODc0LCAweDMxNjAyQzJFLAorCQkweDg3OCwgMHgwMDAwMzE1MiwKKwkJMHg4N0MsIDB4MDAwRkMwMDAsCisJCTB4OEEwLCAweDAwMDAwMDEzLAorCQkweDhBNCwgMHg3RjdGN0Y3RiwKKwkJMHg4QTgsIDB4QTIwMjAzM0UsCisJCTB4OEFDLCAweDBGRjBGQTBBLAorCQkweDhCMCwgMHgwMDAwMDYwMCwKKwkJMHg4QjQsIDB4MDAwRkMwODAsCisJCTB4OEI4LCAweDZDMDA1N0ZGLAorCQkweDhCQywgMHg0Q0E1MjBBMywKKwkJMHg4QzAsIDB4MjdGMDAwMjAsCisJCTB4OEM0LCAweDAwMDAwMDAwLAorCQkweDhDOCwgMHgwMDAxMzE2OSwKKwkJMHg4Q0MsIDB4MDgyNDg0OTIsCisJCTB4OEQwLCAweDAwMDBCODAwLAorCQkweDhEQywgMHgwMDAwMDAwMCwKKwkJMHg4RDQsIDB4OTQwMDA4QTAsCisJCTB4OEQ4LCAweDI5MEI1NjEyLAorCQkweDhGOCwgMHg0MDAwMDJDMCwKKwkJMHg4RkMsIDB4MDAwMDAwMDAsCisJMHhGRjBGMDdEOCwgMHhBQkNELAorCQkweDkwMCwgMHgwMDAwMDcwMCwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4OTAwLCAweDAwMDAwNzAwLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHg5MDAsIDB4MDAwMDA3MDAsCisJMHhGRjBGMDdEOCwgMHhERUFELAorCQkweDkwQywgMHgwMDAwMDAwMCwKKwkJMHg5MTAsIDB4MDAwMEZDMDAsCisJCTB4OTE0LCAweDAwMDAwNDA0LAorCQkweDkxOCwgMHgxQzEwMjhDMCwKKwkJMHg5MUMsIDB4NjRCMTFBMUMsCisJCTB4OTIwLCAweEUwNzY3MjMzLAorCQkweDkyNCwgMHgwNTVBQTUwMCwKKwkJMHg5MjgsIDB4MDAwMDAwMDQsCisJCTB4OTJDLCAweEZGRkUwMDAwLAorCQkweDkzMCwgMHhGRkZGRkZGRSwKKwkJMHg5MzQsIDB4MDAxRkZGRkYsCisJCTB4OTYwLCAweDAwMDAwMDAwLAorCQkweDk2NCwgMHgwMDAwMDAwMCwKKwkJMHg5NjgsIDB4MDAwMDAwMDAsCisJCTB4OTZDLCAweDAwMDAwMDAwLAorCQkweDk3MCwgMHg4MDFGRkZGRiwKKwkJMHg5NzgsIDB4MDAwMDAwMDAsCisJCTB4OTdDLCAweDAwMDAwMDAwLAorCQkweDk4MCwgMHgwMDAwMDAwMCwKKwkJMHg5ODQsIDB4MDAwMDAwMDAsCisJCTB4OTg4LCAweDAwMDAwMDAwLAorCQkweDk5MCwgMHgyNzEwMDAwMCwKKwkJMHg5OTQsIDB4RkZGRjAxMDAsCisJCTB4OTk4LCAweEZGRkZGRjVDLAorCQkweDk5QywgMHhGRkZGRkZGRiwKKwkJMHg5QTAsIDB4MDAwMDAwRkYsCisJCTB4OUE0LCAweDAwMDgwMDgwLAorCQkweDlBOCwgMHgwMDAwMDAwMCwKKwkJMHg5QUMsIDB4MDAwMDAwMDAsCisJCTB4OUIwLCAweDgxMDgxMDA4LAorCQkweDlCNCwgMHgwMDAwMDAwMCwKKwkJMHg5QjgsIDB4MDEwODEwMDgsCisJCTB4OUJDLCAweDAxMDgxMDA4LAorCQkweDlEMCwgMHgwMDAwMDAwMCwKKwkJMHg5RDQsIDB4MDAwMDAwMDAsCisJCTB4OUQ4LCAweDAwMDAwMDAwLAorCQkweDlEQywgMHgwMDAwMDAwMCwKKwkJMHg5RTQsIDB4MDAwMDAwMDIsCisJCTB4OUU4LCAweDAwMDAwMkQ1LAorCQkweEEwMCwgMHgwMEQwNDdDOCwKKwkJMHhBMDQsIDB4MDFGRjAwMEMsCisJCTB4QTA4LCAweDhDODM4MzAwLAorCQkweEEwQywgMHgyRTdGMDAwRiwKKwkJMHhBMTAsIDB4OTUwMEJCNzgsCisJCTB4QTE0LCAweDExMTQ0MDI4LAorCQkweEExOCwgMHgwMDg4MTExNywKKwkJMHhBMUMsIDB4ODkxNDBGMDAsCisJCTB4QTIwLCAweDFBMUIwMDAwLAorCQkweEEyNCwgMHgwOTBFMTMxNywKKwkJMHhBMjgsIDB4MDAwMDAyMDQsCisJCTB4QTJDLCAweDAwOTAwMDAwLAorCQkweEE3MCwgMHgxMDFGRkYwMCwKKwkJMHhBNzQsIDB4MDAwMDAwMDgsCisJCTB4QTc4LCAweDAwMDAwOTAwLAorCQkweEE3QywgMHgyMjVCMDYwNiwKKwkJMHhBODAsIDB4MjE4MDc1QjIsCisJCTB4QTg0LCAweDAwMUY4QzgwLAorCQkweEIwMCwgMHgwMzEwMDAwMCwKKwkJMHhCMDQsIDB4MDAwMEIwMDAsCisJCTB4QjA4LCAweEFFMDIwMUVCLAorCQkweEIwQywgMHgwMTAwMzIwNywKKwkJMHhCMTAsIDB4MDAwMDk4MDcsCisJCTB4QjE0LCAweDAxMDAwMDAwLAorCQkweEIxOCwgMHgwMDAwMDAwMiwKKwkJMHhCMUMsIDB4MDAwMDAwMDIsCisJCTB4QjIwLCAweDAwMDAwMDFGLAorCQkweEIyNCwgMHgwMzAyMDEwMCwKKwkJMHhCMjgsIDB4MDcwNjA1MDQsCisJCTB4QjJDLCAweDBCMEEwOTA4LAorCQkweEIzMCwgMHgwRjBFMEQwQywKKwkJMHhCMzQsIDB4MTMxMjExMTAsCisJCTB4QjM4LCAweDE3MTYxNTE0LAorCQkweEIzQywgMHgwMDAwMDAzQSwKKwkJMHhCNDAsIDB4MDAwMDAwMDAsCisJCTB4QjQ0LCAweDAwMDAwMDAwLAorCQkweEI0OCwgMHgxMzAwMDAzMiwKKwkJMHhCNEMsIDB4NDgwODAwMDAsCisJCTB4QjUwLCAweDAwMDAwMDAwLAorCQkweEI1NCwgMHgwMDAwMDAwMCwKKwkJMHhCNTgsIDB4MDAwMDAwMDAsCisJCTB4QjVDLCAweDAwMDAwMDAwLAorCQkweEMwMCwgMHgwMDAwMDAwNywKKwkJMHhDMDQsIDB4MDAwNDIwMjAsCisJCTB4QzA4LCAweDgwNDEwMjMxLAorCQkweEMwQywgMHgwMDAwMDAwMCwKKwkJMHhDMTAsIDB4MDAwMDAxMDAsCisJCTB4QzE0LCAweDAxMDAwMDAwLAorCQkweEMxQywgMHg0MDAwMDAwMywKKwkJMHhDMjAsIDB4MTIxMjEyMTIsCisJCTB4QzI0LCAweDEyMTIxMjEyLAorCQkweEMyOCwgMHgxMjEyMTIxMiwKKwkJMHhDMkMsIDB4MTIxMjEyMTIsCisJCTB4QzMwLCAweDEyMTIxMjEyLAorCQkweEMzNCwgMHgxMjEyMTIxMiwKKwkJMHhDMzgsIDB4MTIxMjEyMTIsCisJCTB4QzNDLCAweDEyMTIxMjEyLAorCQkweEM0MCwgMHgxMjEyMTIxMiwKKwkJMHhDNDQsIDB4MTIxMjEyMTIsCisJCTB4QzQ4LCAweDEyMTIxMjEyLAorCQkweEM0QywgMHgxMjEyMTIxMiwKKwkJMHhDNTAsIDB4MDAwMDAwMjAsCisJCTB4QzU0LCAweDAwMDgxMjFDLAorCQkweEM1OCwgMHgzMDAwMEMxQywKKwkJMHhDNUMsIDB4MDAwMDAwNTgsCisJCTB4QzYwLCAweDM0MzQ0NDQzLAorCQkweEM2NCwgMHgwNzAwMzMzMywKKwkJMHhDNjgsIDB4NTk3OTE5NzksCisJCTB4QzZDLCAweDU5Nzk1OTc5LAorCQkweEM3MCwgMHgxOTc5NTk3OSwKKwkJMHhDNzQsIDB4MTk3OTU5NzksCisJCTB4Qzc4LCAweDE5NzkxOTc5LAorCQkweEM3QywgMHgxOTc5MTk3OSwKKwkJMHhDODAsIDB4MTk3OTE5NzksCisJCTB4Qzg0LCAweDE5NzkxOTc5LAorCQkweEM5NCwgMHgwMTAwMDA1QywKKwkJMHhDOTgsIDB4MDAwMDAwMDAsCisJCTB4QzlDLCAweDAwMDAwMDAwLAorCQkweENBMCwgMHgwMDAwMDAyOSwKKwkJMHhDQTQsIDB4MDgwNDAyMDEsCisJCTB4Q0E4LCAweDgwNDAyMDEwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHhDQjAsIDB4Nzc1NDc3MTcsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweENCMCwgMHg3NzU0NzcxNywKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4Q0IwLCAweDc3NTQ3NzE3LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHhDQjAsIDB4NTQ1NDc3MTAsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweENCMCwgMHg1NDU0NzcxMCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4Q0IwLCAweDc3NTQ3Nzc3LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHhDQjQsIDB4MDAwMDAwNzcsCisJCTB4Q0I4LCAweDAwNTA4MjQyLAorCQkweEUwMCwgMHgwMDAwMDAwNywKKwkJMHhFMDQsIDB4MDAwNDIwMjAsCisJCTB4RTA4LCAweDgwNDEwMjMxLAorCQkweEUwQywgMHgwMDAwMDAwMCwKKwkJMHhFMTAsIDB4MDAwMDAxMDAsCisJCTB4RTE0LCAweDAxMDAwMDAwLAorCQkweEUxQywgMHg0MDAwMDAwMywKKwkJMHhFMjAsIDB4MTIxMjEyMTIsCisJCTB4RTI0LCAweDEyMTIxMjEyLAorCQkweEUyOCwgMHgxMjEyMTIxMiwKKwkJMHhFMkMsIDB4MTIxMjEyMTIsCisJCTB4RTMwLCAweDEyMTIxMjEyLAorCQkweEUzNCwgMHgxMjEyMTIxMiwKKwkJMHhFMzgsIDB4MTIxMjEyMTIsCisJCTB4RTNDLCAweDEyMTIxMjEyLAorCQkweEU0MCwgMHgxMjEyMTIxMiwKKwkJMHhFNDQsIDB4MTIxMjEyMTIsCisJCTB4RTQ4LCAweDEyMTIxMjEyLAorCQkweEU0QywgMHgxMjEyMTIxMiwKKwkJMHhFNTAsIDB4MDAwMDAwMjAsCisJCTB4RTU0LCAweDAwMDgxMjFDLAorCQkweEU1OCwgMHgzMDAwMEMxQywKKwkJMHhFNUMsIDB4MDAwMDAwNTgsCisJCTB4RTYwLCAweDM0MzQ0NDQzLAorCQkweEU2NCwgMHgwNzAwMzMzMywKKwkJMHhFNjgsIDB4NTk3OTE5NzksCisJCTB4RTZDLCAweDU5Nzk1OTc5LAorCQkweEU3MCwgMHgxOTc5NTk3OSwKKwkJMHhFNzQsIDB4MTk3OTU5NzksCisJCTB4RTc4LCAweDE5NzkxOTc5LAorCQkweEU3QywgMHgxOTc5MTk3OSwKKwkJMHhFODAsIDB4MTk3OTE5NzksCisJCTB4RTg0LCAweDE5NzkxOTc5LAorCQkweEU5NCwgMHgwMTAwMDA1QywKKwkJMHhFOTgsIDB4MDAwMDAwMDAsCisJCTB4RTlDLCAweDAwMDAwMDAwLAorCQkweEVBMCwgMHgwMDAwMDAyOSwKKwkJMHhFQTQsIDB4MDgwNDAyMDEsCisJCTB4RUE4LCAweDgwNDAyMDEwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHhFQjAsIDB4Nzc1NDc3MTcsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweEVCMCwgMHg3NzU0NzcxNywKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4RUIwLCAweDc3NTQ3NzE3LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHhFQjAsIDB4NTQ1NDc3MTAsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweEVCMCwgMHg1NDU0NzcxMCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4RUIwLCAweDc3NTQ3Nzc3LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHhFQjQsIDB4MDAwMDAwNzcsCisJCTB4RUI4LCAweDAwNTA4MjQyLAorfTsKKwordTMyIFJUTDg4MjFBRV9QSFlfUkVHX0FSUkFZW10gPSB7CisJMHg4MDAsIDB4MDAyMEQwOTAsCisJMHg4MDQsIDB4MDgwMTEyRTAsCisJMHg4MDgsIDB4MEUwMjgyMTEsCisJMHg4MEMsIDB4OTIxMzExMTEsCisJMHg4MTAsIDB4MjAxMDEyNjEsCisJMHg4MTQsIDB4MDIwQzNEMTAsCisJMHg4MTgsIDB4MDNBMDAzODUsCisJMHg4MjAsIDB4MDAwMDAwMDAsCisJMHg4MjQsIDB4MDAwMzBGRTAsCisJMHg4MjgsIDB4MDAwMDAwMDAsCisJMHg4MkMsIDB4MDAyMDgxREQsCisJMHg4MzAsIDB4MkFBQThFMjQsCisJMHg4MzQsIDB4MDAzN0E3MDYsCisJMHg4MzgsIDB4MDY0ODlCNDQsCisJMHg4M0MsIDB4MDAwMDA5NUIsCisJMHg4NDAsIDB4QzAwMDAwMDEsCisJMHg4NDQsIDB4NDAwMDNDREUsCisJMHg4NDgsIDB4NjIxMDNGOEIsCisJMHg4NEMsIDB4NkNGREZGQjgsCisJMHg4NTAsIDB4Mjg4NzQ3MDYsCisJMHg4NTQsIDB4MDAwMTUyMEMsCisJMHg4NTgsIDB4ODA2MEUwMDAsCisJMHg4NUMsIDB4NzQyMTAxNjgsCisJMHg4NjAsIDB4NjkyOUMzMjEsCisJMHg4NjQsIDB4Nzk3Mjc0MzIsCisJMHg4NjgsIDB4OENBN0EzMTQsCisJMHg4NkMsIDB4ODg4QzI4NzgsCisJMHg4NzAsIDB4MDg4ODg4ODgsCisJMHg4NzQsIDB4MzE2MTJDMkUsCisJMHg4NzgsIDB4MDAwMDAxNTIsCisJMHg4N0MsIDB4MDAwRkQwMDAsCisJMHg4QTAsIDB4MDAwMDAwMTMsCisJMHg4QTQsIDB4N0Y3RjdGN0YsCisJMHg4QTgsIDB4QTIwMDAzMzgsCisJMHg4QUMsIDB4MEZGMEZBMEEsCisJMHg4QjQsIDB4MDAwRkMwODAsCisJMHg4QjgsIDB4NkMxMEQ3RkYsCisJMHg4QkMsIDB4MENBNTIwOTAsCisJMHg4QzAsIDB4MUJGMDAwMjAsCisJMHg4QzQsIDB4MDAwMDAwMDAsCisJMHg4QzgsIDB4MDAwMTMxNjksCisJMHg4Q0MsIDB4MDgyNDg0OTIsCisJMHg4RDQsIDB4OTQwMDA4QTAsCisJMHg4RDgsIDB4MjkwQjU2MTIsCisJMHg4RjgsIDB4NDAwMDAyQzAsCisJMHg4RkMsIDB4MDAwMDAwMDAsCisJMHg5MDAsIDB4MDAwMDA3MDAsCisJMHg5MEMsIDB4MDAwMDAwMDAsCisJMHg5MTAsIDB4MDAwMEZDMDAsCisJMHg5MTQsIDB4MDAwMDA0MDQsCisJMHg5MTgsIDB4MUMxMDI4QzAsCisJMHg5MUMsIDB4NjRCMTFBMUMsCisJMHg5MjAsIDB4RTA3NjcyMzMsCisJMHg5MjQsIDB4MDU1QUE1MDAsCisJMHg5MjgsIDB4MDAwMDAwMDQsCisJMHg5MkMsIDB4RkZGRTAwMDAsCisJMHg5MzAsIDB4RkZGRkZGRkUsCisJMHg5MzQsIDB4MDAxRkZGRkYsCisJMHg5NjAsIDB4MDAwMDAwMDAsCisJMHg5NjQsIDB4MDAwMDAwMDAsCisJMHg5NjgsIDB4MDAwMDAwMDAsCisJMHg5NkMsIDB4MDAwMDAwMDAsCisJMHg5NzAsIDB4ODAxRkZGRkYsCisJMHg5NzQsIDB4MDAwMDAzRkYsCisJMHg5NzgsIDB4MDAwMDAwMDAsCisJMHg5N0MsIDB4MDAwMDAwMDAsCisJMHg5ODAsIDB4MDAwMDAwMDAsCisJMHg5ODQsIDB4MDAwMDAwMDAsCisJMHg5ODgsIDB4MDAwMDAwMDAsCisJMHg5OTAsIDB4MjcxMDAwMDAsCisJMHg5OTQsIDB4RkZGRjAxMDAsCisJMHg5OTgsIDB4RkZGRkZGNUMsCisJMHg5OUMsIDB4RkZGRkZGRkYsCisJMHg5QTAsIDB4MDAwMDAwRkYsCisJMHg5QTQsIDB4MDA0ODAwODAsCisJMHg5QTgsIDB4MDAwMDAwMDAsCisJMHg5QUMsIDB4MDAwMDAwMDAsCisJMHg5QjAsIDB4ODEwODEwMDgsCisJMHg5QjQsIDB4MDEwODEwMDgsCisJMHg5QjgsIDB4MDEwODEwMDgsCisJMHg5QkMsIDB4MDEwODEwMDgsCisJMHg5RDAsIDB4MDAwMDAwMDAsCisJMHg5RDQsIDB4MDAwMDAwMDAsCisJMHg5RDgsIDB4MDAwMDAwMDAsCisJMHg5REMsIDB4MDAwMDAwMDAsCisJMHg5RTAsIDB4MDAwMDVEMDAsCisJMHg5RTQsIDB4MDAwMDAwMDIsCisJMHg5RTgsIDB4MDAwMDAwMDEsCisJMHhBMDAsIDB4MDBEMDQ3QzgsCisJMHhBMDQsIDB4MDFGRjAwMEMsCisJMHhBMDgsIDB4OEM4QTgzMDAsCisJMHhBMEMsIDB4MkU2ODAwMEYsCisJMHhBMTAsIDB4OTUwMEJCNzgsCisJMHhBMTQsIDB4MTExNDQwMjgsCisJMHhBMTgsIDB4MDA4ODExMTcsCisJMHhBMUMsIDB4ODkxNDBGMDAsCisJMHhBMjAsIDB4MUExQjAwMDAsCisJMHhBMjQsIDB4MDkwRTEzMTcsCisJMHhBMjgsIDB4MDAwMDAyMDQsCisJMHhBMkMsIDB4MDA5MDAwMDAsCisJMHhBNzAsIDB4MTAxRkZGMDAsCisJMHhBNzQsIDB4MDAwMDAwMDgsCisJMHhBNzgsIDB4MDAwMDA5MDAsCisJMHhBN0MsIDB4MjI1QjA2MDYsCisJMHhBODAsIDB4MjE4MDU0OTAsCisJMHhBODQsIDB4MDAxRjAwMDAsCisJMHhCMDAsIDB4MDMxMDAwNDAsCisJMHhCMDQsIDB4MDAwMEIwMDAsCisJMHhCMDgsIDB4QUUwMjAxRUIsCisJMHhCMEMsIDB4MDEwMDMyMDcsCisJMHhCMTAsIDB4MDAwMDk4MDcsCisJMHhCMTQsIDB4MDEwMDAwMDAsCisJMHhCMTgsIDB4MDAwMDAwMDIsCisJMHhCMUMsIDB4MDAwMDAwMDIsCisJMHhCMjAsIDB4MDAwMDAwMUYsCisJMHhCMjQsIDB4MDMwMjAxMDAsCisJMHhCMjgsIDB4MDcwNjA1MDQsCisJMHhCMkMsIDB4MEIwQTA5MDgsCisJMHhCMzAsIDB4MEYwRTBEMEMsCisJMHhCMzQsIDB4MTMxMjExMTAsCisJMHhCMzgsIDB4MTcxNjE1MTQsCisJMHhCM0MsIDB4MDAwMDAwM0EsCisJMHhCNDAsIDB4MDAwMDAwMDAsCisJMHhCNDQsIDB4MDAwMDAwMDAsCisJMHhCNDgsIDB4MTMwMDAwMzIsCisJMHhCNEMsIDB4NDgwODAwMDAsCisJMHhCNTAsIDB4MDAwMDAwMDAsCisJMHhCNTQsIDB4MDAwMDAwMDAsCisJMHhCNTgsIDB4MDAwMDAwMDAsCisJMHhCNUMsIDB4MDAwMDAwMDAsCisJMHhDMDAsIDB4MDAwMDAwMDcsCisJMHhDMDQsIDB4MDAwNDIwMjAsCisJMHhDMDgsIDB4ODA0MTAyMzEsCisJMHhDMEMsIDB4MDAwMDAwMDAsCisJMHhDMTAsIDB4MDAwMDAxMDAsCisJMHhDMTQsIDB4MDEwMDAwMDAsCisJMHhDMUMsIDB4NDAwMDAwMDMsCisJMHhDMjAsIDB4MkMyQzJDMkMsCisJMHhDMjQsIDB4MzAzMDMwMzAsCisJMHhDMjgsIDB4MzAzMDMwMzAsCisJMHhDMkMsIDB4MkMyQzJDMkMsCisJMHhDMzAsIDB4MkMyQzJDMkMsCisJMHhDMzQsIDB4MkMyQzJDMkMsCisJMHhDMzgsIDB4MkMyQzJDMkMsCisJMHhDM0MsIDB4MkEyQTJBMkEsCisJMHhDNDAsIDB4MkEyQTJBMkEsCisJMHhDNDQsIDB4MkEyQTJBMkEsCisJMHhDNDgsIDB4MkEyQTJBMkEsCisJMHhDNEMsIDB4MkEyQTJBMkEsCisJMHhDNTAsIDB4MDAwMDAwMjAsCisJMHhDNTQsIDB4MDAxQzEyMDgsCisJMHhDNTgsIDB4MzAwMDBDMUMsCisJMHhDNUMsIDB4MDAwMDAwNTgsCisJMHhDNjAsIDB4MzQzNDQ0NDMsCisJMHhDNjQsIDB4MDcwMDMzMzMsCisJMHhDNjgsIDB4MTk3OTE5NzksCisJMHhDNkMsIDB4MTk3OTE5NzksCisJMHhDNzAsIDB4MTk3OTE5NzksCisJMHhDNzQsIDB4MTk3OTE5NzksCisJMHhDNzgsIDB4MTk3OTE5NzksCisJMHhDN0MsIDB4MTk3OTE5NzksCisJMHhDODAsIDB4MTk3OTE5NzksCisJMHhDODQsIDB4MTk3OTE5NzksCisJMHhDOTQsIDB4MDEwMDAwNUMsCisJMHhDOTgsIDB4MDAwMDAwMDAsCisJMHhDOUMsIDB4MDAwMDAwMDAsCisJMHhDQTAsIDB4MDAwMDAwMjksCisJMHhDQTQsIDB4MDgwNDAyMDEsCisJMHhDQTgsIDB4ODA0MDIwMTAsCisJMHhDQjAsIDB4Nzc3NzU3NDcsCisJMHhDQjQsIDB4MTAwMDAwNzcsCisJMHhDQjgsIDB4MDA1MDgyNDAsCit9OworCit1MzIgUlRMODgxMkFFX1BIWV9SRUdfQVJSQVlfUEdbXSA9IHsKKwkwLCAwLCAwLCAweDAwMDAwYzIwLCAweGZmZmZmZmZmLCAweDM0MzYzODQwLAorCTAsIDAsIDAsIDB4MDAwMDBjMjQsIDB4ZmZmZmZmZmYsIDB4NDI0MjQ0NDQsCisJMCwgMCwgMCwgMHgwMDAwMGMyOCwgMHhmZmZmZmZmZiwgMHgzMDMyMzYzOCwKKwkwLCAwLCAwLCAweDAwMDAwYzJjLCAweGZmZmZmZmZmLCAweDQwNDI0NDQ0LAorCTAsIDAsIDAsIDB4MDAwMDBjMzAsIDB4ZmZmZmZmZmYsIDB4MjgzMDMyMzYsCisJMCwgMCwgMSwgMHgwMDAwMGMzNCwgMHhmZmZmZmZmZiwgMHgzODQwNDI0MiwKKwkwLCAwLCAxLCAweDAwMDAwYzM4LCAweGZmZmZmZmZmLCAweDI2MjgzMDM0LAorCTAsIDAsIDAsIDB4MDAwMDBjM2MsIDB4ZmZmZmZmZmYsIDB4NDA0MjQ0NDQsCisJMCwgMCwgMCwgMHgwMDAwMGM0MCwgMHhmZmZmZmZmZiwgMHgyODMwMzIzNiwKKwkwLCAwLCAwLCAweDAwMDAwYzQ0LCAweGZmZmZmZmZmLCAweDQyNDIyNDI2LAorCTAsIDAsIDEsIDB4MDAwMDBjNDgsIDB4ZmZmZmZmZmYsIDB4MzAzNDM4NDAsCisJMCwgMCwgMSwgMHgwMDAwMGM0YywgMHhmZmZmZmZmZiwgMHgyMjI0MjYyOCwKKwkwLCAxLCAwLCAweDAwMDAwZTIwLCAweGZmZmZmZmZmLCAweDM0MzYzODQwLAorCTAsIDEsIDAsIDB4MDAwMDBlMjQsIDB4ZmZmZmZmZmYsIDB4NDI0MjQ0NDQsCisJMCwgMSwgMCwgMHgwMDAwMGUyOCwgMHhmZmZmZmZmZiwgMHgzMDMyMzYzOCwKKwkwLCAxLCAwLCAweDAwMDAwZTJjLCAweGZmZmZmZmZmLCAweDQwNDI0NDQ0LAorCTAsIDEsIDAsIDB4MDAwMDBlMzAsIDB4ZmZmZmZmZmYsIDB4MjgzMDMyMzYsCisJMCwgMSwgMSwgMHgwMDAwMGUzNCwgMHhmZmZmZmZmZiwgMHgzODQwNDI0MiwKKwkwLCAxLCAxLCAweDAwMDAwZTM4LCAweGZmZmZmZmZmLCAweDI2MjgzMDM0LAorCTAsIDEsIDAsIDB4MDAwMDBlM2MsIDB4ZmZmZmZmZmYsIDB4NDA0MjQ0NDQsCisJMCwgMSwgMCwgMHgwMDAwMGU0MCwgMHhmZmZmZmZmZiwgMHgyODMwMzIzNiwKKwkwLCAxLCAwLCAweDAwMDAwZTQ0LCAweGZmZmZmZmZmLCAweDQyNDIyNDI2LAorCTAsIDEsIDEsIDB4MDAwMDBlNDgsIDB4ZmZmZmZmZmYsIDB4MzAzNDM4NDAsCisJMCwgMSwgMSwgMHgwMDAwMGU0YywgMHhmZmZmZmZmZiwgMHgyMjI0MjYyOCwKKwkxLCAwLCAwLCAweDAwMDAwYzI0LCAweGZmZmZmZmZmLCAweDQyNDI0NDQ0LAorCTEsIDAsIDAsIDB4MDAwMDBjMjgsIDB4ZmZmZmZmZmYsIDB4MzAzMjM2NDAsCisJMSwgMCwgMCwgMHgwMDAwMGMyYywgMHhmZmZmZmZmZiwgMHg0MDQyNDQ0NCwKKwkxLCAwLCAwLCAweDAwMDAwYzMwLCAweGZmZmZmZmZmLCAweDI4MzAzMjM2LAorCTEsIDAsIDEsIDB4MDAwMDBjMzQsIDB4ZmZmZmZmZmYsIDB4Mzg0MDQyNDIsCisJMSwgMCwgMSwgMHgwMDAwMGMzOCwgMHhmZmZmZmZmZiwgMHgyNjI4MzAzNCwKKwkxLCAwLCAwLCAweDAwMDAwYzNjLCAweGZmZmZmZmZmLCAweDQwNDI0NDQ0LAorCTEsIDAsIDAsIDB4MDAwMDBjNDAsIDB4ZmZmZmZmZmYsIDB4MjgzMDMyMzYsCisJMSwgMCwgMCwgMHgwMDAwMGM0NCwgMHhmZmZmZmZmZiwgMHg0MjQyMjQyNiwKKwkxLCAwLCAxLCAweDAwMDAwYzQ4LCAweGZmZmZmZmZmLCAweDMwMzQzODQwLAorCTEsIDAsIDEsIDB4MDAwMDBjNGMsIDB4ZmZmZmZmZmYsIDB4MjIyNDI2MjgsCisJMSwgMSwgMCwgMHgwMDAwMGUyNCwgMHhmZmZmZmZmZiwgMHg0MjQyNDQ0NCwKKwkxLCAxLCAwLCAweDAwMDAwZTI4LCAweGZmZmZmZmZmLCAweDMwMzIzNjQwLAorCTEsIDEsIDAsIDB4MDAwMDBlMmMsIDB4ZmZmZmZmZmYsIDB4NDA0MjQ0NDQsCisJMSwgMSwgMCwgMHgwMDAwMGUzMCwgMHhmZmZmZmZmZiwgMHgyODMwMzIzNiwKKwkxLCAxLCAxLCAweDAwMDAwZTM0LCAweGZmZmZmZmZmLCAweDM4NDA0MjQyLAorCTEsIDEsIDEsIDB4MDAwMDBlMzgsIDB4ZmZmZmZmZmYsIDB4MjYyODMwMzQsCisJMSwgMSwgMCwgMHgwMDAwMGUzYywgMHhmZmZmZmZmZiwgMHg0MDQyNDQ0NCwKKwkxLCAxLCAwLCAweDAwMDAwZTQwLCAweGZmZmZmZmZmLCAweDI4MzAzMjM2LAorCTEsIDEsIDAsIDB4MDAwMDBlNDQsIDB4ZmZmZmZmZmYsIDB4NDI0MjI0MjYsCisJMSwgMSwgMSwgMHgwMDAwMGU0OCwgMHhmZmZmZmZmZiwgMHgzMDM0Mzg0MCwKKwkxLCAxLCAxLCAweDAwMDAwZTRjLCAweGZmZmZmZmZmLCAweDIyMjQyNjI4Cit9OworCit1MzIgUlRMODgyMUFFX1BIWV9SRUdfQVJSQVlfUEdbXSA9IHsKKwkwLCAwLCAwLCAweDAwMDAwYzIwLCAweGZmZmZmZmZmLCAweDMyMzQzNjM4LAorCTAsIDAsIDAsIDB4MDAwMDBjMjQsIDB4ZmZmZmZmZmYsIDB4MzYzNjM4MzgsCisJMCwgMCwgMCwgMHgwMDAwMGMyOCwgMHhmZmZmZmZmZiwgMHgyODMwMzIzNCwKKwkwLCAwLCAwLCAweDAwMDAwYzJjLCAweGZmZmZmZmZmLCAweDM0MzYzODM4LAorCTAsIDAsIDAsIDB4MDAwMDBjMzAsIDB4ZmZmZmZmZmYsIDB4MjYyODMwMzIsCisJMCwgMCwgMCwgMHgwMDAwMGMzYywgMHhmZmZmZmZmZiwgMHgzMjM0MzYzNiwKKwkwLCAwLCAwLCAweDAwMDAwYzQwLCAweGZmZmZmZmZmLCAweDI0MjYyODMwLAorCTAsIDAsIDAsIDB4MDAwMDBjNDQsIDB4MDAwMGZmZmYsIDB4MDAwMDIwMjIsCisJMSwgMCwgMCwgMHgwMDAwMGMyNCwgMHhmZmZmZmZmZiwgMHgzNDM0MzYzNiwKKwkxLCAwLCAwLCAweDAwMDAwYzI4LCAweGZmZmZmZmZmLCAweDI2MjgzMDMyLAorCTEsIDAsIDAsIDB4MDAwMDBjMmMsIDB4ZmZmZmZmZmYsIDB4MzIzNDM2MzYsCisJMSwgMCwgMCwgMHgwMDAwMGMzMCwgMHhmZmZmZmZmZiwgMHgyNDI2MjgzMCwKKwkxLCAwLCAwLCAweDAwMDAwYzNjLCAweGZmZmZmZmZmLCAweDMyMzQzNjM2LAorCTEsIDAsIDAsIDB4MDAwMDBjNDAsIDB4ZmZmZmZmZmYsIDB4MjQyNjI4MzAsCisJMSwgMCwgMCwgMHgwMDAwMGM0NCwgMHgwMDAwZmZmZiwgMHgwMDAwMjAyMgorfTsKKworLyogaXQgc2VlbXMgbm90IHVzZWQKK3U4ICpSVEw4ODIxQUVfVFhQV1JfTE1UX0FSUkFZW10gPSB7CisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDEiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwMSIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDEiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjAyIiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDIiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjAyIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwMyIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjAzIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwMyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDQiLCAiMzQiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwNCIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDQiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA1IiwgIjM0IiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDUiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA1IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwNiIsICIzNCIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA2IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwNiIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDciLCAiMzQiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwNyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDciLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA4IiwgIjM0IiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMDgiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA4IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwOSIsICIzNCIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjA5IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIwOSIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTAiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIxMCIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTAiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjExIiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTEiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjExIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIxMiIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjEyIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIxMiIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTMiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkNDSyIsICIxVCIsICIxMyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTMiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjE0IiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJDQ0siLCAiMVQiLCAiMTQiLCAiNjMiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiQ0NLIiwgIjFUIiwgIjE0IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDEiLCAiMzAiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDEiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwMSIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjAyIiwgIjMwIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjAyIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDIiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwMyIsICIzMCIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwMyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjAzIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDQiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDQiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwNCIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA1IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA1IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDUiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwNiIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwNiIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA2IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDciLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDciLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwNyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA4IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA4IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMDgiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwOSIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIwOSIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjA5IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTAiLCAiMzAiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTAiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMCIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExIiwgIjMwIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTEiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMiIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMiIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEyIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTMiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTMiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE0IiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE0IiwgIjYzIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTQiLCAiNjMiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDEiLCAiMjYiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjAxIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjAxIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjAyIiwgIjI2IiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwMiIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwMiIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwMyIsICIyNiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDMiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDMiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDQiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA0IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA0IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA1IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwNSIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwNSIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwNiIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDYiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDYiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDciLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA3IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA3IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjA4IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwOCIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwOCIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIwOSIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDkiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMDkiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTAiLCAiMjYiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEwIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEwIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjExIiwgIjI2IiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMSIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMSIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMiIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTIiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTIiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTMiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEzIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEzIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE0IiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNCIsICI2MyIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNCIsICI2MyIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwMSIsICIzMCIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDEiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDEiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDIiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjAyIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjAyIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjAzIiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwMyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwMyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwNCIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDQiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDQiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDUiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA1IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA1IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA2IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwNiIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwNiIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwNyIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDciLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDciLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMDgiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA4IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA4IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjA5IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwOSIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIwOSIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMCIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTAiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTAiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTEiLCAiMzAiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjExIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjExIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEyIiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMiIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMiIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMyIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTMiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTMiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTQiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE0IiwgIjYzIiwKKwkiTUtLIiwgIjIuNEciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE0IiwgIjYzIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjAxIiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwMSIsICI2MyIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwMSIsICI2MyIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwMiIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDIiLCAiNjMiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDIiLCAiNjMiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDMiLCAiMjYiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjAzIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjAzIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA0IiwgIjI2IiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwNCIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwNCIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwNSIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDUiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDUiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDYiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA2IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA2IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA3IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwNyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwNyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIwOCIsICIyNiIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDgiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDgiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMDkiLCAiMjYiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA5IiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjA5IiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEwIiwgIjI2IiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMCIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMCIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMSIsICIyNiIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTEiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTEiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTIiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEyIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEyIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEzIiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMyIsICIzMiIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMyIsICIzMiIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxNCIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTQiLCAiNjMiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTQiLCAiNjMiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDEiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjAxIiwgIjYzIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjAxIiwgIjYzIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjAyIiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwMiIsICI2MyIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwMiIsICI2MyIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwMyIsICIzMCIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDMiLCAiMzAiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDMiLCAiMzAiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDQiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA0IiwgIjMwIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA0IiwgIjMwIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA1IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwNSIsICIzMCIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwNSIsICIzMCIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwNiIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDYiLCAiMzAiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDYiLCAiMzAiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDciLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA3IiwgIjMwIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA3IiwgIjMwIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjA4IiwgIjMyIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwOCIsICIzMCIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwOCIsICIzMCIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIwOSIsICIzMiIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDkiLCAiMzAiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMDkiLCAiMzAiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTAiLCAiMzIiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEwIiwgIjMwIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEwIiwgIjMwIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjExIiwgIjMwIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMSIsICIzMCIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMSIsICIzMCIsCisJIkZDQyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMiIsICI2MyIsCisJIkVUU0kiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTIiLCAiMzIiLAorCSJNS0siLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTIiLCAiMzIiLAorCSJGQ0MiLCAiMi40RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTMiLCAiNjMiLAorCSJFVFNJIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEzIiwgIjMyIiwKKwkiTUtLIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEzIiwgIjMyIiwKKwkiRkNDIiwgIjIuNEciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjE0IiwgIjYzIiwKKwkiRVRTSSIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxNCIsICI2MyIsCisJIk1LSyIsICIyLjRHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxNCIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIzNiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMzYiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMzYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNDAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjQwIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjQwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjQ0IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI0NCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI0NCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI0OCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNDgiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNDgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNTIiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjUyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjUyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjU2IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI1NiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI1NiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICI2MCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNjAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNjAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiNjQiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjY0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjY0IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEwMCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTAwIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEwMCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMTQiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExNCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMTQiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTA4IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMDgiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTA4IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExMiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTEyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExMiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMTYiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjExNiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMTYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTIwIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMjAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTIwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEyNCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTI0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEyNCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMjgiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEyOCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMjgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTMyIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxMzIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTMyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEzNiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTM2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjEzNiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNDAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE0MCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNDAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTQ5IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNDkiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTQ5IiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE1MyIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTUzIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE1MyIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNTciLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE1NyIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNTciLCAiNjMiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTYxIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiT0ZETSIsICIxVCIsICIxNjEiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTYxIiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE2NSIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIk9GRE0iLCAiMVQiLCAiMTY1IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJPRkRNIiwgIjFUIiwgIjE2NSIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMzYiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIzNiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMzYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjQwIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNDAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjQwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI0NCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjQ0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI0NCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNDgiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI0OCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNDgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjUyIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNTIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjUyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI1NiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjU2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI1NiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNjAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICI2MCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNjAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjY0IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiNjQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjY0IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMDAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMDAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEwMCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTE0IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTE0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMTQiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEwOCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEwOCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTA4IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMTIiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMTIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjExMiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTE2IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTE2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMTYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEyMCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEyMCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTIwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMjQiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMjQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEyNCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTI4IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTI4IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMjgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEzMiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEzMiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTMyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMzYiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxMzYiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjEzNiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTQwIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTQwIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNDAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE0OSIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE0OSIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTQ5IiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNTMiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNTMiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE1MyIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTU3IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTU3IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNTciLCAiNjMiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE2MSIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE2MSIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMVQiLCAiMTYxIiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNjUiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIxVCIsICIxNjUiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjFUIiwgIjE2NSIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMzYiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIzNiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMzYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjQwIiwgIjI4IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNDAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjQwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI0NCIsICIyOCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjQ0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI0NCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNDgiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI0OCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNDgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjUyIiwgIjM0IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNTIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjUyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI1NiIsICIzMiIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjU2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI1NiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNjAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICI2MCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNjAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjY0IiwgIjI2IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiNjQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjY0IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMDAiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMDAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEwMCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTE0IiwgIjI4IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTE0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMTQiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEwOCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEwOCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTA4IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMTIiLCAiMzIiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMTIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjExMiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTE2IiwgIjMyIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTE2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMTYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEyMCIsICIzNCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEyMCIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTIwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMjQiLCAiMzIiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMjQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEyNCIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTI4IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTI4IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMjgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEzMiIsICIyOCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEzMiIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTMyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMzYiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxMzYiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjEzNiIsICIzMCIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTQwIiwgIjI2IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTQwIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNDAiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE0OSIsICIzNCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE0OSIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTQ5IiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNTMiLCAiMzQiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNTMiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE1MyIsICI2MyIsCisJIkZDQyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTU3IiwgIjM0IiwKKwkiRVRTSSIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTU3IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNTciLCAiNjMiLAorCSJGQ0MiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE2MSIsICIzNCIsCisJIkVUU0kiLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE2MSIsICIzMCIsCisJIk1LSyIsICI1RyIsICIyME0iLCAiSFQiLCAiMlQiLCAiMTYxIiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNjUiLCAiMzQiLAorCSJFVFNJIiwgIjVHIiwgIjIwTSIsICJIVCIsICIyVCIsICIxNjUiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiMjBNIiwgIkhUIiwgIjJUIiwgIjE2NSIsICI2MyIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMzgiLCAiMjYiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIzOCIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMzgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjQ2IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiNDYiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjQ2IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICI1NCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjU0IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICI1NCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiNjIiLCAiMjYiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICI2MiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiNjIiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEwMiIsICIyNCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEwMiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTAyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMTAiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMTAiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjExMCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTE4IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTE4IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMTgiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEyNiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEyNiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTI2IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMzQiLCAiMzAiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxMzQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjEzNCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTUxIiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTUxIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIxVCIsICIxNTEiLCAiNjMiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjE1OSIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjFUIiwgIjE1OSIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMVQiLCAiMTU5IiwgIjYzIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIzOCIsICIyOCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjM4IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIzOCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiNDYiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICI0NiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiNDYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjU0IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiNTQiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjU0IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICI2MiIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjYyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICI2MiIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTAyIiwgIjI2IiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTAyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMDIiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjExMCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjExMCIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTEwIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMTgiLCAiMzQiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMTgiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjExOCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTI2IiwgIjMyIiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTI2IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxMjYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEzNCIsICIzMCIsCisJIkVUU0kiLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjEzNCIsICIzMCIsCisJIk1LSyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTM0IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxNTEiLCAiMzQiLAorCSJFVFNJIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxNTEiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiNDBNIiwgIkhUIiwgIjJUIiwgIjE1MSIsICI2MyIsCisJIkZDQyIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTU5IiwgIjM0IiwKKwkiRVRTSSIsICI1RyIsICI0ME0iLCAiSFQiLCAiMlQiLCAiMTU5IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjQwTSIsICJIVCIsICIyVCIsICIxNTkiLCAiNjMiLAorCSJGQ0MiLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICI0MiIsICIyMiIsCisJIkVUU0kiLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICI0MiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjFUIiwgIjQyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMVQiLCAiNTgiLCAiMjAiLAorCSJFVFNJIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMVQiLCAiNTgiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICI1OCIsICIzMCIsCisJIkZDQyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjFUIiwgIjEwNiIsICIyMCIsCisJIkVUU0kiLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICIxMDYiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICIxMDYiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiODBNIiwgIlZIVCIsICIxVCIsICIxMjIiLCAiMjgiLAorCSJFVFNJIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMVQiLCAiMTIyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMVQiLCAiMTIyIiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMVQiLCAiMTU1IiwgIjMwIiwKKwkiRVRTSSIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjFUIiwgIjE1NSIsICIzMCIsCisJIk1LSyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjFUIiwgIjE1NSIsICI2MyIsCisJIkZDQyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjQyIiwgIjI4IiwKKwkiRVRTSSIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjQyIiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMlQiLCAiNDIiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiODBNIiwgIlZIVCIsICIyVCIsICI1OCIsICIyNiIsCisJIkVUU0kiLCAiNUciLCAiODBNIiwgIlZIVCIsICIyVCIsICI1OCIsICIzMCIsCisJIk1LSyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjU4IiwgIjMwIiwKKwkiRkNDIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMlQiLCAiMTA2IiwgIjI4IiwKKwkiRVRTSSIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjEwNiIsICIzMCIsCisJIk1LSyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjEwNiIsICIzMCIsCisJIkZDQyIsICI1RyIsICI4ME0iLCAiVkhUIiwgIjJUIiwgIjEyMiIsICIzMiIsCisJIkVUU0kiLCAiNUciLCAiODBNIiwgIlZIVCIsICIyVCIsICIxMjIiLCAiMzAiLAorCSJNS0siLCAiNUciLCAiODBNIiwgIlZIVCIsICIyVCIsICIxMjIiLCAiMzAiLAorCSJGQ0MiLCAiNUciLCAiODBNIiwgIlZIVCIsICIyVCIsICIxNTUiLCAiMzQiLAorCSJFVFNJIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMlQiLCAiMTU1IiwgIjMwIiwKKwkiTUtLIiwgIjVHIiwgIjgwTSIsICJWSFQiLCAiMlQiLCAiMTU1IiwgIjYzIgorfTsqLworCit1MzIgUlRMODgxMkFFX1JBRElPQV9BUlJBWVtdID0geworCQkweDAwMCwgMHgwMDAxMDAwMCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MDU2LCAweDAwMDUxQ0YyLAorCQkweDA2NiwgMHgwMDA0MDAwMCwKKwkJMHgwMUUsIDB4MDAwODAwMDAsCisJCTB4MDg5LCAweDAwMDAwMDgwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwODYsIDB4MDAwMTRCMzgsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDA4NiwgMHgwMDAxNEIzOCwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDg2LCAweDAwMDE0QjM4LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwODYsIDB4MDAwMTRCM0EsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDA4NiwgMHgwMDAxNEIzQSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDg2LCAweDAwMDE0QjM4LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwQjEsIDB4MDAwMUZDMUEsCisJCTB4MEIzLCAweDAwMEYwODEwLAorCQkweDBCNCwgMHgwMDAxQTc4RCwKKwkJMHgwQkEsIDB4MDAwODYxODAsCisJCTB4MDE4LCAweDAwMDAwMDA2LAorCQkweDBFRiwgMHgwMDAwMjAwMCwKKwkweEZGMEYwN0Q4LCAweEFCQ0QsCisJCTB4MDNCLCAweDAwMDNGMjE4LAorCQkweDAzQiwgMHgwMDAzMEE1OCwKKwkJMHgwM0IsIDB4MDAwMkZBNTgsCisJCTB4MDNCLCAweDAwMDIyNTkwLAorCQkweDAzQiwgMHgwMDAxRkE1MCwKKwkJMHgwM0IsIDB4MDAwMTAyNDgsCisJCTB4MDNCLCAweDAwMDA4MjQwLAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwM0IsIDB4MDAwM0YyMTgsCisJCTB4MDNCLCAweDAwMDMwQTU4LAorCQkweDAzQiwgMHgwMDAyRkE1OCwKKwkJMHgwM0IsIDB4MDAwMjI1OTAsCisJCTB4MDNCLCAweDAwMDFGQTUwLAorCQkweDAzQiwgMHgwMDAxMDI0OCwKKwkJMHgwM0IsIDB4MDAwMDgyNDAsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzQiwgMHgwMDAzOEE1OCwKKwkJMHgwM0IsIDB4MDAwMzdBNTgsCisJCTB4MDNCLCAweDAwMDJBNTkwLAorCQkweDAzQiwgMHgwMDAyN0E1MCwKKwkJMHgwM0IsIDB4MDAwMTgyNDgsCisJCTB4MDNCLCAweDAwMDEwMjQwLAorCQkweDAzQiwgMHgwMDAwODI0MCwKKwkweEZGMEYwN0Q4LCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMTAwLAorCTB4RkYwRjA3RDgsIDB4QUJDRCwKKwkJMHgwMzQsIDB4MDAwMEE0RUUsCisJCTB4MDM0LCAweDAwMDA5MDc2LAorCQkweDAzNCwgMHgwMDAwODA3MywKKwkJMHgwMzQsIDB4MDAwMDcwNzAsCisJCTB4MDM0LCAweDAwMDA2MDZELAorCQkweDAzNCwgMHgwMDAwNTA2QSwKKwkJMHgwMzQsIDB4MDAwMDQwNDksCisJCTB4MDM0LCAweDAwMDAzMDQ2LAorCQkweDAzNCwgMHgwMDAwMjAyOCwKKwkJMHgwMzQsIDB4MDAwMDEwMjUsCisJCTB4MDM0LCAweDAwMDAwMDIyLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzQsIDB4MDAwMEFERjQsCisJCTB4MDM0LCAweDAwMDA5REYxLAorCQkweDAzNCwgMHgwMDAwOERFRSwKKwkJMHgwMzQsIDB4MDAwMDdERUIsCisJCTB4MDM0LCAweDAwMDA2REU4LAorCQkweDAzNCwgMHgwMDAwNUNFQywKKwkJMHgwMzQsIDB4MDAwMDRDRTksCisJCTB4MDM0LCAweDAwMDAzNEVBLAorCQkweDAzNCwgMHgwMDAwMjRFNywKKwkJMHgwMzQsIDB4MDAwMDE0NkIsCisJCTB4MDM0LCAweDAwMDAwMDZELAorCTB4RkYwRjA3RDgsIDB4REVBRCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MEVGLCAweDAwMDAyMEEyLAorCQkweDBERiwgMHgwMDAwMDA4MCwKKwkJMHgwMzUsIDB4MDAwMDAxOTIsCisJCTB4MDM1LCAweDAwMDA4MTkyLAorCQkweDAzNSwgMHgwMDAxMDE5MiwKKwkJMHgwMzYsIDB4MDAwMDAwMjQsCisJCTB4MDM2LCAweDAwMDA4MDI0LAorCQkweDAzNiwgMHgwMDAxMDAyNCwKKwkJMHgwMzYsIDB4MDAwMTgwMjQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDA1MSwgMHgwMDAwMEMyMSwKKwkJMHgwNTIsIDB4MDAwMDA2RDksCisJCTB4MDUzLCAweDAwMEZDNjQ5LAorCQkweDA1NCwgMHgwMDAwMDE3RSwKKwkJMHgwRUYsIDB4MDAwMDAwMDIsCisJCTB4MDA4LCAweDAwMDA4NDAwLAorCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwRUYsIDB4MDAwMDEwMDAsCisJCTB4MDNBLCAweDAwMDAwMDgwLAorCQkweDAzQiwgMHgwMDAzQTAyQywKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDAwLAorCQkweDAzQiwgMHgwMDAzMjAyQywKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMEEwLAorCQkweDAzQiwgMHgwMDAyQjA2NCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwMEQ4LAorCQkweDAzQiwgMHgwMDAyMzA3MCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDY4LAorCQkweDAzQiwgMHgwMDAxQjg3MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMDk4LAorCQkweDAzQiwgMHgwMDAxMjA4NSwKKwkJMHgwM0MsIDB4MDAwRTQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDAwQTA4MCwKKwkJMHgwM0MsIDB4MDAwRjAwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDAwMjA4MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMDgwLAorCQkweDAzQiwgMHgwMDA3QTAyQywKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDAwLAorCQkweDAzQiwgMHgwMDA3MjAyQywKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMEEwLAorCQkweDAzQiwgMHgwMDA2QjA2NCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwMEQ4LAorCQkweDAzQiwgMHgwMDAyMzA3MCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDY4LAorCQkweDAzQiwgMHgwMDA1Qjg3MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMDk4LAorCQkweDAzQiwgMHgwMDA1MjA4NSwKKwkJMHgwM0MsIDB4MDAwRTQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDA0QTA4MCwKKwkJMHgwM0MsIDB4MDAwRjAwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDA0MjA4MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMDgwLAorCQkweDAzQiwgMHgwMDBCQTAyQywKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDAwLAorCQkweDAzQiwgMHgwMDBCMjAyQywKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMEEwLAorCQkweDAzQiwgMHgwMDBBQjA2NCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwMEQ4LAorCQkweDAzQiwgMHgwMDBBMzA3MCwKKwkJMHgwM0MsIDB4MDAwMDQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDY4LAorCQkweDAzQiwgMHgwMDA5Qjg3MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MDNBLCAweDAwMDAwMDk4LAorCQkweDAzQiwgMHgwMDA5MjA4NSwKKwkJMHgwM0MsIDB4MDAwRTQwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDA4QTA4MCwKKwkJMHgwM0MsIDB4MDAwRjAwMDAsCisJCTB4MDNBLCAweDAwMDAwNDE4LAorCQkweDAzQiwgMHgwMDA4MjA4MCwKKwkJMHgwM0MsIDB4MDAwMTAwMDAsCisJCTB4MEVGLCAweDAwMDAxMTAwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwMzQsIDB4MDAwNEEwQjIsCisJCTB4MDM0LCAweDAwMDQ5MEFGLAorCQkweDAzNCwgMHgwMDA0ODA3MCwKKwkJMHgwMzQsIDB4MDAwNDcwNkQsCisJCTB4MDM0LCAweDAwMDQ2MDUwLAorCQkweDAzNCwgMHgwMDA0NTA0RCwKKwkJMHgwMzQsIDB4MDAwNDQwNEEsCisJCTB4MDM0LCAweDAwMDQzMDQ3LAorCQkweDAzNCwgMHgwMDA0MjAwQSwKKwkJMHgwMzQsIDB4MDAwNDEwMDcsCisJCTB4MDM0LCAweDAwMDQwMDA0LAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwNEEwQjIsCisJCTB4MDM0LCAweDAwMDQ5MEFGLAorCQkweDAzNCwgMHgwMDA0ODA3MCwKKwkJMHgwMzQsIDB4MDAwNDcwNkQsCisJCTB4MDM0LCAweDAwMDQ2MDUwLAorCQkweDAzNCwgMHgwMDA0NTA0RCwKKwkJMHgwMzQsIDB4MDAwNDQwNEEsCisJCTB4MDM0LCAweDAwMDQzMDQ3LAorCQkweDAzNCwgMHgwMDA0MjAwQSwKKwkJMHgwMzQsIDB4MDAwNDEwMDcsCisJCTB4MDM0LCAweDAwMDQwMDA0LAorCTB4RkYwRjAxQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwNEEwQjIsCisJCTB4MDM0LCAweDAwMDQ5MEFGLAorCQkweDAzNCwgMHgwMDA0ODA3MCwKKwkJMHgwMzQsIDB4MDAwNDcwNkQsCisJCTB4MDM0LCAweDAwMDQ2MDUwLAorCQkweDAzNCwgMHgwMDA0NTA0RCwKKwkJMHgwMzQsIDB4MDAwNDQwNEEsCisJCTB4MDM0LCAweDAwMDQzMDQ3LAorCQkweDAzNCwgMHgwMDA0MjAwQSwKKwkJMHgwMzQsIDB4MDAwNDEwMDcsCisJCTB4MDM0LCAweDAwMDQwMDA0LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwNEEwQjIsCisJCTB4MDM0LCAweDAwMDQ5MEFGLAorCQkweDAzNCwgMHgwMDA0ODA3MCwKKwkJMHgwMzQsIDB4MDAwNDcwNkQsCisJCTB4MDM0LCAweDAwMDQ2MDUwLAorCQkweDAzNCwgMHgwMDA0NTA0RCwKKwkJMHgwMzQsIDB4MDAwNDQwNEEsCisJCTB4MDM0LCAweDAwMDQzMDQ3LAorCQkweDAzNCwgMHgwMDA0MjAwQSwKKwkJMHgwMzQsIDB4MDAwNDEwMDcsCisJCTB4MDM0LCAweDAwMDQwMDA0LAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwNEEwQjIsCisJCTB4MDM0LCAweDAwMDQ5MEFGLAorCQkweDAzNCwgMHgwMDA0ODA3MCwKKwkJMHgwMzQsIDB4MDAwNDcwNkQsCisJCTB4MDM0LCAweDAwMDQ2MDUwLAorCQkweDAzNCwgMHgwMDA0NTA0RCwKKwkJMHgwMzQsIDB4MDAwNDQwNEEsCisJCTB4MDM0LCAweDAwMDQzMDQ3LAorCQkweDAzNCwgMHgwMDA0MjAwQSwKKwkJMHgwMzQsIDB4MDAwNDEwMDcsCisJCTB4MDM0LCAweDAwMDQwMDA0LAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzQsIDB4MDAwNEFERjUsCisJCTB4MDM0LCAweDAwMDQ5REYyLAorCQkweDAzNCwgMHgwMDA0OERFRiwKKwkJMHgwMzQsIDB4MDAwNDdERUMsCisJCTB4MDM0LCAweDAwMDQ2REU5LAorCQkweDAzNCwgMHgwMDA0NURDOSwKKwkJMHgwMzQsIDB4MDAwNDRDRTgsCisJCTB4MDM0LCAweDAwMDQzOENBLAorCQkweDAzNCwgMHgwMDA0Mjg4OSwKKwkJMHgwMzQsIDB4MDAwNDE4NEEsCisJCTB4MDM0LCAweDAwMDQwNDRBLAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkweEZGMEYwNzQwLCAweEFCQ0QsCisJCTB4MDM0LCAweDAwMDJBMEIyLAorCQkweDAzNCwgMHgwMDAyOTBBRiwKKwkJMHgwMzQsIDB4MDAwMjgwNzAsCisJCTB4MDM0LCAweDAwMDI3MDZELAorCQkweDAzNCwgMHgwMDAyNjA1MCwKKwkJMHgwMzQsIDB4MDAwMjUwNEQsCisJCTB4MDM0LCAweDAwMDI0MDRBLAorCQkweDAzNCwgMHgwMDAyMzA0NywKKwkJMHgwMzQsIDB4MDAwMjIwMEEsCisJCTB4MDM0LCAweDAwMDIxMDA3LAorCQkweDAzNCwgMHgwMDAyMDAwNCwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDJBMEIyLAorCQkweDAzNCwgMHgwMDAyOTBBRiwKKwkJMHgwMzQsIDB4MDAwMjgwNzAsCisJCTB4MDM0LCAweDAwMDI3MDZELAorCQkweDAzNCwgMHgwMDAyNjA1MCwKKwkJMHgwMzQsIDB4MDAwMjUwNEQsCisJCTB4MDM0LCAweDAwMDI0MDRBLAorCQkweDAzNCwgMHgwMDAyMzA0NywKKwkJMHgwMzQsIDB4MDAwMjIwMEEsCisJCTB4MDM0LCAweDAwMDIxMDA3LAorCQkweDAzNCwgMHgwMDAyMDAwNCwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDJBMEIyLAorCQkweDAzNCwgMHgwMDAyOTBBRiwKKwkJMHgwMzQsIDB4MDAwMjgwNzAsCisJCTB4MDM0LCAweDAwMDI3MDZELAorCQkweDAzNCwgMHgwMDAyNjA1MCwKKwkJMHgwMzQsIDB4MDAwMjUwNEQsCisJCTB4MDM0LCAweDAwMDI0MDRBLAorCQkweDAzNCwgMHgwMDAyMzA0NywKKwkJMHgwMzQsIDB4MDAwMjIwMEEsCisJCTB4MDM0LCAweDAwMDIxMDA3LAorCQkweDAzNCwgMHgwMDAyMDAwNCwKKwkweEZGMEYwN0Q4LCAweENERUYsCisJCTB4MDM0LCAweDAwMDJBMEIyLAorCQkweDAzNCwgMHgwMDAyOTBBRiwKKwkJMHgwMzQsIDB4MDAwMjgwNzAsCisJCTB4MDM0LCAweDAwMDI3MDZELAorCQkweDAzNCwgMHgwMDAyNjA1MCwKKwkJMHgwMzQsIDB4MDAwMjUwNEQsCisJCTB4MDM0LCAweDAwMDI0MDRBLAorCQkweDAzNCwgMHgwMDAyMzA0NywKKwkJMHgwMzQsIDB4MDAwMjIwMEEsCisJCTB4MDM0LCAweDAwMDIxMDA3LAorCQkweDAzNCwgMHgwMDAyMDAwNCwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDJBMEIyLAorCQkweDAzNCwgMHgwMDAyOTBBRiwKKwkJMHgwMzQsIDB4MDAwMjgwNzAsCisJCTB4MDM0LCAweDAwMDI3MDZELAorCQkweDAzNCwgMHgwMDAyNjA1MCwKKwkJMHgwMzQsIDB4MDAwMjUwNEQsCisJCTB4MDM0LCAweDAwMDI0MDRBLAorCQkweDAzNCwgMHgwMDAyMzA0NywKKwkJMHgwMzQsIDB4MDAwMjIwMEEsCisJCTB4MDM0LCAweDAwMDIxMDA3LAorCQkweDAzNCwgMHgwMDAyMDAwNCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDM0LCAweDAwMDJBREY1LAorCQkweDAzNCwgMHgwMDAyOURGMiwKKwkJMHgwMzQsIDB4MDAwMjhERUYsCisJCTB4MDM0LCAweDAwMDI3REVDLAorCQkweDAzNCwgMHgwMDAyNkRFOSwKKwkJMHgwMzQsIDB4MDAwMjVEQzksCisJCTB4MDM0LCAweDAwMDI0Q0U4LAorCQkweDAzNCwgMHgwMDAyMzhDQSwKKwkJMHgwMzQsIDB4MDAwMjI4ODksCisJCTB4MDM0LCAweDAwMDIxODRBLAorCQkweDAzNCwgMHgwMDAyMDQ0QSwKKwkweEZGMEYwNzQwLCAweERFQUQsCisJMHhGRjBGMDc0MCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDAwQTBCMiwKKwkJMHgwMzQsIDB4MDAwMDkwQUYsCisJCTB4MDM0LCAweDAwMDA4MDcwLAorCQkweDAzNCwgMHgwMDAwNzA2RCwKKwkJMHgwMzQsIDB4MDAwMDYwNTAsCisJCTB4MDM0LCAweDAwMDA1MDRELAorCQkweDAzNCwgMHgwMDAwNDA0QSwKKwkJMHgwMzQsIDB4MDAwMDMwNDcsCisJCTB4MDM0LCAweDAwMDAyMDBBLAorCQkweDAzNCwgMHgwMDAwMTAwNywKKwkJMHgwMzQsIDB4MDAwMDAwMDQsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAwQTBCMiwKKwkJMHgwMzQsIDB4MDAwMDkwQUYsCisJCTB4MDM0LCAweDAwMDA4MDcwLAorCQkweDAzNCwgMHgwMDAwNzA2RCwKKwkJMHgwMzQsIDB4MDAwMDYwNTAsCisJCTB4MDM0LCAweDAwMDA1MDRELAorCQkweDAzNCwgMHgwMDAwNDA0QSwKKwkJMHgwMzQsIDB4MDAwMDMwNDcsCisJCTB4MDM0LCAweDAwMDAyMDBBLAorCQkweDAzNCwgMHgwMDAwMTAwNywKKwkJMHgwMzQsIDB4MDAwMDAwMDQsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAwQTBCMiwKKwkJMHgwMzQsIDB4MDAwMDkwQUYsCisJCTB4MDM0LCAweDAwMDA4MDcwLAorCQkweDAzNCwgMHgwMDAwNzA2RCwKKwkJMHgwMzQsIDB4MDAwMDYwNTAsCisJCTB4MDM0LCAweDAwMDA1MDRELAorCQkweDAzNCwgMHgwMDAwNDA0QSwKKwkJMHgwMzQsIDB4MDAwMDMwNDcsCisJCTB4MDM0LCAweDAwMDAyMDBBLAorCQkweDAzNCwgMHgwMDAwMTAwNywKKwkJMHgwMzQsIDB4MDAwMDAwMDQsCisJMHhGRjBGMDdEOCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAwQTBCMiwKKwkJMHgwMzQsIDB4MDAwMDkwQUYsCisJCTB4MDM0LCAweDAwMDA4MDcwLAorCQkweDAzNCwgMHgwMDAwNzA2RCwKKwkJMHgwMzQsIDB4MDAwMDYwNTAsCisJCTB4MDM0LCAweDAwMDA1MDRELAorCQkweDAzNCwgMHgwMDAwNDA0QSwKKwkJMHgwMzQsIDB4MDAwMDMwNDcsCisJCTB4MDM0LCAweDAwMDAyMDBBLAorCQkweDAzNCwgMHgwMDAwMTAwNywKKwkJMHgwMzQsIDB4MDAwMDAwMDQsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAwQTBCMiwKKwkJMHgwMzQsIDB4MDAwMDkwQUYsCisJCTB4MDM0LCAweDAwMDA4MDcwLAorCQkweDAzNCwgMHgwMDAwNzA2RCwKKwkJMHgwMzQsIDB4MDAwMDYwNTAsCisJCTB4MDM0LCAweDAwMDA1MDRELAorCQkweDAzNCwgMHgwMDAwNDA0QSwKKwkJMHgwMzQsIDB4MDAwMDMwNDcsCisJCTB4MDM0LCAweDAwMDAyMDBBLAorCQkweDAzNCwgMHgwMDAwMTAwNywKKwkJMHgwMzQsIDB4MDAwMDAwMDQsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNCwgMHgwMDAwQUZGNywKKwkJMHgwMzQsIDB4MDAwMDlERjcsCisJCTB4MDM0LCAweDAwMDA4REY0LAorCQkweDAzNCwgMHgwMDAwN0RGMSwKKwkJMHgwMzQsIDB4MDAwMDZERUUsCisJCTB4MDM0LCAweDAwMDA1RENELAorCQkweDAzNCwgMHgwMDAwNENFQiwKKwkJMHgwMzQsIDB4MDAwMDM4Q0MsCisJCTB4MDM0LCAweDAwMDAyODhCLAorCQkweDAzNCwgMHgwMDAwMTg0QywKKwkJMHgwMzQsIDB4MDAwMDA0NEMsCisJMHhGRjBGMDc0MCwgMHhERUFELAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkweEZGMEYwNzQwLCAweEFCQ0QsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxRDQsCisJCTB4MDM1LCAweDAwMDA4MUQ0LAorCQkweDAzNSwgMHgwMDAxMDFENCwKKwkJMHgwMzUsIDB4MDAwMjAxQjQsCisJCTB4MDM1LCAweDAwMDI4MUI0LAorCQkweDAzNSwgMHgwMDAzMDFCNCwKKwkJMHgwMzUsIDB4MDAwNDAxQjQsCisJCTB4MDM1LCAweDAwMDQ4MUI0LAorCQkweDAzNSwgMHgwMDA1MDFCNCwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxRDQsCisJCTB4MDM1LCAweDAwMDA4MUQ0LAorCQkweDAzNSwgMHgwMDAxMDFENCwKKwkJMHgwMzUsIDB4MDAwMjAxQjQsCisJCTB4MDM1LCAweDAwMDI4MUI0LAorCQkweDAzNSwgMHgwMDAzMDFCNCwKKwkJMHgwMzUsIDB4MDAwNDAxQjQsCisJCTB4MDM1LCAweDAwMDQ4MUI0LAorCQkweDAzNSwgMHgwMDA1MDFCNCwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxRDQsCisJCTB4MDM1LCAweDAwMDA4MUQ0LAorCQkweDAzNSwgMHgwMDAxMDFENCwKKwkJMHgwMzUsIDB4MDAwMjAxQjQsCisJCTB4MDM1LCAweDAwMDI4MUI0LAorCQkweDAzNSwgMHgwMDAzMDFCNCwKKwkJMHgwMzUsIDB4MDAwNDAxQjQsCisJCTB4MDM1LCAweDAwMDQ4MUI0LAorCQkweDAzNSwgMHgwMDA1MDFCNCwKKwkweEZGMEYwN0Q4LCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxRDQsCisJCTB4MDM1LCAweDAwMDA4MUQ0LAorCQkweDAzNSwgMHgwMDAxMDFENCwKKwkJMHgwMzUsIDB4MDAwMjAxQjQsCisJCTB4MDM1LCAweDAwMDI4MUI0LAorCQkweDAzNSwgMHgwMDAzMDFCNCwKKwkJMHgwMzUsIDB4MDAwNDAxQjQsCisJCTB4MDM1LCAweDAwMDQ4MUI0LAorCQkweDAzNSwgMHgwMDA1MDFCNCwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxRDQsCisJCTB4MDM1LCAweDAwMDA4MUQ0LAorCQkweDAzNSwgMHgwMDAxMDFENCwKKwkJMHgwMzUsIDB4MDAwMjAxQjQsCisJCTB4MDM1LCAweDAwMDI4MUI0LAorCQkweDAzNSwgMHgwMDAzMDFCNCwKKwkJMHgwMzUsIDB4MDAwNDAxQjQsCisJCTB4MDM1LCAweDAwMDQ4MUI0LAorCQkweDAzNSwgMHgwMDA1MDFCNCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxODgsCisJCTB4MDM1LCAweDAwMDA4MTQ3LAorCQkweDAzNSwgMHgwMDAxMDE0NywKKwkJMHgwMzUsIDB4MDAwMjAxRDcsCisJCTB4MDM1LCAweDAwMDI4MUQ3LAorCQkweDAzNSwgMHgwMDAzMDFENywKKwkJMHgwMzUsIDB4MDAwNDAxRDgsCisJCTB4MDM1LCAweDAwMDQ4MUQ4LAorCQkweDAzNSwgMHgwMDA1MDFEOCwKKwkweEZGMEYwNzQwLCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDAwNEJGQiwKKwkJMHgwMzYsIDB4MDAwMENCRkIsCisJCTB4MDM2LCAweDAwMDE0QkZCLAorCQkweDAzNiwgMHgwMDAxQ0JGQiwKKwkJMHgwMzYsIDB4MDAwMjRGNEIsCisJCTB4MDM2LCAweDAwMDJDRjRCLAorCQkweDAzNiwgMHgwMDAzNEY0QiwKKwkJMHgwMzYsIDB4MDAwM0NGNEIsCisJCTB4MDM2LCAweDAwMDQ0RjRCLAorCQkweDAzNiwgMHgwMDA0Q0Y0QiwKKwkJMHgwMzYsIDB4MDAwNTRGNEIsCisJCTB4MDM2LCAweDAwMDVDRjRCLAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDAwNEJGQiwKKwkJMHgwMzYsIDB4MDAwMENCRkIsCisJCTB4MDM2LCAweDAwMDE0QkZCLAorCQkweDAzNiwgMHgwMDAxQ0JGQiwKKwkJMHgwMzYsIDB4MDAwMjRGNEIsCisJCTB4MDM2LCAweDAwMDJDRjRCLAorCQkweDAzNiwgMHgwMDAzNEY0QiwKKwkJMHgwMzYsIDB4MDAwM0NGNEIsCisJCTB4MDM2LCAweDAwMDQ0RjRCLAorCQkweDAzNiwgMHgwMDA0Q0Y0QiwKKwkJMHgwMzYsIDB4MDAwNTRGNEIsCisJCTB4MDM2LCAweDAwMDVDRjRCLAorCTB4RkYwRjAxQzAsIDB4Q0RFRiwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDAwNEJGQiwKKwkJMHgwMzYsIDB4MDAwMENCRkIsCisJCTB4MDM2LCAweDAwMDE0QkZCLAorCQkweDAzNiwgMHgwMDAxQ0JGQiwKKwkJMHgwMzYsIDB4MDAwMjRGNEIsCisJCTB4MDM2LCAweDAwMDJDRjRCLAorCQkweDAzNiwgMHgwMDAzNEY0QiwKKwkJMHgwMzYsIDB4MDAwM0NGNEIsCisJCTB4MDM2LCAweDAwMDQ0RjRCLAorCQkweDAzNiwgMHgwMDA0Q0Y0QiwKKwkJMHgwMzYsIDB4MDAwNTRGNEIsCisJCTB4MDM2LCAweDAwMDVDRjRCLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDAwNEJGQiwKKwkJMHgwMzYsIDB4MDAwMENCRkIsCisJCTB4MDM2LCAweDAwMDE0QkZCLAorCQkweDAzNiwgMHgwMDAxQ0JGQiwKKwkJMHgwMzYsIDB4MDAwMjRGNEIsCisJCTB4MDM2LCAweDAwMDJDRjRCLAorCQkweDAzNiwgMHgwMDAzNEY0QiwKKwkJMHgwMzYsIDB4MDAwM0NGNEIsCisJCTB4MDM2LCAweDAwMDQ0RjRCLAorCQkweDAzNiwgMHgwMDA0Q0Y0QiwKKwkJMHgwMzYsIDB4MDAwNTRGNEIsCisJCTB4MDM2LCAweDAwMDVDRjRCLAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDAwNEJGQiwKKwkJMHgwMzYsIDB4MDAwMENCRkIsCisJCTB4MDM2LCAweDAwMDE0QkZCLAorCQkweDAzNiwgMHgwMDAxQ0JGQiwKKwkJMHgwMzYsIDB4MDAwMjRGNEIsCisJCTB4MDM2LCAweDAwMDJDRjRCLAorCQkweDAzNiwgMHgwMDAzNEY0QiwKKwkJMHgwMzYsIDB4MDAwM0NGNEIsCisJCTB4MDM2LCAweDAwMDQ0RjRCLAorCQkweDAzNiwgMHgwMDA0Q0Y0QiwKKwkJMHgwMzYsIDB4MDAwNTRGNEIsCisJCTB4MDM2LCAweDAwMDVDRjRCLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDEwLAorCQkweDAzNiwgMHgwMDA4NEVCNCwKKwkJMHgwMzYsIDB4MDAwOENDMzUsCisJCTB4MDM2LCAweDAwMDk0QzM1LAorCQkweDAzNiwgMHgwMDA5Q0MzNSwKKwkJMHgwMzYsIDB4MDAwQTQ5MzUsCisJCTB4MDM2LCAweDAwMEFDQzM1LAorCQkweDAzNiwgMHgwMDBCNEMzNSwKKwkJMHgwMzYsIDB4MDAwQkNDMzUsCisJCTB4MDM2LCAweDAwMEM0RUI0LAorCQkweDAzNiwgMHgwMDBDQ0VCNSwKKwkJMHgwMzYsIDB4MDAwRDRFQjUsCisJCTB4MDM2LCAweDAwMERDRUI1LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MEVGLCAweDAwMDAwMDA4LAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwM0MsIDB4MDAwMDAyQ0MsCisJCTB4MDNDLCAweDAwMDAwNTIyLAorCQkweDAzQywgMHgwMDAwMDkwMiwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDNDLCAweDAwMDAwMkNDLAorCQkweDAzQywgMHgwMDAwMDUyMiwKKwkJMHgwM0MsIDB4MDAwMDA5MDIsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDAzQywgMHgwMDAwMDJDQywKKwkJMHgwM0MsIDB4MDAwMDA1MjIsCisJCTB4MDNDLCAweDAwMDAwOTAyLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwM0MsIDB4MDAwMDAyQ0MsCisJCTB4MDNDLCAweDAwMDAwNTIyLAorCQkweDAzQywgMHgwMDAwMDkwMiwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDNDLCAweDAwMDAwMkNDLAorCQkweDAzQywgMHgwMDAwMDUyMiwKKwkJMHgwM0MsIDB4MDAwMDA5MDIsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzQywgMHgwMDAwMDJBOCwKKwkJMHgwM0MsIDB4MDAwMDA1QTIsCisJCTB4MDNDLCAweDAwMDAwODgwLAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAwMiwKKwkJMHgwREYsIDB4MDAwMDAwODAsCisJCTB4MDFGLCAweDAwMDQwMDY0LAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwNjEsIDB4MDAwRkRENDMsCisJCTB4MDYyLCAweDAwMDM4RjRCLAorCQkweDA2MywgMHgwMDAzMjExNywKKwkJMHgwNjQsIDB4MDAwMTk0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRkRENDMsCisJCTB4MDYyLCAweDAwMDM4RjRCLAorCQkweDA2MywgMHgwMDAzMjExNywKKwkJMHgwNjQsIDB4MDAwMTk0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjAxQzAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRkRENDMsCisJCTB4MDYyLCAweDAwMDM4RjRCLAorCQkweDA2MywgMHgwMDAzMjExNywKKwkJMHgwNjQsIDB4MDAwMTk0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRkRENDMsCisJCTB4MDYyLCAweDAwMDM4RjRCLAorCQkweDA2MywgMHgwMDAzMjExNywKKwkJMHgwNjQsIDB4MDAwMTk0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRkRENDMsCisJCTB4MDYyLCAweDAwMDM4RjRCLAorCQkweDA2MywgMHgwMDAzMjExNywKKwkJMHgwNjQsIDB4MDAwMTk0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwNjEsIDB4MDAwRTVENTMsCisJCTB4MDYyLCAweDAwMDM4RkNELAorCQkweDA2MywgMHgwMDAzMTRFQiwKKwkJMHgwNjQsIDB4MDAwMTk2QUMsCisJCTB4MDY1LCAweDAwMDkxMUQ3LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwMDgsIDB4MDAwMDg0MDAsCisJCTB4MDFDLCAweDAwMDczOUQyLAorCQkweDBCNCwgMHgwMDAxRTc4RCwKKwkJMHgwMTgsIDB4MDAwMUYxMkEsCisJCTB4MEZFLCAweDAwMDAwMDAwLAorCQkweDBGRSwgMHgwMDAwMDAwMCwKKwkJMHgwRkUsIDB4MDAwMDAwMDAsCisJCTB4MEZFLCAweDAwMDAwMDAwLAorCQkweDBCNCwgMHgwMDAxQTc4RCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCit9OworCit1MzIgUlRMODgxMkFFX1JBRElPQl9BUlJBWVtdID0geworCQkweDA1NiwgMHgwMDA1MUNGMiwKKwkJMHgwNjYsIDB4MDAwNDAwMDAsCisJCTB4MDg5LCAweDAwMDAwMDgwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwODYsIDB4MDAwMTRCMzgsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDA4NiwgMHgwMDAxNEIzOCwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDg2LCAweDAwMDE0QjM4LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwODYsIDB4MDAwMTRCM0EsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDA4NiwgMHgwMDAxNEIzQSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDg2LCAweDAwMDE0QjM4LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwMTgsIDB4MDAwMDAwMDYsCisJCTB4MEVGLCAweDAwMDAyMDAwLAorCTB4RkYwRjA3RDgsIDB4QUJDRCwKKwkJMHgwM0IsIDB4MDAwM0YyMTgsCisJCTB4MDNCLCAweDAwMDMwQTU4LAorCQkweDAzQiwgMHgwMDAyRkE1OCwKKwkJMHgwM0IsIDB4MDAwMjI1OTAsCisJCTB4MDNCLCAweDAwMDFGQTUwLAorCQkweDAzQiwgMHgwMDAxMDI0OCwKKwkJMHgwM0IsIDB4MDAwMDgyNDAsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDAzQiwgMHgwMDAzRjIxOCwKKwkJMHgwM0IsIDB4MDAwMzBBNTgsCisJCTB4MDNCLCAweDAwMDJGQTU4LAorCQkweDAzQiwgMHgwMDAyMjU5MCwKKwkJMHgwM0IsIDB4MDAwMUZBNTAsCisJCTB4MDNCLCAweDAwMDEwMjQ4LAorCQkweDAzQiwgMHgwMDAwODI0MCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDNCLCAweDAwMDM4QTU4LAorCQkweDAzQiwgMHgwMDAzN0E1OCwKKwkJMHgwM0IsIDB4MDAwMkE1OTAsCisJCTB4MDNCLCAweDAwMDI3QTUwLAorCQkweDAzQiwgMHgwMDAxODI0OCwKKwkJMHgwM0IsIDB4MDAwMTAyNDAsCisJCTB4MDNCLCAweDAwMDA4MjQwLAorCTB4RkYwRjA3RDgsIDB4REVBRCwKKwkJMHgwRUYsIDB4MDAwMDAxMDAsCisJMHhGRjBGMDdEOCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDAwQTRFRSwKKwkJMHgwMzQsIDB4MDAwMDkwNzYsCisJCTB4MDM0LCAweDAwMDA4MDczLAorCQkweDAzNCwgMHgwMDAwNzA3MCwKKwkJMHgwMzQsIDB4MDAwMDYwNkQsCisJCTB4MDM0LCAweDAwMDA1MDZBLAorCQkweDAzNCwgMHgwMDAwNDA0OSwKKwkJMHgwMzQsIDB4MDAwMDMwNDYsCisJCTB4MDM0LCAweDAwMDAyMDI4LAorCQkweDAzNCwgMHgwMDAwMTAyNSwKKwkJMHgwMzQsIDB4MDAwMDAwMjIsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNCwgMHgwMDAwQURGNCwKKwkJMHgwMzQsIDB4MDAwMDlERjEsCisJCTB4MDM0LCAweDAwMDA4REVFLAorCQkweDAzNCwgMHgwMDAwN0RFQiwKKwkJMHgwMzQsIDB4MDAwMDZERTgsCisJCTB4MDM0LCAweDAwMDA1Q0VDLAorCQkweDAzNCwgMHgwMDAwNENFOSwKKwkJMHgwMzQsIDB4MDAwMDM0RUEsCisJCTB4MDM0LCAweDAwMDAyNEU3LAorCQkweDAzNCwgMHgwMDAwMTQ2QiwKKwkJMHgwMzQsIDB4MDAwMDAwNkQsCisJMHhGRjBGMDdEOCwgMHhERUFELAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkJMHgwRUYsIDB4MDAwMDIwQTIsCisJCTB4MERGLCAweDAwMDAwMDgwLAorCQkweDAzNSwgMHgwMDAwMDE5MiwKKwkJMHgwMzUsIDB4MDAwMDgxOTIsCisJCTB4MDM1LCAweDAwMDEwMTkyLAorCQkweDAzNiwgMHgwMDAwMDAyNCwKKwkJMHgwMzYsIDB4MDAwMDgwMjQsCisJCTB4MDM2LCAweDAwMDEwMDI0LAorCQkweDAzNiwgMHgwMDAxODAyNCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MDUxLCAweDAwMDAwQzIxLAorCQkweDA1MiwgMHgwMDAwMDZEOSwKKwkJMHgwNTMsIDB4MDAwRkM2NDksCisJCTB4MDU0LCAweDAwMDAwMTdFLAorCQkweDBFRiwgMHgwMDAwMDAwMiwKKwkJMHgwMDgsIDB4MDAwMDg0MDAsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMTAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwODAsCisJCTB4MDNCLCAweDAwMDNBMDJDLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MDAsCisJCTB4MDNCLCAweDAwMDMyMDJDLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwQTAsCisJCTB4MDNCLCAweDAwMDJCMDY0LAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwRDgsCisJCTB4MDNCLCAweDAwMDIzMDcwLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0NjgsCisJCTB4MDNCLCAweDAwMDFCODcwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwOTgsCisJCTB4MDNCLCAweDAwMDEyMDg1LAorCQkweDAzQywgMHgwMDBFNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDBBMDgwLAorCQkweDAzQywgMHgwMDBGMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDAyMDgwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwODAsCisJCTB4MDNCLCAweDAwMDdBMDJDLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MDAsCisJCTB4MDNCLCAweDAwMDcyMDJDLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwQTAsCisJCTB4MDNCLCAweDAwMDZCMDY0LAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwRDgsCisJCTB4MDNCLCAweDAwMDYzMDcwLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0NjgsCisJCTB4MDNCLCAweDAwMDVCODcwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwOTgsCisJCTB4MDNCLCAweDAwMDUyMDg1LAorCQkweDAzQywgMHgwMDBFNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDRBMDgwLAorCQkweDAzQywgMHgwMDBGMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDQyMDgwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwODAsCisJCTB4MDNCLCAweDAwMEJBMDJDLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MDAsCisJCTB4MDNCLCAweDAwMEIyMDJDLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwQTAsCisJCTB4MDNCLCAweDAwMEFCMDY0LAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwRDgsCisJCTB4MDNCLCAweDAwMEEzMDcwLAorCQkweDAzQywgMHgwMDAwNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0NjgsCisJCTB4MDNCLCAweDAwMDlCODcwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDAwOTgsCisJCTB4MDNCLCAweDAwMDkyMDg1LAorCQkweDAzQywgMHgwMDBFNDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDhBMDgwLAorCQkweDAzQywgMHgwMDBGMDAwMCwKKwkJMHgwM0EsIDB4MDAwMDA0MTgsCisJCTB4MDNCLCAweDAwMDgyMDgwLAorCQkweDAzQywgMHgwMDAxMDAwMCwKKwkJMHgwRUYsIDB4MDAwMDExMDAsCisJMHhGRjBGMDc0MCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDA0QTBCMiwKKwkJMHgwMzQsIDB4MDAwNDkwQUYsCisJCTB4MDM0LCAweDAwMDQ4MDcwLAorCQkweDAzNCwgMHgwMDA0NzA2RCwKKwkJMHgwMzQsIDB4MDAwNDYwNTAsCisJCTB4MDM0LCAweDAwMDQ1MDRELAorCQkweDAzNCwgMHgwMDA0NDA0QSwKKwkJMHgwMzQsIDB4MDAwNDMwNDcsCisJCTB4MDM0LCAweDAwMDQyMDBBLAorCQkweDAzNCwgMHgwMDA0MTAwNywKKwkJMHgwMzQsIDB4MDAwNDAwMDQsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QTBCMiwKKwkJMHgwMzQsIDB4MDAwNDkwQUYsCisJCTB4MDM0LCAweDAwMDQ4MDcwLAorCQkweDAzNCwgMHgwMDA0NzA2RCwKKwkJMHgwMzQsIDB4MDAwNDYwNTAsCisJCTB4MDM0LCAweDAwMDQ1MDRELAorCQkweDAzNCwgMHgwMDA0NDA0QSwKKwkJMHgwMzQsIDB4MDAwNDMwNDcsCisJCTB4MDM0LCAweDAwMDQyMDBBLAorCQkweDAzNCwgMHgwMDA0MTAwNywKKwkJMHgwMzQsIDB4MDAwNDAwMDQsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QTBCMiwKKwkJMHgwMzQsIDB4MDAwNDkwQUYsCisJCTB4MDM0LCAweDAwMDQ4MDcwLAorCQkweDAzNCwgMHgwMDA0NzA2RCwKKwkJMHgwMzQsIDB4MDAwNDYwNTAsCisJCTB4MDM0LCAweDAwMDQ1MDRELAorCQkweDAzNCwgMHgwMDA0NDA0QSwKKwkJMHgwMzQsIDB4MDAwNDMwNDcsCisJCTB4MDM0LCAweDAwMDQyMDBBLAorCQkweDAzNCwgMHgwMDA0MTAwNywKKwkJMHgwMzQsIDB4MDAwNDAwMDQsCisJMHhGRjBGMDdEOCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QTBCMiwKKwkJMHgwMzQsIDB4MDAwNDkwQUYsCisJCTB4MDM0LCAweDAwMDQ4MDcwLAorCQkweDAzNCwgMHgwMDA0NzA2RCwKKwkJMHgwMzQsIDB4MDAwNDYwNTAsCisJCTB4MDM0LCAweDAwMDQ1MDRELAorCQkweDAzNCwgMHgwMDA0NDA0QSwKKwkJMHgwMzQsIDB4MDAwNDMwNDcsCisJCTB4MDM0LCAweDAwMDQyMDBBLAorCQkweDAzNCwgMHgwMDA0MTAwNywKKwkJMHgwMzQsIDB4MDAwNDAwMDQsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QTBCMiwKKwkJMHgwMzQsIDB4MDAwNDkwQUYsCisJCTB4MDM0LCAweDAwMDQ4MDcwLAorCQkweDAzNCwgMHgwMDA0NzA2RCwKKwkJMHgwMzQsIDB4MDAwNDYwNTAsCisJCTB4MDM0LCAweDAwMDQ1MDRELAorCQkweDAzNCwgMHgwMDA0NDA0QSwKKwkJMHgwMzQsIDB4MDAwNDMwNDcsCisJCTB4MDM0LCAweDAwMDQyMDBBLAorCQkweDAzNCwgMHgwMDA0MTAwNywKKwkJMHgwMzQsIDB4MDAwNDAwMDQsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNCwgMHgwMDA0QURGNSwKKwkJMHgwMzQsIDB4MDAwNDlERjIsCisJCTB4MDM0LCAweDAwMDQ4REVGLAorCQkweDAzNCwgMHgwMDA0N0RFQywKKwkJMHgwMzQsIDB4MDAwNDZERTksCisJCTB4MDM0LCAweDAwMDQ1REM5LAorCQkweDAzNCwgMHgwMDA0NENFOCwKKwkJMHgwMzQsIDB4MDAwNDM4Q0EsCisJCTB4MDM0LCAweDAwMDQyODg5LAorCQkweDAzNCwgMHgwMDA0MTg0QSwKKwkJMHgwMzQsIDB4MDAwNDA0NEEsCisJMHhGRjBGMDc0MCwgMHhERUFELAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwMzQsIDB4MDAwMkEwQjIsCisJCTB4MDM0LCAweDAwMDI5MEFGLAorCQkweDAzNCwgMHgwMDAyODA3MCwKKwkJMHgwMzQsIDB4MDAwMjcwNkQsCisJCTB4MDM0LCAweDAwMDI2MDUwLAorCQkweDAzNCwgMHgwMDAyNTA0RCwKKwkJMHgwMzQsIDB4MDAwMjQwNEEsCisJCTB4MDM0LCAweDAwMDIzMDQ3LAorCQkweDAzNCwgMHgwMDAyMjAwQSwKKwkJMHgwMzQsIDB4MDAwMjEwMDcsCisJCTB4MDM0LCAweDAwMDIwMDA0LAorCTB4RkYwRjAxQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMkEwQjIsCisJCTB4MDM0LCAweDAwMDI5MEFGLAorCQkweDAzNCwgMHgwMDAyODA3MCwKKwkJMHgwMzQsIDB4MDAwMjcwNkQsCisJCTB4MDM0LCAweDAwMDI2MDUwLAorCQkweDAzNCwgMHgwMDAyNTA0RCwKKwkJMHgwMzQsIDB4MDAwMjQwNEEsCisJCTB4MDM0LCAweDAwMDIzMDQ3LAorCQkweDAzNCwgMHgwMDAyMjAwQSwKKwkJMHgwMzQsIDB4MDAwMjEwMDcsCisJCTB4MDM0LCAweDAwMDIwMDA0LAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMkEwQjIsCisJCTB4MDM0LCAweDAwMDI5MEFGLAorCQkweDAzNCwgMHgwMDAyODA3MCwKKwkJMHgwMzQsIDB4MDAwMjcwNkQsCisJCTB4MDM0LCAweDAwMDI2MDUwLAorCQkweDAzNCwgMHgwMDAyNTA0RCwKKwkJMHgwMzQsIDB4MDAwMjQwNEEsCisJCTB4MDM0LCAweDAwMDIzMDQ3LAorCQkweDAzNCwgMHgwMDAyMjAwQSwKKwkJMHgwMzQsIDB4MDAwMjEwMDcsCisJCTB4MDM0LCAweDAwMDIwMDA0LAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMkEwQjIsCisJCTB4MDM0LCAweDAwMDI5MEFGLAorCQkweDAzNCwgMHgwMDAyODA3MCwKKwkJMHgwMzQsIDB4MDAwMjcwNkQsCisJCTB4MDM0LCAweDAwMDI2MDUwLAorCQkweDAzNCwgMHgwMDAyNTA0RCwKKwkJMHgwMzQsIDB4MDAwMjQwNEEsCisJCTB4MDM0LCAweDAwMDIzMDQ3LAorCQkweDAzNCwgMHgwMDAyMjAwQSwKKwkJMHgwMzQsIDB4MDAwMjEwMDcsCisJCTB4MDM0LCAweDAwMDIwMDA0LAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMkEwQjIsCisJCTB4MDM0LCAweDAwMDI5MEFGLAorCQkweDAzNCwgMHgwMDAyODA3MCwKKwkJMHgwMzQsIDB4MDAwMjcwNkQsCisJCTB4MDM0LCAweDAwMDI2MDUwLAorCQkweDAzNCwgMHgwMDAyNTA0RCwKKwkJMHgwMzQsIDB4MDAwMjQwNEEsCisJCTB4MDM0LCAweDAwMDIzMDQ3LAorCQkweDAzNCwgMHgwMDAyMjAwQSwKKwkJMHgwMzQsIDB4MDAwMjEwMDcsCisJCTB4MDM0LCAweDAwMDIwMDA0LAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzQsIDB4MDAwMkFERjUsCisJCTB4MDM0LCAweDAwMDI5REYyLAorCQkweDAzNCwgMHgwMDAyOERFRiwKKwkJMHgwMzQsIDB4MDAwMjdERUMsCisJCTB4MDM0LCAweDAwMDI2REU5LAorCQkweDAzNCwgMHgwMDAyNURDOSwKKwkJMHgwMzQsIDB4MDAwMjRDRTgsCisJCTB4MDM0LCAweDAwMDIzOENBLAorCQkweDAzNCwgMHgwMDAyMjg4OSwKKwkJMHgwMzQsIDB4MDAwMjE4NEEsCisJCTB4MDM0LCAweDAwMDIwNDRBLAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkweEZGMEYwNzQwLCAweEFCQ0QsCisJCTB4MDM0LCAweDAwMDBBMEIyLAorCQkweDAzNCwgMHgwMDAwOTBBRiwKKwkJMHgwMzQsIDB4MDAwMDgwNzAsCisJCTB4MDM0LCAweDAwMDA3MDZELAorCQkweDAzNCwgMHgwMDAwNjA1MCwKKwkJMHgwMzQsIDB4MDAwMDUwNEQsCisJCTB4MDM0LCAweDAwMDA0MDRBLAorCQkweDAzNCwgMHgwMDAwMzA0NywKKwkJMHgwMzQsIDB4MDAwMDIwMEEsCisJCTB4MDM0LCAweDAwMDAxMDA3LAorCQkweDAzNCwgMHgwMDAwMDAwNCwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDBBMEIyLAorCQkweDAzNCwgMHgwMDAwOTBBRiwKKwkJMHgwMzQsIDB4MDAwMDgwNzAsCisJCTB4MDM0LCAweDAwMDA3MDZELAorCQkweDAzNCwgMHgwMDAwNjA1MCwKKwkJMHgwMzQsIDB4MDAwMDUwNEQsCisJCTB4MDM0LCAweDAwMDA0MDRBLAorCQkweDAzNCwgMHgwMDAwMzA0NywKKwkJMHgwMzQsIDB4MDAwMDIwMEEsCisJCTB4MDM0LCAweDAwMDAxMDA3LAorCQkweDAzNCwgMHgwMDAwMDAwNCwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDBBMEIyLAorCQkweDAzNCwgMHgwMDAwOTBBRiwKKwkJMHgwMzQsIDB4MDAwMDgwNzAsCisJCTB4MDM0LCAweDAwMDA3MDZELAorCQkweDAzNCwgMHgwMDAwNjA1MCwKKwkJMHgwMzQsIDB4MDAwMDUwNEQsCisJCTB4MDM0LCAweDAwMDA0MDRBLAorCQkweDAzNCwgMHgwMDAwMzA0NywKKwkJMHgwMzQsIDB4MDAwMDIwMEEsCisJCTB4MDM0LCAweDAwMDAxMDA3LAorCQkweDAzNCwgMHgwMDAwMDAwNCwKKwkweEZGMEYwN0Q4LCAweENERUYsCisJCTB4MDM0LCAweDAwMDBBMEIyLAorCQkweDAzNCwgMHgwMDAwOTBBRiwKKwkJMHgwMzQsIDB4MDAwMDgwNzAsCisJCTB4MDM0LCAweDAwMDA3MDZELAorCQkweDAzNCwgMHgwMDAwNjA1MCwKKwkJMHgwMzQsIDB4MDAwMDUwNEQsCisJCTB4MDM0LCAweDAwMDA0MDRBLAorCQkweDAzNCwgMHgwMDAwMzA0NywKKwkJMHgwMzQsIDB4MDAwMDIwMEEsCisJCTB4MDM0LCAweDAwMDAxMDA3LAorCQkweDAzNCwgMHgwMDAwMDAwNCwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDBBMEIyLAorCQkweDAzNCwgMHgwMDAwOTBBRiwKKwkJMHgwMzQsIDB4MDAwMDgwNzAsCisJCTB4MDM0LCAweDAwMDA3MDZELAorCQkweDAzNCwgMHgwMDAwNjA1MCwKKwkJMHgwMzQsIDB4MDAwMDUwNEQsCisJCTB4MDM0LCAweDAwMDA0MDRBLAorCQkweDAzNCwgMHgwMDAwMzA0NywKKwkJMHgwMzQsIDB4MDAwMDIwMEEsCisJCTB4MDM0LCAweDAwMDAxMDA3LAorCQkweDAzNCwgMHgwMDAwMDAwNCwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDM0LCAweDAwMDBBRkY3LAorCQkweDAzNCwgMHgwMDAwOURGNywKKwkJMHgwMzQsIDB4MDAwMDhERjQsCisJCTB4MDM0LCAweDAwMDA3REYxLAorCQkweDAzNCwgMHgwMDAwNkRFRSwKKwkJMHgwMzQsIDB4MDAwMDVEQ0QsCisJCTB4MDM0LCAweDAwMDA0Q0VCLAorCQkweDAzNCwgMHgwMDAwMzhDQywKKwkJMHgwMzQsIDB4MDAwMDI4OEIsCisJCTB4MDM0LCAweDAwMDAxODRDLAorCQkweDAzNCwgMHgwMDAwMDQ0QywKKwkweEZGMEYwNzQwLCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDQwLAorCQkweDAzNSwgMHgwMDAwMDFDNSwKKwkJMHgwMzUsIDB4MDAwMDgxQzUsCisJCTB4MDM1LCAweDAwMDEwMUM1LAorCQkweDAzNSwgMHgwMDAyMDE3NCwKKwkJMHgwMzUsIDB4MDAwMjgxNzQsCisJCTB4MDM1LCAweDAwMDMwMTc0LAorCQkweDAzNSwgMHgwMDA0MDE4NSwKKwkJMHgwMzUsIDB4MDAwNDgxODUsCisJCTB4MDM1LCAweDAwMDUwMTg1LAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxQzUsCisJCTB4MDM1LCAweDAwMDA4MUM1LAorCQkweDAzNSwgMHgwMDAxMDFDNSwKKwkJMHgwMzUsIDB4MDAwMjAxNzQsCisJCTB4MDM1LCAweDAwMDI4MTc0LAorCQkweDAzNSwgMHgwMDAzMDE3NCwKKwkJMHgwMzUsIDB4MDAwNDAxODUsCisJCTB4MDM1LCAweDAwMDQ4MTg1LAorCQkweDAzNSwgMHgwMDA1MDE4NSwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwRUYsIDB4MDAwMDAwNDAsCisJCTB4MDM1LCAweDAwMDAwMUM1LAorCQkweDAzNSwgMHgwMDAwODFDNSwKKwkJMHgwMzUsIDB4MDAwMTAxQzUsCisJCTB4MDM1LCAweDAwMDIwMTc0LAorCQkweDAzNSwgMHgwMDAyODE3NCwKKwkJMHgwMzUsIDB4MDAwMzAxNzQsCisJCTB4MDM1LCAweDAwMDQwMTg1LAorCQkweDAzNSwgMHgwMDA0ODE4NSwKKwkJMHgwMzUsIDB4MDAwNTAxODUsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDQwLAorCQkweDAzNSwgMHgwMDAwMDFDNSwKKwkJMHgwMzUsIDB4MDAwMDgxQzUsCisJCTB4MDM1LCAweDAwMDEwMUM1LAorCQkweDAzNSwgMHgwMDAyMDE3NCwKKwkJMHgwMzUsIDB4MDAwMjgxNzQsCisJCTB4MDM1LCAweDAwMDMwMTc0LAorCQkweDAzNSwgMHgwMDA0MDE4NSwKKwkJMHgwMzUsIDB4MDAwNDgxODUsCisJCTB4MDM1LCAweDAwMDUwMTg1LAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDA0MCwKKwkJMHgwMzUsIDB4MDAwMDAxQzUsCisJCTB4MDM1LCAweDAwMDA4MUM1LAorCQkweDAzNSwgMHgwMDAxMDFDNSwKKwkJMHgwMzUsIDB4MDAwMjAxNzQsCisJCTB4MDM1LCAweDAwMDI4MTc0LAorCQkweDAzNSwgMHgwMDAzMDE3NCwKKwkJMHgwMzUsIDB4MDAwNDAxODUsCisJCTB4MDM1LCAweDAwMDQ4MTg1LAorCQkweDAzNSwgMHgwMDA1MDE4NSwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwRUYsIDB4MDAwMDAwNDAsCisJCTB4MDM1LCAweDAwMDAwMTg2LAorCQkweDAzNSwgMHgwMDAwODE4NiwKKwkJMHgwMzUsIDB4MDAwMTAxODUsCisJCTB4MDM1LCAweDAwMDIwMUQ1LAorCQkweDAzNSwgMHgwMDAyODFENSwKKwkJMHgwMzUsIDB4MDAwMzAxRDUsCisJCTB4MDM1LCAweDAwMDQwMUQ1LAorCQkweDAzNSwgMHgwMDA0ODFENSwKKwkJMHgwMzUsIDB4MDAwNTAxRDUsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkweEZGMEYwNzQwLCAweEFCQ0QsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwMDVCOEIsCisJCTB4MDM2LCAweDAwMDBEQjhCLAorCQkweDAzNiwgMHgwMDAxNUI4QiwKKwkJMHgwMzYsIDB4MDAwMURCOEIsCisJCTB4MDM2LCAweDAwMDI2MkRCLAorCQkweDAzNiwgMHgwMDAyRTJEQiwKKwkJMHgwMzYsIDB4MDAwMzYyREIsCisJCTB4MDM2LCAweDAwMDNFMkRCLAorCQkweDAzNiwgMHgwMDA0NTUzQiwKKwkJMHgwMzYsIDB4MDAwNEQ1M0IsCisJCTB4MDM2LCAweDAwMDU1NTNCLAorCQkweDAzNiwgMHgwMDA1RDUzQiwKKwkweEZGMEYwMUMwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwMDVCOEIsCisJCTB4MDM2LCAweDAwMDBEQjhCLAorCQkweDAzNiwgMHgwMDAxNUI4QiwKKwkJMHgwMzYsIDB4MDAwMURCOEIsCisJCTB4MDM2LCAweDAwMDI2MkRCLAorCQkweDAzNiwgMHgwMDAyRTJEQiwKKwkJMHgwMzYsIDB4MDAwMzYyREIsCisJCTB4MDM2LCAweDAwMDNFMkRCLAorCQkweDAzNiwgMHgwMDA0NTUzQiwKKwkJMHgwMzYsIDB4MDAwNEQ1M0IsCisJCTB4MDM2LCAweDAwMDU1NTNCLAorCQkweDAzNiwgMHgwMDA1RDUzQiwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwMDVCOEIsCisJCTB4MDM2LCAweDAwMDBEQjhCLAorCQkweDAzNiwgMHgwMDAxNUI4QiwKKwkJMHgwMzYsIDB4MDAwMURCOEIsCisJCTB4MDM2LCAweDAwMDI2MkRCLAorCQkweDAzNiwgMHgwMDAyRTJEQiwKKwkJMHgwMzYsIDB4MDAwMzYyREIsCisJCTB4MDM2LCAweDAwMDNFMkRCLAorCQkweDAzNiwgMHgwMDA0NTUzQiwKKwkJMHgwMzYsIDB4MDAwNEQ1M0IsCisJCTB4MDM2LCAweDAwMDU1NTNCLAorCQkweDAzNiwgMHgwMDA1RDUzQiwKKwkweEZGMEYwN0Q4LCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwMDVCOEIsCisJCTB4MDM2LCAweDAwMDBEQjhCLAorCQkweDAzNiwgMHgwMDAxNUI4QiwKKwkJMHgwMzYsIDB4MDAwMURCOEIsCisJCTB4MDM2LCAweDAwMDI2MkRCLAorCQkweDAzNiwgMHgwMDAyRTJEQiwKKwkJMHgwMzYsIDB4MDAwMzYyREIsCisJCTB4MDM2LCAweDAwMDNFMkRCLAorCQkweDAzNiwgMHgwMDA0NTUzQiwKKwkJMHgwMzYsIDB4MDAwNEQ1M0IsCisJCTB4MDM2LCAweDAwMDU1NTNCLAorCQkweDAzNiwgMHgwMDA1RDUzQiwKKwkweEZGMEYwN0QwLCAweENERUYsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwMDVCOEIsCisJCTB4MDM2LCAweDAwMDBEQjhCLAorCQkweDAzNiwgMHgwMDAxNUI4QiwKKwkJMHgwMzYsIDB4MDAwMURCOEIsCisJCTB4MDM2LCAweDAwMDI2MkRCLAorCQkweDAzNiwgMHgwMDAyRTJEQiwKKwkJMHgwMzYsIDB4MDAwMzYyREIsCisJCTB4MDM2LCAweDAwMDNFMkRCLAorCQkweDAzNiwgMHgwMDA0NTUzQiwKKwkJMHgwMzYsIDB4MDAwNEQ1M0IsCisJCTB4MDM2LCAweDAwMDU1NTNCLAorCQkweDAzNiwgMHgwMDA1RDUzQiwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDBFRiwgMHgwMDAwMDAxMCwKKwkJMHgwMzYsIDB4MDAwODRFQjQsCisJCTB4MDM2LCAweDAwMDhDOUI0LAorCQkweDAzNiwgMHgwMDA5NDlCNCwKKwkJMHgwMzYsIDB4MDAwOUM5QjQsCisJCTB4MDM2LCAweDAwMEE0OTM1LAorCQkweDAzNiwgMHgwMDBBQzkzNSwKKwkJMHgwMzYsIDB4MDAwQjQ5MzUsCisJCTB4MDM2LCAweDAwMEJDOTM1LAorCQkweDAzNiwgMHgwMDBDNEVCNCwKKwkJMHgwMzYsIDB4MDAwQ0NFQjQsCisJCTB4MDM2LCAweDAwMEQ0RUI0LAorCQkweDAzNiwgMHgwMDBEQ0VCNCwKKwkweEZGMEYwNzQwLCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDBFRiwgMHgwMDAwMDAwOCwKKwkweEZGMEYwNzQwLCAweEFCQ0QsCisJCTB4MDNDLCAweDAwMDAwMkRDLAorCQkweDAzQywgMHgwMDAwMDUyNCwKKwkJMHgwM0MsIDB4MDAwMDA5MDIsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDAzQywgMHgwMDAwMDJEQywKKwkJMHgwM0MsIDB4MDAwMDA1MjQsCisJCTB4MDNDLCAweDAwMDAwOTAyLAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwM0MsIDB4MDAwMDAyREMsCisJCTB4MDNDLCAweDAwMDAwNTI0LAorCQkweDAzQywgMHgwMDAwMDkwMiwKKwkweEZGMEYwN0Q4LCAweENERUYsCisJCTB4MDNDLCAweDAwMDAwMkRDLAorCQkweDAzQywgMHgwMDAwMDUyNCwKKwkJMHgwM0MsIDB4MDAwMDA5MDIsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDAzQywgMHgwMDAwMDJEQywKKwkJMHgwM0MsIDB4MDAwMDA1MjQsCisJCTB4MDNDLCAweDAwMDAwOTAyLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwM0MsIDB4MDAwMDAyQUEsCisJCTB4MDNDLCAweDAwMDAwNUEyLAorCQkweDAzQywgMHgwMDAwMDg4MCwKKwkweEZGMEYwNzQwLCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwRUYsIDB4MDAwMDAwMDIsCisJCTB4MERGLCAweDAwMDAwMDgwLAorCTB4RkYwRjA3NDAsIDB4QUJDRCwKKwkJMHgwNjEsIDB4MDAwRUFDNDMsCisJCTB4MDYyLCAweDAwMDM4RjQ3LAorCQkweDA2MywgMHgwMDAzMTE1NywKKwkJMHgwNjQsIDB4MDAwMUM0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjAxQzAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRUFDNDMsCisJCTB4MDYyLCAweDAwMDM4RjQ3LAorCQkweDA2MywgMHgwMDAzMTE1NywKKwkJMHgwNjQsIDB4MDAwMUM0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRUFDNDMsCisJCTB4MDYyLCAweDAwMDM4RjQ3LAorCQkweDA2MywgMHgwMDAzMTE1NywKKwkJMHgwNjQsIDB4MDAwMUM0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRUFDNDMsCisJCTB4MDYyLCAweDAwMDM4RjQ3LAorCQkweDA2MywgMHgwMDAzMTE1NywKKwkJMHgwNjQsIDB4MDAwMUM0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4RkYwRjA3RDAsIDB4Q0RFRiwKKwkJMHgwNjEsIDB4MDAwRUFDNDMsCisJCTB4MDYyLCAweDAwMDM4RjQ3LAorCQkweDA2MywgMHgwMDAzMTE1NywKKwkJMHgwNjQsIDB4MDAwMUM0QUMsCisJCTB4MDY1LCAweDAwMDkzMUQxLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwNjEsIDB4MDAwRTVENTMsCisJCTB4MDYyLCAweDAwMDM4RkNELAorCQkweDA2MywgMHgwMDAzMTRFQiwKKwkJMHgwNjQsIDB4MDAwMTk2QUMsCisJCTB4MDY1LCAweDAwMDkzMUQ3LAorCTB4RkYwRjA3NDAsIDB4REVBRCwKKwkJMHgwMDgsIDB4MDAwMDg0MDAsCit9OworCit1MzIgUlRMODgyMUFFX1JBRElPQV9BUlJBWVtdID0geworCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwNTYsIDB4MDAwNTFDRjIsCisJCTB4MDY2LCAweDAwMDQwMDAwLAorCQkweDAwMCwgMHgwMDAxMDAwMCwKKwkJMHgwMUUsIDB4MDAwODAwMDAsCisJCTB4MDgyLCAweDAwMDAwODMwLAorCQkweDA4MywgMHgwMDAyMTgwMCwKKwkJMHgwODQsIDB4MDAwMjgwMDAsCisJCTB4MDg1LCAweDAwMDQ4MDAwLAorCQkweDA4NiwgMHgwMDA5NDgzOCwKKwkJMHgwODcsIDB4MDAwNDQ5ODAsCisJCTB4MDg4LCAweDAwMDQ4MDAwLAorCQkweDA4OSwgMHgwMDAwRDQ4MCwKKwkJMHgwOEEsIDB4MDAwNDIyNDAsCisJCTB4MDhCLCAweDAwMEYwMzgwLAorCQkweDA4QywgMHgwMDA5MDAwMCwKKwkJMHgwOEQsIDB4MDAwMjI4NTIsCisJCTB4MDhFLCAweDAwMDY1NTQwLAorCQkweDA4RiwgMHgwMDA4ODAwMSwKKwkJMHgwRUYsIDB4MDAwMjAwMDAsCisJCTB4MDNFLCAweDAwMDAwMzgwLAorCQkweDAzRiwgMHgwMDA5MDAxOCwKKwkJMHgwM0UsIDB4MDAwMjAzODAsCisJCTB4MDNGLCAweDAwMEEwMDE4LAorCQkweDAzRSwgMHgwMDA0MDMwOCwKKwkJMHgwM0YsIDB4MDAwQTAwMTgsCisJCTB4MDNFLCAweDAwMDYwMDE4LAorCQkweDAzRiwgMHgwMDBBMDAxOCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorCQkweDA4OSwgMHgwMDAwMDA4MCwKKwkJMHgwOEIsIDB4MDAwODAxODAsCisJCTB4MEVGLCAweDAwMDAxMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwMzgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwMzAxMTMsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwMjgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBDQywKKwkJMHgwM0IsIDB4MDAwMjcwMjcsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwMUY5MTMsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDEwQywKKwkJMHgwM0IsIDB4MDAwMTdGMTAsCisJCTB4MDNDLCAweDAwMDEyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBEMCwKKwkJMHgwM0IsIDB4MDAwMDgwMjcsCisJCTB4MDNDLCAweDAwMENBMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwNzgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwNzAxMTMsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwNjgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBDQywKKwkJMHgwM0IsIDB4MDAwNjcwMjcsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwNUY5MTMsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDEwQywKKwkJMHgwM0IsIDB4MDAwNTdGMTAsCisJCTB4MDNDLCAweDAwMDEyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBEMCwKKwkJMHgwM0IsIDB4MDAwNDgwMjcsCisJCTB4MDNDLCAweDAwMENBMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwQjgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDI0NCwKKwkJMHgwM0IsIDB4MDAwQjAxMTMsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwQTgwMjcsCisJCTB4MDNDLCAweDAwMDgyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBDQywKKwkJMHgwM0IsIDB4MDAwQTcwMjcsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDE0QywKKwkJMHgwM0IsIDB4MDAwOUY5MTMsCisJCTB4MDNDLCAweDAwMDQyMDAwLAorCQkweDAzQSwgMHgwMDAwMDEwQywKKwkJMHgwM0IsIDB4MDAwOTdGMTAsCisJCTB4MDNDLCAweDAwMDEyMDAwLAorCQkweDAzQSwgMHgwMDAwMDBEMCwKKwkJMHgwM0IsIDB4MDAwODgwMjcsCisJCTB4MDNDLCAweDAwMENBMDAwLAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkJMHgwRUYsIDB4MDAwMDExMDAsCisJMHhGRjBGMDEwNCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDA0QURGMywKKwkJMHgwMzQsIDB4MDAwNDlERjAsCisJMHhGRjBGMDIwNCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QURGMywKKwkJMHgwMzQsIDB4MDAwNDlERjAsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QURGMywKKwkJMHgwMzQsIDB4MDAwNDlERjAsCisJMHhGRjBGMDIwMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QURGNSwKKwkJMHgwMzQsIDB4MDAwNDlERjIsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0QTBGMywKKwkJMHgwMzQsIDB4MDAwNDkwQjEsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNCwgMHgwMDA0QURGNywKKwkJMHgwMzQsIDB4MDAwNDlERjMsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwMzQsIDB4MDAwNDhERUQsCisJCTB4MDM0LCAweDAwMDQ3REVBLAorCQkweDAzNCwgMHgwMDA0NkRFNywKKwkJMHgwMzQsIDB4MDAwNDVDRTksCisJCTB4MDM0LCAweDAwMDQ0Q0U2LAorCQkweDAzNCwgMHgwMDA0MzhDNiwKKwkJMHgwMzQsIDB4MDAwNDI4ODYsCisJCTB4MDM0LCAweDAwMDQxNDg2LAorCQkweDAzNCwgMHgwMDA0MDQ0NywKKwkweEZGMEYwMjA0LCAweENERUYsCisJCTB4MDM0LCAweDAwMDQ4REVELAorCQkweDAzNCwgMHgwMDA0N0RFQSwKKwkJMHgwMzQsIDB4MDAwNDZERTcsCisJCTB4MDM0LCAweDAwMDQ1Q0U5LAorCQkweDAzNCwgMHgwMDA0NENFNiwKKwkJMHgwMzQsIDB4MDAwNDM4QzYsCisJCTB4MDM0LCAweDAwMDQyODg2LAorCQkweDAzNCwgMHgwMDA0MTQ4NiwKKwkJMHgwMzQsIDB4MDAwNDA0NDcsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDA0OERFRCwKKwkJMHgwMzQsIDB4MDAwNDdERUEsCisJCTB4MDM0LCAweDAwMDQ2REU3LAorCQkweDAzNCwgMHgwMDA0NUNFOSwKKwkJMHgwMzQsIDB4MDAwNDRDRTYsCisJCTB4MDM0LCAweDAwMDQzOEM2LAorCQkweDAzNCwgMHgwMDA0Mjg4NiwKKwkJMHgwMzQsIDB4MDAwNDE0ODYsCisJCTB4MDM0LCAweDAwMDQwNDQ3LAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwNDgwQUUsCisJCTB4MDM0LCAweDAwMDQ3MEFCLAorCQkweDAzNCwgMHgwMDA0NjA4QiwKKwkJMHgwMzQsIDB4MDAwNDUwNjksCisJCTB4MDM0LCAweDAwMDQ0MDQ4LAorCQkweDAzNCwgMHgwMDA0MzA0NSwKKwkJMHgwMzQsIDB4MDAwNDIwMjYsCisJCTB4MDM0LCAweDAwMDQxMDIzLAorCQkweDAzNCwgMHgwMDA0MDAwMiwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDM0LCAweDAwMDQ4REVGLAorCQkweDAzNCwgMHgwMDA0N0RFQywKKwkJMHgwMzQsIDB4MDAwNDZERTksCisJCTB4MDM0LCAweDAwMDQ1Q0NCLAorCQkweDAzNCwgMHgwMDA0NDg4RCwKKwkJMHgwMzQsIDB4MDAwNDM0OEQsCisJCTB4MDM0LCAweDAwMDQyNDhBLAorCQkweDAzNCwgMHgwMDA0MTA4RCwKKwkJMHgwMzQsIDB4MDAwNDAwOEEsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCTB4RkYwRjAyMDAsIDB4QUJDRCwKKwkJMHgwMzQsIDB4MDAwMkFERjQsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAyQTBGMywKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDM0LCAweDAwMDJBREY3LAorCTB4RkYwRjAyMDAsIDB4REVBRCwKKwkweEZGMEYwMTA0LCAweEFCQ0QsCisJCTB4MDM0LCAweDAwMDI5REY0LAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMjlERjQsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAyOURGNCwKKwkweEZGMEYwMjAwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDI5REYxLAorCTB4RkYwRjAyQzAsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMjkwRjAsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNCwgMHgwMDAyOURGMiwKKwkweEZGMEYwMTA0LCAweERFQUQsCisJMHhGRjBGMDEwNCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDAyOERGMSwKKwkJMHgwMzQsIDB4MDAwMjdERUUsCisJCTB4MDM0LCAweDAwMDI2REVCLAorCQkweDAzNCwgMHgwMDAyNUNFQywKKwkJMHgwMzQsIDB4MDAwMjRDRTksCisJCTB4MDM0LCAweDAwMDIzOENBLAorCQkweDAzNCwgMHgwMDAyMjg4OSwKKwkJMHgwMzQsIDB4MDAwMjE0ODksCisJCTB4MDM0LCAweDAwMDIwNDRBLAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMjhERjEsCisJCTB4MDM0LCAweDAwMDI3REVFLAorCQkweDAzNCwgMHgwMDAyNkRFQiwKKwkJMHgwMzQsIDB4MDAwMjVDRUMsCisJCTB4MDM0LCAweDAwMDI0Q0U5LAorCQkweDAzNCwgMHgwMDAyMzhDQSwKKwkJMHgwMzQsIDB4MDAwMjI4ODksCisJCTB4MDM0LCAweDAwMDIxNDg5LAorCQkweDAzNCwgMHgwMDAyMDQ0QSwKKwkweEZGMEYwNDA0LCAweENERUYsCisJCTB4MDM0LCAweDAwMDI4REYxLAorCQkweDAzNCwgMHgwMDAyN0RFRSwKKwkJMHgwMzQsIDB4MDAwMjZERUIsCisJCTB4MDM0LCAweDAwMDI1Q0VDLAorCQkweDAzNCwgMHgwMDAyNENFOSwKKwkJMHgwMzQsIDB4MDAwMjM4Q0EsCisJCTB4MDM0LCAweDAwMDIyODg5LAorCQkweDAzNCwgMHgwMDAyMTQ4OSwKKwkJMHgwMzQsIDB4MDAwMjA0NEEsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAyODBBRiwKKwkJMHgwMzQsIDB4MDAwMjcwQUMsCisJCTB4MDM0LCAweDAwMDI2MDhCLAorCQkweDAzNCwgMHgwMDAyNTA2OSwKKwkJMHgwMzQsIDB4MDAwMjQwNDgsCisJCTB4MDM0LCAweDAwMDIzMDQ1LAorCQkweDAzNCwgMHgwMDAyMjAyNiwKKwkJMHgwMzQsIDB4MDAwMjEwMjMsCisJCTB4MDM0LCAweDAwMDIwMDAyLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzQsIDB4MDAwMjhERUUsCisJCTB4MDM0LCAweDAwMDI3REVCLAorCQkweDAzNCwgMHgwMDAyNkNDRCwKKwkJMHgwMzQsIDB4MDAwMjVDQ0EsCisJCTB4MDM0LCAweDAwMDI0ODhDLAorCQkweDAzNCwgMHgwMDAyMzg0QywKKwkJMHgwMzQsIDB4MDAwMjI4NDksCisJCTB4MDM0LCAweDAwMDIxNDQ5LAorCQkweDAzNCwgMHgwMDAyMDA0RCwKKwkweEZGMEYwMTA0LCAweERFQUQsCisJMHhGRjBGMDJDMCwgMHhBQkNELAorCQkweDAzNCwgMHgwMDAwQTBENywKKwkJMHgwMzQsIDB4MDAwMDkwRDMsCisJCTB4MDM0LCAweDAwMDA4MEIxLAorCQkweDAzNCwgMHgwMDAwNzBBRSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDM0LCAweDAwMDBBREY3LAorCQkweDAzNCwgMHgwMDAwOURGNCwKKwkJMHgwMzQsIDB4MDAwMDhERjEsCisJCTB4MDM0LCAweDAwMDA3REVFLAorCTB4RkYwRjAyQzAsIDB4REVBRCwKKwkweEZGMEYwMTA0LCAweEFCQ0QsCisJCTB4MDM0LCAweDAwMDA2REVCLAorCQkweDAzNCwgMHgwMDAwNUNFQywKKwkJMHgwMzQsIDB4MDAwMDRDRTksCisJCTB4MDM0LCAweDAwMDAzOENBLAorCQkweDAzNCwgMHgwMDAwMjg4OSwKKwkJMHgwMzQsIDB4MDAwMDE0ODksCisJCTB4MDM0LCAweDAwMDAwNDRBLAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwMzQsIDB4MDAwMDZERUIsCisJCTB4MDM0LCAweDAwMDA1Q0VDLAorCQkweDAzNCwgMHgwMDAwNENFOSwKKwkJMHgwMzQsIDB4MDAwMDM4Q0EsCisJCTB4MDM0LCAweDAwMDAyODg5LAorCQkweDAzNCwgMHgwMDAwMTQ4OSwKKwkJMHgwMzQsIDB4MDAwMDA0NEEsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzNCwgMHgwMDAwNkRFQiwKKwkJMHgwMzQsIDB4MDAwMDVDRUMsCisJCTB4MDM0LCAweDAwMDA0Q0U5LAorCQkweDAzNCwgMHgwMDAwMzhDQSwKKwkJMHgwMzQsIDB4MDAwMDI4ODksCisJCTB4MDM0LCAweDAwMDAxNDg5LAorCQkweDAzNCwgMHgwMDAwMDQ0QSwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDM0LCAweDAwMDA2MDhELAorCQkweDAzNCwgMHgwMDAwNTA2QiwKKwkJMHgwMzQsIDB4MDAwMDQwNEEsCisJCTB4MDM0LCAweDAwMDAzMDQ3LAorCQkweDAzNCwgMHgwMDAwMjA0NCwKKwkJMHgwMzQsIDB4MDAwMDEwMjUsCisJCTB4MDM0LCAweDAwMDAwMDA0LAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzQsIDB4MDAwMDZEQ0QsCisJCTB4MDM0LCAweDAwMDA1Q0NELAorCQkweDAzNCwgMHgwMDAwNENDQSwKKwkJMHgwMzQsIDB4MDAwMDM4OEMsCisJCTB4MDM0LCAweDAwMDAyODg4LAorCQkweDAzNCwgMHgwMDAwMTQ4OCwKKwkJMHgwMzQsIDB4MDAwMDA0ODYsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDQwLAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwMzUsIDB4MDAwMDAxODcsCisJCTB4MDM1LCAweDAwMDA4MTg3LAorCQkweDAzNSwgMHgwMDAxMDE4NywKKwkJMHgwMzUsIDB4MDAwMjAxODgsCisJCTB4MDM1LCAweDAwMDI4MTg4LAorCQkweDAzNSwgMHgwMDAzMDE4OCwKKwkJMHgwMzUsIDB4MDAwNDAxODgsCisJCTB4MDM1LCAweDAwMDQ4MTg4LAorCQkweDAzNSwgMHgwMDA1MDE4OCwKKwkweEZGMEYwMjA0LCAweENERUYsCisJCTB4MDM1LCAweDAwMDAwMTg3LAorCQkweDAzNSwgMHgwMDAwODE4NywKKwkJMHgwMzUsIDB4MDAwMTAxODcsCisJCTB4MDM1LCAweDAwMDIwMTg4LAorCQkweDAzNSwgMHgwMDAyODE4OCwKKwkJMHgwMzUsIDB4MDAwMzAxODgsCisJCTB4MDM1LCAweDAwMDQwMTg4LAorCQkweDAzNSwgMHgwMDA0ODE4OCwKKwkJMHgwMzUsIDB4MDAwNTAxODgsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzNSwgMHgwMDAwMDE4NywKKwkJMHgwMzUsIDB4MDAwMDgxODcsCisJCTB4MDM1LCAweDAwMDEwMTg3LAorCQkweDAzNSwgMHgwMDAyMDE4OCwKKwkJMHgwMzUsIDB4MDAwMjgxODgsCisJCTB4MDM1LCAweDAwMDMwMTg4LAorCQkweDAzNSwgMHgwMDA0MDE4OCwKKwkJMHgwMzUsIDB4MDAwNDgxODgsCisJCTB4MDM1LCAweDAwMDUwMTg4LAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMzUsIDB4MDAwMDAxNDUsCisJCTB4MDM1LCAweDAwMDA4MTQ1LAorCQkweDAzNSwgMHgwMDAxMDE0NSwKKwkJMHgwMzUsIDB4MDAwMjAxOTYsCisJCTB4MDM1LCAweDAwMDI4MTk2LAorCQkweDAzNSwgMHgwMDAzMDE5NiwKKwkJMHgwMzUsIDB4MDAwNDAxQzcsCisJCTB4MDM1LCAweDAwMDQ4MUM3LAorCQkweDAzNSwgMHgwMDA1MDFDNywKKwkweEZGMEYwMTA0LCAweERFQUQsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDAxOCwgMHgwMDAxNzEyQSwKKwkJMHgwRUYsIDB4MDAwMDAwMTAsCisJMHhGRjBGMDEwNCwgMHhBQkNELAorCQkweDAzNiwgMHgwMDA4NTczMywKKwkJMHgwMzYsIDB4MDAwOEQ3MzMsCisJCTB4MDM2LCAweDAwMDk1NzMzLAorCQkweDAzNiwgMHgwMDA5RDczMywKKwkJMHgwMzYsIDB4MDAwQTY0QjQsCisJCTB4MDM2LCAweDAwMEFFNEI0LAorCQkweDAzNiwgMHgwMDBCNjRCNCwKKwkJMHgwMzYsIDB4MDAwQkU0QjQsCisJCTB4MDM2LCAweDAwMEM2NEI0LAorCQkweDAzNiwgMHgwMDBDRTRCNCwKKwkJMHgwMzYsIDB4MDAwRDY0QjQsCisJCTB4MDM2LCAweDAwMERFNEI0LAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwMzYsIDB4MDAwODU3MzMsCisJCTB4MDM2LCAweDAwMDhENzMzLAorCQkweDAzNiwgMHgwMDA5NTczMywKKwkJMHgwMzYsIDB4MDAwOUQ3MzMsCisJCTB4MDM2LCAweDAwMEE2NEI0LAorCQkweDAzNiwgMHgwMDBBRTRCNCwKKwkJMHgwMzYsIDB4MDAwQjY0QjQsCisJCTB4MDM2LCAweDAwMEJFNEI0LAorCQkweDAzNiwgMHgwMDBDNjRCNCwKKwkJMHgwMzYsIDB4MDAwQ0U0QjQsCisJCTB4MDM2LCAweDAwMEQ2NEI0LAorCQkweDAzNiwgMHgwMDBERTRCNCwKKwkweEZGMEYwNDA0LCAweENERUYsCisJCTB4MDM2LCAweDAwMDg1NzMzLAorCQkweDAzNiwgMHgwMDA4RDczMywKKwkJMHgwMzYsIDB4MDAwOTU3MzMsCisJCTB4MDM2LCAweDAwMDlENzMzLAorCQkweDAzNiwgMHgwMDBBNjRCNCwKKwkJMHgwMzYsIDB4MDAwQUU0QjQsCisJCTB4MDM2LCAweDAwMEI2NEI0LAorCQkweDAzNiwgMHgwMDBCRTRCNCwKKwkJMHgwMzYsIDB4MDAwQzY0QjQsCisJCTB4MDM2LCAweDAwMENFNEI0LAorCQkweDAzNiwgMHgwMDBENjRCNCwKKwkJMHgwMzYsIDB4MDAwREU0QjQsCisJMHhDRENEQ0RDRCwgMHhDRENELAorCQkweDAzNiwgMHgwMDAwNTZCMywKKwkJMHgwMzYsIDB4MDAwMEQ2QjMsCisJCTB4MDM2LCAweDAwMDE1NkIzLAorCQkweDAzNiwgMHgwMDAxRDZCMywKKwkJMHgwMzYsIDB4MDAwMjY2MzQsCisJCTB4MDM2LCAweDAwMDJFNjM0LAorCQkweDAzNiwgMHgwMDAzNjYzNCwKKwkJMHgwMzYsIDB4MDAwM0U2MzQsCisJCTB4MDM2LCAweDAwMDQ2N0I0LAorCQkweDAzNiwgMHgwMDA0RTdCNCwKKwkJMHgwMzYsIDB4MDAwNTY3QjQsCisJCTB4MDM2LCAweDAwMDVFN0I0LAorCTB4RkYwRjAxMDQsIDB4REVBRCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MEVGLCAweDAwMDAwMDA4LAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwM0MsIDB4MDAwMDAxQzgsCisJCTB4MDNDLCAweDAwMDAwNDkyLAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwM0MsIDB4MDAwMDAxQzgsCisJCTB4MDNDLCAweDAwMDAwNDkyLAorCTB4RkYwRjA0MDQsIDB4Q0RFRiwKKwkJMHgwM0MsIDB4MDAwMDAxQzgsCisJCTB4MDNDLCAweDAwMDAwNDkyLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwM0MsIDB4MDAwMDAyMkEsCisJCTB4MDNDLCAweDAwMDAwNTk0LAorCTB4RkYwRjAxMDQsIDB4REVBRCwKKwkweEZGMEYwMTA0LCAweEFCQ0QsCisJCTB4MDNDLCAweDAwMDAwODAwLAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwM0MsIDB4MDAwMDA4MDAsCisJMHhGRjBGMDQwNCwgMHhDREVGLAorCQkweDAzQywgMHgwMDAwMDgwMCwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDNDLCAweDAwMDAwODIwLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwM0MsIDB4MDAwMDA5MDAsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkJMHgwMTgsIDB4MDAwMTcxMkEsCisJCTB4MEVGLCAweDAwMDAwMDAyLAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwMDgsIDB4MDAwNEU0MDAsCisJMHhGRjBGMDIwNCwgMHhDREVGLAorCQkweDAwOCwgMHgwMDA0RTQwMCwKKwkweEZGMEYwNDA0LCAweENERUYsCisJCTB4MDA4LCAweDAwMDRFNDAwLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwMDgsIDB4MDAwMDIwMDAsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCQkweDBFRiwgMHgwMDAwMDAwMCwKKwkJMHgwREYsIDB4MDAwMDAwQzAsCisJCTB4MDFGLCAweDAwMDQwMDY0LAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwNTgsIDB4MDAwQTcyODQsCisJCTB4MDU5LCAweDAwMDYwMEVDLAorCTB4RkYwRjAyMDQsIDB4Q0RFRiwKKwkJMHgwNTgsIDB4MDAwQTcyODQsCisJCTB4MDU5LCAweDAwMDYwMEVDLAorCTB4RkYwRjA0MDQsIDB4Q0RFRiwKKwkJMHgwNTgsIDB4MDAwQTcyODQsCisJCTB4MDU5LCAweDAwMDYwMEVDLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwNTgsIDB4MDAwODExODQsCisJCTB4MDU5LCAweDAwMDYwMTZDLAorCTB4RkYwRjAxMDQsIDB4REVBRCwKKwkweEZGMEYwMTA0LCAweEFCQ0QsCisJCTB4MDYxLCAweDAwMEU4RDczLAorCQkweDA2MiwgMHgwMDA5M0ZDNSwKKwkweEZGMEYwMjA0LCAweENERUYsCisJCTB4MDYxLCAweDAwMEU4RDczLAorCQkweDA2MiwgMHgwMDA5M0ZDNSwKKwkweEZGMEYwNDA0LCAweENERUYsCisJCTB4MDYxLCAweDAwMEU4RDczLAorCQkweDA2MiwgMHgwMDA5M0ZDNSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDYxLCAweDAwMEVBRDUzLAorCQkweDA2MiwgMHgwMDA5M0JDNCwKKwkweEZGMEYwMTA0LCAweERFQUQsCisJMHhGRjBGMDEwNCwgMHhBQkNELAorCQkweDA2MywgMHgwMDAxMTBFOSwKKwkweEZGMEYwMjA0LCAweENERUYsCisJCTB4MDYzLCAweDAwMDExMEU5LAorCTB4RkYwRjA0MDQsIDB4Q0RFRiwKKwkJMHgwNjMsIDB4MDAwMTEwRTksCisJMHhGRjBGMDIwMCwgMHhDREVGLAorCQkweDA2MywgMHgwMDA3MTBFOSwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4MDYzLCAweDAwMDExMEU5LAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwNjMsIDB4MDAwNzE0RTksCisJMHhGRjBGMDEwNCwgMHhERUFELAorCTB4RkYwRjAxMDQsIDB4QUJDRCwKKwkJMHgwNjQsIDB4MDAwMUMyN0MsCisJMHhGRjBGMDIwNCwgMHhDREVGLAorCQkweDA2NCwgMHgwMDAxQzI3QywKKwkweEZGMEYwNDA0LCAweENERUYsCisJCTB4MDY0LCAweDAwMDFDMjdDLAorCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKKwkJMHgwNjQsIDB4MDAwMUM2N0MsCisJMHhGRjBGMDEwNCwgMHhERUFELAorCTB4RkYwRjAyMDAsIDB4QUJDRCwKKwkJMHgwNjUsIDB4MDAwOTMwMTYsCisJMHhGRjBGMDJDMCwgMHhDREVGLAorCQkweDA2NSwgMHgwMDA5MzAxNSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDY1LCAweDAwMDkxMDE2LAorCTB4RkYwRjAyMDAsIDB4REVBRCwKKwkJMHgwMTgsIDB4MDAwMDAwMDYsCisJCTB4MEVGLCAweDAwMDAyMDAwLAorCQkweDAzQiwgMHgwMDAzODI0QiwKKwkJMHgwM0IsIDB4MDAwMzAyNEIsCisJCTB4MDNCLCAweDAwMDI4NDRCLAorCQkweDAzQiwgMHgwMDAyMEY0QiwKKwkJMHgwM0IsIDB4MDAwMThGNEIsCisJCTB4MDNCLCAweDAwMDEwNEIyLAorCQkweDAzQiwgMHgwMDAwODA0OSwKKwkJMHgwM0IsIDB4MDAwMDAxNDgsCisJCTB4MDNCLCAweDAwMDc4MjRCLAorCQkweDAzQiwgMHgwMDA3MDI0QiwKKwkJMHgwM0IsIDB4MDAwNjgyNEIsCisJCTB4MDNCLCAweDAwMDYwRjRCLAorCQkweDAzQiwgMHgwMDA1OEY0QiwKKwkJMHgwM0IsIDB4MDAwNTA0QjIsCisJCTB4MDNCLCAweDAwMDQ4MDQ5LAorCQkweDAzQiwgMHgwMDA0MDE0OCwKKwkJMHgwRUYsIDB4MDAwMDAwMDAsCisJCTB4MEVGLCAweDAwMDAwMTAwLAorCQkweDAzNCwgMHgwMDAwQURGMywKKwkJMHgwMzQsIDB4MDAwMDlERUYsCisJCTB4MDM0LCAweDAwMDA4REVDLAorCQkweDAzNCwgMHgwMDAwN0RFOSwKKwkJMHgwMzQsIDB4MDAwMDZDRUQsCisJCTB4MDM0LCAweDAwMDA1Q0U5LAorCQkweDAzNCwgMHgwMDAwNDRFOSwKKwkJMHgwMzQsIDB4MDAwMDM0RTYsCisJCTB4MDM0LCAweDAwMDAyNDZBLAorCQkweDAzNCwgMHgwMDAwMTQ2NywKKwkJMHgwMzQsIDB4MDAwMDAwNjgsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDBFRCwgMHgwMDAwMDAxMCwKKwkJMHgwNDQsIDB4MDAwMEFERjIsCisJCTB4MDQ0LCAweDAwMDA5REVGLAorCQkweDA0NCwgMHgwMDAwOERFQywKKwkJMHgwNDQsIDB4MDAwMDdERTksCisJCTB4MDQ0LCAweDAwMDA2Q0VDLAorCQkweDA0NCwgMHgwMDAwNUNFOSwKKwkJMHgwNDQsIDB4MDAwMDQ0RUMsCisJCTB4MDQ0LCAweDAwMDAzNEU5LAorCQkweDA0NCwgMHgwMDAwMjQ2QywKKwkJMHgwNDQsIDB4MDAwMDE0NjksCisJCTB4MDQ0LCAweDAwMDAwMDZDLAorCQkweDBFRCwgMHgwMDAwMDAwMCwKKwkJMHgwRUQsIDB4MDAwMDAwMDEsCisJCTB4MDQwLCAweDAwMDM4REE3LAorCQkweDA0MCwgMHgwMDAzMDBDMiwKKwkJMHgwNDAsIDB4MDAwMjg4RTIsCisJCTB4MDQwLCAweDAwMDIwMEI4LAorCQkweDA0MCwgMHgwMDAxODhBNSwKKwkJMHgwNDAsIDB4MDAwMTBGQkMsCisJCTB4MDQwLCAweDAwMDA4RjcxLAorCQkweDA0MCwgMHgwMDAwMDI0MCwKKwkJMHgwRUQsIDB4MDAwMDAwMDAsCisJCTB4MEVGLCAweDAwMDAyMEEyLAorCQkweDBERiwgMHgwMDAwMDA4MCwKKwkJMHgwMzUsIDB4MDAwMDAxMjAsCisJCTB4MDM1LCAweDAwMDA4MTIwLAorCQkweDAzNSwgMHgwMDAxMDEyMCwKKwkJMHgwMzYsIDB4MDAwMDAwODUsCisJCTB4MDM2LCAweDAwMDA4MDg1LAorCQkweDAzNiwgMHgwMDAxMDA4NSwKKwkJMHgwMzYsIDB4MDAwMTgwODUsCisJCTB4MEVGLCAweDAwMDAwMDAwLAorCQkweDA1MSwgMHgwMDAwMEMzMSwKKwkJMHgwNTIsIDB4MDAwMDA2MjIsCisJCTB4MDUzLCAweDAwMEZDNzBCLAorCQkweDA1NCwgMHgwMDAwMDE3RSwKKwkJMHgwNTYsIDB4MDAwNTFERjMsCisJCTB4MDUxLCAweDAwMDAwQzAxLAorCQkweDA1MiwgMHgwMDAwMDZENiwKKwkJMHgwNTMsIDB4MDAwRkM2NDksCisJCTB4MDcwLCAweDAwMDQ5NjYxLAorCQkweDA3MSwgMHgwMDA3ODQzRSwKKwkJMHgwNzIsIDB4MDAwMDAzODIsCisJCTB4MDc0LCAweDAwMDUxNDAwLAorCQkweDAzNSwgMHgwMDAwMDE2MCwKKwkJMHgwMzUsIDB4MDAwMDgxNjAsCisJCTB4MDM1LCAweDAwMDEwMTYwLAorCQkweDAzNiwgMHgwMDAwMDEyNCwKKwkJMHgwMzYsIDB4MDAwMDgxMjQsCisJCTB4MDM2LCAweDAwMDEwMTI0LAorCQkweDAzNiwgMHgwMDAxODEyNCwKKwkJMHgwRUQsIDB4MDAwMDAwMEMsCisJCTB4MDQ1LCAweDAwMDAwMTQwLAorCQkweDA0NSwgMHgwMDAwODE0MCwKKwkJMHgwNDUsIDB4MDAwMTAxNDAsCisJCTB4MDQ2LCAweDAwMDAwMTI0LAorCQkweDA0NiwgMHgwMDAwODEyNCwKKwkJMHgwNDYsIDB4MDAwMTAxMjQsCisJCTB4MDQ2LCAweDAwMDE4MTI0LAorCQkweDBERiwgMHgwMDAwMDA4OCwKKwkJMHgwQjMsIDB4MDAwRjBFMTgsCisJCTB4MEI0LCAweDAwMDEyMTRDLAorCQkweDBCNywgMHgwMDAzMDAwQywKKwkJMHgwMUMsIDB4MDAwNTM5RDIsCisJCTB4MDE4LCAweDAwMDFGMTJBLAorCQkweDBGRSwgMHgwMDAwMDAwMCwKKwkJMHgwRkUsIDB4MDAwMDAwMDAsCisJCTB4MDE4LCAweDAwMDE3MTJBLAorfTsKKwordTMyIFJUTDg4MTJBRV9NQUNfUkVHX0FSUkFZW10gPSB7CisJCTB4MDEwLCAweDAwMDAwMDBDLAorCTB4RkYwRjAxODAsIDB4QUJDRCwKKwkJMHgwMjUsIDB4MDAwMDAwMEYsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDAyNSwgMHgwMDAwMDAwRiwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4MDI1LCAweDAwMDAwMDZGLAorCTB4RkYwRjAxODAsIDB4REVBRCwKKwkJMHgwNzIsIDB4MDAwMDAwMDAsCisJCTB4NDI4LCAweDAwMDAwMDBBLAorCQkweDQyOSwgMHgwMDAwMDAxMCwKKwkJMHg0MzAsIDB4MDAwMDAwMDAsCisJCTB4NDMxLCAweDAwMDAwMDAwLAorCQkweDQzMiwgMHgwMDAwMDAwMCwKKwkJMHg0MzMsIDB4MDAwMDAwMDEsCisJCTB4NDM0LCAweDAwMDAwMDA0LAorCQkweDQzNSwgMHgwMDAwMDAwNSwKKwkJMHg0MzYsIDB4MDAwMDAwMDcsCisJCTB4NDM3LCAweDAwMDAwMDA4LAorCQkweDQzQywgMHgwMDAwMDAwNCwKKwkJMHg0M0QsIDB4MDAwMDAwMDUsCisJCTB4NDNFLCAweDAwMDAwMDA3LAorCQkweDQzRiwgMHgwMDAwMDAwOCwKKwkJMHg0NDAsIDB4MDAwMDAwNUQsCisJCTB4NDQxLCAweDAwMDAwMDAxLAorCQkweDQ0MiwgMHgwMDAwMDAwMCwKKwkJMHg0NDQsIDB4MDAwMDAwMTAsCisJCTB4NDQ1LCAweDAwMDAwMDAwLAorCQkweDQ0NiwgMHgwMDAwMDAwMCwKKwkJMHg0NDcsIDB4MDAwMDAwMDAsCisJCTB4NDQ4LCAweDAwMDAwMDAwLAorCQkweDQ0OSwgMHgwMDAwMDBGMCwKKwkJMHg0NEEsIDB4MDAwMDAwMEYsCisJCTB4NDRCLCAweDAwMDAwMDNFLAorCQkweDQ0QywgMHgwMDAwMDAxMCwKKwkJMHg0NEQsIDB4MDAwMDAwMDAsCisJCTB4NDRFLCAweDAwMDAwMDAwLAorCQkweDQ0RiwgMHgwMDAwMDAwMCwKKwkJMHg0NTAsIDB4MDAwMDAwMDAsCisJCTB4NDUxLCAweDAwMDAwMEYwLAorCQkweDQ1MiwgMHgwMDAwMDAwRiwKKwkJMHg0NTMsIDB4MDAwMDAwMDAsCisJCTB4NDVCLCAweDAwMDAwMDgwLAorCQkweDQ2MCwgMHgwMDAwMDA2NiwKKwkJMHg0NjEsIDB4MDAwMDAwNjYsCisJCTB4NEM4LCAweDAwMDAwMEZGLAorCQkweDRDOSwgMHgwMDAwMDAwOCwKKwkJMHg0Q0MsIDB4MDAwMDAwRkYsCisJCTB4NENELCAweDAwMDAwMEZGLAorCQkweDRDRSwgMHgwMDAwMDAwMSwKKwkJMHg1MDAsIDB4MDAwMDAwMjYsCisJCTB4NTAxLCAweDAwMDAwMEEyLAorCQkweDUwMiwgMHgwMDAwMDAyRiwKKwkJMHg1MDMsIDB4MDAwMDAwMDAsCisJCTB4NTA0LCAweDAwMDAwMDI4LAorCQkweDUwNSwgMHgwMDAwMDBBMywKKwkJMHg1MDYsIDB4MDAwMDAwNUUsCisJCTB4NTA3LCAweDAwMDAwMDAwLAorCQkweDUwOCwgMHgwMDAwMDAyQiwKKwkJMHg1MDksIDB4MDAwMDAwQTQsCisJCTB4NTBBLCAweDAwMDAwMDVFLAorCQkweDUwQiwgMHgwMDAwMDAwMCwKKwkJMHg1MEMsIDB4MDAwMDAwNEYsCisJCTB4NTBELCAweDAwMDAwMEE0LAorCQkweDUwRSwgMHgwMDAwMDAwMCwKKwkJMHg1MEYsIDB4MDAwMDAwMDAsCisJCTB4NTEyLCAweDAwMDAwMDFDLAorCQkweDUxNCwgMHgwMDAwMDAwQSwKKwkJMHg1MTYsIDB4MDAwMDAwMEEsCisJCTB4NTI1LCAweDAwMDAwMDRGLAorCQkweDU1MCwgMHgwMDAwMDAxMCwKKwkJMHg1NTEsIDB4MDAwMDAwMTAsCisJCTB4NTU5LCAweDAwMDAwMDAyLAorCQkweDU1QywgMHgwMDAwMDA1MCwKKwkJMHg1NUQsIDB4MDAwMDAwRkYsCisJCTB4NjA0LCAweDAwMDAwMDAxLAorCQkweDYwNSwgMHgwMDAwMDAzMCwKKwkJMHg2MDcsIDB4MDAwMDAwMDMsCisJCTB4NjA4LCAweDAwMDAwMDBFLAorCQkweDYwOSwgMHgwMDAwMDAyQSwKKwkJMHg2MjAsIDB4MDAwMDAwRkYsCisJCTB4NjIxLCAweDAwMDAwMEZGLAorCQkweDYyMiwgMHgwMDAwMDBGRiwKKwkJMHg2MjMsIDB4MDAwMDAwRkYsCisJCTB4NjI0LCAweDAwMDAwMEZGLAorCQkweDYyNSwgMHgwMDAwMDBGRiwKKwkJMHg2MjYsIDB4MDAwMDAwRkYsCisJCTB4NjI3LCAweDAwMDAwMEZGLAorCQkweDYzOCwgMHgwMDAwMDA1MCwKKwkJMHg2M0MsIDB4MDAwMDAwMEEsCisJCTB4NjNELCAweDAwMDAwMDBBLAorCQkweDYzRSwgMHgwMDAwMDAwRSwKKwkJMHg2M0YsIDB4MDAwMDAwMEUsCisJCTB4NjQwLCAweDAwMDAwMDgwLAorCQkweDY0MiwgMHgwMDAwMDA0MCwKKwkJMHg2NDMsIDB4MDAwMDAwMDAsCisJCTB4NjUyLCAweDAwMDAwMEM4LAorCQkweDY2RSwgMHgwMDAwMDAwNSwKKwkJMHg3MDAsIDB4MDAwMDAwMjEsCisJCTB4NzAxLCAweDAwMDAwMDQzLAorCQkweDcwMiwgMHgwMDAwMDA2NSwKKwkJMHg3MDMsIDB4MDAwMDAwODcsCisJCTB4NzA4LCAweDAwMDAwMDIxLAorCQkweDcwOSwgMHgwMDAwMDA0MywKKwkJMHg3MEEsIDB4MDAwMDAwNjUsCisJCTB4NzBCLCAweDAwMDAwMDg3LAorCQkweDcxOCwgMHgwMDAwMDA0MCwKK307CisKK3UzMiBSVEw4ODIxQUVfTUFDX1JFR19BUlJBWVtdID0geworCQkweDQyOCwgMHgwMDAwMDAwQSwKKwkJMHg0MjksIDB4MDAwMDAwMTAsCisJCTB4NDMwLCAweDAwMDAwMDAwLAorCQkweDQzMSwgMHgwMDAwMDAwMCwKKwkJMHg0MzIsIDB4MDAwMDAwMDAsCisJCTB4NDMzLCAweDAwMDAwMDAxLAorCQkweDQzNCwgMHgwMDAwMDAwNCwKKwkJMHg0MzUsIDB4MDAwMDAwMDUsCisJCTB4NDM2LCAweDAwMDAwMDA3LAorCQkweDQzNywgMHgwMDAwMDAwOCwKKwkJMHg0M0MsIDB4MDAwMDAwMDQsCisJCTB4NDNELCAweDAwMDAwMDA1LAorCQkweDQzRSwgMHgwMDAwMDAwNywKKwkJMHg0M0YsIDB4MDAwMDAwMDgsCisJCTB4NDQwLCAweDAwMDAwMDVELAorCQkweDQ0MSwgMHgwMDAwMDAwMSwKKwkJMHg0NDIsIDB4MDAwMDAwMDAsCisJCTB4NDQ0LCAweDAwMDAwMDEwLAorCQkweDQ0NSwgMHgwMDAwMDAwMCwKKwkJMHg0NDYsIDB4MDAwMDAwMDAsCisJCTB4NDQ3LCAweDAwMDAwMDAwLAorCQkweDQ0OCwgMHgwMDAwMDAwMCwKKwkJMHg0NDksIDB4MDAwMDAwRjAsCisJCTB4NDRBLCAweDAwMDAwMDBGLAorCQkweDQ0QiwgMHgwMDAwMDAzRSwKKwkJMHg0NEMsIDB4MDAwMDAwMTAsCisJCTB4NDRELCAweDAwMDAwMDAwLAorCQkweDQ0RSwgMHgwMDAwMDAwMCwKKwkJMHg0NEYsIDB4MDAwMDAwMDAsCisJCTB4NDUwLCAweDAwMDAwMDAwLAorCQkweDQ1MSwgMHgwMDAwMDBGMCwKKwkJMHg0NTIsIDB4MDAwMDAwMEYsCisJCTB4NDUzLCAweDAwMDAwMDAwLAorCQkweDQ1NiwgMHgwMDAwMDA1RSwKKwkJMHg0NjAsIDB4MDAwMDAwNjYsCisJCTB4NDYxLCAweDAwMDAwMDY2LAorCQkweDRDOCwgMHgwMDAwMDAzRiwKKwkJMHg0QzksIDB4MDAwMDAwRkYsCisJCTB4NENDLCAweDAwMDAwMEZGLAorCQkweDRDRCwgMHgwMDAwMDBGRiwKKwkJMHg0Q0UsIDB4MDAwMDAwMDEsCisJCTB4NTAwLCAweDAwMDAwMDI2LAorCQkweDUwMSwgMHgwMDAwMDBBMiwKKwkJMHg1MDIsIDB4MDAwMDAwMkYsCisJCTB4NTAzLCAweDAwMDAwMDAwLAorCQkweDUwNCwgMHgwMDAwMDAyOCwKKwkJMHg1MDUsIDB4MDAwMDAwQTMsCisJCTB4NTA2LCAweDAwMDAwMDVFLAorCQkweDUwNywgMHgwMDAwMDAwMCwKKwkJMHg1MDgsIDB4MDAwMDAwMkIsCisJCTB4NTA5LCAweDAwMDAwMEE0LAorCQkweDUwQSwgMHgwMDAwMDA1RSwKKwkJMHg1MEIsIDB4MDAwMDAwMDAsCisJCTB4NTBDLCAweDAwMDAwMDRGLAorCQkweDUwRCwgMHgwMDAwMDBBNCwKKwkJMHg1MEUsIDB4MDAwMDAwMDAsCisJCTB4NTBGLCAweDAwMDAwMDAwLAorCQkweDUxMiwgMHgwMDAwMDAxQywKKwkJMHg1MTQsIDB4MDAwMDAwMEEsCisJCTB4NTE2LCAweDAwMDAwMDBBLAorCQkweDUyNSwgMHgwMDAwMDA0RiwKKwkJMHg1NTAsIDB4MDAwMDAwMTAsCisJCTB4NTUxLCAweDAwMDAwMDEwLAorCQkweDU1OSwgMHgwMDAwMDAwMiwKKwkJMHg1NUMsIDB4MDAwMDAwNTAsCisJCTB4NTVELCAweDAwMDAwMEZGLAorCQkweDYwNSwgMHgwMDAwMDAzMCwKKwkJMHg2MDcsIDB4MDAwMDAwMDcsCisJCTB4NjA4LCAweDAwMDAwMDBFLAorCQkweDYwOSwgMHgwMDAwMDAyQSwKKwkJMHg2MjAsIDB4MDAwMDAwRkYsCisJCTB4NjIxLCAweDAwMDAwMEZGLAorCQkweDYyMiwgMHgwMDAwMDBGRiwKKwkJMHg2MjMsIDB4MDAwMDAwRkYsCisJCTB4NjI0LCAweDAwMDAwMEZGLAorCQkweDYyNSwgMHgwMDAwMDBGRiwKKwkJMHg2MjYsIDB4MDAwMDAwRkYsCisJCTB4NjI3LCAweDAwMDAwMEZGLAorCQkweDYzOCwgMHgwMDAwMDA1MCwKKwkJMHg2M0MsIDB4MDAwMDAwMEEsCisJCTB4NjNELCAweDAwMDAwMDBBLAorCQkweDYzRSwgMHgwMDAwMDAwRSwKKwkJMHg2M0YsIDB4MDAwMDAwMEUsCisJCTB4NjQwLCAweDAwMDAwMDQwLAorCQkweDY0MiwgMHgwMDAwMDA0MCwKKwkJMHg2NDMsIDB4MDAwMDAwMDAsCisJCTB4NjUyLCAweDAwMDAwMEM4LAorCQkweDY2RSwgMHgwMDAwMDAwNSwKKwkJMHg3MDAsIDB4MDAwMDAwMjEsCisJCTB4NzAxLCAweDAwMDAwMDQzLAorCQkweDcwMiwgMHgwMDAwMDA2NSwKKwkJMHg3MDMsIDB4MDAwMDAwODcsCisJCTB4NzA4LCAweDAwMDAwMDIxLAorCQkweDcwOSwgMHgwMDAwMDA0MywKKwkJMHg3MEEsIDB4MDAwMDAwNjUsCisJCTB4NzBCLCAweDAwMDAwMDg3LAorCQkweDcxOCwgMHgwMDAwMDA0MCwKK307CisKK3UzMiBSVEw4ODEyQUVfQUdDX1RBQl9BUlJBWVtdID0geworCTB4RkYwRjA3RDgsIDB4QUJDRCwKKwkJMHg4MUMsIDB4RkMwMDAwMDEsCisJCTB4ODFDLCAweEZCMDIwMDAxLAorCQkweDgxQywgMHhGQTA0MDAwMSwKKwkJMHg4MUMsIDB4RjkwNjAwMDEsCisJCTB4ODFDLCAweEY4MDgwMDAxLAorCQkweDgxQywgMHhGNzBBMDAwMSwKKwkJMHg4MUMsIDB4RjYwQzAwMDEsCisJCTB4ODFDLCAweEY1MEUwMDAxLAorCQkweDgxQywgMHhGNDEwMDAwMSwKKwkJMHg4MUMsIDB4RjMxMjAwMDEsCisJCTB4ODFDLCAweEYyMTQwMDAxLAorCQkweDgxQywgMHhGMTE2MDAwMSwKKwkJMHg4MUMsIDB4RjAxODAwMDEsCisJCTB4ODFDLCAweEVGMUEwMDAxLAorCQkweDgxQywgMHhFRTFDMDAwMSwKKwkJMHg4MUMsIDB4RUQxRTAwMDEsCisJCTB4ODFDLCAweEVDMjAwMDAxLAorCQkweDgxQywgMHhFQjIyMDAwMSwKKwkJMHg4MUMsIDB4RUEyNDAwMDEsCisJCTB4ODFDLCAweENEMjYwMDAxLAorCQkweDgxQywgMHhDQzI4MDAwMSwKKwkJMHg4MUMsIDB4Q0IyQTAwMDEsCisJCTB4ODFDLCAweENBMkMwMDAxLAorCQkweDgxQywgMHhDOTJFMDAwMSwKKwkJMHg4MUMsIDB4QzgzMDAwMDEsCisJCTB4ODFDLCAweEE2MzIwMDAxLAorCQkweDgxQywgMHhBNTM0MDAwMSwKKwkJMHg4MUMsIDB4QTQzNjAwMDEsCisJCTB4ODFDLCAweEEzMzgwMDAxLAorCQkweDgxQywgMHhBMjNBMDAwMSwKKwkJMHg4MUMsIDB4ODgzQzAwMDEsCisJCTB4ODFDLCAweDg3M0UwMDAxLAorCQkweDgxQywgMHg4NjQwMDAwMSwKKwkJMHg4MUMsIDB4ODU0MjAwMDEsCisJCTB4ODFDLCAweDg0NDQwMDAxLAorCQkweDgxQywgMHg4MzQ2MDAwMSwKKwkJMHg4MUMsIDB4ODI0ODAwMDEsCisJCTB4ODFDLCAweDgxNEEwMDAxLAorCQkweDgxQywgMHg0ODRDMDAwMSwKKwkJMHg4MUMsIDB4NDc0RTAwMDEsCisJCTB4ODFDLCAweDQ2NTAwMDAxLAorCQkweDgxQywgMHg0NTUyMDAwMSwKKwkJMHg4MUMsIDB4NDQ1NDAwMDEsCisJCTB4ODFDLCAweDQzNTYwMDAxLAorCQkweDgxQywgMHg0MjU4MDAwMSwKKwkJMHg4MUMsIDB4NDE1QTAwMDEsCisJCTB4ODFDLCAweDI1NUMwMDAxLAorCQkweDgxQywgMHgyNDVFMDAwMSwKKwkJMHg4MUMsIDB4MjM2MDAwMDEsCisJCTB4ODFDLCAweDIyNjIwMDAxLAorCQkweDgxQywgMHgyMTY0MDAwMSwKKwkJMHg4MUMsIDB4MjE2NjAwMDEsCisJCTB4ODFDLCAweDIxNjgwMDAxLAorCQkweDgxQywgMHgyMTZBMDAwMSwKKwkJMHg4MUMsIDB4MjE2QzAwMDEsCisJCTB4ODFDLCAweDIxNkUwMDAxLAorCQkweDgxQywgMHgyMTcwMDAwMSwKKwkJMHg4MUMsIDB4MjE3MjAwMDEsCisJCTB4ODFDLCAweDIxNzQwMDAxLAorCQkweDgxQywgMHgyMTc2MDAwMSwKKwkJMHg4MUMsIDB4MjE3ODAwMDEsCisJCTB4ODFDLCAweDIxN0EwMDAxLAorCQkweDgxQywgMHgyMTdDMDAwMSwKKwkJMHg4MUMsIDB4MjE3RTAwMDEsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDgxQywgMHhGOTAwMDAwMSwKKwkJMHg4MUMsIDB4RjgwMjAwMDEsCisJCTB4ODFDLCAweEY3MDQwMDAxLAorCQkweDgxQywgMHhGNjA2MDAwMSwKKwkJMHg4MUMsIDB4RjUwODAwMDEsCisJCTB4ODFDLCAweEY0MEEwMDAxLAorCQkweDgxQywgMHhGMzBDMDAwMSwKKwkJMHg4MUMsIDB4RjIwRTAwMDEsCisJCTB4ODFDLCAweEYxMTAwMDAxLAorCQkweDgxQywgMHhGMDEyMDAwMSwKKwkJMHg4MUMsIDB4RUYxNDAwMDEsCisJCTB4ODFDLCAweEVFMTYwMDAxLAorCQkweDgxQywgMHhFRDE4MDAwMSwKKwkJMHg4MUMsIDB4RUMxQTAwMDEsCisJCTB4ODFDLCAweEVCMUMwMDAxLAorCQkweDgxQywgMHhFQTFFMDAwMSwKKwkJMHg4MUMsIDB4Q0QyMDAwMDEsCisJCTB4ODFDLCAweENDMjIwMDAxLAorCQkweDgxQywgMHhDQjI0MDAwMSwKKwkJMHg4MUMsIDB4Q0EyNjAwMDEsCisJCTB4ODFDLCAweEM5MjgwMDAxLAorCQkweDgxQywgMHhDODJBMDAwMSwKKwkJMHg4MUMsIDB4QzcyQzAwMDEsCisJCTB4ODFDLCAweEM2MkUwMDAxLAorCQkweDgxQywgMHhBNTMwMDAwMSwKKwkJMHg4MUMsIDB4QTQzMjAwMDEsCisJCTB4ODFDLCAweEEzMzQwMDAxLAorCQkweDgxQywgMHhBMjM2MDAwMSwKKwkJMHg4MUMsIDB4ODgzODAwMDEsCisJCTB4ODFDLCAweDg3M0EwMDAxLAorCQkweDgxQywgMHg4NjNDMDAwMSwKKwkJMHg4MUMsIDB4ODUzRTAwMDEsCisJCTB4ODFDLCAweDg0NDAwMDAxLAorCQkweDgxQywgMHg4MzQyMDAwMSwKKwkJMHg4MUMsIDB4ODI0NDAwMDEsCisJCTB4ODFDLCAweDgxNDYwMDAxLAorCQkweDgxQywgMHg0ODQ4MDAwMSwKKwkJMHg4MUMsIDB4NDc0QTAwMDEsCisJCTB4ODFDLCAweDQ2NEMwMDAxLAorCQkweDgxQywgMHg0NTRFMDAwMSwKKwkJMHg4MUMsIDB4NDQ1MDAwMDEsCisJCTB4ODFDLCAweDQzNTIwMDAxLAorCQkweDgxQywgMHg0MjU0MDAwMSwKKwkJMHg4MUMsIDB4NDE1NjAwMDEsCisJCTB4ODFDLCAweDI1NTgwMDAxLAorCQkweDgxQywgMHgyNDVBMDAwMSwKKwkJMHg4MUMsIDB4MjM1QzAwMDEsCisJCTB4ODFDLCAweDIyNUUwMDAxLAorCQkweDgxQywgMHgyMTYwMDAwMSwKKwkJMHg4MUMsIDB4MjE2MjAwMDEsCisJCTB4ODFDLCAweDIxNjQwMDAxLAorCQkweDgxQywgMHgyMTY2MDAwMSwKKwkJMHg4MUMsIDB4MjE2ODAwMDEsCisJCTB4ODFDLCAweDIxNkEwMDAxLAorCQkweDgxQywgMHgyMzZDMDAwMSwKKwkJMHg4MUMsIDB4MjI2RTAwMDEsCisJCTB4ODFDLCAweDIxNzAwMDAxLAorCQkweDgxQywgMHgyMTcyMDAwMSwKKwkJMHg4MUMsIDB4MjE3NDAwMDEsCisJCTB4ODFDLCAweDIxNzYwMDAxLAorCQkweDgxQywgMHgyMTc4MDAwMSwKKwkJMHg4MUMsIDB4MjE3QTAwMDEsCisJCTB4ODFDLCAweDIxN0MwMDAxLAorCQkweDgxQywgMHgyMTdFMDAwMSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4ODFDLCAweEZGMDAwMDAxLAorCQkweDgxQywgMHhGRjAyMDAwMSwKKwkJMHg4MUMsIDB4RkYwNDAwMDEsCisJCTB4ODFDLCAweEZGMDYwMDAxLAorCQkweDgxQywgMHhGRjA4MDAwMSwKKwkJMHg4MUMsIDB4RkUwQTAwMDEsCisJCTB4ODFDLCAweEZEMEMwMDAxLAorCQkweDgxQywgMHhGQzBFMDAwMSwKKwkJMHg4MUMsIDB4RkIxMDAwMDEsCisJCTB4ODFDLCAweEZBMTIwMDAxLAorCQkweDgxQywgMHhGOTE0MDAwMSwKKwkJMHg4MUMsIDB4RjgxNjAwMDEsCisJCTB4ODFDLCAweEY3MTgwMDAxLAorCQkweDgxQywgMHhGNjFBMDAwMSwKKwkJMHg4MUMsIDB4RjUxQzAwMDEsCisJCTB4ODFDLCAweEY0MUUwMDAxLAorCQkweDgxQywgMHhGMzIwMDAwMSwKKwkJMHg4MUMsIDB4RjIyMjAwMDEsCisJCTB4ODFDLCAweEYxMjQwMDAxLAorCQkweDgxQywgMHhGMDI2MDAwMSwKKwkJMHg4MUMsIDB4RUYyODAwMDEsCisJCTB4ODFDLCAweEVFMkEwMDAxLAorCQkweDgxQywgMHhFRDJDMDAwMSwKKwkJMHg4MUMsIDB4RUMyRTAwMDEsCisJCTB4ODFDLCAweEVCMzAwMDAxLAorCQkweDgxQywgMHhFQTMyMDAwMSwKKwkJMHg4MUMsIDB4RTkzNDAwMDEsCisJCTB4ODFDLCAweEU4MzYwMDAxLAorCQkweDgxQywgMHhFNzM4MDAwMSwKKwkJMHg4MUMsIDB4RTYzQTAwMDEsCisJCTB4ODFDLCAweEU1M0MwMDAxLAorCQkweDgxQywgMHhDNzNFMDAwMSwKKwkJMHg4MUMsIDB4QzY0MDAwMDEsCisJCTB4ODFDLCAweEM1NDIwMDAxLAorCQkweDgxQywgMHhDNDQ0MDAwMSwKKwkJMHg4MUMsIDB4QzM0NjAwMDEsCisJCTB4ODFDLCAweEMyNDgwMDAxLAorCQkweDgxQywgMHhDMTRBMDAwMSwKKwkJMHg4MUMsIDB4QTc0QzAwMDEsCisJCTB4ODFDLCAweEE2NEUwMDAxLAorCQkweDgxQywgMHhBNTUwMDAwMSwKKwkJMHg4MUMsIDB4QTQ1MjAwMDEsCisJCTB4ODFDLCAweEEzNTQwMDAxLAorCQkweDgxQywgMHhBMjU2MDAwMSwKKwkJMHg4MUMsIDB4QTE1ODAwMDEsCisJCTB4ODFDLCAweDY3NUEwMDAxLAorCQkweDgxQywgMHg2NjVDMDAwMSwKKwkJMHg4MUMsIDB4NjU1RTAwMDEsCisJCTB4ODFDLCAweDY0NjAwMDAxLAorCQkweDgxQywgMHg2MzYyMDAwMSwKKwkJMHg4MUMsIDB4NDg2NDAwMDEsCisJCTB4ODFDLCAweDQ3NjYwMDAxLAorCQkweDgxQywgMHg0NjY4MDAwMSwKKwkJMHg4MUMsIDB4NDU2QTAwMDEsCisJCTB4ODFDLCAweDQ0NkMwMDAxLAorCQkweDgxQywgMHg0MzZFMDAwMSwKKwkJMHg4MUMsIDB4NDI3MDAwMDEsCisJCTB4ODFDLCAweDQxNzIwMDAxLAorCQkweDgxQywgMHg0MTc0MDAwMSwKKwkJMHg4MUMsIDB4NDE3NjAwMDEsCisJCTB4ODFDLCAweDQxNzgwMDAxLAorCQkweDgxQywgMHg0MTdBMDAwMSwKKwkJMHg4MUMsIDB4NDE3QzAwMDEsCisJCTB4ODFDLCAweDQxN0UwMDAxLAorCTB4RkYwRjA3RDgsIDB4REVBRCwKKwkweEZGMEYwMTgwLCAweEFCQ0QsCisJCTB4ODFDLCAweEZDODAwMDAxLAorCQkweDgxQywgMHhGQjgyMDAwMSwKKwkJMHg4MUMsIDB4RkE4NDAwMDEsCisJCTB4ODFDLCAweEY5ODYwMDAxLAorCQkweDgxQywgMHhGODg4MDAwMSwKKwkJMHg4MUMsIDB4Rjc4QTAwMDEsCisJCTB4ODFDLCAweEY2OEMwMDAxLAorCQkweDgxQywgMHhGNThFMDAwMSwKKwkJMHg4MUMsIDB4RjQ5MDAwMDEsCisJCTB4ODFDLCAweEYzOTIwMDAxLAorCQkweDgxQywgMHhGMjk0MDAwMSwKKwkJMHg4MUMsIDB4RjE5NjAwMDEsCisJCTB4ODFDLCAweEYwOTgwMDAxLAorCQkweDgxQywgMHhFRjlBMDAwMSwKKwkJMHg4MUMsIDB4RUU5QzAwMDEsCisJCTB4ODFDLCAweEVEOUUwMDAxLAorCQkweDgxQywgMHhFQ0EwMDAwMSwKKwkJMHg4MUMsIDB4RUJBMjAwMDEsCisJCTB4ODFDLCAweEVBQTQwMDAxLAorCQkweDgxQywgMHhFOUE2MDAwMSwKKwkJMHg4MUMsIDB4RThBODAwMDEsCisJCTB4ODFDLCAweEU3QUEwMDAxLAorCQkweDgxQywgMHhFNkFDMDAwMSwKKwkJMHg4MUMsIDB4RTVBRTAwMDEsCisJCTB4ODFDLCAweEU0QjAwMDAxLAorCQkweDgxQywgMHhFM0IyMDAwMSwKKwkJMHg4MUMsIDB4QThCNDAwMDEsCisJCTB4ODFDLCAweEE3QjYwMDAxLAorCQkweDgxQywgMHhBNkI4MDAwMSwKKwkJMHg4MUMsIDB4QTVCQTAwMDEsCisJCTB4ODFDLCAweEE0QkMwMDAxLAorCQkweDgxQywgMHhBM0JFMDAwMSwKKwkJMHg4MUMsIDB4QTJDMDAwMDEsCisJCTB4ODFDLCAweEExQzIwMDAxLAorCQkweDgxQywgMHg2OEM0MDAwMSwKKwkJMHg4MUMsIDB4NjdDNjAwMDEsCisJCTB4ODFDLCAweDY2QzgwMDAxLAorCQkweDgxQywgMHg2NUNBMDAwMSwKKwkJMHg4MUMsIDB4NjRDQzAwMDEsCisJCTB4ODFDLCAweDQ3Q0UwMDAxLAorCQkweDgxQywgMHg0NkQwMDAwMSwKKwkJMHg4MUMsIDB4NDVEMjAwMDEsCisJCTB4ODFDLCAweDQ0RDQwMDAxLAorCQkweDgxQywgMHg0M0Q2MDAwMSwKKwkJMHg4MUMsIDB4NDJEODAwMDEsCisJCTB4ODFDLCAweDA4REEwMDAxLAorCQkweDgxQywgMHgwN0RDMDAwMSwKKwkJMHg4MUMsIDB4MDZERTAwMDEsCisJCTB4ODFDLCAweDA1RTAwMDAxLAorCQkweDgxQywgMHgwNEUyMDAwMSwKKwkJMHg4MUMsIDB4MDNFNDAwMDEsCisJCTB4ODFDLCAweDAyRTYwMDAxLAorCQkweDgxQywgMHgwMUU4MDAwMSwKKwkJMHg4MUMsIDB4MDFFQTAwMDEsCisJCTB4ODFDLCAweDAxRUMwMDAxLAorCQkweDgxQywgMHgwMUVFMDAwMSwKKwkJMHg4MUMsIDB4MDFGMDAwMDEsCisJCTB4ODFDLCAweDAxRjIwMDAxLAorCQkweDgxQywgMHgwMUY0MDAwMSwKKwkJMHg4MUMsIDB4MDFGNjAwMDEsCisJCTB4ODFDLCAweDAxRjgwMDAxLAorCQkweDgxQywgMHgwMUZBMDAwMSwKKwkJMHg4MUMsIDB4MDFGQzAwMDEsCisJCTB4ODFDLCAweDAxRkUwMDAxLAorCTB4RkYwRjAyODAsIDB4Q0RFRiwKKwkJMHg4MUMsIDB4RkM4MDAwMDEsCisJCTB4ODFDLCAweEZCODIwMDAxLAorCQkweDgxQywgMHhGQTg0MDAwMSwKKwkJMHg4MUMsIDB4Rjk4NjAwMDEsCisJCTB4ODFDLCAweEY4ODgwMDAxLAorCQkweDgxQywgMHhGNzhBMDAwMSwKKwkJMHg4MUMsIDB4RjY4QzAwMDEsCisJCTB4ODFDLCAweEY1OEUwMDAxLAorCQkweDgxQywgMHhGNDkwMDAwMSwKKwkJMHg4MUMsIDB4RjM5MjAwMDEsCisJCTB4ODFDLCAweEYyOTQwMDAxLAorCQkweDgxQywgMHhGMTk2MDAwMSwKKwkJMHg4MUMsIDB4RjA5ODAwMDEsCisJCTB4ODFDLCAweEVGOUEwMDAxLAorCQkweDgxQywgMHhFRTlDMDAwMSwKKwkJMHg4MUMsIDB4RUQ5RTAwMDEsCisJCTB4ODFDLCAweEVDQTAwMDAxLAorCQkweDgxQywgMHhFQkEyMDAwMSwKKwkJMHg4MUMsIDB4RUFBNDAwMDEsCisJCTB4ODFDLCAweEU5QTYwMDAxLAorCQkweDgxQywgMHhFOEE4MDAwMSwKKwkJMHg4MUMsIDB4RTdBQTAwMDEsCisJCTB4ODFDLCAweEU2QUMwMDAxLAorCQkweDgxQywgMHhFNUFFMDAwMSwKKwkJMHg4MUMsIDB4RTRCMDAwMDEsCisJCTB4ODFDLCAweEUzQjIwMDAxLAorCQkweDgxQywgMHhBOEI0MDAwMSwKKwkJMHg4MUMsIDB4QTdCNjAwMDEsCisJCTB4ODFDLCAweEE2QjgwMDAxLAorCQkweDgxQywgMHhBNUJBMDAwMSwKKwkJMHg4MUMsIDB4QTRCQzAwMDEsCisJCTB4ODFDLCAweEEzQkUwMDAxLAorCQkweDgxQywgMHhBMkMwMDAwMSwKKwkJMHg4MUMsIDB4QTFDMjAwMDEsCisJCTB4ODFDLCAweDY4QzQwMDAxLAorCQkweDgxQywgMHg2N0M2MDAwMSwKKwkJMHg4MUMsIDB4NjZDODAwMDEsCisJCTB4ODFDLCAweDY1Q0EwMDAxLAorCQkweDgxQywgMHg2NENDMDAwMSwKKwkJMHg4MUMsIDB4NDdDRTAwMDEsCisJCTB4ODFDLCAweDQ2RDAwMDAxLAorCQkweDgxQywgMHg0NUQyMDAwMSwKKwkJMHg4MUMsIDB4NDRENDAwMDEsCisJCTB4ODFDLCAweDQzRDYwMDAxLAorCQkweDgxQywgMHg0MkQ4MDAwMSwKKwkJMHg4MUMsIDB4MDhEQTAwMDEsCisJCTB4ODFDLCAweDA3REMwMDAxLAorCQkweDgxQywgMHgwNkRFMDAwMSwKKwkJMHg4MUMsIDB4MDVFMDAwMDEsCisJCTB4ODFDLCAweDA0RTIwMDAxLAorCQkweDgxQywgMHgwM0U0MDAwMSwKKwkJMHg4MUMsIDB4MDJFNjAwMDEsCisJCTB4ODFDLCAweDAxRTgwMDAxLAorCQkweDgxQywgMHgwMUVBMDAwMSwKKwkJMHg4MUMsIDB4MDFFQzAwMDEsCisJCTB4ODFDLCAweDAxRUUwMDAxLAorCQkweDgxQywgMHgwMUYwMDAwMSwKKwkJMHg4MUMsIDB4MDFGMjAwMDEsCisJCTB4ODFDLCAweDAxRjQwMDAxLAorCQkweDgxQywgMHgwMUY2MDAwMSwKKwkJMHg4MUMsIDB4MDFGODAwMDEsCisJCTB4ODFDLCAweDAxRkEwMDAxLAorCQkweDgxQywgMHgwMUZDMDAwMSwKKwkJMHg4MUMsIDB4MDFGRTAwMDEsCisJMHhGRjBGMDFDMCwgMHhDREVGLAorCQkweDgxQywgMHhGQzgwMDAwMSwKKwkJMHg4MUMsIDB4RkI4MjAwMDEsCisJCTB4ODFDLCAweEZBODQwMDAxLAorCQkweDgxQywgMHhGOTg2MDAwMSwKKwkJMHg4MUMsIDB4Rjg4ODAwMDEsCisJCTB4ODFDLCAweEY3OEEwMDAxLAorCQkweDgxQywgMHhGNjhDMDAwMSwKKwkJMHg4MUMsIDB4RjU4RTAwMDEsCisJCTB4ODFDLCAweEY0OTAwMDAxLAorCQkweDgxQywgMHhGMzkyMDAwMSwKKwkJMHg4MUMsIDB4RjI5NDAwMDEsCisJCTB4ODFDLCAweEYxOTYwMDAxLAorCQkweDgxQywgMHhGMDk4MDAwMSwKKwkJMHg4MUMsIDB4RUY5QTAwMDEsCisJCTB4ODFDLCAweEVFOUMwMDAxLAorCQkweDgxQywgMHhFRDlFMDAwMSwKKwkJMHg4MUMsIDB4RUNBMDAwMDEsCisJCTB4ODFDLCAweEVCQTIwMDAxLAorCQkweDgxQywgMHhFQUE0MDAwMSwKKwkJMHg4MUMsIDB4RTlBNjAwMDEsCisJCTB4ODFDLCAweEU4QTgwMDAxLAorCQkweDgxQywgMHhFN0FBMDAwMSwKKwkJMHg4MUMsIDB4RTZBQzAwMDEsCisJCTB4ODFDLCAweEU1QUUwMDAxLAorCQkweDgxQywgMHhFNEIwMDAwMSwKKwkJMHg4MUMsIDB4RTNCMjAwMDEsCisJCTB4ODFDLCAweEE4QjQwMDAxLAorCQkweDgxQywgMHhBN0I2MDAwMSwKKwkJMHg4MUMsIDB4QTZCODAwMDEsCisJCTB4ODFDLCAweEE1QkEwMDAxLAorCQkweDgxQywgMHhBNEJDMDAwMSwKKwkJMHg4MUMsIDB4QTNCRTAwMDEsCisJCTB4ODFDLCAweEEyQzAwMDAxLAorCQkweDgxQywgMHhBMUMyMDAwMSwKKwkJMHg4MUMsIDB4NjhDNDAwMDEsCisJCTB4ODFDLCAweDY3QzYwMDAxLAorCQkweDgxQywgMHg2NkM4MDAwMSwKKwkJMHg4MUMsIDB4NjVDQTAwMDEsCisJCTB4ODFDLCAweDY0Q0MwMDAxLAorCQkweDgxQywgMHg0N0NFMDAwMSwKKwkJMHg4MUMsIDB4NDZEMDAwMDEsCisJCTB4ODFDLCAweDQ1RDIwMDAxLAorCQkweDgxQywgMHg0NEQ0MDAwMSwKKwkJMHg4MUMsIDB4NDNENjAwMDEsCisJCTB4ODFDLCAweDQyRDgwMDAxLAorCQkweDgxQywgMHgwOERBMDAwMSwKKwkJMHg4MUMsIDB4MDdEQzAwMDEsCisJCTB4ODFDLCAweDA2REUwMDAxLAorCQkweDgxQywgMHgwNUUwMDAwMSwKKwkJMHg4MUMsIDB4MDRFMjAwMDEsCisJCTB4ODFDLCAweDAzRTQwMDAxLAorCQkweDgxQywgMHgwMkU2MDAwMSwKKwkJMHg4MUMsIDB4MDFFODAwMDEsCisJCTB4ODFDLCAweDAxRUEwMDAxLAorCQkweDgxQywgMHgwMUVDMDAwMSwKKwkJMHg4MUMsIDB4MDFFRTAwMDEsCisJCTB4ODFDLCAweDAxRjAwMDAxLAorCQkweDgxQywgMHgwMUYyMDAwMSwKKwkJMHg4MUMsIDB4MDFGNDAwMDEsCisJCTB4ODFDLCAweDAxRjYwMDAxLAorCQkweDgxQywgMHgwMUY4MDAwMSwKKwkJMHg4MUMsIDB4MDFGQTAwMDEsCisJCTB4ODFDLCAweDAxRkMwMDAxLAorCQkweDgxQywgMHgwMUZFMDAwMSwKKwkweEZGMEYwMkMwLCAweENERUYsCisJCTB4ODFDLCAweEZDODAwMDAxLAorCQkweDgxQywgMHhGQjgyMDAwMSwKKwkJMHg4MUMsIDB4RkE4NDAwMDEsCisJCTB4ODFDLCAweEY5ODYwMDAxLAorCQkweDgxQywgMHhGODg4MDAwMSwKKwkJMHg4MUMsIDB4Rjc4QTAwMDEsCisJCTB4ODFDLCAweEY2OEMwMDAxLAorCQkweDgxQywgMHhGNThFMDAwMSwKKwkJMHg4MUMsIDB4RjQ5MDAwMDEsCisJCTB4ODFDLCAweEYzOTIwMDAxLAorCQkweDgxQywgMHhGMjk0MDAwMSwKKwkJMHg4MUMsIDB4RjE5NjAwMDEsCisJCTB4ODFDLCAweEYwOTgwMDAxLAorCQkweDgxQywgMHhFRjlBMDAwMSwKKwkJMHg4MUMsIDB4RUU5QzAwMDEsCisJCTB4ODFDLCAweEVEOUUwMDAxLAorCQkweDgxQywgMHhFQ0EwMDAwMSwKKwkJMHg4MUMsIDB4RUJBMjAwMDEsCisJCTB4ODFDLCAweEVBQTQwMDAxLAorCQkweDgxQywgMHhFOUE2MDAwMSwKKwkJMHg4MUMsIDB4RThBODAwMDEsCisJCTB4ODFDLCAweEU3QUEwMDAxLAorCQkweDgxQywgMHhFNkFDMDAwMSwKKwkJMHg4MUMsIDB4RTVBRTAwMDEsCisJCTB4ODFDLCAweEU0QjAwMDAxLAorCQkweDgxQywgMHhFM0IyMDAwMSwKKwkJMHg4MUMsIDB4QThCNDAwMDEsCisJCTB4ODFDLCAweEE3QjYwMDAxLAorCQkweDgxQywgMHhBNkI4MDAwMSwKKwkJMHg4MUMsIDB4QTVCQTAwMDEsCisJCTB4ODFDLCAweEE0QkMwMDAxLAorCQkweDgxQywgMHhBM0JFMDAwMSwKKwkJMHg4MUMsIDB4QTJDMDAwMDEsCisJCTB4ODFDLCAweEExQzIwMDAxLAorCQkweDgxQywgMHg2OEM0MDAwMSwKKwkJMHg4MUMsIDB4NjdDNjAwMDEsCisJCTB4ODFDLCAweDY2QzgwMDAxLAorCQkweDgxQywgMHg2NUNBMDAwMSwKKwkJMHg4MUMsIDB4NjRDQzAwMDEsCisJCTB4ODFDLCAweDQ3Q0UwMDAxLAorCQkweDgxQywgMHg0NkQwMDAwMSwKKwkJMHg4MUMsIDB4NDVEMjAwMDEsCisJCTB4ODFDLCAweDQ0RDQwMDAxLAorCQkweDgxQywgMHg0M0Q2MDAwMSwKKwkJMHg4MUMsIDB4NDJEODAwMDEsCisJCTB4ODFDLCAweDA4REEwMDAxLAorCQkweDgxQywgMHgwN0RDMDAwMSwKKwkJMHg4MUMsIDB4MDZERTAwMDEsCisJCTB4ODFDLCAweDA1RTAwMDAxLAorCQkweDgxQywgMHgwNEUyMDAwMSwKKwkJMHg4MUMsIDB4MDNFNDAwMDEsCisJCTB4ODFDLCAweDAyRTYwMDAxLAorCQkweDgxQywgMHgwMUU4MDAwMSwKKwkJMHg4MUMsIDB4MDFFQTAwMDEsCisJCTB4ODFDLCAweDAxRUMwMDAxLAorCQkweDgxQywgMHgwMUVFMDAwMSwKKwkJMHg4MUMsIDB4MDFGMDAwMDEsCisJCTB4ODFDLCAweDAxRjIwMDAxLAorCQkweDgxQywgMHgwMUY0MDAwMSwKKwkJMHg4MUMsIDB4MDFGNjAwMDEsCisJCTB4ODFDLCAweDAxRjgwMDAxLAorCQkweDgxQywgMHgwMUZBMDAwMSwKKwkJMHg4MUMsIDB4MDFGQzAwMDEsCisJCTB4ODFDLCAweDAxRkUwMDAxLAorCTB4RkYwRjA3RDgsIDB4Q0RFRiwKKwkJMHg4MUMsIDB4RkM4MDAwMDEsCisJCTB4ODFDLCAweEZCODIwMDAxLAorCQkweDgxQywgMHhGQTg0MDAwMSwKKwkJMHg4MUMsIDB4Rjk4NjAwMDEsCisJCTB4ODFDLCAweEY4ODgwMDAxLAorCQkweDgxQywgMHhGNzhBMDAwMSwKKwkJMHg4MUMsIDB4RjY4QzAwMDEsCisJCTB4ODFDLCAweEY1OEUwMDAxLAorCQkweDgxQywgMHhGNDkwMDAwMSwKKwkJMHg4MUMsIDB4RjM5MjAwMDEsCisJCTB4ODFDLCAweEYyOTQwMDAxLAorCQkweDgxQywgMHhGMTk2MDAwMSwKKwkJMHg4MUMsIDB4RjA5ODAwMDEsCisJCTB4ODFDLCAweEVGOUEwMDAxLAorCQkweDgxQywgMHhFRTlDMDAwMSwKKwkJMHg4MUMsIDB4RUQ5RTAwMDEsCisJCTB4ODFDLCAweEVDQTAwMDAxLAorCQkweDgxQywgMHhFQkEyMDAwMSwKKwkJMHg4MUMsIDB4RUFBNDAwMDEsCisJCTB4ODFDLCAweEU5QTYwMDAxLAorCQkweDgxQywgMHhFOEE4MDAwMSwKKwkJMHg4MUMsIDB4RTdBQTAwMDEsCisJCTB4ODFDLCAweEU2QUMwMDAxLAorCQkweDgxQywgMHhFNUFFMDAwMSwKKwkJMHg4MUMsIDB4RTRCMDAwMDEsCisJCTB4ODFDLCAweEUzQjIwMDAxLAorCQkweDgxQywgMHhBOEI0MDAwMSwKKwkJMHg4MUMsIDB4QTdCNjAwMDEsCisJCTB4ODFDLCAweEE2QjgwMDAxLAorCQkweDgxQywgMHhBNUJBMDAwMSwKKwkJMHg4MUMsIDB4QTRCQzAwMDEsCisJCTB4ODFDLCAweEEzQkUwMDAxLAorCQkweDgxQywgMHhBMkMwMDAwMSwKKwkJMHg4MUMsIDB4QTFDMjAwMDEsCisJCTB4ODFDLCAweDY4QzQwMDAxLAorCQkweDgxQywgMHg2N0M2MDAwMSwKKwkJMHg4MUMsIDB4NjZDODAwMDEsCisJCTB4ODFDLCAweDY1Q0EwMDAxLAorCQkweDgxQywgMHg2NENDMDAwMSwKKwkJMHg4MUMsIDB4NDdDRTAwMDEsCisJCTB4ODFDLCAweDQ2RDAwMDAxLAorCQkweDgxQywgMHg0NUQyMDAwMSwKKwkJMHg4MUMsIDB4NDRENDAwMDEsCisJCTB4ODFDLCAweDQzRDYwMDAxLAorCQkweDgxQywgMHg0MkQ4MDAwMSwKKwkJMHg4MUMsIDB4MDhEQTAwMDEsCisJCTB4ODFDLCAweDA3REMwMDAxLAorCQkweDgxQywgMHgwNkRFMDAwMSwKKwkJMHg4MUMsIDB4MDVFMDAwMDEsCisJCTB4ODFDLCAweDA0RTIwMDAxLAorCQkweDgxQywgMHgwM0U0MDAwMSwKKwkJMHg4MUMsIDB4MDJFNjAwMDEsCisJCTB4ODFDLCAweDAxRTgwMDAxLAorCQkweDgxQywgMHgwMUVBMDAwMSwKKwkJMHg4MUMsIDB4MDFFQzAwMDEsCisJCTB4ODFDLCAweDAxRUUwMDAxLAorCQkweDgxQywgMHgwMUYwMDAwMSwKKwkJMHg4MUMsIDB4MDFGMjAwMDEsCisJCTB4ODFDLCAweDAxRjQwMDAxLAorCQkweDgxQywgMHgwMUY2MDAwMSwKKwkJMHg4MUMsIDB4MDFGODAwMDEsCisJCTB4ODFDLCAweDAxRkEwMDAxLAorCQkweDgxQywgMHgwMUZDMDAwMSwKKwkJMHg4MUMsIDB4MDFGRTAwMDEsCisJMHhGRjBGMDdEMCwgMHhDREVGLAorCQkweDgxQywgMHhGQzgwMDAwMSwKKwkJMHg4MUMsIDB4RkI4MjAwMDEsCisJCTB4ODFDLCAweEZBODQwMDAxLAorCQkweDgxQywgMHhGOTg2MDAwMSwKKwkJMHg4MUMsIDB4Rjg4ODAwMDEsCisJCTB4ODFDLCAweEY3OEEwMDAxLAorCQkweDgxQywgMHhGNjhDMDAwMSwKKwkJMHg4MUMsIDB4RjU4RTAwMDEsCisJCTB4ODFDLCAweEY0OTAwMDAxLAorCQkweDgxQywgMHhGMzkyMDAwMSwKKwkJMHg4MUMsIDB4RjI5NDAwMDEsCisJCTB4ODFDLCAweEYxOTYwMDAxLAorCQkweDgxQywgMHhGMDk4MDAwMSwKKwkJMHg4MUMsIDB4RUY5QTAwMDEsCisJCTB4ODFDLCAweEVFOUMwMDAxLAorCQkweDgxQywgMHhFRDlFMDAwMSwKKwkJMHg4MUMsIDB4RUNBMDAwMDEsCisJCTB4ODFDLCAweEVCQTIwMDAxLAorCQkweDgxQywgMHhFQUE0MDAwMSwKKwkJMHg4MUMsIDB4RTlBNjAwMDEsCisJCTB4ODFDLCAweEU4QTgwMDAxLAorCQkweDgxQywgMHhFN0FBMDAwMSwKKwkJMHg4MUMsIDB4RTZBQzAwMDEsCisJCTB4ODFDLCAweEU1QUUwMDAxLAorCQkweDgxQywgMHhFNEIwMDAwMSwKKwkJMHg4MUMsIDB4RTNCMjAwMDEsCisJCTB4ODFDLCAweEE4QjQwMDAxLAorCQkweDgxQywgMHhBN0I2MDAwMSwKKwkJMHg4MUMsIDB4QTZCODAwMDEsCisJCTB4ODFDLCAweEE1QkEwMDAxLAorCQkweDgxQywgMHhBNEJDMDAwMSwKKwkJMHg4MUMsIDB4QTNCRTAwMDEsCisJCTB4ODFDLCAweEEyQzAwMDAxLAorCQkweDgxQywgMHhBMUMyMDAwMSwKKwkJMHg4MUMsIDB4NjhDNDAwMDEsCisJCTB4ODFDLCAweDY3QzYwMDAxLAorCQkweDgxQywgMHg2NkM4MDAwMSwKKwkJMHg4MUMsIDB4NjVDQTAwMDEsCisJCTB4ODFDLCAweDY0Q0MwMDAxLAorCQkweDgxQywgMHg0N0NFMDAwMSwKKwkJMHg4MUMsIDB4NDZEMDAwMDEsCisJCTB4ODFDLCAweDQ1RDIwMDAxLAorCQkweDgxQywgMHg0NEQ0MDAwMSwKKwkJMHg4MUMsIDB4NDNENjAwMDEsCisJCTB4ODFDLCAweDQyRDgwMDAxLAorCQkweDgxQywgMHgwOERBMDAwMSwKKwkJMHg4MUMsIDB4MDdEQzAwMDEsCisJCTB4ODFDLCAweDA2REUwMDAxLAorCQkweDgxQywgMHgwNUUwMDAwMSwKKwkJMHg4MUMsIDB4MDRFMjAwMDEsCisJCTB4ODFDLCAweDAzRTQwMDAxLAorCQkweDgxQywgMHgwMkU2MDAwMSwKKwkJMHg4MUMsIDB4MDFFODAwMDEsCisJCTB4ODFDLCAweDAxRUEwMDAxLAorCQkweDgxQywgMHgwMUVDMDAwMSwKKwkJMHg4MUMsIDB4MDFFRTAwMDEsCisJCTB4ODFDLCAweDAxRjAwMDAxLAorCQkweDgxQywgMHgwMUYyMDAwMSwKKwkJMHg4MUMsIDB4MDFGNDAwMDEsCisJCTB4ODFDLCAweDAxRjYwMDAxLAorCQkweDgxQywgMHgwMUY4MDAwMSwKKwkJMHg4MUMsIDB4MDFGQTAwMDEsCisJCTB4ODFDLCAweDAxRkMwMDAxLAorCQkweDgxQywgMHgwMUZFMDAwMSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4ODFDLCAweEZGODAwMDAxLAorCQkweDgxQywgMHhGRjgyMDAwMSwKKwkJMHg4MUMsIDB4RkY4NDAwMDEsCisJCTB4ODFDLCAweEZFODYwMDAxLAorCQkweDgxQywgMHhGRDg4MDAwMSwKKwkJMHg4MUMsIDB4RkM4QTAwMDEsCisJCTB4ODFDLCAweEZCOEMwMDAxLAorCQkweDgxQywgMHhGQThFMDAwMSwKKwkJMHg4MUMsIDB4Rjk5MDAwMDEsCisJCTB4ODFDLCAweEY4OTIwMDAxLAorCQkweDgxQywgMHhGNzk0MDAwMSwKKwkJMHg4MUMsIDB4RjY5NjAwMDEsCisJCTB4ODFDLCAweEY1OTgwMDAxLAorCQkweDgxQywgMHhGNDlBMDAwMSwKKwkJMHg4MUMsIDB4RjM5QzAwMDEsCisJCTB4ODFDLCAweEYyOUUwMDAxLAorCQkweDgxQywgMHhGMUEwMDAwMSwKKwkJMHg4MUMsIDB4RjBBMjAwMDEsCisJCTB4ODFDLCAweEVGQTQwMDAxLAorCQkweDgxQywgMHhFRUE2MDAwMSwKKwkJMHg4MUMsIDB4RURBODAwMDEsCisJCTB4ODFDLCAweEVDQUEwMDAxLAorCQkweDgxQywgMHhFQkFDMDAwMSwKKwkJMHg4MUMsIDB4RUFBRTAwMDEsCisJCTB4ODFDLCAweEU5QjAwMDAxLAorCQkweDgxQywgMHhFOEIyMDAwMSwKKwkJMHg4MUMsIDB4RTdCNDAwMDEsCisJCTB4ODFDLCAweEU2QjYwMDAxLAorCQkweDgxQywgMHhFNUI4MDAwMSwKKwkJMHg4MUMsIDB4RTRCQTAwMDEsCisJCTB4ODFDLCAweEUzQkMwMDAxLAorCQkweDgxQywgMHhBOEJFMDAwMSwKKwkJMHg4MUMsIDB4QTdDMDAwMDEsCisJCTB4ODFDLCAweEE2QzIwMDAxLAorCQkweDgxQywgMHhBNUM0MDAwMSwKKwkJMHg4MUMsIDB4QTRDNjAwMDEsCisJCTB4ODFDLCAweEEzQzgwMDAxLAorCQkweDgxQywgMHhBMkNBMDAwMSwKKwkJMHg4MUMsIDB4QTFDQzAwMDEsCisJCTB4ODFDLCAweDY4Q0UwMDAxLAorCQkweDgxQywgMHg2N0QwMDAwMSwKKwkJMHg4MUMsIDB4NjZEMjAwMDEsCisJCTB4ODFDLCAweDY1RDQwMDAxLAorCQkweDgxQywgMHg2NEQ2MDAwMSwKKwkJMHg4MUMsIDB4NDdEODAwMDEsCisJCTB4ODFDLCAweDQ2REEwMDAxLAorCQkweDgxQywgMHg0NURDMDAwMSwKKwkJMHg4MUMsIDB4NDRERTAwMDEsCisJCTB4ODFDLCAweDQzRTAwMDAxLAorCQkweDgxQywgMHg0MkUyMDAwMSwKKwkJMHg4MUMsIDB4MDhFNDAwMDEsCisJCTB4ODFDLCAweDA3RTYwMDAxLAorCQkweDgxQywgMHgwNkU4MDAwMSwKKwkJMHg4MUMsIDB4MDVFQTAwMDEsCisJCTB4ODFDLCAweDA0RUMwMDAxLAorCQkweDgxQywgMHgwM0VFMDAwMSwKKwkJMHg4MUMsIDB4MDJGMDAwMDEsCisJCTB4ODFDLCAweDAxRjIwMDAxLAorCQkweDgxQywgMHgwMUY0MDAwMSwKKwkJMHg4MUMsIDB4MDFGNjAwMDEsCisJCTB4ODFDLCAweDAxRjgwMDAxLAorCQkweDgxQywgMHgwMUZBMDAwMSwKKwkJMHg4MUMsIDB4MDFGQzAwMDEsCisJCTB4ODFDLCAweDAxRkUwMDAxLAorCTB4RkYwRjAxODAsIDB4REVBRCwKKwkJMHhDNTAsIDB4MDAwMDAwMjIsCisJCTB4QzUwLCAweDAwMDAwMDIwLAorCQkweEU1MCwgMHgwMDAwMDAyMiwKKwkJMHhFNTAsIDB4MDAwMDAwMjAsCit9OworCit1MzIgUlRMODgyMUFFX0FHQ19UQUJfQVJSQVlbXSA9IHsKKwkJMHg4MUMsIDB4QkYwMDAwMDEsCisJCTB4ODFDLCAweEJGMDIwMDAxLAorCQkweDgxQywgMHhCRjA0MDAwMSwKKwkJMHg4MUMsIDB4QkYwNjAwMDEsCisJCTB4ODFDLCAweEJFMDgwMDAxLAorCQkweDgxQywgMHhCRDBBMDAwMSwKKwkJMHg4MUMsIDB4QkMwQzAwMDEsCisJCTB4ODFDLCAweEJBMEUwMDAxLAorCQkweDgxQywgMHhCOTEwMDAwMSwKKwkJMHg4MUMsIDB4QjgxMjAwMDEsCisJCTB4ODFDLCAweEI3MTQwMDAxLAorCQkweDgxQywgMHhCNjE2MDAwMSwKKwkJMHg4MUMsIDB4QjUxODAwMDEsCisJCTB4ODFDLCAweEI0MUEwMDAxLAorCQkweDgxQywgMHhCMzFDMDAwMSwKKwkJMHg4MUMsIDB4QjIxRTAwMDEsCisJCTB4ODFDLCAweEIxMjAwMDAxLAorCQkweDgxQywgMHhCMDIyMDAwMSwKKwkJMHg4MUMsIDB4QUYyNDAwMDEsCisJCTB4ODFDLCAweEFFMjYwMDAxLAorCQkweDgxQywgMHhBRDI4MDAwMSwKKwkJMHg4MUMsIDB4QUMyQTAwMDEsCisJCTB4ODFDLCAweEFCMkMwMDAxLAorCQkweDgxQywgMHhBQTJFMDAwMSwKKwkJMHg4MUMsIDB4QTkzMDAwMDEsCisJCTB4ODFDLCAweEE4MzIwMDAxLAorCQkweDgxQywgMHhBNzM0MDAwMSwKKwkJMHg4MUMsIDB4QTYzNjAwMDEsCisJCTB4ODFDLCAweEE1MzgwMDAxLAorCQkweDgxQywgMHhBNDNBMDAwMSwKKwkJMHg4MUMsIDB4QTMzQzAwMDEsCisJCTB4ODFDLCAweDY3M0UwMDAxLAorCQkweDgxQywgMHg2NjQwMDAwMSwKKwkJMHg4MUMsIDB4NjU0MjAwMDEsCisJCTB4ODFDLCAweDY0NDQwMDAxLAorCQkweDgxQywgMHg2MzQ2MDAwMSwKKwkJMHg4MUMsIDB4NjI0ODAwMDEsCisJCTB4ODFDLCAweDYxNEEwMDAxLAorCQkweDgxQywgMHg0NzRDMDAwMSwKKwkJMHg4MUMsIDB4NDY0RTAwMDEsCisJCTB4ODFDLCAweDQ1NTAwMDAxLAorCQkweDgxQywgMHg0NDUyMDAwMSwKKwkJMHg4MUMsIDB4NDM1NDAwMDEsCisJCTB4ODFDLCAweDQyNTYwMDAxLAorCQkweDgxQywgMHg0MTU4MDAwMSwKKwkJMHg4MUMsIDB4Mjg1QTAwMDEsCisJCTB4ODFDLCAweDI3NUMwMDAxLAorCQkweDgxQywgMHgyNjVFMDAwMSwKKwkJMHg4MUMsIDB4MjU2MDAwMDEsCisJCTB4ODFDLCAweDI0NjIwMDAxLAorCQkweDgxQywgMHgwQTY0MDAwMSwKKwkJMHg4MUMsIDB4MDk2NjAwMDEsCisJCTB4ODFDLCAweDA4NjgwMDAxLAorCQkweDgxQywgMHgwNzZBMDAwMSwKKwkJMHg4MUMsIDB4MDY2QzAwMDEsCisJCTB4ODFDLCAweDA1NkUwMDAxLAorCQkweDgxQywgMHgwNDcwMDAwMSwKKwkJMHg4MUMsIDB4MDM3MjAwMDEsCisJCTB4ODFDLCAweDAyNzQwMDAxLAorCQkweDgxQywgMHgwMTc2MDAwMSwKKwkJMHg4MUMsIDB4MDE3ODAwMDEsCisJCTB4ODFDLCAweDAxN0EwMDAxLAorCQkweDgxQywgMHgwMTdDMDAwMSwKKwkJMHg4MUMsIDB4MDE3RTAwMDEsCisJMHhGRjBGMDJDMCwgMHhBQkNELAorCQkweDgxQywgMHhGQjAwMDEwMSwKKwkJMHg4MUMsIDB4RkEwMjAxMDEsCisJCTB4ODFDLCAweEY5MDQwMTAxLAorCQkweDgxQywgMHhGODA2MDEwMSwKKwkJMHg4MUMsIDB4RjcwODAxMDEsCisJCTB4ODFDLCAweEY2MEEwMTAxLAorCQkweDgxQywgMHhGNTBDMDEwMSwKKwkJMHg4MUMsIDB4RjQwRTAxMDEsCisJCTB4ODFDLCAweEYzMTAwMTAxLAorCQkweDgxQywgMHhGMjEyMDEwMSwKKwkJMHg4MUMsIDB4RjExNDAxMDEsCisJCTB4ODFDLCAweEYwMTYwMTAxLAorCQkweDgxQywgMHhFRjE4MDEwMSwKKwkJMHg4MUMsIDB4RUUxQTAxMDEsCisJCTB4ODFDLCAweEVEMUMwMTAxLAorCQkweDgxQywgMHhFQzFFMDEwMSwKKwkJMHg4MUMsIDB4RUIyMDAxMDEsCisJCTB4ODFDLCAweEVBMjIwMTAxLAorCQkweDgxQywgMHhFOTI0MDEwMSwKKwkJMHg4MUMsIDB4RTgyNjAxMDEsCisJCTB4ODFDLCAweEU3MjgwMTAxLAorCQkweDgxQywgMHhFNjJBMDEwMSwKKwkJMHg4MUMsIDB4RTUyQzAxMDEsCisJCTB4ODFDLCAweEU0MkUwMTAxLAorCQkweDgxQywgMHhFMzMwMDEwMSwKKwkJMHg4MUMsIDB4QTUzMjAxMDEsCisJCTB4ODFDLCAweEE0MzQwMTAxLAorCQkweDgxQywgMHhBMzM2MDEwMSwKKwkJMHg4MUMsIDB4ODczODAxMDEsCisJCTB4ODFDLCAweDg2M0EwMTAxLAorCQkweDgxQywgMHg4NTNDMDEwMSwKKwkJMHg4MUMsIDB4ODQzRTAxMDEsCisJCTB4ODFDLCAweDY5NDAwMTAxLAorCQkweDgxQywgMHg2ODQyMDEwMSwKKwkJMHg4MUMsIDB4Njc0NDAxMDEsCisJCTB4ODFDLCAweDY2NDYwMTAxLAorCQkweDgxQywgMHg0OTQ4MDEwMSwKKwkJMHg4MUMsIDB4NDg0QTAxMDEsCisJCTB4ODFDLCAweDQ3NEMwMTAxLAorCQkweDgxQywgMHgyQTRFMDEwMSwKKwkJMHg4MUMsIDB4Mjk1MDAxMDEsCisJCTB4ODFDLCAweDI4NTIwMTAxLAorCQkweDgxQywgMHgyNzU0MDEwMSwKKwkJMHg4MUMsIDB4MjY1NjAxMDEsCisJCTB4ODFDLCAweDI1NTgwMTAxLAorCQkweDgxQywgMHgyNDVBMDEwMSwKKwkJMHg4MUMsIDB4MjM1QzAxMDEsCisJCTB4ODFDLCAweDA1NUUwMTAxLAorCQkweDgxQywgMHgwNDYwMDEwMSwKKwkJMHg4MUMsIDB4MDM2MjAxMDEsCisJCTB4ODFDLCAweDAyNjQwMTAxLAorCQkweDgxQywgMHgwMTY2MDEwMSwKKwkJMHg4MUMsIDB4MDE2ODAxMDEsCisJCTB4ODFDLCAweDAxNkEwMTAxLAorCQkweDgxQywgMHgwMTZDMDEwMSwKKwkJMHg4MUMsIDB4MDE2RTAxMDEsCisJCTB4ODFDLCAweDAxNzAwMTAxLAorCQkweDgxQywgMHgwMTcyMDEwMSwKKwkweENEQ0RDRENELCAweENEQ0QsCisJCTB4ODFDLCAweEZGMDAwMTAxLAorCQkweDgxQywgMHhGRjAyMDEwMSwKKwkJMHg4MUMsIDB4RkUwNDAxMDEsCisJCTB4ODFDLCAweEZEMDYwMTAxLAorCQkweDgxQywgMHhGQzA4MDEwMSwKKwkJMHg4MUMsIDB4RkQwQTAxMDEsCisJCTB4ODFDLCAweEZDMEMwMTAxLAorCQkweDgxQywgMHhGQjBFMDEwMSwKKwkJMHg4MUMsIDB4RkExMDAxMDEsCisJCTB4ODFDLCAweEY5MTIwMTAxLAorCQkweDgxQywgMHhGODE0MDEwMSwKKwkJMHg4MUMsIDB4RjcxNjAxMDEsCisJCTB4ODFDLCAweEY2MTgwMTAxLAorCQkweDgxQywgMHhGNTFBMDEwMSwKKwkJMHg4MUMsIDB4RjQxQzAxMDEsCisJCTB4ODFDLCAweEYzMUUwMTAxLAorCQkweDgxQywgMHhGMjIwMDEwMSwKKwkJMHg4MUMsIDB4RjEyMjAxMDEsCisJCTB4ODFDLCAweEYwMjQwMTAxLAorCQkweDgxQywgMHhFRjI2MDEwMSwKKwkJMHg4MUMsIDB4RUUyODAxMDEsCisJCTB4ODFDLCAweEVEMkEwMTAxLAorCQkweDgxQywgMHhFQzJDMDEwMSwKKwkJMHg4MUMsIDB4RUIyRTAxMDEsCisJCTB4ODFDLCAweEVBMzAwMTAxLAorCQkweDgxQywgMHhFOTMyMDEwMSwKKwkJMHg4MUMsIDB4RTgzNDAxMDEsCisJCTB4ODFDLCAweEU3MzYwMTAxLAorCQkweDgxQywgMHhFNjM4MDEwMSwKKwkJMHg4MUMsIDB4RTUzQTAxMDEsCisJCTB4ODFDLCAweEU0M0MwMTAxLAorCQkweDgxQywgMHhFMzNFMDEwMSwKKwkJMHg4MUMsIDB4QTU0MDAxMDEsCisJCTB4ODFDLCAweEE0NDIwMTAxLAorCQkweDgxQywgMHhBMzQ0MDEwMSwKKwkJMHg4MUMsIDB4ODc0NjAxMDEsCisJCTB4ODFDLCAweDg2NDgwMTAxLAorCQkweDgxQywgMHg4NTRBMDEwMSwKKwkJMHg4MUMsIDB4ODQ0QzAxMDEsCisJCTB4ODFDLCAweDY5NEUwMTAxLAorCQkweDgxQywgMHg2ODUwMDEwMSwKKwkJMHg4MUMsIDB4Njc1MjAxMDEsCisJCTB4ODFDLCAweDY2NTQwMTAxLAorCQkweDgxQywgMHg0OTU2MDEwMSwKKwkJMHg4MUMsIDB4NDg1ODAxMDEsCisJCTB4ODFDLCAweDQ3NUEwMTAxLAorCQkweDgxQywgMHgyQTVDMDEwMSwKKwkJMHg4MUMsIDB4Mjk1RTAxMDEsCisJCTB4ODFDLCAweDI4NjAwMTAxLAorCQkweDgxQywgMHgyNzYyMDEwMSwKKwkJMHg4MUMsIDB4MjY2NDAxMDEsCisJCTB4ODFDLCAweDI1NjYwMTAxLAorCQkweDgxQywgMHgyNDY4MDEwMSwKKwkJMHg4MUMsIDB4MjM2QTAxMDEsCisJCTB4ODFDLCAweDA1NkMwMTAxLAorCQkweDgxQywgMHgwNDZFMDEwMSwKKwkJMHg4MUMsIDB4MDM3MDAxMDEsCisJCTB4ODFDLCAweDAyNzIwMTAxLAorCTB4RkYwRjAyQzAsIDB4REVBRCwKKwkJMHg4MUMsIDB4MDE3NDAxMDEsCisJCTB4ODFDLCAweDAxNzYwMTAxLAorCQkweDgxQywgMHgwMTc4MDEwMSwKKwkJMHg4MUMsIDB4MDE3QTAxMDEsCisJCTB4ODFDLCAweDAxN0MwMTAxLAorCQkweDgxQywgMHgwMTdFMDEwMSwKKwkJMHhDNTAsIDB4MDAwMDAwMjIsCisJCTB4QzUwLCAweDAwMDAwMDIwLAorCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkN2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RhYmxlLmgKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIENyZWF0ZWQgb24gIDIwMTAvIDUvMTgsICAxOjQxCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9UQUJMRV9fSF8KKyNkZWZpbmUgX19SVEw4ODIxQUVfVEFCTEVfX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2RlZmluZSAgUlRMODgyMUFFUEhZX1JFR18xVEFSUkFZTEVOCTM0NAorZXh0ZXJuIHUzMiBSVEw4ODIxQUVfUEhZX1JFR19BUlJBWVtdOworI2RlZmluZSAgUlRMODgxMkFFUEhZX1JFR18xVEFSUkFZTEVOCTQ5MAorZXh0ZXJuIHUzMiBSVEw4ODEyQUVfUEhZX1JFR19BUlJBWVtdOworI2RlZmluZSBSVEw4ODIxQUVQSFlfUkVHX0FSUkFZX1BHTEVOIAk5MAorZXh0ZXJuIHUzMiBSVEw4ODIxQUVfUEhZX1JFR19BUlJBWV9QR1tdOworI2RlZmluZSBSVEw4ODEyQUVQSFlfUkVHX0FSUkFZX1BHTEVOIAkyNzYKK2V4dGVybiB1MzIgUlRMODgxMkFFX1BIWV9SRUdfQVJSQVlfUEdbXTsKKy8vI2RlZmluZQlSVEw4NzIzQkVfUkFESU9BXzFUQVJSQVlMRU4gCTIwNgorLy9leHRlcm4gdTggKlJUTDg4MjFBRV9UWFBXUl9MTVRfQVJSQVlbXTsKKyNkZWZpbmUJUlRMODgxMkFFX1JBRElPQV8xVEFSUkFZTEVOIAkxMjY0CitleHRlcm4gdTMyIFJUTDg4MTJBRV9SQURJT0FfQVJSQVlbXTsKKyNkZWZpbmUJUlRMODgxMkFFX1JBRElPQl8xVEFSUkFZTEVOIAkxMjQwCitleHRlcm4gdTMyIFJUTDg4MTJBRV9SQURJT0JfQVJSQVlbXTsKKyNkZWZpbmUJUlRMODgyMUFFX1JBRElPQV8xVEFSUkFZTEVOIAkxMTc2CitleHRlcm4gdTMyIFJUTDg4MjFBRV9SQURJT0FfQVJSQVlbXTsKKyNkZWZpbmUgUlRMODgyMUFFTUFDXzFUX0FSUkFZTEVOICAJCTE5NAorZXh0ZXJuIHUzMiBSVEw4ODIxQUVfTUFDX1JFR19BUlJBWVtdOworI2RlZmluZSBSVEw4ODEyQUVNQUNfMVRfQVJSQVlMRU4gIAkJMjE0CitleHRlcm4gdTMyIFJUTDg4MTJBRV9NQUNfUkVHX0FSUkFZW107CisjZGVmaW5lIFJUTDg4MjFBRUFHQ1RBQl8xVEFSUkFZTEVOIAkJMzgyCitleHRlcm4gdTMyIFJUTDg4MjFBRV9BR0NfVEFCX0FSUkFZW107CisjZGVmaW5lIFJUTDg4MTJBRUFHQ1RBQl8xVEFSUkFZTEVOIAkJMTMxMgorZXh0ZXJuIHUzMiBSVEw4ODEyQUVfQUdDX1RBQl9BUlJBWVtdOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS90cnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFlNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMKQEAgLTAsMCArMSwxMDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICIuLi9iYXNlLmgiCisjaW5jbHVkZSAiLi4vc3RhdHMuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJ0cnguaCIKKyNpbmNsdWRlICJsZWQuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgInBoeS5oIgordTggX3J0bDg4MjFhZV9tYXBfaHdxdWV1ZV90b19md3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHU4IGh3X3F1ZXVlKQoreworCXUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKKworCWlmICh1bmxpa2VseShpZWVlODAyMTFfaXNfYmVhY29uKGZjKSkpCisJCXJldHVybiBRU0xUX0JFQUNPTjsKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpIHx8IGllZWU4MDIxMV9pc19jdGwoZmMpKQorCQlyZXR1cm4gUVNMVF9NR05UOworCisJcmV0dXJuIHNrYi0+cHJpb3JpdHk7Cit9CisKKy8qIG1hYzgwMjExJ3MgcmF0ZV9pZHggaXMgbGlrZSB0aGlzOgorICoKKyAqIDIuNEcgYmFuZDpyeF9zdGF0dXMtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWgorICoKKyAqIEIvRyByYXRlOgorICogKHJ4X3N0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSFQpID0gMCwKKyAqIERFU0NfUkFURTFNLS0+REVTQ19SQVRFNTRNID09PiBpZHggaXMgMC0tPjExLAorICoKKyAqIE4gcmF0ZToKKyAqIChyeF9zdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0hUKSA9IDEsCisgKiBERVNDX1JBVEVNQ1MwLS0+REVTQ19SQVRFTUNTMTUgPT0+IGlkeCBpcyAwLS0+MTUKKyAqCisgKiA1RyBiYW5kOnJ4X3N0YXR1cy0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haCisgKiBBIHJhdGU6CisgKiAocnhfc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCkgPSAwLAorICogREVTQ19SQVRFNk0tLT5ERVNDX1JBVEU1NE0gPT0+IGlkeCBpcyAwLS0+NywKKyAqCisgKiBOIHJhdGU6CisgKiAocnhfc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCkgPSAxLAorICogREVTQ19SQVRFTUNTMC0tPkRFU0NfUkFURU1DUzE1ID09PiBpZHggaXMgMC0tPjE1CisgKi8KK3N0YXRpYyBpbnQgX3J0bDg4MjFhZV9yYXRlX21hcHBpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJYm9vbCBpc2h0LCB1OCBkZXNjX3JhdGUpCit7CisJaW50IHJhdGVfaWR4OworCisJaWYgKGZhbHNlID09IGlzaHQpIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCisJCWlmIChJRUVFODAyMTFfQkFORF8yR0haID09IGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+YmFuZCkgeworI2Vsc2UKKwkJaWYgKElFRUU4MDIxMV9CQU5EXzJHSFogPT0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZCkgeworI2VuZGlmCisJCQlzd2l0Y2ggKGRlc2NfcmF0ZSkgeworCQkJY2FzZSBERVNDX1JBVEUxTToKKwkJCQlyYXRlX2lkeCA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIERFU0NfUkFURTJNOgorCQkJCXJhdGVfaWR4ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVTQ19SQVRFNV81TToKKwkJCQlyYXRlX2lkeCA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIERFU0NfUkFURTExTToKKwkJCQlyYXRlX2lkeCA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIERFU0NfUkFURTZNOgorCQkJCXJhdGVfaWR4ID0gNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVTQ19SQVRFOU06CisJCQkJcmF0ZV9pZHggPSA1OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUxMk06CisJCQkJcmF0ZV9pZHggPSA2OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUxOE06CisJCQkJcmF0ZV9pZHggPSA3OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUyNE06CisJCQkJcmF0ZV9pZHggPSA4OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUzNk06CisJCQkJcmF0ZV9pZHggPSA5OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEU0OE06CisJCQkJcmF0ZV9pZHggPSAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVTQ19SQVRFNTRNOgorCQkJCXJhdGVfaWR4ID0gMTE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJhdGVfaWR4ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoZGVzY19yYXRlKSB7CisJCQljYXNlIERFU0NfUkFURTZNOgorCQkJCXJhdGVfaWR4ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVTQ19SQVRFOU06CisJCQkJcmF0ZV9pZHggPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUxMk06CisJCQkJcmF0ZV9pZHggPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUxOE06CisJCQkJcmF0ZV9pZHggPSAzOworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUyNE06CisJCQkJcmF0ZV9pZHggPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEUzNk06CisJCQkJcmF0ZV9pZHggPSA1OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEU0OE06CisJCQkJcmF0ZV9pZHggPSA2OworCQkJCWJyZWFrOworCQkJY2FzZSBERVNDX1JBVEU1NE06CisJCQkJcmF0ZV9pZHggPSA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyYXRlX2lkeCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2goZGVzY19yYXRlKSB7CisJCWNhc2UgREVTQ19SQVRFTUNTMDoKKwkJCXJhdGVfaWR4ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzE6CisJCQlyYXRlX2lkeCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1MyOgorCQkJcmF0ZV9pZHggPSAyOworCQkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTMzoKKwkJCXJhdGVfaWR4ID0gMzsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzQ6CisJCQlyYXRlX2lkeCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1M1OgorCQkJcmF0ZV9pZHggPSA1OworCQkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTNjoKKwkJCXJhdGVfaWR4ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzc6CisJCQlyYXRlX2lkeCA9IDc7CisJCQlicmVhazsKKwkJY2FzZSBERVNDX1JBVEVNQ1M4OgorCQkJcmF0ZV9pZHggPSA4OworCQkJYnJlYWs7CisJCWNhc2UgREVTQ19SQVRFTUNTOToKKwkJCXJhdGVfaWR4ID0gOTsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzEwOgorCQkJcmF0ZV9pZHggPSAxMDsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzExOgorCQkJcmF0ZV9pZHggPSAxMTsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzEyOgorCQkJcmF0ZV9pZHggPSAxMjsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzEzOgorCQkJcmF0ZV9pZHggPSAxMzsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzE0OgorCQkJcmF0ZV9pZHggPSAxNDsKKwkJCWJyZWFrOworCQljYXNlIERFU0NfUkFURU1DUzE1OgorCQkJcmF0ZV9pZHggPSAxNTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmF0ZV9pZHggPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJhdGVfaWR4OworfQorCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3F1ZXJ5X3J4cGh5c3RhdHVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXR1cywgdTggKnBkZXNjLAorCQkJc3RydWN0IHJ4X2Z3aW5mb184ODIxYWUgKnBfZHJ2aW5mbywgYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLAorCQkJYm9vbCBicGFja2V0X3Rvc2VsZiwgYm9vbCBiX3BhY2tldF9iZWFjb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxwcml2KTsKKwlzdHJ1Y3QgcGh5X3N0c19jY2tfODgyMWFlX3QgKmNja19idWY7CisJc3RydWN0IHBoeV9zdGF0dXNfcnB0ICpwX3BoeXN0UnB0ID0gKHN0cnVjdCBwaHlfc3RhdHVzX3JwdCAqKXBfZHJ2aW5mbzsKKwlzdHJ1Y3QgcnRsX2RtICpydGxkbSA9IHJ0bF9kbShydGxfcHJpdihodykpOworCWNoYXIgcnhfcHdyX2FsbCA9IDAsIHJ4X3B3cls0XTsKKwl1OCByZl9yeF9udW0gPSAwLCBldm0sIHB3ZGJfYWxsOworCXU4IGksIG1heF9zcGF0aWFsX3N0cmVhbTsKKwl1MzIgcnNzaSwgdG90YWxfcnNzaSA9IDA7CisJYm9vbCBiX2lzX2NjayA9IHBzdGF0dXMtPmJfaXNfY2NrOworCXU4IGxhbl9pZHgsdmdhX2lkeDsKKworCS8qIFJlY29yZCBpdCBmb3IgbmV4dCBwYWNrZXQgcHJvY2Vzc2luZyAqLworCXBzdGF0dXMtPmJfcGFja2V0X21hdGNoYnNzaWQgPSBicGFja2V0X21hdGNoX2Jzc2lkOworCXBzdGF0dXMtPmJfcGFja2V0X3Rvc2VsZiA9IGJwYWNrZXRfdG9zZWxmOworCXBzdGF0dXMtPmJfcGFja2V0X2JlYWNvbiA9IGJfcGFja2V0X2JlYWNvbjsKKwlwc3RhdHVzLT5yeF9taW1vX3NpZ25hbHF1YWxpdHlbMF0gPSAtMTsKKwlwc3RhdHVzLT5yeF9taW1vX3NpZ25hbHF1YWxpdHlbMV0gPSAtMTsKKworCWlmIChiX2lzX2NjaykgeworCQl1OCBjY2tfaGlnaHB3cjsKKwkJdTggY2NrX2FnY19ycHQ7CisJCS8qIENDSyBEcml2ZXIgaW5mbyBTdHJ1Y3R1cmUgaXMgbm90IHRoZSBzYW1lIGFzIE9GRE0gcGFja2V0LiAqLworCQljY2tfYnVmID0gKHN0cnVjdCBwaHlfc3RzX2Nja184ODIxYWVfdCAqKXBfZHJ2aW5mbzsKKwkJY2NrX2FnY19ycHQgPSBjY2tfYnVmLT5jY2tfYWdjX3JwdDsKKworCQkvKiAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSyAqLworCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5CisJCSAqIGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KKwkJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9OKQorCQkJY2NrX2hpZ2hwd3IgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMiwKKwkJCQkJCQkgQklUKDkpKTsKKwkJZWxzZQorCQkJY2NrX2hpZ2hwd3IgPSBmYWxzZTsKKworCQlsYW5faWR4ID0gKChjY2tfYWdjX3JwdCAmIDB4RTApID4+IDUpOworCQl2Z2FfaWR4ID0gKGNja19hZ2NfcnB0ICYgMHgxZik7CisJCXN3aXRjaCAobGFuX2lkeCkgeworCQkJY2FzZSA3OgorCQkJCWlmKHZnYV9pZHggPD0gMjcpCisJCQkJCXJ4X3B3cl9hbGwgPSAtMTAwICsgMiooMjctdmdhX2lkeCk7IC8qVkdBX2lkeCA9IDI3fjIqLworCQkJCWVsc2UKKwkJCQkJcnhfcHdyX2FsbCA9IC0xMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJcnhfcHdyX2FsbCA9IC00OCArIDIqKDItdmdhX2lkeCk7IC8qVkdBX2lkeCA9IDJ+MCovCisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcnhfcHdyX2FsbCA9IC00MiArIDIqKDctdmdhX2lkeCk7IC8qVkdBX2lkeCA9IDd+NSovCisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcnhfcHdyX2FsbCA9IC0zNiArIDIqKDctdmdhX2lkeCk7IC8qVkdBX2lkeCA9IDd+NCovCisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJcnhfcHdyX2FsbCA9IC0yNCArIDIqKDctdmdhX2lkeCk7IC8qVkdBX2lkeCA9IDd+MCovCisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaWYoY2NrX2hpZ2hwd3IpCisJCQkJCXJ4X3B3cl9hbGwgPSAtMTIgKyAyKig1LXZnYV9pZHgpOyAvKlZHQV9pZHggPSA1fjAqLworCQkJCWVsc2UKKwkJCQkJcnhfcHdyX2FsbCA9IC02KyAyKig1LXZnYV9pZHgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXJ4X3B3cl9hbGwgPSA4LTIqdmdhX2lkeDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQlyeF9wd3JfYWxsID0gMTQtMip2Z2FfaWR4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQlyeF9wd3JfYWxsICs9IDY7CisJCXB3ZGJfYWxsID0gcnRsX3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKKwkJLyogQ0NLIGdhaW4gaXMgc21hbGxlciB0aGFuIE9GRE0vTUNTIGdhaW4sICAqLworCQkvKiBzbyB3ZSBhZGQgZ2FpbiBkaWZmIGJ5IGV4cGVyaWVuY2VzLAorCQkgKiB0aGUgdmFsIGlzIDYgKi8KKwkJcHdkYl9hbGwgKz0gNjsKKwkJaWYocHdkYl9hbGwgPiAxMDApCisJCQlwd2RiX2FsbCA9IDEwMDsKKwkJLyogbW9kaWZ5IHRoZSBvZmZzZXQgdG8gbWFrZSB0aGUgc2FtZQorCQkgKiBnYWluIGluZGV4IHdpdGggT0ZETS4gKi8KKwkJaWYocHdkYl9hbGwgPiAzNCAmJiBwd2RiX2FsbCA8PSA0MikKKwkJCXB3ZGJfYWxsIC09IDI7CisJCWVsc2UgaWYocHdkYl9hbGwgPiAyNiAmJiBwd2RiX2FsbCA8PSAzNCkKKwkJCXB3ZGJfYWxsIC09IDY7CisJCWVsc2UgaWYocHdkYl9hbGwgPiAxNCAmJiBwd2RiX2FsbCA8PSAyNikKKwkJCXB3ZGJfYWxsIC09IDg7CisJCWVsc2UgaWYocHdkYl9hbGwgPiA0ICYmIHB3ZGJfYWxsIDw9IDE0KQorCQkJcHdkYl9hbGwgLT0gNDsKKwkJaWYgKGNja19oaWdocHdyID09IGZhbHNlKXsKKwkJCWlmIChwd2RiX2FsbCA+PSA4MCkKKwkJCQlwd2RiX2FsbCA9KChwd2RiX2FsbC04MCk8PDEpKygocHdkYl9hbGwtODApPj4xKSs4MDsKKwkJCWVsc2UgaWYoKHB3ZGJfYWxsIDw9IDc4KSAmJiAocHdkYl9hbGwgPj0gMjApKQorCQkJCXB3ZGJfYWxsICs9IDM7CisJCQlpZihwd2RiX2FsbD4xMDApCisJCQkJcHdkYl9hbGwgPSAxMDA7CisJCX0KKworCQlwc3RhdHVzLT5yeF9wd2RiX2FsbCA9IHB3ZGJfYWxsOworCQlwc3RhdHVzLT5yZWN2c2lnbmFscG93ZXIgPSByeF9wd3JfYWxsOworCisJCS8qICgzKSBHZXQgU2lnbmFsIFF1YWxpdHkgKEVWTSkgKi8KKwkJaWYgKGJwYWNrZXRfbWF0Y2hfYnNzaWQpIHsKKwkJCXU4IHNxOworCisJCQlpZiAocHN0YXR1cy0+cnhfcHdkYl9hbGwgPiA0MCkKKwkJCQlzcSA9IDEwMDsKKwkJCWVsc2UgeworCQkJCXNxID0gY2NrX2J1Zi0+c3FfcnB0OworCQkJCWlmIChzcSA+IDY0KQorCQkJCQlzcSA9IDA7CisJCQkJZWxzZSBpZiAoc3EgPCAyMCkKKwkJCQkJc3EgPSAxMDA7CisJCQkJZWxzZQorCQkJCQlzcSA9ICgoNjQgLSBzcSkgKiAxMDApIC8gNDQ7CisJCQl9CisKKwkJCXBzdGF0dXMtPnNpZ25hbHF1YWxpdHkgPSBzcTsKKwkJCXBzdGF0dXMtPnJ4X21pbW9fc2lnbmFscXVhbGl0eVswXSA9IHNxOworCQkJcHN0YXR1cy0+cnhfbWltb19zaWduYWxxdWFsaXR5WzFdID0gLTE7CisJCX0KKwl9IGVsc2UgeworCQlydGxwcml2LT5kbS5icmZwYXRoX3J4ZW5hYmxlWzBdID0KKwkJICAgIHJ0bHByaXYtPmRtLmJyZnBhdGhfcnhlbmFibGVbMV0gPSB0cnVlOworCisJCS8qICgxKUdldCBSU1NJIGZvciBIVCByYXRlICovCisJCWZvciAoaSA9IFJGOTBfUEFUSF9BOyBpIDwgUkY2MDUyX01BWF9QQVRIOyBpKyspIHsKKworCQkJLyogd2Ugd2lsbCBqdWRnZSBSRiBSWCBwYXRoIG5vdy4gKi8KKwkJCWlmIChydGxwcml2LT5kbS5icmZwYXRoX3J4ZW5hYmxlW2ldKQorCQkJCXJmX3J4X251bSsrOworCisJCQlyeF9wd3JbaV0gPSAoKHBfZHJ2aW5mby0+Z2Fpbl90cnN3W2ldICYgMHgzZikgKiAyKSAtIDExMDsKKworCQkJLyogVHJhbnNsYXRlIERCTSB0byBwZXJjZW50YWdlLiAqLworCQkJcnNzaSA9IHJ0bF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKKwkJCXRvdGFsX3Jzc2kgKz0gcnNzaTsKKworCQkJLyogR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQiAqLworCQkJcnRscHJpdi0+c3RhdHMucnhfc25yX2RiW2ldID0gKGxvbmcpKHBfZHJ2aW5mby0+cnhzbnJbaV0gLyAyKTsKKworCQkJLyogUmVjb3JkIFNpZ25hbCBTdHJlbmd0aCBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCWlmIChicGFja2V0X21hdGNoX2Jzc2lkKQorCQkJCXBzdGF0dXMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbaV0gPSAodTgpIHJzc2k7CisJCX0KKworCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5CisJCSAqIGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KKwkJcnhfcHdyX2FsbCA9ICgocF9kcnZpbmZvLT5wd2RiX2FsbCA+PiAxKSAmIDB4N2YpIC0gMTEwOworCisJCXB3ZGJfYWxsID0gcnRsX3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKKwkJcHN0YXR1cy0+cnhfcHdkYl9hbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXR1cy0+cnhwb3dlciA9IHJ4X3B3cl9hbGw7CisJCXBzdGF0dXMtPnJlY3ZzaWduYWxwb3dlciA9IHJ4X3B3cl9hbGw7CisKKwkJLyogKDMpRVZNIG9mIEhUIHJhdGUgKi8KKwkJaWYgKHBzdGF0dXMtPmJfaXNfaHQgJiYgcHN0YXR1cy0+cmF0ZSA+PSBERVNDX1JBVEVNQ1M4ICYmCisJCSAgICBwc3RhdHVzLT5yYXRlIDw9IERFU0NfUkFURU1DUzE1KQorCQkJbWF4X3NwYXRpYWxfc3RyZWFtID0gMjsKKwkJZWxzZQorCQkJbWF4X3NwYXRpYWxfc3RyZWFtID0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3NwYXRpYWxfc3RyZWFtOyBpKyspIHsKKwkJCWV2bSA9IHJ0bF9ldm1fZGJfdG9fcGVyY2VudGFnZShwX2RydmluZm8tPnJ4ZXZtW2ldKTsKKworCQkJaWYgKGJwYWNrZXRfbWF0Y2hfYnNzaWQpIHsKKwkJCQkvKiBGaWxsIHZhbHVlIGluIFJGRCwgR2V0IHRoZSBmaXJzdAorCQkJCSAqIHNwYXRpYWwgc3RyZWFtIG9ubHkgKi8KKwkJCQlpZiAoaSA9PSAwKQorCQkJCQlwc3RhdHVzLT5zaWduYWxxdWFsaXR5ID0gKHU4KSAoZXZtICYgMHhmZik7CisJCQkJcHN0YXR1cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W2ldID0gKHU4KSAoZXZtICYgMHhmZik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBVSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksCisJICogbWFrZSBpdCBnb29kIGxvb2tpbmcsIGZyb20gMH4xMDAuICovCisJaWYgKGJfaXNfY2NrKQorCQlwc3RhdHVzLT5zaWduYWxzdHJlbmd0aCA9ICh1OCkocnRsX3NpZ25hbF9zY2FsZV9tYXBwaW5nKGh3LAorCQkJcHdkYl9hbGwpKTsKKwllbHNlIGlmIChyZl9yeF9udW0gIT0gMCkKKwkJcHN0YXR1cy0+c2lnbmFsc3RyZW5ndGggPSAodTgpKHJ0bF9zaWduYWxfc2NhbGVfbWFwcGluZyhodywKKwkJCXRvdGFsX3Jzc2kgLz0gcmZfcnhfbnVtKSk7CisJLypIVyBhbnRlbm5hIGRpdmVyc2l0eSovCisJcnRsZG0tPmZhdF90YWJsZS5hbnRzZWxfcnhfa2VlcF8wID0gcF9waHlzdFJwdC0+YW50X3NlbDsKKwlydGxkbS0+ZmF0X3RhYmxlLmFudHNlbF9yeF9rZWVwXzEgPSBwX3BoeXN0UnB0LT5hbnRfc2VsX2I7CisJcnRsZG0tPmZhdF90YWJsZS5hbnRzZWxfcnhfa2VlcF8yID0gcF9waHlzdFJwdC0+YW50c2VsX3J4X2tlZXBfMjsKKworfQorI2lmIDAKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfc21hcnRfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwlzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHVzKQoreworCXN0cnVjdCBydGxfZG0gKnJ0bGRtPSBydGxfZG0ocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9cnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggYW50c2VsX3RyX211eDsKKwlzdHJ1Y3QgZmFzdF9hbnRfdHJhaW5uaW5nICpwZmF0X3RhYmxlID0gJihydGxkbS0+ZmF0X3RhYmxlKTsKKworCWlmIChydGxlZnVzZS0+YW50ZW5uYV9kaXZfdHlwZSA9PSBDR19UUlhfU01BUlRfQU5URElWKSB7CisJCWlmIChwZmF0X3RhYmxlLT5mYXRfc3RhdGUgPT0gRkFUX1RSQUlOSU5HX1NUQVRFKSB7CisJCQlpZiAocHN0YXR1cy0+Yl9wYWNrZXRfdG9zZWxmKSB7CisJCQkJYW50c2VsX3RyX211eCA9IChwZmF0X3RhYmxlLT5hbnRzZWxfcnhfa2VlcF8yIDw8IDIpIHwKKwkJCQkJKHBmYXRfdGFibGUtPmFudHNlbF9yeF9rZWVwXzEgPDwgMSkgfCBwZmF0X3RhYmxlLT5hbnRzZWxfcnhfa2VlcF8wOworCQkJCXBmYXRfdGFibGUtPmFudF9zdW1fcnNzaVthbnRzZWxfdHJfbXV4XSArPSBwc3RhdHVzLT5yeF9wd2RiX2FsbDsKKwkJCQlwZmF0X3RhYmxlLT5hbnRfcnNzaV9jbnRbYW50c2VsX3RyX211eF0rKzsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKHJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl90eXBlID09IENHX1RSWF9IV19BTlRESVYpIHx8CisJKHJ0bGVmdXNlLT5hbnRlbm5hX2Rpdl90eXBlID09IENHQ1NfUlhfSFdfQU5URElWKSkgeworCQlpZiAocHN0YXR1cy0+Yl9wYWNrZXRfdG9zZWxmIHx8IHBzdGF0dXMtPmJfcGFja2V0X21hdGNoYnNzaWQpIHsKKwkJCWFudHNlbF90cl9tdXggPSAocGZhdF90YWJsZS0+YW50c2VsX3J4X2tlZXBfMiA8PCAyKSB8CisJCQkJCShwZmF0X3RhYmxlLT5hbnRzZWxfcnhfa2VlcF8xIDw8IDEpIHwgcGZhdF90YWJsZS0+YW50c2VsX3J4X2tlZXBfMDsKKwkJCXJ0bDg4MjFhZV9kbV9hbnRfc2VsX3N0YXRpc3RpY3MoaHcsIGFudHNlbF90cl9tdXgsIDAsIHBzdGF0dXMtPnJ4X3B3ZGJfYWxsKTsKKwkJfQorCisJfQorfQorI2VuZGlmCitzdGF0aWMgdm9pZCBfcnRsODgyMWFlX3RyYW5zbGF0ZV9yeF9zaWduYWxfc3R1ZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydGxfc3RhdHMgKnBzdGF0dXMsCisJCXU4ICpwZGVzYywgc3RydWN0IHJ4X2Z3aW5mb184ODIxYWUgKnBfZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCAqdG1wX2J1ZjsKKwl1OCAqcHJhZGRyOworCXU4ICpwc2FkZHI7CisJdTE2IGZjLCB0eXBlOworCWJvb2wgYl9wYWNrZXRfbWF0Y2hic3NpZCwgYl9wYWNrZXRfdG9zZWxmLCBiX3BhY2tldF9iZWFjb247CisKKwl0bXBfYnVmID0gc2tiLT5kYXRhICsgcHN0YXR1cy0+cnhfZHJ2aW5mb19zaXplICsgcHN0YXR1cy0+cnhfYnVmc2hpZnQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0bXBfYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJcHJhZGRyID0gaGRyLT5hZGRyMTsKKwlwc2FkZHIgPSBpZWVlODAyMTFfZ2V0X1NBKGhkcik7CisJbWVtY3B5KHBzdGF0dXMtPnBzYWRkciwgcHNhZGRyLCBFVEhfQUxFTik7CisKKwliX3BhY2tldF9tYXRjaGJzc2lkID0gKChJRUVFODAyMTFfRlRZUEVfQ1RMICE9IHR5cGUpICYmCisJICAgICAoIWV0aGVyX2FkZHJfZXF1YWwobWFjLT5ic3NpZCwgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgPworCQkJCSAgaGRyLT5hZGRyMSA6IChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgPworCQkJCSAgaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKSAmJiAoIXBzdGF0dXMtPmJfaHdlcnJvcikgJiYKKwkJCQkgICghcHN0YXR1cy0+Yl9jcmMpICYmICghcHN0YXR1cy0+Yl9pY3YpKTsKKworCWJfcGFja2V0X3Rvc2VsZiA9IGJfcGFja2V0X21hdGNoYnNzaWQgJiYKKwkgICAgKCFldGhlcl9hZGRyX2VxdWFsKHByYWRkciwgcnRsZWZ1c2UtPmRldl9hZGRyKSk7CisKKwlpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykpCisJCWJfcGFja2V0X2JlYWNvbiA9IHRydWU7CisJZWxzZQorCQliX3BhY2tldF9iZWFjb24gPSBmYWxzZTsKKworCWlmIChiX3BhY2tldF9iZWFjb24gJiYgYl9wYWNrZXRfbWF0Y2hic3NpZCkKKwkJcnRsX3ByaXYoaHcpLT5kbS5kYmdpbmZvLm51bV9xcnlfYmVhY29uX3BrdCsrOworCisJX3J0bDg4MjFhZV9xdWVyeV9yeHBoeXN0YXR1cyhodywgcHN0YXR1cywgcGRlc2MsIHBfZHJ2aW5mbywKKwkJCQkgICBiX3BhY2tldF9tYXRjaGJzc2lkLCBiX3BhY2tldF90b3NlbGYsCisJCQkJICAgYl9wYWNrZXRfYmVhY29uKTsKKwkvKl9ydGw4ODIxYWVfc21hcnRfYW50ZW5uYShodywgcHN0YXR1cyk7ICovCisJcnRsX3Byb2Nlc3NfcGh5aW5mbyhodywgdG1wX2J1ZiwgcHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw4ODIxYWVfaW5zZXJ0X2VtY29udGVudChzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MsCisJCQkJICAgICAgdTggKnZpcnR1YWxhZGRyZXNzKQoreworCXUzMiBkd3RtcCA9IDA7CisJbWVtc2V0KHZpcnR1YWxhZGRyZXNzLCAwLCA4KTsKKworCVNFVF9FQVJMWU1PREVfUEtUTlVNKHZpcnR1YWxhZGRyZXNzLCBwdGNiX2Rlc2MtPmVtcGt0X251bSk7CisJaWYgKHB0Y2JfZGVzYy0+ZW1wa3RfbnVtID09IDEpCisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bMF07CisJZWxzZSB7CisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bMF07CisJCWR3dG1wICs9ICgoZHd0bXAlNCk/KDQtZHd0bXAlNCk6MCkrNDsKKwkJZHd0bXAgKz0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bMV07CisJfQorCVNFVF9FQVJMWU1PREVfTEVOMCh2aXJ0dWFsYWRkcmVzcywgZHd0bXApOworCisJaWYgKHB0Y2JfZGVzYy0+ZW1wa3RfbnVtIDw9IDMpCisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bMl07CisJZWxzZSB7CisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bMl07CisJCWR3dG1wICs9ICgoZHd0bXAlNCk/KDQtZHd0bXAlNCk6MCkrNDsKKwkJZHd0bXAgKz0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bM107CisJfQorCVNFVF9FQVJMWU1PREVfTEVOMSh2aXJ0dWFsYWRkcmVzcywgZHd0bXApOworCWlmIChwdGNiX2Rlc2MtPmVtcGt0X251bSA8PSA1KQorCQlkd3RtcCA9IHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzRdOworCWVsc2UgeworCQlkd3RtcCA9IHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzRdOworCQlkd3RtcCArPSAoKGR3dG1wJTQpPyg0LWR3dG1wJTQpOjApKzQ7CisJCWR3dG1wICs9IHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzVdOworCX0KKwlTRVRfRUFSTFlNT0RFX0xFTjJfMSh2aXJ0dWFsYWRkcmVzcywgZHd0bXAgJiAweEYpOworCVNFVF9FQVJMWU1PREVfTEVOMl8yKHZpcnR1YWxhZGRyZXNzLCBkd3RtcCA+PiA0KTsKKwlpZiAocHRjYl9kZXNjLT5lbXBrdF9udW0gPD0gNykKKwkJZHd0bXAgPSBwdGNiX2Rlc2MtPmVtcGt0X2xlbls2XTsKKwllbHNlIHsKKwkJZHd0bXAgPSBwdGNiX2Rlc2MtPmVtcGt0X2xlbls2XTsKKwkJZHd0bXAgKz0gKChkd3RtcCU0KT8oNC1kd3RtcCU0KTowKSs0OworCQlkd3RtcCArPSBwdGNiX2Rlc2MtPmVtcGt0X2xlbls3XTsKKwl9CisJU0VUX0VBUkxZTU9ERV9MRU4zKHZpcnR1YWxhZGRyZXNzLCBkd3RtcCk7CisJaWYgKHB0Y2JfZGVzYy0+ZW1wa3RfbnVtIDw9IDkpCisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bOF07CisJZWxzZSB7CisJCWR3dG1wID0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bOF07CisJCWR3dG1wICs9ICgoZHd0bXAlNCk/KDQtZHd0bXAlNCk6MCkrNDsKKwkJZHd0bXAgKz0gcHRjYl9kZXNjLT5lbXBrdF9sZW5bOV07CisJfQorCVNFVF9FQVJMWU1PREVfTEVONCh2aXJ0dWFsYWRkcmVzcywgZHd0bXApOworfQorCitib29sIHJ0bDg4MjFhZV9yeF9xdWVyeV9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgc3RydWN0IHJ0bF9zdGF0cyAqc3RhdHVzLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKKwkJCSAgIHU4ICpwZGVzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ4X2Z3aW5mb184ODIxYWUgKnBfZHJ2aW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJdTMyIHBoeXN0YXR1cyA9IEdFVF9SWF9ERVNDX1BIWVNUKHBkZXNjKTsKKworCXN0YXR1cy0+bGVuZ3RoID0gKHUxNikgR0VUX1JYX0RFU0NfUEtUX0xFTihwZGVzYyk7CisJc3RhdHVzLT5yeF9kcnZpbmZvX3NpemUgPSAodTgpIEdFVF9SWF9ERVNDX0RSVl9JTkZPX1NJWkUocGRlc2MpICoKKwkgICAgUlhfRFJWX0lORk9fU0laRV9VTklUOworCXN0YXR1cy0+cnhfYnVmc2hpZnQgPSAodTgpIChHRVRfUlhfREVTQ19TSElGVChwZGVzYykgJiAweDAzKTsKKwlzdGF0dXMtPmJfaWN2ID0gKHUxNikgR0VUX1JYX0RFU0NfSUNWKHBkZXNjKTsKKwlzdGF0dXMtPmJfY3JjID0gKHUxNikgR0VUX1JYX0RFU0NfQ1JDMzIocGRlc2MpOworCXN0YXR1cy0+Yl9od2Vycm9yID0gKHN0YXR1cy0+Yl9jcmMgfCBzdGF0dXMtPmJfaWN2KTsKKwlzdGF0dXMtPmRlY3J5cHRlZCA9ICFHRVRfUlhfREVTQ19TV0RFQyhwZGVzYyk7CisJc3RhdHVzLT5yYXRlID0gKHU4KSBHRVRfUlhfREVTQ19SWE1DUyhwZGVzYyk7CisJc3RhdHVzLT5iX3Nob3J0cHJlYW1ibGUgPSAodTE2KSBHRVRfUlhfREVTQ19TUExDUChwZGVzYyk7CisJc3RhdHVzLT5iX2lzYW1wZHUgPSAoYm9vbCkgKEdFVF9SWF9ERVNDX1BBR0dSKHBkZXNjKSA9PSAxKTsKKwlzdGF0dXMtPmJfaXNmaXJzdF9hbXBkdSA9IChib29sKSAoR0VUX1JYX0RFU0NfUEFHR1IocGRlc2MpID09IDEpOworCXN0YXR1cy0+dGltZXN0YW1wX2xvdyA9IEdFVF9SWF9ERVNDX1RTRkwocGRlc2MpOworCXN0YXR1cy0+cnhfaXM0ME1oenBhY2tldCA9IChib29sKSBHRVRfUlhfREVTQ19CVyhwZGVzYyk7CisJc3RhdHVzLT5tYWNpZCA9IEdFVF9SWF9ERVNDX01BQ0lEKHBkZXNjKTsKKwlzdGF0dXMtPmJfaXNfaHQgPSAoYm9vbClHRVRfUlhfREVTQ19SWEhUKHBkZXNjKTsKKworCXN0YXR1cy0+Yl9pc19jY2sgPSBSWF9IQUxfSVNfQ0NLX1JBVEUoc3RhdHVzLT5yYXRlKTsKKworCWlmIChHRVRfUlhfU1RBVFVTX0RFU0NfUlBUX1NFTChwZGVzYykpCisJCXN0YXR1cy0+cGFja2V0X3JlcG9ydF90eXBlID0gQzJIX1BBQ0tFVDsKKwllbHNlCisJCXN0YXR1cy0+cGFja2V0X3JlcG9ydF90eXBlID0gTk9STUFMX1JYOworCisJaWYgKEdFVF9SWF9TVEFUVVNfREVTQ19QQVRURVJOX01BVENIKHBkZXNjKSkKKwkJc3RhdHVzLT53YWtlX21hdGNoID0gQklUKDIpOworCWVsc2UgaWYgKEdFVF9SWF9TVEFUVVNfREVTQ19NQUdJQ19NQVRDSChwZGVzYykpCisJCXN0YXR1cy0+d2FrZV9tYXRjaCA9IEJJVCgxKTsKKwllbHNlIGlmIChHRVRfUlhfU1RBVFVTX0RFU0NfVU5JQ0FTVF9NQVRDSChwZGVzYykpCisJCXN0YXR1cy0+d2FrZV9tYXRjaCA9IEJJVCgwKTsKKwllbHNlCisJCXN0YXR1cy0+d2FrZV9tYXRjaCA9IDA7CisKKwlpZiAoc3RhdHVzLT53YWtlX21hdGNoKQorCQlSVF9UUkFDRShDT01QX1JYREVTQyxEQkdfTE9VRCwKKwkJKCJHR0dHR0dHR0dHR0dHZXQgV2FrZXVwIFBhY2tldCEhIFdha2VNYXRjaD0lZFxuIixzdGF0dXMtPndha2VfbWF0Y2ggKSk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorCXJ4X3N0YXR1cy0+ZnJlcSA9IGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+Y2VudGVyX2ZyZXE7CisJcnhfc3RhdHVzLT5iYW5kID0gaHctPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOworI2Vsc2UKKwlyeF9zdGF0dXMtPmZyZXEgPSBody0+Y29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcTsKKwlyeF9zdGF0dXMtPmJhbmQgPSBody0+Y29uZi5jaGFubmVsLT5iYW5kOworI2VuZGlmCisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoc2tiLT5kYXRhICsgc3RhdHVzLT5yeF9kcnZpbmZvX3NpemUKKwkJCSsgc3RhdHVzLT5yeF9idWZzaGlmdCk7CisKKwlpZiAoc3RhdHVzLT5iX2NyYykKKwkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CisKKwlpZiAoc3RhdHVzLT5yeF9pczQwTWh6cGFja2V0KQorCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR180ME1IWjsKKworCWlmIChzdGF0dXMtPmJfaXNfaHQpCisJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOworCisJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfTUFDVElNRV9NUERVOworCisJLyogaHcgd2lsbCBzZXQgc3RhdHVzLT5kZWNyeXB0ZWQgdHJ1ZSwgaWYgaXQgZmluZHMgdGhlCisJICogZnJhbWUgaXMgb3BlbiBkYXRhIGZyYW1lIG9yIG1nbXQgZnJhbWUuICovCisJLyogU28gaHcgd2lsbCBub3QgZGVjcnlwdGlvbiByb2J1c3QgbWFuYWdtZW50IGZyYW1lCisJICogZm9yIElFRUU4MDIxMXcgYnV0IHN0aWxsIHNldCBzdGF0dXMtPmRlY3J5cHRlZAorCSAqIHRydWUsIHNvIGhlcmUgd2Ugc2hvdWxkIHNldCBpdCBiYWNrIHRvIHVuZGVjcnlwdGVkCisJICogZm9yIElFRUU4MDIxMXcgZnJhbWUsIGFuZCBtYWM4MDIxMSBzdyB3aWxsIGhlbHAKKwkgKiB0byBkZWNyeXB0IGl0ICovCisJaWYgKHN0YXR1cy0+ZGVjcnlwdGVkKSB7CisJCWlmICghaGRyKSB7CisJCQlXQVJOX09OX09OQ0UodHJ1ZSk7CisJCQlwcl9lcnIoImRlY3J5cHRlZCBpcyB0cnVlIGJ1dCBoZHIgTlVMTCwgZnJvbSBza2IgJXBcbiIsCisJCQkJcnRsX2dldF9oZHIoc2tiKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKChpZWVlODAyMTFfaXNfcm9idXN0X21nbXRfZnJhbWUoaGRyKSkgJiYKKwkJCShpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpKSkKKwkJCXJ4X3N0YXR1cy0+ZmxhZyAmPSB+UlhfRkxBR19ERUNSWVBURUQ7CisJCWVsc2UKKwkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKKwl9CisKKwkvKiByYXRlX2lkeDogaW5kZXggb2YgZGF0YSByYXRlIGludG8gYmFuZCdzCisJICogc3VwcG9ydGVkIHJhdGVzIG9yIE1DUyBpbmRleCBpZiBIVCByYXRlcworCSAqIGFyZSB1c2UgKFJYX0ZMQUdfSFQpKi8KKwkvKiBOb3RpY2U6IHRoaXMgaXMgZGlmZiB3aXRoIHdpbmRvd3MgZGVmaW5lICovCisJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IF9ydGw4ODIxYWVfcmF0ZV9tYXBwaW5nKGh3LAorCQkJCXN0YXR1cy0+Yl9pc19odCwgc3RhdHVzLT5yYXRlKTsKKworCXJ4X3N0YXR1cy0+bWFjdGltZSA9IHN0YXR1cy0+dGltZXN0YW1wX2xvdzsKKwlpZiAocGh5c3RhdHVzID09IHRydWUpIHsKKwkJcF9kcnZpbmZvID0gKHN0cnVjdCByeF9md2luZm9fODgyMWFlICopKHNrYi0+ZGF0YSArCisJCQkJCQkgICAgIHN0YXR1cy0+cnhfYnVmc2hpZnQpOworCisJCV9ydGw4ODIxYWVfdHJhbnNsYXRlX3J4X3NpZ25hbF9zdHVmZihodywKKwkJCQkJCSAgIHNrYiwgc3RhdHVzLCBwZGVzYywKKwkJCQkJCSAgIHBfZHJ2aW5mbyk7CisJfQorCisJLypyeF9zdGF0dXMtPnF1YWwgPSBzdGF0dXMtPnNpZ25hbDsgKi8KKwlyeF9zdGF0dXMtPnNpZ25hbCA9IHN0YXR1cy0+cmVjdnNpZ25hbHBvd2VyICsgMTA7CisJLypyeF9zdGF0dXMtPm5vaXNlID0gLXN0YXR1cy0+bm9pc2U7ICovCisJaWYgKHN0YXR1cy0+cGFja2V0X3JlcG9ydF90eXBlID09IFRYX1JFUE9SVDIpeworCQlzdGF0dXMtPm1hY2lkX3ZhbGlkX2VudHJ5WzBdID0gR0VUX1JYX1JQVDJfREVTQ19NQUNJRF9WQUxJRF8xKHBkZXNjKTsKKwkJc3RhdHVzLT5tYWNpZF92YWxpZF9lbnRyeVsxXSA9IEdFVF9SWF9SUFQyX0RFU0NfTUFDSURfVkFMSURfMihwZGVzYyk7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKK3ZvaWQgcnRsODgyMWFlX3R4X2ZpbGxfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgdTggKnBkZXNjX3R4LCB1OCAqdHhiZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICB1OCBod19xdWV1ZSwgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKQorI2Vsc2UKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCit2b2lkIHJ0bDg4MjFhZV90eF9maWxsX2Rlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHU4ICpwZGVzY190eCwgdTggKnR4YmQsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgdTggaHdfcXVldWUsIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYykKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGluZm8tPmNvbnRyb2wuc3RhOworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCXU4ICpwZGVzYyA9ICh1OCAqKSBwZGVzY190eDsKKwl1MTYgc2VxX251bWJlcjsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBidWZfbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgc2tiX2xlbiA9IHNrYi0+bGVuOworCXU4IGZ3X3FzZWwgPSBfcnRsODgyMWFlX21hcF9od3F1ZXVlX3RvX2Z3cXVldWUoc2tiLCBod19xdWV1ZSk7CisJYm9vbCBiX2ZpcnN0c2VnID0gKChoZHItPnNlcV9jdHJsICYKKwkJCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfU0NUTF9GUkFHKSkgPT0gMCk7CisJYm9vbCBiX2xhc3RzZWcgPSAoKGhkci0+ZnJhbWVfY29udHJvbCAmCisJCQkgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSA9PSAwKTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTggYndfNDAgPSAwOworCXU4IHNob3J0X2dpID0gMDsKKworCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCWJ3XzQwID0gbWFjLT5id180MDsKKwl9IGVsc2UgaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCWlmIChzdGEpCisJCQlid180MCA9IHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCX0KKwlzZXFfbnVtYmVyID0gKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OworCXJ0bF9nZXRfdGNiX2Rlc2MoaHcsIGluZm8sIHN0YSwgc2tiLCBwdGNiX2Rlc2MpOworCS8qIHJlc2VydmUgOCBieXRlIGZvciBBTVBEVSBlYXJseSBtb2RlICovCisJaWYgKHJ0bGhhbC0+Yl9lYXJseW1vZGVfZW5hYmxlKSB7CisJCXNrYl9wdXNoKHNrYiwgRU1fSERSX0xFTik7CisJCW1lbXNldChza2ItPmRhdGEsIDAsIEVNX0hEUl9MRU4pOworCX0KKwlidWZfbGVuID0gc2tiLT5sZW47CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihydGxwY2ktPnBkZXYsIG1hcHBpbmcpKSB7CisJCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX1RSQUNFLAorCQkJICgiRE1BIG1hcHBpbmcgZXJyb3IiKSk7CisJCXJldHVybjsKKwl9CisJQ0xFQVJfUENJX1RYX0RFU0NfQ09OVEVOVChwZGVzYywgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjXzg4MjFhZSkpOworCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoZmMpIHx8IGllZWU4MDIxMV9pc19jdGwoZmMpKSB7CisJCWJfZmlyc3RzZWcgPSB0cnVlOworCQliX2xhc3RzZWcgPSB0cnVlOworCX0KKwlpZiAoYl9maXJzdHNlZykgeworCQlpZiAocnRsaGFsLT5iX2Vhcmx5bW9kZV9lbmFibGUpIHsKKwkJCVNFVF9UWF9ERVNDX1BLVF9PRkZTRVQocGRlc2MsIDEpOworCQkJU0VUX1RYX0RFU0NfT0ZGU0VUKHBkZXNjLCBVU0JfSFdERVNDX0hFQURFUl9MRU4gKyBFTV9IRFJfTEVOKTsKKwkJCWlmIChwdGNiX2Rlc2MtPmVtcGt0X251bSkgeworCQkJCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX1RSQUNFLAorCQkJCQkgKCJJbnNlcnQgOCBieXRlLnBUY2ItPkVNUGt0TnVtOiVkXG4iLAorCQkJCQkgIHB0Y2JfZGVzYy0+ZW1wa3RfbnVtKSk7CisJCQkJX3J0bDg4MjFhZV9pbnNlcnRfZW1jb250ZW50KHB0Y2JfZGVzYywgKHU4ICopKHNrYi0+ZGF0YSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJU0VUX1RYX0RFU0NfT0ZGU0VUKHBkZXNjLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCQl9CisKKwkJLyogcHRjYl9kZXNjLT51c2VfZHJpdmVyX3JhdGUgPSB0cnVlOyAqLworCQlTRVRfVFhfREVTQ19UWF9SQVRFKHBkZXNjLCBwdGNiX2Rlc2MtPmh3X3JhdGUpOworCQlpZiAocHRjYl9kZXNjLT5od19yYXRlID4gREVTQ19SQVRFTUNTMCkgeworCQkJc2hvcnRfZ2kgPSAocHRjYl9kZXNjLT51c2Vfc2hvcnRnaSkgPyAxIDogMDsKKwkJfSBlbHNlIHsKKwkJCXNob3J0X2dpID0gKHB0Y2JfZGVzYy0+dXNlX3Nob3J0cHJlYW1ibGUpID8gMSA6MDsKKwkJfQorCQlTRVRfVFhfREVTQ19EQVRBX1NIT1JUR0kocGRlc2MsIHNob3J0X2dpKTsKKworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7CisJCQlTRVRfVFhfREVTQ19BR0dfRU5BQkxFKHBkZXNjLCAxKTsKKwkJCVNFVF9UWF9ERVNDX01BWF9BR0dfTlVNKHBkZXNjLCAweDE0KTsKKwkJfQorCQlTRVRfVFhfREVTQ19TRVEocGRlc2MsIHNlcV9udW1iZXIpOworCQlTRVRfVFhfREVTQ19SVFNfRU5BQkxFKHBkZXNjLCAoKHB0Y2JfZGVzYy0+Yl9ydHNfZW5hYmxlICYmCisJCQkJCQkhcHRjYl9kZXNjLT5iX2N0c19lbmFibGUpID8gMSA6IDApKTsKKwkJU0VUX1RYX0RFU0NfSFdfUlRTX0VOQUJMRShwZGVzYywwKTsKKwkJU0VUX1RYX0RFU0NfQ1RTMlNFTEYocGRlc2MsICgocHRjYl9kZXNjLT5iX2N0c19lbmFibGUpID8gMSA6IDApKTsKKwkvKglTRVRfVFhfREVTQ19SVFNfU1RCQyhwZGVzYywgKChwdGNiX2Rlc2MtPmJfcnRzX3N0YmMpID8gMSA6IDApKTsqLworCisJCVNFVF9UWF9ERVNDX1JUU19SQVRFKHBkZXNjLCBwdGNiX2Rlc2MtPnJ0c19yYXRlKTsKKwkvKglTRVRfVFhfREVTQ19SVFNfQlcocGRlc2MsIDApOyovCisJCVNFVF9UWF9ERVNDX1JUU19TQyhwZGVzYywgcHRjYl9kZXNjLT5ydHNfc2MpOworCQlTRVRfVFhfREVTQ19SVFNfU0hPUlQocGRlc2MsICgocHRjYl9kZXNjLT5ydHNfcmF0ZSA8PSBERVNDX1JBVEU1NE0pID8KKwkJCShwdGNiX2Rlc2MtPmJfcnRzX3VzZV9zaG9ydHByZWFtYmxlID8gMSA6IDApIDoKKwkJCShwdGNiX2Rlc2MtPmJfcnRzX3VzZV9zaG9ydGdpID8gMSA6IDApKSk7CisKKwkJaWYocHRjYl9kZXNjLT5idHhfZW5hYmxlX3N3X2NhbGNfZHVyYXRpb24pCisJCQlTRVRfVFhfREVTQ19OQVZfVVNFX0hEUihwZGVzYywgMSk7CisKKwkJaWYgKGJ3XzQwKSB7CisJCQlpZiAocHRjYl9kZXNjLT5iX3BhY2tldF9idykgeworCQkJCVNFVF9UWF9ERVNDX0RBVEFfQlcocGRlc2MsIDEpOworCQkJCVNFVF9UWF9ERVNDX1RYX1NVQl9DQVJSSUVSKHBkZXNjLCAzKTsKKwkJCX0gZWxzZSB7CisJCQkJU0VUX1RYX0RFU0NfREFUQV9CVyhwZGVzYywgMCk7CisJCQkJU0VUX1RYX0RFU0NfVFhfU1VCX0NBUlJJRVIocGRlc2MsIG1hYy0+Y3VyXzQwX3ByaW1lX3NjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNFVF9UWF9ERVNDX0RBVEFfQlcocGRlc2MsIDApOworCQkJU0VUX1RYX0RFU0NfVFhfU1VCX0NBUlJJRVIocGRlc2MsIDApOworCQl9CisKKwkJU0VUX1RYX0RFU0NfTElOSVAocGRlc2MsIDApOworCQlTRVRfVFhfREVTQ19QS1RfU0laRShwZGVzYywgKHUxNikgc2tiX2xlbik7CisJCWlmIChzdGEpIHsKKwkJCXU4IGFtcGR1X2RlbnNpdHkgPSBzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5OworCQkJU0VUX1RYX0RFU0NfQU1QRFVfREVOU0lUWShwZGVzYywgYW1wZHVfZGVuc2l0eSk7CisJCX0KKwkJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mID0gaW5mby0+Y29udHJvbC5od19rZXk7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpKQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkJCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7CisJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCQkJU0VUX1RYX0RFU0NfU0VDX1RZUEUocGRlc2MsIDB4MSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCQkJU0VUX1RYX0RFU0NfU0VDX1RZUEUocGRlc2MsIDB4Myk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNFVF9UWF9ERVNDX1NFQ19UWVBFKHBkZXNjLCAweDApOworCQkJCWJyZWFrOworCisJCQl9CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjZWxzZQorCQkJc3dpdGNoIChrZXljb25mLT5hbGcpIHsKKwkJCWNhc2UgQUxHX1dFUDoKKwkJCWNhc2UgQUxHX1RLSVA6CisJCQkJU0VUX1RYX0RFU0NfU0VDX1RZUEUocGRlc2MsIDB4MSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFMR19DQ01QOgorCQkJCVNFVF9UWF9ERVNDX1NFQ19UWVBFKHBkZXNjLCAweDMpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlTRVRfVFhfREVTQ19TRUNfVFlQRShwZGVzYywgMHgwKTsKKwkJCQlicmVhazsKKworCQkJfQorI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCQl9CisKKwkJU0VUX1RYX0RFU0NfUVVFVUVfU0VMKHBkZXNjLCBmd19xc2VsKTsKKwkJU0VUX1RYX0RFU0NfREFUQV9SQVRFX0ZCX0xJTUlUKHBkZXNjLCAweDFGKTsKKwkJU0VUX1RYX0RFU0NfUlRTX1JBVEVfRkJfTElNSVQocGRlc2MsIDB4Rik7CisJCVNFVF9UWF9ERVNDX0RJU0FCTEVfRkIocGRlc2MsIHB0Y2JfZGVzYy0+ZGlzYWJsZV9yYXRlZmFsbGJhY2sgPyAxIDogMCk7CisJCVNFVF9UWF9ERVNDX1VTRV9SQVRFKHBkZXNjLCBwdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSA/IDEgOiAwKTsKKworI2lmIDAKKwkJU0VUX1RYX0RFU0NfVVNFX1JBVEUocGRlc2MsIDEpOworCQlTRVRfVFhfREVTQ19UWF9SQVRFKHBkZXNjLCAweDA0KTsKKworCQlTRVRfVFhfREVTQ19SRVRSWV9MSU1JVF9FTkFCTEUocGRlc2MsIDEpOworCQlTRVRfVFhfREVTQ19EQVRBX1JFVFJZX0xJTUlUKHBkZXNjLCAweDNmKTsKKyNlbmRpZgorCisJCS8qU0VUX1RYX0RFU0NfUFdSX1NUQVRVUyhwZGVzYywgcHdyX3N0YXR1cyk7Ki8KKwkJLyogU2V0IFR4UmF0ZSBhbmQgUlRTUmF0ZSBpbiBUeERlc2MgICovCisJCS8qIFRoaXMgcHJldmVudCBUeCBpbml0aWFsIHJhdGUgb2YgbmV3LWNvbWluZyBwYWNrZXRzICovCisJCS8qIGZyb20gYmVpbmcgb3ZlcndyaXR0ZW4gYnkgcmV0cmllZCAgcGFja2V0IHJhdGUuKi8KKwkJaWYgKCFwdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSkgeworCQkJLypTRVRfVFhfREVTQ19SVFNfUkFURShwZGVzYywgMHgwOCk7ICovCisJCQkvKiBTRVRfVFhfREVTQ19UWF9SQVRFKHBkZXNjLCAweDBiKTsgKi8KKwkJfQorCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQkJaWYgKG1hYy0+cmRnX2VuKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9TRU5ELCBEQkdfVFJBQ0UsCisJCQkJCSgiRW5hYmxlIFJERyBmdW5jdGlvbi5cbiIpKTsKKwkJCQlTRVRfVFhfREVTQ19SREdfRU5BQkxFKHBkZXNjLCAxKTsKKwkJCQlTRVRfVFhfREVTQ19IVEMocGRlc2MsIDEpOworCQkJfQorCQl9CisJfQorCisJU0VUX1RYX0RFU0NfRklSU1RfU0VHKHBkZXNjLCAoYl9maXJzdHNlZyA/IDEgOiAwKSk7CisJU0VUX1RYX0RFU0NfTEFTVF9TRUcocGRlc2MsIChiX2xhc3RzZWcgPyAxIDogMCkpOworCVNFVF9UWF9ERVNDX1RYX0JVRkZFUl9TSVpFKHBkZXNjLCAodTE2KSBidWZfbGVuKTsKKwlTRVRfVFhfREVTQ19UWF9CVUZGRVJfQUREUkVTUyhwZGVzYywgY3B1X3RvX2xlMzIobWFwcGluZykpOworCS8vaWYgKHJ0bHByaXYtPmRtLmJfdXNlcmFtYXNrKSB7CisJaWYoMSl7CisJCVNFVF9UWF9ERVNDX1JBVEVfSUQocGRlc2MsIHB0Y2JfZGVzYy0+cmF0cl9pbmRleCk7CisJCVNFVF9UWF9ERVNDX01BQ0lEKHBkZXNjLCBwdGNiX2Rlc2MtPm1hY19pZCk7CisJfSBlbHNlIHsKKwkJU0VUX1RYX0RFU0NfUkFURV9JRChwZGVzYywgMHhDICsgcHRjYl9kZXNjLT5yYXRyX2luZGV4KTsKKwkJU0VUX1RYX0RFU0NfTUFDSUQocGRlc2MsIHB0Y2JfZGVzYy0+bWFjX2lkKTsKKwl9CisvKglpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkKKwkJU0VUX1RYX0RFU0NfUU9TKHBkZXNjLCAxKTsKKyovCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSAgeworCQlTRVRfVFhfREVTQ19IV1NFUV9FTihwZGVzYywgMSk7CisJCVNFVF9UWF9ERVNDX0hXU0VRX1NFTChwZGVzYywgMCk7CisJfQorCVNFVF9UWF9ERVNDX01PUkVfRlJBRyhwZGVzYywgKGJfbGFzdHNlZyA/IDAgOiAxKSk7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9nZXRfREEoaGRyKSkgfHwKKwkgICAgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2dldF9EQShoZHIpKSkgeworCQlTRVRfVFhfREVTQ19CTUMocGRlc2MsIDEpOworCX0KKworCXJ0bDg4MjFhZV9kbV9zZXRfdHhfYW50X2J5X3R4X2luZm8oaHcscGRlc2MscHRjYl9kZXNjLT5tYWNfaWQpOworCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX1RSQUNFLCAoIlxuIikpOworfQorCit2b2lkIHJ0bDg4MjFhZV90eF9maWxsX2NtZGRlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHU4ICpwZGVzYywgYm9vbCBiX2ZpcnN0c2VnLAorCQkJICAgICBib29sIGJfbGFzdHNlZywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwl1OCBmd19xdWV1ZSA9IFFTTFRfQkVBQ09OOworCisJZG1hX2FkZHJfdCBtYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCQkgICAgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihydGxwY2ktPnBkZXYsIG1hcHBpbmcpKSB7CisJCVJUX1RSQUNFKENPTVBfU0VORCwgREJHX1RSQUNFLAorCQkJICgiRE1BIG1hcHBpbmcgZXJyb3IiKSk7CisJCXJldHVybjsKKwl9CisJQ0xFQVJfUENJX1RYX0RFU0NfQ09OVEVOVChwZGVzYywgVFhfREVTQ19TSVpFKTsKKworCVNFVF9UWF9ERVNDX0ZJUlNUX1NFRyhwZGVzYywgMSk7CisJU0VUX1RYX0RFU0NfTEFTVF9TRUcocGRlc2MsIDEpOworCisJU0VUX1RYX0RFU0NfUEtUX1NJWkUoKHU4ICopIHBkZXNjLCAodTE2KSAoc2tiLT5sZW4pKTsKKworCVNFVF9UWF9ERVNDX09GRlNFVChwZGVzYywgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKworCVNFVF9UWF9ERVNDX1VTRV9SQVRFKHBkZXNjLCAxKTsKKwlTRVRfVFhfREVTQ19UWF9SQVRFKHBkZXNjLCBERVNDX1JBVEUxTSk7CisJU0VUX1RYX0RFU0NfRElTQUJMRV9GQihwZGVzYywgMSk7CisKKwlTRVRfVFhfREVTQ19EQVRBX0JXKHBkZXNjLCAwKTsKKworCVNFVF9UWF9ERVNDX0hXU0VRX0VOKHBkZXNjLCAxKTsKKworCVNFVF9UWF9ERVNDX1FVRVVFX1NFTChwZGVzYywgZndfcXVldWUpOworLyoKKwlpZihJc0N0cmxORFBBKFZpcnR1YWxBZGRyZXNzKSB8fCBJc01nbnRORFBBKFZpcnR1YWxBZGRyZXNzKSkKKwl7CisJCVNFVF9UWF9ERVNDX0RBVEFfUkVUUllfTElNSVRfODgxMihwRGVzYywgNSk7CisJCVNFVF9UWF9ERVNDX1JFVFJZX0xJTUlUX0VOQUJMRV84ODEyKHBEZXNjLCAxKTsKKworCQlpZihJc01nbnRORFBBKFZpcnR1YWxBZGRyZXNzKSkKKwkJeworCQkJU0VUX1RYX0RFU0NfTkRQQV84ODEyKHBEZXNjLCAxKTsKKwkJCVNFVF9UWF9ERVNDX1JUU19TQ184ODEyKHBEZXNjLCBTQ01hcHBpbmdfODgxMihBZGFwdGVyLCBwVGNiKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTRVRfVFhfREVTQ19ORFBBXzg4MTIocERlc2MsIDIpOworCQkJU0VUX1RYX0RFU0NfUlRTX1NDXzg4MTIocERlc2MsIFNDTWFwcGluZ184ODEyKEFkYXB0ZXIsIHBUY2IpKTsKKwkJfQorCX0qLworCisJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX1NJWkUocGRlc2MsICh1MTYpIChza2ItPmxlbikpOworCisJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MocGRlc2MsIGNwdV90b19sZTMyKG1hcHBpbmcpKTsKKworCVNFVF9UWF9ERVNDX01BQ0lEKHBkZXNjLCAwKTsKKworCVNFVF9UWF9ERVNDX09XTihwZGVzYywgMSk7CisKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJICAgICAgIkgyQyBUeCBDbWQgQ29udGVudFxuIiwKKwkJICAgICAgcGRlc2MsIFRYX0RFU0NfU0laRSk7Cit9CisKK3ZvaWQgcnRsODgyMWFlX3NldF9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggKnBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSwgdTggKnZhbCkKK3sKKwlpZiAoaXN0eCA9PSB0cnVlKSB7CisJCXN3aXRjaCAoZGVzY19uYW1lKSB7CisJCWNhc2UgSFdfREVTQ19PV046CisJCQlTRVRfVFhfREVTQ19PV04ocGRlc2MsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgSFdfREVTQ19UWF9ORVhUREVTQ19BRERSOgorCQkJU0VUX1RYX0RFU0NfTkVYVF9ERVNDX0FERFJFU1MocGRlc2MsICoodTMyICopIHZhbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX0FTU0VSVChmYWxzZSwgKCJFUlIgdHhkZXNjIDolZCIKKwkJCQkJICAiIG5vdCBwcm9jZXNzXG4iLCBkZXNjX25hbWUpKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChkZXNjX25hbWUpIHsKKwkJY2FzZSBIV19ERVNDX1JYT1dOOgorCQkJU0VUX1JYX0RFU0NfT1dOKHBkZXNjLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIEhXX0RFU0NfUlhCVUZGX0FERFI6CisJCQlTRVRfUlhfREVTQ19CVUZGX0FERFIocGRlc2MsICoodTMyICopIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBIV19ERVNDX1JYUEtUX0xFTjoKKwkJCVNFVF9SWF9ERVNDX1BLVF9MRU4ocGRlc2MsICoodTMyICopIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBIV19ERVNDX1JYRVJPOgorCQkJU0VUX1JYX0RFU0NfRU9SKHBkZXNjLCAxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfQVNTRVJUKGZhbHNlLCAoIkVSUiByeGRlc2MgOiVkICIKKwkJCQkJICAibm90IHByb2Nlc3NcbiIsIGRlc2NfbmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3UzMiBydGw4ODIxYWVfZ2V0X2Rlc2ModTggKnBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSkKK3sKKwl1MzIgcmV0ID0gMDsKKworCWlmIChpc3R4ID09IHRydWUpIHsKKwkJc3dpdGNoIChkZXNjX25hbWUpIHsKKwkJY2FzZSBIV19ERVNDX09XTjoKKwkJCXJldCA9IEdFVF9UWF9ERVNDX09XTihwZGVzYyk7CisJCQlicmVhazsKKwkJY2FzZSBIV19ERVNDX1RYQlVGRl9BRERSOgorCQkJcmV0ID0gR0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MocGRlc2MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9BU1NFUlQoZmFsc2UsICgiRVJSIHR4ZGVzYyA6JWQgIgorCQkJCQkgICJub3QgcHJvY2Vzc1xuIiwgZGVzY19uYW1lKSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZGVzY19uYW1lKSB7CisJCWNhc2UgSFdfREVTQ19PV046CisJCQlyZXQgPSBHRVRfUlhfREVTQ19PV04ocGRlc2MpOworCQkJYnJlYWs7CisJCWNhc2UgSFdfREVTQ19SWFBLVF9MRU46CisJCQlyZXQgPSBHRVRfUlhfREVTQ19QS1RfTEVOKHBkZXNjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfQVNTRVJUKGZhbHNlLCAoIkVSUiByeGRlc2MgOiVkICIKKwkJCQkJICAibm90IHByb2Nlc3NcbiIsIGRlc2NfbmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworYm9vbCBydGw4ODIxYWVfaXNfdHhfZGVzY19jbG9zZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHU4IGh3X3F1ZXVlLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnJ0bHBjaS0+dHhfcmluZ1tod19xdWV1ZV07CisJdTggKmVudHJ5ID0gKHU4ICopKCZyaW5nLT5kZXNjW3JpbmctPmlkeF0pOworCXU4IG93biA9ICh1OCkgcnRsODgyMWFlX2dldF9kZXNjKGVudHJ5LCB0cnVlLCBIV19ERVNDX09XTik7CisKKwkvKgorCSAqYmVhY29uIHBhY2tldCB3aWxsIG9ubHkgdXNlIHRoZSBmaXJzdAorCSAqZGVzY3JpcHRvciBkZWZhdXRseSxhbmQgdGhlIG93biBtYXkgbm90CisJICpiZSBjbGVhcmVkIGJ5IHRoZSBoYXJkd2FyZQorCSAqLworCWlmIChvd24pCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOworfQorCisKK3ZvaWQgcnRsODgyMWFlX3R4X3BvbGxpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGh3X3F1ZXVlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChod19xdWV1ZSA9PSBCRUFDT05fUVVFVUUpIHsKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1BDSUVfQ1RSTF9SRUcsIEJJVCg0KSk7CisJfSBlbHNlIHsKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1BDSUVfQ1RSTF9SRUcsCisJCQkgICAgICAgQklUKDApIDw8IChod19xdWV1ZSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5M2U1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5oCkBAIC0wLDAgKzEsNjQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDg4MjFBRV9UUlhfSF9fCisjZGVmaW5lIF9fUlRMODgyMUFFX1RSWF9IX18KKworI2RlZmluZSBUWF9ERVNDX1NJWkUJCQkJCTQwCisjZGVmaW5lIFRYX0RFU0NfQUdHUl9TVUJGUkFNRV9TSVpFCQkzMgorCisjZGVmaW5lIFJYX0RFU0NfU0laRQkJCQkJMzIKKyNkZWZpbmUgUlhfRFJWX0lORk9fU0laRV9VTklUCQkJOAorCisjZGVmaW5lCVRYX0RFU0NfTkVYVF9ERVNDX09GRlNFVAkJNDAKKyNkZWZpbmUgVVNCX0hXREVTQ19IRUFERVJfTEVOCQkJNDAKKyNkZWZpbmUgQ1JDTEVOR1RICQkJCQkJNAorCisjZGVmaW5lIFNFVF9UWF9ERVNDX1BLVF9TSVpFKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjLCAwLCAxNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX09GRlNFVChfX3BkZXNjLCBfX3ZhbCkgCQkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MsIDE2LCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQk1DKF9fcGRlc2MsIF9fdmFsKSAJCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYywgMjQsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19IVEMoX19wZGVzYywgX192YWwpIAkJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjLCAyNSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0xBU1RfU0VHKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjLCAyNiwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0ZJUlNUX1NFRyhfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYywgMjcsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19MSU5JUChfX3BkZXNjLCBfX3ZhbCkgCQkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MsIDI4LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTk9fQUNNKF9fcGRlc2MsIF9fdmFsKSAJCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYywgMjksIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19HRihfX3BkZXNjLCBfX3ZhbCkgCQkJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjLCAzMCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX09XTihfX3BkZXNjLCBfX3ZhbCkgCQkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MsIDMxLCAxLCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19QS1RfU0laRShfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMCwgMTYpCisjZGVmaW5lIEdFVF9UWF9ERVNDX09GRlNFVChfX3BkZXNjKQkJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMTYsIDgpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0JNQyhfX3BkZXNjKQkJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMjQsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0hUQyhfX3BkZXNjKQkJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMjUsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0xBU1RfU0VHKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyNiwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfRklSU1RfU0VHKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyNywgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTElOSVAoX19wZGVzYykgCQkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyOCwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTk9fQUNNKF9fcGRlc2MpCQkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyOSwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfR0YoX19wZGVzYykJCQkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAzMCwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfT1dOKF9fcGRlc2MpCQkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAzMSwgMSkKKworI2RlZmluZSBTRVRfVFhfREVTQ19NQUNJRChfX3BkZXNjLCBfX3ZhbCkgCQkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrNCwgMCwgNywgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1FVRVVFX1NFTChfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys0LCA4LCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUkRHX05BVl9FWFQoX19wZGVzYywgX192YWwpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys0LCAxMywgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0xTSUdfVFhPUF9FTihfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzQsIDE0LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUElGUyhfX3BkZXNjLCBfX3ZhbCkgCQkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrNCwgMTUsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SQVRFX0lEKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzQsIDE2LCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfRU5fREVTQ19JRChfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys0LCAyMSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1NFQ19UWVBFKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzQsIDIyLCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUEtUX09GRlNFVChfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys0LCAyNCwgNSwgX192YWwpCisKKworI2RlZmluZSBTRVRfVFhfREVTQ19QQUlEKF9fcGRlc2MsIF9fdmFsKSAJCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys4LCAwLCA5LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQ0NBX1JUUyhfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys4LCAxMCwgMiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0FHR19FTkFCTEUoX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDEyLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUkRHX0VOQUJMRShfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrOCwgMTMsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19CQVJfUlRZX1RIKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDE0LCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQUdHX0JSRUFLKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDE2LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTU9SRV9GUkFHKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDE3LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUkFXKF9fcGRlc2MsIF9fdmFsKSAJCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYys4LCAxOCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1NQRV9SUFQoX19wZGVzYywgX192YWwpIAkJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDE5LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQU1QRFVfREVOU0lUWShfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzgsIDIwLCAzLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQlRfSU5UKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrOCwgMjMsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19HSUQoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrOCwgMjQsIDYsIF9fdmFsKQorCisKKyNkZWZpbmUgU0VUX1RYX0RFU0NfV0hFQURFUl9MRU4oX19wZGVzYywgX192YWwpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgMCwgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0NIS19FTihfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgNCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0VBUkxZX01PREUoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDUsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19IV1NFUV9TRUwoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDYsIDIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19VU0VfUkFURShfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgOCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RJU0FCTEVfUlRTX0ZCKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzEyLCA5LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfRElTQUJMRV9GQihfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgMTAsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19DVFMyU0VMRihfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgMTEsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SVFNfRU5BQkxFKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzEyLCAxMiwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0hXX1JUU19FTkFCTEUoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDEzLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTkFWX1VTRV9IRFIoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDE1LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVVNFX01BWF9MRU4oX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDE2LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTUFYX0FHR19OVU0oX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTIsIDE3LCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTkRQQShfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgMjIsIDIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19BTVBEVV9NQVhfVElNRShfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxMiwgMjQsIDgsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19UWF9BTlQoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjAsIDI0LCA0LCBfX3ZhbCkKKworI2RlZmluZSBTRVRfVFhfREVTQ19UWF9SQVRFKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzE2LCAwLCA3LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfREFUQV9SQVRFX0ZCX0xJTUlUKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzE2LCA4LCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX1JBVEVfRkJfTElNSVQoX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMTYsIDEzLCA0LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUkVUUllfTElNSVRfRU5BQkxFKF9fcGRlc2MsIF9fdmFsKSAJCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysxNiwgMTcsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19EQVRBX1JFVFJZX0xJTUlUKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzE2LCAxOCwgNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1JUU19SQVRFKF9fcGRlc2MsIF9fdmFsKSAJCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzE2LCAyNCwgNSwgX192YWwpCisKKworI2RlZmluZSBTRVRfVFhfREVTQ19UWF9TVUJfQ0FSUklFUihfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysyMCwgMCwgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RBVEFfU0hPUlRHSShfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BkZXNjKzIwLCA2LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfREFUQV9CVyhfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysyMCwgNSwgMiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RBVEFfTERQQyhfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzIwLCA3LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfREFUQV9TVEJDKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjAsIDgsIDIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19DVFJPTF9TVEJDKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjAsIDEwLCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX1NIT1JUKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjAsIDEyLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX1NDKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjAsIDEzLCA0LCBfX3ZhbCkKKworCisjZGVmaW5lIFNFVF9UWF9ERVNDX1RYX0JVRkZFUl9TSVpFKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMjgsIDAsIDE2LCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19UWF9CVUZGRVJfU0laRShfX3BkZXNjKSAJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMjgsIDAsIDE2KQorCisjZGVmaW5lIFNFVF9UWF9ERVNDX0hXU0VRX0VOKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrMzIsIDE1LCAxLCBfX3ZhbCkKKworI2RlZmluZSBTRVRfVFhfREVTQ19TRVEoX19wZGVzYywgX192YWwpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYyszNiwgMTIsIDEyLCBfX3ZhbCkKKworI2RlZmluZSBTRVRfVFhfREVTQ19UWF9CVUZGRVJfQUREUkVTUyhfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzQwLCAwLCAzMiwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MoX19wZGVzYykgCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQwLCAwLCAzMikKKworCisjZGVmaW5lIFNFVF9UWF9ERVNDX05FWFRfREVTQ19BRERSRVNTKF9fcGRlc2MsIF9fdmFsKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MrNDgsIDAsIDMyLCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19ORVhUX0RFU0NfQUREUkVTUyhfX3BkZXNjKSAJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNDgsIDAsIDMyKQorCisjZGVmaW5lIEdFVF9SWF9ERVNDX1BLVF9MRU4oX19wZGVzYykgCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMCwgMTQpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0NSQzMyKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAxNCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSUNWKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAxNSwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfRFJWX0lORk9fU0laRShfX3BkZXNjKSAJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MsIDE2LCA0KQorI2RlZmluZSBHRVRfUlhfREVTQ19TRUNVUklUWShfX3BkZXNjKSAJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyMCwgMykKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUU9TKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyMywgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfU0hJRlQoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MsIDI0LCAyKQorI2RlZmluZSBHRVRfUlhfREVTQ19QSFlTVChfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMjYsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX1NXREVDKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjLCAyNywgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfTFMoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MsIDI4LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19GUyhfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMjksIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0VPUihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMzAsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX09XTihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYywgMzEsIDEpCisKKyNkZWZpbmUgU0VUX1JYX0RFU0NfUEtUX0xFTihfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjLCAwLCAxNCwgX192YWwpCisjZGVmaW5lIFNFVF9SWF9ERVNDX0VPUihfX3BkZXNjLCBfX3ZhbCkgCQlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYywgMzAsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfUlhfREVTQ19PV04oX19wZGVzYywgX192YWwpIAkJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGRlc2MsIDMxLCAxLCBfX3ZhbCkKKworI2RlZmluZSBHRVRfUlhfREVTQ19NQUNJRChfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAwLCA3KQorI2RlZmluZSBHRVRfUlhfREVTQ19USUQoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgOCwgNCkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQU1TRFUoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgMTMsIDEpCisjZGVmaW5lIEdFVF9SWF9TVEFUVVNfREVTQ19SWElEX01BVENIKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQsIDE0LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19QQUdHUihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAxNSwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQTFfRklUKF9fcGRlc2MpIAkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgMTYsIDQpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0NIS0VSUihfX3BkZXNjKSAJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQsIDIwLCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19JUFZFUihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAyMSwgMSkKKyNkZWZpbmUgR0VUX1JYX1NUQVRVU19ERVNDX0lTX1RDUFVEUChfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAyMiwgMSkKKyNkZWZpbmUgR0VUX1JYX1NUQVRVU19ERVNDX0NIS19WTEQoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgMjMsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX1BBTShfX3BkZXNjKQkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQsIDI0LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19QV1IoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgMjUsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX01EKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQsIDI2LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19NRihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAyNywgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfVFlQRShfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys0LCAyOCwgMikKKyNkZWZpbmUgR0VUX1JYX0RFU0NfTUMoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrNCwgMzAsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0JDKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzQsIDMxLCAxKQorCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfU0VRKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzgsIDAsIDEyKQorI2RlZmluZSBHRVRfUlhfREVTQ19GUkFHKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzgsIDEyLCA0KQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfUlhfSVNfUU9TKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzgsIDE2LCAxKQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfV0xBTkhEX0lWX0xFTihfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYys4LCAxOCwgNikKKyNkZWZpbmUgR0VUX1JYX1NUQVRVU19ERVNDX1JQVF9TRUwoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrOCwgMjgsIDEpCisKKworI2RlZmluZSBHRVRfUlhfREVTQ19SWE1DUyhfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYysxMiwgMCwgNykKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUlhIVChfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYysxMiwgNiwgMSkKKyNkZWZpbmUgR0VUX1JYX1NUQVRVU19ERVNDX1JYX0dGKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzEyLCA3LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19IVEMoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMTIsIDEwLCAxKQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfRU9TUChfX3BkZXNjKQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoIF9fcGRlc2MrMTIsIDExLCAxKQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfQlNTSURfRklUKF9fcGRlc2MpCQlcCisJTEVfQklUU19UT180QllURSggX19wZGVzYysxMiwgMTIsIDIpCisKKyNkZWZpbmUgR0VUX1JYX1NUQVRVU19ERVNDX1BBVFRFUk5fTUFUQ0goX19wZGVzYykJXAorCUxFX0JJVFNfVE9fNEJZVEUoIF9fcGRlc2MrMTIsIDI5LCAxKQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfVU5JQ0FTVF9NQVRDSChfX3BkZXNjKQlcCisJTEVfQklUU19UT180QllURSggX19wZGVzYysxMiwgMzAsIDEpCisjZGVmaW5lIEdFVF9SWF9TVEFUVVNfREVTQ19NQUdJQ19NQVRDSChfX3BkZXNjKQlcCisJTEVfQklUU19UT180QllURSggX19wZGVzYysxMiwgMzEsIDEpCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfU1BMQ1AoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMTYsIDAsIDEpCisjZGVmaW5lIEdFVF9SWF9TVEFUVVNfREVTQ19MRFBDKF9fcGRlc2MpIAkJCQlcCisJTEVfQklUU19UT180QllURShfX3BkZXNjKzE2LCAxLCAxKQorI2RlZmluZSBHRVRfUlhfU1RBVFVTX0RFU0NfU1RCQyhfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYysxNiwgMiwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQlcoX19wZGVzYykgCQkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMTYsIDQsIDIpCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfVFNGTChfX3BkZXNjKSAJCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoX19wZGVzYysyMCwgMCwgMzIpCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQlVGRl9BRERSKF9fcGRlc2MpIAkJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMjQsIDAsIDMyKQorI2RlZmluZSBHRVRfUlhfREVTQ19CVUZGX0FERFI2NChfX3BkZXNjKSAJCVwKKwlMRV9CSVRTX1RPXzRCWVRFKF9fcGRlc2MrMjgsIDAsIDMyKQorCisjZGVmaW5lIFNFVF9SWF9ERVNDX0JVRkZfQUREUihfX3BkZXNjLCBfX3ZhbCkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BkZXNjKzI0LCAwLCAzMiwgX192YWwpCisjZGVmaW5lIFNFVF9SWF9ERVNDX0JVRkZfQUREUjY0KF9fcGRlc2MsIF9fdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wZGVzYysyOCwgMCwgMzIsIF9fdmFsKQorCisKKy8qIFRYIHJlcG9ydCAyIGZvcm1hdCBpbiBSeCBkZXNjKi8KKworI2RlZmluZSBHRVRfUlhfUlBUMl9ERVNDX1BLVF9MRU4oX19wUnhTdGF0dXNEZXNjKQlcCisJTEVfQklUU19UT180QllURSggX19wUnhTdGF0dXNEZXNjLCAwLCA5KQorI2RlZmluZSBHRVRfUlhfUlBUMl9ERVNDX01BQ0lEX1ZBTElEXzEoX19wUnhTdGF0dXNEZXNjKQlcCisJTEVfQklUU19UT180QllURSggX19wUnhTdGF0dXNEZXNjKzE2LCAwLCAzMikKKyNkZWZpbmUgR0VUX1JYX1JQVDJfREVTQ19NQUNJRF9WQUxJRF8yKF9fcFJ4U3RhdHVzRGVzYykJXAorCUxFX0JJVFNfVE9fNEJZVEUoIF9fcFJ4U3RhdHVzRGVzYysyMCwgMCwgMzIpCisKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9QS1ROVU0oX19wYWRkciwgX192YWx1ZSkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BhZGRyLCAwLCA0LCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjAoX19wYWRkciwgX192YWx1ZSkgCVwKKwlTRVRfQklUU19UT19MRV80QllURShfX3BhZGRyLCA0LCAxMiwgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU4xKF9fcGFkZHIsIF9fdmFsdWUpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wYWRkciwgMTYsIDEyLCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjJfMShfX3BhZGRyLCBfX3ZhbHVlKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGFkZHIsIDI4LCA0LCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjJfMihfX3BhZGRyLCBfX3ZhbHVlKSAJXAorCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcGFkZHIrNCwgMCwgOCwgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU4zKF9fcGFkZHIsIF9fdmFsdWUpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wYWRkcis0LCA4LCAxMiwgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU40KF9fcGFkZHIsIF9fdmFsdWUpIAlcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wYWRkcis0LCAyMCwgMTIsIF9fdmFsdWUpCisKKyNkZWZpbmUgQ0xFQVJfUENJX1RYX0RFU0NfQ09OVEVOVChfX3BkZXNjLCBfc2l6ZSkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZihfc2l6ZSA+IFRYX0RFU0NfTkVYVF9ERVNDX09GRlNFVCkJCQlcCisJCW1lbXNldChfX3BkZXNjLCAwLCBUWF9ERVNDX05FWFRfREVTQ19PRkZTRVQpOwlcCisJZWxzZQkJCQkJCQlcCisJCW1lbXNldChfX3BkZXNjLCAwLCBfc2l6ZSk7CQkJXAorfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgUlhfSEFMX0lTX0NDS19SQVRFKHJ4bWNzKVwKKwkocnhtY3MgPT0gREVTQ19SQVRFMU0gfHxcCisJIHJ4bWNzID09IERFU0NfUkFURTJNIHx8XAorCSByeG1jcyA9PSBERVNDX1JBVEU1XzVNIHx8XAorCSByeG1jcyA9PSBERVNDX1JBVEUxMU0pCisKKyNkZWZpbmUgSVNfTElUVExFX0VORElBTgkxCisKK3N0cnVjdCBwaHlfcnhfYWdjX2luZm9fdCB7CisJI2lmIElTX0xJVFRMRV9FTkRJQU4KKwkJdTgJZ2Fpbjo3LHRyc3c6MTsKKwkjZWxzZQorCQl1OAl0cnN3OjEsZ2Fpbjo3OworCSNlbmRpZgorfTsKK3N0cnVjdCBwaHlfc3RhdHVzX3JwdHsKKwlzdHJ1Y3QgcGh5X3J4X2FnY19pbmZvX3QgcGF0aF9hZ2NbMl07CisJdTgJY2hfY29yclsyXTsKKwl1OAljY2tfc2lnX3F1YWxfb2ZkbV9wd2RiX2FsbDsKKwl1OAljY2tfYWdjX3JwdF9vZmRtX2Nmb3Nob19hOworCXU4CWNja19ycHRfYl9vZmRtX2Nmb3Nob19iOworCXU4CXJzdmRfMTsvL2NoX2NvcnJfbXNiOworCXU4CW5vaXNlX3Bvd2VyX2RiX21zYjsKKwl1OAlwYXRoX2Nmb3RhaWxbMl07CisJdTgJcGN0c19tYXNrWzJdOworCXU4CXN0cmVhbV9yeGV2bVsyXTsKKwl1OAlwYXRoX3J4c25yWzJdOworCXU4IAlub2lzZV9wb3dlcl9kYl9sc2I7CisJdTgJcnN2ZF8yWzNdOworCXU4IAlzdHJlYW1fY3NpWzJdOworCXU4IAlzdHJlYW1fdGFyZ2V0X2NzaVsyXTsKKwl1OCAJc2lnX2V2bTsKKwl1OCAJcnN2ZF8zOworI2lmIElTX0xJVFRMRV9FTkRJQU4KKwl1OCAJYW50c2VsX3J4X2tlZXBfMjoxOwkvKmV4X2ludGZfZmxnOjE7Ki8KKwl1OCAJc2dpX2VuOjE7CisJdTggCXJ4c2M6MjsKKwl1OCAJaWRsZV9sb25nOjE7CisJdTggCXJfYW50X3RyYWluX2VuOjE7CisJdTggCWFudF9zZWxfYjoxOworCXU4IAlhbnRfc2VsOjE7CisjZWxzZQkvKiBfQklHX0VORElBTl8JKi8KKwl1OCAJYW50X3NlbDoxOworCXU4IAlhbnRfc2VsX2I6MTsKKwl1OCAJcl9hbnRfdHJhaW5fZW46MTsKKwl1OCAJaWRsZV9sb25nOjE7CisJdTggCXJ4c2M6MjsKKwl1OCAJc2dpX2VuOjE7CisJdTggCWFudHNlbF9yeF9rZWVwXzI6MTsJLypleF9pbnRmX2ZsZzoxOyovCisjZW5kaWYKK31fX3BhY2tlZDsKKworc3RydWN0IHJ4X2Z3aW5mb184ODIxYWUgeworCXU4IGdhaW5fdHJzd1s0XTsKKwl1OCBwd2RiX2FsbDsKKwl1OCBjZm9zaG9bNF07CisJdTggY2ZvdGFpbFs0XTsKKwljaGFyIHJ4ZXZtWzJdOworCWNoYXIgcnhzbnJbNF07CisJdTggcGRzbnJbMl07CisJdTggY3NpX2N1cnJlbnRbMl07CisJdTggY3NpX3RhcmdldFsyXTsKKwl1OCBzaWdldm07CisJdTggbWF4X2V4X3B3cjsKKwl1OCBleF9pbnRmX2ZsYWc6MTsKKwl1OCBzZ2lfZW46MTsKKwl1OCByeHNjOjI7CisJdTggcmVzZXJ2ZTo0OworfSBfX3BhY2tlZDsKKworc3RydWN0IHR4X2Rlc2NfODgyMWFlIHsKKwl1MzIgcGt0c2l6ZToxNjsKKwl1MzIgb2Zmc2V0Ojg7CisJdTMyIGJtYzoxOworCXUzMiBodGM6MTsKKwl1MzIgbGFzdHNlZzoxOworCXUzMiBmaXJzdHNlZzoxOworCXUzMiBsaW5pcDoxOworCXUzMiBub2FjbToxOworCXUzMiBnZjoxOworCXUzMiBvd246MTsKKworCXUzMiBtYWNpZDo2OworCXUzMiByc3ZkMDoyOworCXUzMiBxdWV1ZXNlbDo1OworCXUzMiByZF9uYXZfZXh0OjE7CisJdTMyIGxzaWdfdHhvcF9lbjoxOworCXUzMiBwaWZzOjE7CisJdTMyIHJhdGVpZDo0OworCXUzMiBuYXZfdXNlaGRyOjE7CisJdTMyIGVuX2Rlc2NpZDoxOworCXUzMiBzZWN0eXBlOjI7CisJdTMyIHBrdG9mZnNldDo4OworCisJdTMyIHJ0c19yYzo2OworCXUzMiBkYXRhX3JjOjY7CisJdTMyIGFnZ19lbjoxOworCXUzMiByZGdfZW46MTsKKwl1MzIgYmFyX3JldHJ5aHQ6MjsKKwl1MzIgYWdnX2JyZWFrOjE7CisJdTMyIG1vcmVmcmFnOjE7CisJdTMyIHJhdzoxOworCXUzMiBjY3g6MTsKKwl1MzIgYW1wZHVkZW5zaXR5OjM7CisJdTMyIGJ0X2ludDoxOworCXUzMiBhbnRfc2VsYToxOworCXUzMiBhbnRfc2VsYjoxOworCXUzMiB0eGFudF9jY2s6MjsKKwl1MzIgdHhhbnRfbDoyOworCXUzMiB0eGFudF9odDoyOworCisJdTMyIG5leHRoZWFkcGFnZTo4OworCXUzMiB0YWlscGFnZTo4OworCXUzMiBzZXE6MTI7CisJdTMyIGNwdV9oYW5kbGU6MTsKKwl1MzIgdGFnMToxOworCXUzMiB0cmlnZ2VyX2ludDoxOworCXUzMiBod3NlcV9lbjoxOworCisJdTMyIHJ0c3JhdGU6NTsKKwl1MzIgYXBkY2ZlOjE7CisJdTMyIHFvczoxOworCXUzMiBod3NlcV9zc246MTsKKwl1MzIgdXNlcnJhdGU6MTsKKwl1MzIgZGlzX3J0c2ZiOjE7CisJdTMyIGRpc19kYXRhZmI6MTsKKwl1MzIgY3RzMnNlbGY6MTsKKwl1MzIgcnRzX2VuOjE7CisJdTMyIGh3cnRzX2VuOjE7CisJdTMyIHBvcnRpZDoxOworCXUzMiBwd3Jfc3RhdHVzOjM7CisJdTMyIHdhaXRkY3RzOjE7CisJdTMyIGN0czJhcF9lbjoxOworCXUzMiB0eHNjOjI7CisJdTMyIHN0YmM6MjsKKwl1MzIgdHhzaG9ydDoxOworCXUzMiB0eGJ3OjE7CisJdTMyIHJ0c3Nob3J0OjE7CisJdTMyIHJ0c2J3OjE7CisJdTMyIHJ0c3NjOjI7CisJdTMyIHJ0c3N0YmM6MjsKKworCXUzMiB0eHJhdGU6NjsKKwl1MzIgc2hvcnRnaToxOworCXUzMiBjY3h0OjE7CisJdTMyIHR4cmF0ZV9mYl9sbXQ6NTsKKwl1MzIgcnRzcmF0ZV9mYl9sbXQ6NDsKKwl1MzIgcmV0cnlsbXRfZW46MTsKKwl1MzIgdHhyZXRyeWxtdDo2OworCXUzMiB1c2JfdHhhZ2dudW06ODsKKworCXUzMiB0eGFnY2E6NTsKKwl1MzIgdHhhZ2NiOjU7CisJdTMyIHVzZW1heGxlbjoxOworCXUzMiBtYXhhZ2dudW06NTsKKwl1MzIgbWNzZzFtYXhsZW46NDsKKwl1MzIgbWNzZzJtYXhsZW46NDsKKwl1MzIgbWNzZzNtYXhsZW46NDsKKwl1MzIgbWNzN3NnaW1heGxlbjo0OworCisJdTMyIHR4YnVmZmVyc2l6ZToxNjsKKwl1MzIgc3dfb2Zmc2V0MzA6ODsKKwl1MzIgc3dfb2Zmc2V0MzE6NDsKKwl1MzIgcnN2ZDE6MTsKKwl1MzIgYW50c2VsX2M6MTsKKwl1MzIgbnVsbF8wOjE7CisJdTMyIG51bGxfMToxOworCisJdTMyIHR4YnVmZmFkZHI7CisJdTMyIHR4YnVmZmVyYWRkcjY0OworCXUzMiBuZXh0ZGVzY2FkZHJlc3M7CisJdTMyIG5leHRkZXNjYWRkcmVzczY0OworCisJdTMyIHJlc2VydmVfcGFzc19wY2llX21tX2xpbWl0WzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ4X2Rlc2NfODgyMWFlIHsKKwl1MzIgbGVuZ3RoOjE0OworCXUzMiBjcmMzMjoxOworCXUzMiBpY3ZlcnJvcjoxOworCXUzMiBkcnZfaW5mb3NpemU6NDsKKwl1MzIgc2VjdXJpdHk6MzsKKwl1MzIgcW9zOjE7CisJdTMyIHNoaWZ0OjI7CisJdTMyIHBoeXN0YXR1czoxOworCXUzMiBzd2RlYzoxOworCXUzMiBsYXN0c2VnOjE7CisJdTMyIGZpcnN0c2VnOjE7CisJdTMyIGVvcjoxOworCXUzMiBvd246MTsKKworCXUzMiBtYWNpZDo2OworCXUzMiB0aWQ6NDsKKwl1MzIgaHdyc3ZkOjU7CisJdTMyIHBhZ2dyOjE7CisJdTMyIGZhZ2dyOjE7CisJdTMyIGExX2ZpdDo0OworCXUzMiBhMl9maXQ6NDsKKwl1MzIgcGFtOjE7CisJdTMyIHB3cjoxOworCXUzMiBtb3JlZGF0YToxOworCXUzMiBtb3JlZnJhZzoxOworCXUzMiB0eXBlOjI7CisJdTMyIG1jOjE7CisJdTMyIGJjOjE7CisKKwl1MzIgc2VxOjEyOworCXUzMiBmcmFnOjQ7CisJdTMyIG5leHRwa3RsZW46MTQ7CisJdTMyIG5leHRpbmQ6MTsKKwl1MzIgcnN2ZDoxOworCisJdTMyIHJ4bWNzOjY7CisJdTMyIHJ4aHQ6MTsKKwl1MzIgYW1zZHU6MTsKKwl1MzIgc3BsY3A6MTsKKwl1MzIgYmFuZHdpZHRoOjE7CisJdTMyIGh0YzoxOworCXUzMiB0Y3BjaGtfcnB0OjE7CisJdTMyIGlwY2Noa19ycHQ6MTsKKwl1MzIgdGNwY2hrX3ZhbGlkOjE7CisJdTMyIGh3cGNlcnI6MTsKKwl1MzIgaHdwY2luZDoxOworCXUzMiBpdjA6MTY7CisKKwl1MzIgaXYxOworCisJdTMyIHRzZmw7CisKKwl1MzIgYnVmZmVyYWRkcmVzczsKKwl1MzIgYnVmZmVyYWRkcmVzczY0OworCit9IF9fcGFja2VkOworCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKK3ZvaWQgcnRsODgyMWFlX3R4X2ZpbGxfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgdTggKnBkZXNjX3R4LCB1OCAqdHhiZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICB1OCBod19xdWV1ZSwgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKKyNlbHNlCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwordm9pZCBydGw4ODIxYWVfdHhfZmlsbF9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCB1OCAqcGRlc2NfdHgsIHU4ICp0eGJkLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHU4IGh3X3F1ZXVlLCBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworYm9vbCBydGw4ODIxYWVfcnhfcXVlcnlfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHN0cnVjdCBydGxfc3RhdHMgKnN0YXR1cywKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkgICB1OCAqcGRlc2MsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBydGw4ODIxYWVfc2V0X2Rlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCAqcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lLCB1OCAqdmFsKTsKK3UzMiBydGw4ODIxYWVfZ2V0X2Rlc2ModTggKnBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSk7Citib29sIHJ0bDg4MjFhZV9pc190eF9kZXNjX2Nsb3NlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgdTggaHdfcXVldWUsIHUxNiBpbmRleCk7Cit2b2lkIHJ0bDg4MjFhZV90eF9wb2xsaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBod19xdWV1ZSk7Cit2b2lkIHJ0bDg4MjFhZV90eF9maWxsX2NtZGRlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpwZGVzYywKKwkJCSAgICAgYm9vbCBiX2ZpcnN0c2VnLCBib29sIGJfbGFzdHNlZywKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvc3RhdHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBjMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9zdGF0cy5jCkBAIC0wLDAgKzEsMjgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ3aWZpLmgiCisjaW5jbHVkZSAic3RhdHMuaCIKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMiwwKSkKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNlbmRpZgorCit1OCBydGxfcXVlcnlfcnhwd3JwZXJjZW50YWdlKGNoYXIgYW50cG93ZXIpCit7CisJaWYgKChhbnRwb3dlciA8PSAtMTAwKSB8fCAoYW50cG93ZXIgPj0gMjApKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChhbnRwb3dlciA+PSAwKQorCQlyZXR1cm4gMTAwOworCWVsc2UKKwkJcmV0dXJuICgxMDAgKyBhbnRwb3dlcik7Cit9CisvL0VYUE9SVF9TWU1CT0wocnRsX3F1ZXJ5X3J4cHdycGVyY2VudGFnZSk7CisKK3U4IHJ0bF9ldm1fZGJfdG9fcGVyY2VudGFnZShjaGFyIHZhbHVlKQoreworCWNoYXIgcmV0X3ZhbDsKKwlyZXRfdmFsID0gdmFsdWU7CisKKwlpZiAocmV0X3ZhbCA+PSAwKQorCQlyZXRfdmFsID0gMDsKKwlpZiAocmV0X3ZhbCA8PSAtMzMpCisJCXJldF92YWwgPSAtMzM7CisJcmV0X3ZhbCA9IDAgLSByZXRfdmFsOworCXJldF92YWwgKj0gMzsKKwlpZiAocmV0X3ZhbCA9PSA5OSkKKwkJcmV0X3ZhbCA9IDEwMDsKKworCXJldHVybiByZXRfdmFsOworfQorLy9FWFBPUlRfU1lNQk9MKHJ0bF9ldm1fZGJfdG9fcGVyY2VudGFnZSk7CisKK2xvbmcgcnRsX3RyYW5zbGF0ZV90b2RibShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSB1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpCit7CisJbG9uZyBzaWduYWxfcG93ZXI7CisKKwlzaWduYWxfcG93ZXIgPSAobG9uZykoKHNpZ25hbF9zdHJlbmd0aF9pbmRleCArIDEpID4+IDEpOworCXNpZ25hbF9wb3dlciAtPSA5NTsKKwlyZXR1cm4gc2lnbmFsX3Bvd2VyOworfQorCitsb25nIHJ0bF9zaWduYWxfc2NhbGVfbWFwcGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgbG9uZyBjdXJyc2lnKQoreworCWxvbmcgcmV0c2lnOworCisJaWYgKGN1cnJzaWcgPj0gNjEgJiYgY3VycnNpZyA8PSAxMDApCisJCXJldHNpZyA9IDkwICsgKChjdXJyc2lnIC0gNjApIC8gNCk7CisJZWxzZSBpZiAoY3VycnNpZyA+PSA0MSAmJiBjdXJyc2lnIDw9IDYwKQorCQlyZXRzaWcgPSA3OCArICgoY3VycnNpZyAtIDQwKSAvIDIpOworCWVsc2UgaWYgKGN1cnJzaWcgPj0gMzEgJiYgY3VycnNpZyA8PSA0MCkKKwkJcmV0c2lnID0gNjYgKyAoY3VycnNpZyAtIDMwKTsKKwllbHNlIGlmIChjdXJyc2lnID49IDIxICYmIGN1cnJzaWcgPD0gMzApCisJCXJldHNpZyA9IDU0ICsgKGN1cnJzaWcgLSAyMCk7CisJZWxzZSBpZiAoY3VycnNpZyA+PSA1ICYmIGN1cnJzaWcgPD0gMjApCisJCXJldHNpZyA9IDQyICsgKCgoY3VycnNpZyAtIDUpICogMikgLyAzKTsKKwllbHNlIGlmIChjdXJyc2lnID09IDQpCisJCXJldHNpZyA9IDM2OworCWVsc2UgaWYgKGN1cnJzaWcgPT0gMykKKwkJcmV0c2lnID0gMjc7CisJZWxzZSBpZiAoY3VycnNpZyA9PSAyKQorCQlyZXRzaWcgPSAxODsKKwllbHNlIGlmIChjdXJyc2lnID09IDEpCisJCXJldHNpZyA9IDk7CisJZWxzZQorCQlyZXRzaWcgPSBjdXJyc2lnOworCisJcmV0dXJuIHJldHNpZzsKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfc2lnbmFsX3NjYWxlX21hcHBpbmcpOworCit2b2lkIHJ0bF9wcm9jZXNzX3VpX3Jzc2koc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfc3RhdHMgKnBzdGF0dXMpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggcmZwYXRoOworCXUzMiBsYXN0X3Jzc2ksIHRtcHZhbDsKKworCWlmICghcHN0YXR1cy0+Yl9wYWNrZXRfdG9zZWxmICYmICFwc3RhdHVzLT5iX3BhY2tldF9iZWFjb24pCisJCXJldHVybjsKKworCXJ0bHByaXYtPnN0YXRzLnB3ZGJfYWxsX2NudCArPSBwc3RhdHVzLT5yeF9wd2RiX2FsbDsKKwlydGxwcml2LT5zdGF0cy5yc3NpX2NhbGN1bGF0ZV9jbnQrKzsKKworCWlmIChydGxwcml2LT5zdGF0cy51aV9yc3NpLnRvdGFsX251bSsrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkgeworCQlydGxwcml2LT5zdGF0cy51aV9yc3NpLnRvdGFsX251bSA9IFBIWV9SU1NJX1NMSURfV0lOX01BWDsKKwkJbGFzdF9yc3NpID0gcnRscHJpdi0+c3RhdHMudWlfcnNzaS5lbGVtZW50c1sKKwkJCXJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kuaW5kZXhdOworCQlydGxwcml2LT5zdGF0cy51aV9yc3NpLnRvdGFsX3ZhbCAtPSBsYXN0X3Jzc2k7CisJfQorCXJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kudG90YWxfdmFsICs9IHBzdGF0dXMtPnNpZ25hbHN0cmVuZ3RoOworCXJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kuZWxlbWVudHNbcnRscHJpdi0+c3RhdHMudWlfcnNzaS5pbmRleCsrXSA9CisJICAgIHBzdGF0dXMtPnNpZ25hbHN0cmVuZ3RoOworCWlmIChydGxwcml2LT5zdGF0cy51aV9yc3NpLmluZGV4ID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKKwkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS5pbmRleCA9IDA7CisJdG1wdmFsID0gcnRscHJpdi0+c3RhdHMudWlfcnNzaS50b3RhbF92YWwgLworCQlydGxwcml2LT5zdGF0cy51aV9yc3NpLnRvdGFsX251bTsKKwlydGxwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGggPSBydGxfdHJhbnNsYXRlX3RvZGJtKGh3LAorCQkodTgpIHRtcHZhbCk7CisJcHN0YXR1cy0+cnNzaSA9IHJ0bHByaXYtPnN0YXRzLnNpZ25hbF9zdHJlbmd0aDsKKworCWlmIChwc3RhdHVzLT5iX2lzX2NjaykKKwkJcmV0dXJuOworCisJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgcnRscGh5LT5udW1fdG90YWxfcmZwYXRoOworCSAgICAgcmZwYXRoKyspIHsKKwkJaWYgKHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID09IDApIHsKKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0KKwkJCSAgICBwc3RhdHVzLT5yeF9taW1vX3NpZ25hbHN0cmVuZ3RoW3JmcGF0aF07CisKKwkJfQorCQlpZiAocHN0YXR1cy0+cnhfbWltb19zaWduYWxzdHJlbmd0aFtyZnBhdGhdID4KKwkJICAgIHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKSB7CisJCQlydGxwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9CisJCQkgICAgKChydGxwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSAqCisJCQkgICAgICAoUlhfU01PT1RIX0ZBQ1RPUiAtIDEpKSArCisJCQkgICAgIChwc3RhdHVzLT5yeF9taW1vX3NpZ25hbHN0cmVuZ3RoW3JmcGF0aF0pKSAvCisJCQkgICAgKFJYX1NNT09USF9GQUNUT1IpOworCQkJcnRscHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJICAgIHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICsgMTsKKwkJfSBlbHNlIHsKKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0KKwkJCSAgICAoKHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICoKKwkJCSAgICAgIChSWF9TTU9PVEhfRkFDVE9SIC0gMSkpICsKKwkJCSAgICAgKHBzdGF0dXMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbcmZwYXRoXSkpIC8KKwkJCSAgICAoUlhfU01PT1RIX0ZBQ1RPUik7CisJCX0KKwkJcnRscHJpdi0+c3RhdHMucnhfc25yX2RiW3JmcGF0aF0gPSBwc3RhdHVzLT5yeF9zbnJbcmZwYXRoXTsKKwkJcnRscHJpdi0+c3RhdHMucnhfZXZtX2RibVtyZnBhdGhdID0KKwkJCQkJcHN0YXR1cy0+cnhfbWltb19ldm1fZGJtW3JmcGF0aF07CisJCXJ0bHByaXYtPnN0YXRzLnJ4X2Nmb19zaG9ydFtyZnBhdGhdID0KKwkJCQkJcHN0YXR1cy0+Y2ZvX3Nob3J0W3JmcGF0aF07CisJCXJ0bHByaXYtPnN0YXRzLnJ4X2Nmb190YWlsW3JmcGF0aF0gPSBwc3RhdHVzLT5jZm9fdGFpbFtyZnBhdGhdOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsX3VwZGF0ZV9yeHNpZ25hbHN0YXRpc3RpY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXR1cykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJaW50IHdlaWdodGluZyA9IDA7CisKKwlpZiAocnRscHJpdi0+c3RhdHMucmVjdl9zaWduYWxfcG93ZXIgPT0gMCkKKwkJcnRscHJpdi0+c3RhdHMucmVjdl9zaWduYWxfcG93ZXIgPSBwc3RhdHVzLT5yZWN2c2lnbmFscG93ZXI7CisJaWYgKHBzdGF0dXMtPnJlY3ZzaWduYWxwb3dlciA+IHJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyKQorCQl3ZWlnaHRpbmcgPSA1OworCWVsc2UgaWYgKHBzdGF0dXMtPnJlY3ZzaWduYWxwb3dlciA8IHJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyKQorCQl3ZWlnaHRpbmcgPSAoLTUpOworCXJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyID0gKHJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyICoKKwkJNSArIHBzdGF0dXMtPnJlY3ZzaWduYWxwb3dlciArIHdlaWdodGluZykgLyA2OworfQorCitzdGF0aWMgdm9pZCBydGxfcHJvY2Vzc19wd2RiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHVzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpkcnZfcHJpdiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CisJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChydGxwcml2LT5tYWM4MDIxMS5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJc3RhID0gcnRsX2ZpbmRfc3RhKGh3LCBwc3RhdHVzLT5wc2FkZHIpOworCisJLyogYWRob2Mgb3IgYXAgbW9kZSAqLworCWlmIChzdGEpIHsKKwkJZHJ2X3ByaXYgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKSBzdGEtPmRydl9wcml2OworCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCWRydl9wcml2LT5yc3NpX3N0YXQudW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwl9IGVsc2UgeworCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCXJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisJfQorCisJaWYgKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAwKQorCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHN0YXR1cy0+cnhfcHdkYl9hbGw7CisJaWYgKHBzdGF0dXMtPnJ4X3B3ZGJfYWxsID4gKHUzMikgdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikgeworCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gKCgodW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikgKgorCQkgICAgICAoUlhfU01PT1RIX0ZBQ1RPUiAtIDEpKSArCisJCSAgICAgKHBzdGF0dXMtPnJ4X3B3ZGJfYWxsKSkgLyAoUlhfU01PT1RIX0ZBQ1RPUik7CisJCXVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiICsgMTsKKwl9IGVsc2UgeworCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gKCgodW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikgKgorCQkgICAgICAoUlhfU01PT1RIX0ZBQ1RPUiAtIDEpKSArCisJCSAgICAgKHBzdGF0dXMtPnJ4X3B3ZGJfYWxsKSkgLyAoUlhfU01PT1RIX0ZBQ1RPUik7CisJfQorCisJaWYoc3RhKSB7CisJCWRydl9wcml2LT5yc3NpX3N0YXQudW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9CisJCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCX0gZWxzZSB7CisJCXJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJ0bF91cGRhdGVfcnhzaWduYWxzdGF0aXN0aWNzKGh3LCBwc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgcnRsX3Byb2Nlc3NfdWlfbGlua19xdWFsaXR5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHVzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgbGFzdF9ldm0sIG5fc3RyZWFtLCB0bXB2YWw7CisKKwlpZiAocHN0YXR1cy0+c2lnbmFscXVhbGl0eSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LnRvdGFsX251bSsrID49CisJICAgIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgpIHsKKwkJcnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LnRvdGFsX251bSA9CisJCSAgICBQSFlfTElOS1FVQUxJVFlfU0xJRF9XSU5fTUFYOworCQlsYXN0X2V2bSA9IHJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5lbGVtZW50c1sKKwkJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5pbmRleF07CisJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS50b3RhbF92YWwgLT0gbGFzdF9ldm07CisJfQorCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS50b3RhbF92YWwgKz0gcHN0YXR1cy0+c2lnbmFscXVhbGl0eTsKKwlydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkuZWxlbWVudHNbCisJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5pbmRleCsrXSA9CisJCQkJCQkJcHN0YXR1cy0+c2lnbmFscXVhbGl0eTsKKwlpZiAocnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LmluZGV4ID49CisJICAgIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgpCisJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5pbmRleCA9IDA7CisJdG1wdmFsID0gcnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LnRvdGFsX3ZhbCAvCisJICAgIHJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS50b3RhbF9udW07CisJcnRscHJpdi0+c3RhdHMuc2lnbmFsX3F1YWxpdHkgPSB0bXB2YWw7CisJcnRscHJpdi0+c3RhdHMubGFzdF9zaWdzdHJlbmd0aF9pbnBlcmNlbnQgPSB0bXB2YWw7CisJZm9yIChuX3N0cmVhbSA9IDA7IG5fc3RyZWFtIDwgMjsgbl9zdHJlYW0rKykgeworCQlpZiAocHN0YXR1cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W25fc3RyZWFtXSAhPSAtMSkgeworCQkJaWYgKHJ0bHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25fc3RyZWFtXSA9PSAwKSB7CisJCQkJcnRscHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2Vbbl9zdHJlYW1dID0KKwkJCQkgICAgcHN0YXR1cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W25fc3RyZWFtXTsKKwkJCX0KKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25fc3RyZWFtXSA9CisJCQkgICAgKChydGxwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuX3N0cmVhbV0KKwkJCSAgICAgICogKFJYX1NNT09USF9GQUNUT1IgLSAxKSkgKworCQkJICAgICAocHN0YXR1cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W25fc3RyZWFtXSAqIDEpKSAvCisJCQkgICAgKFJYX1NNT09USF9GQUNUT1IpOworCQl9CisJfQorfQorCit2b2lkIHJ0bF9wcm9jZXNzX3BoeWluZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpidWZmZXIsCisJCQkgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXR1cykKK3sKKworCWlmICghcHN0YXR1cy0+Yl9wYWNrZXRfbWF0Y2hic3NpZCkKKwkJcmV0dXJuOworCisJcnRsX3Byb2Nlc3NfdWlfcnNzaShodywgcHN0YXR1cyk7CisJcnRsX3Byb2Nlc3NfcHdkYihodywgcHN0YXR1cyk7CisJcnRsX3Byb2Nlc3NfdWlfbGlua19xdWFsaXR5KGh3LCBwc3RhdHVzKTsKK30KKy8vRVhQT1JUX1NZTUJPTChydGxfcHJvY2Vzc19waHlpbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvc3RhdHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjlkMGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9zdGF0cy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMX1NUQVRTX0hfXworI2RlZmluZSBfX1JUTF9TVEFUU19IX18KKworI2RlZmluZQlQSFlfUlNTSV9TTElEX1dJTl9NQVgJCQkxMDAKKyNkZWZpbmUJUEhZX0xJTktRVUFMSVRZX1NMSURfV0lOX01BWAkJMjAKKyNkZWZpbmUJUEhZX0JFQUNPTl9SU1NJX1NMSURfV0lOX01BWAkJMTAKKworLyogUnggc21vb3RoIGZhY3RvciAqLworI2RlZmluZQlSWF9TTU9PVEhfRkFDVE9SCQkJMjAKKwordTggcnRsX3F1ZXJ5X3J4cHdycGVyY2VudGFnZShjaGFyIGFudHBvd2VyKTsKK3U4IHJ0bF9ldm1fZGJfdG9fcGVyY2VudGFnZShjaGFyIHZhbHVlKTsKK2xvbmcgcnRsX3NpZ25hbF9zY2FsZV9tYXBwaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBsb25nIGN1cnJzaWcpOwordm9pZCBydGxfcHJvY2Vzc19waHlpbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqYnVmZmVyLAorCQkJIHN0cnVjdCBydGxfc3RhdHMgKnBzdGF0dXMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS93aWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODhhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oCkBAIC0wLDAgKzEsMjUzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVExfV0lGSV9IX18KKyNkZWZpbmUgX19SVExfV0lGSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJCTAKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyAJCUJJVCgyOCkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIAkJQklUKDI5KQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgCQlCSVQoMzApCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyAJCUJJVCgzMSkKKworI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkxNgorI2RlZmluZSBJUUtfTUFDX1JFR19OVU0JCQk0CisjZGVmaW5lIElRS19USFJFU0hPTEQJCQk4CisKKyNkZWZpbmUgTUFYX0tFWV9MRU4JCQk2MQorI2RlZmluZSBLRVlfQlVGX1NJWkUJCQk1CisKKy8qIFFvUyByZWxhdGVkLiAqLworLyphY2k6IDB4MDAJQmVzdCBFZmZvcnQqLworLyphY2k6IDB4MDEJQmFja2dyb3VuZCovCisvKmFjaTogMHgxMAlWaWRlbyovCisvKmFjaTogMHgxMQlWb2ljZSovCisvKk1heDogZGVmaW5lIHRvdGFsIG51bWJlci4qLworI2RlZmluZSBBQzBfQkUJCQkJMAorI2RlZmluZSBBQzFfQksJCQkJMQorI2RlZmluZSBBQzJfVkkJCQkJMgorI2RlZmluZSBBQzNfVk8JCQkJMworI2RlZmluZSBBQ19NQVgJCQkJNAorI2RlZmluZSBRT1NfUVVFVUVfTlVNCQkJNAorI2RlZmluZSBSVExfTUFDODAyMTFfTlVNX1FVRVVFCQk1CisKKyNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQk1CisjZGVmaW5lIE1BWF9XTU1FTEVfTEVOR1RICQk2NAorCisjZGVmaW5lIFRPVEFMX0NBTV9FTlRSWSAJCTMyCisKKy8qc2xvdCB0aW1lIGZvciAxMWcuICovCisjZGVmaW5lIFJUTF9TTE9UX1RJTUVfOQkJCTkKKyNkZWZpbmUgUlRMX1NMT1RfVElNRV8yMAkJMjAKKworLypyZWxhdGVkIHdpdGggdGNwL2lwLiAqLworLyppZl9laHRoZXIuaCovCisjZGVmaW5lIEVUSF9QX1BBRSAJCQkweDg4OEUJLypQb3J0IEFjY2VzcyBFbnRpdHkKKwkJCQkJCSAqKElFRUUgODAyLjFYKSAqLworI2RlZmluZSBFVEhfUF9JUCAgICAgICAgCQkweDA4MDAJLypJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX1BfQVJQICAgICAgIAkJMHgwODA2CS8qQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldCAqLworI2RlZmluZSBTTkFQX1NJWkUgCQkJNgorI2RlZmluZSBQUk9UT0NfVFlQRV9TSVpFCQkyCisKKy8qcmVsYXRlZCB3aXRoIDgwMi4xMSBmcmFtZSovCisjZGVmaW5lIE1BQzgwMjExXzNBRERSX0xFTiAJCTI0CisjZGVmaW5lIE1BQzgwMjExXzRBRERSX0xFTiAJCTMwCisKKyNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSCQkoMTQgKyAyNCArIDIxKQkvKiAxNCBpcyB0aGUgbWF4CisJCQkJCQkJICogY2hhbm5lbCBudW1iZXIgKi8KKyNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSXzJHCQkxNAorI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfNUcJICAgIAk1NCAvKiBQbGVhc2UgcmVmZXIgdG8KKwkJCQkJICAgICoicGh5X0dldENobmxHcm91cDg4MTJBIiBhbmQKKwkJCQkJICAgICogIkhhbF9SZWFkVHhQb3dlckluZm84ODEyQSIqLworI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNCTcKKyNkZWZpbmUgQ0hBTk5FTF9HUk9VUF9NQVgJCSgzICsgOSkJLyogY2gxfjMsIGNoNH45LCBjaDEwfjE0CisJCQkJCQkgKiB0b3RhbCB0aHJlZSBncm91cHMgKi8KKyNkZWZpbmUgTUFYX1BHX0dST1VQIAkJCTEzCisjZGVmaW5lCUNIQU5ORUxfR1JPVVBfTUFYXzJHCQkzCisjZGVmaW5lCUNIQU5ORUxfR1JPVVBfSURYXzVHTAkJMworI2RlZmluZQlDSEFOTkVMX0dST1VQX0lEWF81R00JCTYKKyNkZWZpbmUJQ0hBTk5FTF9HUk9VUF9JRFhfNUdICQk5CisjZGVmaW5lCUNIQU5ORUxfR1JPVVBfTUFYXzVHCQk5CisjZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUl8yRwkJMTQKKyNkZWZpbmUgQVZHX1RIRVJNQUxfTlVNCQkJOAorI2RlZmluZSBBVkdfVEhFUk1BTF9OVU1fOTJFCQk0CisjZGVmaW5lIEFWR19USEVSTUFMX05VTV84OEUJCTQKKyNkZWZpbmUgQVZHX1RIRVJNQUxfTlVNXzg3MjNCRQkJNAorI2RlZmluZSBNQVhfVElEX0NPVU5UCQkJOQorI2RlZmluZSBNQVhfTlVNX1JBVEVTCQkJMjY0CisKKy8qZm9yIDg4RSB1c2UqLworLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VjcXVlbmNlIHdpbGwgYmUgd3JvbmcuKi8KKyNkZWZpbmUgTUFYX1RYX0NPVU5UCQkJNAorI2RlZmluZQlNQVhfUkZfUEFUSAkJCTQKKyNkZWZpbmUJTUFYX0NITkxfR1JPVVBfMjRHCQk2CisjZGVmaW5lCU1BWF9DSE5MX0dST1VQXzVHCQkxNAorCisvKiBCSywgQkUsIFZJLCBWTywgSENDQSwgTUFOQUdFTUVOVCwgQ09NTUFORCwgSElHSCwgQkVBQ09OLiAqLworI2RlZmluZSBNQVhfVFhfUVVFVUUgCQkJOQorCisjZGVmaW5lIFRYX1BXUl9CWV9SQVRFX05VTV9CQU5ECQkyCisjZGVmaW5lIFRYX1BXUl9CWV9SQVRFX05VTV9SRgkJNAorI2RlZmluZSBUWF9QV1JfQllfUkFURV9OVU1fU0VDVElPTgkxMgorI2RlZmluZSBNQVhfQkFTRV9OVU1fSU5fUEhZX1JFR19QR18yNEcgIDYKKyNkZWZpbmUgTUFYX0JBU0VfTlVNX0lOX1BIWV9SRUdfUEdfNUcJNQorCisjZGVmaW5lIERFTFRBX1NXSU5HSURYX1NJWkUJMzAKKyNkZWZpbmUgQkFORF9OVU0gCQkJCTMKKy8qTm93LCBpdCdzIGp1c3QgZm9yIDgxOTJlZQorICpub3QgT0sgeWV0LCBrZWVwIGl0IDAqLworI2RlZmluZSBETUFfSVNfNjRCSVQgMAorI2RlZmluZSBSVEw4MTkyRUVfU0VHX05VTQkJMSAvKiAwOjIgc2VnLCAxOiA0IHNlZywgMjogOCBzZWcgKi8KKworc3RydWN0IHR4cG93ZXJfaW5mb18yZyB7CisJdTggaW5kZXhfY2NrX2Jhc2VbTUFYX1JGX1BBVEhdW01BWF9DSE5MX0dST1VQXzI0R107CisJdTggaW5kZXhfYnc0MF9iYXNlW01BWF9SRl9QQVRIXVtNQVhfQ0hOTF9HUk9VUF8yNEddOworCS8qSWYgb25seSBvbmUgdHgsIG9ubHkgQlcyMCBhbmQgT0ZETSBhcmUgdXNlZC4qLworCXU4IGNja19kaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworCXU4IG9mZG1fZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsKKwl1OCBidzIwX2RpZmZbTUFYX1JGX1BBVEhdW01BWF9UWF9DT1VOVF07CisJdTggYnc0MF9kaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworfTsKKworc3RydWN0IHR4cG93ZXJfaW5mb181ZyB7CisJdTggaW5kZXhfYnc0MF9iYXNlW01BWF9SRl9QQVRIXVtNQVhfQ0hOTF9HUk9VUF81R107CisJLypJZiBvbmx5IG9uZSB0eCwgb25seSBCVzIwLCBPRkRNLCBCVzgwIGFuZCBCVzE2MCBhcmUgdXNlZC4qLworCXU4IG9mZG1fZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsKKwl1OCBidzIwX2RpZmZbTUFYX1JGX1BBVEhdW01BWF9UWF9DT1VOVF07CisJdTggYnc0MF9kaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworCXU4IGJ3ODBfZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsKKwl1OCBidzE2MF9kaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworfTsKKworCisvKiBmb3IgZWFybHkgbW9kZSAqLworI2RlZmluZSBFTV9IRFJfTEVOCQkJOAorI2RlZmluZSBGQ1NfTEVOCQkJCTQKKworI2RlZmluZSBNQVhfVklSVFVBTF9NQUMJCQkxCisKK2VudW0gcmZfdHhfbnVtIHsKKwlSRl8xVFggPSAwLAorCVJGXzJUWCwKKwlSRl9NQVhfVFhfTlVNLAorCVJGX1RYX05VTV9OT05JTVBMRU1FTlQsCit9OworCitlbnVtIHJhdGVfc2VjdGlvbiB7CisJQ0NLID0gMCwKKwlPRkRNLAorCUhUX01DUzBfTUNTNywKKwlIVF9NQ1M4X01DUzE1LAorCVZIVF8xU1NNQ1MwXzFTU01DUzksCisJVkhUXzJTU01DUzBfMlNTTUNTOSwKK307CisKK2VudW0gaW50Zl90eXBlIHsKKwlJTlRGX1BDSSA9IDAsCisJSU5URl9VU0IgPSAxLAorfTsKKworZW51bSByYWRpb19wYXRoIHsKKwlSRjkwX1BBVEhfQSA9IDAsCisJUkY5MF9QQVRIX0IgPSAxLAorCVJGOTBfUEFUSF9DID0gMiwKKwlSRjkwX1BBVEhfRCA9IDMsCit9OworCitlbnVtIHJ0X2VlcHJvbV90eXBlIHsKKwlFRVBST01fOTNDNDYsCisJRUVQUk9NXzkzQzU2LAorCUVFUFJPTV9CT09UX0VGVVNFLAorfTsKKworZW51bSBydGxfc3RhdHVzIHsKKwlSVExfU1RBVFVTX0lOVEVSRkFDRV9TVEFSVCA9IDAsCit9OworCitlbnVtIGhhcmR3YXJlX3R5cGUgeworCUhBUkRXQVJFX1RZUEVfUlRMODE5MkUsCisJSEFSRFdBUkVfVFlQRV9SVEw4MTkyVSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTVSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDVSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJERSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJEVSwKKwlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDg3MjNCRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDgxOTJFRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDg4MjFBRSwKKwlIQVJEV0FSRV9UWVBFX1JUTDg4MTJBRSwKKwkvKiBrZWVwIGl0IGxhc3QgKi8KKwlIQVJEV0FSRV9UWVBFX05VTQorfTsKKworZW51bSBzY2FuX29wZXJhdGlvbl9iYWNrdXBfb3B0IHsKKwlTQ0FOX09QVF9CQUNLVVBfQkFORDA9MCwKKwlTQ0FOX09QVF9CQUNLVVBfQkFORDEsCisJU0NBTl9PUFRfUkVTVE9SRSwKKwlTQ0FOX09QVF9NQVgKK307CisKKy8qUkYgc3RhdGUuKi8KK2VudW0gcmZfcHdyc3RhdGUgeworCUVSRk9OLAorCUVSRlNMRUVQLAorCUVSRk9GRgorfTsKKworc3RydWN0IGJiX3JlZ19kZWYgeworCXUzMiByZmludGZzOworCXUzMiByZmludGZpOworCXUzMiByZmludGZvOworCXUzMiByZmludGZlOworCXUzMiByZjN3aXJlX29mZnNldDsKKwl1MzIgcmZsc3NpX3NlbGVjdDsKKwl1MzIgcmZ0eGdhaW5fc3RhZ2U7CisJdTMyIHJmaHNzaV9wYXJhMTsKKwl1MzIgcmZoc3NpX3BhcmEyOworCXUzMiByZnN3aXRjaF9jb250cm9sOworCXUzMiByZmFnY19jb250cm9sMTsKKwl1MzIgcmZhZ2NfY29udHJvbDI7CisJdTMyIHJmcnhpcV9pbWJhbGFuY2U7CisJdTMyIHJmcnhfYWZlOworCXUzMiByZnR4aXFfaW1iYWxhbmNlOworCXUzMiByZnR4X2FmZTsKKwl1MzIgcmZsc3NpX3JlYWRiYWNrOworCXUzMiByZmxzc2lfcmVhZGJhY2twaTsKK307CisKK2VudW0gaW9fdHlwZSB7CisJSU9fQ01EX1BBVVNFX0JBTkQwX0RNX0JZX1NDQU4gPSAwLAorCUlPX0NNRF9QQVVTRV9CQU5EMV9ETV9CWV9TQ0FOID0gMSwKKwlJT19DTURfUkVTVU1FX0RNX0JZX1NDQU4gPSAyLAorfTsKKworZW51bSBod192YXJpYWJsZXMgeworCUhXX1ZBUl9FVEhFUl9BRERSLAorCUhXX1ZBUl9NVUxUSUNBU1RfUkVHLAorCUhXX1ZBUl9CQVNJQ19SQVRFLAorCUhXX1ZBUl9CU1NJRCwKKwlIV19WQVJfTUVESUFfU1RBVFVTLAorCUhXX1ZBUl9TRUNVUklUWV9DT05GLAorCUhXX1ZBUl9CRUFDT05fSU5URVJWQUwsCisJSFdfVkFSX0FUSU1fV0lORE9XLAorCUhXX1ZBUl9MSVNURU5fSU5URVJWQUwsCisJSFdfVkFSX0NTX0NPVU5URVIsCisJSFdfVkFSX0RFRkFVTFRLRVkwLAorCUhXX1ZBUl9ERUZBVUxUS0VZMSwKKwlIV19WQVJfREVGQVVMVEtFWTIsCisJSFdfVkFSX0RFRkFVTFRLRVkzLAorCUhXX1ZBUl9TSUZTLAorCUhXX1ZBUl9ESUZTLAorCUhXX1ZBUl9FSUZTLAorCUhXX1ZBUl9TTE9UX1RJTUUsCisJSFdfVkFSX0FDS19QUkVBTUJMRSwKKwlIV19WQVJfQ1dfQ09ORklHLAorCUhXX1ZBUl9DV19WQUxVRVMsCisJSFdfVkFSX1JBVEVfRkFMTEJBQ0tfQ09OVFJPTCwKKwlIV19WQVJfQ09OVEVOVElPTl9XSU5ET1csCisJSFdfVkFSX1JFVFJZX0NPVU5ULAorCUhXX1ZBUl9UUl9TV0lUQ0gsCisJSFdfVkFSX0NPTU1BTkQsCisJSFdfVkFSX1dQQV9DT05GSUcsCisJSFdfVkFSX0FNUERVX01JTl9TUEFDRSwKKwlIV19WQVJfU0hPUlRHSV9ERU5TSVRZLAorCUhXX1ZBUl9BTVBEVV9GQUNUT1IsCisJSFdfVkFSX01DU19SQVRFX0FWQUlMQUJMRSwKKwlIV19WQVJfQUNfUEFSQU0sCisJSFdfVkFSX0FDTV9DVFJMLAorCUhXX1ZBUl9ESVNfUmVxX1FzaXplLAorCUhXX1ZBUl9DQ1hfQ0hOTF9MT0FELAorCUhXX1ZBUl9DQ1hfTk9JU0VfSElTVE9HUkFNLAorCUhXX1ZBUl9DQ1hfQ0xNX05ITSwKKwlIV19WQVJfVHhPUExpbWl0LAorCUhXX1ZBUl9UVVJCT19NT0RFLAorCUhXX1ZBUl9SRl9TVEFURSwKKwlIV19WQVJfUkZfT0ZGX0JZX0hXLAorCUhXX1ZBUl9CVVNfU1BFRUQsCisJSFdfVkFSX1NFVF9ERVZfUE9XRVIsCisKKwlIV19WQVJfUkNSLAorCUhXX1ZBUl9SQVRSXzAsCisJSFdfVkFSX1JSU1IsCisJSFdfVkFSX0NQVV9SU1QsCisJSFdfVkFSX0NFQ0hLX0JTU0lELAorCUhXX1ZBUl9MQktfTU9ERSwKKwlIV19WQVJfQUVTXzExTl9GSVgsCisJSFdfVkFSX1VTQl9SWF9BR0dSLAorCUhXX1ZBUl9VU0VSX0NPTlRST0xfVFVSQk9fTU9ERSwKKwlIV19WQVJfUkVUUllfTElNSVQsCisJSFdfVkFSX0lOSVRfVFhfUkFURSwKKwlIV19WQVJfVFhfUkFURV9SRUcsCisJSFdfVkFSX0VGVVNFX1VTQUdFLAorCUhXX1ZBUl9FRlVTRV9CWVRFUywKKwlIV19WQVJfQVVUT0xPQURfU1RBVFVTLAorCUhXX1ZBUl9SRl8yUl9ESVNBQkxFLAorCUhXX1ZBUl9TRVRfUlBXTSwKKwlIV19WQVJfSDJDX0ZXX1BXUk1PREUsCisJSFdfVkFSX0gyQ19GV19KT0lOQlNTUlBULAorCUhXX1ZBUl9IMkNfRldfTUVESUFTVEFUVVNSUFQsCisJSFdfVkFSX0gyQ19GV19QMlBfUFNfT0ZGTE9BRCwKKwlIV19WQVJfRldfUFNNT0RFX1NUQVRVUywKKwlIV19WQVJfUkVTVU1FX0NMS19PTiwKKwlIV19WQVJfRldfTFBTX0FDVElPTiwKKwlIV19WQVJfMVgxX1JFQ1ZfQ09NQklORSwKKwlIV19WQVJfU1RPUF9TRU5EX0JFQUNPTiwKKwlIV19WQVJfVFNGX1RJTUVSLAorCUhXX1ZBUl9JT19DTUQsCisKKwlIV19WQVJfUkZfUkVDT1ZFUlksCisJSFdfVkFSX0gyQ19GV19VUERBVEVfR1RLLAorCUhXX1ZBUl9XRl9NQVNLLAorCUhXX1ZBUl9XRl9DUkMsCisJSFdfVkFSX1dGX0lTX01BQ19BRERSLAorCUhXX1ZBUl9IMkNfRldfT0ZGTE9BRCwKKwlIV19WQVJfUkVTRVRfV0ZDUkMsCisKKwlIV19WQVJfSEFORExFX0ZXX0MySCwKKwlIV19WQVJfRExfRldfUlNWRF9QQUdFLAorCUhXX1ZBUl9BSUQsCisJSFdfVkFSX0hXX1NFUV9FTkFCTEUsCisJSFdfVkFSX0NPUlJFQ1RfVFNGLAorCUhXX1ZBUl9CQ05fVkFMSUQsCisJSFdfVkFSX0ZXTFBTX1JGX09OLAorCUhXX1ZBUl9EVUFMX1RTRl9SU1QsCisJSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiwKKwlIV19WQVJfSU5UX01JR1JBVElPTiwKKwlIV19WQVJfSU5UX0FDLAorCUhXX1ZBUl9SRl9USU1JTkcsCisKKwlIQUxfREVGX1dPV0xBTiwKKwlIV19WQVJfTVJDLAorCUhXX1ZBUl9LRUVQX0FMSVZFLAorCUhXX1ZBUl9OQVZfVVBQRVIsCit9OworCitlbnVtIHJ0X21lZGlhX3N0YXR1cyB7CisJUlRfTUVESUFfRElTQ09OTkVDVCA9IDAsCisJUlRfTUVESUFfQ09OTkVDVCA9IDEKK307CisKK2VudW0gcnRfb2VtX2lkIHsKKwlSVF9DSURfREVGQVVMVCA9IDAsCisJUlRfQ0lEXzgxODdfQUxQSEEwID0gMSwKKwlSVF9DSURfODE4N19TRVJDT01NX1BTID0gMiwKKwlSVF9DSURfODE4N19IV19MRUQgPSAzLAorCVJUX0NJRF84MTg3X05FVEdFQVIgPSA0LAorCVJUX0NJRF9XSFFMID0gNSwKKwlSVF9DSURfODE5eF9DQU1FTyA9IDYsCisJUlRfQ0lEXzgxOXhfUlVOVE9QID0gNywKKwlSVF9DSURfODE5eF9TZW5hbyA9IDgsCisJUlRfQ0lEX1RPU0hJQkEgPSA5LAorCVJUX0NJRF84MTl4X05ldGNvcmUgPSAxMCwKKwlSVF9DSURfTmV0dHJvbml4ID0gMTEsCisJUlRfQ0lEX0RMSU5LID0gMTIsCisJUlRfQ0lEX1BST05FVCA9IDEzLAorCVJUX0NJRF9DT1JFR0EgPSAxNCwKKwlSVF9DSURfODE5eF9BTFBIQSA9IDE1LAorCVJUX0NJRF84MTl4X1NpdGVjb20gPSAxNiwKKwlSVF9DSURfQ0NYID0gMTcsCisJUlRfQ0lEXzgxOXhfTGVub3ZvID0gMTgsCisJUlRfQ0lEXzgxOXhfUU1JID0gMTksCisJUlRfQ0lEXzgxOXhfRWRpbWF4X0JlbGtpbiA9IDIwLAorCVJUX0NJRF84MTl4X1NlcmNvbW1fQmVsa2luID0gMjEsCisJUlRfQ0lEXzgxOXhfQ0FNRU8xID0gMjIsCisJUlRfQ0lEXzgxOXhfTVNJID0gMjMsCisJUlRfQ0lEXzgxOXhfQWNlciA9IDI0LAorCVJUX0NJRF84MTl4X0hQID0gMjcsCisJUlRfQ0lEXzgxOXhfQ0xFVk8gPSAyOCwKKwlSVF9DSURfODE5eF9BcmNhZHlhbl9CZWxraW4gPSAyOSwKKwlSVF9DSURfODE5eF9TQU1TVU5HID0gMzAsCisJUlRfQ0lEXzgxOXhfV05DX0NPUkVHQSA9IDMxLAorCVJUX0NJRF84MTl4X0ZveGNvb24gPSAzMiwKKwlSVF9DSURfODE5eF9ERUxMID0gMzMsCisJUlRfQ0lEXzgxOXhfUFJPTkVUUyA9IDM0LAorCVJUX0NJRF84MTl4X0VkaW1heF9BU1VTID0gMzUsCisJUlRfQ0lEX05FVEdFQVIgPSAzNiwKKwlSVF9DSURfUExBTkVYID0gMzcsCisJUlRfQ0lEX0NDX0MgPSAzOCwKK307CisKK2VudW0gaHdfZGVzY3MgeworCUhXX0RFU0NfT1dOLAorCUhXX0RFU0NfUlhPV04sCisJSFdfREVTQ19UWF9ORVhUREVTQ19BRERSLAorCUhXX0RFU0NfVFhCVUZGX0FERFIsCisJSFdfREVTQ19SWEJVRkZfQUREUiwKKwlIV19ERVNDX1JYUEtUX0xFTiwKKwlIV19ERVNDX1JYRVJPLAorCUhXX0RFU0NfUlhfUFJFUEFSRSwKK307CisKK2VudW0gcHJpbWVfc2MgeworCVBSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSA9IDAsCisJUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIgPSAxLAorCVBSSU1FX0NITkxfT0ZGU0VUX1VQUEVSID0gMiwKK307CisKK2VudW0gcmZfdHlwZSB7CisJUkZfMVQxUiA9IDAsCisJUkZfMVQyUiA9IDEsCisJUkZfMlQyUiA9IDIsCisJUkZfMlQyUl9HUkVFTiA9IDMsCit9OworCitlbnVtIGh0X2NoYW5uZWxfd2lkdGggeworCUhUX0NIQU5ORUxfV0lEVEhfMjAgPSAwLAorCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAorCUhUX0NIQU5ORUxfV0lEVEhfODAgPSAyLAorfTsKKworLyogUmVmOiA4MDIuMTFpIHNlcGMgRDEwLjAgNy4zLjIuMjUuMQorQ2lwaGVyIFN1aXRlcyBFbmNyeXB0aW9uIEFsZ29yaXRobXMgKi8KK2VudW0gcnRfZW5jX2FsZyB7CisJTk9fRU5DUllQVElPTiA9IDAsCisJV0VQNDBfRU5DUllQVElPTiA9IDEsCisJVEtJUF9FTkNSWVBUSU9OID0gMiwKKwlSU0VSVkVEX0VOQ1JZUFRJT04gPSAzLAorCUFFU0NDTVBfRU5DUllQVElPTiA9IDQsCisJV0VQMTA0X0VOQ1JZUFRJT04gPSA1LAorCUFFU0NNQUNfRU5DUllQVElPTiA9IDYsCS8qSUVFRTgwMi4xMXcgKi8KK307CisKK2VudW0gcnRsX2hhbF9zdGF0ZSB7CisJX0hBTF9TVEFURV9TVE9QID0gMCwKKwlfSEFMX1NUQVRFX1NUQVJUID0gMSwKK307CisKK2VudW0gcnRsX3Zhcl9tYXAgeworCS8qcmVnIG1hcCAqLworCVNZU19JU09fQ1RSTCA9IDAsCisJU1lTX0ZVTkNfRU4sCisJU1lTX0NMSywKKwlNQUNfUkNSX0FNLAorCU1BQ19SQ1JfQUIsCisJTUFDX1JDUl9BQ1JDMzIsCisJTUFDX1JDUl9BQ0YsCisJTUFDX1JDUl9BQVAsCisJTUFDX0hJTVIsCisJTUFDX0hJTVJFLAorCU1BQ19IU0lTUiwKKworCS8qZWZ1c2UgbWFwICovCisJRUZVU0VfVEVTVCwKKwlFRlVTRV9DVFJMLAorCUVGVVNFX0NMSywKKwlFRlVTRV9DTEtfQ1RSTCwKKwlFRlVTRV9QV0NfRVYxMlYsCisJRUZVU0VfRkVOX0VMRFIsCisJRUZVU0VfTE9BREVSX0NMS19FTiwKKwlFRlVTRV9BTkE4TSwKKwlFRlVTRV9IV1NFVF9NQVhfU0laRSwKKwlFRlVTRV9NQVhfU0VDVElPTl9NQVAsCisJRUZVU0VfUkVBTF9DT05URU5UX1NJWkUsCisJRUZVU0VfT09CX1BST1RFQ1RfQllURVNfTEVOLAorCUVGVVNFX0FDQ0VTUywKKwkvKkNBTSBtYXAgKi8KKwlSV0NBTSwKKwlXQ0FNSSwKKwlSQ0FNTywKKwlDQU1EQkcsCisJU0VDUiwKKwlTRUNfQ0FNX05PTkUsCisJU0VDX0NBTV9XRVA0MCwKKwlTRUNfQ0FNX1RLSVAsCisJU0VDX0NBTV9BRVMsCisJU0VDX0NBTV9XRVAxMDQsCisKKwkvKklNUiBtYXAgKi8KKwlSVExfSU1SX0JDTkRNQUlOVDYsCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgNiAqLworCVJUTF9JTVJfQkNORE1BSU5UNSwJLypCZWFjb24gRE1BIEludGVycnVwdCA1ICovCisJUlRMX0lNUl9CQ05ETUFJTlQ0LAkvKkJlYWNvbiBETUEgSW50ZXJydXB0IDQgKi8KKwlSVExfSU1SX0JDTkRNQUlOVDMsCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgMyAqLworCVJUTF9JTVJfQkNORE1BSU5UMiwJLypCZWFjb24gRE1BIEludGVycnVwdCAyICovCisJUlRMX0lNUl9CQ05ETUFJTlQxLAkvKkJlYWNvbiBETUEgSW50ZXJydXB0IDEgKi8KKwlSVExfSU1SX0JDTkRPSzgsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA4ICovCisJUlRMX0lNUl9CQ05ET0s3LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNyAqLworCVJUTF9JTVJfQkNORE9LNiwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDYgKi8KKwlSVExfSU1SX0JDTkRPSzUsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA1ICovCisJUlRMX0lNUl9CQ05ET0s0LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNCAqLworCVJUTF9JTVJfQkNORE9LMywJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDMgKi8KKwlSVExfSU1SX0JDTkRPSzIsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAyICovCisJUlRMX0lNUl9CQ05ET0sxLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMSAqLworCVJUTF9JTVJfVElNRU9VVDIsCS8qVGltZW91dCBpbnRlcnJ1cHQgMiAqLworCVJUTF9JTVJfVElNRU9VVDEsCS8qVGltZW91dCBpbnRlcnJ1cHQgMSAqLworCVJUTF9JTVJfVFhGT1ZXLAkJLypUcmFuc21pdCBGSUZPIE92ZXJmbG93ICovCisJUlRMX0lNUl9QU1RJTUVPVVQsCS8qUG93ZXIgc2F2ZSB0aW1lIG91dCBpbnRlcnJ1cHQgKi8KKwlSVExfSU1SX0JjbkludCwJCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgMCAqLworCVJUTF9JTVJfUlhGT1ZXLAkJLypSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KKwlSVExfSU1SX1JEVSwJCS8qUmVjZWl2ZSBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlICovCisJUlRMX0lNUl9BVElNRU5ELAkvKkZvciA5MkMsQVRJTSBXaW5kb3cgRW5kIEludGVycnVwdCAqLworCVJUTF9JTVJfQkRPSywJCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAqLworCVJUTF9JTVJfSElHSERPSywJLypIaWdoIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgKi8KKwlSVExfSU1SX0NPTURPSywJCS8qQ29tbWFuZCBRdWV1ZSBETUEgT0sgSW50ZXJydXB0Ki8KKwlSVExfSU1SX1RCRE9LLAkJLypUcmFuc21pdCBCZWFjb24gT0sgaW50ZXJydXAgKi8KKwlSVExfSU1SX01HTlRET0ssCS8qTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sgSW50ZXJydXB0ICovCisJUlRMX0lNUl9UQkRFUiwJCS8qRm9yIDkyQyxUcmFuc21pdCBCZWFjb24gRXJyb3IgSW50ZXJydXB0ICovCisJUlRMX0lNUl9CS0RPSywJCS8qQUNfQksgRE1BIE9LIEludGVycnVwdCAqLworCVJUTF9JTVJfQkVET0ssCQkvKkFDX0JFIERNQSBPSyBJbnRlcnJ1cHQgKi8KKwlSVExfSU1SX1ZJRE9LLAkJLypBQ19WSSBETUEgT0sgSW50ZXJydXB0ICovCisJUlRMX0lNUl9WT0RPSywJCS8qQUNfVk8gRE1BIEludGVycnVwdCAqLworCVJUTF9JTVJfUk9LLAkJLypSZWNlaXZlIERNQSBPSyBJbnRlcnJ1cHQgKi8KKwlSVExfSU1SX0hTSVNSX0lORCwgIC8qSFNJU1IgSW50ZXJydXB0Ki8KKwlSVExfSUJTU19JTlRfTUFTS1MsCS8qKFJUTF9JTVJfQmNuSW50IHwgUlRMX0lNUl9UQkRPSyB8CisJCQkJICogUlRMX0lNUl9UQkRFUikgKi8KKwlSVExfSU1SX0MySENNRCwJCS8qZncgaW50ZXJydXB0Ki8KKworCS8qQ0NLIFJhdGVzLCBUeEhUID0gMCAqLworCVJUTF9SQ19DQ0tfUkFURTFNLAorCVJUTF9SQ19DQ0tfUkFURTJNLAorCVJUTF9SQ19DQ0tfUkFURTVfNU0sCisJUlRMX1JDX0NDS19SQVRFMTFNLAorCisJLypPRkRNIFJhdGVzLCBUeEhUID0gMCAqLworCVJUTF9SQ19PRkRNX1JBVEU2TSwKKwlSVExfUkNfT0ZETV9SQVRFOU0sCisJUlRMX1JDX09GRE1fUkFURTEyTSwKKwlSVExfUkNfT0ZETV9SQVRFMThNLAorCVJUTF9SQ19PRkRNX1JBVEUyNE0sCisJUlRMX1JDX09GRE1fUkFURTM2TSwKKwlSVExfUkNfT0ZETV9SQVRFNDhNLAorCVJUTF9SQ19PRkRNX1JBVEU1NE0sCisKKwlSVExfUkNfSFRfUkFURU1DUzcsCisJUlRMX1JDX0hUX1JBVEVNQ1MxNSwKKworCS8qa2VlcCBpdCBsYXN0ICovCisJUlRMX1ZBUl9NQVBfTUFYLAorfTsKKworLypGaXJtd2FyZSBQUyBtb2RlIGZvciBjb250cm9sIExQUy4qLworZW51bSBfZndfcHNfbW9kZSB7CisJRldfUFNfQUNUSVZFX01PREUgPSAwLAorCUZXX1BTX01JTl9NT0RFID0gMSwKKwlGV19QU19NQVhfTU9ERSA9IDIsCisJRldfUFNfRFRJTV9NT0RFID0gMywKKwlGV19QU19WT0lQX01PREUgPSA0LAorCUZXX1BTX1VBUFNEX1dNTV9NT0RFID0gNSwKKwlGV19QU19VQVBTRF9NT0RFID0gNiwKKwlGV19QU19JQlNTX01PREUgPSA3LAorCUZXX1BTX1dXTEFOX01PREUgPSA4LAorCUZXX1BTX1BNX1JhZGlvX09mZiA9IDksCisJRldfUFNfUE1fQ2FyZF9EaXNhYmxlID0gMTAsCit9OworCitlbnVtIHJ0X3BzbW9kZSB7CisJRUFDVElWRSwJCS8qQWN0aXZlL0NvbnRpbnVvdXMgYWNjZXNzLiAqLworCUVNQVhQUywJCQkvKk1heCBwb3dlciBzYXZlIG1vZGUuICovCisJRUZBU1RQUywJCS8qRmFzdCBwb3dlciBzYXZlIG1vZGUuICovCisJRUFVVE9QUywJCS8qQXV0byBwb3dlciBzYXZlIG1vZGUuICovCit9OworCisvKkxFRCByZWxhdGVkLiovCitlbnVtIGxlZF9jdGxfbW9kZSB7CisJTEVEX0NUTF9QT1dFUl9PTiA9IDEsCisJTEVEX0NUTF9MSU5LID0gMiwKKwlMRURfQ1RMX05PX0xJTksgPSAzLAorCUxFRF9DVExfVFggPSA0LAorCUxFRF9DVExfUlggPSA1LAorCUxFRF9DVExfU0lURV9TVVJWRVkgPSA2LAorCUxFRF9DVExfUE9XRVJfT0ZGID0gNywKKwlMRURfQ1RMX1NUQVJUX1RPX0xJTksgPSA4LAorCUxFRF9DVExfU1RBUlRfV1BTID0gOSwKKwlMRURfQ1RMX1NUT1BfV1BTID0gMTAsCit9OworCitlbnVtIHJ0bF9sZWRfcGluIHsKKwlMRURfUElOX0dQSU8wLAorCUxFRF9QSU5fTEVEMCwKKwlMRURfUElOX0xFRDEsCisJTEVEX1BJTl9MRUQyCit9OworCisvKlFvUyByZWxhdGVkLiovCisvKmFjbSBpbXBsZW1lbnRhdGlvbiBtZXRob2QuKi8KK2VudW0gYWNtX21ldGhvZCB7CisJZUFjbVdheTBfU3dBbmRIdyA9IDAsCisJZUFjbVdheTFfSFcgPSAxLAorCWVBY21XYXkyX1NXID0gMiwKK307CisKK2VudW0gbWFjcGh5X21vZGUgeworCVNJTkdMRU1BQ19TSU5HTEVQSFkgPSAwLAorCURVQUxNQUNfRFVBTFBIWSwKKwlEVUFMTUFDX1NJTkdMRVBIWSwKK307CisKK2VudW0gYmFuZF90eXBlIHsKKwlCQU5EX09OXzJfNEcgPSAwLAorCUJBTkRfT05fNUcsCisJQkFORF9PTl9CT1RILAorCUJBTkRNQVgKK307CisKKy8qYWNpL2FpZnNuIEZpZWxkLgorUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLiovCit1bmlvbiBhY2lfYWlmc24geworCXU4IGNoYXJfZGF0YTsKKworCXN0cnVjdCB7CisJCXU4IGFpZnNuOjQ7CisJCXU4IGFjbToxOworCQl1OCBhY2k6MjsKKwkJdTggcmVzZXJ2ZWQ6MTsKKwl9IGY7CQkJLyogRmllbGQgKi8KK307CisKKy8qbWxtZSByZWxhdGVkLiovCitlbnVtIHdpcmVsZXNzX21vZGUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKKwlXSVJFTEVTU19NT0RFX05fMjRHID0gMHgxMCwKKwlXSVJFTEVTU19NT0RFX05fNUcgPSAweDIwLAorCVdJUkVMRVNTX01PREVfQUNfNUcgPSAweDQwLAorCVdJUkVMRVNTX01PREVfQUNfMjRHICA9IDB4ODAKK307CisKK2VudW0gcmF0cl90YWJsZV9tb2RlIHsKKwlSQVRSX0lOWF9XSVJFTEVTU19OR0IgPSAwLAkJLy8gQkdOIDQwIE1oeiAyU1MgMVNTCisJUkFUUl9JTlhfV0lSRUxFU1NfTkcgPSAxLAkJLy8gR04gb3IgTgorCVJBVFJfSU5YX1dJUkVMRVNTX05CID0gMiwJCS8vIEJHTiAyMCBNaHogMlNTIDFTUyAgb3IgQk4KKwlSQVRSX0lOWF9XSVJFTEVTU19OID0gMywKKwlSQVRSX0lOWF9XSVJFTEVTU19HQiA9IDQsCisJUkFUUl9JTlhfV0lSRUxFU1NfRyA9IDUsCisJUkFUUl9JTlhfV0lSRUxFU1NfQiA9IDYsCisJUkFUUl9JTlhfV0lSRUxFU1NfTUMgPSA3LAorCVJBVFJfSU5YX1dJUkVMRVNTX0FDXzVOID0gOCwKKwlSQVRSX0lOWF9XSVJFTEVTU19BQ18yNE4gPSA5LAorfTsKKworZW51bSBydGxfbGlua19zdGF0ZSB7CisJTUFDODAyMTFfTk9MSU5LID0gMCwKKwlNQUM4MDIxMV9MSU5LSU5HID0gMSwKKwlNQUM4MDIxMV9MSU5LRUQgPSAyLAorCU1BQzgwMjExX0xJTktFRF9TQ0FOTklORyA9IDMsCit9OworCitlbnVtIGFjdF9jYXRlZ29yeSB7CisJQUNUX0NBVF9RT1MgPSAxLAorCUFDVF9DQVRfRExTID0gMiwKKwlBQ1RfQ0FUX0JBID0gMywKKwlBQ1RfQ0FUX0hUID0gNywKKwlBQ1RfQ0FUX1dNTSA9IDE3LAorfTsKKworZW51bSBiYV9hY3Rpb24geworCUFDVF9BRERCQVJFUSA9IDAsCisJQUNUX0FEREJBUlNQID0gMSwKKwlBQ1RfREVMQkEgPSAyLAorfTsKKworZW51bSBydF9wb2xhcml0eV9jdGwgeworCVJUX1BPTEFSSVRZX0xPV19BQ1QgPSAwLAorCVJUX1BPTEFSSVRZX0hJR0hfQUNUID0gMSwKK307CisKKworc3RydWN0IG9jdGV0X3N0cmluZyB7CisJdTggKm9jdGV0OworCXUxNiBsZW5ndGg7Cit9OworCitzdHJ1Y3QgcnRsX2hkcl8zYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxfcHJvYmVfcnNwIHsKKwlzdHJ1Y3QgcnRsX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwkvKlNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCisJICAgQ0YgcGFyYW1zLCBJQlNTIHBhcmFtcywgVElNIChpZiBiZWFjb24pLCBSU04gKi8KKwlzdHJ1Y3QgcnRsX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fcGFja2VkOworCisvKkxFRCByZWxhdGVkLiovCisvKmxlZHBpbiBJZGVudGlmeSBob3cgdG8gaW1wbGVtZW50IHRoaXMgU1cgbGVkLiovCitzdHJ1Y3QgcnRsX2xlZCB7CisJdm9pZCAqaHc7CisJZW51bSBydGxfbGVkX3BpbiBsZWRwaW47CisJYm9vbCBiX2xlZG9uOworfTsKKworc3RydWN0IHJ0bF9sZWRfY3RsIHsKKwlib29sIGJsZWRfb3BlbmRyYWluOworCXN0cnVjdCBydGxfbGVkIHN3X2xlZDA7CisJc3RydWN0IHJ0bF9sZWQgc3dfbGVkMTsKK307CisKK3N0cnVjdCBydGxfcW9zX3BhcmFtZXRlcnMgeworCV9fbGUxNiBjd19taW47CisJX19sZTE2IGN3X21heDsKKwl1OCBhaWZzOworCXU4IGZsYWc7CisJX19sZTE2IHR4X29wOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0X3Ntb290aF9kYXRhIHsKKwl1MzIgZWxlbWVudHNbMTAwXTsJLyphcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KKwl1MzIgaW5kZXg7CQkvKmluZGV4IHRvIGN1cnJlbnQgYXJyYXkgdG8gc3RvcmUgKi8KKwl1MzIgdG90YWxfbnVtOwkJLypudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KKwl1MzIgdG90YWxfdmFsOwkJLypzdW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KK307CisKK3N0cnVjdCBydGxfaHRfYWdnIHsKKwl1MTYgdHhxX2lkOworCXUxNiB3YWl0X2Zvcl9iYTsKKwl1MTYgc3RhcnRfaWR4OworCXU2NCBiaXRtYXA7CisJdTMyIHJhdGVfbl9mbGFnczsKKwl1OCBhZ2dfc3RhdGU7CisJdTggcnhfYWdnX3N0YXRlOworfTsKKworc3RydWN0IHJ0bF90aWRfZGF0YSB7CisJdTE2IHNlcV9udW1iZXI7CisJc3RydWN0IHJ0bF9odF9hZ2cgYWdnOworfTsKKworc3RydWN0IHJzc2lfc3RheworCWxvbmcgdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKK307CisKK3N0cnVjdCBydGxfc3RhX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1OCByYXRyX2luZGV4OworCXU4IHdpcmVsZXNzX21vZGU7CisJdTggbWltb19wczsKKwl1OCBtYWNfYWRkcls2XTsKKwlzdHJ1Y3QgcnRsX3RpZF9kYXRhIHRpZHNbTUFYX1RJRF9DT1VOVF07CisKKwkvKiBqdXN0IHVzZWQgZm9yIGFwIGFkaG9jIG9yIG1lc2gqLworCXN0cnVjdCByc3NpX3N0YSByc3NpX3N0YXQ7Cit9IF9fcGFja2VkOworCisjaWZkZWYgVklGX1RPRE8KK3N0cnVjdCBydGxfdmlmIHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJLyogc3RydWN0IGllZWU4MDIxMV92aWYgX19yY3UgKnZpZjsgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworfTsKKworc3RydWN0IHJ0bF92aWZfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWJvb2wgYWN0aXZlOworCXVuc2lnbmVkIGludCBpZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uOworCWJvb2wgZW5hYmxlX2JlYWNvbjsKK307CisKK3N0cnVjdCB2aWZfcHJpdiB7CisJc3RydWN0IGxpc3RfaGVhZCB2aWZfbGlzdDsKKworCS8qIGludGVyZmFjZSBtb2RlIHNldHRpbmdzICovCisJdW5zaWduZWQgbG9uZyB2aWZfYml0bWFwOworCXVuc2lnbmVkIGludCB2aWZzOworCXN0cnVjdCBydGxfdmlmIHZpZltNQVhfVklSVFVBTF9NQUNdOworCisJLyogYmVhY29uaW5nICovCisJc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKKwl1bnNpZ25lZCBpbnQgZ2xvYmFsX3ByZXRidHQ7CisJdW5zaWduZWQgaW50IGdsb2JhbF9iZWFjb25faW50OworCS8qIHN0cnVjdCBydGxfdmlmX2luZm8gX19yY3UgKmJlYWNvbl9pdGVyOyAqLworCXN0cnVjdCBydGxfdmlmX2luZm8gKmJlYWNvbl9pdGVyOworCXVuc2lnbmVkIGludCBiZWFjb25fZW5hYmxlZDsKK307CisjZW5kaWYKKworc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRpc3RpY3MgeworCXUzMiBjbnRfcGFyaXR5X2ZhaWw7CisJdTMyIGNudF9yYXRlX2lsbGVnYWw7CisJdTMyIGNudF9jcmM4X2ZhaWw7CisJdTMyIGNudF9tY3NfZmFpbDsKKwl1MzIgY250X2Zhc3RfZnN5bmNfZmFpbDsKKwl1MzIgY250X3NiX3NlYXJjaF9mYWlsOworCXUzMiBjbnRfb2ZkbV9mYWlsOworCXUzMiBjbnRfY2NrX2ZhaWw7CisJdTMyIGNudF9hbGw7CisJdTMyIGNudF9vZmRtX2NjYTsKKwl1MzIgY250X2Nja19jY2E7CisJdTMyIGNudF9jY2FfYWxsOworCXUzMiBjbnRfYndfdXNjOworCXUzMiBjbnRfYndfbHNjOworfTsKKworc3RydWN0IGluaXRfZ2FpbiB7CisJdTggeGFhZ2Njb3JlMTsKKwl1OCB4YmFnY2NvcmUxOworCXU4IHhjYWdjY29yZTE7CisJdTggeGRhZ2Njb3JlMTsKKwl1OCBjY2E7CisKK307CisKK3N0cnVjdCB3aXJlbGVzc19zdGF0cyB7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzdW5pY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXNtdWx0aWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzYnJvYWRjYXN0OworCXVuc2lnbmVkIGxvbmcgcnhieXRlc3VuaWNhc3Q7CisKKwlsb25nIHJ4X3Nucl9kYls0XTsKKwkvKkNvcnJlY3Qgc21vb3RoZWQgc3MgaW4gRGJtLCBvbmx5IHVzZWQKKwkgICBpbiBkcml2ZXIgdG8gcmVwb3J0IHJlYWwgcG93ZXIgbm93LiAqLworCWxvbmcgcmVjdl9zaWduYWxfcG93ZXI7CisJbG9uZyBzaWduYWxfcXVhbGl0eTsKKwlsb25nIGxhc3Rfc2lnc3RyZW5ndGhfaW5wZXJjZW50OworCisJdTMyIHJzc2lfY2FsY3VsYXRlX2NudDsKKwl1MzIgcHdkYl9hbGxfY250OworCisJLypUcmFuc2Zvcm1lZCwgaW4gZGJtLiBCZWF1dGlmaWVkIHNpZ25hbAorCSAgIHN0cmVuZ3RoIGZvciBVSSwgbm90IGNvcnJlY3QuICovCisJbG9uZyBzaWduYWxfc3RyZW5ndGg7CisKKwl1OCByeF9yc3NpX3BlcmNlbnRhZ2VbNF07CisJdTggcnhfZXZtX2RibVs0XTsKKwl1OCByeF9ldm1fcGVyY2VudGFnZVsyXTsKKworCXUxNiByeF9jZm9fc2hvcnRbNF07CisJdTE2IHJ4X2Nmb190YWlsWzRdOworCisJc3RydWN0IHJ0X3Ntb290aF9kYXRhIHVpX3Jzc2k7CisJc3RydWN0IHJ0X3Ntb290aF9kYXRhIHVpX2xpbmtfcXVhbGl0eTsKK307CisKK3N0cnVjdCByYXRlX2FkYXB0aXZlIHsKKwl1OCByYXRlX2FkYXB0aXZlX2Rpc2FibGVkOworCXU4IHJhdHJfc3RhdGU7CisJdTE2IHJlc2VydmU7CisKKwl1MzIgaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJdTMyIGhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1OCBsb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJdTMyIGxvd19yc3NpX3RocmVzaF9mb3JfcmE7CisJdTMyIHVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyIG1pZGRsZXVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyIG1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyOworCXUzMiBtaWRkbGVsb3dfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwl1MzIgbG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyIHVsdHJhbG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyIGxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwbTsKKwl1MzIgbG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBtOworCXU4IHBpbmdfcnNzaV9lbmFibGU7CisJdTMyIHBpbmdfcnNzaV9yYXRyOworCXUzMiBwaW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1MzIgbGFzdF9yYXRyOworCXU4IHByZV9yYXRyX3N0YXRlOworCXU4IGxkcGNfdGhyZXM7CisJYm9vbCB1c2VfbGRwYzsKKwlib29sIGxvd2VyX3J0c19yYXRlOworCWJvb2wgaXNfc3BlY2lhbF9kYXRhOworfTsKKworc3RydWN0IHJlZ2RfcGFpcl9tYXBwaW5nIHsKKwl1MTYgcmVnX2RtbmVudW07CisJdTE2IHJlZ181Z2h6X2N0bDsKKwl1MTYgcmVnXzJnaHpfY3RsOworfTsKKworc3RydWN0IGR5bmFtaWNfcHJpbWFyeV9jY2F7CisJdTggcHJpY2NhX2ZsYWc7CisJdTggaW50Zl9mbGFnOworCXU4IGludGZfdHlwZTsKKwl1OCBkdXBfcnRzX2ZsYWc7CisJdTggbW9uaXRvcl9mbGFnOworCXU4IGNoX29mZnNldDsKKwl1OCBtZl9zdGF0ZTsKK307CisKK3N0cnVjdCBydGxfcmVndWxhdG9yeSB7CisJY2hhciBhbHBoYTJbMl07CisJdTE2IGNvdW50cnlfY29kZTsKKwl1MTYgbWF4X3Bvd2VyX2xldmVsOworCXUzMiB0cF9zY2FsZTsKKwl1MTYgY3VycmVudF9yZDsKKwl1MTYgY3VycmVudF9yZF9leHQ7CisJaW50MTZfdCBwb3dlcl9saW1pdDsKKwlzdHJ1Y3QgcmVnZF9wYWlyX21hcHBpbmcgKnJlZ3BhaXI7Cit9OworCitzdHJ1Y3QgcnRsX3Jma2lsbCB7CisJYm9vbCByZmtpbGxfc3RhdGU7CS8qMCBpcyBvZmYsIDEgaXMgb24gKi8KK307CisKKy8qZm9yIFAyUCBQUyoqLworI2RlZmluZQlQMlBfTUFYX05PQV9OVU0JCTIKKworZW51bSBwMnBfcm9sZSB7CisJUDJQX1JPTEVfRElTQUJMRSA9IDAsCisJUDJQX1JPTEVfREVWSUNFID0gMSwKKwlQMlBfUk9MRV9DTElFTlQgPSAyLAorCVAyUF9ST0xFX0dPID0gMworfTsKKworZW51bSBwMnBfcHNfc3RhdGUgeworCVAyUF9QU19ESVNBQkxFID0gMCwKKwlQMlBfUFNfRU5BQkxFID0gMSwKKwlQMlBfUFNfU0NBTiA9IDIsCisJUDJQX1BTX1NDQU5fRE9ORSA9IDMsCisJUDJQX1BTX0FMTFNUQVNMRUVQID0gNCwgLy8gZm9yIFAyUCBHTworfTsKKworZW51bSBwMnBfcHNfbW9kZSB7CisJUDJQX1BTX05PTkUgPSAwLAorCVAyUF9QU19DVFdJTkRPVyA9IDEsCisJUDJQX1BTX05PQSA9IDIsCisJUDJQX1BTX01JWCA9IDMsIC8vIENUV2luZG93IGFuZCBOb0EKK307CisKK3N0cnVjdCBydGxfcDJwX3BzX2luZm8geworCWVudW0gcDJwX3BzX21vZGUgcDJwX3BzX21vZGU7IC8qIGluZGljYXRlIHAycCBwcyBtb2RlICovCisJZW51bSBwMnBfcHNfc3RhdGUgcDJwX3BzX3N0YXRlOyAvKiBpbmRpY2F0ZSBwMnAgcHMgc3RhdGUgKi8KKwl1OCBub2FfaW5kZXg7IC8qIElkZW50aWZpZXMgYW5kIGluc3RhbmNlIG9mIE5vdGljZSBvZiBBYnNlbmNlIHRpbWluZy4gKi8KKwkvKiBDbGllbnQgdHJhZmZpYyB3aW5kb3cuIEEgcGVyaW9kIG9mIHRpbWUgaW4gVFUgYWZ0ZXIgVEJUVC4gKi8KKwl1OCBjdHdpbmRvdzsKKwl1OCBvcHBfcHM7IC8qIG9wcG9ydHVuaXN0aWMgcG93ZXIgc2F2ZS4gKi8KKwl1OCBub2FfbnVtOyAvKiBudW1iZXIgb2YgTm9BIGRlc2NyaXB0b3IgaW4gUDJQIElFLiAqLworCS8qIENvdW50IGZvciBvd25lciwgVHlwZSBvZiBjbGllbnQuICovCisJdTggbm9hX2NvdW50X3R5cGVbUDJQX01BWF9OT0FfTlVNXTsKKwkvKiBNYXggZHVyYXRpb24gZm9yIG93bmVyLCBwcmVmZXJyZWQgb3IKKwkgKiBtaW4gYWNjZXB0YWJsZSBkdXJhdGlvbiBmb3IgY2xpZW50LiAqLworCXUzMiBub2FfZHVyYXRpb25bUDJQX01BWF9OT0FfTlVNXTsKKwkvKiBMZW5ndGggb2YgaW50ZXJ2YWwgZm9yIG93bmVyLCBwcmVmZXJyZWQgb3IKKwkgKiBtYXggYWNjZXB0YWJsZSBpbnRlcnZhbCBvZiBjbGllbnQuICovCisJdTMyIG5vYV9pbnRlcnZhbFtQMlBfTUFYX05PQV9OVU1dOworCS8qIHNjaGVkdWxlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGUgbG93ZXIgNCBieXRlcyBvZiB0aGUgVFNGIHRpbWVyLiAqLworCXUzMiBub2Ffc3RhcnRfdGltZVtQMlBfTUFYX05PQV9OVU1dOworfTsKKworIHN0cnVjdCBwMnBfcHNfb2ZmbG9hZF90IHsKKwl1OCBPZmZsb2FkX0VuOjE7CisJdTggcm9sZToxOyAvKiAxOiBPd25lciwgMDogQ2xpZW50ICovCisJdTggQ1RXaW5kb3dfRW46MTsKKwl1OCBOb0EwX0VuOjE7CisJdTggTm9BMV9FbjoxOworCXU4IEFsbFN0YVNsZWVwOjE7CisJdTggZGlzY292ZXJ5OjE7CisJdTggcmVzZXJ2ZWQ6MTsKK307CisKKyNkZWZpbmUgSVFLX01BVFJJWF9SRUdfTlVNCTgKKyNkZWZpbmUgSVFLX01BVFJJWF9TRVRUSU5HU19OVU0JICgxNCsyNCsyMSkgLy8gQ2hhbm5lbHNfMl80R19OVU0gKyBDaGFubmVsc181R18yME1fTlVNICsgQ2hhbm5lbHNfNUcKK3N0cnVjdCBpcWtfbWF0cml4X3JlZ3MgeworCWJvb2wgYl9pcWtfZG9uZTsKKwlsb25nIHZhbHVlWzFdW0lRS19NQVRSSVhfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgcnRsX3BoeSB7CisJc3RydWN0IGJiX3JlZ19kZWYgcGh5cmVnX2RlZls0XTsJLypSYWRpbyBBL0IvQy9EICovCisJc3RydWN0IGluaXRfZ2FpbiBpbml0Z2Fpbl9iYWNrdXA7CisJZW51bSBpb190eXBlIGN1cnJlbnRfaW9fdHlwZTsKKworCXU4IHJmX21vZGU7CisJdTggcmZfdHlwZTsKKwl1OCBjdXJyZW50X2NoYW5fYnc7CisJdTggc2V0X2J3bW9kZV9pbnByb2dyZXNzOworCXU4IHN3X2NobmxfaW5wcm9ncmVzczsKKwl1OCBzd19jaG5sX3N0YWdlOworCXU4IHN3X2Nobmxfc3RlcDsKKwl1OCBjdXJyZW50X2NoYW5uZWw7CisJdTggaDJjX2JveF9udW07CisJdTggc2V0X2lvX2lucHJvZ3Jlc3M7CisJdTggbGNrX2lucHJvZ3Jlc3M7CisKKwkvKiByZWNvcmQgZm9yIHBvd2VyIHRyYWNraW5nICovCisJczMyIHJlZ19lOTQ7CisJczMyIHJlZ19lOWM7CisJczMyIHJlZ19lYTQ7CisJczMyIHJlZ19lYWM7CisJczMyIHJlZ19lYjQ7CisJczMyIHJlZ19lYmM7CisJczMyIHJlZ19lYzQ7CisJczMyIHJlZ19lY2M7CisJdTggcmZwaWVuYWJsZTsKKwl1OCByZXNlcnZlXzA7CisJdTE2IHJlc2VydmVfMTsKKwl1MzIgcmVnX2MwNCwgcmVnX2MwOCwgcmVnXzg3NDsKKwl1MzIgYWRkYV9iYWNrdXBbMTZdOworCXUzMiBpcWtfbWFjX2JhY2t1cFtJUUtfTUFDX1JFR19OVU1dOworCXUzMiBpcWtfYmJfYmFja3VwWzEwXTsKKwlib29sIGlxa19pbml0aWFsaXplZDsKKworCWJvb2wgcmZwYXRoX3J4X2VuYWJsZVtNQVhfUkZfUEFUSF07CisJLypKYWd1YXIqLworCXU4IHJlZ184Mzc7CisJLyogRHVsIG1hYyAqLworCWJvb2wgYl9uZWVkX2lxazsKKwlzdHJ1Y3QgaXFrX21hdHJpeF9yZWdzIGlxa19tYXRyaXhfcmVnc2V0dGluZ1tJUUtfTUFUUklYX1NFVFRJTkdTX05VTV07CisKKwlib29sIGJfcmZwaV9lbmFibGU7CisKKwlib29sIGJfaXFrX2luX3Byb2dyZXNzOworCisJdTggcHdyZ3JvdXBfY250OworCXU4IGJjY2tfaGlnaF9wb3dlcjsKKwkvKiB0aGlzIGlzIGZvciA4OEUgJiA4NzIzQSAqLworCXUzMiBtY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W01BWF9QR19HUk9VUF1bMTZdOworCS8qIHRoaXMgaXMgZm9yIDkyRUUgKi8KKwl1MzIgdHhfcG93ZXJfYnlfcmF0ZV9vZmZzZXRbVFhfUFdSX0JZX1JBVEVfTlVNX0JBTkRdCisJCQkJICAgW1RYX1BXUl9CWV9SQVRFX05VTV9SRl0KKwkJCQkgICBbVFhfUFdSX0JZX1JBVEVfTlVNX1JGXQorCQkJCSAgIFtUWF9QV1JfQllfUkFURV9OVU1fU0VDVElPTl07CisJdTggdHhwd3JfYnlfcmF0ZV9iYXNlXzI0Z1tUWF9QV1JfQllfUkFURV9OVU1fUkZdCisJCQkJIFtUWF9QV1JfQllfUkFURV9OVU1fUkZdCisJCQkJIFtNQVhfQkFTRV9OVU1fSU5fUEhZX1JFR19QR18yNEddOworCisJdTggdHhwd3JfYnlfcmF0ZV9iYXNlXzVnW1RYX1BXUl9CWV9SQVRFX05VTV9SRl0KKwkJCQlbVFhfUFdSX0JZX1JBVEVfTlVNX1JGXQorCQkJCVtNQVhfQkFTRV9OVU1fSU5fUEhZX1JFR19QR181R107CisJdTggZGVmYXVsdF9pbml0aWFsZ2Fpbls0XTsKKworCS8qIHRoZSBjdXJyZW50IFR4IHBvd2VyIGxldmVsICovCisJdTggY3VyX2Nja190eHB3cmlkeDsKKwl1OCBjdXJfb2ZkbTI0Z190eHB3cmlkeDsKKwl1OCBjdXJfYncyMF90eHB3cmlkeDsKKwl1OCBjdXJfYnc0MF90eHB3cmlkeDsKKworCXUzMiByZnJlZ19jaG5sdmFsWzJdOworCWJvb2wgYl9hcGtfZG9uZTsKKwl1MzIgcmVnX3JmM2NbMl07CS8qIHBhdGhBIC8gcGF0aEIgICovCisKKwl1MzIgYmFja3VwX3JmXzB4MWE7Lyo5MmVlKi8KKwkvKiBiZnN5bmMgKi8KKwl1OCBmcmFtZXN5bmM7CisJdTMyIGZyYW1lc3luY19jMzQ7CisKKwl1OCBudW1fdG90YWxfcmZwYXRoOworCXUxNiByZl9wYXRobWFwOworCisJdTggaHdfcm9mX2VuYWJsZTsgLypFbmFibGUgR1BJT1s5XSBhcyBXTCBSRiBIVyBQRG4gc291cmNlKi8KKworCWVudW0gcnRfcG9sYXJpdHlfY3RsIHBvbGFyaXR5X2N0bDsKK307CisKKyNkZWZpbmUgUlRMX0FHR19TVE9QIAkJCQkJCTAKKyNkZWZpbmUgUlRMX0FHR19QUk9HUkVTUwkJCQkJMQorI2RlZmluZSBSVExfQUdHX1NUQVJUIAkJCQkJCTIKKyNkZWZpbmUgUlRMX0FHR19PUEVSQVRJT05BTAkJCQkJMworI2RlZmluZSBSVExfUlhfQUdHX1NUQVJUIAkJCQkJMQorI2RlZmluZSBSVExfUlhfQUdHX1NUT1AgCQkJCQkwCisKK3N0cnVjdCBydGxfcHJpdjsKK3N0cnVjdCBydGxfaW8geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qUENJIE1FTSBtYXAgKi8KKwl1bnNpZ25lZCBsb25nIHBjaV9tZW1fZW5kOwkvKnNoYXJlZCBtZW0gZW5kICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydDsJLypzaGFyZWQgbWVtIHN0YXJ0ICovCisKKwkvKlBDSSBJTyBtYXAgKi8KKwl1bnNpZ25lZCBsb25nIHBjaV9iYXNlX2FkZHI7CS8qZGV2aWNlIEkvTyBhZGRyZXNzICovCisKKwl2b2lkICgqd3JpdGU4X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbCk7CisJdm9pZCAoKndyaXRlMTZfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7CisJdm9pZCAoKndyaXRlMzJfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkciwgdTMyIHZhbCk7CisKKwl1OCgqcmVhZDhfc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyKTsKKwl1MTYoKnJlYWQxNl9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIpOworCXUzMigqcmVhZDMyX3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkcik7CisKK307CisKK3N0cnVjdCBydGxfbWFjIHsKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisJdTggbWFjODAyMTFfcmVnaXN0ZXJlZDsKKwl1OCBiZWFjb25fZW5hYmxlZDsKKworCXUzMiB0eF9zc19udW07CisJdTMyIHJ4X3NzX251bTsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG9wbW9kZTsKKworCS8qUHJvYmUgQmVhY29uIG1hbmFnZW1lbnQgKi8KKwllbnVtIHJ0bF9saW5rX3N0YXRlIGxpbmtfc3RhdGU7CisKKwlpbnQgbl9jaGFubmVsczsKKwlpbnQgbl9iaXRyYXRlczsKKworCWJvb2wgb2ZmY2hhbl9kZWxleTsKKwl1OCBwMnA7CS8qdXNpbmcgcDJwIHJvbGUqLworCWJvb2wgcDJwX2luX3VzZTsKKworCS8qZmlsdGVycyAqLworCXUzMiByeF9jb25mOworCisJYm9vbCBhY3Rfc2Nhbm5pbmc7CisJdTggY250X2FmdGVyX2xpbmtlZDsKKwlib29sIHNraXBfc2NhbjsKKworCS8qIGVhcmx5IG1vZGUgKi8KKwkvKiBza2Igd2FpdCBxdWV1ZSAqLworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3dhaXRxW01BWF9USURfQ09VTlRdOworCisJLypSREcqLworCWJvb2wgcmRnX2VuOworCisJLypBUCovCisJdTggYnNzaWRbNl07CisJdTMyIHZlbmRvcjsKKwl1MzIgYmFzaWNfcmF0ZXM7IC8qIGIvZyByYXRlcyAqLworCXU4IGh0X2VuYWJsZTsKKwl1OCBid180MDsKKwl1OCBtb2RlOwkJLyogd2lyZWxlc3MgbW9kZSAqLworCXU4IHNsb3RfdGltZTsKKwl1OCBzaG9ydF9wcmVhbWJsZTsKKwl1OCB1c2VfY3RzX3Byb3RlY3Q7CisJdTggY3VyXzQwX3ByaW1lX3NjOworCXU4IGN1cl80MF9wcmltZV9zY19iazsKKwl1OCBjdXJfODBfcHJpbWVfc2M7CisJdTY0IHRzZjsKKwl1OCByZXRyeV9zaG9ydDsKKwl1OCByZXRyeV9sb25nOworCXUxNiBhc3NvY19pZDsKKwlib29sIGJoaWRkZW5zc2lkOworCisJLypJQlNTKi8KKwlpbnQgYmVhY29uX2ludGVydmFsOworCisJLypBTVBEVSovCisJdTggbWluX3NwYWNlX2NmZzsJLypGb3IgTWluIHNwYWNpbmcgY29uZmlndXJhdGlvbnMgKi8KKwl1OCBtYXhfbXNzX2RlbnNpdHk7CisJdTggY3VycmVudF9hbXBkdV9mYWN0b3I7CisJdTggY3VycmVudF9hbXBkdV9kZW5zaXR5OworCisJLypRT1MgJiBFRENBICovCisJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgZWRjYV9wYXJhbVtSVExfTUFDODAyMTFfTlVNX1FVRVVFXTsKKwlzdHJ1Y3QgcnRsX3Fvc19wYXJhbWV0ZXJzIGFjW0FDX01BWF07Cit9OworCitzdHJ1Y3QgcnRsX2hhbCB7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwlib29sIGRyaXZlcl9pc19nb2luZ3RvX3VubG9hZDsKKwlib29sIHVwX2ZpcnN0X3RpbWU7CisJYm9vbCBiZmlyc3RfaW5pdDsKKwlib29sIGJlaW5nX2luaXRfYWRhcHRlcjsKKwlib29sIGJfYmJyZl9yZWFkeTsKKwlib29sIGJfbWFjX2Z1bmNfZW5hYmxlOworCWJvb2wgYl9wcmVfZWRjY2FfZW5hYmxlOworCisJZW51bSBpbnRmX3R5cGUgaW50ZXJmYWNlOworCXUxNiBod190eXBlOwkJLyo5MmMgb3IgOTJkIG9yIDkycyBhbmQgc28gb24gKi8KKwl1OCBpY19jbGFzczsKKwl1OCBvZW1faWQ7CisJdTMyIHZlcnNpb247CQkvKnZlcnNpb24gb2YgY2hpcCAqLworCXU4IHN0YXRlOwkJLypzdG9wIDAsIHN0YXJ0IDEgKi8KKwl1OCBib2FkX3R5cGU7CisKKwkvKmZpcm13YXJlICovCisJdTMyIGZ3c2l6ZTsKKwl1OCAqcGZpcm13YXJlOworCXUxNiBmd192ZXJzaW9uOworCXUxNiBmd19zdWJ2ZXJzaW9uOworCWJvb2wgYl9oMmNfc2V0aW5wcm9ncmVzczsKKwl1OCBsYXN0X2htZWJveG51bTsKKwlib29sIGJmd19yZWFkeTsKKworCS8qUmVzZXJ2ZSBwYWdlIHN0YXJ0IG9mZnNldCBleGNlcHQgYmVhY29uIGluIFR4US4gKi8KKwl1OCBmd19yc3ZkcGFnZV9zdGFydG9mZnNldDsKKwl1OCBoMmNfdHhjbWRfc2VxOworCXU4IGN1cnJlbnRfcmFfcmF0ZTsKKworCS8qIEZXIENtZCBJTyByZWxhdGVkICovCisJdTE2IGZ3Y21kX2lvbWFwOworCXUzMiBmd2NtZF9pb3BhcmFtOworCWJvb2wgc2V0X2Z3Y21kX2lucHJvZ3Jlc3M7CisJdTggY3VycmVudF9md2NtZF9pbzsKKworCWJvb2wgYmZ3X2Nsa19jaGFuZ2VfaW5fcHJvZ3Jlc3M7CisJYm9vbCBiYWxsb3dfc3dfdG9fY2hhbmdlX2h3Y2xjOworCXU4IGZ3X3BzX3N0YXRlOworCSBzdHJ1Y3QgcDJwX3BzX29mZmxvYWRfdCBwMnBfcHNfb2ZmbG9hZDsKKwkvKiovCisJYm9vbCBkcml2ZXJfZ29pbmcydW5sb2FkOworCisJLypBTVBEVSBpbml0IG1pbiBzcGFjZSovCisJdTggbWluc3BhY2VfY2ZnOwkvKkZvciBNaW4gc3BhY2luZyBjb25maWd1cmF0aW9ucyAqLworCisJLyogRHVsIG1hYyAqLworCWVudW0gbWFjcGh5X21vZGUgbWFjcGh5bW9kZTsKKwllbnVtIGJhbmRfdHlwZSBjdXJyZW50X2JhbmR0eXBlOwkvKiAwOjIuNEcsIDE6NUcgKi8KKwllbnVtIGJhbmRfdHlwZSBjdXJyZW50X2JhbmR0eXBlYmFja3VwOworCWVudW0gYmFuZF90eXBlIGJhbmRzZXQ7CisJLyogZHVhbCBNQUMgMC0tTWFjMCAxLS1NYWMxICovCisJdTMyIGludGVyZmFjZWluZGV4OworCS8qIGp1c3QgZm9yIER1bE1hYyBTM1M0ICovCisJdTggbWFjcGh5Y3RsX3JlZzsKKwlib29sIGJfZWFybHltb2RlX2VuYWJsZTsKKwl1OCBtYXhfZWFybHltb2RlX251bTsKKwkvKiBEdWwgbWFjKi8KKwlib29sIGR1cmluZ19tYWMwaW5pdF9yYWRpb2I7CisJYm9vbCBkdXJpbmdfbWFjMWluaXRfcmFkaW9hOworCWJvb2wgcmVsb2FkdHhwb3dlcmluZGV4OworCS8qIFRydWUgaWYgSU1SIG9yIElRSyAgaGF2ZSBkb25lCisJZm9yIDIuNEcgaW4gc2NhbiBwcm9ncmVzcyAqLworCWJvb2wgYl9sb2FkX2ltcmFuZGlxa19zZXR0aW5nX2ZvcjJnOworCisJYm9vbCBkaXNhYmxlX2Ftc2R1XzhrOworCWJvb2wgYm1hc3Rlcl9vZl9kbXNwOworCWJvb2wgYnNsYXZlX29mX2Rtc3A7CisKKwl1MTYgcnhfdGFnOy8qZm9yIDkyZWUqLworCXU4IHJ0c19lbjsKK307CisKK3N0cnVjdCBydGxfc2VjdXJpdHkgeworCS8qZGVmYXVsdCAwICovCisJYm9vbCB1c2Vfc3dfc2VjOworCisJYm9vbCBiZWluZ19zZXRrZXk7CisJYm9vbCB1c2VfZGVmYXVsdGtleTsKKwkvKkVuY3J5cHRpb24gQWxnb3JpdGhtIGZvciBVbmljYXN0IFBhY2tldCAqLworCWVudW0gcnRfZW5jX2FsZyBwYWlyd2lzZV9lbmNfYWxnb3JpdGhtOworCS8qRW5jcnlwdGlvbiBBbGdvcml0aG0gZm9yIEJyb2Nhc3QvTXVsdGljYXN0ICovCisJZW51bSBydF9lbmNfYWxnIGdyb3VwX2VuY19hbGdvcml0aG07CisJLypDYW0gRW50cnkgQml0bWFwICovCisJdTMyIGh3c2VjX2NhbV9iaXRtYXA7CisJdTggaHdzZWNfY2FtX3N0YV9hZGRyW1RPVEFMX0NBTV9FTlRSWV1bRVRIX0FMRU5dOworCS8qbG9jYWwgS2V5IGJ1ZmZlciwgaW5keCAwIGlzIGZvcgorCSAgIHBhaXJ3aXNlIGtleSAxLTQgaXMgZm9yIGFnb3VwIGtleS4gKi8KKwl1OCBrZXlfYnVmW0tFWV9CVUZfU0laRV1bTUFYX0tFWV9MRU5dOworCXU4IGtleV9sZW5bS0VZX0JVRl9TSVpFXTsKKworCS8qVGhlIHBvaW50ZXIgb2YgUGFpcndpc2UgS2V5LAorCSAgIGl0IGFsd2F5cyBwb2ludHMgdG8gS2V5QnVmWzRdICovCisJdTggKnBhaXJ3aXNlX2tleTsKK307CisKK3N0cnVjdCBydGxfZGlnIHsKKwl1OCBkaWdfZW5hYmxlX2ZsYWc7CisJdTggZGlnX2V4dF9wb3J0X3N0YWdlOworCisJdTMyIHJzc2lfbG93dGhyZXNoOworCXUzMiByc3NpX2hpZ2h0aHJlc2g7CisKKwl1MzIgZmFfbG93dGhyZXNoOworCXUzMiBmYV9oaWdodGhyZXNoOworCisJdTggY3Vyc3RhX2Nvbm5lY3RzdGF0ZTsKKwl1OCBwcmVzdGFfY29ubmVjdHN0YXRlOworCXU4IGN1cm11bHRpc3RhX2Nvbm5lY3RzdGF0ZTsKKworCXU4IHByZV9pZ3ZhbHVlOworCXU4IGN1cl9pZ3ZhbHVlOworCisJY2hhciBiYWNrb2ZmX3ZhbDsKKwljaGFyIGJhY2tvZmZfdmFsX3JhbmdlX21heDsKKwljaGFyIGJhY2tvZmZfdmFsX3JhbmdlX21pbjsKKwl1OCByeF9nYWluX3JhbmdlX21heDsKKwl1OCByeF9nYWluX3JhbmdlX21pbjsKKwl1OCByc3NpX3ZhbF9taW47CisJdTggbWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtOworCWxvbmcgbGFzdF9taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG07CisKKwl1OCBwcmVfY2NrX3BkX3N0YXRlOworCXU4IGN1cl9jY2tfcGRfc3RhdGU7CisKKwl1OCBsYXJnZV9mYV9oaXQ7CisJdTggZm9yYmlkZGVuX2lnaTsKKwl1MzIgcmVjb3Zlcl9jbnQ7CisKK307CisKK3N0cnVjdCBydGxfcHN0YmwgeworCXU4IHByZV9jY2FzdGF0ZTsKKwl1OCBjdXJfY2Nhc2F0ZTsKKworCXU4IHByZV9yZnN0YXRlOworCXU4IGN1cl9yZnN0YXRlOworCisJbG9uZyByc3NpX3ZhbF9taW47CisKK307CisKKyNkZWZpbmUgQVNTT0NJQVRFX0VOVFJZX05VTQkzMisxCisKK3N0cnVjdCBmYXN0X2FudF90cmFpbm5pbmd7CisJdTggYnNzaWRbNl07CisJdTggYW50c2VsX3J4X2tlZXBfMDsKKwl1OCBhbnRzZWxfcnhfa2VlcF8xOworCXU4IGFudHNlbF9yeF9rZWVwXzI7CisJdTMyIGFudF9zdW1fcnNzaVs3XTsKKwl1MzIgYW50X3Jzc2lfY250WzddOworCXUzMiBhbnRfYXZlX3Jzc2lbN107CisJdTggZmF0X3N0YXRlOworCXUzMiB0cmFpbl9pZHg7CisJdTggYW50c2VsX2FbQVNTT0NJQVRFX0VOVFJZX05VTV07CisJdTggYW50c2VsX2JbQVNTT0NJQVRFX0VOVFJZX05VTV07CisJdTggYW50c2VsX2NbQVNTT0NJQVRFX0VOVFJZX05VTV07CisJdTMyIG1haW5fYW50X3N1bVtBU1NPQ0lBVEVfRU5UUllfTlVNXTsKKwl1MzIgYXV4X2FudF9zdW1bQVNTT0NJQVRFX0VOVFJZX05VTV07CisJdTMyIG1haW5fYW50X2NudFtBU1NPQ0lBVEVfRU5UUllfTlVNXTsKKwl1MzIgYXV4X2FudF9jbnRbQVNTT0NJQVRFX0VOVFJZX05VTV07CisJdTggcnhfaWRsZV9hbnQ7CisJYm9vbCBiX2JlY29tZWxpbmtlZDsKK307CisKK3N0cnVjdCBkbV9waHlfZGJnX2luZm8geworCWNoYXIgcnhfc25yZGJbNF07CisJdTY0IG51bV9xcnlfcGh5X3N0YXR1czsKKwl1NjQgbnVtX3FyeV9waHlfc3RhdHVzX2NjazsKKwl1NjQgbnVtX3FyeV9waHlfc3RhdHVzX29mZG07CisJdTE2IG51bV9xcnlfYmVhY29uX3BrdDsKKwl1MTYgbnVtX25vbl9iZV9wa3Q7CisJczMyIHJ4X2V2bVs0XTsKK307CisKK3N0cnVjdCBydGxfZG0geworCS8qUEhZIHN0YXR1cyBmb3IgRE0gKi8KKwlsb25nIGVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGI7CisJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOwkvKm91dCBkbSAqLworCWxvbmcgZW50cnlfbWF4X3VuZGVjb3JhdGVkc21vb3RoZWRfcHdkYjsKKwlib29sIGJfZG1faW5pdGlhbGdhaW5fZW5hYmxlOworCWJvb2wgYmR5bmFtaWNfdHhwb3dlcl9lbmFibGU7CisJYm9vbCBiY3VycmVudF90dXJib19lZGNhOworCWJvb2wgYmlzX2FueV9ub25iZXBrdHM7CS8qb3V0IGRtICovCisJYm9vbCBiaXNfY3VyX3JkbHN0YXRlOworCWJvb2wgYnR4cG93ZXJfdHJhY2tpbmdpbml0OworCWJvb2wgYl9kaXNhYmxlX2ZyYW1lYnVyc3Rpbmc7CisJYm9vbCBiX2Nja19pbmNoMTQ7CisJYm9vbCBidHhwb3dlcl90cmFja2luZzsKKwlib29sIGJfdXNlcmFtYXNrOworCWJvb2wgYnJmcGF0aF9yeGVuYWJsZVs0XTsKKwlib29sIGJpbmZvcm1fZndfZHJpdmVyY3RybGRtOworCWJvb2wgYmN1cnJlbnRfbXJjX3N3aXRjaDsKKwl1OCB0eHBvd2VyY291bnQ7CisKKwl1OCB0aGVybWFsdmFsdWVfcnhnYWluOworCXU4IHRoZXJtYWx2YWx1ZV9pcWs7CisJdTggdGhlcm1hbHZhbHVlX2xjazsKKwl1OCB0aGVybWFsdmFsdWU7CisJdTggdGhlcm1hbHZhbHVlX2F2Z1tBVkdfVEhFUk1BTF9OVU1dOworCXU4IHRoZXJtYWx2YWx1ZV9hdmdfaW5kZXg7CisJYm9vbCBiZG9uZV90eHBvd2VyOworCXU4IGxhc3RfZHRwX2x2bDsKKwl1OCBkeW5hbWljX3R4aGlnaHBvd2VyX2x2bDsJLypUeCBoaWdoIHBvd2VyIGxldmVsICovCisJdTggZG1fZmxhZzsJLypJbmRpY2F0ZSBpZiBlYWNoIGR5bmFtaWMgbWVjaGFuaXNtJ3Mgc3RhdHVzLiAqLworCXU4IGRtX3R5cGU7CisJdTggdHhwb3dlcl90cmFja19jb250cm9sOworCWJvb2wgYmludGVycnVwdF9taWdyYXRpb247CisJYm9vbCBiZGlzYWJsZV90eF9pbnQ7CisJY2hhciBvZmRtX2luZGV4W01BWF9SRl9QQVRIXTsKKwl1OCBkZWZhdWx0X29mZG1faW5kZXg7CisJdTggZGVmYXVsdF9jY2tfaW5kZXg7CisJY2hhciBjY2tfaW5kZXg7CisJY2hhciBkZWx0YV9wb3dlcl9pbmRleFtNQVhfUkZfUEFUSF07CisJY2hhciBkZWx0YV9wb3dlcl9pbmRleF9sYXN0W01BWF9SRl9QQVRIXTsKKwljaGFyIHBvd2VyX2luZGV4X29mZnNldFtNQVhfUkZfUEFUSF07CisJY2hhciBhYm9zbHV0ZV9vZmRtX3N3aW5nX2lkeFtNQVhfUkZfUEFUSF07CisJY2hhciByZW1uYW50X29mZG1fc3dpbmdfaWR4W01BWF9SRl9QQVRIXTsKKwljaGFyIHJlbW5hbnRfY2NrX2lkeDsKKwlib29sIG1vZGlmeV90eGFnY19mbGFnX3BhdGhfYTsKKwlib29sIG1vZGlmeV90eGFnY19mbGFnX3BhdGhfYjsKKworCWJvb2wgYl9vbmVfZW50cnlfb25seTsKKwlzdHJ1Y3QgZG1fcGh5X2RiZ19pbmZvIGRiZ2luZm87CisJLyogRHluYW1pYyBBVEMgc3dpdGNoICovCisKKwlib29sIGF0Y19zdGF0dXM7CisJYm9vbCBsYXJnZV9jZm9faGl0OworCWJvb2wgaXNfZnJlZXplOworCWludCBjZm9fdGFpbFsyXTsKKwlpbnQgY2ZvX2F2ZV9wcmU7CisJaW50IGNyeXN0YWxfY2FwOworCXU4IGNmb190aHJlc2hvbGQ7CisJdTMyIHBhY2tldF9jb3VudDsKKwl1MzIgcGFja2V0X2NvdW50X3ByZTsKKwl1OCB0eF9yYXRlOworCisKKwkvKjg4ZSB0eCBwb3dlciB0cmFja2luZyovCisJdTggYmJfc3dpbmdfaWR4X29mZG1bMl07CisJdTggYmJfc3dpbmdfaWR4X29mZG1fY3VycmVudDsKKwl1OCBiYl9zd2luZ19pZHhfb2ZkbV9iYXNlW01BWF9SRl9QQVRIXTsKKwlib29sIGJiX3N3aW5nX2ZsYWdfT2ZkbTsKKwl1OCBiYl9zd2luZ19pZHhfY2NrOworCXU4IGJiX3N3aW5nX2lkeF9jY2tfY3VycmVudDsKKwl1OCBiYl9zd2luZ19pZHhfY2NrX2Jhc2U7CisJYm9vbCBiYl9zd2luZ19mbGFnX2NjazsKKworCWNoYXIgYmJfc3dpbmdfZGlmZl8yZzsKKwljaGFyIGJiX3N3aW5nX2RpZmZfNWc7CisKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOworICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25bREVMVEFfU1dJTkdJRFhfU0laRV07CisgICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYl9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX3BbREVMVEFfU1dJTkdJRFhfU0laRV07CisgICAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKKyAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOworICAgCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdiX25bREVMVEFfU1dJTkdJRFhfU0laRV07CisgICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9wW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKyAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdhX25bQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOworICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfcFtCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07CisgICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYl9uW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKyAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wXzgxODhlW0RFTFRBX1NXSU5HSURYX1NJWkVdOworICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25fODE4OGVbREVMVEFfU1dJTkdJRFhfU0laRV07CisKKworCS8qIERNU1AgKi8KKwlib29sIHN1cHBfcGh5bW9kZV9zd2l0Y2g7CisKKwkvKiBEdWxNYWMgKi8KKwlzdHJ1Y3QgcnRsX2RpZyBkbV9kaWd0YWJsZTsKKwlzdHJ1Y3QgcnRsX3BzdGJsIGRtX3BzdGFibGU7CisJc3RydWN0IGZhc3RfYW50X3RyYWlubmluZyBmYXRfdGFibGU7CisKKwl1OAlyZXNwX3R4X3BhdGg7CisJdTggCXBhdGhfc2VsOworCXUzMglwYXRoYV9zdW07CisJdTMyCXBhdGhiX3N1bTsKKwl1MzIJcGF0aGFfY250OworCXUzMglwYXRoYl9jbnQ7CisKKwl1OCBwcmVfY2hhbm5lbDsKKwl1OCAqcF9jaGFubmVsOworCXU4IGxpbmtlZF9pbnRlcnZhbDsKKworCXU2NCBsYXN0X3R4X29rX2NudDsKKwl1NjQgbGFzdF9yeF9va19jbnQ7Cit9OworCisjZGVmaW5lCUVGVVNFX01BWF9MT0dJQ0FMX1NJWkUJCTI1NgorCitzdHJ1Y3QgcnRsX2VmdXNlIHsKKwlib29sIGJhdXRvTG9hZF9vazsKKwlib29sIGJvb3Rmcm9tZWZ1c2U7CisJdTE2IG1heF9waHlzaWNhbF9zaXplOworCisJdTggZWZ1c2VfbWFwWzJdW0VGVVNFX01BWF9MT0dJQ0FMX1NJWkVdOworCXUxNiBlZnVzZV91c2VkYnl0ZXM7CisJdTggZWZ1c2VfdXNlZHBlcmNlbnRhZ2U7CisjaWZkZWYgRUZVU0VfUkVQR19XT1JLQVJPVU5ECisJYm9vbCBlZnVzZV9yZV9wZ19zZWMxZmxhZzsKKwl1OCBlZnVzZV9yZV9wZ19kYXRhWzhdOworI2VuZGlmCisKKwl1OCBhdXRvbG9hZF9mYWlsZmxhZzsKKwl1OCBhdXRvbG9hZF9zdGF0dXM7CisKKwlzaG9ydCBlcHJvbXR5cGU7CisJdTE2IGVlcHJvbV92aWQ7CisJdTE2IGVlcHJvbV9kaWQ7CisJdTE2IGVlcHJvbV9zdmlkOworCXUxNiBlZXByb21fc21pZDsKKwl1OCBlZXByb21fb2VtaWQ7CisJdTE2IGVlcHJvbV9jaGFubmVscGxhbjsKKwl1OCBlZXByb21fdmVyc2lvbjsKKworCXU4IGRldl9hZGRyWzZdOworCXU4IGJvYXJkX3R5cGU7CisJdTggd293bGFuX2VuYWJsZTsKKwl1OCBhbnRlbm5hX2Rpdl9jZmc7CisJdTggYW50ZW5uYV9kaXZfdHlwZTsKKworCWJvb2wgYl90eHB3cl9mcm9tZXByb207CisJdTggZWVwcm9tX2NyeXN0YWxjYXA7CisJdTggZWVwcm9tX3Rzc2lbMl07CisJdTggZWVwcm9tX3Rzc2lfNWdbM11bMl07IC8qIGZvciA1R0wvNUdNLzVHSCBiYW5kLiAqLworCXU4IGVlcHJvbV9wd3JsaW1pdF9odDIwW0NIQU5ORUxfR1JPVVBfTUFYXTsKKwl1OCBlZXByb21fcHdybGltaXRfaHQ0MFtDSEFOTkVMX0dST1VQX01BWF07CisJdTggZWVwcm9tX2NobmxhcmVhX3R4cHdyX2Nja1syXVtDSEFOTkVMX0dST1VQX01BWF8yR107CisJdTggZWVwcm9tX2NobmxhcmVhX3R4cHdyX2h0NDBfMXNbMl1bQ0hBTk5FTF9HUk9VUF9NQVhdOworCXU4IGVlcHJvbV9jaG5sYXJlYV90eHB3cl9odDQwXzJzZGlpZlsyXVtDSEFOTkVMX0dST1VQX01BWF07CisKKworCXU4IGludGVybmFsX3BhXzVnWzJdOwkvKiBwYXRoQSAvIHBhdGhCICovCisJdTggZWVwcm9tX2M5OworCXU4IGVlcHJvbV9jYzsKKworCS8qRm9yIHBvd2VyIGdyb3VwICovCisJdTggZWVwcm9tX3B3cmdyb3VwWzJdWzNdOworCXU4IHB3cmdyb3VwX2h0MjBbMl1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKKwl1OCBwd3Jncm91cF9odDQwWzJdW0NIQU5ORUxfTUFYX05VTUJFUl07CisKKwl1OCB0eHB3cmxldmVsX2Nja1tNQVhfUkZfUEFUSF1bQ0hBTk5FTF9NQVhfTlVNQkVSXzJHXTsKKwkvKkZvciBIVCA0ME1IWiBwd3IgKi8KKwl1OCB0eHB3cmxldmVsX2h0NDBfMXNbTUFYX1JGX1BBVEhdW0NIQU5ORUxfTUFYX05VTUJFUl07CisJLypGb3IgSFQgNDBNSFogcHdyICovCisJdTggdHhwd3JsZXZlbF9odDQwXzJzW01BWF9SRl9QQVRIXVtDSEFOTkVMX01BWF9OVU1CRVJdOworCWNoYXIgdHhwd3JfY2NrZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsgLypDQ0tfMjRHX0RpZmYqLworCS8qSFQgMjA8LT40MCBQd3IgZGlmZiAqLworCWNoYXIgdHhwd3JfaHQyMGRpZmZbTUFYX1JGX1BBVEhdW01BWF9UWF9DT1VOVF07CS8qQlcyMF8yNEdfRGlmZiovCisJY2hhciB0eHB3cl9odDQwZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsvKkJXNDBfMjRHX0RpZmYqLworCS8qRm9yIEhUPC0+bGVnYWN5IHB3ciBkaWZmICovCisJY2hhciB0eHB3cl9sZWdhY3lodGRpZmZbTUFYX1JGX1BBVEhdW01BWF9UWF9DT1VOVF07LypPRkRNXzI0R19EaWZmKi8KKworCXU4IHR4cHdyXzVnX2J3NDBiYXNlW01BWF9SRl9QQVRIXVtDSEFOTkVMX01BWF9OVU1CRVJdOworCXU4IHR4cHdyXzVnX2J3ODBiYXNlW01BWF9SRl9QQVRIXVtDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNXTsKKwljaGFyIHR4cHdyXzVnX29mZG1kaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworCWNoYXIgdHhwd3JfNWdfYncyMGRpZmZbTUFYX1JGX1BBVEhdW01BWF9UWF9DT1VOVF07CisJY2hhciB0eHB3cl81Z19idzQwZGlmZltNQVhfUkZfUEFUSF1bTUFYX1RYX0NPVU5UXTsKKwljaGFyIHR4cHdyXzVnX2J3ODBkaWZmW01BWF9SRl9QQVRIXVtNQVhfVFhfQ09VTlRdOworCisJdTggdHhwd3Jfc2FmZXR5ZmxhZzsJCS8qIEJhbmQgZWRnZSBlbmFibGUgZmxhZyAqLworCXUxNiBlZXByb21fdHhwb3dlcmRpZmY7CisJdTggbGVnYWN5X2h0dHhwb3dlcmRpZmY7CS8qIExlZ2FjeSB0byBIVCByYXRlIHBvd2VyIGRpZmYgKi8KKwl1OCBhbnRlbm5hX3R4cHdkaWZmWzNdOworCisJdTggZWVwcm9tX3JlZ3VsYXRvcnk7CisJdTggZWVwcm9tX3RoZXJtYWxtZXRlcjsKKwl1OCB0aGVybWFsbWV0ZXJbMl07LypUaGVybWFsTWV0ZXIsIGluZGV4IDAgZm9yIFJGSUMwLCBhbmQgMSBmb3IgUkZJQzEgKi8KKwl1MTYgdHNzaV8xM2RibTsKKwl1OCBjcnlzdGFsY2FwOwkJLyogQ3J5c3RhbENhcC4gKi8KKwl1OCBkZWx0YV9pcWs7CisJdTggZGVsdGFfbGNrOworCisJdTggbGVnYWN5X2h0X3R4cG93ZXJkaWZmOwkvKkxlZ2FjeSB0byBIVCByYXRlIHBvd2VyIGRpZmYgKi8KKwlib29sIGJfYXBrX3RoZXJtYWxtZXRlcmlnbm9yZTsKKworCWJvb2wgYjF4MV9yZWN2Y29tYmluZTsKKwlib29sIGIxc3Nfc3VwcG9ydDsKKworCS8qY2hhbm5lbCBwbGFuICovCisJdTggY2hhbm5lbF9wbGFuOworfTsKKworc3RydWN0IHJ0bF9wc19jdGwgeworCWJvb2wgcHdyZG9tYWluX3Byb3RlY3Q7CisJYm9vbCBiX2luX3Bvd2Vyc2F2ZW1vZGU7CisJYm9vbCByZmNoYW5nZV9pbnByb2dyZXNzOworCWJvb2wgYl9zd3JmX3Byb2Nlc3Npbmc7CisJYm9vbCBiX2h3cmFkaW9vZmY7CisJLyoKKwkgKiBqdXN0IGZvciBQQ0lFIEFTUE0KKwkgKiBJZiBpdCBzdXBwb3J0cyBBU1BNLCBPZmZzZXRbNTYwaF0gPSAweDQwLAorCSAqIG90aGVyd2lzZSBPZmZzZXRbNTYwaF0gPSAweDAwLgorCSAqICovCisJYm9vbCBiX3N1cHBvcnRfYXNwbTsKKwlib29sIGJfc3VwcG9ydF9iYWNrZG9vcjsKKworCS8qZm9yIExQUyAqLworCWVudW0gcnRfcHNtb2RlIGRvdDExX3BzbW9kZTsJLypQb3dlciBzYXZlIG1vZGUgY29uZmlndXJlZC4gKi8KKwlib29sIGJfc3djdHJsX2xwczsKKwlib29sIGJfZndjdHJsX2xwczsKKwl1OCBmd2N0cmxfcHNtb2RlOworCS8qRm9yIEZ3IGNvbnRyb2wgTFBTIG1vZGUgKi8KKwl1OCBiX3JlZ19md2N0cmxfbHBzOworCS8qUmVjb3JkIEZ3IFBTIG1vZGUgc3RhdHVzLiAqLworCWJvb2wgYl9md19jdXJyZW50X2lucHNtb2RlOworCXU4IHJlZ19tYXhfbHBzX2F3YWtlaW50dmw7CisJYm9vbCByZXBvcnRfbGlua2VkOworCWJvb2wgYl9sb3dfcG93ZXJfZW5hYmxlOy8qZm9yIDMyayovCisKKwkvKmZvciBJUFMgKi8KKwlib29sIGJfaW5hY3RpdmVwczsKKworCXUzMiByZm9mZl9yZWFzb247CisKKwkvKlJGIE9GRiBMZXZlbCAqLworCXUzMiBjdXJfcHNfbGV2ZWw7CisJdTMyIHJlZ19yZnBzX2xldmVsOworCisJLypqdXN0IGZvciBQQ0lFIEFTUE0gKi8KKwl1OCBjb25zdF9hbWRwY2lfYXNwbTsKKworCWVudW0gcmZfcHdyc3RhdGUgaW5hY3RpdmVfcHdyc3RhdGU7CisJZW51bSByZl9wd3JzdGF0ZSByZnB3cl9zdGF0ZTsJLypjdXIgcG93ZXIgc3RhdGUgKi8KKworCS8qIGZvciBTVyBMUFMqLworCWJvb2wgc3dfcHNfZW5hYmxlZDsKKwlib29sIHN0YXRlOworCWJvb2wgc3RhdGVfaW5hcDsKKwlib29sIG11bHRpX2J1ZmZlcmVkOworCXUxNiBudWxsZnVuY19zZXE7CisJdW5zaWduZWQgaW50IGR0aW1fY291bnRlcjsKKwl1bnNpZ25lZCBpbnQgc2xlZXBfbXM7CisJdW5zaWduZWQgbG9uZyBsYXN0X3NsZWVwX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBsYXN0X2F3YWtlX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBsYXN0X2RlbGF5bHBzX3N0YW1wX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBsYXN0X2R0aW07CisJdW5zaWduZWQgbG9uZyBsYXN0X2JlYWNvbjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWN0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zbGVwdDsKKworCS8qRm9yIFAyUCBQUyAqLworCXN0cnVjdCBydGxfcDJwX3BzX2luZm8gcDJwX3BzX2luZm87CisJdTggcHdyX21vZGU7CisJdTggc21hcnRfcHM7Cit9OworCitzdHJ1Y3QgcnRsX3N0YXRzIHsKKwl1OCBwc2FkZHJbRVRIX0FMRU5dOworCXUzMiBtYWNfdGltZVsyXTsKKwlzOCByc3NpOworCXU4IHNpZ25hbDsKKwl1OCBub2lzZTsKKwl1OCByYXRlOwkJLyogaHcgZGVzYyByYXRlICovCisJdTggcmF3ZGF0YTsKKwl1OCByZWNlaXZlZF9jaGFubmVsOworCXU4IGNvbnRyb2w7CisJdTggbWFzazsKKwl1OCBmcmVxOworCXUxNiBsZW47CisJdTY0IHRzZjsKKwl1MzIgYmVhY29uX3RpbWU7CisJdTggbmljX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCBzaWduYWxxdWFsaXR5OwkvKmluIDAtMTAwIGluZGV4LiAqLworCS8qCisJICogUmVhbCBwb3dlciBpbiBkQm0gZm9yIHRoaXMgcGFja2V0LAorCSAqIG5vIGJlYXV0aWZpY2F0aW9uIGFuZCBhZ2dyZWdhdGlvbi4KKwkgKiAqLworCXMzMiByZWN2c2lnbmFscG93ZXI7CisJczggcnhwb3dlcjsJCS8qaW4gZEJtIFRyYW5zbGF0ZSBmcm9tIFBXZEIgKi8KKwl1OCBzaWduYWxzdHJlbmd0aDsJLyppbiAwLTEwMCBpbmRleC4gKi8KKwl1MTYgYl9od2Vycm9yOjE7CisJdTE2IGJfY3JjOjE7CisJdTE2IGJfaWN2OjE7CisJdTE2IGJfc2hvcnRwcmVhbWJsZToxOworCXUxNiBhbnRlbm5hOjE7CisJdTE2IGRlY3J5cHRlZDoxOworCXUxNiB3YWtldXA6MTsKKwl1MzIgdGltZXN0YW1wX2xvdzsKKwl1MzIgdGltZXN0YW1wX2hpZ2g7CisJYm9vbCBiX3NoaWZ0OworCisJdTggcnhfZHJ2aW5mb19zaXplOworCXU4IHJ4X2J1ZnNoaWZ0OworCWJvb2wgYl9pc2FtcGR1OworCWJvb2wgYl9pc2ZpcnN0X2FtcGR1OworCWJvb2wgcnhfaXM0ME1oenBhY2tldDsKKwl1MzIgcnhfcHdkYl9hbGw7CisJdTggcnhfbWltb19zaWduYWxzdHJlbmd0aFs0XTsJLyppbiAwfjEwMCBpbmRleCAqLworCXM4IHJ4X21pbW9fc2lnbmFscXVhbGl0eVs0XTsKKwl1OCByeF9taW1vX2V2bV9kYm1bNF07CisJdTE2IGNmb19zaG9ydFs0XTsgCQkvKiBwZXItcGF0aCdzIENmb19zaG9ydCAqLworCXUxNiBjZm9fdGFpbFs0XTsKKworCXU4IHJ4X3B3cls0XTsgLyogcGVyLXBhdGgncyBwd2RiICovCisJdTggcnhfc25yWzRdOyAvKiBwZXItcGF0aCdzIFNOUiAqLworCXU4IGJhbmR3aWR0aDsKKwl1OCBidF9jb2V4X3B3cl9hZGp1c3Q7CisJYm9vbCBiX3BhY2tldF9tYXRjaGJzc2lkOworCWJvb2wgYl9pc19jY2s7CisJYm9vbCBiX2lzX2h0OworCWJvb2wgYl9wYWNrZXRfdG9zZWxmOworCWJvb2wgYl9wYWNrZXRfYmVhY29uOwkvKmZvciByc3NpICovCisJY2hhciBjY2tfYWRjX3B3ZGJbNF07CS8qZm9yIHJ4IHBhdGggc2VsZWN0aW9uICovCisKKwl1OCBwYWNrZXRfcmVwb3J0X3R5cGU7CisKKwl1MzIgbWFjaWQ7CisJdTggd2FrZV9tYXRjaDsKKwl1MzIgYnRfcnhfcnNzaV9wZXJjZW50YWdlOworCXUzMiBtYWNpZF92YWxpZF9lbnRyeVsyXTsKK307CisKK3N0cnVjdCBydF9saW5rX2RldGVjdCB7CisJLyogY291bnQgZm9yIHJhb21pbmcgKi8KKwl1MzIgYmNuX3J4X2lucGVyaW9kOworCXUzMiByb2FtX3RpbWVzOworCisJdTMyIG51bV90eF9pbjRwZXJpb2RbNF07CisJdTMyIG51bV9yeF9pbjRwZXJpb2RbNF07CisKKwl1MzIgbnVtX3R4X2lucGVyaW9kOworCXUzMiBudW1fcnhfaW5wZXJpb2Q7CisKKwlib29sIGJfYnVzeXRyYWZmaWM7CisJYm9vbCBiX3R4X2J1c3lfdHJhZmZpYzsKKwlib29sIGJfcnhfYnVzeV90cmFmZmljOworCWJvb2wgYl9oaWdoZXJfYnVzeXRyYWZmaWM7CisJYm9vbCBiX2hpZ2hlcl9idXN5cnh0cmFmZmljOworCisJdTMyIHRpZHR4X2luNHBlcmlvZFtNQVhfVElEX0NPVU5UXVs0XTsKKwl1MzIgdGlkdHhfaW5wZXJpb2RbTUFYX1RJRF9DT1VOVF07CisJYm9vbCBoaWdoZXJfYnVzeXR4dHJhZmZpY1tNQVhfVElEX0NPVU5UXTsKK307CisKK3N0cnVjdCBydGxfdGNiX2Rlc2MgeworCXU4IGJfcGFja2V0X2J3OjE7CisJdTggYl9tdWx0aWNhc3Q6MTsKKwl1OCBiX2Jyb2FkY2FzdDoxOworCisJdTggYl9ydHNfc3RiYzoxOworCXU4IGJfcnRzX2VuYWJsZToxOworCXU4IGJfY3RzX2VuYWJsZToxOworCXU4IGJfcnRzX3VzZV9zaG9ydHByZWFtYmxlOjE7CisJdTggYl9ydHNfdXNlX3Nob3J0Z2k6MTsKKwl1OCBydHNfc2M6MTsKKwl1OCBiX3J0c19idzoxOworCXU4IHJ0c19yYXRlOworCisJdTggdXNlX3Nob3J0Z2k6MTsKKwl1OCB1c2Vfc2hvcnRwcmVhbWJsZToxOworCXU4IHVzZV9kcml2ZXJfcmF0ZToxOworCXU4IGRpc2FibGVfcmF0ZWZhbGxiYWNrOjE7CisKKwl1OCByYXRyX2luZGV4OworCXU4IG1hY19pZDsKKwl1OCBod19yYXRlOworCisJdTggYl9sYXN0X2luaXBrdDoxOworCXU4IGJfY21kX29yX2luaXQ6MTsKKwl1OCBxdWV1ZV9pbmRleDsKKworCS8qIGVhcmx5IG1vZGUgKi8KKwl1OCBlbXBrdF9udW07CisJLyogVGhlIG1heCB2YWx1ZSBieSBIVyAqLworCXUzMiBlbXBrdF9sZW5bMTBdOworCWJvb2wgYnR4X2VuYWJsZV9zd19jYWxjX2R1cmF0aW9uOworCS8qIHVzZWQgZm9yIGhhbCBjb25zdHJ1Y3QgcGt0LAorCSAqIHdlIG1heSBzZXQgZGVzYyB3aGVuIHR4ICovCisJdTggc2VsZl9kZXNjOworfTsKKworc3RydWN0IHByb3hpbSB7CisJYm9vbCBwcm94aW1fb247CisKKwl2b2lkICpwcm94aW1pdHlfcHJpdjsKKwlpbnQgKCpwcm94aW1fcngpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX3N0YXRzICpzdGF0dXMsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdTggICgqcHJveGltX2dldF92YXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKTsKK307CisKK3N0cnVjdCBydGxfaGFsX29wcyB7CisJaW50ICgqaW5pdF9zd192YXJzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqZGVpbml0X3N3X3ZhcnMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCpyZWFkX2VlcHJvbV9pbmZvKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqaW50ZXJydXB0X3JlY29nbml6ZWQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCisJCQkJICAgICAgdTMyICogcF9pbnRhLCB1MzIgKiBwX2ludGIpOworCWludCAoKmh3X2luaXQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCpod19kaXNhYmxlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqaHdfc3VzcGVuZCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKmh3X3Jlc3VtZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKmVuYWJsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCpkaXNhYmxlX2ludGVycnVwdCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJaW50ICgqc2V0X25ldHdvcmtfdHlwZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKKwkJCQkgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKKwl2b2lkICgqc2V0X2Noa19ic3NpZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBib29sIGNoZWNrX2Jzc2lkKTsKKwl2b2lkICgqc2V0X2J3X21vZGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCisJCQkgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hfdHlwZSk7CisJIHU4KCpzd2l0Y2hfY2hhbm5lbCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKnNldF9xb3MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIGludCBhY2kpOworCXZvaWQgKCpzZXRfYmNuX3JlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKnNldF9iY25faW50dikgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKnVwZGF0ZV9pbnRlcnJ1cHRfbWFzaykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKKwkJCQkgICAgICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpOworCXZvaWQgKCpnZXRfaHdfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCB2YXJpYWJsZSwgdTggKiB2YWwpOworCXZvaWQgKCpzZXRfaHdfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCB2YXJpYWJsZSwgdTggKiB2YWwpOworCXZvaWQgKCp1cGRhdGVfcmF0ZV90YmwpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHJzc2lfbGV2ZWwpOworCXZvaWQgKCpwcmVfZmlsbF90eF9iZF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICp0eF9iZF9kZXNjLAorCQkJCSAgICAgdTggKmRlc2MsIHU4IHF1ZXVlX2luZGV4LAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZG1hX2FkZHJfdCBhZGRyKTsKKwl1MTYgKCpyeF9kZXNjX2J1ZmZfcmVtYWluZWRfY250KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgdTggcXVldWVfaW5kZXgpOworCXZvaWQgKCpyeF9jaGVja19kbWFfb2spIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmhlYWRlcl9kZXNjLAorCQkJCSB1OCBxdWV1ZV9pbmRleCk7CisJdm9pZCAoKmZpbGxfdHhfZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICogaGRyLAorCQkJICAgICAgdTggKiBwZGVzY190eCwgdTggKiBwYmRfZGVzYywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqIGluZm8sCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDcsMCkpCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KKyNlbmRpZgorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwkJCSAgICAgIHN0cnVjdCBza19idWZmICogc2tiLCB1OCBod19xdWV1ZSwKKwkJCSAgICAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CisJdm9pZCAoKmZpbGxfdHhfY21kZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggKiBwZGVzYywKKwkJCQkgYm9vbCBiX2ZpcnN0c2VnLCBib29sIGJfbGFzdHNlZywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKiBza2IpOworCSBib29sKCpxdWVyeV9yeF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAorCQkJICAgICAgIHN0cnVjdCBydGxfc3RhdHMgKiBzdGF0dXMsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKiByeF9zdGF0dXMsCisJCQkgICAgICAgdTggKiBwZGVzYywgc3RydWN0IHNrX2J1ZmYgKiBza2IpOworCXZvaWQgKCpzZXRfY2hhbm5lbF9hY2Nlc3MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCSBib29sKCpyYWRpb19vbm9mZl9jaGVja2luZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggKiB2YWxpZCk7CisJdm9pZCAoKmRtX3dhdGNoZG9nKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqc2Nhbl9vcGVyYXRpb25fYmFja3VwKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCBvcGVyYXRpb24pOworCSBib29sKCpzZXRfcmZfcG93ZXJfc3RhdGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCisJCQkJICAgIGVudW0gcmZfcHdyc3RhdGUgcmZwd3Jfc3RhdGUpOworCXZvaWQgKCpsZWRfY29udHJvbCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKKwkJCSAgICAgZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uKTsKKwl2b2lkICgqc2V0X2Rlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKiBwZGVzYywgYm9vbCBpc3R4LAorCQkJICB1OCBkZXNjX25hbWUsIHU4ICogdmFsKTsKKwkgdTMyKCpnZXRfZGVzYykgKHU4ICogcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lKTsKKwlib29sICgqaXNfdHhfZGVzY19jbG9zZWQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICB1OCBod19xdWV1ZSwgdTE2IGluZGV4KTsKKwl2b2lkICgqdHhfcG9sbGluZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTggaHdfcXVldWUpOworCXZvaWQgKCplbmFibGVfaHdfc2VjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqc2V0X2tleSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTMyIGtleV9pbmRleCwKKwkJCSB1OCAqIHBfbWFjYWRkciwgYm9vbCBpc19ncm91cCwgdTggZW5jX2FsZ28sCisJCQkgYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKTsKKwl2b2lkICgqaW5pdF9zd19sZWRzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwkgdTMyKCpnZXRfYmJyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7CisJdm9pZCAoKnNldF9iYnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLAorCQkJICAgdTMyIGRhdGEpOworCSB1MzIoKmdldF9yZnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKKwkJCSAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKKwl2b2lkICgqc2V0X3JmcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAorCQkJICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7CisJdm9pZCAoKmFsbG93X2FsbF9kZXN0YWRkcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKTsKKwl2b2lkICgqbGlua2VkX3NldF9yZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCpjaGVja19zd2l0Y2hfdG9fZG1kcCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJdm9pZCAoKmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpkdWFsbWFjX3N3aXRjaF90b19kbWRwKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpjMmhfY29tbWFuZF9oYW5kbGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmJ0X3dpZmlfbWVkaWFfc3RhdHVzX25vdGlmeSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIG1zdGF0ZSk7CisJdm9pZCAoKmJ0X3R1cm5fb2ZmX2J0X2NvZXhpc3RfYmVmb3JlX2VudGVyX2xwcykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZmlsbF9oMmNfY21kKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGVsZW1lbnRfaWQsCisJCQkgICAgICB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKTsKKwlib29sICgqZ2V0X2J0Y19zdGF0dXMpICh2b2lkKTsKKyAgCXUzMiAoKnJ4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgcnRsX3N0YXRzIHN0YXR1cywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit9OworCitzdHJ1Y3QgcnRsX2ludGZfb3BzIHsKKwkvKmNvbSAqLworCXZvaWQgKCpyZWFkX2VmdXNlX2J5dGUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgX29mZnNldCwgdTggKnBidWYpOworCWludCAoKmFkYXB0ZXJfc3RhcnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCphZGFwdGVyX3N0b3ApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCWJvb2wgKCpjaGVja19idWRkeV9wcml2KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCXN0cnVjdCBydGxfcHJpdiAqKmJ1ZGR5X3ByaXYpOworCisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKKwlpbnQgKCphZGFwdGVyX3R4KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKKwkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CisjZWxzZQorLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KKwlpbnQgKCphZGFwdGVyX3R4KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnB0Y2JfZGVzYyk7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjZW5kaWYKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApKQorCXZvaWQgKCpmbHVzaCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCk7CisjZWxzZQorCXZvaWQgKCpmbHVzaCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCk7CisjZW5kaWYKKwlpbnQgKCpyZXNldF90cnhfcmluZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKKwlib29sICgqd2FpdHFfaW5zZXJ0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOworI2Vsc2UKKy8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCisJYm9vbCAoKndhaXRxX2luc2VydCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLworI2VuZGlmCisvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLworCisJLypwY2kgKi8KKwl2b2lkICgqZGlzYWJsZV9hc3BtKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwl2b2lkICgqZW5hYmxlX2FzcG0pIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCisJLyp1c2IgKi8KK307CisKK3N0cnVjdCBydGxfbW9kX3BhcmFtcyB7CisJLyogZGVmYXVsdDogMCA9IHVzaW5nIGhhcmR3YXJlIGVuY3J5cHRpb24gKi8KKwlib29sIHN3X2NyeXB0bzsKKworCS8qIGRlZmF1bHQ6IDEgPSB1c2luZyBubyBsaW5rZWQgcG93ZXIgc2F2ZSAqLworCWJvb2wgYl9pbmFjdGl2ZXBzOworCisJLyogZGVmYXVsdDogMSA9IHVzaW5nIGxpbmtlZCBzdyBwb3dlciBzYXZlICovCisJYm9vbCBiX3N3Y3RybF9scHM7CisKKwkvKiBkZWZhdWx0OiAxID0gdXNpbmcgbGlua2VkIGZ3IHBvd2VyIHNhdmUgKi8KKwlib29sIGJfZndjdHJsX2xwczsKK307CisKK3N0cnVjdCBydGxfaGFsX2NmZyB7CisJdTggYmFyX2lkOworCWJvb2wgd3JpdGVfcmVhZGJhY2s7CisJY2hhciAqbmFtZTsKKwljaGFyICpmd19uYW1lOworCXN0cnVjdCBydGxfaGFsX29wcyAqb3BzOworCXN0cnVjdCBydGxfbW9kX3BhcmFtcyAqbW9kX3BhcmFtczsKKworCS8qdGhpcyBtYXAgdXNlZCBmb3Igc29tZSByZWdpc3RlcnMgb3IgdmFycworCSAgIGRlZmluZWQgaW50IEhBTCBidXQgdXNlZCBpbiBNQUlOICovCisJdTMyIG1hcHNbUlRMX1ZBUl9NQVBfTUFYXTsKKworfTsKKworc3RydWN0IHJ0bF9sb2NrcyB7CisJLyogbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggY29uZl9tdXRleDsKKworCS8qc3BpbiBsb2NrICovCisJc3BpbmxvY2tfdCBpcHNfbG9jazsKKwlzcGlubG9ja190IGlycV90aF9sb2NrOworCXNwaW5sb2NrX3QgaDJjX2xvY2s7CisJc3BpbmxvY2tfdCByZl9wc19sb2NrOworCXNwaW5sb2NrX3QgcmZfbG9jazsKKwlzcGlubG9ja190IGxwc19sb2NrOworCXNwaW5sb2NrX3Qgd2FpdHFfbG9jazsKKwlzcGlubG9ja190IGVudHJ5X2xpc3RfbG9jazsKKworCS8qRlcgY2xvY2sgY2hhbmdlICovCisJc3BpbmxvY2tfdCBmd19wc19sb2NrOworCisJLypEdWwgbWFjKi8KKwlzcGlubG9ja190IGNja19hbmRfcndfcGFnZWFfbG9jazsKKworCS8qRWFzeSBjb25jdXJyZW50Ki8KKwlzcGlubG9ja190IGNoZWNrX3NlbmRwa3RfbG9jazsKKworCXNwaW5sb2NrX3QgaXFrX2xvY2s7Cit9OworCitzdHJ1Y3QgcnRsX3dvcmtzIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKworCS8qdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBkdWFsbWFjX2Vhc3ljb25jdXJyZW50X3JldHJ5dGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgZndfY2xvY2tvZmZfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgZmFzdF9hbnRlbm5hX3RyYWlubmluZ190aW1lcjsKKwkvKnRhc2sgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3Rhc2tsZXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9wcmVwYXJlX2Jjbl90YXNrbGV0OworCisJLyp3b3JrIHF1ZXVlICovCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJ0bF93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdhdGNoZG9nX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaXBzX25pY19vZmZfd3E7CisKKwkvKiBGb3IgU1cgTFBTICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBwc193b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcHNfcmZvbl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGZ3ZXZ0X3dxOworfTsKKworc3RydWN0IHJ0bF9kZWJ1ZyB7CisJdTMyIGRiZ3BfdHlwZVtEQkdQX1RZUEVfTUFYXTsKKwl1MzIgZ2xvYmFsX2RlYnVnbGV2ZWw7CisJdTY0IGdsb2JhbF9kZWJ1Z2NvbXBvbmVudHM7CisKKwkvKiBhZGQgZm9yIHByb2MgZGVidWcgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOworCWNoYXIgcHJvY19uYW1lWzIwXTsKK307CisKKyNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkwCisjZGVmaW5lIE1JTU9fUFNfRFlOQU1JQwkJCTEKKyNkZWZpbmUgTUlNT19QU19OT0xJTUlUCQkJMworCitzdHJ1Y3QgcnRsX2R1YWxtYWNfZWFzeV9jb25jdXJyZW50X2N0bCB7CisJZW51bSBiYW5kX3R5cGUgY3VycmVudGJhbmR0eXBlX2JhY2tmb3JkbWRwOworCWJvb2wgYmNsb3NlX2JiYW5kcmZfZm9yX2Rtc3A7CisJYm9vbCBiY2hhbmdlX3RvX2RtZHA7CisJYm9vbCBiY2hhbmdlX3RvX2Rtc3A7CisJYm9vbCBic3dpdGNoX2luX3Byb2Nlc3M7Cit9OworCitzdHJ1Y3QgcnRsX2Rtc3BfY3RsIHsKKwlib29sIGJhY3RpdmVzY2FuX2Zvcl9zbGF2ZW9mZG1zcDsKKwlib29sIGJzY2FuX2Zvcl9hbm90aGVybWFjX2ZvcmRtc3A7CisJYm9vbCBic2Nhbl9mb3JfaXRzZWxmX2ZvcmRtc3A7CisJYm9vbCBid3JpdGVkaWdfZm9yX2Fub3RoZXJtYWNvZmRtc3A7CisJdTMyIGN1cmRpZ3ZhbHVlX2Zvcl9hbm90aGVybWFjb2ZkbXNwOworCWJvb2wgYmNoYW5nZWNja3Bkc3RhdGVfZm9yX2Fub3RoZXJtYWNvZmRtc3A7CisJdTggY3VyY2NrcGRzdGF0ZV9mb3JfYW5vdGhlcm1hY29mZG1zcDsKKwlib29sIGJjaGFuZ2V0eGhpZ2hwb3dlcmx2bF9mb3JfYW5vdGhlcm1hY29mZG1zcDsKKwl1OCBjdXJ0eGhpZ2hsdmxfZm9yX2Fub3RoZXJtYWNvZmRtc3A7CisJbG9uZyByc3NpdmFsbWluX2Zvcl9hbm90aGVybWFjb2ZkbXNwOworfTsKKworc3RydWN0IHJ0bF9nbG9iYWxfdmFyIHsKKwkvKiBmcm9tIHRoaXMgbGlzdCB3ZSBjYW4gZ2V0CisJICogb3RoZXIgYWRhcHRlcidzIHJ0bF9wcml2ICovCisJc3RydWN0IGxpc3RfaGVhZCBnbGJfcHJpdl9saXN0OworCXNwaW5sb2NrX3QgZ2xiX2xpc3RfbG9jazsKK307CisKK3N0cnVjdCBydGxfYnRjX2luZm8geworCXU4IGJ0X3R5cGU7CisJdTggYnRjb2V4aXN0OworCXU4IGFudF9udW07Cit9OworCitzdHJ1Y3QgcnRsX2J0Y19vcHMgeworCXZvaWQgKCpidGNfaW5pdF92YXJpYWJsZXMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaW5pdF9oYWxfdmFycykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pbml0X2h3X2NvbmZpZykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pcHNfbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCB0eXBlKTsKKwl2b2lkICgqYnRjX3NjYW5fbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1OCBzY2FudHlwZSk7CisJdm9pZCAoKmJ0Y19jb25uZWN0X25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggYWN0aW9uKTsKKwl2b2lkICgqYnRjX21lZGlhc3RhdHVzX25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKKwkJCQkJZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7CisJdm9pZCAoKmJ0Y19wZXJpb2RpY2FsKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwl2b2lkICgqYnRjX2hhbHRfbm90aWZ5KSAodm9pZCk7CisJdm9pZCAoKmJ0Y19idGluZm9fbm90aWZ5KSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgIHU4ICogdG1wX2J1ZiwgdTggbGVuZ3RoKTsKKwlib29sICgqYnRjX2lzX2xpbWl0ZWRfZGlnKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKKwlib29sICgqYnRjX2lzX2Rpc2FibGVfZWRjYV90dXJibykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJYm9vbCAoKmJ0Y19pc19idF9kaXNhYmxlZCkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Cit9OworCitzdHJ1Y3QgcnRsX2J0X2NvZXhpc3QgeworCXN0cnVjdCBydGxfYnRjX29wcyAqYnRjX29wczsKKwlzdHJ1Y3QgcnRsX2J0Y19pbmZvIGJ0Y19pbmZvOworfTsKKworCitzdHJ1Y3QgcnRsX3ByaXYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyNpZmRlZiBWSUZfVE9ETworCXN0cnVjdCB2aWZfcHJpdiB2aWZfcHJpdjsKKyNlbmRpZgorCXN0cnVjdCBydGxfcHJpdiAqYnVkZHlfcHJpdjsKKwlzdHJ1Y3QgcnRsX2dsb2JhbF92YXIgKmdsYl92YXI7CisJc3RydWN0IHJ0bF9kdWFsbWFjX2Vhc3lfY29uY3VycmVudF9jdGwgZWFzeV9jb25jdXJyZW50X2N0bDsKKwlzdHJ1Y3QgcnRsX2Rtc3BfY3RsIGRtc3BfY3RsOworCXN0cnVjdCBydGxfbG9ja3MgbG9ja3M7CisJc3RydWN0IHJ0bF93b3JrcyB3b3JrczsKKwlzdHJ1Y3QgcnRsX21hYyBtYWM4MDIxMTsKKwlzdHJ1Y3QgcnRsX2hhbCBydGxoYWw7CisJc3RydWN0IHJ0bF9yZWd1bGF0b3J5IHJlZ2Q7CisJc3RydWN0IHJ0bF9yZmtpbGwgcmZraWxsOworCXN0cnVjdCBydGxfaW8gaW87CisJc3RydWN0IHJ0bF9waHkgcGh5OworCXN0cnVjdCBydGxfZG0gZG07CisJc3RydWN0IHJ0bF9zZWN1cml0eSBzZWM7CisJc3RydWN0IHJ0bF9lZnVzZSBlZnVzZTsKKworCXN0cnVjdCBydGxfcHNfY3RsIHBzYzsKKwlzdHJ1Y3QgcmF0ZV9hZGFwdGl2ZSByYTsKKwlzdHJ1Y3QgZHluYW1pY19wcmltYXJ5X2NjYSBwcmltYXJ5Y2NhOworCXN0cnVjdCB3aXJlbGVzc19zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgcnRfbGlua19kZXRlY3QgbGlua19pbmZvOworCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0aXN0aWNzIGZhbHNlYWxtX2NudDsKKworCXN0cnVjdCBydGxfcmF0ZV9wcml2ICpyYXRlX3ByaXY7CisKKwlzdHJ1Y3QgcnRsX2RlYnVnIGRiZzsKKworCS8qIHN0YSBlbnRyeSBsaXN0IGZvciBhcCBhZGhvYyBvciBtZXNoICovCisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeV9saXN0OworCisJLyoKKwkgKmhhbF9jZmcgOiBmb3IgZGlmZiBjYXJkcworCSAqaW50Zl9vcHMgOiBmb3IgZGlmZiBpbnRlcnJmYWNlIHVzYi9wY2llCisJICovCisJc3RydWN0IHJ0bF9oYWxfY2ZnICpjZmc7CisJc3RydWN0IHJ0bF9pbnRmX29wcyAqaW50Zl9vcHM7CisKKwkvKnRoaXMgdmFyIHdpbGwgYmUgc2V0IGJ5IHNldF9iaXQsCisJICAgYW5kIHdhcyB1c2VkIHRvIGluZGljYXRlIHN0YXR1cyBvZgorCSAgIGludGVyZmFjZSBvciBoYXJkd2FyZSAqLworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJLyogaW50ZWwgUHJveGltaXR5LCBzaG91bGQgYmUgYWxsb2MgbWVtCisJICogaW4gaW50ZWwgUHJveGltaXR5IG1vZHVsZSBhbmQgY2FuIG9ubHkKKwkgKiBiZSB1c2VkIGluIGludGVsIFByb3hpbWl0eSBtb2RlICovCisJc3RydWN0IHByb3hpbSBwcm94aW1pdHk7CisKKwkvKmZvciBidCBjb2V4aXN0IHVzZSovCisJc3RydWN0IHJ0bF9idF9jb2V4aXN0IGJ0Y29leGlzdDsKKworCS8qIHNlcGVyYXRlIDkyZWUgZnJvbSBvdGhlciBJQ3MsCisJICAqIDkyZWUgdXNlIG5ldyB0cnggZmxvdy4gKi8KKwlib29sIHVzZV9uZXdfdHJ4X2Zsb3c7CisJLypUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbworCSAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhIGFsbG9jYXRlZAorCSAgIGJleW9uZCAgdGhpcyBzdHJ1Y3R1cmUgbGlrZToKKwkgICBydGxfcGNpX3ByaXYgb3IgcnRsX3VzYl9wcml2ICovCisJdTggcHJpdlswXTsKK307CisKKyNkZWZpbmUgcnRsX3ByaXYoaHcpCQkoKChzdHJ1Y3QgcnRsX3ByaXYgKikoaHcpLT5wcml2KSkKKyNkZWZpbmUgcnRsX21hYyhydGxwcml2KQkoJigocnRscHJpdiktPm1hYzgwMjExKSkKKyNkZWZpbmUgcnRsX2hhbChydGxwcml2KQkoJigocnRscHJpdiktPnJ0bGhhbCkpCisjZGVmaW5lIHJ0bF9lZnVzZShydGxwcml2KQkoJigocnRscHJpdiktPmVmdXNlKSkKKyNkZWZpbmUgcnRsX3BzYyhydGxwcml2KQkoJigocnRscHJpdiktPnBzYykpCisjZGVmaW5lIHJ0bF9zZWMocnRscHJpdikgCSgmKChydGxwcml2KS0+c2VjKSkKKyNkZWZpbmUgcnRsX2RtKHJ0bHByaXYpCSgmKChydGxwcml2KS0+ZG0pKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEJsdWV0b290aCBDby1leGlzdGFuY2UgUmVsYXRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBidF9hbnRfbnVtIHsKKyAgICAgICAgQU5UX1gyID0gMCwKKyAgICAgICAgQU5UX1gxID0gMSwKK307CisKK2VudW0gYnRfY29fdHlwZSB7CisgICAgICAgIEJUXzJXSVJFID0gMCwKKyAgICAgICAgQlRfSVNTQ18zV0lSRSA9IDEsCisgICAgICAgIEJUX0FDQ0VMID0gMiwKKyAgICAgICAgQlRfQ1NSX0JDNCA9IDMsCisgICAgICAgIEJUX0NTUl9CQzggPSA0LAorICAgICAgICBCVF9SVEw4NzU2ID0gNSwKKyAgICAgICAgQlRfUlRMODcyM0EgPSA2LAorICAgICAgICBCVF9SVEw4ODIxQSA9IDcsCisgICAgICAgIEJUX1JUTDg3MjNCID0gOCwKKyAgICAgICAgQlRfUlRMODE5MkUgPSA5LAorICAgICAgICBCVF9SVEw4ODEyQSA9IDExLAorfTsKKworZW51bSBidF90b3RhbF9hbnRfbnVteworCUFOVF9UT1RBTF9YMiA9IDAsCisJQU5UX1RPVEFMX1gxID0gMQorfTsKKworZW51bSBidF9jdXJfc3RhdGUgeworICAgICAgICBCVF9PRkYgPSAwLAorICAgICAgICBCVF9PTiA9IDEsCit9OworCitlbnVtIGJ0X3NlcnZpY2VfdHlwZSB7CisgICAgICAgIEJUX1NDTyA9IDAsCisgICAgICAgIEJUX0EyRFAgPSAxLAorICAgICAgICBCVF9ISUQgPSAyLAorICAgICAgICBCVF9ISURfSURMRSA9IDMsCisgICAgICAgIEJUX1NDQU4gPSA0LAorICAgICAgICBCVF9JRExFID0gNSwKKyAgICAgICAgQlRfT1RIRVJfQUNUSU9OID0gNiwKKyAgICAgICAgQlRfQlVTWSA9IDcsCisgICAgICAgIEJUX09USEVSQlVTWSA9IDgsCisgICAgICAgIEJUX1BBTiA9IDksCit9OworCitlbnVtIGJ0X3JhZGlvX3NoYXJlZCB7CisgICAgICAgIEJUX1JBRElPX1NIQVJFRCA9IDAsCisgICAgICAgIEJUX1JBRElPX0lORElWSURVQUwgPSAxLAorfTsKKworc3RydWN0IGJ0X2NvZXhpc3RfaW5mbyB7CisKKwkvKiBFRVBST00gQlQgaW5mby4gKi8KKwl1OCBlZXByb21fYnRfY29leGlzdDsKKwl1OCBlZXByb21fYnRfdHlwZTsKKwl1OCBlZXByb21fYnRfYW50X251bTsKKwl1OCBlZXByb21fYnRfYW50X2lzb2xhdGlvbjsKKwl1OCBlZXByb21fYnRfcmFkaW9fc2hhcmVkOworCisJdTggYnRfY29leGlzdGVuY2U7CisJdTggYnRfYW50X251bTsKKwl1OCBidF9jb2V4aXN0X3R5cGU7CisJdTggYnRfc3RhdGU7CisJdTggYnRfY3VyX3N0YXRlOwkvKiAwOm9uLCAxOm9mZiAqLworCXU4IGJ0X2FudF9pc29sYXRpb247CS8qIDA6Z29vZCwgMTpiYWQgKi8KKwl1OCBidF9wYXBlX2N0cmw7CS8qIDA6U1csIDE6U1cvSFcgZHluYW1pYyAqLworCXU4IGJ0X3NlcnZpY2U7CisJdTggYnRfcmFkaW9fc2hhcmVkX3R5cGU7CisJdTggYnRfcmZyZWdfb3JpZ2luXzFlOworCXU4IGJ0X3JmcmVnX29yaWdpbl8xZjsKKwl1OCBidF9yc3NpX3N0YXRlOworCXUzMiByYXRpb190eDsKKwl1MzIgcmF0aW9fcHJpOworCXUzMiBidF9lZGNhX3VsOworCXUzMiBidF9lZGNhX2RsOworCisJYm9vbCBiX2luaXRfc2V0OworCWJvb2wgYl9idF9idXN5X3RyYWZmaWM7CisJYm9vbCBiX2J0X3RyYWZmaWNfbW9kZV9zZXQ7CisJYm9vbCBiX2J0X25vbl90cmFmZmljX21vZGVfc2V0OworCisJYm9vbCBiX2Z3X2NvZXhpc3RfYWxsX29mZjsKKwlib29sIGJfc3dfY29leGlzdF9hbGxfb2ZmOworCWJvb2wgYl9od19jb2V4aXN0X2FsbF9vZmY7CisJdTMyIGN1cnJlbnRfc3RhdGU7CisJdTMyIHByZXZpb3VzX3N0YXRlOworCXUzMiBjdXJyZW50X3N0YXRlX2g7CisJdTMyIHByZXZpb3VzX3N0YXRlX2g7CisKKwl1OCBidF9wcmVfcnNzaV9zdGF0ZTsKKwl1OCBidF9wcmVfcnNzaV9zdGF0ZTE7CisKKwl1OCBiX3JlZ19idF9pc287CisJdTggYl9yZWdfYnRfc2NvOworCWJvb2wgYl9iYWxhbmNlX29uOworCXU4IGJ0X2FjdGl2ZV96ZXJvX2NudDsKKwlib29sIGJfY3VyX2J0X2Rpc2FibGVkOworCWJvb2wgYl9wcmVfYnRfZGlzYWJsZWQ7CisKKwl1OCBidF9wcm9maWxlX2Nhc2U7CisJdTggYnRfcHJvZmlsZV9hY3Rpb247CisJYm9vbCBiX2J0X2J1c3k7CisJYm9vbCBiX2hvbGRfZm9yX2J0X29wZXJhdGlvbjsKKwl1OCBscHNfY291bnRlcjsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwltZW0gYWNjZXNzIG1hY3JvIGRlZmluZSBzdGFydAorCUNhbGwgZW5kaWFuIGZyZWUgZnVuY3Rpb24gd2hlbgorCTEuIFJlYWQvd3JpdGUgcGFja2V0IGNvbnRlbnQuCisJMi4gQmVmb3JlIHdyaXRlIGludGVnZXIgdG8gSU8uCisJMy4gQWZ0ZXIgcmVhZCBpbnRlZ2VyIGZyb20gSU8uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29udmVydCBsaXR0bGUgZGF0YSBlbmRpYW4gdG8gaG9zdCAqLworI2RlZmluZSBFRjFCWVRFKF92YWwpCQlcCisJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEVGMkJZVEUoX3ZhbCkJCVwKKwkobGUxNl90b19jcHUoX3ZhbCkpCisjZGVmaW5lIEVGNEJZVEUoX3ZhbCkJCVwKKwkobGUzMl90b19jcHUoX3ZhbCkpCisKKy8qIFJlYWQgZGF0YSBmcm9tIG1lbW9yeSAqLworI2RlZmluZSBSRUFERUYxQllURShfcHRyKQlcCisJRUYxQllURSgqKCh1OCAqKShfcHRyKSkpCisjZGVmaW5lIFJFQURFRjJCWVRFKF9wdHIpCVwKKwlFRjJCWVRFKCooKHUxNiAqKShfcHRyKSkpCisjZGVmaW5lIFJFQURFRjRCWVRFKF9wdHIpCVwKKwlFRjRCWVRFKCooKHUzMiAqKShfcHRyKSkpCisKKy8qIFdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCisjZGVmaW5lIFdSSVRFRUYxQllURShfcHRyLCBfdmFsKQlcCisJKCooKHU4ICopKF9wdHIpKSk9RUYxQllURShfdmFsKQorI2RlZmluZSBXUklURUVGMkJZVEUoX3B0ciwgX3ZhbCkJXAorCSgqKCh1MTYgKikoX3B0cikpKT1FRjJCWVRFKF92YWwpCisjZGVmaW5lIFdSSVRFRUY0QllURShfcHRyLCBfdmFsKQlcCisJKCooKHUzMiAqKShfcHRyKSkpPUVGNEJZVEUoX3ZhbCkKKworLypFeGFtcGxlOgorQklUX0xFTl9NQVNLXzMyKDApID0+IDB4MDAwMDAwMDAKK0JJVF9MRU5fTUFTS18zMigxKSA9PiAweDAwMDAwMDAxCitCSVRfTEVOX01BU0tfMzIoMikgPT4gMHgwMDAwMDAwMworQklUX0xFTl9NQVNLXzMyKDMyKSA9PiAweEZGRkZGRkZGKi8KKyNkZWZpbmUgQklUX0xFTl9NQVNLXzMyKF9fYml0bGVuKQkgXAorCSgweEZGRkZGRkZGID4+ICgzMiAtIChfX2JpdGxlbikpKQorI2RlZmluZSBCSVRfTEVOX01BU0tfMTYoX19iaXRsZW4pCSBcCisJKDB4RkZGRiA+PiAoMTYgLSAoX19iaXRsZW4pKSkKKyNkZWZpbmUgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pIFwKKwkoMHhGRiA+PiAoOCAtIChfX2JpdGxlbikpKQorCisvKkV4YW1wbGU6CitCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDAsIDIpID0+IDB4MDAwMDAwMDMKK0JJVF9PRkZTRVRfTEVOX01BU0tfMzIoMTYsIDIpID0+IDB4MDAwMzAwMDAqLworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCShCSVRfTEVOX01BU0tfMzIoX19iaXRsZW4pIDw8IChfX2JpdG9mZnNldCkpCisjZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCisJKEJJVF9MRU5fTUFTS18xNihfX2JpdGxlbikgPDwgKF9fYml0b2Zmc2V0KSkKKyNkZWZpbmUgQklUX09GRlNFVF9MRU5fTUFTS184KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCShCSVRfTEVOX01BU0tfOChfX2JpdGxlbikgPDwgKF9fYml0b2Zmc2V0KSkKKworLypEZXNjcmlwdGlvbjoKK1JldHVybiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nIGZyb20KKzQtYnl0ZSBwb2ludGVyIGluIGxpdHRsZS1lbmRpYW4gc3lzdGVtLiovCisjZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcHN0YXJ0KSBcCisJKEVGNEJZVEUoKigodTMyICopKF9fcHN0YXJ0KSkpKQorI2RlZmluZSBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BzdGFydCkgXAorCShFRjJCWVRFKCooKHUxNiAqKShfX3BzdGFydCkpKSkKKyNkZWZpbmUgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wc3RhcnQpIFwKKwkoRUYxQllURSgqKCh1OCAqKShfX3BzdGFydCkpKSkKKworLypEZXNjcmlwdGlvbjoKK1RyYW5zbGF0ZSBzdWJmaWVsZCAoY29udGludW91cyBiaXRzIGluIGxpdHRsZS1lbmRpYW4pIG9mIDQtYnl0ZQordmFsdWUgdG8gaG9zdCBieXRlIG9yZGVyaW5nLiovCisjZGVmaW5lIExFX0JJVFNfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCSggXAorCQkoIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpICkgICYgXAorCQlCSVRfTEVOX01BU0tfMzIoX19iaXRsZW4pIFwKKwkpCisjZGVmaW5lIExFX0JJVFNfVE9fMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCSggXAorCQkoIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpICkgJiBcCisJCUJJVF9MRU5fTUFTS18xNihfX2JpdGxlbikgXAorCSkKKyNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCisJKCBcCisJCSggTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkgKSAmIFwKKwkJQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pIFwKKwkpCisKKy8qRGVzY3JpcHRpb246CitNYXNrIHN1YmZpZWxkIChjb250aW51b3VzIGJpdHMgaW4gbGl0dGxlLWVuZGlhbikgb2YgNC1ieXRlIHZhbHVlCithbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4gNC1ieXRlIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlcmluZy4qLworI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCSggXAorCQlMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BzdGFydCkgICYgXAorCQkoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgKSBcCisJKQorI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAorCSggXAorCQlMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BzdGFydCkgJiBcCisJCSggfkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19iaXRvZmZzZXQsIF9fYml0bGVuKSApIFwKKwkpCisjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCisJKCBcCisJCUxFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcHN0YXJ0KSAmIFwKKwkJKCB+QklUX09GRlNFVF9MRU5fTUFTS184KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgKSBcCisJKQorCisvKkRlc2NyaXB0aW9uOgorU2V0IHN1YmZpZWxkIG9mIGxpdHRsZS1lbmRpYW4gNC1ieXRlIHZhbHVlIHRvIHNwZWNpZmllZCB2YWx1ZS4JKi8KKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbiwgX192YWwpIFwKKwkqKCh1MzIgKikoX19wc3RhcnQpKSA9IEVGNEJZVEUgXAorCSggXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgfCBcCisJCSggKCgodTMyKV9fdmFsKSAmIEJJVF9MRU5fTUFTS18zMihfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkgKVwKKyAgICAgICApOworI2RlZmluZSBTRVRfQklUU19UT19MRV8yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuLCBfX3ZhbCkgXAorCSooKHUxNiAqKShfX3BzdGFydCkpID0gRUYyQllURSBcCisJKCBcCisJCUxFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSB8IFwKKwkJKCAoKCh1MTYpX192YWwpICYgQklUX0xFTl9NQVNLXzE2KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSApXAorICAgICAgICk7CisjZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4sIF9fdmFsKSBcCisJKigodTggKikoX19wc3RhcnQpKSA9IEVGMUJZVEUgXAorCSggXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgfCBcCisJCSggKCgodTgpX192YWwpICYgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpICkgXAorICAgICAgICk7CisKKyNkZWZpbmUJTl9CWVRFX0FMSUdNRU5UKF9fdmFsdWUsIF9fYWxpZ21lbnQpICgoX19hbGlnbWVudCA9PSAxKSA/IFwKKwkoX192YWx1ZSkgOiAoKChfX3ZhbHVlICsgX19hbGlnbWVudCAtIDEpIC8gX19hbGlnbWVudCkgKiBfX2FsaWdtZW50KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwltZW0gYWNjZXNzIG1hY3JvIGRlZmluZSBlbmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgYnl0ZSh4LG4pICgoeCA+PiAoOCAqIG4pKSAmIDB4ZmYpCisKKyNkZWZpbmUgcGFja2V0X2dldF90eXBlKF9wYWNrZXQpIChFRjFCWVRFKChfcGFja2V0KS5vY3RldFswXSkgJiAweEZDKQorI2RlZmluZSBSVExfV0FUQ0hfRE9HX1RJTUUgICAgCTIwMDAKKyNkZWZpbmUgTVNFQ1ModCkJCW1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfVkVSUykKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAJKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19NT1JFX0RBVEEoZmMpIAkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKQorI2RlZmluZSBTRVFfVE9fU04oc2VxKSAJCSgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisjZGVmaW5lIFNOX1RPX1NFUShzc24pIAkJKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKyNkZWZpbmUgTUFYX1NOIAkJCSgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0FTUE0JCUJJVCgwKQkvKlBDSSBBU1BNICovCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0NMS19SRVEJCUJJVCgxKQkvKlBDSSBjbG9jayByZXF1ZXN0ICovCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX1BDSV9EMwkJQklUKDIpCS8qUENJIEQzIG1vZGUgKi8KKy8qTklDIGhhbHQsIHJlLWluaXRpYWxpemUgaHcgcGFyYW1ldGVycyovCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0hBTFRfTklDCQlCSVQoMykKKyNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRlJFRV9GVwkJQklUKDQpCS8qRlcgZnJlZSwgcmUtZG93bmxvYWQgdGhlIEZXICovCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX0ZXXzMySwkJQklUKDUpCS8qRlcgaW4gMzJrICovCisvKkFsd2F5cyBlbmFibGUgQVNQTSBhbmQgQ2xvY2sgUmVxIGluIGluaXRpYWxpemF0aW9uLiovCisjZGVmaW5lCVJUX1JGX1BTX0xFVkVMX0FMV0FZU19BU1BNCUJJVCg2KQorLyogbm8gbWF0dGVyIFJGT0ZGIG9yIFNMRUVQIHdlIHNldCBQU19BU1BNX0xFVkwqLworI2RlZmluZQlSVF9QU19MRVZFTF9BU1BNCQlCSVQoNykKKy8qV2hlbiBMUFMgaXMgb24sIGRpc2FibGUgMlIgaWYgbm8gcGFja2V0IGlzIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGQuKi8KKyNkZWZpbmUJUlRfUkZfTFBTX0RJU0FMQkVfMlIJCUJJVCgzMCkKKyNkZWZpbmUJUlRfUkZfTFBTX0xFVkVMX0FTUE0JCUJJVCgzMSkJLypMUFMgd2l0aCBBU1BNICovCisjZGVmaW5lCVJUX0lOX1BTX0xFVkVMKHBwc2MsIF9wc19mbGcpCQlcCisJKChwcHNjLT5jdXJfcHNfbGV2ZWwgJiBfcHNfZmxnKSA/IHRydWUgOiBmYWxzZSkKKyNkZWZpbmUJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgX3BzX2ZsZykJXAorCShwcHNjLT5jdXJfcHNfbGV2ZWwgJj0gKH4oX3BzX2ZsZykpKQorI2RlZmluZQlSVF9TRVRfUFNfTEVWRUwocHBzYywgX3BzX2ZsZykJCVwKKwkocHBzYy0+Y3VyX3BzX2xldmVsIHw9IF9wc19mbGcpCisKKyNkZWZpbmUgY29udGFpbmVyX29mX2R3b3JrX3J0bCh4LHkseikgXAorCWNvbnRhaW5lcl9vZihjb250YWluZXJfb2YoeCwgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayksIHksIHopCisKKyNkZWZpbmUgRklMTF9PQ1RFVF9TVFJJTkcoX29zLF9vY3RldCxfbGVuKQlcCisJCShfb3MpLm9jdGV0PSh1OCopKF9vY3RldCk7CQlcCisJCShfb3MpLmxlbmd0aD0oX2xlbik7CisKKyNkZWZpbmUgQ1BfTUFDQUREUihkZXMsc3JjKQlcCisJKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLFwKKwkoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSxcCisJKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pCisKK3N0YXRpYyBpbmxpbmUgdTggcnRsX3JlYWRfYnl0ZShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKQoreworCXJldHVybiBydGxwcml2LT5pby5yZWFkOF9zeW5jKHJ0bHByaXYsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBydGxfcmVhZF93b3JkKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpCit7CisJcmV0dXJuIHJ0bHByaXYtPmlvLnJlYWQxNl9zeW5jKHJ0bHByaXYsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydGxfcmVhZF9kd29yZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKQoreworCXJldHVybiBydGxwcml2LT5pby5yZWFkMzJfc3luYyhydGxwcml2LCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bF93cml0ZV9ieXRlKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbDgpCit7CisJcnRscHJpdi0+aW8ud3JpdGU4X2FzeW5jKHJ0bHByaXYsIGFkZHIsIHZhbDgpOworCisJaWYgKHJ0bHByaXYtPmNmZy0+d3JpdGVfcmVhZGJhY2spCisJCXJ0bHByaXYtPmlvLnJlYWQ4X3N5bmMocnRscHJpdiwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxfd3JpdGVfd29yZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MTYgdmFsMTYpCit7CisJcnRscHJpdi0+aW8ud3JpdGUxNl9hc3luYyhydGxwcml2LCBhZGRyLCB2YWwxNik7CisKKwlpZiAocnRscHJpdi0+Y2ZnLT53cml0ZV9yZWFkYmFjaykKKwkJcnRscHJpdi0+aW8ucmVhZDE2X3N5bmMocnRscHJpdiwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxfd3JpdGVfZHdvcmQoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgIHUzMiBhZGRyLCB1MzIgdmFsMzIpCit7CisJcnRscHJpdi0+aW8ud3JpdGUzMl9hc3luYyhydGxwcml2LCBhZGRyLCB2YWwzMik7CisKKwlpZiAocnRscHJpdi0+Y2ZnLT53cml0ZV9yZWFkYmFjaykKKwkJcnRscHJpdi0+aW8ucmVhZDMyX3N5bmMocnRscHJpdiwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bF9nZXRfYmJyZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKQoreworCXJldHVybiAoKHN0cnVjdCBydGxfcHJpdiAqKShodyktPnByaXYpLT5jZmctPm9wcy0+Z2V0X2JicmVnKGh3LAorCQkJCQkJCQkgICAgcmVnYWRkciwKKwkJCQkJCQkJICAgIGJpdG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3NldF9iYnJlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHJlZ2FkZHIsCisJCQkJIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSkKK3sKKwkoKHN0cnVjdCBydGxfcHJpdiAqKShodyktPnByaXYpLT5jZmctPm9wcy0+c2V0X2JicmVnKGh3LAorCQkJCQkJCSAgICAgcmVnYWRkciwgYml0bWFzaywKKwkJCQkJCQkgICAgIGRhdGEpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bF9nZXRfcmZyZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJZW51bSByYWRpb19wYXRoIHJmcGF0aCwgdTMyIHJlZ2FkZHIsCisJCQkJdTMyIGJpdG1hc2spCit7CisJcmV0dXJuICgoc3RydWN0IHJ0bF9wcml2ICopKGh3KS0+cHJpdiktPmNmZy0+b3BzLT5nZXRfcmZyZWcoaHcsCisJCQkJCQkJCSAgICByZnBhdGgsCisJCQkJCQkJCSAgICByZWdhZGRyLAorCQkJCQkJCQkgICAgYml0bWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxfc2V0X3JmcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgcmVnYWRkciwKKwkJCQkgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQoreworCSgoc3RydWN0IHJ0bF9wcml2ICopKGh3KS0+cHJpdiktPmNmZy0+b3BzLT5zZXRfcmZyZWcoaHcsCisJCQkJCQkJICAgICByZnBhdGgsIHJlZ2FkZHIsCisJCQkJCQkJICAgICBiaXRtYXNrLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2hhbF9zdG9wKHN0cnVjdCBydGxfaGFsICpydGxoYWwpCit7CisJcmV0dXJuIChfSEFMX1NUQVRFX1NUT1AgPT0gcnRsaGFsLT5zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaGFsX3N0YXJ0KHN0cnVjdCBydGxfaGFsICpydGxoYWwpCit7CisJcnRsaGFsLT5zdGF0ZSA9IF9IQUxfU1RBVEVfU1RBUlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaGFsX3N0b3Aoc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCkKK3sKKwlydGxoYWwtPnN0YXRlID0gX0hBTF9TVEFURV9TVE9QOworfQorCitzdGF0aWMgaW5saW5lIHU4IGdldF9yZl90eXBlKHN0cnVjdCBydGxfcGh5ICpydGxwaHkpCit7CisJcmV0dXJuIHJ0bHBoeS0+cmZfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcnRsX2dldF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHNrYi0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJ0bF9nZXRfZmMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUocnRsX2dldF9oZHIoc2tiKS0+ZnJhbWVfY29udHJvbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJ0bF9nZXRfdGlkX2goc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlyZXR1cm4gKGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpKVswXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBydGxfZ2V0X3RpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBydGxfZ2V0X3RpZF9oKHJ0bF9nZXRfaGRyKHNrYikpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfc3RhICpydGxfZmluZF9zdGEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgdTggKm1hY19hZGRyKQoreworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJcmV0dXJuIGllZWU4MDIxMV9maW5kX3N0YShtYWMtPnZpZiwgbWFjX2FkZHIpOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICpydGxfcGNpX2dldF9od19wb2ludGVyKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenNtYWxsb2MvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFmMmEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotY29uZmlnIFpTTUFMTE9DCi0JYm9vbCAiTWVtb3J5IGFsbG9jYXRvciBmb3IgY29tcHJlc3NlZCBwYWdlcyIKLQlkZXBlbmRzIG9uIE1NVQotCWRlZmF1bHQgbgotCWhlbHAKLQkgIHpzbWFsbG9jIGlzIGEgc2xhYi1iYXNlZCBtZW1vcnkgYWxsb2NhdG9yIGRlc2lnbmVkIHRvIHN0b3JlCi0JICBjb21wcmVzc2VkIFJBTSBwYWdlcy4gIHpzbWFsbG9jIHVzZXMgdmlydHVhbCBtZW1vcnkgbWFwcGluZwotCSAgaW4gb3JkZXIgdG8gcmVkdWNlIGZyYWdtZW50YXRpb24uICBIb3dldmVyLCB0aGlzIHJlc3VsdHMgaW4gYQotCSAgbm9uLXN0YW5kYXJkIGFsbG9jYXRvciBpbnRlcmZhY2Ugd2hlcmUgYSBoYW5kbGUsIG5vdCBhIHBvaW50ZXIsIGlzCi0JICByZXR1cm5lZCBieSBhbiBhbGxvYygpLiAgVGhpcyBoYW5kbGUgbXVzdCBiZSBtYXBwZWQgaW4gb3JkZXIgdG8KLQkgIGFjY2VzcyB0aGUgYWxsb2NhdGVkIHNwYWNlLgotCi1jb25maWcgUEdUQUJMRV9NQVBQSU5HCi0JYm9vbCAiVXNlIHBhZ2UgdGFibGUgbWFwcGluZyB0byBhY2Nlc3Mgb2JqZWN0IGluIHpzbWFsbG9jIgotCWRlcGVuZHMgb24gWlNNQUxMT0MKLQloZWxwCi0JICBCeSBkZWZhdWx0LCB6c21hbGxvYyB1c2VzIGEgY29weS1iYXNlZCBvYmplY3QgbWFwcGluZyBtZXRob2QgdG8KLQkgIGFjY2VzcyBhbGxvY2F0aW9ucyB0aGF0IHNwYW4gdHdvIHBhZ2VzLiBIb3dldmVyLCBpZiBhIHBhcnRpY3VsYXIKLQkgIGFyY2hpdGVjdHVyZSAoZXgsIEFSTSkgcGVyZm9ybXMgVk0gbWFwcGluZyBmYXN0ZXIgdGhhbiBjb3B5aW5nLAotCSAgdGhlbiB5b3Ugc2hvdWxkIHNlbGVjdCB0aGlzLiBUaGlzIGNhdXNlcyB6c21hbGxvYyB0byB1c2UgcGFnZSB0YWJsZQotCSAgbWFwcGluZyByYXRoZXIgdGhhbiBjb3B5aW5nIGZvciBvYmplY3QgbWFwcGluZy4KLQotCSAgWW91IGNhbiBjaGVjayBzcGVlZCB3aXRoIHpzbWFsbG9jIGJlbmNobWFya1sxXS4KLQkgIFsxXSBodHRwczovL2dpdGh1Yi5jb20vc3BhcnRhY3VzMDYvenNtYWxsb2MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNDg0OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenNtYWxsb2MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXpzbWFsbG9jLXkgCQk6PSB6c21hbGxvYy1tYWluLm8KLQotb2JqLSQoQ09ORklHX1pTTUFMTE9DKQkrPSB6c21hbGxvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9LY29uZmlnIGIvZHJpdmVycy90YXJnZXQvS2NvbmZpZwppbmRleCAxODMwMzY4Li5kYzJkODRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdGFyZ2V0L0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAJdHJpc3RhdGUgIkdlbmVyaWMgVGFyZ2V0IENvcmUgTW9kIChUQ00pIGFuZCBDb25maWdGUyBJbmZyYXN0cnVjdHVyZSIKIAlkZXBlbmRzIG9uIFNDU0kgJiYgQkxPQ0sKIAlzZWxlY3QgQ09ORklHRlNfRlMKKwlzZWxlY3QgQ1JDX1QxMERJRgogCWRlZmF1bHQgbgogCWhlbHAKIAlTYXkgWSBvciBNIGhlcmUgdG8gZW5hYmxlIHRoZSBUQ00gU3RvcmFnZSBFbmdpbmUgYW5kIENvbmZpZ0ZTIGVuYWJsZWQKQEAgLTEzLDYgKzE0LDcgQEAKIAogY29uZmlnIFRDTV9JQkxPQ0sKIAl0cmlzdGF0ZSAiVENNL0lCTE9DSyBTdWJzeXN0ZW0gUGx1Z2luIGZvciBMaW51eC9CTE9DSyIKKwlzZWxlY3QgQkxLX0RFVl9JTlRFR1JJVFkKIAloZWxwCiAJU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIFRDTS9JQkxPQ0sgc3Vic3lzdGVtIHBsdWdpbiBmb3Igbm9uLWJ1ZmZlcmVkCiAJYWNjZXNzIHRvIExpbnV4L0Jsb2NrIGRldmljZXMgdXNpbmcgQklPCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCmluZGV4IDAwODY3MTkuLjdmMWE3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCkBAIC01Miw3ICs1Miw3IEBACiBzdGF0aWMgTElTVF9IRUFEKGdfdGlxbl9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoZ19ucF9saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGlxbl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnBfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKG5wX2xvY2spOwogCiBzdGF0aWMgc3RydWN0IGlkciB0aXFuX2lkcjsKIHN0cnVjdCBpZHIgc2Vzc19pZHI7CkBAIC0zMDcsNiArMzA3LDkgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKy8qCisgKiBDYWxsZWQgd2l0aCBtdXRleCBucF9sb2NrIGhlbGQKKyAqLwogc3RhdGljIHN0cnVjdCBpc2NzaV9ucCAqaXNjc2l0X2dldF9ucCgKIAlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSAqc29ja2FkZHIsCiAJaW50IG5ldHdvcmtfdHJhbnNwb3J0KQpAQCAtMzE0LDExICszMTcsMTAgQEAKIAlzdHJ1Y3QgaXNjc2lfbnAgKm5wOwogCWJvb2wgbWF0Y2g7CiAKLQlzcGluX2xvY2tfYmgoJm5wX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobnAsICZnX25wX2xpc3QsIG5wX2xpc3QpIHsKLQkJc3Bpbl9sb2NrKCZucC0+bnBfdGhyZWFkX2xvY2spOworCQlzcGluX2xvY2tfYmgoJm5wLT5ucF90aHJlYWRfbG9jayk7CiAJCWlmIChucC0+bnBfdGhyZWFkX3N0YXRlICE9IElTQ1NJX05QX1RIUkVBRF9BQ1RJVkUpIHsKLQkJCXNwaW5fdW5sb2NrKCZucC0+bnBfdGhyZWFkX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJm5wLT5ucF90aHJlYWRfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0zMzAsMTMgKzMzMiwxMSBAQAogCQkJICogd2hpbGUgaXNjc2lfdHBnX2FkZF9uZXR3b3JrX3BvcnRhbCgpIGlzIGNhbGxlZC4KIAkJCSAqLwogCQkJbnAtPm5wX2V4cG9ydHMrKzsKLQkJCXNwaW5fdW5sb2NrKCZucC0+bnBfdGhyZWFkX2xvY2spOwotCQkJc3Bpbl91bmxvY2tfYmgoJm5wX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJm5wLT5ucF90aHJlYWRfbG9jayk7CiAJCQlyZXR1cm4gbnA7CiAJCX0KLQkJc3Bpbl91bmxvY2soJm5wLT5ucF90aHJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZucC0+bnBfdGhyZWFkX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19iaCgmbnBfbG9jayk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTM1MCwxNiArMzUwLDIyIEBACiAJc3RydWN0IHNvY2thZGRyX2luNiAqc29ja19pbjY7CiAJc3RydWN0IGlzY3NpX25wICpucDsKIAlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbnBfbG9jayk7CisKIAkvKgogCSAqIExvY2F0ZSB0aGUgZXhpc3Rpbmcgc3RydWN0IGlzY3NpX25wIGlmIGFscmVhZHkgYWN0aXZlLi4KIAkgKi8KIAlucCA9IGlzY3NpdF9nZXRfbnAoc29ja2FkZHIsIG5ldHdvcmtfdHJhbnNwb3J0KTsKLQlpZiAobnApCisJaWYgKG5wKSB7CisJCW11dGV4X3VubG9jaygmbnBfbG9jayk7CiAJCXJldHVybiBucDsKKwl9CiAKIAlucCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2NzaV9ucCksIEdGUF9LRVJORUwpOwogCWlmICghbnApIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3QgaXNjc2lfbnBcbiIpOworCQltdXRleF91bmxvY2soJm5wX2xvY2spOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKQEAgLTM4Miw2ICszODgsNyBAQAogCXJldCA9IGlzY3NpX3RhcmdldF9zZXR1cF9sb2dpbl9zb2NrZXQobnAsIHNvY2thZGRyKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJa2ZyZWUobnApOworCQltdXRleF91bmxvY2soJm5wX2xvY2spOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIApAQCAtMzkwLDYgKzM5Nyw3IEBACiAJCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBrdGhyZWFkOiBpc2NzaV9ucFxuIik7CiAJCXJldCA9IFBUUl9FUlIobnAtPm5wX3RocmVhZCk7CiAJCWtmcmVlKG5wKTsKKwkJbXV0ZXhfdW5sb2NrKCZucF9sb2NrKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAJLyoKQEAgLTQwMCwxMCArNDA4LDEwIEBACiAJICogcG9pbnQgYmVjYXVzZSBpc2NzaV9ucCBoYXMgbm90IGJlZW4gYWRkZWQgdG8gZ19ucF9saXN0IHlldC4KIAkgKi8KIAlucC0+bnBfZXhwb3J0cyA9IDE7CisJbnAtPm5wX3RocmVhZF9zdGF0ZSA9IElTQ1NJX05QX1RIUkVBRF9BQ1RJVkU7CiAKLQlzcGluX2xvY2tfYmgoJm5wX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJm5wLT5ucF9saXN0LCAmZ19ucF9saXN0KTsKLQlzcGluX3VubG9ja19iaCgmbnBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZucF9sb2NrKTsKIAogCXByX2RlYnVnKCJDT1JFWzBdIC0gQWRkZWQgTmV0d29yayBQb3J0YWw6ICVzOiVodSBvbiAlc1xuIiwKIAkJbnAtPm5wX2lwLCBucC0+bnBfcG9ydCwgbnAtPm5wX3RyYW5zcG9ydC0+bmFtZSk7CkBAIC00NzAsOSArNDc4LDkgQEAKIAogCW5wLT5ucF90cmFuc3BvcnQtPmlzY3NpdF9mcmVlX25wKG5wKTsKIAotCXNwaW5fbG9ja19iaCgmbnBfbG9jayk7CisJbXV0ZXhfbG9jaygmbnBfbG9jayk7CiAJbGlzdF9kZWwoJm5wLT5ucF9saXN0KTsKLQlzcGluX3VubG9ja19iaCgmbnBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZucF9sb2NrKTsKIAogCXByX2RlYnVnKCJDT1JFWzBdIC0gUmVtb3ZlZCBOZXR3b3JrIFBvcnRhbDogJXM6JWh1IG9uICVzXG4iLAogCQlucC0+bnBfaXAsIG5wLT5ucF9wb3J0LCBucC0+bnBfdHJhbnNwb3J0LT5uYW1lKTsKQEAgLTYyMiw3ICs2MzAsNyBAQAogewogCXN0cnVjdCBpc2NzaV9jbWQgKmNtZDsKIAotCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCWlmICghY21kKQogCQlyZXR1cm4gLTE7CiAKQEAgLTI0NzUsNyArMjQ4Myw3IEBACiAJaWYgKCFjb25uX3ApCiAJCXJldHVybjsKIAotCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubl9wLCBHRlBfQVRPTUlDKTsKKwljbWQgPSBpc2NzaXRfYWxsb2NhdGVfY21kKGNvbm5fcCwgVEFTS19SVU5OSU5HKTsKIAlpZiAoIWNtZCkgewogCQlpc2NzaXRfZGVjX2Nvbm5fdXNhZ2VfY291bnQoY29ubl9wKTsKIAkJcmV0dXJuOwpAQCAtMzk1MSw3ICszOTU5LDcgQEAKIAogCXN3aXRjaCAoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgewogCWNhc2UgSVNDU0lfT1BfU0NTSV9DTUQ6Ci0JCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKCFjbWQpCiAJCQlnb3RvIHJlamVjdDsKIApAQCAtMzk2MywyOCArMzk3MSwyOCBAQAogCWNhc2UgSVNDU0lfT1BfTk9PUF9PVVQ6CiAJCWNtZCA9IE5VTEw7CiAJCWlmIChoZHItPnR0dCA9PSBjcHVfdG9fYmUzMigweEZGRkZGRkZGKSkgewotCQkJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBHRlBfS0VSTkVMKTsKKwkJCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCWlmICghY21kKQogCQkJCWdvdG8gcmVqZWN0OwogCQl9CiAJCXJldCA9IGlzY3NpdF9oYW5kbGVfbm9wX291dChjb25uLCBjbWQsIGJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfU0NTSV9UTUZVTkM6Ci0JCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgR0ZQX0tFUk5FTCk7CisJCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKCFjbWQpCiAJCQlnb3RvIHJlamVjdDsKIAogCQlyZXQgPSBpc2NzaXRfaGFuZGxlX3Rhc2tfbWd0X2NtZChjb25uLCBjbWQsIGJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfVEVYVDoKLQkJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBHRlBfS0VSTkVMKTsKKwkJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoIWNtZCkKIAkJCWdvdG8gcmVqZWN0OwogCiAJCXJldCA9IGlzY3NpdF9oYW5kbGVfdGV4dF9jbWQoY29ubiwgY21kLCBidWYpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX09QX0xPR09VVDoKLQkJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBHRlBfS0VSTkVMKTsKKwkJY21kID0gaXNjc2l0X2FsbG9jYXRlX2NtZChjb25uLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoIWNtZCkKIAkJCWdvdG8gcmVqZWN0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYwppbmRleCA4M2M5NjVjLi41ODJiYTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKQEAgLTExOTIsNyArMTE5Miw3IEBACiAJICovCiBhbGxvY190YWdzOgogCXRhZ19udW0gPSBtYXhfdCh1MzIsIElTQ1NJVF9NSU5fVEFHUywgcXVldWVfZGVwdGgpOwotCXRhZ19udW0gKz0gKHRhZ19udW0gLyAyKSArIElTQ1NJVF9FWFRSQV9UQUdTOworCXRhZ19udW0gPSAodGFnX251bSAqIDIpICsgSVNDU0lUX0VYVFJBX1RBR1M7CiAJdGFnX3NpemUgPSBzaXplb2Yoc3RydWN0IGlzY3NpX2NtZCkgKyBjb25uLT5jb25uX3RyYW5zcG9ydC0+cHJpdl9zaXplOwogCiAJcmV0ID0gdHJhbnNwb3J0X2FsbG9jX3Nlc3Npb25fdGFncyhzZXNzLT5zZV9zZXNzLCB0YWdfbnVtLCB0YWdfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdXRpbC5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3V0aWwuYwppbmRleCAwODE5ZTY4Li5lNjU1YjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdXRpbC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF91dGlsLmMKQEAgLTE1MiwxMyArMTUyLDE2IEBACiAgKiBNYXkgYmUgY2FsbGVkIGZyb20gc29mdHdhcmUgaW50ZXJydXB0ICh0aW1lcikgY29udGV4dCBmb3IgYWxsb2NhdGluZwogICogaVNDU0kgTm9wSU5zLgogICovCi1zdHJ1Y3QgaXNjc2lfY21kICppc2NzaXRfYWxsb2NhdGVfY21kKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBnZnBfdCBnZnBfbWFzaykKK3N0cnVjdCBpc2NzaV9jbWQgKmlzY3NpdF9hbGxvY2F0ZV9jbWQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgaXNjc2lfY21kICpjbWQ7CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBjb25uLT5zZXNzLT5zZV9zZXNzOwogCWludCBzaXplLCB0YWc7CiAKLQl0YWcgPSBwZXJjcHVfaWRhX2FsbG9jKCZzZV9zZXNzLT5zZXNzX3RhZ19wb29sLCBnZnBfbWFzayk7CisJdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgc3RhdGUpOworCWlmICh0YWcgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwogCXNpemUgPSBzaXplb2Yoc3RydWN0IGlzY3NpX2NtZCkgKyBjb25uLT5jb25uX3RyYW5zcG9ydC0+cHJpdl9zaXplOwogCWNtZCA9IChzdHJ1Y3QgaXNjc2lfY21kICopKHNlX3Nlc3MtPnNlc3NfY21kX21hcCArICh0YWcgKiBzaXplKSk7CiAJbWVtc2V0KGNtZCwgMCwgc2l6ZSk7CkBAIC05MjYsNyArOTI5LDcgQEAKIAl1OCBzdGF0ZTsKIAlzdHJ1Y3QgaXNjc2lfY21kICpjbWQ7CiAKLQljbWQgPSBpc2NzaXRfYWxsb2NhdGVfY21kKGNvbm4sIEdGUF9BVE9NSUMpOworCWNtZCA9IGlzY3NpdF9hbGxvY2F0ZV9jbWQoY29ubiwgVEFTS19SVU5OSU5HKTsKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC0xOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdXRpbC5oIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3V0aWwuaAppbmRleCBlNGZjMzRhLi41NjFhNDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdXRpbC5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF91dGlsLmgKQEAgLTksNyArOSw3IEBACiBleHRlcm4gdm9pZCBpc2NzaXRfZnJlZV9yMnQoc3RydWN0IGlzY3NpX3IydCAqLCBzdHJ1Y3QgaXNjc2lfY21kICopOwogZXh0ZXJuIHZvaWQgaXNjc2l0X2ZyZWVfcjJ0c19mcm9tX2xpc3Qoc3RydWN0IGlzY3NpX2NtZCAqKTsKIGV4dGVybiBzdHJ1Y3QgaXNjc2lfY21kICppc2NzaXRfYWxsb2NfY21kKHN0cnVjdCBpc2NzaV9jb25uICosIGdmcF90KTsKLWV4dGVybiBzdHJ1Y3QgaXNjc2lfY21kICppc2NzaXRfYWxsb2NhdGVfY21kKHN0cnVjdCBpc2NzaV9jb25uICosIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgaXNjc2lfY21kICppc2NzaXRfYWxsb2NhdGVfY21kKHN0cnVjdCBpc2NzaV9jb25uICosIGludCk7CiBleHRlcm4gc3RydWN0IGlzY3NpX3NlcSAqaXNjc2l0X2dldF9zZXFfaG9sZGVyX2Zvcl9kYXRhaW4oc3RydWN0IGlzY3NpX2NtZCAqLCB1MzIpOwogZXh0ZXJuIHN0cnVjdCBpc2NzaV9zZXEgKmlzY3NpdF9nZXRfc2VxX2hvbGRlcl9mb3JfcjJ0KHN0cnVjdCBpc2NzaV9jbWQgKik7CiBleHRlcm4gc3RydWN0IGlzY3NpX3IydCAqaXNjc2l0X2dldF9ob2xkZXJfZm9yX3IydHNuKHN0cnVjdCBpc2NzaV9jbWQgKiwgdTMyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IDFiNDFlNjcuLmZhZGFkN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwpAQCAtMjE3LDcgKzIxNyw4IEBACiAJCQlzY3NpX2J1ZmZsZW4oc2MpLCB0Y21fbG9vcF9zYW1fYXR0cihzYyksCiAJCQlzYy0+c2NfZGF0YV9kaXJlY3Rpb24sIDAsCiAJCQlzY3NpX3NnbGlzdChzYyksIHNjc2lfc2dfY291bnQoc2MpLAotCQkJc2dsX2JpZGksIHNnbF9iaWRpX2NvdW50KTsKKwkJCXNnbF9iaWRpLCBzZ2xfYmlkaV9jb3VudCwKKwkJCXNjc2lfcHJvdF9zZ2xpc3Qoc2MpLCBzY3NpX3Byb3Rfc2dfY291bnQoc2MpKTsKIAlpZiAocmMgPCAwKSB7CiAJCXNldF9ob3N0X2J5dGUoc2MsIERJRF9OT19DT05ORUNUKTsKIAkJZ290byBvdXRfZG9uZTsKQEAgLTQ2Miw3ICs0NjMsNyBAQAogewogCXN0cnVjdCB0Y21fbG9vcF9oYmEgKnRsX2hiYTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaDsKLQlpbnQgZXJyb3I7CisJaW50IGVycm9yLCBob3N0X3Byb3Q7CiAKIAl0bF9oYmEgPSB0b190Y21fbG9vcF9oYmEoZGV2KTsKIApAQCAtNDg2LDYgKzQ4NywxMyBAQAogCXNoLT5tYXhfY2hhbm5lbCA9IDA7CiAJc2gtPm1heF9jbWRfbGVuID0gVExfU0NTSV9NQVhfQ01EX0xFTjsKIAorCWhvc3RfcHJvdCA9IFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OIHwgU0hPU1RfRElGX1RZUEUyX1BST1RFQ1RJT04gfAorCQkgICAgU0hPU1RfRElGX1RZUEUzX1BST1RFQ1RJT04gfCBTSE9TVF9ESVhfVFlQRTFfUFJPVEVDVElPTiB8CisJCSAgICBTSE9TVF9ESVhfVFlQRTJfUFJPVEVDVElPTiB8IFNIT1NUX0RJWF9UWVBFM19QUk9URUNUSU9OOworCisJc2NzaV9ob3N0X3NldF9wcm90KHNoLCBob3N0X3Byb3QpOworCXNjc2lfaG9zdF9zZXRfZ3VhcmQoc2gsIFNIT1NUX0RJWF9HVUFSRF9DUkMpOworCiAJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KHNoLCAmdGxfaGJhLT5kZXYpOwogCWlmIChlcnJvcikgewogCQlwcl9lcnIoIiVzOiBzY3NpX2FkZF9ob3N0IGZhaWxlZFxuIiwgX19mdW5jX18pOwpAQCAtMTIyOCw3ICsxMjM2LDcgQEAKIAogLyogU3RhcnQgaXRlbXMgZm9yIHRjbV9sb29wX25hYV9jaXQgKi8KIAotc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdGNtX2xvb3BfbWFrZV9uYWFfdHBnKAorc3RhdGljIHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnRjbV9sb29wX21ha2VfbmFhX3RwZygKIAlzdHJ1Y3Qgc2Vfd3duICp3d24sCiAJc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsCiAJY29uc3QgY2hhciAqbmFtZSkKQEAgLTEyNzMsNyArMTI4MSw3IEBACiAJcmV0dXJuICZ0bF90cGctPnRsX3NlX3RwZzsKIH0KIAotdm9pZCB0Y21fbG9vcF9kcm9wX25hYV90cGcoCitzdGF0aWMgdm9pZCB0Y21fbG9vcF9kcm9wX25hYV90cGcoCiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnKQogewogCXN0cnVjdCBzZV93d24gKnd3biA9IHNlX3RwZy0+c2VfdHBnX3d3bjsKQEAgLTEzMDUsNyArMTMxMyw3IEBACiAKIC8qIFN0YXJ0IGl0ZW1zIGZvciB0Y21fbG9vcF9jaXQgKi8KIAotc3RydWN0IHNlX3d3biAqdGNtX2xvb3BfbWFrZV9zY3NpX2hiYSgKK3N0YXRpYyBzdHJ1Y3Qgc2Vfd3duICp0Y21fbG9vcF9tYWtlX3Njc2lfaGJhKAogCXN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzICp0ZiwKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAljb25zdCBjaGFyICpuYW1lKQpAQCAtMTM3NSw3ICsxMzgzLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi12b2lkIHRjbV9sb29wX2Ryb3Bfc2NzaV9oYmEoCitzdGF0aWMgdm9pZCB0Y21fbG9vcF9kcm9wX3Njc2lfaGJhKAogCXN0cnVjdCBzZV93d24gKnd3bikKIHsKIAlzdHJ1Y3QgdGNtX2xvb3BfaGJhICp0bF9oYmEgPSBjb250YWluZXJfb2Yod3duLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jCmluZGV4IGZkY2VlMzIuLjEyZGE5YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMKQEAgLTQxLDExICs0MSwxNCBAQAogI2luY2x1ZGUgInRhcmdldF9jb3JlX2FsdWEuaCIKICNpbmNsdWRlICJ0YXJnZXRfY29yZV91YS5oIgogCi1zdGF0aWMgc2Vuc2VfcmVhc29uX3QgY29yZV9hbHVhX2NoZWNrX3RyYW5zaXRpb24oaW50IHN0YXRlLCBpbnQgKnByaW1hcnkpOworc3RhdGljIHNlbnNlX3JlYXNvbl90IGNvcmVfYWx1YV9jaGVja190cmFuc2l0aW9uKGludCBzdGF0ZSwgaW50IHZhbGlkLAorCQkJCQkJIGludCAqcHJpbWFyeSk7CiBzdGF0aWMgaW50IGNvcmVfYWx1YV9zZXRfdGdfcHRfc2Vjb25kYXJ5X3N0YXRlKAogCQlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3BfbWVtYmVyICp0Z19wdF9ncF9tZW0sCiAJCXN0cnVjdCBzZV9wb3J0ICpwb3J0LCBpbnQgZXhwbGljaXQsIGludCBvZmZsaW5lKTsKIAorc3RhdGljIGNoYXIgKmNvcmVfYWx1YV9kdW1wX3N0YXRlKGludCBzdGF0ZSk7CisKIHN0YXRpYyB1MTYgYWx1YV9sdV9ncHNfY291bnRlcjsKIHN0YXRpYyB1MzIgYWx1YV9sdV9ncHNfY291bnQ7CiAKQEAgLTU1LDYgKzU4LDg2IEBACiBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKmRlZmF1bHRfbHVfZ3A7CiAKIC8qCisgKiBSRVBPUlQgUkVGRVJSQUxTCisgKgorICogU2VlIHNiYzNyMzUgc2VjdGlvbiA1LjIzCisgKi8KK3NlbnNlX3JlYXNvbl90Cit0YXJnZXRfZW11bGF0ZV9yZXBvcnRfcmVmZXJyYWxzKHN0cnVjdCBzZV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwlzdHJ1Y3QgdDEwX2FsdWFfbGJhX21hcCAqbWFwOworCXN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwX21lbWJlciAqbWFwX21lbTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdTMyIHJkX2xlbiA9IDAsIG9mZjsKKworCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgNCkgeworCQlwcl93YXJuKCJSRVBPUlQgUkVGRVJSQUxTIGFsbG9jYXRpb24gbGVuZ3RoICV1IHRvbyIKKwkJCSIgc21hbGxcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOworCQlyZXR1cm4gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOworCX0KKworCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2RhdGFfc2coY21kKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCisJb2ZmID0gNDsKKwlzcGluX2xvY2soJmRldi0+dDEwX2FsdWEubGJhX21hcF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xpc3QpKSB7CisJCXNwaW5fdW5sb2NrKCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisJCXRyYW5zcG9ydF9rdW5tYXBfZGF0YV9zZyhjbWQpOworCisJCXJldHVybiBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbGlzdCwKKwkJCSAgICBsYmFfbWFwX2xpc3QpIHsKKwkJaW50IGRlc2NfbnVtID0gb2ZmICsgMzsKKwkJaW50IHBnX251bTsKKworCQlvZmYgKz0gNDsKKwkJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPiBvZmYpCisJCQlwdXRfdW5hbGlnbmVkX2JlNjQobWFwLT5sYmFfbWFwX2ZpcnN0X2xiYSwgJmJ1ZltvZmZdKTsKKwkJb2ZmICs9IDg7CisJCWlmIChjbWQtPmRhdGFfbGVuZ3RoID4gb2ZmKQorCQkJcHV0X3VuYWxpZ25lZF9iZTY0KG1hcC0+bGJhX21hcF9sYXN0X2xiYSwgJmJ1ZltvZmZdKTsKKwkJb2ZmICs9IDg7CisJCXJkX2xlbiArPSAyMDsKKwkJcGdfbnVtID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXBfbWVtLCAmbWFwLT5sYmFfbWFwX21lbV9saXN0LAorCQkJCSAgICBsYmFfbWFwX21lbV9saXN0KSB7CisJCQlpbnQgYWx1YV9zdGF0ZSA9IG1hcF9tZW0tPmxiYV9tYXBfbWVtX2FsdWFfc3RhdGU7CisJCQlpbnQgYWx1YV9wZ19pZCA9IG1hcF9tZW0tPmxiYV9tYXBfbWVtX2FsdWFfcGdfaWQ7CisKKwkJCWlmIChjbWQtPmRhdGFfbGVuZ3RoID4gb2ZmKQorCQkJCWJ1ZltvZmZdID0gYWx1YV9zdGF0ZSAmIDB4MGY7CisJCQlvZmYgKz0gMjsKKwkJCWlmIChjbWQtPmRhdGFfbGVuZ3RoID4gb2ZmKQorCQkJCWJ1ZltvZmZdID0gKGFsdWFfcGdfaWQgPj4gOCkgJiAweGZmOworCQkJb2ZmKys7CisJCQlpZiAoY21kLT5kYXRhX2xlbmd0aCA+IG9mZikKKwkJCQlidWZbb2ZmXSA9IChhbHVhX3BnX2lkICYgMHhmZik7CisJCQlvZmYrKzsKKwkJCXJkX2xlbiArPSA0OworCQkJcGdfbnVtKys7CisJCX0KKwkJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPiBkZXNjX251bSkKKwkJCWJ1ZltkZXNjX251bV0gPSBwZ19udW07CisJfQorCXNwaW5fdW5sb2NrKCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisKKwkvKgorCSAqIFNldCB0aGUgUkVUVVJOIERBVEEgTEVOR1RIIHNldCBpbiB0aGUgaGVhZGVyIG9mIHRoZSBEYXRhSU4gUGF5bG9hZAorCSAqLworCXB1dF91bmFsaWduZWRfYmUxNihyZF9sZW4sICZidWZbMl0pOworCisJdHJhbnNwb3J0X2t1bm1hcF9kYXRhX3NnKGNtZCk7CisKKwl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgR09PRCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBSRVBPUlRfVEFSR0VUX1BPUlRfR1JPVVBTCiAgKgogICogU2VlIHNwYzRyMTcgc2VjdGlvbiA2LjI3CkBAIC0yMTAsNyArMjkzLDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwdHI7CiAJc2Vuc2VfcmVhc29uX3QgcmMgPSBUQ01fTk9fU0VOU0U7CiAJdTMyIGxlbiA9IDQ7IC8qIFNraXAgb3ZlciBSRVNFUlZFRCBhcmVhIGluIGhlYWRlciAqLwotCWludCBhbHVhX2FjY2Vzc19zdGF0ZSwgcHJpbWFyeSA9IDA7CisJaW50IGFsdWFfYWNjZXNzX3N0YXRlLCBwcmltYXJ5ID0gMCwgdmFsaWRfc3RhdGVzOwogCXUxNiB0Z19wdF9pZCwgcnRwaTsKIAogCWlmICghbF9wb3J0KQpAQCAtMjUyLDYgKzMzNSw3IEBACiAJCXJjID0gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOwogCQlnb3RvIG91dDsKIAl9CisJdmFsaWRfc3RhdGVzID0gbF90Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9zdXBwb3J0ZWRfc3RhdGVzOwogCiAJcHRyID0gJmJ1Zls0XTsgLyogU2tpcCBvdmVyIFJFU0VSVkVEIGFyZWEgaW4gaGVhZGVyICovCiAKQEAgLTI2Myw3ICszNDcsOCBAQAogCQkgKiB0aGUgc3RhdGUgaXMgYSBwcmltYXJ5IG9yIHNlY29uZGFyeSB0YXJnZXQgcG9ydCBhc3ltbWV0cmljCiAJCSAqIGFjY2VzcyBzdGF0ZS4KIAkJICovCi0JCXJjID0gY29yZV9hbHVhX2NoZWNrX3RyYW5zaXRpb24oYWx1YV9hY2Nlc3Nfc3RhdGUsICZwcmltYXJ5KTsKKwkJcmMgPSBjb3JlX2FsdWFfY2hlY2tfdHJhbnNpdGlvbihhbHVhX2FjY2Vzc19zdGF0ZSwKKwkJCQkJCXZhbGlkX3N0YXRlcywgJnByaW1hcnkpOwogCQlpZiAocmMpIHsKIAkJCS8qCiAJCQkgKiBJZiB0aGUgU0VUIFRBUkdFVCBQT1JUIEdST1VQUyBhdHRlbXB0cyB0byBlc3RhYmxpc2gKQEAgLTM4Niw2ICs0NzEsODEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgY29yZV9hbHVhX3N0YXRlX2xiYV9kZXBlbmRlbnQoCisJc3RydWN0IHNlX2NtZCAqY21kLAorCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3AsCisJdTggKmFsdWFfYXNjcSkKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwl1NjQgc2VnbWVudF9zaXplLCBzZWdtZW50X211bHQsIHNlY3RvcnMsIGxiYTsKKworCS8qIE9ubHkgbmVlZCB0byBjaGVjayBmb3IgY2RiIGFjdHVhbGx5IGNvbnRhaW5pbmcgTEJBcyAqLworCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfREFUQV9DREIpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xvY2spOworCXNlZ21lbnRfc2l6ZSA9IGRldi0+dDEwX2FsdWEubGJhX21hcF9zZWdtZW50X3NpemU7CisJc2VnbWVudF9tdWx0ID0gZGV2LT50MTBfYWx1YS5sYmFfbWFwX3NlZ21lbnRfbXVsdGlwbGllcjsKKwlzZWN0b3JzID0gY21kLT5kYXRhX2xlbmd0aCAvIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplOworCisJbGJhID0gY21kLT50X3Rhc2tfbGJhOworCXdoaWxlIChsYmEgPCBjbWQtPnRfdGFza19sYmEgKyBzZWN0b3JzKSB7CisJCXN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwICpjdXJfbWFwID0gTlVMTCwgKm1hcDsKKwkJc3RydWN0IHQxMF9hbHVhX2xiYV9tYXBfbWVtYmVyICptYXBfbWVtOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xpc3QsCisJCQkJICAgIGxiYV9tYXBfbGlzdCkgeworCQkJdTY0IHN0YXJ0X2xiYSwgbGFzdF9sYmE7CisJCQl1NjQgZmlyc3RfbGJhID0gbWFwLT5sYmFfbWFwX2ZpcnN0X2xiYTsKKworCQkJaWYgKHNlZ21lbnRfbXVsdCkgeworCQkJCXU2NCB0bXAgPSBsYmE7CisJCQkJc3RhcnRfbGJhID0gc2VjdG9yX2Rpdih0bXAsIHNlZ21lbnRfc2l6ZSAqIHNlZ21lbnRfbXVsdCk7CisKKwkJCQlsYXN0X2xiYSA9IGZpcnN0X2xiYSArIHNlZ21lbnRfc2l6ZSAtIDE7CisJCQkJaWYgKHN0YXJ0X2xiYSA+PSBmaXJzdF9sYmEgJiYKKwkJCQkgICAgc3RhcnRfbGJhIDw9IGxhc3RfbGJhKSB7CisJCQkJCWxiYSArPSBzZWdtZW50X3NpemU7CisJCQkJCWN1cl9tYXAgPSBtYXA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbGFzdF9sYmEgPSBtYXAtPmxiYV9tYXBfbGFzdF9sYmE7CisJCQkJaWYgKGxiYSA+PSBmaXJzdF9sYmEgJiYgbGJhIDw9IGxhc3RfbGJhKSB7CisJCQkJCWxiYSA9IGxhc3RfbGJhICsgMTsKKwkJCQkJY3VyX21hcCA9IG1hcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghY3VyX21hcCkgeworCQkJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEubGJhX21hcF9sb2NrKTsKKwkJCSphbHVhX2FzY3EgPSBBU0NRXzA0SF9BTFVBX1RHX1BUX1VOQVZBSUxBQkxFOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXBfbWVtLCAmY3VyX21hcC0+bGJhX21hcF9tZW1fbGlzdCwKKwkJCQkgICAgbGJhX21hcF9tZW1fbGlzdCkgeworCQkJaWYgKG1hcF9tZW0tPmxiYV9tYXBfbWVtX2FsdWFfcGdfaWQgIT0KKwkJCSAgICB0Z19wdF9ncC0+dGdfcHRfZ3BfaWQpCisJCQkJY29udGludWU7CisJCQlzd2l0Y2gobWFwX21lbS0+bGJhX21hcF9tZW1fYWx1YV9zdGF0ZSkgeworCQkJY2FzZSBBTFVBX0FDQ0VTU19TVEFURV9TVEFOREJZOgorCQkJCXNwaW5fdW5sb2NrKCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisJCQkJKmFsdWFfYXNjcSA9IEFTQ1FfMDRIX0FMVUFfVEdfUFRfU1RBTkRCWTsKKwkJCQlyZXR1cm4gMTsKKwkJCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfVU5BVkFJTEFCTEU6CisJCQkJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEubGJhX21hcF9sb2NrKTsKKwkJCQkqYWx1YV9hc2NxID0gQVNDUV8wNEhfQUxVQV9UR19QVF9VTkFWQUlMQUJMRTsKKwkJCQlyZXR1cm4gMTsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEubGJhX21hcF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgY29yZV9hbHVhX3N0YXRlX3N0YW5kYnkoCiAJc3RydWN0IHNlX2NtZCAqY21kLAogCXVuc2lnbmVkIGNoYXIgKmNkYiwKQEAgLTU4Myw2ICs3NDMsOSBAQAogCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfVFJBTlNJVElPTjoKIAkJcmV0ID0gY29yZV9hbHVhX3N0YXRlX3RyYW5zaXRpb24oY21kLCBjZGIsICZhbHVhX2FzY3EpOwogCQlicmVhazsKKwljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX0xCQV9ERVBFTkRFTlQ6CisJCXJldCA9IGNvcmVfYWx1YV9zdGF0ZV9sYmFfZGVwZW5kZW50KGNtZCwgdGdfcHRfZ3AsICZhbHVhX2FzY3EpOworCQlicmVhazsKIAkvKgogCSAqIE9GRkxJTkUgaXMgYSBzZWNvbmRhcnkgQUxVQSB0YXJnZXQgcG9ydCBncm91cCBhY2Nlc3Mgc3RhdGUsIHRoYXQgaXMKIAkgKiBoYW5kbGVkIGFib3ZlIHdpdGggc3RydWN0IHNlX3BvcnQtPnNlcF90Z19wdF9zZWNvbmRhcnlfb2ZmbGluZT0xCkBAIC02MTgsMTcgKzc4MSwzNiBAQAogICogQ2hlY2sgaW1wbGljaXQgYW5kIGV4cGxpY2l0IEFMVUEgc3RhdGUgY2hhbmdlIHJlcXVlc3QuCiAgKi8KIHN0YXRpYyBzZW5zZV9yZWFzb25fdAotY29yZV9hbHVhX2NoZWNrX3RyYW5zaXRpb24oaW50IHN0YXRlLCBpbnQgKnByaW1hcnkpCitjb3JlX2FsdWFfY2hlY2tfdHJhbnNpdGlvbihpbnQgc3RhdGUsIGludCB2YWxpZCwgaW50ICpwcmltYXJ5KQogeworCS8qCisJICogT1BUSU1JWkVELCBOT04tT1BUSU1JWkVELCBTVEFOREJZIGFuZCBVTkFWQUlMQUJMRSBhcmUKKwkgKiBkZWZpbmVkIGFzIHByaW1hcnkgdGFyZ2V0IHBvcnQgYXN5bW1ldHJpYyBhY2Nlc3Mgc3RhdGVzLgorCSAqLwogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX0FDVElWRV9PUFRJTUlaRUQ6CisJCWlmICghKHZhbGlkICYgQUxVQV9BT19TVVApKQorCQkJZ290byBub3Rfc3VwcG9ydGVkOworCQkqcHJpbWFyeSA9IDE7CisJCWJyZWFrOwogCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfQUNUSVZFX05PTl9PUFRJTUlaRUQ6CisJCWlmICghKHZhbGlkICYgQUxVQV9BTl9TVVApKQorCQkJZ290byBub3Rfc3VwcG9ydGVkOworCQkqcHJpbWFyeSA9IDE7CisJCWJyZWFrOwogCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfU1RBTkRCWToKKwkJaWYgKCEodmFsaWQgJiBBTFVBX1NfU1VQKSkKKwkJCWdvdG8gbm90X3N1cHBvcnRlZDsKKwkJKnByaW1hcnkgPSAxOworCQlicmVhazsKIAljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX1VOQVZBSUxBQkxFOgotCQkvKgotCQkgKiBPUFRJTUlaRUQsIE5PTi1PUFRJTUlaRUQsIFNUQU5EQlkgYW5kIFVOQVZBSUxBQkxFIGFyZQotCQkgKiBkZWZpbmVkIGFzIHByaW1hcnkgdGFyZ2V0IHBvcnQgYXN5bW1ldHJpYyBhY2Nlc3Mgc3RhdGVzLgotCQkgKi8KKwkJaWYgKCEodmFsaWQgJiBBTFVBX1VfU1VQKSkKKwkJCWdvdG8gbm90X3N1cHBvcnRlZDsKKwkJKnByaW1hcnkgPSAxOworCQlicmVhazsKKwljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX0xCQV9ERVBFTkRFTlQ6CisJCWlmICghKHZhbGlkICYgQUxVQV9MQkRfU1VQKSkKKwkJCWdvdG8gbm90X3N1cHBvcnRlZDsKIAkJKnByaW1hcnkgPSAxOwogCQlicmVhazsKIAljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX09GRkxJTkU6CkBAIC02MzYsMTQgKzgxOCwyNyBAQAogCQkgKiBPRkZMSU5FIHN0YXRlIGlzIGRlZmluZWQgYXMgYSBzZWNvbmRhcnkgdGFyZ2V0IHBvcnQKIAkJICogYXN5bW1ldHJpYyBhY2Nlc3Mgc3RhdGUuCiAJCSAqLworCQlpZiAoISh2YWxpZCAmIEFMVUFfT19TVVApKQorCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQkqcHJpbWFyeSA9IDA7CiAJCWJyZWFrOworCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfVFJBTlNJVElPTjoKKwkJLyoKKwkJICogVHJhbnNpdGlvbmluZyBpcyBzZXQgaW50ZXJuYWxseSwgYW5kCisJCSAqIGNhbm5vdCBiZSBzZWxlY3RlZCBtYW51YWxseS4KKwkJICovCisJCWdvdG8gbm90X3N1cHBvcnRlZDsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIlVua25vd24gQUxVQSBhY2Nlc3Mgc3RhdGU6IDB4JTAyeFxuIiwgc3RhdGUpOwogCQlyZXR1cm4gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CiAJfQogCiAJcmV0dXJuIDA7CisKK25vdF9zdXBwb3J0ZWQ6CisJcHJfZXJyKCJBTFVBIGFjY2VzcyBzdGF0ZSAlcyBub3Qgc3VwcG9ydGVkIiwKKwkgICAgICAgY29yZV9hbHVhX2R1bXBfc3RhdGUoc3RhdGUpKTsKKwlyZXR1cm4gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CiB9CiAKIHN0YXRpYyBjaGFyICpjb3JlX2FsdWFfZHVtcF9zdGF0ZShpbnQgc3RhdGUpCkBAIC02NTMsMTIgKzg0OCwxNiBAQAogCQlyZXR1cm4gIkFjdGl2ZS9PcHRpbWl6ZWQiOwogCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfQUNUSVZFX05PTl9PUFRJTUlaRUQ6CiAJCXJldHVybiAiQWN0aXZlL05vbk9wdGltaXplZCI7CisJY2FzZSBBTFVBX0FDQ0VTU19TVEFURV9MQkFfREVQRU5ERU5UOgorCQlyZXR1cm4gIkxCQSBEZXBlbmRlbnQiOwogCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfU1RBTkRCWToKIAkJcmV0dXJuICJTdGFuZGJ5IjsKIAljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX1VOQVZBSUxBQkxFOgogCQlyZXR1cm4gIlVuYXZhaWxhYmxlIjsKIAljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX09GRkxJTkU6CiAJCXJldHVybiAiT2ZmbGluZSI7CisJY2FzZSBBTFVBX0FDQ0VTU19TVEFURV9UUkFOU0lUSU9OOgorCQlyZXR1cm4gIlRyYW5zaXRpb25pbmciOwogCWRlZmF1bHQ6CiAJCXJldHVybiAiVW5rbm93biI7CiAJfQpAQCAtNzM1LDU4ICs5MzQsNDkgQEAKICAqIENhbGxlZCB3aXRoIHRnX3B0X2dwLT50Z19wdF9ncF9tZF9tdXRleCBoZWxkCiAgKi8KIHN0YXRpYyBpbnQgY29yZV9hbHVhX3VwZGF0ZV90cGdfcHJpbWFyeV9tZXRhZGF0YSgKLQlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwLAotCWludCBwcmltYXJ5X3N0YXRlLAotCXVuc2lnbmVkIGNoYXIgKm1kX2J1ZikKKwlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwKQogeworCXVuc2lnbmVkIGNoYXIgKm1kX2J1ZjsKIAlzdHJ1Y3QgdDEwX3d3biAqd3duID0gJnRnX3B0X2dwLT50Z19wdF9ncF9kZXYtPnQxMF93d247CiAJY2hhciBwYXRoW0FMVUFfTUVUQURBVEFfUEFUSF9MRU5dOwotCWludCBsZW47CisJaW50IGxlbiwgcmM7CisKKwltZF9idWYgPSBremFsbG9jKEFMVUFfTURfQlVGX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZF9idWYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgYnVmIGZvciBBTFVBIG1ldGFkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJbWVtc2V0KHBhdGgsIDAsIEFMVUFfTUVUQURBVEFfUEFUSF9MRU4pOwogCi0JbGVuID0gc25wcmludGYobWRfYnVmLCB0Z19wdF9ncC0+dGdfcHRfZ3BfbWRfYnVmX2xlbiwKKwlsZW4gPSBzbnByaW50ZihtZF9idWYsIEFMVUFfTURfQlVGX0xFTiwKIAkJCSJ0Z19wdF9ncF9pZD0laHVcbiIKIAkJCSJhbHVhX2FjY2Vzc19zdGF0ZT0weCUwMnhcbiIKIAkJCSJhbHVhX2FjY2Vzc19zdGF0dXM9MHglMDJ4XG4iLAotCQkJdGdfcHRfZ3AtPnRnX3B0X2dwX2lkLCBwcmltYXJ5X3N0YXRlLAorCQkJdGdfcHRfZ3AtPnRnX3B0X2dwX2lkLAorCQkJdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfcGVuZGluZ19zdGF0ZSwKIAkJCXRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0dXMpOwogCiAJc25wcmludGYocGF0aCwgQUxVQV9NRVRBREFUQV9QQVRIX0xFTiwKIAkJIi92YXIvdGFyZ2V0L2FsdWEvdHBnc18lcy8lcyIsICZ3d24tPnVuaXRfc2VyaWFsWzBdLAogCQljb25maWdfaXRlbV9uYW1lKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbSkpOwogCi0JcmV0dXJuIGNvcmVfYWx1YV93cml0ZV90cGdfbWV0YWRhdGEocGF0aCwgbWRfYnVmLCBsZW4pOworCXJjID0gY29yZV9hbHVhX3dyaXRlX3RwZ19tZXRhZGF0YShwYXRoLCBtZF9idWYsIGxlbik7CisJa2ZyZWUobWRfYnVmKTsKKwlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQoCi0Jc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICp0Z19wdF9ncCwKLQlzdHJ1Y3Qgc2VfcG9ydCAqbF9wb3J0LAotCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbCwKLQl1bnNpZ25lZCBjaGFyICptZF9idWYsCi0JaW50IG5ld19zdGF0ZSwKLQlpbnQgZXhwbGljaXQpCitzdGF0aWMgdm9pZCBjb3JlX2FsdWFfZG9fdHJhbnNpdGlvbl90Z19wdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCwgdGdfcHRfZ3BfdHJhbnNpdGlvbl93b3JrLndvcmspOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHRnX3B0X2dwLT50Z19wdF9ncF9kZXY7CiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqc2VfZGV2ZTsKIAlzdHJ1Y3Qgc2VfbHVuX2FjbCAqbGFjbDsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3BfbWVtYmVyICptZW07Ci0JaW50IG9sZF9zdGF0ZSA9IDA7Ci0JLyoKLQkgKiBTYXZlIHRoZSBvbGQgcHJpbWFyeSBBTFVBIGFjY2VzcyBzdGF0ZSwgYW5kIHNldCB0aGUgY3VycmVudCBzdGF0ZQotCSAqIHRvIEFMVUFfQUNDRVNTX1NUQVRFX1RSQU5TSVRJT04uCi0JICovCi0Jb2xkX3N0YXRlID0gYXRvbWljX3JlYWQoJnRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0ZSk7Ci0JYXRvbWljX3NldCgmdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXRlLAotCQkJQUxVQV9BQ0NFU1NfU1RBVEVfVFJBTlNJVElPTik7Ci0JdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXR1cyA9IChleHBsaWNpdCkgPwotCQkJCUFMVUFfU1RBVFVTX0FMVEVSRURfQllfRVhQTElDSVRfU1RQRyA6Ci0JCQkJQUxVQV9TVEFUVVNfQUxURVJFRF9CWV9JTVBMSUNJVF9BTFVBOwotCS8qCi0JICogQ2hlY2sgZm9yIHRoZSBvcHRpb25hbCBBTFVBIHByaW1hcnkgc3RhdGUgdHJhbnNpdGlvbiBkZWxheQotCSAqLwotCWlmICh0Z19wdF9ncC0+dGdfcHRfZ3BfdHJhbnNfZGVsYXlfbXNlY3MgIT0gMCkKLQkJbXNsZWVwX2ludGVycnVwdGlibGUodGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zX2RlbGF5X21zZWNzKTsKKwlib29sIGV4cGxpY2l0ID0gKHRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0dXMgPT0KKwkJCSBBTFVBX1NUQVRVU19BTFRFUkVEX0JZX0VYUExJQ0lUX1NUUEcpOwogCiAJc3Bpbl9sb2NrKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW0sICZ0Z19wdF9ncC0+dGdfcHRfZ3BfbWVtX2xpc3QsCkBAIC04MjEsOSArMTAxMSwxMiBAQAogCQkJaWYgKCFsYWNsKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoZXhwbGljaXQgJiYKLQkJCSAgIChuYWNsICE9IE5VTEwpICYmIChuYWNsID09IGxhY2wtPnNlX2x1bl9uYWNsKSAmJgotCQkJICAgKGxfcG9ydCAhPSBOVUxMKSAmJiAobF9wb3J0ID09IHBvcnQpKQorCQkJaWYgKCh0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9hY2Nlc3Nfc3RhdHVzID09CisJCQkgICAgIEFMVUFfU1RBVFVTX0FMVEVSRURfQllfRVhQTElDSVRfU1RQRykgJiYKKwkJCSAgICh0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9uYWNsICE9IE5VTEwpICYmCisJCQkgICAgKHRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX25hY2wgPT0gbGFjbC0+c2VfbHVuX25hY2wpICYmCisJCQkgICAodGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfcG9ydCAhPSBOVUxMKSAmJgorCQkJICAgICh0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9wb3J0ID09IHBvcnQpKQogCQkJCWNvbnRpbnVlOwogCiAJCQljb3JlX3Njc2kzX3VhX2FsbG9jYXRlKGxhY2wtPnNlX2x1bl9uYWNsLApAQCAtODUxLDIwICsxMDQ0LDEwMiBAQAogCSAqLwogCWlmICh0Z19wdF9ncC0+dGdfcHRfZ3Bfd3JpdGVfbWV0YWRhdGEpIHsKIAkJbXV0ZXhfbG9jaygmdGdfcHRfZ3AtPnRnX3B0X2dwX21kX211dGV4KTsKLQkJY29yZV9hbHVhX3VwZGF0ZV90cGdfcHJpbWFyeV9tZXRhZGF0YSh0Z19wdF9ncCwKLQkJCQkJbmV3X3N0YXRlLCBtZF9idWYpOworCQljb3JlX2FsdWFfdXBkYXRlX3RwZ19wcmltYXJ5X21ldGFkYXRhKHRnX3B0X2dwKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfbWRfbXV0ZXgpOwogCX0KIAkvKgogCSAqIFNldCB0aGUgY3VycmVudCBwcmltYXJ5IEFMVUEgYWNjZXNzIHN0YXRlIHRvIHRoZSByZXF1ZXN0ZWQgbmV3IHN0YXRlCiAJICovCi0JYXRvbWljX3NldCgmdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXRlLCBuZXdfc3RhdGUpOworCWF0b21pY19zZXQoJnRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0ZSwKKwkJICAgdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfcGVuZGluZ19zdGF0ZSk7CiAKIAlwcl9kZWJ1ZygiU3VjY2Vzc2Z1bCAlcyBBTFVBIHRyYW5zaXRpb24gVEcgUFQgR3JvdXA6ICVzIElEOiAlaHUiCiAJCSIgZnJvbSBwcmltYXJ5IGFjY2VzcyBzdGF0ZSAlcyB0byAlc1xuIiwgKGV4cGxpY2l0KSA/ICJleHBsaWNpdCIgOgogCQkiaW1wbGljaXQiLCBjb25maWdfaXRlbV9uYW1lKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbSksCi0JCXRnX3B0X2dwLT50Z19wdF9ncF9pZCwgY29yZV9hbHVhX2R1bXBfc3RhdGUob2xkX3N0YXRlKSwKLQkJY29yZV9hbHVhX2R1bXBfc3RhdGUobmV3X3N0YXRlKSk7CisJCXRnX3B0X2dwLT50Z19wdF9ncF9pZCwKKwkJY29yZV9hbHVhX2R1bXBfc3RhdGUodGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfcHJldmlvdXNfc3RhdGUpLAorCQljb3JlX2FsdWFfZHVtcF9zdGF0ZSh0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9wZW5kaW5nX3N0YXRlKSk7CisJc3Bpbl9sb2NrKCZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKKwlhdG9taWNfZGVjKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCk7CisJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7CisJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCisJaWYgKHRnX3B0X2dwLT50Z19wdF9ncF90cmFuc2l0aW9uX2NvbXBsZXRlKQorCQljb21wbGV0ZSh0Z19wdF9ncC0+dGdfcHRfZ3BfdHJhbnNpdGlvbl9jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyBpbnQgY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQoCisJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICp0Z19wdF9ncCwKKwlpbnQgbmV3X3N0YXRlLAorCWludCBleHBsaWNpdCkKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSB0Z19wdF9ncC0+dGdfcHRfZ3BfZGV2OworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOworCisJLyogTm90aGluZyB0byBiZSBkb25lIGhlcmUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0ZSkgPT0gbmV3X3N0YXRlKQorCQlyZXR1cm4gMDsKKworCWlmIChuZXdfc3RhdGUgPT0gQUxVQV9BQ0NFU1NfU1RBVEVfVFJBTlNJVElPTikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIEZsdXNoIGFueSBwZW5kaW5nIHRyYW5zaXRpb25zCisJICovCisJaWYgKCFleHBsaWNpdCAmJiB0Z19wdF9ncC0+dGdfcHRfZ3BfaW1wbGljaXRfdHJhbnNfc2VjcyAmJgorCSAgICBhdG9taWNfcmVhZCgmdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXRlKSA9PQorCSAgICBBTFVBX0FDQ0VTU19TVEFURV9UUkFOU0lUSU9OKSB7CisJCS8qIEp1c3QgaW4gY2FzZSAqLworCQl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9wZW5kaW5nX3N0YXRlID0gbmV3X3N0YXRlOworCQl0Z19wdF9ncC0+dGdfcHRfZ3BfdHJhbnNpdGlvbl9jb21wbGV0ZSA9ICZ3YWl0OworCQlmbHVzaF9kZWxheWVkX3dvcmsoJnRnX3B0X2dwLT50Z19wdF9ncF90cmFuc2l0aW9uX3dvcmspOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKKwkJdGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zaXRpb25fY29tcGxldGUgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNhdmUgdGhlIG9sZCBwcmltYXJ5IEFMVUEgYWNjZXNzIHN0YXRlLCBhbmQgc2V0IHRoZSBjdXJyZW50IHN0YXRlCisJICogdG8gQUxVQV9BQ0NFU1NfU1RBVEVfVFJBTlNJVElPTi4KKwkgKi8KKwl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9wcmV2aW91c19zdGF0ZSA9CisJCWF0b21pY19yZWFkKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9hY2Nlc3Nfc3RhdGUpOworCXRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX3BlbmRpbmdfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwlhdG9taWNfc2V0KCZ0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9hY2Nlc3Nfc3RhdGUsCisJCQlBTFVBX0FDQ0VTU19TVEFURV9UUkFOU0lUSU9OKTsKKwl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9hY2Nlc3Nfc3RhdHVzID0gKGV4cGxpY2l0KSA/CisJCQkJQUxVQV9TVEFUVVNfQUxURVJFRF9CWV9FWFBMSUNJVF9TVFBHIDoKKwkJCQlBTFVBX1NUQVRVU19BTFRFUkVEX0JZX0lNUExJQ0lUX0FMVUE7CisKKwkvKgorCSAqIENoZWNrIGZvciB0aGUgb3B0aW9uYWwgQUxVQSBwcmltYXJ5IHN0YXRlIHRyYW5zaXRpb24gZGVsYXkKKwkgKi8KKwlpZiAodGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zX2RlbGF5X21zZWNzICE9IDApCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHRnX3B0X2dwLT50Z19wdF9ncF90cmFuc19kZWxheV9tc2Vjcyk7CisKKwkvKgorCSAqIFRha2UgYSByZWZlcmVuY2UgZm9yIHdvcmtxdWV1ZSBpdGVtCisJICovCisJc3Bpbl9sb2NrKCZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKKwlhdG9taWNfaW5jKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCk7CisJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CisJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCisJaWYgKCFleHBsaWNpdCAmJiB0Z19wdF9ncC0+dGdfcHRfZ3BfaW1wbGljaXRfdHJhbnNfc2VjcykgeworCQl1bnNpZ25lZCBsb25nIHRyYW5zaXRpb25fdG1vOworCisJCXRyYW5zaXRpb25fdG1vID0gdGdfcHRfZ3AtPnRnX3B0X2dwX2ltcGxpY2l0X3RyYW5zX3NlY3MgKiBIWjsKKwkJcXVldWVfZGVsYXllZF93b3JrKHRnX3B0X2dwLT50Z19wdF9ncF9kZXYtPnRtcl93cSwKKwkJCQkgICAmdGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zaXRpb25fd29yaywKKwkJCQkgICB0cmFuc2l0aW9uX3Rtbyk7CisJfSBlbHNlIHsKKwkJdGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zaXRpb25fY29tcGxldGUgPSAmd2FpdDsKKwkJcXVldWVfZGVsYXllZF93b3JrKHRnX3B0X2dwLT50Z19wdF9ncF9kZXYtPnRtcl93cSwKKwkJCQkgICAmdGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zaXRpb25fd29yaywgMCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCQl0Z19wdF9ncC0+dGdfcHRfZ3BfdHJhbnNpdGlvbl9jb21wbGV0ZSA9IE5VTEw7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04NzgsMjMgKzExNTMsMTUgQEAKIAlpbnQgZXhwbGljaXQpCiB7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2OwotCXN0cnVjdCBzZV9wb3J0ICpwb3J0OwotCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbDsKIAlzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKmx1X2dwOwogCXN0cnVjdCB0MTBfYWx1YV9sdV9ncF9tZW1iZXIgKmx1X2dwX21lbSwgKmxvY2FsX2x1X2dwX21lbTsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwotCXVuc2lnbmVkIGNoYXIgKm1kX2J1ZjsKLQlpbnQgcHJpbWFyeTsKKwlpbnQgcHJpbWFyeSwgdmFsaWRfc3RhdGVzLCByYyA9IDA7CiAKLQlpZiAoY29yZV9hbHVhX2NoZWNrX3RyYW5zaXRpb24obmV3X3N0YXRlLCAmcHJpbWFyeSkgIT0gMCkKKwl2YWxpZF9zdGF0ZXMgPSBsX3RnX3B0X2dwLT50Z19wdF9ncF9hbHVhX3N1cHBvcnRlZF9zdGF0ZXM7CisJaWYgKGNvcmVfYWx1YV9jaGVja190cmFuc2l0aW9uKG5ld19zdGF0ZSwgdmFsaWRfc3RhdGVzLCAmcHJpbWFyeSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZF9idWYgPSBremFsbG9jKGxfdGdfcHRfZ3AtPnRnX3B0X2dwX21kX2J1Zl9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghbWRfYnVmKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZiBmb3IgQUxVQSBtZXRhZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCWxvY2FsX2x1X2dwX21lbSA9IGxfZGV2LT5kZXZfYWx1YV9sdV9ncF9tZW07CiAJc3Bpbl9sb2NrKCZsb2NhbF9sdV9ncF9tZW0tPmx1X2dwX21lbV9sb2NrKTsKIAlsdV9ncCA9IGxvY2FsX2x1X2dwX21lbS0+bHVfZ3A7CkBAIC05MTEsMTIgKzExNzgsMTMgQEAKIAkJICogY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQoKSB3aWxsIGFsd2F5cyByZXR1cm4KIAkJICogc3VjY2Vzcy4KIAkJICovCi0JCWNvcmVfYWx1YV9kb190cmFuc2l0aW9uX3RnX3B0KGxfdGdfcHRfZ3AsIGxfcG9ydCwgbF9uYWNsLAotCQkJCQltZF9idWYsIG5ld19zdGF0ZSwgZXhwbGljaXQpOworCQlsX3RnX3B0X2dwLT50Z19wdF9ncF9hbHVhX3BvcnQgPSBsX3BvcnQ7CisJCWxfdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfbmFjbCA9IGxfbmFjbDsKKwkJcmMgPSBjb3JlX2FsdWFfZG9fdHJhbnNpdGlvbl90Z19wdChsX3RnX3B0X2dwLAorCQkJCQkJICAgbmV3X3N0YXRlLCBleHBsaWNpdCk7CiAJCWF0b21pY19kZWMoJmx1X2dwLT5sdV9ncF9yZWZfY250KTsKIAkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7Ci0JCWtmcmVlKG1kX2J1Zik7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gcmM7CiAJfQogCS8qCiAJICogRm9yIGFsbCBvdGhlciBMVSBncm91cHMgYXNpZGUgZnJvbSAnZGVmYXVsdF9sdV9ncCcsIHdhbGsgYWxsIG9mCkBAIC05NTEsMTEgKzEyMTksMTEgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGxfdGdfcHRfZ3AgPT0gdGdfcHRfZ3ApIHsKLQkJCQlwb3J0ID0gbF9wb3J0OwotCQkJCW5hY2wgPSBsX25hY2w7CisJCQkJdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfcG9ydCA9IGxfcG9ydDsKKwkJCQl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9uYWNsID0gbF9uYWNsOwogCQkJfSBlbHNlIHsKLQkJCQlwb3J0ID0gTlVMTDsKLQkJCQluYWNsID0gTlVMTDsKKwkJCQl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9wb3J0ID0gTlVMTDsKKwkJCQl0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9uYWNsID0gTlVMTDsKIAkJCX0KIAkJCWF0b21pY19pbmMoJnRnX3B0X2dwLT50Z19wdF9ncF9yZWZfY250KTsKIAkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwpAQCAtOTY0LDEyICsxMjMyLDE0IEBACiAJCQkgKiBjb3JlX2FsdWFfZG9fdHJhbnNpdGlvbl90Z19wdCgpIHdpbGwgYWx3YXlzIHJldHVybgogCQkJICogc3VjY2Vzcy4KIAkJCSAqLwotCQkJY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQodGdfcHRfZ3AsIHBvcnQsCi0JCQkJCW5hY2wsIG1kX2J1ZiwgbmV3X3N0YXRlLCBleHBsaWNpdCk7CisJCQlyYyA9IGNvcmVfYWx1YV9kb190cmFuc2l0aW9uX3RnX3B0KHRnX3B0X2dwLAorCQkJCQluZXdfc3RhdGUsIGV4cGxpY2l0KTsKIAogCQkJc3Bpbl9sb2NrKCZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAkJCWF0b21pY19kZWMoJnRnX3B0X2dwLT50Z19wdF9ncF9yZWZfY250KTsKIAkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOworCQkJaWYgKHJjKQorCQkJCWJyZWFrOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIApAQCAtOTc5LDE2ICsxMjQ5LDE4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZsdV9ncC0+bHVfZ3BfbG9jayk7CiAKLQlwcl9kZWJ1ZygiU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBMVSBHcm91cDogJXMgYWxsIEFMVUEgVEcgUFQiCi0JCSIgR3JvdXAgSURzOiAlaHUgJXMgdHJhbnNpdGlvbiB0byBwcmltYXJ5IHN0YXRlOiAlc1xuIiwKLQkJY29uZmlnX2l0ZW1fbmFtZSgmbHVfZ3AtPmx1X2dwX2dyb3VwLmNnX2l0ZW0pLAotCQlsX3RnX3B0X2dwLT50Z19wdF9ncF9pZCwgKGV4cGxpY2l0KSA/ICJleHBsaWNpdCIgOiAiaW1wbGljaXQiLAotCQljb3JlX2FsdWFfZHVtcF9zdGF0ZShuZXdfc3RhdGUpKTsKKwlpZiAoIXJjKSB7CisJCXByX2RlYnVnKCJTdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIExVIEdyb3VwOiAlcyBhbGwgQUxVQSBURyBQVCIKKwkJCSAiIEdyb3VwIElEczogJWh1ICVzIHRyYW5zaXRpb24gdG8gcHJpbWFyeSBzdGF0ZTogJXNcbiIsCisJCQkgY29uZmlnX2l0ZW1fbmFtZSgmbHVfZ3AtPmx1X2dwX2dyb3VwLmNnX2l0ZW0pLAorCQkJIGxfdGdfcHRfZ3AtPnRnX3B0X2dwX2lkLAorCQkJIChleHBsaWNpdCkgPyAiZXhwbGljaXQiIDogImltcGxpY2l0IiwKKwkJCSBjb3JlX2FsdWFfZHVtcF9zdGF0ZShuZXdfc3RhdGUpKTsKKwl9CiAKIAlhdG9taWNfZGVjKCZsdV9ncC0+bHVfZ3BfcmVmX2NudCk7CiAJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7Ci0Ja2ZyZWUobWRfYnVmKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC05OTYsMTMgKzEyNjgsMTggQEAKICAqLwogc3RhdGljIGludCBjb3JlX2FsdWFfdXBkYXRlX3RwZ19zZWNvbmRhcnlfbWV0YWRhdGEoCiAJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwX21lbWJlciAqdGdfcHRfZ3BfbWVtLAotCXN0cnVjdCBzZV9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGNoYXIgKm1kX2J1ZiwKLQl1MzIgbWRfYnVmX2xlbikKKwlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCkKIHsKKwl1bnNpZ25lZCBjaGFyICptZF9idWY7CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnID0gcG9ydC0+c2VwX3RwZzsKIAljaGFyIHBhdGhbQUxVQV9NRVRBREFUQV9QQVRIX0xFTl0sIHd3bltBTFVBX1NFQ09OREFSWV9NRVRBREFUQV9XV05fTEVOXTsKLQlpbnQgbGVuOworCWludCBsZW4sIHJjOworCisJbWRfYnVmID0ga3phbGxvYyhBTFVBX01EX0JVRl9MRU4sIEdGUF9LRVJORUwpOworCWlmICghbWRfYnVmKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZiBmb3IgQUxVQSBtZXRhZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCW1lbXNldChwYXRoLCAwLCBBTFVBX01FVEFEQVRBX1BBVEhfTEVOKTsKIAltZW1zZXQod3duLCAwLCBBTFVBX1NFQ09OREFSWV9NRVRBREFUQV9XV05fTEVOKTsKQEAgLTEwMTQsNyArMTI5MSw3IEBACiAJCXNucHJpbnRmKHd3bitsZW4sIEFMVUFfU0VDT05EQVJZX01FVEFEQVRBX1dXTl9MRU4tbGVuLCAiKyVodSIsCiAJCQkJc2VfdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyhzZV90cGcpKTsKIAotCWxlbiA9IHNucHJpbnRmKG1kX2J1ZiwgbWRfYnVmX2xlbiwgImFsdWFfdGdfcHRfb2ZmbGluZT0lZFxuIgorCWxlbiA9IHNucHJpbnRmKG1kX2J1ZiwgQUxVQV9NRF9CVUZfTEVOLCAiYWx1YV90Z19wdF9vZmZsaW5lPSVkXG4iCiAJCQkiYWx1YV90Z19wdF9zdGF0dXM9MHglMDJ4XG4iLAogCQkJYXRvbWljX3JlYWQoJnBvcnQtPnNlcF90Z19wdF9zZWNvbmRhcnlfb2ZmbGluZSksCiAJCQlwb3J0LT5zZXBfdGdfcHRfc2Vjb25kYXJ5X3N0YXQpOwpAQCAtMTAyMyw3ICsxMzAwLDEwIEBACiAJCQlzZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCB3d24sCiAJCQlwb3J0LT5zZXBfbHVuLT51bnBhY2tlZF9sdW4pOwogCi0JcmV0dXJuIGNvcmVfYWx1YV93cml0ZV90cGdfbWV0YWRhdGEocGF0aCwgbWRfYnVmLCBsZW4pOworCXJjID0gY29yZV9hbHVhX3dyaXRlX3RwZ19tZXRhZGF0YShwYXRoLCBtZF9idWYsIGxlbik7CisJa2ZyZWUobWRfYnVmKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjb3JlX2FsdWFfc2V0X3RnX3B0X3NlY29uZGFyeV9zdGF0ZSgKQEAgLTEwMzMsOCArMTMxMyw2IEBACiAJaW50IG9mZmxpbmUpCiB7CiAJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICp0Z19wdF9ncDsKLQl1bnNpZ25lZCBjaGFyICptZF9idWY7Ci0JdTMyIG1kX2J1Zl9sZW47CiAJaW50IHRyYW5zX2RlbGF5X21zZWNzOwogCiAJc3Bpbl9sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKQEAgLTEwNTUsNyArMTMzMyw2IEBACiAJZWxzZQogCQlhdG9taWNfc2V0KCZwb3J0LT5zZXBfdGdfcHRfc2Vjb25kYXJ5X29mZmxpbmUsIDApOwogCi0JbWRfYnVmX2xlbiA9IHRnX3B0X2dwLT50Z19wdF9ncF9tZF9idWZfbGVuOwogCXBvcnQtPnNlcF90Z19wdF9zZWNvbmRhcnlfc3RhdCA9IChleHBsaWNpdCkgPwogCQkJQUxVQV9TVEFUVVNfQUxURVJFRF9CWV9FWFBMSUNJVF9TVFBHIDoKIAkJCUFMVUFfU1RBVFVTX0FMVEVSRURfQllfSU1QTElDSVRfQUxVQTsKQEAgLTEwNzcsMjMgKzEzNTQsMTE1IEBACiAJICogc2Vjb25kYXJ5IHN0YXRlIGFuZCBzdGF0dXMKIAkgKi8KIAlpZiAocG9ydC0+c2VwX3RnX3B0X3NlY29uZGFyeV93cml0ZV9tZCkgewotCQltZF9idWYgPSBremFsbG9jKG1kX2J1Zl9sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIW1kX2J1ZikgewotCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWRfYnVmIGZvciIKLQkJCQkiIHNlY29uZGFyeSBBTFVBIGFjY2VzcyBtZXRhZGF0YVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQltdXRleF9sb2NrKCZwb3J0LT5zZXBfdGdfcHRfbWRfbXV0ZXgpOwotCQljb3JlX2FsdWFfdXBkYXRlX3RwZ19zZWNvbmRhcnlfbWV0YWRhdGEodGdfcHRfZ3BfbWVtLCBwb3J0LAotCQkJCW1kX2J1ZiwgbWRfYnVmX2xlbik7CisJCWNvcmVfYWx1YV91cGRhdGVfdHBnX3NlY29uZGFyeV9tZXRhZGF0YSh0Z19wdF9ncF9tZW0sIHBvcnQpOwogCQltdXRleF91bmxvY2soJnBvcnQtPnNlcF90Z19wdF9tZF9tdXRleCk7Ci0KLQkJa2ZyZWUobWRfYnVmKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IHQxMF9hbHVhX2xiYV9tYXAgKgorY29yZV9hbHVhX2FsbG9jYXRlX2xiYV9tYXAoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCSAgIHU2NCBmaXJzdF9sYmEsIHU2NCBsYXN0X2xiYSkKK3sKKwlzdHJ1Y3QgdDEwX2FsdWFfbGJhX21hcCAqbGJhX21hcDsKKworCWxiYV9tYXAgPSBrbWVtX2NhY2hlX3phbGxvYyh0MTBfYWx1YV9sYmFfbWFwX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxiYV9tYXApIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHQxMF9hbHVhX2xiYV9tYXBcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJSU5JVF9MSVNUX0hFQUQoJmxiYV9tYXAtPmxiYV9tYXBfbWVtX2xpc3QpOworCWxiYV9tYXAtPmxiYV9tYXBfZmlyc3RfbGJhID0gZmlyc3RfbGJhOworCWxiYV9tYXAtPmxiYV9tYXBfbGFzdF9sYmEgPSBsYXN0X2xiYTsKKworCWxpc3RfYWRkX3RhaWwoJmxiYV9tYXAtPmxiYV9tYXBfbGlzdCwgbGlzdCk7CisJcmV0dXJuIGxiYV9tYXA7Cit9CisKK2ludAorY29yZV9hbHVhX2FsbG9jYXRlX2xiYV9tYXBfbWVtKHN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwICpsYmFfbWFwLAorCQkJICAgICAgIGludCBwZ19pZCwgaW50IHN0YXRlKQoreworCXN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwX21lbWJlciAqbGJhX21hcF9tZW07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxiYV9tYXBfbWVtLCAmbGJhX21hcC0+bGJhX21hcF9tZW1fbGlzdCwKKwkJCSAgICBsYmFfbWFwX21lbV9saXN0KSB7CisJCWlmIChsYmFfbWFwX21lbS0+bGJhX21hcF9tZW1fYWx1YV9wZ19pZCA9PSBwZ19pZCkgeworCQkJcHJfZXJyKCJEdXBsaWNhdGUgcGdfaWQgJWQgaW4gbGJhX21hcFxuIiwgcGdfaWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlsYmFfbWFwX21lbSA9IGttZW1fY2FjaGVfemFsbG9jKHQxMF9hbHVhX2xiYV9tYXBfbWVtX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxiYV9tYXBfbWVtKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwX21lbVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsYmFfbWFwX21lbS0+bGJhX21hcF9tZW1fYWx1YV9zdGF0ZSA9IHN0YXRlOworCWxiYV9tYXBfbWVtLT5sYmFfbWFwX21lbV9hbHVhX3BnX2lkID0gcGdfaWQ7CisKKwlsaXN0X2FkZF90YWlsKCZsYmFfbWFwX21lbS0+bGJhX21hcF9tZW1fbGlzdCwKKwkJICAgICAgJmxiYV9tYXAtPmxiYV9tYXBfbWVtX2xpc3QpOworCXJldHVybiAwOworfQorCit2b2lkCitjb3JlX2FsdWFfZnJlZV9sYmFfbWFwKHN0cnVjdCBsaXN0X2hlYWQgKmxiYV9saXN0KQoreworCXN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwICpsYmFfbWFwLCAqbGJhX21hcF90bXA7CisJc3RydWN0IHQxMF9hbHVhX2xiYV9tYXBfbWVtYmVyICpsYmFfbWFwX21lbSwgKmxiYV9tYXBfbWVtX3RtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYmFfbWFwLCBsYmFfbWFwX3RtcCwgbGJhX2xpc3QsCisJCQkJIGxiYV9tYXBfbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGJhX21hcF9tZW0sIGxiYV9tYXBfbWVtX3RtcCwKKwkJCQkJICZsYmFfbWFwLT5sYmFfbWFwX21lbV9saXN0LAorCQkJCQkgbGJhX21hcF9tZW1fbGlzdCkgeworCQkJbGlzdF9kZWwoJmxiYV9tYXBfbWVtLT5sYmFfbWFwX21lbV9saXN0KTsKKwkJCWttZW1fY2FjaGVfZnJlZSh0MTBfYWx1YV9sYmFfbWFwX21lbV9jYWNoZSwKKwkJCQkJbGJhX21hcF9tZW0pOworCQl9CisJCWxpc3RfZGVsKCZsYmFfbWFwLT5sYmFfbWFwX2xpc3QpOworCQlrbWVtX2NhY2hlX2ZyZWUodDEwX2FsdWFfbGJhX21hcF9jYWNoZSwgbGJhX21hcCk7CisJfQorfQorCit2b2lkCitjb3JlX2FsdWFfc2V0X2xiYV9tYXAoc3RydWN0IHNlX2RldmljZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpsYmFfbWFwX2xpc3QsCisJCSAgICAgIGludCBzZWdtZW50X3NpemUsIGludCBzZWdtZW50X211bHQpCit7CisJc3RydWN0IGxpc3RfaGVhZCBvbGRfbGJhX21hcF9saXN0OworCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3A7CisJaW50IGFjdGl2YXRlID0gMCwgc3VwcG9ydGVkOworCisJSU5JVF9MSVNUX0hFQUQoJm9sZF9sYmFfbWFwX2xpc3QpOworCXNwaW5fbG9jaygmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xvY2spOworCWRldi0+dDEwX2FsdWEubGJhX21hcF9zZWdtZW50X3NpemUgPSBzZWdtZW50X3NpemU7CisJZGV2LT50MTBfYWx1YS5sYmFfbWFwX3NlZ21lbnRfbXVsdGlwbGllciA9IHNlZ21lbnRfbXVsdDsKKwlsaXN0X3NwbGljZV9pbml0KCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbGlzdCwgJm9sZF9sYmFfbWFwX2xpc3QpOworCWlmIChsYmFfbWFwX2xpc3QpIHsKKwkJbGlzdF9zcGxpY2VfaW5pdChsYmFfbWFwX2xpc3QsICZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbGlzdCk7CisJCWFjdGl2YXRlID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEubGJhX21hcF9sb2NrKTsKKwlzcGluX2xvY2soJmRldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsICZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0LAorCQkJICAgIHRnX3B0X2dwX2xpc3QpIHsKKworCQlpZiAoIXRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCkKKwkJCWNvbnRpbnVlOworCQlzdXBwb3J0ZWQgPSB0Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9zdXBwb3J0ZWRfc3RhdGVzOworCQlpZiAoYWN0aXZhdGUpCisJCQlzdXBwb3J0ZWQgfD0gQUxVQV9MQkRfU1VQOworCQllbHNlCisJCQlzdXBwb3J0ZWQgJj0gfkFMVUFfTEJEX1NVUDsKKwkJdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfc3VwcG9ydGVkX3N0YXRlcyA9IHN1cHBvcnRlZDsKKwl9CisJc3Bpbl91bmxvY2soJmRldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCWNvcmVfYWx1YV9mcmVlX2xiYV9tYXAoJm9sZF9sYmFfbWFwX2xpc3QpOworfQorCiBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKgogY29yZV9hbHVhX2FsbG9jYXRlX2x1X2dwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBkZWZfZ3JvdXApCiB7CkBAIC0xMzQ2LDggKzE3MTUsOSBAQAogCW11dGV4X2luaXQoJnRnX3B0X2dwLT50Z19wdF9ncF9tZF9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnRnX3B0X2dwLT50Z19wdF9ncF9sb2NrKTsKIAlhdG9taWNfc2V0KCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCwgMCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRnX3B0X2dwLT50Z19wdF9ncF90cmFuc2l0aW9uX3dvcmssCisJCQkgIGNvcmVfYWx1YV9kb190cmFuc2l0aW9uX3RnX3B0X3dvcmspOwogCXRnX3B0X2dwLT50Z19wdF9ncF9kZXYgPSBkZXY7Ci0JdGdfcHRfZ3AtPnRnX3B0X2dwX21kX2J1Zl9sZW4gPSBBTFVBX01EX0JVRl9MRU47CiAJYXRvbWljX3NldCgmdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXRlLAogCQlBTFVBX0FDQ0VTU19TVEFURV9BQ1RJVkVfT1BUSU1JWkVEKTsKIAkvKgpAQCAtMTQ3NSw2ICsxODQ1LDggQEAKIAlkZXYtPnQxMF9hbHVhLmFsdWFfdGdfcHRfZ3BzX2NvdW50ZXItLTsKIAlzcGluX3VubG9jaygmZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiAKKwlmbHVzaF9kZWxheWVkX3dvcmsoJnRnX3B0X2dwLT50Z19wdF9ncF90cmFuc2l0aW9uX3dvcmspOworCiAJLyoKIAkgKiBBbGxvdyBhIHN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKiByZWZlcmVuY2VkIGJ5CiAJICogY29yZV9hbHVhX2dldF90Z19wdF9ncF9ieV9uYW1lKCkgaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaCBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaAppbmRleCA4OGUyZTgzLi4wYTdkNjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5oCkBAIC0xMywxMiArMTMsMTMgQEAKIC8qCiAgKiBBU1lNTUVUUklDIEFDQ0VTUyBTVEFURSBmaWVsZAogICoKLSAqIGZyb20gc3BjNHIxNyBzZWN0aW9uIDYuMjcgVGFibGUgMjQ1CisgKiBmcm9tIHNwYzRyMzZqIHNlY3Rpb24gNi4zNyBUYWJsZSAzMDcKICAqLwogI2RlZmluZSBBTFVBX0FDQ0VTU19TVEFURV9BQ1RJVkVfT1BUSU1JWkVECTB4MAogI2RlZmluZSBBTFVBX0FDQ0VTU19TVEFURV9BQ1RJVkVfTk9OX09QVElNSVpFRAkweDEKICNkZWZpbmUgQUxVQV9BQ0NFU1NfU1RBVEVfU1RBTkRCWQkJMHgyCiAjZGVmaW5lIEFMVUFfQUNDRVNTX1NUQVRFX1VOQVZBSUxBQkxFCQkweDMKKyNkZWZpbmUgQUxVQV9BQ0NFU1NfU1RBVEVfTEJBX0RFUEVOREVOVAkJMHg0CiAjZGVmaW5lIEFMVUFfQUNDRVNTX1NUQVRFX09GRkxJTkUJCTB4ZQogI2RlZmluZSBBTFVBX0FDQ0VTU19TVEFURV9UUkFOU0lUSU9OCQkweGYKIApAQCAtNzgsMTggKzc5LDMwIEBACiAgKi8KICNkZWZpbmUgQUxVQV9TRUNPTkRBUllfTUVUQURBVEFfV1dOX0xFTgkJCTI1NgogCisvKiBVc2VkIGJ5IGNvcmVfYWx1YV91cGRhdGVfdHBnXyhwcmltYXJ5LHNlY29uZGFyeSlfbWV0YWRhdGEgKi8KKyNkZWZpbmUgQUxVQV9NRF9CVUZfTEVOCQkJCQkxMDI0CisKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdDEwX2FsdWFfbHVfZ3BfY2FjaGU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdDEwX2FsdWFfdGdfcHRfZ3BfY2FjaGU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX3RnX3B0X2dwX21lbV9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdDEwX2FsdWFfbGJhX21hcF9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdDEwX2FsdWFfbGJhX21hcF9tZW1fY2FjaGU7CiAKIGV4dGVybiBzZW5zZV9yZWFzb25fdCB0YXJnZXRfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gc2Vuc2VfcmVhc29uX3QgdGFyZ2V0X2VtdWxhdGVfc2V0X3RhcmdldF9wb3J0X2dyb3VwcyhzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIHNlbnNlX3JlYXNvbl90IHRhcmdldF9lbXVsYXRlX3JlcG9ydF9yZWZlcnJhbHMoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBpbnQgY29yZV9hbHVhX2NoZWNrX25vbm9wX2RlbGF5KHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IGNvcmVfYWx1YV9kb19wb3J0X3RyYW5zaXRpb24oc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICosCiAJCQkJc3RydWN0IHNlX2RldmljZSAqLCBzdHJ1Y3Qgc2VfcG9ydCAqLAogCQkJCXN0cnVjdCBzZV9ub2RlX2FjbCAqLCBpbnQsIGludCk7CiBleHRlcm4gY2hhciAqY29yZV9hbHVhX2R1bXBfc3RhdHVzKGludCk7CitleHRlcm4gc3RydWN0IHQxMF9hbHVhX2xiYV9tYXAgKmNvcmVfYWx1YV9hbGxvY2F0ZV9sYmFfbWFwKAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKiwgdTY0LCB1NjQpOworZXh0ZXJuIGludCBjb3JlX2FsdWFfYWxsb2NhdGVfbGJhX21hcF9tZW0oc3RydWN0IHQxMF9hbHVhX2xiYV9tYXAgKiwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgY29yZV9hbHVhX2ZyZWVfbGJhX21hcChzdHJ1Y3QgbGlzdF9oZWFkICopOworZXh0ZXJuIHZvaWQgY29yZV9hbHVhX3NldF9sYmFfbWFwKHN0cnVjdCBzZV9kZXZpY2UgKiwgc3RydWN0IGxpc3RfaGVhZCAqLAorCQkJCWludCwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKmNvcmVfYWx1YV9hbGxvY2F0ZV9sdV9ncChjb25zdCBjaGFyICosIGludCk7CiBleHRlcm4gaW50IGNvcmVfYWx1YV9zZXRfbHVfZ3BfaWQoc3RydWN0IHQxMF9hbHVhX2x1X2dwICosIHUxNik7CiBleHRlcm4gdm9pZCBjb3JlX2FsdWFfZnJlZV9sdV9ncChzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYwppbmRleCAyNzI3NTVkLi5mMGU4NWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMKQEAgLTY0Myw2ICs2NDMsMTUgQEAKIERFRl9ERVZfQVRUUklCKGVtdWxhdGVfM3BjKTsKIFNFX0RFVl9BVFRSKGVtdWxhdGVfM3BjLCBTX0lSVUdPIHwgU19JV1VTUik7CiAKK0RFRl9ERVZfQVRUUklCKHBpX3Byb3RfdHlwZSk7CitTRV9ERVZfQVRUUihwaV9wcm90X3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworREVGX0RFVl9BVFRSSUJfUk8oaHdfcGlfcHJvdF90eXBlKTsKK1NFX0RFVl9BVFRSX1JPKGh3X3BpX3Byb3RfdHlwZSk7CisKK0RFRl9ERVZfQVRUUklCKHBpX3Byb3RfZm9ybWF0KTsKK1NFX0RFVl9BVFRSKHBpX3Byb3RfZm9ybWF0LCBTX0lSVUdPIHwgU19JV1VTUik7CisKIERFRl9ERVZfQVRUUklCKGVuZm9yY2VfcHJfaXNpZHMpOwogU0VfREVWX0FUVFIoZW5mb3JjZV9wcl9pc2lkcywgU19JUlVHTyB8IFNfSVdVU1IpOwogCkBAIC03MDIsNiArNzExLDkgQEAKIAkmdGFyZ2V0X2NvcmVfZGV2X2F0dHJpYl9lbXVsYXRlX3Rwd3MuYXR0ciwKIAkmdGFyZ2V0X2NvcmVfZGV2X2F0dHJpYl9lbXVsYXRlX2Nhdy5hdHRyLAogCSZ0YXJnZXRfY29yZV9kZXZfYXR0cmliX2VtdWxhdGVfM3BjLmF0dHIsCisJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfcGlfcHJvdF90eXBlLmF0dHIsCisJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfaHdfcGlfcHJvdF90eXBlLmF0dHIsCisJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfcGlfcHJvdF9mb3JtYXQuYXR0ciwKIAkmdGFyZ2V0X2NvcmVfZGV2X2F0dHJpYl9lbmZvcmNlX3ByX2lzaWRzLmF0dHIsCiAJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfaXNfbm9ucm90LmF0dHIsCiAJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfZW11bGF0ZV9yZXN0X3Jlb3JkLmF0dHIsCkBAIC0xNzQxLDYgKzE3NTMsMTc2IEBACiAJLnN0b3JlCT0gdGFyZ2V0X2NvcmVfc3RvcmVfYWx1YV9sdV9ncCwKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHRhcmdldF9jb3JlX3Nob3dfZGV2X2xiYV9tYXAodm9pZCAqcCwgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBwOworCXN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwICptYXA7CisJc3RydWN0IHQxMF9hbHVhX2xiYV9tYXBfbWVtYmVyICptZW07CisJY2hhciAqYiA9IHBhZ2U7CisJaW50IGJsID0gMDsKKwljaGFyIHN0YXRlOworCisJc3Bpbl9sb2NrKCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbGlzdCkpCisJICAgIGJsICs9IHNwcmludGYoYiArIGJsLCAiJXUgJXVcbiIsCisJCQkgIGRldi0+dDEwX2FsdWEubGJhX21hcF9zZWdtZW50X3NpemUsCisJCQkgIGRldi0+dDEwX2FsdWEubGJhX21hcF9zZWdtZW50X211bHRpcGxpZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xpc3QsIGxiYV9tYXBfbGlzdCkgeworCQlibCArPSBzcHJpbnRmKGIgKyBibCwgIiVsbHUgJWxsdSIsCisJCQkgICAgICBtYXAtPmxiYV9tYXBfZmlyc3RfbGJhLCBtYXAtPmxiYV9tYXBfbGFzdF9sYmEpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbSwgJm1hcC0+bGJhX21hcF9tZW1fbGlzdCwKKwkJCQkgICAgbGJhX21hcF9tZW1fbGlzdCkgeworCQkJc3dpdGNoIChtZW0tPmxiYV9tYXBfbWVtX2FsdWFfc3RhdGUpIHsKKwkJCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfQUNUSVZFX09QVElNSVpFRDoKKwkJCQlzdGF0ZSA9ICdPJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUxVQV9BQ0NFU1NfU1RBVEVfQUNUSVZFX05PTl9PUFRJTUlaRUQ6CisJCQkJc3RhdGUgPSAnQSc7CisJCQkJYnJlYWs7CisJCQljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX1NUQU5EQlk6CisJCQkJc3RhdGUgPSAnUyc7CisJCQkJYnJlYWs7CisJCQljYXNlIEFMVUFfQUNDRVNTX1NUQVRFX1VOQVZBSUxBQkxFOgorCQkJCXN0YXRlID0gJ1UnOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzdGF0ZSA9ICcuJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJsICs9IHNwcmludGYoYiArIGJsLCAiICVkOiVjIiwKKwkJCQkgICAgICBtZW0tPmxiYV9tYXBfbWVtX2FsdWFfcGdfaWQsIHN0YXRlKTsKKwkJfQorCQlibCArPSBzcHJpbnRmKGIgKyBibCwgIlxuIik7CisJfQorCXNwaW5fdW5sb2NrKCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisJcmV0dXJuIGJsOworfQorCitzdGF0aWMgc3NpemVfdCB0YXJnZXRfY29yZV9zdG9yZV9kZXZfbGJhX21hcCgKKwl2b2lkICpwLAorCWNvbnN0IGNoYXIgKnBhZ2UsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHA7CisJc3RydWN0IHQxMF9hbHVhX2xiYV9tYXAgKmxiYV9tYXAgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgbGJhX2xpc3Q7CisJY2hhciAqbWFwX2VudHJpZXMsICpwdHI7CisJY2hhciBzdGF0ZTsKKwlpbnQgcGdfbnVtID0gLTEsIHBnOworCWludCByZXQgPSAwLCBudW0gPSAwLCBwZ19pZCwgYWx1YV9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2xiYSA9IC0xLCBlbmRfbGJhID0gLTE7CisJdW5zaWduZWQgbG9uZyBzZWdtZW50X3NpemUgPSAtMSwgc2VnbWVudF9tdWx0ID0gLTE7CisKKwltYXBfZW50cmllcyA9IGtzdHJkdXAocGFnZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYXBfZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmbGJhX2xpc3QpOworCXdoaWxlICgocHRyID0gc3Ryc2VwKCZtYXBfZW50cmllcywgIlxuIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqcHRyKQorCQkJY29udGludWU7CisKKwkJaWYgKG51bSA9PSAwKSB7CisJCQlpZiAoc3NjYW5mKHB0ciwgIiVsdSAlbHVcbiIsCisJCQkJICAgJnNlZ21lbnRfc2l6ZSwgJnNlZ21lbnRfbXVsdCkgIT0gMikgeworCQkJCXByX2VycigiSW52YWxpZCBsaW5lICVkXG4iLCBudW0pOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQludW0rKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzc2NhbmYocHRyLCAiJWx1ICVsdSIsICZzdGFydF9sYmEsICZlbmRfbGJhKSAhPSAyKSB7CisJCQlwcl9lcnIoIkludmFsaWQgbGluZSAlZFxuIiwgbnVtKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSBzdHJjaHIocHRyLCAnICcpOworCQlpZiAoIXB0cikgeworCQkJcHJfZXJyKCJJbnZhbGlkIGxpbmUgJWQsIG1pc3NpbmcgZW5kIGxiYVxuIiwgbnVtKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlwdHIrKzsKKwkJcHRyID0gc3RyY2hyKHB0ciwgJyAnKTsKKwkJaWYgKCFwdHIpIHsKKwkJCXByX2VycigiSW52YWxpZCBsaW5lICVkLCBtaXNzaW5nIHN0YXRlIGRlZmluaXRpb25zXG4iLAorCQkJICAgICAgIG51bSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcHRyKys7CisJCWxiYV9tYXAgPSBjb3JlX2FsdWFfYWxsb2NhdGVfbGJhX21hcCgmbGJhX2xpc3QsCisJCQkJCQkgICAgIHN0YXJ0X2xiYSwgZW5kX2xiYSk7CisJCWlmIChJU19FUlIobGJhX21hcCkpIHsKKwkJCXJldCA9IFBUUl9FUlIobGJhX21hcCk7CisJCQlicmVhazsKKwkJfQorCQlwZyA9IDA7CisJCXdoaWxlIChzc2NhbmYocHRyLCAiJWQ6JWMiLCAmcGdfaWQsICZzdGF0ZSkgPT0gMikgeworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSAnTyc6CisJCQkJYWx1YV9zdGF0ZSA9IEFMVUFfQUNDRVNTX1NUQVRFX0FDVElWRV9PUFRJTUlaRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdBJzoKKwkJCQlhbHVhX3N0YXRlID0gQUxVQV9BQ0NFU1NfU1RBVEVfQUNUSVZFX05PTl9PUFRJTUlaRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdTJzoKKwkJCQlhbHVhX3N0YXRlID0gQUxVQV9BQ0NFU1NfU1RBVEVfU1RBTkRCWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1UnOgorCQkJCWFsdWFfc3RhdGUgPSBBTFVBX0FDQ0VTU19TVEFURV9VTkFWQUlMQUJMRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZXJyKCJJbnZhbGlkIEFMVUEgc3RhdGUgJyVjJ1xuIiwgc3RhdGUpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IGNvcmVfYWx1YV9hbGxvY2F0ZV9sYmFfbWFwX21lbShsYmFfbWFwLAorCQkJCQkJCSAgICAgcGdfaWQsIGFsdWFfc3RhdGUpOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiSW52YWxpZCB0YXJnZXQgZGVzY3JpcHRvciAlZDolYyAiCisJCQkJICAgICAgICJhdCBsaW5lICVkXG4iLAorCQkJCSAgICAgICBwZ19pZCwgc3RhdGUsIG51bSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwZysrOworCQkJcHRyID0gc3RyY2hyKHB0ciwgJyAnKTsKKwkJCWlmIChwdHIpCisJCQkJcHRyKys7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBnX251bSA9PSAtMSkKKwkJICAgIHBnX251bSA9IHBnOworCQllbHNlIGlmIChwZyAhPSBwZ19udW0pIHsKKwkJCXByX2VycigiT25seSAlZCBmcm9tICVkIHBvcnQgZ3JvdXBzIGRlZmluaXRpb25zICIKKwkJCSAgICAgICAiYXQgbGluZSAlZFxuIiwgcGcsIHBnX251bSwgbnVtKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQludW0rKzsKKwl9CitvdXQ6CisJaWYgKHJldCkgeworCQljb3JlX2FsdWFfZnJlZV9sYmFfbWFwKCZsYmFfbGlzdCk7CisJCWNvdW50ID0gcmV0OworCX0gZWxzZQorCQljb3JlX2FsdWFfc2V0X2xiYV9tYXAoZGV2LCAmbGJhX2xpc3QsCisJCQkJICAgICAgc2VnbWVudF9zaXplLCBzZWdtZW50X211bHQpOworCWtmcmVlKG1hcF9lbnRyaWVzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X2NvcmVfY29uZmlnZnNfYXR0cmlidXRlIHRhcmdldF9jb3JlX2F0dHJfZGV2X2xiYV9tYXAgPSB7CisJLmF0dHIJPSB7IC5jYV9vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAgLmNhX25hbWUgPSAibGJhX21hcCIsCisJCSAgICAuY2FfbW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisJLnNob3cJPSB0YXJnZXRfY29yZV9zaG93X2Rldl9sYmFfbWFwLAorCS5zdG9yZQk9IHRhcmdldF9jb3JlX3N0b3JlX2Rldl9sYmFfbWFwLAorfTsKKwogc3RhdGljIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmxpb19jb3JlX2Rldl9hdHRyc1tdID0gewogCSZ0YXJnZXRfY29yZV9hdHRyX2Rldl9pbmZvLmF0dHIsCiAJJnRhcmdldF9jb3JlX2F0dHJfZGV2X2NvbnRyb2wuYXR0ciwKQEAgLTE3NDgsNiArMTkzMCw3IEBACiAJJnRhcmdldF9jb3JlX2F0dHJfZGV2X3VkZXZfcGF0aC5hdHRyLAogCSZ0YXJnZXRfY29yZV9hdHRyX2Rldl9lbmFibGUuYXR0ciwKIAkmdGFyZ2V0X2NvcmVfYXR0cl9kZXZfYWx1YV9sdV9ncC5hdHRyLAorCSZ0YXJnZXRfY29yZV9hdHRyX2Rldl9sYmFfbWFwLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTIwNTQsNiArMjIzNywxMyBAQAogCQkJIiB0cmFuc2l0aW9uIHdoaWxlIFRQR1NfSU1QTElDSVRfQUxVQSBpcyBkaXNhYmxlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlpZiAodGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3R5cGUgJiBUUEdTX0VYUExJQ0lUX0FMVUEgJiYKKwkgICAgbmV3X3N0YXRlID09IEFMVUFfQUNDRVNTX1NUQVRFX0xCQV9ERVBFTkRFTlQpIHsKKwkJLyogTEJBIERFUEVOREVOVCBpcyBvbmx5IGFsbG93ZWQgd2l0aCBpbXBsaWNpdCBBTFVBICovCisJCXByX2VycigiVW5hYmxlIHRvIHByb2Nlc3MgaW1wbGljaXQgY29uZmlnZnMgQUxVQSB0cmFuc2l0aW9uIgorCQkgICAgICAgIiB3aGlsZSBleHBsaWNpdCBBTFVBIG1hbmFnZW1lbnQgaXMgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IGNvcmVfYWx1YV9kb19wb3J0X3RyYW5zaXRpb24odGdfcHRfZ3AsIGRldiwKIAkJCQkJTlVMTCwgTlVMTCwgbmV3X3N0YXRlLCAwKTsKQEAgLTIxODgsNyArMjM3OCw3IEBACiAJCQkgICAgICAgdGdfcHRfZ3BfYWx1YV9zdXBwb3J0ZWRfc3RhdGVzLCBBTFVBX0xCRF9TVVApOwogU0VfREVWX0FMVUFfU1VQUE9SVF9TVEFURV9TVE9SRShsYmFfZGVwZW5kZW50LAogCQkJCXRnX3B0X2dwX2FsdWFfc3VwcG9ydGVkX3N0YXRlcywgQUxVQV9MQkRfU1VQKTsKLVNFX0RFVl9BTFVBX1RHX1BUX0FUVFIoYWx1YV9zdXBwb3J0X2xiYV9kZXBlbmRlbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK1NFX0RFVl9BTFVBX1RHX1BUX0FUVFIoYWx1YV9zdXBwb3J0X2xiYV9kZXBlbmRlbnQsIFNfSVJVR08pOwogCiBTRV9ERVZfQUxVQV9TVVBQT1JUX1NUQVRFX1NIT1codW5hdmFpbGFibGUsCiAJCQkgICAgICAgdGdfcHRfZ3BfYWx1YV9zdXBwb3J0ZWRfc3RhdGVzLCBBTFVBX1VfU1VQKTsKQEAgLTI5MzcsNyArMzEyNyw3IEBACiAJICogYW5kIEFMVUEgTG9naWNhbCBVbml0IEdyb3VwIGFuZCBUYXJnZXQgUG9ydCBHcm91cCBpbmZyYXN0cnVjdHVyZS4KIAkgKi8KIAl0YXJnZXRfY2cgPSAmc3Vic3lzLT5zdV9ncm91cDsKLQl0YXJnZXRfY2ctPmRlZmF1bHRfZ3JvdXBzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZpZ19ncm91cCkgKiAyLAorCXRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwICopICogMiwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHMpIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgdGFyZ2V0X2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCmluZGV4IGQwNmRlODQuLjY1MDAxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCkBAIC05MTgsNiArOTE4LDkwIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBzZV9kZXZfc2V0X3BpX3Byb3RfdHlwZShzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmbGFnKQoreworCWludCByYywgb2xkX3Byb3QgPSBkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlOworCisJaWYgKGZsYWcgIT0gMCAmJiBmbGFnICE9IDEgJiYgZmxhZyAhPSAyICYmIGZsYWcgIT0gMykgeworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWQgZm9yIHBpX3Byb3RfdHlwZVxuIiwgZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmxhZyA9PSAyKSB7CisJCXByX2VycigiRElGIFRZUEUyIHByb3RlY3Rpb24gY3VycmVudGx5IG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJaWYgKGRldi0+ZGV2X2F0dHJpYi5od19waV9wcm90X3R5cGUpIHsKKwkJcHJfd2FybigiRElGIHByb3RlY3Rpb24gZW5hYmxlZCBvbiB1bmRlcmx5aW5nIGhhcmR3YXJlLCIKKwkJCSIgaWdub3JpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFkZXYtPnRyYW5zcG9ydC0+aW5pdF9wcm90IHx8ICFkZXYtPnRyYW5zcG9ydC0+ZnJlZV9wcm90KSB7CisJCXByX2VycigiRElGIHByb3RlY3Rpb24gbm90IHN1cHBvcnRlZCBieSBiYWNrZW5kOiAlc1xuIiwKKwkJICAgICAgIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCWlmICghKGRldi0+ZGV2X2ZsYWdzICYgREZfQ09ORklHVVJFRCkpIHsKKwkJcHJfZXJyKCJESUYgcHJvdGVjdGlvbiByZXF1aXJlcyBkZXZpY2UgdG8gYmUgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoZGV2LT5leHBvcnRfY291bnQpIHsKKwkJcHJfZXJyKCJkZXZbJXBdOiBVbmFibGUgdG8gY2hhbmdlIFNFIERldmljZSBQUk9UIHR5cGUgd2hpbGUiCisJCSAgICAgICAiIGV4cG9ydF9jb3VudCBpcyAlZFxuIiwgZGV2LCBkZXYtPmV4cG9ydF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUgPSBmbGFnOworCisJaWYgKGZsYWcgJiYgIW9sZF9wcm90KSB7CisJCXJjID0gZGV2LT50cmFuc3BvcnQtPmluaXRfcHJvdChkZXYpOworCQlpZiAocmMpIHsKKwkJCWRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUgPSBvbGRfcHJvdDsKKwkJCXJldHVybiByYzsKKwkJfQorCisJfSBlbHNlIGlmICghZmxhZyAmJiBvbGRfcHJvdCkgeworCQlkZXYtPnRyYW5zcG9ydC0+ZnJlZV9wcm90KGRldik7CisJfQorCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgUHJvdGVjdGlvbiBUeXBlOiAlZFxuIiwgZGV2LCBmbGFnKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2VfZGV2X3NldF9waV9wcm90X2Zvcm1hdChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmbGFnKQoreworCWludCByYzsKKworCWlmICghZmxhZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmxhZyAhPSAxKSB7CisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgcGlfcHJvdF9mb3JtYXRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFkZXYtPnRyYW5zcG9ydC0+Zm9ybWF0X3Byb3QpIHsKKwkJcHJfZXJyKCJESUYgcHJvdGVjdGlvbiBmb3JtYXQgbm90IHN1cHBvcnRlZCBieSBiYWNrZW5kICVzXG4iLAorCQkgICAgICAgZGV2LT50cmFuc3BvcnQtPm5hbWUpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJaWYgKCEoZGV2LT5kZXZfZmxhZ3MgJiBERl9DT05GSUdVUkVEKSkgeworCQlwcl9lcnIoIkRJRiBwcm90ZWN0aW9uIGZvcm1hdCByZXF1aXJlcyBkZXZpY2UgdG8gYmUgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoZGV2LT5leHBvcnRfY291bnQpIHsKKwkJcHJfZXJyKCJkZXZbJXBdOiBVbmFibGUgdG8gZm9ybWF0IFNFIERldmljZSBQUk9UIHR5cGUgd2hpbGUiCisJCSAgICAgICAiIGV4cG9ydF9jb3VudCBpcyAlZFxuIiwgZGV2LCBkZXYtPmV4cG9ydF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gZGV2LT50cmFuc3BvcnQtPmZvcm1hdF9wcm90KGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU0UgRGV2aWNlIFByb3RlY3Rpb24gRm9ybWF0IGNvbXBsZXRlXG4iLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBzZV9kZXZfc2V0X2VuZm9yY2VfcHJfaXNpZHMoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkpIHsKQEAgLTExMTcsMjMgKzEyMDEsMjMgQEAKIHN0cnVjdCBzZV9sdW4gKmNvcmVfZGV2X2FkZF9sdW4oCiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnLAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKLQl1MzIgbHVuKQorCXUzMiB1bnBhY2tlZF9sdW4pCiB7Ci0Jc3RydWN0IHNlX2x1biAqbHVuX3A7CisJc3RydWN0IHNlX2x1biAqbHVuOwogCWludCByYzsKIAotCWx1bl9wID0gY29yZV90cGdfcHJlX2FkZGx1bih0cGcsIGx1bik7Ci0JaWYgKElTX0VSUihsdW5fcCkpCi0JCXJldHVybiBsdW5fcDsKKwlsdW4gPSBjb3JlX3RwZ19hbGxvY19sdW4odHBnLCB1bnBhY2tlZF9sdW4pOworCWlmIChJU19FUlIobHVuKSkKKwkJcmV0dXJuIGx1bjsKIAotCXJjID0gY29yZV90cGdfcG9zdF9hZGRsdW4odHBnLCBsdW5fcCwKKwlyYyA9IGNvcmVfdHBnX2FkZF9sdW4odHBnLCBsdW4sCiAJCQkJVFJBTlNQT1JUX0xVTkZMQUdTX1JFQURfV1JJVEUsIGRldik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIocmMpOwogCiAJcHJfZGVidWcoIiVzX1RQR1sldV1fTFVOWyV1XSAtIEFjdGl2YXRlZCAlcyBMb2dpY2FsIFVuaXQgZnJvbSIKIAkJIiBDT1JFIEhCQTogJXVcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgbHVuX3AtPnVucGFja2VkX2x1biwKKwkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpLCBsdW4tPnVucGFja2VkX2x1biwKIAkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgZGV2LT5zZV9oYmEtPmhiYV9pZCk7CiAJLyoKIAkgKiBVcGRhdGUgTFVOIG1hcHMgZm9yIGR5bmFtaWNhbGx5IGFkZGVkIGluaXRpYXRvcnMgd2hlbgpAQCAtMTE1NCw3ICsxMjM4LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCX0KIAotCXJldHVybiBsdW5fcDsKKwlyZXR1cm4gbHVuOwogfQogCiAvKiAgICAgIGNvcmVfZGV2X2RlbF9sdW4oKToKQEAgLTE0MjAsNiArMTUwNCw3IEBACiAJZGV2LT5kZXZfbGlua19tYWdpYyA9IFNFX0RFVl9MSU5LX01BR0lDOwogCWRldi0+c2VfaGJhID0gaGJhOwogCWRldi0+dHJhbnNwb3J0ID0gaGJhLT50cmFuc3BvcnQ7CisJZGV2LT5wcm90X2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2VfZGlmX3YxX3R1cGxlKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRldl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kZXZfc2VwX2xpc3QpOwpAQCAtMTQ0NCw2ICsxNTI5LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT50MTBfcHIuYXB0cGxfcmVnX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dDEwX2FsdWEubGJhX21hcF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xvY2spOwogCiAJZGV2LT50MTBfd3duLnQxMF9kZXYgPSBkZXY7CiAJZGV2LT50MTBfYWx1YS50MTBfZGV2ID0gZGV2OwpAQCAtMTQ2MCw2ICsxNTQ3LDcgQEAKIAlkZXYtPmRldl9hdHRyaWIuZW11bGF0ZV90cHdzID0gREFfRU1VTEFURV9UUFdTOwogCWRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX2NhdyA9IERBX0VNVUxBVEVfQ0FXOwogCWRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlXzNwYyA9IERBX0VNVUxBVEVfM1BDOworCWRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUgPSBUQVJHRVRfRElGX1RZUEUwX1BST1Q7CiAJZGV2LT5kZXZfYXR0cmliLmVuZm9yY2VfcHJfaXNpZHMgPSBEQV9FTkZPUkNFX1BSX0lTSURTOwogCWRldi0+ZGV2X2F0dHJpYi5pc19ub25yb3QgPSBEQV9JU19OT05ST1Q7CiAJZGV2LT5kZXZfYXR0cmliLmVtdWxhdGVfcmVzdF9yZW9yZCA9IERBX0VNVUxBVEVfUkVTVF9SRU9SRDsKQEAgLTE1ODgsOSArMTY3NiwxMyBAQAogCX0KIAogCWNvcmVfYWx1YV9mcmVlX2x1X2dwX21lbShkZXYpOworCWNvcmVfYWx1YV9zZXRfbGJhX21hcChkZXYsIE5VTEwsIDAsIDApOwogCWNvcmVfc2NzaTNfZnJlZV9hbGxfcmVnaXN0cmF0aW9ucyhkZXYpOwogCXNlX3JlbGVhc2VfdnBkX2Zvcl9kZXYoZGV2KTsKIAorCWlmIChkZXYtPnRyYW5zcG9ydC0+ZnJlZV9wcm90KQorCQlkZXYtPnRyYW5zcG9ydC0+ZnJlZV9wcm90KGRldik7CisKIAlkZXYtPnRyYW5zcG9ydC0+ZnJlZV9kZXZpY2UoZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYwppbmRleCBkYWUyYWQ2Li43ZGU5ZjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYwpAQCAtOTA2LDcgKzkwNiw3IEBACiAJbHVuX2NnLT5kZWZhdWx0X2dyb3Vwc1sxXSA9IE5VTEw7CiAKIAlwb3J0X3N0YXRfZ3JwID0gJmx1bi0+cG9ydF9zdGF0X2dycHMuc3RhdF9ncm91cDsKLQlwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3VwcyA9ICBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDMsCisJcG9ydF9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMgPSAga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZpZ19ncm91cCAqKSAqIDQsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3VwcykgewogCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKaW5kZXggNzgyNDFhNS4uY2Y5OTFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYwpAQCAtMjU3LDYgKzI1Nyw3MiBAQAogCWtmcmVlKGZkX2Rldik7CiB9CiAKK3N0YXRpYyBpbnQgZmRfZG9fcHJvdF9ydyhzdHJ1Y3Qgc2VfY21kICpjbWQsIHN0cnVjdCBmZF9wcm90ICpmZF9wcm90LAorCQkJIGludCBpc193cml0ZSkKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpzZV9kZXYgPSBjbWQtPnNlX2RldjsKKwlzdHJ1Y3QgZmRfZGV2ICpkZXYgPSBGRF9ERVYoc2VfZGV2KTsKKwlzdHJ1Y3QgZmlsZSAqcHJvdF9mZCA9IGRldi0+ZmRfcHJvdF9maWxlOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJbG9mZl90IHBvcyA9IChjbWQtPnRfdGFza19sYmEgKiBzZV9kZXYtPnByb3RfbGVuZ3RoKTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdTMyIHByb3Rfc2l6ZSwgbGVuLCBzaXplOworCWludCByYywgcmV0ID0gMSwgaTsKKworCXByb3Rfc2l6ZSA9IChjbWQtPmRhdGFfbGVuZ3RoIC8gc2VfZGV2LT5kZXZfYXR0cmliLmJsb2NrX3NpemUpICoKKwkJICAgICBzZV9kZXYtPnByb3RfbGVuZ3RoOworCisJaWYgKCFpc193cml0ZSkgeworCQlmZF9wcm90LT5wcm90X2J1ZiA9IHZ6YWxsb2MocHJvdF9zaXplKTsKKwkJaWYgKCFmZF9wcm90LT5wcm90X2J1ZikgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgZmRfcHJvdC0+cHJvdF9idWZcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYnVmID0gZmRfcHJvdC0+cHJvdF9idWY7CisKKwkJZmRfcHJvdC0+cHJvdF9zZ19uZW50cyA9IGNtZC0+dF9wcm90X25lbnRzOworCQlmZF9wcm90LT5wcm90X3NnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCisJCQkJCSAgIGZkX3Byb3QtPnByb3Rfc2dfbmVudHMsIEdGUF9LRVJORUwpOworCQlpZiAoIWZkX3Byb3QtPnByb3Rfc2cpIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGZkX3Byb3QtPnByb3Rfc2dcbiIpOworCQkJdmZyZWUoZmRfcHJvdC0+cHJvdF9idWYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJc2l6ZSA9IHByb3Rfc2l6ZTsKKworCQlmb3JfZWFjaF9zZyhmZF9wcm90LT5wcm90X3NnLCBzZywgZmRfcHJvdC0+cHJvdF9zZ19uZW50cywgaSkgeworCisJCQlsZW4gPSBtaW5fdCh1MzIsIFBBR0VfU0laRSwgc2l6ZSk7CisJCQlzZ19zZXRfYnVmKHNnLCBidWYsIGxlbik7CisJCQlzaXplIC09IGxlbjsKKwkJCWJ1ZiArPSBsZW47CisJCX0KKwl9CisKKwlpZiAoaXNfd3JpdGUpIHsKKwkJcmMgPSBrZXJuZWxfd3JpdGUocHJvdF9mZCwgZmRfcHJvdC0+cHJvdF9idWYsIHByb3Rfc2l6ZSwgcG9zKTsKKwkJaWYgKHJjIDwgMCB8fCBwcm90X3NpemUgIT0gcmMpIHsKKwkJCXByX2Vycigia2VybmVsX3dyaXRlKCkgZm9yIGZkX2RvX3Byb3RfcncgZmFpbGVkOiIKKwkJCSAgICAgICAiICVkXG4iLCByYyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBrZXJuZWxfcmVhZChwcm90X2ZkLCBwb3MsIGZkX3Byb3QtPnByb3RfYnVmLCBwcm90X3NpemUpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoImtlcm5lbF9yZWFkKCkgZm9yIGZkX2RvX3Byb3RfcncgZmFpbGVkOiIKKwkJCSAgICAgICAiICVkXG4iLCByYyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGlzX3dyaXRlIHx8IHJldCA8IDApIHsKKwkJa2ZyZWUoZmRfcHJvdC0+cHJvdF9zZyk7CisJCXZmcmVlKGZkX3Byb3QtPnByb3RfYnVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGZkX2RvX3J3KHN0cnVjdCBzZV9jbWQgKmNtZCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCiAJCXUzMiBzZ2xfbmVudHMsIGludCBpc193cml0ZSkKIHsKQEAgLTU1MSw2ICs2MTcsOCBAQAogCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRhdGFfZGlyZWN0aW9uKQogewogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBmZF9wcm90IGZkX3Byb3Q7CisJc2Vuc2VfcmVhc29uX3QgcmM7CiAJaW50IHJldCA9IDA7CiAKIAkvKgpAQCAtNTU4LDggKzYyNiw0OCBAQAogCSAqIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzZXMgdG8gc3RydWN0IGlvdmVjIHZpcnR1YWwgbWVtb3J5LgogCSAqLwogCWlmIChkYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJbWVtc2V0KCZmZF9wcm90LCAwLCBzaXplb2Yoc3RydWN0IGZkX3Byb3QpKTsKKworCQlpZiAoY21kLT5wcm90X3R5cGUpIHsKKwkJCXJldCA9IGZkX2RvX3Byb3RfcncoY21kLCAmZmRfcHJvdCwgZmFsc2UpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQl9CisKIAkJcmV0ID0gZmRfZG9fcncoY21kLCBzZ2wsIHNnbF9uZW50cywgMCk7CisKKwkJaWYgKHJldCA+IDAgJiYgY21kLT5wcm90X3R5cGUpIHsKKwkJCXUzMiBzZWN0b3JzID0gY21kLT5kYXRhX2xlbmd0aCAvIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplOworCisJCQlyYyA9IHNiY19kaWZfdmVyaWZ5X3JlYWQoY21kLCBjbWQtPnRfdGFza19sYmEsIHNlY3RvcnMsCisJCQkJCQkgMCwgZmRfcHJvdC5wcm90X3NnLCAwKTsKKwkJCWlmIChyYykgeworCQkJCWtmcmVlKGZkX3Byb3QucHJvdF9zZyk7CisJCQkJdmZyZWUoZmRfcHJvdC5wcm90X2J1Zik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJa2ZyZWUoZmRfcHJvdC5wcm90X3NnKTsKKwkJCXZmcmVlKGZkX3Byb3QucHJvdF9idWYpOworCQl9CiAJfSBlbHNlIHsKKwkJbWVtc2V0KCZmZF9wcm90LCAwLCBzaXplb2Yoc3RydWN0IGZkX3Byb3QpKTsKKworCQlpZiAoY21kLT5wcm90X3R5cGUpIHsKKwkJCXUzMiBzZWN0b3JzID0gY21kLT5kYXRhX2xlbmd0aCAvIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplOworCisJCQlyZXQgPSBmZF9kb19wcm90X3J3KGNtZCwgJmZkX3Byb3QsIGZhbHNlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKworCQkJcmMgPSBzYmNfZGlmX3ZlcmlmeV93cml0ZShjbWQsIGNtZC0+dF90YXNrX2xiYSwgc2VjdG9ycywKKwkJCQkJCSAgMCwgZmRfcHJvdC5wcm90X3NnLCAwKTsKKwkJCWlmIChyYykgeworCQkJCWtmcmVlKGZkX3Byb3QucHJvdF9zZyk7CisJCQkJdmZyZWUoZmRfcHJvdC5wcm90X2J1Zik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisKIAkJcmV0ID0gZmRfZG9fcncoY21kLCBzZ2wsIHNnbF9uZW50cywgMSk7CiAJCS8qCiAJCSAqIFBlcmZvcm0gaW1wbGljaXQgdmZzX2ZzeW5jX3JhbmdlKCkgZm9yIGZkX2RvX3dyaXRldigpIG9wcwpAQCAtNTc2LDEwICs2ODQsMTkgQEAKIAogCQkJdmZzX2ZzeW5jX3JhbmdlKGZkX2Rldi0+ZmRfZmlsZSwgc3RhcnQsIGVuZCwgMSk7CiAJCX0KKworCQlpZiAocmV0ID4gMCAmJiBjbWQtPnByb3RfdHlwZSkgeworCQkJcmV0ID0gZmRfZG9fcHJvdF9ydyhjbWQsICZmZF9wcm90LCB0cnVlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJfQogCX0KIAotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGZkX3Byb3QucHJvdF9zZyk7CisJCXZmcmVlKGZkX3Byb3QucHJvdF9idWYpOwogCQlyZXR1cm4gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJfQogCiAJaWYgKHJldCkKIAkJdGFyZ2V0X2NvbXBsZXRlX2NtZChjbWQsIFNBTV9TVEFUX0dPT0QpOwpAQCAtNzAwLDYgKzgxNywxNDAgQEAKIAkJICAgICAgIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplKTsKIH0KIAorc3RhdGljIGludCBmZF9pbml0X3Byb3Qoc3RydWN0IHNlX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZF9kZXYgKmZkX2RldiA9IEZEX0RFVihkZXYpOworCXN0cnVjdCBmaWxlICpwcm90X2ZpbGUsICpmaWxlID0gZmRfZGV2LT5mZF9maWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJldCwgZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX0RTWU5DOworCWNoYXIgYnVmW0ZEX01BWF9ERVZfUFJPVF9OQU1FXTsKKworCWlmICghZmlsZSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgZmRfZGV2LT5mZF9maWxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJcHJfZXJyKCJGSUxFSU8gUHJvdGVjdGlvbiBlbXVsYXRpb24gb25seSBzdXBwb3J0ZWQgb24iCisJCSAgICAgICAiICFTX0lTQkxLXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKGZkX2Rldi0+ZmJkX2ZsYWdzICYgRkRCRF9IQVNfQlVGRkVSRURfSU9fV0NFKQorCQlmbGFncyAmPSB+T19EU1lOQzsKKworCXNucHJpbnRmKGJ1ZiwgRkRfTUFYX0RFVl9QUk9UX05BTUUsICIlcy5wcm90ZWN0aW9uIiwKKwkJIGZkX2Rldi0+ZmRfZGV2X25hbWUpOworCisJcHJvdF9maWxlID0gZmlscF9vcGVuKGJ1ZiwgZmxhZ3MsIDA2MDApOworCWlmIChJU19FUlIocHJvdF9maWxlKSkgeworCQlwcl9lcnIoImZpbHBfb3BlbiglcykgZmFpbGVkXG4iLCBidWYpOworCQlyZXQgPSBQVFJfRVJSKHByb3RfZmlsZSk7CisJCXJldHVybiByZXQ7CisJfQorCWZkX2Rldi0+ZmRfcHJvdF9maWxlID0gcHJvdF9maWxlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZkX2luaXRfZm9ybWF0X2J1ZihzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgICAgICB1MzIgdW5pdF9zaXplLCB1MzIgKnJlZl90YWcsIHUxNiBhcHBfdGFnLAorCQkJICAgICAgIGJvb2wgaW5jX3JlZnRhZykKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gYnVmOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHVuaXRfc2l6ZTsgaSArPSBkZXYtPnByb3RfbGVuZ3RoKSB7CisJCSooKHUxNiAqKSZwWzBdKSA9IDB4ZmZmZjsKKwkJKigoX19iZTE2ICopJnBbMl0pID0gY3B1X3RvX2JlMTYoYXBwX3RhZyk7CisJCSooKF9fYmUzMiAqKSZwWzRdKSA9IGNwdV90b19iZTMyKCpyZWZfdGFnKTsKKworCQlpZiAoaW5jX3JlZnRhZykKKwkJCSgqcmVmX3RhZykrKzsKKworCQlwICs9IGRldi0+cHJvdF9sZW5ndGg7CisJfQorfQorCitzdGF0aWMgaW50IGZkX2Zvcm1hdF9wcm90KHN0cnVjdCBzZV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmRfZGV2ICpmZF9kZXYgPSBGRF9ERVYoZGV2KTsKKwlzdHJ1Y3QgZmlsZSAqcHJvdF9mZCA9IGZkX2Rldi0+ZmRfcHJvdF9maWxlOworCXNlY3Rvcl90IHByb3RfbGVuZ3RoLCBwcm90OworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlsb2ZmX3QgcG9zID0gMDsKKwl1MzIgcmVmX3RhZyA9IDA7CisJaW50IHVuaXRfc2l6ZSA9IEZEQkRfRk9STUFUX1VOSVRfU0laRSAqIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplOworCWludCByYywgcmV0ID0gMCwgc2l6ZSwgbGVuOworCWJvb2wgaW5jX3JlZnRhZyA9IGZhbHNlOworCisJaWYgKCFkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGZvcm1hdF9wcm90IHdoaWxlIHBpX3Byb3RfdHlwZSA9PSAwXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghcHJvdF9mZCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgZmRfZGV2LT5mZF9wcm90X2ZpbGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUpIHsKKwljYXNlIFRBUkdFVF9ESUZfVFlQRTNfUFJPVDoKKwkJcmVmX3RhZyA9IDB4ZmZmZmZmZmY7CisJCWJyZWFrOworCWNhc2UgVEFSR0VUX0RJRl9UWVBFMl9QUk9UOgorCWNhc2UgVEFSR0VUX0RJRl9UWVBFMV9QUk9UOgorCQlpbmNfcmVmdGFnID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJYnVmID0gdnphbGxvYyh1bml0X3NpemUpOworCWlmICghYnVmKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIEZJTEVJTyBwcm90IGJ1ZlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByb3RfbGVuZ3RoID0gKGRldi0+dHJhbnNwb3J0LT5nZXRfYmxvY2tzKGRldikgKyAxKSAqIGRldi0+cHJvdF9sZW5ndGg7CisJc2l6ZSA9IHByb3RfbGVuZ3RoOworCisJcHJfZGVidWcoIlVzaW5nIEZJTEVJTyBwcm90X2xlbmd0aDogJWxsdVxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvdF9sZW5ndGgpOworCisJZm9yIChwcm90ID0gMDsgcHJvdCA8IHByb3RfbGVuZ3RoOyBwcm90ICs9IHVuaXRfc2l6ZSkgeworCisJCWZkX2luaXRfZm9ybWF0X2J1ZihkZXYsIGJ1ZiwgdW5pdF9zaXplLCAmcmVmX3RhZywgMHhmZmZmLAorCQkJCSAgIGluY19yZWZ0YWcpOworCisJCWxlbiA9IG1pbih1bml0X3NpemUsIHNpemUpOworCisJCXJjID0ga2VybmVsX3dyaXRlKHByb3RfZmQsIGJ1ZiwgbGVuLCBwb3MpOworCQlpZiAocmMgIT0gbGVuKSB7CisJCQlwcl9lcnIoInZmc193cml0ZSB0byBwcm90IGZpbGUgZmFpbGVkOiAlZFxuIiwgcmMpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXBvcyArPSBsZW47CisJCXNpemUgLT0gbGVuOworCX0KKworb3V0OgorCXZmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmRfZnJlZV9wcm90KHN0cnVjdCBzZV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmRfZGV2ICpmZF9kZXYgPSBGRF9ERVYoZGV2KTsKKworCWlmICghZmRfZGV2LT5mZF9wcm90X2ZpbGUpCisJCXJldHVybjsKKworCWZpbHBfY2xvc2UoZmRfZGV2LT5mZF9wcm90X2ZpbGUsIE5VTEwpOworCWZkX2Rldi0+ZmRfcHJvdF9maWxlID0gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBzYmNfb3BzIGZkX3NiY19vcHMgPSB7CiAJLmV4ZWN1dGVfcncJCT0gZmRfZXhlY3V0ZV9ydywKIAkuZXhlY3V0ZV9zeW5jX2NhY2hlCT0gZmRfZXhlY3V0ZV9zeW5jX2NhY2hlLApAQCAtNzMwLDYgKzk4MSw5IEBACiAJLnNob3dfY29uZmlnZnNfZGV2X3BhcmFtcyA9IGZkX3Nob3dfY29uZmlnZnNfZGV2X3BhcmFtcywKIAkuZ2V0X2RldmljZV90eXBlCT0gc2JjX2dldF9kZXZpY2VfdHlwZSwKIAkuZ2V0X2Jsb2NrcwkJPSBmZF9nZXRfYmxvY2tzLAorCS5pbml0X3Byb3QJCT0gZmRfaW5pdF9wcm90LAorCS5mb3JtYXRfcHJvdAkJPSBmZF9mb3JtYXRfcHJvdCwKKwkuZnJlZV9wcm90CQk9IGZkX2ZyZWVfcHJvdCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGZpbGVpb19tb2R1bGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5oCmluZGV4IGQ3NzcyYzEuLjE4MmNiYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuaAorKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmgKQEAgLTQsNiArNCw3IEBACiAjZGVmaW5lIEZEX1ZFUlNJT04JCSI0LjAiCiAKICNkZWZpbmUgRkRfTUFYX0RFVl9OQU1FCQkyNTYKKyNkZWZpbmUgRkRfTUFYX0RFVl9QUk9UX05BTUUJRkRfTUFYX0RFVl9OQU1FICsgMTYKICNkZWZpbmUgRkRfREVWSUNFX1FVRVVFX0RFUFRICTMyCiAjZGVmaW5lIEZEX01BWF9ERVZJQ0VfUVVFVUVfREVQVEggMTI4CiAjZGVmaW5lIEZEX0JMT0NLU0laRQkJNTEyCkBAIC0xOCw2ICsxOSwxMyBAQAogI2RlZmluZSBGQkRGX0hBU19QQVRICQkweDAxCiAjZGVmaW5lIEZCREZfSEFTX1NJWkUJCTB4MDIKICNkZWZpbmUgRkRCRF9IQVNfQlVGRkVSRURfSU9fV0NFIDB4MDQKKyNkZWZpbmUgRkRCRF9GT1JNQVRfVU5JVF9TSVpFCTIwNDgKKworc3RydWN0IGZkX3Byb3QgeworCXVuc2lnbmVkIGNoYXIJKnByb3RfYnVmOworCXN0cnVjdCBzY2F0dGVybGlzdCAqcHJvdF9zZzsKKwl1MzIgcHJvdF9zZ19uZW50czsKK307CiAKIHN0cnVjdCBmZF9kZXYgewogCXN0cnVjdCBzZV9kZXZpY2UgZGV2OwpAQCAtMzIsNiArNDAsNyBAQAogCXUzMgkJZmRfYmxvY2tfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgZmRfZGV2X3NpemU7CiAJc3RydWN0IGZpbGUJKmZkX2ZpbGU7CisJc3RydWN0IGZpbGUJKmZkX3Byb3RfZmlsZTsKIAkvKiBGSUxFSU8gSEJBIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gKi8KIAlzdHJ1Y3QgZmRfaG9zdCAqZmRfaG9zdDsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYwppbmRleCBjODc5NTlmLi41NTRkNGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYwpAQCAtOTEsNiArOTEsNyBAQAogCXN0cnVjdCBpYmxvY2tfZGV2ICppYl9kZXYgPSBJQkxPQ0tfREVWKGRldik7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmQgPSBOVUxMOworCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaTsKIAlmbW9kZV90IG1vZGU7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKQEAgLTE1NSw4ICsxNTYsNDAgQEAKIAlpZiAoYmxrX3F1ZXVlX25vbnJvdChxKSkKIAkJZGV2LT5kZXZfYXR0cmliLmlzX25vbnJvdCA9IDE7CiAKKwliaSA9IGJkZXZfZ2V0X2ludGVncml0eShiZCk7CisJaWYgKGJpKSB7CisJCXN0cnVjdCBiaW9fc2V0ICpicyA9IGliX2Rldi0+aWJkX2Jpb19zZXQ7CisKKwkJaWYgKCFzdHJjbXAoYmktPm5hbWUsICJUMTAtRElGLVRZUEUzLUlQIikgfHwKKwkJICAgICFzdHJjbXAoYmktPm5hbWUsICJUMTAtRElGLVRZUEUxLUlQIikpIHsKKwkJCXByX2VycigiSUJMT0NLIGV4cG9ydCBvZiBibGtfaW50ZWdyaXR5OiAlcyBub3QiCisJCQkgICAgICAgIiBzdXBwb3J0ZWRcbiIsIGJpLT5uYW1lKTsKKwkJCXJldCA9IC1FTk9TWVM7CisJCQlnb3RvIG91dF9ibGtkZXZfcHV0OworCQl9CisKKwkJaWYgKCFzdHJjbXAoYmktPm5hbWUsICJUMTAtRElGLVRZUEUzLUNSQyIpKSB7CisJCQlkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlID0gVEFSR0VUX0RJRl9UWVBFM19QUk9UOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYmktPm5hbWUsICJUMTAtRElGLVRZUEUxLUNSQyIpKSB7CisJCQlkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlID0gVEFSR0VUX0RJRl9UWVBFMV9QUk9UOworCQl9CisKKwkJaWYgKGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUpIHsKKwkJCWlmIChiaW9zZXRfaW50ZWdyaXR5X2NyZWF0ZShicywgSUJMT0NLX0JJT19QT09MX1NJWkUpIDwgMCkgeworCQkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGJpb3NldCBmb3IgUElcbiIpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXRfYmxrZGV2X3B1dDsKKwkJCX0KKwkJCXByX2RlYnVnKCJJQkxPQ0sgc2V0dXAgQklQIGJzLT5iaW9faW50ZWdyaXR5X3Bvb2w6ICVwXG4iLAorCQkJCSBicy0+YmlvX2ludGVncml0eV9wb29sKTsKKwkJfQorCQlkZXYtPmRldl9hdHRyaWIuaHdfcGlfcHJvdF90eXBlID0gZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZTsKKwl9CisKIAlyZXR1cm4gMDsKIAorb3V0X2Jsa2Rldl9wdXQ6CisJYmxrZGV2X3B1dChpYl9kZXYtPmliZF9iZCwgRk1PREVfV1JJVEV8Rk1PREVfUkVBRHxGTU9ERV9FWENMKTsKIG91dF9mcmVlX2Jpb3NldDoKIAliaW9zZXRfZnJlZShpYl9kZXYtPmliZF9iaW9fc2V0KTsKIAlpYl9kZXYtPmliZF9iaW9fc2V0ID0gTlVMTDsKQEAgLTE3MCw4ICsyMDMsMTAgQEAKIAogCWlmIChpYl9kZXYtPmliZF9iZCAhPSBOVUxMKQogCQlibGtkZXZfcHV0KGliX2Rldi0+aWJkX2JkLCBGTU9ERV9XUklURXxGTU9ERV9SRUFEfEZNT0RFX0VYQ0wpOwotCWlmIChpYl9kZXYtPmliZF9iaW9fc2V0ICE9IE5VTEwpCisJaWYgKGliX2Rldi0+aWJkX2Jpb19zZXQgIT0gTlVMTCkgeworCQliaW9zZXRfaW50ZWdyaXR5X2ZyZWUoaWJfZGV2LT5pYmRfYmlvX3NldCk7CiAJCWJpb3NldF9mcmVlKGliX2Rldi0+aWJkX2Jpb19zZXQpOworCX0KIAlrZnJlZShpYl9kZXYpOwogfQogCkBAIC0zMTksNyArMzU0LDcgQEAKIAliaW8tPmJpX2JkZXYgPSBpYl9kZXYtPmliZF9iZDsKIAliaW8tPmJpX3ByaXZhdGUgPSBjbWQ7CiAJYmlvLT5iaV9lbmRfaW8gPSAmaWJsb2NrX2Jpb19kb25lOwotCWJpby0+Ymlfc2VjdG9yID0gbGJhOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBsYmE7CiAKIAlyZXR1cm4gYmlvOwogfQpAQCAtNTg2LDEzICs2MjEsNTggQEAKIAlyZXR1cm4gYmw7CiB9CiAKK3N0YXRpYyBpbnQKK2libG9ja19hbGxvY19iaXAoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpOworCXN0cnVjdCBiaW9faW50ZWdyaXR5X3BheWxvYWQgKmJpcDsKKwlzdHJ1Y3QgaWJsb2NrX2RldiAqaWJfZGV2ID0gSUJMT0NLX0RFVihkZXYpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGksIHJjOworCisJYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoaWJfZGV2LT5pYmRfYmQpOworCWlmICghYmkpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIGJpb19pbnRlZ3JpdHlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwliaXAgPSBiaW9faW50ZWdyaXR5X2FsbG9jKGJpbywgR0ZQX05PSU8sIGNtZC0+dF9wcm90X25lbnRzKTsKKwlpZiAoIWJpcCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBiaW9faW50ZWdyaXR5X3BheWxvYWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliaXAtPmJpcF9pdGVyLmJpX3NpemUgPSAoY21kLT5kYXRhX2xlbmd0aCAvIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplKSAqCisJCQkgZGV2LT5wcm90X2xlbmd0aDsKKwliaXAtPmJpcF9pdGVyLmJpX3NlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisKKwlwcl9kZWJ1ZygiSUJMT0NLIEJJUCBTaXplOiAldSBTZWN0b3I6ICVsbHVcbiIsIGJpcC0+YmlwX2l0ZXIuYmlfc2l6ZSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmlwLT5iaXBfaXRlci5iaV9zZWN0b3IpOworCisJZm9yX2VhY2hfc2coY21kLT50X3Byb3Rfc2csIHNnLCBjbWQtPnRfcHJvdF9uZW50cywgaSkgeworCisJCXJjID0gYmlvX2ludGVncml0eV9hZGRfcGFnZShiaW8sIHNnX3BhZ2Uoc2cpLCBzZy0+bGVuZ3RoLAorCQkJCQkgICAgc2ctPm9mZnNldCk7CisJCWlmIChyYyAhPSBzZy0+bGVuZ3RoKSB7CisJCQlwcl9lcnIoImJpb19pbnRlZ3JpdHlfYWRkX3BhZ2UoKSBmYWlsZWQ7ICVkXG4iLCByYyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXByX2RlYnVnKCJBZGRlZCBiaW8gaW50ZWdyaXR5IHBhZ2U6ICVwIGxlbmd0aDogJWQgb2Zmc2V0OyAlZFxuIiwKKwkJCSBzZ19wYWdlKHNnKSwgc2ctPmxlbmd0aCwgc2ctPm9mZnNldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzZW5zZV9yZWFzb25fdAogaWJsb2NrX2V4ZWN1dGVfcncoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdTMyIHNnbF9uZW50cywKIAkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkYXRhX2RpcmVjdGlvbikKIHsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAlzdHJ1Y3QgaWJsb2NrX3JlcSAqaWJyOwotCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgYmlvICpiaW8sICpiaW9fc3RhcnQ7CiAJc3RydWN0IGJpb19saXN0IGxpc3Q7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAl1MzIgc2dfbnVtID0gc2dsX25lbnRzOwpAQCAtNjU1LDYgKzczNSw3IEBACiAJaWYgKCFiaW8pCiAJCWdvdG8gZmFpbF9mcmVlX2licjsKIAorCWJpb19zdGFydCA9IGJpbzsKIAliaW9fbGlzdF9pbml0KCZsaXN0KTsKIAliaW9fbGlzdF9hZGQoJmxpc3QsIGJpbyk7CiAKQEAgLTY4OCw2ICs3NjksMTIgQEAKIAkJc2dfbnVtLS07CiAJfQogCisJaWYgKGNtZC0+cHJvdF90eXBlKSB7CisJCWludCByYyA9IGlibG9ja19hbGxvY19iaXAoY21kLCBiaW9fc3RhcnQpOworCQlpZiAocmMpCisJCQlnb3RvIGZhaWxfcHV0X2Jpb3M7CisJfQorCiAJaWJsb2NrX3N1Ym1pdF9iaW9zKCZsaXN0LCBydyk7CiAJaWJsb2NrX2NvbXBsZXRlX2NtZChjbWQpOwogCXJldHVybiAwOwpAQCAtNzYzLDcgKzg1MCw3IEBACiAJcmV0dXJuIHNiY19wYXJzZV9jZGIoY21kLCAmaWJsb2NrX3NiY19vcHMpOwogfQogCi1ib29sIGlibG9ja19nZXRfd3JpdGVfY2FjaGUoc3RydWN0IHNlX2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgaWJsb2NrX2dldF93cml0ZV9jYWNoZShzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlibG9ja19kZXYgKmliX2RldiA9IElCTE9DS19ERVYoZGV2KTsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZCA9IGliX2Rldi0+aWJkX2JkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaW50ZXJuYWwuaCBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ludGVybmFsLmgKaW5kZXggNDdiNjNiMC4uZGU5Y2FiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pbnRlcm5hbC5oCkBAIC0zNSw2ICszNSw4IEBACiBpbnQJc2VfZGV2X3NldF9lbXVsYXRlX3Rwd3Moc3RydWN0IHNlX2RldmljZSAqLCBpbnQpOwogaW50CXNlX2Rldl9zZXRfZW11bGF0ZV9jYXcoc3RydWN0IHNlX2RldmljZSAqLCBpbnQpOwogaW50CXNlX2Rldl9zZXRfZW11bGF0ZV8zcGMoc3RydWN0IHNlX2RldmljZSAqLCBpbnQpOworaW50CXNlX2Rldl9zZXRfcGlfcHJvdF90eXBlKHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKK2ludAlzZV9kZXZfc2V0X3BpX3Byb3RfZm9ybWF0KHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKIGludAlzZV9kZXZfc2V0X2VuZm9yY2VfcHJfaXNpZHMoc3RydWN0IHNlX2RldmljZSAqLCBpbnQpOwogaW50CXNlX2Rldl9zZXRfaXNfbm9ucm90KHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKIGludAlzZV9kZXZfc2V0X2VtdWxhdGVfcmVzdF9yZW9yZChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCk7CkBAIC03Nyw5ICs3OSw5IEBACiAJCWNvbnN0IGNoYXIgKik7CiB2b2lkCWNvcmVfdHBnX2FkZF9ub2RlX3RvX2RldnMoc3RydWN0IHNlX25vZGVfYWNsICosIHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKik7CiB2b2lkCWNvcmVfdHBnX3dhaXRfZm9yX25hY2xfcHJfcmVmKHN0cnVjdCBzZV9ub2RlX2FjbCAqKTsKLXN0cnVjdCBzZV9sdW4gKmNvcmVfdHBnX3ByZV9hZGRsdW4oc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqLCB1MzIpOwotaW50CWNvcmVfdHBnX3Bvc3RfYWRkbHVuKHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKiwgc3RydWN0IHNlX2x1biAqLAotCQl1MzIsIHZvaWQgKik7CitzdHJ1Y3Qgc2VfbHVuICpjb3JlX3RwZ19hbGxvY19sdW4oc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqLCB1MzIpOworaW50CWNvcmVfdHBnX2FkZF9sdW4oc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqLCBzdHJ1Y3Qgc2VfbHVuICosCisJCXUzMiwgc3RydWN0IHNlX2RldmljZSAqKTsKIHN0cnVjdCBzZV9sdW4gKmNvcmVfdHBnX3ByZV9kZWxsdW4oc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqLCB1MzIgdW5wYWNrZWRfbHVuKTsKIGludAljb3JlX3RwZ19wb3N0X2RlbGx1bihzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICosIHN0cnVjdCBzZV9sdW4gKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmggYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oCmluZGV4IGVkNzVjZGQuLjJlZTI5MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuaApAQCAtNDMsNiArNDMsMTEgQEAKICNkZWZpbmUgUFJfQVBUUExfTUFYX0lQT1JUX0xFTgkJCTI1NgogI2RlZmluZSBQUl9BUFRQTF9NQVhfVFBPUlRfTEVOCQkJMjU2CiAKKy8qCisgKiAgRnVuY3Rpb24gZGVmaW5lZCBpbiB0YXJnZXRfY29yZV9zcGMuYworICovCit2b2lkIHNwY19wYXJzZV9uYWFfNmhfdmVuZG9yX3NwZWNpZmljKHN0cnVjdCBzZV9kZXZpY2UgKiwgdW5zaWduZWQgY2hhciAqKTsKKwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfcHJfcmVnX2NhY2hlOwogCiBleHRlcm4gdm9pZCBjb3JlX3ByX2R1bXBfaW5pdGlhdG9yX3BvcnQoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5jCmluZGV4IDRmZmU1ZjIuLjY2YTVhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuYwpAQCAtNzgsMjMgKzc4LDE0IEBACiAJaGJhLT5oYmFfcHRyID0gTlVMTDsKIH0KIAotLyoJcmRfcmVsZWFzZV9kZXZpY2Vfc3BhY2UoKToKLSAqCi0gKgotICovCi1zdGF0aWMgdm9pZCByZF9yZWxlYXNlX2RldmljZV9zcGFjZShzdHJ1Y3QgcmRfZGV2ICpyZF9kZXYpCitzdGF0aWMgdTMyIHJkX3JlbGVhc2Vfc2dsX3RhYmxlKHN0cnVjdCByZF9kZXYgKnJkX2Rldiwgc3RydWN0IHJkX2Rldl9zZ190YWJsZSAqc2dfdGFibGUsCisJCQkJIHUzMiBzZ190YWJsZV9jb3VudCkKIHsKLQl1MzIgaSwgaiwgcGFnZV9jb3VudCA9IDAsIHNnX3Blcl90YWJsZTsKLQlzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlICpzZ190YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1MzIgaSwgaiwgcGFnZV9jb3VudCA9IDAsIHNnX3Blcl90YWJsZTsKIAotCWlmICghcmRfZGV2LT5zZ190YWJsZV9hcnJheSB8fCAhcmRfZGV2LT5zZ190YWJsZV9jb3VudCkKLQkJcmV0dXJuOwotCi0Jc2dfdGFibGUgPSByZF9kZXYtPnNnX3RhYmxlX2FycmF5OwotCi0JZm9yIChpID0gMDsgaSA8IHJkX2Rldi0+c2dfdGFibGVfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzZ190YWJsZV9jb3VudDsgaSsrKSB7CiAJCXNnID0gc2dfdGFibGVbaV0uc2dfdGFibGU7CiAJCXNnX3Blcl90YWJsZSA9IHNnX3RhYmxlW2ldLnJkX3NnX2NvdW50OwogCkBAIC0xMDUsMTYgKzk2LDI4IEBACiAJCQkJcGFnZV9jb3VudCsrOwogCQkJfQogCQl9Ci0KIAkJa2ZyZWUoc2cpOwogCX0KIAorCWtmcmVlKHNnX3RhYmxlKTsKKwlyZXR1cm4gcGFnZV9jb3VudDsKK30KKworc3RhdGljIHZvaWQgcmRfcmVsZWFzZV9kZXZpY2Vfc3BhY2Uoc3RydWN0IHJkX2RldiAqcmRfZGV2KQoreworCXUzMiBwYWdlX2NvdW50OworCisJaWYgKCFyZF9kZXYtPnNnX3RhYmxlX2FycmF5IHx8ICFyZF9kZXYtPnNnX3RhYmxlX2NvdW50KQorCQlyZXR1cm47CisKKwlwYWdlX2NvdW50ID0gcmRfcmVsZWFzZV9zZ2xfdGFibGUocmRfZGV2LCByZF9kZXYtPnNnX3RhYmxlX2FycmF5LAorCQkJCQkgIHJkX2Rldi0+c2dfdGFibGVfY291bnQpOworCiAJcHJfZGVidWcoIkNPUkVfUkRbJXVdIC0gUmVsZWFzZWQgZGV2aWNlIHNwYWNlIGZvciBSYW1kaXNrIgogCQkiIERldmljZSBJRDogJXUsIHBhZ2VzICV1IGluICV1IHRhYmxlcyB0b3RhbCBieXRlcyAlbHVcbiIsCiAJCXJkX2Rldi0+cmRfaG9zdC0+cmRfaG9zdF9pZCwgcmRfZGV2LT5yZF9kZXZfaWQsIHBhZ2VfY291bnQsCiAJCXJkX2Rldi0+c2dfdGFibGVfY291bnQsICh1bnNpZ25lZCBsb25nKXBhZ2VfY291bnQgKiBQQUdFX1NJWkUpOwogCi0Ja2ZyZWUoc2dfdGFibGUpOwogCXJkX2Rldi0+c2dfdGFibGVfYXJyYXkgPSBOVUxMOwogCXJkX2Rldi0+c2dfdGFibGVfY291bnQgPSAwOwogfQpAQCAtMTI0LDM4ICsxMjcsMTUgQEAKICAqCiAgKgogICovCi1zdGF0aWMgaW50IHJkX2J1aWxkX2RldmljZV9zcGFjZShzdHJ1Y3QgcmRfZGV2ICpyZF9kZXYpCitzdGF0aWMgaW50IHJkX2FsbG9jYXRlX3NnbF90YWJsZShzdHJ1Y3QgcmRfZGV2ICpyZF9kZXYsIHN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnNnX3RhYmxlLAorCQkJCSB1MzIgdG90YWxfc2dfbmVlZGVkLCB1bnNpZ25lZCBjaGFyIGluaXRfcGF5bG9hZCkKIHsKLQl1MzIgaSA9IDAsIGosIHBhZ2Vfb2Zmc2V0ID0gMCwgc2dfcGVyX3RhYmxlLCBzZ190YWJsZXMsIHRvdGFsX3NnX25lZWRlZDsKKwl1MzIgaSA9IDAsIGosIHBhZ2Vfb2Zmc2V0ID0gMCwgc2dfcGVyX3RhYmxlOwogCXUzMiBtYXhfc2dfcGVyX3RhYmxlID0gKFJEX01BWF9BTExPQ0FUSU9OX1NJWkUgLwogCQkJCXNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKTsKLQlzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlICpzZ190YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQotCWlmIChyZF9kZXYtPnJkX3BhZ2VfY291bnQgPD0gMCkgewotCQlwcl9lcnIoIklsbGVnYWwgcGFnZSBjb3VudDogJXUgZm9yIFJhbWRpc2sgZGV2aWNlXG4iLAotCQkJcmRfZGV2LT5yZF9wYWdlX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogRG9uJ3QgbmVlZCBiYWNraW5nIHBhZ2VzIGZvciBOVUxMSU8gKi8KLQlpZiAocmRfZGV2LT5yZF9mbGFncyAmIFJERl9OVUxMSU8pCi0JCXJldHVybiAwOwotCi0JdG90YWxfc2dfbmVlZGVkID0gcmRfZGV2LT5yZF9wYWdlX2NvdW50OwotCi0Jc2dfdGFibGVzID0gKHRvdGFsX3NnX25lZWRlZCAvIG1heF9zZ19wZXJfdGFibGUpICsgMTsKLQotCXNnX3RhYmxlID0ga3phbGxvYyhzZ190YWJsZXMgKiBzaXplb2Yoc3RydWN0IHJkX2Rldl9zZ190YWJsZSksIEdGUF9LRVJORUwpOwotCWlmICghc2dfdGFibGUpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSYW1kaXNrIgotCQkJIiBzY2F0dGVybGlzdCB0YWJsZXNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZF9kZXYtPnNnX3RhYmxlX2FycmF5ID0gc2dfdGFibGU7Ci0JcmRfZGV2LT5zZ190YWJsZV9jb3VudCA9IHNnX3RhYmxlczsKKwl1bnNpZ25lZCBjaGFyICpwOwogCiAJd2hpbGUgKHRvdGFsX3NnX25lZWRlZCkgewogCQlzZ19wZXJfdGFibGUgPSAodG90YWxfc2dfbmVlZGVkID4gbWF4X3NnX3Blcl90YWJsZSkgPwpAQCAtMTg2LDE2ICsxNjYsMTE0IEBACiAJCQl9CiAJCQlzZ19hc3NpZ25fcGFnZSgmc2dbal0sIHBnKTsKIAkJCXNnW2pdLmxlbmd0aCA9IFBBR0VfU0laRTsKKworCQkJcCA9IGttYXAocGcpOworCQkJbWVtc2V0KHAsIGluaXRfcGF5bG9hZCwgUEFHRV9TSVpFKTsKKwkJCWt1bm1hcChwZyk7CiAJCX0KIAogCQlwYWdlX29mZnNldCArPSBzZ19wZXJfdGFibGU7CiAJCXRvdGFsX3NnX25lZWRlZCAtPSBzZ19wZXJfdGFibGU7CiAJfQogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmRfYnVpbGRfZGV2aWNlX3NwYWNlKHN0cnVjdCByZF9kZXYgKnJkX2RldikKK3sKKwlzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlICpzZ190YWJsZTsKKwl1MzIgc2dfdGFibGVzLCB0b3RhbF9zZ19uZWVkZWQ7CisJdTMyIG1heF9zZ19wZXJfdGFibGUgPSAoUkRfTUFYX0FMTE9DQVRJT05fU0laRSAvCisJCQkJc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkpOworCWludCByYzsKKworCWlmIChyZF9kZXYtPnJkX3BhZ2VfY291bnQgPD0gMCkgeworCQlwcl9lcnIoIklsbGVnYWwgcGFnZSBjb3VudDogJXUgZm9yIFJhbWRpc2sgZGV2aWNlXG4iLAorCQkgICAgICAgcmRfZGV2LT5yZF9wYWdlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRG9uJ3QgbmVlZCBiYWNraW5nIHBhZ2VzIGZvciBOVUxMSU8gKi8KKwlpZiAocmRfZGV2LT5yZF9mbGFncyAmIFJERl9OVUxMSU8pCisJCXJldHVybiAwOworCisJdG90YWxfc2dfbmVlZGVkID0gcmRfZGV2LT5yZF9wYWdlX2NvdW50OworCisJc2dfdGFibGVzID0gKHRvdGFsX3NnX25lZWRlZCAvIG1heF9zZ19wZXJfdGFibGUpICsgMTsKKworCXNnX3RhYmxlID0ga3phbGxvYyhzZ190YWJsZXMgKiBzaXplb2Yoc3RydWN0IHJkX2Rldl9zZ190YWJsZSksIEdGUF9LRVJORUwpOworCWlmICghc2dfdGFibGUpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSYW1kaXNrIgorCQkgICAgICAgIiBzY2F0dGVybGlzdCB0YWJsZXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZF9kZXYtPnNnX3RhYmxlX2FycmF5ID0gc2dfdGFibGU7CisJcmRfZGV2LT5zZ190YWJsZV9jb3VudCA9IHNnX3RhYmxlczsKKworCXJjID0gcmRfYWxsb2NhdGVfc2dsX3RhYmxlKHJkX2Rldiwgc2dfdGFibGUsIHRvdGFsX3NnX25lZWRlZCwgMHgwMCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKIAlwcl9kZWJ1ZygiQ09SRV9SRFsldV0gLSBCdWlsdCBSYW1kaXNrIERldmljZSBJRDogJXUgc3BhY2Ugb2YiCi0JCSIgJXUgcGFnZXMgaW4gJXUgdGFibGVzXG4iLCByZF9kZXYtPnJkX2hvc3QtPnJkX2hvc3RfaWQsCi0JCXJkX2Rldi0+cmRfZGV2X2lkLCByZF9kZXYtPnJkX3BhZ2VfY291bnQsCi0JCXJkX2Rldi0+c2dfdGFibGVfY291bnQpOworCQkgIiAldSBwYWdlcyBpbiAldSB0YWJsZXNcbiIsIHJkX2Rldi0+cmRfaG9zdC0+cmRfaG9zdF9pZCwKKwkJIHJkX2Rldi0+cmRfZGV2X2lkLCByZF9kZXYtPnJkX3BhZ2VfY291bnQsCisJCSByZF9kZXYtPnNnX3RhYmxlX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZF9yZWxlYXNlX3Byb3Rfc3BhY2Uoc3RydWN0IHJkX2RldiAqcmRfZGV2KQoreworCXUzMiBwYWdlX2NvdW50OworCisJaWYgKCFyZF9kZXYtPnNnX3Byb3RfYXJyYXkgfHwgIXJkX2Rldi0+c2dfcHJvdF9jb3VudCkKKwkJcmV0dXJuOworCisJcGFnZV9jb3VudCA9IHJkX3JlbGVhc2Vfc2dsX3RhYmxlKHJkX2RldiwgcmRfZGV2LT5zZ19wcm90X2FycmF5LAorCQkJCQkgIHJkX2Rldi0+c2dfcHJvdF9jb3VudCk7CisKKwlwcl9kZWJ1ZygiQ09SRV9SRFsldV0gLSBSZWxlYXNlZCBwcm90ZWN0aW9uIHNwYWNlIGZvciBSYW1kaXNrIgorCQkgIiBEZXZpY2UgSUQ6ICV1LCBwYWdlcyAldSBpbiAldSB0YWJsZXMgdG90YWwgYnl0ZXMgJWx1XG4iLAorCQkgcmRfZGV2LT5yZF9ob3N0LT5yZF9ob3N0X2lkLCByZF9kZXYtPnJkX2Rldl9pZCwgcGFnZV9jb3VudCwKKwkJIHJkX2Rldi0+c2dfdGFibGVfY291bnQsICh1bnNpZ25lZCBsb25nKXBhZ2VfY291bnQgKiBQQUdFX1NJWkUpOworCisJcmRfZGV2LT5zZ19wcm90X2FycmF5ID0gTlVMTDsKKwlyZF9kZXYtPnNnX3Byb3RfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IHJkX2J1aWxkX3Byb3Rfc3BhY2Uoc3RydWN0IHJkX2RldiAqcmRfZGV2LCBpbnQgcHJvdF9sZW5ndGgpCit7CisJc3RydWN0IHJkX2Rldl9zZ190YWJsZSAqc2dfdGFibGU7CisJdTMyIHRvdGFsX3NnX25lZWRlZCwgc2dfdGFibGVzOworCXUzMiBtYXhfc2dfcGVyX3RhYmxlID0gKFJEX01BWF9BTExPQ0FUSU9OX1NJWkUgLworCQkJCXNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKTsKKwlpbnQgcmM7CisKKwlpZiAocmRfZGV2LT5yZF9mbGFncyAmIFJERl9OVUxMSU8pCisJCXJldHVybiAwOworCisJdG90YWxfc2dfbmVlZGVkID0gcmRfZGV2LT5yZF9wYWdlX2NvdW50IC8gcHJvdF9sZW5ndGg7CisKKwlzZ190YWJsZXMgPSAodG90YWxfc2dfbmVlZGVkIC8gbWF4X3NnX3Blcl90YWJsZSkgKyAxOworCisJc2dfdGFibGUgPSBremFsbG9jKHNnX3RhYmxlcyAqIHNpemVvZihzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZ190YWJsZSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJhbWRpc2sgcHJvdGVjdGlvbiIKKwkJICAgICAgICIgc2NhdHRlcmxpc3QgdGFibGVzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmRfZGV2LT5zZ19wcm90X2FycmF5ID0gc2dfdGFibGU7CisJcmRfZGV2LT5zZ19wcm90X2NvdW50ID0gc2dfdGFibGVzOworCisJcmMgPSByZF9hbGxvY2F0ZV9zZ2xfdGFibGUocmRfZGV2LCBzZ190YWJsZSwgdG90YWxfc2dfbmVlZGVkLCAweGZmKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXByX2RlYnVnKCJDT1JFX1JEWyV1XSAtIEJ1aWx0IFJhbWRpc2sgRGV2aWNlIElEOiAldSBwcm90IHNwYWNlIG9mIgorCQkgIiAldSBwYWdlcyBpbiAldSB0YWJsZXNcbiIsIHJkX2Rldi0+cmRfaG9zdC0+cmRfaG9zdF9pZCwKKwkJIHJkX2Rldi0+cmRfZGV2X2lkLCB0b3RhbF9zZ19uZWVkZWQsIHJkX2Rldi0+c2dfcHJvdF9jb3VudCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3OCw2ICszNTYsMjYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnJkX2dldF9wcm90X3RhYmxlKHN0cnVjdCByZF9kZXYgKnJkX2RldiwgdTMyIHBhZ2UpCit7CisJc3RydWN0IHJkX2Rldl9zZ190YWJsZSAqc2dfdGFibGU7CisJdTMyIGksIHNnX3Blcl90YWJsZSA9IChSRF9NQVhfQUxMT0NBVElPTl9TSVpFIC8KKwkJCQlzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSk7CisKKwlpID0gcGFnZSAvIHNnX3Blcl90YWJsZTsKKwlpZiAoaSA8IHJkX2Rldi0+c2dfcHJvdF9jb3VudCkgeworCQlzZ190YWJsZSA9ICZyZF9kZXYtPnNnX3Byb3RfYXJyYXlbaV07CisJCWlmICgoc2dfdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0IDw9IHBhZ2UpICYmCisJCSAgICAgKHNnX3RhYmxlLT5wYWdlX2VuZF9vZmZzZXQgPj0gcGFnZSkpCisJCQlyZXR1cm4gc2dfdGFibGU7CisJfQorCisJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBwcm90IHJkX2Rldl9zZ190YWJsZSBmb3IgcGFnZTogJXVcbiIsCisJCQlwYWdlKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc2Vuc2VfcmVhc29uX3QKIHJkX2V4ZWN1dGVfcncoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdTMyIHNnbF9uZW50cywKIAkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkYXRhX2RpcmVjdGlvbikKQEAgLTI5Miw2ICszOTAsNyBAQAogCXUzMiByZF9wYWdlOwogCXUzMiBzcmNfbGVuOwogCXU2NCB0bXA7CisJc2Vuc2VfcmVhc29uX3QgcmM7CiAKIAlpZiAoZGV2LT5yZF9mbGFncyAmIFJERl9OVUxMSU8pIHsKIAkJdGFyZ2V0X2NvbXBsZXRlX2NtZChjbWQsIFNBTV9TVEFUX0dPT0QpOwpAQCAtMzE0LDYgKzQxMywyOCBAQAogCQkJZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFID8gIlJlYWQiIDogIldyaXRlIiwKIAkJCWNtZC0+dF90YXNrX2xiYSwgcmRfc2l6ZSwgcmRfcGFnZSwgcmRfb2Zmc2V0KTsKIAorCWlmIChjbWQtPnByb3RfdHlwZSAmJiBkYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnByb3RfdGFibGU7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqcHJvdF9zZzsKKwkJdTMyIHNlY3RvcnMgPSBjbWQtPmRhdGFfbGVuZ3RoIC8gc2VfZGV2LT5kZXZfYXR0cmliLmJsb2NrX3NpemU7CisJCXUzMiBwcm90X29mZnNldCwgcHJvdF9wYWdlOworCisJCXRtcCA9IGNtZC0+dF90YXNrX2xiYSAqIHNlX2Rldi0+cHJvdF9sZW5ndGg7CisJCXByb3Rfb2Zmc2V0ID0gZG9fZGl2KHRtcCwgUEFHRV9TSVpFKTsKKwkJcHJvdF9wYWdlID0gdG1wOworCisJCXByb3RfdGFibGUgPSByZF9nZXRfcHJvdF90YWJsZShkZXYsIHByb3RfcGFnZSk7CisJCWlmICghcHJvdF90YWJsZSkKKwkJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKworCQlwcm90X3NnID0gJnByb3RfdGFibGUtPnNnX3RhYmxlW3Byb3RfcGFnZSAtIHByb3RfdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKKworCQlyYyA9IHNiY19kaWZfdmVyaWZ5X3dyaXRlKGNtZCwgY21kLT50X3Rhc2tfbGJhLCBzZWN0b3JzLCAwLAorCQkJCQkgIHByb3Rfc2csIHByb3Rfb2Zmc2V0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKwogCXNyY19sZW4gPSBQQUdFX1NJWkUgLSByZF9vZmZzZXQ7CiAJc2dfbWl0ZXJfc3RhcnQoJm0sIHNnbCwgc2dsX25lbnRzLAogCQkJZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFID8KQEAgLTM3NSw2ICs0OTYsMjggQEAKIAl9CiAJc2dfbWl0ZXJfc3RvcCgmbSk7CiAKKwlpZiAoY21kLT5wcm90X3R5cGUgJiYgZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnByb3RfdGFibGU7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqcHJvdF9zZzsKKwkJdTMyIHNlY3RvcnMgPSBjbWQtPmRhdGFfbGVuZ3RoIC8gc2VfZGV2LT5kZXZfYXR0cmliLmJsb2NrX3NpemU7CisJCXUzMiBwcm90X29mZnNldCwgcHJvdF9wYWdlOworCisJCXRtcCA9IGNtZC0+dF90YXNrX2xiYSAqIHNlX2Rldi0+cHJvdF9sZW5ndGg7CisJCXByb3Rfb2Zmc2V0ID0gZG9fZGl2KHRtcCwgUEFHRV9TSVpFKTsKKwkJcHJvdF9wYWdlID0gdG1wOworCisJCXByb3RfdGFibGUgPSByZF9nZXRfcHJvdF90YWJsZShkZXYsIHByb3RfcGFnZSk7CisJCWlmICghcHJvdF90YWJsZSkKKwkJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKworCQlwcm90X3NnID0gJnByb3RfdGFibGUtPnNnX3RhYmxlW3Byb3RfcGFnZSAtIHByb3RfdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKKworCQlyYyA9IHNiY19kaWZfdmVyaWZ5X3JlYWQoY21kLCBjbWQtPnRfdGFza19sYmEsIHNlY3RvcnMsIDAsCisJCQkJCSBwcm90X3NnLCBwcm90X29mZnNldCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKIAl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgU0FNX1NUQVRfR09PRCk7CiAJcmV0dXJuIDA7CiB9CkBAIC00NTYsNiArNTk5LDIzIEBACiAJcmV0dXJuIGJsb2Nrc19sb25nOwogfQogCitzdGF0aWMgaW50IHJkX2luaXRfcHJvdChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJkX2RldiAqcmRfZGV2ID0gUkRfREVWKGRldik7CisKKyAgICAgICAgaWYgKCFkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlKQorCQlyZXR1cm4gMDsKKworCXJldHVybiByZF9idWlsZF9wcm90X3NwYWNlKHJkX2RldiwgZGV2LT5wcm90X2xlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHJkX2ZyZWVfcHJvdChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJkX2RldiAqcmRfZGV2ID0gUkRfREVWKGRldik7CisKKwlyZF9yZWxlYXNlX3Byb3Rfc3BhY2UocmRfZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCBzYmNfb3BzIHJkX3NiY19vcHMgPSB7CiAJLmV4ZWN1dGVfcncJCT0gcmRfZXhlY3V0ZV9ydywKIH07CkBAIC00ODEsNiArNjQxLDggQEAKIAkuc2hvd19jb25maWdmc19kZXZfcGFyYW1zID0gcmRfc2hvd19jb25maWdmc19kZXZfcGFyYW1zLAogCS5nZXRfZGV2aWNlX3R5cGUJPSBzYmNfZ2V0X2RldmljZV90eXBlLAogCS5nZXRfYmxvY2tzCQk9IHJkX2dldF9ibG9ja3MsCisJLmluaXRfcHJvdAkJPSByZF9pbml0X3Byb3QsCisJLmZyZWVfcHJvdAkJPSByZF9mcmVlX3Byb3QsCiB9OwogCiBpbnQgX19pbml0IHJkX21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuaAppbmRleCAxNzg5ZDFlLi5jYzQ2YTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmgKQEAgLTMzLDggKzMzLDEyIEBACiAJdTMyCQlyZF9wYWdlX2NvdW50OwogCS8qIE51bWJlciBvZiBTRyB0YWJsZXMgaW4gc2dfdGFibGVfYXJyYXkgKi8KIAl1MzIJCXNnX3RhYmxlX2NvdW50OworCS8qIE51bWJlciBvZiBTRyB0YWJsZXMgaW4gc2dfcHJvdF9hcnJheSAqLworCXUzMgkJc2dfcHJvdF9jb3VudDsKIAkvKiBBcnJheSBvZiByZF9kZXZfc2dfdGFibGVfdCBjb250YWluaW5nIHNjYXR0ZXJsaXN0cyAqLwogCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnNnX3RhYmxlX2FycmF5OworCS8qIEFycmF5IG9mIHJkX2Rldl9zZ190YWJsZSBjb250YWluaW5nIHByb3RlY3Rpb24gc2NhdHRlcmxpc3RzICovCisJc3RydWN0IHJkX2Rldl9zZ190YWJsZSAqc2dfcHJvdF9hcnJheTsKIAkvKiBSYW1kaXNrIEhCQSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvICovCiAJc3RydWN0IHJkX2hvc3QgKnJkX2hvc3Q7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NiYy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2JjLmMKaW5kZXggNTJhZTU0ZS4uZmEzY2FlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2JjLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2JjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtdDEwZGlmLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KQEAgLTMzLDcgKzM0LDcgQEAKIAogI2luY2x1ZGUgInRhcmdldF9jb3JlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfdWEuaCIKLQorI2luY2x1ZGUgInRhcmdldF9jb3JlX2FsdWEuaCIKIAogc3RhdGljIHNlbnNlX3JlYXNvbl90CiBzYmNfZW11bGF0ZV9yZWFkY2FwYWNpdHkoc3RydWN0IHNlX2NtZCAqY21kKQpAQCAtMTA1LDYgKzEwNiwxMSBAQAogCWJ1Zls5XSA9IChkZXYtPmRldl9hdHRyaWIuYmxvY2tfc2l6ZSA+PiAxNikgJiAweGZmOwogCWJ1ZlsxMF0gPSAoZGV2LT5kZXZfYXR0cmliLmJsb2NrX3NpemUgPj4gOCkgJiAweGZmOwogCWJ1ZlsxMV0gPSBkZXYtPmRldl9hdHRyaWIuYmxvY2tfc2l6ZSAmIDB4ZmY7CisJLyoKKwkgKiBTZXQgUF9UWVBFIGFuZCBQUk9UX0VOIGJpdHMgZm9yIERJRiBzdXBwb3J0CisJICovCisJaWYgKGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUpCisJCWJ1ZlsxMl0gPSAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSAtIDEpIDw8IDEgfCAweDE7CiAKIAlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF9sYnBwYmUpCiAJCWJ1ZlsxM10gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2xicHBiZShkZXYpICYgMHgwZjsKQEAgLTU2Myw2ICs1NjksNDQgQEAKIAlyZXR1cm4gVENNX05PX1NFTlNFOwogfQogCitzdGF0aWMgYm9vbAorc2JjX2NoZWNrX3Byb3Qoc3RydWN0IHNlX2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmNkYiwKKwkgICAgICAgdTMyIHNlY3RvcnMpCit7CisJaWYgKCFjbWQtPnRfcHJvdF9zZyB8fCAhY21kLT50X3Byb3RfbmVudHMpCisJCXJldHVybiB0cnVlOworCisJc3dpdGNoIChkZXYtPmRldl9hdHRyaWIucGlfcHJvdF90eXBlKSB7CisJY2FzZSBUQVJHRVRfRElGX1RZUEUzX1BST1Q6CisJCWlmICghKGNkYlsxXSAmIDB4ZTApKQorCQkJcmV0dXJuIHRydWU7CisKKwkJY21kLT5yZWZ0YWdfc2VlZCA9IDB4ZmZmZmZmZmY7CisJCWJyZWFrOworCWNhc2UgVEFSR0VUX0RJRl9UWVBFMl9QUk9UOgorCQlpZiAoY2RiWzFdICYgMHhlMCkKKwkJCXJldHVybiBmYWxzZTsKKworCQljbWQtPnJlZnRhZ19zZWVkID0gY21kLT50X3Rhc2tfbGJhOworCQlicmVhazsKKwljYXNlIFRBUkdFVF9ESUZfVFlQRTFfUFJPVDoKKwkJaWYgKCEoY2RiWzFdICYgMHhlMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQljbWQtPnJlZnRhZ19zZWVkID0gY21kLT50X3Rhc2tfbGJhOworCQlicmVhazsKKwljYXNlIFRBUkdFVF9ESUZfVFlQRTBfUFJPVDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwljbWQtPnByb3RfdHlwZSA9IGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGU7CisJY21kLT5wcm90X2xlbmd0aCA9IGRldi0+cHJvdF9sZW5ndGggKiBzZWN0b3JzOworCWNtZC0+cHJvdF9oYW5kb3ZlciA9IFBST1RfU0VQRVJBVEVEOworCisJcmV0dXJuIHRydWU7Cit9CisKIHNlbnNlX3JlYXNvbl90CiBzYmNfcGFyc2VfY2RiKHN0cnVjdCBzZV9jbWQgKmNtZCwgc3RydWN0IHNiY19vcHMgKm9wcykKIHsKQEAgLTU4Myw2ICs2MjcsMTAgQEAKIAljYXNlIFJFQURfMTA6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTAoY2RiKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOworCisJCWlmICghc2JjX2NoZWNrX3Byb3QoZGV2LCBjbWQsIGNkYiwgc2VjdG9ycykpCisJCQlyZXR1cm4gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfQ0RCOwogCQljbWQtPmV4ZWN1dGVfcncgPSBvcHMtPmV4ZWN1dGVfcnc7CiAJCWNtZC0+ZXhlY3V0ZV9jbWQgPSBzYmNfZXhlY3V0ZV9ydzsKQEAgLTU5MCw2ICs2MzgsMTAgQEAKIAljYXNlIFJFQURfMTI6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTIoY2RiKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOworCisJCWlmICghc2JjX2NoZWNrX3Byb3QoZGV2LCBjbWQsIGNkYiwgc2VjdG9ycykpCisJCQlyZXR1cm4gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfQ0RCOwogCQljbWQtPmV4ZWN1dGVfcncgPSBvcHMtPmV4ZWN1dGVfcnc7CiAJCWNtZC0+ZXhlY3V0ZV9jbWQgPSBzYmNfZXhlY3V0ZV9ydzsKQEAgLTU5Nyw2ICs2NDksMTAgQEAKIAljYXNlIFJFQURfMTY6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTYoY2RiKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOworCisJCWlmICghc2JjX2NoZWNrX3Byb3QoZGV2LCBjbWQsIGNkYiwgc2VjdG9ycykpCisJCQlyZXR1cm4gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfQ0RCOwogCQljbWQtPmV4ZWN1dGVfcncgPSBvcHMtPmV4ZWN1dGVfcnc7CiAJCWNtZC0+ZXhlY3V0ZV9jbWQgPSBzYmNfZXhlY3V0ZV9ydzsKQEAgLTYxMiw2ICs2NjgsMTAgQEAKIAljYXNlIFdSSVRFX1ZFUklGWToKIAkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xMChjZGIpOwogCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzMyKGNkYik7CisKKwkJaWYgKCFzYmNfY2hlY2tfcHJvdChkZXYsIGNtZCwgY2RiLCBzZWN0b3JzKSkKKwkJCXJldHVybiBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CisKIAkJaWYgKGNkYlsxXSAmIDB4OCkKIAkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9GVUE7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfQ0RCOwpAQCAtNjIxLDYgKzY4MSwxMCBAQAogCWNhc2UgV1JJVEVfMTI6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTIoY2RiKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOworCisJCWlmICghc2JjX2NoZWNrX3Byb3QoZGV2LCBjbWQsIGNkYiwgc2VjdG9ycykpCisJCQlyZXR1cm4gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCiAJCWlmIChjZGJbMV0gJiAweDgpCiAJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfRlVBOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX0NEQjsKQEAgLTYzMCw2ICs2OTQsMTAgQEAKIAljYXNlIFdSSVRFXzE2OgogCQlzZWN0b3JzID0gdHJhbnNwb3J0X2dldF9zZWN0b3JzXzE2KGNkYik7CiAJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfNjQoY2RiKTsKKworCQlpZiAoIXNiY19jaGVja19wcm90KGRldiwgY21kLCBjZGIsIHNlY3RvcnMpKQorCQkJcmV0dXJuIFRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKKwogCQlpZiAoY2RiWzFdICYgMHg4KQogCQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX0ZVQTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfREFUQV9DREI7CkBAIC03MzEsNiArNzk5LDkgQEAKIAkJY2FzZSBTQUlfUkVBRF9DQVBBQ0lUWV8xNjoKIAkJCWNtZC0+ZXhlY3V0ZV9jbWQgPSBzYmNfZW11bGF0ZV9yZWFkY2FwYWNpdHlfMTY7CiAJCQlicmVhazsKKwkJY2FzZSBTQUlfUkVQT1JUX1JFRkVSUkFMUzoKKwkJCWNtZC0+ZXhlY3V0ZV9jbWQgPSB0YXJnZXRfZW11bGF0ZV9yZXBvcnRfcmVmZXJyYWxzOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcl9lcnIoIlVuc3VwcG9ydGVkIFNBOiAweCUwMnhcbiIsCiAJCQkJY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZik7CkBAIC05NTksMyArMTAzMCwxODIgQEAKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChzYmNfZXhlY3V0ZV91bm1hcCk7CisKK3N0YXRpYyBzZW5zZV9yZWFzb25fdAorc2JjX2RpZl92MV92ZXJpZnkoc3RydWN0IHNlX2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2VfZGlmX3YxX3R1cGxlICpzZHQsCisJCSAgY29uc3Qgdm9pZCAqcCwgc2VjdG9yX3Qgc2VjdG9yLCB1bnNpZ25lZCBpbnQgZWlfbGJhKQoreworCWludCBibG9ja19zaXplID0gZGV2LT5kZXZfYXR0cmliLmJsb2NrX3NpemU7CisJX19iZTE2IGNzdW07CisKKwljc3VtID0gY3B1X3RvX2JlMTYoY3JjX3QxMGRpZihwLCBibG9ja19zaXplKSk7CisKKwlpZiAoc2R0LT5ndWFyZF90YWcgIT0gY3N1bSkgeworCQlwcl9lcnIoIkRJRnYxIGNoZWNrc3VtIGZhaWxlZCBvbiBzZWN0b3IgJWxsdSBndWFyZCB0YWcgMHglMDR4IgorCQkJIiBjc3VtIDB4JTA0eFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsCisJCQliZTE2X3RvX2NwdShzZHQtPmd1YXJkX3RhZyksIGJlMTZfdG9fY3B1KGNzdW0pKTsKKwkJcmV0dXJuIFRDTV9MT0dJQ0FMX0JMT0NLX0dVQVJEX0NIRUNLX0ZBSUxFRDsKKwl9CisKKwlpZiAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSA9PSBUQVJHRVRfRElGX1RZUEUxX1BST1QgJiYKKwkgICAgYmUzMl90b19jcHUoc2R0LT5yZWZfdGFnKSAhPSAoc2VjdG9yICYgMHhmZmZmZmZmZikpIHsKKwkJcHJfZXJyKCJESUZ2MSBUeXBlIDEgcmVmZXJlbmNlIGZhaWxlZCBvbiBzZWN0b3I6ICVsbHUgdGFnOiAweCUwOHgiCisJCSAgICAgICAiIHNlY3RvciBNU0I6IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsCisJCSAgICAgICBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpLCAodTMyKShzZWN0b3IgJiAweGZmZmZmZmZmKSk7CisJCXJldHVybiBUQ01fTE9HSUNBTF9CTE9DS19SRUZfVEFHX0NIRUNLX0ZBSUxFRDsKKwl9CisKKwlpZiAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSA9PSBUQVJHRVRfRElGX1RZUEUyX1BST1QgJiYKKwkgICAgYmUzMl90b19jcHUoc2R0LT5yZWZfdGFnKSAhPSBlaV9sYmEpIHsKKwkJcHJfZXJyKCJESUZ2MSBUeXBlIDIgcmVmZXJlbmNlIGZhaWxlZCBvbiBzZWN0b3I6ICVsbHUgdGFnOiAweCUwOHgiCisJCSAgICAgICAiIGVpX2xiYTogMHglMDh4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwKKwkJCWJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZyksIGVpX2xiYSk7CisJCXJldHVybiBUQ01fTE9HSUNBTF9CTE9DS19SRUZfVEFHX0NIRUNLX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NiY19kaWZfY29weV9wcm90KHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgaW50IHNlY3RvcnMsIGJvb2wgcmVhZCwKKwkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc2dfb2ZmKQoreworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBzY2F0dGVybGlzdCAqcHNnOworCXZvaWQgKnBhZGRyLCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgaSwgbGVuLCBsZWZ0OworCisJbGVmdCA9IHNlY3RvcnMgKiBkZXYtPnByb3RfbGVuZ3RoOworCisJZm9yX2VhY2hfc2coY21kLT50X3Byb3Rfc2csIHBzZywgY21kLT50X3Byb3RfbmVudHMsIGkpIHsKKworCQlsZW4gPSBtaW4ocHNnLT5sZW5ndGgsIGxlZnQpOworCQlwYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UocHNnKSkgKyBwc2ctPm9mZnNldDsKKwkJYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpKSArIHNnX29mZjsKKworCQlpZiAocmVhZCkKKwkJCW1lbWNweShwYWRkciwgYWRkciwgbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KGFkZHIsIHBhZGRyLCBsZW4pOworCisJCWxlZnQgLT0gbGVuOworCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKKwkJa3VubWFwX2F0b21pYyhhZGRyKTsKKwl9Cit9CisKK3NlbnNlX3JlYXNvbl90CitzYmNfZGlmX3ZlcmlmeV93cml0ZShzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IHN0YXJ0LCB1bnNpZ25lZCBpbnQgc2VjdG9ycywKKwkJICAgICB1bnNpZ25lZCBpbnQgZWlfbGJhLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc2dfb2ZmKQoreworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBzZV9kaWZfdjFfdHVwbGUgKnNkdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzZywgKnBzZyA9IGNtZC0+dF9wcm90X3NnOworCXNlY3Rvcl90IHNlY3RvciA9IHN0YXJ0OworCXZvaWQgKmRhZGRyLCAqcGFkZHI7CisJaW50IGksIGosIG9mZnNldCA9IDA7CisJc2Vuc2VfcmVhc29uX3QgcmM7CisKKwlmb3JfZWFjaF9zZyhjbWQtPnRfZGF0YV9zZywgZHNnLCBjbWQtPnRfZGF0YV9uZW50cywgaSkgeworCQlkYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UoZHNnKSkgKyBkc2ctPm9mZnNldDsKKwkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHBzZykpICsgcHNnLT5vZmZzZXQ7CisKKwkJZm9yIChqID0gMDsgaiA8IGRzZy0+bGVuZ3RoOyBqICs9IGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplKSB7CisKKwkJCWlmIChvZmZzZXQgPj0gcHNnLT5sZW5ndGgpIHsKKwkJCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKKwkJCQlwc2cgPSBzZ19uZXh0KHBzZyk7CisJCQkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHBzZykpICsgcHNnLT5vZmZzZXQ7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0KKworCQkJc2R0ID0gcGFkZHIgKyBvZmZzZXQ7CisKKwkJCXByX2RlYnVnKCJESUYgV1JJVEUgc2VjdG9yOiAlbGx1IGd1YXJkX3RhZzogMHglMDR4IgorCQkJCSAiIGFwcF90YWc6IDB4JTA0eCByZWZfdGFnOiAldVxuIiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNkdC0+Z3VhcmRfdGFnLAorCQkJCSBzZHQtPmFwcF90YWcsIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykpOworCisJCQlyYyA9IHNiY19kaWZfdjFfdmVyaWZ5KGRldiwgc2R0LCBkYWRkciArIGosIHNlY3RvciwKKwkJCQkJICAgICAgIGVpX2xiYSk7CisJCQlpZiAocmMpIHsKKwkJCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKKwkJCQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwkJCQljbWQtPmJhZF9zZWN0b3IgPSBzZWN0b3I7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCisJCQlzZWN0b3IrKzsKKwkJCWVpX2xiYSsrOworCQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc2VfZGlmX3YxX3R1cGxlKTsKKwkJfQorCisJCWt1bm1hcF9hdG9taWMocGFkZHIpOworCQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwl9CisJc2JjX2RpZl9jb3B5X3Byb3QoY21kLCBzZWN0b3JzLCBmYWxzZSwgc2csIHNnX29mZik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc2JjX2RpZl92ZXJpZnlfd3JpdGUpOworCitzZW5zZV9yZWFzb25fdAorc2JjX2RpZl92ZXJpZnlfcmVhZChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IHN0YXJ0LCB1bnNpZ25lZCBpbnQgc2VjdG9ycywKKwkJICAgIHVuc2lnbmVkIGludCBlaV9sYmEsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzZ19vZmYpCit7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHNlX2RpZl92MV90dXBsZSAqc2R0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqZHNnOworCXNlY3Rvcl90IHNlY3RvciA9IHN0YXJ0OworCXZvaWQgKmRhZGRyLCAqcGFkZHI7CisJaW50IGksIGosIG9mZnNldCA9IHNnX29mZjsKKwlzZW5zZV9yZWFzb25fdCByYzsKKworCWZvcl9lYWNoX3NnKGNtZC0+dF9kYXRhX3NnLCBkc2csIGNtZC0+dF9kYXRhX25lbnRzLCBpKSB7CisJCWRhZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShkc2cpKSArIGRzZy0+b2Zmc2V0OworCQlwYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQ7CisKKwkJZm9yIChqID0gMDsgaiA8IGRzZy0+bGVuZ3RoOyBqICs9IGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplKSB7CisKKwkJCWlmIChvZmZzZXQgPj0gc2ctPmxlbmd0aCkgeworCQkJCWt1bm1hcF9hdG9taWMocGFkZHIpOworCQkJCXNnID0gc2dfbmV4dChzZyk7CisJCQkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0OworCQkJCW9mZnNldCA9IDA7CisJCQl9CisKKwkJCXNkdCA9IHBhZGRyICsgb2Zmc2V0OworCisJCQlwcl9kZWJ1ZygiRElGIFJFQUQgc2VjdG9yOiAlbGx1IGd1YXJkX3RhZzogMHglMDR4IgorCQkJCSAiIGFwcF90YWc6IDB4JTA0eCByZWZfdGFnOiAldVxuIiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNkdC0+Z3VhcmRfdGFnLAorCQkJCSBzZHQtPmFwcF90YWcsIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykpOworCisJCQlpZiAoc2R0LT5hcHBfdGFnID09IGNwdV90b19iZTE2KDB4ZmZmZikpIHsKKwkJCQlzZWN0b3IrKzsKKwkJCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBzZV9kaWZfdjFfdHVwbGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyYyA9IHNiY19kaWZfdjFfdmVyaWZ5KGRldiwgc2R0LCBkYWRkciArIGosIHNlY3RvciwKKwkJCQkJICAgICAgIGVpX2xiYSk7CisJCQlpZiAocmMpIHsKKwkJCQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKKwkJCQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwkJCQljbWQtPmJhZF9zZWN0b3IgPSBzZWN0b3I7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCisJCQlzZWN0b3IrKzsKKwkJCWVpX2xiYSsrOworCQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc2VfZGlmX3YxX3R1cGxlKTsKKwkJfQorCisJCWt1bm1hcF9hdG9taWMocGFkZHIpOworCQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwl9CisJc2JjX2RpZl9jb3B5X3Byb3QoY21kLCBzZWN0b3JzLCB0cnVlLCBzZywgc2dfb2ZmKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzYmNfZGlmX3ZlcmlmeV9yZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3BjLmMKaW5kZXggMDIxYzNmNC4uNDNjNWNhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jCkBAIC0xMDAsNiArMTAwLDExIEBACiAJICovCiAJaWYgKGRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlXzNwYykKIAkJYnVmWzVdIHw9IDB4ODsKKwkvKgorCSAqIFNldCBQcm90ZWN0aW9uIChQUk9URUNUKSBiaXQgd2hlbiBESUYgaGFzIGJlZW4gZW5hYmxlZC4KKwkgKi8KKwlpZiAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSkKKwkJYnVmWzVdIHw9IDB4MTsKIAogCWJ1Zls3XSA9IDB4MjsgLyogQ21kUXVlPTEgKi8KIApAQCAtMjY3LDcgKzI3Miw3IEBACiAJcG9ydCA9IGx1bi0+bHVuX3NlcDsKIAlpZiAocG9ydCkgewogCQlzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKmx1X2dwOwotCQl1MzIgcGFkZGluZywgc2NzaV9uYW1lX2xlbjsKKwkJdTMyIHBhZGRpbmcsIHNjc2lfbmFtZV9sZW4sIHNjc2lfdGFyZ2V0X2xlbjsKIAkJdTE2IGx1X2dwX2lkID0gMDsKIAkJdTE2IHRnX3B0X2dwX2lkID0gMDsKIAkJdTE2IHRwZ3Q7CkBAIC0zNjUsMTYgKzM3MCw2IEBACiAJCSAqIHNlY3Rpb24gNy41LjEgVGFibGUgMzYyCiAJCSAqLwogY2hlY2tfc2NzaV9uYW1lOgotCQlzY3NpX25hbWVfbGVuID0gc3RybGVuKHRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF93d24odHBnKSk7Ci0JCS8qIFVURi04ICIsdCwweDwxNi1iaXQgVFBHVD4iICsgTlVMTCBUZXJtaW5hdG9yICovCi0JCXNjc2lfbmFtZV9sZW4gKz0gMTA7Ci0JCS8qIENoZWNrIGZvciA0LWJ5dGUgcGFkZGluZyAqLwotCQlwYWRkaW5nID0gKCgtc2NzaV9uYW1lX2xlbikgJiAzKTsKLQkJaWYgKHBhZGRpbmcgIT0gMCkKLQkJCXNjc2lfbmFtZV9sZW4gKz0gcGFkZGluZzsKLQkJLyogSGVhZGVyIHNpemUgKyBEZXNpZ25hdGlvbiBkZXNjcmlwdG9yICovCi0JCXNjc2lfbmFtZV9sZW4gKz0gNDsKLQogCQlidWZbb2ZmXSA9CiAJCQkodHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX3Byb3RvX2lkZW50KHRwZykgPDwgNCk7CiAJCWJ1ZltvZmYrK10gfD0gMHgzOyAvKiBDT0RFIFNFVCA9PSBVVEYtOCAqLwpAQCAtNDAyLDEzICszOTcsNTcgQEAKIAkJICogc2hhbGwgYmUgbm8gbGFyZ2VyIHRoYW4gMjU2IGFuZCBzaGFsbCBiZSBhIG11bHRpcGxlCiAJCSAqIG9mIGZvdXIuCiAJCSAqLworCQlwYWRkaW5nID0gKCgtc2NzaV9uYW1lX2xlbikgJiAzKTsKIAkJaWYgKHBhZGRpbmcpCiAJCQlzY3NpX25hbWVfbGVuICs9IHBhZGRpbmc7CisJCWlmIChzY3NpX25hbWVfbGVuID4gMjU2KQorCQkJc2NzaV9uYW1lX2xlbiA9IDI1NjsKIAogCQlidWZbb2ZmLTFdID0gc2NzaV9uYW1lX2xlbjsKIAkJb2ZmICs9IHNjc2lfbmFtZV9sZW47CiAJCS8qIEhlYWRlciBzaXplICsgRGVzaWduYXRpb24gZGVzY3JpcHRvciAqLwogCQlsZW4gKz0gKHNjc2lfbmFtZV9sZW4gKyA0KTsKKworCQkvKgorCQkgKiBUYXJnZXQgZGV2aWNlIGRlc2lnbmF0b3IKKwkJICovCisJCWJ1ZltvZmZdID0KKwkJCSh0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKKwkJYnVmW29mZisrXSB8PSAweDM7IC8qIENPREUgU0VUID09IFVURi04ICovCisJCWJ1ZltvZmZdID0gMHg4MDsgLyogU2V0IFBJVj0xICovCisJCS8qIFNldCBBU1NPQ0lBVElPTiA9PSB0YXJnZXQgZGV2aWNlOiAxMGIgKi8KKwkJYnVmW29mZl0gfD0gMHgyMDsKKwkJLyogREVTSUdOQVRPUiBUWVBFID09IFNDU0kgbmFtZSBzdHJpbmcgKi8KKwkJYnVmW29mZisrXSB8PSAweDg7CisJCW9mZiArPSAyOyAvKiBTa2lwIG92ZXIgUmVzZXJ2ZWQgYW5kIGxlbmd0aCAqLworCQkvKgorCQkgKiBTQ1NJIG5hbWUgc3RyaW5nIGlkZW50aWZlciBjb250YWluaW5nLCAkRkFCUklDX01PRAorCQkgKiBkZXBlbmRlbnQgaW5mb3JtYXRpb24uICBGb3IgTElPLVRhcmdldCBhbmQgaVNDU0kKKwkJICogVGFyZ2V0IFBvcnQsIHRoaXMgbWVhbnMgIjxpU0NTSSBuYW1lPiIgaW4KKwkJICogVVRGLTggZW5jb2RpbmcuCisJCSAqLworCQlzY3NpX3RhcmdldF9sZW4gPSBzcHJpbnRmKCZidWZbb2ZmXSwgIiVzIiwKKwkJCQkJICB0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZykpOworCQlzY3NpX3RhcmdldF9sZW4gKz0gMSAvKiBJbmNsdWRlICBOVUxMIHRlcm1pbmF0b3IgKi87CisJCS8qCisJCSAqIFRoZSBudWxsLXRlcm1pbmF0ZWQsIG51bGwtcGFkZGVkIChzZWUgNC40LjIpIFNDU0kKKwkJICogTkFNRSBTVFJJTkcgZmllbGQgY29udGFpbnMgYSBVVEYtOCBmb3JtYXQgc3RyaW5nLgorCQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBTQ1NJIE5BTUUgU1RSSU5HIGZpZWxkCisJCSAqIChpLmUuLCB0aGUgdmFsdWUgaW4gdGhlIERFU0lHTkFUT1IgTEVOR1RIIGZpZWxkKQorCQkgKiBzaGFsbCBiZSBubyBsYXJnZXIgdGhhbiAyNTYgYW5kIHNoYWxsIGJlIGEgbXVsdGlwbGUKKwkJICogb2YgZm91ci4KKwkJICovCisJCXBhZGRpbmcgPSAoKC1zY3NpX3RhcmdldF9sZW4pICYgMyk7CisJCWlmIChwYWRkaW5nKQorCQkJc2NzaV90YXJnZXRfbGVuICs9IHBhZGRpbmc7CisJCWlmIChzY3NpX25hbWVfbGVuID4gMjU2KQorCQkJc2NzaV9uYW1lX2xlbiA9IDI1NjsKKworCQlidWZbb2ZmLTFdID0gc2NzaV90YXJnZXRfbGVuOworCQlvZmYgKz0gc2NzaV90YXJnZXRfbGVuOworCisJCS8qIEhlYWRlciBzaXplICsgRGVzaWduYXRpb24gZGVzY3JpcHRvciAqLworCQlsZW4gKz0gKHNjc2lfdGFyZ2V0X2xlbiArIDQpOwogCX0KIAlidWZbMl0gPSAoKGxlbiA+PiA4KSAmIDB4ZmYpOwogCWJ1ZlszXSA9IChsZW4gJiAweGZmKTsgLyogUGFnZSBMZW5ndGggZm9yIFZQRCAweDgzICovCkBAIC00MzYsMTIgKzQ3NSwyNiBAQAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCiAJYnVmWzNdID0gMHgzYzsKKwkvKgorCSAqIFNldCBHUkRfQ0hLICsgUkVGX0NISyBmb3IgVFlQRTEgcHJvdGVjdGlvbiwgb3IgR1JEX0NISworCSAqIG9ubHkgZm9yIFRZUEUzIHByb3RlY3Rpb24uCisJICovCisJaWYgKGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGUgPT0gVEFSR0VUX0RJRl9UWVBFMV9QUk9UKQorCQlidWZbNF0gPSAweDU7CisJZWxzZSBpZiAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSA9PSBUQVJHRVRfRElGX1RZUEUzX1BST1QpCisJCWJ1Zls0XSA9IDB4NDsKKwogCS8qIFNldCBIRUFEU1VQLCBPUkRTVVAsIFNJTVBTVVAgKi8KIAlidWZbNV0gPSAweDA3OwogCiAJLyogSWYgV3JpdGVDYWNoZSBlbXVsYXRpb24gaXMgZW5hYmxlZCwgc2V0IFZfU1VQICovCiAJaWYgKHNwY19jaGVja19kZXZfd2NlKGRldikpCiAJCWJ1Zls2XSA9IDB4MDE7CisJLyogSWYgYW4gTEJBIG1hcCBpcyBwcmVzZW50IHNldCBSX1NVUCAqLworCXNwaW5fbG9jaygmY21kLT5zZV9kZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnQxMF9hbHVhLmxiYV9tYXBfbGlzdCkpCisJCWJ1Zls4XSA9IDB4MTA7CisJc3Bpbl91bmxvY2soJmNtZC0+c2VfZGV2LT50MTBfYWx1YS5sYmFfbWFwX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC02MDAsNiArNjUzLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFJlZmVycmFscyBWUEQgcGFnZSAqLworc3RhdGljIHNlbnNlX3JlYXNvbl90CitzcGNfZW11bGF0ZV9ldnBkX2IzKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCisJYnVmWzBdID0gZGV2LT50cmFuc3BvcnQtPmdldF9kZXZpY2VfdHlwZShkZXYpOworCWJ1ZlszXSA9IDB4MGM7CisJcHV0X3VuYWxpZ25lZF9iZTMyKGRldi0+dDEwX2FsdWEubGJhX21hcF9zZWdtZW50X3NpemUsICZidWZbOF0pOworCXB1dF91bmFsaWduZWRfYmUzMihkZXYtPnQxMF9hbHVhLmxiYV9tYXBfc2VnbWVudF9zaXplLCAmYnVmWzEyXSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNlbnNlX3JlYXNvbl90CiBzcGNfZW11bGF0ZV9ldnBkXzAwKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKTsKIApAQCAtNjE0LDYgKzY4MSw3IEBACiAJeyAucGFnZSA9IDB4YjAsIC5lbXVsYXRlID0gc3BjX2VtdWxhdGVfZXZwZF9iMCB9LAogCXsgLnBhZ2UgPSAweGIxLCAuZW11bGF0ZSA9IHNwY19lbXVsYXRlX2V2cGRfYjEgfSwKIAl7IC5wYWdlID0gMHhiMiwgLmVtdWxhdGUgPSBzcGNfZW11bGF0ZV9ldnBkX2IyIH0sCisJeyAucGFnZSA9IDB4YjMsIC5lbXVsYXRlID0gc3BjX2VtdWxhdGVfZXZwZF9iMyB9LAogfTsKIAogLyogc3VwcG9ydGVkIHZpdGFsIHByb2R1Y3QgZGF0YSBwYWdlcyAqLwpAQCAtNjQzLDExICs3MTEsMTUgQEAKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBjbWQtPnNlX2x1bi0+bHVuX3NlcC0+c2VwX3RwZzsKIAl1bnNpZ25lZCBjaGFyICpyYnVmOwogCXVuc2lnbmVkIGNoYXIgKmNkYiA9IGNtZC0+dF90YXNrX2NkYjsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltTRV9JTlFVSVJZX0JVRl07CisJdW5zaWduZWQgY2hhciAqYnVmOwogCXNlbnNlX3JlYXNvbl90IHJldDsKIAlpbnQgcDsKIAotCW1lbXNldChidWYsIDAsIFNFX0lOUVVJUllfQlVGKTsKKwlidWYgPSBremFsbG9jKFNFX0lOUVVJUllfQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSByZXNwb25zZSBidWZmZXIgZm9yIElOUVVJUllcbiIpOworCQlyZXR1cm4gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJfQogCiAJaWYgKGRldiA9PSB0cGctPnRwZ192aXJ0X2x1bjAubHVuX3NlX2RldikKIAkJYnVmWzBdID0gMHgzZjsgLyogTm90IGNvbm5lY3RlZCAqLwpAQCAtNjgwLDkgKzc1MiwxMCBAQAogb3V0OgogCXJidWYgPSB0cmFuc3BvcnRfa21hcF9kYXRhX3NnKGNtZCk7CiAJaWYgKHJidWYpIHsKLQkJbWVtY3B5KHJidWYsIGJ1ZiwgbWluX3QodTMyLCBzaXplb2YoYnVmKSwgY21kLT5kYXRhX2xlbmd0aCkpOworCQltZW1jcHkocmJ1ZiwgYnVmLCBtaW5fdCh1MzIsIFNFX0lOUVVJUllfQlVGLCBjbWQtPmRhdGFfbGVuZ3RoKSk7CiAJCXRyYW5zcG9ydF9rdW5tYXBfZGF0YV9zZyhjbWQpOwogCX0KKwlrZnJlZShidWYpOwogCiAJaWYgKCFyZXQpCiAJCXRhcmdldF9jb21wbGV0ZV9jbWQoY21kLCBHT09EKTsKQEAgLTc4NSw2ICs4NTgsMTkgQEAKIAkgKiBzdGF0dXMgKHNlZSBTQU0tNCkuCiAJICovCiAJcFs1XSA9IChkZXYtPmRldl9hdHRyaWIuZW11bGF0ZV90YXMpID8gMHg0MCA6IDB4MDA7CisJLyoKKwkgKiBGcm9tIHNwYzRyMzAsIHNlY3Rpb24gNy41LjcgQ29udHJvbCBtb2RlIHBhZ2UKKwkgKgorCSAqIEFwcGxpY2F0aW9uIFRhZyBPd25lciAoQVRPKSBiaXQgc2V0IHRvIG9uZS4KKwkgKgorCSAqIElmIHRoZSBBVE8gYml0IGlzIHNldCB0byBvbmUgdGhlIGRldmljZSBzZXJ2ZXIgc2hhbGwgbm90IG1vZGlmeSB0aGUKKwkgKiBMT0dJQ0FMIEJMT0NLIEFQUExJQ0FUSU9OIFRBRyBmaWVsZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgcHJvdGVjdGlvbgorCSAqIHR5cGUsIHNoYWxsIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBMT0dJQ0FMIEJMT0NLIFJFRkVSRU5DRQorCSAqIFRBRyBmaWVsZC4KKwkgKi8KKwlpZiAoZGV2LT5kZXZfYXR0cmliLnBpX3Byb3RfdHlwZSkKKwkJcFs1XSB8PSAweDgwOworCiAJcFs4XSA9IDB4ZmY7CiAJcFs5XSA9IDB4ZmY7CiAJcFsxMV0gPSAzMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMKaW5kZXggMmE1NzNkZS4uYzAzNjU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogCXNwaW5fbG9ja19pbml0KCZsdW4tPmx1bl9zZXBfbG9jayk7CiAJaW5pdF9jb21wbGV0aW9uKCZsdW4tPmx1bl9yZWZfY29tcCk7CiAKLQlyZXQgPSBjb3JlX3RwZ19wb3N0X2FkZGx1bihzZV90cGcsIGx1biwgbHVuX2FjY2VzcywgZGV2KTsKKwlyZXQgPSBjb3JlX3RwZ19hZGRfbHVuKHNlX3RwZywgbHVuLCBsdW5fYWNjZXNzLCBkZXYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03ODEsNyArNzgxLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woY29yZV90cGdfZGVyZWdpc3Rlcik7CiAKLXN0cnVjdCBzZV9sdW4gKmNvcmVfdHBnX3ByZV9hZGRsdW4oCitzdHJ1Y3Qgc2VfbHVuICpjb3JlX3RwZ19hbGxvY19sdW4oCiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnLAogCXUzMiB1bnBhY2tlZF9sdW4pCiB7CkBAIC04MTEsMTEgKzgxMSwxMSBAQAogCXJldHVybiBsdW47CiB9CiAKLWludCBjb3JlX3RwZ19wb3N0X2FkZGx1bigKK2ludCBjb3JlX3RwZ19hZGRfbHVuKAogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnRwZywKIAlzdHJ1Y3Qgc2VfbHVuICpsdW4sCiAJdTMyIGx1bl9hY2Nlc3MsCi0Jdm9pZCAqbHVuX3B0cikKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtODIzLDcgKzgyMyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjb3JlX2Rldl9leHBvcnQobHVuX3B0ciwgdHBnLCBsdW4pOworCXJldCA9IGNvcmVfZGV2X2V4cG9ydChkZXYsIHRwZywgbHVuKTsKIAlpZiAocmV0IDwgMCkgewogCQlwZXJjcHVfcmVmX2NhbmNlbF9pbml0KCZsdW4tPmx1bl9yZWYpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCA5MTk1M2RhLi5jNTBmZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtNjIsNiArNjIsOCBAQAogc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZTsKIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfYWx1YV90Z19wdF9ncF9jYWNoZTsKIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfYWx1YV90Z19wdF9ncF9tZW1fY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqdDEwX2FsdWFfbGJhX21hcF9jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICp0MTBfYWx1YV9sYmFfbWFwX21lbV9jYWNoZTsKIAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2tfYXR0cihzdHJ1Y3Qgc2VfY21kICpjbWQpOwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2hhbmRsZV9xdWV1ZV9mdWxsKHN0cnVjdCBzZV9jbWQgKmNtZCwKQEAgLTEyOCwxNCArMTMwLDM2IEBACiAJCQkJIm1lbV90IGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0X2ZyZWVfdGdfcHRfZ3BfY2FjaGU7CiAJfQorCXQxMF9hbHVhX2xiYV9tYXBfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgKKwkJCSJ0MTBfYWx1YV9sYmFfbWFwX2NhY2hlIiwKKwkJCXNpemVvZihzdHJ1Y3QgdDEwX2FsdWFfbGJhX21hcCksCisJCQlfX2FsaWdub2ZfXyhzdHJ1Y3QgdDEwX2FsdWFfbGJhX21hcCksIDAsIE5VTEwpOworCWlmICghdDEwX2FsdWFfbGJhX21hcF9jYWNoZSkgeworCQlwcl9lcnIoImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIHQxMF9hbHVhX2xiYV9tYXBfIgorCQkJCSJjYWNoZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlX3RnX3B0X2dwX21lbV9jYWNoZTsKKwl9CisJdDEwX2FsdWFfbGJhX21hcF9tZW1fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgKKwkJCSJ0MTBfYWx1YV9sYmFfbWFwX21lbV9jYWNoZSIsCisJCQlzaXplb2Yoc3RydWN0IHQxMF9hbHVhX2xiYV9tYXBfbWVtYmVyKSwKKwkJCV9fYWxpZ25vZl9fKHN0cnVjdCB0MTBfYWx1YV9sYmFfbWFwX21lbWJlciksIDAsIE5VTEwpOworCWlmICghdDEwX2FsdWFfbGJhX21hcF9tZW1fY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciB0MTBfYWx1YV9sYmFfbWFwX21lbV8iCisJCQkJImNhY2hlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfbGJhX21hcF9jYWNoZTsKKwl9CiAKIAl0YXJnZXRfY29tcGxldGlvbl93cSA9IGFsbG9jX3dvcmtxdWV1ZSgidGFyZ2V0X2NvbXBsZXRpb24iLAogCQkJCQkgICAgICAgV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICghdGFyZ2V0X2NvbXBsZXRpb25fd3EpCi0JCWdvdG8gb3V0X2ZyZWVfdGdfcHRfZ3BfbWVtX2NhY2hlOworCQlnb3RvIG91dF9mcmVlX2xiYV9tYXBfbWVtX2NhY2hlOwogCiAJcmV0dXJuIDA7CiAKK291dF9mcmVlX2xiYV9tYXBfbWVtX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveSh0MTBfYWx1YV9sYmFfbWFwX21lbV9jYWNoZSk7CitvdXRfZnJlZV9sYmFfbWFwX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveSh0MTBfYWx1YV9sYmFfbWFwX2NhY2hlKTsKIG91dF9mcmVlX3RnX3B0X2dwX21lbV9jYWNoZToKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodDEwX2FsdWFfdGdfcHRfZ3BfbWVtX2NhY2hlKTsKIG91dF9mcmVlX3RnX3B0X2dwX2NhY2hlOgpAQCAtMTY0LDYgKzE4OCw4IEBACiAJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodDEwX2FsdWFfdGdfcHRfZ3BfbWVtX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodDEwX2FsdWFfbGJhX21hcF9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX2xiYV9tYXBfbWVtX2NhY2hlKTsKIH0KIAogLyogVGhpcyBjb2RlIGVuc3VyZXMgdW5pcXVlIG1pYiBpbmRleGVzIGFyZSBoYW5kZWQgb3V0LiAqLwpAQCAtNTY4LDEwICs1OTQsMTEgQEAKIHsKIAlzdHJ1Y3Qgc2VfbHVuICpsdW4gPSBjbWQtPnNlX2x1bjsKIAotCWlmICghbHVuIHx8ICFjbWQtPmx1bl9yZWZfYWN0aXZlKQorCWlmICghbHVuKQogCQlyZXR1cm47CiAKLQlwZXJjcHVfcmVmX3B1dCgmbHVuLT5sdW5fcmVmKTsKKwlpZiAoY21weGNoZygmY21kLT5sdW5fcmVmX2FjdGl2ZSwgdHJ1ZSwgZmFsc2UpKQorCQlwZXJjcHVfcmVmX3B1dCgmbHVuLT5sdW5fcmVmKTsKIH0KIAogdm9pZCB0cmFuc3BvcnRfY21kX2ZpbmlzaF9hYm9ydChzdHJ1Y3Qgc2VfY21kICpjbWQsIGludCByZW1vdmUpCkBAIC0xMjg0LDYgKzEzMTEsOCBAQAogICogQHNnbF9jb3VudDogc2NhdHRlcmxpc3QgY291bnQgZm9yIHVuaWRpcmVjdGlvbmFsIG1hcHBpbmcKICAqIEBzZ2xfYmlkaTogc3RydWN0IHNjYXR0ZXJsaXN0IG1lbW9yeSBmb3IgYmlkaXJlY3Rpb25hbCBSRUFEIG1hcHBpbmcKICAqIEBzZ2xfYmlkaV9jb3VudDogc2NhdHRlcmxpc3QgY291bnQgZm9yIGJpZGlyZWN0aW9uYWwgUkVBRCBtYXBwaW5nCisgKiBAc2dsX3Byb3Q6IHN0cnVjdCBzY2F0dGVybGlzdCBtZW1vcnkgcHJvdGVjdGlvbiBpbmZvcm1hdGlvbgorICogQHNnbF9wcm90X2NvdW50OiBzY2F0dGVybGlzdCBjb3VudCBmb3IgcHJvdGVjdGlvbiBpbmZvcm1hdGlvbgogICoKICAqIFJldHVybnMgbm9uIHplcm8gdG8gc2lnbmFsIGFjdGl2ZSBJL08gc2h1dGRvd24gZmFpbHVyZS4gIEFsbCBvdGhlcgogICogc2V0dXAgZXhjZXB0aW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGEgU0NTSSBDSEVDS19DT05ESVRJT04gcmVzcG9uc2UsCkBAIC0xMjk2LDcgKzEzMjUsOCBAQAogCQl1bnNpZ25lZCBjaGFyICpjZGIsIHVuc2lnbmVkIGNoYXIgKnNlbnNlLCB1MzIgdW5wYWNrZWRfbHVuLAogCQl1MzIgZGF0YV9sZW5ndGgsIGludCB0YXNrX2F0dHIsIGludCBkYXRhX2RpciwgaW50IGZsYWdzLAogCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdTMyIHNnbF9jb3VudCwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xfYmlkaSwgdTMyIHNnbF9iaWRpX2NvdW50KQorCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbF9iaWRpLCB1MzIgc2dsX2JpZGlfY291bnQsCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsX3Byb3QsIHUzMiBzZ2xfcHJvdF9jb3VudCkKIHsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGc7CiAJc2Vuc2VfcmVhc29uX3QgcmM7CkBAIC0xMzM4LDYgKzEzNjgsMTQgQEAKIAkJdGFyZ2V0X3B1dF9zZXNzX2NtZChzZV9zZXNzLCBzZV9jbWQpOwogCQlyZXR1cm4gMDsKIAl9CisJLyoKKwkgKiBTYXZlIHBvaW50ZXJzIGZvciBTR0xzIGNvbnRhaW5pbmcgcHJvdGVjdGlvbiBpbmZvcm1hdGlvbiwKKwkgKiBpZiBwcmVzZW50LgorCSAqLworCWlmIChzZ2xfcHJvdF9jb3VudCkgeworCQlzZV9jbWQtPnRfcHJvdF9zZyA9IHNnbF9wcm90OworCQlzZV9jbWQtPnRfcHJvdF9uZW50cyA9IHNnbF9wcm90X2NvdW50OworCX0KIAogCXJjID0gdGFyZ2V0X3NldHVwX2NtZF9mcm9tX2NkYihzZV9jbWQsIGNkYik7CiAJaWYgKHJjICE9IDApIHsKQEAgLTEzODAsNiArMTQxOCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KKwogCS8qCiAJICogQ2hlY2sgaWYgd2UgbmVlZCB0byBkZWxheSBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgQUxVQQogCSAqIEFjdGl2ZS9Ob25PcHRpbWl6ZWQgcHJpbWFyeSBhY2Nlc3Mgc3RhdGUuLgpAQCAtMTQxOSw3ICsxNDU4LDcgQEAKIHsKIAlyZXR1cm4gdGFyZ2V0X3N1Ym1pdF9jbWRfbWFwX3NnbHMoc2VfY21kLCBzZV9zZXNzLCBjZGIsIHNlbnNlLAogCQkJdW5wYWNrZWRfbHVuLCBkYXRhX2xlbmd0aCwgdGFza19hdHRyLCBkYXRhX2RpciwKLQkJCWZsYWdzLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwkJCWZsYWdzLCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0wodGFyZ2V0X3N1Ym1pdF9jbWQpOwogCkBAIC0yNDU1LDYgKzI0OTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljCit2b2lkIHRyYW5zcG9ydF9lcnJfc2VjdG9yX2luZm8odW5zaWduZWQgY2hhciAqYnVmZmVyLCBzZWN0b3JfdCBiYWRfc2VjdG9yKQoreworCS8qIFBsYWNlIGZhaWxlZCBMQkEgaW4gc2Vuc2UgZGF0YSBpbmZvcm1hdGlvbiBkZXNjcmlwdG9yIDAuICovCisJYnVmZmVyW1NQQ19BRERfU0VOU0VfTEVOX09GRlNFVF0gPSAweGM7CisJYnVmZmVyW1NQQ19ERVNDX1RZUEVfT0ZGU0VUXSA9IDA7IC8qIEluZm9ybWF0aW9uICovCisJYnVmZmVyW1NQQ19BRERJVElPTkFMX0RFU0NfTEVOX09GRlNFVF0gPSAweGE7CisJYnVmZmVyW1NQQ19WQUxJRElUWV9PRkZTRVRdID0gMHg4MDsKKworCS8qIERlc2NyaXB0b3IgSW5mb3JtYXRpb246IGZhaWxpbmcgc2VjdG9yICovCisJcHV0X3VuYWxpZ25lZF9iZTY0KGJhZF9zZWN0b3IsICZidWZmZXJbMTJdKTsKK30KKwogaW50CiB0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKHN0cnVjdCBzZV9jbWQgKmNtZCwKIAkJc2Vuc2VfcmVhc29uX3QgcmVhc29uLCBpbnQgZnJvbV90cmFuc3BvcnQpCkBAIC0yNjQ4LDYgKzI3MDAsMzkgQEAKIAkJYnVmZmVyW1NQQ19BU0NfS0VZX09GRlNFVF0gPSAweDFkOwogCQlidWZmZXJbU1BDX0FTQ1FfS0VZX09GRlNFVF0gPSAweDAwOwogCQlicmVhazsKKwljYXNlIFRDTV9MT0dJQ0FMX0JMT0NLX0dVQVJEX0NIRUNLX0ZBSUxFRDoKKwkJLyogQ1VSUkVOVCBFUlJPUiAqLworCQlidWZmZXJbMF0gPSAweDcwOworCQlidWZmZXJbU1BDX0FERF9TRU5TRV9MRU5fT0ZGU0VUXSA9IDEwOworCQkvKiBJTExFR0FMIFJFUVVFU1QgKi8KKwkJYnVmZmVyW1NQQ19TRU5TRV9LRVlfT0ZGU0VUXSA9IElMTEVHQUxfUkVRVUVTVDsKKwkJLyogTE9HSUNBTCBCTE9DSyBHVUFSRCBDSEVDSyBGQUlMRUQgKi8KKwkJYnVmZmVyW1NQQ19BU0NfS0VZX09GRlNFVF0gPSAweDEwOworCQlidWZmZXJbU1BDX0FTQ1FfS0VZX09GRlNFVF0gPSAweDAxOworCQl0cmFuc3BvcnRfZXJyX3NlY3Rvcl9pbmZvKGJ1ZmZlciwgY21kLT5iYWRfc2VjdG9yKTsKKwkJYnJlYWs7CisJY2FzZSBUQ01fTE9HSUNBTF9CTE9DS19BUFBfVEFHX0NIRUNLX0ZBSUxFRDoKKwkJLyogQ1VSUkVOVCBFUlJPUiAqLworCQlidWZmZXJbMF0gPSAweDcwOworCQlidWZmZXJbU1BDX0FERF9TRU5TRV9MRU5fT0ZGU0VUXSA9IDEwOworCQkvKiBJTExFR0FMIFJFUVVFU1QgKi8KKwkJYnVmZmVyW1NQQ19TRU5TRV9LRVlfT0ZGU0VUXSA9IElMTEVHQUxfUkVRVUVTVDsKKwkJLyogTE9HSUNBTCBCTE9DSyBBUFBMSUNBVElPTiBUQUcgQ0hFQ0sgRkFJTEVEICovCisJCWJ1ZmZlcltTUENfQVNDX0tFWV9PRkZTRVRdID0gMHgxMDsKKwkJYnVmZmVyW1NQQ19BU0NRX0tFWV9PRkZTRVRdID0gMHgwMjsKKwkJdHJhbnNwb3J0X2Vycl9zZWN0b3JfaW5mbyhidWZmZXIsIGNtZC0+YmFkX3NlY3Rvcik7CisJCWJyZWFrOworCWNhc2UgVENNX0xPR0lDQUxfQkxPQ0tfUkVGX1RBR19DSEVDS19GQUlMRUQ6CisJCS8qIENVUlJFTlQgRVJST1IgKi8KKwkJYnVmZmVyWzBdID0gMHg3MDsKKwkJYnVmZmVyW1NQQ19BRERfU0VOU0VfTEVOX09GRlNFVF0gPSAxMDsKKwkJLyogSUxMRUdBTCBSRVFVRVNUICovCisJCWJ1ZmZlcltTUENfU0VOU0VfS0VZX09GRlNFVF0gPSBJTExFR0FMX1JFUVVFU1Q7CisJCS8qIExPR0lDQUwgQkxPQ0sgUkVGRVJFTkNFIFRBRyBDSEVDSyBGQUlMRUQgKi8KKwkJYnVmZmVyW1NQQ19BU0NfS0VZX09GRlNFVF0gPSAweDEwOworCQlidWZmZXJbU1BDX0FTQ1FfS0VZX09GRlNFVF0gPSAweDAzOworCQl0cmFuc3BvcnRfZXJyX3NlY3Rvcl9pbmZvKGJ1ZmZlciwgY21kLT5iYWRfc2VjdG9yKTsKKwkJYnJlYWs7CiAJY2FzZSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRToKIAlkZWZhdWx0OgogCQkvKiBDVVJSRU5UIEVSUk9SICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV91YS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdWEuYwppbmRleCBiMDQ0NjdlLi41MDU1MTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV91YS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3VhLmMKQEAgLTk4LDcgKzk4LDYgQEAKIAkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX3VhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCUlOSVRfTElTVF9IRUFEKCZ1YS0+dWFfZGV2X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ1YS0+dWFfbmFjbF9saXN0KTsKIAogCXVhLT51YV9uYWNsID0gbmFjbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3hjb3B5LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV94Y29weS5jCmluZGV4IDZiODhhOTkuLjY2OWM1MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3hjb3B5LmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfeGNvcHkuYwpAQCAtNDAsMTAgKzQwLDYgQEAKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4Y29weV93cSA9IE5VTEw7CiAvKgotICogRnJvbSB0YXJnZXRfY29yZV9zcGMuYwotICovCi1leHRlcm4gdm9pZCBzcGNfcGFyc2VfbmFhXzZoX3ZlbmRvcl9zcGVjaWZpYyhzdHJ1Y3Qgc2VfZGV2aWNlICosIHVuc2lnbmVkIGNoYXIgKik7Ci0vKgogICogRnJvbSB0YXJnZXRfY29yZV9kZXZpY2UuYwogICovCiBleHRlcm4gc3RydWN0IG11dGV4IGdfZGV2aWNlX211dGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKaW5kZXggNDc5ZWM1Ni4uOGIyYzFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCkBAIC00MzgsNyArNDM4LDcgQEAKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IHNlc3MtPnNlX3Nlc3M7CiAJaW50IHRhZzsKIAotCXRhZyA9IHBlcmNwdV9pZGFfYWxsb2MoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsIEdGUF9BVE9NSUMpOworCXRhZyA9IHBlcmNwdV9pZGFfYWxsb2MoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsIFRBU0tfUlVOTklORyk7CiAJaWYgKHRhZyA8IDApCiAJCWdvdG8gYnVzeTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jb25mLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NvbmYuYwppbmRleCBjNjkzMmZiLi5lODc5ZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NvbmYuYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NvbmYuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCi1zdHJ1Y3Qgc2Vfbm9kZV9hY2wgKmZ0X3RwZ19hbGxvY19mYWJyaWNfYWNsKHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZykKK3N0YXRpYyBzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKmZ0X3RwZ19hbGxvY19mYWJyaWNfYWNsKHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZykKIHsKIAlzdHJ1Y3QgZnRfbm9kZV9hY2wgKmFjbDsKIApAQCAtNTUyLDcgKzU1Miw3IEBACiAJLmZhYnJpY19kcm9wX25vZGVhY2wgPQkJJmZ0X2RlbF9hY2wsCiB9OwogCi1pbnQgZnRfcmVnaXN0ZXJfY29uZmlnZnModm9pZCkKK3N0YXRpYyBpbnQgZnRfcmVnaXN0ZXJfY29uZmlnZnModm9pZCkKIHsKIAlzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyAqZmFicmljOwogCWludCByZXQ7CkBAIC01OTksNyArNTk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBmdF9kZXJlZ2lzdGVyX2NvbmZpZ2ZzKHZvaWQpCitzdGF0aWMgdm9pZCBmdF9kZXJlZ2lzdGVyX2NvbmZpZ2ZzKHZvaWQpCiB7CiAJaWYgKCFmdF9jb25maWdmcykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCmluZGV4IDY0OWQ1MTIuLjc4ZTgyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKQEAgLTI5LDEwICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotCi0jaW5jbHVkZSA8YmNtNjN4eF9pcnEuaD4KLSNpbmNsdWRlIDxiY202M3h4X3JlZ3MuaD4KLSNpbmNsdWRlIDxiY202M3h4X2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2JjbTYzeHguaD4KIAogI2RlZmluZSBCQ002M1hYX05SX1VBUlRTCTIKIApAQCAtODEsMTMgKzc4LDEzIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiY21fdWFydF9yZWFkbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAogCQkJCQkgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKLQlyZXR1cm4gYmNtX3JlYWRsKHBvcnQtPm1lbWJhc2UgKyBvZmZzZXQpOworCXJldHVybiBfX3Jhd19yZWFkbChwb3J0LT5tZW1iYXNlICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJjbV91YXJ0X3dyaXRlbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAogCQkJCSAgdW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewotCWJjbV93cml0ZWwodmFsdWUsIHBvcnQtPm1lbWJhc2UgKyBvZmZzZXQpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgcG9ydC0+bWVtYmFzZSArIG9mZnNldCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKaW5kZXggZWMwNjUwNS4uOTc4ODhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21wYzUyeHhfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwpAQCAtNDIxLDYgKzQyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHNjX2ZpZm9jIF9faW9tZW0gKnBzY19maWZvYzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHNjX2ZpZm9jX2lycTsKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwc2NfZmlmb2NfY2xrOwogCiBzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19maWZvX2luaXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKQEAgLTU2OCwzNiArNTY5LDczIEBACiAvKiBJbml0IFBTQyBGSUZPIENvbnRyb2xsZXIgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzUxMnhfcHNjX2ZpZm9jX2luaXQodm9pZCkKIHsKKwlpbnQgZXJyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IGNsayAqY2xrOworCisJLyogZGVmYXVsdCBlcnJvciBjb2RlLCBwb3RlbnRpYWxseSBvdmVyd3JpdHRlbiBieSBjbG9jayBjYWxscyAqLworCWVyciA9IC1FTk9ERVY7CiAKIAlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCiAJCQkJICAgICAiZnNsLG1wYzUxMjEtcHNjLWZpZm8iKTsKIAlpZiAoIW5wKSB7CiAJCXByX2VycigiJXM6IENhbid0IGZpbmQgRklGT0Mgbm9kZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBvdXRfZXJyOwogCX0KIAorCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOworCWlmIChJU19FUlIoY2xrKSkgeworCQkvKiBiYWNrd2FyZHMgY29tcGF0IHdpdGggZGV2aWNlIHRyZWVzIHRoYXQgbGFjayBjbG9jayBzcGVjcyAqLworCQljbGsgPSBjbGtfZ2V0X3N5cyhucC0+bmFtZSwgImlwZyIpOworCX0KKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcHJfZXJyKCIlczogQ2FuJ3QgbG9va3VwIEZJRk8gY2xvY2tcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gUFRSX0VSUihjbGspOworCQlnb3RvIG91dF9vZm5vZGVfcHV0OworCX0KKwlpZiAoY2xrX3ByZXBhcmVfZW5hYmxlKGNsaykpIHsKKwkJcHJfZXJyKCIlczogQ2FuJ3QgZW5hYmxlIEZJRk8gY2xvY2tcbiIsIF9fZnVuY19fKTsKKwkJY2xrX3B1dChjbGspOworCQlnb3RvIG91dF9vZm5vZGVfcHV0OworCX0KKwlwc2NfZmlmb2NfY2xrID0gY2xrOworCiAJcHNjX2ZpZm9jID0gb2ZfaW9tYXAobnAsIDApOwogCWlmICghcHNjX2ZpZm9jKSB7CiAJCXByX2VycigiJXM6IENhbid0IG1hcCBGSUZPQ1xuIiwgX19mdW5jX18pOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIG91dF9jbGtfZGlzYWJsZTsKIAl9CiAKIAlwc2NfZmlmb2NfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAocHNjX2ZpZm9jX2lycSA9PSAwKSB7CiAJCXByX2VycigiJXM6IENhbid0IGdldCBGSUZPQyBpcnFcbiIsIF9fZnVuY19fKTsKLQkJaW91bm1hcChwc2NfZmlmb2MpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5tYXA7CiAJfQogCisJb2Zfbm9kZV9wdXQobnApOwogCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJaW91bm1hcChwc2NfZmlmb2MpOworb3V0X2Nsa19kaXNhYmxlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShwc2NfZmlmb2NfY2xrKTsKKwljbGtfcHV0KHBzY19maWZvY19jbGspOworb3V0X29mbm9kZV9wdXQ6CisJb2Zfbm9kZV9wdXQobnApOworb3V0X2VycjoKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXBjNTEyeF9wc2NfZmlmb2NfdW5pbml0KHZvaWQpCiB7CiAJaW91bm1hcChwc2NfZmlmb2MpOworCisJLyogZGlzYWJsZSB0aGUgY2xvY2ssIGVycm9ycyBhcmUgbm90IGZhdGFsICovCisJaWYgKHBzY19maWZvY19jbGspIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBzY19maWZvY19jbGspOworCQljbGtfcHV0KHBzY19maWZvY19jbGspOworCQlwc2NfZmlmb2NfY2xrID0gTlVMTDsKKwl9CiB9CiAKIC8qIDUxMnggc3BlY2lmaWMgaW50ZXJydXB0IGhhbmRsZXIuIFRoZSBjYWxsZXIgaG9sZHMgdGhlIHBvcnQgbG9jayAqLwpAQCAtNjE5LDI5ICs2NTcsNTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjbGsgKnBzY19tY2xrX2Nsa1tNUEM1Mnh4X1BTQ19NQVhOVU1dOworc3RhdGljIHN0cnVjdCBjbGsgKnBzY19pcGdfY2xrW01QQzUyeHhfUFNDX01BWE5VTV07CiAKIC8qIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgLnJlcXVlc3RfcG9ydCgpIGNhbGxiYWNrIChhbGxvY2F0aW9uKSAqLwogc3RhdGljIGludCBtcGM1MTJ4X3BzY19hbGxvY19jbG9jayhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCWludCBwc2NfbnVtOwotCWNoYXIgY2xrX25hbWVbMTZdOwogCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgZXJyOwogCiAJcHNjX251bSA9IChwb3J0LT5tYXBiYXNlICYgMHhmMDApID4+IDg7Ci0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJwc2MlZF9tY2xrIiwgcHNjX251bSk7Ci0JY2xrID0gZGV2bV9jbGtfZ2V0KHBvcnQtPmRldiwgY2xrX25hbWUpOworCisJY2xrID0gZGV2bV9jbGtfZ2V0KHBvcnQtPmRldiwgIm1jbGsiKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2Vycihwb3J0LT5kZXYsICJGYWlsZWQgdG8gZ2V0IE1DTEshXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJZXJyID0gUFRSX0VSUihjbGspOworCQlnb3RvIG91dF9lcnI7CiAJfQogCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShjbGspOwogCWlmIChlcnIpIHsKIAkJZGV2X2Vycihwb3J0LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIE1DTEshXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfZXJyOwogCX0KIAlwc2NfbWNsa19jbGtbcHNjX251bV0gPSBjbGs7CisKKwljbGsgPSBkZXZtX2Nsa19nZXQocG9ydC0+ZGV2LCAiaXBnIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCWRldl9lcnIocG9ydC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBJUEcgY2xvY2shXG4iKTsKKwkJZXJyID0gUFRSX0VSUihjbGspOworCQlnb3RvIG91dF9lcnI7CisJfQorCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShjbGspOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycihwb3J0LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIElQRyBjbG9jayFcbiIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCXBzY19pcGdfY2xrW3BzY19udW1dID0gY2xrOworCiAJcmV0dXJuIDA7CisKK291dF9lcnI6CisJaWYgKHBzY19tY2xrX2Nsa1twc2NfbnVtXSkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHNjX21jbGtfY2xrW3BzY19udW1dKTsKKwkJcHNjX21jbGtfY2xrW3BzY19udW1dID0gTlVMTDsKKwl9CisJaWYgKHBzY19pcGdfY2xrW3BzY19udW1dKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwc2NfaXBnX2Nsa1twc2NfbnVtXSk7CisJCXBzY19pcGdfY2xrW3BzY19udW1dID0gTlVMTDsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLyogY2FsbGVkIGZyb20gd2l0aGluIHRoZSAucmVsZWFzZV9wb3J0KCkgY2FsbGJhY2sgKHJlbGVhc2UpICovCkBAIC02NTYsNiArNzIwLDEwIEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOwogCQlwc2NfbWNsa19jbGtbcHNjX251bV0gPSBOVUxMOwogCX0KKwlpZiAocHNjX2lwZ19jbGtbcHNjX251bV0pIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBzY19pcGdfY2xrW3BzY19udW1dKTsKKwkJcHNjX2lwZ19jbGtbcHNjX251bV0gPSBOVUxMOworCX0KIH0KIAogLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIC5jbG9jaygpIGNhbGxiYWNrIChlbmFibGUvZGlzYWJsZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMKaW5kZXggYWJkNTA1MC4uOTE2MmQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMKQEAgLTI2MSwxOSArMjYxLDggQEAKIAlzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgZXJyOwotCWNoYXIgY2xrX25hbWVbMTBdOwotCWludCBiYXNlLCBjbGtfbnVtOwogCi0JYmFzZSA9IHBkZXYtPnJlc291cmNlLT5zdGFydCAmIDB4ZjAwMDsKLQlpZiAoYmFzZSA9PSAweDMwMDApCi0JCWNsa19udW0gPSAxOwotCWVsc2UgaWYgKGJhc2UgPT0gMHg0MDAwKQotCQljbGtfbnVtID0gMjsKLQllbHNlCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJ1c2IlZF9jbGsiLCBjbGtfbnVtKTsKLQljbGsgPSBkZXZtX2Nsa19nZXQocGRldi0+ZGV2LnBhcmVudCwgY2xrX25hbWUpOworCWNsayA9IGRldm1fY2xrX2dldChwZGV2LT5kZXYucGFyZW50LCAiaXBnIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgY2xrXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvc2NzaS5jIGIvZHJpdmVycy92aG9zdC9zY3NpLmMKaW5kZXggMWU0Yzc1Yy4uMGEwMjViOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC9zY3NpLmMKKysrIGIvZHJpdmVycy92aG9zdC9zY3NpLmMKQEAgLTcyOCw3ICs3MjgsNyBAQAogCX0KIAlzZV9zZXNzID0gdHZfbmV4dXMtPnR2bl9zZV9zZXNzOwogCi0JdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgR0ZQX0FUT01JQyk7CisJdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5HKTsKIAlpZiAodGFnIDwgMCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byBvYnRhaW4gdGFnIGZvciB0Y21fdmhvc3RfY21kXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC04ODksNyArODg5LDcgQEAKIAkJCWNtZC0+dHZjX2x1biwgY21kLT50dmNfZXhwX2RhdGFfbGVuLAogCQkJY21kLT50dmNfdGFza19hdHRyLCBjbWQtPnR2Y19kYXRhX2RpcmVjdGlvbiwKIAkJCVRBUkdFVF9TQ0ZfQUNLX0tSRUYsIHNnX3B0ciwgY21kLT50dmNfc2dsX2NvdW50LAotCQkJc2dfYmlkaV9wdHIsIHNnX25vX2JpZGkpOworCQkJc2dfYmlkaV9wdHIsIHNnX25vX2JpZGksIE5VTEwsIDApOwogCWlmIChyYyA8IDApIHsKIAkJdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZShzZV9jbWQsCiAJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkUsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwppbmRleCA5M2NmMTVlLi43ZGU4NDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAKIAlyYyA9IGRldmljZV9yZWdpc3RlcigmbmV3X2xkLT5kZXYpOwogCWlmIChyYykgewotCQlrZnJlZShuZXdfbGQpOworCQlwdXRfZGV2aWNlKCZuZXdfbGQtPmRldik7CiAJCXJldHVybiBFUlJfUFRSKHJjKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29yZS5jCmluZGV4IDRhZDI0ZjIuLmNlY2QzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvcmUuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfRk9OVFMKKyNpZmRlZiBDT05GSUdfRk9OVF9TVVBQT1JUCiBzdGF0aWMgc3RydWN0IHN0aV9jb29rZWRfZm9udCAqCiBzdGlfc2VsZWN0X2ZiZm9udChzdHJ1Y3Qgc3RpX2Nvb2tlZF9yb20gKmNvb2tlZF9yb20sIGNvbnN0IGNoYXIgKmZiZm9udF9uYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IGNkZTQ2MTkuLjczMDlhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTE1NzcsMTAgKzE1NzcsMTAgQEAKIHN0YXRpYyBpbnQgZG9fdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7CiAKICNkZWZpbmUgVkdBX0ZCX1BIWVMgMHhBMDAwMAotc3RhdGljIHZvaWQgZG9fcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgcHJpbWFyeSkKK3N0YXRpYyBpbnQgZG9fcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBwcmltYXJ5KQogewotCWludCBpOworCWludCBpLCByZXQ7CiAKIAkvKiBjaGVjayBhbGwgZmlybXdhcmUgZmJzIGFuZCBraWNrIG9mZiBpZiB0aGUgYmFzZSBhZGRyIG92ZXJsYXBzICovCiAJZm9yIChpID0gMCA7IGkgPCBGQl9NQVg7IGkrKykgewpAQCAtMTU5OSwyMiArMTU5OSwyOSBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiZmI6IGNvbmZsaWN0aW5nIGZiIGh3IHVzYWdlICIKIAkJCSAgICAgICAiJXMgdnMgJXMgLSByZW1vdmluZyBnZW5lcmljIGRyaXZlclxuIiwKIAkJCSAgICAgICBuYW1lLCByZWdpc3RlcmVkX2ZiW2ldLT5maXguaWQpOwotCQkJZG9fdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihyZWdpc3RlcmVkX2ZiW2ldKTsKKwkJCXJldCA9IGRvX3VucmVnaXN0ZXJfZnJhbWVidWZmZXIocmVnaXN0ZXJlZF9mYltpXSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAJCX0KIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkb19yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKIHsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCBmYl9ldmVudCBldmVudDsKIAlzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1vZGU7CiAKIAlpZiAoZmJfY2hlY2tfZm9yZWlnbm5lc3MoZmJfaW5mbykpCiAJCXJldHVybiAtRU5PU1lTOwogCi0JZG9fcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhmYl9pbmZvLT5hcGVydHVyZXMsIGZiX2luZm8tPmZpeC5pZCwKLQkJCQkJIGZiX2lzX3ByaW1hcnlfZGV2aWNlKGZiX2luZm8pKTsKKwlyZXQgPSBkb19yZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKGZiX2luZm8tPmFwZXJ0dXJlcywKKwkJCQkJCSBmYl9pbmZvLT5maXguaWQsCisJCQkJCQkgZmJfaXNfcHJpbWFyeV9kZXZpY2UoZmJfaW5mbykpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAobnVtX3JlZ2lzdGVyZWRfZmIgPT0gRkJfTUFYKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTczOSwxMiArMTc0NiwxNiBAQAogfQogRVhQT1JUX1NZTUJPTCh1bmxpbmtfZnJhbWVidWZmZXIpOwogCi12b2lkIHJlbW92ZV9jb25mbGljdGluZ19mcmFtZWJ1ZmZlcnMoc3RydWN0IGFwZXJ0dXJlc19zdHJ1Y3QgKmEsCi0JCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBib29sIHByaW1hcnkpCitpbnQgcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBwcmltYXJ5KQogeworCWludCByZXQ7CisKIAltdXRleF9sb2NrKCZyZWdpc3RyYXRpb25fbG9jayk7Ci0JZG9fcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhhLCBuYW1lLCBwcmltYXJ5KTsKKwlyZXQgPSBkb19yZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKGEsIG5hbWUsIHByaW1hcnkpOwogCW11dGV4X3VubG9jaygmcmVnaXN0cmF0aW9uX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCmluZGV4IGY1MTY0NmYuLmJiZWI4ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwpAQCAtMzcyNiw3ICszNzI2LDYgQEAKIAl9CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX2lycV9zYWZlKCZwZGV2LT5kZXYpOwogCiAJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CiAJaWYgKHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKaW5kZXggNWJlNmU5MS4uNzlkMjU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtODcsNiArODcsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGRhOTA1NV93ZHQuCiAKK2NvbmZpZyBHUElPX1dBVENIRE9HCisJdHJpc3RhdGUgIldhdGNoZG9nIGRldmljZSBjb250cm9sbGVkIHRocm91Z2ggR1BJTy1saW5lIgorCWRlcGVuZHMgb24gT0ZfR1BJTworCXNlbGVjdCBXQVRDSERPR19DT1JFCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHdhdGNoZG9nIGRldmljZQorCSAgY29udHJvbGxlZCB0aHJvdWdoIEdQSU8tbGluZS4KKwogY29uZmlnIFdNODMxWF9XQVRDSERPRwogCXRyaXN0YXRlICJXTTgzMXggd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBNRkRfV004MzFYCkBAIC0xMDksNyArMTE3LDcgQEAKIAogY29uZmlnIEFSTV9TUDgwNV9XQVRDSERPRwogCXRyaXN0YXRlICJBUk0gU1A4MDUgV2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBBUk0gJiYgQVJNX0FNQkEKKwlkZXBlbmRzIG9uIChBUk0gfHwgQVJNNjQpICYmIEFSTV9BTUJBCiAJc2VsZWN0IFdBVENIRE9HX0NPUkUKIAloZWxwCiAJICBBUk0gUHJpbWVjZWxsIFNQODA1IFdhdGNoZG9nIHRpbWVyLiBUaGlzIHdpbGwgcmVib290IHlvdXIgc3lzdGVtIHdoZW4KQEAgLTE4OCw2ICsxOTYsNyBAQAogCXRyaXN0YXRlICJTM0MyNDEwIFdhdGNoZG9nIgogCWRlcGVuZHMgb24gSEFWRV9TM0MyNDEwX1dBVENIRE9HCiAJc2VsZWN0IFdBVENIRE9HX0NPUkUKKwlzZWxlY3QgTUZEX1NZU0NPTiBpZiBBUkNIX0VYWU5PUzUKIAloZWxwCiAJICBXYXRjaGRvZyB0aW1lciBibG9jayBpbiB0aGUgU2Ftc3VuZyBTb0NzLiBUaGlzIHdpbGwgcmVib290CiAJICB0aGUgc3lzdGVtIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgd2l0aCB0aGUgd2F0Y2hkb2cgZW5hYmxlZC4KQEAgLTIxNCwxMCArMjIzLDEwIEBACiAKIGNvbmZpZyBEV19XQVRDSERPRwogCXRyaXN0YXRlICJTeW5vcHN5cyBEZXNpZ25XYXJlIHdhdGNoZG9nIgotCWRlcGVuZHMgb24gQVJNICYmIEhBVkVfQ0xLCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFN5bm9wc3lzIERlc2lnbldhcmUKLQkgIHdhdGNoZG9nIHRpbWVyIGZvdW5kIGluIG1hbnkgQVJNIGNoaXBzLgorCSAgd2F0Y2hkb2cgdGltZXIgZm91bmQgaW4gbWFueSBjaGlwcy4KIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGR3X3dkdC4KIApAQCAtMjcwLDEwICsyNzksMTEgQEAKIAogY29uZmlnIERBVklOQ0lfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiRGFWaW5jaSB3YXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSQorCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJIHx8IEFSQ0hfS0VZU1RPTkUKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKLQkgIGluIHRoZSBEYVZpbmNpIERNNjQ0eC9ETTY0NnggcHJvY2Vzc29ycy4KKwkgIGluIHRoZSBEYVZpbmNpIERNNjQ0eC9ETTY0Nnggb3IgS2V5c3RvbmUgcHJvY2Vzc29ycy4KIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRhdmluY2lfd2R0LgogCkBAIC04ODMsMTMgKzg5MywyMiBAQAogCU1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCiAKIGNvbmZpZyBXODM2MjdIRl9XRFQKLQl0cmlzdGF0ZSAiVzgzNjI3SEYvVzgzNjI3REhHIFdhdGNoZG9nIFRpbWVyIgorCXRyaXN0YXRlICJXYXRjaGRvZyB0aW1lciBmb3IgVzgzNjI3SEYvVzgzNjI3REhHIGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIFg4NgogCXNlbGVjdCBXQVRDSERPR19DT1JFCiAJLS0taGVscC0tLQotCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFc4MzYyN0hGIGNoaXBzZXQKLQkgIGFzIHVzZWQgaW4gQWR2YW50ZWNoIFBDLTk1NzggYW5kIFR5YW4gUzI3MjEtNTMzIG1vdGhlcmJvYXJkcwotCSAgKGFuZCBsaWtlbHkgb3RoZXJzKS4gVGhlIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBXODM2MjdESEcgY2hpcC4KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBmb2xsb3dpbmcKKwkgIFN1cGVyIEkvTyBjaGlwcy4KKwkJVzgzNjI3REhHL0RIRy1QL0VIRi9FSEcvRi9HL0hGL1MvU0YvVEhGL1VIRy9VRworCQlXODM2MzdIRgorCQlXODM2NjdIRy9IRy1CCisJCVc4MzY4N1RIRgorCQlXODM2OTdIRgorCQlXODM2OTdVRworCQlOQ1Q2Nzc1CisJCU5DVDY3NzYKKwkJTkNUNjc3OQorCiAJICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0CiAJICBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluCiAJICBhbW91bnQgb2YgdGltZS4KQEAgLTExMzksNiArMTE1OCwyOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIGxvYWRhYmxlIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KIAkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYmNtMjgzNV93ZHQuCiAKK2NvbmZpZyBCQ01fS09OQV9XRFQKKwl0cmlzdGF0ZSAiQkNNIEtvbmEgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBBUkNIX0JDTQorCXNlbGVjdCBXQVRDSERPR19DT1JFCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyIG9uIHRoZSBmb2xsb3dpbmcgQnJvYWRjb20gQkNNMjgxeHgKKwkgIGZhbWlseSwgd2hpY2ggaW5jbHVkZXMgQkNNMTExMzAsIEJDTTExMTQwLCBCQ00xMTM1MSwgQkNNMjgxNDUgYW5kCisJICBCQ00yODE1NSB2YXJpYW50cy4KKworCSAgU2F5ICdZJyBvciAnTScgaGVyZSB0byBlbmFibGUgdGhlIGRyaXZlci4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgYmNtX2tvbmFfd2R0LgorCitjb25maWcgQkNNX0tPTkFfV0RUX0RFQlVHCisJYm9vbCAiREVCVUdGUyBzdXBwb3J0IGZvciBCQ00gS29uYSBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIEJDTV9LT05BX1dEVAorCWhlbHAKKwkgIElmIGVuYWJsZWQsIGFkZHMgL3N5cy9rZXJuZWwvZGVidWcvYmNtX2tvbmFfd2R0L2luZm8gd2hpY2ggcHJvdmlkZXMKKwkgIGFjY2VzcyB0byB0aGUgZHJpdmVyJ3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFzIHdlbGwgYXMgd2F0Y2hkb2cKKwkgIHRpbWVyIGhhcmR3YXJlIHJlZ2lzdHJlcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSAnTicuCisKIGNvbmZpZyBMQU5USVFfV0RUCiAJdHJpc3RhdGUgIkxhbnRpcSBTb0Mgd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBMQU5USVEKQEAgLTExNzEsNiArMTIxMiw3IEBACiBjb25maWcgOHh4eF9XRFQKIAl0cmlzdGF0ZSAiTVBDOHh4eCBQbGF0Zm9ybSBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFBQQ184eHggfHwgUFBDXzgzeHggfHwgUFBDXzg2eHgKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIGZvciBhIFNvQyBsZXZlbCB3YXRjaGRvZyB0aGF0IGV4aXN0cyBvbiBzb21lCiAJICBGcmVlc2NhbGUgUG93ZXJQQyBwcm9jZXNzb3JzLiBTbyBmYXIgdGhpcyBkcml2ZXIgc3VwcG9ydHM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA5MWJkOTVhLi45ODVhNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTU3LDYgKzU3LDcgQEAKIG9iai0kKENPTkZJR19CQ00yODM1X1dEVCkgKz0gYmNtMjgzNV93ZHQubwogb2JqLSQoQ09ORklHX01PWEFSVF9XRFQpICs9IG1veGFydF93ZHQubwogb2JqLSQoQ09ORklHX1NJUkZTT0NfV0FUQ0hET0cpICs9IHNpcmZzb2Nfd2R0Lm8KK29iai0kKENPTkZJR19CQ01fS09OQV9XRFQpICs9IGJjbV9rb25hX3dkdC5vCiAKICMgQVZSMzIgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfQVQzMkFQNzAwWF9XRFQpICs9IGF0MzJhcDcwMHhfd2R0Lm8KQEAgLTE3MSw2ICsxNzIsNyBAQAogIyBBcmNoaXRlY3R1cmUgSW5kZXBlbmRlbnQKIG9iai0kKENPTkZJR19EQTkwNTJfV0FUQ0hET0cpICs9IGRhOTA1Ml93ZHQubwogb2JqLSQoQ09ORklHX0RBOTA1NV9XQVRDSERPRykgKz0gZGE5MDU1X3dkdC5vCitvYmotJChDT05GSUdfR1BJT19XQVRDSERPRykJKz0gZ3Bpb193ZHQubwogb2JqLSQoQ09ORklHX1dNODMxWF9XQVRDSERPRykgKz0gd204MzF4X3dkdC5vCiBvYmotJChDT05GSUdfV004MzUwX1dBVENIRE9HKSArPSB3bTgzNTBfd2R0Lm8KIG9iai0kKENPTkZJR19NQVg2M1hYX1dBVENIRE9HKSArPSBtYXg2M3h4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hbGltMTUzNV93ZHQuYwppbmRleCBmYmI3Yjk0Li4zYTE3ZmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTE1MzVfd2R0LmMKQEAgLTMwMSw3ICszMDEsNyBAQAogICoJd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCiAgKi8KIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGFsaV9wY2lfdGJsKSBfX3VzZWQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpX3BjaV90YmxbXSBfX3VzZWQgPSB7CiAJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDE1MzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKIAl7IFBDSV9WRU5ET1JfSURfQUwsIDB4MTUzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXsgMCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jCmluZGV4IDEyZjBiNzYuLjk5NmIyZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hbGltNzEwMV93ZHQuYwpAQCAtNDE0LDcgKzQxNCw3IEBACiBtb2R1bGVfaW5pdChhbGltNzEwMV93ZHRfaW5pdCk7CiBtb2R1bGVfZXhpdChhbGltNzEwMV93ZHRfdW5sb2FkKTsKIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGFsaW03MTAxX3BjaV90YmwpIF9fdXNlZCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbGltNzEwMV9wY2lfdGJsW10gX191c2VkID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX003MTAxKSB9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmMKaW5kZXggYmUzN2RkZS4uNDg5NzI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5jCkBAIC0xOSwxMSArMTksMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpAQCAtMzEsMjIgKzMzLDMzIEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAKICNpbmNsdWRlICJhdDkxc2FtOV93ZHQuaCIKIAogI2RlZmluZSBEUlZfTkFNRSAiQVQ5MVNBTTkgV2F0Y2hkb2ciCiAKLSNkZWZpbmUgd2R0X3JlYWQoZmllbGQpIFwKLQlfX3Jhd19yZWFkbChhdDkxd2R0X3ByaXZhdGUuYmFzZSArIGZpZWxkKQotI2RlZmluZSB3ZHRfd3JpdGUoZmllbGQsIHZhbCkgXAotCV9fcmF3X3dyaXRlbCgodmFsKSwgYXQ5MXdkdF9wcml2YXRlLmJhc2UgKyBmaWVsZCkKKyNkZWZpbmUgd2R0X3JlYWQod2R0LCBmaWVsZCkgXAorCV9fcmF3X3JlYWRsKCh3ZHQpLT5iYXNlICsgKGZpZWxkKSkKKyNkZWZpbmUgd2R0X3dyaXRlKHd0ZCwgZmllbGQsIHZhbCkgXAorCV9fcmF3X3dyaXRlbCgodmFsKSwgKHdkdCktPmJhc2UgKyAoZmllbGQpKQogCiAvKiBBVDkxU0FNOSB3YXRjaGRvZyBydW5zIGEgMTJiaXQgY291bnRlciBAIDI1Nkh6LAogICogdXNlIHRoaXMgdG8gY29udmVydCBhIHdhdGNoZG9nCiAgKiB2YWx1ZSBmcm9tL3RvIG1pbGxpc2Vjb25kcy4KICAqLwotI2RlZmluZSBtc190b190aWNrcyh0KQkoKCh0IDw8IDgpIC8gMTAwMCkgLSAxKQotI2RlZmluZSB0aWNrc190b19tcyh0KQkoKCh0ICsgMSkgKiAxMDAwKSA+PiA4KQorI2RlZmluZSB0aWNrc190b19oel9yb3VuZGRvd24odCkJKCgoKHQpICsgMSkgKiBIWikgPj4gOCkKKyNkZWZpbmUgdGlja3NfdG9faHpfcm91bmR1cCh0KQkJKCgoKCh0KSArIDEpICogSFopICsgMjU1KSA+PiA4KQorI2RlZmluZSB0aWNrc190b19zZWNzKHQpCQkoKCh0KSArIDEpID4+IDgpCisjZGVmaW5lIHNlY3NfdG9fdGlja3MocykJCSgocykgPyAoKChzKSA8PCA4KSAtIDEpIDogMCkKKworI2RlZmluZSBXRFRfTVJfUkVTRVQJMHgzRkZGMkZGRgorCisvKiBXYXRjaGRvZyBtYXggY291bnRlciB2YWx1ZSBpbiB0aWNrcyAqLworI2RlZmluZSBXRFRfQ09VTlRFUl9NQVhfVElDS1MJMHhGRkYKKworLyogV2F0Y2hkb2cgbWF4IGRlbHRhL3ZhbHVlIGluIHNlY3MgKi8KKyNkZWZpbmUgV0RUX0NPVU5URVJfTUFYX1NFQ1MJdGlja3NfdG9fc2VjcyhXRFRfQ09VTlRFUl9NQVhfVElDS1MpCiAKIC8qIEhhcmR3YXJlIHRpbWVvdXQgaW4gc2Vjb25kcyAqLwogI2RlZmluZSBXRFRfSFdfVElNRU9VVCAyCkBAIC02NiwyMyArNzksNDAgQEAKIE1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgIgogCSIoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAotc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgYXQ5MV93ZHRfZGV2Owotc3RhdGljIHZvaWQgYXQ5MV9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgeworI2RlZmluZSB0b193ZHQod2RkKSBjb250YWluZXJfb2Yod2RkLCBzdHJ1Y3QgYXQ5MXdkdCwgd2RkKQorc3RydWN0IGF0OTF3ZHQgeworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2Ugd2RkOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIG5leHRfaGVhcnRiZWF0OwkvKiB0aGUgbmV4dF9oZWFydGJlYXQgZm9yIHRoZSB0aW1lciAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBUaGUgdGltZXIgdGhhdCBwaW5ncyB0aGUgd2F0Y2hkb2cgKi8KLX0gYXQ5MXdkdF9wcml2YXRlOworCXUzMiBtcjsKKwl1MzIgbXJfbWFzazsKKwl1bnNpZ25lZCBsb25nIGhlYXJ0YmVhdDsJLyogV0RUIGhlYXJ0YmVhdCBpbiBqaWZmaWVzICovCisJYm9vbCBub3dheW91dDsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKIAogLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwogCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2R0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGF0OTF3ZHQgKndkdCA9IChzdHJ1Y3QgYXQ5MXdkdCAqKWRldl9pZDsKKworCWlmICh3ZHRfcmVhZCh3ZHQsIEFUOTFfV0RUX1NSKSkgeworCQlwcl9jcml0KCJhdDkxc2FtOSBXRFQgc29mdHdhcmUgcmVzZXRcbiIpOworCQllbWVyZ2VuY3lfcmVzdGFydCgpOworCQlwcl9jcml0KCJSZWJvb3QgZGlkbid0ID8/Pz8/XG4iKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qCiAgKiBSZWxvYWQgdGhlIHdhdGNoZG9nIHRpbWVyLiAgKGllLCBwYXQgdGhlIHdhdGNoZG9nKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ5MV93ZHRfcmVzZXQodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdDkxX3dkdF9yZXNldChzdHJ1Y3QgYXQ5MXdkdCAqd2R0KQogewotCXdkdF93cml0ZShBVDkxX1dEVF9DUiwgQVQ5MV9XRFRfS0VZIHwgQVQ5MV9XRFRfV0RSU1RUKTsKKwl3ZHRfd3JpdGUod2R0LCBBVDkxX1dEVF9DUiwgQVQ5MV9XRFRfS0VZIHwgQVQ5MV9XRFRfV0RSU1RUKTsKIH0KIAogLyoKQEAgLTkwLDI2ICsxMjAsMjEgQEAKICAqLwogc3RhdGljIHZvaWQgYXQ5MV9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgYXQ5MXdkdF9wcml2YXRlLm5leHRfaGVhcnRiZWF0KSB8fAotCSAgICAoIXdhdGNoZG9nX2FjdGl2ZSgmYXQ5MV93ZHRfZGV2KSkpIHsKLQkJYXQ5MV93ZHRfcmVzZXQoKTsKLQkJbW9kX3RpbWVyKCZhdDkxd2R0X3ByaXZhdGUudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7Ci0JfSBlbHNlCisJc3RydWN0IGF0OTF3ZHQgKndkdCA9IChzdHJ1Y3QgYXQ5MXdkdCAqKWRhdGE7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHdkdC0+bmV4dF9oZWFydGJlYXQpIHx8CisJICAgICF3YXRjaGRvZ19hY3RpdmUoJndkdC0+d2RkKSkgeworCQlhdDkxX3dkdF9yZXNldCh3ZHQpOworCQltb2RfdGltZXIoJndkdC0+dGltZXIsIGppZmZpZXMgKyB3ZHQtPmhlYXJ0YmVhdCk7CisJfSBlbHNlIHsKIAkJcHJfY3JpdCgiSSB3aWxsIHJlc2V0IHlvdXIgbWFjaGluZSAhXG4iKTsKLX0KLQotc3RhdGljIGludCBhdDkxX3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKLXsKLQkvKiBjYWxjdWxhdGUgd2hlbiB0aGUgbmV4dCB1c2Vyc3BhY2UgdGltZW91dCB3aWxsIGJlICovCi0JYXQ5MXdkdF9wcml2YXRlLm5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIHdkZC0+dGltZW91dCAqIEhaOwotCXJldHVybiAwOworCX0KIH0KIAogc3RhdGljIGludCBhdDkxX3dkdF9zdGFydChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7Ci0JLyogY2FsY3VsYXRlIHRoZSBuZXh0IHVzZXJzcGFjZSB0aW1lb3V0IGFuZCBtb2RpZnkgdGhlIHRpbWVyICovCi0JYXQ5MV93ZHRfcGluZyh3ZGQpOwotCW1vZF90aW1lcigmYXQ5MXdkdF9wcml2YXRlLnRpbWVyLCBqaWZmaWVzICsgV0RUX1RJTUVPVVQpOworCXN0cnVjdCBhdDkxd2R0ICp3ZHQgPSB0b193ZHQod2RkKTsKKwkvKiBjYWxjdWxhdGUgd2hlbiB0aGUgbmV4dCB1c2Vyc3BhY2UgdGltZW91dCB3aWxsIGJlICovCisJd2R0LT5uZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyB3ZGQtPnRpbWVvdXQgKiBIWjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIyLDM5ICsxNDcsMTA0IEBACiBzdGF0aWMgaW50IGF0OTFfd2R0X3NldF90aW1lb3V0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwgdW5zaWduZWQgaW50IG5ld190aW1lb3V0KQogewogCXdkZC0+dGltZW91dCA9IG5ld190aW1lb3V0OwotCXJldHVybiAwOworCXJldHVybiBhdDkxX3dkdF9zdGFydCh3ZGQpOwogfQogCi0vKgotICogU2V0IHRoZSB3YXRjaGRvZyB0aW1lIGludGVydmFsIGluIDEvMjU2SHogKHdyaXRlLW9uY2UpCi0gKiBDb3VudGVyIGlzIDEyIGJpdC4KLSAqLwotc3RhdGljIGludCBhdDkxX3dkdF9zZXR0aW1lb3V0KHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBhdDkxX3dkdF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBhdDkxd2R0ICp3ZHQpCiB7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQl1bnNpZ25lZCBpbnQgbXI7CisJdTMyIHRtcDsKKwl1MzIgZGVsdGE7CisJdTMyIHZhbHVlOworCWludCBlcnI7CisJdTMyIG1hc2sgPSB3ZHQtPm1yX21hc2s7CisJdW5zaWduZWQgbG9uZyBtaW5faGVhcnRiZWF0ID0gMTsKKwl1bnNpZ25lZCBsb25nIG1heF9oZWFydGJlYXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAotCS8qIENoZWNrIGlmIGRpc2FibGVkICovCi0JbXIgPSB3ZHRfcmVhZChBVDkxX1dEVF9NUik7Ci0JaWYgKG1yICYgQVQ5MV9XRFRfV0RESVMpIHsKLQkJcHJfZXJyKCJzb3JyeSwgd2F0Y2hkb2cgaXMgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwl0bXAgPSB3ZHRfcmVhZCh3ZHQsIEFUOTFfV0RUX01SKTsKKwlpZiAoKHRtcCAmIG1hc2spICE9ICh3ZHQtPm1yICYgbWFzaykpIHsKKwkJaWYgKHRtcCA9PSBXRFRfTVJfUkVTRVQpIHsKKwkJCXdkdF93cml0ZSh3ZHQsIEFUOTFfV0RUX01SLCB3ZHQtPm1yKTsKKwkJCXRtcCA9IHdkdF9yZWFkKHdkdCwgQVQ5MV9XRFRfTVIpOworCQl9CisJfQorCisJaWYgKHRtcCAmIEFUOTFfV0RUX1dERElTKSB7CisJCWlmICh3ZHQtPm1yICYgQVQ5MV9XRFRfV0RESVMpCisJCQlyZXR1cm4gMDsKKwkJZGV2X2VycihkZXYsICJ3YXRjaGRvZyBpcyBkaXNhYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhbHVlID0gdG1wICYgQVQ5MV9XRFRfV0RWOworCWRlbHRhID0gKHRtcCAmIEFUOTFfV0RUX1dERCkgPj4gMTY7CisKKwlpZiAoZGVsdGEgPCB2YWx1ZSkKKwkJbWluX2hlYXJ0YmVhdCA9IHRpY2tzX3RvX2h6X3JvdW5kdXAodmFsdWUgLSBkZWx0YSk7CisKKwltYXhfaGVhcnRiZWF0ID0gdGlja3NfdG9faHpfcm91bmRkb3duKHZhbHVlKTsKKwlpZiAoIW1heF9oZWFydGJlYXQpIHsKKwkJZGV2X2VycihkZXYsCisJCQkiaGVhcnRiZWF0IGlzIHRvbyBzbWFsbCBmb3IgdGhlIHN5c3RlbSB0byBoYW5kbGUgaXQgY29ycmVjdGx5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyoKLQkgKiBBbGwgY291bnRpbmcgb2NjdXJzIGF0IFNMT1dfQ0xPQ0sgLyAxMjggPSAyNTYgSHoKLQkgKgotCSAqIFNpbmNlIFdEViBpcyBhIDEyLWJpdCBjb3VudGVyLCB0aGUgbWF4aW11bSBwZXJpb2QgaXMKLQkgKiA0MDk2IC8gMjU2ID0gMTYgc2Vjb25kcy4KKwkgKiBUcnkgdG8gcmVzZXQgdGhlIHdhdGNoZG9nIGNvdW50ZXIgNCBvciAyIHRpbWVzIG1vcmUgb2Z0ZW4gdGhhbgorCSAqIGFjdHVhbGx5IHJlcXVlc3RlZCwgdG8gYXZvaWQgc3B1cmlvdXMgd2F0Y2hkb2cgcmVzZXQuCisJICogSWYgdGhpcyBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBvZiB0aGUgbWluX2hlYXJ0YmVhdCB2YWx1ZSwgcmVzZXQKKwkgKiBpdCBhdCB0aGUgbWluX2hlYXJ0YmVhdCBwZXJpb2QuCiAJICovCi0JcmVnID0gQVQ5MV9XRFRfV0RSU1RFTgkvKiBjYXVzZXMgd2F0Y2hkb2cgcmVzZXQgKi8KLQkJLyogfCBBVDkxX1dEVF9XRFJQUk9DCWNhdXNlcyBwcm9jZXNzb3IgcmVzZXQgb25seSAqLwotCQl8IEFUOTFfV0RUX1dEREJHSExUCS8qIGRpc2FibGVkIGluIGRlYnVnIG1vZGUgKi8KLQkJfCBBVDkxX1dEVF9XREQJCS8qIHJlc3RhcnQgYXQgYW55IHRpbWUgKi8KLQkJfCAodGltZW91dCAmIEFUOTFfV0RUX1dEVik7ICAvKiB0aW1lciB2YWx1ZSAqLwotCXdkdF93cml0ZShBVDkxX1dEVF9NUiwgcmVnKTsKKwlpZiAoKG1heF9oZWFydGJlYXQgLyA0KSA+PSBtaW5faGVhcnRiZWF0KQorCQl3ZHQtPmhlYXJ0YmVhdCA9IG1heF9oZWFydGJlYXQgLyA0OworCWVsc2UgaWYgKChtYXhfaGVhcnRiZWF0IC8gMikgPj0gbWluX2hlYXJ0YmVhdCkKKwkJd2R0LT5oZWFydGJlYXQgPSBtYXhfaGVhcnRiZWF0IC8gMjsKKwllbHNlCisJCXdkdC0+aGVhcnRiZWF0ID0gbWluX2hlYXJ0YmVhdDsKKworCWlmIChtYXhfaGVhcnRiZWF0IDwgbWluX2hlYXJ0YmVhdCArIDQpCisJCWRldl93YXJuKGRldiwKKwkJCSAibWluIGhlYXJ0YmVhdCBhbmQgbWF4IGhlYXJ0YmVhdCBtaWdodCBiZSB0b28gY2xvc2UgZm9yIHRoZSBzeXN0ZW0gdG8gaGFuZGxlIGl0IGNvcnJlY3RseVxuIik7CisKKwlpZiAoKHRtcCAmIEFUOTFfV0RUX1dERklFTikgJiYgd2R0LT5pcnEpIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEod2R0LT5pcnEsIHdkdF9pbnRlcnJ1cHQsCisJCQkJICBJUlFGX1NIQVJFRCB8IElSUUZfSVJRUE9MTCwKKwkJCQkgIHBkZXYtPm5hbWUsIHdkdCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgodG1wICYgd2R0LT5tcl9tYXNrKSAhPSAod2R0LT5tciAmIHdkdC0+bXJfbWFzaykpCisJCWRldl93YXJuKGRldiwKKwkJCSAid2F0Y2hkb2cgYWxyZWFkeSBjb25maWd1cmVkIGRpZmZlcmVudGx5IChtciA9ICV4IGV4cGVjdGluZyAleClcbiIsCisJCQkgdG1wICYgd2R0LT5tcl9tYXNrLCB3ZHQtPm1yICYgd2R0LT5tcl9tYXNrKTsKKworCXNldHVwX3RpbWVyKCZ3ZHQtPnRpbWVyLCBhdDkxX3BpbmcsICh1bnNpZ25lZCBsb25nKXdkdCk7CisKKwkvKgorCSAqIFVzZSBtaW5faGVhcnRiZWF0IHRoZSBmaXJzdCB0aW1lIHRvIGF2b2lkIHNwdXJpb3VzIHdhdGNoZG9nIHJlc2V0OgorCSAqIHdlIGRvbid0IGtub3cgZm9yIGhvdyBsb25nIHRoZSB3YXRjaGRvZyBjb3VudGVyIGlzIHJ1bm5pbmcsIGFuZAorCSAqICAtIHJlc2V0dGluZyBpdCByaWdodCBub3cgbWlnaHQgdHJpZ2dlciBhIHdhdGNoZG9nIGZhdWx0IHJlc2V0CisJICogIC0gd2FpdGluZyBmb3IgaGVhcnRiZWF0IHRpbWUgbWlnaHQgbGVhZCB0byBhIHdhdGNoZG9nIHRpbWVvdXQKKwkgKiAgICByZXNldAorCSAqLworCW1vZF90aW1lcigmd2R0LT50aW1lciwgamlmZmllcyArIG1pbl9oZWFydGJlYXQpOworCisJLyogVHJ5IHRvIHNldCB0aW1lb3V0IGZyb20gZGV2aWNlIHRyZWUgZmlyc3QgKi8KKwlpZiAod2F0Y2hkb2dfaW5pdF90aW1lb3V0KCZ3ZHQtPndkZCwgMCwgZGV2KSkKKwkJd2F0Y2hkb2dfaW5pdF90aW1lb3V0KCZ3ZHQtPndkZCwgaGVhcnRiZWF0LCBkZXYpOworCXdhdGNoZG9nX3NldF9ub3dheW91dCgmd2R0LT53ZGQsIHdkdC0+bm93YXlvdXQpOworCWVyciA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmd2R0LT53ZGQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3N0b3BfdGltZXI7CisKKwl3ZHQtPm5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIHdkdC0+d2RkLnRpbWVvdXQgKiBIWjsKIAogCXJldHVybiAwOworCitvdXRfc3RvcF90aW1lcjoKKwlkZWxfdGltZXIoJndkdC0+dGltZXIpOworCXJldHVybiBlcnI7CiB9CiAKIC8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KQEAgLTE2OSw2MSArMjU5LDEyMyBAQAogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5zdGFydCA9CWF0OTFfd2R0X3N0YXJ0LAogCS5zdG9wID0JCWF0OTFfd2R0X3N0b3AsCi0JLnBpbmcgPQkJYXQ5MV93ZHRfcGluZywKIAkuc2V0X3RpbWVvdXQgPQlhdDkxX3dkdF9zZXRfdGltZW91dCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIGF0OTFfd2R0X2RldiA9IHsKLQkuaW5mbyA9CQkmYXQ5MV93ZHRfaW5mbywKLQkub3BzID0JCSZhdDkxX3dkdF9vcHMsCi0JLnRpbWVvdXQgPQlXRFRfSEVBUlRCRUFULAotCS5taW5fdGltZW91dCA9CTEsCi0JLm1heF90aW1lb3V0ID0JMHhGRkZGLAotfTsKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBpbnQgb2ZfYXQ5MXdkdF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBhdDkxd2R0ICp3ZHQpCit7CisJdTMyIG1pbiA9IDA7CisJdTMyIG1heCA9IFdEVF9DT1VOVEVSX01BWF9TRUNTOworCWNvbnN0IGNoYXIgKnRtcDsKKworCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLworCXdkdC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCWlmICghd2R0LT5pcnEpCisJCWRldl93YXJuKHdkdC0+d2RkLnBhcmVudCwgImZhaWxlZCB0byBnZXQgSVJRIGZyb20gRFRcbiIpOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgImF0bWVsLG1heC1oZWFydGJlYXQtc2VjIiwgMCwKKwkJCQkJJm1heCkpIHsKKwkJaWYgKCFtYXggfHwgbWF4ID4gV0RUX0NPVU5URVJfTUFYX1NFQ1MpCisJCQltYXggPSBXRFRfQ09VTlRFUl9NQVhfU0VDUzsKKworCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAiYXRtZWwsbWluLWhlYXJ0YmVhdC1zZWMiLAorCQkJCQkJMCwgJm1pbikpIHsKKwkJCWlmIChtaW4gPj0gbWF4KQorCQkJCW1pbiA9IG1heCAtIDE7CisJCX0KKwl9CisKKwltaW4gPSBzZWNzX3RvX3RpY2tzKG1pbik7CisJbWF4ID0gc2Vjc190b190aWNrcyhtYXgpOworCisJd2R0LT5tcl9tYXNrID0gMHgzRkZGRkZGRjsKKwl3ZHQtPm1yID0gMDsKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiYXRtZWwsd2F0Y2hkb2ctdHlwZSIsICZ0bXApICYmCisJICAgICFzdHJjbXAodG1wLCAic29mdHdhcmUiKSkgeworCQl3ZHQtPm1yIHw9IEFUOTFfV0RUX1dERklFTjsKKwkJd2R0LT5tcl9tYXNrICY9IH5BVDkxX1dEVF9XRFJQUk9DOworCX0gZWxzZSB7CisJCXdkdC0+bXIgfD0gQVQ5MV9XRFRfV0RSU1RFTjsKKwl9CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiYXRtZWwscmVzZXQtdHlwZSIsICZ0bXApICYmCisJICAgICFzdHJjbXAodG1wLCAicHJvYyIpKQorCQl3ZHQtPm1yIHw9IEFUOTFfV0RUX1dEUlBST0M7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsZGlzYWJsZSIpKSB7CisJCXdkdC0+bXIgfD0gQVQ5MV9XRFRfV0RESVM7CisJCXdkdC0+bXJfbWFzayAmPSBBVDkxX1dEVF9XRERJUzsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsaWRsZS1oYWx0IikpCisJCXdkdC0+bXIgfD0gQVQ5MV9XRFRfV0RJRExFSExUOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLGRiZy1oYWx0IikpCisJCXdkdC0+bXIgfD0gQVQ5MV9XRFRfV0REQkdITFQ7CisKKwl3ZHQtPm1yIHw9IG1heCB8ICgobWF4IC0gbWluKSA8PCAxNik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBvZl9hdDkxd2R0X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGF0OTF3ZHQgKndkdCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBhdDkxd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlCSpyOwotCWludCByZXM7CisJaW50IGVycjsKKwlzdHJ1Y3QgYXQ5MXdkdCAqd2R0OworCisJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZHQpCisJCXJldHVybiAtRU5PTUVNOworCisJd2R0LT5tciA9IChXRFRfSFdfVElNRU9VVCAqIDI1NikgfCBBVDkxX1dEVF9XRFJTVEVOIHwgQVQ5MV9XRFRfV0REIHwKKwkJICBBVDkxX1dEVF9XRERCR0hMVCB8IEFUOTFfV0RUX1dESURMRUhMVDsKKwl3ZHQtPm1yX21hc2sgPSAweDNGRkZGRkZGOworCXdkdC0+bm93YXlvdXQgPSBub3dheW91dDsKKwl3ZHQtPndkZC5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXdkdC0+d2RkLmluZm8gPSAmYXQ5MV93ZHRfaW5mbzsKKwl3ZHQtPndkZC5vcHMgPSAmYXQ5MV93ZHRfb3BzOworCXdkdC0+d2RkLnRpbWVvdXQgPSBXRFRfSEVBUlRCRUFUOworCXdkdC0+d2RkLm1pbl90aW1lb3V0ID0gMTsKKwl3ZHQtPndkZC5tYXhfdGltZW91dCA9IDB4RkZGRjsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JYXQ5MXdkdF9wcml2YXRlLmJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKLQlpZiAoIWF0OTF3ZHRfcHJpdmF0ZS5iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzLCBhYm9ydGluZy5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwl3ZHQtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CisJaWYgKElTX0VSUih3ZHQtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih3ZHQtPmJhc2UpOworCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWVyciA9IG9mX2F0OTF3ZHRfaW5pdChwZGV2LT5kZXYub2Zfbm9kZSwgd2R0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCi0JYXQ5MV93ZHRfZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Ci0Jd2F0Y2hkb2dfaW5pdF90aW1lb3V0KCZhdDkxX3dkdF9kZXYsIGhlYXJ0YmVhdCwgJnBkZXYtPmRldik7Ci0Jd2F0Y2hkb2dfc2V0X25vd2F5b3V0KCZhdDkxX3dkdF9kZXYsIG5vd2F5b3V0KTsKKwllcnIgPSBhdDkxX3dkdF9pbml0KHBkZXYsIHdkdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCS8qIFNldCB3YXRjaGRvZyAqLwotCXJlcyA9IGF0OTFfd2R0X3NldHRpbWVvdXQobXNfdG9fdGlja3MoV0RUX0hXX1RJTUVPVVQgKiAxMDAwKSk7Ci0JaWYgKHJlcykKLQkJcmV0dXJuIHJlczsKLQotCXJlcyA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmYXQ5MV93ZHRfZGV2KTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JYXQ5MXdkdF9wcml2YXRlLm5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIGF0OTFfd2R0X2Rldi50aW1lb3V0ICogSFo7Ci0Jc2V0dXBfdGltZXIoJmF0OTF3ZHRfcHJpdmF0ZS50aW1lciwgYXQ5MV9waW5nLCAwKTsKLQltb2RfdGltZXIoJmF0OTF3ZHRfcHJpdmF0ZS50aW1lciwgamlmZmllcyArIFdEVF9USU1FT1VUKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3ZHQpOwogCiAJcHJfaW5mbygiZW5hYmxlZCAoaGVhcnRiZWF0PSVkIHNlYywgbm93YXlvdXQ9JWQpXG4iLAotCQlhdDkxX3dkdF9kZXYudGltZW91dCwgbm93YXlvdXQpOworCQl3ZHQtPndkZC50aW1lb3V0LCB3ZHQtPm5vd2F5b3V0KTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZXhpdCBhdDkxd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZhdDkxX3dkdF9kZXYpOworCXN0cnVjdCBhdDkxd2R0ICp3ZHQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmd2R0LT53ZGQpOwogCiAJcHJfd2FybigiSSBxdWl0IG5vdywgaGFyZHdhcmUgd2lsbCBwcm9iYWJseSByZWJvb3QhXG4iKTsKLQlkZWxfdGltZXIoJmF0OTF3ZHRfcHJpdmF0ZS50aW1lcik7CisJZGVsX3RpbWVyKCZ3ZHQtPnRpbWVyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9iY21fa29uYV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYmNtX2tvbmFfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyNDgwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYmNtX2tvbmFfd2R0LmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworI2RlZmluZSBTRUNXRE9HX0NUUkxfUkVHCQkweDAwMDAwMDAwCisjZGVmaW5lIFNFQ1dET0dfQ09VTlRfUkVHCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgU0VDV0RPR19SRVNFUlZFRF9NQVNLCQkweDFkZmZmZmZmCisjZGVmaW5lIFNFQ1dET0dfV0RfTE9BRF9GTEFHCQkweDEwMDAwMDAwCisjZGVmaW5lIFNFQ1dET0dfRU5fTUFTSwkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgU0VDV0RPR19TUlNURU5fTUFTSwkJMHgwNDAwMDAwMAorI2RlZmluZSBTRUNXRE9HX1JFU19NQVNLCQkweDAwZjAwMDAwCisjZGVmaW5lIFNFQ1dET0dfQ09VTlRfTUFTSwkJMHgwMDBmZmZmZgorCisjZGVmaW5lIFNFQ1dET0dfTUFYX0NPVU5UCQlTRUNXRE9HX0NPVU5UX01BU0sKKyNkZWZpbmUgU0VDV0RPR19DTEtTX1NISUZUCQkyMAorI2RlZmluZSBTRUNXRE9HX01BWF9SRVMJCQkxNQorI2RlZmluZSBTRUNXRE9HX0RFRkFVTFRfUkVTT0xVVElPTgk0CisjZGVmaW5lIFNFQ1dET0dfTUFYX1RSWQkJCTEwMDAKKworI2RlZmluZSBTRUNTX1RPX1RJQ0tTKHgsIHcpCQkoKHgpIDw8ICh3KS0+cmVzb2x1dGlvbikKKyNkZWZpbmUgVElDS1NfVE9fU0VDUyh4LCB3KQkJKCh4KSA+PiAodyktPnJlc29sdXRpb24pCisKKyNkZWZpbmUgQkNNX0tPTkFfV0RUX05BTUUJCSJiY21fa29uYV93ZHQiCisKK3N0cnVjdCBiY21fa29uYV93ZHQgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwkvKgorCSAqIE9uZSB3YXRjaGRvZyB0aWNrIGlzIDEvKDJecmVzb2x1dGlvbikgc2Vjb25kcy4gUmVzb2x1dGlvbiBjYW4gdGFrZQorCSAqIHRoZSB2YWx1ZXMgMC0xNSwgbWVhbmluZyBvbmUgdGljayBjYW4gYmUgMXMgdG8gMzAuNTJ1cy4gT3VyIGRlZmF1bHQKKwkgKiByZXNvbHV0aW9uIG9mIDQgbWVhbnMgb25lIHRpY2sgaXMgNjIuNW1zLgorCSAqCisJICogVGhlIHdhdGNoZG9nIGNvdW50ZXIgaXMgMjAgYml0cy4gRGVwZW5kaW5nIG9uIHJlc29sdXRpb24sIHRoZSBtYXhpbXVtCisJICogY291bnRlciB2YWx1ZSBvZiAweGZmZmZmIGV4cGlyZXMgYWZ0ZXIgYWJvdXQgMTIgZGF5cyAocmVzb2x1dGlvbiAwKQorCSAqIGRvd24gdG8gb25seSAzMnMgKHJlc29sdXRpb24gMTUpLiBUaGUgZGVmYXVsdCByZXNvbHV0aW9uIG9mIDQgZ2l2ZXMKKwkgKiB1cyBhIG1heGltdW0gb2YgYWJvdXQgMTggaG91cnMgYW5kIDEyIG1pbnV0ZXMgYmVmb3JlIHRoZSB3YXRjaGRvZworCSAqIHRpbWVzIG91dC4KKwkgKi8KKwlpbnQgcmVzb2x1dGlvbjsKKwlzcGlubG9ja190IGxvY2s7CisjaWZkZWYgQ09ORklHX0JDTV9LT05BX1dEVF9ERUJVRworCXVuc2lnbmVkIGxvbmcgYnVzeV9jb3VudDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzOworI2VuZGlmCit9OworCitzdGF0aWMgaW50IHNlY3VyZV9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBiY21fa29uYV93ZHQgKndkdCwgdWludDMyX3Qgb2Zmc2V0KQoreworCXVpbnQzMl90IHZhbDsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBXRF9MT0FEX0ZMQUcgaXMgc2V0LCB0aGUgd2F0Y2hkb2cgY291bnRlciBmaWVsZCBpcyBiZWluZworCSAqIHVwZGF0ZWQgaW4gaGFyZHdhcmUuIE9uY2UgdGhlIFdEIHRpbWVyIGlzIHVwZGF0ZWQgaW4gaGFyZHdhcmUsIGl0CisJICogZ2V0cyBjbGVhcmVkLgorCSAqLworCWRvIHsKKwkJaWYgKHVubGlrZWx5KGNvdW50ID4gMSkpCisJCQl1ZGVsYXkoNSk7CisJCXZhbCA9IHJlYWRsX3JlbGF4ZWQod2R0LT5iYXNlICsgb2Zmc2V0KTsKKwkJY291bnQrKzsKKwl9IHdoaWxlICgodmFsICYgU0VDV0RPR19XRF9MT0FEX0ZMQUcpICYmIGNvdW50IDwgU0VDV0RPR19NQVhfVFJZKTsKKworI2lmZGVmIENPTkZJR19CQ01fS09OQV9XRFRfREVCVUcKKwkvKiBSZW1lbWJlciB0aGUgbWF4aW11bSBudW1iZXIgaXRlcmF0aW9ucyBkdWUgdG8gV0RfTE9BRF9GTEFHICovCisJaWYgKGNvdW50ID4gd2R0LT5idXN5X2NvdW50KQorCQl3ZHQtPmJ1c3lfY291bnQgPSBjb3VudDsKKyNlbmRpZgorCisJLyogVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3ZSByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZS4gKi8KKwlpZiAodmFsICYgU0VDV0RPR19XRF9MT0FEX0ZMQUcpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogV2UgYWx3YXlzIG1hc2sgb3V0IHJlc2VydmVkIGJpdHMuICovCisJdmFsICY9IFNFQ1dET0dfUkVTRVJWRURfTUFTSzsKKworCXJldHVybiB2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfQkNNX0tPTkFfV0RUX0RFQlVHCisKK3N0YXRpYyBpbnQgYmNtX2tvbmFfd2R0X2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgY3RsX3ZhbCwgY3VyX3ZhbCwgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJjbV9rb25hX3dkdCAqd2R0ID0gcy0+cHJpdmF0ZTsKKworCWlmICghd2R0KQorCQlyZXR1cm4gc2VxX3B1dHMocywgIk5vIGRldmljZSBwb2ludGVyXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKKwljdGxfdmFsID0gc2VjdXJlX3JlZ2lzdGVyX3JlYWQod2R0LCBTRUNXRE9HX0NUUkxfUkVHKTsKKwljdXJfdmFsID0gc2VjdXJlX3JlZ2lzdGVyX3JlYWQod2R0LCBTRUNXRE9HX0NPVU5UX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY3RsX3ZhbCA8IDAgfHwgY3VyX3ZhbCA8IDApIHsKKwkJcmV0ID0gc2VxX3B1dHMocywgIkVycm9yIGFjY2Vzc2luZyBoYXJkd2FyZVxuIik7CisJfSBlbHNlIHsKKwkJaW50IGN0bCwgY3VyLCBjdGxfc2VjLCBjdXJfc2VjLCByZXM7CisKKwkJY3RsID0gY3RsX3ZhbCAmIFNFQ1dET0dfQ09VTlRfTUFTSzsKKwkJcmVzID0gKGN0bF92YWwgJiBTRUNXRE9HX1JFU19NQVNLKSA+PiBTRUNXRE9HX0NMS1NfU0hJRlQ7CisJCWN1ciA9IGN1cl92YWwgJiBTRUNXRE9HX0NPVU5UX01BU0s7CisJCWN0bF9zZWMgPSBUSUNLU19UT19TRUNTKGN0bCwgd2R0KTsKKwkJY3VyX3NlYyA9IFRJQ0tTX1RPX1NFQ1MoY3VyLCB3ZHQpOworCQlyZXQgPSBzZXFfcHJpbnRmKHMsICJSZXNvbHV0aW9uOiAlZCAvICVkXG4iCisJCQkJIkNvbnRyb2w6ICVkIHMgLyAlZCAoJSN4KSB0aWNrc1xuIgorCQkJCSJDdXJyZW50OiAlZCBzIC8gJWQgKCUjeCkgdGlja3NcbiIKKwkJCQkiQnVzeSBjb3VudDogJWx1XG4iLCByZXMsCisJCQkJd2R0LT5yZXNvbHV0aW9uLCBjdGxfc2VjLCBjdGwsIGN0bCwgY3VyX3NlYywKKwkJCQljdXIsIGN1ciwgd2R0LT5idXN5X2NvdW50KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJjbV9rb25hX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBiY21fa29uYV93ZHRfZGJnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiY21fa29uYV9kYmdfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBiY21fa29uYV9kYmdfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgYmNtX2tvbmFfd2R0X2RlYnVnX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CisJc3RydWN0IGJjbV9rb25hX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIXdkdCkKKwkJcmV0dXJuOworCisJd2R0LT5kZWJ1Z2ZzID0gTlVMTDsKKworCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihCQ01fS09OQV9XRFRfTkFNRSwgTlVMTCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRpcikpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sIGRpciwgd2R0LAorCQkJCSZiY21fa29uYV9kYmdfb3BlcmF0aW9ucykpCisJCXdkdC0+ZGVidWdmcyA9IGRpcjsKKwllbHNlCisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOworfQorCitzdGF0aWMgdm9pZCBiY21fa29uYV93ZHRfZGVidWdfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY21fa29uYV93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHdkdCAmJiB3ZHQtPmRlYnVnZnMpIHsKKwkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHdkdC0+ZGVidWdmcyk7CisJCXdkdC0+ZGVidWdmcyA9IE5VTEw7CisJfQorfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBiY21fa29uYV93ZHRfZGVidWdfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KSB7fQorc3RhdGljIHZvaWQgYmNtX2tvbmFfd2R0X2RlYnVnX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikge30KKworI2VuZGlmIC8qIENPTkZJR19CQ01fS09OQV9XRFRfREVCVUcgKi8KKworc3RhdGljIGludCBiY21fa29uYV93ZHRfY3RybF9yZWdfbW9kaWZ5KHN0cnVjdCBiY21fa29uYV93ZHQgKndkdCwKKwkJCQkJdW5zaWduZWQgbWFzaywgdW5zaWduZWQgbmV3dmFsKQoreworCWludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHNlY3VyZV9yZWdpc3Rlcl9yZWFkKHdkdCwgU0VDV0RPR19DVFJMX1JFRyk7CisJaWYgKHZhbCA8IDApIHsKKwkJcmV0ID0gdmFsOworCX0gZWxzZSB7CisJCXZhbCAmPSB+bWFzazsKKwkJdmFsIHw9IG5ld3ZhbDsKKwkJd3JpdGVsX3JlbGF4ZWQodmFsLCB3ZHQtPmJhc2UgKyBTRUNXRE9HX0NUUkxfUkVHKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2tvbmFfd2R0X3NldF9yZXNvbHV0aW9uX3JlZyhzdHJ1Y3QgYmNtX2tvbmFfd2R0ICp3ZHQpCit7CisJaWYgKHdkdC0+cmVzb2x1dGlvbiA+IFNFQ1dET0dfTUFYX1JFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYmNtX2tvbmFfd2R0X2N0cmxfcmVnX21vZGlmeSh3ZHQsIFNFQ1dET0dfUkVTX01BU0ssCisJCQkJCXdkdC0+cmVzb2x1dGlvbiA8PCBTRUNXRE9HX0NMS1NfU0hJRlQpOworfQorCitzdGF0aWMgaW50IGJjbV9rb25hX3dkdF9zZXRfdGltZW91dF9yZWcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RvZywKKwkJCQkJdW5zaWduZWQgd2F0Y2hkb2dfZmxhZ3MpCit7CisJc3RydWN0IGJjbV9rb25hX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RvZyk7CisKKwlyZXR1cm4gYmNtX2tvbmFfd2R0X2N0cmxfcmVnX21vZGlmeSh3ZHQsIFNFQ1dET0dfQ09VTlRfTUFTSywKKwkJCQkJU0VDU19UT19USUNLUyh3ZG9nLT50aW1lb3V0LCB3ZHQpIHwKKwkJCQkJd2F0Y2hkb2dfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGJjbV9rb25hX3dkdF9zZXRfdGltZW91dChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZG9nLAorCXVuc2lnbmVkIGludCB0KQoreworCXdkb2ctPnRpbWVvdXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJjbV9rb25hX3dkdF9nZXRfdGltZWxlZnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RvZykKK3sKKwlzdHJ1Y3QgYmNtX2tvbmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZG9nKTsKKwlpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0LT5sb2NrLCBmbGFncyk7CisJdmFsID0gc2VjdXJlX3JlZ2lzdGVyX3JlYWQod2R0LCBTRUNXRE9HX0NPVU5UX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCXJldHVybiBUSUNLU19UT19TRUNTKHZhbCAmIFNFQ1dET0dfQ09VTlRfTUFTSywgd2R0KTsKK30KKworc3RhdGljIGludCBiY21fa29uYV93ZHRfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RvZykKK3sKKwlyZXR1cm4gYmNtX2tvbmFfd2R0X3NldF90aW1lb3V0X3JlZyh3ZG9nLAorCQkJCQlTRUNXRE9HX0VOX01BU0sgfCBTRUNXRE9HX1NSU1RFTl9NQVNLKTsKK30KKworc3RhdGljIGludCBiY21fa29uYV93ZHRfc3RvcChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZG9nKQoreworCXN0cnVjdCBiY21fa29uYV93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkb2cpOworCisJcmV0dXJuIGJjbV9rb25hX3dkdF9jdHJsX3JlZ19tb2RpZnkod2R0LCBTRUNXRE9HX0VOX01BU0sgfAorCQkJCQkgICAgU0VDV0RPR19TUlNURU5fTUFTSywgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIGJjbV9rb25hX3dkdF9vcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnN0YXJ0ID0JYmNtX2tvbmFfd2R0X3N0YXJ0LAorCS5zdG9wID0JCWJjbV9rb25hX3dkdF9zdG9wLAorCS5zZXRfdGltZW91dCA9CWJjbV9rb25hX3dkdF9zZXRfdGltZW91dCwKKwkuZ2V0X3RpbWVsZWZ0ID0JYmNtX2tvbmFfd2R0X2dldF90aW1lbGVmdCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBiY21fa29uYV93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucyA9CVdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCVdESU9GX0tFRVBBTElWRVBJTkcsCisJLmlkZW50aXR5ID0JIkJyb2FkY29tIEtvbmEgV2F0Y2hkb2cgVGltZXIiLAorfTsKKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgYmNtX2tvbmFfd2R0X3dkZCA9IHsKKwkuaW5mbyA9CQkmYmNtX2tvbmFfd2R0X2luZm8sCisJLm9wcyA9CQkmYmNtX2tvbmFfd2R0X29wcywKKwkubWluX3RpbWVvdXQgPQkxLAorCS5tYXhfdGltZW91dCA9CVNFQ1dET0dfTUFYX0NPVU5UID4+IFNFQ1dET0dfREVGQVVMVF9SRVNPTFVUSU9OLAorCS50aW1lb3V0ID0JU0VDV0RPR19NQVhfQ09VTlQgPj4gU0VDV0RPR19ERUZBVUxUX1JFU09MVVRJT04sCit9OworCitzdGF0aWMgdm9pZCBiY21fa29uYV93ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwliY21fa29uYV93ZHRfc3RvcCgmYmNtX2tvbmFfd2R0X3dkZCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2tvbmFfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYmNtX2tvbmFfd2R0ICp3ZHQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCXdkdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZHQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl3ZHQtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIod2R0LT5iYXNlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3ZHQtPnJlc29sdXRpb24gPSBTRUNXRE9HX0RFRkFVTFRfUkVTT0xVVElPTjsKKwlyZXQgPSBiY21fa29uYV93ZHRfc2V0X3Jlc29sdXRpb25fcmVnKHdkdCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcmVzb2x1dGlvbiAoZXJyb3I6ICVkKSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJndkdC0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2R0KTsKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSgmYmNtX2tvbmFfd2R0X3dkZCwgd2R0KTsKKworCXJldCA9IGJjbV9rb25hX3dkdF9zZXRfdGltZW91dF9yZWcoJmJjbV9rb25hX3dkdF93ZGQsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgc2V0IHdhdGNoZG9nIHRpbWVvdXQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UoJmJjbV9rb25hX3dkdF93ZGQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgd2F0Y2hkb2cgZGV2aWNlIik7CisJCXJldHVybiByZXQ7CisJfQorCisJYmNtX2tvbmFfd2R0X2RlYnVnX2luaXQocGRldik7CisJZGV2X2RiZyhkZXYsICJCcm9hZGNvbSBLb25hIFdhdGNoZG9nIFRpbWVyIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fa29uYV93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJYmNtX2tvbmFfd2R0X2RlYnVnX2V4aXQocGRldik7CisJYmNtX2tvbmFfd2R0X3NodXRkb3duKHBkZXYpOworCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZiY21fa29uYV93ZHRfd2RkKTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJXYXRjaGRvZyBkcml2ZXIgZGlzYWJsZWQiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21fa29uYV93ZHRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sa29uYS13ZHQiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbV9rb25hX3dkdF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV9rb25hX3dkdF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJCS5uYW1lID0gQkNNX0tPTkFfV0RUX05BTUUsCisJCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9rb25hX3dkdF9vZl9tYXRjaCwKKwkJICB9LAorCS5wcm9iZSA9IGJjbV9rb25hX3dkdF9wcm9iZSwKKwkucmVtb3ZlID0gYmNtX2tvbmFfd2R0X3JlbW92ZSwKKwkuc2h1dGRvd24gPSBiY21fa29uYV93ZHRfc2h1dGRvd24sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbV9rb25hX3dkdF9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgQkNNX0tPTkFfV0RUX05BTUUpOworTU9EVUxFX0FVVEhPUigiTWFya3VzIE1heWVyIDxtbWF5ZXJAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBLb25hIFdhdGNoZG9nIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9kYXZpbmNpX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9kYXZpbmNpX3dkdC5jCmluZGV4IDEyNTkxZjYuLmIxYmFlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2RhdmluY2lfd2R0LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogV2F0Y2hkb2cgZHJpdmVyIGZvciBEYVZpbmNpIERNNjQ0eC9ETTY0NnggcHJvY2Vzc29ycwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIFRleGFzIEluc3RydW1lbnRzLgogICoKICAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCiAgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCkBAIC0xNSwxOCArMTUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNkZWZpbmUgTU9EVUxFX05BTUUgIkRBVklOQ0ktV0RUOiAiCkBAIC02MSwxNDIgKzU1LDEwMyBAQAogI2RlZmluZSBXREtFWV9TRVEwCQkoMHhhNWM2IDw8IDE2KQogI2RlZmluZSBXREtFWV9TRVExCQkoMHhkYTdlIDw8IDE2KQogCi1zdGF0aWMgaW50IGhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUOworc3RhdGljIGludCBoZWFydGJlYXQ7CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9fbG9jayk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOwotI2RlZmluZSBXRFRfSU5fVVNFICAgICAgICAwCi0jZGVmaW5lIFdEVF9PS19UT19DTE9TRSAgIDEKLSNkZWZpbmUgV0RUX1JFR0lPTl9JTklURUQgMgotI2RlZmluZSBXRFRfREVWSUNFX0lOSVRFRCAzCisvKgorICogc3RydWN0IHRvIGhvbGQgZGF0YSBmb3IgZWFjaCBXRFQgZGV2aWNlCisgKiBAYmFzZSAtIGJhc2UgaW8gYWRkcmVzcyBvZiBXRCBkZXZpY2UKKyAqIEBjbGsgLSBzb3VyY2UgY2xvY2sgb2YgV0RUCisgKiBAd2RkIC0gaG9sZCB3YXRjaGRvZyBkZXZpY2UgYXMgaXMgaW4gV0RUIGNvcmUKKyAqLworc3RydWN0IGRhdmluY2lfd2R0X2RldmljZSB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UJd2RkOworfTsKIAotc3RhdGljIHZvaWQgX19pb21lbQkqd2R0X2Jhc2U7Ci1zdHJ1Y3QgY2xrCQkqd2R0X2NsazsKLQotc3RhdGljIHZvaWQgd2R0X3NlcnZpY2Uodm9pZCkKLXsKLQlzcGluX2xvY2soJmlvX2xvY2spOwotCi0JLyogcHV0IHdhdGNoZG9nIGluIHNlcnZpY2Ugc3RhdGUgKi8KLQlpb3dyaXRlMzIoV0RLRVlfU0VRMCwgd2R0X2Jhc2UgKyBXRFRDUik7Ci0JLyogcHV0IHdhdGNoZG9nIGluIGFjdGl2ZSBzdGF0ZSAqLwotCWlvd3JpdGUzMihXREtFWV9TRVExLCB3ZHRfYmFzZSArIFdEVENSKTsKLQotCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgd2R0X2VuYWJsZSh2b2lkKQorc3RhdGljIGludCBkYXZpbmNpX3dkdF9zdGFydChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7CiAJdTMyIHRnY3I7CiAJdTMyIHRpbWVyX21hcmdpbjsKIAl1bnNpZ25lZCBsb25nIHdkdF9mcmVxOworCXN0cnVjdCBkYXZpbmNpX3dkdF9kZXZpY2UgKmRhdmluY2lfd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKIAotCXdkdF9mcmVxID0gY2xrX2dldF9yYXRlKHdkdF9jbGspOwotCi0Jc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ZHRfZnJlcSA9IGNsa19nZXRfcmF0ZShkYXZpbmNpX3dkdC0+Y2xrKTsKIAogCS8qIGRpc2FibGUsIGludGVybmFsIGNsb2NrIHNvdXJjZSAqLwotCWlvd3JpdGUzMigwLCB3ZHRfYmFzZSArIFRDUik7CisJaW93cml0ZTMyKDAsIGRhdmluY2lfd2R0LT5iYXNlICsgVENSKTsKIAkvKiByZXNldCB0aW1lciwgc2V0IG1vZGUgdG8gNjQtYml0IHdhdGNoZG9nLCBhbmQgdW5yZXNldCAqLwotCWlvd3JpdGUzMigwLCB3ZHRfYmFzZSArIFRHQ1IpOworCWlvd3JpdGUzMigwLCBkYXZpbmNpX3dkdC0+YmFzZSArIFRHQ1IpOwogCXRnY3IgPSBUSU1NT0RFXzY0QklUX1dET0cgfCBUSU0xMlJTX1VOUkVTRVQgfCBUSU0zNFJTX1VOUkVTRVQ7Ci0JaW93cml0ZTMyKHRnY3IsIHdkdF9iYXNlICsgVEdDUik7CisJaW93cml0ZTMyKHRnY3IsIGRhdmluY2lfd2R0LT5iYXNlICsgVEdDUik7CiAJLyogY2xlYXIgY291bnRlciByZWdzICovCi0JaW93cml0ZTMyKDAsIHdkdF9iYXNlICsgVElNMTIpOwotCWlvd3JpdGUzMigwLCB3ZHRfYmFzZSArIFRJTTM0KTsKKwlpb3dyaXRlMzIoMCwgZGF2aW5jaV93ZHQtPmJhc2UgKyBUSU0xMik7CisJaW93cml0ZTMyKDAsIGRhdmluY2lfd2R0LT5iYXNlICsgVElNMzQpOwogCS8qIHNldCB0aW1lb3V0IHBlcmlvZCAqLwotCXRpbWVyX21hcmdpbiA9ICgoKHU2NCloZWFydGJlYXQgKiB3ZHRfZnJlcSkgJiAweGZmZmZmZmZmKTsKLQlpb3dyaXRlMzIodGltZXJfbWFyZ2luLCB3ZHRfYmFzZSArIFBSRDEyKTsKLQl0aW1lcl9tYXJnaW4gPSAoKCh1NjQpaGVhcnRiZWF0ICogd2R0X2ZyZXEpID4+IDMyKTsKLQlpb3dyaXRlMzIodGltZXJfbWFyZ2luLCB3ZHRfYmFzZSArIFBSRDM0KTsKKwl0aW1lcl9tYXJnaW4gPSAoKCh1NjQpd2RkLT50aW1lb3V0ICogd2R0X2ZyZXEpICYgMHhmZmZmZmZmZik7CisJaW93cml0ZTMyKHRpbWVyX21hcmdpbiwgZGF2aW5jaV93ZHQtPmJhc2UgKyBQUkQxMik7CisJdGltZXJfbWFyZ2luID0gKCgodTY0KXdkZC0+dGltZW91dCAqIHdkdF9mcmVxKSA+PiAzMik7CisJaW93cml0ZTMyKHRpbWVyX21hcmdpbiwgZGF2aW5jaV93ZHQtPmJhc2UgKyBQUkQzNCk7CiAJLyogZW5hYmxlIHJ1biBjb250aW51b3VzbHkgKi8KLQlpb3dyaXRlMzIoRU5BTU9ERTEyX1BFUklPRElDLCB3ZHRfYmFzZSArIFRDUik7CisJaW93cml0ZTMyKEVOQU1PREUxMl9QRVJJT0RJQywgZGF2aW5jaV93ZHQtPmJhc2UgKyBUQ1IpOwogCS8qIE9uY2UgdGhlIFdEVCBpcyBpbiBwcmUtYWN0aXZlIHN0YXRlIHdyaXRlIHRvCiAJICogVElNMTIsIFRJTTM0LCBQUkQxMiwgUFJEMzQsIFRDUiwgVEdDUiwgV0RUQ1IgYXJlCiAJICogd3JpdGUgcHJvdGVjdGVkIChleGNlcHQgZm9yIHRoZSBXREtFWSBmaWVsZCkKIAkgKi8KIAkvKiBwdXQgd2F0Y2hkb2cgaW4gcHJlLWFjdGl2ZSBzdGF0ZSAqLwotCWlvd3JpdGUzMihXREtFWV9TRVEwIHwgV0RFTiwgd2R0X2Jhc2UgKyBXRFRDUik7CisJaW93cml0ZTMyKFdES0VZX1NFUTAgfCBXREVOLCBkYXZpbmNpX3dkdC0+YmFzZSArIFdEVENSKTsKIAkvKiBwdXQgd2F0Y2hkb2cgaW4gYWN0aXZlIHN0YXRlICovCi0JaW93cml0ZTMyKFdES0VZX1NFUTEgfCBXREVOLCB3ZHRfYmFzZSArIFdEVENSKTsKLQotCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKLX0KLQotc3RhdGljIGludCBkYXZpbmNpX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdEVF9JTl9VU0UsICZ3ZHRfc3RhdHVzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXdkdF9lbmFibGUoKTsKLQotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIHNzaXplX3QKLWRhdmluY2lfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLAotCQkgIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAobGVuKQotCQl3ZHRfc2VydmljZSgpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewotCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORywKLQkuaWRlbnRpdHkgPSAiRGFWaW5jaSBXYXRjaGRvZyIsCi19OwotCi1zdGF0aWMgbG9uZyBkYXZpbmNpX3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJldCA9IC1FTk9UVFk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKLQkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywgJmlkZW50LAotCQkJCSAgIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRElPQ19HRVRTVEFUVVM6Ci0JY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgotCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJd2R0X3NlcnZpY2UoKTsKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJldCA9IHB1dF91c2VyKGhlYXJ0YmVhdCwgKGludCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jd2R0X3NlcnZpY2UoKTsKLQljbGVhcl9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpOwotCisJaW93cml0ZTMyKFdES0VZX1NFUTEgfCBXREVOLCBkYXZpbmNpX3dkdC0+YmFzZSArIFdEVENSKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGF2aW5jaV93ZHRfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotCS53cml0ZSA9IGRhdmluY2lfd2R0X3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bCA9IGRhdmluY2lfd2R0X2lvY3RsLAotCS5vcGVuID0gZGF2aW5jaV93ZHRfb3BlbiwKLQkucmVsZWFzZSA9IGRhdmluY2lfd2R0X3JlbGVhc2UsCitzdGF0aWMgaW50IGRhdmluY2lfd2R0X3Bpbmcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCBkYXZpbmNpX3dkdF9kZXZpY2UgKmRhdmluY2lfd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKworCS8qIHB1dCB3YXRjaGRvZyBpbiBzZXJ2aWNlIHN0YXRlICovCisJaW93cml0ZTMyKFdES0VZX1NFUTAsIGRhdmluY2lfd2R0LT5iYXNlICsgV0RUQ1IpOworCS8qIHB1dCB3YXRjaGRvZyBpbiBhY3RpdmUgc3RhdGUgKi8KKwlpb3dyaXRlMzIoV0RLRVlfU0VRMSwgZGF2aW5jaV93ZHQtPmJhc2UgKyBXRFRDUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGF2aW5jaV93ZHRfZ2V0X3RpbWVsZWZ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwl1NjQgdGltZXJfY291bnRlcjsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgZGF2aW5jaV93ZHRfZGV2aWNlICpkYXZpbmNpX3dkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisKKwkvKiBpZiB0aW1lb3V0IGhhcyBvY2N1cmVkIHRoZW4gcmV0dXJuIDAgKi8KKwl2YWwgPSBpb3JlYWQzMihkYXZpbmNpX3dkdC0+YmFzZSArIFdEVENSKTsKKwlpZiAodmFsICYgV0RGTEFHKQorCQlyZXR1cm4gMDsKKworCWZyZXEgPSBjbGtfZ2V0X3JhdGUoZGF2aW5jaV93ZHQtPmNsayk7CisKKwlpZiAoIWZyZXEpCisJCXJldHVybiAwOworCisJdGltZXJfY291bnRlciA9IGlvcmVhZDMyKGRhdmluY2lfd2R0LT5iYXNlICsgVElNMTIpOworCXRpbWVyX2NvdW50ZXIgfD0gKCh1NjQpaW9yZWFkMzIoZGF2aW5jaV93ZHQtPmJhc2UgKyBUSU0zNCkgPDwgMzIpOworCisJZG9fZGl2KHRpbWVyX2NvdW50ZXIsIGZyZXEpOworCisJcmV0dXJuIHdkZC0+dGltZW91dCAtIHRpbWVyX2NvdW50ZXI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBkYXZpbmNpX3dkdF9pbmZvID0geworCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuaWRlbnRpdHkgPSAiRGFWaW5jaS9LZXlzdG9uZSBXYXRjaGRvZyIsCiB9OwogCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZGF2aW5jaV93ZHRfbWlzY2RldiA9IHsKLQkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZSA9ICJ3YXRjaGRvZyIsCi0JLmZvcHMgPSAmZGF2aW5jaV93ZHRfZm9wcywKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIGRhdmluY2lfd2R0X29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnN0YXJ0CQk9IGRhdmluY2lfd2R0X3N0YXJ0LAorCS5zdG9wCQk9IGRhdmluY2lfd2R0X3BpbmcsCisJLnBpbmcJCT0gZGF2aW5jaV93ZHRfcGluZywKKwkuZ2V0X3RpbWVsZWZ0CT0gZGF2aW5jaV93ZHRfZ2V0X3RpbWVsZWZ0LAogfTsKIAogc3RhdGljIGludCBkYXZpbmNpX3dkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMjA0LDM3ICsxNTksNTMgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCByZXNvdXJjZSAgKndkdF9tZW07CisJc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkOworCXN0cnVjdCBkYXZpbmNpX3dkdF9kZXZpY2UgKmRhdmluY2lfd2R0OwogCi0Jd2R0X2NsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOwotCWlmIChXQVJOX09OKElTX0VSUih3ZHRfY2xrKSkpCi0JCXJldHVybiBQVFJfRVJSKHdkdF9jbGspOworCWRhdmluY2lfd2R0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXZpbmNpX3dkdCksIEdGUF9LRVJORUwpOworCWlmICghZGF2aW5jaV93ZHQpCisJCXJldHVybiAtRU5PTUVNOwogCi0JY2xrX3ByZXBhcmVfZW5hYmxlKHdkdF9jbGspOworCWRhdmluY2lfd2R0LT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKKwlpZiAoV0FSTl9PTihJU19FUlIoZGF2aW5jaV93ZHQtPmNsaykpKQorCQlyZXR1cm4gUFRSX0VSUihkYXZpbmNpX3dkdC0+Y2xrKTsKIAotCWlmIChoZWFydGJlYXQgPCAxIHx8IGhlYXJ0YmVhdCA+IE1BWF9IRUFSVEJFQVQpCi0JCWhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUOworCWNsa19wcmVwYXJlX2VuYWJsZShkYXZpbmNpX3dkdC0+Y2xrKTsKIAotCWRldl9pbmZvKGRldiwgImhlYXJ0YmVhdCAlZCBzZWNcbiIsIGhlYXJ0YmVhdCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF2aW5jaV93ZHQpOworCisJd2RkCQkJPSAmZGF2aW5jaV93ZHQtPndkZDsKKwl3ZGQtPmluZm8JCT0gJmRhdmluY2lfd2R0X2luZm87CisJd2RkLT5vcHMJCT0gJmRhdmluY2lfd2R0X29wczsKKwl3ZGQtPm1pbl90aW1lb3V0CT0gMTsKKwl3ZGQtPm1heF90aW1lb3V0CT0gTUFYX0hFQVJUQkVBVDsKKwl3ZGQtPnRpbWVvdXQJCT0gREVGQVVMVF9IRUFSVEJFQVQ7CisKKwl3YXRjaGRvZ19pbml0X3RpbWVvdXQod2RkLCBoZWFydGJlYXQsIGRldik7CisKKwlkZXZfaW5mbyhkZXYsICJoZWFydGJlYXQgJWQgc2VjXG4iLCB3ZGQtPnRpbWVvdXQpOworCisJd2F0Y2hkb2dfc2V0X2RydmRhdGEod2RkLCBkYXZpbmNpX3dkdCk7CisJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KHdkZCwgMSk7CiAKIAl3ZHRfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQl3ZHRfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHdkdF9tZW0pOwotCWlmIChJU19FUlIod2R0X2Jhc2UpKQotCQlyZXR1cm4gUFRSX0VSUih3ZHRfYmFzZSk7CisJZGF2aW5jaV93ZHQtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCB3ZHRfbWVtKTsKKwlpZiAoSVNfRVJSKGRhdmluY2lfd2R0LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF2aW5jaV93ZHQtPmJhc2UpOwogCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmZGF2aW5jaV93ZHRfbWlzY2Rldik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOwotCX0gZWxzZSB7Ci0JCXNldF9iaXQoV0RUX0RFVklDRV9JTklURUQsICZ3ZHRfc3RhdHVzKTsKLQl9CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHdkZCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHJlZ2lzdGVyIHdhdGNoZG9nIGRldmljZVxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRhdmluY2lfd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCW1pc2NfZGVyZWdpc3RlcigmZGF2aW5jaV93ZHRfbWlzY2Rldik7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdkdF9jbGspOworCXN0cnVjdCBkYXZpbmNpX3dkdF9kZXZpY2UgKmRhdmluY2lfd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmZGF2aW5jaV93ZHQtPndkZCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdmluY2lfd2R0LT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2R3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9kd193ZHQuYwppbmRleCBhNDZmNWM3Li5lZTRmODZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2R3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZHdfd2R0LmMKQEAgLTgsNyArOCw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZHJpdmVyIGZvciB0aGUgU3lub3BzeXMgRGVzaWduV2FyZSB3YXRjaGRvZyBkZXZpY2UKLSAqIGluIHRoZSBtYW55IEFSTSBzdWJzeXN0ZW1zLiBUaGUgd2F0Y2hkb2cgaGFzIDE2IGRpZmZlcmVudCB0aW1lb3V0IHBlcmlvZHMKKyAqIGluIHRoZSBtYW55IHN1YnN5c3RlbXMuIFRoZSB3YXRjaGRvZyBoYXMgMTYgZGlmZmVyZW50IHRpbWVvdXQgcGVyaW9kcwogICogYW5kIHRoZXNlIGFyZSBhIGZ1bmN0aW9uIG9mIHRoZSBpbnB1dCBjbG9jayBmcmVxdWVuY3kuCiAgKgogICogVGhlIERlc2lnbldhcmUgd2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBpdCBoYXMgYmVlbiBzdGFydGVkIHNvIHdlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2dwaW9fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2dwaW9fd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYTllMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZ3Bpb193ZHQuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIERyaXZlciBmb3Igd2F0Y2hkb2cgZGV2aWNlIGNvbnRyb2xsZWQgdGhyb3VnaCBHUElPLWxpbmUKKyAqCisgKiBBdXRob3I6IDIwMTMsIEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorCisjZGVmaW5lIFNPRlRfVElNRU9VVF9NSU4JMQorI2RlZmluZSBTT0ZUX1RJTUVPVVRfREVGCTYwCisjZGVmaW5lIFNPRlRfVElNRU9VVF9NQVgJMHhmZmZmCisKK2VudW0geworCUhXX0FMR09fVE9HR0xFLAorCUhXX0FMR09fTEVWRUwsCit9OworCitzdHJ1Y3QgZ3Bpb193ZHRfcHJpdiB7CisJaW50CQkJZ3BpbzsKKwlib29sCQkJYWN0aXZlX2xvdzsKKwlib29sCQkJc3RhdGU7CisJdW5zaWduZWQgaW50CQlod19hbGdvOworCXVuc2lnbmVkIGludAkJaHdfbWFyZ2luOworCXVuc2lnbmVkIGxvbmcJCWxhc3RfamlmZmllczsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJbm90aWZpZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IHdhdGNoZG9nX2RldmljZQl3ZGQ7Cit9OworCitzdGF0aWMgdm9pZCBncGlvX3dkdF9kaXNhYmxlKHN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2KQoreworCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHByaXYtPmdwaW8sICFwcml2LT5hY3RpdmVfbG93KTsKKworCS8qIFB1dCBHUElPIGJhY2sgdG8gdHJpc3RhdGUgKi8KKwlpZiAocHJpdi0+aHdfYWxnbyA9PSBIV19BTEdPX1RPR0dMRSkKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocHJpdi0+Z3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb193ZHRfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKworCXByaXYtPnN0YXRlID0gcHJpdi0+YWN0aXZlX2xvdzsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQocHJpdi0+Z3BpbywgcHJpdi0+c3RhdGUpOworCXByaXYtPmxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgcHJpdi0+bGFzdF9qaWZmaWVzICsgcHJpdi0+aHdfbWFyZ2luKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwaW9fd2R0X3N0b3Aoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKworCW1vZF90aW1lcigmcHJpdi0+dGltZXIsIDApOworCWdwaW9fd2R0X2Rpc2FibGUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgZ3Bpb193ZHRfcHJpdiAqcHJpdiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisKKwlwcml2LT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb193ZHRfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkLCB1bnNpZ25lZCBpbnQgdCkKK3sKKwl3ZGQtPnRpbWVvdXQgPSB0OworCisJcmV0dXJuIGdwaW9fd2R0X3Bpbmcod2RkKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb193ZHRfaHdwaW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQgPSAoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKWRhdGE7CisJc3RydWN0IGdwaW9fd2R0X3ByaXYgKnByaXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+bGFzdF9qaWZmaWVzICsKKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMod2RkLT50aW1lb3V0ICogMTAwMCkpKSB7CisJCWRldl9jcml0KHdkZC0+ZGV2LCAiVGltZXIgZXhwaXJlZC4gU3lzdGVtIHdpbGwgcmVib290IHNvb24hXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlc3RhcnQgdGltZXIgKi8KKwltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgcHJpdi0+aHdfbWFyZ2luKTsKKworCXN3aXRjaCAocHJpdi0+aHdfYWxnbykgeworCWNhc2UgSFdfQUxHT19UT0dHTEU6CisJCS8qIFRvZ2dsZSBvdXRwdXQgcGluICovCisJCXByaXYtPnN0YXRlID0gIXByaXYtPnN0YXRlOworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwcml2LT5ncGlvLCBwcml2LT5zdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgSFdfQUxHT19MRVZFTDoKKwkJLyogUHVsc2UgKi8KKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocHJpdi0+Z3BpbywgIXByaXYtPmFjdGl2ZV9sb3cpOworCQl1ZGVsYXkoMSk7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHByaXYtPmdwaW8sIHByaXYtPmFjdGl2ZV9sb3cpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb193ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkgICAgICAgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgZ3Bpb193ZHRfcHJpdiwKKwkJCQkJCSAgbm90aWZpZXIpOworCisJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgMCk7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFNZU19IQUxUOgorCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJZ3Bpb193ZHRfZGlzYWJsZShwcml2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gZ3Bpb193ZHRfaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9NQUdJQ0NMT1NFIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQkgIFdESU9GX1NFVFRJTUVPVVQsCisJLmlkZW50aXR5CT0gIkdQSU8gV2F0Y2hkb2ciLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19vcHMgZ3Bpb193ZHRfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuc3RhcnQJCT0gZ3Bpb193ZHRfc3RhcnQsCisJLnN0b3AJCT0gZ3Bpb193ZHRfc3RvcCwKKwkucGluZwkJPSBncGlvX3dkdF9waW5nLAorCS5zZXRfdGltZW91dAk9IGdwaW9fd2R0X3NldF90aW1lb3V0LAorfTsKKworc3RhdGljIGludCBncGlvX3dkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2OworCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaHdfbWFyZ2luOworCXVuc2lnbmVkIGxvbmcgZiA9IDA7CisJY29uc3QgY2hhciAqYWxnbzsKKwlpbnQgcmV0OworCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+Z3BpbyA9IG9mX2dldF9ncGlvX2ZsYWdzKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmZmxhZ3MpOworCWlmICghZ3Bpb19pc192YWxpZChwcml2LT5ncGlvKSkKKwkJcmV0dXJuIHByaXYtPmdwaW87CisKKwlwcml2LT5hY3RpdmVfbG93ID0gZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1c7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwgImh3X2FsZ28iLCAmYWxnbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIXN0cm5jbXAoYWxnbywgInRvZ2dsZSIsIDYpKSB7CisJCXByaXYtPmh3X2FsZ28gPSBIV19BTEdPX1RPR0dMRTsKKwkJZiA9IEdQSU9GX0lOOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYWxnbywgImxldmVsIiwgNSkpIHsKKwkJcHJpdi0+aHdfYWxnbyA9IEhXX0FMR09fTEVWRUw7CisJCWYgPSBwcml2LT5hY3RpdmVfbG93ID8gR1BJT0ZfT1VUX0lOSVRfSElHSCA6IEdQSU9GX09VVF9JTklUX0xPVzsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwgcHJpdi0+Z3BpbywgZiwKKwkJCQkgICAgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAiaHdfbWFyZ2luX21zIiwgJmh3X21hcmdpbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKiBEaXNhbGxvdyB2YWx1ZXMgbG93ZXIgdGhhbiAyIGFuZCBoaWdoZXIgdGhhbiA2NTUzNSBtcyAqLworCWlmIChod19tYXJnaW4gPCAyIHx8IGh3X21hcmdpbiA+IDY1NTM1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFVzZSBzYWZlIHZhbHVlICgxLzIgb2YgcmVhbCB0aW1lb3V0KSAqLworCXByaXYtPmh3X21hcmdpbiA9IG1zZWNzX3RvX2ppZmZpZXMoaHdfbWFyZ2luIC8gMik7CisKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSgmcHJpdi0+d2RkLCBwcml2KTsKKworCXByaXYtPndkZC5pbmZvCQk9ICZncGlvX3dkdF9pZGVudDsKKwlwcml2LT53ZGQub3BzCQk9ICZncGlvX3dkdF9vcHM7CisJcHJpdi0+d2RkLm1pbl90aW1lb3V0CT0gU09GVF9USU1FT1VUX01JTjsKKwlwcml2LT53ZGQubWF4X3RpbWVvdXQJPSBTT0ZUX1RJTUVPVVRfTUFYOworCisJaWYgKHdhdGNoZG9nX2luaXRfdGltZW91dCgmcHJpdi0+d2RkLCAwLCAmcGRldi0+ZGV2KSA8IDApCisJCXByaXYtPndkZC50aW1lb3V0ID0gU09GVF9USU1FT1VUX0RFRjsKKworCXNldHVwX3RpbWVyKCZwcml2LT50aW1lciwgZ3Bpb193ZHRfaHdwaW5nLCAodW5zaWduZWQgbG9uZykmcHJpdi0+d2RkKTsKKworCXJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmcHJpdi0+d2RkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGdwaW9fd2R0X25vdGlmeV9zeXM7CisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwcml2LT5ub3RpZmllcik7CisJaWYgKHJldCkKKwkJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJnByaXYtPndkZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdwaW9fd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvX3dkdF9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+dGltZXIpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwcml2LT5ub3RpZmllcik7CisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJnByaXYtPndkZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3Bpb193ZHRfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJsaW51eCx3ZHQtZ3BpbyIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZ3Bpb193ZHRfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb193ZHRfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCQk9ICJncGlvLXdkdCIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gZ3Bpb193ZHRfZHRfaWRzLAorCX0sCisJLnByb2JlCT0gZ3Bpb193ZHRfcHJvYmUsCisJLnJlbW92ZQk9IGdwaW9fd2R0X3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGdwaW9fd2R0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gV2F0Y2hkb2ciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCA0NWI5NzlkLi4yYjc1ZThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC0zOSw3ICszOSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0hQV0RUX05NSV9ERUNPRElORyAqLwogI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAotI2RlZmluZSBIUFdEVF9WRVJTSU9OCQkJIjEuMy4yIgorI2RlZmluZSBIUFdEVF9WRVJTSU9OCQkJIjEuMy4zIgogI2RlZmluZSBTRUNTX1RPX1RJQ0tTKHNlY3MpCQkoKHNlY3MpICogMTAwMCAvIDEyOCkKICNkZWZpbmUgVElDS1NfVE9fU0VDUyh0aWNrcykJCSgodGlja3MpICogMTI4IC8gMTAwMCkKICNkZWZpbmUgSFBXRFRfTUFYX1RJTUVSCQkJVElDS1NfVE9fU0VDUyg2NTUzNSkKQEAgLTU1LDcgKzU1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmhwd2R0X3RpbWVyX3JlZzsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmhwd2R0X3RpbWVyX2NvbjsKIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGhwd2R0X2RldmljZXMpID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhwd2R0X2RldmljZXNbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4QjIwMykgfSwJLyogaUxPMiAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0hQLCAweDMzMDYpIH0sCS8qIGlMTzMgKi8KIAl7MH0sCQkJLyogdGVybWluYXRlIGxpc3QgKi8KQEAgLTUwMSw4ICs1MDEsMTMgQEAKIAkJCQkiYnV0IHVuYWJsZSB0byBkZXRlcm1pbmUgc291cmNlLlxuIik7CiAJCX0KIAl9Ci0JcGFuaWMoIkFuIE5NSSBvY2N1cnJlZCwgcGxlYXNlIHNlZSB0aGUgSW50ZWdyYXRlZCAiCi0JCSJNYW5hZ2VtZW50IExvZyBmb3IgZGV0YWlscy5cbiIpOworCXBhbmljKCJBbiBOTUkgb2NjdXJyZWQuIERlcGVuZGluZyBvbiB5b3VyIHN5c3RlbSB0aGUgcmVhc29uICIKKwkJImZvciB0aGUgTk1JIGlzIGxvZ2dlZCBpbiBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgIgorCQkicmVzb3VyY2VzOlxuIgorCQkiMS4gSW50ZWdyYXRlZCBNYW5hZ2VtZW50IExvZyAoSU1MKVxuIgorCQkiMi4gT0EgU3lzbG9nXG4iCisJCSIzLiBPQSBGb3J3YXJkIFByb2dyZXNzIExvZ1xuIgorCQkiNC4gaUxPIEV2ZW50IExvZyIpOwogCiBvdXQ6CiAJcmV0dXJuIE5NSV9ET05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jIGIvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jCmluZGV4IGE3MmZlOTMuLjI1YTJiZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaTYzMDBlc2IuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2k2MzAwZXNiLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogLyoKICAqIERhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCiAgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShlc2JfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXNiX3BjaV90YmxbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfOSksIH0sCiAJeyAwLCB9LCAgICAgICAgICAgICAgICAgLyogRW5kIG9mIGxpc3QgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lteDJfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lteDJfd2R0LmMKaW5kZXggYjQ3ODZiYy4uZGQ1MWQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pbXgyX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW14Ml93ZHQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIFdhdGNoZG9nIGRyaXZlciBmb3IgSU1YMiBhbmQgbGF0ZXIgcHJvY2Vzc29ycwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMTAgV29sZnJhbSBTYW5nLCBQZW5ndXRyb25peCBlLksuIDx3LnNhbmdAcGVuZ3V0cm9uaXguZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogc29tZSBwYXJ0cyBhZGFwdGVkIGJ5IHNpbWlsYXIgZHJpdmVycyBmcm9tIERhcml1cyBBdWd1bGlzIGFuZCBWbGFkaW1pcgogICogWmFwb2xza2l5LCBhZGRpdGlvbmFsIGltcHJvdmVtZW50cyBieSBXaW0gVmFuIFNlYnJvZWNrLgpAQCAtNDAsNiArNDEsNyBAQAogI2RlZmluZSBJTVgyX1dEVF9XQ1JfV1QJCSgweEZGIDw8IDgpCS8qIC0+IFdhdGNoZG9nIFRpbWVvdXQgRmllbGQgKi8KICNkZWZpbmUgSU1YMl9XRFRfV0NSX1dSRQkoMSA8PCAzKQkvKiAtPiBXRE9HIFJlc2V0IEVuYWJsZSAqLwogI2RlZmluZSBJTVgyX1dEVF9XQ1JfV0RFCSgxIDw8IDIpCS8qIC0+IFdhdGNoZG9nIEVuYWJsZSAqLworI2RlZmluZSBJTVgyX1dEVF9XQ1JfV0RaU1QJKDEgPDwgMCkJLyogLT4gV2F0Y2hkb2cgdGltZXIgU3VzcGVuZCAqLwogCiAjZGVmaW5lIElNWDJfV0RUX1dTUgkJMHgwMgkJLyogU2VydmljZSBSZWdpc3RlciAqLwogI2RlZmluZSBJTVgyX1dEVF9TRVExCQkweDU1NTUJCS8qIC0+IHNlcnZpY2Ugc2VxdWVuY2UgMSAqLwpAQCAtODcsNiArODksOCBAQAogewogCXUxNiB2YWwgPSBfX3Jhd19yZWFkdyhpbXgyX3dkdC5iYXNlICsgSU1YMl9XRFRfV0NSKTsKIAorCS8qIFN1c3BlbmQgdGltZXIgaW4gbG93IHBvd2VyIG1vZGUsIHdyaXRlIG9uY2Utb25seSAqLworCXZhbCB8PSBJTVgyX1dEVF9XQ1JfV0RaU1Q7CiAJLyogU3RyaXAgdGhlIG9sZCB3YXRjaGRvZyBUaW1lLU91dCB2YWx1ZSAqLwogCXZhbCAmPSB+SU1YMl9XRFRfV0NSX1dUOwogCS8qIEdlbmVyYXRlIHJlc2V0IGlmIFdET0cgdGltZXMgb3V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL21veGFydF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbW94YXJ0X3dkdC5jCmluZGV4IDQxNjZlNGQuLjRhYTNhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbW94YXJ0X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbW94YXJ0X3dkdC5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCisjaW5jbHVkZSA8YXNtL3N5c3RlbV9taXNjLmg+CisKICNkZWZpbmUgUkVHX0NPVU5UCQkJMHg0CiAjZGVmaW5lIFJFR19NT0RFCQkJMHg4CiAjZGVmaW5lIFJFR19FTkFCTEUJCQkweEMKQEAgLTI5LDggKzMxLDE3IEBACiAJdW5zaWduZWQgaW50IGNsb2NrX2ZyZXF1ZW5jeTsKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbW94YXJ0X3dkdF9kZXYgKm1veGFydF9yZXN0YXJ0X2N0eDsKKwogc3RhdGljIGludCBoZWFydGJlYXQ7CiAKK3N0YXRpYyB2b2lkIG1veGFydF93ZHRfcmVzdGFydChlbnVtIHJlYm9vdF9tb2RlIHJlYm9vdF9tb2RlLCBjb25zdCBjaGFyICpjbWQpCit7CisJd3JpdGVsKDEsIG1veGFydF9yZXN0YXJ0X2N0eC0+YmFzZSArIFJFR19DT1VOVCk7CisJd3JpdGVsKDB4NWFiOSwgbW94YXJ0X3Jlc3RhcnRfY3R4LT5iYXNlICsgUkVHX01PREUpOworCXdyaXRlbCgweDAzLCBtb3hhcnRfcmVzdGFydF9jdHgtPmJhc2UgKyBSRUdfRU5BQkxFKTsKK30KKwogc3RhdGljIGludCBtb3hhcnRfd2R0X3N0b3Aoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2R0X2RldikKIHsKIAlzdHJ1Y3QgbW94YXJ0X3dkdF9kZXYgKm1veGFydF93ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKQEAgLTEyNSw2ICsxMzYsOSBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwltb3hhcnRfcmVzdGFydF9jdHggPSBtb3hhcnRfd2R0OworCWFybV9wbV9yZXN0YXJ0ID0gbW94YXJ0X3dkdF9yZXN0YXJ0OworCiAJZGV2X2RiZyhkZXYsICJXYXRjaGRvZyBlbmFibGVkIChoZWFydGJlYXQ9JWQgc2VjLCBub3dheW91dD0lZClcbiIsCiAJCW1veGFydF93ZHQtPmRldi50aW1lb3V0LCBub3dheW91dCk7CiAKQEAgLTEzNSw2ICsxNDksNyBAQAogewogCXN0cnVjdCBtb3hhcnRfd2R0X2RldiAqbW94YXJ0X3dkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJYXJtX3BtX3Jlc3RhcnQgPSBOVUxMOwogCW1veGFydF93ZHRfc3RvcCgmbW94YXJ0X3dkdC0+ZGV2KTsKIAl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmbW94YXJ0X3dkdC0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jCmluZGV4IGQ4MjE1MjAuLmMxZjY1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjOHh4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL21wYzh4eHhfd2R0LmMKQEAgLTczLDkgKzczLDcgQEAKICAqIHRvIDAKICAqLwogc3RhdGljIGludCBwcmVzY2FsZSA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXRfc2VjOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2R0X3NwaW5sb2NrKTsKIAogc3RhdGljIHZvaWQgbXBjOHh4eF93ZHRfa2VlcGFsaXZlKHZvaWQpCkBAIC04NywzOSArODUsMjMgQEAKIAlzcGluX3VubG9jaygmd2R0X3NwaW5sb2NrKTsKIH0KIAorc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgbXBjOHh4eF93ZHRfZGV2Owogc3RhdGljIHZvaWQgbXBjOHh4eF93ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgREVGSU5FX1RJTUVSKHdkdF90aW1lciwgbXBjOHh4eF93ZHRfdGltZXJfcGluZywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHdkdF90aW1lciwgbXBjOHh4eF93ZHRfdGltZXJfcGluZywgMCwKKwkJKHVuc2lnbmVkIGxvbmcpJm1wYzh4eHhfd2R0X2Rldik7CiAKIHN0YXRpYyB2b2lkIG1wYzh4eHhfd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyBhcmcpCiB7CisJc3RydWN0IHdhdGNoZG9nX2RldmljZSAqdyA9IChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopYXJnOworCiAJbXBjOHh4eF93ZHRfa2VlcGFsaXZlKCk7CiAJLyogV2UncmUgcGluZ2luZyBpdCB0d2ljZSBmYXN0ZXIgdGhhbiBuZWVkZWQsIGp1c3QgdG8gYmUgc3VyZS4gKi8KLQltb2RfdGltZXIoJndkdF90aW1lciwgamlmZmllcyArIEhaICogdGltZW91dF9zZWMgLyAyKTsKKwltb2RfdGltZXIoJndkdF90aW1lciwgamlmZmllcyArIEhaICogdy0+dGltZW91dCAvIDIpOwogfQogCi1zdGF0aWMgdm9pZCBtcGM4eHh4X3dkdF9wcl93YXJuKGNvbnN0IGNoYXIgKm1zZykKLXsKLQlwcl9jcml0KCIlcywgZXhwZWN0IHRoZSAlcyBzb29uIVxuIiwgbXNnLAotCQlyZXNldCA/ICJyZXNldCIgOiAibWFjaGluZSBjaGVjayBleGNlcHRpb24iKTsKLX0KLQotc3RhdGljIHNzaXplX3QgbXBjOHh4eF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWlmIChjb3VudCkKLQkJbXBjOHh4eF93ZHRfa2VlcGFsaXZlKCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IG1wYzh4eHhfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKncpCiB7CiAJdTMyIHRtcCA9IFNXQ1JSX1NXRU47Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCS8qIE9uY2Ugd2Ugc3RhcnQgdGhlIHdhdGNoZG9nIHdlIGNhbid0IHN0b3AgaXQgKi8KLQlpZiAobm93YXlvdXQpCi0JCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAKIAkvKiBHb29kLCBmaXJlIHVwIHRoZSBzaG93ICovCiAJaWYgKHByZXNjYWxlKQpAQCAtMTMzLDU5ICsxMTUsMzcgQEAKIAogCWRlbF90aW1lcl9zeW5jKCZ3ZHRfdGltZXIpOwogCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKCFub3dheW91dCkKLQkJbXBjOHh4eF93ZHRfdGltZXJfcGluZygwKTsKLQllbHNlCi0JCW1wYzh4eHhfd2R0X3ByX3dhcm4oIndhdGNoZG9nIGNsb3NlZCIpOwotCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbG9uZyBtcGM4eHh4X3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgbXBjOHh4eF93ZHRfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3KQogewotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBfX3VzZXIgKnAgPSBhcmdwOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKLQkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HLAotCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCi0JCS5pZGVudGl0eSA9ICJNUEM4eHh4IiwKLQl9OwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOwotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgotCQltcGM4eHh4X3dkdF9rZWVwYWxpdmUoKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBXRElPQ19HRVRUSU1FT1VUOgotCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dF9zZWMsIHApOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFRZOwotCX0KKwltcGM4eHh4X3dkdF9rZWVwYWxpdmUoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXBjOHh4eF93ZHRfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLndyaXRlCQk9IG1wYzh4eHhfd2R0X3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IG1wYzh4eHhfd2R0X2lvY3RsLAotCS5vcGVuCQk9IG1wYzh4eHhfd2R0X29wZW4sCi0JLnJlbGVhc2UJPSBtcGM4eHh4X3dkdF9yZWxlYXNlLAorc3RhdGljIGludCBtcGM4eHh4X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKncpCit7CisJbW9kX3RpbWVyKCZ3ZHRfdGltZXIsIGppZmZpZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gbXBjOHh4eF93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCS5pZGVudGl0eSA9ICJNUEM4eHh4IiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtcGM4eHh4X3dkdF9taXNjZGV2ID0gewotCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAotCS5uYW1lCT0gIndhdGNoZG9nIiwKLQkuZm9wcwk9ICZtcGM4eHh4X3dkdF9mb3BzLAorc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19vcHMgbXBjOHh4eF93ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IG1wYzh4eHhfd2R0X3N0YXJ0LAorCS5waW5nID0gbXBjOHh4eF93ZHRfcGluZywKKwkuc3RvcCA9IG1wYzh4eHhfd2R0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2RldmljZSBtcGM4eHh4X3dkdF9kZXYgPSB7CisJLmluZm8gPSAmbXBjOHh4eF93ZHRfaW5mbywKKwkub3BzID0gJm1wYzh4eHhfd2R0X29wcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzh4eHhfd2R0X21hdGNoW107CkBAIC0xOTcsNiArMTU3LDcgQEAKIAljb25zdCBzdHJ1Y3QgbXBjOHh4eF93ZHRfdHlwZSAqd2R0X3R5cGU7CiAJdTMyIGZyZXEgPSBmc2xfZ2V0X3N5c19mcmVxKCk7CiAJYm9vbCBlbmFibGVkOworCXVuc2lnbmVkIGludCB0aW1lb3V0X3NlYzsKIAogCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG1wYzh4eHhfd2R0X21hdGNoLCAmb2ZkZXYtPmRldik7CiAJaWYgKCFtYXRjaCkKQEAgLTIyMyw2ICsxODQsNyBAQAogCWVsc2UKIAkJdGltZW91dF9zZWMgPSB0aW1lb3V0IC8gZnJlcTsKIAorCW1wYzh4eHhfd2R0X2Rldi50aW1lb3V0ID0gdGltZW91dF9zZWM7CiAjaWZkZWYgTU9EVUxFCiAJcmV0ID0gbXBjOHh4eF93ZHRfaW5pdF9sYXRlKCk7CiAJaWYgKHJldCkKQEAgLTIzOCw3ICsyMDAsNyBAQAogCSAqIHVzZXJzcGFjZSBoYW5kbGVzIGl0LgogCSAqLwogCWlmIChlbmFibGVkKQotCQltcGM4eHh4X3dkdF90aW1lcl9waW5nKDApOworCQltb2RfdGltZXIoJndkdF90aW1lciwgamlmZmllcyk7CiAJcmV0dXJuIDA7CiBlcnJfdW5tYXA6CiAJaW91bm1hcCh3ZF9iYXNlKTsKQEAgLTI0OCw5ICsyMTAsMTAgQEAKIAogc3RhdGljIGludCBtcGM4eHh4X3dkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCiB7Ci0JbXBjOHh4eF93ZHRfcHJfd2Fybigid2F0Y2hkb2cgcmVtb3ZlZCIpOworCXByX2NyaXQoIldhdGNoZG9nIHJlbW92ZWQsIGV4cGVjdCB0aGUgJXMgc29vbiFcbiIsCisJCXJlc2V0ID8gInJlc2V0IiA6ICJtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiIpOwogCWRlbF90aW1lcl9zeW5jKCZ3ZHRfdGltZXIpOwotCW1pc2NfZGVyZWdpc3RlcigmbXBjOHh4eF93ZHRfbWlzY2Rldik7CisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJm1wYzh4eHhfd2R0X2Rldik7CiAJaW91bm1hcCh3ZF9iYXNlKTsKIAogCXJldHVybiAwOwpAQCAtMzAyLDEwICsyNjUsMTEgQEAKIAlpZiAoIXdkX2Jhc2UpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmbXBjOHh4eF93ZHRfbWlzY2Rldik7CisJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KCZtcGM4eHh4X3dkdF9kZXYsIG5vd2F5b3V0KTsKKworCXJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmbXBjOHh4eF93ZHRfZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCi0JCSAgICAgICBXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgZGV2aWNlIChlcnI9JWQpXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMgYi9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jCmluZGV4IDIzMWU1YjkuLjBiOWVjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9udl90Y28uYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKICAqIHdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgogICovCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUodGNvX3BjaV90YmwpID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRjb19wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX1NNQlVTLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfU01CVVMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfcGNpLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfcGNpLmMKaW5kZXggYjQ4NjRmMi4uYzBkMDdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9wY3dkX3BjaS5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF9wY2kuYwpAQCAtODAxLDcgKzgwMSw3IEBACiAJY2FyZHNfZm91bmQtLTsKIH0KIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBjaXBjd2RfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpcGN3ZF9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX1FVSUNLTE9HSUMsIFBDSV9ERVZJQ0VfSURfV0FUQ0hET0dfUENJUENXRCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKIAl7IDAgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IDdkOGZkMDQuLmFlYzk0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKICNkZWZpbmUgUzNDMjQxMF9XVENPTgkJMHgwMAogI2RlZmluZSBTM0MyNDEwX1dUREFUCQkweDA0CkBAIC02MCw2ICs2MiwxNiBAQAogI2RlZmluZSBDT05GSUdfUzNDMjQxMF9XQVRDSERPR19BVEJPT1QJCSgwKQogI2RlZmluZSBDT05GSUdfUzNDMjQxMF9XQVRDSERPR19ERUZBVUxUX1RJTUUJKDE1KQogCisjZGVmaW5lIEVYWU5PUzVfUlNUX1NUQVRfUkVHX09GRlNFVAkJMHgwNDA0CisjZGVmaW5lIEVYWU5PUzVfV0RUX0RJU0FCTEVfUkVHX09GRlNFVAkJMHgwNDA4CisjZGVmaW5lIEVYWU5PUzVfV0RUX01BU0tfUkVTRVRfUkVHX09GRlNFVAkweDA0MGMKKyNkZWZpbmUgUVVJUktfSEFTX1BNVV9DT05GSUcJCQkoMSA8PCAwKQorI2RlZmluZSBRVUlSS19IQVNfUlNUX1NUQVQJCQkoMSA8PCAxKQorCisvKiBUaGVzZSBxdWlya3MgcmVxdWlyZSB0aGF0IHdlIGhhdmUgYSBQTVUgcmVnaXN0ZXIgbWFwICovCisjZGVmaW5lIFFVSVJLU19IQVZFX1BNVVJFRwkJCShRVUlSS19IQVNfUE1VX0NPTkZJRyB8IFwKKwkJCQkJCSBRVUlSS19IQVNfUlNUX1NUQVQpCisKIHN0YXRpYyBib29sIG5vd2F5b3V0CT0gV0FUQ0hET0dfTk9XQVlPVVQ7CiBzdGF0aWMgaW50IHRtcl9tYXJnaW47CiBzdGF0aWMgaW50IHRtcl9hdGJvb3QJPSBDT05GSUdfUzNDMjQxMF9XQVRDSERPR19BVEJPT1Q7CkBAIC04Myw2ICs5NSwzMCBAQAogCQkJIjAgdG8gcmVib290IChkZWZhdWx0IDApIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiV2F0Y2hkb2cgZGVidWcsIHNldCB0byA+MSBmb3IgZGVidWcgKGRlZmF1bHQgMCkiKTsKIAorLyoqCisgKiBzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCAtIFBlci12YXJpYW50IGNvbmZpZyBkYXRhCisgKgorICogQGRpc2FibGVfcmVnOiBPZmZzZXQgaW4gcG11cmVnIGZvciB0aGUgcmVnaXN0ZXIgdGhhdCBkaXNhYmxlcyB0aGUgd2F0Y2hkb2cKKyAqIHRpbWVyIHJlc2V0IGZ1bmN0aW9uYWxpdHkuCisgKiBAbWFza19yZXNldF9yZWc6IE9mZnNldCBpbiBwbXVyZWcgZm9yIHRoZSByZWdpc3RlciB0aGF0IG1hc2tzIHRoZSB3YXRjaGRvZworICogdGltZXIgcmVzZXQgZnVuY3Rpb25hbGl0eS4KKyAqIEBtYXNrX2JpdDogQml0IG51bWJlciBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyIGluIHRoZSBkaXNhYmxlIHJlZ2lzdGVyIGFuZCB0aGUKKyAqIG1hc2sgcmVzZXQgcmVnaXN0ZXIuCisgKiBAcnN0X3N0YXRfcmVnOiBPZmZzZXQgaW4gcG11cmVnIGZvciB0aGUgcmVnaXN0ZXIgdGhhdCBoYXMgdGhlIHJlc2V0IHN0YXR1cy4KKyAqIEByc3Rfc3RhdF9iaXQ6IEJpdCBudW1iZXIgaW4gdGhlIHJzdF9zdGF0IHJlZ2lzdGVyIGluZGljYXRpbmcgYSB3YXRjaGRvZworICogcmVzZXQuCisgKiBAcXVpcmtzOiBBIGJpdGZpZWxkIG9mIHF1aXJrcy4KKyAqLworCitzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCB7CisJaW50IGRpc2FibGVfcmVnOworCWludCBtYXNrX3Jlc2V0X3JlZzsKKwlpbnQgbWFza19iaXQ7CisJaW50IHJzdF9zdGF0X3JlZzsKKwlpbnQgcnN0X3N0YXRfYml0OworCXUzMiBxdWlya3M7Cit9OworCiBzdHJ1Y3QgczNjMjQxMF93ZHQgewogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IGNsawkJKmNsb2NrOwpAQCAtOTMsOCArMTI5LDU0IEBACiAJdW5zaWduZWQgbG9uZwkJd3RkYXRfc2F2ZTsKIAlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlCXdkdF9kZXZpY2U7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWZyZXFfdHJhbnNpdGlvbjsKKwlzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCAqZHJ2X2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcG11cmVnOwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzM2MyNDEwX3dkdF92YXJpYW50IGRydl9kYXRhX3MzYzI0MTAgPSB7CisJLnF1aXJrcyA9IDAKK307CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCBkcnZfZGF0YV9leHlub3M1MjUwICA9IHsKKwkuZGlzYWJsZV9yZWcgPSBFWFlOT1M1X1dEVF9ESVNBQkxFX1JFR19PRkZTRVQsCisJLm1hc2tfcmVzZXRfcmVnID0gRVhZTk9TNV9XRFRfTUFTS19SRVNFVF9SRUdfT0ZGU0VULAorCS5tYXNrX2JpdCA9IDIwLAorCS5yc3Rfc3RhdF9yZWcgPSBFWFlOT1M1X1JTVF9TVEFUX1JFR19PRkZTRVQsCisJLnJzdF9zdGF0X2JpdCA9IDIwLAorCS5xdWlya3MgPSBRVUlSS19IQVNfUE1VX0NPTkZJRyB8IFFVSVJLX0hBU19SU1RfU1RBVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCBkcnZfZGF0YV9leHlub3M1NDIwID0geworCS5kaXNhYmxlX3JlZyA9IEVYWU5PUzVfV0RUX0RJU0FCTEVfUkVHX09GRlNFVCwKKwkubWFza19yZXNldF9yZWcgPSBFWFlOT1M1X1dEVF9NQVNLX1JFU0VUX1JFR19PRkZTRVQsCisJLm1hc2tfYml0ID0gMCwKKwkucnN0X3N0YXRfcmVnID0gRVhZTk9TNV9SU1RfU1RBVF9SRUdfT0ZGU0VULAorCS5yc3Rfc3RhdF9iaXQgPSA5LAorCS5xdWlya3MgPSBRVUlSS19IQVNfUE1VX0NPTkZJRyB8IFFVSVJLX0hBU19SU1RfU1RBVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHMzYzI0MTBfd2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0MTAtd2R0IiwKKwkgIC5kYXRhID0gJmRydl9kYXRhX3MzYzI0MTAgfSwKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC13ZHQiLAorCSAgLmRhdGEgPSAmZHJ2X2RhdGFfZXh5bm9zNTI1MCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLXdkdCIsCisJICAuZGF0YSA9ICZkcnZfZGF0YV9leHlub3M1NDIwIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgczNjMjQxMF93ZHRfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHMzYzI0MTBfd2R0X2lkc1tdID0geworCXsKKwkJLm5hbWUgPSAiczNjMjQxMC13ZHQiLAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmZHJ2X2RhdGFfczNjMjQxMCwKKwl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgczNjMjQxMF93ZHRfaWRzKTsKKwogLyogd2F0Y2hkb2cgY29udHJvbCByb3V0aW5lcyAqLwogCiAjZGVmaW5lIERCRyhmbXQsIC4uLikJCQkJCVwKQEAgLTExMCw2ICsxOTIsMzUgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgczNjMjQxMF93ZHQsIGZyZXFfdHJhbnNpdGlvbik7CiB9CiAKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9tYXNrX2FuZF9kaXNhYmxlX3Jlc2V0KHN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0LCBib29sIG1hc2spCit7CisJaW50IHJldDsKKwl1MzIgbWFza192YWwgPSAxIDw8IHdkdC0+ZHJ2X2RhdGEtPm1hc2tfYml0OworCXUzMiB2YWwgPSAwOworCisJLyogTm8gbmVlZCB0byBkbyBhbnl0aGluZyBpZiBubyBQTVUgQ09ORklHIG5lZWRlZCAqLworCWlmICghKHdkdC0+ZHJ2X2RhdGEtPnF1aXJrcyAmIFFVSVJLX0hBU19QTVVfQ09ORklHKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWFzaykKKwkJdmFsID0gbWFza192YWw7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMod2R0LT5wbXVyZWcsCisJCQl3ZHQtPmRydl9kYXRhLT5kaXNhYmxlX3JlZywKKwkJCW1hc2tfdmFsLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdkdC0+cG11cmVnLAorCQkJd2R0LT5kcnZfZGF0YS0+bWFza19yZXNldF9yZWcsCisJCQltYXNrX3ZhbCwgdmFsKTsKKyBlcnJvcjoKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycih3ZHQtPmRldiwgImZhaWxlZCB0byB1cGRhdGUgcmVnKCVkKVxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgczNjMjQxMHdkdF9rZWVwYWxpdmUoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQogewogCXN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKQEAgLTE4OCw3ICsyOTksNyBAQAogCWlmICh0aW1lb3V0IDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmcmVxIC89IDEyODsKKwlmcmVxID0gRElWX1JPVU5EX1VQKGZyZXEsIDEyOCk7CiAJY291bnQgPSB0aW1lb3V0ICogZnJlcTsKIAogCURCRygiJXM6IGNvdW50PSVkLCB0aW1lb3V0PSVkLCBmcmVxPSVsdVxuIiwKQEAgLTIwMCwyMSArMzExLDE4IEBACiAJKi8KIAogCWlmIChjb3VudCA+PSAweDEwMDAwKSB7Ci0JCWZvciAoZGl2aXNvciA9IDE7IGRpdmlzb3IgPD0gMHgxMDA7IGRpdmlzb3IrKykgewotCQkJaWYgKChjb3VudCAvIGRpdmlzb3IpIDwgMHgxMDAwMCkKLQkJCQlicmVhazsKLQkJfQorCQlkaXZpc29yID0gRElWX1JPVU5EX1VQKGNvdW50LCAweGZmZmYpOwogCi0JCWlmICgoY291bnQgLyBkaXZpc29yKSA+PSAweDEwMDAwKSB7CisJCWlmIChkaXZpc29yID4gMHgxMDApIHsKIAkJCWRldl9lcnIod2R0LT5kZXYsICJ0aW1lb3V0ICVkIHRvbyBiaWdcbiIsIHRpbWVvdXQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKIAlEQkcoIiVzOiB0aW1lb3V0PSVkLCBkaXZpc29yPSVkLCBjb3VudD0lZCAoJTA4eClcbiIsCi0JICAgIF9fZnVuY19fLCB0aW1lb3V0LCBkaXZpc29yLCBjb3VudCwgY291bnQvZGl2aXNvcik7CisJICAgIF9fZnVuY19fLCB0aW1lb3V0LCBkaXZpc29yLCBjb3VudCwgRElWX1JPVU5EX1VQKGNvdW50LCBkaXZpc29yKSk7CiAKLQljb3VudCAvPSBkaXZpc29yOworCWNvdW50ID0gRElWX1JPVU5EX1VQKGNvdW50LCBkaXZpc29yKTsKIAl3ZHQtPmNvdW50ID0gY291bnQ7CiAKIAkvKiB1cGRhdGUgdGhlIHByZS1zY2FsZXIgKi8KQEAgLTI2NCw3ICszNzIsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmZGVmIENPTkZJR19DUFVfRlJFUQorI2lmZGVmIENPTkZJR19BUk1fUzNDMjRYWF9DUFVGUkVRCiAKIHN0YXRpYyBpbnQgczNjMjQxMHdkdF9jcHVmcmVxX3RyYW5zaXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkJICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKQEAgLTMzMSw2ICs0MzksMzcgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzM2MyNDEwd2R0X2dldF9ib290c3RhdHVzKHN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0KQoreworCXVuc2lnbmVkIGludCByc3Rfc3RhdDsKKwlpbnQgcmV0OworCisJaWYgKCEod2R0LT5kcnZfZGF0YS0+cXVpcmtzICYgUVVJUktfSEFTX1JTVF9TVEFUKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByZWdtYXBfcmVhZCh3ZHQtPnBtdXJlZywgd2R0LT5kcnZfZGF0YS0+cnN0X3N0YXRfcmVnLCAmcnN0X3N0YXQpOworCWlmIChyZXQpCisJCWRldl93YXJuKHdkdC0+ZGV2LCAiQ291bGRuJ3QgZ2V0IFJTVF9TVEFUIHJlZ2lzdGVyXG4iKTsKKwllbHNlIGlmIChyc3Rfc3RhdCAmIEJJVCh3ZHQtPmRydl9kYXRhLT5yc3Rfc3RhdF9iaXQpKQorCQlyZXR1cm4gV0RJT0ZfQ0FSRFJFU0VUOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHMzYzI0MTBfZ2V0X3dkdF9kcml2ZXJfZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCAqCitnZXRfd2R0X2Rydl9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCQltYXRjaCA9IG9mX21hdGNoX25vZGUoczNjMjQxMF93ZHRfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwkJcmV0dXJuIChzdHJ1Y3QgczNjMjQxMF93ZHRfdmFyaWFudCAqKW1hdGNoLT5kYXRhOworCX0gZWxzZSB7CisJCXJldHVybiAoc3RydWN0IHMzYzI0MTBfd2R0X3ZhcmlhbnQgKikKKwkJCXBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOworCX0KK30KKwogc3RhdGljIGludCBzM2MyNDEwd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMzUzLDYgKzQ5MiwxNiBAQAogCXNwaW5fbG9ja19pbml0KCZ3ZHQtPmxvY2spOwogCXdkdC0+d2R0X2RldmljZSA9IHMzYzI0MTBfd2RkOwogCisJd2R0LT5kcnZfZGF0YSA9IGdldF93ZHRfZHJ2X2RhdGEocGRldik7CisJaWYgKHdkdC0+ZHJ2X2RhdGEtPnF1aXJrcyAmIFFVSVJLU19IQVZFX1BNVVJFRykgeworCQl3ZHQtPnBtdXJlZyA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJCQkJInNhbXN1bmcsc3lzY29uLXBoYW5kbGUiKTsKKwkJaWYgKElTX0VSUih3ZHQtPnBtdXJlZykpIHsKKwkJCWRldl9lcnIoZGV2LCAic3lzY29uIHJlZ21hcCBsb29rdXAgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gUFRSX0VSUih3ZHQtPnBtdXJlZyk7CisJCX0KKwl9CisKIAl3ZHRfaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKIAlpZiAod2R0X2lycSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoZGV2LCAibm8gaXJxIHJlc291cmNlIHNwZWNpZmllZFxuIik7CkBAIC00MTUsMTIgKzU2NCwxOCBAQAogCiAJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KCZ3ZHQtPndkdF9kZXZpY2UsIG5vd2F5b3V0KTsKIAorCXdkdC0+d2R0X2RldmljZS5ib290c3RhdHVzID0gczNjMjQxMHdkdF9nZXRfYm9vdHN0YXR1cyh3ZHQpOworCiAJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZ3ZHQtPndkdF9kZXZpY2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfY3B1ZnJlcTsKIAl9CiAKKwlyZXQgPSBzM2MyNDEwd2R0X21hc2tfYW5kX2Rpc2FibGVfcmVzZXQod2R0LCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKIAlpZiAodG1yX2F0Ym9vdCAmJiBzdGFydGVkID09IDApIHsKIAkJZGV2X2luZm8oZGV2LCAic3RhcnRpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOwogCQlzM2MyNDEwd2R0X3N0YXJ0KCZ3ZHQtPndkdF9kZXZpY2UpOwpAQCAtNDQ1LDYgKzYwMCw5IEBACiAKIAlyZXR1cm4gMDsKIAorIGVycl91bnJlZ2lzdGVyOgorCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZ3ZHQtPndkdF9kZXZpY2UpOworCiAgZXJyX2NwdWZyZXE6CiAJczNjMjQxMHdkdF9jcHVmcmVxX2RlcmVnaXN0ZXIod2R0KTsKIApAQCAtNDU4LDggKzYxNiwxMyBAQAogCiBzdGF0aWMgaW50IHMzYzI0MTB3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAorCXJldCA9IHMzYzI0MTB3ZHRfbWFza19hbmRfZGlzYWJsZV9yZXNldCh3ZHQsIHRydWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJndkdC0+d2R0X2RldmljZSk7CiAKIAlzM2MyNDEwd2R0X2NwdWZyZXFfZGVyZWdpc3Rlcih3ZHQpOwpAQCAtNDc0LDYgKzYzNyw4IEBACiB7CiAJc3RydWN0IHMzYzI0MTBfd2R0ICp3ZHQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCisJczNjMjQxMHdkdF9tYXNrX2FuZF9kaXNhYmxlX3Jlc2V0KHdkdCwgdHJ1ZSk7CisKIAlzM2MyNDEwd2R0X3N0b3AoJndkdC0+d2R0X2RldmljZSk7CiB9CiAKQEAgLTQ4MSwxMiArNjQ2LDE3IEBACiAKIHN0YXRpYyBpbnQgczNjMjQxMHdkdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAkvKiBTYXZlIHdhdGNoZG9nIHN0YXRlLCBhbmQgdHVybiBpdCBvZmYuICovCiAJd2R0LT53dGNvbl9zYXZlID0gcmVhZGwod2R0LT5yZWdfYmFzZSArIFMzQzI0MTBfV1RDT04pOwogCXdkdC0+d3RkYXRfc2F2ZSA9IHJlYWRsKHdkdC0+cmVnX2Jhc2UgKyBTM0MyNDEwX1dUREFUKTsKIAorCXJldCA9IHMzYzI0MTB3ZHRfbWFza19hbmRfZGlzYWJsZV9yZXNldCh3ZHQsIHRydWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJLyogTm90ZSB0aGF0IFdUQ05UIGRvZXNuJ3QgbmVlZCB0byBiZSBzYXZlZC4gKi8KIAlzM2MyNDEwd2R0X3N0b3AoJndkdC0+d2R0X2RldmljZSk7CiAKQEAgLTQ5NSw2ICs2NjUsNyBAQAogCiBzdGF0aWMgaW50IHMzYzI0MTB3ZHRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzM2MyNDEwX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAkvKiBSZXN0b3JlIHdhdGNoZG9nIHN0YXRlLiAqLwpAQCAtNTAyLDYgKzY3MywxMCBAQAogCXdyaXRlbCh3ZHQtPnd0ZGF0X3NhdmUsIHdkdC0+cmVnX2Jhc2UgKyBTM0MyNDEwX1dUQ05UKTsvKiBSZXNldCBjb3VudCAqLwogCXdyaXRlbCh3ZHQtPnd0Y29uX3NhdmUsIHdkdC0+cmVnX2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKIAorCXJldCA9IHMzYzI0MTB3ZHRfbWFza19hbmRfZGlzYWJsZV9yZXNldCh3ZHQsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCWRldl9pbmZvKGRldiwgIndhdGNoZG9nICVzYWJsZWRcbiIsCiAJCSh3ZHQtPnd0Y29uX3NhdmUgJiBTM0MyNDEwX1dUQ09OX0VOQUJMRSkgPyAiZW4iIDogImRpcyIpOwogCkBAIC01MTIsMTggKzY4NywxMSBAQAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHMzYzI0MTB3ZHRfcG1fb3BzLCBzM2MyNDEwd2R0X3N1c3BlbmQsCiAJCQlzM2MyNDEwd2R0X3Jlc3VtZSk7CiAKLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHMzYzI0MTBfd2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0MTAtd2R0IiB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHMzYzI0MTBfd2R0X21hdGNoKTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNDEwd2R0X2RyaXZlciA9IHsKIAkucHJvYmUJCT0gczNjMjQxMHdkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IHMzYzI0MTB3ZHRfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHMzYzI0MTB3ZHRfc2h1dGRvd24sCisJLmlkX3RhYmxlCT0gczNjMjQxMF93ZHRfaWRzLAogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAiczNjMjQxMC13ZHQiLApAQCAtNTM4LDQgKzcwNiwzIEBACiAJICAgICAgIkRpbWl0cnkgQW5kcmljIDxkaW1pdHJ5LmFuZHJpY0B0b210b20uY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNDEwIFdhdGNoZG9nIERldmljZSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQxMC13ZHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2lyZnNvY193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2lyZnNvY193ZHQuYwppbmRleCBjZWQzZWRjLi43MDJkMDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NpcmZzb2Nfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zaXJmc29jX3dkdC5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAkJLm5hbWUgPSAic2lyZnNvYy13ZHQiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLnBtID0gJnNpcmZzb2Nfd2R0X3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKHNpcmZzb2Nfd2R0X29mX21hdGNoKSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gc2lyZnNvY193ZHRfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSBzaXJmc29jX3dkdF9wcm9iZSwKIAkucmVtb3ZlID0gc2lyZnNvY193ZHRfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zcDUxMDBfdGNvLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3NwNTEwMF90Y28uYwppbmRleCBjZTYzYTFiLi41Y2NhOWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NwNTEwMF90Y28uYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NwNTEwMF90Y28uYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0CiAgKiB3YW50IHRvIHJlZ2lzdGVyIGFub3RoZXIgZHJpdmVyIG9uIHRoZSBzYW1lIFBDSSBpZC4KICAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHNwNTEwMF90Y29fcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3A1MTAwX3Rjb19wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0RFVklDRV9JRF9BVElfU0JYMDBfU01CVVMsIFBDSV9BTllfSUQsCiAJICBQQ0lfQU5ZX0lELCB9LAogCXsgMCwgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy92aWFfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3ZpYV93ZHQuYwppbmRleCAxYTY4Zjc2Li5kMmNkOWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3ZpYV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3ZpYV93ZHQuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQogCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUod2R0X3BjaV90YWJsZSkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgd2R0X3BjaV90YWJsZVtdID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfQ1g3MDApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV9WWDgwMCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBX1ZYODU1KSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ODM2MjdoZl93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKaW5kZXggZTI0YjIxMC4uYjFkYTBjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93ODM2MjdoZl93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCkBAIC00NCwxMCArNDQsMTMgQEAKICNkZWZpbmUgV0FUQ0hET0dfTkFNRSAidzgzNjI3aGYvdGhmL2hnL2RoZyBXRFQiCiAjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KIAotLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8KLXN0YXRpYyBpbnQgd2R0X2lvID0gMHgyRTsKLW1vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzYyN2hmL3RoZiBXRFQgaW8gcG9ydCAoZGVmYXVsdCAweDJFKSIpOworc3RhdGljIGludCB3ZHRfaW87CitzdGF0aWMgaW50IGNyX3dkdF90aW1lb3V0OwkvKiBXRFQgdGltZW91dCByZWdpc3RlciAqLworc3RhdGljIGludCBjcl93ZHRfY29udHJvbDsJLyogV0RUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworZW51bSBjaGlwcyB7IHc4MzYyN2hmLCB3ODM2MjdzLCB3ODM2OTdoZiwgdzgzNjk3dWcsIHc4MzYzN2hmLCB3ODM2Mjd0aGYsCisJICAgICB3ODM2ODd0aGYsIHc4MzYyN2VoZiwgdzgzNjI3ZGhnLCB3ODM2Mjd1aGcsIHc4MzY2N2hnLCB3ODM2MjdkaGdfcCwKKwkgICAgIHc4MzY2N2hnX2IsIG5jdDY3NzUsIG5jdDY3NzYsIG5jdDY3NzkgfTsKIAogc3RhdGljIGludCB0aW1lb3V0OwkJCS8qIGluIHNlY29uZHMgKi8KIG1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOwpAQCAtNzIsNiArNzUsMjkgQEAKIAogI2RlZmluZSBXODM2MjdIRl9MRF9XRFQJCTB4MDgKIAorI2RlZmluZSBXODM2MjdIRl9JRAkJMHg1MgorI2RlZmluZSBXODM2MjdTX0lECQkweDU5CisjZGVmaW5lIFc4MzY5N0hGX0lECQkweDYwCisjZGVmaW5lIFc4MzY5N1VHX0lECQkweDY4CisjZGVmaW5lIFc4MzYzN0hGX0lECQkweDcwCisjZGVmaW5lIFc4MzYyN1RIRl9JRAkJMHg4MgorI2RlZmluZSBXODM2ODdUSEZfSUQJCTB4ODUKKyNkZWZpbmUgVzgzNjI3RUhGX0lECQkweDg4CisjZGVmaW5lIFc4MzYyN0RIR19JRAkJMHhhMAorI2RlZmluZSBXODM2MjdVSEdfSUQJCTB4YTIKKyNkZWZpbmUgVzgzNjY3SEdfSUQJCTB4YTUKKyNkZWZpbmUgVzgzNjI3REhHX1BfSUQJCTB4YjAKKyNkZWZpbmUgVzgzNjY3SEdfQl9JRAkJMHhiMworI2RlZmluZSBOQ1Q2Nzc1X0lECQkweGI0CisjZGVmaW5lIE5DVDY3NzZfSUQJCTB4YzMKKyNkZWZpbmUgTkNUNjc3OV9JRAkJMHhjNQorCisjZGVmaW5lIFc4MzYyN0hGX1dEVF9USU1FT1VUCTB4ZjYKKyNkZWZpbmUgVzgzNjk3SEZfV0RUX1RJTUVPVVQJMHhmNAorCisjZGVmaW5lIFc4MzYyN0hGX1dEVF9DT05UUk9MCTB4ZjUKKyNkZWZpbmUgVzgzNjk3SEZfV0RUX0NPTlRST0wJMHhmMworCiBzdGF0aWMgdm9pZCBzdXBlcmlvX291dGIoaW50IHJlZywgaW50IHZhbCkKIHsKIAlvdXRiKHJlZywgV0RUX0VGRVIpOwpAQCAtMTA2LDEwICsxMzIsNyBAQAogCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMik7CiB9CiAKLS8qIHR5YW4gbW90aGVyYm9hcmRzIHNlZW0gdG8gc2V0IEY1IHRvIDB4NEMgPwotICogU28gZXhwbGljaXRseSBpbml0IHRvIGFwcHJvcHJpYXRlIHZhbHVlLiAqLwotCi1zdGF0aWMgaW50IHc4MzYyN2hmX2luaXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RvZykKK3N0YXRpYyBpbnQgdzgzNjI3aGZfaW5pdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZG9nLCBlbnVtIGNoaXBzIGNoaXApCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBjaGFyIHQ7CkBAIC0xMTksMzUgKzE0Miw4MyBAQAogCQlyZXR1cm4gcmV0OwogCiAJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfV0RUKTsKLQl0ID0gc3VwZXJpb19pbmIoMHgyMCk7CS8qIGNoZWNrIGNoaXAgdmVyc2lvbgkqLwotCWlmICh0ID09IDB4ODIpIHsJLyogVzgzNjI3VEhGCQkqLwotCQl0ID0gKHN1cGVyaW9faW5iKDB4MmIpICYgMHhmNyk7Ci0JCXN1cGVyaW9fb3V0YigweDJiLCB0IHwgMHgwNCk7IC8qIHNldCBHUElPMyB0byBXRFQwICovCi0JfSBlbHNlIGlmICh0ID09IDB4ODggfHwgdCA9PSAweGEwKSB7CS8qIFc4MzYyN0VIRiAvIFc4MzYyN0RIRyAqLwotCQl0ID0gc3VwZXJpb19pbmIoMHgyZCk7Ci0JCXN1cGVyaW9fb3V0YigweDJkLCB0ICYgfjB4MDEpOwkvKiBzZXQgR1BJTzUgdG8gV0RUMCAqLwotCX0KIAogCS8qIHNldCBDUjMwIGJpdCAwIHRvIGFjdGl2YXRlIEdQSU8yICovCiAJdCA9IHN1cGVyaW9faW5iKDB4MzApOwogCWlmICghKHQgJiAweDAxKSkKIAkJc3VwZXJpb19vdXRiKDB4MzAsIHQgfCAweDAxKTsKIAotCXQgPSBzdXBlcmlvX2luYigweEY2KTsKKwlzd2l0Y2ggKGNoaXApIHsKKwljYXNlIHc4MzYyN2hmOgorCWNhc2UgdzgzNjI3czoKKwkJdCA9IHN1cGVyaW9faW5iKDB4MkIpICYgfjB4MTA7CisJCXN1cGVyaW9fb3V0YigweDJCLCB0KTsgLyogc2V0IEdQSU8yNCB0byBXRFQwICovCisJCWJyZWFrOworCWNhc2UgdzgzNjk3aGY6CisJCS8qIFNldCBwaW4gMTE5IHRvIFdEVE8jIG1vZGUgKD0gQ1IyOSwgV0RUMCkgKi8KKwkJdCA9IHN1cGVyaW9faW5iKDB4MjkpICYgfjB4NjA7CisJCXQgfD0gMHgyMDsKKwkJc3VwZXJpb19vdXRiKDB4MjksIHQpOworCQlicmVhazsKKwljYXNlIHc4MzY5N3VnOgorCQkvKiBTZXQgcGluIDExOCB0byBXRFRPIyBtb2RlICovCisJCXQgPSBzdXBlcmlvX2luYigweDJiKSAmIH4weDA0OworCQlzdXBlcmlvX291dGIoMHgyYiwgdCk7CisJCWJyZWFrOworCWNhc2UgdzgzNjI3dGhmOgorCQl0ID0gKHN1cGVyaW9faW5iKDB4MkIpICYgfjB4MDgpIHwgMHgwNDsKKwkJc3VwZXJpb19vdXRiKDB4MkIsIHQpOyAvKiBzZXQgR1BJTzMgdG8gV0RUMCAqLworCQlicmVhazsKKwljYXNlIHc4MzYyN2RoZzoKKwljYXNlIHc4MzYyN2RoZ19wOgorCQl0ID0gc3VwZXJpb19pbmIoMHgyRCkgJiB+MHgwMTsgLyogUElONzcgLT4gV0RUMCMgKi8KKwkJc3VwZXJpb19vdXRiKDB4MkQsIHQpOyAvKiBzZXQgR1BJTzUgdG8gV0RUMCAqLworCQl0ID0gc3VwZXJpb19pbmIoY3Jfd2R0X2NvbnRyb2wpOworCQl0IHw9IDB4MDI7CS8qIGVuYWJsZSB0aGUgV0RUTyMgb3V0cHV0IGxvdyBwdWxzZQorCQkJCSAqIHRvIHRoZSBLQlJTVCMgcGluICovCisJCXN1cGVyaW9fb3V0Yihjcl93ZHRfY29udHJvbCwgdCk7CisJCWJyZWFrOworCWNhc2UgdzgzNjM3aGY6CisJCWJyZWFrOworCWNhc2UgdzgzNjg3dGhmOgorCQl0ID0gc3VwZXJpb19pbmIoMHgyQykgJiB+MHg4MDsgLyogUElONDcgLT4gV0RUMCMgKi8KKwkJc3VwZXJpb19vdXRiKDB4MkMsIHQpOworCQlicmVhazsKKwljYXNlIHc4MzYyN2VoZjoKKwljYXNlIHc4MzYyN3VoZzoKKwljYXNlIHc4MzY2N2hnOgorCWNhc2UgdzgzNjY3aGdfYjoKKwljYXNlIG5jdDY3NzU6CisJY2FzZSBuY3Q2Nzc2OgorCWNhc2UgbmN0Njc3OToKKwkJLyoKKwkJICogVGhlc2UgY2hpcHMgaGF2ZSBhIGZpeGVkIFdEVE8jIG91dHB1dCBwaW4gKFc4MzYyN1VIRyksCisJCSAqIG9yIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBXRFRPIyBvdXRwdXQgcGluLgorCQkgKiBEb24ndCB0b3VjaCBpdHMgY29uZmlndXJhdGlvbiwgYW5kIGhvcGUgdGhlIEJJT1MKKwkJICogZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisJCSAqLworCQl0ID0gc3VwZXJpb19pbmIoY3Jfd2R0X2NvbnRyb2wpOworCQl0IHw9IDB4MDI7CS8qIGVuYWJsZSB0aGUgV0RUTyMgb3V0cHV0IGxvdyBwdWxzZQorCQkJCSAqIHRvIHRoZSBLQlJTVCMgcGluICovCisJCXN1cGVyaW9fb3V0Yihjcl93ZHRfY29udHJvbCwgdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXQgPSBzdXBlcmlvX2luYihjcl93ZHRfdGltZW91dCk7CiAJaWYgKHQgIT0gMCkgewogCQlwcl9pbmZvKCJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIFJlc2V0dGluZyB0aW1lb3V0IHRvICVkIHNlY1xuIiwKIAkJCXdkb2ctPnRpbWVvdXQpOwotCQlzdXBlcmlvX291dGIoMHhGNiwgd2RvZy0+dGltZW91dCk7CisJCXN1cGVyaW9fb3V0Yihjcl93ZHRfdGltZW91dCwgd2RvZy0+dGltZW91dCk7CiAJfQogCiAJLyogc2V0IHNlY29uZCBtb2RlICYgZGlzYWJsZSBrZXlib2FyZCB0dXJuaW5nIG9mZiB3YXRjaGRvZyAqLwotCXQgPSBzdXBlcmlvX2luYigweEY1KSAmIH4weDBDOwotCS8qIGVuYWJsZSB0aGUgV0RUTyMgb3V0cHV0IGxvdyBwdWxzZSB0byB0aGUgS0JSU1QjIHBpbiAqLwotCXQgfD0gMHgwMjsKLQlzdXBlcmlvX291dGIoMHhGNSwgdCk7CisJdCA9IHN1cGVyaW9faW5iKGNyX3dkdF9jb250cm9sKSAmIH4weDBDOworCXN1cGVyaW9fb3V0Yihjcl93ZHRfY29udHJvbCwgdCk7CiAKLQkvKiBkaXNhYmxlIGtleWJvYXJkICYgbW91c2UgdHVybmluZyBvZmYgd2F0Y2hkb2cgKi8KLQl0ID0gc3VwZXJpb19pbmIoMHhGNykgJiB+MHhDMDsKKwkvKiByZXNldCB0cmlnZ2VyLCBkaXNhYmxlIGtleWJvYXJkICYgbW91c2UgdHVybmluZyBvZmYgd2F0Y2hkb2cgKi8KKwl0ID0gc3VwZXJpb19pbmIoMHhGNykgJiB+MHhEMDsKIAlzdXBlcmlvX291dGIoMHhGNywgdCk7CiAKIAlzdXBlcmlvX2V4aXQoKTsKQEAgLTE2NCw3ICsyMzUsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfV0RUKTsKLQlzdXBlcmlvX291dGIoMHhGNiwgdGltZW91dCk7CisJc3VwZXJpb19vdXRiKGNyX3dkdF90aW1lb3V0LCB0aW1lb3V0KTsKIAlzdXBlcmlvX2V4aXQoKTsKIAogCXJldHVybiAwOwpAQCAtMTk3LDcgKzI2OCw3IEBACiAJCXJldHVybiAwOwogCiAJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfV0RUKTsKLQl0aW1lbGVmdCA9IHN1cGVyaW9faW5iKDB4RjYpOworCXRpbWVsZWZ0ID0gc3VwZXJpb19pbmIoY3Jfd2R0X3RpbWVvdXQpOwogCXN1cGVyaW9fZXhpdCgpOwogCiAJcmV0dXJuIHRpbWVsZWZ0OwpAQCAtMjQ5LDE2ICszMjAsMTIzIEBACiAJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKIH07CiAKK3N0YXRpYyBpbnQgd2R0X2ZpbmQoaW50IGFkZHIpCit7CisJdTggdmFsOworCWludCByZXQ7CisKKwljcl93ZHRfdGltZW91dCA9IFc4MzYyN0hGX1dEVF9USU1FT1VUOworCWNyX3dkdF9jb250cm9sID0gVzgzNjI3SEZfV0RUX0NPTlRST0w7CisKKwlyZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzdXBlcmlvX3NlbGVjdChXODM2MjdIRl9MRF9XRFQpOworCXZhbCA9IHN1cGVyaW9faW5iKDB4MjApOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBXODM2MjdIRl9JRDoKKwkJcmV0ID0gdzgzNjI3aGY7CisJCWJyZWFrOworCWNhc2UgVzgzNjI3U19JRDoKKwkJcmV0ID0gdzgzNjI3czsKKwkJYnJlYWs7CisJY2FzZSBXODM2OTdIRl9JRDoKKwkJcmV0ID0gdzgzNjk3aGY7CisJCWNyX3dkdF90aW1lb3V0ID0gVzgzNjk3SEZfV0RUX1RJTUVPVVQ7CisJCWNyX3dkdF9jb250cm9sID0gVzgzNjk3SEZfV0RUX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgVzgzNjk3VUdfSUQ6CisJCXJldCA9IHc4MzY5N3VnOworCQljcl93ZHRfdGltZW91dCA9IFc4MzY5N0hGX1dEVF9USU1FT1VUOworCQljcl93ZHRfY29udHJvbCA9IFc4MzY5N0hGX1dEVF9DT05UUk9MOworCQlicmVhazsKKwljYXNlIFc4MzYzN0hGX0lEOgorCQlyZXQgPSB3ODM2MzdoZjsKKwkJYnJlYWs7CisJY2FzZSBXODM2MjdUSEZfSUQ6CisJCXJldCA9IHc4MzYyN3RoZjsKKwkJYnJlYWs7CisJY2FzZSBXODM2ODdUSEZfSUQ6CisJCXJldCA9IHc4MzY4N3RoZjsKKwkJYnJlYWs7CisJY2FzZSBXODM2MjdFSEZfSUQ6CisJCXJldCA9IHc4MzYyN2VoZjsKKwkJYnJlYWs7CisJY2FzZSBXODM2MjdESEdfSUQ6CisJCXJldCA9IHc4MzYyN2RoZzsKKwkJYnJlYWs7CisJY2FzZSBXODM2MjdESEdfUF9JRDoKKwkJcmV0ID0gdzgzNjI3ZGhnX3A7CisJCWJyZWFrOworCWNhc2UgVzgzNjI3VUhHX0lEOgorCQlyZXQgPSB3ODM2Mjd1aGc7CisJCWJyZWFrOworCWNhc2UgVzgzNjY3SEdfSUQ6CisJCXJldCA9IHc4MzY2N2hnOworCQlicmVhazsKKwljYXNlIFc4MzY2N0hHX0JfSUQ6CisJCXJldCA9IHc4MzY2N2hnX2I7CisJCWJyZWFrOworCWNhc2UgTkNUNjc3NV9JRDoKKwkJcmV0ID0gbmN0Njc3NTsKKwkJYnJlYWs7CisJY2FzZSBOQ1Q2Nzc2X0lEOgorCQlyZXQgPSBuY3Q2Nzc2OworCQlicmVhazsKKwljYXNlIE5DVDY3NzlfSUQ6CisJCXJldCA9IG5jdDY3Nzk7CisJCWJyZWFrOworCWNhc2UgMHhmZjoKKwkJcmV0ID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBjaGlwIElEOiAweCUwMnhcbiIsIHZhbCk7CisJCWJyZWFrOworCX0KKwlzdXBlcmlvX2V4aXQoKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IF9faW5pdCB3ZHRfaW5pdCh2b2lkKQogewogCWludCByZXQ7CisJaW50IGNoaXA7CisJY29uc3QgY2hhciAqIGNvbnN0IGNoaXBfbmFtZVtdID0geworCQkiVzgzNjI3SEYiLAorCQkiVzgzNjI3UyIsCisJCSJXODM2OTdIRiIsCisJCSJXODM2OTdVRyIsCisJCSJXODM2MzdIRiIsCisJCSJXODM2MjdUSEYiLAorCQkiVzgzNjg3VEhGIiwKKwkJIlc4MzYyN0VIRiIsCisJCSJXODM2MjdESEciLAorCQkiVzgzNjI3VUhHIiwKKwkJIlc4MzY2N0hHIiwKKwkJIlc4MzY2N0RIRy1QIiwKKwkJIlc4MzY2N0hHLUIiLAorCQkiTkNUNjc3NSIsCisJCSJOQ1Q2Nzc2IiwKKwkJIk5DVDY3NzkiLAorCX07CiAKLQlwcl9pbmZvKCJXRFQgZHJpdmVyIGZvciB0aGUgV2luYm9uZChUTSkgVzgzNjI3SEYvVEhGL0hHL0RIRyBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmdcbiIpOworCXdkdF9pbyA9IDB4MmU7CisJY2hpcCA9IHdkdF9maW5kKDB4MmUpOworCWlmIChjaGlwIDwgMCkgeworCQl3ZHRfaW8gPSAweDRlOworCQljaGlwID0gd2R0X2ZpbmQoMHg0ZSk7CisJCWlmIChjaGlwIDwgMCkKKwkJCXJldHVybiBjaGlwOworCX0KKworCXByX2luZm8oIldEVCBkcml2ZXIgZm9yICVzIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZ1xuIiwKKwkJY2hpcF9uYW1lW2NoaXBdKTsKIAogCXdhdGNoZG9nX2luaXRfdGltZW91dCgmd2R0X2RldiwgdGltZW91dCwgTlVMTCk7CiAJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KCZ3ZHRfZGV2LCBub3dheW91dCk7CiAKLQlyZXQgPSB3ODM2MjdoZl9pbml0KCZ3ZHRfZGV2KTsKKwlyZXQgPSB3ODM2MjdoZl9pbml0KCZ3ZHRfZGV2LCBjaGlwKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgd2F0Y2hkb2cgKGVycj0lZClcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2NvcmUuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfY29yZS5jCmluZGV4IDQ2MTMzNmMuLmNlYzliNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfY29yZS5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfY29yZS5jCkBAIC03OCw3ICs3OCw3IEBACiAJd2F0Y2hkb2dfY2hlY2tfbWluX21heF90aW1lb3V0KHdkZCk7CiAKIAkvKiB0cnkgdG8gZ2V0IHRoZSB0aW1lb3V0IG1vZHVsZSBwYXJhbWV0ZXIgZmlyc3QgKi8KLQlpZiAoIXdhdGNoZG9nX3RpbWVvdXRfaW52YWxpZCh3ZGQsIHRpbWVvdXRfcGFybSkpIHsKKwlpZiAoIXdhdGNoZG9nX3RpbWVvdXRfaW52YWxpZCh3ZGQsIHRpbWVvdXRfcGFybSkgJiYgdGltZW91dF9wYXJtKSB7CiAJCXdkZC0+dGltZW91dCA9IHRpbWVvdXRfcGFybTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC04OSw3ICs4OSw3IEBACiAJaWYgKGRldiA9PSBOVUxMIHx8IGRldi0+b2Zfbm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInRpbWVvdXQtc2VjIiwgJnQpOwotCWlmICghd2F0Y2hkb2dfdGltZW91dF9pbnZhbGlkKHdkZCwgdCkpCisJaWYgKCF3YXRjaGRvZ190aW1lb3V0X2ludmFsaWQod2RkLCB0KSAmJiB0KQogCQl3ZGQtPnRpbWVvdXQgPSB0OwogCWVsc2UKIAkJcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKaW5kZXggZWU4OWJhNC4uM2RjNTc4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKQEAgLTcyMCw3ICs3MjAsNyBAQAogfQogCiAKLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh3ZHRwY2lfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgd2R0cGNpX3BjaV90YmxbXSA9IHsKIAl7CiAJCS52ZW5kb3IJICAgPSBQQ0lfVkVORE9SX0lEX0FDQ0VTU0lPLAogCQkuZGV2aWNlCSAgID0gUENJX0RFVklDRV9JRF9BQ0NFU1NJT19XREdfQ1NNLApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggMWNlMWM0MC4uYjg0ZTNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC04MzcsNyArODM3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9tYXhfZ3JhbnRfZnJhbWVzKTsKIAotaW50IGdudHRhYl9zZXR1cF9hdXRvX3hsYXRfZnJhbWVzKHVuc2lnbmVkIGxvbmcgYWRkcikKK2ludCBnbnR0YWJfc2V0dXBfYXV0b194bGF0X2ZyYW1lcyhwaHlzX2FkZHJfdCBhZGRyKQogewogCXhlbl9wZm5fdCAqcGZuOwogCXVuc2lnbmVkIGludCBtYXhfbnJfZ2ZyYW1lcyA9IF9fbWF4X25yX2dyYW50X2ZyYW1lcygpOwpAQCAtODQ5LDggKzg0OSw4IEBACiAKIAl2YWRkciA9IHhlbl9yZW1hcChhZGRyLCBQQUdFX1NJWkUgKiBtYXhfbnJfZ2ZyYW1lcyk7CiAJaWYgKHZhZGRyID09IE5VTEwpIHsKLQkJcHJfd2FybigiRmFpbGVkIHRvIGlvcmVtYXAgZ250dGFiIHNoYXJlIGZyYW1lcyAoYWRkcj0weCUwOGx4KSFcbiIsCi0JCQlhZGRyKTsKKwkJcHJfd2FybigiRmFpbGVkIHRvIGlvcmVtYXAgZ250dGFiIHNoYXJlIGZyYW1lcyAoYWRkcj0lcGEpIVxuIiwKKwkJCSZhZGRyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXBmbiA9IGtjYWxsb2MobWF4X25yX2dmcmFtZXMsIHNpemVvZihwZm5bMF0pLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCmluZGV4IDFlYWMwNzMuLmViZDhmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKKysrIGIvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYwpAQCAtNzUsMTQgKzc1LDMyIEBACiAKIHN0YXRpYyB1NjQgc3RhcnRfZG1hX2FkZHI7CiAKKy8qCisgKiBCb3RoIG9mIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYXZvaWQgUEZOX1BIWVMgYmVjYXVzZSBwaHlzX2FkZHJfdAorICogY2FuIGJlIDMyYml0IHdoZW4gZG1hX2FkZHJfdCBpcyA2NGJpdCBsZWFkaW5nIHRvIGEgbG9zcyBpbgorICogaW5mb3JtYXRpb24gaWYgdGhlIHNoaWZ0IGlzIGRvbmUgYmVmb3JlIGNhc3RpbmcgdG8gNjRiaXQuCisgKi8KIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCB4ZW5fcGh5c190b19idXMocGh5c19hZGRyX3QgcGFkZHIpCiB7Ci0JcmV0dXJuIHBoeXNfdG9fbWFjaGluZShYUEFERFIocGFkZHIpKS5tYWRkcjsKKwl1bnNpZ25lZCBsb25nIG1mbiA9IHBmbl90b19tZm4oUEZOX0RPV04ocGFkZHIpKTsKKwlkbWFfYWRkcl90IGRtYSA9IChkbWFfYWRkcl90KW1mbiA8PCBQQUdFX1NISUZUOworCisJZG1hIHw9IHBhZGRyICYgflBBR0VfTUFTSzsKKworCXJldHVybiBkbWE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgeGVuX2J1c190b19waHlzKGRtYV9hZGRyX3QgYmFkZHIpCiB7Ci0JcmV0dXJuIG1hY2hpbmVfdG9fcGh5cyhYTUFERFIoYmFkZHIpKS5wYWRkcjsKKwl1bnNpZ25lZCBsb25nIHBmbiA9IG1mbl90b19wZm4oUEZOX0RPV04oYmFkZHIpKTsKKwlkbWFfYWRkcl90IGRtYSA9IChkbWFfYWRkcl90KXBmbiA8PCBQQUdFX1NISUZUOworCXBoeXNfYWRkcl90IHBhZGRyID0gZG1hOworCisJQlVHX09OKHBhZGRyICE9IGRtYSk7IC8qIHRydW5jYXRpb24gaGFzIG9jY3VycmVkLCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwlwYWRkciB8PSBiYWRkciAmIH5QQUdFX01BU0s7CisKKwlyZXR1cm4gcGFkZHI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCB4ZW5fdmlydF90b19idXModm9pZCAqYWRkcmVzcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKaW5kZXggMjFlMThjMS4uNzQ1YWQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKQEAgLTE3NSw2ICsxNzUsNyBAQAogI2VuZGlmIC8qIENPTkZJR19GUk9OVFNXQVAgKi8KIAogI2RlZmluZSBNQjJQQUdFUyhtYikJKChtYikgPDwgKDIwIC0gUEFHRV9TSElGVCkpCisjZGVmaW5lIFBBR0VTMk1CKHBhZ2VzKSAoKHBhZ2VzKSA+PiAoMjAgLSBQQUdFX1NISUZUKSkKIAogLyoKICAqIFVzZSBjdXJyZW50IGJhbGxvb24gc2l6ZSwgdGhlIGdvYWwgKHZtX2NvbW1pdHRlZF9hcyksIGFuZCBoeXN0ZXJlc2lzCkBAIC01MjUsNiArNTI2LDcgQEAKIGludCB4ZW5fc2VsZmJhbGxvb25faW5pdChib29sIHVzZV9zZWxmYmFsbG9vbmluZywgYm9vbCB1c2VfZnJvbnRzd2FwX3NlbGZzaHJpbmspCiB7CiAJYm9vbCBlbmFibGUgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHJlc2VydmVfcGFnZXM7CiAKIAlpZiAoIXhlbl9kb21haW4oKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NDksNiArNTUxLDI2IEBACiAJaWYgKCFlbmFibGUpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyoKKwkgKiBHaXZlIHNlbGZiYWxsb29uX3Jlc2VydmVkX21iIGEgZGVmYXVsdCB2YWx1ZSgxMCUgb2YgdG90YWwgcmFtIHBhZ2VzKQorCSAqIHRvIG1ha2Ugc2VsZmJhbGxvb24gbm90IHNvIGFnZ3Jlc3NpdmUuCisJICoKKwkgKiBUaGVyZSBhcmUgbWFpbmx5IHR3byByZWFzb25zOgorCSAqIDEpIFRoZSBvcmlnaW5hbCBnb2FsX3BhZ2UgZGlkbid0IGNvbnNpZGVyIHNvbWUgcGFnZXMgdXNlZCBieSBrZXJuZWwKKwkgKiAgICBzcGFjZSwgbGlrZSBzbGFiIHBhZ2VzIGFuZCBtZW1vcnkgdXNlZCBieSBkZXZpY2UgZHJpdmVycy4KKwkgKgorCSAqIDIpIFRoZSBiYWxsb29uIGRyaXZlciBtYXkgbm90IGdpdmUgYmFjayBtZW1vcnkgdG8gZ3Vlc3QgT1MgZmFzdAorCSAqICAgIGVub3VnaCB3aGVuIHRoZSB3b3JrbG9hZCBzdWRkZW5seSBhcXVyaWVzIGEgbG90IG9mIHBoeXNpY2FsIG1lbW9yeS4KKwkgKgorCSAqIEluIGJvdGggY2FzZXMsIHRoZSBndWVzdCBPUyB3aWxsIHN1ZmZlciBmcm9tIG1lbW9yeSBwcmVzc3VyZSBhbmQKKwkgKiBPT00ga2lsbGVyIG1heSBiZSB0cmlnZ2VyZWQuCisJICogQnkgcmVzZXJ2aW5nIGV4dHJhIDEwJSBvZiB0b3RhbCByYW0gcGFnZXMsIHdlIGNhbiBrZWVwIHRoZSBzeXN0ZW0KKwkgKiBtdWNoIG1vcmUgcmVsaWFibHkgYW5kIHJlc3BvbnNlIGZhc3RlciBpbiBzb21lIGNhc2VzLgorCSAqLworCWlmICghc2VsZmJhbGxvb25fcmVzZXJ2ZWRfbWIpIHsKKwkJcmVzZXJ2ZV9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC8gMTA7CisJCXNlbGZiYWxsb29uX3Jlc2VydmVkX21iID0gUEFHRVMyTUIocmVzZXJ2ZV9wYWdlcyk7CisJfQogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc2VsZmJhbGxvb25fd29ya2VyLCBzZWxmYmFsbG9vbl9pbnRlcnZhbCAqIEhaKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Byb2MuYyBiL2ZzL2Fmcy9wcm9jLmMKaW5kZXggYmRkYzUxMi4uMjRhOTA1YiAxMDA2NDQKLS0tIGEvZnMvYWZzL3Byb2MuYworKysgYi9mcy9hZnMvcHJvYy5jCkBAIC0xMzAsOCArMTMwLDggQEAKIAlpZiAoIXByb2NfYWZzKQogCQlnb3RvIGVycm9yX2RpcjsKIAotCWlmICghcHJvY19jcmVhdGUoImNlbGxzIiwgMCwgcHJvY19hZnMsICZhZnNfcHJvY19jZWxsc19mb3BzKSB8fAotCSAgICAhcHJvY19jcmVhdGUoInJvb3RjZWxsIiwgMCwgcHJvY19hZnMsICZhZnNfcHJvY19yb290Y2VsbF9mb3BzKSkKKwlpZiAoIXByb2NfY3JlYXRlKCJjZWxscyIsIDA2NDQsIHByb2NfYWZzLCAmYWZzX3Byb2NfY2VsbHNfZm9wcykgfHwKKwkgICAgIXByb2NfY3JlYXRlKCJyb290Y2VsbCIsIDA2NDQsIHByb2NfYWZzLCAmYWZzX3Byb2Nfcm9vdGNlbGxfZm9wcykpCiAJCWdvdG8gZXJyb3JfdHJlZTsKIAogCV9sZWF2ZSgiID0gMCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IGZjNjBiMzEuLjBiYWQyNGQgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTEzNCw4ICsxMzQsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpdiA9IGJpcF92ZWNfaWR4KGJpcCwgYmlwLT5iaXBfdmNudCk7Ci0JQlVHX09OKGl2ID09IE5VTEwpOworCWl2ID0gYmlwLT5iaXBfdmVjICsgYmlwLT5iaXBfdmNudDsKIAogCWl2LT5idl9wYWdlID0gcGFnZTsKIAlpdi0+YnZfbGVuID0gbGVuOwpAQCAtMjAzLDYgKzIwMiwxMiBAQAogCXJldHVybiBzZWN0b3JzOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiaW9faW50ZWdyaXR5X2J5dGVzKHN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBzZWN0b3JzKQoreworCXJldHVybiBiaW9faW50ZWdyaXR5X2h3X3NlY3RvcnMoYmksIHNlY3RvcnMpICogYmktPnR1cGxlX3NpemU7Cit9CisKIC8qKgogICogYmlvX2ludGVncml0eV90YWdfc2l6ZSAtIFJldHJpZXZlIGludGVncml0eSB0YWcgc3BhY2UKICAqIEBiaW86CWJpbyB0byBpbnNwZWN0CkBAIC0yMTUsOSArMjIwLDkgQEAKIHsKIAlzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoYmlvLT5iaV9iZGV2KTsKIAotCUJVR19PTihiaW8tPmJpX3NpemUgPT0gMCk7CisJQlVHX09OKGJpby0+YmlfaXRlci5iaV9zaXplID09IDApOwogCi0JcmV0dXJuIGJpLT50YWdfc2l6ZSAqIChiaW8tPmJpX3NpemUgLyBiaS0+c2VjdG9yX3NpemUpOworCXJldHVybiBiaS0+dGFnX3NpemUgKiAoYmlvLT5iaV9pdGVyLmJpX3NpemUgLyBiaS0+c2VjdG9yX3NpemUpOwogfQogRVhQT1JUX1NZTUJPTChiaW9faW50ZWdyaXR5X3RhZ19zaXplKTsKIApAQCAtMjM1LDkgKzI0MCw5IEBACiAJbnJfc2VjdG9ycyA9IGJpb19pbnRlZ3JpdHlfaHdfc2VjdG9ycyhiaSwKIAkJCQkJRElWX1JPVU5EX1VQKGxlbiwgYmktPnRhZ19zaXplKSk7CiAKLQlpZiAobnJfc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplID4gYmlwLT5iaXBfc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0YWcgdG9vIGJpZyBmb3IgYmlvOiAldSA+ICV1XG4iLAotCQkgICAgICAgX19mdW5jX18sIG5yX3NlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZSwgYmlwLT5iaXBfc2l6ZSk7CisJaWYgKG5yX3NlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZSA+IGJpcC0+YmlwX2l0ZXIuYmlfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0YWcgdG9vIGJpZyBmb3IgYmlvOiAldSA+ICV1XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG5yX3NlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZSwgYmlwLT5iaXBfaXRlci5iaV9zaXplKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMjk5LDI5ICszMDQsMzAgQEAKIHsKIAlzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoYmlvLT5iaV9iZGV2KTsKIAlzdHJ1Y3QgYmxrX2ludGVncml0eV9leGNoZyBiaXg7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBpLCBzZWN0b3JzLCB0b3RhbDsKKwlzdHJ1Y3QgYmlvX3ZlYyBidjsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CisJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwl1bnNpZ25lZCBpbnQgc2VjdG9ycywgdG90YWw7CiAJdm9pZCAqcHJvdF9idWYgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2J1ZjsKIAogCXRvdGFsID0gMDsKIAliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7CiAJYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgewotCQl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKGJ2LT5idl9wYWdlKTsKLQkJYml4LmRhdGFfYnVmID0ga2FkZHIgKyBidi0+YnZfb2Zmc2V0OwotCQliaXguZGF0YV9zaXplID0gYnYtPmJ2X2xlbjsKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7CisJCXZvaWQgKmthZGRyID0ga21hcF9hdG9taWMoYnYuYnZfcGFnZSk7CisJCWJpeC5kYXRhX2J1ZiA9IGthZGRyICsgYnYuYnZfb2Zmc2V0OworCQliaXguZGF0YV9zaXplID0gYnYuYnZfbGVuOwogCQliaXgucHJvdF9idWYgPSBwcm90X2J1ZjsKIAkJYml4LnNlY3RvciA9IHNlY3RvcjsKIAogCQliaS0+Z2VuZXJhdGVfZm4oJmJpeCk7CiAKLQkJc2VjdG9ycyA9IGJ2LT5idl9sZW4gLyBiaS0+c2VjdG9yX3NpemU7CisJCXNlY3RvcnMgPSBidi5idl9sZW4gLyBiaS0+c2VjdG9yX3NpemU7CiAJCXNlY3RvciArPSBzZWN0b3JzOwogCQlwcm90X2J1ZiArPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7CiAJCXRvdGFsICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQkJQlVHX09OKHRvdGFsID4gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9zaXplKTsKKwkJQlVHX09OKHRvdGFsID4gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9pdGVyLmJpX3NpemUpOwogCiAJCWt1bm1hcF9hdG9taWMoa2FkZHIpOwogCX0KQEAgLTM4Niw4ICszOTIsOCBAQAogCiAJYmlwLT5iaXBfb3duc19idWYgPSAxOwogCWJpcC0+YmlwX2J1ZiA9IGJ1ZjsKLQliaXAtPmJpcF9zaXplID0gbGVuOwotCWJpcC0+YmlwX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCWJpcC0+YmlwX2l0ZXIuYmlfc2l6ZSA9IGxlbjsKKwliaXAtPmJpcF9pdGVyLmJpX3NlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAKIAkvKiBNYXAgaXQgKi8KIAlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShidWYpOwpAQCAtNDQyLDE2ICs0NDgsMTggQEAKIAlzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoYmlvLT5iaV9iZGV2KTsKIAlzdHJ1Y3QgYmxrX2ludGVncml0eV9leGNoZyBiaXg7CiAJc3RydWN0IGJpb192ZWMgKmJ2OwotCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfc2VjdG9yOwotCXVuc2lnbmVkIGludCBpLCBzZWN0b3JzLCB0b3RhbCwgcmV0OworCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfaXRlci5iaV9zZWN0b3I7CisJdW5zaWduZWQgaW50IHNlY3RvcnMsIHRvdGFsLCByZXQ7CiAJdm9pZCAqcHJvdF9idWYgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2J1ZjsKKwlpbnQgaTsKIAogCXJldCA9IHRvdGFsID0gMDsKIAliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7CiAJYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgeworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYmlvLCBpKSB7CiAJCXZvaWQgKmthZGRyID0ga21hcF9hdG9taWMoYnYtPmJ2X3BhZ2UpOworCiAJCWJpeC5kYXRhX2J1ZiA9IGthZGRyICsgYnYtPmJ2X29mZnNldDsKIAkJYml4LmRhdGFfc2l6ZSA9IGJ2LT5idl9sZW47CiAJCWJpeC5wcm90X2J1ZiA9IHByb3RfYnVmOwpAQCAtNDY4LDcgKzQ3Niw3IEBACiAJCXNlY3RvciArPSBzZWN0b3JzOwogCQlwcm90X2J1ZiArPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7CiAJCXRvdGFsICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQkJQlVHX09OKHRvdGFsID4gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9zaXplKTsKKwkJQlVHX09OKHRvdGFsID4gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9pdGVyLmJpX3NpemUpOwogCiAJCWt1bm1hcF9hdG9taWMoa2FkZHIpOwogCX0KQEAgLTQ5NSw3ICs1MDMsNyBAQAogCiAJLyogUmVzdG9yZSBvcmlnaW5hbCBiaW8gY29tcGxldGlvbiBoYW5kbGVyICovCiAJYmlvLT5iaV9lbmRfaW8gPSBiaXAtPmJpcF9lbmRfaW87Ci0JYmlvX2VuZGlvKGJpbywgZXJyb3IpOworCWJpb19lbmRpb19ub2RlYyhiaW8sIGVycm9yKTsKIH0KIAogLyoqCkBAIC01MzMsNTYgKzU0MSw2IEBACiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfZW5kaW8pOwogCiAvKioKLSAqIGJpb19pbnRlZ3JpdHlfbWFya19oZWFkIC0gQWR2YW5jZSBiaXBfdmVjIHNraXAgYnl0ZXMKLSAqIEBiaXA6CUludGVncml0eSB2ZWN0b3IgdG8gYWR2YW5jZQotICogQHNraXA6CU51bWJlciBvZiBieXRlcyB0byBhZHZhbmNlIGl0Ci0gKi8KLXZvaWQgYmlvX2ludGVncml0eV9tYXJrX2hlYWQoc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlwLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2tpcCkKLXsKLQlzdHJ1Y3QgYmlvX3ZlYyAqaXY7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQliaXBfZm9yX2VhY2hfdmVjKGl2LCBiaXAsIGkpIHsKLQkJaWYgKHNraXAgPT0gMCkgewotCQkJYmlwLT5iaXBfaWR4ID0gaTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChza2lwID49IGl2LT5idl9sZW4pIHsKLQkJCXNraXAgLT0gaXYtPmJ2X2xlbjsKLQkJfSBlbHNlIHsgLyogc2tpcCA8IGl2LT5idl9sZW4pICovCi0JCQlpdi0+YnZfb2Zmc2V0ICs9IHNraXA7Ci0JCQlpdi0+YnZfbGVuIC09IHNraXA7Ci0JCQliaXAtPmJpcF9pZHggPSBpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGJpb19pbnRlZ3JpdHlfbWFya190YWlsIC0gVHJ1bmNhdGUgYmlwX3ZlYyB0byBiZSBsZW4gYnl0ZXMgbG9uZwotICogQGJpcDoJSW50ZWdyaXR5IHZlY3RvciB0byB0cnVuY2F0ZQotICogQGxlbjoJTmV3IGxlbmd0aCBvZiBpbnRlZ3JpdHkgdmVjdG9yCi0gKi8KLXZvaWQgYmlvX2ludGVncml0eV9tYXJrX3RhaWwoc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlwLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotCXN0cnVjdCBiaW9fdmVjICppdjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWJpcF9mb3JfZWFjaF92ZWMoaXYsIGJpcCwgaSkgewotCQlpZiAobGVuID09IDApIHsKLQkJCWJpcC0+YmlwX3ZjbnQgPSBpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKGxlbiA+PSBpdi0+YnZfbGVuKSB7Ci0JCQlsZW4gLT0gaXYtPmJ2X2xlbjsKLQkJfSBlbHNlIHsgLyogbGVuIDwgaXYtPmJ2X2xlbikgKi8KLQkJCWl2LT5idl9sZW4gPSBsZW47Ci0JCQlsZW4gPSAwOwotCQl9Ci0JfQotfQotCi0vKioKICAqIGJpb19pbnRlZ3JpdHlfYWR2YW5jZSAtIEFkdmFuY2UgaW50ZWdyaXR5IHZlY3RvcgogICogQGJpbzoJYmlvIHdob3NlIGludGVncml0eSB2ZWN0b3IgdG8gdXBkYXRlCiAgKiBAYnl0ZXNfZG9uZToJbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gY29tcGxldGVkCkBAIC01OTUsMTMgKzU1Myw5IEBACiB7CiAJc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlwID0gYmlvLT5iaV9pbnRlZ3JpdHk7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7Ci0JdW5zaWduZWQgaW50IG5yX3NlY3RvcnM7CisJdW5zaWduZWQgYnl0ZXMgPSBiaW9faW50ZWdyaXR5X2J5dGVzKGJpLCBieXRlc19kb25lID4+IDkpOwogCi0JQlVHX09OKGJpcCA9PSBOVUxMKTsKLQlCVUdfT04oYmkgPT0gTlVMTCk7Ci0KLQlucl9zZWN0b3JzID0gYmlvX2ludGVncml0eV9od19zZWN0b3JzKGJpLCBieXRlc19kb25lID4+IDkpOwotCWJpb19pbnRlZ3JpdHlfbWFya19oZWFkKGJpcCwgbnJfc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplKTsKKwlidmVjX2l0ZXJfYWR2YW5jZShiaXAtPmJpcF92ZWMsICZiaXAtPmJpcF9pdGVyLCBieXRlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfYWR2YW5jZSk7CiAKQEAgLTYyMSw2NCArNTc1LDEzIEBACiB7CiAJc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlwID0gYmlvLT5iaV9pbnRlZ3JpdHk7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7Ci0JdW5zaWduZWQgaW50IG5yX3NlY3RvcnM7CiAKLQlCVUdfT04oYmlwID09IE5VTEwpOwotCUJVR19PTihiaSA9PSBOVUxMKTsKLQlCVUdfT04oIWJpb19mbGFnZ2VkKGJpbywgQklPX0NMT05FRCkpOwotCi0JbnJfc2VjdG9ycyA9IGJpb19pbnRlZ3JpdHlfaHdfc2VjdG9ycyhiaSwgc2VjdG9ycyk7Ci0JYmlwLT5iaXBfc2VjdG9yID0gYmlwLT5iaXBfc2VjdG9yICsgb2Zmc2V0OwotCWJpb19pbnRlZ3JpdHlfbWFya19oZWFkKGJpcCwgb2Zmc2V0ICogYmktPnR1cGxlX3NpemUpOwotCWJpb19pbnRlZ3JpdHlfbWFya190YWlsKGJpcCwgc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplKTsKKwliaW9faW50ZWdyaXR5X2FkdmFuY2UoYmlvLCBvZmZzZXQgPDwgOSk7CisJYmlwLT5iaXBfaXRlci5iaV9zaXplID0gYmlvX2ludGVncml0eV9ieXRlcyhiaSwgc2VjdG9ycyk7CiB9CiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfdHJpbSk7CiAKIC8qKgotICogYmlvX2ludGVncml0eV9zcGxpdCAtIFNwbGl0IGludGVncml0eSBtZXRhZGF0YQotICogQGJpbzoJUHJvdGVjdGVkIGJpbwotICogQGJwOgkJUmVzdWx0aW5nIGJpb19wYWlyCi0gKiBAc2VjdG9yczoJT2Zmc2V0Ci0gKgotICogRGVzY3JpcHRpb246IFNwbGl0cyBhbiBpbnRlZ3JpdHkgcGFnZSBpbnRvIGEgYmlvX3BhaXIuCi0gKi8KLXZvaWQgYmlvX2ludGVncml0eV9zcGxpdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fcGFpciAqYnAsIGludCBzZWN0b3JzKQotewotCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaTsKLQlzdHJ1Y3QgYmlvX2ludGVncml0eV9wYXlsb2FkICpiaXAgPSBiaW8tPmJpX2ludGVncml0eTsKLQl1bnNpZ25lZCBpbnQgbnJfc2VjdG9yczsKLQotCWlmIChiaW9faW50ZWdyaXR5KGJpbykgPT0gMCkKLQkJcmV0dXJuOwotCi0JYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoYmlvLT5iaV9iZGV2KTsKLQlCVUdfT04oYmkgPT0gTlVMTCk7Ci0JQlVHX09OKGJpcC0+YmlwX3ZjbnQgIT0gMSk7Ci0KLQlucl9zZWN0b3JzID0gYmlvX2ludGVncml0eV9od19zZWN0b3JzKGJpLCBzZWN0b3JzKTsKLQotCWJwLT5iaW8xLmJpX2ludGVncml0eSA9ICZicC0+YmlwMTsKLQlicC0+YmlvMi5iaV9pbnRlZ3JpdHkgPSAmYnAtPmJpcDI7Ci0KLQlicC0+aXYxID0gYmlwLT5iaXBfdmVjW2JpcC0+YmlwX2lkeF07Ci0JYnAtPml2MiA9IGJpcC0+YmlwX3ZlY1tiaXAtPmJpcF9pZHhdOwotCi0JYnAtPmJpcDEuYmlwX3ZlYyA9ICZicC0+aXYxOwotCWJwLT5iaXAyLmJpcF92ZWMgPSAmYnAtPml2MjsKLQotCWJwLT5pdjEuYnZfbGVuID0gc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplOwotCWJwLT5pdjIuYnZfb2Zmc2V0ICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQlicC0+aXYyLmJ2X2xlbiAtPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7Ci0KLQlicC0+YmlwMS5iaXBfc2VjdG9yID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9zZWN0b3I7Ci0JYnAtPmJpcDIuYmlwX3NlY3RvciA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfc2VjdG9yICsgbnJfc2VjdG9yczsKLQotCWJwLT5iaXAxLmJpcF92Y250ID0gYnAtPmJpcDIuYmlwX3ZjbnQgPSAxOwotCWJwLT5iaXAxLmJpcF9pZHggPSBicC0+YmlwMi5iaXBfaWR4ID0gMDsKLX0KLUVYUE9SVF9TWU1CT0woYmlvX2ludGVncml0eV9zcGxpdCk7Ci0KLS8qKgogICogYmlvX2ludGVncml0eV9jbG9uZSAtIENhbGxiYWNrIGZvciBjbG9uaW5nIGJpb3Mgd2l0aCBpbnRlZ3JpdHkgbWV0YWRhdGEKICAqIEBiaW86CU5ldyBiaW8KICAqIEBiaW9fc3JjOglPcmlnaW5hbCBiaW8KQEAgLTcwMiw5ICs2MDUsOCBAQAogCW1lbWNweShiaXAtPmJpcF92ZWMsIGJpcF9zcmMtPmJpcF92ZWMsCiAJICAgICAgIGJpcF9zcmMtPmJpcF92Y250ICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7CiAKLQliaXAtPmJpcF9zZWN0b3IgPSBiaXBfc3JjLT5iaXBfc2VjdG9yOwogCWJpcC0+YmlwX3ZjbnQgPSBiaXBfc3JjLT5iaXBfdmNudDsKLQliaXAtPmJpcF9pZHggPSBiaXBfc3JjLT5iaXBfaWR4OworCWJpcC0+YmlwX2l0ZXIgPSBiaXBfc3JjLT5iaXBfaXRlcjsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCAzM2Q3OWE0Li43NWM0OWEzIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMzgsOCArMzgsNiBAQAogICovCiAjZGVmaW5lIEJJT19JTkxJTkVfVkVDUwkJNAogCi1zdGF0aWMgbWVtcG9vbF90ICpiaW9fc3BsaXRfcG9vbCBfX3JlYWRfbW9zdGx5OwotCiAvKgogICogaWYgeW91IGNoYW5nZSB0aGlzIGxpc3QsIGFsc28gY2hhbmdlIGJ2ZWNfYWxsb2Mgb3IgdGhpbmdzIHdpbGwKICAqIGJyZWFrIGJhZGx5ISBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gd2hhdCB5b3UgY2FuIGZpdCBpbnRvIGFuCkBAIC0yNzMsNiArMjcxLDcgQEAKIHsKIAltZW1zZXQoYmlvLCAwLCBzaXplb2YoKmJpbykpOwogCWJpby0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKKwlhdG9taWNfc2V0KCZiaW8tPmJpX3JlbWFpbmluZywgMSk7CiAJYXRvbWljX3NldCgmYmlvLT5iaV9jbnQsIDEpOwogfQogRVhQT1JUX1NZTUJPTChiaW9faW5pdCk7CkBAIC0yOTUsOSArMjk0LDM1IEBACiAKIAltZW1zZXQoYmlvLCAwLCBCSU9fUkVTRVRfQllURVMpOwogCWJpby0+YmlfZmxhZ3MgPSBmbGFnc3woMSA8PCBCSU9fVVBUT0RBVEUpOworCWF0b21pY19zZXQoJmJpby0+YmlfcmVtYWluaW5nLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woYmlvX3Jlc2V0KTsKIAorc3RhdGljIHZvaWQgYmlvX2NoYWluX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQoreworCWJpb19lbmRpbyhiaW8tPmJpX3ByaXZhdGUsIGVycm9yKTsKKwliaW9fcHV0KGJpbyk7Cit9CisKKy8qKgorICogYmlvX2NoYWluIC0gY2hhaW4gYmlvIGNvbXBsZXRpb25zCisgKgorICogVGhlIGNhbGxlciB3b24ndCBoYXZlIGEgYmlfZW5kX2lvIGNhbGxlZCB3aGVuIEBiaW8gY29tcGxldGVzIC0gaW5zdGVhZCwKKyAqIEBwYXJlbnQncyBiaV9lbmRfaW8gd29uJ3QgYmUgY2FsbGVkIHVudGlsIGJvdGggQHBhcmVudCBhbmQgQGJpbyBoYXZlCisgKiBjb21wbGV0ZWQ7IHRoZSBjaGFpbmVkIGJpbyB3aWxsIGFsc28gYmUgZnJlZWQgd2hlbiBpdCBjb21wbGV0ZXMuCisgKgorICogVGhlIGNhbGxlciBtdXN0IG5vdCBzZXQgYmlfcHJpdmF0ZSBvciBiaV9lbmRfaW8gaW4gQGJpby4KKyAqLwordm9pZCBiaW9fY2hhaW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvICpwYXJlbnQpCit7CisJQlVHX09OKGJpby0+YmlfcHJpdmF0ZSB8fCBiaW8tPmJpX2VuZF9pbyk7CisKKwliaW8tPmJpX3ByaXZhdGUgPSBwYXJlbnQ7CisJYmlvLT5iaV9lbmRfaW8JPSBiaW9fY2hhaW5fZW5kaW87CisJYXRvbWljX2luYygmcGFyZW50LT5iaV9yZW1haW5pbmcpOworfQorRVhQT1JUX1NZTUJPTChiaW9fY2hhaW4pOworCiBzdGF0aWMgdm9pZCBiaW9fYWxsb2NfcmVzY3VlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYmlvX3NldCAqYnMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJpb19zZXQsIHJlc2N1ZV93b3JrKTsKQEAgLTQ3MywxMyArNDk4LDEzIEBACiB2b2lkIHplcm9fZmlsbF9iaW8oc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCWludCBpOworCXN0cnVjdCBiaW9fdmVjIGJ2OworCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKLQkJY2hhciAqZGF0YSA9IGJ2ZWNfa21hcF9pcnEoYnYsICZmbGFncyk7Ci0JCW1lbXNldChkYXRhLCAwLCBidi0+YnZfbGVuKTsKLQkJZmx1c2hfZGNhY2hlX3BhZ2UoYnYtPmJ2X3BhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGl0ZXIpIHsKKwkJY2hhciAqZGF0YSA9IGJ2ZWNfa21hcF9pcnEoJmJ2LCAmZmxhZ3MpOworCQltZW1zZXQoZGF0YSwgMCwgYnYuYnZfbGVuKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UoYnYuYnZfcGFnZSk7CiAJCWJ2ZWNfa3VubWFwX2lycShkYXRhLCAmZmxhZ3MpOwogCX0KIH0KQEAgLTUxNSw1MSArNTQwLDQ5IEBACiBFWFBPUlRfU1lNQk9MKGJpb19waHlzX3NlZ21lbnRzKTsKIAogLyoqCi0gKiAJX19iaW9fY2xvbmUJLQljbG9uZSBhIGJpbworICogCV9fYmlvX2Nsb25lX2Zhc3QgLSBjbG9uZSBhIGJpbyB0aGF0IHNoYXJlcyB0aGUgb3JpZ2luYWwgYmlvJ3MgYmlvdmVjCiAgKiAJQGJpbzogZGVzdGluYXRpb24gYmlvCiAgKiAJQGJpb19zcmM6IGJpbyB0byBjbG9uZQogICoKICAqCUNsb25lIGEgJmJpby4gQ2FsbGVyIHdpbGwgb3duIHRoZSByZXR1cm5lZCBiaW8sIGJ1dCBub3QKICAqCXRoZSBhY3R1YWwgZGF0YSBpdCBwb2ludHMgdG8uIFJlZmVyZW5jZSBjb3VudCBvZiByZXR1cm5lZAogICogCWJpbyB3aWxsIGJlIG9uZS4KKyAqCisgKiAJQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgQGJpb19zcmMgaXMgbm90IGZyZWVkIGJlZm9yZSBAYmlvLgogICovCi12b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlvX3NyYykKK3ZvaWQgX19iaW9fY2xvbmVfZmFzdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW8gKmJpb19zcmMpCiB7Ci0JbWVtY3B5KGJpby0+YmlfaW9fdmVjLCBiaW9fc3JjLT5iaV9pb192ZWMsCi0JCWJpb19zcmMtPmJpX21heF92ZWNzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7CisJQlVHX09OKGJpby0+YmlfcG9vbCAmJiBCSU9fUE9PTF9JRFgoYmlvKSAhPSBCSU9fUE9PTF9OT05FKTsKIAogCS8qCiAJICogbW9zdCB1c2VycyB3aWxsIGJlIG92ZXJyaWRpbmcgLT5iaV9iZGV2IHdpdGggYSBuZXcgdGFyZ2V0LAogCSAqIHNvIHdlIGRvbid0IHNldCBub3IgY2FsY3VsYXRlIG5ldyBwaHlzaWNhbC9odyBzZWdtZW50IGNvdW50cyBoZXJlCiAJICovCi0JYmlvLT5iaV9zZWN0b3IgPSBiaW9fc3JjLT5iaV9zZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gYmlvX3NyYy0+YmlfYmRldjsKIAliaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX0NMT05FRDsKIAliaW8tPmJpX3J3ID0gYmlvX3NyYy0+Ymlfcnc7Ci0JYmlvLT5iaV92Y250ID0gYmlvX3NyYy0+YmlfdmNudDsKLQliaW8tPmJpX3NpemUgPSBiaW9fc3JjLT5iaV9zaXplOwotCWJpby0+YmlfaWR4ID0gYmlvX3NyYy0+YmlfaWR4OworCWJpby0+YmlfaXRlciA9IGJpb19zcmMtPmJpX2l0ZXI7CisJYmlvLT5iaV9pb192ZWMgPSBiaW9fc3JjLT5iaV9pb192ZWM7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fYmlvX2Nsb25lKTsKK0VYUE9SVF9TWU1CT0woX19iaW9fY2xvbmVfZmFzdCk7CiAKIC8qKgotICoJYmlvX2Nsb25lX2Jpb3NldCAtCWNsb25lIGEgYmlvCisgKgliaW9fY2xvbmVfZmFzdCAtIGNsb25lIGEgYmlvIHRoYXQgc2hhcmVzIHRoZSBvcmlnaW5hbCBiaW8ncyBiaW92ZWMKICAqCUBiaW86IGJpbyB0byBjbG9uZQogICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CiAgKglAYnM6IGJpb19zZXQgdG8gYWxsb2NhdGUgZnJvbQogICoKLSAqIAlMaWtlIF9fYmlvX2Nsb25lLCBvbmx5IGFsc28gYWxsb2NhdGVzIHRoZSByZXR1cm5lZCBiaW8KKyAqIAlMaWtlIF9fYmlvX2Nsb25lX2Zhc3QsIG9ubHkgYWxzbyBhbGxvY2F0ZXMgdGhlIHJldHVybmVkIGJpbwogICovCi1zdHJ1Y3QgYmlvICpiaW9fY2xvbmVfYmlvc2V0KHN0cnVjdCBiaW8gKmJpbywgZ2ZwX3QgZ2ZwX21hc2ssCi0JCQkgICAgIHN0cnVjdCBiaW9fc2V0ICpicykKK3N0cnVjdCBiaW8gKmJpb19jbG9uZV9mYXN0KHN0cnVjdCBiaW8gKmJpbywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW9fc2V0ICpicykKIHsKIAlzdHJ1Y3QgYmlvICpiOwogCi0JYiA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIGJpby0+YmlfbWF4X3ZlY3MsIGJzKTsKKwliID0gYmlvX2FsbG9jX2Jpb3NldChnZnBfbWFzaywgMCwgYnMpOwogCWlmICghYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlfX2Jpb19jbG9uZShiLCBiaW8pOworCV9fYmlvX2Nsb25lX2Zhc3QoYiwgYmlvKTsKIAogCWlmIChiaW9faW50ZWdyaXR5KGJpbykpIHsKIAkJaW50IHJldDsKQEAgLTU3NCw2ICs1OTcsNzQgQEAKIAogCXJldHVybiBiOwogfQorRVhQT1JUX1NZTUJPTChiaW9fY2xvbmVfZmFzdCk7CisKKy8qKgorICogCWJpb19jbG9uZV9iaW9zZXQgLSBjbG9uZSBhIGJpbworICogCUBiaW9fc3JjOiBiaW8gdG8gY2xvbmUKKyAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBwcmlvcml0eQorICoJQGJzOiBiaW9fc2V0IHRvIGFsbG9jYXRlIGZyb20KKyAqCisgKglDbG9uZSBiaW8uIENhbGxlciB3aWxsIG93biB0aGUgcmV0dXJuZWQgYmlvLCBidXQgbm90IHRoZSBhY3R1YWwgZGF0YSBpdAorICoJcG9pbnRzIHRvLiBSZWZlcmVuY2UgY291bnQgb2YgcmV0dXJuZWQgYmlvIHdpbGwgYmUgb25lLgorICovCitzdHJ1Y3QgYmlvICpiaW9fY2xvbmVfYmlvc2V0KHN0cnVjdCBiaW8gKmJpb19zcmMsIGdmcF90IGdmcF9tYXNrLAorCQkJICAgICBzdHJ1Y3QgYmlvX3NldCAqYnMpCit7CisJdW5zaWduZWQgbnJfaW92ZWNzID0gMDsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CisJc3RydWN0IGJpb192ZWMgYnY7CisJc3RydWN0IGJpbyAqYmlvOworCisJLyoKKwkgKiBQcmUgaW1tdXRhYmxlIGJpb3ZlY3MsIF9fYmlvX2Nsb25lKCkgdXNlZCB0byBqdXN0IGRvIGEgbWVtY3B5IGZyb20KKwkgKiBiaW9fc3JjLT5iaV9pb192ZWMgdG8gYmlvLT5iaV9pb192ZWMuCisJICoKKwkgKiBXZSBjYW4ndCBkbyB0aGF0IGFueW1vcmUsIGJlY2F1c2U6CisJICoKKwkgKiAgLSBUaGUgcG9pbnQgb2YgY2xvbmluZyB0aGUgYmlvdmVjIGlzIHRvIHByb2R1Y2UgYSBiaW8gd2l0aCBhIGJpb3ZlYworCSAqICAgIHRoZSBjYWxsZXIgY2FuIG1vZGlmeTogYmlfaWR4IGFuZCBiaV9idmVjX2RvbmUgc2hvdWxkIGJlIDAuCisJICoKKwkgKiAgLSBUaGUgb3JpZ2luYWwgYmlvIGNvdWxkJ3ZlIGhhZCBtb3JlIHRoYW4gQklPX01BWF9QQUdFUyBiaW92ZWNzOyBpZgorCSAqICAgIHdlIHRyaWVkIHRvIGNsb25lIHRoZSB3aG9sZSB0aGluZyBiaW9fYWxsb2NfYmlvc2V0KCkgd291bGQgZmFpbC4KKwkgKiAgICBCdXQgdGhlIGNsb25lIHNob3VsZCBzdWNjZWVkIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBiaW92ZWNzIHdlCisJICogICAgYWN0dWFsbHkgbmVlZCB0byBhbGxvY2F0ZSBpcyBmZXdlciB0aGFuIEJJT19NQVhfUEFHRVMuCisJICoKKwkgKiAgLSBMYXN0bHksIGJpX3ZjbnQgc2hvdWxkIG5vdCBiZSBsb29rZWQgYXQgb3IgcmVsaWVkIHVwb24gYnkgY29kZQorCSAqICAgIHRoYXQgZG9lcyBub3Qgb3duIHRoZSBiaW8gLSByZWFzb24gYmVpbmcgZHJpdmVycyBkb24ndCB1c2UgaXQgZm9yCisJICogICAgaXRlcmF0aW5nIG92ZXIgdGhlIGJpb3ZlYyBhbnltb3JlLCBzbyBleHBlY3RpbmcgaXQgdG8gYmUga2VwdCB1cAorCSAqICAgIHRvIGRhdGUgKGkuZS4gZm9yIGNsb25lcyB0aGF0IHNoYXJlIHRoZSBwYXJlbnQgYmlvdmVjKSBpcyBqdXN0CisJICogICAgYXNraW5nIGZvciB0cm91YmxlIGFuZCB3b3VsZCBmb3JjZSBleHRyYSB3b3JrIG9uCisJICogICAgX19iaW9fY2xvbmVfZmFzdCgpIGFueXdheXMuCisJICovCisKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvX3NyYywgaXRlcikKKwkJbnJfaW92ZWNzKys7CisKKwliaW8gPSBiaW9fYWxsb2NfYmlvc2V0KGdmcF9tYXNrLCBucl9pb3ZlY3MsIGJzKTsKKwlpZiAoIWJpbykKKwkJcmV0dXJuIE5VTEw7CisKKwliaW8tPmJpX2JkZXYJCT0gYmlvX3NyYy0+YmlfYmRldjsKKwliaW8tPmJpX3J3CQk9IGJpb19zcmMtPmJpX3J3OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSBiaW9fc3JjLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IGJpb19zcmMtPmJpX2l0ZXIuYmlfc2l6ZTsKKworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW9fc3JjLCBpdGVyKQorCQliaW8tPmJpX2lvX3ZlY1tiaW8tPmJpX3ZjbnQrK10gPSBidjsKKworCWlmIChiaW9faW50ZWdyaXR5KGJpb19zcmMpKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gYmlvX2ludGVncml0eV9jbG9uZShiaW8sIGJpb19zcmMsIGdmcF9tYXNrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJpb19wdXQoYmlvKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIGJpbzsKK30KIEVYUE9SVF9TWU1CT0woYmlvX2Nsb25lX2Jpb3NldCk7CiAKIC8qKgpAQCAtNjEyLDcgKzcwMyw3IEBACiAJaWYgKHVubGlrZWx5KGJpb19mbGFnZ2VkKGJpbywgQklPX0NMT05FRCkpKQogCQlyZXR1cm4gMDsKIAotCWlmICgoKGJpby0+Ymlfc2l6ZSArIGxlbikgPj4gOSkgPiBtYXhfc2VjdG9ycykKKwlpZiAoKChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSArIGxlbikgPj4gOSkgPiBtYXhfc2VjdG9ycykKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNjM1LDggKzcyNiw5IEBACiAJCQkJCSAgIHNpbXVsYXRlIG1lcmdpbmcgdXBkYXRlZCBwcmV2X2J2ZWMKIAkJCQkJICAgYXMgbmV3IGJ2ZWMuICovCiAJCQkJCS5iaV9iZGV2ID0gYmlvLT5iaV9iZGV2LAotCQkJCQkuYmlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IsCi0JCQkJCS5iaV9zaXplID0gYmlvLT5iaV9zaXplIC0gcHJldl9idl9sZW4sCisJCQkJCS5iaV9zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkJCQkuYmlfc2l6ZSA9IGJpby0+YmlfaXRlci5iaV9zaXplIC0KKwkJCQkJCXByZXZfYnZfbGVuLAogCQkJCQkuYmlfcncgPSBiaW8tPmJpX3J3LAogCQkJCX07CiAKQEAgLTY4NCw4ICs3NzYsOCBAQAogCWlmIChxLT5tZXJnZV9idmVjX2ZuKSB7CiAJCXN0cnVjdCBidmVjX21lcmdlX2RhdGEgYnZtID0gewogCQkJLmJpX2JkZXYgPSBiaW8tPmJpX2JkZXYsCi0JCQkuYmlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IsCi0JCQkuYmlfc2l6ZSA9IGJpby0+Ymlfc2l6ZSwKKwkJCS5iaV9zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLAorCQkJLmJpX3NpemUgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwKIAkJCS5iaV9ydyA9IGJpby0+YmlfcncsCiAJCX07CiAKQEAgLTcwOCw3ICs4MDAsNyBAQAogCWJpby0+YmlfdmNudCsrOwogCWJpby0+YmlfcGh5c19zZWdtZW50cysrOwogIGRvbmU6Ci0JYmlvLT5iaV9zaXplICs9IGxlbjsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSArPSBsZW47CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtODA3LDI4ICs4OTksNyBAQAogCWlmIChiaW9faW50ZWdyaXR5KGJpbykpCiAJCWJpb19pbnRlZ3JpdHlfYWR2YW5jZShiaW8sIGJ5dGVzKTsKIAotCWJpby0+Ymlfc2VjdG9yICs9IGJ5dGVzID4+IDk7Ci0JYmlvLT5iaV9zaXplIC09IGJ5dGVzOwotCi0JaWYgKGJpby0+YmlfcncgJiBCSU9fTk9fQURWQU5DRV9JVEVSX01BU0spCi0JCXJldHVybjsKLQotCXdoaWxlIChieXRlcykgewotCQlpZiAodW5saWtlbHkoYmlvLT5iaV9pZHggPj0gYmlvLT5iaV92Y250KSkgewotCQkJV0FSTl9PTkNFKDEsICJiaW8gaWR4ICVkID49IHZjbnQgJWRcbiIsCi0JCQkJICBiaW8tPmJpX2lkeCwgYmlvLT5iaV92Y250KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGJ5dGVzID49IGJpb19pb3ZlYyhiaW8pLT5idl9sZW4pIHsKLQkJCWJ5dGVzIC09IGJpb19pb3ZlYyhiaW8pLT5idl9sZW47Ci0JCQliaW8tPmJpX2lkeCsrOwotCQl9IGVsc2UgewotCQkJYmlvX2lvdmVjKGJpbyktPmJ2X2xlbiAtPSBieXRlczsKLQkJCWJpb19pb3ZlYyhiaW8pLT5idl9vZmZzZXQgKz0gYnl0ZXM7Ci0JCQlieXRlcyA9IDA7Ci0JCX0KLQl9CisJYmlvX2FkdmFuY2VfaXRlcihiaW8sICZiaW8tPmJpX2l0ZXIsIGJ5dGVzKTsKIH0KIEVYUE9SVF9TWU1CT0woYmlvX2FkdmFuY2UpOwogCkBAIC04NzQsMTE3ICs5NDUsODAgQEAKICAqLwogdm9pZCBiaW9fY29weV9kYXRhKHN0cnVjdCBiaW8gKmRzdCwgc3RydWN0IGJpbyAqc3JjKQogewotCXN0cnVjdCBiaW9fdmVjICpzcmNfYnYsICpkc3RfYnY7Ci0JdW5zaWduZWQgc3JjX29mZnNldCwgZHN0X29mZnNldCwgYnl0ZXM7CisJc3RydWN0IGJ2ZWNfaXRlciBzcmNfaXRlciwgZHN0X2l0ZXI7CisJc3RydWN0IGJpb192ZWMgc3JjX2J2LCBkc3RfYnY7CiAJdm9pZCAqc3JjX3AsICpkc3RfcDsKKwl1bnNpZ25lZCBieXRlczsKIAotCXNyY19idiA9IGJpb19pb3ZlYyhzcmMpOwotCWRzdF9idiA9IGJpb19pb3ZlYyhkc3QpOwotCi0Jc3JjX29mZnNldCA9IHNyY19idi0+YnZfb2Zmc2V0OwotCWRzdF9vZmZzZXQgPSBkc3RfYnYtPmJ2X29mZnNldDsKKwlzcmNfaXRlciA9IHNyYy0+YmlfaXRlcjsKKwlkc3RfaXRlciA9IGRzdC0+YmlfaXRlcjsKIAogCXdoaWxlICgxKSB7Ci0JCWlmIChzcmNfb2Zmc2V0ID09IHNyY19idi0+YnZfb2Zmc2V0ICsgc3JjX2J2LT5idl9sZW4pIHsKLQkJCXNyY19idisrOwotCQkJaWYgKHNyY19idiA9PSBiaW9faW92ZWNfaWR4KHNyYywgc3JjLT5iaV92Y250KSkgewotCQkJCXNyYyA9IHNyYy0+YmlfbmV4dDsKLQkJCQlpZiAoIXNyYykKLQkJCQkJYnJlYWs7CisJCWlmICghc3JjX2l0ZXIuYmlfc2l6ZSkgeworCQkJc3JjID0gc3JjLT5iaV9uZXh0OworCQkJaWYgKCFzcmMpCisJCQkJYnJlYWs7CiAKLQkJCQlzcmNfYnYgPSBiaW9faW92ZWMoc3JjKTsKLQkJCX0KLQotCQkJc3JjX29mZnNldCA9IHNyY19idi0+YnZfb2Zmc2V0OworCQkJc3JjX2l0ZXIgPSBzcmMtPmJpX2l0ZXI7CiAJCX0KIAotCQlpZiAoZHN0X29mZnNldCA9PSBkc3RfYnYtPmJ2X29mZnNldCArIGRzdF9idi0+YnZfbGVuKSB7Ci0JCQlkc3RfYnYrKzsKLQkJCWlmIChkc3RfYnYgPT0gYmlvX2lvdmVjX2lkeChkc3QsIGRzdC0+YmlfdmNudCkpIHsKLQkJCQlkc3QgPSBkc3QtPmJpX25leHQ7Ci0JCQkJaWYgKCFkc3QpCi0JCQkJCWJyZWFrOworCQlpZiAoIWRzdF9pdGVyLmJpX3NpemUpIHsKKwkJCWRzdCA9IGRzdC0+YmlfbmV4dDsKKwkJCWlmICghZHN0KQorCQkJCWJyZWFrOwogCi0JCQkJZHN0X2J2ID0gYmlvX2lvdmVjKGRzdCk7Ci0JCQl9Ci0KLQkJCWRzdF9vZmZzZXQgPSBkc3RfYnYtPmJ2X29mZnNldDsKKwkJCWRzdF9pdGVyID0gZHN0LT5iaV9pdGVyOwogCQl9CiAKLQkJYnl0ZXMgPSBtaW4oZHN0X2J2LT5idl9vZmZzZXQgKyBkc3RfYnYtPmJ2X2xlbiAtIGRzdF9vZmZzZXQsCi0JCQkgICAgc3JjX2J2LT5idl9vZmZzZXQgKyBzcmNfYnYtPmJ2X2xlbiAtIHNyY19vZmZzZXQpOworCQlzcmNfYnYgPSBiaW9faXRlcl9pb3ZlYyhzcmMsIHNyY19pdGVyKTsKKwkJZHN0X2J2ID0gYmlvX2l0ZXJfaW92ZWMoZHN0LCBkc3RfaXRlcik7CiAKLQkJc3JjX3AgPSBrbWFwX2F0b21pYyhzcmNfYnYtPmJ2X3BhZ2UpOwotCQlkc3RfcCA9IGttYXBfYXRvbWljKGRzdF9idi0+YnZfcGFnZSk7CisJCWJ5dGVzID0gbWluKHNyY19idi5idl9sZW4sIGRzdF9idi5idl9sZW4pOwogCi0JCW1lbWNweShkc3RfcCArIGRzdF9vZmZzZXQsCi0JCSAgICAgICBzcmNfcCArIHNyY19vZmZzZXQsCisJCXNyY19wID0ga21hcF9hdG9taWMoc3JjX2J2LmJ2X3BhZ2UpOworCQlkc3RfcCA9IGttYXBfYXRvbWljKGRzdF9idi5idl9wYWdlKTsKKworCQltZW1jcHkoZHN0X3AgKyBkc3RfYnYuYnZfb2Zmc2V0LAorCQkgICAgICAgc3JjX3AgKyBzcmNfYnYuYnZfb2Zmc2V0LAogCQkgICAgICAgYnl0ZXMpOwogCiAJCWt1bm1hcF9hdG9taWMoZHN0X3ApOwogCQlrdW5tYXBfYXRvbWljKHNyY19wKTsKIAotCQlzcmNfb2Zmc2V0ICs9IGJ5dGVzOwotCQlkc3Rfb2Zmc2V0ICs9IGJ5dGVzOworCQliaW9fYWR2YW5jZV9pdGVyKHNyYywgJnNyY19pdGVyLCBieXRlcyk7CisJCWJpb19hZHZhbmNlX2l0ZXIoZHN0LCAmZHN0X2l0ZXIsIGJ5dGVzKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGJpb19jb3B5X2RhdGEpOwogCiBzdHJ1Y3QgYmlvX21hcF9kYXRhIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqaW92ZWNzOwotCXN0cnVjdCBzZ19pb3ZlYyAqc2d2ZWNzOwogCWludCBucl9zZ3ZlY3M7CiAJaW50IGlzX291cl9wYWdlczsKKwlzdHJ1Y3Qgc2dfaW92ZWMgc2d2ZWNzW107CiB9OwogCiBzdGF0aWMgdm9pZCBiaW9fc2V0X21hcF9kYXRhKHN0cnVjdCBiaW9fbWFwX2RhdGEgKmJtZCwgc3RydWN0IGJpbyAqYmlvLAogCQkJICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKIAkJCSAgICAgaW50IGlzX291cl9wYWdlcykKIHsKLQltZW1jcHkoYm1kLT5pb3ZlY3MsIGJpby0+YmlfaW9fdmVjLCBzaXplb2Yoc3RydWN0IGJpb192ZWMpICogYmlvLT5iaV92Y250KTsKIAltZW1jcHkoYm1kLT5zZ3ZlY3MsIGlvdiwgc2l6ZW9mKHN0cnVjdCBzZ19pb3ZlYykgKiBpb3ZfY291bnQpOwogCWJtZC0+bnJfc2d2ZWNzID0gaW92X2NvdW50OwogCWJtZC0+aXNfb3VyX3BhZ2VzID0gaXNfb3VyX3BhZ2VzOwogCWJpby0+YmlfcHJpdmF0ZSA9IGJtZDsKIH0KIAotc3RhdGljIHZvaWQgYmlvX2ZyZWVfbWFwX2RhdGEoc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kKQotewotCWtmcmVlKGJtZC0+aW92ZWNzKTsKLQlrZnJlZShibWQtPnNndmVjcyk7Ci0Ja2ZyZWUoYm1kKTsKLX0KLQogc3RhdGljIHN0cnVjdCBiaW9fbWFwX2RhdGEgKmJpb19hbGxvY19tYXBfZGF0YShpbnQgbnJfc2VncywKIAkJCQkJICAgICAgIHVuc2lnbmVkIGludCBpb3ZfY291bnQsCiAJCQkJCSAgICAgICBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQ7Ci0KIAlpZiAoaW92X2NvdW50ID4gVUlPX01BWElPVikKIAkJcmV0dXJuIE5VTEw7CiAKLQlibWQgPSBrbWFsbG9jKHNpemVvZigqYm1kKSwgZ2ZwX21hc2spOwotCWlmICghYm1kKQotCQlyZXR1cm4gTlVMTDsKLQotCWJtZC0+aW92ZWNzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJpb192ZWMpICogbnJfc2VncywgZ2ZwX21hc2spOwotCWlmICghYm1kLT5pb3ZlY3MpIHsKLQkJa2ZyZWUoYm1kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYm1kLT5zZ3ZlY3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaW92X2NvdW50LCBnZnBfbWFzayk7Ci0JaWYgKGJtZC0+c2d2ZWNzKQotCQlyZXR1cm4gYm1kOwotCi0Ja2ZyZWUoYm1kLT5pb3ZlY3MpOwotCWtmcmVlKGJtZCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaW9fbWFwX2RhdGEpICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaW92X2NvdW50LCBnZnBfbWFzayk7CiB9CiAKLXN0YXRpYyBpbnQgX19iaW9fY29weV9pb3Yoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvX3ZlYyAqaW92ZWNzLAotCQkJICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKK3N0YXRpYyBpbnQgX19iaW9fY29weV9pb3Yoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKIAkJCSAgaW50IHRvX3VzZXIsIGludCBmcm9tX3VzZXIsIGludCBkb19mcmVlX3BhZ2UpCiB7CiAJaW50IHJldCA9IDAsIGk7CkBAIC05OTQsNyArMTAyOCw3IEBACiAKIAliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCWNoYXIgKmJ2X2FkZHIgPSBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSk7Ci0JCXVuc2lnbmVkIGludCBidl9sZW4gPSBpb3ZlY3NbaV0uYnZfbGVuOworCQl1bnNpZ25lZCBpbnQgYnZfbGVuID0gYnZlYy0+YnZfbGVuOwogCiAJCXdoaWxlIChidl9sZW4gJiYgaW92X2lkeCA8IGlvdl9jb3VudCkgewogCQkJdW5zaWduZWQgaW50IGJ5dGVzOwpAQCAtMTA1NCwxNCArMTA4OCwxNCBAQAogCQkgKiBkb24ndCBjb3B5IGludG8gYSByYW5kb20gdXNlciBhZGRyZXNzIHNwYWNlLCBqdXN0IGZyZWUuCiAJCSAqLwogCQlpZiAoY3VycmVudC0+bW0pCi0JCQlyZXQgPSBfX2Jpb19jb3B5X2lvdihiaW8sIGJtZC0+aW92ZWNzLCBibWQtPnNndmVjcywKLQkJCQkJICAgICBibWQtPm5yX3NndmVjcywgYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCwKKwkJCXJldCA9IF9fYmlvX2NvcHlfaW92KGJpbywgYm1kLT5zZ3ZlY3MsIGJtZC0+bnJfc2d2ZWNzLAorCQkJCQkgICAgIGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQsCiAJCQkJCSAgICAgMCwgYm1kLT5pc19vdXJfcGFnZXMpOwogCQllbHNlIGlmIChibWQtPmlzX291cl9wYWdlcykKIAkJCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmVjLCBiaW8sIGkpCiAJCQkJX19mcmVlX3BhZ2UoYnZlYy0+YnZfcGFnZSk7CiAJfQotCWJpb19mcmVlX21hcF9kYXRhKGJtZCk7CisJa2ZyZWUoYm1kKTsKIAliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNzUsNyArMTIwOSw3IEBACiAJICovCiAJaWYgKCghd3JpdGVfdG9fdm0gJiYgKCFtYXBfZGF0YSB8fCAhbWFwX2RhdGEtPm51bGxfbWFwcGVkKSkgfHwKIAkgICAgKG1hcF9kYXRhICYmIG1hcF9kYXRhLT5mcm9tX3VzZXIpKSB7Ci0JCXJldCA9IF9fYmlvX2NvcHlfaW92KGJpbywgYmlvLT5iaV9pb192ZWMsIGlvdiwgaW92X2NvdW50LCAwLCAxLCAwKTsKKwkJcmV0ID0gX19iaW9fY29weV9pb3YoYmlvLCBpb3YsIGlvdl9jb3VudCwgMCwgMSwgMCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTE4OSw3ICsxMjIzLDcgQEAKIAogCWJpb19wdXQoYmlvKTsKIG91dF9ibWQ6Ci0JYmlvX2ZyZWVfbWFwX2RhdGEoYm1kKTsKKwlrZnJlZShibWQpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKQEAgLTE0ODUsNyArMTUxOSw3IEBACiAJaWYgKElTX0VSUihiaW8pKQogCQlyZXR1cm4gYmlvOwogCi0JaWYgKGJpby0+Ymlfc2l6ZSA9PSBsZW4pCisJaWYgKGJpby0+YmlfaXRlci5iaV9zaXplID09IGxlbikKIAkJcmV0dXJuIGJpbzsKIAogCS8qCkBAIC0xNTA2LDE2ICsxNTQwLDE1IEBACiAKIAliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCWNoYXIgKmFkZHIgPSBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSk7Ci0JCWludCBsZW4gPSBibWQtPmlvdmVjc1tpXS5idl9sZW47CiAKIAkJaWYgKHJlYWQpCi0JCQltZW1jcHkocCwgYWRkciwgbGVuKTsKKwkJCW1lbWNweShwLCBhZGRyLCBidmVjLT5idl9sZW4pOwogCiAJCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOwotCQlwICs9IGxlbjsKKwkJcCArPSBidmVjLT5idl9sZW47CiAJfQogCi0JYmlvX2ZyZWVfbWFwX2RhdGEoYm1kKTsKKwlrZnJlZShibWQpOwogCWJpb19wdXQoYmlvKTsKIH0KIApAQCAtMTY4NiwxMSArMTcxOSwxMSBAQAogI2lmIEFSQ0hfSU1QTEVNRU5UU19GTFVTSF9EQ0FDSEVfUEFHRQogdm9pZCBiaW9fZmx1c2hfZGNhY2hlX3BhZ2VzKHN0cnVjdCBiaW8gKmJpKQogewotCWludCBpOwotCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXN0cnVjdCBiaW9fdmVjIGJ2ZWM7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmksIGkpCi0JCWZsdXNoX2RjYWNoZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpLCBpdGVyKQorCQlmbHVzaF9kY2FjaGVfcGFnZShidmVjLmJ2X3BhZ2UpOwogfQogRVhQT1JUX1NZTUJPTChiaW9fZmx1c2hfZGNhY2hlX3BhZ2VzKTsKICNlbmRpZgpAQCAtMTcxMSw5NiArMTc0NCw4NiBAQAogICoqLwogdm9pZCBiaW9fZW5kaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCiB7Ci0JaWYgKGVycm9yKQotCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0JZWxzZSBpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKQotCQllcnJvciA9IC1FSU87CisJd2hpbGUgKGJpbykgeworCQlCVUdfT04oYXRvbWljX3JlYWQoJmJpby0+YmlfcmVtYWluaW5nKSA8PSAwKTsKIAotCWlmIChiaW8tPmJpX2VuZF9pbykKLQkJYmlvLT5iaV9lbmRfaW8oYmlvLCBlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwkJZWxzZSBpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKQorCQkJZXJyb3IgPSAtRUlPOworCisJCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYmlvLT5iaV9yZW1haW5pbmcpKQorCQkJcmV0dXJuOworCisJCS8qCisJCSAqIE5lZWQgdG8gaGF2ZSBhIHJlYWwgZW5kaW8gZnVuY3Rpb24gZm9yIGNoYWluZWQgYmlvcywKKwkJICogb3RoZXJ3aXNlIHZhcmlvdXMgY29ybmVyIGNhc2VzIHdpbGwgYnJlYWsgKGxpa2Ugc3RhY2tpbmcKKwkJICogYmxvY2sgZGV2aWNlcyB0aGF0IHNhdmUvcmVzdG9yZSBiaV9lbmRfaW8pIC0gaG93ZXZlciwgd2Ugd2FudAorCQkgKiB0byBhdm9pZCB1bmJvdW5kZWQgcmVjdXJzaW9uIGFuZCBibG93aW5nIHRoZSBzdGFjay4gVGFpbCBjYWxsCisJCSAqIG9wdGltaXphdGlvbiB3b3VsZCBoYW5kbGUgdGhpcywgYnV0IGNvbXBpbGluZyB3aXRoIGZyYW1lCisJCSAqIHBvaW50ZXJzIGFsc28gZGlzYWJsZXMgZ2NjJ3Mgc2libGluZyBjYWxsIG9wdGltaXphdGlvbi4KKwkJICovCisJCWlmIChiaW8tPmJpX2VuZF9pbyA9PSBiaW9fY2hhaW5fZW5kaW8pIHsKKwkJCXN0cnVjdCBiaW8gKnBhcmVudCA9IGJpby0+YmlfcHJpdmF0ZTsKKwkJCWJpb19wdXQoYmlvKTsKKwkJCWJpbyA9IHBhcmVudDsKKwkJfSBlbHNlIHsKKwkJCWlmIChiaW8tPmJpX2VuZF9pbykKKwkJCQliaW8tPmJpX2VuZF9pbyhiaW8sIGVycm9yKTsKKwkJCWJpbyA9IE5VTEw7CisJCX0KKwl9CiB9CiBFWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7CiAKLXZvaWQgYmlvX3BhaXJfcmVsZWFzZShzdHJ1Y3QgYmlvX3BhaXIgKmJwKQorLyoqCisgKiBiaW9fZW5kaW9fbm9kZWMgLSBlbmQgSS9PIG9uIGEgYmlvLCB3aXRob3V0IGRlY3JlbWVudGluZyBiaV9yZW1haW5pbmcKKyAqIEBiaW86CWJpbworICogQGVycm9yOgllcnJvciwgaWYgYW55CisgKgorICogRm9yIGNvZGUgdGhhdCBoYXMgc2F2ZWQgYW5kIHJlc3RvcmVkIGJpX2VuZF9pbzsgdGhpbmcgaGFyZCBiZWZvcmUgdXNpbmcgdGhpcworICogZnVuY3Rpb24sIHByb2JhYmx5IHlvdSBzaG91bGQndmUgY2xvbmVkIHRoZSBlbnRpcmUgYmlvLgorICoqLwordm9pZCBiaW9fZW5kaW9fbm9kZWMoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJwLT5jbnQpKSB7Ci0JCXN0cnVjdCBiaW8gKm1hc3RlciA9IGJwLT5iaW8xLmJpX3ByaXZhdGU7Ci0KLQkJYmlvX2VuZGlvKG1hc3RlciwgYnAtPmVycm9yKTsKLQkJbWVtcG9vbF9mcmVlKGJwLCBicC0+YmlvMi5iaV9wcml2YXRlKTsKLQl9CisJYXRvbWljX2luYygmYmlvLT5iaV9yZW1haW5pbmcpOworCWJpb19lbmRpbyhiaW8sIGVycm9yKTsKIH0KLUVYUE9SVF9TWU1CT0woYmlvX3BhaXJfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKGJpb19lbmRpb19ub2RlYyk7CiAKLXN0YXRpYyB2b2lkIGJpb19wYWlyX2VuZF8xKHN0cnVjdCBiaW8gKmJpLCBpbnQgZXJyKQotewotCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBjb250YWluZXJfb2YoYmksIHN0cnVjdCBiaW9fcGFpciwgYmlvMSk7Ci0KLQlpZiAoZXJyKQotCQlicC0+ZXJyb3IgPSBlcnI7Ci0KLQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYmlvX3BhaXJfZW5kXzIoc3RydWN0IGJpbyAqYmksIGludCBlcnIpCi17Ci0Jc3RydWN0IGJpb19wYWlyICpicCA9IGNvbnRhaW5lcl9vZihiaSwgc3RydWN0IGJpb19wYWlyLCBiaW8yKTsKLQotCWlmIChlcnIpCi0JCWJwLT5lcnJvciA9IGVycjsKLQotCWJpb19wYWlyX3JlbGVhc2UoYnApOwotfQotCi0vKgotICogc3BsaXQgYSBiaW8gLSBvbmx5IHdvcnJ5IGFib3V0IGEgYmlvIHdpdGggYSBzaW5nbGUgcGFnZSBpbiBpdHMgaW92ZWMKKy8qKgorICogYmlvX3NwbGl0IC0gc3BsaXQgYSBiaW8KKyAqIEBiaW86CWJpbyB0byBzcGxpdAorICogQHNlY3RvcnM6CW51bWJlciBvZiBzZWN0b3JzIHRvIHNwbGl0IGZyb20gdGhlIGZyb250IG9mIEBiaW8KKyAqIEBnZnA6CWdmcCBtYXNrCisgKiBAYnM6CQliaW8gc2V0IHRvIGFsbG9jYXRlIGZyb20KKyAqCisgKiBBbGxvY2F0ZXMgYW5kIHJldHVybnMgYSBuZXcgYmlvIHdoaWNoIHJlcHJlc2VudHMgQHNlY3RvcnMgZnJvbSB0aGUgc3RhcnQgb2YKKyAqIEBiaW8sIGFuZCB1cGRhdGVzIEBiaW8gdG8gcmVwcmVzZW50IHRoZSByZW1haW5pbmcgc2VjdG9ycy4KKyAqCisgKiBUaGUgbmV3bHkgYWxsb2NhdGVkIGJpbyB3aWxsIHBvaW50IHRvIEBiaW8ncyBiaV9pb192ZWM7IGl0IGlzIHRoZSBjYWxsZXIncworICogcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgQGJpbyBpcyBub3QgZnJlZWQgYmVmb3JlIHRoZSBzcGxpdC4KICAqLwotc3RydWN0IGJpb19wYWlyICpiaW9fc3BsaXQoc3RydWN0IGJpbyAqYmksIGludCBmaXJzdF9zZWN0b3JzKQorc3RydWN0IGJpbyAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpbywgaW50IHNlY3RvcnMsCisJCSAgICAgIGdmcF90IGdmcCwgc3RydWN0IGJpb19zZXQgKmJzKQogewotCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBtZW1wb29sX2FsbG9jKGJpb19zcGxpdF9wb29sLCBHRlBfTk9JTyk7CisJc3RydWN0IGJpbyAqc3BsaXQgPSBOVUxMOwogCi0JaWYgKCFicCkKLQkJcmV0dXJuIGJwOworCUJVR19PTihzZWN0b3JzIDw9IDApOworCUJVR19PTihzZWN0b3JzID49IGJpb19zZWN0b3JzKGJpbykpOwogCi0JdHJhY2VfYmxvY2tfc3BsaXQoYmRldl9nZXRfcXVldWUoYmktPmJpX2JkZXYpLCBiaSwKLQkJCQliaS0+Ymlfc2VjdG9yICsgZmlyc3Rfc2VjdG9ycyk7CisJc3BsaXQgPSBiaW9fY2xvbmVfZmFzdChiaW8sIGdmcCwgYnMpOworCWlmICghc3BsaXQpCisJCXJldHVybiBOVUxMOwogCi0JQlVHX09OKGJpb19zZWdtZW50cyhiaSkgPiAxKTsKLQlhdG9taWNfc2V0KCZicC0+Y250LCAzKTsKLQlicC0+ZXJyb3IgPSAwOwotCWJwLT5iaW8xID0gKmJpOwotCWJwLT5iaW8yID0gKmJpOwotCWJwLT5iaW8yLmJpX3NlY3RvciArPSBmaXJzdF9zZWN0b3JzOwotCWJwLT5iaW8yLmJpX3NpemUgLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OwotCWJwLT5iaW8xLmJpX3NpemUgPSBmaXJzdF9zZWN0b3JzIDw8IDk7CisJc3BsaXQtPmJpX2l0ZXIuYmlfc2l6ZSA9IHNlY3RvcnMgPDwgOTsKIAotCWlmIChiaS0+YmlfdmNudCAhPSAwKSB7Ci0JCWJwLT5idjEgPSAqYmlvX2lvdmVjKGJpKTsKLQkJYnAtPmJ2MiA9ICpiaW9faW92ZWMoYmkpOworCWlmIChiaW9faW50ZWdyaXR5KHNwbGl0KSkKKwkJYmlvX2ludGVncml0eV90cmltKHNwbGl0LCAwLCBzZWN0b3JzKTsKIAotCQlpZiAoYmlvX2lzX3J3KGJpKSkgewotCQkJYnAtPmJ2Mi5idl9vZmZzZXQgKz0gZmlyc3Rfc2VjdG9ycyA8PCA5OwotCQkJYnAtPmJ2Mi5idl9sZW4gLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OwotCQkJYnAtPmJ2MS5idl9sZW4gPSBmaXJzdF9zZWN0b3JzIDw8IDk7Ci0JCX0KKwliaW9fYWR2YW5jZShiaW8sIHNwbGl0LT5iaV9pdGVyLmJpX3NpemUpOwogCi0JCWJwLT5iaW8xLmJpX2lvX3ZlYyA9ICZicC0+YnYxOwotCQlicC0+YmlvMi5iaV9pb192ZWMgPSAmYnAtPmJ2MjsKLQotCQlicC0+YmlvMS5iaV9tYXhfdmVjcyA9IDE7Ci0JCWJwLT5iaW8yLmJpX21heF92ZWNzID0gMTsKLQl9Ci0KLQlicC0+YmlvMS5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMTsKLQlicC0+YmlvMi5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMjsKLQotCWJwLT5iaW8xLmJpX3ByaXZhdGUgPSBiaTsKLQlicC0+YmlvMi5iaV9wcml2YXRlID0gYmlvX3NwbGl0X3Bvb2w7Ci0KLQlpZiAoYmlvX2ludGVncml0eShiaSkpCi0JCWJpb19pbnRlZ3JpdHlfc3BsaXQoYmksIGJwLCBmaXJzdF9zZWN0b3JzKTsKLQotCXJldHVybiBicDsKKwlyZXR1cm4gc3BsaXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGJpb19zcGxpdCk7CiAKQEAgLTE4MTQsODAgKzE4MzcsMjAgQEAKIHsKIAkvKiAnYmlvJyBpcyBhIGNsb25lZCBiaW8gd2hpY2ggd2UgbmVlZCB0byB0cmltIHRvIG1hdGNoCiAJICogdGhlIGdpdmVuIG9mZnNldCBhbmQgc2l6ZS4KLQkgKiBUaGlzIHJlcXVpcmVzIGFkanVzdGluZyBiaV9zZWN0b3IsIGJpX3NpemUsIGFuZCBiaV9pb192ZWMKIAkgKi8KLQlpbnQgaTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQlpbnQgc29mYXIgPSAwOwogCiAJc2l6ZSA8PD0gOTsKLQlpZiAob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSBiaW8tPmJpX3NpemUpCisJaWYgKG9mZnNldCA9PSAwICYmIHNpemUgPT0gYmlvLT5iaV9pdGVyLmJpX3NpemUpCiAJCXJldHVybjsKIAogCWNsZWFyX2JpdChCSU9fU0VHX1ZBTElELCAmYmlvLT5iaV9mbGFncyk7CiAKIAliaW9fYWR2YW5jZShiaW8sIG9mZnNldCA8PCA5KTsKIAotCWJpby0+Ymlfc2l6ZSA9IHNpemU7Ci0KLQkvKiBhdm9pZCBhbnkgY29tcGxpY2F0aW9ucyB3aXRoIGJpX2lkeCBiZWluZyBub24temVybyovCi0JaWYgKGJpby0+YmlfaWR4KSB7Ci0JCW1lbW1vdmUoYmlvLT5iaV9pb192ZWMsIGJpby0+YmlfaW9fdmVjK2Jpby0+YmlfaWR4LAotCQkJKGJpby0+YmlfdmNudCAtIGJpby0+YmlfaWR4KSAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOwotCQliaW8tPmJpX3ZjbnQgLT0gYmlvLT5iaV9pZHg7Ci0JCWJpby0+YmlfaWR4ID0gMDsKLQl9Ci0JLyogTWFrZSBzdXJlIHZjbnQgYW5kIGxhc3QgYnYgYXJlIG5vdCB0b28gYmlnICovCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7Ci0JCWlmIChzb2ZhciArIGJ2ZWMtPmJ2X2xlbiA+IHNpemUpCi0JCQlidmVjLT5idl9sZW4gPSBzaXplIC0gc29mYXI7Ci0JCWlmIChidmVjLT5idl9sZW4gPT0gMCkgewotCQkJYmlvLT5iaV92Y250ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNvZmFyICs9IGJ2ZWMtPmJ2X2xlbjsKLQl9CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBzaXplOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmlvX3RyaW0pOwogCi0vKioKLSAqICAgICAgYmlvX3NlY3Rvcl9vZmZzZXQgLSBGaW5kIGhhcmR3YXJlIHNlY3RvciBvZmZzZXQgaW4gYmlvCi0gKiAgICAgIEBiaW86ICAgICAgICAgICBiaW8gdG8gaW5zcGVjdAotICogICAgICBAaW5kZXg6ICAgICAgICAgYmlvX3ZlYyBpbmRleAotICogICAgICBAb2Zmc2V0OiAgICAgICAgb2Zmc2V0IGluIGJ2X3BhZ2UKLSAqCi0gKiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGhhcmR3YXJlIHNlY3RvcnMgYmV0d2VlbiBiZWdpbm5pbmcgb2YgYmlvCi0gKiAgICAgIGFuZCBhbiBlbmQgcG9pbnQgaW5kaWNhdGVkIGJ5IGEgYmlvX3ZlYyBpbmRleCBhbmQgYW4gb2Zmc2V0Ci0gKiAgICAgIHdpdGhpbiB0aGF0IHZlY3RvcidzIHBhZ2UuCi0gKi8KLXNlY3Rvcl90IGJpb19zZWN0b3Jfb2Zmc2V0KHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgc2hvcnQgaW5kZXgsCi0JCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXVuc2lnbmVkIGludCBzZWN0b3Jfc3o7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCXNlY3Rvcl90IHNlY3RvcnM7Ci0JaW50IGk7Ci0KLQlzZWN0b3Jfc3ogPSBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5xdWV1ZSk7Ci0Jc2VjdG9ycyA9IDA7Ci0KLQlpZiAoaW5kZXggPj0gYmlvLT5iaV9pZHgpCi0JCWluZGV4ID0gYmlvLT5iaV92Y250IC0gMTsKLQotCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYmlvLCBpKSB7Ci0JCWlmIChpID09IGluZGV4KSB7Ci0JCQlpZiAob2Zmc2V0ID4gYnYtPmJ2X29mZnNldCkKLQkJCQlzZWN0b3JzICs9IChvZmZzZXQgLSBidi0+YnZfb2Zmc2V0KSAvIHNlY3Rvcl9zejsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2VjdG9ycyArPSBidi0+YnZfbGVuIC8gc2VjdG9yX3N6OwotCX0KLQotCXJldHVybiBzZWN0b3JzOwotfQotRVhQT1JUX1NZTUJPTChiaW9fc2VjdG9yX29mZnNldCk7Ci0KIC8qCiAgKiBjcmVhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW92ZWMncyBpbiBhIGJpb19zZXQuCiAgKiB1c2UgdGhlIGdsb2JhbCBiaW92ZWMgc2xhYnMgY3JlYXRlZCBmb3IgZ2VuZXJhbCB1c2UuCkBAIC0yMDY1LDExICsyMDI4LDYgQEAKIAlpZiAoYmlvc2V0X2ludGVncml0eV9jcmVhdGUoZnNfYmlvX3NldCwgQklPX1BPT0xfU0laRSkpCiAJCXBhbmljKCJiaW86IGNhbid0IGNyZWF0ZSBpbnRlZ3JpdHkgcG9vbFxuIik7CiAKLQliaW9fc3BsaXRfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbChCSU9fU1BMSVRfRU5UUklFUywKLQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBiaW9fcGFpcikpOwotCWlmICghYmlvX3NwbGl0X3Bvb2wpCi0JCXBhbmljKCJiaW86IGNhbid0IGNyZWF0ZSBzcGxpdCBwb29sXG4iKTsKLQogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKGluaXRfYmlvKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL0tjb25maWcgYi9mcy9idHJmcy9LY29uZmlnCmluZGV4IGFhOTc2ZWMuLmE2Njc2OGUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL0tjb25maWcKKysrIGIvZnMvYnRyZnMvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBCVFJGU19GUwogCXRyaXN0YXRlICJCdHJmcyBmaWxlc3lzdGVtIHN1cHBvcnQiCi0Jc2VsZWN0IExJQkNSQzMyQworCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0NSQzMyQwogCXNlbGVjdCBaTElCX0lORkxBVEUKIAlzZWxlY3QgWkxJQl9ERUZMQVRFCiAJc2VsZWN0IExaT19DT01QUkVTUwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvTWFrZWZpbGUgYi9mcy9idHJmcy9NYWtlZmlsZQppbmRleCAxYTQ0ZTQyLi5mMzQxYTk4IDEwMDY0NAotLS0gYS9mcy9idHJmcy9NYWtlZmlsZQorKysgYi9mcy9idHJmcy9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAkgICBleHBvcnQubyB0cmVlLWxvZy5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gbHpvLm8gXAogCSAgIGNvbXByZXNzaW9uLm8gZGVsYXllZC1yZWYubyByZWxvY2F0aW9uLm8gZGVsYXllZC1pbm9kZS5vIHNjcnViLm8gXAogCSAgIHJlYWRhLm8gYmFja3JlZi5vIHVsaXN0Lm8gcWdyb3VwLm8gc2VuZC5vIGRldi1yZXBsYWNlLm8gcmFpZDU2Lm8gXAotCSAgIHV1aWQtdHJlZS5vCisJICAgdXVpZC10cmVlLm8gcHJvcHMubyBoYXNoLm8KIAogYnRyZnMtJChDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMKSArPSBhY2wubwogYnRyZnMtJChDT05GSUdfQlRSRlNfRlNfQ0hFQ0tfSU5URUdSSVRZKSArPSBjaGVjay1pbnRlZ3JpdHkubwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5jIGIvZnMvYnRyZnMvYmFja3JlZi5jCmluZGV4IDM3NzU5NDcuLmFkZWQzZWYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2JhY2tyZWYuYworKysgYi9mcy9idHJmcy9iYWNrcmVmLmMKQEAgLTY2LDYgKzY2LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfaW5vZGVfZWxlbV9saXN0KHN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqZWllKQoreworCXN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqZWllX25leHQ7CisKKwlmb3IgKDsgZWllOyBlaWUgPSBlaWVfbmV4dCkgeworCQllaWVfbmV4dCA9IGVpZS0+bmV4dDsKKwkJa2ZyZWUoZWllKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZmluZF9leHRlbnRfaW5fZWIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB1NjQgd2FudGVkX2Rpc2tfYnl0ZSwKIAkJCQl1NjQgZXh0ZW50X2l0ZW1fcG9zLAogCQkJCXN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqKmVpZSkKQEAgLTIwOSwxOCArMjE5LDE5IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRkX2FsbF9wYXJlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJCQlzdHJ1Y3QgdWxpc3QgKnBhcmVudHMsIGludCBsZXZlbCwKLQkJCQlzdHJ1Y3QgYnRyZnNfa2V5ICprZXlfZm9yX3NlYXJjaCwgdTY0IHRpbWVfc2VxLAotCQkJCXU2NCB3YW50ZWRfZGlza19ieXRlLAotCQkJCWNvbnN0IHU2NCAqZXh0ZW50X2l0ZW1fcG9zKQorCQkJICAgc3RydWN0IHVsaXN0ICpwYXJlbnRzLCBzdHJ1Y3QgX19wcmVsaW1fcmVmICpyZWYsCisJCQkgICBpbnQgbGV2ZWwsIHU2NCB0aW1lX3NlcSwgY29uc3QgdTY0ICpleHRlbnRfaXRlbV9wb3MpCiB7CiAJaW50IHJldCA9IDA7CiAJaW50IHNsb3Q7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwogCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgKmtleV9mb3Jfc2VhcmNoID0gJnJlZi0+a2V5X2Zvcl9zZWFyY2g7CiAJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmZpOwogCXN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqZWllID0gTlVMTCwgKm9sZCA9IE5VTEw7CiAJdTY0IGRpc2tfYnl0ZTsKKwl1NjQgd2FudGVkX2Rpc2tfYnl0ZSA9IHJlZi0+d2FudGVkX2Rpc2tfYnl0ZTsKKwl1NjQgY291bnQgPSAwOwogCiAJaWYgKGxldmVsICE9IDApIHsKIAkJZWIgPSBwYXRoLT5ub2Rlc1tsZXZlbF07CkBAIC0yMzgsNyArMjQ5LDcgQEAKIAlpZiAocGF0aC0+c2xvdHNbMF0gPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pKQogCQlyZXQgPSBidHJmc19uZXh0X29sZF9sZWFmKHJvb3QsIHBhdGgsIHRpbWVfc2VxKTsKIAotCXdoaWxlICghcmV0KSB7CisJd2hpbGUgKCFyZXQgJiYgY291bnQgPCByZWYtPmNvdW50KSB7CiAJCWViID0gcGF0aC0+bm9kZXNbMF07CiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKIApAQCAtMjU0LDYgKzI2NSw3IEBACiAJCWlmIChkaXNrX2J5dGUgPT0gd2FudGVkX2Rpc2tfYnl0ZSkgewogCQkJZWllID0gTlVMTDsKIAkJCW9sZCA9IE5VTEw7CisJCQljb3VudCsrOwogCQkJaWYgKGV4dGVudF9pdGVtX3BvcykgewogCQkJCXJldCA9IGNoZWNrX2V4dGVudF9pbl9lYigma2V5LCBlYiwgZmksCiAJCQkJCQkqZXh0ZW50X2l0ZW1fcG9zLApAQCAtMjczLDYgKzI4NSw3IEBACiAJCQkJCW9sZCA9IG9sZC0+bmV4dDsKIAkJCQlvbGQtPm5leHQgPSBlaWU7CiAJCQl9CisJCQllaWUgPSBOVUxMOwogCQl9CiBuZXh0OgogCQlyZXQgPSBidHJmc19uZXh0X29sZF9pdGVtKHJvb3QsIHBhdGgsIHRpbWVfc2VxKTsKQEAgLTI4MCw2ICsyOTMsOCBAQAogCiAJaWYgKHJldCA+IDApCiAJCXJldCA9IDA7CisJZWxzZSBpZiAocmV0IDwgMCkKKwkJZnJlZV9pbm9kZV9lbGVtX2xpc3QoZWllKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yOTksMjMgKzMxNCwzNCBAQAogCWludCByZXQgPSAwOwogCWludCByb290X2xldmVsOwogCWludCBsZXZlbCA9IHJlZi0+bGV2ZWw7CisJaW50IGluZGV4OwogCiAJcm9vdF9rZXkub2JqZWN0aWQgPSByZWYtPnJvb3RfaWQ7CiAJcm9vdF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CiAJcm9vdF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCWluZGV4ID0gc3JjdV9yZWFkX2xvY2soJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKKwogCXJvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAmcm9vdF9rZXkpOwogCWlmIChJU19FUlIocm9vdCkpIHsKKwkJc3JjdV9yZWFkX3VubG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UsIGluZGV4KTsKIAkJcmV0ID0gUFRSX0VSUihyb290KTsKIAkJZ290byBvdXQ7CiAJfQogCiAJcm9vdF9sZXZlbCA9IGJ0cmZzX29sZF9yb290X2xldmVsKHJvb3QsIHRpbWVfc2VxKTsKIAotCWlmIChyb290X2xldmVsICsgMSA9PSBsZXZlbCkKKwlpZiAocm9vdF9sZXZlbCArIDEgPT0gbGV2ZWwpIHsKKwkJc3JjdV9yZWFkX3VubG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UsIGluZGV4KTsKIAkJZ290byBvdXQ7CisJfQogCiAJcGF0aC0+bG93ZXN0X2xldmVsID0gbGV2ZWw7CiAJcmV0ID0gYnRyZnNfc2VhcmNoX29sZF9zbG90KHJvb3QsICZyZWYtPmtleV9mb3Jfc2VhcmNoLCBwYXRoLCB0aW1lX3NlcSk7CisKKwkvKiByb290IG5vZGUgaGFzIGJlZW4gbG9ja2VkLCB3ZSBjYW4gcmVsZWFzZSBAc3Vidm9sX3NyY3Ugc2FmZWx5IGhlcmUgKi8KKwlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOworCiAJcHJfZGVidWcoInNlYXJjaCBzbG90IGluIHJvb3QgJWxsdSAobGV2ZWwgJWQsIHJlZiBjb3VudCAlZCkgcmV0dXJuZWQgIgogCQkgIiVkIGZvciBrZXkgKCVsbHUgJXUgJWxsdSlcbiIsCiAJCSByZWYtPnJvb3RfaWQsIGxldmVsLCByZWYtPmNvdW50LCByZXQsCkBAIC0zMzQsOSArMzYwLDggQEAKIAkJZWIgPSBwYXRoLT5ub2Rlc1tsZXZlbF07CiAJfQogCi0JcmV0ID0gYWRkX2FsbF9wYXJlbnRzKHJvb3QsIHBhdGgsIHBhcmVudHMsIGxldmVsLCAmcmVmLT5rZXlfZm9yX3NlYXJjaCwKLQkJCQl0aW1lX3NlcSwgcmVmLT53YW50ZWRfZGlza19ieXRlLAotCQkJCWV4dGVudF9pdGVtX3Bvcyk7CisJcmV0ID0gYWRkX2FsbF9wYXJlbnRzKHJvb3QsIHBhdGgsIHBhcmVudHMsIHJlZiwgbGV2ZWwsIHRpbWVfc2VxLAorCQkJICAgICAgZXh0ZW50X2l0ZW1fcG9zKTsKIG91dDoKIAlwYXRoLT5sb3dlc3RfbGV2ZWwgPSAwOwogCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKQEAgLTM3NiwxMCArNDAxLDE2IEBACiAJCQljb250aW51ZTsKIAkJZXJyID0gX19yZXNvbHZlX2luZGlyZWN0X3JlZihmc19pbmZvLCBwYXRoLCB0aW1lX3NlcSwgcmVmLAogCQkJCQkgICAgIHBhcmVudHMsIGV4dGVudF9pdGVtX3Bvcyk7Ci0JCWlmIChlcnIgPT0gLUVOT01FTSkKLQkJCWdvdG8gb3V0OwotCQlpZiAoZXJyKQorCQkvKgorCQkgKiB3ZSBjYW4gb25seSB0b2xlcmF0ZSBFTk9FTlQsb3RoZXJ3aXNlLHdlIHNob3VsZCBjYXRjaCBlcnJvcgorCQkgKiBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCQkgKi8KKwkJaWYgKGVyciA9PSAtRU5PRU5UKSB7CiAJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChlcnIpIHsKKwkJCXJldCA9IGVycjsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJLyogd2UgcHV0IHRoZSBmaXJzdCBwYXJlbnQgaW50byB0aGUgcmVmIGF0IGhhbmQgKi8KIAkJVUxJU1RfSVRFUl9JTklUKCZ1aXRlcik7CkBAIC01MzgsMTQgKzU2OSwxMyBAQAogCWlmIChleHRlbnRfb3AgJiYgZXh0ZW50X29wLT51cGRhdGVfa2V5KQogCQlidHJmc19kaXNrX2tleV90b19jcHUoJm9wX2tleSwgJmV4dGVudF9vcC0+a2V5KTsKIAotCXdoaWxlICgobiA9IHJiX3ByZXYobikpKSB7CisJc3Bpbl9sb2NrKCZoZWFkLT5sb2NrKTsKKwluID0gcmJfZmlyc3QoJmhlYWQtPnJlZl9yb290KTsKKwl3aGlsZSAobikgewogCQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqbm9kZTsKIAkJbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlLAogCQkJCXJiX25vZGUpOwotCQlpZiAobm9kZS0+Ynl0ZW5yICE9IGhlYWQtPm5vZGUuYnl0ZW5yKQotCQkJYnJlYWs7Ci0JCVdBUk5fT04obm9kZS0+aXNfaGVhZCk7Ci0KKwkJbiA9IHJiX25leHQobik7CiAJCWlmIChub2RlLT5zZXEgPiBzZXEpCiAJCQljb250aW51ZTsKIApAQCAtNjEyLDEwICs2NDIsMTAgQEAKIAkJCVdBUk5fT04oMSk7CiAJCX0KIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gMDsKKwlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTgyOCw2ICs4NTgsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcHJlZnNfZGVsYXllZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByZWZzOwogCXN0cnVjdCBfX3ByZWxpbV9yZWYgKnJlZjsKKwlzdHJ1Y3QgZXh0ZW50X2lub2RlX2VsZW0gKmVpZSA9IE5VTEw7CiAKIAlJTklUX0xJU1RfSEVBRCgmcHJlZnMpOwogCUlOSVRfTElTVF9IRUFEKCZwcmVmc19kZWxheWVkKTsKQEAgLTg4MiwxNSArOTEzLDE1IEBACiAJCQkJYnRyZnNfcHV0X2RlbGF5ZWRfcmVmKCZoZWFkLT5ub2RlKTsKIAkJCQlnb3RvIGFnYWluOwogCQkJfQorCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAJCQlyZXQgPSBfX2FkZF9kZWxheWVkX3JlZnMoaGVhZCwgdGltZV9zZXEsCiAJCQkJCQkgJnByZWZzX2RlbGF5ZWQpOwogCQkJbXV0ZXhfdW5sb2NrKCZoZWFkLT5tdXRleCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwotCQkJfQorCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAJfQogCiAJaWYgKHBhdGgtPnNsb3RzWzBdKSB7CkBAIC05NDEsNyArOTcyLDYgQEAKIAkJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAocmVmLT5jb3VudCAmJiByZWYtPnBhcmVudCkgewotCQkJc3RydWN0IGV4dGVudF9pbm9kZV9lbGVtICplaWUgPSBOVUxMOwogCQkJaWYgKGV4dGVudF9pdGVtX3BvcyAmJiAhcmVmLT5pbm9kZV9saXN0KSB7CiAJCQkJdTMyIGJzejsKIAkJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CkBAIC05NzYsNiArMTAwNiw3IEBACiAJCQkJCWVpZSA9IGVpZS0+bmV4dDsKIAkJCQllaWUtPm5leHQgPSByZWYtPmlub2RlX2xpc3Q7CiAJCQl9CisJCQllaWUgPSBOVUxMOwogCQl9CiAJCWxpc3RfZGVsKCZyZWYtPmxpc3QpOwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfcHJlbGltX3JlZl9jYWNoZSwgcmVmKTsKQEAgLTk5NCw3ICsxMDI1LDggQEAKIAkJbGlzdF9kZWwoJnJlZi0+bGlzdCk7CiAJCWttZW1fY2FjaGVfZnJlZShidHJmc19wcmVsaW1fcmVmX2NhY2hlLCByZWYpOwogCX0KLQorCWlmIChyZXQgPCAwKQorCQlmcmVlX2lub2RlX2VsZW1fbGlzdChlaWUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMDIsNyArMTAzNCw2IEBACiB7CiAJc3RydWN0IHVsaXN0X25vZGUgKm5vZGUgPSBOVUxMOwogCXN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqZWllOwotCXN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqZWllX25leHQ7CiAJc3RydWN0IHVsaXN0X2l0ZXJhdG9yIHVpdGVyOwogCiAJVUxJU1RfSVRFUl9JTklUKCZ1aXRlcik7CkBAIC0xMDEwLDEwICsxMDQxLDcgQEAKIAkJaWYgKCFub2RlLT5hdXgpCiAJCQljb250aW51ZTsKIAkJZWllID0gKHN0cnVjdCBleHRlbnRfaW5vZGVfZWxlbSAqKSh1aW50cHRyX3Qpbm9kZS0+YXV4OwotCQlmb3IgKDsgZWllOyBlaWUgPSBlaWVfbmV4dCkgewotCQkJZWllX25leHQgPSBlaWUtPm5leHQ7Ci0JCQlrZnJlZShlaWUpOwotCQl9CisJCWZyZWVfaW5vZGVfZWxlbV9saXN0KGVpZSk7CiAJCW5vZGUtPmF1eCA9IDA7CiAJfQogCkBAIC0xMTAxLDQ0ICsxMTI5LDEzIEBACiAJCWlmICghbm9kZSkKIAkJCWJyZWFrOwogCQlieXRlbnIgPSBub2RlLT52YWw7CisJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAogCXVsaXN0X2ZyZWUodG1wKTsKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5vZGVfaW5mbyh1NjQgaW51bSwgdTY0IGlvZmYsIHU4IGtleV90eXBlLAotCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAotCQkJc3RydWN0IGJ0cmZzX2tleSAqZm91bmRfa2V5KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwotCi0Ja2V5LnR5cGUgPSBrZXlfdHlwZTsKLQlrZXkub2JqZWN0aWQgPSBpbnVtOwotCWtleS5vZmZzZXQgPSBpb2ZmOwotCi0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgZnNfcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQllYiA9IHBhdGgtPm5vZGVzWzBdOwotCWlmIChyZXQgJiYgcGF0aC0+c2xvdHNbMF0gPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpKSB7Ci0JCXJldCA9IGJ0cmZzX25leHRfbGVhZihmc19yb290LCBwYXRoKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCWViID0gcGF0aC0+bm9kZXNbMF07Ci0JfQotCi0JYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGViLCBmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKLQlpZiAoZm91bmRfa2V5LT50eXBlICE9IGtleS50eXBlIHx8IGZvdW5kX2tleS0+b2JqZWN0aWQgIT0ga2V5Lm9iamVjdGlkKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCiAvKgogICogdGhpcyBtYWtlcyB0aGUgcGF0aCBwb2ludCB0byAoaW51bSBJTk9ERV9JVEVNIGlvZmYpCiAgKi8KQEAgLTExNDYsMTYgKzExNDMsMTYgQEAKIAkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoKQogewogCXN0cnVjdCBidHJmc19rZXkga2V5OwotCXJldHVybiBfX2lub2RlX2luZm8oaW51bSwgaW9mZiwgQlRSRlNfSU5PREVfSVRFTV9LRVksIGZzX3Jvb3QsIHBhdGgsCi0JCQkJJmtleSk7CisJcmV0dXJuIGJ0cmZzX2ZpbmRfaXRlbShmc19yb290LCBwYXRoLCBpbnVtLCBpb2ZmLAorCQkJQlRSRlNfSU5PREVfSVRFTV9LRVksICZrZXkpOwogfQogCiBzdGF0aWMgaW50IGlub2RlX3JlZl9pbmZvKHU2NCBpbnVtLCB1NjQgaW9mZiwgc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsCiAJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCiAJCQkJc3RydWN0IGJ0cmZzX2tleSAqZm91bmRfa2V5KQogewotCXJldHVybiBfX2lub2RlX2luZm8oaW51bSwgaW9mZiwgQlRSRlNfSU5PREVfUkVGX0tFWSwgZnNfcm9vdCwgcGF0aCwKLQkJCQlmb3VuZF9rZXkpOworCXJldHVybiBidHJmc19maW5kX2l0ZW0oZnNfcm9vdCwgcGF0aCwgaW51bSwgaW9mZiwKKwkJCUJUUkZTX0lOT0RFX1JFRl9LRVksIGZvdW5kX2tleSk7CiB9CiAKIGludCBidHJmc19maW5kX29uZV9leHRyZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBpbm9kZV9vYmplY3RpZCwKQEAgLTEzMzUsMjAgKzEzMzIsNDUgQEAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCBmc19pbmZvLT5leHRlbnRfcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShmc19pbmZvLT5leHRlbnRfcm9vdCwgcGF0aCwKLQkJCQkJMCwgQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKIAotCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJd2hpbGUgKDEpIHsKKwkJdTMyIG5yaXRlbXM7CisJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKSB7CisJCQlidHJmc19zZXRfcGF0aF9ibG9ja2luZyhwYXRoKTsKKwkJCXJldCA9IGJ0cmZzX3ByZXZfbGVhZihmc19pbmZvLT5leHRlbnRfcm9vdCwgcGF0aCk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlpZiAocmV0ID4gMCkgeworCQkJCQlwcl9kZWJ1ZygibG9naWNhbCAlbGx1IGlzIG5vdCB3aXRoaW4gIgorCQkJCQkJICJhbnkgZXh0ZW50XG4iLCBsb2dpY2FsKTsKKwkJCQkJcmV0ID0gLUVOT0VOVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBhdGgtPnNsb3RzWzBdLS07CisJCX0KKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKTsKKwkJaWYgKG5yaXRlbXMgPT0gMCkgeworCQkJcHJfZGVidWcoImxvZ2ljYWwgJWxsdSBpcyBub3Qgd2l0aGluIGFueSBleHRlbnRcbiIsCisJCQkJIGxvZ2ljYWwpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJaWYgKHBhdGgtPnNsb3RzWzBdID09IG5yaXRlbXMpCisJCQlwYXRoLT5zbG90c1swXS0tOworCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgZm91bmRfa2V5LAorCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS0+dHlwZSA9PSBCVFJGU19FWFRFTlRfSVRFTV9LRVkgfHwKKwkJICAgIGZvdW5kX2tleS0+dHlwZSA9PSBCVFJGU19NRVRBREFUQV9JVEVNX0tFWSkKKwkJCWJyZWFrOworCX0KKwogCWlmIChmb3VuZF9rZXktPnR5cGUgPT0gQlRSRlNfTUVUQURBVEFfSVRFTV9LRVkpCiAJCXNpemUgPSBmc19pbmZvLT5leHRlbnRfcm9vdC0+bGVhZnNpemU7CiAJZWxzZSBpZiAoZm91bmRfa2V5LT50eXBlID09IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSkKIAkJc2l6ZSA9IGZvdW5kX2tleS0+b2Zmc2V0OwogCi0JaWYgKChmb3VuZF9rZXktPnR5cGUgIT0gQlRSRlNfRVhURU5UX0lURU1fS0VZICYmCi0JICAgICBmb3VuZF9rZXktPnR5cGUgIT0gQlRSRlNfTUVUQURBVEFfSVRFTV9LRVkpIHx8Ci0JICAgIGZvdW5kX2tleS0+b2JqZWN0aWQgPiBsb2dpY2FsIHx8CisJaWYgKGZvdW5kX2tleS0+b2JqZWN0aWQgPiBsb2dpY2FsIHx8CiAJICAgIGZvdW5kX2tleS0+b2JqZWN0aWQgKyBzaXplIDw9IGxvZ2ljYWwpIHsKIAkJcHJfZGVidWcoImxvZ2ljYWwgJWxsdSBpcyBub3Qgd2l0aGluIGFueSBleHRlbnRcbiIsIGxvZ2ljYWwpOwogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTE2MDEsNyArMTYyMyw2IEBACiAJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CiAKIAl3aGlsZSAoIXJldCkgewotCQlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAJCXJldCA9IGlub2RlX3JlZl9pbmZvKGludW0sIHBhcmVudCA/IHBhcmVudCsxIDogMCwgZnNfcm9vdCwgcGF0aCwKIAkJCQkgICAgICZmb3VuZF9rZXkpOwogCQlpZiAocmV0IDwgMCkKQEAgLTE2MTQsOSArMTYzNSwxMiBAQAogCiAJCXBhcmVudCA9IGZvdW5kX2tleS5vZmZzZXQ7CiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKLQkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKLQkJLyogbWFrZSBzdXJlIHdlIGNhbiB1c2UgZWIgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBwYXRoICovCi0JCWF0b21pY19pbmMoJmViLT5yZWZzKTsKKwkJZWIgPSBidHJmc19jbG9uZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdKTsKKwkJaWYgKCFlYikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCWV4dGVudF9idWZmZXJfZ2V0KGViKTsKIAkJYnRyZnNfdHJlZV9yZWFkX2xvY2soZWIpOwogCQlidHJmc19zZXRfbG9ja19ibG9ja2luZ19ydyhlYiwgQlRSRlNfUkVBRF9MT0NLKTsKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwpAQCAtMTY3NCwxNyArMTY5OCwyMCBAQAogCQkrK2ZvdW5kOwogCiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKLQkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKLQkJLyogbWFrZSBzdXJlIHdlIGNhbiB1c2UgZWIgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBwYXRoICovCi0JCWF0b21pY19pbmMoJmViLT5yZWZzKTsKKwkJZWIgPSBidHJmc19jbG9uZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdKTsKKwkJaWYgKCFlYikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCWV4dGVudF9idWZmZXJfZ2V0KGViKTsKIAogCQlidHJmc190cmVlX3JlYWRfbG9jayhlYik7CiAJCWJ0cmZzX3NldF9sb2NrX2Jsb2NraW5nX3J3KGViLCBCVFJGU19SRUFEX0xPQ0spOwogCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAKIAkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCQlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgcGF0aC0+c2xvdHNbMF0pOwotCQlwdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgc2xvdCk7CisJCXB0ciA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBzbG90KTsKIAkJY3VyX29mZnNldCA9IDA7CiAKIAkJd2hpbGUgKGN1cl9vZmZzZXQgPCBpdGVtX3NpemUpIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmggYi9mcy9idHJmcy9idHJmc19pbm9kZS5oCmluZGV4IGFjMGIzOWQuLjhmZWQyMTIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKKysrIGIvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaApAQCAtNDMsNiArNDMsNyBAQAogI2RlZmluZSBCVFJGU19JTk9ERV9DT1BZX0VWRVJZVEhJTkcJCTgKICNkZWZpbmUgQlRSRlNfSU5PREVfSU5fREVMQUxMT0NfTElTVAkJOQogI2RlZmluZSBCVFJGU19JTk9ERV9SRUFERElPX05FRURfTE9DSwkJMTAKKyNkZWZpbmUgQlRSRlNfSU5PREVfSEFTX1BST1BTCQkgICAgICAgIDExCiAKIC8qIGluIG1lbW9yeSBidHJmcyBpbm9kZSAqLwogc3RydWN0IGJ0cmZzX2lub2RlIHsKQEAgLTEzNSw2ICsxMzYsOSBAQAogCSAqLwogCXU2NCBpbmRleF9jbnQ7CiAKKwkvKiBDYWNoZSB0aGUgZGlyZWN0b3J5IGluZGV4IG51bWJlciB0byBzcGVlZCB0aGUgZGlyL2ZpbGUgcmVtb3ZlICovCisJdTY0IGRpcl9pbmRleDsKKwogCS8qIHRoZSBmc3luYyBsb2cgaGFzIHNvbWUgY29ybmVyIGNhc2VzIHRoYXQgbWVhbiB3ZSBoYXZlIHRvIGNoZWNrCiAJICogZGlyZWN0b3JpZXMgdG8gc2VlIGlmIGFueSB1bmxpbmtzIGhhdmUgYmVlbiBkb25lIGJlZm9yZQogCSAqIHRoZSBkaXJlY3Rvcnkgd2FzIGxvZ2dlZC4gIFNlZSB0cmVlLWxvZy5jIGZvciBhbGwgdGhlCmRpZmYgLS1naXQgYS9mcy9idHJmcy9jaGVjay1pbnRlZ3JpdHkuYyBiL2ZzL2J0cmZzL2NoZWNrLWludGVncml0eS5jCmluZGV4IDEzMWQ4MjguLjBlODM4OGUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2NoZWNrLWludGVncml0eS5jCisrKyBiL2ZzL2J0cmZzL2NoZWNrLWludGVncml0eS5jCkBAIC05MiwxMSArOTIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCiAjaW5jbHVkZSAiZXh0ZW50X2lvLmgiCiAjaW5jbHVkZSAidm9sdW1lcy5oIgpAQCAtMTQ1NiwxMCArMTQ1NiwxNCBAQAogCWJ0cmZzaWNfcmVhZF9mcm9tX2Jsb2NrX2RhdGEoYmxvY2tfY3R4LCAmZmlsZV9leHRlbnRfaXRlbSwKIAkJCQkgICAgIGZpbGVfZXh0ZW50X2l0ZW1fb2Zmc2V0LAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKSk7Ci0JbmV4dF9ieXRlbnIgPSBidHJmc19zdGFja19maWxlX2V4dGVudF9kaXNrX2J5dGVucigmZmlsZV9leHRlbnRfaXRlbSkgKwotCQkgICAgICBidHJmc19zdGFja19maWxlX2V4dGVudF9vZmZzZXQoJmZpbGVfZXh0ZW50X2l0ZW0pOwotCWdlbmVyYXRpb24gPSBidHJmc19zdGFja19maWxlX2V4dGVudF9nZW5lcmF0aW9uKCZmaWxlX2V4dGVudF9pdGVtKTsKLQludW1fYnl0ZXMgPSBidHJmc19zdGFja19maWxlX2V4dGVudF9udW1fYnl0ZXMoJmZpbGVfZXh0ZW50X2l0ZW0pOworCW5leHRfYnl0ZW5yID0gYnRyZnNfc3RhY2tfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoJmZpbGVfZXh0ZW50X2l0ZW0pOworCWlmIChidHJmc19zdGFja19maWxlX2V4dGVudF9jb21wcmVzc2lvbigmZmlsZV9leHRlbnRfaXRlbSkgPT0KKwkgICAgQlRSRlNfQ09NUFJFU1NfTk9ORSkgeworCQluZXh0X2J5dGVuciArPSBidHJmc19zdGFja19maWxlX2V4dGVudF9vZmZzZXQoJmZpbGVfZXh0ZW50X2l0ZW0pOworCQludW1fYnl0ZXMgPSBidHJmc19zdGFja19maWxlX2V4dGVudF9udW1fYnl0ZXMoJmZpbGVfZXh0ZW50X2l0ZW0pOworCX0gZWxzZSB7CisJCW51bV9ieXRlcyA9IGJ0cmZzX3N0YWNrX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKCZmaWxlX2V4dGVudF9pdGVtKTsKKwl9CiAJZ2VuZXJhdGlvbiA9IGJ0cmZzX3N0YWNrX2ZpbGVfZXh0ZW50X2dlbmVyYXRpb24oJmZpbGVfZXh0ZW50X2l0ZW0pOwogCiAJaWYgKHN0YXRlLT5wcmludF9tYXNrICYgQlRSRlNJQ19QUklOVF9NQVNLX1ZFUllfVkVSQk9TRSkKQEAgLTE2OTUsNyArMTY5OSw3IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYmlvLT5iaV9iZGV2ID0gYmxvY2tfY3R4LT5kZXYtPmJkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gZGV2X2J5dGVuciA+PiA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gZGV2X2J5dGVuciA+PiA5OwogCiAJCWZvciAoaiA9IGk7IGogPCBudW1fcGFnZXM7IGorKykgewogCQkJcmV0ID0gYmlvX2FkZF9wYWdlKGJpbywgYmxvY2tfY3R4LT5wYWdldltqXSwKQEAgLTE4MTksNyArMTgyMyw3IEBACiAJCXNpemVfdCBzdWJsZW4gPSBpID8gUEFHRV9DQUNIRV9TSVpFIDoKIAkJCQkgICAgKFBBR0VfQ0FDSEVfU0laRSAtIEJUUkZTX0NTVU1fU0laRSk7CiAKLQkJY3JjID0gY3JjMzJjKGNyYywgZGF0YSwgc3VibGVuKTsKKwkJY3JjID0gYnRyZnNfY3JjMzJjKGNyYywgZGF0YSwgc3VibGVuKTsKIAl9CiAJYnRyZnNfY3N1bV9maW5hbChjcmMsIGNzdW0pOwogCWlmIChtZW1jbXAoY3N1bSwgaC0+Y3N1bSwgc3RhdGUtPmNzdW1fc2l6ZSkpCkBAIC0zMDEzLDcgKzMwMTcsNyBAQAogCQlpbnQgYmlvX2lzX3BhdGNoZWQ7CiAJCWNoYXIgKiptYXBwZWRfZGF0YXY7CiAKLQkJZGV2X2J5dGVuciA9IDUxMiAqIGJpby0+Ymlfc2VjdG9yOworCQlkZXZfYnl0ZW5yID0gNTEyICogYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAkJYmlvX2lzX3BhdGNoZWQgPSAwOwogCQlpZiAoZGV2X3N0YXRlLT5zdGF0ZS0+cHJpbnRfbWFzayAmCiAJCSAgICBCVFJGU0lDX1BSSU5UX01BU0tfU1VCTUlUX0JJT19CSCkKQEAgLTMwMjEsOCArMzAyNSw4IEBACiAJCQkgICAgICAgInN1Ym1pdF9iaW8ocnc9MHgleCwgYmlfdmNudD0ldSwiCiAJCQkgICAgICAgIiBiaV9zZWN0b3I9JWxsdSAoYnl0ZW5yICVsbHUpLCBiaV9iZGV2PSVwKVxuIiwKIAkJCSAgICAgICBydywgYmlvLT5iaV92Y250LAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGRldl9ieXRlbnIsCi0JCQkgICAgICAgYmlvLT5iaV9iZGV2KTsKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkgICAgICAgZGV2X2J5dGVuciwgYmlvLT5iaV9iZGV2KTsKIAogCQltYXBwZWRfZGF0YXYgPSBrbWFsbG9jKHNpemVvZigqbWFwcGVkX2RhdGF2KSAqIGJpby0+YmlfdmNudCwKIAkJCQkgICAgICAgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYyBiL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKaW5kZXggMTQ5OWIyNy4uYjAxZmI2YyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYworKysgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCkBAIC0xMjgsMTEgKzEyOCwxMCBAQAogCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKIAogCQlpZiAoY3N1bSAhPSAqY2Jfc3VtKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmcyBjc3VtIGZhaWxlZCBpbm8gJWxsdSAiCi0JCQkgICAgICAgImV4dGVudCAlbGx1IGNzdW0gJXUgIgotCQkJICAgICAgICJ3YW50ZWQgJXUgbWlycm9yICVkXG4iLAotCQkJICAgICAgIGJ0cmZzX2lubyhpbm9kZSksIGRpc2tfc3RhcnQsIGNzdW0sICpjYl9zdW0sCi0JCQkgICAgICAgY2ItPm1pcnJvcl9udW0pOworCQkJYnRyZnNfaW5mbyhCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mbywKKwkJCSAgICJjc3VtIGZhaWxlZCBpbm8gJWxsdSBleHRlbnQgJWxsdSBjc3VtICV1IHdhbnRlZCAldSBtaXJyb3IgJWQiLAorCQkJICAgYnRyZnNfaW5vKGlub2RlKSwgZGlza19zdGFydCwgY3N1bSwgKmNiX3N1bSwKKwkJCSAgIGNiLT5taXJyb3JfbnVtKTsKIAkJCXJldCA9IC1FSU87CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTE3Miw3ICsxNzEsOCBAQAogCQlnb3RvIG91dDsKIAogCWlub2RlID0gY2ItPmlub2RlOwotCXJldCA9IGNoZWNrX2NvbXByZXNzZWRfY3N1bShpbm9kZSwgY2IsICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOSk7CisJcmV0ID0gY2hlY2tfY29tcHJlc3NlZF9jc3VtKGlub2RlLCBjYiwKKwkJCQkgICAgKHU2NCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDkpOwogCWlmIChyZXQpCiAJCWdvdG8gY3N1bV9mYWlsZWQ7CiAKQEAgLTIwMSwxOCArMjAxLDE2IEBACiAJaWYgKGNiLT5lcnJvcnMpIHsKIAkJYmlvX2lvX2Vycm9yKGNiLT5vcmlnX2Jpbyk7CiAJfSBlbHNlIHsKLQkJaW50IGJpb19pbmRleCA9IDA7Ci0JCXN0cnVjdCBiaW9fdmVjICpidmVjID0gY2ItPm9yaWdfYmlvLT5iaV9pb192ZWM7CisJCWludCBpOworCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAogCQkvKgogCQkgKiB3ZSBoYXZlIHZlcmlmaWVkIHRoZSBjaGVja3N1bSBhbHJlYWR5LCBzZXQgcGFnZQogCQkgKiBjaGVja2VkIHNvIHRoZSBlbmRfaW8gaGFuZGxlcnMga25vdyBhYm91dCBpdAogCQkgKi8KLQkJd2hpbGUgKGJpb19pbmRleCA8IGNiLT5vcmlnX2Jpby0+YmlfdmNudCkgeworCQliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgY2ItPm9yaWdfYmlvLCBpKQogCQkJU2V0UGFnZUNoZWNrZWQoYnZlYy0+YnZfcGFnZSk7Ci0JCQlidmVjKys7Ci0JCQliaW9faW5kZXgrKzsKLQkJfQorCiAJCWJpb19lbmRpbyhjYi0+b3JpZ19iaW8sIDApOwogCX0KIApAQCAtMzcyLDcgKzM3MCw3IEBACiAJZm9yIChwZ19pbmRleCA9IDA7IHBnX2luZGV4IDwgY2ItPm5yX3BhZ2VzOyBwZ19pbmRleCsrKSB7CiAJCXBhZ2UgPSBjb21wcmVzc2VkX3BhZ2VzW3BnX2luZGV4XTsKIAkJcGFnZS0+bWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JCWlmIChiaW8tPmJpX3NpemUpCisJCWlmIChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkKIAkJCXJldCA9IGlvX3RyZWUtPm9wcy0+bWVyZ2VfYmlvX2hvb2soV1JJVEUsIHBhZ2UsIDAsCiAJCQkJCQkJICAgUEFHRV9DQUNIRV9TSVpFLAogCQkJCQkJCSAgIGJpbywgMCk7CkBAIC00MTIsNyArNDEwLDggQEAKIAkJCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfQ0FDSEVfU0laRSwgMCk7CiAJCX0KIAkJaWYgKGJ5dGVzX2xlZnQgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKLQkJCXByaW50aygiYnl0ZXMgbGVmdCAlbHUgY29tcHJlc3MgbGVuICVsdSBuciAlbHVcbiIsCisJCQlidHJmc19pbmZvKEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJCQkiYnl0ZXMgbGVmdCAlbHUgY29tcHJlc3MgbGVuICVsdSBuciAlbHUiLAogCQkJICAgICAgIGJ5dGVzX2xlZnQsIGNiLT5jb21wcmVzc2VkX2xlbiwgY2ItPm5yX3BhZ2VzKTsKIAkJfQogCQlieXRlc19sZWZ0IC09IFBBR0VfQ0FDSEVfU0laRTsKQEAgLTUwNiw3ICs1MDUsNyBAQAogCiAJCWlmICghZW0gfHwgbGFzdF9vZmZzZXQgPCBlbS0+c3RhcnQgfHwKIAkJICAgIChsYXN0X29mZnNldCArIFBBR0VfQ0FDSEVfU0laRSA+IGV4dGVudF9tYXBfZW5kKGVtKSkgfHwKLQkJICAgIChlbS0+YmxvY2tfc3RhcnQgPj4gOSkgIT0gY2ItPm9yaWdfYmlvLT5iaV9zZWN0b3IpIHsKKwkJICAgIChlbS0+YmxvY2tfc3RhcnQgPj4gOSkgIT0gY2ItPm9yaWdfYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikgewogCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCXVubG9ja19leHRlbnQodHJlZSwgbGFzdF9vZmZzZXQsIGVuZCk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTU1Miw3ICs1NTEsNyBAQAogICogaW4gaXQuICBXZSBkb24ndCBhY3R1YWxseSBkbyBJTyBvbiB0aG9zZSBwYWdlcyBidXQgYWxsb2NhdGUgbmV3IG9uZXMKICAqIHRvIGhvbGQgdGhlIGNvbXByZXNzZWQgcGFnZXMgb24gZGlzay4KICAqCi0gKiBiaW8tPmJpX3NlY3RvciBwb2ludHMgdG8gdGhlIGNvbXByZXNzZWQgZXh0ZW50IG9uIGRpc2sKKyAqIGJpby0+YmlfaXRlci5iaV9zZWN0b3IgcG9pbnRzIHRvIHRoZSBjb21wcmVzc2VkIGV4dGVudCBvbiBkaXNrCiAgKiBiaW8tPmJpX2lvX3ZlYyBwb2ludHMgdG8gYWxsIG9mIHRoZSBpbm9kZSBwYWdlcwogICogYmlvLT5iaV92Y250IGlzIGEgY291bnQgb2YgcGFnZXMKICAqCkBAIC01NzMsNyArNTcyLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCXN0cnVjdCBiaW8gKmNvbXBfYmlvOwotCXU2NCBjdXJfZGlza19ieXRlID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCXU2NCBjdXJfZGlza19ieXRlID0gKHU2NCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDk7CiAJdTY0IGVtX2xlbjsKIAl1NjQgZW1fc3RhcnQ7CiAJc3RydWN0IGV4dGVudF9tYXAgKmVtOwpAQCAtNjU5LDcgKzY1OCw3IEBACiAJCXBhZ2UtPm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCQlwYWdlLT5pbmRleCA9IGVtX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKLQkJaWYgKGNvbXBfYmlvLT5iaV9zaXplKQorCQlpZiAoY29tcF9iaW8tPmJpX2l0ZXIuYmlfc2l6ZSkKIAkJCXJldCA9IHRyZWUtPm9wcy0+bWVyZ2VfYmlvX2hvb2soUkVBRCwgcGFnZSwgMCwKIAkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUsCiAJCQkJCQkJY29tcF9iaW8sIDApOwpAQCAtNjg3LDggKzY4Niw4IEBACiAJCQkJCQkJY29tcF9iaW8sIHN1bXMpOwogCQkJCUJVR19PTihyZXQpOyAvKiAtRU5PTUVNICovCiAJCQl9Ci0JCQlzdW1zICs9IChjb21wX2Jpby0+Ymlfc2l6ZSArIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAvCi0JCQkJcm9vdC0+c2VjdG9yc2l6ZTsKKwkJCXN1bXMgKz0gKGNvbXBfYmlvLT5iaV9pdGVyLmJpX3NpemUgKworCQkJCSByb290LT5zZWN0b3JzaXplIC0gMSkgLyByb290LT5zZWN0b3JzaXplOwogCiAJCQlyZXQgPSBidHJmc19tYXBfYmlvKHJvb3QsIFJFQUQsIGNvbXBfYmlvLAogCQkJCQkgICAgbWlycm9yX251bSwgMCk7CkBAIC0xMDExLDYgKzEwMTAsOCBAQAogCQlieXRlcyA9IG1pbihieXRlcywgd29ya2luZ19ieXRlcyk7CiAJCWthZGRyID0ga21hcF9hdG9taWMocGFnZV9vdXQpOwogCQltZW1jcHkoa2FkZHIgKyAqcGdfb2Zmc2V0LCBidWYgKyBidWZfb2Zmc2V0LCBieXRlcyk7CisJCWlmICgqcGdfaW5kZXggPT0gKHZjbnQgLSAxKSAmJiAqcGdfb2Zmc2V0ID09IDApCisJCQltZW1zZXQoa2FkZHIgKyBieXRlcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gYnl0ZXMpOwogCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZV9vdXQpOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9jdHJlZS5jIGIvZnMvYnRyZnMvY3RyZWUuYwppbmRleCAzMTYxMzZiLi5jYmQzYTdkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5jCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmMKQEAgLTM5LDkgKzM5LDggQEAKIAkJCSAgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpzcmNfYnVmKTsKIHN0YXRpYyB2b2lkIGRlbF9wdHIoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkgICAgaW50IGxldmVsLCBpbnQgc2xvdCk7Ci1zdGF0aWMgdm9pZCB0cmVlX21vZF9sb2dfZnJlZV9lYihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKK3N0YXRpYyBpbnQgdHJlZV9tb2RfbG9nX2ZyZWVfZWIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCiAJCQkJIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYik7Ci1zdGF0aWMgaW50IGJ0cmZzX3ByZXZfbGVhZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOwogCiBzdHJ1Y3QgYnRyZnNfcGF0aCAqYnRyZnNfYWxsb2NfcGF0aCh2b2lkKQogewpAQCAtNDc1LDYgKzQ3NCw4IEBACiAgKiB0aGUgaW5kZXggaXMgdGhlIHNoaWZ0ZWQgbG9naWNhbCBvZiB0aGUgKm5ldyogcm9vdCBub2RlIGZvciByb290IHJlcGxhY2UKICAqIG9wZXJhdGlvbnMsIG9yIHRoZSBzaGlmdGVkIGxvZ2ljYWwgb2YgdGhlIGFmZmVjdGVkIGJsb2NrIGZvciBhbGwgb3RoZXIKICAqIG9wZXJhdGlvbnMuCisgKgorICogTm90ZTogbXVzdCBiZSBjYWxsZWQgd2l0aCB3cml0ZSBsb2NrICh0cmVlX21vZF9sb2dfd3JpdGVfbG9jaykuCiAgKi8KIHN0YXRpYyBub2lubGluZSBpbnQKIF9fdHJlZV9tb2RfbG9nX2luc2VydChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgc3RydWN0IHRyZWVfbW9kX2VsZW0gKnRtKQpAQCAtNDgzLDI0ICs0ODQsOSBAQAogCXN0cnVjdCByYl9ub2RlICoqbmV3OwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwogCXN0cnVjdCB0cmVlX21vZF9lbGVtICpjdXI7Ci0JaW50IHJldCA9IDA7CiAKIAlCVUdfT04oIXRtKTsKIAotCXRyZWVfbW9kX2xvZ193cml0ZV9sb2NrKGZzX2luZm8pOwotCWlmIChsaXN0X2VtcHR5KCZmc19pbmZvLT50cmVlX21vZF9zZXFfbGlzdCkpIHsKLQkJdHJlZV9tb2RfbG9nX3dyaXRlX3VubG9jayhmc19pbmZvKTsKLQkJLyoKLQkJICogT2sgd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgbG9nZ2luZyBtb2RpZmljYXRpb25zLCBmcmVlIHVwIHRtCi0JCSAqIGFuZCByZXR1cm4gMC4gIEFueSBjYWxsZXJzIHNob3VsZG4ndCBiZSB1c2luZyB0bSBhZnRlcgotCQkgKiBjYWxsaW5nIHRyZWVfbW9kX2xvZ19pbnNlcnQsIGJ1dCBpZiB0aGV5IGRvIHdlIGNhbiBqdXN0Ci0JCSAqIGNoYW5nZSB0aGlzIHRvIHJldHVybiBhIHNwZWNpYWwgZXJyb3IgY29kZSB0byBsZXQgdGhlIGNhbGxlcnMKLQkJICogZG8gdGhlaXIgb3duIHRoaW5nLgotCQkgKi8KLQkJa2ZyZWUodG0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlzcGluX2xvY2soJmZzX2luZm8tPnRyZWVfbW9kX3NlcV9sb2NrKTsKIAl0bS0+c2VxID0gYnRyZnNfaW5jX3RyZWVfbW9kX3NlcV9taW5vcihmc19pbmZvKTsKIAlzcGluX3VubG9jaygmZnNfaW5mby0+dHJlZV9tb2Rfc2VxX2xvY2spOwpAQCAtNTE4LDE4ICs1MDQsMTMgQEAKIAkJCW5ldyA9ICYoKCpuZXcpLT5yYl9sZWZ0KTsKIAkJZWxzZSBpZiAoY3VyLT5zZXEgPiB0bS0+c2VxKQogCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKLQkJZWxzZSB7Ci0JCQlyZXQgPSAtRUVYSVNUOwotCQkJa2ZyZWUodG0pOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCiAJcmJfbGlua19ub2RlKCZ0bS0+bm9kZSwgcGFyZW50LCBuZXcpOwogCXJiX2luc2VydF9jb2xvcigmdG0tPm5vZGUsIHRtX3Jvb3QpOwotb3V0OgotCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTU0NSwxOSArNTI2LDM4IEBACiAJCXJldHVybiAxOwogCWlmIChlYiAmJiBidHJmc19oZWFkZXJfbGV2ZWwoZWIpID09IDApCiAJCXJldHVybiAxOworCisJdHJlZV9tb2RfbG9nX3dyaXRlX2xvY2soZnNfaW5mbyk7CisJaWYgKGxpc3RfZW1wdHkoJihmc19pbmZvKS0+dHJlZV9tb2Rfc2VxX2xpc3QpKSB7CisJCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJCXJldHVybiAxOworCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotX190cmVlX21vZF9sb2dfaW5zZXJ0X2tleShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgc2xvdCwKLQkJCSAgZW51bSBtb2RfbG9nX29wIG9wLCBnZnBfdCBmbGFncykKKy8qIFNpbWlsYXIgdG8gdHJlZV9tb2RfZG9udF9sb2csIGJ1dCBkb2Vzbid0IGFjcXVpcmUgYW55IGxvY2tzLiAqLworc3RhdGljIGlubGluZSBpbnQgdHJlZV9tb2RfbmVlZF9sb2coY29uc3Qgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlzbXBfbWIoKTsKKwlpZiAobGlzdF9lbXB0eSgmKGZzX2luZm8pLT50cmVlX21vZF9zZXFfbGlzdCkpCisJCXJldHVybiAwOworCWlmIChlYiAmJiBidHJmc19oZWFkZXJfbGV2ZWwoZWIpID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9tb2RfZWxlbSAqCithbGxvY190cmVlX21vZF9lbGVtKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgaW50IHNsb3QsCisJCSAgICBlbnVtIG1vZF9sb2dfb3Agb3AsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCB0cmVlX21vZF9lbGVtICp0bTsKIAogCXRtID0ga3phbGxvYyhzaXplb2YoKnRtKSwgZmxhZ3MpOwogCWlmICghdG0pCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKIAogCXRtLT5pbmRleCA9IGViLT5zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWlmIChvcCAhPSBNT0RfTE9HX0tFWV9BREQpIHsKQEAgLTU2Nyw4ICs1NjcsOSBAQAogCXRtLT5vcCA9IG9wOwogCXRtLT5zbG90ID0gc2xvdDsKIAl0bS0+Z2VuZXJhdGlvbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oZWIsIHNsb3QpOworCVJCX0NMRUFSX05PREUoJnRtLT5ub2RlKTsKIAotCXJldHVybiBfX3RyZWVfbW9kX2xvZ19pbnNlcnQoZnNfaW5mbywgdG0pOworCXJldHVybiB0bTsKIH0KIAogc3RhdGljIG5vaW5saW5lIGludApAQCAtNTc2LDEwICs1NzcsMjcgQEAKIAkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgaW50IHNsb3QsCiAJCQllbnVtIG1vZF9sb2dfb3Agb3AsIGdmcF90IGZsYWdzKQogewotCWlmICh0cmVlX21vZF9kb250X2xvZyhmc19pbmZvLCBlYikpCisJc3RydWN0IHRyZWVfbW9kX2VsZW0gKnRtOworCWludCByZXQ7CisKKwlpZiAoIXRyZWVfbW9kX25lZWRfbG9nKGZzX2luZm8sIGViKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gX190cmVlX21vZF9sb2dfaW5zZXJ0X2tleShmc19pbmZvLCBlYiwgc2xvdCwgb3AsIGZsYWdzKTsKKwl0bSA9IGFsbG9jX3RyZWVfbW9kX2VsZW0oZWIsIHNsb3QsIG9wLCBmbGFncyk7CisJaWYgKCF0bSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodHJlZV9tb2RfZG9udF9sb2coZnNfaW5mbywgZWIpKSB7CisJCWtmcmVlKHRtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gX190cmVlX21vZF9sb2dfaW5zZXJ0KGZzX2luZm8sIHRtKTsKKwl0cmVlX21vZF9sb2dfd3JpdGVfdW5sb2NrKGZzX2luZm8pOworCWlmIChyZXQpCisJCWtmcmVlKHRtKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBub2lubGluZSBpbnQKQEAgLTU4NywyNyArNjA1LDI0IEBACiAJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgZHN0X3Nsb3QsIGludCBzcmNfc2xvdCwKIAkJCSBpbnQgbnJfaXRlbXMsIGdmcF90IGZsYWdzKQogewotCXN0cnVjdCB0cmVlX21vZF9lbGVtICp0bTsKLQlpbnQgcmV0OworCXN0cnVjdCB0cmVlX21vZF9lbGVtICp0bSA9IE5VTEw7CisJc3RydWN0IHRyZWVfbW9kX2VsZW0gKip0bV9saXN0ID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKKwlpbnQgbG9ja2VkID0gMDsKIAotCWlmICh0cmVlX21vZF9kb250X2xvZyhmc19pbmZvLCBlYikpCisJaWYgKCF0cmVlX21vZF9uZWVkX2xvZyhmc19pbmZvLCBlYikpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBXaGVuIHdlIG92ZXJyaWRlIHNvbWV0aGluZyBkdXJpbmcgdGhlIG1vdmUsIHdlIGxvZyB0aGVzZSByZW1vdmFscy4KLQkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHdlIG1vdmUgdG93YXJkcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQotCSAqIGJ1ZmZlciwgaS5lLiBkc3Rfc2xvdCA8IHNyY19zbG90LgotCSAqLwotCWZvciAoaSA9IDA7IGkgKyBkc3Rfc2xvdCA8IHNyY19zbG90ICYmIGkgPCBucl9pdGVtczsgaSsrKSB7Ci0JCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydF9rZXkoZnNfaW5mbywgZWIsIGkgKyBkc3Rfc2xvdCwKLQkJCQlNT0RfTE9HX0tFWV9SRU1PVkVfV0hJTEVfTU9WSU5HLCBHRlBfTk9GUyk7Ci0JCUJVR19PTihyZXQgPCAwKTsKLQl9CisJdG1fbGlzdCA9IGt6YWxsb2MobnJfaXRlbXMgKiBzaXplb2Yoc3RydWN0IHRyZWVfbW9kX2VsZW0gKiksIGZsYWdzKTsKKwlpZiAoIXRtX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOwogCiAJdG0gPSBremFsbG9jKHNpemVvZigqdG0pLCBmbGFncyk7Ci0JaWYgKCF0bSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCF0bSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfdG1zOworCX0KIAogCXRtLT5pbmRleCA9IGViLT5zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXRtLT5zbG90ID0gc3JjX3Nsb3Q7CkBAIC02MTUsMjUgKzYzMCw3MCBAQAogCXRtLT5tb3ZlLm5yX2l0ZW1zID0gbnJfaXRlbXM7CiAJdG0tPm9wID0gTU9EX0xPR19NT1ZFX0tFWVM7CiAKLQlyZXR1cm4gX190cmVlX21vZF9sb2dfaW5zZXJ0KGZzX2luZm8sIHRtKTsKKwlmb3IgKGkgPSAwOyBpICsgZHN0X3Nsb3QgPCBzcmNfc2xvdCAmJiBpIDwgbnJfaXRlbXM7IGkrKykgeworCQl0bV9saXN0W2ldID0gYWxsb2NfdHJlZV9tb2RfZWxlbShlYiwgaSArIGRzdF9zbG90LAorCQkgICAgTU9EX0xPR19LRVlfUkVNT1ZFX1dISUxFX01PVklORywgZmxhZ3MpOworCQlpZiAoIXRtX2xpc3RbaV0pIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfdG1zOworCQl9CisJfQorCisJaWYgKHRyZWVfbW9kX2RvbnRfbG9nKGZzX2luZm8sIGViKSkKKwkJZ290byBmcmVlX3RtczsKKwlsb2NrZWQgPSAxOworCisJLyoKKwkgKiBXaGVuIHdlIG92ZXJyaWRlIHNvbWV0aGluZyBkdXJpbmcgdGhlIG1vdmUsIHdlIGxvZyB0aGVzZSByZW1vdmFscy4KKwkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHdlIG1vdmUgdG93YXJkcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAqIGJ1ZmZlciwgaS5lLiBkc3Rfc2xvdCA8IHNyY19zbG90LgorCSAqLworCWZvciAoaSA9IDA7IGkgKyBkc3Rfc2xvdCA8IHNyY19zbG90ICYmIGkgPCBucl9pdGVtczsgaSsrKSB7CisJCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydChmc19pbmZvLCB0bV9saXN0W2ldKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZnJlZV90bXM7CisJfQorCisJcmV0ID0gX190cmVlX21vZF9sb2dfaW5zZXJ0KGZzX2luZm8sIHRtKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfdG1zOworCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJa2ZyZWUodG1fbGlzdCk7CisKKwlyZXR1cm4gMDsKK2ZyZWVfdG1zOgorCWZvciAoaSA9IDA7IGkgPCBucl9pdGVtczsgaSsrKSB7CisJCWlmICh0bV9saXN0W2ldICYmICFSQl9FTVBUWV9OT0RFKCZ0bV9saXN0W2ldLT5ub2RlKSkKKwkJCXJiX2VyYXNlKCZ0bV9saXN0W2ldLT5ub2RlLCAmZnNfaW5mby0+dHJlZV9tb2RfbG9nKTsKKwkJa2ZyZWUodG1fbGlzdFtpXSk7CisJfQorCWlmIChsb2NrZWQpCisJCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJa2ZyZWUodG1fbGlzdCk7CisJa2ZyZWUodG0pOworCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1fX3RyZWVfbW9kX2xvZ19mcmVlX2ViKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCitzdGF0aWMgaW5saW5lIGludAorX190cmVlX21vZF9sb2dfZnJlZV9lYihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJICAgICAgIHN0cnVjdCB0cmVlX21vZF9lbGVtICoqdG1fbGlzdCwKKwkJICAgICAgIGludCBucml0ZW1zKQogewotCWludCBpOwotCXUzMiBucml0ZW1zOworCWludCBpLCBqOwogCWludCByZXQ7CiAKLQlpZiAoYnRyZnNfaGVhZGVyX2xldmVsKGViKSA9PSAwKQotCQlyZXR1cm47Ci0KLQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpOwogCWZvciAoaSA9IG5yaXRlbXMgLSAxOyBpID49IDA7IGktLSkgewotCQlyZXQgPSBfX3RyZWVfbW9kX2xvZ19pbnNlcnRfa2V5KGZzX2luZm8sIGViLCBpLAotCQkJCU1PRF9MT0dfS0VZX1JFTU9WRV9XSElMRV9GUkVFSU5HLCBHRlBfTk9GUyk7Ci0JCUJVR19PTihyZXQgPCAwKTsKKwkJcmV0ID0gX190cmVlX21vZF9sb2dfaW5zZXJ0KGZzX2luZm8sIHRtX2xpc3RbaV0pOworCQlpZiAocmV0KSB7CisJCQlmb3IgKGogPSBucml0ZW1zIC0gMTsgaiA+IGk7IGotLSkKKwkJCQlyYl9lcmFzZSgmdG1fbGlzdFtqXS0+bm9kZSwKKwkJCQkJICZmc19pbmZvLT50cmVlX21vZF9sb2cpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgbm9pbmxpbmUgaW50CkBAIC02NDIsMTcgKzcwMiwzOCBAQAogCQkJIHN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXdfcm9vdCwgZ2ZwX3QgZmxhZ3MsCiAJCQkgaW50IGxvZ19yZW1vdmFsKQogewotCXN0cnVjdCB0cmVlX21vZF9lbGVtICp0bTsKKwlzdHJ1Y3QgdHJlZV9tb2RfZWxlbSAqdG0gPSBOVUxMOworCXN0cnVjdCB0cmVlX21vZF9lbGVtICoqdG1fbGlzdCA9IE5VTEw7CisJaW50IG5yaXRlbXMgPSAwOworCWludCByZXQgPSAwOworCWludCBpOwogCi0JaWYgKHRyZWVfbW9kX2RvbnRfbG9nKGZzX2luZm8sIE5VTEwpKQorCWlmICghdHJlZV9tb2RfbmVlZF9sb2coZnNfaW5mbywgTlVMTCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGxvZ19yZW1vdmFsKQotCQlfX3RyZWVfbW9kX2xvZ19mcmVlX2ViKGZzX2luZm8sIG9sZF9yb290KTsKKwlpZiAobG9nX3JlbW92YWwgJiYgYnRyZnNfaGVhZGVyX2xldmVsKG9sZF9yb290KSA+IDApIHsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKG9sZF9yb290KTsKKwkJdG1fbGlzdCA9IGt6YWxsb2MobnJpdGVtcyAqIHNpemVvZihzdHJ1Y3QgdHJlZV9tb2RfZWxlbSAqKSwKKwkJCQkgIGZsYWdzKTsKKwkJaWYgKCF0bV9saXN0KSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX3RtczsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCQl0bV9saXN0W2ldID0gYWxsb2NfdHJlZV9tb2RfZWxlbShvbGRfcm9vdCwgaSwKKwkJCSAgICBNT0RfTE9HX0tFWV9SRU1PVkVfV0hJTEVfRlJFRUlORywgZmxhZ3MpOworCQkJaWYgKCF0bV9saXN0W2ldKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGZyZWVfdG1zOworCQkJfQorCQl9CisJfQogCiAJdG0gPSBremFsbG9jKHNpemVvZigqdG0pLCBmbGFncyk7Ci0JaWYgKCF0bSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCF0bSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfdG1zOworCX0KIAogCXRtLT5pbmRleCA9IG5ld19yb290LT5zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXRtLT5vbGRfcm9vdC5sb2dpY2FsID0gb2xkX3Jvb3QtPnN0YXJ0OwpAQCAtNjYwLDcgKzc0MSwzMCBAQAogCXRtLT5nZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ob2xkX3Jvb3QpOwogCXRtLT5vcCA9IE1PRF9MT0dfUk9PVF9SRVBMQUNFOwogCi0JcmV0dXJuIF9fdHJlZV9tb2RfbG9nX2luc2VydChmc19pbmZvLCB0bSk7CisJaWYgKHRyZWVfbW9kX2RvbnRfbG9nKGZzX2luZm8sIE5VTEwpKQorCQlnb3RvIGZyZWVfdG1zOworCisJaWYgKHRtX2xpc3QpCisJCXJldCA9IF9fdHJlZV9tb2RfbG9nX2ZyZWVfZWIoZnNfaW5mbywgdG1fbGlzdCwgbnJpdGVtcyk7CisJaWYgKCFyZXQpCisJCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydChmc19pbmZvLCB0bSk7CisKKwl0cmVlX21vZF9sb2dfd3JpdGVfdW5sb2NrKGZzX2luZm8pOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV90bXM7CisJa2ZyZWUodG1fbGlzdCk7CisKKwlyZXR1cm4gcmV0OworCitmcmVlX3RtczoKKwlpZiAodG1fbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKQorCQkJa2ZyZWUodG1fbGlzdFtpXSk7CisJCWtmcmVlKHRtX2xpc3QpOworCX0KKwlrZnJlZSh0bSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IHRyZWVfbW9kX2VsZW0gKgpAQCAtNzI5LDMxICs4MzMsNzUgQEAKIAlyZXR1cm4gX190cmVlX21vZF9sb2dfc2VhcmNoKGZzX2luZm8sIHN0YXJ0LCBtaW5fc2VxLCAwKTsKIH0KIAotc3RhdGljIG5vaW5saW5lIHZvaWQKK3N0YXRpYyBub2lubGluZSBpbnQKIHRyZWVfbW9kX2xvZ19lYl9jb3B5KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZHN0LAogCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0X29mZnNldCwKIAkJICAgICB1bnNpZ25lZCBsb25nIHNyY19vZmZzZXQsIGludCBucl9pdGVtcykKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOworCXN0cnVjdCB0cmVlX21vZF9lbGVtICoqdG1fbGlzdCA9IE5VTEw7CisJc3RydWN0IHRyZWVfbW9kX2VsZW0gKip0bV9saXN0X2FkZCwgKip0bV9saXN0X3JlbTsKIAlpbnQgaTsKKwlpbnQgbG9ja2VkID0gMDsKIAotCWlmICh0cmVlX21vZF9kb250X2xvZyhmc19pbmZvLCBOVUxMKSkKLQkJcmV0dXJuOworCWlmICghdHJlZV9tb2RfbmVlZF9sb2coZnNfaW5mbywgTlVMTCkpCisJCXJldHVybiAwOwogCiAJaWYgKGJ0cmZzX2hlYWRlcl9sZXZlbChkc3QpID09IDAgJiYgYnRyZnNfaGVhZGVyX2xldmVsKHNyYykgPT0gMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKKworCXRtX2xpc3QgPSBremFsbG9jKG5yX2l0ZW1zICogMiAqIHNpemVvZihzdHJ1Y3QgdHJlZV9tb2RfZWxlbSAqKSwKKwkJCSAgR0ZQX05PRlMpOworCWlmICghdG1fbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0bV9saXN0X2FkZCA9IHRtX2xpc3Q7CisJdG1fbGlzdF9yZW0gPSB0bV9saXN0ICsgbnJfaXRlbXM7CisJZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zOyBpKyspIHsKKwkJdG1fbGlzdF9yZW1baV0gPSBhbGxvY190cmVlX21vZF9lbGVtKHNyYywgaSArIHNyY19vZmZzZXQsCisJCSAgICBNT0RfTE9HX0tFWV9SRU1PVkUsIEdGUF9OT0ZTKTsKKwkJaWYgKCF0bV9saXN0X3JlbVtpXSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV90bXM7CisJCX0KKworCQl0bV9saXN0X2FkZFtpXSA9IGFsbG9jX3RyZWVfbW9kX2VsZW0oZHN0LCBpICsgZHN0X29mZnNldCwKKwkJICAgIE1PRF9MT0dfS0VZX0FERCwgR0ZQX05PRlMpOworCQlpZiAoIXRtX2xpc3RfYWRkW2ldKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX3RtczsKKwkJfQorCX0KKworCWlmICh0cmVlX21vZF9kb250X2xvZyhmc19pbmZvLCBOVUxMKSkKKwkJZ290byBmcmVlX3RtczsKKwlsb2NrZWQgPSAxOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zOyBpKyspIHsKLQkJcmV0ID0gX190cmVlX21vZF9sb2dfaW5zZXJ0X2tleShmc19pbmZvLCBzcmMsCi0JCQkJCQlpICsgc3JjX29mZnNldCwKLQkJCQkJCU1PRF9MT0dfS0VZX1JFTU9WRSwgR0ZQX05PRlMpOwotCQlCVUdfT04ocmV0IDwgMCk7Ci0JCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydF9rZXkoZnNfaW5mbywgZHN0LAotCQkJCQkJICAgICBpICsgZHN0X29mZnNldCwKLQkJCQkJCSAgICAgTU9EX0xPR19LRVlfQURELAotCQkJCQkJICAgICBHRlBfTk9GUyk7Ci0JCUJVR19PTihyZXQgPCAwKTsKKwkJcmV0ID0gX190cmVlX21vZF9sb2dfaW5zZXJ0KGZzX2luZm8sIHRtX2xpc3RfcmVtW2ldKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZnJlZV90bXM7CisJCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydChmc19pbmZvLCB0bV9saXN0X2FkZFtpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZyZWVfdG1zOwogCX0KKworCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJa2ZyZWUodG1fbGlzdCk7CisKKwlyZXR1cm4gMDsKKworZnJlZV90bXM6CisJZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zICogMjsgaSsrKSB7CisJCWlmICh0bV9saXN0W2ldICYmICFSQl9FTVBUWV9OT0RFKCZ0bV9saXN0W2ldLT5ub2RlKSkKKwkJCXJiX2VyYXNlKCZ0bV9saXN0W2ldLT5ub2RlLCAmZnNfaW5mby0+dHJlZV9tb2RfbG9nKTsKKwkJa2ZyZWUodG1fbGlzdFtpXSk7CisJfQorCWlmIChsb2NrZWQpCisJCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJa2ZyZWUodG1fbGlzdCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTc3MiwxOCArOTIwLDU4IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IF9fdHJlZV9tb2RfbG9nX2luc2VydF9rZXkoZnNfaW5mbywgZWIsIHNsb3QsCisJcmV0ID0gdHJlZV9tb2RfbG9nX2luc2VydF9rZXkoZnNfaW5mbywgZWIsIHNsb3QsCiAJCQkJCU1PRF9MT0dfS0VZX1JFUExBQ0UsCiAJCQkJCWF0b21pYyA/IEdGUF9BVE9NSUMgOiBHRlBfTk9GUyk7CiAJQlVHX09OKHJldCA8IDApOwogfQogCi1zdGF0aWMgbm9pbmxpbmUgdm9pZAorc3RhdGljIG5vaW5saW5lIGludAogdHJlZV9tb2RfbG9nX2ZyZWVfZWIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKIHsKKwlzdHJ1Y3QgdHJlZV9tb2RfZWxlbSAqKnRtX2xpc3QgPSBOVUxMOworCWludCBucml0ZW1zID0gMDsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChidHJmc19oZWFkZXJfbGV2ZWwoZWIpID09IDApCisJCXJldHVybiAwOworCisJaWYgKCF0cmVlX21vZF9uZWVkX2xvZyhmc19pbmZvLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpOworCXRtX2xpc3QgPSBremFsbG9jKG5yaXRlbXMgKiBzaXplb2Yoc3RydWN0IHRyZWVfbW9kX2VsZW0gKiksCisJCQkgIEdGUF9OT0ZTKTsKKwlpZiAoIXRtX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgeworCQl0bV9saXN0W2ldID0gYWxsb2NfdHJlZV9tb2RfZWxlbShlYiwgaSwKKwkJICAgIE1PRF9MT0dfS0VZX1JFTU9WRV9XSElMRV9GUkVFSU5HLCBHRlBfTk9GUyk7CisJCWlmICghdG1fbGlzdFtpXSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV90bXM7CisJCX0KKwl9CisKIAlpZiAodHJlZV9tb2RfZG9udF9sb2coZnNfaW5mbywgZWIpKQotCQlyZXR1cm47Ci0JX190cmVlX21vZF9sb2dfZnJlZV9lYihmc19pbmZvLCBlYik7CisJCWdvdG8gZnJlZV90bXM7CisKKwlyZXQgPSBfX3RyZWVfbW9kX2xvZ19mcmVlX2ViKGZzX2luZm8sIHRtX2xpc3QsIG5yaXRlbXMpOworCXRyZWVfbW9kX2xvZ193cml0ZV91bmxvY2soZnNfaW5mbyk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX3RtczsKKwlrZnJlZSh0bV9saXN0KTsKKworCXJldHVybiAwOworCitmcmVlX3RtczoKKwlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKQorCQlrZnJlZSh0bV9saXN0W2ldKTsKKwlrZnJlZSh0bV9saXN0KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBub2lubGluZSB2b2lkCkBAIC0xMDQxLDggKzEyMjksMTMgQEAKIAkJYnRyZnNfc2V0X25vZGVfcHRyX2dlbmVyYXRpb24ocGFyZW50LCBwYXJlbnRfc2xvdCwKIAkJCQkJICAgICAgdHJhbnMtPnRyYW5zaWQpOwogCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOwotCQlpZiAobGFzdF9yZWYpCi0JCQl0cmVlX21vZF9sb2dfZnJlZV9lYihyb290LT5mc19pbmZvLCBidWYpOworCQlpZiAobGFzdF9yZWYpIHsKKwkJCXJldCA9IHRyZWVfbW9kX2xvZ19mcmVlX2ViKHJvb3QtPmZzX2luZm8sIGJ1Zik7CisJCQlpZiAocmV0KSB7CisJCQkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQogCQlidHJmc19mcmVlX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIGJ1ZiwgcGFyZW50X3N0YXJ0LAogCQkJCSAgICAgIGxhc3RfcmVmKTsKIAl9CkBAIC0xMjg3LDggKzE0ODAsOCBAQAogCQlvbGQgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgbG9naWNhbCwgYmxvY2tzaXplLCAwKTsKIAkJaWYgKFdBUk5fT04oIW9sZCB8fCAhZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShvbGQpKSkgewogCQkJZnJlZV9leHRlbnRfYnVmZmVyKG9sZCk7Ci0JCQlwcl93YXJuKCJidHJmczogZmFpbGVkIHRvIHJlYWQgdHJlZSBibG9jayAlbGx1IGZyb20gZ2V0X29sZF9yb290XG4iLAotCQkJCWxvZ2ljYWwpOworCQkJYnRyZnNfd2Fybihyb290LT5mc19pbmZvLAorCQkJCSJmYWlsZWQgdG8gcmVhZCB0cmVlIGJsb2NrICVsbHUgZnJvbSBnZXRfb2xkX3Jvb3QiLCBsb2dpY2FsKTsKIAkJfSBlbHNlIHsKIAkJCWViID0gYnRyZnNfY2xvbmVfZXh0ZW50X2J1ZmZlcihvbGQpOwogCQkJZnJlZV9leHRlbnRfYnVmZmVyKG9sZCk7CkBAIC0yNDYyLDYgKzI2NTUsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGJ0cmZzX2ZpbmRfaXRlbShzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKmZvdW5kX3BhdGgsCisJCXU2NCBpb2JqZWN0aWQsIHU2NCBpb2ZmLCB1OCBrZXlfdHlwZSwKKwkJc3RydWN0IGJ0cmZzX2tleSAqZm91bmRfa2V5KQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCisJa2V5LnR5cGUgPSBrZXlfdHlwZTsKKwlrZXkub2JqZWN0aWQgPSBpb2JqZWN0aWQ7CisJa2V5Lm9mZnNldCA9IGlvZmY7CisKKwlpZiAoZm91bmRfcGF0aCA9PSBOVUxMKSB7CisJCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJCWlmICghcGF0aCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZQorCQlwYXRoID0gZm91bmRfcGF0aDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGZzX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmICgocmV0IDwgMCkgfHwgKGZvdW5kX2tleSA9PSBOVUxMKSkgeworCQlpZiAocGF0aCAhPSBmb3VuZF9wYXRoKQorCQkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWViID0gcGF0aC0+bm9kZXNbMF07CisJaWYgKHJldCAmJiBwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhlYikpIHsKKwkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKGZzX3Jvb3QsIHBhdGgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwl9CisKKwlidHJmc19pdGVtX2tleV90b19jcHUoZWIsIGZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCWlmIChmb3VuZF9rZXktPnR5cGUgIT0ga2V5LnR5cGUgfHwKKwkJCWZvdW5kX2tleS0+b2JqZWN0aWQgIT0ga2V5Lm9iamVjdGlkKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiAvKgogICogbG9vayBmb3Iga2V5IGluIHRoZSB0cmVlLiAgcGF0aCBpcyBmaWxsZWQgaW4gd2l0aCBub2RlcyBhbG9uZyB0aGUgd2F5CiAgKiBpZiBrZXkgaXMgZm91bmQsIHdlIHJldHVybiB6ZXJvIGFuZCB5b3UgY2FuIGZpbmQgdGhlIGl0ZW0gaW4gdGhlIGxlYWYKQEAgLTI0OTUsNiArMjczMSw3IEBACiAJbG93ZXN0X2xldmVsID0gcC0+bG93ZXN0X2xldmVsOwogCVdBUk5fT04obG93ZXN0X2xldmVsICYmIGluc19sZW4gPiAwKTsKIAlXQVJOX09OKHAtPm5vZGVzWzBdICE9IE5VTEwpOworCUJVR19PTighY293ICYmIGluc19sZW4pOwogCiAJaWYgKGluc19sZW4gPCAwKSB7CiAJCWxvd2VzdF91bmxvY2sgPSAyOwpAQCAtMjYwMyw4ICsyODQwLDYgQEAKIAkJCX0KIAkJfQogY293X2RvbmU6Ci0JCUJVR19PTighY293ICYmIGluc19sZW4pOwotCiAJCXAtPm5vZGVzW2xldmVsXSA9IGI7CiAJCWJ0cmZzX2NsZWFyX3BhdGhfYmxvY2tpbmcocCwgTlVMTCwgMCk7CiAKQEAgLTI2MTQsMTMgKzI4NDksMTkgQEAKIAkJICogSXQgaXMgc2FmZSB0byBkcm9wIHRoZSBsb2NrIG9uIG91ciBwYXJlbnQgYmVmb3JlIHdlCiAJCSAqIGdvIHRocm91Z2ggdGhlIGV4cGVuc2l2ZSBidHJlZSBzZWFyY2ggb24gYi4KIAkJICoKLQkJICogSWYgY293IGlzIHRydWUsIHRoZW4gd2UgbWlnaHQgYmUgY2hhbmdpbmcgc2xvdCB6ZXJvLAotCQkgKiB3aGljaCBtYXkgcmVxdWlyZSBjaGFuZ2luZyB0aGUgcGFyZW50LiAgU28sIHdlIGNhbid0Ci0JCSAqIGRyb3AgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgd2Uga25vdyB3aGljaCBzbG90IHdlJ3JlCi0JCSAqIG9wZXJhdGluZyBvbi4KKwkJICogSWYgd2UncmUgaW5zZXJ0aW5nIG9yIGRlbGV0aW5nIChpbnNfbGVuICE9IDApLCB0aGVuIHdlIG1pZ2h0CisJCSAqIGJlIGNoYW5naW5nIHNsb3QgemVybywgd2hpY2ggbWF5IHJlcXVpcmUgY2hhbmdpbmcgdGhlIHBhcmVudC4KKwkJICogU28sIHdlIGNhbid0IGRyb3AgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgd2Uga25vdyB3aGljaCBzbG90CisJCSAqIHdlJ3JlIG9wZXJhdGluZyBvbi4KIAkJICovCi0JCWlmICghY293KQotCQkJYnRyZnNfdW5sb2NrX3VwX3NhZmUocCwgbGV2ZWwgKyAxKTsKKwkJaWYgKCFpbnNfbGVuICYmICFwLT5rZWVwX2xvY2tzKSB7CisJCQlpbnQgdSA9IGxldmVsICsgMTsKKworCQkJaWYgKHUgPCBCVFJGU19NQVhfTEVWRUwgJiYgcC0+bG9ja3NbdV0pIHsKKwkJCQlidHJmc190cmVlX3VubG9ja19ydyhwLT5ub2Rlc1t1XSwgcC0+bG9ja3NbdV0pOworCQkJCXAtPmxvY2tzW3VdID0gMDsKKwkJCX0KKwkJfQogCiAJCXJldCA9IGtleV9zZWFyY2goYiwga2V5LCBsZXZlbCwgJnByZXZfY21wLCAmc2xvdCk7CiAKQEAgLTI2NDgsNyArMjg4OSw3IEBACiAJCQkgKiB3aGljaCBtZWFucyB3ZSBtdXN0IGhhdmUgYSB3cml0ZSBsb2NrCiAJCQkgKiBvbiB0aGUgcGFyZW50CiAJCQkgKi8KLQkJCWlmIChzbG90ID09IDAgJiYgY293ICYmCisJCQlpZiAoc2xvdCA9PSAwICYmIGluc19sZW4gJiYKIAkJCSAgICB3cml0ZV9sb2NrX2xldmVsIDwgbGV2ZWwgKyAxKSB7CiAJCQkJd3JpdGVfbG9ja19sZXZlbCA9IGxldmVsICsgMTsKIAkJCQlidHJmc19yZWxlYXNlX3BhdGgocCk7CkBAIC0yOTAxLDcgKzMxNDIsOSBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAkJCWlmICghcmV0KSB7Ci0JCQkJcC0+c2xvdHNbMF0gPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSAtIDE7CisJCQkJbGVhZiA9IHAtPm5vZGVzWzBdOworCQkJCWlmIChwLT5zbG90c1swXSA9PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkKKwkJCQkJcC0+c2xvdHNbMF0tLTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWlmICghcmV0dXJuX2FueSkKQEAgLTMwMjIsOCArMzI2NSwxMiBAQAogCX0gZWxzZQogCQlwdXNoX2l0ZW1zID0gbWluKHNyY19ucml0ZW1zIC0gOCwgcHVzaF9pdGVtcyk7CiAKLQl0cmVlX21vZF9sb2dfZWJfY29weShyb290LT5mc19pbmZvLCBkc3QsIHNyYywgZHN0X25yaXRlbXMsIDAsCi0JCQkgICAgIHB1c2hfaXRlbXMpOworCXJldCA9IHRyZWVfbW9kX2xvZ19lYl9jb3B5KHJvb3QtPmZzX2luZm8sIGRzdCwgc3JjLCBkc3RfbnJpdGVtcywgMCwKKwkJCQkgICBwdXNoX2l0ZW1zKTsKKwlpZiAocmV0KSB7CisJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290LCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAljb3B5X2V4dGVudF9idWZmZXIoZHN0LCBzcmMsCiAJCQkgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KGRzdF9ucml0ZW1zKSwKIAkJCSAgIGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQoMCksCkBAIC0zMDkzLDggKzMzNDAsMTIgQEAKIAkJCQkgICAgICAoZHN0X25yaXRlbXMpICoKIAkJCQkgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpKTsKIAotCXRyZWVfbW9kX2xvZ19lYl9jb3B5KHJvb3QtPmZzX2luZm8sIGRzdCwgc3JjLCAwLAotCQkJICAgICBzcmNfbnJpdGVtcyAtIHB1c2hfaXRlbXMsIHB1c2hfaXRlbXMpOworCXJldCA9IHRyZWVfbW9kX2xvZ19lYl9jb3B5KHJvb3QtPmZzX2luZm8sIGRzdCwgc3JjLCAwLAorCQkJCSAgIHNyY19ucml0ZW1zIC0gcHVzaF9pdGVtcywgcHVzaF9pdGVtcyk7CisJaWYgKHJldCkgeworCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJY29weV9leHRlbnRfYnVmZmVyKGRzdCwgc3JjLAogCQkJICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldCgwKSwKIAkJCSAgIGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQoc3JjX25yaXRlbXMgLSBwdXNoX2l0ZW1zKSwKQEAgLTMyOTUsNyArMzU0NiwxMiBAQAogCQkJICAgIGJ0cmZzX2hlYWRlcl9jaHVua190cmVlX3V1aWQoc3BsaXQpLAogCQkJICAgIEJUUkZTX1VVSURfU0laRSk7CiAKLQl0cmVlX21vZF9sb2dfZWJfY29weShyb290LT5mc19pbmZvLCBzcGxpdCwgYywgMCwgbWlkLCBjX25yaXRlbXMgLSBtaWQpOworCXJldCA9IHRyZWVfbW9kX2xvZ19lYl9jb3B5KHJvb3QtPmZzX2luZm8sIHNwbGl0LCBjLCAwLAorCQkJCSAgIG1pZCwgY19ucml0ZW1zIC0gbWlkKTsKKwlpZiAocmV0KSB7CisJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290LCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAljb3B5X2V4dGVudF9idWZmZXIoc3BsaXQsIGMsCiAJCQkgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KDApLAogCQkJICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldChtaWQpLApAQCAtMzM2Miw4ICszNjE4LDggQEAKIAlpbnQgcmV0OwogCXJldCA9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpIC0gbGVhZl9zcGFjZV91c2VkKGxlYWYsIDAsIG5yaXRlbXMpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgImxlYWYgZnJlZSBzcGFjZSByZXQgJWQsIGxlYWYgZGF0YSBzaXplICVsdSwgIgotCQkgICAgICAgInVzZWQgJWQgbnJpdGVtcyAlZFxuIiwKKwkJYnRyZnNfY3JpdChyb290LT5mc19pbmZvLAorCQkJImxlYWYgZnJlZSBzcGFjZSByZXQgJWQsIGxlYWYgZGF0YSBzaXplICVsdSwgdXNlZCAlZCBucml0ZW1zICVkIiwKIAkJICAgICAgIHJldCwgKHVuc2lnbmVkIGxvbmcpIEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpLAogCQkgICAgICAgbGVhZl9zcGFjZV91c2VkKGxlYWYsIDAsIG5yaXRlbXMpLCBucml0ZW1zKTsKIAl9CkBAIC0zNTcxLDYgKzM4MjcsMTkgQEAKIAlpZiAobGVmdF9ucml0ZW1zID09IDApCiAJCWdvdG8gb3V0X3VubG9jazsKIAorCWlmIChwYXRoLT5zbG90c1swXSA9PSBsZWZ0X25yaXRlbXMgJiYgIWVtcHR5KSB7CisJCS8qIEtleSBncmVhdGVyIHRoYW4gYWxsIGtleXMgaW4gdGhlIGxlYWYsIHJpZ2h0IG5laWdoYm9yIGhhcworCQkgKiBlbm91Z2ggcm9vbSBmb3IgaXQgYW5kIHdlJ3JlIG5vdCBlbXB0eWluZyBvdXIgbGVhZiB0byBkZWxldGUKKwkJICogaXQsIHRoZXJlZm9yZSB1c2UgcmlnaHQgbmVpZ2hib3IgdG8gaW5zZXJ0IHRoZSBuZXcgaXRlbSBhbmQKKwkJICogbm8gbmVlZCB0byB0b3VjaC9kaXJ0eSBvdXIgbGVmdCBsZWFmdC4gKi8KKwkJYnRyZnNfdHJlZV91bmxvY2sobGVmdCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWZ0KTsKKwkJcGF0aC0+bm9kZXNbMF0gPSByaWdodDsKKwkJcGF0aC0+c2xvdHNbMF0gPSAwOworCQlwYXRoLT5zbG90c1sxXSsrOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gX19wdXNoX2xlYWZfcmlnaHQodHJhbnMsIHJvb3QsIHBhdGgsIG1pbl9kYXRhX3NpemUsIGVtcHR5LAogCQkJCXJpZ2h0LCBmcmVlX3NwYWNlLCBsZWZ0X25yaXRlbXMsIG1pbl9zbG90KTsKIG91dF91bmxvY2s6CkBAIC0zODg3LDE0ICs0MTU2LDE3IEBACiAJaW50IHByb2dyZXNzID0gMDsKIAlpbnQgc2xvdDsKIAl1MzIgbnJpdGVtczsKKwlpbnQgc3BhY2VfbmVlZGVkID0gZGF0YV9zaXplOwogCiAJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCWlmIChzbG90IDwgYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pKQorCQlzcGFjZV9uZWVkZWQgLT0gYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIHBhdGgtPm5vZGVzWzBdKTsKIAogCS8qCiAJICogdHJ5IHRvIHB1c2ggYWxsIHRoZSBpdGVtcyBhZnRlciBvdXIgc2xvdCBpbnRvIHRoZQogCSAqIHJpZ2h0IGxlYWYKIAkgKi8KLQlyZXQgPSBwdXNoX2xlYWZfcmlnaHQodHJhbnMsIHJvb3QsIHBhdGgsIDEsIGRhdGFfc2l6ZSwgMCwgc2xvdCk7CisJcmV0ID0gcHVzaF9sZWFmX3JpZ2h0KHRyYW5zLCByb290LCBwYXRoLCAxLCBzcGFjZV9uZWVkZWQsIDAsIHNsb3QpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zOTE0LDcgKzQxODYsNyBAQAogCiAJLyogdHJ5IHRvIHB1c2ggYWxsIHRoZSBpdGVtcyBiZWZvcmUgb3VyIHNsb3QgaW50byB0aGUgbmV4dCBsZWFmICovCiAJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwotCXJldCA9IHB1c2hfbGVhZl9sZWZ0KHRyYW5zLCByb290LCBwYXRoLCAxLCBkYXRhX3NpemUsIDAsIHNsb3QpOworCXJldCA9IHB1c2hfbGVhZl9sZWZ0KHRyYW5zLCByb290LCBwYXRoLCAxLCBzcGFjZV9uZWVkZWQsIDAsIHNsb3QpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zOTU4LDEzICs0MjMwLDE4IEBACiAKIAkvKiBmaXJzdCB0cnkgdG8gbWFrZSBzb21lIHJvb20gYnkgcHVzaGluZyBsZWZ0IGFuZCByaWdodCAqLwogCWlmIChkYXRhX3NpemUgJiYgcGF0aC0+bm9kZXNbMV0pIHsKLQkJd3JldCA9IHB1c2hfbGVhZl9yaWdodCh0cmFucywgcm9vdCwgcGF0aCwgZGF0YV9zaXplLAotCQkJCSAgICAgICBkYXRhX3NpemUsIDAsIDApOworCQlpbnQgc3BhY2VfbmVlZGVkID0gZGF0YV9zaXplOworCisJCWlmIChzbG90IDwgYnRyZnNfaGVhZGVyX25yaXRlbXMobCkpCisJCQlzcGFjZV9uZWVkZWQgLT0gYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGwpOworCisJCXdyZXQgPSBwdXNoX2xlYWZfcmlnaHQodHJhbnMsIHJvb3QsIHBhdGgsIHNwYWNlX25lZWRlZCwKKwkJCQkgICAgICAgc3BhY2VfbmVlZGVkLCAwLCAwKTsKIAkJaWYgKHdyZXQgPCAwKQogCQkJcmV0dXJuIHdyZXQ7CiAJCWlmICh3cmV0KSB7Ci0JCQl3cmV0ID0gcHVzaF9sZWFmX2xlZnQodHJhbnMsIHJvb3QsIHBhdGgsIGRhdGFfc2l6ZSwKLQkJCQkJICAgICAgZGF0YV9zaXplLCAwLCAodTMyKS0xKTsKKwkJCXdyZXQgPSBwdXNoX2xlYWZfbGVmdCh0cmFucywgcm9vdCwgcGF0aCwgc3BhY2VfbmVlZGVkLAorCQkJCQkgICAgICBzcGFjZV9uZWVkZWQsIDAsICh1MzIpLTEpOwogCQkJaWYgKHdyZXQgPCAwKQogCQkJCXJldHVybiB3cmV0OwogCQl9CkBAIC00NDMyLDcgKzQ3MDksNyBAQAogCUJVR19PTihzbG90IDwgMCk7CiAJaWYgKHNsb3QgPj0gbnJpdGVtcykgewogCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGxlYWYpOwotCQlwcmludGsoS0VSTl9DUklUICJzbG90ICVkIHRvbyBsYXJnZSwgbnJpdGVtcyAlZFxuIiwKKwkJYnRyZnNfY3JpdChyb290LT5mc19pbmZvLCAic2xvdCAlZCB0b28gbGFyZ2UsIG5yaXRlbXMgJWQiLAogCQkgICAgICAgc2xvdCwgbnJpdGVtcyk7CiAJCUJVR19PTigxKTsKIAl9CkBAIC00NDk1LDcgKzQ3NzIsNyBAQAogCiAJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IHRvdGFsX3NpemUpIHsKIAkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAibm90IGVub3VnaCBmcmVlc3BhY2UgbmVlZCAldSBoYXZlICVkXG4iLAorCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJub3QgZW5vdWdoIGZyZWVzcGFjZSBuZWVkICV1IGhhdmUgJWQiLAogCQkgICAgICAgdG90YWxfc2l6ZSwgYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlYWYpKTsKIAkJQlVHKCk7CiAJfQpAQCAtNDUwNSw3ICs0NzgyLDcgQEAKIAogCQlpZiAob2xkX2RhdGEgPCBkYXRhX2VuZCkgewogCQkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKLQkJCXByaW50ayhLRVJOX0NSSVQgInNsb3QgJWQgb2xkX2RhdGEgJWQgZGF0YV9lbmQgJWRcbiIsCisJCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJzbG90ICVkIG9sZF9kYXRhICVkIGRhdGFfZW5kICVkIiwKIAkJCSAgICAgICBzbG90LCBvbGRfZGF0YSwgZGF0YV9lbmQpOwogCQkJQlVHX09OKDEpOwogCQl9CkBAIC00ODE3LDcgKzUwOTQsNyBAQAogICogVGhpcyBtYXkgcmVsZWFzZSB0aGUgcGF0aCwgYW5kIHNvIHlvdSBtYXkgbG9zZSBhbnkgbG9ja3MgaGVsZCBhdCB0aGUKICAqIHRpbWUgeW91IGNhbGwgaXQuCiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfcHJldl9sZWFmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCkKK2ludCBidHJmc19wcmV2X2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQogewogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXN0cnVjdCBidHJmc19kaXNrX2tleSBmb3VuZF9rZXk7CkBAIC01MjQwLDcgKzU1MTcsNyBAQAogCiAJCQlpZiAoIWxlZnRfc3RhcnRfY3RyYW5zaWQgfHwgIXJpZ2h0X3N0YXJ0X2N0cmFuc2lkKSB7CiAJCQkJV0FSTigxLCBLRVJOX1dBUk5JTkcKLQkJCQkJImJ0cmZzOiBidHJmc19jb21wYXJlX3RyZWUgZGV0ZWN0ZWQgIgorCQkJCQkiQlRSRlM6IGJ0cmZzX2NvbXBhcmVfdHJlZSBkZXRlY3RlZCAiCiAJCQkJCSJhIGNoYW5nZSBpbiBvbmUgb2YgdGhlIHRyZWVzIHdoaWxlICIKIAkJCQkJIml0ZXJhdGluZy4gVGhpcyBpcyBwcm9iYWJseSBhICIKIAkJCQkJImJ1Zy5cbiIpOwpAQCAtNTY4MCwzICs1OTU3LDQ2IEBACiAJfQogCXJldHVybiAxOwogfQorCisvKgorICogc2VhcmNoIGluIGV4dGVudCB0cmVlIHRvIGZpbmQgYSBwcmV2aW91cyBNZXRhZGF0YS9EYXRhIGV4dGVudCBpdGVtIHdpdGgKKyAqIG1pbiBvYmplY2l0ZC4KKyAqCisgKiByZXR1cm5zIDAgaWYgc29tZXRoaW5nIGlzIGZvdW5kLCAxIGlmIG5vdGhpbmcgd2FzIGZvdW5kIGFuZCA8IDAgb24gZXJyb3IKKyAqLworaW50IGJ0cmZzX3ByZXZpb3VzX2V4dGVudF9pdGVtKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHU2NCBtaW5fb2JqZWN0aWQpCit7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdTMyIG5yaXRlbXM7CisJaW50IHJldDsKKworCXdoaWxlICgxKSB7CisJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKSB7CisJCQlidHJmc19zZXRfcGF0aF9ibG9ja2luZyhwYXRoKTsKKwkJCXJldCA9IGJ0cmZzX3ByZXZfbGVhZihyb290LCBwYXRoKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJfQorCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJaWYgKG5yaXRlbXMgPT0gMCkKKwkJCXJldHVybiAxOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gbnJpdGVtcykKKwkJCXBhdGgtPnNsb3RzWzBdLS07CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCA8IG1pbl9vYmplY3RpZCkKKwkJCWJyZWFrOworCQlpZiAoZm91bmRfa2V5LnR5cGUgPT0gQlRSRlNfRVhURU5UX0lURU1fS0VZIHx8CisJCSAgICBmb3VuZF9rZXkudHlwZSA9PSBCVFJGU19NRVRBREFUQV9JVEVNX0tFWSkKKwkJCXJldHVybiAwOworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID09IG1pbl9vYmplY3RpZCAmJgorCQkgICAgZm91bmRfa2V5LnR5cGUgPCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9jdHJlZS5oIGIvZnMvYnRyZnMvY3RyZWUuaAppbmRleCA3NTA2ODI1Li4yYzFhNDJjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5oCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmgKQEAgLTUyMSw5ICs1MjEsMTUgQEAKICNkZWZpbmUgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTkRFRF9JUkVGCSgxVUxMIDw8IDYpCiAjZGVmaW5lIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfUkFJRDU2CQkoMVVMTCA8PCA3KQogI2RlZmluZSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX1NLSU5OWV9NRVRBREFUQQkoMVVMTCA8PCA4KQorI2RlZmluZSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX05PX0hPTEVTCQkoMVVMTCA8PCA5KQogCiAjZGVmaW5lIEJUUkZTX0ZFQVRVUkVfQ09NUEFUX1NVUFAJCTBVTEwKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9DT01QQVRfU0FGRV9TRVQJCTBVTEwKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9DT01QQVRfU0FGRV9DTEVBUgkJMFVMTAogI2RlZmluZSBCVFJGU19GRUFUVVJFX0NPTVBBVF9ST19TVVBQCQkwVUxMCisjZGVmaW5lIEJUUkZTX0ZFQVRVUkVfQ09NUEFUX1JPX1NBRkVfU0VUCTBVTEwKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU0FGRV9DTEVBUgkwVUxMCisKICNkZWZpbmUgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCQkJXAogCShCVFJGU19GRUFUVVJFX0lOQ09NUEFUX01JWEVEX0JBQ0tSRUYgfAkJXAogCSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX0RFRkFVTFRfU1VCVk9MIHwJXApAQCAtNTMyLDcgKzUzOCwxMiBAQAogCSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTX0xaTyB8CQlcCiAJIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfUkFJRDU2IHwJCVwKIAkgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTkRFRF9JUkVGIHwJCVwKLQkgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9TS0lOTllfTUVUQURBVEEpCisJIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfU0tJTk5ZX01FVEFEQVRBIHwJXAorCSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX05PX0hPTEVTKQorCisjZGVmaW5lIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfU0FGRV9TRVQJCQlcCisJKEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5ERURfSVJFRikKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9TQUZFX0NMRUFSCQkwVUxMCiAKIC8qCiAgKiBBIGxlYWYgaXMgZnVsbCBvZiBpdGVtcy4gb2Zmc2V0IGFuZCBzaXplIHRlbGwgdXMgd2hlcmUgdG8gZmluZApAQCAtMTA5NCw3ICsxMTA1LDcgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gewotCXU2NCBmbGFnczsKKwlzcGlubG9ja190IGxvY2s7CiAKIAl1NjQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGluIHRoZSBzcGFjZSwKIAkJCQkgICB0aGlzIGRvZXNuJ3QgdGFrZSBtaXJyb3JzIGludG8gYWNjb3VudCAqLwpAQCAtMTEwNCwxNCArMTExNSwyNSBAQAogCQkJCSAgIHRyYW5zYWN0aW9uIGZpbmlzaGVzICovCiAJdTY0IGJ5dGVzX3Jlc2VydmVkOwkvKiB0b3RhbCBieXRlcyB0aGUgYWxsb2NhdG9yIGhhcyByZXNlcnZlZCBmb3IKIAkJCQkgICBjdXJyZW50IGFsbG9jYXRpb25zICovCi0JdTY0IGJ5dGVzX3JlYWRvbmx5OwkvKiB0b3RhbCBieXRlcyB0aGF0IGFyZSByZWFkIG9ubHkgKi8KLQogCXU2NCBieXRlc19tYXlfdXNlOwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IKIAkJCQkgICBkZWxhbGxvYy9hbGxvY2F0aW9ucyAqLworCXU2NCBieXRlc19yZWFkb25seTsJLyogdG90YWwgYnl0ZXMgdGhhdCBhcmUgcmVhZCBvbmx5ICovCisKKwl1bnNpZ25lZCBpbnQgZnVsbDoxOwkvKiBpbmRpY2F0ZXMgdGhhdCB3ZSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUKKwkJCQkgICBjaHVua3MgZm9yIHRoaXMgc3BhY2UgKi8KKwl1bnNpZ25lZCBpbnQgY2h1bmtfYWxsb2M6MTsJLyogc2V0IGlmIHdlIGFyZSBhbGxvY2F0aW5nIGEgY2h1bmsgKi8KKworCXVuc2lnbmVkIGludCBmbHVzaDoxOwkJLyogc2V0IGlmIHdlIGFyZSB0cnlpbmcgdG8gbWFrZSBzcGFjZSAqLworCisJdW5zaWduZWQgaW50IGZvcmNlX2FsbG9jOwkvKiBzZXQgaWYgd2UgbmVlZCB0byBmb3JjZSBhIGNodW5rCisJCQkJCSAgIGFsbG9jIGZvciB0aGlzIHNwYWNlICovCisKIAl1NjQgZGlza191c2VkOwkJLyogdG90YWwgYnl0ZXMgdXNlZCBvbiBkaXNrICovCiAJdTY0IGRpc2tfdG90YWw7CQkvKiB0b3RhbCBieXRlcyBvbiBkaXNrLCB0YWtlcyBtaXJyb3JzIGludG8KIAkJCQkgICBhY2NvdW50ICovCiAKKwl1NjQgZmxhZ3M7CisKIAkvKgogCSAqIGJ5dGVzX3Bpbm5lZCBpcyBrZXB0IGluIGxpbmUgd2l0aCB3aGF0IGlzIGFjdHVhbGx5IHBpbm5lZCwgYXMgaW4KIAkgKiB3ZSd2ZSBjYWxsZWQgdXBkYXRlX2Jsb2NrX2dyb3VwIGFuZCBkcm9wcGVkIHRoZSBieXRlc191c2VkIGNvdW50ZXIKQEAgLTExMjQsMjIgKzExNDYsMTUgQEAKIAkgKi8KIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgdG90YWxfYnl0ZXNfcGlubmVkOwogCi0JdW5zaWduZWQgaW50IGZ1bGw6MTsJLyogaW5kaWNhdGVzIHRoYXQgd2UgY2Fubm90IGFsbG9jYXRlIGFueSBtb3JlCi0JCQkJICAgY2h1bmtzIGZvciB0aGlzIHNwYWNlICovCi0JdW5zaWduZWQgaW50IGNodW5rX2FsbG9jOjE7CS8qIHNldCBpZiB3ZSBhcmUgYWxsb2NhdGluZyBhIGNodW5rICovCi0KLQl1bnNpZ25lZCBpbnQgZmx1c2g6MTsJCS8qIHNldCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIG1ha2Ugc3BhY2UgKi8KLQotCXVuc2lnbmVkIGludCBmb3JjZV9hbGxvYzsJLyogc2V0IGlmIHdlIG5lZWQgdG8gZm9yY2UgYSBjaHVuawotCQkJCQkgICBhbGxvYyBmb3IgdGhpcyBzcGFjZSAqLwotCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBncm91cHNfc2VtOwogCS8qIGZvciBibG9jayBncm91cHMgaW4gb3VyIHNhbWUgdHlwZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tfZ3JvdXBzW0JUUkZTX05SX1JBSURfVFlQRVNdOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIGdyb3Vwc19zZW07CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IGtvYmplY3QgYmxvY2tfZ3JvdXBfa29ianNbQlRSRlNfTlJfUkFJRF9UWVBFU107CiB9OwogCiAjZGVmaW5lCUJUUkZTX0JMT0NLX1JTVl9HTE9CQUwJCTEKQEAgLTEzNDYsNiArMTM2MSw3IEBACiAKIAl1NjQgZ2VuZXJhdGlvbjsKIAl1NjQgbGFzdF90cmFuc19jb21taXR0ZWQ7CisJdTY0IGF2Z19kZWxheWVkX3JlZl9ydW50aW1lOwogCiAJLyoKIAkgKiB0aGlzIGlzIHVwZGF0ZWQgdG8gdGhlIGN1cnJlbnQgdHJhbnMgZXZlcnkgdGltZSBhIGZ1bGwgY29tbWl0CkBAIC0xNDQ4LDcgKzE0NjQsNiBAQAogCXNwaW5sb2NrX3QgdHJlZV9tb2Rfc2VxX2xvY2s7CiAJYXRvbWljNjRfdCB0cmVlX21vZF9zZXE7CiAJc3RydWN0IGxpc3RfaGVhZCB0cmVlX21vZF9zZXFfbGlzdDsKLQlzdHJ1Y3Qgc2VxX2xpc3QgdHJlZV9tb2Rfc2VxX2VsZW07CiAKIAkvKiB0aGlzIHByb3RlY3RzIHRyZWVfbW9kX2xvZyAqLwogCXJ3bG9ja190IHRyZWVfbW9kX2xvZ19sb2NrOwpAQCAtMTUxNSw2ICsxNTMwLDggQEAKIAlpbnQgdGhyZWFkX3Bvb2xfc2l6ZTsKIAogCXN0cnVjdCBrb2JqZWN0IHN1cGVyX2tvYmo7CisJc3RydWN0IGtvYmplY3QgKnNwYWNlX2luZm9fa29iajsKKwlzdHJ1Y3Qga29iamVjdCAqZGV2aWNlX2Rpcl9rb2JqOwogCXN0cnVjdCBjb21wbGV0aW9uIGtvYmpfdW5yZWdpc3RlcjsKIAlpbnQgZG9fYmFycmllcnM7CiAJaW50IGNsb3Npbmc7CkBAIC0xNjQzLDYgKzE2NjAsMTAgQEAKIAlzcGlubG9ja190IHJlYWRhX2xvY2s7CiAJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCByZWFkYV90cmVlOwogCisJLyogRXh0ZW50IGJ1ZmZlciByYWRpeCB0cmVlICovCisJc3BpbmxvY2tfdCBidWZmZXJfbG9jazsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IGJ1ZmZlcl9yYWRpeDsKKwogCS8qIG5leHQgYmFja3VwIHJvb3QgdG8gYmUgb3ZlcndyaXR0ZW4gKi8KIAlpbnQgYmFja3VwX3Jvb3RfaW5kZXg7CiAKQEAgLTE3OTUsNiArMTgxNiwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgb3JkZXJlZF9leHRlbnRzOwogCXN0cnVjdCBsaXN0X2hlYWQgb3JkZXJlZF9yb290OwogCXU2NCBucl9vcmRlcmVkX2V4dGVudHM7CisKKwkvKgorCSAqIE51bWJlciBvZiBjdXJyZW50bHkgcnVubmluZyBTRU5EIGlvY3RscyB0byBwcmV2ZW50CisJICogbWFuaXB1bGF0aW9uIHdpdGggdGhlIHJlYWQtb25seSBzdGF0dXMgdmlhIFNVQlZPTF9TRVRGTEFHUworCSAqLworCWludCBzZW5kX2luX3Byb2dyZXNzOwogfTsKIAogc3RydWN0IGJ0cmZzX2lvY3RsX2RlZnJhZ19yYW5nZV9hcmdzIHsKQEAgLTE5OTcsNiArMjAyNCw3IEBACiAjZGVmaW5lIEJUUkZTX01PVU5UX0NIRUNLX0lOVEVHUklUWV9JTkNMVURJTkdfRVhURU5UX0RBVEEgKDEgPDwgMjEpCiAjZGVmaW5lIEJUUkZTX01PVU5UX1BBTklDX09OX0ZBVEFMX0VSUk9SCSgxIDw8IDIyKQogI2RlZmluZSBCVFJGU19NT1VOVF9SRVNDQU5fVVVJRF9UUkVFCSgxIDw8IDIzKQorI2RlZmluZQlCVFJGU19NT1VOVF9DSEFOR0VfSU5PREVfQ0FDSEUJKDEgPDwgMjQpCiAKICNkZWZpbmUgQlRSRlNfREVGQVVMVF9DT01NSVRfSU5URVJWQUwJKDMwKQogCkBAIC0yOTI1LDYgKzI5NTMsMTAgQEAKIAkJCSBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwgZ2VuZXJhdGlvbiwgNjQpOwogQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2ZpbGVfZXh0ZW50X251bV9ieXRlcywKIAkJCSBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwgbnVtX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMsCisJCQkgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGRpc2tfbnVtX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfZmlsZV9leHRlbnRfY29tcHJlc3Npb24sCisJCQkgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGNvbXByZXNzaW9uLCA4KTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfc3RhcnQoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmUpCkBAIC0yOTU4LDE1ICsyOTkwLDYgQEAKIEJUUkZTX1NFVEdFVF9GVU5DUyhmaWxlX2V4dGVudF9vdGhlcl9lbmNvZGluZywgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sCiAJCSAgIG90aGVyX2VuY29kaW5nLCAxNik7CiAKLS8qIHRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGlubGluZSBpdGVtLgotICogSWYgYW4gaXRlbSBpcyBjb21wcmVzc2VkLCB0aGlzIGlzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQotICovCi1zdGF0aWMgaW5saW5lIHUzMiBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKLQkJCQkJICAgICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICplKQotewotCXJldHVybiBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMoZWIsIGUpOwotfQotCiAvKgogICogdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgaXRlbSBvbiBkaXNrLCBtaW51cyB0aGUKICAqIHNpemUgb2YgYW55IGV4dGVudCBoZWFkZXJzLiAgSWYgYSBmaWxlIGlzIGNvbXByZXNzZWQgb24gZGlzaywgdGhpcyBpcwpAQCAtMjk4MCw2ICszMDAzLDMyIEBACiAJcmV0dXJuIGJ0cmZzX2l0ZW1fc2l6ZShlYiwgZSkgLSBvZmZzZXQ7CiB9CiAKKy8qIHRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGlubGluZSBpdGVtLgorICogSWYgYW4gaXRlbSBpcyBjb21wcmVzc2VkLCB0aGlzIGlzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQorICovCitzdGF0aWMgaW5saW5lIHUzMiBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkJICAgICAgIGludCBzbG90LAorCQkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmZpKQoreworCXN0cnVjdCBidHJmc19tYXBfdG9rZW4gdG9rZW47CisKKwlidHJmc19pbml0X21hcF90b2tlbigmdG9rZW4pOworCS8qCisJICogcmV0dXJuIHRoZSBzcGFjZSB1c2VkIG9uIGRpc2sgaWYgdGhpcyBpdGVtIGlzbid0CisJICogY29tcHJlc3NlZCBvciBlbmNvZGVkCisJICovCisJaWYgKGJ0cmZzX3Rva2VuX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGViLCBmaSwgJnRva2VuKSA9PSAwICYmCisJICAgIGJ0cmZzX3Rva2VuX2ZpbGVfZXh0ZW50X2VuY3J5cHRpb24oZWIsIGZpLCAmdG9rZW4pID09IDAgJiYKKwkgICAgYnRyZnNfdG9rZW5fZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcoZWIsIGZpLCAmdG9rZW4pID09IDApIHsKKwkJcmV0dXJuIGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9pdGVtX2xlbihlYiwKKwkJCQkJCQkgYnRyZnNfaXRlbV9ucihzbG90KSk7CisJfQorCisJLyogb3RoZXJ3aXNlIHVzZSB0aGUgcmFtIGJ5dGVzIGZpZWxkICovCisJcmV0dXJuIGJ0cmZzX3Rva2VuX2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhlYiwgZmksICZ0b2tlbik7Cit9CisKKwogLyogYnRyZnNfZGV2X3N0YXRzX2l0ZW0gKi8KIHN0YXRpYyBpbmxpbmUgdTY0IGJ0cmZzX2Rldl9zdGF0c192YWx1ZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCiAJCQkJCXN0cnVjdCBidHJmc19kZXZfc3RhdHNfaXRlbSAqcHRyLApAQCAtMzE0Myw2ICszMTkyLDggQEAKIAogaW50IGJ0cmZzX3Nob3VsZF90aHJvdHRsZV9kZWxheWVkX3JlZnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19jaGVja19zcGFjZV9mb3JfZGVsYXllZF9yZWZzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiB2b2lkIGJ0cmZzX3B1dF9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKTsKIGludCBidHJmc19ydW5fZGVsYXllZF9yZWZzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOwpAQCAtMzE2Myw2ICszMjE0LDcgQEAKIAkJCQkJCSBzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywKIAkJCQkJCSB1NjQgYnl0ZW5yKTsKIHZvaWQgYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpOworaW50IGdldF9ibG9ja19ncm91cF9pbmRleChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKTsKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19hbGxvY19mcmVlX2Jsb2NrKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTMyIGJsb2Nrc2l6ZSwKIAkJCQkJdTY0IHBhcmVudCwgdTY0IHJvb3Rfb2JqZWN0aWQsCkBAIC0zMzAxLDYgKzMzNTMsOCBAQAogaW50IGJ0cmZzX3ByZXZpb3VzX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG1pbl9vYmplY3RpZCwKIAkJCWludCB0eXBlKTsKK2ludCBidHJmc19wcmV2aW91c19leHRlbnRfaXRlbShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgbWluX29iamVjdGlkKTsKIHZvaWQgYnRyZnNfc2V0X2l0ZW1fa2V5X3NhZmUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpuZXdfa2V5KTsKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwpAQCAtMzM1MCw2ICszNDA0LDggQEAKIAkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKIAkJCSBzdHJ1Y3QgYnRyZnNfa2V5ICpuZXdfa2V5KTsKK2ludCBidHJmc19maW5kX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQl1NjQgaW51bSwgdTY0IGlvZmYsIHU4IGtleV90eXBlLCBzdHJ1Y3QgYnRyZnNfa2V5ICpmb3VuZF9rZXkpOwogaW50IGJ0cmZzX3NlYXJjaF9zbG90KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAogCQkgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX2tleSAqa2V5LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcCwgaW50CiAJCSAgICAgIGluc19sZW4sIGludCBjb3cpOwpAQCAtMzM5OSw2ICszNDU1LDcgQEAKIH0KIAogaW50IGJ0cmZzX25leHRfbGVhZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOworaW50IGJ0cmZzX3ByZXZfbGVhZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOwogaW50IGJ0cmZzX25leHRfb2xkX2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkJdTY0IHRpbWVfc2VxKTsKIHN0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX25leHRfb2xkX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC0zNTYzLDEyICszNjIwLDYgQEAKIAkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAogCQkJICAgdTY0IGlub2RlX29iamVjdGlkLCB1NjQgcmVmX29iamVjdGlkLCB1NjQgKmluZGV4KTsKLWludCBidHJmc19nZXRfaW5vZGVfcmVmX2luZGV4KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkgICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKLQkJCSAgICAgIHU2NCBpbm9kZV9vYmplY3RpZCwgdTY0IHJlZl9vYmplY3RpZCwgaW50IG1vZCwKLQkJCSAgICAgIHU2NCAqcmV0X2luZGV4KTsKIGludCBidHJmc19pbnNlcnRfZW1wdHlfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9iamVjdGlkKTsKQEAgLTM2NzYsNyArMzcyNyw5IEBACiBpbnQgYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlKTsKIGludCBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwgdTY0IG5ld19kaXJpZCk7CisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnBhcmVudF9yb290LAorCQkJICAgICB1NjQgbmV3X2RpcmlkKTsKIGludCBidHJmc19tZXJnZV9iaW9faG9vayhpbnQgcncsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCSBzaXplX3Qgc2l6ZSwgc3RydWN0IGJpbyAqYmlvLAogCQkJIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKQEAgLTM3NDUsNyArMzc5OCwxMCBAQAogaW50IF9fYnRyZnNfZHJvcF9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgdTY0ICpkcm9wX2VuZCwgaW50IGRyb3BfY2FjaGUpOworCQkJIHU2NCAqZHJvcF9lbmQsIGludCBkcm9wX2NhY2hlLAorCQkJIGludCByZXBsYWNlX2V4dGVudCwKKwkJCSB1MzIgZXh0ZW50X2l0ZW1fc2l6ZSwKKwkJCSBpbnQgKmtleV9pbnNlcnRlZCk7CiBpbnQgYnRyZnNfZHJvcF9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwKIAkJICAgICAgIHU2NCBlbmQsIGludCBkcm9wX2NhY2hlKTsKQEAgLTM3NjQsNiArMzgyMCw4IEBACiAvKiBzeXNmcy5jICovCiBpbnQgYnRyZnNfaW5pdF9zeXNmcyh2b2lkKTsKIHZvaWQgYnRyZnNfZXhpdF9zeXNmcyh2b2lkKTsKK2ludCBidHJmc19zeXNmc19hZGRfb25lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKK3ZvaWQgYnRyZnNfc3lzZnNfcmVtb3ZlX29uZShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CiAKIC8qIHhhdHRyLmMgKi8KIHNzaXplX3QgYnRyZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CkBAIC0zNzk2LDE0ICszODU0LDIwIEBACiAJYnRyZnNfcHJpbnRrKGZzX2luZm8sIEtFUk5fTk9USUNFIGZtdCwgIyNhcmdzKQogI2RlZmluZSBidHJmc19pbmZvKGZzX2luZm8sIGZtdCwgYXJncy4uLikgXAogCWJ0cmZzX3ByaW50ayhmc19pbmZvLCBLRVJOX0lORk8gZm10LCAjI2FyZ3MpCisKKyNpZmRlZiBERUJVRwogI2RlZmluZSBidHJmc19kZWJ1Zyhmc19pbmZvLCBmbXQsIGFyZ3MuLi4pIFwKIAlidHJmc19wcmludGsoZnNfaW5mbywgS0VSTl9ERUJVRyBmbXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGJ0cmZzX2RlYnVnKGZzX2luZm8sIGZtdCwgYXJncy4uLikgXAorICAgIG5vX3ByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNhcmdzKQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQlRSRlNfQVNTRVJUCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc3NmYWlsKGNoYXIgKmV4cHIsIGNoYXIgKmZpbGUsIGludCBsaW5lKQogewotCXByaW50ayhLRVJOX0VSUiAiQlRSRlMgYXNzZXJ0aW9uIGZhaWxlZDogJXMsIGZpbGU6ICVzLCBsaW5lOiAlZCIsCisJcHJfZXJyKCJCVFJGUzogYXNzZXJ0aW9uIGZhaWxlZDogJXMsIGZpbGU6ICVzLCBsaW5lOiAlZCIsCiAJICAgICAgIGV4cHIsIGZpbGUsIGxpbmUpOwogCUJVRygpOwogfQpAQCAtMzg0MSw3ICszOTA1LDcgQEAKIAkJaWYgKCEoZmVhdHVyZXMgJiBmbGFnKSkgewogCQkJZmVhdHVyZXMgfD0gZmxhZzsKIAkJCWJ0cmZzX3NldF9zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyLCBmZWF0dXJlcyk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogc2V0dGluZyAlbGx1IGZlYXR1cmUgZmxhZ1xuIiwKKwkJCWJ0cmZzX2luZm8oZnNfaW5mbywgInNldHRpbmcgJWxsdSBmZWF0dXJlIGZsYWciLAogCQkJCQkgZmxhZyk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnN1cGVyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCmluZGV4IDhkMjkyZmIuLjQ1MWIwMGMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYworKysgYi9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKQEAgLTU1LDggKzU1LDcgQEAKIAlkZWxheWVkX25vZGUtPmlub2RlX2lkID0gaW5vZGVfaWQ7CiAJYXRvbWljX3NldCgmZGVsYXllZF9ub2RlLT5yZWZzLCAwKTsKIAlkZWxheWVkX25vZGUtPmNvdW50ID0gMDsKLQlkZWxheWVkX25vZGUtPmluX2xpc3QgPSAwOwotCWRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkgPSAwOworCWRlbGF5ZWRfbm9kZS0+ZmxhZ3MgPSAwOwogCWRlbGF5ZWRfbm9kZS0+aW5zX3Jvb3QgPSBSQl9ST09UOwogCWRlbGF5ZWRfbm9kZS0+ZGVsX3Jvb3QgPSBSQl9ST09UOwogCW11dGV4X2luaXQoJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOwpAQCAtMTcyLDcgKzE3MSw3IEBACiAJCQkJICAgICBpbnQgbW9kKQogewogCXNwaW5fbG9jaygmcm9vdC0+bG9jayk7Ci0JaWYgKG5vZGUtPmluX2xpc3QpIHsKKwlpZiAodGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOX0xJU1QsICZub2RlLT5mbGFncykpIHsKIAkJaWYgKCFsaXN0X2VtcHR5KCZub2RlLT5wX2xpc3QpKQogCQkJbGlzdF9tb3ZlX3RhaWwoJm5vZGUtPnBfbGlzdCwgJnJvb3QtPnByZXBhcmVfbGlzdCk7CiAJCWVsc2UgaWYgKG1vZCkKQEAgLTE4Miw3ICsxODEsNyBAQAogCQlsaXN0X2FkZF90YWlsKCZub2RlLT5wX2xpc3QsICZyb290LT5wcmVwYXJlX2xpc3QpOwogCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogaW5zZXJ0ZWQgaW50byBsaXN0ICovCiAJCXJvb3QtPm5vZGVzKys7Ci0JCW5vZGUtPmluX2xpc3QgPSAxOworCQlzZXRfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9JTl9MSVNULCAmbm9kZS0+ZmxhZ3MpOwogCX0KIAlzcGluX3VubG9jaygmcm9vdC0+bG9jayk7CiB9CkBAIC0xOTIsMTMgKzE5MSwxMyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpub2RlKQogewogCXNwaW5fbG9jaygmcm9vdC0+bG9jayk7Ci0JaWYgKG5vZGUtPmluX2xpc3QpIHsKKwlpZiAodGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOX0xJU1QsICZub2RlLT5mbGFncykpIHsKIAkJcm9vdC0+bm9kZXMtLTsKIAkJYXRvbWljX2RlYygmbm9kZS0+cmVmcyk7CS8qIG5vdCBpbiB0aGUgbGlzdCAqLwogCQlsaXN0X2RlbF9pbml0KCZub2RlLT5uX2xpc3QpOwogCQlpZiAoIWxpc3RfZW1wdHkoJm5vZGUtPnBfbGlzdCkpCiAJCQlsaXN0X2RlbF9pbml0KCZub2RlLT5wX2xpc3QpOwotCQlub2RlLT5pbl9saXN0ID0gMDsKKwkJY2xlYXJfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9JTl9MSVNULCAmbm9kZS0+ZmxhZ3MpOwogCX0KIAlzcGluX3VubG9jaygmcm9vdC0+bG9jayk7CiB9CkBAIC0yMzEsNyArMjMwLDggQEAKIAogCWRlbGF5ZWRfcm9vdCA9IG5vZGUtPnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfcm9vdDsKIAlzcGluX2xvY2soJmRlbGF5ZWRfcm9vdC0+bG9jayk7Ci0JaWYgKCFub2RlLT5pbl9saXN0KSB7CS8qIG5vdCBpbiB0aGUgbGlzdCAqLworCWlmICghdGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOX0xJU1QsICZub2RlLT5mbGFncykpIHsKKwkJLyogbm90IGluIHRoZSBsaXN0ICovCiAJCWlmIChsaXN0X2VtcHR5KCZkZWxheWVkX3Jvb3QtPm5vZGVfbGlzdCkpCiAJCQlnb3RvIG91dDsKIAkJcCA9IGRlbGF5ZWRfcm9vdC0+bm9kZV9saXN0Lm5leHQ7CkBAIC0xMDA0LDkgKzEwMDQsMTAgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CiAKLQlpZiAoZGVsYXllZF9ub2RlICYmIGRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkpIHsKKwlpZiAoZGVsYXllZF9ub2RlICYmCisJICAgIHRlc3RfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9JTk9ERV9ESVJUWSwgJmRlbGF5ZWRfbm9kZS0+ZmxhZ3MpKSB7CiAJCUJVR19PTighZGVsYXllZF9ub2RlLT5yb290KTsKLQkJZGVsYXllZF9ub2RlLT5pbm9kZV9kaXJ0eSA9IDA7CisJCWNsZWFyX2JpdChCVFJGU19ERUxBWUVEX05PREVfSU5PREVfRElSVFksICZkZWxheWVkX25vZGUtPmZsYWdzKTsKIAkJZGVsYXllZF9ub2RlLT5jb3VudC0tOwogCiAJCWRlbGF5ZWRfcm9vdCA9IGRlbGF5ZWRfbm9kZS0+cm9vdC0+ZnNfaW5mby0+ZGVsYXllZF9yb290OwpAQCAtMTAxNCw2ICsxMDE1LDE4IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBidHJmc19yZWxlYXNlX2RlbGF5ZWRfaXJlZihzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGUpCit7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcm9vdCAqZGVsYXllZF9yb290OworCisJQVNTRVJUKGRlbGF5ZWRfbm9kZS0+cm9vdCk7CisJY2xlYXJfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9ERUxfSVJFRiwgJmRlbGF5ZWRfbm9kZS0+ZmxhZ3MpOworCWRlbGF5ZWRfbm9kZS0+Y291bnQtLTsKKworCWRlbGF5ZWRfcm9vdCA9IGRlbGF5ZWRfbm9kZS0+cm9vdC0+ZnNfaW5mby0+ZGVsYXllZF9yb290OworCWZpbmlzaF9vbmVfaXRlbShkZWxheWVkX3Jvb3QpOworfQorCiBzdGF0aWMgaW50IF9fYnRyZnNfdXBkYXRlX2RlbGF5ZWRfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKQEAgLTEwMjIsMTMgKzEwMzUsMTkgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaW5vZGVfaXRlbTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgbW9kOwogCWludCByZXQ7CiAKIAlrZXkub2JqZWN0aWQgPSBub2RlLT5pbm9kZV9pZDsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOwogCWtleS5vZmZzZXQgPSAwOwogCi0JcmV0ID0gYnRyZnNfbG9va3VwX2lub2RlKHRyYW5zLCByb290LCBwYXRoLCAma2V5LCAxKTsKKwlpZiAodGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0RFTF9JUkVGLCAmbm9kZS0+ZmxhZ3MpKQorCQltb2QgPSAtMTsKKwllbHNlCisJCW1vZCA9IDE7CisKKwlyZXQgPSBidHJmc19sb29rdXBfaW5vZGUodHJhbnMsIHJvb3QsIHBhdGgsICZrZXksIG1vZCk7CiAJaWYgKHJldCA+IDApIHsKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTEwMzYsMTkgKzEwNTUsNTggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlidHJmc191bmxvY2tfdXBfc2FmZShwYXRoLCAxKTsKIAlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CiAJd3JpdGVfZXh0ZW50X2J1ZmZlcihsZWFmLCAmbm9kZS0+aW5vZGVfaXRlbSwgKHVuc2lnbmVkIGxvbmcpaW5vZGVfaXRlbSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pKTsKIAlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKLQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAKKwlpZiAoIXRlc3RfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9ERUxfSVJFRiwgJm5vZGUtPmZsYWdzKSkKKwkJZ290byBub19pcmVmOworCisJcGF0aC0+c2xvdHNbMF0rKzsKKwlpZiAocGF0aC0+c2xvdHNbMF0gPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZikpCisJCWdvdG8gc2VhcmNoOworYWdhaW46CisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwlpZiAoa2V5Lm9iamVjdGlkICE9IG5vZGUtPmlub2RlX2lkKQorCQlnb3RvIG91dDsKKworCWlmIChrZXkudHlwZSAhPSBCVFJGU19JTk9ERV9SRUZfS0VZICYmCisJICAgIGtleS50eXBlICE9IEJUUkZTX0lOT0RFX0VYVFJFRl9LRVkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBEZWxheWVkIGlyZWYgZGVsZXRpb24gaXMgZm9yIHRoZSBpbm9kZSB3aG8gaGFzIG9ubHkgb25lIGxpbmssCisJICogc28gdGhlcmUgaXMgb25seSBvbmUgaXJlZi4gVGhlIGNhc2UgdGhhdCBzZXZlcmFsIGlyZWZzIGFyZQorCSAqIGluIHRoZSBzYW1lIGl0ZW0gZG9lc24ndCBleGlzdC4KKwkgKi8KKwlidHJmc19kZWxfaXRlbSh0cmFucywgcm9vdCwgcGF0aCk7CitvdXQ6CisJYnRyZnNfcmVsZWFzZV9kZWxheWVkX2lyZWYobm9kZSk7Citub19pcmVmOgorCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKK2Vycl9vdXQ6CiAJYnRyZnNfZGVsYXllZF9pbm9kZV9yZWxlYXNlX21ldGFkYXRhKHJvb3QsIG5vZGUpOwogCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9pbm9kZShub2RlKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CisKK3NlYXJjaDoKKwlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfSU5PREVfRVhUUkVGX0tFWSk7CisJa2V5Lm9mZnNldCA9IC0xOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX291dDsKKwlBU1NFUlQocmV0KTsKKworCXJldCA9IDA7CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCXBhdGgtPnNsb3RzWzBdLS07CisJZ290byBhZ2FpbjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYnRyZnNfdXBkYXRlX2RlbGF5ZWRfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0xMDU5LDcgKzExMTcsNyBAQAogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZub2RlLT5tdXRleCk7Ci0JaWYgKCFub2RlLT5pbm9kZV9kaXJ0eSkgeworCWlmICghdGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOT0RFX0RJUlRZLCAmbm9kZS0+ZmxhZ3MpKSB7CiAJCW11dGV4X3VubG9jaygmbm9kZS0+bXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMjAzLDcgKzEyNjEsNyBAQAogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOwotCWlmICghZGVsYXllZF9ub2RlLT5pbm9kZV9kaXJ0eSkgeworCWlmICghdGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOT0RFX0RJUlRZLCAmZGVsYXllZF9ub2RlLT5mbGFncykpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKIAkJYnRyZnNfcmVsZWFzZV9kZWxheWVkX25vZGUoZGVsYXllZF9ub2RlKTsKIAkJcmV0dXJuIDA7CkBAIC0xMjI3LDcgKzEyODUsNyBAQAogCXRyYW5zLT5ibG9ja19yc3YgPSAmZGVsYXllZF9ub2RlLT5yb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCW11dGV4X2xvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOwotCWlmIChkZWxheWVkX25vZGUtPmlub2RlX2RpcnR5KQorCWlmICh0ZXN0X2JpdChCVFJGU19ERUxBWUVEX05PREVfSU5PREVfRElSVFksICZkZWxheWVkX25vZGUtPmZsYWdzKSkKIAkJcmV0ID0gX19idHJmc191cGRhdGVfZGVsYXllZF9pbm9kZSh0cmFucywgZGVsYXllZF9ub2RlLT5yb290LAogCQkJCQkJICAgcGF0aCwgZGVsYXllZF9ub2RlKTsKIAllbHNlCkBAIC0xMzAwLDM2ICsxMzU4LDkgQEAKIAl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfYmxvY2tfcnN2OwogCiAJX19idHJmc19jb21taXRfaW5vZGVfZGVsYXllZF9pdGVtcyh0cmFucywgcGF0aCwgZGVsYXllZF9ub2RlKTsKLQkvKgotCSAqIE1heWJlIG5ldyBkZWxheWVkIGl0ZW1zIGhhdmUgYmVlbiBpbnNlcnRlZCwgc28gd2UgbmVlZCByZXF1ZXVlCi0JICogdGhlIHdvcmsuIEJlc2lkZXMgdGhhdCwgd2UgbXVzdCBkZXF1ZXVlIHRoZSBlbXB0eSBkZWxheWVkIG5vZGVzCi0JICogdG8gYXZvaWQgdGhlIHJhY2UgYmV0d2VlbiBkZWxheWVkIGl0ZW1zIGJhbGFuY2UgYW5kIHRoZSB3b3JrZXIuCi0JICogVGhlIHJhY2UgbGlrZSB0aGlzOgotCSAqIAlUYXNrMQkJCQlXb3JrZXIgdGhyZWFkCi0JICogCQkJCQljb3VudCA9PSAwLCBuZWVkbid0IHJlcXVldWUKLQkgKiAJCQkJCSAgYWxzbyBuZWVkbid0IGluc2VydCB0aGUKLQkgKiAJCQkJCSAgZGVsYXllZCBub2RlIGludG8gcHJlcGFyZQotCSAqIAkJCQkJICBsaXN0IGFnYWluLgotCSAqIAlhZGQgbG90cyBvZiBkZWxheWVkIGl0ZW1zCi0JICogCXF1ZXVlIHRoZSBkZWxheWVkIG5vZGUKLQkgKiAJICBhbHJlYWR5IGluIHRoZSBsaXN0LAotCSAqIAkgIGFuZCBub3QgaW4gdGhlIHByZXBhcmUKLQkgKiAJICBsaXN0LCBpdCBtZWFucyB0aGUgZGVsYXllZAotCSAqIAkgIG5vZGUgaXMgYmVpbmcgZGVhbHQgd2l0aAotCSAqIAkgIGJ5IHRoZSB3b3JrZXIuCi0JICogCWRvIGRlbGF5ZWQgaXRlbXMgYmFsYW5jZQotCSAqIAkgIHRoZSBkZWxheWVkIG5vZGUgaXMgYmVpbmcKLQkgKiAJICBkZWFsdCB3aXRoIGJ5IHRoZSB3b3JrZXIKLQkgKiAJICBub3csIGp1c3Qgd2FpdC4KLQkgKiAJICAJCQkJdGhlIHdvcmtlciBnb3RvIGlkbGUuCi0JICogVGFzazEgd2lsbCBzbGVlcCB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0ZWQuCi0JICovCi0JbXV0ZXhfbG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7Ci0JYnRyZnNfZGVxdWV1ZV9kZWxheWVkX25vZGUocm9vdC0+ZnNfaW5mby0+ZGVsYXllZF9yb290LCBkZWxheWVkX25vZGUpOwotCW11dGV4X3VubG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7CiAKIAl0cmFucy0+YmxvY2tfcnN2ID0gYmxvY2tfcnN2OwotCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl9kbWV0YSh0cmFucywgcm9vdCk7CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5X25vZGVsYXkocm9vdCk7CiAKIHJlbGVhc2VfcGF0aDoKQEAgLTEzNzYsNTIgKzE0MDcsNDEgQEAKIAlXQVJOX09OKGJ0cmZzX2ZpcnN0X2RlbGF5ZWRfbm9kZShkZWxheWVkX3Jvb3QpKTsKIH0KIAotc3RhdGljIGludCByZWZzX25ld2VyKHN0cnVjdCBidHJmc19kZWxheWVkX3Jvb3QgKmRlbGF5ZWRfcm9vdCwKLQkJICAgICAgaW50IHNlcSwgaW50IGNvdW50KQorc3RhdGljIGludCBjb3VsZF9lbmRfd2FpdChzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3QsIGludCBzZXEpCiB7CiAJaW50IHZhbCA9IGF0b21pY19yZWFkKCZkZWxheWVkX3Jvb3QtPml0ZW1zX3NlcSk7CiAKLQlpZiAodmFsIDwgc2VxIHx8IHZhbCA+PSBzZXEgKyBjb3VudCkKKwlpZiAodmFsIDwgc2VxIHx8IHZhbCA+PSBzZXEgKyBCVFJGU19ERUxBWUVEX0JBVENIKQogCQlyZXR1cm4gMTsKKworCWlmIChhdG9taWNfcmVhZCgmZGVsYXllZF9yb290LT5pdGVtcykgPCBCVFJGU19ERUxBWUVEX0JBQ0tHUk9VTkQpCisJCXJldHVybiAxOworCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYnRyZnNfYmFsYW5jZV9kZWxheWVkX2l0ZW1zKHN0cnVjdCBidHJmc19yb290ICpyb290KQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3Jvb3QgKmRlbGF5ZWRfcm9vdDsKLQlpbnQgc2VxOwogCiAJZGVsYXllZF9yb290ID0gYnRyZnNfZ2V0X2RlbGF5ZWRfcm9vdChyb290KTsKIAogCWlmIChhdG9taWNfcmVhZCgmZGVsYXllZF9yb290LT5pdGVtcykgPCBCVFJGU19ERUxBWUVEX0JBQ0tHUk9VTkQpCiAJCXJldHVybjsKIAotCXNlcSA9IGF0b21pY19yZWFkKCZkZWxheWVkX3Jvb3QtPml0ZW1zX3NlcSk7Ci0KIAlpZiAoYXRvbWljX3JlYWQoJmRlbGF5ZWRfcm9vdC0+aXRlbXMpID49IEJUUkZTX0RFTEFZRURfV1JJVEVCQUNLKSB7CisJCWludCBzZXE7CiAJCWludCByZXQ7Ci0JCURFRklORV9XQUlUKF9fd2FpdCk7CisKKwkJc2VxID0gYXRvbWljX3JlYWQoJmRlbGF5ZWRfcm9vdC0+aXRlbXNfc2VxKTsKIAogCQlyZXQgPSBidHJmc193cV9ydW5fZGVsYXllZF9ub2RlKGRlbGF5ZWRfcm9vdCwgcm9vdCwgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm47CiAKLQkJd2hpbGUgKDEpIHsKLQkJCXByZXBhcmVfdG9fd2FpdCgmZGVsYXllZF9yb290LT53YWl0LCAmX193YWl0LAotCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCQlpZiAocmVmc19uZXdlcihkZWxheWVkX3Jvb3QsIHNlcSwKLQkJCQkgICAgICAgQlRSRlNfREVMQVlFRF9CQVRDSCkgfHwKLQkJCSAgICBhdG9taWNfcmVhZCgmZGVsYXllZF9yb290LT5pdGVtcykgPAotCQkJICAgIEJUUkZTX0RFTEFZRURfQkFDS0dST1VORCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlzY2hlZHVsZSgpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCWZpbmlzaF93YWl0KCZkZWxheWVkX3Jvb3QtPndhaXQsICZfX3dhaXQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGVsYXllZF9yb290LT53YWl0LAorCQkJCQkgY291bGRfZW5kX3dhaXQoZGVsYXllZF9yb290LCBzZXEpKTsKKwkJcmV0dXJuOwogCX0KIAogCWJ0cmZzX3dxX3J1bl9kZWxheWVkX25vZGUoZGVsYXllZF9yb290LCByb290LCBCVFJGU19ERUxBWUVEX0JBVENIKTsKQEAgLTE0NzIsOSArMTQ5Miw5IEBACiAJbXV0ZXhfbG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7CiAJcmV0ID0gX19idHJmc19hZGRfZGVsYXllZF9pbnNlcnRpb25faXRlbShkZWxheWVkX25vZGUsIGRlbGF5ZWRfaXRlbSk7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlcnIgYWRkIGRlbGF5ZWQgZGlyIGluZGV4IGl0ZW0obmFtZTogJS4qcykgIgorCQlidHJmc19lcnIocm9vdC0+ZnNfaW5mbywgImVyciBhZGQgZGVsYXllZCBkaXIgaW5kZXggaXRlbShuYW1lOiAlLipzKSAiCiAJCQkJImludG8gdGhlIGluc2VydGlvbiB0cmVlIG9mIHRoZSBkZWxheWVkIG5vZGUiCi0JCQkJIihyb290IGlkOiAlbGx1LCBpbm9kZSBpZDogJWxsdSwgZXJybm86ICVkKVxuIiwKKwkJCQkiKHJvb3QgaWQ6ICVsbHUsIGlub2RlIGlkOiAlbGx1LCBlcnJubzogJWQpIiwKIAkJCQluYW1lX2xlbiwgbmFtZSwgZGVsYXllZF9ub2RlLT5yb290LT5vYmplY3RpZCwKIAkJCQlkZWxheWVkX25vZGUtPmlub2RlX2lkLCByZXQpOwogCQlCVUcoKTsKQEAgLTE1NDQsOSArMTU2NCw5IEBACiAJbXV0ZXhfbG9jaygmbm9kZS0+bXV0ZXgpOwogCXJldCA9IF9fYnRyZnNfYWRkX2RlbGF5ZWRfZGVsZXRpb25faXRlbShub2RlLCBpdGVtKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImVyciBhZGQgZGVsYXllZCBkaXIgaW5kZXggaXRlbShpbmRleDogJWxsdSkgIgorCQlidHJmc19lcnIocm9vdC0+ZnNfaW5mbywgImVyciBhZGQgZGVsYXllZCBkaXIgaW5kZXggaXRlbShpbmRleDogJWxsdSkgIgogCQkJCSJpbnRvIHRoZSBkZWxldGlvbiB0cmVlIG9mIHRoZSBkZWxheWVkIG5vZGUiCi0JCQkJIihyb290IGlkOiAlbGx1LCBpbm9kZSBpZDogJWxsdSwgZXJybm86ICVkKVxuIiwKKwkJCQkiKHJvb3QgaWQ6ICVsbHUsIGlub2RlIGlkOiAlbGx1LCBlcnJubzogJWQpIiwKIAkJCQlpbmRleCwgbm9kZS0+cm9vdC0+b2JqZWN0aWQsIG5vZGUtPmlub2RlX2lkLAogCQkJCXJldCk7CiAJCUJVRygpOwpAQCAtMTc1OSw3ICsxNzc5LDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAltdXRleF9sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKLQlpZiAoIWRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkpIHsKKwlpZiAoIXRlc3RfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9JTk9ERV9ESVJUWSwgJmRlbGF5ZWRfbm9kZS0+ZmxhZ3MpKSB7CiAJCW11dGV4X3VubG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7CiAJCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9ub2RlKGRlbGF5ZWRfbm9kZSk7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTgxMCw3ICsxODMwLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoZGVsYXllZF9ub2RlKTsKIAogCW11dGV4X2xvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOwotCWlmIChkZWxheWVkX25vZGUtPmlub2RlX2RpcnR5KSB7CisJaWYgKHRlc3RfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9JTk9ERV9ESVJUWSwgJmRlbGF5ZWRfbm9kZS0+ZmxhZ3MpKSB7CiAJCWZpbGxfc3RhY2tfaW5vZGVfaXRlbSh0cmFucywgJmRlbGF5ZWRfbm9kZS0+aW5vZGVfaXRlbSwgaW5vZGUpOwogCQlnb3RvIHJlbGVhc2Vfbm9kZTsKIAl9CkBAIC0xODIxLDcgKzE4NDEsNyBAQAogCQlnb3RvIHJlbGVhc2Vfbm9kZTsKIAogCWZpbGxfc3RhY2tfaW5vZGVfaXRlbSh0cmFucywgJmRlbGF5ZWRfbm9kZS0+aW5vZGVfaXRlbSwgaW5vZGUpOwotCWRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkgPSAxOworCXNldF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOT0RFX0RJUlRZLCAmZGVsYXllZF9ub2RlLT5mbGFncyk7CiAJZGVsYXllZF9ub2RlLT5jb3VudCsrOwogCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfcm9vdC0+aXRlbXMpOwogcmVsZWFzZV9ub2RlOgpAQCAtMTgzMCw2ICsxODUwLDQxIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX2RlbGF5ZWRfZGVsZXRlX2lub2RlX3JlZihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZTsKKworCWRlbGF5ZWRfbm9kZSA9IGJ0cmZzX2dldF9vcl9jcmVhdGVfZGVsYXllZF9ub2RlKGlub2RlKTsKKwlpZiAoSVNfRVJSKGRlbGF5ZWRfbm9kZSkpCisJCXJldHVybiBQVFJfRVJSKGRlbGF5ZWRfbm9kZSk7CisKKwkvKgorCSAqIFdlIGRvbid0IHJlc2VydmUgc3BhY2UgZm9yIGlub2RlIHJlZiBkZWxldGlvbiBpcyBiZWNhdXNlOgorCSAqIC0gV2UgT05MWSBkbyBhc3luYyBpbm9kZSByZWYgZGVsZXRpb24gZm9yIHRoZSBpbm9kZSB3aG8gaGFzIG9ubHkKKwkgKiAgIG9uZSBsaW5rKGlfbmxpbmsgPT0gMSksIGl0IG1lYW5zIHRoZXJlIGlzIG9ubHkgb25lIGlub2RlIHJlZi4KKwkgKiAgIEFuZCBpbiBtb3N0IGNhc2UsIHRoZSBpbm9kZSByZWYgYW5kIHRoZSBpbm9kZSBpdGVtIGFyZSBpbiB0aGUKKwkgKiAgIHNhbWUgbGVhZiwgYW5kIHdlIHdpbGwgZGVhbCB3aXRoIHRoZW0gYXQgdGhlIHNhbWUgdGltZS4KKwkgKiAgIFNpbmNlIHdlIGFyZSBzdXJlIHdlIHdpbGwgcmVzZXJ2ZSB0aGUgc3BhY2UgZm9yIHRoZSBpbm9kZSBpdGVtLAorCSAqICAgaXQgaXMgdW5uZWNlc3NhcnkgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgaW5vZGUgcmVmIGRlbGV0aW9uLgorCSAqIC0gSWYgdGhlIGlub2RlIHJlZiBhbmQgdGhlIGlub2RlIGl0ZW0gYXJlIG5vdCBpbiB0aGUgc2FtZSBsZWFmLAorCSAqICAgV2UgYWxzbyBuZWVkbid0IHdvcnJ5IGFib3V0IGVub3NwYyBwcm9ibGVtLCBiZWNhdXNlIHdlIHJlc2VydmUKKwkgKiAgIG11Y2ggbW9yZSBzcGFjZSBmb3IgdGhlIGlub2RlIHVwZGF0ZSB0aGFuIGl0IG5lZWRzLgorCSAqIC0gQXQgdGhlIHdvcnN0LCB3ZSBjYW4gc3RlYWwgc29tZSBzcGFjZSBmcm9tIHRoZSBnbG9iYWwgcmVzZXJ2YXRpb24uCisJICogICBJdCBpcyB2ZXJ5IHJhcmUuCisJICovCisJbXV0ZXhfbG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7CisJaWYgKHRlc3RfYml0KEJUUkZTX0RFTEFZRURfTk9ERV9ERUxfSVJFRiwgJmRlbGF5ZWRfbm9kZS0+ZmxhZ3MpKQorCQlnb3RvIHJlbGVhc2Vfbm9kZTsKKworCXNldF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0RFTF9JUkVGLCAmZGVsYXllZF9ub2RlLT5mbGFncyk7CisJZGVsYXllZF9ub2RlLT5jb3VudCsrOworCWF0b21pY19pbmMoJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5kZWxheWVkX3Jvb3QtPml0ZW1zKTsKK3JlbGVhc2Vfbm9kZToKKwltdXRleF91bmxvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOworCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9ub2RlKGRlbGF5ZWRfbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIF9fYnRyZnNfa2lsbF9kZWxheWVkX25vZGUoc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gZGVsYXllZF9ub2RlLT5yb290OwpAQCAtMTg1Miw3ICsxOTA3LDEwIEBACiAJCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9pdGVtKHByZXZfaXRlbSk7CiAJfQogCi0JaWYgKGRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkpIHsKKwlpZiAodGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0RFTF9JUkVGLCAmZGVsYXllZF9ub2RlLT5mbGFncykpCisJCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9pcmVmKGRlbGF5ZWRfbm9kZSk7CisKKwlpZiAodGVzdF9iaXQoQlRSRlNfREVMQVlFRF9OT0RFX0lOT0RFX0RJUlRZLCAmZGVsYXllZF9ub2RlLT5mbGFncykpIHsKIAkJYnRyZnNfZGVsYXllZF9pbm9kZV9yZWxlYXNlX21ldGFkYXRhKHJvb3QsIGRlbGF5ZWRfbm9kZSk7CiAJCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9pbm9kZShkZWxheWVkX25vZGUpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaCBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaAppbmRleCBhNGIzOGY5Li5mNzAxMTlmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmgKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5oCkBAIC00OCw2ICs0OCwxMCBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiB9OwogCisjZGVmaW5lIEJUUkZTX0RFTEFZRURfTk9ERV9JTl9MSVNUCTAKKyNkZWZpbmUgQlRSRlNfREVMQVlFRF9OT0RFX0lOT0RFX0RJUlRZCTEKKyNkZWZpbmUgQlRSRlNfREVMQVlFRF9OT0RFX0RFTF9JUkVGCTIKKwogc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSB7CiAJdTY0IGlub2RlX2lkOwogCXU2NCBieXRlc19yZXNlcnZlZDsKQEAgLTY1LDggKzY5LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSBpbm9kZV9pdGVtOwogCWF0b21pY190IHJlZnM7CiAJdTY0IGluZGV4X2NudDsKLQlib29sIGluX2xpc3Q7Ci0JYm9vbCBpbm9kZV9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjb3VudDsKIH07CiAKQEAgLTEyNSw2ICsxMjgsNyBAQAogaW50IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqcmRldik7CitpbnQgYnRyZnNfZGVsYXllZF9kZWxldGVfaW5vZGVfcmVmKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAvKiBVc2VkIGZvciBkcm9wIGRlYWQgcm9vdCAqLwogdm9pZCBidHJmc19raWxsX2FsbF9kZWxheWVkX25vZGVzKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmMgYi9mcy9idHJmcy9kZWxheWVkLXJlZi5jCmluZGV4IGU0ZDQ2N2IuLmYzYmZmODkgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmMKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1yZWYuYwpAQCAtMTYxLDM1ICsxNjEsNjEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyogaW5zZXJ0IGEgbmV3IHJlZiB0byBoZWFkIHJlZiByYnRyZWUgKi8KK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqaHRyZWVfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqZW50cnk7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmluczsKKwl1NjQgYnl0ZW5yOworCisJaW5zID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQsIGhyZWZfbm9kZSk7CisJYnl0ZW5yID0gaW5zLT5ub2RlLmJ5dGVucjsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50X25vZGUgPSAqcDsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnRfbm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQsCisJCQkJIGhyZWZfbm9kZSk7CisKKwkJaWYgKGJ5dGVuciA8IGVudHJ5LT5ub2RlLmJ5dGVucikKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoYnl0ZW5yID4gZW50cnktPm5vZGUuYnl0ZW5yKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnRfbm9kZSwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworCXJldHVybiBOVUxMOworfQorCiAvKgogICogZmluZCBhbiBoZWFkIGVudHJ5IGJhc2VkIG9uIGJ5dGVuci4gVGhpcyByZXR1cm5zIHRoZSBkZWxheWVkIHJlZgogICogaGVhZCBpZiBpdCB3YXMgYWJsZSB0byBmaW5kIG9uZSwgb3IgTlVMTCBpZiBub3RoaW5nIHdhcyBpbiB0aGF0IHNwb3QuCiAgKiBJZiByZXR1cm5fYmlnZ2VyIGlzIGdpdmVuLCB0aGUgbmV4dCBiaWdnZXIgZW50cnkgaXMgcmV0dXJuZWQgaWYgbm8gZXhhY3QKICAqIG1hdGNoIGlzIGZvdW5kLgogICovCi1zdGF0aWMgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKmZpbmRfcmVmX2hlYWQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCi0JCQkJICB1NjQgYnl0ZW5yLAotCQkJCSAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKipsYXN0LAotCQkJCSAgaW50IHJldHVybl9iaWdnZXIpCitzdGF0aWMgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKgorZmluZF9yZWZfaGVhZChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKKwkgICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqKmxhc3QsIGludCByZXR1cm5fYmlnZ2VyKQogewogCXN0cnVjdCByYl9ub2RlICpuOwotCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqZW50cnk7CiAJaW50IGNtcCA9IDA7CiAKIGFnYWluOgogCW4gPSByb290LT5yYl9ub2RlOwogCWVudHJ5ID0gTlVMTDsKIAl3aGlsZSAobikgewotCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlLCByYl9ub2RlKTsKLQkJV0FSTl9PTighZW50cnktPmluX3RyZWUpOworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkLCBocmVmX25vZGUpOwogCQlpZiAobGFzdCkKIAkJCSpsYXN0ID0gZW50cnk7CiAKLQkJaWYgKGJ5dGVuciA8IGVudHJ5LT5ieXRlbnIpCisJCWlmIChieXRlbnIgPCBlbnRyeS0+bm9kZS5ieXRlbnIpCiAJCQljbXAgPSAtMTsKLQkJZWxzZSBpZiAoYnl0ZW5yID4gZW50cnktPmJ5dGVucikKLQkJCWNtcCA9IDE7Ci0JCWVsc2UgaWYgKCFidHJmc19kZWxheWVkX3JlZl9pc19oZWFkKGVudHJ5KSkKKwkJZWxzZSBpZiAoYnl0ZW5yID4gZW50cnktPm5vZGUuYnl0ZW5yKQogCQkJY21wID0gMTsKIAkJZWxzZQogCQkJY21wID0gMDsKQEAgLTIwMywxMiArMjI5LDEyIEBACiAJfQogCWlmIChlbnRyeSAmJiByZXR1cm5fYmlnZ2VyKSB7CiAJCWlmIChjbXAgPiAwKSB7Ci0JCQluID0gcmJfbmV4dCgmZW50cnktPnJiX25vZGUpOworCQkJbiA9IHJiX25leHQoJmVudHJ5LT5ocmVmX25vZGUpOwogCQkJaWYgKCFuKQogCQkJCW4gPSByYl9maXJzdChyb290KTsKLQkJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsCi0JCQkJCSByYl9ub2RlKTsKLQkJCWJ5dGVuciA9IGVudHJ5LT5ieXRlbnI7CisJCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkLAorCQkJCQkgaHJlZl9ub2RlKTsKKwkJCWJ5dGVuciA9IGVudHJ5LT5ub2RlLmJ5dGVucjsKIAkJCXJldHVybl9iaWdnZXIgPSAwOwogCQkJZ290byBhZ2FpbjsKIAkJfQpAQCAtMjQzLDMzICsyNjksMzggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRyb3BfZGVsYXllZF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqcmVmKQogewotCXJiX2VyYXNlKCZyZWYtPnJiX25vZGUsICZkZWxheWVkX3JlZnMtPnJvb3QpOworCWlmIChidHJmc19kZWxheWVkX3JlZl9pc19oZWFkKHJlZikpIHsKKwkJaGVhZCA9IGJ0cmZzX2RlbGF5ZWRfbm9kZV90b19oZWFkKHJlZik7CisJCXJiX2VyYXNlKCZoZWFkLT5ocmVmX25vZGUsICZkZWxheWVkX3JlZnMtPmhyZWZfcm9vdCk7CisJfSBlbHNlIHsKKwkJYXNzZXJ0X3NwaW5fbG9ja2VkKCZoZWFkLT5sb2NrKTsKKwkJcmJfZXJhc2UoJnJlZi0+cmJfbm9kZSwgJmhlYWQtPnJlZl9yb290KTsKKwl9CiAJcmVmLT5pbl90cmVlID0gMDsKIAlidHJmc19wdXRfZGVsYXllZF9yZWYocmVmKTsKLQlkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzLS07CisJYXRvbWljX2RlYygmZGVsYXllZF9yZWZzLT5udW1fZW50cmllcyk7CiAJaWYgKHRyYW5zLT5kZWxheWVkX3JlZl91cGRhdGVzKQogCQl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcy0tOwogfQogCiBzdGF0aWMgaW50IG1lcmdlX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzLAorCQkgICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkLAogCQkgICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWYsIHU2NCBzZXEpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0JaW50IG1lcmdlZCA9IDA7CiAJaW50IG1vZCA9IDA7CiAJaW50IGRvbmUgPSAwOwogCi0Jbm9kZSA9IHJiX3ByZXYoJnJlZi0+cmJfbm9kZSk7Ci0Jd2hpbGUgKG5vZGUpIHsKKwlub2RlID0gcmJfbmV4dCgmcmVmLT5yYl9ub2RlKTsKKwl3aGlsZSAoIWRvbmUgJiYgbm9kZSkgewogCQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqbmV4dDsKIAogCQluZXh0ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsIHJiX25vZGUpOwotCQlub2RlID0gcmJfcHJldihub2RlKTsKLQkJaWYgKG5leHQtPmJ5dGVuciAhPSByZWYtPmJ5dGVucikKLQkJCWJyZWFrOworCQlub2RlID0gcmJfbmV4dChub2RlKTsKIAkJaWYgKHNlcSAmJiBuZXh0LT5zZXEgPj0gc2VxKQogCQkJYnJlYWs7CiAJCWlmIChjb21wX2VudHJ5KHJlZiwgbmV4dCwgMCkpCkBAIC0yODksMTIgKzMyMCwxMSBAQAogCQkJbW9kID0gLW5leHQtPnJlZl9tb2Q7CiAJCX0KIAotCQltZXJnZWQrKzsKLQkJZHJvcF9kZWxheWVkX3JlZih0cmFucywgZGVsYXllZF9yZWZzLCBuZXh0KTsKKwkJZHJvcF9kZWxheWVkX3JlZih0cmFucywgZGVsYXllZF9yZWZzLCBoZWFkLCBuZXh0KTsKIAkJcmVmLT5yZWZfbW9kICs9IG1vZDsKIAkJaWYgKHJlZi0+cmVmX21vZCA9PSAwKSB7Ci0JCQlkcm9wX2RlbGF5ZWRfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIHJlZik7Ci0JCQlicmVhazsKKwkJCWRyb3BfZGVsYXllZF9yZWYodHJhbnMsIGRlbGF5ZWRfcmVmcywgaGVhZCwgcmVmKTsKKwkJCWRvbmUgPSAxOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFlvdSBjYW4ndCBoYXZlIG11bHRpcGxlcyBvZiB0aGUgc2FtZSByZWYgb24gYSB0cmVlCkBAIC0zMDMsMTMgKzMzMyw4IEBACiAJCQlXQVJOX09OKHJlZi0+dHlwZSA9PSBCVFJGU19UUkVFX0JMT0NLX1JFRl9LRVkgfHwKIAkJCQlyZWYtPnR5cGUgPT0gQlRSRlNfU0hBUkVEX0JMT0NLX1JFRl9LRVkpOwogCQl9Ci0KLQkJaWYgKGRvbmUpCi0JCQlicmVhazsKLQkJbm9kZSA9IHJiX3ByZXYoJnJlZi0+cmJfbm9kZSk7CiAJfQotCi0JcmV0dXJuIG1lcmdlZDsKKwlyZXR1cm4gZG9uZTsKIH0KIAogdm9pZCBidHJmc19tZXJnZV9kZWxheWVkX3JlZnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0zMjAsNiArMzQ1LDE0IEBACiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAJdTY0IHNlcSA9IDA7CiAKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmhlYWQtPmxvY2spOworCS8qCisJICogV2UgZG9uJ3QgaGF2ZSB0b28gbXVjaCByZWZzIHRvIG1lcmdlIGluIHRoZSBjYXNlIG9mIGRlbGF5ZWQgZGF0YQorCSAqIHJlZnMuCisJICovCisJaWYgKGhlYWQtPmlzX2RhdGEpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmZnNfaW5mby0+dHJlZV9tb2Rfc2VxX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmZnNfaW5mby0+dHJlZV9tb2Rfc2VxX2xpc3QpKSB7CiAJCXN0cnVjdCBzZXFfbGlzdCAqZWxlbTsKQEAgLTMzMCwyMiArMzYzLDE5IEBACiAJfQogCXNwaW5fdW5sb2NrKCZmc19pbmZvLT50cmVlX21vZF9zZXFfbG9jayk7CiAKLQlub2RlID0gcmJfcHJldigmaGVhZC0+bm9kZS5yYl9ub2RlKTsKKwlub2RlID0gcmJfZmlyc3QoJmhlYWQtPnJlZl9yb290KTsKIAl3aGlsZSAobm9kZSkgewogCQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqcmVmOwogCiAJCXJlZiA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlLAogCQkJICAgICAgIHJiX25vZGUpOwotCQlpZiAocmVmLT5ieXRlbnIgIT0gaGVhZC0+bm9kZS5ieXRlbnIpCi0JCQlicmVhazsKLQogCQkvKiBXZSBjYW4ndCBtZXJnZSByZWZzIHRoYXQgYXJlIG91dHNpZGUgb2Ygb3VyIHNlcSBjb3VudCAqLwogCQlpZiAoc2VxICYmIHJlZi0+c2VxID49IHNlcSkKIAkJCWJyZWFrOwotCQlpZiAobWVyZ2VfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIHJlZiwgc2VxKSkKLQkJCW5vZGUgPSByYl9wcmV2KCZoZWFkLT5ub2RlLnJiX25vZGUpOworCQlpZiAobWVyZ2VfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIGhlYWQsIHJlZiwgc2VxKSkKKwkJCW5vZGUgPSByYl9maXJzdCgmaGVhZC0+cmVmX3Jvb3QpOwogCQllbHNlCi0JCQlub2RlID0gcmJfcHJldihub2RlKTsKKwkJCW5vZGUgPSByYl9uZXh0KCZyZWYtPnJiX25vZGUpOwogCX0KIH0KIApAQCAtMzczLDcxICs0MDMsNTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYnRyZnNfZmluZF9yZWZfY2x1c3RlcihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmNsdXN0ZXIsIHU2NCBzdGFydCkKK3N0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICoKK2J0cmZzX3NlbGVjdF9yZWZfaGVhZChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucykKIHsKLQlpbnQgY291bnQgPSAwOwogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnM7Ci0Jc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZjsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqaGVhZDsKKwl1NjQgc3RhcnQ7CisJYm9vbCBsb29wID0gZmFsc2U7CiAKIAlkZWxheWVkX3JlZnMgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnM7Ci0JaWYgKHN0YXJ0ID09IDApIHsKLQkJbm9kZSA9IHJiX2ZpcnN0KCZkZWxheWVkX3JlZnMtPnJvb3QpOwotCX0gZWxzZSB7Ci0JCXJlZiA9IE5VTEw7Ci0JCWZpbmRfcmVmX2hlYWQoJmRlbGF5ZWRfcmVmcy0+cm9vdCwgc3RhcnQgKyAxLCAmcmVmLCAxKTsKLQkJaWYgKHJlZikgewotCQkJbm9kZSA9ICZyZWYtPnJiX25vZGU7Ci0JCX0gZWxzZQotCQkJbm9kZSA9IHJiX2ZpcnN0KCZkZWxheWVkX3JlZnMtPnJvb3QpOwotCX0KKwogYWdhaW46Ci0Jd2hpbGUgKG5vZGUgJiYgY291bnQgPCAzMikgewotCQlyZWYgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSwgcmJfbm9kZSk7Ci0JCWlmIChidHJmc19kZWxheWVkX3JlZl9pc19oZWFkKHJlZikpIHsKLQkJCWhlYWQgPSBidHJmc19kZWxheWVkX25vZGVfdG9faGVhZChyZWYpOwotCQkJaWYgKGxpc3RfZW1wdHkoJmhlYWQtPmNsdXN0ZXIpKSB7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmaGVhZC0+Y2x1c3RlciwgY2x1c3Rlcik7Ci0JCQkJZGVsYXllZF9yZWZzLT5ydW5fZGVsYXllZF9zdGFydCA9Ci0JCQkJCWhlYWQtPm5vZGUuYnl0ZW5yOwotCQkJCWNvdW50Kys7Ci0KLQkJCQlXQVJOX09OKGRlbGF5ZWRfcmVmcy0+bnVtX2hlYWRzX3JlYWR5ID09IDApOwotCQkJCWRlbGF5ZWRfcmVmcy0+bnVtX2hlYWRzX3JlYWR5LS07Ci0JCQl9IGVsc2UgaWYgKGNvdW50KSB7Ci0JCQkJLyogdGhlIGdvYWwgb2YgdGhlIGNsdXN0ZXJpbmcgaXMgdG8gZmluZCBleHRlbnRzCi0JCQkJICogdGhhdCBhcmUgbGlrZWx5IHRvIGVuZCB1cCBpbiB0aGUgc2FtZSBleHRlbnQKLQkJCQkgKiBsZWFmIG9uIGRpc2suICBTbywgd2UgZG9uJ3Qgd2FudCB0aGVtIHNwcmVhZAotCQkJCSAqIGFsbCBvdmVyIHRoZSB0cmVlLiAgU3RvcCBub3cgaWYgd2UndmUgaGl0Ci0JCQkJICogYSBoZWFkIHRoYXQgd2FzIGFscmVhZHkgaW4gdXNlCi0JCQkJICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbm9kZSA9IHJiX25leHQobm9kZSk7Ci0JfQotCWlmIChjb3VudCkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKHN0YXJ0KSB7Ci0JCS8qCi0JCSAqIHdlJ3ZlIGdvbmUgdG8gdGhlIGVuZCBvZiB0aGUgcmJ0cmVlIHdpdGhvdXQgZmluZGluZyBhbnkKLQkJICogY2x1c3RlcnMuICBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIHRyeSBhZ2FpbgotCQkgKi8KKwlzdGFydCA9IGRlbGF5ZWRfcmVmcy0+cnVuX2RlbGF5ZWRfc3RhcnQ7CisJaGVhZCA9IGZpbmRfcmVmX2hlYWQoJmRlbGF5ZWRfcmVmcy0+aHJlZl9yb290LCBzdGFydCwgTlVMTCwgMSk7CisJaWYgKCFoZWFkICYmICFsb29wKSB7CisJCWRlbGF5ZWRfcmVmcy0+cnVuX2RlbGF5ZWRfc3RhcnQgPSAwOwogCQlzdGFydCA9IDA7Ci0JCW5vZGUgPSByYl9maXJzdCgmZGVsYXllZF9yZWZzLT5yb290KTsKLQkJZ290byBhZ2FpbjsKKwkJbG9vcCA9IHRydWU7CisJCWhlYWQgPSBmaW5kX3JlZl9oZWFkKCZkZWxheWVkX3JlZnMtPmhyZWZfcm9vdCwgc3RhcnQsIE5VTEwsIDEpOworCQlpZiAoIWhlYWQpCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFoZWFkICYmIGxvb3ApIHsKKwkJcmV0dXJuIE5VTEw7CiAJfQotCXJldHVybiAxOwotfQogCi12b2lkIGJ0cmZzX3JlbGVhc2VfcmVmX2NsdXN0ZXIoc3RydWN0IGxpc3RfaGVhZCAqY2x1c3RlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpxOworCXdoaWxlIChoZWFkLT5wcm9jZXNzaW5nKSB7CisJCXN0cnVjdCByYl9ub2RlICpub2RlOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcSwgY2x1c3RlcikKLQkJbGlzdF9kZWxfaW5pdChwb3MpOworCQlub2RlID0gcmJfbmV4dCgmaGVhZC0+aHJlZl9ub2RlKTsKKwkJaWYgKCFub2RlKSB7CisJCQlpZiAobG9vcCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWRlbGF5ZWRfcmVmcy0+cnVuX2RlbGF5ZWRfc3RhcnQgPSAwOworCQkJc3RhcnQgPSAwOworCQkJbG9vcCA9IHRydWU7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWhlYWQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCwKKwkJCQlocmVmX25vZGUpOworCX0KKworCWhlYWQtPnByb2Nlc3NpbmcgPSAxOworCVdBUk5fT04oZGVsYXllZF9yZWZzLT5udW1faGVhZHNfcmVhZHkgPT0gMCk7CisJZGVsYXllZF9yZWZzLT5udW1faGVhZHNfcmVhZHktLTsKKwlkZWxheWVkX3JlZnMtPnJ1bl9kZWxheWVkX3N0YXJ0ID0gaGVhZC0+bm9kZS5ieXRlbnIgKworCQloZWFkLT5ub2RlLm51bV9ieXRlczsKKwlyZXR1cm4gaGVhZDsKIH0KIAogLyoKQEAgLTQ1MSw2ICs0NjIsNyBAQAogc3RhdGljIG5vaW5saW5lIHZvaWQKIHVwZGF0ZV9leGlzdGluZ19yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCSAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzLAorCQkgICAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmhlYWQsCiAJCSAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqZXhpc3RpbmcsCiAJCSAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqdXBkYXRlKQogewpAQCAtNDYzLDcgKzQ3NSw3IEBACiAJCSAqLwogCQlleGlzdGluZy0+cmVmX21vZC0tOwogCQlpZiAoZXhpc3RpbmctPnJlZl9tb2QgPT0gMCkKLQkJCWRyb3BfZGVsYXllZF9yZWYodHJhbnMsIGRlbGF5ZWRfcmVmcywgZXhpc3RpbmcpOworCQkJZHJvcF9kZWxheWVkX3JlZih0cmFucywgZGVsYXllZF9yZWZzLCBoZWFkLCBleGlzdGluZyk7CiAJCWVsc2UKIAkJCVdBUk5fT04oZXhpc3RpbmctPnR5cGUgPT0gQlRSRlNfVFJFRV9CTE9DS19SRUZfS0VZIHx8CiAJCQkJZXhpc3RpbmctPnR5cGUgPT0gQlRSRlNfU0hBUkVEX0JMT0NLX1JFRl9LRVkpOwpAQCAtNTMzLDkgKzU0NSwxMyBAQAogCQl9CiAJfQogCS8qCi0JICogdXBkYXRlIHRoZSByZWZlcmVuY2UgbW9kIG9uIHRoZSBoZWFkIHRvIHJlZmxlY3QgdGhpcyBuZXcgb3BlcmF0aW9uCisJICogdXBkYXRlIHRoZSByZWZlcmVuY2UgbW9kIG9uIHRoZSBoZWFkIHRvIHJlZmxlY3QgdGhpcyBuZXcgb3BlcmF0aW9uLAorCSAqIG9ubHkgbmVlZCB0aGUgbG9jayBmb3IgdGhpcyBjYXNlIGNhdXNlIHdlIGNvdWxkIGJlIHByb2Nlc3NpbmcgaXQKKwkgKiBjdXJyZW50bHksIGZvciByZWZzIHdlIGp1c3QgYWRkZWQgd2Uga25vdyB3ZSdyZSBhLW9rLgogCSAqLworCXNwaW5fbG9jaygmZXhpc3RpbmdfcmVmLT5sb2NrKTsKIAlleGlzdGluZy0+cmVmX21vZCArPSB1cGRhdGUtPnJlZl9tb2Q7CisJc3Bpbl91bmxvY2soJmV4aXN0aW5nX3JlZi0+bG9jayk7CiB9CiAKIC8qCkBAIC01NDMsMTMgKzU1OSwxMyBAQAogICogdGhpcyBkb2VzIGFsbCB0aGUgZGlydHkgd29yayBpbiB0ZXJtcyBvZiBtYWludGFpbmluZyB0aGUgY29ycmVjdAogICogb3ZlcmFsbCBtb2RpZmljYXRpb24gY291bnQuCiAgKi8KLXN0YXRpYyBub2lubGluZSB2b2lkIGFkZF9kZWxheWVkX3JlZl9oZWFkKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAotCQkJCQlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZiwKLQkJCQkJdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywKLQkJCQkJaW50IGFjdGlvbiwgaW50IGlzX2RhdGEpCitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKgorYWRkX2RlbGF5ZWRfcmVmX2hlYWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCSAgICAgc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZiwgdTY0IGJ5dGVuciwKKwkJICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgYWN0aW9uLCBpbnQgaXNfZGF0YSkKIHsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqZXhpc3Rpbmc7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmV4aXN0aW5nOwogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkX3JlZiA9IE5VTEw7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmczsKIAlpbnQgY291bnRfbW9kID0gMTsKQEAgLTU5NiwzOCArNjEyLDQzIEBACiAJaGVhZF9yZWYgPSBidHJmc19kZWxheWVkX25vZGVfdG9faGVhZChyZWYpOwogCWhlYWRfcmVmLT5tdXN0X2luc2VydF9yZXNlcnZlZCA9IG11c3RfaW5zZXJ0X3Jlc2VydmVkOwogCWhlYWRfcmVmLT5pc19kYXRhID0gaXNfZGF0YTsKKwloZWFkX3JlZi0+cmVmX3Jvb3QgPSBSQl9ST09UOworCWhlYWRfcmVmLT5wcm9jZXNzaW5nID0gMDsKIAotCUlOSVRfTElTVF9IRUFEKCZoZWFkX3JlZi0+Y2x1c3Rlcik7CisJc3Bpbl9sb2NrX2luaXQoJmhlYWRfcmVmLT5sb2NrKTsKIAltdXRleF9pbml0KCZoZWFkX3JlZi0+bXV0ZXgpOwogCiAJdHJhY2VfYWRkX2RlbGF5ZWRfcmVmX2hlYWQocmVmLCBoZWFkX3JlZiwgYWN0aW9uKTsKIAotCWV4aXN0aW5nID0gdHJlZV9pbnNlcnQoJmRlbGF5ZWRfcmVmcy0+cm9vdCwgJnJlZi0+cmJfbm9kZSk7Ci0KKwlleGlzdGluZyA9IGh0cmVlX2luc2VydCgmZGVsYXllZF9yZWZzLT5ocmVmX3Jvb3QsCisJCQkJJmhlYWRfcmVmLT5ocmVmX25vZGUpOwogCWlmIChleGlzdGluZykgewotCQl1cGRhdGVfZXhpc3RpbmdfaGVhZF9yZWYoZXhpc3RpbmcsIHJlZik7CisJCXVwZGF0ZV9leGlzdGluZ19oZWFkX3JlZigmZXhpc3RpbmctPm5vZGUsIHJlZik7CiAJCS8qCiAJCSAqIHdlJ3ZlIHVwZGF0ZWQgdGhlIGV4aXN0aW5nIHJlZiwgZnJlZSB0aGUgbmV3bHkKIAkJICogYWxsb2NhdGVkIHJlZgogCQkgKi8KIAkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWRfY2FjaGVwLCBoZWFkX3JlZik7CisJCWhlYWRfcmVmID0gZXhpc3Rpbmc7CiAJfSBlbHNlIHsKIAkJZGVsYXllZF9yZWZzLT5udW1faGVhZHMrKzsKIAkJZGVsYXllZF9yZWZzLT5udW1faGVhZHNfcmVhZHkrKzsKLQkJZGVsYXllZF9yZWZzLT5udW1fZW50cmllcysrOworCQlhdG9taWNfaW5jKCZkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzKTsKIAkJdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMrKzsKIAl9CisJcmV0dXJuIGhlYWRfcmVmOwogfQogCiAvKgogICogaGVscGVyIHRvIGluc2VydCBhIGRlbGF5ZWQgdHJlZSByZWYgaW50byB0aGUgcmJ0cmVlLgogICovCi1zdGF0aWMgbm9pbmxpbmUgdm9pZCBhZGRfZGVsYXllZF90cmVlX3JlZihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkJIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZiwKLQkJCQkJIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIHU2NCBwYXJlbnQsCi0JCQkJCSB1NjQgcmVmX3Jvb3QsIGludCBsZXZlbCwgaW50IGFjdGlvbiwKLQkJCQkJIGludCBmb3JfY293KQorc3RhdGljIG5vaW5saW5lIHZvaWQKK2FkZF9kZWxheWVkX3RyZWVfcmVmKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkgICAgIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkX3JlZiwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqcmVmLCB1NjQgYnl0ZW5yLAorCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCBwYXJlbnQsIHU2NCByZWZfcm9vdCwgaW50IGxldmVsLAorCQkgICAgIGludCBhY3Rpb24sIGludCBmb3JfY293KQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpleGlzdGluZzsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF90cmVlX3JlZiAqZnVsbF9yZWY7CkBAIC02NjMsMzAgKzY4NCwzMyBAQAogCiAJdHJhY2VfYWRkX2RlbGF5ZWRfdHJlZV9yZWYocmVmLCBmdWxsX3JlZiwgYWN0aW9uKTsKIAotCWV4aXN0aW5nID0gdHJlZV9pbnNlcnQoJmRlbGF5ZWRfcmVmcy0+cm9vdCwgJnJlZi0+cmJfbm9kZSk7Ci0KKwlzcGluX2xvY2soJmhlYWRfcmVmLT5sb2NrKTsKKwlleGlzdGluZyA9IHRyZWVfaW5zZXJ0KCZoZWFkX3JlZi0+cmVmX3Jvb3QsICZyZWYtPnJiX25vZGUpOwogCWlmIChleGlzdGluZykgewotCQl1cGRhdGVfZXhpc3RpbmdfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIGV4aXN0aW5nLCByZWYpOworCQl1cGRhdGVfZXhpc3RpbmdfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIGhlYWRfcmVmLCBleGlzdGluZywKKwkJCQkgICAgcmVmKTsKIAkJLyoKIAkJICogd2UndmUgdXBkYXRlZCB0aGUgZXhpc3RpbmcgcmVmLCBmcmVlIHRoZSBuZXdseQogCQkgKiBhbGxvY2F0ZWQgcmVmCiAJCSAqLwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfZGVsYXllZF90cmVlX3JlZl9jYWNoZXAsIGZ1bGxfcmVmKTsKIAl9IGVsc2UgewotCQlkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzKys7CisJCWF0b21pY19pbmMoJmRlbGF5ZWRfcmVmcy0+bnVtX2VudHJpZXMpOwogCQl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcysrOwogCX0KKwlzcGluX3VubG9jaygmaGVhZF9yZWYtPmxvY2spOwogfQogCiAvKgogICogaGVscGVyIHRvIGluc2VydCBhIGRlbGF5ZWQgZGF0YSByZWYgaW50byB0aGUgcmJ0cmVlLgogICovCi1zdGF0aWMgbm9pbmxpbmUgdm9pZCBhZGRfZGVsYXllZF9kYXRhX3JlZihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkJIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZiwKLQkJCQkJIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIHU2NCBwYXJlbnQsCi0JCQkJCSB1NjQgcmVmX3Jvb3QsIHU2NCBvd25lciwgdTY0IG9mZnNldCwKLQkJCQkJIGludCBhY3Rpb24sIGludCBmb3JfY293KQorc3RhdGljIG5vaW5saW5lIHZvaWQKK2FkZF9kZWxheWVkX2RhdGFfcmVmKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkgICAgIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkX3JlZiwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqcmVmLCB1NjQgYnl0ZW5yLAorCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCBwYXJlbnQsIHU2NCByZWZfcm9vdCwgdTY0IG93bmVyLAorCQkgICAgIHU2NCBvZmZzZXQsIGludCBhY3Rpb24sIGludCBmb3JfY293KQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpleGlzdGluZzsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9kYXRhX3JlZiAqZnVsbF9yZWY7CkBAIC03MjQsMTkgKzc0OCwyMSBAQAogCiAJdHJhY2VfYWRkX2RlbGF5ZWRfZGF0YV9yZWYocmVmLCBmdWxsX3JlZiwgYWN0aW9uKTsKIAotCWV4aXN0aW5nID0gdHJlZV9pbnNlcnQoJmRlbGF5ZWRfcmVmcy0+cm9vdCwgJnJlZi0+cmJfbm9kZSk7Ci0KKwlzcGluX2xvY2soJmhlYWRfcmVmLT5sb2NrKTsKKwlleGlzdGluZyA9IHRyZWVfaW5zZXJ0KCZoZWFkX3JlZi0+cmVmX3Jvb3QsICZyZWYtPnJiX25vZGUpOwogCWlmIChleGlzdGluZykgewotCQl1cGRhdGVfZXhpc3RpbmdfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIGV4aXN0aW5nLCByZWYpOworCQl1cGRhdGVfZXhpc3RpbmdfcmVmKHRyYW5zLCBkZWxheWVkX3JlZnMsIGhlYWRfcmVmLCBleGlzdGluZywKKwkJCQkgICAgcmVmKTsKIAkJLyoKIAkJICogd2UndmUgdXBkYXRlZCB0aGUgZXhpc3RpbmcgcmVmLCBmcmVlIHRoZSBuZXdseQogCQkgKiBhbGxvY2F0ZWQgcmVmCiAJCSAqLwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfZGVsYXllZF9kYXRhX3JlZl9jYWNoZXAsIGZ1bGxfcmVmKTsKIAl9IGVsc2UgewotCQlkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzKys7CisJCWF0b21pY19pbmMoJmRlbGF5ZWRfcmVmcy0+bnVtX2VudHJpZXMpOwogCQl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcysrOwogCX0KKwlzcGluX3VubG9jaygmaGVhZF9yZWYtPmxvY2spOwogfQogCiAvKgpAQCAtNzc1LDEwICs4MDEsMTAgQEAKIAkgKiBpbnNlcnQgYm90aCB0aGUgaGVhZCBub2RlIGFuZCB0aGUgbmV3IHJlZiB3aXRob3V0IGRyb3BwaW5nCiAJICogdGhlIHNwaW4gbG9jawogCSAqLwotCWFkZF9kZWxheWVkX3JlZl9oZWFkKGZzX2luZm8sIHRyYW5zLCAmaGVhZF9yZWYtPm5vZGUsIGJ5dGVuciwKLQkJCQkgICBudW1fYnl0ZXMsIGFjdGlvbiwgMCk7CisJaGVhZF9yZWYgPSBhZGRfZGVsYXllZF9yZWZfaGVhZChmc19pbmZvLCB0cmFucywgJmhlYWRfcmVmLT5ub2RlLAorCQkJCQlieXRlbnIsIG51bV9ieXRlcywgYWN0aW9uLCAwKTsKIAotCWFkZF9kZWxheWVkX3RyZWVfcmVmKGZzX2luZm8sIHRyYW5zLCAmcmVmLT5ub2RlLCBieXRlbnIsCisJYWRkX2RlbGF5ZWRfdHJlZV9yZWYoZnNfaW5mbywgdHJhbnMsIGhlYWRfcmVmLCAmcmVmLT5ub2RlLCBieXRlbnIsCiAJCQkJICAgbnVtX2J5dGVzLCBwYXJlbnQsIHJlZl9yb290LCBsZXZlbCwgYWN0aW9uLAogCQkJCSAgIGZvcl9jb3cpOwogCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwpAQCAtODIzLDEwICs4NDksMTAgQEAKIAkgKiBpbnNlcnQgYm90aCB0aGUgaGVhZCBub2RlIGFuZCB0aGUgbmV3IHJlZiB3aXRob3V0IGRyb3BwaW5nCiAJICogdGhlIHNwaW4gbG9jawogCSAqLwotCWFkZF9kZWxheWVkX3JlZl9oZWFkKGZzX2luZm8sIHRyYW5zLCAmaGVhZF9yZWYtPm5vZGUsIGJ5dGVuciwKLQkJCQkgICBudW1fYnl0ZXMsIGFjdGlvbiwgMSk7CisJaGVhZF9yZWYgPSBhZGRfZGVsYXllZF9yZWZfaGVhZChmc19pbmZvLCB0cmFucywgJmhlYWRfcmVmLT5ub2RlLAorCQkJCQlieXRlbnIsIG51bV9ieXRlcywgYWN0aW9uLCAxKTsKIAotCWFkZF9kZWxheWVkX2RhdGFfcmVmKGZzX2luZm8sIHRyYW5zLCAmcmVmLT5ub2RlLCBieXRlbnIsCisJYWRkX2RlbGF5ZWRfZGF0YV9yZWYoZnNfaW5mbywgdHJhbnMsIGhlYWRfcmVmLCAmcmVmLT5ub2RlLCBieXRlbnIsCiAJCQkJICAgbnVtX2J5dGVzLCBwYXJlbnQsIHJlZl9yb290LCBvd25lciwgb2Zmc2V0LAogCQkJCSAgIGFjdGlvbiwgZm9yX2Nvdyk7CiAJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CkBAIC04NjksMTQgKzg5NSwxMCBAQAogc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKgogYnRyZnNfZmluZF9kZWxheWVkX3JlZl9oZWFkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCB1NjQgYnl0ZW5yKQogewotCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWY7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmczsKIAogCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmczsKLQlyZWYgPSBmaW5kX3JlZl9oZWFkKCZkZWxheWVkX3JlZnMtPnJvb3QsIGJ5dGVuciwgTlVMTCwgMCk7Ci0JaWYgKHJlZikKLQkJcmV0dXJuIGJ0cmZzX2RlbGF5ZWRfbm9kZV90b19oZWFkKHJlZik7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGZpbmRfcmVmX2hlYWQoJmRlbGF5ZWRfcmVmcy0+aHJlZl9yb290LCBieXRlbnIsIE5VTEwsIDApOwogfQogCiB2b2lkIGJ0cmZzX2RlbGF5ZWRfcmVmX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmggYi9mcy9idHJmcy9kZWxheWVkLXJlZi5oCmluZGV4IDcwYjk2MmMuLjRiYTliOTMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmgKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1yZWYuaApAQCAtODEsNyArODEsMTAgQEAKIAkgKi8KIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNsdXN0ZXI7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCByYl9yb290IHJlZl9yb290OworCisJc3RydWN0IHJiX25vZGUgaHJlZl9ub2RlOwogCiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wICpleHRlbnRfb3A7CiAJLyoKQEAgLTk4LDYgKzEwMSw3IEBACiAJICovCiAJdW5zaWduZWQgaW50IG11c3RfaW5zZXJ0X3Jlc2VydmVkOjE7CiAJdW5zaWduZWQgaW50IGlzX2RhdGE6MTsKKwl1bnNpZ25lZCBpbnQgcHJvY2Vzc2luZzoxOwogfTsKIAogc3RydWN0IGJ0cmZzX2RlbGF5ZWRfdHJlZV9yZWYgewpAQCAtMTE2LDcgKzEyMCw4IEBACiB9OwogCiBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCB7Ci0Jc3RydWN0IHJiX3Jvb3Qgcm9vdDsKKwkvKiBoZWFkIHJlZiByYnRyZWUgKi8KKwlzdHJ1Y3QgcmJfcm9vdCBocmVmX3Jvb3Q7CiAKIAkvKiB0aGlzIHNwaW4gbG9jayBwcm90ZWN0cyB0aGUgcmJ0cmVlIGFuZCB0aGUgZW50cmllcyBpbnNpZGUgKi8KIAlzcGlubG9ja190IGxvY2s7CkBAIC0xMjQsNyArMTI5LDcgQEAKIAkvKiBob3cgbWFueSBkZWxheWVkIHJlZiB1cGRhdGVzIHdlJ3ZlIHF1ZXVlZCwgdXNlZCBieSB0aGUKIAkgKiB0aHJvdHRsaW5nIGNvZGUKIAkgKi8KLQl1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzOworCWF0b21pY190IG51bV9lbnRyaWVzOwogCiAJLyogdG90YWwgbnVtYmVyIG9mIGhlYWQgbm9kZXMgaW4gdHJlZSAqLwogCXVuc2lnbmVkIGxvbmcgbnVtX2hlYWRzOwpAQCAtMTMzLDE1ICsxMzgsNiBAQAogCXVuc2lnbmVkIGxvbmcgbnVtX2hlYWRzX3JlYWR5OwogCiAJLyoKLQkgKiBidW1wZWQgd2hlbiBzb21lb25lIGlzIG1ha2luZyBwcm9ncmVzcyBvbiB0aGUgZGVsYXllZAotCSAqIHJlZnMsIHNvIHRoYXQgb3RoZXIgcHJvY3Mga25vdyB0aGV5IGFyZSBqdXN0IGFkZGluZyB0bwotCSAqIGNvbnRlbnRpb24gaW50ZWFkIG9mIGhlbHBpbmcKLQkgKi8KLQlhdG9taWNfdCBwcm9jc19ydW5uaW5nX3JlZnM7Ci0JYXRvbWljX3QgcmVmX3NlcTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCi0JLyoKIAkgKiBzZXQgd2hlbiB0aGUgdHJlZSBpcyBmbHVzaGluZyBiZWZvcmUgYSB0cmFuc2FjdGlvbiBjb21taXQsCiAJICogdXNlZCBieSB0aGUgdGhyb3R0bGluZyBjb2RlIHRvIGRlY2lkZSBpZiBuZXcgdXBkYXRlcyBuZWVkCiAJICogdG8gYmUgcnVuIHJpZ2h0IGF3YXkKQEAgLTIyNiw5ICsyMjIsOSBAQAogCW11dGV4X3VubG9jaygmaGVhZC0+bXV0ZXgpOwogfQogCi1pbnQgYnRyZnNfZmluZF9yZWZfY2x1c3RlcihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmNsdXN0ZXIsIHU2NCBzZWFyY2hfc3RhcnQpOwotdm9pZCBidHJmc19yZWxlYXNlX3JlZl9jbHVzdGVyKHN0cnVjdCBsaXN0X2hlYWQgKmNsdXN0ZXIpOworCitzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqCitidHJmc19zZWxlY3RfcmVmX2hlYWQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMpOwogCiBpbnQgYnRyZnNfY2hlY2tfZGVsYXllZF9zZXEoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCiAJCQkgICAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmcywKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rldi1yZXBsYWNlLmMgYi9mcy9idHJmcy9kZXYtcmVwbGFjZS5jCmluZGV4IDJjZmMzZGYuLjU2NGM5MjYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rldi1yZXBsYWNlLmMKKysrIGIvZnMvYnRyZnMvZGV2LXJlcGxhY2UuYwpAQCAtMTAyLDcgKzEwMiw4IEBACiAJcHRyID0gYnRyZnNfaXRlbV9wdHIoZWIsIHNsb3QsIHN0cnVjdCBidHJmc19kZXZfcmVwbGFjZV9pdGVtKTsKIAogCWlmIChpdGVtX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBidHJmc19kZXZfcmVwbGFjZV9pdGVtKSkgewotCQlwcl93YXJuKCJidHJmczogZGV2X3JlcGxhY2UgZW50cnkgZm91bmQgaGFzIHVuZXhwZWN0ZWQgc2l6ZSwgaWdub3JlIGVudHJ5XG4iKTsKKwkJYnRyZnNfd2Fybihmc19pbmZvLAorCQkJImRldl9yZXBsYWNlIGVudHJ5IGZvdW5kIGhhcyB1bmV4cGVjdGVkIHNpemUsIGlnbm9yZSBlbnRyeSIpOwogCQlnb3RvIG5vX3ZhbGlkX2Rldl9yZXBsYWNlX2VudHJ5X2ZvdW5kOwogCX0KIApAQCAtMTQ1LDEzICsxNDYsMTkgQEAKIAkJaWYgKCFkZXZfcmVwbGFjZS0+c3JjZGV2ICYmCiAJCSAgICAhYnRyZnNfdGVzdF9vcHQoZGV2X3Jvb3QsIERFR1JBREVEKSkgewogCQkJcmV0ID0gLUVJTzsKLQkJCXByX3dhcm4oImJ0cmZzOiBjYW5ub3QgbW91bnQgYmVjYXVzZSBkZXZpY2UgcmVwbGFjZSBvcGVyYXRpb24gaXMgb25nb2luZyBhbmRcbiIgInNyY2RldiAoZGV2aWQgJWxsdSkgaXMgbWlzc2luZywgbmVlZCB0byBydW4gJ2J0cmZzIGRldiBzY2FuJz9cbiIsCi0JCQkJc3JjX2RldmlkKTsKKwkJCWJ0cmZzX3dhcm4oZnNfaW5mbywKKwkJCSAgICJjYW5ub3QgbW91bnQgYmVjYXVzZSBkZXZpY2UgcmVwbGFjZSBvcGVyYXRpb24gaXMgb25nb2luZyBhbmQiKTsKKwkJCWJ0cmZzX3dhcm4oZnNfaW5mbywKKwkJCSAgICJzcmNkZXYgKGRldmlkICVsbHUpIGlzIG1pc3NpbmcsIG5lZWQgdG8gcnVuICdidHJmcyBkZXYgc2Nhbic/IiwKKwkJCSAgIHNyY19kZXZpZCk7CiAJCX0KIAkJaWYgKCFkZXZfcmVwbGFjZS0+dGd0ZGV2ICYmCiAJCSAgICAhYnRyZnNfdGVzdF9vcHQoZGV2X3Jvb3QsIERFR1JBREVEKSkgewogCQkJcmV0ID0gLUVJTzsKLQkJCXByX3dhcm4oImJ0cmZzOiBjYW5ub3QgbW91bnQgYmVjYXVzZSBkZXZpY2UgcmVwbGFjZSBvcGVyYXRpb24gaXMgb25nb2luZyBhbmRcbiIgInRndGRldiAoZGV2aWQgJWxsdSkgaXMgbWlzc2luZywgbmVlZCB0byBydW4gYnRyZnMgZGV2IHNjYW4/XG4iLAorCQkJYnRyZnNfd2Fybihmc19pbmZvLAorCQkJICAgImNhbm5vdCBtb3VudCBiZWNhdXNlIGRldmljZSByZXBsYWNlIG9wZXJhdGlvbiBpcyBvbmdvaW5nIGFuZCIpOworCQkJYnRyZnNfd2Fybihmc19pbmZvLAorCQkJICAgInRndGRldiAoZGV2aWQgJWxsdSkgaXMgbWlzc2luZywgbmVlZCB0byBydW4gJ2J0cmZzIGRldiBzY2FuJz8iLAogCQkJCUJUUkZTX0RFVl9SRVBMQUNFX0RFVklEKTsKIAkJfQogCQlpZiAoZGV2X3JlcGxhY2UtPnRndGRldikgewpAQCAtMjEwLDcgKzIxNyw3IEBACiAJfQogCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCBkZXZfcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX3dhcm4oImJ0cmZzOiBlcnJvciAlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGRldl9yZXBsYWNlIGl0ZW0hXG4iLAorCQlidHJmc193YXJuKGZzX2luZm8sICJlcnJvciAlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGRldl9yZXBsYWNlIGl0ZW0hIiwKIAkJCXJldCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIzMCw3ICsyMzcsNyBAQAogCQkgKi8KIAkJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIGRldl9yb290LCBwYXRoKTsKIAkJaWYgKHJldCAhPSAwKSB7Ci0JCQlwcl93YXJuKCJidHJmczogZGVsZXRlIHRvbyBzbWFsbCBkZXZfcmVwbGFjZSBpdGVtIGZhaWxlZCAlZCFcbiIsCisJCQlidHJmc193YXJuKGZzX2luZm8sICJkZWxldGUgdG9vIHNtYWxsIGRldl9yZXBsYWNlIGl0ZW0gZmFpbGVkICVkISIsCiAJCQkJcmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0yNDMsNyArMjUwLDcgQEAKIAkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIGRldl9yb290LCBwYXRoLAogCQkJCQkgICAgICAma2V5LCBzaXplb2YoKnB0cikpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJfd2FybigiYnRyZnM6IGluc2VydCBkZXZfcmVwbGFjZSBpdGVtIGZhaWxlZCAlZCFcbiIsCisJCQlidHJmc193YXJuKGZzX2luZm8sICJpbnNlcnQgZGV2X3JlcGxhY2UgaXRlbSBmYWlsZWQgJWQhIiwKIAkJCQlyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTMwNSw3ICszMTIsNyBAQAogCXN0cnVjdCBidHJmc19kZXZpY2UgKnNyY19kZXZpY2UgPSBOVUxMOwogCiAJaWYgKGJ0cmZzX2ZzX2luY29tcGF0KGZzX2luZm8sIFJBSUQ1NikpIHsKLQkJcHJfd2FybigiYnRyZnM6IGRldl9yZXBsYWNlIGNhbm5vdCB5ZXQgaGFuZGxlIFJBSUQ1L1JBSUQ2XG4iKTsKKwkJYnRyZnNfd2Fybihmc19pbmZvLCAiZGV2X3JlcGxhY2UgY2Fubm90IHlldCBoYW5kbGUgUkFJRDUvUkFJRDYiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMjUsNyArMzMyLDcgQEAKIAlyZXQgPSBidHJmc19pbml0X2Rldl9yZXBsYWNlX3RndGRldihyb290LCBhcmdzLT5zdGFydC50Z3RkZXZfbmFtZSwKIAkJCQkJICAgICZ0Z3RfZGV2aWNlKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiYnRyZnM6IHRhcmdldCBkZXZpY2UgJXMgaXMgaW52YWxpZCFcbiIsCisJCWJ0cmZzX2Vycihmc19pbmZvLCAidGFyZ2V0IGRldmljZSAlcyBpcyBpbnZhbGlkISIsCiAJCSAgICAgICBhcmdzLT5zdGFydC50Z3RkZXZfbmFtZSk7CiAJCW11dGV4X3VubG9jaygmZnNfaW5mby0+dm9sdW1lX211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNDEsNyArMzQ4LDcgQEAKIAl9CiAKIAlpZiAodGd0X2RldmljZS0+dG90YWxfYnl0ZXMgPCBzcmNfZGV2aWNlLT50b3RhbF9ieXRlcykgewotCQlwcl9lcnIoImJ0cmZzOiB0YXJnZXQgZGV2aWNlIGlzIHNtYWxsZXIgdGhhbiBzb3VyY2UgZGV2aWNlIVxuIik7CisJCWJ0cmZzX2Vycihmc19pbmZvLCAidGFyZ2V0IGRldmljZSBpcyBzbWFsbGVyIHRoYW4gc291cmNlIGRldmljZSEiKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBsZWF2ZV9ub19sb2NrOwogCX0KQEAgLTM2Niw3ICszNzMsNyBAQAogCWRldl9yZXBsYWNlLT50Z3RkZXYgPSB0Z3RfZGV2aWNlOwogCiAJcHJpbnRrX2luX3JjdShLRVJOX0lORk8KLQkJICAgICAgImJ0cmZzOiBkZXZfcmVwbGFjZSBmcm9tICVzIChkZXZpZCAlbGx1KSB0byAlcyBzdGFydGVkXG4iLAorCQkgICAgICAiQlRSRlM6IGRldl9yZXBsYWNlIGZyb20gJXMgKGRldmlkICVsbHUpIHRvICVzIHN0YXJ0ZWRcbiIsCiAJCSAgICAgIHNyY19kZXZpY2UtPm1pc3NpbmcgPyAiPG1pc3NpbmcgZGlzaz4iIDoKIAkJICAgICAgICByY3Vfc3RyX2RlcmVmKHNyY19kZXZpY2UtPm5hbWUpLAogCQkgICAgICBzcmNfZGV2aWNlLT5kZXZpZCwKQEAgLTQ4OSw3ICs0OTYsNyBAQAogCiAJaWYgKHNjcnViX3JldCkgewogCQlwcmludGtfaW5fcmN1KEtFUk5fRVJSCi0JCQkgICAgICAiYnRyZnM6IGJ0cmZzX3NjcnViX2RldiglcywgJWxsdSwgJXMpIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICJCVFJGUzogYnRyZnNfc2NydWJfZGV2KCVzLCAlbGx1LCAlcykgZmFpbGVkICVkXG4iLAogCQkJICAgICAgc3JjX2RldmljZS0+bWlzc2luZyA/ICI8bWlzc2luZyBkaXNrPiIgOgogCQkJICAgICAgICByY3Vfc3RyX2RlcmVmKHNyY19kZXZpY2UtPm5hbWUpLAogCQkJICAgICAgc3JjX2RldmljZS0+ZGV2aWQsCkBAIC01MDQsNyArNTExLDcgQEAKIAl9CiAKIAlwcmludGtfaW5fcmN1KEtFUk5fSU5GTwotCQkgICAgICAiYnRyZnM6IGRldl9yZXBsYWNlIGZyb20gJXMgKGRldmlkICVsbHUpIHRvICVzKSBmaW5pc2hlZFxuIiwKKwkJICAgICAgIkJUUkZTOiBkZXZfcmVwbGFjZSBmcm9tICVzIChkZXZpZCAlbGx1KSB0byAlcykgZmluaXNoZWRcbiIsCiAJCSAgICAgIHNyY19kZXZpY2UtPm1pc3NpbmcgPyAiPG1pc3NpbmcgZGlzaz4iIDoKIAkJICAgICAgICByY3Vfc3RyX2RlcmVmKHNyY19kZXZpY2UtPm5hbWUpLAogCQkgICAgICBzcmNfZGV2aWNlLT5kZXZpZCwKQEAgLTY5OSw3ICs3MDYsNyBAQAogCQkJQlRSRlNfSU9DVExfREVWX1JFUExBQ0VfU1RBVEVfU1VTUEVOREVEOwogCQlkZXZfcmVwbGFjZS0+dGltZV9zdG9wcGVkID0gZ2V0X3NlY29uZHMoKTsKIAkJZGV2X3JlcGxhY2UtPml0ZW1fbmVlZHNfd3JpdGViYWNrID0gMTsKLQkJcHJfaW5mbygiYnRyZnM6IHN1c3BlbmRpbmcgZGV2X3JlcGxhY2UgZm9yIHVubW91bnRcbiIpOworCQlidHJmc19pbmZvKGZzX2luZm8sICJzdXNwZW5kaW5nIGRldl9yZXBsYWNlIGZvciB1bm1vdW50Iik7CiAJCWJyZWFrOwogCX0KIApAQCAtNzI4LDggKzczNSw5IEBACiAJCWJyZWFrOwogCX0KIAlpZiAoIWRldl9yZXBsYWNlLT50Z3RkZXYgfHwgIWRldl9yZXBsYWNlLT50Z3RkZXYtPmJkZXYpIHsKLQkJcHJfaW5mbygiYnRyZnM6IGNhbm5vdCBjb250aW51ZSBkZXZfcmVwbGFjZSwgdGd0ZGV2IGlzIG1pc3NpbmdcbiIKLQkJCSJidHJmczogeW91IG1heSBjYW5jZWwgdGhlIG9wZXJhdGlvbiBhZnRlciAnbW91bnQgLW8gZGVncmFkZWQnXG4iKTsKKwkJYnRyZnNfaW5mbyhmc19pbmZvLCAiY2Fubm90IGNvbnRpbnVlIGRldl9yZXBsYWNlLCB0Z3RkZXYgaXMgbWlzc2luZyIpOworCQlidHJmc19pbmZvKGZzX2luZm8sCisJCQkieW91IG1heSBjYW5jZWwgdGhlIG9wZXJhdGlvbiBhZnRlciAnbW91bnQgLW8gZGVncmFkZWQnIik7CiAJCWJ0cmZzX2Rldl9yZXBsYWNlX3VubG9jayhkZXZfcmVwbGFjZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTc1NSwxNCArNzYzLDE0IEBACiAJCWtmcmVlKHN0YXR1c19hcmdzKTsKIAkJZG9fZGl2KHByb2dyZXNzLCAxMCk7CiAJCXByaW50a19pbl9yY3UoS0VSTl9JTkZPCi0JCQkgICAgICAiYnRyZnM6IGNvbnRpbnVpbmcgZGV2X3JlcGxhY2UgZnJvbSAlcyAoZGV2aWQgJWxsdSkgdG8gJXMgQCV1JSVcbiIsCi0JCQkgICAgICBkZXZfcmVwbGFjZS0+c3JjZGV2LT5taXNzaW5nID8gIjxtaXNzaW5nIGRpc2s+IiA6Ci0JCQkJcmN1X3N0cl9kZXJlZihkZXZfcmVwbGFjZS0+c3JjZGV2LT5uYW1lKSwKLQkJCSAgICAgIGRldl9yZXBsYWNlLT5zcmNkZXYtPmRldmlkLAotCQkJICAgICAgZGV2X3JlcGxhY2UtPnRndGRldiA/Ci0JCQkJcmN1X3N0cl9kZXJlZihkZXZfcmVwbGFjZS0+dGd0ZGV2LT5uYW1lKSA6Ci0JCQkJIjxtaXNzaW5nIHRhcmdldCBkaXNrPiIsCi0JCQkgICAgICAodW5zaWduZWQgaW50KXByb2dyZXNzKTsKKwkJCSJCVFJGUzogY29udGludWluZyBkZXZfcmVwbGFjZSBmcm9tICVzIChkZXZpZCAlbGx1KSB0byAlcyBAJXUlJVxuIiwKKwkJCWRldl9yZXBsYWNlLT5zcmNkZXYtPm1pc3NpbmcgPyAiPG1pc3NpbmcgZGlzaz4iIDoKKwkJCXJjdV9zdHJfZGVyZWYoZGV2X3JlcGxhY2UtPnNyY2Rldi0+bmFtZSksCisJCQlkZXZfcmVwbGFjZS0+c3JjZGV2LT5kZXZpZCwKKwkJCWRldl9yZXBsYWNlLT50Z3RkZXYgPworCQkJcmN1X3N0cl9kZXJlZihkZXZfcmVwbGFjZS0+dGd0ZGV2LT5uYW1lKSA6CisJCQkiPG1pc3NpbmcgdGFyZ2V0IGRpc2s+IiwKKwkJCSh1bnNpZ25lZCBpbnQpcHJvZ3Jlc3MpOwogCX0KIAlidHJmc19kZXZfcmVwbGFjZV9jb250aW51ZV9vbl9tb3VudChmc19pbmZvKTsKIAlhdG9taWNfc2V0KCZmc19pbmZvLT5tdXR1YWxseV9leGNsdXNpdmVfb3BlcmF0aW9uX3J1bm5pbmcsIDApOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGlyLWl0ZW0uYyBiL2ZzL2J0cmZzL2Rpci1pdGVtLmMKaW5kZXggYzAzMWVhMy4uYTA2OTFkZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlyLWl0ZW0uYworKysgYi9mcy9idHJmcy9kaXItaXRlbS5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAkgKiBzZWUgaWYgdGhlcmUgaXMgcm9vbSBpbiB0aGUgaXRlbSB0byBpbnNlcnQgdGhpcwogCSAqIG5hbWUKIAkgKi8KLQlkYXRhX3NpemUgPSBzaXplb2YoKmRpKSArIG5hbWVfbGVuICsgc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKTsKKwlkYXRhX3NpemUgPSBzaXplb2YoKmRpKSArIG5hbWVfbGVuOwogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKIAlzbG90ID0gcGF0aC0+c2xvdHNbMF07CiAJaWYgKGRhdGFfc2l6ZSArIGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KSArCkBAIC00NTksNyArNDU5LDcgQEAKIAl1OCB0eXBlID0gYnRyZnNfZGlyX3R5cGUobGVhZiwgZGlyX2l0ZW0pOwogCiAJaWYgKHR5cGUgPj0gQlRSRlNfRlRfTUFYKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgImJ0cmZzOiBpbnZhbGlkIGRpciBpdGVtIHR5cGU6ICVkXG4iLAorCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJpbnZhbGlkIGRpciBpdGVtIHR5cGU6ICVkIiwKIAkJICAgICAgIChpbnQpdHlwZSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTQ2OCw3ICs0NjgsNyBAQAogCQluYW1lbGVuID0gWEFUVFJfTkFNRV9NQVg7CiAKIAlpZiAoYnRyZnNfZGlyX25hbWVfbGVuKGxlYWYsIGRpcl9pdGVtKSA+IG5hbWVsZW4pIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYnRyZnM6IGludmFsaWQgZGlyIGl0ZW0gbmFtZSBsZW46ICV1XG4iLAorCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJpbnZhbGlkIGRpciBpdGVtIG5hbWUgbGVuOiAldSIsCiAJCSAgICAgICAodW5zaWduZWQpYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpcl9pdGVtKSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTQ3Niw3ICs0NzYsNyBAQAogCS8qIEJUUkZTX01BWF9YQVRUUl9TSVpFIGlzIHRoZSBzYW1lIGZvciBhbGwgZGlyIGl0ZW1zICovCiAJaWYgKChidHJmc19kaXJfZGF0YV9sZW4obGVhZiwgZGlyX2l0ZW0pICsKIAkgICAgIGJ0cmZzX2Rpcl9uYW1lX2xlbihsZWFmLCBkaXJfaXRlbSkpID4gQlRSRlNfTUFYX1hBVFRSX1NJWkUocm9vdCkpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYnRyZnM6IGludmFsaWQgZGlyIGl0ZW0gbmFtZSArIGRhdGEgbGVuOiAldSArICV1XG4iLAorCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJpbnZhbGlkIGRpciBpdGVtIG5hbWUgKyBkYXRhIGxlbjogJXUgKyAldSIsCiAJCSAgICAgICAodW5zaWduZWQpYnRyZnNfZGlyX25hbWVfbGVuKGxlYWYsIGRpcl9pdGVtKSwKIAkJICAgICAgICh1bnNpZ25lZClidHJmc19kaXJfZGF0YV9sZW4obGVhZiwgZGlyX2l0ZW0pKTsKIAkJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmMgYi9mcy9idHJmcy9kaXNrLWlvLmMKaW5kZXggODA3MmNmYS4uNTIxNWYwNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlzay1pby5jCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCiAjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ2b2x1bWVzLmgiCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSAicmN1LXN0cmluZy5oIgogI2luY2x1ZGUgImRldi1yZXBsYWNlLmgiCiAjaW5jbHVkZSAicmFpZDU2LmgiCisjaW5jbHVkZSAic3lzZnMuaCIKIAogI2lmZGVmIENPTkZJR19YODYKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgpAQCAtMjQzLDcgKzI0NCw3IEBACiAKIHUzMiBidHJmc19jc3VtX2RhdGEoY2hhciAqZGF0YSwgdTMyIHNlZWQsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIGNyYzMyYyhzZWVkLCBkYXRhLCBsZW4pOworCXJldHVybiBidHJmc19jcmMzMmMoc2VlZCwgZGF0YSwgbGVuKTsKIH0KIAogdm9pZCBidHJmc19jc3VtX2ZpbmFsKHUzMiBjcmMsIGNoYXIgKnJlc3VsdCkKQEAgLTI5OSwxMSArMzAwLDExIEBACiAJCQltZW1jcHkoJmZvdW5kLCByZXN1bHQsIGNzdW1fc2l6ZSk7CiAKIAkJCXJlYWRfZXh0ZW50X2J1ZmZlcihidWYsICZ2YWwsIDAsIGNzdW1fc2l6ZSk7Ci0JCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPICJidHJmczogJXMgY2hlY2tzdW0gdmVyaWZ5ICIKLQkJCQkgICAgICAgImZhaWxlZCBvbiAlbGx1IHdhbnRlZCAlWCBmb3VuZCAlWCAiCi0JCQkJICAgICAgICJsZXZlbCAlZFxuIiwKLQkJCQkgICAgICAgcm9vdC0+ZnNfaW5mby0+c2ItPnNfaWQsIGJ1Zi0+c3RhcnQsCi0JCQkJICAgICAgIHZhbCwgZm91bmQsIGJ0cmZzX2hlYWRlcl9sZXZlbChidWYpKTsKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkiQlRSRlM6ICVzIGNoZWNrc3VtIHZlcmlmeSBmYWlsZWQgb24gJWxsdSB3YW50ZWQgJVggZm91bmQgJVggIgorCQkJCSJsZXZlbCAlZFxuIiwKKwkJCQlyb290LT5mc19pbmZvLT5zYi0+c19pZCwgYnVmLT5zdGFydCwKKwkJCQl2YWwsIGZvdW5kLCBidHJmc19oZWFkZXJfbGV2ZWwoYnVmKSk7CiAJCQlpZiAocmVzdWx0ICE9IChjaGFyICopJmlubGluZV9yZXN1bHQpCiAJCQkJa2ZyZWUocmVzdWx0KTsKIAkJCXJldHVybiAxOwpAQCAtMzgyLDEzICszODMsMTQgQEAKIAkJCXJldCA9IDE7CiAKIAkJaWYgKHJldCAmJiBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc2IpIDwgMTApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBzdXBlciBibG9jayBjcmNzIGRvbid0IG1hdGNoLCBvbGRlciBta2ZzIGRldGVjdGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiQlRSRlM6IHN1cGVyIGJsb2NrIGNyY3MgZG9uJ3QgbWF0Y2gsIG9sZGVyIG1rZnMgZGV0ZWN0ZWRcbiIpOwogCQkJcmV0ID0gMDsKIAkJfQogCX0KIAogCWlmIChjc3VtX3R5cGUgPj0gQVJSQVlfU0laRShidHJmc19jc3VtX3NpemVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiB1bnN1cHBvcnRlZCBjaGVja3N1bSBhbGdvcml0aG0gJXVcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IHVuc3VwcG9ydGVkIGNoZWNrc3VtIGFsZ29yaXRobSAldVxuIiwKIAkJCQljc3VtX3R5cGUpOwogCQlyZXQgPSAxOwogCX0KQEAgLTQ2NCwxMyArNDY2LDEwIEBACiAKIHN0YXRpYyBpbnQgY3N1bV9kaXJ0eV9idWZmZXIoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKIAl1NjQgc3RhcnQgPSBwYWdlX29mZnNldChwYWdlKTsKIAl1NjQgZm91bmRfc3RhcnQ7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwogCi0JdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOwotCiAJZWIgPSAoc3RydWN0IGV4dGVudF9idWZmZXIgKilwYWdlLT5wcml2YXRlOwogCWlmIChwYWdlICE9IGViLT5wYWdlc1swXSkKIAkJcmV0dXJuIDA7CkBAIC01MDAsOCArNDk5LDggQEAKIH0KIAogI2RlZmluZSBDT1JSVVBUKHJlYXNvbiwgZWIsIHJvb3QsIHNsb3QpCQkJCVwKLQlwcmludGsoS0VSTl9DUklUICJidHJmczogY29ycnVwdCBsZWFmLCAlczogYmxvY2s9JWxsdSwiCVwKLQkgICAgICAgInJvb3Q9JWxsdSwgc2xvdD0lZFxuIiwgcmVhc29uLAkJCVwKKwlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJjb3JydXB0IGxlYWYsICVzOiBibG9jaz0lbGx1LCIJXAorCQkgICAicm9vdD0lbGx1LCBzbG90PSVkIiwgcmVhc29uLAkJCVwKIAkgICAgICAgYnRyZnNfaGVhZGVyX2J5dGVucihlYiksCXJvb3QtPm9iamVjdGlkLCBzbG90KQogCiBzdGF0aWMgbm9pbmxpbmUgaW50IGNoZWNrX2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC01NjksNyArNTY4LDYgQEAKIAkJCQkgICAgICB1NjQgcGh5X29mZnNldCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgbWlycm9yKQogewotCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKIAl1NjQgZm91bmRfc3RhcnQ7CiAJaW50IGZvdW5kX2xldmVsOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKQEAgLTU4MCw3ICs1NzgsNiBAQAogCWlmICghcGFnZS0+cHJpdmF0ZSkKIAkJZ290byBvdXQ7CiAKLQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CiAJZWIgPSAoc3RydWN0IGV4dGVudF9idWZmZXIgKilwYWdlLT5wcml2YXRlOwogCiAJLyogdGhlIHBlbmRpbmcgSU8gbWlnaHQgaGF2ZSBiZWVuIHRoZSBvbmx5IHRoaW5nIHRoYXQga2VwdCB0aGlzIGJ1ZmZlcgpAQCAtNjAwLDIxICs1OTcsMjEgQEAKIAogCWZvdW5kX3N0YXJ0ID0gYnRyZnNfaGVhZGVyX2J5dGVucihlYik7CiAJaWYgKGZvdW5kX3N0YXJ0ICE9IGViLT5zdGFydCkgewotCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPICJidHJmcyBiYWQgdHJlZSBibG9jayBzdGFydCAiCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8gIkJUUkZTOiBiYWQgdHJlZSBibG9jayBzdGFydCAiCiAJCQkgICAgICAgIiVsbHUgJWxsdVxuIiwKIAkJCSAgICAgICBmb3VuZF9zdGFydCwgZWItPnN0YXJ0KTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnI7CiAJfQogCWlmIChjaGVja190cmVlX2Jsb2NrX2ZzaWQocm9vdCwgZWIpKSB7Ci0JCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8gImJ0cmZzIGJhZCBmc2lkIG9uIGJsb2NrICVsbHVcbiIsCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8gIkJUUkZTOiBiYWQgZnNpZCBvbiBibG9jayAlbGx1XG4iLAogCQkJICAgICAgIGViLT5zdGFydCk7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gZXJyOwogCX0KIAlmb3VuZF9sZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChlYik7CiAJaWYgKGZvdW5kX2xldmVsID49IEJUUkZTX01BWF9MRVZFTCkgewotCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJiYWQgdHJlZSBibG9jayBsZXZlbCAlZFxuIiwKKwkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAiYmFkIHRyZWUgYmxvY2sgbGV2ZWwgJWQiLAogCQkJICAgKGludClidHJmc19oZWFkZXJfbGV2ZWwoZWIpKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnI7CkBAIC04NDIsMjAgKzgzOSwxNyBAQAogCiBzdGF0aWMgaW50IGJ0cmVlX2NzdW1fb25lX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKLQlpbnQgYmlvX2luZGV4ID0gMDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgaSwgcmV0ID0gMDsKIAotCVdBUk5fT04oYmlvLT5iaV92Y250IDw9IDApOwotCXdoaWxlIChiaW9faW5kZXggPCBiaW8tPmJpX3ZjbnQpIHsKKwliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCXJvb3QgPSBCVFJGU19JKGJ2ZWMtPmJ2X3BhZ2UtPm1hcHBpbmctPmhvc3QpLT5yb290OwogCQlyZXQgPSBjc3VtX2RpcnR5X2J1ZmZlcihyb290LCBidmVjLT5idl9wYWdlKTsKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwotCQliaW9faW5kZXgrKzsKLQkJYnZlYysrOwogCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk2NywxMSArOTYxLDkgQEAKIHN0YXRpYyBpbnQgYnRyZWVfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCSAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKLQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CiAJaW50IHJldDsKIAotCXRyZWUgPSAmQlRSRlNfSShtYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKIAlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKSB7CiAKIAkJaWYgKHdiYy0+Zm9yX2t1cGRhdGUpCkBAIC0xMDEwLDggKzEwMDIsOSBAQAogCWV4dGVudF9pbnZhbGlkYXRlcGFnZSh0cmVlLCBwYWdlLCBvZmZzZXQpOwogCWJ0cmVlX3JlbGVhc2VwYWdlKHBhZ2UsIEdGUF9OT0ZTKTsKIAlpZiAoUGFnZVByaXZhdGUocGFnZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnMgd2FybmluZyBwYWdlIHByaXZhdGUgbm90IHplcm8gIgotCQkgICAgICAgIm9uIHBhZ2UgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwYWdlX29mZnNldChwYWdlKSk7CisJCWJ0cmZzX3dhcm4oQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdC0+ZnNfaW5mbywKKwkJCSAgICJwYWdlIHByaXZhdGUgbm90IHplcm8gb24gcGFnZSAlbGx1IiwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGFnZV9vZmZzZXQocGFnZSkpOwogCQlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOwogCQlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0xMDk1LDIxICsxMDg4LDEzIEBACiBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfZmluZF90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkgICAgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwotCWViID0gZmluZF9leHRlbnRfYnVmZmVyKCZCVFJGU19JKGJ0cmVlX2lub2RlKS0+aW9fdHJlZSwgYnl0ZW5yKTsKLQlyZXR1cm4gZWI7CisJcmV0dXJuIGZpbmRfZXh0ZW50X2J1ZmZlcihyb290LT5mc19pbmZvLCBieXRlbnIpOwogfQogCiBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfZmluZF9jcmVhdGVfdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJCSB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplKQogewotCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7Ci0KLQllYiA9IGFsbG9jX2V4dGVudF9idWZmZXIoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAotCQkJCSBieXRlbnIsIGJsb2Nrc2l6ZSk7Ci0JcmV0dXJuIGViOworCXJldHVybiBhbGxvY19leHRlbnRfYnVmZmVyKHJvb3QtPmZzX2luZm8sIGJ5dGVuciwgYmxvY2tzaXplKTsKIH0KIAogCkBAIC0xMjczLDcgKzEyNTgsNiBAQAogCXN0cnVjdCBidHJmc19yb290ICpyb290OwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCByZXQgPSAwOwotCXU2NCBieXRlbnI7CiAJdXVpZF9sZSB1dWlkOwogCiAJcm9vdCA9IGJ0cmZzX2FsbG9jX3Jvb3QoZnNfaW5mbyk7CkBAIC0xMjk1LDcgKzEyNzksNiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JYnl0ZW5yID0gbGVhZi0+c3RhcnQ7CiAJbWVtc2V0X2V4dGVudF9idWZmZXIobGVhZiwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBidHJmc19oZWFkZXIpKTsKIAlidHJmc19zZXRfaGVhZGVyX2J5dGVucihsZWFmLCBsZWFmLT5zdGFydCk7CiAJYnRyZnNfc2V0X2hlYWRlcl9nZW5lcmF0aW9uKGxlYWYsIHRyYW5zLT50cmFuc2lkKTsKQEAgLTE2MTYsNyArMTU5OSw4IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCi0JcmV0ID0gYnRyZnNfZmluZF9vcnBoYW5faXRlbShmc19pbmZvLT50cmVlX3Jvb3QsIGxvY2F0aW9uLT5vYmplY3RpZCk7CisJcmV0ID0gYnRyZnNfZmluZF9pdGVtKGZzX2luZm8tPnRyZWVfcm9vdCwgTlVMTCwgQlRSRlNfT1JQSEFOX09CSkVDVElELAorCQkJbG9jYXRpb24tPm9iamVjdGlkLCBCVFJGU19PUlBIQU5fSVRFTV9LRVksIE5VTEwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWw7CiAJaWYgKHJldCA9PSAwKQpAQCAtMTY4NCwxOCArMTY2OCwxNiBAQAogewogCXN0cnVjdCBiaW8gKmJpbzsKIAlzdHJ1Y3QgZW5kX2lvX3dxICplbmRfaW9fd3E7Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CiAJaW50IGVycm9yOwogCiAJZW5kX2lvX3dxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbmRfaW9fd3EsIHdvcmspOwogCWJpbyA9IGVuZF9pb193cS0+YmlvOwotCWZzX2luZm8gPSBlbmRfaW9fd3EtPmluZm87CiAKIAllcnJvciA9IGVuZF9pb193cS0+ZXJyb3I7CiAJYmlvLT5iaV9wcml2YXRlID0gZW5kX2lvX3dxLT5wcml2YXRlOwogCWJpby0+YmlfZW5kX2lvID0gZW5kX2lvX3dxLT5lbmRfaW87CiAJa2ZyZWUoZW5kX2lvX3dxKTsKLQliaW9fZW5kaW8oYmlvLCBlcnJvcik7CisJYmlvX2VuZGlvX25vZGVjKGJpbywgZXJyb3IpOwogfQogCiBzdGF0aWMgaW50IGNsZWFuZXJfa3RocmVhZCh2b2lkICphcmcpCkBAIC0yMDgwLDYgKzIwNjIsMTIgQEAKIAkJZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKQogCQkJYnRyZnNfZHJvcF9hbmRfZnJlZV9mc19yb290KGZzX2luZm8sIGdhbmdbaV0pOwogCX0KKworCWlmICh0ZXN0X2JpdChCVFJGU19GU19TVEFURV9FUlJPUiwgJmZzX2luZm8tPmZzX3N0YXRlKSkgeworCQlidHJmc19mcmVlX2xvZ19yb290X3RyZWUoTlVMTCwgZnNfaW5mbyk7CisJCWJ0cmZzX2Rlc3Ryb3lfcGlubmVkX2V4dGVudChmc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJCSAgICBmc19pbmZvLT5waW5uZWRfZXh0ZW50cyk7CisJfQogfQogCiBpbnQgb3Blbl9jdHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtMjE1NCw2ICsyMTQyLDcgQEAKIAltYXBwaW5nX3NldF9nZnBfbWFzayhmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBHRlBfTk9GUyk7CiAKIAlJTklUX1JBRElYX1RSRUUoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LCBHRlBfQVRPTUlDKTsKKwlJTklUX1JBRElYX1RSRUUoJmZzX2luZm8tPmJ1ZmZlcl9yYWRpeCwgR0ZQX0FUT01JQyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPnRyYW5zX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5kZWFkX3Jvb3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+ZGVsYXllZF9pcHV0cyk7CkBAIC0yMTY3LDYgKzIxNTYsNyBAQAogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5mcmVlX2NodW5rX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT50cmVlX21vZF9zZXFfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPnN1cGVyX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5idWZmZXJfbG9jayk7CiAJcndsb2NrX2luaXQoJmZzX2luZm8tPnRyZWVfbW9kX2xvZ19sb2NrKTsKIAltdXRleF9pbml0KCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiAJc2VxbG9ja19pbml0KCZmc19pbmZvLT5wcm9maWxlc19sb2NrKTsKQEAgLTIxOTgsNyArMjE4OCw3IEBACiAJZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSA9IDA7CiAJZnNfaW5mby0+dHJlZV9tb2RfbG9nID0gUkJfUk9PVDsKIAlmc19pbmZvLT5jb21taXRfaW50ZXJ2YWwgPSBCVFJGU19ERUZBVUxUX0NPTU1JVF9JTlRFUlZBTDsKLQorCWZzX2luZm8tPmF2Z19kZWxheWVkX3JlZl9ydW50aW1lID0gZGl2NjRfdTY0KE5TRUNfUEVSX1NFQywgNjQpOwogCS8qIHJlYWRhaGVhZCBzdGF0ZSAqLwogCUlOSVRfUkFESVhfVFJFRSgmZnNfaW5mby0+cmVhZGFfdHJlZSwgR0ZQX05PRlMgJiB+X19HRlBfV0FJVCk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPnJlYWRhX2xvY2spOwpAQCAtMjMzNyw3ICsyMzI3LDcgQEAKIAkgKiBQYXNzIHRoZSB3aG9sZSBkaXNrIGJsb2NrIG9mIHNpemUgQlRSRlNfU1VQRVJfSU5GT19TSVpFICg0aykuCiAJICovCiAJaWYgKGJ0cmZzX2NoZWNrX3N1cGVyX2NzdW0oYmgtPmJfZGF0YSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogc3VwZXJibG9jayBjaGVja3N1bSBtaXNtYXRjaFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IHN1cGVyYmxvY2sgY2hlY2tzdW0gbWlzbWF0Y2hcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGZhaWxfYWxsb2M7CiAJfQpAQCAtMjM1Niw3ICsyMzQ2LDcgQEAKIAogCXJldCA9IGJ0cmZzX2NoZWNrX3N1cGVyX3ZhbGlkKGZzX2luZm8sIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IHN1cGVyYmxvY2sgY29udGFpbnMgZmF0YWwgZXJyb3JzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogc3VwZXJibG9jayBjb250YWlucyBmYXRhbCBlcnJvcnNcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGZhaWxfYWxsb2M7CiAJfQpAQCAtMjQyMSw3ICsyNDExLDcgQEAKIAkJZmVhdHVyZXMgfD0gQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU19MWk87CiAKIAlpZiAoZmVhdHVyZXMgJiBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX1NLSU5OWV9NRVRBREFUQSkKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogaGFzIHNraW5ueSBleHRlbnRzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogaGFzIHNraW5ueSBleHRlbnRzXG4iKTsKIAogCS8qCiAJICogZmxhZyBvdXIgZmlsZXN5c3RlbSBhcyBoYXZpbmcgYmlnIG1ldGFkYXRhIGJsb2NrcyBpZgpAQCAtMjQyOSw3ICsyNDE5LDcgQEAKIAkgKi8KIAlpZiAoYnRyZnNfc3VwZXJfbGVhZnNpemUoZGlza19zdXBlcikgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKIAkJaWYgKCEoZmVhdHVyZXMgJiBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX0JJR19NRVRBREFUQSkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmcyBmbGFnZ2luZyBmcyB3aXRoIGJpZyBtZXRhZGF0YSBmZWF0dXJlXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkJUUkZTOiBmbGFnZ2luZyBmcyB3aXRoIGJpZyBtZXRhZGF0YSBmZWF0dXJlXG4iKTsKIAkJZmVhdHVyZXMgfD0gQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9CSUdfTUVUQURBVEE7CiAJfQogCkBAIC0yNDQ2LDcgKzI0MzYsNyBAQAogCSAqLwogCWlmICgoZmVhdHVyZXMgJiBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX01JWEVEX0dST1VQUykgJiYKIAkgICAgKHNlY3RvcnNpemUgIT0gbGVhZnNpemUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiB1bmVxdWFsIGxlYWYvbm9kZS9zZWN0b3Igc2l6ZXMgIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogdW5lcXVhbCBsZWFmL25vZGUvc2VjdG9yIHNpemVzICIKIAkJCQkiYXJlIG5vdCBhbGxvd2VkIGZvciBtaXhlZCBibG9jayBncm91cHMgb24gJXNcbiIsCiAJCQkJc2ItPnNfaWQpOwogCQlnb3RvIGZhaWxfYWxsb2M7CkBAIC0yNTgzLDEyICsyNTczLDEyIEBACiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBibGtzaXplX2JpdHMoc2VjdG9yc2l6ZSk7CiAKIAlpZiAoYnRyZnNfc3VwZXJfbWFnaWMoZGlza19zdXBlcikgIT0gQlRSRlNfTUFHSUMpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHZhbGlkIEZTIG5vdCBmb3VuZCBvbiAlc1xuIiwgc2ItPnNfaWQpOworCQlwcmludGsoS0VSTl9JTkZPICJCVFJGUzogdmFsaWQgRlMgbm90IGZvdW5kIG9uICVzXG4iLCBzYi0+c19pZCk7CiAJCWdvdG8gZmFpbF9zYl9idWZmZXI7CiAJfQogCiAJaWYgKHNlY3RvcnNpemUgIT0gUEFHRV9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBJbmNvbXBhdGlibGUgc2VjdG9yIHNpemUoJWx1KSAiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUUkZTOiBJbmNvbXBhdGlibGUgc2VjdG9yIHNpemUoJWx1KSAiCiAJCSAgICAgICAiZm91bmQgb24gJXNcbiIsICh1bnNpZ25lZCBsb25nKXNlY3RvcnNpemUsIHNiLT5zX2lkKTsKIAkJZ290byBmYWlsX3NiX2J1ZmZlcjsKIAl9CkBAIC0yNTk3LDcgKzI1ODcsNyBAQAogCXJldCA9IGJ0cmZzX3JlYWRfc3lzX2FycmF5KHRyZWVfcm9vdCk7CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5jaHVua19tdXRleCk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmczogZmFpbGVkIHRvIHJlYWQgdGhlIHN5c3RlbSAiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUUkZTOiBmYWlsZWQgdG8gcmVhZCB0aGUgc3lzdGVtICIKIAkJICAgICAgICJhcnJheSBvbiAlc1xuIiwgc2ItPnNfaWQpOwogCQlnb3RvIGZhaWxfc2JfYnVmZmVyOwogCX0KQEAgLTI2MTQsNyArMjYwNCw3IEBACiAJCQkJCSAgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CiAJaWYgKCFjaHVua19yb290LT5ub2RlIHx8CiAJICAgICF0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX1VQVE9EQVRFLCAmY2h1bmtfcm9vdC0+bm9kZS0+YmZsYWdzKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmczogZmFpbGVkIHRvIHJlYWQgY2h1bmsgcm9vdCBvbiAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6IGZhaWxlZCB0byByZWFkIGNodW5rIHJvb3Qgb24gJXNcbiIsCiAJCSAgICAgICBzYi0+c19pZCk7CiAJCWdvdG8gZmFpbF90cmVlX3Jvb3RzOwogCX0KQEAgLTI2MjYsNyArMjYxNiw3IEBACiAKIAlyZXQgPSBidHJmc19yZWFkX2NodW5rX3RyZWUoY2h1bmtfcm9vdCk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmczogZmFpbGVkIHRvIHJlYWQgY2h1bmsgdHJlZSBvbiAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6IGZhaWxlZCB0byByZWFkIGNodW5rIHRyZWUgb24gJXNcbiIsCiAJCSAgICAgICBzYi0+c19pZCk7CiAJCWdvdG8gZmFpbF90cmVlX3Jvb3RzOwogCX0KQEAgLTI2MzgsNyArMjYyOCw3IEBACiAJYnRyZnNfY2xvc2VfZXh0cmFfZGV2aWNlcyhmc19pbmZvLCBmc19kZXZpY2VzLCAwKTsKIAogCWlmICghZnNfZGV2aWNlcy0+bGF0ZXN0X2JkZXYpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYnRyZnM6IGZhaWxlZCB0byByZWFkIGRldmljZXMgb24gJXNcbiIsCisJCXByaW50ayhLRVJOX0NSSVQgIkJUUkZTOiBmYWlsZWQgdG8gcmVhZCBkZXZpY2VzIG9uICVzXG4iLAogCQkgICAgICAgc2ItPnNfaWQpOwogCQlnb3RvIGZhaWxfdHJlZV9yb290czsKIAl9CkBAIC0yNjUzLDcgKzI2NDMsNyBAQAogCQkJCQkgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CiAJaWYgKCF0cmVlX3Jvb3QtPm5vZGUgfHwKIAkgICAgIXRlc3RfYml0KEVYVEVOVF9CVUZGRVJfVVBUT0RBVEUsICZ0cmVlX3Jvb3QtPm5vZGUtPmJmbGFncykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIHRyZWUgcm9vdCBvbiAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6IGZhaWxlZCB0byByZWFkIHRyZWUgcm9vdCBvbiAlc1xuIiwKIAkJICAgICAgIHNiLT5zX2lkKTsKIAogCQlnb3RvIHJlY292ZXJ5X3RyZWVfcm9vdDsKQEAgLTI3MjQsNTAgKzI3MTQsNTYgQEAKIAogCXJldCA9IGJ0cmZzX3JlY292ZXJfYmFsYW5jZShmc19pbmZvKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBmYWlsZWQgdG8gcmVjb3ZlciBiYWxhbmNlXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6IGZhaWxlZCB0byByZWNvdmVyIGJhbGFuY2VcbiIpOwogCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOwogCX0KIAogCXJldCA9IGJ0cmZzX2luaXRfZGV2X3N0YXRzKGZzX2luZm8pOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZmFpbGVkIHRvIGluaXQgZGV2X3N0YXRzOiAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogZmFpbGVkIHRvIGluaXQgZGV2X3N0YXRzOiAlZFxuIiwKIAkJICAgICAgIHJldCk7CiAJCWdvdG8gZmFpbF9ibG9ja19ncm91cHM7CiAJfQogCiAJcmV0ID0gYnRyZnNfaW5pdF9kZXZfcmVwbGFjZShmc19pbmZvKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiYnRyZnM6IGZhaWxlZCB0byBpbml0IGRldl9yZXBsYWNlOiAlZFxuIiwgcmV0KTsKKwkJcHJfZXJyKCJCVFJGUzogZmFpbGVkIHRvIGluaXQgZGV2X3JlcGxhY2U6ICVkXG4iLCByZXQpOwogCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOwogCX0KIAogCWJ0cmZzX2Nsb3NlX2V4dHJhX2RldmljZXMoZnNfaW5mbywgZnNfZGV2aWNlcywgMSk7CiAKKwlyZXQgPSBidHJmc19zeXNmc19hZGRfb25lKGZzX2luZm8pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJCVFJGUzogZmFpbGVkIHRvIGluaXQgc3lzZnMgaW50ZXJmYWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsX2Jsb2NrX2dyb3VwczsKKwl9CisKIAlyZXQgPSBidHJmc19pbml0X3NwYWNlX2luZm8oZnNfaW5mbyk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBpbml0aWFsIHNwYWNlIGluZm86ICVkXG4iLCByZXQpOwotCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOworCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBGYWlsZWQgdG8gaW5pdGlhbCBzcGFjZSBpbmZvOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsX3N5c2ZzOwogCX0KIAogCXJldCA9IGJ0cmZzX3JlYWRfYmxvY2tfZ3JvdXBzKGV4dGVudF9yb290KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlYWQgYmxvY2sgZ3JvdXBzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsX2Jsb2NrX2dyb3VwczsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogRmFpbGVkIHRvIHJlYWQgYmxvY2sgZ3JvdXBzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsX3N5c2ZzOwogCX0KIAlmc19pbmZvLT5udW1fdG9sZXJhdGVkX2Rpc2tfYmFycmllcl9mYWlsdXJlcyA9CiAJCWJ0cmZzX2NhbGNfbnVtX3RvbGVyYXRlZF9kaXNrX2JhcnJpZXJfZmFpbHVyZXMoZnNfaW5mbyk7CiAJaWYgKGZzX2luZm8tPmZzX2RldmljZXMtPm1pc3NpbmdfZGV2aWNlcyA+CiAJICAgICBmc19pbmZvLT5udW1fdG9sZXJhdGVkX2Rpc2tfYmFycmllcl9mYWlsdXJlcyAmJgogCSAgICAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiQnRyZnM6IHRvbyBtYW55IG1pc3NpbmcgZGV2aWNlcywgd3JpdGVhYmxlIG1vdW50IGlzIG5vdCBhbGxvd2VkXG4iKTsKLQkJZ290byBmYWlsX2Jsb2NrX2dyb3VwczsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6ICIKKwkJCSJ0b28gbWFueSBtaXNzaW5nIGRldmljZXMsIHdyaXRlYWJsZSBtb3VudCBpcyBub3QgYWxsb3dlZFxuIik7CisJCWdvdG8gZmFpbF9zeXNmczsKIAl9CiAKIAlmc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQgPSBrdGhyZWFkX3J1bihjbGVhbmVyX2t0aHJlYWQsIHRyZWVfcm9vdCwKIAkJCQkJICAgICAgICJidHJmcy1jbGVhbmVyIik7CiAJaWYgKElTX0VSUihmc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpKQotCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOworCQlnb3RvIGZhaWxfc3lzZnM7CiAKIAlmc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkID0ga3RocmVhZF9ydW4odHJhbnNhY3Rpb25fa3RocmVhZCwKIAkJCQkJCSAgIHRyZWVfcm9vdCwKQEAgLTI3NzgsMTEgKzI3NzQsMTUgQEAKIAlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHRyZWVfcm9vdCwgU1NEKSAmJgogCSAgICAhYnRyZnNfdGVzdF9vcHQodHJlZV9yb290LCBOT1NTRCkgJiYKIAkgICAgIWZzX2luZm8tPmZzX2RldmljZXMtPnJvdGF0aW5nKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkJ0cmZzIGRldGVjdGVkIFNTRCBkZXZpY2VzLCBlbmFibGluZyBTU0QgIgorCQlwcmludGsoS0VSTl9JTkZPICJCVFJGUzogZGV0ZWN0ZWQgU1NEIGRldmljZXMsIGVuYWJsaW5nIFNTRCAiCiAJCSAgICAgICAibW9kZVxuIik7CiAJCWJ0cmZzX3NldF9vcHQoZnNfaW5mby0+bW91bnRfb3B0LCBTU0QpOwogCX0KIAorCS8qIFNldCB0aGUgcmVhbCBpbm9kZSBtYXAgY2FjaGUgZmxhZyAqLworCWlmIChidHJmc190ZXN0X29wdCh0cmVlX3Jvb3QsIENIQU5HRV9JTk9ERV9DQUNIRSkpCisJCWJ0cmZzX3NldF9vcHQodHJlZV9yb290LT5mc19pbmZvLT5tb3VudF9vcHQsIElOT0RFX01BUF9DQUNIRSk7CisKICNpZmRlZiBDT05GSUdfQlRSRlNfRlNfQ0hFQ0tfSU5URUdSSVRZCiAJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHRyZWVfcm9vdCwgQ0hFQ0tfSU5URUdSSVRZKSkgewogCQlyZXQgPSBidHJmc2ljX21vdW50KHRyZWVfcm9vdCwgZnNfZGV2aWNlcywKQEAgLTI3OTEsNyArMjc5MSw3IEBACiAJCQkJICAgIDEgOiAwLAogCQkJCSAgICBmc19pbmZvLT5jaGVja19pbnRlZ3JpdHlfcHJpbnRfbWFzayk7CiAJCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmczogZmFpbGVkIHRvIGluaXRpYWxpemUiCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogZmFpbGVkIHRvIGluaXRpYWxpemUiCiAJCQkgICAgICAgIiBpbnRlZ3JpdHkgY2hlY2sgbW9kdWxlICVzXG4iLCBzYi0+c19pZCk7CiAJfQogI2VuZGlmCkBAIC0yODA0LDcgKzI4MDQsNyBAQAogCQl1NjQgYnl0ZW5yID0gYnRyZnNfc3VwZXJfbG9nX3Jvb3QoZGlza19zdXBlcik7CiAKIAkJaWYgKGZzX2RldmljZXMtPnJ3X2RldmljZXMgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQnRyZnMgbG9nIHJlcGxheSByZXF1aXJlZCAiCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogbG9nIHJlcGxheSByZXF1aXJlZCAiCiAJCQkgICAgICAgIm9uIFJPIG1lZGlhXG4iKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGZhaWxfcWdyb3VwOwpAQCAtMjgyNyw3ICsyODI3LDcgQEAKIAkJCQkJCSAgICAgIGdlbmVyYXRpb24gKyAxKTsKIAkJaWYgKCFsb2dfdHJlZV9yb290LT5ub2RlIHx8CiAJCSAgICAhZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShsb2dfdHJlZV9yb290LT5ub2RlKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZmFpbGVkIHRvIHJlYWQgbG9nIHRyZWVcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogZmFpbGVkIHRvIHJlYWQgbG9nIHRyZWVcbiIpOwogCQkJZnJlZV9leHRlbnRfYnVmZmVyKGxvZ190cmVlX3Jvb3QtPm5vZGUpOwogCQkJa2ZyZWUobG9nX3RyZWVfcm9vdCk7CiAJCQlnb3RvIGZhaWxfdHJhbnNfa3RocmVhZDsKQEAgLTI4NjEsNyArMjg2MSw3IEBACiAJCXJldCA9IGJ0cmZzX3JlY292ZXJfcmVsb2NhdGlvbih0cmVlX3Jvb3QpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJidHJmczogZmFpbGVkIHRvIHJlY292ZXIgcmVsb2NhdGlvblxuIik7CisJCQkgICAgICAgIkJUUkZTOiBmYWlsZWQgdG8gcmVjb3ZlciByZWxvY2F0aW9uXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGZhaWxfcWdyb3VwOwogCQl9CkBAIC0yODkxLDE0ICsyODkxLDE0IEBACiAKIAlyZXQgPSBidHJmc19yZXN1bWVfYmFsYW5jZV9hc3luYyhmc19pbmZvKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBmYWlsZWQgdG8gcmVzdW1lIGJhbGFuY2VcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogZmFpbGVkIHRvIHJlc3VtZSBiYWxhbmNlXG4iKTsKIAkJY2xvc2VfY3RyZWUodHJlZV9yb290KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBidHJmc19yZXN1bWVfZGV2X3JlcGxhY2VfYXN5bmMoZnNfaW5mbyk7CiAJaWYgKHJldCkgewotCQlwcl93YXJuKCJidHJmczogZmFpbGVkIHRvIHJlc3VtZSBkZXZfcmVwbGFjZVxuIik7CisJCXByX3dhcm4oIkJUUkZTOiBmYWlsZWQgdG8gcmVzdW1lIGRldl9yZXBsYWNlXG4iKTsKIAkJY2xvc2VfY3RyZWUodHJlZV9yb290KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0yOTA2LDIwICsyOTA2LDIwIEBACiAJYnRyZnNfcWdyb3VwX3Jlc2Nhbl9yZXN1bWUoZnNfaW5mbyk7CiAKIAlpZiAoY3JlYXRlX3V1aWRfdHJlZSkgewotCQlwcl9pbmZvKCJidHJmczogY3JlYXRpbmcgVVVJRCB0cmVlXG4iKTsKKwkJcHJfaW5mbygiQlRSRlM6IGNyZWF0aW5nIFVVSUQgdHJlZVxuIik7CiAJCXJldCA9IGJ0cmZzX2NyZWF0ZV91dWlkX3RyZWUoZnNfaW5mbyk7CiAJCWlmIChyZXQpIHsKLQkJCXByX3dhcm4oImJ0cmZzOiBmYWlsZWQgdG8gY3JlYXRlIHRoZSBVVUlEIHRyZWUgJWRcbiIsCisJCQlwcl93YXJuKCJCVFJGUzogZmFpbGVkIHRvIGNyZWF0ZSB0aGUgVVVJRCB0cmVlICVkXG4iLAogCQkJCXJldCk7CiAJCQljbG9zZV9jdHJlZSh0cmVlX3Jvb3QpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0gZWxzZSBpZiAoY2hlY2tfdXVpZF90cmVlIHx8CiAJCSAgIGJ0cmZzX3Rlc3Rfb3B0KHRyZWVfcm9vdCwgUkVTQ0FOX1VVSURfVFJFRSkpIHsKLQkJcHJfaW5mbygiYnRyZnM6IGNoZWNraW5nIFVVSUQgdHJlZVxuIik7CisJCXByX2luZm8oIkJUUkZTOiBjaGVja2luZyBVVUlEIHRyZWVcbiIpOwogCQlyZXQgPSBidHJmc19jaGVja191dWlkX3RyZWUoZnNfaW5mbyk7CiAJCWlmIChyZXQpIHsKLQkJCXByX3dhcm4oImJ0cmZzOiBmYWlsZWQgdG8gY2hlY2sgdGhlIFVVSUQgdHJlZSAlZFxuIiwKKwkJCXByX3dhcm4oIkJUUkZTOiBmYWlsZWQgdG8gY2hlY2sgdGhlIFVVSUQgdHJlZSAlZFxuIiwKIAkJCQlyZXQpOwogCQkJY2xvc2VfY3RyZWUodHJlZV9yb290KTsKIAkJCXJldHVybiByZXQ7CkBAIC0yOTQ1LDYgKzI5NDUsOSBAQAogCSAqLwogCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CiAKK2ZhaWxfc3lzZnM6CisJYnRyZnNfc3lzZnNfcmVtb3ZlX29uZShmc19pbmZvKTsKKwogZmFpbF9ibG9ja19ncm91cHM6CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwX2NhY2hlKGZzX2luZm8pOwogCWJ0cmZzX2ZyZWVfYmxvY2tfZ3JvdXBzKGZzX2luZm8pOwpAQCAtMzAwMCw3ICszMDAzLDcgQEAKIAkJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBidHJmc19kZXZpY2UgKikKIAkJCWJoLT5iX3ByaXZhdGU7CiAKLQkJcHJpbnRrX3JhdGVsaW1pdGVkX2luX3JjdShLRVJOX1dBUk5JTkcgImxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gIgorCQlwcmludGtfcmF0ZWxpbWl0ZWRfaW5fcmN1KEtFUk5fV0FSTklORyAiQlRSRlM6IGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gIgogCQkJCQkgICJJL08gZXJyb3Igb24gJXNcbiIsCiAJCQkJCSAgcmN1X3N0cl9kZXJlZihkZXZpY2UtPm5hbWUpKTsKIAkJLyogbm90ZSwgd2UgZG9udCcgc2V0X2J1ZmZlcl93cml0ZV9pb19lcnJvciBiZWNhdXNlIHdlIGhhdmUKQEAgLTMxMTksNyArMzEyMiw3IEBACiAJCQliaCA9IF9fZ2V0YmxrKGRldmljZS0+YmRldiwgYnl0ZW5yIC8gNDA5NiwKIAkJCQkgICAgICBCVFJGU19TVVBFUl9JTkZPX1NJWkUpOwogCQkJaWYgKCFiaCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGNvdWxkbid0IGdldCBzdXBlciAiCisJCQkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogY291bGRuJ3QgZ2V0IHN1cGVyICIKIAkJCQkgICAgICAgImJ1ZmZlciBoZWFkIGZvciBieXRlbnIgJUx1XG4iLCBieXRlbnIpOwogCQkJCWVycm9ycysrOwogCQkJCWNvbnRpbnVlOwpAQCAtMzE0MCw3ICszMTQzLDEwIEBACiAJCSAqIHdlIGZ1YSB0aGUgZmlyc3Qgc3VwZXIuICBUaGUgb3RoZXJzIHdlIGFsbG93CiAJCSAqIHRvIGdvIGRvd24gbGF6eS4KIAkJICovCi0JCXJldCA9IGJ0cmZzaWNfc3VibWl0X2JoKFdSSVRFX0ZVQSwgYmgpOworCQlpZiAoaSA9PSAwKQorCQkJcmV0ID0gYnRyZnNpY19zdWJtaXRfYmgoV1JJVEVfRlVBLCBiaCk7CisJCWVsc2UKKwkJCXJldCA9IGJ0cmZzaWNfc3VibWl0X2JoKFdSSVRFX1NZTkMsIGJoKTsKIAkJaWYgKHJldCkKIAkJCWVycm9ycysrOwogCX0KQEAgLTMxODYsNyArMzE5Miw3IEBACiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRldmljZS0+Zmx1c2hfd2FpdCk7CiAKIAkJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKSB7Ci0JCQlwcmludGtfaW5fcmN1KCJidHJmczogZGlzYWJsaW5nIGJhcnJpZXJzIG9uIGRldiAlc1xuIiwKKwkJCXByaW50a19pbl9yY3UoIkJUUkZTOiBkaXNhYmxpbmcgYmFycmllcnMgb24gZGV2ICVzXG4iLAogCQkJCSAgICAgIHJjdV9zdHJfZGVyZWYoZGV2aWNlLT5uYW1lKSk7CiAJCQlkZXZpY2UtPm5vYmFycmllcnMgPSAxOwogCQl9IGVsc2UgaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkpIHsKQEAgLTM0MDcsNyArMzQxMyw3IEBACiAJCQl0b3RhbF9lcnJvcnMrKzsKIAl9CiAJaWYgKHRvdGFsX2Vycm9ycyA+IG1heF9lcnJvcnMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogJWQgZXJyb3JzIHdoaWxlIHdyaXRpbmcgc3VwZXJzXG4iLAorCQlidHJmc19lcnIocm9vdC0+ZnNfaW5mbywgIiVkIGVycm9ycyB3aGlsZSB3cml0aW5nIHN1cGVycyIsCiAJCSAgICAgICB0b3RhbF9lcnJvcnMpOwogCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKIApAQCAtMzQ1NSwxMCArMzQ2MSw4IEBACiAJaWYgKGJ0cmZzX3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtKSA9PSAwKQogCQlzeW5jaHJvbml6ZV9zcmN1KCZmc19pbmZvLT5zdWJ2b2xfc3JjdSk7CiAKLQlpZiAodGVzdF9iaXQoQlRSRlNfRlNfU1RBVEVfRVJST1IsICZmc19pbmZvLT5mc19zdGF0ZSkpIHsKKwlpZiAodGVzdF9iaXQoQlRSRlNfRlNfU1RBVEVfRVJST1IsICZmc19pbmZvLT5mc19zdGF0ZSkpCiAJCWJ0cmZzX2ZyZWVfbG9nKE5VTEwsIHJvb3QpOwotCQlidHJmc19mcmVlX2xvZ19yb290X3RyZWUoTlVMTCwgZnNfaW5mbyk7Ci0JfQogCiAJX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShyb290LT5mcmVlX2lub19waW5uZWQpOwogCV9fYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2VfY2FjaGUocm9vdC0+ZnJlZV9pbm9fY3RsKTsKQEAgLTM1NjMsMTQgKzM1NjcsMTIgQEAKIAlpZiAoIShmc19pbmZvLT5zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJcmV0ID0gYnRyZnNfY29tbWl0X3N1cGVyKHJvb3QpOwogCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogY29tbWl0IHN1cGVyIHJldCAlZFxuIiwgcmV0KTsKKwkJCWJ0cmZzX2Vycihyb290LT5mc19pbmZvLCAiY29tbWl0IHN1cGVyIHJldCAlZCIsIHJldCk7CiAJfQogCiAJaWYgKHRlc3RfYml0KEJUUkZTX0ZTX1NUQVRFX0VSUk9SLCAmZnNfaW5mby0+ZnNfc3RhdGUpKQogCQlidHJmc19lcnJvcl9jb21taXRfc3VwZXIocm9vdCk7CiAKLQlidHJmc19wdXRfYmxvY2tfZ3JvdXBfY2FjaGUoZnNfaW5mbyk7Ci0KIAlrdGhyZWFkX3N0b3AoZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZCk7CiAJa3RocmVhZF9zdG9wKGZzX2luZm8tPmNsZWFuZXJfa3RocmVhZCk7CiAKQEAgLTM1ODAsMTIgKzM1ODIsMTYgQEAKIAlidHJmc19mcmVlX3Fncm91cF9jb25maWcocm9vdC0+ZnNfaW5mbyk7CiAKIAlpZiAocGVyY3B1X2NvdW50ZXJfc3VtKCZmc19pbmZvLT5kZWxhbGxvY19ieXRlcykpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGF0IHVubW91bnQgZGVsYWxsb2MgY291bnQgJWxsZFxuIiwKKwkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAiYXQgdW5tb3VudCBkZWxhbGxvYyBjb3VudCAlbGxkIiwKIAkJICAgICAgIHBlcmNwdV9jb3VudGVyX3N1bSgmZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMpKTsKIAl9CiAKKwlidHJmc19zeXNmc19yZW1vdmVfb25lKGZzX2luZm8pOworCiAJZGVsX2ZzX3Jvb3RzKGZzX2luZm8pOwogCisJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwX2NhY2hlKGZzX2luZm8pOworCiAJYnRyZnNfZnJlZV9ibG9ja19ncm91cHMoZnNfaW5mbyk7CiAKIAlidHJmc19zdG9wX2FsbF93b3JrZXJzKGZzX2luZm8pOwpAQCAtMzgwMyw1NSArMzgwOSw1NSBAQAogCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+ZGVsYXllZF9yZWZzOwogCiAJc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCWlmIChkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzID09IDApIHsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbGF5ZWRfcmVmcy0+bnVtX2VudHJpZXMpID09IDApIHsKIAkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7Ci0JCXByaW50ayhLRVJOX0lORk8gImRlbGF5ZWRfcmVmcyBoYXMgTk8gZW50cnlcbiIpOworCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJkZWxheWVkX3JlZnMgaGFzIE5PIGVudHJ5Iik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0Jd2hpbGUgKChub2RlID0gcmJfZmlyc3QoJmRlbGF5ZWRfcmVmcy0+cm9vdCkpICE9IE5VTEwpIHsKLQkJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmhlYWQgPSBOVUxMOworCXdoaWxlICgobm9kZSA9IHJiX2ZpcnN0KCZkZWxheWVkX3JlZnMtPmhyZWZfcm9vdCkpICE9IE5VTEwpIHsKKwkJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmhlYWQ7CiAJCWJvb2wgcGluX2J5dGVzID0gZmFsc2U7CiAKLQkJcmVmID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsIHJiX25vZGUpOwotCQlhdG9taWNfc2V0KCZyZWYtPnJlZnMsIDEpOwotCQlpZiAoYnRyZnNfZGVsYXllZF9yZWZfaXNfaGVhZChyZWYpKSB7CisJCWhlYWQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCwKKwkJCQlocmVmX25vZGUpOworCQlpZiAoIW11dGV4X3RyeWxvY2soJmhlYWQtPm11dGV4KSkgeworCQkJYXRvbWljX2luYygmaGVhZC0+bm9kZS5yZWZzKTsKKwkJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwogCi0JCQloZWFkID0gYnRyZnNfZGVsYXllZF9ub2RlX3RvX2hlYWQocmVmKTsKLQkJCWlmICghbXV0ZXhfdHJ5bG9jaygmaGVhZC0+bXV0ZXgpKSB7Ci0JCQkJYXRvbWljX2luYygmcmVmLT5yZWZzKTsKLQkJCQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKLQotCQkJCS8qIE5lZWQgdG8gd2FpdCBmb3IgdGhlIGRlbGF5ZWQgcmVmIHRvIHJ1biAqLwotCQkJCW11dGV4X2xvY2soJmhlYWQtPm11dGV4KTsKLQkJCQltdXRleF91bmxvY2soJmhlYWQtPm11dGV4KTsKLQkJCQlidHJmc19wdXRfZGVsYXllZF9yZWYocmVmKTsKLQotCQkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGhlYWQtPm11c3RfaW5zZXJ0X3Jlc2VydmVkKQotCQkJCXBpbl9ieXRlcyA9IHRydWU7Ci0JCQlidHJmc19mcmVlX2RlbGF5ZWRfZXh0ZW50X29wKGhlYWQtPmV4dGVudF9vcCk7Ci0JCQlkZWxheWVkX3JlZnMtPm51bV9oZWFkcy0tOwotCQkJaWYgKGxpc3RfZW1wdHkoJmhlYWQtPmNsdXN0ZXIpKQotCQkJCWRlbGF5ZWRfcmVmcy0+bnVtX2hlYWRzX3JlYWR5LS07Ci0JCQlsaXN0X2RlbF9pbml0KCZoZWFkLT5jbHVzdGVyKTsKLQkJfQotCi0JCXJlZi0+aW5fdHJlZSA9IDA7Ci0JCXJiX2VyYXNlKCZyZWYtPnJiX25vZGUsICZkZWxheWVkX3JlZnMtPnJvb3QpOwotCQlkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzLS07Ci0JCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCQlpZiAoaGVhZCkgewotCQkJaWYgKHBpbl9ieXRlcykKLQkJCQlidHJmc19waW5fZXh0ZW50KHJvb3QsIHJlZi0+Ynl0ZW5yLAotCQkJCQkJIHJlZi0+bnVtX2J5dGVzLCAxKTsKKwkJCW11dGV4X2xvY2soJmhlYWQtPm11dGV4KTsKIAkJCW11dGV4X3VubG9jaygmaGVhZC0+bXV0ZXgpOworCQkJYnRyZnNfcHV0X2RlbGF5ZWRfcmVmKCZoZWFkLT5ub2RlKTsKKwkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCWJ0cmZzX3B1dF9kZWxheWVkX3JlZihyZWYpOworCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOworCQl3aGlsZSAoKG5vZGUgPSByYl9maXJzdCgmaGVhZC0+cmVmX3Jvb3QpKSAhPSBOVUxMKSB7CisJCQlyZWYgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSwKKwkJCQkgICAgICAgcmJfbm9kZSk7CisJCQlyZWYtPmluX3RyZWUgPSAwOworCQkJcmJfZXJhc2UoJnJlZi0+cmJfbm9kZSwgJmhlYWQtPnJlZl9yb290KTsKKwkJCWF0b21pY19kZWMoJmRlbGF5ZWRfcmVmcy0+bnVtX2VudHJpZXMpOworCQkJYnRyZnNfcHV0X2RlbGF5ZWRfcmVmKHJlZik7CisJCQljb25kX3Jlc2NoZWRfbG9jaygmaGVhZC0+bG9jayk7CisJCX0KKwkJaWYgKGhlYWQtPm11c3RfaW5zZXJ0X3Jlc2VydmVkKQorCQkJcGluX2J5dGVzID0gdHJ1ZTsKKwkJYnRyZnNfZnJlZV9kZWxheWVkX2V4dGVudF9vcChoZWFkLT5leHRlbnRfb3ApOworCQlkZWxheWVkX3JlZnMtPm51bV9oZWFkcy0tOworCQlpZiAoaGVhZC0+cHJvY2Vzc2luZyA9PSAwKQorCQkJZGVsYXllZF9yZWZzLT5udW1faGVhZHNfcmVhZHktLTsKKwkJYXRvbWljX2RlYygmZGVsYXllZF9yZWZzLT5udW1fZW50cmllcyk7CisJCWhlYWQtPm5vZGUuaW5fdHJlZSA9IDA7CisJCXJiX2VyYXNlKCZoZWFkLT5ocmVmX25vZGUsICZkZWxheWVkX3JlZnMtPmhyZWZfcm9vdCk7CisJCXNwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJCW11dGV4X3VubG9jaygmaGVhZC0+bXV0ZXgpOwogCisJCWlmIChwaW5fYnl0ZXMpCisJCQlidHJmc19waW5fZXh0ZW50KHJvb3QsIGhlYWQtPm5vZGUuYnl0ZW5yLAorCQkJCQkgaGVhZC0+bm9kZS5udW1fYnl0ZXMsIDEpOworCQlidHJmc19wdXRfZGVsYXllZF9yZWYoJmhlYWQtPm5vZGUpOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDljMDE1MDkuLjMyMzEyZTAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImxvY2tpbmcuaCIKICNpbmNsdWRlICJmcmVlLXNwYWNlLWNhY2hlLmgiCiAjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgInN5c2ZzLmgiCiAKICN1bmRlZiBTQ1JBTUJMRV9ERUxBWUVEX1JFRlMKIApAQCAtNDQxLDcgKzQ0Miw4IEBACiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCi0JCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJCWlmIChuZWVkX3Jlc2NoZWQoKSB8fAorCQkJICAgIHJ3c2VtX2lzX2NvbnRlbmRlZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pKSB7CiAJCQkJY2FjaGluZ19jdGwtPnByb2dyZXNzID0gbGFzdDsKIAkJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJCQkJdXBfcmVhZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOwpAQCAtODU1LDEyICs4NTcsMTQgQEAKIAkJCWJ0cmZzX3B1dF9kZWxheWVkX3JlZigmaGVhZC0+bm9kZSk7CiAJCQlnb3RvIHNlYXJjaF9hZ2FpbjsKIAkJfQorCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOwogCQlpZiAoaGVhZC0+ZXh0ZW50X29wICYmIGhlYWQtPmV4dGVudF9vcC0+dXBkYXRlX2ZsYWdzKQogCQkJZXh0ZW50X2ZsYWdzIHw9IGhlYWQtPmV4dGVudF9vcC0+ZmxhZ3NfdG9fc2V0OwogCQllbHNlCiAJCQlCVUdfT04obnVtX3JlZnMgPT0gMCk7CiAKIAkJbnVtX3JlZnMgKz0gaGVhZC0+bm9kZS5yZWZfbW9kOworCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CiAJCW11dGV4X3VubG9jaygmaGVhZC0+bXV0ZXgpOwogCX0KIAlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKQEAgLTEwNzAsMTEgKzEwNzQsMTEgQEAKIAlfX2xlNjQgbGVudW07CiAKIAlsZW51bSA9IGNwdV90b19sZTY0KHJvb3Rfb2JqZWN0aWQpOwotCWhpZ2hfY3JjID0gY3JjMzJjKGhpZ2hfY3JjLCAmbGVudW0sIHNpemVvZihsZW51bSkpOworCWhpZ2hfY3JjID0gYnRyZnNfY3JjMzJjKGhpZ2hfY3JjLCAmbGVudW0sIHNpemVvZihsZW51bSkpOwogCWxlbnVtID0gY3B1X3RvX2xlNjQob3duZXIpOwotCWxvd19jcmMgPSBjcmMzMmMobG93X2NyYywgJmxlbnVtLCBzaXplb2YobGVudW0pKTsKKwlsb3dfY3JjID0gYnRyZnNfY3JjMzJjKGxvd19jcmMsICZsZW51bSwgc2l6ZW9mKGxlbnVtKSk7CiAJbGVudW0gPSBjcHVfdG9fbGU2NChvZmZzZXQpOwotCWxvd19jcmMgPSBjcmMzMmMobG93X2NyYywgJmxlbnVtLCBzaXplb2YobGVudW0pKTsKKwlsb3dfY3JjID0gYnRyZnNfY3JjMzJjKGxvd19jcmMsICZsZW51bSwgc2l6ZW9mKGxlbnVtKSk7CiAKIAlyZXR1cm4gKCh1NjQpaGlnaF9jcmMgPDwgMzEpIF4gKHU2NClsb3dfY3JjOwogfQpAQCAtMjI4NSw2NCArMjI4OSw2MiBAQAogc2VsZWN0X2RlbGF5ZWRfcmVmKHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkKQogewogCXN0cnVjdCByYl9ub2RlICpub2RlOwotCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWY7Ci0JaW50IGFjdGlvbiA9IEJUUkZTX0FERF9ERUxBWUVEX1JFRjsKLWFnYWluOgorCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWYsICpsYXN0ID0gTlVMTDs7CisKIAkvKgogCSAqIHNlbGVjdCBkZWxheWVkIHJlZiBvZiB0eXBlIEJUUkZTX0FERF9ERUxBWUVEX1JFRiBmaXJzdC4KIAkgKiB0aGlzIHByZXZlbnRzIHJlZiBjb3VudCBmcm9tIGdvaW5nIGRvd24gdG8gemVybyB3aGVuCiAJICogdGhlcmUgc3RpbGwgYXJlIHBlbmRpbmcgZGVsYXllZCByZWYuCiAJICovCi0Jbm9kZSA9IHJiX3ByZXYoJmhlYWQtPm5vZGUucmJfbm9kZSk7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFub2RlKQotCQkJYnJlYWs7CisJbm9kZSA9IHJiX2ZpcnN0KCZoZWFkLT5yZWZfcm9vdCk7CisJd2hpbGUgKG5vZGUpIHsKIAkJcmVmID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsCiAJCQkJcmJfbm9kZSk7Ci0JCWlmIChyZWYtPmJ5dGVuciAhPSBoZWFkLT5ub2RlLmJ5dGVucikKLQkJCWJyZWFrOwotCQlpZiAocmVmLT5hY3Rpb24gPT0gYWN0aW9uKQorCQlpZiAocmVmLT5hY3Rpb24gPT0gQlRSRlNfQUREX0RFTEFZRURfUkVGKQogCQkJcmV0dXJuIHJlZjsKLQkJbm9kZSA9IHJiX3ByZXYobm9kZSk7CisJCWVsc2UgaWYgKGxhc3QgPT0gTlVMTCkKKwkJCWxhc3QgPSByZWY7CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOwogCX0KLQlpZiAoYWN0aW9uID09IEJUUkZTX0FERF9ERUxBWUVEX1JFRikgewotCQlhY3Rpb24gPSBCVFJGU19EUk9QX0RFTEFZRURfUkVGOwotCQlnb3RvIGFnYWluOwotCX0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbGFzdDsKIH0KIAogLyoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGlmIGNhbGxlZCB3aXRoIGFuIGFscmVhZHkgYWJvcnRlZCB0cmFuc2FjdGlvbi4KICAqIFJldHVybnMgLUVOT01FTSBvciAtRUlPIG9uIGZhaWx1cmUgYW5kIHdpbGwgYWJvcnQgdGhlIHRyYW5zYWN0aW9uLgogICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IHJ1bl9jbHVzdGVyZWRfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmNsdXN0ZXIpCitzdGF0aWMgbm9pbmxpbmUgaW50IF9fYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIG5yKQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnM7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZjsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqbG9ja2VkX3JlZiA9IE5VTEw7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wICpleHRlbnRfb3A7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOworCWt0aW1lX3Qgc3RhcnQgPSBrdGltZV9nZXQoKTsKIAlpbnQgcmV0OwotCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBhY3R1YWxfY291bnQgPSAwOwogCWludCBtdXN0X2luc2VydF9yZXNlcnZlZCA9IDA7CiAKIAlkZWxheWVkX3JlZnMgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnM7CiAJd2hpbGUgKDEpIHsKIAkJaWYgKCFsb2NrZWRfcmVmKSB7Ci0JCQkvKiBwaWNrIGEgbmV3IGhlYWQgcmVmIGZyb20gdGhlIGNsdXN0ZXIgbGlzdCAqLwotCQkJaWYgKGxpc3RfZW1wdHkoY2x1c3RlcikpCisJCQlpZiAoY291bnQgPj0gbnIpCiAJCQkJYnJlYWs7CiAKLQkJCWxvY2tlZF9yZWYgPSBsaXN0X2VudHJ5KGNsdXN0ZXItPm5leHQsCi0JCQkJICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCwgY2x1c3Rlcik7CisJCQlzcGluX2xvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJCQlsb2NrZWRfcmVmID0gYnRyZnNfc2VsZWN0X3JlZl9oZWFkKHRyYW5zKTsKKwkJCWlmICghbG9ja2VkX3JlZikgeworCQkJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQkJCWJyZWFrOworCQkJfQogCiAJCQkvKiBncmFiIHRoZSBsb2NrIHRoYXQgc2F5cyB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VzcwogCQkJICogYWxsIHRoZSByZWZzIGZvciB0aGlzIGhlYWQgKi8KIAkJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfcmVmX2xvY2sodHJhbnMsIGxvY2tlZF9yZWYpOwotCisJCQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKIAkJCS8qCiAJCQkgKiB3ZSBtYXkgaGF2ZSBkcm9wcGVkIHRoZSBzcGluIGxvY2sgdG8gZ2V0IHRoZSBoZWFkCiAJCQkgKiBtdXRleCBsb2NrLCBhbmQgdGhhdCBtaWdodCBoYXZlIGdpdmVuIHNvbWVvbmUgZWxzZQpAQCAtMjM2Myw2ICsyMzY1LDcgQEAKIAkJICogZmluaXNoLiAgSWYgd2UgbWVyZ2VkIGFueXRoaW5nIHdlIG5lZWQgdG8gcmUtbG9vcCBzbyB3ZSBjYW4KIAkJICogZ2V0IGEgZ29vZCByZWYuCiAJCSAqLworCQlzcGluX2xvY2soJmxvY2tlZF9yZWYtPmxvY2spOwogCQlidHJmc19tZXJnZV9kZWxheWVkX3JlZnModHJhbnMsIGZzX2luZm8sIGRlbGF5ZWRfcmVmcywKIAkJCQkJIGxvY2tlZF9yZWYpOwogCkBAIC0yMzc0LDE3ICsyMzc3LDE1IEBACiAKIAkJaWYgKHJlZiAmJiByZWYtPnNlcSAmJgogCQkgICAgYnRyZnNfY2hlY2tfZGVsYXllZF9zZXEoZnNfaW5mbywgZGVsYXllZF9yZWZzLCByZWYtPnNlcSkpIHsKLQkJCS8qCi0JCQkgKiB0aGVyZSBhcmUgc3RpbGwgcmVmcyB3aXRoIGxvd2VyIHNlcSBudW1iZXJzIGluIHRoZQotCQkJICogcHJvY2VzcyBvZiBiZWluZyBhZGRlZC4gRG9uJ3QgcnVuIHRoaXMgcmVmIHlldC4KLQkJCSAqLwotCQkJbGlzdF9kZWxfaW5pdCgmbG9ja2VkX3JlZi0+Y2x1c3Rlcik7CisJCQlzcGluX3VubG9jaygmbG9ja2VkX3JlZi0+bG9jayk7CiAJCQlidHJmc19kZWxheWVkX3JlZl91bmxvY2sobG9ja2VkX3JlZik7Ci0JCQlsb2NrZWRfcmVmID0gTlVMTDsKKwkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJCWxvY2tlZF9yZWYtPnByb2Nlc3NpbmcgPSAwOwogCQkJZGVsYXllZF9yZWZzLT5udW1faGVhZHNfcmVhZHkrKzsKIAkJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQkJbG9ja2VkX3JlZiA9IE5VTEw7CiAJCQljb25kX3Jlc2NoZWQoKTsKLQkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJCWNvdW50Kys7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yMzk5LDYgKzI0MDAsOCBAQAogCQlsb2NrZWRfcmVmLT5leHRlbnRfb3AgPSBOVUxMOwogCiAJCWlmICghcmVmKSB7CisKKwogCQkJLyogQWxsIGRlbGF5ZWQgcmVmcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBHbyBhaGVhZAogCQkJICogYW5kIHNlbmQgdGhlIGhlYWQgbm9kZSB0byBydW5fb25lX2RlbGF5ZWRfcmVmLAogCQkJICogc28gdGhhdCBhbnkgYWNjb3VudGluZyBmaXhlcyBjYW4gaGFwcGVuCkBAIC0yNDExLDggKzI0MTQsNyBAQAogCQkJfQogCiAJCQlpZiAoZXh0ZW50X29wKSB7Ci0JCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7Ci0KKwkJCQlzcGluX3VubG9jaygmbG9ja2VkX3JlZi0+bG9jayk7CiAJCQkJcmV0ID0gcnVuX2RlbGF5ZWRfZXh0ZW50X29wKHRyYW5zLCByb290LAogCQkJCQkJCSAgICByZWYsIGV4dGVudF9vcCk7CiAJCQkJYnRyZnNfZnJlZV9kZWxheWVkX2V4dGVudF9vcChleHRlbnRfb3ApOwpAQCAtMjQyNiwxOSArMjQyOCwzOSBAQAogCQkJCQkgKi8KIAkJCQkJaWYgKG11c3RfaW5zZXJ0X3Jlc2VydmVkKQogCQkJCQkJbG9ja2VkX3JlZi0+bXVzdF9pbnNlcnRfcmVzZXJ2ZWQgPSAxOworCQkJCQlsb2NrZWRfcmVmLT5wcm9jZXNzaW5nID0gMDsKIAkJCQkJYnRyZnNfZGVidWcoZnNfaW5mbywgInJ1bl9kZWxheWVkX2V4dGVudF9vcCByZXR1cm5lZCAlZCIsIHJldCk7Ci0JCQkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKIAkJCQkJYnRyZnNfZGVsYXllZF9yZWZfdW5sb2NrKGxvY2tlZF9yZWYpOwogCQkJCQlyZXR1cm4gcmV0OwogCQkJCX0KLQotCQkJCWdvdG8gbmV4dDsKKwkJCQljb250aW51ZTsKIAkJCX0KLQkJfQogCi0JCXJlZi0+aW5fdHJlZSA9IDA7Ci0JCXJiX2VyYXNlKCZyZWYtPnJiX25vZGUsICZkZWxheWVkX3JlZnMtPnJvb3QpOwotCQlkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzLS07CisJCQkvKgorCQkJICogTmVlZCB0byBkcm9wIG91ciBoZWFkIHJlZiBsb2NrIGFuZCByZS1hcWN1aXJlIHRoZQorCQkJICogZGVsYXllZCByZWYgbG9jayBhbmQgdGhlbiByZS1jaGVjayB0byBtYWtlIHN1cmUKKwkJCSAqIG5vYm9keSBnb3QgYWRkZWQuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrKCZsb2NrZWRfcmVmLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmbG9ja2VkX3JlZi0+bG9jayk7CisJCQlpZiAocmJfZmlyc3QoJmxvY2tlZF9yZWYtPnJlZl9yb290KSkgeworCQkJCXNwaW5fdW5sb2NrKCZsb2NrZWRfcmVmLT5sb2NrKTsKKwkJCQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlZi0+aW5fdHJlZSA9IDA7CisJCQlkZWxheWVkX3JlZnMtPm51bV9oZWFkcy0tOworCQkJcmJfZXJhc2UoJmxvY2tlZF9yZWYtPmhyZWZfbm9kZSwKKwkJCQkgJmRlbGF5ZWRfcmVmcy0+aHJlZl9yb290KTsKKwkJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQl9IGVsc2UgeworCQkJYWN0dWFsX2NvdW50Kys7CisJCQlyZWYtPmluX3RyZWUgPSAwOworCQkJcmJfZXJhc2UoJnJlZi0+cmJfbm9kZSwgJmxvY2tlZF9yZWYtPnJlZl9yb290KTsKKwkJfQorCQlhdG9taWNfZGVjKCZkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzKTsKKwogCQlpZiAoIWJ0cmZzX2RlbGF5ZWRfcmVmX2lzX2hlYWQocmVmKSkgewogCQkJLyoKIAkJCSAqIHdoZW4gd2UgcGxheSB0aGUgZGVsYXllZCByZWYsIGFsc28gY29ycmVjdCB0aGUKQEAgLTI0NTUsMjAgKzI0NzcsMTggQEAKIAkJCWRlZmF1bHQ6CiAJCQkJV0FSTl9PTigxKTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfZGVsX2luaXQoJmxvY2tlZF9yZWYtPmNsdXN0ZXIpOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQlzcGluX3VubG9jaygmbG9ja2VkX3JlZi0+bG9jayk7CiAKIAkJcmV0ID0gcnVuX29uZV9kZWxheWVkX3JlZih0cmFucywgcm9vdCwgcmVmLCBleHRlbnRfb3AsCiAJCQkJCSAgbXVzdF9pbnNlcnRfcmVzZXJ2ZWQpOwogCiAJCWJ0cmZzX2ZyZWVfZGVsYXllZF9leHRlbnRfb3AoZXh0ZW50X29wKTsKIAkJaWYgKHJldCkgeworCQkJbG9ja2VkX3JlZi0+cHJvY2Vzc2luZyA9IDA7CiAJCQlidHJmc19kZWxheWVkX3JlZl91bmxvY2sobG9ja2VkX3JlZik7CiAJCQlidHJmc19wdXRfZGVsYXllZF9yZWYocmVmKTsKIAkJCWJ0cmZzX2RlYnVnKGZzX2luZm8sICJydW5fb25lX2RlbGF5ZWRfcmVmIHJldHVybmVkICVkIiwgcmV0KTsKLQkJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIApAQCAtMjQ4NCwxMSArMjUwNCwyOSBAQAogCQl9CiAJCWJ0cmZzX3B1dF9kZWxheWVkX3JlZihyZWYpOwogCQljb3VudCsrOwotbmV4dDoKIAkJY29uZF9yZXNjaGVkKCk7Ci0JCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKIAl9Ci0JcmV0dXJuIGNvdW50OworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgcmVmIGhlYWRzIHNpbmNlIHdlIGNhbiBoYXZlIGVtcHR5IHJlZiBoZWFkcworCSAqIGFuZCB0aG9zZSB3aWxsIGRyYXN0aWNhbGx5IHNrZXcgb3VyIHJ1bnRpbWUgZG93biBzaW5jZSB3ZSBqdXN0IGRvCisJICogYWNjb3VudGluZywgbm8gYWN0dWFsIGV4dGVudCB0cmVlIHVwZGF0ZXMuCisJICovCisJaWYgKGFjdHVhbF9jb3VudCA+IDApIHsKKwkJdTY0IHJ1bnRpbWUgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHN0YXJ0KSk7CisJCXU2NCBhdmc7CisKKwkJLyoKKwkJICogV2Ugd2VpZ2ggdGhlIGN1cnJlbnQgYXZlcmFnZSBoaWdoZXIgdGhhbiBvdXIgY3VycmVudCBydW50aW1lCisJCSAqIHRvIGF2b2lkIGxhcmdlIHN3aW5ncyBpbiB0aGUgYXZlcmFnZS4KKwkJICovCisJCXNwaW5fbG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwkJYXZnID0gZnNfaW5mby0+YXZnX2RlbGF5ZWRfcmVmX3J1bnRpbWUgKiAzICsgcnVudGltZTsKKwkJYXZnID0gZGl2NjRfdTY0KGF2ZywgNCk7CisJCWZzX2luZm8tPmF2Z19kZWxheWVkX3JlZl9ydW50aW1lID0gYXZnOworCQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBTQ1JBTUJMRV9ERUxBWUVEX1JFRlMKQEAgLTI1NzAsMTYgKzI2MDgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVmc19uZXdlcihzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzLCBpbnQgc2VxLAotCQkgICAgICBpbnQgY291bnQpCi17Ci0JaW50IHZhbCA9IGF0b21pY19yZWFkKCZkZWxheWVkX3JlZnMtPnJlZl9zZXEpOwotCi0JaWYgKHZhbCA8IHNlcSB8fCB2YWwgPj0gc2VxICsgY291bnQpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHU2NCBoZWFkc190b19sZWF2ZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBoZWFkcykKIHsKIAl1NjQgbnVtX2J5dGVzOwpAQCAtMjU5Niw3ICsyNjI0LDcgQEAKIAlyZXR1cm4gZGl2NjRfdTY0KG51bV9ieXRlcywgQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCkpOwogfQogCi1pbnQgYnRyZnNfc2hvdWxkX3Rocm90dGxlX2RlbGF5ZWRfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKK2ludCBidHJmc19jaGVja19zcGFjZV9mb3JfZGVsYXllZF9yZWZzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpnbG9iYWxfcnN2OwpAQCAtMjYyNSw2ICsyNjUzLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX3Nob3VsZF90aHJvdHRsZV9kZWxheWVkX3JlZnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwl1NjQgbnVtX2VudHJpZXMgPQorCQlhdG9taWNfcmVhZCgmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnMubnVtX2VudHJpZXMpOworCXU2NCBhdmdfcnVudGltZTsKKworCXNtcF9tYigpOworCWF2Z19ydW50aW1lID0gZnNfaW5mby0+YXZnX2RlbGF5ZWRfcmVmX3J1bnRpbWU7CisJaWYgKG51bV9lbnRyaWVzICogYXZnX3J1bnRpbWUgPj0gTlNFQ19QRVJfU0VDKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBidHJmc19jaGVja19zcGFjZV9mb3JfZGVsYXllZF9yZWZzKHRyYW5zLCByb290KTsKK30KKwogLyoKICAqIHRoaXMgc3RhcnRzIHByb2Nlc3NpbmcgdGhlIGRlbGF5ZWQgcmVmZXJlbmNlIGNvdW50IHVwZGF0ZXMgYW5kCiAgKiBleHRlbnQgaW5zZXJ0aW9ucyB3ZSBoYXZlIHF1ZXVlZCB1cCBzbyBmYXIuICBjb3VudCBjYW4gYmUKQEAgLTI2NDAsMTMgKzI2ODQsMTAgQEAKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOwotCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWY7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjbHVzdGVyOworCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkOwogCWludCByZXQ7Ci0JdTY0IGRlbGF5ZWRfc3RhcnQ7CiAJaW50IHJ1bl9hbGwgPSBjb3VudCA9PSAodW5zaWduZWQgbG9uZyktMTsKIAlpbnQgcnVuX21vc3QgPSAwOwotCWludCBsb29wczsKIAogCS8qIFdlJ2xsIGNsZWFuIHRoaXMgdXAgaW4gYnRyZnNfY2xlYW51cF90cmFuc2FjdGlvbiAqLwogCWlmICh0cmFucy0+YWJvcnRlZCkKQEAgLTI2NTgsMTMwICsyNjk5LDQwIEBACiAJYnRyZnNfZGVsYXllZF9yZWZzX3Fncm91cF9hY2NvdW50aW5nKHRyYW5zLCByb290LT5mc19pbmZvKTsKIAogCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmczsKLQlJTklUX0xJU1RfSEVBRCgmY2x1c3Rlcik7CiAJaWYgKGNvdW50ID09IDApIHsKLQkJY291bnQgPSBkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzICogMjsKKwkJY291bnQgPSBhdG9taWNfcmVhZCgmZGVsYXllZF9yZWZzLT5udW1fZW50cmllcykgKiAyOwogCQlydW5fbW9zdCA9IDE7CiAJfQogCi0JaWYgKCFydW5fYWxsICYmICFydW5fbW9zdCkgewotCQlpbnQgb2xkOwotCQlpbnQgc2VxID0gYXRvbWljX3JlYWQoJmRlbGF5ZWRfcmVmcy0+cmVmX3NlcSk7Ci0KLXByb2dyZXNzOgotCQlvbGQgPSBhdG9taWNfY21weGNoZygmZGVsYXllZF9yZWZzLT5wcm9jc19ydW5uaW5nX3JlZnMsIDAsIDEpOwotCQlpZiAob2xkKSB7Ci0JCQlERUZJTkVfV0FJVChfX3dhaXQpOwotCQkJaWYgKGRlbGF5ZWRfcmVmcy0+Zmx1c2hpbmcgfHwKLQkJCSAgICAhYnRyZnNfc2hvdWxkX3Rocm90dGxlX2RlbGF5ZWRfcmVmcyh0cmFucywgcm9vdCkpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCXByZXBhcmVfdG9fd2FpdCgmZGVsYXllZF9yZWZzLT53YWl0LCAmX193YWl0LAotCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0KLQkJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCZkZWxheWVkX3JlZnMtPnByb2NzX3J1bm5pbmdfcmVmcywgMCwgMSk7Ci0JCQlpZiAob2xkKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlmaW5pc2hfd2FpdCgmZGVsYXllZF9yZWZzLT53YWl0LCAmX193YWl0KTsKLQotCQkJCWlmICghcmVmc19uZXdlcihkZWxheWVkX3JlZnMsIHNlcSwgMjU2KSkKLQkJCQkJZ290byBwcm9ncmVzczsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIHsKLQkJCQlmaW5pc2hfd2FpdCgmZGVsYXllZF9yZWZzLT53YWl0LCAmX193YWl0KTsKLQkJCQlnb3RvIGFnYWluOwotCQkJfQotCQl9Ci0KLQl9IGVsc2UgewotCQlhdG9taWNfaW5jKCZkZWxheWVkX3JlZnMtPnByb2NzX3J1bm5pbmdfcmVmcyk7Ci0JfQotCiBhZ2FpbjoKLQlsb29wcyA9IDA7Ci0Jc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCiAjaWZkZWYgU0NSQU1CTEVfREVMQVlFRF9SRUZTCiAJZGVsYXllZF9yZWZzLT5ydW5fZGVsYXllZF9zdGFydCA9IGZpbmRfbWlkZGxlKCZkZWxheWVkX3JlZnMtPnJvb3QpOwogI2VuZGlmCi0KLQl3aGlsZSAoMSkgewotCQlpZiAoIShydW5fYWxsIHx8IHJ1bl9tb3N0KSAmJgotCQkgICAgIWJ0cmZzX3Nob3VsZF90aHJvdHRsZV9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QpKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogZ28gZmluZCBzb21ldGhpbmcgd2UgY2FuIHByb2Nlc3MgaW4gdGhlIHJidHJlZS4gIFdlIHN0YXJ0IGF0Ci0JCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyZWUsIGFuZCB0aGVuIGJ1aWxkIGEgY2x1c3RlcgotCQkgKiBvZiByZWZzIHRvIHByb2Nlc3Mgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IG9uZSB3ZSBhcmUgYWJsZSB0bwotCQkgKiBsb2NrCi0JCSAqLwotCQlkZWxheWVkX3N0YXJ0ID0gZGVsYXllZF9yZWZzLT5ydW5fZGVsYXllZF9zdGFydDsKLQkJcmV0ID0gYnRyZnNfZmluZF9yZWZfY2x1c3Rlcih0cmFucywgJmNsdXN0ZXIsCi0JCQkJCSAgICAgZGVsYXllZF9yZWZzLT5ydW5fZGVsYXllZF9zdGFydCk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQotCQlyZXQgPSBydW5fY2x1c3RlcmVkX3JlZnModHJhbnMsIHJvb3QsICZjbHVzdGVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWJ0cmZzX3JlbGVhc2VfcmVmX2NsdXN0ZXIoJmNsdXN0ZXIpOwotCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7Ci0JCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgcmV0KTsKLQkJCWF0b21pY19kZWMoJmRlbGF5ZWRfcmVmcy0+cHJvY3NfcnVubmluZ19yZWZzKTsKLQkJCXdha2VfdXAoJmRlbGF5ZWRfcmVmcy0+d2FpdCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJYXRvbWljX2FkZChyZXQsICZkZWxheWVkX3JlZnMtPnJlZl9zZXEpOwotCi0JCWNvdW50IC09IG1pbl90KHVuc2lnbmVkIGxvbmcsIHJldCwgY291bnQpOwotCi0JCWlmIChjb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGRlbGF5ZWRfc3RhcnQgPj0gZGVsYXllZF9yZWZzLT5ydW5fZGVsYXllZF9zdGFydCkgewotCQkJaWYgKGxvb3BzID09IDApIHsKLQkJCQkvKgotCQkJCSAqIGJ0cmZzX2ZpbmRfcmVmX2NsdXN0ZXIgbG9vcGVkLiBsZXQncyBkbyBvbmUKLQkJCQkgKiBtb3JlIGN5Y2xlLiBpZiB3ZSBkb24ndCBydW4gYW55IGRlbGF5ZWQgcmVmCi0JCQkJICogZHVyaW5nIHRoYXQgY3ljbGUgKGJlY2F1c2Ugd2UgY2FuJ3QgYmVjYXVzZQotCQkJCSAqIGFsbCBvZiB0aGVtIGFyZSBibG9ja2VkKSwgYmFpbCBvdXQuCi0JCQkJICovCi0JCQkJbG9vcHMgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIG5vIHJ1bm5hYmxlIHJlZnMgbGVmdCwgc3RvcCB0cnlpbmcKLQkJCQkgKi8KLQkJCQlCVUdfT04ocnVuX2FsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJldCkgewotCQkJLyogcmVmcyB3ZXJlIHJ1biwgbGV0J3MgcmVzZXQgc3RhbGVuZXNzIGRldGVjdGlvbiAqLwotCQkJbG9vcHMgPSAwOwotCQl9CisJcmV0ID0gX19idHJmc19ydW5fZGVsYXllZF9yZWZzKHRyYW5zLCByb290LCBjb3VudCk7CisJaWYgKHJldCA8IDApIHsKKwkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKHJ1bl9hbGwpIHsKLQkJaWYgKCFsaXN0X2VtcHR5KCZ0cmFucy0+bmV3X2JncykpIHsKLQkJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJnRyYW5zLT5uZXdfYmdzKSkKIAkJCWJ0cmZzX2NyZWF0ZV9wZW5kaW5nX2Jsb2NrX2dyb3Vwcyh0cmFucywgcm9vdCk7Ci0JCQlzcGluX2xvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7Ci0JCX0KIAotCQlub2RlID0gcmJfZmlyc3QoJmRlbGF5ZWRfcmVmcy0+cm9vdCk7Ci0JCWlmICghbm9kZSkKKwkJc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOworCQlub2RlID0gcmJfZmlyc3QoJmRlbGF5ZWRfcmVmcy0+aHJlZl9yb290KTsKKwkJaWYgKCFub2RlKSB7CisJCQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKIAkJCWdvdG8gb3V0OworCQl9CiAJCWNvdW50ID0gKHVuc2lnbmVkIGxvbmcpLTE7CiAKIAkJd2hpbGUgKG5vZGUpIHsKLQkJCXJlZiA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlLAotCQkJCSAgICAgICByYl9ub2RlKTsKLQkJCWlmIChidHJmc19kZWxheWVkX3JlZl9pc19oZWFkKHJlZikpIHsKLQkJCQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqaGVhZDsKKwkJCWhlYWQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCwKKwkJCQkJaHJlZl9ub2RlKTsKKwkJCWlmIChidHJmc19kZWxheWVkX3JlZl9pc19oZWFkKCZoZWFkLT5ub2RlKSkgeworCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9ub2RlICpyZWY7CiAKLQkJCQloZWFkID0gYnRyZnNfZGVsYXllZF9ub2RlX3RvX2hlYWQocmVmKTsKKwkJCQlyZWYgPSAmaGVhZC0+bm9kZTsKIAkJCQlhdG9taWNfaW5jKCZyZWYtPnJlZnMpOwogCiAJCQkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CkBAIC0yNzk1LDIwICsyNzQ2LDE2IEBACiAJCQkJYnRyZnNfcHV0X2RlbGF5ZWRfcmVmKHJlZik7CiAJCQkJY29uZF9yZXNjaGVkKCk7CiAJCQkJZ290byBhZ2FpbjsKKwkJCX0gZWxzZSB7CisJCQkJV0FSTl9PTigxKTsKIAkJCX0KIAkJCW5vZGUgPSByYl9uZXh0KG5vZGUpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQljb25kX3Jlc2NoZWQoKTsKIAkJZ290byBhZ2FpbjsKIAl9CiBvdXQ6Ci0JYXRvbWljX2RlYygmZGVsYXllZF9yZWZzLT5wcm9jc19ydW5uaW5nX3JlZnMpOwotCXNtcF9tYigpOwotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZkZWxheWVkX3JlZnMtPndhaXQpKQotCQl3YWtlX3VwKCZkZWxheWVkX3JlZnMtPndhaXQpOwotCi0Jc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAJYXNzZXJ0X3Fncm91cHNfdXB0b2RhdGUodHJhbnMpOwogCXJldHVybiAwOwogfQpAQCAtMjg1MCwxMiArMjc5NywxMyBAQAogCXN0cnVjdCByYl9ub2RlICpub2RlOwogCWludCByZXQgPSAwOwogCi0JcmV0ID0gLUVOT0VOVDsKIAlkZWxheWVkX3JlZnMgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnM7CiAJc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwogCWhlYWQgPSBidHJmc19maW5kX2RlbGF5ZWRfcmVmX2hlYWQodHJhbnMsIGJ5dGVucik7Ci0JaWYgKCFoZWFkKQotCQlnb3RvIG91dDsKKwlpZiAoIWhlYWQpIHsKKwkJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJCXJldHVybiAwOworCX0KIAogCWlmICghbXV0ZXhfdHJ5bG9jaygmaGVhZC0+bXV0ZXgpKSB7CiAJCWF0b21pY19pbmMoJmhlYWQtPm5vZGUucmVmcyk7CkBAIC0yODcyLDQwICsyODIwLDM1IEBACiAJCWJ0cmZzX3B1dF9kZWxheWVkX3JlZigmaGVhZC0+bm9kZSk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KLQotCW5vZGUgPSByYl9wcmV2KCZoZWFkLT5ub2RlLnJiX25vZGUpOwotCWlmICghbm9kZSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JcmVmID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsIHJiX25vZGUpOwotCi0JaWYgKHJlZi0+Ynl0ZW5yICE9IGJ5dGVucikKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JcmV0ID0gMTsKLQlpZiAocmVmLT50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX1JFRl9LRVkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWRhdGFfcmVmID0gYnRyZnNfZGVsYXllZF9ub2RlX3RvX2RhdGFfcmVmKHJlZik7Ci0KLQlub2RlID0gcmJfcHJldihub2RlKTsKLQlpZiAobm9kZSkgewotCQlpbnQgc2VxID0gcmVmLT5zZXE7Ci0KLQkJcmVmID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsIHJiX25vZGUpOwotCQlpZiAocmVmLT5ieXRlbnIgPT0gYnl0ZW5yICYmIHJlZi0+c2VxID09IHNlcSkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlpZiAoZGF0YV9yZWYtPnJvb3QgIT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgfHwKLQkgICAgZGF0YV9yZWYtPm9iamVjdGlkICE9IG9iamVjdGlkIHx8IGRhdGFfcmVmLT5vZmZzZXQgIT0gb2Zmc2V0KQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlyZXQgPSAwOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmhlYWQtPm11dGV4KTsKLW91dDoKIAlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKKworCXNwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJbm9kZSA9IHJiX2ZpcnN0KCZoZWFkLT5yZWZfcm9vdCk7CisJd2hpbGUgKG5vZGUpIHsKKwkJcmVmID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUsIHJiX25vZGUpOworCQlub2RlID0gcmJfbmV4dChub2RlKTsKKworCQkvKiBJZiBpdCdzIGEgc2hhcmVkIHJlZiB3ZSBrbm93IGEgY3Jvc3MgcmVmZXJlbmNlIGV4aXN0cyAqLworCQlpZiAocmVmLT50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX1JFRl9LRVkpIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWRhdGFfcmVmID0gYnRyZnNfZGVsYXllZF9ub2RlX3RvX2RhdGFfcmVmKHJlZik7CisKKwkJLyoKKwkJICogSWYgb3VyIHJlZiBkb2Vzbid0IG1hdGNoIHRoZSBvbmUgd2UncmUgY3VycmVudGx5IGxvb2tpbmcgYXQKKwkJICogdGhlbiB3ZSBoYXZlIGEgY3Jvc3MgcmVmZXJlbmNlLgorCQkgKi8KKwkJaWYgKGRhdGFfcmVmLT5yb290ICE9IHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkIHx8CisJCSAgICBkYXRhX3JlZi0+b2JqZWN0aWQgIT0gb2JqZWN0aWQgfHwKKwkJICAgIGRhdGFfcmVmLT5vZmZzZXQgIT0gb2Zmc2V0KSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworCW11dGV4X3VubG9jaygmaGVhZC0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM0MDIsNiArMzM0NSwyMyBAQAogCXJldHVybiByZWFkb25seTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmFsbG9jX25hbWUodTY0IGZsYWdzKQoreworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBfEJUUkZTX0JMT0NLX0dST1VQX0RBVEE6CisJCXJldHVybiAibWl4ZWQiOworCWNhc2UgQlRSRlNfQkxPQ0tfR1JPVVBfTUVUQURBVEE6CisJCXJldHVybiAibWV0YWRhdGEiOworCWNhc2UgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQToKKwkJcmV0dXJuICJkYXRhIjsKKwljYXNlIEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTToKKwkJcmV0dXJuICJzeXN0ZW0iOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAiaW52YWxpZC1jb21iaW5hdGlvbiI7CisJfTsKK30KKwogc3RhdGljIGludCB1cGRhdGVfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgdTY0IGZsYWdzLAogCQkJICAgICB1NjQgdG90YWxfYnl0ZXMsIHU2NCBieXRlc191c2VkLAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqKnNwYWNlX2luZm8pCkBAIC0zNDM5LDggKzMzOTksMTAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQlRSRlNfTlJfUkFJRF9UWVBFUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBCVFJGU19OUl9SQUlEX1RZUEVTOyBpKyspIHsKIAkJSU5JVF9MSVNUX0hFQUQoJmZvdW5kLT5ibG9ja19ncm91cHNbaV0pOworCQlrb2JqZWN0X2luaXQoJmZvdW5kLT5ibG9ja19ncm91cF9rb2Jqc1tpXSwgJmJ0cmZzX3JhaWRfa3R5cGUpOworCX0KIAlpbml0X3J3c2VtKCZmb3VuZC0+Z3JvdXBzX3NlbSk7CiAJc3Bpbl9sb2NrX2luaXQoJmZvdW5kLT5sb2NrKTsKIAlmb3VuZC0+ZmxhZ3MgPSBmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX1RZUEVfTUFTSzsKQEAgLTM0NTcsMTEgKzM0MTksMjEgQEAKIAlmb3VuZC0+Y2h1bmtfYWxsb2MgPSAwOwogCWZvdW5kLT5mbHVzaCA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZm91bmQtPndhaXQpOworCisJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmZvdW5kLT5rb2JqLCAmc3BhY2VfaW5mb19rdHlwZSwKKwkJCQkgICAgaW5mby0+c3BhY2VfaW5mb19rb2JqLCAiJXMiLAorCQkJCSAgICBhbGxvY19uYW1lKGZvdW5kLT5mbGFncykpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoZm91bmQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCSpzcGFjZV9pbmZvID0gZm91bmQ7CiAJbGlzdF9hZGRfcmN1KCZmb3VuZC0+bGlzdCwgJmluZm8tPnNwYWNlX2luZm8pOwogCWlmIChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpCiAJCWluZm8tPmRhdGFfc2luZm8gPSBmb3VuZDsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9hdmFpbF9hbGxvY19iaXRzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCB1NjQgZmxhZ3MpCkBAIC00NjM3LDcgKzQ2MDksNyBAQAogCQkJICAgICB1NjQgbnVtX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmdsb2JhbF9yc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKLQlpZiAoZ2xvYmFsX3Jzdi0+ZnVsbCB8fCBnbG9iYWxfcnN2ID09IGJsb2NrX3JzdiB8fAorCWlmIChnbG9iYWxfcnN2ID09IGJsb2NrX3JzdiB8fAogCSAgICBibG9ja19yc3YtPnNwYWNlX2luZm8gIT0gZ2xvYmFsX3Jzdi0+c3BhY2VfaW5mbykKIAkJZ2xvYmFsX3JzdiA9IE5VTEw7CiAJYmxvY2tfcnN2X3JlbGVhc2VfYnl0ZXMocm9vdC0+ZnNfaW5mbywgYmxvY2tfcnN2LCBnbG9iYWxfcnN2LApAQCAtNTkxNiwyNCArNTg4OCwxNiBAQAogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9oZWFkICpoZWFkOwogCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnM7Ci0Jc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX25vZGUgKnJlZjsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlpbnQgcmV0ID0gMDsKIAogCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmczsKIAlzcGluX2xvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAJaGVhZCA9IGJ0cmZzX2ZpbmRfZGVsYXllZF9yZWZfaGVhZCh0cmFucywgYnl0ZW5yKTsKIAlpZiAoIWhlYWQpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9kZWxheWVkX3VubG9jazsKIAotCW5vZGUgPSByYl9wcmV2KCZoZWFkLT5ub2RlLnJiX25vZGUpOwotCWlmICghbm9kZSkKLQkJZ290byBvdXQ7Ci0KLQlyZWYgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSwgcmJfbm9kZSk7Ci0KLQkvKiB0aGVyZSBhcmUgc3RpbGwgZW50cmllcyBmb3IgdGhpcyByZWYsIHdlIGNhbid0IGRyb3AgaXQgKi8KLQlpZiAocmVmLT5ieXRlbnIgPT0gYnl0ZW5yKQorCXNwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJaWYgKHJiX2ZpcnN0KCZoZWFkLT5yZWZfcm9vdCkpCiAJCWdvdG8gb3V0OwogCiAJaWYgKGhlYWQtPmV4dGVudF9vcCkgewpAQCAtNTk1NSwxOSArNTkxOSwxOSBAQAogCSAqIGFoZWFkIGFuZCBwcm9jZXNzIGl0LgogCSAqLwogCWhlYWQtPm5vZGUuaW5fdHJlZSA9IDA7Ci0JcmJfZXJhc2UoJmhlYWQtPm5vZGUucmJfbm9kZSwgJmRlbGF5ZWRfcmVmcy0+cm9vdCk7CisJcmJfZXJhc2UoJmhlYWQtPmhyZWZfbm9kZSwgJmRlbGF5ZWRfcmVmcy0+aHJlZl9yb290KTsKIAotCWRlbGF5ZWRfcmVmcy0+bnVtX2VudHJpZXMtLTsKKwlhdG9taWNfZGVjKCZkZWxheWVkX3JlZnMtPm51bV9lbnRyaWVzKTsKIAogCS8qCiAJICogd2UgZG9uJ3QgdGFrZSBhIHJlZiBvbiB0aGUgbm9kZSBiZWNhdXNlIHdlJ3JlIHJlbW92aW5nIGl0IGZyb20gdGhlCiAJICogdHJlZSwgc28gd2UganVzdCBzdGVhbCB0aGUgcmVmIHRoZSB0cmVlIHdhcyBob2xkaW5nLgogCSAqLwogCWRlbGF5ZWRfcmVmcy0+bnVtX2hlYWRzLS07Ci0JaWYgKGxpc3RfZW1wdHkoJmhlYWQtPmNsdXN0ZXIpKQorCWlmIChoZWFkLT5wcm9jZXNzaW5nID09IDApCiAJCWRlbGF5ZWRfcmVmcy0+bnVtX2hlYWRzX3JlYWR5LS07Ci0KLQlsaXN0X2RlbF9pbml0KCZoZWFkLT5jbHVzdGVyKTsKKwloZWFkLT5wcm9jZXNzaW5nID0gMDsKKwlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CiAJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CiAKIAlCVUdfT04oaGVhZC0+ZXh0ZW50X29wKTsKQEAgLTU5NzgsNiArNTk0Miw5IEBACiAJYnRyZnNfcHV0X2RlbGF5ZWRfcmVmKCZoZWFkLT5ub2RlKTsKIAlyZXR1cm4gcmV0Owogb3V0OgorCXNwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsKKworb3V0X2RlbGF5ZWRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwogCXJldHVybiAwOwogfQpAQCAtNjE0NSwxMSArNjExMiwyOSBAQAogCXJldHVybiBCVFJGU19SQUlEX1NJTkdMRTsgLyogQlRSRlNfQkxPQ0tfR1JPVVBfU0lOR0xFICovCiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2Jsb2NrX2dyb3VwX2luZGV4KHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpCitpbnQgZ2V0X2Jsb2NrX2dyb3VwX2luZGV4KHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpCiB7CiAJcmV0dXJuIF9fZ2V0X3JhaWRfaW5kZXgoY2FjaGUtPmZsYWdzKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmJ0cmZzX3JhaWRfdHlwZV9uYW1lc1tCVFJGU19OUl9SQUlEX1RZUEVTXSA9IHsKKwlbQlRSRlNfUkFJRF9SQUlEMTBdCT0gInJhaWQxMCIsCisJW0JUUkZTX1JBSURfUkFJRDFdCT0gInJhaWQxIiwKKwlbQlRSRlNfUkFJRF9EVVBdCT0gImR1cCIsCisJW0JUUkZTX1JBSURfUkFJRDBdCT0gInJhaWQwIiwKKwlbQlRSRlNfUkFJRF9TSU5HTEVdCT0gInNpbmdsZSIsCisJW0JUUkZTX1JBSURfUkFJRDVdCT0gInJhaWQ1IiwKKwlbQlRSRlNfUkFJRF9SQUlENl0JPSAicmFpZDYiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9yYWlkX25hbWUoZW51bSBidHJmc19yYWlkX3R5cGVzIHR5cGUpCit7CisJaWYgKHR5cGUgPj0gQlRSRlNfTlJfUkFJRF9UWVBFUykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gYnRyZnNfcmFpZF90eXBlX25hbWVzW3R5cGVdOworfQorCiBlbnVtIGJ0cmZzX2xvb3BfdHlwZSB7CiAJTE9PUF9DQUNISU5HX05PV0FJVCA9IDAsCiAJTE9PUF9DQUNISU5HX1dBSVQgPSAxLApAQCAtNjE3Nyw3ICs2MTYyLDYgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IG9yaWdfcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqbGFzdF9wdHIgPSBOVUxMOwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAgPSBOVUxMOwotCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqdXNlZF9ibG9ja19ncm91cDsKIAl1NjQgc2VhcmNoX3N0YXJ0ID0gMDsKIAl1NjQgbWF4X2V4dGVudF9zaXplID0gMDsKIAlpbnQgZW1wdHlfY2x1c3RlciA9IDIgKiAxMDI0ICogMTAyNDsKQEAgLTYxODYsNyArNjE3MCw2IEBACiAJaW50IGluZGV4ID0gX19nZXRfcmFpZF9pbmRleChmbGFncyk7CiAJaW50IGFsbG9jX3R5cGUgPSAoZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSA/CiAJCVJFU0VSVkVfQUxMT0NfTk9fQUNDT1VOVCA6IFJFU0VSVkVfQUxMT0M7Ci0JYm9vbCBmb3VuZF91bmNhY2hlZF9iZyA9IGZhbHNlOwogCWJvb2wgZmFpbGVkX2NsdXN0ZXJfcmVmaWxsID0gZmFsc2U7CiAJYm9vbCBmYWlsZWRfYWxsb2MgPSBmYWxzZTsKIAlib29sIHVzZV9jbHVzdGVyID0gdHJ1ZTsKQEAgLTYyMzksNyArNjIyMiw2IEBACiAJaWYgKHNlYXJjaF9zdGFydCA9PSBoaW50X2J5dGUpIHsKIAkJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywKIAkJCQkJCSAgICAgICBzZWFyY2hfc3RhcnQpOwotCQl1c2VkX2Jsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXA7CiAJCS8qCiAJCSAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBibG9jayBncm91cCBpZiBpdCBkb2Vzbid0IG1hdGNoIG91cgogCQkgKiBhbGxvY2F0aW9uIGJpdHMsIG9yIGlmIGl0cyBub3QgY2FjaGVkLgpAQCAtNjI3Niw3ICs2MjU4LDYgQEAKIAkJdTY0IG9mZnNldDsKIAkJaW50IGNhY2hlZDsKIAotCQl1c2VkX2Jsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXA7CiAJCWJ0cmZzX2dldF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CiAJCXNlYXJjaF9zdGFydCA9IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQ7CiAKQEAgLTYzMDQsNyArNjI4NSw2IEBACiBoYXZlX2Jsb2NrX2dyb3VwOgogCQljYWNoZWQgPSBibG9ja19ncm91cF9jYWNoZV9kb25lKGJsb2NrX2dyb3VwKTsKIAkJaWYgKHVubGlrZWx5KCFjYWNoZWQpKSB7Ci0JCQlmb3VuZF91bmNhY2hlZF9iZyA9IHRydWU7CiAJCQlyZXQgPSBjYWNoZV9ibG9ja19ncm91cChibG9ja19ncm91cCwgMCk7CiAJCQlCVUdfT04ocmV0IDwgMCk7CiAJCQlyZXQgPSAwOwpAQCAtNjMyMCw2ICs2MzAwLDcgQEAKIAkJICogbGV0cyBsb29rIHRoZXJlCiAJCSAqLwogCQlpZiAobGFzdF9wdHIpIHsKKwkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqdXNlZF9ibG9ja19ncm91cDsKIAkJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9jbHVzdGVyOwogCQkJLyoKIAkJCSAqIHRoZSByZWZpbGwgbG9jayBrZWVwcyBvdXQgb3RoZXIKQEAgLTYzMzAsMTAgKzYzMTEsOCBAQAogCQkJaWYgKHVzZWRfYmxvY2tfZ3JvdXAgIT0gYmxvY2tfZ3JvdXAgJiYKIAkJCSAgICAoIXVzZWRfYmxvY2tfZ3JvdXAgfHwKIAkJCSAgICAgdXNlZF9ibG9ja19ncm91cC0+cm8gfHwKLQkJCSAgICAgIWJsb2NrX2dyb3VwX2JpdHModXNlZF9ibG9ja19ncm91cCwgZmxhZ3MpKSkgewotCQkJCXVzZWRfYmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cDsKKwkJCSAgICAgIWJsb2NrX2dyb3VwX2JpdHModXNlZF9ibG9ja19ncm91cCwgZmxhZ3MpKSkKIAkJCQlnb3RvIHJlZmlsbF9jbHVzdGVyOwotCQkJfQogCiAJCQlpZiAodXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkKIAkJCQlidHJmc19nZXRfYmxvY2tfZ3JvdXAodXNlZF9ibG9ja19ncm91cCk7CkBAIC02MzQ3LDE3ICs2MzI2LDE5IEBACiAJCQkJLyogd2UgaGF2ZSBhIGJsb2NrLCB3ZSdyZSBkb25lICovCiAJCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7CiAJCQkJdHJhY2VfYnRyZnNfcmVzZXJ2ZV9leHRlbnRfY2x1c3Rlcihyb290LAotCQkJCQlibG9ja19ncm91cCwgc2VhcmNoX3N0YXJ0LCBudW1fYnl0ZXMpOworCQkJCQkJdXNlZF9ibG9ja19ncm91cCwKKwkJCQkJCXNlYXJjaF9zdGFydCwgbnVtX2J5dGVzKTsKKwkJCQlpZiAodXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkgeworCQkJCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOworCQkJCQlibG9ja19ncm91cCA9IHVzZWRfYmxvY2tfZ3JvdXA7CisJCQkJfQogCQkJCWdvdG8gY2hlY2tzOwogCQkJfQogCiAJCQlXQVJOX09OKGxhc3RfcHRyLT5ibG9ja19ncm91cCAhPSB1c2VkX2Jsb2NrX2dyb3VwKTsKLQkJCWlmICh1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKSB7CisJCQlpZiAodXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkKIAkJCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAodXNlZF9ibG9ja19ncm91cCk7Ci0JCQkJdXNlZF9ibG9ja19ncm91cCA9IGJsb2NrX2dyb3VwOwotCQkJfQogcmVmaWxsX2NsdXN0ZXI6Ci0JCQlCVUdfT04odXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCk7CiAJCQkvKiBJZiB3ZSBhcmUgb24gTE9PUF9OT19FTVBUWV9TSVpFLCB3ZSBjYW4ndAogCQkJICogc2V0IHVwIGEgbmV3IGNsdXN0ZXJzLCBzbyBsZXRzIGp1c3Qgc2tpcCBpdAogCQkJICogYW5kIGxldCB0aGUgYWxsb2NhdG9yIGZpbmQgd2hhdGV2ZXIgYmxvY2sKQEAgLTY0NzYsMjUgKzY0NTcsMjUgQEAKIAkJCWdvdG8gbG9vcDsKIAkJfQogY2hlY2tzOgotCQlzZWFyY2hfc3RhcnQgPSBzdHJpcGVfYWxpZ24ocm9vdCwgdXNlZF9ibG9ja19ncm91cCwKKwkJc2VhcmNoX3N0YXJ0ID0gc3RyaXBlX2FsaWduKHJvb3QsIGJsb2NrX2dyb3VwLAogCQkJCQkgICAgb2Zmc2V0LCBudW1fYnl0ZXMpOwogCiAJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZ3JvdXAgKi8KIAkJaWYgKHNlYXJjaF9zdGFydCArIG51bV9ieXRlcyA+Ci0JCSAgICB1c2VkX2Jsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKyB1c2VkX2Jsb2NrX2dyb3VwLT5rZXkub2Zmc2V0KSB7Ci0JCQlidHJmc19hZGRfZnJlZV9zcGFjZSh1c2VkX2Jsb2NrX2dyb3VwLCBvZmZzZXQsIG51bV9ieXRlcyk7CisJCSAgICBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpIHsKKwkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBvZmZzZXQsIG51bV9ieXRlcyk7CiAJCQlnb3RvIGxvb3A7CiAJCX0KIAogCQlpZiAob2Zmc2V0IDwgc2VhcmNoX3N0YXJ0KQotCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UodXNlZF9ibG9ja19ncm91cCwgb2Zmc2V0LAorCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwKIAkJCQkJICAgICBzZWFyY2hfc3RhcnQgLSBvZmZzZXQpOwogCQlCVUdfT04ob2Zmc2V0ID4gc2VhcmNoX3N0YXJ0KTsKIAotCQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXModXNlZF9ibG9ja19ncm91cCwgbnVtX2J5dGVzLAorCQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsIG51bV9ieXRlcywKIAkJCQkJCSAgYWxsb2NfdHlwZSk7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UodXNlZF9ibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOworCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwgbnVtX2J5dGVzKTsKIAkJCWdvdG8gbG9vcDsKIAkJfQogCkBAIC02NTA0LDE2ICs2NDg1LDEyIEBACiAKIAkJdHJhY2VfYnRyZnNfcmVzZXJ2ZV9leHRlbnQob3JpZ19yb290LCBibG9ja19ncm91cCwKIAkJCQkJICAgc2VhcmNoX3N0YXJ0LCBudW1fYnl0ZXMpOwotCQlpZiAodXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkKLQkJCWJ0cmZzX3B1dF9ibG9ja19ncm91cCh1c2VkX2Jsb2NrX2dyb3VwKTsKIAkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAkJYnJlYWs7CiBsb29wOgogCQlmYWlsZWRfY2x1c3Rlcl9yZWZpbGwgPSBmYWxzZTsKIAkJZmFpbGVkX2FsbG9jID0gZmFsc2U7CiAJCUJVR19PTihpbmRleCAhPSBnZXRfYmxvY2tfZ3JvdXBfaW5kZXgoYmxvY2tfZ3JvdXApKTsKLQkJaWYgKHVzZWRfYmxvY2tfZ3JvdXAgIT0gYmxvY2tfZ3JvdXApCi0JCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAodXNlZF9ibG9ja19ncm91cCk7CiAJCWJ0cmZzX3B1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CiAJfQogCXVwX3JlYWQoJnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOwpAQCAtNjU4NCwxMiArNjU2MSwxMiBAQAogCWludCBpbmRleCA9IDA7CiAKIAlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCXByaW50ayhLRVJOX0lORk8gInNwYWNlX2luZm8gJWxsdSBoYXMgJWxsdSBmcmVlLCBpcyAlc2Z1bGxcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiQlRSRlM6IHNwYWNlX2luZm8gJWxsdSBoYXMgJWxsdSBmcmVlLCBpcyAlc2Z1bGxcbiIsCiAJICAgICAgIGluZm8tPmZsYWdzLAogCSAgICAgICBpbmZvLT50b3RhbF9ieXRlcyAtIGluZm8tPmJ5dGVzX3VzZWQgLSBpbmZvLT5ieXRlc19waW5uZWQgLQogCSAgICAgICBpbmZvLT5ieXRlc19yZXNlcnZlZCAtIGluZm8tPmJ5dGVzX3JlYWRvbmx5LAogCSAgICAgICAoaW5mby0+ZnVsbCkgPyAiIiA6ICJub3QgIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAic3BhY2VfaW5mbyB0b3RhbD0lbGx1LCB1c2VkPSVsbHUsIHBpbm5lZD0lbGx1LCAiCisJcHJpbnRrKEtFUk5fSU5GTyAiQlRSRlM6IHNwYWNlX2luZm8gdG90YWw9JWxsdSwgdXNlZD0lbGx1LCBwaW5uZWQ9JWxsdSwgIgogCSAgICAgICAicmVzZXJ2ZWQ9JWxsdSwgbWF5X3VzZT0lbGx1LCByZWFkb25seT0lbGx1XG4iLAogCSAgICAgICBpbmZvLT50b3RhbF9ieXRlcywgaW5mby0+Ynl0ZXNfdXNlZCwgaW5mby0+Ynl0ZXNfcGlubmVkLAogCSAgICAgICBpbmZvLT5ieXRlc19yZXNlcnZlZCwgaW5mby0+Ynl0ZXNfbWF5X3VzZSwKQEAgLTY2MDMsNyArNjU4MCw5IEBACiBhZ2FpbjoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY2hlLCAmaW5mby0+YmxvY2tfZ3JvdXBzW2luZGV4XSwgbGlzdCkgewogCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYmxvY2sgZ3JvdXAgJWxsdSBoYXMgJWxsdSBieXRlcywgJWxsdSB1c2VkICVsbHUgcGlubmVkICVsbHUgcmVzZXJ2ZWQgJXNcbiIsCisJCXByaW50ayhLRVJOX0lORk8gIkJUUkZTOiAiCisJCQkgICAiYmxvY2sgZ3JvdXAgJWxsdSBoYXMgJWxsdSBieXRlcywgIgorCQkJICAgIiVsbHUgdXNlZCAlbGx1IHBpbm5lZCAlbGx1IHJlc2VydmVkICVzXG4iLAogCQkgICAgICAgY2FjaGUtPmtleS5vYmplY3RpZCwgY2FjaGUtPmtleS5vZmZzZXQsCiAJCSAgICAgICBidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSksIGNhY2hlLT5waW5uZWQsCiAJCSAgICAgICBjYWNoZS0+cmVzZXJ2ZWQsIGNhY2hlLT5ybyA/ICJbcmVhZG9ubHldIiA6ICIiKTsKQEAgLTY5NjYsNyArNjk0NSw3IEBACiAJCQkJLypERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCovIDEpOwogCQlpZiAoX19yYXRlbGltaXQoJl9ycykpCiAJCQlXQVJOKDEsIEtFUk5fREVCVUcKLQkJCQkiYnRyZnM6IGJsb2NrIHJzdiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJCQkiQlRSRlM6IGJsb2NrIHJzdiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKIAl9CiB0cnlfcmVzZXJ2ZToKIAlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgYmxvY2tzaXplLApAQCAtNzcxNCw3ICs3NjkzLDcgQEAKIAogCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCB0cmVlX3Jvb3QpOwogCQkJaWYgKCFmb3JfcmVsb2MgJiYgYnRyZnNfbmVlZF9jbGVhbmVyX3NsZWVwKHJvb3QpKSB7Ci0JCQkJcHJfZGVidWcoImJ0cmZzOiBkcm9wIHNuYXBzaG90IGVhcmx5IGV4aXRcbiIpOworCQkJCXByX2RlYnVnKCJCVFJGUzogZHJvcCBzbmFwc2hvdCBlYXJseSBleGl0XG4iKTsKIAkJCQllcnIgPSAtRUFHQUlOOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CkBAIC03Nzc5LDcgKzc3NTgsNyBAQAogCSAqLwogCWlmICghZm9yX3JlbG9jICYmIHJvb3RfZHJvcHBlZCA9PSBmYWxzZSkKIAkJYnRyZnNfYWRkX2RlYWRfcm9vdChyb290KTsKLQlpZiAoZXJyKQorCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pCiAJCWJ0cmZzX3N0ZF9lcnJvcihyb290LT5mc19pbmZvLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC04MzMzLDYgKzgzMTIsOCBAQAogCXJlbGVhc2VfZ2xvYmFsX2Jsb2NrX3JzdihpbmZvKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmaW5mby0+c3BhY2VfaW5mbykpIHsKKwkJaW50IGk7CisKIAkJc3BhY2VfaW5mbyA9IGxpc3RfZW50cnkoaW5mby0+c3BhY2VfaW5mby5uZXh0LAogCQkJCQlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbywKIAkJCQkJbGlzdCk7CkBAIC04MzQzLDkgKzgzMjQsMTcgQEAKIAkJCQlkdW1wX3NwYWNlX2luZm8oc3BhY2VfaW5mbywgMCwgMCk7CiAJCQl9CiAJCX0KLQkJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc3BhY2VfaW5mby0+dG90YWxfYnl0ZXNfcGlubmVkKTsKIAkJbGlzdF9kZWwoJnNwYWNlX2luZm8tPmxpc3QpOwotCQlrZnJlZShzcGFjZV9pbmZvKTsKKwkJZm9yIChpID0gMDsgaSA8IEJUUkZTX05SX1JBSURfVFlQRVM7IGkrKykgeworCQkJc3RydWN0IGtvYmplY3QgKmtvYmo7CisJCQlrb2JqID0gJnNwYWNlX2luZm8tPmJsb2NrX2dyb3VwX2tvYmpzW2ldOworCQkJaWYgKGtvYmotPnBhcmVudCkgeworCQkJCWtvYmplY3RfZGVsKGtvYmopOworCQkJCWtvYmplY3RfcHV0KGtvYmopOworCQkJfQorCQl9CisJCWtvYmplY3RfZGVsKCZzcGFjZV9pbmZvLT5rb2JqKTsKKwkJa29iamVjdF9wdXQoJnNwYWNlX2luZm8tPmtvYmopOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTgzNTYsMTAgKzgzNDUsNTcgQEAKIAlpbnQgaW5kZXggPSBnZXRfYmxvY2tfZ3JvdXBfaW5kZXgoY2FjaGUpOwogCiAJZG93bl93cml0ZSgmc3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CisJaWYgKGxpc3RfZW1wdHkoJnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwc1tpbmRleF0pKSB7CisJCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gJnNwYWNlX2luZm8tPmJsb2NrX2dyb3VwX2tvYmpzW2luZGV4XTsKKwkJaW50IHJldDsKKworCQlrb2JqZWN0X2dldCgmc3BhY2VfaW5mby0+a29iaik7IC8qIHB1dCBpbiByZWxlYXNlICovCisJCXJldCA9IGtvYmplY3RfYWRkKGtvYmosICZzcGFjZV9pbmZvLT5rb2JqLCAiJXMiLAorCQkJCSAgZ2V0X3JhaWRfbmFtZShpbmRleCkpOworCQlpZiAocmV0KSB7CisJCQlwcl93YXJuKCJCVFJGUzogZmFpbGVkIHRvIGFkZCBrb2JqZWN0IGZvciBibG9jayBjYWNoZS4gaWdub3JpbmcuXG4iKTsKKwkJCWtvYmplY3RfcHV0KCZzcGFjZV9pbmZvLT5rb2JqKTsKKwkJfQorCX0KIAlsaXN0X2FkZF90YWlsKCZjYWNoZS0+bGlzdCwgJnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwc1tpbmRleF0pOwogCXVwX3dyaXRlKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKIH0KIAorc3RhdGljIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqCitidHJmc19jcmVhdGVfYmxvY2tfZ3JvdXBfY2FjaGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKKworCWNhY2hlID0ga3phbGxvYyhzaXplb2YoKmNhY2hlKSwgR0ZQX05PRlMpOworCWlmICghY2FjaGUpCisJCXJldHVybiBOVUxMOworCisJY2FjaGUtPmZyZWVfc3BhY2VfY3RsID0ga3phbGxvYyhzaXplb2YoKmNhY2hlLT5mcmVlX3NwYWNlX2N0bCksCisJCQkJCUdGUF9OT0ZTKTsKKwlpZiAoIWNhY2hlLT5mcmVlX3NwYWNlX2N0bCkgeworCQlrZnJlZShjYWNoZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNhY2hlLT5rZXkub2JqZWN0aWQgPSBzdGFydDsKKwljYWNoZS0+a2V5Lm9mZnNldCA9IHNpemU7CisJY2FjaGUtPmtleS50eXBlID0gQlRSRlNfQkxPQ0tfR1JPVVBfSVRFTV9LRVk7CisKKwljYWNoZS0+c2VjdG9yc2l6ZSA9IHJvb3QtPnNlY3RvcnNpemU7CisJY2FjaGUtPmZzX2luZm8gPSByb290LT5mc19pbmZvOworCWNhY2hlLT5mdWxsX3N0cmlwZV9sZW4gPSBidHJmc19mdWxsX3N0cmlwZV9sZW4ocm9vdCwKKwkJCQkJICAgICAgICZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsCisJCQkJCSAgICAgICBzdGFydCk7CisJYXRvbWljX3NldCgmY2FjaGUtPmNvdW50LCAxKTsKKwlzcGluX2xvY2tfaW5pdCgmY2FjaGUtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5jbHVzdGVyX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+bmV3X2JnX2xpc3QpOworCWJ0cmZzX2luaXRfZnJlZV9zcGFjZV9jdGwoY2FjaGUpOworCisJcmV0dXJuIGNhY2hlOworfQorCiBpbnQgYnRyZnNfcmVhZF9ibG9ja19ncm91cHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CkBAIC04Mzk1LDI2ICs4NDMxLDE2IEBACiAJCQlicmVhazsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnJvcjsKKwogCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7Ci0JCWNhY2hlID0ga3phbGxvYyhzaXplb2YoKmNhY2hlKSwgR0ZQX05PRlMpOworCisJCWNhY2hlID0gYnRyZnNfY3JlYXRlX2Jsb2NrX2dyb3VwX2NhY2hlKHJvb3QsIGZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQkJCSAgICAgICBmb3VuZF9rZXkub2Zmc2V0KTsKIAkJaWYgKCFjYWNoZSkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJY2FjaGUtPmZyZWVfc3BhY2VfY3RsID0ga3phbGxvYyhzaXplb2YoKmNhY2hlLT5mcmVlX3NwYWNlX2N0bCksCi0JCQkJCQlHRlBfTk9GUyk7Ci0JCWlmICghY2FjaGUtPmZyZWVfc3BhY2VfY3RsKSB7Ci0JCQlrZnJlZShjYWNoZSk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWF0b21pY19zZXQoJmNhY2hlLT5jb3VudCwgMSk7Ci0JCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+bG9jayk7Ci0JCWNhY2hlLT5mc19pbmZvID0gaW5mbzsKLQkJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5jbHVzdGVyX2xpc3QpOwogCiAJCWlmIChuZWVkX2NsZWFyKSB7CiAJCQkvKgpAQCAtODQzNSwxNiArODQ2MSwxMCBAQAogCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgJmNhY2hlLT5pdGVtLAogCQkJCSAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBwYXRoLT5zbG90c1swXSksCiAJCQkJICAgc2l6ZW9mKGNhY2hlLT5pdGVtKSk7Ci0JCW1lbWNweSgmY2FjaGUtPmtleSwgJmZvdW5kX2tleSwgc2l6ZW9mKGZvdW5kX2tleSkpOworCQljYWNoZS0+ZmxhZ3MgPSBidHJmc19ibG9ja19ncm91cF9mbGFncygmY2FjaGUtPml0ZW0pOwogCiAJCWtleS5vYmplY3RpZCA9IGZvdW5kX2tleS5vYmplY3RpZCArIGZvdW5kX2tleS5vZmZzZXQ7CiAJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKLQkJY2FjaGUtPmZsYWdzID0gYnRyZnNfYmxvY2tfZ3JvdXBfZmxhZ3MoJmNhY2hlLT5pdGVtKTsKLQkJY2FjaGUtPnNlY3RvcnNpemUgPSByb290LT5zZWN0b3JzaXplOwotCQljYWNoZS0+ZnVsbF9zdHJpcGVfbGVuID0gYnRyZnNfZnVsbF9zdHJpcGVfbGVuKHJvb3QsCi0JCQkJCSAgICAgICAmcm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlLAotCQkJCQkgICAgICAgZm91bmRfa2V5Lm9iamVjdGlkKTsKLQkJYnRyZnNfaW5pdF9mcmVlX3NwYWNlX2N0bChjYWNoZSk7CiAKIAkJLyoKIAkJICogV2UgbmVlZCB0byBleGNsdWRlIHRoZSBzdXBlciBzdHJpcGVzIG5vdyBzbyB0aGF0IHRoZSBzcGFjZQpAQCAtODQ1OCw4ICs4NDc4LDcgQEAKIAkJCSAqIGNhc2UuCiAJCQkgKi8KIAkJCWZyZWVfZXhjbHVkZWRfZXh0ZW50cyhyb290LCBjYWNoZSk7Ci0JCQlrZnJlZShjYWNoZS0+ZnJlZV9zcGFjZV9jdGwpOwotCQkJa2ZyZWUoY2FjaGUpOworCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIApAQCAtODU5MCwzOCArODYwOSwxNSBAQAogCiAJcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19sb2dfZnVsbF9jb21taXQgPSB0cmFucy0+dHJhbnNpZDsKIAotCWNhY2hlID0ga3phbGxvYyhzaXplb2YoKmNhY2hlKSwgR0ZQX05PRlMpOworCWNhY2hlID0gYnRyZnNfY3JlYXRlX2Jsb2NrX2dyb3VwX2NhY2hlKHJvb3QsIGNodW5rX29mZnNldCwgc2l6ZSk7CiAJaWYgKCFjYWNoZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JY2FjaGUtPmZyZWVfc3BhY2VfY3RsID0ga3phbGxvYyhzaXplb2YoKmNhY2hlLT5mcmVlX3NwYWNlX2N0bCksCi0JCQkJCUdGUF9OT0ZTKTsKLQlpZiAoIWNhY2hlLT5mcmVlX3NwYWNlX2N0bCkgewotCQlrZnJlZShjYWNoZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNhY2hlLT5rZXkub2JqZWN0aWQgPSBjaHVua19vZmZzZXQ7Ci0JY2FjaGUtPmtleS5vZmZzZXQgPSBzaXplOwotCWNhY2hlLT5rZXkudHlwZSA9IEJUUkZTX0JMT0NLX0dST1VQX0lURU1fS0VZOwotCWNhY2hlLT5zZWN0b3JzaXplID0gcm9vdC0+c2VjdG9yc2l6ZTsKLQljYWNoZS0+ZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87Ci0JY2FjaGUtPmZ1bGxfc3RyaXBlX2xlbiA9IGJ0cmZzX2Z1bGxfc3RyaXBlX2xlbihyb290LAotCQkJCQkgICAgICAgJnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZSwKLQkJCQkJICAgICAgIGNodW5rX29mZnNldCk7Ci0KLQlhdG9taWNfc2V0KCZjYWNoZS0+Y291bnQsIDEpOwotCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNsdXN0ZXJfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5uZXdfYmdfbGlzdCk7Ci0KLQlidHJmc19pbml0X2ZyZWVfc3BhY2VfY3RsKGNhY2hlKTsKIAogCWJ0cmZzX3NldF9ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSwgYnl0ZXNfdXNlZCk7CiAJYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX2NodW5rX29iamVjdGlkKCZjYWNoZS0+aXRlbSwgY2h1bmtfb2JqZWN0aWQpOwotCWNhY2hlLT5mbGFncyA9IHR5cGU7CiAJYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX2ZsYWdzKCZjYWNoZS0+aXRlbSwgdHlwZSk7CiAKKwljYWNoZS0+ZmxhZ3MgPSB0eXBlOwogCWNhY2hlLT5sYXN0X2J5dGVfdG9fdW5waW4gPSAodTY0KS0xOwogCWNhY2hlLT5jYWNoZWQgPSBCVFJGU19DQUNIRV9GSU5JU0hFRDsKIAlyZXQgPSBleGNsdWRlX3N1cGVyX3N0cmlwZXMocm9vdCwgY2FjaGUpOwpAQCAtODYzMSw4ICs4NjI3LDcgQEAKIAkJICogY2FzZS4KIAkJICovCiAJCWZyZWVfZXhjbHVkZWRfZXh0ZW50cyhyb290LCBjYWNoZSk7Ci0JCWtmcmVlKGNhY2hlLT5mcmVlX3NwYWNlX2N0bCk7Ci0JCWtmcmVlKGNhY2hlKTsKKwkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTg3OTYsOCArODc5MSwxMSBAQAogCSAqIGFyZSBzdGlsbCBvbiB0aGUgbGlzdCBhZnRlciB0YWtpbmcgdGhlIHNlbWFwaG9yZQogCSAqLwogCWxpc3RfZGVsX2luaXQoJmJsb2NrX2dyb3VwLT5saXN0KTsKLQlpZiAobGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwc1tpbmRleF0pKQorCWlmIChsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+YmxvY2tfZ3JvdXBzW2luZGV4XSkpIHsKKwkJa29iamVjdF9kZWwoJmJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5ibG9ja19ncm91cF9rb2Jqc1tpbmRleF0pOworCQlrb2JqZWN0X3B1dCgmYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPmJsb2NrX2dyb3VwX2tvYmpzW2luZGV4XSk7CiAJCWNsZWFyX2F2YWlsX2FsbG9jX2JpdHMocm9vdC0+ZnNfaW5mbywgYmxvY2tfZ3JvdXAtPmZsYWdzKTsKKwl9CiAJdXBfd3JpdGUoJmJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKIAogCWlmIChibG9ja19ncm91cC0+Y2FjaGVkID09IEJUUkZTX0NBQ0hFX1NUQVJURUQpCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IGZmNDM4MDIuLjg1YmJkMDEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC01OSw3ICs1OSw3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnN0YXRlcykpIHsKIAkJc3RhdGUgPSBsaXN0X2VudHJ5KHN0YXRlcy5uZXh0LCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCBsZWFrX2xpc3QpOwotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHN0YXRlIGxlYWs6IHN0YXJ0ICVsbHUgZW5kICVsbHUgIgorCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBzdGF0ZSBsZWFrOiBzdGFydCAlbGx1IGVuZCAlbGx1ICIKIAkJICAgICAgICJzdGF0ZSAlbHUgaW4gdHJlZSAlcCByZWZzICVkXG4iLAogCQkgICAgICAgc3RhdGUtPnN0YXJ0LCBzdGF0ZS0+ZW5kLCBzdGF0ZS0+c3RhdGUsIHN0YXRlLT50cmVlLAogCQkgICAgICAgYXRvbWljX3JlYWQoJnN0YXRlLT5yZWZzKSk7CkBAIC02OSw3ICs2OSw3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmJ1ZmZlcnMpKSB7CiAJCWViID0gbGlzdF9lbnRyeShidWZmZXJzLm5leHQsIHN0cnVjdCBleHRlbnRfYnVmZmVyLCBsZWFrX2xpc3QpOwotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGJ1ZmZlciBsZWFrIHN0YXJ0ICVsbHUgbGVuICVsdSAiCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IGJ1ZmZlciBsZWFrIHN0YXJ0ICVsbHUgbGVuICVsdSAiCiAJCSAgICAgICAicmVmcyAlZFxuIiwKIAkJICAgICAgIGViLT5zdGFydCwgZWItPmxlbiwgYXRvbWljX3JlYWQoJmViLT5yZWZzKSk7CiAJCWxpc3RfZGVsKCZlYi0+bGVha19saXN0KTsKQEAgLTc3LDE2ICs3NywyMiBAQAogCX0KIH0KIAotI2RlZmluZSBidHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UoaW5vZGUsIHN0YXJ0LCBlbmQpCQlcCi0JX19idHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UoX19mdW5jX18sIChpbm9kZSksIChzdGFydCksIChlbmQpKQorI2RlZmluZSBidHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UodHJlZSwgc3RhcnQsIGVuZCkJCVwKKwlfX2J0cmZzX2RlYnVnX2NoZWNrX2V4dGVudF9pb19yYW5nZShfX2Z1bmNfXywgKHRyZWUpLCAoc3RhcnQpLCAoZW5kKSkKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2J0cmZzX2RlYnVnX2NoZWNrX2V4dGVudF9pb19yYW5nZShjb25zdCBjaGFyICpjYWxsZXIsCi0JCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCkKKwkJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQpCiB7Ci0JdTY0IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdTY0IGlzaXplOwogCisJaWYgKCF0cmVlLT5tYXBwaW5nKQorCQlyZXR1cm47CisKKwlpbm9kZSA9IHRyZWUtPm1hcHBpbmctPmhvc3Q7CisJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJaWYgKGVuZCA+PSBQQUdFX1NJWkUgJiYgKGVuZCAlIDIpID09IDAgJiYgZW5kICE9IGlzaXplIC0gMSkgewogCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9ERUJVRwotCQkgICAgImJ0cmZzOiAlczogaW5vICVsbHUgaXNpemUgJWxsdSBvZGQgcmFuZ2UgWyVsbHUsJWxsdV1cbiIsCisJCSAgICAiQlRSRlM6ICVzOiBpbm8gJWxsdSBpc2l6ZSAlbGx1IG9kZCByYW5nZSBbJWxsdSwlbGx1XVxuIiwKIAkJCQljYWxsZXIsIGJ0cmZzX2lubyhpbm9kZSksIGlzaXplLCBzdGFydCwgZW5kKTsKIAl9CiB9CkBAIC0xMjQsNiArMTMwLDggQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKgogdHJlZV9mc19pbmZvKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSkKIHsKKwlpZiAoIXRyZWUtPm1hcHBpbmcpCisJCXJldHVybiBOVUxMOwogCXJldHVybiBidHJmc19zYih0cmVlLT5tYXBwaW5nLT5ob3N0LT5pX3NiKTsKIH0KIApAQCAtMTg2LDExICsxOTQsOSBAQAogCQkJIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQogewogCXRyZWUtPnN0YXRlID0gUkJfUk9PVDsKLQlJTklUX1JBRElYX1RSRUUoJnRyZWUtPmJ1ZmZlciwgR0ZQX0FUT01JQyk7CiAJdHJlZS0+b3BzID0gTlVMTDsKIAl0cmVlLT5kaXJ0eV9ieXRlcyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0cmVlLT5idWZmZXJfbG9jayk7CiAJdHJlZS0+bWFwcGluZyA9IG1hcHBpbmc7CiB9CiAKQEAgLTIyNCwxMiArMjMwLDIwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQsCi0JCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCisJCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IHJiX25vZGUgKioqcF9pbiwKKwkJCQkgICBzdHJ1Y3QgcmJfbm9kZSAqKnBhcmVudF9pbikKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgdHJlZV9lbnRyeSAqZW50cnk7CiAKKwlpZiAocF9pbiAmJiBwYXJlbnRfaW4pIHsKKwkJcCA9ICpwX2luOworCQlwYXJlbnQgPSAqcGFyZW50X2luOworCQlnb3RvIGRvX2luc2VydDsKKwl9CisKIAl3aGlsZSAoKnApIHsKIAkJcGFyZW50ID0gKnA7CiAJCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdHJlZV9lbnRyeSwgcmJfbm9kZSk7CkBAIC0yNDIsMzUgKzI1Niw0MyBAQAogCQkJcmV0dXJuIHBhcmVudDsKIAl9CiAKK2RvX2luc2VydDoKIAlyYl9saW5rX25vZGUobm9kZSwgcGFyZW50LCBwKTsKIAlyYl9pbnNlcnRfY29sb3Iobm9kZSwgcm9vdCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqX19ldHJlZV9zZWFyY2goc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgb2Zmc2V0LAotCQkJCSAgICAgc3RydWN0IHJiX25vZGUgKipwcmV2X3JldCwKLQkJCQkgICAgIHN0cnVjdCByYl9ub2RlICoqbmV4dF9yZXQpCisJCQkJICAgICAgc3RydWN0IHJiX25vZGUgKipwcmV2X3JldCwKKwkJCQkgICAgICBzdHJ1Y3QgcmJfbm9kZSAqKm5leHRfcmV0LAorCQkJCSAgICAgIHN0cnVjdCByYl9ub2RlICoqKnBfcmV0LAorCQkJCSAgICAgIHN0cnVjdCByYl9ub2RlICoqcGFyZW50X3JldCkKIHsKIAlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZ0cmVlLT5zdGF0ZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKipuID0gJnJvb3QtPnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnByZXYgPSBOVUxMOwogCXN0cnVjdCByYl9ub2RlICpvcmlnX3ByZXYgPSBOVUxMOwogCXN0cnVjdCB0cmVlX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgdHJlZV9lbnRyeSAqcHJldl9lbnRyeSA9IE5VTEw7CiAKLQl3aGlsZSAobikgewotCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCB0cmVlX2VudHJ5LCByYl9ub2RlKTsKLQkJcHJldiA9IG47CisJd2hpbGUgKCpuKSB7CisJCXByZXYgPSAqbjsKKwkJZW50cnkgPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3QgdHJlZV9lbnRyeSwgcmJfbm9kZSk7CiAJCXByZXZfZW50cnkgPSBlbnRyeTsKIAogCQlpZiAob2Zmc2V0IDwgZW50cnktPnN0YXJ0KQotCQkJbiA9IG4tPnJiX2xlZnQ7CisJCQluID0gJigqbiktPnJiX2xlZnQ7CiAJCWVsc2UgaWYgKG9mZnNldCA+IGVudHJ5LT5lbmQpCi0JCQluID0gbi0+cmJfcmlnaHQ7CisJCQluID0gJigqbiktPnJiX3JpZ2h0OwogCQllbHNlCi0JCQlyZXR1cm4gbjsKKwkJCXJldHVybiAqbjsKIAl9CiAKKwlpZiAocF9yZXQpCisJCSpwX3JldCA9IG47CisJaWYgKHBhcmVudF9yZXQpCisJCSpwYXJlbnRfcmV0ID0gcHJldjsKKwogCWlmIChwcmV2X3JldCkgewogCQlvcmlnX3ByZXYgPSBwcmV2OwogCQl3aGlsZSAocHJldiAmJiBvZmZzZXQgPiBwcmV2X2VudHJ5LT5lbmQpIHsKQEAgLTI5MiwxOCArMzE0LDI3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJiX25vZGUgKnRyZWVfc2VhcmNoKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKLQkJCQkJICB1NjQgb2Zmc2V0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmJfbm9kZSAqCit0cmVlX3NlYXJjaF9mb3JfaW5zZXJ0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJICAgICAgIHU2NCBvZmZzZXQsCisJCSAgICAgICBzdHJ1Y3QgcmJfbm9kZSAqKipwX3JldCwKKwkJICAgICAgIHN0cnVjdCByYl9ub2RlICoqcGFyZW50X3JldCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKnJldDsKIAotCXJldCA9IF9fZXRyZWVfc2VhcmNoKHRyZWUsIG9mZnNldCwgJnByZXYsIE5VTEwpOworCXJldCA9IF9fZXRyZWVfc2VhcmNoKHRyZWUsIG9mZnNldCwgJnByZXYsIE5VTEwsIHBfcmV0LCBwYXJlbnRfcmV0KTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuIHByZXY7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9zZWFyY2goc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCQkgIHU2NCBvZmZzZXQpCit7CisJcmV0dXJuIHRyZWVfc2VhcmNoX2Zvcl9pbnNlcnQodHJlZSwgb2Zmc2V0LCBOVUxMLCBOVUxMKTsKK30KKwogc3RhdGljIHZvaWQgbWVyZ2VfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpuZXcsCiAJCSAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXIpCiB7CkBAIC0zODUsMjMgKzQxNiwyNSBAQAogICovCiBzdGF0aWMgaW50IGluc2VydF9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJc3RydWN0IHJiX25vZGUgKioqcCwKKwkJCXN0cnVjdCByYl9ub2RlICoqcGFyZW50LAogCQkJdW5zaWduZWQgbG9uZyAqYml0cykKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAogCWlmIChlbmQgPCBzdGFydCkKLQkJV0FSTigxLCBLRVJOX0VSUiAiYnRyZnMgZW5kIDwgc3RhcnQgJWxsdSAlbGx1XG4iLAorCQlXQVJOKDEsIEtFUk5fRVJSICJCVFJGUzogZW5kIDwgc3RhcnQgJWxsdSAlbGx1XG4iLAogCQkgICAgICAgZW5kLCBzdGFydCk7CiAJc3RhdGUtPnN0YXJ0ID0gc3RhcnQ7CiAJc3RhdGUtPmVuZCA9IGVuZDsKIAogCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCBiaXRzKTsKIAotCW5vZGUgPSB0cmVlX2luc2VydCgmdHJlZS0+c3RhdGUsIGVuZCwgJnN0YXRlLT5yYl9ub2RlKTsKKwlub2RlID0gdHJlZV9pbnNlcnQoJnRyZWUtPnN0YXRlLCBlbmQsICZzdGF0ZS0+cmJfbm9kZSwgcCwgcGFyZW50KTsKIAlpZiAobm9kZSkgewogCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpmb3VuZDsKIAkJZm91bmQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBmb3VuZCBub2RlICVsbHUgJWxsdSBvbiBpbnNlcnQgb2YgIgorCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBmb3VuZCBub2RlICVsbHUgJWxsdSBvbiBpbnNlcnQgb2YgIgogCQkgICAgICAgIiVsbHUgJWxsdVxuIiwKIAkJICAgICAgIGZvdW5kLT5zdGFydCwgZm91bmQtPmVuZCwgc3RhcnQsIGVuZCk7CiAJCXJldHVybiAtRUVYSVNUOwpAQCAtNDQ0LDcgKzQ3Nyw4IEBACiAJcHJlYWxsb2MtPnN0YXRlID0gb3JpZy0+c3RhdGU7CiAJb3JpZy0+c3RhcnQgPSBzcGxpdDsKIAotCW5vZGUgPSB0cmVlX2luc2VydCgmdHJlZS0+c3RhdGUsIHByZWFsbG9jLT5lbmQsICZwcmVhbGxvYy0+cmJfbm9kZSk7CisJbm9kZSA9IHRyZWVfaW5zZXJ0KCZ0cmVlLT5zdGF0ZSwgcHJlYWxsb2MtPmVuZCwgJnByZWFsbG9jLT5yYl9ub2RlLAorCQkJICAgTlVMTCwgTlVMTCk7CiAJaWYgKG5vZGUpIHsKIAkJZnJlZV9leHRlbnRfc3RhdGUocHJlYWxsb2MpOwogCQlyZXR1cm4gLUVFWElTVDsKQEAgLTU0Miw3ICs1NzYsNyBAQAogCWludCBlcnI7CiAJaW50IGNsZWFyID0gMDsKIAotCWJ0cmZzX2RlYnVnX2NoZWNrX2V4dGVudF9pb19yYW5nZSh0cmVlLT5tYXBwaW5nLT5ob3N0LCBzdGFydCwgZW5kKTsKKwlidHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UodHJlZSwgc3RhcnQsIGVuZCk7CiAKIAlpZiAoYml0cyAmIEVYVEVOVF9ERUxBTExPQykKIAkJYml0cyB8PSBFWFRFTlRfTk9SRVNFUlZFOwpAQCAtNzAyLDcgKzczNiw3IEBACiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKLQlidHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhcnQsIGVuZCk7CisJYnRyZnNfZGVidWdfY2hlY2tfZXh0ZW50X2lvX3JhbmdlKHRyZWUsIHN0YXJ0LCBlbmQpOwogCiAJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKIGFnYWluOgpAQCAtNzgzLDExICs4MTcsMTMgQEAKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpwcmVhbGxvYyA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHJiX25vZGUgKipwOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CiAJaW50IGVyciA9IDA7CiAJdTY0IGxhc3Rfc3RhcnQ7CiAJdTY0IGxhc3RfZW5kOwogCi0JYnRyZnNfZGVidWdfY2hlY2tfZXh0ZW50X2lvX3JhbmdlKHRyZWUtPm1hcHBpbmctPmhvc3QsIHN0YXJ0LCBlbmQpOworCWJ0cmZzX2RlYnVnX2NoZWNrX2V4dGVudF9pb19yYW5nZSh0cmVlLCBzdGFydCwgZW5kKTsKIAogCWJpdHMgfD0gRVhURU5UX0ZJUlNUX0RFTEFMTE9DOwogYWdhaW46CkBAIC04MDksMTQgKzg0NSwxNiBAQAogCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKIAkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgogCSAqLwotCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CisJbm9kZSA9IHRyZWVfc2VhcmNoX2Zvcl9pbnNlcnQodHJlZSwgc3RhcnQsICZwLCAmcGFyZW50KTsKIAlpZiAoIW5vZGUpIHsKIAkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKIAkJQlVHX09OKCFwcmVhbGxvYyk7Ci0JCWVyciA9IGluc2VydF9zdGF0ZSh0cmVlLCBwcmVhbGxvYywgc3RhcnQsIGVuZCwgJmJpdHMpOworCQllcnIgPSBpbnNlcnRfc3RhdGUodHJlZSwgcHJlYWxsb2MsIHN0YXJ0LCBlbmQsCisJCQkJICAgJnAsICZwYXJlbnQsICZiaXRzKTsKIAkJaWYgKGVycikKIAkJCWV4dGVudF9pb190cmVlX3BhbmljKHRyZWUsIGVycik7CiAKKwkJY2FjaGVfc3RhdGUocHJlYWxsb2MsIGNhY2hlZF9zdGF0ZSk7CiAJCXByZWFsbG9jID0gTlVMTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTE5LDcgKzk1Nyw3IEBACiAJCSAqIHRoZSBsYXRlciBleHRlbnQuCiAJCSAqLwogCQllcnIgPSBpbnNlcnRfc3RhdGUodHJlZSwgcHJlYWxsb2MsIHN0YXJ0LCB0aGlzX2VuZCwKLQkJCQkgICAmYml0cyk7CisJCQkJICAgTlVMTCwgTlVMTCwgJmJpdHMpOwogCQlpZiAoZXJyKQogCQkJZXh0ZW50X2lvX3RyZWVfcGFuaWModHJlZSwgZXJyKTsKIApAQCAtMTAwNSwxMSArMTA0MywxMyBAQAogCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOwogCXN0cnVjdCBleHRlbnRfc3RhdGUgKnByZWFsbG9jID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnA7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudDsKIAlpbnQgZXJyID0gMDsKIAl1NjQgbGFzdF9zdGFydDsKIAl1NjQgbGFzdF9lbmQ7CiAKLQlidHJmc19kZWJ1Z19jaGVja19leHRlbnRfaW9fcmFuZ2UodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhcnQsIGVuZCk7CisJYnRyZnNfZGVidWdfY2hlY2tfZXh0ZW50X2lvX3JhbmdlKHRyZWUsIHN0YXJ0LCBlbmQpOwogCiBhZ2FpbjoKIAlpZiAoIXByZWFsbG9jICYmIChtYXNrICYgX19HRlBfV0FJVCkpIHsKQEAgLTEwMzIsMTcgKzEwNzIsMTkgQEAKIAkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgYWxsIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCiAJICogb3VyIHJhbmdlIHN0YXJ0cy4KIAkgKi8KLQlub2RlID0gdHJlZV9zZWFyY2godHJlZSwgc3RhcnQpOworCW5vZGUgPSB0cmVlX3NlYXJjaF9mb3JfaW5zZXJ0KHRyZWUsIHN0YXJ0LCAmcCwgJnBhcmVudCk7CiAJaWYgKCFub2RlKSB7CiAJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlX2F0b21pYyhwcmVhbGxvYyk7CiAJCWlmICghcHJlYWxsb2MpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQotCQllcnIgPSBpbnNlcnRfc3RhdGUodHJlZSwgcHJlYWxsb2MsIHN0YXJ0LCBlbmQsICZiaXRzKTsKLQkJcHJlYWxsb2MgPSBOVUxMOworCQllcnIgPSBpbnNlcnRfc3RhdGUodHJlZSwgcHJlYWxsb2MsIHN0YXJ0LCBlbmQsCisJCQkJICAgJnAsICZwYXJlbnQsICZiaXRzKTsKIAkJaWYgKGVycikKIAkJCWV4dGVudF9pb190cmVlX3BhbmljKHRyZWUsIGVycik7CisJCWNhY2hlX3N0YXRlKHByZWFsbG9jLCBjYWNoZWRfc3RhdGUpOworCQlwcmVhbGxvYyA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KIAlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOwpAQCAtMTEzNSw3ICsxMTc3LDcgQEAKIAkJICogdGhlIGxhdGVyIGV4dGVudC4KIAkJICovCiAJCWVyciA9IGluc2VydF9zdGF0ZSh0cmVlLCBwcmVhbGxvYywgc3RhcnQsIHRoaXNfZW5kLAotCQkJCSAgICZiaXRzKTsKKwkJCQkgICBOVUxMLCBOVUxMLCAmYml0cyk7CiAJCWlmIChlcnIpCiAJCQlleHRlbnRfaW9fdHJlZV9wYW5pYyh0cmVlLCBlcnIpOwogCQljYWNoZV9zdGF0ZShwcmVhbGxvYywgY2FjaGVkX3N0YXRlKTsKQEAgLTE5ODQsNyArMjAyNiw3IEBACiAJYmlvID0gYnRyZnNfaW9fYmlvX2FsbG9jKEdGUF9OT0ZTLCAxKTsKIAlpZiAoIWJpbykKIAkJcmV0dXJuIC1FSU87Ci0JYmlvLT5iaV9zaXplID0gMDsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IDA7CiAJbWFwX2xlbmd0aCA9IGxlbmd0aDsKIAogCXJldCA9IGJ0cmZzX21hcF9ibG9jayhmc19pbmZvLCBXUklURSwgbG9naWNhbCwKQEAgLTE5OTUsNyArMjAzNyw3IEBACiAJfQogCUJVR19PTihtaXJyb3JfbnVtICE9IGJiaW8tPm1pcnJvcl9udW0pOwogCXNlY3RvciA9IGJiaW8tPnN0cmlwZXNbbWlycm9yX251bS0xXS5waHlzaWNhbCA+PiA5OwotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3I7CiAJZGV2ID0gYmJpby0+c3RyaXBlc1ttaXJyb3JfbnVtLTFdLmRldjsKIAlrZnJlZShiYmlvKTsKIAlpZiAoIWRldiB8fCAhZGV2LT5iZGV2IHx8ICFkZXYtPndyaXRlYWJsZSkgewpAQCAtMjAxMiw5ICsyMDU0LDEwIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXByaW50a19yYXRlbGltaXRlZF9pbl9yY3UoS0VSTl9JTkZPICJidHJmcyByZWFkIGVycm9yIGNvcnJlY3RlZDogaW5vICVsdSBvZmYgJWxsdSAiCi0JCSAgICAgICIoZGV2ICVzIHNlY3RvciAlbGx1KVxuIiwgcGFnZS0+bWFwcGluZy0+aG9zdC0+aV9pbm8sCi0JCSAgICAgIHN0YXJ0LCByY3Vfc3RyX2RlcmVmKGRldi0+bmFtZSksIHNlY3Rvcik7CisJcHJpbnRrX3JhdGVsaW1pdGVkX2luX3JjdShLRVJOX0lORk8KKwkJCSJCVFJGUzogcmVhZCBlcnJvciBjb3JyZWN0ZWQ6IGlubyAlbHUgb2ZmICVsbHUgIgorCQkgICAgIihkZXYgJXMgc2VjdG9yICVsbHUpXG4iLCBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX2lubywKKwkJICAgIHN0YXJ0LCByY3Vfc3RyX2RlcmVmKGRldi0+bmFtZSksIHNlY3Rvcik7CiAKIAliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIDA7CkBAIC0yMTU2LDcgKzIxOTksNyBAQAogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAotCQlpZiAoZW0tPnN0YXJ0ID4gc3RhcnQgfHwgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8IHN0YXJ0KSB7CisJCWlmIChlbS0+c3RhcnQgPiBzdGFydCB8fCBlbS0+c3RhcnQgKyBlbS0+bGVuIDw9IHN0YXJ0KSB7CiAJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJZW0gPSBOVUxMOwogCQl9CkBAIC0yMjY4LDkgKzIzMTEsOSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAJYmlvLT5iaV9lbmRfaW8gPSBmYWlsZWRfYmlvLT5iaV9lbmRfaW87Ci0JYmlvLT5iaV9zZWN0b3IgPSBmYWlscmVjLT5sb2dpY2FsID4+IDk7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGZhaWxyZWMtPmxvZ2ljYWwgPj4gOTsKIAliaW8tPmJpX2JkZXYgPSBCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bGF0ZXN0X2JkZXY7Ci0JYmlvLT5iaV9zaXplID0gMDsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IDA7CiAKIAlidHJmc19mYWlsZWRfYmlvID0gYnRyZnNfaW9fYmlvKGZhaWxlZF9iaW8pOwogCWlmIChidHJmc19mYWlsZWRfYmlvLT5jc3VtKSB7CkBAIC0yMzMyLDM3ICsyMzc1LDM5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9iaW9fZXh0ZW50X3dyaXRlcGFnZShzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXN0cnVjdCBiaW9fdmVjICpidmVjOwogCXU2NCBzdGFydDsKIAl1NjQgZW5kOworCWludCBpOwogCi0JZG8geworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmVjLCBiaW8sIGkpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOwotCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CiAKIAkJLyogV2UgYWx3YXlzIGlzc3VlIGZ1bGwtcGFnZSByZWFkcywgYnV0IGlmIHNvbWUgYmxvY2sKIAkJICogaW4gYSBwYWdlIGZhaWxzIHRvIHJlYWQsIGJsa191cGRhdGVfcmVxdWVzdCgpIHdpbGwKIAkJICogYWR2YW5jZSBidl9vZmZzZXQgYW5kIGFkanVzdCBidl9sZW4gdG8gY29tcGVuc2F0ZS4KIAkJICogUHJpbnQgYSB3YXJuaW5nIGZvciBub256ZXJvIG9mZnNldHMsIGFuZCBhbiBlcnJvcgogCQkgKiBpZiB0aGV5IGRvbid0IGFkZCB1cCB0byBhIGZ1bGwgcGFnZS4gICovCi0JCWlmIChidmVjLT5idl9vZmZzZXQgfHwgYnZlYy0+YnZfbGVuICE9IFBBR0VfQ0FDSEVfU0laRSkKLQkJCXByaW50aygiJXMgcGFnZSB3cml0ZSBpbiBidHJmcyB3aXRoIG9mZnNldCAldSBhbmQgbGVuZ3RoICV1XG4iLAotCQkJICAgICAgIGJ2ZWMtPmJ2X29mZnNldCArIGJ2ZWMtPmJ2X2xlbiAhPSBQQUdFX0NBQ0hFX1NJWkUKLQkJCSAgICAgICA/IEtFUk5fRVJSICJwYXJ0aWFsIiA6IEtFUk5fSU5GTyAiaW5jb21wbGV0ZSIsCi0JCQkgICAgICAgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4pOworCQlpZiAoYnZlYy0+YnZfb2Zmc2V0IHx8IGJ2ZWMtPmJ2X2xlbiAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCWlmIChidmVjLT5idl9vZmZzZXQgKyBidmVjLT5idl9sZW4gIT0gUEFHRV9DQUNIRV9TSVpFKQorCQkJCWJ0cmZzX2VycihCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5yb290LT5mc19pbmZvLAorCQkJCSAgICJwYXJ0aWFsIHBhZ2Ugd3JpdGUgaW4gYnRyZnMgd2l0aCBvZmZzZXQgJXUgYW5kIGxlbmd0aCAldSIsCisJCQkJCWJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKKwkJCWVsc2UKKwkJCQlidHJmc19pbmZvKEJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPnJvb3QtPmZzX2luZm8sCisJCQkJICAgImluY29tcGxldGUgcGFnZSB3cml0ZSBpbiBidHJmcyB3aXRoIG9mZnNldCAldSBhbmQgIgorCQkJCSAgICJsZW5ndGggJXUiLAorCQkJCQlidmVjLT5idl9vZmZzZXQsIGJ2ZWMtPmJ2X2xlbik7CisJCX0KIAogCQlzdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCQllbmQgPSBzdGFydCArIGJ2ZWMtPmJ2X29mZnNldCArIGJ2ZWMtPmJ2X2xlbiAtIDE7CiAKLQkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKLQkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOwotCiAJCWlmIChlbmRfZXh0ZW50X3dyaXRlcGFnZShwYWdlLCBlcnIsIHN0YXJ0LCBlbmQpKQogCQkJY29udGludWU7CiAKIAkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOworCX0KIAogCWJpb19wdXQoYmlvKTsKIH0KQEAgLTIzOTIsOSArMjQzNyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9iaW9fZXh0ZW50X3JlYWRwYWdlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAlpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlY19lbmQgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKIAlzdHJ1Y3QgYnRyZnNfaW9fYmlvICppb19iaW8gPSBidHJmc19pb19iaW8oYmlvKTsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CiAJdTY0IG9mZnNldCA9IDA7CkBAIC0yNDA1LDE2ICsyNDQ5LDE3IEBACiAJdTY0IGV4dGVudF9sZW4gPSAwOwogCWludCBtaXJyb3I7CiAJaW50IHJldDsKKwlpbnQgaTsKIAogCWlmIChlcnIpCiAJCXVwdG9kYXRlID0gMDsKIAotCWRvIHsKKwliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAKIAkJcHJfZGVidWcoImVuZF9iaW9fZXh0ZW50X3JlYWRwYWdlOiBiaV9zZWN0b3I9JWxsdSwgZXJyPSVkLCAiCi0JCQkgIm1pcnJvcj0lbHVcbiIsICh1NjQpYmlvLT5iaV9zZWN0b3IsIGVyciwKKwkJCSAibWlycm9yPSVsdVxuIiwgKHU2NCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBlcnIsCiAJCQkgaW9fYmlvLT5taXJyb3JfbnVtKTsKIAkJdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKIApAQCAtMjQyMywxOSArMjQ2OCwyMiBAQAogCQkgKiBhZHZhbmNlIGJ2X29mZnNldCBhbmQgYWRqdXN0IGJ2X2xlbiB0byBjb21wZW5zYXRlLgogCQkgKiBQcmludCBhIHdhcm5pbmcgZm9yIG5vbnplcm8gb2Zmc2V0cywgYW5kIGFuIGVycm9yCiAJCSAqIGlmIHRoZXkgZG9uJ3QgYWRkIHVwIHRvIGEgZnVsbCBwYWdlLiAgKi8KLQkJaWYgKGJ2ZWMtPmJ2X29mZnNldCB8fCBidmVjLT5idl9sZW4gIT0gUEFHRV9DQUNIRV9TSVpFKQotCQkJcHJpbnRrKCIlcyBwYWdlIHJlYWQgaW4gYnRyZnMgd2l0aCBvZmZzZXQgJXUgYW5kIGxlbmd0aCAldVxuIiwKLQkJCSAgICAgICBidmVjLT5idl9vZmZzZXQgKyBidmVjLT5idl9sZW4gIT0gUEFHRV9DQUNIRV9TSVpFCi0JCQkgICAgICAgPyBLRVJOX0VSUiAicGFydGlhbCIgOiBLRVJOX0lORk8gImluY29tcGxldGUiLAotCQkJICAgICAgIGJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKKwkJaWYgKGJ2ZWMtPmJ2X29mZnNldCB8fCBidmVjLT5idl9sZW4gIT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlpZiAoYnZlYy0+YnZfb2Zmc2V0ICsgYnZlYy0+YnZfbGVuICE9IFBBR0VfQ0FDSEVfU0laRSkKKwkJCQlidHJmc19lcnIoQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdC0+ZnNfaW5mbywKKwkJCQkgICAicGFydGlhbCBwYWdlIHJlYWQgaW4gYnRyZnMgd2l0aCBvZmZzZXQgJXUgYW5kIGxlbmd0aCAldSIsCisJCQkJCWJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKKwkJCWVsc2UKKwkJCQlidHJmc19pbmZvKEJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPnJvb3QtPmZzX2luZm8sCisJCQkJICAgImluY29tcGxldGUgcGFnZSByZWFkIGluIGJ0cmZzIHdpdGggb2Zmc2V0ICV1IGFuZCAiCisJCQkJICAgImxlbmd0aCAldSIsCisJCQkJCWJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKKwkJfQogCiAJCXN0YXJ0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAJCWVuZCA9IHN0YXJ0ICsgYnZlYy0+YnZfb2Zmc2V0ICsgYnZlYy0+YnZfbGVuIC0gMTsKIAkJbGVuID0gYnZlYy0+YnZfbGVuOwogCi0JCWlmICgrK2J2ZWMgPD0gYnZlY19lbmQpCi0JCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKLQogCQltaXJyb3IgPSBpb19iaW8tPm1pcnJvcl9udW07CiAJCWlmIChsaWtlbHkodXB0b2RhdGUgJiYgdHJlZS0+b3BzICYmCiAJCQkgICB0cmVlLT5vcHMtPnJlYWRwYWdlX2VuZF9pb19ob29rKSkgewpAQCAtMjUxNiw3ICsyNTY0LDcgQEAKIAkJCWV4dGVudF9zdGFydCA9IHN0YXJ0OwogCQkJZXh0ZW50X2xlbiA9IGVuZCArIDEgLSBzdGFydDsKIAkJfQotCX0gd2hpbGUgKGJ2ZWMgPD0gYnZlY19lbmQpOworCX0KIAogCWlmIChleHRlbnRfbGVuKQogCQllbmRpb19yZWFkcGFnZV9yZWxlYXNlX2V4dGVudCh0cmVlLCBleHRlbnRfc3RhcnQsIGV4dGVudF9sZW4sCkBAIC0yNTQ3LDkgKzI1OTUsOCBAQAogCX0KIAogCWlmIChiaW8pIHsKLQkJYmlvLT5iaV9zaXplID0gMDsKIAkJYmlvLT5iaV9iZGV2ID0gYmRldjsKLQkJYmlvLT5iaV9zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CiAJCWJ0cmZzX2JpbyA9IGJ0cmZzX2lvX2JpbyhiaW8pOwogCQlidHJmc19iaW8tPmNzdW0gPSBOVUxMOwogCQlidHJmc19iaW8tPmNzdW1fYWxsb2NhdGVkID0gTlVMTDsKQEAgLTI2NDMsNyArMjY5MCw3IEBACiAJaWYgKGJpb19yZXQgJiYgKmJpb19yZXQpIHsKIAkJYmlvID0gKmJpb19yZXQ7CiAJCWlmIChvbGRfY29tcHJlc3NlZCkKLQkJCWNvbnRpZyA9IGJpby0+Ymlfc2VjdG9yID09IHNlY3RvcjsKKwkJCWNvbnRpZyA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPT0gc2VjdG9yOwogCQllbHNlCiAJCQljb250aWcgPSBiaW9fZW5kX3NlY3RvcihiaW8pID09IHNlY3RvcjsKIApAQCAtMzI4Nyw4ICszMzM0LDggQEAKIAogCQkJc2V0X3JhbmdlX3dyaXRlYmFjayh0cmVlLCBjdXIsIGN1ciArIGlvc2l6ZSAtIDEpOwogCQkJaWYgKCFQYWdlV3JpdGViYWNrKHBhZ2UpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyB3YXJuaW5nIHBhZ2UgJWx1IG5vdCAiCi0JCQkJICAgICAgICJ3cml0ZWJhY2ssIGN1ciAlbGx1IGVuZCAlbGx1XG4iLAorCQkJCWJ0cmZzX2VycihCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mbywKKwkJCQkJICAgInBhZ2UgJWx1IG5vdCB3cml0ZWJhY2ssIGN1ciAlbGx1IGVuZCAlbGx1IiwKIAkJCQkgICAgICAgcGFnZS0+aW5kZXgsIGN1ciwgZW5kKTsKIAkJCX0KIApAQCAtMzQxMCwyMCArMzQ1NywxOCBAQAogCiBzdGF0aWMgdm9pZCBlbmRfYmlvX2V4dGVudF9idWZmZXJfd3JpdGVwYWdlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKLQlpbnQgdXB0b2RhdGUgPSBlcnIgPT0gMDsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7Ci0JaW50IGRvbmU7CisJaW50IGksIGRvbmU7CiAKLQlkbyB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2ZWMsIGJpbywgaSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CiAKLQkJYnZlYy0tOwogCQllYiA9IChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKXBhZ2UtPnByaXZhdGU7CiAJCUJVR19PTighZWIpOwogCQlkb25lID0gYXRvbWljX2RlY19hbmRfdGVzdCgmZWItPmlvX3BhZ2VzKTsKIAotCQlpZiAoIXVwdG9kYXRlIHx8IHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfSU9FUlIsICZlYi0+YmZsYWdzKSkgeworCQlpZiAoZXJyIHx8IHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfSU9FUlIsICZlYi0+YmZsYWdzKSkgewogCQkJc2V0X2JpdChFWFRFTlRfQlVGRkVSX0lPRVJSLCAmZWItPmJmbGFncyk7CiAJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKQEAgLTM0MzUsMTAgKzM0ODAsOSBAQAogCQkJY29udGludWU7CiAKIAkJZW5kX2V4dGVudF9idWZmZXJfd3JpdGViYWNrKGViKTsKLQl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwl9CiAKIAliaW9fcHV0KGJpbyk7Ci0KIH0KIAogc3RhdGljIGludCB3cml0ZV9vbmVfZWIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLApAQCAtMzQ0Nyw2ICszNDkxLDcgQEAKIAkJCXN0cnVjdCBleHRlbnRfcGFnZV9kYXRhICplcGQpCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSA9ICZCVFJGU19JKGZzX2luZm8tPmJ0cmVlX2lub2RlKS0+aW9fdHJlZTsKIAl1NjQgb2Zmc2V0ID0gZWItPnN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgaSwgbnVtX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzID0gMDsKQEAgLTM0NjQsNyArMzUwOSw3IEBACiAKIAkJY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocCk7CiAJCXNldF9wYWdlX3dyaXRlYmFjayhwKTsKLQkJcmV0ID0gc3VibWl0X2V4dGVudF9wYWdlKHJ3LCBlYi0+dHJlZSwgcCwgb2Zmc2V0ID4+IDksCisJCXJldCA9IHN1Ym1pdF9leHRlbnRfcGFnZShydywgdHJlZSwgcCwgb2Zmc2V0ID4+IDksCiAJCQkJCSBQQUdFX0NBQ0hFX1NJWkUsIDAsIGJkZXYsICZlcGQtPmJpbywKIAkJCQkJIC0xLCBlbmRfYmlvX2V4dGVudF9idWZmZXJfd3JpdGVwYWdlLAogCQkJCQkgMCwgZXBkLT5iaW9fZmxhZ3MsIGJpb19mbGFncyk7CkBAIC00MDgyLDEyICs0MTI3LDEwIEBACiAJc3RydWN0IGV4dGVudF9tYXAgKmVtID0gTlVMTDsKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpjYWNoZWRfc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwotCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICppdGVtOwogCWludCBlbmQgPSAwOwogCXU2NCBlbV9zdGFydCA9IDA7CiAJdTY0IGVtX2xlbiA9IDA7CiAJdTY0IGVtX2VuZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBlbWZsYWdzOwogCiAJaWYgKGxlbiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMTIsOCArNDE1NSw2IEBACiAJfQogCVdBUk5fT04oIXJldCk7CiAJcGF0aC0+c2xvdHNbMF0tLTsKLQlpdGVtID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAotCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOwogCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOwogCWZvdW5kX3R5cGUgPSBidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KTsKIApAQCAtNDE4MSw3ICs0MjIyLDYgQEAKIAkJCW9mZnNldF9pbl9leHRlbnQgPSBlbV9zdGFydCAtIGVtLT5zdGFydDsKIAkJZW1fZW5kID0gZXh0ZW50X21hcF9lbmQoZW0pOwogCQllbV9sZW4gPSBlbV9lbmQgLSBlbV9zdGFydDsKLQkJZW1mbGFncyA9IGVtLT5mbGFnczsKIAkJZGlza28gPSAwOwogCQlmbGFncyA9IDA7CiAKQEAgLTQzMzMsMTAgKzQzNzMsOSBAQAogCV9fZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKIH0KIAotc3RhdGljIHN0cnVjdCBleHRlbnRfYnVmZmVyICpfX2FsbG9jX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAotCQkJCQkJICAgdTY0IHN0YXJ0LAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkJCQkgICBnZnBfdCBtYXNrKQorc3RhdGljIHN0cnVjdCBleHRlbnRfYnVmZmVyICoKK19fYWxsb2NfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgdTY0IHN0YXJ0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbiwgZ2ZwX3QgbWFzaykKIHsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIgPSBOVUxMOwogCkBAIC00MzQ1LDcgKzQzODQsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAllYi0+c3RhcnQgPSBzdGFydDsKIAllYi0+bGVuID0gbGVuOwotCWViLT50cmVlID0gdHJlZTsKKwllYi0+ZnNfaW5mbyA9IGZzX2luZm87CiAJZWItPmJmbGFncyA9IDA7CiAJcndsb2NrX2luaXQoJmViLT5sb2NrKTsKIAlhdG9taWNfc2V0KCZlYi0+d3JpdGVfbG9ja3MsIDApOwpAQCAtNDQ3NywxMyArNDUxNiwxNCBAQAogCX0KIH0KIAotc3RydWN0IGV4dGVudF9idWZmZXIgKmZpbmRfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCi0JCQkJCSAJCXU2NCBzdGFydCkKK3N0cnVjdCBleHRlbnRfYnVmZmVyICpmaW5kX2V4dGVudF9idWZmZXIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJCSB1NjQgc3RhcnQpCiB7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWViID0gcmFkaXhfdHJlZV9sb29rdXAoJnRyZWUtPmJ1ZmZlciwgc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJZWIgPSByYWRpeF90cmVlX2xvb2t1cCgmZnNfaW5mby0+YnVmZmVyX3JhZGl4LAorCQkJICAgICAgIHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwogCWlmIChlYiAmJiBhdG9taWNfaW5jX25vdF96ZXJvKCZlYi0+cmVmcykpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCW1hcmtfZXh0ZW50X2J1ZmZlcl9hY2Nlc3NlZChlYik7CkBAIC00NDk0LDcgKzQ1MzQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYWxsb2NfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYWxsb2NfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKIAkJCQkJICB1NjQgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzID0gbnVtX2V4dGVudF9wYWdlcyhzdGFydCwgbGVuKTsKQEAgLTQ1MDMsMTYgKzQ1NDMsMTUgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmV4aXN0cyA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKnA7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSB0cmVlLT5tYXBwaW5nOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZzsKIAlpbnQgdXB0b2RhdGUgPSAxOwogCWludCByZXQ7CiAKLQotCWViID0gZmluZF9leHRlbnRfYnVmZmVyKHRyZWUsIHN0YXJ0KTsKKwllYiA9IGZpbmRfZXh0ZW50X2J1ZmZlcihmc19pbmZvLCBzdGFydCk7CiAJaWYgKGViKQogCQlyZXR1cm4gZWI7CiAKLQllYiA9IF9fYWxsb2NfZXh0ZW50X2J1ZmZlcih0cmVlLCBzdGFydCwgbGVuLCBHRlBfTk9GUyk7CisJZWIgPSBfX2FsbG9jX2V4dGVudF9idWZmZXIoZnNfaW5mbywgc3RhcnQsIGxlbiwgR0ZQX05PRlMpOwogCWlmICghZWIpCiAJCXJldHVybiBOVUxMOwogCkBAIC00NTY3LDEyICs0NjA2LDEzIEBACiAJaWYgKHJldCkKIAkJZ290byBmcmVlX2ViOwogCi0Jc3Bpbl9sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7Ci0JcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQoJnRyZWUtPmJ1ZmZlciwgc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVCwgZWIpOwotCXNwaW5fdW5sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5idWZmZXJfbG9jayk7CisJcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQoJmZzX2luZm8tPmJ1ZmZlcl9yYWRpeCwKKwkJCQlzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZULCBlYik7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPmJ1ZmZlcl9sb2NrKTsKIAlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CiAJaWYgKHJldCA9PSAtRUVYSVNUKSB7Ci0JCWV4aXN0cyA9IGZpbmRfZXh0ZW50X2J1ZmZlcih0cmVlLCBzdGFydCk7CisJCWV4aXN0cyA9IGZpbmRfZXh0ZW50X2J1ZmZlcihmc19pbmZvLCBzdGFydCk7CiAJCWlmIChleGlzdHMpCiAJCQlnb3RvIGZyZWVfZWI7CiAJCWVsc2UKQEAgLTQ1ODAsNiArNDYyMCw3IEBACiAJfQogCS8qIGFkZCBvbmUgcmVmZXJlbmNlIGZvciB0aGUgdHJlZSAqLwogCWNoZWNrX2J1ZmZlcl90cmVlX3JlZihlYik7CisJc2V0X2JpdChFWFRFTlRfQlVGRkVSX0lOX1RSRUUsICZlYi0+YmZsYWdzKTsKIAogCS8qCiAJICogdGhlcmUgaXMgYSByYWNlIHdoZXJlIHJlbGVhc2UgcGFnZSBtYXkgaGF2ZQpAQCAtNDYyMywxNyArNDY2NCwxNyBAQAogewogCVdBUk5fT04oYXRvbWljX3JlYWQoJmViLT5yZWZzKSA9PSAwKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZWItPnJlZnMpKSB7Ci0JCWlmICh0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX0RVTU1ZLCAmZWItPmJmbGFncykpIHsKLQkJCXNwaW5fdW5sb2NrKCZlYi0+cmVmc19sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSA9IGViLT50cmVlOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfSU5fVFJFRSwgJmViLT5iZmxhZ3MpKSB7CisJCQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGViLT5mc19pbmZvOwogCiAJCQlzcGluX3VubG9jaygmZWItPnJlZnNfbG9jayk7CiAKLQkJCXNwaW5fbG9jaygmdHJlZS0+YnVmZmVyX2xvY2spOwotCQkJcmFkaXhfdHJlZV9kZWxldGUoJnRyZWUtPmJ1ZmZlciwKKwkJCXNwaW5fbG9jaygmZnNfaW5mby0+YnVmZmVyX2xvY2spOworCQkJcmFkaXhfdHJlZV9kZWxldGUoJmZzX2luZm8tPmJ1ZmZlcl9yYWRpeCwKIAkJCQkJICBlYi0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVCk7Ci0JCQlzcGluX3VubG9jaygmdHJlZS0+YnVmZmVyX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmZzX2luZm8tPmJ1ZmZlcl9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZlYi0+cmVmc19sb2NrKTsKIAkJfQogCiAJCS8qIFNob3VsZCBiZSBzYWZlIHRvIHJlbGVhc2Ugb3VyIHBhZ2VzIGF0IHRoaXMgcG9pbnQgKi8KQEAgLTUxMTIsMTIgKzUxNTMsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHNyY19pOwogCiAJaWYgKHNyY19vZmZzZXQgKyBsZW4gPiBkc3QtPmxlbikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIG1lbW1vdmUgYm9ndXMgc3JjX29mZnNldCAlbHUgbW92ZSAiCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IG1lbW1vdmUgYm9ndXMgc3JjX29mZnNldCAlbHUgbW92ZSAiCiAJCSAgICAgICAibGVuICVsdSBkc3QgbGVuICVsdVxuIiwgc3JjX29mZnNldCwgbGVuLCBkc3QtPmxlbik7CiAJCUJVR19PTigxKTsKIAl9CiAJaWYgKGRzdF9vZmZzZXQgKyBsZW4gPiBkc3QtPmxlbikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIG1lbW1vdmUgYm9ndXMgZHN0X29mZnNldCAlbHUgbW92ZSAiCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IG1lbW1vdmUgYm9ndXMgZHN0X29mZnNldCAlbHUgbW92ZSAiCiAJCSAgICAgICAibGVuICVsdSBkc3QgbGVuICVsdVxuIiwgZHN0X29mZnNldCwgbGVuLCBkc3QtPmxlbik7CiAJCUJVR19PTigxKTsKIAl9CkBAIC01MTU5LDEyICs1MjAwLDEyIEBACiAJdW5zaWduZWQgbG9uZyBzcmNfaTsKIAogCWlmIChzcmNfb2Zmc2V0ICsgbGVuID4gZHN0LT5sZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBtZW1tb3ZlIGJvZ3VzIHNyY19vZmZzZXQgJWx1IG1vdmUgIgorCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBtZW1tb3ZlIGJvZ3VzIHNyY19vZmZzZXQgJWx1IG1vdmUgIgogCQkgICAgICAgImxlbiAlbHUgbGVuICVsdVxuIiwgc3JjX29mZnNldCwgbGVuLCBkc3QtPmxlbik7CiAJCUJVR19PTigxKTsKIAl9CiAJaWYgKGRzdF9vZmZzZXQgKyBsZW4gPiBkc3QtPmxlbikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIG1lbW1vdmUgYm9ndXMgZHN0X29mZnNldCAlbHUgbW92ZSAiCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IG1lbW1vdmUgYm9ndXMgZHN0X29mZnNldCAlbHUgbW92ZSAiCiAJCSAgICAgICAibGVuICVsdSBsZW4gJWx1XG4iLCBkc3Rfb2Zmc2V0LCBsZW4sIGRzdC0+bGVuKTsKIAkJQlVHX09OKDEpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5oIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKaW5kZXggMTk2MjBjNS4uNThiMjdlNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmgKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgRVhURU5UX0JVRkZFUl9XUklURUJBQ0sgNwogI2RlZmluZSBFWFRFTlRfQlVGRkVSX0lPRVJSIDgKICNkZWZpbmUgRVhURU5UX0JVRkZFUl9EVU1NWSA5CisjZGVmaW5lIEVYVEVOVF9CVUZGRVJfSU5fVFJFRSAxMAogCiAvKiB0aGVzZSBhcmUgZmxhZ3MgZm9yIGV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2MgKi8KICNkZWZpbmUgUEFHRV9VTkxPQ0sJCSgxIDw8IDApCkBAIC05NCwxMiArOTUsMTAgQEAKIAogc3RydWN0IGV4dGVudF9pb190cmVlIHsKIAlzdHJ1Y3QgcmJfcm9vdCBzdGF0ZTsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IGJ1ZmZlcjsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAl1NjQgZGlydHlfYnl0ZXM7CiAJaW50IHRyYWNrX3VwdG9kYXRlOwogCXNwaW5sb2NrX3QgbG9jazsKLQlzcGlubG9ja190IGJ1ZmZlcl9sb2NrOwogCXN0cnVjdCBleHRlbnRfaW9fb3BzICpvcHM7CiB9OwogCkBAIC0xMzAsNyArMTI5LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1hcF9zdGFydDsKIAl1bnNpZ25lZCBsb25nIG1hcF9sZW47CiAJdW5zaWduZWQgbG9uZyBiZmxhZ3M7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOwogCXNwaW5sb2NrX3QgcmVmc19sb2NrOwogCWF0b21pY190IHJlZnM7CiAJYXRvbWljX3QgaW9fcGFnZXM7CkBAIC0yNjYsMTEgKzI2NSwxMSBAQAogaW50IGdldF9zdGF0ZV9wcml2YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgKnByaXZhdGUpOwogdm9pZCBzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHN0cnVjdCBwYWdlICpwYWdlKTsKIAotc3RydWN0IGV4dGVudF9idWZmZXIgKmFsbG9jX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorc3RydWN0IGV4dGVudF9idWZmZXIgKmFsbG9jX2V4dGVudF9idWZmZXIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCiAJCQkJCSAgdTY0IHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbik7CiBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYWxsb2NfZHVtbXlfZXh0ZW50X2J1ZmZlcih1NjQgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKTsKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19jbG9uZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICpzcmMpOwotc3RydWN0IGV4dGVudF9idWZmZXIgKmZpbmRfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZmluZF9leHRlbnRfYnVmZmVyKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAogCQkJCQkgdTY0IHN0YXJ0KTsKIHZvaWQgZnJlZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYik7CiB2b2lkIGZyZWVfZXh0ZW50X2J1ZmZlcl9zdGFsZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X21hcC5jIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCmluZGV4IGE0YTdhMWEuLjk5NmFkNTZiIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfbWFwLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCkBAIC03OSwxMiArNzksMjEgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQsCi0JCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCisvKiBzaW1wbGUgaGVscGVyIHRvIGRvIG1hdGggYXJvdW5kIHRoZSBlbmQgb2YgYW4gZXh0ZW50LCBoYW5kbGluZyB3cmFwICovCitzdGF0aWMgdTY0IHJhbmdlX2VuZCh1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaWYgKHN0YXJ0ICsgbGVuIDwgc3RhcnQpCisJCXJldHVybiAodTY0KS0xOworCXJldHVybiBzdGFydCArIGxlbjsKK30KKworc3RhdGljIGludCB0cmVlX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9tYXAgKmVtKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBleHRlbnRfbWFwICplbnRyeTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW50cnkgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpvcmlnX3BhcmVudCA9IE5VTEw7CisJdTY0IGVuZCA9IHJhbmdlX2VuZChlbS0+c3RhcnQsIGVtLT5sZW4pOwogCiAJd2hpbGUgKCpwKSB7CiAJCXBhcmVudCA9ICpwOwpAQCAtOTIsMTkgKzEwMSwzNyBAQAogCiAJCVdBUk5fT04oIWVudHJ5LT5pbl90cmVlKTsKIAotCQlpZiAob2Zmc2V0IDwgZW50cnktPnN0YXJ0KQorCQlpZiAoZW0tPnN0YXJ0IDwgZW50cnktPnN0YXJ0KQogCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChvZmZzZXQgPj0gZXh0ZW50X21hcF9lbmQoZW50cnkpKQorCQllbHNlIGlmIChlbS0+c3RhcnQgPj0gZXh0ZW50X21hcF9lbmQoZW50cnkpKQogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJcmV0dXJuIHBhcmVudDsKKwkJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCWVudHJ5LT5pbl90cmVlID0gMTsKLQlyYl9saW5rX25vZGUobm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3Iobm9kZSwgcm9vdCk7Ci0JcmV0dXJuIE5VTEw7CisJb3JpZ19wYXJlbnQgPSBwYXJlbnQ7CisJd2hpbGUgKHBhcmVudCAmJiBlbS0+c3RhcnQgPj0gZXh0ZW50X21hcF9lbmQoZW50cnkpKSB7CisJCXBhcmVudCA9IHJiX25leHQocGFyZW50KTsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwl9CisJaWYgKHBhcmVudCkKKwkJaWYgKGVuZCA+IGVudHJ5LT5zdGFydCAmJiBlbS0+c3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbnRyeSkpCisJCQlyZXR1cm4gLUVFWElTVDsKKworCXBhcmVudCA9IG9yaWdfcGFyZW50OworCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CisJd2hpbGUgKHBhcmVudCAmJiBlbS0+c3RhcnQgPCBlbnRyeS0+c3RhcnQpIHsKKwkJcGFyZW50ID0gcmJfcHJldihwYXJlbnQpOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCX0KKwlpZiAocGFyZW50KQorCQlpZiAoZW5kID4gZW50cnktPnN0YXJ0ICYmIGVtLT5zdGFydCA8IGV4dGVudF9tYXBfZW5kKGVudHJ5KSkKKwkJCXJldHVybiAtRUVYSVNUOworCisJZW0tPmluX3RyZWUgPSAxOworCXJiX2xpbmtfbm9kZSgmZW0tPnJiX25vZGUsIG9yaWdfcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmVtLT5yYl9ub2RlLCByb290KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIyOCw3ICsyNTUsNyBAQAogCQltZXJnZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CiAJaWYgKHJiICYmIG1lcmdhYmxlX21hcHMoZW0sIG1lcmdlKSkgewogCQllbS0+bGVuICs9IG1lcmdlLT5sZW47Ci0JCWVtLT5ibG9ja19sZW4gKz0gbWVyZ2UtPmxlbjsKKwkJZW0tPmJsb2NrX2xlbiArPSBtZXJnZS0+YmxvY2tfbGVuOwogCQlyYl9lcmFzZSgmbWVyZ2UtPnJiX25vZGUsICZ0cmVlLT5tYXApOwogCQltZXJnZS0+aW5fdHJlZSA9IDA7CiAJCWVtLT5tb2RfbGVuID0gKG1lcmdlLT5tb2Rfc3RhcnQgKyBtZXJnZS0+bW9kX2xlbikgLSBlbS0+bW9kX3N0YXJ0OwpAQCAtMzEwLDIwICszMzcsMTEgQEAKIAkJICAgICAgIHN0cnVjdCBleHRlbnRfbWFwICplbSwgaW50IG1vZGlmaWVkKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCByYl9ub2RlICpyYjsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZXhpc3Q7CiAKLQlleGlzdCA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyh0cmVlLCBlbS0+c3RhcnQsIGVtLT5sZW4pOwotCWlmIChleGlzdCkgewotCQlmcmVlX2V4dGVudF9tYXAoZXhpc3QpOwotCQlyZXQgPSAtRUVYSVNUOworCXJldCA9IHRyZWVfaW5zZXJ0KCZ0cmVlLT5tYXAsIGVtKTsKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKLQl9Ci0JcmIgPSB0cmVlX2luc2VydCgmdHJlZS0+bWFwLCBlbS0+c3RhcnQsICZlbS0+cmJfbm9kZSk7Ci0JaWYgKHJiKSB7Ci0JCXJldCA9IC1FRVhJU1Q7Ci0JCWdvdG8gb3V0OwotCX0KKwogCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKIAogCWVtLT5tb2Rfc3RhcnQgPSBlbS0+c3RhcnQ7CkBAIC0zMzcsMTQgKzM1NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogc2ltcGxlIGhlbHBlciB0byBkbyBtYXRoIGFyb3VuZCB0aGUgZW5kIG9mIGFuIGV4dGVudCwgaGFuZGxpbmcgd3JhcCAqLwotc3RhdGljIHU2NCByYW5nZV9lbmQodTY0IHN0YXJ0LCB1NjQgbGVuKQotewotCWlmIChzdGFydCArIGxlbiA8IHN0YXJ0KQotCQlyZXR1cm4gKHU2NCktMTsKLQlyZXR1cm4gc3RhcnQgKyBsZW47Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZXh0ZW50X21hcCAqCiBfX2xvb2t1cF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAogCQkJdTY0IHN0YXJ0LCB1NjQgbGVuLCBpbnQgc3RyaWN0KQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS1pdGVtLmMgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwppbmRleCA2ZjM4NDg4Li4xMjc1NTViIDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLWl0ZW0uYworKysgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5ibG9ja3MgPSBiaW8tPmJpX3NpemUgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJbmJsb2NrcyA9IGJpby0+YmlfaXRlci5iaV9zaXplID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCWlmICghZHN0KSB7CiAJCWlmIChuYmxvY2tzICogY3N1bV9zaXplID4gQlRSRlNfQklPX0lOTElORV9DU1VNX1NJWkUpIHsKIAkJCWJ0cmZzX2Jpby0+Y3N1bV9hbGxvY2F0ZWQgPSBrbWFsbG9jKG5ibG9ja3MgKiBjc3VtX3NpemUsCkBAIC0yMDEsNyArMjAxLDcgQEAKIAkJY3N1bSA9ICh1OCAqKWRzdDsKIAl9CiAKLQlpZiAoYmlvLT5iaV9zaXplID4gUEFHRV9DQUNIRV9TSVpFICogOCkKKwlpZiAoYmlvLT5iaV9pdGVyLmJpX3NpemUgPiBQQUdFX0NBQ0hFX1NJWkUgKiA4KQogCQlwYXRoLT5yZWFkYSA9IDI7CiAKIAlXQVJOX09OKGJpby0+YmlfdmNudCA8PSAwKTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOwogCX0KIAotCWRpc2tfYnl0ZW5yID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCWRpc2tfYnl0ZW5yID0gKHU2NCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDk7CiAJaWYgKGRpbykKIAkJb2Zmc2V0ID0gbG9naWNhbF9vZmZzZXQ7CiAJd2hpbGUgKGJpb19pbmRleCA8IGJpby0+YmlfdmNudCkgewpAQCAtMjQ2LDggKzI0Niw4IEBACiAJCQkJCQlvZmZzZXQgKyBidmVjLT5idl9sZW4gLSAxLAogCQkJCQkJRVhURU5UX05PREFUQVNVTSwgR0ZQX05PRlMpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIG5vIGNzdW0gZm91bmQgIgotCQkJCQkgICAgICAgImZvciBpbm9kZSAlbGx1IHN0YXJ0ICVsbHVcbiIsCisJCQkJCWJ0cmZzX2luZm8oQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8sCisJCQkJCQkgICAibm8gY3N1bSBmb3VuZCBmb3IgaW5vZGUgJWxsdSBzdGFydCAlbGx1IiwKIAkJCQkJICAgICAgIGJ0cmZzX2lubyhpbm9kZSksIG9mZnNldCk7CiAJCQkJfQogCQkJCWl0ZW0gPSBOVUxMOwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGlvX3ByaXZhdGUgKmRpcCwgc3RydWN0IGJpbyAqYmlvLAogCQkJICAgICAgdTY0IG9mZnNldCkKIHsKLQlpbnQgbGVuID0gKGJpby0+Ymlfc2VjdG9yIDw8IDkpIC0gZGlwLT5kaXNrX2J5dGVucjsKKwlpbnQgbGVuID0gKGJpby0+YmlfaXRlci5iaV9zZWN0b3IgPDwgOSkgLSBkaXAtPmRpc2tfYnl0ZW5yOwogCXUxNiBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAJaW50IHJldDsKIApAQCAtNDQ3LDExICs0NDcsMTIgQEAKIAl1NjQgb2Zmc2V0OwogCiAJV0FSTl9PTihiaW8tPmJpX3ZjbnQgPD0gMCk7Ci0Jc3VtcyA9IGt6YWxsb2MoYnRyZnNfb3JkZXJlZF9zdW1fc2l6ZShyb290LCBiaW8tPmJpX3NpemUpLCBHRlBfTk9GUyk7CisJc3VtcyA9IGt6YWxsb2MoYnRyZnNfb3JkZXJlZF9zdW1fc2l6ZShyb290LCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSksCisJCSAgICAgICBHRlBfTk9GUyk7CiAJaWYgKCFzdW1zKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXN1bXMtPmxlbiA9IGJpby0+Ymlfc2l6ZTsKKwlzdW1zLT5sZW4gPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlJTklUX0xJU1RfSEVBRCgmc3Vtcy0+bGlzdCk7CiAKIAlpZiAoY29udGlnKQpAQCAtNDYxLDcgKzQ2Miw3IEBACiAKIAlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KGlub2RlLCBvZmZzZXQpOwogCUJVR19PTighb3JkZXJlZCk7IC8qIExvZ2ljIGVycm9yICovCi0Jc3Vtcy0+Ynl0ZW5yID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCXN1bXMtPmJ5dGVuciA9ICh1NjQpYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA8PCA5OwogCWluZGV4ID0gMDsKIAogCXdoaWxlIChiaW9faW5kZXggPCBiaW8tPmJpX3ZjbnQpIHsKQEAgLTQ3Niw3ICs0NzcsNyBAQAogCQkJYnRyZnNfYWRkX29yZGVyZWRfc3VtKGlub2RlLCBvcmRlcmVkLCBzdW1zKTsKIAkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKIAotCQkJYnl0ZXNfbGVmdCA9IGJpby0+Ymlfc2l6ZSAtIHRvdGFsX2J5dGVzOworCQkJYnl0ZXNfbGVmdCA9IGJpby0+YmlfaXRlci5iaV9zaXplIC0gdG90YWxfYnl0ZXM7CiAKIAkJCXN1bXMgPSBremFsbG9jKGJ0cmZzX29yZGVyZWRfc3VtX3NpemUocm9vdCwgYnl0ZXNfbGVmdCksCiAJCQkJICAgICAgIEdGUF9OT0ZTKTsKQEAgLTQ4NCw3ICs0ODUsNyBAQAogCQkJc3Vtcy0+bGVuID0gYnl0ZXNfbGVmdDsKIAkJCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9mZnNldCk7CiAJCQlCVUdfT04oIW9yZGVyZWQpOyAvKiBMb2dpYyBlcnJvciAqLwotCQkJc3Vtcy0+Ynl0ZW5yID0gKCh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOSkgKworCQkJc3Vtcy0+Ynl0ZW5yID0gKCh1NjQpYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA8PCA5KSArCiAJCQkJICAgICAgIHRvdGFsX2J5dGVzOwogCQkJaW5kZXggPSAwOwogCQl9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggODJkMDM0Mi4uMDE2NWI4NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtNjkyLDcgKzY5MiwxMCBAQAogaW50IF9fYnRyZnNfZHJvcF9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgdTY0ICpkcm9wX2VuZCwgaW50IGRyb3BfY2FjaGUpCisJCQkgdTY0ICpkcm9wX2VuZCwgaW50IGRyb3BfY2FjaGUsCisJCQkgaW50IHJlcGxhY2VfZXh0ZW50LAorCQkJIHUzMiBleHRlbnRfaXRlbV9zaXplLAorCQkJIGludCAqa2V5X2luc2VydGVkKQogewogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwogCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKQEAgLTcxMiw2ICs3MTUsNyBAQAogCWludCBtb2RpZnlfdHJlZSA9IC0xOwogCWludCB1cGRhdGVfcmVmcyA9IChyb290LT5yZWZfY293cyB8fCByb290ID09IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCk7CiAJaW50IGZvdW5kID0gMDsKKwlpbnQgbGVhZnNfdmlzaXRlZCA9IDA7CiAKIAlpZiAoZHJvcF9jYWNoZSkKIAkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBlbmQgLSAxLCAwKTsKQEAgLTczMyw2ICs3MzcsNyBAQAogCQkJCXBhdGgtPnNsb3RzWzBdLS07CiAJCX0KIAkJcmV0ID0gMDsKKwkJbGVhZnNfdmlzaXRlZCsrOwogbmV4dF9zbG90OgogCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJCWlmIChwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkgewpAQCAtNzQ0LDYgKzc0OSw3IEBACiAJCQkJcmV0ID0gMDsKIAkJCQlicmVhazsKIAkJCX0KKwkJCWxlYWZzX3Zpc2l0ZWQrKzsKIAkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKIAkJCXJlY293ID0gMTsKIAkJfQpAQCAtNzY2LDcgKzc3Miw4IEBACiAJCQkJYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKIAkJfSBlbHNlIGlmIChleHRlbnRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKIAkJCWV4dGVudF9lbmQgPSBrZXkub2Zmc2V0ICsKLQkJCQlidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGxlYWYsIGZpKTsKKwkJCQlidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGxlYWYsCisJCQkJCQkgICAgIHBhdGgtPnNsb3RzWzBdLCBmaSk7CiAJCX0gZWxzZSB7CiAJCQlXQVJOX09OKDEpOwogCQkJZXh0ZW50X2VuZCA9IHNlYXJjaF9zdGFydDsKQEAgLTkyNywxNCArOTM0LDQ0IEBACiAJfQogCiAJaWYgKCFyZXQgJiYgZGVsX25yID4gMCkgeworCQkvKgorCQkgKiBTZXQgcGF0aC0+c2xvdHNbMF0gdG8gZmlyc3Qgc2xvdCwgc28gdGhhdCBhZnRlciB0aGUgZGVsZXRlCisJCSAqIGlmIGl0ZW1zIGFyZSBtb3ZlIG9mZiBmcm9tIG91ciBsZWFmIHRvIGl0cyBpbW1lZGlhdGUgbGVmdCBvcgorCQkgKiByaWdodCBuZWlnaGJvciBsZWFmcywgd2UgZW5kIHVwIHdpdGggYSBjb3JyZWN0IGFuZCBhZGp1c3RlZAorCQkgKiBwYXRoLT5zbG90c1swXSBmb3Igb3VyIGluc2VydGlvbi4KKwkJICovCisJCXBhdGgtPnNsb3RzWzBdID0gZGVsX3Nsb3Q7CiAJCXJldCA9IGJ0cmZzX2RlbF9pdGVtcyh0cmFucywgcm9vdCwgcGF0aCwgZGVsX3Nsb3QsIGRlbF9ucik7CiAJCWlmIChyZXQpCiAJCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgcmV0KTsKKworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCS8qCisJCSAqIGxlYWYgZWIgaGFzIGZsYWcgRVhURU5UX0JVRkZFUl9TVEFMRSBpZiBpdCB3YXMgZGVsZXRlZCAodGhhdAorCQkgKiBpcywgaXRzIGNvbnRlbnRzIGdvdCBwdXNoZWQgdG8gaXRzIG5laWdoYm9ycyksIGluIHdoaWNoIGNhc2UKKwkJICogaXQgbWVhbnMgcGF0aC0+bG9ja3NbMF0gPT0gMAorCQkgKi8KKwkJaWYgKCFyZXQgJiYgcmVwbGFjZV9leHRlbnQgJiYgbGVhZnNfdmlzaXRlZCA9PSAxICYmCisJCSAgICBwYXRoLT5sb2Nrc1swXSAmJgorCQkgICAgYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlYWYpID49CisJCSAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pICsgZXh0ZW50X2l0ZW1fc2l6ZSkgeworCisJCQlrZXkub2JqZWN0aWQgPSBpbm87CisJCQlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKKwkJCWtleS5vZmZzZXQgPSBzdGFydDsKKwkJCXNldHVwX2l0ZW1zX2Zvcl9pbnNlcnQocm9vdCwgcGF0aCwgJmtleSwKKwkJCQkJICAgICAgICZleHRlbnRfaXRlbV9zaXplLAorCQkJCQkgICAgICAgZXh0ZW50X2l0ZW1fc2l6ZSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgKworCQkJCQkgICAgICAgZXh0ZW50X2l0ZW1fc2l6ZSwgMSk7CisJCQkqa2V5X2luc2VydGVkID0gMTsKKwkJfQogCX0KIAorCWlmICghcmVwbGFjZV9leHRlbnQgfHwgISgqa2V5X2luc2VydGVkKSkKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCWlmIChkcm9wX2VuZCkKIAkJKmRyb3BfZW5kID0gZm91bmQgPyBtaW4oZW5kLCBleHRlbnRfZW5kKSA6IGVuZDsKLQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTQ5LDcgKzk4Niw3IEBACiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXQgPSBfX2J0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsIHBhdGgsIHN0YXJ0LCBlbmQsIE5VTEwsCi0JCQkJICAgZHJvcF9jYWNoZSk7CisJCQkJICAgZHJvcF9jYWNoZSwgMCwgMCwgTlVMTCk7CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMjM1LDI5ICsxMjcyLDE4IEBACiB9CiAKIC8qCi0gKiB0aGlzIGdldHMgcGFnZXMgaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgbG9ja3MgdGhlbSBkb3duLCBpdCBhbHNvIHByb3Blcmx5Ci0gKiB3YWl0cyBmb3IgZGF0YT1vcmRlcmVkIGV4dGVudHMgdG8gZmluaXNoIGJlZm9yZSBhbGxvd2luZyB0aGUgcGFnZXMgdG8gYmUKLSAqIG1vZGlmaWVkLgorICogdGhpcyBqdXN0IGdldHMgcGFnZXMgaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgbG9ja3MgdGhlbSBkb3duLgogICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IHByZXBhcmVfcGFnZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBudW1fcGFnZXMsCi0JCQkgbG9mZl90IHBvcywgdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwKLQkJCSBzaXplX3Qgd3JpdGVfYnl0ZXMsIGJvb2wgZm9yY2VfdXB0b2RhdGUpCitzdGF0aWMgbm9pbmxpbmUgaW50IHByZXBhcmVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQkgIHNpemVfdCBudW1fcGFnZXMsIGxvZmZfdCBwb3MsCisJCQkJICBzaXplX3Qgd3JpdGVfYnl0ZXMsIGJvb2wgZm9yY2VfdXB0b2RhdGUpCiB7Ci0Jc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CiAJaW50IGVyciA9IDA7Ci0JaW50IGZhaWxpID0gMDsKLQl1NjQgc3RhcnRfcG9zOwotCXU2NCBsYXN0X3BvczsKKwlpbnQgZmFpbGk7CiAKLQlzdGFydF9wb3MgPSBwb3MgJiB+KCh1NjQpcm9vdC0+c2VjdG9yc2l6ZSAtIDEpOwotCWxhc3RfcG9zID0gKCh1NjQpaW5kZXggKyBudW1fcGFnZXMpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLWFnYWluOgogCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewogCQlwYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXggKyBpLAogCQkJCQkgICAgICAgbWFzayB8IF9fR0ZQX1dSSVRFKTsKQEAgLTEyODAsNDggKzEzMDYsNyBAQAogCQl9CiAJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZXNbaV0pOwogCX0KLQlmYWlsaSA9IG51bV9wYWdlcyAtIDE7Ci0JZXJyID0gMDsKLQlpZiAoc3RhcnRfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgewotCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7Ci0JCWxvY2tfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAotCQkJCSBzdGFydF9wb3MsIGxhc3RfcG9zIC0gMSwgMCwgJmNhY2hlZF9zdGF0ZSk7Ci0JCW9yZGVyZWQgPSBidHJmc19sb29rdXBfZmlyc3Rfb3JkZXJlZF9leHRlbnQoaW5vZGUsCi0JCQkJCQkJICAgIGxhc3RfcG9zIC0gMSk7Ci0JCWlmIChvcmRlcmVkICYmCi0JCSAgICBvcmRlcmVkLT5maWxlX29mZnNldCArIG9yZGVyZWQtPmxlbiA+IHN0YXJ0X3BvcyAmJgotCQkgICAgb3JkZXJlZC0+ZmlsZV9vZmZzZXQgPCBsYXN0X3BvcykgewotCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOwotCQkJdW5sb2NrX2V4dGVudF9jYWNoZWQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAotCQkJCQkgICAgIHN0YXJ0X3BvcywgbGFzdF9wb3MgLSAxLAotCQkJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewotCQkJCXVubG9ja19wYWdlKHBhZ2VzW2ldKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOwotCQkJfQotCQkJZXJyID0gYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBzdGFydF9wb3MsCi0JCQkJCQkgICAgICAgbGFzdF9wb3MgLSBzdGFydF9wb3MpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGZhaWw7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWlmIChvcmRlcmVkKQotCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOwogCi0JCWNsZWFyX2V4dGVudF9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBzdGFydF9wb3MsCi0JCQkJICBsYXN0X3BvcyAtIDEsIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8Ci0JCQkJICBFWFRFTlRfRE9fQUNDT1VOVElORyB8IEVYVEVOVF9ERUZSQUcsCi0JCQkJICAwLCAwLCAmY2FjaGVkX3N0YXRlLCBHRlBfTk9GUyk7Ci0JCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKLQkJCQkgICAgIHN0YXJ0X3BvcywgbGFzdF9wb3MgLSAxLCAmY2FjaGVkX3N0YXRlLAotCQkJCSAgICAgR0ZQX05PRlMpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKLQkJaWYgKGNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2VzW2ldKSkKLQkJCWFjY291bnRfcGFnZV9yZWRpcnR5KHBhZ2VzW2ldKTsKLQkJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlc1tpXSk7Ci0JCVdBUk5fT04oIVBhZ2VMb2NrZWQocGFnZXNbaV0pKTsKLQl9CiAJcmV0dXJuIDA7CiBmYWlsOgogCXdoaWxlIChmYWlsaSA+PSAwKSB7CkBAIC0xMzMzLDYgKzEzMTgsNzUgQEAKIAogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBsb2NrcyB0aGUgZXh0ZW50IGFuZCBwcm9wZXJseSB3YWl0cyBmb3IgZGF0YT1vcmRlcmVkIGV4dGVudHMKKyAqIHRvIGZpbmlzaCBiZWZvcmUgYWxsb3dpbmcgdGhlIHBhZ2VzIHRvIGJlIG1vZGlmaWVkIGlmIG5lZWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZToKKyAqIDEgLSB0aGUgZXh0ZW50IGlzIGxvY2tlZAorICogMCAtIHRoZSBleHRlbnQgaXMgbm90IGxvY2tlZCwgYW5kIGV2ZXJ5dGhpbmcgaXMgT0sKKyAqIC1FQUdBSU4gLSBuZWVkIHJlLXByZXBhcmUgdGhlIHBhZ2VzCisgKiB0aGUgb3RoZXIgPCAwIG51bWJlciAtIFNvbWV0aGluZyB3cm9uZyBoYXBwZW5zCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQKK2xvY2tfYW5kX2NsZWFudXBfZXh0ZW50X2lmX25lZWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQlzaXplX3QgbnVtX3BhZ2VzLCBsb2ZmX3QgcG9zLAorCQkJCXU2NCAqbG9ja3N0YXJ0LCB1NjQgKmxvY2tlbmQsCisJCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqKmNhY2hlZF9zdGF0ZSkKK3sKKwl1NjQgc3RhcnRfcG9zOworCXU2NCBsYXN0X3BvczsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCXN0YXJ0X3BvcyA9IHBvcyAmIH4oKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlsYXN0X3BvcyA9IHN0YXJ0X3BvcyArICgodTY0KW51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKSAtIDE7CisKKwlpZiAoc3RhcnRfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgeworCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7CisJCWxvY2tfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJCSBzdGFydF9wb3MsIGxhc3RfcG9zLCAwLCBjYWNoZWRfc3RhdGUpOworCQlvcmRlcmVkID0gYnRyZnNfbG9va3VwX2ZpcnN0X29yZGVyZWRfZXh0ZW50KGlub2RlLCBsYXN0X3Bvcyk7CisJCWlmIChvcmRlcmVkICYmCisJCSAgICBvcmRlcmVkLT5maWxlX29mZnNldCArIG9yZGVyZWQtPmxlbiA+IHN0YXJ0X3BvcyAmJgorCQkgICAgb3JkZXJlZC0+ZmlsZV9vZmZzZXQgPD0gbGFzdF9wb3MpIHsKKwkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKKwkJCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgICBzdGFydF9wb3MsIGxhc3RfcG9zLAorCQkJCQkgICAgIGNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOworCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZXNbaV0pOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpXSk7CisJCQl9CisJCQlyZXQgPSBidHJmc193YWl0X29yZGVyZWRfcmFuZ2UoaW5vZGUsIHN0YXJ0X3BvcywKKwkJCQkJCWxhc3RfcG9zIC0gc3RhcnRfcG9zICsgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaWYgKG9yZGVyZWQpCisJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisKKwkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0X3BvcywKKwkJCQkgIGxhc3RfcG9zLCBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MgfAorCQkJCSAgRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfREVGUkFHLAorCQkJCSAgMCwgMCwgY2FjaGVkX3N0YXRlLCBHRlBfTk9GUyk7CisJCSpsb2Nrc3RhcnQgPSBzdGFydF9wb3M7CisJCSpsb2NrZW5kID0gbGFzdF9wb3M7CisJCXJldCA9IDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCWlmIChjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlc1tpXSkpCisJCQlhY2NvdW50X3BhZ2VfcmVkaXJ0eShwYWdlc1tpXSk7CisJCXNldF9wYWdlX2V4dGVudF9tYXBwZWQocGFnZXNbaV0pOworCQlXQVJOX09OKCFQYWdlTG9ja2VkKHBhZ2VzW2ldKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIG5vaW5saW5lIGludCBjaGVja19jYW5fbm9jb3coc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywKIAkJCQkgICAgc2l6ZV90ICp3cml0ZV9ieXRlcykKIHsKQEAgLTEzODEsMTMgKzE0MzUsMTcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZF9zdGF0ZSA9IE5VTEw7CiAJdTY0IHJlbGVhc2VfYnl0ZXMgPSAwOworCXU2NCBsb2Nrc3RhcnQ7CisJdTY0IGxvY2tlbmQ7CiAJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleDsKIAlzaXplX3QgbnVtX3dyaXR0ZW4gPSAwOwogCWludCBucnB0cnM7CiAJaW50IHJldCA9IDA7CiAJYm9vbCBvbmx5X3JlbGVhc2VfbWV0YWRhdGEgPSBmYWxzZTsKIAlib29sIGZvcmNlX3BhZ2VfdXB0b2RhdGUgPSBmYWxzZTsKKwlib29sIG5lZWRfdW5sb2NrOwogCiAJbnJwdHJzID0gbWluKChpb3ZfaXRlcl9jb3VudChpKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpIC8KIAkJICAgICBQQUdFX0NBQ0hFX1NJWkUsIFBBR0VfQ0FDSEVfU0laRSAvCkBAIC0xNDU2LDE4ICsxNTE0LDMxIEBACiAJCX0KIAogCQlyZWxlYXNlX2J5dGVzID0gcmVzZXJ2ZV9ieXRlczsKLQorCQluZWVkX3VubG9jayA9IGZhbHNlOworYWdhaW46CiAJCS8qCiAJCSAqIFRoaXMgaXMgZ29pbmcgdG8gc2V0dXAgdGhlIHBhZ2VzIGFycmF5IHdpdGggdGhlIG51bWJlciBvZgogCQkgKiBwYWdlcyB3ZSB3YW50LCBzbyB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUKIAkJICogY29udGVudHMgb2YgcGFnZXMgZnJvbSBsb29wIHRvIGxvb3AKIAkJICovCi0JCXJldCA9IHByZXBhcmVfcGFnZXMocm9vdCwgZmlsZSwgcGFnZXMsIG51bV9wYWdlcywKLQkJCQkgICAgcG9zLCBmaXJzdF9pbmRleCwgd3JpdGVfYnl0ZXMsCisJCXJldCA9IHByZXBhcmVfcGFnZXMoaW5vZGUsIHBhZ2VzLCBudW1fcGFnZXMsCisJCQkJICAgIHBvcywgd3JpdGVfYnl0ZXMsCiAJCQkJICAgIGZvcmNlX3BhZ2VfdXB0b2RhdGUpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAKKwkJcmV0ID0gbG9ja19hbmRfY2xlYW51cF9leHRlbnRfaWZfbmVlZChpbm9kZSwgcGFnZXMsIG51bV9wYWdlcywKKwkJCQkJCSAgICAgIHBvcywgJmxvY2tzdGFydCwgJmxvY2tlbmQsCisJCQkJCQkgICAgICAmY2FjaGVkX3N0YXRlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlnb3RvIGFnYWluOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocmV0ID4gMCkgeworCQkJbmVlZF91bmxvY2sgPSB0cnVlOworCQkJcmV0ID0gMDsKKwkJfQorCiAJCWNvcGllZCA9IGJ0cmZzX2NvcHlfZnJvbV91c2VyKHBvcywgbnVtX3BhZ2VzLAogCQkJCQkgICB3cml0ZV9ieXRlcywgcGFnZXMsIGkpOwogCkBAIC0xNTEyLDE5ICsxNTgzLDIxIEBACiAJCX0KIAogCQlyZWxlYXNlX2J5dGVzID0gZGlydHlfcGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVDsKLQkJaWYgKGNvcGllZCA+IDApIHsKKworCQlpZiAoY29waWVkID4gMCkKIAkJCXJldCA9IGJ0cmZzX2RpcnR5X3BhZ2VzKHJvb3QsIGlub2RlLCBwYWdlcywKIAkJCQkJCWRpcnR5X3BhZ2VzLCBwb3MsIGNvcGllZCwKIAkJCQkJCU5VTEwpOwotCQkJaWYgKHJldCkgewotCQkJCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCWlmIChuZWVkX3VubG9jaykKKwkJCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgICBsb2Nrc3RhcnQsIGxvY2tlbmQsICZjYWNoZWRfc3RhdGUsCisJCQkJCSAgICAgR0ZQX05PRlMpOworCQlpZiAocmV0KSB7CisJCQlidHJmc19kcm9wX3BhZ2VzKHBhZ2VzLCBudW1fcGFnZXMpOworCQkJYnJlYWs7CiAJCX0KIAogCQlyZWxlYXNlX2J5dGVzID0gMDsKLQkJYnRyZnNfZHJvcF9wYWdlcyhwYWdlcywgbnVtX3BhZ2VzKTsKLQogCQlpZiAob25seV9yZWxlYXNlX21ldGFkYXRhICYmIGNvcGllZCA+IDApIHsKIAkJCXU2NCBsb2Nrc3RhcnQgPSByb3VuZF9kb3duKHBvcywgcm9vdC0+c2VjdG9yc2l6ZSk7CiAJCQl1NjQgbG9ja2VuZCA9IGxvY2tzdGFydCArCkBAIC0xNTM2LDYgKzE2MDksOCBAQAogCQkJb25seV9yZWxlYXNlX21ldGFkYXRhID0gZmFsc2U7CiAJCX0KIAorCQlidHJmc19kcm9wX3BhZ2VzKHBhZ2VzLCBudW1fcGFnZXMpOworCiAJCWNvbmRfcmVzY2hlZCgpOwogCiAJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQoaW5vZGUtPmlfbWFwcGluZyk7CkBAIC0xODU3LDEyICsxOTMyLDI0IEBACiAJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkKIAkJYnRyZnNfaW9jdGxfdHJhbnNfZW5kKGZpbGUpOwogCisJLyoKKwkgKiBXZSB1c2Ugc3RhcnQgaGVyZSBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB3YWl0IG9uIHRoZSBJTyB0byBjb21wbGV0ZQorCSAqIGluIGJ0cmZzX3N5bmNfbG9nLCB3aGljaCBjb3VsZCByZXF1aXJlIGpvaW5pbmcgYSB0cmFuc2FjdGlvbiAoZm9yCisJICogZXhhbXBsZSBjaGVja2luZyBjcm9zcyByZWZlcmVuY2VzIGluIHRoZSBub2NvdyBwYXRoKS4gIElmIHdlIHVzZSBqb2luCisJICogaGVyZSB3ZSBjb3VsZCBnZXQgaW50byBhIHNpdHVhdGlvbiB3aGVyZSB3ZSdyZSB3YWl0aW5nIG9uIElPIHRvCisJICogaGFwcGVuIHRoYXQgaXMgYmxvY2tlZCBvbiBhIHRyYW5zYWN0aW9uIHRyeWluZyB0byBjb21taXQuICBXaXRoIHN0YXJ0CisJICogd2UgaW5jIHRoZSBleHR3cml0ZXIgY291bnRlciwgc28gd2Ugd2FpdCBmb3IgYWxsIGV4dHdyaXRlcnMgdG8gZXhpdAorCSAqIGJlZm9yZSB3ZSBzdGFydCBibG9ja2luZyBqb2luJ2Vycy4gIFRoaXMgY29tbWVudCBpcyB0byBrZWVwIHNvbWVib2R5CisJICogZnJvbSB0aGlua2luZyB0aGV5IGFyZSBzdXBlciBzbWFydCBhbmQgY2hhbmdpbmcgdGhpcyB0bworCSAqIGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24gKmNvdWdoKkpvc2VmKmNvdWdoKi4KKwkgKi8KIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCXJldCA9IFBUUl9FUlIodHJhbnMpOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQorCXRyYW5zLT5zeW5jID0gdHJ1ZTsKIAogCXJldCA9IGJ0cmZzX2xvZ19kZW50cnlfc2FmZSh0cmFucywgcm9vdCwgZGVudHJ5KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTk2MywxMSArMjA1MCwxMyBAQAogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCByZXQ7CiAKKwlpZiAoYnRyZnNfZnNfaW5jb21wYXQocm9vdC0+ZnNfaW5mbywgTk9fSE9MRVMpKQorCQlnb3RvIG91dDsKKwogCWtleS5vYmplY3RpZCA9IGJ0cmZzX2lubyhpbm9kZSk7CiAJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CiAJa2V5Lm9mZnNldCA9IG9mZnNldDsKIAotCiAJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIDAsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMjA2NCw4ICsyMTUzLDEwIEBACiAJdTY0IGRyb3BfZW5kOwogCWludCByZXQgPSAwOwogCWludCBlcnIgPSAwOworCWludCByc3ZfY291bnQ7CiAJYm9vbCBzYW1lX3BhZ2UgPSAoKG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUKSA9PQogCQkJICAoKG9mZnNldCArIGxlbiAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpKTsKKwlib29sIG5vX2hvbGVzID0gYnRyZnNfZnNfaW5jb21wYXQocm9vdC0+ZnNfaW5mbywgTk9fSE9MRVMpOwogCiAJcmV0ID0gYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBvZmZzZXQsIGxlbik7CiAJaWYgKHJldCkKQEAgLTIxMjUsNyArMjIxNiw3IEBACiAJCSAqIHdlIG5lZWQgdG8gdHJ5IGFnYWluLgogCQkgKi8KIAkJaWYgKCghb3JkZXJlZCB8fAotCQkgICAgKG9yZGVyZWQtPmZpbGVfb2Zmc2V0ICsgb3JkZXJlZC0+bGVuIDwgbG9ja3N0YXJ0IHx8CisJCSAgICAob3JkZXJlZC0+ZmlsZV9vZmZzZXQgKyBvcmRlcmVkLT5sZW4gPD0gbG9ja3N0YXJ0IHx8CiAJCSAgICAgb3JkZXJlZC0+ZmlsZV9vZmZzZXQgPiBsb2NrZW5kKSkgJiYKIAkJICAgICAhdGVzdF9yYW5nZV9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBsb2Nrc3RhcnQsCiAJCQkJICAgICBsb2NrZW5kLCBFWFRFTlRfVVBUT0RBVEUsIDAsCkBAIC0yMTYzLDkgKzIyNTQsMTAgQEAKIAkvKgogCSAqIDEgLSB1cGRhdGUgdGhlIGlub2RlCiAJICogMSAtIHJlbW92aW5nIHRoZSBleHRlbnRzIGluIHRoZSByYW5nZQotCSAqIDEgLSBhZGRpbmcgdGhlIGhvbGUgZXh0ZW50CisJICogMSAtIGFkZGluZyB0aGUgaG9sZSBleHRlbnQgaWYgbm9faG9sZXMgaXNuJ3Qgc2V0CiAJICovCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAzKTsKKwlyc3ZfY291bnQgPSBub19ob2xlcyA/IDIgOiAzOworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgcnN2X2NvdW50KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAkJZ290byBvdXRfZnJlZTsKQEAgLTIxNzksNyArMjI3MSw3IEBACiAJd2hpbGUgKGN1cl9vZmZzZXQgPCBsb2NrZW5kKSB7CiAJCXJldCA9IF9fYnRyZnNfZHJvcF9leHRlbnRzKHRyYW5zLCByb290LCBpbm9kZSwgcGF0aCwKIAkJCQkJICAgY3VyX29mZnNldCwgbG9ja2VuZCArIDEsCi0JCQkJCSAgICZkcm9wX2VuZCwgMSk7CisJCQkJCSAgICZkcm9wX2VuZCwgMSwgMCwgMCwgTlVMTCk7CiAJCWlmIChyZXQgIT0gLUVOT1NQQykKIAkJCWJyZWFrOwogCkBAIC0yMjAyLDcgKzIyOTQsNyBAQAogCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QpOwogCi0JCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMyk7CisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgcnN2X2NvdW50KTsKIAkJaWYgKElTX0VSUih0cmFucykpIHsKIAkJCXJldCA9IFBUUl9FUlIodHJhbnMpOwogCQkJdHJhbnMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jIGIvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCmluZGV4IDA1N2JlOTUuLjczZjNkZTcgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYworKysgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKQEAgLTM0Nyw4ICszNDcsOCBAQAogCQkJYnRyZnNfcmVhZHBhZ2UoTlVMTCwgcGFnZSk7CiAJCQlsb2NrX3BhZ2UocGFnZSk7CiAJCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGVycm9yIHJlYWRpbmcgZnJlZSAiCi0JCQkJICAgICAgICJzcGFjZSBjYWNoZVxuIik7CisJCQkJYnRyZnNfZXJyKEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJCQkgICAiZXJyb3IgcmVhZGluZyBmcmVlIHNwYWNlIGNhY2hlIik7CiAJCQkJaW9fY3RsX2Ryb3BfcGFnZXMoaW9fY3RsKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KQEAgLTQwNSw3ICs0MDUsNyBAQAogCiAJZ2VuID0gaW9fY3RsLT5jdXI7CiAJaWYgKGxlNjRfdG9fY3B1KCpnZW4pICE9IGdlbmVyYXRpb24pIHsKLQkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogc3BhY2UgY2FjaGUgZ2VuZXJhdGlvbiAiCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiQlRSRlM6IHNwYWNlIGNhY2hlIGdlbmVyYXRpb24gIgogCQkJCSAgICIoJUx1KSBkb2VzIG5vdCBtYXRjaCBpbm9kZSAoJUx1KVxuIiwgKmdlbiwKIAkJCQkgICBnZW5lcmF0aW9uKTsKIAkJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKIAlidHJmc19jc3VtX2ZpbmFsKGNyYywgKGNoYXIgKikmY3JjKTsKIAlpZiAodmFsICE9IGNyYykgewotCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIgImJ0cmZzOiBjc3VtIG1pc21hdGNoIG9uIGZyZWUgIgorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIgIkJUUkZTOiBjc3VtIG1pc21hdGNoIG9uIGZyZWUgIgogCQkJCSAgICJzcGFjZSBjYWNoZVxuIik7CiAJCWlvX2N0bF91bm1hcF9wYWdlKGlvX2N0bCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTkwMiw3ICsxOTAyLDcgQEAKIAlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwogCiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9DUklUICJidHJmczogdW5hYmxlIHRvIGFkZCBmcmVlIHNwYWNlIDolZFxuIiwgcmV0KTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQlRSRlM6IHVuYWJsZSB0byBhZGQgZnJlZSBzcGFjZSA6JWRcbiIsIHJldCk7CiAJCUFTU0VSVChyZXQgIT0gLUVFWElTVCk7CiAJfQogCkBAIC0yMDExLDE0ICsyMDExLDE1IEBACiAJCWluZm8gPSByYl9lbnRyeShuLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKIAkJaWYgKGluZm8tPmJ5dGVzID49IGJ5dGVzICYmICFibG9ja19ncm91cC0+cm8pCiAJCQljb3VudCsrOwotCQlwcmludGsoS0VSTl9DUklUICJlbnRyeSBvZmZzZXQgJWxsdSwgYnl0ZXMgJWxsdSwgYml0bWFwICVzXG4iLAotCQkgICAgICAgaW5mby0+b2Zmc2V0LCBpbmZvLT5ieXRlcywKKwkJYnRyZnNfY3JpdChibG9ja19ncm91cC0+ZnNfaW5mbywKKwkJCSAgICJlbnRyeSBvZmZzZXQgJWxsdSwgYnl0ZXMgJWxsdSwgYml0bWFwICVzIiwKKwkJCSAgIGluZm8tPm9mZnNldCwgaW5mby0+Ynl0ZXMsCiAJCSAgICAgICAoaW5mby0+Yml0bWFwKSA/ICJ5ZXMiIDogIm5vIik7CiAJfQotCXByaW50ayhLRVJOX0lORk8gImJsb2NrIGdyb3VwIGhhcyBjbHVzdGVyPzogJXNcbiIsCisJYnRyZnNfaW5mbyhibG9ja19ncm91cC0+ZnNfaW5mbywgImJsb2NrIGdyb3VwIGhhcyBjbHVzdGVyPzogJXMiLAogCSAgICAgICBsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+Y2x1c3Rlcl9saXN0KSA/ICJubyIgOiAieWVzIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJWQgYmxvY2tzIG9mIGZyZWUgc3BhY2UgYXQgb3IgYmlnZ2VyIHRoYW4gYnl0ZXMgaXMiCi0JICAgICAgICJcbiIsIGNvdW50KTsKKwlidHJmc19pbmZvKGJsb2NrX2dyb3VwLT5mc19pbmZvLAorCQkgICAiJWQgYmxvY2tzIG9mIGZyZWUgc3BhY2UgYXQgb3IgYmlnZ2VyIHRoYW4gYnl0ZXMgaXMiLCBjb3VudCk7CiB9CiAKIHZvaWQgYnRyZnNfaW5pdF9mcmVlX3NwYWNlX2N0bChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwKQpAQCAtMjQyMSw3ICsyNDIyLDYgQEAKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnkgPSBOVUxMOwogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpsYXN0OwogCXN0cnVjdCByYl9ub2RlICpub2RlOwotCXU2NCB3aW5kb3dfc3RhcnQ7CiAJdTY0IHdpbmRvd19mcmVlOwogCXU2NCBtYXhfZXh0ZW50OwogCXU2NCB0b3RhbF9zaXplID0gMDsKQEAgLTI0NDMsNyArMjQ0Myw2IEBACiAJCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CiAJfQogCi0Jd2luZG93X3N0YXJ0ID0gZW50cnktPm9mZnNldDsKIAl3aW5kb3dfZnJlZSA9IGVudHJ5LT5ieXRlczsKIAltYXhfZXh0ZW50ID0gZW50cnktPmJ5dGVzOwogCWZpcnN0ID0gZW50cnk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9oYXNoLmMgYi9mcy9idHJmcy9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4ODlhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2hhc2guYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZpbGlwZSBEYXZpZCBCb3JiYSBNYW5hbmEgPGZkbWFuYW5hQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlICJoYXNoLmgiCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICp0Zm07CisKK2ludCBfX2luaXQgYnRyZnNfaGFzaF9pbml0KHZvaWQpCit7CisJdGZtID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJjcmMzMmMiLCAwLCAwKTsKKwlpZiAoSVNfRVJSKHRmbSkpCisJCXJldHVybiBQVFJfRVJSKHRmbSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBidHJmc19oYXNoX2V4aXQodm9pZCkKK3sKKwljcnlwdG9fZnJlZV9zaGFzaCh0Zm0pOworfQorCit1MzIgYnRyZnNfY3JjMzJjKHUzMiBjcmMsIGNvbnN0IHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IHNoYXNoX2Rlc2Mgc2hhc2g7CisJCWNoYXIgY3R4W2NyeXB0b19zaGFzaF9kZXNjc2l6ZSh0Zm0pXTsKKwl9IGRlc2M7CisJaW50IGVycjsKKworCWRlc2Muc2hhc2gudGZtID0gdGZtOworCWRlc2Muc2hhc2guZmxhZ3MgPSAwOworCSoodTMyICopZGVzYy5jdHggPSBjcmM7CisKKwllcnIgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZkZXNjLnNoYXNoLCBhZGRyZXNzLCBsZW5ndGgpOworCUJVR19PTihlcnIpOworCisJcmV0dXJuICoodTMyICopZGVzYy5jdHg7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9oYXNoLmggYi9mcy9idHJmcy9oYXNoLmgKaW5kZXggMWQ5ODI4MS4uMTE4YTIzMSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaGFzaC5oCisrKyBiL2ZzL2J0cmZzL2hhc2guaApAQCAtMTksMTAgKzE5LDE1IEBACiAjaWZuZGVmIF9fSEFTSF9fCiAjZGVmaW5lIF9fSEFTSF9fCiAKLSNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KK2ludCBfX2luaXQgYnRyZnNfaGFzaF9pbml0KHZvaWQpOworCit2b2lkIGJ0cmZzX2hhc2hfZXhpdCh2b2lkKTsKKwordTMyIGJ0cmZzX2NyYzMyYyh1MzIgY3JjLCBjb25zdCB2b2lkICphZGRyZXNzLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKKwogc3RhdGljIGlubGluZSB1NjQgYnRyZnNfbmFtZV9oYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCiB7Ci0JcmV0dXJuIGNyYzMyYygodTMyKX4xLCBuYW1lLCBsZW4pOworCXJldHVybiBidHJmc19jcmMzMmMoKHUzMil+MSwgbmFtZSwgbGVuKTsKIH0KIAogLyoKQEAgLTMxLDcgKzM2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdTY0IGJ0cmZzX2V4dHJlZl9oYXNoKHU2NCBwYXJlbnRfb2JqZWN0aWQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgIGludCBsZW4pCiB7Ci0JcmV0dXJuICh1NjQpIGNyYzMyYyhwYXJlbnRfb2JqZWN0aWQsIG5hbWUsIGxlbik7CisJcmV0dXJuICh1NjQpIGJ0cmZzX2NyYzMyYyhwYXJlbnRfb2JqZWN0aWQsIG5hbWUsIGxlbik7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUtaXRlbS5jIGIvZnMvYnRyZnMvaW5vZGUtaXRlbS5jCmluZGV4IGVjODJmYWUuLjJiZTM4ZGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLWl0ZW0uYworKysgYi9mcy9idHJmcy9pbm9kZS1pdGVtLmMKQEAgLTkxLDMyICs5MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICoKLWJ0cmZzX2xvb2t1cF9pbm9kZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJICAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAotCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAotCQkgICAgICAgdTY0IGlub2RlX29iamVjdGlkLCB1NjQgcmVmX29iamVjdGlkLCBpbnQgaW5zX2xlbiwKLQkJICAgICAgIGludCBjb3cpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKLQlzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICpyZWY7Ci0KLQlrZXkub2JqZWN0aWQgPSBpbm9kZV9vYmplY3RpZDsKLQlrZXkudHlwZSA9IEJUUkZTX0lOT0RFX1JFRl9LRVk7Ci0Ja2V5Lm9mZnNldCA9IHJlZl9vYmplY3RpZDsKLQotCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCBpbnNfbGVuLCBjb3cpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCWlmIChyZXQgPiAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbmRfbmFtZV9pbl9iYWNrcmVmKHBhdGgsIG5hbWUsIG5hbWVfbGVuLCAmcmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHJlZjsKLX0KLQogLyogUmV0dXJucyBOVUxMIGlmIG5vIGV4dHJlZiBmb3VuZCAqLwogc3RydWN0IGJ0cmZzX2lub2RlX2V4dHJlZiAqCiBidHJmc19sb29rdXBfaW5vZGVfZXh0cmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMTQ0LDQ1ICsxMTgsNiBAQAogCXJldHVybiBleHRyZWY7CiB9CiAKLWludCBidHJmc19nZXRfaW5vZGVfcmVmX2luZGV4KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkgICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKLQkJCSAgICAgIHU2NCBpbm9kZV9vYmplY3RpZCwgdTY0IHJlZl9vYmplY3RpZCwgaW50IG1vZCwKLQkJCSAgICAgIHU2NCAqcmV0X2luZGV4KQotewotCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKnJlZjsKLQlzdHJ1Y3QgYnRyZnNfaW5vZGVfZXh0cmVmICpleHRyZWY7Ci0JaW50IGluc19sZW4gPSBtb2QgPCAwID8gLTEgOiAwOwotCWludCBjb3cgPSBtb2QgIT0gMDsKLQotCXJlZiA9IGJ0cmZzX2xvb2t1cF9pbm9kZV9yZWYodHJhbnMsIHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuLAotCQkJCSAgICAgaW5vZGVfb2JqZWN0aWQsIHJlZl9vYmplY3RpZCwgaW5zX2xlbiwKLQkJCQkgICAgIGNvdyk7Ci0JaWYgKElTX0VSUihyZWYpKQotCQlyZXR1cm4gUFRSX0VSUihyZWYpOwotCi0JaWYgKHJlZiAhPSBOVUxMKSB7Ci0JCSpyZXRfaW5kZXggPSBidHJmc19pbm9kZV9yZWZfaW5kZXgocGF0aC0+bm9kZXNbMF0sIHJlZik7Ci0JCXJldHVybiAwOwotCX0KLQotCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKLQotCWV4dHJlZiA9IGJ0cmZzX2xvb2t1cF9pbm9kZV9leHRyZWYodHJhbnMsIHJvb3QsIHBhdGgsIG5hbWUsCi0JCQkJCSAgIG5hbWVfbGVuLCBpbm9kZV9vYmplY3RpZCwKLQkJCQkJICAgcmVmX29iamVjdGlkLCBpbnNfbGVuLCBjb3cpOwotCWlmIChJU19FUlIoZXh0cmVmKSkKLQkJcmV0dXJuIFBUUl9FUlIoZXh0cmVmKTsKLQotCWlmIChleHRyZWYpIHsKLQkJKnJldF9pbmRleCA9IGJ0cmZzX2lub2RlX2V4dHJlZl9pbmRleChwYXRoLT5ub2Rlc1swXSwgZXh0cmVmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FTk9FTlQ7Ci19Ci0KIHN0YXRpYyBpbnQgYnRyZnNfZGVsX2lub2RlX2V4dHJlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggNTE0YjI5MS4uMTg0ZTljYiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUuYworKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC01OCw5ICs1OCwxMCBAQAogI2luY2x1ZGUgImlub2RlLW1hcC5oIgogI2luY2x1ZGUgImJhY2tyZWYuaCIKICNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAicHJvcHMuaCIKIAogc3RydWN0IGJ0cmZzX2lnZXRfYXJncyB7Ci0JdTY0IGlubzsKKwlzdHJ1Y3QgYnRyZnNfa2V5ICpsb2NhdGlvbjsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKIH07CiAKQEAgLTEyNSwxMyArMTI2LDEyIEBACiAgKiBubyBvdmVybGFwcGluZyBpbmxpbmUgaXRlbXMgZXhpc3QgaW4gdGhlIGJ0cmVlCiAgKi8KIHN0YXRpYyBub2lubGluZSBpbnQgaW5zZXJ0X2lubGluZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBleHRlbnRfaW5zZXJ0ZWQsCiAJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJdTY0IHN0YXJ0LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGNvbXByZXNzZWRfc2l6ZSwKIAkJCQlpbnQgY29tcHJlc3NfdHlwZSwKIAkJCQlzdHJ1Y3QgcGFnZSAqKmNvbXByZXNzZWRfcGFnZXMpCiB7Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0Jc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCWNoYXIgKmthZGRyOwpAQCAtMTQwLDI5ICsxNDAsMjkgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmV0OwogCXNpemVfdCBjdXJfc2l6ZSA9IHNpemU7Ci0Jc2l6ZV90IGRhdGFzaXplOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaWYgKGNvbXByZXNzZWRfc2l6ZSAmJiBjb21wcmVzc2VkX3BhZ2VzKQogCQljdXJfc2l6ZSA9IGNvbXByZXNzZWRfc2l6ZTsKIAotCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JaWYgKCFwYXRoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKLQotCWtleS5vYmplY3RpZCA9IGJ0cmZzX2lubyhpbm9kZSk7Ci0Ja2V5Lm9mZnNldCA9IHN0YXJ0OwotCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOwotCWRhdGFzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfY2FsY19pbmxpbmVfc2l6ZShjdXJfc2l6ZSk7Ci0KIAlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIHNpemUpOwotCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCAma2V5LAotCQkJCSAgICAgIGRhdGFzaXplKTsKLQlpZiAocmV0KSB7Ci0JCWVyciA9IHJldDsKLQkJZ290byBmYWlsOworCisJaWYgKCFleHRlbnRfaW5zZXJ0ZWQpIHsKKwkJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJCXNpemVfdCBkYXRhc2l6ZTsKKworCQlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOworCQlrZXkub2Zmc2V0ID0gc3RhcnQ7CisJCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOworCisJCWRhdGFzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfY2FsY19pbmxpbmVfc2l6ZShjdXJfc2l6ZSk7CisJCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKKwkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCisJCQkJCSAgICAgIGRhdGFzaXplKTsKKwkJaWYgKHJldCkgeworCQkJZXJyID0gcmV0OworCQkJZ290byBmYWlsOworCQl9CiAJfQogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKIAllaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLApAQCAtMjAzLDcgKzIwMyw3IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CiAJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7Ci0JYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKIAogCS8qCiAJICogd2UncmUgYW4gaW5saW5lIGV4dGVudCwgc28gbm9ib2R5IGNhbgpAQCAtMjE5LDcgKzIxOSw2IEBACiAKIAlyZXR1cm4gcmV0OwogZmFpbDoKLQlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjQyLDYgKzI0MSw5IEBACiAJdTY0IGFsaWduZWRfZW5kID0gQUxJR04oZW5kLCByb290LT5zZWN0b3JzaXplKTsKIAl1NjQgZGF0YV9sZW4gPSBpbmxpbmVfbGVuOwogCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IGV4dGVudF9pbnNlcnRlZCA9IDA7CisJdTMyIGV4dGVudF9pdGVtX3NpemU7CiAKIAlpZiAoY29tcHJlc3NlZF9zaXplKQogCQlkYXRhX2xlbiA9IGNvbXByZXNzZWRfc2l6ZTsKQEAgLTI1NiwxMiArMjU4LDI3IEBACiAJCXJldHVybiAxOwogCX0KIAorCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKLQlpZiAoSVNfRVJSKHRyYW5zKSkKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKKwl9CiAJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Y7CiAKLQlyZXQgPSBidHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBzdGFydCwgYWxpZ25lZF9lbmQsIDEpOworCWlmIChjb21wcmVzc2VkX3NpemUgJiYgY29tcHJlc3NlZF9wYWdlcykKKwkJZXh0ZW50X2l0ZW1fc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2NhbGNfaW5saW5lX3NpemUoCisJCSAgIGNvbXByZXNzZWRfc2l6ZSk7CisJZWxzZQorCQlleHRlbnRfaXRlbV9zaXplID0gYnRyZnNfZmlsZV9leHRlbnRfY2FsY19pbmxpbmVfc2l6ZSgKKwkJICAgIGlubGluZV9sZW4pOworCisJcmV0ID0gX19idHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBwYXRoLAorCQkJCSAgIHN0YXJ0LCBhbGlnbmVkX2VuZCwgTlVMTCwKKwkJCQkgICAxLCAxLCBleHRlbnRfaXRlbV9zaXplLCAmZXh0ZW50X2luc2VydGVkKTsKIAlpZiAocmV0KSB7CiAJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290LCByZXQpOwogCQlnb3RvIG91dDsKQEAgLTI2OSw3ICsyODYsOCBAQAogCiAJaWYgKGlzaXplID4gYWN0dWFsX2VuZCkKIAkJaW5saW5lX2xlbiA9IG1pbl90KHU2NCwgaXNpemUsIGFjdHVhbF9lbmQpOwotCXJldCA9IGluc2VydF9pbmxpbmVfZXh0ZW50KHRyYW5zLCByb290LCBpbm9kZSwgc3RhcnQsCisJcmV0ID0gaW5zZXJ0X2lubGluZV9leHRlbnQodHJhbnMsIHBhdGgsIGV4dGVudF9pbnNlcnRlZCwKKwkJCQkgICByb290LCBpbm9kZSwgc3RhcnQsCiAJCQkJICAgaW5saW5lX2xlbiwgY29tcHJlc3NlZF9zaXplLAogCQkJCSAgIGNvbXByZXNzX3R5cGUsIGNvbXByZXNzZWRfcGFnZXMpOwogCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9TUEMpIHsKQEAgLTI4NCw2ICszMDIsNyBAQAogCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIGVuZCArIDEgLSBzdGFydCk7CiAJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBhbGlnbmVkX2VuZCAtIDEsIDApOwogb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMjYyLDcgKzEyODEsOCBAQAogCQkJbm9jb3cgPSAxOwogCQl9IGVsc2UgaWYgKGV4dGVudF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgewogCQkJZXh0ZW50X2VuZCA9IGZvdW5kX2tleS5vZmZzZXQgKwotCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwgZmkpOworCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwKKwkJCQkJCSAgICAgcGF0aC0+c2xvdHNbMF0sIGZpKTsKIAkJCWV4dGVudF9lbmQgPSBBTElHTihleHRlbnRfZW5kLCByb290LT5zZWN0b3JzaXplKTsKIAkJfSBlbHNlIHsKIAkJCUJVR19PTigxKTsKQEAgLTE1NzcsNyArMTU5Nyw3IEBACiAJCQkgdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5yb290OwotCXU2NCBsb2dpY2FsID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCXU2NCBsb2dpY2FsID0gKHU2NCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDk7CiAJdTY0IGxlbmd0aCA9IDA7CiAJdTY0IG1hcF9sZW5ndGg7CiAJaW50IHJldDsKQEAgLTE1ODUsNyArMTYwNSw3IEBACiAJaWYgKGJpb19mbGFncyAmIEVYVEVOVF9CSU9fQ09NUFJFU1NFRCkKIAkJcmV0dXJuIDA7CiAKLQlsZW5ndGggPSBiaW8tPmJpX3NpemU7CisJbGVuZ3RoID0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJbWFwX2xlbmd0aCA9IGxlbmd0aDsKIAlyZXQgPSBidHJmc19tYXBfYmxvY2socm9vdC0+ZnNfaW5mbywgcncsIGxvZ2ljYWwsCiAJCQkgICAgICAmbWFwX2xlbmd0aCwgTlVMTCwgMCk7CkBAIC0xODQxLDE0ICsxODYxLDEzIEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJc3RydWN0IGJ0cmZzX2tleSBpbnM7CisJaW50IGV4dGVudF9pbnNlcnRlZCA9IDA7CiAJaW50IHJldDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKLQogCS8qCiAJICogd2UgbWF5IGJlIHJlcGxhY2luZyBvbmUgZXh0ZW50IGluIHRoZSB0cmVlIHdpdGggYW5vdGhlci4KIAkgKiBUaGUgbmV3IGV4dGVudCBpcyBwaW5uZWQgaW4gdGhlIGV4dGVudCBtYXAsIGFuZCB3ZSBkb24ndCB3YW50CkBAIC0xODU4LDE3ICsxODc3LDIzIEBACiAJICogdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB1bnBpbiBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgbWVyZ2VkCiAJICogd2l0aCB0aGUgb3RoZXJzLgogCSAqLwotCXJldCA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsIGZpbGVfcG9zLAotCQkJCSBmaWxlX3BvcyArIG51bV9ieXRlcywgMCk7CisJcmV0ID0gX19idHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBwYXRoLCBmaWxlX3BvcywKKwkJCQkgICBmaWxlX3BvcyArIG51bV9ieXRlcywgTlVMTCwgMCwKKwkJCQkgICAxLCBzaXplb2YoKmZpKSwgJmV4dGVudF9pbnNlcnRlZCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlpbnMub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOwotCWlucy5vZmZzZXQgPSBmaWxlX3BvczsKLQlpbnMudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKLQlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgJmlucywgc2l6ZW9mKCpmaSkpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OworCWlmICghZXh0ZW50X2luc2VydGVkKSB7CisJCWlucy5vYmplY3RpZCA9IGJ0cmZzX2lubyhpbm9kZSk7CisJCWlucy5vZmZzZXQgPSBmaWxlX3BvczsKKwkJaW5zLnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CisKKwkJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOworCQlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgJmlucywKKwkJCQkJICAgICAgc2l6ZW9mKCpmaSkpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKIAlmaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKQEAgLTIyOTAsNyArMjMxNSw3IEBACiAJCXU2NCBleHRlbnRfbGVuOwogCQlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKIAotCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgMSwgMSk7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAwLCAxKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9mcmVlX3BhdGg7CiAKQEAgLTI1NDMsMTIgKzI1NjgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogaGVscGVyIGZ1bmN0aW9uIGZvciBidHJmc19maW5pc2hfb3JkZXJlZF9pbywgdGhpcwotICoganVzdCByZWFkcyBpbiBzb21lIG9mIHRoZSBjc3VtIGxlYXZlcyB0byBwcmltZSB0aGVtIGludG8gcmFtCi0gKiBiZWZvcmUgd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uLiAgSXQgbGltaXRzIHRoZSBhbW91bnQgb2YgYnRyZWUKLSAqIHJlYWRzIHJlcXVpcmVkIHdoaWxlIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uCi0gKi8KIC8qIGFzIG9yZGVyZWQgZGF0YSBJTyBmaW5pc2hlcywgdGhpcyBnZXRzIGNhbGxlZCBzbyB3ZSBjYW4gZmluaXNoCiAgKiBhbiBvcmRlcmVkIGV4dGVudCBpZiB0aGUgcmFuZ2Ugb2YgYnl0ZXMgaW4gdGhlIGZpbGUgaXQgY292ZXJzIGFyZQogICogZnVsbHkgd3JpdHRlbi4KQEAgLTI2MTAsNyArMjYyOSw3IEBACiAJCQlFWFRFTlRfREVGUkFHLCAxLCBjYWNoZWRfc3RhdGUpOwogCWlmIChyZXQpIHsKIAkJdTY0IGxhc3Rfc25hcHNob3QgPSBidHJmc19yb290X2xhc3Rfc25hcHNob3QoJnJvb3QtPnJvb3RfaXRlbSk7Ci0JCWlmIChsYXN0X3NuYXBzaG90ID49IEJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uKQorCQlpZiAoMCAmJiBsYXN0X3NuYXBzaG90ID49IEJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uKQogCQkJLyogdGhlIGlub2RlIGlzIHNoYXJlZCAqLwogCQkJbmV3ID0gcmVjb3JkX29sZF9maWxlX2V4dGVudHMoaW5vZGUsIG9yZGVyZWRfZXh0ZW50KTsKIApAQCAtMzI0OCw3ICszMjY3LDggQEAKICAqIHNsb3QgaXMgdGhlIHNsb3QgdGhlIGlub2RlIGlzIGluLCBvYmplY3RpZCBpcyB0aGUgb2JqZWN0aWQgb2YgdGhlIGlub2RlCiAgKi8KIHN0YXRpYyBub2lubGluZSBpbnQgYWNsc19hZnRlcl9pbm9kZV9pdGVtKHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmLAotCQkJCQkgIGludCBzbG90LCB1NjQgb2JqZWN0aWQpCisJCQkJCSAgaW50IHNsb3QsIHU2NCBvYmplY3RpZCwKKwkJCQkJICBpbnQgKmZpcnN0X3hhdHRyX3Nsb3QpCiB7CiAJdTMyIG5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKQEAgLTMyNjQsNiArMzI4NCw3IEBACiAJfQogCiAJc2xvdCsrOworCSpmaXJzdF94YXR0cl9zbG90ID0gLTE7CiAJd2hpbGUgKHNsb3QgPCBucml0ZW1zKSB7CiAJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBzbG90KTsKIApAQCAtMzI3Myw2ICszMjk0LDggQEAKIAogCQkvKiB3ZSBmb3VuZCBhbiB4YXR0ciwgYXNzdW1lIHdlJ3ZlIGdvdCBhbiBhY2wgKi8KIAkJaWYgKGZvdW5kX2tleS50eXBlID09IEJUUkZTX1hBVFRSX0lURU1fS0VZKSB7CisJCQlpZiAoKmZpcnN0X3hhdHRyX3Nsb3QgPT0gLTEpCisJCQkJKmZpcnN0X3hhdHRyX3Nsb3QgPSBzbG90OwogCQkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPT0geGF0dHJfYWNjZXNzIHx8CiAJCQkgICAgZm91bmRfa2V5Lm9mZnNldCA9PSB4YXR0cl9kZWZhdWx0KQogCQkJCXJldHVybiAxOwpAQCAtMzMwMSw2ICszMzI0LDggQEAKIAkgKiBzb21ldGhpbmcgbGFyZ2VyIHRoYW4gYW4geGF0dHIuICBXZSBoYXZlIHRvIGFzc3VtZSB0aGUgaW5vZGUKIAkgKiBoYXMgYWNscwogCSAqLworCWlmICgqZmlyc3RfeGF0dHJfc2xvdCA9PSAtMSkKKwkJKmZpcnN0X3hhdHRyX3Nsb3QgPSBzbG90OwogCXJldHVybiAxOwogfQogCkBAIC0zMzE1LDEwICszMzQwLDEyIEBACiAJc3RydWN0IGJ0cmZzX3RpbWVzcGVjICp0c3BlYzsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisJdW5zaWduZWQgbG9uZyBwdHI7CiAJaW50IG1heWJlX2FjbHM7CiAJdTMyIHJkZXY7CiAJaW50IHJldDsKIAlib29sIGZpbGxlZCA9IGZhbHNlOworCWludCBmaXJzdF94YXR0cl9zbG90OwogCiAJcmV0ID0gYnRyZnNfZmlsbF9pbm9kZShpbm9kZSwgJnJkZXYpOwogCWlmICghcmV0KQpAQCAtMzMyOCw3ICszMzU1LDYgQEAKIAlpZiAoIXBhdGgpCiAJCWdvdG8gbWFrZV9iYWQ7CiAKLQlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAJbWVtY3B5KCZsb2NhdGlvbiwgJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwgc2l6ZW9mKGxvY2F0aW9uKSk7CiAKIAlyZXQgPSBidHJmc19sb29rdXBfaW5vZGUoTlVMTCwgcm9vdCwgcGF0aCwgJmxvY2F0aW9uLCAwKTsKQEAgLTMzMzgsNyArMzM2NCw3IEBACiAJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwogCiAJaWYgKGZpbGxlZCkKLQkJZ290byBjYWNoZV9hY2w7CisJCWdvdG8gY2FjaGVfaW5kZXg7CiAKIAlpbm9kZV9pdGVtID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCiAJCQkJICAgIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtKTsKQEAgLTMzODEsMTggKzM0MDcsNTEgQEAKIAogCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOwogCUJUUkZTX0koaW5vZGUpLT5mbGFncyA9IGJ0cmZzX2lub2RlX2ZsYWdzKGxlYWYsIGlub2RlX2l0ZW0pOworCitjYWNoZV9pbmRleDoKKwlwYXRoLT5zbG90c1swXSsrOworCWlmIChpbm9kZS0+aV9ubGluayAhPSAxIHx8CisJICAgIHBhdGgtPnNsb3RzWzBdID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKQorCQlnb3RvIGNhY2hlX2FjbDsKKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmbG9jYXRpb24sIHBhdGgtPnNsb3RzWzBdKTsKKwlpZiAobG9jYXRpb24ub2JqZWN0aWQgIT0gYnRyZnNfaW5vKGlub2RlKSkKKwkJZ290byBjYWNoZV9hY2w7CisKKwlwdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCWlmIChsb2NhdGlvbi50eXBlID09IEJUUkZTX0lOT0RFX1JFRl9LRVkpIHsKKwkJc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqcmVmOworCisJCXJlZiA9IChzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICopcHRyOworCQlCVFJGU19JKGlub2RlKS0+ZGlyX2luZGV4ID0gYnRyZnNfaW5vZGVfcmVmX2luZGV4KGxlYWYsIHJlZik7CisJfSBlbHNlIGlmIChsb2NhdGlvbi50eXBlID09IEJUUkZTX0lOT0RFX0VYVFJFRl9LRVkpIHsKKwkJc3RydWN0IGJ0cmZzX2lub2RlX2V4dHJlZiAqZXh0cmVmOworCisJCWV4dHJlZiA9IChzdHJ1Y3QgYnRyZnNfaW5vZGVfZXh0cmVmICopcHRyOworCQlCVFJGU19JKGlub2RlKS0+ZGlyX2luZGV4ID0gYnRyZnNfaW5vZGVfZXh0cmVmX2luZGV4KGxlYWYsCisJCQkJCQkJCSAgICAgZXh0cmVmKTsKKwl9CiBjYWNoZV9hY2w6CiAJLyoKIAkgKiB0cnkgdG8gcHJlY2FjaGUgYSBOVUxMIGFjbCBlbnRyeSBmb3IgZmlsZXMgdGhhdCBkb24ndCBoYXZlCiAJICogYW55IHhhdHRycyBvciBhY2xzCiAJICovCiAJbWF5YmVfYWNscyA9IGFjbHNfYWZ0ZXJfaW5vZGVfaXRlbShsZWFmLCBwYXRoLT5zbG90c1swXSwKLQkJCQkJICAgYnRyZnNfaW5vKGlub2RlKSk7CisJCQkJCSAgIGJ0cmZzX2lubyhpbm9kZSksICZmaXJzdF94YXR0cl9zbG90KTsKKwlpZiAoZmlyc3RfeGF0dHJfc2xvdCAhPSAtMSkgeworCQlwYXRoLT5zbG90c1swXSA9IGZpcnN0X3hhdHRyX3Nsb3Q7CisJCXJldCA9IGJ0cmZzX2xvYWRfaW5vZGVfcHJvcHMoaW5vZGUsIHBhdGgpOworCQlpZiAocmV0KQorCQkJYnRyZnNfZXJyKHJvb3QtPmZzX2luZm8sCisJCQkJICAiZXJyb3IgbG9hZGluZyBwcm9wcyBmb3IgaW5vICVsbHUgKHJvb3QgJWxsdSk6ICVkXG4iLAorCQkJCSAgYnRyZnNfaW5vKGlub2RlKSwKKwkJCQkgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLCByZXQpOworCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisKIAlpZiAoIW1heWJlX2FjbHMpCiAJCWNhY2hlX25vX2FjbChpbm9kZSk7CiAKLQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0KIAlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKIAljYXNlIFNfSUZSRUc6CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJ0cmZzX2FvcHM7CkBAIC0zNDk2LDcgKzM1NTUsNiBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlidHJmc191bmxvY2tfdXBfc2FmZShwYXRoLCAxKTsKIAlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CkBAIC0zNTkzLDYgKzM2NTEsMjQgQEAKIAkJZ290byBlcnI7CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGRpciBpbmRleCwgd2UgaGF2ZSB0byBnZXQgaXQgYnkgbG9va2luZyB1cAorCSAqIHRoZSBpbm9kZSByZWYsIHNpbmNlIHdlIGdldCB0aGUgaW5vZGUgcmVmLCByZW1vdmUgaXQgZGlyZWN0bHksCisJICogaXQgaXMgdW5uZWNlc3NhcnkgdG8gZG8gZGVsYXllZCBkZWxldGlvbi4KKwkgKgorCSAqIEJ1dCBpZiB3ZSBoYXZlIGRpciBpbmRleCwgbmVlZG4ndCBzZWFyY2ggaW5vZGUgcmVmIHRvIGdldCBpdC4KKwkgKiBTaW5jZSB0aGUgaW5vZGUgcmVmIGlzIGNsb3NlIHRvIHRoZSBpbm9kZSBpdGVtLCBpdCBpcyBiZXR0ZXIKKwkgKiB0aGF0IHdlIGRlbGF5IHRvIGRlbGV0ZSBpdCwgYW5kIGp1c3QgZG8gdGhpcyBkZWxldGlvbiB3aGVuCisJICogd2UgdXBkYXRlIHRoZSBpbm9kZSBpdGVtLgorCSAqLworCWlmIChCVFJGU19JKGlub2RlKS0+ZGlyX2luZGV4KSB7CisJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfZGVsZXRlX2lub2RlX3JlZihpbm9kZSk7CisJCWlmICghcmV0KSB7CisJCQlpbmRleCA9IEJUUkZTX0koaW5vZGUpLT5kaXJfaW5kZXg7CisJCQlnb3RvIHNraXBfYmFja3JlZjsKKwkJfQorCX0KKwogCXJldCA9IGJ0cmZzX2RlbF9pbm9kZV9yZWYodHJhbnMsIHJvb3QsIG5hbWUsIG5hbWVfbGVuLCBpbm8sCiAJCQkJICBkaXJfaW5vLCAmaW5kZXgpOwogCWlmIChyZXQpIHsKQEAgLTM2MDIsNyArMzY3OCw3IEBACiAJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290LCByZXQpOwogCQlnb3RvIGVycjsKIAl9Ci0KK3NraXBfYmFja3JlZjoKIAlyZXQgPSBidHJmc19kZWxldGVfZGVsYXllZF9kaXJfaW5kZXgodHJhbnMsIHJvb3QsIGRpciwgaW5kZXgpOwogCWlmIChyZXQpIHsKIAkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIHJldCk7CkBAIC0zOTQ4LDcgKzQwMjQsNyBAQAogCQkJCSAgICBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmkpOwogCQkJfSBlbHNlIGlmIChleHRlbnRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKIAkJCQlpdGVtX2VuZCArPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGxlYWYsCi0JCQkJCQkJCQkgZmkpOworCQkJCQkJCSBwYXRoLT5zbG90c1swXSwgZmkpOwogCQkJfQogCQkJaXRlbV9lbmQtLTsKIAkJfQpAQCAtNDAxOCw2ICs0MDk0LDEyIEBACiAJCQkJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgaXRlbV9lbmQgKyAxIC0KIAkJCQkJCQluZXdfc2l6ZSk7CiAJCQkJfQorCisJCQkJLyoKKwkJCQkgKiB1cGRhdGUgdGhlIHJhbSBieXRlcyB0byBwcm9wZXJseSByZWZsZWN0CisJCQkJICogdGhlIG5ldyBzaXplIG9mIG91ciBpdGVtCisJCQkJICovCisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBmaSwgc2l6ZSk7CiAJCQkJc2l6ZSA9CiAJCQkJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2NhbGNfaW5saW5lX3NpemUoc2l6ZSk7CiAJCQkJYnRyZnNfdHJ1bmNhdGVfaXRlbShyb290LCBwYXRoLCBzaXplLCAxKTsKQEAgLTQyMDMsNiArNDI4NSw0OSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgbWF5YmVfaW5zZXJ0X2hvbGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHU2NCBvZmZzZXQsIHU2NCBsZW4pCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJaW50IHJldDsKKworCS8qCisJICogU3RpbGwgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGlub2RlIGxvb2tzIGxpa2UgaXQncyBiZWVuIHVwZGF0ZWQgc28KKwkgKiB0aGF0IGFueSBob2xlcyBnZXQgbG9nZ2VkIGlmIHdlIGZzeW5jLgorCSAqLworCWlmIChidHJmc19mc19pbmNvbXBhdChyb290LT5mc19pbmZvLCBOT19IT0xFUykpIHsKKwkJQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMgPSByb290LT5mc19pbmZvLT5nZW5lcmF0aW9uOworCQlCVFJGU19JKGlub2RlKS0+bGFzdF9zdWJfdHJhbnMgPSByb290LT5sb2dfdHJhbnNpZDsKKwkJQlRSRlNfSShpbm9kZSktPmxhc3RfbG9nX2NvbW1pdCA9IHJvb3QtPmxhc3RfbG9nX2NvbW1pdDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAxIC0gZm9yIHRoZSBvbmUgd2UncmUgZHJvcHBpbmcKKwkgKiAxIC0gZm9yIHRoZSBvbmUgd2UncmUgYWRkaW5nCisJICogMSAtIGZvciB1cGRhdGluZyB0aGUgaW5vZGUuCisJICovCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAzKTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkKKwkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOworCisJcmV0ID0gYnRyZnNfZHJvcF9leHRlbnRzKHRyYW5zLCByb290LCBpbm9kZSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW4sIDEpOworCWlmIChyZXQpIHsKKwkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIHJldCk7CisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LCBidHJmc19pbm8oaW5vZGUpLCBvZmZzZXQsCisJCQkJICAgICAgIDAsIDAsIGxlbiwgMCwgbGVuLCAwLCAwLCAwKTsKKwlpZiAocmV0KQorCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgcmV0KTsKKwllbHNlCisJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gcHV0cyBpbiBkdW1teSBmaWxlIGV4dGVudHMgZm9yIHRoZSBhcmVhIHdlJ3JlIGNyZWF0aW5nIGEgaG9sZQogICogZm9yLiAgU28gaWYgd2UgYXJlIHRydW5jYXRpbmcgdGhpcyBmaWxlIHRvIGEgbGFyZ2VyIHNpemUgd2UgbmVlZCB0byBpbnNlcnQKQEAgLTQyMTEsNyArNDMzNiw2IEBACiAgKi8KIGludCBidHJmc19jb250X2V4cGFuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2xkc2l6ZSwgbG9mZl90IHNpemUpCiB7Ci0Jc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CiAJc3RydWN0IGV4dGVudF9tYXAgKmVtID0gTlVMTDsKQEAgLTQyNjYsMzEgKzQzOTAsMTAgQEAKIAkJCXN0cnVjdCBleHRlbnRfbWFwICpob2xlX2VtOwogCQkJaG9sZV9zaXplID0gbGFzdF9ieXRlIC0gY3VyX29mZnNldDsKIAotCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAzKTsKLQkJCWlmIChJU19FUlIodHJhbnMpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUih0cmFucyk7CisJCQllcnIgPSBtYXliZV9pbnNlcnRfaG9sZShyb290LCBpbm9kZSwgY3VyX29mZnNldCwKKwkJCQkJCWhvbGVfc2l6ZSk7CisJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwotCQkJfQotCi0JCQllcnIgPSBidHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLAotCQkJCQkJIGN1cl9vZmZzZXQsCi0JCQkJCQkgY3VyX29mZnNldCArIGhvbGVfc2l6ZSwgMSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIGVycik7Ci0JCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJZXJyID0gYnRyZnNfaW5zZXJ0X2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LAotCQkJCQlidHJmc19pbm8oaW5vZGUpLCBjdXJfb2Zmc2V0LCAwLAotCQkJCQkwLCBob2xlX3NpemUsIDAsIGhvbGVfc2l6ZSwKLQkJCQkJMCwgMCwgMCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJYnRyZnNfYWJvcnRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIGVycik7Ci0JCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJCQlicmVhazsKLQkJCX0KLQogCQkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCQljdXJfb2Zmc2V0ICsgaG9sZV9zaXplIC0gMSwgMCk7CiAJCQlob2xlX2VtID0gYWxsb2NfZXh0ZW50X21hcCgpOwpAQCAtNDMwOSw3ICs0NDEyLDcgQEAKIAkJCWhvbGVfZW0tPnJhbV9ieXRlcyA9IGhvbGVfc2l6ZTsKIAkJCWhvbGVfZW0tPmJkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKIAkJCWhvbGVfZW0tPmNvbXByZXNzX3R5cGUgPSBCVFJGU19DT01QUkVTU19OT05FOwotCQkJaG9sZV9lbS0+Z2VuZXJhdGlvbiA9IHRyYW5zLT50cmFuc2lkOworCQkJaG9sZV9lbS0+Z2VuZXJhdGlvbiA9IHJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb247CiAKIAkJCXdoaWxlICgxKSB7CiAJCQkJd3JpdGVfbG9jaygmZW1fdHJlZS0+bG9jayk7CkBAIC00MzIyLDE3ICs0NDI1LDE0IEBACiAJCQkJCQkJaG9sZV9zaXplIC0gMSwgMCk7CiAJCQl9CiAJCQlmcmVlX2V4dGVudF9tYXAoaG9sZV9lbSk7Ci1uZXh0OgotCQkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7Ci0JCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQl9CituZXh0OgogCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQllbSA9IE5VTEw7CiAJCWN1cl9vZmZzZXQgPSBsYXN0X2J5dGU7CiAJCWlmIChjdXJfb2Zmc2V0ID49IGJsb2NrX2VuZCkKIAkJCWJyZWFrOwogCX0KLQogCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJdW5sb2NrX2V4dGVudF9jYWNoZWQoaW9fdHJlZSwgaG9sZV9zdGFydCwgYmxvY2tfZW5kIC0gMSwgJmNhY2hlZF9zdGF0ZSwKIAkJCSAgICAgR0ZQX05PRlMpOwpAQCAtNDQ3NCw2ICs0NTc0LDY0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyoKKyAqIFdoaWxlIHRydW5jYXRpbmcgdGhlIGlub2RlIHBhZ2VzIGR1cmluZyBldmljdGlvbiwgd2UgZ2V0IHRoZSBWRlMgY2FsbGluZworICogYnRyZnNfaW52YWxpZGF0ZXBhZ2UoKSBhZ2FpbnN0IGVhY2ggcGFnZSBvZiB0aGUgaW5vZGUuIFRoaXMgaXMgc2xvdyBiZWNhdXNlCisgKiB0aGUgY2FsbHMgdG8gYnRyZnNfaW52YWxpZGF0ZXBhZ2UoKSByZXN1bHQgaW4gYSBodWdlIGFtb3VudCBvZiBjYWxscyB0bworICogbG9ja19leHRlbnRfYml0cygpIGFuZCBjbGVhcl9leHRlbnRfYml0KCksIHdoaWNoIGtlZXAgbWVyZ2luZyBhbmQgc3BsaXR0aW5nCisgKiBleHRlbnRfc3RhdGUgc3RydWN0dXJlcyBvdmVyIGFuZCBvdmVyLCB3YXN0aW5nIGxvdHMgb2YgdGltZS4KKyAqCisgKiBUaGVyZWZvcmUgaWYgdGhlIGlub2RlIGlzIGJlaW5nIGV2aWN0ZWQsIGxldCBidHJmc19pbnZhbGlkYXRlcGFnZSgpIHNraXAgYWxsCisgKiB0aG9zZSBleHBlbnNpdmUgb3BlcmF0aW9ucyBvbiBhIHBlciBwYWdlIGJhc2lzIGFuZCBkbyBvbmx5IHRoZSBvcmRlcmVkIGlvCisgKiBmaW5pc2hpbmcsIHdoaWxlIHdlIHJlbGVhc2UgaGVyZSB0aGUgZXh0ZW50X21hcCBhbmQgZXh0ZW50X3N0YXRlIHN0cnVjdHVyZXMsCisgKiB3aXRob3V0IHRoZSBleGNlc3NpdmUgbWVyZ2luZyBhbmQgc3BsaXR0aW5nLgorICovCitzdGF0aWMgdm9pZCBldmljdF9pbm9kZV90cnVuY2F0ZV9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICptYXBfdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlBU1NFUlQoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpOworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKworCXdyaXRlX2xvY2soJm1hcF90cmVlLT5sb2NrKTsKKwl3aGlsZSAoIVJCX0VNUFRZX1JPT1QoJm1hcF90cmVlLT5tYXApKSB7CisJCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKworCQlub2RlID0gcmJfZmlyc3QoJm1hcF90cmVlLT5tYXApOworCQllbSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwkJY2xlYXJfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CisJCWNsZWFyX2JpdChFWFRFTlRfRkxBR19MT0dHSU5HLCAmZW0tPmZsYWdzKTsKKwkJcmVtb3ZlX2V4dGVudF9tYXBwaW5nKG1hcF90cmVlLCBlbSk7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJfQorCXdyaXRlX3VubG9jaygmbWFwX3RyZWUtPmxvY2spOworCisJc3Bpbl9sb2NrKCZpb190cmVlLT5sb2NrKTsKKwl3aGlsZSAoIVJCX0VNUFRZX1JPT1QoJmlvX3RyZWUtPnN0YXRlKSkgeworCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwkJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKKworCQlub2RlID0gcmJfZmlyc3QoJmlvX3RyZWUtPnN0YXRlKTsKKwkJc3RhdGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKKwkJYXRvbWljX2luYygmc3RhdGUtPnJlZnMpOworCQlzcGluX3VubG9jaygmaW9fdHJlZS0+bG9jayk7CisKKwkJbG9ja19leHRlbnRfYml0cyhpb190cmVlLCBzdGF0ZS0+c3RhcnQsIHN0YXRlLT5lbmQsCisJCQkJIDAsICZjYWNoZWRfc3RhdGUpOworCQljbGVhcl9leHRlbnRfYml0KGlvX3RyZWUsIHN0YXRlLT5zdGFydCwgc3RhdGUtPmVuZCwKKwkJCQkgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSB8CisJCQkJIEVYVEVOVF9ERUxBTExPQyB8IEVYVEVOVF9ET19BQ0NPVU5USU5HIHwKKwkJCQkgRVhURU5UX0RFRlJBRywgMSwgMSwKKwkJCQkgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOworCQlmcmVlX2V4dGVudF9zdGF0ZShzdGF0ZSk7CisKKwkJc3Bpbl9sb2NrKCZpb190cmVlLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmlvX3RyZWUtPmxvY2spOworfQorCiB2b2lkIGJ0cmZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CkBAIC00NDg0LDcgKzQ2NDIsOCBAQAogCiAJdHJhY2VfYnRyZnNfaW5vZGVfZXZpY3QoaW5vZGUpOwogCi0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCWV2aWN0X2lub2RlX3RydW5jYXRlX3BhZ2VzKGlub2RlKTsKKwogCWlmIChpbm9kZS0+aV9ubGluayAmJgogCSAgICAoKGJ0cmZzX3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtKSAhPSAwICYmCiAJICAgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfUk9PVF9UUkVFX09CSkVDVElEKSB8fApAQCAtNDY1OSw5ICs0ODE4LDkgQEAKIAl9CiAKIAllcnIgPSAtRU5PRU5UOwotCXJldCA9IGJ0cmZzX2ZpbmRfcm9vdF9yZWYocm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoLAotCQkJCSAgQlRSRlNfSShkaXIpLT5yb290LT5yb290X2tleS5vYmplY3RpZCwKLQkJCQkgIGxvY2F0aW9uLT5vYmplY3RpZCk7CisJcmV0ID0gYnRyZnNfZmluZF9pdGVtKHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwgcGF0aCwKKwkJCQlCVFJGU19JKGRpciktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCWxvY2F0aW9uLT5vYmplY3RpZCwgQlRSRlNfUk9PVF9SRUZfS0VZLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPCAwKQogCQkJZXJyID0gcmV0OwpAQCAtNDgyMiw3ICs0OTgxLDkgQEAKIHN0YXRpYyBpbnQgYnRyZnNfaW5pdF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgYnRyZnNfaWdldF9hcmdzICphcmdzID0gcDsKLQlpbm9kZS0+aV9pbm8gPSBhcmdzLT5pbm87CisJaW5vZGUtPmlfaW5vID0gYXJncy0+bG9jYXRpb24tPm9iamVjdGlkOworCW1lbWNweSgmQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLCBhcmdzLT5sb2NhdGlvbiwKKwkgICAgICAgc2l6ZW9mKCphcmdzLT5sb2NhdGlvbikpOwogCUJUUkZTX0koaW5vZGUpLT5yb290ID0gYXJncy0+cm9vdDsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4MzAsMTkgKzQ5OTEsMTkgQEAKIHN0YXRpYyBpbnQgYnRyZnNfZmluZF9hY3RvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCiB7CiAJc3RydWN0IGJ0cmZzX2lnZXRfYXJncyAqYXJncyA9IG9wYXF1ZTsKLQlyZXR1cm4gYXJncy0+aW5vID09IGJ0cmZzX2lubyhpbm9kZSkgJiYKKwlyZXR1cm4gYXJncy0+bG9jYXRpb24tPm9iamVjdGlkID09IEJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZCAmJgogCQlhcmdzLT5yb290ID09IEJUUkZTX0koaW5vZGUpLT5yb290OwogfQogCiBzdGF0aWMgc3RydWN0IGlub2RlICpidHJmc19pZ2V0X2xvY2tlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0JCQkJICAgICAgIHU2NCBvYmplY3RpZCwKKwkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24sCiAJCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGJ0cmZzX2lnZXRfYXJncyBhcmdzOwotCXVuc2lnbmVkIGxvbmcgaGFzaHZhbCA9IGJ0cmZzX2lub2RlX2hhc2gob2JqZWN0aWQsIHJvb3QpOworCXVuc2lnbmVkIGxvbmcgaGFzaHZhbCA9IGJ0cmZzX2lub2RlX2hhc2gobG9jYXRpb24tPm9iamVjdGlkLCByb290KTsKIAotCWFyZ3MuaW5vID0gb2JqZWN0aWQ7CisJYXJncy5sb2NhdGlvbiA9IGxvY2F0aW9uOwogCWFyZ3Mucm9vdCA9IHJvb3Q7CiAKIAlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzLCBoYXNodmFsLCBidHJmc19maW5kX2FjdG9yLApAQCAtNDg1OSwxMyArNTAyMCwxMSBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQlpbm9kZSA9IGJ0cmZzX2lnZXRfbG9ja2VkKHMsIGxvY2F0aW9uLT5vYmplY3RpZCwgcm9vdCk7CisJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChzLCBsb2NhdGlvbiwgcm9vdCk7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCQlCVFJGU19JKGlub2RlKS0+cm9vdCA9IHJvb3Q7Ci0JCW1lbWNweSgmQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLCBsb2NhdGlvbiwgc2l6ZW9mKCpsb2NhdGlvbikpOwogCQlidHJmc19yZWFkX2xvY2tlZF9pbm9kZShpbm9kZSk7CiAJCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkgewogCQkJaW5vZGVfdHJlZV9hZGQoaW5vZGUpOwpAQCAtNDkyMSw3ICs1MDgwLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAogCWlmIChsb2NhdGlvbi5vYmplY3RpZCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlpZiAobG9jYXRpb24udHlwZSA9PSBCVFJGU19JTk9ERV9JVEVNX0tFWSkgewogCQlpbm9kZSA9IGJ0cmZzX2lnZXQoZGlyLT5pX3NiLCAmbG9jYXRpb24sIHJvb3QsIE5VTEwpOwpAQCAtNDk4NSwxMCArNTE0NCwxNyBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpyZXQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAotCXJldCA9IGRfc3BsaWNlX2FsaWFzKGJ0cmZzX2xvb2t1cF9kZW50cnkoZGlyLCBkZW50cnkpLCBkZW50cnkpOwotCXJldHVybiByZXQ7CisJaW5vZGUgPSBidHJmc19sb29rdXBfZGVudHJ5KGRpciwgZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVOT0VOVCkKKwkJCWlub2RlID0gTlVMTDsKKwkJZWxzZQorCQkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwl9CisKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKIHVuc2lnbmVkIGNoYXIgYnRyZnNfZmlsZXR5cGVfdGFibGVbXSA9IHsKQEAgLTUzNTgsNyArNTUyNCw2IEBACiAJdTMyIHNpemVzWzJdOwogCXVuc2lnbmVkIGxvbmcgcHRyOwogCWludCByZXQ7Ci0JaW50IG93bmVyOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCkBAIC01MzkyLDYgKzU1NTcsNyBAQAogCSAqIG51bWJlcgogCSAqLwogCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAyOworCUJUUkZTX0koaW5vZGUpLT5kaXJfaW5kZXggPSAqaW5kZXg7CiAJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OwogCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IEJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uOwpAQCAtNTQwNCwxMSArNTU3MCw2IEBACiAJICovCiAJc2V0X2JpdChCVFJGU19JTk9ERV9ORUVEU19GVUxMX1NZTkMsICZCVFJGU19JKGlub2RlKS0+cnVudGltZV9mbGFncyk7CiAKLQlpZiAoU19JU0RJUihtb2RlKSkKLQkJb3duZXIgPSAwOwotCWVsc2UKLQkJb3duZXIgPSAxOwotCiAJa2V5WzBdLm9iamVjdGlkID0gb2JqZWN0aWQ7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXlbMF0sIEJUUkZTX0lOT0RFX0lURU1fS0VZKTsKIAlrZXlbMF0ub2Zmc2V0ID0gMDsKQEAgLTU0NzMsNiArNTYzNCwxMiBAQAogCiAJYnRyZnNfdXBkYXRlX3Jvb3RfdGltZXModHJhbnMsIHJvb3QpOwogCisJcmV0ID0gYnRyZnNfaW5vZGVfaW5oZXJpdF9wcm9wcyh0cmFucywgaW5vZGUsIGRpcik7CisJaWYgKHJldCkKKwkJYnRyZnNfZXJyKHJvb3QtPmZzX2luZm8sCisJCQkgICJlcnJvciBpbmhlcml0aW5nIHByb3BzIGZvciBpbm8gJWxsdSAocm9vdCAlbGx1KTogJWQiLAorCQkJICBidHJmc19pbm8oaW5vZGUpLCByb290LT5yb290X2tleS5vYmplY3RpZCwgcmV0KTsKKwogCXJldHVybiBpbm9kZTsKIGZhaWw6CiAJaWYgKGRpcikKQEAgLTU3NDEsNiArNTkwOCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwkvKiBUaGVyZSBhcmUgc2V2ZXJhbCBkaXIgaW5kZXhlcyBmb3IgdGhpcyBpbm9kZSwgY2xlYXIgdGhlIGNhY2hlLiAqLworCUJUUkZTX0koaW5vZGUpLT5kaXJfaW5kZXggPSAwVUxMOwogCWluY19ubGluayhpbm9kZSk7CiAJaW5vZGVfaW5jX2l2ZXJzaW9uKGlub2RlKTsKIAlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTYwMDQsNyArNjE3Myw3IEBACiAJCSAgICAgICBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgaXRlbSk7CiAJfSBlbHNlIGlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgewogCQlzaXplX3Qgc2l6ZTsKLQkJc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwgaXRlbSk7CisJCXNpemUgPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGxlYWYsIHBhdGgtPnNsb3RzWzBdLCBpdGVtKTsKIAkJZXh0ZW50X2VuZCA9IEFMSUdOKGV4dGVudF9zdGFydCArIHNpemUsIHJvb3QtPnNlY3RvcnNpemUpOwogCX0KIG5leHQ6CkBAIC02MDczLDcgKzYyNDIsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihsZWFmLCBpdGVtKTsKKwkJc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwgcGF0aC0+c2xvdHNbMF0sIGl0ZW0pOwogCQlleHRlbnRfb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSkgKyBwZ19vZmZzZXQgLSBleHRlbnRfc3RhcnQ7CiAJCWNvcHlfc2l6ZSA9IG1pbl90KHU2NCwgUEFHRV9DQUNIRV9TSVpFIC0gcGdfb2Zmc2V0LAogCQkJCXNpemUgLSBleHRlbnRfb2Zmc2V0KTsKQEAgLTYzOTAsNiArNjU1OSw3IEBACiAJaW50IHNsb3Q7CiAJaW50IGZvdW5kX3R5cGU7CiAJYm9vbCBub2NvdyA9IChCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFDT1cpOworCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjQzMyw2ICs2NjAzLDEwIEBACiAJaWYgKCFub2NvdyAmJiBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRykKIAkJZ290byBvdXQ7CiAKKwlleHRlbnRfZW5kID0ga2V5Lm9mZnNldCArIGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBmaSk7CisJaWYgKGV4dGVudF9lbmQgPD0gb2Zmc2V0KQorCQlnb3RvIG91dDsKKwogCWRpc2tfYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpOwogCWlmIChkaXNrX2J5dGVuciA9PSAwKQogCQlnb3RvIG91dDsKQEAgLTY0NTAsOCArNjYyNCw2IEBACiAJCSpyYW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwgZmkpOwogCX0KIAotCWV4dGVudF9lbmQgPSBrZXkub2Zmc2V0ICsgYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKLQogCWlmIChidHJmc19leHRlbnRfcmVhZG9ubHkocm9vdCwgZGlza19ieXRlbnIpKQogCQlnb3RvIG91dDsKIAlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CkBAIC02NzgzLDE3ICs2OTU1LDE2IEBACiBzdGF0aWMgdm9pZCBidHJmc19lbmRpb19kaXJlY3RfcmVhZChzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJc3RydWN0IGJ0cmZzX2Rpb19wcml2YXRlICpkaXAgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWNfZW5kID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX3ZjbnQgLSAxOwotCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWM7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRpcC0+aW5vZGU7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKIAlzdHJ1Y3QgYmlvICpkaW9fYmlvOwogCXUzMiAqY3N1bXMgPSAodTMyICopZGlwLT5jc3VtOwotCWludCBpbmRleCA9IDA7CiAJdTY0IHN0YXJ0OworCWludCBpOwogCiAJc3RhcnQgPSBkaXAtPmxvZ2ljYWxfb2Zmc2V0OwotCWRvIHsKKwliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCWlmICghKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSkpIHsKIAkJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAkJCWNoYXIgKmthZGRyOwpAQCAtNjgwOSwxOCArNjk4MCwxNiBAQAogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJCQlmbHVzaF9kY2FjaGVfcGFnZShidmVjLT5idl9wYWdlKTsKLQkJCWlmIChjc3VtICE9IGNzdW1zW2luZGV4XSkgeworCQkJaWYgKGNzdW0gIT0gY3N1bXNbaV0pIHsKIAkJCQlidHJmc19lcnIocm9vdC0+ZnNfaW5mbywgImNzdW0gZmFpbGVkIGlubyAlbGx1IG9mZiAlbGx1IGNzdW0gJXUgZXhwZWN0ZWQgY3N1bSAldSIsCiAJCQkJCSAgYnRyZnNfaW5vKGlub2RlKSwgc3RhcnQsIGNzdW0sCi0JCQkJCSAgY3N1bXNbaW5kZXhdKTsKKwkJCQkJICBjc3Vtc1tpXSk7CiAJCQkJZXJyID0gLUVJTzsKIAkJCX0KIAkJfQogCiAJCXN0YXJ0ICs9IGJ2ZWMtPmJ2X2xlbjsKLQkJYnZlYysrOwotCQlpbmRleCsrOwotCX0gd2hpbGUgKGJ2ZWMgPD0gYnZlY19lbmQpOworCX0KIAogCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBkaXAtPmxvZ2ljYWxfb2Zmc2V0LAogCQkgICAgICBkaXAtPmxvZ2ljYWxfb2Zmc2V0ICsgZGlwLT5ieXRlcyAtIDEpOwpAQCAtNjg5OCwxMCArNzA2NywxMSBAQAogCXN0cnVjdCBidHJmc19kaW9fcHJpdmF0ZSAqZGlwID0gYmlvLT5iaV9wcml2YXRlOwogCiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGRpcmVjdCBJTyBmYWlsZWQgaW5vICVsbHUgcncgJWx1ICIKLQkJICAgICAgInNlY3RvciAlI0x4IGxlbiAldSBlcnIgbm8gJWRcbiIsCisJCWJ0cmZzX2VycihCVFJGU19JKGRpcC0+aW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJICAiZGlyZWN0IElPIGZhaWxlZCBpbm8gJWxsdSBydyAlbHUgc2VjdG9yICUjTHggbGVuICV1IGVyciBubyAlZCIsCiAJCSAgICAgIGJ0cmZzX2lubyhkaXAtPmlub2RlKSwgYmlvLT5iaV9ydywKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLCBlcnIpOworCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCSAgICAgIGJpby0+YmlfaXRlci5iaV9zaXplLCBlcnIpOwogCQlkaXAtPmVycm9ycyA9IDE7CiAKIAkJLyoKQEAgLTY5OTIsNyArNzE2Miw3IEBACiAJc3RydWN0IGJpbyAqYmlvOwogCXN0cnVjdCBiaW8gKm9yaWdfYmlvID0gZGlwLT5vcmlnX2JpbzsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IG9yaWdfYmlvLT5iaV9pb192ZWM7Ci0JdTY0IHN0YXJ0X3NlY3RvciA9IG9yaWdfYmlvLT5iaV9zZWN0b3I7CisJdTY0IHN0YXJ0X3NlY3RvciA9IG9yaWdfYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAl1NjQgZmlsZV9vZmZzZXQgPSBkaXAtPmxvZ2ljYWxfb2Zmc2V0OwogCXU2NCBzdWJtaXRfbGVuID0gMDsKIAl1NjQgbWFwX2xlbmd0aDsKQEAgLTcwMDAsNyArNzE3MCw3IEBACiAJaW50IHJldCA9IDA7CiAJaW50IGFzeW5jX3N1Ym1pdCA9IDA7CiAKLQltYXBfbGVuZ3RoID0gb3JpZ19iaW8tPmJpX3NpemU7CisJbWFwX2xlbmd0aCA9IG9yaWdfYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKHJvb3QtPmZzX2luZm8sIHJ3LCBzdGFydF9zZWN0b3IgPDwgOSwKIAkJCSAgICAgICZtYXBfbGVuZ3RoLCBOVUxMLCAwKTsKIAlpZiAocmV0KSB7CkBAIC03MDA4LDcgKzcxNzgsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAobWFwX2xlbmd0aCA+PSBvcmlnX2Jpby0+Ymlfc2l6ZSkgeworCWlmIChtYXBfbGVuZ3RoID49IG9yaWdfYmlvLT5iaV9pdGVyLmJpX3NpemUpIHsKIAkJYmlvID0gb3JpZ19iaW87CiAJCWdvdG8gc3VibWl0OwogCX0KQEAgLTcwNjAsNyArNzIzMCw3IEBACiAJCQliaW8tPmJpX3ByaXZhdGUgPSBkaXA7CiAJCQliaW8tPmJpX2VuZF9pbyA9IGJ0cmZzX2VuZF9kaW9fYmlvOwogCi0JCQltYXBfbGVuZ3RoID0gb3JpZ19iaW8tPmJpX3NpemU7CisJCQltYXBfbGVuZ3RoID0gb3JpZ19iaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAkJCXJldCA9IGJ0cmZzX21hcF9ibG9jayhyb290LT5mc19pbmZvLCBydywKIAkJCQkJICAgICAgc3RhcnRfc2VjdG9yIDw8IDksCiAJCQkJCSAgICAgICZtYXBfbGVuZ3RoLCBOVUxMLCAwKTsKQEAgLTcxMTgsNyArNzI4OCw4IEBACiAKIAlpZiAoIXNraXBfc3VtICYmICF3cml0ZSkgewogCQljc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7Ci0JCXN1bV9sZW4gPSBkaW9fYmlvLT5iaV9zaXplID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlzdW1fbGVuID0gZGlvX2Jpby0+YmlfaXRlci5iaV9zaXplID4+CisJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKIAkJc3VtX2xlbiAqPSBjc3VtX3NpemU7CiAJfSBlbHNlIHsKIAkJc3VtX2xlbiA9IDA7CkBAIC03MTMzLDggKzczMDQsOCBAQAogCWRpcC0+cHJpdmF0ZSA9IGRpb19iaW8tPmJpX3ByaXZhdGU7CiAJZGlwLT5pbm9kZSA9IGlub2RlOwogCWRpcC0+bG9naWNhbF9vZmZzZXQgPSBmaWxlX29mZnNldDsKLQlkaXAtPmJ5dGVzID0gZGlvX2Jpby0+Ymlfc2l6ZTsKLQlkaXAtPmRpc2tfYnl0ZW5yID0gKHU2NClkaW9fYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwlkaXAtPmJ5dGVzID0gZGlvX2Jpby0+YmlfaXRlci5iaV9zaXplOworCWRpcC0+ZGlza19ieXRlbnIgPSAodTY0KWRpb19iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDw8IDk7CiAJaW9fYmlvLT5iaV9wcml2YXRlID0gZGlwOwogCWRpcC0+ZXJyb3JzID0gMDsKIAlkaXAtPm9yaWdfYmlvID0gaW9fYmlvOwpAQCAtNzM3MSw2ICs3NTQyLDcgQEAKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpjYWNoZWRfc3RhdGUgPSBOVUxMOwogCXU2NCBwYWdlX3N0YXJ0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAJdTY0IHBhZ2VfZW5kID0gcGFnZV9zdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJaW50IGlub2RlX2V2aWN0aW5nID0gaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkc7CiAKIAkvKgogCSAqIHdlIGhhdmUgdGhlIHBhZ2UgbG9ja2VkLCBzbyBuZXcgd3JpdGViYWNrIGNhbid0IHN0YXJ0LApAQCAtNzM4NiwxNyArNzU1OCwyMSBAQAogCQlidHJmc19yZWxlYXNlcGFnZShwYWdlLCBHRlBfTk9GUyk7CiAJCXJldHVybjsKIAl9Ci0JbG9ja19leHRlbnRfYml0cyh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgMCwgJmNhY2hlZF9zdGF0ZSk7Ci0Jb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgcGFnZV9vZmZzZXQocGFnZSkpOworCisJaWYgKCFpbm9kZV9ldmljdGluZykKKwkJbG9ja19leHRlbnRfYml0cyh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgMCwgJmNhY2hlZF9zdGF0ZSk7CisJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgcGFnZV9zdGFydCk7CiAJaWYgKG9yZGVyZWQpIHsKIAkJLyoKIAkJICogSU8gb24gdGhpcyBwYWdlIHdpbGwgbmV2ZXIgYmUgc3RhcnRlZCwgc28gd2UgbmVlZAogCQkgKiB0byBhY2NvdW50IGZvciBhbnkgb3JkZXJlZCBleHRlbnRzIG5vdwogCQkgKi8KLQkJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKLQkJCQkgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKLQkJCQkgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ET19BQ0NPVU5USU5HIHwKLQkJCQkgRVhURU5UX0RFRlJBRywgMSwgMCwgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOworCQlpZiAoIWlub2RlX2V2aWN0aW5nKQorCQkJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKKwkJCQkJIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8CisJCQkJCSBFWFRFTlRfTE9DS0VEIHwgRVhURU5UX0RPX0FDQ09VTlRJTkcgfAorCQkJCQkgRVhURU5UX0RFRlJBRywgMSwgMCwgJmNhY2hlZF9zdGF0ZSwKKwkJCQkJIEdGUF9OT0ZTKTsKIAkJLyoKIAkJICogd2hvZXZlciBjbGVhcmVkIHRoZSBwcml2YXRlIGJpdCBpcyByZXNwb25zaWJsZQogCQkgKiBmb3IgdGhlIGZpbmlzaF9vcmRlcmVkX2lvCkBAIC03NDIwLDE0ICs3NTk2LDIyIEBACiAJCQkJYnRyZnNfZmluaXNoX29yZGVyZWRfaW8ob3JkZXJlZCk7CiAJCX0KIAkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOwotCQljYWNoZWRfc3RhdGUgPSBOVUxMOwotCQlsb2NrX2V4dGVudF9iaXRzKHRyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCAwLCAmY2FjaGVkX3N0YXRlKTsKKwkJaWYgKCFpbm9kZV9ldmljdGluZykgeworCQkJY2FjaGVkX3N0YXRlID0gTlVMTDsKKwkJCWxvY2tfZXh0ZW50X2JpdHModHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIDAsCisJCQkJCSAmY2FjaGVkX3N0YXRlKTsKKwkJfQogCX0KLQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLAotCQkgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8Ci0JCSBFWFRFTlRfRE9fQUNDT1VOVElORyB8IEVYVEVOVF9ERUZSQUcsIDEsIDEsCi0JCSAmY2FjaGVkX3N0YXRlLCBHRlBfTk9GUyk7Ci0JX19idHJmc19yZWxlYXNlcGFnZShwYWdlLCBHRlBfTk9GUyk7CisKKwlpZiAoIWlub2RlX2V2aWN0aW5nKSB7CisJCWNsZWFyX2V4dGVudF9iaXQodHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCisJCQkJIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFkgfAorCQkJCSBFWFRFTlRfREVMQUxMT0MgfCBFWFRFTlRfRE9fQUNDT1VOVElORyB8CisJCQkJIEVYVEVOVF9ERUZSQUcsIDEsIDEsCisJCQkJICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKKworCQlfX2J0cmZzX3JlbGVhc2VwYWdlKHBhZ2UsIEdGUF9OT0ZTKTsKKwl9CiAKIAlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkgewpAQCAtNzczNyw3ICs3OTIxLDkgQEAKICAqIGNyZWF0ZSBhIG5ldyBzdWJ2b2x1bWUgZGlyZWN0b3J5L2lub2RlIChoZWxwZXIgZm9yIHRoZSBpb2N0bCkuCiAgKi8KIGludCBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwgdTY0IG5ld19kaXJpZCkKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcGFyZW50X3Jvb3QsCisJCQkgICAgIHU2NCBuZXdfZGlyaWQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOwpAQCAtNzc1NSw2ICs3OTQxLDEyIEBACiAJc2V0X25saW5rKGlub2RlLCAxKTsKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOwogCisJZXJyID0gYnRyZnNfc3Vidm9sX2luaGVyaXRfcHJvcHModHJhbnMsIG5ld19yb290LCBwYXJlbnRfcm9vdCk7CisJaWYgKGVycikKKwkJYnRyZnNfZXJyKG5ld19yb290LT5mc19pbmZvLAorCQkJICAiZXJyb3IgaW5oZXJpdGluZyBzdWJ2b2x1bWUgJWxsdSBwcm9wZXJ0aWVzOiAlZFxuIiwKKwkJCSAgbmV3X3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLCBlcnIpOworCiAJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCBuZXdfcm9vdCwgaW5vZGUpOwogCiAJaXB1dChpbm9kZSk7CkBAIC03NzgwLDYgKzc5NzIsNyBAQAogCWVpLT5mbGFncyA9IDA7CiAJZWktPmNzdW1fYnl0ZXMgPSAwOwogCWVpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCWVpLT5kaXJfaW5kZXggPSAwOwogCWVpLT5sYXN0X3VubGlua190cmFucyA9IDA7CiAJZWktPmxhc3RfbG9nX2NvbW1pdCA9IDA7CiAKQEAgLTgwNjcsNiArODI2MCw3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfZmFpbDsKIAorCUJUUkZTX0kob2xkX2lub2RlKS0+ZGlyX2luZGV4ID0gMFVMTDsKIAlpZiAodW5saWtlbHkob2xkX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSkgewogCQkvKiBmb3JjZSBmdWxsIGxvZyBjb21taXQgaWYgc3Vidm9sdW1lIGludm9sdmVkLiAqLwogCQlyb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2xvZ19mdWxsX2NvbW1pdCA9IHRyYW5zLT50cmFuc2lkOwpAQCAtODE1NSw2ICs4MzQ5LDkgQEAKIAkJZ290byBvdXRfZmFpbDsKIAl9CiAKKwlpZiAob2xkX2lub2RlLT5pX25saW5rID09IDEpCisJCUJUUkZTX0kob2xkX2lub2RlKS0+ZGlyX2luZGV4ID0gaW5kZXg7CisKIAlpZiAob2xkX2lubyAhPSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSB7CiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IG5ld19kZW50cnktPmRfcGFyZW50OwogCQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIG9sZF9pbm9kZSwgb2xkX2RpciwgcGFyZW50KTsKQEAgLTgyOTAsNyArODQ4Nyw3IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChyb290LT5mc19pbmZvLT5zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwlpZiAodGVzdF9iaXQoQlRSRlNfRlNfU1RBVEVfRVJST1IsICZyb290LT5mc19pbmZvLT5mc19zdGF0ZSkpCiAJCXJldHVybiAtRVJPRlM7CiAKIAlyZXQgPSBfX3N0YXJ0X2RlbGFsbG9jX2lub2Rlcyhyb290LCBkZWxheV9pcHV0KTsKQEAgLTgzMTYsNyArODUxMyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBzcGxpY2U7CiAJaW50IHJldDsKIAotCWlmIChmc19pbmZvLT5zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwlpZiAodGVzdF9iaXQoQlRSRlNfRlNfU1RBVEVfRVJST1IsICZmc19pbmZvLT5mc19zdGF0ZSkpCiAJCXJldHVybiAtRVJPRlM7CiAKIAlJTklUX0xJU1RfSEVBRCgmc3BsaWNlKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IGFkMjdkY2UuLjM4M2FiNDUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtNTYsNiArNTYsOCBAQAogI2luY2x1ZGUgInJjdS1zdHJpbmcuaCIKICNpbmNsdWRlICJzZW5kLmgiCiAjaW5jbHVkZSAiZGV2LXJlcGxhY2UuaCIKKyNpbmNsdWRlICJwcm9wcy5oIgorI2luY2x1ZGUgInN5c2ZzLmgiCiAKIHN0YXRpYyBpbnQgYnRyZnNfY2xvbmUoc3RydWN0IGlub2RlICpzcmMsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgICB1NjQgb2ZmLCB1NjQgb2xlbiwgdTY0IG9sZW5fYWxpZ25lZCwgdTY0IGRlc3RvZmYpOwpAQCAtMTkwLDYgKzE5Miw5IEBACiAJdW5zaWduZWQgaW50IGlfb2xkZmxhZ3M7CiAJdW1vZGVfdCBtb2RlOwogCisJaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCWlmIChidHJmc19yb290X3JlYWRvbmx5KHJvb3QpKQogCQlyZXR1cm4gLUVST0ZTOwogCkBAIC0yMDAsOSArMjA1LDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KIAlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0yODAsOSArMjgyLDI1IEBACiAJaWYgKGZsYWdzICYgRlNfTk9DT01QX0ZMKSB7CiAJCWlwLT5mbGFncyAmPSB+QlRSRlNfSU5PREVfQ09NUFJFU1M7CiAJCWlwLT5mbGFncyB8PSBCVFJGU19JTk9ERV9OT0NPTVBSRVNTOworCisJCXJldCA9IGJ0cmZzX3NldF9wcm9wKGlub2RlLCAiYnRyZnMuY29tcHJlc3Npb24iLCBOVUxMLCAwLCAwKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RBVEEpCisJCQlnb3RvIG91dF9kcm9wOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBGU19DT01QUl9GTCkgeworCQljb25zdCBjaGFyICpjb21wOworCiAJCWlwLT5mbGFncyB8PSBCVFJGU19JTk9ERV9DT01QUkVTUzsKIAkJaXAtPmZsYWdzICY9IH5CVFJGU19JTk9ERV9OT0NPTVBSRVNTOworCisJCWlmIChyb290LT5mc19pbmZvLT5jb21wcmVzc190eXBlID09IEJUUkZTX0NPTVBSRVNTX0xaTykKKwkJCWNvbXAgPSAibHpvIjsKKwkJZWxzZQorCQkJY29tcCA9ICJ6bGliIjsKKwkJcmV0ID0gYnRyZnNfc2V0X3Byb3AoaW5vZGUsICJidHJmcy5jb21wcmVzc2lvbiIsCisJCQkJICAgICBjb21wLCBzdHJsZW4oY29tcCksIDApOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZHJvcDsKKwogCX0gZWxzZSB7CiAJCWlwLT5mbGFncyAmPSB+KEJUUkZTX0lOT0RFX0NPTVBSRVNTIHwgQlRSRlNfSU5PREVfTk9DT01QUkVTUyk7CiAJfQpAQCAtMzkyLDYgKzQxMCw3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290OwogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgYmxvY2tfcnN2OwogCXN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZSA9IENVUlJFTlRfVElNRTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCByZXQ7CiAJaW50IGVycjsKIAl1NjQgb2JqZWN0aWQ7CkBAIC00MTcsNyArNDM2LDkgQEAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCXJldCA9IFBUUl9FUlIodHJhbnMpOwotCQlnb3RvIG91dDsKKwkJYnRyZnNfc3Vidm9sdW1lX3JlbGVhc2VfbWV0YWRhdGEocm9vdCwgJmJsb2NrX3JzdiwKKwkJCQkJCSBxZ3JvdXBfcmVzZXJ2ZWQpOworCQlyZXR1cm4gcmV0OwogCX0KIAl0cmFucy0+YmxvY2tfcnN2ID0gJmJsb2NrX3JzdjsKIAl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQgPSBibG9ja19yc3Yuc2l6ZTsKQEAgLTUwMCw3ICs1MjEsNyBAQAogCiAJYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnModHJhbnMsIG5ld19yb290KTsKIAotCXJldCA9IGJ0cmZzX2NyZWF0ZV9zdWJ2b2xfcm9vdCh0cmFucywgbmV3X3Jvb3QsIG5ld19kaXJpZCk7CisJcmV0ID0gYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHRyYW5zLCBuZXdfcm9vdCwgcm9vdCwgbmV3X2RpcmlkKTsKIAlpZiAocmV0KSB7CiAJCS8qIFdlIHBvdGVudGlhbGx5IGxvc2UgYW4gdW51c2VkIGlub2RlIGl0ZW0gaGVyZSAqLwogCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgcmV0KTsKQEAgLTU0Miw2ICs1NjMsOCBAQAogZmFpbDoKIAl0cmFucy0+YmxvY2tfcnN2ID0gTlVMTDsKIAl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQgPSAwOworCWJ0cmZzX3N1YnZvbHVtZV9yZWxlYXNlX21ldGFkYXRhKHJvb3QsICZibG9ja19yc3YsIHFncm91cF9yZXNlcnZlZCk7CisKIAlpZiAoYXN5bmNfdHJhbnNpZCkgewogCQkqYXN5bmNfdHJhbnNpZCA9IHRyYW5zLT50cmFuc2lkOwogCQllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb25fYXN5bmModHJhbnMsIHJvb3QsIDEpOwpAQCAtNTUzLDEwICs1NzYsMTIgQEAKIAlpZiAoZXJyICYmICFyZXQpCiAJCXJldCA9IGVycjsKIAotCWlmICghcmV0KQotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgYnRyZnNfbG9va3VwX2RlbnRyeShkaXIsIGRlbnRyeSkpOwotb3V0OgotCWJ0cmZzX3N1YnZvbHVtZV9yZWxlYXNlX21ldGFkYXRhKHJvb3QsICZibG9ja19yc3YsIHFncm91cF9yZXNlcnZlZCk7CisJaWYgKCFyZXQpIHsKKwkJaW5vZGUgPSBidHJmc19sb29rdXBfZGVudHJ5KGRpciwgZGVudHJ5KTsKKwkJaWYgKElTX0VSUihpbm9kZSkpCisJCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0Miw3ICs2NjcsNyBAQAogCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBmYWlsOwogCX0KLQlCVUdfT04oIWlub2RlKTsKKwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJcmV0ID0gMDsKIGZhaWw6CkBAIC0xMDExLDcgKzEwMzYsNyBAQAogc3RhdGljIGludCBjbHVzdGVyX3BhZ2VzX2Zvcl9kZWZyYWcoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBzdGFydF9pbmRleCwKLQkJCQkgICAgaW50IG51bV9wYWdlcykKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBmaWxlX2VuZDsKIAl1NjQgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CkBAIC0xMTY5LDggKzExOTQsOCBAQAogCWludCBkZWZyYWdfY291bnQgPSAwOwogCWludCBjb21wcmVzc190eXBlID0gQlRSRlNfQ09NUFJFU1NfWkxJQjsKIAlpbnQgZXh0ZW50X3RocmVzaCA9IHJhbmdlLT5leHRlbnRfdGhyZXNoOwotCWludCBtYXhfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCWludCBjbHVzdGVyID0gbWF4X2NsdXN0ZXI7CisJdW5zaWduZWQgbG9uZyBtYXhfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgY2x1c3RlciA9IG1heF9jbHVzdGVyOwogCXU2NCBuZXdfYWxpZ24gPSB+KCh1NjQpMTI4ICogMTAyNCAtIDEpOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwogCkBAIC0xMjU0LDcgKzEyNzksNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKGJ0cmZzX2RlZnJhZ19jYW5jZWxsZWQocm9vdC0+ZnNfaW5mbykpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJidHJmczogZGVmcmFnX2ZpbGUgY2FuY2VsbGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJCVFJGUzogZGVmcmFnX2ZpbGUgY2FuY2VsbGVkXG4iKTsKIAkJCXJldCA9IC1FQUdBSU47CiAJCQlicmVhazsKIAkJfQpAQCAtMTQxNiwyMCArMTQ0MSwyMCBAQAogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHJlc2l6aW5nIGRldmlkICVsbHVcbiIsIGRldmlkKTsKKwkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAicmVzaXppbmcgZGV2aWQgJWxsdSIsIGRldmlkKTsKIAl9CiAKIAlkZXZpY2UgPSBidHJmc19maW5kX2RldmljZShyb290LT5mc19pbmZvLCBkZXZpZCwgTlVMTCwgTlVMTCk7CiAJaWYgKCFkZXZpY2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHJlc2l6ZXIgdW5hYmxlIHRvIGZpbmQgZGV2aWNlICVsbHVcbiIsCisJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywgInJlc2l6ZXIgdW5hYmxlIHRvIGZpbmQgZGV2aWNlICVsbHUiLAogCQkgICAgICAgZGV2aWQpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCWlmICghZGV2aWNlLT53cml0ZWFibGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHJlc2l6ZXIgdW5hYmxlIHRvIGFwcGx5IG9uICIKLQkJICAgICAgICJyZWFkb25seSBkZXZpY2UgJWxsdVxuIiwKKwkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLAorCQkJICAgInJlc2l6ZXIgdW5hYmxlIHRvIGFwcGx5IG9uIHJlYWRvbmx5IGRldmljZSAlbGx1IiwKIAkJICAgICAgIGRldmlkKTsKIAkJcmV0ID0gLUVQRVJNOwogCQlnb3RvIG91dF9mcmVlOwpAQCAtMTQ2Niw2ICsxNDkxLDEwIEBACiAJCX0KIAkJbmV3X3NpemUgPSBvbGRfc2l6ZSAtIG5ld19zaXplOwogCX0gZWxzZSBpZiAobW9kID4gMCkgeworCQlpZiAobmV3X3NpemUgPiBVTExPTkdfTUFYIC0gb2xkX3NpemUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CiAJCW5ld19zaXplID0gb2xkX3NpemUgKyBuZXdfc2l6ZTsKIAl9CiAKQEAgLTE0ODEsNyArMTUxMCw3IEBACiAJZG9fZGl2KG5ld19zaXplLCByb290LT5zZWN0b3JzaXplKTsKIAluZXdfc2l6ZSAqPSByb290LT5zZWN0b3JzaXplOwogCi0JcHJpbnRrX2luX3JjdShLRVJOX0lORk8gImJ0cmZzOiBuZXcgc2l6ZSBmb3IgJXMgaXMgJWxsdVxuIiwKKwlwcmludGtfaW5fcmN1KEtFUk5fSU5GTyAiQlRSRlM6IG5ldyBzaXplIGZvciAlcyBpcyAlbGx1XG4iLAogCQkgICAgICByY3Vfc3RyX2RlcmVmKGRldmljZS0+bmFtZSksIG5ld19zaXplKTsKIAogCWlmIChuZXdfc2l6ZSA+IG9sZF9zaXplKSB7CkBAIC0xNTQyLDkgKzE1NzEsMTUgQEAKIAogCQlzcmNfaW5vZGUgPSBmaWxlX2lub2RlKHNyYy5maWxlKTsKIAkJaWYgKHNyY19pbm9kZS0+aV9zYiAhPSBmaWxlX2lub2RlKGZpbGUpLT5pX3NiKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogU25hcHNob3Qgc3JjIGZyb20gIgotCQkJICAgICAgICJhbm90aGVyIEZTXG4iKTsKKwkJCWJ0cmZzX2luZm8oQlRSRlNfSShzcmNfaW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJCSAgICJTbmFwc2hvdCBzcmMgZnJvbSBhbm90aGVyIEZTIik7CiAJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKHNyY19pbm9kZSkpIHsKKwkJCS8qCisJCQkgKiBTdWJ2b2x1bWUgY3JlYXRpb24gaXMgbm90IHJlc3RyaWN0ZWQsIGJ1dCBzbmFwc2hvdHMKKwkJCSAqIGFyZSBsaW1pdGVkIHRvIG93biBzdWJ2b2x1bWVzIG9ubHkKKwkJCSAqLworCQkJcmV0ID0gLUVQRVJNOwogCQl9IGVsc2UgewogCQkJcmV0ID0gYnRyZnNfbWtzdWJ2b2woJmZpbGUtPmZfcGF0aCwgbmFtZSwgbmFtZWxlbiwKIAkJCQkJICAgICBCVFJGU19JKHNyY19pbm9kZSktPnJvb3QsCkBAIC0xNjYyLDYgKzE2OTcsOSBAQAogCXU2NCBmbGFnczsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKIAlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtMTY4NiwxMSArMTcyNCw2IEBACiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CiAJfQogCi0JaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkgewotCQlyZXQgPSAtRUFDQ0VTOwotCQlnb3RvIG91dF9kcm9wX3dyaXRlOwotCX0KLQogCWRvd25fd3JpdGUoJnJvb3QtPmZzX2luZm8tPnN1YnZvbF9zZW0pOwogCiAJLyogbm90aGluZyB0byBkbyAqLwpAQCAtMTY5OCwxMiArMTczMSwyOCBAQAogCQlnb3RvIG91dF9kcm9wX3NlbTsKIAogCXJvb3RfZmxhZ3MgPSBidHJmc19yb290X2ZsYWdzKCZyb290LT5yb290X2l0ZW0pOwotCWlmIChmbGFncyAmIEJUUkZTX1NVQlZPTF9SRE9OTFkpCisJaWYgKGZsYWdzICYgQlRSRlNfU1VCVk9MX1JET05MWSkgewogCQlidHJmc19zZXRfcm9vdF9mbGFncygmcm9vdC0+cm9vdF9pdGVtLAogCQkJCSAgICAgcm9vdF9mbGFncyB8IEJUUkZTX1JPT1RfU1VCVk9MX1JET05MWSk7Ci0JZWxzZQotCQlidHJmc19zZXRfcm9vdF9mbGFncygmcm9vdC0+cm9vdF9pdGVtLAorCX0gZWxzZSB7CisJCS8qCisJCSAqIEJsb2NrIFJPIC0+IFJXIHRyYW5zaXRpb24gaWYgdGhpcyBzdWJ2b2x1bWUgaXMgaW52b2x2ZWQgaW4KKwkJICogc2VuZAorCQkgKi8KKwkJc3Bpbl9sb2NrKCZyb290LT5yb290X2l0ZW1fbG9jayk7CisJCWlmIChyb290LT5zZW5kX2luX3Byb2dyZXNzID09IDApIHsKKwkJCWJ0cmZzX3NldF9yb290X2ZsYWdzKCZyb290LT5yb290X2l0ZW0sCiAJCQkJICAgICByb290X2ZsYWdzICYgfkJUUkZTX1JPT1RfU1VCVk9MX1JET05MWSk7CisJCQlzcGluX3VubG9jaygmcm9vdC0+cm9vdF9pdGVtX2xvY2spOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJnJvb3QtPnJvb3RfaXRlbV9sb2NrKTsKKwkJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSJBdHRlbXB0IHRvIHNldCBzdWJ2b2x1bWUgJWxsdSByZWFkLXdyaXRlIGR1cmluZyBzZW5kIiwKKwkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXRfZHJvcF9zZW07CisJCX0KKwl9CiAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CkBAIC0xOTEwLDcgKzE5NTksNyBAQAogCQlrZXkub2Zmc2V0ID0gKHU2NCktMTsKIAkJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGluZm8sICZrZXkpOwogCQlpZiAoSVNfRVJSKHJvb3QpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBmaW5kIHJvb3QgJWxsdVxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IGNvdWxkIG5vdCBmaW5kIHJvb3QgJWxsdVxuIiwKIAkJCSAgICAgICBzay0+dHJlZV9pZCk7CiAJCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTIwMDAsNyArMjA0OSw3IEBACiAJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGluZm8sICZrZXkpOwogCWlmIChJU19FUlIocm9vdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgZmluZCByb290ICVsbHVcbiIsIHRyZWVfaWQpOworCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBjb3VsZCBub3QgZmluZCByb290ICVsbHVcbiIsIHRyZWVfaWQpOwogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yODM4LDEyICsyODg3LDE0IEBACiAJCSAqIG5vdGUgdGhlIGtleSB3aWxsIGNoYW5nZSB0eXBlIGFzIHdlIHdhbGsgdGhyb3VnaCB0aGUKIAkJICogdHJlZS4KIAkJICovCisJCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgQlRSRlNfSShzcmMpLT5yb290LCAma2V5LCBwYXRoLAogCQkJCTAsIDApOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCiAJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSk7Citwcm9jZXNzX3Nsb3Q6CiAJCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zKSB7CiAJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYoQlRSRlNfSShzcmMpLT5yb290LCBwYXRoKTsKIAkJCWlmIChyZXQgPCAwKQpAQCAtMjg3MCwxMSArMjkyMSw2IEBACiAJCQl1OCBjb21wOwogCQkJdTY0IGVuZG9mZjsKIAotCQkJc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KTsKLQkJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBidWYsCi0JCQkJCSAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBzbG90KSwKLQkJCQkJICAgc2l6ZSk7Ci0KIAkJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsCiAJCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CiAJCQljb21wID0gYnRyZnNfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgZXh0ZW50KTsKQEAgLTI4OTMsMTEgKzI5MzksMjAgQEAKIAkJCQlkYXRhbCA9IGJ0cmZzX2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLAogCQkJCQkJCQkgICAgZXh0ZW50KTsKIAkJCX0KLQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKIAogCQkJaWYgKGtleS5vZmZzZXQgKyBkYXRhbCA8PSBvZmYgfHwKLQkJCSAgICBrZXkub2Zmc2V0ID49IG9mZiArIGxlbiAtIDEpCi0JCQkJZ290byBuZXh0OworCQkJICAgIGtleS5vZmZzZXQgPj0gb2ZmICsgbGVuIC0gMSkgeworCQkJCXBhdGgtPnNsb3RzWzBdKys7CisJCQkJZ290byBwcm9jZXNzX3Nsb3Q7CisJCQl9CisKKwkJCXNpemUgPSBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgc2xvdCk7CisJCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgYnVmLAorCQkJCQkgICBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgc2xvdCksCisJCQkJCSAgIHNpemUpOworCisJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJCQlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDA7CiAKIAkJCW1lbWNweSgmbmV3X2tleSwgJmtleSwgc2l6ZW9mKG5ld19rZXkpKTsKIAkJCW5ld19rZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOwpAQCAtMzA2OCw3ICszMTIzLDYgQEAKIAkJCX0KIAkJCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCX0KLW5leHQ6CiAJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKIAkJa2V5Lm9mZnNldCsrOwogCX0KQEAgLTMxOTYsOSArMzI1MCwxNyBAQAogCiAJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShzcmMpLT5pb190cmVlLCBvZmYsIG9mZiArIGxlbiAtIDEpOwogb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnNyYy0+aV9tdXRleCk7Ci0JaWYgKCFzYW1lX2lub2RlKQotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlpZiAoIXNhbWVfaW5vZGUpIHsKKwkJaWYgKGlub2RlIDwgc3JjKSB7CisJCQltdXRleF91bmxvY2soJnNyYy0+aV9tdXRleCk7CisJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZzcmMtPmlfbXV0ZXgpOworCQl9CisJfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZzcmMtPmlfbXV0ZXgpOworCX0KIG91dF9mcHV0OgogCWZkcHV0KHNyY19maWxlKTsKIG91dF9kcm9wX3dyaXRlOgpAQCAtMzMyMSw4ICszMzgzLDggQEAKIAlpZiAoSVNfRVJSX09SX05VTEwoZGkpKSB7CiAJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbW0sIHlvdSBkb24ndCBoYXZlIHRoZSBkZWZhdWx0IGRpciBpdGVtLCAiCi0JCSAgICAgICAidGhpcyBpc24ndCBnb2luZyB0byB3b3JrXG4iKTsKKwkJYnRyZnNfZXJyKG5ld19yb290LT5mc19pbmZvLCAiVW1tLCB5b3UgZG9uJ3QgaGF2ZSB0aGUgZGVmYXVsdCBkaXIiCisJCQkgICAiaXRlbSwgdGhpcyBpc24ndCBnb2luZyB0byB3b3JrIik7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTM0NzUsNiArMzUzNywyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBsb25nIGJ0cmZzX2lvY3RsX2dsb2JhbF9yc3Yoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdTY0IHJlc2VydmVkOworCisJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOworCXJlc2VydmVkID0gYmxvY2tfcnN2LT5yZXNlcnZlZDsKKwlzcGluX3VubG9jaygmYmxvY2tfcnN2LT5sb2NrKTsKKworCWlmIChhcmcgJiYgY29weV90b191c2VyKGFyZywgJnJlc2VydmVkLCBzaXplb2YocmVzZXJ2ZWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiB0aGVyZSBhcmUgbWFueSB3YXlzIHRoZSB0cmFuc19zdGFydCBhbmQgdHJhbnNfZW5kIGlvY3RscyBjYW4gbGVhZAogICogdG8gZGVhZGxvY2tzLiAgVGhleSBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0CkBAIC00MzAzLDYgKzQzNzksOSBAQAogCWludCByZXQgPSAwOwogCWludCByZWNlaXZlZF91dWlkX2NoYW5nZWQ7CiAKKwlpZiAoIWlub2RlX293bmVyX29yX2NhcGFibGUoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCiAJcmV0ID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTQzMTksMTEgKzQzOTgsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoIWlub2RlX293bmVyX29yX2NhcGFibGUoaW5vZGUpKSB7Ci0JCXJldCA9IC1FQUNDRVM7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXNhID0gbWVtZHVwX3VzZXIoYXJnLCBzaXplb2YoKnNhKSk7CiAJaWYgKElTX0VSUihzYSkpIHsKIAkJcmV0ID0gUFRSX0VSUihzYSk7CkBAIC00NDA5LDggKzQ0ODMsOCBAQAogCWxlbiA9IHN0cm5sZW4obGFiZWwsIEJUUkZTX0xBQkVMX1NJWkUpOwogCiAJaWYgKGxlbiA9PSBCVFJGU19MQUJFTF9TSVpFKSB7Ci0JCXByX3dhcm4oImJ0cmZzOiBsYWJlbCBpcyB0b28gbG9uZywgcmV0dXJuIHRoZSBmaXJzdCAlenUgYnl0ZXNcbiIsCi0JCQktLWxlbik7CisJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSJsYWJlbCBpcyB0b28gbG9uZywgcmV0dXJuIHRoZSBmaXJzdCAlenUgYnl0ZXMiLCAtLWxlbik7CiAJfQogCiAJcmV0ID0gY29weV90b191c2VyKGFyZywgbGFiZWwsIGxlbik7CkBAIC00NDMzLDcgKzQ1MDcsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChzdHJubGVuKGxhYmVsLCBCVFJGU19MQUJFTF9TSVpFKSA9PSBCVFJGU19MQUJFTF9TSVpFKSB7Ci0JCXByX2VycigiYnRyZnM6IHVuYWJsZSB0byBzZXQgbGFiZWwgd2l0aCBtb3JlIHRoYW4gJWQgYnl0ZXNcbiIsCisJCWJ0cmZzX2Vycihyb290LT5mc19pbmZvLCAidW5hYmxlIHRvIHNldCBsYWJlbCB3aXRoIG1vcmUgdGhhbiAlZCBieXRlcyIsCiAJCSAgICAgICBCVFJGU19MQUJFTF9TSVpFIC0gMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ0NTEsMTMgKzQ1MjUsMTczIEBACiAJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5zdXBlcl9sb2NrKTsKIAlzdHJjcHkoc3VwZXJfYmxvY2stPmxhYmVsLCBsYWJlbCk7CiAJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnN1cGVyX2xvY2spOwotCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAogb3V0X3VubG9jazoKIAltbnRfZHJvcF93cml0ZV9maWxlKGZpbGUpOwogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgSU5JVF9GRUFUVVJFX0ZMQUdTKHN1ZmZpeCkgXAorCXsgLmNvbXBhdF9mbGFncyA9IEJUUkZTX0ZFQVRVUkVfQ09NUEFUXyMjc3VmZml4LCBcCisJICAuY29tcGF0X3JvX2ZsYWdzID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fIyNzdWZmaXgsIFwKKwkgIC5pbmNvbXBhdF9mbGFncyA9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfIyNzdWZmaXggfQorCitzdGF0aWMgaW50IGJ0cmZzX2lvY3RsX2dldF9zdXBwb3J0ZWRfZmVhdHVyZXMoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgICAgIHZvaWQgX191c2VyICphcmcpCit7CisJc3RhdGljIHN0cnVjdCBidHJmc19pb2N0bF9mZWF0dXJlX2ZsYWdzIGZlYXR1cmVzWzNdID0geworCQlJTklUX0ZFQVRVUkVfRkxBR1MoU1VQUCksCisJCUlOSVRfRkVBVFVSRV9GTEFHUyhTQUZFX1NFVCksCisJCUlOSVRfRkVBVFVSRV9GTEFHUyhTQUZFX0NMRUFSKQorCX07CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmZlYXR1cmVzLCBzaXplb2YoZmVhdHVyZXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJmc19pb2N0bF9nZXRfZmVhdHVyZXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGZpbGVfaW5vZGUoZmlsZSkpLT5yb290OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfYmxvY2sgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN0cnVjdCBidHJmc19pb2N0bF9mZWF0dXJlX2ZsYWdzIGZlYXR1cmVzOworCisJZmVhdHVyZXMuY29tcGF0X2ZsYWdzID0gYnRyZnNfc3VwZXJfY29tcGF0X2ZsYWdzKHN1cGVyX2Jsb2NrKTsKKwlmZWF0dXJlcy5jb21wYXRfcm9fZmxhZ3MgPSBidHJmc19zdXBlcl9jb21wYXRfcm9fZmxhZ3Moc3VwZXJfYmxvY2spOworCWZlYXR1cmVzLmluY29tcGF0X2ZsYWdzID0gYnRyZnNfc3VwZXJfaW5jb21wYXRfZmxhZ3Moc3VwZXJfYmxvY2spOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmZWF0dXJlcywgc2l6ZW9mKGZlYXR1cmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZmVhdHVyZV9iaXRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgZW51bSBidHJmc19mZWF0dXJlX3NldCBzZXQsCisJCQkgICAgICB1NjQgY2hhbmdlX21hc2ssIHU2NCBmbGFncywgdTY0IHN1cHBvcnRlZF9mbGFncywKKwkJCSAgICAgIHU2NCBzYWZlX3NldCwgdTY0IHNhZmVfY2xlYXIpCit7CisJY29uc3QgY2hhciAqdHlwZSA9IGJ0cmZzX2ZlYXR1cmVfc2V0X25hbWVzW3NldF07CisJY2hhciAqbmFtZXM7CisJdTY0IGRpc2FsbG93ZWQsIHVuc3VwcG9ydGVkOworCXU2NCBzZXRfbWFzayA9IGZsYWdzICYgY2hhbmdlX21hc2s7CisJdTY0IGNsZWFyX21hc2sgPSB+ZmxhZ3MgJiBjaGFuZ2VfbWFzazsKKworCXVuc3VwcG9ydGVkID0gc2V0X21hc2sgJiB+c3VwcG9ydGVkX2ZsYWdzOworCWlmICh1bnN1cHBvcnRlZCkgeworCQluYW1lcyA9IGJ0cmZzX3ByaW50YWJsZV9mZWF0dXJlcyhzZXQsIHVuc3VwcG9ydGVkKTsKKwkJaWYgKG5hbWVzKSB7CisJCQlidHJmc193YXJuKHJvb3QtPmZzX2luZm8sCisJCQkgICAidGhpcyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJXMgZmVhdHVyZSBiaXQlcyIsCisJCQkgICBuYW1lcywgc3RyY2hyKG5hbWVzLCAnLCcpID8gInMiIDogIiIpOworCQkJa2ZyZWUobmFtZXMpOworCQl9IGVsc2UKKwkJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSAgICJ0aGlzIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0ICVzIGJpdHMgMHglbGx4IiwKKwkJCSAgIHR5cGUsIHVuc3VwcG9ydGVkKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWRpc2FsbG93ZWQgPSBzZXRfbWFzayAmIH5zYWZlX3NldDsKKwlpZiAoZGlzYWxsb3dlZCkgeworCQluYW1lcyA9IGJ0cmZzX3ByaW50YWJsZV9mZWF0dXJlcyhzZXQsIGRpc2FsbG93ZWQpOworCQlpZiAobmFtZXMpIHsKKwkJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSAgICJjYW4ndCBzZXQgdGhlICVzIGZlYXR1cmUgYml0JXMgd2hpbGUgbW91bnRlZCIsCisJCQkgICBuYW1lcywgc3RyY2hyKG5hbWVzLCAnLCcpID8gInMiIDogIiIpOworCQkJa2ZyZWUobmFtZXMpOworCQl9IGVsc2UKKwkJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSAgICJjYW4ndCBzZXQgJXMgYml0cyAweCVsbHggd2hpbGUgbW91bnRlZCIsCisJCQkgICB0eXBlLCBkaXNhbGxvd2VkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlkaXNhbGxvd2VkID0gY2xlYXJfbWFzayAmIH5zYWZlX2NsZWFyOworCWlmIChkaXNhbGxvd2VkKSB7CisJCW5hbWVzID0gYnRyZnNfcHJpbnRhYmxlX2ZlYXR1cmVzKHNldCwgZGlzYWxsb3dlZCk7CisJCWlmIChuYW1lcykgeworCQkJYnRyZnNfd2Fybihyb290LT5mc19pbmZvLAorCQkJICAgImNhbid0IGNsZWFyIHRoZSAlcyBmZWF0dXJlIGJpdCVzIHdoaWxlIG1vdW50ZWQiLAorCQkJICAgbmFtZXMsIHN0cmNocihuYW1lcywgJywnKSA/ICJzIiA6ICIiKTsKKwkJCWtmcmVlKG5hbWVzKTsKKwkJfSBlbHNlCisJCQlidHJmc193YXJuKHJvb3QtPmZzX2luZm8sCisJCQkgICAiY2FuJ3QgY2xlYXIgJXMgYml0cyAweCVsbHggd2hpbGUgbW91bnRlZCIsCisJCQkgICB0eXBlLCBkaXNhbGxvd2VkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBjaGVja19mZWF0dXJlKHJvb3QsIGNoYW5nZV9tYXNrLCBmbGFncywgbWFza19iYXNlKQlcCitjaGVja19mZWF0dXJlX2JpdHMocm9vdCwgRkVBVF8jI21hc2tfYmFzZSwgY2hhbmdlX21hc2ssIGZsYWdzLAlcCisJCSAgIEJUUkZTX0ZFQVRVUkVfICMjIG1hc2tfYmFzZSAjIyBfU1VQUCwJXAorCQkgICBCVFJGU19GRUFUVVJFXyAjIyBtYXNrX2Jhc2UgIyMgX1NBRkVfU0VULAlcCisJCSAgIEJUUkZTX0ZFQVRVUkVfICMjIG1hc2tfYmFzZSAjIyBfU0FGRV9DTEVBUikKKworc3RhdGljIGludCBidHJmc19pb2N0bF9zZXRfZmVhdHVyZXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGZpbGVfaW5vZGUoZmlsZSkpLT5yb290OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfYmxvY2sgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN0cnVjdCBidHJmc19pb2N0bF9mZWF0dXJlX2ZsYWdzIGZsYWdzWzJdOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXU2NCBuZXdmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGZsYWdzLCBhcmcsIHNpemVvZihmbGFncykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoIWZsYWdzWzBdLmNvbXBhdF9mbGFncyAmJiAhZmxhZ3NbMF0uY29tcGF0X3JvX2ZsYWdzICYmCisJICAgICFmbGFnc1swXS5pbmNvbXBhdF9mbGFncykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjaGVja19mZWF0dXJlKHJvb3QsIGZsYWdzWzBdLmNvbXBhdF9mbGFncywKKwkJCSAgICBmbGFnc1sxXS5jb21wYXRfZmxhZ3MsIENPTVBBVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNoZWNrX2ZlYXR1cmUocm9vdCwgZmxhZ3NbMF0uY29tcGF0X3JvX2ZsYWdzLAorCQkJICAgIGZsYWdzWzFdLmNvbXBhdF9yb19mbGFncywgQ09NUEFUX1JPKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2hlY2tfZmVhdHVyZShyb290LCBmbGFnc1swXS5pbmNvbXBhdF9mbGFncywKKwkJCSAgICBmbGFnc1sxXS5pbmNvbXBhdF9mbGFncywgSU5DT01QQVQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOworCWlmIChJU19FUlIodHJhbnMpKQorCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CisKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnN1cGVyX2xvY2spOworCW5ld2ZsYWdzID0gYnRyZnNfc3VwZXJfY29tcGF0X2ZsYWdzKHN1cGVyX2Jsb2NrKTsKKwluZXdmbGFncyB8PSBmbGFnc1swXS5jb21wYXRfZmxhZ3MgJiBmbGFnc1sxXS5jb21wYXRfZmxhZ3M7CisJbmV3ZmxhZ3MgJj0gfihmbGFnc1swXS5jb21wYXRfZmxhZ3MgJiB+ZmxhZ3NbMV0uY29tcGF0X2ZsYWdzKTsKKwlidHJmc19zZXRfc3VwZXJfY29tcGF0X2ZsYWdzKHN1cGVyX2Jsb2NrLCBuZXdmbGFncyk7CisKKwluZXdmbGFncyA9IGJ0cmZzX3N1cGVyX2NvbXBhdF9yb19mbGFncyhzdXBlcl9ibG9jayk7CisJbmV3ZmxhZ3MgfD0gZmxhZ3NbMF0uY29tcGF0X3JvX2ZsYWdzICYgZmxhZ3NbMV0uY29tcGF0X3JvX2ZsYWdzOworCW5ld2ZsYWdzICY9IH4oZmxhZ3NbMF0uY29tcGF0X3JvX2ZsYWdzICYgfmZsYWdzWzFdLmNvbXBhdF9yb19mbGFncyk7CisJYnRyZnNfc2V0X3N1cGVyX2NvbXBhdF9yb19mbGFncyhzdXBlcl9ibG9jaywgbmV3ZmxhZ3MpOworCisJbmV3ZmxhZ3MgPSBidHJmc19zdXBlcl9pbmNvbXBhdF9mbGFncyhzdXBlcl9ibG9jayk7CisJbmV3ZmxhZ3MgfD0gZmxhZ3NbMF0uaW5jb21wYXRfZmxhZ3MgJiBmbGFnc1sxXS5pbmNvbXBhdF9mbGFnczsKKwluZXdmbGFncyAmPSB+KGZsYWdzWzBdLmluY29tcGF0X2ZsYWdzICYgfmZsYWdzWzFdLmluY29tcGF0X2ZsYWdzKTsKKwlidHJmc19zZXRfc3VwZXJfaW5jb21wYXRfZmxhZ3Moc3VwZXJfYmxvY2ssIG5ld2ZsYWdzKTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfbG9jayk7CisKKwlyZXR1cm4gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKK30KKwogbG9uZyBidHJmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50CiAJCWNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC00NTIzLDYgKzQ3NTcsOCBAQAogCQlyZXR1cm4gYnRyZnNfaW9jdGxfbG9naWNhbF90b19pbm8ocm9vdCwgYXJncCk7CiAJY2FzZSBCVFJGU19JT0NfU1BBQ0VfSU5GTzoKIAkJcmV0dXJuIGJ0cmZzX2lvY3RsX3NwYWNlX2luZm8ocm9vdCwgYXJncCk7CisJY2FzZSBCVFJGU19JT0NfR0xPQkFMX1JTVjoKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX2dsb2JhbF9yc3Yocm9vdCwgYXJncCk7CiAJY2FzZSBCVFJGU19JT0NfU1lOQzogewogCQlpbnQgcmV0OwogCkBAIC00NTc2LDYgKzQ4MTIsMTIgQEAKIAkJcmV0dXJuIGJ0cmZzX2lvY3RsX3NldF9mc2xhYmVsKGZpbGUsIGFyZ3ApOwogCWNhc2UgQlRSRlNfSU9DX0ZJTEVfRVhURU5UX1NBTUU6CiAJCXJldHVybiBidHJmc19pb2N0bF9maWxlX2V4dGVudF9zYW1lKGZpbGUsIGFyZ3ApOworCWNhc2UgQlRSRlNfSU9DX0dFVF9TVVBQT1JURURfRkVBVFVSRVM6CisJCXJldHVybiBidHJmc19pb2N0bF9nZXRfc3VwcG9ydGVkX2ZlYXR1cmVzKGZpbGUsIGFyZ3ApOworCWNhc2UgQlRSRlNfSU9DX0dFVF9GRUFUVVJFUzoKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX2dldF9mZWF0dXJlcyhmaWxlLCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19TRVRfRkVBVFVSRVM6CisJCXJldHVybiBidHJmc19pb2N0bF9zZXRfZmVhdHVyZXMoZmlsZSwgYXJncCk7CiAJfQogCiAJcmV0dXJuIC1FTk9UVFk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9sem8uYyBiL2ZzL2J0cmZzL2x6by5jCmluZGV4IGI2YTZmMDcuLmI0N2Y2NjkgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2x6by5jCisrKyBiL2ZzL2J0cmZzL2x6by5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJcmV0ID0gbHpvMXhfMV9jb21wcmVzcyhkYXRhX2luLCBpbl9sZW4sIHdvcmtzcGFjZS0+Y2J1ZiwKIAkJCQkgICAgICAgJm91dF9sZW4sIHdvcmtzcGFjZS0+bWVtKTsKIAkJaWYgKHJldCAhPSBMWk9fRV9PSykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0cmZzIGRlZmxhdGUgaW4gbG9vcCByZXR1cm5lZCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJCVFJGUzogZGVmbGF0ZSBpbiBsb29wIHJldHVybmVkICVkXG4iLAogCQkJICAgICAgIHJldCk7CiAJCQlyZXQgPSAtMTsKIAkJCWdvdG8gb3V0OwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJCWlmIChuZWVkX3VubWFwKQogCQkJa3VubWFwKHBhZ2VzX2luW3BhZ2VfaW5faW5kZXggLSAxXSk7CiAJCWlmIChyZXQgIT0gTFpPX0VfT0spIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzIGRlY29tcHJlc3MgZmFpbGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUUkZTOiBkZWNvbXByZXNzIGZhaWxlZFxuIik7CiAJCQlyZXQgPSAtMTsKIAkJCWJyZWFrOwogCQl9CkBAIC00MDEsNyArNDAxLDcgQEAKIAlvdXRfbGVuID0gUEFHRV9DQUNIRV9TSVpFOwogCXJldCA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShkYXRhX2luLCBpbl9sZW4sIHdvcmtzcGFjZS0+YnVmLCAmb3V0X2xlbik7CiAJaWYgKHJldCAhPSBMWk9fRV9PSykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmcyBkZWNvbXByZXNzIGZhaWxlZCFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogZGVjb21wcmVzcyBmYWlsZWQhXG4iKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL29yZGVyZWQtZGF0YS5jIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKaW5kZXggNjk1ODJkNS4uYjE2NDUwYiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKKysrIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKQEAgLTMzNiwxMyArMzM2LDE0IEBACiAJCSAgICAgIGVudHJ5LT5sZW4pOwogCSpmaWxlX29mZnNldCA9IGRlY19lbmQ7CiAJaWYgKGRlY19zdGFydCA+IGRlY19lbmQpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYmFkIG9yZGVyaW5nIGRlY19zdGFydCAlbGx1IGVuZCAlbGx1XG4iLAotCQkgICAgICAgZGVjX3N0YXJ0LCBkZWNfZW5kKTsKKwkJYnRyZnNfY3JpdChCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mbywKKwkJCSJiYWQgb3JkZXJpbmcgZGVjX3N0YXJ0ICVsbHUgZW5kICVsbHUiLCBkZWNfc3RhcnQsIGRlY19lbmQpOwogCX0KIAl0b19kZWMgPSBkZWNfZW5kIC0gZGVjX3N0YXJ0OwogCWlmICh0b19kZWMgPiBlbnRyeS0+Ynl0ZXNfbGVmdCkgewotCQlwcmludGsoS0VSTl9DUklUICJiYWQgb3JkZXJlZCBhY2NvdW50aW5nIGxlZnQgJWxsdSBzaXplICVsbHVcbiIsCi0JCSAgICAgICBlbnRyeS0+Ynl0ZXNfbGVmdCwgdG9fZGVjKTsKKwkJYnRyZnNfY3JpdChCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mbywKKwkJCSJiYWQgb3JkZXJlZCBhY2NvdW50aW5nIGxlZnQgJWxsdSBzaXplICVsbHUiLAorCQkJZW50cnktPmJ5dGVzX2xlZnQsIHRvX2RlYyk7CiAJfQogCWVudHJ5LT5ieXRlc19sZWZ0IC09IHRvX2RlYzsKIAlpZiAoIXVwdG9kYXRlKQpAQCAtNDAxLDcgKzQwMiw4IEBACiAJfQogCiAJaWYgKGlvX3NpemUgPiBlbnRyeS0+Ynl0ZXNfbGVmdCkgewotCQlwcmludGsoS0VSTl9DUklUICJiYWQgb3JkZXJlZCBhY2NvdW50aW5nIGxlZnQgJWxsdSBzaXplICVsbHVcbiIsCisJCWJ0cmZzX2NyaXQoQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8sCisJCQkgICAiYmFkIG9yZGVyZWQgYWNjb3VudGluZyBsZWZ0ICVsbHUgc2l6ZSAlbGx1IiwKIAkJICAgICAgIGVudHJ5LT5ieXRlc19sZWZ0LCBpb19zaXplKTsKIAl9CiAJZW50cnktPmJ5dGVzX2xlZnQgLT0gaW9fc2l6ZTsKQEAgLTUyMCw3ICs1MjIsOCBAQAogCXNwaW5fbG9ja19pcnEoJnRyZWUtPmxvY2spOwogCW5vZGUgPSAmZW50cnktPnJiX25vZGU7CiAJcmJfZXJhc2Uobm9kZSwgJnRyZWUtPnRyZWUpOwotCXRyZWUtPmxhc3QgPSBOVUxMOworCWlmICh0cmVlLT5sYXN0ID09IG5vZGUpCisJCXRyZWUtPmxhc3QgPSBOVUxMOwogCXNldF9iaXQoQlRSRlNfT1JERVJFRF9DT01QTEVURSwgJmVudHJ5LT5mbGFncyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ0cmVlLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvb3JwaGFuLmMgYi9mcy9idHJmcy9vcnBoYW4uYwppbmRleCAyNGNhZDE2Li42NTc5M2VkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9vcnBoYW4uYworKysgYi9mcy9idHJmcy9vcnBoYW4uYwpAQCAtNjksMjMgKzY5LDMgQEAKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldDsKIH0KLQotaW50IGJ0cmZzX2ZpbmRfb3JwaGFuX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQpCi17Ci0Jc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0JaW50IHJldDsKLQotCWtleS5vYmplY3RpZCA9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRDsKLQlrZXkudHlwZSA9IEJUUkZTX09SUEhBTl9JVEVNX0tFWTsKLQlrZXkub2Zmc2V0ID0gb2Zmc2V0OwotCi0JcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlpZiAoIXBhdGgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7Ci0KLQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ByaW50LXRyZWUuYyBiL2ZzL2J0cmZzL3ByaW50LXRyZWUuYwppbmRleCA0MTcwNTNiLi42ZWZkNzBkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9wcmludC10cmVlLmMKKysrIGIvZnMvYnRyZnMvcHJpbnQtdHJlZS5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCSAgICB1MzIgaXRlbV9zaXplKQogewogCWlmICghSVNfQUxJR05FRChpdGVtX3NpemUsIHNpemVvZih1NjQpKSkgewotCQlwcl93YXJuKCJidHJmczogdXVpZCBpdGVtIHdpdGggaWxsZWdhbCBzaXplICVsdSFcbiIsCisJCXByX3dhcm4oIkJUUkZTOiB1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1IVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nKWl0ZW1fc2l6ZSk7CiAJCXJldHVybjsKIAl9CkBAIC0yNDksNyArMjQ5LDcgQEAKIAkJCSAgICBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJcdFx0aW5saW5lIGV4dGVudCBkYXRhICIKIAkJCQkgICAgICAgInNpemUgJXVcbiIsCi0JCQkJICAgICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obCwgZmkpKTsKKwkJCQkgICAgICAgYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihsLCBpLCBmaSkpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdGV4dGVudCBkYXRhIGRpc2sgYnl0ZW5yICVsbHUgIgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcHJvcHMuYyBiL2ZzL2J0cmZzL3Byb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3Byb3BzLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRmlsaXBlIERhdmlkIEJvcmJhIE1hbmFuYSA8ZmRtYW5hbmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KKyNpbmNsdWRlICJwcm9wcy5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKworI2RlZmluZSBCVFJGU19QUk9QX0hBTkRMRVJTX0hUX0JJVFMgOAorc3RhdGljIERFRklORV9IQVNIVEFCTEUocHJvcF9oYW5kbGVyc19odCwgQlRSRlNfUFJPUF9IQU5ETEVSU19IVF9CSVRTKTsKKworc3RydWN0IHByb3BfaGFuZGxlciB7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwljb25zdCBjaGFyICp4YXR0cl9uYW1lOworCWludCAoKnZhbGlkYXRlKShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbik7CisJaW50ICgqYXBwbHkpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgbGVuKTsKKwljb25zdCBjaGFyICooKmV4dHJhY3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCWludCBpbmhlcml0YWJsZTsKK307CisKK3N0YXRpYyBpbnQgcHJvcF9jb21wcmVzc2lvbl92YWxpZGF0ZShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IHByb3BfY29tcHJlc3Npb25fYXBwbHkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCSAgc2l6ZV90IGxlbik7CitzdGF0aWMgY29uc3QgY2hhciAqcHJvcF9jb21wcmVzc2lvbl9leHRyYWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCitzdGF0aWMgc3RydWN0IHByb3BfaGFuZGxlciBwcm9wX2hhbmRsZXJzW10gPSB7CisJeworCQkueGF0dHJfbmFtZSA9IFhBVFRSX0JUUkZTX1BSRUZJWCAiY29tcHJlc3Npb24iLAorCQkudmFsaWRhdGUgPSBwcm9wX2NvbXByZXNzaW9uX3ZhbGlkYXRlLAorCQkuYXBwbHkgPSBwcm9wX2NvbXByZXNzaW9uX2FwcGx5LAorCQkuZXh0cmFjdCA9IHByb3BfY29tcHJlc3Npb25fZXh0cmFjdCwKKwkJLmluaGVyaXRhYmxlID0gMQorCX0sCisJeworCQkueGF0dHJfbmFtZSA9IE5VTEwKKwl9Cit9OworCit2b2lkIF9faW5pdCBidHJmc19wcm9wc19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb3BfaGFuZGxlciAqcDsKKworCWhhc2hfaW5pdChwcm9wX2hhbmRsZXJzX2h0KTsKKworCWZvciAocCA9ICZwcm9wX2hhbmRsZXJzWzBdOyBwLT54YXR0cl9uYW1lOyBwKyspIHsKKwkJdTY0IGggPSBidHJmc19uYW1lX2hhc2gocC0+eGF0dHJfbmFtZSwgc3RybGVuKHAtPnhhdHRyX25hbWUpKTsKKworCQloYXNoX2FkZChwcm9wX2hhbmRsZXJzX2h0LCAmcC0+bm9kZSwgaCk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgKmZpbmRfcHJvcF9oYW5kbGVyc19ieV9oYXNoKGNvbnN0IHU2NCBoYXNoKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoOworCisJaCA9ICZwcm9wX2hhbmRsZXJzX2h0W2hhc2hfbWluKGhhc2gsIEJUUkZTX1BST1BfSEFORExFUlNfSFRfQklUUyldOworCWlmIChobGlzdF9lbXB0eShoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9wX2hhbmRsZXIgKgorZmluZF9wcm9wX2hhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwKKwkJICBjb25zdCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFuZGxlcnMpCit7CisJc3RydWN0IHByb3BfaGFuZGxlciAqaDsKKworCWlmICghaGFuZGxlcnMpIHsKKwkJdTY0IGhhc2ggPSBidHJmc19uYW1lX2hhc2gobmFtZSwgc3RybGVuKG5hbWUpKTsKKworCQloYW5kbGVycyA9IGZpbmRfcHJvcF9oYW5kbGVyc19ieV9oYXNoKGhhc2gpOworCQlpZiAoIWhhbmRsZXJzKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgaGFuZGxlcnMsIG5vZGUpCisJCWlmICghc3RyY21wKGgtPnhhdHRyX25hbWUsIG5hbWUpKQorCQkJcmV0dXJuIGg7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfX2J0cmZzX3NldF9wcm9wKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBjb25zdCBjaGFyICp2YWx1ZSwKKwkJCSAgICBzaXplX3QgdmFsdWVfbGVuLAorCQkJICAgIGludCBmbGFncykKK3sKKwljb25zdCBzdHJ1Y3QgcHJvcF9oYW5kbGVyICpoYW5kbGVyOworCWludCByZXQ7CisKKwlpZiAoc3RybGVuKG5hbWUpIDw9IFhBVFRSX0JUUkZTX1BSRUZJWF9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJaGFuZGxlciA9IGZpbmRfcHJvcF9oYW5kbGVyKG5hbWUsIE5VTEwpOworCWlmICghaGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsdWVfbGVuID09IDApIHsKKwkJcmV0ID0gX19idHJmc19zZXR4YXR0cih0cmFucywgaW5vZGUsIGhhbmRsZXItPnhhdHRyX25hbWUsCisJCQkJICAgICAgIE5VTEwsIDAsIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gaGFuZGxlci0+YXBwbHkoaW5vZGUsIE5VTEwsIDApOworCQlBU1NFUlQocmV0ID09IDApOworCisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaGFuZGxlci0+dmFsaWRhdGUodmFsdWUsIHZhbHVlX2xlbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBfX2J0cmZzX3NldHhhdHRyKHRyYW5zLCBpbm9kZSwgaGFuZGxlci0+eGF0dHJfbmFtZSwKKwkJCSAgICAgICB2YWx1ZSwgdmFsdWVfbGVuLCBmbGFncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBoYW5kbGVyLT5hcHBseShpbm9kZSwgdmFsdWUsIHZhbHVlX2xlbik7CisJaWYgKHJldCkgeworCQlfX2J0cmZzX3NldHhhdHRyKHRyYW5zLCBpbm9kZSwgaGFuZGxlci0+eGF0dHJfbmFtZSwKKwkJCQkgTlVMTCwgMCwgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNldF9iaXQoQlRSRlNfSU5PREVfSEFTX1BST1BTLCAmQlRSRlNfSShpbm9kZSktPnJ1bnRpbWVfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19zZXRfcHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICBjb25zdCBjaGFyICp2YWx1ZSwKKwkJICAgc2l6ZV90IHZhbHVlX2xlbiwKKwkJICAgaW50IGZsYWdzKQoreworCXJldHVybiBfX2J0cmZzX3NldF9wcm9wKE5VTEwsIGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaXRlcmF0ZV9vYmplY3RfcHJvcHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJdTY0IG9iamVjdGlkLAorCQkJCXZvaWQgKCppdGVyYXRvcikodm9pZCAqLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBwcm9wX2hhbmRsZXIgKiwKKwkJCQkJCSBjb25zdCBjaGFyICosCisJCQkJCQkgc2l6ZV90KSwKKwkJCQl2b2lkICpjdHgpCit7CisJaW50IHJldDsKKwljaGFyICpuYW1lX2J1ZiA9IE5VTEw7CisJY2hhciAqdmFsdWVfYnVmID0gTlVMTDsKKwlpbnQgbmFtZV9idWZfbGVuID0gMDsKKwlpbnQgdmFsdWVfYnVmX2xlbiA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwkJc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKKwkJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJCXUzMiB0b3RhbF9sZW4sIGN1ciwgdGhpc19sZW47CisJCWludCBzbG90OworCQljb25zdCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFuZGxlcnM7CisKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKKwkJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZikpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZWxzZSBpZiAocmV0ID4gMCkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHNsb3QpOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IG9iamVjdGlkKQorCQkJYnJlYWs7CisJCWlmIChrZXkudHlwZSAhPSBCVFJGU19YQVRUUl9JVEVNX0tFWSkKKwkJCWJyZWFrOworCisJCWhhbmRsZXJzID0gZmluZF9wcm9wX2hhbmRsZXJzX2J5X2hhc2goa2V5Lm9mZnNldCk7CisJCWlmICghaGFuZGxlcnMpCisJCQlnb3RvIG5leHRfc2xvdDsKKworCQlkaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsIHN0cnVjdCBidHJmc19kaXJfaXRlbSk7CisJCWN1ciA9IDA7CisJCXRvdGFsX2xlbiA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KTsKKworCQl3aGlsZSAoY3VyIDwgdG90YWxfbGVuKSB7CisJCQl1MzIgbmFtZV9sZW4gPSBidHJmc19kaXJfbmFtZV9sZW4obGVhZiwgZGkpOworCQkJdTMyIGRhdGFfbGVuID0gYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpKTsKKwkJCXVuc2lnbmVkIGxvbmcgbmFtZV9wdHIsIGRhdGFfcHRyOworCQkJY29uc3Qgc3RydWN0IHByb3BfaGFuZGxlciAqaGFuZGxlcjsKKworCQkJdGhpc19sZW4gPSBzaXplb2YoKmRpKSArIG5hbWVfbGVuICsgZGF0YV9sZW47CisJCQluYW1lX3B0ciA9ICh1bnNpZ25lZCBsb25nKShkaSArIDEpOworCQkJZGF0YV9wdHIgPSBuYW1lX3B0ciArIG5hbWVfbGVuOworCisJCQlpZiAobmFtZV9sZW4gPD0gWEFUVFJfQlRSRlNfUFJFRklYX0xFTiB8fAorCQkJICAgIG1lbWNtcF9leHRlbnRfYnVmZmVyKGxlYWYsIFhBVFRSX0JUUkZTX1BSRUZJWCwKKwkJCQkJCSBuYW1lX3B0ciwKKwkJCQkJCSBYQVRUUl9CVFJGU19QUkVGSVhfTEVOKSkKKwkJCQlnb3RvIG5leHRfZGlyX2l0ZW07CisKKwkJCWlmIChuYW1lX2xlbiA+PSBuYW1lX2J1Zl9sZW4pIHsKKwkJCQlrZnJlZShuYW1lX2J1Zik7CisJCQkJbmFtZV9idWZfbGVuID0gbmFtZV9sZW4gKyAxOworCQkJCW5hbWVfYnVmID0ga21hbGxvYyhuYW1lX2J1Zl9sZW4sIEdGUF9OT0ZTKTsKKwkJCQlpZiAoIW5hbWVfYnVmKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBuYW1lX2J1ZiwgbmFtZV9wdHIsIG5hbWVfbGVuKTsKKwkJCW5hbWVfYnVmW25hbWVfbGVuXSA9ICdcMCc7CisKKwkJCWhhbmRsZXIgPSBmaW5kX3Byb3BfaGFuZGxlcihuYW1lX2J1ZiwgaGFuZGxlcnMpOworCQkJaWYgKCFoYW5kbGVyKQorCQkJCWdvdG8gbmV4dF9kaXJfaXRlbTsKKworCQkJaWYgKGRhdGFfbGVuID4gdmFsdWVfYnVmX2xlbikgeworCQkJCWtmcmVlKHZhbHVlX2J1Zik7CisJCQkJdmFsdWVfYnVmX2xlbiA9IGRhdGFfbGVuOworCQkJCXZhbHVlX2J1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9OT0ZTKTsKKwkJCQlpZiAoIXZhbHVlX2J1ZikgeworCQkJCQlyZXQgPSAtRU5PTUVNOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgdmFsdWVfYnVmLCBkYXRhX3B0ciwgZGF0YV9sZW4pOworCisJCQlpdGVyYXRvcihjdHgsIGhhbmRsZXIsIHZhbHVlX2J1ZiwgZGF0YV9sZW4pOworbmV4dF9kaXJfaXRlbToKKwkJCWN1ciArPSB0aGlzX2xlbjsKKwkJCWRpID0gKHN0cnVjdCBidHJmc19kaXJfaXRlbSAqKSgoY2hhciAqKSBkaSArIHRoaXNfbGVuKTsKKwkJfQorCituZXh0X3Nsb3Q6CisJCXBhdGgtPnNsb3RzWzBdKys7CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJa2ZyZWUobmFtZV9idWYpOworCWtmcmVlKHZhbHVlX2J1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbm9kZV9wcm9wX2l0ZXJhdG9yKHZvaWQgKmN0eCwKKwkJCQljb25zdCBzdHJ1Y3QgcHJvcF9oYW5kbGVyICpoYW5kbGVyLAorCQkJCWNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGN0eDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQ7CisKKwlyZXQgPSBoYW5kbGVyLT5hcHBseShpbm9kZSwgdmFsdWUsIGxlbik7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywKKwkJCSAgICJlcnJvciBhcHBseWluZyBwcm9wICVzIHRvIGlubyAlbGx1IChyb290ICVsbHUpOiAlZCIsCisJCQkgICBoYW5kbGVyLT54YXR0cl9uYW1lLCBidHJmc19pbm8oaW5vZGUpLAorCQkJICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIHJldCk7CisJZWxzZQorCQlzZXRfYml0KEJUUkZTX0lOT0RFX0hBU19QUk9QUywgJkJUUkZTX0koaW5vZGUpLT5ydW50aW1lX2ZsYWdzKTsKK30KKworaW50IGJ0cmZzX2xvYWRfaW5vZGVfcHJvcHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1NjQgaW5vID0gYnRyZnNfaW5vKGlub2RlKTsKKwlpbnQgcmV0OworCisJcmV0ID0gaXRlcmF0ZV9vYmplY3RfcHJvcHMocm9vdCwgcGF0aCwgaW5vLCBpbm9kZV9wcm9wX2l0ZXJhdG9yLCBpbm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGluaGVyaXRfcHJvcHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwljb25zdCBzdHJ1Y3QgcHJvcF9oYW5kbGVyICpoOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJaW50IHJldDsKKworCWlmICghdGVzdF9iaXQoQlRSRlNfSU5PREVfSEFTX1BST1BTLAorCQkgICAgICAmQlRSRlNfSShwYXJlbnQpLT5ydW50aW1lX2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGggPSAmcHJvcF9oYW5kbGVyc1swXTsgaC0+eGF0dHJfbmFtZTsgaCsrKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlOworCQl1NjQgbnVtX2J5dGVzOworCisJCWlmICghaC0+aW5oZXJpdGFibGUpCisJCQljb250aW51ZTsKKworCQl2YWx1ZSA9IGgtPmV4dHJhY3QocGFyZW50KTsKKwkJaWYgKCF2YWx1ZSkKKwkJCWNvbnRpbnVlOworCisJCW51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChyb290LCB0cmFucy0+YmxvY2tfcnN2LAorCQkJCQkgIG51bV9ieXRlcywgQlRSRlNfUkVTRVJWRV9OT19GTFVTSCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gX19idHJmc19zZXRfcHJvcCh0cmFucywgaW5vZGUsIGgtPnhhdHRyX25hbWUsCisJCQkJICAgICAgIHZhbHVlLCBzdHJsZW4odmFsdWUpLCAwKTsKKwkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgdHJhbnMtPmJsb2NrX3JzdiwgbnVtX2J5dGVzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19pbm9kZV9pbmhlcml0X3Byb3BzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCWlmICghZGlyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpbmhlcml0X3Byb3BzKHRyYW5zLCBpbm9kZSwgZGlyKTsKK30KKworaW50IGJ0cmZzX3N1YnZvbF9pbmhlcml0X3Byb3BzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpwYXJlbnRfcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZSwgKmNoaWxkX2lub2RlOworCWludCByZXQ7CisKKwlrZXkub2JqZWN0aWQgPSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEOworCWtleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CisJa2V5Lm9mZnNldCA9IDA7CisKKwlwYXJlbnRfaW5vZGUgPSBidHJmc19pZ2V0KHBhcmVudF9yb290LT5mc19pbmZvLT5zYiwgJmtleSwKKwkJCQkgIHBhcmVudF9yb290LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBhcmVudF9pbm9kZSkpCisJCXJldHVybiBQVFJfRVJSKHBhcmVudF9pbm9kZSk7CisKKwljaGlsZF9pbm9kZSA9IGJ0cmZzX2lnZXQocm9vdC0+ZnNfaW5mby0+c2IsICZrZXksIHJvb3QsIE5VTEwpOworCWlmIChJU19FUlIoY2hpbGRfaW5vZGUpKSB7CisJCWlwdXQocGFyZW50X2lub2RlKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpbGRfaW5vZGUpOworCX0KKworCXJldCA9IGluaGVyaXRfcHJvcHModHJhbnMsIGNoaWxkX2lub2RlLCBwYXJlbnRfaW5vZGUpOworCWlwdXQoY2hpbGRfaW5vZGUpOworCWlwdXQocGFyZW50X2lub2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvcF9jb21wcmVzc2lvbl92YWxpZGF0ZShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbikKK3sKKwlpZiAoIXN0cm5jbXAoImx6byIsIHZhbHVlLCBsZW4pKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICghc3RybmNtcCgiemxpYiIsIHZhbHVlLCBsZW4pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHByb3BfY29tcHJlc3Npb25fYXBwbHkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCSAgc2l6ZV90IGxlbikKK3sKKwlpbnQgdHlwZTsKKworCWlmIChsZW4gPT0gMCkgeworCQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgfD0gQlRSRlNfSU5PREVfTk9DT01QUkVTUzsKKwkJQlRSRlNfSShpbm9kZSktPmZsYWdzICY9IH5CVFJGU19JTk9ERV9DT01QUkVTUzsKKwkJQlRSRlNfSShpbm9kZSktPmZvcmNlX2NvbXByZXNzID0gQlRSRlNfQ09NUFJFU1NfTk9ORTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cm5jbXAoImx6byIsIHZhbHVlLCBsZW4pKQorCQl0eXBlID0gQlRSRlNfQ09NUFJFU1NfTFpPOworCWVsc2UgaWYgKCFzdHJuY21wKCJ6bGliIiwgdmFsdWUsIGxlbikpCisJCXR5cGUgPSBCVFJGU19DT01QUkVTU19aTElCOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX05PQ09NUFJFU1M7CisJQlRSRlNfSShpbm9kZSktPmZsYWdzIHw9IEJUUkZTX0lOT0RFX0NPTVBSRVNTOworCUJUUkZTX0koaW5vZGUpLT5mb3JjZV9jb21wcmVzcyA9IHR5cGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnByb3BfY29tcHJlc3Npb25fZXh0cmFjdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN3aXRjaCAoQlRSRlNfSShpbm9kZSktPmZvcmNlX2NvbXByZXNzKSB7CisJY2FzZSBCVFJGU19DT01QUkVTU19aTElCOgorCQlyZXR1cm4gInpsaWIiOworCWNhc2UgQlRSRlNfQ09NUFJFU1NfTFpPOgorCQlyZXR1cm4gImx6byI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9wcm9wcy5oIGIvZnMvYnRyZnMvcHJvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvcHJvcHMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZpbGlwZSBEYXZpZCBCb3JiYSBNYW5hbmEgPGZkbWFuYW5hQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfUFJPUFNfSAorI2RlZmluZSBfX0JUUkZTX1BST1BTX0gKKworI2luY2x1ZGUgImN0cmVlLmgiCisKK3ZvaWQgX19pbml0IGJ0cmZzX3Byb3BzX2luaXQodm9pZCk7CisKK2ludCBidHJmc19zZXRfcHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICBjb25zdCBjaGFyICp2YWx1ZSwKKwkJICAgc2l6ZV90IHZhbHVlX2xlbiwKKwkJICAgaW50IGZsYWdzKTsKKworaW50IGJ0cmZzX2xvYWRfaW5vZGVfcHJvcHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOworCitpbnQgYnRyZnNfaW5vZGVfaW5oZXJpdF9wcm9wcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpcik7CisKK2ludCBidHJmc19zdWJ2b2xfaW5oZXJpdF9wcm9wcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcGFyZW50X3Jvb3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3Fncm91cC5jIGIvZnMvYnRyZnMvcWdyb3VwLmMKaW5kZXggNGU2ZWY0OS4uNDcyMzAyYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcWdyb3VwLmMKKysrIGIvZnMvYnRyZnMvcWdyb3VwLmMKQEAgLTMwMSwxNiArMzAxLDE2IEBACiAKIAkJCWlmIChidHJmc19xZ3JvdXBfc3RhdHVzX3ZlcnNpb24obCwgcHRyKSAhPQogCQkJICAgIEJUUkZTX1FHUk9VUF9TVEFUVVNfVkVSU0lPTikgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAiYnRyZnM6IG9sZCBxZ3JvdXAgdmVyc2lvbiwgcXVvdGEgZGlzYWJsZWRcbiIpOworCQkJCWJ0cmZzX2Vycihmc19pbmZvLAorCQkJCSAib2xkIHFncm91cCB2ZXJzaW9uLCBxdW90YSBkaXNhYmxlZCIpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJaWYgKGJ0cmZzX3Fncm91cF9zdGF0dXNfZ2VuZXJhdGlvbihsLCBwdHIpICE9CiAJCQkgICAgZnNfaW5mby0+Z2VuZXJhdGlvbikgewogCQkJCWZsYWdzIHw9IEJUUkZTX1FHUk9VUF9TVEFUVVNfRkxBR19JTkNPTlNJU1RFTlQ7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJidHJmczogcWdyb3VwIGdlbmVyYXRpb24gbWlzbWF0Y2gsICIKLQkJCQkJIm1hcmtlZCBhcyBpbmNvbnNpc3RlbnRcbiIpOworCQkJCWJ0cmZzX2Vycihmc19pbmZvLAorCQkJCQkicWdyb3VwIGdlbmVyYXRpb24gbWlzbWF0Y2gsICIKKwkJCQkJIm1hcmtlZCBhcyBpbmNvbnNpc3RlbnQiKTsKIAkJCX0KIAkJCWZzX2luZm8tPnFncm91cF9mbGFncyA9IGJ0cmZzX3Fncm91cF9zdGF0dXNfZmxhZ3MobCwKIAkJCQkJCQkJCSAgcHRyKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogCQlxZ3JvdXAgPSBmaW5kX3Fncm91cF9yYihmc19pbmZvLCBmb3VuZF9rZXkub2Zmc2V0KTsKIAkJaWYgKChxZ3JvdXAgJiYgZm91bmRfa2V5LnR5cGUgPT0gQlRSRlNfUUdST1VQX0lORk9fS0VZKSB8fAogCQkgICAgKCFxZ3JvdXAgJiYgZm91bmRfa2V5LnR5cGUgPT0gQlRSRlNfUUdST1VQX0xJTUlUX0tFWSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGluY29uc2l0ZW50IHFncm91cCBjb25maWdcbiIpOworCQkJYnRyZnNfZXJyKGZzX2luZm8sICJpbmNvbnNpdGVudCBxZ3JvdXAgY29uZmlnIik7CiAJCQlmbGFncyB8PSBCVFJGU19RR1JPVVBfU1RBVFVTX0ZMQUdfSU5DT05TSVNURU5UOwogCQl9CiAJCWlmICghcWdyb3VwKSB7CkBAIC0zOTYsOCArMzk2LDggQEAKIAkJcmV0ID0gYWRkX3JlbGF0aW9uX3JiKGZzX2luZm8sIGZvdW5kX2tleS5vYmplY3RpZCwKIAkJCQkgICAgICBmb3VuZF9rZXkub2Zmc2V0KTsKIAkJaWYgKHJldCA9PSAtRU5PRU5UKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJImJ0cmZzOiBvcnBoYW4gcWdyb3VwIHJlbGF0aW9uIDB4JWxseC0+MHglbGx4XG4iLAorCQkJYnRyZnNfd2Fybihmc19pbmZvLAorCQkJCSJvcnBoYW4gcWdyb3VwIHJlbGF0aW9uIDB4JWxseC0+MHglbGx4IiwKIAkJCQlmb3VuZF9rZXkub2JqZWN0aWQsIGZvdW5kX2tleS5vZmZzZXQpOwogCQkJcmV0ID0gMDsJLyogaWdub3JlIHRoZSBlcnJvciAqLwogCQl9CkBAIC02NDQsOCArNjQ0LDcgQEAKIAogCWwgPSBwYXRoLT5ub2Rlc1swXTsKIAlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JcWdyb3VwX2xpbWl0ID0gYnRyZnNfaXRlbV9wdHIobCwgcGF0aC0+c2xvdHNbMF0sCi0JCQkJICAgICAgc3RydWN0IGJ0cmZzX3Fncm91cF9saW1pdF9pdGVtKTsKKwlxZ3JvdXBfbGltaXQgPSBidHJmc19pdGVtX3B0cihsLCBzbG90LCBzdHJ1Y3QgYnRyZnNfcWdyb3VwX2xpbWl0X2l0ZW0pOwogCWJ0cmZzX3NldF9xZ3JvdXBfbGltaXRfZmxhZ3MobCwgcWdyb3VwX2xpbWl0LCBmbGFncyk7CiAJYnRyZnNfc2V0X3Fncm91cF9saW1pdF9tYXhfcmZlcihsLCBxZ3JvdXBfbGltaXQsIG1heF9yZmVyKTsKIAlidHJmc19zZXRfcWdyb3VwX2xpbWl0X21heF9leGNsKGwsIHFncm91cF9saW1pdCwgbWF4X2V4Y2wpOwpAQCAtNjg3LDggKzY4Niw3IEBACiAKIAlsID0gcGF0aC0+bm9kZXNbMF07CiAJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwotCXFncm91cF9pbmZvID0gYnRyZnNfaXRlbV9wdHIobCwgcGF0aC0+c2xvdHNbMF0sCi0JCQkJIHN0cnVjdCBidHJmc19xZ3JvdXBfaW5mb19pdGVtKTsKKwlxZ3JvdXBfaW5mbyA9IGJ0cmZzX2l0ZW1fcHRyKGwsIHNsb3QsIHN0cnVjdCBidHJmc19xZ3JvdXBfaW5mb19pdGVtKTsKIAlidHJmc19zZXRfcWdyb3VwX2luZm9fZ2VuZXJhdGlvbihsLCBxZ3JvdXBfaW5mbywgdHJhbnMtPnRyYW5zaWQpOwogCWJ0cmZzX3NldF9xZ3JvdXBfaW5mb19yZmVyKGwsIHFncm91cF9pbmZvLCBxZ3JvdXAtPnJmZXIpOwogCWJ0cmZzX3NldF9xZ3JvdXBfaW5mb19yZmVyX2NtcHIobCwgcWdyb3VwX2luZm8sIHFncm91cC0+cmZlcl9jbXByKTsKQEAgLTExNjEsNyArMTE1OSw3IEBACiAJCQkJICAgICAgIGxpbWl0LT5yc3ZfZXhjbCk7CiAJaWYgKHJldCkgewogCQlmc19pbmZvLT5xZ3JvdXBfZmxhZ3MgfD0gQlRSRlNfUUdST1VQX1NUQVRVU19GTEFHX0lOQ09OU0lTVEVOVDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidW5hYmxlIHRvIHVwZGF0ZSBxdW90YSBsaW1pdCBmb3IgJWxsdVxuIiwKKwkJYnRyZnNfaW5mbyhmc19pbmZvLCAidW5hYmxlIHRvIHVwZGF0ZSBxdW90YSBsaW1pdCBmb3IgJWxsdSIsCiAJCSAgICAgICBxZ3JvdXBpZCk7CiAJfQogCkBAIC0xMzQ5LDcgKzEzNDcsNiBAQAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfbm9kZSAqbm9kZSwKIAkJCSAgICAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wICpleHRlbnRfb3ApCiB7Ci0Jc3RydWN0IGJ0cmZzX2tleSBpbnM7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnF1b3RhX3Jvb3Q7CiAJdTY0IHJlZl9yb290OwogCXN0cnVjdCBidHJmc19xZ3JvdXAgKnFncm91cDsKQEAgLTEzNjMsMTAgKzEzNjAsNiBAQAogCiAJQlVHX09OKCFmc19pbmZvLT5xdW90YV9yb290KTsKIAotCWlucy5vYmplY3RpZCA9IG5vZGUtPmJ5dGVucjsKLQlpbnMub2Zmc2V0ID0gbm9kZS0+bnVtX2J5dGVzOwotCWlucy50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwotCiAJaWYgKG5vZGUtPnR5cGUgPT0gQlRSRlNfVFJFRV9CTE9DS19SRUZfS0VZIHx8CiAJICAgIG5vZGUtPnR5cGUgPT0gQlRSRlNfU0hBUkVEX0JMT0NLX1JFRl9LRVkpIHsKIAkJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfdHJlZV9yZWYgKnJlZjsKQEAgLTE4NDAsNyArMTgzMyw5IEBACiB7CiAJaWYgKGxpc3RfZW1wdHkoJnRyYW5zLT5xZ3JvdXBfcmVmX2xpc3QpICYmICF0cmFucy0+ZGVsYXllZF9yZWZfZWxlbS5zZXEpCiAJCXJldHVybjsKLQlwcl9lcnIoImJ0cmZzOiBxZ3JvdXBzIG5vdCB1cHRvZGF0ZSBpbiB0cmFucyBoYW5kbGUgJXA6IGxpc3QgaXMlcyBlbXB0eSwgc2VxIGlzICUjeC4leFxuIiwKKwlidHJmc19lcnIodHJhbnMtPnJvb3QtPmZzX2luZm8sCisJCSJxZ3JvdXBzIG5vdCB1cHRvZGF0ZSBpbiB0cmFucyBoYW5kbGUgJXA6ICBsaXN0IGlzJXMgZW1wdHksICIKKwkJInNlcSBpcyAlI3guJXgiLAogCQl0cmFucywgbGlzdF9lbXB0eSgmdHJhbnMtPnFncm91cF9yZWZfbGlzdCkgPyAiIiA6ICIgbm90IiwKIAkJKHUzMikodHJhbnMtPmRlbGF5ZWRfcmVmX2VsZW0uc2VxID4+IDMyKSwKIAkJKHUzMil0cmFucy0+ZGVsYXllZF9yZWZfZWxlbS5zZXEpOwpAQCAtMTkwMiw5ICsxODk3LDE3IEBACiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogCiAJZm9yICg7IHNsb3QgPCBidHJmc19oZWFkZXJfbnJpdGVtcyhzY3JhdGNoX2xlYWYpOyArK3Nsb3QpIHsKKwkJdTY0IG51bV9ieXRlczsKKwogCQlidHJmc19pdGVtX2tleV90b19jcHUoc2NyYXRjaF9sZWFmLCAmZm91bmQsIHNsb3QpOwotCQlpZiAoZm91bmQudHlwZSAhPSBCVFJGU19FWFRFTlRfSVRFTV9LRVkpCisJCWlmIChmb3VuZC50eXBlICE9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSAmJgorCQkgICAgZm91bmQudHlwZSAhPSBCVFJGU19NRVRBREFUQV9JVEVNX0tFWSkKIAkJCWNvbnRpbnVlOworCQlpZiAoZm91bmQudHlwZSA9PSBCVFJGU19NRVRBREFUQV9JVEVNX0tFWSkKKwkJCW51bV9ieXRlcyA9IGZzX2luZm8tPmV4dGVudF9yb290LT5sZWFmc2l6ZTsKKwkJZWxzZQorCQkJbnVtX2J5dGVzID0gZm91bmQub2Zmc2V0OworCiAJCXJldCA9IGJ0cmZzX2ZpbmRfYWxsX3Jvb3RzKHRyYW5zLCBmc19pbmZvLCBmb3VuZC5vYmplY3RpZCwKIAkJCQkJICAgdHJlZV9tb2Rfc2VxX2VsZW0uc2VxLCAmcm9vdHMpOwogCQlpZiAocmV0IDwgMCkKQEAgLTE5NDksMTIgKzE5NTIsMTIgQEAKIAkJCXN0cnVjdCBidHJmc19xZ3JvdXBfbGlzdCAqZ2xpc3Q7CiAKIAkJCXFnID0gKHN0cnVjdCBidHJmc19xZ3JvdXAgKikodWludHB0cl90KSB1bm9kZS0+YXV4OwotCQkJcWctPnJmZXIgKz0gZm91bmQub2Zmc2V0OwotCQkJcWctPnJmZXJfY21wciArPSBmb3VuZC5vZmZzZXQ7CisJCQlxZy0+cmZlciArPSBudW1fYnl0ZXM7CisJCQlxZy0+cmZlcl9jbXByICs9IG51bV9ieXRlczsKIAkJCVdBUk5fT04ocWctPnRhZyA+PSBzZXEpOwogCQkJaWYgKHFnLT5yZWZjbnQgLSBzZXEgPT0gcm9vdHMtPm5ub2RlcykgewotCQkJCXFnLT5leGNsICs9IGZvdW5kLm9mZnNldDsKLQkJCQlxZy0+ZXhjbF9jbXByICs9IGZvdW5kLm9mZnNldDsKKwkJCQlxZy0+ZXhjbCArPSBudW1fYnl0ZXM7CisJCQkJcWctPmV4Y2xfY21wciArPSBudW1fYnl0ZXM7CiAJCQl9CiAJCQlxZ3JvdXBfZGlydHkoZnNfaW5mbywgcWcpOwogCkBAIC0yMDM3LDEwICsyMDQwLDEwIEBACiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogCiAJaWYgKGVyciA+PSAwKSB7Ci0JCXByX2luZm8oImJ0cmZzOiBxZ3JvdXAgc2NhbiBjb21wbGV0ZWQlc1xuIiwKKwkJYnRyZnNfaW5mbyhmc19pbmZvLCAicWdyb3VwIHNjYW4gY29tcGxldGVkJXMiLAogCQkJZXJyID09IDIgPyAiIChpbmNvbnNpc3RlbmN5IGZsYWcgY2xlYXJlZCkiIDogIiIpOwogCX0gZWxzZSB7Ci0JCXByX2VycigiYnRyZnM6IHFncm91cCBzY2FuIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQlidHJmc19lcnIoZnNfaW5mbywgInFncm91cCBzY2FuIGZhaWxlZCB3aXRoICVkIiwgZXJyKTsKIAl9CiAKIAljb21wbGV0ZV9hbGwoJmZzX2luZm8tPnFncm91cF9yZXNjYW5fY29tcGxldGlvbik7CkBAIC0yMDk2LDcgKzIwOTksNyBAQAogCiAJaWYgKHJldCkgewogZXJyOgotCQlwcl9pbmZvKCJidHJmczogcWdyb3VwX3Jlc2Nhbl9pbml0IGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlidHJmc19pbmZvKGZzX2luZm8sICJxZ3JvdXBfcmVzY2FuX2luaXQgZmFpbGVkIHdpdGggJWQiLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmFpZDU2LmMgYi9mcy9idHJmcy9yYWlkNTYuYwppbmRleCAyNGFjMjE4Li45YWYwYjI1IDEwMDY0NAotLS0gYS9mcy9idHJmcy9yYWlkNTYuYworKysgYi9mcy9idHJmcy9yYWlkNTYuYwpAQCAtMTAzMiw4ICsxMDMyLDggQEAKIAogCS8qIHNlZSBpZiB3ZSBjYW4gYWRkIHRoaXMgcGFnZSBvbnRvIG91ciBleGlzdGluZyBiaW8gKi8KIAlpZiAobGFzdCkgewotCQlsYXN0X2VuZCA9ICh1NjQpbGFzdC0+Ymlfc2VjdG9yIDw8IDk7Ci0JCWxhc3RfZW5kICs9IGxhc3QtPmJpX3NpemU7CisJCWxhc3RfZW5kID0gKHU2NClsYXN0LT5iaV9pdGVyLmJpX3NlY3RvciA8PCA5OworCQlsYXN0X2VuZCArPSBsYXN0LT5iaV9pdGVyLmJpX3NpemU7CiAKIAkJLyoKIAkJICogd2UgY2FuJ3QgbWVyZ2UgdGhlc2UgaWYgdGhleSBhcmUgZnJvbSBkaWZmZXJlbnQKQEAgLTEwNTMsOSArMTA1Myw5IEBACiAJaWYgKCFiaW8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYmlvLT5iaV9zaXplID0gMDsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IDA7CiAJYmlvLT5iaV9iZGV2ID0gc3RyaXBlLT5kZXYtPmJkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBkaXNrX3N0YXJ0ID4+IDk7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGRpc2tfc3RhcnQgPj4gOTsKIAlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwogCiAJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgUEFHRV9DQUNIRV9TSVpFLCAwKTsKQEAgLTExMTEsNyArMTExMSw3IEBACiAKIAlzcGluX2xvY2tfaXJxKCZyYmlvLT5iaW9fbGlzdF9sb2NrKTsKIAliaW9fbGlzdF9mb3JfZWFjaChiaW8sICZyYmlvLT5iaW9fbGlzdCkgewotCQlzdGFydCA9ICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwkJc3RhcnQgPSAodTY0KWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPDwgOTsKIAkJc3RyaXBlX29mZnNldCA9IHN0YXJ0IC0gcmJpby0+cmFpZF9tYXBbMF07CiAJCXBhZ2VfaW5kZXggPSBzdHJpcGVfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKQEAgLTEyNzIsNyArMTI3Miw3IEBACiBzdGF0aWMgaW50IGZpbmRfYmlvX3N0cmlwZShzdHJ1Y3QgYnRyZnNfcmFpZF9iaW8gKnJiaW8sCiAJCQkgICBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JdTY0IHBoeXNpY2FsID0gYmlvLT5iaV9zZWN0b3I7CisJdTY0IHBoeXNpY2FsID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAl1NjQgc3RyaXBlX3N0YXJ0OwogCWludCBpOwogCXN0cnVjdCBidHJmc19iaW9fc3RyaXBlICpzdHJpcGU7CkBAIC0xMjk4LDcgKzEyOTgsNyBAQAogc3RhdGljIGludCBmaW5kX2xvZ2ljYWxfYmlvX3N0cmlwZShzdHJ1Y3QgYnRyZnNfcmFpZF9iaW8gKnJiaW8sCiAJCQkJICAgc3RydWN0IGJpbyAqYmlvKQogewotCXU2NCBsb2dpY2FsID0gYmlvLT5iaV9zZWN0b3I7CisJdTY0IGxvZ2ljYWwgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCXU2NCBzdHJpcGVfc3RhcnQ7CiAJaW50IGk7CiAKQEAgLTE2MDIsOCArMTYwMiw4IEBACiAJCQkJCQkgcGx1Z19saXN0KTsKIAlzdHJ1Y3QgYnRyZnNfcmFpZF9iaW8gKnJiID0gY29udGFpbmVyX29mKGIsIHN0cnVjdCBidHJmc19yYWlkX2JpbywKIAkJCQkJCSBwbHVnX2xpc3QpOwotCXU2NCBhX3NlY3RvciA9IHJhLT5iaW9fbGlzdC5oZWFkLT5iaV9zZWN0b3I7Ci0JdTY0IGJfc2VjdG9yID0gcmItPmJpb19saXN0LmhlYWQtPmJpX3NlY3RvcjsKKwl1NjQgYV9zZWN0b3IgPSByYS0+YmlvX2xpc3QuaGVhZC0+YmlfaXRlci5iaV9zZWN0b3I7CisJdTY0IGJfc2VjdG9yID0gcmItPmJpb19saXN0LmhlYWQtPmJpX2l0ZXIuYmlfc2VjdG9yOwogCiAJaWYgKGFfc2VjdG9yIDwgYl9zZWN0b3IpCiAJCXJldHVybiAtMTsKQEAgLTE2OTEsNyArMTY5MSw3IEBACiAJaWYgKElTX0VSUihyYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIocmJpbyk7CiAJYmlvX2xpc3RfYWRkKCZyYmlvLT5iaW9fbGlzdCwgYmlvKTsKLQlyYmlvLT5iaW9fbGlzdF9ieXRlcyA9IGJpby0+Ymlfc2l6ZTsKKwlyYmlvLT5iaW9fbGlzdF9ieXRlcyA9IGJpby0+YmlfaXRlci5iaV9zaXplOwogCiAJLyoKIAkgKiBkb24ndCBwbHVnIG9uIGZ1bGwgcmJpb3MsIGp1c3QgZ2V0IHRoZW0gb3V0IHRoZSBkb29yCkBAIC0yMDQ0LDcgKzIwNDQsNyBAQAogCiAJcmJpby0+cmVhZF9yZWJ1aWxkID0gMTsKIAliaW9fbGlzdF9hZGQoJnJiaW8tPmJpb19saXN0LCBiaW8pOwotCXJiaW8tPmJpb19saXN0X2J5dGVzID0gYmlvLT5iaV9zaXplOworCXJiaW8tPmJpb19saXN0X2J5dGVzID0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAKIAlyYmlvLT5mYWlsYSA9IGZpbmRfbG9naWNhbF9iaW9fc3RyaXBlKHJiaW8sIGJpbyk7CiAJaWYgKHJiaW8tPmZhaWxhID09IC0xKSB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWFkYS5jIGIvZnMvYnRyZnMvcmVhZGEuYwppbmRleCAxMDMxYjY5Li4zMWM3OTdjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9yZWFkYS5jCisrKyBiL2ZzL2J0cmZzL3JlYWRhLmMKQEAgLTE4OSw4ICsxODksOCBAQAogCQkJICovCiAjaWZkZWYgREVCVUcKIAkJCWlmIChyZWMtPmdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJnZW5lcmF0aW9uIG1pc21hdGNoIGZvciAiCi0JCQkJCQkiKCVsbHUsJWQsJWxsdSkgJWxsdSAhPSAlbGx1XG4iLAorCQkJCWJ0cmZzX2RlYnVnKHJvb3QtPmZzX2luZm8sCisJCQkJCSAgICJnZW5lcmF0aW9uIG1pc21hdGNoIGZvciAoJWxsdSwlZCwlbGx1KSAlbGx1ICE9ICVsbHUiLAogCQkJCSAgICAgICBrZXkub2JqZWN0aWQsIGtleS50eXBlLCBrZXkub2Zmc2V0LAogCQkJCSAgICAgICByZWMtPmdlbmVyYXRpb24sIGdlbmVyYXRpb24pOwogCQkJfQpAQCAtMzY1LDggKzM2NSw5IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAoYmJpby0+bnVtX3N0cmlwZXMgPiBCVFJGU19NQVhfTUlSUk9SUykgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHJlYWRhaGVhZDogbW9yZSB0aGFuICVkIGNvcGllcyBub3QgIgotCQkJCSJzdXBwb3J0ZWQiLCBCVFJGU19NQVhfTUlSUk9SUyk7CisJCWJ0cmZzX2Vycihyb290LT5mc19pbmZvLAorCQkJICAgInJlYWRhaGVhZDogbW9yZSB0aGFuICVkIGNvcGllcyBub3Qgc3VwcG9ydGVkIiwKKwkJCSAgIEJUUkZTX01BWF9NSVJST1JTKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwppbmRleCA0MjljNzNjLi4wN2IzYjM2IDEwMDY0NAotLS0gYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMKKysrIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCkBAIC05NCw2ICs5NCw3IEBACiAKICNkZWZpbmUgTE9XRVIJMAogI2RlZmluZSBVUFBFUgkxCisjZGVmaW5lIFJFTE9DQVRJT05fUkVTRVJWRURfTk9ERVMJMjU2CiAKIHN0cnVjdCBiYWNrcmVmX2NhY2hlIHsKIAkvKiByZWQgYmxhY2sgdHJlZSBvZiBhbGwgYmFja3JlZiBub2RlcyBpbiB0aGUgY2FjaGUgKi8KQEAgLTE3Niw2ICsxNzcsOCBAQAogCXU2NCBtZXJnaW5nX3Jzdl9zaXplOwogCS8qIHNpemUgb2YgcmVsb2NhdGVkIHRyZWUgbm9kZXMgKi8KIAl1NjQgbm9kZXNfcmVsb2NhdGVkOworCS8qIHJlc2VydmVkIHNpemUgZm9yIGJsb2NrIGdyb3VwIHJlbG9jYXRpb24qLworCXU2NCByZXNlcnZlZF9ieXRlczsKIAogCXU2NCBzZWFyY2hfc3RhcnQ7CiAJdTY0IGV4dGVudHNfZm91bmQ7CkBAIC0xODQsNyArMTg3LDYgQEAKIAl1bnNpZ25lZCBpbnQgY3JlYXRlX3JlbG9jX3RyZWU6MTsKIAl1bnNpZ25lZCBpbnQgbWVyZ2VfcmVsb2NfdHJlZToxOwogCXVuc2lnbmVkIGludCBmb3VuZF9maWxlX2V4dGVudDoxOwotCXVuc2lnbmVkIGludCBjb21taXRfdHJhbnNhY3Rpb246MTsKIH07CiAKIC8qIHN0YWdlcyBvZiBkYXRhIHJlbG9jYXRpb24gKi8KQEAgLTIzMDksOSArMjMxMSw2IEBACiAJCXJlbG9jX3Jvb3QgPSBsaXN0X2VudHJ5KGxpc3QtPm5leHQsIHN0cnVjdCBidHJmc19yb290LAogCQkJCQlyb290X2xpc3QpOwogCQlfX2RlbF9yZWxvY19yb290KHJlbG9jX3Jvb3QpOwotCQlmcmVlX2V4dGVudF9idWZmZXIocmVsb2Nfcm9vdC0+bm9kZSk7Ci0JCWZyZWVfZXh0ZW50X2J1ZmZlcihyZWxvY19yb290LT5jb21taXRfcm9vdCk7Ci0JCWtmcmVlKHJlbG9jX3Jvb3QpOwogCX0KIH0KIApAQCAtMjM1MywxMCArMjM1Miw5IEBACiAKIAkJCXJldCA9IG1lcmdlX3JlbG9jX3Jvb3QocmMsIHJvb3QpOwogCQkJaWYgKHJldCkgewotCQkJCV9fZGVsX3JlbG9jX3Jvb3QocmVsb2Nfcm9vdCk7Ci0JCQkJZnJlZV9leHRlbnRfYnVmZmVyKHJlbG9jX3Jvb3QtPm5vZGUpOwotCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyZWxvY19yb290LT5jb21taXRfcm9vdCk7Ci0JCQkJa2ZyZWUocmVsb2Nfcm9vdCk7CisJCQkJaWYgKGxpc3RfZW1wdHkoJnJlbG9jX3Jvb3QtPnJvb3RfbGlzdCkpCisJCQkJCWxpc3RfYWRkX3RhaWwoJnJlbG9jX3Jvb3QtPnJvb3RfbGlzdCwKKwkJCQkJCSAgICAgICZyZWxvY19yb290cyk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0yNDUyLDcgKzI0NTAsNyBAQAogc3RydWN0IGJ0cmZzX3Jvb3QgKnNlbGVjdF9yZWxvY19yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSAgICAgc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjLAogCQkJCSAgICAgc3RydWN0IGJhY2tyZWZfbm9kZSAqbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBiYWNrcmVmX2VkZ2UgKmVkZ2VzW10sIGludCAqbnIpCisJCQkJICAgICBzdHJ1Y3QgYmFja3JlZl9lZGdlICplZGdlc1tdKQogewogCXN0cnVjdCBiYWNrcmVmX25vZGUgKm5leHQ7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CkBAIC0yNDk0LDcgKzI0OTIsNiBAQAogCWlmICghcm9vdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQkqbnIgPSBpbmRleDsKIAluZXh0ID0gbm9kZTsKIAkvKiBzZXR1cCBiYWNrcmVmIG5vZGUgcGF0aCBmb3IgYnRyZnNfcmVsb2NfY293X2Jsb2NrICovCiAJd2hpbGUgKDEpIHsKQEAgLTI1OTAsMjggKzI1ODcsMzYgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IHJjLT5leHRlbnRfcm9vdDsKIAl1NjQgbnVtX2J5dGVzOwogCWludCByZXQ7CisJdTY0IHRtcDsKIAogCW51bV9ieXRlcyA9IGNhbGN1X21ldGFkYXRhX3NpemUocmMsIG5vZGUsIDEpICogMjsKIAogCXRyYW5zLT5ibG9ja19yc3YgPSByYy0+YmxvY2tfcnN2OwotCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQocm9vdCwgcmMtPmJsb2NrX3JzdiwgbnVtX2J5dGVzLAotCQkJCSAgQlRSRlNfUkVTRVJWRV9GTFVTSF9BTEwpOworCXJjLT5yZXNlcnZlZF9ieXRlcyArPSBudW1fYnl0ZXM7CisJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X3JlZmlsbChyb290LCByYy0+YmxvY2tfcnN2LCBudW1fYnl0ZXMsCisJCQkJQlRSRlNfUkVTRVJWRV9GTFVTSF9BTEwpOwogCWlmIChyZXQpIHsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQotCQkJcmMtPmNvbW1pdF90cmFuc2FjdGlvbiA9IDE7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJdG1wID0gcmMtPmV4dGVudF9yb290LT5ub2Rlc2l6ZSAqCisJCQkJUkVMT0NBVElPTl9SRVNFUlZFRF9OT0RFUzsKKwkJCXdoaWxlICh0bXAgPD0gcmMtPnJlc2VydmVkX2J5dGVzKQorCQkJCXRtcCA8PD0gMTsKKwkJCS8qCisJCQkgKiBvbmx5IG9uZSB0aHJlYWQgY2FuIGFjY2VzcyBibG9ja19yc3YgYXQgdGhpcyBwb2ludCwKKwkJCSAqIHNvIHdlIGRvbid0IG5lZWQgaG9sZCBsb2NrIHRvIHByb3RlY3QgYmxvY2tfcnN2LgorCQkJICogd2UgZXhwYW5kIG1vcmUgcmVzZXJ2YXRpb24gc2l6ZSBoZXJlIHRvIGFsbG93IGVub3VnaAorCQkJICogc3BhY2UgZm9yIHJlbG9jYXRpb24gYW5kIHdlIHdpbGwgcmV0dXJuIGVhaWxlciBpbgorCQkJICogZW5vc3BjIGNhc2UuCisJCQkgKi8KKwkJCXJjLT5ibG9ja19yc3YtPnNpemUgPSB0bXAgKyByYy0+ZXh0ZW50X3Jvb3QtPm5vZGVzaXplICoKKwkJCQkJICAgICAgUkVMT0NBVElPTl9SRVNFUlZFRF9OT0RFUzsKKwkJfQogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21ldGFkYXRhX3NwYWNlKHN0cnVjdCByZWxvY19jb250cm9sICpyYywKLQkJCQkgICBzdHJ1Y3QgYmFja3JlZl9ub2RlICpub2RlKQotewotCXU2NCBudW1fYnl0ZXMgPSBjYWxjdV9tZXRhZGF0YV9zaXplKHJjLCBub2RlLCAwKSAqIDI7Ci0JYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2UocmMtPmV4dGVudF9yb290LCByYy0+YmxvY2tfcnN2LCBudW1fYnl0ZXMpOwotfQotCiAvKgogICogcmVsb2NhdGUgYSBibG9jayB0cmVlLCBhbmQgdGhlbiB1cGRhdGUgcG9pbnRlcnMgaW4gdXBwZXIgbGV2ZWwKICAqIGJsb2NrcyB0aGF0IHJlZmVyZW5jZSB0aGUgYmxvY2sgdG8gcG9pbnQgdG8gdGhlIG5ldyBsb2NhdGlvbi4KQEAgLTI2MzMsNyArMjYzOCw2IEBACiAJdTMyIGJsb2Nrc2l6ZTsKIAl1NjQgYnl0ZW5yOwogCXU2NCBnZW5lcmF0aW9uOwotCWludCBucjsKIAlpbnQgc2xvdDsKIAlpbnQgcmV0OwogCWludCBlcnIgPSAwOwpAQCAtMjY0Niw3ICsyNjUwLDcgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAKIAkJdXBwZXIgPSBlZGdlLT5ub2RlW1VQUEVSXTsKLQkJcm9vdCA9IHNlbGVjdF9yZWxvY19yb290KHRyYW5zLCByYywgdXBwZXIsIGVkZ2VzLCAmbnIpOworCQlyb290ID0gc2VsZWN0X3JlbG9jX3Jvb3QodHJhbnMsIHJjLCB1cHBlciwgZWRnZXMpOwogCQlCVUdfT04oIXJvb3QpOwogCiAJCWlmICh1cHBlci0+ZWIgJiYgIXVwcGVyLT5sb2NrZWQpIHsKQEAgLTI4OTgsNyArMjkwMiw2IEBACiAJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7Ci0JaW50IHJlbGVhc2UgPSAwOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFub2RlKQpAQCAtMjkxNSw3ICsyOTE4LDYgQEAKIAkJcmV0ID0gcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZSh0cmFucywgcmMsIG5vZGUpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7Ci0JCXJlbGVhc2UgPSAxOwogCX0KIAogCWlmIChyb290KSB7CkBAIC0yOTQwLDExICsyOTQyLDggQEAKIAkJcmV0ID0gZG9fcmVsb2NhdGlvbih0cmFucywgcmMsIG5vZGUsIGtleSwgcGF0aCwgMSk7CiAJfQogb3V0OgotCWlmIChyZXQgfHwgbm9kZS0+bGV2ZWwgPT0gMCB8fCBub2RlLT5jb3dvbmx5KSB7Ci0JCWlmIChyZWxlYXNlKQotCQkJcmVsZWFzZV9tZXRhZGF0YV9zcGFjZShyYywgbm9kZSk7CisJaWYgKHJldCB8fCBub2RlLT5sZXZlbCA9PSAwIHx8IG5vZGUtPmNvd29ubHkpCiAJCXJlbW92ZV9iYWNrcmVmX25vZGUoJnJjLT5iYWNrcmVmX2NhY2hlLCBub2RlKTsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzg2NywyOSArMzg2NiwyMCBAQAogaW50IHByZXBhcmVfdG9fcmVsb2NhdGUoc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjKQogewogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwotCWludCByZXQ7CiAKIAlyYy0+YmxvY2tfcnN2ID0gYnRyZnNfYWxsb2NfYmxvY2tfcnN2KHJjLT5leHRlbnRfcm9vdCwKIAkJCQkJICAgICAgQlRSRlNfQkxPQ0tfUlNWX1RFTVApOwogCWlmICghcmMtPmJsb2NrX3JzdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKgotCSAqIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgY3JlYXRpbmcgcmVsb2MgdHJlZXMuCi0JICogYnRyZnNfaW5pdF9yZWxvY19yb290IHdpbGwgdXNlIHRoZW0gd2hlbiB0aGVyZQotCSAqIGlzIG5vIHJlc2VydmF0aW9uIGluIHRyYW5zYWN0aW9uIGhhbmRsZS4KLQkgKi8KLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkKHJjLT5leHRlbnRfcm9vdCwgcmMtPmJsb2NrX3JzdiwKLQkJCQkgIHJjLT5leHRlbnRfcm9vdC0+bm9kZXNpemUgKiAyNTYsCi0JCQkJICBCVFJGU19SRVNFUlZFX0ZMVVNIX0FMTCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCW1lbXNldCgmcmMtPmNsdXN0ZXIsIDAsIHNpemVvZihyYy0+Y2x1c3RlcikpOwogCXJjLT5zZWFyY2hfc3RhcnQgPSByYy0+YmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZDsKIAlyYy0+ZXh0ZW50c19mb3VuZCA9IDA7CiAJcmMtPm5vZGVzX3JlbG9jYXRlZCA9IDA7CiAJcmMtPm1lcmdpbmdfcnN2X3NpemUgPSAwOworCXJjLT5yZXNlcnZlZF9ieXRlcyA9IDA7CisJcmMtPmJsb2NrX3Jzdi0+c2l6ZSA9IHJjLT5leHRlbnRfcm9vdC0+bm9kZXNpemUgKgorCQkJICAgICAgUkVMT0NBVElPTl9SRVNFUlZFRF9OT0RFUzsKIAogCXJjLT5jcmVhdGVfcmVsb2NfdHJlZSA9IDE7CiAJc2V0X3JlbG9jX2NvbnRyb2wocmMpOwpAQCAtMzkzMyw2ICszOTIzLDE0IEBACiAJfQogCiAJd2hpbGUgKDEpIHsKKwkJcmMtPnJlc2VydmVkX2J5dGVzID0gMDsKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X3JlZmlsbChyYy0+ZXh0ZW50X3Jvb3QsCisJCQkJCXJjLT5ibG9ja19yc3YsIHJjLT5ibG9ja19yc3YtPnNpemUsCisJCQkJCUJUUkZTX1JFU0VSVkVfRkxVU0hfQUxMKTsKKwkJaWYgKHJldCkgeworCQkJZXJyID0gcmV0OworCQkJYnJlYWs7CisJCX0KIAkJcHJvZ3Jlc3MrKzsKIAkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QsIDApOwogCQlpZiAoSVNfRVJSKHRyYW5zKSkgewpAQCAtNDAxMSw2ICs0MDA5LDEyIEBACiAJCWlmICghUkJfRU1QVFlfUk9PVCgmYmxvY2tzKSkgewogCQkJcmV0ID0gcmVsb2NhdGVfdHJlZV9ibG9ja3ModHJhbnMsIHJjLCAmYmxvY2tzKTsKIAkJCWlmIChyZXQgPCAwKSB7CisJCQkJLyoKKwkJCQkgKiBpZiB3ZSBmYWlsIHRvIHJlbG9jYXRlIHRyZWUgYmxvY2tzLCBmb3JjZSB0byB1cGRhdGUKKwkJCQkgKiBiYWNrcmVmIGNhY2hlIHdoZW4gY29tbWl0dGluZyB0cmFuc2FjdGlvbi4KKwkJCQkgKi8KKwkJCQlyYy0+YmFja3JlZl9jYWNoZS5sYXN0X3RyYW5zID0gdHJhbnMtPnRyYW5zaWQgLSAxOworCiAJCQkJaWYgKHJldCAhPSAtRUFHQUlOKSB7CiAJCQkJCWVyciA9IHJldDsKIAkJCQkJYnJlYWs7CkBAIC00MDIwLDE0ICs0MDI0LDggQEAKIAkJCX0KIAkJfQogCi0JCWlmIChyYy0+Y29tbWl0X3RyYW5zYWN0aW9uKSB7Ci0JCQlyYy0+Y29tbWl0X3RyYW5zYWN0aW9uID0gMDsKLQkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcmMtPmV4dGVudF9yb290KTsKLQkJCUJVR19PTihyZXQpOwotCQl9IGVsc2UgewotCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByYy0+ZXh0ZW50X3Jvb3QpOwotCQkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyYy0+ZXh0ZW50X3Jvb3QpOwotCQl9CisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcmMtPmV4dGVudF9yb290KTsKKwkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyYy0+ZXh0ZW50X3Jvb3QpOwogCQl0cmFucyA9IE5VTEw7CiAKIAkJaWYgKHJjLT5zdGFnZSA9PSBNT1ZFX0RBVEFfRVhURU5UUyAmJgpAQCAtNDI0Nyw3ICs0MjQ1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHJlbG9jYXRpbmcgYmxvY2sgZ3JvdXAgJWxsdSBmbGFncyAlbGx1XG4iLAorCWJ0cmZzX2luZm8oZXh0ZW50X3Jvb3QtPmZzX2luZm8sICJyZWxvY2F0aW5nIGJsb2NrIGdyb3VwICVsbHUgZmxhZ3MgJWxsdSIsCiAJICAgICAgIHJjLT5ibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkLCByYy0+YmxvY2tfZ3JvdXAtPmZsYWdzKTsKIAogCXJldCA9IGJ0cmZzX3N0YXJ0X2RlbGFsbG9jX3Jvb3RzKGZzX2luZm8sIDApOwpAQCAtNDI2OSw3ICs0MjY3LDcgQEAKIAkJaWYgKHJjLT5leHRlbnRzX2ZvdW5kID09IDApCiAJCQlicmVhazsKIAotCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZm91bmQgJWxsdSBleHRlbnRzXG4iLAorCQlidHJmc19pbmZvKGV4dGVudF9yb290LT5mc19pbmZvLCAiZm91bmQgJWxsdSBleHRlbnRzIiwKIAkJCXJjLT5leHRlbnRzX2ZvdW5kKTsKIAogCQlpZiAocmMtPnN0YWdlID09IE1PVkVfREFUQV9FWFRFTlRTICYmIHJjLT5mb3VuZF9maWxlX2V4dGVudCkgewpAQCAtNDI4NSwxMSArNDI4Myw2IEBACiAJCX0KIAl9CiAKLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcsCi0JCQkJICAgICByYy0+YmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCwKLQkJCQkgICAgIHJjLT5ibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKLQkJCQkgICAgIHJjLT5ibG9ja19ncm91cC0+a2V5Lm9mZnNldCAtIDEpOwotCiAJV0FSTl9PTihyYy0+YmxvY2tfZ3JvdXAtPnBpbm5lZCA+IDApOwogCVdBUk5fT04ocmMtPmJsb2NrX2dyb3VwLT5yZXNlcnZlZCA+IDApOwogCVdBUk5fT04oYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmcmMtPmJsb2NrX2dyb3VwLT5pdGVtKSA+IDApOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcm9vdC10cmVlLmMgYi9mcy9idHJmcy9yb290LXRyZWUuYwppbmRleCBlYzcxZWE0Li4xMzg5YjY5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9yb290LXRyZWUuYworKysgYi9mcy9idHJmcy9yb290LXRyZWUuYwpAQCAtNDQsNyArNDQsNyBAQAogCWlmICghbmVlZF9yZXNldCAmJiBidHJmc19yb290X2dlbmVyYXRpb24oaXRlbSkKIAkJIT0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uX3YyKGl0ZW0pKSB7CiAJCWlmIChidHJmc19yb290X2dlbmVyYXRpb25fdjIoaXRlbSkgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IG1pc21hdGNoaW5nICIKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUUkZTOiBtaXNtYXRjaGluZyAiCiAJCQkJCSJnZW5lcmF0aW9uIGFuZCBnZW5lcmF0aW9uX3YyICIKIAkJCQkJImZvdW5kIGluIHJvb3QgaXRlbS4gVGhpcyByb290ICIKIAkJCQkJIndhcyBwcm9iYWJseSBtb3VudGVkIHdpdGggYW4gIgpAQCAtMTU0LDcgKzE1NCw3IEBACiAKIAlpZiAocmV0ICE9IDApIHsKIAkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBwYXRoLT5ub2Rlc1swXSk7Ci0JCXByaW50ayhLRVJOX0NSSVQgInVuYWJsZSB0byB1cGRhdGUgcm9vdCBrZXkgJWxsdSAldSAlbGx1XG4iLAorCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sICJ1bmFibGUgdG8gdXBkYXRlIHJvb3Qga2V5ICVsbHUgJXUgJWxsdSIsCiAJCSAgICAgICBrZXktPm9iamVjdGlkLCBrZXktPnR5cGUsIGtleS0+b2Zmc2V0KTsKIAkJQlVHX09OKDEpOwogCX0KQEAgLTQwMCwyMSArNDAwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgYnRyZnNfZmluZF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAotCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJICAgdTY0IHJvb3RfaWQsIHU2NCByZWZfaWQpCi17Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0JaW50IHJldDsKLQotCWtleS5vYmplY3RpZCA9IHJvb3RfaWQ7Ci0Ja2V5LnR5cGUgPSBCVFJGU19ST09UX1JFRl9LRVk7Ci0Ja2V5Lm9mZnNldCA9IHJlZl9pZDsKLQotCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHRyZWVfcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIGFkZCBhIGJ0cmZzX3Jvb3RfcmVmIGl0ZW0uICB0eXBlIGlzIGVpdGhlciBCVFJGU19ST09UX1JFRl9LRVkKICAqIG9yIEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkuCmRpZmYgLS1naXQgYS9mcy9idHJmcy9zY3J1Yi5jIGIvZnMvYnRyZnMvc2NydWIuYwppbmRleCAxZmQzZjMzLi5lZmJhNWQxIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zY3J1Yi5jCisrKyBiL2ZzL2J0cmZzL3NjcnViLmMKQEAgLTI1Niw2ICsyNTYsOCBAQAogc3RhdGljIGludCBjb3B5X25vY293X3BhZ2VzKHN0cnVjdCBzY3J1Yl9jdHggKnNjdHgsIHU2NCBsb2dpY2FsLCB1NjQgbGVuLAogCQkJICAgIGludCBtaXJyb3JfbnVtLCB1NjQgcGh5c2ljYWxfZm9yX2Rldl9yZXBsYWNlKTsKIHN0YXRpYyB2b2lkIGNvcHlfbm9jb3dfcGFnZXNfd29ya2VyKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKK3N0YXRpYyB2b2lkIF9fc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOworc3RhdGljIHZvaWQgc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOwogCiAKIHN0YXRpYyB2b2lkIHNjcnViX3BlbmRpbmdfYmlvX2luYyhzdHJ1Y3Qgc2NydWJfY3R4ICpzY3R4KQpAQCAtMjY5LDYgKzI3MSwyOSBAQAogCXdha2VfdXAoJnNjdHgtPmxpc3Rfd2FpdCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJd2hpbGUgKGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpKSB7CisJCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisJCXdhaXRfZXZlbnQoZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCwKKwkJICAgYXRvbWljX3JlYWQoJmZzX2luZm8tPnNjcnViX3BhdXNlX3JlcSkgPT0gMCk7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJYXRvbWljX2luYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7CisJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CisKKwltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKKwlfX3NjcnViX2Jsb2NrZWRfaWZfbmVlZGVkKGZzX2luZm8pOworCWF0b21pY19kZWMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisKKwl3YWtlX3VwKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKK30KKwogLyoKICAqIHVzZWQgZm9yIHdvcmtlcnMgdGhhdCByZXF1aXJlIHRyYW5zYWN0aW9uIGNvbW1pdHMgKGkuZS4sIGZvciB0aGUKICAqIE5PQ09XIGNhc2UpCkBAIC00ODAsNyArNTA1LDcgQEAKIAkgKiBob2xkIGFsbCBvZiB0aGUgcGF0aHMgaGVyZQogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBpcGF0aC0+ZnNwYXRoLT5lbGVtX2NudDsgKytpKQotCQlwcmludGtfaW5fcmN1KEtFUk5fV0FSTklORyAiYnRyZnM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgorCQlwcmludGtfaW5fcmN1KEtFUk5fV0FSTklORyAiQlRSRlM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgogCQkJIiVzLCBzZWN0b3IgJWxsdSwgcm9vdCAlbGx1LCBpbm9kZSAlbGx1LCBvZmZzZXQgJWxsdSwgIgogCQkJImxlbmd0aCAlbGx1LCBsaW5rcyAldSAocGF0aDogJXMpXG4iLCBzd2Fybi0+ZXJyc3RyLAogCQkJc3dhcm4tPmxvZ2ljYWwsIHJjdV9zdHJfZGVyZWYoc3dhcm4tPmRldi0+bmFtZSksCkBAIC00OTIsNyArNTE3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXByaW50a19pbl9yY3UoS0VSTl9XQVJOSU5HICJidHJmczogJXMgYXQgbG9naWNhbCAlbGx1IG9uIGRldiAiCisJcHJpbnRrX2luX3JjdShLRVJOX1dBUk5JTkcgIkJUUkZTOiAlcyBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICIKIAkJIiVzLCBzZWN0b3IgJWxsdSwgcm9vdCAlbGx1LCBpbm9kZSAlbGx1LCBvZmZzZXQgJWxsdTogcGF0aCAiCiAJCSJyZXNvbHZpbmcgZmFpbGVkIHdpdGggcmV0PSVkXG4iLCBzd2Fybi0+ZXJyc3RyLAogCQlzd2Fybi0+bG9naWNhbCwgcmN1X3N0cl9kZXJlZihzd2Fybi0+ZGV2LT5uYW1lKSwKQEAgLTU1NSw3ICs1ODAsNyBAQAogCQkJcmV0ID0gdHJlZV9iYWNrcmVmX2Zvcl9leHRlbnQoJnB0ciwgZWIsIGVpLCBpdGVtX3NpemUsCiAJCQkJCQkJJnJlZl9yb290LCAmcmVmX2xldmVsKTsKIAkJCXByaW50a19pbl9yY3UoS0VSTl9XQVJOSU5HCi0JCQkJImJ0cmZzOiAlcyBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzLCAiCisJCQkJIkJUUkZTOiAlcyBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzLCAiCiAJCQkJInNlY3RvciAlbGx1OiBtZXRhZGF0YSAlcyAobGV2ZWwgJWQpIGluIHRyZWUgIgogCQkJCSIlbGx1XG4iLCBlcnJzdHIsIHN3YXJuLmxvZ2ljYWwsCiAJCQkJcmN1X3N0cl9kZXJlZihkZXYtPm5hbWUpLApAQCAtNzA0LDEzICs3MjksMTEgQEAKIAlzdHJ1Y3Qgc2NydWJfZml4dXBfbm9kYXRhc3VtICpmaXh1cDsKIAlzdHJ1Y3Qgc2NydWJfY3R4ICpzY3R4OwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zID0gTlVMTDsKLQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlpbnQgdW5jb3JyZWN0YWJsZSA9IDA7CiAKIAlmaXh1cCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NydWJfZml4dXBfbm9kYXRhc3VtLCB3b3JrKTsKIAlzY3R4ID0gZml4dXAtPnNjdHg7Ci0JZnNfaW5mbyA9IGZpeHVwLT5yb290LT5mc19pbmZvOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpIHsKQEAgLTc1OSw4ICs3ODIsOCBAQAogCQlidHJmc19kZXZfcmVwbGFjZV9zdGF0c19pbmMoCiAJCQkmc2N0eC0+ZGV2X3Jvb3QtPmZzX2luZm8tPmRldl9yZXBsYWNlLgogCQkJbnVtX3VuY29ycmVjdGFibGVfcmVhZF9lcnJvcnMpOwotCQlwcmludGtfcmF0ZWxpbWl0ZWRfaW5fcmN1KEtFUk5fRVJSCi0JCQkiYnRyZnM6IHVuYWJsZSB0byBmaXh1cCAobm9kYXRhc3VtKSBlcnJvciBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzXG4iLAorCQlwcmludGtfcmF0ZWxpbWl0ZWRfaW5fcmN1KEtFUk5fRVJSICJCVFJGUzogIgorCQkgICAgInVuYWJsZSB0byBmaXh1cCAobm9kYXRhc3VtKSBlcnJvciBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzXG4iLAogCQkJZml4dXAtPmxvZ2ljYWwsIHJjdV9zdHJfZGVyZWYoZml4dXAtPmRldi0+bmFtZSkpOwogCX0KIApAQCAtMTE2MSw3ICsxMTg0LDcgQEAKIAkJCXNjdHgtPnN0YXQuY29ycmVjdGVkX2Vycm9ycysrOwogCQkJc3Bpbl91bmxvY2soJnNjdHgtPnN0YXRfbG9jayk7CiAJCQlwcmludGtfcmF0ZWxpbWl0ZWRfaW5fcmN1KEtFUk5fRVJSCi0JCQkJImJ0cmZzOiBmaXhlZCB1cCBlcnJvciBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzXG4iLAorCQkJCSJCVFJGUzogZml4ZWQgdXAgZXJyb3IgYXQgbG9naWNhbCAlbGx1IG9uIGRldiAlc1xuIiwKIAkJCQlsb2dpY2FsLCByY3Vfc3RyX2RlcmVmKGRldi0+bmFtZSkpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTExNzAsNyArMTE5Myw3IEBACiAJCXNjdHgtPnN0YXQudW5jb3JyZWN0YWJsZV9lcnJvcnMrKzsKIAkJc3Bpbl91bmxvY2soJnNjdHgtPnN0YXRfbG9jayk7CiAJCXByaW50a19yYXRlbGltaXRlZF9pbl9yY3UoS0VSTl9FUlIKLQkJCSJidHJmczogdW5hYmxlIHRvIGZpeHVwIChyZWd1bGFyKSBlcnJvciBhdCBsb2dpY2FsICVsbHUgb24gZGV2ICVzXG4iLAorCQkJIkJUUkZTOiB1bmFibGUgdG8gZml4dXAgKHJlZ3VsYXIpIGVycm9yIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgJXNcbiIsCiAJCQlsb2dpY2FsLCByY3Vfc3RyX2RlcmVmKGRldi0+bmFtZSkpOwogCX0KIApAQCAtMTMwOCw3ICsxMzMxLDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWJpby0+YmlfYmRldiA9IHBhZ2UtPmRldi0+YmRldjsKLQkJYmlvLT5iaV9zZWN0b3IgPSBwYWdlLT5waHlzaWNhbCA+PiA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGFnZS0+cGh5c2ljYWwgPj4gOTsKIAogCQliaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLT5wYWdlLCBQQUdFX1NJWkUsIDApOwogCQlpZiAoYnRyZnNpY19zdWJtaXRfYmlvX3dhaXQoUkVBRCwgYmlvKSkKQEAgLTE0MTgsOCArMTQ0MSw5IEBACiAJCWludCByZXQ7CiAKIAkJaWYgKCFwYWdlX2JhZC0+ZGV2LT5iZGV2KSB7Ci0JCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCi0JCQkJImJ0cmZzOiBzY3J1Yl9yZXBhaXJfcGFnZV9mcm9tX2dvb2RfY29weShiZGV2ID09IE5VTEwpIGlzIHVuZXhwZWN0ZWQhXG4iKTsKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIkJUUkZTOiAiCisJCQkJInNjcnViX3JlcGFpcl9wYWdlX2Zyb21fZ29vZF9jb3B5KGJkZXYgPT0gTlVMTCkgIgorCQkJCSJpcyB1bmV4cGVjdGVkIVxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCkBAIC0xNDI3LDcgKzE0NTEsNyBAQAogCQlpZiAoIWJpbykKIAkJCXJldHVybiAtRUlPOwogCQliaW8tPmJpX2JkZXYgPSBwYWdlX2JhZC0+ZGV2LT5iZGV2OwotCQliaW8tPmJpX3NlY3RvciA9IHBhZ2VfYmFkLT5waHlzaWNhbCA+PiA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGFnZV9iYWQtPnBoeXNpY2FsID4+IDk7CiAKIAkJcmV0ID0gYmlvX2FkZF9wYWdlKGJpbywgcGFnZV9nb29kLT5wYWdlLCBQQUdFX1NJWkUsIDApOwogCQlpZiAoUEFHRV9TSVpFICE9IHJldCkgewpAQCAtMTUyMCw3ICsxNTQ0LDcgQEAKIAkJYmlvLT5iaV9wcml2YXRlID0gc2JpbzsKIAkJYmlvLT5iaV9lbmRfaW8gPSBzY3J1Yl93cl9iaW9fZW5kX2lvOwogCQliaW8tPmJpX2JkZXYgPSBzYmlvLT5kZXYtPmJkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gc2Jpby0+cGh5c2ljYWwgPj4gOTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNiaW8tPnBoeXNpY2FsID4+IDk7CiAJCXNiaW8tPmVyciA9IDA7CiAJfSBlbHNlIGlmIChzYmlvLT5waHlzaWNhbCArIHNiaW8tPnBhZ2VfY291bnQgKiBQQUdFX1NJWkUgIT0KIAkJICAgc3BhZ2UtPnBoeXNpY2FsX2Zvcl9kZXZfcmVwbGFjZSB8fApAQCAtMTg3Nyw3ICsxOTAxLDcgQEAKIAkJICogVGhpcyBjYXNlIGlzIGhhbmRsZWQgY29ycmVjdGx5IChidXQgX3ZlcnlfIHNsb3dseSkuCiAJCSAqLwogCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCi0JCQkiYnRyZnM6IHNjcnViX3N1Ym1pdChiaW8gYmRldiA9PSBOVUxMKSBpcyB1bmV4cGVjdGVkIVxuIik7CisJCQkiQlRSRlM6IHNjcnViX3N1Ym1pdChiaW8gYmRldiA9PSBOVUxMKSBpcyB1bmV4cGVjdGVkIVxuIik7CiAJCWJpb19lbmRpbyhzYmlvLT5iaW8sIC1FSU8pOwogCX0gZWxzZSB7CiAJCWJ0cmZzaWNfc3VibWl0X2JpbyhSRUFELCBzYmlvLT5iaW8pOwpAQCAtMTkyNiw3ICsxOTUwLDcgQEAKIAkJYmlvLT5iaV9wcml2YXRlID0gc2JpbzsKIAkJYmlvLT5iaV9lbmRfaW8gPSBzY3J1Yl9iaW9fZW5kX2lvOwogCQliaW8tPmJpX2JkZXYgPSBzYmlvLT5kZXYtPmJkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gc2Jpby0+cGh5c2ljYWwgPj4gOTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNiaW8tPnBoeXNpY2FsID4+IDk7CiAJCXNiaW8tPmVyciA9IDA7CiAJfSBlbHNlIGlmIChzYmlvLT5waHlzaWNhbCArIHNiaW8tPnBhZ2VfY291bnQgKiBQQUdFX1NJWkUgIT0KIAkJICAgc3BhZ2UtPnBoeXNpY2FsIHx8CkBAIC0yMjg2LDggKzIzMTAsNyBAQAogCiAJd2FpdF9ldmVudChzY3R4LT5saXN0X3dhaXQsCiAJCSAgIGF0b21pY19yZWFkKCZzY3R4LT5iaW9zX2luX2ZsaWdodCkgPT0gMCk7Ci0JYXRvbWljX2luYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7Ci0Jd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CisJc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoZnNfaW5mbyk7CiAKIAkvKiBGSVhNRSBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gc3RhcnQgcmVhZGFoZWFkIGF0IGNvbW1pdCByb290ICovCiAJa2V5X3N0YXJ0Lm9iamVjdGlkID0gbG9naWNhbDsKQEAgLTIzMTEsMTYgKzIzMzQsNiBAQAogCWlmICghSVNfRVJSKHJlYWRhMikpCiAJCWJ0cmZzX3JlYWRhX3dhaXQocmVhZGEyKTsKIAotCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCXdoaWxlIChhdG9taWNfcmVhZCgmZnNfaW5mby0+c2NydWJfcGF1c2VfcmVxKSkgewotCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCQl3YWl0X2V2ZW50KGZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQsCi0JCSAgIGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpID09IDApOwotCQltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQl9Ci0JYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQl3YWtlX3VwKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKIAogCS8qCiAJICogY29sbGVjdCBhbGwgZGF0YSBjc3VtcyBmb3IgdGhlIHN0cmlwZSB0byBhdm9pZCBzZWVraW5nIGR1cmluZwpAQCAtMjM1NywyMiArMjM3MCwxNCBAQAogCQkJd2FpdF9ldmVudChzY3R4LT5saXN0X3dhaXQsCiAJCQkJICAgYXRvbWljX3JlYWQoJnNjdHgtPmJpb3NfaW5fZmxpZ2h0KSA9PSAwKTsKIAkJCWF0b21pY19zZXQoJnNjdHgtPndyX2N0eC5mbHVzaF9hbGxfd3JpdGVzLCAwKTsKLQkJCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOwotCQkJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7Ci0JCQltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQkJCXdoaWxlIChhdG9taWNfcmVhZCgmZnNfaW5mby0+c2NydWJfcGF1c2VfcmVxKSkgewotCQkJCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7Ci0JCQkJd2FpdF9ldmVudChmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0LAotCQkJCSAgIGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpID09IDApOwotCQkJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCQkJfQotCQkJYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7Ci0JCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCQkJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CisJCQlzY3J1Yl9ibG9ja2VkX2lmX25lZWRlZChmc19pbmZvKTsKIAkJfQogCisJCWlmIChidHJmc19mc19pbmNvbXBhdChmc19pbmZvLCBTS0lOTllfTUVUQURBVEEpKQorCQkJa2V5LnR5cGUgPSBCVFJGU19NRVRBREFUQV9JVEVNX0tFWTsKKwkJZWxzZQorCQkJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CiAJCWtleS5vYmplY3RpZCA9IGxvZ2ljYWw7Ci0JCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwogCQlrZXkub2Zmc2V0ID0gKHU2NCktMTsKIAogCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKQEAgLTIzODAsOCArMjM4NSw3IEBACiAJCQlnb3RvIG91dDsKIAogCQlpZiAocmV0ID4gMCkgewotCQkJcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShyb290LCBwYXRoLCAwLAotCQkJCQkJICBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCQkJcmV0ID0gYnRyZnNfcHJldmlvdXNfZXh0ZW50X2l0ZW0ocm9vdCwgcGF0aCwgMCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJCWlmIChyZXQgPiAwKSB7CkBAIC0yNDM5LDkgKzI0NDMsOSBAQAogCiAJCQlpZiAoa2V5Lm9iamVjdGlkIDwgbG9naWNhbCAmJgogCQkJICAgIChmbGFncyAmIEJUUkZTX0VYVEVOVF9GTEFHX1RSRUVfQkxPQ0spKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJidHJmcyBzY3J1YjogdHJlZSBibG9jayAlbGx1IHNwYW5uaW5nICIKLQkJCQkgICAgICAgInN0cmlwZXMsIGlnbm9yZWQuIGxvZ2ljYWw9JWxsdVxuIiwKKwkJCQlidHJmc19lcnIoZnNfaW5mbywKKwkJCQkJICAgInNjcnViOiB0cmVlIGJsb2NrICVsbHUgc3Bhbm5pbmcgIgorCQkJCQkgICAic3RyaXBlcywgaWdub3JlZC4gbG9naWNhbD0lbGx1IiwKIAkJCQkgICAgICAga2V5Lm9iamVjdGlkLCBsb2dpY2FsKTsKIAkJCQlnb3RvIG5leHQ7CiAJCQl9CkBAIC0yNjgzLDIxICsyNjg3LDkgQEAKIAkJd2FpdF9ldmVudChzY3R4LT5saXN0X3dhaXQsCiAJCQkgICBhdG9taWNfcmVhZCgmc2N0eC0+Ymlvc19pbl9mbGlnaHQpID09IDApOwogCQlhdG9taWNfc2V0KCZzY3R4LT53cl9jdHguZmx1c2hfYWxsX3dyaXRlcywgMCk7Ci0JCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOwotCQl3YWtlX3VwKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKIAkJd2FpdF9ldmVudChzY3R4LT5saXN0X3dhaXQsCiAJCQkgICBhdG9taWNfcmVhZCgmc2N0eC0+d29ya2Vyc19wZW5kaW5nKSA9PSAwKTsKLQotCQltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpKSB7Ci0JCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCQkJd2FpdF9ldmVudChmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0LAotCQkJICAgYXRvbWljX3JlYWQoJmZzX2luZm8tPnNjcnViX3BhdXNlX3JlcSkgPT0gMCk7Ci0JCQltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQkJfQotCQlhdG9taWNfZGVjKCZmc19pbmZvLT5zY3J1YnNfcGF1c2VkKTsKLQkJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQkJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CisJCXNjcnViX2Jsb2NrZWRfaWZfbmVlZGVkKGZzX2luZm8pOwogCiAJCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7CiAJCWlmIChyZXQpCkBAIC0yODIzLDggKzI4MTUsOCBAQAogCSAqIGNoZWNrIHNvbWUgYXNzdW1wdGlvbnMKIAkgKi8KIAlpZiAoZnNfaW5mby0+Y2h1bmtfcm9vdC0+bm9kZXNpemUgIT0gZnNfaW5mby0+Y2h1bmtfcm9vdC0+bGVhZnNpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYnRyZnNfc2NydWI6IHNpemUgYXNzdW1wdGlvbiBub2Rlc2l6ZSA9PSBsZWFmc2l6ZSAoJWQgPT0gJWQpIGZhaWxzXG4iLAorCQlidHJmc19lcnIoZnNfaW5mbywKKwkJCSAgICJzY3J1Yjogc2l6ZSBhc3N1bXB0aW9uIG5vZGVzaXplID09IGxlYWZzaXplICglZCA9PSAlZCkgZmFpbHMiLAogCQkgICAgICAgZnNfaW5mby0+Y2h1bmtfcm9vdC0+bm9kZXNpemUsCiAJCSAgICAgICBmc19pbmZvLT5jaHVua19yb290LT5sZWFmc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjgzNiwxNiArMjgyOCwxNyBAQAogCQkgKiB0aGUgd2F5IHNjcnViIGlzIGltcGxlbWVudGVkLiBEbyBub3QgaGFuZGxlIHRoaXMKIAkJICogc2l0dWF0aW9uIGF0IGFsbCBiZWNhdXNlIGl0IHdvbid0IGV2ZXIgaGFwcGVuLgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYnRyZnNfc2NydWI6IHNpemUgYXNzdW1wdGlvbiBub2Rlc2l6ZSA8PSBCVFJGU19TVFJJUEVfTEVOICglZCA8PSAlZCkgZmFpbHNcbiIsCisJCWJ0cmZzX2Vycihmc19pbmZvLAorCQkJICAgInNjcnViOiBzaXplIGFzc3VtcHRpb24gbm9kZXNpemUgPD0gQlRSRlNfU1RSSVBFX0xFTiAoJWQgPD0gJWQpIGZhaWxzIiwKIAkJICAgICAgIGZzX2luZm8tPmNodW5rX3Jvb3QtPm5vZGVzaXplLCBCVFJGU19TVFJJUEVfTEVOKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGZzX2luZm8tPmNodW5rX3Jvb3QtPnNlY3RvcnNpemUgIT0gUEFHRV9TSVpFKSB7CiAJCS8qIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGEgdy9vIGNoZWNrc3VtcyAqLwotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJidHJmc19zY3J1Yjogc2l6ZSBhc3N1bXB0aW9uIHNlY3RvcnNpemUgIT0gUEFHRV9TSVpFICglZCAhPSAlbHUpIGZhaWxzXG4iLAorCQlidHJmc19lcnIoZnNfaW5mbywKKwkJCSAgICJzY3J1Yjogc2l6ZSBhc3N1bXB0aW9uIHNlY3RvcnNpemUgIT0gUEFHRV9TSVpFICIKKwkJCSAgICIoJWQgIT0gJWx1KSBmYWlscyIsCiAJCSAgICAgICBmc19pbmZvLT5jaHVua19yb290LT5zZWN0b3JzaXplLCBQQUdFX1NJWkUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yODU4LDcgKzI4NTEsOCBAQAogCQkgKiB3b3VsZCBleGhhdXN0IHRoZSBhcnJheSBib3VuZHMgb2YgcGFnZXYgbWVtYmVyIGluCiAJCSAqIHN0cnVjdCBzY3J1Yl9ibG9jawogCQkgKi8KLQkJcHJfZXJyKCJidHJmc19zY3J1Yjogc2l6ZSBhc3N1bXB0aW9uIG5vZGVzaXplIGFuZCBzZWN0b3JzaXplIDw9IFNDUlVCX01BWF9QQUdFU19QRVJfQkxPQ0sgKCVkIDw9ICVkICYmICVkIDw9ICVkKSBmYWlsc1xuIiwKKwkJYnRyZnNfZXJyKGZzX2luZm8sICJzY3J1Yjogc2l6ZSBhc3N1bXB0aW9uIG5vZGVzaXplIGFuZCBzZWN0b3JzaXplICIKKwkJCSAgICI8PSBTQ1JVQl9NQVhfUEFHRVNfUEVSX0JMT0NLICglZCA8PSAlZCAmJiAlZCA8PSAlZCkgZmFpbHMiLAogCQkgICAgICAgZnNfaW5mby0+Y2h1bmtfcm9vdC0+bm9kZXNpemUsCiAJCSAgICAgICBTQ1JVQl9NQVhfUEFHRVNfUEVSX0JMT0NLLAogCQkgICAgICAgZnNfaW5mby0+Y2h1bmtfcm9vdC0+c2VjdG9yc2l6ZSwKQEAgLTI5MDgsNyArMjkwMiwxMyBAQAogCX0KIAlzY3R4LT5yZWFkb25seSA9IHJlYWRvbmx5OwogCWRldi0+c2NydWJfZGV2aWNlID0gc2N0eDsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKIAorCS8qCisJICogY2hlY2tpbmcgQHNjcnViX3BhdXNlX3JlcSBoZXJlLCB3ZSBjYW4gYXZvaWQKKwkgKiByYWNlIGJldHdlZW4gY29tbWl0dGluZyB0cmFuc2FjdGlvbiBhbmQgc2NydWJiaW5nLgorCSAqLworCV9fc2NydWJfYmxvY2tlZF9pZl9uZWVkZWQoZnNfaW5mbyk7CiAJYXRvbWljX2luYygmZnNfaW5mby0+c2NydWJzX3J1bm5pbmcpOwogCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CiAKQEAgLTI5MTcsOSArMjkxNywxMCBAQAogCQkgKiBieSBob2xkaW5nIGRldmljZSBsaXN0IG11dGV4LCB3ZSBjYW4KIAkJICoga2ljayBvZmYgd3JpdGluZyBzdXBlciBpbiBsb2cgdHJlZSBzeW5jLgogCQkgKi8KKwkJbXV0ZXhfbG9jaygmZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCQlyZXQgPSBzY3J1Yl9zdXBlcnMoc2N0eCwgZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5mc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAJfQotCW11dGV4X3VubG9jaygmZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCiAJaWYgKCFyZXQpCiAJCXJldCA9IHNjcnViX2VudW1lcmF0ZV9jaHVua3Moc2N0eCwgZGV2LCBzdGFydCwgZW5kLApAQCAtMzE2Nyw3ICszMTY4LDggQEAKIAlyZXQgPSBpdGVyYXRlX2lub2Rlc19mcm9tX2xvZ2ljYWwobG9naWNhbCwgZnNfaW5mbywgcGF0aCwKIAkJCQkJICByZWNvcmRfaW5vZGVfZm9yX25vY293LCBub2Nvd19jdHgpOwogCWlmIChyZXQgIT0gMCAmJiByZXQgIT0gLUVOT0VOVCkgewotCQlwcl93YXJuKCJpdGVyYXRlX2lub2Rlc19mcm9tX2xvZ2ljYWwoKSBmYWlsZWQ6IGxvZyAlbGx1LCBwaHlzICVsbHUsIGxlbiAlbGx1LCBtaXIgJXUsIHJldCAlZFxuIiwKKwkJYnRyZnNfd2Fybihmc19pbmZvLCAiaXRlcmF0ZV9pbm9kZXNfZnJvbV9sb2dpY2FsKCkgZmFpbGVkOiBsb2cgJWxsdSwgIgorCQkJInBoeXMgJWxsdSwgbGVuICVsbHUsIG1pciAldSwgcmV0ICVkIiwKIAkJCWxvZ2ljYWwsIHBoeXNpY2FsX2Zvcl9kZXZfcmVwbGFjZSwgbGVuLCBtaXJyb3JfbnVtLAogCQkJcmV0KTsKIAkJbm90X3dyaXR0ZW4gPSAxOwpAQCAtMzI4OSw3ICszMjkxLDcgQEAKIGFnYWluOgogCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwgR0ZQX05PRlMpOwogCQlpZiAoIXBhZ2UpIHsKLQkJCXByX2VycigiZmluZF9vcl9jcmVhdGVfcGFnZSgpIGZhaWxlZFxuIik7CisJCQlidHJmc19lcnIoZnNfaW5mbywgImZpbmRfb3JfY3JlYXRlX3BhZ2UoKSBmYWlsZWQiKTsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMzM2MSw3ICszMzYzLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJaWYgKCFkZXYtPmJkZXYpIHsKIAkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORwotCQkJImJ0cmZzOiBzY3J1YiB3cml0ZV9wYWdlX25vY293KGJkZXYgPT0gTlVMTCkgaXMgdW5leHBlY3RlZCFcbiIpOworCQkJIkJUUkZTOiBzY3J1YiB3cml0ZV9wYWdlX25vY293KGJkZXYgPT0gTlVMTCkgaXMgdW5leHBlY3RlZCFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJYmlvID0gYnRyZnNfaW9fYmlvX2FsbG9jKEdGUF9OT0ZTLCAxKTsKQEAgLTMzNzEsOCArMzM3Myw4IEBACiAJCXNwaW5fdW5sb2NrKCZzY3R4LT5zdGF0X2xvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JYmlvLT5iaV9zaXplID0gMDsKLQliaW8tPmJpX3NlY3RvciA9IHBoeXNpY2FsX2Zvcl9kZXZfcmVwbGFjZSA+PiA5OworCWJpby0+YmlfaXRlci5iaV9zaXplID0gMDsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGh5c2ljYWxfZm9yX2Rldl9yZXBsYWNlID4+IDk7CiAJYmlvLT5iaV9iZGV2ID0gZGV2LT5iZGV2OwogCXJldCA9IGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfQ0FDSEVfU0laRSwgMCk7CiAJaWYgKHJldCAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NlbmQuYyBiL2ZzL2J0cmZzL3NlbmQuYwppbmRleCA5NDVkMWRiLi45YzhkMWEzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zZW5kLmMKKysrIGIvZnMvYnRyZnMvc2VuZC5jCkBAIC0yNCwxMiArMjQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlICJzZW5kLmgiCiAjaW5jbHVkZSAiYmFja3JlZi5oIgorI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJsb2NraW5nLmgiCiAjaW5jbHVkZSAiZGlzay1pby5oIgogI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCkBAIC04OCw4ICs4OCw2IEBACiAJdTY0IGNtZF9zZW5kX3NpemVbQlRSRlNfU0VORF9DX01BWCArIDFdOwogCXU2NCBmbGFnczsJLyogJ2ZsYWdzJyBtZW1iZXIgb2YgYnRyZnNfaW9jdGxfc2VuZF9hcmdzIGlzIHU2NCAqLwogCi0Jc3RydWN0IHZmc21vdW50ICptbnQ7Ci0KIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqc2VuZF9yb290OwogCXN0cnVjdCBidHJmc19yb290ICpwYXJlbnRfcm9vdDsKIAlzdHJ1Y3QgY2xvbmVfcm9vdCAqY2xvbmVfcm9vdHM7CkBAIC0xMTEsNiArMTA5LDcgQEAKIAlpbnQgY3VyX2lub2RlX2RlbGV0ZWQ7CiAJdTY0IGN1cl9pbm9kZV9zaXplOwogCXU2NCBjdXJfaW5vZGVfbW9kZTsKKwl1NjQgY3VyX2lub2RlX2xhc3RfZXh0ZW50OwogCiAJdTY0IHNlbmRfcHJvZ3Jlc3M7CiAKQEAgLTEyMiw2ICsxMjEsNzQgQEAKIAlpbnQgbmFtZV9jYWNoZV9zaXplOwogCiAJY2hhciAqcmVhZF9idWY7CisKKwkvKgorCSAqIFdlIHByb2Nlc3MgaW5vZGVzIGJ5IHRoZWlyIGluY3JlYXNpbmcgb3JkZXIsIHNvIGlmIGJlZm9yZSBhbgorCSAqIGluY3JlbWVudGFsIHNlbmQgd2UgcmV2ZXJzZSB0aGUgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCBvZgorCSAqIGRpcmVjdG9yaWVzIHN1Y2ggdGhhdCBhIGRpcmVjdG9yeSB3aXRoIGEgbG93ZXIgaW5vZGUgbnVtYmVyIHdhcworCSAqIHRoZSBwYXJlbnQgb2YgYSBkaXJlY3Rvcnkgd2l0aCBhIGhpZ2hlciBpbm9kZSBudW1iZXIsIGFuZCB0aGUgb25lCisJICogYmVjb21pbmcgdGhlIG5ldyBwYXJlbnQgZ290IHJlbmFtZWQgdG9vLCB3ZSBjYW4ndCByZW5hbWUvbW92ZSB0aGUKKwkgKiBkaXJlY3Rvcnkgd2l0aCBsb3dlciBpbm9kZSBudW1iZXIgd2hlbiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBpdCAtIHdlCisJICogbXVzdCBwcm9jZXNzIHRoZSBkaXJlY3Rvcnkgd2l0aCBoaWdoZXIgaW5vZGUgbnVtYmVyIGZpcnN0LCB0aGVuCisJICogcmVuYW1lL21vdmUgaXQgYW5kIHRoZW4gcmVuYW1lL21vdmUgdGhlIGRpcmVjdG9yeSB3aXRoIGxvd2VyIGlub2RlCisJICogbnVtYmVyLiBFeGFtcGxlIGZvbGxvd3MuCisJICoKKwkgKiBUcmVlIHN0YXRlIHdoZW4gdGhlIGZpcnN0IHNlbmQgd2FzIHBlcmZvcm1lZDoKKwkgKgorCSAqIC4KKwkgKiB8LS0gYSAgICAgICAgICAgICAgICAgICAoaW5vIDI1NykKKwkgKiAgICAgfC0tIGIgICAgICAgICAgICAgICAoaW5vIDI1OCkKKwkgKiAgICAgICAgIHwKKwkgKiAgICAgICAgIHwKKwkgKiAgICAgICAgIHwtLSBjICAgICAgICAgICAoaW5vIDI1OSkKKwkgKiAgICAgICAgIHwgICB8LS0gZCAgICAgICAoaW5vIDI2MCkKKwkgKiAgICAgICAgIHwKKwkgKiAgICAgICAgIHwtLSBjMiAgICAgICAgICAoaW5vIDI2MSkKKwkgKgorCSAqIFRyZWUgc3RhdGUgd2hlbiB0aGUgc2Vjb25kIChpbmNyZW1lbnRhbCkgc2VuZCBpcyBwZXJmb3JtZWQ6CisJICoKKwkgKiAuCisJICogfC0tIGEgICAgICAgICAgICAgICAgICAgKGlubyAyNTcpCisJICogICAgIHwtLSBiICAgICAgICAgICAgICAgKGlubyAyNTgpCisJICogICAgICAgICB8LS0gYzIgICAgICAgICAgKGlubyAyNjEpCisJICogICAgICAgICAgICAgfC0tIGQyICAgICAgKGlubyAyNjApCisJICogICAgICAgICAgICAgICAgIHwtLSBjYyAgKGlubyAyNTkpCisJICoKKwkgKiBUaGUgc2VxdWVuY2Ugb2Ygc3RlcHMgdGhhdCBsZWFkIHRvIHRoZSBzZWNvbmQgc3RhdGUgd2FzOgorCSAqCisJICogbXYgL2EvYi9jL2QgL2EvYi9jMi9kMgorCSAqIG12IC9hL2IvYyAvYS9iL2MyL2QyL2NjCisJICoKKwkgKiAiYyIgaGFzIGxvd2VyIGlub2RlIG51bWJlciwgYnV0IHdlIGNhbid0IG1vdmUgaXQgKDJuZCBtdiBvcGVyYXRpb24pCisJICogYmVmb3JlIHdlIG1vdmUgImQiLCB3aGljaCBoYXMgaGlnaGVyIGlub2RlIG51bWJlci4KKwkgKgorCSAqIFNvIHdlIGp1c3QgbWVtb3JpemUgd2hpY2ggbW92ZS9yZW5hbWUgb3BlcmF0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZAorCSAqIGxhdGVyIHdoZW4gdGhlaXIgcmVzcGVjdGl2ZSBwYXJlbnQgaXMgcHJvY2Vzc2VkIGFuZCBtb3ZlZC9yZW5hbWVkLgorCSAqLworCisJLyogSW5kZXhlZCBieSBwYXJlbnQgZGlyZWN0b3J5IGlub2RlIG51bWJlci4gKi8KKwlzdHJ1Y3QgcmJfcm9vdCBwZW5kaW5nX2Rpcl9tb3ZlczsKKworCS8qCisJICogUmV2ZXJzZSBpbmRleCwgaW5kZXhlZCBieSB0aGUgaW5vZGUgbnVtYmVyIG9mIGEgZGlyZWN0b3J5IHRoYXQKKwkgKiBpcyB3YWl0aW5nIGZvciB0aGUgbW92ZS9yZW5hbWUgb2YgaXRzIGltbWVkaWF0ZSBwYXJlbnQgYmVmb3JlIGl0cworCSAqIG93biBtb3ZlL3JlbmFtZSBjYW4gYmUgcGVyZm9ybWVkLgorCSAqLworCXN0cnVjdCByYl9yb290IHdhaXRpbmdfZGlyX21vdmVzOworfTsKKworc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBwYXJlbnRfaW5vOworCXU2NCBpbm87CisJdTY0IGdlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHVwZGF0ZV9yZWZzOworfTsKKworc3RydWN0IHdhaXRpbmdfZGlyX21vdmUgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisJdTY0IGlubzsKIH07CiAKIHN0cnVjdCBuYW1lX2NhY2hlX2VudHJ5IHsKQEAgLTE0NSw2ICsyMTIsMTUgQEAKIAljaGFyIG5hbWVbXTsKIH07CiAKK3N0YXRpYyBpbnQgaXNfd2FpdGluZ19mb3JfbW92ZShzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHU2NCBpbm8pOworCitzdGF0aWMgaW50IG5lZWRfc2VuZF9ob2xlKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCkKK3sKKwlyZXR1cm4gKHNjdHgtPnBhcmVudF9yb290ICYmICFzY3R4LT5jdXJfaW5vZGVfbmV3ICYmCisJCSFzY3R4LT5jdXJfaW5vZGVfbmV3X2dlbiAmJiAhc2N0eC0+Y3VyX2lub2RlX2RlbGV0ZWQgJiYKKwkJU19JU1JFRyhzY3R4LT5jdXJfaW5vZGVfbW9kZSkpOworfQorCiBzdGF0aWMgdm9pZCBmc19wYXRoX3Jlc2V0KHN0cnVjdCBmc19wYXRoICpwKQogewogCWlmIChwLT5yZXZlcnNlZCkgewpAQCAtMzM2LDE2ICs0MTIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBmc19wYXRoX3JlbW92ZShzdHJ1Y3QgZnNfcGF0aCAqcCkKLXsKLQlCVUdfT04ocC0+cmV2ZXJzZWQpOwotCXdoaWxlIChwLT5zdGFydCAhPSBwLT5lbmQgJiYgKnAtPmVuZCAhPSAnLycpCi0JCXAtPmVuZC0tOwotCSpwLT5lbmQgPSAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgZnNfcGF0aF9jb3B5KHN0cnVjdCBmc19wYXRoICpwLCBzdHJ1Y3QgZnNfcGF0aCAqZnJvbSkKIHsKIAlpbnQgcmV0OwpAQCAtNDM2LDMwICs1MDIsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgdGx2X3B1dF91OChzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHUxNiBhdHRyLCB1OCB2YWx1ZSkKLXsKLQlyZXR1cm4gdGx2X3B1dChzY3R4LCBhdHRyLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotfQorI2RlZmluZSBUTFZfUFVUX0RFRklORV9JTlQoYml0cykgXAorCXN0YXRpYyBpbnQgdGx2X3B1dF91IyNiaXRzKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwJIAlcCisJCQl1IyNiaXRzIGF0dHIsIHUjI2JpdHMgdmFsdWUpCQkJXAorCXsJCQkJCQkJCVwKKwkJX19sZSMjYml0cyBfX3RtcCA9IGNwdV90b19sZSMjYml0cyh2YWx1ZSk7CQlcCisJCXJldHVybiB0bHZfcHV0KHNjdHgsIGF0dHIsICZfX3RtcCwgc2l6ZW9mKF9fdG1wKSk7CVwKKwl9CiAKLXN0YXRpYyBpbnQgdGx2X3B1dF91MTYoc3RydWN0IHNlbmRfY3R4ICpzY3R4LCB1MTYgYXR0ciwgdTE2IHZhbHVlKQotewotCV9fbGUxNiB0bXAgPSBjcHVfdG9fbGUxNih2YWx1ZSk7Ci0JcmV0dXJuIHRsdl9wdXQoc2N0eCwgYXR0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOwotfQotCi1zdGF0aWMgaW50IHRsdl9wdXRfdTMyKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgdTE2IGF0dHIsIHUzMiB2YWx1ZSkKLXsKLQlfX2xlMzIgdG1wID0gY3B1X3RvX2xlMzIodmFsdWUpOwotCXJldHVybiB0bHZfcHV0KHNjdHgsIGF0dHIsICZ0bXAsIHNpemVvZih0bXApKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IHRsdl9wdXRfdTY0KHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgdTE2IGF0dHIsIHU2NCB2YWx1ZSkKLXsKLQlfX2xlNjQgdG1wID0gY3B1X3RvX2xlNjQodmFsdWUpOwotCXJldHVybiB0bHZfcHV0KHNjdHgsIGF0dHIsICZ0bXAsIHNpemVvZih0bXApKTsKLX0KK1RMVl9QVVRfREVGSU5FX0lOVCg2NCkKIAogc3RhdGljIGludCB0bHZfcHV0X3N0cmluZyhzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHUxNiBhdHRyLAogCQkJICBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCkBAIC00NzUsMTcgKzUyNiw2IEBACiAJcmV0dXJuIHRsdl9wdXQoc2N0eCwgYXR0ciwgdXVpZCwgQlRSRlNfVVVJRF9TSVpFKTsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgdGx2X3B1dF90aW1lc3BlYyhzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHUxNiBhdHRyLAotCQkJICAgIHN0cnVjdCB0aW1lc3BlYyAqdHMpCi17Ci0Jc3RydWN0IGJ0cmZzX3RpbWVzcGVjIGJ0czsKLQlidHMuc2VjID0gY3B1X3RvX2xlNjQodHMtPnR2X3NlYyk7Ci0JYnRzLm5zZWMgPSBjcHVfdG9fbGUzMih0cy0+dHZfbnNlYyk7Ci0JcmV0dXJuIHRsdl9wdXQoc2N0eCwgYXR0ciwgJmJ0cywgc2l6ZW9mKGJ0cykpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgdGx2X3B1dF9idHJmc190aW1lc3BlYyhzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHUxNiBhdHRyLAogCQkJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAogCQkJCSAgc3RydWN0IGJ0cmZzX3RpbWVzcGVjICp0cykKQEAgLTUzMywxMiArNTczLDYgQEAKIAkJaWYgKHJldCA8IDApIFwKIAkJCWdvdG8gdGx2X3B1dF9mYWlsdXJlOyBcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgVExWX1BVVF9USU1FU1BFQyhzY3R4LCBhdHRydHlwZSwgdHMpIFwKLQlkbyB7IFwKLQkJcmV0ID0gdGx2X3B1dF90aW1lc3BlYyhzY3R4LCBhdHRydHlwZSwgdHMpOyBcCi0JCWlmIChyZXQgPCAwKSBcCi0JCQlnb3RvIHRsdl9wdXRfZmFpbHVyZTsgXAotCX0gd2hpbGUgKDApCiAjZGVmaW5lIFRMVl9QVVRfQlRSRlNfVElNRVNQRUMoc2N0eCwgYXR0cnR5cGUsIGViLCB0cykgXAogCWRvIHsgXAogCQlyZXQgPSB0bHZfcHV0X2J0cmZzX3RpbWVzcGVjKHNjdHgsIGF0dHJ0eXBlLCBlYiwgdHMpOyBcCkBAIC01ODYsNyArNjIwLDcgQEAKIAloZHItPmxlbiA9IGNwdV90b19sZTMyKHNjdHgtPnNlbmRfc2l6ZSAtIHNpemVvZigqaGRyKSk7CiAJaGRyLT5jcmMgPSAwOwogCi0JY3JjID0gY3JjMzJjKDAsICh1bnNpZ25lZCBjaGFyICopc2N0eC0+c2VuZF9idWYsIHNjdHgtPnNlbmRfc2l6ZSk7CisJY3JjID0gYnRyZnNfY3JjMzJjKDAsICh1bnNpZ25lZCBjaGFyICopc2N0eC0+c2VuZF9idWYsIHNjdHgtPnNlbmRfc2l6ZSk7CiAJaGRyLT5jcmMgPSBjcHVfdG9fbGUzMihjcmMpOwogCiAJcmV0ID0gd3JpdGVfYnVmKHNjdHgtPnNlbmRfZmlscCwgc2N0eC0+c2VuZF9idWYsIHNjdHgtPnNlbmRfc2l6ZSwKQEAgLTEyNzAsNyArMTMwNCw3IEBACiAJaWYgKCFiYWNrcmVmX2N0eC0+Zm91bmRfaXRzZWxmKSB7CiAJCS8qIGZvdW5kIGEgYnVnIGluIGJhY2tyZWYgY29kZT8gKi8KIAkJcmV0ID0gLUVJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogRVJST1IgZGlkIG5vdCBmaW5kIGJhY2tyZWYgaW4gIgorCQlidHJmc19lcnIoc2N0eC0+c2VuZF9yb290LT5mc19pbmZvLCAiZGlkIG5vdCBmaW5kIGJhY2tyZWYgaW4gIgogCQkJCSJzZW5kX3Jvb3QuIGlub2RlPSVsbHUsIG9mZnNldD0lbGx1LCAiCiAJCQkJImRpc2tfYnl0ZT0lbGx1IGZvdW5kIGV4dGVudD0lbGx1XG4iLAogCQkJCWlubywgZGF0YV9vZmZzZXQsIGRpc2tfYnl0ZSwgZm91bmRfa2V5Lm9iamVjdGlkKTsKQEAgLTEzNDMsNyArMTM3Nyw3IEBACiAJQlVHX09OKGNvbXByZXNzaW9uKTsKIAogCW9mZiA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9zdGFydChlaSk7Ci0JbGVuID0gYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihwYXRoLT5ub2Rlc1swXSwgZWkpOworCWxlbiA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4ocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLCBlaSk7CiAKIAlyZXQgPSBmc19wYXRoX2FkZF9mcm9tX2V4dGVudF9idWZmZXIoZGVzdCwgcGF0aC0+bm9kZXNbMF0sIG9mZiwgbGVuKTsKIApAQCAtMTM3Miw3ICsxNDA2LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3aGlsZSAoMSkgewotCQlsZW4gPSBzbnByaW50Zih0bXAsIHNpemVvZih0bXApIC0gMSwgIm8lbGx1LSVsbHUtJWxsdSIsCisJCWxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJvJWxsdS0lbGx1LSVsbHUiLAogCQkJCWlubywgZ2VuLCBpZHgpOwogCQlpZiAobGVuID49IHNpemVvZih0bXApKSB7CiAJCQkvKiBzaG91bGQgcmVhbGx5IG5vdCBoYXBwZW4gKi8KQEAgLTE5MzMsNiArMTk2Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19nZXRfY3VyX25hbWVfYW5kX3BhcmVudChzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsCiAJCQkJICAgICB1NjQgaW5vLCB1NjQgZ2VuLAorCQkJCSAgICAgaW50IHNraXBfbmFtZV9jYWNoZSwKIAkJCQkgICAgIHU2NCAqcGFyZW50X2lubywKIAkJCQkgICAgIHU2NCAqcGFyZW50X2dlbiwKIAkJCQkgICAgIHN0cnVjdCBmc19wYXRoICpkZXN0KQpAQCAtMTk0Miw2ICsxOTc3LDggQEAKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCA9IE5VTEw7CiAJc3RydWN0IG5hbWVfY2FjaGVfZW50cnkgKm5jZSA9IE5VTEw7CiAKKwlpZiAoc2tpcF9uYW1lX2NhY2hlKQorCQlnb3RvIGdldF9yZWY7CiAJLyoKIAkgKiBGaXJzdCBjaGVjayBpZiB3ZSBhbHJlYWR5IGRpZCBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lCiAJICogaW5vL2dlbi4gSWYgeWVzLCBjaGVjayBpZiB0aGUgY2FjaGUgZW50cnkgaXMgc3RpbGwgdXAtdG8tZGF0ZS4gSWYgeWVzCkBAIC0xOTg2LDExICsyMDIzLDEyIEBACiAJCWdvdG8gb3V0X2NhY2hlOwogCX0KIAorZ2V0X3JlZjoKIAkvKgogCSAqIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBpbm9kZSB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgb3Igbm90LCB1c2UKIAkgKiBzZW5kX3Jvb3Qgb3IgcGFyZW50X3Jvb3QgZm9yIHJlZiBsb29rdXAuCiAJICovCi0JaWYgKGlubyA8IHNjdHgtPnNlbmRfcHJvZ3Jlc3MpCisJaWYgKGlubyA8IHNjdHgtPnNlbmRfcHJvZ3Jlc3MgJiYgIXNraXBfbmFtZV9jYWNoZSkKIAkJcmV0ID0gZ2V0X2ZpcnN0X3JlZihzY3R4LT5zZW5kX3Jvb3QsIGlubywKIAkJCQkgICAgcGFyZW50X2lubywgcGFyZW50X2dlbiwgZGVzdCk7CiAJZWxzZQpAQCAtMjAxNCw2ICsyMDUyLDggQEAKIAkJCWdvdG8gb3V0OwogCQlyZXQgPSAxOwogCX0KKwlpZiAoc2tpcF9uYW1lX2NhY2hlKQorCQlnb3RvIG91dDsKIAogb3V0X2NhY2hlOgogCS8qCkBAIC0yMDgxLDYgKzIxMjEsOSBAQAogCXU2NCBwYXJlbnRfaW5vZGUgPSAwOwogCXU2NCBwYXJlbnRfZ2VuID0gMDsKIAlpbnQgc3RvcCA9IDA7CisJdTY0IHN0YXJ0X2lubyA9IGlubzsKKwl1NjQgc3RhcnRfZ2VuID0gZ2VuOworCWludCBza2lwX25hbWVfY2FjaGUgPSAwOwogCiAJbmFtZSA9IGZzX3BhdGhfYWxsb2MoKTsKIAlpZiAoIW5hbWUpIHsKQEAgLTIwODgsMTkgKzIxMzEsMzIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKGlzX3dhaXRpbmdfZm9yX21vdmUoc2N0eCwgaW5vKSkKKwkJc2tpcF9uYW1lX2NhY2hlID0gMTsKKworYWdhaW46CiAJZGVzdC0+cmV2ZXJzZWQgPSAxOwogCWZzX3BhdGhfcmVzZXQoZGVzdCk7CiAKIAl3aGlsZSAoIXN0b3AgJiYgaW5vICE9IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKIAkJZnNfcGF0aF9yZXNldChuYW1lKTsKIAotCQlyZXQgPSBfX2dldF9jdXJfbmFtZV9hbmRfcGFyZW50KHNjdHgsIGlubywgZ2VuLAorCQlyZXQgPSBfX2dldF9jdXJfbmFtZV9hbmRfcGFyZW50KHNjdHgsIGlubywgZ2VuLCBza2lwX25hbWVfY2FjaGUsCiAJCQkJJnBhcmVudF9pbm9kZSwgJnBhcmVudF9nZW4sIG5hbWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCQlpZiAocmV0KQogCQkJc3RvcCA9IDE7CiAKKwkJaWYgKCFza2lwX25hbWVfY2FjaGUgJiYKKwkJICAgIGlzX3dhaXRpbmdfZm9yX21vdmUoc2N0eCwgcGFyZW50X2lub2RlKSkgeworCQkJaW5vID0gc3RhcnRfaW5vOworCQkJZ2VuID0gc3RhcnRfZ2VuOworCQkJc3RvcCA9IDA7CisJCQlza2lwX25hbWVfY2FjaGUgPSAxOworCQkJZ290byBhZ2FpbjsKKwkJfQorCiAJCXJldCA9IGZzX3BhdGhfYWRkX3BhdGgoZGVzdCwgbmFtZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CkBAIC0yMTMxLDcgKzIxODcsNyBAQAogCWNoYXIgKm5hbWUgPSBOVUxMOwogCWludCBuYW1lbGVuOwogCi0JcGF0aCA9IGFsbG9jX3BhdGhfZm9yX3NlbmQoKTsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIxODAsMTIgKzIyMzYsMTIgQEAKIAlUTFZfUFVUX1VVSUQoc2N0eCwgQlRSRlNfU0VORF9BX1VVSUQsCiAJCQlzY3R4LT5zZW5kX3Jvb3QtPnJvb3RfaXRlbS51dWlkKTsKIAlUTFZfUFVUX1U2NChzY3R4LCBCVFJGU19TRU5EX0FfQ1RSQU5TSUQsCi0JCQlzY3R4LT5zZW5kX3Jvb3QtPnJvb3RfaXRlbS5jdHJhbnNpZCk7CisJCSAgICBsZTY0X3RvX2NwdShzY3R4LT5zZW5kX3Jvb3QtPnJvb3RfaXRlbS5jdHJhbnNpZCkpOwogCWlmIChwYXJlbnRfcm9vdCkgewogCQlUTFZfUFVUX1VVSUQoc2N0eCwgQlRSRlNfU0VORF9BX0NMT05FX1VVSUQsCiAJCQkJc2N0eC0+cGFyZW50X3Jvb3QtPnJvb3RfaXRlbS51dWlkKTsKIAkJVExWX1BVVF9VNjQoc2N0eCwgQlRSRlNfU0VORF9BX0NMT05FX0NUUkFOU0lELAotCQkJCXNjdHgtPnBhcmVudF9yb290LT5yb290X2l0ZW0uY3RyYW5zaWQpOworCQkJICAgIGxlNjRfdG9fY3B1KHNjdHgtPnBhcmVudF9yb290LT5yb290X2l0ZW0uY3RyYW5zaWQpKTsKIAl9CiAKIAlyZXQgPSBzZW5kX2NtZChzY3R4KTsKQEAgLTI2NzIsMTAgKzI3MjgsMzQ3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBpc193YWl0aW5nX2Zvcl9tb3ZlKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgdTY0IGlubykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHNjdHgtPndhaXRpbmdfZGlyX21vdmVzLnJiX25vZGU7CisJc3RydWN0IHdhaXRpbmdfZGlyX21vdmUgKmVudHJ5OworCisJd2hpbGUgKG4pIHsKKwkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3Qgd2FpdGluZ19kaXJfbW92ZSwgbm9kZSk7CisJCWlmIChpbm8gPCBlbnRyeS0+aW5vKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGlubyA+IGVudHJ5LT5pbm8pCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfd2FpdGluZ19kaXJfbW92ZShzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHU2NCBpbm8pCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnNjdHgtPndhaXRpbmdfZGlyX21vdmVzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHdhaXRpbmdfZGlyX21vdmUgKmVudHJ5LCAqZG07CisKKwlkbSA9IGttYWxsb2Moc2l6ZW9mKCpkbSksIEdGUF9OT0ZTKTsKKwlpZiAoIWRtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkbS0+aW5vID0gaW5vOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHdhaXRpbmdfZGlyX21vdmUsIG5vZGUpOworCQlpZiAoaW5vIDwgZW50cnktPmlubykgeworCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKGlubyA+IGVudHJ5LT5pbm8pIHsKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlrZnJlZShkbSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmZG0tPm5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZkbS0+bm9kZSwgJnNjdHgtPndhaXRpbmdfZGlyX21vdmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWxfd2FpdGluZ19kaXJfbW92ZShzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHU2NCBpbm8pCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBzY3R4LT53YWl0aW5nX2Rpcl9tb3Zlcy5yYl9ub2RlOworCXN0cnVjdCB3YWl0aW5nX2Rpcl9tb3ZlICplbnRyeTsKKworCXdoaWxlIChuKSB7CisJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IHdhaXRpbmdfZGlyX21vdmUsIG5vZGUpOworCQlpZiAoaW5vIDwgZW50cnktPmlubykgeworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoaW5vID4gZW50cnktPmlubykgeworCQkJbiA9IG4tPnJiX3JpZ2h0OworCQl9IGVsc2UgeworCQkJcmJfZXJhc2UoJmVudHJ5LT5ub2RlLCAmc2N0eC0+d2FpdGluZ19kaXJfbW92ZXMpOworCQkJa2ZyZWUoZW50cnkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BlbmRpbmdfZGlyX21vdmUoc3RydWN0IHNlbmRfY3R4ICpzY3R4LCB1NjQgcGFyZW50X2lubykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc2N0eC0+cGVuZGluZ19kaXJfbW92ZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGVuZGluZ19kaXJfbW92ZSAqZW50cnksICpwbTsKKwlzdHJ1Y3QgcmVjb3JkZWRfcmVmICpjdXI7CisJaW50IGV4aXN0cyA9IDA7CisJaW50IHJldDsKKworCXBtID0ga21hbGxvYyhzaXplb2YoKnBtKSwgR0ZQX05PRlMpOworCWlmICghcG0pCisJCXJldHVybiAtRU5PTUVNOworCXBtLT5wYXJlbnRfaW5vID0gcGFyZW50X2lubzsKKwlwbS0+aW5vID0gc2N0eC0+Y3VyX2lubzsKKwlwbS0+Z2VuID0gc2N0eC0+Y3VyX2lub2RlX2dlbjsKKwlJTklUX0xJU1RfSEVBRCgmcG0tPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwbS0+dXBkYXRlX3JlZnMpOworCVJCX0NMRUFSX05PREUoJnBtLT5ub2RlKTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBwZW5kaW5nX2Rpcl9tb3ZlLCBub2RlKTsKKwkJaWYgKHBhcmVudF9pbm8gPCBlbnRyeS0+cGFyZW50X2lubykgeworCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKHBhcmVudF9pbm8gPiBlbnRyeS0+cGFyZW50X2lubykgeworCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJfSBlbHNlIHsKKwkJCWV4aXN0cyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmc2N0eC0+ZGVsZXRlZF9yZWZzLCBsaXN0KSB7CisJCXJldCA9IGR1cF9yZWYoY3VyLCAmcG0tPnVwZGF0ZV9yZWZzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZzY3R4LT5uZXdfcmVmcywgbGlzdCkgeworCQlyZXQgPSBkdXBfcmVmKGN1ciwgJnBtLT51cGRhdGVfcmVmcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYWRkX3dhaXRpbmdfZGlyX21vdmUoc2N0eCwgcG0tPmlubyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZXhpc3RzKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBtLT5saXN0LCAmZW50cnktPmxpc3QpOworCX0gZWxzZSB7CisJCXJiX2xpbmtfbm9kZSgmcG0tPm5vZGUsIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmcG0tPm5vZGUsICZzY3R4LT5wZW5kaW5nX2Rpcl9tb3Zlcyk7CisJfQorCXJldCA9IDA7CitvdXQ6CisJaWYgKHJldCkgeworCQlfX2ZyZWVfcmVjb3JkZWRfcmVmcygmcG0tPnVwZGF0ZV9yZWZzKTsKKwkJa2ZyZWUocG0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgKmdldF9wZW5kaW5nX2Rpcl9tb3ZlcyhzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsCisJCQkJCQkgICAgICB1NjQgcGFyZW50X2lubykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHNjdHgtPnBlbmRpbmdfZGlyX21vdmVzLnJiX25vZGU7CisJc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgKmVudHJ5OworCisJd2hpbGUgKG4pIHsKKwkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGVuZGluZ19kaXJfbW92ZSwgbm9kZSk7CisJCWlmIChwYXJlbnRfaW5vIDwgZW50cnktPnBhcmVudF9pbm8pCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocGFyZW50X2lubyA+IGVudHJ5LT5wYXJlbnRfaW5vKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZW50cnk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFwcGx5X2Rpcl9tb3ZlKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgKnBtKQoreworCXN0cnVjdCBmc19wYXRoICpmcm9tX3BhdGggPSBOVUxMOworCXN0cnVjdCBmc19wYXRoICp0b19wYXRoID0gTlVMTDsKKwl1NjQgb3JpZ19wcm9ncmVzcyA9IHNjdHgtPnNlbmRfcHJvZ3Jlc3M7CisJc3RydWN0IHJlY29yZGVkX3JlZiAqY3VyOworCWludCByZXQ7CisKKwlmcm9tX3BhdGggPSBmc19wYXRoX2FsbG9jKCk7CisJaWYgKCFmcm9tX3BhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJc2N0eC0+c2VuZF9wcm9ncmVzcyA9IHBtLT5pbm87CisJcmV0ID0gZ2V0X2N1cl9wYXRoKHNjdHgsIHBtLT5pbm8sIHBtLT5nZW4sIGZyb21fcGF0aCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdG9fcGF0aCA9IGZzX3BhdGhfYWxsb2MoKTsKKwlpZiAoIXRvX3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc2N0eC0+c2VuZF9wcm9ncmVzcyA9IHNjdHgtPmN1cl9pbm8gKyAxOworCXJldCA9IGRlbF93YWl0aW5nX2Rpcl9tb3ZlKHNjdHgsIHBtLT5pbm8pOworCUFTU0VSVChyZXQgPT0gMCk7CisKKwlyZXQgPSBnZXRfY3VyX3BhdGgoc2N0eCwgcG0tPmlubywgcG0tPmdlbiwgdG9fcGF0aCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gc2VuZF9yZW5hbWUoc2N0eCwgZnJvbV9wYXRoLCB0b19wYXRoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzZW5kX3V0aW1lcyhzY3R4LCBwbS0+aW5vLCBwbS0+Z2VuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEFmdGVyIHJlbmFtZS9tb3ZlLCBuZWVkIHRvIHVwZGF0ZSB0aGUgdXRpbWVzIG9mIGJvdGggbmV3IHBhcmVudChzKQorCSAqIGFuZCBvbGQgcGFyZW50KHMpLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmcG0tPnVwZGF0ZV9yZWZzLCBsaXN0KSB7CisJCXJldCA9IHNlbmRfdXRpbWVzKHNjdHgsIGN1ci0+ZGlyLCBjdXItPmRpcl9nZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWZzX3BhdGhfZnJlZShmcm9tX3BhdGgpOworCWZzX3BhdGhfZnJlZSh0b19wYXRoKTsKKwlzY3R4LT5zZW5kX3Byb2dyZXNzID0gb3JpZ19wcm9ncmVzczsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGVuZGluZ19tb3ZlKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgKm0pCit7CisJaWYgKCFsaXN0X2VtcHR5KCZtLT5saXN0KSkKKwkJbGlzdF9kZWwoJm0tPmxpc3QpOworCWlmICghUkJfRU1QVFlfTk9ERSgmbS0+bm9kZSkpCisJCXJiX2VyYXNlKCZtLT5ub2RlLCAmc2N0eC0+cGVuZGluZ19kaXJfbW92ZXMpOworCV9fZnJlZV9yZWNvcmRlZF9yZWZzKCZtLT51cGRhdGVfcmVmcyk7CisJa2ZyZWUobSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhaWxfYXBwZW5kX3BlbmRpbmdfbW92ZXMoc3RydWN0IHBlbmRpbmdfZGlyX21vdmUgKm1vdmVzLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnN0YWNrKQoreworCWlmIChsaXN0X2VtcHR5KCZtb3Zlcy0+bGlzdCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmbW92ZXMtPmxpc3QsIHN0YWNrKTsKKwl9IGVsc2UgeworCQlMSVNUX0hFQUQobGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJm1vdmVzLT5saXN0LCAmbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJm1vdmVzLT5saXN0LCBzdGFjayk7CisJCWxpc3Rfc3BsaWNlX3RhaWwoJmxpc3QsIHN0YWNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfY2hpbGRyZW5fZGlyX21vdmVzKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCkKK3sKKwlzdHJ1Y3QgcGVuZGluZ19kaXJfbW92ZSAqcG07CisJc3RydWN0IGxpc3RfaGVhZCBzdGFjazsKKwl1NjQgcGFyZW50X2lubyA9IHNjdHgtPmN1cl9pbm87CisJaW50IHJldCA9IDA7CisKKwlwbSA9IGdldF9wZW5kaW5nX2Rpcl9tb3ZlcyhzY3R4LCBwYXJlbnRfaW5vKTsKKwlpZiAoIXBtKQorCQlyZXR1cm4gMDsKKworCUlOSVRfTElTVF9IRUFEKCZzdGFjayk7CisJdGFpbF9hcHBlbmRfcGVuZGluZ19tb3ZlcyhwbSwgJnN0YWNrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmc3RhY2spKSB7CisJCXBtID0gbGlzdF9maXJzdF9lbnRyeSgmc3RhY2ssIHN0cnVjdCBwZW5kaW5nX2Rpcl9tb3ZlLCBsaXN0KTsKKwkJcGFyZW50X2lubyA9IHBtLT5pbm87CisJCXJldCA9IGFwcGx5X2Rpcl9tb3ZlKHNjdHgsIHBtKTsKKwkJZnJlZV9wZW5kaW5nX21vdmUoc2N0eCwgcG0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXBtID0gZ2V0X3BlbmRpbmdfZGlyX21vdmVzKHNjdHgsIHBhcmVudF9pbm8pOworCQlpZiAocG0pCisJCQl0YWlsX2FwcGVuZF9wZW5kaW5nX21vdmVzKHBtLCAmc3RhY2spOworCX0KKwlyZXR1cm4gMDsKKworb3V0OgorCXdoaWxlICghbGlzdF9lbXB0eSgmc3RhY2spKSB7CisJCXBtID0gbGlzdF9maXJzdF9lbnRyeSgmc3RhY2ssIHN0cnVjdCBwZW5kaW5nX2Rpcl9tb3ZlLCBsaXN0KTsKKwkJZnJlZV9wZW5kaW5nX21vdmUoc2N0eCwgcG0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX3BhcmVudF9tb3ZlKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwKKwkJCQlzdHJ1Y3QgcmVjb3JkZWRfcmVmICpwYXJlbnRfcmVmKQoreworCWludCByZXQ7CisJdTY0IGlubyA9IHBhcmVudF9yZWYtPmRpcjsKKwl1NjQgcGFyZW50X2lub19iZWZvcmUsIHBhcmVudF9pbm9fYWZ0ZXI7CisJdTY0IG5ld19nZW4sIG9sZF9nZW47CisJc3RydWN0IGZzX3BhdGggKnBhdGhfYmVmb3JlID0gTlVMTDsKKwlzdHJ1Y3QgZnNfcGF0aCAqcGF0aF9hZnRlciA9IE5VTEw7CisJaW50IGxlbjEsIGxlbjI7CisKKwlpZiAocGFyZW50X3JlZi0+ZGlyIDw9IHNjdHgtPmN1cl9pbm8pCisJCXJldHVybiAwOworCisJaWYgKGlzX3dhaXRpbmdfZm9yX21vdmUoc2N0eCwgaW5vKSkKKwkJcmV0dXJuIDE7CisKKwlyZXQgPSBnZXRfaW5vZGVfaW5mbyhzY3R4LT5wYXJlbnRfcm9vdCwgaW5vLCBOVUxMLCAmb2xkX2dlbiwKKwkJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA9PSAtRU5PRU5UKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2V0X2lub2RlX2luZm8oc2N0eC0+c2VuZF9yb290LCBpbm8sIE5VTEwsICZuZXdfZ2VuLAorCQkJICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChuZXdfZ2VuICE9IG9sZF9nZW4pCisJCXJldHVybiAwOworCisJcGF0aF9iZWZvcmUgPSBmc19wYXRoX2FsbG9jKCk7CisJaWYgKCFwYXRoX2JlZm9yZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBnZXRfZmlyc3RfcmVmKHNjdHgtPnBhcmVudF9yb290LCBpbm8sICZwYXJlbnRfaW5vX2JlZm9yZSwKKwkJCSAgICBOVUxMLCBwYXRoX2JlZm9yZSk7CisJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQlnb3RvIG91dDsKKwl9CisKKwlwYXRoX2FmdGVyID0gZnNfcGF0aF9hbGxvYygpOworCWlmICghcGF0aF9hZnRlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZXRfZmlyc3RfcmVmKHNjdHgtPnNlbmRfcm9vdCwgaW5vLCAmcGFyZW50X2lub19hZnRlciwKKwkJCSAgICBOVUxMLCBwYXRoX2FmdGVyKTsKKwlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWdvdG8gb3V0OworCX0KKworCWxlbjEgPSBmc19wYXRoX2xlbihwYXRoX2JlZm9yZSk7CisJbGVuMiA9IGZzX3BhdGhfbGVuKHBhdGhfYWZ0ZXIpOworCWlmICgocGFyZW50X2lub19iZWZvcmUgIT0gcGFyZW50X2lub19hZnRlcikgJiYgKGxlbjEgIT0gbGVuMiB8fAorCSAgICAgbWVtY21wKHBhdGhfYmVmb3JlLT5zdGFydCwgcGF0aF9hZnRlci0+c3RhcnQsIGxlbjEpKSkgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKworb3V0OgorCWZzX3BhdGhfZnJlZShwYXRoX2JlZm9yZSk7CisJZnNfcGF0aF9mcmVlKHBhdGhfYWZ0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIFRoaXMgZG9lcyBhbGwgdGhlIG1vdmUvbGluay91bmxpbmsvcm1kaXIgbWFnaWMuCiAgKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19yZWNvcmRlZF9yZWZzKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCkKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZWNvcmRlZF9yZWZzKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgaW50ICpwZW5kaW5nX21vdmUpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHJlY29yZGVkX3JlZiAqY3VyOwpAQCAtMjgyNCwxMSArMzIxNywxNyBAQAogCQkJCSAqIGRpcnMsIHdlIGFsd2F5cyBoYXZlIG9uZSBuZXcgYW5kIG9uZSBkZWxldGVkCiAJCQkJICogcmVmLiBUaGUgZGVsZXRlZCByZWYgaXMgaWdub3JlZCBsYXRlci4KIAkJCQkgKi8KLQkJCQlyZXQgPSBzZW5kX3JlbmFtZShzY3R4LCB2YWxpZF9wYXRoLAotCQkJCQkJY3VyLT5mdWxsX3BhdGgpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dDsKLQkJCQlyZXQgPSBmc19wYXRoX2NvcHkodmFsaWRfcGF0aCwgY3VyLT5mdWxsX3BhdGgpOworCQkJCWlmICh3YWl0X2Zvcl9wYXJlbnRfbW92ZShzY3R4LCBjdXIpKSB7CisJCQkJCXJldCA9IGFkZF9wZW5kaW5nX2Rpcl9tb3ZlKHNjdHgsCisJCQkJCQkJCSAgIGN1ci0+ZGlyKTsKKwkJCQkJKnBlbmRpbmdfbW92ZSA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0ID0gc2VuZF9yZW5hbWUoc2N0eCwgdmFsaWRfcGF0aCwKKwkJCQkJCQkgIGN1ci0+ZnVsbF9wYXRoKTsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSBmc19wYXRoX2NvcHkodmFsaWRfcGF0aCwKKwkJCQkJCQkgICAgICAgY3VyLT5mdWxsX3BhdGgpOworCQkJCX0KIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJZ290byBvdXQ7CiAJCQl9IGVsc2UgewpAQCAtMzE5Nyw2ICszNTk2LDcgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CiAJaW50IHNsb3Q7CiAJaXRlcmF0ZV9pbm9kZV9yZWZfdCBjYjsKKwlpbnQgcGVuZGluZ19tb3ZlID0gMDsKIAogCXBhdGggPSBhbGxvY19wYXRoX2Zvcl9zZW5kKCk7CiAJaWYgKCFwYXRoKQpAQCAtMzI0MCw3ICszNjQwLDkgQEAKIAl9CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCi0JcmV0ID0gcHJvY2Vzc19yZWNvcmRlZF9yZWZzKHNjdHgpOworCXJldCA9IHByb2Nlc3NfcmVjb3JkZWRfcmVmcyhzY3R4LCAmcGVuZGluZ19tb3ZlKTsKKwkvKiBPbmx5IGFwcGxpY2FibGUgdG8gYW4gaW5jcmVtZW50YWwgc2VuZC4gKi8KKwlBU1NFUlQocGVuZGluZ19tb3ZlID09IDApOwogCiBvdXQ6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwpAQCAtMzcwNiw3ICs0MTA4LDcgQEAKIAlUTFZfUFVUX1VVSUQoc2N0eCwgQlRSRlNfU0VORF9BX0NMT05FX1VVSUQsCiAJCQljbG9uZV9yb290LT5yb290LT5yb290X2l0ZW0udXVpZCk7CiAJVExWX1BVVF9VNjQoc2N0eCwgQlRSRlNfU0VORF9BX0NMT05FX0NUUkFOU0lELAotCQkJY2xvbmVfcm9vdC0+cm9vdC0+cm9vdF9pdGVtLmN0cmFuc2lkKTsKKwkJICAgIGxlNjRfdG9fY3B1KGNsb25lX3Jvb3QtPnJvb3QtPnJvb3RfaXRlbS5jdHJhbnNpZCkpOwogCVRMVl9QVVRfUEFUSChzY3R4LCBCVFJGU19TRU5EX0FfQ0xPTkVfUEFUSCwgcCk7CiAJVExWX1BVVF9VNjQoc2N0eCwgQlRSRlNfU0VORF9BX0NMT05FX09GRlNFVCwKIAkJCWNsb25lX3Jvb3QtPm9mZnNldCk7CkBAIC0zNzUyLDYgKzQxNTQsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHNlbmRfaG9sZShzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIHU2NCBlbmQpCit7CisJc3RydWN0IGZzX3BhdGggKnAgPSBOVUxMOworCXU2NCBvZmZzZXQgPSBzY3R4LT5jdXJfaW5vZGVfbGFzdF9leHRlbnQ7CisJdTY0IGxlbjsKKwlpbnQgcmV0ID0gMDsKKworCXAgPSBmc19wYXRoX2FsbG9jKCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2N0eC0+cmVhZF9idWYsIDAsIEJUUkZTX1NFTkRfUkVBRF9TSVpFKTsKKwl3aGlsZSAob2Zmc2V0IDwgZW5kKSB7CisJCWxlbiA9IG1pbl90KHU2NCwgZW5kIC0gb2Zmc2V0LCBCVFJGU19TRU5EX1JFQURfU0laRSk7CisKKwkJcmV0ID0gYmVnaW5fY21kKHNjdHgsIEJUUkZTX1NFTkRfQ19XUklURSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IGdldF9jdXJfcGF0aChzY3R4LCBzY3R4LT5jdXJfaW5vLCBzY3R4LT5jdXJfaW5vZGVfZ2VuLCBwKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJVExWX1BVVF9QQVRIKHNjdHgsIEJUUkZTX1NFTkRfQV9QQVRILCBwKTsKKwkJVExWX1BVVF9VNjQoc2N0eCwgQlRSRlNfU0VORF9BX0ZJTEVfT0ZGU0VULCBvZmZzZXQpOworCQlUTFZfUFVUKHNjdHgsIEJUUkZTX1NFTkRfQV9EQVRBLCBzY3R4LT5yZWFkX2J1ZiwgbGVuKTsKKwkJcmV0ID0gc2VuZF9jbWQoc2N0eCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCW9mZnNldCArPSBsZW47CisJfQordGx2X3B1dF9mYWlsdXJlOgorCWZzX3BhdGhfZnJlZShwKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHNlbmRfd3JpdGVfb3JfY2xvbmUoc3RydWN0IHNlbmRfY3R4ICpzY3R4LAogCQkJICAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19rZXkgKmtleSwKQEAgLTM3NjQsMTIgKzQxOTksMTQgQEAKIAl1NjQgbGVuOwogCXUzMiBsOwogCXU4IHR5cGU7CisJdTY0IGJzID0gc2N0eC0+c2VuZF9yb290LT5mc19pbmZvLT5zYi0+c19ibG9ja3NpemU7CiAKIAllaSA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKIAkJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKIAl0eXBlID0gYnRyZnNfZmlsZV9leHRlbnRfdHlwZShwYXRoLT5ub2Rlc1swXSwgZWkpOwogCWlmICh0eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgewotCQlsZW4gPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKHBhdGgtPm5vZGVzWzBdLCBlaSk7CisJCWxlbiA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4ocGF0aC0+bm9kZXNbMF0sCisJCQkJCQkgICBwYXRoLT5zbG90c1swXSwgZWkpOwogCQkvKgogCQkgKiBpdCBpcyBwb3NzaWJsZSB0aGUgaW5saW5lIGl0ZW0gd29uJ3QgY292ZXIgdGhlIHdob2xlIHBhZ2UsCiAJCSAqIGJ1dCB0aGVyZSBtYXkgYmUgaXRlbXMgYWZ0ZXIgdGhpcyBwYWdlLiAgTWFrZQpAQCAtMzc4Nyw3ICs0MjI0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNsb25lX3Jvb3QpIHsKKwlpZiAoY2xvbmVfcm9vdCAmJiBJU19BTElHTkVEKG9mZnNldCArIGxlbiwgYnMpKSB7CiAJCXJldCA9IHNlbmRfY2xvbmUoc2N0eCwgb2Zmc2V0LCBsZW4sIGNsb25lX3Jvb3QpOwogCX0gZWxzZSBpZiAoc2N0eC0+ZmxhZ3MgJiBCVFJGU19TRU5EX0ZMQUdfTk9fRklMRV9EQVRBKSB7CiAJCXJldCA9IHNlbmRfdXBkYXRlX2V4dGVudChzY3R4LCBvZmZzZXQsIGxlbik7CkBAIC0zOTc5LDYgKzQ0MTYsMTAxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBnZXRfbGFzdF9leHRlbnQoc3RydWN0IHNlbmRfY3R4ICpzY3R4LCB1NjQgb2Zmc2V0KQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gc2N0eC0+c2VuZF9yb290OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwl1NjQgZXh0ZW50X2VuZDsKKwl1OCB0eXBlOworCWludCByZXQ7CisKKwlwYXRoID0gYWxsb2NfcGF0aF9mb3Jfc2VuZCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzY3R4LT5jdXJfaW5vZGVfbGFzdF9leHRlbnQgPSAwOworCisJa2V5Lm9iamVjdGlkID0gc2N0eC0+Y3VyX2lubzsKKwlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKKwlrZXkub2Zmc2V0ID0gb2Zmc2V0OworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90X2Zvcl9yZWFkKHJvb3QsICZrZXksIHBhdGgsIDAsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSAwOworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCWlmIChrZXkub2JqZWN0aWQgIT0gc2N0eC0+Y3VyX2lubyB8fCBrZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCWdvdG8gb3V0OworCisJZmkgPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCXR5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKHBhdGgtPm5vZGVzWzBdLCBmaSk7CisJaWYgKHR5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCXU2NCBzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCQlwYXRoLT5zbG90c1swXSwgZmkpOworCQlleHRlbnRfZW5kID0gQUxJR04oa2V5Lm9mZnNldCArIHNpemUsCisJCQkJICAgc2N0eC0+c2VuZF9yb290LT5zZWN0b3JzaXplKTsKKwl9IGVsc2UgeworCQlleHRlbnRfZW5kID0ga2V5Lm9mZnNldCArCisJCQlidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMocGF0aC0+bm9kZXNbMF0sIGZpKTsKKwl9CisJc2N0eC0+Y3VyX2lub2RlX2xhc3RfZXh0ZW50ID0gZXh0ZW50X2VuZDsKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXliZV9zZW5kX2hvbGUoc3RydWN0IHNlbmRfY3R4ICpzY3R4LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCSAgIHN0cnVjdCBidHJmc19rZXkgKmtleSkKK3sKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJdTY0IGV4dGVudF9lbmQ7CisJdTggdHlwZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzY3R4LT5jdXJfaW5vICE9IGtleS0+b2JqZWN0aWQgfHwgIW5lZWRfc2VuZF9ob2xlKHNjdHgpKQorCQlyZXR1cm4gMDsKKworCWlmIChzY3R4LT5jdXJfaW5vZGVfbGFzdF9leHRlbnQgPT0gKHU2NCktMSkgeworCQlyZXQgPSBnZXRfbGFzdF9leHRlbnQoc2N0eCwga2V5LT5vZmZzZXQgLSAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZmkgPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCXR5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKHBhdGgtPm5vZGVzWzBdLCBmaSk7CisJaWYgKHR5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCXU2NCBzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCQlwYXRoLT5zbG90c1swXSwgZmkpOworCQlleHRlbnRfZW5kID0gQUxJR04oa2V5LT5vZmZzZXQgKyBzaXplLAorCQkJCSAgIHNjdHgtPnNlbmRfcm9vdC0+c2VjdG9yc2l6ZSk7CisJfSBlbHNlIHsKKwkJZXh0ZW50X2VuZCA9IGtleS0+b2Zmc2V0ICsKKwkJCWJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhwYXRoLT5ub2Rlc1swXSwgZmkpOworCX0KKworCWlmIChwYXRoLT5zbG90c1swXSA9PSAwICYmCisJICAgIHNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA8IGtleS0+b2Zmc2V0KSB7CisJCS8qCisJCSAqIFdlIG1pZ2h0IGhhdmUgc2tpcHBlZCBlbnRpcmUgbGVhZnMgdGhhdCBjb250YWluZWQgb25seQorCQkgKiBmaWxlIGV4dGVudCBpdGVtcyBmb3Igb3VyIGN1cnJlbnQgaW5vZGUuIFRoZXNlIGxlYWZzIGhhdmUKKwkJICogYSBnZW5lcmF0aW9uIG51bWJlciBzbWFsbGVyIChvbGRlcikgdGhhbiB0aGUgb25lIGluIHRoZQorCQkgKiBjdXJyZW50IGxlYWYgYW5kIHRoZSBsZWFmIG91ciBsYXN0IGV4dGVudCBjYW1lIGZyb20sIGFuZAorCQkgKiBhcmUgbG9jYXRlZCBiZXR3ZWVuIHRoZXNlIDIgbGVhZnMuCisJCSAqLworCQlyZXQgPSBnZXRfbGFzdF9leHRlbnQoc2N0eCwga2V5LT5vZmZzZXQgLSAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA8IGtleS0+b2Zmc2V0KQorCQlyZXQgPSBzZW5kX2hvbGUoc2N0eCwga2V5LT5vZmZzZXQpOworCXNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA9IGV4dGVudF9lbmQ7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBwcm9jZXNzX2V4dGVudChzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsCiAJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkJICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCkBAIC0zOTk1LDcgKzQ1MjcsNyBAQAogCQkJZ290byBvdXQ7CiAJCWlmIChyZXQpIHsKIAkJCXJldCA9IDA7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2hvbGU7CiAJCX0KIAl9IGVsc2UgewogCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZWk7CkBAIC00MDMxLDcgKzQ1NjMsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSBzZW5kX3dyaXRlX29yX2Nsb25lKHNjdHgsIHBhdGgsIGtleSwgZm91bmRfY2xvbmUpOwotCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CitvdXRfaG9sZToKKwlyZXQgPSBtYXliZV9zZW5kX2hvbGUoc2N0eCwgcGF0aCwga2V5KTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDA1NCwxNyArNDU4OSwyNSBAQAogCWtleS5vYmplY3RpZCA9IHNjdHgtPmNtcF9rZXktPm9iamVjdGlkOwogCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOwogCWtleS5vZmZzZXQgPSAwOwotCXdoaWxlICgxKSB7Ci0JCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90X2Zvcl9yZWFkKHJvb3QsICZrZXksIHBhdGgsIDEsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CiAKKwl3aGlsZSAoMSkgewogCQllYiA9IHBhdGgtPm5vZGVzWzBdOwogCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisKKwkJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIGlmIChyZXQgPiAwKSB7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKIAkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGViLCAmZm91bmRfa2V5LCBzbG90KTsKIAogCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGtleS5vYmplY3RpZCB8fApAQCAtNDA3Nyw4ICs0NjIwLDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAotCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7Ci0JCWtleS5vZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0ICsgMTsKKwkJcGF0aC0+c2xvdHNbMF0rKzsKIAl9CiAKIG91dDoKQEAgLTQwODYsNyArNDYyOCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwcm9jZXNzX3JlY29yZGVkX3JlZnNfaWZfbmVlZGVkKHN0cnVjdCBzZW5kX2N0eCAqc2N0eCwgaW50IGF0X2VuZCkKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZWNvcmRlZF9yZWZzX2lmX25lZWRlZChzdHJ1Y3Qgc2VuZF9jdHggKnNjdHgsIGludCBhdF9lbmQsCisJCQkJCSAgIGludCAqcGVuZGluZ19tb3ZlLAorCQkJCQkgICBpbnQgKnJlZnNfcHJvY2Vzc2VkKQogewogCWludCByZXQgPSAwOwogCkBAIC00MDk4LDE3ICs0NjQyLDExIEBACiAJaWYgKGxpc3RfZW1wdHkoJnNjdHgtPm5ld19yZWZzKSAmJiBsaXN0X2VtcHR5KCZzY3R4LT5kZWxldGVkX3JlZnMpKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHByb2Nlc3NfcmVjb3JkZWRfcmVmcyhzY3R4KTsKKwlyZXQgPSBwcm9jZXNzX3JlY29yZGVkX3JlZnMoc2N0eCwgcGVuZGluZ19tb3ZlKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFdlIGhhdmUgcHJvY2Vzc2VkIHRoZSByZWZzIGFuZCB0aHVzIG5lZWQgdG8gYWR2YW5jZSBzZW5kX3Byb2dyZXNzLgotCSAqIE5vdywgY2FsbHMgdG8gZ2V0X2N1cl94eHggd2lsbCB0YWtlIHRoZSB1cGRhdGVkIHJlZnMgb2YgdGhlIGN1cnJlbnQKLQkgKiBpbm9kZSBpbnRvIGFjY291bnQuCi0JICovCi0Jc2N0eC0+c2VuZF9wcm9ncmVzcyA9IHNjdHgtPmN1cl9pbm8gKyAxOwotCisJKnJlZnNfcHJvY2Vzc2VkID0gMTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDEyNCwxMSArNDY2MiwyOSBAQAogCXU2NCByaWdodF9naWQ7CiAJaW50IG5lZWRfY2htb2QgPSAwOwogCWludCBuZWVkX2Nob3duID0gMDsKKwlpbnQgcGVuZGluZ19tb3ZlID0gMDsKKwlpbnQgcmVmc19wcm9jZXNzZWQgPSAwOwogCi0JcmV0ID0gcHJvY2Vzc19yZWNvcmRlZF9yZWZzX2lmX25lZWRlZChzY3R4LCBhdF9lbmQpOworCXJldCA9IHByb2Nlc3NfcmVjb3JkZWRfcmVmc19pZl9uZWVkZWQoc2N0eCwgYXRfZW5kLCAmcGVuZGluZ19tb3ZlLAorCQkJCQkgICAgICAmcmVmc19wcm9jZXNzZWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAorCS8qCisJICogV2UgaGF2ZSBwcm9jZXNzZWQgdGhlIHJlZnMgYW5kIHRodXMgbmVlZCB0byBhZHZhbmNlIHNlbmRfcHJvZ3Jlc3MuCisJICogTm93LCBjYWxscyB0byBnZXRfY3VyX3h4eCB3aWxsIHRha2UgdGhlIHVwZGF0ZWQgcmVmcyBvZiB0aGUgY3VycmVudAorCSAqIGlub2RlIGludG8gYWNjb3VudC4KKwkgKgorCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBvdXIgY3VycmVudCBpbm9kZSBpcyBhIGRpcmVjdG9yeSBhbmQgY291bGRuJ3QKKwkgKiBiZSBtb3ZlZC9yZW5hbWVkIGJlY2F1c2UgaXRzIHBhcmVudCB3YXMgcmVuYW1lZC9tb3ZlZCB0b28gYW5kIGl0IGhhcworCSAqIGEgaGlnaGVyIGlub2RlIG51bWJlciwgd2UgY2FuIG9ubHkgbW92ZS9yZW5hbWUgb3VyIGN1cnJlbnQgaW5vZGUKKwkgKiBhZnRlciB3ZSBtb3ZlZC9yZW5hbWVkIGl0cyBwYXJlbnQuIFRoZXJlZm9yZSBpbiB0aGlzIGNhc2Ugb3BlcmF0ZSBvbgorCSAqIHRoZSBvbGQgcGF0aCAocHJlIG1vdmUvcmVuYW1lKSBvZiBvdXIgY3VycmVudCBpbm9kZSwgYW5kIHRoZQorCSAqIG1vdmUvcmVuYW1lIHdpbGwgYmUgcGVyZm9ybWVkIGxhdGVyLgorCSAqLworCWlmIChyZWZzX3Byb2Nlc3NlZCAmJiAhcGVuZGluZ19tb3ZlKQorCQlzY3R4LT5zZW5kX3Byb2dyZXNzID0gc2N0eC0+Y3VyX2lubyArIDE7CisKIAlpZiAoc2N0eC0+Y3VyX2lubyA9PSAwIHx8IHNjdHgtPmN1cl9pbm9kZV9kZWxldGVkKQogCQlnb3RvIG91dDsKIAlpZiAoIWF0X2VuZCAmJiBzY3R4LT5jbXBfa2V5LT5vYmplY3RpZCA9PSBzY3R4LT5jdXJfaW5vKQpAQCAtNDE1Nyw2ICs0NzEzLDE5IEBACiAJfQogCiAJaWYgKFNfSVNSRUcoc2N0eC0+Y3VyX2lub2RlX21vZGUpKSB7CisJCWlmIChuZWVkX3NlbmRfaG9sZShzY3R4KSkgeworCQkJaWYgKHNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA9PSAodTY0KS0xKSB7CisJCQkJcmV0ID0gZ2V0X2xhc3RfZXh0ZW50KHNjdHgsICh1NjQpLTEpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKHNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA8CisJCQkgICAgc2N0eC0+Y3VyX2lub2RlX3NpemUpIHsKKwkJCQlyZXQgPSBzZW5kX2hvbGUoc2N0eCwgc2N0eC0+Y3VyX2lub2RlX3NpemUpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CiAJCXJldCA9IHNlbmRfdHJ1bmNhdGUoc2N0eCwgc2N0eC0+Y3VyX2lubywgc2N0eC0+Y3VyX2lub2RlX2dlbiwKIAkJCQlzY3R4LT5jdXJfaW5vZGVfc2l6ZSk7CiAJCWlmIChyZXQgPCAwKQpAQCAtNDE3Nyw5ICs0NzQ2LDIxIEBACiAJfQogCiAJLyoKLQkgKiBOZWVkIHRvIHNlbmQgdGhhdCBldmVyeSB0aW1lLCBubyBtYXR0ZXIgaWYgaXQgYWN0dWFsbHkgY2hhbmdlZAotCSAqIGJldHdlZW4gdGhlIHR3byB0cmVlcyBhcyB3ZSBoYXZlIGRvbmUgY2hhbmdlcyB0byB0aGUgaW5vZGUgYmVmb3JlLgorCSAqIElmIG90aGVyIGRpcmVjdG9yeSBpbm9kZXMgZGVwZW5kZWQgb24gb3VyIGN1cnJlbnQgZGlyZWN0b3J5CisJICogaW5vZGUncyBtb3ZlL3JlbmFtZSwgbm93IGRvIHRoZWlyIG1vdmUvcmVuYW1lIG9wZXJhdGlvbnMuCiAJICovCisJaWYgKCFpc193YWl0aW5nX2Zvcl9tb3ZlKHNjdHgsIHNjdHgtPmN1cl9pbm8pKSB7CisJCXJldCA9IGFwcGx5X2NoaWxkcmVuX2Rpcl9tb3ZlcyhzY3R4KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTmVlZCB0byBzZW5kIHRoYXQgZXZlcnkgdGltZSwgbm8gbWF0dGVyIGlmIGl0IGFjdHVhbGx5CisJICogY2hhbmdlZCBiZXR3ZWVuIHRoZSB0d28gdHJlZXMgYXMgd2UgaGF2ZSBkb25lIGNoYW5nZXMgdG8KKwkgKiB0aGUgaW5vZGUgYmVmb3JlLgorCSAqLworCXNjdHgtPnNlbmRfcHJvZ3Jlc3MgPSBzY3R4LT5jdXJfaW5vICsgMTsKIAlyZXQgPSBzZW5kX3V0aW1lcyhzY3R4LCBzY3R4LT5jdXJfaW5vLCBzY3R4LT5jdXJfaW5vZGVfZ2VuKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CkBAIC00MjAwLDYgKzQ3ODEsNyBAQAogCiAJc2N0eC0+Y3VyX2lubyA9IGtleS0+b2JqZWN0aWQ7CiAJc2N0eC0+Y3VyX2lub2RlX25ld19nZW4gPSAwOworCXNjdHgtPmN1cl9pbm9kZV9sYXN0X2V4dGVudCA9ICh1NjQpLTE7CiAKIAkvKgogCSAqIFNldCBzZW5kX3Byb2dyZXNzIHRvIGN1cnJlbnQgaW5vZGUuIFRoaXMgd2lsbCB0ZWxsIGFsbCBnZXRfY3VyX3h4eApAQCAtNDQ4MCwxNCArNTA2MiwxOCBAQAogCXN0cnVjdCBzZW5kX2N0eCAqc2N0eCA9IGN0eDsKIAogCWlmIChyZXN1bHQgPT0gQlRSRlNfQ09NUEFSRV9UUkVFX1NBTUUpIHsKLQkJaWYgKGtleS0+dHlwZSAhPSBCVFJGU19JTk9ERV9SRUZfS0VZICYmCi0JCSAgICBrZXktPnR5cGUgIT0gQlRSRlNfSU5PREVfRVhUUkVGX0tFWSkKKwkJaWYgKGtleS0+dHlwZSA9PSBCVFJGU19JTk9ERV9SRUZfS0VZIHx8CisJCSAgICBrZXktPnR5cGUgPT0gQlRSRlNfSU5PREVfRVhUUkVGX0tFWSkgeworCQkJcmV0ID0gY29tcGFyZV9yZWZzKHNjdHgsIGxlZnRfcGF0aCwga2V5KTsKKwkJCWlmICghcmV0KQorCQkJCXJldHVybiAwOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChrZXktPnR5cGUgPT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKSB7CisJCQlyZXR1cm4gbWF5YmVfc2VuZF9ob2xlKHNjdHgsIGxlZnRfcGF0aCwga2V5KTsKKwkJfSBlbHNlIHsKIAkJCXJldHVybiAwOwotCQlyZXQgPSBjb21wYXJlX3JlZnMoc2N0eCwgbGVmdF9wYXRoLCBrZXkpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiAwOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCX0KIAkJcmVzdWx0ID0gQlRSRlNfQ09NUEFSRV9UUkVFX0NIQU5HRUQ7CiAJCXJldCA9IDA7CiAJfQpAQCAtNDUyMiw3ICs1MTA4LDYgQEAKIHN0YXRpYyBpbnQgZnVsbF9zZW5kX3RyZWUoc3RydWN0IHNlbmRfY3R4ICpzY3R4KQogewogCWludCByZXQ7Ci0Jc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMgPSBOVUxMOwogCXN0cnVjdCBidHJmc19yb290ICpzZW5kX3Jvb3QgPSBzY3R4LT5zZW5kX3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CkBAIC00NTQ0LDE5ICs1MTI5LDYgQEAKIAlrZXkudHlwZSA9IEJUUkZTX0lOT0RFX0lURU1fS0VZOwogCWtleS5vZmZzZXQgPSAwOwogCi1qb2luX3RyYW5zOgotCS8qCi0JICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IGdldCBjb21taXR0ZWQKLQkgKiB3aGlsZSB3ZSBkbyBhbnl0aGluZyBvbiBjb21taXQgcm9vdHMuIEpvaW4gYSB0cmFuc2FjdGlvbiB0byBwcmV2ZW50Ci0JICogdGhpcy4KLQkgKi8KLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc2VuZF9yb290KTsKLQlpZiAoSVNfRVJSKHRyYW5zKSkgewotCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKLQkJdHJhbnMgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0KIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgdHJlZSBoYXMgbm90IGNoYW5nZWQgYWZ0ZXIgcmUtam9pbmluZy4gV2UgZGV0ZWN0IHRoaXMKIAkgKiBieSBjb21wYXJpbmcgc3RhcnRfY3RyYW5zaWQgYW5kIGN0cmFuc2lkLiBUaGV5IHNob3VsZCBhbHdheXMgbWF0Y2guCkBAIC00NTY2LDcgKzUxMzgsNyBAQAogCXNwaW5fdW5sb2NrKCZzZW5kX3Jvb3QtPnJvb3RfaXRlbV9sb2NrKTsKIAogCWlmIChjdHJhbnNpZCAhPSBzdGFydF9jdHJhbnNpZCkgewotCQlXQVJOKDEsIEtFUk5fV0FSTklORyAiYnRyZnM6IHRoZSByb290IHRoYXQgeW91J3JlIHRyeWluZyB0byAiCisJCVdBUk4oMSwgS0VSTl9XQVJOSU5HICJCVFJGUzogdGhlIHJvb3QgdGhhdCB5b3UncmUgdHJ5aW5nIHRvICIKIAkJCQkgICAgICJzZW5kIHdhcyBtb2RpZmllZCBpbiBiZXR3ZWVuLiBUaGlzIGlzICIKIAkJCQkgICAgICJwcm9iYWJseSBhIGJ1Zy5cbiIpOwogCQlyZXQgPSAtRUlPOwpAQCAtNDU4MCwxOSArNTE1Miw2IEBACiAJCWdvdG8gb3V0X2ZpbmlzaDsKIAogCXdoaWxlICgxKSB7Ci0JCS8qCi0JCSAqIFdoZW4gc29tZW9uZSB3YW50IHRvIGNvbW1pdCB3aGlsZSB3ZSBpdGVyYXRlLCBlbmQgdGhlCi0JCSAqIGpvaW5lZCB0cmFuc2FjdGlvbiBhbmQgcmVqb2luLgotCQkgKi8KLQkJaWYgKGJ0cmZzX3Nob3VsZF9lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHNlbmRfcm9vdCkpIHsKLQkJCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgc2VuZF9yb290KTsKLQkJCXRyYW5zID0gTlVMTDsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwotCQkJZ290byBqb2luX3RyYW5zOwotCQl9Ci0KIAkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKIAkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwogCQlidHJmc19pdGVtX2tleV90b19jcHUoZWIsICZmb3VuZF9rZXksIHNsb3QpOwpAQCAtNDYyMCwxMiArNTE3OSw2IEBACiAKIG91dDoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JaWYgKHRyYW5zKSB7Ci0JCWlmICghcmV0KQotCQkJcmV0ID0gYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCBzZW5kX3Jvb3QpOwotCQllbHNlCi0JCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHNlbmRfcm9vdCk7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ2NjIsNiArNTIxNSwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGJ0cmZzX3Jvb3RfZGVjX3NlbmRfaW5fcHJvZ3Jlc3Moc3RydWN0IGJ0cmZzX3Jvb3QqIHJvb3QpCit7CisJc3Bpbl9sb2NrKCZyb290LT5yb290X2l0ZW1fbG9jayk7CisJcm9vdC0+c2VuZF9pbl9wcm9ncmVzcy0tOworCS8qCisJICogTm90IG11Y2ggbGVmdCB0byBkbywgd2UgZG9uJ3Qga25vdyB3aHkgaXQncyB1bmJhbGFuY2VkIGFuZAorCSAqIGNhbid0IGJsaW5kbHkgcmVzZXQgaXQgdG8gMC4KKwkgKi8KKwlpZiAocm9vdC0+c2VuZF9pbl9wcm9ncmVzcyA8IDApCisJCWJ0cmZzX2Vycihyb290LT5mc19pbmZvLAorCQkJInNlbmRfaW5fcHJvZ3JlcyB1bmJhbGFuY2VkICVkIHJvb3QgJWxsdVxuIiwKKwkJCXJvb3QtPnNlbmRfaW5fcHJvZ3Jlc3MsIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkKTsKKwlzcGluX3VubG9jaygmcm9vdC0+cm9vdF9pdGVtX2xvY2spOworfQorCiBsb25nIGJ0cmZzX2lvY3RsX3NlbmQoc3RydWN0IGZpbGUgKm1udF9maWxlLCB2b2lkIF9fdXNlciAqYXJnXykKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTQ2NzMsNiArNTI0MSw5IEBACiAJc3RydWN0IHNlbmRfY3R4ICpzY3R4ID0gTlVMTDsKIAl1MzIgaTsKIAl1NjQgKmNsb25lX3NvdXJjZXNfdG1wID0gTlVMTDsKKwlpbnQgY2xvbmVfc291cmNlc190b19yb2xsYmFjayA9IDA7CisJaW50IHNvcnRfY2xvbmVfcm9vdHMgPSAwOworCWludCBpbmRleDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTQ2ODEsMzggKzUyNTIsMjYgQEAKIAlmc19pbmZvID0gc2VuZF9yb290LT5mc19pbmZvOwogCiAJLyoKKwkgKiBUaGUgc3Vidm9sdW1lIG11c3QgcmVtYWluIHJlYWQtb25seSBkdXJpbmcgc2VuZCwgcHJvdGVjdCBhZ2FpbnN0CisJICogbWFraW5nIGl0IFJXLgorCSAqLworCXNwaW5fbG9jaygmc2VuZF9yb290LT5yb290X2l0ZW1fbG9jayk7CisJc2VuZF9yb290LT5zZW5kX2luX3Byb2dyZXNzKys7CisJc3Bpbl91bmxvY2soJnNlbmRfcm9vdC0+cm9vdF9pdGVtX2xvY2spOworCisJLyoKIAkgKiBUaGlzIGlzIGRvbmUgd2hlbiB3ZSBsb29rdXAgdGhlIHJvb3QsIGl0IHNob3VsZCBhbHJlYWR5IGJlIGNvbXBsZXRlCiAJICogYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuCiAJICovCiAJV0FSTl9PTihzZW5kX3Jvb3QtPm9ycGhhbl9jbGVhbnVwX3N0YXRlICE9IE9SUEhBTl9DTEVBTlVQX0RPTkUpOwogCiAJLyoKLQkgKiBJZiB3ZSBqdXN0IGNyZWF0ZWQgdGhpcyByb290IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9ycGhhbgotCSAqIGNsZWFudXAgaGFzIGJlZW4gZG9uZSBhbmQgY29tbWl0dGVkIHNpbmNlIHdlIHNlYXJjaCB0aGUgY29tbWl0IHJvb3QsCi0JICogc28gY2hlY2sgaXRzIGNvbW1pdCByb290IHRyYW5zaWQgd2l0aCBvdXIgb3RyYW5zaWQgYW5kIGlmIHRoZXkgbWF0Y2gKLQkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHVwZGF0ZWQuCisJICogVXNlcnNwYWNlIHRvb2xzIGRvIHRoZSBjaGVja3MgYW5kIHdhcm4gdGhlIHVzZXIgaWYgaXQncworCSAqIG5vdCBSTy4KIAkgKi8KLQlkb3duX3JlYWQoJnNlbmRfcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOwotCWlmIChidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihzZW5kX3Jvb3QtPmNvbW1pdF9yb290KSA9PQotCSAgICBidHJmc19yb290X290cmFuc2lkKCZzZW5kX3Jvb3QtPnJvb3RfaXRlbSkpIHsKLQkJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7Ci0KLQkJdXBfcmVhZCgmc2VuZF9yb290LT5mc19pbmZvLT5leHRlbnRfY29tbWl0X3NlbSk7Ci0KLQkJdHJhbnMgPSBidHJmc19hdHRhY2hfdHJhbnNhY3Rpb25fYmFycmllcihzZW5kX3Jvb3QpOwotCQlpZiAoSVNfRVJSKHRyYW5zKSkgewotCQkJaWYgKFBUUl9FUlIodHJhbnMpICE9IC1FTk9FTlQpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCS8qIEVOT0VOVCBtZWFucyB0aGVyZXMgbm8gdHJhbnNhY3Rpb24gKi8KLQkJfSBlbHNlIHsKLQkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgc2VuZF9yb290KTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9IGVsc2UgewotCQl1cF9yZWFkKCZzZW5kX3Jvb3QtPmZzX2luZm8tPmV4dGVudF9jb21taXRfc2VtKTsKKwlpZiAoIWJ0cmZzX3Jvb3RfcmVhZG9ubHkoc2VuZF9yb290KSkgeworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gb3V0OwogCX0KIAogCWFyZyA9IG1lbWR1cF91c2VyKGFyZ18sIHNpemVvZigqYXJnKSk7CkBAIC00NzUzLDggKzUzMTIsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzY3R4LT5tbnQgPSBtbnRfZmlsZS0+Zl9wYXRoLm1udDsKLQogCXNjdHgtPnNlbmRfcm9vdCA9IHNlbmRfcm9vdDsKIAlzY3R4LT5jbG9uZV9yb290c19jbnQgPSBhcmctPmNsb25lX3NvdXJjZXNfY291bnQ7CiAKQEAgLTQ3NzEsNiArNTMyOCw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXNjdHgtPnBlbmRpbmdfZGlyX21vdmVzID0gUkJfUk9PVDsKKwlzY3R4LT53YWl0aW5nX2Rpcl9tb3ZlcyA9IFJCX1JPT1Q7CisKIAlzY3R4LT5jbG9uZV9yb290cyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbG9uZV9yb290KSAqCiAJCQkoYXJnLT5jbG9uZV9zb3VyY2VzX2NvdW50ICsgMSkpOwogCWlmICghc2N0eC0+Y2xvbmVfcm9vdHMpIHsKQEAgLTQ3OTgsMTEgKzUzNTgsMjcgQEAKIAkJCWtleS5vYmplY3RpZCA9IGNsb25lX3NvdXJjZXNfdG1wW2ldOwogCQkJa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOwogCQkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkJCWluZGV4ID0gc3JjdV9yZWFkX2xvY2soJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKKwogCQkJY2xvbmVfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGZzX2luZm8sICZrZXkpOwogCQkJaWYgKElTX0VSUihjbG9uZV9yb290KSkgeworCQkJCXNyY3VfcmVhZF91bmxvY2soJmZzX2luZm8tPnN1YnZvbF9zcmN1LCBpbmRleCk7CiAJCQkJcmV0ID0gUFRSX0VSUihjbG9uZV9yb290KTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KKwkJCWNsb25lX3NvdXJjZXNfdG9fcm9sbGJhY2sgPSBpICsgMTsKKwkJCXNwaW5fbG9jaygmY2xvbmVfcm9vdC0+cm9vdF9pdGVtX2xvY2spOworCQkJY2xvbmVfcm9vdC0+c2VuZF9pbl9wcm9ncmVzcysrOworCQkJaWYgKCFidHJmc19yb290X3JlYWRvbmx5KGNsb25lX3Jvb3QpKSB7CisJCQkJc3Bpbl91bmxvY2soJmNsb25lX3Jvb3QtPnJvb3RfaXRlbV9sb2NrKTsKKwkJCQlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZjbG9uZV9yb290LT5yb290X2l0ZW1fbG9jayk7CisJCQlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOworCiAJCQlzY3R4LT5jbG9uZV9yb290c1tpXS5yb290ID0gY2xvbmVfcm9vdDsKIAkJfQogCQl2ZnJlZShjbG9uZV9zb3VyY2VzX3RtcCk7CkBAIC00ODEzLDExICs1Mzg5LDI3IEBACiAJCWtleS5vYmplY3RpZCA9IGFyZy0+cGFyZW50X3Jvb3Q7CiAJCWtleS50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKIAkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkJaW5kZXggPSBzcmN1X3JlYWRfbG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UpOworCiAJCXNjdHgtPnBhcmVudF9yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZnNfaW5mbywgJmtleSk7CiAJCWlmIChJU19FUlIoc2N0eC0+cGFyZW50X3Jvb3QpKSB7CisJCQlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOwogCQkJcmV0ID0gUFRSX0VSUihzY3R4LT5wYXJlbnRfcm9vdCk7CiAJCQlnb3RvIG91dDsKIAkJfQorCisJCXNwaW5fbG9jaygmc2N0eC0+cGFyZW50X3Jvb3QtPnJvb3RfaXRlbV9sb2NrKTsKKwkJc2N0eC0+cGFyZW50X3Jvb3QtPnNlbmRfaW5fcHJvZ3Jlc3MrKzsKKwkJaWYgKCFidHJmc19yb290X3JlYWRvbmx5KHNjdHgtPnBhcmVudF9yb290KSkgeworCQkJc3Bpbl91bmxvY2soJnNjdHgtPnBhcmVudF9yb290LT5yb290X2l0ZW1fbG9jayk7CisJCQlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJnNjdHgtPnBhcmVudF9yb290LT5yb290X2l0ZW1fbG9jayk7CisKKwkJc3JjdV9yZWFkX3VubG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UsIGluZGV4KTsKIAl9CiAKIAkvKgpAQCAtNDgzMSw2ICs1NDIzLDcgQEAKIAlzb3J0KHNjdHgtPmNsb25lX3Jvb3RzLCBzY3R4LT5jbG9uZV9yb290c19jbnQsCiAJCQlzaXplb2YoKnNjdHgtPmNsb25lX3Jvb3RzKSwgX19jbG9uZV9yb290X2NtcF9zb3J0LAogCQkJTlVMTCk7CisJc29ydF9jbG9uZV9yb290cyA9IDE7CiAKIAlyZXQgPSBzZW5kX3N1YnZvbChzY3R4KTsKIAlpZiAocmV0IDwgMCkKQEAgLTQ4NDYsNiArNTQzOSw0OCBAQAogCX0KIAogb3V0OgorCVdBUk5fT04oc2N0eCAmJiAhcmV0ICYmICFSQl9FTVBUWV9ST09UKCZzY3R4LT5wZW5kaW5nX2Rpcl9tb3ZlcykpOworCXdoaWxlIChzY3R4ICYmICFSQl9FTVBUWV9ST09UKCZzY3R4LT5wZW5kaW5nX2Rpcl9tb3ZlcykpIHsKKwkJc3RydWN0IHJiX25vZGUgKm47CisJCXN0cnVjdCBwZW5kaW5nX2Rpcl9tb3ZlICpwbTsKKworCQluID0gcmJfZmlyc3QoJnNjdHgtPnBlbmRpbmdfZGlyX21vdmVzKTsKKwkJcG0gPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGVuZGluZ19kaXJfbW92ZSwgbm9kZSk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmcG0tPmxpc3QpKSB7CisJCQlzdHJ1Y3QgcGVuZGluZ19kaXJfbW92ZSAqcG0yOworCisJCQlwbTIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwbS0+bGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBwZW5kaW5nX2Rpcl9tb3ZlLCBsaXN0KTsKKwkJCWZyZWVfcGVuZGluZ19tb3ZlKHNjdHgsIHBtMik7CisJCX0KKwkJZnJlZV9wZW5kaW5nX21vdmUoc2N0eCwgcG0pOworCX0KKworCVdBUk5fT04oc2N0eCAmJiAhcmV0ICYmICFSQl9FTVBUWV9ST09UKCZzY3R4LT53YWl0aW5nX2Rpcl9tb3ZlcykpOworCXdoaWxlIChzY3R4ICYmICFSQl9FTVBUWV9ST09UKCZzY3R4LT53YWl0aW5nX2Rpcl9tb3ZlcykpIHsKKwkJc3RydWN0IHJiX25vZGUgKm47CisJCXN0cnVjdCB3YWl0aW5nX2Rpcl9tb3ZlICpkbTsKKworCQluID0gcmJfZmlyc3QoJnNjdHgtPndhaXRpbmdfZGlyX21vdmVzKTsKKwkJZG0gPSByYl9lbnRyeShuLCBzdHJ1Y3Qgd2FpdGluZ19kaXJfbW92ZSwgbm9kZSk7CisJCXJiX2VyYXNlKCZkbS0+bm9kZSwgJnNjdHgtPndhaXRpbmdfZGlyX21vdmVzKTsKKwkJa2ZyZWUoZG0pOworCX0KKworCWlmIChzb3J0X2Nsb25lX3Jvb3RzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzY3R4LT5jbG9uZV9yb290c19jbnQ7IGkrKykKKwkJCWJ0cmZzX3Jvb3RfZGVjX3NlbmRfaW5fcHJvZ3Jlc3MoCisJCQkJCXNjdHgtPmNsb25lX3Jvb3RzW2ldLnJvb3QpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IHNjdHggJiYgaSA8IGNsb25lX3NvdXJjZXNfdG9fcm9sbGJhY2s7IGkrKykKKwkJCWJ0cmZzX3Jvb3RfZGVjX3NlbmRfaW5fcHJvZ3Jlc3MoCisJCQkJCXNjdHgtPmNsb25lX3Jvb3RzW2ldLnJvb3QpOworCisJCWJ0cmZzX3Jvb3RfZGVjX3NlbmRfaW5fcHJvZ3Jlc3Moc2VuZF9yb290KTsKKwl9CisJaWYgKHNjdHggJiYgIUlTX0VSUl9PUl9OVUxMKHNjdHgtPnBhcmVudF9yb290KSkKKwkJYnRyZnNfcm9vdF9kZWNfc2VuZF9pbl9wcm9ncmVzcyhzY3R4LT5wYXJlbnRfcm9vdCk7CisKIAlrZnJlZShhcmcpOwogCXZmcmVlKGNsb25lX3NvdXJjZXNfdG1wKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggZDcxYTExZC4uOTdjYzI0MSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC00OCw2ICs0OCw4IEBACiAjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKICNpbmNsdWRlICJidHJmc19pbm9kZS5oIgogI2luY2x1ZGUgInByaW50LXRyZWUuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAicHJvcHMuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgInZvbHVtZXMuaCIKICNpbmNsdWRlICJleHBvcnQuaCIKQEAgLTE1MiwxMSArMTU0LDEyIEBACiAJCXZhZi5mbXQgPSBmbXQ7CiAJCXZhZi52YSA9ICZhcmdzOwogCi0JCXByaW50ayhLRVJOX0NSSVQgIkJUUkZTIGVycm9yIChkZXZpY2UgJXMpIGluICVzOiVkOiBlcnJubz0lZCAlcyAoJXBWKVxuIiwKKwkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJIkJUUkZTOiBlcnJvciAoZGV2aWNlICVzKSBpbiAlczolZDogZXJybm89JWQgJXMgKCVwVilcbiIsCiAJCQlzYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsIGVycm5vLCBlcnJzdHIsICZ2YWYpOwogCQl2YV9lbmQoYXJncyk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiQlRSRlMgZXJyb3IgKGRldmljZSAlcykgaW4gJXM6JWQ6IGVycm5vPSVkICVzXG4iLAorCQlwcmludGsoS0VSTl9DUklUICJCVFJGUzogZXJyb3IgKGRldmljZSAlcykgaW4gJXM6JWQ6IGVycm5vPSVkICVzXG4iLAogCQkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBlcnJubywgZXJyc3RyKTsKIAl9CiAKQEAgLTI1MCw3ICsyNTMsNyBAQAogCSAqLwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChCVFJGU19GU19TVEFURV9UUkFOU19BQk9SVEVELAogCQkJCSZyb290LT5mc19pbmZvLT5mc19zdGF0ZSkpIHsKLQkJV0FSTigxLCBLRVJOX0RFQlVHICJidHJmczogVHJhbnNhY3Rpb24gYWJvcnRlZCAoZXJyb3IgJWQpXG4iLAorCQlXQVJOKDEsIEtFUk5fREVCVUcgIkJUUkZTOiBUcmFuc2FjdGlvbiBhYm9ydGVkIChlcnJvciAlZClcbiIsCiAJCQkJZXJybm8pOwogCX0KIAl0cmFucy0+YWJvcnRlZCA9IGVycm5vOwpAQCAtMjk0LDggKzI5Nyw4IEBACiAJCXBhbmljKEtFUk5fQ1JJVCAiQlRSRlMgcGFuaWMgKGRldmljZSAlcykgaW4gJXM6JWQ6ICVwViAoZXJybm89JWQgJXMpXG4iLAogCQkJc19pZCwgZnVuY3Rpb24sIGxpbmUsICZ2YWYsIGVycm5vLCBlcnJzdHIpOwogCi0JcHJpbnRrKEtFUk5fQ1JJVCAiQlRSRlMgcGFuaWMgKGRldmljZSAlcykgaW4gJXM6JWQ6ICVwViAoZXJybm89JWQgJXMpXG4iLAotCSAgICAgICBzX2lkLCBmdW5jdGlvbiwgbGluZSwgJnZhZiwgZXJybm8sIGVycnN0cik7CisJYnRyZnNfY3JpdChmc19pbmZvLCAicGFuaWMgaW4gJXM6JWQ6ICVwViAoZXJybm89JWQgJXMpIiwKKwkJICAgZnVuY3Rpb24sIGxpbmUsICZ2YWYsIGVycm5vLCBlcnJzdHIpOwogCXZhX2VuZChhcmdzKTsKIAkvKiBDYWxsZXIgY2FsbHMgQlVHKCkgKi8KIH0KQEAgLTMyMiw3ICszMjUsOSBAQAogCU9wdF9ub19zcGFjZV9jYWNoZSwgT3B0X3JlY292ZXJ5LCBPcHRfc2tpcF9iYWxhbmNlLAogCU9wdF9jaGVja19pbnRlZ3JpdHksIE9wdF9jaGVja19pbnRlZ3JpdHlfaW5jbHVkaW5nX2V4dGVudF9kYXRhLAogCU9wdF9jaGVja19pbnRlZ3JpdHlfcHJpbnRfbWFzaywgT3B0X2ZhdGFsX2Vycm9ycywgT3B0X3Jlc2Nhbl91dWlkX3RyZWUsCi0JT3B0X2NvbW1pdF9pbnRlcnZhbCwKKwlPcHRfY29tbWl0X2ludGVydmFsLCBPcHRfYmFycmllciwgT3B0X25vZGVmcmFnLCBPcHRfbm9kaXNjYXJkLAorCU9wdF9ub2Vub3NwY19kZWJ1ZywgT3B0X25vZmx1c2hvbmNvbW1pdCwgT3B0X2FjbCwgT3B0X2RhdGFjb3csCisJT3B0X2RhdGFzdW0sIE9wdF90cmVlbG9nLCBPcHRfbm9pbm9kZV9jYWNoZSwKIAlPcHRfZXJyLAogfTsKIApAQCAtMzMyLDggKzMzNywxMSBAQAogCXtPcHRfc3Vidm9saWQsICJzdWJ2b2xpZD0lcyJ9LAogCXtPcHRfZGV2aWNlLCAiZGV2aWNlPSVzIn0sCiAJe09wdF9ub2RhdGFzdW0sICJub2RhdGFzdW0ifSwKKwl7T3B0X2RhdGFzdW0sICJkYXRhc3VtIn0sCiAJe09wdF9ub2RhdGFjb3csICJub2RhdGFjb3cifSwKKwl7T3B0X2RhdGFjb3csICJkYXRhY293In0sCiAJe09wdF9ub2JhcnJpZXIsICJub2JhcnJpZXIifSwKKwl7T3B0X2JhcnJpZXIsICJiYXJyaWVyIn0sCiAJe09wdF9tYXhfaW5saW5lLCAibWF4X2lubGluZT0lcyJ9LAogCXtPcHRfYWxsb2Nfc3RhcnQsICJhbGxvY19zdGFydD0lcyJ9LAogCXtPcHRfdGhyZWFkX3Bvb2wsICJ0aHJlYWRfcG9vbD0lZCJ9LApAQCAtMzQ0LDE4ICszNTIsMjUgQEAKIAl7T3B0X3NzZCwgInNzZCJ9LAogCXtPcHRfc3NkX3NwcmVhZCwgInNzZF9zcHJlYWQifSwKIAl7T3B0X25vc3NkLCAibm9zc2QifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAogCXtPcHRfbm9hY2wsICJub2FjbCJ9LAogCXtPcHRfbm90cmVlbG9nLCAibm90cmVlbG9nIn0sCisJe09wdF90cmVlbG9nLCAidHJlZWxvZyJ9LAogCXtPcHRfZmx1c2hvbmNvbW1pdCwgImZsdXNob25jb21taXQifSwKKwl7T3B0X25vZmx1c2hvbmNvbW1pdCwgIm5vZmx1c2hvbmNvbW1pdCJ9LAogCXtPcHRfcmF0aW8sICJtZXRhZGF0YV9yYXRpbz0lZCJ9LAogCXtPcHRfZGlzY2FyZCwgImRpc2NhcmQifSwKKwl7T3B0X25vZGlzY2FyZCwgIm5vZGlzY2FyZCJ9LAogCXtPcHRfc3BhY2VfY2FjaGUsICJzcGFjZV9jYWNoZSJ9LAogCXtPcHRfY2xlYXJfY2FjaGUsICJjbGVhcl9jYWNoZSJ9LAogCXtPcHRfdXNlcl9zdWJ2b2xfcm1fYWxsb3dlZCwgInVzZXJfc3Vidm9sX3JtX2FsbG93ZWQifSwKIAl7T3B0X2Vub3NwY19kZWJ1ZywgImVub3NwY19kZWJ1ZyJ9LAorCXtPcHRfbm9lbm9zcGNfZGVidWcsICJub2Vub3NwY19kZWJ1ZyJ9LAogCXtPcHRfc3Vidm9scm9vdGlkLCAic3Vidm9scm9vdGlkPSVkIn0sCiAJe09wdF9kZWZyYWcsICJhdXRvZGVmcmFnIn0sCisJe09wdF9ub2RlZnJhZywgIm5vYXV0b2RlZnJhZyJ9LAogCXtPcHRfaW5vZGVfY2FjaGUsICJpbm9kZV9jYWNoZSJ9LAorCXtPcHRfbm9pbm9kZV9jYWNoZSwgIm5vaW5vZGVfY2FjaGUifSwKIAl7T3B0X25vX3NwYWNlX2NhY2hlLCAibm9zcGFjZV9jYWNoZSJ9LAogCXtPcHRfcmVjb3ZlcnksICJyZWNvdmVyeSJ9LAogCXtPcHRfc2tpcF9iYWxhbmNlLCAic2tpcF9iYWxhbmNlIn0sCkBAIC0zNjgsNiArMzgzLDIwIEBACiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIAorI2RlZmluZSBidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgb3B0LCBmbXQsIGFyZ3MuLi4pCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIG9wdCkpCQkJCQlcCisJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywgZm10LCAjI2FyZ3MpOwkJCVwKKwlidHJmc19zZXRfb3B0KHJvb3QtPmZzX2luZm8tPm1vdW50X29wdCwgb3B0KTsJCQlcCit9CisKKyNkZWZpbmUgYnRyZnNfY2xlYXJfYW5kX2luZm8ocm9vdCwgb3B0LCBmbXQsIGFyZ3MuLi4pCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgb3B0KSkJCQkJCVwKKwkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCBmbXQsICMjYXJncyk7CQkJXAorCWJ0cmZzX2NsZWFyX29wdChyb290LT5mc19pbmZvLT5tb3VudF9vcHQsIG9wdCk7CQkJXAorfQorCiAvKgogICogUmVndWxhciBtb3VudCBvcHRpb25zIHBhcnNlci4gIEV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgb25seSB3aGVuCiAgKiByZWFkaW5nIGluIGEgbmV3IHN1cGVyYmxvY2sgaXMgcGFyc2VkIGhlcmUuCkBAIC0zODMsNiArNDEyLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAljaGFyICpjb21wcmVzc190eXBlOwogCWJvb2wgY29tcHJlc3NfZm9yY2UgPSBmYWxzZTsKKwlib29sIGNvbXByZXNzID0gZmFsc2U7CiAKIAljYWNoZV9nZW4gPSBidHJmc19zdXBlcl9jYWNoZV9nZW5lcmF0aW9uKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWlmIChjYWNoZV9nZW4pCkBAIC00MDksNyArNDM5LDcgQEAKIAkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOwogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2RlZ3JhZGVkOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGFsbG93aW5nIGRlZ3JhZGVkIG1vdW50c1xuIik7CisJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJhbGxvd2luZyBkZWdyYWRlZCBtb3VudHMiKTsKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBERUdSQURFRCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfc3Vidm9sOgpAQCAtNDIyLDI3ICs0NTIsNDUgQEAKIAkJCSAqLwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vZGF0YXN1bToKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBzZXR0aW5nIG5vZGF0YXN1bVxuIik7Ci0JCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgTk9EQVRBU1VNKTsKKwkJCWJ0cmZzX3NldF9hbmRfaW5mbyhyb290LCBOT0RBVEFTVU0sCisJCQkJCSAgICJzZXR0aW5nIG5vZGF0YXN1bSIpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFzdW06CisJCQlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgTk9EQVRBU1VNKSkgeworCQkJCWlmIChidHJmc190ZXN0X29wdChyb290LCBOT0RBVEFDT1cpKQorCQkJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJzZXR0aW5nIGRhdGFzdW0sIGRhdGFjb3cgZW5hYmxlZCIpOworCQkJCWVsc2UKKwkJCQkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAic2V0dGluZyBkYXRhc3VtIik7CisJCQl9CisJCQlidHJmc19jbGVhcl9vcHQoaW5mby0+bW91bnRfb3B0LCBOT0RBVEFDT1cpOworCQkJYnRyZnNfY2xlYXJfb3B0KGluZm8tPm1vdW50X29wdCwgTk9EQVRBU1VNKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2RhdGFjb3c6Ci0JCQlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIENPTVBSRVNTKSB8fAotCQkJCSFidHJmc190ZXN0X29wdChyb290LCBGT1JDRV9DT01QUkVTUykpIHsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHNldHRpbmcgbm9kYXRhY293LCBjb21wcmVzc2lvbiBkaXNhYmxlZFxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBzZXR0aW5nIG5vZGF0YWNvd1xuIik7CisJCQlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIE5PREFUQUNPVykpIHsKKwkJCQlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIENPTVBSRVNTKSB8fAorCQkJCSAgICAhYnRyZnNfdGVzdF9vcHQocm9vdCwgRk9SQ0VfQ09NUFJFU1MpKSB7CisJCQkJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywKKwkJCQkJCSAgICJzZXR0aW5nIG5vZGF0YWNvdywgY29tcHJlc3Npb24gZGlzYWJsZWQiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJzZXR0aW5nIG5vZGF0YWNvdyIpOworCQkJCX0KIAkJCX0KIAkJCWJ0cmZzX2NsZWFyX29wdChpbmZvLT5tb3VudF9vcHQsIENPTVBSRVNTKTsKIAkJCWJ0cmZzX2NsZWFyX29wdChpbmZvLT5tb3VudF9vcHQsIEZPUkNFX0NPTVBSRVNTKTsKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBOT0RBVEFDT1cpOwogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIE5PREFUQVNVTSk7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfZGF0YWNvdzoKKwkJCWJ0cmZzX2NsZWFyX2FuZF9pbmZvKHJvb3QsIE5PREFUQUNPVywKKwkJCQkJICAgICAic2V0dGluZyBkYXRhY293Iik7CisJCQlicmVhazsKIAkJY2FzZSBPcHRfY29tcHJlc3NfZm9yY2U6CiAJCWNhc2UgT3B0X2NvbXByZXNzX2ZvcmNlX3R5cGU6CiAJCQljb21wcmVzc19mb3JjZSA9IHRydWU7CiAJCQkvKiBGYWxsdGhyb3VnaCAqLwogCQljYXNlIE9wdF9jb21wcmVzczoKIAkJY2FzZSBPcHRfY29tcHJlc3NfdHlwZToKKwkJCWNvbXByZXNzID0gdHJ1ZTsKIAkJCWlmICh0b2tlbiA9PSBPcHRfY29tcHJlc3MgfHwKIAkJCSAgICB0b2tlbiA9PSBPcHRfY29tcHJlc3NfZm9yY2UgfHwKIAkJCSAgICBzdHJjbXAoYXJnc1swXS5mcm9tLCAiemxpYiIpID09IDApIHsKQEAgLTQ2OSwzNCArNTE3LDM2IEBACiAJCQl9CiAKIAkJCWlmIChjb21wcmVzc19mb3JjZSkgewotCQkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBGT1JDRV9DT01QUkVTUyk7Ci0JCQkJcHJfaW5mbygiYnRyZnM6IGZvcmNlICVzIGNvbXByZXNzaW9uXG4iLAotCQkJCQljb21wcmVzc190eXBlKTsKLQkJCX0gZWxzZSBpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgQ09NUFJFU1MpKSB7Ci0JCQkJcHJfaW5mbygiYnRyZnM6IHVzZSAlcyBjb21wcmVzc2lvblxuIiwKLQkJCQkJY29tcHJlc3NfdHlwZSk7CisJCQkJYnRyZnNfc2V0X2FuZF9pbmZvKHJvb3QsIEZPUkNFX0NPTVBSRVNTLAorCQkJCQkJICAgImZvcmNlICVzIGNvbXByZXNzaW9uIiwKKwkJCQkJCSAgIGNvbXByZXNzX3R5cGUpOworCQkJfSBlbHNlIGlmIChjb21wcmVzcykgeworCQkJCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgQ09NUFJFU1MpKQorCQkJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sCisJCQkJCQkgICAiYnRyZnM6IHVzZSAlcyBjb21wcmVzc2lvblxuIiwKKwkJCQkJCSAgIGNvbXByZXNzX3R5cGUpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3NzZDoKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiB1c2Ugc3NkIGFsbG9jYXRpb24gc2NoZW1lXG4iKTsKLQkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBTU0QpOworCQkJYnRyZnNfc2V0X2FuZF9pbmZvKHJvb3QsIFNTRCwKKwkJCQkJICAgInVzZSBzc2QgYWxsb2NhdGlvbiBzY2hlbWUiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zc2Rfc3ByZWFkOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHVzZSBzcHJlYWQgc3NkICIKLQkJCSAgICAgICAiYWxsb2NhdGlvbiBzY2hlbWVcbiIpOwotCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIFNTRCk7Ci0JCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgU1NEX1NQUkVBRCk7CisJCQlidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgU1NEX1NQUkVBRCwKKwkJCQkJICAgInVzZSBzcHJlYWQgc3NkIGFsbG9jYXRpb24gc2NoZW1lIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9zc2Q6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogbm90IHVzaW5nIHNzZCBhbGxvY2F0aW9uICIKLQkJCSAgICAgICAic2NoZW1lXG4iKTsKLQkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBOT1NTRCk7CisJCQlidHJmc19jbGVhcl9hbmRfaW5mbyhyb290LCBOT1NTRCwKKwkJCQkJICAgICAibm90IHVzaW5nIHNzZCBhbGxvY2F0aW9uIHNjaGVtZSIpOwogCQkJYnRyZnNfY2xlYXJfb3B0KGluZm8tPm1vdW50X29wdCwgU1NEKTsKLQkJCWJ0cmZzX2NsZWFyX29wdChpbmZvLT5tb3VudF9vcHQsIFNTRF9TUFJFQUQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2JhcnJpZXI6CisJCQlidHJmc19jbGVhcl9hbmRfaW5mbyhyb290LCBOT0JBUlJJRVIsCisJCQkJCSAgICAgInR1cm5pbmcgb24gYmFycmllcnMiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2JhcnJpZXI6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogdHVybmluZyBvZmYgYmFycmllcnNcbiIpOwotCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIE5PQkFSUklFUik7CisJCQlidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgTk9CQVJSSUVSLAorCQkJCQkgICAidHVybmluZyBvZmYgYmFycmllcnMiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF90aHJlYWRfcG9vbDoKIAkJCXJldCA9IG1hdGNoX2ludCgmYXJnc1swXSwgJmludGFyZyk7CkBAIC01MjAsNyArNTcwLDcgQEAKIAkJCQkJCWluZm8tPm1heF9pbmxpbmUsCiAJCQkJCQlyb290LT5zZWN0b3JzaXplKTsKIAkJCQl9Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IG1heF9pbmxpbmUgYXQgJWxsdVxuIiwKKwkJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJtYXhfaW5saW5lIGF0ICVsbHUiLAogCQkJCQlpbmZvLT5tYXhfaW5saW5lKTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKQEAgLTUzNCwyNCArNTg0LDM0IEBACiAJCQkJaW5mby0+YWxsb2Nfc3RhcnQgPSBtZW1wYXJzZShudW0sIE5VTEwpOwogCQkJCW11dGV4X3VubG9jaygmaW5mby0+Y2h1bmtfbXV0ZXgpOwogCQkJCWtmcmVlKG51bSk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkiYnRyZnM6IGFsbG9jYXRpb25zIHN0YXJ0IGF0ICVsbHVcbiIsCisJCQkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAiYWxsb2NhdGlvbnMgc3RhcnQgYXQgJWxsdSIsCiAJCQkJCWluZm8tPmFsbG9jX3N0YXJ0KTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIE9wdF9hY2w6CisJCQlyb290LT5mc19pbmZvLT5zYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2FjbDoKIAkJCXJvb3QtPmZzX2luZm8tPnNiLT5zX2ZsYWdzICY9IH5NU19QT1NJWEFDTDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3RyZWVsb2c6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZGlzYWJsaW5nIHRyZWUgbG9nXG4iKTsKLQkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBOT1RSRUVMT0cpOworCQkJYnRyZnNfc2V0X2FuZF9pbmZvKHJvb3QsIE5PVFJFRUxPRywKKwkJCQkJICAgImRpc2FibGluZyB0cmVlIGxvZyIpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3RyZWVsb2c6CisJCQlidHJmc19jbGVhcl9hbmRfaW5mbyhyb290LCBOT1RSRUVMT0csCisJCQkJCSAgICAgImVuYWJsaW5nIHRyZWUgbG9nIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZmx1c2hvbmNvbW1pdDoKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiB0dXJuaW5nIG9uIGZsdXNoLW9uLWNvbW1pdFxuIik7Ci0JCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgRkxVU0hPTkNPTU1JVCk7CisJCQlidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgRkxVU0hPTkNPTU1JVCwKKwkJCQkJICAgInR1cm5pbmcgb24gZmx1c2gtb24tY29tbWl0Iik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9mbHVzaG9uY29tbWl0OgorCQkJYnRyZnNfY2xlYXJfYW5kX2luZm8ocm9vdCwgRkxVU0hPTkNPTU1JVCwKKwkJCQkJICAgICAidHVybmluZyBvZmYgZmx1c2gtb24tY29tbWl0Iik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmF0aW86CiAJCQlyZXQgPSBtYXRjaF9pbnQoJmFyZ3NbMF0sICZpbnRhcmcpOwpAQCAtNTU5LDcgKzYxOSw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9IGVsc2UgaWYgKGludGFyZyA+PSAwKSB7CiAJCQkJaW5mby0+bWV0YWRhdGFfcmF0aW8gPSBpbnRhcmc7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IG1ldGFkYXRhIHJhdGlvICVkXG4iLAorCQkJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywgIm1ldGFkYXRhIHJhdGlvICVkIiwKIAkJCQkgICAgICAgaW5mby0+bWV0YWRhdGFfcmF0aW8pOwogCQkJfSBlbHNlIHsKIAkJCQlyZXQgPSAtRUlOVkFMOwpAQCAtNTY3LDI1ICs2MjcsMzUgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE9wdF9kaXNjYXJkOgotCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIERJU0NBUkQpOworCQkJYnRyZnNfc2V0X2FuZF9pbmZvKHJvb3QsIERJU0NBUkQsCisJCQkJCSAgICJ0dXJuaW5nIG9uIGRpc2NhcmQiKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2Rpc2NhcmQ6CisJCQlidHJmc19jbGVhcl9hbmRfaW5mbyhyb290LCBESVNDQVJELAorCQkJCQkgICAgICJ0dXJuaW5nIG9mZiBkaXNjYXJkIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfc3BhY2VfY2FjaGU6Ci0JCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOworCQkJYnRyZnNfc2V0X2FuZF9pbmZvKHJvb3QsIFNQQUNFX0NBQ0hFLAorCQkJCQkgICAiZW5hYmxpbmcgZGlzayBzcGFjZSBjYWNoaW5nIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmVzY2FuX3V1aWRfdHJlZToKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBSRVNDQU5fVVVJRF9UUkVFKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub19zcGFjZV9jYWNoZToKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBkaXNhYmxpbmcgZGlzayBzcGFjZSBjYWNoaW5nXG4iKTsKLQkJCWJ0cmZzX2NsZWFyX29wdChpbmZvLT5tb3VudF9vcHQsIFNQQUNFX0NBQ0hFKTsKKwkJCWJ0cmZzX2NsZWFyX2FuZF9pbmZvKHJvb3QsIFNQQUNFX0NBQ0hFLAorCQkJCQkgICAgICJkaXNhYmxpbmcgZGlzayBzcGFjZSBjYWNoaW5nIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaW5vZGVfY2FjaGU6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZW5hYmxpbmcgaW5vZGUgbWFwIGNhY2hpbmdcbiIpOwotCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIElOT0RFX01BUF9DQUNIRSk7CisJCQlidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgQ0hBTkdFX0lOT0RFX0NBQ0hFLAorCQkJCQkgICAiZW5hYmxpbmcgaW5vZGUgbWFwIGNhY2hpbmciKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2lub2RlX2NhY2hlOgorCQkJYnRyZnNfY2xlYXJfYW5kX2luZm8ocm9vdCwgQ0hBTkdFX0lOT0RFX0NBQ0hFLAorCQkJCQkgICAgICJkaXNhYmxpbmcgaW5vZGUgbWFwIGNhY2hpbmciKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9jbGVhcl9jYWNoZToKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBmb3JjZSBjbGVhcmluZyBvZiBkaXNrIGNhY2hlXG4iKTsKLQkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBDTEVBUl9DQUNIRSk7CisJCQlidHJmc19zZXRfYW5kX2luZm8ocm9vdCwgQ0xFQVJfQ0FDSEUsCisJCQkJCSAgICJmb3JjZSBjbGVhcmluZyBvZiBkaXNrIGNhY2hlIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfdXNlcl9zdWJ2b2xfcm1fYWxsb3dlZDoKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBVU0VSX1NVQlZPTF9STV9BTExPV0VEKTsKQEAgLTU5MywxMiArNjYzLDE5IEBACiAJCWNhc2UgT3B0X2Vub3NwY19kZWJ1ZzoKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBFTk9TUENfREVCVUcpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZW5vc3BjX2RlYnVnOgorCQkJYnRyZnNfY2xlYXJfb3B0KGluZm8tPm1vdW50X29wdCwgRU5PU1BDX0RFQlVHKTsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9kZWZyYWc6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZW5hYmxpbmcgYXV0byBkZWZyYWdcbiIpOwotCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIEFVVE9fREVGUkFHKTsKKwkJCWJ0cmZzX3NldF9hbmRfaW5mbyhyb290LCBBVVRPX0RFRlJBRywKKwkJCQkJICAgImVuYWJsaW5nIGF1dG8gZGVmcmFnIik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9kZWZyYWc6CisJCQlidHJmc19jbGVhcl9hbmRfaW5mbyhyb290LCBBVVRPX0RFRlJBRywKKwkJCQkJICAgICAiZGlzYWJsaW5nIGF1dG8gZGVmcmFnIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmVjb3Zlcnk6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZW5hYmxpbmcgYXV0byByZWNvdmVyeVxuIik7CisJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJlbmFibGluZyBhdXRvIHJlY292ZXJ5Iik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgUkVDT1ZFUlkpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3NraXBfYmFsYW5jZToKQEAgLTYwNiwxNCArNjgzLDE0IEBACiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfQlRSRlNfRlNfQ0hFQ0tfSU5URUdSSVRZCiAJCWNhc2UgT3B0X2NoZWNrX2ludGVncml0eV9pbmNsdWRpbmdfZXh0ZW50X2RhdGE6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZW5hYmxpbmcgY2hlY2sgaW50ZWdyaXR5IgotCQkJICAgICAgICIgaW5jbHVkaW5nIGV4dGVudCBkYXRhXG4iKTsKKwkJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywKKwkJCQkgICAiZW5hYmxpbmcgY2hlY2sgaW50ZWdyaXR5IGluY2x1ZGluZyBleHRlbnQgZGF0YSIpOwogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsCiAJCQkJICAgICAgQ0hFQ0tfSU5URUdSSVRZX0lOQ0xVRElOR19FWFRFTlRfREFUQSk7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgQ0hFQ0tfSU5URUdSSVRZKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9jaGVja19pbnRlZ3JpdHk6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZW5hYmxpbmcgY2hlY2sgaW50ZWdyaXR5XG4iKTsKKwkJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywgImVuYWJsaW5nIGNoZWNrIGludGVncml0eSIpOwogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIENIRUNLX0lOVEVHUklUWSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfY2hlY2tfaW50ZWdyaXR5X3ByaW50X21hc2s6CkBAIC02MjIsOCArNjk5LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0gZWxzZSBpZiAoaW50YXJnID49IDApIHsKIAkJCQlpbmZvLT5jaGVja19pbnRlZ3JpdHlfcHJpbnRfbWFzayA9IGludGFyZzsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJidHJmczoiCi0JCQkJICAgICAgICIgY2hlY2tfaW50ZWdyaXR5X3ByaW50X21hc2sgMHgleFxuIiwKKwkJCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJjaGVja19pbnRlZ3JpdHlfcHJpbnRfbWFzayAweCV4IiwKIAkJCQkgICAgICAgaW5mby0+Y2hlY2tfaW50ZWdyaXR5X3ByaW50X21hc2spOwogCQkJfSBlbHNlIHsKIAkJCQlyZXQgPSAtRUlOVkFMOwpAQCAtNjM0LDggKzcxMCw4IEBACiAJCWNhc2UgT3B0X2NoZWNrX2ludGVncml0eV9pbmNsdWRpbmdfZXh0ZW50X2RhdGE6CiAJCWNhc2UgT3B0X2NoZWNrX2ludGVncml0eToKIAkJY2FzZSBPcHRfY2hlY2tfaW50ZWdyaXR5X3ByaW50X21hc2s6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBzdXBwb3J0IGZvciBjaGVja19pbnRlZ3JpdHkqIgotCQkJICAgICAgICIgbm90IGNvbXBpbGVkIGluIVxuIik7CisJCQlidHJmc19lcnIocm9vdC0+ZnNfaW5mbywKKwkJCQkic3VwcG9ydCBmb3IgY2hlY2tfaW50ZWdyaXR5KiBub3QgY29tcGlsZWQgaW4hIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAjZW5kaWYKQEAgLTY1NSwyOCArNzMxLDI0IEBACiAJCQlpbnRhcmcgPSAwOwogCQkJcmV0ID0gbWF0Y2hfaW50KCZhcmdzWzBdLCAmaW50YXJnKTsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJidHJmczogaW52YWxpZCBjb21taXQgaW50ZXJ2YWxcbiIpOworCQkJCWJ0cmZzX2Vycihyb290LT5mc19pbmZvLCAiaW52YWxpZCBjb21taXQgaW50ZXJ2YWwiKTsKIAkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJaWYgKGludGFyZyA+IDApIHsKIAkJCQlpZiAoaW50YXJnID4gMzAwKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJICAgICJidHJmczogZXhjZXNzaXZlIGNvbW1pdCBpbnRlcnZhbCAlZFxuIiwKKwkJCQkJYnRyZnNfd2Fybihyb290LT5mc19pbmZvLCAiZXhjZXNzaXZlIGNvbW1pdCBpbnRlcnZhbCAlZCIsCiAJCQkJCQkJaW50YXJnKTsKIAkJCQl9CiAJCQkJaW5mby0+Y29tbWl0X2ludGVydmFsID0gaW50YXJnOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICJidHJmczogdXNpbmcgZGVmYXVsdCBjb21taXQgaW50ZXJ2YWwgJWRzXG4iLAorCQkJCWJ0cmZzX2luZm8ocm9vdC0+ZnNfaW5mbywgInVzaW5nIGRlZmF1bHQgY29tbWl0IGludGVydmFsICVkcyIsCiAJCQkJICAgIEJUUkZTX0RFRkFVTFRfQ09NTUlUX0lOVEVSVkFMKTsKIAkJCQlpbmZvLT5jb21taXRfaW50ZXJ2YWwgPSBCVFJGU19ERUZBVUxUX0NPTU1JVF9JTlRFUlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE9wdF9lcnI6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogdW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiAiCi0JCQkgICAgICAgIiclcydcbiIsIHApOworCQkJYnRyZnNfaW5mbyhyb290LT5mc19pbmZvLCAidW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiAnJXMnIiwgcCk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCWRlZmF1bHQ6CkBAIC02ODUsNyArNzU3LDcgQEAKIAl9CiBvdXQ6CiAJaWYgKCFyZXQgJiYgYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpKQotCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZGlzayBzcGFjZSBjYWNoaW5nIGlzIGVuYWJsZWRcbiIpOworCQlidHJmc19pbmZvKHJvb3QtPmZzX2luZm8sICJkaXNrIHNwYWNlIGNhY2hpbmcgaXMgZW5hYmxlZCIpOwogCWtmcmVlKG9yaWcpOwogCXJldHVybiByZXQ7CiB9CkBAIC03NDgsNyArODIwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zdWJ2b2xyb290aWQ6CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJImJ0cmZzOiAnc3Vidm9scm9vdGlkJyBtb3VudCBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgaGFzIG5vIGVmZmVjdFxuIik7CisJCQkJIkJUUkZTOiAnc3Vidm9scm9vdGlkJyBtb3VudCBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgaGFzICIKKwkJCQkibm8gZWZmZWN0XG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9kZXZpY2U6CiAJCQlkZXZpY2VfbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CkBAIC04NzcsNyArOTUwLDcgQEAKIAlzYi0+c19mbGFncyB8PSBNU19JX1ZFUlNJT047CiAJZXJyID0gb3Blbl9jdHJlZShzYiwgZnNfZGV2aWNlcywgKGNoYXIgKilkYXRhKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50aygiYnRyZnM6IG9wZW5fY3RyZWUgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogb3Blbl9jdHJlZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTExNSw3ICsxMTg4LDcgQEAKIAkJZHB1dChyb290KTsKIAkJcm9vdCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiAnJXMnIGlzIG5vdCBhIHZhbGlkIHN1YnZvbHVtZVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogJyVzJyBpcyBub3QgYSB2YWxpZCBzdWJ2b2x1bWVcbiIsCiAJCQkJc3Vidm9sX25hbWUpOwogCX0KIApAQCAtMTI0MCw3ICsxMzEzLDcgQEAKIAogCWZzX2luZm8tPnRocmVhZF9wb29sX3NpemUgPSBuZXdfcG9vbF9zaXplOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHJlc2l6ZSB0aHJlYWQgcG9vbCAlZCAtPiAlZFxuIiwKKwlidHJmc19pbmZvKGZzX2luZm8sICJyZXNpemUgdGhyZWFkIHBvb2wgJWQgLT4gJWQiLAogCSAgICAgICBvbGRfcG9vbF9zaXplLCBuZXdfcG9vbF9zaXplKTsKIAogCWJ0cmZzX3NldF9tYXhfd29ya2VycygmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIsIG5ld19wb29sX3NpemUpOwpAQCAtMTM0Niw3ICsxNDE5LDcgQEAKIAl9IGVsc2UgewogCQlpZiAodGVzdF9iaXQoQlRSRlNfRlNfU1RBVEVfRVJST1IsICZyb290LT5mc19pbmZvLT5mc19zdGF0ZSkpIHsKIAkJCWJ0cmZzX2Vycihmc19pbmZvLAotCQkJCSJSZW1vdW50aW5nIHJlYWQtd3JpdGUgYWZ0ZXIgZXJyb3IgaXMgbm90IGFsbG93ZWRcbiIpOworCQkJCSJSZW1vdW50aW5nIHJlYWQtd3JpdGUgYWZ0ZXIgZXJyb3IgaXMgbm90IGFsbG93ZWQiKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIHJlc3RvcmU7CiAJCX0KQEAgLTEzNTgsOCArMTQzMSw4IEBACiAJCWlmIChmc19pbmZvLT5mc19kZXZpY2VzLT5taXNzaW5nX2RldmljZXMgPgogCQkgICAgIGZzX2luZm8tPm51bV90b2xlcmF0ZWRfZGlza19iYXJyaWVyX2ZhaWx1cmVzICYmCiAJCSAgICAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiQnRyZnM6IHRvbyBtYW55IG1pc3NpbmcgZGV2aWNlcywgd3JpdGVhYmxlIHJlbW91bnQgaXMgbm90IGFsbG93ZWRcbiIpOworCQkJYnRyZnNfd2Fybihmc19pbmZvLAorCQkJCSJ0b28gbWFueSBtaXNzaW5nIGRldmljZXMsIHdyaXRlYWJsZSByZW1vdW50IGlzIG5vdCBhbGxvd2VkIik7CiAJCQlyZXQgPSAtRUFDQ0VTOwogCQkJZ290byByZXN0b3JlOwogCQl9CkBAIC0xMzg0LDE2ICsxNDU3LDE1IEBACiAKIAkJcmV0ID0gYnRyZnNfcmVzdW1lX2Rldl9yZXBsYWNlX2FzeW5jKGZzX2luZm8pOwogCQlpZiAocmV0KSB7Ci0JCQlwcl93YXJuKCJidHJmczogZmFpbGVkIHRvIHJlc3VtZSBkZXZfcmVwbGFjZVxuIik7CisJCQlidHJmc193YXJuKGZzX2luZm8sICJmYWlsZWQgdG8gcmVzdW1lIGRldl9yZXBsYWNlIik7CiAJCQlnb3RvIHJlc3RvcmU7CiAJCX0KIAogCQlpZiAoIWZzX2luZm8tPnV1aWRfcm9vdCkgewotCQkJcHJfaW5mbygiYnRyZnM6IGNyZWF0aW5nIFVVSUQgdHJlZVxuIik7CisJCQlidHJmc19pbmZvKGZzX2luZm8sICJjcmVhdGluZyBVVUlEIHRyZWUiKTsKIAkJCXJldCA9IGJ0cmZzX2NyZWF0ZV91dWlkX3RyZWUoZnNfaW5mbyk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJcHJfd2FybigiYnRyZnM6IGZhaWxlZCB0byBjcmVhdGUgdGhlIHV1aWQgdHJlZSIKLQkJCQkJIiVkXG4iLCByZXQpOworCQkJCWJ0cmZzX3dhcm4oZnNfaW5mbywgImZhaWxlZCB0byBjcmVhdGUgdGhlIFVVSUQgdHJlZSAlZCIsIHJldCk7CiAJCQkJZ290byByZXN0b3JlOwogCQkJfQogCQl9CkBAIC0xNzczLDcgKzE4NDUsNyBAQAogc3RhdGljIHZvaWQgYnRyZnNfaW50ZXJmYWNlX2V4aXQodm9pZCkKIHsKIAlpZiAobWlzY19kZXJlZ2lzdGVyKCZidHJmc19taXNjKSA8IDApCi0JCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBtaXNjX2RlcmVnaXN0ZXIgZmFpbGVkIGZvciBjb250cm9sIGRldmljZVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkJUUkZTOiBtaXNjX2RlcmVnaXN0ZXIgZmFpbGVkIGZvciBjb250cm9sIGRldmljZVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0cmZzX3ByaW50X2luZm8odm9pZCkKQEAgLTE4MTgsMTAgKzE4OTAsMTYgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gYnRyZnNfaW5pdF9zeXNmcygpOworCWVyciA9IGJ0cmZzX2hhc2hfaW5pdCgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlidHJmc19wcm9wc19pbml0KCk7CisKKwllcnIgPSBidHJmc19pbml0X3N5c2ZzKCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2hhc2g7CisKIAlidHJmc19pbml0X2NvbXByZXNzKCk7CiAKIAllcnIgPSBidHJmc19pbml0X2NhY2hlcCgpOwpAQCAtMTg5NSw2ICsxOTczLDggQEAKIGZyZWVfY29tcHJlc3M6CiAJYnRyZnNfZXhpdF9jb21wcmVzcygpOwogCWJ0cmZzX2V4aXRfc3lzZnMoKTsKK2ZyZWVfaGFzaDoKKwlidHJmc19oYXNoX2V4aXQoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xOTEzLDkgKzE5OTMsMTAgQEAKIAlidHJmc19leGl0X3N5c2ZzKCk7CiAJYnRyZnNfY2xlYW51cF9mc191dWlkcygpOwogCWJ0cmZzX2V4aXRfY29tcHJlc3MoKTsKKwlidHJmc19oYXNoX2V4aXQoKTsKIH0KIAotbW9kdWxlX2luaXQoaW5pdF9idHJmc19mcykKK2xhdGVfaW5pdGNhbGwoaW5pdF9idHJmc19mcyk7CiBtb2R1bGVfZXhpdChleGl0X2J0cmZzX2ZzKQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9zeXNmcy5jIGIvZnMvYnRyZnMvc3lzZnMuYwppbmRleCA1YjMyNmNkLi43ODIzNzRkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zeXNmcy5jCisrKyBiL2ZzL2J0cmZzL3N5c2ZzLmMKQEAgLTIyLDI0ICsyMiw2NDEgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KIAogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAiZGlzay1pby5oIgogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKyNpbmNsdWRlICJ2b2x1bWVzLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKnRvX2ZzX2luZm8oc3RydWN0IGtvYmplY3QgKmtvYmopOworCitzdGF0aWMgdTY0IGdldF9mZWF0dXJlcyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCWVudW0gYnRyZnNfZmVhdHVyZV9zZXQgc2V0KQoreworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlciA9IGZzX2luZm8tPnN1cGVyX2NvcHk7CisJaWYgKHNldCA9PSBGRUFUX0NPTVBBVCkKKwkJcmV0dXJuIGJ0cmZzX3N1cGVyX2NvbXBhdF9mbGFncyhkaXNrX3N1cGVyKTsKKwllbHNlIGlmIChzZXQgPT0gRkVBVF9DT01QQVRfUk8pCisJCXJldHVybiBidHJmc19zdXBlcl9jb21wYXRfcm9fZmxhZ3MoZGlza19zdXBlcik7CisJZWxzZQorCQlyZXR1cm4gYnRyZnNfc3VwZXJfaW5jb21wYXRfZmxhZ3MoZGlza19zdXBlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mZWF0dXJlcyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCSBlbnVtIGJ0cmZzX2ZlYXR1cmVfc2V0IHNldCwgdTY0IGZlYXR1cmVzKQoreworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlciA9IGZzX2luZm8tPnN1cGVyX2NvcHk7CisJaWYgKHNldCA9PSBGRUFUX0NPTVBBVCkKKwkJYnRyZnNfc2V0X3N1cGVyX2NvbXBhdF9mbGFncyhkaXNrX3N1cGVyLCBmZWF0dXJlcyk7CisJZWxzZSBpZiAoc2V0ID09IEZFQVRfQ09NUEFUX1JPKQorCQlidHJmc19zZXRfc3VwZXJfY29tcGF0X3JvX2ZsYWdzKGRpc2tfc3VwZXIsIGZlYXR1cmVzKTsKKwllbHNlCisJCWJ0cmZzX3NldF9zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyLCBmZWF0dXJlcyk7Cit9CisKK3N0YXRpYyBpbnQgY2FuX21vZGlmeV9mZWF0dXJlKHN0cnVjdCBidHJmc19mZWF0dXJlX2F0dHIgKmZhKQoreworCWludCB2YWwgPSAwOworCXU2NCBzZXQsIGNsZWFyOworCXN3aXRjaCAoZmEtPmZlYXR1cmVfc2V0KSB7CisJY2FzZSBGRUFUX0NPTVBBVDoKKwkJc2V0ID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfU0FGRV9TRVQ7CisJCWNsZWFyID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfU0FGRV9DTEVBUjsKKwkJYnJlYWs7CisJY2FzZSBGRUFUX0NPTVBBVF9STzoKKwkJc2V0ID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU0FGRV9TRVQ7CisJCWNsZWFyID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU0FGRV9DTEVBUjsKKwkJYnJlYWs7CisJY2FzZSBGRUFUX0lOQ09NUEFUOgorCQlzZXQgPSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX1NBRkVfU0VUOworCQljbGVhciA9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfU0FGRV9DTEVBUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IHN5c2ZzOiB1bmtub3duIGZlYXR1cmUgc2V0ICVkXG4iLAorCQkJCWZhLT5mZWF0dXJlX3NldCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZXQgJiBmYS0+ZmVhdHVyZV9iaXQpCisJCXZhbCB8PSAxOworCWlmIChjbGVhciAmIGZhLT5mZWF0dXJlX2JpdCkKKwkJdmFsIHw9IDI7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3NpemVfdCBidHJmc19mZWF0dXJlX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphLCBjaGFyICpidWYpCit7CisJaW50IHZhbCA9IDA7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSB0b19mc19pbmZvKGtvYmopOworCXN0cnVjdCBidHJmc19mZWF0dXJlX2F0dHIgKmZhID0gdG9fYnRyZnNfZmVhdHVyZV9hdHRyKGEpOworCWlmIChmc19pbmZvKSB7CisJCXU2NCBmZWF0dXJlcyA9IGdldF9mZWF0dXJlcyhmc19pbmZvLCBmYS0+ZmVhdHVyZV9zZXQpOworCQlpZiAoZmVhdHVyZXMgJiBmYS0+ZmVhdHVyZV9iaXQpCisJCQl2YWwgPSAxOworCX0gZWxzZQorCQl2YWwgPSBjYW5fbW9kaWZ5X2ZlYXR1cmUoZmEpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0cmZzX2ZlYXR1cmVfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfZmVhdHVyZV9hdHRyICpmYSA9IHRvX2J0cmZzX2ZlYXR1cmVfYXR0cihhKTsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwl1NjQgZmVhdHVyZXMsIHNldCwgY2xlYXI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCWZzX2luZm8gPSB0b19mc19pbmZvKGtvYmopOworCWlmICghZnNfaW5mbykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IGtzdHJ0b3VsKHNraXBfc3BhY2VzKGJ1ZiksIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZmEtPmZlYXR1cmVfc2V0ID09IEZFQVRfQ09NUEFUKSB7CisJCXNldCA9IEJUUkZTX0ZFQVRVUkVfQ09NUEFUX1NBRkVfU0VUOworCQljbGVhciA9IEJUUkZTX0ZFQVRVUkVfQ09NUEFUX1NBRkVfQ0xFQVI7CisJfSBlbHNlIGlmIChmYS0+ZmVhdHVyZV9zZXQgPT0gRkVBVF9DT01QQVRfUk8pIHsKKwkJc2V0ID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU0FGRV9TRVQ7CisJCWNsZWFyID0gQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU0FGRV9DTEVBUjsKKwl9IGVsc2UgeworCQlzZXQgPSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX1NBRkVfU0VUOworCQljbGVhciA9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfU0FGRV9DTEVBUjsKKwl9CisKKwlmZWF0dXJlcyA9IGdldF9mZWF0dXJlcyhmc19pbmZvLCBmYS0+ZmVhdHVyZV9zZXQpOworCisJLyogTm90aGluZyB0byBkbyAqLworCWlmICgodmFsICYmIChmZWF0dXJlcyAmIGZhLT5mZWF0dXJlX2JpdCkpIHx8CisJICAgICghdmFsICYmICEoZmVhdHVyZXMgJiBmYS0+ZmVhdHVyZV9iaXQpKSkKKwkJcmV0dXJuIGNvdW50OworCisJaWYgKCh2YWwgJiYgIShzZXQgJiBmYS0+ZmVhdHVyZV9iaXQpKSB8fAorCSAgICAoIXZhbCAmJiAhKGNsZWFyICYgZmEtPmZlYXR1cmVfYml0KSkpIHsKKwkJYnRyZnNfaW5mbyhmc19pbmZvLAorCQkJIiVzYWJsaW5nIGZlYXR1cmUgJXMgb24gbW91bnRlZCBmcyBpcyBub3Qgc3VwcG9ydGVkLiIsCisJCQl2YWwgPyAiRW4iIDogIkRpcyIsIGZhLT5rb2JqX2F0dHIuYXR0ci5uYW1lKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlidHJmc19pbmZvKGZzX2luZm8sICIlcyAlcyBmZWF0dXJlIGZsYWciLAorCQkgICB2YWwgPyAiU2V0dGluZyIgOiAiQ2xlYXJpbmciLCBmYS0+a29ial9hdHRyLmF0dHIubmFtZSk7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKGZzX2luZm8tPmZzX3Jvb3QsIDApOworCWlmIChJU19FUlIodHJhbnMpKQorCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CisKKwlzcGluX2xvY2soJmZzX2luZm8tPnN1cGVyX2xvY2spOworCWZlYXR1cmVzID0gZ2V0X2ZlYXR1cmVzKGZzX2luZm8sIGZhLT5mZWF0dXJlX3NldCk7CisJaWYgKHZhbCkKKwkJZmVhdHVyZXMgfD0gZmEtPmZlYXR1cmVfYml0OworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfmZhLT5mZWF0dXJlX2JpdDsKKwlzZXRfZmVhdHVyZXMoZnNfaW5mbywgZmEtPmZlYXR1cmVfc2V0LCBmZWF0dXJlcyk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnN1cGVyX2xvY2spOworCisJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCBmc19pbmZvLT5mc19yb290KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdW1vZGVfdCBidHJmc19mZWF0dXJlX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgdW51c2VkKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gdG9fZnNfaW5mbyhrb2JqKTsKKwl1bW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOworCisJaWYgKGZzX2luZm8pIHsKKwkJc3RydWN0IGJ0cmZzX2ZlYXR1cmVfYXR0ciAqZmE7CisJCXU2NCBmZWF0dXJlczsKKworCQlmYSA9IGF0dHJfdG9fYnRyZnNfZmVhdHVyZV9hdHRyKGF0dHIpOworCQlmZWF0dXJlcyA9IGdldF9mZWF0dXJlcyhmc19pbmZvLCBmYS0+ZmVhdHVyZV9zZXQpOworCisJCWlmIChjYW5fbW9kaWZ5X2ZlYXR1cmUoZmEpKQorCQkJbW9kZSB8PSBTX0lXVVNSOworCQllbHNlIGlmICghKGZlYXR1cmVzICYgZmEtPmZlYXR1cmVfYml0KSkKKwkJCW1vZGUgPSAwOworCX0KKworCXJldHVybiBtb2RlOworfQorCitCVFJGU19GRUFUX0FUVFJfSU5DT01QQVQobWl4ZWRfYmFja3JlZiwgTUlYRURfQkFDS1JFRik7CitCVFJGU19GRUFUX0FUVFJfSU5DT01QQVQoZGVmYXVsdF9zdWJ2b2wsIERFRkFVTFRfU1VCVk9MKTsKK0JUUkZTX0ZFQVRfQVRUUl9JTkNPTVBBVChtaXhlZF9ncm91cHMsIE1JWEVEX0dST1VQUyk7CitCVFJGU19GRUFUX0FUVFJfSU5DT01QQVQoY29tcHJlc3NfbHpvLCBDT01QUkVTU19MWk8pOworQlRSRlNfRkVBVF9BVFRSX0lOQ09NUEFUKGJpZ19tZXRhZGF0YSwgQklHX01FVEFEQVRBKTsKK0JUUkZTX0ZFQVRfQVRUUl9JTkNPTVBBVChleHRlbmRlZF9pcmVmLCBFWFRFTkRFRF9JUkVGKTsKK0JUUkZTX0ZFQVRfQVRUUl9JTkNPTVBBVChyYWlkNTYsIFJBSUQ1Nik7CitCVFJGU19GRUFUX0FUVFJfSU5DT01QQVQoc2tpbm55X21ldGFkYXRhLCBTS0lOTllfTUVUQURBVEEpOworQlRSRlNfRkVBVF9BVFRSX0lOQ09NUEFUKG5vX2hvbGVzLCBOT19IT0xFUyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpidHJmc19zdXBwb3J0ZWRfZmVhdHVyZV9hdHRyc1tdID0geworCUJUUkZTX0ZFQVRfQVRUUl9QVFIobWl4ZWRfYmFja3JlZiksCisJQlRSRlNfRkVBVF9BVFRSX1BUUihkZWZhdWx0X3N1YnZvbCksCisJQlRSRlNfRkVBVF9BVFRSX1BUUihtaXhlZF9ncm91cHMpLAorCUJUUkZTX0ZFQVRfQVRUUl9QVFIoY29tcHJlc3NfbHpvKSwKKwlCVFJGU19GRUFUX0FUVFJfUFRSKGJpZ19tZXRhZGF0YSksCisJQlRSRlNfRkVBVF9BVFRSX1BUUihleHRlbmRlZF9pcmVmKSwKKwlCVFJGU19GRUFUX0FUVFJfUFRSKHJhaWQ1NiksCisJQlRSRlNfRkVBVF9BVFRSX1BUUihza2lubnlfbWV0YWRhdGEpLAorCUJUUkZTX0ZFQVRfQVRUUl9QVFIobm9faG9sZXMpLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJ0cmZzX2ZlYXR1cmVfYXR0cl9ncm91cCA9IHsKKwkubmFtZSA9ICJmZWF0dXJlcyIsCisJLmlzX3Zpc2libGUgPSBidHJmc19mZWF0dXJlX3Zpc2libGUsCisJLmF0dHJzID0gYnRyZnNfc3VwcG9ydGVkX2ZlYXR1cmVfYXR0cnMsCit9OworCitzdGF0aWMgc3NpemVfdCBidHJmc19zaG93X3U2NCh1NjQgKnZhbHVlX3B0ciwgc3BpbmxvY2tfdCAqbG9jaywgY2hhciAqYnVmKQoreworCXU2NCB2YWw7CisJaWYgKGxvY2spCisJCXNwaW5fbG9jayhsb2NrKTsKKwl2YWwgPSAqdmFsdWVfcHRyOworCWlmIChsb2NrKQorCQlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBnbG9iYWxfcnN2X3NpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICprYSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gdG9fZnNfaW5mbyhrb2JqLT5wYXJlbnQpOworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiA9ICZmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCXJldHVybiBidHJmc19zaG93X3U2NCgmYmxvY2tfcnN2LT5zaXplLCAmYmxvY2tfcnN2LT5sb2NrLCBidWYpOworfQorQlRSRlNfQVRUUihnbG9iYWxfcnN2X3NpemUsIDA0NDQsIGdsb2JhbF9yc3Zfc2l6ZV9zaG93KTsKKworc3RhdGljIHNzaXplX3QgZ2xvYmFsX3Jzdl9yZXNlcnZlZF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHRvX2ZzX2luZm8oa29iai0+cGFyZW50KTsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YgPSAmZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKKwlyZXR1cm4gYnRyZnNfc2hvd191NjQoJmJsb2NrX3Jzdi0+cmVzZXJ2ZWQsICZibG9ja19yc3YtPmxvY2ssIGJ1Zik7Cit9CitCVFJGU19BVFRSKGdsb2JhbF9yc3ZfcmVzZXJ2ZWQsIDA0NDQsIGdsb2JhbF9yc3ZfcmVzZXJ2ZWRfc2hvdyk7CisKKyNkZWZpbmUgdG9fc3BhY2VfaW5mbyhfa29iaikgY29udGFpbmVyX29mKF9rb2JqLCBzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbywga29iaikKKworc3RhdGljIHNzaXplX3QgcmFpZF9ieXRlc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK0JUUkZTX1JBSURfQVRUUih0b3RhbF9ieXRlcywgcmFpZF9ieXRlc19zaG93KTsKK0JUUkZTX1JBSURfQVRUUih1c2VkX2J5dGVzLCByYWlkX2J5dGVzX3Nob3cpOworCitzdGF0aWMgc3NpemVfdCByYWlkX2J5dGVzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisKK3sKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc2luZm8gPSB0b19zcGFjZV9pbmZvKGtvYmotPnBhcmVudCk7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKKwlpbnQgaW5kZXggPSBrb2JqIC0gc2luZm8tPmJsb2NrX2dyb3VwX2tvYmpzOworCXU2NCB2YWwgPSAwOworCisJZG93bl9yZWFkKCZzaW5mby0+Z3JvdXBzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9ja19ncm91cCwgJnNpbmZvLT5ibG9ja19ncm91cHNbaW5kZXhdLCBsaXN0KSB7CisJCWlmICgmYXR0ci0+YXR0ciA9PSBCVFJGU19SQUlEX0FUVFJfUFRSKHRvdGFsX2J5dGVzKSkKKwkJCXZhbCArPSBibG9ja19ncm91cC0+a2V5Lm9mZnNldDsKKwkJZWxzZQorCQkJdmFsICs9IGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmJsb2NrX2dyb3VwLT5pdGVtKTsKKwl9CisJdXBfcmVhZCgmc2luZm8tPmdyb3Vwc19zZW0pOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpyYWlkX2F0dHJpYnV0ZXNbXSA9IHsKKwlCVFJGU19SQUlEX0FUVFJfUFRSKHRvdGFsX2J5dGVzKSwKKwlCVFJGU19SQUlEX0FUVFJfUFRSKHVzZWRfYnl0ZXMpLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmFpZF9rb2JqKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWtvYmplY3RfcHV0KGtvYmotPnBhcmVudCk7Cit9CisKK3N0cnVjdCBrb2JqX3R5cGUgYnRyZnNfcmFpZF9rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmtvYmpfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gcmVsZWFzZV9yYWlkX2tvYmosCisJLmRlZmF1bHRfYXR0cnMgPSByYWlkX2F0dHJpYnV0ZXMsCit9OworCisjZGVmaW5lIFNQQUNFX0lORk9fQVRUUihmaWVsZCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBidHJmc19zcGFjZV9pbmZvX3Nob3dfIyNmaWVsZChzdHJ1Y3Qga29iamVjdCAqa29iaiwJXAorCQkJCQkgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYSwJXAorCQkJCQkgICAgIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzaW5mbyA9IHRvX3NwYWNlX2luZm8oa29iaik7CQlcCisJcmV0dXJuIGJ0cmZzX3Nob3dfdTY0KCZzaW5mby0+ZmllbGQsICZzaW5mby0+bG9jaywgYnVmKTsJXAorfQkJCQkJCQkJCVwKK0JUUkZTX0FUVFIoZmllbGQsIDA0NDQsIGJ0cmZzX3NwYWNlX2luZm9fc2hvd18jI2ZpZWxkKQorCitzdGF0aWMgc3NpemVfdCBidHJmc19zcGFjZV9pbmZvX3Nob3dfdG90YWxfYnl0ZXNfcGlubmVkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYSwKKwkJCQkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNpbmZvID0gdG9fc3BhY2VfaW5mbyhrb2JqKTsKKwlzNjQgdmFsID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzaW5mby0+dG90YWxfYnl0ZXNfcGlubmVkKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGxkXG4iLCB2YWwpOworfQorCitTUEFDRV9JTkZPX0FUVFIoZmxhZ3MpOworU1BBQ0VfSU5GT19BVFRSKHRvdGFsX2J5dGVzKTsKK1NQQUNFX0lORk9fQVRUUihieXRlc191c2VkKTsKK1NQQUNFX0lORk9fQVRUUihieXRlc19waW5uZWQpOworU1BBQ0VfSU5GT19BVFRSKGJ5dGVzX3Jlc2VydmVkKTsKK1NQQUNFX0lORk9fQVRUUihieXRlc19tYXlfdXNlKTsKK1NQQUNFX0lORk9fQVRUUihkaXNrX3VzZWQpOworU1BBQ0VfSU5GT19BVFRSKGRpc2tfdG90YWwpOworQlRSRlNfQVRUUih0b3RhbF9ieXRlc19waW5uZWQsIDA0NDQsIGJ0cmZzX3NwYWNlX2luZm9fc2hvd190b3RhbF9ieXRlc19waW5uZWQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3BhY2VfaW5mb19hdHRyc1tdID0geworCUJUUkZTX0FUVFJfUFRSKGZsYWdzKSwKKwlCVFJGU19BVFRSX1BUUih0b3RhbF9ieXRlcyksCisJQlRSRlNfQVRUUl9QVFIoYnl0ZXNfdXNlZCksCisJQlRSRlNfQVRUUl9QVFIoYnl0ZXNfcGlubmVkKSwKKwlCVFJGU19BVFRSX1BUUihieXRlc19yZXNlcnZlZCksCisJQlRSRlNfQVRUUl9QVFIoYnl0ZXNfbWF5X3VzZSksCisJQlRSRlNfQVRUUl9QVFIoZGlza191c2VkKSwKKwlCVFJGU19BVFRSX1BUUihkaXNrX3RvdGFsKSwKKwlCVFJGU19BVFRSX1BUUih0b3RhbF9ieXRlc19waW5uZWQpLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBzcGFjZV9pbmZvX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNpbmZvID0gdG9fc3BhY2VfaW5mbyhrb2JqKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzaW5mby0+dG90YWxfYnl0ZXNfcGlubmVkKTsKKwlrZnJlZShzaW5mbyk7Cit9CisKK3N0cnVjdCBrb2JqX3R5cGUgc3BhY2VfaW5mb19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmtvYmpfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gc3BhY2VfaW5mb19yZWxlYXNlLAorCS5kZWZhdWx0X2F0dHJzID0gc3BhY2VfaW5mb19hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphbGxvY2F0aW9uX2F0dHJzW10gPSB7CisJQlRSRlNfQVRUUl9QVFIoZ2xvYmFsX3Jzdl9yZXNlcnZlZCksCisJQlRSRlNfQVRUUl9QVFIoZ2xvYmFsX3Jzdl9zaXplKSwKKwlOVUxMLAorfTsKKworc3RhdGljIHNzaXplX3QgYnRyZnNfbGFiZWxfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHRvX2ZzX2luZm8oa29iaik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZzX2luZm8tPnN1cGVyX2NvcHktPmxhYmVsKTsKK30KKworc3RhdGljIHNzaXplX3QgYnRyZnNfbGFiZWxfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYSwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gdG9fZnNfaW5mbyhrb2JqKTsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGZzX2luZm8tPmZzX3Jvb3Q7CisJaW50IHJldDsKKworCWlmIChsZW4gPj0gQlRSRlNfTEFCRUxfU0laRSkgeworCQlwcl9lcnIoIkJUUkZTOiB1bmFibGUgdG8gc2V0IGxhYmVsIHdpdGggbW9yZSB0aGFuICVkIGJ5dGVzXG4iLAorCQkgICAgICAgQlRSRlNfTEFCRUxfU0laRSAtIDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOworCWlmIChJU19FUlIodHJhbnMpKQorCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CisKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnN1cGVyX2xvY2spOworCXN0cmNweShmc19pbmZvLT5zdXBlcl9jb3B5LT5sYWJlbCwgYnVmKTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfbG9jayk7CisJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKworCWlmICghcmV0KQorCQlyZXR1cm4gbGVuOworCisJcmV0dXJuIHJldDsKK30KK0JUUkZTX0FUVFJfUlcobGFiZWwsIDA2NDQsIGJ0cmZzX2xhYmVsX3Nob3csIGJ0cmZzX2xhYmVsX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ0cmZzX2F0dHJzW10gPSB7CisJQlRSRlNfQVRUUl9QVFIobGFiZWwpLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBidHJmc19yZWxlYXNlX3N1cGVyX2tvYmooc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSB0b19mc19pbmZvKGtvYmopOworCWNvbXBsZXRlKCZmc19pbmZvLT5rb2JqX3VucmVnaXN0ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBidHJmc19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzCT0gJmtvYmpfc3lzZnNfb3BzLAorCS5yZWxlYXNlCT0gYnRyZnNfcmVsZWFzZV9zdXBlcl9rb2JqLAorCS5kZWZhdWx0X2F0dHJzCT0gYnRyZnNfYXR0cnMsCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc19mc19pbmZvICp0b19mc19pbmZvKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmIChrb2JqLT5rdHlwZSAhPSAmYnRyZnNfa3R5cGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX2ZzX2luZm8sIHN1cGVyX2tvYmopOworfQorCisjZGVmaW5lIE5VTV9GRUFUVVJFX0JJVFMgNjQKK3N0YXRpYyBjaGFyIGJ0cmZzX3Vua25vd25fZmVhdHVyZV9uYW1lc1szXVtOVU1fRkVBVFVSRV9CSVRTXVsxM107CitzdGF0aWMgc3RydWN0IGJ0cmZzX2ZlYXR1cmVfYXR0ciBidHJmc19mZWF0dXJlX2F0dHJzWzNdW05VTV9GRUFUVVJFX0JJVFNdOworCitzdGF0aWMgdTY0IHN1cHBvcnRlZF9mZWF0dXJlX21hc2tzWzNdID0geworCVtGRUFUX0NPTVBBVF0gICAgPSBCVFJGU19GRUFUVVJFX0NPTVBBVF9TVVBQLAorCVtGRUFUX0NPTVBBVF9ST10gPSBCVFJGU19GRUFUVVJFX0NPTVBBVF9ST19TVVBQLAorCVtGRUFUX0lOQ09NUEFUXSAgPSBCVFJGU19GRUFUVVJFX0lOQ09NUEFUX1NVUFAsCit9OworCitzdGF0aWMgaW50IGFkZHJtX3Vua25vd25fZmVhdHVyZV9hdHRycyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgYm9vbCBhZGQpCit7CisJaW50IHNldDsKKworCWZvciAoc2V0ID0gMDsgc2V0IDwgRkVBVF9NQVg7IHNldCsrKSB7CisJCWludCBpOworCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1syXTsKKwkJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZ3JvdXAgPSB7CisJCQkubmFtZSA9ICJmZWF0dXJlcyIsCisJCQkuYXR0cnMgPSBhdHRycywKKwkJfTsKKwkJdTY0IGZlYXR1cmVzID0gZ2V0X2ZlYXR1cmVzKGZzX2luZm8sIHNldCk7CisJCWZlYXR1cmVzICY9IH5zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrc1tzZXRdOworCisJCWlmICghZmVhdHVyZXMpCisJCQljb250aW51ZTsKKworCQlhdHRyc1sxXSA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRkVBVFVSRV9CSVRTOyBpKyspIHsKKwkJCXN0cnVjdCBidHJmc19mZWF0dXJlX2F0dHIgKmZhOworCisJCQlpZiAoIShmZWF0dXJlcyAmICgxVUxMIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKworCQkJZmEgPSAmYnRyZnNfZmVhdHVyZV9hdHRyc1tzZXRdW2ldOworCQkJYXR0cnNbMF0gPSAmZmEtPmtvYmpfYXR0ci5hdHRyOworCQkJaWYgKGFkZCkgeworCQkJCWludCByZXQ7CisJCQkJcmV0ID0gc3lzZnNfbWVyZ2VfZ3JvdXAoJmZzX2luZm8tPnN1cGVyX2tvYmosCisJCQkJCQkJJmFncm91cCk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0gZWxzZQorCQkJCXN5c2ZzX3VubWVyZ2VfZ3JvdXAoJmZzX2luZm8tPnN1cGVyX2tvYmosCisJCQkJCQkgICAgJmFncm91cCk7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19idHJmc19zeXNmc19yZW1vdmVfb25lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoreworCWtvYmplY3RfZGVsKCZmc19pbmZvLT5zdXBlcl9rb2JqKTsKKwlrb2JqZWN0X3B1dCgmZnNfaW5mby0+c3VwZXJfa29iaik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZnNfaW5mby0+a29ial91bnJlZ2lzdGVyKTsKK30KKwordm9pZCBidHJmc19zeXNmc19yZW1vdmVfb25lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoreworCWlmIChmc19pbmZvLT5zcGFjZV9pbmZvX2tvYmopIHsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGVzKGZzX2luZm8tPnNwYWNlX2luZm9fa29iaiwgYWxsb2NhdGlvbl9hdHRycyk7CisJCWtvYmplY3RfZGVsKGZzX2luZm8tPnNwYWNlX2luZm9fa29iaik7CisJCWtvYmplY3RfcHV0KGZzX2luZm8tPnNwYWNlX2luZm9fa29iaik7CisJfQorCWtvYmplY3RfZGVsKGZzX2luZm8tPmRldmljZV9kaXJfa29iaik7CisJa29iamVjdF9wdXQoZnNfaW5mby0+ZGV2aWNlX2Rpcl9rb2JqKTsKKwlhZGRybV91bmtub3duX2ZlYXR1cmVfYXR0cnMoZnNfaW5mbywgZmFsc2UpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZnNfaW5mby0+c3VwZXJfa29iaiwgJmJ0cmZzX2ZlYXR1cmVfYXR0cl9ncm91cCk7CisJX19idHJmc19zeXNmc19yZW1vdmVfb25lKGZzX2luZm8pOworfQorCitjb25zdCBjaGFyICogY29uc3QgYnRyZnNfZmVhdHVyZV9zZXRfbmFtZXNbM10gPSB7CisJW0ZFQVRfQ09NUEFUXQkgPSAiY29tcGF0IiwKKwlbRkVBVF9DT01QQVRfUk9dID0gImNvbXBhdF9ybyIsCisJW0ZFQVRfSU5DT01QQVRdCSA9ICJpbmNvbXBhdCIsCit9OworCitjaGFyICpidHJmc19wcmludGFibGVfZmVhdHVyZXMoZW51bSBidHJmc19mZWF0dXJlX3NldCBzZXQsIHU2NCBmbGFncykKK3sKKwlzaXplX3QgYnVmc2l6ZSA9IDQwOTY7IC8qIHNhZmUgbWF4LCA2NCBuYW1lcyAqIDY0IGJ5dGVzICovCisJaW50IGxlbiA9IDA7CisJaW50IGk7CisJY2hhciAqc3RyOworCisJc3RyID0ga21hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cikKKwkJcmV0dXJuIHN0cjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cmZzX2ZlYXR1cmVfYXR0cnNbc2V0XSk7IGkrKykgeworCQljb25zdCBjaGFyICpuYW1lOworCisJCWlmICghKGZsYWdzICYgKDFVTEwgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJbmFtZSA9IGJ0cmZzX2ZlYXR1cmVfYXR0cnNbc2V0XVtpXS5rb2JqX2F0dHIuYXR0ci5uYW1lOworCQlsZW4gKz0gc25wcmludGYoc3RyICsgbGVuLCBidWZzaXplIC0gbGVuLCAiJXMlcyIsCisJCQkJbGVuID8gIiwiIDogIiIsIG5hbWUpOworCX0KKworCXJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZmVhdHVyZV9hdHRycyh2b2lkKQoreworCXN0cnVjdCBidHJmc19mZWF0dXJlX2F0dHIgKmZhOworCWludCBzZXQsIGk7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShidHJmc191bmtub3duX2ZlYXR1cmVfbmFtZXMpICE9CisJCSAgICAgQVJSQVlfU0laRShidHJmc19mZWF0dXJlX2F0dHJzKSk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYnRyZnNfdW5rbm93bl9mZWF0dXJlX25hbWVzWzBdKSAhPQorCQkgICAgIEFSUkFZX1NJWkUoYnRyZnNfZmVhdHVyZV9hdHRyc1swXSkpOworCisJbWVtc2V0KGJ0cmZzX2ZlYXR1cmVfYXR0cnMsIDAsIHNpemVvZihidHJmc19mZWF0dXJlX2F0dHJzKSk7CisJbWVtc2V0KGJ0cmZzX3Vua25vd25fZmVhdHVyZV9uYW1lcywgMCwKKwkgICAgICAgc2l6ZW9mKGJ0cmZzX3Vua25vd25fZmVhdHVyZV9uYW1lcykpOworCisJZm9yIChpID0gMDsgYnRyZnNfc3VwcG9ydGVkX2ZlYXR1cmVfYXR0cnNbaV07IGkrKykgeworCQlzdHJ1Y3QgYnRyZnNfZmVhdHVyZV9hdHRyICpzZmE7CisJCXN0cnVjdCBhdHRyaWJ1dGUgKmEgPSBidHJmc19zdXBwb3J0ZWRfZmVhdHVyZV9hdHRyc1tpXTsKKwkJaW50IGJpdDsKKwkJc2ZhID0gYXR0cl90b19idHJmc19mZWF0dXJlX2F0dHIoYSk7CisJCWJpdCA9IGlsb2cyKHNmYS0+ZmVhdHVyZV9iaXQpOworCQlmYSA9ICZidHJmc19mZWF0dXJlX2F0dHJzW3NmYS0+ZmVhdHVyZV9zZXRdW2JpdF07CisKKwkJZmEtPmtvYmpfYXR0ci5hdHRyLm5hbWUgPSBzZmEtPmtvYmpfYXR0ci5hdHRyLm5hbWU7CisJfQorCisJZm9yIChzZXQgPSAwOyBzZXQgPCBGRUFUX01BWDsgc2V0KyspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRyZnNfZmVhdHVyZV9hdHRyc1tzZXRdKTsgaSsrKSB7CisJCQljaGFyICpuYW1lID0gYnRyZnNfdW5rbm93bl9mZWF0dXJlX25hbWVzW3NldF1baV07CisJCQlmYSA9ICZidHJmc19mZWF0dXJlX2F0dHJzW3NldF1baV07CisKKwkJCWlmIChmYS0+a29ial9hdHRyLmF0dHIubmFtZSkKKwkJCQljb250aW51ZTsKKworCQkJc25wcmludGYobmFtZSwgMTMsICIlczoldSIsCisJCQkJIGJ0cmZzX2ZlYXR1cmVfc2V0X25hbWVzW3NldF0sIGkpOworCisJCQlmYS0+a29ial9hdHRyLmF0dHIubmFtZSA9IG5hbWU7CisJCQlmYS0+a29ial9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJCQlmYS0+ZmVhdHVyZV9zZXQgPSBzZXQ7CisJCQlmYS0+ZmVhdHVyZV9iaXQgPSAxVUxMIDw8IGk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWRkX2RldmljZV9tZW1iZXJzaGlwKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSBmc19pbmZvLT5mc19kZXZpY2VzOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKworCWZzX2luZm8tPmRldmljZV9kaXJfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImRldmljZXMiLAorCQkJCQkJJmZzX2luZm8tPnN1cGVyX2tvYmopOworCWlmICghZnNfaW5mby0+ZGV2aWNlX2Rpcl9rb2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZnNfZGV2aWNlcy0+ZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJc3RydWN0IGhkX3N0cnVjdCAqZGlzayA9IGRldi0+YmRldi0+YmRfcGFydDsKKwkJc3RydWN0IGtvYmplY3QgKmRpc2tfa29iaiA9ICZwYXJ0X3RvX2RldihkaXNrKS0+a29iajsKKworCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKGZzX2luZm8tPmRldmljZV9kaXJfa29iaiwKKwkJCQkJICBkaXNrX2tvYmosIGRpc2tfa29iai0+bmFtZSk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnJvcjsKK30KIAogLyogL3N5cy9mcy9idHJmcy8gZW50cnkgKi8KIHN0YXRpYyBzdHJ1Y3Qga3NldCAqYnRyZnNfa3NldDsKIAoraW50IGJ0cmZzX3N5c2ZzX2FkZF9vbmUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJaW50IGVycm9yOworCisJaW5pdF9jb21wbGV0aW9uKCZmc19pbmZvLT5rb2JqX3VucmVnaXN0ZXIpOworCWZzX2luZm8tPnN1cGVyX2tvYmoua3NldCA9IGJ0cmZzX2tzZXQ7CisJZXJyb3IgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmZnNfaW5mby0+c3VwZXJfa29iaiwgJmJ0cmZzX2t0eXBlLCBOVUxMLAorCQkJCSAgICAgIiVwVSIsIGZzX2luZm8tPmZzaWQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmZzX2luZm8tPnN1cGVyX2tvYmosCisJCQkJICAgJmJ0cmZzX2ZlYXR1cmVfYXR0cl9ncm91cCk7CisJaWYgKGVycm9yKSB7CisJCV9fYnRyZnNfc3lzZnNfcmVtb3ZlX29uZShmc19pbmZvKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gYWRkcm1fdW5rbm93bl9mZWF0dXJlX2F0dHJzKGZzX2luZm8sIHRydWUpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsdXJlOworCisJZXJyb3IgPSBhZGRfZGV2aWNlX21lbWJlcnNoaXAoZnNfaW5mbyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWx1cmU7CisKKwlmc19pbmZvLT5zcGFjZV9pbmZvX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJhbGxvY2F0aW9uIiwKKwkJCQkJCSAgJmZzX2luZm8tPnN1cGVyX2tvYmopOworCWlmICghZnNfaW5mby0+c3BhY2VfaW5mb19rb2JqKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCWVycm9yID0gc3lzZnNfY3JlYXRlX2ZpbGVzKGZzX2luZm8tPnNwYWNlX2luZm9fa29iaiwgYWxsb2NhdGlvbl9hdHRycyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWx1cmU7CisKKwlyZXR1cm4gMDsKK2ZhaWx1cmU6CisJYnRyZnNfc3lzZnNfcmVtb3ZlX29uZShmc19pbmZvKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKIGludCBidHJmc19pbml0X3N5c2ZzKHZvaWQpCiB7CisJaW50IHJldDsKIAlidHJmc19rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiYnRyZnMiLCBOVUxMLCBmc19rb2JqKTsKIAlpZiAoIWJ0cmZzX2tzZXQpCiAJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9mZWF0dXJlX2F0dHJzKCk7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJ0cmZzX2tzZXQtPmtvYmosICZidHJmc19mZWF0dXJlX2F0dHJfZ3JvdXApOworCWlmIChyZXQpIHsKKwkJa3NldF91bnJlZ2lzdGVyKGJ0cmZzX2tzZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldHVybiAwOwogfQogCiB2b2lkIGJ0cmZzX2V4aXRfc3lzZnModm9pZCkKIHsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmJ0cmZzX2tzZXQtPmtvYmosICZidHJmc19mZWF0dXJlX2F0dHJfZ3JvdXApOwogCWtzZXRfdW5yZWdpc3RlcihidHJmc19rc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3lzZnMuaCBiL2ZzL2J0cmZzL3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZWEzNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3N5c2ZzLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfQlRSRlNfU1lTRlNfSF8KKyNkZWZpbmUgX0JUUkZTX1NZU0ZTX0hfCisKK2VudW0gYnRyZnNfZmVhdHVyZV9zZXQgeworCUZFQVRfQ09NUEFULAorCUZFQVRfQ09NUEFUX1JPLAorCUZFQVRfSU5DT01QQVQsCisJRkVBVF9NQVgKK307CisKKyNkZWZpbmUgX19JTklUX0tPQkpfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorewkJCQkJCQkJCVwKKwkuYXR0cgk9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS5zaG93CT0gX3Nob3csCQkJCQkJXAorCS5zdG9yZQk9IF9zdG9yZSwJCQkJCQlcCit9CisKKyNkZWZpbmUgQlRSRlNfQVRUUl9SVyhfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBidHJmc19hdHRyXyMjX25hbWUgPQkJCVwKKwkJCV9fSU5JVF9LT0JKX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQorI2RlZmluZSBCVFJGU19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3cpCQkJCQlcCisJQlRSRlNfQVRUUl9SVyhfbmFtZSwgX21vZGUsIF9zaG93LCBOVUxMKQorI2RlZmluZSBCVFJGU19BVFRSX1BUUihfbmFtZSkgICAgKCZidHJmc19hdHRyXyMjX25hbWUuYXR0cikKKworI2RlZmluZSBCVFJGU19SQUlEX0FUVFIoX25hbWUsIF9zaG93KQkJCQkJXAorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBidHJmc19yYWlkX2F0dHJfIyNfbmFtZSA9CQkJXAorCQkJX19JTklUX0tPQkpfQVRUUihfbmFtZSwgMDQ0NCwgX3Nob3csIE5VTEwpCisjZGVmaW5lIEJUUkZTX1JBSURfQVRUUl9QVFIoX25hbWUpICAgICgmYnRyZnNfcmFpZF9hdHRyXyMjX25hbWUuYXR0cikKKworCitzdHJ1Y3QgYnRyZnNfZmVhdHVyZV9hdHRyIHsKKwlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUga29ial9hdHRyOworCWVudW0gYnRyZnNfZmVhdHVyZV9zZXQgZmVhdHVyZV9zZXQ7CisJdTY0IGZlYXR1cmVfYml0OworfTsKKworI2RlZmluZSBCVFJGU19GRUFUX0FUVFIoX25hbWUsIF9mZWF0dXJlX3NldCwgX3ByZWZpeCwgX2ZlYXR1cmVfYml0KQkgICAgIFwKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZmVhdHVyZV9hdHRyIGJ0cmZzX2F0dHJfIyNfbmFtZSA9IHsJCQkgICAgIFwKKwkua29ial9hdHRyID0gX19JTklUX0tPQkpfQVRUUihfbmFtZSwgU19JUlVHTywJCQkgICAgIFwKKwkJCQkgICAgICBidHJmc19mZWF0dXJlX2F0dHJfc2hvdywJCSAgICAgXAorCQkJCSAgICAgIGJ0cmZzX2ZlYXR1cmVfYXR0cl9zdG9yZSksCSAgICAgXAorCS5mZWF0dXJlX3NldAk9IF9mZWF0dXJlX3NldCwJCQkJCSAgICAgXAorCS5mZWF0dXJlX2JpdAk9IF9wcmVmaXggIyNfIyMgX2ZlYXR1cmVfYml0LAkJCSAgICAgXAorfQorI2RlZmluZSBCVFJGU19GRUFUX0FUVFJfUFRSKF9uYW1lKSAgICAoJmJ0cmZzX2F0dHJfIyNfbmFtZS5rb2JqX2F0dHIuYXR0cikKKworI2RlZmluZSBCVFJGU19GRUFUX0FUVFJfQ09NUEFUKG5hbWUsIGZlYXR1cmUpIFwKKwlCVFJGU19GRUFUX0FUVFIobmFtZSwgRkVBVF9DT01QQVQsIEJUUkZTX0ZFQVRVUkVfQ09NUEFULCBmZWF0dXJlKQorI2RlZmluZSBCVFJGU19GRUFUX0FUVFJfQ09NUEFUX1JPKG5hbWUsIGZlYXR1cmUpIFwKKwlCVFJGU19GRUFUX0FUVFIobmFtZSwgRkVBVF9DT01QQVRfUk8sIEJUUkZTX0ZFQVRVUkVfQ09NUEFULCBmZWF0dXJlKQorI2RlZmluZSBCVFJGU19GRUFUX0FUVFJfSU5DT01QQVQobmFtZSwgZmVhdHVyZSkgXAorCUJUUkZTX0ZFQVRfQVRUUihuYW1lLCBGRUFUX0lOQ09NUEFULCBCVFJGU19GRUFUVVJFX0lOQ09NUEFULCBmZWF0dXJlKQorCisvKiBjb252ZXJ0IGZyb20gYXR0cmlidXRlICovCisjZGVmaW5lIHRvX2J0cmZzX2ZlYXR1cmVfYXR0cihhKSBcCisJCQljb250YWluZXJfb2YoYSwgc3RydWN0IGJ0cmZzX2ZlYXR1cmVfYXR0ciwga29ial9hdHRyKQorI2RlZmluZSBhdHRyX3RvX2J0cmZzX2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSwgYXR0cikKKyNkZWZpbmUgYXR0cl90b19idHJmc19mZWF0dXJlX2F0dHIoYSkgXAorCQkJdG9fYnRyZnNfZmVhdHVyZV9hdHRyKGF0dHJfdG9fYnRyZnNfYXR0cihhKSkKK2NoYXIgKmJ0cmZzX3ByaW50YWJsZV9mZWF0dXJlcyhlbnVtIGJ0cmZzX2ZlYXR1cmVfc2V0IHNldCwgdTY0IGZsYWdzKTsKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgYnRyZnNfZmVhdHVyZV9zZXRfbmFtZXNbM107CitleHRlcm4gc3RydWN0IGtvYmpfdHlwZSBzcGFjZV9pbmZvX2t0eXBlOworZXh0ZXJuIHN0cnVjdCBrb2JqX3R5cGUgYnRyZnNfcmFpZF9rdHlwZTsKKyNlbmRpZiAvKiBfQlRSRlNfU1lTRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3Rlc3RzL2J0cmZzLXRlc3RzLmggYi9mcy9idHJmcy90ZXN0cy9idHJmcy10ZXN0cy5oCmluZGV4IGIzNTNiYzguLjMxMjU2MGEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Rlc3RzL2J0cmZzLXRlc3RzLmgKKysrIGIvZnMvYnRyZnMvdGVzdHMvYnRyZnMtdGVzdHMuaApAQCAtMjEsNyArMjEsNyBAQAogCiAjaWZkZWYgQ09ORklHX0JUUkZTX0ZTX1JVTl9TQU5JVFlfVEVTVFMKIAotI2RlZmluZSB0ZXN0X21zZyhmbXQsIC4uLikgcHJfaW5mbygiYnRyZnM6IHNlbGZ0ZXN0OiAiIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdGVzdF9tc2coZm10LCAuLi4pIHByX2luZm8oIkJUUkZTOiBzZWxmdGVzdDogIiBmbXQsICMjX19WQV9BUkdTX18pCiAKIGludCBidHJmc190ZXN0X2ZyZWVfc3BhY2VfY2FjaGUodm9pZCk7CiBpbnQgYnRyZnNfdGVzdF9leHRlbnRfYnVmZmVyX29wZXJhdGlvbnModm9pZCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwppbmRleCBjNmE4NzJhLi4zNGNkODMxIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAlXQVJOX09OKGF0b21pY19yZWFkKCZ0cmFuc2FjdGlvbi0+dXNlX2NvdW50KSA9PSAwKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHJhbnNhY3Rpb24tPnVzZV9jb3VudCkpIHsKIAkJQlVHX09OKCFsaXN0X2VtcHR5KCZ0cmFuc2FjdGlvbi0+bGlzdCkpOwotCQlXQVJOX09OKHRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnMucm9vdC5yYl9ub2RlKTsKKwkJV0FSTl9PTighUkJfRU1QVFlfUk9PVCgmdHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmcy5ocmVmX3Jvb3QpKTsKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0cmFuc2FjdGlvbi0+cGVuZGluZ19jaHVua3MpKSB7CiAJCQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CiAKQEAgLTE4Myw4ICsxODMsOCBAQAogCWF0b21pY19zZXQoJmN1cl90cmFucy0+dXNlX2NvdW50LCAyKTsKIAljdXJfdHJhbnMtPnN0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCi0JY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMucm9vdCA9IFJCX1JPT1Q7Ci0JY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2VudHJpZXMgPSAwOworCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLmhyZWZfcm9vdCA9IFJCX1JPT1Q7CisJYXRvbWljX3NldCgmY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2VudHJpZXMsIDApOwogCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLm51bV9oZWFkc19yZWFkeSA9IDA7CiAJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2hlYWRzID0gMDsKIAljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5mbHVzaGluZyA9IDA7CkBAIC0xOTYsMTcgKzE5NiwxNCBAQAogCSAqLwogCXNtcF9tYigpOwogCWlmICghbGlzdF9lbXB0eSgmZnNfaW5mby0+dHJlZV9tb2Rfc2VxX2xpc3QpKQotCQlXQVJOKDEsIEtFUk5fRVJSICJidHJmczogdHJlZV9tb2Rfc2VxX2xpc3Qgbm90IGVtcHR5IHdoZW4gIgorCQlXQVJOKDEsIEtFUk5fRVJSICJCVFJGUzogdHJlZV9tb2Rfc2VxX2xpc3Qgbm90IGVtcHR5IHdoZW4gIgogCQkJImNyZWF0aW5nIGEgZnJlc2ggdHJhbnNhY3Rpb25cbiIpOwogCWlmICghUkJfRU1QVFlfUk9PVCgmZnNfaW5mby0+dHJlZV9tb2RfbG9nKSkKLQkJV0FSTigxLCBLRVJOX0VSUiAiYnRyZnM6IHRyZWVfbW9kX2xvZyByYiB0cmVlIG5vdCBlbXB0eSB3aGVuICIKKwkJV0FSTigxLCBLRVJOX0VSUiAiQlRSRlM6IHRyZWVfbW9kX2xvZyByYiB0cmVlIG5vdCBlbXB0eSB3aGVuICIKIAkJCSJjcmVhdGluZyBhIGZyZXNoIHRyYW5zYWN0aW9uXG4iKTsKIAlhdG9taWM2NF9zZXQoJmZzX2luZm8tPnRyZWVfbW9kX3NlcSwgMCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubG9jayk7Ci0JYXRvbWljX3NldCgmY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMucHJvY3NfcnVubmluZ19yZWZzLCAwKTsKLQlhdG9taWNfc2V0KCZjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5yZWZfc2VxLCAwKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy53YWl0KTsKIAogCUlOSVRfTElTVF9IRUFEKCZjdXJfdHJhbnMtPnBlbmRpbmdfc25hcHNob3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmY3VyX3RyYW5zLT5vcmRlcmVkX29wZXJhdGlvbnMpOwpAQCAtNDcyLDYgKzQ2OSw3IEBACiAJaC0+dHlwZSA9IHR5cGU7CiAJaC0+YWxsb2NhdGluZ19jaHVuayA9IGZhbHNlOwogCWgtPnJlbG9jX3Jlc2VydmVkID0gZmFsc2U7CisJaC0+c3luYyA9IGZhbHNlOwogCUlOSVRfTElTVF9IRUFEKCZoLT5xZ3JvdXBfcmVmX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoLT5uZXdfYmdzKTsKIApAQCAtNjQ3LDcgKzY0NSw3IEBACiAJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlpZiAocm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3Jzdi5zcGFjZV9pbmZvLT5mdWxsICYmCi0JICAgIGJ0cmZzX3Nob3VsZF90aHJvdHRsZV9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QpKQorCSAgICBidHJmc19jaGVja19zcGFjZV9mb3JfZGVsYXllZF9yZWZzKHRyYW5zLCByb290KSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gISFidHJmc19ibG9ja19yc3ZfY2hlY2socm9vdCwgJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3YsIDUpOwpAQCAtNzExLDggKzcwOSw4IEBACiAJCWJ0cmZzX2NyZWF0ZV9wZW5kaW5nX2Jsb2NrX2dyb3Vwcyh0cmFucywgcm9vdCk7CiAKIAl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcyA9IDA7Ci0JaWYgKGJ0cmZzX3Nob3VsZF90aHJvdHRsZV9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QpKSB7Ci0JCWN1ciA9IG1heF90KHVuc2lnbmVkIGxvbmcsIGN1ciwgMSk7CisJaWYgKCF0cmFucy0+c3luYyAmJiBidHJmc19zaG91bGRfdGhyb3R0bGVfZGVsYXllZF9yZWZzKHRyYW5zLCByb290KSkgeworCQljdXIgPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBjdXIsIDMyKTsKIAkJdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMgPSAwOwogCQlidHJmc19ydW5fZGVsYXllZF9yZWZzKHRyYW5zLCByb290LCBjdXIpOwogCX0KQEAgLTc4OCwxMiArNzg2LDYgQEAKIAlyZXR1cm4gX19idHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIDEpOwogfQogCi1pbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uX2RtZXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290KQotewotCXJldHVybiBfX2J0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgMSk7Ci19Ci0KIC8qCiAgKiB3aGVuIGJ0cmVlIGJsb2NrcyBhcmUgYWxsb2NhdGVkLCB0aGV5IGhhdmUgc29tZSBjb3JyZXNwb25kaW5nIGJpdHMgc2V0IGZvcgogICogdGhlbSBpbiBvbmUgb2YgdHdvIGV4dGVudF9pbyB0cmVlcy4gIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgYWxsIG9mCkBAIC0xMTA1LDcgKzEwOTcsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKGJ0cmZzX2RlZnJhZ19jYW5jZWxsZWQocm9vdC0+ZnNfaW5mbykpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJidHJmczogZGVmcmFnX3Jvb3QgY2FuY2VsbGVkXG4iKTsKKwkJCXByX2RlYnVnKCJCVFJGUzogZGVmcmFnX3Jvb3QgY2FuY2VsbGVkXG4iKTsKIAkJCXJldCA9IC1FQUdBSU47CiAJCQlicmVhazsKIAkJfQpAQCAtMTc0Niw2ICsxNzM4LDggQEAKIAkJZ290byBjbGVhbnVwX3RyYW5zYWN0aW9uOwogCiAJYnRyZnNfd2FpdF9kZWxhbGxvY19mbHVzaChyb290LT5mc19pbmZvKTsKKworCWJ0cmZzX3NjcnViX3BhdXNlKHJvb3QpOwogCS8qCiAJICogT2sgbm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGJsb2NrIG91dCBhbnkgb3RoZXIgam9pbnMgd2hpbGUgd2UKIAkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uLiAgV2UgY291bGQgaGF2ZSBzdGFydGVkIGEgam9pbiBiZWZvcmUgc2V0dGluZwpAQCAtMTgxMCw3ICsxODA0LDYgQEAKIAogCVdBUk5fT04oY3VyX3RyYW5zICE9IHRyYW5zLT50cmFuc2FjdGlvbik7CiAKLQlidHJmc19zY3J1Yl9wYXVzZShyb290KTsKIAkvKiBidHJmc19jb21taXRfdHJlZV9yb290cyBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUKIAkgKiB2YXJpb3VzIHJvb3RzIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLiAgRXZlcnkgcG9pbnRlcgogCSAqIGluIHRoZSB0cmVlIG9mIHRyZWUgcm9vdHMgaGFzIHRvIHBvaW50IHRvIHRoZSBtb3N0IHVwIHRvIGRhdGUKQEAgLTE4MzMsNiArMTgyNiwxNSBAQAogCQlnb3RvIGNsZWFudXBfdHJhbnNhY3Rpb247CiAJfQogCisJLyoKKwkgKiBTaW5jZSB0aGUgdHJhbnNhY3Rpb24gaXMgZG9uZSwgd2Ugc2hvdWxkIHNldCB0aGUgaW5vZGUgbWFwIGNhY2hlIGZsYWcKKwkgKiBiZWZvcmUgYW55IG90aGVyIGNvbW1pbmcgdHJhbnNhY3Rpb24uCisJICovCisJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIENIQU5HRV9JTk9ERV9DQUNIRSkpCisJCWJ0cmZzX3NldF9vcHQocm9vdC0+ZnNfaW5mby0+bW91bnRfb3B0LCBJTk9ERV9NQVBfQ0FDSEUpOworCWVsc2UKKwkJYnRyZnNfY2xlYXJfb3B0KHJvb3QtPmZzX2luZm8tPm1vdW50X29wdCwgSU5PREVfTUFQX0NBQ0hFKTsKKwogCS8qIGNvbW1pdF9mc19yb290cyBnZXRzIHJpZCBvZiBhbGwgdGhlIHRyZWUgbG9nIHJvb3RzLCBpdCBpcyBub3cKIAkgKiBzYWZlIHRvIGZyZWUgdGhlIHJvb3Qgb2YgdHJlZSBsb2cgcm9vdHMKIAkgKi8KQEAgLTE5NzUsMTAgKzE5NzcsMjMgQEAKIAl9CiAJcm9vdCA9IGxpc3RfZmlyc3RfZW50cnkoJmZzX2luZm8tPmRlYWRfcm9vdHMsCiAJCQlzdHJ1Y3QgYnRyZnNfcm9vdCwgcm9vdF9saXN0KTsKKwkvKgorCSAqIE1ha2Ugc3VyZSByb290IGlzIG5vdCBpbnZvbHZlZCBpbiBzZW5kLAorCSAqIGlmIHdlIGZhaWwgd2l0aCBmaXJzdCByb290LCB3ZSByZXR1cm4KKwkgKiBkaXJlY3RseSByYXRoZXIgdGhhbiBjb250aW51ZS4KKwkgKi8KKwlzcGluX2xvY2soJnJvb3QtPnJvb3RfaXRlbV9sb2NrKTsKKwlpZiAocm9vdC0+c2VuZF9pbl9wcm9ncmVzcykgeworCQlzcGluX3VubG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZyb290LT5yb290X2l0ZW1fbG9jayk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9jaygmcm9vdC0+cm9vdF9pdGVtX2xvY2spOworCiAJbGlzdF9kZWxfaW5pdCgmcm9vdC0+cm9vdF9saXN0KTsKIAlzcGluX3VubG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CiAKLQlwcl9kZWJ1ZygiYnRyZnM6IGNsZWFuZXIgcmVtb3ZpbmcgJWxsdVxuIiwgcm9vdC0+b2JqZWN0aWQpOworCXByX2RlYnVnKCJCVFJGUzogY2xlYW5lciByZW1vdmluZyAlbGx1XG4iLCByb290LT5vYmplY3RpZCk7CiAKIAlidHJmc19raWxsX2FsbF9kZWxheWVkX25vZGVzKHJvb3QpOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmFuc2FjdGlvbi5oIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaAppbmRleCA3NjU3ZDExLi42YWMwMzdlIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmFuc2FjdGlvbi5oCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKQEAgLTkzLDYgKzkzLDcgQEAKIAlzaG9ydCBhZGRpbmdfY3N1bXM7CiAJYm9vbCBhbGxvY2F0aW5nX2NodW5rOwogCWJvb2wgcmVsb2NfcmVzZXJ2ZWQ7CisJYm9vbCBzeW5jOwogCXVuc2lnbmVkIGludCB0eXBlOwogCS8qCiAJICogdGhpcyByb290IGlzIG9ubHkgbmVlZGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHJvb3QgcGFzc2VkIHRvCkBAIC0xNTQsOCArMTU1LDYgQEAKIAkJCQkgICBpbnQgd2FpdF9mb3JfdW5ibG9jayk7CiBpbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKLWludCBidHJmc19lbmRfdHJhbnNhY3Rpb25fZG1ldGEoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogaW50IGJ0cmZzX3Nob3VsZF9lbmRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKIHZvaWQgYnRyZnNfdGhyb3R0bGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggOWY3ZmM1MS4uMzlkODNkYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC01NzAsNyArNTcwLDcgQEAKIAkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGViLCBpdGVtKSA9PSAwKQogCQkJbmJ5dGVzID0gMDsKIAl9IGVsc2UgaWYgKGZvdW5kX3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7Ci0JCXNpemUgPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGViLCBpdGVtKTsKKwkJc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4oZWIsIHNsb3QsIGl0ZW0pOwogCQluYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMoZWIsIGl0ZW0pOwogCQlleHRlbnRfZW5kID0gQUxJR04oc3RhcnQgKyBzaXplLCByb290LT5zZWN0b3JzaXplKTsKIAl9IGVsc2UgewpAQCAtMTIzOCw3ICsxMjM4LDggQEAKIAkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2Zmc2V0KQogewogCWludCByZXQ7Ci0JcmV0ID0gYnRyZnNfZmluZF9vcnBoYW5faXRlbShyb290LCBvZmZzZXQpOworCXJldCA9IGJ0cmZzX2ZpbmRfaXRlbShyb290LCBOVUxMLCBCVFJGU19PUlBIQU5fT0JKRUNUSUQsCisJCQlvZmZzZXQsIEJUUkZTX09SUEhBTl9JVEVNX0tFWSwgTlVMTCk7CiAJaWYgKHJldCA+IDApCiAJCXJldCA9IGJ0cmZzX2luc2VydF9vcnBoYW5faXRlbSh0cmFucywgcm9vdCwgb2Zmc2V0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMzE5NCw3ICszMTk1LDcgQEAKIHN0YXRpYyBub2lubGluZSBpbnQgY29weV9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19wYXRoICpkc3RfcGF0aCwKLQkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc3JjLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19wYXRoICpzcmNfcGF0aCwgdTY0ICpsYXN0X2V4dGVudCwKIAkJCSAgICAgICBpbnQgc3RhcnRfc2xvdCwgaW50IG5yLCBpbnQgaW5vZGVfb25seSkKIHsKIAl1bnNpZ25lZCBsb25nIHNyY19vZmZzZXQ7CkBAIC0zMjAyLDYgKzMyMDMsOCBAQAogCXN0cnVjdCBidHJmc19yb290ICpsb2cgPSBCVFJGU19JKGlub2RlKS0+cm9vdC0+bG9nX3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmV4dGVudDsKIAlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaW5vZGVfaXRlbTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc3JjID0gc3JjX3BhdGgtPm5vZGVzWzBdOworCXN0cnVjdCBidHJmc19rZXkgZmlyc3Rfa2V5LCBsYXN0X2tleSwga2V5OwogCWludCByZXQ7CiAJc3RydWN0IGJ0cmZzX2tleSAqaW5zX2tleXM7CiAJdTMyICppbnNfc2l6ZXM7CkBAIC0zMjA5LDYgKzMyMTIsOSBAQAogCWludCBpOwogCXN0cnVjdCBsaXN0X2hlYWQgb3JkZXJlZF9zdW1zOwogCWludCBza2lwX2NzdW0gPSBCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFTVU07CisJYm9vbCBoYXNfZXh0ZW50cyA9IGZhbHNlOworCWJvb2wgbmVlZF9maW5kX2xhc3RfZXh0ZW50ID0gKCpsYXN0X2V4dGVudCA9PSAwKTsKKwlib29sIGRvbmUgPSBmYWxzZTsKIAogCUlOSVRfTElTVF9IRUFEKCZvcmRlcmVkX3N1bXMpOwogCkBAIC0zMjE3LDYgKzMyMjMsOCBAQAogCWlmICghaW5zX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZmlyc3Rfa2V5Lm9iamVjdGlkID0gKHU2NCktMTsKKwogCWluc19zaXplcyA9ICh1MzIgKilpbnNfZGF0YTsKIAlpbnNfa2V5cyA9IChzdHJ1Y3QgYnRyZnNfa2V5ICopKGluc19kYXRhICsgbnIgKiBzaXplb2YodTMyKSk7CiAKQEAgLTMyMzcsNiArMzI0NSw5IEBACiAKIAkJc3JjX29mZnNldCA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChzcmMsIHN0YXJ0X3Nsb3QgKyBpKTsKIAorCQlpZiAoKGkgPT0gKG5yIC0gMSkpKQorCQkJbGFzdF9rZXkgPSBpbnNfa2V5c1tpXTsKKwogCQlpZiAoaW5zX2tleXNbaV0udHlwZSA9PSBCVFJGU19JTk9ERV9JVEVNX0tFWSkgewogCQkJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGRzdF9wYXRoLT5ub2Rlc1swXSwKIAkJCQkJCSAgICBkc3RfcGF0aC0+c2xvdHNbMF0sCkBAIC0zMjQ4LDYgKzMyNTksMjEgQEAKIAkJCQkJICAgc3JjX29mZnNldCwgaW5zX3NpemVzW2ldKTsKIAkJfQogCisJCS8qCisJCSAqIFdlIHNldCBuZWVkX2ZpbmRfbGFzdF9leHRlbnQgaGVyZSBpbiBjYXNlIHdlIGtub3cgd2Ugd2VyZQorCQkgKiBwcm9jZXNzaW5nIG90aGVyIGl0ZW1zIGFuZCB0aGVuIHdhbGsgaW50byB0aGUgZmlyc3QgZXh0ZW50IGluCisJCSAqIHRoZSBpbm9kZS4gIElmIHdlIGRvbid0IGhpdCBhbiBleHRlbnQgdGhlbiBub3RoaW5nIGNoYW5nZXMsCisJCSAqIHdlJ2xsIGRvIHRoZSBsYXN0IHNlYXJjaCB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KKwkJICovCisJCWlmIChpbnNfa2V5c1tpXS50eXBlID09IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkgeworCQkJaGFzX2V4dGVudHMgPSB0cnVlOworCQkJaWYgKG5lZWRfZmluZF9sYXN0X2V4dGVudCAmJgorCQkJICAgIGZpcnN0X2tleS5vYmplY3RpZCA9PSAodTY0KS0xKQorCQkJCWZpcnN0X2tleSA9IGluc19rZXlzW2ldOworCQl9IGVsc2UgeworCQkJbmVlZF9maW5kX2xhc3RfZXh0ZW50ID0gZmFsc2U7CisJCX0KKwogCQkvKiB0YWtlIGEgcmVmZXJlbmNlIG9uIGZpbGUgZGF0YSBleHRlbnRzIHNvIHRoYXQgdHJ1bmNhdGVzCiAJCSAqIG9yIGRlbGV0ZXMgb2YgdGhpcyBpbm9kZSBkb24ndCBoYXZlIHRvIHJlbG9nIHRoZSBpbm9kZQogCQkgKiBhZ2FpbgpAQCAtMzMxMiw2ICszMzM4LDEyOCBAQAogCQlsaXN0X2RlbCgmc3Vtcy0+bGlzdCk7CiAJCWtmcmVlKHN1bXMpOwogCX0KKworCWlmICghaGFzX2V4dGVudHMpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEJlY2F1c2Ugd2UgdXNlIGJ0cmZzX3NlYXJjaF9mb3J3YXJkIHdlIGNvdWxkIHNraXAgbGVhdmVzIHRoYXQgd2VyZQorCSAqIG5vdCBtb2RpZmllZCBhbmQgdGhlbiBhc3N1bWUgKmxhc3RfZXh0ZW50IGlzIHZhbGlkIHdoZW4gaXQgcmVhbGx5CisJICogaXNuJ3QuICBTbyBiYWNrIHVwIHRvIHRoZSBwcmV2aW91cyBsZWFmIGFuZCByZWFkIHRoZSBlbmQgb2YgdGhlIGxhc3QKKwkgKiBleHRlbnQgYmVmb3JlIHdlIGdvIGFuZCBmaWxsIGluIGhvbGVzLgorCSAqLworCWlmIChuZWVkX2ZpbmRfbGFzdF9leHRlbnQpIHsKKwkJdTY0IGxlbjsKKworCQlyZXQgPSBidHJmc19wcmV2X2xlYWYoQlRSRlNfSShpbm9kZSktPnJvb3QsIHNyY19wYXRoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmV0KQorCQkJZ290byBmaWxsX2hvbGVzOworCQlpZiAoc3JjX3BhdGgtPnNsb3RzWzBdKQorCQkJc3JjX3BhdGgtPnNsb3RzWzBdLS07CisJCXNyYyA9IHNyY19wYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHNyYywgJmtleSwgc3JjX3BhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGtleS5vYmplY3RpZCAhPSBidHJmc19pbm8oaW5vZGUpIHx8CisJCSAgICBrZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQlnb3RvIGZpbGxfaG9sZXM7CisJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKHNyYywgc3JjX3BhdGgtPnNsb3RzWzBdLAorCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWlmIChidHJmc19maWxlX2V4dGVudF90eXBlKHNyYywgZXh0ZW50KSA9PQorCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCQlsZW4gPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKHNyYywKKwkJCQkJCQkgICBzcmNfcGF0aC0+c2xvdHNbMF0sCisJCQkJCQkJICAgZXh0ZW50KTsKKwkJCSpsYXN0X2V4dGVudCA9IEFMSUdOKGtleS5vZmZzZXQgKyBsZW4sCisJCQkJCSAgICAgbG9nLT5zZWN0b3JzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhzcmMsIGV4dGVudCk7CisJCQkqbGFzdF9leHRlbnQgPSBrZXkub2Zmc2V0ICsgbGVuOworCQl9CisJfQorZmlsbF9ob2xlczoKKwkvKiBTbyB3ZSBkaWQgcHJldl9sZWFmLCBub3cgd2UgbmVlZCB0byBtb3ZlIHRvIHRoZSBuZXh0IGxlYWYsIGJ1dCBhIGZldworCSAqIHRoaW5ncyBjb3VsZCBoYXZlIGhhcHBlbmVkCisJICoKKwkgKiAxKSBBIG1lcmdlIGNvdWxkIGhhdmUgaGFwcGVuZWQsIHNvIHdlIGNvdWxkIGN1cnJlbnRseSBiZSBvbiBhIGxlYWYKKwkgKiB0aGF0IGhvbGRzIHdoYXQgd2Ugd2VyZSBjb3B5aW5nIGluIHRoZSBmaXJzdCBwbGFjZS4KKwkgKiAyKSBBIHNwbGl0IGNvdWxkIGhhdmUgaGFwcGVuZWQsIGFuZCBub3cgbm90IGFsbCBvZiB0aGUgaXRlbXMgd2Ugd2FudAorCSAqIGFyZSBvbiB0aGUgc2FtZSBsZWFmLgorCSAqCisJICogU28gd2UgbmVlZCB0byBhZGp1c3QgaG93IHdlIHNlYXJjaCBmb3IgaG9sZXMsIHdlIG5lZWQgdG8gZHJvcCB0aGUKKwkgKiBwYXRoIGFuZCByZS1zZWFyY2ggZm9yIHRoZSBmaXJzdCBleHRlbnQga2V5IHdlIGZvdW5kLCBhbmQgdGhlbiB3YWxrCisJICogZm9yd2FyZCB1bnRpbCB3ZSBoaXQgdGhlIGxhc3Qgb25lIHdlIGNvcGllZC4KKwkgKi8KKwlpZiAobmVlZF9maW5kX2xhc3RfZXh0ZW50KSB7CisJCS8qIGJ0cmZzX3ByZXZfbGVhZiBjb3VsZCByZXR1cm4gMSB3aXRob3V0IHJlbGVhc2luZyB0aGUgcGF0aCAqLworCQlidHJmc19yZWxlYXNlX3BhdGgoc3JjX3BhdGgpOworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCBCVFJGU19JKGlub2RlKS0+cm9vdCwgJmZpcnN0X2tleSwKKwkJCQkJc3JjX3BhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCUFTU0VSVChyZXQgPT0gMCk7CisJCXNyYyA9IHNyY19wYXRoLT5ub2Rlc1swXTsKKwkJaSA9IHNyY19wYXRoLT5zbG90c1swXTsKKwl9IGVsc2UgeworCQlpID0gc3RhcnRfc2xvdDsKKwl9CisKKwkvKgorCSAqIE9rIHNvIGhlcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIGFuZCBmaWxsIGluIGFueSBob2xlcyB3ZSBtYXkgaGF2ZQorCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IGhvbGVzIGFyZSBwdW5jaGVkIGZvciB0aG9zZSBhcmVhcyBpbiBjYXNlIHRoZXkgaGFkCisJICogZXh0ZW50cyBwcmV2aW91c2x5LgorCSAqLworCXdoaWxlICghZG9uZSkgeworCQl1NjQgb2Zmc2V0LCBsZW47CisJCXU2NCBleHRlbnRfZW5kOworCisJCWlmIChpID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHNyY19wYXRoLT5ub2Rlc1swXSkpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihCVFJGU19JKGlub2RlKS0+cm9vdCwgc3JjX3BhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCUFTU0VSVChyZXQgPT0gMCk7CisJCQlzcmMgPSBzcmNfcGF0aC0+bm9kZXNbMF07CisJCQlpID0gMDsKKwkJfQorCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShzcmMsICZrZXksIGkpOworCQlpZiAoIWJ0cmZzX2NvbXBfY3B1X2tleXMoJmtleSwgJmxhc3Rfa2V5KSkKKwkJCWRvbmUgPSB0cnVlOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IGJ0cmZzX2lubyhpbm9kZSkgfHwKKwkJICAgIGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwkJZXh0ZW50ID0gYnRyZnNfaXRlbV9wdHIoc3JjLCBpLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWlmIChidHJmc19maWxlX2V4dGVudF90eXBlKHNyYywgZXh0ZW50KSA9PQorCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCQlsZW4gPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKHNyYywgaSwgZXh0ZW50KTsKKwkJCWV4dGVudF9lbmQgPSBBTElHTihrZXkub2Zmc2V0ICsgbGVuLCBsb2ctPnNlY3RvcnNpemUpOworCQl9IGVsc2UgeworCQkJbGVuID0gYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKHNyYywgZXh0ZW50KTsKKwkJCWV4dGVudF9lbmQgPSBrZXkub2Zmc2V0ICsgbGVuOworCQl9CisJCWkrKzsKKworCQlpZiAoKmxhc3RfZXh0ZW50ID09IGtleS5vZmZzZXQpIHsKKwkJCSpsYXN0X2V4dGVudCA9IGV4dGVudF9lbmQ7CisJCQljb250aW51ZTsKKwkJfQorCQlvZmZzZXQgPSAqbGFzdF9leHRlbnQ7CisJCWxlbiA9IGtleS5vZmZzZXQgLSAqbGFzdF9leHRlbnQ7CisJCXJldCA9IGJ0cmZzX2luc2VydF9maWxlX2V4dGVudCh0cmFucywgbG9nLCBidHJmc19pbm8oaW5vZGUpLAorCQkJCQkgICAgICAgb2Zmc2V0LCAwLCAwLCBsZW4sIDAsIGxlbiwgMCwKKwkJCQkJICAgICAgIDAsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCSpsYXN0X2V4dGVudCA9IG9mZnNldCArIGxlbjsKKwl9CisJLyoKKwkgKiBOZWVkIHRvIGxldCB0aGUgY2FsbGVycyBrbm93IHdlIGRyb3BwZWQgdGhlIHBhdGggc28gdGhleSBzaG91bGQKKwkgKiByZS1zZWFyY2guCisJICovCisJaWYgKCFyZXQgJiYgbmVlZF9maW5kX2xhc3RfZXh0ZW50KQorCQlyZXQgPSAxOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzNDksMjEgKzM0OTcsMjcgQEAKIAlpbnQgcmV0OwogCWludCBpbmRleCA9IGxvZy0+bG9nX3RyYW5zaWQgJSAyOwogCWJvb2wgc2tpcF9jc3VtID0gQlRSRlNfSShpbm9kZSktPmZsYWdzICYgQlRSRlNfSU5PREVfTk9EQVRBU1VNOwotCi0JcmV0ID0gX19idHJmc19kcm9wX2V4dGVudHModHJhbnMsIGxvZywgaW5vZGUsIHBhdGgsIGVtLT5zdGFydCwKLQkJCQkgICBlbS0+c3RhcnQgKyBlbS0+bGVuLCBOVUxMLCAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWludCBleHRlbnRfaW5zZXJ0ZWQgPSAwOwogCiAJSU5JVF9MSVNUX0hFQUQoJm9yZGVyZWRfc3Vtcyk7CiAJYnRyZnNfaW5pdF9tYXBfdG9rZW4oJnRva2VuKTsKLQlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOwotCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOwotCWtleS5vZmZzZXQgPSBlbS0+c3RhcnQ7CiAKLQlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgbG9nLCBwYXRoLCAma2V5LCBzaXplb2YoKmZpKSk7CisJcmV0ID0gX19idHJmc19kcm9wX2V4dGVudHModHJhbnMsIGxvZywgaW5vZGUsIHBhdGgsIGVtLT5zdGFydCwKKwkJCQkgICBlbS0+c3RhcnQgKyBlbS0+bGVuLCBOVUxMLCAwLCAxLAorCQkJCSAgIHNpemVvZigqZmkpLCAmZXh0ZW50X2luc2VydGVkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCisJaWYgKCFleHRlbnRfaW5zZXJ0ZWQpIHsKKwkJa2V5Lm9iamVjdGlkID0gYnRyZnNfaW5vKGlub2RlKTsKKwkJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CisJCWtleS5vZmZzZXQgPSBlbS0+c3RhcnQ7CisKKwkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIGxvZywgcGF0aCwgJmtleSwKKwkJCQkJICAgICAgc2l6ZW9mKCpmaSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwogCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCiAJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOwpAQCAtMzQ4NSw3ICszNjM5LDExIEBACiAJCSAqIHN0YXJ0IG92ZXIgYWZ0ZXIgdGhpcy4KIAkJICovCiAKLQkJd2FpdF9ldmVudChvcmRlcmVkLT53YWl0LCBvcmRlcmVkLT5jc3VtX2J5dGVzX2xlZnQgPT0gMCk7CisJCWlmIChvcmRlcmVkLT5jc3VtX2J5dGVzX2xlZnQpIHsKKwkJCWJ0cmZzX3N0YXJ0X29yZGVyZWRfZXh0ZW50KGlub2RlLCBvcmRlcmVkLCAwKTsKKwkJCXdhaXRfZXZlbnQob3JkZXJlZC0+d2FpdCwKKwkJCQkgICBvcmRlcmVkLT5jc3VtX2J5dGVzX2xlZnQgPT0gMCk7CisJCX0KIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1bSwgJm9yZGVyZWQtPmxpc3QsIGxpc3QpIHsKIAkJCXJldCA9IGJ0cmZzX2NzdW1fZmlsZV9ibG9ja3ModHJhbnMsIGxvZywgc3VtKTsKQEAgLTM2MzAsNiArMzc4OCw3IEBACiAJc3RydWN0IGJ0cmZzX2tleSBtYXhfa2V5OwogCXN0cnVjdCBidHJmc19yb290ICpsb2cgPSByb290LT5sb2dfcm9vdDsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc3JjID0gTlVMTDsKKwl1NjQgbGFzdF9leHRlbnQgPSAwOwogCWludCBlcnIgPSAwOwogCWludCByZXQ7CiAJaW50IG5yaXRlbXM7CkBAIC0zNzQ1LDExICszOTA0LDE1IEBACiAJCQlnb3RvIG5leHRfc2xvdDsKIAkJfQogCi0JCXJldCA9IGNvcHlfaXRlbXModHJhbnMsIGlub2RlLCBkc3RfcGF0aCwgc3JjLCBpbnNfc3RhcnRfc2xvdCwKLQkJCQkgaW5zX25yLCBpbm9kZV9vbmx5KTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBjb3B5X2l0ZW1zKHRyYW5zLCBpbm9kZSwgZHN0X3BhdGgsIHBhdGgsICZsYXN0X2V4dGVudCwKKwkJCQkgaW5zX3N0YXJ0X3Nsb3QsIGluc19uciwgaW5vZGVfb25seSk7CisJCWlmIChyZXQgPCAwKSB7CiAJCQllcnIgPSByZXQ7CiAJCQlnb3RvIG91dF91bmxvY2s7CisJCX0gaWYgKHJldCkgeworCQkJaW5zX25yID0gMDsKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWluc19uciA9IDE7CiAJCWluc19zdGFydF9zbG90ID0gcGF0aC0+c2xvdHNbMF07CkBAIC0zNzYzLDEzICszOTI2LDE0IEBACiAJCQlnb3RvIGFnYWluOwogCQl9CiAJCWlmIChpbnNfbnIpIHsKLQkJCXJldCA9IGNvcHlfaXRlbXModHJhbnMsIGlub2RlLCBkc3RfcGF0aCwgc3JjLAotCQkJCQkgaW5zX3N0YXJ0X3Nsb3QsCisJCQlyZXQgPSBjb3B5X2l0ZW1zKHRyYW5zLCBpbm9kZSwgZHN0X3BhdGgsIHBhdGgsCisJCQkJCSAmbGFzdF9leHRlbnQsIGluc19zdGFydF9zbG90LAogCQkJCQkgaW5zX25yLCBpbm9kZV9vbmx5KTsKLQkJCWlmIChyZXQpIHsKKwkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZXJyID0gcmV0OwogCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJCX0KKwkJCXJldCA9IDA7CiAJCQlpbnNfbnIgPSAwOwogCQl9CiAJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKQEAgLTM3ODQsMTIgKzM5NDgsMTMgQEAKIAkJfQogCX0KIAlpZiAoaW5zX25yKSB7Ci0JCXJldCA9IGNvcHlfaXRlbXModHJhbnMsIGlub2RlLCBkc3RfcGF0aCwgc3JjLCBpbnNfc3RhcnRfc2xvdCwKLQkJCQkgaW5zX25yLCBpbm9kZV9vbmx5KTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBjb3B5X2l0ZW1zKHRyYW5zLCBpbm9kZSwgZHN0X3BhdGgsIHBhdGgsICZsYXN0X2V4dGVudCwKKwkJCQkgaW5zX3N0YXJ0X3Nsb3QsIGluc19uciwgaW5vZGVfb25seSk7CisJCWlmIChyZXQgPCAwKSB7CiAJCQllcnIgPSByZXQ7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KKwkJcmV0ID0gMDsKIAkJaW5zX25yID0gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3VsaXN0LmMgYi9mcy9idHJmcy91bGlzdC5jCmluZGV4IGIwYTUyM2IyLi44NDBhMzhiIDEwMDY0NAotLS0gYS9mcy9idHJmcy91bGlzdC5jCisrKyBiL2ZzL2J0cmZzL3VsaXN0LmMKQEAgLTUsOCArNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1bGlzdC5oIgorI2luY2x1ZGUgImN0cmVlLmgiCiAKIC8qCiAgKiB1bGlzdCBpcyBhIGdlbmVyaWMgZGF0YSBzdHJ1Y3R1cmUgdG8gaG9sZCBhIGNvbGxlY3Rpb24gb2YgdW5pcXVlIHU2NApAQCAtMTQsMTAgKzE0LDYgQEAKICAqIGVudW1lcmF0aW5nIGl0LgogICogSXQgaXMgcG9zc2libGUgdG8gc3RvcmUgYW4gYXV4aWxpYXJ5IHZhbHVlIGFsb25nIHdpdGggdGhlIGtleS4KICAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgcHJlbGltaW5hcnkgYW5kIGNhbiBwcm9iYWJseSBiZSBzcGVkIHVwCi0gKiBzaWduaWZpY2FudGx5LiBBIGZpcnN0IHN0ZXAgd291bGQgYmUgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbiBhbiByYnRyZWUKLSAqIGFzIHNvb24gYXMgVUxJU1RfU0laRSBpcyBleGNlZWRlZC4KLSAqCiAgKiBBIHNhbXBsZSB1c2FnZSBmb3IgdWxpc3RzIGlzIHRoZSBlbnVtZXJhdGlvbiBvZiBkaXJlY3RlZCBncmFwaHMgd2l0aG91dAogICogdmlzaXRpbmcgYSBub2RlIHR3aWNlLiBUaGUgcHNldWRvLWNvZGUgY291bGQgbG9vayBsaWtlIHRoaXM6CiAgKgpAQCAtNTAsMTIgKzQ2LDEwIEBACiAgKi8KIHZvaWQgdWxpc3RfaW5pdChzdHJ1Y3QgdWxpc3QgKnVsaXN0KQogewotCXVsaXN0LT5ubm9kZXMgPSAwOwotCXVsaXN0LT5ub2RlcyA9IHVsaXN0LT5pbnRfbm9kZXM7Ci0JdWxpc3QtPm5vZGVzX2FsbG9jZWQgPSBVTElTVF9TSVpFOworCUlOSVRfTElTVF9IRUFEKCZ1bGlzdC0+bm9kZXMpOwogCXVsaXN0LT5yb290ID0gUkJfUk9PVDsKKwl1bGlzdC0+bm5vZGVzID0gMDsKIH0KLUVYUE9SVF9TWU1CT0wodWxpc3RfaW5pdCk7CiAKIC8qKgogICogdWxpc3RfZmluaSAtIGZyZWUgdXAgYWRkaXRpb25hbGx5IGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSB1bGlzdApAQCAtNjQsMTggKzU4LDE3IEBACiAgKiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB0aGUgYmFzZSAnc3RydWN0IHVsaXN0JyBoYXMgYmVlbiBzdGF0aWNhbGx5CiAgKiBhbGxvY2F0ZWQuCiAgKi8KLXZvaWQgdWxpc3RfZmluaShzdHJ1Y3QgdWxpc3QgKnVsaXN0KQorc3RhdGljIHZvaWQgdWxpc3RfZmluaShzdHJ1Y3QgdWxpc3QgKnVsaXN0KQogewotCS8qCi0JICogVGhlIGZpcnN0IFVMSVNUX1NJWkUgZWxlbWVudHMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gc3RydWN0IHVsaXN0LgotCSAqIE9ubHkgaWYgbW9yZSBlbGVtZW50cyBhcmUgYWxvY2F0ZWQgdGhleSBuZWVkIHRvIGJlIGZyZWVkLgotCSAqLwotCWlmICh1bGlzdC0+bm9kZXNfYWxsb2NlZCA+IFVMSVNUX1NJWkUpCi0JCWtmcmVlKHVsaXN0LT5ub2Rlcyk7Ci0JdWxpc3QtPm5vZGVzX2FsbG9jZWQgPSAwOwkvKiBpbiBjYXNlIHVsaXN0X2ZpbmkgaXMgY2FsbGVkIHR3aWNlICovCisJc3RydWN0IHVsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHVsaXN0X25vZGUgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgbmV4dCwgJnVsaXN0LT5ub2RlcywgbGlzdCkgeworCQlrZnJlZShub2RlKTsKKwl9CiAJdWxpc3QtPnJvb3QgPSBSQl9ST09UOworCUlOSVRfTElTVF9IRUFEKCZ1bGlzdC0+bm9kZXMpOwogfQotRVhQT1JUX1NZTUJPTCh1bGlzdF9maW5pKTsKIAogLyoqCiAgKiB1bGlzdF9yZWluaXQgLSBwcmVwYXJlIGEgdWxpc3QgZm9yIHJldXNlCkBAIC04OSw3ICs4Miw2IEBACiAJdWxpc3RfZmluaSh1bGlzdCk7CiAJdWxpc3RfaW5pdCh1bGlzdCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHVsaXN0X3JlaW5pdCk7CiAKIC8qKgogICogdWxpc3RfYWxsb2MgLSBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIHVsaXN0CkBAIC0xMDgsNyArMTAwLDYgQEAKIAogCXJldHVybiB1bGlzdDsKIH0KLUVYUE9SVF9TWU1CT0wodWxpc3RfYWxsb2MpOwogCiAvKioKICAqIHVsaXN0X2ZyZWUgLSBmcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB1bGlzdApAQCAtMTIzLDcgKzExNCw2IEBACiAJdWxpc3RfZmluaSh1bGlzdCk7CiAJa2ZyZWUodWxpc3QpOwogfQotRVhQT1JUX1NZTUJPTCh1bGlzdF9mcmVlKTsKIAogc3RhdGljIHN0cnVjdCB1bGlzdF9ub2RlICp1bGlzdF9yYnRyZWVfc2VhcmNoKHN0cnVjdCB1bGlzdCAqdWxpc3QsIHU2NCB2YWwpCiB7CkBAIC0xOTIsNjMgKzE4MiwzMiBAQAogaW50IHVsaXN0X2FkZF9tZXJnZShzdHJ1Y3QgdWxpc3QgKnVsaXN0LCB1NjQgdmFsLCB1NjQgYXV4LAogCQkgICAgdTY0ICpvbGRfYXV4LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdWxpc3Rfbm9kZSAqbm9kZSA9IE5VTEw7CisJaW50IHJldDsKKwlzdHJ1Y3QgdWxpc3Rfbm9kZSAqbm9kZTsKKwogCW5vZGUgPSB1bGlzdF9yYnRyZWVfc2VhcmNoKHVsaXN0LCB2YWwpOwogCWlmIChub2RlKSB7CiAJCWlmIChvbGRfYXV4KQogCQkJKm9sZF9hdXggPSBub2RlLT5hdXg7CiAJCXJldHVybiAwOwogCX0KKwlub2RlID0ga21hbGxvYyhzaXplb2YoKm5vZGUpLCBnZnBfbWFzayk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICh1bGlzdC0+bm5vZGVzID49IHVsaXN0LT5ub2Rlc19hbGxvY2VkKSB7Ci0JCXU2NCBuZXdfYWxsb2NlZCA9IHVsaXN0LT5ub2Rlc19hbGxvY2VkICsgMTI4OwotCQlzdHJ1Y3QgdWxpc3Rfbm9kZSAqbmV3X25vZGVzOwotCQl2b2lkICpvbGQgPSBOVUxMOwotCQlpbnQgaTsKKwlub2RlLT52YWwgPSB2YWw7CisJbm9kZS0+YXV4ID0gYXV4OworI2lmZGVmIENPTkZJR19CVFJGU19ERUJVRworCW5vZGUtPnNlcW51bSA9IHVsaXN0LT5ubm9kZXM7CisjZW5kaWYKIAotCQlmb3IgKGkgPSAwOyBpIDwgdWxpc3QtPm5ub2RlczsgaSsrKQotCQkJcmJfZXJhc2UoJnVsaXN0LT5ub2Rlc1tpXS5yYl9ub2RlLCAmdWxpc3QtPnJvb3QpOwotCi0JCS8qCi0JCSAqIGlmIG5vZGVzX2FsbG9jZWQgPT0gVUxJU1RfU0laRSBubyBtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkCi0JCSAqIHlldCwgc28gcGFzcyBOVUxMIHRvIGtyZWFsbG9jCi0JCSAqLwotCQlpZiAodWxpc3QtPm5vZGVzX2FsbG9jZWQgPiBVTElTVF9TSVpFKQotCQkJb2xkID0gdWxpc3QtPm5vZGVzOwotCi0JCW5ld19ub2RlcyA9IGtyZWFsbG9jKG9sZCwgc2l6ZW9mKCpuZXdfbm9kZXMpICogbmV3X2FsbG9jZWQsCi0JCQkJICAgICBnZnBfbWFzayk7Ci0JCWlmICghbmV3X25vZGVzKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKCFvbGQpCi0JCQltZW1jcHkobmV3X25vZGVzLCB1bGlzdC0+aW50X25vZGVzLAotCQkJICAgICAgIHNpemVvZih1bGlzdC0+aW50X25vZGVzKSk7Ci0KLQkJdWxpc3QtPm5vZGVzID0gbmV3X25vZGVzOwotCQl1bGlzdC0+bm9kZXNfYWxsb2NlZCA9IG5ld19hbGxvY2VkOwotCi0JCS8qCi0JCSAqIGtyZWFsbG9jIGFjdHVhbGx5IHVzZXMgbWVtY3B5LCB3aGljaCBkb2VzIG5vdCBjb3B5IHJiX25vZGUKLQkJICogcG9pbnRlcnMsIHNvIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLiAgT3RoZXJ3aXNlIHdlIG1heQotCQkgKiBiZSBiaXR0ZW4gYnkgY3Jhc2hlcy4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCB1bGlzdC0+bm5vZGVzOyBpKyspIHsKLQkJCXJldCA9IHVsaXN0X3JidHJlZV9pbnNlcnQodWxpc3QsICZ1bGlzdC0+bm9kZXNbaV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQl1bGlzdC0+bm9kZXNbdWxpc3QtPm5ub2Rlc10udmFsID0gdmFsOwotCXVsaXN0LT5ub2Rlc1t1bGlzdC0+bm5vZGVzXS5hdXggPSBhdXg7Ci0JcmV0ID0gdWxpc3RfcmJ0cmVlX2luc2VydCh1bGlzdCwgJnVsaXN0LT5ub2Rlc1t1bGlzdC0+bm5vZGVzXSk7Ci0JQlVHX09OKHJldCk7Ci0JKyt1bGlzdC0+bm5vZGVzOworCXJldCA9IHVsaXN0X3JidHJlZV9pbnNlcnQodWxpc3QsIG5vZGUpOworCUFTU0VSVCghcmV0KTsKKwlsaXN0X2FkZF90YWlsKCZub2RlLT5saXN0LCAmdWxpc3QtPm5vZGVzKTsKKwl1bGlzdC0+bm5vZGVzKys7CiAKIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0wodWxpc3RfYWRkKTsKIAogLyoqCiAgKiB1bGlzdF9uZXh0IC0gaXRlcmF0ZSB1bGlzdApAQCAtMjY4LDExICsyMjcsMjUgQEAKICAqLwogc3RydWN0IHVsaXN0X25vZGUgKnVsaXN0X25leHQoc3RydWN0IHVsaXN0ICp1bGlzdCwgc3RydWN0IHVsaXN0X2l0ZXJhdG9yICp1aXRlcikKIHsKLQlpZiAodWxpc3QtPm5ub2RlcyA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodWl0ZXItPmkgPCAwIHx8IHVpdGVyLT5pID49IHVsaXN0LT5ubm9kZXMpCi0JCXJldHVybiBOVUxMOworCXN0cnVjdCB1bGlzdF9ub2RlICpub2RlOwogCi0JcmV0dXJuICZ1bGlzdC0+bm9kZXNbdWl0ZXItPmkrK107CisJaWYgKGxpc3RfZW1wdHkoJnVsaXN0LT5ub2RlcykpCisJCXJldHVybiBOVUxMOworCWlmICh1aXRlci0+Y3VyX2xpc3QgJiYgdWl0ZXItPmN1cl9saXN0LT5uZXh0ID09ICZ1bGlzdC0+bm9kZXMpCisJCXJldHVybiBOVUxMOworCWlmICh1aXRlci0+Y3VyX2xpc3QpIHsKKwkJdWl0ZXItPmN1cl9saXN0ID0gdWl0ZXItPmN1cl9saXN0LT5uZXh0OworCX0gZWxzZSB7CisJCXVpdGVyLT5jdXJfbGlzdCA9IHVsaXN0LT5ub2Rlcy5uZXh0OworI2lmZGVmIENPTkZJR19CVFJGU19ERUJVRworCQl1aXRlci0+aSA9IDA7CisjZW5kaWYKKwl9CisJbm9kZSA9IGxpc3RfZW50cnkodWl0ZXItPmN1cl9saXN0LCBzdHJ1Y3QgdWxpc3Rfbm9kZSwgbGlzdCk7CisjaWZkZWYgQ09ORklHX0JUUkZTX0RFQlVHCisJQVNTRVJUKG5vZGUtPnNlcW51bSA9PSB1aXRlci0+aSk7CisJQVNTRVJUKHVpdGVyLT5pID49IDAgJiYgdWl0ZXItPmkgPCB1bGlzdC0+bm5vZGVzKTsKKwl1aXRlci0+aSsrOworI2VuZGlmCisJcmV0dXJuIG5vZGU7CiB9Ci1FWFBPUlRfU1lNQk9MKHVsaXN0X25leHQpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdWxpc3QuaCBiL2ZzL2J0cmZzL3VsaXN0LmgKaW5kZXggZmIzNjczMS4uN2Y3OGNiZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdWxpc3QuaAorKysgYi9mcy9idHJmcy91bGlzdC5oCkBAIC0xNywxOCArMTcsMTIgQEAKICAqIGVudW1lcmF0aW5nIGl0LgogICogSXQgaXMgcG9zc2libGUgdG8gc3RvcmUgYW4gYXV4aWxpYXJ5IHZhbHVlIGFsb25nIHdpdGggdGhlIGtleS4KICAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgcHJlbGltaW5hcnkgYW5kIGNhbiBwcm9iYWJseSBiZSBzcGVkIHVwCi0gKiBzaWduaWZpY2FudGx5LiBBIGZpcnN0IHN0ZXAgd291bGQgYmUgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbiBhbiByYnRyZWUKLSAqIGFzIHNvb24gYXMgVUxJU1RfU0laRSBpcyBleGNlZWRlZC4KICAqLwotCi0vKgotICogbnVtYmVyIG9mIGVsZW1lbnRzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGluc2lkZSBzdHJ1Y3QgdWxpc3QKLSAqLwotI2RlZmluZSBVTElTVF9TSVpFIDE2Ci0KIHN0cnVjdCB1bGlzdF9pdGVyYXRvciB7CisjaWZkZWYgQ09ORklHX0JUUkZTX0RFQlVHCiAJaW50IGk7CisjZW5kaWYKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJfbGlzdDsgIC8qIGhpbnQgdG8gc3RhcnQgc2VhcmNoICovCiB9OwogCiAvKgpAQCAtMzcsNiArMzEsMTIgQEAKIHN0cnVjdCB1bGlzdF9ub2RlIHsKIAl1NjQgdmFsOwkJLyogdmFsdWUgdG8gc3RvcmUgKi8KIAl1NjQgYXV4OwkJLyogYXV4aWxpYXJ5IHZhbHVlIHNhdmVkIGFsb25nIHdpdGggdGhlIHZhbCAqLworCisjaWZkZWYgQ09ORklHX0JUUkZTX0RFQlVHCisJaW50IHNlcW51bTsJCS8qIHNlcXVlbmNlIG51bWJlciB0aGlzIG5vZGUgaXMgYWRkZWQgKi8KKyNlbmRpZgorCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgLyogdXNlZCB0byBsaW5rIG5vZGUgKi8KIAlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOwkvKiB1c2VkIHRvIHNwZWVkIHVwIHNlYXJjaCAqLwogfTsKIApAQCAtNDYsMjggKzQ2LDExIEBACiAJICovCiAJdW5zaWduZWQgbG9uZyBubm9kZXM7CiAKLQkvKgotCSAqIG51bWJlciBvZiBub2RlcyB3ZSBhbHJlYWR5IGhhdmUgcm9vbSBmb3IKLQkgKi8KLQl1bnNpZ25lZCBsb25nIG5vZGVzX2FsbG9jZWQ7Ci0KLQkvKgotCSAqIHBvaW50ZXIgdG8gdGhlIGFycmF5IHN0b3JpbmcgdGhlIGVsZW1lbnRzLiBUaGUgZmlyc3QgVUxJU1RfU0laRQotCSAqIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW5saW5lLiBJbiB0aGlzIGNhc2UgdGhlIGl0IHBvaW50cyB0byBpbnRfbm9kZXMuCi0JICogQWZ0ZXIgZXhjZWVkaW5nIFVMSVNUX1NJWkUsIGR5bmFtaWMgbWVtb3J5IGlzIGFsbG9jYXRlZC4KLQkgKi8KLQlzdHJ1Y3QgdWxpc3Rfbm9kZSAqbm9kZXM7Ci0KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGVzOwogCXN0cnVjdCByYl9yb290IHJvb3Q7Ci0KLQkvKgotCSAqIGlubGluZSBzdG9yYWdlIHNwYWNlIGZvciB0aGUgZmlyc3QgVUxJU1RfU0laRSBlbnRyaWVzCi0JICovCi0Jc3RydWN0IHVsaXN0X25vZGUgaW50X25vZGVzW1VMSVNUX1NJWkVdOwogfTsKIAogdm9pZCB1bGlzdF9pbml0KHN0cnVjdCB1bGlzdCAqdWxpc3QpOwotdm9pZCB1bGlzdF9maW5pKHN0cnVjdCB1bGlzdCAqdWxpc3QpOwogdm9pZCB1bGlzdF9yZWluaXQoc3RydWN0IHVsaXN0ICp1bGlzdCk7CiBzdHJ1Y3QgdWxpc3QgKnVsaXN0X2FsbG9jKGdmcF90IGdmcF9tYXNrKTsKIHZvaWQgdWxpc3RfZnJlZShzdHJ1Y3QgdWxpc3QgKnVsaXN0KTsKQEAgLTc3LDYgKzYwLDYgQEAKIHN0cnVjdCB1bGlzdF9ub2RlICp1bGlzdF9uZXh0KHN0cnVjdCB1bGlzdCAqdWxpc3QsCiAJCQkgICAgICBzdHJ1Y3QgdWxpc3RfaXRlcmF0b3IgKnVpdGVyKTsKIAotI2RlZmluZSBVTElTVF9JVEVSX0lOSVQodWl0ZXIpICgodWl0ZXIpLT5pID0gMCkKKyNkZWZpbmUgVUxJU1RfSVRFUl9JTklUKHVpdGVyKSAoKHVpdGVyKS0+Y3VyX2xpc3QgPSBOVUxMKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3V1aWQtdHJlZS5jIGIvZnMvYnRyZnMvdXVpZC10cmVlLmMKaW5kZXggZmJkYTkwMC4uZjZhNGMwMyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdXVpZC10cmVlLmMKKysrIGIvZnMvYnRyZnMvdXVpZC10cmVlLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlyZXQgPSAtRU5PRU5UOwogCiAJaWYgKCFJU19BTElHTkVEKGl0ZW1fc2l6ZSwgc2l6ZW9mKHU2NCkpKSB7Ci0JCXByX3dhcm4oImJ0cmZzOiB1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1IVxuIiwKKwkJYnRyZnNfd2Fybih1dWlkX3Jvb3QtPmZzX2luZm8sICJ1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1ISIsCiAJCQkodW5zaWduZWQgbG9uZylpdGVtX3NpemUpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzcsNyArMTM3LDggQEAKIAkJb2Zmc2V0ID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGViLCBzbG90KTsKIAkJb2Zmc2V0ICs9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgc2xvdCkgLSBzaXplb2Yoc3ViaWRfbGUpOwogCX0gZWxzZSBpZiAocmV0IDwgMCkgewotCQlwcl93YXJuKCJidHJmczogaW5zZXJ0IHV1aWQgaXRlbSBmYWlsZWQgJWQgKDB4JTAxNmxseCwgMHglMDE2bGx4KSB0eXBlICV1IVxuIiwKKwkJYnRyZnNfd2Fybih1dWlkX3Jvb3QtPmZzX2luZm8sICJpbnNlcnQgdXVpZCBpdGVtIGZhaWxlZCAlZCAiCisJCQkiKDB4JTAxNmxseCwgMHglMDE2bGx4KSB0eXBlICV1ISIsCiAJCQlyZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpa2V5Lm9iamVjdGlkLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylrZXkub2Zmc2V0LCB0eXBlKTsKIAkJZ290byBvdXQ7CkBAIC0xODMsNyArMTg0LDcgQEAKIAogCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCB1dWlkX3Jvb3QsICZrZXksIHBhdGgsIC0xLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl93YXJuKCJidHJmczogZXJyb3IgJWQgd2hpbGUgc2VhcmNoaW5nIGZvciB1dWlkIGl0ZW0hXG4iLAorCQlidHJmc193YXJuKHV1aWRfcm9vdC0+ZnNfaW5mbywgImVycm9yICVkIHdoaWxlIHNlYXJjaGluZyBmb3IgdXVpZCBpdGVtISIsCiAJCQlyZXQpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xOTcsNyArMTk4LDcgQEAKIAlvZmZzZXQgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQoZWIsIHNsb3QpOwogCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgc2xvdCk7CiAJaWYgKCFJU19BTElHTkVEKGl0ZW1fc2l6ZSwgc2l6ZW9mKHU2NCkpKSB7Ci0JCXByX3dhcm4oImJ0cmZzOiB1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1IVxuIiwKKwkJYnRyZnNfd2Fybih1dWlkX3Jvb3QtPmZzX2luZm8sICJ1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1ISIsCiAJCQkodW5zaWduZWQgbG9uZylpdGVtX3NpemUpOwogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKQEAgLTI5OSw3ICszMDAsNyBAQAogCQlvZmZzZXQgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgc2xvdCk7CiAJCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KTsKIAkJaWYgKCFJU19BTElHTkVEKGl0ZW1fc2l6ZSwgc2l6ZW9mKHU2NCkpKSB7Ci0JCQlwcl93YXJuKCJidHJmczogdXVpZCBpdGVtIHdpdGggaWxsZWdhbCBzaXplICVsdSFcbiIsCisJCQlidHJmc193YXJuKGZzX2luZm8sICJ1dWlkIGl0ZW0gd2l0aCBpbGxlZ2FsIHNpemUgJWx1ISIsCiAJCQkJKHVuc2lnbmVkIGxvbmcpaXRlbV9zaXplKTsKIAkJCWdvdG8gc2tpcDsKIAkJfQpAQCAtMzQ5LDYgKzM1MCw2IEBACiBvdXQ6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCWlmIChyZXQpCi0JCXByX3dhcm4oImJ0cmZzOiBidHJmc191dWlkX3RyZWVfaXRlcmF0ZSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCWJ0cmZzX3dhcm4oZnNfaW5mbywgImJ0cmZzX3V1aWRfdHJlZV9pdGVyYXRlIGZhaWxlZCAlZCIsIHJldCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggOTIzMDNmNC4uYmFiMGI4NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIAlyZXQgPSBrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYoYmRldi0+YmRfZGlzayktPmtvYmosIGFjdGlvbik7CiAJaWYgKHJldCkKLQkJcHJfd2FybigiU2VuZGluZyBldmVudCAnJWQnIHRvIGtvYmplY3Q6ICclcycgKCVwKTogZmFpbGVkXG4iLAorCQlwcl93YXJuKCJCVFJGUzogU2VuZGluZyBldmVudCAnJWQnIHRvIGtvYmplY3Q6ICclcycgKCVwKTogZmFpbGVkXG4iLAogCQkJYWN0aW9uLAogCQkJa29iamVjdF9uYW1lKCZkaXNrX3RvX2RldihiZGV2LT5iZF9kaXNrKS0+a29iaiksCiAJCQkmZGlza190b19kZXYoYmRldi0+YmRfZGlzayktPmtvYmopOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAlpZiAoSVNfRVJSKCpiZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKCpiZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IG9wZW4gJXMgZmFpbGVkXG4iLCBkZXZpY2VfcGF0aCk7CisJCXByaW50ayhLRVJOX0lORk8gIkJUUkZTOiBvcGVuICVzIGZhaWxlZFxuIiwgZGV2aWNlX3BhdGgpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtOTEyLDkgKzkxMiw5IEBACiAJaWYgKGRpc2tfc3VwZXItPmxhYmVsWzBdKSB7CiAJCWlmIChkaXNrX3N1cGVyLT5sYWJlbFtCVFJGU19MQUJFTF9TSVpFIC0gMV0pCiAJCQlkaXNrX3N1cGVyLT5sYWJlbFtCVFJGU19MQUJFTF9TSVpFIC0gMV0gPSAnXDAnOwotCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogZGV2aWNlIGxhYmVsICVzICIsIGRpc2tfc3VwZXItPmxhYmVsKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQlRSRlM6IGRldmljZSBsYWJlbCAlcyAiLCBkaXNrX3N1cGVyLT5sYWJlbCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGRldmljZSBmc2lkICVwVSAiLCBkaXNrX3N1cGVyLT5mc2lkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQlRSRlM6IGRldmljZSBmc2lkICVwVSAiLCBkaXNrX3N1cGVyLT5mc2lkKTsKIAl9CiAKIAlwcmludGsoS0VSTl9DT05UICJkZXZpZCAlbGx1IHRyYW5zaWQgJWxsdSAlc1xuIiwgZGV2aWQsIHRyYW5zaWQsIHBhdGgpOwpAQCAtMTgxMyw3ICsxODEzLDcgQEAKIAkJfQogCiAJCWlmICghKmRldmljZSkgewotCQkJcHJfZXJyKCJidHJmczogbm8gbWlzc2luZyBkZXZpY2UgZm91bmRcbiIpOworCQkJYnRyZnNfZXJyKHJvb3QtPmZzX2luZm8sICJubyBtaXNzaW5nIGRldmljZSBmb3VuZCIpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIApAQCAtMzA1Miw3ICszMDUyLDcgQEAKIGVycm9yOgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAlpZiAoZW5vc3BjX2Vycm9ycykgewotCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogJWQgZW5vc3BjIGVycm9ycyBkdXJpbmcgYmFsYW5jZVxuIiwKKwkJYnRyZnNfaW5mbyhmc19pbmZvLCAiJWQgZW5vc3BjIGVycm9ycyBkdXJpbmcgYmFsYW5jZSIsCiAJCSAgICAgICBlbm9zcGNfZXJyb3JzKTsKIAkJaWYgKCFyZXQpCiAJCQlyZXQgPSAtRU5PU1BDOwpAQCAtMzEzOCw4ICszMTM4LDggQEAKIAkJaWYgKCEoYmN0bC0+ZmxhZ3MgJiBCVFJGU19CQUxBTkNFX0RBVEEpIHx8CiAJCSAgICAhKGJjdGwtPmZsYWdzICYgQlRSRlNfQkFMQU5DRV9NRVRBREFUQSkgfHwKIAkJICAgIG1lbWNtcCgmYmN0bC0+ZGF0YSwgJmJjdGwtPm1ldGEsIHNpemVvZihiY3RsLT5kYXRhKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IHdpdGggbWl4ZWQgZ3JvdXBzIGRhdGEgYW5kICIKLQkJCSAgICAgICAibWV0YWRhdGEgYmFsYW5jZSBvcHRpb25zIG11c3QgYmUgdGhlIHNhbWVcbiIpOworCQkJYnRyZnNfZXJyKGZzX2luZm8sICJ3aXRoIG1peGVkIGdyb3VwcyBkYXRhIGFuZCAiCisJCQkJICAgIm1ldGFkYXRhIGJhbGFuY2Ugb3B0aW9ucyBtdXN0IGJlIHRoZSBzYW1lIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTMxNjUsOCArMzE2NSw4IEBACiAJaWYgKChiY3RsLT5kYXRhLmZsYWdzICYgQlRSRlNfQkFMQU5DRV9BUkdTX0NPTlZFUlQpICYmCiAJICAgICghYWxsb2NfcHJvZmlsZV9pc192YWxpZChiY3RsLT5kYXRhLnRhcmdldCwgMSkgfHwKIAkgICAgIChiY3RsLT5kYXRhLnRhcmdldCAmIH5hbGxvd2VkKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIHN0YXJ0IGJhbGFuY2Ugd2l0aCB0YXJnZXQgIgotCQkgICAgICAgImRhdGEgcHJvZmlsZSAlbGx1XG4iLAorCQlidHJmc19lcnIoZnNfaW5mbywgInVuYWJsZSB0byBzdGFydCBiYWxhbmNlIHdpdGggdGFyZ2V0ICIKKwkJCSAgICJkYXRhIHByb2ZpbGUgJWxsdSIsCiAJCSAgICAgICBiY3RsLT5kYXRhLnRhcmdldCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMzE3NCw4ICszMTc0LDggQEAKIAlpZiAoKGJjdGwtPm1ldGEuZmxhZ3MgJiBCVFJGU19CQUxBTkNFX0FSR1NfQ09OVkVSVCkgJiYKIAkgICAgKCFhbGxvY19wcm9maWxlX2lzX3ZhbGlkKGJjdGwtPm1ldGEudGFyZ2V0LCAxKSB8fAogCSAgICAgKGJjdGwtPm1ldGEudGFyZ2V0ICYgfmFsbG93ZWQpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiB1bmFibGUgdG8gc3RhcnQgYmFsYW5jZSB3aXRoIHRhcmdldCAiCi0JCSAgICAgICAibWV0YWRhdGEgcHJvZmlsZSAlbGx1XG4iLAorCQlidHJmc19lcnIoZnNfaW5mbywKKwkJCSAgICJ1bmFibGUgdG8gc3RhcnQgYmFsYW5jZSB3aXRoIHRhcmdldCBtZXRhZGF0YSBwcm9maWxlICVsbHUiLAogCQkgICAgICAgYmN0bC0+bWV0YS50YXJnZXQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTMxODMsOCArMzE4Myw4IEBACiAJaWYgKChiY3RsLT5zeXMuZmxhZ3MgJiBCVFJGU19CQUxBTkNFX0FSR1NfQ09OVkVSVCkgJiYKIAkgICAgKCFhbGxvY19wcm9maWxlX2lzX3ZhbGlkKGJjdGwtPnN5cy50YXJnZXQsIDEpIHx8CiAJICAgICAoYmN0bC0+c3lzLnRhcmdldCAmIH5hbGxvd2VkKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIHN0YXJ0IGJhbGFuY2Ugd2l0aCB0YXJnZXQgIgotCQkgICAgICAgInN5c3RlbSBwcm9maWxlICVsbHVcbiIsCisJCWJ0cmZzX2Vycihmc19pbmZvLAorCQkJICAgInVuYWJsZSB0byBzdGFydCBiYWxhbmNlIHdpdGggdGFyZ2V0IHN5c3RlbSBwcm9maWxlICVsbHUiLAogCQkgICAgICAgYmN0bC0+c3lzLnRhcmdldCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMzE5Myw3ICszMTkzLDcgQEAKIAkvKiBhbGxvdyBkdXAnZWQgZGF0YSBjaHVua3Mgb25seSBpbiBtaXhlZCBtb2RlICovCiAJaWYgKCFtaXhlZCAmJiAoYmN0bC0+ZGF0YS5mbGFncyAmIEJUUkZTX0JBTEFOQ0VfQVJHU19DT05WRVJUKSAmJgogCSAgICAoYmN0bC0+ZGF0YS50YXJnZXQgJiBCVFJGU19CTE9DS19HUk9VUF9EVVApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGR1cCBmb3IgZGF0YSBpcyBub3QgYWxsb3dlZFxuIik7CisJCWJ0cmZzX2Vycihmc19pbmZvLCAiZHVwIGZvciBkYXRhIGlzIG5vdCBhbGxvd2VkIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMyMTMsMTEgKzMyMTMsMTAgQEAKIAkJICAgICAoZnNfaW5mby0+YXZhaWxfbWV0YWRhdGFfYWxsb2NfYml0cyAmIGFsbG93ZWQpICYmCiAJCSAgICAgIShiY3RsLT5tZXRhLnRhcmdldCAmIGFsbG93ZWQpKSkgewogCQkJaWYgKGJjdGwtPmZsYWdzICYgQlRSRlNfQkFMQU5DRV9GT1JDRSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBmb3JjZSByZWR1Y2luZyBtZXRhZGF0YSAiCi0JCQkJICAgICAgICJpbnRlZ3JpdHlcbiIpOworCQkJCWJ0cmZzX2luZm8oZnNfaW5mbywgImZvcmNlIHJlZHVjaW5nIG1ldGFkYXRhIGludGVncml0eSIpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBiYWxhbmNlIHdpbGwgcmVkdWNlIG1ldGFkYXRhICIKLQkJCQkgICAgICAgImludGVncml0eSwgdXNlIGZvcmNlIGlmIHlvdSB3YW50IHRoaXNcbiIpOworCQkJCWJ0cmZzX2Vycihmc19pbmZvLCAiYmFsYW5jZSB3aWxsIHJlZHVjZSBtZXRhZGF0YSAiCisJCQkJCSAgICJpbnRlZ3JpdHksIHVzZSBmb3JjZSBpZiB5b3Ugd2FudCB0aGlzIik7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTMzMDMsNyArMzMwMiw3IEBACiAJbXV0ZXhfbG9jaygmZnNfaW5mby0+YmFsYW5jZV9tdXRleCk7CiAKIAlpZiAoZnNfaW5mby0+YmFsYW5jZV9jdGwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGNvbnRpbnVpbmcgYmFsYW5jZVxuIik7CisJCWJ0cmZzX2luZm8oZnNfaW5mbywgImNvbnRpbnVpbmcgYmFsYW5jZSIpOwogCQlyZXQgPSBidHJmc19iYWxhbmNlKGZzX2luZm8tPmJhbGFuY2VfY3RsLCBOVUxMKTsKIAl9CiAKQEAgLTMzMjUsNyArMzMyNCw3IEBACiAJc3Bpbl91bmxvY2soJmZzX2luZm8tPmJhbGFuY2VfbG9jayk7CiAKIAlpZiAoYnRyZnNfdGVzdF9vcHQoZnNfaW5mby0+dHJlZV9yb290LCBTS0lQX0JBTEFOQ0UpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBmb3JjZSBza2lwcGluZyBiYWxhbmNlXG4iKTsKKwkJYnRyZnNfaW5mbyhmc19pbmZvLCAiZm9yY2Ugc2tpcHBpbmcgYmFsYW5jZSIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM1NDMsNyArMzU0Miw3IEBACiAJCQkJCQkgIEJUUkZTX1VVSURfS0VZX1NVQlZPTCwKIAkJCQkJCSAga2V5Lm9iamVjdGlkKTsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJfd2FybigiYnRyZnM6IHV1aWRfdHJlZV9hZGQgZmFpbGVkICVkXG4iLAorCQkJCWJ0cmZzX3dhcm4oZnNfaW5mbywgInV1aWRfdHJlZV9hZGQgZmFpbGVkICVkIiwKIAkJCQkJcmV0KTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTM1NTUsNyArMzU1NCw3IEBACiAJCQkJCQkgQlRSRlNfVVVJRF9LRVlfUkVDRUlWRURfU1VCVk9MLAogCQkJCQkJICBrZXkub2JqZWN0aWQpOwogCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl93YXJuKCJidHJmczogdXVpZF90cmVlX2FkZCBmYWlsZWQgJWRcbiIsCisJCQkJYnRyZnNfd2Fybihmc19pbmZvLCAidXVpZF90cmVlX2FkZCBmYWlsZWQgJWQiLAogCQkJCQlyZXQpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMzU5MCw3ICszNTg5LDcgQEAKIAlpZiAodHJhbnMgJiYgIUlTX0VSUih0cmFucykpCiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgZnNfaW5mby0+dXVpZF9yb290KTsKIAlpZiAocmV0KQotCQlwcl93YXJuKCJidHJmczogYnRyZnNfdXVpZF9zY2FuX2t0aHJlYWQgZmFpbGVkICVkXG4iLCByZXQpOworCQlidHJmc193YXJuKGZzX2luZm8sICJidHJmc191dWlkX3NjYW5fa3RocmVhZCBmYWlsZWQgJWQiLCByZXQpOwogCWVsc2UKIAkJZnNfaW5mby0+dXBkYXRlX3V1aWRfdHJlZV9nZW4gPSAxOwogCXVwKCZmc19pbmZvLT51dWlkX3RyZWVfcmVzY2FuX3NlbSk7CkBAIC0zNjU0LDcgKzM2NTMsNyBAQAogCSAqLwogCXJldCA9IGJ0cmZzX3V1aWRfdHJlZV9pdGVyYXRlKGZzX2luZm8sIGJ0cmZzX2NoZWNrX3V1aWRfdHJlZV9lbnRyeSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfd2FybigiYnRyZnM6IGl0ZXJhdGluZyB1dWlkX3RyZWUgZmFpbGVkICVkXG4iLCByZXQpOworCQlidHJmc193YXJuKGZzX2luZm8sICJpdGVyYXRpbmcgdXVpZF90cmVlIGZhaWxlZCAlZCIsIHJldCk7CiAJCXVwKCZmc19pbmZvLT51dWlkX3RyZWVfcmVzY2FuX3NlbSk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMzY5NSw3ICszNjk0LDcgQEAKIAl0YXNrID0ga3RocmVhZF9ydW4oYnRyZnNfdXVpZF9zY2FuX2t0aHJlYWQsIGZzX2luZm8sICJidHJmcy11dWlkIik7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQkvKiBmc19pbmZvLT51cGRhdGVfdXVpZF90cmVlX2dlbiByZW1haW5zIDAgaW4gYWxsIGVycm9yIGNhc2UgKi8KLQkJcHJfd2FybigiYnRyZnM6IGZhaWxlZCB0byBzdGFydCB1dWlkX3NjYW4gdGFza1xuIik7CisJCWJ0cmZzX3dhcm4oZnNfaW5mbywgImZhaWxlZCB0byBzdGFydCB1dWlkX3NjYW4gdGFzayIpOwogCQl1cCgmZnNfaW5mby0+dXVpZF90cmVlX3Jlc2Nhbl9zZW0pOwogCQlyZXR1cm4gUFRSX0VSUih0YXNrKTsKIAl9CkBAIC0zNzExLDcgKzM3MTAsNyBAQAogCXRhc2sgPSBrdGhyZWFkX3J1bihidHJmc191dWlkX3Jlc2Nhbl9rdGhyZWFkLCBmc19pbmZvLCAiYnRyZnMtdXVpZCIpOwogCWlmIChJU19FUlIodGFzaykpIHsKIAkJLyogZnNfaW5mby0+dXBkYXRlX3V1aWRfdHJlZV9nZW4gcmVtYWlucyAwIGluIGFsbCBlcnJvciBjYXNlICovCi0JCXByX3dhcm4oImJ0cmZzOiBmYWlsZWQgdG8gc3RhcnQgdXVpZF9yZXNjYW4gdGFza1xuIik7CisJCWJ0cmZzX3dhcm4oZnNfaW5mbywgImZhaWxlZCB0byBzdGFydCB1dWlkX3Jlc2NhbiB0YXNrIik7CiAJCXVwKCZmc19pbmZvLT51dWlkX3RyZWVfcmVzY2FuX3NlbSk7CiAJCXJldHVybiBQVFJfRVJSKHRhc2spOwogCX0KQEAgLTQwMzMsNyArNDAzMiw3IEBACiAJCW1heF9zdHJpcGVfc2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CiAJCW1heF9jaHVua19zaXplID0gMiAqIG1heF9zdHJpcGVfc2l6ZTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBpbnZhbGlkIGNodW5rIHR5cGUgMHglbGx4IHJlcXVlc3RlZFxuIiwKKwkJYnRyZnNfZXJyKGluZm8sICJpbnZhbGlkIGNodW5rIHR5cGUgMHglbGx4IHJlcXVlc3RlZFxuIiwKIAkJICAgICAgIHR5cGUpOwogCQlCVUdfT04oMSk7CiAJfQpAQCAtNDA2NSw3ICs0MDY0LDcgQEAKIAogCQlpZiAoIWRldmljZS0+d3JpdGVhYmxlKSB7CiAJCQlXQVJOKDEsIEtFUk5fRVJSCi0JCQkgICAgICAgImJ0cmZzOiByZWFkLW9ubHkgZGV2aWNlIGluIGFsbG9jX2xpc3RcbiIpOworCQkJICAgICAgICJCVFJGUzogcmVhZC1vbmx5IGRldmljZSBpbiBhbGxvY19saXN0XG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTUxOTMsMTMgKzUxOTIsMTMgQEAKIAlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAlpZiAoIWVtKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGNvdWxkbid0IGZpbmQgZW0gZm9yIGNodW5rICVMdVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogY291bGRuJ3QgZmluZCBlbSBmb3IgY2h1bmsgJUx1XG4iLAogCQkgICAgICAgY2h1bmtfc3RhcnQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAoZW0tPnN0YXJ0ICE9IGNodW5rX3N0YXJ0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGJhZCBjaHVuayBzdGFydCwgZW09JUx1LCB3YW50ZWQ9JUx1XG4iLAorCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBiYWQgY2h1bmsgc3RhcnQsIGVtPSVMdSwgd2FudGVkPSVMdVxuIiwKIAkJICAgICAgIGVtLT5zdGFydCwgY2h1bmtfc3RhcnQpOwogCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQlyZXR1cm4gLUVJTzsKQEAgLTUyOTgsNiArNTI5NywxMyBAQAogCQkJYmlvX3B1dChiaW8pOwogCQkJYmlvID0gYmJpby0+b3JpZ19iaW87CiAJCX0KKworIAkJLyoKKwkJICogV2UgaGF2ZSBvcmlnaW5hbCBiaW8gbm93LiBTbyBpbmNyZW1lbnQgYmlfcmVtYWluaW5nIHRvCisJCSAqIGFjY291bnQgZm9yIGl0IGluIGVuZGlvCisJCSAqLworCQlhdG9taWNfaW5jKCZiaW8tPmJpX3JlbWFpbmluZyk7CisKIAkJYmlvLT5iaV9wcml2YXRlID0gYmJpby0+cHJpdmF0ZTsKIAkJYmlvLT5iaV9lbmRfaW8gPSBiYmlvLT5lbmRfaW87CiAJCWJ0cmZzX2lvX2JpbyhiaW8pLT5taXJyb3JfbnVtID0gYmJpby0+bWlycm9yX251bTsKQEAgLTU0MTEsNyArNTQxNyw3IEBACiAJaWYgKCFxLT5tZXJnZV9idmVjX2ZuKQogCQlyZXR1cm4gMTsKIAotCWJ2bS5iaV9zaXplID0gYmlvLT5iaV9zaXplIC0gcHJldi0+YnZfbGVuOworCWJ2bS5iaV9zaXplID0gYmlvLT5iaV9pdGVyLmJpX3NpemUgLSBwcmV2LT5idl9sZW47CiAJaWYgKHEtPm1lcmdlX2J2ZWNfZm4ocSwgJmJ2bSwgcHJldikgPCBwcmV2LT5idl9sZW4pCiAJCXJldHVybiAwOwogCXJldHVybiAxOwpAQCAtNTQyNiw3ICs1NDMyLDcgQEAKIAliaW8tPmJpX3ByaXZhdGUgPSBiYmlvOwogCWJ0cmZzX2lvX2JpbyhiaW8pLT5zdHJpcGVfaW5kZXggPSBkZXZfbnI7CiAJYmlvLT5iaV9lbmRfaW8gPSBidHJmc19lbmRfYmlvOwotCWJpby0+Ymlfc2VjdG9yID0gcGh5c2ljYWwgPj4gOTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gcGh5c2ljYWwgPj4gOTsKICNpZmRlZiBERUJVRwogCXsKIAkJc3RydWN0IHJjdV9zdHJpbmcgKm5hbWU7CkBAIC01NDY0LDcgKzU0NzAsNyBAQAogCXdoaWxlIChidmVjIDw9IChmaXJzdF9iaW8tPmJpX2lvX3ZlYyArIGZpcnN0X2Jpby0+YmlfdmNudCAtIDEpKSB7CiAJCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBidmVjLT5idl9wYWdlLCBidmVjLT5idl9sZW4sCiAJCQkJIGJ2ZWMtPmJ2X29mZnNldCkgPCBidmVjLT5idl9sZW4pIHsKLQkJCXU2NCBsZW4gPSBiaW8tPmJpX3NpemU7CisJCQl1NjQgbGVuID0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAKIAkJCWF0b21pY19pbmMoJmJiaW8tPnN0cmlwZXNfcGVuZGluZyk7CiAJCQlzdWJtaXRfc3RyaXBlX2Jpbyhyb290LCBiYmlvLCBiaW8sIHBoeXNpY2FsLCBkZXZfbnIsCkBAIC01NDg2LDcgKzU0OTIsNyBAQAogCQliaW8tPmJpX3ByaXZhdGUgPSBiYmlvLT5wcml2YXRlOwogCQliaW8tPmJpX2VuZF9pbyA9IGJiaW8tPmVuZF9pbzsKIAkJYnRyZnNfaW9fYmlvKGJpbyktPm1pcnJvcl9udW0gPSBiYmlvLT5taXJyb3JfbnVtOwotCQliaW8tPmJpX3NlY3RvciA9IGxvZ2ljYWwgPj4gOTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGxvZ2ljYWwgPj4gOTsKIAkJa2ZyZWUoYmJpbyk7CiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCX0KQEAgLTU0OTcsNyArNTUwMyw3IEBACiB7CiAJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2OwogCXN0cnVjdCBiaW8gKmZpcnN0X2JpbyA9IGJpbzsKLQl1NjQgbG9naWNhbCA9ICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwl1NjQgbG9naWNhbCA9ICh1NjQpYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA8PCA5OwogCXU2NCBsZW5ndGggPSAwOwogCXU2NCBtYXBfbGVuZ3RoOwogCXU2NCAqcmFpZF9tYXAgPSBOVUxMOwpAQCAtNTUwNiw3ICs1NTEyLDcgQEAKIAlpbnQgdG90YWxfZGV2cyA9IDE7CiAJc3RydWN0IGJ0cmZzX2JpbyAqYmJpbyA9IE5VTEw7CiAKLQlsZW5ndGggPSBiaW8tPmJpX3NpemU7CisJbGVuZ3RoID0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJbWFwX2xlbmd0aCA9IGxlbmd0aDsKIAogCXJldCA9IF9fYnRyZnNfbWFwX2Jsb2NrKHJvb3QtPmZzX2luZm8sIHJ3LCBsb2dpY2FsLCAmbWFwX2xlbmd0aCwgJmJiaW8sCkBAIC02MTIzLDcgKzYxMjksOCBAQAogCUJVR19PTighcGF0aCk7CiAJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIGRldl9yb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrX2luX3JjdShLRVJOX1dBUk5JTkcgImJ0cmZzOiBlcnJvciAlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGRldl9zdGF0cyBpdGVtIGZvciBkZXZpY2UgJXMhXG4iLAorCQlwcmludGtfaW5fcmN1KEtFUk5fV0FSTklORyAiQlRSRlM6ICIKKwkJCSJlcnJvciAlZCB3aGlsZSBzZWFyY2hpbmcgZm9yIGRldl9zdGF0cyBpdGVtIGZvciBkZXZpY2UgJXMhXG4iLAogCQkJICAgICAgcmV0LCByY3Vfc3RyX2RlcmVmKGRldmljZS0+bmFtZSkpOwogCQlnb3RvIG91dDsKIAl9CkBAIC02MTMzLDcgKzYxNDAsOCBAQAogCQkvKiBuZWVkIHRvIGRlbGV0ZSBvbGQgb25lIGFuZCBpbnNlcnQgYSBuZXcgb25lICovCiAJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCBkZXZfcm9vdCwgcGF0aCk7CiAJCWlmIChyZXQgIT0gMCkgewotCQkJcHJpbnRrX2luX3JjdShLRVJOX1dBUk5JTkcgImJ0cmZzOiBkZWxldGUgdG9vIHNtYWxsIGRldl9zdGF0cyBpdGVtIGZvciBkZXZpY2UgJXMgZmFpbGVkICVkIVxuIiwKKwkJCXByaW50a19pbl9yY3UoS0VSTl9XQVJOSU5HICJCVFJGUzogIgorCQkJCSJkZWxldGUgdG9vIHNtYWxsIGRldl9zdGF0cyBpdGVtIGZvciBkZXZpY2UgJXMgZmFpbGVkICVkIVxuIiwKIAkJCQkgICAgICByY3Vfc3RyX2RlcmVmKGRldmljZS0+bmFtZSksIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNjE0Niw3ICs2MTU0LDggQEAKIAkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIGRldl9yb290LCBwYXRoLAogCQkJCQkgICAgICAma2V5LCBzaXplb2YoKnB0cikpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrX2luX3JjdShLRVJOX1dBUk5JTkcgImJ0cmZzOiBpbnNlcnQgZGV2X3N0YXRzIGl0ZW0gZm9yIGRldmljZSAlcyBmYWlsZWQgJWQhXG4iLAorCQkJcHJpbnRrX2luX3JjdShLRVJOX1dBUk5JTkcgIkJUUkZTOiAiCisJCQkJCSAgImluc2VydCBkZXZfc3RhdHMgaXRlbSBmb3IgZGV2aWNlICVzIGZhaWxlZCAlZCFcbiIsCiAJCQkJICAgICAgcmN1X3N0cl9kZXJlZihkZXZpY2UtPm5hbWUpLCByZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTYxOTksMTYgKzYyMDgsMTQgQEAKIHsKIAlpZiAoIWRldi0+ZGV2X3N0YXRzX3ZhbGlkKQogCQlyZXR1cm47Ci0JcHJpbnRrX3JhdGVsaW1pdGVkX2luX3JjdShLRVJOX0VSUgotCQkJICAgImJ0cmZzOiBiZGV2ICVzIGVycnM6IHdyICV1LCByZCAldSwgZmx1c2ggJXUsIGNvcnJ1cHQgJXUsIGdlbiAldVxuIiwKKwlwcmludGtfcmF0ZWxpbWl0ZWRfaW5fcmN1KEtFUk5fRVJSICJCVFJGUzogIgorCQkJICAgImJkZXYgJXMgZXJyczogd3IgJXUsIHJkICV1LCBmbHVzaCAldSwgY29ycnVwdCAldSwgZ2VuICV1XG4iLAogCQkJICAgcmN1X3N0cl9kZXJlZihkZXYtPm5hbWUpLAogCQkJICAgYnRyZnNfZGV2X3N0YXRfcmVhZChkZXYsIEJUUkZTX0RFVl9TVEFUX1dSSVRFX0VSUlMpLAogCQkJICAgYnRyZnNfZGV2X3N0YXRfcmVhZChkZXYsIEJUUkZTX0RFVl9TVEFUX1JFQURfRVJSUyksCiAJCQkgICBidHJmc19kZXZfc3RhdF9yZWFkKGRldiwgQlRSRlNfREVWX1NUQVRfRkxVU0hfRVJSUyksCi0JCQkgICBidHJmc19kZXZfc3RhdF9yZWFkKGRldiwKLQkJCQkJICAgICAgIEJUUkZTX0RFVl9TVEFUX0NPUlJVUFRJT05fRVJSUyksCi0JCQkgICBidHJmc19kZXZfc3RhdF9yZWFkKGRldiwKLQkJCQkJICAgICAgIEJUUkZTX0RFVl9TVEFUX0dFTkVSQVRJT05fRVJSUykpOworCQkJICAgYnRyZnNfZGV2X3N0YXRfcmVhZChkZXYsIEJUUkZTX0RFVl9TVEFUX0NPUlJVUFRJT05fRVJSUyksCisJCQkgICBidHJmc19kZXZfc3RhdF9yZWFkKGRldiwgQlRSRlNfREVWX1NUQVRfR0VORVJBVElPTl9FUlJTKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0cmZzX2Rldl9zdGF0X3ByaW50X29uX2xvYWQoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2KQpAQCAtNjIyMSw3ICs2MjI4LDggQEAKIAlpZiAoaSA9PSBCVFJGU19ERVZfU1RBVF9WQUxVRVNfTUFYKQogCQlyZXR1cm47IC8qIGFsbCB2YWx1ZXMgPT0gMCwgc3VwcHJlc3MgbWVzc2FnZSAqLwogCi0JcHJpbnRrX2luX3JjdShLRVJOX0lORk8gImJ0cmZzOiBiZGV2ICVzIGVycnM6IHdyICV1LCByZCAldSwgZmx1c2ggJXUsIGNvcnJ1cHQgJXUsIGdlbiAldVxuIiwKKwlwcmludGtfaW5fcmN1KEtFUk5fSU5GTyAiQlRSRlM6ICIKKwkJICAgImJkZXYgJXMgZXJyczogd3IgJXUsIHJkICV1LCBmbHVzaCAldSwgY29ycnVwdCAldSwgZ2VuICV1XG4iLAogCSAgICAgICByY3Vfc3RyX2RlcmVmKGRldi0+bmFtZSksCiAJICAgICAgIGJ0cmZzX2Rldl9zdGF0X3JlYWQoZGV2LCBCVFJGU19ERVZfU1RBVF9XUklURV9FUlJTKSwKIAkgICAgICAgYnRyZnNfZGV2X3N0YXRfcmVhZChkZXYsIEJUUkZTX0RFVl9TVEFUX1JFQURfRVJSUyksCkBAIC02MjQyLDEyICs2MjUwLDEwIEBACiAJbXV0ZXhfdW5sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAKIAlpZiAoIWRldikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiYnRyZnM6IGdldCBkZXZfc3RhdHMgZmFpbGVkLCBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKwkJYnRyZnNfd2Fybihyb290LT5mc19pbmZvLCAiZ2V0IGRldl9zdGF0cyBmYWlsZWQsIGRldmljZSBub3QgZm91bmQiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfSBlbHNlIGlmICghZGV2LT5kZXZfc3RhdHNfdmFsaWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImJ0cmZzOiBnZXQgZGV2X3N0YXRzIGZhaWxlZCwgbm90IHlldCB2YWxpZFxuIik7CisJCWJ0cmZzX3dhcm4ocm9vdC0+ZnNfaW5mbywgImdldCBkZXZfc3RhdHMgZmFpbGVkLCBub3QgeWV0IHZhbGlkIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSBpZiAoc3RhdHMtPmZsYWdzICYgQlRSRlNfREVWX1NUQVRTX1JFU0VUKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBCVFJGU19ERVZfU1RBVF9WQUxVRVNfTUFYOyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3hhdHRyLmMgYi9mcy9idHJmcy94YXR0ci5jCmluZGV4IDNkMWMzMDEuLmFkODMyOGQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3hhdHRyLmMKKysrIGIvZnMvYnRyZnMveGF0dHIuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAicHJvcHMuaCIKIAogCiBzc2l6ZV90IF9fYnRyZnNfZ2V0eGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTMzMiw3ICszMzMsOCBAQAogCQkJWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgfHwKIAkgICAgICAgIXN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pIHx8CiAJICAgICAgICFzdHJuY21wKG5hbWUsIFhBVFRSX1RSVVNURURfUFJFRklYLCBYQVRUUl9UUlVTVEVEX1BSRUZJWF9MRU4pIHx8Ci0JICAgICAgICFzdHJuY21wKG5hbWUsIFhBVFRSX1VTRVJfUFJFRklYLCBYQVRUUl9VU0VSX1BSRUZJWF9MRU4pOworCSAgICAgICAhc3RybmNtcChuYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSB8fAorCQkhc3RybmNtcChuYW1lLCBYQVRUUl9CVFJGU19QUkVGSVgsIFhBVFRSX0JUUkZTX1BSRUZJWF9MRU4pOwogfQogCiBzc2l6ZV90IGJ0cmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTM3NCw2ICszNzYsMTAgQEAKIAlpZiAoIWJ0cmZzX2lzX3ZhbGlkX3hhdHRyKG5hbWUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfQlRSRlNfUFJFRklYLCBYQVRUUl9CVFJGU19QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIGJ0cmZzX3NldF9wcm9wKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwKKwkJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCiAJaWYgKHNpemUgPT0gMCkKIAkJdmFsdWUgPSAiIjsgIC8qIGVtcHR5IEVBLCBkbyBub3QgcmVtb3ZlICovCiAKQEAgLTQwMyw2ICs0MDksMTAgQEAKIAlpZiAoIWJ0cmZzX2lzX3ZhbGlkX3hhdHRyKG5hbWUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfQlRSRlNfUFJFRklYLCBYQVRUUl9CVFJGU19QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIGJ0cmZzX3NldF9wcm9wKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwKKwkJCQkgICAgICBOVUxMLCAwLCBYQVRUUl9SRVBMQUNFKTsKKwogCXJldHVybiBfX2J0cmZzX3NldHhhdHRyKE5VTEwsIGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwKIAkJCQlYQVRUUl9SRVBMQUNFKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3psaWIuYyBiL2ZzL2J0cmZzL3psaWIuYwppbmRleCA5YWNiODQ2Li44ZTU3MTkxIDEwMDY0NAotLS0gYS9mcy9idHJmcy96bGliLmMKKysrIGIvZnMvYnRyZnMvemxpYi5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJKnRvdGFsX2luID0gMDsKIAogCWlmIChaX09LICE9IHpsaWJfZGVmbGF0ZUluaXQoJndvcmtzcGFjZS0+ZGVmX3N0cm0sIDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBkZWZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogZGVmbGF0ZUluaXQgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyNSw3ICsxMjUsNyBAQAogCXdoaWxlICh3b3Jrc3BhY2UtPmRlZl9zdHJtLnRvdGFsX2luIDwgbGVuKSB7CiAJCXJldCA9IHpsaWJfZGVmbGF0ZSgmd29ya3NwYWNlLT5kZWZfc3RybSwgWl9TWU5DX0ZMVVNIKTsKIAkJaWYgKHJldCAhPSBaX09LKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiYnRyZnM6IGRlZmxhdGUgaW4gbG9vcCByZXR1cm5lZCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJCVFJGUzogZGVmbGF0ZSBpbiBsb29wIHJldHVybmVkICVkXG4iLAogCQkJICAgICAgIHJldCk7CiAJCQl6bGliX2RlZmxhdGVFbmQoJndvcmtzcGFjZS0+ZGVmX3N0cm0pOwogCQkJcmV0ID0gLTE7CkBAIC0yNTIsNyArMjUyLDcgQEAKIAl9CiAKIAlpZiAoWl9PSyAhPSB6bGliX2luZmxhdGVJbml0Migmd29ya3NwYWNlLT5pbmZfc3RybSwgd2JpdHMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBpbmZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVFJGUzogaW5mbGF0ZUluaXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAl3aGlsZSAod29ya3NwYWNlLT5pbmZfc3RybS50b3RhbF9pbiA8IHNyY2xlbikgewpAQCAtMzM2LDcgKzMzNiw3IEBACiAJfQogCiAJaWYgKFpfT0sgIT0gemxpYl9pbmZsYXRlSW5pdDIoJndvcmtzcGFjZS0+aW5mX3N0cm0sIHdiaXRzKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmczogaW5mbGF0ZUluaXQgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlRSRlM6IGluZmxhdGVJbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggNjAyNDg3Ny4uMjcyNjVhOCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTY1NCwxNCArNjU0LDE2IEBACiBzdGF0aWMgdm9pZCBfX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlLAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IHdhcm4pCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwogCWlmIChwYWdlLT5tYXBwaW5nKSB7CS8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KIAkJV0FSTl9PTl9PTkNFKHdhcm4gJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJCWFjY291bnRfcGFnZV9kaXJ0aWVkKHBhZ2UsIG1hcHBpbmcpOwogCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKIAkJCQlwYWdlX2luZGV4KHBhZ2UpLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwogCV9fbWFya19pbm9kZV9kaXJ0eShtYXBwaW5nLT5ob3N0LCBJX0RJUlRZX1BBR0VTKTsKIH0KIApAQCAtMTMxMiw3ICsxMzE0LDcgQEAKIAkJfQogCQl3aGlsZSAob3V0IDwgQkhfTFJVX1NJWkUpCiAJCQliaHNbb3V0KytdID0gTlVMTDsKLQkJbWVtY3B5KF9fdGhpc19jcHVfcHRyKCZiaF9scnVzLmJocyksIGJocywgc2l6ZW9mKGJocykpOworCQltZW1jcHkodGhpc19jcHVfcHRyKCZiaF9scnVzLmJocyksIGJocywgc2l6ZW9mKGJocykpOwogCX0KIAliaF9scnVfdW5sb2NrKCk7CiAKQEAgLTI5ODIsMTEgKzI5ODQsMTEgQEAKIAkgKiBsZXQgaXQgdGhyb3VnaCwgYW5kIHRoZSBJTyBsYXllciB3aWxsIHR1cm4gaXQgaW50bwogCSAqIGFuIEVJTy4KIAkgKi8KLQlpZiAodW5saWtlbHkoYmlvLT5iaV9zZWN0b3IgPj0gbWF4c2VjdG9yKSkKKwlpZiAodW5saWtlbHkoYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA+PSBtYXhzZWN0b3IpKQogCQlyZXR1cm47CiAKLQltYXhzZWN0b3IgLT0gYmlvLT5iaV9zZWN0b3I7Ci0JYnl0ZXMgPSBiaW8tPmJpX3NpemU7CisJbWF4c2VjdG9yIC09IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJYnl0ZXMgPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAlpZiAobGlrZWx5KChieXRlcyA+PiA5KSA8PSBtYXhzZWN0b3IpKQogCQlyZXR1cm47CiAKQEAgLTI5OTQsNyArMjk5Niw3IEBACiAJYnl0ZXMgPSBtYXhzZWN0b3IgPDwgOTsKIAogCS8qIFRydW5jYXRlIHRoZSBiaW8uLiAqLwotCWJpby0+Ymlfc2l6ZSA9IGJ5dGVzOworCWJpby0+YmlfaXRlci5iaV9zaXplID0gYnl0ZXM7CiAJYmlvLT5iaV9pb192ZWNbMF0uYnZfbGVuID0gYnl0ZXM7CiAKIAkvKiAuLmFuZCBjbGVhciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgZm9yIHJlYWRzICovCkBAIC0zMDI5LDE0ICszMDMxLDE0IEBACiAJICovCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKIAotCWJpby0+Ymlfc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIChiaC0+Yl9zaXplID4+IDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CiAJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKIAliaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlID0gYmgtPmJfcGFnZTsKIAliaW8tPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBiaC0+Yl9zaXplOwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IGJoX29mZnNldChiaCk7CiAKIAliaW8tPmJpX3ZjbnQgPSAxOwotCWJpby0+Ymlfc2l6ZSA9IGJoLT5iX3NpemU7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBiaC0+Yl9zaXplOwogCiAJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX2JoX2lvX3N5bmM7CiAJYmlvLT5iaV9wcml2YXRlID0gYmg7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2FjbC5jIGIvZnMvY2VwaC9hY2wuYwppbmRleCBmNjkxMTI4Li40YzJkNDUyIDEwMDY0NAotLS0gYS9mcy9jZXBoL2FjbC5jCisrKyBiL2ZzL2NlcGgvYWNsLmMKQEAgLTY2LDEzICs2Niw2IEBACiAJY2hhciAqdmFsdWUgPSBOVUxMOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAotCWlmICghSVNfUE9TSVhBQ0woaW5vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWFjbCA9IGNlcGhfZ2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUpOwotCWlmIChhY2wgIT0gQUNMX05PVF9DQUNIRUQpCi0JCXJldHVybiBhY2w7Ci0KIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CkBAIC0xMDcsMTQgKzEwMCwxNCBAQAogCXJldHVybiBhY2w7CiB9CiAKLXN0YXRpYyBpbnQgY2VwaF9zZXRfYWNsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIGludCB0eXBlKQoraW50IGNlcGhfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIGludCB0eXBlKQogewogCWludCByZXQgPSAwLCBzaXplID0gMDsKIAljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKIAljaGFyICp2YWx1ZSA9IE5VTEw7CiAJc3RydWN0IGlhdHRyIG5ld2F0dHJzOwogCXVtb2RlX3QgbmV3X21vZGUgPSBpbm9kZS0+aV9tb2RlLCBvbGRfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCiAJaWYgKGFjbCkgewogCQlyZXQgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKQEAgLTE1OCwxMiArMTUxLDEzIEBACiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCWRlbnRyeSA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CiAJaWYgKG5ld19tb2RlICE9IG9sZF9tb2RlKSB7CiAJCW5ld2F0dHJzLmlhX21vZGUgPSBuZXdfbW9kZTsKIAkJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX01PREU7CiAJCXJldCA9IGNlcGhfc2V0YXR0cihkZW50cnksICZuZXdhdHRycyk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIG91dF9mcmVlOworCQkJZ290byBvdXRfZHB1dDsKIAl9CiAKIAlpZiAodmFsdWUpCkBAIC0xNzcsMTEgKzE3MSwxMyBAQAogCQkJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX01PREU7CiAJCQljZXBoX3NldGF0dHIoZGVudHJ5LCAmbmV3YXR0cnMpOwogCQl9Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0X2RwdXQ7CiAJfQogCiAJY2VwaF9zZXRfY2FjaGVkX2FjbChpbm9kZSwgdHlwZSwgYWNsKTsKIAorb3V0X2RwdXQ6CisJZHB1dChkZW50cnkpOwogb3V0X2ZyZWU6CiAJa2ZyZWUodmFsdWUpOwogb3V0OgpAQCAtMTkwLDQyICsxODYsMjQgQEAKIAogaW50IGNlcGhfaW5pdF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMOwotCWludCByZXQgPSAwOworCXN0cnVjdCBwb3NpeF9hY2wgKmRlZmF1bHRfYWNsLCAqYWNsOworCWludCBlcnJvcjsKIAotCWlmICghU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgewotCQlpZiAoSVNfUE9TSVhBQ0woZGlyKSkgewotCQkJYWNsID0gY2VwaF9nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7Ci0JCQlpZiAoSVNfRVJSKGFjbCkpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKGFjbCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KKwllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoZGlyLCAmaW5vZGUtPmlfbW9kZSwgJmRlZmF1bHRfYWNsLCAmYWNsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCQlpZiAoIWFjbCkKLQkJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKLQl9Ci0KLQlpZiAoSVNfUE9TSVhBQ0woZGlyKSAmJiBhY2wpIHsKLQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJCXJldCA9IGNlcGhfc2V0X2FjbChkZW50cnksIGlub2RlLCBhY2wsCi0JCQkJCQlBQ0xfVFlQRV9ERUZBVUxUKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXRfcmVsZWFzZTsKLQkJfQotCQlyZXQgPSBfX3Bvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQkJZWxzZSBpZiAocmV0ID4gMCkKLQkJCXJldCA9IGNlcGhfc2V0X2FjbChkZW50cnksIGlub2RlLCBhY2wsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JCWVsc2UKLQkJCWNhY2hlX25vX2FjbChpbm9kZSk7Ci0JfSBlbHNlIHsKKwlpZiAoIWRlZmF1bHRfYWNsICYmICFhY2wpCiAJCWNhY2hlX25vX2FjbChpbm9kZSk7Ci0JfQogCi1vdXRfcmVsZWFzZToKLQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotb3V0OgotCXJldHVybiByZXQ7CisJaWYgKGRlZmF1bHRfYWNsKSB7CisJCWVycm9yID0gY2VwaF9zZXRfYWNsKGlub2RlLCBkZWZhdWx0X2FjbCwgQUNMX1RZUEVfREVGQVVMVCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGRlZmF1bHRfYWNsKTsKKwl9CisJaWYgKGFjbCkgeworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBjZXBoX3NldF9hY2woaW5vZGUsIGFjbCwgQUNMX1RZUEVfQUNDRVNTKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwl9CisJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggNjE5NjE2ZC4uNmRhNGRmOCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC0xMzAzLDYgKzEzMDMsNyBAQAogCS5saXN0eGF0dHIgPSBjZXBoX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIgPSBjZXBoX3JlbW92ZXhhdHRyLAogCS5nZXRfYWNsID0gY2VwaF9nZXRfYWNsLAorCS5zZXRfYWNsID0gY2VwaF9zZXRfYWNsLAogCS5ta25vZCA9IGNlcGhfbWtub2QsCiAJLnN5bWxpbmsgPSBjZXBoX3N5bWxpbmssCiAJLm1rZGlyID0gY2VwaF9ta2RpciwKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW5vZGUuYyBiL2ZzL2NlcGgvaW5vZGUuYwppbmRleCA4YjhiNTA2Li4zMmQ1MTlkIDEwMDY0NAotLS0gYS9mcy9jZXBoL2lub2RlLmMKKysrIGIvZnMvY2VwaC9pbm9kZS5jCkBAIC05Nyw2ICs5Nyw3IEBACiAJLmxpc3R4YXR0ciA9IGNlcGhfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGNlcGhfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wgPSBjZXBoX2dldF9hY2wsCisJLnNldF9hY2wgPSBjZXBoX3NldF9hY2wsCiB9OwogCiAKQEAgLTE2MTYsNiArMTYxNyw3IEBACiAJLmxpc3R4YXR0ciA9IGNlcGhfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGNlcGhfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wgPSBjZXBoX2dldF9hY2wsCisJLnNldF9hY2wgPSBjZXBoX3NldF9hY2wsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zdXBlci5oIGIvZnMvY2VwaC9zdXBlci5oCmluZGV4IDM0NTkzMzkuLjE5NzkzYjUgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvc3VwZXIuaAorKysgYi9mcy9jZXBoL3N1cGVyLmgKQEAgLTc0MSwxMiArNzQxLDE0IEBACiAjaWZkZWYgQ09ORklHX0NFUEhfRlNfUE9TSVhfQUNMCiAKIHN0cnVjdCBwb3NpeF9hY2wgKmNlcGhfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2ludCBjZXBoX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBpbnQgdHlwZSk7CiBpbnQgY2VwaF9pbml0X2FjbChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiB2b2lkIGNlcGhfZm9yZ2V0X2FsbF9jYWNoZWRfYWNscyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogI2Vsc2UKIAogI2RlZmluZSBjZXBoX2dldF9hY2wgTlVMTAorI2RlZmluZSBjZXBoX3NldF9hY2wgTlVMTAogCiBzdGF0aWMgaW5saW5lIGludCBjZXBoX2luaXRfYWNsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlzdHJ1Y3QgaW5vZGUgKmRpcikKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2FjbC5jIGIvZnMvY2lmcy9jaWZzYWNsLmMKaW5kZXggNTFmNWUwZS4uYzgxOWIwYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzYWNsLmMKKysrIGIvZnMvY2lmcy9jaWZzYWNsLmMKQEAgLTg5NSw5ICs4OTUsMTAgQEAKIAlpbnQgb3Bsb2NrID0gMDsKIAl1bnNpZ25lZCBpbnQgeGlkOwogCWludCByYywgY3JlYXRlX29wdGlvbnMgPSAwOwotCV9fdTE2IGZpZDsKIAlzdHJ1Y3QgY2lmc190Y29uICp0Y29uOwogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rID0gY2lmc19zYl90bGluayhjaWZzX3NiKTsKKwlzdHJ1Y3QgY2lmc19maWQgZmlkOworCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOwogCiAJaWYgKElTX0VSUih0bGluaykpCiAJCXJldHVybiBFUlJfQ0FTVCh0bGluayk7CkBAIC05MDgsMTIgKzkwOSwxOSBAQAogCWlmIChiYWNrdXBfY3JlZChjaWZzX3NiKSkKIAkJY3JlYXRlX29wdGlvbnMgfD0gQ1JFQVRFX09QRU5fQkFDS1VQX0lOVEVOVDsKIAotCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIFJFQURfQ09OVFJPTCwKLQkJCWNyZWF0ZV9vcHRpb25zLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlvcGFybXMudGNvbiA9IHRjb247CisJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IFJFQURfQ09OVFJPTDsKKwlvcGFybXMuY3JlYXRlX29wdGlvbnMgPSBjcmVhdGVfb3B0aW9uczsKKwlvcGFybXMuZGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisJb3Bhcm1zLnBhdGggPSBwYXRoOworCW9wYXJtcy5maWQgPSAmZmlkOworCW9wYXJtcy5yZWNvbm5lY3QgPSBmYWxzZTsKKworCXJjID0gQ0lGU19vcGVuKHhpZCwgJm9wYXJtcywgJm9wbG9jaywgTlVMTCk7CiAJaWYgKCFyYykgewotCQlyYyA9IENJRlNTTUJHZXRDSUZTQUNMKHhpZCwgdGNvbiwgZmlkLCAmcG50c2QsIHBhY2xsZW4pOwotCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQpOworCQlyYyA9IENJRlNTTUJHZXRDSUZTQUNMKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCwgJnBudHNkLCBwYWNsbGVuKTsKKwkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CiAJfQogCiAJY2lmc19wdXRfdGxpbmsodGxpbmspOwpAQCAtOTUwLDEwICs5NTgsMTEgQEAKIAlpbnQgb3Bsb2NrID0gMDsKIAl1bnNpZ25lZCBpbnQgeGlkOwogCWludCByYywgYWNjZXNzX2ZsYWdzLCBjcmVhdGVfb3B0aW9ucyA9IDA7Ci0JX191MTYgZmlkOwogCXN0cnVjdCBjaWZzX3Rjb24gKnRjb247CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rID0gY2lmc19zYl90bGluayhjaWZzX3NiKTsKKwlzdHJ1Y3QgY2lmc19maWQgZmlkOworCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOwogCiAJaWYgKElTX0VSUih0bGluaykpCiAJCXJldHVybiBQVFJfRVJSKHRsaW5rKTsKQEAgLTk2OSwxOCArOTc4LDI1IEBACiAJZWxzZQogCQlhY2Nlc3NfZmxhZ3MgPSBXUklURV9EQUM7CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgcGF0aCwgRklMRV9PUEVOLCBhY2Nlc3NfZmxhZ3MsCi0JCQljcmVhdGVfb3B0aW9ucywgJmZpZCwgJm9wbG9jaywgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJb3Bhcm1zLnRjb24gPSB0Y29uOworCW9wYXJtcy5jaWZzX3NiID0gY2lmc19zYjsKKwlvcGFybXMuZGVzaXJlZF9hY2Nlc3MgPSBhY2Nlc3NfZmxhZ3M7CisJb3Bhcm1zLmNyZWF0ZV9vcHRpb25zID0gY3JlYXRlX29wdGlvbnM7CisJb3Bhcm1zLmRpc3Bvc2l0aW9uID0gRklMRV9PUEVOOworCW9wYXJtcy5wYXRoID0gcGF0aDsKKwlvcGFybXMuZmlkID0gJmZpZDsKKwlvcGFybXMucmVjb25uZWN0ID0gZmFsc2U7CisKKwlyYyA9IENJRlNfb3Blbih4aWQsICZvcGFybXMsICZvcGxvY2ssIE5VTEwpOwogCWlmIChyYykgewogCQljaWZzX2RiZyhWRlMsICJVbmFibGUgdG8gb3BlbiBmaWxlIHRvIHNldCBBQ0xcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IENJRlNTTUJTZXRDSUZTQUNMKHhpZCwgdGNvbiwgZmlkLCBwbm50c2QsIGFjbGxlbiwgYWNsZmxhZyk7CisJcmMgPSBDSUZTU01CU2V0Q0lGU0FDTCh4aWQsIHRjb24sIGZpZC5uZXRmaWQsIHBubnRzZCwgYWNsbGVuLCBhY2xmbGFnKTsKIAljaWZzX2RiZyhOT0lTWSwgIlNldENJRlNBQ0wgcmMgPSAlZFxuIiwgcmMpOwogCi0JQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkKTsKKwlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQubmV0ZmlkKTsKIG91dDoKIAlmcmVlX3hpZCh4aWQpOwogCWNpZnNfcHV0X3RsaW5rKHRsaW5rKTsKQEAgLTEwMjcsMTUgKzEwNDMsMzAgQEAKIAlfX3UzMiBzZWNkZXNjbGVuID0gMDsKIAlzdHJ1Y3QgY2lmc19udHNkICpwbnRzZCA9IE5VTEw7IC8qIGFjbCBvYnRhaW5lZCBmcm9tIHNlcnZlciAqLwogCXN0cnVjdCBjaWZzX250c2QgKnBubnRzZCA9IE5VTEw7IC8qIG1vZGlmaWVkIGFjbCB0byBiZSBzZW50IHRvIHNlcnZlciAqLworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgdGNvbl9saW5rICp0bGluayA9IGNpZnNfc2JfdGxpbmsoY2lmc19zYik7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKworCWlmIChJU19FUlIodGxpbmspKQorCQlyZXR1cm4gUFRSX0VSUih0bGluayk7CisJdGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOwogCiAJY2lmc19kYmcoTk9JU1ksICJzZXQgQUNMIGZyb20gbW9kZSBmb3IgJXNcbiIsIHBhdGgpOwogCiAJLyogR2V0IHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yICovCi0JcG50c2QgPSBnZXRfY2lmc19hY2woQ0lGU19TQihpbm9kZS0+aV9zYiksIGlub2RlLCBwYXRoLCAmc2VjZGVzY2xlbik7CisKKwlpZiAodGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+Z2V0X2FjbCA9PSBOVUxMKSB7CisJCWNpZnNfcHV0X3RsaW5rKHRsaW5rKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXBudHNkID0gdGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+Z2V0X2FjbChjaWZzX3NiLCBpbm9kZSwgcGF0aCwKKwkJCQkJCSZzZWNkZXNjbGVuKTsKIAlpZiAoSVNfRVJSKHBudHNkKSkgewogCQlyYyA9IFBUUl9FUlIocG50c2QpOwogCQljaWZzX2RiZyhWRlMsICIlczogZXJyb3IgJWQgZ2V0dGluZyBzZWMgZGVzY1xuIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBvdXQ7CisJCWNpZnNfcHV0X3RsaW5rKHRsaW5rKTsKKwkJcmV0dXJuIHJjOwogCX0KIAogCS8qCkBAIC0xMDQ4LDYgKzEwNzksNyBAQAogCXBubnRzZCA9IGttYWxsb2Moc2VjZGVzY2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbm50c2QpIHsKIAkJa2ZyZWUocG50c2QpOworCQljaWZzX3B1dF90bGluayh0bGluayk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA1NiwxNCArMTA4OCwxOCBAQAogCiAJY2lmc19kYmcoTk9JU1ksICJidWlsZF9zZWNfZGVzYyByYzogJWRcbiIsIHJjKTsKIAorCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+b3BzLT5zZXRfYWNsID09IE5VTEwpCisJCXJjID0gLUVPUE5PVFNVUFA7CisKIAlpZiAoIXJjKSB7CiAJCS8qIFNldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciAqLwotCQlyYyA9IHNldF9jaWZzX2FjbChwbm50c2QsIHNlY2Rlc2NsZW4sIGlub2RlLCBwYXRoLCBhY2xmbGFnKTsKKwkJcmMgPSB0Y29uLT5zZXMtPnNlcnZlci0+b3BzLT5zZXRfYWNsKHBubnRzZCwgc2VjZGVzY2xlbiwgaW5vZGUsCisJCQkJCQkgICAgIHBhdGgsIGFjbGZsYWcpOwogCQljaWZzX2RiZyhOT0lTWSwgInNldF9jaWZzX2FjbCByYzogJWRcbiIsIHJjKTsKIAl9CisJY2lmc19wdXRfdGxpbmsodGxpbmspOwogCiAJa2ZyZWUocG5udHNkKTsKIAlrZnJlZShwbnRzZCk7Ci1vdXQ6CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCmluZGV4IGY5MThhOTkuLjg2ZGMyOGMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2dsb2IuaAorKysgYi9mcy9jaWZzL2NpZnNnbG9iLmgKQEAgLTMyMyw3ICszMjMsOCBAQAogCS8qIGFzeW5jIHJlYWQgZnJvbSB0aGUgc2VydmVyICovCiAJaW50ICgqYXN5bmNfcmVhZHYpKHN0cnVjdCBjaWZzX3JlYWRkYXRhICopOwogCS8qIGFzeW5jIHdyaXRlIHRvIHRoZSBzZXJ2ZXIgKi8KLQlpbnQgKCphc3luY193cml0ZXYpKHN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqKTsKKwlpbnQgKCphc3luY193cml0ZXYpKHN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqLAorCQkJICAgIHZvaWQgKCpyZWxlYXNlKShzdHJ1Y3Qga3JlZiAqKSk7CiAJLyogc3luYyByZWFkIGZyb20gdGhlIHNlcnZlciAqLwogCWludCAoKnN5bmNfcmVhZCkoY29uc3QgdW5zaWduZWQgaW50LCBzdHJ1Y3QgY2lmc0ZpbGVJbmZvICosCiAJCQkgc3RydWN0IGNpZnNfaW9fcGFybXMgKiwgdW5zaWduZWQgaW50ICosIGNoYXIgKiosCkBAIC0zNzAsOCArMzcxLDEyIEBACiAJdm9pZCAoKm5ld19sZWFzZV9rZXkpKHN0cnVjdCBjaWZzX2ZpZCAqKTsKIAlpbnQgKCpnZW5lcmF0ZV9zaWduaW5na2V5KShzdHJ1Y3QgY2lmc19zZXMgKik7CiAJaW50ICgqY2FsY19zaWduYXR1cmUpKHN0cnVjdCBzbWJfcnFzdCAqLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICopOwotCWludCAoKnF1ZXJ5X21mX3N5bWxpbmspKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQgKiwKLQkJCQlzdHJ1Y3QgY2lmc19zYl9pbmZvICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqcXVlcnlfbWZfc3ltbGluaykodW5zaWduZWQgaW50LCBzdHJ1Y3QgY2lmc190Y29uICosCisJCQkJc3RydWN0IGNpZnNfc2JfaW5mbyAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosCisJCQkJY2hhciAqLCB1bnNpZ25lZCBpbnQgKik7CisJaW50ICgqY3JlYXRlX21mX3N5bWxpbmspKHVuc2lnbmVkIGludCwgc3RydWN0IGNpZnNfdGNvbiAqLAorCQkJCSBzdHJ1Y3QgY2lmc19zYl9pbmZvICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkgY2hhciAqLCB1bnNpZ25lZCBpbnQgKik7CiAJLyogaWYgd2UgY2FuIGRvIGNhY2hlIHJlYWQgb3BlcmF0aW9ucyAqLwogCWJvb2wgKCppc19yZWFkX29wKShfX3UzMik7CiAJLyogc2V0IG9wbG9jayBsZXZlbCBmb3IgdGhlIGlub2RlICovCkBAIC0zODUsNiArMzkwLDE2IEBACiAJCQlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICp0YXJnZXRfZmlsZSwgdTY0IHNyY19vZmYsIHU2NCBsZW4sCiAJCQl1NjQgZGVzdF9vZmYpOwogCWludCAoKnZhbGlkYXRlX25lZ290aWF0ZSkoY29uc3QgdW5zaWduZWQgaW50LCBzdHJ1Y3QgY2lmc190Y29uICopOworCXNzaXplX3QgKCpxdWVyeV9hbGxfRUFzKShjb25zdCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBjaWZzX3Rjb24gKiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBjaGFyICosCisJCQlzaXplX3QsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKiwgaW50KTsKKwlpbnQgKCpzZXRfRUEpKGNvbnN0IHVuc2lnbmVkIGludCwgc3RydWN0IGNpZnNfdGNvbiAqLCBjb25zdCBjaGFyICosCisJCQljb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgY29uc3QgX191MTYsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICosIGludCk7CisJc3RydWN0IGNpZnNfbnRzZCAqICgqZ2V0X2FjbCkoc3RydWN0IGNpZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCWNvbnN0IGNoYXIgKiwgdTMyICopOworCWludCAoKnNldF9hY2wpKHN0cnVjdCBjaWZzX250c2QgKiwgX191MzIsIHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosCisJCQlpbnQpOwogfTsKIAogc3RydWN0IHNtYl92ZXJzaW9uX3ZhbHVlcyB7CkBAIC0xMDU0LDcgKzEwNjksNyBAQAogCXVuc2lnbmVkIGludAkJCXBhZ2VzejsKIAl1bnNpZ25lZCBpbnQJCQl0YWlsc3o7CiAJdW5zaWduZWQgaW50CQkJbnJfcGFnZXM7Ci0Jc3RydWN0IHBhZ2UJCQkqcGFnZXNbMV07CisJc3RydWN0IHBhZ2UJCQkqcGFnZXNbXTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNwcm90by5oIGIvZnMvY2lmcy9jaWZzcHJvdG8uaAppbmRleCAyYzI5ZGI2Li5kMDBlMDlkIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwcm90by5oCisrKyBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKQEAgLTM2MiwxMSArMzYyLDggQEAKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOwogZXh0ZXJuIGludCBDSUZTU01CX3NldF9jb21wcmVzc2lvbihjb25zdCB1bnNpZ25lZCBpbnQgeGlkLAogCQkJCSAgIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sIF9fdTE2IGZpZCk7Ci1leHRlcm4gaW50IENJRlNTTUJPcGVuKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQljb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3QgaW50IGRpc3Bvc2l0aW9uLAotCQkJY29uc3QgaW50IGFjY2Vzc19mbGFncywgY29uc3QgaW50IG9tb2RlLAotCQkJX191MTYgKm5ldGZpZCwgaW50ICpwT3Bsb2NrLCBGSUxFX0FMTF9JTkZPICosCi0JCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsIGludCByZW1hcCk7CitleHRlcm4gaW50IENJRlNfb3Blbihjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19vcGVuX3Bhcm1zICpvcGFybXMsCisJCSAgICAgaW50ICpvcGxvY2ssIEZJTEVfQUxMX0lORk8gKmJ1Zik7CiBleHRlcm4gaW50IFNNQkxlZ2FjeU9wZW4oY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJCWNvbnN0IGNoYXIgKmZpbGVOYW1lLCBjb25zdCBpbnQgZGlzcG9zaXRpb24sCiAJCQljb25zdCBpbnQgYWNjZXNzX2ZsYWdzLCBjb25zdCBpbnQgb21vZGUsCkBAIC00NzYsOCArNDczLDggQEAKIGV4dGVybiBpbnQgQ0lGU0dldEV4dEF0dHIoY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJCWNvbnN0IGludCBuZXRmaWQsIF9fdTY0ICpwRXh0QXR0ckJpdHMsIF9fdTY0ICpwTWFzayk7CiBleHRlcm4gdm9pZCBjaWZzX2F1dG9kaXNhYmxlX3NlcnZlcmlubyhzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKTsKLWV4dGVybiBib29sIENJRlNDb3VsZEJlTUZTeW1saW5rKGNvbnN0IHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0cik7Ci1leHRlcm4gaW50IENJRlNDaGVja01GU3ltbGluayh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAorZXh0ZXJuIGJvb2wgY291bGRiZV9tZl9zeW1saW5rKGNvbnN0IHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0cik7CitleHRlcm4gaW50IGNoZWNrX21mX3N5bWxpbmsodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJCSAgICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCiAJCQkgICAgICBzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsCiAJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYXRoKTsKQEAgLTQ5MSwxMiArNDg4LDE4IEBACiBpbnQgY2lmc19hc3luY19yZWFkdihzdHJ1Y3QgY2lmc19yZWFkZGF0YSAqcmRhdGEpOwogaW50IGNpZnNfcmVhZHZfcmVjZWl2ZShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKTsKIAotaW50IGNpZnNfYXN5bmNfd3JpdGV2KHN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGEpOworaW50IGNpZnNfYXN5bmNfd3JpdGV2KHN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGEsCisJCSAgICAgIHZvaWQgKCpyZWxlYXNlKShzdHJ1Y3Qga3JlZiAqa3JlZikpOwogdm9pZCBjaWZzX3dyaXRldl9jb21wbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RydWN0IGNpZnNfd3JpdGVkYXRhICpjaWZzX3dyaXRlZGF0YV9hbGxvYyh1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCiAJCQkJCQl3b3JrX2Z1bmNfdCBjb21wbGV0ZSk7CiB2b2lkIGNpZnNfd3JpdGVkYXRhX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZmNvdW50KTsKLWludCBvcGVuX3F1ZXJ5X2Nsb3NlX2NpZnNfc3ltbGluayhjb25zdCB1bnNpZ25lZCBjaGFyICpwYXRoLCBjaGFyICpwYnVmLAotCQkJdW5zaWduZWQgaW50ICpwYnl0ZXNfcmVhZCwgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKLQkJCXVuc2lnbmVkIGludCB4aWQpOworaW50IGNpZnNfcXVlcnlfbWZfc3ltbGluayh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAorCQkJICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYXRoLCBjaGFyICpwYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgKnBieXRlc19yZWFkKTsKK2ludCBjaWZzX2NyZWF0ZV9tZl9zeW1saW5rKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCisJCQkgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGF0aCwgY2hhciAqcGJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGludCAqcGJ5dGVzX3dyaXR0ZW4pOwogI2VuZGlmCQkJLyogX0NJRlNQUk9UT19IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IGQ3MDdlZGIuLmYzMjY0YmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC0xMjczLDEwNCArMTI3MywxMjQgQEAKIH0KIAogaW50Ci1DSUZTU01CT3Blbihjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCSAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3QgaW50IG9wZW5EaXNwb3NpdGlvbiwKLQkgICAgY29uc3QgaW50IGFjY2Vzc19mbGFncywgY29uc3QgaW50IGNyZWF0ZV9vcHRpb25zLCBfX3UxNiAqbmV0ZmlkLAotCSAgICBpbnQgKnBPcGxvY2ssIEZJTEVfQUxMX0lORk8gKnBmaWxlX2luZm8sCi0JICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwgaW50IHJlbWFwKQorQ0lGU19vcGVuKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX29wZW5fcGFybXMgKm9wYXJtcywgaW50ICpvcGxvY2ssCisJICBGSUxFX0FMTF9JTkZPICpidWYpCiB7CiAJaW50IHJjID0gLUVBQ0NFUzsKLQlPUEVOX1JFUSAqcFNNQiA9IE5VTEw7Ci0JT1BFTl9SU1AgKnBTTUJyID0gTlVMTDsKKwlPUEVOX1JFUSAqcmVxID0gTlVMTDsKKwlPUEVOX1JTUCAqcnNwID0gTlVMTDsKIAlpbnQgYnl0ZXNfcmV0dXJuZWQ7CiAJaW50IG5hbWVfbGVuOwogCV9fdTE2IGNvdW50OworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBvcGFybXMtPmNpZnNfc2I7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbiA9IG9wYXJtcy0+dGNvbjsKKwlpbnQgcmVtYXAgPSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSOworCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5scyA9IGNpZnNfc2ItPmxvY2FsX25sczsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBvcGFybXMtPmNyZWF0ZV9vcHRpb25zOworCWludCBkZXNpcmVkX2FjY2VzcyA9IG9wYXJtcy0+ZGVzaXJlZF9hY2Nlc3M7CisJaW50IGRpc3Bvc2l0aW9uID0gb3Bhcm1zLT5kaXNwb3NpdGlvbjsKKwljb25zdCBjaGFyICpwYXRoID0gb3Bhcm1zLT5wYXRoOwogCiBvcGVuUmV0cnk6Ci0JcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX0NSRUFURV9BTkRYLCAyNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAotCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fTlRfQ1JFQVRFX0FORFgsIDI0LCB0Y29uLCAodm9pZCAqKikmcmVxLAorCQkgICAgICAodm9pZCAqKikmcnNwKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCS8qIG5vIGNvbW1hbmRzIGdvIGFmdGVyIHRoaXMgKi8KKwlyZXEtPkFuZFhDb21tYW5kID0gMHhGRjsKIAotCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7Ci0JCWNvdW50ID0gMTsJLyogYWNjb3VudCBmb3Igb25lIGJ5dGUgcGFkIHRvIHdvcmQgYm91bmRhcnkgKi8KLQkJbmFtZV9sZW4gPQotCQkgICAgY2lmc0NvbnZlcnRUb1VURjE2KChfX2xlMTYgKikgKHBTTUItPmZpbGVOYW1lICsgMSksCi0JCQkJICAgICAgIGZpbGVOYW1lLCBQQVRIX01BWCwgbmxzX2NvZGVwYWdlLCByZW1hcCk7Ci0JCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwlpZiAocmVxLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCS8qIGFjY291bnQgZm9yIG9uZSBieXRlIHBhZCB0byB3b3JkIGJvdW5kYXJ5ICovCisJCWNvdW50ID0gMTsKKwkJbmFtZV9sZW4gPSBjaWZzQ29udmVydFRvVVRGMTYoKF9fbGUxNiAqKShyZXEtPmZpbGVOYW1lICsgMSksCisJCQkJCSAgICAgIHBhdGgsIFBBVEhfTUFYLCBubHMsIHJlbWFwKTsKKwkJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbisrOwogCQluYW1lX2xlbiAqPSAyOwotCQlwU01CLT5OYW1lTGVuZ3RoID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOwotCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KLQkJY291bnQgPSAwOwkvKiBubyBwYWQgKi8KLQkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7Ci0JCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KLQkJcFNNQi0+TmFtZUxlbmd0aCA9IGNwdV90b19sZTE2KG5hbWVfbGVuKTsKLQkJc3RybmNweShwU01CLT5maWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwkJcmVxLT5OYW1lTGVuZ3RoID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOworCX0gZWxzZSB7CisJCS8qIEJCIGltcHJvdmUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQkvKiBubyBwYWQgKi8KKwkJY291bnQgPSAwOworCQluYW1lX2xlbiA9IHN0cm5sZW4ocGF0aCwgUEFUSF9NQVgpOworCQkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuKys7CisJCXJlcS0+TmFtZUxlbmd0aCA9IGNwdV90b19sZTE2KG5hbWVfbGVuKTsKKwkJc3RybmNweShyZXEtPmZpbGVOYW1lLCBwYXRoLCBuYW1lX2xlbik7CiAJfQotCWlmICgqcE9wbG9jayAmIFJFUV9PUExPQ0spCi0JCXBTTUItPk9wZW5GbGFncyA9IGNwdV90b19sZTMyKFJFUV9PUExPQ0spOwotCWVsc2UgaWYgKCpwT3Bsb2NrICYgUkVRX0JBVENIT1BMT0NLKQotCQlwU01CLT5PcGVuRmxhZ3MgPSBjcHVfdG9fbGUzMihSRVFfQkFUQ0hPUExPQ0spOwotCXBTTUItPkRlc2lyZWRBY2Nlc3MgPSBjcHVfdG9fbGUzMihhY2Nlc3NfZmxhZ3MpOwotCXBTTUItPkFsbG9jYXRpb25TaXplID0gMDsKLQkvKiBzZXQgZmlsZSBhcyBzeXN0ZW0gZmlsZSBpZiBzcGVjaWFsIGZpbGUgc3VjaAotCSAgIGFzIGZpZm8gYW5kIHNlcnZlciBleHBlY3RpbmcgU0ZVIHN0eWxlIGFuZAotCSAgIG5vIFVuaXggZXh0ZW5zaW9ucyAqLwotCWlmIChjcmVhdGVfb3B0aW9ucyAmIENSRUFURV9PUFRJT05fU1BFQ0lBTCkKLQkJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX1NZU1RFTSk7Ci0JZWxzZQotCQlwU01CLT5GaWxlQXR0cmlidXRlcyA9IGNwdV90b19sZTMyKEFUVFJfTk9STUFMKTsKIAotCS8qIFhQIGRvZXMgbm90IGhhbmRsZSBBVFRSX1BPU0lYX1NFTUFOVElDUyAqLwotCS8qIGJ1dCBpdCBoZWxwcyBzcGVlZCB1cCBjYXNlIHNlbnNpdGl2ZSBjaGVja3MgZm9yIG90aGVyCi0Jc2VydmVycyBzdWNoIGFzIFNhbWJhICovCisJaWYgKCpvcGxvY2sgJiBSRVFfT1BMT0NLKQorCQlyZXEtPk9wZW5GbGFncyA9IGNwdV90b19sZTMyKFJFUV9PUExPQ0spOworCWVsc2UgaWYgKCpvcGxvY2sgJiBSRVFfQkFUQ0hPUExPQ0spCisJCXJlcS0+T3BlbkZsYWdzID0gY3B1X3RvX2xlMzIoUkVRX0JBVENIT1BMT0NLKTsKKworCXJlcS0+RGVzaXJlZEFjY2VzcyA9IGNwdV90b19sZTMyKGRlc2lyZWRfYWNjZXNzKTsKKwlyZXEtPkFsbG9jYXRpb25TaXplID0gMDsKKworCS8qCisJICogU2V0IGZpbGUgYXMgc3lzdGVtIGZpbGUgaWYgc3BlY2lhbCBmaWxlIHN1Y2ggYXMgZmlmbyBhbmQgc2VydmVyCisJICogZXhwZWN0aW5nIFNGVSBzdHlsZSBhbmQgbm8gVW5peCBleHRlbnNpb25zLgorCSAqLworCWlmIChjcmVhdGVfb3B0aW9ucyAmIENSRUFURV9PUFRJT05fU1BFQ0lBTCkKKwkJcmVxLT5GaWxlQXR0cmlidXRlcyA9IGNwdV90b19sZTMyKEFUVFJfU1lTVEVNKTsKKwllbHNlCisJCXJlcS0+RmlsZUF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX05PUk1BTCk7CisKKwkvKgorCSAqIFhQIGRvZXMgbm90IGhhbmRsZSBBVFRSX1BPU0lYX1NFTUFOVElDUyBidXQgaXQgaGVscHMgc3BlZWQgdXAgY2FzZQorCSAqIHNlbnNpdGl2ZSBjaGVja3MgZm9yIG90aGVyIHNlcnZlcnMgc3VjaCBhcyBTYW1iYS4KKwkgKi8KIAlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKLQkJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgfD0gY3B1X3RvX2xlMzIoQVRUUl9QT1NJWF9TRU1BTlRJQ1MpOworCQlyZXEtPkZpbGVBdHRyaWJ1dGVzIHw9IGNwdV90b19sZTMyKEFUVFJfUE9TSVhfU0VNQU5USUNTKTsKIAogCWlmIChjcmVhdGVfb3B0aW9ucyAmIENSRUFURV9PUFRJT05fUkVBRE9OTFkpCi0JCXBTTUItPkZpbGVBdHRyaWJ1dGVzIHw9IGNwdV90b19sZTMyKEFUVFJfUkVBRE9OTFkpOworCQlyZXEtPkZpbGVBdHRyaWJ1dGVzIHw9IGNwdV90b19sZTMyKEFUVFJfUkVBRE9OTFkpOwogCi0JcFNNQi0+U2hhcmVBY2Nlc3MgPSBjcHVfdG9fbGUzMihGSUxFX1NIQVJFX0FMTCk7Ci0JcFNNQi0+Q3JlYXRlRGlzcG9zaXRpb24gPSBjcHVfdG9fbGUzMihvcGVuRGlzcG9zaXRpb24pOwotCXBTTUItPkNyZWF0ZU9wdGlvbnMgPSBjcHVfdG9fbGUzMihjcmVhdGVfb3B0aW9ucyAmIENSRUFURV9PUFRJT05TX01BU0spOworCXJlcS0+U2hhcmVBY2Nlc3MgPSBjcHVfdG9fbGUzMihGSUxFX1NIQVJFX0FMTCk7CisJcmVxLT5DcmVhdGVEaXNwb3NpdGlvbiA9IGNwdV90b19sZTMyKGRpc3Bvc2l0aW9uKTsKKwlyZXEtPkNyZWF0ZU9wdGlvbnMgPSBjcHVfdG9fbGUzMihjcmVhdGVfb3B0aW9ucyAmIENSRUFURV9PUFRJT05TX01BU0spOworCiAJLyogQkIgRXhwaXJlbWVudCB3aXRoIHZhcmlvdXMgaW1wZXJzb25hdGlvbiBsZXZlbHMgYW5kIHZlcmlmeSAqLwotCXBTTUItPkltcGVyc29uYXRpb25MZXZlbCA9IGNwdV90b19sZTMyKFNFQ1VSSVRZX0lNUEVSU09OQVRJT04pOwotCXBTTUItPlNlY3VyaXR5RmxhZ3MgPQotCSAgICBTRUNVUklUWV9DT05URVhUX1RSQUNLSU5HIHwgU0VDVVJJVFlfRUZGRUNUSVZFX09OTFk7CisJcmVxLT5JbXBlcnNvbmF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUzMihTRUNVUklUWV9JTVBFUlNPTkFUSU9OKTsKKwlyZXEtPlNlY3VyaXR5RmxhZ3MgPSBTRUNVUklUWV9DT05URVhUX1RSQUNLSU5HfFNFQ1VSSVRZX0VGRkVDVElWRV9PTkxZOwogCiAJY291bnQgKz0gbmFtZV9sZW47Ci0JaW5jX3JmYzEwMDFfbGVuKHBTTUIsIGNvdW50KTsKKwlpbmNfcmZjMTAwMV9sZW4ocmVxLCBjb3VudCk7CiAKLQlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7Ci0JLyogbG9uZ19vcCBzZXQgdG8gMSB0byBhbGxvdyBmb3Igb3Bsb2NrIGJyZWFrIHRpbWVvdXRzICovCi0JcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCi0JCQkoc3RydWN0IHNtYl9oZHIgKilwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlyZXEtPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKilyZXEsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopcnNwLCAmYnl0ZXNfcmV0dXJuZWQsIDApOwogCWNpZnNfc3RhdHNfaW5jKCZ0Y29uLT5zdGF0cy5jaWZzX3N0YXRzLm51bV9vcGVucyk7CiAJaWYgKHJjKSB7CiAJCWNpZnNfZGJnKEZZSSwgIkVycm9yIGluIE9wZW4gPSAlZFxuIiwgcmMpOwotCX0gZWxzZSB7Ci0JCSpwT3Bsb2NrID0gcFNNQnItPk9wbG9ja0xldmVsOyAvKiAxIGJ5dGUgbm8gbmVlZCB0byBsZV90b19jcHUgKi8KLQkJKm5ldGZpZCA9IHBTTUJyLT5GaWQ7CS8qIGNpZnMgZmlkIHN0YXlzIGluIGxlICovCi0JCS8qIExldCBjYWxsZXIga25vdyBmaWxlIHdhcyBjcmVhdGVkIHNvIHdlIGNhbiBzZXQgdGhlIG1vZGUuICovCi0JCS8qIERvIHdlIGNhcmUgYWJvdXQgdGhlIENyZWF0ZUFjdGlvbiBpbiBhbnkgb3RoZXIgY2FzZXM/ICovCi0JCWlmIChjcHVfdG9fbGUzMihGSUxFX0NSRUFURSkgPT0gcFNNQnItPkNyZWF0ZUFjdGlvbikKLQkJCSpwT3Bsb2NrIHw9IENJRlNfQ1JFQVRFX0FDVElPTjsKLQkJaWYgKHBmaWxlX2luZm8pIHsKLQkJCW1lbWNweSgoY2hhciAqKXBmaWxlX2luZm8sIChjaGFyICopJnBTTUJyLT5DcmVhdGlvblRpbWUsCi0JCQkJMzYgLyogQ3JlYXRpb25UaW1lIHRvIEF0dHJpYnV0ZXMgKi8pOwotCQkJLyogdGhlIGZpbGVfaW5mbyBidWYgaXMgZW5kaWFuIGNvbnZlcnRlZCBieSBjYWxsZXIgKi8KLQkJCXBmaWxlX2luZm8tPkFsbG9jYXRpb25TaXplID0gcFNNQnItPkFsbG9jYXRpb25TaXplOwotCQkJcGZpbGVfaW5mby0+RW5kT2ZGaWxlID0gcFNNQnItPkVuZE9mRmlsZTsKLQkJCXBmaWxlX2luZm8tPk51bWJlck9mTGlua3MgPSBjcHVfdG9fbGUzMigxKTsKLQkJCXBmaWxlX2luZm8tPkRlbGV0ZVBlbmRpbmcgPSAwOwotCQl9CisJCWNpZnNfYnVmX3JlbGVhc2UocmVxKTsKKwkJaWYgKHJjID09IC1FQUdBSU4pCisJCQlnb3RvIG9wZW5SZXRyeTsKKwkJcmV0dXJuIHJjOwogCX0KIAotCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7Ci0JaWYgKHJjID09IC1FQUdBSU4pCi0JCWdvdG8gb3BlblJldHJ5OworCS8qIDEgYnl0ZSBubyBuZWVkIHRvIGxlX3RvX2NwdSAqLworCSpvcGxvY2sgPSByc3AtPk9wbG9ja0xldmVsOworCS8qIGNpZnMgZmlkIHN0YXlzIGluIGxlICovCisJb3Bhcm1zLT5maWQtPm5ldGZpZCA9IHJzcC0+RmlkOworCisJLyogTGV0IGNhbGxlciBrbm93IGZpbGUgd2FzIGNyZWF0ZWQgc28gd2UgY2FuIHNldCB0aGUgbW9kZS4gKi8KKwkvKiBEbyB3ZSBjYXJlIGFib3V0IHRoZSBDcmVhdGVBY3Rpb24gaW4gYW55IG90aGVyIGNhc2VzPyAqLworCWlmIChjcHVfdG9fbGUzMihGSUxFX0NSRUFURSkgPT0gcnNwLT5DcmVhdGVBY3Rpb24pCisJCSpvcGxvY2sgfD0gQ0lGU19DUkVBVEVfQUNUSU9OOworCisJaWYgKGJ1ZikgeworCQkvKiBjb3B5IGZyb20gQ3JlYXRpb25UaW1lIHRvIEF0dHJpYnV0ZXMgKi8KKwkJbWVtY3B5KChjaGFyICopYnVmLCAoY2hhciAqKSZyc3AtPkNyZWF0aW9uVGltZSwgMzYpOworCQkvKiB0aGUgZmlsZV9pbmZvIGJ1ZiBpcyBlbmRpYW4gY29udmVydGVkIGJ5IGNhbGxlciAqLworCQlidWYtPkFsbG9jYXRpb25TaXplID0gcnNwLT5BbGxvY2F0aW9uU2l6ZTsKKwkJYnVmLT5FbmRPZkZpbGUgPSByc3AtPkVuZE9mRmlsZTsKKwkJYnVmLT5OdW1iZXJPZkxpbmtzID0gY3B1X3RvX2xlMzIoMSk7CisJCWJ1Zi0+RGVsZXRlUGVuZGluZyA9IDA7CisJfQorCisJY2lmc19idWZfcmVsZWFzZShyZXEpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTg5MCw3ICsxOTEwLDcgQEAKIAogCWRvIHsKIAkJc2VydmVyID0gdGxpbmtfdGNvbih3ZGF0YS0+Y2ZpbGUtPnRsaW5rKS0+c2VzLT5zZXJ2ZXI7Ci0JCXJjID0gc2VydmVyLT5vcHMtPmFzeW5jX3dyaXRldih3ZGF0YSk7CisJCXJjID0gc2VydmVyLT5vcHMtPmFzeW5jX3dyaXRldih3ZGF0YSwgY2lmc193cml0ZWRhdGFfcmVsZWFzZSk7CiAJfSB3aGlsZSAocmMgPT0gLUVBR0FJTik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgd2RhdGEtPm5yX3BhZ2VzOyBpKyspIHsKQEAgLTE5NDIsMTUgKzE5NjIsOSBAQAogewogCXN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGE7CiAKLQkvKiB0aGlzIHdvdWxkIG92ZXJmbG93ICovCi0JaWYgKG5yX3BhZ2VzID09IDApIHsKLQkJY2lmc19kYmcoVkZTLCAiJXM6IGNhbGxlZCB3aXRoIG5yX3BhZ2VzID09IDAhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQogCS8qIHdyaXRlZGF0YSArIG51bWJlciBvZiBwYWdlIHBvaW50ZXJzICovCiAJd2RhdGEgPSBremFsbG9jKHNpemVvZigqd2RhdGEpICsKLQkJCXNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIChucl9wYWdlcyAtIDEpLCBHRlBfTk9GUyk7CisJCQlzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBucl9wYWdlcywgR0ZQX05PRlMpOwogCWlmICh3ZGF0YSAhPSBOVUxMKSB7CiAJCWtyZWZfaW5pdCgmd2RhdGEtPnJlZmNvdW50KTsKIAkJSU5JVF9MSVNUX0hFQUQoJndkYXRhLT5saXN0KTsKQEAgLTIwMTEsNyArMjAyNSw4IEBACiAKIC8qIGNpZnNfYXN5bmNfd3JpdGV2IC0gc2VuZCBhbiBhc3luYyB3cml0ZSwgYW5kIHNldCB1cCBtaWQgdG8gaGFuZGxlIHJlc3VsdCAqLwogaW50Ci1jaWZzX2FzeW5jX3dyaXRldihzdHJ1Y3QgY2lmc193cml0ZWRhdGEgKndkYXRhKQorY2lmc19hc3luY193cml0ZXYoc3RydWN0IGNpZnNfd3JpdGVkYXRhICp3ZGF0YSwKKwkJICB2b2lkICgqcmVsZWFzZSkoc3RydWN0IGtyZWYgKmtyZWYpKQogewogCWludCByYyA9IC1FQUNDRVM7CiAJV1JJVEVfUkVRICpzbWIgPSBOVUxMOwpAQCAtMjA4NSw3ICsyMTAwLDcgQEAKIAlpZiAocmMgPT0gMCkKIAkJY2lmc19zdGF0c19pbmMoJnRjb24tPnN0YXRzLmNpZnNfc3RhdHMubnVtX3dyaXRlcyk7CiAJZWxzZQotCQlrcmVmX3B1dCgmd2RhdGEtPnJlZmNvdW50LCBjaWZzX3dyaXRlZGF0YV9yZWxlYXNlKTsKKwkJa3JlZl9wdXQoJndkYXRhLT5yZWZjb3VudCwgcmVsZWFzZSk7CiAKIGFzeW5jX3dyaXRldl9vdXQ6CiAJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWIpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9kaXIuYyBiL2ZzL2NpZnMvZGlyLmMKaW5kZXggYTUxNGUwYS4uZDNhNjc5NiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kaXIuYworKysgYi9mcy9jaWZzL2Rpci5jCkBAIC01NjUsMTIgKzU2NSwxMyBAQAogCWludCBjcmVhdGVfb3B0aW9ucyA9IENSRUFURV9OT1RfRElSIHwgQ1JFQVRFX09QVElPTl9TUEVDSUFMOwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CiAJc3RydWN0IHRjb25fbGluayAqdGxpbms7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqcFRjb247CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKIAlzdHJ1Y3QgY2lmc19pb19wYXJtcyBpb19wYXJtczsKIAljaGFyICpmdWxsX3BhdGggPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqbmV3aW5vZGUgPSBOVUxMOwogCWludCBvcGxvY2sgPSAwOwotCXUxNiBmaWxlSGFuZGxlOworCXN0cnVjdCBjaWZzX2ZpZCBmaWQ7CisJc3RydWN0IGNpZnNfb3Blbl9wYXJtcyBvcGFybXM7CiAJRklMRV9BTExfSU5GTyAqYnVmID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbjsKIAlzdHJ1Y3Qgd2luX2RldiAqcGRldjsKQEAgLTU4Myw3ICs1ODQsNyBAQAogCWlmIChJU19FUlIodGxpbmspKQogCQlyZXR1cm4gUFRSX0VSUih0bGluayk7CiAKLQlwVGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOworCXRjb24gPSB0bGlua190Y29uKHRsaW5rKTsKIAogCXhpZCA9IGdldF94aWQoKTsKIApAQCAtNTkzLDcgKzU5NCw3IEBACiAJCWdvdG8gbWtub2Rfb3V0OwogCX0KIAotCWlmIChwVGNvbi0+dW5peF9leHQpIHsKKwlpZiAodGNvbi0+dW5peF9leHQpIHsKIAkJc3RydWN0IGNpZnNfdW5peF9zZXRfaW5mb19hcmdzIGFyZ3MgPSB7CiAJCQkubW9kZQk9IG1vZGUgJiB+Y3VycmVudF91bWFzaygpLAogCQkJLmN0aW1lCT0gTk9fQ0hBTkdFXzY0LApAQCAtNjA4LDcgKzYwOSw3IEBACiAJCQlhcmdzLnVpZCA9IElOVkFMSURfVUlEOyAvKiBubyBjaGFuZ2UgKi8KIAkJCWFyZ3MuZ2lkID0gSU5WQUxJRF9HSUQ7IC8qIG5vIGNoYW5nZSAqLwogCQl9Ci0JCXJjID0gQ0lGU1NNQlVuaXhTZXRQYXRoSW5mbyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsICZhcmdzLAorCQlyYyA9IENJRlNTTUJVbml4U2V0UGF0aEluZm8oeGlkLCB0Y29uLCBmdWxsX3BhdGgsICZhcmdzLAogCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzLAogCQkJCQkgICAgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgogCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwpAQCAtNjQwLDQyICs2NDEsNDQgQEAKIAlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCiAJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgRklMRV9DUkVBVEUsCi0JCQkgR0VORVJJQ19XUklURSwgY3JlYXRlX29wdGlvbnMsCi0JCQkgJmZpbGVIYW5kbGUsICZvcGxvY2ssIGJ1ZiwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCW9wYXJtcy50Y29uID0gdGNvbjsKKwlvcGFybXMuY2lmc19zYiA9IGNpZnNfc2I7CisJb3Bhcm1zLmRlc2lyZWRfYWNjZXNzID0gR0VORVJJQ19XUklURTsKKwlvcGFybXMuY3JlYXRlX29wdGlvbnMgPSBjcmVhdGVfb3B0aW9uczsKKwlvcGFybXMuZGlzcG9zaXRpb24gPSBGSUxFX0NSRUFURTsKKwlvcGFybXMucGF0aCA9IGZ1bGxfcGF0aDsKKwlvcGFybXMuZmlkID0gJmZpZDsKKwlvcGFybXMucmVjb25uZWN0ID0gZmFsc2U7CisKKwlyYyA9IENJRlNfb3Blbih4aWQsICZvcGFybXMsICZvcGxvY2ssIGJ1Zik7CiAJaWYgKHJjKQogCQlnb3RvIG1rbm9kX291dDsKIAotCS8qIEJCIERvIG5vdCBib3RoZXIgdG8gZGVjb2RlIGJ1ZiBzaW5jZSBubyBsb2NhbCBpbm9kZSB5ZXQgdG8gcHV0Ci0JICogdGltZXN0YW1wcyBpbiwgYnV0IHdlIGNhbiByZXVzZSBpdCBzYWZlbHkgKi8KKwkvKgorCSAqIEJCIERvIG5vdCBib3RoZXIgdG8gZGVjb2RlIGJ1ZiBzaW5jZSBubyBsb2NhbCBpbm9kZSB5ZXQgdG8gcHV0CisJICogdGltZXN0YW1wcyBpbiwgYnV0IHdlIGNhbiByZXVzZSBpdCBzYWZlbHkuCisJICovCiAKIAlwZGV2ID0gKHN0cnVjdCB3aW5fZGV2ICopYnVmOwotCWlvX3Bhcm1zLm5ldGZpZCA9IGZpbGVIYW5kbGU7CisJaW9fcGFybXMubmV0ZmlkID0gZmlkLm5ldGZpZDsKIAlpb19wYXJtcy5waWQgPSBjdXJyZW50LT50Z2lkOwotCWlvX3Bhcm1zLnRjb24gPSBwVGNvbjsKKwlpb19wYXJtcy50Y29uID0gdGNvbjsKIAlpb19wYXJtcy5vZmZzZXQgPSAwOwogCWlvX3Bhcm1zLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgd2luX2Rldik7CiAJaWYgKFNfSVNDSFIobW9kZSkpIHsKIAkJbWVtY3B5KHBkZXYtPnR5cGUsICJJbnR4Q0hSIiwgOCk7Ci0JCXBkZXYtPm1ham9yID0KLQkJICAgICAgY3B1X3RvX2xlNjQoTUFKT1IoZGV2aWNlX251bWJlcikpOwotCQlwZGV2LT5taW5vciA9Ci0JCSAgICAgIGNwdV90b19sZTY0KE1JTk9SKGRldmljZV9udW1iZXIpKTsKLQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCAmaW9fcGFybXMsCi0JCQkmYnl0ZXNfd3JpdHRlbiwgKGNoYXIgKilwZGV2LAotCQkJTlVMTCwgMCk7CisJCXBkZXYtPm1ham9yID0gY3B1X3RvX2xlNjQoTUFKT1IoZGV2aWNlX251bWJlcikpOworCQlwZGV2LT5taW5vciA9IGNwdV90b19sZTY0KE1JTk9SKGRldmljZV9udW1iZXIpKTsKKwkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCAmaW9fcGFybXMsICZieXRlc193cml0dGVuLCAoY2hhciAqKXBkZXYsCisJCQkJICBOVUxMLCAwKTsKIAl9IGVsc2UgaWYgKFNfSVNCTEsobW9kZSkpIHsKIAkJbWVtY3B5KHBkZXYtPnR5cGUsICJJbnR4QkxLIiwgOCk7Ci0JCXBkZXYtPm1ham9yID0KLQkJICAgICAgY3B1X3RvX2xlNjQoTUFKT1IoZGV2aWNlX251bWJlcikpOwotCQlwZGV2LT5taW5vciA9Ci0JCSAgICAgIGNwdV90b19sZTY0KE1JTk9SKGRldmljZV9udW1iZXIpKTsKLQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCAmaW9fcGFybXMsCi0JCQkmYnl0ZXNfd3JpdHRlbiwgKGNoYXIgKilwZGV2LAotCQkJTlVMTCwgMCk7CisJCXBkZXYtPm1ham9yID0gY3B1X3RvX2xlNjQoTUFKT1IoZGV2aWNlX251bWJlcikpOworCQlwZGV2LT5taW5vciA9IGNwdV90b19sZTY0KE1JTk9SKGRldmljZV9udW1iZXIpKTsKKwkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCAmaW9fcGFybXMsICZieXRlc193cml0dGVuLCAoY2hhciAqKXBkZXYsCisJCQkJICBOVUxMLCAwKTsKIAl9IC8qIGVsc2UgaWYgKFNfSVNGSUZPKSAqLwotCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBmaWxlSGFuZGxlKTsKKwlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQubmV0ZmlkKTsKIAlkX2Ryb3AoZGlyZW50cnkpOwogCiAJLyogRklYTUU6IGFkZCBjb2RlIGhlcmUgdG8gc2V0IEVBcyAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9maWxlLmMgYi9mcy9jaWZzL2ZpbGUuYwppbmRleCA1YTVhODcyLi43NTU1ODQ2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZpbGUuYworKysgYi9mcy9jaWZzL2ZpbGUuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAKIAkvKgogCSAqIENhbiBub3QgcmVmcmVzaCBpbm9kZSBieSBwYXNzaW5nIGluIGZpbGVfaW5mbyBidWYgdG8gYmUgcmV0dXJuZWQgYnkKLQkgKiBDSUZTU01CT3BlbiBhbmQgdGhlbiBjYWxsaW5nIGdldF9pbm9kZV9pbmZvIHdpdGggcmV0dXJuZWQgYnVmIHNpbmNlCisJICogb3BzLT5vcGVuIGFuZCB0aGVuIGNhbGxpbmcgZ2V0X2lub2RlX2luZm8gd2l0aCByZXR1cm5lZCBidWYgc2luY2UKIAkgKiBmaWxlIG1pZ2h0IGhhdmUgd3JpdGUgYmVoaW5kIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBmbHVzaGVkIGFuZCBzZXJ2ZXIKIAkgKiB2ZXJzaW9uIG9mIGZpbGUgc2l6ZSBjYW4gYmUgc3RhbGUuIElmIHdlIGtuZXcgZm9yIHN1cmUgdGhhdCBpbm9kZSB3YXMKIAkgKiBub3QgZGlydHkgbG9jYWxseSB3ZSBjb3VsZCBkbyB0aGlzLgpAQCAtMjA0Myw3ICsyMDQzLDggQEAKIAkJCX0KIAkJCXdkYXRhLT5waWQgPSB3ZGF0YS0+Y2ZpbGUtPnBpZDsKIAkJCXNlcnZlciA9IHRsaW5rX3Rjb24od2RhdGEtPmNmaWxlLT50bGluayktPnNlcy0+c2VydmVyOwotCQkJcmMgPSBzZXJ2ZXItPm9wcy0+YXN5bmNfd3JpdGV2KHdkYXRhKTsKKwkJCXJjID0gc2VydmVyLT5vcHMtPmFzeW5jX3dyaXRldih3ZGF0YSwKKwkJCQkJCQljaWZzX3dyaXRlZGF0YV9yZWxlYXNlKTsKIAkJfSB3aGlsZSAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwgJiYgcmMgPT0gLUVBR0FJTik7CiAKIAkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyArK2kpCkBAIC0yMzMxLDkgKzIzMzIsMjAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWNpZnNfdW5jYWNoZWRfd3JpdGV2X2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK2NpZnNfdW5jYWNoZWRfd3JpdGVkYXRhX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZmNvdW50KQogewogCWludCBpOworCXN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGEgPSBjb250YWluZXJfb2YocmVmY291bnQsCisJCQkJCXN0cnVjdCBjaWZzX3dyaXRlZGF0YSwgcmVmY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IHdkYXRhLT5ucl9wYWdlczsgaSsrKQorCQlwdXRfcGFnZSh3ZGF0YS0+cGFnZXNbaV0pOworCWNpZnNfd3JpdGVkYXRhX3JlbGVhc2UocmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZAorY2lmc191bmNhY2hlZF93cml0ZXZfY29tcGxldGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorewogCXN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGEgPSBjb250YWluZXJfb2Yod29yaywKIAkJCQkJc3RydWN0IGNpZnNfd3JpdGVkYXRhLCB3b3JrKTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gd2RhdGEtPmNmaWxlLT5kZW50cnktPmRfaW5vZGU7CkBAIC0yMzQ3LDEyICsyMzU5LDcgQEAKIAogCWNvbXBsZXRlKCZ3ZGF0YS0+ZG9uZSk7CiAKLQlpZiAod2RhdGEtPnJlc3VsdCAhPSAtRUFHQUlOKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB3ZGF0YS0+bnJfcGFnZXM7IGkrKykKLQkJCXB1dF9wYWdlKHdkYXRhLT5wYWdlc1tpXSk7Ci0JfQotCi0Ja3JlZl9wdXQoJndkYXRhLT5yZWZjb3VudCwgY2lmc193cml0ZWRhdGFfcmVsZWFzZSk7CisJa3JlZl9wdXQoJndkYXRhLT5yZWZjb3VudCwgY2lmc191bmNhY2hlZF93cml0ZWRhdGFfcmVsZWFzZSk7CiB9CiAKIC8qIGF0dGVtcHQgdG8gc2VuZCB3cml0ZSB0byBzZXJ2ZXIsIHJldHJ5IG9uIGFueSAtRUFHQUlOIGVycm9ycyAqLwpAQCAtMjM3MCw3ICsyMzc3LDggQEAKIAkJCWlmIChyYyAhPSAwKQogCQkJCWNvbnRpbnVlOwogCQl9Ci0JCXJjID0gc2VydmVyLT5vcHMtPmFzeW5jX3dyaXRldih3ZGF0YSk7CisJCXJjID0gc2VydmVyLT5vcHMtPmFzeW5jX3dyaXRldih3ZGF0YSwKKwkJCQkJICAgICAgIGNpZnNfdW5jYWNoZWRfd3JpdGVkYXRhX3JlbGVhc2UpOwogCX0gd2hpbGUgKHJjID09IC1FQUdBSU4pOwogCiAJcmV0dXJuIHJjOwpAQCAtMjQ1NCw3ICsyNDYyLDggQEAKIAkJd2RhdGEtPnRhaWxzeiA9IGN1cl9sZW4gLSAoKG5yX3BhZ2VzIC0gMSkgKiBQQUdFX1NJWkUpOwogCQlyYyA9IGNpZnNfdW5jYWNoZWRfcmV0cnlfd3JpdGV2KHdkYXRhKTsKIAkJaWYgKHJjKSB7Ci0JCQlrcmVmX3B1dCgmd2RhdGEtPnJlZmNvdW50LCBjaWZzX3dyaXRlZGF0YV9yZWxlYXNlKTsKKwkJCWtyZWZfcHV0KCZ3ZGF0YS0+cmVmY291bnQsCisJCQkJIGNpZnNfdW5jYWNoZWRfd3JpdGVkYXRhX3JlbGVhc2UpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjQ5Niw3ICsyNTA1LDcgQEAKIAkJCX0KIAkJfQogCQlsaXN0X2RlbF9pbml0KCZ3ZGF0YS0+bGlzdCk7Ci0JCWtyZWZfcHV0KCZ3ZGF0YS0+cmVmY291bnQsIGNpZnNfd3JpdGVkYXRhX3JlbGVhc2UpOworCQlrcmVmX3B1dCgmd2RhdGEtPnJlZmNvdW50LCBjaWZzX3VuY2FjaGVkX3dyaXRlZGF0YV9yZWxlYXNlKTsKIAl9CiAKIAlpZiAodG90YWxfd3JpdHRlbiA+IDApCkBAIC0yNTU5LDggKzI1NjgsOCBAQAogCWlmIChyYyA+IDApIHsKIAkJc3NpemVfdCBlcnI7CiAKLQkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIHBvcywgcmMpOwotCQlpZiAoZXJyIDwgMCAmJiByYyA+IDApCisJCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBpb2NiLT5raV9wb3MgLSByYywgcmMpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJjID0gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IDQ5NzE5YjguLmJlNThiOGYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTM4MywxMCArMzgzLDEwIEBACiAKIAkvKiBjaGVjayBmb3IgTWluc2hhbGwrRnJlbmNoIHN5bWxpbmtzICovCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NRl9TWU1MSU5LUykgewotCQlpbnQgdG1wcmMgPSBDSUZTQ2hlY2tNRlN5bWxpbmsoeGlkLCB0Y29uLCBjaWZzX3NiLCAmZmF0dHIsCi0JCQkJCSAgICAgICBmdWxsX3BhdGgpOworCQlpbnQgdG1wcmMgPSBjaGVja19tZl9zeW1saW5rKHhpZCwgdGNvbiwgY2lmc19zYiwgJmZhdHRyLAorCQkJCQkgICAgIGZ1bGxfcGF0aCk7CiAJCWlmICh0bXByYykKLQkJCWNpZnNfZGJnKEZZSSwgIkNJRlNDaGVja01GU3ltbGluazogJWRcbiIsIHRtcHJjKTsKKwkJCWNpZnNfZGJnKEZZSSwgImNoZWNrX21mX3N5bWxpbms6ICVkXG4iLCB0bXByYyk7CiAJfQogCiAJaWYgKCpwaW5vZGUgPT0gTlVMTCkgewpAQCAtNDA0LDE4ICs0MDQsMjAgQEAKIH0KIAogc3RhdGljIGludAotY2lmc19zZnVfdHlwZShzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgsCitjaWZzX3NmdV90eXBlKHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwgY29uc3QgY2hhciAqcGF0aCwKIAkgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCB1bnNpZ25lZCBpbnQgeGlkKQogewogCWludCByYzsKIAlpbnQgb3Bsb2NrID0gMDsKLQlfX3UxNiBuZXRmaWQ7CiAJc3RydWN0IHRjb25fbGluayAqdGxpbms7CiAJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc19maWQgZmlkOworCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOwogCXN0cnVjdCBjaWZzX2lvX3Bhcm1zIGlvX3Bhcm1zOwogCWNoYXIgYnVmWzI0XTsKIAl1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsKIAljaGFyICpwYnVmOworCWludCBidWZfdHlwZSA9IENJRlNfTk9fQlVGRkVSOwogCiAJcGJ1ZiA9IGJ1ZjsKIApAQCAtNDM2LDYyICs0MzgsNjkgQEAKIAkJcmV0dXJuIFBUUl9FUlIodGxpbmspOwogCXRjb24gPSB0bGlua190Y29uKHRsaW5rKTsKIAotCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIEdFTkVSSUNfUkVBRCwKLQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKLQkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQlpZiAocmMgPT0gMCkgewotCQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKLQkJCS8qIFJlYWQgaGVhZGVyICovCi0JCWlvX3Bhcm1zLm5ldGZpZCA9IG5ldGZpZDsKLQkJaW9fcGFybXMucGlkID0gY3VycmVudC0+dGdpZDsKLQkJaW9fcGFybXMudGNvbiA9IHRjb247Ci0JCWlvX3Bhcm1zLm9mZnNldCA9IDA7Ci0JCWlvX3Bhcm1zLmxlbmd0aCA9IDI0OwotCQlyYyA9IENJRlNTTUJSZWFkKHhpZCwgJmlvX3Bhcm1zLCAmYnl0ZXNfcmVhZCwgJnBidWYsCi0JCQkJICZidWZfdHlwZSk7Ci0JCWlmICgocmMgPT0gMCkgJiYgKGJ5dGVzX3JlYWQgPj0gOCkpIHsKLQkJCWlmIChtZW1jbXAoIkludHhCTEsiLCBwYnVmLCA4KSA9PSAwKSB7Ci0JCQkJY2lmc19kYmcoRllJLCAiQmxvY2sgZGV2aWNlXG4iKTsKLQkJCQlmYXR0ci0+Y2ZfbW9kZSB8PSBTX0lGQkxLOwotCQkJCWZhdHRyLT5jZl9kdHlwZSA9IERUX0JMSzsKLQkJCQlpZiAoYnl0ZXNfcmVhZCA9PSAyNCkgewotCQkJCQkvKiB3ZSBoYXZlIGVub3VnaCB0byBkZWNvZGUgZGV2IG51bSAqLwotCQkJCQlfX3U2NCBtanI7IC8qIG1ham9yICovCi0JCQkJCV9fdTY0IG1ucjsgLyogbWlub3IgKi8KLQkJCQkJbWpyID0gbGU2NF90b19jcHUoKihfX2xlNjQgKikocGJ1Zis4KSk7Ci0JCQkJCW1uciA9IGxlNjRfdG9fY3B1KCooX19sZTY0ICopKHBidWYrMTYpKTsKLQkJCQkJZmF0dHItPmNmX3JkZXYgPSBNS0RFVihtanIsIG1ucik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChtZW1jbXAoIkludHhDSFIiLCBwYnVmLCA4KSA9PSAwKSB7Ci0JCQkJY2lmc19kYmcoRllJLCAiQ2hhciBkZXZpY2VcbiIpOwotCQkJCWZhdHRyLT5jZl9tb2RlIHw9IFNfSUZDSFI7Ci0JCQkJZmF0dHItPmNmX2R0eXBlID0gRFRfQ0hSOwotCQkJCWlmIChieXRlc19yZWFkID09IDI0KSB7Ci0JCQkJCS8qIHdlIGhhdmUgZW5vdWdoIHRvIGRlY29kZSBkZXYgbnVtICovCi0JCQkJCV9fdTY0IG1qcjsgLyogbWFqb3IgKi8KLQkJCQkJX191NjQgbW5yOyAvKiBtaW5vciAqLwotCQkJCQltanIgPSBsZTY0X3RvX2NwdSgqKF9fbGU2NCAqKShwYnVmKzgpKTsKLQkJCQkJbW5yID0gbGU2NF90b19jcHUoKihfX2xlNjQgKikocGJ1ZisxNikpOwotCQkJCQlmYXR0ci0+Y2ZfcmRldiA9IE1LREVWKG1qciwgbW5yKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG1lbWNtcCgiSW50eExOSyIsIHBidWYsIDcpID09IDApIHsKLQkJCQljaWZzX2RiZyhGWUksICJTeW1saW5rXG4iKTsKLQkJCQlmYXR0ci0+Y2ZfbW9kZSB8PSBTX0lGTE5LOwotCQkJCWZhdHRyLT5jZl9kdHlwZSA9IERUX0xOSzsKLQkJCX0gZWxzZSB7Ci0JCQkJZmF0dHItPmNmX21vZGUgfD0gU19JRlJFRzsgLyogZmlsZT8gKi8KLQkJCQlmYXR0ci0+Y2ZfZHR5cGUgPSBEVF9SRUc7Ci0JCQkJcmMgPSAtRU9QTk9UU1VQUDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZhdHRyLT5jZl9tb2RlIHw9IFNfSUZSRUc7IC8qIHRoZW4gaXQgaXMgYSBmaWxlICovCi0JCQlmYXR0ci0+Y2ZfZHR5cGUgPSBEVF9SRUc7Ci0JCQlyYyA9IC1FT1BOT1RTVVBQOyAvKiBvciBzb21lIHVua25vd24gU0ZVIHR5cGUgKi8KLQkJfQotCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOworCW9wYXJtcy50Y29uID0gdGNvbjsKKwlvcGFybXMuY2lmc19zYiA9IGNpZnNfc2I7CisJb3Bhcm1zLmRlc2lyZWRfYWNjZXNzID0gR0VORVJJQ19SRUFEOworCW9wYXJtcy5jcmVhdGVfb3B0aW9ucyA9IENSRUFURV9OT1RfRElSOworCW9wYXJtcy5kaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlvcGFybXMucGF0aCA9IHBhdGg7CisJb3Bhcm1zLmZpZCA9ICZmaWQ7CisJb3Bhcm1zLnJlY29ubmVjdCA9IGZhbHNlOworCisJcmMgPSBDSUZTX29wZW4oeGlkLCAmb3Bhcm1zLCAmb3Bsb2NrLCBOVUxMKTsKKwlpZiAocmMpIHsKKwkJY2lmc19wdXRfdGxpbmsodGxpbmspOworCQlyZXR1cm4gcmM7CiAJfQorCisJLyogUmVhZCBoZWFkZXIgKi8KKwlpb19wYXJtcy5uZXRmaWQgPSBmaWQubmV0ZmlkOworCWlvX3Bhcm1zLnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJaW9fcGFybXMudGNvbiA9IHRjb247CisJaW9fcGFybXMub2Zmc2V0ID0gMDsKKwlpb19wYXJtcy5sZW5ndGggPSAyNDsKKworCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCAmaW9fcGFybXMsICZieXRlc19yZWFkLCAmcGJ1ZiwgJmJ1Zl90eXBlKTsKKwlpZiAoKHJjID09IDApICYmIChieXRlc19yZWFkID49IDgpKSB7CisJCWlmIChtZW1jbXAoIkludHhCTEsiLCBwYnVmLCA4KSA9PSAwKSB7CisJCQljaWZzX2RiZyhGWUksICJCbG9jayBkZXZpY2VcbiIpOworCQkJZmF0dHItPmNmX21vZGUgfD0gU19JRkJMSzsKKwkJCWZhdHRyLT5jZl9kdHlwZSA9IERUX0JMSzsKKwkJCWlmIChieXRlc19yZWFkID09IDI0KSB7CisJCQkJLyogd2UgaGF2ZSBlbm91Z2ggdG8gZGVjb2RlIGRldiBudW0gKi8KKwkJCQlfX3U2NCBtanI7IC8qIG1ham9yICovCisJCQkJX191NjQgbW5yOyAvKiBtaW5vciAqLworCQkJCW1qciA9IGxlNjRfdG9fY3B1KCooX19sZTY0ICopKHBidWYrOCkpOworCQkJCW1uciA9IGxlNjRfdG9fY3B1KCooX19sZTY0ICopKHBidWYrMTYpKTsKKwkJCQlmYXR0ci0+Y2ZfcmRldiA9IE1LREVWKG1qciwgbW5yKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtZW1jbXAoIkludHhDSFIiLCBwYnVmLCA4KSA9PSAwKSB7CisJCQljaWZzX2RiZyhGWUksICJDaGFyIGRldmljZVxuIik7CisJCQlmYXR0ci0+Y2ZfbW9kZSB8PSBTX0lGQ0hSOworCQkJZmF0dHItPmNmX2R0eXBlID0gRFRfQ0hSOworCQkJaWYgKGJ5dGVzX3JlYWQgPT0gMjQpIHsKKwkJCQkvKiB3ZSBoYXZlIGVub3VnaCB0byBkZWNvZGUgZGV2IG51bSAqLworCQkJCV9fdTY0IG1qcjsgLyogbWFqb3IgKi8KKwkJCQlfX3U2NCBtbnI7IC8qIG1pbm9yICovCisJCQkJbWpyID0gbGU2NF90b19jcHUoKihfX2xlNjQgKikocGJ1Zis4KSk7CisJCQkJbW5yID0gbGU2NF90b19jcHUoKihfX2xlNjQgKikocGJ1ZisxNikpOworCQkJCWZhdHRyLT5jZl9yZGV2ID0gTUtERVYobWpyLCBtbnIpOworCQkJfQorCQl9IGVsc2UgaWYgKG1lbWNtcCgiSW50eExOSyIsIHBidWYsIDcpID09IDApIHsKKwkJCWNpZnNfZGJnKEZZSSwgIlN5bWxpbmtcbiIpOworCQkJZmF0dHItPmNmX21vZGUgfD0gU19JRkxOSzsKKwkJCWZhdHRyLT5jZl9kdHlwZSA9IERUX0xOSzsKKwkJfSBlbHNlIHsKKwkJCWZhdHRyLT5jZl9tb2RlIHw9IFNfSUZSRUc7IC8qIGZpbGU/ICovCisJCQlmYXR0ci0+Y2ZfZHR5cGUgPSBEVF9SRUc7CisJCQlyYyA9IC1FT1BOT1RTVVBQOworCQl9CisJfSBlbHNlIHsKKwkJZmF0dHItPmNmX21vZGUgfD0gU19JRlJFRzsgLyogdGhlbiBpdCBpcyBhIGZpbGUgKi8KKwkJZmF0dHItPmNmX2R0eXBlID0gRFRfUkVHOworCQlyYyA9IC1FT1BOT1RTVVBQOyAvKiBvciBzb21lIHVua25vd24gU0ZVIHR5cGUgKi8KKwl9CisJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CiAJY2lmc19wdXRfdGxpbmsodGxpbmspOwogCXJldHVybiByYzsKIH0KQEAgLTUxOCwxMCArNTI3LDE1IEBACiAJCXJldHVybiBQVFJfRVJSKHRsaW5rKTsKIAl0Y29uID0gdGxpbmtfdGNvbih0bGluayk7CiAKLQlyYyA9IENJRlNTTUJRQWxsRUFzKHhpZCwgdGNvbiwgcGF0aCwgIlNFVEZJTEVCSVRTIiwKLQkJCSAgICBlYV92YWx1ZSwgNCAvKiBzaXplIG9mIGJ1ZiAqLywgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJICAgIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJaWYgKHRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnF1ZXJ5X2FsbF9FQXMgPT0gTlVMTCkgeworCQljaWZzX3B1dF90bGluayh0bGluayk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyYyA9IHRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnF1ZXJ5X2FsbF9FQXMoeGlkLCB0Y29uLCBwYXRoLAorCQkJIlNFVEZJTEVCSVRTIiwgZWFfdmFsdWUsIDQgLyogc2l6ZSBvZiBidWYgKi8sCisJCQljaWZzX3NiLT5sb2NhbF9ubHMsCisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAljaWZzX3B1dF90bGluayh0bGluayk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIChpbnQpcmM7CkBAIC04MDAsMTAgKzgxNCwxMCBAQAogCiAJLyogY2hlY2sgZm9yIE1pbnNoYWxsK0ZyZW5jaCBzeW1saW5rcyAqLwogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUZfU1lNTElOS1MpIHsKLQkJdG1wcmMgPSBDSUZTQ2hlY2tNRlN5bWxpbmsoeGlkLCB0Y29uLCBjaWZzX3NiLCAmZmF0dHIsCi0JCQkJCSAgIGZ1bGxfcGF0aCk7CisJCXRtcHJjID0gY2hlY2tfbWZfc3ltbGluayh4aWQsIHRjb24sIGNpZnNfc2IsICZmYXR0ciwKKwkJCQkJIGZ1bGxfcGF0aCk7CiAJCWlmICh0bXByYykKLQkJCWNpZnNfZGJnKEZZSSwgIkNJRlNDaGVja01GU3ltbGluazogJWRcbiIsIHRtcHJjKTsKKwkJCWNpZnNfZGJnKEZZSSwgImNoZWNrX21mX3N5bWxpbms6ICVkXG4iLCB0bXByYyk7CiAJfQogCiAJaWYgKCEqaW5vZGUpIHsKQEAgLTEwMzIsNyArMTA0Niw4IEBACiB7CiAJaW50IG9wbG9jayA9IDA7CiAJaW50IHJjOwotCV9fdTE2IG5ldGZpZDsKKwlzdHJ1Y3QgY2lmc19maWQgZmlkOworCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwpAQCAtMTA1NSwxMCArMTA3MCwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCi0JCQkgREVMRVRFfEZJTEVfV1JJVEVfQVRUUklCVVRFUywgQ1JFQVRFX05PVF9ESVIsCi0JCQkgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCW9wYXJtcy50Y29uID0gdGNvbjsKKwlvcGFybXMuY2lmc19zYiA9IGNpZnNfc2I7CisJb3Bhcm1zLmRlc2lyZWRfYWNjZXNzID0gREVMRVRFIHwgRklMRV9XUklURV9BVFRSSUJVVEVTOworCW9wYXJtcy5jcmVhdGVfb3B0aW9ucyA9IENSRUFURV9OT1RfRElSOworCW9wYXJtcy5kaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlvcGFybXMucGF0aCA9IGZ1bGxfcGF0aDsKKwlvcGFybXMuZmlkID0gJmZpZDsKKwlvcGFybXMucmVjb25uZWN0ID0gZmFsc2U7CisKKwlyYyA9IENJRlNfb3Blbih4aWQsICZvcGFybXMsICZvcGxvY2ssIE5VTEwpOwogCWlmIChyYyAhPSAwKQogCQlnb3RvIG91dDsKIApAQCAtMTA3OSw3ICsxMTAwLDcgQEAKIAkJCWdvdG8gb3V0X2Nsb3NlOwogCQl9CiAJCWluZm9fYnVmLT5BdHRyaWJ1dGVzID0gY3B1X3RvX2xlMzIoZG9zYXR0cik7Ci0JCXJjID0gQ0lGU1NNQlNldEZpbGVJbmZvKHhpZCwgdGNvbiwgaW5mb19idWYsIG5ldGZpZCwKKwkJcmMgPSBDSUZTU01CU2V0RmlsZUluZm8oeGlkLCB0Y29uLCBpbmZvX2J1ZiwgZmlkLm5ldGZpZCwKIAkJCQkJY3VycmVudC0+dGdpZCk7CiAJCS8qIGFsdGhvdWdoIHdlIHdvdWxkIGxpa2UgdG8gbWFyayB0aGUgZmlsZSBoaWRkZW4KICAJCSAgIGlmIHRoYXQgZmFpbHMgd2Ugd2lsbCBzdGlsbCB0cnkgdG8gcmVuYW1lIGl0ICovCkBAIC0xMDkwLDcgKzExMTEsOCBAQAogCX0KIAogCS8qIHJlbmFtZSB0aGUgZmlsZSAqLwotCXJjID0gQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgdGNvbiwgbmV0ZmlkLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJcmMgPSBDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCB0Y29uLCBmaWQubmV0ZmlkLCBOVUxMLAorCQkJCSAgIGNpZnNfc2ItPmxvY2FsX25scywKIAkJCQkgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCSAgICBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CiAJaWYgKHJjICE9IDApIHsKQEAgLTExMDAsNyArMTEyMiw3IEBACiAKIAkvKiB0cnkgdG8gc2V0IERFTEVURV9PTl9DTE9TRSAqLwogCWlmICghY2lmc0lub2RlLT5kZWxldGVfcGVuZGluZykgewotCQlyYyA9IENJRlNTTUJTZXRGaWxlRGlzcG9zaXRpb24oeGlkLCB0Y29uLCB0cnVlLCBuZXRmaWQsCisJCXJjID0gQ0lGU1NNQlNldEZpbGVEaXNwb3NpdGlvbih4aWQsIHRjb24sIHRydWUsIGZpZC5uZXRmaWQsCiAJCQkJCSAgICAgICBjdXJyZW50LT50Z2lkKTsKIAkJLyoKIAkJICogc29tZSBzYW1iYSB2ZXJzaW9ucyByZXR1cm4gLUVOT0VOVCB3aGVuIHdlIHRyeSB0byBzZXQgdGhlCkBAIC0xMTIwLDcgKzExNDIsNyBAQAogCX0KIAogb3V0X2Nsb3NlOgotCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIG5ldGZpZCk7CisJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CiBvdXQ6CiAJa2ZyZWUoaW5mb19idWYpOwogCWNpZnNfcHV0X3RsaW5rKHRsaW5rKTsKQEAgLTExMzIsMTMgKzExNTQsMTMgQEAKIAkgKiB0aGVtIGFueXdheS4KIAkgKi8KIHVuZG9fcmVuYW1lOgotCUNJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHRjb24sIG5ldGZpZCwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwlDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCB0Y29uLCBmaWQubmV0ZmlkLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgogCQkJCQkgICAgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogdW5kb19zZXRhdHRyOgogCWlmIChkb3NhdHRyICE9IG9yaWdhdHRyKSB7CiAJCWluZm9fYnVmLT5BdHRyaWJ1dGVzID0gY3B1X3RvX2xlMzIob3JpZ2F0dHIpOwotCQlpZiAoIUNJRlNTTUJTZXRGaWxlSW5mbyh4aWQsIHRjb24sIGluZm9fYnVmLCBuZXRmaWQsCisJCWlmICghQ0lGU1NNQlNldEZpbGVJbmZvKHhpZCwgdGNvbiwgaW5mb19idWYsIGZpZC5uZXRmaWQsCiAJCQkJCWN1cnJlbnQtPnRnaWQpKQogCQkJY2lmc0lub2RlLT5jaWZzQXR0cnMgPSBvcmlnYXR0cjsKIAl9CkBAIC0xNTQ5LDcgKzE1NzEsOCBAQAogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rOwogCXN0cnVjdCBjaWZzX3Rjb24gKnRjb247CiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyOwotCV9fdTE2IHNyY2ZpZDsKKwlzdHJ1Y3QgY2lmc19maWQgZmlkOworCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOwogCWludCBvcGxvY2ssIHJjOwogCiAJdGxpbmsgPSBjaWZzX3NiX3RsaW5rKGNpZnNfc2IpOwpAQCAtMTU3NiwxNyArMTU5OSwyMyBAQAogCWlmICh0b19kZW50cnktPmRfcGFyZW50ICE9IGZyb21fZGVudHJ5LT5kX3BhcmVudCkKIAkJZ290byBkb19yZW5hbWVfZXhpdDsKIAorCW9wYXJtcy50Y29uID0gdGNvbjsKKwlvcGFybXMuY2lmc19zYiA9IGNpZnNfc2I7CiAJLyogb3BlbiB0aGUgZmlsZSB0byBiZSByZW5hbWVkIC0tIHdlIG5lZWQgREVMRVRFIHBlcm1zICovCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZyb21fcGF0aCwgRklMRV9PUEVOLCBERUxFVEUsCi0JCQkgQ1JFQVRFX05PVF9ESVIsICZzcmNmaWQsICZvcGxvY2ssIE5VTEwsCi0JCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IERFTEVURTsKKwlvcGFybXMuY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKKwlvcGFybXMuZGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisJb3Bhcm1zLnBhdGggPSBmcm9tX3BhdGg7CisJb3Bhcm1zLmZpZCA9ICZmaWQ7CisJb3Bhcm1zLnJlY29ubmVjdCA9IGZhbHNlOworCisJcmMgPSBDSUZTX29wZW4oeGlkLCAmb3Bhcm1zLCAmb3Bsb2NrLCBOVUxMKTsKIAlpZiAocmMgPT0gMCkgewotCQlyYyA9IENJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHRjb24sIHNyY2ZpZCwKKwkJcmMgPSBDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCB0Y29uLCBmaWQubmV0ZmlkLAogCQkJCShjb25zdCBjaGFyICopIHRvX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgc3JjZmlkKTsKKwkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CiAJfQogZG9fcmVuYW1lX2V4aXQ6CiAJY2lmc19wdXRfdGxpbmsodGxpbmspOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9saW5rLmMgYi9mcy9jaWZzL2xpbmsuYwppbmRleCA5MmFlZTA4Li4yNjRlY2U3IDEwMDY0NAotLS0gYS9mcy9jaWZzL2xpbmsuYworKysgYi9mcy9jaWZzL2xpbmsuYwpAQCAtMjksNiArMjksMTAgQEAKICNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCiAjaW5jbHVkZSAiY2lmc19mc19zYi5oIgogCisvKgorICogTS1GIFN5bWxpbmsgRnVuY3Rpb25zIC0gQmVnaW4KKyAqLworCiAjZGVmaW5lIENJRlNfTUZfU1lNTElOS19MRU5fT0ZGU0VUICg0KzEpCiAjZGVmaW5lIENJRlNfTUZfU1lNTElOS19NRDVfT0ZGU0VUIChDSUZTX01GX1NZTUxJTktfTEVOX09GRlNFVCsoNCsxKSkKICNkZWZpbmUgQ0lGU19NRl9TWU1MSU5LX0xJTktfT0ZGU0VUIChDSUZTX01GX1NZTUxJTktfTUQ1X09GRlNFVCsoMzIrMSkpCkBAIC05MSwxMCArOTUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1DSUZTUGFyc2VNRlN5bWxpbmsoY29uc3QgdTggKmJ1ZiwKLQkJICAgdW5zaWduZWQgaW50IGJ1Zl9sZW4sCi0JCSAgIHVuc2lnbmVkIGludCAqX2xpbmtfbGVuLAotCQkgICBjaGFyICoqX2xpbmtfc3RyKQorcGFyc2VfbWZfc3ltbGluayhjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbiwgdW5zaWduZWQgaW50ICpfbGlua19sZW4sCisJCSBjaGFyICoqX2xpbmtfc3RyKQogewogCWludCByYzsKIAl1bnNpZ25lZCBpbnQgbGlua19sZW47CkBAIC0xMzcsNyArMTM5LDcgQEAKIH0KIAogc3RhdGljIGludAotQ0lGU0Zvcm1hdE1GU3ltbGluayh1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbiwgY29uc3QgY2hhciAqbGlua19zdHIpCitmb3JtYXRfbWZfc3ltbGluayh1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbiwgY29uc3QgY2hhciAqbGlua19zdHIpCiB7CiAJaW50IHJjOwogCXVuc2lnbmVkIGludCBsaW5rX2xlbjsKQEAgLTE4MCwxMjAgKzE4MiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1DSUZTQ3JlYXRlTUZTeW1MaW5rKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCSAgICBjb25zdCBjaGFyICpmcm9tTmFtZSwgY29uc3QgY2hhciAqdG9OYW1lLAotCQkgICAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKLXsKLQlpbnQgcmM7Ci0JaW50IG9wbG9jayA9IDA7Ci0JaW50IHJlbWFwOwotCWludCBjcmVhdGVfb3B0aW9ucyA9IENSRUFURV9OT1RfRElSOwotCV9fdTE2IG5ldGZpZCA9IDA7Ci0JdTggKmJ1ZjsKLQl1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0Jc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7Ci0Jc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlOwotCi0JbmxzX2NvZGVwYWdlID0gY2lmc19zYi0+bG9jYWxfbmxzOwotCXJlbWFwID0gY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUjsKLQotCWJ1ZiA9IGttYWxsb2MoQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmMgPSBDSUZTRm9ybWF0TUZTeW1saW5rKGJ1ZiwgQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRSwgdG9OYW1lKTsKLQlpZiAocmMgIT0gMCkgewotCQlrZnJlZShidWYpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQotCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOwotCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZyb21OYW1lLCBGSUxFX0NSRUFURSwgR0VORVJJQ19XUklURSwKLQkJCSBjcmVhdGVfb3B0aW9ucywgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKLQkJCSBubHNfY29kZXBhZ2UsIHJlbWFwKTsKLQlpZiAocmMgIT0gMCkgewotCQlrZnJlZShidWYpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaW9fcGFybXMubmV0ZmlkID0gbmV0ZmlkOwotCWlvX3Bhcm1zLnBpZCA9IGN1cnJlbnQtPnRnaWQ7Ci0JaW9fcGFybXMudGNvbiA9IHRjb247Ci0JaW9fcGFybXMub2Zmc2V0ID0gMDsKLQlpb19wYXJtcy5sZW5ndGggPSBDSUZTX01GX1NZTUxJTktfRklMRV9TSVpFOwotCi0JcmMgPSBDSUZTU01CV3JpdGUoeGlkLCAmaW9fcGFybXMsICZieXRlc193cml0dGVuLCBidWYsIE5VTEwsIDApOwotCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIG5ldGZpZCk7Ci0Ja2ZyZWUoYnVmKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotQ0lGU1F1ZXJ5TUZTeW1MaW5rKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsIGNoYXIgKipzeW1saW5raW5mbywKLQkJICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLCBpbnQgcmVtYXApCi17Ci0JaW50IHJjOwotCWludCBvcGxvY2sgPSAwOwotCV9fdTE2IG5ldGZpZCA9IDA7Ci0JdTggKmJ1ZjsKLQljaGFyICpwYnVmOwotCXVuc2lnbmVkIGludCBieXRlc19yZWFkID0gMDsKLQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKLQl1bnNpZ25lZCBpbnQgbGlua19sZW4gPSAwOwotCXN0cnVjdCBjaWZzX2lvX3Bhcm1zIGlvX3Bhcm1zOwotCUZJTEVfQUxMX0lORk8gZmlsZV9pbmZvOwotCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIHNlYXJjaE5hbWUsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAotCQkJIENSRUFURV9OT1RfRElSLCAmbmV0ZmlkLCAmb3Bsb2NrLCAmZmlsZV9pbmZvLAotCQkJIG5sc19jb2RlcGFnZSwgcmVtYXApOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoZmlsZV9pbmZvLkVuZE9mRmlsZSAhPSBjcHVfdG9fbGU2NChDSUZTX01GX1NZTUxJTktfRklMRV9TSVpFKSkgewotCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwotCQkvKiBpdCdzIG5vdCBhIHN5bWxpbmsgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYnVmID0ga21hbGxvYyhDSUZTX01GX1NZTUxJTktfRklMRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcGJ1ZiA9IGJ1ZjsKLQlpb19wYXJtcy5uZXRmaWQgPSBuZXRmaWQ7Ci0JaW9fcGFybXMucGlkID0gY3VycmVudC0+dGdpZDsKLQlpb19wYXJtcy50Y29uID0gdGNvbjsKLQlpb19wYXJtcy5vZmZzZXQgPSAwOwotCWlvX3Bhcm1zLmxlbmd0aCA9IENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkU7Ci0KLQlyYyA9IENJRlNTTUJSZWFkKHhpZCwgJmlvX3Bhcm1zLCAmYnl0ZXNfcmVhZCwgJnBidWYsICZidWZfdHlwZSk7Ci0JQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgbmV0ZmlkKTsKLQlpZiAocmMgIT0gMCkgewotCQlrZnJlZShidWYpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBDSUZTUGFyc2VNRlN5bWxpbmsoYnVmLCBieXRlc19yZWFkLCAmbGlua19sZW4sIHN5bWxpbmtpbmZvKTsKLQlrZnJlZShidWYpOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQogYm9vbAotQ0lGU0NvdWxkQmVNRlN5bWxpbmsoY29uc3Qgc3RydWN0IGNpZnNfZmF0dHIgKmZhdHRyKQorY291bGRiZV9tZl9zeW1saW5rKGNvbnN0IHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0cikKIHsKLQlpZiAoIShmYXR0ci0+Y2ZfbW9kZSAmIFNfSUZSRUcpKQorCWlmICghU19JU1JFRyhmYXR0ci0+Y2ZfbW9kZSkpCiAJCS8qIGl0J3Mgbm90IGEgc3ltbGluayAqLwogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTMwNCw2NiArMTk2LDgwIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWludAotb3Blbl9xdWVyeV9jbG9zZV9jaWZzX3N5bWxpbmsoY29uc3QgdW5zaWduZWQgY2hhciAqcGF0aCwgY2hhciAqcGJ1ZiwKLQkJCXVuc2lnbmVkIGludCAqcGJ5dGVzX3JlYWQsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCi0JCQl1bnNpZ25lZCBpbnQgeGlkKQorc3RhdGljIGludAorY3JlYXRlX21mX3N5bWxpbmsoY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKKwkJICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBjb25zdCBjaGFyICpmcm9tTmFtZSwKKwkJICBjb25zdCBjaGFyICp0b05hbWUpCiB7CiAJaW50IHJjOwotCWludCBvcGxvY2sgPSAwOwotCV9fdTE2IG5ldGZpZCA9IDA7Ci0Jc3RydWN0IHRjb25fbGluayAqdGxpbms7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqcHRjb247Ci0Jc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7Ci0JaW50IGJ1Zl90eXBlID0gQ0lGU19OT19CVUZGRVI7Ci0JRklMRV9BTExfSU5GTyBmaWxlX2luZm87CisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CiAKLQl0bGluayA9IGNpZnNfc2JfdGxpbmsoY2lmc19zYik7Ci0JaWYgKElTX0VSUih0bGluaykpCi0JCXJldHVybiBQVFJfRVJSKHRsaW5rKTsKLQlwdGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOworCWJ1ZiA9IGttYWxsb2MoQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOwogCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIEdFTkVSSUNfUkVBRCwKLQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgJmZpbGVfaW5mbywKLQkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQlpZiAocmMgIT0gMCkgewotCQljaWZzX3B1dF90bGluayh0bGluayk7Ci0JCXJldHVybiByYzsKLQl9CisJcmMgPSBmb3JtYXRfbWZfc3ltbGluayhidWYsIENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkUsIHRvTmFtZSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKIAotCWlmIChmaWxlX2luZm8uRW5kT2ZGaWxlICE9IGNwdV90b19sZTY0KENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkUpKSB7Ci0JCUNJRlNTTUJDbG9zZSh4aWQsIHB0Y29uLCBuZXRmaWQpOwotCQljaWZzX3B1dF90bGluayh0bGluayk7Ci0JCS8qIGl0J3Mgbm90IGEgc3ltbGluayAqLwotCQlyZXR1cm4gcmM7Ci0JfQorCXJjID0gdGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+Y3JlYXRlX21mX3N5bWxpbmsoeGlkLCB0Y29uLCBjaWZzX3NiLAorCQkJCQlmcm9tTmFtZSwgYnVmLCAmYnl0ZXNfd3JpdHRlbik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKIAotCWlvX3Bhcm1zLm5ldGZpZCA9IG5ldGZpZDsKLQlpb19wYXJtcy5waWQgPSBjdXJyZW50LT50Z2lkOwotCWlvX3Bhcm1zLnRjb24gPSBwdGNvbjsKLQlpb19wYXJtcy5vZmZzZXQgPSAwOwotCWlvX3Bhcm1zLmxlbmd0aCA9IENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkU7Ci0KLQlyYyA9IENJRlNTTUJSZWFkKHhpZCwgJmlvX3Bhcm1zLCBwYnl0ZXNfcmVhZCwgJnBidWYsICZidWZfdHlwZSk7Ci0JQ0lGU1NNQkNsb3NlKHhpZCwgcHRjb24sIG5ldGZpZCk7Ci0JY2lmc19wdXRfdGxpbmsodGxpbmspOworCWlmIChieXRlc193cml0dGVuICE9IENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkUpCisJCXJjID0gLUVJTzsKK291dDoKKwlrZnJlZShidWYpOwogCXJldHVybiByYzsKIH0KIAotCi1pbnQKLUNJRlNDaGVja01GU3ltbGluayh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQkgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgpCitzdGF0aWMgaW50CitxdWVyeV9tZl9zeW1saW5rKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCisJCSBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwYXRoLAorCQkgY2hhciAqKnN5bWxpbmtpbmZvKQogewogCWludCByYzsKIAl1OCAqYnVmID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgbGlua19sZW4gPSAwOwogCXVuc2lnbmVkIGludCBieXRlc19yZWFkID0gMDsKIAotCWlmICghQ0lGU0NvdWxkQmVNRlN5bWxpbmsoZmF0dHIpKQorCWJ1ZiA9IGttYWxsb2MoQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnF1ZXJ5X21mX3N5bWxpbmspCisJCXJjID0gdGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+cXVlcnlfbWZfc3ltbGluayh4aWQsIHRjb24sCisJCQkJCSAgICAgIGNpZnNfc2IsIHBhdGgsIGJ1ZiwgJmJ5dGVzX3JlYWQpOworCWVsc2UKKwkJcmMgPSAtRU5PU1lTOworCisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCWlmIChieXRlc19yZWFkID09IDApIHsgLyogbm90IGEgc3ltbGluayAqLworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcGFyc2VfbWZfc3ltbGluayhidWYsIGJ5dGVzX3JlYWQsICZsaW5rX2xlbiwgc3ltbGlua2luZm8pOworb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitpbnQKK2NoZWNrX21mX3N5bWxpbmsodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKKwkJIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgpCit7CisJaW50IHJjOworCXU4ICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGludCBsaW5rX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOworCisJaWYgKCFjb3VsZGJlX21mX3N5bWxpbmsoZmF0dHIpKQogCQkvKiBpdCdzIG5vdCBhIHN5bWxpbmsgKi8KIAkJcmV0dXJuIDA7CiAKQEAgLTM3Miw4ICsyNzgsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+b3BzLT5xdWVyeV9tZl9zeW1saW5rKQotCQlyYyA9IHRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnF1ZXJ5X21mX3N5bWxpbmsocGF0aCwgYnVmLAotCQkJCQkJJmJ5dGVzX3JlYWQsIGNpZnNfc2IsIHhpZCk7CisJCXJjID0gdGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+cXVlcnlfbWZfc3ltbGluayh4aWQsIHRjb24sCisJCQkJCSAgICAgIGNpZnNfc2IsIHBhdGgsIGJ1ZiwgJmJ5dGVzX3JlYWQpOwogCWVsc2UKIAkJcmMgPSAtRU5PU1lTOwogCkBAIC0zODMsNyArMjg5LDcgQEAKIAlpZiAoYnl0ZXNfcmVhZCA9PSAwKSAvKiBub3QgYSBzeW1saW5rICovCiAJCWdvdG8gb3V0OwogCi0JcmMgPSBDSUZTUGFyc2VNRlN5bWxpbmsoYnVmLCBieXRlc19yZWFkLCAmbGlua19sZW4sIE5VTEwpOworCXJjID0gcGFyc2VfbWZfc3ltbGluayhidWYsIGJ5dGVzX3JlYWQsICZsaW5rX2xlbiwgTlVMTCk7CiAJaWYgKHJjID09IC1FSU5WQUwpIHsKIAkJLyogaXQncyBub3QgYSBzeW1saW5rICovCiAJCXJjID0gMDsKQEAgLTQwMyw2ICszMDksOTUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qCisgKiBTTUIgMS4wIFByb3RvY29sIHNwZWNpZmljIGZ1bmN0aW9ucworICovCisKK2ludAorY2lmc19xdWVyeV9tZl9zeW1saW5rKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCisJCSAgICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgsCisJCSAgICAgIGNoYXIgKnBidWYsIHVuc2lnbmVkIGludCAqcGJ5dGVzX3JlYWQpCit7CisJaW50IHJjOworCWludCBvcGxvY2sgPSAwOworCXN0cnVjdCBjaWZzX2ZpZCBmaWQ7CisJc3RydWN0IGNpZnNfb3Blbl9wYXJtcyBvcGFybXM7CisJc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7CisJaW50IGJ1Zl90eXBlID0gQ0lGU19OT19CVUZGRVI7CisJRklMRV9BTExfSU5GTyBmaWxlX2luZm87CisKKwlvcGFybXMudGNvbiA9IHRjb247CisJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKKwlvcGFybXMuY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKKwlvcGFybXMuZGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisJb3Bhcm1zLnBhdGggPSBwYXRoOworCW9wYXJtcy5maWQgPSAmZmlkOworCW9wYXJtcy5yZWNvbm5lY3QgPSBmYWxzZTsKKworCXJjID0gQ0lGU19vcGVuKHhpZCwgJm9wYXJtcywgJm9wbG9jaywgJmZpbGVfaW5mbyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoZmlsZV9pbmZvLkVuZE9mRmlsZSAhPSBjcHVfdG9fbGU2NChDSUZTX01GX1NZTUxJTktfRklMRV9TSVpFKSkKKwkJLyogaXQncyBub3QgYSBzeW1saW5rICovCisJCWdvdG8gb3V0OworCisJaW9fcGFybXMubmV0ZmlkID0gZmlkLm5ldGZpZDsKKwlpb19wYXJtcy5waWQgPSBjdXJyZW50LT50Z2lkOworCWlvX3Bhcm1zLnRjb24gPSB0Y29uOworCWlvX3Bhcm1zLm9mZnNldCA9IDA7CisJaW9fcGFybXMubGVuZ3RoID0gQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRTsKKworCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCAmaW9fcGFybXMsIHBieXRlc19yZWFkLCAmcGJ1ZiwgJmJ1Zl90eXBlKTsKK291dDoKKwlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQubmV0ZmlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc19jcmVhdGVfbWZfc3ltbGluayh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAorCQkgICAgICAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgY29uc3QgdW5zaWduZWQgY2hhciAqcGF0aCwKKwkJICAgICAgIGNoYXIgKnBidWYsIHVuc2lnbmVkIGludCAqcGJ5dGVzX3dyaXR0ZW4pCit7CisJaW50IHJjOworCWludCBvcGxvY2sgPSAwOworCXN0cnVjdCBjaWZzX2ZpZCBmaWQ7CisJc3RydWN0IGNpZnNfb3Blbl9wYXJtcyBvcGFybXM7CisJc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7CisJaW50IGNyZWF0ZV9vcHRpb25zID0gQ1JFQVRFX05PVF9ESVI7CisKKwlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCisJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CisKKwlvcGFybXMudGNvbiA9IHRjb247CisJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IEdFTkVSSUNfV1JJVEU7CisJb3Bhcm1zLmNyZWF0ZV9vcHRpb25zID0gY3JlYXRlX29wdGlvbnM7CisJb3Bhcm1zLmRpc3Bvc2l0aW9uID0gRklMRV9PUEVOOworCW9wYXJtcy5wYXRoID0gcGF0aDsKKwlvcGFybXMuZmlkID0gJmZpZDsKKwlvcGFybXMucmVjb25uZWN0ID0gZmFsc2U7CisKKwlyYyA9IENJRlNfb3Blbih4aWQsICZvcGFybXMsICZvcGxvY2ssIE5VTEwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaW9fcGFybXMubmV0ZmlkID0gZmlkLm5ldGZpZDsKKwlpb19wYXJtcy5waWQgPSBjdXJyZW50LT50Z2lkOworCWlvX3Bhcm1zLnRjb24gPSB0Y29uOworCWlvX3Bhcm1zLm9mZnNldCA9IDA7CisJaW9fcGFybXMubGVuZ3RoID0gQ0lGU19NRl9TWU1MSU5LX0ZJTEVfU0laRTsKKworCXJjID0gQ0lGU1NNQldyaXRlKHhpZCwgJmlvX3Bhcm1zLCBwYnl0ZXNfd3JpdHRlbiwgcGJ1ZiwgTlVMTCwgMCk7CisJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogTS1GIFN5bWxpbmsgRnVuY3Rpb25zIC0gRW5kCisgKi8KKwogaW50CiBjaWZzX2hhcmRsaW5rKHN0cnVjdCBkZW50cnkgKm9sZF9maWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCSAgICAgIHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KQpAQCAtNDM4LDggKzQzMywxMCBAQAogCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCWVsc2UgewogCQlzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKLQkJaWYgKCFzZXJ2ZXItPm9wcy0+Y3JlYXRlX2hhcmRsaW5rKQotCQkJcmV0dXJuIC1FTk9TWVM7CisJCWlmICghc2VydmVyLT5vcHMtPmNyZWF0ZV9oYXJkbGluaykgeworCQkJcmMgPSAtRU5PU1lTOworCQkJZ290byBjaWZzX2hsX2V4aXQ7CisJCX0KIAkJcmMgPSBzZXJ2ZXItPm9wcy0+Y3JlYXRlX2hhcmRsaW5rKHhpZCwgdGNvbiwgZnJvbV9uYW1lLCB0b19uYW1lLAogCQkJCQkJICBjaWZzX3NiKTsKIAkJaWYgKChyYyA9PSAtRUlPKSB8fCAocmMgPT0gLUVJTlZBTCkpCkBAIC01MzAsMTUgKzUyNywxMCBAQAogCSAqIGFuZCBmYWxsYmFjayB0byBVTklYIEV4dGVuc2lvbnMgU3ltbGlua3MuCiAJICovCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NRl9TWU1MSU5LUykKLQkJcmMgPSBDSUZTUXVlcnlNRlN5bUxpbmsoeGlkLCB0Y29uLCBmdWxsX3BhdGgsICZ0YXJnZXRfcGF0aCwKLQkJCQkJY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCXJjID0gcXVlcnlfbWZfc3ltbGluayh4aWQsIHRjb24sIGNpZnNfc2IsIGZ1bGxfcGF0aCwKKwkJCQkgICAgICAmdGFyZ2V0X3BhdGgpOwogCi0JaWYgKChyYyAhPSAwKSAmJiBjYXBfdW5peCh0Y29uLT5zZXMpKQotCQlyYyA9IENJRlNTTUJVbml4UXVlcnlTeW1MaW5rKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCAmdGFyZ2V0X3BhdGgsCi0JCQkJCSAgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKLQllbHNlIGlmIChyYyAhPSAwICYmIHNlcnZlci0+b3BzLT5xdWVyeV9zeW1saW5rKQorCWlmIChyYyAhPSAwICYmIHNlcnZlci0+b3BzLT5xdWVyeV9zeW1saW5rKQogCQlyYyA9IHNlcnZlci0+b3BzLT5xdWVyeV9zeW1saW5rKHhpZCwgdGNvbiwgZnVsbF9wYXRoLAogCQkJCQkJJnRhcmdldF9wYXRoLCBjaWZzX3NiKTsKIApAQCAtNTg3LDggKzU3OSw3IEBACiAKIAkvKiBCQiB3aGF0IGlmIERGUyBhbmQgdGhpcyB2b2x1bWUgaXMgb24gZGlmZmVyZW50IHNoYXJlPyBCQiAqLwogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUZfU1lNTElOS1MpCi0JCXJjID0gQ0lGU0NyZWF0ZU1GU3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsIHN5bW5hbWUsCi0JCQkJCWNpZnNfc2IpOworCQlyYyA9IGNyZWF0ZV9tZl9zeW1saW5rKHhpZCwgcFRjb24sIGNpZnNfc2IsIGZ1bGxfcGF0aCwgc3ltbmFtZSk7CiAJZWxzZSBpZiAocFRjb24tPnVuaXhfZXh0KQogCQlyYyA9IENJRlNVbml4Q3JlYXRlU3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsIHN5bW5hbWUsCiAJCQkJCSAgIGNpZnNfc2ItPmxvY2FsX25scyk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IDU5NDBlY2EuLmIxNTg2MmUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC03NDksNyArNzQ5LDcgQEAKIAl9CiAKIAlpZiAoKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NRl9TWU1MSU5LUykgJiYKLQkgICAgQ0lGU0NvdWxkQmVNRlN5bWxpbmsoJmZhdHRyKSkKKwkgICAgY291bGRiZV9tZl9zeW1saW5rKCZmYXR0cikpCiAJCS8qCiAJCSAqIHRyeWluZyB0byBnZXQgdGhlIHR5cGUgYW5kIG1vZGUgY2FuIGJlIHNsb3csCiAJCSAqIHNvIGp1c3QgY2FsbCB0aG9zZSByZWd1bGFyIGZpbGVzIGZvciBub3csIGFuZCBtYXJrCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYjFvcHMuYyBiL2ZzL2NpZnMvc21iMW9wcy5jCmluZGV4IDVmNWJhMGQuLmJmZDY2ZDggMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc21iMW9wcy5jCisrKyBiL2ZzL2NpZnMvc21iMW9wcy5jCkBAIC01NjAsMTcgKzU2MCwyNCBAQAogCWlmICghcmMgJiYgKGxlMzJfdG9fY3B1KGRhdGEtPkF0dHJpYnV0ZXMpICYgQVRUUl9SRVBBUlNFKSkgewogCQlpbnQgdG1wcmM7CiAJCWludCBvcGxvY2sgPSAwOwotCQlfX3UxNiBuZXRmaWQ7CisJCXN0cnVjdCBjaWZzX2ZpZCBmaWQ7CisJCXN0cnVjdCBjaWZzX29wZW5fcGFybXMgb3Bhcm1zOworCisJCW9wYXJtcy50Y29uID0gdGNvbjsKKwkJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCQlvcGFybXMuZGVzaXJlZF9hY2Nlc3MgPSBGSUxFX1JFQURfQVRUUklCVVRFUzsKKwkJb3Bhcm1zLmNyZWF0ZV9vcHRpb25zID0gMDsKKwkJb3Bhcm1zLmRpc3Bvc2l0aW9uID0gRklMRV9PUEVOOworCQlvcGFybXMucGF0aCA9IGZ1bGxfcGF0aDsKKwkJb3Bhcm1zLmZpZCA9ICZmaWQ7CisJCW9wYXJtcy5yZWNvbm5lY3QgPSBmYWxzZTsKIAogCQkvKiBOZWVkIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSBzeW1ib2xpYyBsaW5rIG9yIG5vdCAqLwotCQl0bXByYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCi0JCQkJICAgIEZJTEVfUkVBRF9BVFRSSUJVVEVTLCAwLCAmbmV0ZmlkLCAmb3Bsb2NrLAotCQkJCSAgICBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJdG1wcmMgPSBDSUZTX29wZW4oeGlkLCAmb3Bhcm1zLCAmb3Bsb2NrLCBOVUxMKTsKIAkJaWYgKHRtcHJjID09IC1FT1BOT1RTVVBQKQogCQkJKnN5bWxpbmsgPSB0cnVlOwogCQllbHNlCi0JCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOworCQkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCk7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtNzA1LDEyICs3MTIsNyBAQAogCQkJCSAgICAgb3Bhcm1zLT5jaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQkJICAgICBvcGFybXMtPmNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzCiAJCQkJCQkmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQlyZXR1cm4gQ0lGU1NNQk9wZW4oeGlkLCBvcGFybXMtPnRjb24sIG9wYXJtcy0+cGF0aCwKLQkJCSAgIG9wYXJtcy0+ZGlzcG9zaXRpb24sIG9wYXJtcy0+ZGVzaXJlZF9hY2Nlc3MsCi0JCQkgICBvcGFybXMtPmNyZWF0ZV9vcHRpb25zLCAmb3Bhcm1zLT5maWQtPm5ldGZpZCwgb3Bsb2NrLAotCQkJICAgYnVmLCBvcGFybXMtPmNpZnNfc2ItPmxvY2FsX25scywKLQkJCSAgIG9wYXJtcy0+Y2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCXJldHVybiBDSUZTX29wZW4oeGlkLCBvcGFybXMsIG9wbG9jaywgYnVmKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTc2MSw4ICs3NjMsOSBAQAogewogCWludCBvcGxvY2sgPSAwOwogCWludCByYzsKLQlfX3UxNiBuZXRmaWQ7CiAJX191MzIgbmV0cGlkOworCXN0cnVjdCBjaWZzX2ZpZCBmaWQ7CisJc3RydWN0IGNpZnNfb3Blbl9wYXJtcyBvcGFybXM7CiAJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koaW5vZGUpOwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKQEAgLTc3Miw3ICs3NzUsNyBAQAogCS8qIGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgb3BlbiBmb3Igd3JpdGUsIGp1c3QgdXNlIHRoYXQgZmlsZWlkICovCiAJb3Blbl9maWxlID0gZmluZF93cml0YWJsZV9maWxlKGNpbm9kZSwgdHJ1ZSk7CiAJaWYgKG9wZW5fZmlsZSkgewotCQluZXRmaWQgPSBvcGVuX2ZpbGUtPmZpZC5uZXRmaWQ7CisJCWZpZC5uZXRmaWQgPSBvcGVuX2ZpbGUtPmZpZC5uZXRmaWQ7CiAJCW5ldHBpZCA9IG9wZW5fZmlsZS0+cGlkOwogCQl0Y29uID0gdGxpbmtfdGNvbihvcGVuX2ZpbGUtPnRsaW5rKTsKIAkJZ290byBzZXRfdmlhX2ZpbGVoYW5kbGU7CkBAIC03OTYsMTIgKzc5OSwxNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljaWZzX2RiZyhGWUksICJjYWxsaW5nIFNldEZpbGVJbmZvIHNpbmNlIFNldFBhdGhJbmZvIGZvciB0aW1lcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyXG4iKTsKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCi0JCQkgU1lOQ0hST05JWkUgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMsIENSRUFURV9OT1RfRElSLAotCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlvcGFybXMudGNvbiA9IHRjb247CisJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IFNZTkNIUk9OSVpFIHwgRklMRV9XUklURV9BVFRSSUJVVEVTOworCW9wYXJtcy5jcmVhdGVfb3B0aW9ucyA9IENSRUFURV9OT1RfRElSOworCW9wYXJtcy5kaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlvcGFybXMucGF0aCA9IGZ1bGxfcGF0aDsKKwlvcGFybXMuZmlkID0gJmZpZDsKKwlvcGFybXMucmVjb25uZWN0ID0gZmFsc2U7CiAKKwljaWZzX2RiZyhGWUksICJjYWxsaW5nIFNldEZpbGVJbmZvIHNpbmNlIFNldFBhdGhJbmZvIGZvciB0aW1lcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyXG4iKTsKKwlyYyA9IENJRlNfb3Blbih4aWQsICZvcGFybXMsICZvcGxvY2ssIE5VTEwpOwogCWlmIChyYyAhPSAwKSB7CiAJCWlmIChyYyA9PSAtRUlPKQogCQkJcmMgPSAtRUlOVkFMOwpAQCAtODExLDEyICs4MTksMTIgQEAKIAluZXRwaWQgPSBjdXJyZW50LT50Z2lkOwogCiBzZXRfdmlhX2ZpbGVoYW5kbGU6Ci0JcmMgPSBDSUZTU01CU2V0RmlsZUluZm8oeGlkLCB0Y29uLCBidWYsIG5ldGZpZCwgbmV0cGlkKTsKKwlyYyA9IENJRlNTTUJTZXRGaWxlSW5mbyh4aWQsIHRjb24sIGJ1ZiwgZmlkLm5ldGZpZCwgbmV0cGlkKTsKIAlpZiAoIXJjKQogCQljaW5vZGUtPmNpZnNBdHRycyA9IGxlMzJfdG9fY3B1KGJ1Zi0+QXR0cmlidXRlcyk7CiAKIAlpZiAob3Blbl9maWxlID09IE5VTEwpCi0JCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIG5ldGZpZCk7CisJCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIGZpZC5uZXRmaWQpOwogCWVsc2UKIAkJY2lmc0ZpbGVJbmZvX3B1dChvcGVuX2ZpbGUpOwogb3V0OgpAQCAtOTA4LDMzICs5MTYsODAgQEAKIH0KIAogc3RhdGljIGludAorY2lmc191bml4X2Rmc19yZWFkbGluayhjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwgY2hhciAqKnN5bWxpbmtpbmZvLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IG51bV9yZWZlcnJhbHMgPSAwOworCXN0cnVjdCBkZnNfaW5mbzNfcGFyYW0gKnJlZmVycmFscyA9IE5VTEw7CisKKwlyYyA9IGdldF9kZnNfcGF0aCh4aWQsIHRjb24tPnNlcywgc2VhcmNoTmFtZSwgbmxzX2NvZGVwYWdlLAorCQkJICAmbnVtX3JlZmVycmFscywgJnJlZmVycmFscywgMCk7CisKKwlpZiAoIXJjICYmIG51bV9yZWZlcnJhbHMgPiAwKSB7CisJCSpzeW1saW5raW5mbyA9IGtzdHJuZHVwKHJlZmVycmFscy0+bm9kZV9uYW1lLAorCQkJCQlzdHJsZW4ocmVmZXJyYWxzLT5ub2RlX25hbWUpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCEqc3ltbGlua2luZm8pCisJCQlyYyA9IC1FTk9NRU07CisJCWZyZWVfZGZzX2luZm9fYXJyYXkocmVmZXJyYWxzLCBudW1fcmVmZXJyYWxzKTsKKwl9CisJcmV0dXJuIHJjOworI2Vsc2UgLyogTm8gREZTIHN1cHBvcnQgKi8KKwlyZXR1cm4gLUVSRU1PVEU7CisjZW5kaWYKK30KKworc3RhdGljIGludAogY2lmc19xdWVyeV9zeW1saW5rKGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCSAgIGNvbnN0IGNoYXIgKmZ1bGxfcGF0aCwgY2hhciAqKnRhcmdldF9wYXRoLAogCQkgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQogewogCWludCByYzsKIAlpbnQgb3Bsb2NrID0gMDsKLQlfX3UxNiBuZXRmaWQ7CisJc3RydWN0IGNpZnNfZmlkIGZpZDsKKwlzdHJ1Y3QgY2lmc19vcGVuX3Bhcm1zIG9wYXJtczsKIAogCWNpZnNfZGJnKEZZSSwgIiVzOiBwYXRoOiAlc1xuIiwgX19mdW5jX18sIGZ1bGxfcGF0aCk7CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCi0JCQkgRklMRV9SRUFEX0FUVFJJQlVURVMsIE9QRU5fUkVQQVJTRV9QT0lOVCwgJm5ldGZpZCwKLQkJCSAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJLyogQ2hlY2sgZm9yIHVuaXggZXh0ZW5zaW9ucyAqLworCWlmIChjYXBfdW5peCh0Y29uLT5zZXMpKSB7CisJCXJjID0gQ0lGU1NNQlVuaXhRdWVyeVN5bUxpbmsoeGlkLCB0Y29uLCBmdWxsX3BhdGgsIHRhcmdldF9wYXRoLAorCQkJCQkgICAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCWlmIChyYyA9PSAtRVJFTU9URSkKKwkJCXJjID0gY2lmc191bml4X2Rmc19yZWFkbGluayh4aWQsIHRjb24sIGZ1bGxfcGF0aCwKKwkJCQkJCSAgICB0YXJnZXRfcGF0aCwKKwkJCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOwogCi0JcmMgPSBDSUZTU01CUXVlcnlTeW1MaW5rKHhpZCwgdGNvbiwgbmV0ZmlkLCB0YXJnZXRfcGF0aCwKLQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzKTsKLQlpZiAocmMpIHsKLQkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgbmV0ZmlkKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAl9CiAKKwlvcGFybXMudGNvbiA9IHRjb247CisJb3Bhcm1zLmNpZnNfc2IgPSBjaWZzX3NiOworCW9wYXJtcy5kZXNpcmVkX2FjY2VzcyA9IEZJTEVfUkVBRF9BVFRSSUJVVEVTOworCW9wYXJtcy5jcmVhdGVfb3B0aW9ucyA9IE9QRU5fUkVQQVJTRV9QT0lOVDsKKwlvcGFybXMuZGlzcG9zaXRpb24gPSBGSUxFX09QRU47CisJb3Bhcm1zLnBhdGggPSBmdWxsX3BhdGg7CisJb3Bhcm1zLmZpZCA9ICZmaWQ7CisJb3Bhcm1zLnJlY29ubmVjdCA9IGZhbHNlOworCisJcmMgPSBDSUZTX29wZW4oeGlkLCAmb3Bhcm1zLCAmb3Bsb2NrLCBOVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJcmMgPSBDSUZTU01CUXVlcnlTeW1MaW5rKHhpZCwgdGNvbiwgZmlkLm5ldGZpZCwgdGFyZ2V0X3BhdGgsCisJCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9jbG9zZTsKKwogCWNvbnZlcnRfZGVsaW1pdGVyKCp0YXJnZXRfcGF0aCwgJy8nKTsKLQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwotCWNpZnNfZGJnKEZZSSwgIiVzOiB0YXJnZXQgcGF0aDogJXNcbiIsIF9fZnVuY19fLCAqdGFyZ2V0X3BhdGgpOworb3V0X2Nsb3NlOgorCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIGZpZC5uZXRmaWQpOworb3V0OgorCWlmICghcmMpCisJCWNpZnNfZGJnKEZZSSwgIiVzOiB0YXJnZXQgcGF0aDogJXNcbiIsIF9fZnVuY19fLCAqdGFyZ2V0X3BhdGgpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTAwOSw4ICsxMDY0LDE3IEBACiAJLm1hbmRfbG9jayA9IGNpZnNfbWFuZF9sb2NrLAogCS5tYW5kX3VubG9ja19yYW5nZSA9IGNpZnNfdW5sb2NrX3JhbmdlLAogCS5wdXNoX21hbmRfbG9ja3MgPSBjaWZzX3B1c2hfbWFuZGF0b3J5X2xvY2tzLAotCS5xdWVyeV9tZl9zeW1saW5rID0gb3Blbl9xdWVyeV9jbG9zZV9jaWZzX3N5bWxpbmssCisJLnF1ZXJ5X21mX3N5bWxpbmsgPSBjaWZzX3F1ZXJ5X21mX3N5bWxpbmssCisJLmNyZWF0ZV9tZl9zeW1saW5rID0gY2lmc19jcmVhdGVfbWZfc3ltbGluaywKIAkuaXNfcmVhZF9vcCA9IGNpZnNfaXNfcmVhZF9vcCwKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCS5xdWVyeV9hbGxfRUFzID0gQ0lGU1NNQlFBbGxFQXMsCisJLnNldF9FQSA9IENJRlNTTUJTZXRFQSwKKyNlbmRpZiAvKiBDSUZTX1hBVFRSICovCisjaWZkZWYgQ09ORklHX0NJRlNfQUNMCisJLmdldF9hY2wgPSBnZXRfY2lmc19hY2wsCisJLnNldF9hY2wgPSBzZXRfY2lmc19hY2wsCisjZW5kaWYgLyogQ0lGU19BQ0wgKi8KIH07CiAKIHN0cnVjdCBzbWJfdmVyc2lvbl92YWx1ZXMgc21iMV92YWx1ZXMgPSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYjJwZHUuYyBiL2ZzL2NpZnMvc21iMnBkdS5jCmluZGV4IDIwMTMyMzQuLmEzZjdhOWMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc21iMnBkdS5jCisrKyBiL2ZzL2NpZnMvc21iMnBkdS5jCkBAIC0xODkwLDcgKzE4OTAsOCBAQAogCiAvKiBzbWIyX2FzeW5jX3dyaXRldiAtIHNlbmQgYW4gYXN5bmMgd3JpdGUsIGFuZCBzZXQgdXAgbWlkIHRvIGhhbmRsZSByZXN1bHQgKi8KIGludAotc21iMl9hc3luY193cml0ZXYoc3RydWN0IGNpZnNfd3JpdGVkYXRhICp3ZGF0YSkKK3NtYjJfYXN5bmNfd3JpdGV2KHN0cnVjdCBjaWZzX3dyaXRlZGF0YSAqd2RhdGEsCisJCSAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICprcmVmKSkKIHsKIAlpbnQgcmMgPSAtRUFDQ0VTOwogCXN0cnVjdCBzbWIyX3dyaXRlX3JlcSAqcmVxID0gTlVMTDsKQEAgLTE5MzgsNyArMTkzOSw3IEBACiAJCQkJc21iMl93cml0ZXZfY2FsbGJhY2ssIHdkYXRhLCAwKTsKIAogCWlmIChyYykgewotCQlrcmVmX3B1dCgmd2RhdGEtPnJlZmNvdW50LCBjaWZzX3dyaXRlZGF0YV9yZWxlYXNlKTsKKwkJa3JlZl9wdXQoJndkYXRhLT5yZWZjb3VudCwgcmVsZWFzZSk7CiAJCWNpZnNfc3RhdHNfZmFpbF9pbmModGNvbiwgU01CMl9XUklURV9IRSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYjJwcm90by5oIGIvZnMvY2lmcy9zbWIycHJvdG8uaAppbmRleCA5M2FkYzY0Li4wY2U0OGRiIDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYjJwcm90by5oCisrKyBiL2ZzL2NpZnMvc21iMnByb3RvLmgKQEAgLTEyMyw3ICsxMjMsOCBAQAogZXh0ZXJuIGludCBzbWIyX2FzeW5jX3JlYWR2KHN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSk7CiBleHRlcm4gaW50IFNNQjJfcmVhZChjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19pb19wYXJtcyAqaW9fcGFybXMsCiAJCSAgICAgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNoYXIgKipidWYsIGludCAqYnVmX3R5cGUpOwotZXh0ZXJuIGludCBzbWIyX2FzeW5jX3dyaXRldihzdHJ1Y3QgY2lmc193cml0ZWRhdGEgKndkYXRhKTsKK2V4dGVybiBpbnQgc21iMl9hc3luY193cml0ZXYoc3RydWN0IGNpZnNfd3JpdGVkYXRhICp3ZGF0YSwKKwkJCSAgICAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICprcmVmKSk7CiBleHRlcm4gaW50IFNNQjJfd3JpdGUoY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfaW9fcGFybXMgKmlvX3Bhcm1zLAogCQkgICAgICB1bnNpZ25lZCBpbnQgKm5ieXRlcywgc3RydWN0IGt2ZWMgKmlvdiwgaW50IG5fdmVjKTsKIGV4dGVybiBpbnQgU01CMl9lY2hvKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3hhdHRyLmMgYi9mcy9jaWZzL3hhdHRyLmMKaW5kZXggMDlhZmRhNC4uNWFjODM2YSAxMDA2NDQKLS0tIGEvZnMvY2lmcy94YXR0ci5jCisrKyBiL2ZzL2NpZnMveGF0dHIuYwpAQCAtODIsOSArODIsMTEgQEAKIAkJCWdvdG8gcmVtb3ZlX2VhX2V4aXQ7CiAKIAkJZWFfbmFtZSArPSBYQVRUUl9VU0VSX1BSRUZJWF9MRU47IC8qIHNraXAgcGFzdCB1c2VyLiBwcmVmaXggKi8KLQkJcmMgPSBDSUZTU01CU2V0RUEoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBlYV9uYW1lLCBOVUxMLAotCQkJKF9fdTE2KTAsIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQlpZiAocFRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnNldF9FQSkKKwkJCXJjID0gcFRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnNldF9FQSh4aWQsIHBUY29uLAorCQkJCWZ1bGxfcGF0aCwgZWFfbmFtZSwgTlVMTCwgKF9fdTE2KTAsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCisJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAl9CiByZW1vdmVfZWFfZXhpdDoKIAlrZnJlZShmdWxsX3BhdGgpOwpAQCAtMTQ5LDE4ICsxNTEsMjIgQEAKIAkJCWNpZnNfZGJnKEZZSSwgImF0dGVtcHQgdG8gc2V0IGNpZnMgaW5vZGUgbWV0YWRhdGFcbiIpOwogCiAJCWVhX25hbWUgKz0gWEFUVFJfVVNFUl9QUkVGSVhfTEVOOyAvKiBza2lwIHBhc3QgdXNlci4gcHJlZml4ICovCi0JCXJjID0gQ0lGU1NNQlNldEVBKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgZWFfbmFtZSwgZWFfdmFsdWUsCi0JCQkoX191MTYpdmFsdWVfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCWlmIChwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+c2V0X0VBKQorCQkJcmMgPSBwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+c2V0X0VBKHhpZCwgcFRjb24sCisJCQkJZnVsbF9wYXRoLCBlYV9uYW1lLCBlYV92YWx1ZSwgKF9fdTE2KXZhbHVlX3NpemUsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCisJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoZWFfbmFtZSwgWEFUVFJfT1MyX1BSRUZJWCwgWEFUVFJfT1MyX1BSRUZJWF9MRU4pCiAJCSAgID09IDApIHsKIAkJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19YQVRUUikKIAkJCWdvdG8gc2V0X2VhX2V4aXQ7CiAKIAkJZWFfbmFtZSArPSBYQVRUUl9PUzJfUFJFRklYX0xFTjsgLyogc2tpcCBwYXN0IG9zMi4gcHJlZml4ICovCi0JCXJjID0gQ0lGU1NNQlNldEVBKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgZWFfbmFtZSwgZWFfdmFsdWUsCi0JCQkoX191MTYpdmFsdWVfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCWlmIChwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+c2V0X0VBKQorCQkJcmMgPSBwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+c2V0X0VBKHhpZCwgcFRjb24sCisJCQkJZnVsbF9wYXRoLCBlYV9uYW1lLCBlYV92YWx1ZSwgKF9fdTE2KXZhbHVlX3NpemUsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCisJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoZWFfbmFtZSwgQ0lGU19YQVRUUl9DSUZTX0FDTCwKIAkJCXN0cmxlbihDSUZTX1hBVFRSX0NJRlNfQUNMKSkgPT0gMCkgewogI2lmZGVmIENPTkZJR19DSUZTX0FDTApAQCAtMTcwLDggKzE3NiwxMiBAQAogCQkJcmMgPSAtRU5PTUVNOwogCQl9IGVsc2UgewogCQkJbWVtY3B5KHBhY2wsIGVhX3ZhbHVlLCB2YWx1ZV9zaXplKTsKLQkJCXJjID0gc2V0X2NpZnNfYWNsKHBhY2wsIHZhbHVlX3NpemUsCi0JCQkJZGlyZW50cnktPmRfaW5vZGUsIGZ1bGxfcGF0aCwgQ0lGU19BQ0xfREFDTCk7CisJCQlpZiAocFRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnNldF9hY2wpCisJCQkJcmMgPSBwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+c2V0X2FjbChwYWNsLAorCQkJCQkJdmFsdWVfc2l6ZSwgZGlyZW50cnktPmRfaW5vZGUsCisJCQkJCQlmdWxsX3BhdGgsIENJRlNfQUNMX0RBQ0wpOworCQkJZWxzZQorCQkJCXJjID0gLUVPUE5PVFNVUFA7CiAJCQlpZiAocmMgPT0gMCkgLyogZm9yY2UgcmV2YWxpZGF0ZSBvZiB0aGUgaW5vZGUgKi8KIAkJCQlDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpLT50aW1lID0gMDsKIAkJCWtmcmVlKHBhY2wpOwpAQCAtMjcyLDE3ICsyODIsMjEgQEAKIAkJCS8qIHJldmFsaWRhdGUvZ2V0YXR0ciB0aGVuIHBvcHVsYXRlIGZyb20gaW5vZGUgKi8KIAkJfSAvKiBCQiBhZGQgZWxzZSB3aGVuIGFib3ZlIGlzIGltcGxlbWVudGVkICovCiAJCWVhX25hbWUgKz0gWEFUVFJfVVNFUl9QUkVGSVhfTEVOOyAvKiBza2lwIHBhc3QgdXNlci4gcHJlZml4ICovCi0JCXJjID0gQ0lGU1NNQlFBbGxFQXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBlYV9uYW1lLCBlYV92YWx1ZSwKLQkJCWJ1Zl9zaXplLCBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJaWYgKHBUY29uLT5zZXMtPnNlcnZlci0+b3BzLT5xdWVyeV9hbGxfRUFzKQorCQkJcmMgPSBwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+cXVlcnlfYWxsX0VBcyh4aWQsIHBUY29uLAorCQkJCWZ1bGxfcGF0aCwgZWFfbmFtZSwgZWFfdmFsdWUsIGJ1Zl9zaXplLAorCQkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CiAJfSBlbHNlIGlmIChzdHJuY21wKGVhX25hbWUsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKSA9PSAwKSB7CiAJCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9fWEFUVFIpCiAJCQlnb3RvIGdldF9lYV9leGl0OwogCiAJCWVhX25hbWUgKz0gWEFUVFJfT1MyX1BSRUZJWF9MRU47IC8qIHNraXAgcGFzdCBvczIuIHByZWZpeCAqLwotCQlyYyA9IENJRlNTTUJRQWxsRUFzKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgZWFfbmFtZSwgZWFfdmFsdWUsCi0JCQlidWZfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCWlmIChwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+cXVlcnlfYWxsX0VBcykKKwkJCXJjID0gcFRjb24tPnNlcy0+c2VydmVyLT5vcHMtPnF1ZXJ5X2FsbF9FQXMoeGlkLCBwVGNvbiwKKwkJCQlmdWxsX3BhdGgsIGVhX25hbWUsIGVhX3ZhbHVlLCBidWZfc2l6ZSwKKwkJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKKwkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCX0gZWxzZSBpZiAoc3RybmNtcChlYV9uYW1lLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTLAogCQkJICBzdHJsZW4oUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUykpID09IDApIHsKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWApAQCAtMzEzLDggKzMyNywxMSBAQAogCQkJdTMyIGFjbGxlbjsKIAkJCXN0cnVjdCBjaWZzX250c2QgKnBhY2w7CiAKLQkJCXBhY2wgPSBnZXRfY2lmc19hY2woY2lmc19zYiwgZGlyZW50cnktPmRfaW5vZGUsCi0JCQkJCQlmdWxsX3BhdGgsICZhY2xsZW4pOworCQkJaWYgKHBUY29uLT5zZXMtPnNlcnZlci0+b3BzLT5nZXRfYWNsID09IE5VTEwpCisJCQkJZ290byBnZXRfZWFfZXhpdDsgLyogcmMgYWxyZWFkeSBFT1BOT1RTVVBQICovCisKKwkJCXBhY2wgPSBwVGNvbi0+c2VzLT5zZXJ2ZXItPm9wcy0+Z2V0X2FjbChjaWZzX3NiLAorCQkJCQlkaXJlbnRyeS0+ZF9pbm9kZSwgZnVsbF9wYXRoLCAmYWNsbGVuKTsKIAkJCWlmIChJU19FUlIocGFjbCkpIHsKIAkJCQlyYyA9IFBUUl9FUlIocGFjbCk7CiAJCQkJY2lmc19kYmcoVkZTLCAiJXM6IGVycm9yICV6ZCBnZXR0aW5nIHNlYyBkZXNjXG4iLApAQCAtNDAwLDExICs0MTcsMTIgQEAKIAkvKiBpZiBwcm9jL2ZzL2NpZnMvc3RyZWFtc3RveGF0dHIgaXMgc2V0IHRoZW4KIAkJc2VhcmNoIHNlcnZlciBmb3IgRUFzIG9yIHN0cmVhbXMgdG8KIAkJcmV0dXJucyBhcyB4YXR0cnMgKi8KLQlyYyA9IENJRlNTTUJRQWxsRUFzKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgTlVMTCwgZGF0YSwKLQkJCQlidWZfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCisJaWYgKHBUY29uLT5zZXMtPnNlcnZlci0+b3BzLT5xdWVyeV9hbGxfRUFzKQorCQlyYyA9IHBUY29uLT5zZXMtPnNlcnZlci0+b3BzLT5xdWVyeV9hbGxfRUFzKHhpZCwgcFRjb24sCisJCQkJZnVsbF9wYXRoLCBOVUxMLCBkYXRhLCBidWZfc2l6ZSwKKwkJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKKwkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogbGlzdF9lYV9leGl0OgogCWtmcmVlKGZ1bGxfcGF0aCk7CiAJZnJlZV94aWQoeGlkKTsKZGlmZiAtLWdpdCBhL2ZzL2Rjb29raWVzLmMgYi9mcy9kY29va2llcy5jCmluZGV4IGFiNTk1NGIuLmFjNDRhNjkgMTAwNjQ0Ci0tLSBhL2ZzL2Rjb29raWVzLmMKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1DT01QQVRfU1lTQ0FMTF9ERUZJTkU0KGxvb2t1cF9kY29va2llLCB1MzIsIHcwLCB1MzIsIHcxLCBjaGFyIF9fdXNlciAqLCBidWYsIHNpemVfdCwgbGVuKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChsb29rdXBfZGNvb2tpZSwgdTMyLCB3MCwgdTMyLCB3MSwgY2hhciBfX3VzZXIgKiwgYnVmLCBjb21wYXRfc2l6ZV90LCBsZW4pCiB7CiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJcmV0dXJuIHN5c19sb29rdXBfZGNvb2tpZSgoKHU2NCl3MCA8PCAzMikgfCB3MSwgYnVmLCBsZW4pOwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwppbmRleCAwZTA0MTQyLi4xNjBhNTQ4IDEwMDY0NAotLS0gYS9mcy9kaXJlY3QtaW8uYworKysgYi9mcy9kaXJlY3QtaW8uYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3ZlY3MpOwogCiAJYmlvLT5iaV9iZGV2ID0gYmRldjsKLQliaW8tPmJpX3NlY3RvciA9IGZpcnN0X3NlY3RvcjsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gZmlyc3Rfc2VjdG9yOwogCWlmIChkaW8tPmlzX2FzeW5jKQogCQliaW8tPmJpX2VuZF9pbyA9IGRpb19iaW9fZW5kX2FpbzsKIAllbHNlCkBAIC03MTksNyArNzE5LDcgQEAKIAlpZiAoc2Rpby0+YmlvKSB7CiAJCWxvZmZfdCBjdXJfb2Zmc2V0ID0gc2Rpby0+Y3VyX3BhZ2VfZnNfb2Zmc2V0OwogCQlsb2ZmX3QgYmlvX25leHRfb2Zmc2V0ID0gc2Rpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvICsKLQkJCXNkaW8tPmJpby0+Ymlfc2l6ZTsKKwkJCXNkaW8tPmJpby0+YmlfaXRlci5iaV9zaXplOwogCiAJCS8qCiAJCSAqIFNlZSB3aGV0aGVyIHRoaXMgbmV3IHJlcXVlc3QgaXMgY29udGlndW91cyB3aXRoIHRoZSBvbGQuCmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggZTE1MjliNC4uM2Q3OGZjYyAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtNzQ4LDExICs3NDgsMTAgQEAKIAogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAotc3RydWN0IGZpbGUgKm9wZW5fZXhlYyhjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHN0cnVjdCBmaWxlICpkb19vcGVuX2V4ZWMoc3RydWN0IGZpbGVuYW1lICpuYW1lKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCBlcnI7Ci0Jc3RydWN0IGZpbGVuYW1lIHRtcCA9IHsgLm5hbWUgPSBuYW1lIH07CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBvcGVuX2ZsYWdzIG9wZW5fZXhlY19mbGFncyA9IHsKIAkJLm9wZW5fZmxhZyA9IE9fTEFSR0VGSUxFIHwgT19SRE9OTFkgfCBfX0ZNT0RFX0VYRUMsCiAJCS5hY2NfbW9kZSA9IE1BWV9FWEVDIHwgTUFZX09QRU4sCkBAIC03NjAsNyArNzU5LDcgQEAKIAkJLmxvb2t1cF9mbGFncyA9IExPT0tVUF9GT0xMT1csCiAJfTsKIAotCWZpbGUgPSBkb19maWxwX29wZW4oQVRfRkRDV0QsICZ0bXAsICZvcGVuX2V4ZWNfZmxhZ3MpOworCWZpbGUgPSBkb19maWxwX29wZW4oQVRfRkRDV0QsIG5hbWUsICZvcGVuX2V4ZWNfZmxhZ3MpOwogCWlmIChJU19FUlIoZmlsZSkpCiAJCWdvdG8gb3V0OwogCkBAIC03ODQsNiArNzgzLDEyIEBACiAJZnB1dChmaWxlKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQorCitzdHJ1Y3QgZmlsZSAqb3Blbl9leGVjKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGVuYW1lIHRtcCA9IHsgLm5hbWUgPSBuYW1lIH07CisJcmV0dXJuIGRvX29wZW5fZXhlYygmdG1wKTsKK30KIEVYUE9SVF9TWU1CT0wob3Blbl9leGVjKTsKIAogaW50IGtlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LApAQCAtMTE2Miw3ICsxMTY3LDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotdm9pZCBmcmVlX2Jwcm0oc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3N0YXRpYyB2b2lkIGZyZWVfYnBybShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewogCWZyZWVfYXJnX3BhZ2VzKGJwcm0pOwogCWlmIChicHJtLT5jcmVkKSB7CkBAIC0xNDMyLDcgKzE0MzcsNyBAQAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1zdGF0aWMgaW50IGRvX2V4ZWN2ZV9jb21tb24oY29uc3QgY2hhciAqZmlsZW5hbWUsCitzdGF0aWMgaW50IGRvX2V4ZWN2ZV9jb21tb24oc3RydWN0IGZpbGVuYW1lICpmaWxlbmFtZSwKIAkJCQlzdHJ1Y3QgdXNlcl9hcmdfcHRyIGFyZ3YsCiAJCQkJc3RydWN0IHVzZXJfYXJnX3B0ciBlbnZwKQogewpAQCAtMTQ0MSw2ICsxNDQ2LDkgQEAKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkaXNwbGFjZWQ7CiAJaW50IHJldHZhbDsKIAorCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlyZXR1cm4gUFRSX0VSUihmaWxlbmFtZSk7CisKIAkvKgogCSAqIFdlIG1vdmUgdGhlIGFjdHVhbCBmYWlsdXJlIGluIGNhc2Ugb2YgUkxJTUlUX05QUk9DIGV4Y2VzcyBmcm9tCiAJICogc2V0KnVpZCgpIHRvIGV4ZWN2ZSgpIGJlY2F1c2UgdG9vIG1hbnkgcG9vcmx5IHdyaXR0ZW4gcHJvZ3JhbXMKQEAgLTE0NzMsNyArMTQ4MSw3IEBACiAJY2hlY2tfdW5zYWZlX2V4ZWMoYnBybSk7CiAJY3VycmVudC0+aW5fZXhlY3ZlID0gMTsKIAotCWZpbGUgPSBvcGVuX2V4ZWMoZmlsZW5hbWUpOworCWZpbGUgPSBkb19vcGVuX2V4ZWMoZmlsZW5hbWUpOwogCXJldHZhbCA9IFBUUl9FUlIoZmlsZSk7CiAJaWYgKElTX0VSUihmaWxlKSkKIAkJZ290byBvdXRfdW5tYXJrOwpAQCAtMTQ4MSw4ICsxNDg5LDcgQEAKIAlzY2hlZF9leGVjKCk7CiAKIAlicHJtLT5maWxlID0gZmlsZTsKLQlicHJtLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotCWJwcm0tPmludGVycCA9IGZpbGVuYW1lOworCWJwcm0tPmZpbGVuYW1lID0gYnBybS0+aW50ZXJwID0gZmlsZW5hbWUtPm5hbWU7CiAKIAlyZXR2YWwgPSBicHJtX21tX2luaXQoYnBybSk7CiAJaWYgKHJldHZhbCkKQEAgLTE1MjMsNiArMTUzMCw3IEBACiAJYWNjdF91cGRhdGVfaW50ZWdyYWxzKGN1cnJlbnQpOwogCXRhc2tfbnVtYV9mcmVlKGN1cnJlbnQpOwogCWZyZWVfYnBybShicHJtKTsKKwlwdXRuYW1lKGZpbGVuYW1lKTsKIAlpZiAoZGlzcGxhY2VkKQogCQlwdXRfZmlsZXNfc3RydWN0KGRpc3BsYWNlZCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTE1NDQsMTAgKzE1NTIsMTEgQEAKIAlpZiAoZGlzcGxhY2VkKQogCQlyZXNldF9maWxlc19zdHJ1Y3QoZGlzcGxhY2VkKTsKIG91dF9yZXQ6CisJcHV0bmFtZShmaWxlbmFtZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotaW50IGRvX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwKK2ludCBkb19leGVjdmUoc3RydWN0IGZpbGVuYW1lICpmaWxlbmFtZSwKIAljb25zdCBjaGFyIF9fdXNlciAqY29uc3QgX191c2VyICpfX2FyZ3YsCiAJY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqX19lbnZwKQogewpAQCAtMTU1Nyw3ICsxNTY2LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X2RvX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwKK3N0YXRpYyBpbnQgY29tcGF0X2RvX2V4ZWN2ZShzdHJ1Y3QgZmlsZW5hbWUgKmZpbGVuYW1lLAogCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICpfX2FyZ3YsCiAJY29uc3QgY29tcGF0X3VwdHJfdCBfX3VzZXIgKl9fZW52cCkKIHsKQEAgLTE2MDcsMjUgKzE2MTYsMTMgQEAKIAkJY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqLCBhcmd2LAogCQljb25zdCBjaGFyIF9fdXNlciAqY29uc3QgX191c2VyICosIGVudnApCiB7Ci0Jc3RydWN0IGZpbGVuYW1lICpwYXRoID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JaW50IGVycm9yID0gUFRSX0VSUihwYXRoKTsKLQlpZiAoIUlTX0VSUihwYXRoKSkgewotCQllcnJvciA9IGRvX2V4ZWN2ZShwYXRoLT5uYW1lLCBhcmd2LCBlbnZwKTsKLQkJcHV0bmFtZShwYXRoKTsKLQl9Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiBkb19leGVjdmUoZ2V0bmFtZShmaWxlbmFtZSksIGFyZ3YsIGVudnApOwogfQogI2lmZGVmIENPTkZJR19DT01QQVQKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2V4ZWN2ZShjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLAogCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICogYXJndiwKIAljb25zdCBjb21wYXRfdXB0cl90IF9fdXNlciAqIGVudnApCiB7Ci0Jc3RydWN0IGZpbGVuYW1lICpwYXRoID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JaW50IGVycm9yID0gUFRSX0VSUihwYXRoKTsKLQlpZiAoIUlTX0VSUihwYXRoKSkgewotCQllcnJvciA9IGNvbXBhdF9kb19leGVjdmUocGF0aC0+bmFtZSwgYXJndiwgZW52cCk7Ci0JCXB1dG5hbWUocGF0aCk7Ci0JfQotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gY29tcGF0X2RvX2V4ZWN2ZShnZXRuYW1lKGZpbGVuYW1lKSwgYXJndiwgZW52cCk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggNDNlNjRmNi4uMWE1MDczOSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCWlmIChyZXQgPiAwKSB7CiAJCXNzaXplX3QgZXJyOwogCi0JCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBwb3MsIHJldCk7CisJCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBpb2NiLT5raV9wb3MgLSByZXQsIHJldCk7CiAJCWlmIChlcnIgPCAwICYmIHJldCA+IDApCiAJCQlyZXQgPSBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9wYWdlLWlvLmMgYi9mcy9leHQ0L3BhZ2UtaW8uYwppbmRleCBkNDg4ZjgwLi5hYjk1NTA4IDEwMDY0NAotLS0gYS9mcy9leHQ0L3BhZ2UtaW8uYworKysgYi9mcy9leHQ0L3BhZ2UtaW8uYwpAQCAtNjUsOSArNjUsOSBAQAogewogCWludCBpOwogCWludCBlcnJvciA9ICF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAotCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgewotCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9ICZiaW8tPmJpX2lvX3ZlY1tpXTsKKwliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnZlYywgYmlvLCBpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CiAJCXVuc2lnbmVkIGJpb19zdGFydCA9IGJ2ZWMtPmJ2X29mZnNldDsKQEAgLTI5OCw3ICsyOTgsNyBAQAogc3RhdGljIHZvaWQgZXh0NF9lbmRfYmlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCWV4dDRfaW9fZW5kX3QgKmlvX2VuZCA9IGJpby0+YmlfcHJpdmF0ZTsKLQlzZWN0b3JfdCBiaV9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwlzZWN0b3JfdCBiaV9zZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCiAJQlVHX09OKCFpb19lbmQpOwogCWJpby0+YmlfZW5kX2lvID0gTlVMTDsKQEAgLTM2Niw3ICszNjYsNyBAQAogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbWluKG52ZWNzLCBCSU9fTUFYX1BBR0VTKSk7CiAJaWYgKCFiaW8pCiAJCXJldHVybiAtRU5PTUVNOwotCWJpby0+Ymlfc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIChiaC0+Yl9zaXplID4+IDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CiAJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKIAliaW8tPmJpX2VuZF9pbyA9IGV4dDRfZW5kX2JpbzsKIAliaW8tPmJpX3ByaXZhdGUgPSBleHQ0X2dldF9pb19lbmQoaW8tPmlvX2VuZCk7CmRpZmYgLS1naXQgYS9mcy9mMmZzL2RhdGEuYyBiL2ZzL2YyZnMvZGF0YS5jCmluZGV4IDBhZTU1ODcuLjIyNjFjY2QgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZGF0YS5jCisrKyBiL2ZzL2YyZnMvZGF0YS5jCkBAIC0yNiw0MCArMjYsMzMgQEAKIAogc3RhdGljIHZvaWQgZjJmc19yZWFkX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7Ci0JY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJaW50IGk7CiAKLQlkbyB7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2ZWMsIGJpbywgaSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CiAKLQkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKLQkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOwotCi0JCWlmICh1bmxpa2VseSghdXB0b2RhdGUpKSB7CisJCWlmICghZXJyKSB7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0gZWxzZSB7CiAJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKLQkJfSBlbHNlIHsKLQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJfQogCQl1bmxvY2tfcGFnZShwYWdlKTsKLQl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKLQorCX0KIAliaW9fcHV0KGJpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIGYyZnNfd3JpdGVfZW5kX2lvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKLQljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKLQlzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX1NCKGJ2ZWMtPmJ2X3BhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2IpOworCXN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfU0IoYmlvLT5iaV9pb192ZWMtPmJ2X3BhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2IpOworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCWludCBpOwogCi0JZG8geworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmVjLCBiaW8sIGkpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOwogCi0JCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCi0JCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKLQotCQlpZiAodW5saWtlbHkoIXVwdG9kYXRlKSkgeworCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQkJc2V0X2JpdChBU19FSU8sICZwYWdlLT5tYXBwaW5nLT5mbGFncyk7CiAJCQlzZXRfY2twdF9mbGFncyhzYmktPmNrcHQsIENQX0VSUk9SX0ZMQUcpOwpAQCAtNjcsNyArNjAsNyBAQAogCQl9CiAJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJZGVjX3BhZ2VfY291bnQoc2JpLCBGMkZTX1dSSVRFQkFDSyk7Ci0JfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CisJfQogCiAJaWYgKGJpby0+YmlfcHJpdmF0ZSkKIAkJY29tcGxldGUoYmlvLT5iaV9wcml2YXRlKTsKQEAgLTkxLDcgKzg0LDcgQEAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG5wYWdlcyk7CiAKIAliaW8tPmJpX2JkZXYgPSBzYmktPnNiLT5zX2JkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBTRUNUT1JfRlJPTV9CTE9DSyhzYmksIGJsa19hZGRyKTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gU0VDVE9SX0ZST01fQkxPQ0soc2JpLCBibGtfYWRkcik7CiAJYmlvLT5iaV9lbmRfaW8gPSBpc19yZWFkID8gZjJmc19yZWFkX2VuZF9pbyA6IGYyZnNfd3JpdGVfZW5kX2lvOwogCiAJcmV0dXJuIGJpbzsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGUuYyBiL2ZzL2ZpbGUuYwppbmRleCA3NzE1NzhiLi5kYjI1YzJiIDEwMDY0NAotLS0gYS9mcy9maWxlLmMKKysrIGIvZnMvZmlsZS5jCkBAIC0zNCw3ICszNCw3IEBACiAJICogdm1hbGxvYygpIGlmIHRoZSBhbGxvY2F0aW9uIHNpemUgd2lsbCBiZSBjb25zaWRlcmVkICJsYXJnZSIgYnkgdGhlIFZNLgogCSAqLwogCWlmIChzaXplIDw9IChQQUdFX1NJWkUgPDwgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpKSB7Ci0JCXZvaWQgKmRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUx8X19HRlBfTk9XQVJOKTsKKwkJdm9pZCAqZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk58X19HRlBfTk9SRVRSWSk7CiAJCWlmIChkYXRhICE9IE5VTEwpCiAJCQlyZXR1cm4gZGF0YTsKIAl9CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvcHMuYyBiL2ZzL2dmczIvbG9wcy5jCmluZGV4IDU4ZjA2NDAuLjc2NjkzNzkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9wcy5jCisrKyBiL2ZzL2dmczIvbG9wcy5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJbnJ2ZWNzID0gbWF4KG5ydmVjcy8yLCAxVSk7CiAJfQogCi0JYmlvLT5iaV9zZWN0b3IgPSBibGtubyAqIChzYi0+c19ibG9ja3NpemUgPj4gOSk7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJsa25vICogKHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5KTsKIAliaW8tPmJpX2JkZXYgPSBzYi0+c19iZGV2OwogCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9lbmRfbG9nX3dyaXRlOwogCWJpby0+YmlfcHJpdmF0ZSA9IHNkcDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggMWU3MTJiNS4uYzY4NzJkMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCWxvY2tfcGFnZShwYWdlKTsKIAogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7Ci0JYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3IgKiAoc2ItPnNfYmxvY2tzaXplID4+IDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3IgKiAoc2ItPnNfYmxvY2tzaXplID4+IDkpOwogCWJpby0+YmlfYmRldiA9IHNiLT5zX2JkZXY7CiAJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgUEFHRV9TSVpFLCAwKTsKIApkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKaW5kZXggOWVlNjI5OC4uYmRlYzY2NSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9kaXIuYworKysgYi9mcy9oZnNwbHVzL2Rpci5jCkBAIC01MjksNyArNTI5LDcgQEAKIAkuc2V0eGF0dHIJCT0gZ2VuZXJpY19zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCQk9IGhmc3BsdXNfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgkJPSBoZnNwbHVzX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgkJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogI2lmZGVmIENPTkZJR19IRlNQTFVTX0ZTX1BPU0lYX0FDTAogCS5nZXRfYWNsCQk9IGhmc3BsdXNfZ2V0X3Bvc2l4X2FjbCwKIAkuc2V0X2FjbAkJPSBoZnNwbHVzX3NldF9wb3NpeF9hY2wsCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggNDU1MWNiZC4uZmE5MjlmMyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBoZnNwbHVzX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBoZnNwbHVzX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjaWZkZWYgQ09ORklHX0hGU1BMVVNfRlNfUE9TSVhfQUNMCiAJLmdldF9hY2wJPSBoZnNwbHVzX2dldF9wb3NpeF9hY2wsCiAJLnNldF9hY2wJPSBoZnNwbHVzX3NldF9wb3NpeF9hY2wsCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3dyYXBwZXIuYyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCmluZGV4IGU5YTk3YTAuLjNmOTk5NjQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jCisrKyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCkBAIC02Myw3ICs2Myw3IEBACiAJc2VjdG9yICY9IH4oKGlvX3NpemUgPj4gSEZTUExVU19TRUNUT1JfU0hJRlQpIC0gMSk7CiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOwotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gc2ItPnNfYmRldjsKIAogCWlmICghKHJ3ICYgV1JJVEUpICYmIGRhdGEpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3hhdHRyLmMgYi9mcy9oZnNwbHVzL3hhdHRyLmMKaW5kZXggMGI0YTVjOS4uNGUyN2VkYyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy94YXR0ci5jCisrKyBiL2ZzL2hmc3BsdXMveGF0dHIuYwpAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAKK3N0YXRpYyBpbnQgaGZzcGx1c19yZW1vdmV4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKKwogY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhmc3BsdXNfeGF0dHJfaGFuZGxlcnNbXSA9IHsKIAkmaGZzcGx1c194YXR0cl9vc3hfaGFuZGxlciwKIAkmaGZzcGx1c194YXR0cl91c2VyX2hhbmRsZXIsCkBAIC0yNzQsMTQgKzI3Niw4IEBACiAJCQkJSEZTUExVU19JU19SU1JDKGlub2RlKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKHN0cm5jbXAobmFtZSwgWEFUVFJfTUFDX09TWF9QUkVGSVgsCi0JCQkJWEFUVFJfTUFDX09TWF9QUkVGSVhfTEVOKSA9PSAwKQotCQluYW1lICs9IFhBVFRSX01BQ19PU1hfUFJFRklYX0xFTjsKLQotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCXZhbHVlID0gIiI7Ci0JCXNpemUgPSAwOwotCX0KKwlpZiAodmFsdWUgPT0gTlVMTCkKKwkJcmV0dXJuIGhmc3BsdXNfcmVtb3ZleGF0dHIoaW5vZGUsIG5hbWUpOwogCiAJZXJyID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZjYXRfZmQpOwogCWlmIChlcnIpIHsKQEAgLTM5OSwxNiArMzk1LDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfb3N4X3hhdHRyKGNvbnN0IGNoYXIgKnhhdHRyX25hbWUpCi17Ci0JcmV0dXJuICFpc19rbm93bl9uYW1lc3BhY2UoeGF0dHJfbmFtZSk7Ci19Ci0KIHN0YXRpYyBpbnQgbmFtZV9sZW4oY29uc3QgY2hhciAqeGF0dHJfbmFtZSwgaW50IHhhdHRyX25hbWVfbGVuKQogewogCWludCBsZW4gPSB4YXR0cl9uYW1lX2xlbiArIDE7CiAKLQlpZiAoaXNfb3N4X3hhdHRyKHhhdHRyX25hbWUpKQorCWlmICghaXNfa25vd25fbmFtZXNwYWNlKHhhdHRyX25hbWUpKQogCQlsZW4gKz0gWEFUVFJfTUFDX09TWF9QUkVGSVhfTEVOOwogCiAJcmV0dXJuIGxlbjsKQEAgLTQxOSw3ICs0MTAsNyBAQAogCWludCBsZW4gPSBuYW1lX2xlbjsKIAlpbnQgb2Zmc2V0ID0gMDsKIAotCWlmIChpc19vc3hfeGF0dHIoeGF0dHJfbmFtZSkpIHsKKwlpZiAoIWlzX2tub3duX25hbWVzcGFjZSh4YXR0cl9uYW1lKSkgewogCQlzdHJuY3B5KGJ1ZmZlciwgWEFUVFJfTUFDX09TWF9QUkVGSVgsIFhBVFRSX01BQ19PU1hfUFJFRklYX0xFTik7CiAJCW9mZnNldCArPSBYQVRUUl9NQUNfT1NYX1BSRUZJWF9MRU47CiAJCWxlbiArPSBYQVRUUl9NQUNfT1NYX1BSRUZJWF9MRU47CkBAIC00OTcsMTggKzQ4OCw2IEBACiAJCQkJSEZTUExVU19JU19SU1JDKGlub2RlKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKHN0cm5jbXAobmFtZSwgWEFUVFJfTUFDX09TWF9QUkVGSVgsCi0JCQkJWEFUVFJfTUFDX09TWF9QUkVGSVhfTEVOKSA9PSAwKSB7Ci0JCS8qIHNraXAgIm9zeC4iIHByZWZpeCAqLwotCQluYW1lICs9IFhBVFRSX01BQ19PU1hfUFJFRklYX0xFTjsKLQkJLyoKLQkJICogRG9uJ3QgYWxsb3cgcmV0cmlldmluZyBwcm9wZXJseSBwcmVmaXhlZCBhdHRyaWJ1dGVzCi0JCSAqIGJ5IHByZXBlbmRpbmcgdGhlbSB3aXRoICJvc3guIgotCQkgKi8KLQkJaWYgKGlzX2tub3duX25hbWVzcGFjZShuYW1lKSkKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KIAlpZiAoIXN0cmNtcF94YXR0cl9maW5kZXJfaW5mbyhuYW1lKSkKIAkJcmV0dXJuIGhmc3BsdXNfZ2V0eGF0dHJfZmluZGVyX2luZm8oaW5vZGUsIHZhbHVlLCBzaXplKTsKIApAQCAtNzQzLDI4ICs3MjIsMTggQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgaGZzcGx1c19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IGhmc3BsdXNfcmVtb3ZleGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBoZnNfZmluZF9kYXRhIGNhdF9mZDsKIAl1MTYgZmxhZ3M7CiAJdTE2IGNhdF9lbnRyeV90eXBlOwogCWludCBpc194YXR0cl9hY2xfZGVsZXRlZCA9IDA7CiAJaW50IGlzX2FsbF94YXR0cnNfZGVsZXRlZCA9IDA7CiAKLQlpZiAoKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCi0JCQkhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgfHwKLQkJCQlIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlpZiAoIUhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLT5hdHRyX3RyZWUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChzdHJuY21wKG5hbWUsIFhBVFRSX01BQ19PU1hfUFJFRklYLAotCQkJCVhBVFRSX01BQ19PU1hfUFJFRklYX0xFTikgPT0gMCkKLQkJbmFtZSArPSBYQVRUUl9NQUNfT1NYX1BSRUZJWF9MRU47Ci0KIAlpZiAoIXN0cmNtcF94YXR0cl9maW5kZXJfaW5mbyhuYW1lKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC04MzgsOCArODA3LDEyIEBACiAJaWYgKGxlbiA+IEhGU1BMVVNfQVRUUl9NQVhfU1RSTEVOKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzdHJjcHkoeGF0dHJfbmFtZSwgWEFUVFJfTUFDX09TWF9QUkVGSVgpOwotCXN0cmNweSh4YXR0cl9uYW1lICsgWEFUVFJfTUFDX09TWF9QUkVGSVhfTEVOLCBuYW1lKTsKKwkvKgorCSAqIERvbid0IGFsbG93IHJldHJpZXZpbmcgcHJvcGVybHkgcHJlZml4ZWQgYXR0cmlidXRlcworCSAqIGJ5IHByZXBlbmRpbmcgdGhlbSB3aXRoICJvc3guIgorCSAqLworCWlmIChpc19rbm93bl9uYW1lc3BhY2UobmFtZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCXJldHVybiBoZnNwbHVzX2dldHhhdHRyKGRlbnRyeSwgeGF0dHJfbmFtZSwgYnVmZmVyLCBzaXplKTsKIH0KQEAgLTg1NywxMiArODMwLDEzIEBACiAJaWYgKGxlbiA+IEhGU1BMVVNfQVRUUl9NQVhfU1RSTEVOKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwkvKgorCSAqIERvbid0IGFsbG93IHNldHRpbmcgcHJvcGVybHkgcHJlZml4ZWQgYXR0cmlidXRlcworCSAqIGJ5IHByZXBlbmRpbmcgdGhlbSB3aXRoICJvc3guIgorCSAqLwogCWlmIChpc19rbm93bl9uYW1lc3BhY2UobmFtZSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXN0cmNweSh4YXR0cl9uYW1lLCBYQVRUUl9NQUNfT1NYX1BSRUZJWCk7Ci0Jc3RyY3B5KHhhdHRyX25hbWUgKyBYQVRUUl9NQUNfT1NYX1BSRUZJWF9MRU4sIG5hbWUpOwotCiAJcmV0dXJuIGhmc3BsdXNfc2V0eGF0dHIoZGVudHJ5LCB4YXR0cl9uYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy94YXR0ci5oIGIvZnMvaGZzcGx1cy94YXR0ci5oCmluZGV4IDllMjE0NDkuLjI4ODUzMGMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMveGF0dHIuaAorKysgYi9mcy9oZnNwbHVzL3hhdHRyLmgKQEAgLTQwLDggKzQwLDYgQEAKIAogc3NpemVfdCBoZnNwbHVzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCi1pbnQgaGZzcGx1c19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOwotCiBpbnQgaGZzcGx1c19pbml0X3NlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCWNvbnN0IHN0cnVjdCBxc3RyICpxc3RyKTsKIApkaWZmIC0tZ2l0IGEvZnMvaHBmcy9hbGxvYy5jIGIvZnMvaHBmcy9hbGxvYy5jCmluZGV4IGNkYjg0YTguLjU4YjUxMDYgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvYWxsb2MuYworKysgYi9mcy9ocGZzL2FsbG9jLmMKQEAgLTgsNiArOCw1OCBAQAogCiAjaW5jbHVkZSAiaHBmc19mbi5oIgogCitzdGF0aWMgdm9pZCBocGZzX2NsYWltX2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKHNiaS0+c2Jfbl9mcmVlICE9ICh1bnNpZ25lZCktMSkgeworCQlpZiAodW5saWtlbHkoIXNiaS0+c2Jfbl9mcmVlKSkgeworCQkJaHBmc19lcnJvcihzLCAiZnJlZSBjb3VudCB1bmRlcmZsb3csIGFsbG9jYXRpbmcgc2VjdG9yICUwOHgiLCBzZWMpOworCQkJc2JpLT5zYl9uX2ZyZWUgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCQlzYmktPnNiX25fZnJlZS0tOworCX0KK30KKworc3RhdGljIHZvaWQgaHBmc19jbGFpbV9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKHNiaS0+c2Jfbl9mcmVlICE9ICh1bnNpZ25lZCktMSkgeworCQlpZiAodW5saWtlbHkoc2JpLT5zYl9uX2ZyZWUgPj0gc2JpLT5zYl9mc19zaXplKSkgeworCQkJaHBmc19lcnJvcihzLCAiZnJlZSBjb3VudCBvdmVyZmxvdywgZnJlZWluZyBzZWN0b3IgJTA4eCIsIHNlYyk7CisJCQlzYmktPnNiX25fZnJlZSA9IC0xOworCQkJcmV0dXJuOworCQl9CisJCXNiaS0+c2Jfbl9mcmVlKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBocGZzX2NsYWltX2RpcmJhbmRfYWxsb2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpCit7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKKwlpZiAoc2JpLT5zYl9uX2ZyZWVfZG5vZGVzICE9ICh1bnNpZ25lZCktMSkgeworCQlpZiAodW5saWtlbHkoIXNiaS0+c2Jfbl9mcmVlX2Rub2RlcykpIHsKKwkJCWhwZnNfZXJyb3IocywgImRpcmJhbmQgZnJlZSBjb3VudCB1bmRlcmZsb3csIGFsbG9jYXRpbmcgc2VjdG9yICUwOHgiLCBzZWMpOworCQkJc2JpLT5zYl9uX2ZyZWVfZG5vZGVzID0gLTE7CisJCQlyZXR1cm47CisJCX0KKwkJc2JpLT5zYl9uX2ZyZWVfZG5vZGVzLS07CisJfQorfQorCitzdGF0aWMgdm9pZCBocGZzX2NsYWltX2RpcmJhbmRfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIHNlYykKK3sKKwlzdHJ1Y3QgaHBmc19zYl9pbmZvICpzYmkgPSBocGZzX3NiKHMpOworCWlmIChzYmktPnNiX25fZnJlZV9kbm9kZXMgIT0gKHVuc2lnbmVkKS0xKSB7CisJCWlmICh1bmxpa2VseShzYmktPnNiX25fZnJlZV9kbm9kZXMgPj0gc2JpLT5zYl9kaXJiYW5kX3NpemUgLyA0KSkgeworCQkJaHBmc19lcnJvcihzLCAiZGlyYmFuZCBmcmVlIGNvdW50IG92ZXJmbG93LCBmcmVlaW5nIHNlY3RvciAlMDh4Iiwgc2VjKTsKKwkJCXNiaS0+c2Jfbl9mcmVlX2Rub2RlcyA9IC0xOworCQkJcmV0dXJuOworCQl9CisJCXNiaS0+c2Jfbl9mcmVlX2Rub2RlcysrOworCX0KK30KKwogLyoKICAqIENoZWNrIGlmIGEgc2VjdG9yIGlzIGFsbG9jYXRlZCBpbiBiaXRtYXAKICAqIFRoaXMgaXMgcmVhbGx5IHNsb3cuIFR1cm5lZCBvbiBvbmx5IGlmIGNoaz09MgpAQCAtMjAzLDkgKzI1NSwxNSBAQAogCX0KIAlzZWMgPSAwOwogCXJldDoKKwlpZiAoc2VjKSB7CisJCWkgPSAwOworCQlkbworCQkJaHBmc19jbGFpbV9hbGxvYyhzLCBzZWMgKyBpKTsKKwkJd2hpbGUgKHVubGlrZWx5KCsraSA8IG4pKTsKKwl9CiAJaWYgKHNlYyAmJiBmX3ApIHsKIAkJZm9yIChpID0gMDsgaSA8IGZvcndhcmQ7IGkrKykgewotCQkJaWYgKCFocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHMsIHNlYyArIGkgKyAxKSkgeworCQkJaWYgKCFocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHMsIHNlYyArIG4gKyBpKSkgewogCQkJCWhwZnNfZXJyb3IocywgIlByZWFsbG9jIGRvZXNuJ3Qgd29yayEgV2FudGVkICVkLCBhbGxvY2F0ZWQgYXQgJTA4eCwgY2FuJ3QgYWxsb2NhdGUgJWQiLCBmb3J3YXJkLCBzZWMsIGkpOwogCQkJCXNlYyA9IDA7CiAJCQkJYnJlYWs7CkBAIC0yMjgsNiArMjg2LDcgQEAKIAluciA+Pj0gMjsKIAlzZWMgPSBhbGxvY19pbl9ibXAocywgKH4weDNmZmYpIHwgbnIsIDEsIDApOwogCWlmICghc2VjKSByZXR1cm4gMDsKKwlocGZzX2NsYWltX2RpcmJhbmRfYWxsb2Mocywgc2VjKTsKIAlyZXR1cm4gKChzZWMgJiAweDNmZmYpIDw8IDIpICsgc2JpLT5zYl9kaXJiYW5kX3N0YXJ0OwogfQogCkBAIC0yNDIsNiArMzAxLDcgQEAKIAkJYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdICY9IGNwdV90b19sZTMyKH4oMSA8PCAoc2VjICYgMHgxZikpKTsKIAkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOwogCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfY2xhaW1fYWxsb2Mocywgc2VjKTsKIAkJcmV0dXJuIDE7CiAJfQogCWhwZnNfYnJlbHNlNCgmcWJoKTsKQEAgLTI3NSw2ICszMzUsNyBAQAogCQlyZXR1cm47CiAJfQogCWJtcFsoc2VjICYgMHgzZmZmKSA+PiA1XSB8PSBjcHVfdG9fbGUzMigxIDw8IChzZWMgJiAweDFmKSk7CisJaHBmc19jbGFpbV9mcmVlKHMsIHNlYyk7CiAJaWYgKCEtLW4pIHsKIAkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOwogCQlocGZzX2JyZWxzZTQoJnFiaCk7CkBAIC0zNTksNiArNDIwLDcgQEAKIAkJYm1wW3NzZWMgPj4gNV0gfD0gY3B1X3RvX2xlMzIoMSA8PCAoc3NlYyAmIDB4MWYpKTsKIAkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOwogCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfY2xhaW1fZGlyYmFuZF9mcmVlKHMsIGRubyk7CiAJfQogfQogCkBAIC0zNjYsNyArNDI4LDcgQEAKIAkJCSBkbm9kZV9zZWNubyAqZG5vLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqcWJoKQogewogCXN0cnVjdCBkbm9kZSAqZDsKLQlpZiAoaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIGhwZnNfc2IocyktPnNiX2RtYXApID4gRlJFRV9ETk9ERVNfQUREKSB7CisJaWYgKGhwZnNfZ2V0X2ZyZWVfZG5vZGVzKHMpID4gRlJFRV9ETk9ERVNfQUREKSB7CiAJCWlmICghKCpkbm8gPSBhbGxvY19pbl9kaXJiYW5kKHMsIG5lYXIpKSkKIAkJCWlmICghKCpkbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCA0LCAwKSkpIHJldHVybiBOVUxMOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9ocGZzL2J1ZmZlci5jIGIvZnMvaHBmcy9idWZmZXIuYwppbmRleCA0ZDBhMWFmLi4xMzllZjE2IDEwMDY0NAotLS0gYS9mcy9ocGZzL2J1ZmZlci5jCisrKyBiL2ZzL2hwZnMvYnVmZmVyLmMKQEAgLTg2LDcgKzg2LDYgQEAKIHZvaWQgKmhwZnNfbWFwXzRzZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgc2Vjbm8sIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgsCiAJCSAgIGludCBhaGVhZCkKIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWNoYXIgKmRhdGE7CiAKIAlocGZzX2xvY2tfYXNzZXJ0KHMpOwpAQCAtMTAwLDM0ICs5OSwzMiBAQAogCiAJaHBmc19wcmVmZXRjaF9zZWN0b3JzKHMsIHNlY25vLCA0ICsgYWhlYWQpOwogCisJaWYgKCEocWJoLT5iaFswXSA9IHNiX2JyZWFkKHMsIHNlY25vICsgMCkpKSBnb3RvIGJhaWwwOworCWlmICghKHFiaC0+YmhbMV0gPSBzYl9icmVhZChzLCBzZWNubyArIDEpKSkgZ290byBiYWlsMTsKKwlpZiAoIShxYmgtPmJoWzJdID0gc2JfYnJlYWQocywgc2Vjbm8gKyAyKSkpIGdvdG8gYmFpbDI7CisJaWYgKCEocWJoLT5iaFszXSA9IHNiX2JyZWFkKHMsIHNlY25vICsgMykpKSBnb3RvIGJhaWwzOworCisJaWYgKGxpa2VseShxYmgtPmJoWzFdLT5iX2RhdGEgPT0gcWJoLT5iaFswXS0+Yl9kYXRhICsgMSAqIDUxMikgJiYKKwkgICAgbGlrZWx5KHFiaC0+YmhbMl0tPmJfZGF0YSA9PSBxYmgtPmJoWzBdLT5iX2RhdGEgKyAyICogNTEyKSAmJgorCSAgICBsaWtlbHkocWJoLT5iaFszXS0+Yl9kYXRhID09IHFiaC0+YmhbMF0tPmJfZGF0YSArIDMgKiA1MTIpKSB7CisJCXJldHVybiBxYmgtPmRhdGEgPSBxYmgtPmJoWzBdLT5iX2RhdGE7CisJfQorCiAJcWJoLT5kYXRhID0gZGF0YSA9IGttYWxsb2MoMjA0OCwgR0ZQX05PRlMpOwogCWlmICghZGF0YSkgewogCQlwcmludGsoIkhQRlM6IGhwZnNfbWFwXzRzZWN0b3JzOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBiYWlsOworCQlnb3RvIGJhaWw0OwogCX0KIAotCXFiaC0+YmhbMF0gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vKTsKLQlpZiAoIWJoKQotCQlnb3RvIGJhaWwwOwotCW1lbWNweShkYXRhLCBiaC0+Yl9kYXRhLCA1MTIpOwotCi0JcWJoLT5iaFsxXSA9IGJoID0gc2JfYnJlYWQocywgc2Vjbm8gKyAxKTsKLQlpZiAoIWJoKQotCQlnb3RvIGJhaWwxOwotCW1lbWNweShkYXRhICsgNTEyLCBiaC0+Yl9kYXRhLCA1MTIpOwotCi0JcWJoLT5iaFsyXSA9IGJoID0gc2JfYnJlYWQocywgc2Vjbm8gKyAyKTsKLQlpZiAoIWJoKQotCQlnb3RvIGJhaWwyOwotCW1lbWNweShkYXRhICsgMiAqIDUxMiwgYmgtPmJfZGF0YSwgNTEyKTsKLQotCXFiaC0+YmhbM10gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vICsgMyk7Ci0JaWYgKCFiaCkKLQkJZ290byBiYWlsMzsKLQltZW1jcHkoZGF0YSArIDMgKiA1MTIsIGJoLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KGRhdGEgKyAwICogNTEyLCBxYmgtPmJoWzBdLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KGRhdGEgKyAxICogNTEyLCBxYmgtPmJoWzFdLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KGRhdGEgKyAyICogNTEyLCBxYmgtPmJoWzJdLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KGRhdGEgKyAzICogNTEyLCBxYmgtPmJoWzNdLT5iX2RhdGEsIDUxMik7CiAKIAlyZXR1cm4gZGF0YTsKIAorIGJhaWw0OgorCWJyZWxzZShxYmgtPmJoWzNdKTsKICBiYWlsMzoKIAlicmVsc2UocWJoLT5iaFsyXSk7CiAgYmFpbDI6CkBAIC0xMzUsOSArMTMyLDYgQEAKICBiYWlsMToKIAlicmVsc2UocWJoLT5iaFswXSk7CiAgYmFpbDA6Ci0Ja2ZyZWUoZGF0YSk7Ci0JcHJpbnRrKCJIUEZTOiBocGZzX21hcF80c2VjdG9yczogcmVhZCBlcnJvclxuIik7Ci0gYmFpbDoKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTU1LDQ0ICsxNDksNTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JLypyZXR1cm4gaHBmc19tYXBfNHNlY3RvcnMocywgc2Vjbm8sIHFiaCwgMCk7Ki8KKwlpZiAoIWhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDAsICZxYmgtPmJoWzBdKSkgZ290byBiYWlsMDsKKwlpZiAoIWhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDEsICZxYmgtPmJoWzFdKSkgZ290byBiYWlsMTsKKwlpZiAoIWhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDIsICZxYmgtPmJoWzJdKSkgZ290byBiYWlsMjsKKwlpZiAoIWhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDMsICZxYmgtPmJoWzNdKSkgZ290byBiYWlsMzsKKworCWlmIChsaWtlbHkocWJoLT5iaFsxXS0+Yl9kYXRhID09IHFiaC0+YmhbMF0tPmJfZGF0YSArIDEgKiA1MTIpICYmCisJICAgIGxpa2VseShxYmgtPmJoWzJdLT5iX2RhdGEgPT0gcWJoLT5iaFswXS0+Yl9kYXRhICsgMiAqIDUxMikgJiYKKwkgICAgbGlrZWx5KHFiaC0+YmhbM10tPmJfZGF0YSA9PSBxYmgtPmJoWzBdLT5iX2RhdGEgKyAzICogNTEyKSkgeworCQlyZXR1cm4gcWJoLT5kYXRhID0gcWJoLT5iaFswXS0+Yl9kYXRhOworCX0KKwogCWlmICghKHFiaC0+ZGF0YSA9IGttYWxsb2MoMjA0OCwgR0ZQX05PRlMpKSkgewogCQlwcmludGsoIkhQRlM6IGhwZnNfZ2V0XzRzZWN0b3JzOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gYmFpbDQ7CiAJfQotCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubywgJnFiaC0+YmhbMF0pKSkgZ290byBiYWlsMDsKLQlpZiAoIShocGZzX2dldF9zZWN0b3Iocywgc2Vjbm8gKyAxLCAmcWJoLT5iaFsxXSkpKSBnb3RvIGJhaWwxOwotCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDIsICZxYmgtPmJoWzJdKSkpIGdvdG8gYmFpbDI7Ci0JaWYgKCEoaHBmc19nZXRfc2VjdG9yKHMsIHNlY25vICsgMywgJnFiaC0+YmhbM10pKSkgZ290byBiYWlsMzsKLQltZW1jcHkocWJoLT5kYXRhLCBxYmgtPmJoWzBdLT5iX2RhdGEsIDUxMik7Ci0JbWVtY3B5KHFiaC0+ZGF0YSArIDUxMiwgcWJoLT5iaFsxXS0+Yl9kYXRhLCA1MTIpOwotCW1lbWNweShxYmgtPmRhdGEgKyAyKjUxMiwgcWJoLT5iaFsyXS0+Yl9kYXRhLCA1MTIpOwotCW1lbWNweShxYmgtPmRhdGEgKyAzKjUxMiwgcWJoLT5iaFszXS0+Yl9kYXRhLCA1MTIpOwogCXJldHVybiBxYmgtPmRhdGE7CiAKLQliYWlsMzoJYnJlbHNlKHFiaC0+YmhbMl0pOwotCWJhaWwyOglicmVsc2UocWJoLT5iaFsxXSk7Ci0JYmFpbDE6CWJyZWxzZShxYmgtPmJoWzBdKTsKLQliYWlsMDoKK2JhaWw0OgorCWJyZWxzZShxYmgtPmJoWzNdKTsKK2JhaWwzOgorCWJyZWxzZShxYmgtPmJoWzJdKTsKK2JhaWwyOgorCWJyZWxzZShxYmgtPmJoWzFdKTsKK2JhaWwxOgorCWJyZWxzZShxYmgtPmJoWzBdKTsKK2JhaWwwOgogCXJldHVybiBOVUxMOwogfQogCQogCiB2b2lkIGhwZnNfYnJlbHNlNChzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqcWJoKQogewotCWJyZWxzZShxYmgtPmJoWzNdKTsKLQlicmVsc2UocWJoLT5iaFsyXSk7Ci0JYnJlbHNlKHFiaC0+YmhbMV0pOworCWlmICh1bmxpa2VseShxYmgtPmRhdGEgIT0gcWJoLT5iaFswXS0+Yl9kYXRhKSkKKwkJa2ZyZWUocWJoLT5kYXRhKTsKIAlicmVsc2UocWJoLT5iaFswXSk7Ci0Ja2ZyZWUocWJoLT5kYXRhKTsKKwlicmVsc2UocWJoLT5iaFsxXSk7CisJYnJlbHNlKHFiaC0+YmhbMl0pOworCWJyZWxzZShxYmgtPmJoWzNdKTsKIH0JCiAKIHZvaWQgaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgpCiB7Ci0JbWVtY3B5KHFiaC0+YmhbMF0tPmJfZGF0YSwgcWJoLT5kYXRhLCA1MTIpOwotCW1lbWNweShxYmgtPmJoWzFdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDUxMiwgNTEyKTsKLQltZW1jcHkocWJoLT5iaFsyXS0+Yl9kYXRhLCBxYmgtPmRhdGEgKyAyICogNTEyLCA1MTIpOwotCW1lbWNweShxYmgtPmJoWzNdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDMgKiA1MTIsIDUxMik7CisJaWYgKHVubGlrZWx5KHFiaC0+ZGF0YSAhPSBxYmgtPmJoWzBdLT5iX2RhdGEpKSB7CisJCW1lbWNweShxYmgtPmJoWzBdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDAgKiA1MTIsIDUxMik7CisJCW1lbWNweShxYmgtPmJoWzFdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDEgKiA1MTIsIDUxMik7CisJCW1lbWNweShxYmgtPmJoWzJdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDIgKiA1MTIsIDUxMik7CisJCW1lbWNweShxYmgtPmJoWzNdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDMgKiA1MTIsIDUxMik7CisJfQogCW1hcmtfYnVmZmVyX2RpcnR5KHFiaC0+YmhbMF0pOwogCW1hcmtfYnVmZmVyX2RpcnR5KHFiaC0+YmhbMV0pOwogCW1hcmtfYnVmZmVyX2RpcnR5KHFiaC0+YmhbMl0pOwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9ocGZzX2ZuLmggYi9mcy9ocGZzL2hwZnNfZm4uaAppbmRleCA2Nzk3YmY4Li4zYmE0OWMwIDEwMDY0NAotLS0gYS9mcy9ocGZzL2hwZnNfZm4uaAorKysgYi9mcy9ocGZzL2hwZnNfZm4uaApAQCAtMzEyLDcgKzMxMiw3IEBACiBfX3ByaW50ZigyLCAzKQogdm9pZCBocGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIC4uLik7CiBpbnQgaHBmc19zdG9wX2N5Y2xlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBpbnQgKiwgaW50ICosIGNoYXIgKik7Ci11bnNpZ25lZCBocGZzX2NvdW50X29uZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vKTsKK3Vuc2lnbmVkIGhwZnNfZ2V0X2ZyZWVfZG5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAogLyoKICAqIGxvY2FsIHRpbWUgKEhQRlMpIHRvIEdNVCAoVW5peCkKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvc3VwZXIuYyBiL2ZzL2hwZnMvc3VwZXIuYwppbmRleCBiOGQwMWVmLi40NTM0ZmY2IDEwMDY0NAotLS0gYS9mcy9ocGZzL3N1cGVyLmMKKysrIGIvZnMvaHBmcy9zdXBlci5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAljYWxsX3JjdSgmaHBmc19zYihzKS0+cmN1LCBsYXp5X2ZyZWVfc2JpKTsKIH0KIAotdW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2Vjbm8pCitzdGF0aWMgdW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2Vjbm8pCiB7CiAJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOwogCXVuc2lnbmVkIGxvbmcgKmJpdHM7CkBAIC0xMjksNyArMTI5LDcgQEAKIAogCWJpdHMgPSBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgJnFiaCwgMCk7CiAJaWYgKCFiaXRzKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuICh1bnNpZ25lZCktMTsKIAljb3VudCA9IGJpdG1hcF93ZWlnaHQoYml0cywgMjA0OCAqIEJJVFNfUEVSX0JZVEUpOwogCWhwZnNfYnJlbHNlNCgmcWJoKTsKIAlyZXR1cm4gY291bnQ7CkBAIC0xNDQsMzAgKzE0NCw0NSBAQAogCQlocGZzX3ByZWZldGNoX2JpdG1hcChzLCBuKTsKIAl9CiAJZm9yIChuID0gMDsgbiA8IG5fYmFuZHM7IG4rKykgeworCQl1bnNpZ25lZCBjOwogCQlocGZzX3ByZWZldGNoX2JpdG1hcChzLCBuICsgQ09VTlRfUkRfQUhFQUQpOwotCQljb3VudCArPSBocGZzX2NvdW50X29uZV9iaXRtYXAocywgbGUzMl90b19jcHUoaHBmc19zYihzKS0+c2JfYm1wX2RpcltuXSkpOworCQljID0gaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIGxlMzJfdG9fY3B1KGhwZnNfc2IocyktPnNiX2JtcF9kaXJbbl0pKTsKKwkJaWYgKGMgIT0gKHVuc2lnbmVkKS0xKQorCQkJY291bnQgKz0gYzsKIAl9CiAJcmV0dXJuIGNvdW50OwogfQogCit1bnNpZ25lZCBocGZzX2dldF9mcmVlX2Rub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKKwlpZiAoc2JpLT5zYl9uX2ZyZWVfZG5vZGVzID09ICh1bnNpZ25lZCktMSkgeworCQl1bnNpZ25lZCBjID0gaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIHNiaS0+c2JfZG1hcCk7CisJCWlmIChjID09ICh1bnNpZ25lZCktMSkKKwkJCXJldHVybiAwOworCQlzYmktPnNiX25fZnJlZV9kbm9kZXMgPSBjOworCX0KKwlyZXR1cm4gc2JpLT5zYl9uX2ZyZWVfZG5vZGVzOworfQorCiBzdGF0aWMgaW50IGhwZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKIAl1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYocy0+c19iZGV2LT5iZF9kZXYpOworCiAJaHBmc19sb2NrKHMpOwogCi0JLyppZiAoc2JpLT5zYl9uX2ZyZWUgPT0gLTEpIHsqLworCWlmIChzYmktPnNiX25fZnJlZSA9PSAodW5zaWduZWQpLTEpCiAJCXNiaS0+c2Jfbl9mcmVlID0gY291bnRfYml0bWFwcyhzKTsKLQkJc2JpLT5zYl9uX2ZyZWVfZG5vZGVzID0gaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIHNiaS0+c2JfZG1hcCk7Ci0JLyp9Ki8KKwogCWJ1Zi0+Zl90eXBlID0gcy0+c19tYWdpYzsKIAlidWYtPmZfYnNpemUgPSA1MTI7CiAJYnVmLT5mX2Jsb2NrcyA9IHNiaS0+c2JfZnNfc2l6ZTsKIAlidWYtPmZfYmZyZWUgPSBzYmktPnNiX25fZnJlZTsKIAlidWYtPmZfYmF2YWlsID0gc2JpLT5zYl9uX2ZyZWU7CiAJYnVmLT5mX2ZpbGVzID0gc2JpLT5zYl9kaXJiYW5kX3NpemUgLyA0OwotCWJ1Zi0+Zl9mZnJlZSA9IHNiaS0+c2Jfbl9mcmVlX2Rub2RlczsKKwlidWYtPmZfZmZyZWUgPSBocGZzX2dldF9mcmVlX2Rub2RlcyhzKTsKIAlidWYtPmZfZnNpZC52YWxbMF0gPSAodTMyKWlkOwogCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9ICh1MzIpKGlkID4+IDMyKTsKIAlidWYtPmZfbmFtZWxlbiA9IDI1NDsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDM2MGQyN2MuLjhkODExZTAgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMTk5OCwyMCArMTk5OCwyMCBAQAogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCAxKTsKIAotCWJpby0+Ymlfc2VjdG9yID0gYnAtPmxfYmxrbm8gPDwgKGxvZy0+bDJic2l6ZSAtIDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBicC0+bF9ibGtubyA8PCAobG9nLT5sMmJzaXplIC0gOSk7CiAJYmlvLT5iaV9iZGV2ID0gbG9nLT5iZGV2OwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UgPSBicC0+bF9wYWdlOwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IExPR1BTSVpFOwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IGJwLT5sX29mZnNldDsKIAogCWJpby0+YmlfdmNudCA9IDE7Ci0JYmlvLT5iaV9zaXplID0gTE9HUFNJWkU7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBMT0dQU0laRTsKIAogCWJpby0+YmlfZW5kX2lvID0gbGJtSU9Eb25lOwogCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCS8qY2hlY2sgaWYgam91cm5hbGluZyB0byBkaXNrIGhhcyBiZWVuIGRpc2FibGVkKi8KIAlpZiAobG9nLT5ub19pbnRlZ3JpdHkpIHsKLQkJYmlvLT5iaV9zaXplID0gMDsKKwkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSAwOwogCQlsYm1JT0RvbmUoYmlvLCAwKTsKIAl9IGVsc2UgewogCQlzdWJtaXRfYmlvKFJFQURfU1lOQywgYmlvKTsKQEAgLTIxNDQsMjEgKzIxNDQsMjEgQEAKIAlqZnNfaW5mbygibGJtU3RhcnRJT1xuIik7CiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOwotCWJpby0+Ymlfc2VjdG9yID0gYnAtPmxfYmxrbm8gPDwgKGxvZy0+bDJic2l6ZSAtIDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBicC0+bF9ibGtubyA8PCAobG9nLT5sMmJzaXplIC0gOSk7CiAJYmlvLT5iaV9iZGV2ID0gbG9nLT5iZGV2OwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UgPSBicC0+bF9wYWdlOwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IExPR1BTSVpFOwogCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IGJwLT5sX29mZnNldDsKIAogCWJpby0+YmlfdmNudCA9IDE7Ci0JYmlvLT5iaV9zaXplID0gTE9HUFNJWkU7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBMT0dQU0laRTsKIAogCWJpby0+YmlfZW5kX2lvID0gbGJtSU9Eb25lOwogCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCiAJLyogY2hlY2sgaWYgam91cm5hbGluZyB0byBkaXNrIGhhcyBiZWVuIGRpc2FibGVkICovCiAJaWYgKGxvZy0+bm9faW50ZWdyaXR5KSB7Ci0JCWJpby0+Ymlfc2l6ZSA9IDA7CisJCWJpby0+YmlfaXRlci5iaV9zaXplID0gMDsKIAkJbGJtSU9Eb25lKGJpbywgMCk7CiAJfSBlbHNlIHsKIAkJc3VibWl0X2JpbyhXUklURV9TWU5DLCBiaW8pOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19tZXRhcGFnZS5jIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCmluZGV4IGQxNjVjZGUuLjQ5YmE3ZmYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYworKysgYi9mcy9qZnMvamZzX21ldGFwYWdlLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogCQkJICogY291bnQgZnJvbSBoaXR0aW5nIHplcm8gYmVmb3JlIHdlJ3JlIHRocm91Z2gKIAkJCSAqLwogCQkJaW5jX2lvKHBhZ2UpOwotCQkJaWYgKCFiaW8tPmJpX3NpemUpCisJCQlpZiAoIWJpby0+YmlfaXRlci5iaV9zaXplKQogCQkJCWdvdG8gZHVtcF9iaW87CiAJCQlzdWJtaXRfYmlvKFdSSVRFLCBiaW8pOwogCQkJbnJfdW5kZXJ3YXkrKzsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCiAJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CiAJCWJpby0+YmlfYmRldiA9IGlub2RlLT5pX3NiLT5zX2JkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gcGJsb2NrIDw8IChpbm9kZS0+aV9ibGtiaXRzIC0gOSk7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBwYmxvY2sgPDwgKGlub2RlLT5pX2Jsa2JpdHMgLSA5KTsKIAkJYmlvLT5iaV9lbmRfaW8gPSBtZXRhcGFnZV93cml0ZV9lbmRfaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IHBhZ2U7CiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCWlmIChiaW8pIHsKIAkJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGJpb19ieXRlcywgYmlvX29mZnNldCkgPCBiaW9fYnl0ZXMpCiAJCQkJZ290byBhZGRfZmFpbGVkOwotCQlpZiAoIWJpby0+Ymlfc2l6ZSkKKwkJaWYgKCFiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkKIAkJCWdvdG8gZHVtcF9iaW87CiAKIAkJc3VibWl0X2JpbyhXUklURSwgYmlvKTsKQEAgLTUxNyw3ICs1MTcsOCBAQAogCiAJCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOwogCQkJYmlvLT5iaV9iZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKLQkJCWJpby0+Ymlfc2VjdG9yID0gcGJsb2NrIDw8IChpbm9kZS0+aV9ibGtiaXRzIC0gOSk7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0KKwkJCQlwYmxvY2sgPDwgKGlub2RlLT5pX2Jsa2JpdHMgLSA5KTsKIAkJCWJpby0+YmlfZW5kX2lvID0gbWV0YXBhZ2VfcmVhZF9lbmRfaW87CiAJCQliaW8tPmJpX3ByaXZhdGUgPSBwYWdlOwogCQkJbGVuID0geGxlbiA8PCBpbm9kZS0+aV9ibGtiaXRzOwpkaWZmIC0tZ2l0IGEvZnMvamZzL3hhdHRyLmMgYi9mcy9qZnMveGF0dHIuYwppbmRleCA1MzI0ZTRlLi40NjMyNWQ1IDEwMDY0NAotLS0gYS9mcy9qZnMveGF0dHIuYworKysgYi9mcy9qZnMveGF0dHIuYwpAQCAtNzkxLDYgKzc5MSwxOSBAQAogCQkJLyogQ29tcGxldGVseSBuZXcgZWEgbGlzdCAqLwogCQkJeGF0dHJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KTsKIAorCQkvKgorCQkgKiBUaGUgc2l6ZSBvZiBFQSB2YWx1ZSBpcyBsaW1pdHRlZCBieSBvbi1kaXNrIGZvcm1hdCB1cCB0bworCQkgKiAgX19sZTE2LCB0aGVyZSB3b3VsZCBiZSBhbiBvdmVyZmxvdyBpZiB0aGUgc2l6ZSBpcyBlcXVhbAorCQkgKiB0byBYQVRUUl9TSVpFX01BWCAoNjU1MzYpLiAgSW4gb3JkZXIgdG8gYXZvaWQgdGhpcyBpc3N1ZSwKKwkJICogd2UgY2FuIHByZS1jaGVja3VwIHRoZSB2YWx1ZSBzaXplIGFnYWluc3QgVVNIUlRfTUFYLCBhbmQKKwkJICogcmV0dXJuIC1FMkJJRyBpbiB0aGlzIGNhc2UsIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUKKwkJICogVkZTIHNldHhhdHRyIGludGVyZmFjZS4KKwkJICovCisJCWlmICh2YWx1ZV9sZW4gPj0gVVNIUlRfTUFYKSB7CisJCQlyYyA9IC1FMkJJRzsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorCiAJCWVhID0gKHN0cnVjdCBqZnNfZWEgKikgKChjaGFyICopIGVhbGlzdCArIHhhdHRyX3NpemUpOwogCQllYS0+ZmxhZyA9IDA7CiAJCWVhLT5uYW1lbGVuID0gbmFtZWxlbjsKQEAgLTgwNSw3ICs4MTgsNyBAQAogCS8qIERFQlVHIC0gSWYgd2UgZGlkIHRoaXMgcmlnaHQsIHRoZXNlIG51bWJlciBtYXRjaCAqLwogCWlmICh4YXR0cl9zaXplICE9IG5ld19zaXplKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImpmc194c2V0YXR0cjogeGF0dHJfc2l6ZSA9ICVkLCBuZXdfc2l6ZSA9ICVkXG4iLAorCQkgICAgICAgIl9famZzX3NldHhhdHRyOiB4YXR0cl9zaXplID0gJWQsIG5ld19zaXplID0gJWRcbiIsCiAJCSAgICAgICB4YXR0cl9zaXplLCBuZXdfc2l6ZSk7CiAKIAkJcmMgPSAtRUlOVkFMOwpAQCAtODQxLDkgKzg1NCw2IEBACiAJaW50IHJjOwogCXRpZF90IHRpZDsKIAotCWlmICgocmMgPSBjYW5fc2V0X3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKSkpCi0JCXJldHVybiByYzsKLQogCS8qCiAJICogSWYgdGhpcyBpcyBhIHJlcXVlc3QgZm9yIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpbiB0aGUgc3lzdGVtLioKIAkgKiBuYW1lc3BhY2UgdXNlIHRoZSBnZW5lcmljIGluZnJhc3RydWN0dXJlIHRvIHJlc29sdmUgYSBoYW5kbGVyCkBAIC04NTIsNiArODYyLDkgQEAKIAlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pKQogCQlyZXR1cm4gZ2VuZXJpY19zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4sIGZsYWdzKTsKIAorCWlmICgocmMgPSBjYW5fc2V0X3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKSkpCisJCXJldHVybiByYzsKKwogCWlmICh2YWx1ZSA9PSBOVUxMKSB7CS8qIGVtcHR5IEVBLCBkbyBub3QgcmVtb3ZlICovCiAJCXZhbHVlID0gIiI7CiAJCXZhbHVlX2xlbiA9IDA7CkBAIC0xMDIxLDkgKzEwMzQsNiBAQAogCWludCByYzsKIAl0aWRfdCB0aWQ7CiAKLQlpZiAoKHJjID0gY2FuX3NldF94YXR0cihpbm9kZSwgbmFtZSwgTlVMTCwgMCkpKQotCQlyZXR1cm4gcmM7Ci0KIAkvKgogCSAqIElmIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaW4gdGhlIHN5c3RlbS4qCiAJICogbmFtZXNwYWNlIHVzZSB0aGUgZ2VuZXJpYyBpbmZyYXN0cnVjdHVyZSB0byByZXNvbHZlIGEgaGFuZGxlcgpAQCAtMTAzMiw2ICsxMDQyLDkgQEAKIAlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pKQogCQlyZXR1cm4gZ2VuZXJpY19yZW1vdmV4YXR0cihkZW50cnksIG5hbWUpOwogCisJaWYgKChyYyA9IGNhbl9zZXRfeGF0dHIoaW5vZGUsIG5hbWUsIE5VTEwsIDApKSkKKwkJcmV0dXJuIHJjOworCiAJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgMCk7CiAJbXV0ZXhfbG9jaygmamktPmNvbW1pdF9tdXRleCk7CiAJcmMgPSBfX2pmc19zZXR4YXR0cih0aWQsIGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwgWEFUVFJfUkVQTEFDRSk7CkBAIC0xMDQ4LDcgKzEwNjEsNyBAQAogICogYXR0cmlidXRlcyBhcmUgaGFuZGxlZCBkaXJlY3RseS4KICAqLwogY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmpmc194YXR0cl9oYW5kbGVyc1tdID0gewotI2lmZGVmIEpGU19QT1NJWF9BQ0wKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAogCSZwb3NpeF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIsCiAJJnBvc2l4X2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuYwppbmRleCA1MTA0Y2Y1Li5iZDZlMThiIDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZGlyLmMKKysrIGIvZnMva2VybmZzL2Rpci5jCkBAIC0xODcsMTkgKzE4NywyMyBAQAogCiAJa24tPnUuY29tcGxldGlvbiA9ICh2b2lkICopJndhaXQ7CiAKLQlyd3NlbV9hY3F1aXJlKCZrbi0+ZGVwX21hcCwgMCwgMCwgX1JFVF9JUF8pOworCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwkJcndzZW1fYWNxdWlyZSgma24tPmRlcF9tYXAsIDAsIDAsIF9SRVRfSVBfKTsKIAkvKiBhdG9taWNfYWRkX3JldHVybigpIGlzIGEgbWIoKSwgcHV0X2FjdGl2ZSgpIHdpbGwgYWx3YXlzIHNlZQogCSAqIHRoZSB1cGRhdGVkIGtuLT51LmNvbXBsZXRpb24uCiAJICovCiAJdiA9IGF0b21pY19hZGRfcmV0dXJuKEtOX0RFQUNUSVZBVEVEX0JJQVMsICZrbi0+YWN0aXZlKTsKIAogCWlmICh2ICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMpIHsKLQkJbG9ja19jb250ZW5kZWQoJmtuLT5kZXBfbWFwLCBfUkVUX0lQXyk7CisJCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwkJCWxvY2tfY29udGVuZGVkKCZrbi0+ZGVwX21hcCwgX1JFVF9JUF8pOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKIAl9CiAKLQlsb2NrX2FjcXVpcmVkKCZrbi0+ZGVwX21hcCwgX1JFVF9JUF8pOwotCXJ3c2VtX3JlbGVhc2UoJmtuLT5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7CisJaWYgKGtuLT5mbGFncyAmIEtFUk5GU19MT0NLREVQKSB7CisJCWxvY2tfYWNxdWlyZWQoJmtuLT5kZXBfbWFwLCBfUkVUX0lQXyk7CisJCXJ3c2VtX3JlbGVhc2UoJmtuLT5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7CisJfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2Rldl9iZGV2LmMgYi9mcy9sb2dmcy9kZXZfYmRldi5jCmluZGV4IDBmOTVmMGQuLjc2Mjc5ZTEgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2Rldl9iZGV2LmMKKysrIGIvZnMvbG9nZnMvZGV2X2JkZXYuYwpAQCAtMjYsOSArMjYsOSBAQAogCWJpb192ZWMuYnZfbGVuID0gUEFHRV9TSVpFOwogCWJpb192ZWMuYnZfb2Zmc2V0ID0gMDsKIAliaW8uYmlfdmNudCA9IDE7Ci0JYmlvLmJpX3NpemUgPSBQQUdFX1NJWkU7CiAJYmlvLmJpX2JkZXYgPSBiZGV2OwotCWJpby5iaV9zZWN0b3IgPSBwYWdlLT5pbmRleCAqIChQQUdFX1NJWkUgPj4gOSk7CisJYmlvLmJpX2l0ZXIuYmlfc2VjdG9yID0gcGFnZS0+aW5kZXggKiAoUEFHRV9TSVpFID4+IDkpOworCWJpby5iaV9pdGVyLmJpX3NpemUgPSBQQUdFX1NJWkU7CiAKIAlyZXR1cm4gc3VibWl0X2Jpb193YWl0KHJ3LCAmYmlvKTsKIH0KQEAgLTU2LDIyICs1NiwxOCBAQAogc3RhdGljIHZvaWQgd3JpdGVzZWdfZW5kX2lvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKIAljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlpbnQgaTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gYmlvLT5iaV9wcml2YXRlOwogCXN0cnVjdCBsb2dmc19zdXBlciAqc3VwZXIgPSBsb2dmc19zdXBlcihzYik7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlCVUdfT04oIXVwdG9kYXRlKTsgLyogRklYTUU6IFJldHJ5IGlvIG9yIHdyaXRlIGVsc2V3aGVyZSAqLwogCUJVR19PTihlcnIpOwotCUJVR19PTihiaW8tPmJpX3ZjbnQgPT0gMCk7Ci0JZG8gewotCQlwYWdlID0gYnZlYy0+YnZfcGFnZTsKLQkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKLQkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOwogCi0JCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmVjLCBiaW8sIGkpIHsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKGJ2ZWMtPmJ2X3BhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoYnZlYy0+YnZfcGFnZSk7CisJfQogCWJpb19wdXQoYmlvKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3VwZXItPnNfcGVuZGluZ193cml0ZXMpKQogCQl3YWtlX3VwKCZ3cSk7CkBAIC05Niw5ICs5Miw5IEBACiAJCWlmIChpID49IG1heF9wYWdlcykgewogCQkJLyogQmxvY2sgbGF5ZXIgY2Fubm90IHNwbGl0IGJpb3MgOiggKi8KIAkJCWJpby0+YmlfdmNudCA9IGk7Ci0JCQliaW8tPmJpX3NpemUgPSBpICogUEFHRV9TSVpFOworCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBpICogUEFHRV9TSVpFOwogCQkJYmlvLT5iaV9iZGV2ID0gc3VwZXItPnNfYmRldjsKLQkJCWJpby0+Ymlfc2VjdG9yID0gb2ZzID4+IDk7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb2ZzID4+IDk7CiAJCQliaW8tPmJpX3ByaXZhdGUgPSBzYjsKIAkJCWJpby0+YmlfZW5kX2lvID0gd3JpdGVzZWdfZW5kX2lvOwogCQkJYXRvbWljX2luYygmc3VwZXItPnNfcGVuZGluZ193cml0ZXMpOwpAQCAtMTIzLDkgKzExOSw5IEBACiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KIAliaW8tPmJpX3ZjbnQgPSBucl9wYWdlczsKLQliaW8tPmJpX3NpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKKwliaW8tPmJpX2l0ZXIuYmlfc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwogCWJpby0+YmlfYmRldiA9IHN1cGVyLT5zX2JkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBvZnMgPj4gOTsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb2ZzID4+IDk7CiAJYmlvLT5iaV9wcml2YXRlID0gc2I7CiAJYmlvLT5iaV9lbmRfaW8gPSB3cml0ZXNlZ19lbmRfaW87CiAJYXRvbWljX2luYygmc3VwZXItPnNfcGVuZGluZ193cml0ZXMpOwpAQCAtMTg4LDkgKzE4NCw5IEBACiAJCWlmIChpID49IG1heF9wYWdlcykgewogCQkJLyogQmxvY2sgbGF5ZXIgY2Fubm90IHNwbGl0IGJpb3MgOiggKi8KIAkJCWJpby0+YmlfdmNudCA9IGk7Ci0JCQliaW8tPmJpX3NpemUgPSBpICogUEFHRV9TSVpFOworCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBpICogUEFHRV9TSVpFOwogCQkJYmlvLT5iaV9iZGV2ID0gc3VwZXItPnNfYmRldjsKLQkJCWJpby0+Ymlfc2VjdG9yID0gb2ZzID4+IDk7CisJCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb2ZzID4+IDk7CiAJCQliaW8tPmJpX3ByaXZhdGUgPSBzYjsKIAkJCWJpby0+YmlfZW5kX2lvID0gZXJhc2VfZW5kX2lvOwogCQkJYXRvbWljX2luYygmc3VwZXItPnNfcGVuZGluZ193cml0ZXMpOwpAQCAtMjA5LDkgKzIwNSw5IEBACiAJCWJpby0+YmlfaW9fdmVjW2ldLmJ2X29mZnNldCA9IDA7CiAJfQogCWJpby0+YmlfdmNudCA9IG5yX3BhZ2VzOwotCWJpby0+Ymlfc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOworCWJpby0+YmlfaXRlci5iaV9zaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAJYmlvLT5iaV9iZGV2ID0gc3VwZXItPnNfYmRldjsKLQliaW8tPmJpX3NlY3RvciA9IG9mcyA+PiA5OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBvZnMgPj4gOTsKIAliaW8tPmJpX3ByaXZhdGUgPSBzYjsKIAliaW8tPmJpX2VuZF9pbyA9IGVyYXNlX2VuZF9pbzsKIAlhdG9taWNfaW5jKCZzdXBlci0+c19wZW5kaW5nX3dyaXRlcyk7CmRpZmYgLS1naXQgYS9mcy9tcGFnZS5jIGIvZnMvbXBhZ2UuYwppbmRleCAwZmFjZTFjLi40OTc5ZmZhIDEwMDY0NAotLS0gYS9mcy9tcGFnZS5jCisrKyBiL2ZzL21wYWdlLmMKQEAgLTQzLDE2ICs0MywxNCBAQAogICovCiBzdGF0aWMgdm9pZCBtcGFnZV9lbmRfaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQogewotCWNvbnN0IGludCB1cHRvZGF0ZSA9IHRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwotCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX3ZjbnQgLSAxOworCXN0cnVjdCBiaW9fdmVjICpidjsKKwlpbnQgaTsKIAotCWRvIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYmlvLCBpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnYtPmJ2X3BhZ2U7CiAKLQkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKLQkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOwogCQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgewotCQkJaWYgKHVwdG9kYXRlKSB7CisJCQlpZiAoIWVycikgewogCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCX0gZWxzZSB7CiAJCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC02MCwxNCArNTgsMTUgQEAKIAkJCX0KIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9IGVsc2UgeyAvKiBiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSAqLwotCQkJaWYgKCF1cHRvZGF0ZSkgeworCQkJaWYgKGVycikgewogCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJCQlpZiAocGFnZS0+bWFwcGluZykKIAkJCQkJc2V0X2JpdChBU19FSU8sICZwYWdlLT5tYXBwaW5nLT5mbGFncyk7CiAJCQl9CiAJCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CiAJCX0KLQl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwl9CisKIAliaW9fcHV0KGJpbyk7CiB9CiAKQEAgLTk0LDcgKzkzLDcgQEAKIAogCWlmIChiaW8pIHsKIAkJYmlvLT5iaV9iZGV2ID0gYmRldjsKLQkJYmlvLT5iaV9zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CisJCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CiAJfQogCXJldHVybiBiaW87CiB9CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBiY2I4MzhlLi4zODVmNzgxIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTE5Niw2ICsxOTYsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJcmVzdWx0LT51cHRyID0gZmlsZW5hbWU7CisJcmVzdWx0LT5hbmFtZSA9IE5VTEw7CiAJYXVkaXRfZ2V0bmFtZShyZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CiAKQEAgLTIwOSw3ICsyMTAsMzUgQEAKIHsKIAlyZXR1cm4gZ2V0bmFtZV9mbGFncyhmaWxlbmFtZSwgMCwgTlVMTCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdldG5hbWUpOworCisvKgorICogVGhlICJnZXRuYW1lX2tlcm5lbCgpIiBpbnRlcmZhY2UgZG9lc24ndCBkbyBwYXRobmFtZXMgbG9uZ2VyCisgKiB0aGFuIEVNQkVEREVEX05BTUVfTUFYLiBEZWFsIHdpdGggaXQgLSB5b3UncmUgYSBrZXJuZWwgdXNlci4KKyAqLworc3RydWN0IGZpbGVuYW1lICoKK2dldG5hbWVfa2VybmVsKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZW5hbWUgKnJlc3VsdDsKKwljaGFyICprbmFtZTsKKwlpbnQgbGVuOworCisJbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlpZiAobGVuID49IEVNQkVEREVEX05BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCXJlc3VsdCA9IF9fZ2V0bmFtZSgpOworCWlmICh1bmxpa2VseSghcmVzdWx0KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlrbmFtZSA9IChjaGFyICopcmVzdWx0ICsgc2l6ZW9mKCpyZXN1bHQpOworCXJlc3VsdC0+bmFtZSA9IGtuYW1lOworCXJlc3VsdC0+dXB0ciA9IE5VTEw7CisJcmVzdWx0LT5hbmFtZSA9IE5VTEw7CisJcmVzdWx0LT5zZXBhcmF0ZSA9IGZhbHNlOworCisJc3RybGNweShrbmFtZSwgZmlsZW5hbWUsIEVNQkVEREVEX05BTUVfTUFYKTsKKwlyZXR1cm4gcmVzdWx0OworfQogCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogdm9pZCBwdXRuYW1lKHN0cnVjdCBmaWxlbmFtZSAqbmFtZSkKQEAgLTM5MjcsMTAgKzM5NTYsMTMgQEAKIAlkb25lX3BhdGhfY3JlYXRlKCZuZXdfcGF0aCwgbmV3X2RlbnRyeSk7CiAJaWYgKGRlbGVnYXRlZF9pbm9kZSkgewogCQllcnJvciA9IGJyZWFrX2RlbGVnX3dhaXQoJmRlbGVnYXRlZF9pbm9kZSk7Ci0JCWlmICghZXJyb3IpCisJCWlmICghZXJyb3IpIHsKKwkJCXBhdGhfcHV0KCZvbGRfcGF0aCk7CiAJCQlnb3RvIHJldHJ5OworCQl9CiAJfQogCWlmIChyZXRyeV9lc3RhbGUoZXJyb3IsIGhvdykpIHsKKwkJcGF0aF9wdXQoJm9sZF9wYXRoKTsKIAkJaG93IHw9IExPT0tVUF9SRVZBTDsKIAkJZ290byByZXRyeTsKIAl9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCmluZGV4IGUyNDJiYmYuLjU2ZmY4MjMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCisrKyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCkBAIC0xMzQsOCArMTM0LDggQEAKIAlpZiAoYmlvKSB7CiAJCWdldF9wYXJhbGxlbChiaW8tPmJpX3ByaXZhdGUpOwogCQlkcHJpbnRrKCIlcyBzdWJtaXR0aW5nICVzIGJpbyAldUAlbGx1XG4iLCBfX2Z1bmNfXywKLQkJCXJ3ID09IFJFQUQgPyAicmVhZCIgOiAid3JpdGUiLAotCQkJYmlvLT5iaV9zaXplLCAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yKTsKKwkJCXJ3ID09IFJFQUQgPyAicmVhZCIgOiAid3JpdGUiLCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcik7CiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtMTU2LDcgKzE1Niw4IEBACiAJfQogCiAJaWYgKGJpbykgewotCQliaW8tPmJpX3NlY3RvciA9IGlzZWN0IC0gYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX3Zfb2Zmc2V0OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gaXNlY3QgLSBiZS0+YmVfZl9vZmZzZXQgKworCQkJYmUtPmJlX3Zfb2Zmc2V0OwogCQliaW8tPmJpX2JkZXYgPSBiZS0+YmVfbWRldjsKIAkJYmlvLT5iaV9lbmRfaW8gPSBlbmRfaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IHBhcjsKQEAgLTIwMSwxOCArMjAyLDE0IEBACiBzdGF0aWMgdm9pZCBibF9lbmRfaW9fcmVhZChzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7Ci0JY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJaW50IGk7CiAKLQlkbyB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKKwlpZiAoIWVycikKKwkJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2ZWMsIGJpbywgaSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShidmVjLT5idl9wYWdlKTsKIAotCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQotCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7Ci0JCWlmICh1cHRvZGF0ZSkKLQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKLQlpZiAoIXVwdG9kYXRlKSB7CisJaWYgKGVycikgewogCQlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEgPSBwYXItPmRhdGE7CiAJCXN0cnVjdCBuZnNfcGdpb19oZWFkZXIgKmhlYWRlciA9IHJkYXRhLT5oZWFkZXI7CiAKQEAgLTM4MywyMCArMzgwLDE2IEBACiBzdGF0aWMgdm9pZCBibF9lbmRfaW9fd3JpdGVfemVybyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7Ci0JY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJaW50IGk7CiAKLQlkbyB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKLQotCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQotCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2ZWMsIGJpbywgaSkgewogCQkvKiBUaGlzIGlzIHRoZSB6ZXJvaW5nIHBhZ2Ugd2UgYWRkZWQgKi8KLQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhidmVjLT5idl9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGJ2ZWMtPmJ2X3BhZ2UpOworCX0KIAotCWlmICh1bmxpa2VseSghdXB0b2RhdGUpKSB7CisJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhID0gcGFyLT5kYXRhOwogCQlzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICpoZWFkZXIgPSBkYXRhLT5oZWFkZXI7CiAKQEAgLTUxOSw3ICs1MTIsNyBAQAogCWlzZWN0ID0gKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0VDVE9SX1NISUZUKSArCiAJCShvZmZzZXQgLyBTRUNUT1JfU0laRSk7CiAKLQliaW8tPmJpX3NlY3RvciA9IGlzZWN0IC0gYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX3Zfb2Zmc2V0OworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBpc2VjdCAtIGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV92X29mZnNldDsKIAliaW8tPmJpX2JkZXYgPSBiZS0+YmVfbWRldjsKIAliaW8tPmJpX2VuZF9pbyA9IGJsX3JlYWRfc2luZ2xlX2VuZF9pbzsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IGIyNjZmNzMuLjRhNDhmZTQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTI3NCw2ICsyNzQsMTUgQEAKIAlyZXR1cm4gLUVCQURDT09LSUU7CiB9CiAKK3N0YXRpYyBib29sCituZnNfcmVhZGRpcl9pbm9kZV9tYXBwaW5nX3ZhbGlkKHN0cnVjdCBuZnNfaW5vZGUgKm5mc2kpCit7CisJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBKSkKKwkJcmV0dXJuIGZhbHNlOworCXNtcF9ybWIoKTsKKwlyZXR1cm4gIXRlc3RfYml0KE5GU19JTk9fSU5WQUxJREFUSU5HLCAmbmZzaS0+ZmxhZ3MpOworfQorCiBzdGF0aWMKIGludCBuZnNfcmVhZGRpcl9zZWFyY2hfZm9yX2Nvb2tpZShzdHJ1Y3QgbmZzX2NhY2hlX2FycmF5ICphcnJheSwgbmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjKQogewpAQCAtMjg3LDggKzI5Niw4IEBACiAJCQlzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eCA9IGRlc2MtPmZpbGUtPnByaXZhdGVfZGF0YTsKIAogCQkJbmV3X3BvcyA9IGRlc2MtPmN1cnJlbnRfaW5kZXggKyBpOwotCQkJaWYgKGN0eC0+YXR0cl9nZW5jb3VudCAhPSBuZnNpLT5hdHRyX2dlbmNvdW50Ci0JCQkgICAgfHwgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBKSkpIHsKKwkJCWlmIChjdHgtPmF0dHJfZ2VuY291bnQgIT0gbmZzaS0+YXR0cl9nZW5jb3VudCB8fAorCQkJICAgICFuZnNfcmVhZGRpcl9pbm9kZV9tYXBwaW5nX3ZhbGlkKG5mc2kpKSB7CiAJCQkJY3R4LT5kdXBlZCA9IDA7CiAJCQkJY3R4LT5hdHRyX2dlbmNvdW50ID0gbmZzaS0+YXR0cl9nZW5jb3VudDsKIAkJCX0gZWxzZSBpZiAobmV3X3BvcyA8IGRlc2MtPmN0eC0+cG9zKSB7CkBAIC0xODM3LDYgKzE4NDYsMTEgQEAKIAkJCQkJCQlHRlBfS0VSTkVMKSkgewogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOworCQkvKgorCQkgKiBhZGRfdG9fcGFnZV9jYWNoZV9scnUoKSBncmFicyBhbiBleHRyYSBwYWdlIHJlZmNvdW50LgorCQkgKiBEcm9wIGl0IGhlcmUgdG8gYXZvaWQgbGVha2luZyB0aGlzIHBhZ2UgbGF0ZXIuCisJCSAqLworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfSBlbHNlCiAJCV9fZnJlZV9wYWdlKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IGVhMDBiMzQuLjI4YTBhM2MgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC05NzcsMTEgKzk3NywxMSBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfk5GU19JTk9fSU5WQUxJRF9EQVRBOwotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCW1lbXNldChuZnNpLT5jb29raWV2ZXJmLCAwLCBzaXplb2YobmZzaS0+Y29va2lldmVyZikpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0KIAluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfREFUQUlOVkFMSURBVEUpOwogCW5mc19mc2NhY2hlX3dhaXRfb25faW52YWxpZGF0ZShpbm9kZSk7CiAKQEAgLTEwMDgsNiArMTAwOCw3IEBACiBpbnQgbmZzX3JldmFsaWRhdGVfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgKmJpdGxvY2sgPSAmbmZzaS0+ZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBzd2FwZmlsZXMgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBzaGFyZWQuICovCkBAIC0xMDE5LDEyICsxMDIwLDQ2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQotCWlmIChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fSU5WQUxJRF9EQVRBKSB7Ci0JCXRyYWNlX25mc19pbnZhbGlkYXRlX21hcHBpbmdfZW50ZXIoaW5vZGUpOwotCQlyZXQgPSBuZnNfaW52YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBtYXBwaW5nKTsKLQkJdHJhY2VfbmZzX2ludmFsaWRhdGVfbWFwcGluZ19leGl0KGlub2RlLCByZXQpOworCisJLyoKKwkgKiBXZSBtdXN0IGNsZWFyIE5GU19JTk9fSU5WQUxJRF9EQVRBIGZpcnN0IHRvIGVuc3VyZSB0aGF0CisJICogaW52YWxpZGF0aW9ucyB0aGF0IGNvbWUgaW4gd2hpbGUgd2UncmUgc2hvb3RpbmcgZG93biB0aGUgbWFwcGluZ3MKKwkgKiBhcmUgcmVzcGVjdGVkLiBCdXQsIHRoYXQgbGVhdmVzIGEgcmFjZSB3aW5kb3cgd2hlcmUgb25lIHJldmFsaWRhdG9yCisJICogY2FuIGNsZWFyIHRoZSBmbGFnLCBhbmQgdGhlbiBhbm90aGVyIGNoZWNrcyBpdCBiZWZvcmUgdGhlIG1hcHBpbmcKKwkgKiBnZXRzIGludmFsaWRhdGVkLiBGaXggdGhhdCBieSBzZXJpYWxpemluZyBhY2Nlc3MgdG8gdGhpcyBwYXJ0IG9mCisJICogdGhlIGZ1bmN0aW9uLgorCSAqCisJICogQXQgdGhlIHNhbWUgdGltZSwgd2UgbmVlZCB0byBhbGxvdyBvdGhlciB0YXNrcyB0byBzZWUgd2hldGhlciB3ZQorCSAqIG1pZ2h0IGJlIGluIHRoZSBtaWRkbGUgb2YgaW52YWxpZGF0aW5nIHRoZSBwYWdlcywgc28gd2Ugb25seSBzZXQKKwkgKiB0aGUgYml0IGxvY2sgaGVyZSBpZiBpdCBsb29rcyBsaWtlIHdlJ3JlIGdvaW5nIHRvIGJlIGRvaW5nIHRoYXQuCisJICovCisJZm9yICg7OykgeworCQlyZXQgPSB3YWl0X29uX2JpdChiaXRsb2NrLCBORlNfSU5PX0lOVkFMSURBVElORywKKwkJCQkgIG5mc193YWl0X2JpdF9raWxsYWJsZSwgVEFTS19LSUxMQUJMRSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKHRlc3RfYml0KE5GU19JTk9fSU5WQUxJREFUSU5HLCBiaXRsb2NrKSkgeworCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgTkZTX0lOT19JTlZBTElEX0RBVEEpCisJCQlicmVhazsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlnb3RvIG91dDsKIAl9CiAKKwlzZXRfYml0KE5GU19JTk9fSU5WQUxJREFUSU5HLCBiaXRsb2NrKTsKKwlzbXBfd21iKCk7CisJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfk5GU19JTk9fSU5WQUxJRF9EQVRBOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwl0cmFjZV9uZnNfaW52YWxpZGF0ZV9tYXBwaW5nX2VudGVyKGlub2RlKTsKKwlyZXQgPSBuZnNfaW52YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBtYXBwaW5nKTsKKwl0cmFjZV9uZnNfaW52YWxpZGF0ZV9tYXBwaW5nX2V4aXQoaW5vZGUsIHJldCk7CisKKwljbGVhcl9iaXRfdW5sb2NrKE5GU19JTk9fSU5WQUxJREFUSU5HLCBiaXRsb2NrKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCXdha2VfdXBfYml0KGJpdGxvY2ssIE5GU19JTk9fSU5WQUxJREFUSU5HKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNhY2wuYyBiL2ZzL25mcy9uZnMzYWNsLmMKaW5kZXggOWE1Y2EwMy4uODcxZDZlZCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNhY2wuYworKysgYi9mcy9uZnMvbmZzM2FjbC5jCkBAIC04MCw3ICs4MCw3IEBACiAJfQogCiAJaWYgKHJlcy5hY2xfYWNjZXNzICE9IE5VTEwpIHsKLQkJaWYgKHBvc2l4X2FjbF9lcXVpdl9tb2RlKHJlcy5hY2xfYWNjZXNzLCBOVUxMKSB8fAorCQlpZiAoKHBvc2l4X2FjbF9lcXVpdl9tb2RlKHJlcy5hY2xfYWNjZXNzLCBOVUxMKSA9PSAwKSB8fAogCQkgICAgcmVzLmFjbF9hY2Nlc3MtPmFfY291bnQgPT0gMCkgewogCQkJcG9zaXhfYWNsX3JlbGVhc2UocmVzLmFjbF9hY2Nlc3MpOwogCQkJcmVzLmFjbF9hY2Nlc3MgPSBOVUxMOwpAQCAtMTEzLDcgKzExMyw3IEBACiAJcmV0dXJuIEVSUl9QVFIoc3RhdHVzKTsKIH0KIAotaW50IG5mczNfcHJvY19zZXRhY2xzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwKK3N0YXRpYyBpbnQgX19uZnMzX3Byb2Nfc2V0YWNscyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsCiAJCXN0cnVjdCBwb3NpeF9hY2wgKmRmYWNsKQogewogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKQEAgLTE5OCw2ICsxOTgsMTUgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitpbnQgbmZzM19wcm9jX3NldGFjbHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsLAorCQlzdHJ1Y3QgcG9zaXhfYWNsICpkZmFjbCkKK3sKKwlpbnQgcmV0OworCXJldCA9IF9fbmZzM19wcm9jX3NldGFjbHMoaW5vZGUsIGFjbCwgZGZhY2wpOworCXJldHVybiAocmV0ID09IC1FT1BOT1RTVVBQKSA/IDAgOiByZXQ7CisKK30KKwogaW50IG5mczNfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIGludCB0eXBlKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFsbG9jID0gTlVMTCwgKmRmYWNsID0gTlVMTDsKQEAgLTIyNSw3ICsyMzQsNyBAQAogCQlpZiAoSVNfRVJSKGFsbG9jKSkKIAkJCWdvdG8gZmFpbDsKIAl9Ci0Jc3RhdHVzID0gbmZzM19wcm9jX3NldGFjbHMoaW5vZGUsIGFjbCwgZGZhY2wpOworCXN0YXR1cyA9IF9fbmZzM19wcm9jX3NldGFjbHMoaW5vZGUsIGFjbCwgZGZhY2wpOwogCXBvc2l4X2FjbF9yZWxlYXNlKGFsbG9jKTsKIAlyZXR1cm4gc3RhdHVzOwogCkBAIC0yMzMsMjUgKzI0Miw2IEBACiAJcmV0dXJuIFBUUl9FUlIoYWxsb2MpOwogfQogCi1pbnQgbmZzM19wcm9jX3NldF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJdW1vZGVfdCBtb2RlKQotewotCXN0cnVjdCBwb3NpeF9hY2wgKmRlZmF1bHRfYWNsLCAqYWNsOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZShkaXIsICZtb2RlLCAmZGVmYXVsdF9hY2wsICZhY2wpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIChlcnJvciA9PSAtRU9QTk9UU1VQUCkgPyAwIDogZXJyb3I7Ci0KLQllcnJvciA9IG5mczNfcHJvY19zZXRhY2xzKGlub2RlLCBhY2wsIGRlZmF1bHRfYWNsKTsKLQotCWlmIChhY2wpCi0JCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JaWYgKGRlZmF1bHRfYWNsKQotCQlwb3NpeF9hY2xfcmVsZWFzZShkZWZhdWx0X2FjbCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqbmZzM194YXR0cl9oYW5kbGVyc1tdID0gewogCSZwb3NpeF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIsCiAJJnBvc2l4X2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3Byb2MuYyBiL2ZzL25mcy9uZnMzcHJvYy5jCmluZGV4IGQyMjU1ZDcuLmFhOWJjOTcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzcHJvYy5jCisrKyBiL2ZzL25mcy9uZnMzcHJvYy5jCkBAIC05MjQsMTEgKzkyNCwxMSBAQAogCS5wZXJtaXNzaW9uCT0gbmZzX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKIAkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAorI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCiAJLmxpc3R4YXR0cgk9IGdlbmVyaWNfbGlzdHhhdHRyLAogCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKIAkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAotI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCiAJLmdldF9hY2wJPSBuZnMzX2dldF9hY2wsCiAJLnNldF9hY2wJPSBuZnMzX3NldF9hY2wsCiAjZW5kaWYKQEAgLTkzOCwxMSArOTM4LDExIEBACiAJLnBlcm1pc3Npb24JPSBuZnNfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG5mc19nZXRhdHRyLAogCS5zZXRhdHRyCT0gbmZzX3NldGF0dHIsCisjaWZkZWYgQ09ORklHX05GU19WM19BQ0wKIAkubGlzdHhhdHRyCT0gZ2VuZXJpY19saXN0eGF0dHIsCiAJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAogCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCi0jaWZkZWYgQ09ORklHX05GU19WM19BQ0wKIAkuZ2V0X2FjbAk9IG5mczNfZ2V0X2FjbCwKIAkuc2V0X2FjbAk9IG5mczNfc2V0X2FjbCwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRfZnMuaCBiL2ZzL25mcy9uZnM0X2ZzLmgKaW5kZXggNTYwOWVkYy4uYTViMjdjMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRfZnMuaAorKysgYi9mcy9uZnMvbmZzNF9mcy5oCkBAIC0yNzAsNiArMjcwLDcgQEAKIGV4dGVybiBpbnQgbmZzNDFfc2V0dXBfc2VxdWVuY2Uoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyAqYXJncywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMsCiAJCXN0cnVjdCBycGNfdGFzayAqdGFzayk7CitleHRlcm4gaW50IG5mczQxX3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICosIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqKTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgbmZzNF9zZXNzaW9uICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2dldF9sZWFzZV90aW1lKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGNsaWVudC5jIGIvZnMvbmZzL25mczRjbGllbnQuYwppbmRleCA3M2Q0ZWNkLi44NjBhZDI2IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGNsaWVudC5jCisrKyBiL2ZzL25mcy9uZnM0Y2xpZW50LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogdm9pZCBuZnM0MF9zaHV0ZG93bl9jbGllbnQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlpZiAoY2xwLT5jbF9zbG90X3RibCkgewotCQluZnM0X3JlbGVhc2Vfc2xvdF90YWJsZShjbHAtPmNsX3Nsb3RfdGJsKTsKKwkJbmZzNF9zaHV0ZG93bl9zbG90X3RhYmxlKGNscC0+Y2xfc2xvdF90YmwpOwogCQlrZnJlZShjbHAtPmNsX3Nsb3RfdGJsKTsKIAl9CiB9CkBAIC0zNzIsMTAgKzM3Miw3IEBACiAJX19zZXRfYml0KE5GU19DU19ESVNDUlRSWSwgJmNscC0+Y2xfZmxhZ3MpOwogCV9fc2V0X2JpdChORlNfQ1NfTk9fUkVUUkFOU19USU1FT1VULCAmY2xwLT5jbF9mbGFncyk7CiAKLQllcnJvciA9IC1FSU5WQUw7Ci0JaWYgKGdzc2RfcnVubmluZyhjbHAtPmNsX25ldCkpCi0JCWVycm9yID0gbmZzX2NyZWF0ZV9ycGNfY2xpZW50KGNscCwgdGltZXBhcm1zLAotCQkJCQkgICAgICBSUENfQVVUSF9HU1NfS1JCNUkpOworCWVycm9yID0gbmZzX2NyZWF0ZV9ycGNfY2xpZW50KGNscCwgdGltZXBhcm1zLCBSUENfQVVUSF9HU1NfS1JCNUkpOwogCWlmIChlcnJvciA9PSAtRUlOVkFMKQogCQllcnJvciA9IG5mc19jcmVhdGVfcnBjX2NsaWVudChjbHAsIHRpbWVwYXJtcywgUlBDX0FVVEhfVU5JWCk7CiAJaWYgKGVycm9yIDwgMCkKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jIGIvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKaW5kZXggMDNmZDhiZS4uMTJjODEzMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKKysrIGIvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKQEAgLTMzNSw4ICszMzUsMTAgQEAKIAlkcHJpbnRrKCItLT4gJXMgdGFzay0+dGtfc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgdGFzay0+dGtfc3RhdHVzKTsKIAogCWlmICh0ZXN0X2JpdChORlNfSU9IRFJfUkVETywgJnJkYXRhLT5oZWFkZXItPmZsYWdzKSAmJgotCSAgICB0YXNrLT50a19zdGF0dXMgPT0gMCkKKwkgICAgdGFzay0+dGtfc3RhdHVzID09IDApIHsKKwkJbmZzNDFfc2VxdWVuY2VfZG9uZSh0YXNrLCAmcmRhdGEtPnJlcy5zZXFfcmVzKTsKIAkJcmV0dXJuOworCX0KIAogCS8qIE5vdGUgdGhpcyBtYXkgY2F1c2UgUlBDIHRvIGJlIHJlc2VudCAqLwogCXJkYXRhLT5oZWFkZXItPm1kc19vcHMtPnJwY19jYWxsX2RvbmUodGFzaywgZGF0YSk7CkBAIC00NDIsOCArNDQ0LDEwIEBACiAJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSA9IGRhdGE7CiAKIAlpZiAodGVzdF9iaXQoTkZTX0lPSERSX1JFRE8sICZ3ZGF0YS0+aGVhZGVyLT5mbGFncykgJiYKLQkgICAgdGFzay0+dGtfc3RhdHVzID09IDApCisJICAgIHRhc2stPnRrX3N0YXR1cyA9PSAwKSB7CisJCW5mczQxX3NlcXVlbmNlX2RvbmUodGFzaywgJndkYXRhLT5yZXMuc2VxX3Jlcyk7CiAJCXJldHVybjsKKwl9CiAKIAkvKiBOb3RlIHRoaXMgbWF5IGNhdXNlIFJQQyB0byBiZSByZXNlbnQgKi8KIAl3ZGF0YS0+aGVhZGVyLT5tZHNfb3BzLT5ycGNfY2FsbF9kb25lKHRhc2ssIGRhdGEpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBhMTk2NTMyLi4yZGE2YTY5IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJc3RydWN0IG5mczRfc2xvdCAqc2xvdCA9IHJlcy0+c3Jfc2xvdDsKIAlzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0Ymw7CiAKLQlpZiAoIVJQQ19XQVNfU0VOVCh0YXNrKSkKKwlpZiAoc2xvdCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAogCXRibCA9IHNsb3QtPnRhYmxlOwpAQCAtNTU5LDE1ICs1NTksMTAgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibDsKKwlzdHJ1Y3QgbmZzNF9zbG90ICpzbG90ID0gcmVzLT5zcl9zbG90OwogCWJvb2wgc2VuZF9uZXdfaGlnaGVzdF91c2VkX3Nsb3RpZCA9IGZhbHNlOwogCi0JaWYgKCFyZXMtPnNyX3Nsb3QpIHsKLQkJLyoganVzdCB3YWtlIHVwIHRoZSBuZXh0IGd1eSB3YWl0aW5nIHNpbmNlCi0JCSAqIHdlIG1heSBoYXZlIG5vdCBjb25zdW1lZCBhIHNsb3QgYWZ0ZXIgYWxsICovCi0JCWRwcmludGsoIiVzOiBObyBzbG90XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JdGJsID0gcmVzLT5zcl9zbG90LT50YWJsZTsKKwl0YmwgPSBzbG90LT50YWJsZTsKIAlzZXNzaW9uID0gdGJsLT5zZXNzaW9uOwogCiAJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwpAQCAtNTc3LDExICs1NzIsMTEgQEAKIAlpZiAodGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID4gdGJsLT50YXJnZXRfaGlnaGVzdF9zbG90aWQpCiAJCXNlbmRfbmV3X2hpZ2hlc3RfdXNlZF9zbG90aWQgPSB0cnVlOwogCi0JaWYgKG5mczQxX3dha2VfYW5kX2Fzc2lnbl9zbG90KHRibCwgcmVzLT5zcl9zbG90KSkgeworCWlmIChuZnM0MV93YWtlX2FuZF9hc3NpZ25fc2xvdCh0YmwsIHNsb3QpKSB7CiAJCXNlbmRfbmV3X2hpZ2hlc3RfdXNlZF9zbG90aWQgPSBmYWxzZTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQluZnM0X2ZyZWVfc2xvdCh0YmwsIHJlcy0+c3Jfc2xvdCk7CisJbmZzNF9mcmVlX3Nsb3QodGJsLCBzbG90KTsKIAogCWlmICh0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgIT0gTkZTNF9OT19TTE9UKQogCQlzZW5kX25ld19oaWdoZXN0X3VzZWRfc2xvdGlkID0gZmFsc2U7CkBAIC01OTIsMTkgKzU4NywyMCBAQAogCQluZnM0MV9zZXJ2ZXJfbm90aWZ5X2hpZ2hlc3Rfc2xvdGlkX3VwZGF0ZShzZXNzaW9uLT5jbHApOwogfQogCi1zdGF0aWMgaW50IG5mczQxX3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK2ludCBuZnM0MV9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgbmZzNF9zbG90ICpzbG90OworCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QgPSByZXMtPnNyX3Nsb3Q7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAlib29sIGludGVycnVwdGVkID0gZmFsc2U7CiAJaW50IHJldCA9IDE7CiAKKwlpZiAoc2xvdCA9PSBOVUxMKQorCQlnb3RvIG91dF9ub2FjdGlvbjsKIAkvKiBkb24ndCBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIG51bWJlciBpZiB0aGUgdGFzayB3YXNuJ3Qgc2VudCAqLwogCWlmICghUlBDX1dBU19TRU5UKHRhc2spKQogCQlnb3RvIG91dDsKIAotCXNsb3QgPSByZXMtPnNyX3Nsb3Q7CiAJc2Vzc2lvbiA9IHNsb3QtPnRhYmxlLT5zZXNzaW9uOwogCiAJaWYgKHNsb3QtPmludGVycnVwdGVkKSB7CkBAIC02NzksNiArNjc1LDcgQEAKIAkvKiBUaGUgc2Vzc2lvbiBtYXkgYmUgcmVzZXQgYnkgb25lIG9mIHRoZSBlcnJvciBoYW5kbGVycy4gKi8KIAlkcHJpbnRrKCIlczogRXJyb3IgJWQgZnJlZSB0aGUgc2xvdCBcbiIsIF9fZnVuY19fLCByZXMtPnNyX3N0YXR1cyk7CiAJbmZzNDFfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CitvdXRfbm9hY3Rpb246CiAJcmV0dXJuIHJldDsKIHJldHJ5X25vd2FpdDoKIAlpZiAocnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spKSB7CkBAIC02OTIsNiArNjg5LDcgQEAKIAlycGNfZGVsYXkodGFzaywgTkZTNF9QT0xMX1JFVFJZX01BWCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZnM0MV9zZXF1ZW5jZV9kb25lKTsKIAogc3RhdGljIGludCBuZnM0X3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAogCQkJICAgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQpAQCAtMTYyMiwxNSArMTYyMCwxNSBAQAogewogCXN0cnVjdCBuZnM0X29wZW5kYXRhICpkYXRhID0gY2FsbGRhdGE7CiAKLQluZnM0MF9zZXR1cF9zZXF1ZW5jZShkYXRhLT5vX2FyZy5zZXJ2ZXIsICZkYXRhLT5vX2FyZy5zZXFfYXJncywKLQkJCQkmZGF0YS0+b19yZXMuc2VxX3JlcywgdGFzayk7CisJbmZzNDBfc2V0dXBfc2VxdWVuY2UoZGF0YS0+b19hcmcuc2VydmVyLCAmZGF0YS0+Y19hcmcuc2VxX2FyZ3MsCisJCQkJJmRhdGEtPmNfcmVzLnNlcV9yZXMsIHRhc2spOwogfQogCiBzdGF0aWMgdm9pZCBuZnM0X29wZW5fY29uZmlybV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mczRfb3BlbmRhdGEgKmRhdGEgPSBjYWxsZGF0YTsKIAotCW5mczQwX3NlcXVlbmNlX2RvbmUodGFzaywgJmRhdGEtPm9fcmVzLnNlcV9yZXMpOworCW5mczQwX3NlcXVlbmNlX2RvbmUodGFzaywgJmRhdGEtPmNfcmVzLnNlcV9yZXMpOwogCiAJZGF0YS0+cnBjX3N0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKIAlpZiAoZGF0YS0+cnBjX3N0YXR1cyA9PSAwKSB7CkBAIC0xNjg4LDcgKzE2ODYsNyBAQAogCX07CiAJaW50IHN0YXR1czsKIAotCW5mczRfaW5pdF9zZXF1ZW5jZSgmZGF0YS0+b19hcmcuc2VxX2FyZ3MsICZkYXRhLT5vX3Jlcy5zZXFfcmVzLCAxKTsKKwluZnM0X2luaXRfc2VxdWVuY2UoJmRhdGEtPmNfYXJnLnNlcV9hcmdzLCAmZGF0YS0+Y19yZXMuc2VxX3JlcywgMSk7CiAJa3JlZl9nZXQoJmRhdGEtPmtyZWYpOwogCWRhdGEtPnJwY19kb25lID0gMDsKIAlkYXRhLT5ycGNfc3RhdHVzID0gMDsKQEAgLTI3NDQsNyArMjc0Miw4IEBACiAJCQkJTkZTX0NBUF9PV05FUl9HUk9VUHxORlNfQ0FQX0FUSU1FfAogCQkJCU5GU19DQVBfQ1RJTUV8TkZTX0NBUF9NVElNRXwKIAkJCQlORlNfQ0FQX1NFQ1VSSVRZX0xBQkVMKTsKLQkJaWYgKHJlcy5hdHRyX2JpdG1hc2tbMF0gJiBGQVRUUjRfV09SRDBfQUNMKQorCQlpZiAocmVzLmF0dHJfYml0bWFza1swXSAmIEZBVFRSNF9XT1JEMF9BQ0wgJiYKKwkJCQlyZXMuYWNsX2JpdG1hc2sgJiBBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMKQogCQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfQUNMUzsKIAkJaWYgKHJlcy5oYXNfbGlua3MgIT0gMCkKIAkJCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0hBUkRMSU5LUzsKQEAgLTQzMjEsOSArNDMyMCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IG5mczRfc2VydmVyX3N1cHBvcnRzX2FjbHMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKLQlyZXR1cm4gKHNlcnZlci0+Y2FwcyAmIE5GU19DQVBfQUNMUykKLQkJJiYgKHNlcnZlci0+YWNsX2JpdG1hc2sgJiBBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMKQotCQkmJiAoc2VydmVyLT5hY2xfYml0bWFzayAmIEFDTDRfU1VQUE9SVF9ERU5ZX0FDTCk7CisJcmV0dXJuIHNlcnZlci0+Y2FwcyAmIE5GU19DQVBfQUNMUzsKIH0KIAogLyogQXNzdW1pbmcgdGhhdCBYQVRUUl9TSVpFX01BWCBpcyBhIG11bHRpcGxlIG9mIFBBR0VfU0laRSwgYW5kIHRoYXQKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5jIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKaW5kZXggY2Y4ODNjNy4uZTc5OWRjMyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzZXNzaW9uLmMKKysrIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKQEAgLTIzMSwxNCArMjMxLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIG5mczRfcmVsZWFzZV9zbG90X3RhYmxlIC0gcmVsZWFzZSBhbGwgc2xvdCB0YWJsZSBlbnRyaWVzCisgKi8KK3N0YXRpYyB2b2lkIG5mczRfcmVsZWFzZV9zbG90X3RhYmxlKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCkKK3sKKwluZnM0X3Nocmlua19zbG90X3RhYmxlKHRibCwgMCk7Cit9CisKIC8qKgotICogbmZzNF9yZWxlYXNlX3Nsb3RfdGFibGUgLSByZWxlYXNlIHJlc291cmNlcyBhdHRhY2hlZCB0byBhIHNsb3QgdGFibGUKKyAqIG5mczRfc2h1dGRvd25fc2xvdF90YWJsZSAtIHJlbGVhc2UgcmVzb3VyY2VzIGF0dGFjaGVkIHRvIGEgc2xvdCB0YWJsZQogICogQHRibDogc2xvdCB0YWJsZSB0byBzaHV0IGRvd24KICAqCiAgKi8KLXZvaWQgbmZzNF9yZWxlYXNlX3Nsb3RfdGFibGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKQordm9pZCBuZnM0X3NodXRkb3duX3Nsb3RfdGFibGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKQogewotCW5mczRfc2hyaW5rX3Nsb3RfdGFibGUodGJsLCAwKTsKKwluZnM0X3JlbGVhc2Vfc2xvdF90YWJsZSh0YmwpOworCXJwY19kZXN0cm95X3dhaXRfcXVldWUoJnRibC0+c2xvdF90Ymxfd2FpdHEpOwogfQogCiAvKioKQEAgLTQyMiw3ICs0MzEsNyBAQAogCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBuZnM0X2Rlc3Ryb3lfc2Vzc2lvbl9zbG90X3RhYmxlcyhzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgbmZzNF9yZWxlYXNlX3Nlc3Npb25fc2xvdF90YWJsZXMoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAluZnM0X3JlbGVhc2Vfc2xvdF90YWJsZSgmc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZSk7CiAJbmZzNF9yZWxlYXNlX3Nsb3RfdGFibGUoJnNlc3Npb24tPmJjX3Nsb3RfdGFibGUpOwpAQCAtNDUwLDcgKzQ1OSw3IEBACiAJaWYgKHN0YXR1cyAmJiB0YmwtPnNsb3RzID09IE5VTEwpCiAJCS8qIEZvcmUgYW5kIGJhY2sgY2hhbm5lbCBzaGFyZSBhIGNvbm5lY3Rpb24gc28gZ2V0CiAJCSAqIGJvdGggc2xvdCB0YWJsZXMgb3IgbmVpdGhlciAqLwotCQluZnM0X2Rlc3Ryb3lfc2Vzc2lvbl9zbG90X3RhYmxlcyhzZXMpOworCQluZnM0X3JlbGVhc2Vfc2Vzc2lvbl9zbG90X3RhYmxlcyhzZXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ3MCw2ICs0NzksMTIgQEAKIAlyZXR1cm4gc2Vzc2lvbjsKIH0KIAorc3RhdGljIHZvaWQgbmZzNF9kZXN0cm95X3Nlc3Npb25fc2xvdF90YWJsZXMoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwluZnM0X3NodXRkb3duX3Nsb3RfdGFibGUoJnNlc3Npb24tPmZjX3Nsb3RfdGFibGUpOworCW5mczRfc2h1dGRvd25fc2xvdF90YWJsZSgmc2Vzc2lvbi0+YmNfc2xvdF90YWJsZSk7Cit9CisKIHZvaWQgbmZzNF9kZXN0cm95X3Nlc3Npb24oc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHNlc3Npb24uaCBiL2ZzL25mcy9uZnM0c2Vzc2lvbi5oCmluZGV4IDIzMjMwNjEuLmIzNGFkYTkgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5oCisrKyBiL2ZzL25mcy9uZnM0c2Vzc2lvbi5oCkBAIC03NCw3ICs3NCw3IEBACiAKIGV4dGVybiBpbnQgbmZzNF9zZXR1cF9zbG90X3RhYmxlKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwKIAkJdW5zaWduZWQgaW50IG1heF9yZXFzLCBjb25zdCBjaGFyICpxdWV1ZSk7Ci1leHRlcm4gdm9pZCBuZnM0X3JlbGVhc2Vfc2xvdF90YWJsZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwpOworZXh0ZXJuIHZvaWQgbmZzNF9zaHV0ZG93bl9zbG90X3RhYmxlKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCk7CiBleHRlcm4gc3RydWN0IG5mczRfc2xvdCAqbmZzNF9hbGxvY19zbG90KHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCk7CiBleHRlcm4gdm9pZCBuZnM0X2ZyZWVfc2xvdChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHZvaWQgbmZzNF9zbG90X3RibF9kcmFpbl9jb21wbGV0ZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggOGMyMWQ2OS4uNzJmM2JmMSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC0zNDQ5LDcgKzM0NDksNyBAQAogewogCV9fYmUzMiAqcDsKIAotCSpyZXMgPSBBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMfEFDTDRfU1VQUE9SVF9ERU5ZX0FDTDsKKwkqcmVzID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUIC0gMVUpKSkKIAkJcmV0dXJuIC1FSU87CiAJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCkpIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnN0cmFjZS5oIGIvZnMvbmZzL25mc3RyYWNlLmgKaW5kZXggODlmZTc0MS4uNTlmODM4YyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mc3RyYWNlLmgKKysrIGIvZnMvbmZzL25mc3RyYWNlLmgKQEAgLTM2LDYgKzM2LDcgQEAKIAlfX3ByaW50X2ZsYWdzKHYsICJ8IiwgXAogCQkJeyAxIDw8IE5GU19JTk9fQURWSVNFX1JEUExVUywgIkFEVklTRV9SRFBMVVMiIH0sIFwKIAkJCXsgMSA8PCBORlNfSU5PX1NUQUxFLCAiU1RBTEUiIH0sIFwKKwkJCXsgMSA8PCBORlNfSU5PX0lOVkFMSURBVElORywgIklOVkFMSURBVElORyIgfSwgXAogCQkJeyAxIDw8IE5GU19JTk9fRkxVU0hJTkcsICJGTFVTSElORyIgfSwgXAogCQkJeyAxIDw8IE5GU19JTk9fRlNDQUNIRSwgIkZTQ0FDSEUiIH0sIFwKIAkJCXsgMSA8PCBORlNfSU5PX0NPTU1JVCwgIkNPTU1JVCIgfSwgXApkaWZmIC0tZ2l0IGEvZnMvbmZzL3dyaXRlLmMgYi9mcy9uZnMvd3JpdGUuYwppbmRleCBhNDRhODcyLi45YTNiNmE0IDEwMDY0NAotLS0gYS9mcy9uZnMvd3JpdGUuYworKysgYi9mcy9uZnMvd3JpdGUuYwpAQCAtOTA5LDkgKzkwOSwxNCBAQAogICovCiBzdGF0aWMgYm9vbCBuZnNfd3JpdGVfcGFnZXVwdG9kYXRlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKIAlpZiAobmZzX2hhdmVfZGVsZWdhdGVkX2F0dHJpYnV0ZXMoaW5vZGUpKQogCQlnb3RvIG91dDsKLQlpZiAoTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRSkpCisJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fSU5WQUxJRF9EQVRBfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFKSkKKwkJcmV0dXJuIGZhbHNlOworCXNtcF9ybWIoKTsKKwlpZiAodGVzdF9iaXQoTkZTX0lOT19JTlZBTElEQVRJTkcsICZuZnNpLT5mbGFncykpCiAJCXJldHVybiBmYWxzZTsKIG91dDoKIAlyZXR1cm4gUGFnZVVwdG9kYXRlKHBhZ2UpICE9IDA7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2FjbC5oIGIvZnMvbmZzZC9hY2wuaAppbmRleCA4YjY4MjE4Li5hODEyZmQxIDEwMDY0NAotLS0gYS9mcy9uZnNkL2FjbC5oCisrKyBiL2ZzL25mc2QvYWNsLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogc3RydWN0IG5mczRfYWNsICpuZnM0X2FjbF9uZXcoaW50KTsKIGludCBuZnM0X2FjbF9nZXRfd2hvdHlwZShjaGFyICosIHUzMik7Ci1pbnQgbmZzNF9hY2xfd3JpdGVfd2hvKGludCB3aG8sIGNoYXIgKnApOworX19iZTMyIG5mczRfYWNsX3dyaXRlX3dobyhpbnQgd2hvLCBfX2JlMzIgKipwLCBpbnQgKmxlbik7CiAKIGludCBuZnNkNF9nZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQlzdHJ1Y3QgbmZzNF9hY2wgKiphY2wpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9jYWNoZS5oIGIvZnMvbmZzZC9jYWNoZS5oCmluZGV4IGQ1YzViM2UuLmI1ODJmOWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvY2FjaGUuaAorKysgYi9mcy9uZnNkL2NhY2hlLmgKQEAgLTg0LDEyICs4NCw0IEBACiB2b2lkCW5mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQsIF9fYmUzMiAqKTsKIGludAluZnNkX3JlcGx5X2NhY2hlX3N0YXRzX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCi0jaWZkZWYgQ09ORklHX05GU0RfVjQKLXZvaWQJbmZzZDRfc2V0X3N0YXRwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApOwotI2Vsc2UgIC8qIENPTkZJR19ORlNEX1Y0ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZzZDRfc2V0X3N0YXRwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GU0RfVjQgKi8KLQogI2VuZGlmIC8qIE5GU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25mc2QvaWRtYXAuaCBiL2ZzL25mc2QvaWRtYXAuaAppbmRleCBiZjk1ZjZiLi42NmU1OGRiIDEwMDY0NAotLS0gYS9mcy9uZnNkL2lkbWFwLmgKKysrIGIvZnMvbmZzZC9pZG1hcC5oCkBAIC01Niw3ICs1Niw3IEBACiAKIF9fYmUzMiBuZnNkX21hcF9uYW1lX3RvX3VpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGt1aWRfdCAqKTsKIF9fYmUzMiBuZnNkX21hcF9uYW1lX3RvX2dpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGtnaWRfdCAqKTsKLWludCBuZnNkX21hcF91aWRfdG9fbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwga3VpZF90LCBjaGFyICopOwotaW50IG5mc2RfbWFwX2dpZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqLCBrZ2lkX3QsIGNoYXIgKik7CitfX2JlMzIgbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICosIGt1aWRfdCwgX19iZTMyICoqLCBpbnQgKik7CitfX2JlMzIgbmZzZDRfZW5jb2RlX2dyb3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBrZ2lkX3QsIF9fYmUzMiAqKiwgaW50ICopOwogCiAjZW5kaWYgLyogTElOVVhfTkZTRF9JRE1BUF9IICovCmRpZmYgLS1naXQgYS9mcy9uZnNkL25ldG5zLmggYi9mcy9uZnNkL25ldG5zLmgKaW5kZXggODQ5YTdjMy4uZDMyYjNhYSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZXRucy5oCisrKyBiL2ZzL25mc2QvbmV0bnMuaApAQCAtOTUsNiArOTUsNyBAQAogCXRpbWVfdCBuZnNkNF9ncmFjZTsKIAogCWJvb2wgbmZzZF9uZXRfdXA7CisJYm9vbCBsb2NrZF91cDsKIAogCS8qCiAJICogVGltZSBvZiBzZXJ2ZXIgc3RhcnR1cApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzeGRyLmMgYi9mcy9uZnNkL25mczN4ZHIuYwppbmRleCAxNGQ5ZWNiLi5kZTZlMzllIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczN4ZHIuYworKysgYi9mcy9uZnNkL25mczN4ZHIuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJICAgICAgc3RydWN0IGtzdGF0ICpzdGF0KQogewogCSpwKysgPSBodG9ubChuZnMzX2Z0eXBlc1soc3RhdC0+bW9kZSAmIFNfSUZNVCkgPj4gMTJdKTsKLQkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC0+bW9kZSk7CisJKnArKyA9IGh0b25sKCh1MzIpIChzdGF0LT5tb2RlICYgU19JQUxMVUdPKSk7CiAJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQtPm5saW5rKTsKIAkqcCsrID0gaHRvbmwoKHUzMikgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIHN0YXQtPnVpZCkpOwogCSpwKysgPSBodG9ubCgodTMyKSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgc3RhdC0+Z2lkKSk7CkBAIC04NDIsMjEgKzg0MiwyMSBAQAogCiBzdGF0aWMgX19iZTMyICplbmNvZGVfZW50cnlwbHVzX2JhZ2dhZ2Uoc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkLCBfX2JlMzIgKnAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4pCiB7Ci0Jc3RydWN0IHN2Y19maAlmaDsKKwlzdHJ1Y3Qgc3ZjX2ZoCSpmaCA9ICZjZC0+c2NyYXRjaDsKIAlfX2JlMzIgZXJyOwogCi0JZmhfaW5pdCgmZmgsIE5GUzNfRkhTSVpFKTsKLQllcnIgPSBjb21wb3NlX2VudHJ5X2ZoKGNkLCAmZmgsIG5hbWUsIG5hbWxlbik7CisJZmhfaW5pdChmaCwgTkZTM19GSFNJWkUpOworCWVyciA9IGNvbXBvc2VfZW50cnlfZmgoY2QsIGZoLCBuYW1lLCBuYW1sZW4pOwogCWlmIChlcnIpIHsKIAkJKnArKyA9IDA7CiAJCSpwKysgPSAwOwogCQlnb3RvIG91dDsKIAl9Ci0JcCA9IGVuY29kZV9wb3N0X29wX2F0dHIoY2QtPnJxc3RwLCBwLCAmZmgpOworCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKGNkLT5ycXN0cCwgcCwgZmgpOwogCSpwKysgPSB4ZHJfb25lOwkJCS8qIHllcywgYSBmaWxlIGhhbmRsZSBmb2xsb3dzICovCi0JcCA9IGVuY29kZV9maChwLCAmZmgpOworCXAgPSBlbmNvZGVfZmgocCwgZmgpOwogb3V0OgotCWZoX3B1dCgmZmgpOworCWZoX3B1dChmaCk7CiAJcmV0dXJuIHA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGFjbC5jIGIvZnMvbmZzZC9uZnM0YWNsLmMKaW5kZXggNjQ5YWQ3Yy4uZDNhNTg3MSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0YWNsLmMKKysrIGIvZnMvbmZzZC9uZnM0YWNsLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJuZnNmaC5oIgorI2luY2x1ZGUgIm5mc2QuaCIKICNpbmNsdWRlICJhY2wuaCIKICNpbmNsdWRlICJ2ZnMuaCIKIApAQCAtOTE2LDE3ICs5MTcsMjIgQEAKIAlyZXR1cm4gTkZTNF9BQ0xfV0hPX05BTUVEOwogfQogCi1pbnQKLW5mczRfYWNsX3dyaXRlX3dobyhpbnQgd2hvLCBjaGFyICpwKQorX19iZTMyIG5mczRfYWNsX3dyaXRlX3dobyhpbnQgd2hvLCBfX2JlMzIgKipwLCBpbnQgKmxlbikKIHsKIAlpbnQgaTsKKwlpbnQgYnl0ZXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzMnRfbWFwKTsgaSsrKSB7Ci0JCWlmIChzMnRfbWFwW2ldLnR5cGUgPT0gd2hvKSB7Ci0JCQltZW1jcHkocCwgczJ0X21hcFtpXS5zdHJpbmcsIHMydF9tYXBbaV0uc3RyaW5nbGVuKTsKLQkJCXJldHVybiBzMnRfbWFwW2ldLnN0cmluZ2xlbjsKLQkJfQorCQlpZiAoczJ0X21hcFtpXS50eXBlICE9IHdobykKKwkJCWNvbnRpbnVlOworCQlieXRlcyA9IDQgKyAoWERSX1FVQURMRU4oczJ0X21hcFtpXS5zdHJpbmdsZW4pIDw8IDIpOworCQlpZiAoYnl0ZXMgPiAqbGVuKQorCQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKwkJKnAgPSB4ZHJfZW5jb2RlX29wYXF1ZSgqcCwgczJ0X21hcFtpXS5zdHJpbmcsCisJCQkJCXMydF9tYXBbaV0uc3RyaW5nbGVuKTsKKwkJKmxlbiAtPSBieXRlczsKKwkJcmV0dXJuIDA7CiAJfQotCUJVRygpOworCVdBUk5fT05fT05DRSgxKTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRpZG1hcC5jIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwppbmRleCA0ODMyZmQ4Li5jMGRmZGU2IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRpZG1hcC5jCisrKyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKQEAgLTU1MSwyNyArNTUxLDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWlkbWFwX2lkX3RvX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHR5cGUsIHUzMiBpZCwgY2hhciAqbmFtZSkKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2FzY2lpX2lkKHUzMiBpZCwgX19iZTMyICoqcCwgaW50ICpidWZsZW4pCit7CisJY2hhciBidWZbMTFdOworCWludCBsZW47CisJaW50IGJ5dGVzOworCisJbGVuID0gc3ByaW50ZihidWYsICIldSIsIGlkKTsKKwlieXRlcyA9IDQgKyAoWERSX1FVQURMRU4obGVuKSA8PCAyKTsKKwlpZiAoYnl0ZXMgPiAqYnVmbGVuKQorCQlyZXR1cm4gbmZzZXJyX3Jlc291cmNlOworCSpwID0geGRyX2VuY29kZV9vcGFxdWUoKnAsIGJ1ZiwgbGVuKTsKKwkqYnVmbGVuIC09IGJ5dGVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19iZTMyIGlkbWFwX2lkX3RvX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHR5cGUsIHUzMiBpZCwgX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7CiAJc3RydWN0IGVudCAqaXRlbSwga2V5ID0gewogCQkuaWQgPSBpZCwKIAkJLnR5cGUgPSB0eXBlLAogCX07CiAJaW50IHJldDsKKwlpbnQgYnl0ZXM7CiAJc3RydWN0IG5mc2RfbmV0ICpubiA9IG5ldF9nZW5lcmljKFNWQ19ORVQocnFzdHApLCBuZnNkX25ldF9pZCk7CiAKIAlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdF9hdXRobmFtZShycXN0cCksIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKIAlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIGlkdG9uYW1lX2xvb2t1cCwgJmtleSwgbm4tPmlkdG9uYW1lX2NhY2hlLCAmaXRlbSk7CiAJaWYgKHJldCA9PSAtRU5PRU5UKQotCQlyZXR1cm4gc3ByaW50ZihuYW1lLCAiJXUiLCBpZCk7CisJCXJldHVybiBlbmNvZGVfYXNjaWlfaWQoaWQsIHAsIGJ1Zmxlbik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIG5mc2Vycm5vKHJldCk7CiAJcmV0ID0gc3RybGVuKGl0ZW0tPm5hbWUpOwotCUJVR19PTihyZXQgPiBJRE1BUF9OQU1FU1opOwotCW1lbWNweShuYW1lLCBpdGVtLT5uYW1lLCByZXQpOworCVdBUk5fT05fT05DRShyZXQgPiBJRE1BUF9OQU1FU1opOworCWJ5dGVzID0gNCArIChYRFJfUVVBRExFTihyZXQpIDw8IDIpOworCWlmIChieXRlcyA+ICpidWZsZW4pCisJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisJKnAgPSB4ZHJfZW5jb2RlX29wYXF1ZSgqcCwgaXRlbS0+bmFtZSwgcmV0KTsKKwkqYnVmbGVuIC09IGJ5dGVzOwogCWNhY2hlX3B1dCgmaXRlbS0+aCwgbm4tPmlkdG9uYW1lX2NhY2hlKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgYm9vbApAQCAtNjAzLDEyICs2MjIsMTEgQEAKIAlyZXR1cm4gaWRtYXBfbmFtZV90b19pZChycXN0cCwgdHlwZSwgbmFtZSwgbmFtZWxlbiwgaWQpOwogfQogCi1zdGF0aWMgaW50Ci1kb19pZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlLCB1MzIgaWQsIGNoYXIgKm5hbWUpCitzdGF0aWMgX19iZTMyIGVuY29kZV9uYW1lX2Zyb21faWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHR5cGUsIHUzMiBpZCwgX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7CiAJaWYgKG5mczRfZGlzYWJsZV9pZG1hcHBpbmcgJiYgcnFzdHAtPnJxX2NyZWQuY3JfZmxhdm9yIDwgUlBDX0FVVEhfR1NTKQotCQlyZXR1cm4gc3ByaW50ZihuYW1lLCAiJXUiLCBpZCk7Ci0JcmV0dXJuIGlkbWFwX2lkX3RvX25hbWUocnFzdHAsIHR5cGUsIGlkLCBuYW1lKTsKKwkJcmV0dXJuIGVuY29kZV9hc2NpaV9pZChpZCwgcCwgYnVmbGVuKTsKKwlyZXR1cm4gaWRtYXBfaWRfdG9fbmFtZShycXN0cCwgdHlwZSwgaWQsIHAsIGJ1Zmxlbik7CiB9CiAKIF9fYmUzMgpAQCAtNjM3LDE2ICs2NTUsMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQKLW5mc2RfbWFwX3VpZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGt1aWRfdCB1aWQsIGNoYXIgKm5hbWUpCitfX2JlMzIgbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwga3VpZF90IHVpZCwgIF9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQogewogCXUzMiBpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCB1aWQpOwotCXJldHVybiBkb19pZF90b19uYW1lKHJxc3RwLCBJRE1BUF9UWVBFX1VTRVIsIGlkLCBuYW1lKTsKKwlyZXR1cm4gZW5jb2RlX25hbWVfZnJvbV9pZChycXN0cCwgSURNQVBfVFlQRV9VU0VSLCBpZCwgcCwgYnVmbGVuKTsKIH0KIAotaW50Ci1uZnNkX21hcF9naWRfdG9fbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBrZ2lkX3QgZ2lkLCBjaGFyICpuYW1lKQorX19iZTMyIG5mc2Q0X2VuY29kZV9ncm91cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBrZ2lkX3QgZ2lkLCBfX2JlMzIgKipwLCBpbnQgKmJ1ZmxlbikKIHsKIAl1MzIgaWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgZ2lkKTsKLQlyZXR1cm4gZG9faWRfdG9fbmFtZShycXN0cCwgSURNQVBfVFlQRV9HUk9VUCwgaWQsIG5hbWUpOworCXJldHVybiBlbmNvZGVfbmFtZV9mcm9tX2lkKHJxc3RwLCBJRE1BUF9UWVBFX0dST1VQLCBpZCwgcCwgYnVmbGVuKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwppbmRleCA4MjViOGE5Li44MjE4OWIyIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC0yMzEsMTcgKzIzMSwxNiBAQAogfQogCiBzdGF0aWMgX19iZTMyCi1kb19vcGVuX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCitkb19vcGVuX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4sIHN0cnVjdCBzdmNfZmggKipyZXNmaCkKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoID0gJmNzdGF0ZS0+Y3VycmVudF9maDsKLQlzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaDsKIAlpbnQgYWNjbW9kZTsKIAlfX2JlMzIgc3RhdHVzOwogCi0JcmVzZmggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ZjX2ZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXNmaCkKKwkqcmVzZmggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ZjX2ZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEqcmVzZmgpCiAJCXJldHVybiBuZnNlcnJfanVrZWJveDsKLQlmaF9pbml0KHJlc2ZoLCBORlM0X0ZIU0laRSk7CisJZmhfaW5pdCgqcmVzZmgsIE5GUzRfRkhTSVpFKTsKIAlvcGVuLT5vcF90cnVuY2F0ZSA9IDA7CiAKIAlpZiAob3Blbi0+b3BfY3JlYXRlKSB7CkBAIC0yNjYsMTIgKzI2NSwxMiBAQAogCQkgKi8KIAkJc3RhdHVzID0gZG9fbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4tPm9wX2ZuYW1lLmRhdGEsCiAJCQkJCW9wZW4tPm9wX2ZuYW1lLmxlbiwgJm9wZW4tPm9wX2lhdHRyLAotCQkJCQlyZXNmaCwgb3Blbi0+b3BfY3JlYXRlbW9kZSwKKwkJCQkJKnJlc2ZoLCBvcGVuLT5vcF9jcmVhdGVtb2RlLAogCQkJCQkodTMyICopb3Blbi0+b3BfdmVyZi5kYXRhLAogCQkJCQkmb3Blbi0+b3BfdHJ1bmNhdGUsICZvcGVuLT5vcF9jcmVhdGVkKTsKIAogCQlpZiAoIXN0YXR1cyAmJiBvcGVuLT5vcF9sYWJlbC5sZW4pCi0JCQluZnNkNF9zZWN1cml0eV9pbm9kZV9zZXRzZWNjdHgocmVzZmgsICZvcGVuLT5vcF9sYWJlbCwgb3Blbi0+b3BfYm12YWwpOworCQkJbmZzZDRfc2VjdXJpdHlfaW5vZGVfc2V0c2VjY3R4KCpyZXNmaCwgJm9wZW4tPm9wX2xhYmVsLCBvcGVuLT5vcF9ibXZhbCk7CiAKIAkJLyoKIAkJICogRm9sbG93aW5nIHJmYyAzNTMwIDE0LjIuMTYsIHVzZSB0aGUgcmV0dXJuZWQgYml0bWFzawpAQCAtMjgxLDMxICsyODAsMzIgQEAKIAkJaWYgKG9wZW4tPm9wX2NyZWF0ZW1vZGUgPT0gTkZTNF9DUkVBVEVfRVhDTFVTSVZFICYmIHN0YXR1cyA9PSAwKQogCQkJb3Blbi0+b3BfYm12YWxbMV0gPSAoRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTIHwKIAkJCQkJCQlGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkpOwotCX0gZWxzZSB7CisJfSBlbHNlCisJCS8qCisJCSAqIE5vdGUgdGhpcyBtYXkgZXhpdCB3aXRoIHRoZSBwYXJlbnQgc3RpbGwgbG9ja2VkLgorCQkgKiBXZSB3aWxsIGhvbGQgdGhlIGxvY2sgdW50aWwgbmZzZDRfb3BlbidzIGZpbmFsCisJCSAqIGxvb2t1cCwgdG8gcHJldmVudCByZW5hbWVzIG9yIHVubGlua3MgdW50aWwgd2UndmUgaGFkCisJCSAqIGEgY2hhbmNlIHRvIGFuIGFjcXVpcmUgYSBkZWxlZ2F0aW9uIGlmIGFwcHJvcHJpYXRlLgorCQkgKi8KIAkJc3RhdHVzID0gbmZzZF9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsCi0JCQkJICAgICBvcGVuLT5vcF9mbmFtZS5kYXRhLCBvcGVuLT5vcF9mbmFtZS5sZW4sIHJlc2ZoKTsKLQkJZmhfdW5sb2NrKGN1cnJlbnRfZmgpOwotCX0KKwkJCQkgICAgIG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbiwgKnJlc2ZoKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBuZnNkX2NoZWNrX29ial9pc3JlZyhyZXNmaCk7CisJc3RhdHVzID0gbmZzZF9jaGVja19vYmpfaXNyZWcoKnJlc2ZoKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKIAogCWlmIChpc19jcmVhdGVfd2l0aF9hdHRycyhvcGVuKSAmJiBvcGVuLT5vcF9hY2wgIT0gTlVMTCkKLQkJZG9fc2V0X25mczRfYWNsKHJxc3RwLCByZXNmaCwgb3Blbi0+b3BfYWNsLCBvcGVuLT5vcF9ibXZhbCk7CisJCWRvX3NldF9uZnM0X2FjbChycXN0cCwgKnJlc2ZoLCBvcGVuLT5vcF9hY2wsIG9wZW4tPm9wX2JtdmFsKTsKIAotCW5mc2Q0X3NldF9vcGVuX293bmVyX3JlcGx5X2NhY2hlKGNzdGF0ZSwgb3BlbiwgcmVzZmgpOworCW5mc2Q0X3NldF9vcGVuX293bmVyX3JlcGx5X2NhY2hlKGNzdGF0ZSwgb3BlbiwgKnJlc2ZoKTsKIAlhY2Ntb2RlID0gTkZTRF9NQVlfTk9QOwogCWlmIChvcGVuLT5vcF9jcmVhdGVkIHx8CiAJCQlvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpCiAJCWFjY21vZGUgfD0gTkZTRF9NQVlfT1dORVJfT1ZFUlJJREU7Ci0Jc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCByZXNmaCwgb3BlbiwgYWNjbW9kZSk7CisJc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCAqcmVzZmgsIG9wZW4sIGFjY21vZGUpOwogCXNldF9jaGFuZ2VfaW5mbygmb3Blbi0+b3BfY2luZm8sIGN1cnJlbnRfZmgpOwotCWZoX2R1cDIoY3VycmVudF9maCwgcmVzZmgpOwogb3V0OgotCWZoX3B1dChyZXNmaCk7Ci0Ja2ZyZWUocmVzZmgpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM1OCw2ICszNTgsNyBAQAogCSAgIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewogCV9fYmUzMiBzdGF0dXM7CisJc3RydWN0IHN2Y19maCAqcmVzZmggPSBOVUxMOwogCXN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBTVkNfTkVUKHJxc3RwKTsKIAlzdHJ1Y3QgbmZzZF9uZXQgKm5uID0gbmV0X2dlbmVyaWMobmV0LCBuZnNkX25ldF9pZCk7CkBAIC00MjQsNyArNDI1LDcgQEAKIAlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKIAkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgogCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgotCQkJc3RhdHVzID0gZG9fb3Blbl9sb29rdXAocnFzdHAsIGNzdGF0ZSwgb3Blbik7CisJCQlzdGF0dXMgPSBkb19vcGVuX2xvb2t1cChycXN0cCwgY3N0YXRlLCBvcGVuLCAmcmVzZmgpOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIG91dDsKIAkJCWJyZWFrOwpAQCAtNDQwLDYgKzQ0MSw3IEBACiAJCQlzdGF0dXMgPSBkb19vcGVuX2ZoYW5kbGUocnFzdHAsIGNzdGF0ZSwgb3Blbik7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gb3V0OworCQkJcmVzZmggPSAmY3N0YXRlLT5jdXJyZW50X2ZoOwogCQkJYnJlYWs7CiAJCWNhc2UgTkZTNF9PUEVOX0NMQUlNX0RFTEVHX1BSRVZfRkg6CiAgICAgICAgICAgICAgCWNhc2UgTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX1BSRVY6CkBAIC00NTksOSArNDYxLDE0IEBACiAJICogc3VjY2Vzc2Z1bCwgaXQgKDEpIHRydW5jYXRlcyB0aGUgZmlsZSBpZiBvcGVuLT5vcF90cnVuY2F0ZSB3YXMKIAkgKiBzZXQsICgyKSBzZXRzIG9wZW4tPm9wX3N0YXRlaWQsICgzKSBzZXRzIG9wZW4tPm9wX2RlbGVnYXRpb24uCiAJICovCi0Jc3RhdHVzID0gbmZzZDRfcHJvY2Vzc19vcGVuMihycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgb3Blbik7CisJc3RhdHVzID0gbmZzZDRfcHJvY2Vzc19vcGVuMihycXN0cCwgcmVzZmgsIG9wZW4pOwogCVdBUk5fT04oc3RhdHVzICYmIG9wZW4tPm9wX2NyZWF0ZWQpOwogb3V0OgorCWlmIChyZXNmaCAmJiByZXNmaCAhPSAmY3N0YXRlLT5jdXJyZW50X2ZoKSB7CisJCWZoX2R1cDIoJmNzdGF0ZS0+Y3VycmVudF9maCwgcmVzZmgpOworCQlmaF9wdXQocmVzZmgpOworCQlrZnJlZShyZXNmaCk7CisJfQogCW5mc2Q0X2NsZWFudXBfb3Blbl9zdGF0ZShvcGVuLCBzdGF0dXMpOwogCWlmIChvcGVuLT5vcF9vcGVub3duZXIgJiYgIW5mc2Q0X2hhc19zZXNzaW9uKGNzdGF0ZSkpCiAJCWNzdGF0ZS0+cmVwbGF5X293bmVyID0gJm9wZW4tPm9wX29wZW5vd25lci0+b29fb3duZXI7CkBAIC0xMDcwLDggKzEwNzcsMTAgQEAKIAkJCQkgICAgY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSwgJnAsCiAJCQkJICAgIGNvdW50LCB2ZXJpZnktPnZlX2JtdmFsLAogCQkJCSAgICBycXN0cCwgMCk7Ci0KLQkvKiB0aGlzIG1lYW5zIHRoYXQgbmZzZDRfZW5jb2RlX2ZhdHRyKCkgcmFuIG91dCBvZiBzcGFjZSAqLworCS8qCisJICogSWYgbmZzZDRfZW5jb2RlX2ZhdHRyKCkgcmFuIG91dCBvZiBzcGFjZSwgYXNzdW1lIHRoYXQncyBiZWNhdXNlCisJICogdGhlIGF0dHJpYnV0ZXMgYXJlIGxvbmdlciAoaGVuY2UgZGlmZmVyZW50KSB0aGFuIHRob3NlIGdpdmVuOgorCSAqLwogCWlmIChzdGF0dXMgPT0gbmZzZXJyX3Jlc291cmNlKQogCQlzdGF0dXMgPSBuZnNlcnJfbm90X3NhbWU7CiAJaWYgKHN0YXR1cykKQEAgLTE1MjUsNyArMTUzNCw4IEBACiBzdGF0aWMgaW5saW5lIHUzMiBuZnNkNF9leGNoYW5nZV9pZF9yc2l6ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfb3AgKm9wKQogewogCXJldHVybiAob3BfZW5jb2RlX2hkcl9zaXplICsgMiArIDEgKyAvKiBlaXJfY2xpZW50aWQsIGVpcl9zZXF1ZW5jZWlkICovXAotCQkxICsgMSArIDIgKyAvKiBlaXJfZmxhZ3MsIHNwcl9ob3csIHNwb19tdXN0X2VuZm9yY2UgJiBfYWxsb3cgKi9cCisJCTEgKyAxICsgLyogZWlyX2ZsYWdzLCBzcHJfaG93ICovXAorCQk0ICsgLyogc3BvX211c3RfZW5mb3JjZSAmIF9hbGxvdyB3aXRoIGJpdG1hcCAqL1wKIAkJMiArIC8qZWlyX3NlcnZlcl9vd25lci5zb19taW5vcl9pZCAqL1wKIAkJLyogZWlyX3NlcnZlcl9vd25lci5zb19tYWpvcl9pZDw+ICovXAogCQlYRFJfUVVBRExFTihORlM0X09QQVFVRV9MSU1JVCkgKyAxICtcCkBAIC0xODgyLDYgKzE4OTIsNyBAQAogCQkudnNfcHJvYwk9IG5mc2RfcHJvY2VkdXJlczQsCiAJCS52c19kaXNwYXRjaAk9IG5mc2RfZGlzcGF0Y2gsCiAJCS52c194ZHJzaXplCT0gTkZTNF9TVkNfWERSU0laRSwKKwkJLnZzX3JwY2Jfb3B0bmwJPSAxLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDEwNWQ2ZmEuLmQ1ZDA3MGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtODMyLDEwICs4MzIsMTEgQEAKIAlzcGluX3VubG9jaygmbmZzZF9kcmNfbG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqYWxsb2Nfc2Vzc2lvbihzdHJ1Y3QgbmZzZDRfY2hhbm5lbF9hdHRycyAqYXR0cnMpCitzdGF0aWMgc3RydWN0IG5mc2Q0X3Nlc3Npb24gKmFsbG9jX3Nlc3Npb24oc3RydWN0IG5mc2Q0X2NoYW5uZWxfYXR0cnMgKmZhdHRycywKKwkJCQkJICAgc3RydWN0IG5mc2Q0X2NoYW5uZWxfYXR0cnMgKmJhdHRycykKIHsKLQlpbnQgbnVtc2xvdHMgPSBhdHRycy0+bWF4cmVxczsKLQlpbnQgc2xvdHNpemUgPSBzbG90X2J5dGVzKGF0dHJzKTsKKwlpbnQgbnVtc2xvdHMgPSBmYXR0cnMtPm1heHJlcXM7CisJaW50IHNsb3RzaXplID0gc2xvdF9ieXRlcyhmYXR0cnMpOwogCXN0cnVjdCBuZnNkNF9zZXNzaW9uICpuZXc7CiAJaW50IG1lbSwgaTsKIApAQCAtODUyLDYgKzg1MywxMCBAQAogCQlpZiAoIW5ldy0+c2Vfc2xvdHNbaV0pCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KKworCW1lbWNweSgmbmV3LT5zZV9mY2hhbm5lbCwgZmF0dHJzLCBzaXplb2Yoc3RydWN0IG5mc2Q0X2NoYW5uZWxfYXR0cnMpKTsKKwltZW1jcHkoJm5ldy0+c2VfYmNoYW5uZWwsIGJhdHRycywgc2l6ZW9mKHN0cnVjdCBuZnNkNF9jaGFubmVsX2F0dHJzKSk7CisKIAlyZXR1cm4gbmV3Owogb3V0X2ZyZWU6CiAJd2hpbGUgKGktLSkKQEAgLTk5Nyw4ICsxMDAyLDcgQEAKIAlsaXN0X2FkZCgmbmV3LT5zZV9wZXJjbG50LCAmY2xwLT5jbF9zZXNzaW9ucyk7CiAJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJc3Bpbl91bmxvY2soJm5uLT5jbGllbnRfbG9jayk7Ci0JbWVtY3B5KCZuZXctPnNlX2ZjaGFubmVsLCAmY3Nlcy0+Zm9yZV9jaGFubmVsLAotCQkJc2l6ZW9mKHN0cnVjdCBuZnNkNF9jaGFubmVsX2F0dHJzKSk7CisKIAlpZiAoY3Nlcy0+ZmxhZ3MgJiBTRVNTSU9ONF9CQUNLX0NIQU4pIHsKIAkJc3RydWN0IHNvY2thZGRyICpzYSA9IHN2Y19hZGRyKHJxc3RwKTsKIAkJLyoKQEAgLTE4NTEsNiArMTg1NSwxMSBAQAogCXJldHVybiBuZnNfb2s7CiB9CiAKKyNkZWZpbmUgTkZTRF9DQl9NQVhfUkVRX1NaCSgoTkZTNF9lbmNfY2JfcmVjYWxsX3N6ICsgXAorCQkJCSBSUENfTUFYX0hFQURFUl9XSVRIX0FVVEgpICogc2l6ZW9mKF9fYmUzMikpCisjZGVmaW5lIE5GU0RfQ0JfTUFYX1JFU1BfU1oJKChORlM0X2RlY19jYl9yZWNhbGxfc3ogKyBcCisJCQkJIFJQQ19NQVhfUkVQSEVBREVSX1dJVEhfQVVUSCkgKiBzaXplb2YoX19iZTMyKSkKKwogc3RhdGljIF9fYmUzMiBjaGVja19iYWNrY2hhbm5lbF9hdHRycyhzdHJ1Y3QgbmZzZDRfY2hhbm5lbF9hdHRycyAqY2EpCiB7CiAJY2EtPmhlYWRlcnBhZHN6ID0gMDsKQEAgLTE4NjEsOSArMTg3MCw5IEBACiAJICogbGVzcyB0aGFuIDFrLiAgVGlnaHRlbiB1cCB0aGlzIGVzdGltYXRlIGluIHRoZSB1bmxpa2VseSBldmVudAogCSAqIGl0IHR1cm5zIG91dCB0byBiZSBhIHByb2JsZW0gZm9yIHNvbWUgY2xpZW50OgogCSAqLwotCWlmIChjYS0+bWF4cmVxX3N6IDwgTkZTNF9lbmNfY2JfcmVjYWxsX3N6ICsgUlBDX01BWF9IRUFERVJfV0lUSF9BVVRIKQorCWlmIChjYS0+bWF4cmVxX3N6IDwgTkZTRF9DQl9NQVhfUkVRX1NaKQogCQlyZXR1cm4gbmZzZXJyX3Rvb3NtYWxsOwotCWlmIChjYS0+bWF4cmVzcF9zeiA8IE5GUzRfZGVjX2NiX3JlY2FsbF9zeiArIFJQQ19NQVhfUkVQSEVBREVSX1dJVEhfQVVUSCkKKwlpZiAoY2EtPm1heHJlc3Bfc3ogPCBORlNEX0NCX01BWF9SRVNQX1NaKQogCQlyZXR1cm4gbmZzZXJyX3Rvb3NtYWxsOwogCWNhLT5tYXhyZXNwX2NhY2hlZCA9IDA7CiAJaWYgKGNhLT5tYXhvcHMgPCAyKQpAQCAtMTkxMyw5ICsxOTIyLDkgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAlzdGF0dXMgPSBjaGVja19iYWNrY2hhbm5lbF9hdHRycygmY3Jfc2VzLT5iYWNrX2NoYW5uZWwpOwogCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gb3V0X3JlbGVhc2VfZHJjX21lbTsKIAlzdGF0dXMgPSBuZnNlcnJfanVrZWJveDsKLQluZXcgPSBhbGxvY19zZXNzaW9uKCZjcl9zZXMtPmZvcmVfY2hhbm5lbCk7CisJbmV3ID0gYWxsb2Nfc2Vzc2lvbigmY3Jfc2VzLT5mb3JlX2NoYW5uZWwsICZjcl9zZXMtPmJhY2tfY2hhbm5lbCk7CiAJaWYgKCFuZXcpCiAJCWdvdG8gb3V0X3JlbGVhc2VfZHJjX21lbTsKIAljb25uID0gYWxsb2NfY29ubl9mcm9tX2Nyc2VzKHJxc3RwLCBjcl9zZXMpOwpAQCAtMzAzNCwxOCArMzA0MywxOCBAQAogCWlmICghZmwpCiAJCXJldHVybiAtRU5PTUVNOwogCWZsLT5mbF9maWxlID0gZmluZF9yZWFkYWJsZV9maWxlKGZwKTsKLQlsaXN0X2FkZCgmZHAtPmRsX3BlcmNsbnQsICZkcC0+ZGxfc3RpZC5zY19jbGllbnQtPmNsX2RlbGVnYXRpb25zKTsKIAlzdGF0dXMgPSB2ZnNfc2V0bGVhc2UoZmwtPmZsX2ZpbGUsIGZsLT5mbF90eXBlLCAmZmwpOwotCWlmIChzdGF0dXMpIHsKLQkJbGlzdF9kZWxfaW5pdCgmZHAtPmRsX3BlcmNsbnQpOwotCQlsb2Nrc19mcmVlX2xvY2soZmwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dF9mcmVlOworCWxpc3RfYWRkKCZkcC0+ZGxfcGVyY2xudCwgJmRwLT5kbF9zdGlkLnNjX2NsaWVudC0+Y2xfZGVsZWdhdGlvbnMpOwogCWZwLT5maV9sZWFzZSA9IGZsOwogCWZwLT5maV9kZWxlZ19maWxlID0gZ2V0X2ZpbGUoZmwtPmZsX2ZpbGUpOwogCWF0b21pY19zZXQoJmZwLT5maV9kZWxlZ2VlcywgMSk7CiAJbGlzdF9hZGQoJmRwLT5kbF9wZXJmaWxlLCAmZnAtPmZpX2RlbGVnYXRpb25zKTsKIAlyZXR1cm4gMDsKK291dF9mcmVlOgorCWxvY2tzX2ZyZWVfbG9jayhmbCk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBuZnM0X3NldF9kZWxlZ2F0aW9uKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLCBzdHJ1Y3QgbmZzNF9maWxlICpmcCkKQEAgLTMxMjUsNiArMzEzNCw3IEBACiAJCQkJZ290byBvdXRfbm9fZGVsZWc7CiAJCQlicmVhazsKIAkJY2FzZSBORlM0X09QRU5fQ0xBSU1fTlVMTDoKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fRkg6CiAJCQkvKgogCQkJICogTGV0J3Mgbm90IGdpdmUgb3V0IGFueSBkZWxlZ2F0aW9ucyB0aWxsIGV2ZXJ5b25lJ3MKIAkJCSAqIGhhZCB0aGUgY2hhbmNlIHRvIHJlY2xhaW0gdGhlaXJzLi4uLgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCBlZTcyMzdmLi42M2YyMzk1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMTAzLDExICsxMDMsNiBAQAogCSh4KSA9ICh1NjQpbnRvaGwoKnArKykgPDwgMzI7CQlcCiAJKHgpIHw9IG50b2hsKCpwKyspOwkJCVwKIH0gd2hpbGUgKDApCi0jZGVmaW5lIFJFQURUSU1FKHgpICAgICAgIGRvIHsJCQlcCi0JcCsrOwkJCQkJXAotCSh4KSA9IG50b2hsKCpwKyspOwkJCVwKLQlwKys7CQkJCQlcCi19IHdoaWxlICgwKQogI2RlZmluZSBSRUFETUVNKHgsbmJ5dGVzKSBkbyB7CQkJXAogCXggPSAoY2hhciAqKXA7CQkJCVwKIAlwICs9IFhEUl9RVUFETEVOKG5ieXRlcyk7CQlcCkBAIC0xOTAsNiArMTg1LDE1IEBACiAJcmV0dXJuIChjbGlkLT5jbF9ib290ID09IDApICYmIChjbGlkLT5jbF9pZCA9PSAwKTsKIH0KIAorLyoqCisgKiBkZWZlcl9mcmVlIC0gbWFyayBhbiBhbGxvY2F0aW9uIGFzIGRlZmVycmVkIGZyZWVkCisgKiBAYXJncDogTkZTdjQgY29tcG91bmQgYXJndW1lbnQgc3RydWN0dXJlIHRvIGJlIGZyZWVkIHdpdGgKKyAqIEByZWxlYXNlOiByZWxlYXNlIGNhbGxiYWNrIHRvIGZyZWUgQHAsIHR5cGljYWxseSBrZnJlZSgpCisgKiBAcDogcG9pbnRlciB0byBiZSBmcmVlZAorICoKKyAqIE1hcmtzIEBwIHRvIGJlIGZyZWVkIHdoZW4gcHJvY2Vzc2luZyB0aGUgY29tcG91bmQgb3BlcmF0aW9uCisgKiBkZXNjcmliZWQgaW4gQGFyZ3AgZmluaXNoZXMuCisgKi8KIHN0YXRpYyBpbnQKIGRlZmVyX2ZyZWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwKIAkJdm9pZCAoKnJlbGVhc2UpKGNvbnN0IHZvaWQgKiksIHZvaWQgKnApCkBAIC0yMDYsNiArMjEwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogc2F2ZW1lbSAtIGR1cGxpY2F0ZSBhIGNodW5rIG9mIG1lbW9yeSBmb3IgbGF0ZXIgcHJvY2Vzc2luZworICogQGFyZ3A6IE5GU3Y0IGNvbXBvdW5kIGFyZ3VtZW50IHN0cnVjdHVyZSB0byBiZSBmcmVlZCB3aXRoCisgKiBAcDogcG9pbnRlciB0byBiZSBkdXBsaWNhdGVkCisgKiBAbmJ5dGVzOiBsZW5ndGggdG8gYmUgZHVwbGljYXRlZAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgY29weSBvZiBAbmJ5dGVzIGJ5dGVzIG9mIG1lbW9yeSBhdCBAcAorICogdGhhdCBhcmUgcHJlc2VydmVkIHVudGlsIHByb2Nlc3Npbmcgb2YgdGhlIE5GU3Y0IGNvbXBvdW5kCisgKiBvcGVyYXRpb24gZGVzY3JpYmVkIGJ5IEBhcmdwIGZpbmlzaGVzLgorICovCiBzdGF0aWMgY2hhciAqc2F2ZW1lbShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBfX2JlMzIgKnAsIGludCBuYnl0ZXMpCiB7CiAJaWYgKHAgPT0gYXJncC0+dG1wKSB7CkBAIC0yNTcsNyArMjcxLDYgQEAKIAlpbnQgZXhwZWN0ZWRfbGVuLCBsZW4gPSAwOwogCXUzMiBkdW1teTMyOwogCWNoYXIgKmJ1ZjsKLQlpbnQgaG9zdF9lcnI7CiAKIAlERUNPREVfSEVBRDsKIAlpYXR0ci0+aWFfdmFsaWQgPSAwOwpAQCAtMjg0LDEwICsyOTcsOSBAQAogCQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKIAogCQkqYWNsID0gbmZzNF9hY2xfbmV3KG5hY2UpOwotCQlpZiAoKmFjbCA9PSBOVUxMKSB7Ci0JCQlob3N0X2VyciA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9uZnNlcnI7Ci0JCX0KKwkJaWYgKCphY2wgPT0gTlVMTCkKKwkJCXJldHVybiBuZnNlcnJfanVrZWJveDsKKwogCQlkZWZlcl9mcmVlKGFyZ3AsIGtmcmVlLCAqYWNsKTsKIAogCQkoKmFjbCktPm5hY2VzID0gbmFjZTsKQEAgLTQyNSwxMCArNDM3LDYgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAKIAlERUNPREVfVEFJTDsKLQotb3V0X25mc2VycjoKLQlzdGF0dXMgPSBuZnNlcnJubyhob3N0X2Vycik7Ci0JZ290byBvdXQ7CiB9CiAKIHN0YXRpYyBfX2JlMzIKQEAgLTE5NTcsNTYgKzE5NjUsMTYgQEAKIAl9OwogfQogCi1zdGF0aWMgX19iZTMyCi1uZnNkNF9lbmNvZGVfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgd2hvdHlwZSwga3VpZF90IHVpZCwga2dpZF90IGdpZCwKLQkJCV9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoKmJ1ZmxlbiA8IChYRFJfUVVBRExFTihJRE1BUF9OQU1FU1opIDw8IDIpICsgNCkKLQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKLQlpZiAod2hvdHlwZSAhPSBORlM0X0FDTF9XSE9fTkFNRUQpCi0JCXN0YXR1cyA9IG5mczRfYWNsX3dyaXRlX3dobyh3aG90eXBlLCAodTggKikoKnAgKyAxKSk7Ci0JZWxzZSBpZiAoZ2lkX3ZhbGlkKGdpZCkpCi0JCXN0YXR1cyA9IG5mc2RfbWFwX2dpZF90b19uYW1lKHJxc3RwLCBnaWQsICh1OCAqKSgqcCArIDEpKTsKLQllbHNlCi0JCXN0YXR1cyA9IG5mc2RfbWFwX3VpZF90b19uYW1lKHJxc3RwLCB1aWQsICh1OCAqKSgqcCArIDEpKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIG5mc2Vycm5vKHN0YXR1cyk7Ci0JKnAgPSB4ZHJfZW5jb2RlX29wYXF1ZSgqcCwgTlVMTCwgc3RhdHVzKTsKLQkqYnVmbGVuIC09IChYRFJfUVVBRExFTihzdGF0dXMpIDw8IDIpICsgNDsKLQlCVUdfT04oKmJ1ZmxlbiA8IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMgotbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwga3VpZF90IHVzZXIsIF9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQotewotCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgTkZTNF9BQ0xfV0hPX05BTUVELCB1c2VyLCBJTlZBTElEX0dJRCwKLQkJCQkgcCwgYnVmbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIKLW5mc2Q0X2VuY29kZV9ncm91cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBrZ2lkX3QgZ3JvdXAsIF9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQotewotCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgTkZTNF9BQ0xfV0hPX05BTUVELCBJTlZBTElEX1VJRCwgZ3JvdXAsCi0JCQkJIHAsIGJ1Zmxlbik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9lbmNvZGVfYWNsbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzNF9hY2UgKmFjZSwKIAkJX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7Ci0Ja3VpZF90IHVpZCA9IElOVkFMSURfVUlEOwotCWtnaWRfdCBnaWQgPSBJTlZBTElEX0dJRDsKLQotCWlmIChhY2UtPndob3R5cGUgPT0gTkZTNF9BQ0xfV0hPX05BTUVEKSB7Ci0JCWlmIChhY2UtPmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQotCQkJZ2lkID0gYWNlLT53aG9fZ2lkOwotCQllbHNlCi0JCQl1aWQgPSBhY2UtPndob191aWQ7Ci0JfQotCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgYWNlLT53aG90eXBlLCB1aWQsIGdpZCwgcCwgYnVmbGVuKTsKKwlpZiAoYWNlLT53aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCkKKwkJcmV0dXJuIG5mczRfYWNsX3dyaXRlX3dobyhhY2UtPndob3R5cGUsIHAsIGJ1Zmxlbik7CisJZWxzZSBpZiAoYWNlLT5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKKwkJcmV0dXJuIG5mc2Q0X2VuY29kZV9ncm91cChycXN0cCwgYWNlLT53aG9fZ2lkLCBwLCBidWZsZW4pOworCWVsc2UKKwkJcmV0dXJuIG5mc2Q0X2VuY29kZV91c2VyKHJxc3RwLCBhY2UtPndob191aWQsIHAsIGJ1Zmxlbik7CiB9CiAKICNkZWZpbmUgV09SRDBfQUJTRU5UX0ZTX0FUVFJTIChGQVRUUjRfV09SRDBfRlNfTE9DQVRJT05TIHwgRkFUVFI0X1dPUkQwX0ZTSUQgfCBcCkBAIC0yMDkwLDcgKzIwNTgsNyBAQAogCXUzMiBibXZhbDEgPSBibXZhbFsxXTsKIAl1MzIgYm12YWwyID0gYm12YWxbMl07CiAJc3RydWN0IGtzdGF0IHN0YXQ7Ci0Jc3RydWN0IHN2Y19maCB0ZW1wZmg7CisJc3RydWN0IHN2Y19maCAqdGVtcGZoID0gTlVMTDsKIAlzdHJ1Y3Qga3N0YXRmcyBzdGF0ZnM7CiAJaW50IGJ1ZmxlbiA9IGNvdW50IDw8IDI7CiAJX19iZTMyICphdHRybGVucDsKQEAgLTIxMzcsMTEgKzIxMDUsMTUgQEAKIAkJCWdvdG8gb3V0X25mc2VycjsKIAl9CiAJaWYgKChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0ZJTEVIQU5ETEUgfCBGQVRUUjRfV09SRDBfRlNJRCkpICYmICFmaHApIHsKLQkJZmhfaW5pdCgmdGVtcGZoLCBORlM0X0ZIU0laRSk7Ci0JCXN0YXR1cyA9IGZoX2NvbXBvc2UoJnRlbXBmaCwgZXhwLCBkZW50cnksIE5VTEwpOworCQl0ZW1wZmggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ZjX2ZoKSwgR0ZQX0tFUk5FTCk7CisJCXN0YXR1cyA9IG5mc2Vycl9qdWtlYm94OworCQlpZiAoIXRlbXBmaCkKKwkJCWdvdG8gb3V0OworCQlmaF9pbml0KHRlbXBmaCwgTkZTNF9GSFNJWkUpOworCQlzdGF0dXMgPSBmaF9jb21wb3NlKHRlbXBmaCwgZXhwLCBkZW50cnksIE5VTEwpOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7Ci0JCWZocCA9ICZ0ZW1wZmg7CisJCWZocCA9IHRlbXBmaDsKIAl9CiAJaWYgKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfQUNMIHwgRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQKIAkJCXwgRkFUVFI0X1dPUkQwX1NVUFBPUlRFRF9BVFRSUykpIHsKQEAgLTIyMjIsOCArMjE5NCwxMCBAQAogCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCiAJCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJZHVtbXkgPSBuZnM0X2ZpbGVfdHlwZShzdGF0Lm1vZGUpOwotCQlpZiAoZHVtbXkgPT0gTkY0QkFEKQotCQkJZ290byBvdXRfc2VydmVyZmF1bHQ7CisJCWlmIChkdW1teSA9PSBORjRCQUQpIHsKKwkJCXN0YXR1cyA9IG5mc2Vycl9zZXJ2ZXJmYXVsdDsKKwkJCWdvdG8gb3V0OworCQl9CiAJCVdSSVRFMzIoZHVtbXkpOwogCX0KIAlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZIX0VYUElSRV9UWVBFKSB7CkBAIC0yMzE3LDggKzIyOTEsNiBAQAogCQkJV1JJVEUzMihhY2UtPmZsYWcpOwogCQkJV1JJVEUzMihhY2UtPmFjY2Vzc19tYXNrICYgTkZTNF9BQ0VfTUFTS19BTEwpOwogCQkJc3RhdHVzID0gbmZzZDRfZW5jb2RlX2FjbG5hbWUocnFzdHAsIGFjZSwgJnAsICZidWZsZW4pOwotCQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCi0JCQkJZ290byBvdXRfcmVzb3VyY2U7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC0yMzc5LDggKzIzNTEsNiBAQAogCX0KIAlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZTX0xPQ0FUSU9OUykgewogCQlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfZnNfbG9jYXRpb25zKHJxc3RwLCBleHAsICZwLCAmYnVmbGVuKTsKLQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCi0JCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTI0MzEsMTUgKzI0MDEsMTEgQEAKIAl9CiAJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9PV05FUikgewogCQlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfdXNlcihycXN0cCwgc3RhdC51aWQsICZwLCAmYnVmbGVuKTsKLQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCi0JCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwogCX0KIAlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQKSB7CiAJCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV9ncm91cChycXN0cCwgc3RhdC5naWQsICZwLCAmYnVmbGVuKTsKLQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCi0JCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTI1MzMsOCArMjQ5OSw4IEBACiAJCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KGNvbnRleHQsIGNvbnRleHRsZW4pOwogI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0X1NFQ1VSSVRZX0xBQkVMICovCiAJa2ZyZWUoYWNsKTsKLQlpZiAoZmhwID09ICZ0ZW1wZmgpCi0JCWZoX3B1dCgmdGVtcGZoKTsKKwlpZiAodGVtcGZoKQorCQlmaF9wdXQodGVtcGZoKTsKIAlyZXR1cm4gc3RhdHVzOwogb3V0X25mc2VycjoKIAlzdGF0dXMgPSBuZnNlcnJubyhlcnIpOwpAQCAtMjU0Miw5ICsyNTA4LDYgQEAKIG91dF9yZXNvdXJjZToKIAlzdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7CiAJZ290byBvdXQ7Ci1vdXRfc2VydmVyZmF1bHQ6Ci0Jc3RhdHVzID0gbmZzZXJyX3NlcnZlcmZhdWx0OwotCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdHRyaWJ1dGVzX25lZWRfbW91bnQodTMyICpibXZhbCkKQEAgLTI2MjEsMTcgKzI1ODQsMTQgQEAKIHN0YXRpYyBfX2JlMzIgKgogbmZzZDRfZW5jb2RlX3JkYXR0cl9lcnJvcihfX2JlMzIgKnAsIGludCBidWZsZW4sIF9fYmUzMiBuZnNlcnIpCiB7Ci0JX19iZTMyICphdHRybGVucDsKLQogCWlmIChidWZsZW4gPCA2KQogCQlyZXR1cm4gTlVMTDsKIAkqcCsrID0gaHRvbmwoMik7CiAJKnArKyA9IGh0b25sKEZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1IpOyAvKiBibXZhbDAgKi8KIAkqcCsrID0gaHRvbmwoMCk7CQkJIC8qIGJtdmFsMSAqLwogCi0JYXR0cmxlbnAgPSBwKys7CisJKnArKyA9IGh0b25sKDQpOyAgICAgLyogYXR0cmlidXRlIGxlbmd0aCAqLwogCSpwKysgPSBuZnNlcnI7ICAgICAgIC8qIG5vIGh0b25sICovCi0JKmF0dHJsZW5wID0gaHRvbmwoKGNoYXIgKilwIC0gKGNoYXIgKilhdHRybGVucCAtIDQpOwogCXJldHVybiBwOwogfQogCkBAIC0zMjQ0LDcgKzMyMDQsNyBAQAogCiAJCWlmIChycGNhdXRoX2dldF9nc3NpbmZvKHBmLCAmaW5mbykgPT0gMCkgewogCQkJc3VwcG9ydGVkKys7Ci0JCQlSRVNFUlZFX1NQQUNFKDQgKyA0ICsgaW5mby5vaWQubGVuICsgNCArIDQpOworCQkJUkVTRVJWRV9TUEFDRSg0ICsgNCArIFhEUl9MRU4oaW5mby5vaWQubGVuKSArIDQgKyA0KTsKIAkJCVdSSVRFMzIoUlBDX0FVVEhfR1NTKTsKIAkJCVdSSVRFMzIoaW5mby5vaWQubGVuKTsKIAkJCVdSSVRFTUVNKGluZm8ub2lkLmRhdGEsIGluZm8ub2lkLmxlbik7CkBAIC0zMzc5LDM1ICszMzM5LDQzIEBACiAJCTggLyogZWlyX2NsaWVudGlkICovICsKIAkJNCAvKiBlaXJfc2VxdWVuY2VpZCAqLyArCiAJCTQgLyogZWlyX2ZsYWdzICovICsKLQkJNCAvKiBzcHJfaG93ICovICsKLQkJOCAvKiBzcG9fbXVzdF9lbmZvcmNlLCBzcG9fbXVzdF9hbGxvdyAqLyArCi0JCTggLyogc29fbWlub3JfaWQgKi8gKwotCQk0IC8qIHNvX21ham9yX2lkLmxlbiAqLyArCi0JCShYRFJfUVVBRExFTihtYWpvcl9pZF9zeikgKiA0KSArCi0JCTQgLyogZWlyX3NlcnZlcl9zY29wZS5sZW4gKi8gKwotCQkoWERSX1FVQURMRU4oc2VydmVyX3Njb3BlX3N6KSAqIDQpICsKLQkJNCAvKiBlaXJfc2VydmVyX2ltcGxfaWQuY291bnQgKDApICovKTsKKwkJNCAvKiBzcHJfaG93ICovKTsKIAogCVdSSVRFTUVNKCZleGlkLT5jbGllbnRpZCwgOCk7CiAJV1JJVEUzMihleGlkLT5zZXFpZCk7CiAJV1JJVEUzMihleGlkLT5mbGFncyk7CiAKIAlXUklURTMyKGV4aWQtPnNwYV9ob3cpOworCUFESlVTVF9BUkdTKCk7CisKIAlzd2l0Y2ggKGV4aWQtPnNwYV9ob3cpIHsKIAljYXNlIFNQNF9OT05FOgogCQlicmVhazsKIAljYXNlIFNQNF9NQUNIX0NSRUQ6CisJCS8qIHNwb19tdXN0X2VuZm9yY2UsIHNwb19tdXN0X2FsbG93ICovCisJCVJFU0VSVkVfU1BBQ0UoMTYpOworCiAJCS8qIHNwb19tdXN0X2VuZm9yY2UgYml0bWFwOiAqLwogCQlXUklURTMyKDIpOwogCQlXUklURTMyKG5mczRfbWluaW1hbF9zcG9fbXVzdF9lbmZvcmNlWzBdKTsKIAkJV1JJVEUzMihuZnM0X21pbmltYWxfc3BvX211c3RfZW5mb3JjZVsxXSk7CiAJCS8qIGVtcHR5IHNwb19tdXN0X2FsbG93IGJpdG1hcDogKi8KIAkJV1JJVEUzMigwKTsKKworCQlBREpVU1RfQVJHUygpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OX09OQ0UoMSk7CiAJfQogCisJUkVTRVJWRV9TUEFDRSgKKwkJOCAvKiBzb19taW5vcl9pZCAqLyArCisJCTQgLyogc29fbWFqb3JfaWQubGVuICovICsKKwkJKFhEUl9RVUFETEVOKG1ham9yX2lkX3N6KSAqIDQpICsKKwkJNCAvKiBlaXJfc2VydmVyX3Njb3BlLmxlbiAqLyArCisJCShYRFJfUVVBRExFTihzZXJ2ZXJfc2NvcGVfc3opICogNCkgKworCQk0IC8qIGVpcl9zZXJ2ZXJfaW1wbF9pZC5jb3VudCAoMCkgKi8pOworCiAJLyogVGhlIHNlcnZlcl9vd25lciBzdHJ1Y3QgKi8KIAlXUklURTY0KG1pbm9yX2lkKTsgICAgICAvKiBNaW5vciBpZCAqLwogCS8qIG1ham9yIGlkICovCkBAIC0zNDc0LDI4ICszNDQyLDYgQEAKIH0KIAogc3RhdGljIF9fYmUzMgotbmZzZDRfZW5jb2RlX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsCi0JCQkgICAgIHN0cnVjdCBuZnNkNF9kZXN0cm95X3Nlc3Npb24gKmRlc3Ryb3lfc2Vzc2lvbikKLXsKLQlyZXR1cm4gbmZzZXJyOwotfQotCi1zdGF0aWMgX19iZTMyCi1uZnNkNF9lbmNvZGVfZnJlZV9zdGF0ZWlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2VyciwKLQkJCSAgc3RydWN0IG5mc2Q0X2ZyZWVfc3RhdGVpZCAqZnJlZV9zdGF0ZWlkKQotewotCV9fYmUzMiAqcDsKLQotCWlmIChuZnNlcnIpCi0JCXJldHVybiBuZnNlcnI7Ci0KLQlSRVNFUlZFX1NQQUNFKDQpOwotCSpwKysgPSBuZnNlcnI7Ci0JQURKVVNUX0FSR1MoKTsKLQlyZXR1cm4gbmZzZXJyOwotfQotCi1zdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfc2VxdWVuY2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLAogCQkgICAgICBzdHJ1Y3QgbmZzZDRfc2VxdWVuY2UgKnNlcSkKIHsKQEAgLTM1OTMsOCArMzUzOSw4IEBACiAJW09QX0JJTkRfQ09OTl9UT19TRVNTSU9OXSA9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX2JpbmRfY29ubl90b19zZXNzaW9uLAogCVtPUF9FWENIQU5HRV9JRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9leGNoYW5nZV9pZCwKIAlbT1BfQ1JFQVRFX1NFU1NJT05dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfY3JlYXRlX3Nlc3Npb24sCi0JW09QX0RFU1RST1lfU0VTU0lPTl0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9kZXN0cm95X3Nlc3Npb24sCi0JW09QX0ZSRUVfU1RBVEVJRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9mcmVlX3N0YXRlaWQsCisJW09QX0RFU1RST1lfU0VTU0lPTl0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAorCVtPUF9GUkVFX1NUQVRFSURdCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfR0VUX0RJUl9ERUxFR0FUSU9OXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCiAJW09QX0dFVERFVklDRUlORk9dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfR0VUREVWSUNFTElTVF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjYWNoZS5jIGIvZnMvbmZzZC9uZnNjYWNoZS5jCmluZGV4IGI2YWYxNTAuLmY4ZjA2MGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY2FjaGUuYworKysgYi9mcy9uZnNkL25mc2NhY2hlLmMKQEAgLTEzMiwxMyArMTMyLDYgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2RfcmVwbHlfY2FjaGVfdW5oYXNoKHN0cnVjdCBzdmNfY2FjaGVyZXAgKnJwKQotewotCWhsaXN0X2RlbF9pbml0KCZycC0+Y19oYXNoKTsKLQlsaXN0X2RlbF9pbml0KCZycC0+Y19scnUpOwotfQotCi1zdGF0aWMgdm9pZAogbmZzZF9yZXBseV9jYWNoZV9mcmVlX2xvY2tlZChzdHJ1Y3Qgc3ZjX2NhY2hlcmVwICpycCkKIHsKIAlpZiAocnAtPmNfdHlwZSA9PSBSQ19SRVBMQlVGRiAmJiBycC0+Y19yZXBsdmVjLmlvdl9iYXNlKSB7CkBAIC00MTYsMjIgKzQwOSw4IEBACiAKIAkvKgogCSAqIFNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIGNhY2hlIG1pc3MgZm9sbG93ZWQgYnkgYW4gaW5zZXJ0LAotCSAqIHByZWFsbG9jYXRlIGFuIGVudHJ5LiBGaXJzdCwgdHJ5IHRvIHJldXNlIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgTFJVCi0JICogaWYgaXQgd29ya3MsIHRoZW4gZ28gYWhlYWQgYW5kIHBydW5lIHRoZSBMUlUgbGlzdC4KKwkgKiBwcmVhbGxvY2F0ZSBhbiBlbnRyeS4KIAkgKi8KLQlzcGluX2xvY2soJmNhY2hlX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmbHJ1X2hlYWQpKSB7Ci0JCXJwID0gbGlzdF9maXJzdF9lbnRyeSgmbHJ1X2hlYWQsIHN0cnVjdCBzdmNfY2FjaGVyZXAsIGNfbHJ1KTsKLQkJaWYgKG5mc2RfY2FjaGVfZW50cnlfZXhwaXJlZChycCkgfHwKLQkJICAgIG51bV9kcmNfZW50cmllcyA+PSBtYXhfZHJjX2VudHJpZXMpIHsKLQkJCW5mc2RfcmVwbHlfY2FjaGVfdW5oYXNoKHJwKTsKLQkJCXBydW5lX2NhY2hlX2VudHJpZXMoKTsKLQkJCWdvdG8gc2VhcmNoX2NhY2hlOwotCQl9Ci0JfQotCi0JLyogTm8gZXhwaXJlZCBvbmVzIGF2YWlsYWJsZSwgYWxsb2NhdGUgYSBuZXcgb25lLiAqLwotCXNwaW5fdW5sb2NrKCZjYWNoZV9sb2NrKTsKIAlycCA9IG5mc2RfcmVwbHlfY2FjaGVfYWxsb2MoKTsKIAlzcGluX2xvY2soJmNhY2hlX2xvY2spOwogCWlmIChsaWtlbHkocnApKSB7CkBAIC00MzksNyArNDE4LDkgQEAKIAkJZHJjX21lbV91c2FnZSArPSBzaXplb2YoKnJwKTsKIAl9CiAKLXNlYXJjaF9jYWNoZToKKwkvKiBnbyBhaGVhZCBhbmQgcHJ1bmUgdGhlIGNhY2hlICovCisJcHJ1bmVfY2FjaGVfZW50cmllcygpOworCiAJZm91bmQgPSBuZnNkX2NhY2hlX3NlYXJjaChycXN0cCwgY3N1bSk7CiAJaWYgKGZvdW5kKSB7CiAJCWlmIChsaWtlbHkocnApKQpAQCAtNDUzLDE1ICs0MzQsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKgotCSAqIFdlJ3JlIGtlZXBpbmcgdGhlIG9uZSB3ZSBqdXN0IGFsbG9jYXRlZC4gQXJlIHdlIG5vdyBvdmVyIHRoZQotCSAqIGxpbWl0PyBQcnVuZSBvbmUgb2ZmIHRoZSB0aXAgb2YgdGhlIExSVSBpbiB0cmFkZSBmb3IgdGhlIG9uZSB3ZQotCSAqIGp1c3QgYWxsb2NhdGVkIGlmIHNvLgotCSAqLwotCWlmIChudW1fZHJjX2VudHJpZXMgPj0gbWF4X2RyY19lbnRyaWVzKQotCQluZnNkX3JlcGx5X2NhY2hlX2ZyZWVfbG9ja2VkKGxpc3RfZmlyc3RfZW50cnkoJmxydV9oZWFkLAotCQkJCQkJc3RydWN0IHN2Y19jYWNoZXJlcCwgY19scnUpKTsKLQogCW5mc2RzdGF0cy5yY21pc3NlcysrOwogCXJxc3RwLT5ycV9jYWNoZXJlcCA9IHJwOwogCXJwLT5jX3N0YXRlID0gUkNfSU5QUk9HOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggNzYwYzg1YS4uOWE0YTVmOSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC0yNDEsNiArMjQxLDE1IEBACiAJbmZzZF9yYWNhY2hlX3NodXRkb3duKCk7CiB9CiAKK3N0YXRpYyBib29sIG5mc2RfbmVlZHNfbG9ja2Qodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1YzKQorCXJldHVybiAobmZzZF92ZXJzaW9uc1syXSAhPSBOVUxMKSB8fCAobmZzZF92ZXJzaW9uc1szXSAhPSBOVUxMKTsKKyNlbHNlCisJcmV0dXJuIChuZnNkX3ZlcnNpb25zWzJdICE9IE5VTEwpOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgbmZzZF9zdGFydHVwX25ldChpbnQgbnJzZXJ2cywgc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZnNkX25ldCAqbm4gPSBuZXRfZ2VuZXJpYyhuZXQsIG5mc2RfbmV0X2lkKTsKQEAgLTI1NSw5ICsyNjQsMTQgQEAKIAlyZXQgPSBuZnNkX2luaXRfc29ja3MobmV0KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9zb2NrczsKLQlyZXQgPSBsb2NrZF91cChuZXQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3NvY2tzOworCisJaWYgKG5mc2RfbmVlZHNfbG9ja2QoKSAmJiAhbm4tPmxvY2tkX3VwKSB7CisJCXJldCA9IGxvY2tkX3VwKG5ldCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9zb2NrczsKKwkJbm4tPmxvY2tkX3VwID0gMTsKKwl9CisKIAlyZXQgPSBuZnM0X3N0YXRlX3N0YXJ0X25ldChuZXQpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2xvY2tkOwpAQCAtMjY2LDcgKzI4MCwxMCBAQAogCXJldHVybiAwOwogCiBvdXRfbG9ja2Q6Ci0JbG9ja2RfZG93bihuZXQpOworCWlmIChubi0+bG9ja2RfdXApIHsKKwkJbG9ja2RfZG93bihuZXQpOworCQlubi0+bG9ja2RfdXAgPSAwOworCX0KIG91dF9zb2NrczoKIAluZnNkX3NodXRkb3duX2dlbmVyaWMoKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjc3LDcgKzI5NCwxMCBAQAogCXN0cnVjdCBuZnNkX25ldCAqbm4gPSBuZXRfZ2VuZXJpYyhuZXQsIG5mc2RfbmV0X2lkKTsKIAogCW5mczRfc3RhdGVfc2h1dGRvd25fbmV0KG5ldCk7Ci0JbG9ja2RfZG93bihuZXQpOworCWlmIChubi0+bG9ja2RfdXApIHsKKwkJbG9ja2RfZG93bihuZXQpOworCQlubi0+bG9ja2RfdXAgPSAwOworCX0KIAlubi0+bmZzZF9uZXRfdXAgPSBmYWxzZTsKIAluZnNkX3NodXRkb3duX2dlbmVyaWMoKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzeGRyLmMgYi9mcy9uZnNkL25mc3hkci5jCmluZGV4IDljNzY5YTQuLmIxN2Q5MzIgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzeGRyLmMKKysrIGIvZnMvbmZzZC9uZnN4ZHIuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJdHlwZSA9IChzdGF0LT5tb2RlICYgU19JRk1UKTsKIAogCSpwKysgPSBodG9ubChuZnNfZnR5cGVzW3R5cGUgPj4gMTJdKTsKLQkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC0+bW9kZSk7CisJKnArKyA9IGh0b25sKCh1MzIpIChzdGF0LT5tb2RlICYgU19JQUxMVUdPKSk7CiAJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQtPm5saW5rKTsKIAkqcCsrID0gaHRvbmwoKHUzMikgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIHN0YXQtPnVpZCkpOwogCSpwKysgPSBodG9ubCgodTMyKSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgc3RhdC0+Z2lkKSk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCAxNDI2ZWI2Li4wMTdkM2NiIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTIwNyw3ICsyMDcsMTIgQEAKIAkJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KIAl9IGVsc2UgewotCQlmaF9sb2NrKGZocCk7CisJCS8qCisJCSAqIEluIHRoZSBuZnNkNF9vcGVuKCkgY2FzZSwgdGhpcyBtYXkgYmUgaGVsZCBhY3Jvc3MKKwkJICogc3Vic2VxdWVudCBvcGVuIGFuZCBkZWxlZ2F0aW9uIGFjcXVpc2l0aW9uIHdoaWNoIG1heQorCQkgKiBuZWVkIHRvIHRha2UgdGhlIGNoaWxkJ3MgaV9tdXRleDoKKwkJICovCisJCWZoX2xvY2tfbmVzdGVkKGZocCwgSV9NVVRFWF9QQVJFTlQpOwogCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBkcGFyZW50LCBsZW4pOwogCQlob3N0X2VyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAkJaWYgKElTX0VSUihkZW50cnkpKQpAQCAtMjczLDEzICsyNzgsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbmZzZF9icmVha19sZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGJyZWFrX2xlYXNlKGlub2RlLCBPX1dST05MWSB8IE9fTk9OQkxPQ0spOwotfQotCiAvKgogICogQ29tbWl0IG1ldGFkYXRhIGNoYW5nZXMgdG8gc3RhYmxlIHN0b3JhZ2UuCiAgKi8KQEAgLTM0OCw4ICszNDYsNyBAQAogCiAJLyogUmV2b2tlIHNldHVpZC9zZXRnaWQgb24gY2hvd24gKi8KIAlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgKCgoaWFwLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiAhdWlkX2VxKGlhcC0+aWFfdWlkLCBpbm9kZS0+aV91aWQpKSB8fAotCSAgICAgKChpYXAtPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmICFnaWRfZXEoaWFwLT5pYV9naWQsIGlub2RlLT5pX2dpZCkpKSkgeworCSAgICAoKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgfHwgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0dJRCkpKSB7CiAJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9LSUxMX1BSSVY7CiAJCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CiAJCQkvKiB3ZSdyZSBzZXR0aW5nIG1vZGUgdG9vLCBqdXN0IGNsZWFyIHRoZSBzKmlkIGJpdHMgKi8KQEAgLTQ0OSwxNiArNDQ2LDEwIEBACiAJCWdvdG8gb3V0X3B1dF93cml0ZV9hY2Nlc3M7CiAJfQogCi0JaG9zdF9lcnIgPSBuZnNkX2JyZWFrX2xlYXNlKGlub2RlKTsKLQlpZiAoaG9zdF9lcnIpCi0JCWdvdG8gb3V0X3B1dF93cml0ZV9hY2Nlc3NfbmZzZXJyb3I7Ci0KIAlmaF9sb2NrKGZocCk7CiAJaG9zdF9lcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwLCBOVUxMKTsKIAlmaF91bmxvY2soZmhwKTsKIAotb3V0X3B1dF93cml0ZV9hY2Nlc3NfbmZzZXJyb3I6Ci0JZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogb3V0X3B1dF93cml0ZV9hY2Nlc3M6CiAJaWYgKHNpemVfY2hhbmdlKQogCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKQEAgLTE2MDksMTEgKzE2MDAsNiBAQAogCWVyciA9IG5mc2Vycl9ub2VudDsKIAlpZiAoIWRvbGQtPmRfaW5vZGUpCiAJCWdvdG8gb3V0X2RwdXQ7Ci0JaG9zdF9lcnIgPSBuZnNkX2JyZWFrX2xlYXNlKGRvbGQtPmRfaW5vZGUpOwotCWlmIChob3N0X2VycikgewotCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7Ci0JCWdvdG8gb3V0X2RwdXQ7Ci0JfQogCWhvc3RfZXJyID0gdmZzX2xpbmsoZG9sZCwgZGlycCwgZG5ldywgTlVMTCk7CiAJaWYgKCFob3N0X2VycikgewogCQllcnIgPSBuZnNlcnJubyhjb21taXRfbWV0YWRhdGEoZmZocCkpOwpAQCAtMTcwNywxNCArMTY5Myw2IEBACiAJaWYgKGZmaHAtPmZoX2V4cG9ydC0+ZXhfcGF0aC5kZW50cnkgIT0gdGZocC0+ZmhfZXhwb3J0LT5leF9wYXRoLmRlbnRyeSkKIAkJZ290byBvdXRfZHB1dF9uZXc7CiAKLQlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2Uob2RlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKGhvc3RfZXJyKQotCQlnb3RvIG91dF9kcHV0X25ldzsKLQlpZiAobmRlbnRyeS0+ZF9pbm9kZSkgewotCQlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UobmRlbnRyeS0+ZF9pbm9kZSk7Ci0JCWlmIChob3N0X2VycikKLQkJCWdvdG8gb3V0X2RwdXRfbmV3OwotCX0KIAlob3N0X2VyciA9IHZmc19yZW5hbWUoZmRpciwgb2RlbnRyeSwgdGRpciwgbmRlbnRyeSwgTlVMTCk7CiAJaWYgKCFob3N0X2VycikgewogCQlob3N0X2VyciA9IGNvbW1pdF9tZXRhZGF0YSh0ZmhwKTsKQEAgLTE3ODQsMTYgKzE3NjIsMTIgQEAKIAlpZiAoIXR5cGUpCiAJCXR5cGUgPSByZGVudHJ5LT5kX2lub2RlLT5pX21vZGUgJiBTX0lGTVQ7CiAKLQlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UocmRlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKGhvc3RfZXJyKQotCQlnb3RvIG91dF9wdXQ7CiAJaWYgKHR5cGUgIT0gU19JRkRJUikKIAkJaG9zdF9lcnIgPSB2ZnNfdW5saW5rKGRpcnAsIHJkZW50cnksIE5VTEwpOwogCWVsc2UKIAkJaG9zdF9lcnIgPSB2ZnNfcm1kaXIoZGlycCwgcmRlbnRyeSk7CiAJaWYgKCFob3N0X2VycikKIAkJaG9zdF9lcnIgPSBjb21taXRfbWV0YWRhdGEoZmhwKTsKLW91dF9wdXQ6CiAJZHB1dChyZGVudHJ5KTsKIAogb3V0X25mc2VycjoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmggYi9mcy9uZnNkL3Zmcy5oCmluZGV4IDFiYzFkNDQuLmZiZTkwYmQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmgKKysrIGIvZnMvbmZzZC92ZnMuaApAQCAtODYsOCArODYsNiBAQAogX19iZTMyCQluZnNkX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKIAkJCQlzdHJ1Y3Qgc3ZjX2ZoICosIGNoYXIgKiwgaW50LAogCQkJCXN0cnVjdCBzdmNfZmggKiwgY2hhciAqLCBpbnQpOwotX19iZTMyCQluZnNkX3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKLQkJCQlzdHJ1Y3Qgc3ZjX2ZoICosIGNoYXIgKiwgaW50KTsKIF9fYmUzMgkJbmZzZF91bmxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50IHR5cGUsCiAJCQkJY2hhciAqbmFtZSwgaW50IGxlbik7CiBfX2JlMzIJCW5mc2RfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLApkaWZmIC0tZ2l0IGEvZnMvbmZzZC94ZHIzLmggYi9mcy9uZnNkL3hkcjMuaAppbmRleCBiNmQ1NTQyLi4zMzVlMDRhIDEwMDY0NAotLS0gYS9mcy9uZnNkL3hkcjMuaAorKysgYi9mcy9uZnNkL3hkcjMuaApAQCAtMTc0LDYgKzE3NCw5IEBACiBzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyB7CiAJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBzdmNfZmgJCWZoOworCS8qIEp1c3QgdG8gc2F2ZSBrbWFsbG9jIG9uIGV2ZXJ5IHJlYWRkaXJwbHVzIGVudHJ5IChzdmNfZmggaXMgYQorCSAqIGxpdHRsZSBsYXJnZSBmb3IgdGhlIHN0YWNrKTogKi8KKwlzdHJ1Y3Qgc3ZjX2ZoCQlzY3JhdGNoOwogCWludAkJCWNvdW50OwogCV9fYmUzMgkJCXZlcmZbMl07CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QveGRyNC5oIGIvZnMvbmZzZC94ZHI0LmgKaW5kZXggYjNlZDY0NC4uZDI3OGEwZCAxMDA2NDQKLS0tIGEvZnMvbmZzZC94ZHI0LmgKKysrIGIvZnMvbmZzZC94ZHI0LmgKQEAgLTIyOCw3ICsyMjgsNyBAQAogCXUzMgkJb3BfY3JlYXRlOyAgICAgCSAgICAvKiByZXF1ZXN0ICovCiAJdTMyCQlvcF9jcmVhdGVtb2RlOyAgICAgIC8qIHJlcXVlc3QgKi8KIAl1MzIJCW9wX2JtdmFsWzNdOyAgICAgICAgLyogcmVxdWVzdCAqLwotCXN0cnVjdCBpYXR0cglpYXR0cjsgICAgICAgICAgICAgIC8qIFVOQ0hFQ0tFRDQsIEdVQVJERUQ0LCBFWENMVVNJVkU0XzEgKi8KKwlzdHJ1Y3QgaWF0dHIJb3BfaWF0dHI7ICAgICAgICAgICAvKiBVTkNIRUNLRUQ0LCBHVUFSREVENCwgRVhDTFVTSVZFNF8xICovCiAJbmZzNF92ZXJpZmllcglvcF92ZXJmIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAJCQkJCSAgICAvKiBFWENMVVNJVkU0ICovCiAJY2xpZW50aWRfdAlvcF9jbGllbnRpZDsgICAgICAgIC8qIHJlcXVlc3QgKi8KQEAgLTI1MCw3ICsyNTAsNiBAQAogCXN0cnVjdCBuZnM0X2FjbCAqb3BfYWNsOwogCXN0cnVjdCB4ZHJfbmV0b2JqIG9wX2xhYmVsOwogfTsKLSNkZWZpbmUgb3BfaWF0dHIJaWF0dHIKIAogc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSB7CiAJc3RhdGVpZF90CW9jX3JlcV9zdGF0ZWlkCQkvKiByZXF1ZXN0ICovOwpAQCAtMzc0LDcgKzM3Myw2IEBACiAKIHN0cnVjdCBuZnNkNF9mcmVlX3N0YXRlaWQgewogCXN0YXRlaWRfdAlmcl9zdGF0ZWlkOyAgICAgICAgIC8qIHJlcXVlc3QgKi8KLQlfX2JlMzIJCWZyX3N0YXR1czsgICAgICAgICAgLyogcmVzcG9uc2UgKi8KIH07CiAKIC8qIGFsc28gdXNlZCBmb3IgTlZFUklGWSAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ2J1Zi5jIGIvZnMvbmlsZnMyL3NlZ2J1Zi5jCmluZGV4IDJkOGJlNTEuLmRjM2E5ZWZkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnYnVmLmMKKysrIGIvZnMvbmlsZnMyL3NlZ2J1Zi5jCkBAIC00MTYsNyArNDE2LDggQEAKIAl9CiAJaWYgKGxpa2VseShiaW8pKSB7CiAJCWJpby0+YmlfYmRldiA9IG5pbGZzLT5uc19iZGV2OwotCQliaW8tPmJpX3NlY3RvciA9IHN0YXJ0IDw8IChuaWxmcy0+bnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9CisJCQlzdGFydCA8PCAobmlsZnMtPm5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CiAJfQogCXJldHVybiBiaW87CiB9CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCmluZGV4IDU4NzcyNjIuLjBlNzkyZjUgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCisrKyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCkBAIC0xNiwxMiArMTYsNiBAQAogewogCXN0cnVjdCBmYW5vdGlmeV9ldmVudF9pbmZvICpvbGQsICpuZXc7CiAKLSNpZmRlZiBDT05GSUdfRkFOT1RJRllfQUNDRVNTX1BFUk1JU1NJT05TCi0JLyogZG9udCBtZXJnZSB0d28gcGVybWlzc2lvbiBldmVudHMgKi8KLQlpZiAoKG9sZF9mc24tPm1hc2sgJiBGQU5fQUxMX1BFUk1fRVZFTlRTKSAmJgotCSAgICAobmV3X2Zzbi0+bWFzayAmIEZBTl9BTExfUEVSTV9FVkVOVFMpKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKIAlwcl9kZWJ1ZygiJXM6IG9sZD0lcCBuZXc9JXBcbiIsIF9fZnVuY19fLCBvbGRfZnNuLCBuZXdfZnNuKTsKIAlvbGQgPSBGQU5PVElGWV9FKG9sZF9mc24pOwogCW5ldyA9IEZBTk9USUZZX0UobmV3X2Zzbik7CkBAIC0zNCwxNCArMjgsMjMgQEAKIH0KIAogLyogYW5kIHRoZSBsaXN0IGJldHRlciBiZSBsb2NrZWQgYnkgc29tZXRoaW5nIHRvbyEgKi8KLXN0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZhbm90aWZ5X21lcmdlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkJCSAgICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCkKK3N0YXRpYyBpbnQgZmFub3RpZnlfbWVyZ2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKnRlc3RfZXZlbnQ7CiAJYm9vbCBkb19tZXJnZSA9IGZhbHNlOwogCiAJcHJfZGVidWcoIiVzOiBsaXN0PSVwIGV2ZW50PSVwXG4iLCBfX2Z1bmNfXywgbGlzdCwgZXZlbnQpOwogCisjaWZkZWYgQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUworCS8qCisJICogRG9uJ3QgbWVyZ2UgYSBwZXJtaXNzaW9uIGV2ZW50IHdpdGggYW55IG90aGVyIGV2ZW50IHNvIHRoYXQgd2Uga25vdworCSAqIHRoZSBldmVudCBzdHJ1Y3R1cmUgd2UgaGF2ZSBjcmVhdGVkIGluIGZhbm90aWZ5X2hhbmRsZV9ldmVudCgpIGlzIHRoZQorCSAqIG9uZSB3ZSBzaG91bGQgY2hlY2sgZm9yIHBlcm1pc3Npb24gcmVzcG9uc2UuCisJICovCisJaWYgKGV2ZW50LT5tYXNrICYgRkFOX0FMTF9QRVJNX0VWRU5UUykKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh0ZXN0X2V2ZW50LCBsaXN0LCBsaXN0KSB7CiAJCWlmIChzaG91bGRfbWVyZ2UodGVzdF9ldmVudCwgZXZlbnQpKSB7CiAJCQlkb19tZXJnZSA9IHRydWU7CkBAIC01MCwxMCArNTMsMTAgQEAKIAl9CiAKIAlpZiAoIWRvX21lcmdlKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIDA7CiAKIAl0ZXN0X2V2ZW50LT5tYXNrIHw9IGV2ZW50LT5tYXNrOwotCXJldHVybiB0ZXN0X2V2ZW50OworCXJldHVybiAxOwogfQogCiAjaWZkZWYgQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUwpAQCAtMTQ5LDcgKzE1Miw2IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGZhbm90aWZ5X2V2ZW50X2luZm8gKmV2ZW50OwogCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNuX2V2ZW50OwotCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqbm90aWZ5X2Zzbl9ldmVudDsKIAogCUJVSUxEX0JVR19PTihGQU5fQUNDRVNTICE9IEZTX0FDQ0VTUyk7CiAJQlVJTERfQlVHX09OKEZBTl9NT0RJRlkgIT0gRlNfTU9ESUZZKTsKQEAgLTE4OCwyMSArMTkwLDE5IEBACiAJZXZlbnQtPnJlc3BvbnNlID0gMDsKICNlbmRpZgogCi0Jbm90aWZ5X2Zzbl9ldmVudCA9IGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQoZ3JvdXAsIGZzbl9ldmVudCwKLQkJCQkJCSAgICAgZmFub3RpZnlfbWVyZ2UpOwotCWlmIChub3RpZnlfZnNuX2V2ZW50KSB7CisJcmV0ID0gZnNub3RpZnlfYWRkX25vdGlmeV9ldmVudChncm91cCwgZnNuX2V2ZW50LCBmYW5vdGlmeV9tZXJnZSk7CisJaWYgKHJldCkgeworCQlCVUdfT04obWFzayAmIEZBTl9BTExfUEVSTV9FVkVOVFMpOwogCQkvKiBPdXIgZXZlbnQgd2Fzbid0IHVzZWQgaW4gdGhlIGVuZC4gRnJlZSBpdC4gKi8KIAkJZnNub3RpZnlfZGVzdHJveV9ldmVudChncm91cCwgZnNuX2V2ZW50KTsKLQkJaWYgKElTX0VSUihub3RpZnlfZnNuX2V2ZW50KSkKLQkJCXJldHVybiBQVFJfRVJSKG5vdGlmeV9mc25fZXZlbnQpOwotCQkvKiBXZSBuZWVkIHRvIGFzayBhYm91dCBhIGRpZmZlcmVudCBldmVudHMgYWZ0ZXIgYSBtZXJnZS4uLiAqLwotCQlldmVudCA9IEZBTk9USUZZX0Uobm90aWZ5X2Zzbl9ldmVudCk7Ci0JCWZzbl9ldmVudCA9IG5vdGlmeV9mc25fZXZlbnQ7CisJCXJldCA9IDA7CiAJfQogCiAjaWZkZWYgQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUwotCWlmIChmc25fZXZlbnQtPm1hc2sgJiBGQU5fQUxMX1BFUk1fRVZFTlRTKQorCWlmIChtYXNrICYgRkFOX0FMTF9QRVJNX0VWRU5UUykgewogCQlyZXQgPSBmYW5vdGlmeV9nZXRfcmVzcG9uc2VfZnJvbV9hY2Nlc3MoZ3JvdXAsIGV2ZW50KTsKKwkJZnNub3RpZnlfZGVzdHJveV9ldmVudChncm91cCwgZnNuX2V2ZW50KTsKKwl9CiAjZW5kaWYKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmggYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuaAppbmRleCAwZTkwMTc0Li4zMmEyZjAzIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuaAorKysgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuaApAQCAtNCw2ICs0LDEzIEBACiAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZmFub3RpZnlfZXZlbnRfY2FjaGVwOwogCisvKgorICogTGlmZXRpbWUgb2YgdGhlIHN0cnVjdHVyZSBkaWZmZXJzIGZvciBub3JtYWwgYW5kIHBlcm1pc3Npb24gZXZlbnRzLiBJbiBib3RoCisgKiBjYXNlcyB0aGUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBpbiBmYW5vdGlmeV9oYW5kbGVfZXZlbnQoKS4gRm9yIG5vcm1hbAorICogZXZlbnRzIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVwb3J0aW5nIGl0IHRvIHVzZXJzcGFjZS4KKyAqIEZvciBwZXJtaXNzaW9uIGV2ZW50cyB3ZSBmcmVlIGl0IG9ubHkgYWZ0ZXIgd2UgcmVjZWl2ZSByZXNwb25zZSBmcm9tCisgKiB1c2Vyc3BhY2UuCisgKi8KIHN0cnVjdCBmYW5vdGlmeV9ldmVudF9pbmZvIHsKIAlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgZnNlOwogCS8qCmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jIGIvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYwppbmRleCAxZmQ2NmFiLi5iNjE3NWZhIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jCisrKyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeV91c2VyLmMKQEAgLTMxOSw3ICszMTksMTIgQEAKIAkJCWlmIChJU19FUlIoa2V2ZW50KSkKIAkJCQlicmVhazsKIAkJCXJldCA9IGNvcHlfZXZlbnRfdG9fdXNlcihncm91cCwga2V2ZW50LCBidWYpOwotCQkJZnNub3RpZnlfZGVzdHJveV9ldmVudChncm91cCwga2V2ZW50KTsKKwkJCS8qCisJCQkgKiBQZXJtaXNzaW9uIGV2ZW50cyBnZXQgZGVzdHJveWVkIGFmdGVyIHdlCisJCQkgKiByZWNlaXZlIHJlc3BvbnNlCisJCQkgKi8KKwkJCWlmICghKGtldmVudC0+bWFzayAmIEZBTl9BTExfUEVSTV9FVkVOVFMpKQorCQkJCWZzbm90aWZ5X2Rlc3Ryb3lfZXZlbnQoZ3JvdXAsIGtldmVudCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsKIAkJCWJ1ZiArPSByZXQ7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X2Zzbm90aWZ5LmMgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X2Zzbm90aWZ5LmMKaW5kZXggYWFkMWEzNS4uZDVlZTU2MyAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV9mc25vdGlmeS5jCisrKyBiL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnlfZnNub3RpZnkuYwpAQCAtNTMsMTUgKzUzLDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICppbm90aWZ5X21lcmdlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KQorc3RhdGljIGludCBpbm90aWZ5X21lcmdlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpsYXN0X2V2ZW50OwogCiAJbGFzdF9ldmVudCA9IGxpc3RfZW50cnkobGlzdC0+cHJldiwgc3RydWN0IGZzbm90aWZ5X2V2ZW50LCBsaXN0KTsKLQlpZiAoIWV2ZW50X2NvbXBhcmUobGFzdF9ldmVudCwgZXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbGFzdF9ldmVudDsKKwlyZXR1cm4gZXZlbnRfY29tcGFyZShsYXN0X2V2ZW50LCBldmVudCk7CiB9CiAKIGludCBpbm90aWZ5X2hhbmRsZV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLApAQCAtNzMsOSArNzEsOCBAQAogewogCXN0cnVjdCBpbm90aWZ5X2lub2RlX21hcmsgKmlfbWFyazsKIAlzdHJ1Y3QgaW5vdGlmeV9ldmVudF9pbmZvICpldmVudDsKLQlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmFkZGVkX2V2ZW50OwogCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNuX2V2ZW50OwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAJaW50IGxlbiA9IDA7CiAJaW50IGFsbG9jX2xlbiA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudF9pbmZvKTsKIApAQCAtMTEwLDE4ICsxMDcsMTYgQEAKIAlpZiAobGVuKQogCQlzdHJjcHkoZXZlbnQtPm5hbWUsIGZpbGVfbmFtZSk7CiAKLQlhZGRlZF9ldmVudCA9IGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQoZ3JvdXAsIGZzbl9ldmVudCwgaW5vdGlmeV9tZXJnZSk7Ci0JaWYgKGFkZGVkX2V2ZW50KSB7CisJcmV0ID0gZnNub3RpZnlfYWRkX25vdGlmeV9ldmVudChncm91cCwgZnNuX2V2ZW50LCBpbm90aWZ5X21lcmdlKTsKKwlpZiAocmV0KSB7CiAJCS8qIE91ciBldmVudCB3YXNuJ3QgdXNlZCBpbiB0aGUgZW5kLiBGcmVlIGl0LiAqLwogCQlmc25vdGlmeV9kZXN0cm95X2V2ZW50KGdyb3VwLCBmc25fZXZlbnQpOwotCQlpZiAoSVNfRVJSKGFkZGVkX2V2ZW50KSkKLQkJCXJldCA9IFBUUl9FUlIoYWRkZWRfZXZlbnQpOwogCX0KIAogCWlmIChpbm9kZV9tYXJrLT5tYXNrICYgSU5fT05FU0hPVCkKIAkJZnNub3RpZnlfZGVzdHJveV9tYXJrKGlub2RlX21hcmssIGdyb3VwKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlub3RpZnlfZnJlZWluZ19tYXJrKHN0cnVjdCBmc25vdGlmeV9tYXJrICpmc25fbWFyaywgc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYyBiL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYwppbmRleCA5NTIyMzdiLi4xOGIzYzQ0IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKKysrIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCkBAIC03OSwxNSArNzksMTUgQEAKIAogLyoKICAqIEFkZCBhbiBldmVudCB0byB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlLiAgVGhlIGdyb3VwIGNhbiBsYXRlciBwdWxsIHRoaXMKLSAqIGV2ZW50IG9mZiB0aGUgcXVldWUgdG8gZGVhbCB3aXRoLiAgSWYgdGhlIGV2ZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUKLSAqIGdyb3VwJ3Mgbm90aWZpY2F0aW9uIHF1ZXVlLCBhIHJlZmVyZW5jZSBpcyB0YWtlbiBvbiBldmVudC4KKyAqIGV2ZW50IG9mZiB0aGUgcXVldWUgdG8gZGVhbCB3aXRoLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgZXZlbnQgd2FzCisgKiBhZGRlZCB0byB0aGUgcXVldWUsIDEgaWYgdGhlIGV2ZW50IHdhcyBtZXJnZWQgd2l0aCBzb21lIG90aGVyIHF1ZXVlZCBldmVudC4KICAqLwotc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpmc25vdGlmeV9hZGRfbm90aWZ5X2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCi0JCQkJCQkgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCwKLQkJCQkJCSBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKigqbWVyZ2UpKHN0cnVjdCBsaXN0X2hlYWQgKiwKLQkJCQkJCQkJCQkgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICopKQoraW50IGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKKwkJCSAgICAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQsCisJCQkgICAgICBpbnQgKCptZXJnZSkoc3RydWN0IGxpc3RfaGVhZCAqLAorCQkJCQkgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKikpCiB7Ci0Jc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpyZXR1cm5fZXZlbnQgPSBOVUxMOworCWludCByZXQgPSAwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAmZ3JvdXAtPm5vdGlmaWNhdGlvbl9saXN0OwogCiAJcHJfZGVidWcoIiVzOiBncm91cD0lcCBldmVudD0lcFxuIiwgX19mdW5jX18sIGdyb3VwLCBldmVudCk7CkBAIC05OCwxNCArOTgsMTQgQEAKIAkJLyogUXVldWUgb3ZlcmZsb3cgZXZlbnQgb25seSBpZiBpdCBpc24ndCBhbHJlYWR5IHF1ZXVlZCAqLwogCQlpZiAobGlzdF9lbXB0eSgmZ3JvdXAtPm92ZXJmbG93X2V2ZW50Lmxpc3QpKQogCQkJZXZlbnQgPSAmZ3JvdXAtPm92ZXJmbG93X2V2ZW50OwotCQlyZXR1cm5fZXZlbnQgPSBldmVudDsKKwkJcmV0ID0gMTsKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkobGlzdCkgJiYgbWVyZ2UpIHsKLQkJcmV0dXJuX2V2ZW50ID0gbWVyZ2UobGlzdCwgZXZlbnQpOwotCQlpZiAocmV0dXJuX2V2ZW50KSB7CisJCXJldCA9IG1lcmdlKGxpc3QsIGV2ZW50KTsKKwkJaWYgKHJldCkgewogCQkJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKLQkJCXJldHVybiByZXR1cm5fZXZlbnQ7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogCXdha2VfdXAoJmdyb3VwLT5ub3RpZmljYXRpb25fd2FpdHEpOwogCWtpbGxfZmFzeW5jKCZncm91cC0+ZnNuX2ZhLCBTSUdJTywgUE9MTF9JTik7Ci0JcmV0dXJuIHJldHVybl9ldmVudDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCBlYTRiYTlkLi5kYjliZDhhIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMjEzNCw3ICsyMTM0LDcgQEAKIAlyZXQgPSBudGZzX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhpb2NiLCBpb3YsIG5yX3NlZ3MsICZpb2NiLT5raV9wb3MpOwogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChyZXQgPiAwKSB7Ci0JCWludCBlcnIgPSBnZW5lcmljX3dyaXRlX3N5bmMoZmlsZSwgcG9zLCByZXQpOworCQlpbnQgZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIGlvY2ItPmtpX3BvcyAtIHJldCwgcmV0KTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXQgPSBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggODc1MGFlMS4uZTJlZGZmMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC00NzQyLDYgKzQ3NDIsNyBAQAogCQkJCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KQogewogCWludCBzdGF0dXMgPSAwLCBlcnIgPSAwOworCWludCBuZWVkX2ZyZWUgPSAwOwogCWludCBmcmVlX2V4dGVudHM7CiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgcmVhc29uID0gUkVTVEFSVF9OT05FOwogCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKQEAgLTQ3OTYsNyArNDc5Nyw4IEBACiAJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7CisJCW5lZWRfZnJlZSA9IDE7CisJCWdvdG8gYmFpbDsKIAl9CiAKIAlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKQEAgLTQ4MDcsNyArNDgwOSw4IEBACiAJCQkJICAgICBudW1fYml0cywgZmxhZ3MsIG1ldGFfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKKwkJbmVlZF9mcmVlID0gMTsKKwkJZ290byBiYWlsOwogCX0KIAogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBldC0+ZXRfcm9vdF9iaCk7CkBAIC00ODIxLDYgKzQ4MjQsMTkgQEAKIAkJcmVhc29uID0gUkVTVEFSVF9UUkFOUzsKIAl9CiAKK2JhaWw6CisJaWYgKG5lZWRfZnJlZSkgeworCQlpZiAoZGF0YV9hYy0+YWNfd2hpY2ggPT0gT0NGUzJfQUNfVVNFX0xPQ0FMKQorCQkJb2NmczJfZnJlZV9sb2NhbF9hbGxvY19iaXRzKG9zYiwgaGFuZGxlLCBkYXRhX2FjLAorCQkJCQliaXRfb2ZmLCBudW1fYml0cyk7CisJCWVsc2UKKwkJCW9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlLAorCQkJCQlkYXRhX2FjLT5hY19pbm9kZSwKKwkJCQkJZGF0YV9hYy0+YWNfYmgsCisJCQkJCW9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKSwKKwkJCQkJbnVtX2JpdHMpOworCX0KKwogbGVhdmU6CiAJaWYgKHJlYXNvbl9yZXQpCiAJCSpyZWFzb25fcmV0ID0gcmVhc29uOwpAQCAtNjgwNSw2ICs2ODIxLDggQEAKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCiB7CiAJaW50IHJldCwgaSwgaGFzX2RhdGEsIG51bV9wYWdlcyA9IDA7CisJaW50IG5lZWRfZnJlZSA9IDA7CisJdTMyIGJpdF9vZmYsIG51bTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXU2NCB1bmluaXRpYWxpemVkX3ZhcihibG9jayk7CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CkBAIC02ODUwLDcgKzY4NjgsNiBAQAogCX0KIAogCWlmIChoYXNfZGF0YSkgewotCQl1MzIgYml0X29mZiwgbnVtOwogCQl1bnNpZ25lZCBpbnQgcGFnZV9lbmQ7CiAJCXU2NCBwaHlzOwogCkBAIC02ODg2LDYgKzY5MDMsNyBAQAogCQlyZXQgPSBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhpbm9kZSwgMCwgZW5kLCBwYWdlcywgJm51bV9wYWdlcyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCW5lZWRfZnJlZSA9IDE7CiAJCQlnb3RvIG91dF9jb21taXQ7CiAJCX0KIApAQCAtNjg5Niw2ICs2OTE0LDcgQEAKIAkJcmV0ID0gb2NmczJfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgcGFnZXNbMF0sIGRpX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOworCQkJbmVlZF9mcmVlID0gMTsKIAkJCWdvdG8gb3V0X2NvbW1pdDsKIAkJfQogCkBAIC02OTI3LDYgKzY5NDYsNyBAQAogCQlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgJmV0LCAwLCBibG9jaywgMSwgMCwgTlVMTCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCW5lZWRfZnJlZSA9IDE7CiAJCQlnb3RvIG91dF9jb21taXQ7CiAJCX0KIApAQCAtNjkzOCw2ICs2OTU4LDE4IEBACiAJCWRxdW90X2ZyZWVfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKIAkJCQkJICBvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCAxKSk7CiAKKwlpZiAobmVlZF9mcmVlKSB7CisJCWlmIChkYXRhX2FjLT5hY193aGljaCA9PSBPQ0ZTMl9BQ19VU0VfTE9DQUwpCisJCQlvY2ZzMl9mcmVlX2xvY2FsX2FsbG9jX2JpdHMob3NiLCBoYW5kbGUsIGRhdGFfYWMsCisJCQkJCWJpdF9vZmYsIG51bSk7CisJCWVsc2UKKwkJCW9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlLAorCQkJCQlkYXRhX2FjLT5hY19pbm9kZSwKKwkJCQkJZGF0YV9hYy0+YWNfYmgsCisJCQkJCW9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKSwKKwkJCQkJbnVtKTsKKwl9CisKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiBvdXRfdW5sb2NrOgpAQCAtNzEyNiw3ICs3MTU4LDcgQEAKIAlpZiAoZW5kID4gaV9zaXplX3JlYWQoaW5vZGUpKQogCQllbmQgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAKLQlCVUdfT04oc3RhcnQgPj0gZW5kKTsKKwlCVUdfT04oc3RhcnQgPiBlbmQpOwogCiAJaWYgKCEoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSB8fAogCSAgICAhKGxlMTZfdG9fY3B1KGRpLT5pX2R5bl9mZWF0dXJlcykgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkgfHwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDczOTIwZmYuLmJmNDgyZGYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtNDEzLDcgKzQxMyw3IEBACiAJfQogCiAJLyogTXVzdCBwdXQgZXZlcnl0aGluZyBpbiA1MTIgYnl0ZSBzZWN0b3JzIGZvciB0aGUgYmlvLi4uICovCi0JYmlvLT5iaV9zZWN0b3IgPSAocmVnLT5ocl9zdGFydF9ibG9jayArIGNzKSA8PCAoYml0cyAtIDkpOworCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSAocmVnLT5ocl9zdGFydF9ibG9jayArIGNzKSA8PCAoYml0cyAtIDkpOwogCWJpby0+YmlfYmRldiA9IHJlZy0+aHJfYmRldjsKIAliaW8tPmJpX3ByaXZhdGUgPSB3YzsKIAliaW8tPmJpX2VuZF9pbyA9IG8yaGJfYmlvX2VuZF9pbzsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCBkNzdkNzFlLi44NDUwMjYyYmMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTE4NSw2ICsxODUsOSBAQAogCQkJICAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRhdGFzeW5jKTsKIAorCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikgfHwgb2NmczJfaXNfc29mdF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gLUVST0ZTOworCiAJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNDc0LDExICs0NzcsNiBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JLyogbGV0cyBoYW5kbGUgdGhlIHNpbXBsZSB0cnVuY2F0ZSBjYXNlcyBiZWZvcmUgZG9pbmcgYW55IG1vcmUKLQkgKiBjbHVzdGVyIGxvY2tpbmcuICovCi0JaWYgKG5ld19pX3NpemUgPT0gbGU2NF90b19jcHUoZmUtPmlfc2l6ZSkpCi0JCWdvdG8gYmFpbDsKLQogCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCiAJb2NmczJfcmVzdl9kaXNjYXJkKCZvc2ItPm9zYl9sYV9yZXNtYXAsCkBAIC03MTgsNyArNzE2LDggQEAKICAqIFdoaWxlIGEgd3JpdGUgd2lsbCBhbHJlYWR5IGJlIG9yZGVyaW5nIHRoZSBkYXRhLCBhIHRydW5jYXRlIHdpbGwgbm90LgogICogVGh1cywgd2UgbmVlZCB0byBleHBsaWNpdGx5IG9yZGVyIHRoZSB6ZXJvZWQgcGFnZXMuCiAgKi8KLXN0YXRpYyBoYW5kbGVfdCAqb2NmczJfemVyb19zdGFydF9vcmRlcmVkX3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaGFuZGxlX3QgKm9jZnMyX3plcm9fc3RhcnRfb3JkZXJlZF90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCkKIHsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKQEAgLTczNSw3ICs3MzQsMTQgQEAKIAl9CiAKIAlyZXQgPSBvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIElOT0RFX0NBQ0hFKGlub2RlKSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIAogb3V0OgpAQCAtNzUxLDcgKzc1Nyw3IEBACiAgKiB0byBiZSB0b28gZnJhZ2lsZSB0byBkbyBleGFjdGx5IHdoYXQgd2UgbmVlZCB3aXRob3V0IHVzIGhhdmluZyB0bwogICogd29ycnkgYWJvdXQgcmVjdXJzaXZlIGxvY2tpbmcgaW4gLT53cml0ZV9iZWdpbigpIGFuZCAtPndyaXRlX2VuZCgpLiAqLwogc3RhdGljIGludCBvY2ZzMl93cml0ZV96ZXJvX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGFic19mcm9tLAotCQkJCSB1NjQgYWJzX3RvKQorCQkJCSB1NjQgYWJzX3RvLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTc1OSw2ICs3NjUsNyBAQAogCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIHplcm9fZnJvbSwgemVyb190bywgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAogCUJVR19PTihhYnNfZnJvbSA+PSBhYnNfdG8pOwogCUJVR19PTihhYnNfdG8gPiAoKCh1NjQpaW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUKSk7CkBAIC04MDEsNyArODA4LDggQEAKIAkJfQogCiAJCWlmICghaGFuZGxlKSB7Ci0JCQloYW5kbGUgPSBvY2ZzMl96ZXJvX3N0YXJ0X29yZGVyZWRfdHJhbnNhY3Rpb24oaW5vZGUpOworCQkJaGFuZGxlID0gb2NmczJfemVyb19zdGFydF9vcmRlcmVkX3RyYW5zYWN0aW9uKGlub2RlLAorCQkJCQkJCQkgICAgICBkaV9iaCk7CiAJCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCQkJaGFuZGxlID0gTlVMTDsKQEAgLTgxOCw4ICs4MjYsMjIgQEAKIAkJCXJldCA9IDA7CiAJfQogCi0JaWYgKGhhbmRsZSkKKwlpZiAoaGFuZGxlKSB7CisJCS8qCisJCSAqIGZzLXdyaXRlYmFjayB3aWxsIHJlbGVhc2UgdGhlIGRpcnR5IHBhZ2VzIHdpdGhvdXQgcGFnZSBsb2NrCisJCSAqIHdob3NlIG9mZnNldCBhcmUgb3ZlciBpbm9kZSBzaXplLCB0aGUgcmVsZWFzZSBoYXBwZW5zIGF0CisJCSAqIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZV9lbmRpbygpLgorCQkgKi8KKwkJaV9zaXplX3dyaXRlKGlub2RlLCBhYnNfdG8pOworCQlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOworCQlkaS0+aV9zaXplID0gY3B1X3RvX2xlNjQoKHU2NClpX3NpemVfcmVhZChpbm9kZSkpOworCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlkaS0+aV9tdGltZSA9IGRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKwkJZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X25zZWMpOworCQlkaS0+aV9tdGltZV9uc2VjID0gZGktPmlfY3RpbWVfbnNlYzsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKIAkJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKKwl9CiAKIG91dF91bmxvY2s6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CkBAIC05MTUsNyArOTM3LDcgQEAKICAqIGhhcyBtYWRlIHN1cmUgdGhhdCB0aGUgZW50aXJlIHJhbmdlIG5lZWRzIHplcm9pbmcuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfemVyb19leHRlbmRfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHJhbmdlX3N0YXJ0LAotCQkJCSAgIHU2NCByYW5nZV9lbmQpCisJCQkJICAgdTY0IHJhbmdlX2VuZCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCkKIHsKIAlpbnQgcmMgPSAwOwogCXU2NCBuZXh0X3BvczsKQEAgLTkzMSw3ICs5NTMsNyBAQAogCQluZXh0X3BvcyA9ICh6ZXJvX3BvcyAmIFBBR0VfQ0FDSEVfTUFTSykgKyBQQUdFX0NBQ0hFX1NJWkU7CiAJCWlmIChuZXh0X3BvcyA+IHJhbmdlX2VuZCkKIAkJCW5leHRfcG9zID0gcmFuZ2VfZW5kOwotCQlyYyA9IG9jZnMyX3dyaXRlX3plcm9fcGFnZShpbm9kZSwgemVyb19wb3MsIG5leHRfcG9zKTsKKwkJcmMgPSBvY2ZzMl93cml0ZV96ZXJvX3BhZ2UoaW5vZGUsIHplcm9fcG9zLCBuZXh0X3BvcywgZGlfYmgpOwogCQlpZiAocmMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJjKTsKIAkJCWJyZWFrOwpAQCAtOTc3LDcgKzk5OSw3IEBACiAJCQlyYW5nZV9lbmQgPSB6ZXJvX3RvX3NpemU7CiAKIAkJcmV0ID0gb2NmczJfemVyb19leHRlbmRfcmFuZ2UoaW5vZGUsIHJhbmdlX3N0YXJ0LAotCQkJCQkgICAgICByYW5nZV9lbmQpOworCQkJCQkgICAgICByYW5nZV9lbmQsIGRpX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJYnJlYWs7CkBAIC0xMTQ1LDE0ICsxMTY3LDE0IEBACiAJCWdvdG8gYmFpbF91bmxvY2tfcnc7CiAJfQogCi0JaWYgKHNpemVfY2hhbmdlICYmIGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJaWYgKHNpemVfY2hhbmdlKSB7CiAJCXN0YXR1cyA9IGlub2RlX25ld3NpemVfb2soaW5vZGUsIGF0dHItPmlhX3NpemUpOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBiYWlsX3VubG9jazsKIAogCQlpbm9kZV9kaW9fd2FpdChpbm9kZSk7CiAKLQkJaWYgKGlfc2l6ZV9yZWFkKGlub2RlKSA+IGF0dHItPmlhX3NpemUpIHsKKwkJaWYgKGlfc2l6ZV9yZWFkKGlub2RlKSA+PSBhdHRyLT5pYV9zaXplKSB7CiAJCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CiAJCQkJc3RhdHVzID0gb2NmczJfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShpbm9kZSwKIAkJCQkJCQkJICAgICAgYXR0ci0+aWFfc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKaW5kZXggY2Q1NDk2Yi4uMDQ0MDEzNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jCisrKyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuYwpAQCAtNzgxLDYgKzc4MSw0OCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK2ludCBvY2ZzMl9mcmVlX2xvY2FsX2FsbG9jX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCisJCQkJdTMyIGJpdF9vZmYsCisJCQkJdTMyIG51bV9iaXRzKQoreworCWludCBzdGF0dXMsIHN0YXJ0OworCXUzMiBjbGVhcl9iaXRzOworCXN0cnVjdCBpbm9kZSAqbG9jYWxfYWxsb2NfaW5vZGU7CisJdm9pZCAqYml0bWFwOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmFsbG9jOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9hbGxvYyAqbGE7CisKKwlCVUdfT04oYWMtPmFjX3doaWNoICE9IE9DRlMyX0FDX1VTRV9MT0NBTCk7CisKKwlsb2NhbF9hbGxvY19pbm9kZSA9IGFjLT5hY19pbm9kZTsKKwlhbGxvYyA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIG9zYi0+bG9jYWxfYWxsb2NfYmgtPmJfZGF0YTsKKwlsYSA9IE9DRlMyX0xPQ0FMX0FMTE9DKGFsbG9jKTsKKworCWJpdG1hcCA9IGxhLT5sYV9iaXRtYXA7CisJc3RhcnQgPSBiaXRfb2ZmIC0gbGUzMl90b19jcHUobGEtPmxhX2JtX29mZik7CisJY2xlYXJfYml0cyA9IG51bV9iaXRzOworCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLAorCQkJSU5PREVfQ0FDSEUobG9jYWxfYWxsb2NfaW5vZGUpLAorCQkJb3NiLT5sb2NhbF9hbGxvY19iaCwKKwkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwl3aGlsZSAoY2xlYXJfYml0cy0tKQorCQlvY2ZzMl9jbGVhcl9iaXQoc3RhcnQrKywgYml0bWFwKTsKKworCWxlMzJfYWRkX2NwdSgmYWxsb2MtPmlkMS5iaXRtYXAxLmlfdXNlZCwgLW51bV9iaXRzKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgb3NiLT5sb2NhbF9hbGxvY19iaCk7CisKK2JhaWw6CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIHUzMiBvY2ZzMl9sb2NhbF9hbGxvY19jb3VudF9iaXRzKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmFsbG9jKQogewogCXUzMiBjb3VudDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuaCBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuaAppbmRleCAxYmU5YjU4Li40NGE3ZDFmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmgKKysrIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5oCkBAIC01NSw2ICs1NSwxMiBAQAogCQkJCSB1MzIgKmJpdF9vZmYsCiAJCQkJIHUzMiAqbnVtX2JpdHMpOwogCitpbnQgb2NmczJfZnJlZV9sb2NhbF9hbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAorCQkJCXUzMiBiaXRfb2ZmLAorCQkJCXUzMiBudW1fYml0cyk7CisKIHZvaWQgb2NmczJfbG9jYWxfYWxsb2Nfc2Vlbl9mcmVlX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7CiB2b2lkIG9jZnMyX2xhX2VuYWJsZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL25hbWVpLmMgYi9mcy9vY2ZzMi9uYW1laS5jCmluZGV4IGY0ZDYwOWIuLjM2ODM2NDMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL25hbWVpLmMKKysrIGIvZnMvb2NmczIvbmFtZWkuYwpAQCAtNjY0LDYgKzY2NCw3IEBACiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkaXItPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaXJfbG9va3VwX3Jlc3VsdCBsb29rdXAgPSB7IE5VTEwsIH07CiAJc2lnc2V0X3Qgb2xkc2V0OworCXU2NCBvbGRfZGVfaW5vOwogCiAJdHJhY2Vfb2NmczJfbGluaygodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkJCSBvbGRfZGVudHJ5LT5kX25hbWUubGVuLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKQEAgLTY4Niw2ICs2ODcsMjIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJZXJyID0gb2NmczJfbG9va3VwX2lub19mcm9tX25hbWUoZGlyLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCW9sZF9kZW50cnktPmRfbmFtZS5sZW4sICZvbGRfZGVfaW5vKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2hlY2sgd2hldGhlciBhbm90aGVyIG5vZGUgcmVtb3ZlZCB0aGUgc291cmNlIGlub2RlIHdoaWxlIHdlCisJICogd2VyZSBpbiB0aGUgdmZzLgorCSAqLworCWlmIChvbGRfZGVfaW5vICE9IE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubykgeworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKIAllcnIgPSBvY2ZzMl9jaGVja19kaXJfZm9yX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQkJZGVudHJ5LT5kX25hbWUubGVuKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvcG9zaXhfYWNsLmMgYi9mcy9wb3NpeF9hY2wuYwppbmRleCAzOGJhZTVhLi4xMWM1NGZkIDEwMDY0NAotLS0gYS9mcy9wb3NpeF9hY2wuYworKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtNTIxLDggKzUyMSwxMSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlhY2wgPSBnZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwotCWlmIChJU19FUlJfT1JfTlVMTChhY2wpKQorCWlmIChJU19FUlJfT1JfTlVMTChhY2wpKSB7CisJCWlmIChhY2wgPT0gRVJSX1BUUigtRU9QTk9UU1VQUCkpCisJCQlyZXR1cm4gMDsKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwl9CiAKIAlyZXQgPSBfX3Bvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBtb2RlKTsKIAlpZiAocmV0KQpAQCAtNTQ0LDE0ICs1NDcsMTUgQEAKIAkJZ290byBub19hY2w7CiAKIAlwID0gZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOwotCWlmIChJU19FUlIocCkpCisJaWYgKElTX0VSUihwKSkgeworCQlpZiAocCA9PSBFUlJfUFRSKC1FT1BOT1RTVVBQKSkKKwkJCWdvdG8gYXBwbHlfdW1hc2s7CiAJCXJldHVybiBQVFJfRVJSKHApOwotCi0JaWYgKCFwKSB7Ci0JCSptb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7Ci0JCWdvdG8gbm9fYWNsOwogCX0KIAorCWlmICghcCkKKwkJZ290byBhcHBseV91bWFzazsKKwogCSphY2wgPSBwb3NpeF9hY2xfY2xvbmUocCwgR0ZQX05PRlMpOwogCWlmICghKmFjbCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzUsNiArNTc5LDggQEAKIAl9CiAJcmV0dXJuIDA7CiAKK2FwcGx5X3VtYXNrOgorCSptb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiBub19hY2w6CiAJKmRlZmF1bHRfYWNsID0gTlVMTDsKIAkqYWNsID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3JlLmMgYi9mcy9wcm9jL3ZtY29yZS5jCmluZGV4IDJjYTdiYTAuLjg4ZDQ1ODUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvdm1jb3JlLmMKKysrIGIvZnMvcHJvYy92bWNvcmUuYwpAQCAtNDY4LDE3ICs0NjgsMjQgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCQluaGRyX3B0ciA9IG5vdGVzX3NlY3Rpb247Ci0JCXdoaWxlIChyZWFsX3N6IDwgbWF4X3N6KSB7Ci0JCQlpZiAobmhkcl9wdHItPm5fbmFtZXN6ID09IDApCi0JCQkJYnJlYWs7CisJCXdoaWxlIChuaGRyX3B0ci0+bl9uYW1lc3ogIT0gMCkgewogCQkJc3ogPSBzaXplb2YoRWxmNjRfTmhkcikgKwogCQkJCSgobmhkcl9wdHItPm5fbmFtZXN6ICsgMykgJiB+MykgKwogCQkJCSgobmhkcl9wdHItPm5fZGVzY3N6ICsgMykgJiB+Myk7CisJCQlpZiAoKHJlYWxfc3ogKyBzeikgPiBtYXhfc3opIHsKKwkJCQlwcl93YXJuKCJXYXJuaW5nOiBFeGNlZWRlZCBwX21lbXN6LCBkcm9wcGluZyBQVF9OT1RFIGVudHJ5IG5fbmFtZXN6PTB4JXgsIG5fZGVzY3N6PTB4JXhcbiIsCisJCQkJCW5oZHJfcHRyLT5uX25hbWVzeiwgbmhkcl9wdHItPm5fZGVzY3N6KTsKKwkJCQlicmVhazsKKwkJCX0KIAkJCXJlYWxfc3ogKz0gc3o7CiAJCQluaGRyX3B0ciA9IChFbGY2NF9OaGRyKikoKGNoYXIqKW5oZHJfcHRyICsgc3opOwogCQl9CiAJCWtmcmVlKG5vdGVzX3NlY3Rpb24pOwogCQlwaGRyX3B0ci0+cF9tZW1zeiA9IHJlYWxfc3o7CisJCWlmIChyZWFsX3N6ID09IDApIHsKKwkJCXByX3dhcm4oIldhcm5pbmc6IFplcm8gUFRfTk9URSBlbnRyaWVzIGZvdW5kXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02NDgsMTcgKzY1NSwyNCBAQAogCQkJcmV0dXJuIHJjOwogCQl9CiAJCW5oZHJfcHRyID0gbm90ZXNfc2VjdGlvbjsKLQkJd2hpbGUgKHJlYWxfc3ogPCBtYXhfc3opIHsKLQkJCWlmIChuaGRyX3B0ci0+bl9uYW1lc3ogPT0gMCkKLQkJCQlicmVhazsKKwkJd2hpbGUgKG5oZHJfcHRyLT5uX25hbWVzeiAhPSAwKSB7CiAJCQlzeiA9IHNpemVvZihFbGYzMl9OaGRyKSArCiAJCQkJKChuaGRyX3B0ci0+bl9uYW1lc3ogKyAzKSAmIH4zKSArCiAJCQkJKChuaGRyX3B0ci0+bl9kZXNjc3ogKyAzKSAmIH4zKTsKKwkJCWlmICgocmVhbF9zeiArIHN6KSA+IG1heF9zeikgeworCQkJCXByX3dhcm4oIldhcm5pbmc6IEV4Y2VlZGVkIHBfbWVtc3osIGRyb3BwaW5nIFBUX05PVEUgZW50cnkgbl9uYW1lc3o9MHgleCwgbl9kZXNjc3o9MHgleFxuIiwKKwkJCQkJbmhkcl9wdHItPm5fbmFtZXN6LCBuaGRyX3B0ci0+bl9kZXNjc3opOworCQkJCWJyZWFrOworCQkJfQogCQkJcmVhbF9zeiArPSBzejsKIAkJCW5oZHJfcHRyID0gKEVsZjMyX05oZHIqKSgoY2hhciopbmhkcl9wdHIgKyBzeik7CiAJCX0KIAkJa2ZyZWUobm90ZXNfc2VjdGlvbik7CiAJCXBoZHJfcHRyLT5wX21lbXN6ID0gcmVhbF9zejsKKwkJaWYgKHJlYWxfc3ogPT0gMCkgeworCQkJcHJfd2FybigiV2FybmluZzogWmVybyBQVF9OT1RFIGVudHJpZXMgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCAxMTkzZmZkLi5lZGM1NzQ2IDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC05NjQsOSArOTY0LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1DT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHJlYWR2LCB1bnNpZ25lZCBsb25nLCBmZCwKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMocmVhZHYsIGNvbXBhdF91bG9uZ190LCBmZCwKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCi0JCXVuc2lnbmVkIGxvbmcsIHZsZW4pCisJCWNvbXBhdF91bG9uZ190LCB2bGVuKQogewogCXN0cnVjdCBmZCBmID0gZmRnZXQoZmQpOwogCXNzaXplX3QgcmV0OwpAQCAtMTAwMSw5ICsxMDAxLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1DT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHByZWFkdiwgdW5zaWduZWQgbG9uZywgZmQsCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHByZWFkdiwgY29tcGF0X3Vsb25nX3QsIGZkLAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKLQkJdW5zaWduZWQgbG9uZywgdmxlbiwgdTMyLCBwb3NfbG93LCB1MzIsIHBvc19oaWdoKQorCQljb21wYXRfdWxvbmdfdCwgdmxlbiwgdTMyLCBwb3NfbG93LCB1MzIsIHBvc19oaWdoKQogewogCWxvZmZfdCBwb3MgPSAoKGxvZmZfdClwb3NfaGlnaCA8PCAzMikgfCBwb3NfbG93OwogCXJldHVybiBjb21wYXRfc3lzX3ByZWFkdjY0KGZkLCB2ZWMsIHZsZW4sIHBvcyk7CkBAIC0xMDMxLDkgKzEwMzEsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLUNPTVBBVF9TWVNDQUxMX0RFRklORTMod3JpdGV2LCB1bnNpZ25lZCBsb25nLCBmZCwKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMod3JpdGV2LCBjb21wYXRfdWxvbmdfdCwgZmQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosIHZlYywKLQkJdW5zaWduZWQgbG9uZywgdmxlbikKKwkJY29tcGF0X3Vsb25nX3QsIHZsZW4pCiB7CiAJc3RydWN0IGZkIGYgPSBmZGdldChmZCk7CiAJc3NpemVfdCByZXQ7CkBAIC0xMDY4LDkgKzEwNjgsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLUNPTVBBVF9TWVNDQUxMX0RFRklORTUocHdyaXRldiwgdW5zaWduZWQgbG9uZywgZmQsCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHB3cml0ZXYsIGNvbXBhdF91bG9uZ190LCBmZCwKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKix2ZWMsCi0JCXVuc2lnbmVkIGxvbmcsIHZsZW4sIHUzMiwgcG9zX2xvdywgdTMyLCBwb3NfaGlnaCkKKwkJY29tcGF0X3Vsb25nX3QsIHZsZW4sIHUzMiwgcG9zX2xvdywgdTMyLCBwb3NfaGlnaCkKIHsKIAlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcG9zX2hpZ2ggPDwgMzIpIHwgcG9zX2xvdzsKIAlyZXR1cm4gY29tcGF0X3N5c19wd3JpdGV2NjQoZmQsIHZlYywgdmxlbiwgcG9zKTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IGNlY2Q3ODAuLjgwZDVjZjIgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtNzAzLDcgKzcwMyw2IEBACiAJaWYgKGZsYWdzICYgTVNfUkRPTkxZKQogCQlhY2N0X2F1dG9fY2xvc2Uoc2IpOwogCXNocmlua19kY2FjaGVfc2Ioc2IpOwotCXN5bmNfZmlsZXN5c3RlbShzYik7CiAKIAlyZW1vdW50X3JvID0gKGZsYWdzICYgTVNfUkRPTkxZKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKIApAQCAtNzIwLDYgKzcxOSw4IEBACiAJCX0KIAl9CiAKKwlzeW5jX2ZpbGVzeXN0ZW0oc2IpOworCiAJaWYgKHNiLT5zX29wLT5yZW1vdW50X2ZzKSB7CiAJCXJldHZhbCA9IHNiLT5zX29wLT5yZW1vdW50X2ZzKHNiLCAmZmxhZ3MsIGRhdGEpOwogCQlpZiAocmV0dmFsKSB7CmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggZjE1NTM3NC4uZThiYTAyNCAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtMjIyLDIzICsyMjIsNiBAQAogCXJldHVybiBkb19mc3luYyhmZCwgMSk7CiB9CiAKLS8qKgotICogZ2VuZXJpY193cml0ZV9zeW5jIC0gcGVyZm9ybSBzeW5jaW5nIGFmdGVyIGEgd3JpdGUgaWYgZmlsZSAvIGlub2RlIGlzIHN5bmMKLSAqIEBmaWxlOglmaWxlIHRvIHdoaWNoIHRoZSB3cml0ZSBoYXBwZW5lZAotICogQHBvczoJb2Zmc2V0IHdoZXJlIHRoZSB3cml0ZSBzdGFydGVkCi0gKiBAY291bnQ6CWxlbmd0aCBvZiB0aGUgd3JpdGUKLSAqCi0gKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgd3JhcHBlciBhYm91dCBvdXIgZ2VuZXJhbCBzeW5jaW5nIGZ1bmN0aW9uLgotICovCi1pbnQgZ2VuZXJpY193cml0ZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpCi17Ci0JaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpICYmICFJU19TWU5DKGZpbGUtPmZfbWFwcGluZy0+aG9zdCkpCi0JCXJldHVybiAwOwotCXJldHVybiB2ZnNfZnN5bmNfcmFuZ2UoZmlsZSwgcG9zLCBwb3MgKyBjb3VudCAtIDEsCi0JCQkgICAgICAgKGZpbGUtPmZfZmxhZ3MgJiBfX09fU1lOQykgPyAwIDogMSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdlbmVyaWNfd3JpdGVfc3luYyk7Ci0KIC8qCiAgKiBzeXNfc3luY19maWxlX3JhbmdlKCkgcGVybWl0cyBmaW5lbHkgY29udHJvbGxlZCBzeW5jaW5nIG92ZXIgYSBzZWdtZW50IG9mCiAgKiBhIGZpbGUgaW4gdGhlIHJhbmdlIG9mZnNldCAuLiAob2Zmc2V0K25ieXRlcy0xKSBpbmNsdXNpdmUuICBJZiBuYnl0ZXMgaXMKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5jIGIvZnMveGZzL3hmc19hb3BzLmMKaW5kZXggYTI2NzM5NC4uZGIyY2ZiMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hb3BzLmMKKysrIGIvZnMveGZzL3hmc19hb3BzLmMKQEAgLTQwNyw3ICs0MDcsNyBAQAogCXN0cnVjdCBiaW8JCSpiaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG52ZWNzKTsKIAogCUFTU0VSVChiaW8tPmJpX3ByaXZhdGUgPT0gTlVMTCk7Ci0JYmlvLT5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKIAliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwogCXJldHVybiBiaW87CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zi5jIGIvZnMveGZzL3hmc19idWYuYwppbmRleCA1MTc1NzExLi45YzA2MWVmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmLmMKQEAgLTEyNDAsNyArMTI0MCw3IEBACiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG5yX3BhZ2VzKTsKIAliaW8tPmJpX2JkZXYgPSBicC0+Yl90YXJnZXQtPmJ0X2JkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CisJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKIAliaW8tPmJpX2VuZF9pbyA9IHhmc19idWZfYmlvX2VuZF9pbzsKIAliaW8tPmJpX3ByaXZhdGUgPSBicDsKIApAQCAtMTI2Miw3ICsxMjYyLDcgQEAKIAkJdG90YWxfbnJfcGFnZXMtLTsKIAl9CiAKLQlpZiAobGlrZWx5KGJpby0+Ymlfc2l6ZSkpIHsKKwlpZiAobGlrZWx5KGJpby0+YmlfaXRlci5iaV9zaXplKSkgewogCQlpZiAoeGZzX2J1Zl9pc192bWFwcGVkKGJwKSkgewogCQkJZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UoYnAtPmJfYWRkciwKIAkJCQkJCXhmc19idWZfdm1hcF9sZW4oYnApKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZS5jIGIvZnMveGZzL3hmc19maWxlLmMKaW5kZXggMmU3OTg5ZS4uNjRiNDhlYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlLmMKKysrIGIvZnMveGZzL3hmc19maWxlLmMKQEAgLTc5OSw3ICs3OTksNyBAQAogCQlYRlNfU1RBVFNfQUREKHhzX3dyaXRlX2J5dGVzLCByZXQpOwogCiAJCS8qIEhhbmRsZSB2YXJpb3VzIFNZTkMtdHlwZSB3cml0ZXMgKi8KLQkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIHBvcywgcmV0KTsKKwkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIGlvY2ItPmtpX3BvcyAtIHJldCwgcmV0KTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXQgPSBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCmluZGV4IGQyZjE2ZjEuLmZlYTY3NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKQEAgLTc3LDcgKzc3LDcgQEAKIGV4dGVybiB1OCBhY3BpX2dibF9kaXNhYmxlX2F1dG9fcmVwYWlyOwogZXh0ZXJuIHU4IGFjcGlfZ2JsX2Rpc2FibGVfc3NkdF90YWJsZV9sb2FkOwogZXh0ZXJuIHU4IGFjcGlfZ2JsX2RvX25vdF91c2VfeHNkdDsKLWV4dGVybiBib29sIGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0OworZXh0ZXJuIHU4IGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0OwogZXh0ZXJuIHU4IGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjazsKIGV4dGVybiB1MzIgYWNwaV9nYmxfdHJhY2VfZmxhZ3M7CiBleHRlcm4gYWNwaV9uYW1lIGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtUC5oIGIvaW5jbHVkZS9kcm0vZHJtUC5oCmluZGV4IDFkNGE5MjAuLjA0MDg2YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybVAuaAorKysgYi9pbmNsdWRlL2RybS9kcm1QLmgKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CS8qIEZvciBwdGVfd3Jwcm90ZWN0ICovCiAjZW5kaWYKQEAgLTEzNiw3ICsxMzcsNiBAQAogCiAvKiBkcml2ZXIgY2FwYWJpbGl0aWVzIGFuZCByZXF1aXJlbWVudHMgbWFzayAqLwogI2RlZmluZSBEUklWRVJfVVNFX0FHUCAgICAgMHgxCi0jZGVmaW5lIERSSVZFUl9SRVFVSVJFX0FHUCAweDIKICNkZWZpbmUgRFJJVkVSX1BDSV9ETUEgICAgIDB4OAogI2RlZmluZSBEUklWRVJfU0cgICAgICAgICAgMHgxMAogI2RlZmluZSBEUklWRVJfSEFWRV9ETUEgICAgMHgyMApAQCAtMTgwLDYgKzE4MCwyMiBAQAogI2RlZmluZSBEUk1fRVJST1IoZm10LCAuLi4pCQkJCVwKIAlkcm1fZXJyKF9fZnVuY19fLCBmbXQsICMjX19WQV9BUkdTX18pCiAKKy8qKgorICogUmF0ZSBsaW1pdGVkIGVycm9yIG91dHB1dC4gIExpa2UgRFJNX0VSUk9SKCkgYnV0IHdvbid0IGZsb29kIHRoZSBsb2cuCisgKgorICogXHBhcmFtIGZtdCBwcmludGYoKSBsaWtlIGZvcm1hdCBzdHJpbmcuCisgKiBccGFyYW0gYXJnIGFyZ3VtZW50cworICovCisjZGVmaW5lIERSTV9FUlJPUl9SQVRFTElNSVRFRChmbXQsIC4uLikJCQkJXAorKHsJCQkJCQkJCQlcCisJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUoX3JzLAkJCQlcCisJCQkJICAgICAgREVGQVVMVF9SQVRFTElNSVRfSU5URVJWQUwsCVwKKwkJCQkgICAgICBERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCk7CQlcCisJCQkJCQkJCQlcCisJaWYgKF9fcmF0ZWxpbWl0KCZfcnMpKQkJCQkJCVwKKwkJZHJtX2VycihfX2Z1bmNfXywgZm10LCAjI19fVkFfQVJHU19fKTsJCQlcCit9KQorCiAjZGVmaW5lIERSTV9JTkZPKGZtdCwgLi4uKQkJCQlcCiAJcHJpbnRrKEtFUk5fSU5GTyAiWyIgRFJNX05BTUUgIl0gIiBmbXQsICMjX19WQV9BUkdTX18pCiAKQEAgLTQyMiw3ICs0MzgsNiBAQAogCXN0cnVjdCBwaWQgKnBpZDsKIAlrdWlkX3QgdWlkOwogCWRybV9tYWdpY190IG1hZ2ljOwotCXVuc2lnbmVkIGxvbmcgaW9jdGxfY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaGVhZDsKIAlzdHJ1Y3QgZHJtX21pbm9yICptaW5vcjsKIAl1bnNpZ25lZCBsb25nIGxvY2tfY291bnQ7CkBAIC01MTEsNyArNTI2LDcgQEAKICAqLwogc3RydWN0IGRybV9hZ3BfbWVtIHsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJCS8qKjwgaGFuZGxlICovCi0JRFJNX0FHUF9NRU0gKm1lbW9yeTsKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OwogCXVuc2lnbmVkIGxvbmcgYm91bmQ7CQkvKio8IGFkZHJlc3MgKi8KIAlpbnQgcGFnZXM7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwpAQCAtNTIzLDcgKzUzOCw3IEBACiAgKiBcc2EgZHJtX2FncF9pbml0KCkgYW5kIGRybV9kZXZpY2U6OmFncC4KICAqLwogc3RydWN0IGRybV9hZ3BfaGVhZCB7Ci0JRFJNX0FHUF9LRVJOIGFncF9pbmZvOwkJLyoqPCBBR1AgZGV2aWNlIGluZm9ybWF0aW9uICovCisJc3RydWN0IGFncF9rZXJuX2luZm8gYWdwX2luZm87CQkvKio8IEFHUCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CQkvKio8IEFHUCBtb2RlICovCiAJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOwpAQCAtNjA3LDEzICs2MjIsNiBAQAogfTsKIAogLyoqCi0gKiBHRU0gc3BlY2lmaWMgbW0gcHJpdmF0ZSBmb3IgdHJhY2tpbmcgR0VNIG9iamVjdHMKLSAqLwotc3RydWN0IGRybV9nZW1fbW0gewotCXN0cnVjdCBkcm1fdm1hX29mZnNldF9tYW5hZ2VyIHZtYV9tYW5hZ2VyOwotfTsKLQotLyoqCiAgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkcm1fbW0gbWVtb3J5IG9iamVjdCwgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IHRoZQogICogRFJNIGZvciBpdHMgYnVmZmVyIG9iamVjdHMuCiAgKi8KQEAgLTc1MCwxMCArNzU4LDYgQEAKIAlpbnQgKCpzZXRfdW5pcXVlKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLAogCQkJICBzdHJ1Y3QgZHJtX3VuaXF1ZSAqdW5pcXVlKTsKIAlpbnQgKCppcnFfYnlfYnVzaWQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKTsKLQkvKiBob29rcyB0aGF0IGFyZSBmb3IgUENJICovCi0JaW50ICgqYWdwX2luaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCXZvaWQgKCphZ3BfZGVzdHJveSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0KIH07CiAKIC8qKgpAQCAtODQxLDYgKzg0NSw3IEBACiAJICoKIAkgKiBccGFyYW0gZGV2ICBEUk0gZGV2aWNlLgogCSAqIFxwYXJhbSBjcnRjIElkIG9mIHRoZSBjcnRjIHRvIHF1ZXJ5LgorCSAqIFxwYXJhbSBmbGFncyBGbGFncyBmcm9tIHRoZSBjYWxsZXIgKERSTV9DQUxMRURfRlJPTV9WQkxJUlEgb3IgMCkuCiAJICogXHBhcmFtICp2cG9zIFRhcmdldCBsb2NhdGlvbiBmb3IgY3VycmVudCB2ZXJ0aWNhbCBzY2Fub3V0IHBvc2l0aW9uLgogCSAqIFxwYXJhbSAqaHBvcyBUYXJnZXQgbG9jYXRpb24gZm9yIGN1cnJlbnQgaG9yaXpvbnRhbCBzY2Fub3V0IHBvc2l0aW9uLgogCSAqIFxwYXJhbSAqc3RpbWUgVGFyZ2V0IGxvY2F0aW9uIGZvciB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlCkBAIC04NjMsNiArODY4LDcgQEAKIAkgKgogCSAqLwogCWludCAoKmdldF9zY2Fub3V0X3Bvc2l0aW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcywga3RpbWVfdCAqc3RpbWUsCiAJCQkJICAgICBrdGltZV90ICpldGltZSk7CiAKQEAgLTkwMyw3ICs5MDksNyBAQAogCiAJLyogdGhlc2UgaGF2ZSB0byBiZSBmaWxsZWQgaW4gKi8KIAotCWlycXJldHVybl90KCppcnFfaGFuZGxlcikgKERSTV9JUlFfQVJHUyk7CisJaXJxcmV0dXJuX3QoKmlycV9oYW5kbGVyKSAoaW50IGlycSwgdm9pZCAqYXJnKTsKIAl2b2lkICgqaXJxX3ByZWluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAlpbnQgKCppcnFfcG9zdGluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqaXJxX3VuaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtOTk1LDggKzEwMDEsOCBAQAogCX0ga2RyaXZlcjsKIAlzdHJ1Y3QgZHJtX2J1cyAqYnVzOwogCi0JLyogTGlzdCBvZiBkZXZpY2VzIGhhbmdpbmcgb2ZmIHRoaXMgZHJpdmVyICovCi0Jc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VfbGlzdDsKKwkvKiBMaXN0IG9mIGRldmljZXMgaGFuZ2luZyBvZmYgdGhpcyBkcml2ZXIgd2l0aCBzdGVhbHRoIGF0dGFjaC4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxlZ2FjeV9kZXZfbGlzdDsKIH07CiAKICNkZWZpbmUgRFJNX01JTk9SX1VOQVNTSUdORUQgMApAQCAtMTA4NSw3ICsxMDkxLDcgQEAKICAqIG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLgogICovCiBzdHJ1Y3QgZHJtX2RldmljZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkcml2ZXJfaXRlbTsJLyoqPCBsaXN0IG9mIGRldmljZXMgcGVyIGRyaXZlciAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGVnYWN5X2Rldl9saXN0Oy8qKjwgbGlzdCBvZiBkZXZpY2VzIHBlciBkcml2ZXIgZm9yIHN0ZWFsdGggYXR0YWNoIGNsZWFudXAgKi8KIAljaGFyICpkZXZuYW1lOwkJCS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KIAlpbnQgaWZfdmVyc2lvbjsJCQkvKio8IEhpZ2hlc3QgaW50ZXJmYWNlIHZlcnNpb24gc2V0ICovCiAKQEAgLTEwOTgsOCArMTEwNCw2IEBACiAJLyoqIFxuYW1lIFVzYWdlIENvdW50ZXJzICovCiAJLypAeyAqLwogCWludCBvcGVuX2NvdW50OwkJCS8qKjwgT3V0c3RhbmRpbmcgZmlsZXMgb3BlbiAqLwotCWF0b21pY190IGlvY3RsX2NvdW50OwkJLyoqPCBPdXRzdGFuZGluZyBJT0NUTHMgcGVuZGluZyAqLwotCWF0b21pY190IHZtYV9jb3VudDsJCS8qKjwgT3V0c3RhbmRpbmcgdm1hIGFyZWFzIG9wZW4gKi8KIAlpbnQgYnVmX3VzZTsJCQkvKio8IEJ1ZmZlcnMgaW4gdXNlIC0tIGNhbm5vdCBhbGxvYyAqLwogCWF0b21pY190IGJ1Zl9hbGxvYzsJCS8qKjwgQnVmZmVyIGFsbG9jYXRpb24gaW4gcHJvZ3Jlc3MgKi8KIAkvKkB9ICovCkBAIC0xMTc2LDcgKzExODAsNiBAQAogCXN0cnVjdCBkcm1fc2dfbWVtICpzZzsJLyoqPCBTY2F0dGVyIGdhdGhlciBtZW1vcnkgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX2NydGNzOyAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENSVENzIG9uIHRoaXMgZGV2aWNlICovCiAJdm9pZCAqZGV2X3ByaXZhdGU7CQkvKio8IGRldmljZSBwcml2YXRlIGRhdGEgKi8KLQl2b2lkICptbV9wcml2YXRlOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpkZXZfbWFwcGluZzsKIAlzdHJ1Y3QgZHJtX3NpZ2RhdGEgc2lnZGF0YTsJICAgLyoqPCBGb3IgYmxvY2tfYWxsX3NpZ25hbHMgKi8KIAlzaWdzZXRfdCBzaWdtYXNrOwpAQCAtMTE5NCw2ICsxMTk3LDcgQEAKIAkvKkB7ICovCiAJc3RydWN0IG11dGV4IG9iamVjdF9uYW1lX2xvY2s7CiAJc3RydWN0IGlkciBvYmplY3RfbmFtZV9pZHI7CisJc3RydWN0IGRybV92bWFfb2Zmc2V0X21hbmFnZXIgKnZtYV9vZmZzZXRfbWFuYWdlcjsKIAkvKkB9ICovCiAJaW50IHN3aXRjaF9wb3dlcl9zdGF0ZTsKIApAQCAtMTI2OCw2ICsxMjcyLDcgQEAKIAkJCQkvKiBNZW1vcnkgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fbWVtb3J5LmgpICovCiAjaW5jbHVkZSA8ZHJtL2RybV9tZW1vcnkuaD4KIAorCiAJCQkJLyogTWlzYy4gSU9DVEwgc3VwcG9ydCAoZHJtX2lvY3RsLmgpICovCiBleHRlcm4gaW50IGRybV9pcnFfYnlfYnVzaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CkBAIC0xMzk4LDggKzE0MDMsMTAgQEAKIAkJCQkJCSBpbnQgY3J0YywgaW50ICptYXhfZXJyb3IsCiAJCQkJCQkgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAogCQkJCQkJIHVuc2lnbmVkIGZsYWdzLAotCQkJCQkJIHN0cnVjdCBkcm1fY3J0YyAqcmVmY3J0Yyk7Ci1leHRlcm4gdm9pZCBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisJCQkJCQkgY29uc3Qgc3RydWN0IGRybV9jcnRjICpyZWZjcnRjLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwogCiBleHRlcm4gYm9vbAogZHJtX21vZGVfcGFyc2VfY29tbWFuZF9saW5lX2Zvcl9jb25uZWN0b3IoY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCkBAIC0xNDYxLDYgKzE0NjgsMzAgQEAKIGV4dGVybiBpbnQgZHJtX2RlYnVnZnNfcmVtb3ZlX2ZpbGVzKGNvbnN0IHN0cnVjdCBkcm1faW5mb19saXN0ICpmaWxlcywKIAkJCQkgICAgaW50IGNvdW50LCBzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CiBleHRlcm4gaW50IGRybV9kZWJ1Z2ZzX2NsZWFudXAoc3RydWN0IGRybV9taW5vciAqbWlub3IpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGRybV9kZWJ1Z2ZzX2luaXQoc3RydWN0IGRybV9taW5vciAqbWlub3IsIGludCBtaW5vcl9pZCwKKwkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpyb290KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcm1fZGVidWdmc19jcmVhdGVfZmlsZXMoY29uc3Qgc3RydWN0IGRybV9pbmZvX2xpc3QgKmZpbGVzLAorCQkJCQkgICBpbnQgY291bnQsIHN0cnVjdCBkZW50cnkgKnJvb3QsCisJCQkJCSAgIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMoY29uc3Qgc3RydWN0IGRybV9pbmZvX2xpc3QgKmZpbGVzLAorCQkJCQkgICBpbnQgY291bnQsIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcm1fZGVidWdmc19jbGVhbnVwKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKIAkJCQkvKiBJbmZvIGZpbGUgc3VwcG9ydCAqLwpAQCAtMTY0NSw2ICsxNjc2LDcgQEAKIAogCXJldHVybiBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9BR1ApOwogfQordm9pZCBkcm1fcGNpX2FncF9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaW50IGRybV9wY2lfaW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGRyaXZlcik7CiBleHRlcm4gdm9pZCBkcm1fcGNpX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHBjaV9kcml2ZXIgKnBkcml2ZXIpOwpAQCAtMTY2MCw3ICsxNjkyLDYgQEAKIAogLyogcGxhdGZvcm0gc2VjdGlvbiAqLwogZXh0ZXJuIGludCBkcm1fcGxhdGZvcm1faW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2UpOwotZXh0ZXJuIHZvaWQgZHJtX3BsYXRmb3JtX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlKTsKIAogLyogcmV0dXJucyB0cnVlIGlmIGN1cnJlbnRseSBva2F5IHRvIHNsZWVwICovCiBzdGF0aWMgX19pbmxpbmVfXyBib29sIGRybV9jYW5fc2xlZXAodm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9hZ3BzdXBwb3J0LmggYi9pbmNsdWRlL2RybS9kcm1fYWdwc3VwcG9ydC5oCmluZGV4IGExODRlZWUuLjg2YTAyMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9hZ3BzdXBwb3J0LmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2FncHN1cHBvcnQuaApAQCAtMTAsMTcgKzEwLDE2IEBACiAKICNpZiBfX09TX0hBU19BR1AKIAotdm9pZCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIGludCBwYWdlcyk7Ci1pbnQgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpOwotaW50IGRybV91bmJpbmRfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlKTsKLURSTV9BR1BfTUVNICpkcm1fYWdwX2JpbmRfcGFnZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKK3ZvaWQgZHJtX2ZyZWVfYWdwKHN0cnVjdCBhZ3BfbWVtb3J5ICogaGFuZGxlLCBpbnQgcGFnZXMpOworaW50IGRybV9iaW5kX2FncChzdHJ1Y3QgYWdwX21lbW9yeSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KTsKK2ludCBkcm1fdW5iaW5kX2FncChzdHJ1Y3QgYWdwX21lbW9yeSAqIGhhbmRsZSk7CitzdHJ1Y3QgYWdwX21lbW9yeSAqZHJtX2FncF9iaW5kX3BhZ2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJCQl1bnNpZ25lZCBsb25nIG51bV9wYWdlcywKIAkJCQl1aW50MzJfdCBndHRfb2Zmc2V0LAogCQkJCXVpbnQzMl90IHR5cGUpOwogCiBzdHJ1Y3QgZHJtX2FncF9oZWFkICpkcm1fYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGRybV9hZ3BfZGVzdHJveShzdHJ1Y3QgZHJtX2FncF9oZWFkICphZ3ApOwogdm9pZCBkcm1fYWdwX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBkcm1fYWdwX2FjcXVpcmVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTQ2LDI5ICs0NSwyMyBAQAogaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGludCBkcm1fYWdwX2JpbmRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKLQotc3RhdGljIGlubGluZSBpbnQgZHJtX2NvcmVfaGFzX0FHUChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXJldHVybiBkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9BR1ApOwotfQotCiAjZWxzZSAvKiBfX09TX0hBU19BR1AgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgaW50IHBhZ2VzKQorc3RhdGljIGlubGluZSB2b2lkIGRybV9mcmVlX2FncChzdHJ1Y3QgYWdwX21lbW9yeSAqIGhhbmRsZSwgaW50IHBhZ2VzKQogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBkcm1fYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkKK3N0YXRpYyBpbmxpbmUgaW50IGRybV9iaW5kX2FncChzdHJ1Y3QgYWdwX21lbW9yeSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQogewogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgaW50IGRybV91bmJpbmRfYWdwKHN0cnVjdCBhZ3BfbWVtb3J5ICogaGFuZGxlKQogewogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW5saW5lIERSTV9BR1BfTUVNICpkcm1fYWdwX2JpbmRfcGFnZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFncF9tZW1vcnkgKmRybV9hZ3BfYmluZF9wYWdlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG51bV9wYWdlcywKIAkJCQkJICAgICAgdWludDMyX3QgZ3R0X29mZnNldCwKQEAgLTgyLDEwICs3NSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcm1fYWdwX2Rlc3Ryb3koc3RydWN0IGRybV9hZ3BfaGVhZCAqYWdwKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJtX2FncF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogfQpAQCAtMTgzLDEyICsxNzIsNiBAQAogewogCXJldHVybiAtRU5PREVWOwogfQotCi1zdGF0aWMgaW5saW5lIGludCBkcm1fY29yZV9oYXNfQUdQKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KICNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KIAogI2VuZGlmIC8qIF9EUk1fQUdQU1VQUE9SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKaW5kZXggZjMyYzVjZC4uNzE3MjdiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbWkuaD4KICNpbmNsdWRlIDxkcm0vZHJtX21vZGUuaD4KIAogI2luY2x1ZGUgPGRybS9kcm1fZm91cmNjLmg+CkBAIC0xODEsNiArMTgyLDcgQEAKIAogCWludCB2cmVmcmVzaDsJCS8qIGluIEh6ICovCiAJaW50IGhzeW5jOwkJLyogaW4ga0h6ICovCisJZW51bSBoZG1pX3BpY3R1cmVfYXNwZWN0IHBpY3R1cmVfYXNwZWN0X3JhdGlvOwogfTsKIAogc3RhdGljIGlubGluZSBib29sIGRybV9tb2RlX2lzX3N0ZXJlbyhjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKQEAgLTQ0Nyw3ICs0NDksNyBAQAogCXVpbnQxNl90ICpnYW1tYV9zdG9yZTsKIAogCS8qIENvbnN0YW50cyBuZWVkZWQgZm9yIHByZWNpc2UgdmJsYW5rIGFuZCBzd2FwIHRpbWVzdGFtcGluZy4gKi8KLQlzNjQgZnJhbWVkdXJfbnMsIGxpbmVkdXJfbnMsIHBpeGVsZHVyX25zOworCWludCBmcmFtZWR1cl9ucywgbGluZWR1cl9ucywgcGl4ZWxkdXJfbnM7CiAKIAkvKiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBoZWxwZXIgKi8KIAl2b2lkICpoZWxwZXJfcHJpdmF0ZTsKQEAgLTkyOSw2ICs5MzEsMTkgQEAKIAkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzICpmdW5jcyk7CiBleHRlcm4gdm9pZCBkcm1fY3J0Y19jbGVhbnVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitleHRlcm4gdW5zaWduZWQgaW50IGRybV9jcnRjX2luZGV4KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisKKy8qKgorICogZHJtX2NydGNfbWFzayAtIGZpbmQgdGhlIG1hc2sgb2YgYSByZWdpc3RlcmVkIENSVEMKKyAqIEBjcnRjOiBDUlRDIHRvIGZpbmQgbWFzayBmb3IKKyAqCisgKiBHaXZlbiBhIHJlZ2lzdGVyZWQgQ1JUQywgcmV0dXJuIHRoZSBtYXNrIGJpdCBvZiB0aGF0IENSVEMgZm9yIGFuCisgKiBlbmNvZGVyJ3MgcG9zc2libGVfY3J0Y3MgZmllbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZHJtX2NydGNfbWFzayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJcmV0dXJuIDEgPDwgZHJtX2NydGNfaW5kZXgoY3J0Yyk7Cit9CiAKIGV4dGVybiB2b2lkIGRybV9jb25uZWN0b3JfaWRhX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBkcm1fY29ubmVjdG9yX2lkYV9kZXN0cm95KHZvaWQpOwpAQCAtOTUwLDYgKzk2NSwxOSBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyAqZnVuY3MsCiAJCQkgICAgaW50IGVuY29kZXJfdHlwZSk7CiAKKy8qKgorICogZHJtX2VuY29kZXJfY3J0Y19vayAtIGNhbiBhIGdpdmVuIGNydGMgZHJpdmUgYSBnaXZlbiBlbmNvZGVyPworICogQGVuY29kZXI6IGVuY29kZXIgdG8gdGVzdAorICogQGNydGM6IGNydGMgdG8gdGVzdAorICoKKyAqIFJldHVybiBmYWxzZSBpZiBAZW5jb2RlciBjYW4ndCBiZSBkcml2ZW4gYnkgQGNydGMsIHRydWUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgZHJtX2VuY29kZXJfY3J0Y19vayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlyZXR1cm4gISEoZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgJiBkcm1fY3J0Y19tYXNrKGNydGMpKTsKK30KKwogZXh0ZXJuIGludCBkcm1fcGxhbmVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKIAkJCSAgdW5zaWduZWQgbG9uZyBwb3NzaWJsZV9jcnRjcywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKaW5kZXggZWY2YWQzYS4uYjEzODhiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKQEAgLTEyMCw4ICsxMjAsOCBAQAogICovCiBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgewogCWludCAoKmdldF9tb2Rlcykoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Ci0JaW50ICgqbW9kZV92YWxpZCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworCWVudW0gZHJtX21vZGVfc3RhdHVzICgqbW9kZV92YWxpZCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqKCpiZXN0X2VuY29kZXIpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCmluZGV4IGE5MmMzNzUuLjFkMDkwNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKQEAgLTQxLDIyICs0MSwyMiBAQAogICogMS4yIGZvcm1hbGx5IGluY2x1ZGVzIGJvdGggZURQIGFuZCBEUEkgZGVmaW5pdGlvbnMuCiAgKi8KIAotI2RlZmluZSBBVVhfTkFUSVZFX1dSSVRFCTB4OAotI2RlZmluZSBBVVhfTkFUSVZFX1JFQUQJCTB4OQotI2RlZmluZSBBVVhfSTJDX1dSSVRFCQkweDAKLSNkZWZpbmUgQVVYX0kyQ19SRUFECQkweDEKLSNkZWZpbmUgQVVYX0kyQ19TVEFUVVMJCTB4MgotI2RlZmluZSBBVVhfSTJDX01PVAkJMHg0CisjZGVmaW5lIERQX0FVWF9JMkNfV1JJVEUJCTB4MAorI2RlZmluZSBEUF9BVVhfSTJDX1JFQUQJCQkweDEKKyNkZWZpbmUgRFBfQVVYX0kyQ19TVEFUVVMJCTB4MgorI2RlZmluZSBEUF9BVVhfSTJDX01PVAkJCTB4NAorI2RlZmluZSBEUF9BVVhfTkFUSVZFX1dSSVRFCQkweDgKKyNkZWZpbmUgRFBfQVVYX05BVElWRV9SRUFECQkweDkKIAotI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX0FDSwkoMHgwIDw8IDQpCi0jZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfTkFDSwkoMHgxIDw8IDQpCi0jZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfREVGRVIJKDB4MiA8PCA0KQotI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX01BU0sJKDB4MyA8PCA0KQorI2RlZmluZSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSwkJKDB4MCA8PCAwKQorI2RlZmluZSBEUF9BVVhfTkFUSVZFX1JFUExZX05BQ0sJKDB4MSA8PCAwKQorI2RlZmluZSBEUF9BVVhfTkFUSVZFX1JFUExZX0RFRkVSCSgweDIgPDwgMCkKKyNkZWZpbmUgRFBfQVVYX05BVElWRV9SRVBMWV9NQVNLCSgweDMgPDwgMCkKIAotI2RlZmluZSBBVVhfSTJDX1JFUExZX0FDSwkoMHgwIDw8IDYpCi0jZGVmaW5lIEFVWF9JMkNfUkVQTFlfTkFDSwkoMHgxIDw8IDYpCi0jZGVmaW5lIEFVWF9JMkNfUkVQTFlfREVGRVIJKDB4MiA8PCA2KQotI2RlZmluZSBBVVhfSTJDX1JFUExZX01BU0sJKDB4MyA8PCA2KQorI2RlZmluZSBEUF9BVVhfSTJDX1JFUExZX0FDSwkJKDB4MCA8PCAyKQorI2RlZmluZSBEUF9BVVhfSTJDX1JFUExZX05BQ0sJCSgweDEgPDwgMikKKyNkZWZpbmUgRFBfQVVYX0kyQ19SRVBMWV9ERUZFUgkJKDB4MiA8PCAyKQorI2RlZmluZSBEUF9BVVhfSTJDX1JFUExZX01BU0sJCSgweDMgPDwgMikKIAogLyogQVVYIENIIGFkZHJlc3NlcyAqLwogLyogRFBDRCAqLwpAQCAtMjY2LDkgKzI2NiwxMCBAQAogCiAjZGVmaW5lIERQX1RFU1RfUkVRVUVTVAkJCSAgICAweDIxOAogIyBkZWZpbmUgRFBfVEVTVF9MSU5LX1RSQUlOSU5HCQkgICAgKDEgPDwgMCkKLSMgZGVmaW5lIERQX1RFU1RfTElOS19QQVRURVJOCQkgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX1RFU1RfTElOS19WSURFT19QQVRURVJOCSAgICAoMSA8PCAxKQogIyBkZWZpbmUgRFBfVEVTVF9MSU5LX0VESURfUkVBRAkJICAgICgxIDw8IDIpCiAjIGRlZmluZSBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVSTgkgICAgKDEgPDwgMykgLyogRFBDRCA+PSAxLjEgKi8KKyMgZGVmaW5lIERQX1RFU1RfTElOS19GQVVYX1BBVFRFUk4JICAgICgxIDw8IDQpIC8qIERQQ0QgPj0gMS4yICovCiAKICNkZWZpbmUgRFBfVEVTVF9MSU5LX1JBVEUJCSAgICAweDIxOQogIyBkZWZpbmUgRFBfTElOS19SQVRFXzE2MgkJICAgICgweDYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fbWlwaV9kc2kuaCBiL2luY2x1ZGUvZHJtL2RybV9taXBpX2RzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjYyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fbWlwaV9kc2kuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIE1JUEkgRFNJIEJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzLCBTYW1zdW5nIEVsZWN0cm9uaWNzLCBDby4sIEx0ZC4KKyAqIEFuZHJ6ZWogSGFqZGEgPGEuaGFqZGFAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fRFJNX01JUElfRFNJX0hfXworI2RlZmluZSBfX0RSTV9NSVBJX0RTSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCitzdHJ1Y3QgbWlwaV9kc2lfaG9zdDsKK3N0cnVjdCBtaXBpX2RzaV9kZXZpY2U7CisKKy8qKgorICogc3RydWN0IG1pcGlfZHNpX21zZyAtIHJlYWQvd3JpdGUgRFNJIGJ1ZmZlcgorICogQGNoYW5uZWw6IHZpcnR1YWwgY2hhbm5lbCBpZAorICogQHR5cGU6IHBheWxvYWQgZGF0YSB0eXBlCisgKiBAdHhfbGVuOiBsZW5ndGggb2YgQHR4X2J1ZgorICogQHR4X2J1ZjogZGF0YSB0byBiZSB3cml0dGVuCisgKiBAcnhfbGVuOiBsZW5ndGggb2YgQHJ4X2J1ZgorICogQHJ4X2J1ZjogZGF0YSB0byBiZSByZWFkLCBvciBOVUxMCisgKi8KK3N0cnVjdCBtaXBpX2RzaV9tc2cgeworCXU4IGNoYW5uZWw7CisJdTggdHlwZTsKKworCXNpemVfdCB0eF9sZW47CisJY29uc3Qgdm9pZCAqdHhfYnVmOworCisJc2l6ZV90IHJ4X2xlbjsKKwl2b2lkICpyeF9idWY7Cit9OworCisvKioKKyAqIHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyAtIERTSSBidXMgb3BlcmF0aW9ucworICogQGF0dGFjaDogYXR0YWNoIERTSSBkZXZpY2UgdG8gRFNJIGhvc3QKKyAqIEBkZXRhY2g6IGRldGFjaCBEU0kgZGV2aWNlIGZyb20gRFNJIGhvc3QKKyAqIEB0cmFuc2Zlcjogc2VuZCBhbmQvb3IgcmVjZWl2ZSBEU0kgcGFja2V0LCByZXR1cm4gbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzLAorICogCSAgICAgIG9yIGVycm9yCisgKi8KK3N0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyB7CisJaW50ICgqYXR0YWNoKShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKKwkJICAgICAgc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKTsKKwlpbnQgKCpkZXRhY2gpKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkgICAgICBzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kpOworCXNzaXplX3QgKCp0cmFuc2Zlcikoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCisJCQkgICAgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKTsKK307CisKKy8qKgorICogc3RydWN0IG1pcGlfZHNpX2hvc3QgLSBEU0kgaG9zdCBkZXZpY2UKKyAqIEBkZXY6IGRyaXZlciBtb2RlbCBkZXZpY2Ugbm9kZSBmb3IgdGhpcyBEU0kgaG9zdAorICogQG9wczogRFNJIGhvc3Qgb3BlcmF0aW9ucworICovCitzdHJ1Y3QgbWlwaV9kc2lfaG9zdCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyAqb3BzOworfTsKKworaW50IG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpOwordm9pZCBtaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpOworCisvKiBEU0kgbW9kZSBmbGFncyAqLworCisvKiB2aWRlbyBtb2RlICovCisjZGVmaW5lIE1JUElfRFNJX01PREVfVklERU8JCUJJVCgwKQorLyogdmlkZW8gYnVyc3QgbW9kZSAqLworI2RlZmluZSBNSVBJX0RTSV9NT0RFX1ZJREVPX0JVUlNUCUJJVCgxKQorLyogdmlkZW8gcHVsc2UgbW9kZSAqLworI2RlZmluZSBNSVBJX0RTSV9NT0RFX1ZJREVPX1NZTkNfUFVMU0UJQklUKDIpCisvKiBlbmFibGUgYXV0byB2ZXJ0aWNhbCBjb3VudCBtb2RlICovCisjZGVmaW5lIE1JUElfRFNJX01PREVfVklERU9fQVVUT19WRVJUCUJJVCgzKQorLyogZW5hYmxlIGhzeW5jLWVuZCBwYWNrZXRzIGluIHZzeW5jLXB1bHNlIGFuZCB2LXBvcmNoIGFyZWEgKi8KKyNkZWZpbmUgTUlQSV9EU0lfTU9ERV9WSURFT19IU0UJCUJJVCg0KQorLyogZGlzYWJsZSBoZnJvbnQtcG9yY2ggYXJlYSAqLworI2RlZmluZSBNSVBJX0RTSV9NT0RFX1ZJREVPX0hGUAkJQklUKDUpCisvKiBkaXNhYmxlIGhiYWNrLXBvcmNoIGFyZWEgKi8KKyNkZWZpbmUgTUlQSV9EU0lfTU9ERV9WSURFT19IQlAJCUJJVCg2KQorLyogZGlzYWJsZSBoc3luYy1hY3RpdmUgYXJlYSAqLworI2RlZmluZSBNSVBJX0RTSV9NT0RFX1ZJREVPX0hTQQkJQklUKDcpCisvKiBmbHVzaCBkaXNwbGF5IEZJRk8gb24gdnN5bmMgcHVsc2UgKi8KKyNkZWZpbmUgTUlQSV9EU0lfTU9ERV9WU1lOQ19GTFVTSAlCSVQoOCkKKy8qIGRpc2FibGUgRW9UIHBhY2tldHMgaW4gSFMgbW9kZSAqLworI2RlZmluZSBNSVBJX0RTSV9NT0RFX0VPVF9QQUNLRVQJQklUKDkpCisKK2VudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IHsKKwlNSVBJX0RTSV9GTVRfUkdCODg4LAorCU1JUElfRFNJX0ZNVF9SR0I2NjYsCisJTUlQSV9EU0lfRk1UX1JHQjY2Nl9QQUNLRUQsCisJTUlQSV9EU0lfRk1UX1JHQjU2NSwKK307CisKKy8qKgorICogc3RydWN0IG1pcGlfZHNpX2RldmljZSAtIERTSSBwZXJpcGhlcmFsIGRldmljZQorICogQGhvc3Q6IERTSSBob3N0IGZvciB0aGlzIHBlcmlwaGVyYWwKKyAqIEBkZXY6IGRyaXZlciBtb2RlbCBkZXZpY2Ugbm9kZSBmb3IgdGhpcyBwZXJpcGhlcmFsCisgKiBAY2hhbm5lbDogdmlydHVhbCBjaGFubmVsIGFzc2lnbmVkIHRvIHRoZSBwZXJpcGhlcmFsCisgKiBAZm9ybWF0OiBwaXhlbCBmb3JtYXQgZm9yIHZpZGVvIG1vZGUKKyAqIEBsYW5lczogbnVtYmVyIG9mIGFjdGl2ZSBkYXRhIGxhbmVzCisgKiBAbW9kZV9mbGFnczogRFNJIG9wZXJhdGlvbiBtb2RlIHJlbGF0ZWQgZmxhZ3MKKyAqLworc3RydWN0IG1pcGlfZHNpX2RldmljZSB7CisJc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Q7CisJc3RydWN0IGRldmljZSBkZXY7CisKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgbGFuZXM7CisJZW51bSBtaXBpX2RzaV9waXhlbF9mb3JtYXQgZm9ybWF0OworCXVuc2lnbmVkIGxvbmcgbW9kZV9mbGFnczsKK307CisKKyNkZWZpbmUgdG9fbWlwaV9kc2lfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlLCBkZXYpCisKK2ludCBtaXBpX2RzaV9hdHRhY2goc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKTsKK2ludCBtaXBpX2RzaV9kZXRhY2goc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKTsKK2ludCBtaXBpX2RzaV9kY3Nfd3JpdGUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworc3NpemVfdCBtaXBpX2RzaV9kY3NfcmVhZChzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2ksIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJICB1OCBjbWQsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKioKKyAqIHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgLSBEU0kgZHJpdmVyCisgKiBAZHJpdmVyOiBkZXZpY2UgZHJpdmVyIG1vZGVsIGRyaXZlcgorICogQHByb2JlOiBjYWxsYmFjayBmb3IgZGV2aWNlIGJpbmRpbmcKKyAqIEByZW1vdmU6IGNhbGxiYWNrIGZvciBkZXZpY2UgdW5iaW5kaW5nCisgKi8KK3N0cnVjdCBtaXBpX2RzaV9kcml2ZXIgeworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKKwlpbnQoKnByb2JlKShzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kpOworCWludCgqcmVtb3ZlKShzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kpOworfTsKKworI2RlZmluZSB0b19taXBpX2RzaV9kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIsIGRyaXZlcikKKworc3RhdGljIGlubGluZSB2b2lkICptaXBpX2RzaV9nZXRfZHJ2ZGF0YShjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmZHNpLT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaV9kc2lfc2V0X2RydmRhdGEoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpLCB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmZHNpLT5kZXYsIGRhdGEpOworfQorCitpbnQgbWlwaV9kc2lfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgKmRyaXZlcik7Cit2b2lkIG1pcGlfZHNpX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgKmRyaXZlcik7CisKKyNkZWZpbmUgbW9kdWxlX21pcGlfZHNpX2RyaXZlcihfX21pcGlfZHNpX2RyaXZlcikgXAorCW1vZHVsZV9kcml2ZXIoX19taXBpX2RzaV9kcml2ZXIsIG1pcGlfZHNpX2RyaXZlcl9yZWdpc3RlciwgXAorCQkJbWlwaV9kc2lfZHJpdmVyX3VucmVnaXN0ZXIpCisKKyNlbmRpZiAvKiBfX0RSTV9NSVBJX0RTSV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fb3NfbGludXguaCBiL2luY2x1ZGUvZHJtL2RybV9vc19saW51eC5oCmluZGV4IDgxNWZhZmMuLjg2YWI5OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9vc19saW51eC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9vc19saW51eC5oCkBAIC0yMSw3ICsyMSw2IEBACiAKIC8qKiBDdXJyZW50IHByb2Nlc3MgSUQgKi8KICNkZWZpbmUgRFJNX0NVUlJFTlRQSUQJCQl0YXNrX3BpZF9ucihjdXJyZW50KQotI2RlZmluZSBEUk1fU1VTRVIocCkJCQljYXBhYmxlKENBUF9TWVNfQURNSU4pCiAjZGVmaW5lIERSTV9VREVMQVkoZCkJCQl1ZGVsYXkoZCkKIC8qKiBSZWFkIGEgYnl0ZSBmcm9tIGEgTU1JTyByZWdpb24gKi8KICNkZWZpbmUgRFJNX1JFQUQ4KG1hcCwgb2Zmc2V0KQkJcmVhZGIoKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQpAQCAtMzUsNDUgKzM0LDEyIEBACiAjZGVmaW5lIERSTV9XUklURTE2KG1hcCwgb2Zmc2V0LCB2YWwpICAgd3JpdGV3KHZhbCwgKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQogLyoqIFdyaXRlIGEgZHdvcmQgaW50byBhIE1NSU8gcmVnaW9uICovCiAjZGVmaW5lIERSTV9XUklURTMyKG1hcCwgb2Zmc2V0LCB2YWwpCXdyaXRlbCh2YWwsICgodm9pZCBfX2lvbWVtICopKG1hcCktPmhhbmRsZSkgKyAob2Zmc2V0KSkKLS8qKiBSZWFkIG1lbW9yeSBiYXJyaWVyICovCiAKIC8qKiBSZWFkIGEgcXdvcmQgZnJvbSBhIE1NSU8gcmVnaW9uIC0gYmUgY2FyZWZ1bCB1c2luZyB0aGVzZSB1bmxlc3MgeW91IHJlYWxseSB1bmRlcnN0YW5kIHRoZW0gKi8KICNkZWZpbmUgRFJNX1JFQUQ2NChtYXAsIG9mZnNldCkJCXJlYWRxKCgodm9pZCBfX2lvbWVtICopKG1hcCktPmhhbmRsZSkgKyAob2Zmc2V0KSkKIC8qKiBXcml0ZSBhIHF3b3JkIGludG8gYSBNTUlPIHJlZ2lvbiAqLwogI2RlZmluZSBEUk1fV1JJVEU2NChtYXAsIG9mZnNldCwgdmFsKQl3cml0ZXEodmFsLCAoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCiAKLSNkZWZpbmUgRFJNX1JFQURNRU1PUllCQVJSSUVSKCkJCXJtYigpCi0vKiogV3JpdGUgbWVtb3J5IGJhcnJpZXIgKi8KLSNkZWZpbmUgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpCXdtYigpCi0vKiogUmVhZC93cml0ZSBtZW1vcnkgYmFycmllciAqLwotI2RlZmluZSBEUk1fTUVNT1JZQkFSUklFUigpCQltYigpCi0KLS8qKiBJUlEgaGFuZGxlciBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlIGFuZCB2YWx1ZXMgKi8KLSNkZWZpbmUgRFJNX0lSUV9BUkdTCQlpbnQgaXJxLCB2b2lkICphcmcKLQotLyoqIEFHUCB0eXBlcyAqLwotI2lmIF9fT1NfSEFTX0FHUAotI2RlZmluZSBEUk1fQUdQX01FTQkJc3RydWN0IGFncF9tZW1vcnkKLSNkZWZpbmUgRFJNX0FHUF9LRVJOCQlzdHJ1Y3QgYWdwX2tlcm5faW5mbwotI2Vsc2UKLS8qIGRlZmluZSBzb21lIGR1bW15IHR5cGVzIGZvciBub24gQUdQIHN1cHBvcnRpbmcga2VybmVscyAqLwotc3RydWN0IG5vX2FncF9rZXJuIHsKLQl1bnNpZ25lZCBsb25nIGFwZXJfYmFzZTsKLQl1bnNpZ25lZCBsb25nIGFwZXJfc2l6ZTsKLX07Ci0jZGVmaW5lIERSTV9BR1BfTUVNICAgICAgICAgICAgIGludAotI2RlZmluZSBEUk1fQUdQX0tFUk4gICAgICAgICAgICBzdHJ1Y3Qgbm9fYWdwX2tlcm4KLSNlbmRpZgotCi0vKiogT3RoZXIgY29weWluZyBvZiBkYXRhIHRvIGtlcm5lbCBzcGFjZSAqLwotI2RlZmluZSBEUk1fQ09QWV9GUk9NX1VTRVIoYXJnMSwgYXJnMiwgYXJnMykJCVwKLQljb3B5X2Zyb21fdXNlcihhcmcxLCBhcmcyLCBhcmczKQotLyoqIE90aGVyIGNvcHlpbmcgb2YgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSAqLwotI2RlZmluZSBEUk1fQ09QWV9UT19VU0VSKGFyZzEsIGFyZzIsIGFyZzMpCQlcCi0JY29weV90b191c2VyKGFyZzEsIGFyZzIsIGFyZzMpCi0KLSNkZWZpbmUgRFJNX0haIEhaCi0KICNkZWZpbmUgRFJNX1dBSVRfT04oIHJldCwgcXVldWUsIHRpbWVvdXQsIGNvbmRpdGlvbiApCQlcCiBkbyB7CQkJCQkJCQlcCiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwkJCVwKQEAgLTk3LDYgKzYzLDMgQEAKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CQkJXAogCXJlbW92ZV93YWl0X3F1ZXVlKCYocXVldWUpLCAmZW50cnkpOwkJCVwKIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRFJNX1dBS0VVUCggcXVldWUgKSB3YWtlX3VwKCBxdWV1ZSApCi0jZGVmaW5lIERSTV9JTklUX1dBSVRRVUVVRSggcXVldWUgKSBpbml0X3dhaXRxdWV1ZV9oZWFkKCBxdWV1ZSApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGFuZWwuaCBiL2luY2x1ZGUvZHJtL2RybV9wYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWI3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fcGFuZWwuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBOVklESUEgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0RSTV9QQU5FTF9IX18KKyNkZWZpbmUgX19EUk1fUEFORUxfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKK3N0cnVjdCBkcm1fY29ubmVjdG9yOworc3RydWN0IGRybV9kZXZpY2U7CitzdHJ1Y3QgZHJtX3BhbmVsOworCitzdHJ1Y3QgZHJtX3BhbmVsX2Z1bmNzIHsKKwlpbnQgKCpkaXNhYmxlKShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7CisJaW50ICgqZW5hYmxlKShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7CisJaW50ICgqZ2V0X21vZGVzKShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7Cit9OworCitzdHJ1Y3QgZHJtX3BhbmVsIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJY29uc3Qgc3RydWN0IGRybV9wYW5lbF9mdW5jcyAqZnVuY3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBkcm1fcGFuZWxfZGlzYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlpZiAocGFuZWwgJiYgcGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+ZGlzYWJsZSkKKwkJcmV0dXJuIHBhbmVsLT5mdW5jcy0+ZGlzYWJsZShwYW5lbCk7CisKKwlyZXR1cm4gcGFuZWwgPyAtRU5PU1lTIDogLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHJtX3BhbmVsX2VuYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlpZiAocGFuZWwgJiYgcGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+ZW5hYmxlKQorCQlyZXR1cm4gcGFuZWwtPmZ1bmNzLT5lbmFibGUocGFuZWwpOworCisJcmV0dXJuIHBhbmVsID8gLUVOT1NZUyA6IC1FSU5WQUw7Cit9CisKK3ZvaWQgZHJtX3BhbmVsX2luaXQoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpOworCitpbnQgZHJtX3BhbmVsX2FkZChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7Cit2b2lkIGRybV9wYW5lbF9yZW1vdmUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpOworCitpbnQgZHJtX3BhbmVsX2F0dGFjaChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitpbnQgZHJtX3BhbmVsX2RldGFjaChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0cnVjdCBkcm1fcGFuZWwgKm9mX2RybV9maW5kX3BhbmVsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9wYW5lbCAqb2ZfZHJtX2ZpbmRfcGFuZWwoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmggYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCmluZGV4IDg2MzljODUuLjMyZDM0ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaApAQCAtNjgxLDYgKzY4MSwxNSBAQAogZXh0ZXJuIGludCB0dG1fdHRfc3dhcG91dChzdHJ1Y3QgdHRtX3R0ICp0dG0sCiAJCQkgIHN0cnVjdCBmaWxlICpwZXJzaXN0ZW50X3N3YXBfc3RvcmFnZSk7CiAKKy8qKgorICogdHRtX3R0X3VucG9wdWxhdGUgLSBmcmVlIHBhZ2VzIGZyb20gYSB0dG0KKyAqCisgKiBAdHRtOiBQb2ludGVyIHRvIHRoZSB0dG1fdHQgc3RydWN0dXJlCisgKgorICogQ2FsbHMgdGhlIGRyaXZlciBtZXRob2QgdG8gZnJlZSBhbGwgcGFnZXMgZnJvbSBhIHR0bQorICovCitleHRlcm4gdm9pZCB0dG1fdHRfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0dG0pOworCiAvKgogICogdHRtX2JvLmMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9vYmplY3QuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fb2JqZWN0LmgKaW5kZXggNThiMDI5OC4uMDA5N2NjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9vYmplY3QuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX29iamVjdC5oCkBAIC0xOTAsMTQgKzE5MCwyNiBAQAogICogQGtleTogSGFzaCBrZXkKICAqCiAgKiBMb29rcyB1cCBhIHN0cnVjdCB0dG1fYmFzZV9vYmplY3Qgd2l0aCB0aGUga2V5IEBrZXkuCi0gKiBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIG9iamVjdCBpcyB2aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiwgYnkKLSAqIGNvbXBhcmluZyB0aGUgQHRmaWxlIGFyZ3VtZW50IGFuZCBjaGVja2luZyB0aGUgb2JqZWN0IHNoYXJlYWJsZSBmbGFnLgogICovCiAKIGV4dGVybiBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICp0dG1fYmFzZV9vYmplY3RfbG9va3VwKHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUKIAkJCQkJCSAgICAgICp0ZmlsZSwgdWludDMyX3Qga2V5KTsKIAogLyoqCisgKiB0dG1fYmFzZV9vYmplY3RfbG9va3VwX2Zvcl9yZWYKKyAqCisgKiBAdGRldjogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fb2JqZWN0X2RldmljZS4KKyAqIEBrZXk6IEhhc2gga2V5CisgKgorICogTG9va3MgdXAgYSBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0IHdpdGggdGhlIGtleSBAa2V5LgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIHN0cnVjdCB0ZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBjYWxsZXIgZG9lc24ndCB5ZXQgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgYmFzZSBvYmplY3QuCisgKi8KKworZXh0ZXJuIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKgordHRtX2Jhc2Vfb2JqZWN0X2xvb2t1cF9mb3JfcmVmKHN0cnVjdCB0dG1fb2JqZWN0X2RldmljZSAqdGRldiwgdWludDMyX3Qga2V5KTsKKworLyoqCiAgKiB0dG1fYmFzZV9vYmplY3RfdW5yZWYKICAqCiAgKiBAcF9iYXNlOiBQb2ludGVyIHRvIGEgcG9pbnRlciByZWZlcmVuY2luZyBhIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QuCkBAIC0yMTgsNiArMjMwLDggQEAKICAqIEBleGlzdGVkOiBVcG9uIGNvbXBsZXRpb24sIGluZGljYXRlcyB0aGF0IGFuIGlkZW50aWNhbCByZWZlcmVuY2Ugb2JqZWN0CiAgKiBhbHJlYWR5IGV4aXN0ZWQsIGFuZCB0aGUgcmVmY291bnQgd2FzIHVwcGVkIG9uIHRoYXQgb2JqZWN0IGluc3RlYWQuCiAgKgorICogQ2hlY2tzIHRoYXQgdGhlIGJhc2Ugb2JqZWN0IGlzIHNoYXJlYWJsZSBhbmQgYWRkcyBhIHJlZiBvYmplY3QgdG8gaXQuCisgKgogICogQWRkaW5nIGEgcmVmIG9iamVjdCB0byBhIGJhc2Ugb2JqZWN0IGlzIGJhc2ljYWxseSBsaWtlIHJlZmVyZW5jaW5nIHRoZQogICogYmFzZSBvYmplY3QsIGJ1dCBhIHVzZXItc3BhY2UgYXBwbGljYXRpb24gaG9sZHMgdGhlIHJlZmVyZW5jZS4gV2hlbiB0aGUKICAqIGZpbGUgY29ycmVzcG9uZGluZyB0byBAdGZpbGUgaXMgY2xvc2VkLCBhbGwgaXRzIHJlZmVyZW5jZSBvYmplY3RzIGFyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tcGM1MTJ4LWNsb2NrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21wYzUxMngtY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk0OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tcGM1MTJ4LWNsb2NrLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGNvbnN0YW50cyBmb3IgTVBDNTEyeCBjbG9jayBzcGVjcyBpbiBEVCBiaW5kaW5ncy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTE9DS19NUEM1MTJ4X0NMT0NLX0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMT0NLX01QQzUxMnhfQ0xPQ0tfSAorCisjZGVmaW5lIE1QQzUxMnhfQ0xLX0RVTU1ZCQkwCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1JFRgkJCTEKKyNkZWZpbmUgTVBDNTEyeF9DTEtfU1lTCQkJMgorI2RlZmluZSBNUEM1MTJ4X0NMS19ESVUJCQkzCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1ZJVQkJCTQKKyNkZWZpbmUgTVBDNTEyeF9DTEtfQ1NCCQkJNQorI2RlZmluZSBNUEM1MTJ4X0NMS19FMzAwCQk2CisjZGVmaW5lIE1QQzUxMnhfQ0xLX0lQUwkJCTcKKyNkZWZpbmUgTVBDNTEyeF9DTEtfRkVDCQkJOAorI2RlZmluZSBNUEM1MTJ4X0NMS19TQVRBCQk5CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BBVEEJCTEwCisjZGVmaW5lIE1QQzUxMnhfQ0xLX05GQwkJCTExCisjZGVmaW5lIE1QQzUxMnhfQ0xLX0xQQwkJCTEyCisjZGVmaW5lIE1QQzUxMnhfQ0xLX01CWF9CVVMJCTEzCisjZGVmaW5lIE1QQzUxMnhfQ0xLX01CWAkJCTE0CisjZGVmaW5lIE1QQzUxMnhfQ0xLX01CWF8zRAkJMTUKKyNkZWZpbmUgTVBDNTEyeF9DTEtfQVhFCQkJMTYKKyNkZWZpbmUgTVBDNTEyeF9DTEtfVVNCMQkJMTcKKyNkZWZpbmUgTVBDNTEyeF9DTEtfVVNCMgkJMTgKKyNkZWZpbmUgTVBDNTEyeF9DTEtfSTJDCQkJMTkKKyNkZWZpbmUgTVBDNTEyeF9DTEtfTVNDQU4wX01DTEsJCTIwCisjZGVmaW5lIE1QQzUxMnhfQ0xLX01TQ0FOMV9NQ0xLCQkyMQorI2RlZmluZSBNUEM1MTJ4X0NMS19NU0NBTjJfTUNMSwkJMjIKKyNkZWZpbmUgTVBDNTEyeF9DTEtfTVNDQU4zX01DTEsJCTIzCisjZGVmaW5lIE1QQzUxMnhfQ0xLX0JETEMJCTI0CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1NESEMJCTI1CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BDSQkJCTI2CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQ19NQ0xLX0lOCQkyNworI2RlZmluZSBNUEM1MTJ4X0NMS19TUERJRl9UWAkJMjgKKyNkZWZpbmUgTVBDNTEyeF9DTEtfU1BESUZfUlgJCTI5CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1NQRElGX01DTEsJCTMwCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1NQRElGCQkzMQorI2RlZmluZSBNUEM1MTJ4X0NMS19BQzk3CQkzMgorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MwX01DTEsJCTMzCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQzFfTUNMSwkJMzQKKyNkZWZpbmUgTVBDNTEyeF9DTEtfUFNDMl9NQ0xLCQkzNQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MzX01DTEsJCTM2CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQzRfTUNMSwkJMzcKKyNkZWZpbmUgTVBDNTEyeF9DTEtfUFNDNV9NQ0xLCQkzOAorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M2X01DTEsJCTM5CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQzdfTUNMSwkJNDAKKyNkZWZpbmUgTVBDNTEyeF9DTEtfUFNDOF9NQ0xLCQk0MQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M5X01DTEsJCTQyCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQzEwX01DTEsJCTQzCisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQzExX01DTEsJCTQ0CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1BTQ19GSUZPCQk0NQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MwCQk0NgorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MxCQk0NworI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MyCQk0OAorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MzCQk0OQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M0CQk1MAorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M1CQk1MQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M2CQk1MgorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M3CQk1MworI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M4CQk1NAorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0M5CQk1NQorI2RlZmluZSBNUEM1MTJ4X0NMS19QU0MxMAkJNTYKKyNkZWZpbmUgTVBDNTEyeF9DTEtfUFNDMTEJCTU3CisjZGVmaW5lIE1QQzUxMnhfQ0xLX1NESEMyCQk1OAorI2RlZmluZSBNUEM1MTJ4X0NMS19GRUMyCQk1OQorI2RlZmluZSBNUEM1MTJ4X0NMS19PVVQwX0NMSwkJNjAKKyNkZWZpbmUgTVBDNTEyeF9DTEtfT1VUMV9DTEsJCTYxCisjZGVmaW5lIE1QQzUxMnhfQ0xLX09VVDJfQ0xLCQk2MgorI2RlZmluZSBNUEM1MTJ4X0NMS19PVVQzX0NMSwkJNjMKKyNkZWZpbmUgTVBDNTEyeF9DTEtfQ0FOX0NMS19JTgkJNjQKKworI2RlZmluZSBNUEM1MTJ4X0NMS19MQVNUX1BVQkxJQwkJNjQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaAppbmRleCBjNDllMWExLi42M2QxMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmgKQEAgLTY0MCw2ICs2NDAsNyBAQAogCXNwaW5sb2NrX3QgZ3Bpb19sb2NrOwogI2lmZGVmIENPTkZJR19CQ01BX0RSSVZFUl9HUElPCiAJc3RydWN0IGdwaW9fY2hpcCBncGlvOworCXN0cnVjdCBpcnFfZG9tYWluICppcnFfZG9tYWluOwogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IGZkOGJmMzIuLmI0YTc0NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0xMTUsNyArMTE1LDYgQEAKIGV4dGVybiBpbnQgcHJlcGFyZV9icHJtX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgaW5zdGFsbF9leGVjX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgc2V0X2JpbmZtdChzdHJ1Y3QgbGludXhfYmluZm10ICpuZXcpOwotZXh0ZXJuIHZvaWQgZnJlZV9icHJtKHN0cnVjdCBsaW51eF9iaW5wcm0gKik7CiBleHRlcm4gc3NpemVfdCByZWFkX2NvZGUoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90LCBzaXplX3QpOwogCiAjZW5kaWYgLyogX0xJTlVYX0JJTkZNVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggMDYwZmY2OS4uNzA2NTQ1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC02MSwyNSArNjEsODcgQEAKICAqIHZhcmlvdXMgbWVtYmVyIGFjY2Vzcywgbm90ZSB0aGF0IGJpb19kYXRhIHNob3VsZCBvZiBjb3Vyc2Ugbm90IGJlIHVzZWQKICAqIG9uIGhpZ2htZW0gcGFnZSB2ZWN0b3JzCiAgKi8KLSNkZWZpbmUgYmlvX2lvdmVjX2lkeChiaW8sIGlkeCkJKCYoKGJpbyktPmJpX2lvX3ZlY1soaWR4KV0pKQotI2RlZmluZSBiaW9faW92ZWMoYmlvKQkJYmlvX2lvdmVjX2lkeCgoYmlvKSwgKGJpbyktPmJpX2lkeCkKLSNkZWZpbmUgYmlvX3BhZ2UoYmlvKQkJYmlvX2lvdmVjKChiaW8pKS0+YnZfcGFnZQotI2RlZmluZSBiaW9fb2Zmc2V0KGJpbykJCWJpb19pb3ZlYygoYmlvKSktPmJ2X29mZnNldAotI2RlZmluZSBiaW9fc2VnbWVudHMoYmlvKQkoKGJpbyktPmJpX3ZjbnQgLSAoYmlvKS0+YmlfaWR4KQotI2RlZmluZSBiaW9fc2VjdG9ycyhiaW8pCSgoYmlvKS0+Ymlfc2l6ZSA+PiA5KQotI2RlZmluZSBiaW9fZW5kX3NlY3RvcihiaW8pCSgoYmlvKS0+Ymlfc2VjdG9yICsgYmlvX3NlY3RvcnMoKGJpbykpKQorI2RlZmluZSBfX2J2ZWNfaXRlcl9idmVjKGJ2ZWMsIGl0ZXIpCSgmKGJ2ZWMpWyhpdGVyKS5iaV9pZHhdKQorCisjZGVmaW5lIGJ2ZWNfaXRlcl9wYWdlKGJ2ZWMsIGl0ZXIpCQkJCVwKKwkoX19idmVjX2l0ZXJfYnZlYygoYnZlYyksIChpdGVyKSktPmJ2X3BhZ2UpCisKKyNkZWZpbmUgYnZlY19pdGVyX2xlbihidmVjLCBpdGVyKQkJCQlcCisJbWluKChpdGVyKS5iaV9zaXplLAkJCQkJXAorCSAgICBfX2J2ZWNfaXRlcl9idmVjKChidmVjKSwgKGl0ZXIpKS0+YnZfbGVuIC0gKGl0ZXIpLmJpX2J2ZWNfZG9uZSkKKworI2RlZmluZSBidmVjX2l0ZXJfb2Zmc2V0KGJ2ZWMsIGl0ZXIpCQkJCVwKKwkoX19idmVjX2l0ZXJfYnZlYygoYnZlYyksIChpdGVyKSktPmJ2X29mZnNldCArIChpdGVyKS5iaV9idmVjX2RvbmUpCisKKyNkZWZpbmUgYnZlY19pdGVyX2J2ZWMoYnZlYywgaXRlcikJCQkJXAorKChzdHJ1Y3QgYmlvX3ZlYykgewkJCQkJCVwKKwkuYnZfcGFnZQk9IGJ2ZWNfaXRlcl9wYWdlKChidmVjKSwgKGl0ZXIpKSwJXAorCS5idl9sZW4JCT0gYnZlY19pdGVyX2xlbigoYnZlYyksIChpdGVyKSksCVwKKwkuYnZfb2Zmc2V0CT0gYnZlY19pdGVyX29mZnNldCgoYnZlYyksIChpdGVyKSksCVwKK30pCisKKyNkZWZpbmUgYmlvX2l0ZXJfaW92ZWMoYmlvLCBpdGVyKQkJCQlcCisJYnZlY19pdGVyX2J2ZWMoKGJpbyktPmJpX2lvX3ZlYywgKGl0ZXIpKQorCisjZGVmaW5lIGJpb19pdGVyX3BhZ2UoYmlvLCBpdGVyKQkJCQlcCisJYnZlY19pdGVyX3BhZ2UoKGJpbyktPmJpX2lvX3ZlYywgKGl0ZXIpKQorI2RlZmluZSBiaW9faXRlcl9sZW4oYmlvLCBpdGVyKQkJCQkJXAorCWJ2ZWNfaXRlcl9sZW4oKGJpbyktPmJpX2lvX3ZlYywgKGl0ZXIpKQorI2RlZmluZSBiaW9faXRlcl9vZmZzZXQoYmlvLCBpdGVyKQkJCQlcCisJYnZlY19pdGVyX29mZnNldCgoYmlvKS0+YmlfaW9fdmVjLCAoaXRlcikpCisKKyNkZWZpbmUgYmlvX3BhZ2UoYmlvKQkJYmlvX2l0ZXJfcGFnZSgoYmlvKSwgKGJpbyktPmJpX2l0ZXIpCisjZGVmaW5lIGJpb19vZmZzZXQoYmlvKQkJYmlvX2l0ZXJfb2Zmc2V0KChiaW8pLCAoYmlvKS0+YmlfaXRlcikKKyNkZWZpbmUgYmlvX2lvdmVjKGJpbykJCWJpb19pdGVyX2lvdmVjKChiaW8pLCAoYmlvKS0+YmlfaXRlcikKKworI2RlZmluZSBiaW9fbXVsdGlwbGVfc2VnbWVudHMoYmlvKQkJCQlcCisJKChiaW8pLT5iaV9pdGVyLmJpX3NpemUgIT0gYmlvX2lvdmVjKGJpbykuYnZfbGVuKQorI2RlZmluZSBiaW9fc2VjdG9ycyhiaW8pCSgoYmlvKS0+YmlfaXRlci5iaV9zaXplID4+IDkpCisjZGVmaW5lIGJpb19lbmRfc2VjdG9yKGJpbykJKChiaW8pLT5iaV9pdGVyLmJpX3NlY3RvciArIGJpb19zZWN0b3JzKChiaW8pKSkKKworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhpcyBiaW8gY2FycmllcyBhbnkgZGF0YSBvciBub3QuIEEgTlVMTCBiaW8gaXMgYWxsb3dlZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGJpb19oYXNfZGF0YShzdHJ1Y3QgYmlvICpiaW8pCit7CisJaWYgKGJpbyAmJgorCSAgICBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSAmJgorCSAgICAhKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmlvX2lzX3J3KHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpZiAoIWJpb19oYXNfZGF0YShiaW8pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYmlvLT5iaV9ydyAmIEJJT19OT19BRFZBTkNFX0lURVJfTUFTSykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBiaW9fbWVyZ2VhYmxlKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpZiAoYmlvLT5iaV9ydyAmIFJFUV9OT01FUkdFX0ZMQUdTKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmlvX2N1cl9ieXRlcyhzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaWYgKGJpby0+YmlfdmNudCkKLQkJcmV0dXJuIGJpb19pb3ZlYyhiaW8pLT5idl9sZW47CisJaWYgKGJpb19oYXNfZGF0YShiaW8pKQorCQlyZXR1cm4gYmlvX2lvdmVjKGJpbykuYnZfbGVuOwogCWVsc2UgLyogZGF0YWxlc3MgcmVxdWVzdHMgc3VjaCBhcyBkaXNjYXJkICovCi0JCXJldHVybiBiaW8tPmJpX3NpemU7CisJCXJldHVybiBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpiaW9fZGF0YShzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaWYgKGJpby0+YmlfdmNudCkKKwlpZiAoYmlvX2hhc19kYXRhKGJpbykpCiAJCXJldHVybiBwYWdlX2FkZHJlc3MoYmlvX3BhZ2UoYmlvKSkgKyBiaW9fb2Zmc2V0KGJpbyk7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTk3LDE5ICsxNTksMTYgQEAKICAqIHBlcm1hbmVudCBQSU8gZmFsbCBiYWNrLCB1c2VyIGlzIHByb2JhYmx5IGJldHRlciBvZmYgZGlzYWJsaW5nIGhpZ2htZW0KICAqIEkvTyBjb21wbGV0ZWx5IG9uIHRoYXQgcXVldWUgKHNlZSBpZGUtZG1hIGZvciBleGFtcGxlKQogICovCi0jZGVmaW5lIF9fYmlvX2ttYXBfYXRvbWljKGJpbywgaWR4KQkJCQlcCi0JKGttYXBfYXRvbWljKGJpb19pb3ZlY19pZHgoKGJpbyksIChpZHgpKS0+YnZfcGFnZSkgKwlcCi0JCWJpb19pb3ZlY19pZHgoKGJpbyksIChpZHgpKS0+YnZfb2Zmc2V0KQorI2RlZmluZSBfX2Jpb19rbWFwX2F0b21pYyhiaW8sIGl0ZXIpCQkJCVwKKwkoa21hcF9hdG9taWMoYmlvX2l0ZXJfaW92ZWMoKGJpbyksIChpdGVyKSkuYnZfcGFnZSkgKwlcCisJCWJpb19pdGVyX2lvdmVjKChiaW8pLCAoaXRlcikpLmJ2X29mZnNldCkKIAotI2RlZmluZSBfX2Jpb19rdW5tYXBfYXRvbWljKGFkZHIpIGt1bm1hcF9hdG9taWMoYWRkcikKKyNkZWZpbmUgX19iaW9fa3VubWFwX2F0b21pYyhhZGRyKQlrdW5tYXBfYXRvbWljKGFkZHIpCiAKIC8qCiAgKiBtZXJnZSBoZWxwZXJzIGV0YwogICovCiAKLSNkZWZpbmUgX19CVkVDX0VORChiaW8pCQliaW9faW92ZWNfaWR4KChiaW8pLCAoYmlvKS0+YmlfdmNudCAtIDEpCi0jZGVmaW5lIF9fQlZFQ19TVEFSVChiaW8pCWJpb19pb3ZlY19pZHgoKGJpbyksIChiaW8pLT5iaV9pZHgpCi0KIC8qIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQklPVkVDX1BIWVNfTUVSR0VBQkxFICovCiAjZGVmaW5lIF9fQklPVkVDX1BIWVNfTUVSR0VBQkxFKHZlYzEsIHZlYzIpCVwKIAkoKGJ2ZWNfdG9fcGh5cygodmVjMSkpICsgKHZlYzEpLT5idl9sZW4pID09IGJ2ZWNfdG9fcGh5cygodmVjMikpKQpAQCAtMTI2LDMzICsxODUsNzYgQEAKIAkoKChhZGRyMSkgfCAobWFzaykpID09ICgoKGFkZHIyKSAtIDEpIHwgKG1hc2spKSkKICNkZWZpbmUgQklPVkVDX1NFR19CT1VOREFSWShxLCBiMSwgYjIpIFwKIAlfX0JJT19TRUdfQk9VTkRBUlkoYnZlY190b19waHlzKChiMSkpLCBidmVjX3RvX3BoeXMoKGIyKSkgKyAoYjIpLT5idl9sZW4sIHF1ZXVlX3NlZ21lbnRfYm91bmRhcnkoKHEpKSkKLSNkZWZpbmUgQklPX1NFR19CT1VOREFSWShxLCBiMSwgYjIpIFwKLQlCSU9WRUNfU0VHX0JPVU5EQVJZKChxKSwgX19CVkVDX0VORCgoYjEpKSwgX19CVkVDX1NUQVJUKChiMikpKQogCiAjZGVmaW5lIGJpb19pb19lcnJvcihiaW8pIGJpb19lbmRpbygoYmlvKSwgLUVJTykKIAogLyoKLSAqIGRyaXZlcnMgc2hvdWxkIG5vdCB1c2UgdGhlIF9fIHZlcnNpb24gdW5sZXNzIHRoZXkgX3JlYWxseV8ga25vdyB3aGF0Ci0gKiB0aGV5J3JlIGRvaW5nCi0gKi8KLSNkZWZpbmUgX19iaW9fZm9yX2VhY2hfc2VnbWVudChidmwsIGJpbywgaSwgc3RhcnRfaWR4KQkJCVwKLQlmb3IgKGJ2bCA9IGJpb19pb3ZlY19pZHgoKGJpbyksIChzdGFydF9pZHgpKSwgaSA9IChzdGFydF9pZHgpOwlcCi0JICAgICBpIDwgKGJpbyktPmJpX3ZjbnQ7CQkJCQlcCi0JICAgICBidmwrKywgaSsrKQotCi0vKgogICogZHJpdmVycyBzaG91bGQgX25ldmVyXyB1c2UgdGhlIGFsbCB2ZXJzaW9uIC0gdGhlIGJpbyBtYXkgaGF2ZSBiZWVuIHNwbGl0CiAgKiBiZWZvcmUgaXQgZ290IHRvIHRoZSBkcml2ZXIgYW5kIHRoZSBkcml2ZXIgd29uJ3Qgb3duIGFsbCBvZiBpdAogICovCiAjZGVmaW5lIGJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmwsIGJpbywgaSkJCQkJXAotCWZvciAoaSA9IDA7CQkJCQkJCVwKLQkgICAgIGJ2bCA9IGJpb19pb3ZlY19pZHgoKGJpbyksIChpKSksIGkgPCAoYmlvKS0+YmlfdmNudDsJXAotCSAgICAgaSsrKQorCWZvciAoaSA9IDAsIGJ2bCA9IChiaW8pLT5iaV9pb192ZWM7IGkgPCAoYmlvKS0+YmlfdmNudDsgaSsrLCBidmwrKykKIAotI2RlZmluZSBiaW9fZm9yX2VhY2hfc2VnbWVudChidmwsIGJpbywgaSkJCQkJXAotCWZvciAoaSA9IChiaW8pLT5iaV9pZHg7CQkJCQkJXAotCSAgICAgYnZsID0gYmlvX2lvdmVjX2lkeCgoYmlvKSwgKGkpKSwgaSA8IChiaW8pLT5iaV92Y250OwlcCi0JICAgICBpKyspCitzdGF0aWMgaW5saW5lIHZvaWQgYnZlY19pdGVyX2FkdmFuY2Uoc3RydWN0IGJpb192ZWMgKmJ2LCBzdHJ1Y3QgYnZlY19pdGVyICppdGVyLAorCQkJCSAgICAgdW5zaWduZWQgYnl0ZXMpCit7CisJV0FSTl9PTkNFKGJ5dGVzID4gaXRlci0+Ymlfc2l6ZSwKKwkJICAiQXR0ZW1wdGVkIHRvIGFkdmFuY2UgcGFzdCBlbmQgb2YgYnZlYyBpdGVyXG4iKTsKKworCXdoaWxlIChieXRlcykgeworCQl1bnNpZ25lZCBsZW4gPSBtaW4oYnl0ZXMsIGJ2ZWNfaXRlcl9sZW4oYnYsICppdGVyKSk7CisKKwkJYnl0ZXMgLT0gbGVuOworCQlpdGVyLT5iaV9zaXplIC09IGxlbjsKKwkJaXRlci0+YmlfYnZlY19kb25lICs9IGxlbjsKKworCQlpZiAoaXRlci0+YmlfYnZlY19kb25lID09IF9fYnZlY19pdGVyX2J2ZWMoYnYsICppdGVyKS0+YnZfbGVuKSB7CisJCQlpdGVyLT5iaV9idmVjX2RvbmUgPSAwOworCQkJaXRlci0+YmlfaWR4Kys7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfYnZlYyhidmwsIGJpb192ZWMsIGl0ZXIsIHN0YXJ0KQkJCVwKKwlmb3IgKChpdGVyKSA9IHN0YXJ0OwkJCQkJCVwKKwkgICAgIChidmwpID0gYnZlY19pdGVyX2J2ZWMoKGJpb192ZWMpLCAoaXRlcikpLAkJCVwKKwkJKGl0ZXIpLmJpX3NpemU7CQkJCQkJXAorCSAgICAgYnZlY19pdGVyX2FkdmFuY2UoKGJpb192ZWMpLCAmKGl0ZXIpLCAoYnZsKS5idl9sZW4pKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaW9fYWR2YW5jZV9pdGVyKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJ2ZWNfaXRlciAqaXRlciwKKwkJCQkgICAgdW5zaWduZWQgYnl0ZXMpCit7CisJaXRlci0+Ymlfc2VjdG9yICs9IGJ5dGVzID4+IDk7CisKKwlpZiAoYmlvLT5iaV9ydyAmIEJJT19OT19BRFZBTkNFX0lURVJfTUFTSykKKwkJaXRlci0+Ymlfc2l6ZSAtPSBieXRlczsKKwllbHNlCisJCWJ2ZWNfaXRlcl9hZHZhbmNlKGJpby0+YmlfaW9fdmVjLCBpdGVyLCBieXRlcyk7Cit9CisKKyNkZWZpbmUgX19iaW9fZm9yX2VhY2hfc2VnbWVudChidmwsIGJpbywgaXRlciwgc3RhcnQpCQkJXAorCWZvciAoaXRlciA9IChzdGFydCk7CQkJCQkJXAorCSAgICAgKGl0ZXIpLmJpX3NpemUgJiYJCQkJCQlcCisJCSgoYnZsID0gYmlvX2l0ZXJfaW92ZWMoKGJpbyksIChpdGVyKSkpLCAxKTsJCVwKKwkgICAgIGJpb19hZHZhbmNlX2l0ZXIoKGJpbyksICYoaXRlciksIChidmwpLmJ2X2xlbikpCisKKyNkZWZpbmUgYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGl0ZXIpCQkJCVwKKwlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2bCwgYmlvLCBpdGVyLCAoYmlvKS0+YmlfaXRlcikKKworI2RlZmluZSBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpICgoaXRlcikuYmlfc2l6ZSA9PSAoYnZlYykuYnZfbGVuKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGJpb19zZWdtZW50cyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJdW5zaWduZWQgc2VncyA9IDA7CisJc3RydWN0IGJpb192ZWMgYnY7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOworCisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaXRlcikKKwkJc2VncysrOworCisJcmV0dXJuIHNlZ3M7Cit9CiAKIC8qCiAgKiBnZXQgYSByZWZlcmVuY2UgdG8gYSBiaW8sIHNvIGl0IHdvbid0IGRpc2FwcGVhci4gdGhlIGludGVuZGVkIHVzZSBpcwpAQCAtMTc3LDE2ICsyNzksMTUgQEAKIHN0cnVjdCBiaW9faW50ZWdyaXR5X3BheWxvYWQgewogCXN0cnVjdCBiaW8JCSpiaXBfYmlvOwkvKiBwYXJlbnQgYmlvICovCiAKLQlzZWN0b3JfdAkJYmlwX3NlY3RvcjsJLyogdmlydHVhbCBzdGFydCBzZWN0b3IgKi8KKwlzdHJ1Y3QgYnZlY19pdGVyCWJpcF9pdGVyOwogCisJLyoga2lsbCAtIHNob3VsZCBqdXN0IHVzZSBiaXBfdmVjICovCiAJdm9pZAkJCSpiaXBfYnVmOwkvKiBnZW5lcmF0ZWQgaW50ZWdyaXR5IGRhdGEgKi8KLQliaW9fZW5kX2lvX3QJCSpiaXBfZW5kX2lvOwkvKiBzYXZlZCBJL08gY29tcGxldGlvbiBmbiAqLwogCi0JdW5zaWduZWQgaW50CQliaXBfc2l6ZTsKKwliaW9fZW5kX2lvX3QJCSpiaXBfZW5kX2lvOwkvKiBzYXZlZCBJL08gY29tcGxldGlvbiBmbiAqLwogCiAJdW5zaWduZWQgc2hvcnQJCWJpcF9zbGFiOwkvKiBzbGFiIHRoZSBiaXAgY2FtZSBmcm9tICovCiAJdW5zaWduZWQgc2hvcnQJCWJpcF92Y250OwkvKiAjIG9mIGludGVncml0eSBiaW9fdmVjcyAqLwotCXVuc2lnbmVkIHNob3J0CQliaXBfaWR4OwkvKiBjdXJyZW50IGJpcF92ZWMgaW5kZXggKi8KIAl1bnNpZ25lZAkJYmlwX293bnNfYnVmOjE7CS8qIHNob3VsZCBmcmVlIGJpcF9idWYgKi8KIAogCXN0cnVjdCB3b3JrX3N0cnVjdAliaXBfd29yazsJLyogSS9PIGNvbXBsZXRpb24gKi8KQEAgLTE5NiwyOSArMjk3LDI4IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSAqLwogCi0vKgotICogQSBiaW9fcGFpciBpcyB1c2VkIHdoZW4gd2UgbmVlZCB0byBzcGxpdCBhIGJpby4KLSAqIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciBhIGJpbyB0aGF0IHJlZmVycyB0byBqdXN0IG9uZQotICogcGFnZSBvZiBkYXRhLCBhbmQgaW4gdGhlIHVudXN1YWwgc2l0dWF0aW9uIHdoZW4gdGhlCi0gKiBwYWdlIGNyb3NzZXMgYSBjaHVuay9kZXZpY2UgYm91bmRhcnkKLSAqCi0gKiBUaGUgYWRkcmVzcyBvZiB0aGUgbWFzdGVyIGJpbyBpcyBzdG9yZWQgaW4gYmlvMS5iaV9wcml2YXRlCi0gKiBUaGUgYWRkcmVzcyBvZiB0aGUgcG9vbCB0aGUgcGFpciB3YXMgYWxsb2NhdGVkIGZyb20gaXMgc3RvcmVkCi0gKiAgIGluIGJpbzIuYmlfcHJpdmF0ZQotICovCi1zdHJ1Y3QgYmlvX3BhaXIgewotCXN0cnVjdCBiaW8JCQliaW8xLCBiaW8yOwotCXN0cnVjdCBiaW9fdmVjCQkJYnYxLCBidjI7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkpCi0Jc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZAliaXAxLCBiaXAyOwotCXN0cnVjdCBiaW9fdmVjCQkJaXYxLCBpdjI7Ci0jZW5kaWYKLQlhdG9taWNfdAkJCWNudDsKLQlpbnQJCQkJZXJyb3I7Ci19OwotZXh0ZXJuIHN0cnVjdCBiaW9fcGFpciAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpLCBpbnQgZmlyc3Rfc2VjdG9ycyk7Ci1leHRlcm4gdm9pZCBiaW9fcGFpcl9yZWxlYXNlKHN0cnVjdCBiaW9fcGFpciAqZGJpbyk7CiBleHRlcm4gdm9pZCBiaW9fdHJpbShzdHJ1Y3QgYmlvICpiaW8sIGludCBvZmZzZXQsIGludCBzaXplKTsKK2V4dGVybiBzdHJ1Y3QgYmlvICpiaW9fc3BsaXQoc3RydWN0IGJpbyAqYmlvLCBpbnQgc2VjdG9ycywKKwkJCSAgICAgZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgYmlvX3NldCAqYnMpOworCisvKioKKyAqIGJpb19uZXh0X3NwbGl0IC0gZ2V0IG5leHQgQHNlY3RvcnMgZnJvbSBhIGJpbywgc3BsaXR0aW5nIGlmIG5lY2Vzc2FyeQorICogQGJpbzoJYmlvIHRvIHNwbGl0CisgKiBAc2VjdG9yczoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gc3BsaXQgZnJvbSB0aGUgZnJvbnQgb2YgQGJpbworICogQGdmcDoJZ2ZwIG1hc2sKKyAqIEBiczoJCWJpbyBzZXQgdG8gYWxsb2NhdGUgZnJvbQorICoKKyAqIFJldHVybnMgYSBiaW8gcmVwcmVzZW50aW5nIHRoZSBuZXh0IEBzZWN0b3JzIG9mIEBiaW8gLSBpZiB0aGUgYmlvIGlzIHNtYWxsZXIKKyAqIHRoYW4gQHNlY3RvcnMsIHJldHVybnMgdGhlIG9yaWdpbmFsIGJpbyB1bmNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJpbyAqYmlvX25leHRfc3BsaXQoc3RydWN0IGJpbyAqYmlvLCBpbnQgc2VjdG9ycywKKwkJCQkJIGdmcF90IGdmcCwgc3RydWN0IGJpb19zZXQgKmJzKQoreworCWlmIChzZWN0b3JzID49IGJpb19zZWN0b3JzKGJpbykpCisJCXJldHVybiBiaW87CisKKwlyZXR1cm4gYmlvX3NwbGl0KGJpbywgc2VjdG9ycywgZ2ZwLCBicyk7Cit9CiAKIGV4dGVybiBzdHJ1Y3QgYmlvX3NldCAqYmlvc2V0X2NyZWF0ZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBiaW9zZXRfZnJlZShzdHJ1Y3QgYmlvX3NldCAqKTsKQEAgLTIyNyw3ICszMjcsOCBAQAogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19hbGxvY19iaW9zZXQoZ2ZwX3QsIGludCwgc3RydWN0IGJpb19zZXQgKik7CiBleHRlcm4gdm9pZCBiaW9fcHV0KHN0cnVjdCBiaW8gKik7CiAKLWV4dGVybiB2b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKiwgc3RydWN0IGJpbyAqKTsKK2V4dGVybiB2b2lkIF9fYmlvX2Nsb25lX2Zhc3Qoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvICopOworZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jbG9uZV9mYXN0KHN0cnVjdCBiaW8gKiwgZ2ZwX3QsIHN0cnVjdCBiaW9fc2V0ICopOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jbG9uZV9iaW9zZXQoc3RydWN0IGJpbyAqLCBnZnBfdCwgc3RydWN0IGJpb19zZXQgKmJzKTsKIAogZXh0ZXJuIHN0cnVjdCBiaW9fc2V0ICpmc19iaW9fc2V0OwpAQCAtMjU0LDYgKzM1NSw3IEBACiB9CiAKIGV4dGVybiB2b2lkIGJpb19lbmRpbyhzdHJ1Y3QgYmlvICosIGludCk7CitleHRlcm4gdm9pZCBiaW9fZW5kaW9fbm9kZWMoc3RydWN0IGJpbyAqLCBpbnQpOwogc3RydWN0IHJlcXVlc3RfcXVldWU7CiBleHRlcm4gaW50IGJpb19waHlzX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBiaW8gKik7CiAKQEAgLTI2MiwxMiArMzY0LDEyIEBACiAKIGV4dGVybiB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKik7CiBleHRlcm4gdm9pZCBiaW9fcmVzZXQoc3RydWN0IGJpbyAqKTsKK3ZvaWQgYmlvX2NoYWluKHN0cnVjdCBiaW8gKiwgc3RydWN0IGJpbyAqKTsKIAogZXh0ZXJuIGludCBiaW9fYWRkX3BhZ2Uoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgYmlvX2FkZF9wY19wYWdlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBiaW8gKiwgc3RydWN0IHBhZ2UgKiwKIAkJCSAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgYmlvX2dldF9ucl92ZWNzKHN0cnVjdCBibG9ja19kZXZpY2UgKik7Ci1leHRlcm4gc2VjdG9yX3QgYmlvX3NlY3Rvcl9vZmZzZXQoc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAogCQkJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgaW50LCBnZnBfdCk7CiBzdHJ1Y3Qgc2dfaW92ZWM7CkBAIC0zNTcsNDggKzQ1OSwxOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqX19iaW9fa21hcF9pcnEoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzaG9ydCBpZHgsCitzdGF0aWMgaW5saW5lIGNoYXIgKl9fYmlvX2ttYXBfaXJxKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJ2ZWNfaXRlciBpdGVyLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXJldHVybiBidmVjX2ttYXBfaXJxKGJpb19pb3ZlY19pZHgoYmlvLCBpZHgpLCBmbGFncyk7CisJcmV0dXJuIGJ2ZWNfa21hcF9pcnEoJmJpb19pdGVyX2lvdmVjKGJpbywgaXRlciksIGZsYWdzKTsKIH0KICNkZWZpbmUgX19iaW9fa3VubWFwX2lycShidWYsIGZsYWdzKQlidmVjX2t1bm1hcF9pcnEoYnVmLCBmbGFncykKIAogI2RlZmluZSBiaW9fa21hcF9pcnEoYmlvLCBmbGFncykgXAotCV9fYmlvX2ttYXBfaXJxKChiaW8pLCAoYmlvKS0+YmlfaWR4LCAoZmxhZ3MpKQorCV9fYmlvX2ttYXBfaXJxKChiaW8pLCAoYmlvKS0+YmlfaXRlciwgKGZsYWdzKSkKICNkZWZpbmUgYmlvX2t1bm1hcF9pcnEoYnVmLGZsYWdzKQlfX2Jpb19rdW5tYXBfaXJxKGJ1ZiwgZmxhZ3MpCiAKIC8qCi0gKiBDaGVjayB3aGV0aGVyIHRoaXMgYmlvIGNhcnJpZXMgYW55IGRhdGEgb3Igbm90LiBBIE5VTEwgYmlvIGlzIGFsbG93ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBiaW9faGFzX2RhdGEoc3RydWN0IGJpbyAqYmlvKQotewotCWlmIChiaW8gJiYgYmlvLT5iaV92Y250KQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGJpb19pc19ydyhzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JaWYgKCFiaW9faGFzX2RhdGEoYmlvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGJpby0+YmlfcncgJiBSRVFfV1JJVEVfU0FNRSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBiaW9fbWVyZ2VhYmxlKHN0cnVjdCBiaW8gKmJpbykKLXsKLQlpZiAoYmlvLT5iaV9ydyAmIFJFUV9OT01FUkdFX0ZMQUdTKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoKICAqIEJJTyBsaXN0IG1hbmFnZW1lbnQgZm9yIHVzZSBieSByZW1hcHBpbmcgZHJpdmVycyAoZS5nLiBETSBvciBNRCkgYW5kIGxvb3AuCiAgKgogICogQSBiaW9fbGlzdCBhbmNob3JzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIGJpb3MgY2hhaW5lZCB0aHJvdWdoIHRoZSBiaV9uZXh0CkBAIC01NTksMTYgKzYzMSwxMiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkpCiAKKworCiAjZGVmaW5lIGJpcF92ZWNfaWR4KGJpcCwgaWR4KQkoJihiaXAtPmJpcF92ZWNbKGlkeCldKSkKLSNkZWZpbmUgYmlwX3ZlYyhiaXApCQliaXBfdmVjX2lkeChiaXAsIDApCiAKLSNkZWZpbmUgX19iaXBfZm9yX2VhY2hfdmVjKGJ2bCwgYmlwLCBpLCBzdGFydF9pZHgpCQkJXAotCWZvciAoYnZsID0gYmlwX3ZlY19pZHgoKGJpcCksIChzdGFydF9pZHgpKSwgaSA9IChzdGFydF9pZHgpOwlcCi0JICAgICBpIDwgKGJpcCktPmJpcF92Y250OwkJCQkJXAotCSAgICAgYnZsKyssIGkrKykKLQotI2RlZmluZSBiaXBfZm9yX2VhY2hfdmVjKGJ2bCwgYmlwLCBpKQkJCQkJXAotCV9fYmlwX2Zvcl9lYWNoX3ZlYyhidmwsIGJpcCwgaSwgKGJpcCktPmJpcF9pZHgpCisjZGVmaW5lIGJpcF9mb3JfZWFjaF92ZWMoYnZsLCBiaXAsIGl0ZXIpCQkJCVwKKwlmb3JfZWFjaF9idmVjKGJ2bCwgKGJpcCktPmJpcF92ZWMsIGl0ZXIsIChiaXApLT5iaXBfaXRlcikKIAogI2RlZmluZSBiaW9fZm9yX2VhY2hfaW50ZWdyaXR5X3ZlYyhfYnZsLCBfYmlvLCBfaXRlcikJCQlcCiAJZm9yX2VhY2hfYmlvKF9iaW8pCQkJCQkJXApAQCAtNTg2LDcgKzY1NCw2IEBACiBleHRlcm4gdm9pZCBiaW9faW50ZWdyaXR5X2VuZGlvKHN0cnVjdCBiaW8gKiwgaW50KTsKIGV4dGVybiB2b2lkIGJpb19pbnRlZ3JpdHlfYWR2YW5jZShzdHJ1Y3QgYmlvICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBiaW9faW50ZWdyaXR5X3RyaW0oc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBiaW9faW50ZWdyaXR5X3NwbGl0KHN0cnVjdCBiaW8gKiwgc3RydWN0IGJpb19wYWlyICosIGludCk7CiBleHRlcm4gaW50IGJpb19pbnRlZ3JpdHlfY2xvbmUoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvICosIGdmcF90KTsKIGV4dGVybiBpbnQgYmlvc2V0X2ludGVncml0eV9jcmVhdGUoc3RydWN0IGJpb19zZXQgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJpb3NldF9pbnRlZ3JpdHlfZnJlZShzdHJ1Y3QgYmlvX3NldCAqKTsKQEAgLTYzMCwxMiArNjk3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJpb19pbnRlZ3JpdHlfc3BsaXQoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvX3BhaXIgKmJwLAotCQkJCSAgICAgICBpbnQgc2VjdG9ycykKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBiaW9faW50ZWdyaXR5X2FkdmFuY2Uoc3RydWN0IGJpbyAqYmlvLAogCQkJCQkgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oIGIvaW5jbHVkZS9saW51eC9ibGstbXEuaAppbmRleCBhYjBlOWIyLi4xNjFiMjMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrLW1xLmgKQEAgLTExMyw3ICsxMTMsNiBAQAogfTsKIAogc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19tcV9pbml0X3F1ZXVlKHN0cnVjdCBibGtfbXFfcmVnICosIHZvaWQgKik7Ci12b2lkIGJsa19tcV9mcmVlX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogaW50IGJsa19tcV9yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOwogdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOwogdm9pZCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB2b2lkICgqaW5pdCkodm9pZCAqZGF0YSwgc3RydWN0IGJsa19tcV9od19jdHggKiwgc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwgdm9pZCAqZGF0YSk7CkBAIC0xNTksMTYgKzE1OCwxNiBAQAogfQogCiAjZGVmaW5lIHF1ZXVlX2Zvcl9lYWNoX2h3X2N0eChxLCBoY3R4LCBpKQkJCQlcCi0JZm9yICgoaSkgPSAwLCBoY3R4ID0gKHEpLT5xdWV1ZV9od19jdHhbMF07CQkJXAotCSAgICAgKGkpIDwgKHEpLT5ucl9od19xdWV1ZXM7IChpKSsrLCBoY3R4ID0gKHEpLT5xdWV1ZV9od19jdHhbaV0pCisJZm9yICgoaSkgPSAwOyAoaSkgPCAocSktPm5yX2h3X3F1ZXVlcyAmJgkJCVwKKwkgICAgICh7IGhjdHggPSAocSktPnF1ZXVlX2h3X2N0eFtpXTsgMTsgfSk7IChpKSsrKQogCiAjZGVmaW5lIHF1ZXVlX2Zvcl9lYWNoX2N0eChxLCBjdHgsIGkpCQkJCQlcCi0JZm9yICgoaSkgPSAwLCBjdHggPSBwZXJfY3B1X3B0cigocSktPnF1ZXVlX2N0eCwgMCk7CQlcCi0JICAgICAoaSkgPCAocSktPm5yX3F1ZXVlczsgKGkpKyssIGN0eCA9IHBlcl9jcHVfcHRyKHEtPnF1ZXVlX2N0eCwgKGkpKSkKKwlmb3IgKChpKSA9IDA7IChpKSA8IChxKS0+bnJfcXVldWVzICYmCQkJCVwKKwkgICAgICh7IGN0eCA9IHBlcl9jcHVfcHRyKChxKS0+cXVldWVfY3R4LCAoaSkpOyAxOyB9KTsgKGkpKyspCiAKICNkZWZpbmUgaGN0eF9mb3JfZWFjaF9jdHgoaGN0eCwgY3R4LCBpKQkJCQkJXAotCWZvciAoKGkpID0gMCwgY3R4ID0gKGhjdHgpLT5jdHhzWzBdOwkJCQlcCi0JICAgICAoaSkgPCAoaGN0eCktPm5yX2N0eDsgKGkpKyssIGN0eCA9IChoY3R4KS0+Y3R4c1soaSldKQorCWZvciAoKGkpID0gMDsgKGkpIDwgKGhjdHgpLT5ucl9jdHggJiYJCQkJXAorCSAgICAgKHsgY3R4ID0gKGhjdHgpLT5jdHhzWyhpKV07IDE7IH0pOyAoaSkrKykKIAogI2RlZmluZSBibGtfY3R4X3N1bShxLCBzdW0pCQkJCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAppbmRleCAyMzhlZjBlLi5iYmMzYTZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKQEAgLTI4LDEzICsyOCwyMiBAQAogCXVuc2lnbmVkIGludAlidl9vZmZzZXQ7CiB9OwogCitzdHJ1Y3QgYnZlY19pdGVyIHsKKwlzZWN0b3JfdAkJYmlfc2VjdG9yOwkvKiBkZXZpY2UgYWRkcmVzcyBpbiA1MTIgYnl0ZQorCQkJCQkJICAgc2VjdG9ycyAqLworCXVuc2lnbmVkIGludAkJYmlfc2l6ZTsJLyogcmVzaWR1YWwgSS9PIGNvdW50ICovCisKKwl1bnNpZ25lZCBpbnQJCWJpX2lkeDsJCS8qIGN1cnJlbnQgaW5kZXggaW50byBidmxfdmVjICovCisKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBiaV9idmVjX2RvbmU7CS8qIG51bWJlciBvZiBieXRlcyBjb21wbGV0ZWQgaW4KKwkJCQkJCSAgIGN1cnJlbnQgYnZlYyAqLworfTsKKwogLyoKICAqIG1haW4gdW5pdCBvZiBJL08gZm9yIHRoZSBibG9jayBsYXllciBhbmQgbG93ZXIgbGF5ZXJzIChpZSBkcml2ZXJzIGFuZAogICogc3RhY2tpbmcgZHJpdmVycykKICAqLwogc3RydWN0IGJpbyB7Ci0Jc2VjdG9yX3QJCWJpX3NlY3RvcjsJLyogZGV2aWNlIGFkZHJlc3MgaW4gNTEyIGJ5dGUKLQkJCQkJCSAgIHNlY3RvcnMgKi8KIAlzdHJ1Y3QgYmlvCQkqYmlfbmV4dDsJLyogcmVxdWVzdCBxdWV1ZSBsaW5rICovCiAJc3RydWN0IGJsb2NrX2RldmljZQkqYmlfYmRldjsKIAl1bnNpZ25lZCBsb25nCQliaV9mbGFnczsJLyogc3RhdHVzLCBjb21tYW5kLCBldGMgKi8KQEAgLTQyLDE2ICs1MSwxMyBAQAogCQkJCQkJICogdG9wIGJpdHMgcHJpb3JpdHkKIAkJCQkJCSAqLwogCi0JdW5zaWduZWQgc2hvcnQJCWJpX3ZjbnQ7CS8qIGhvdyBtYW55IGJpb192ZWMncyAqLwotCXVuc2lnbmVkIHNob3J0CQliaV9pZHg7CQkvKiBjdXJyZW50IGluZGV4IGludG8gYnZsX3ZlYyAqLworCXN0cnVjdCBidmVjX2l0ZXIJYmlfaXRlcjsKIAogCS8qIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGlzIEJJTyBhZnRlcgogCSAqIHBoeXNpY2FsIGFkZHJlc3MgY29hbGVzY2luZyBpcyBwZXJmb3JtZWQuCiAJICovCiAJdW5zaWduZWQgaW50CQliaV9waHlzX3NlZ21lbnRzOwogCi0JdW5zaWduZWQgaW50CQliaV9zaXplOwkvKiByZXNpZHVhbCBJL08gY291bnQgKi8KLQogCS8qCiAJICogVG8ga2VlcCB0cmFjayBvZiB0aGUgbWF4IHNlZ21lbnQgc2l6ZSwgd2UgYWNjb3VudCBmb3IgdGhlCiAJICogc2l6ZXMgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IG1lcmdlYWJsZSBzZWdtZW50cyBpbiB0aGlzIGJpby4KQEAgLTU5LDYgKzY1LDggQEAKIAl1bnNpZ25lZCBpbnQJCWJpX3NlZ19mcm9udF9zaXplOwogCXVuc2lnbmVkIGludAkJYmlfc2VnX2JhY2tfc2l6ZTsKIAorCWF0b21pY190CQliaV9yZW1haW5pbmc7CisKIAliaW9fZW5kX2lvX3QJCSpiaV9lbmRfaW87CiAKIAl2b2lkCQkJKmJpX3ByaXZhdGU7CkBAIC03NCwxMSArODIsMTMgQEAKIAlzdHJ1Y3QgYmlvX2ludGVncml0eV9wYXlsb2FkICpiaV9pbnRlZ3JpdHk7ICAvKiBkYXRhIGludGVncml0eSAqLwogI2VuZGlmCiAKKwl1bnNpZ25lZCBzaG9ydAkJYmlfdmNudDsJLyogaG93IG1hbnkgYmlvX3ZlYydzICovCisKIAkvKgogCSAqIEV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBiaV9tYXhfdmVjcyB3aWxsIGJlIHByZXNlcnZlZCBieSBiaW9fcmVzZXQoKQogCSAqLwogCi0JdW5zaWduZWQgaW50CQliaV9tYXhfdmVjczsJLyogbWF4IGJ2bF92ZWNzIHdlIGNhbiBob2xkICovCisJdW5zaWduZWQgc2hvcnQJCWJpX21heF92ZWNzOwkvKiBtYXggYnZsX3ZlY3Mgd2UgY2FuIGhvbGQgKi8KIAogCWF0b21pY190CQliaV9jbnQ7CQkvKiBwaW4gY291bnQgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggMWIxMzVkNC4uODY3OGM0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC05NSwxMCArOTUsNyBAQAogICogYXMgd2VsbCEKICAqLwogc3RydWN0IHJlcXVlc3QgewotCXVuaW9uIHsKLQkJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWxpc3Q7Ci0JCXN0cnVjdCBsbGlzdF9ub2RlIGxsX2xpc3Q7Ci0JfTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlbGlzdDsKIAl1bmlvbiB7CiAJCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGNzZDsKIAkJc3RydWN0IHdvcmtfc3RydWN0IG1xX2ZsdXNoX2RhdGE7CkBAIC0yOTEsNiArMjg4LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQlkaXNjYXJkX21pc2FsaWduZWQ7CiAJdW5zaWduZWQgY2hhcgkJY2x1c3RlcjsKIAl1bnNpZ25lZCBjaGFyCQlkaXNjYXJkX3plcm9lc19kYXRhOworCXVuc2lnbmVkIGNoYXIJCXJhaWRfcGFydGlhbF9zdHJpcGVzX2V4cGVuc2l2ZTsKIH07CiAKIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKQEAgLTczNSw3ICs3MzMsNyBAQAogfTsKIAogc3RydWN0IHJlcV9pdGVyYXRvciB7Ci0JaW50IGk7CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXN0cnVjdCBiaW8gKmJpbzsKIH07CiAKQEAgLTc0OCwxMCArNzQ2LDExIEBACiAKICNkZWZpbmUgcnFfZm9yX2VhY2hfc2VnbWVudChidmwsIF9ycSwgX2l0ZXIpCQkJXAogCV9fcnFfZm9yX2VhY2hfYmlvKF9pdGVyLmJpbywgX3JxKQkJCVwKLQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBfaXRlci5iaW8sIF9pdGVyLmkpCisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2bCwgX2l0ZXIuYmlvLCBfaXRlci5pdGVyKQogCi0jZGVmaW5lIHJxX2l0ZXJfbGFzdChycSwgX2l0ZXIpCQkJCQlcCi0JCShfaXRlci5iaW8tPmJpX25leHQgPT0gTlVMTCAmJiBfaXRlci5pID09IF9pdGVyLmJpby0+YmlfdmNudC0xKQorI2RlZmluZSBycV9pdGVyX2xhc3QoYnZlYywgX2l0ZXIpCQkJCVwKKwkJKF9pdGVyLmJpby0+YmlfbmV4dCA9PSBOVUxMICYmCQkJXAorCQkgYmlvX2l0ZXJfbGFzdChidmVjLCBfaXRlci5pdGVyKSkKIAogI2lmbmRlZiBBUkNIX0lNUExFTUVOVFNfRkxVU0hfRENBQ0hFX1BBR0UKICMgZXJyb3IJIllvdSBzaG91bGQgZGVmaW5lIEFSQ0hfSU1QTEVNRU5UU19GTFVTSF9EQ0FDSEVfUEFHRSBmb3IgeW91ciBwbGF0Zm9ybSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oIGIvaW5jbHVkZS9saW51eC9ib290bWVtLmgKaW5kZXggYjM4ODIyMy4uZGI1MWZlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ib290bWVtLmgKKysrIGIvaW5jbHVkZS9saW51eC9ib290bWVtLmgKQEAgLTI2NCw3ICsyNjQsNyBAQAogewogCWlmICghYWxpZ24pCiAJCWFsaWduID0gU01QX0NBQ0hFX0JZVEVTOwotCXJldHVybiBfX2FsbG9jX2Jvb3RtZW1fbG93KHNpemUsIGFsaWduLCBCT09UTUVNX0xPV19MSU1JVCk7CisJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbV9sb3coc2l6ZSwgYWxpZ24sIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfdmlydF9hbGxvY19sb3dfbm9wYW5pYygKQEAgLTI3Miw3ICsyNzIsNyBAQAogewogCWlmICghYWxpZ24pCiAJCWFsaWduID0gU01QX0NBQ0hFX0JZVEVTOwotCXJldHVybiBfX2FsbG9jX2Jvb3RtZW1fbG93X25vcGFuaWMoc2l6ZSwgYWxpZ24sIEJPT1RNRU1fTE9XX0xJTUlUKTsKKwlyZXR1cm4gX19hbGxvY19ib290bWVtX2xvd19ub3BhbmljKHNpemUsIGFsaWduLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICogX19pbml0IG1lbWJsb2NrX3ZpcnRfYWxsb2NfZnJvbV9ub3BhbmljKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vc2tiLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaAppbmRleCAyZjA1NDNmLi5mOWJiYmI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaApAQCAtMTEsNyArMTEsOSBAQAogI2RlZmluZSBDQU5fU0tCX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogLyoKICAqIFRoZSBzdHJ1Y3QgY2FuX3NrYl9wcml2IGlzIHVzZWQgdG8gdHJhbnNwb3J0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWxvbmcKQEAgLTQyLDQgKzQ0LDQwIEBACiAJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IGNhbl9za2JfcHJpdikpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2FuX3NrYl9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc29ja19wdXQoc2tiLT5zayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYW5fc2tiX3NldF9vd25lcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKHNrKSB7CisJCXNvY2tfaG9sZChzayk7CisJCXNrYi0+ZGVzdHJ1Y3RvciA9IGNhbl9za2JfZGVzdHJ1Y3RvcjsKKwkJc2tiLT5zayA9IHNrOworCX0KK30KKworLyoKKyAqIHJldHVybnMgYW4gdW5zaGFyZWQgc2tiIG93bmVkIGJ5IHRoZSBvcmlnaW5hbCBzb2NrIHRvIGJlIGVjaG8nZWQgYmFjaworICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpjYW5fY3JlYXRlX2VjaG9fc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYl9zaGFyZWQoc2tiKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCisJCWlmIChsaWtlbHkobnNrYikpIHsKKwkJCWNhbl9za2Jfc2V0X293bmVyKG5za2IsIHNrYi0+c2spOworCQkJY29uc3VtZV9za2Ioc2tiKTsKKwkJCXJldHVybiBuc2tiOworCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIHdlIGNhbiBhc3N1bWUgdG8gaGF2ZSBhbiB1bnNoYXJlZCBza2Igd2l0aCBwcm9wZXIgb3duZXIgKi8KKwlyZXR1cm4gc2tiOworfQorCiAjZW5kaWYgLyogQ0FOX1NLQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmgKaW5kZXggMjBlZThiNi4uZDIxZjJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZXBoL21lc3Nlbmdlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9tZXNzZW5nZXIuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19GU19DRVBIX01FU1NFTkdFUl9ICiAjZGVmaW5lIF9fRlNfQ0VQSF9NRVNTRU5HRVJfSAogCisjaW5jbHVkZSA8bGludXgvYmxrX3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CkBAIC0xMTksOCArMTIwLDcgQEAKICNpZmRlZiBDT05GSUdfQkxPQ0sKIAkJc3RydWN0IHsJCQkJLyogYmlvICovCiAJCQlzdHJ1Y3QgYmlvCSpiaW87CQkvKiBiaW8gZnJvbSBsaXN0ICovCi0JCQl1bnNpZ25lZCBpbnQJdmVjdG9yX2luZGV4OwkvKiB2ZWN0b3IgZnJvbSBiaW8gKi8KLQkJCXVuc2lnbmVkIGludAl2ZWN0b3Jfb2Zmc2V0OwkvKiBieXRlcyBmcm9tIHZlY3RvciAqLworCQkJc3RydWN0IGJ2ZWNfaXRlciBidmVjX2l0ZXI7CiAJCX07CiAjZW5kaWYgLyogQ09ORklHX0JMT0NLICovCiAJCXN0cnVjdCB7CQkJCS8qIHBhZ2VzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oIGIvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaAppbmRleCA0NDhiMjI5Li45Mzk1MzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xrLXByb3ZpZGVyLmgKQEAgLTU0NCw2ICs1NDQsMjAgQEAKICAqIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zCiAgKi8KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX1BQQykKKworc3RhdGljIGlubGluZSB1MzIgY2xrX3JlYWRsKHUzMiBfX2lvbWVtICpyZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyYmUocmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsa193cml0ZWwodTMyIHZhbCwgdTMyIF9faW9tZW0gKnJlZykKK3sKKwlpb3dyaXRlMzJiZSh2YWwsIHJlZyk7Cit9CisKKyNlbHNlCS8qIHBsYXRmb3JtIGRlcGVuZGVudCBJL08gYWNjZXNzb3JzICovCisKIHN0YXRpYyBpbmxpbmUgdTMyIGNsa19yZWFkbCh1MzIgX19pb21lbSAqcmVnKQogewogCXJldHVybiByZWFkbChyZWcpOwpAQCAtNTU0LDUgKzU2OCw3IEBACiAJd3JpdGVsKHZhbCwgcmVnKTsKIH0KIAorI2VuZGlmCS8qIHBsYXRmb3JtIGRlcGVuZGVudCBJL08gYWNjZXNzb3JzICovCisKICNlbmRpZiAvKiBDT05GSUdfQ09NTU9OX0NMSyAqLwogI2VuZGlmIC8qIENMS19QUk9WSURFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NtZGxpbmUtcGFyc2VyLmggYi9pbmNsdWRlL2xpbnV4L2NtZGxpbmUtcGFyc2VyLmgKaW5kZXggYTBmOTI4MC4uMmU2ZGNlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbWRsaW5lLXBhcnNlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY21kbGluZS1wYXJzZXIuaApAQCAtMzcsOSArMzcsOSBAQAogc3RydWN0IGNtZGxpbmVfcGFydHMgKmNtZGxpbmVfcGFydHNfZmluZChzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqcGFydHMsCiAJCQkJCSBjb25zdCBjaGFyICpiZGV2KTsKIAotdm9pZCBjbWRsaW5lX3BhcnRzX3NldChzdHJ1Y3QgY21kbGluZV9wYXJ0cyAqcGFydHMsIHNlY3Rvcl90IGRpc2tfc2l6ZSwKLQkJICAgICAgIGludCBzbG90LAotCQkgICAgICAgaW50ICgqYWRkX3BhcnQpKGludCwgc3RydWN0IGNtZGxpbmVfc3VicGFydCAqLCB2b2lkICopLAotCQkgICAgICAgdm9pZCAqcGFyYW0pOworaW50IGNtZGxpbmVfcGFydHNfc2V0KHN0cnVjdCBjbWRsaW5lX3BhcnRzICpwYXJ0cywgc2VjdG9yX3QgZGlza19zaXplLAorCQkgICAgICBpbnQgc2xvdCwKKwkJICAgICAgaW50ICgqYWRkX3BhcnQpKGludCwgc3RydWN0IGNtZGxpbmVfc3VicGFydCAqLCB2b2lkICopLAorCQkgICAgICB2b2lkICpwYXJhbSk7CiAKICNlbmRpZiAvKiBDTURMSU5FUEFSU0VIICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaAppbmRleCBlYjhhNDlkLi4zZjQ0OGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKQEAgLTMyNywxNyArMzI3LDE3IEBACiAJCQkgICAgICB1MzIgYXJnMiwgdTMyIGFyZzMsIHUzMiBhcmc0LCB1MzIgYXJnNSk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c191c3RhdCh1bnNpZ25lZCBkZXYsIHN0cnVjdCBjb21wYXRfdXN0YXQgX191c2VyICp1MzIpOwogCi1hc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19yZWFkdih1bnNpZ25lZCBsb25nIGZkLAotCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdmVjLCB1bnNpZ25lZCBsb25nIHZsZW4pOwotYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsCi0JCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbik7Ci1hc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19wcmVhZHYodW5zaWduZWQgbG9uZyBmZCwKK2FzbWxpbmthZ2Ugc3NpemVfdCBjb21wYXRfc3lzX3JlYWR2KGNvbXBhdF91bG9uZ190IGZkLAorCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdmVjLCBjb21wYXRfdWxvbmdfdCB2bGVuKTsKK2FzbWxpbmthZ2Ugc3NpemVfdCBjb21wYXRfc3lzX3dyaXRldihjb21wYXRfdWxvbmdfdCBmZCwKKwkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywgY29tcGF0X3Vsb25nX3Qgdmxlbik7Cithc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19wcmVhZHYoY29tcGF0X3Vsb25nX3QgZmQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsCi0JCXVuc2lnbmVkIGxvbmcgdmxlbiwgdTMyIHBvc19sb3csIHUzMiBwb3NfaGlnaCk7Ci1hc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19wd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsCisJCWNvbXBhdF91bG9uZ190IHZsZW4sIHUzMiBwb3NfbG93LCB1MzIgcG9zX2hpZ2gpOworYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfcHdyaXRldihjb21wYXRfdWxvbmdfdCBmZCwKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywKLQkJdW5zaWduZWQgbG9uZyB2bGVuLCB1MzIgcG9zX2xvdywgdTMyIHBvc19oaWdoKTsKLWFzbWxpbmthZ2UgbG9uZyBjb21hdF9zeXNfbHNlZWsodW5zaWduZWQgaW50LCBjb21wYXRfb2ZmX3QsIHVuc2lnbmVkIGludCk7CisJCWNvbXBhdF91bG9uZ190IHZsZW4sIHUzMiBwb3NfbG93LCB1MzIgcG9zX2hpZ2gpOworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbHNlZWsodW5zaWduZWQgaW50LCBjb21wYXRfb2ZmX3QsIHVuc2lnbmVkIGludCk7CiAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2V4ZWN2ZShjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICphcmd2LAogCQkgICAgIGNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICplbnZwKTsKQEAgLTQyMiw3ICs0MjIsNyBAQAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGNvbXBhdF9sb25nX3QgcmVxdWVzdCwgY29tcGF0X2xvbmdfdCBwaWQsCiAJCQkJICBjb21wYXRfbG9uZ190IGFkZHIsIGNvbXBhdF9sb25nX3QgZGF0YSk7CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2xvb2t1cF9kY29va2llKHUzMiwgdTMyLCBjaGFyIF9fdXNlciAqLCBzaXplX3QpOworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbG9va3VwX2Rjb29raWUodTMyLCB1MzIsIGNoYXIgX191c2VyICosIGNvbXBhdF9zaXplX3QpOwogLyoKICAqIGVwb2xsIChmcy9ldmVudHBvbGwuYykgY29tcGF0IGJpdHMgZm9sbG93IC4uLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWlvLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvLmgKaW5kZXggZjRiMGFhMy4uYTY4Y2JlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1pby5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW8uaApAQCAtMjksNyArMjksNyBAQAogCiBlbnVtIGRtX2lvX21lbV90eXBlIHsKIAlETV9JT19QQUdFX0xJU1QsLyogUGFnZSBsaXN0ICovCi0JRE1fSU9fQlZFQywJLyogQmlvIHZlY3RvciAqLworCURNX0lPX0JJTywJLyogQmlvIHZlY3RvciAqLwogCURNX0lPX1ZNQSwJLyogVmlydHVhbCBtZW1vcnkgYXJlYSAqLwogCURNX0lPX0tNRU0sCS8qIEtlcm5lbCBtZW1vcnkgKi8KIH07CkBAIC00MSw3ICs0MSw3IEBACiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBwYWdlX2xpc3QgKnBsOwotCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwkJc3RydWN0IGJpbyAqYmlvOwogCQl2b2lkICp2bWE7CiAJCXZvaWQgKmFkZHI7CiAJfSBwdHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCmluZGV4IDU3YzlhOGEuLjdhYzE3ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCkBAIC0yNyw3ICsyNyw2IEBACiAKIAogI2lmZGVmIENPTkZJR19JTlRFTF9JT01NVQotZXh0ZXJuIHZvaWQgZnJlZV9kbWFyX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpOwogZXh0ZXJuIGludCBpb21tdV9jYWxjdWxhdGVfYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKIGV4dGVybiBpbnQgaW9tbXVfY2FsY3VsYXRlX21heF9zYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKIGV4dGVybiBpbnQgZG1hcl9kaXNhYmxlZDsKQEAgLTQxLDkgKzQwLDYgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2RtYXJfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLX0KICNkZWZpbmUgZG1hcl9kaXNhYmxlZAkoMSkKICNkZWZpbmUgaW50ZWxfaW9tbXVfZW5hYmxlZCAoMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKaW5kZXggNmZkOTM5MC4uYzVjOTJkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCkBAIC0yNTcsNyArMjU3LDcgQEAKICAqIEBkZXY6IGNsYXNzIGRldmljZSBmb3Igc3lzZnMKICAqIEBkZXZpY2Vfbm9kZTogdXNlZCB0byBhZGQgdGhpcyB0byB0aGUgZGV2aWNlIGNoYW4gbGlzdAogICogQGxvY2FsOiBwZXItY3B1IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZG1hX2NoYW5fcGVyY3B1Ci0gKiBAY2xpZW50LWNvdW50OiBob3cgbWFueSBjbGllbnRzIGFyZSB1c2luZyB0aGlzIGNoYW5uZWwKKyAqIEBjbGllbnRfY291bnQ6IGhvdyBtYW55IGNsaWVudHMgYXJlIHVzaW5nIHRoaXMgY2hhbm5lbAogICogQHRhYmxlX2NvdW50OiBudW1iZXIgb2YgYXBwZWFyYW5jZXMgaW4gdGhlIG1lbS10by1tZW0gYWxsb2NhdGlvbiB0YWJsZQogICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBmb3IgY2VydGFpbiBjbGllbnQtY2hhbm5lbCBhc3NvY2lhdGlvbnMKICAqLwpAQCAtMjc5LDEwICsyNzksMTAgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZG1hX2NoYW5fZGV2IC0gcmVsYXRlIHN5c2ZzIGRldmljZSBub2RlIHRvIGJhY2tpbmcgY2hhbm5lbCBkZXZpY2UKLSAqIEBjaGFuIC0gZHJpdmVyIGNoYW5uZWwgZGV2aWNlCi0gKiBAZGV2aWNlIC0gc3lzZnMgZGV2aWNlCi0gKiBAZGV2X2lkIC0gcGFyZW50IGRtYV9kZXZpY2UgZGV2X2lkCi0gKiBAaWRyX3JlZiAtIHJlZmVyZW5jZSBjb3VudCB0byBnYXRlIHJlbGVhc2Ugb2YgZG1hX2RldmljZSBkZXZfaWQKKyAqIEBjaGFuOiBkcml2ZXIgY2hhbm5lbCBkZXZpY2UKKyAqIEBkZXZpY2U6IHN5c2ZzIGRldmljZQorICogQGRldl9pZDogcGFyZW50IGRtYV9kZXZpY2UgZGV2X2lkCisgKiBAaWRyX3JlZjogcmVmZXJlbmNlIGNvdW50IHRvIGdhdGUgcmVsZWFzZSBvZiBkbWFfZGV2aWNlIGRldl9pZAogICovCiBzdHJ1Y3QgZG1hX2NoYW5fZGV2IHsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CkBAIC0zMDYsOSArMzA2LDggQEAKIC8qKgogICogc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgLSBkbWEgc2xhdmUgY2hhbm5lbCBydW50aW1lIGNvbmZpZwogICogQGRpcmVjdGlvbjogd2hldGhlciB0aGUgZGF0YSBzaGFsbCBnbyBpbiBvciBvdXQgb24gdGhpcyBzbGF2ZQotICogY2hhbm5lbCwgcmlnaHQgbm93LiBETUFfVE9fREVWSUNFIGFuZCBETUFfRlJPTV9ERVZJQ0UgYXJlCi0gKiBsZWdhbCB2YWx1ZXMsIERNQV9CSURJUkVDVElPTkFMIGlzIG5vdCBhY2NlcHRhYmxlIHNpbmNlIHdlCi0gKiBuZWVkIHRvIGRpZmZlcmVudGlhdGUgc291cmNlIGFuZCB0YXJnZXQgYWRkcmVzc2VzLgorICogY2hhbm5lbCwgcmlnaHQgbm93LiBETUFfTUVNX1RPX0RFViBhbmQgRE1BX0RFVl9UT19NRU0gYXJlCisgKiBsZWdhbCB2YWx1ZXMuCiAgKiBAc3JjX2FkZHI6IHRoaXMgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgRE1BIHNsYXZlIGRhdGEKICAqIHNob3VsZCBiZSByZWFkIChSWCksIGlmIHRoZSBzb3VyY2UgaXMgbWVtb3J5IHRoaXMgYXJndW1lbnQgaXMKICAqIGlnbm9yZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYXIuaCBiL2luY2x1ZGUvbGludXgvZG1hci5oCmluZGV4IGIwMjlkMWEuLmVjY2IwYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hci5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hci5oCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIERNQVJfWDJBUElDX09QVF9PVVQJMHgyCiAKIHN0cnVjdCBpbnRlbF9pb21tdTsKKwogI2lmZGVmIENPTkZJR19ETUFSX1RBQkxFCiBleHRlcm4gc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpkbWFyX3RibDsKIHN0cnVjdCBkbWFyX2RyaGRfdW5pdCB7CkBAIC01Miw2ICs1MywxMCBAQAogI2RlZmluZSBmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgXAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJoZCwgJmRtYXJfZHJoZF91bml0cywgbGlzdCkKIAorI2RlZmluZSBmb3JfZWFjaF9hY3RpdmVfZHJoZF91bml0KGRyaGQpCQkJCQlcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkcmhkLCAmZG1hcl9kcmhkX3VuaXRzLCBsaXN0KQkJXAorCQlpZiAoZHJoZC0+aWdub3JlZCkge30gZWxzZQorCiAjZGVmaW5lIGZvcl9lYWNoX2FjdGl2ZV9pb21tdShpLCBkcmhkKQkJCQkJXAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJoZCwgJmRtYXJfZHJoZF91bml0cywgbGlzdCkJCVwKIAkJaWYgKGk9ZHJoZC0+aW9tbXUsIGRyaGQtPmlnbm9yZWQpIHt9IGVsc2UKQEAgLTYyLDEzICs2NywxMyBAQAogCiBleHRlcm4gaW50IGRtYXJfdGFibGVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgZG1hcl9kZXZfc2NvcGVfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgZG1hcl9wYXJzZV9kZXZfc2NvcGUodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwgaW50ICpjbnQsCisJCQkJc3RydWN0IHBjaV9kZXYgKioqZGV2aWNlcywgdTE2IHNlZ21lbnQpOworZXh0ZXJuIHZvaWQgZG1hcl9mcmVlX2Rldl9zY29wZShzdHJ1Y3QgcGNpX2RldiAqKipkZXZpY2VzLCBpbnQgKmNudCk7CiAKIC8qIEludGVsIElPTU1VIGRldGVjdGlvbiAqLwogZXh0ZXJuIGludCBkZXRlY3RfaW50ZWxfaW9tbXUodm9pZCk7CiBleHRlcm4gaW50IGVuYWJsZV9kcmhkX2ZhdWx0X2hhbmRsaW5nKHZvaWQpOwotCi1leHRlcm4gaW50IHBhcnNlX2lvYXBpY3NfdW5kZXJfaXIodm9pZCk7Ci1leHRlcm4gaW50IGFsbG9jX2lvbW11KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBkZXRlY3RfaW50ZWxfaW9tbXUodm9pZCkKIHsKQEAgLTE1Nyw4ICsxNjIsNiBAQAogaW50IGRtYXJfcGFyc2Vfcm1ycl9hdHNyX2Rldih2b2lkKTsKIGV4dGVybiBpbnQgZG1hcl9wYXJzZV9vbmVfcm1ycihzdHJ1Y3QgYWNwaV9kbWFyX2hlYWRlciAqaGVhZGVyKTsKIGV4dGVybiBpbnQgZG1hcl9wYXJzZV9vbmVfYXRzcihzdHJ1Y3QgYWNwaV9kbWFyX2hlYWRlciAqaGVhZGVyKTsKLWV4dGVybiBpbnQgZG1hcl9wYXJzZV9kZXZfc2NvcGUodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwgaW50ICpjbnQsCi0JCQkJc3RydWN0IHBjaV9kZXYgKioqZGV2aWNlcywgdTE2IHNlZ21lbnQpOwogZXh0ZXJuIGludCBpbnRlbF9pb21tdV9pbml0KHZvaWQpOwogI2Vsc2UgLyogIUNPTkZJR19JTlRFTF9JT01NVTogKi8KIHN0YXRpYyBpbmxpbmUgaW50IGludGVsX2lvbW11X2luaXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IDcwYzQ4MzYuLmZlNmFjOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTYxMyw4ICs2MTMsOCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIGludCB1bmxpbmtfZnJhbWVidWZmZXIoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKLQkJCQljb25zdCBjaGFyICpuYW1lLCBib29sIHByaW1hcnkpOworZXh0ZXJuIGludCByZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKHN0cnVjdCBhcGVydHVyZXNfc3RydWN0ICphLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBib29sIHByaW1hcnkpOwogZXh0ZXJuIGludCBmYl9wcmVwYXJlX2xvZ28oc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIGludCByb3RhdGUpOwogZXh0ZXJuIGludCBmYl9zaG93X2xvZ28oc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIGludCByb3RhdGUpOwogZXh0ZXJuIGNoYXIqIGZiX2dldF9idWZmZXJfb2Zmc2V0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfcGl4bWFwICpidWYsIHUzMiBzaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAwOWY1NTNjLi42MDgyOTU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yMDc5LDYgKzIwNzksNyBAQAogZXh0ZXJuIGludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICosIGZsX293bmVyX3QgaWQpOwogCiBleHRlcm4gc3RydWN0IGZpbGVuYW1lICpnZXRuYW1lKGNvbnN0IGNoYXIgX191c2VyICopOworZXh0ZXJuIHN0cnVjdCBmaWxlbmFtZSAqZ2V0bmFtZV9rZXJuZWwoY29uc3QgY2hhciAqKTsKIAogZW51bSB7CiAJRklMRV9DUkVBVEVEID0gMSwKQEAgLTIyNzMsNyArMjI3NCwxMyBAQAogZXh0ZXJuIGludCB2ZnNfZnN5bmNfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKIAkJCSAgIGludCBkYXRhc3luYyk7CiBleHRlcm4gaW50IHZmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKTsKLWV4dGVybiBpbnQgZ2VuZXJpY193cml0ZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpOworc3RhdGljIGlubGluZSBpbnQgZ2VuZXJpY193cml0ZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpCit7CisJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpICYmICFJU19TWU5DKGZpbGUtPmZfbWFwcGluZy0+aG9zdCkpCisJCXJldHVybiAwOworCXJldHVybiB2ZnNfZnN5bmNfcmFuZ2UoZmlsZSwgcG9zLCBwb3MgKyBjb3VudCAtIDEsCisJCQkgICAgICAgKGZpbGUtPmZfZmxhZ3MgJiBfX09fU1lOQykgPyAwIDogMSk7Cit9CiBleHRlcm4gdm9pZCBlbWVyZ2VuY3lfc3luYyh2b2lkKTsKIGV4dGVybiB2b2lkIGVtZXJnZW5jeV9yZW1vdW50KHZvaWQpOwogI2lmZGVmIENPTkZJR19CTE9DSwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaAppbmRleCA3ZDhkNWU2Li4zZDI4NmZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaApAQCAtMzIyLDEwICszMjIsMTAgQEAKIGV4dGVybiB2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKIAkJCQkgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KTsKIC8qIGF0dGFjaCB0aGUgZXZlbnQgdG8gdGhlIGdyb3VwIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLwotZXh0ZXJuIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNub3RpZnlfYWRkX25vdGlmeV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLAotCQkJCQkJCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQsCi0JCQkJCQkJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICooKm1lcmdlKShzdHJ1Y3QgbGlzdF9oZWFkICosCi0JCQkJCQkJCQkJCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqKSk7CitleHRlcm4gaW50IGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKKwkJCQkgICAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQsCisJCQkJICAgICBpbnQgKCptZXJnZSkoc3RydWN0IGxpc3RfaGVhZCAqLAorCQkJCQkJICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKikpOwogLyogdHJ1ZSBpZiB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlIGlzIGVtcHR5ICovCiBleHRlcm4gYm9vbCBmc25vdGlmeV9ub3RpZnlfcXVldWVfaXNfZW1wdHkoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiByZXR1cm4sIGJ1dCBkbyBub3QgZGVxdWV1ZSB0aGUgZmlyc3QgZXZlbnQgb24gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ob3N0MXguaCBiL2luY2x1ZGUvbGludXgvaG9zdDF4LmgKaW5kZXggZjViOWI4Ny4uM2FmODQ3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ob3N0MXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2hvc3QxeC5oCkBAIC0yODEsNCArMjgxLDEwIEBACiBpbnQgaG9zdDF4X2NsaWVudF9yZWdpc3RlcihzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KTsKIGludCBob3N0MXhfY2xpZW50X3VucmVnaXN0ZXIoc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCk7CiAKK3N0cnVjdCB0ZWdyYV9taXBpX2RldmljZTsKKworc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICp0ZWdyYV9taXBpX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3ZvaWQgdGVncmFfbWlwaV9mcmVlKHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqZGV2aWNlKTsKK2ludCB0ZWdyYV9taXBpX2NhbGlicmF0ZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtc21idXMuaCBiL2luY2x1ZGUvbGludXgvaTJjLXNtYnVzLmgKaW5kZXggMDE3ZmI0MC4uOGYxYjA4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtc21idXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1zbWJ1cy5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGkyYy1zbWJ1cy5oIC0gU01CdXMgZXh0ZW5zaW9ucyB0byB0aGUgSTJDIHByb3RvY29sCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IGQ5YzhkYmQzLi5kZWRkZWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTM0MiwxMSArMzQyLDI1IEBACiB9CiAjZW5kaWYgLyogSTJDX0JPQVJESU5GTyAqLwogCi0vKgorLyoqCisgKiBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAtIHJlcHJlc2VudCBJMkMgdHJhbnNmZXIgbWV0aG9kCisgKiBAbWFzdGVyX3hmZXI6IElzc3VlIGEgc2V0IG9mIGkyYyB0cmFuc2FjdGlvbnMgdG8gdGhlIGdpdmVuIEkyQyBhZGFwdGVyCisgKiAgIGRlZmluZWQgYnkgdGhlIG1zZ3MgYXJyYXksIHdpdGggbnVtIG1lc3NhZ2VzIGF2YWlsYWJsZSB0byB0cmFuc2ZlciB2aWEKKyAqICAgdGhlIGFkYXB0ZXIgc3BlY2lmaWVkIGJ5IGFkYXAuCisgKiBAc21idXNfeGZlcjogSXNzdWUgc21idXMgdHJhbnNhY3Rpb25zIHRvIHRoZSBnaXZlbiBJMkMgYWRhcHRlci4gSWYgdGhpcworICogICBpcyBub3QgcHJlc2VudCwgdGhlbiB0aGUgYnVzIGxheWVyIHdpbGwgdHJ5IGFuZCBjb252ZXJ0IHRoZSBTTUJ1cyBjYWxscworICogICBpbnRvIEkyQyB0cmFuc2ZlcnMgaW5zdGVhZC4KKyAqIEBmdW5jdGlvbmFsaXR5OiBSZXR1cm4gdGhlIGZsYWdzIHRoYXQgdGhpcyBhbGdvcml0aG0vYWRhcHRlciBwYWlyIHN1cHBvcnRzCisgKiAgIGZyb20gdGhlIEkyQ19GVU5DXyogZmxhZ3MuCisgKgogICogVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBmb3IgdGhvc2Ugd2hvIGxpa2UgdG8gaW1wbGVtZW50IG5ldyBidXMgZHJpdmVyczoKICAqIGkyY19hbGdvcml0aG0gaXMgdGhlIGludGVyZmFjZSB0byBhIGNsYXNzIG9mIGhhcmR3YXJlIHNvbHV0aW9ucyB3aGljaCBjYW4KICAqIGJlIGFkZHJlc3NlZCB1c2luZyB0aGUgc2FtZSBidXMgYWxnb3JpdGhtcyAtIGkuZS4gYml0LWJhbmdpbmcgb3IgdGhlIFBDRjg1ODQKICAqIHRvIG5hbWUgdHdvIG9mIHRoZSBtb3N0IGNvbW1vbi4KKyAqCisgKiBUaGUgcmV0dXJuIGNvZGVzIGZyb20gdGhlIEBtYXN0ZXJfeGZlciBmaWVsZCBzaG91bGQgaW5kaWNhdGUgdGhlIHR5cGUgb2YKKyAqIGVycm9yIGNvZGUgdGhhdCBvY2N1cmVkIGR1cmluZyB0aGUgdHJhbnNmZXIsIGFzIGRvY3VtZW50ZWQgaW4gdGhlIGtlcm5lbAorICogRG9jdW1lbnRhdGlvbiBmaWxlIERvY3VtZW50YXRpb24vaTJjL2ZhdWx0LWNvZGVzLgogICovCiBzdHJ1Y3QgaTJjX2FsZ29yaXRobSB7CiAJLyogSWYgYW4gYWRhcHRlciBhbGdvcml0aG0gY2FuJ3QgZG8gSTJDLWxldmVsIGFjY2Vzcywgc2V0IG1hc3Rlcl94ZmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVsLWlvbW11LmggYi9pbmNsdWRlL2xpbnV4L2ludGVsLWlvbW11LmgKaW5kZXggZDM4MGM1ZS4uMmM0YmVkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlbC1pb21tdS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZWwtaW9tbXUuaApAQCAtMjg4LDYgKzI4OCw3IEBACiAKIHN0cnVjdCBpcl90YWJsZSB7CiAJc3RydWN0IGlydGUgKmJhc2U7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwOwogfTsKICNlbmRpZgogCkBAIC0zNDcsOCArMzQ4LDYgQEAKIGV4dGVybiBzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKiBkbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IGRtYXJfZmluZF9tYXRjaGVkX2F0c3JfdW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAotZXh0ZXJuIGludCBhbGxvY19pb21tdShzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQpOwotZXh0ZXJuIHZvaWQgZnJlZV9pb21tdShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKIGV4dGVybiBpbnQgZG1hcl9lbmFibGVfcWkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CiBleHRlcm4gdm9pZCBkbWFyX2Rpc2FibGVfcWkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CiBleHRlcm4gaW50IGRtYXJfcmVlbmFibGVfcWkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvbW11LmggYi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKaW5kZXggYTQ0NGM3OS4uYjk2YTViMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb21tdS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9tbXUuaApAQCAtMjQsOSArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9pb21tdS5oPgogCi0jZGVmaW5lIElPTU1VX1JFQUQJKDEpCi0jZGVmaW5lIElPTU1VX1dSSVRFCSgyKQotI2RlZmluZSBJT01NVV9DQUNIRQkoNCkgLyogRE1BIGNhY2hlIGNvaGVyZW5jeSAqLworI2RlZmluZSBJT01NVV9SRUFECSgxIDw8IDApCisjZGVmaW5lIElPTU1VX1dSSVRFCSgxIDw8IDEpCisjZGVmaW5lIElPTU1VX0NBQ0hFCSgxIDw8IDIpIC8qIERNQSBjYWNoZSBjb2hlcmVuY3kgKi8KKyNkZWZpbmUgSU9NTVVfRVhFQwkoMSA8PCAzKQogCiBzdHJ1Y3QgaW9tbXVfb3BzOwogc3RydWN0IGlvbW11X2dyb3VwOwpAQCAtMjQ3LDYgKzI0OCwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV9ncm91cCAqaW9tbXVfZ3JvdXBfZ2V0X2J5X2lkKGludCBpZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGlvbW11X2RvbWFpbl9mcmVlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKIHsKIH0KQEAgLTI5MSw4ICsyOTcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkb21haW5faGFzX2NhcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCi0JCQkJIHVuc2lnbmVkIGxvbmcgY2FwKQorc3RhdGljIGlubGluZSBpbnQgaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNhcCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oIGIvaW5jbHVkZS9saW51eC9qaWZmaWVzLmgKaW5kZXggZDIzNWU4OC4uMWY0NDQ2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9qaWZmaWVzLmgKQEAgLTI5NCw2ICsyOTQsMTIgQEAKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaik7CiBleHRlcm4gdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKTsKKworc3RhdGljIGlubGluZSB1NjQgamlmZmllc190b19uc2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisJcmV0dXJuICh1NjQpamlmZmllc190b191c2VjcyhqKSAqIE5TRUNfUEVSX1VTRUM7Cit9CisKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1zZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IG0pOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgdSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lc3BlY190b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZ2RiLmggYi9pbmNsdWRlL2xpbnV4L2tnZGIuaAppbmRleCBkZmI0ZjJmLi42YjA2ZDM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tnZGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tnZGIuaApAQCAtMzEwLDcgKzMxMCw4IEBACiBrZ2RiX2hhbmRsZV9leGNlcHRpb24oaW50IGV4X3ZlY3RvciwgaW50IHNpZ25vLCBpbnQgZXJyX2NvZGUsCiAJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQga2dkYl9ubWljYWxsYmFjayhpbnQgY3B1LCB2b2lkICpyZWdzKTsKLWV4dGVybiBpbnQga2dkYl9ubWljYWxsaW4oaW50IGNwdSwgaW50IHRyYXBuciwgdm9pZCAqcmVncywgYXRvbWljX3QgKnNuZF9yZHkpOworZXh0ZXJuIGludCBrZ2RiX25taWNhbGxpbihpbnQgY3B1LCBpbnQgdHJhcG5yLCB2b2lkICpyZWdzLCBpbnQgZXJyX2NvZGUsCisJCQkgIGF0b21pY190ICpzbmRfcmR5KTsKIGV4dGVybiB2b2lkIGdkYnN0dWJfZXhpdChpbnQgc3RhdHVzKTsKIAogZXh0ZXJuIGludAkJCWtnZGJfc2luZ2xlX3N0ZXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaCBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCmluZGV4IGQzZThhZDIuLmE2YTQyZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCkBAIC02LDYgKzYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbGlua2FnZS5oPgogCisvKiBTb21lIHRvb2xjaGFpbnMgdXNlIG90aGVyIGNoYXJhY3RlcnMgKGUuZy4gJ2AnKSB0byBtYXJrIG5ldyBsaW5lIGluIG1hY3JvICovCisjaWZuZGVmIEFTTV9OTAorI2RlZmluZSBBU01fTkwJCSA7CisjZW5kaWYKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiAjZGVmaW5lIENQUF9BU01MSU5LQUdFIGV4dGVybiAiQyIKICNlbHNlCkBAIC03NSwyMSArODAsMjEgQEAKIAogI2lmbmRlZiBFTlRSWQogI2RlZmluZSBFTlRSWShuYW1lKSBcCi0gIC5nbG9ibCBuYW1lOyBcCi0gIEFMSUdOOyBcCi0gIG5hbWU6CisJLmdsb2JsIG5hbWUgQVNNX05MIFwKKwlBTElHTiBBU01fTkwgXAorCW5hbWU6CiAjZW5kaWYKICNlbmRpZiAvKiBMSU5LRVJfU0NSSVBUICovCiAKICNpZm5kZWYgV0VBSwogI2RlZmluZSBXRUFLKG5hbWUpCSAgIFwKLQkud2VhayBuYW1lOwkgICBcCisJLndlYWsgbmFtZSBBU01fTkwgICBcCiAJbmFtZToKICNlbmRpZgogCiAjaWZuZGVmIEVORAogI2RlZmluZSBFTkQobmFtZSkgXAotICAuc2l6ZSBuYW1lLCAuLW5hbWUKKwkuc2l6ZSBuYW1lLCAuLW5hbWUKICNlbmRpZgogCiAvKiBJZiBzeW1ib2wgJ25hbWUnIGlzIHRyZWF0ZWQgYXMgYSBzdWJyb3V0aW5lIChnZXRzIGNhbGxlZCwgYW5kIHJldHVybnMpCkBAIC05OCw4ICsxMDMsOCBAQAogICovCiAjaWZuZGVmIEVORFBST0MKICNkZWZpbmUgRU5EUFJPQyhuYW1lKSBcCi0gIC50eXBlIG5hbWUsIEBmdW5jdGlvbjsgXAotICBFTkQobmFtZSkKKwkudHlwZSBuYW1lLCBAZnVuY3Rpb24gQVNNX05MIFwKKwlFTkQobmFtZSkKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDJiMDA2MjUuLjBhZTU4MDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMjExLDYgKzIxMSw3IEBACiAjZGVmaW5lIE5GU19JTk9fQURWSVNFX1JEUExVUwkoMCkJCS8qIGFkdmlzZSByZWFkZGlycGx1cyAqLwogI2RlZmluZSBORlNfSU5PX1NUQUxFCQkoMSkJCS8qIHBvc3NpYmxlIHN0YWxlIGlub2RlICovCiAjZGVmaW5lIE5GU19JTk9fQUNMX0xSVV9TRVQJKDIpCQkvKiBJbm9kZSBpcyBvbiB0aGUgTFJVIGxpc3QgKi8KKyNkZWZpbmUgTkZTX0lOT19JTlZBTElEQVRJTkcJKDMpCQkvKiBpbm9kZSBpcyBiZWluZyBpbnZhbGlkYXRlZCAqLwogI2RlZmluZSBORlNfSU5PX0ZMVVNISU5HCSg0KQkJLyogaW5vZGUgaXMgZmx1c2hpbmcgb3V0IGRhdGEgKi8KICNkZWZpbmUgTkZTX0lOT19GU0NBQ0hFCQkoNSkJCS8qIGlub2RlIGNhbiBiZSBjYWNoZWQgYnkgRlMtQ2FjaGUgKi8KICNkZWZpbmUgTkZTX0lOT19GU0NBQ0hFX0xPQ0sJKDYpCQkvKiBGUy1DYWNoZSBjb29raWUgbWFuYWdlbWVudCBsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaCBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCmluZGV4IDNjY2ZjZWMuLmIyZmIxNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCkBAIC0zNzksMTIgKzM3OSwxNCBAQAogICogQXJndW1lbnRzIHRvIHRoZSBvcGVuX2NvbmZpcm0gY2FsbC4KICAqLwogc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzIHsKKwlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzCXNlcV9hcmdzOwogCWNvbnN0IHN0cnVjdCBuZnNfZmggKglmaDsKIAluZnM0X3N0YXRlaWQgKgkJc3RhdGVpZDsKIAlzdHJ1Y3QgbmZzX3NlcWlkICoJc2VxaWQ7CiB9OwogCiBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybXJlcyB7CisJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzCXNlcV9yZXM7CiAJbmZzNF9zdGF0ZWlkICAgICAgICAgICAgc3RhdGVpZDsKIAlzdHJ1Y3QgbmZzX3NlcWlkICoJc2VxaWQ7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9udm1lLmggYi9pbmNsdWRlL2xpbnV4L252bWUuaAppbmRleCAyNmViY2Y0Li42OWFlMDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L252bWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L252bWUuaApAQCAtODAsMTMgKzgwLDE0IEBACiAJc3RydWN0IGRtYV9wb29sICpwcnBfc21hbGxfcG9vbDsKIAlpbnQgaW5zdGFuY2U7CiAJaW50IHF1ZXVlX2NvdW50OwotCWludCBkYl9zdHJpZGU7CisJdTMyIGRiX3N0cmlkZTsKIAl1MzIgY3RybF9jb25maWc7CiAJc3RydWN0IG1zaXhfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBudm1lX2JhciBfX2lvbWVtICpiYXI7CiAJc3RydWN0IGxpc3RfaGVhZCBuYW1lc3BhY2VzOwogCXN0cnVjdCBrcmVmIGtyZWY7CiAJc3RydWN0IG1pc2NkZXZpY2UgbWlzY2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKIAljaGFyIG5hbWVbMTJdOwogCWNoYXIgc2VyaWFsWzIwXTsKIAljaGFyIG1vZGVsWzQwXTsKQEAgLTk0LDYgKzk1LDggQEAKIAl1MzIgbWF4X2h3X3NlY3RvcnM7CiAJdTMyIHN0cmlwZV9zaXplOwogCXUxNiBvbmNzOworCXUxNiBhYm9ydF9saW1pdDsKKwl1OCBpbml0aWFsaXplZDsKIH07CiAKIC8qCkBAIC0xNjUsNiArMTY4LDcgQEAKIHN0cnVjdCBzZ19pb19oZHI7CiAKIGludCBudm1lX3NnX2lvKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IHNnX2lvX2hkciBfX3VzZXIgKnVfaGRyKTsKK2ludCBudm1lX3NnX2lvMzIoc3RydWN0IG52bWVfbnMgKm5zLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBpbnQgbnZtZV9zZ19nZXRfdmVyc2lvbl9udW0oaW50IF9fdXNlciAqaXApOwogCiAjZW5kaWYgLyogX0xJTlVYX05WTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCBlNDY0YjRlLi5kMWZlMWE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMjI4LDkgKzIyOCw5IEBACiBURVNUUEFHRUZMQUcoV3JpdGViYWNrLCB3cml0ZWJhY2spIFRFU1RTQ0ZMQUcoV3JpdGViYWNrLCB3cml0ZWJhY2spCiBQQUdFRkxBRyhNYXBwZWRUb0Rpc2ssIG1hcHBlZHRvZGlzaykKIAotLyogUEdfcmVhZGFoZWFkIGlzIG9ubHkgdXNlZCBmb3IgZmlsZSByZWFkczsgUEdfcmVjbGFpbSBpcyBvbmx5IGZvciB3cml0ZXMgKi8KKy8qIFBHX3JlYWRhaGVhZCBpcyBvbmx5IHVzZWQgZm9yIHJlYWRzOyBQR19yZWNsYWltIGlzIG9ubHkgZm9yIHdyaXRlcyAqLwogUEFHRUZMQUcoUmVjbGFpbSwgcmVjbGFpbSkgVEVTVENMRUFSRkxBRyhSZWNsYWltLCByZWNsYWltKQotUEFHRUZMQUcoUmVhZGFoZWFkLCByZWNsYWltKQkJLyogUmVtaW5kZXIgdG8gZG8gYXN5bmMgcmVhZC1haGVhZCAqLworUEFHRUZMQUcoUmVhZGFoZWFkLCByZWNsYWltKSBURVNUQ0xFQVJGTEFHKFJlYWRhaGVhZCwgcmVjbGFpbSkKIAogI2lmZGVmIENPTkZJR19ISUdITUVNCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHVfaWRhLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9pZGEuaAppbmRleCAxOTAwYmQwLi5mNWNmZGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9pZGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9pZGEuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTYxLDcgKzYyLDcgQEAKIC8qIE1heCBzaXplIG9mIHBlcmNwdSBmcmVlbGlzdCwgKi8KICNkZWZpbmUgSURBX0RFRkFVTFRfUENQVV9TSVpFCSgoSURBX0RFRkFVTFRfUENQVV9CQVRDSF9NT1ZFICogMykgLyAyKQogCi1pbnQgcGVyY3B1X2lkYV9hbGxvYyhzdHJ1Y3QgcGVyY3B1X2lkYSAqcG9vbCwgZ2ZwX3QgZ2ZwKTsKK2ludCBwZXJjcHVfaWRhX2FsbG9jKHN0cnVjdCBwZXJjcHVfaWRhICpwb29sLCBpbnQgc3RhdGUpOwogdm9pZCBwZXJjcHVfaWRhX2ZyZWUoc3RydWN0IHBlcmNwdV9pZGEgKnBvb2wsIHVuc2lnbmVkIHRhZyk7CiAKIHZvaWQgcGVyY3B1X2lkYV9kZXN0cm95KHN0cnVjdCBwZXJjcHVfaWRhICpwb29sKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtaW14LXNkbWEuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtaW14LXNkbWEuaAppbmRleCAzYTM5NDI4Li5lYWJhYzRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWlteC1zZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1pbXgtc2RtYS5oCkBAIC00Myw2ICs0MywxMSBAQAogCXMzMiBkcHRjX2R2ZnNfYWRkcjsKIAlzMzIgdXRyYV9hZGRyOwogCXMzMiByYW1fY29kZV9zdGFydF9hZGRyOworCS8qIEVuZCBvZiB2MSBhcnJheSAqLworCXMzMiBtY3VfMl9zc2lzaF9hZGRyOworCXMzMiBzc2lzaF8yX21jdV9hZGRyOworCXMzMiBoZG1pX2RtYV9hZGRyOworCS8qIEVuZCBvZiB2MiBhcnJheSAqLwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWlteC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1pbXguaAppbmRleCBiZWFjNmI4Li5iY2JjNmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWlteC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtaW14LmgKQEAgLTM5LDYgKzM5LDcgQEAKIAlJTVhfRE1BVFlQRV9JUFVfTUVNT1JZLAkvKiBJUFUgTWVtb3J5ICovCiAJSU1YX0RNQVRZUEVfQVNSQywJLyogQVNSQyAqLwogCUlNWF9ETUFUWVBFX0VTQUksCS8qIEVTQUkgKi8KKwlJTVhfRE1BVFlQRV9TU0lfRFVBTCwJLyogU1NJIER1YWwgRklGTyAqLwogfTsKIAogZW51bSBpbXhfZG1hX3ByaW8gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tbXBfdGRtYS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tbXBfdGRtYS5oCmluZGV4IDIzOWUwZmMuLjY2NTc0ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbW1wX3RkbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLW1tcF90ZG1hLmgKQEAgLTEsNiArMSw0IEBACiAvKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9zcmFtLmgKLSAqCiAgKiAgU1JBTSBNZW1vcnkgTWFuYWdlbWVudAogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEgTWFydmVsbCBTZW1pY29uZHVjdG9ycyBJbmMuCkBAIC0xMSw4ICs5LDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfX0FTTV9BUkNIX1NSQU1fSAotI2RlZmluZSBfX0FTTV9BUkNIX1NSQU1fSAorI2lmbmRlZiBfX0RNQV9NTVBfVERNQV9ICisjZGVmaW5lIF9fRE1BX01NUF9URE1BX0gKIAogI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CiAKQEAgLTMyLDQgKzMwLDQgQEAKIAogZXh0ZXJuIHN0cnVjdCBnZW5fcG9vbCAqc3JhbV9nZXRfZ3Bvb2woY2hhciAqcG9vbF9uYW1lKTsKIAotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1JBTV9IICovCisjZW5kaWYgLyogX19ETUFfTU1QX1RETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tdl94b3IuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbXZfeG9yLmgKaW5kZXggOGVjMThmNi4uOTJmZmQzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tdl94b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLW12X3hvci5oCkBAIC0xLDExICsxLDkgQEAKIC8qCi0gKiBhcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9tdl94b3IuaAotICoKICAqIE1hcnZlbGwgWE9SIHBsYXRmb3JtIGRldmljZSBkYXRhIGRlZmluaXRpb24gZmlsZS4KICAqLwogCi0jaWZuZGVmIF9fUExBVF9NVl9YT1JfSAotI2RlZmluZSBfX1BMQVRfTVZfWE9SX0gKKyNpZm5kZWYgX19ETUFfTVZfWE9SX0gKKyNkZWZpbmUgX19ETUFfTVZfWE9SX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS92c3AxLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvdnNwMS5oCmluZGV4IGE3M2E0NTYuLjYzMTcwZTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvdnNwMS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS92c3AxLmgKQEAgLTE0LDYgKzE0LDggQEAKICNkZWZpbmUgX19QTEFURk9STV9WU1AxX0hfXwogCiAjZGVmaW5lIFZTUDFfSEFTX0xJRgkJKDEgPDwgMCkKKyNkZWZpbmUgVlNQMV9IQVNfTFVUCQkoMSA8PCAxKQorI2RlZmluZSBWU1AxX0hBU19TUlUJCSgxIDw8IDIpCiAKIHN0cnVjdCB2c3AxX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGludCBmZWF0dXJlczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcndzZW0uaCBiL2luY2x1ZGUvbGludXgvcndzZW0uaAppbmRleCAwNjE2ZmZlLi4wM2YzYjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J3c2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9yd3NlbS5oCkBAIC03NSw2ICs3NSwxNyBAQAogfSB3aGlsZSAoMCkKIAogLyoKKyAqIFRoaXMgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGljaCByd3NlbSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGJlaW5nIHVzZWQuCisgKiBJdCBpcyBqdXN0IGEgaGV1cmlzdGljIG1lYW50IHRvIGJlIGNhbGxlZCBieSBzb21lYm9keSBhbHJlYWR5aW5nIGhvbGRpbmcgdGhlCisgKiByd3NlbSB0byBzZWUgaWYgc29tZWJvZHkgZnJvbSBhbiBpbmNvbXBhdGlibGUgdHlwZSBpcyB3YW50aW5nIGFjY2VzcyB0byB0aGUKKyAqIGxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ3c2VtX2lzX2NvbnRlbmRlZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZzZW0tPndhaXRfbGlzdCk7Cit9CisKKy8qCiAgKiBsb2NrIGZvciByZWFkaW5nCiAgKi8KIGV4dGVybiB2b2lkIGRvd25fcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDY4YTBlODQuLmE3ODFkZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTEyOCw2ICsxMjgsNyBAQAogc3RydWN0IGZzX3N0cnVjdDsKIHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQ7CiBzdHJ1Y3QgYmxrX3BsdWc7CitzdHJ1Y3QgZmlsZW5hbWU7CiAKIC8qCiAgKiBMaXN0IG9mIGZsYWdzIHdlIHdhbnQgdG8gc2hhcmUgZm9yIGtlcm5lbCB0aHJlYWRzLApAQCAtMjMxMSw3ICsyMzEyLDcgQEAKIGV4dGVybiBpbnQgYWxsb3dfc2lnbmFsKGludCk7CiBleHRlcm4gaW50IGRpc2FsbG93X3NpZ25hbChpbnQpOwogCi1leHRlcm4gaW50IGRvX2V4ZWN2ZShjb25zdCBjaGFyICosCitleHRlcm4gaW50IGRvX2V4ZWN2ZShzdHJ1Y3QgZmlsZW5hbWUgKiwKIAkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqIGNvbnN0IF9fdXNlciAqLAogCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICogY29uc3QgX191c2VyICopOwogZXh0ZXJuIGxvbmcgZG9fZm9yayh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQgX191c2VyICosIGludCBfX3VzZXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zeXNjdGwuaAppbmRleCBiMTNjZjQzLi44MDQ1YTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc3lzY3RsLmgKQEAgLTUsNyArNSw3IEBACiBleHRlcm4gaW50CSAgICAgc3lzY3RsX2h1bmdfdGFza19jaGVja19jb3VudDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgIHN5c2N0bF9odW5nX3Rhc2tfcGFuaWM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNjdGxfaHVuZ190YXNrX3RpbWVvdXRfc2VjczsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3M7CitleHRlcm4gaW50IHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3M7CiBleHRlcm4gaW50IHByb2NfZG9odW5nX3Rhc2tfdGltZW91dF9zZWNzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfYmNtNjN4eC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfYmNtNjN4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGU5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpZm5kZWYgX0xJTlVYX1NFUklBTF9CQ002M1hYX0gKKyNkZWZpbmUgX0xJTlVYX1NFUklBTF9CQ002M1hYX0gKKworLyogVUFSVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ1RMX1JFRwkJCTB4MAorI2RlZmluZSBVQVJUX0NUTF9SWFRNT1VUQ05UX1NISUZUCTAKKyNkZWZpbmUgVUFSVF9DVExfUlhUTU9VVENOVF9NQVNLCSgweDFmIDw8IFVBUlRfQ1RMX1JYVE1PVVRDTlRfU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1JTVFRYRE5fU0hJRlQJCTUKKyNkZWZpbmUgVUFSVF9DVExfUlNUVFhETl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9SU1RUWEROX1NISUZUKQorI2RlZmluZSBVQVJUX0NUTF9SU1RSWEZJRk9fU0hJRlQJCTYKKyNkZWZpbmUgVUFSVF9DVExfUlNUUlhGSUZPX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1JTVFJYRklGT19TSElGVCkKKyNkZWZpbmUgVUFSVF9DVExfUlNUVFhGSUZPX1NISUZUCQk3CisjZGVmaW5lIFVBUlRfQ1RMX1JTVFRYRklGT19NQVNLCQkoMSA8PCBVQVJUX0NUTF9SU1RUWEZJRk9fU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1NUT1BCSVRTX1NISUZUCQk4CisjZGVmaW5lIFVBUlRfQ1RMX1NUT1BCSVRTX01BU0sJCSgweGYgPDwgVUFSVF9DVExfU1RPUEJJVFNfU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1NUT1BCSVRTXzEJCSgweDcgPDwgVUFSVF9DVExfU1RPUEJJVFNfU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1NUT1BCSVRTXzIJCSgweGYgPDwgVUFSVF9DVExfU1RPUEJJVFNfU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX0JJVFNQRVJTWU1fU0hJRlQJMTIKKyNkZWZpbmUgVUFSVF9DVExfQklUU1BFUlNZTV9NQVNLCSgweDMgPDwgVUFSVF9DVExfQklUU1BFUlNZTV9TSElGVCkKKyNkZWZpbmUgVUFSVF9DVExfWE1JVEJSS19TSElGVAkJMTQKKyNkZWZpbmUgVUFSVF9DVExfWE1JVEJSS19NQVNLCQkoMSA8PCBVQVJUX0NUTF9YTUlUQlJLX1NISUZUKQorI2RlZmluZSBVQVJUX0NUTF9SU1ZEX1NISUZUCQkxNQorI2RlZmluZSBVQVJUX0NUTF9SU1ZEX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1JTVkRfU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1JYUEFSRVZFTl9TSElGVAkJMTYKKyNkZWZpbmUgVUFSVF9DVExfUlhQQVJFVkVOX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1JYUEFSRVZFTl9TSElGVCkKKyNkZWZpbmUgVUFSVF9DVExfUlhQQVJFTl9TSElGVAkJMTcKKyNkZWZpbmUgVUFSVF9DVExfUlhQQVJFTl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9SWFBBUkVOX1NISUZUKQorI2RlZmluZSBVQVJUX0NUTF9UWFBBUkVWRU5fU0hJRlQJCTE4CisjZGVmaW5lIFVBUlRfQ1RMX1RYUEFSRVZFTl9NQVNLCQkoMSA8PCBVQVJUX0NUTF9UWFBBUkVWRU5fU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1RYUEFSRU5fU0hJRlQJCTE4CisjZGVmaW5lIFVBUlRfQ1RMX1RYUEFSRU5fTUFTSwkJKDEgPDwgVUFSVF9DVExfVFhQQVJFTl9TSElGVCkKKyNkZWZpbmUgVUFSVF9DVExfTE9PUEJBQ0tfU0hJRlQJCTIwCisjZGVmaW5lIFVBUlRfQ1RMX0xPT1BCQUNLX01BU0sJCSgxIDw8IFVBUlRfQ1RMX0xPT1BCQUNLX1NISUZUKQorI2RlZmluZSBVQVJUX0NUTF9SWEVOX1NISUZUCQkyMQorI2RlZmluZSBVQVJUX0NUTF9SWEVOX01BU0sJCSgxIDw8IFVBUlRfQ1RMX1JYRU5fU0hJRlQpCisjZGVmaW5lIFVBUlRfQ1RMX1RYRU5fU0hJRlQJCTIyCisjZGVmaW5lIFVBUlRfQ1RMX1RYRU5fTUFTSwkJKDEgPDwgVUFSVF9DVExfVFhFTl9TSElGVCkKKyNkZWZpbmUgVUFSVF9DVExfQlJHRU5fU0hJRlQJCTIzCisjZGVmaW5lIFVBUlRfQ1RMX0JSR0VOX01BU0sJCSgxIDw8IFVBUlRfQ1RMX0JSR0VOX1NISUZUKQorCisvKiBVQVJUIEJhdWR3b3JkIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQkFVRF9SRUcJCQkweDQKKworLyogVUFSVCBNaXNjIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9NQ1RMX1JFRwkJCTB4OAorI2RlZmluZSBVQVJUX01DVExfRFRSX1NISUZUCQkwCisjZGVmaW5lIFVBUlRfTUNUTF9EVFJfTUFTSwkJKDEgPDwgVUFSVF9NQ1RMX0RUUl9TSElGVCkKKyNkZWZpbmUgVUFSVF9NQ1RMX1JUU19TSElGVAkJMQorI2RlZmluZSBVQVJUX01DVExfUlRTX01BU0sJCSgxIDw8IFVBUlRfTUNUTF9SVFNfU0hJRlQpCisjZGVmaW5lIFVBUlRfTUNUTF9SWEZJRk9USFJFU0hfU0hJRlQJOAorI2RlZmluZSBVQVJUX01DVExfUlhGSUZPVEhSRVNIX01BU0sJKDB4ZiA8PCBVQVJUX01DVExfUlhGSUZPVEhSRVNIX1NISUZUKQorI2RlZmluZSBVQVJUX01DVExfVFhGSUZPVEhSRVNIX1NISUZUCTEyCisjZGVmaW5lIFVBUlRfTUNUTF9UWEZJRk9USFJFU0hfTUFTSwkoMHhmIDw8IFVBUlRfTUNUTF9UWEZJRk9USFJFU0hfU0hJRlQpCisjZGVmaW5lIFVBUlRfTUNUTF9SWEZJRk9GSUxMX1NISUZUCTE2CisjZGVmaW5lIFVBUlRfTUNUTF9SWEZJRk9GSUxMX01BU0sJKDB4MWYgPDwgVUFSVF9NQ1RMX1JYRklGT0ZJTExfU0hJRlQpCisjZGVmaW5lIFVBUlRfTUNUTF9UWEZJRk9GSUxMX1NISUZUCTI0CisjZGVmaW5lIFVBUlRfTUNUTF9UWEZJRk9GSUxMX01BU0sJKDB4MWYgPDwgVUFSVF9NQ1RMX1RYRklGT0ZJTExfU0hJRlQpCisKKy8qIFVBUlQgRXh0ZXJuYWwgSW5wdXQgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0VYVElOUF9SRUcJCQkweGMKKyNkZWZpbmUgVUFSVF9FWFRJTlBfUklfU0hJRlQJCTAKKyNkZWZpbmUgVUFSVF9FWFRJTlBfUklfTUFTSwkJKDEgPDwgVUFSVF9FWFRJTlBfUklfU0hJRlQpCisjZGVmaW5lIFVBUlRfRVhUSU5QX0NUU19TSElGVAkJMQorI2RlZmluZSBVQVJUX0VYVElOUF9DVFNfTUFTSwkJKDEgPDwgVUFSVF9FWFRJTlBfQ1RTX1NISUZUKQorI2RlZmluZSBVQVJUX0VYVElOUF9EQ0RfU0hJRlQJCTIKKyNkZWZpbmUgVUFSVF9FWFRJTlBfRENEX01BU0sJCSgxIDw8IFVBUlRfRVhUSU5QX0RDRF9TSElGVCkKKyNkZWZpbmUgVUFSVF9FWFRJTlBfRFNSX1NISUZUCQkzCisjZGVmaW5lIFVBUlRfRVhUSU5QX0RTUl9NQVNLCQkoMSA8PCBVQVJUX0VYVElOUF9EU1JfU0hJRlQpCisjZGVmaW5lIFVBUlRfRVhUSU5QX0lSU1RBVCh4KQkJKDEgPDwgKHggKyA0KSkKKyNkZWZpbmUgVUFSVF9FWFRJTlBfSVJNQVNLKHgpCQkoMSA8PCAoeCArIDgpKQorI2RlZmluZSBVQVJUX0VYVElOUF9JUl9SSQkJMAorI2RlZmluZSBVQVJUX0VYVElOUF9JUl9DVFMJCTEKKyNkZWZpbmUgVUFSVF9FWFRJTlBfSVJfRENECQkyCisjZGVmaW5lIFVBUlRfRVhUSU5QX0lSX0RTUgkJMworI2RlZmluZSBVQVJUX0VYVElOUF9SSV9OT1NFTlNFX1NISUZUCTE2CisjZGVmaW5lIFVBUlRfRVhUSU5QX1JJX05PU0VOU0VfTUFTSwkoMSA8PCBVQVJUX0VYVElOUF9SSV9OT1NFTlNFX1NISUZUKQorI2RlZmluZSBVQVJUX0VYVElOUF9DVFNfTk9TRU5TRV9TSElGVAkxNworI2RlZmluZSBVQVJUX0VYVElOUF9DVFNfTk9TRU5TRV9NQVNLCSgxIDw8IFVBUlRfRVhUSU5QX0NUU19OT1NFTlNFX1NISUZUKQorI2RlZmluZSBVQVJUX0VYVElOUF9EQ0RfTk9TRU5TRV9TSElGVAkxOAorI2RlZmluZSBVQVJUX0VYVElOUF9EQ0RfTk9TRU5TRV9NQVNLCSgxIDw8IFVBUlRfRVhUSU5QX0RDRF9OT1NFTlNFX1NISUZUKQorI2RlZmluZSBVQVJUX0VYVElOUF9EU1JfTk9TRU5TRV9TSElGVAkxOQorI2RlZmluZSBVQVJUX0VYVElOUF9EU1JfTk9TRU5TRV9NQVNLCSgxIDw8IFVBUlRfRVhUSU5QX0RTUl9OT1NFTlNFX1NISUZUKQorCisvKiBVQVJUIEludGVycnVwdCByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0lSX1JFRwkJCTB4MTAKKyNkZWZpbmUgVUFSVF9JUl9NQVNLKHgpCQkJKDEgPDwgKHggKyAxNikpCisjZGVmaW5lIFVBUlRfSVJfU1RBVCh4KQkJCSgxIDw8ICh4KSkKKyNkZWZpbmUgVUFSVF9JUl9FWFRJUAkJCTAKKyNkZWZpbmUgVUFSVF9JUl9UWFVOREVSCQkJMQorI2RlZmluZSBVQVJUX0lSX1RYT1ZFUgkJCTIKKyNkZWZpbmUgVUFSVF9JUl9UWFRSRVNICQkJMworI2RlZmluZSBVQVJUX0lSX1RYUkRMQVRDSAkJNAorI2RlZmluZSBVQVJUX0lSX1RYRU1QVFkJCQk1CisjZGVmaW5lIFVBUlRfSVJfUlhVTkRFUgkJCTYKKyNkZWZpbmUgVUFSVF9JUl9SWE9WRVIJCQk3CisjZGVmaW5lIFVBUlRfSVJfUlhUSU1FT1VUCQk4CisjZGVmaW5lIFVBUlRfSVJfUlhGVUxMCQkJOQorI2RlZmluZSBVQVJUX0lSX1JYVEhSRVNICQkxMAorI2RlZmluZSBVQVJUX0lSX1JYTk9URU1QVFkJCTExCisjZGVmaW5lIFVBUlRfSVJfUlhGUkFNRUVSUgkJMTIKKyNkZWZpbmUgVUFSVF9JUl9SWFBBUkVSUgkJMTMKKyNkZWZpbmUgVUFSVF9JUl9SWEJSSwkJCTE0CisjZGVmaW5lIFVBUlRfSVJfVFhET05FCQkJMTUKKworLyogVUFSVCBGaWZvIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfRklGT19SRUcJCQkweDE0CisjZGVmaW5lIFVBUlRfRklGT19WQUxJRF9TSElGVAkJMAorI2RlZmluZSBVQVJUX0ZJRk9fVkFMSURfTUFTSwkJMHhmZgorI2RlZmluZSBVQVJUX0ZJRk9fRlJBTUVFUlJfU0hJRlQJOAorI2RlZmluZSBVQVJUX0ZJRk9fRlJBTUVFUlJfTUFTSwkJKDEgPDwgVUFSVF9GSUZPX0ZSQU1FRVJSX1NISUZUKQorI2RlZmluZSBVQVJUX0ZJRk9fUEFSRVJSX1NISUZUCQk5CisjZGVmaW5lIFVBUlRfRklGT19QQVJFUlJfTUFTSwkJKDEgPDwgVUFSVF9GSUZPX1BBUkVSUl9TSElGVCkKKyNkZWZpbmUgVUFSVF9GSUZPX0JSS0RFVF9TSElGVAkJMTAKKyNkZWZpbmUgVUFSVF9GSUZPX0JSS0RFVF9NQVNLCQkoMSA8PCBVQVJUX0ZJRk9fQlJLREVUX1NISUZUKQorI2RlZmluZSBVQVJUX0ZJRk9fQU5ZRVJSX01BU0sJCShVQVJUX0ZJRk9fRlJBTUVFUlJfTUFTSyB8CVwKKwkJCQkJVUFSVF9GSUZPX1BBUkVSUl9NQVNLIHwJCVwKKwkJCQkJVUFSVF9GSUZPX0JSS0RFVF9NQVNLKQorCisjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9CQ002M1hYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IDFmNjg5ZTYuLmY1ODljOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMjQ1Niw2ICsyNDU2LDcgQEAKIHZvaWQgc2tiX3NwbGl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICpza2IxLCBjb25zdCB1MzIgbGVuKTsKIGludCBza2Jfc2hpZnQoc3RydWN0IHNrX2J1ZmYgKnRndCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNoaWZ0bGVuKTsKIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpOwordW5zaWduZWQgaW50IHNrYl9nc29fdHJhbnNwb3J0X3NlZ2xlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0cnVjdCBza19idWZmICpza2Jfc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAKIHN0cnVjdCBza2JfY2hlY2tzdW1fb3BzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggYTA2MDE0Mi4uOTI2MGFiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTIwNSw4ICsyMDUsOCBAQAogCiAjaWZkZWYgQ09ORklHX1NMVUIKIC8qCi0gKiBTTFVCIGFsbG9jYXRlcyB1cCB0byBvcmRlciAyIHBhZ2VzIGRpcmVjdGx5IGFuZCBvdGhlcndpc2UKLSAqIHBhc3NlcyB0aGUgcmVxdWVzdCB0byB0aGUgcGFnZSBhbGxvY2F0b3IuCisgKiBTTFVCIGRpcmVjdGx5IGFsbG9jYXRlcyByZXF1ZXN0cyBmaXR0aW5nIGluIHRvIGFuIG9yZGVyLTEgcGFnZQorICogKFBBR0VfU0laRSoyKS4gIExhcmdlciByZXF1ZXN0cyBhcmUgcGFzc2VkIHRvIHRoZSBwYWdlIGFsbG9jYXRvci4KICAqLwogI2RlZmluZSBLTUFMTE9DX1NISUZUX0hJR0gJKFBBR0VfU0hJRlQgKyAxKQogI2RlZmluZSBLTUFMTE9DX1NISUZUX01BWAkoTUFYX09SREVSICsgUEFHRV9TSElGVCkKQEAgLTIxNywxMiArMjE3LDEyIEBACiAKICNpZmRlZiBDT05GSUdfU0xPQgogLyoKLSAqIFNMT0IgcGFzc2VzIGFsbCBwYWdlIHNpemUgYW5kIGxhcmdlciByZXF1ZXN0cyB0byB0aGUgcGFnZSBhbGxvY2F0b3IuCisgKiBTTE9CIHBhc3NlcyBhbGwgcmVxdWVzdHMgbGFyZ2VyIHRoYW4gb25lIHBhZ2UgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLgogICogTm8ga21hbGxvYyBhcnJheSBpcyBuZWNlc3Nhcnkgc2luY2Ugb2JqZWN0cyBvZiBkaWZmZXJlbnQgc2l6ZXMgY2FuCiAgKiBiZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSBwYWdlLgogICovCi0jZGVmaW5lIEtNQUxMT0NfU0hJRlRfTUFYCTMwCiAjZGVmaW5lIEtNQUxMT0NfU0hJRlRfSElHSAlQQUdFX1NISUZUCisjZGVmaW5lIEtNQUxMT0NfU0hJRlRfTUFYCTMwCiAjaWZuZGVmIEtNQUxMT0NfU0hJRlRfTE9XCiAjZGVmaW5lIEtNQUxMT0NfU0hJRlRfTE9XCTMKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggNWRhMjJlZS4uNmFlMDA0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcC5oCkBAIC0xMSwxMiArMTEsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9sbGlzdC5oPgogCiBleHRlcm4gdm9pZCBjcHVfaWRsZSh2b2lkKTsKIAogdHlwZWRlZiB2b2lkICgqc21wX2NhbGxfZnVuY190KSh2b2lkICppbmZvKTsKIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5pb24geworCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJCXN0cnVjdCBsbGlzdF9ub2RlIGxsaXN0OworCX07CiAJc21wX2NhbGxfZnVuY190IGZ1bmM7CiAJdm9pZCAqaW5mbzsKIAl1MTYgZmxhZ3M7CkBAIC0xODQsNiArMTg4LDkgQEAKICAqLwogZXh0ZXJuIHZvaWQgYXJjaF9kaXNhYmxlX3NtcF9zdXBwb3J0KHZvaWQpOwogCitleHRlcm4gdm9pZCBhcmNoX2VuYWJsZV9ub25ib290X2NwdXNfYmVnaW4odm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX2VuYWJsZV9ub25ib290X2NwdXNfZW5kKHZvaWQpOworCiB2b2lkIHNtcF9zZXR1cF9wcm9jZXNzb3JfaWQodm9pZCk7CiAKICNlbmRpZiAvKiBfX0xJTlVYX1NNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaCBiL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCmluZGV4IGM2NDk5OWYuLjA3ZWY5YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCkBAIC00ODYsNiArNDg2LDcgQEAKICNlbmRpZiAvKiBFTUJFRERFRCAqLwogI2lmZGVmIENPTkZJR19TU0JfRFJJVkVSX0dQSU8KIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87CisJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CiAjZW5kaWYgLyogRFJJVkVSX0dQSU8gKi8KIAogCS8qIEludGVybmFsLW9ubHkgc3R1ZmYgZm9sbG93cy4gRG8gbm90IHRvdWNoLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCA2ZWVjZmMyLi4wNGU3NjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtMzY4LDcgKzM2OCw3IEBACiAJc3RydWN0IHN2Y19wcm9ncmFtICoJcGdfbmV4dDsJLyogb3RoZXIgcHJvZ3JhbXMgKHNhbWUgeHBydCkgKi8KIAl1MzIJCQlwZ19wcm9nOwkvKiBwcm9ncmFtIG51bWJlciAqLwogCXVuc2lnbmVkIGludAkJcGdfbG92ZXJzOwkvKiBsb3dlc3QgdmVyc2lvbiAqLwotCXVuc2lnbmVkIGludAkJcGdfaGl2ZXJzOwkvKiBsb3dlc3QgdmVyc2lvbiAqLworCXVuc2lnbmVkIGludAkJcGdfaGl2ZXJzOwkvKiBoaWdoZXN0IHZlcnNpb24gKi8KIAl1bnNpZ25lZCBpbnQJCXBnX252ZXJzOwkvKiBudW1iZXIgb2YgdmVyc2lvbnMgKi8KIAlzdHJ1Y3Qgc3ZjX3ZlcnNpb24gKioJcGdfdmVyczsJLyogdmVyc2lvbiBhcnJheSAqLwogCWNoYXIgKgkJCXBnX25hbWU7CS8qIHNlcnZpY2UgbmFtZSAqLwpAQCAtMzg2LDggKzM4NiwxMCBAQAogCXN0cnVjdCBzdmNfcHJvY2VkdXJlICoJdnNfcHJvYzsJLyogcGVyLXByb2NlZHVyZSBpbmZvICovCiAJdTMyCQkJdnNfeGRyc2l6ZTsJLyogeGRyc2l6ZSBuZWVkZWQgZm9yIHRoaXMgdmVyc2lvbiAqLwogCi0JdW5zaWduZWQgaW50CQl2c19oaWRkZW4gOiAxOwkvKiBEb24ndCByZWdpc3RlciB3aXRoIHBvcnRtYXBwZXIuCisJdW5zaWduZWQgaW50CQl2c19oaWRkZW4gOiAxLAkvKiBEb24ndCByZWdpc3RlciB3aXRoIHBvcnRtYXBwZXIuCiAJCQkJCQkgKiBPbmx5IHVzZWQgZm9yIG5mc2FjbCBzbyBmYXIuICovCisJCQkJdnNfcnBjYl9vcHRubDoxOy8qIERvbid0IGNhcmUgdGhlIHJlc3VsdCBvZiByZWdpc3Rlci4KKwkJCQkJCSAqIE9ubHkgdXNlZCBmb3IgbmZzdjQuICovCiAKIAkvKiBPdmVycmlkZSBkaXNwYXRjaCBmdW5jdGlvbiAoZS5nLiB3aGVuIGNhY2hpbmcgcmVwbGllcykuCiAJICogQSByZXR1cm4gdmFsdWUgb2YgMCBtZWFucyBkcm9wIHRoZSByZXF1ZXN0LiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGljay5oIGIvaW5jbHVkZS9saW51eC90aWNrLmgKaW5kZXggMDE3NWQ4Ni4uYjg0NzczYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC90aWNrLmgKQEAgLTEwNCw3ICsxMDQsNyBAQAogZXh0ZXJuIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopOwogZXh0ZXJuIHN0cnVjdCB0aWNrX3NjaGVkICp0aWNrX2dldF90aWNrX3NjaGVkKGludCBjcHUpOwotZXh0ZXJuIHZvaWQgdGlja19jaGVja19pZGxlKHZvaWQpOworZXh0ZXJuIHZvaWQgdGlja19pcnFfZW50ZXIodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfb25lc2hvdF9tb2RlX2FjdGl2ZSh2b2lkKTsKICMgIGlmbmRlZiBhcmNoX25lZWRzX2NwdQogIyAgIGRlZmluZSBhcmNoX25lZWRzX2NwdShjcHUpICgwKQpAQCAtMTEyLDcgKzExMiw3IEBACiAjIGVsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Nsb2NrX25vdGlmeSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NoZWNrX2lkbGUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pcnFfZW50ZXIodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX29uZXNob3RfbW9kZV9hY3RpdmUodm9pZCkgeyByZXR1cm4gMDsgfQogIyBlbmRpZgogCkBAIC0xMjEsNyArMTIxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihpbnQgY3B1KSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Nsb2NrX25vdGlmeSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NoZWNrX2lkbGUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pcnFfZW50ZXIodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX29uZXNob3RfbW9kZV9hY3RpdmUodm9pZCkgeyByZXR1cm4gMDsgfQogI2VuZGlmIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtX2V2ZW50X2l0ZW0uaCBiL2luY2x1ZGUvbGludXgvdm1fZXZlbnRfaXRlbS5oCmluZGV4IGM1NTdjNmQuLjNhNzEyZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1fZXZlbnRfaXRlbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1fZXZlbnRfaXRlbS5oCkBAIC03MSwxMiArNzEsMTQgQEAKIAkJVEhQX1pFUk9fUEFHRV9BTExPQywKIAkJVEhQX1pFUk9fUEFHRV9BTExPQ19GQUlMRUQsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfVExCRkxVU0gKICNpZmRlZiBDT05GSUdfU01QCiAJCU5SX1RMQl9SRU1PVEVfRkxVU0gsCS8qIGNwdSB0cmllZCB0byBmbHVzaCBvdGhlcnMnIHRsYnMgKi8KIAkJTlJfVExCX1JFTU9URV9GTFVTSF9SRUNFSVZFRCwvKiBjcHUgcmVjZWl2ZWQgaXBpIGZvciBmbHVzaCAqLwotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCQlOUl9UTEJfTE9DQUxfRkxVU0hfQUxMLAogCQlOUl9UTEJfTE9DQUxfRkxVU0hfT05FLAorI2VuZGlmIC8qIENPTkZJR19ERUJVR19UTEJGTFVTSCAqLwogCQlOUl9WTV9FVkVOVF9JVEVNUwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bXN0YXQuaCBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKaW5kZXggZTRiOTQ4MC4uNjdjZTcwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bXN0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCkBAIC04Myw2ICs4MywxNCBAQAogI2RlZmluZSBjb3VudF92bV9udW1hX2V2ZW50cyh4LCB5KSBkbyB7ICh2b2lkKSh5KTsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi8KIAorI2lmZGVmIENPTkZJR19ERUJVR19UTEJGTFVTSAorI2RlZmluZSBjb3VudF92bV90bGJfZXZlbnQoeCkJICAgY291bnRfdm1fZXZlbnQoeCkKKyNkZWZpbmUgY291bnRfdm1fdGxiX2V2ZW50cyh4LCB5KSAgY291bnRfdm1fZXZlbnRzKHgsIHkpCisjZWxzZQorI2RlZmluZSBjb3VudF92bV90bGJfZXZlbnQoeCkgICAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb3VudF92bV90bGJfZXZlbnRzKHgsIHkpIGRvIHsgKHZvaWQpKHkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisKICNkZWZpbmUgX19jb3VudF96b25lX3ZtX2V2ZW50cyhpdGVtLCB6b25lLCBkZWx0YSkgXAogCQlfX2NvdW50X3ZtX2V2ZW50cyhpdGVtIyNfTk9STUFMIC0gWk9ORV9OT1JNQUwgKyBcCiAJCXpvbmVfaWR4KHpvbmUpLCBkZWx0YSkKQEAgLTE0Miw4ICsxNTAsNiBAQAogCXJldHVybiB4OwogfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnbG9iYWxfcmVjbGFpbWFibGVfcGFnZXModm9pZCk7Ci0KICNpZmRlZiBDT05GSUdfTlVNQQogLyoKICAqIERldGVybWluZSB0aGUgcGVyIG5vZGUgdmFsdWUgb2YgYSBzdGF0IGl0ZW0uIFRoaXMgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy96c21hbGxvYy5oIGIvaW5jbHVkZS9saW51eC96c21hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy96c21hbGxvYy96c21hbGxvYy5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L3pzbWFsbG9jLmgKaW5kZXggYzJlYjE3NC4uZTQ0ZDYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pzbWFsbG9jL3pzbWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC96c21hbGxvYy5oCkBAIC0yLDYgKzIsNyBAQAogICogenNtYWxsb2MgbWVtb3J5IGFsbG9jYXRvcgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSAgTml0aW4gR3VwdGEKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyBNaW5jaGFuIEtpbQogICoKICAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAogICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYWR2NzYwNC5oIGIvaW5jbHVkZS9tZWRpYS9hZHY3NjA0LmgKaW5kZXggZGMwMDRiYy4uZDI2MmEzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9hZHY3NjA0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9hZHY3NjA0LmgKQEAgLTc4LDExICs3OCwxNCBAQAogCUFEVjc2MDRfT1BfRk9STUFUX1NFTF9TRFJfSVRVNjU2XzI0X01PREUyID0gMHg4YSwKIH07CiAKK2VudW0gYWR2NzYwNF9kcml2ZV9zdHJlbmd0aCB7CisJQURWNzYwNF9EUl9TVFJfTUVESVVNX0xPVyA9IDEsCisJQURWNzYwNF9EUl9TVFJfTUVESVVNX0hJR0ggPSAyLAorCUFEVjc2MDRfRFJfU1RSX0hJR0ggPSAzLAorfTsKKwogLyogUGxhdGZvcm0gZGVwZW5kZW50IGRlZmluaXRpb24gKi8KIHN0cnVjdCBhZHY3NjA0X3BsYXRmb3JtX2RhdGEgewotCS8qIGNvbm5lY3RvciAtIEhETUkgb3IgRFZJPyAqLwotCXVuc2lnbmVkIGNvbm5lY3Rvcl9oZG1pOjE7Ci0KIAkvKiBESVNfUFdSRE5COiAxIGlmIHRoZSBQV1JETkIgcGluIGlzIHVudXNlZCBhbmQgdW5jb25uZWN0ZWQgKi8KIAl1bnNpZ25lZCBkaXNhYmxlX3B3cmRuYjoxOwogCkBAIC0xMTAsNiArMTEzLDE1IEBACiAJdW5zaWduZWQgcmVwbGljYXRlX2F2X2NvZGVzOjE7CiAJdW5zaWduZWQgaW52ZXJ0X2NiY3I6MTsKIAorCS8qIElPIHJlZ2lzdGVyIDB4MDYgKi8KKwl1bnNpZ25lZCBpbnZfdnNfcG9sOjE7CisJdW5zaWduZWQgaW52X2hzX3BvbDoxOworCisJLyogSU8gcmVnaXN0ZXIgMHgxNCAqLworCWVudW0gYWR2NzYwNF9kcml2ZV9zdHJlbmd0aCBkcl9zdHJfZGF0YTsKKwllbnVtIGFkdjc2MDRfZHJpdmVfc3RyZW5ndGggZHJfc3RyX2NsazsKKwllbnVtIGFkdjc2MDRfZHJpdmVfc3RyZW5ndGggZHJfc3RyX3N5bmM7CisKIAkvKiBJTyByZWdpc3RlciAweDMwICovCiAJdW5zaWduZWQgb3V0cHV0X2J1c19sc2JfdG9fbXNiOjE7CiAKQEAgLTEzMSwxNiArMTQzLDIwIEBACiAJdTggaTJjX3ZkcDsKIH07CiAKLS8qCi0gKiBNb2RlIG9mIG9wZXJhdGlvbi4KLSAqIFRoaXMgaXMgdXNlZCBhcyB0aGUgaW5wdXQgYXJndW1lbnQgb2YgdGhlIHNfcm91dGluZyB2aWRlbyBvcC4KLSAqLwotZW51bSBhZHY3NjA0X21vZGUgewotCUFEVjc2MDRfTU9ERV9DT01QLAotCUFEVjc2MDRfTU9ERV9HUiwKLQlBRFY3NjA0X01PREVfSERNSSwKK2VudW0gYWR2NzYwNF9pbnB1dF9wb3J0IHsKKwlBRFY3NjA0X0lOUFVUX0hETUlfUE9SVF9BLAorCUFEVjc2MDRfSU5QVVRfSERNSV9QT1JUX0IsCisJQURWNzYwNF9JTlBVVF9IRE1JX1BPUlRfQywKKwlBRFY3NjA0X0lOUFVUX0hETUlfUE9SVF9ELAorCUFEVjc2MDRfSU5QVVRfVkdBX1JHQiwKKwlBRFY3NjA0X0lOUFVUX1ZHQV9DT01QLAogfTsKIAorI2RlZmluZSBBRFY3NjA0X0VESURfUE9SVF9BIDAKKyNkZWZpbmUgQURWNzYwNF9FRElEX1BPUlRfQiAxCisjZGVmaW5lIEFEVjc2MDRfRURJRF9QT1JUX0MgMgorI2RlZmluZSBBRFY3NjA0X0VESURfUE9SVF9EIDMKKwogI2RlZmluZSBWNEwyX0NJRF9BRFZfUlhfQU5BTE9HX1NBTVBMSU5HX1BIQVNFCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMHgxMDAwKQogI2RlZmluZSBWNEwyX0NJRF9BRFZfUlhfRlJFRV9SVU5fQ09MT1JfTUFOVUFMCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMHgxMDAxKQogI2RlZmluZSBWNEwyX0NJRF9BRFZfUlhfRlJFRV9SVU5fQ09MT1IJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMHgxMDAyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hZHY3ODQyLmggYi9pbmNsdWRlL21lZGlhL2Fkdjc4NDIuaAppbmRleCBjMDIyMDFkLi4zOTMyMjA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2Fkdjc4NDIuaAorKysgYi9pbmNsdWRlL21lZGlhL2Fkdjc4NDIuaApAQCAtMTA4LDYgKzEwOCwxMyBAQAogCUFEVjc4NDJfU0VMRUNUX1NEUF9ZQywKIH07CiAKK2VudW0gYWR2Nzg0Ml9kcml2ZV9zdHJlbmd0aCB7CisJQURWNzg0Ml9EUl9TVFJfTE9XID0gMCwKKwlBRFY3ODQyX0RSX1NUUl9NRURJVU1fTE9XID0gMSwKKwlBRFY3ODQyX0RSX1NUUl9NRURJVU1fSElHSCA9IDIsCisJQURWNzg0Ml9EUl9TVFJfSElHSCA9IDMsCit9OworCiBzdHJ1Y3QgYWR2Nzg0Ml9zZHBfY3NjX2NvZWZmIHsKIAlib29sIG1hbnVhbDsKIAl1aW50MTZfdCBzY2FsaW5nOwpAQCAtMTMxLDEzICsxMzgsMTggQEAKIAl1aW50MTZfdCBoc193aWR0aDsKIAl1aW50MTZfdCBkZV9iZWc7CiAJdWludDE2X3QgZGVfZW5kOworCXVpbnQ4X3QgdnNfYmVnX287CisJdWludDhfdCB2c19iZWdfZTsKKwl1aW50OF90IHZzX2VuZF9vOworCXVpbnQ4X3QgdnNfZW5kX2U7CisJdWludDhfdCBkZV92X2JlZ19vOworCXVpbnQ4X3QgZGVfdl9iZWdfZTsKKwl1aW50OF90IGRlX3ZfZW5kX287CisJdWludDhfdCBkZV92X2VuZF9lOwogfTsKIAogLyogUGxhdGZvcm0gZGVwZW5kZW50IGRlZmluaXRpb24gKi8KIHN0cnVjdCBhZHY3ODQyX3BsYXRmb3JtX2RhdGEgewotCS8qIGNvbm5lY3RvciAtIEhETUkgb3IgRFZJPyAqLwotCXVuc2lnbmVkIGNvbm5lY3Rvcl9oZG1pOjE7Ci0KIAkvKiBjaGlwIHJlc2V0IGR1cmluZyBwcm9iZSAqLwogCXVuc2lnbmVkIGNoaXBfcmVzZXQ6MTsKIApAQCAtMTU2LDEyICsxNjgsMTIgQEAKIAkvKiBEZWZhdWx0IG1vZGUgKi8KIAllbnVtIGFkdjc4NDJfbW9kZSBtb2RlOwogCisJLyogRGVmYXVsdCBpbnB1dCAqLworCXVuc2lnbmVkIGlucHV0OworCiAJLyogVmlkZW8gc3RhbmRhcmQgKi8KIAllbnVtIGFkdjc4NDJfdmlkX3N0ZF9zZWxlY3QgdmlkX3N0ZF9zZWxlY3Q7CiAKLQkvKiBJbnB1dCBDb2xvciBTcGFjZSAqLwotCWVudW0gYWR2Nzg0Ml9pbnBfY29sb3Jfc3BhY2UgaW5wX2NvbG9yX3NwYWNlOwotCiAJLyogU2VsZWN0IG91dHB1dCBmb3JtYXQgKi8KIAllbnVtIGFkdjc4NDJfb3BfZm9ybWF0X3NlbCBvcF9mb3JtYXRfc2VsOwogCkBAIC0xODEsMjIgKzE5MywzNyBAQAogCXVuc2lnbmVkIG91dHB1dF9idXNfbHNiX3RvX21zYjoxOwogCiAJLyogSU8gcmVnaXN0ZXIgMHgxNCAqLwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGRhdGE6MjsKLQkJdW5zaWduZWQgY2xvY2s6MjsKLQkJdW5zaWduZWQgc3luYzoyOwotCX0gZHJpdmVfc3RyZW5ndGg7CisJZW51bSBhZHY3ODQyX2RyaXZlX3N0cmVuZ3RoIGRyX3N0cl9kYXRhOworCWVudW0gYWR2Nzg0Ml9kcml2ZV9zdHJlbmd0aCBkcl9zdHJfY2xrOworCWVudW0gYWR2Nzg0Ml9kcml2ZV9zdHJlbmd0aCBkcl9zdHJfc3luYzsKKworCS8qCisJICogSU8gcmVnaXN0ZXIgMHgxOTogQWRqdXN0bWVudCB0byB0aGUgTExDIERMTCBwaGFzZSBpbgorCSAqIGluY3JlbWVudHMgb2YgMS8zMiBvZiBhIGNsb2NrIHBlcmlvZC4KKwkgKi8KKwl1bnNpZ25lZCBsbGNfZGxsX3BoYXNlOjU7CiAKIAkvKiBFeHRlcm5hbCBSQU0gZm9yIDMtRCBjb21iIG9yIGZyYW1lIHN5bmNocm9uaXplciAqLwogCXVuc2lnbmVkIHNkX3JhbV9zaXplOyAvKiByYW0gc2l6ZSBpbiBNQiAqLwogCXVuc2lnbmVkIHNkX3JhbV9kZHI6MTsgLyogZGRyIG9yIHNkciBzZHJhbSAqLwogCi0JLyogRnJlZSBydW4gKi8KLQl1bnNpZ25lZCBoZG1pX2ZyZWVfcnVuX21vZGU7CisJLyogSERNSSBmcmVlIHJ1biwgQ1AtcmVnIDB4QkEgKi8KKwl1bnNpZ25lZCBoZG1pX2ZyZWVfcnVuX2VuYWJsZToxOworCS8qIDAgPSBNb2RlIDA6IHJ1biB3aGVuIHRoZXJlIGlzIG5vIFRNRFMgY2xvY2sKKwkgICAxID0gTW9kZSAxOiBydW4gd2hlbiB0aGVyZSBpcyBubyBUTURTIGNsb2NrIG9yIHRoZQorCSAgICAgICB2aWRlbyByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIHByb2dyYW1tZWQgb25lLiAqLworCXVuc2lnbmVkIGhkbWlfZnJlZV9ydW5fbW9kZToxOworCisJLyogU0RQIGZyZWUgcnVuLCBDUC1yZWcgMHhERCAqLworCXVuc2lnbmVkIHNkcF9mcmVlX3J1bl9hdXRvOjE7CisJdW5zaWduZWQgc2RwX2ZyZWVfcnVuX21hbl9jb2xfZW46MTsKKwl1bnNpZ25lZCBzZHBfZnJlZV9ydW5fY2Jhcl9lbjoxOworCXVuc2lnbmVkIHNkcF9mcmVlX3J1bl9mb3JjZToxOwogCiAJc3RydWN0IGFkdjc4NDJfc2RwX2NzY19jb2VmZiBzZHBfY3NjX2NvZWZmOwogCi0Jc3RydWN0IGFkdjc4NDJfc2RwX2lvX3N5bmNfYWRqdXN0bWVudCBzZHBfaW9fc3luYzsKKwlzdHJ1Y3QgYWR2Nzg0Ml9zZHBfaW9fc3luY19hZGp1c3RtZW50IHNkcF9pb19zeW5jXzYyNTsKKwlzdHJ1Y3QgYWR2Nzg0Ml9zZHBfaW9fc3luY19hZGp1c3RtZW50IHNkcF9pb19zeW5jXzUyNTsKIAogCS8qIGkyYyBhZGRyZXNzZXMgKi8KIAl1OCBpMmNfc2RwX2lvOwpAQCAtMjIzLDQgKzI1MCw4IEBACiAgKiBkZWludGVybGFjZXIuICovCiAjZGVmaW5lIEFEVjc4NDJfQ01EX1JBTV9URVNUIF9JTygnVicsIEJBU0VfVklESU9DX1BSSVZBVEUpCiAKKyNkZWZpbmUgQURWNzg0Ml9FRElEX1BPUlRfQSAgIDAKKyNkZWZpbmUgQURWNzg0Ml9FRElEX1BPUlRfQiAgIDEKKyNkZWZpbmUgQURWNzg0Ml9FRElEX1BPUlRfVkdBIDIKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oIGIvaW5jbHVkZS9tZWRpYS9hdG1lbC1pc2kuaAppbmRleCA2NTY4MjMwLi4yYjAyMzQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmgKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl82CQkoNSA8PCA4KQogI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzcJCSg2IDw8IDgpCiAjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfOAkJKDcgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl9NQVNLCQkoNyA8PCA4KQogI2RlZmluZSBJU0lfQ0ZHMV9ESVNDUgkJCQkoMSA8PCAxMSkKICNkZWZpbmUgSVNJX0NGRzFfRlVMTF9NT0RFCQkJKDEgPDwgMTIpCiAKQEAgLTY2LDYgKzY3LDcgQEAKICNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMQkoMSA8PCAyOCkKICNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMgkoMiA8PCAyOCkKICNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMwkoMyA8PCAyOCkKKyNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfTUFTSwkoMyA8PCAyOCkKICNkZWZpbmUgSVNJX0NGRzJfSU1fVlNJWkVfT0ZGU0VUCQkwCiAjZGVmaW5lIElTSV9DRkcyX0lNX0hTSVpFX09GRlNFVAkJMTYKICNkZWZpbmUgSVNJX0NGRzJfSU1fVlNJWkVfTUFTSwkJKDB4N0ZGIDw8IElTSV9DRkcyX0lNX1ZTSVpFX09GRlNFVCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWEtZW50aXR5LmggYi9pbmNsdWRlL21lZGlhL21lZGlhLWVudGl0eS5oCmluZGV4IDEwZGY1NTEuLmUwMDQ1OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWEtZW50aXR5LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYS1lbnRpdHkuaApAQCAtMjQsNiArMjQsNyBAQAogI2RlZmluZSBfTUVESUFfRU5USVRZX0gKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tZWRpYS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29tYXA0aXNzLmggYi9pbmNsdWRlL21lZGlhL29tYXA0aXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3NjIwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb21hcDRpc3MuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIEFSQ0hfQVJNX1BMQVRfT01BUDRfSVNTX0gKKyNkZWZpbmUgQVJDSF9BUk1fUExBVF9PTUFQNF9JU1NfSAorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKK3N0cnVjdCBpc3NfZGV2aWNlOworCitlbnVtIGlzc19pbnRlcmZhY2VfdHlwZSB7CisJSVNTX0lOVEVSRkFDRV9DU0kyQV9QSFkxLAorCUlTU19JTlRFUkZBQ0VfQ1NJMkJfUEhZMiwKK307CisKKy8qKgorICogc3RydWN0IGlzc19jc2lwaHlfbGFuZTogQ1NJMiBsYW5lIHBvc2l0aW9uIGFuZCBwb2xhcml0eQorICogQHBvczogcG9zaXRpb24gb2YgdGhlIGxhbmUKKyAqIEBwb2w6IHBvbGFyaXR5IG9mIHRoZSBsYW5lCisgKi8KK3N0cnVjdCBpc3NfY3NpcGh5X2xhbmUgeworCXU4IHBvczsKKwl1OCBwb2w7Cit9OworCisjZGVmaW5lIElTU19DU0lQSFkxX05VTV9EQVRBX0xBTkVTCTQKKyNkZWZpbmUgSVNTX0NTSVBIWTJfTlVNX0RBVEFfTEFORVMJMQorCisvKioKKyAqIHN0cnVjdCBpc3NfY3NpcGh5X2xhbmVzX2NmZyAtIENTSTIgbGFuZSBjb25maWd1cmF0aW9uCisgKiBAZGF0YTogQ29uZmlndXJhdGlvbiBvZiBvbmUgb3IgdHdvIGRhdGEgbGFuZXMKKyAqIEBjbGs6IENsb2NrIGxhbmUgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgaXNzX2NzaXBoeV9sYW5lc19jZmcgeworCXN0cnVjdCBpc3NfY3NpcGh5X2xhbmUgZGF0YVtJU1NfQ1NJUEhZMV9OVU1fREFUQV9MQU5FU107CisJc3RydWN0IGlzc19jc2lwaHlfbGFuZSBjbGs7Cit9OworCisvKioKKyAqIHN0cnVjdCBpc3NfY3NpMl9wbGF0Zm9ybV9kYXRhIC0gQ1NJMiBpbnRlcmZhY2UgcGxhdGZvcm0gZGF0YQorICogQGNyYzogRW5hYmxlIHRoZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjaworICogQHZwY2xrX2RpdjogVmlkZW8gcG9ydCBvdXRwdXQgY2xvY2sgY29udHJvbAorICovCitzdHJ1Y3QgaXNzX2NzaTJfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgY3JjOjE7CisJdW5zaWduZWQgdnBjbGtfZGl2OjI7CisJc3RydWN0IGlzc19jc2lwaHlfbGFuZXNfY2ZnIGxhbmVjZmc7Cit9OworCitzdHJ1Y3QgaXNzX3N1YmRldl9pMmNfYm9hcmRfaW5mbyB7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvICpib2FyZF9pbmZvOworCWludCBpMmNfYWRhcHRlcl9pZDsKK307CisKK3N0cnVjdCBpc3NfdjRsMl9zdWJkZXZzX2dyb3VwIHsKKwlzdHJ1Y3QgaXNzX3N1YmRldl9pMmNfYm9hcmRfaW5mbyAqc3ViZGV2czsKKwllbnVtIGlzc19pbnRlcmZhY2VfdHlwZSBpbnRlcmZhY2U7CisJdW5pb24geworCQlzdHJ1Y3QgaXNzX2NzaTJfcGxhdGZvcm1fZGF0YSBjc2kyOworCX0gYnVzOyAvKiBnY2MgPCA0LjYuMCBjaG9rZXMgb24gYW5vbnltb3VzIHVuaW9uIGluaXRpYWxpemVycyAqLworfTsKKworc3RydWN0IGlzc19wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgaXNzX3Y0bDJfc3ViZGV2c19ncm91cCAqc3ViZGV2czsKKwl2b2lkICgqc2V0X2NvbnN0cmFpbnRzKShzdHJ1Y3QgaXNzX2RldmljZSAqaXNzLCBib29sIGVuYWJsZSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmggYi9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCmluZGV4IDY2MjhmNWQuLmEyMGVkOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaApAQCAtMTkzLDYgKzE5Myw3IEBACiAjZGVmaW5lIFJDX01BUF9WSURFT01BVEVfVFZfUFZSICAgICAgICAgICJyYy12aWRlb21hdGUtdHYtcHZyIgogI2RlZmluZSBSQ19NQVBfV0lORkFTVCAgICAgICAgICAgICAgICAgICAicmMtd2luZmFzdCIKICNkZWZpbmUgUkNfTUFQX1dJTkZBU1RfVVNCSUlfREVMVVhFICAgICAgInJjLXdpbmZhc3QtdXNiaWktZGVsdXhlIgorI2RlZmluZSBSQ19NQVBfU1UzMDAwICAgICAgICAgICAgICAgICAgICAicmMtc3UzMDAwIgogCiAvKgogICogUGxlYXNlLCBkbyBub3QganVzdCBhcHBlbmQgbmV3ZXIgUmVtb3RlIENvbnRyb2xsZXIgbmFtZXMgYXQgdGhlIGVuZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNjU4OC5oIGIvaW5jbHVkZS9tZWRpYS9zYWE2NTg4LmgKaW5kZXggMmMzYzQ0Mi4uYjVlYzFhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE2NTg4LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE2NTg4LmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogc3RydWN0IHNhYTY1ODhfY29tbWFuZCB7CiAJdW5zaWduZWQgaW50ICBibG9ja19jb3VudDsKKwlib29sICAgICAgICAgIG5vbmJsb2NraW5nOwogCWludCAgICAgICAgICAgcmVzdWx0OwogCXVuc2lnbmVkIGNoYXIgX191c2VyICpidWZmZXI7CiAJc3RydWN0IGZpbGUgICAqaW5zdGFuY2U7CkBAIC0zNCw3ICszNSw2IEBACiB9OwogCiAvKiBUaGVzZSBpb2N0bHMgYXJlIGludGVybmFsIHRvIHRoZSBrZXJuZWwgKi8KLSNkZWZpbmUgU0FBNjU4OF9DTURfT1BFTglfSU9XKCdSJywgMSwgaW50KQogI2RlZmluZSBTQUE2NTg4X0NNRF9DTE9TRQlfSU9XKCdSJywgMiwgaW50KQogI2RlZmluZSBTQUE2NTg4X0NNRF9SRUFECV9JT1IoJ1InLCAzLCBpbnQpCiAjZGVmaW5lIFNBQTY1ODhfQ01EX1BPTEwJX0lPUignUicsIDQsIGludCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmggYi9pbmNsdWRlL21lZGlhL3NhYTY3NTJocy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg2ODZlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICAgIHNhYTY3NTJocy5oIC0gZGVmaW5pdGlvbiBmb3Igc2FhNjc1MmhzIE1QRUcgZW5jb2RlcgotCi0gICAgQ29weXJpZ2h0IChDKSAyMDAzIEFuZHJldyBkZSBRdWluY2V5IDxhZHFAbGlkc2tpYWxmLm5ldD4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zaTQ3MTMuaCBiL2luY2x1ZGUvbWVkaWEvc2k0NzEzLmgKaW5kZXggZWQ3MzUzZS4uZjk4YTBhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zaTQ3MTMuaAorKysgYi9pbmNsdWRlL21lZGlhL3NpNDcxMy5oCkBAIC0yMyw2ICsyMyw4IEBACiAgKiBQbGF0Zm9ybSBkZXBlbmRlbnQgZGVmaW5pdGlvbgogICovCiBzdHJ1Y3Qgc2k0NzEzX3BsYXRmb3JtX2RhdGEgeworCWNvbnN0IGNoYXIgKiBjb25zdCAqc3VwcGx5X25hbWVzOworCXVuc2lnbmVkIHN1cHBsaWVzOwogCWludCBncGlvX3Jlc2V0OyAvKiA8IDAgaWYgbm90IHVzZWQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1maC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKaW5kZXggNTI4Y2RhZi4uODAzNTE2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZAlhdmFpbGFibGU7IC8qIERlcXVldWVhYmxlIGV2ZW50ICovCiAJdW5zaWduZWQgaW50CQluYXZhaWxhYmxlOwogCXUzMgkJCXNlcXVlbmNlOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVjRMMl9NRU0yTUVNX0RFVikKKwlzdHJ1Y3QgdjRsMl9tMm1fY3R4CSptMm1fY3R4OworI2VuZGlmCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lbTJtZW0uaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZW0ybWVtLmgKaW5kZXggNDQ1NDJhMi4uMTJlYTVhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lbTJtZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVtMm1lbS5oCkBAIC02NCw2ICs2NCw5IEBACiB9OwogCiBzdHJ1Y3QgdjRsMl9tMm1fY3R4IHsKKwkvKiBvcHRpb25hbCBjYXAvb3V0IHZiMiBxdWV1ZXMgbG9jayAqLworCXN0cnVjdCBtdXRleAkJCSpxX2xvY2s7CisKIC8qIHByaXZhdGU6IGludGVybmFsIHVzZSBvbmx5ICovCiAJc3RydWN0IHY0bDJfbTJtX2RldgkJKm0ybV9kZXY7CiAKQEAgLTIyOSw1ICsyMzIsMjYgQEAKIAlyZXR1cm4gdjRsMl9tMm1fYnVmX3JlbW92ZSgmbTJtX2N0eC0+Y2FwX3FfY3R4KTsKIH0KIAorLyogdjRsMiBpb2N0bCBoZWxwZXJzICovCisKK2ludCB2NGwyX20ybV9pb2N0bF9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYik7CitpbnQgdjRsMl9tMm1faW9jdGxfY3JlYXRlX2J1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCXN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICpjcmVhdGUpOworaW50IHY0bDJfbTJtX2lvY3RsX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1Zik7CitpbnQgdjRsMl9tMm1faW9jdGxfZXhwYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgKmViKTsKK2ludCB2NGwyX20ybV9pb2N0bF9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1Zik7CitpbnQgdjRsMl9tMm1faW9jdGxfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKTsKK2ludCB2NGwyX20ybV9pb2N0bF9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpOworaW50IHY0bDJfbTJtX2lvY3RsX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpOworaW50IHY0bDJfbTJtX2ZvcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Cit1bnNpZ25lZCBpbnQgdjRsMl9tMm1fZm9wX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworCiAjZW5kaWYgLyogX01FRElBX1Y0TDJfTUVNMk1FTV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLW9mLmgKaW5kZXggM2E4YTg0MS4uNTQxY2VhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW9mLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLW9mLmgKQEAgLTUzLDcgKzUzLDYgQEAKICAqIEBwb3J0OiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIGEgcG9ydCB0aGlzIGVuZHBvaW50IGJlbG9uZ3MgdG8KICAqIEBpZDogaWRlbnRpZmllciAodmFsdWUgb2YgcmVnIHByb3BlcnR5KSBvZiB0aGlzIGVuZHBvaW50CiAgKiBAbG9jYWxfbm9kZTogcG9pbnRlciB0byBkZXZpY2Vfbm9kZSBvZiB0aGlzIGVuZHBvaW50Ci0gKiBAcmVtb3RlOiBwaGFuZGxlIHRvIHJlbW90ZSBlbmRwb2ludCBub2RlCiAgKiBAYnVzX3R5cGU6IGJ1cyB0eXBlCiAgKiBAYnVzOiBidXMgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQogICogQGhlYWQ6IGxpc3QgaGVhZCBmb3IgdGhpcyBzdHJ1Y3R1cmUKQEAgLTYyLDcgKzYxLDYgQEAKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAl1bnNpZ25lZCBpbnQgaWQ7CiAJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpsb2NhbF9ub2RlOwotCWNvbnN0IF9fYmUzMiAqcmVtb3RlOwogCWVudW0gdjRsMl9tYnVzX3R5cGUgYnVzX3R5cGU7CiAJdW5pb24gewogCQlzdHJ1Y3QgdjRsMl9vZl9idXNfcGFyYWxsZWwgcGFyYWxsZWw7CkBAIC03Miw4ICs3MCw4IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX09GCi12b2lkIHY0bDJfb2ZfcGFyc2VfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCXN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICpsaW5rKTsKK2ludCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgIHN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICplbmRwb2ludCk7CiBzdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCiAJCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOwogc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmggYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmgKaW5kZXggOTQxMDU1ZS4uYmVmNTNjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItY29yZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAvKioKICAqIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSAtIGN1cnJlbnQgdmlkZW8gYnVmZmVyIHN0YXRlCiAgKiBAVkIyX0JVRl9TVEFURV9ERVFVRVVFRDoJYnVmZmVyIHVuZGVyIHVzZXJzcGFjZSBjb250cm9sCisgKiBAVkIyX0JVRl9TVEFURV9QUkVQQVJJTkc6CWJ1ZmZlciBpcyBiZWluZyBwcmVwYXJlZCBpbiB2aWRlb2J1ZgogICogQFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ6CWJ1ZmZlciBwcmVwYXJlZCBpbiB2aWRlb2J1ZiBhbmQgYnkgdGhlIGRyaXZlcgogICogQFZCMl9CVUZfU1RBVEVfUVVFVUVEOglidWZmZXIgcXVldWVkIGluIHZpZGVvYnVmLCBidXQgbm90IGluIGRyaXZlcgogICogQFZCMl9CVUZfU1RBVEVfQUNUSVZFOglidWZmZXIgcXVldWVkIGluIGRyaXZlciBhbmQgcG9zc2libHkgdXNlZApAQCAtMTU0LDYgKzE1NSw3IEBACiAgKi8KIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSB7CiAJVkIyX0JVRl9TVEFURV9ERVFVRVVFRCwKKwlWQjJfQlVGX1NUQVRFX1BSRVBBUklORywKIAlWQjJfQlVGX1NUQVRFX1BSRVBBUkVELAogCVZCMl9CVUZfU1RBVEVfUVVFVUVELAogCVZCMl9CVUZfU1RBVEVfQUNUSVZFLApAQCAtMjUwLDEwICsyNTIsMTMgQEAKICAqCQkJcmVjZWl2ZSBidWZmZXJzIHdpdGggQGJ1Zl9xdWV1ZSBjYWxsYmFjayBiZWZvcmUKICAqCQkJQHN0YXJ0X3N0cmVhbWluZyBpcyBjYWxsZWQ7IHRoZSBkcml2ZXIgZ2V0cyB0aGUgbnVtYmVyCiAgKgkJCW9mIGFscmVhZHkgcXVldWVkIGJ1ZmZlcnMgaW4gY291bnQgcGFyYW1ldGVyOyBkcml2ZXIKLSAqCQkJY2FuIHJldHVybiBhbiBlcnJvciBpZiBoYXJkd2FyZSBmYWlscyBvciBub3QgZW5vdWdoCi0gKgkJCWJ1ZmZlcnMgaGFzIGJlZW4gcXVldWVkLCBpbiBzdWNoIGNhc2UgYWxsIGJ1ZmZlcnMgdGhhdAotICoJCQloYXZlIGJlZW4gYWxyZWFkeSBnaXZlbiBieSB0aGUgQGJ1Zl9xdWV1ZSBjYWxsYmFjayBhcmUKLSAqCQkJaW52YWxpZGF0ZWQuCisgKgkJCWNhbiByZXR1cm4gYW4gZXJyb3IgaWYgaGFyZHdhcmUgZmFpbHMsIGluIHRoYXQgY2FzZSBhbGwKKyAqCQkJYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBhbHJlYWR5IGdpdmVuIGJ5IHRoZSBAYnVmX3F1ZXVlCisgKgkJCWNhbGxiYWNrIGFyZSBpbnZhbGlkYXRlZC4KKyAqCQkJSWYgdGhlcmUgd2VyZSBub3QgZW5vdWdoIHF1ZXVlZCBidWZmZXJzIHRvIHN0YXJ0CisgKgkJCXN0cmVhbWluZywgdGhlbiB0aGlzIGNhbGxiYWNrIHJldHVybnMgLUVOT0JVRlMsIGFuZCB0aGUKKyAqCQkJdmIyIGNvcmUgd2lsbCByZXRyeSBjYWxsaW5nIEBzdGFydF9zdHJlYW1pbmcgd2hlbiBhIG5ldworICoJCQlidWZmZXIgaXMgcXVldWVkLgogICogQHN0b3Bfc3RyZWFtaW5nOgljYWxsZWQgd2hlbiAnc3RyZWFtaW5nJyBzdGF0ZSBtdXN0IGJlIGRpc2FibGVkOyBkcml2ZXIKICAqCQkJc2hvdWxkIHN0b3AgYW55IERNQSB0cmFuc2FjdGlvbnMgb3Igd2FpdCB1bnRpbCB0aGV5CiAgKgkJCWZpbmlzaCBhbmQgZ2l2ZSBiYWNrIGFsbCBidWZmZXJzIGl0IGdvdCBmcm9tIGJ1Zl9xdWV1ZSgpCkBAIC0zMjEsNiArMzI2LDkgQEAKICAqIEBkb25lX3dxOgl3YWl0cXVldWUgZm9yIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBidWZmZXJzIHJlYWR5IHRvIGJlIGRlcXVldWVkCiAgKiBAYWxsb2NfY3R4OgltZW1vcnkgdHlwZS9hbGxvY2F0b3Itc3BlY2lmaWMgY29udGV4dHMgZm9yIGVhY2ggcGxhbmUKICAqIEBzdHJlYW1pbmc6CWN1cnJlbnQgc3RyZWFtaW5nIHN0YXRlCisgKiBAcmV0cnlfc3RhcnRfc3RyZWFtaW5nOiBzdGFydF9zdHJlYW1pbmcoKSB3YXMgY2FsbGVkLCBidXQgdGhlcmUgd2VyZSBub3QgZW5vdWdoCisgKgkJYnVmZmVycyBxdWV1ZWQuIElmIHNldCwgdGhlbiByZXRyeSBjYWxsaW5nIHN0YXJ0X3N0cmVhbWluZyB3aGVuCisgKgkJcXVldWluZyBhIG5ldyBidWZmZXIuCiAgKiBAZmlsZWlvOglmaWxlIGlvIGVtdWxhdG9yIGludGVybmFsIGRhdGEsIHVzZWQgb25seSBpZiBlbXVsYXRvciBpcyBhY3RpdmUKICAqLwogc3RydWN0IHZiMl9xdWV1ZSB7CkBAIC0zNTMsNiArMzYxLDcgQEAKIAl1bnNpZ25lZCBpbnQJCQlwbGFuZV9zaXplc1tWSURFT19NQVhfUExBTkVTXTsKIAogCXVuc2lnbmVkIGludAkJCXN0cmVhbWluZzoxOworCXVuc2lnbmVkIGludAkJCXJldHJ5X3N0YXJ0X3N0cmVhbWluZzoxOwogCiAJc3RydWN0IHZiMl9maWxlaW9fZGF0YQkJKmZpbGVpbzsKIH07CkBAIC00OTEsNiArNTAwLDcgQEAKIAogaW50IHZiMl9mb3BfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogaW50IHZiMl9mb3BfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgX3ZiMl9mb3BfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IG11dGV4ICpsb2NrKTsKIHNzaXplX3QgdmIyX2ZvcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwogc3NpemVfdCB2YjJfZm9wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kYXRhbGluay5oIGIvaW5jbHVkZS9uZXQvZGF0YWxpbmsuaAppbmRleCBkZWI3Y2E3Li45M2NiMThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kYXRhbGluay5oCisrKyBiL2luY2x1ZGUvbmV0L2RhdGFsaW5rLmgKQEAgLTE1LDQgKzE1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiB9OwogCitzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKm1ha2VfRUlJX2NsaWVudCh2b2lkKTsKK3ZvaWQgZGVzdHJveV9FSUlfY2xpZW50KHN0cnVjdCBkYXRhbGlua19wcm90byAqZGwpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kbi5oIGIvaW5jbHVkZS9uZXQvZG4uaAppbmRleCBjY2MxNTU4Li45MTNiNzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbi5oCisrKyBiL2luY2x1ZGUvbmV0L2RuLmgKQEAgLTIwMCw2ICsyMDAsOCBAQAogfQogCiB1bnNpZ25lZCBpbnQgZG5fbXNzX2Zyb21fcG10dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3ZvaWQgZG5fcmVnaXN0ZXJfc3lzY3RsKHZvaWQpOwordm9pZCBkbl91bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKIAogI2RlZmluZSBETl9NRU5VVkVSX0FDQyAweDAxCiAjZGVmaW5lIEROX01FTlVWRVJfVVNSIDB4MDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmggYi9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oCmluZGV4IGI0MDlhZDYuLjU1ZGY5OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvZG5fcm91dGUuaApAQCAtMjAsNiArMjAsOCBAQAogCQkJIHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKTsKIGludCBkbl9jYWNoZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiB2b2lkIGRuX3J0X2NhY2hlX2ZsdXNoKGludCBkZWxheSk7CitpbnQgZG5fcm91dGVfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwogCiAvKiBNYXNrcyBmb3IgZmxhZ3MgZmllbGQgKi8KICNkZWZpbmUgRE5fUlRfRl9QSUQgMHgwNyAvKiBNYXNrIGZvciBwYWNrZXQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZXRob2MuaCBiL2luY2x1ZGUvbmV0L2V0aG9jLmgKaW5kZXggOTZmMzc4OS4uMmEyZDZiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZXRob2MuaAorKysgYi9pbmNsdWRlL25ldC9ldGhvYy5oCkBAIC0xNiw2ICsxNiw3IEBACiBzdHJ1Y3QgZXRob2NfcGxhdGZvcm1fZGF0YSB7CiAJdTggaHdhZGRyW0lGSFdBRERSTEVOXTsKIAlzOCBwaHlfaWQ7CisJdTMyIGV0aF9jbGtmcmVxOwogfTsKIAogI2VuZGlmIC8qICFMSU5VWF9ORVRfRVRIT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB4LmggYi9pbmNsdWRlL25ldC9pcHguaAppbmRleCA5ZTllMzU0Li4wMTQzMTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHguaAorKysgYi9pbmNsdWRlL25ldC9pcHguaApAQCAtMTQwLDYgKzE0MCwxNyBAQAogfQogCiB2b2lkIGlweGl0Zl9kb3duKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpOworc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX2JlMzIgbmV0KTsKK2ludCBpcHhpdGZfc2VuZChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpub2RlKTsKK19fYmUxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK2ludCBpcHhydHJfYWRkX3JvdXRlKF9fYmUzMiBuZXR3b3JrLCBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKm5vZGUpOwordm9pZCBpcHhydHJfZGVsX3JvdXRlcyhzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKTsKK2ludCBpcHhydHJfcm91dGVfcGFja2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyX2lweCAqdXNpcHgsCisJCQlzdHJ1Y3QgaW92ZWMgKmlvdiwgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2spOworaW50IGlweHJ0cl9yb3V0ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdHJ1Y3QgaXB4X3JvdXRlICppcHhydHJfbG9va3VwKF9fYmUzMiBuZXQpOworaW50IGlweHJ0cl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBpcHhpdGZfcHV0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggZGE2OGM5YS4uOTkxZGNkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtMTYyLDYgKzE2MiwxNCBAQAogc3RydWN0IG5ldCAqZ2V0X25ldF9uc19ieV9waWQocGlkX3QgcGlkKTsKIHN0cnVjdCBuZXQgKmdldF9uZXRfbnNfYnlfZmQoaW50IHBpZCk7CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCit2b2lkIGlweF9yZWdpc3Rlcl9zeXNjdGwodm9pZCk7Cit2b2lkIGlweF91bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGlweF9yZWdpc3Rlcl9zeXNjdGwoKQorI2RlZmluZSBpcHhfdW5yZWdpc3Rlcl9zeXNjdGwoKQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTkVUX05TCiB2b2lkIF9fcHV0X25ldChzdHJ1Y3QgbmV0ICpuZXQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggMDFlYTZlZS4uYjJhYzYyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMjg0LDYgKzI4NCw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19oYXNoX3JuZDsKIHZvaWQgaW5pdF9uZl9jb25udHJhY2tfaGFzaF9ybmQodm9pZCk7CiAKK3ZvaWQgbmZfY29ubnRyYWNrX3RtcGxfaW5zZXJ0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2Nvbm4gKnRtcGwpOworCiAjZGVmaW5lIE5GX0NUX1NUQVRfSU5DKG5ldCwgY291bnQpCSAgX190aGlzX2NwdV9pbmMoKG5ldCktPmN0LnN0YXQtPmNvdW50KQogI2RlZmluZSBORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBjb3VudCkgdGhpc19jcHVfaW5jKChuZXQpLT5jdC5zdGF0LT5jb3VudCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCmluZGV4IDU3YzhmZjcuLmU3ZTE0ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKQEAgLTI1Miw2ICsyNTIsNyBAQAogICoJQG93bmVyOiBtb2R1bGUgcmVmZXJlbmNlCiAgKglAcG9saWN5OiBuZXRsaW5rIGF0dHJpYnV0ZSBwb2xpY3kKICAqCUBtYXhhdHRyOiBoaWdoZXN0IG5ldGxpbmsgYXR0cmlidXRlIG51bWJlcgorICoJQGZhbWlseTogYWRkcmVzcyBmYW1pbHkgZm9yIEFGLXNwZWNpZmljIHR5cGVzCiAgKi8KIHN0cnVjdCBuZnRfZXhwcl90eXBlIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzCSooKnNlbGVjdF9vcHMpKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICosCkBAIC0yNjIsNiArMjYzLDcgQEAKIAlzdHJ1Y3QgbW9kdWxlCQkJKm93bmVyOwogCWNvbnN0IHN0cnVjdCBubGFfcG9saWN5CQkqcG9saWN5OwogCXVuc2lnbmVkIGludAkJCW1heGF0dHI7CisJdTgJCQkJZmFtaWx5OwogfTsKIAogLyoqCkBAIC0zMjAsNyArMzIyLDYgQEAKICAqCXN0cnVjdCBuZnRfcnVsZSAtIG5mX3RhYmxlcyBydWxlCiAgKgogICoJQGxpc3Q6IHVzZWQgaW50ZXJuYWxseQotICoJQHJjdV9oZWFkOiB1c2VkIGludGVybmFsbHkgZm9yIHJjdQogICoJQGhhbmRsZTogcnVsZSBoYW5kbGUKICAqCUBnZW5tYXNrOiBnZW5lcmF0aW9uIG1hc2sKICAqCUBkbGVuOiBsZW5ndGggb2YgZXhwcmVzc2lvbiBkYXRhCkBAIC0zMjgsNyArMzI5LDYgQEAKICAqLwogc3RydWN0IG5mdF9ydWxlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCXN0cnVjdCByY3VfaGVhZAkJCXJjdV9oZWFkOwogCXU2NAkJCQloYW5kbGU6NDYsCiAJCQkJCWdlbm1hc2s6MiwKIAkJCQkJZGxlbjoxNjsKQEAgLTM4OSw3ICszODksNiBAQAogICoKICAqCUBydWxlczogbGlzdCBvZiBydWxlcyBpbiB0aGUgY2hhaW4KICAqCUBsaXN0OiB1c2VkIGludGVybmFsbHkKLSAqCUByY3VfaGVhZDogdXNlZCBpbnRlcm5hbGx5CiAgKglAbmV0OiBuZXQgbmFtZXNwYWNlIHRoYXQgdGhpcyBjaGFpbiBiZWxvbmdzIHRvCiAgKglAdGFibGU6IHRhYmxlIHRoYXQgdGhpcyBjaGFpbiBiZWxvbmdzIHRvCiAgKglAaGFuZGxlOiBjaGFpbiBoYW5kbGUKQEAgLTQwMSw3ICs0MDAsNiBAQAogc3RydWN0IG5mdF9jaGFpbiB7CiAJc3RydWN0IGxpc3RfaGVhZAkJcnVsZXM7CiAJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKLQlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKIAlzdHJ1Y3QgbmV0CQkJKm5ldDsKIAlzdHJ1Y3QgbmZ0X3RhYmxlCQkqdGFibGU7CiAJdTY0CQkJCWhhbmRsZTsKQEAgLTUyOSw2ICs1MjcsOSBAQAogI2RlZmluZSBNT0RVTEVfQUxJQVNfTkZUX0NIQUlOKGZhbWlseSwgbmFtZSkgXAogCU1PRFVMRV9BTElBUygibmZ0LWNoYWluLSIgX19zdHJpbmdpZnkoZmFtaWx5KSAiLSIgbmFtZSkKIAorI2RlZmluZSBNT0RVTEVfQUxJQVNfTkZUX0FGX0VYUFIoZmFtaWx5LCBuYW1lKSBcCisJTU9EVUxFX0FMSUFTKCJuZnQtZXhwci0iIF9fc3RyaW5naWZ5KGZhbWlseSkgIi0iIG5hbWUpCisKICNkZWZpbmUgTU9EVUxFX0FMSUFTX05GVF9FWFBSKG5hbWUpIFwKIAlNT0RVTEVfQUxJQVMoIm5mdC1leHByLSIgbmFtZSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiMGRhMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfTkZUX1JFSkVDVF9IXworI2RlZmluZSBfTkZUX1JFSkVDVF9IXworCitzdHJ1Y3QgbmZ0X3JlamVjdCB7CisJZW51bSBuZnRfcmVqZWN0X3R5cGVzCXR5cGU6ODsKKwl1OAkJCWljbXBfY29kZTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcmVqZWN0X3BvbGljeVtdOworCitpbnQgbmZ0X3JlamVjdF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSk7CisKK2ludCBuZnRfcmVqZWN0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKTsKKwordm9pZCBuZnRfcmVqZWN0X2lwdjRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KTsKKwordm9pZCBuZnRfcmVqZWN0X2lwdjZfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCA2NmQ0MmVkLi4wYTRlZGZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTE1NSw2ICsxNTUsNyBAQAogLyogdmFsdWVzIGZvciBzZXJ2aWNlIGFjdGlvbiBpbiAqLwogI2RlZmluZQlTQUlfUkVBRF9DQVBBQ0lUWV8xNiAgMHgxMAogI2RlZmluZSBTQUlfR0VUX0xCQV9TVEFUVVMgICAgMHgxMgorI2RlZmluZSBTQUlfUkVQT1JUX1JFRkVSUkFMUyAgMHgxMwogLyogdmFsdWVzIGZvciBWQVJJQUJMRV9MRU5HVEhfQ01EIHNlcnZpY2UgYWN0aW9uIGNvZGVzCiAgKiBzZWUgc3BjNHIxNyBTZWN0aW9uIEQuMy41LCB0YWJsZSBELjcgYW5kIEQuOCAqLwogI2RlZmluZSBWTENfU0FfUkVDRUlWRV9DUkVERU5USUFMIDB4MTgwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvaXNjc2kvaXNjc2lfdHJhbnNwb3J0LmggYi9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90cmFuc3BvcnQuaAppbmRleCBhMTI1ODljLi5hZTVhMTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90cmFuc3BvcnQuaAorKysgYi9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90cmFuc3BvcnQuaApAQCAtOTQsNyArOTQsNyBAQAogLyoKICAqIEZyb20gaXNjc2lfdGFyZ2V0X3V0aWwuYwogICovCi1leHRlcm4gc3RydWN0IGlzY3NpX2NtZCAqaXNjc2l0X2FsbG9jYXRlX2NtZChzdHJ1Y3QgaXNjc2lfY29ubiAqLCBnZnBfdCk7CitleHRlcm4gc3RydWN0IGlzY3NpX2NtZCAqaXNjc2l0X2FsbG9jYXRlX2NtZChzdHJ1Y3QgaXNjc2lfY29ubiAqLCBpbnQpOwogZXh0ZXJuIGludCBpc2NzaXRfc2VxdWVuY2VfY21kKHN0cnVjdCBpc2NzaV9jb25uICosIHN0cnVjdCBpc2NzaV9jbWQgKiwKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIF9fYmUzMik7CiBleHRlcm4gdm9pZCBpc2NzaXRfcmVsZWFzZV9jbWQoc3RydWN0IGlzY3NpX2NtZCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaAppbmRleCAzOWUwMTE0Li43MDIwZTMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFja2VuZC5oCkBAIC00MSw2ICs0MSw5IEBACiAJdW5zaWduZWQgaW50ICgqZ2V0X2lvX29wdCkoc3RydWN0IHNlX2RldmljZSAqKTsKIAl1bnNpZ25lZCBjaGFyICooKmdldF9zZW5zZV9idWZmZXIpKHN0cnVjdCBzZV9jbWQgKik7CiAJYm9vbCAoKmdldF93cml0ZV9jYWNoZSkoc3RydWN0IHNlX2RldmljZSAqKTsKKwlpbnQgKCppbml0X3Byb3QpKHN0cnVjdCBzZV9kZXZpY2UgKik7CisJaW50ICgqZm9ybWF0X3Byb3QpKHN0cnVjdCBzZV9kZXZpY2UgKik7CisJdm9pZCAoKmZyZWVfcHJvdCkoc3RydWN0IHNlX2RldmljZSAqKTsKIH07CiAKIHN0cnVjdCBzYmNfb3BzIHsKQEAgLTcwLDYgKzczLDEwIEBACiAJc2Vuc2VfcmVhc29uX3QgKCpkb191bm1hcF9mbikoc3RydWN0IHNlX2NtZCAqY21kLCB2b2lkICpwcml2LAogCQkJCSAgICAgIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYiksCiAJdm9pZCAqcHJpdik7CitzZW5zZV9yZWFzb25fdAlzYmNfZGlmX3ZlcmlmeV93cml0ZShzdHJ1Y3Qgc2VfY21kICosIHNlY3Rvcl90LCB1bnNpZ25lZCBpbnQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQpOworc2Vuc2VfcmVhc29uX3QJc2JjX2RpZl92ZXJpZnlfcmVhZChzdHJ1Y3Qgc2VfY21kICosIHNlY3Rvcl90LCB1bnNpZ25lZCBpbnQsCisJCQkJICAgIHVuc2lnbmVkIGludCwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCk7CiAKIHZvaWQJdHJhbnNwb3J0X3NldF92cGRfcHJvdG9faWQoc3RydWN0IHQxMF92cGQgKiwgdW5zaWduZWQgY2hhciAqKTsKIGludAl0cmFuc3BvcnRfc2V0X3ZwZF9hc3NvYyhzdHJ1Y3QgdDEwX3ZwZCAqLCB1bnNpZ25lZCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCmluZGV4IDMyMTMwMWMuLmM5Yzc5MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaAorKysgYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKQEAgLTM3LDYgKzM3LDkgQEAKIC8qIFVzZWQgYnkgdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgpICovCiAjZGVmaW5lIFNQQ19TRU5TRV9LRVlfT0ZGU0VUCQkJMgogI2RlZmluZSBTUENfQUREX1NFTlNFX0xFTl9PRkZTRVQJCTcKKyNkZWZpbmUgU1BDX0RFU0NfVFlQRV9PRkZTRVQJCQk4CisjZGVmaW5lIFNQQ19BRERJVElPTkFMX0RFU0NfTEVOX09GRlNFVAkJOQorI2RlZmluZSBTUENfVkFMSURJVFlfT0ZGU0VUCQkJMTAKICNkZWZpbmUgU1BDX0FTQ19LRVlfT0ZGU0VUCQkJMTIKICNkZWZpbmUgU1BDX0FTQ1FfS0VZX09GRlNFVAkJCTEzCiAjZGVmaW5lIFRSQU5TUE9SVF9JUU5fTEVOCQkJMjI0CkBAIC0xMTIsNyArMTE1LDcgQEAKIC8qIFF1ZXVlIEFsZ29yaXRobSBNb2RpZmllciBkZWZhdWx0IGZvciByZXN0cmljdGVkIHJlb3JkZXJpbmcgaW4gY29udHJvbCBtb2RlIHBhZ2UgKi8KICNkZWZpbmUgREFfRU1VTEFURV9SRVNUX1JFT1JECQkJMAogCi0jZGVmaW5lIFNFX0lOUVVJUllfQlVGCQkJCTUxMgorI2RlZmluZSBTRV9JTlFVSVJZX0JVRgkJCQkxMDI0CiAjZGVmaW5lIFNFX01PREVfUEFHRV9CVUYJCQk1MTIKICNkZWZpbmUgU0VfU0VOU0VfQlVGCQkJCTk2CiAKQEAgLTIwNSw2ICsyMDgsOSBAQAogCVRDTV9PVVRfT0ZfUkVTT1VSQ0VTCQkJPSBSKDB4MTIpLAogCVRDTV9QQVJBTUVURVJfTElTVF9MRU5HVEhfRVJST1IJCT0gUigweDEzKSwKIAlUQ01fTUlTQ09NUEFSRV9WRVJJRlkJCQk9IFIoMHgxNCksCisJVENNX0xPR0lDQUxfQkxPQ0tfR1VBUkRfQ0hFQ0tfRkFJTEVECT0gUigweDE1KSwKKwlUQ01fTE9HSUNBTF9CTE9DS19BUFBfVEFHX0NIRUNLX0ZBSUxFRAk9IFIoMHgxNiksCisJVENNX0xPR0lDQUxfQkxPQ0tfUkVGX1RBR19DSEVDS19GQUlMRUQJPSBSKDB4MTcpLAogI3VuZGVmIFIKIH07CiAKQEAgLTI0NywxMCArMjUzLDI4IEBACiAKIHN0cnVjdCBzZV9jbWQ7CiAKK3N0cnVjdCB0MTBfYWx1YV9sYmFfbWFwX21lbWJlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsYmFfbWFwX21lbV9saXN0OworCWludCBsYmFfbWFwX21lbV9hbHVhX3N0YXRlOworCWludCBsYmFfbWFwX21lbV9hbHVhX3BnX2lkOworfTsKKworc3RydWN0IHQxMF9hbHVhX2xiYV9tYXAgeworCXU2NCBsYmFfbWFwX2ZpcnN0X2xiYTsKKwl1NjQgbGJhX21hcF9sYXN0X2xiYTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxiYV9tYXBfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxiYV9tYXBfbWVtX2xpc3Q7Cit9OworCiBzdHJ1Y3QgdDEwX2FsdWEgewogCS8qIEFMVUEgVGFyZ2V0IFBvcnQgR3JvdXAgSUQgKi8KIAl1MTYJYWx1YV90Z19wdF9ncHNfY291bnRlcjsKIAl1MzIJYWx1YV90Z19wdF9ncHNfY291bnQ7CisJLyogUmVmZXJyYWxzIHN1cHBvcnQgKi8KKwlzcGlubG9ja190IGxiYV9tYXBfbG9jazsKKwl1MzIgICAgIGxiYV9tYXBfc2VnbWVudF9zaXplOworCXUzMiAgICAgbGJhX21hcF9zZWdtZW50X211bHRpcGxpZXI7CisJc3RydWN0IGxpc3RfaGVhZCBsYmFfbWFwX2xpc3Q7CiAJc3BpbmxvY2tfdCB0Z19wdF9ncHNfbG9jazsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICp0MTBfZGV2OwogCS8qIFVzZWQgZm9yIGRlZmF1bHQgQUxVQSBUYXJnZXQgUG9ydCBHcm91cCAqLwpAQCAtMjg0LDYgKzMwOCw4IEBACiAJdTE2CXRnX3B0X2dwX2lkOwogCWludAl0Z19wdF9ncF92YWxpZF9pZDsKIAlpbnQJdGdfcHRfZ3BfYWx1YV9zdXBwb3J0ZWRfc3RhdGVzOworCWludAl0Z19wdF9ncF9hbHVhX3BlbmRpbmdfc3RhdGU7CisJaW50CXRnX3B0X2dwX2FsdWFfcHJldmlvdXNfc3RhdGU7CiAJaW50CXRnX3B0X2dwX2FsdWFfYWNjZXNzX3N0YXR1czsKIAlpbnQJdGdfcHRfZ3BfYWx1YV9hY2Nlc3NfdHlwZTsKIAlpbnQJdGdfcHRfZ3Bfbm9ub3BfZGVsYXlfbXNlY3M7CkBAIC0yOTEsOSArMzE3LDYgQEAKIAlpbnQJdGdfcHRfZ3BfaW1wbGljaXRfdHJhbnNfc2VjczsKIAlpbnQJdGdfcHRfZ3BfcHJlZjsKIAlpbnQJdGdfcHRfZ3Bfd3JpdGVfbWV0YWRhdGE7Ci0JLyogVXNlZCBieSBzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AtPnRnX3B0X2dwX21kX2J1Zl9sZW4gKi8KLSNkZWZpbmUgQUxVQV9NRF9CVUZfTEVOCQkJCTEwMjQKLQl1MzIJdGdfcHRfZ3BfbWRfYnVmX2xlbjsKIAl1MzIJdGdfcHRfZ3BfbWVtYmVyczsKIAlhdG9taWNfdCB0Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0ZTsKIAlhdG9taWNfdCB0Z19wdF9ncF9yZWZfY250OwpAQCAtMzAzLDYgKzMyNiwxMCBAQAogCXN0cnVjdCBjb25maWdfZ3JvdXAgdGdfcHRfZ3BfZ3JvdXA7CiAJc3RydWN0IGxpc3RfaGVhZCB0Z19wdF9ncF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgdGdfcHRfZ3BfbWVtX2xpc3Q7CisJc3RydWN0IHNlX3BvcnQgKnRnX3B0X2dwX2FsdWFfcG9ydDsKKwlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnRnX3B0X2dwX2FsdWFfbmFjbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRnX3B0X2dwX3RyYW5zaXRpb25fd29yazsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqdGdfcHRfZ3BfdHJhbnNpdGlvbl9jb21wbGV0ZTsKIH07CiAKIHN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgewpAQCAtNDE0LDYgKzQ0MSwzNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdG1yX2xpc3Q7CiB9OwogCitlbnVtIHRhcmdldF9wcm90X29wIHsKKwlUQVJHRVRfUFJPVF9OT1JNQUwgPSAwLAorCVRBUkdFVF9QUk9UX0RJTl9JTlNFUlQsCisJVEFSR0VUX1BST1RfRE9VVF9JTlNFUlQsCisJVEFSR0VUX1BST1RfRElOX1NUUklQLAorCVRBUkdFVF9QUk9UX0RPVVRfU1RSSVAsCisJVEFSR0VUX1BST1RfRElOX1BBU1MsCisJVEFSR0VUX1BST1RfRE9VVF9QQVNTLAorfTsKKworZW51bSB0YXJnZXRfcHJvdF9obyB7CisJUFJPVF9TRVBFUkFURUQsCisJUFJPVF9JTlRFUkxFQVZFRCwKK307CisKK2VudW0gdGFyZ2V0X3Byb3RfdHlwZSB7CisJVEFSR0VUX0RJRl9UWVBFMF9QUk9ULAorCVRBUkdFVF9ESUZfVFlQRTFfUFJPVCwKKwlUQVJHRVRfRElGX1RZUEUyX1BST1QsCisJVEFSR0VUX0RJRl9UWVBFM19QUk9ULAorfTsKKworc3RydWN0IHNlX2RpZl92MV90dXBsZSB7CisJX19iZTE2CQkJZ3VhcmRfdGFnOworCV9fYmUxNgkJCWFwcF90YWc7CisJX19iZTMyCQkJcmVmX3RhZzsKK307CisKIHN0cnVjdCBzZV9jbWQgewogCS8qIFNBTSByZXNwb25zZSBjb2RlIGJlaW5nIHNlbnQgdG8gaW5pdGlhdG9yICovCiAJdTgJCQlzY3NpX3N0YXR1czsKQEAgLTQ5NywxNCArNTUyLDI0IEBACiAJdm9pZAkJCSpwcml2OwogCiAJLyogVXNlZCBmb3IgbHVuLT5sdW5fcmVmIGNvdW50aW5nICovCi0JYm9vbAkJCWx1bl9yZWZfYWN0aXZlOworCWludAkJCWx1bl9yZWZfYWN0aXZlOworCisJLyogRElGIHJlbGF0ZWQgbWVtYmVycyAqLworCWVudW0gdGFyZ2V0X3Byb3Rfb3AJcHJvdF9vcDsKKwllbnVtIHRhcmdldF9wcm90X3R5cGUJcHJvdF90eXBlOworCXUzMgkJCXByb3RfbGVuZ3RoOworCXUzMgkJCXJlZnRhZ19zZWVkOworCXN0cnVjdCBzY2F0dGVybGlzdAkqdF9wcm90X3NnOworCXVuc2lnbmVkIGludAkJdF9wcm90X25lbnRzOworCWVudW0gdGFyZ2V0X3Byb3RfaG8JcHJvdF9oYW5kb3ZlcjsKKwlzZW5zZV9yZWFzb25fdAkJcGlfZXJyOworCXNlY3Rvcl90CQliYWRfc2VjdG9yOwogfTsKIAogc3RydWN0IHNlX3VhIHsKIAl1OAkJCXVhX2FzYzsKIAl1OAkJCXVhX2FzY3E7CiAJc3RydWN0IHNlX25vZGVfYWNsCSp1YV9uYWNsOwotCXN0cnVjdCBsaXN0X2hlYWQJdWFfZGV2X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAl1YV9uYWNsX2xpc3Q7CiB9OwogCkBAIC02MDUsNiArNjcwLDkgQEAKIAlpbnQJCWVtdWxhdGVfdHB3czsKIAlpbnQJCWVtdWxhdGVfY2F3OwogCWludAkJZW11bGF0ZV8zcGM7CisJaW50CQlwaV9wcm90X2Zvcm1hdDsKKwllbnVtIHRhcmdldF9wcm90X3R5cGUgcGlfcHJvdF90eXBlOworCWVudW0gdGFyZ2V0X3Byb3RfdHlwZSBod19waV9wcm90X3R5cGU7CiAJaW50CQllbmZvcmNlX3ByX2lzaWRzOwogCWludAkJaXNfbm9ucm90OwogCWludAkJZW11bGF0ZV9yZXN0X3Jlb3JkOwpAQCAtNzM2LDYgKzgwNCw4IEBACiAJLyogTGlua2VkIGxpc3QgZm9yIHN0cnVjdCBzZV9oYmEgc3RydWN0IHNlX2RldmljZSBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlkZXZfbGlzdDsKIAlzdHJ1Y3Qgc2VfbHVuCQl4Y29weV9sdW47CisJLyogUHJvdGVjdGlvbiBJbmZvcm1hdGlvbiAqLworCWludAkJCXByb3RfbGVuZ3RoOwogfTsKIAogc3RydWN0IHNlX2hiYSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWMuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpYy5oCmluZGV4IDRjZjRmZGEuLjAyMThkNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpYy5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpYy5oCkBAIC0xMDUsNyArMTA1LDggQEAKIHNlbnNlX3JlYXNvbl90IHRhcmdldF9zZXR1cF9jbWRfZnJvbV9jZGIoc3RydWN0IHNlX2NtZCAqLCB1bnNpZ25lZCBjaGFyICopOwogaW50CXRhcmdldF9zdWJtaXRfY21kX21hcF9zZ2xzKHN0cnVjdCBzZV9jbWQgKiwgc3RydWN0IHNlX3Nlc3Npb24gKiwKIAkJdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHUzMiwgdTMyLCBpbnQsIGludCwgaW50LAotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdTMyLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdTMyKTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICosIHUzMiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIHUzMiwKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICosIHUzMik7CiBpbnQJdGFyZ2V0X3N1Ym1pdF9jbWQoc3RydWN0IHNlX2NtZCAqLCBzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqLCB1bnNpZ25lZCBjaGFyICosCiAJCXVuc2lnbmVkIGNoYXIgKiwgdTMyLCB1MzIsIGludCwgaW50LCBpbnQpOwogaW50CXRhcmdldF9zdWJtaXRfdG1yKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCwgc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9iY2FjaGUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oCmluZGV4IGUyYjk1NzYuLjcxMTA4OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oCkBAIC0yNCwxMCArMjQsMTAgQEAKIAkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OwogCQlfX2VudHJ5LT5vcmlnX21ham9yCT0gZC0+ZGlzay0+bWFqb3I7CiAJCV9fZW50cnktPm9yaWdfbWlub3IJPSBkLT5kaXNrLT5maXJzdF9taW5vcjsKLQkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOwotCQlfX2VudHJ5LT5vcmlnX3NlY3Rvcgk9IGJpby0+Ymlfc2VjdG9yIC0gMTY7Ci0JCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpby0+Ymlfc2l6ZSA+PiA5OwotCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOworCQlfX2VudHJ5LT5vcmlnX3NlY3Rvcgk9IGJpby0+YmlfaXRlci5iaV9zZWN0b3IgLSAxNjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gOTsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAJKSwKIAogCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IChmcm9tICVkLCVkIEAgJWxsdSkiLApAQCAtOTksOSArOTksOSBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKLQkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOwotCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW8tPmJpX3NpemUgPj4gOTsKLQkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gOTsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAJKSwKIAogCVRQX3ByaW50aygiJWQsJWQgICVzICVsbHUgKyAldSIsCkBAIC0xMzQsOSArMTM0LDkgQEAKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7Ci0JCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKLQkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7Ci0JCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpby0+YmlfaXRlci5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCQlfX2VudHJ5LT5jYWNoZV9oaXQgPSBoaXQ7CiAJCV9fZW50cnktPmJ5cGFzcyA9IGJ5cGFzczsKIAkpLApAQCAtMTYyLDkgKzE2Miw5IEBACiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OwotCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7Ci0JCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpby0+Ymlfc2l6ZSA+PiA5OwotCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOworCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA+PiA5OworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkJX19lbnRyeS0+d3JpdGViYWNrID0gd3JpdGViYWNrOwogCQlfX2VudHJ5LT5ieXBhc3MgPSBieXBhc3M7CiAJKSwKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCVRQX2Zhc3RfYXNzaWduKAogCQlfX2VudHJ5LT5idWNrZXQJPSBQVFJfQlVDS0VUX05SKGItPmMsICZiLT5rZXksIDApOwogCQlfX2VudHJ5LT5ibG9jawk9IGItPndyaXR0ZW47Ci0JCV9fZW50cnktPmtleXMJPSBiLT5zZXRzW2ItPm5zZXRzXS5kYXRhLT5rZXlzOworCQlfX2VudHJ5LT5rZXlzCT0gYi0+a2V5cy5zZXRbYi0+a2V5cy5uc2V0c10uZGF0YS0+a2V5czsKIAkpLAogCiAJVFBfcHJpbnRrKCJidWNrZXQgJXp1IiwgX19lbnRyeS0+YnVja2V0KQpAQCAtNDExLDcgKzQxMSw3IEBACiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5mcmVlCQk9IGZpZm9fdXNlZCgmY2EtPmZyZWUpOworCQlfX2VudHJ5LT5mcmVlCQk9IGZpZm9fdXNlZCgmY2EtPmZyZWVbUkVTRVJWRV9OT05FXSk7CiAJCV9fZW50cnktPmZyZWVfaW5jCT0gZmlmb191c2VkKCZjYS0+ZnJlZV9pbmMpOwogCQlfX2VudHJ5LT5mcmVlX2luY19zaXplCT0gY2EtPmZyZWVfaW5jLnNpemU7CiAJCV9fZW50cnktPnVudXNlZAkJPSBmaWZvX3VzZWQoJmNhLT51bnVzZWQpOwpAQCAtNDIyLDggKzQyMiw4IEBACiApOwogCiBUUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfZmFpbCwKLQlUUF9QUk9UTyhzdHJ1Y3QgY2FjaGUgKmNhKSwKLQlUUF9BUkdTKGNhKSwKKwlUUF9QUk9UTyhzdHJ1Y3QgY2FjaGUgKmNhLCB1bnNpZ25lZCByZXNlcnZlKSwKKwlUUF9BUkdTKGNhLCByZXNlcnZlKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQodW5zaWduZWQsCWZyZWUJCQkpCkBAIC00MzMsNyArNDMzLDcgQEAKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmZyZWUJCT0gZmlmb191c2VkKCZjYS0+ZnJlZSk7CisJCV9fZW50cnktPmZyZWUJCT0gZmlmb191c2VkKCZjYS0+ZnJlZVtyZXNlcnZlXSk7CiAJCV9fZW50cnktPmZyZWVfaW5jCT0gZmlmb191c2VkKCZjYS0+ZnJlZV9pbmMpOwogCQlfX2VudHJ5LT51bnVzZWQJCT0gZmlmb191c2VkKCZjYS0+dW51c2VkKTsKIAkJX19lbnRyeS0+YmxvY2tlZAk9IGF0b21pY19yZWFkKCZjYS0+c2V0LT5wcmlvX2Jsb2NrZWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKaW5kZXggNGMyMzAxZC4uZTc2YWUxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCkBAIC0yNDMsOSArMjQzLDkgQEAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldiA/CiAJCQkJCSAgYmlvLT5iaV9iZGV2LT5iZF9kZXYgOiAwOwotCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW9fc2VjdG9ycyhiaW8pOwotCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CiAJKSwKIApAQCAtMjgwLDEwICsyODAsMTAgQEAKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7Ci0JCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CiAJCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpb19zZWN0b3JzKGJpbyk7CiAJCV9fZW50cnktPmVycm9yCQk9IGVycm9yOwotCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCSksCiAKIAlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJWRdIiwKQEAgLTMwOCw5ICszMDgsOSBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKLQkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvX3NlY3RvcnMoYmlvKTsKLQkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCSksCiAKQEAgLTM3NSw5ICszNzUsOSBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKLQkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvX3NlY3RvcnMoYmlvKTsKLQkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCSksCiAKQEAgLTQwMyw3ICs0MDMsNyBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRldgkJPSBiaW8gPyBiaW8tPmJpX2JkZXYtPmJkX2RldiA6IDA7Ci0JCV9fZW50cnktPnNlY3RvcgkJPSBiaW8gPyBiaW8tPmJpX3NlY3RvciA6IDA7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8gPyBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yIDogMDsKIAkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvID8gYmlvX3NlY3RvcnMoYmlvKSA6IDA7CiAJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywKIAkJCSAgICAgIGJpbyA/IGJpby0+YmlfcncgOiAwLCBfX2VudHJ5LT5ucl9zZWN0b3IpOwpAQCAtNTM4LDkgKzUzOCw5IEBACiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OwotCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQlfX2VudHJ5LT5uZXdfc2VjdG9yCT0gbmV3X3NlY3RvcjsKLQkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCSksCiAKQEAgLTU3OSwxMSArNTc5LDExIEBACiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OwotCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW9fc2VjdG9ycyhiaW8pOwogCQlfX2VudHJ5LT5vbGRfZGV2CT0gZGV2OwogCQlfX2VudHJ5LT5vbGRfc2VjdG9yCT0gZnJvbTsKLQkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+YmlfaXRlci5iaV9zaXplKTsKIAkpLAogCiAJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgPC0gKCVkLCVkKSAlbGx1IiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2J0cmZzLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9idHJmcy5oCmluZGV4IDQ4MzJkNzUuLjMxNzZjZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2J0cmZzLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYnRyZnMuaApAQCAtMjA4LDE3ICsyMDgsMTggQEAKIAkJICBfX2VudHJ5LT5yZWZzLCBfX2VudHJ5LT5jb21wcmVzc190eXBlKQogKTsKIAotI2RlZmluZSBzaG93X29yZGVyZWRfZmxhZ3MoZmxhZ3MpCQkJCQlcCi0JX19wcmludF9zeW1ib2xpYyhmbGFncywJCQkJCQlcCi0JCXsgQlRSRlNfT1JERVJFRF9JT19ET05FLCAJIklPX0RPTkUiIAl9LAlcCi0JCXsgQlRSRlNfT1JERVJFRF9DT01QTEVURSwgCSJDT01QTEVURSIgCX0sCVwKLQkJeyBCVFJGU19PUkRFUkVEX05PQ09XLCAJCSJOT0NPVyIgCX0sCVwKLQkJeyBCVFJGU19PUkRFUkVEX0NPTVBSRVNTRUQsIAkiQ09NUFJFU1NFRCIgCX0sCVwKLQkJeyBCVFJGU19PUkRFUkVEX1BSRUFMTE9DLCAJIlBSRUFMTE9DIiAJfSwJXAotCQl7IEJUUkZTX09SREVSRURfRElSRUNULCAJIkRJUkVDVCIgCX0sCVwKLQkJeyBCVFJGU19PUkRFUkVEX0lPRVJSLCAJCSJJT0VSUiIgCX0sCVwKLQkJeyBCVFJGU19PUkRFUkVEX1VQREFURURfSVNJWkUsIAkiVVBEQVRFRF9JU0laRSIJfSwJXAotCQl7IEJUUkZTX09SREVSRURfTE9HR0VEX0NTVU0sIAkiTE9HR0VEX0NTVU0iCX0pCisjZGVmaW5lIHNob3dfb3JkZXJlZF9mbGFncyhmbGFncykJCQkJCSAgIFwKKwlfX3ByaW50X2ZsYWdzKGZsYWdzLCAifCIsCQkJCQkgICBcCisJCXsgKDEgPDwgQlRSRlNfT1JERVJFRF9JT19ET05FKSwgCSJJT19ET05FIiAJfSwgXAorCQl7ICgxIDw8IEJUUkZTX09SREVSRURfQ09NUExFVEUpLCAJIkNPTVBMRVRFIiAJfSwgXAorCQl7ICgxIDw8IEJUUkZTX09SREVSRURfTk9DT1cpLCAJCSJOT0NPVyIgCX0sIFwKKwkJeyAoMSA8PCBCVFJGU19PUkRFUkVEX0NPTVBSRVNTRUQpLCAJIkNPTVBSRVNTRUQiIAl9LCBcCisJCXsgKDEgPDwgQlRSRlNfT1JERVJFRF9QUkVBTExPQyksIAkiUFJFQUxMT0MiIAl9LCBcCisJCXsgKDEgPDwgQlRSRlNfT1JERVJFRF9ESVJFQ1QpLAkgCSJESVJFQ1QiIAl9LCBcCisJCXsgKDEgPDwgQlRSRlNfT1JERVJFRF9JT0VSUiksIAkJIklPRVJSIiAJfSwgXAorCQl7ICgxIDw8IEJUUkZTX09SREVSRURfVVBEQVRFRF9JU0laRSksIAkiVVBEQVRFRF9JU0laRSIJfSwgXAorCQl7ICgxIDw8IEJUUkZTX09SREVSRURfTE9HR0VEX0NTVU0pLCAJIkxPR0dFRF9DU1VNIgl9LCBcCisJCXsgKDEgPDwgQlRSRlNfT1JERVJFRF9UUlVOQ0FURUQpLCAJIlRSVU5DQVRFRCIJfSkKIAogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGJ0cmZzX19vcmRlcmVkX2V4dGVudCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaAppbmRleCAzYjlmMjhkLi42N2YzOGZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9mMmZzLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZjJmcy5oCkBAIC02MjksOCArNjI5LDggQEAKIAkJX19lbnRyeS0+ZGV2CQk9IHNiLT5zX2RldjsKIAkJX19lbnRyeS0+cncJCT0gcnc7CiAJCV9fZW50cnktPnR5cGUJCT0gdHlwZTsKLQkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOwotCQlfX2VudHJ5LT5zaXplCQk9IGJpby0+Ymlfc2l6ZTsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJCV9fZW50cnktPnNpemUJCT0gYmlvLT5iaV9pdGVyLmJpX3NpemU7CiAJKSwKIAogCVRQX3ByaW50aygiZGV2ID0gKCVkLCVkKSwgJXMlcywgJXMsIHNlY3RvciA9ICVsbGQsIHNpemUgPSAldSIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92NGwyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92NGwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5NGVjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Y0bDIuaApAQCAtMCwwICsxLDE1NyBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gdjRsMgorCisjaWYgIWRlZmluZWQoX1RSQUNFX1Y0TDJfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1Y0TDJfSAorCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjZGVmaW5lIHNob3dfdHlwZSh0eXBlKQkJCQkJCQkgICAgICAgXAorCV9fcHJpbnRfc3ltYm9saWModHlwZSwJCQkJCQkgICAgICAgXAorCQl7IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwJICAgICAgIlZJREVPX0NBUFRVUkUiIH0sICAgICAgIFwKKwkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwJICAgICAgIlZJREVPX09VVFBVVCIgfSwJICAgICAgIFwKKwkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVksCSAgICAgICJWSURFT19PVkVSTEFZIiB9LCAgICAgICBcCisJCXsgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwJICAgICAgIlZCSV9DQVBUVVJFIiB9LAkgICAgICAgXAorCQl7IFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCwJICAgICAgIlZCSV9PVVRQVVQiIH0sCSAgICAgICBcCisJCXsgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUsICAgIlNMSUNFRF9WQklfQ0FQVFVSRSIgfSwgIFwKKwkJeyBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVULCAgICAiU0xJQ0VEX1ZCSV9PVVRQVVQiIH0sICAgXAorCQl7IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVksICJWSURFT19PVVRQVVRfT1ZFUkxBWSIgfSxcCisJCXsgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgIlZJREVPX0NBUFRVUkVfTVBMQU5FIiB9LFwKKwkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsICAiVklERU9fT1VUUFVUX01QTEFORSIgfSwgXAorCQl7IFY0TDJfQlVGX1RZUEVfUFJJVkFURSwJICAgICAgIlBSSVZBVEUiIH0pCisKKyNkZWZpbmUgc2hvd19maWVsZChmaWVsZCkJCQkJCQlcCisJX19wcmludF9zeW1ib2xpYyhmaWVsZCwJCQkJCQlcCisJCXsgVjRMMl9GSUVMRF9BTlksCQkiQU5ZIiB9LAkJXAorCQl7IFY0TDJfRklFTERfTk9ORSwJCSJOT05FIiB9LAkJXAorCQl7IFY0TDJfRklFTERfVE9QLAkJIlRPUCIgfSwJCVwKKwkJeyBWNEwyX0ZJRUxEX0JPVFRPTSwJCSJCT1RUT00iIH0sCQlcCisJCXsgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAkiSU5URVJMQUNFRCIgfSwJCVwKKwkJeyBWNEwyX0ZJRUxEX1NFUV9UQiwJCSJTRVFfVEIiIH0sCQlcCisJCXsgVjRMMl9GSUVMRF9TRVFfQlQsCQkiU0VRX0JUIiB9LAkJXAorCQl7IFY0TDJfRklFTERfQUxURVJOQVRFLAkJIkFMVEVSTkFURSIgfSwJCVwKKwkJeyBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIsCSJJTlRFUkxBQ0VEX1RCIiB9LCAgICAgIFwKKwkJeyBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQsCSJJTlRFUkxBQ0VEX0JUIiB9KQorCisjZGVmaW5lIHNob3dfdGltZWNvZGVfdHlwZSh0eXBlKQkJCQkJXAorCV9fcHJpbnRfc3ltYm9saWModHlwZSwJCQkJCQlcCisJCXsgVjRMMl9UQ19UWVBFXzI0RlBTLAkJIjI0RlBTIiB9LAkJXAorCQl7IFY0TDJfVENfVFlQRV8yNUZQUywJCSIyNUZQUyIgfSwJCVwKKwkJeyBWNEwyX1RDX1RZUEVfMzBGUFMsCQkiMzBGUFMiIH0sCQlcCisJCXsgVjRMMl9UQ19UWVBFXzUwRlBTLAkJIjUwRlBTIiB9LAkJXAorCQl7IFY0TDJfVENfVFlQRV82MEZQUywJCSI2MEZQUyIgfSkKKworI2RlZmluZSBzaG93X2ZsYWdzKGZsYWdzKQkJCQkJCSAgICAgIFwKKwlfX3ByaW50X2ZsYWdzKGZsYWdzLCAifCIsCQkJCQkgICAgICBcCisJCXsgVjRMMl9CVUZfRkxBR19NQVBQRUQsCQkgICAgICJNQVBQRUQiIH0sCSAgICAgIFwKKwkJeyBWNEwyX0JVRl9GTEFHX1FVRVVFRCwJCSAgICAgIlFVRVVFRCIgfSwJICAgICAgXAorCQl7IFY0TDJfQlVGX0ZMQUdfRE9ORSwJCSAgICAgIkRPTkUiIH0sCQkgICAgICBcCisJCXsgVjRMMl9CVUZfRkxBR19LRVlGUkFNRSwJICAgICAiS0VZRlJBTUUiIH0sCSAgICAgIFwKKwkJeyBWNEwyX0JVRl9GTEFHX1BGUkFNRSwJCSAgICAgIlBGUkFNRSIgfSwJICAgICAgXAorCQl7IFY0TDJfQlVGX0ZMQUdfQkZSQU1FLAkJICAgICAiQkZSQU1FIiB9LAkgICAgICBcCisJCXsgVjRMMl9CVUZfRkxBR19FUlJPUiwJCSAgICAgIkVSUk9SIiB9LAkJICAgICAgXAorCQl7IFY0TDJfQlVGX0ZMQUdfVElNRUNPREUsCSAgICAgIlRJTUVDT0RFIiB9LAkgICAgICBcCisJCXsgVjRMMl9CVUZfRkxBR19QUkVQQVJFRCwJICAgICAiUFJFUEFSRUQiIH0sCSAgICAgIFwKKwkJeyBWNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0lOVkFMSURBVEUsICJOT19DQUNIRV9JTlZBTElEQVRFIiB9LCBcCisJCXsgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9DTEVBTiwJICAgICAiTk9fQ0FDSEVfQ0xFQU4iIH0sICAgICAgXAorCQl7IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01BU0ssCSAgICAgIlRJTUVTVEFNUF9NQVNLIiB9LCAgICAgIFwKKwkJeyBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9VTktOT1dOLCAgICJUSU1FU1RBTVBfVU5LTk9XTiIgfSwgICBcCisJCXsgVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfTU9OT1RPTklDLCAiVElNRVNUQU1QX01PTk9UT05JQyIgfSwgXAorCQl7IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFksCSAgICAgIlRJTUVTVEFNUF9DT1BZIiB9KQorCisjZGVmaW5lIHNob3dfdGltZWNvZGVfZmxhZ3MoZmxhZ3MpCQkJCQkgIFwKKwlfX3ByaW50X2ZsYWdzKGZsYWdzLCAifCIsCQkJCQkgIFwKKwkJeyBWNEwyX1RDX0ZMQUdfRFJPUEZSQU1FLCAgICAgICAiRFJPUEZSQU1FIiB9LAkJICBcCisJCXsgVjRMMl9UQ19GTEFHX0NPTE9SRlJBTUUsICAgICAgIkNPTE9SRlJBTUUiIH0sCQkgIFwKKwkJeyBWNEwyX1RDX1VTRVJCSVRTX1VTRVJERUZJTkVELAkiVVNFUkJJVFNfVVNFUkRFRklORUQiIH0sIFwKKwkJeyBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUywJIlVTRVJCSVRTXzhCSVRDSEFSUyIgfSkKKworI2RlZmluZSBWNEwyX1RSQUNFX0VWRU5UKGV2ZW50X25hbWUpCQkJCQlcCisJVFJBQ0VfRVZFTlQoZXZlbnRfbmFtZSwJCQkJCQlcCisJCVRQX1BST1RPKGludCBtaW5vciwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpLAkJXAorCQkJCQkJCQkJXAorCQlUUF9BUkdTKG1pbm9yLCBidWYpLAkJCQkJXAorCQkJCQkJCQkJXAorCQlUUF9TVFJVQ1RfX2VudHJ5KAkJCQkJXAorCQkJX19maWVsZChpbnQsIG1pbm9yKQkJCQlcCisJCQlfX2ZpZWxkKHUzMiwgaW5kZXgpCQkJCVwKKwkJCV9fZmllbGQodTMyLCB0eXBlKQkJCQlcCisJCQlfX2ZpZWxkKHUzMiwgYnl0ZXN1c2VkKQkJCQlcCisJCQlfX2ZpZWxkKHUzMiwgZmxhZ3MpCQkJCVwKKwkJCV9fZmllbGQodTMyLCBmaWVsZCkJCQkJXAorCQkJX19maWVsZChzNjQsIHRpbWVzdGFtcCkJCQkJXAorCQkJX19maWVsZCh1MzIsIHRpbWVjb2RlX3R5cGUpCQkJXAorCQkJX19maWVsZCh1MzIsIHRpbWVjb2RlX2ZsYWdzKQkJCVwKKwkJCV9fZmllbGQodTgsIHRpbWVjb2RlX2ZyYW1lcykJCQlcCisJCQlfX2ZpZWxkKHU4LCB0aW1lY29kZV9zZWNvbmRzKQkJCVwKKwkJCV9fZmllbGQodTgsIHRpbWVjb2RlX21pbnV0ZXMpCQkJXAorCQkJX19maWVsZCh1OCwgdGltZWNvZGVfaG91cnMpCQkJXAorCQkJX19maWVsZCh1OCwgdGltZWNvZGVfdXNlcmJpdHMwKQkJCVwKKwkJCV9fZmllbGQodTgsIHRpbWVjb2RlX3VzZXJiaXRzMSkJCQlcCisJCQlfX2ZpZWxkKHU4LCB0aW1lY29kZV91c2VyYml0czIpCQkJXAorCQkJX19maWVsZCh1OCwgdGltZWNvZGVfdXNlcmJpdHMzKQkJCVwKKwkJCV9fZmllbGQodTMyLCBzZXF1ZW5jZSkJCQkJXAorCQkpLAkJCQkJCQlcCisJCQkJCQkJCQlcCisJCVRQX2Zhc3RfYXNzaWduKAkJCQkJCVwKKwkJCV9fZW50cnktPm1pbm9yID0gbWlub3I7CQkJCVwKKwkJCV9fZW50cnktPmluZGV4ID0gYnVmLT5pbmRleDsJCQlcCisJCQlfX2VudHJ5LT50eXBlID0gYnVmLT50eXBlOwkJCVwKKwkJCV9fZW50cnktPmJ5dGVzdXNlZCA9IGJ1Zi0+Ynl0ZXN1c2VkOwkJXAorCQkJX19lbnRyeS0+ZmxhZ3MgPSBidWYtPmZsYWdzOwkJCVwKKwkJCV9fZW50cnktPmZpZWxkID0gYnVmLT5maWVsZDsJCQlcCisJCQlfX2VudHJ5LT50aW1lc3RhbXAgPQkJCQlcCisJCQkJdGltZXZhbF90b19ucygmYnVmLT50aW1lc3RhbXApOwkJXAorCQkJX19lbnRyeS0+dGltZWNvZGVfdHlwZSA9IGJ1Zi0+dGltZWNvZGUudHlwZTsJXAorCQkJX19lbnRyeS0+dGltZWNvZGVfZmxhZ3MgPSBidWYtPnRpbWVjb2RlLmZsYWdzOwlcCisJCQlfX2VudHJ5LT50aW1lY29kZV9mcmFtZXMgPQkJCVwKKwkJCQlidWYtPnRpbWVjb2RlLmZyYW1lczsJCQlcCisJCQlfX2VudHJ5LT50aW1lY29kZV9zZWNvbmRzID0JCQlcCisJCQkJYnVmLT50aW1lY29kZS5zZWNvbmRzOwkJCVwKKwkJCV9fZW50cnktPnRpbWVjb2RlX21pbnV0ZXMgPQkJCVwKKwkJCQlidWYtPnRpbWVjb2RlLm1pbnV0ZXM7CQkJXAorCQkJX19lbnRyeS0+dGltZWNvZGVfaG91cnMgPSBidWYtPnRpbWVjb2RlLmhvdXJzOwlcCisJCQlfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czAgPQkJCVwKKwkJCQlidWYtPnRpbWVjb2RlLnVzZXJiaXRzWzBdOwkJXAorCQkJX19lbnRyeS0+dGltZWNvZGVfdXNlcmJpdHMxID0JCQlcCisJCQkJYnVmLT50aW1lY29kZS51c2VyYml0c1sxXTsJCVwKKwkJCV9fZW50cnktPnRpbWVjb2RlX3VzZXJiaXRzMiA9CQkJXAorCQkJCWJ1Zi0+dGltZWNvZGUudXNlcmJpdHNbMl07CQlcCisJCQlfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czMgPQkJCVwKKwkJCQlidWYtPnRpbWVjb2RlLnVzZXJiaXRzWzNdOwkJXAorCQkJX19lbnRyeS0+c2VxdWVuY2UgPSBidWYtPnNlcXVlbmNlOwkJXAorCQkpLAkJCQkJCQlcCisJCQkJCQkJCQlcCisJCVRQX3ByaW50aygibWlub3IgPSAlZCwgaW5kZXggPSAldSwgdHlwZSA9ICVzLCAiCQlcCisJCQkgICJieXRlc3VzZWQgPSAldSwgZmxhZ3MgPSAlcywgIgkJXAorCQkJICAiZmllbGQgPSAlcywgdGltZXN0YW1wID0gJWxsdSwgdGltZWNvZGUgPSB7ICIJXAorCQkJICAidHlwZSA9ICVzLCBmbGFncyA9ICVzLCBmcmFtZXMgPSAldSwgIglcCisJCQkgICJzZWNvbmRzID0gJXUsIG1pbnV0ZXMgPSAldSwgaG91cnMgPSAldSwgIglcCisJCQkgICJ1c2VyYml0cyA9IHsgJXUgJXUgJXUgJXUgfSB9LCAiCQlcCisJCQkgICJzZXF1ZW5jZSA9ICV1IiwgX19lbnRyeS0+bWlub3IsCQlcCisJCQkgIF9fZW50cnktPmluZGV4LCBzaG93X3R5cGUoX19lbnRyeS0+dHlwZSksCVwKKwkJCSAgX19lbnRyeS0+Ynl0ZXN1c2VkLAkJCQlcCisJCQkgIHNob3dfZmxhZ3MoX19lbnRyeS0+ZmxhZ3MpLAkJCVwKKwkJCSAgc2hvd19maWVsZChfX2VudHJ5LT5maWVsZCksCQkJXAorCQkJICBfX2VudHJ5LT50aW1lc3RhbXAsCQkJCVwKKwkJCSAgc2hvd190aW1lY29kZV90eXBlKF9fZW50cnktPnRpbWVjb2RlX3R5cGUpLAlcCisJCQkgIHNob3dfdGltZWNvZGVfZmxhZ3MoX19lbnRyeS0+dGltZWNvZGVfZmxhZ3MpLAlcCisJCQkgIF9fZW50cnktPnRpbWVjb2RlX2ZyYW1lcywJCQlcCisJCQkgIF9fZW50cnktPnRpbWVjb2RlX3NlY29uZHMsCQkJXAorCQkJICBfX2VudHJ5LT50aW1lY29kZV9taW51dGVzLAkJCVwKKwkJCSAgX19lbnRyeS0+dGltZWNvZGVfaG91cnMsCQkJXAorCQkJICBfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czAsCQkJXAorCQkJICBfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czEsCQkJXAorCQkJICBfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czIsCQkJXAorCQkJICBfX2VudHJ5LT50aW1lY29kZV91c2VyYml0czMsCQkJXAorCQkJICBfX2VudHJ5LT5zZXF1ZW5jZQkJCQlcCisJCSkJCQkJCQkJXAorCSkKKworVjRMMl9UUkFDRV9FVkVOVCh2NGwyX2RxYnVmKTsKK1Y0TDJfVFJBQ0VfRVZFTlQodjRsMl9xYnVmKTsKKworI2VuZGlmIC8qIGlmICFkZWZpbmVkKF9UUkFDRV9WNEwyX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL2lwY2J1Zi5oIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL2lwY2J1Zi5oCmluZGV4IDc2OTgyYjIuLjNkYmNjMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9pcGNidWYuaAorKysgYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvaXBjYnVmLmgKQEAgLTI3LDggKzI3LDggQEAKIAl1bnNpZ25lZCBjaGFyCQlfX3BhZDFbNCAtIHNpemVvZihfX2tlcm5lbF9tb2RlX3QpXTsKIAl1bnNpZ25lZCBzaG9ydAkJc2VxOwogCXVuc2lnbmVkIHNob3J0CQlfX3BhZDI7Ci0JdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMjsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkMTsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkMjsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0lQQ0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbXNnYnVmLmggYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbXNnYnVmLmgKaW5kZXggYWVjODUwZC4uZjU1ZWNjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21zZ2J1Zi5oCisrKyBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tc2didWYuaApAQCAtMzUsMTMgKzM1LDEzIEBACiAjaWYgX19CSVRTX1BFUl9MT05HICE9IDY0CiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CiAjZW5kaWYKLQl1bnNpZ25lZCBsb25nICBtc2dfY2J5dGVzOwkvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcgIG1zZ19xbnVtOwkvKiBudW1iZXIgb2YgbWVzc2FnZXMgaW4gcXVldWUgKi8KLQl1bnNpZ25lZCBsb25nICBtc2dfcWJ5dGVzOwkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJX19rZXJuZWxfdWxvbmdfdCBtc2dfY2J5dGVzOwkvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCV9fa2VybmVsX3Vsb25nX3QgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLworCV9fa2VybmVsX3Vsb25nX3QgbXNnX3FieXRlczsJLyogbWF4IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLwogCV9fa2VybmVsX3BpZF90IG1zZ19sc3BpZDsJLyogcGlkIG9mIGxhc3QgbXNnc25kICovCiAJX19rZXJuZWxfcGlkX3QgbXNnX2xycGlkOwkvKiBsYXN0IHJlY2VpdmUgcGlkICovCi0JdW5zaWduZWQgbG9uZyAgX191bnVzZWQ0OwotCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKKwlfX2tlcm5lbF91bG9uZ190IF9fdW51c2VkNDsKKwlfX2tlcm5lbF91bG9uZ190IF9fdW51c2VkNTsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc2htYnVmLmggYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc2htYnVmLmgKaW5kZXggNTc2OGZhNi4uN2U5ZmIyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3NobWJ1Zi5oCisrKyBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zaG1idWYuaApAQCAtMzksMjEgKzM5LDIxIEBACiAjZW5kaWYKIAlfX2tlcm5lbF9waWRfdAkJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCiAJX19rZXJuZWxfcGlkX3QJCXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLwotCXVuc2lnbmVkIGxvbmcJCXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCi0JdW5zaWduZWQgbG9uZwkJX191bnVzZWQ0OwotCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNTsKKwlfX2tlcm5lbF91bG9uZ190CXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCisJX19rZXJuZWxfdWxvbmdfdAlfX3VudXNlZDQ7CisJX19rZXJuZWxfdWxvbmdfdAlfX3VudXNlZDU7CiB9OwogCiBzdHJ1Y3Qgc2htaW5mbzY0IHsKLQl1bnNpZ25lZCBsb25nCXNobW1heDsKLQl1bnNpZ25lZCBsb25nCXNobW1pbjsKLQl1bnNpZ25lZCBsb25nCXNobW1uaTsKLQl1bnNpZ25lZCBsb25nCXNobXNlZzsKLQl1bnNpZ25lZCBsb25nCXNobWFsbDsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKKwlfX2tlcm5lbF91bG9uZ190CXNobW1heDsKKwlfX2tlcm5lbF91bG9uZ190CXNobW1pbjsKKwlfX2tlcm5lbF91bG9uZ190CXNobW1uaTsKKwlfX2tlcm5lbF91bG9uZ190CXNobXNlZzsKKwlfX2tlcm5lbF91bG9uZ190CXNobWFsbDsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkMTsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkMjsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkMzsKKwlfX2tlcm5lbF91bG9uZ190CV9fdW51c2VkNDsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NITUJVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvZHJtL2RybS5oIGIvaW5jbHVkZS91YXBpL2RybS9kcm0uaAppbmRleCA5YjI0ZDY1Li4zYzlhODMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvZHJtL2RybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9kcm0vZHJtLmgKQEAgLTE4MSw3ICsxODEsNiBAQAogCV9EUk1fQUdQID0gMywJCSAgLyoqPCBBR1AvR0FSVCAqLwogCV9EUk1fU0NBVFRFUl9HQVRIRVIgPSA0LCAgLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgZm9yIFBDSSBETUEgKi8KIAlfRFJNX0NPTlNJU1RFTlQgPSA1LAkgIC8qKjwgQ29uc2lzdGVudCBtZW1vcnkgZm9yIFBDSSBETUEgKi8KLQlfRFJNX0dFTSA9IDYsCQkgIC8qKjwgR0VNIG9iamVjdCAob2Jzb2xldGUpICovCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0uaCBiL2luY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0uaAppbmRleCAzYTRlOTdiLi4xMjZiZmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvZHJtL2k5MTVfZHJtLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5oCkBAIC0yMjIsNiArMjIyLDcgQEAKICNkZWZpbmUgRFJNX0k5MTVfR0VNX1NFVF9DQUNISU5HCTB4MmYKICNkZWZpbmUgRFJNX0k5MTVfR0VNX0dFVF9DQUNISU5HCTB4MzAKICNkZWZpbmUgRFJNX0k5MTVfUkVHX1JFQUQJCTB4MzEKKyNkZWZpbmUgRFJNX0k5MTVfR0VUX1JFU0VUX1NUQVRTCTB4MzIKIAogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQpAQCAtMjcxLDYgKzI3Miw3IEBACiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0NSRUFURQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DT05URVhUX0NSRUFURSwgc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2NyZWF0ZSkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfREVTVFJPWQlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0NPTlRFWFRfREVTVFJPWSwgc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2Rlc3Ryb3kpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1JFR19SRUFECQkJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9SRUdfUkVBRCwgc3RydWN0IGRybV9pOTE1X3JlZ19yZWFkKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRfUkVTRVRfU1RBVFMJCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1JFU0VUX1NUQVRTLCBzdHJ1Y3QgZHJtX2k5MTVfcmVzZXRfc3RhdHMpCiAKIC8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZwogICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCkBAIC03MTksNyArNzIxLDcgQEAKICAqLwogI2RlZmluZSBJOTE1X0VYRUNfSVNfUElOTkVECQkoMTw8MTApCiAKLS8qKiBQcm92aWRlIGEgaGludCB0byB0aGUga2VybmVsIHRoYXQgdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCBhdXhpbGxpYXJ5CisvKiogUHJvdmlkZSBhIGhpbnQgdG8gdGhlIGtlcm5lbCB0aGF0IHRoZSBjb21tYW5kIHN0cmVhbSBhbmQgYXV4aWxpYXJ5CiAgKiBzdGF0ZSBidWZmZXJzIGFscmVhZHkgaG9sZHMgdGhlIGNvcnJlY3QgcHJlc3VtZWQgYWRkcmVzc2VzIGFuZCBzbyB0aGUKICAqIHJlbG9jYXRpb24gcHJvY2VzcyBtYXkgYmUgc2tpcHBlZCBpZiBubyBidWZmZXJzIG5lZWQgdG8gYmUgbW92ZWQgaW4KICAqIHByZXBhcmF0aW9uIGZvciB0aGUgZXhlY2J1ZmZlci4KQEAgLTEwMzAsNCArMTAzMiwyMSBAQAogCV9fdTY0IG9mZnNldDsKIAlfX3U2NCB2YWw7IC8qIFJldHVybiB2YWx1ZSAqLwogfTsKKworc3RydWN0IGRybV9pOTE1X3Jlc2V0X3N0YXRzIHsKKwlfX3UzMiBjdHhfaWQ7CisJX191MzIgZmxhZ3M7CisKKwkvKiBBbGwgcmVzZXRzIHNpbmNlIGJvb3QvbW9kdWxlIHJlbG9hZCwgZm9yIGFsbCBjb250ZXh0cyAqLworCV9fdTMyIHJlc2V0X2NvdW50OworCisJLyogTnVtYmVyIG9mIGJhdGNoZXMgbG9zdCB3aGVuIGFjdGl2ZSBpbiBHUFUsIGZvciB0aGlzIGNvbnRleHQgKi8KKwlfX3UzMiBiYXRjaF9hY3RpdmU7CisKKwkvKiBOdW1iZXIgb2YgYmF0Y2hlcyBsb3N0IHBlbmRpbmcgZm9yIGV4ZWN1dGlvbiwgZm9yIHRoaXMgY29udGV4dCAqLworCV9fdTMyIGJhdGNoX3BlbmRpbmc7CisKKwlfX3UzMiBwYWQ7Cit9OworCiAjZW5kaWYgLyogX1VBUElfSTkxNV9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vcmFkZW9uX2RybS5oIGIvaW5jbHVkZS91YXBpL2RybS9yYWRlb25fZHJtLmgKaW5kZXggZmU0MjFlOC4uZDllYTNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2RybS9yYWRlb25fZHJtLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9yYWRlb25fZHJtLmgKQEAgLTk4NSw2ICs5ODUsOCBAQAogI2RlZmluZSBSQURFT05fSU5GT19DSUtfTUFDUk9USUxFX01PREVfQVJSQVkJMHgxOAogLyogcXVlcnkgdGhlIG51bWJlciBvZiByZW5kZXIgYmFja2VuZHMgKi8KICNkZWZpbmUgUkFERU9OX0lORk9fU0lfQkFDS0VORF9FTkFCTEVEX01BU0sJMHgxOQorLyogbWF4IGVuZ2luZSBjbG9jayAtIG5lZWRlZCBmb3IgT3BlbkNMICovCisjZGVmaW5lIFJBREVPTl9JTkZPX01BWF9TQ0xLCQkweDFhCiAKIAogc3RydWN0IGRybV9yYWRlb25faW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvZHJtL3Ztd2dmeF9kcm0uaCBiL2luY2x1ZGUvdWFwaS9kcm0vdm13Z2Z4X2RybS5oCmluZGV4IGY4NTRjYTQuLjk5NzFjNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9kcm0vdm13Z2Z4X2RybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9kcm0vdm13Z2Z4X2RybS5oCkBAIC0yOCw2ICsyOCwxMCBAQAogI2lmbmRlZiBfX1ZNV0dGWF9EUk1fSF9fCiAjZGVmaW5lIF9fVk1XR0ZYX0RSTV9IX18KIAorI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8ZHJtLmg+CisjZW5kaWYKKwogI2RlZmluZSBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTIDYKICNkZWZpbmUgRFJNX1ZNV19NQVhfTUlQX0xFVkVMUyAyNAogCkBAIC01NSw2ICs1OSwxMSBAQAogI2RlZmluZSBEUk1fVk1XX1BSRVNFTlQgICAgICAgICAgICAgIDE4CiAjZGVmaW5lIERSTV9WTVdfUFJFU0VOVF9SRUFEQkFDSyAgICAgMTkKICNkZWZpbmUgRFJNX1ZNV19VUERBVEVfTEFZT1VUICAgICAgICAyMAorI2RlZmluZSBEUk1fVk1XX0NSRUFURV9TSEFERVIgICAgICAgIDIxCisjZGVmaW5lIERSTV9WTVdfVU5SRUZfU0hBREVSICAgICAgICAgMjIKKyNkZWZpbmUgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSAgICAyMworI2RlZmluZSBEUk1fVk1XX0dCX1NVUkZBQ0VfUkVGICAgICAgIDI0CisjZGVmaW5lIERSTV9WTVdfU1lOQ0NQVSAgICAgICAgICAgICAgMjUKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKQEAgLTc2LDYgKzg1LDggQEAKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRSAgICAgIDUKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0hXX1ZFUlNJT04gIDYKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfU1VSRl9NRU1PUlkgIDcKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV8zRF9DQVBTX1NJWkUgICAgIDgKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfTU9CX01FTU9SWSAgIDkKIAogLyoqCiAgKiBzdHJ1Y3QgZHJtX3Ztd19nZXRwYXJhbV9hcmcKQEAgLTc4OCw0ICs3OTksMjUzIEBACiAJdWludDY0X3QgcmVjdHM7CiB9OwogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NSRUFURV9TSEFERVIgLSBDcmVhdGUgc2hhZGVyCisgKgorICogQ3JlYXRlcyBhIHNoYWRlciBhbmQgb3B0aW9uYWxseSBiaW5kcyBpdCB0byBhIGRtYSBidWZmZXIgY29udGFpbmluZworICogdGhlIHNoYWRlciBieXRlLWNvZGUuCisgKi8KKworLyoqCisgKiBlbnVtIGRybV92bXdfc2hhZGVyX3R5cGUgLSBTaGFkZXIgdHlwZXMKKyAqLworZW51bSBkcm1fdm13X3NoYWRlcl90eXBlIHsKKwlkcm1fdm13X3NoYWRlcl90eXBlX3ZzID0gMCwKKwlkcm1fdm13X3NoYWRlcl90eXBlX3BzLAorCWRybV92bXdfc2hhZGVyX3R5cGVfZ3MKK307CisKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfY3JlYXRlX2FyZworICoKKyAqIEBzaGFkZXJfdHlwZTogU2hhZGVyIHR5cGUgb2YgdGhlIHNoYWRlciB0byBjcmVhdGUuCisgKiBAc2l6ZTogU2l6ZSBvZiB0aGUgYnl0ZS1jb2RlIGluIGJ5dGVzLgorICogd2hlcmUgdGhlIHNoYWRlciBieXRlLWNvZGUgc3RhcnRzCisgKiBAYnVmZmVyX2hhbmRsZTogQnVmZmVyIGhhbmRsZSBpZGVudGlmeWluZyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKiBzaGFkZXIgYnl0ZS1jb2RlCisgKiBAc2hhZGVyX2hhbmRsZTogT24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNvbnRhaW5zIGEgaGFuZGxlIHRoYXQKKyAqIGNhbiBiZSB1c2VkIHRvIHN1YnNlcXVlbnRseSBpZGVudGlmeSB0aGUgc2hhZGVyLgorICogQG9mZnNldDogT2Zmc2V0IGluIGJ5dGVzIGludG8gdGhlIGJ1ZmZlciBnaXZlbiBieSBAYnVmZmVyX2hhbmRsZSwKKyAqCisgKiBJbnB1dCAvIE91dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DUkVBVEVfU0hBREVSIElvY3RsLgorICovCitzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfY3JlYXRlX2FyZyB7CisJZW51bSBkcm1fdm13X3NoYWRlcl90eXBlIHNoYWRlcl90eXBlOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgYnVmZmVyX2hhbmRsZTsKKwl1aW50MzJfdCBzaGFkZXJfaGFuZGxlOworCXVpbnQ2NF90IG9mZnNldDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX1NIQURFUiAtIFVucmVmZXJlbmNlcyBhIHNoYWRlcgorICoKKyAqIERlc3Ryb3lzIGEgdXNlci1zcGFjZSByZWZlcmVuY2UgdG8gYSBzaGFkZXIsIG9wdGlvbmFsbHkgZGVzdHJveWluZworICogaXQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfYXJnCisgKgorICogQGhhbmRsZTogSGFuZGxlIGlkZW50aWZ5aW5nIHRoZSBzaGFkZXIgdG8gZGVzdHJveS4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9TSEFERVIgaW9jdGwuCisgKi8KK3N0cnVjdCBkcm1fdm13X3NoYWRlcl9hcmcgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFIC0gQ3JlYXRlIGEgaG9zdCBndWVzdC1iYWNrZWQgc3VyZmFjZS4KKyAqCisgKiBBbGxvY2F0ZXMgYSBzdXJmYWNlIGhhbmRsZSBhbmQgcXVldWVzIGEgY3JlYXRlIHN1cmZhY2UgY29tbWFuZAorICogZm9yIHRoZSBob3N0IG9uIHRoZSBmaXJzdCB1c2Ugb2YgdGhlIHN1cmZhY2UuIFRoZSBzdXJmYWNlIElEIGNhbgorICogYmUgdXNlZCBhcyB0aGUgc3VyZmFjZSBJRCBpbiBjb21tYW5kcyByZWZlcmVuY2luZyB0aGUgc3VyZmFjZS4KKyAqLworCisvKioKKyAqIGVudW0gZHJtX3Ztd19zdXJmYWNlX2ZsYWdzCisgKgorICogQGRybV92bXdfc3VyZmFjZV9mbGFnX3NoYXJlYWJsZTogICAgIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgc2hhcmVhYmxlCisgKiBAZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2Nhbm91dDogICAgICAgV2hldGhlciB0aGUgc3VyZmFjZSBpcyBhIHNjYW5vdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLgorICogQGRybV92bXdfc3VyZmFjZV9mbGFnX2NyZWF0ZV9idWZmZXI6IENyZWF0ZSBhIGJhY2t1cCBidWZmZXIgaWYgbm9uZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuLgorICovCitlbnVtIGRybV92bXdfc3VyZmFjZV9mbGFncyB7CisJZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2hhcmVhYmxlID0gKDEgPDwgMCksCisJZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2Nhbm91dCA9ICgxIDw8IDEpLAorCWRybV92bXdfc3VyZmFjZV9mbGFnX2NyZWF0ZV9idWZmZXIgPSAoMSA8PCAyKQorfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXEKKyAqCisgKiBAc3ZnYTNkX2ZsYWdzOiAgICAgU1ZHQTNkIHN1cmZhY2UgZmxhZ3MgZm9yIHRoZSBkZXZpY2UuCisgKiBAZm9ybWF0OiAgICAgICAgICAgU1ZHQTNkIGZvcm1hdC4KKyAqIEBtaXBfbGV2ZWw6ICAgICAgICBOdW1iZXIgb2YgbWlwIGxldmVscyBmb3IgYWxsIGZhY2VzLgorICogQGRybV9zdXJmYWNlX2ZsYWdzIEZsYWdzIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBtdWx0aXNhbXBsZV9jb3VudCBGdXR1cmUgdXNlLiBTZXQgdG8gMC4KKyAqIEBhdXRvZ2VuX2ZpbHRlciAgICBGdXR1cmUgdXNlLiBTZXQgdG8gMC4KKyAqIEBidWZmZXJfaGFuZGxlICAgICBCdWZmZXIgaGFuZGxlIG9mIGJhY2t1cCBidWZmZXIuIFNWR0EzRF9JTlZBTElEX0lECisgKiAgICAgICAgICAgICAgICAgICAgaWYgbm9uZS4KKyAqIEBiYXNlX3NpemUgICAgICAgICBTaXplIG9mIHRoZSBiYXNlIG1pcCBsZXZlbCBmb3IgYWxsIGZhY2VzLgorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSAgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSBJb2N0bC4KKyAqIFBhcnQgb2Ygb3V0cHV0IGFyZ3VtZW50IGZvciB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiBJb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVxIHsKKwl1aW50MzJfdCBzdmdhM2RfZmxhZ3M7CisJdWludDMyX3QgZm9ybWF0OworCXVpbnQzMl90IG1pcF9sZXZlbHM7CisJZW51bSBkcm1fdm13X3N1cmZhY2VfZmxhZ3MgZHJtX3N1cmZhY2VfZmxhZ3M7CisJdWludDMyX3QgbXVsdGlzYW1wbGVfY291bnQ7CisJdWludDMyX3QgYXV0b2dlbl9maWx0ZXI7CisJdWludDMyX3QgYnVmZmVyX2hhbmRsZTsKKwl1aW50MzJfdCBwYWQ2NDsKKwlzdHJ1Y3QgZHJtX3Ztd19zaXplIGJhc2Vfc2l6ZTsKK307CisKKy8qKgorICogc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwCisgKgorICogQGhhbmRsZTogICAgICAgICAgICBTdXJmYWNlIGhhbmRsZS4KKyAqIEBiYWNrdXBfc2l6ZTogICAgICAgU2l6ZSBvZiBiYWNrdXAgYnVmZmVycyBmb3IgdGhpcyBzdXJmYWNlLgorICogQGJ1ZmZlcl9oYW5kbGU6ICAgICBIYW5kbGUgb2YgYmFja3VwIGJ1ZmZlci4gU1ZHQTNEX0lOVkFMSURfSUQgaWYgbm9uZS4KKyAqIEBidWZmZXJfc2l6ZTogICAgICAgQWN0dWFsIHNpemUgb2YgdGhlIGJ1ZmZlciBpZGVudGlmaWVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgIEBidWZmZXJfaGFuZGxlCisgKiBAYnVmZmVyX21hcF9oYW5kbGU6IE9mZnNldCBpbnRvIGRldmljZSBhZGRyZXNzIHNwYWNlIGZvciB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgQGJ1ZmZlcl9oYW5kbGUuCisgKgorICogUGFydCBvZiBvdXRwdXQgYXJndW1lbnQgZm9yIHRoZSBEUk1fVk1XX0dCX1NVUkZBQ0VfUkVGIGlvY3RsLgorICogT3V0cHV0IGFyZ3VtZW50IGZvciB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSBpb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgYmFja3VwX3NpemU7CisJdWludDMyX3QgYnVmZmVyX2hhbmRsZTsKKwl1aW50MzJfdCBidWZmZXJfc2l6ZTsKKwl1aW50NjRfdCBidWZmZXJfbWFwX2hhbmRsZTsKK307CisKKy8qKgorICogdW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9hcmcKKyAqCisgKiBAcmVxOiBJbnB1dCBhcmd1bWVudCBhcyBkZXNjcmliZWQgYWJvdmUuCisgKiBAcmVwOiBPdXRwdXQgYXJndW1lbnQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFIGlvY3RsLgorICovCit1bmlvbiBkcm1fdm13X2diX3N1cmZhY2VfY3JlYXRlX2FyZyB7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwIHJlcDsKKwlzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXEgcmVxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfR0JfU1VSRkFDRV9SRUYgLSBSZWZlcmVuY2UgYSBob3N0IHN1cmZhY2UuCisgKgorICogUHV0cyBhIHJlZmVyZW5jZSBvbiBhIGhvc3Qgc3VyZmFjZSB3aXRoIGEgZ2l2ZW4gaGFuZGxlLCBhcyBwcmV2aW91c2x5CisgKiByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSBpb2N0bC4KKyAqIEEgcmVmZXJlbmNlIHdpbGwgbWFrZSBzdXJlIHRoZSBzdXJmYWNlIGlzbid0IGRlc3Ryb3llZCB3aGlsZSB3ZSBob2xkCisgKiBpdCBhbmQgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjbGllbnQgdG8gdXNlIHRoZSBzdXJmYWNlIGhhbmRsZSBpbgorICogdGhlIGNvbW1hbmQgc3RyZWFtLgorICoKKyAqIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgSW9jdGwgcmV0dXJucyB0aGUgc3VyZmFjZSBpbmZvcm1hdGlvbiBnaXZlbgorICogdG8gYW5kIHJldHVybmVkIGZyb20gdGhlIERSTV9WTVdfR0JfU1VSRkFDRV9DUkVBVEUgaW9jdGwuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9hcmcKKyAqCisgKiBAY3JlcTogVGhlIGRhdGEgdXNlZCBhcyBpbnB1dCB3aGVuIHRoZSBzdXJmYWNlIHdhcyBjcmVhdGVkLCBhcyBkZXNjcmliZWQKKyAqICAgICAgICBhYm92ZSBhdCAic3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVxIgorICogQGNyZXA6IEFkZGl0aW9uYWwgZGF0YSBvdXRwdXQgd2hlbiB0aGUgc3VyZmFjZSB3YXMgY3JlYXRlZCwgYXMgZGVzY3JpYmVkCisgKiAgICAgICAgYWJvdmUgYXQgInN0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfY3JlYXRlX3JlcCIKKyAqCisgKiBPdXRwdXQgQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0JfU1VSRkFDRV9SRUYgaW9jdGwuCisgKi8KK3N0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfcmVmX3JlcCB7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVxIGNyZXE7CisJc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwIGNyZXA7Cit9OworCisvKioKKyAqIHVuaW9uIGRybV92bXdfZ2Jfc3VyZmFjZV9yZWZlcmVuY2VfYXJnCisgKgorICogQHJlcTogSW5wdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUgYXQgInN0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIgorICogQHJlcDogT3V0cHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlIGF0ICJzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX3JlZl9yZXAiCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0JfU1VSRkFDRV9SRUYgSW9jdGwuCisgKi8KK3VuaW9uIGRybV92bXdfZ2Jfc3VyZmFjZV9yZWZlcmVuY2VfYXJnIHsKKwlzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX3JlZl9yZXAgcmVwOworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIHJlcTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfU1lOQ0NQVSAtIFN5bmMgYSBETUEgYnVmZmVyIC8gTU9CIGZvciBDUFUgYWNjZXNzLgorICoKKyAqIElkbGVzIGFueSBwcmV2aW91c2x5IHN1Ym1pdHRlZCBHUFUgb3BlcmF0aW9ucyBvbiB0aGUgYnVmZmVyIGFuZAorICogYnkgZGVmYXVsdCBibG9ja3MgY29tbWFuZCBzdWJtaXNzaW9ucyB0aGF0IHJlZmVyZW5jZSB0aGUgYnVmZmVyLgorICogSWYgdGhlIGZpbGUgZGVzY3JpcHRvciB1c2VkIHRvIGdyYWIgYSBibG9ja2luZyBDUFUgc3luYyBpcyBjbG9zZWQsIHRoZQorICogY3B1IHN5bmMgaXMgcmVsZWFzZWQuCisgKiBUaGUgZmxhZ3MgYXJndW1lbnQgaW5kaWNhdGVzIGhvdyB0aGUgZ3JhYiAvIHJlbGVhc2Ugb3BlcmF0aW9uIHNob3VsZCBiZQorICogcGVyZm9ybWVkOgorICovCisKKy8qKgorICogZW51bSBkcm1fdm13X3N5bmNjcHVfZmxhZ3MgLSBTeW5jY3B1IGZsYWdzOgorICoKKyAqIEBkcm1fdm13X3N5bmNjcHVfcmVhZDogU3luYyBmb3IgcmVhZC4gSWYgc3luYyBpcyBkb25lIGZvciByZWFkIG9ubHksIGl0J3MgYQorICogaGludCB0byB0aGUga2VybmVsIHRvIGFsbG93IGNvbW1hbmQgc3VibWlzc2lvbnMgdGhhdCByZWZlcmVuY2VzIHRoZSBidWZmZXIKKyAqIGZvciByZWFkLW9ubHkuCisgKiBAZHJtX3Ztd19zeW5jY3B1X3dyaXRlOiBTeW5jIGZvciB3cml0ZS4gQmxvY2sgYWxsIGNvbW1hbmQgc3VibWlzc2lvbnMKKyAqIHJlZmVyZW5jaW5nIHRoaXMgYnVmZmVyLgorICogQGRybV92bXdfc3luY2NwdV9kb250YmxvY2s6IERvbnQgd2FpdCBmb3IgR1BVIGlkbGUsIGJ1dCByYXRoZXIgcmV0dXJuCisgKiAtRUJVU1kgc2hvdWxkIHRoZSBidWZmZXIgYmUgYnVzeS4KKyAqIEBkcm1fdm13X3N5bmNjcHVfYWxsb3dfY3M6IEFsbG93IGNvbW1hbmQgc3VibWlzc2lvbiB0aGF0IHRvdWNoZXMgdGhlIGJ1ZmZlcgorICogd2hpbGUgdGhlIGJ1ZmZlciBpcyBzeW5jZWQgZm9yIENQVS4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBHRU0gYm8gaWRsZQorICogYmVoYXZpb3IuCisgKi8KK2VudW0gZHJtX3Ztd19zeW5jY3B1X2ZsYWdzIHsKKwlkcm1fdm13X3N5bmNjcHVfcmVhZCA9ICgxIDw8IDApLAorCWRybV92bXdfc3luY2NwdV93cml0ZSA9ICgxIDw8IDEpLAorCWRybV92bXdfc3luY2NwdV9kb250YmxvY2sgPSAoMSA8PCAyKSwKKwlkcm1fdm13X3N5bmNjcHVfYWxsb3dfY3MgPSAoMSA8PCAzKQorfTsKKworLyoqCisgKiBlbnVtIGRybV92bXdfc3luY2NwdV9vcCAtIFN5bmNjcHUgb3BlcmF0aW9uczoKKyAqCisgKiBAZHJtX3Ztd19zeW5jY3B1X2dyYWI6ICAgIEdyYWIgdGhlIGJ1ZmZlciBmb3IgQ1BVIG9wZXJhdGlvbnMKKyAqIEBkcm1fdm13X3N5bmNjcHVfcmVsZWFzZTogUmVsZWFzZSBhIHByZXZpb3VzIGdyYWIuCisgKi8KK2VudW0gZHJtX3Ztd19zeW5jY3B1X29wIHsKKwlkcm1fdm13X3N5bmNjcHVfZ3JhYiwKKwlkcm1fdm13X3N5bmNjcHVfcmVsZWFzZQorfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zeW5jY3B1X2FyZworICoKKyAqIEBvcDoJCQkgICAgIFRoZSBzeW5jY3B1IG9wZXJhdGlvbiBhcyBkZXNjcmliZWQgYWJvdmUuCisgKiBAaGFuZGxlOgkJICAgICBIYW5kbGUgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciBvYmplY3QuCisgKiBAZmxhZ3M6CQkgICAgIEZsYWdzIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworc3RydWN0IGRybV92bXdfc3luY2NwdV9hcmcgeworCWVudW0gZHJtX3Ztd19zeW5jY3B1X29wIG9wOworCWVudW0gZHJtX3Ztd19zeW5jY3B1X2ZsYWdzIGZsYWdzOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JjYWNoZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JjYWNoZS5oCmluZGV4IDE2NGE3ZTIuLjIyYjZhZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9iY2FjaGUuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYmNhY2hlLmgKQEAgLTM5LDYgKzM5LDcgQEAKIH0KIAogI2RlZmluZSBLRVlfU0laRV9CSVRTCQkxNgorI2RlZmluZSBLRVlfTUFYX1U2NFMJCTgKIAogS0VZX0ZJRUxEKEtFWV9QVFJTLAloaWdoLCA2MCwgMykKIEtFWV9GSUVMRChIRUFERVJfU0laRSwJaGlnaCwgNTgsIDIpCkBAIC0xMTgsNyArMTE5LDcgQEAKIAlyZXR1cm4gKHN0cnVjdCBia2V5ICopIChkICsgYmtleV91NjRzKGspKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmtleSAqYmtleV9sYXN0KGNvbnN0IHN0cnVjdCBia2V5ICprLCB1bnNpZ25lZCBucl9rZXlzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYmtleSAqYmtleV9pZHgoY29uc3Qgc3RydWN0IGJrZXkgKmssIHVuc2lnbmVkIG5yX2tleXMpCiB7CiAJX191NjQgKmQgPSAodm9pZCAqKSBrOwogCXJldHVybiAoc3RydWN0IGJrZXkgKikgKGQgKyBucl9rZXlzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9idHJmcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2J0cmZzLmgKaW5kZXggNDVlNjE4OS4uMWI4YTBmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2J0cmZzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2J0cmZzLmgKQEAgLTE4NCw2ICsxODQsMTIgQEAKIAlfX3U2NCByZXNlcnZlZFsxMjRdOwkJCS8qIHBhZCB0byAxayAqLwogfTsKIAorc3RydWN0IGJ0cmZzX2lvY3RsX2ZlYXR1cmVfZmxhZ3MgeworCV9fdTY0IGNvbXBhdF9mbGFnczsKKwlfX3U2NCBjb21wYXRfcm9fZmxhZ3M7CisJX191NjQgaW5jb21wYXRfZmxhZ3M7Cit9OworCiAvKiBiYWxhbmNlIGNvbnRyb2wgaW9jdGwgbW9kZXMgKi8KICNkZWZpbmUgQlRSRlNfQkFMQU5DRV9DVExfUEFVU0UJCTEKICNkZWZpbmUgQlRSRlNfQkFMQU5DRV9DVExfQ0FOQ0VMCTIKQEAgLTU1Miw2ICs1NTgsNyBAQAogI2RlZmluZSBCVFJGU19JT0NfREVGQVVMVF9TVUJWT0wgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMTksIF9fdTY0KQogI2RlZmluZSBCVFJGU19JT0NfU1BBQ0VfSU5GTyBfSU9XUihCVFJGU19JT0NUTF9NQUdJQywgMjAsIFwKIAkJCQkgICAgc3RydWN0IGJ0cmZzX2lvY3RsX3NwYWNlX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19HTE9CQUxfUlNWIF9JT1IoQlRSRlNfSU9DVExfTUFHSUMsIDIwLCBfX3U2NCkKICNkZWZpbmUgQlRSRlNfSU9DX1NUQVJUX1NZTkMgX0lPUihCVFJGU19JT0NUTF9NQUdJQywgMjQsIF9fdTY0KQogI2RlZmluZSBCVFJGU19JT0NfV0FJVF9TWU5DICBfSU9XKEJUUkZTX0lPQ1RMX01BR0lDLCAyMiwgX191NjQpCiAjZGVmaW5lIEJUUkZTX0lPQ19TTkFQX0NSRUFURV9WMiBfSU9XKEJUUkZTX0lPQ1RMX01BR0lDLCAyMywgXApAQCAtNjA2LDUgKzYxMywxMSBAQAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfZGV2X3JlcGxhY2VfYXJncykKICNkZWZpbmUgQlRSRlNfSU9DX0ZJTEVfRVhURU5UX1NBTUUgX0lPV1IoQlRSRlNfSU9DVExfTUFHSUMsIDU0LCBcCiAJCQkJCSBzdHJ1Y3QgYnRyZnNfaW9jdGxfc2FtZV9hcmdzKQorI2RlZmluZSBCVFJGU19JT0NfR0VUX0ZFQVRVUkVTIF9JT1IoQlRSRlNfSU9DVExfTUFHSUMsIDU3LCBcCisJCQkJICAgc3RydWN0IGJ0cmZzX2lvY3RsX2ZlYXR1cmVfZmxhZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19TRVRfRkVBVFVSRVMgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgNTcsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfZmVhdHVyZV9mbGFnc1syXSkKKyNkZWZpbmUgQlRSRlNfSU9DX0dFVF9TVVBQT1JURURfRkVBVFVSRVMgX0lPUihCVFJGU19JT0NUTF9NQUdJQywgNTcsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfZmVhdHVyZV9mbGFnc1szXSkKIAogI2VuZGlmIC8qIF9VQVBJX0xJTlVYX0JUUkZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9mZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZkLmgKaW5kZXggZjFmM2RkNS4uODRjNTE3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2ZkLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZkLmgKQEAgLTE4NSw3ICsxODUsOCBAQAogCQkJCSAqIHRvIGNsZWFyIG1lZGlhIGNoYW5nZSBzdGF0dXMgKi8KIAlGRF9VTlVTRURfQklULAogCUZEX0RJU0tfQ0hBTkdFRF9CSVQsCS8qIGRpc2sgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGkvbyAqLwotCUZEX0RJU0tfV1JJVEFCTEVfQklUCS8qIGRpc2sgaXMgd3JpdGFibGUgKi8KKwlGRF9ESVNLX1dSSVRBQkxFX0JJVCwJLyogZGlzayBpcyB3cml0YWJsZSAqLworCUZEX09QRU5fU0hPVUxEX0ZBSUxfQklUCiB9OwogCiAjZGVmaW5lIEZEU0VURFJWUFJNIF9JT1coMiwgMHg5MCwgc3RydWN0IGZsb3BweV9kcml2ZV9wYXJhbXMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaW42LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaW42LmgKaW5kZXggNjMzYjkzYy4uZTlhMWQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2luNi5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pbjYuaApAQCAtMTI4LDIyICsxMjgsMTMgQEAKICAqCUlQVjYgZXh0ZW5zaW9uIGhlYWRlcnMKICAqLwogI2lmIF9fVUFQSV9ERUZfSVBQUk9UT19WNgotZW51bSB7Ci0gIElQUFJPVE9fSE9QT1BUUyA9IDAsCQkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucyAgICAgICovCi0jZGVmaW5lIElQUFJPVE9fSE9QT1BUUwkJSVBQUk9UT19IT1BPUFRTCi0gIElQUFJPVE9fUk9VVElORyA9IDQzLAkJLyogSVB2NiByb3V0aW5nIGhlYWRlciAgICAgICAgICAqLwotI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCUlQUFJPVE9fUk9VVElORwotICBJUFBST1RPX0ZSQUdNRU5UID0gNDQsCS8qIElQdjYgZnJhZ21lbnRhdGlvbiBoZWFkZXIgICAgKi8KLSNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAlJUFBST1RPX0ZSQUdNRU5UCi0gIElQUFJPVE9fSUNNUFY2ID0gNTgsCQkvKiBJQ01QdjYgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElQUFJPVE9fSUNNUFY2CQlJUFBST1RPX0lDTVBWNgotICBJUFBST1RPX05PTkUgPSA1OSwJCS8qIElQdjYgbm8gbmV4dCBoZWFkZXIgICAgICAgICAgKi8KLSNkZWZpbmUgSVBQUk9UT19OT05FCQlJUFBST1RPX05PTkUKLSAgSVBQUk9UT19EU1RPUFRTID0gNjAsCQkvKiBJUHY2IGRlc3RpbmF0aW9uIG9wdGlvbnMgICAgICovCi0jZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJSVBQUk9UT19EU1RPUFRTCi0gIElQUFJPVE9fTUggPSAxMzUsCQkvKiBJUHY2IG1vYmlsaXR5IGhlYWRlciAgICAgICAgICovCi0jZGVmaW5lIElQUFJPVE9fTUgJCUlQUFJPVE9fTUgKLX07CisjZGVmaW5lIElQUFJPVE9fSE9QT1BUUwkJMAkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucwkqLworI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCTQzCS8qIElQdjYgcm91dGluZyBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRlJBR01FTlQJNDQJLyogSVB2NiBmcmFnbWVudGF0aW9uIGhlYWRlcgkqLworI2RlZmluZSBJUFBST1RPX0lDTVBWNgkJNTgJLyogSUNNUHY2CQkJKi8KKyNkZWZpbmUgSVBQUk9UT19OT05FCQk1OQkvKiBJUHY2IG5vIG5leHQgaGVhZGVyCQkqLworI2RlZmluZSBJUFBST1RPX0RTVE9QVFMJCTYwCS8qIElQdjYgZGVzdGluYXRpb24gb3B0aW9ucwkqLworI2RlZmluZSBJUFBST1RPX01ICQkxMzUJLyogSVB2NiBtb2JpbGl0eSBoZWFkZXIJCSovCiAjZW5kaWYgLyogX19VQVBJX0RFRl9JUFBST1RPX1Y2ICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWVkaWEuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZWRpYS5oCmluZGV4IGVkNDk1NzQuLmQ4NDdjNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tZWRpYS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tZWRpYS5oCkBAIC05OCw2ICs5OCw3IEBACiAKICNkZWZpbmUgTUVESUFfUEFEX0ZMX1NJTksJCSgxIDw8IDApCiAjZGVmaW5lIE1FRElBX1BBRF9GTF9TT1VSQ0UJCSgxIDw8IDEpCisjZGVmaW5lIE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1QJKDEgPDwgMikKIAogc3RydWN0IG1lZGlhX3BhZF9kZXNjIHsKIAlfX3UzMiBlbnRpdHk7CQkvKiBlbnRpdHkgSUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tcXVldWUuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tcXVldWUuaAppbmRleCA4YjVhNzk2Li5kMGEyYjhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbXF1ZXVlLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21xdWV1ZS5oCkBAIC0yMywxMSArMjMsMTEgQEAKICNkZWZpbmUgTVFfQllURVNfTUFYCTgxOTIwMAogCiBzdHJ1Y3QgbXFfYXR0ciB7Ci0JbG9uZwltcV9mbGFnczsJLyogbWVzc2FnZSBxdWV1ZSBmbGFncwkJCSovCi0JbG9uZwltcV9tYXhtc2c7CS8qIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCQkqLwotCWxvbmcJbXFfbXNnc2l6ZTsJLyogbWF4aW11bSBtZXNzYWdlIHNpemUJCQkqLwotCWxvbmcJbXFfY3VybXNnczsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQJKi8KLQlsb25nCV9fcmVzZXJ2ZWRbNF07CS8qIGlnbm9yZWQgZm9yIGlucHV0LCB6ZXJvZWQgZm9yIG91dHB1dCAqLworCV9fa2VybmVsX2xvbmdfdAltcV9mbGFnczsJLyogbWVzc2FnZSBxdWV1ZSBmbGFncwkJCSovCisJX19rZXJuZWxfbG9uZ190CW1xX21heG1zZzsJLyogbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMJCSovCisJX19rZXJuZWxfbG9uZ190CW1xX21zZ3NpemU7CS8qIG1heGltdW0gbWVzc2FnZSBzaXplCQkJKi8KKwlfX2tlcm5lbF9sb25nX3QJbXFfY3VybXNnczsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQJKi8KKwlfX2tlcm5lbF9sb25nX3QJX19yZXNlcnZlZFs0XTsJLyogaWdub3JlZCBmb3IgaW5wdXQsIHplcm9lZCBmb3Igb3V0cHV0ICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zZy5oCmluZGV4IDIyZDk1YzYuLmE3MDM3NTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tc2cuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNnLmgKQEAgLTM0LDggKzM0LDggQEAKIAogLyogbWVzc2FnZSBidWZmZXIgZm9yIG1zZ3NuZCBhbmQgbXNncmN2IGNhbGxzICovCiBzdHJ1Y3QgbXNnYnVmIHsKLQlsb25nIG10eXBlOyAgICAgICAgIC8qIHR5cGUgb2YgbWVzc2FnZSAqLwotCWNoYXIgbXRleHRbMV07ICAgICAgLyogbWVzc2FnZSB0ZXh0ICovCisJX19rZXJuZWxfbG9uZ190IG10eXBlOyAgICAgICAgICAvKiB0eXBlIG9mIG1lc3NhZ2UgKi8KKwljaGFyIG10ZXh0WzFdOyAgICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2UgdGV4dCAqLwogfTsKIAogLyogYnVmZmVyIGZvciBtc2djdGwgY2FsbHMgSVBDX0lORk8sIE1TR19JTkZPICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbnZtZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L252bWUuaAppbmRleCA5ODljMDRlLi5lNWFiNjIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbnZtZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9udm1lLmgKQEAgLTM1MCw2ICszNTAsMTYgQEAKIAlfX3UzMgkJCXJzdmQxMVs1XTsKIH07CiAKK3N0cnVjdCBudm1lX2Fib3J0X2NtZCB7CisJX191OAkJCW9wY29kZTsKKwlfX3U4CQkJZmxhZ3M7CisJX191MTYJCQljb21tYW5kX2lkOworCV9fdTMyCQkJcnN2ZDFbOV07CisJX19sZTE2CQkJc3FpZDsKKwlfX3UxNgkJCWNpZDsKKwlfX3UzMgkJCXJzdmQxMVs1XTsKK307CisKIHN0cnVjdCBudm1lX2Rvd25sb2FkX2Zpcm13YXJlIHsKIAlfX3U4CQkJb3Bjb2RlOwogCV9fdTgJCQlmbGFnczsKQEAgLTM4NCw2ICszOTQsNyBAQAogCQlzdHJ1Y3QgbnZtZV9kb3dubG9hZF9maXJtd2FyZSBkbGZ3OwogCQlzdHJ1Y3QgbnZtZV9mb3JtYXRfY21kIGZvcm1hdDsKIAkJc3RydWN0IG52bWVfZHNtX2NtZCBkc207CisJCXN0cnVjdCBudm1lX2Fib3J0X2NtZCBhYm9ydDsKIAl9OwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3Jlc291cmNlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcmVzb3VyY2UuaAppbmRleCBlMGVkMjg0Li4zNmZiM2I1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcmVzb3VyY2UuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcmVzb3VyY2UuaApAQCAtMjMsMjUgKzIzLDI1IEBACiBzdHJ1Y3QJcnVzYWdlIHsKIAlzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsJLyogdXNlciB0aW1lIHVzZWQgKi8KIAlzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsJLyogc3lzdGVtIHRpbWUgdXNlZCAqLwotCWxvbmcJcnVfbWF4cnNzOwkJLyogbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAqLwotCWxvbmcJcnVfaXhyc3M7CQkvKiBpbnRlZ3JhbCBzaGFyZWQgbWVtb3J5IHNpemUgKi8KLQlsb25nCXJ1X2lkcnNzOwkJLyogaW50ZWdyYWwgdW5zaGFyZWQgZGF0YSBzaXplICovCi0JbG9uZwlydV9pc3JzczsJCS8qIGludGVncmFsIHVuc2hhcmVkIHN0YWNrIHNpemUgKi8KLQlsb25nCXJ1X21pbmZsdDsJCS8qIHBhZ2UgcmVjbGFpbXMgKi8KLQlsb25nCXJ1X21hamZsdDsJCS8qIHBhZ2UgZmF1bHRzICovCi0JbG9uZwlydV9uc3dhcDsJCS8qIHN3YXBzICovCi0JbG9uZwlydV9pbmJsb2NrOwkJLyogYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyAqLwotCWxvbmcJcnVfb3VibG9jazsJCS8qIGJsb2NrIG91dHB1dCBvcGVyYXRpb25zICovCi0JbG9uZwlydV9tc2dzbmQ7CQkvKiBtZXNzYWdlcyBzZW50ICovCi0JbG9uZwlydV9tc2dyY3Y7CQkvKiBtZXNzYWdlcyByZWNlaXZlZCAqLwotCWxvbmcJcnVfbnNpZ25hbHM7CQkvKiBzaWduYWxzIHJlY2VpdmVkICovCi0JbG9uZwlydV9udmNzdzsJCS8qIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzICovCi0JbG9uZwlydV9uaXZjc3c7CQkvKiBpbnZvbHVudGFyeSAiICovCisJX19rZXJuZWxfbG9uZ190CXJ1X21heHJzczsJLyogbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAqLworCV9fa2VybmVsX2xvbmdfdAlydV9peHJzczsJLyogaW50ZWdyYWwgc2hhcmVkIG1lbW9yeSBzaXplICovCisJX19rZXJuZWxfbG9uZ190CXJ1X2lkcnNzOwkvKiBpbnRlZ3JhbCB1bnNoYXJlZCBkYXRhIHNpemUgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfaXNyc3M7CS8qIGludGVncmFsIHVuc2hhcmVkIHN0YWNrIHNpemUgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfbWluZmx0OwkvKiBwYWdlIHJlY2xhaW1zICovCisJX19rZXJuZWxfbG9uZ190CXJ1X21hamZsdDsJLyogcGFnZSBmYXVsdHMgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfbnN3YXA7CS8qIHN3YXBzICovCisJX19rZXJuZWxfbG9uZ190CXJ1X2luYmxvY2s7CS8qIGJsb2NrIGlucHV0IG9wZXJhdGlvbnMgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfb3VibG9jazsJLyogYmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfbXNnc25kOwkvKiBtZXNzYWdlcyBzZW50ICovCisJX19rZXJuZWxfbG9uZ190CXJ1X21zZ3JjdjsJLyogbWVzc2FnZXMgcmVjZWl2ZWQgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfbnNpZ25hbHM7CS8qIHNpZ25hbHMgcmVjZWl2ZWQgKi8KKwlfX2tlcm5lbF9sb25nX3QJcnVfbnZjc3c7CS8qIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzICovCisJX19rZXJuZWxfbG9uZ190CXJ1X25pdmNzdzsJLyogaW52b2x1bnRhcnkgIiAqLwogfTsKIAogc3RydWN0IHJsaW1pdCB7Ci0JdW5zaWduZWQgbG9uZwlybGltX2N1cjsKLQl1bnNpZ25lZCBsb25nCXJsaW1fbWF4OworCV9fa2VybmVsX3Vsb25nX3QJcmxpbV9jdXI7CisJX19rZXJuZWxfdWxvbmdfdAlybGltX21heDsKIH07CiAKICNkZWZpbmUgUkxJTTY0X0lORklOSVRZCQkofjBVTEwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc2htLmggYi9pbmNsdWRlL3VhcGkvbGludXgvc2htLmgKaW5kZXggZWMzNmZhMS4uNzhiNjk0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3NobS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zaG0uaApAQCAtNjgsMTEgKzY4LDExIEBACiAKIHN0cnVjdCBzaG1faW5mbyB7CiAJaW50IHVzZWRfaWRzOwotCXVuc2lnbmVkIGxvbmcgc2htX3RvdDsJLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLwotCXVuc2lnbmVkIGxvbmcgc2htX3JzczsJLyogdG90YWwgcmVzaWRlbnQgc2htICovCi0JdW5zaWduZWQgbG9uZyBzaG1fc3dwOwkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLwotCXVuc2lnbmVkIGxvbmcgc3dhcF9hdHRlbXB0czsKLQl1bnNpZ25lZCBsb25nIHN3YXBfc3VjY2Vzc2VzOworCV9fa2VybmVsX3Vsb25nX3Qgc2htX3RvdDsJLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLworCV9fa2VybmVsX3Vsb25nX3Qgc2htX3JzczsJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisJX19rZXJuZWxfdWxvbmdfdCBzaG1fc3dwOwkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLworCV9fa2VybmVsX3Vsb25nX3Qgc3dhcF9hdHRlbXB0czsKKwlfX2tlcm5lbF91bG9uZ190IHN3YXBfc3VjY2Vzc2VzOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGltZXguaCBiL2luY2x1ZGUvdWFwaS9saW51eC90aW1leC5oCmluZGV4IGE3ZWE4MWYuLjkyNjg1ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90aW1leC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90aW1leC5oCkBAIC02MywyNyArNjMsMjcgQEAKICAqLwogc3RydWN0IHRpbWV4IHsKIAl1bnNpZ25lZCBpbnQgbW9kZXM7CS8qIG1vZGUgc2VsZWN0b3IgKi8KLQlsb25nIG9mZnNldDsJCS8qIHRpbWUgb2Zmc2V0ICh1c2VjKSAqLwotCWxvbmcgZnJlcTsJCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKHNjYWxlZCBwcG0pICovCi0JbG9uZyBtYXhlcnJvcjsJCS8qIG1heGltdW0gZXJyb3IgKHVzZWMpICovCi0JbG9uZyBlc3RlcnJvcjsJCS8qIGVzdGltYXRlZCBlcnJvciAodXNlYykgKi8KKwlfX2tlcm5lbF9sb25nX3Qgb2Zmc2V0OwkvKiB0aW1lIG9mZnNldCAodXNlYykgKi8KKwlfX2tlcm5lbF9sb25nX3QgZnJlcTsJLyogZnJlcXVlbmN5IG9mZnNldCAoc2NhbGVkIHBwbSkgKi8KKwlfX2tlcm5lbF9sb25nX3QgbWF4ZXJyb3I7LyogbWF4aW11bSBlcnJvciAodXNlYykgKi8KKwlfX2tlcm5lbF9sb25nX3QgZXN0ZXJyb3I7LyogZXN0aW1hdGVkIGVycm9yICh1c2VjKSAqLwogCWludCBzdGF0dXM7CQkvKiBjbG9jayBjb21tYW5kL3N0YXR1cyAqLwotCWxvbmcgY29uc3RhbnQ7CQkvKiBwbGwgdGltZSBjb25zdGFudCAqLwotCWxvbmcgcHJlY2lzaW9uOwkJLyogY2xvY2sgcHJlY2lzaW9uICh1c2VjKSAocmVhZCBvbmx5KSAqLwotCWxvbmcgdG9sZXJhbmNlOwkJLyogY2xvY2sgZnJlcXVlbmN5IHRvbGVyYW5jZSAocHBtKQotCQkJCSAqIChyZWFkIG9ubHkpCi0JCQkJICovCisJX19rZXJuZWxfbG9uZ190IGNvbnN0YW50Oy8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisJX19rZXJuZWxfbG9uZ190IHByZWNpc2lvbjsvKiBjbG9jayBwcmVjaXNpb24gKHVzZWMpIChyZWFkIG9ubHkpICovCisJX19rZXJuZWxfbG9uZ190IHRvbGVyYW5jZTsvKiBjbG9jayBmcmVxdWVuY3kgdG9sZXJhbmNlIChwcG0pCisJCQkJICAgKiAocmVhZCBvbmx5KQorCQkJCSAgICovCiAJc3RydWN0IHRpbWV2YWwgdGltZTsJLyogKHJlYWQgb25seSwgZXhjZXB0IGZvciBBREpfU0VUT0ZGU0VUKSAqLwotCWxvbmcgdGljazsJCS8qIChtb2RpZmllZCkgdXNlY3MgYmV0d2VlbiBjbG9jayB0aWNrcyAqLworCV9fa2VybmVsX2xvbmdfdCB0aWNrOwkvKiAobW9kaWZpZWQpIHVzZWNzIGJldHdlZW4gY2xvY2sgdGlja3MgKi8KIAotCWxvbmcgcHBzZnJlcTsgICAgICAgICAgIC8qIHBwcyBmcmVxdWVuY3kgKHNjYWxlZCBwcG0pIChybykgKi8KLQlsb25nIGppdHRlcjsgICAgICAgICAgICAvKiBwcHMgaml0dGVyICh1cykgKHJvKSAqLworCV9fa2VybmVsX2xvbmdfdCBwcHNmcmVxOy8qIHBwcyBmcmVxdWVuY3kgKHNjYWxlZCBwcG0pIChybykgKi8KKwlfX2tlcm5lbF9sb25nX3Qgaml0dGVyOyAvKiBwcHMgaml0dGVyICh1cykgKHJvKSAqLwogCWludCBzaGlmdDsgICAgICAgICAgICAgIC8qIGludGVydmFsIGR1cmF0aW9uIChzKSAoc2hpZnQpIChybykgKi8KLQlsb25nIHN0YWJpbDsgICAgICAgICAgICAvKiBwcHMgc3RhYmlsaXR5IChzY2FsZWQgcHBtKSAocm8pICovCi0JbG9uZyBqaXRjbnQ7ICAgICAgICAgICAgLyogaml0dGVyIGxpbWl0IGV4Y2VlZGVkIChybykgKi8KLQlsb25nIGNhbGNudDsgICAgICAgICAgICAvKiBjYWxpYnJhdGlvbiBpbnRlcnZhbHMgKHJvKSAqLwotCWxvbmcgZXJyY250OyAgICAgICAgICAgIC8qIGNhbGlicmF0aW9uIGVycm9ycyAocm8pICovCi0JbG9uZyBzdGJjbnQ7ICAgICAgICAgICAgLyogc3RhYmlsaXR5IGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKwlfX2tlcm5lbF9sb25nX3Qgc3RhYmlsOyAgICAgICAgICAgIC8qIHBwcyBzdGFiaWxpdHkgKHNjYWxlZCBwcG0pIChybykgKi8KKwlfX2tlcm5lbF9sb25nX3Qgaml0Y250OyAvKiBqaXR0ZXIgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworCV9fa2VybmVsX2xvbmdfdCBjYWxjbnQ7IC8qIGNhbGlicmF0aW9uIGludGVydmFscyAocm8pICovCisJX19rZXJuZWxfbG9uZ190IGVycmNudDsgLyogY2FsaWJyYXRpb24gZXJyb3JzIChybykgKi8KKwlfX2tlcm5lbF9sb25nX3Qgc3RiY250OyAvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKHJvKSAqLwogCiAJaW50IHRhaTsJCS8qIFRBSSBvZmZzZXQgKHJvKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1jb250cm9scy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMuaAppbmRleCAxNjY2YWFiLi4yY2JlNjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1jb250cm9scy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRyb2xzLmgKQEAgLTE2NCw2ICsxNjQsMTAgQEAKICAqIHRoaXMgZHJpdmVyICovCiAjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfVElfVlBFX0JBU0UJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwNTApCiAKKy8qIFRoZSBiYXNlIGZvciB0aGUgc2FhNzEzNCBkcml2ZXIgY29udHJvbHMuCisgKiBXZSByZXNlcnZlIDE2IGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlci4gKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9TQUE3MTM0X0JBU0UJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwNjApCisKIC8qIE1QRUctY2xhc3MgY29udHJvbCBJRHMgKi8KIC8qIFRoZSBNUEVHIGNvbnRyb2xzIGFyZSBhcHBsaWNhYmxlIHRvIGFsbCBjb2RlYyBjb250cm9scwogICogYW5kIHRoZSAnTVBFRycgcGFydCBvZiB0aGUgZGVmaW5lIGlzIGhpc3RvcmljYWwgKi8KQEAgLTU1NCw2ICs1NTgsMTEgQEAKIAlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfVVNFX1BSRVYJCT0gMCwKIAlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfVVNFX1JFRl9QRVJJT0QJPSAxLAogfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzUwOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BST0ZJTEUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzUxMSkKIAogLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIENYMjM0MXggZHJpdmVyIGFzIGRlZmluZWQgYnkgVjRMMiAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSAJCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMDAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItbWVkaWFidXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLW1lZGlhYnVzLmgKaW5kZXggYTk2MDEyNS4uYjVjM2FhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItbWVkaWFidXMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1tZWRpYWJ1cy5oCkBAIC0xMTAsNiArMTEwLDkgQEAKIAogCS8qIFM1QzczTTMgc2Vuc29yIHNwZWNpZmljIGludGVybGVhdmVkIFVZVlkgYW5kIEpQRUcgKi8KIAlWNEwyX01CVVNfRk1UX1M1Q19VWVZZX0pQRUdfMVg4ID0gMHg1MDAxLAorCisJLyogSFNWIC0gbmV4dCBpcyAweDYwMDIgKi8KKwlWNEwyX01CVVNfRk1UX0FIU1Y4ODg4XzFYMzIgPSAweDYwMDEsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAppbmRleCA0MzdmMWIwLi42YWU3YmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZpZGVvZGV2Mi5oCkBAIC0yMDcsOCArMjA3LDggQEAKIHN0cnVjdCB2NGwyX3JlY3QgewogCV9fczMyICAgbGVmdDsKIAlfX3MzMiAgIHRvcDsKLQlfX3MzMiAgIHdpZHRoOwotCV9fczMyICAgaGVpZ2h0OworCV9fdTMyICAgd2lkdGg7CisJX191MzIgICBoZWlnaHQ7CiB9OwogCiBzdHJ1Y3QgdjRsMl9mcmFjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdnNwMS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZzcDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg4NThmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZzcDEuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogdnNwMS5oCisgKgorICogUmVuZXNhcyBSLUNhciBWU1AxIC0gVXNlci1zcGFjZSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVuZXNhcyBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3RzOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fVlNQMV9VU0VSX0hfXworI2RlZmluZSBfX1ZTUDFfVVNFUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKy8qCisgKiBQcml2YXRlIElPQ1RMcworICoKKyAqIFZJRElPQ19WU1AxX0xVVF9DT05GSUcgLSBDb25maWd1cmUgdGhlIGxvb2t1cCB0YWJsZQorICovCisKKyNkZWZpbmUgVklESU9DX1ZTUDFfTFVUX0NPTkZJRyBcCisJX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMSwgc3RydWN0IHZzcDFfbHV0X2NvbmZpZykKKworc3RydWN0IHZzcDFfbHV0X2NvbmZpZyB7CisJdTMyIGx1dFsyNTZdOworfTsKKworI2VuZGlmCS8qIF9fVlNQMV9VU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3hhdHRyLmggYi9pbmNsdWRlL3VhcGkvbGludXgveGF0dHIuaAppbmRleCBlNDYyOWI5Li40MGJiYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgveGF0dHIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgveGF0dHIuaApAQCAtMjAsNiArMjAsOSBAQAogI2RlZmluZSBYQVRUUl9NQUNfT1NYX1BSRUZJWCAib3N4LiIKICNkZWZpbmUgWEFUVFJfTUFDX09TWF9QUkVGSVhfTEVOIChzaXplb2YoWEFUVFJfTUFDX09TWF9QUkVGSVgpIC0gMSkKIAorI2RlZmluZSBYQVRUUl9CVFJGU19QUkVGSVggImJ0cmZzLiIKKyNkZWZpbmUgWEFUVFJfQlRSRlNfUFJFRklYX0xFTiAoc2l6ZW9mKFhBVFRSX0JUUkZTX1BSRUZJWCkgLSAxKQorCiAjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWAkic2VjdXJpdHkuIgogI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIChzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSAtIDEpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmggYi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDVhY2IxZTQuLmE1YWYyYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKKysrIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtMTg1LDcgKzE4NSw3IEBACiB9OwogZXh0ZXJuIHN0cnVjdCBncmFudF9mcmFtZXMgeGVuX2F1dG9feGxhdF9ncmFudF9mcmFtZXM7CiB1bnNpZ25lZCBpbnQgZ250dGFiX21heF9ncmFudF9mcmFtZXModm9pZCk7Ci1pbnQgZ250dGFiX3NldHVwX2F1dG9feGxhdF9mcmFtZXModW5zaWduZWQgbG9uZyBhZGRyKTsKK2ludCBnbnR0YWJfc2V0dXBfYXV0b194bGF0X2ZyYW1lcyhwaHlzX2FkZHJfdCBhZGRyKTsKIHZvaWQgZ250dGFiX2ZyZWVfYXV0b194bGF0X2ZyYW1lcyh2b2lkKTsKIAogI2RlZmluZSBnbnR0YWJfbWFwX3ZhZGRyKG1hcCkgKCh2b2lkICopKG1hcC5ob3N0X3ZpcnRfYWRkcikpCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMzRhMGEzYi4uMDA5YTc5NyAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMjg0LDcgKzI4NCw3IEBACiAKIGNvbmZpZyBBVURJVFNZU0NBTEwKIAlib29sICJFbmFibGUgc3lzdGVtLWNhbGwgYXVkaXRpbmcgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUEFSSVNDIHx8IFBQQyB8fCBTMzkwIHx8IElBNjQgfHwgVU1MIHx8IFNQQVJDNjQgfHwgU1VQRVJIIHx8IChBUk0gJiYgQUVBQkkgJiYgIU9BQklfQ09NUEFUKSkKKwlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUEFSSVNDIHx8IFBQQyB8fCBTMzkwIHx8IElBNjQgfHwgVU1MIHx8IFNQQVJDNjQgfHwgU1VQRVJIIHx8IChBUk0gJiYgQUVBQkkgJiYgIU9BQklfQ09NUEFUKSB8fCBBTFBIQSkKIAlkZWZhdWx0IHkgaWYgU0VDVVJJVFlfU0VMSU5VWAogCWhlbHAKIAkgIEVuYWJsZSBsb3ctb3ZlcmhlYWQgc3lzdGVtLWNhbGwgYXVkaXRpbmcgaW5mcmFzdHJ1Y3R1cmUgdGhhdApkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCAyZmQ5Y2VmLi5lYjAzMDkwIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtODEyLDcgKzgxMiw3IEBACiBzdGF0aWMgaW50IHJ1bl9pbml0X3Byb2Nlc3MoY29uc3QgY2hhciAqaW5pdF9maWxlbmFtZSkKIHsKIAlhcmd2X2luaXRbMF0gPSBpbml0X2ZpbGVuYW1lOwotCXJldHVybiBkb19leGVjdmUoaW5pdF9maWxlbmFtZSwKKwlyZXR1cm4gZG9fZXhlY3ZlKGdldG5hbWVfa2VybmVsKGluaXRfZmlsZW5hbWUpLAogCQkoY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqKWFyZ3ZfaW5pdCwKIAkJKGNvbnN0IGNoYXIgX191c2VyICpjb25zdCBfX3VzZXIgKillbnZwX2luaXQpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggMTAxNzZjZC4uN2FlZjJmNCAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC0xNzE5LDcgKzE3MTksNyBAQAogCXN0cnVjdCBhdWRpdF9jb250ZXh0ICpjb250ZXh0ID0gY3VycmVudC0+YXVkaXRfY29udGV4dDsKIAogCUJVR19PTighY29udGV4dCk7Ci0JaWYgKCFjb250ZXh0LT5pbl9zeXNjYWxsKSB7CisJaWYgKCFuYW1lLT5hbmFtZSB8fCAhY29udGV4dC0+aW5fc3lzY2FsbCkgewogI2lmIEFVRElUX0RFQlVHID09IDIKIAkJcHJpbnRrKEtFUk5fRVJSICIlczolZCg6JWQpOiBmaW5hbF9wdXRuYW1lKCVwKVxuIiwKIAkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgY29udGV4dC0+c2VyaWFsLCBuYW1lKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMgYi9rZXJuZWwvZGVidWcvZGVidWdfY29yZS5jCmluZGV4IDdkMmYzNWUuLjMzNGIzOTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMKKysrIGIva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuYwpAQCAtNzM2LDcgKzczNiw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBrZ2RiX25taWNhbGxpbihpbnQgY3B1LCBpbnQgdHJhcG5yLCB2b2lkICpyZWdzLCBhdG9taWNfdCAqc2VuZF9yZWFkeSkKK2ludCBrZ2RiX25taWNhbGxpbihpbnQgY3B1LCBpbnQgdHJhcG5yLCB2b2lkICpyZWdzLCBpbnQgZXJyX2NvZGUsCisJCQkJCQkJYXRvbWljX3QgKnNlbmRfcmVhZHkpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAogCWlmICgha2dkYl9pb19yZWFkeSgwKSB8fCAhc2VuZF9yZWFkeSkKQEAgLTc1MCw3ICs3NTEsNyBAQAogCQlrcy0+Y3B1CQkJPSBjcHU7CiAJCWtzLT5leF92ZWN0b3IJCT0gdHJhcG5yOwogCQlrcy0+c2lnbm8JCT0gU0lHVFJBUDsKLQkJa3MtPmVycl9jb2RlCQk9IEtHREJfS0RCX1JFQVNPTl9TWVNURU1fTk1JOworCQlrcy0+ZXJyX2NvZGUJCT0gZXJyX2NvZGU7CiAJCWtzLT5saW51eF9yZWdzCQk9IHJlZ3M7CiAJCWtzLT5zZW5kX3JlYWR5CQk9IHNlbmRfcmVhZHk7CiAJCWtnZGJfY3B1X2VudGVyKGtzLCByZWdzLCBEQ1BVX1dBTlRfTUFTVEVSKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmggYi9rZXJuZWwvZGVidWcvZGVidWdfY29yZS5oCmluZGV4IDU3MmFhNGYuLjEyN2Q5YmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmgKKysrIGIva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuaApAQCAtNzUsMTMgKzc1LDExIEBACiBleHRlcm4gaW50IGtkYl9wYXJzZShjb25zdCBjaGFyICpjbWRzdHIpOwogZXh0ZXJuIGludCBrZGJfY29tbW9uX2luaXRfc3RhdGUoc3RydWN0IGtnZGJfc3RhdGUgKmtzKTsKIGV4dGVybiBpbnQga2RiX2NvbW1vbl9kZWluaXRfc3RhdGUodm9pZCk7Ci0jZGVmaW5lIEtHREJfS0RCX1JFQVNPTl9TWVNURU1fTk1JIEtEQl9SRUFTT05fU1lTVEVNX05NSQogI2Vsc2UgLyogISBDT05GSUdfS0dEQl9LREIgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtkYl9zdHViKHN0cnVjdCBrZ2RiX3N0YXRlICprcykKIHsKIAlyZXR1cm4gREJHX1BBU1NfRVZFTlQ7CiB9Ci0jZGVmaW5lIEtHREJfS0RCX1JFQVNPTl9TWVNURU1fTk1JIDAKICNlbmRpZiAvKiBDT05GSUdfS0dEQl9LREIgKi8KIAogI2VuZGlmIC8qIF9ERUJVR19DT1JFX0hfICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaHVuZ190YXNrLmMgYi9rZXJuZWwvaHVuZ190YXNrLmMKaW5kZXggOTMyOGI4MC4uMGI5YzE2OSAxMDA2NDQKLS0tIGEva2VybmVsL2h1bmdfdGFzay5jCisrKyBiL2tlcm5lbC9odW5nX3Rhc2suYwpAQCAtMzcsNyArMzcsNyBAQAogICovCiB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3MgPSBDT05GSUdfREVGQVVMVF9IVU5HX1RBU0tfVElNRU9VVDsKIAotdW5zaWduZWQgbG9uZyBfX3JlYWRfbW9zdGx5IHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3MgPSAxMDsKK2ludCBfX3JlYWRfbW9zdGx5IHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3MgPSAxMDsKIAogc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGRpZF9wYW5pYzsKIApAQCAtOTgsNyArOTgsOSBAQAogCiAJaWYgKCFzeXNjdGxfaHVuZ190YXNrX3dhcm5pbmdzKQogCQlyZXR1cm47Ci0Jc3lzY3RsX2h1bmdfdGFza193YXJuaW5ncy0tOworCisJaWYgKHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3MgPiAwKQorCQlzeXNjdGxfaHVuZ190YXNrX3dhcm5pbmdzLS07CiAKIAkvKgogCSAqIE9rLCB0aGUgdGFzayBkaWQgbm90IGdldCBzY2hlZHVsZWQgZm9yIG1vcmUgdGhhbiAyIG1pbnV0ZXMsCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL0tjb25maWcgYi9rZXJuZWwvaXJxL0tjb25maWcKaW5kZXggNGExZmVmMC4uMDdjYmRmZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9LY29uZmlnCisrKyBiL2tlcm5lbC9pcnEvS2NvbmZpZwpAQCAtNDAsNiArNDAsNyBAQAogIyBHZW5lcmljIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQgY2hpcCBpbXBsZW1lbnRhdGlvbgogY29uZmlnIEdFTkVSSUNfSVJRX0NISVAKICAgICAgICBib29sCisgICAgICAgc2VsZWN0IElSUV9ET01BSU4KIAogIyBHZW5lcmljIGlycV9kb21haW4gaHcgPC0tPiBsaW51eCBpcnEgbnVtYmVyIHRyYW5zbGF0aW9uCiBjb25maWcgSVJRX0RPTUFJTgpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggYjA4NjAwNi4uNmIzNzVhZiAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAogCWNvbW1pdF9jcmVkcyhuZXcpOwogCi0JcmV0dmFsID0gZG9fZXhlY3ZlKHN1Yl9pbmZvLT5wYXRoLAorCXJldHZhbCA9IGRvX2V4ZWN2ZShnZXRuYW1lX2tlcm5lbChzdWJfaW5mby0+cGF0aCksCiAJCQkgICAoY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqKXN1Yl9pbmZvLT5hcmd2LAogCQkJICAgKGNvbnN0IGNoYXIgX191c2VyICpjb25zdCBfX3VzZXIgKilzdWJfaW5mby0+ZW52cCk7CiAJaWYgKCFyZXR2YWwpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvYmxvY2tfaW8uYyBiL2tlcm5lbC9wb3dlci9ibG9ja19pby5jCmluZGV4IGQwOWRkMTAuLjlhNThiYzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9ibG9ja19pby5jCisrKyBiL2tlcm5lbC9wb3dlci9ibG9ja19pby5jCkBAIC0zMiw3ICszMiw3IEBACiAJc3RydWN0IGJpbyAqYmlvOwogCiAJYmlvID0gYmlvX2FsbG9jKF9fR0ZQX1dBSVQgfCBfX0dGUF9ISUdILCAxKTsKLQliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKKwliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCWJpby0+YmlfYmRldiA9IGJkZXY7CiAJYmlvLT5iaV9lbmRfaW8gPSBlbmRfc3dhcF9iaW9fcmVhZDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NvcmUuYyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKaW5kZXggN2ZlYTg2NS4uYjQ2MTMxZSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NvcmUuYworKysgYi9rZXJuZWwvc2NoZWQvY29yZS5jCkBAIC0yNDc2LDcgKzI0NzYsNyBAQAogCWlmICh0aW1lX2JlZm9yZV9lcShuZXh0LCBub3cpKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBqaWZmaWVzX3RvX3VzZWNzKG5leHQgLSBub3cpICogTlNFQ19QRVJfVVNFQzsKKwlyZXR1cm4gamlmZmllc190b19uc2VjcyhuZXh0IC0gbm93KTsKIH0KICNlbmRpZgogCkBAIC00MzQ3LDcgKzQzNDcsOSBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwotCXRpbWVfc2xpY2UgPSBwLT5zY2hlZF9jbGFzcy0+Z2V0X3JyX2ludGVydmFsKHJxLCBwKTsKKwl0aW1lX3NsaWNlID0gMDsKKwlpZiAocC0+c2NoZWRfY2xhc3MtPmdldF9ycl9pbnRlcnZhbCkKKwkJdGltZV9zbGljZSA9IHAtPnNjaGVkX2NsYXNzLT5nZXRfcnJfaW50ZXJ2YWwocnEsIHApOwogCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYyBiL2tlcm5lbC9zY2hlZC9kZWFkbGluZS5jCmluZGV4IDBkZTI0ODIuLjBkZDVlMDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9kZWFkbGluZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9kZWFkbGluZS5jCkBAIC0zNTEsNyArMzUxLDggQEAKICAqIGRpc3J1cHRpbmcgdGhlIHNjaGVkdWxhYmlsaXR5IG9mIHRoZSBzeXN0ZW0uIE90aGVyd2lzZSwgd2Ugc2hvdWxkCiAgKiByZWZpbGwgdGhlIHJ1bnRpbWUgYW5kIHNldCB0aGUgZGVhZGxpbmUgYSBwZXJpb2QgaW4gdGhlIGZ1dHVyZSwKICAqIGJlY2F1c2Uga2VlcGluZyB0aGUgY3VycmVudCAoYWJzb2x1dGUpIGRlYWRsaW5lIG9mIHRoZSB0YXNrIHdvdWxkCi0gKiByZXN1bHQgaW4gYnJlYWtpbmcgZ3VhcmFudGVlcyBwcm9taXNlZCB0byBvdGhlciB0YXNrcy4KKyAqIHJlc3VsdCBpbiBicmVha2luZyBndWFyYW50ZWVzIHByb21pc2VkIHRvIG90aGVyIHRhc2tzIChyZWZlciB0bworICogRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0IGZvciBtb3JlIGluZm9ybWF0aW9ucykuCiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWY6CiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGJkOWY5NDAuLmZmZWUzNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTIzLDE3ICsyMywxMSBAQAogc3RydWN0IGNhbGxfZnVuY3Rpb25fZGF0YSB7CiAJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEJX19wZXJjcHUgKmNzZDsKIAljcHVtYXNrX3Zhcl90CQljcHVtYXNrOwotCWNwdW1hc2tfdmFyX3QJCWNwdW1hc2tfaXBpOwogfTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBjYWxsX2Z1bmN0aW9uX2RhdGEsIGNmZF9kYXRhKTsKIAotc3RydWN0IGNhbGxfc2luZ2xlX3F1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JcmF3X3NwaW5sb2NrX3QJCWxvY2s7Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IGNhbGxfc2luZ2xlX3F1ZXVlLCBjYWxsX3NpbmdsZV9xdWV1ZSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IGxsaXN0X2hlYWQsIGNhbGxfc2luZ2xlX3F1ZXVlKTsKIAogc3RhdGljIGludAogaG90cGx1Z19jZmQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQpAQCAtNDcsMTQgKzQxLDggQEAKIAkJaWYgKCF6YWxsb2NfY3B1bWFza192YXJfbm9kZSgmY2ZkLT5jcHVtYXNrLCBHRlBfS0VSTkVMLAogCQkJCWNwdV90b19ub2RlKGNwdSkpKQogCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oLUVOT01FTSk7Ci0JCWlmICghemFsbG9jX2NwdW1hc2tfdmFyX25vZGUoJmNmZC0+Y3B1bWFza19pcGksIEdGUF9LRVJORUwsCi0JCQkJY3B1X3RvX25vZGUoY3B1KSkpIHsKLQkJCWZyZWVfY3B1bWFza192YXIoY2ZkLT5jcHVtYXNrKTsKLQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FTk9NRU0pOwotCQl9CiAJCWNmZC0+Y3NkID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhKTsKIAkJaWYgKCFjZmQtPmNzZCkgewotCQkJZnJlZV9jcHVtYXNrX3ZhcihjZmQtPmNwdW1hc2tfaXBpKTsKIAkJCWZyZWVfY3B1bWFza192YXIoY2ZkLT5jcHVtYXNrKTsKIAkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FTk9NRU0pOwogCQl9CkBAIC02Nyw3ICs1NSw2IEBACiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAkJZnJlZV9jcHVtYXNrX3ZhcihjZmQtPmNwdW1hc2spOwotCQlmcmVlX2NwdW1hc2tfdmFyKGNmZC0+Y3B1bWFza19pcGkpOwogCQlmcmVlX3BlcmNwdShjZmQtPmNzZCk7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC04NSwxMiArNzIsOCBAQAogCXZvaWQgKmNwdSA9ICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBpOwogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJc3RydWN0IGNhbGxfc2luZ2xlX3F1ZXVlICpxID0gJnBlcl9jcHUoY2FsbF9zaW5nbGVfcXVldWUsIGkpOwotCi0JCXJhd19zcGluX2xvY2tfaW5pdCgmcS0+bG9jayk7Ci0JCUlOSVRfTElTVF9IRUFEKCZxLT5saXN0KTsKLQl9CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCWluaXRfbGxpc3RfaGVhZCgmcGVyX2NwdShjYWxsX3NpbmdsZV9xdWV1ZSwgaSkpOwogCiAJaG90cGx1Z19jZmQoJmhvdHBsdWdfY2ZkX25vdGlmaWVyLCBDUFVfVVBfUFJFUEFSRSwgY3B1KTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmhvdHBsdWdfY2ZkX25vdGlmaWVyKTsKQEAgLTE0MSwxOCArMTI0LDkgQEAKICAqLwogc3RhdGljIHZvaWQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCBpbnQgd2FpdCkKIHsKLQlzdHJ1Y3QgY2FsbF9zaW5nbGVfcXVldWUgKmRzdCA9ICZwZXJfY3B1KGNhbGxfc2luZ2xlX3F1ZXVlLCBjcHUpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGlwaTsKLQogCWlmICh3YWl0KQogCQljc2QtPmZsYWdzIHw9IENTRF9GTEFHX1dBSVQ7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRzdC0+bG9jaywgZmxhZ3MpOwotCWlwaSA9IGxpc3RfZW1wdHkoJmRzdC0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmY3NkLT5saXN0LCAmZHN0LT5saXN0KTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHN0LT5sb2NrLCBmbGFncyk7Ci0KIAkvKgogCSAqIFRoZSBsaXN0IGFkZGl0aW9uIHNob3VsZCBiZSB2aXNpYmxlIGJlZm9yZSBzZW5kaW5nIHRoZSBJUEkKIAkgKiBoYW5kbGVyIGxvY2tzIHRoZSBsaXN0IHRvIHB1bGwgdGhlIGVudHJ5IG9mZiBpdCBiZWNhdXNlIG9mCkBAIC0xNjQsNyArMTM4LDcgQEAKIAkgKiBsb2NraW5nIGFuZCBiYXJyaWVyIHByaW1pdGl2ZXMuIEdlbmVyaWMgY29kZSBpc24ndCByZWFsbHkKIAkgKiBlcXVpcHBlZCB0byBkbyB0aGUgcmlnaHQgdGhpbmcuLi4KIAkgKi8KLQlpZiAoaXBpKQorCWlmIChsbGlzdF9hZGQoJmNzZC0+bGxpc3QsICZwZXJfY3B1KGNhbGxfc2luZ2xlX3F1ZXVlLCBjcHUpKSkKIAkJYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShjcHUpOwogCiAJaWYgKHdhaXQpCkBAIC0xNzcsMjcgKzE1MSwyNiBAQAogICovCiB2b2lkIGdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCh2b2lkKQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9xdWV1ZSAqcSA9ICZfX2dldF9jcHVfdmFyKGNhbGxfc2luZ2xlX3F1ZXVlKTsKLQlMSVNUX0hFQUQobGlzdCk7CisJc3RydWN0IGxsaXN0X25vZGUgKmVudHJ5LCAqbmV4dDsKIAogCS8qCiAJICogU2hvdWxkbid0IHJlY2VpdmUgdGhpcyBpbnRlcnJ1cHQgb24gYSBjcHUgdGhhdCBpcyBub3QgeWV0IG9ubGluZS4KIAkgKi8KIAlXQVJOX09OX09OQ0UoIWNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAKLQlyYXdfc3Bpbl9sb2NrKCZxLT5sb2NrKTsKLQlsaXN0X3JlcGxhY2VfaW5pdCgmcS0+bGlzdCwgJmxpc3QpOwotCXJhd19zcGluX3VubG9jaygmcS0+bG9jayk7CisJZW50cnkgPSBsbGlzdF9kZWxfYWxsKCZfX2dldF9jcHVfdmFyKGNhbGxfc2luZ2xlX3F1ZXVlKSk7CisJZW50cnkgPSBsbGlzdF9yZXZlcnNlX29yZGVyKGVudHJ5KTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKKwl3aGlsZSAoZW50cnkpIHsKIAkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZDsKIAotCQljc2QgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEsIGxpc3QpOwotCQlsaXN0X2RlbCgmY3NkLT5saXN0KTsKKwkJbmV4dCA9IGVudHJ5LT5uZXh0OwogCisJCWNzZCA9IGxsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSwgbGxpc3QpOwogCQljc2QtPmZ1bmMoY3NkLT5pbmZvKTsKLQogCQljc2RfdW5sb2NrKGNzZCk7CisKKwkJZW50cnkgPSBuZXh0OwogCX0KIH0KIApAQCAtNDAyLDMwICszNzUsMTcgQEAKIAlpZiAodW5saWtlbHkoIWNwdW1hc2tfd2VpZ2h0KGNmZC0+Y3B1bWFzaykpKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIEFmdGVyIHdlIHB1dCBhbiBlbnRyeSBpbnRvIHRoZSBsaXN0LCBjZmQtPmNwdW1hc2sgbWF5IGJlIGNsZWFyZWQKLQkgKiBhZ2FpbiB3aGVuIGFub3RoZXIgQ1BVIHNlbmRzIGFub3RoZXIgSVBJIGZvciBhIFNNUCBmdW5jdGlvbiBjYWxsLCBzbwotCSAqIGNmZC0+Y3B1bWFzayB3aWxsIGJlIHplcm8uCi0JICovCi0JY3B1bWFza19jb3B5KGNmZC0+Y3B1bWFza19pcGksIGNmZC0+Y3B1bWFzayk7Ci0KIAlmb3JfZWFjaF9jcHUoY3B1LCBjZmQtPmNwdW1hc2spIHsKIAkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9IHBlcl9jcHVfcHRyKGNmZC0+Y3NkLCBjcHUpOwotCQlzdHJ1Y3QgY2FsbF9zaW5nbGVfcXVldWUgKmRzdCA9Ci0JCQkJCSZwZXJfY3B1KGNhbGxfc2luZ2xlX3F1ZXVlLCBjcHUpOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWNzZF9sb2NrKGNzZCk7CiAJCWNzZC0+ZnVuYyA9IGZ1bmM7CiAJCWNzZC0+aW5mbyA9IGluZm87Ci0KLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkc3QtPmxvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmY3NkLT5saXN0LCAmZHN0LT5saXN0KTsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzdC0+bG9jaywgZmxhZ3MpOworCQlsbGlzdF9hZGQoJmNzZC0+bGxpc3QsICZwZXJfY3B1KGNhbGxfc2luZ2xlX3F1ZXVlLCBjcHUpKTsKIAl9CiAKIAkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgQ1BVcyBpbiB0aGUgbWFwICovCi0JYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY2ZkLT5jcHVtYXNrX2lwaSk7CisJYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY2ZkLT5jcHVtYXNrKTsKIAogCWlmICh3YWl0KSB7CiAJCWZvcl9lYWNoX2NwdShjcHUsIGNmZC0+Y3B1bWFzaykgewpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggODUwOTY3MC4uNDkwZmNiYiAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJICogaGVyZSwgYXMgc29mdGlycSB3aWxsIGJlIHNlcnZpY2VkIG9uIHJldHVybiBmcm9tIGludGVycnVwdC4KIAkJICovCiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJdGlja19jaGVja19pZGxlKCk7CisJCXRpY2tfaXJxX2VudGVyKCk7CiAJCV9sb2NhbF9iaF9lbmFibGUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCAwOTZkYjc0Li40OWUxM2UxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC0xMjEsNiArMTIxLDggQEAKIHN0YXRpYyBpbnQgc2l4dHkgPSA2MDsKICNlbmRpZgogCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG5lZ19vbmUgPSAtMTsKKwogc3RhdGljIGludCB6ZXJvOwogc3RhdGljIGludCBfX21heWJlX3VudXNlZCBvbmUgPSAxOwogc3RhdGljIGludCBfX21heWJlX3VudXNlZCB0d28gPSAyOwpAQCAtOTk3LDkgKzk5OSwxMCBAQAogCXsKIAkJLnByb2NuYW1lCT0gImh1bmdfdGFza193YXJuaW5ncyIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfaHVuZ190YXNrX3dhcm5pbmdzLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAmbmVnX29uZSwKIAl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NPTVBBVApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IDA4Y2IwYzMuLjlmOGFmNjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTUzMywxMiArNTMzLDEzIEBACiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpLmV2dGRldjsKIAl1NjQgdGltZV9kZWx0YTsKIAorCXRpbWVfZGVsdGEgPSB0aW1la2VlcGluZ19tYXhfZGVmZXJtZW50KCk7CisKIAkvKiBSZWFkIGppZmZpZXMgYW5kIHRoZSB0aW1lIHdoZW4gamlmZmllcyB3ZXJlIHVwZGF0ZWQgbGFzdCAqLwogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmamlmZmllc19sb2NrKTsKIAkJbGFzdF91cGRhdGUgPSBsYXN0X2ppZmZpZXNfdXBkYXRlOwogCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOwotCQl0aW1lX2RlbHRhID0gdGltZWtlZXBpbmdfbWF4X2RlZmVybWVudCgpOwogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJmppZmZpZXNfbG9jaywgc2VxKSk7CiAKIAlpZiAocmN1X25lZWRzX2NwdShjcHUsICZyY3VfZGVsdGFfamlmZmllcykgfHwKQEAgLTY3OCwxOCArNjc5LDE4IEBACiBzdGF0aWMgdm9pZCB0aWNrX25vaHpfZnVsbF9zdG9wX3RpY2soc3RydWN0IHRpY2tfc2NoZWQgKnRzKQogewogI2lmZGVmIENPTkZJR19OT19IWl9GVUxMCi0gICAgICAgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0gICAgICAgaWYgKCF0aWNrX25vaHpfZnVsbF9jcHUoY3B1KSB8fCBpc19pZGxlX3Rhc2soY3VycmVudCkpCi0gICAgICAgICAgICAgICByZXR1cm47CisJaWYgKCF0aWNrX25vaHpfZnVsbF9jcHUoY3B1KSB8fCBpc19pZGxlX3Rhc2soY3VycmVudCkpCisJCXJldHVybjsKIAotICAgICAgIGlmICghdHMtPnRpY2tfc3RvcHBlZCAmJiB0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9JTkFDVElWRSkKLQkgICAgICAgcmV0dXJuOworCWlmICghdHMtPnRpY2tfc3RvcHBlZCAmJiB0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9JTkFDVElWRSkKKwkJcmV0dXJuOwogCi0gICAgICAgaWYgKCFjYW5fc3RvcF9mdWxsX3RpY2soKSkKLSAgICAgICAgICAgICAgIHJldHVybjsKKwlpZiAoIWNhbl9zdG9wX2Z1bGxfdGljaygpKQorCQlyZXR1cm47CiAKLSAgICAgICB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSwgY3B1KTsKKwl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSwgY3B1KTsKICNlbmRpZgogfQogCkBAIC0xMDIzLDcgKzEwMjQsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NoZWNrX25vaHpfdGhpc19jcHUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX25vaHpfaXJxX2VudGVyKHZvaWQpCiB7CiAJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfc2NoZWQpOwogCWt0aW1lX3Qgbm93OwpAQCAtMTA0MiwxNyArMTA0MywxNyBAQAogI2Vsc2UKIAogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9zd2l0Y2hfdG9fbm9oeih2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NoZWNrX25vaHpfdGhpc19jcHUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X2lycV9lbnRlcih2b2lkKSB7IH0KIAogI2VuZGlmIC8qIENPTkZJR19OT19IWl9DT01NT04gKi8KIAogLyoKICAqIENhbGxlZCBmcm9tIGlycV9lbnRlciB0byBub3RpZnkgYWJvdXQgdGhlIHBvc3NpYmxlIGludGVycnVwdGlvbiBvZiBpZGxlKCkKICAqLwotdm9pZCB0aWNrX2NoZWNrX2lkbGUodm9pZCkKK3ZvaWQgdGlja19pcnFfZW50ZXIodm9pZCkKIHsKIAl0aWNrX2NoZWNrX29uZXNob3RfYnJvYWRjYXN0X3RoaXNfY3B1KCk7Ci0JdGlja19jaGVja19ub2h6X3RoaXNfY3B1KCk7CisJdGlja19ub2h6X2lycV9lbnRlcigpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwppbmRleCBmNzg1YWVmLi5iNDE4Y2IwIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwpAQCAtNzgxLDggKzc4MSw4IEBACiAJaWYgKCFlcnJvciAmJiAhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpKQogCQllcnJvciA9IEVJTzsKIAotCV9fYmxrX2FkZF90cmFjZShidCwgYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSwgYmlvLT5iaV9ydywgd2hhdCwKLQkJCWVycm9yLCAwLCBOVUxMKTsKKwlfX2Jsa19hZGRfdHJhY2UoYnQsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsIGJpby0+YmlfaXRlci5iaV9zaXplLAorCQkJYmlvLT5iaV9ydywgd2hhdCwgZXJyb3IsIDAsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX2Jpb19ib3VuY2Uodm9pZCAqaWdub3JlLApAQCAtODg1LDggKzg4NSw5IEBACiAJaWYgKGJ0KSB7CiAJCV9fYmU2NCBycGR1ID0gY3B1X3RvX2JlNjQocGR1KTsKIAotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIGJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsIGJpby0+YmlfcncsCi0JCQkJQkxLX1RBX1NQTElULCAhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpLAorCQlfX2Jsa19hZGRfdHJhY2UoYnQsIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsCisJCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUsIGJpby0+YmlfcncsIEJMS19UQV9TUExJVCwKKwkJCQkhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpLAogCQkJCXNpemVvZihycGR1KSwgJnJwZHUpOwogCX0KIH0KQEAgLTkxOCw5ICs5MTksOSBAQAogCXIuZGV2aWNlX3RvICAgPSBjcHVfdG9fYmUzMihiaW8tPmJpX2JkZXYtPmJkX2Rldik7CiAJci5zZWN0b3JfZnJvbSA9IGNwdV90b19iZTY0KGZyb20pOwogCi0JX19ibGtfYWRkX3RyYWNlKGJ0LCBiaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLCBiaW8tPmJpX3J3LAotCQkJQkxLX1RBX1JFTUFQLCAhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpLAotCQkJc2l6ZW9mKHIpLCAmcik7CisJX19ibGtfYWRkX3RyYWNlKGJ0LCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwKKwkJCWJpby0+YmlfcncsIEJMS19UQV9SRU1BUCwKKwkJCSFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSksIHNpemVvZihyKSwgJnIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggZGJmOTRhNy4uYTQ4YWJlYSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTExOSw3ICsxMTksNyBAQAogCiBjb25maWcgREVCVUdfSU5GTwogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGRlYnVnIGluZm8iCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhQ09NUElMRV9URVNUCiAJaGVscAogICAgICAgICAgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSByZXN1bHRpbmcga2VybmVsIGltYWdlIHdpbGwgaW5jbHVkZQogCSAgZGVidWdnaW5nIGluZm8gcmVzdWx0aW5nIGluIGEgbGFyZ2VyIGtlcm5lbCBpbWFnZS4KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCAxMjZiMzRmLi40ODE0MGUzIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC00NSw2ICs0NSw3IEBACiBvYmotJChDT05GSUdfQ0hFQ0tfU0lHTkFUVVJFKSArPSBjaGVja19zaWduYXR1cmUubwogb2JqLSQoQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUykgKz0gbG9ja2luZy1zZWxmdGVzdC5vCiAKK0dDT1ZfUFJPRklMRV9od2VpZ2h0Lm8gOj0gbgogQ0ZMQUdTX2h3ZWlnaHQubyA9ICQoc3Vic3QgJChxdW90ZSksLCQoQ09ORklHX0FSQ0hfSFdFSUdIVF9DRkxBR1MpKQogb2JqLSQoQ09ORklHX0dFTkVSSUNfSFdFSUdIVCkgKz0gaHdlaWdodC5vCiAKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCBjMzgwODM4Li4yZGVmZDEzIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAlpbnQgaTsKIAogCWlmIChvdmVybGFwID4gQUNUSVZFX1BGTl9NQVhfT1ZFUkxBUCB8fCBvdmVybGFwIDwgMCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBvdmVybGFwOwogCiAJZm9yIChpID0gUkFESVhfVFJFRV9NQVhfVEFHUyAtIDE7IGkgPj0gMDsgaS0tKQogCQlpZiAob3ZlcmxhcCAmIDEgPDwgaSkKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCSAqIGRlYnVnX2RtYV9hc3NlcnRfaWRsZSgpIGFzIHRoZSBwZm4gbWF5IGJlIG1hcmtlZCBpZGxlCiAJICogcHJlbWF0dXJlbHkuCiAJICovCi0JV0FSTl9PTkNFKG92ZXJsYXAgPT0gMCwKKwlXQVJOX09OQ0Uob3ZlcmxhcCA+IEFDVElWRV9QRk5fTUFYX09WRVJMQVAsCiAJCSAgIkRNQS1BUEk6IGV4Y2VlZGVkICVkIG92ZXJsYXBwaW5nIG1hcHBpbmdzIG9mIHBmbiAlbHhcbiIsCiAJCSAgQUNUSVZFX1BGTl9NQVhfT1ZFUkxBUCwgcGZuKTsKIH0KQEAgLTUxNyw3ICs1MTcsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKLQlpZiAoYWN0aXZlX3Bmbl9kZWNfb3ZlcmxhcChlbnRyeS0+cGZuKSA9PSAwKQorCS8qIHNpbmNlIHdlIGFyZSBjb3VudGluZyBvdmVybGFwcyB0aGUgZmluYWwgcHV0IG9mIHRoZQorCSAqIGVudHJ5LT5wZm4gd2lsbCBvY2N1ciB3aGVuIHRoZSBvdmVybGFwIGNvdW50IGlzIDAuCisJICogYWN0aXZlX3Bmbl9kZWNfb3ZlcmxhcCgpIHJldHVybnMgLTEgaW4gdGhhdCBjYXNlCisJICovCisJaWYgKGFjdGl2ZV9wZm5fZGVjX292ZXJsYXAoZW50cnktPnBmbikgPCAwKQogCQlyYWRpeF90cmVlX2RlbGV0ZSgmZG1hX2FjdGl2ZV9wZm4sIGVudHJ5LT5wZm4pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9mb250cy9LY29uZmlnIGIvbGliL2ZvbnRzL0tjb25maWcKaW5kZXggMzRmZDkzMS4uNGRjMWI5OSAxMDA2NDQKLS0tIGEvbGliL2ZvbnRzL0tjb25maWcKKysrIGIvbGliL2ZvbnRzL0tjb25maWcKQEAgLTksNyArOSw3IEBACiAKIGNvbmZpZyBGT05UUwogCWJvb2wgIlNlbGVjdCBjb21waWxlZC1pbiBmb250cyIKLQlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBmb250cyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0CiAJICB5b3VyIGZyYW1lIGJ1ZmZlciBjb25zb2xlIHVzdWFsbHkgdXNlLgpAQCAtMjIsNyArMjIsNyBAQAogCiBjb25maWcgRk9OVF84eDgKIAlib29sICJWR0EgOHg4IGZvbnQiIGlmIEZPTlRTCi0JZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFIHx8IFNUSV9DT05TT0xFCisJZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCiAJZGVmYXVsdCB5IGlmICFTUEFSQyAmJiAhRk9OVFMKIAloZWxwCiAJICBUaGlzIGlzIHRoZSAiaGlnaCByZXNvbHV0aW9uIiBmb250IGZvciB0aGUgVkdBIGZyYW1lIGJ1ZmZlciAodGhlIG9uZQpAQCAtNDUsNyArNDUsNyBAQAogCiBjb25maWcgRk9OVF82eDExCiAJYm9vbCAiTWFjIGNvbnNvbGUgNngxMSBmb250IChub3Qgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzKSIgaWYgRk9OVFMKLQlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKIAlkZWZhdWx0IHkgaWYgIVNQQVJDICYmICFGT05UUyAmJiBNQUMKIAloZWxwCiAJICBTbWFsbCBjb25zb2xlIGZvbnQgd2l0aCBNYWNpbnRvc2gtc3R5bGUgaGlnaC1oYWxmIGdseXBocy4gIFNvbWUgTWFjCmRpZmYgLS1naXQgYS9saWIvZ2VuYWxsb2MuYyBiL2xpYi9nZW5hbGxvYy5jCmluZGV4IGRkYTMxMTYuLmJkYjlhNDUgMTAwNjQ0Ci0tLSBhL2xpYi9nZW5hbGxvYy5jCisrKyBiL2xpYi9nZW5hbGxvYy5jCkBAIC0zMTYsNyArMzE2LDcgQEAKICAqIGdlbl9wb29sX2RtYV9hbGxvYyAtIGFsbG9jYXRlIHNwZWNpYWwgbWVtb3J5IGZyb20gdGhlIHBvb2wgZm9yIERNQSB1c2FnZQogICogQHBvb2w6IHBvb2wgdG8gYWxsb2NhdGUgZnJvbQogICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBwb29sCi0gKiBAZG1hOiBkbWEtdmlldyBwaHlzaWNhbCBhZGRyZXNzCisgKiBAZG1hOiBkbWEtdmlldyBwaHlzaWNhbCBhZGRyZXNzIHJldHVybiB2YWx1ZS4gIFVzZSBOVUxMIGlmIHVubmVlZGVkLgogICoKICAqIEFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBwb29sLgogICogVXNlcyB0aGUgcG9vbCBhbGxvY2F0aW9uIGZ1bmN0aW9uICh3aXRoIGZpcnN0LWZpdCBhbGdvcml0aG0gYnkgZGVmYXVsdCkuCkBAIC0zMzQsNyArMzM0LDggQEAKIAlpZiAoIXZhZGRyKQogCQlyZXR1cm4gTlVMTDsKIAotCSpkbWEgPSBnZW5fcG9vbF92aXJ0X3RvX3BoeXMocG9vbCwgdmFkZHIpOworCWlmIChkbWEpCisJCSpkbWEgPSBnZW5fcG9vbF92aXJ0X3RvX3BoeXMocG9vbCwgdmFkZHIpOwogCiAJcmV0dXJuICh2b2lkICopdmFkZHI7CiB9CmRpZmYgLS1naXQgYS9saWIva29iamVjdC5jIGIvbGliL2tvYmplY3QuYwppbmRleCBiMGIyNjY2Li5jYjE0YWVhIDEwMDY0NAotLS0gYS9saWIva29iamVjdC5jCisrKyBiL2xpYi9rb2JqZWN0LmMKQEAgLTc3OSw2ICs3NzksNyBAQAogCS5zaG93CT0ga29ial9hdHRyX3Nob3csCiAJLnN0b3JlCT0ga29ial9hdHRyX3N0b3JlLAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtvYmpfc3lzZnNfb3BzKTsKIAogLyoqCiAgKiBrc2V0X3JlZ2lzdGVyIC0gaW5pdGlhbGl6ZSBhbmQgYWRkIGEga3NldC4KZGlmZiAtLWdpdCBhL2xpYi9wZXJjcHVfaWRhLmMgYi9saWIvcGVyY3B1X2lkYS5jCmluZGV4IDlkMDU0YmYuLjdiZTIzNWYgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfaWRhLmMKKysrIGIvbGliL3BlcmNwdV9pZGEuYwpAQCAtMTMyLDIyICsxMzIsMjIgQEAKIC8qKgogICogcGVyY3B1X2lkYV9hbGxvYyAtIGFsbG9jYXRlIGEgdGFnCiAgKiBAcG9vbDogcG9vbCB0byBhbGxvY2F0ZSBmcm9tCi0gKiBAZ2ZwOiBnZnAgZmxhZ3MKKyAqIEBzdGF0ZTogdGFzayBzdGF0ZSBmb3IgcHJlcGFyZV90b193YWl0CiAgKgogICogUmV0dXJucyBhIHRhZyAtIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLi5ucl90YWdzKSAocGFzc2VkIHRvCiAgKiB0YWdfcG9vbF9pbml0KCkpLCBvciBvdGhlcndpc2UgLUVOT1NQQyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuCiAgKgogICogU2FmZSB0byBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAoYXNzdW1pbmcgaXQgaXNuJ3QgcGFzc2VkCi0gKiBfX0dGUF9XQUlULCBvZiBjb3Vyc2UpLgorICogVEFTS19VTklOVEVSUlVQVElCTEUgfCBUQVNLX0lOVEVSUlVQVElCTEUsIG9mIGNvdXJzZSkuCiAgKgogICogQGdmcCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gd2FpdCB1bnRpbCBhIGZyZWUgaWQgaXMgYXZhaWxhYmxlIChpdCdzIG5vdAogICogdXNlZCBmb3IgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRpb25zKTsgdGh1cyBpZiBwYXNzZWQgX19HRlBfV0FJVCB3ZSBtYXkgc2xlZXAKICAqIGhvd2V2ZXIgbG9uZyBpdCB0YWtlcyB1bnRpbCBhbm90aGVyIHRocmVhZCBmcmVlcyBhbiBpZCAoc2FtZSBzZW1hbnRpY3MgYXMgYQogICogbWVtcG9vbCkuCiAgKgotICogV2lsbCBub3QgZmFpbCBpZiBwYXNzZWQgX19HRlBfV0FJVC4KKyAqIFdpbGwgbm90IGZhaWwgaWYgcGFzc2VkIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwgVEFTS19JTlRFUlJVUFRJQkxFLgogICovCi1pbnQgcGVyY3B1X2lkYV9hbGxvYyhzdHJ1Y3QgcGVyY3B1X2lkYSAqcG9vbCwgZ2ZwX3QgZ2ZwKQoraW50IHBlcmNwdV9pZGFfYWxsb2Moc3RydWN0IHBlcmNwdV9pZGEgKnBvb2wsIGludCBzdGF0ZSkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3QgcGVyY3B1X2lkYV9jcHUgKnRhZ3M7CkBAIC0xNzQsNyArMTc0LDggQEAKIAkJICoKIAkJICogZ2xvYmFsIGxvY2sgaGVsZCBhbmQgaXJxcyBkaXNhYmxlZCwgZG9uJ3QgbmVlZCBwZXJjcHUgbG9jawogCQkgKi8KLQkJcHJlcGFyZV90b193YWl0KCZwb29sLT53YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoc3RhdGUgIT0gVEFTS19SVU5OSU5HKQorCQkJcHJlcGFyZV90b193YWl0KCZwb29sLT53YWl0LCAmd2FpdCwgc3RhdGUpOwogCiAJCWlmICghdGFncy0+bnJfZnJlZSkKIAkJCWFsbG9jX2dsb2JhbF90YWdzKHBvb2wsIHRhZ3MpOwpAQCAtMTkxLDE2ICsxOTIsMjIgQEAKIAkJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQkJaWYgKHRhZyA+PSAwIHx8ICEoZ2ZwICYgX19HRlBfV0FJVCkpCisJCWlmICh0YWcgPj0gMCB8fCBzdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCQlicmVhazsKIAorCQlpZiAoc2lnbmFsX3BlbmRpbmdfc3RhdGUoc3RhdGUsIGN1cnJlbnQpKSB7CisJCQl0YWcgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCiAJCXNjaGVkdWxlKCk7CiAKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQl0YWdzID0gdGhpc19jcHVfcHRyKHBvb2wtPnRhZ19jcHUpOwogCX0KKwlpZiAoc3RhdGUgIT0gVEFTS19SVU5OSU5HKQorCQlmaW5pc2hfd2FpdCgmcG9vbC0+d2FpdCwgJndhaXQpOwogCi0JZmluaXNoX3dhaXQoJnBvb2wtPndhaXQsICZ3YWl0KTsKIAlyZXR1cm4gdGFnOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X2lkYV9hbGxvYyk7CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCA3MjNiYmUwLi4yZDlmMTUwIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTU1MiwzICs1NTIsMjggQEAKIAkgIGl0IGNhbiBiZSBjbGVhcmVkIGJ5IGhhbmRzLgogCiAJICBTZWUgRG9jdW1lbnRhdGlvbi92bS9zb2Z0LWRpcnR5LnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorCitjb25maWcgWlNNQUxMT0MKKwlib29sICJNZW1vcnkgYWxsb2NhdG9yIGZvciBjb21wcmVzc2VkIHBhZ2VzIgorCWRlcGVuZHMgb24gTU1VCisJZGVmYXVsdCBuCisJaGVscAorCSAgenNtYWxsb2MgaXMgYSBzbGFiLWJhc2VkIG1lbW9yeSBhbGxvY2F0b3IgZGVzaWduZWQgdG8gc3RvcmUKKwkgIGNvbXByZXNzZWQgUkFNIHBhZ2VzLiAgenNtYWxsb2MgdXNlcyB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5nCisJICBpbiBvcmRlciB0byByZWR1Y2UgZnJhZ21lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoaXMgcmVzdWx0cyBpbiBhCisJICBub24tc3RhbmRhcmQgYWxsb2NhdG9yIGludGVyZmFjZSB3aGVyZSBhIGhhbmRsZSwgbm90IGEgcG9pbnRlciwgaXMKKwkgIHJldHVybmVkIGJ5IGFuIGFsbG9jKCkuICBUaGlzIGhhbmRsZSBtdXN0IGJlIG1hcHBlZCBpbiBvcmRlciB0bworCSAgYWNjZXNzIHRoZSBhbGxvY2F0ZWQgc3BhY2UuCisKK2NvbmZpZyBQR1RBQkxFX01BUFBJTkcKKwlib29sICJVc2UgcGFnZSB0YWJsZSBtYXBwaW5nIHRvIGFjY2VzcyBvYmplY3QgaW4genNtYWxsb2MiCisJZGVwZW5kcyBvbiBaU01BTExPQworCWhlbHAKKwkgIEJ5IGRlZmF1bHQsIHpzbWFsbG9jIHVzZXMgYSBjb3B5LWJhc2VkIG9iamVjdCBtYXBwaW5nIG1ldGhvZCB0bworCSAgYWNjZXNzIGFsbG9jYXRpb25zIHRoYXQgc3BhbiB0d28gcGFnZXMuIEhvd2V2ZXIsIGlmIGEgcGFydGljdWxhcgorCSAgYXJjaGl0ZWN0dXJlIChleCwgQVJNKSBwZXJmb3JtcyBWTSBtYXBwaW5nIGZhc3RlciB0aGFuIGNvcHlpbmcsCisJICB0aGVuIHlvdSBzaG91bGQgc2VsZWN0IHRoaXMuIFRoaXMgY2F1c2VzIHpzbWFsbG9jIHRvIHVzZSBwYWdlIHRhYmxlCisJICBtYXBwaW5nIHJhdGhlciB0aGFuIGNvcHlpbmcgZm9yIG9iamVjdCBtYXBwaW5nLgorCisJICBZb3UgY2FuIGNoZWNrIHNwZWVkIHdpdGggenNtYWxsb2MgYmVuY2htYXJrWzFdLgorCSAgWzFdIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGFydGFjdXMwNi96c21hbGxvYwpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCAzMDVkMTBhLi4zMTBjOTBhIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtNjAsMyArNjAsNCBAQAogb2JqLSQoQ09ORklHX0NMRUFOQ0FDSEUpICs9IGNsZWFuY2FjaGUubwogb2JqLSQoQ09ORklHX01FTU9SWV9JU09MQVRJT04pICs9IHBhZ2VfaXNvbGF0aW9uLm8KIG9iai0kKENPTkZJR19aQlVEKQkrPSB6YnVkLm8KK29iai0kKENPTkZJR19aU01BTExPQykJKz0genNtYWxsb2MubwpkaWZmIC0tZ2l0IGEvbW0vYm91bmNlLmMgYi9tbS9ib3VuY2UuYwppbmRleCA1YTdkNThmLi41MjM5MThiIDEwMDY0NAotLS0gYS9tbS9ib3VuY2UuYworKysgYi9tbS9ib3VuY2UuYwpAQCAtOTgsMjcgKzk4LDI0IEBACiBzdGF0aWMgdm9pZCBjb3B5X3RvX2hpZ2hfYmlvX2lycShzdHJ1Y3QgYmlvICp0bywgc3RydWN0IGJpbyAqZnJvbSkKIHsKIAl1bnNpZ25lZCBjaGFyICp2ZnJvbTsKLQlzdHJ1Y3QgYmlvX3ZlYyAqdG92ZWMsICpmcm9tdmVjOwotCWludCBpOworCXN0cnVjdCBiaW9fdmVjIHRvdmVjLCAqZnJvbXZlYyA9IGZyb20tPmJpX2lvX3ZlYzsKKwlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudCh0b3ZlYywgdG8sIGkpIHsKLQkJZnJvbXZlYyA9IGZyb20tPmJpX2lvX3ZlYyArIGk7CisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQodG92ZWMsIHRvLCBpdGVyKSB7CisJCWlmICh0b3ZlYy5idl9wYWdlICE9IGZyb212ZWMtPmJ2X3BhZ2UpIHsKKwkJCS8qCisJCQkgKiBmcm9tdmVjLT5idl9vZmZzZXQgYW5kIGZyb212ZWMtPmJ2X2xlbiBtaWdodCBoYXZlCisJCQkgKiBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBibG9jayBsYXllciwgc28gdXNlIHRoZSBvcmlnaW5hbAorCQkJICogY29weSwgYm91bmNlX2NvcHlfdmVjIGFscmVhZHkgdXNlcyB0b3ZlYy0+YnZfbGVuCisJCQkgKi8KKwkJCXZmcm9tID0gcGFnZV9hZGRyZXNzKGZyb212ZWMtPmJ2X3BhZ2UpICsKKwkJCQl0b3ZlYy5idl9vZmZzZXQ7CiAKLQkJLyoKLQkJICogbm90IGJvdW5jZWQKLQkJICovCi0JCWlmICh0b3ZlYy0+YnZfcGFnZSA9PSBmcm9tdmVjLT5idl9wYWdlKQotCQkJY29udGludWU7CisJCQlib3VuY2VfY29weV92ZWMoJnRvdmVjLCB2ZnJvbSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZSh0b3ZlYy5idl9wYWdlKTsKKwkJfQogCi0JCS8qCi0JCSAqIGZyb212ZWMtPmJ2X29mZnNldCBhbmQgZnJvbXZlYy0+YnZfbGVuIG1pZ2h0IGhhdmUgYmVlbgotCQkgKiBtb2RpZmllZCBieSB0aGUgYmxvY2sgbGF5ZXIsIHNvIHVzZSB0aGUgb3JpZ2luYWwgY29weSwKLQkJICogYm91bmNlX2NvcHlfdmVjIGFscmVhZHkgdXNlcyB0b3ZlYy0+YnZfbGVuCi0JCSAqLwotCQl2ZnJvbSA9IHBhZ2VfYWRkcmVzcyhmcm9tdmVjLT5idl9wYWdlKSArIHRvdmVjLT5idl9vZmZzZXQ7Ci0KLQkJYm91bmNlX2NvcHlfdmVjKHRvdmVjLCB2ZnJvbSk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHRvdmVjLT5idl9wYWdlKTsKKwkJZnJvbXZlYysrOwogCX0KIH0KIApAQCAtMjAxLDEzICsxOTgsMTQgQEAKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKCpiaW9fb3JpZyk7Ci0Jc3RydWN0IGJpb192ZWMgKnRvLCAqZnJvbTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqdG8sIGZyb207CisJc3RydWN0IGJ2ZWNfaXRlciBpdGVyOwogCXVuc2lnbmVkIGk7CiAKIAlpZiAoZm9yY2UpCiAJCWdvdG8gYm91bmNlOwotCWJpb19mb3JfZWFjaF9zZWdtZW50KGZyb20sICpiaW9fb3JpZywgaSkKLQkJaWYgKHBhZ2VfdG9fcGZuKGZyb20tPmJ2X3BhZ2UpID4gcXVldWVfYm91bmNlX3BmbihxKSkKKwliaW9fZm9yX2VhY2hfc2VnbWVudChmcm9tLCAqYmlvX29yaWcsIGl0ZXIpCisJCWlmIChwYWdlX3RvX3Bmbihmcm9tLmJ2X3BhZ2UpID4gcXVldWVfYm91bmNlX3BmbihxKSkKIAkJCWdvdG8gYm91bmNlOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGQ1NmQzYzEuLjdhMTNmNmEgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTI1NTMsOCArMjU1Myw4IEBACiAJaWYgKHJldCA+IDApIHsKIAkJc3NpemVfdCBlcnI7CiAKLQkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIHBvcywgcmV0KTsKLQkJaWYgKGVyciA8IDAgJiYgcmV0ID4gMCkKKwkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKGZpbGUsIGlvY2ItPmtpX3BvcyAtIHJldCwgcmV0KTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXQgPSBlcnI7CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCA2MTJjMTRmLi4yOWUxZTc2IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCisrKyBiL21tL2ludGVybmFsLmgKQEAgLTgzLDcgKzgzLDYgQEAKICAqLwogZXh0ZXJuIGludCBpc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIHB1dGJhY2tfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgem9uZV9yZWNsYWltYWJsZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7CiBleHRlcm4gYm9vbCB6b25lX3JlY2xhaW1hYmxlKHN0cnVjdCB6b25lICp6b25lKTsKIAogLyoKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IDg3ZDIxYTYuLjM5YTMxZTcgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtMTA3Nyw2ICsxMDc3LDkgQEAKIAlpZiAoIWFsaWduKQogCQlhbGlnbiA9IFNNUF9DQUNIRV9CWVRFUzsKIAorCWlmIChtYXhfYWRkciA+IG1lbWJsb2NrLmN1cnJlbnRfbGltaXQpCisJCW1heF9hZGRyID0gbWVtYmxvY2suY3VycmVudF9saW1pdDsKKwogYWdhaW46CiAJYWxsb2MgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlX25vZGUoc2l6ZSwgYWxpZ24sIG1pbl9hZGRyLCBtYXhfYWRkciwKIAkJCQkJICAgIG5pZCk7CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggMTlkNWQ0Mi4uNTMzODVjZCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMzQwMCw3ICszNDAwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbWVtY2dfY3JlYXRlX2ttZW1fY2FjaGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCQkJICBzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqbmV3OworCXN0cnVjdCBrbWVtX2NhY2hlICpuZXcgPSBOVUxMOwogCXN0YXRpYyBjaGFyICp0bXBfbmFtZSA9IE5VTEw7CiAJc3RhdGljIERFRklORV9NVVRFWChtdXRleCk7CS8qIHByb3RlY3RzIHRtcF9uYW1lICovCiAKQEAgLTM0MTYsNyArMzQxNiw3IEBACiAJaWYgKCF0bXBfbmFtZSkgewogCQl0bXBfbmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcF9uYW1lKQotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIG91dDsKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0zNDI2LDEyICszNDI2LDExIEBACiAKIAluZXcgPSBrbWVtX2NhY2hlX2NyZWF0ZV9tZW1jZyhtZW1jZywgdG1wX25hbWUsIHMtPm9iamVjdF9zaXplLCBzLT5hbGlnbiwKIAkJCQkgICAgICAocy0+ZmxhZ3MgJiB+U0xBQl9QQU5JQyksIHMtPmN0b3IsIHMpOwotCiAJaWYgKG5ldykKIAkJbmV3LT5hbGxvY2ZsYWdzIHw9IF9fR0ZQX0tNRU1DRzsKIAllbHNlCiAJCW5ldyA9IHM7Ci0KK291dDoKIAltdXRleF91bmxvY2soJm11dGV4KTsKIAlyZXR1cm4gbmV3OwogfQpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggNGYwOGEyZC4uMmYyZjM0YSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC05NDUsOCArOTQ1LDEwIEBACiAJCQkgKiB0byBpdC4gU2ltaWxhcmx5LCBwYWdlIGxvY2sgaXMgc2hpZnRlZC4KIAkJCSAqLwogCQkJaWYgKGhwYWdlICE9IHApIHsKLQkJCQlwdXRfcGFnZShocGFnZSk7Ci0JCQkJZ2V0X3BhZ2UocCk7CisJCQkJaWYgKCEoZmxhZ3MgJiBNRl9DT1VOVF9JTkNSRUFTRUQpKSB7CisJCQkJCXB1dF9wYWdlKGhwYWdlKTsKKwkJCQkJZ2V0X3BhZ2UocCk7CisJCQkJfQogCQkJCWxvY2tfcGFnZShwKTsKIAkJCQl1bmxvY2tfcGFnZShocGFnZSk7CiAJCQkJKmhwYWdlcCA9IHA7CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDM2Y2I0NmMuLmFlM2M4ZjMgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0yNjU0LDcgKzI2NTQsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HCi1zdGF0aWMgYm9vbCBfX2luaXRkYXRhIG51bWFiYWxhbmNpbmdfb3ZlcnJpZGU7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbnVtYWJhbGFuY2luZ19vdmVycmlkZTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX251bWFiYWxhbmNpbmdfZW5hYmxlKHZvaWQpCiB7CkBAIC0yNjYzLDkgKzI2NjMsMTUgQEAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQV9CQUxBTkNJTkdfREVGQVVMVF9FTkFCTEVEKSkKIAkJbnVtYWJhbGFuY2luZ19kZWZhdWx0ID0gdHJ1ZTsKIAorCS8qIFBhcnNlZCBieSBzZXR1cF9udW1hYmFsYW5jaW5nLiBvdmVycmlkZSA9PSAxIGVuYWJsZXMsIC0xIGRpc2FibGVzICovCisJaWYgKG51bWFiYWxhbmNpbmdfb3ZlcnJpZGUpCisJCXNldF9udW1hYmFsYW5jaW5nX3N0YXRlKG51bWFiYWxhbmNpbmdfb3ZlcnJpZGUgPT0gMSk7CisKIAlpZiAobnJfbm9kZV9pZHMgPiAxICYmICFudW1hYmFsYW5jaW5nX292ZXJyaWRlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIGF1dG9tYXRpYyBOVU1BIGJhbGFuY2luZy4gIgotCQkJIkNvbmZpZ3VyZSB3aXRoIG51bWFfYmFsYW5jaW5nPSBvciB0aGUga2VybmVsLm51bWFfYmFsYW5jaW5nIHN5c2N0bCIpOworCQlwcl9pbmZvKCIlcyBhdXRvbWF0aWMgTlVNQSBiYWxhbmNpbmcuICIKKwkJCSJDb25maWd1cmUgd2l0aCBudW1hX2JhbGFuY2luZz0gb3IgdGhlICIKKwkJCSJrZXJuZWwubnVtYV9iYWxhbmNpbmcgc3lzY3RsIiwKKwkJCW51bWFiYWxhbmNpbmdfZGVmYXVsdCA/ICJFbmFibGluZyIgOiAiRGlzYWJsaW5nIik7CiAJCXNldF9udW1hYmFsYW5jaW5nX3N0YXRlKG51bWFiYWxhbmNpbmdfZGVmYXVsdCk7CiAJfQogfQpAQCAtMjY3NSwxOCArMjY4MSwxNyBAQAogCWludCByZXQgPSAwOwogCWlmICghc3RyKQogCQlnb3RvIG91dDsKLQludW1hYmFsYW5jaW5nX292ZXJyaWRlID0gdHJ1ZTsKIAogCWlmICghc3RyY21wKHN0ciwgImVuYWJsZSIpKSB7Ci0JCXNldF9udW1hYmFsYW5jaW5nX3N0YXRlKHRydWUpOworCQludW1hYmFsYW5jaW5nX292ZXJyaWRlID0gMTsKIAkJcmV0ID0gMTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiZGlzYWJsZSIpKSB7Ci0JCXNldF9udW1hYmFsYW5jaW5nX3N0YXRlKGZhbHNlKTsKKwkJbnVtYWJhbGFuY2luZ19vdmVycmlkZSA9IC0xOwogCQlyZXQgPSAxOwogCX0KIG91dDoKIAlpZiAoIXJldCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIHBhcnNlIG51bWFfYmFsYW5jaW5nPVxuIik7CisJCXByX3dhcm4oIlVuYWJsZSB0byBwYXJzZSBudW1hX2JhbGFuY2luZz1cbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5MjUsNyArMjkzMCw3IEBACiAJdW5zaWduZWQgc2hvcnQgbW9kZSA9IE1QT0xfREVGQVVMVDsKIAl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IDA7CiAKLQlpZiAocG9sICYmIHBvbCAhPSAmZGVmYXVsdF9wb2xpY3kpIHsKKwlpZiAocG9sICYmIHBvbCAhPSAmZGVmYXVsdF9wb2xpY3kgJiYgIShwb2wtPmZsYWdzICYgTVBPTF9GX01PUk9OKSkgewogCQltb2RlID0gcG9sLT5tb2RlOwogCQlmbGFncyA9IHBvbC0+ZmxhZ3M7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggMzdiMWIxOS4uMzI5MWU4MiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkgKiBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IExTTXMuCiAJICovCiAJaWYgKGhhc19jYXBhYmlsaXR5X25vYXVkaXQocCwgQ0FQX1NZU19BRE1JTikpCi0JCWFkaiAtPSAzMDsKKwkJcG9pbnRzIC09IChwb2ludHMgKiAzKSAvIDEwMDsKIAogCS8qIE5vcm1hbGl6ZSB0byBvb21fc2NvcmVfYWRqIHVuaXRzICovCiAJYWRqICo9IHRvdGFscGFnZXMgLyAxMDAwOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggNjM4MDc1OC4uNzEwNmNiMSAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC0xOTEsNiArMTkxLDI2IEBACiAgKiBnbG9iYWwgZGlydHlhYmxlIG1lbW9yeSBmaXJzdC4KICAqLwogCisvKioKKyAqIHpvbmVfZGlydHlhYmxlX21lbW9yeSAtIG51bWJlciBvZiBkaXJ0eWFibGUgcGFnZXMgaW4gYSB6b25lCisgKiBAem9uZTogdGhlIHpvbmUKKyAqCisgKiBSZXR1cm5zIHRoZSB6b25lJ3MgbnVtYmVyIG9mIHBhZ2VzIHBvdGVudGlhbGx5IGF2YWlsYWJsZSBmb3IgZGlydHkKKyAqIHBhZ2UgY2FjaGUuICBUaGlzIGlzIHRoZSBiYXNlIHZhbHVlIGZvciB0aGUgcGVyLXpvbmUgZGlydHkgbGltaXRzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB6b25lX2RpcnR5YWJsZV9tZW1vcnkoc3RydWN0IHpvbmUgKnpvbmUpCit7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKKworCW5yX3BhZ2VzID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpOworCW5yX3BhZ2VzIC09IG1pbihucl9wYWdlcywgem9uZS0+ZGlydHlfYmFsYW5jZV9yZXNlcnZlKTsKKworCW5yX3BhZ2VzICs9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9GSUxFKTsKKwlucl9wYWdlcyArPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0ZJTEUpOworCisJcmV0dXJuIG5yX3BhZ2VzOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBoaWdobWVtX2RpcnR5YWJsZV9tZW1vcnkodW5zaWduZWQgbG9uZyB0b3RhbCkKIHsKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtMTk4LDExICsyMTgsOSBAQAogCXVuc2lnbmVkIGxvbmcgeCA9IDA7CiAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fSElHSF9NRU1PUlkpIHsKLQkJc3RydWN0IHpvbmUgKnogPQotCQkJJk5PREVfREFUQShub2RlKS0+bm9kZV96b25lc1taT05FX0hJR0hNRU1dOworCQlzdHJ1Y3Qgem9uZSAqeiA9ICZOT0RFX0RBVEEobm9kZSktPm5vZGVfem9uZXNbWk9ORV9ISUdITUVNXTsKIAotCQl4ICs9IHpvbmVfcGFnZV9zdGF0ZSh6LCBOUl9GUkVFX1BBR0VTKSArCi0JCSAgICAgem9uZV9yZWNsYWltYWJsZV9wYWdlcyh6KSAtIHotPmRpcnR5X2JhbGFuY2VfcmVzZXJ2ZTsKKwkJeCArPSB6b25lX2RpcnR5YWJsZV9tZW1vcnkoeik7CiAJfQogCS8qCiAJICogVW5yZWNsYWltYWJsZSBtZW1vcnkgKGtlcm5lbCBtZW1vcnkgb3IgYW5vbnltb3VzIG1lbW9yeQpAQCAtMjM4LDkgKzI1NiwxMiBAQAogewogCXVuc2lnbmVkIGxvbmcgeDsKIAotCXggPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSArIGdsb2JhbF9yZWNsYWltYWJsZV9wYWdlcygpOworCXggPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKTsKIAl4IC09IG1pbih4LCBkaXJ0eV9iYWxhbmNlX3Jlc2VydmUpOwogCisJeCArPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9JTkFDVElWRV9GSUxFKTsKKwl4ICs9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0FDVElWRV9GSUxFKTsKKwogCWlmICghdm1faGlnaG1lbV9pc19kaXJ0eWFibGUpCiAJCXggLT0gaGlnaG1lbV9kaXJ0eWFibGVfbWVtb3J5KHgpOwogCkBAIC0yODksMzIgKzMxMCw2IEBACiB9CiAKIC8qKgotICogem9uZV9kaXJ0eWFibGVfbWVtb3J5IC0gbnVtYmVyIG9mIGRpcnR5YWJsZSBwYWdlcyBpbiBhIHpvbmUKLSAqIEB6b25lOiB0aGUgem9uZQotICoKLSAqIFJldHVybnMgdGhlIHpvbmUncyBudW1iZXIgb2YgcGFnZXMgcG90ZW50aWFsbHkgYXZhaWxhYmxlIGZvciBkaXJ0eQotICogcGFnZSBjYWNoZS4gIFRoaXMgaXMgdGhlIGJhc2UgdmFsdWUgZm9yIHRoZSBwZXItem9uZSBkaXJ0eSBsaW1pdHMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHpvbmVfZGlydHlhYmxlX21lbW9yeShzdHJ1Y3Qgem9uZSAqem9uZSkKLXsKLQkvKgotCSAqIFRoZSBlZmZlY3RpdmUgZ2xvYmFsIG51bWJlciBvZiBkaXJ0eWFibGUgcGFnZXMgbWF5IGV4Y2x1ZGUKLQkgKiBoaWdobWVtIGFzIGEgYmlnLXBpY3R1cmUgbWVhc3VyZSB0byBrZWVwIHRoZSByYXRpbyBiZXR3ZWVuCi0JICogZGlydHkgbWVtb3J5IGFuZCBsb3dtZW0gcmVhc29uYWJsZS4KLQkgKgotCSAqIEJ1dCB0aGlzIGZ1bmN0aW9uIGlzIHB1cmVseSBhYm91dCB0aGUgaW5kaXZpZHVhbCB6b25lIGFuZCBhCi0JICogaGlnaG1lbSB6b25lIGNhbiBob2xkIGl0cyBzaGFyZSBvZiBkaXJ0eSBwYWdlcywgc28gd2UgZG9uJ3QKLQkgKiBjYXJlIGFib3V0IHZtX2hpZ2htZW1faXNfZGlydHlhYmxlIGhlcmUuCi0JICovCi0JdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9GUkVFX1BBR0VTKSArCi0JCXpvbmVfcmVjbGFpbWFibGVfcGFnZXMoem9uZSk7Ci0KLQkvKiBkb24ndCBhbGxvdyB0aGlzIHRvIHVuZGVyZmxvdyAqLwotCW5yX3BhZ2VzIC09IG1pbihucl9wYWdlcywgem9uZS0+ZGlydHlfYmFsYW5jZV9yZXNlcnZlKTsKLQlyZXR1cm4gbnJfcGFnZXM7Ci19Ci0KLS8qKgogICogem9uZV9kaXJ0eV9saW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIGRpcnR5IHBhZ2VzIGFsbG93ZWQgaW4gYSB6b25lCiAgKiBAem9uZTogdGhlIHpvbmUKICAqCkBAIC0yMTc4LDExICsyMTczLDEyIEBACiAJaWYgKCFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKSB7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzI7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJaWYgKCFtYXBwaW5nKQogCQkJcmV0dXJuIDE7CiAKLQkJc3Bpbl9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwogCQltYXBwaW5nMiA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAkJaWYgKG1hcHBpbmcyKSB7IC8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KIAkJCUJVR19PTihtYXBwaW5nMiAhPSBtYXBwaW5nKTsKQEAgLTIxOTEsNyArMjE4Nyw3IEBACiAJCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKIAkJCQlwYWdlX2luZGV4KHBhZ2UpLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwogCQlpZiAobWFwcGluZy0+aG9zdCkgewogCQkJLyogIVBhZ2VBbm9uICYmICFzd2FwcGVyX3NwYWNlICovCiAJCQlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggNzI0N2JlNi4uN2M1OWVmNiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCisrKyBiL21tL3BhZ2VfaW8uYwpAQCAtMzEsMTMgKzMxLDEzIEBACiAKIAliaW8gPSBiaW9fYWxsb2MoZ2ZwX2ZsYWdzLCAxKTsKIAlpZiAoYmlvKSB7Ci0JCWJpby0+Ymlfc2VjdG9yID0gbWFwX3N3YXBfcGFnZShwYWdlLCAmYmlvLT5iaV9iZGV2KTsKLQkJYmlvLT5iaV9zZWN0b3IgPDw9IFBBR0VfU0hJRlQgLSA5OworCQliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gbWFwX3N3YXBfcGFnZShwYWdlLCAmYmlvLT5iaV9iZGV2KTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UgPSBwYWdlOwogCQliaW8tPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBQQUdFX1NJWkU7CiAJCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IDA7CiAJCWJpby0+YmlfdmNudCA9IDE7Ci0JCWJpby0+Ymlfc2l6ZSA9IFBBR0VfU0laRTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBQQUdFX1NJWkU7CiAJCWJpby0+YmlfZW5kX2lvID0gZW5kX2lvOwogCX0KIAlyZXR1cm4gYmlvOwpAQCAtNjIsNyArNjIsNyBAQAogCQlwcmludGsoS0VSTl9BTEVSVCAiV3JpdGUtZXJyb3Igb24gc3dhcC1kZXZpY2UgKCV1OiV1OiVMdSlcbiIsCiAJCQkJaW1ham9yKGJpby0+YmlfYmRldi0+YmRfaW5vZGUpLAogCQkJCWltaW5vcihiaW8tPmJpX2JkZXYtPmJkX2lub2RlKSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yKTsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJpby0+YmlfaXRlci5iaV9zZWN0b3IpOwogCQlDbGVhclBhZ2VSZWNsYWltKHBhZ2UpOwogCX0KIAllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CkBAIC04MCw3ICs4MCw3IEBACiAJCXByaW50ayhLRVJOX0FMRVJUICJSZWFkLWVycm9yIG9uIHN3YXAtZGV2aWNlICgldToldTolTHUpXG4iLAogCQkJCWltYWpvcihiaW8tPmJpX2JkZXYtPmJkX2lub2RlKSwKIAkJCQlpbWlub3IoYmlvLT5iaV9iZGV2LT5iZF9pbm9kZSksCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3Rvcik7CisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9tbS9yZWFkYWhlYWQuYyBiL21tL3JlYWRhaGVhZC5jCmluZGV4IDdjZGJiNDQuLjBkZTIzNjAgMTAwNjQ0Ci0tLSBhL21tL3JlYWRhaGVhZC5jCisrKyBiL21tL3JlYWRhaGVhZC5jCkBAIC0yMTEsOCArMjExLDYgQEAKIGludCBmb3JjZV9wYWdlX2NhY2hlX3JlYWRhaGVhZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXBnb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3RvX3JlYWQpCiB7Ci0JaW50IHJldCA9IDA7Ci0KIAlpZiAodW5saWtlbHkoIW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSAmJiAhbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlcykpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0yMjYsMTUgKzIyNCwxMyBAQAogCQkJdGhpc19jaHVuayA9IG5yX3RvX3JlYWQ7CiAJCWVyciA9IF9fZG9fcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgZmlscCwKIAkJCQkJCW9mZnNldCwgdGhpc19jaHVuaywgMCk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlyZXQgPSBlcnI7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgKz0gZXJyOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKIAkJb2Zmc2V0ICs9IHRoaXNfY2h1bms7CiAJCW5yX3RvX3JlYWQgLT0gdGhpc19jaHVuazsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTU3Niw4ICs1NzIsNyBAQAogCWlmICghbWFwcGluZyB8fCAhbWFwcGluZy0+YV9vcHMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yY2VfcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgZmlscCwgaW5kZXgsIG5yKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZm9yY2VfcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgZmlscCwgaW5kZXgsIG5yKTsKIH0KIAogU1lTQ0FMTF9ERUZJTkUzKHJlYWRhaGVhZCwgaW50LCBmZCwgbG9mZl90LCBvZmZzZXQsIHNpemVfdCwgY291bnQpCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggZWIwNDNiZi4uYjI2NDIxNCAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtMTk0Niw3ICsxOTQ2LDcgQEAKIC8qKgogICogc2xhYl9kZXN0cm95IC0gZGVzdHJveSBhbmQgcmVsZWFzZSBhbGwgb2JqZWN0cyBpbiBhIHNsYWIKICAqIEBjYWNoZXA6IGNhY2hlIHBvaW50ZXIgYmVpbmcgZGVzdHJveWVkCi0gKiBAc2xhYnA6IHNsYWIgcG9pbnRlciBiZWluZyBkZXN0cm95ZWQKKyAqIEBwYWdlOiBwYWdlIHBvaW50ZXIgYmVpbmcgZGVzdHJveWVkCiAgKgogICogRGVzdHJveSBhbGwgdGhlIG9ianMgaW4gYSBzbGFiLCBhbmQgcmVsZWFzZSB0aGUgbWVtIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAqIEJlZm9yZSBjYWxsaW5nIHRoZSBzbGFiIG11c3QgaGF2ZSBiZWVuIHVubGlua2VkIGZyb20gdGhlIGNhY2hlLiAgVGhlCmRpZmYgLS1naXQgYS9tbS9zbGFiX2NvbW1vbi5jIGIvbW0vc2xhYl9jb21tb24uYwppbmRleCA4ZTQwMzIxLi4xZWMzYzYxIDEwMDY0NAotLS0gYS9tbS9zbGFiX2NvbW1vbi5jCisrKyBiL21tL3NsYWJfY29tbW9uLmMKQEAgLTIzMywxNCArMjMzLDE3IEBACiAJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAotCS8qCi0JICogVGhlcmUgaXMgbm8gcG9pbnQgaW4gZmxvb2RpbmcgbG9ncyB3aXRoIHdhcm5pbmdzIG9yIGVzcGVjaWFsbHkKLQkgKiBjcmFzaGluZyB0aGUgc3lzdGVtIGlmIHdlIGZhaWwgdG8gY3JlYXRlIGEgY2FjaGUgZm9yIGEgbWVtY2cuIEluCi0JICogdGhpcyBjYXNlIHdlIHdpbGwgYmUgYWNjb3VudGluZyB0aGUgbWVtY2cgYWxsb2NhdGlvbiB0byB0aGUgcm9vdAotCSAqIGNncm91cCB1bnRpbCB3ZSBzdWNjZWVkIHRvIGNyZWF0ZSBpdHMgb3duIGNhY2hlLCBidXQgaXQgaXNuJ3QgdGhhdAotCSAqIGNyaXRpY2FsLgotCSAqLwotCWlmIChlcnIgJiYgIW1lbWNnKSB7CisJaWYgKGVycikgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmbG9vZGluZyBsb2dzIHdpdGggd2FybmluZ3Mgb3IKKwkJICogZXNwZWNpYWxseSBjcmFzaGluZyB0aGUgc3lzdGVtIGlmIHdlIGZhaWwgdG8gY3JlYXRlIGEgY2FjaGUKKwkJICogZm9yIGEgbWVtY2cuIEluIHRoaXMgY2FzZSB3ZSB3aWxsIGJlIGFjY291bnRpbmcgdGhlIG1lbWNnCisJCSAqIGFsbG9jYXRpb24gdG8gdGhlIHJvb3QgY2dyb3VwIHVudGlsIHdlIHN1Y2NlZWQgdG8gY3JlYXRlIGl0cworCQkgKiBvd24gY2FjaGUsIGJ1dCBpdCBpc24ndCB0aGF0IGNyaXRpY2FsLgorCQkgKi8KKwkJaWYgKCFtZW1jZykKKwkJCXJldHVybiBOVUxMOworCiAJCWlmIChmbGFncyAmIFNMQUJfUEFOSUMpCiAJCQlwYW5pYygia21lbV9jYWNoZV9jcmVhdGU6IEZhaWxlZCB0byBjcmVhdGUgc2xhYiAnJXMnLiBFcnJvciAlZFxuIiwKIAkJCQluYW1lLCBlcnIpOwpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDM0YmI4YzYuLjI1ZjE0YWQgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTM1NSw2ICszNTUsMjEgQEAKIAlfX2JpdF9zcGluX3VubG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFnZV9zbHViX2NvdW50ZXJzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGNvdW50ZXJzX25ldykKK3sKKwlzdHJ1Y3QgcGFnZSB0bXA7CisJdG1wLmNvdW50ZXJzID0gY291bnRlcnNfbmV3OworCS8qCisJICogcGFnZS0+Y291bnRlcnMgY2FuIGNvdmVyIGZyb3plbi9pbnVzZS9vYmplY3RzIGFzIHdlbGwKKwkgKiBhcyBwYWdlLT5fY291bnQuICBJZiB3ZSBhc3NpZ24gdG8gLT5jb3VudGVycyBkaXJlY3RseQorCSAqIHdlIHJ1biB0aGUgcmlzayBvZiBsb3NpbmcgdXBkYXRlcyB0byBwYWdlLT5fY291bnQsIHNvCisJICogYmUgY2FyZWZ1bCBhbmQgb25seSBhc3NpZ24gdG8gdGhlIGZpZWxkcyB3ZSBuZWVkLgorCSAqLworCXBhZ2UtPmZyb3plbiAgPSB0bXAuZnJvemVuOworCXBhZ2UtPmludXNlICAgPSB0bXAuaW51c2U7CisJcGFnZS0+b2JqZWN0cyA9IHRtcC5vYmplY3RzOworfQorCiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgKGZvciB0aGUgZmFsbGJhY2sgY29kZSB0byB3b3JrIHJpZ2h0KSAqLwogc3RhdGljIGlubGluZSBib29sIF9fY21weGNoZ19kb3VibGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCXZvaWQgKmZyZWVsaXN0X29sZCwgdW5zaWduZWQgbG9uZyBjb3VudGVyc19vbGQsCkBAIC0zNzYsNyArMzkxLDcgQEAKIAkJaWYgKHBhZ2UtPmZyZWVsaXN0ID09IGZyZWVsaXN0X29sZCAmJgogCQkJCQlwYWdlLT5jb3VudGVycyA9PSBjb3VudGVyc19vbGQpIHsKIAkJCXBhZ2UtPmZyZWVsaXN0ID0gZnJlZWxpc3RfbmV3OwotCQkJcGFnZS0+Y291bnRlcnMgPSBjb3VudGVyc19uZXc7CisJCQlzZXRfcGFnZV9zbHViX2NvdW50ZXJzKHBhZ2UsIGNvdW50ZXJzX25ldyk7CiAJCQlzbGFiX3VubG9jayhwYWdlKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC00MTUsNyArNDMwLDcgQEAKIAkJaWYgKHBhZ2UtPmZyZWVsaXN0ID09IGZyZWVsaXN0X29sZCAmJgogCQkJCQlwYWdlLT5jb3VudGVycyA9PSBjb3VudGVyc19vbGQpIHsKIAkJCXBhZ2UtPmZyZWVsaXN0ID0gZnJlZWxpc3RfbmV3OwotCQkJcGFnZS0+Y291bnRlcnMgPSBjb3VudGVyc19uZXc7CisJCQlzZXRfcGFnZV9zbHViX2NvdW50ZXJzKHBhZ2UsIGNvdW50ZXJzX25ldyk7CiAJCQlzbGFiX3VubG9jayhwYWdlKTsKIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJCXJldHVybiAxOwpAQCAtOTg1LDggKzEwMDAsNiBAQAogCiAvKgogICogVHJhY2tpbmcgb2YgZnVsbHkgYWxsb2NhdGVkIHNsYWJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gKgotICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC05OTQsMTcgKzEwMDcsMTYgQEAKIAlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCiAJCXJldHVybjsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm4tPmxpc3RfbG9jayk7CiAJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm4tPmZ1bGwpOwogfQogCi0vKgotICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KLSAqLwotc3RhdGljIHZvaWQgcmVtb3ZlX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgcmVtb3ZlX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHN0cnVjdCBwYWdlICpwYWdlKQogewogCWlmICghKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKIAkJcmV0dXJuOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbi0+bGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIH0KIApAQCAtMTI1MCw3ICsxMjYyLDggQEAKIAkJCXZvaWQgKm9iamVjdCwgdTggdmFsKSB7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCiAJCQkJCXN0cnVjdCBwYWdlICpwYWdlKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKKwkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpIHt9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga21lbV9jYWNoZV9mbGFncyh1bnNpZ25lZCBsb25nIG9iamVjdF9zaXplLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsCiAJdm9pZCAoKmN0b3IpKHZvaWQgKikpCkBAIC0xNTA0LDExICsxNTE3LDkgQEAKIAogLyoKICAqIE1hbmFnZW1lbnQgb2YgcGFydGlhbGx5IGFsbG9jYXRlZCBzbGFicy4KLSAqCi0gKiBsaXN0X2xvY2sgbXVzdCBiZSBoZWxkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHRhaWwpCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYWRkX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB0YWlsKQogewogCW4tPm5yX3BhcnRpYWwrKzsKIAlpZiAodGFpbCA9PSBERUFDVElWQVRFX1RPX1RBSUwpCkBAIC0xNTE3LDIzICsxNTI4LDMyIEBACiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZuLT5wYXJ0aWFsKTsKIH0KIAotLyoKLSAqIGxpc3RfbG9jayBtdXN0IGJlIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAotCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgdGFpbCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZuLT5saXN0X2xvY2spOworCV9fYWRkX3BhcnRpYWwobiwgcGFnZSwgdGFpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19yZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAluLT5ucl9wYXJ0aWFsLS07CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAorCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZuLT5saXN0X2xvY2spOworCV9fcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7Cit9CisKIC8qCiAgKiBSZW1vdmUgc2xhYiBmcm9tIHRoZSBwYXJ0aWFsIGxpc3QsIGZyZWV6ZSBpdCBhbmQKICAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZnJlZWxpc3QuCiAgKgogICogUmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBvciBOVUxMIGlmIGl0IGZhaWxzLgotICoKLSAqIE11c3QgaG9sZCBsaXN0X2xvY2sgc2luY2Ugd2UgbW9kaWZ5IHRoZSBwYXJ0aWFsIGxpc3QuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqYWNxdWlyZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTE1NDMsNiArMTU2Myw4IEBACiAJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKIAlzdHJ1Y3QgcGFnZSBuZXc7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZuLT5saXN0X2xvY2spOworCiAJLyoKIAkgKiBaYXAgdGhlIGZyZWVsaXN0IGFuZCBzZXQgdGhlIGZyb3plbiBiaXQuCiAJICogVGhlIG9sZCBmcmVlbGlzdCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIGZvciB0aGUKQEAgLTE1NTksNyArMTU4MSw3IEBACiAJCW5ldy5mcmVlbGlzdCA9IGZyZWVsaXN0OwogCX0KIAotCVZNX0JVR19PTl9QQUdFKG5ldy5mcm96ZW4sICZuZXcpOworCVZNX0JVR19PTihuZXcuZnJvemVuKTsKIAluZXcuZnJvemVuID0gMTsKIAogCWlmICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCkBAIC0xODEyLDcgKzE4MzQsNyBAQAogCQkJc2V0X2ZyZWVwb2ludGVyKHMsIGZyZWVsaXN0LCBwcmlvcik7CiAJCQluZXcuY291bnRlcnMgPSBjb3VudGVyczsKIAkJCW5ldy5pbnVzZS0tOwotCQkJVk1fQlVHX09OX1BBR0UoIW5ldy5mcm96ZW4sICZuZXcpOworCQkJVk1fQlVHX09OKCFuZXcuZnJvemVuKTsKIAogCQl9IHdoaWxlICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCiAJCQlwcmlvciwgY291bnRlcnMsCkBAIC0xODQwLDcgKzE4NjIsNyBAQAogCiAJb2xkLmZyZWVsaXN0ID0gcGFnZS0+ZnJlZWxpc3Q7CiAJb2xkLmNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7Ci0JVk1fQlVHX09OX1BBR0UoIW9sZC5mcm96ZW4sICZvbGQpOworCVZNX0JVR19PTighb2xkLmZyb3plbik7CiAKIAkvKiBEZXRlcm1pbmUgdGFyZ2V0IHN0YXRlIG9mIHRoZSBzbGFiICovCiAJbmV3LmNvdW50ZXJzID0gb2xkLmNvdW50ZXJzOwpAQCAtMTg4Nyw3ICsxOTA5LDcgQEAKIAogCQllbHNlIGlmIChsID09IE1fRlVMTCkKIAotCQkJcmVtb3ZlX2Z1bGwocywgcGFnZSk7CisJCQlyZW1vdmVfZnVsbChzLCBuLCBwYWdlKTsKIAogCQlpZiAobSA9PSBNX1BBUlRJQUwpIHsKIApAQCAtMTk1Miw3ICsxOTc0LDcgQEAKIAogCQkJb2xkLmZyZWVsaXN0ID0gcGFnZS0+ZnJlZWxpc3Q7CiAJCQlvbGQuY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKLQkJCVZNX0JVR19PTl9QQUdFKCFvbGQuZnJvemVuLCAmb2xkKTsKKwkJCVZNX0JVR19PTighb2xkLmZyb3plbik7CiAKIAkJCW5ldy5jb3VudGVycyA9IG9sZC5jb3VudGVyczsKIAkJCW5ldy5mcmVlbGlzdCA9IG9sZC5mcmVlbGlzdDsKQEAgLTIyMjUsNyArMjI0Nyw3IEBACiAJCWNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CiAKIAkJbmV3LmNvdW50ZXJzID0gY291bnRlcnM7Ci0JCVZNX0JVR19PTl9QQUdFKCFuZXcuZnJvemVuLCAmbmV3KTsKKwkJVk1fQlVHX09OKCFuZXcuZnJvemVuKTsKIAogCQluZXcuaW51c2UgPSBwYWdlLT5vYmplY3RzOwogCQluZXcuZnJvemVuID0gZnJlZWxpc3QgIT0gTlVMTDsKQEAgLTIzMTksNyArMjM0MSw3IEBACiAJICogcGFnZSBpcyBwb2ludGluZyB0byB0aGUgcGFnZSBmcm9tIHdoaWNoIHRoZSBvYmplY3RzIGFyZSBvYnRhaW5lZC4KIAkgKiBUaGF0IHBhZ2UgbXVzdCBiZSBmcm96ZW4gZm9yIHBlciBjcHUgYWxsb2NhdGlvbnMgdG8gd29yay4KIAkgKi8KLQlWTV9CVUdfT05fUEFHRSghYy0+cGFnZS0+ZnJvemVuLCBjLT5wYWdlKTsKKwlWTV9CVUdfT04oIWMtPnBhZ2UtPmZyb3plbik7CiAJYy0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIocywgZnJlZWxpc3QpOwogCWMtPnRpZCA9IG5leHRfdGlkKGMtPnRpZCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMjU0MSw3ICsyNTYzLDcgQEAKIAkJbmV3LmludXNlLS07CiAJCWlmICgoIW5ldy5pbnVzZSB8fCAhcHJpb3IpICYmICF3YXNfZnJvemVuKSB7CiAKLQkJCWlmIChrbWVtX2NhY2hlX2hhc19jcHVfcGFydGlhbChzKSAmJiAhcHJpb3IpCisJCQlpZiAoa21lbV9jYWNoZV9oYXNfY3B1X3BhcnRpYWwocykgJiYgIXByaW9yKSB7CiAKIAkJCQkvKgogCQkJCSAqIFNsYWIgd2FzIG9uIG5vIGxpc3QgYmVmb3JlIGFuZCB3aWxsIGJlCkBAIC0yNTUxLDcgKzI1NzMsNyBAQAogCQkJCSAqLwogCQkJCW5ldy5mcm96ZW4gPSAxOwogCi0JCQllbHNlIHsgLyogTmVlZHMgdG8gYmUgdGFrZW4gb2ZmIGEgbGlzdCAqLworCQkJfSBlbHNlIHsgLyogTmVlZHMgdG8gYmUgdGFrZW4gb2ZmIGEgbGlzdCAqLwogCiAJICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKIAkJCQkvKgpAQCAtMjYwMCw3ICsyNjIyLDcgQEAKIAkgKi8KIAlpZiAoIWttZW1fY2FjaGVfaGFzX2NwdV9wYXJ0aWFsKHMpICYmIHVubGlrZWx5KCFwcmlvcikpIHsKIAkJaWYgKGttZW1fY2FjaGVfZGVidWcocykpCi0JCQlyZW1vdmVfZnVsbChzLCBwYWdlKTsKKwkJCXJlbW92ZV9mdWxsKHMsIG4sIHBhZ2UpOwogCQlhZGRfcGFydGlhbChuLCBwYWdlLCBERUFDVElWQVRFX1RPX1RBSUwpOwogCQlzdGF0KHMsIEZSRUVfQUREX1BBUlRJQUwpOwogCX0KQEAgLTI2MTQsOSArMjYzNiwxMCBAQAogCQkgKi8KIAkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CiAJCXN0YXQocywgRlJFRV9SRU1PVkVfUEFSVElBTCk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJLyogU2xhYiBtdXN0IGJlIG9uIHRoZSBmdWxsIGxpc3QgKi8KLQkJcmVtb3ZlX2Z1bGwocywgcGFnZSk7CisJCXJlbW92ZV9mdWxsKHMsIG4sIHBhZ2UpOworCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOwogCXN0YXQocywgRlJFRV9TTEFCKTsKQEAgLTI4OTAsNyArMjkxMywxMSBAQAogCWluaXRfa21lbV9jYWNoZV9ub2RlKG4pOwogCWluY19zbGFic19ub2RlKGttZW1fY2FjaGVfbm9kZSwgbm9kZSwgcGFnZS0+b2JqZWN0cyk7CiAKLQlhZGRfcGFydGlhbChuLCBwYWdlLCBERUFDVElWQVRFX1RPX0hFQUQpOworCS8qCisJICogTm8gbG9ja3MgbmVlZCB0byBiZSB0YWtlbiBoZXJlIGFzIGl0IGhhcyBqdXN0IGJlZW4KKwkgKiBpbml0aWFsaXplZCBhbmQgdGhlcmUgaXMgbm8gY29uY3VycmVudCBhY2Nlc3MuCisJICovCisJX19hZGRfcGFydGlhbChuLCBwYWdlLCBERUFDVElWQVRFX1RPX0hFQUQpOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX2ttZW1fY2FjaGVfbm9kZXMoc3RydWN0IGttZW1fY2FjaGUgKnMpCkBAIC0zMTc2LDcgKzMyMDMsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIGgsICZuLT5wYXJ0aWFsLCBscnUpIHsKIAkJaWYgKCFwYWdlLT5pbnVzZSkgewotCQkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CisJCQlfX3JlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwogCQkJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwogCQl9IGVsc2UgewogCQkJbGlzdF9zbGFiX29iamVjdHMocywgcGFnZSwKQEAgLTQyOTksNyArNDMyNiwxMyBAQAogCiAJCQlwYWdlID0gQUNDRVNTX09OQ0UoYy0+cGFydGlhbCk7CiAJCQlpZiAocGFnZSkgewotCQkJCXggPSBwYWdlLT5wb2JqZWN0czsKKwkJCQlub2RlID0gcGFnZV90b19uaWQocGFnZSk7CisJCQkJaWYgKGZsYWdzICYgU09fVE9UQUwpCisJCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQllbHNlIGlmIChmbGFncyAmIFNPX09CSkVDVFMpCisJCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQllbHNlCisJCQkJCXggPSBwYWdlLT5wYWdlczsKIAkJCQl0b3RhbCArPSB4OwogCQkJCW5vZGVzW25vZGVdICs9IHg7CiAJCQl9CkBAIC01MTYzLDcgKzUxOTYsNyBAQAogCX0KIAogCXMtPmtvYmoua3NldCA9IHNsYWJfa3NldDsKLQllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmcy0+a29iaiwgJnNsYWJfa3R5cGUsIE5VTEwsIG5hbWUpOworCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZzLT5rb2JqLCAmc2xhYl9rdHlwZSwgTlVMTCwgIiVzIiwgbmFtZSk7CiAJaWYgKGVycikgewogCQlrb2JqZWN0X3B1dCgmcy0+a29iaik7CiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggOThlODVlOS4uZTc2YWNlMyAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCisrKyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtNjMsNiArNjMsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBhdG9taWNfdCBzd2FwaW5fcmVhZGFoZWFkX2hpdHMgPSBBVE9NSUNfSU5JVCg0KTsKKwogdm9pZCBzaG93X3N3YXBfY2FjaGVfaW5mbyh2b2lkKQogewogCXByaW50aygiJWx1IHBhZ2VzIGluIHN3YXAgY2FjaGVcbiIsIHRvdGFsX3N3YXBjYWNoZV9wYWdlcygpKTsKQEAgLTI4Niw4ICsyODgsMTEgQEAKIAogCXBhZ2UgPSBmaW5kX2dldF9wYWdlKHN3YXBfYWRkcmVzc19zcGFjZShlbnRyeSksIGVudHJ5LnZhbCk7CiAKLQlpZiAocGFnZSkKKwlpZiAocGFnZSkgewogCQlJTkNfQ0FDSEVfSU5GTyhmaW5kX3N1Y2Nlc3MpOworCQlpZiAoVGVzdENsZWFyUGFnZVJlYWRhaGVhZChwYWdlKSkKKwkJCWF0b21pY19pbmMoJnN3YXBpbl9yZWFkYWhlYWRfaGl0cyk7CisJfQogCiAJSU5DX0NBQ0hFX0lORk8oZmluZF90b3RhbCk7CiAJcmV0dXJuIHBhZ2U7CkBAIC0zODksNiArMzk0LDUwIEBACiAJcmV0dXJuIGZvdW5kX3BhZ2U7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN3YXBpbl9ucl9wYWdlcyh1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcGFnZXMsIG1heF9wYWdlcywgbGFzdF9yYTsKKwlzdGF0aWMgYXRvbWljX3QgbGFzdF9yZWFkYWhlYWRfcGFnZXM7CisKKwltYXhfcGFnZXMgPSAxIDw8IEFDQ0VTU19PTkNFKHBhZ2VfY2x1c3Rlcik7CisJaWYgKG1heF9wYWdlcyA8PSAxKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogVGhpcyBoZXVyaXN0aWMgaGFzIGJlZW4gZm91bmQgdG8gd29yayB3ZWxsIG9uIGJvdGggc2VxdWVudGlhbCBhbmQKKwkgKiByYW5kb20gbG9hZHMsIHN3YXBwaW5nIHRvIGhhcmQgZGlzayBvciB0byBTU0Q6IHBsZWFzZSBkb24ndCBhc2sKKwkgKiB3aGF0IHRoZSAiKyAyIiBtZWFucywgaXQganVzdCBoYXBwZW5zIHRvIHdvcmsgd2VsbCwgdGhhdCdzIGFsbC4KKwkgKi8KKwlwYWdlcyA9IGF0b21pY194Y2hnKCZzd2FwaW5fcmVhZGFoZWFkX2hpdHMsIDApICsgMjsKKwlpZiAocGFnZXMgPT0gMikgeworCQkvKgorCQkgKiBXZSBjYW4gaGF2ZSBubyByZWFkYWhlYWQgaGl0cyB0byBqdWRnZSBieTogYnV0IG11c3Qgbm90IGdldAorCQkgKiBzdHVjayBoZXJlIGZvcmV2ZXIsIHNvIGNoZWNrIGZvciBhbiBhZGphY2VudCBvZmZzZXQgaW5zdGVhZAorCQkgKiAoYW5kIGRvbid0IGV2ZW4gYm90aGVyIHRvIGNoZWNrIHdoZXRoZXIgc3dhcCB0eXBlIGlzIHNhbWUpLgorCQkgKi8KKwkJaWYgKG9mZnNldCAhPSBwcmV2X29mZnNldCArIDEgJiYgb2Zmc2V0ICE9IHByZXZfb2Zmc2V0IC0gMSkKKwkJCXBhZ2VzID0gMTsKKwkJcHJldl9vZmZzZXQgPSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHJvdW5kdXAgPSA0OworCQl3aGlsZSAocm91bmR1cCA8IHBhZ2VzKQorCQkJcm91bmR1cCA8PD0gMTsKKwkJcGFnZXMgPSByb3VuZHVwOworCX0KKworCWlmIChwYWdlcyA+IG1heF9wYWdlcykKKwkJcGFnZXMgPSBtYXhfcGFnZXM7CisKKwkvKiBEb24ndCBzaHJpbmsgcmVhZGFoZWFkIHRvbyBmYXN0ICovCisJbGFzdF9yYSA9IGF0b21pY19yZWFkKCZsYXN0X3JlYWRhaGVhZF9wYWdlcykgLyAyOworCWlmIChwYWdlcyA8IGxhc3RfcmEpCisJCXBhZ2VzID0gbGFzdF9yYTsKKwlhdG9taWNfc2V0KCZsYXN0X3JlYWRhaGVhZF9wYWdlcywgcGFnZXMpOworCisJcmV0dXJuIHBhZ2VzOworfQorCiAvKioKICAqIHN3YXBpbl9yZWFkYWhlYWQgLSBzd2FwIGluIHBhZ2VzIGluIGhvcGUgd2UgbmVlZCB0aGVtIHNvb24KICAqIEBlbnRyeTogc3dhcCBlbnRyeSBvZiB0aGlzIG1lbW9yeQpAQCAtNDEyLDExICs0NjEsMTYgQEAKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTsKKwl1bnNpZ25lZCBsb25nIGVudHJ5X29mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gZW50cnlfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWFzayA9ICgxVUwgPDwgcGFnZV9jbHVzdGVyKSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXNrOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCisJbWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTsKKwlpZiAoIW1hc2spCisJCWdvdG8gc2tpcDsKKwogCS8qIFJlYWQgYSBwYWdlX2NsdXN0ZXIgc2l6ZWQgYW5kIGFsaWduZWQgY2x1c3RlciBhcm91bmQgb2Zmc2V0LiAqLwogCXN0YXJ0X29mZnNldCA9IG9mZnNldCAmIH5tYXNrOwogCWVuZF9vZmZzZXQgPSBvZmZzZXQgfCBtYXNrOwpAQCAtNDMwLDEwICs0ODQsMTMgQEAKIAkJCQkJCWdmcF9tYXNrLCB2bWEsIGFkZHIpOwogCQlpZiAoIXBhZ2UpCiAJCQljb250aW51ZTsKKwkJaWYgKG9mZnNldCAhPSBlbnRyeV9vZmZzZXQpCisJCQlTZXRQYWdlUmVhZGFoZWFkKHBhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKIAlscnVfYWRkX2RyYWluKCk7CS8qIFB1c2ggYW55IG5ldyBwYWdlcyBvbnRvIHRoZSBMUlUgbm93ICovCitza2lwOgogCXJldHVybiByZWFkX3N3YXBfY2FjaGVfYXN5bmMoZW50cnksIGdmcF9tYXNrLCB2bWEsIGFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggYzZjMTNiMDUuLjRhN2Y3ZTYgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTkyMyw3ICsxOTIzLDYgQEAKIAlwLT5zd2FwX21hcCA9IE5VTEw7CiAJY2x1c3Rlcl9pbmZvID0gcC0+Y2x1c3Rlcl9pbmZvOwogCXAtPmNsdXN0ZXJfaW5mbyA9IE5VTEw7Ci0JcC0+ZmxhZ3MgPSAwOwogCWZyb250c3dhcF9tYXAgPSBmcm9udHN3YXBfbWFwX2dldChwKTsKIAlzcGluX3VubG9jaygmcC0+bG9jayk7CiAJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CkBAIC0xOTQ5LDYgKzE5NDgsMTYgQEAKIAkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJfQogCWZpbHBfY2xvc2Uoc3dhcF9maWxlLCBOVUxMKTsKKworCS8qCisJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb24KKwkgKiBjYW4gcmV1c2UgdGhpcyBzd2FwX2luZm8gaW4gYWxsb2Nfc3dhcF9pbmZvKCkgc2FmZWx5LiAgSXQgaXMgb2sgdG8KKwkgKiBub3QgaG9sZCBwLT5sb2NrIGFmdGVyIHdlIGNsZWFyZWQgaXRzIFNXUF9XUklURU9LLgorCSAqLworCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKKwlwLT5mbGFncyA9IDA7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisKIAllcnIgPSAwOwogCWF0b21pY19pbmMoJnByb2NfcG9sbF9ldmVudCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jX3BvbGxfd2FpdCk7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDkwYzQwNzUuLmE5Yzc0YjQgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIH0KICNlbmRpZgogCi11bnNpZ25lZCBsb25nIHpvbmVfcmVjbGFpbWFibGVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB6b25lX3JlY2xhaW1hYmxlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lKQogewogCWludCBucjsKIApAQCAtMzMxNSwyNyArMzMxNSw2IEBACiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZ2RhdC0+a3N3YXBkX3dhaXQpOwogfQogCi0vKgotICogVGhlIHJlY2xhaW1hYmxlIGNvdW50IHdvdWxkIGJlIG1vc3RseSBhY2N1cmF0ZS4KLSAqIFRoZSBsZXNzIHJlY2xhaW1hYmxlIHBhZ2VzIG1heSBiZQotICogLSBtbG9ja2VkIHBhZ2VzLCB3aGljaCB3aWxsIGJlIG1vdmVkIHRvIHVuZXZpY3RhYmxlIGxpc3Qgd2hlbiBlbmNvdW50ZXJlZAotICogLSBtYXBwZWQgcGFnZXMsIHdoaWNoIG1heSByZXF1aXJlIHNldmVyYWwgdHJhdmVscyB0byBiZSByZWNsYWltZWQKLSAqIC0gZGlydHkgcGFnZXMsIHdoaWNoIGlzIG5vdCAiaW5zdGFudGx5IiByZWNsYWltYWJsZQotICovCi11bnNpZ25lZCBsb25nIGdsb2JhbF9yZWNsYWltYWJsZV9wYWdlcyh2b2lkKQotewotCWludCBucjsKLQotCW5yID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQUNUSVZFX0ZJTEUpICsKLQkgICAgIGdsb2JhbF9wYWdlX3N0YXRlKE5SX0lOQUNUSVZFX0ZJTEUpOwotCi0JaWYgKGdldF9ucl9zd2FwX3BhZ2VzKCkgPiAwKQotCQluciArPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfQU5PTikgKwotCQkgICAgICBnbG9iYWxfcGFnZV9zdGF0ZShOUl9JTkFDVElWRV9BTk9OKTsKLQotCXJldHVybiBucjsKLX0KLQogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogLyoKICAqIFRyeSB0byBmcmVlIGBucl90b19yZWNsYWltJyBvZiBtZW1vcnksIHN5c3RlbS13aWRlLCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YKZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggNzI0OTYxNC4uZGVmNWRkMiAxMDA2NDQKLS0tIGEvbW0vdm1zdGF0LmMKKysrIGIvbW0vdm1zdGF0LmMKQEAgLTg1MSwxMiArODUxLDE0IEBACiAJInRocF96ZXJvX3BhZ2VfYWxsb2MiLAogCSJ0aHBfemVyb19wYWdlX2FsbG9jX2ZhaWxlZCIsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfVExCRkxVU0gKICNpZmRlZiBDT05GSUdfU01QCiAJIm5yX3RsYl9yZW1vdGVfZmx1c2giLAogCSJucl90bGJfcmVtb3RlX2ZsdXNoX3JlY2VpdmVkIiwKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAkibnJfdGxiX2xvY2FsX2ZsdXNoX2FsbCIsCiAJIm5yX3RsYl9sb2NhbF9mbHVzaF9vbmUiLAorI2VuZGlmIC8qIENPTkZJR19ERUJVR19UTEJGTFVTSCAqLwogCiAjZW5kaWYgLyogQ09ORklHX1ZNX0VWRU5UU19DT1VOVEVSUyAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96c21hbGxvYy96c21hbGxvYy1tYWluLmMgYi9tbS96c21hbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy96c21hbGxvYy96c21hbGxvYy1tYWluLmMKcmVuYW1lIHRvIG1tL3pzbWFsbG9jLmMKaW5kZXggNzY2MGM4Ny4uYzAzY2E1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pzbWFsbG9jL3pzbWFsbG9jLW1haW4uYworKysgYi9tbS96c21hbGxvYy5jCkBAIC0yLDYgKzIsNyBAQAogICogenNtYWxsb2MgbWVtb3J5IGFsbG9jYXRvcgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSAgTml0aW4gR3VwdGEKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyBNaW5jaGFuIEtpbQogICoKICAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAogICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KQEAgLTkwLDggKzkxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaW5jbHVkZSAienNtYWxsb2MuaCIKKyNpbmNsdWRlIDxsaW51eC96c21hbGxvYy5oPgogCiAvKgogICogVGhpcyBtdXN0IGJlIHBvd2VyIG9mIDIgYW5kIGdyZWF0ZXIgdGhhbiBvZiBlcXVhbCB0byBzaXplb2YobGlua19mcmVlKS4KZGlmZiAtLWdpdCBhL25ldC85cC9jbGllbnQuYyBiL25ldC85cC9jbGllbnQuYwppbmRleCBhNWU0ZDJkLi45MTg2NTUwIDEwMDY0NAotLS0gYS9uZXQvOXAvY2xpZW50LmMKKysrIGIvbmV0LzlwL2NsaWVudC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdHJ1Y3QgcDlfZmNhbGwgKnA5X2ZjYWxsX2FsbG9jKGludCBhbGxvY19tc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgcDlfZmNhbGwgKnA5X2ZjYWxsX2FsbG9jKGludCBhbGxvY19tc2l6ZSkKIHsKIAlzdHJ1Y3QgcDlfZmNhbGwgKmZjOwogCWZjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHA5X2ZjYWxsKSArIGFsbG9jX21zaXplLCBHRlBfTk9GUyk7CmRpZmYgLS1naXQgYS9uZXQvOXAvdHJhbnNfdmlydGlvLmMgYi9uZXQvOXAvdHJhbnNfdmlydGlvLmMKaW5kZXggY2QxZTFlZC4uYWMyNjY2YyAxMDA2NDQKLS0tIGEvbmV0LzlwL3RyYW5zX3ZpcnRpby5jCisrKyBiL25ldC85cC90cmFuc192aXJ0aW8uYwpAQCAtMzQwLDcgKzM0MCwxMCBAQAogCQlpbnQgY291bnQgPSBucl9wYWdlczsKIAkJd2hpbGUgKG5yX3BhZ2VzKSB7CiAJCQlzID0gcmVzdF9vZl9wYWdlKGRhdGEpOwotCQkJcGFnZXNbaW5kZXgrK10gPSBrbWFwX3RvX3BhZ2UoZGF0YSk7CisJCQlpZiAoaXNfdm1hbGxvY19hZGRyKGRhdGEpKQorCQkJCXBhZ2VzW2luZGV4KytdID0gdm1hbGxvY190b19wYWdlKGRhdGEpOworCQkJZWxzZQorCQkJCXBhZ2VzW2luZGV4KytdID0ga21hcF90b19wYWdlKGRhdGEpOwogCQkJZGF0YSArPSBzOwogCQkJbnJfcGFnZXMtLTsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggZTQ0MDFhNS4uNjNmMDQ1NSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC0xODcsOCArMTg3LDcgQEAKIAogCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwogCWlmICghZXRoZXJfYWRkcl9lcXVhbChkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhKSkgewotCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCQlicl9mZGJfY2hhbmdlX21hY19hZGRyZXNzKGJyLCBhZGRyLT5zYV9kYXRhKTsKKwkJLyogTWFjIGFkZHJlc3Mgd2lsbCBiZSBjaGFuZ2VkIGluIGJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKCkuICovCiAJCWJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKGJyLCBhZGRyLT5zYV9kYXRhKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKQEAgLTIyNiwzNyArMjI1LDExIEBACiAJCWJyX25ldHBvbGxfZGlzYWJsZShwKTsKIH0KIAotc3RhdGljIGludCBicl9uZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRwb2xsX2luZm8gKm5pLAotCQkJICAgIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7Ci0JaW50IGVyciA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7Ci0JCWlmICghcC0+ZGV2KQotCQkJY29udGludWU7Ci0JCWVyciA9IGJyX25ldHBvbGxfZW5hYmxlKHAsIGdmcCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGZhaWw7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIGVycjsKLQotZmFpbDoKLQlicl9uZXRwb2xsX2NsZWFudXAoZGV2KTsKLQlnb3RvIG91dDsKLX0KLQotaW50IGJyX25ldHBvbGxfZW5hYmxlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGdmcF90IGdmcCkKK3N0YXRpYyBpbnQgX19icl9uZXRwb2xsX2VuYWJsZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IG5ldHBvbGwgKm5wOwogCWludCBlcnI7CiAKLQlpZiAoIXAtPmJyLT5kZXYtPm5waW5mbykKLQkJcmV0dXJuIDA7Ci0KIAlucCA9IGt6YWxsb2Moc2l6ZW9mKCpwLT5ucCksIGdmcCk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNzEsNiArMjQ0LDM3IEBACiAJcmV0dXJuIGVycjsKIH0KIAoraW50IGJyX25ldHBvbGxfZW5hYmxlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGdmcF90IGdmcCkKK3sKKwlpZiAoIXAtPmJyLT5kZXYtPm5waW5mbykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gX19icl9uZXRwb2xsX2VuYWJsZShwLCBnZnApOworfQorCitzdGF0aWMgaW50IGJyX25ldHBvbGxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldHBvbGxfaW5mbyAqbmksCisJCQkgICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlpbnQgZXJyID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFwLT5kZXYpCisJCQljb250aW51ZTsKKwkJZXJyID0gX19icl9uZXRwb2xsX2VuYWJsZShwLCBnZnApOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsOworCX0KKworb3V0OgorCXJldHVybiBlcnI7CisKK2ZhaWw6CisJYnJfbmV0cG9sbF9jbGVhbnVwKGRldik7CisJZ290byBvdXQ7Cit9CisKIHZvaWQgYnJfbmV0cG9sbF9kaXNhYmxlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCiB7CiAJc3RydWN0IG5ldHBvbGwgKm5wID0gcC0+bnA7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZkYi5jIGIvbmV0L2JyaWRnZS9icl9mZGIuYwppbmRleCBjNWY1YTRhLi45MjAzZDVhIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2ZkYi5jCisrKyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYnJfZmRiX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGJfZmluZChzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwKKwkJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJCQkgICAgIF9fdTE2IHZpZCk7CiBzdGF0aWMgaW50IGZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCiAJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpOwogc3RhdGljIHZvaWQgZmRiX25vdGlmeShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCkBAIC04OSwxMSArOTIsNTcgQEAKIAljYWxsX3JjdSgmZi0+cmN1LCBmZGJfcmN1X2ZyZWUpOwogfQogCisvKiBEZWxldGUgYSBsb2NhbCBlbnRyeSBpZiBubyBvdGhlciBwb3J0IGhhZCB0aGUgc2FtZSBhZGRyZXNzLiAqLworc3RhdGljIHZvaWQgZmRiX2RlbGV0ZV9sb2NhbChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkgICAgIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyID0gZi0+YWRkci5hZGRyOworCXUxNiB2aWQgPSBmLT52bGFuX2lkOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKm9wOworCisJLyogTWF5YmUgYW5vdGhlciBwb3J0IGhhcyBzYW1lIGh3IGFkZHI/ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKG9wICE9IHAgJiYgZXRoZXJfYWRkcl9lcXVhbChvcC0+ZGV2LT5kZXZfYWRkciwgYWRkcikgJiYKKwkJICAgICghdmlkIHx8IG5icF92bGFuX2ZpbmQob3AsIHZpZCkpKSB7CisJCQlmLT5kc3QgPSBvcDsKKwkJCWYtPmFkZGVkX2J5X3VzZXIgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogTWF5YmUgYnJpZGdlIGRldmljZSBoYXMgc2FtZSBodyBhZGRyPyAqLworCWlmIChwICYmIGV0aGVyX2FkZHJfZXF1YWwoYnItPmRldi0+ZGV2X2FkZHIsIGFkZHIpICYmCisJICAgICghdmlkIHx8IGJyX3ZsYW5fZmluZChiciwgdmlkKSkpIHsKKwkJZi0+ZHN0ID0gTlVMTDsKKwkJZi0+YWRkZWRfYnlfdXNlciA9IDA7CisJCXJldHVybjsKKwl9CisKKwlmZGJfZGVsZXRlKGJyLCBmKTsKK30KKwordm9pZCBicl9mZGJfZmluZF9kZWxldGVfbG9jYWwoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmYnItPmhhc2hbYnJfbWFjX2hhc2goYWRkciwgdmlkKV07CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOworCisJc3Bpbl9sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKKwlmID0gZmRiX2ZpbmQoaGVhZCwgYWRkciwgdmlkKTsKKwlpZiAoZiAmJiBmLT5pc19sb2NhbCAmJiAhZi0+YWRkZWRfYnlfdXNlciAmJiBmLT5kc3QgPT0gcCkKKwkJZmRiX2RlbGV0ZV9sb2NhbChiciwgcCwgZik7CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworfQorCiB2b2lkIGJyX2ZkYl9jaGFuZ2VhZGRyKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld2FkZHIpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gcC0+YnI7Ci0JYm9vbCBub192bGFuID0gKG5icF9nZXRfdmxhbl9pbmZvKHApID09IE5VTEwpID8gdHJ1ZSA6IGZhbHNlOworCXN0cnVjdCBuZXRfcG9ydF92bGFucyAqcHYgPSBuYnBfZ2V0X3ZsYW5faW5mbyhwKTsKKwlib29sIG5vX3ZsYW4gPSAhcHY7CiAJaW50IGk7CisJdTE2IHZpZDsKIAogCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CiAKQEAgLTEwNCwzOCArMTUzLDM0IEBACiAJCQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmY7CiAKIAkJCWYgPSBobGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnksIGhsaXN0KTsKLQkJCWlmIChmLT5kc3QgPT0gcCAmJiBmLT5pc19sb2NhbCkgewotCQkJCS8qIG1heWJlIGFub3RoZXIgcG9ydCBoYXMgc2FtZSBodyBhZGRyPyAqLwotCQkJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKm9wOwotCQkJCXUxNiB2aWQgPSBmLT52bGFuX2lkOwotCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkob3AsICZici0+cG9ydF9saXN0LCBsaXN0KSB7Ci0JCQkJCWlmIChvcCAhPSBwICYmCi0JCQkJCSAgICBldGhlcl9hZGRyX2VxdWFsKG9wLT5kZXYtPmRldl9hZGRyLAotCQkJCQkJCSAgICAgZi0+YWRkci5hZGRyKSAmJgotCQkJCQkgICAgbmJwX3ZsYW5fZmluZChvcCwgdmlkKSkgewotCQkJCQkJZi0+ZHN0ID0gb3A7Ci0JCQkJCQlnb3RvIGluc2VydDsKLQkJCQkJfQotCQkJCX0KLQorCQkJaWYgKGYtPmRzdCA9PSBwICYmIGYtPmlzX2xvY2FsICYmICFmLT5hZGRlZF9ieV91c2VyKSB7CiAJCQkJLyogZGVsZXRlIG9sZCBvbmUgKi8KLQkJCQlmZGJfZGVsZXRlKGJyLCBmKTsKLWluc2VydDoKLQkJCQkvKiBpbnNlcnQgbmV3IGFkZHJlc3MsICBtYXkgZmFpbCBpZiBpbnZhbGlkCi0JCQkJICogYWRkcmVzcyBvciBkdXAuCi0JCQkJICovCi0JCQkJZmRiX2luc2VydChiciwgcCwgbmV3YWRkciwgdmlkKTsKKwkJCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBwLCBmKTsKIAogCQkJCS8qIGlmIHRoaXMgcG9ydCBoYXMgbm8gdmxhbiBpbmZvcm1hdGlvbgogCQkJCSAqIGNvbmZpZ3VyZWQsIHdlIGNhbiBzYWZlbHkgYmUgZG9uZSBhdAogCQkJCSAqIHRoaXMgcG9pbnQuCiAJCQkJICovCiAJCQkJaWYgKG5vX3ZsYW4pCi0JCQkJCWdvdG8gZG9uZTsKKwkJCQkJZ290byBpbnNlcnQ7CiAJCQl9CiAJCX0KIAl9CiAKK2luc2VydDoKKwkvKiBpbnNlcnQgbmV3IGFkZHJlc3MsICBtYXkgZmFpbCBpZiBpbnZhbGlkIGFkZHJlc3Mgb3IgZHVwLiAqLworCWZkYl9pbnNlcnQoYnIsIHAsIG5ld2FkZHIsIDApOworCisJaWYgKG5vX3ZsYW4pCisJCWdvdG8gZG9uZTsKKworCS8qIE5vdyBhZGQgZW50cmllcyBmb3IgZXZlcnkgVkxBTiBjb25maWd1cmVkIG9uIHRoZSBwb3J0LgorCSAqIFRoaXMgZnVuY3Rpb24gcnVucyB1bmRlciBSVE5MIHNvIHRoZSBiaXRtYXAgd2lsbCBub3QgY2hhbmdlCisJICogZnJvbSB1bmRlciB1cy4KKwkgKi8KKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgcHYtPnZsYW5fYml0bWFwLCBWTEFOX05fVklEKQorCQlmZGJfaW5zZXJ0KGJyLCBwLCBuZXdhZGRyLCB2aWQpOworCiBkb25lOgogCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKIH0KQEAgLTE0NiwxMCArMTkxLDEyIEBACiAJc3RydWN0IG5ldF9wb3J0X3ZsYW5zICpwdjsKIAl1MTYgdmlkID0gMDsKIAorCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisKIAkvKiBJZiBvbGQgZW50cnkgd2FzIHVuYXNzb2NpYXRlZCB3aXRoIGFueSBwb3J0LCB0aGVuIGRlbGV0ZSBpdC4gKi8KIAlmID0gX19icl9mZGJfZ2V0KGJyLCBici0+ZGV2LT5kZXZfYWRkciwgMCk7CiAJaWYgKGYgJiYgZi0+aXNfbG9jYWwgJiYgIWYtPmRzdCkKLQkJZmRiX2RlbGV0ZShiciwgZik7CisJCWZkYl9kZWxldGVfbG9jYWwoYnIsIE5VTEwsIGYpOwogCiAJZmRiX2luc2VydChiciwgTlVMTCwgbmV3YWRkciwgMCk7CiAKQEAgLTE1OSwxNCArMjA2LDE2IEBACiAJICovCiAJcHYgPSBicl9nZXRfdmxhbl9pbmZvKGJyKTsKIAlpZiAoIXB2KQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJZm9yX2VhY2hfc2V0X2JpdF9mcm9tKHZpZCwgcHYtPnZsYW5fYml0bWFwLCBWTEFOX05fVklEKSB7CiAJCWYgPSBfX2JyX2ZkYl9nZXQoYnIsIGJyLT5kZXYtPmRldl9hZGRyLCB2aWQpOwogCQlpZiAoZiAmJiBmLT5pc19sb2NhbCAmJiAhZi0+ZHN0KQotCQkJZmRiX2RlbGV0ZShiciwgZik7CisJCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBOVUxMLCBmKTsKIAkJZmRiX2luc2VydChiciwgTlVMTCwgbmV3YWRkciwgdmlkKTsKIAl9CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwogfQogCiB2b2lkIGJyX2ZkYl9jbGVhbnVwKHVuc2lnbmVkIGxvbmcgX2RhdGEpCkBAIC0yMzUsMjUgKzI4NCwxMSBAQAogCiAJCQlpZiAoZi0+aXNfc3RhdGljICYmICFkb19hbGwpCiAJCQkJY29udGludWU7Ci0JCQkvKgotCQkJICogaWYgbXVsdGlwbGUgcG9ydHMgYWxsIGhhdmUgdGhlIHNhbWUgZGV2aWNlIGFkZHJlc3MKLQkJCSAqIHRoZW4gd2hlbiBvbmUgcG9ydCBpcyBkZWxldGVkLCBhc3NpZ24KLQkJCSAqIHRoZSBsb2NhbCBlbnRyeSB0byBvdGhlciBwb3J0Ci0JCQkgKi8KLQkJCWlmIChmLT5pc19sb2NhbCkgewotCQkJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKm9wOwotCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkob3AsICZici0+cG9ydF9saXN0LCBsaXN0KSB7Ci0JCQkJCWlmIChvcCAhPSBwICYmCi0JCQkJCSAgICBldGhlcl9hZGRyX2VxdWFsKG9wLT5kZXYtPmRldl9hZGRyLAotCQkJCQkJCSAgICAgZi0+YWRkci5hZGRyKSkgewotCQkJCQkJZi0+ZHN0ID0gb3A7Ci0JCQkJCQlnb3RvIHNraXBfZGVsZXRlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQogCi0JCQlmZGJfZGVsZXRlKGJyLCBmKTsKLQkJc2tpcF9kZWxldGU6IDsKKwkJCWlmIChmLT5pc19sb2NhbCkKKwkJCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBwLCBmKTsKKwkJCWVsc2UKKwkJCQlmZGJfZGVsZXRlKGJyLCBmKTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7CkBAIC0zOTcsNiArNDMyLDcgQEAKIAkJZmRiLT52bGFuX2lkID0gdmlkOwogCQlmZGItPmlzX2xvY2FsID0gMDsKIAkJZmRiLT5pc19zdGF0aWMgPSAwOworCQlmZGItPmFkZGVkX2J5X3VzZXIgPSAwOwogCQlmZGItPnVwZGF0ZWQgPSBmZGItPnVzZWQgPSBqaWZmaWVzOwogCQlobGlzdF9hZGRfaGVhZF9yY3UoJmZkYi0+aGxpc3QsIGhlYWQpOwogCX0KQEAgLTQ0Nyw3ICs0ODMsNyBAQAogfQogCiB2b2lkIGJyX2ZkYl91cGRhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpCisJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsIGJvb2wgYWRkZWRfYnlfdXNlcikKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZici0+aGFzaFticl9tYWNfaGFzaChhZGRyLCB2aWQpXTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKQEAgLTQ3MywxMyArNTA5LDE4IEBACiAJCQkvKiBmYXN0cGF0aDogdXBkYXRlIG9mIGV4aXN0aW5nIGVudHJ5ICovCiAJCQlmZGItPmRzdCA9IHNvdXJjZTsKIAkJCWZkYi0+dXBkYXRlZCA9IGppZmZpZXM7CisJCQlpZiAodW5saWtlbHkoYWRkZWRfYnlfdXNlcikpCisJCQkJZmRiLT5hZGRlZF9ieV91c2VyID0gMTsKIAkJfQogCX0gZWxzZSB7CiAJCXNwaW5fbG9jaygmYnItPmhhc2hfbG9jayk7CiAJCWlmIChsaWtlbHkoIWZkYl9maW5kKGhlYWQsIGFkZHIsIHZpZCkpKSB7CiAJCQlmZGIgPSBmZGJfY3JlYXRlKGhlYWQsIHNvdXJjZSwgYWRkciwgdmlkKTsKLQkJCWlmIChmZGIpCisJCQlpZiAoZmRiKSB7CisJCQkJaWYgKHVubGlrZWx5KGFkZGVkX2J5X3VzZXIpKQorCQkJCQlmZGItPmFkZGVkX2J5X3VzZXIgPSAxOwogCQkJCWZkYl9ub3RpZnkoYnIsIGZkYiwgUlRNX05FV05FSUdIKTsKKwkJCX0KIAkJfQogCQkvKiBlbHNlICB3ZSBsb3NlIHJhY2UgYW5kIHNvbWVvbmUgZWxzZSBpbnNlcnRzCiAJCSAqIGl0IGZpcnN0LCBkb24ndCBib3RoZXIgdXBkYXRpbmcKQEAgLTY0Nyw2ICs2ODgsNyBAQAogCiAJCW1vZGlmaWVkID0gdHJ1ZTsKIAl9CisJZmRiLT5hZGRlZF9ieV91c2VyID0gMTsKIAogCWZkYi0+dXNlZCA9IGppZmZpZXM7CiAJaWYgKG1vZGlmaWVkKSB7CkBAIC02NjQsNyArNzA2LDcgQEAKIAogCWlmIChuZG0tPm5kbV9mbGFncyAmIE5URl9VU0UpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlicl9mZGJfdXBkYXRlKHAtPmJyLCBwLCBhZGRyLCB2aWQpOworCQlicl9mZGJfdXBkYXRlKHAtPmJyLCBwLCBhZGRyLCB2aWQsIHRydWUpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9IGVsc2UgewogCQlzcGluX2xvY2tfYmgoJnAtPmJyLT5oYXNoX2xvY2spOwpAQCAtNzQ5LDggKzc5MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGZkYl9kZWxldGVfYnlfYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHU4ICphZGRyLAotCQkgICAgICAgdTE2IHZsYW4pCitzdGF0aWMgaW50IGZkYl9kZWxldGVfYnlfYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHU4ICphZGRyLCB1MTYgdmxhbikKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZici0+aGFzaFticl9tYWNfaGFzaChhZGRyLCB2bGFuKV07CiAJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggY2ZmZTFkNi4uNTRkMjA3ZCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMzg5LDYgKzM4OSw5IEBACiAJaWYgKGJyLT5kZXYtPm5lZWRlZF9oZWFkcm9vbSA8IGRldi0+bmVlZGVkX2hlYWRyb29tKQogCQlici0+ZGV2LT5uZWVkZWRfaGVhZHJvb20gPSBkZXYtPm5lZWRlZF9oZWFkcm9vbTsKIAorCWlmIChicl9mZGJfaW5zZXJ0KGJyLCBwLCBkZXYtPmRldl9hZGRyLCAwKSkKKwkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgaW5zZXJ0IGxvY2FsIGFkZHJlc3MgYnJpZGdlIGZvcndhcmRpbmcgdGFibGVcbiIpOworCiAJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CiAJY2hhbmdlZF9hZGRyID0gYnJfc3RwX3JlY2FsY3VsYXRlX2JyaWRnZV9pZChicik7CiAKQEAgLTQwNCw5ICs0MDcsNiBAQAogCiAJZGV2X3NldF9tdHUoYnItPmRldiwgYnJfbWluX210dShicikpOwogCi0JaWYgKGJyX2ZkYl9pbnNlcnQoYnIsIHAsIGRldi0+ZGV2X2FkZHIsIDApKQotCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCBpbnNlcnQgbG9jYWwgYWRkcmVzcyBicmlkZ2UgZm9yd2FyZGluZyB0YWJsZVxuIik7Ci0KIAlrb2JqZWN0X3VldmVudCgmcC0+a29iaiwgS09CSl9BREQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggYmY4ZGM3ZC4uMjhkNTQ0NiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtNzcsNyArNzcsNyBAQAogCS8qIGluc2VydCBpbnRvIGZvcndhcmRpbmcgZGF0YWJhc2UgYWZ0ZXIgZmlsdGVyaW5nIHRvIGF2b2lkIHNwb29maW5nICovCiAJYnIgPSBwLT5icjsKIAlpZiAocC0+ZmxhZ3MgJiBCUl9MRUFSTklORykKLQkJYnJfZmRiX3VwZGF0ZShiciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgdmlkKTsKKwkJYnJfZmRiX3VwZGF0ZShiciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgdmlkLCBmYWxzZSk7CiAKIAlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmCiAJICAgIGJyX211bHRpY2FzdF9yY3YoYnIsIHAsIHNrYiwgdmlkKSkKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAJYnJfdmxhbl9nZXRfdGFnKHNrYiwgJnZpZCk7CiAJaWYgKHAtPmZsYWdzICYgQlJfTEVBUk5JTkcpCi0JCWJyX2ZkYl91cGRhdGUocC0+YnIsIHAsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIHZpZCk7CisJCWJyX2ZkYl91cGRhdGUocC0+YnIsIHAsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIHZpZCwgZmFsc2UpOwogCXJldHVybiAwOwkgLyogcHJvY2VzcyBmdXJ0aGVyICovCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKaW5kZXggZmNkMTIzMy4uM2JhMTFiYyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCW1hY19hZGRyCQkJYWRkcjsKIAl1bnNpZ25lZCBjaGFyCQkJaXNfbG9jYWw7CiAJdW5zaWduZWQgY2hhcgkJCWlzX3N0YXRpYzsKKwl1bnNpZ25lZCBjaGFyCQkJYWRkZWRfYnlfdXNlcjsKIAlfX3UxNgkJCQl2bGFuX2lkOwogfTsKIApAQCAtMzcwLDYgKzM3MSw5IEBACiBpbnQgYnJfZmRiX2luaXQodm9pZCk7CiB2b2lkIGJyX2ZkYl9maW5pKHZvaWQpOwogdm9pZCBicl9mZGJfZmx1c2goc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK3ZvaWQgYnJfZmRiX2ZpbmRfZGVsZXRlX2xvY2FsKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKTsKIHZvaWQgYnJfZmRiX2NoYW5nZWFkZHIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3YWRkcik7CiB2b2lkIGJyX2ZkYl9jaGFuZ2VfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBjb25zdCB1OCAqbmV3YWRkcik7CiB2b2lkIGJyX2ZkYl9jbGVhbnVwKHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTM4Myw4ICszODcsNyBAQAogaW50IGJyX2ZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCiAJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCk7CiB2b2lkIGJyX2ZkYl91cGRhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpOwotaW50IGZkYl9kZWxldGVfYnlfYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHU4ICphZGRyLCB1MTYgdmlkKTsKKwkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwgYm9vbCBhZGRlZF9ieV91c2VyKTsKIAogaW50IGJyX2ZkYl9kZWxldGUoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCiAJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CkBAIC01ODQsNiArNTg3LDcgQEAKIGludCBicl92bGFuX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHUxNiB2aWQsIHUxNiBmbGFncyk7CiBpbnQgYnJfdmxhbl9kZWxldGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MTYgdmlkKTsKIHZvaWQgYnJfdmxhbl9mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOworYm9vbCBicl92bGFuX2ZpbmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MTYgdmlkKTsKIGludCBicl92bGFuX2ZpbHRlcl90b2dnbGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCk7CiBpbnQgbmJwX3ZsYW5fYWRkKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQsIHUxNiBmbGFncyk7CiBpbnQgbmJwX3ZsYW5fZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQpOwpAQCAtNjY1LDYgKzY2OSwxMSBAQAogewogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgYnJfdmxhbl9maW5kKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdTE2IHZpZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG5icF92bGFuX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLCB1MTYgZmxhZ3MpCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKaW5kZXggNjU2YTZmMy4uMTg5YmExZSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCkBAIC0xOTQsNiArMTk0LDggQEAKIAogCXdhc3Jvb3QgPSBicl9pc19yb290X2JyaWRnZShicik7CiAKKwlicl9mZGJfY2hhbmdlX21hY19hZGRyZXNzKGJyLCBhZGRyKTsKKwogCW1lbWNweShvbGRhZGRyLCBici0+YnJpZGdlX2lkLmFkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoYnItPmJyaWRnZV9pZC5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KGJyLT5kZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ZsYW4uYyBiL25ldC9icmlkZ2UvYnJfdmxhbi5jCmluZGV4IDRjYTRkMGEuLjgyNDljYTcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfdmxhbi5jCisrKyBiL25ldC9icmlkZ2UvYnJfdmxhbi5jCkBAIC0yNzUsOSArMjc1LDcgQEAKIAlpZiAoIXB2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0JZmRiX2RlbGV0ZV9ieV9hZGRyKGJyLCBici0+ZGV2LT5kZXZfYWRkciwgdmlkKTsKLQlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJYnJfZmRiX2ZpbmRfZGVsZXRlX2xvY2FsKGJyLCBOVUxMLCBici0+ZGV2LT5kZXZfYWRkciwgdmlkKTsKIAogCV9fdmxhbl9kZWwocHYsIHZpZCk7CiAJcmV0dXJuIDA7CkBAIC0yOTUsNiArMjkzLDI1IEBACiAJX192bGFuX2ZsdXNoKHB2KTsKIH0KIAorYm9vbCBicl92bGFuX2ZpbmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MTYgdmlkKQoreworCXN0cnVjdCBuZXRfcG9ydF92bGFucyAqcHY7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJcmN1X3JlYWRfbG9jaygpOworCXB2ID0gcmN1X2RlcmVmZXJlbmNlKGJyLT52bGFuX2luZm8pOworCisJaWYgKCFwdikKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQodmlkLCBwdi0+dmxhbl9iaXRtYXApKQorCQlmb3VuZCA9IHRydWU7CisKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKIGludCBicl92bGFuX2ZpbHRlcl90b2dnbGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlpZiAoIXJ0bmxfdHJ5bG9jaygpKQpAQCAtMzU5LDkgKzM3Niw3IEBACiAJaWYgKCFwdikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfYmgoJnBvcnQtPmJyLT5oYXNoX2xvY2spOwotCWZkYl9kZWxldGVfYnlfYWRkcihwb3J0LT5iciwgcG9ydC0+ZGV2LT5kZXZfYWRkciwgdmlkKTsKLQlzcGluX3VubG9ja19iaCgmcG9ydC0+YnItPmhhc2hfbG9jayk7CisJYnJfZmRiX2ZpbmRfZGVsZXRlX2xvY2FsKHBvcnQtPmJyLCBwb3J0LCBwb3J0LT5kZXYtPmRldl9hZGRyLCB2aWQpOwogCiAJcmV0dXJuIF9fdmxhbl9kZWwocHYsIHZpZCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jYWlmX2Rldi5jIGIvbmV0L2NhaWYvY2FpZl9kZXYuYwppbmRleCA0ZGNhMTU5Li5lZGJjYTQ2IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jYWlmX2Rldi5jCisrKyBiL25ldC9jYWlmL2NhaWZfZGV2LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX2xheWVyLmg+CisjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9kZXYuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZnBrdC5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NmY25mZy5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2Nmc2VybC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2ZzcnZsLmMgYi9uZXQvY2FpZi9jZnNydmwuYwppbmRleCAzNTNmNzkzLi5hNmUxMTU0IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnNydmwuYworKysgYi9uZXQvY2FpZi9jZnNydmwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfbGF5ZXIuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZnNydmwuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZnBrdC5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfZGV2Lmg+CiAKICNkZWZpbmUgU1JWTF9DVFJMX1BLVF9TSVpFIDEKICNkZWZpbmUgU1JWTF9GTE9XX09GRiAweDgxCmRpZmYgLS1naXQgYS9uZXQvY2FuL2FmX2Nhbi5jIGIvbmV0L2Nhbi9hZl9jYW4uYwppbmRleCBkMjQ5ODc0Li5hMjdmOGFhIDEwMDY0NAotLS0gYS9uZXQvY2FuL2FmX2Nhbi5jCisrKyBiL25ldC9jYW4vYWZfY2FuLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4uaD4KICNpbmNsdWRlIDxsaW51eC9jYW4vY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9za2IuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0yOTAsNyArMjkxLDcgQEAKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAotCQkJbmV3c2tiLT5zayA9IHNrYi0+c2s7CisJCQljYW5fc2tiX3NldF9vd25lcihuZXdza2IsIHNrYi0+c2spOwogCQkJbmV3c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCW5ld3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvY2FuL2JjbS5jIGIvbmV0L2Nhbi9iY20uYwppbmRleCAzZmM3MzdiLi5kY2I3NWMwIDEwMDY0NAotLS0gYS9uZXQvY2FuL2JjbS5jCisrKyBiL25ldC9jYW4vYmNtLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCiAJLyogc2VuZCB3aXRoIGxvb3BiYWNrICovCiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5zayA9IG9wLT5zazsKKwljYW5fc2tiX3NldF9vd25lcihza2IsIG9wLT5zayk7CiAJY2FuX3NlbmQoc2tiLCAxKTsKIAogCS8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogCiAJY2FuX3NrYl9wcnYoc2tiKS0+aWZpbmRleCA9IGRldi0+aWZpbmRleDsKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPnNrICA9IHNrOworCWNhbl9za2Jfc2V0X293bmVyKHNrYiwgc2spOwogCWVyciA9IGNhbl9zZW5kKHNrYiwgMSk7IC8qIHNlbmQgd2l0aCBsb29wYmFjayAqLwogCWRldl9wdXQoZGV2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9yYXcuYyBiL25ldC9jYW4vcmF3LmMKaW5kZXggMDdkNzJkOC4uOGJlNzU3YyAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9yYXcuYworKysgYi9uZXQvY2FuL3Jhdy5jCkBAIC03MTUsNiArNzE1LDcgQEAKIAogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+c2sgID0gc2s7CisJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKIAogCWVyciA9IGNhbl9zZW5kKHNrYiwgcm8tPmxvb3BiYWNrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvbWVzc2VuZ2VyLmMgYi9uZXQvY2VwaC9tZXNzZW5nZXIuYwppbmRleCAyZWQxMzA0Li4zMGVmYzVjIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9tZXNzZW5nZXIuYworKysgYi9uZXQvY2VwaC9tZXNzZW5nZXIuYwpAQCAtNzc4LDEzICs3NzgsMTIgQEAKIAogCWJpbyA9IGRhdGEtPmJpbzsKIAlCVUdfT04oIWJpbyk7Ci0JQlVHX09OKCFiaW8tPmJpX3ZjbnQpOwogCiAJY3Vyc29yLT5yZXNpZCA9IG1pbihsZW5ndGgsIGRhdGEtPmJpb19sZW5ndGgpOwogCWN1cnNvci0+YmlvID0gYmlvOwotCWN1cnNvci0+dmVjdG9yX2luZGV4ID0gMDsKLQljdXJzb3ItPnZlY3Rvcl9vZmZzZXQgPSAwOwotCWN1cnNvci0+bGFzdF9waWVjZSA9IGxlbmd0aCA8PSBiaW8tPmJpX2lvX3ZlY1swXS5idl9sZW47CisJY3Vyc29yLT5idmVjX2l0ZXIgPSBiaW8tPmJpX2l0ZXI7CisJY3Vyc29yLT5sYXN0X3BpZWNlID0KKwkJY3Vyc29yLT5yZXNpZCA8PSBiaW9faXRlcl9sZW4oYmlvLCBjdXJzb3ItPmJ2ZWNfaXRlcik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2VwaF9tc2dfZGF0YV9iaW9fbmV4dChzdHJ1Y3QgY2VwaF9tc2dfZGF0YV9jdXJzb3IgKmN1cnNvciwKQEAgLTc5Myw3MSArNzkyLDY3IEBACiB7CiAJc3RydWN0IGNlcGhfbXNnX2RhdGEgKmRhdGEgPSBjdXJzb3ItPmRhdGE7CiAJc3RydWN0IGJpbyAqYmlvOwotCXN0cnVjdCBiaW9fdmVjICpiaW9fdmVjOwotCXVuc2lnbmVkIGludCBpbmRleDsKKwlzdHJ1Y3QgYmlvX3ZlYyBiaW9fdmVjOwogCiAJQlVHX09OKGRhdGEtPnR5cGUgIT0gQ0VQSF9NU0dfREFUQV9CSU8pOwogCiAJYmlvID0gY3Vyc29yLT5iaW87CiAJQlVHX09OKCFiaW8pOwogCi0JaW5kZXggPSBjdXJzb3ItPnZlY3Rvcl9pbmRleDsKLQlCVUdfT04oaW5kZXggPj0gKHVuc2lnbmVkIGludCkgYmlvLT5iaV92Y250KTsKKwliaW9fdmVjID0gYmlvX2l0ZXJfaW92ZWMoYmlvLCBjdXJzb3ItPmJ2ZWNfaXRlcik7CiAKLQliaW9fdmVjID0gJmJpby0+YmlfaW9fdmVjW2luZGV4XTsKLQlCVUdfT04oY3Vyc29yLT52ZWN0b3Jfb2Zmc2V0ID49IGJpb192ZWMtPmJ2X2xlbik7Ci0JKnBhZ2Vfb2Zmc2V0ID0gKHNpemVfdCkgKGJpb192ZWMtPmJ2X29mZnNldCArIGN1cnNvci0+dmVjdG9yX29mZnNldCk7CisJKnBhZ2Vfb2Zmc2V0ID0gKHNpemVfdCkgYmlvX3ZlYy5idl9vZmZzZXQ7CiAJQlVHX09OKCpwYWdlX29mZnNldCA+PSBQQUdFX1NJWkUpOwogCWlmIChjdXJzb3ItPmxhc3RfcGllY2UpIC8qIHBhZ2VsaXN0IG9mZnNldCBpcyBhbHdheXMgMCAqLwogCQkqbGVuZ3RoID0gY3Vyc29yLT5yZXNpZDsKIAllbHNlCi0JCSpsZW5ndGggPSAoc2l6ZV90KSAoYmlvX3ZlYy0+YnZfbGVuIC0gY3Vyc29yLT52ZWN0b3Jfb2Zmc2V0KTsKKwkJKmxlbmd0aCA9IChzaXplX3QpIGJpb192ZWMuYnZfbGVuOwogCUJVR19PTigqbGVuZ3RoID4gY3Vyc29yLT5yZXNpZCk7CiAJQlVHX09OKCpwYWdlX29mZnNldCArICpsZW5ndGggPiBQQUdFX1NJWkUpOwogCi0JcmV0dXJuIGJpb192ZWMtPmJ2X3BhZ2U7CisJcmV0dXJuIGJpb192ZWMuYnZfcGFnZTsKIH0KIAogc3RhdGljIGJvb2wgY2VwaF9tc2dfZGF0YV9iaW9fYWR2YW5jZShzdHJ1Y3QgY2VwaF9tc2dfZGF0YV9jdXJzb3IgKmN1cnNvciwKIAkJCQkJc2l6ZV90IGJ5dGVzKQogewogCXN0cnVjdCBiaW8gKmJpbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYmlvX3ZlYzsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7CisJc3RydWN0IGJpb192ZWMgYmlvX3ZlYzsKIAogCUJVR19PTihjdXJzb3ItPmRhdGEtPnR5cGUgIT0gQ0VQSF9NU0dfREFUQV9CSU8pOwogCiAJYmlvID0gY3Vyc29yLT5iaW87CiAJQlVHX09OKCFiaW8pOwogCi0JaW5kZXggPSBjdXJzb3ItPnZlY3Rvcl9pbmRleDsKLQlCVUdfT04oaW5kZXggPj0gKHVuc2lnbmVkIGludCkgYmlvLT5iaV92Y250KTsKLQliaW9fdmVjID0gJmJpby0+YmlfaW9fdmVjW2luZGV4XTsKKwliaW9fdmVjID0gYmlvX2l0ZXJfaW92ZWMoYmlvLCBjdXJzb3ItPmJ2ZWNfaXRlcik7CiAKIAkvKiBBZHZhbmNlIHRoZSBjdXJzb3Igb2Zmc2V0ICovCiAKIAlCVUdfT04oY3Vyc29yLT5yZXNpZCA8IGJ5dGVzKTsKIAljdXJzb3ItPnJlc2lkIC09IGJ5dGVzOwotCWN1cnNvci0+dmVjdG9yX29mZnNldCArPSBieXRlczsKLQlpZiAoY3Vyc29yLT52ZWN0b3Jfb2Zmc2V0IDwgYmlvX3ZlYy0+YnZfbGVuKQorCisJYmlvX2FkdmFuY2VfaXRlcihiaW8sICZjdXJzb3ItPmJ2ZWNfaXRlciwgYnl0ZXMpOworCisJaWYgKGJ5dGVzIDwgYmlvX3ZlYy5idl9sZW4pCiAJCXJldHVybiBmYWxzZTsJLyogbW9yZSBieXRlcyB0byBwcm9jZXNzIGluIHRoaXMgc2VnbWVudCAqLwotCUJVR19PTihjdXJzb3ItPnZlY3Rvcl9vZmZzZXQgIT0gYmlvX3ZlYy0+YnZfbGVuKTsKIAogCS8qIE1vdmUgb24gdG8gdGhlIG5leHQgc2VnbWVudCwgYW5kIHBvc3NpYmx5IHRoZSBuZXh0IGJpbyAqLwogCi0JaWYgKCsraW5kZXggPT0gKHVuc2lnbmVkIGludCkgYmlvLT5iaV92Y250KSB7CisJaWYgKCFjdXJzb3ItPmJ2ZWNfaXRlci5iaV9zaXplKSB7CiAJCWJpbyA9IGJpby0+YmlfbmV4dDsKLQkJaW5kZXggPSAwOworCQljdXJzb3ItPmJpbyA9IGJpbzsKKwkJaWYgKGJpbykKKwkJCWN1cnNvci0+YnZlY19pdGVyID0gYmlvLT5iaV9pdGVyOworCQllbHNlCisJCQltZW1zZXQoJmN1cnNvci0+YnZlY19pdGVyLCAwLAorCQkJICAgICAgIHNpemVvZihjdXJzb3ItPmJ2ZWNfaXRlcikpOwogCX0KLQljdXJzb3ItPmJpbyA9IGJpbzsKLQljdXJzb3ItPnZlY3Rvcl9pbmRleCA9IGluZGV4OwotCWN1cnNvci0+dmVjdG9yX29mZnNldCA9IDA7CiAKIAlpZiAoIWN1cnNvci0+bGFzdF9waWVjZSkgewogCQlCVUdfT04oIWN1cnNvci0+cmVzaWQpOwogCQlCVUdfT04oIWJpbyk7CiAJCS8qIEEgc2hvcnQgcmVhZCBpcyBPSywgc28gdXNlIDw9IHJhdGhlciB0aGFuID09ICovCi0JCWlmIChjdXJzb3ItPnJlc2lkIDw9IGJpby0+YmlfaW9fdmVjW2luZGV4XS5idl9sZW4pCisJCWlmIChjdXJzb3ItPnJlc2lkIDw9IGJpb19pdGVyX2xlbihiaW8sIGN1cnNvci0+YnZlY19pdGVyKSkKIAkJCWN1cnNvci0+bGFzdF9waWVjZSA9IHRydWU7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMgYi9uZXQvY2VwaC9vc2RfY2xpZW50LmMKaW5kZXggMDEwZmYzYi4uMDY3NmYyYiAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvb3NkX2NsaWVudC5jCisrKyBiL25ldC9jZXBoL29zZF9jbGllbnQuYwpAQCAtMTQyNyw2ICsxNDI3LDQwIEBACiB9CiAKIC8qCisgKiBDYWxsZXIgc2hvdWxkIGhvbGQgbWFwX3NlbSBmb3IgcmVhZCBhbmQgcmVxdWVzdF9tdXRleC4KKyAqLworc3RhdGljIGludCBfX2NlcGhfb3NkY19zdGFydF9yZXF1ZXN0KHN0cnVjdCBjZXBoX29zZF9jbGllbnQgKm9zZGMsCisJCQkJICAgICBzdHJ1Y3QgY2VwaF9vc2RfcmVxdWVzdCAqcmVxLAorCQkJCSAgICAgYm9vbCBub2ZhaWwpCit7CisJaW50IHJjOworCisJX19yZWdpc3Rlcl9yZXF1ZXN0KG9zZGMsIHJlcSk7CisJcmVxLT5yX3NlbnQgPSAwOworCXJlcS0+cl9nb3RfcmVwbHkgPSAwOworCXJjID0gX19tYXBfcmVxdWVzdChvc2RjLCByZXEsIDApOworCWlmIChyYyA8IDApIHsKKwkJaWYgKG5vZmFpbCkgeworCQkJZG91dCgib3NkY19zdGFydF9yZXF1ZXN0IGZhaWxlZCBtYXAsICIKKwkJCQkiIHdpbGwgcmV0cnkgJWxsZFxuIiwgcmVxLT5yX3RpZCk7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlfX3VucmVnaXN0ZXJfcmVxdWVzdChvc2RjLCByZXEpOworCQl9CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAocmVxLT5yX29zZCA9PSBOVUxMKSB7CisJCWRvdXQoInNlbmRfcmVxdWVzdCAlcCBubyB1cCBvc2RzIGluIHBnXG4iLCByZXEpOworCQljZXBoX21vbmNfcmVxdWVzdF9uZXh0X29zZG1hcCgmb3NkYy0+Y2xpZW50LT5tb25jKTsKKwl9IGVsc2UgeworCQlfX3NlbmRfcXVldWVkKG9zZGMpOworCX0KKworCXJldHVybiAwOworfQorCisvKgogICogVGltZW91dCBjYWxsYmFjaywgY2FsbGVkIGV2ZXJ5IE4gc2Vjb25kcyB3aGVuIDEgb3IgbW9yZSBvc2QKICAqIHJlcXVlc3RzIGhhcyBiZWVuIGFjdGl2ZSBmb3IgbW9yZSB0aGFuIE4gc2Vjb25kcy4gIFdoZW4gdGhpcwogICogaGFwcGVucywgd2UgcGluZyBhbGwgT1NEcyB3aXRoIHJlcXVlc3RzIHdobyBoYXZlIHRpbWVkIG91dCB0bwpAQCAtMTY1Myw2ICsxNjg3LDcgQEAKIAlvc2RtYXBfZXBvY2ggPSBjZXBoX2RlY29kZV8zMigmcCk7CiAKIAkvKiBsb29rdXAgKi8KKwlkb3duX3JlYWQoJm9zZGMtPm1hcF9zZW0pOwogCW11dGV4X2xvY2soJm9zZGMtPnJlcXVlc3RfbXV0ZXgpOwogCXJlcSA9IF9fbG9va3VwX3JlcXVlc3Qob3NkYywgdGlkKTsKIAlpZiAocmVxID09IE5VTEwpIHsKQEAgLTE3MDksNyArMTc0NCw2IEBACiAJCWRvdXQoInJlZGlyZWN0IHBvb2wgJWxsZFxuIiwgcmVkaXIub2xvYy5wb29sKTsKIAogCQlfX3VucmVnaXN0ZXJfcmVxdWVzdChvc2RjLCByZXEpOwotCQltdXRleF91bmxvY2soJm9zZGMtPnJlcXVlc3RfbXV0ZXgpOwogCiAJCXJlcS0+cl90YXJnZXRfb2xvYyA9IHJlZGlyLm9sb2M7IC8qIHN0cnVjdCAqLwogCkBAIC0xNzIxLDEwICsxNzU1LDEwIEBACiAJCSAqIHN1Y2Nlc3NmdWxseS4gIEluIHRoZSBmdXR1cmUgd2UgbWlnaHQgd2FudCB0byBmb2xsb3cKIAkJICogb3JpZ2luYWwgcmVxdWVzdCdzIG5vZmFpbCBzZXR0aW5nIGhlcmUuCiAJCSAqLwotCQllcnIgPSBjZXBoX29zZGNfc3RhcnRfcmVxdWVzdChvc2RjLCByZXEsIHRydWUpOworCQllcnIgPSBfX2NlcGhfb3NkY19zdGFydF9yZXF1ZXN0KG9zZGMsIHJlcSwgdHJ1ZSk7CiAJCUJVR19PTihlcnIpOwogCi0JCWdvdG8gZG9uZTsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWFscmVhZHlfY29tcGxldGVkID0gcmVxLT5yX2dvdF9yZXBseTsKQEAgLTE3NDIsOCArMTc3Niw3IEBACiAJCXJlcS0+cl9nb3RfcmVwbHkgPSAxOwogCX0gZWxzZSBpZiAoKGZsYWdzICYgQ0VQSF9PU0RfRkxBR19PTkRJU0spID09IDApIHsKIAkJZG91dCgiaGFuZGxlX3JlcGx5IHRpZCAlbGx1IGR1cCBhY2tcbiIsIHRpZCk7Ci0JCW11dGV4X3VubG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7Ci0JCWdvdG8gZG9uZTsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWRvdXQoImhhbmRsZV9yZXBseSB0aWQgJWxsdSBmbGFncyAlZFxuIiwgdGlkLCBmbGFncyk7CkBAIC0xNzU4LDYgKzE3OTEsNyBAQAogCQlfX3VucmVnaXN0ZXJfcmVxdWVzdChvc2RjLCByZXEpOwogCiAJbXV0ZXhfdW5sb2NrKCZvc2RjLT5yZXF1ZXN0X211dGV4KTsKKwl1cF9yZWFkKCZvc2RjLT5tYXBfc2VtKTsKIAogCWlmICghYWxyZWFkeV9jb21wbGV0ZWQpIHsKIAkJaWYgKHJlcS0+cl91bnNhZmVfY2FsbGJhY2sgJiYKQEAgLTE3NzUsMTAgKzE4MDksMTQgQEAKIAkJY29tcGxldGVfcmVxdWVzdChyZXEpOwogCX0KIAotZG9uZToKK291dDoKIAlkb3V0KCJyZXE9JXAgcmVxLT5yX2xpbmdlcj0lZFxuIiwgcmVxLCByZXEtPnJfbGluZ2VyKTsKIAljZXBoX29zZGNfcHV0X3JlcXVlc3QocmVxKTsKIAlyZXR1cm47CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7CisJdXBfcmVhZCgmb3NkYy0+bWFwX3NlbSk7CisJZ290byBvdXQ7CiAKIGJhZF9wdXQ6CiAJcmVxLT5yX3Jlc3VsdCA9IC1FSU87CkBAIC0xNzkxLDYgKzE4MjksNyBAQAogCWNlcGhfb3NkY19wdXRfcmVxdWVzdChyZXEpOwogYmFkX211dGV4OgogCW11dGV4X3VubG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7CisJdXBfcmVhZCgmb3NkYy0+bWFwX3NlbSk7CiBiYWQ6CiAJcHJfZXJyKCJjb3JydXB0IG9zZF9vcF9yZXBseSBnb3QgJWQgJWRcbiIsCiAJICAgICAgIChpbnQpbXNnLT5mcm9udC5pb3ZfbGVuLCBsZTMyX3RvX2NwdShtc2ctPmhkci5mcm9udF9sZW4pKTsKQEAgLTIzNTEsMzQgKzIzOTAsMTYgQEAKIAkJCSAgICBzdHJ1Y3QgY2VwaF9vc2RfcmVxdWVzdCAqcmVxLAogCQkJICAgIGJvb2wgbm9mYWlsKQogewotCWludCByYyA9IDA7CisJaW50IHJjOwogCiAJZG93bl9yZWFkKCZvc2RjLT5tYXBfc2VtKTsKIAltdXRleF9sb2NrKCZvc2RjLT5yZXF1ZXN0X211dGV4KTsKLQlfX3JlZ2lzdGVyX3JlcXVlc3Qob3NkYywgcmVxKTsKLQlyZXEtPnJfc2VudCA9IDA7Ci0JcmVxLT5yX2dvdF9yZXBseSA9IDA7Ci0JcmMgPSBfX21hcF9yZXF1ZXN0KG9zZGMsIHJlcSwgMCk7Ci0JaWYgKHJjIDwgMCkgewotCQlpZiAobm9mYWlsKSB7Ci0JCQlkb3V0KCJvc2RjX3N0YXJ0X3JlcXVlc3QgZmFpbGVkIG1hcCwgIgotCQkJCSIgd2lsbCByZXRyeSAlbGxkXG4iLCByZXEtPnJfdGlkKTsKLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCV9fdW5yZWdpc3Rlcl9yZXF1ZXN0KG9zZGMsIHJlcSk7Ci0JCX0KLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQlpZiAocmVxLT5yX29zZCA9PSBOVUxMKSB7Ci0JCWRvdXQoInNlbmRfcmVxdWVzdCAlcCBubyB1cCBvc2RzIGluIHBnXG4iLCByZXEpOwotCQljZXBoX21vbmNfcmVxdWVzdF9uZXh0X29zZG1hcCgmb3NkYy0+Y2xpZW50LT5tb25jKTsKLQl9IGVsc2UgewotCQlfX3NlbmRfcXVldWVkKG9zZGMpOwotCX0KLQlyYyA9IDA7Ci1vdXRfdW5sb2NrOgorCisJcmMgPSBfX2NlcGhfb3NkY19zdGFydF9yZXF1ZXN0KG9zZGMsIHJlcSwgbm9mYWlsKTsKKwogCW11dGV4X3VubG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7CiAJdXBfcmVhZCgmb3NkYy0+bWFwX3NlbSk7CisKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKGNlcGhfb3NkY19zdGFydF9yZXF1ZXN0KTsKQEAgLTI1MDQsOSArMjUyNSwxMiBAQAogCWVyciA9IC1FTk9NRU07CiAJb3NkYy0+bm90aWZ5X3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNlcGgtd2F0Y2gtbm90aWZ5Iik7CiAJaWYgKCFvc2RjLT5ub3RpZnlfd3EpCi0JCWdvdG8gb3V0X21zZ3Bvb2w7CisJCWdvdG8gb3V0X21zZ3Bvb2xfcmVwbHk7CisKIAlyZXR1cm4gMDsKIAorb3V0X21zZ3Bvb2xfcmVwbHk6CisJY2VwaF9tc2dwb29sX2Rlc3Ryb3koJm9zZGMtPm1zZ3Bvb2xfb3BfcmVwbHkpOwogb3V0X21zZ3Bvb2w6CiAJY2VwaF9tc2dwb29sX2Rlc3Ryb3koJm9zZGMtPm1zZ3Bvb2xfb3ApOwogb3V0X21lbXBvb2w6CmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggZGQzMmUzNC4uZjUwMTYxZiAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtNzgwLDIxICs3ODAsMTYgQEAKIAlpZiAoZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKENPTVBBVF9VU0VfNjRCSVRfVElNRSkKLQkJcmV0dXJuIF9fc3lzX3JlY3ZtbXNnKGZkLCAoc3RydWN0IG1tc2doZHIgX191c2VyICopbW1zZywgdmxlbiwKLQkJCQkgICAgICBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCwKLQkJCQkgICAgICAoc3RydWN0IHRpbWVzcGVjICopIHRpbWVvdXQpOwotCiAJaWYgKHRpbWVvdXQgPT0gTlVMTCkKIAkJcmV0dXJuIF9fc3lzX3JlY3ZtbXNnKGZkLCAoc3RydWN0IG1tc2doZHIgX191c2VyICopbW1zZywgdmxlbiwKIAkJCQkgICAgICBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCwgTlVMTCk7CiAKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygma3RzcGVjLCB0aW1lb3V0KSkKKwlpZiAoY29tcGF0X2dldF90aW1lc3BlYygma3RzcGVjLCB0aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlkYXRhZ3JhbXMgPSBfX3N5c19yZWN2bW1zZyhmZCwgKHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqKW1tc2csIHZsZW4sCiAJCQkJICAgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQsICZrdHNwZWMpOwotCWlmIChkYXRhZ3JhbXMgPiAwICYmIHB1dF9jb21wYXRfdGltZXNwZWMoJmt0c3BlYywgdGltZW91dCkpCisJaWYgKGRhdGFncmFtcyA+IDAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygma3RzcGVjLCB0aW1lb3V0KSkKIAkJZGF0YWdyYW1zID0gLUVGQVVMVDsKIAogCXJldHVybiBkYXRhZ3JhbXM7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDM3MjFkYjcuLjRhZDFiNzggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0yODAzLDcgKzI4MDMsNyBAQAogICogICAgICB0aGUgQkggZW5hYmxlIGNvZGUgbXVzdCBoYXZlIElSUXMgZW5hYmxlZCBzbyB0aGF0IGl0IHdpbGwgbm90IGRlYWRsb2NrLgogICogICAgICAgICAgLS1CTEcKICAqLwotaW50IF9fZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqYWNjZWxfcHJpdikKK3N0YXRpYyBpbnQgX19kZXZfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICphY2NlbF9wcml2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CkBAIC00NjM3LDcgKzQ2MzcsNyBAQAogfQogRVhQT1JUX1NZTUJPTChuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXRfcmN1KTsKIAotaW50IG5ldGRldl9hZGphY2VudF9zeXNmc19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgbmV0ZGV2X2FkamFjZW50X3N5c2ZzX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmFkal9kZXYsCiAJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdCkKIHsKQEAgLTQ2NDcsNyArNDY0Nyw3IEBACiAJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKCYoZGV2LT5kZXYua29iaiksICYoYWRqX2Rldi0+ZGV2LmtvYmopLAogCQkJCSBsaW5rbmFtZSk7CiB9Ci12b2lkIG5ldGRldl9hZGphY2VudF9zeXNmc19kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIG5ldGRldl9hZGphY2VudF9zeXNmc19kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBjaGFyICpuYW1lLAogCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRldl9saXN0KQogewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmliX3J1bGVzLmMgYi9uZXQvY29yZS9maWJfcnVsZXMuYwppbmRleCBmNDA5ZTBiLi4xODVjMzQxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWJfcnVsZXMuYworKysgYi9uZXQvY29yZS9maWJfcnVsZXMuYwpAQCAtNzQ1LDYgKzc0NSwxMyBAQAogCQkJYXR0YWNoX3J1bGVzKCZvcHMtPnJ1bGVzX2xpc3QsIGRldik7CiAJCWJyZWFrOwogCisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZuZXQtPnJ1bGVzX29wcywgbGlzdCkgeworCQkJZGV0YWNoX3J1bGVzKCZvcHMtPnJ1bGVzX2xpc3QsIGRldik7CisJCQlhdHRhY2hfcnVsZXMoJm9wcy0+cnVsZXNfbGlzdCwgZGV2KTsKKwkJfQorCQlicmVhazsKKwogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmbmV0LT5ydWxlc19vcHMsIGxpc3QpCiAJCQlkZXRhY2hfcnVsZXMoJm9wcy0+cnVsZXNfbGlzdCwgZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBjMDNmM2RlLi5hNjY0Zjc4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC05NDgsNiArOTQ4LDcgQEAKIHsKIAljaGFyICpjdXI9b3B0LCAqZGVsaW07CiAJaW50IGlwdjY7CisJYm9vbCBpcHZlcnNpb25fc2V0ID0gZmFsc2U7CiAKIAlpZiAoKmN1ciAhPSAnQCcpIHsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICdAJykpID09IE5VTEwpCkBAIC05NjAsNiArOTYxLDcgQEAKIAljdXIrKzsKIAogCWlmICgqY3VyICE9ICcvJykgeworCQlpcHZlcnNpb25fc2V0ID0gdHJ1ZTsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICcvJykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKIAkJKmRlbGltID0gMDsKQEAgLTEwMDIsNyArMTAwNCw3IEBACiAJaXB2NiA9IG5ldHBvbGxfcGFyc2VfaXBfYWRkcihjdXIsICZucC0+cmVtb3RlX2lwKTsKIAlpZiAoaXB2NiA8IDApCiAJCWdvdG8gcGFyc2VfZmFpbGVkOwotCWVsc2UgaWYgKG5wLT5pcHY2ICE9IChib29sKWlwdjYpCisJZWxzZSBpZiAoaXB2ZXJzaW9uX3NldCAmJiBucC0+aXB2NiAhPSAoYm9vbClpcHY2KQogCQlnb3RvIHBhcnNlX2ZhaWxlZDsKIAllbHNlCiAJCW5wLT5pcHY2ID0gKGJvb2wpaXB2NjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggMzkzYjFiYy4uMDQ4ZGM4ZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTM3NCw3ICszNzQsNyBAQAogCWlmICghbWFzdGVyX2RldikKIAkJcmV0dXJuIDA7CiAJb3BzID0gbWFzdGVyX2Rldi0+cnRubF9saW5rX29wczsKLQlpZiAoIW9wcy0+Z2V0X3NsYXZlX3NpemUpCisJaWYgKCFvcHMgfHwgIW9wcy0+Z2V0X3NsYXZlX3NpemUpCiAJCXJldHVybiAwOwogCS8qIElGTEFfSU5GT19TTEFWRV9EQVRBICsgbmVzdGVkIGRhdGEgKi8KIAlyZXR1cm4gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBubGF0dHIpKSArCmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDhmNTE5ZGIuLjU5NzZlZjAgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC00Nyw2ICs0Nyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KQEAgLTIxMTksNyArMjEyMSw3IEBACiAvKioKICAqCXNrYl96ZXJvY29weSAtIFplcm8gY29weSBza2IgdG8gc2tiCiAgKglAdG86IGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJQHNvdXJjZTogc291cmNlIGJ1ZmZlcgorICoJQGZyb206IHNvdXJjZSBidWZmZXIKICAqCUBsZW46IG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gc291cmNlIGJ1ZmZlcgogICoJQGhsZW46IHNpemUgb2YgbGluZWFyIGhlYWRyb29tIGluIGRlc3RpbmF0aW9uIGJ1ZmZlcgogICoKQEAgLTM5MTYsMyArMzkxOCwyNiBAQAogCW5mX3Jlc2V0X3RyYWNlKHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza2Jfc2NydWJfcGFja2V0KTsKKworLyoqCisgKiBza2JfZ3NvX3RyYW5zcG9ydF9zZWdsZW4gLSBSZXR1cm4gbGVuZ3RoIG9mIGluZGl2aWR1YWwgc2VnbWVudHMgb2YgYSBnc28gcGFja2V0CisgKgorICogQHNrYjogR1NPIHNrYgorICoKKyAqIHNrYl9nc29fdHJhbnNwb3J0X3NlZ2xlbiBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVhbCBzaXplIG9mIHRoZQorICogaW5kaXZpZHVhbCBzZWdtZW50cywgaW5jbHVkaW5nIExheWVyNCBoZWFkZXJzIChUQ1AvVURQKS4KKyAqCisgKiBUaGUgTUFDL0wyIG9yIG5ldHdvcmsgKElQLCBJUHY2KSBoZWFkZXJzIGFyZSBub3QgYWNjb3VudGVkIGZvci4KKyAqLwordW5zaWduZWQgaW50IHNrYl9nc29fdHJhbnNwb3J0X3NlZ2xlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNvbnN0IHN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbyA9IHNrYl9zaGluZm8oc2tiKTsKKwl1bnNpZ25lZCBpbnQgaGRyX2xlbjsKKworCWlmIChsaWtlbHkoc2hpbmZvLT5nc29fdHlwZSAmIChTS0JfR1NPX1RDUFY0IHwgU0tCX0dTT19UQ1BWNikpKQorCQloZHJfbGVuID0gdGNwX2hkcmxlbihza2IpOworCWVsc2UKKwkJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlyZXR1cm4gaGRyX2xlbiArIHNoaW5mby0+Z3NvX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2JfZ3NvX3RyYW5zcG9ydF9zZWdsZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IDBjMTI3ZGMuLjViNmE5NDMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTE3NzUsNyArMTc3NSw5IEBACiAJCQl3aGlsZSAob3JkZXIpIHsKIAkJCQlpZiAobnBhZ2VzID49IDEgPDwgb3JkZXIpIHsKIAkJCQkJcGFnZSA9IGFsbG9jX3BhZ2VzKHNrLT5za19hbGxvY2F0aW9uIHwKLQkJCQkJCQkgICBfX0dGUF9DT01QIHwgX19HRlBfTk9XQVJOLAorCQkJCQkJCSAgIF9fR0ZQX0NPTVAgfAorCQkJCQkJCSAgIF9fR0ZQX05PV0FSTiB8CisJCQkJCQkJICAgX19HRlBfTk9SRVRSWSwKIAkJCQkJCQkgICBvcmRlcik7CiAJCQkJCWlmIChwYWdlKQogCQkJCQkJZ290byBmaWxsX3BhZ2U7CkBAIC0xODQ1LDcgKzE4NDcsNyBAQAogCQlnZnBfdCBnZnAgPSBwcmlvOwogCiAJCWlmIChvcmRlcikKLQkJCWdmcCB8PSBfX0dGUF9DT01QIHwgX19HRlBfTk9XQVJOOworCQkJZ2ZwIHw9IF9fR0ZQX0NPTVAgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZOwogCQlwZnJhZy0+cGFnZSA9IGFsbG9jX3BhZ2VzKGdmcCwgb3JkZXIpOwogCQlpZiAobGlrZWx5KHBmcmFnLT5wYWdlKSkgewogCQkJcGZyYWctPm9mZnNldCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwppbmRleCAyOTU0ZGNiLi40YzA0ODQ4IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKQEAgLTIxMDQsOCArMjEwNCw2IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBkbl9kZXZpY2VfZXZlbnQsCiB9OwogCi1leHRlcm4gaW50IGRuX3JvdXRlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgcGFja2V0X3R5cGUgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgZG5fZGl4X3BhY2tldF90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLnR5cGUgPQkJY3B1X3RvX2JlMTYoRVRIX1BfRE5BX1JUKSwKIAkuZnVuYyA9CQlkbl9yb3V0ZV9yY3YsCkBAIC0yMzUzLDkgKzIzNTEsNiBAQAogCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCiB9OwogCi12b2lkIGRuX3JlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKLXZvaWQgZG5fdW5yZWdpc3Rlcl9zeXNjdGwodm9pZCk7Ci0KIE1PRFVMRV9ERVNDUklQVElPTigiVGhlIExpbnV4IERFQ25ldCBOZXR3b3JrIFByb3RvY29sIik7CiBNT0RVTEVfQVVUSE9SKCJMaW51eCBERUNuZXQgUHJvamVjdCBUZWFtIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC82bG93cGFuLmMgYi9uZXQvaWVlZTgwMjE1NC82bG93cGFuLmMKaW5kZXggNDhiMjVjMC4uOGVkZmVhNSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbi5jCisrKyBiL25ldC9pZWVlODAyMTU0LzZsb3dwYW4uYwpAQCAtMTA2LDcgKzEwNiw2IEBACiAJCQkgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCBjb25zdCB2b2lkICpfZGFkZHIsCiAJCQkgICBjb25zdCB2b2lkICpfc2FkZHIsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkcjsKIAljb25zdCB1OCAqc2FkZHIgPSBfc2FkZHI7CiAJY29uc3QgdTggKmRhZGRyID0gX2RhZGRyOwogCXN0cnVjdCBpZWVlODAyMTU0X2FkZHIgc2EsIGRhOwpAQCAtMTE3LDggKzExNiw2IEBACiAJaWYgKHR5cGUgIT0gRVRIX1BfSVBWNikKIAkJcmV0dXJuIDA7CiAKLQloZHIgPSBpcHY2X2hkcihza2IpOwotCiAJaWYgKCFzYWRkcikKIAkJc2FkZHIgPSBkZXYtPmRldl9hZGRyOwogCkBAIC01MzMsNyArNTMwLDI3IEBACiAJLmNyZWF0ZQk9IGxvd3Bhbl9oZWFkZXJfY3JlYXRlLAogfTsKIAorc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBsb3dwYW5fdHhfYnVzeWxvY2s7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGxvd3Bhbl9uZXRkZXZfeG1pdF9sb2NrX2tleTsKKworc3RhdGljIHZvaWQgbG93cGFuX3NldF9sb2NrZGVwX2NsYXNzX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxLAorCQkJCQkgdm9pZCAqX3VudXNlZCkKK3sKKwlsb2NrZGVwX3NldF9jbGFzcygmdHhxLT5feG1pdF9sb2NrLAorCQkJICAmbG93cGFuX25ldGRldl94bWl0X2xvY2tfa2V5KTsKK30KKworCitzdGF0aWMgaW50IGxvd3Bhbl9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGRldl9mb3JfZWFjaF90eF9xdWV1ZShkZXYsIGxvd3Bhbl9zZXRfbG9ja2RlcF9jbGFzc19vbmUsIE5VTEwpOworCWRldi0+cWRpc2NfdHhfYnVzeWxvY2sgPSAmbG93cGFuX3R4X2J1c3lsb2NrOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGxvd3Bhbl9uZXRkZXZfb3BzID0geworCS5uZG9faW5pdAkJPSBsb3dwYW5fZGV2X2luaXQsCiAJLm5kb19zdGFydF94bWl0CQk9IGxvd3Bhbl94bWl0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbG93cGFuX3NldF9hZGRyZXNzLAogfTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0LzZsb3dwYW5faXBoYy5jIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9pcGhjLmMKaW5kZXggMDgzZjkwNS4uODYwYWEyZCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9pcGhjLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9pcGhjLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQkJaGMwNl9wdHIgKz0gMzsKIAkJfSBlbHNlIHsKIAkJCS8qIGNvbXByZXNzIG5vdGhpbmcgKi8KLQkJCW1lbWNweShoYzA2X3B0ciwgJmhkciwgNCk7CisJCQltZW1jcHkoaGMwNl9wdHIsIGhkciwgNCk7CiAJCQkvKiByZXBsYWNlIHRoZSB0b3AgYnl0ZSB3aXRoIG5ldyBFQ04gfCBEU0NQIGZvcm1hdCAqLwogCQkJKmhjMDZfcHRyID0gdG1wOwogCQkJaGMwNl9wdHIgKz0gNDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCBhYzJkZmYzLi5iZGJmNjhiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0xNDQzLDcgKzE0NDMsOCBAQAogCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGQV9MT0NBTCAqLwogCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGQV9CUk9BRENBU1QgKi8KIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWikgLyogSUZBX0xBQkVMICovCi0JICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCk7ICAvKiBJRkFfRkxBR1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAgLyogSUZBX0ZMQUdTICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmFfY2FjaGVpbmZvKSk7IC8qIElGQV9DQUNIRUlORk8gKi8KIH0KIAogc3RhdGljIGlubGluZSB1MzIgY3N0YW1wX2RlbHRhKHVuc2lnbmVkIGxvbmcgY3N0YW1wKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZ3JlLmMgYi9uZXQvaXB2NC9pcF9ncmUuYwppbmRleCBlN2E5MmZkLi5lYzRmNzYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9ncmUuYworKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAJZWxzZQogCQlpdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwZ3JlX25ldF9pZCk7CiAKLQlpcGggPSAoY29uc3Qgc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCWlwaCA9IChjb25zdCBzdHJ1Y3QgaXBoZHIgKikoaWNtcF9oZHIoc2tiKSArIDEpOwogCXQgPSBpcF90dW5uZWxfbG9va3VwKGl0biwgc2tiLT5kZXYtPmlmaW5kZXgsIHRwaS0+ZmxhZ3MsCiAJCQkgICAgIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIHRwaS0+a2V5KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfaW5wdXQuYyBiL25ldC9pcHY0L2lwX2lucHV0LmMKaW5kZXggMDU0YTNlOS4uM2Q0ZGEyYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfaW5wdXQuYworKysgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCkBAIC0zMTQsNyArMzE0LDcgQEAKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCi0JaWYgKHN5c2N0bF9pcF9lYXJseV9kZW11eCAmJiAhc2tiX2RzdChza2IpKSB7CisJaWYgKHN5c2N0bF9pcF9lYXJseV9kZW11eCAmJiAhc2tiX2RzdChza2IpICYmIHNrYi0+c2sgPT0gTlVMTCkgewogCQljb25zdCBzdHJ1Y3QgbmV0X3Byb3RvY29sICppcHByb3Q7CiAJCWludCBwcm90b2NvbCA9IGlwaC0+cHJvdG9jb2w7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbC5jIGIvbmV0L2lwdjQvaXBfdHVubmVsLmMKaW5kZXggYzBlM2NiNy4uNTAyMjhiZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpAQCAtMTAwLDI4ICsxMDEsMjIgQEAKIAkJX190dW5uZWxfZHN0X3NldChwZXJfY3B1X3B0cih0LT5kc3RfY2FjaGUsIGkpLCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKnR1bm5lbF9kc3RfZ2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCitzdGF0aWMgc3RydWN0IHJ0YWJsZSAqdHVubmVsX3J0YWJsZV9nZXQoc3RydWN0IGlwX3R1bm5lbCAqdCwgdTMyIGNvb2tpZSkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZHN0ID0gcmN1X2RlcmVmZXJlbmNlKHRoaXNfY3B1X3B0cih0LT5kc3RfY2FjaGUpLT5kc3QpOwotCWlmIChkc3QpCisJaWYgKGRzdCkgeworCQlpZiAoZHN0LT5vYnNvbGV0ZSAmJiBkc3QtPm9wcy0+Y2hlY2soZHN0LCBjb29raWUpID09IE5VTEwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJdHVubmVsX2RzdF9yZXNldCh0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJCWRzdF9ob2xkKGRzdCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKnR1bm5lbF9kc3RfY2hlY2soc3RydWN0IGlwX3R1bm5lbCAqdCwgdTMyIGNvb2tpZSkKLXsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSB0dW5uZWxfZHN0X2dldCh0KTsKLQotCWlmIChkc3QgJiYgZHN0LT5vYnNvbGV0ZSAmJiBkc3QtPm9wcy0+Y2hlY2soZHN0LCBjb29raWUpID09IE5VTEwpIHsKLQkJdHVubmVsX2RzdF9yZXNldCh0KTsKLQkJcmV0dXJuIE5VTEw7CiAJfQotCi0JcmV0dXJuIGRzdDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gKHN0cnVjdCBydGFibGUgKilkc3Q7CiB9CiAKIC8qIE9mdGVuIG1vZGlmaWVkIHN0YXRzIGFyZSBwZXIgY3B1LCBvdGhlciBhcmUgc2hhcmVkIChuZXRkZXYtPnN0YXRzKSAqLwpAQCAtNTgzLDcgKzU3OCw3IEBACiAJc3RydWN0IGZsb3dpNCBmbDQ7CiAJdTggICAgIHRvcywgdHRsOwogCV9fYmUxNiBkZjsKLQlzdHJ1Y3QgcnRhYmxlICpydCA9IE5VTEw7CS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJc3RydWN0IHJ0YWJsZSAqcnQ7CQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwogCXVuc2lnbmVkIGludCBtYXhfaGVhZHJvb207CS8qIFRoZSBleHRyYSBoZWFkZXIgc3BhY2UgbmVlZGVkICovCiAJX19iZTMyIGRzdDsKIAlpbnQgZXJyOwpAQCAtNjU2LDggKzY1MSw3IEBACiAJaW5pdF90dW5uZWxfZmxvdygmZmw0LCBwcm90b2NvbCwgZHN0LCB0bmxfcGFyYW1zLT5zYWRkciwKIAkJCSB0dW5uZWwtPnBhcm1zLm9fa2V5LCBSVF9UT1ModG9zKSwgdHVubmVsLT5wYXJtcy5saW5rKTsKIAotCWlmIChjb25uZWN0ZWQpCi0JCXJ0ID0gKHN0cnVjdCBydGFibGUgKil0dW5uZWxfZHN0X2NoZWNrKHR1bm5lbCwgMCk7CisJcnQgPSBjb25uZWN0ZWQgPyB0dW5uZWxfcnRhYmxlX2dldCh0dW5uZWwsIDApIDogTlVMTDsKIAogCWlmICghcnQpIHsKIAkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KHR1bm5lbC0+bmV0LCAmZmw0KTsKQEAgLTkzMCw3ICs5MjQsNyBAQAogCX0KIAlydG5sX3VubG9jaygpOwogCi0JcmV0dXJuIFBUUl9SRVQoaXRuLT5mYl90dW5uZWxfZGV2KTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGl0bi0+ZmJfdHVubmVsX2Rldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpcF90dW5uZWxfaW5pdF9uZXQpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDgxYzY5MTAuLmEyNmNlMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCkBAIC02MSw2ICs2MSwxMSBAQAogCSAgcGFja2V0IHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kCiAJICBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnRzLgogCitjb25maWcgTkZUX1JFSkVDVF9JUFY0CisJZGVwZW5kcyBvbiBORl9UQUJMRVNfSVBWNAorCWRlZmF1bHQgTkZUX1JFSkVDVAorCXRyaXN0YXRlCisKIGNvbmZpZyBORl9UQUJMRVNfQVJQCiAJZGVwZW5kcyBvbiBORl9UQUJMRVMKIAl0cmlzdGF0ZSAiQVJQIG5mX3RhYmxlcyBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGMxNmJlOWQuLjkwYjgyNDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTMwLDYgKzMwLDcgQEAKIG9iai0kKENPTkZJR19ORl9UQUJMRVNfSVBWNCkgKz0gbmZfdGFibGVzX2lwdjQubwogb2JqLSQoQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0KSArPSBuZnRfY2hhaW5fcm91dGVfaXB2NC5vCiBvYmotJChDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0KSArPSBuZnRfY2hhaW5fbmF0X2lwdjQubworb2JqLSQoQ09ORklHX05GVF9SRUpFQ1RfSVBWNCkgKz0gbmZ0X3JlamVjdF9pcHY0Lm8KIG9iai0kKENPTkZJR19ORl9UQUJMRVNfQVJQKSArPSBuZl90YWJsZXNfYXJwLm8KIAogIyBnZW5lcmljIElQIHRhYmxlcyAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKaW5kZXggOWVlYTA1OWQuLjU3NGY3ZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jCkBAIC0yMjksNyArMjI5LDEwIEBACiAJCQlyZXQgPSBuZl9jdF9leHBlY3RfcmVsYXRlZChydGNwX2V4cCk7CiAJCQlpZiAocmV0ID09IDApCiAJCQkJYnJlYWs7Ci0JCQllbHNlIGlmIChyZXQgIT0gLUVCVVNZKSB7CisJCQllbHNlIGlmIChyZXQgPT0gLUVCVVNZKSB7CisJCQkJbmZfY3RfdW5leHBlY3RfcmVsYXRlZChydHBfZXhwKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAocmV0IDwgMCkgewogCQkJCW5mX2N0X3VuZXhwZWN0X3JlbGF0ZWQocnRwX2V4cCk7CiAJCQkJbmF0ZWRfcG9ydCA9IDA7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5NzE4YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgRXJpYyBMZWJsb25kIDxlcmljQHJlZ2l0Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX3JlamVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oPgorCit2b2lkIG5mdF9yZWplY3RfaXB2NF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9yZWplY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBORlRfUkVKRUNUX0lDTVBfVU5SRUFDSDoKKwkJbmZfc2VuZF91bnJlYWNoKHBrdC0+c2tiLCBwcml2LT5pY21wX2NvZGUpOworCQlicmVhazsKKwljYXNlIE5GVF9SRUpFQ1RfVENQX1JTVDoKKwkJbmZfc2VuZF9yZXNldChwa3QtPnNrYiwgcGt0LT5vcHMtPmhvb2tudW0pOworCQlicmVhazsKKwl9CisKKwlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GX0RST1A7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfcmVqZWN0X2lwdjRfZXZhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X2lwdjRfdHlwZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9yZWplY3RfaXB2NF9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9yZWplY3RfaXB2NF90eXBlLAorCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfcmVqZWN0KSksCisJLmV2YWwJCT0gbmZ0X3JlamVjdF9pcHY0X2V2YWwsCisJLmluaXQJCT0gbmZ0X3JlamVjdF9pbml0LAorCS5kdW1wCQk9IG5mdF9yZWplY3RfZHVtcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X2lwdjRfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAorCS5uYW1lCQk9ICJyZWplY3QiLAorCS5vcHMJCT0gJm5mdF9yZWplY3RfaXB2NF9vcHMsCisJLnBvbGljeQkJPSBuZnRfcmVqZWN0X3BvbGljeSwKKwkubWF4YXR0cgk9IE5GVEFfUkVKRUNUX01BWCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfcmVqZWN0X2lwdjRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF9yZWplY3RfaXB2NF90eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9yZWplY3RfaXB2NF9tb2R1bGVfZXhpdCh2b2lkKQoreworCW5mdF91bnJlZ2lzdGVyX2V4cHIoJm5mdF9yZWplY3RfaXB2NF90eXBlKTsKK30KKworbW9kdWxlX2luaXQobmZ0X3JlamVjdF9pcHY0X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG5mdF9yZWplY3RfaXB2NF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0FMSUFTX05GVF9BRl9FWFBSKEFGX0lORVQsICJyZWplY3QiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggNDQ3NWIzYi4uOWYzYTJkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTIyMjksNyArMjIyOSw3IEBACiAJLyoJVGhpcyBpcyBhICh1c2VmdWwpIEJTRCB2aW9sYXRpbmcgb2YgdGhlIFJGQy4gVGhlcmUgaXMgYQogCSAqCXByb2JsZW0gd2l0aCBUQ1AgYXMgc3BlY2lmaWVkIGluIHRoYXQgdGhlIG90aGVyIGVuZCBjb3VsZAogCSAqCWtlZXAgYSBzb2NrZXQgb3BlbiBmb3JldmVyIHdpdGggbm8gYXBwbGljYXRpb24gbGVmdCB0aGlzIGVuZC4KLQkgKglXZSB1c2UgYSAzIG1pbnV0ZSB0aW1lb3V0IChhYm91dCB0aGUgc2FtZSBhcyBCU0QpIHRoZW4ga2lsbAorCSAqCVdlIHVzZSBhIDEgbWludXRlIHRpbWVvdXQgKGFib3V0IHRoZSBzYW1lIGFzIEJTRCkgdGhlbiBraWxsCiAJICoJb3VyIGVuZC4gSWYgdGhleSBzZW5kIGFmdGVyIHRoYXQgdGhlbiB0b3VnaCAtIEJVVDogbG9uZyBlbm91Z2gKIAkgKgl0aGF0IHdlIHdvbid0IG1ha2UgdGhlIG9sZCA0KnJ0byA9IGFsbW9zdCBubyB0aW1lIC0gd2hvb3BzCiAJICoJcmVzZXQgbWlzdGFrZS4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggNjVjZjkwZS4uMjI3Y2JhNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTY3MSw2ICs2NzEsNyBAQAogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWxvbmcgbSA9IG1ydHQ7IC8qIFJUVCAqLworCXUzMiBzcnR0ID0gdHAtPnNydHQ7CiAKIAkvKglUaGUgZm9sbG93aW5nIGFtdXNpbmcgY29kZSBjb21lcyBmcm9tIEphY29ic29uJ3MKIAkgKglhcnRpY2xlIGluIFNJR0NPTU0gJzg4LiAgTm90ZSB0aGF0IHJ0dCBhbmQgbWRldgpAQCAtNjg4LDExICs2ODksOSBAQAogCSAqIGRvZXMgbm90IG1hdHRlciBob3cgdG8gX2NhbGN1bGF0ZV8gaXQuIFNlZW1zLCBpdCB3YXMgdHJhcAogCSAqIHRoYXQgVkogZmFpbGVkIHRvIGF2b2lkLiA4KQogCSAqLwotCWlmIChtID09IDApCi0JCW0gPSAxOwotCWlmICh0cC0+c3J0dCAhPSAwKSB7Ci0JCW0gLT0gKHRwLT5zcnR0ID4+IDMpOwkvKiBtIGlzIG5vdyBlcnJvciBpbiBydHQgZXN0ICovCi0JCXRwLT5zcnR0ICs9IG07CQkvKiBydHQgPSA3LzggcnR0ICsgMS84IG5ldyAqLworCWlmIChzcnR0ICE9IDApIHsKKwkJbSAtPSAoc3J0dCA+PiAzKTsJLyogbSBpcyBub3cgZXJyb3IgaW4gcnR0IGVzdCAqLworCQlzcnR0ICs9IG07CQkvKiBydHQgPSA3LzggcnR0ICsgMS84IG5ldyAqLwogCQlpZiAobSA8IDApIHsKIAkJCW0gPSAtbTsJCS8qIG0gaXMgbm93IGFicyhlcnJvcikgKi8KIAkJCW0gLT0gKHRwLT5tZGV2ID4+IDIpOyAgIC8qIHNpbWlsYXIgdXBkYXRlIG9uIG1kZXYgKi8KQEAgLTcyMywxMSArNzIyLDEyIEBACiAJCX0KIAl9IGVsc2UgewogCQkvKiBubyBwcmV2aW91cyBtZWFzdXJlLiAqLwotCQl0cC0+c3J0dCA9IG0gPDwgMzsJLyogdGFrZSB0aGUgbWVhc3VyZWQgdGltZSB0byBiZSBydHQgKi8KKwkJc3J0dCA9IG0gPDwgMzsJCS8qIHRha2UgdGhlIG1lYXN1cmVkIHRpbWUgdG8gYmUgcnR0ICovCiAJCXRwLT5tZGV2ID0gbSA8PCAxOwkvKiBtYWtlIHN1cmUgcnRvID0gMypydHQgKi8KIAkJdHAtPm1kZXZfbWF4ID0gdHAtPnJ0dHZhciA9IG1heCh0cC0+bWRldiwgdGNwX3J0b19taW4oc2spKTsKIAkJdHAtPnJ0dF9zZXEgPSB0cC0+c25kX254dDsKIAl9CisJdHAtPnNydHQgPSBtYXgoMVUsIHNydHQpOwogfQogCiAvKiBTZXQgdGhlIHNrX3BhY2luZ19yYXRlIHRvIGFsbG93IHByb3BlciBzaXppbmcgb2YgVFNPIHBhY2tldHMuCkBAIC03NDYsOCArNzQ2LDEwIEBACiAKIAlyYXRlICo9IG1heCh0cC0+c25kX2N3bmQsIHRwLT5wYWNrZXRzX291dCk7CiAKLQkvKiBDb3JyZWN0aW9uIGZvciBzbWFsbCBzcnR0IDogbWluaW11bSBzcnR0IGJlaW5nIDggKDEgamlmZnkgPDwgMyksCi0JICogYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3J0dCA9IDEgKDEyNSB1cyBpbnN0ZWFkIG9mIDEuMjUgbXMpCisJLyogQ29ycmVjdGlvbiBmb3Igc21hbGwgc3J0dCBhbmQgc2NoZWR1bGluZyBjb25zdHJhaW50cy4KKwkgKiBGb3Igc21hbGwgcnR0LCBjb25zaWRlciBub2lzZSBpcyB0b28gaGlnaCwgYW5kIHVzZQorCSAqIHRoZSBtaW5pbWFsIHZhbHVlIChzcnR0ID0gMSAtPiAxMjUgdXMgZm9yIEhaPTEwMDApCisJICoKIAkgKiBXZSBwcm9iYWJseSBuZWVkIHVzZWMgcmVzb2x1dGlvbiBpbiB0aGUgZnV0dXJlLgogCSAqIE5vdGU6IFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHBvc3NpYmxlIHNydHQ9MCBjYXNlLAogCSAqIHdoZW4gdGNwX3J0dF9lc3RpbWF0b3IoKSB3YXMgbm90IHlldCBjYWxsZWQuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggMDNkMjZiOC4uM2JlMTY3MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNjk4LDcgKzY5OCw4IEBACiAJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJgogCSAgICAoVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfRklOX1dBSVQxIHwgVENQRl9DTE9TSU5HIHwKIAkgICAgIFRDUEZfQ0xPU0VfV0FJVCAgfCBUQ1BGX0xBU1RfQUNLKSkKLQkJdGNwX3dyaXRlX3htaXQoc2ssIHRjcF9jdXJyZW50X21zcyhzayksIDAsIDAsIEdGUF9BVE9NSUMpOworCQl0Y3Bfd3JpdGVfeG1pdChzaywgdGNwX2N1cnJlbnRfbXNzKHNrKSwgdGNwX3NrKHNrKS0+bm9uYWdsZSwKKwkJCSAgICAgICAwLCBHRlBfQVRPTUlDKTsKIH0KIC8qCiAgKiBPbmUgdGFza2xldCBwZXIgY3B1IHRyaWVzIHRvIHNlbmQgbW9yZSBza2JzLgpAQCAtMTkwNCw3ICsxOTA1LDE1IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPiBsaW1pdCkgewogCQkJc2V0X2JpdChUU1FfVEhST1RUTEVELCAmdHAtPnRzcV9mbGFncyk7Ci0JCQlicmVhazsKKwkJCS8qIEl0IGlzIHBvc3NpYmxlIFRYIGNvbXBsZXRpb24gYWxyZWFkeSBoYXBwZW5lZAorCQkJICogYmVmb3JlIHdlIHNldCBUU1FfVEhST1RUTEVELCBzbyB3ZSBtdXN0CisJCQkgKiB0ZXN0IGFnYWluIHRoZSBjb25kaXRpb24uCisJCQkgKiBXZSBhYnVzZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpIGJlY2F1c2UKKwkJCSAqIHRoZXJlIGlzIG5vIHNtcF9tYl9fYWZ0ZXJfc2V0X2JpdCgpIHlldAorCQkJICovCisJCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCQkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPiBsaW1pdCkKKwkJCQlicmVhazsKIAkJfQogCiAJCWxpbWl0ID0gbXNzX25vdzsKQEAgLTE5NzcsNyArMTk4Niw3IEBACiAJLyogU2NoZWR1bGUgYSBsb3NzIHByb2JlIGluIDIqUlRUIGZvciBTQUNLIGNhcGFibGUgY29ubmVjdGlvbnMKIAkgKiBpbiBPcGVuIHN0YXRlLCB0aGF0IGFyZSBlaXRoZXIgbGltaXRlZCBieSBjd25kIG9yIGFwcGxpY2F0aW9uLgogCSAqLwotCWlmIChzeXNjdGxfdGNwX2Vhcmx5X3JldHJhbnMgPCAzIHx8ICFydHQgfHwgIXRwLT5wYWNrZXRzX291dCB8fAorCWlmIChzeXNjdGxfdGNwX2Vhcmx5X3JldHJhbnMgPCAzIHx8ICF0cC0+c3J0dCB8fCAhdHAtPnBhY2tldHNfb3V0IHx8CiAJICAgICF0Y3BfaXNfc2Fjayh0cCkgfHwgaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9PcGVuKQogCQlyZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCmluZGV4IDI1ZjVjZWUuLjg4YjQwMjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvdWRwX29mZmxvYWQuYwpAQCAtMTcsNiArMTcsOCBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyh1ZHBfb2ZmbG9hZF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgdWRwX29mZmxvYWRfcHJpdiBfX3JjdSAqdWRwX29mZmxvYWRfYmFzZSBfX3JlYWRfbW9zdGx5OwogCisjZGVmaW5lIHVkcF9kZXJlZl9wcm90ZWN0ZWQoWCkgcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChYLCBsb2NrZGVwX2lzX2hlbGQoJnVkcF9vZmZsb2FkX2xvY2spKQorCiBzdHJ1Y3QgdWRwX29mZmxvYWRfcHJpdiB7CiAJc3RydWN0IHVkcF9vZmZsb2FkCSpvZmZsb2FkOwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwpAQCAtMTAwLDggKzEwMiw3IEBACiAKIGludCB1ZHBfYWRkX29mZmxvYWQoc3RydWN0IHVkcF9vZmZsb2FkICp1bykKIHsKLQlzdHJ1Y3QgdWRwX29mZmxvYWRfcHJpdiBfX3JjdSAqKmhlYWQgPSAmdWRwX29mZmxvYWRfYmFzZTsKLQlzdHJ1Y3QgdWRwX29mZmxvYWRfcHJpdiAqbmV3X29mZmxvYWQgPSBremFsbG9jKHNpemVvZigqbmV3X29mZmxvYWQpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgdWRwX29mZmxvYWRfcHJpdiAqbmV3X29mZmxvYWQgPSBremFsbG9jKHNpemVvZigqbmV3X29mZmxvYWQpLCBHRlBfQVRPTUlDKTsKIAogCWlmICghbmV3X29mZmxvYWQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTA5LDggKzExMCw4IEBACiAJbmV3X29mZmxvYWQtPm9mZmxvYWQgPSB1bzsKIAogCXNwaW5fbG9jaygmdWRwX29mZmxvYWRfbG9jayk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5ld19vZmZsb2FkLT5uZXh0LCByY3VfZGVyZWZlcmVuY2UoKmhlYWQpKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoKmhlYWQsIG5ld19vZmZsb2FkKTsKKwluZXdfb2ZmbG9hZC0+bmV4dCA9IHVkcF9vZmZsb2FkX2Jhc2U7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHVkcF9vZmZsb2FkX2Jhc2UsIG5ld19vZmZsb2FkKTsKIAlzcGluX3VubG9jaygmdWRwX29mZmxvYWRfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMCwxMiArMTMxLDEyIEBACiAKIAlzcGluX2xvY2soJnVkcF9vZmZsb2FkX2xvY2spOwogCi0JdW9fcHJpdiA9IHJjdV9kZXJlZmVyZW5jZSgqaGVhZCk7CisJdW9fcHJpdiA9IHVkcF9kZXJlZl9wcm90ZWN0ZWQoKmhlYWQpOwogCWZvciAoOyB1b19wcml2ICE9IE5VTEw7Ci0JCXVvX3ByaXYgPSByY3VfZGVyZWZlcmVuY2UoKmhlYWQpKSB7Ci0KKwkgICAgIHVvX3ByaXYgPSB1ZHBfZGVyZWZfcHJvdGVjdGVkKCpoZWFkKSkgewogCQlpZiAodW9fcHJpdi0+b2ZmbG9hZCA9PSB1bykgewotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpoZWFkLCByY3VfZGVyZWZlcmVuY2UodW9fcHJpdi0+bmV4dCkpOworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpoZWFkLAorCQkJCQkgICB1ZHBfZGVyZWZfcHJvdGVjdGVkKHVvX3ByaXYtPm5leHQpKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJCWhlYWQgPSAmdW9fcHJpdi0+bmV4dDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCBmODFmNTk2Li5mMjYxMGUxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC00MTQsNyArNDE0LDcgQEAKIAlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmaGRyLT5kYWRkcik7CiAKIAlpZiAoaXB2Nl9jaGtfYWRkcihuZXQsICZoZHItPmRhZGRyLCBza2ItPmRldiwgMCkgfHwKLQkgICAgaXB2Nl9hbnljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCisJICAgIGlwdjZfY2hrX2FjYXN0X2FkZHJfc3JjKG5ldCwgc2tiLT5kZXYsICZoZHItPmRhZGRyKSkKIAkJc2FkZHIgPSAmaGRyLT5kYWRkcjsKIAogCS8qCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCmluZGV4IDMwMmQ2ZmIuLjUxZDU0ZGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9pbnB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCkBAIC00OSw3ICs0OSw3IEBACiAKIGludCBpcDZfcmN2X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmIChzeXNjdGxfaXBfZWFybHlfZGVtdXggJiYgIXNrYl9kc3Qoc2tiKSkgeworCWlmIChzeXNjdGxfaXBfZWFybHlfZGVtdXggJiYgIXNrYl9kc3Qoc2tiKSAmJiBza2ItPnNrID09IE5VTEwpIHsKIAkJY29uc3Qgc3RydWN0IGluZXQ2X3Byb3RvY29sICppcHByb3Q7CiAKIAkJaXBwcm90ID0gcmN1X2RlcmVmZXJlbmNlKGluZXQ2X3Byb3Rvc1tpcHY2X2hkcihza2IpLT5uZXh0aGRyXSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDM1NzUwZGYuLjRiZmYxZjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC01MCw2ICs1MCwxMSBAQAogCSAgcGFja2V0IHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kCiAJICBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnRzLgogCitjb25maWcgTkZUX1JFSkVDVF9JUFY2CisJZGVwZW5kcyBvbiBORl9UQUJMRVNfSVBWNgorCWRlZmF1bHQgTkZUX1JFSkVDVAorCXRyaXN0YXRlCisKIGNvbmZpZyBJUDZfTkZfSVBUQUJMRVMKIAl0cmlzdGF0ZSAiSVA2IHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nKSIKIAlkZXBlbmRzIG9uIElORVQgJiYgSVBWNgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGQxYjQ5MjguLjcwZDNkZDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19ORl9UQUJMRVNfSVBWNikgKz0gbmZfdGFibGVzX2lwdjYubwogb2JqLSQoQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2KSArPSBuZnRfY2hhaW5fcm91dGVfaXB2Ni5vCiBvYmotJChDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2KSArPSBuZnRfY2hhaW5fbmF0X2lwdjYubworb2JqLSQoQ09ORklHX05GVF9SRUpFQ1RfSVBWNikgKz0gbmZ0X3JlamVjdF9pcHY2Lm8KIAogIyBtYXRjaGVzCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX0FIKSArPSBpcDZ0X2FoLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmMxOWZhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBFcmljIExlYmxvbmQgPGVyaWNAcmVnaXQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZnRfcmVqZWN0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX3JlamVjdC5oPgorCit2b2lkIG5mdF9yZWplY3RfaXB2Nl9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9yZWplY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoKHBrdC0+aW4gIT0gTlVMTCkgPyBwa3QtPmluIDogcGt0LT5vdXQpOworCisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBORlRfUkVKRUNUX0lDTVBfVU5SRUFDSDoKKwkJbmZfc2VuZF91bnJlYWNoNihuZXQsIHBrdC0+c2tiLCBwcml2LT5pY21wX2NvZGUsCisJCQkJIHBrdC0+b3BzLT5ob29rbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBORlRfUkVKRUNUX1RDUF9SU1Q6CisJCW5mX3NlbmRfcmVzZXQ2KG5ldCwgcGt0LT5za2IsIHBrdC0+b3BzLT5ob29rbnVtKTsKKwkJYnJlYWs7CisJfQorCisJZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORl9EUk9QOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3JlamVjdF9pcHY2X2V2YWwpOworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pcHY2X3R5cGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfcmVqZWN0X2lwdjZfb3BzID0geworCS50eXBlCQk9ICZuZnRfcmVqZWN0X2lwdjZfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X3JlamVjdCkpLAorCS5ldmFsCQk9IG5mdF9yZWplY3RfaXB2Nl9ldmFsLAorCS5pbml0CQk9IG5mdF9yZWplY3RfaW5pdCwKKwkuZHVtcAkJPSBuZnRfcmVqZWN0X2R1bXAsCit9OworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pcHY2X3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKKwkubmFtZQkJPSAicmVqZWN0IiwKKwkub3BzCQk9ICZuZnRfcmVqZWN0X2lwdjZfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X3JlamVjdF9wb2xpY3ksCisJLm1heGF0dHIJPSBORlRBX1JFSkVDVF9NQVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZ0X3JlamVjdF9pcHY2X21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mdF9yZWdpc3Rlcl9leHByKCZuZnRfcmVqZWN0X2lwdjZfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZnRfcmVqZWN0X2lwdjZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfcmVqZWN0X2lwdjZfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KG5mdF9yZWplY3RfaXB2Nl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfcmVqZWN0X2lwdjZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9BTElBU19ORlRfQUZfRVhQUihBRl9JTkVUNiwgInJlamVjdCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lweC9hZl9pcHguYyBiL25ldC9pcHgvYWZfaXB4LmMKaW5kZXggOTk0ZTI4Yi4uMDBiMmE2ZCAxMDA2NDQKLS0tIGEvbmV0L2lweC9hZl9pcHguYworKysgYi9uZXQvaXB4L2FmX2lweC5jCkBAIC01MiwxOCArNTIsMTIgQEAKICNpbmNsdWRlIDxuZXQvcDgwMjIuaD4KICNpbmNsdWRlIDxuZXQvcHNuYXAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9kYXRhbGluay5oPgogI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi1leHRlcm4gdm9pZCBpcHhfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpOwotZXh0ZXJuIHZvaWQgaXB4X3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpOwotI2Vsc2UKLSNkZWZpbmUgaXB4X3JlZ2lzdGVyX3N5c2N0bCgpCi0jZGVmaW5lIGlweF91bnJlZ2lzdGVyX3N5c2N0bCgpCi0jZW5kaWYKLQogLyogQ29uZmlndXJhdGlvbiBWYXJpYWJsZXMgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGlweGNmZ19tYXhfaG9wcyA9IDE2Owogc3RhdGljIGNoYXIgaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CkBAIC04NCwxNSArNzgsNiBAQAogc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9wcmltYXJ5X25ldDsKIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhfaW50ZXJuYWxfbmV0OwogCi1leHRlcm4gaW50IGlweHJ0cl9hZGRfcm91dGUoX19iZTMyIG5ldHdvcmssIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqbm9kZSk7Ci1leHRlcm4gdm9pZCBpcHhydHJfZGVsX3JvdXRlcyhzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKTsKLWV4dGVybiBpbnQgaXB4cnRyX3JvdXRlX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9pcHggKnVzaXB4LAotCQkJICAgICAgIHN0cnVjdCBpb3ZlYyAqaW92LCBzaXplX3QgbGVuLCBpbnQgbm9ibG9jayk7Ci1leHRlcm4gaW50IGlweHJ0cl9yb3V0ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX2JlMzIgbmV0KTsKLWV4dGVybiBpbnQgaXB4cnRyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwotCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4X2ludGVyZmFjZXNfaGVhZCh2b2lkKQogewogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICpyYyA9IE5VTEw7CkBAIC0xOTg2LDkgKzE5NzEsNiBAQAogCS5ub3RpZmllcl9jYWxsCT0gaXB4aXRmX2RldmljZV9ldmVudCwKIH07CiAKLWV4dGVybiBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKm1ha2VfRUlJX2NsaWVudCh2b2lkKTsKLWV4dGVybiB2b2lkIGRlc3Ryb3lfRUlJX2NsaWVudChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKik7Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGlweF84MDIyX3R5cGUgPSAweEUwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXB4X3NuYXBfaWRbNV0gPSB7IDB4MCwgMHgwLCAweDAsIDB4ODEsIDB4MzcgfTsKIHN0YXRpYyBjb25zdCBjaGFyIGlweF9FSUlfZXJyX21zZ1tdIF9faW5pdGNvbnN0ID0KZGlmZiAtLWdpdCBhL25ldC9pcHgvaXB4X3JvdXRlLmMgYi9uZXQvaXB4L2lweF9yb3V0ZS5jCmluZGV4IDMwZjQ1MTkuLmMxZjAzMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHgvaXB4X3JvdXRlLmMKKysrIGIvbmV0L2lweC9pcHhfcm91dGUuYwpAQCAtMjAsMTUgKzIwLDExIEBACiAKIGV4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4X2ludGVybmFsX25ldDsKIAotZXh0ZXJuIF9fYmUxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKIGV4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fYmUzMiBuZXQpOwogZXh0ZXJuIGludCBpcHhpdGZfZGVtdXhfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvcHkpOwogZXh0ZXJuIGludCBpcHhpdGZfZGVtdXhfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvcHkpOwotZXh0ZXJuIGludCBpcHhpdGZfc2VuZChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICAgY2hhciAqbm9kZSk7Ci1leHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX2JlMzIgbmV0KTsKIAogc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX2JlMzIgbmV0KQogewpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfb3V0cHV0LmMgYi9uZXQvbGxjL2xsY19vdXRwdXQuYwppbmRleCAyZGFlOGE1Li45NDQyNWU0IDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19vdXRwdXQuYworKysgYi9uZXQvbGxjL2xsY19vdXRwdXQuYwpAQCAtNDMsNyArNDMsNyBAQAogCQkJcmMgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXQVJOKDEsICJkZXZpY2UgdHlwZSBub3Qgc3VwcG9ydGVkOiAlZFxuIiwgc2tiLT5kZXYtPnR5cGUpOworCQlicmVhazsKIAl9CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NmZy5jIGIvbmV0L21hYzgwMjExL2NmZy5jCmluZGV4IGY5YWU5YjguLjQ1M2U5NzQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTEwMjEsOCArMTAyMSwxMCBAQAogCQkJCQlJRUVFODAyMTFfUDJQX09QUFBTX0VOQUJMRV9CSVQ7CiAKIAllcnIgPSBpZWVlODAyMTFfYXNzaWduX2JlYWNvbihzZGF0YSwgJnBhcmFtcy0+YmVhY29uKTsKLQlpZiAoZXJyIDwgMCkKKwlpZiAoZXJyIDwgMCkgeworCQlpZWVlODAyMTFfdmlmX3JlbGVhc2VfY2hhbm5lbChzZGF0YSk7CiAJCXJldHVybiBlcnI7CisJfQogCWNoYW5nZWQgfD0gZXJyOwogCiAJZXJyID0gZHJ2X3N0YXJ0X2FwKHNkYXRhLT5sb2NhbCwgc2RhdGEpOwpAQCAtMTAzMiw2ICsxMDM0LDcgQEAKIAkJaWYgKG9sZCkKIAkJCWtmcmVlX3JjdShvbGQsIHJjdV9oZWFkKTsKIAkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dS5hcC5iZWFjb24sIE5VTEwpOworCQlpZWVlODAyMTFfdmlmX3JlbGVhc2VfY2hhbm5lbChzZGF0YSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMDkwLDggKzEwOTMsNiBAQAogCWtmcmVlKHNkYXRhLT51LmFwLm5leHRfYmVhY29uKTsKIAlzZGF0YS0+dS5hcC5uZXh0X2JlYWNvbiA9IE5VTEw7CiAKLQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+dS5hcC5yZXF1ZXN0X3NtcHNfd29yayk7Ci0KIAkvKiB0dXJuIG9mZiBjYXJyaWVyIGZvciB0aGlzIGludGVyZmFjZSBhbmQgZGVwZW5kZW50IFZMQU5zICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmc2RhdGEtPnUuYXAudmxhbnMsIHUudmxhbi5saXN0KQogCQluZXRpZl9jYXJyaWVyX29mZih2bGFuLT5kZXYpOwpAQCAtMTEwMyw2ICsxMTA0LDcgQEAKIAlrZnJlZV9yY3Uob2xkX2JlYWNvbiwgcmN1X2hlYWQpOwogCWlmIChvbGRfcHJvYmVfcmVzcCkKIAkJa2ZyZWVfcmN1KG9sZF9wcm9iZV9yZXNwLCByY3VfaGVhZCk7CisJc2RhdGEtPnUuYXAuZHJpdmVyX3NtcHNfbW9kZSA9IElFRUU4MDIxMV9TTVBTX09GRjsKIAogCV9fc3RhX2luZm9fZmx1c2goc2RhdGEsIHRydWUpOwogCWllZWU4MDIxMV9mcmVlX2tleXMoc2RhdGEsIHRydWUpOwpAQCAtMjYzOCw2ICsyNjQwLDI0IEBACiAJSU5JVF9ERUxBWUVEX1dPUksoJnJvYy0+d29yaywgaWVlZTgwMjExX3N3X3JvY193b3JrKTsKIAlJTklUX0xJU1RfSEVBRCgmcm9jLT5kZXBlbmRlbnRzKTsKIAorCS8qCisJICogY29va2llIGlzIGVpdGhlciB0aGUgcm9jIGNvb2tpZSAoZm9yIG5vcm1hbCByb2MpCisJICogb3IgdGhlIFNLQiAoZm9yIG1nbXQgVFgpCisJICovCisJaWYgKCF0eHNrYikgeworCQkvKiBsb2NhbC0+bXR4IHByb3RlY3RzIHRoaXMgKi8KKwkJbG9jYWwtPnJvY19jb29raWVfY291bnRlcisrOworCQlyb2MtPmNvb2tpZSA9IGxvY2FsLT5yb2NfY29va2llX2NvdW50ZXI7CisJCS8qIHdvdywgeW91IHdyYXBwZWQgNjQgYml0cyAuLi4gbW9yZSBsaWtlbHkgYSBidWcgKi8KKwkJaWYgKFdBUk5fT04ocm9jLT5jb29raWUgPT0gMCkpIHsKKwkJCXJvYy0+Y29va2llID0gMTsKKwkJCWxvY2FsLT5yb2NfY29va2llX2NvdW50ZXIrKzsKKwkJfQorCQkqY29va2llID0gcm9jLT5jb29raWU7CisJfSBlbHNlIHsKKwkJKmNvb2tpZSA9ICh1bnNpZ25lZCBsb25nKXR4c2tiOworCX0KKwogCS8qIGlmIHRoZXJlJ3Mgb25lIHBlbmRpbmcgb3Igd2UncmUgc2Nhbm5pbmcsIHF1ZXVlIHRoaXMgb25lICovCiAJaWYgKCFsaXN0X2VtcHR5KCZsb2NhbC0+cm9jX2xpc3QpIHx8CiAJICAgIGxvY2FsLT5zY2FubmluZyB8fCBsb2NhbC0+cmFkYXJfZGV0ZWN0X2VuYWJsZWQpCkBAIC0yNzcyLDI0ICsyNzkyLDYgQEAKIAlpZiAoIXF1ZXVlZCkKIAkJbGlzdF9hZGRfdGFpbCgmcm9jLT5saXN0LCAmbG9jYWwtPnJvY19saXN0KTsKIAotCS8qCi0JICogY29va2llIGlzIGVpdGhlciB0aGUgcm9jIGNvb2tpZSAoZm9yIG5vcm1hbCByb2MpCi0JICogb3IgdGhlIFNLQiAoZm9yIG1nbXQgVFgpCi0JICovCi0JaWYgKCF0eHNrYikgewotCQkvKiBsb2NhbC0+bXR4IHByb3RlY3RzIHRoaXMgKi8KLQkJbG9jYWwtPnJvY19jb29raWVfY291bnRlcisrOwotCQlyb2MtPmNvb2tpZSA9IGxvY2FsLT5yb2NfY29va2llX2NvdW50ZXI7Ci0JCS8qIHdvdywgeW91IHdyYXBwZWQgNjQgYml0cyAuLi4gbW9yZSBsaWtlbHkgYSBidWcgKi8KLQkJaWYgKFdBUk5fT04ocm9jLT5jb29raWUgPT0gMCkpIHsKLQkJCXJvYy0+Y29va2llID0gMTsKLQkJCWxvY2FsLT5yb2NfY29va2llX2NvdW50ZXIrKzsKLQkJfQotCQkqY29va2llID0gcm9jLT5jb29raWU7Ci0JfSBlbHNlIHsKLQkJKmNvb2tpZSA9ICh1bnNpZ25lZCBsb25nKXR4c2tiOwotCX0KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaHQuYyBiL25ldC9tYWM4MDIxMS9odC5jCmluZGV4IGZhYjdiOTEuLjcwZGQwMTMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9odC5jCkBAIC00NjYsNyArNDY2LDkgQEAKIAkJCSAgICAgdS5hcC5yZXF1ZXN0X3NtcHNfd29yayk7CiAKIAlzZGF0YV9sb2NrKHNkYXRhKTsKLQlfX2llZWU4MDIxMV9yZXF1ZXN0X3NtcHNfYXAoc2RhdGEsIHNkYXRhLT51LmFwLmRyaXZlcl9zbXBzX21vZGUpOworCWlmIChzZGF0YV9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5iZWFjb24sIHNkYXRhKSkKKwkJX19pZWVlODAyMTFfcmVxdWVzdF9zbXBzX2FwKHNkYXRhLAorCQkJCQkgICAgc2RhdGEtPnUuYXAuZHJpdmVyX3NtcHNfbW9kZSk7CiAJc2RhdGFfdW5sb2NrKHNkYXRhKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lic3MuYyBiL25ldC9tYWM4MDIxMS9pYnNzLmMKaW5kZXggNzcxMDgwZS4uMjc5NmExOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lic3MuYworKysgYi9uZXQvbWFjODAyMTEvaWJzcy5jCkBAIC02OTUsMTIgKzY5NSw5IEBACiAJc3RydWN0IGNmZzgwMjExX2JzcyAqY2JzczsKIAlzdHJ1Y3QgYmVhY29uX2RhdGEgKnByZXNwOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCWludCBhY3RpdmVfaWJzczsKIAl1MTYgY2FwYWJpbGl0eTsKIAotCWFjdGl2ZV9pYnNzID0gaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzZGF0YSk7Ci0KLQlpZiAoIWFjdGl2ZV9pYnNzICYmICFpc196ZXJvX2V0aGVyX2FkZHIoaWZpYnNzLT5ic3NpZCkpIHsKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihpZmlic3MtPmJzc2lkKSkgewogCQljYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CiAKIAkJaWYgKGlmaWJzcy0+cHJpdmFjeSkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggM2RmZDIwYS4uZDZkMWYxZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTQxOCwyMCArNDE4LDI0IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJbXV0ZXhfbG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+bW9uaXRvcl9zZGF0YSwgc2RhdGEpOworCW11dGV4X3VubG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOworCiAJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CiAJcmV0ID0gaWVlZTgwMjExX3ZpZl91c2VfY2hhbm5lbChzZGF0YSwgJmxvY2FsLT5tb25pdG9yX2NoYW5kZWYsCiAJCQkJCUlFRUU4MDIxMV9DSEFOQ1RYX0VYQ0xVU0lWRSk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAlpZiAocmV0KSB7CisJCW11dGV4X2xvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5tb25pdG9yX3NkYXRhLCBOVUxMKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+aWZsaXN0X210eCk7CisJCXN5bmNocm9uaXplX25ldCgpOwogCQlkcnZfcmVtb3ZlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCQlrZnJlZShzZGF0YSk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+bW9uaXRvcl9zZGF0YSwgc2RhdGEpOwotCW11dGV4X3VubG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc3MCwxMiArNzc0LDE5IEBACiAKIAlpZWVlODAyMTFfcm9jX3B1cmdlKGxvY2FsLCBzZGF0YSk7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWllZWU4MDIxMV9tZ2Rfc3RvcChzZGF0YSk7Ci0KLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlpZWVlODAyMTFfaWJzc19zdG9wKHNkYXRhKTsKLQorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+dS5hcC5yZXF1ZXN0X3NtcHNfd29yayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogCS8qCiAJICogUmVtb3ZlIGFsbCBzdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDI3Yzk5MGIuLjk3YTAyZDMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC04NzgsNyArODc4LDcgQEAKIAl9CiAKIAkvKiBhZGp1c3QgZmlyc3QgZnJhZ21lbnQncyBsZW5ndGggKi8KLQlza2ItPmxlbiA9IGhkcmxlbiArIHBlcl9mcmFnbTsKKwlza2JfdHJpbShza2IsIGhkcmxlbiArIHBlcl9mcmFnbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBjMzc0Njc1Li5lOTQxMGQxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCkBAIC01MTMsNyArNTEzLDYgQEAKIAogY29uZmlnIE5GVF9SRUpFQ1QKIAlkZXBlbmRzIG9uIE5GX1RBQkxFUwotCWRlcGVuZHMgb24gTkZfVEFCTEVTX0lQVjYgfHwgIU5GX1RBQkxFU19JUFY2CiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcmVqZWN0IHN1cHBvcnQiCiAJaGVscApAQCAtNTIxLDYgKzUyMCwxMSBAQAogCSAgZXhwbGljaXRseSBkZW55IGFuZCBub3RpZnkgdmlhIFRDUCByZXNldC9JQ01QIGluZm9ybWF0aW9uYWwgZXJyb3JzCiAJICB1bmFsbG93ZWQgdHJhZmZpYy4KIAorY29uZmlnIE5GVF9SRUpFQ1RfSU5FVAorCWRlcGVuZHMgb24gTkZfVEFCTEVTX0lORVQKKwlkZWZhdWx0IE5GVF9SRUpFQ1QKKwl0cmlzdGF0ZQorCiBjb25maWcgTkZUX0NPTVBBVAogCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggZWU5YzRkZS4uYmZmZGFkNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC03OSw2ICs3OSw3IEBACiBvYmotJChDT05GSUdfTkZUX05BVCkJCSs9IG5mdF9uYXQubwogb2JqLSQoQ09ORklHX05GVF9RVUVVRSkJCSs9IG5mdF9xdWV1ZS5vCiBvYmotJChDT05GSUdfTkZUX1JFSkVDVCkgCSs9IG5mdF9yZWplY3Qubworb2JqLSQoQ09ORklHX05GVF9SRUpFQ1RfSU5FVCkJKz0gbmZ0X3JlamVjdF9pbmV0Lm8KIG9iai0kKENPTkZJR19ORlRfUkJUUkVFKQkrPSBuZnRfcmJ0cmVlLm8KIG9iai0kKENPTkZJR19ORlRfSEFTSCkJCSs9IG5mdF9oYXNoLm8KIG9iai0kKENPTkZJR19ORlRfQ09VTlRFUikJKz0gbmZ0X2NvdW50ZXIubwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKaW5kZXggNTlhMWE4NS4uYThlYjBhOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCkBAIC04NzEsMTEgKzg3MSwxMSBAQAogCWNwLT5wcm90b2NvbAkgICA9IHAtPnByb3RvY29sOwogCWlwX3ZzX2FkZHJfc2V0KHAtPmFmLCAmY3AtPmNhZGRyLCBwLT5jYWRkcik7CiAJY3AtPmNwb3J0CSAgID0gcC0+Y3BvcnQ7Ci0JaXBfdnNfYWRkcl9zZXQocC0+YWYsICZjcC0+dmFkZHIsIHAtPnZhZGRyKTsKLQljcC0+dnBvcnQJICAgPSBwLT52cG9ydDsKLQkvKiBwcm90byBzaG91bGQgb25seSBiZSBJUFBST1RPX0lQIGlmIGRfYWRkciBpcyBhIGZ3bWFyayAqLworCS8qIHByb3RvIHNob3VsZCBvbmx5IGJlIElQUFJPVE9fSVAgaWYgcC0+dmFkZHIgaXMgYSBmd21hcmsgKi8KIAlpcF92c19hZGRyX3NldChwLT5wcm90b2NvbCA9PSBJUFBST1RPX0lQID8gQUZfVU5TUEVDIDogcC0+YWYsCi0JCSAgICAgICAmY3AtPmRhZGRyLCBkYWRkcik7CisJCSAgICAgICAmY3AtPnZhZGRyLCBwLT52YWRkcik7CisJY3AtPnZwb3J0CSAgID0gcC0+dnBvcnQ7CisJaXBfdnNfYWRkcl9zZXQocC0+YWYsICZjcC0+ZGFkZHIsIGRhZGRyKTsKIAljcC0+ZHBvcnQgICAgICAgICAgPSBkcG9ydDsKIAljcC0+ZmxhZ3MJICAgPSBmbGFnczsKIAljcC0+ZndtYXJrICAgICAgICAgPSBmd21hcms7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggODgyNGVkMC4uMzU2YmVmNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtMzEyLDYgKzMxMiwyMSBAQAogCW5mX2N0X2RlbGV0ZSgoc3RydWN0IG5mX2Nvbm4gKil1bF9jb25udHJhY2ssIDAsIDApOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wKK25mX2N0X2tleV9lcXVhbChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmgsCisJCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCXUxNiB6b25lKQoreworCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisKKwkvKiBBIGNvbm50cmFjayBjYW4gYmUgcmVjcmVhdGVkIHdpdGggdGhlIGVxdWFsIHR1cGxlLAorCSAqIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgY29ubnRyYWNrIGlzIGNvbmZpcm1lZAorCSAqLworCXJldHVybiBuZl9jdF90dXBsZV9lcXVhbCh0dXBsZSwgJmgtPnR1cGxlKSAmJgorCQluZl9jdF96b25lKGN0KSA9PSB6b25lICYmCisJCW5mX2N0X2lzX2NvbmZpcm1lZChjdCk7Cit9CisKIC8qCiAgKiBXYXJuaW5nIDoKICAqIC0gQ2FsbGVyIG11c3QgdGFrZSBhIHJlZmVyZW5jZSBvbiByZXR1cm5lZCBvYmplY3QKQEAgLTMzMyw4ICszNDgsNyBAQAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIGJlZ2luOgogCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmbmV0LT5jdC5oYXNoW2J1Y2tldF0sIGhubm9kZSkgewotCQlpZiAobmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkgJiYKLQkJICAgIG5mX2N0X3pvbmUobmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKSkgPT0gem9uZSkgeworCQlpZiAobmZfY3Rfa2V5X2VxdWFsKGgsIHR1cGxlLCB6b25lKSkgewogCQkJTkZfQ1RfU1RBVF9JTkMobmV0LCBmb3VuZCk7CiAJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJCXJldHVybiBoOwpAQCAtMzcyLDggKzM4Niw3IEBACiAJCQkgICAgICFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKSkKIAkJCWggPSBOVUxMOwogCQllbHNlIHsKLQkJCWlmICh1bmxpa2VseSghbmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkgfHwKLQkJCQkgICAgIG5mX2N0X3pvbmUoY3QpICE9IHpvbmUpKSB7CisJCQlpZiAodW5saWtlbHkoIW5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSkpKSB7CiAJCQkJbmZfY3RfcHV0KGN0KTsKIAkJCQlnb3RvIGJlZ2luOwogCQkJfQpAQCAtNDM1LDcgKzQ0OCw5IEBACiAJCQlnb3RvIG91dDsKIAogCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwotCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKKwlzbXBfd21iKCk7CisJLyogVGhlIGNhbGxlciBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCAqLworCWF0b21pY19zZXQoJmN0LT5jdF9nZW5lcmFsLnVzZSwgMik7CiAJX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGxfaGFzaCk7CiAJTkZfQ1RfU1RBVF9JTkMobmV0LCBpbnNlcnQpOwogCXNwaW5fdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CkBAIC00NDksNiArNDY0LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGFzaF9jaGVja19pbnNlcnQpOwogCisvKiBkZWxldGlvbiBmcm9tIHRoaXMgbGFydmFsIHRlbXBsYXRlIGxpc3QgaGFwcGVucyB2aWEgbmZfY3RfcHV0KCkgKi8KK3ZvaWQgbmZfY29ubnRyYWNrX3RtcGxfaW5zZXJ0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2Nvbm4gKnRtcGwpCit7CisJX19zZXRfYml0KElQU19URU1QTEFURV9CSVQsICZ0bXBsLT5zdGF0dXMpOworCV9fc2V0X2JpdChJUFNfQ09ORklSTUVEX0JJVCwgJnRtcGwtPnN0YXR1cyk7CisJbmZfY29ubnRyYWNrX2dldCgmdG1wbC0+Y3RfZ2VuZXJhbCk7CisKKwlzcGluX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkvKiBPdmVybG9hZCB0dXBsZSBsaW5rZWQgbGlzdCB0byBwdXQgdXMgaW4gdGVtcGxhdGUgbGlzdC4gKi8KKwlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJnRtcGwtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmhubm9kZSwKKwkJCQkgJm5ldC0+Y3QudG1wbCk7CisJc3Bpbl91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja190bXBsX2luc2VydCk7CisKIC8qIENvbmZpcm0gYSBjb25uZWN0aW9uIGdpdmVuIHNrYjsgcGxhY2VzIGl0IGluIGhhc2ggdGFibGUgKi8KIGludAogX19uZl9jb25udHJhY2tfY29uZmlybShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNzIwLDExICs3NTAsMTAgQEAKIAkJbmZfY3Rfem9uZS0+aWQgPSB6b25lOwogCX0KICNlbmRpZgotCS8qCi0JICogY2hhbmdlcyB0byBsb29rdXAga2V5cyBtdXN0IGJlIGRvbmUgYmVmb3JlIHNldHRpbmcgcmVmY250IHRvIDEKKwkvKiBCZWNhdXNlIHdlIHVzZSBSQ1UgbG9va3Vwcywgd2Ugc2V0IGN0X2dlbmVyYWwudXNlIHRvIHplcm8gYmVmb3JlCisJICogdGhpcyBpcyBpbnNlcnRlZCBpbiBhbnkgbGlzdC4KIAkgKi8KLQlzbXBfd21iKCk7Ci0JYXRvbWljX3NldCgmY3QtPmN0X2dlbmVyYWwudXNlLCAxKTsKKwlhdG9taWNfc2V0KCZjdC0+Y3RfZ2VuZXJhbC51c2UsIDApOwogCXJldHVybiBjdDsKIAogI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfWk9ORVMKQEAgLTc0OCw2ICs3NzcsMTEgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCisJLyogQSBmcmVlZCBvYmplY3QgaGFzIHJlZmNudCA9PSAwLCB0aGF0J3MKKwkgKiB0aGUgZ29sZGVuIHJ1bGUgZm9yIFNMQUJfREVTVFJPWV9CWV9SQ1UKKwkgKi8KKwlORl9DVF9BU1NFUlQoYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkgPT0gMCk7CisKIAluZl9jdF9leHRfZGVzdHJveShjdCk7CiAJbmZfY3RfZXh0X2ZyZWUoY3QpOwogCWttZW1fY2FjaGVfZnJlZShuZXQtPmN0Lm5mX2Nvbm50cmFja19jYWNoZXAsIGN0KTsKQEAgLTg0Myw2ICs4NzcsOSBAQAogCQlORl9DVF9TVEFUX0lOQyhuZXQsIG5ldyk7CiAJfQogCisJLyogTm93IGl0IGlzIGluc2VydGVkIGludG8gdGhlIHVuY29uZmlybWVkIGxpc3QsIGJ1bXAgcmVmY291bnQgKi8KKwluZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7CisKIAkvKiBPdmVybG9hZCB0dXBsZSBsaW5rZWQgbGlzdCB0byBwdXQgdXMgaW4gdW5jb25maXJtZWQgbGlzdC4gKi8KIAlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm5vZGUsCiAJCSAgICAgICAmbmV0LT5jdC51bmNvbmZpcm1lZCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3N5bnByb3h5X2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfc3lucHJveHlfY29yZS5jCmluZGV4IDk4NThlM2UuLjUyZTIwYzkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfc3lucHJveHlfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfc3lucHJveHlfY29yZS5jCkBAIC0zNjMsOSArMzYzLDggQEAKIAkJZ290byBlcnIyOwogCWlmICghbmZjdF9zeW5wcm94eV9leHRfYWRkKGN0KSkKIAkJZ290byBlcnIyOwotCV9fc2V0X2JpdChJUFNfVEVNUExBVEVfQklULCAmY3QtPnN0YXR1cyk7Ci0JX19zZXRfYml0KElQU19DT05GSVJNRURfQklULCAmY3QtPnN0YXR1cyk7CiAKKwluZl9jb25udHJhY2tfdG1wbF9pbnNlcnQobmV0LCBjdCk7CiAJc25ldC0+dG1wbCA9IGN0OwogCiAJc25ldC0+c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHN5bnByb3h5X3N0YXRzKTsKQEAgLTM5MCw3ICszODksNyBAQAogewogCXN0cnVjdCBzeW5wcm94eV9uZXQgKnNuZXQgPSBzeW5wcm94eV9wZXJuZXQobmV0KTsKIAotCW5mX2Nvbm50cmFja19mcmVlKHNuZXQtPnRtcGwpOworCW5mX2N0X3B1dChzbmV0LT50bXBsKTsKIAlzeW5wcm94eV9wcm9jX2V4aXQobmV0KTsKIAlmcmVlX3BlcmNwdShzbmV0LT5zdGF0cyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcGkuYyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCmluZGV4IDExN2JiYWEuLmFkY2UwMWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCkBAIC0xMDA4LDEwICsxMDA4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbmZfdGFibGVzX3JjdV9jaGFpbl9kZXN0cm95KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3N0YXRpYyB2b2lkIG5mX3RhYmxlc19jaGFpbl9kZXN0cm95KHN0cnVjdCBuZnRfY2hhaW4gKmNoYWluKQogewotCXN0cnVjdCBuZnRfY2hhaW4gKmNoYWluID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBuZnRfY2hhaW4sIHJjdV9oZWFkKTsKLQogCUJVR19PTihjaGFpbi0+dXNlID4gMCk7CiAKIAlpZiAoY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pIHsKQEAgLTEwNDUsNyArMTA0Myw3IEBACiAJaWYgKElTX0VSUihjaGFpbikpCiAJCXJldHVybiBQVFJfRVJSKGNoYWluKTsKIAotCWlmICghbGlzdF9lbXB0eSgmY2hhaW4tPnJ1bGVzKSkKKwlpZiAoIWxpc3RfZW1wdHkoJmNoYWluLT5ydWxlcykgfHwgY2hhaW4tPnVzZSA+IDApCiAJCXJldHVybiAtRUJVU1k7CiAKIAlsaXN0X2RlbCgmY2hhaW4tPmxpc3QpOwpAQCAtMTA1OSw3ICsxMDU3LDkgQEAKIAkJCSAgICAgICBmYW1pbHkpOwogCiAJLyogTWFrZSBzdXJlIGFsbCBydWxlIHJlZmVyZW5jZXMgYXJlIGdvbmUgYmVmb3JlIHRoaXMgaXMgcmVsZWFzZWQgKi8KLQljYWxsX3JjdSgmY2hhaW4tPnJjdV9oZWFkLCBuZl90YWJsZXNfcmN1X2NoYWluX2Rlc3Ryb3kpOworCXN5bmNocm9uaXplX3JjdSgpOworCisJbmZfdGFibGVzX2NoYWluX2Rlc3Ryb3koY2hhaW4pOwogCXJldHVybiAwOwogfQogCkBAIC0xMTE0LDM1ICsxMTE0LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZnRfdW5yZWdpc3Rlcl9leHByKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl90eXBlICpfX25mdF9leHByX3R5cGVfZ2V0KHN0cnVjdCBubGF0dHIgKm5sYSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSAqX19uZnRfZXhwcl90eXBlX2dldCh1OCBmYW1pbHksCisJCQkJCQkgICAgICAgc3RydWN0IG5sYXR0ciAqbmxhKQogewogCWNvbnN0IHN0cnVjdCBuZnRfZXhwcl90eXBlICp0eXBlOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0eXBlLCAmbmZfdGFibGVzX2V4cHJlc3Npb25zLCBsaXN0KSB7Ci0JCWlmICghbmxhX3N0cmNtcChubGEsIHR5cGUtPm5hbWUpKQorCQlpZiAoIW5sYV9zdHJjbXAobmxhLCB0eXBlLT5uYW1lKSAmJgorCQkgICAgKCF0eXBlLT5mYW1pbHkgfHwgdHlwZS0+ZmFtaWx5ID09IGZhbWlseSkpCiAJCQlyZXR1cm4gdHlwZTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSAqbmZ0X2V4cHJfdHlwZV9nZXQoc3RydWN0IG5sYXR0ciAqbmxhKQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl90eXBlICpuZnRfZXhwcl90eXBlX2dldCh1OCBmYW1pbHksCisJCQkJCQkgICAgIHN0cnVjdCBubGF0dHIgKm5sYSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSAqdHlwZTsKIAogCWlmIChubGEgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQl0eXBlID0gX19uZnRfZXhwcl90eXBlX2dldChubGEpOworCXR5cGUgPSBfX25mdF9leHByX3R5cGVfZ2V0KGZhbWlseSwgbmxhKTsKIAlpZiAodHlwZSAhPSBOVUxMICYmIHRyeV9tb2R1bGVfZ2V0KHR5cGUtPm93bmVyKSkKIAkJcmV0dXJuIHR5cGU7CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwogCWlmICh0eXBlID09IE5VTEwpIHsKIAkJbmZubF91bmxvY2soTkZOTF9TVUJTWVNfTkZUQUJMRVMpOworCQlyZXF1ZXN0X21vZHVsZSgibmZ0LWV4cHItJXUtJS4qcyIsIGZhbWlseSwKKwkJCSAgICAgICBubGFfbGVuKG5sYSksIChjaGFyICopbmxhX2RhdGEobmxhKSk7CisJCW5mbmxfbG9jayhORk5MX1NVQlNZU19ORlRBQkxFUyk7CisJCWlmIChfX25mdF9leHByX3R5cGVfZ2V0KGZhbWlseSwgbmxhKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJCW5mbmxfdW5sb2NrKE5GTkxfU1VCU1lTX05GVEFCTEVTKTsKIAkJcmVxdWVzdF9tb2R1bGUoIm5mdC1leHByLSUuKnMiLAogCQkJICAgICAgIG5sYV9sZW4obmxhKSwgKGNoYXIgKilubGFfZGF0YShubGEpKTsKIAkJbmZubF9sb2NrKE5GTkxfU1VCU1lTX05GVEFCTEVTKTsKLQkJaWYgKF9fbmZ0X2V4cHJfdHlwZV9nZXQobmxhKSkKKwkJaWYgKF9fbmZ0X2V4cHJfdHlwZV9nZXQoZmFtaWx5LCBubGEpKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJfQogI2VuZGlmCkBAIC0xMTkzLDcgKzEyMDMsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JdHlwZSA9IG5mdF9leHByX3R5cGVfZ2V0KHRiW05GVEFfRVhQUl9OQU1FXSk7CisJdHlwZSA9IG5mdF9leHByX3R5cGVfZ2V0KGN0eC0+YWZpLT5mYW1pbHksIHRiW05GVEFfRVhQUl9OQU1FXSk7CiAJaWYgKElTX0VSUih0eXBlKSkKIAkJcmV0dXJuIFBUUl9FUlIodHlwZSk7CiAKQEAgLTE1MjEsOSArMTUzMSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbmZfdGFibGVzX3JjdV9ydWxlX2Rlc3Ryb3koc3RydWN0IHJjdV9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQgbmZfdGFibGVzX3J1bGVfZGVzdHJveShzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCiB7Ci0Jc3RydWN0IG5mdF9ydWxlICpydWxlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBuZnRfcnVsZSwgcmN1X2hlYWQpOwogCXN0cnVjdCBuZnRfZXhwciAqZXhwcjsKIAogCS8qCkBAIC0xNTM4LDExICsxNTQ3LDYgQEAKIAlrZnJlZShydWxlKTsKIH0KIAotc3RhdGljIHZvaWQgbmZfdGFibGVzX3J1bGVfZGVzdHJveShzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCi17Ci0JY2FsbF9yY3UoJnJ1bGUtPnJjdV9oZWFkLCBuZl90YWJsZXNfcmN1X3J1bGVfZGVzdHJveSk7Ci19Ci0KICNkZWZpbmUgTkZUX1JVTEVfTUFYRVhQUlMJMTI4CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfaW5mbyAqaW5mbzsKQEAgLTE4MDksOSArMTgxMyw2IEBACiAJc3luY2hyb25pemVfcmN1KCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVwZCwgdG1wLCAmbmV0LT5uZnQuY29tbWl0X2xpc3QsIGxpc3QpIHsKLQkJLyogRGVsZXRlIHRoaXMgcnVsZSBmcm9tIHRoZSBkaXJ0eSBsaXN0ICovCi0JCWxpc3RfZGVsKCZydXBkLT5saXN0KTsKLQogCQkvKiBUaGlzIHJ1bGUgd2FzIGluYWN0aXZlIGluIHRoZSBwYXN0IGFuZCBqdXN0IGJlY2FtZSBhY3RpdmUuCiAJCSAqIENsZWFyIHRoZSBuZXh0IGJpdCBvZiB0aGUgZ2VubWFzayBzaW5jZSBpdHMgbWVhbmluZyBoYXMKIAkJICogY2hhbmdlZCwgbm93IGl0IGlzIHRoZSBmdXR1cmUuCkBAIC0xODIyLDYgKzE4MjMsNyBAQAogCQkJCQkgICAgICBydXBkLT5jaGFpbiwgcnVwZC0+cnVsZSwKIAkJCQkJICAgICAgTkZUX01TR19ORVdSVUxFLCAwLAogCQkJCQkgICAgICBydXBkLT5mYW1pbHkpOworCQkJbGlzdF9kZWwoJnJ1cGQtPmxpc3QpOwogCQkJa2ZyZWUocnVwZCk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTgzMSw3ICsxODMzLDE1IEBACiAJCW5mX3RhYmxlc19ydWxlX25vdGlmeShza2IsIHJ1cGQtPm5saCwgcnVwZC0+dGFibGUsIHJ1cGQtPmNoYWluLAogCQkJCSAgICAgIHJ1cGQtPnJ1bGUsIE5GVF9NU0dfREVMUlVMRSwgMCwKIAkJCQkgICAgICBydXBkLT5mYW1pbHkpOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgYW55IHBhY2tldCB0cmF2ZXJzaW5nIG9sZCBydWxlcyAqLworCXN5bmNocm9uaXplX3JjdSgpOworCisJLyogTm93IHdlIGNhbiBzYWZlbHkgcmVsZWFzZSB1bnVzZWQgb2xkIHJ1bGVzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1cGQsIHRtcCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7CiAJCW5mX3RhYmxlc19ydWxlX2Rlc3Ryb3kocnVwZC0+cnVsZSk7CisJCWxpc3RfZGVsKCZydXBkLT5saXN0KTsKIAkJa2ZyZWUocnVwZCk7CiAJfQogCkBAIC0xODQ0LDIwICsxODU0LDI2IEBACiAJc3RydWN0IG5mdF9ydWxlX3RyYW5zICpydXBkLCAqdG1wOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1cGQsIHRtcCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7Ci0JCS8qIERlbGV0ZSBhbGwgcnVsZXMgZnJvbSB0aGUgZGlydHkgbGlzdCAqLwotCQlsaXN0X2RlbCgmcnVwZC0+bGlzdCk7Ci0KIAkJaWYgKCFuZnRfcnVsZV9pc19hY3RpdmVfbmV4dChuZXQsIHJ1cGQtPnJ1bGUpKSB7CiAJCQluZnRfcnVsZV9jbGVhcihuZXQsIHJ1cGQtPnJ1bGUpOworCQkJbGlzdF9kZWwoJnJ1cGQtPmxpc3QpOwogCQkJa2ZyZWUocnVwZCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIFRoaXMgcnVsZSBpcyBpbmFjdGl2ZSwgZ2V0IHJpZCBvZiBpdCAqLwogCQlsaXN0X2RlbF9yY3UoJnJ1cGQtPnJ1bGUtPmxpc3QpOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgYW55IHBhY2tldCBhY2Nlc3NpbmcgYWJvcnRlZCBydWxlcyAqLworCXN5bmNocm9uaXplX3JjdSgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1cGQsIHRtcCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7CiAJCW5mX3RhYmxlc19ydWxlX2Rlc3Ryb3kocnVwZC0+cnVsZSk7CisJCWxpc3RfZGVsKCZydXBkLT5saXN0KTsKIAkJa2ZyZWUocnVwZCk7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5NDMsNiArMTk1OSw5IEBACiAJfQogCiAJaWYgKG5sYVtORlRBX1NFVF9UQUJMRV0gIT0gTlVMTCkgeworCQlpZiAoYWZpID09IE5VTEwpCisJCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwogCQl0YWJsZSA9IG5mX3RhYmxlc190YWJsZV9sb29rdXAoYWZpLCBubGFbTkZUQV9TRVRfVEFCTEVdKTsKIAkJaWYgKElTX0VSUih0YWJsZSkpCiAJCQlyZXR1cm4gUFRSX0VSUih0YWJsZSk7CkBAIC0xOTg5LDEzICsyMDA4LDEzIEBACiAKIAkJCWlmICghc3NjYW5mKGktPm5hbWUsIG5hbWUsICZ0bXApKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRtcCA8IDAgfHwgdG1wID4gQklUU19QRVJfTE9ORyAqIFBBR0VfU0laRSkKKwkJCWlmICh0bXAgPCAwIHx8IHRtcCA+PSBCSVRTX1BFUl9CWVRFICogUEFHRV9TSVpFKQogCQkJCWNvbnRpbnVlOwogCiAJCQlzZXRfYml0KHRtcCwgaW51c2UpOwogCQl9CiAKLQkJbiA9IGZpbmRfZmlyc3RfemVyb19iaXQoaW51c2UsIEJJVFNfUEVSX0xPTkcgKiBQQUdFX1NJWkUpOworCQluID0gZmluZF9maXJzdF96ZXJvX2JpdChpbnVzZSwgQklUU19QRVJfQllURSAqIFBBR0VfU0laRSk7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylpbnVzZSk7CiAJfQogCkBAIC0yNDI4LDYgKzI0NDcsOCBAQAogCXN0cnVjdCBuZnRfY3R4IGN0eDsKIAlpbnQgZXJyOwogCisJaWYgKG5mbXNnLT5uZmdlbl9mYW1pbHkgPT0gTkZQUk9UT19VTlNQRUMpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCWlmIChubGFbTkZUQV9TRVRfVEFCTEVdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0yNDM1LDkgKzI0NTYsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG5mbXNnLT5uZmdlbl9mYW1pbHkgPT0gTkZQUk9UT19VTlNQRUMpCi0JCXJldHVybiAtRUFGTk9TVVBQT1JUOwotCiAJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXAoY3R4LnRhYmxlLCBubGFbTkZUQV9TRVRfTkFNRV0pOwogCWlmIChJU19FUlIoc2V0KSkKIAkJcmV0dXJuIFBUUl9FUlIoc2V0KTsKQEAgLTI3MjMsNiArMjc0MSw5IEBACiAJCWlmIChubGFbTkZUQV9TRVRfRUxFTV9EQVRBXSA9PSBOVUxMICYmCiAJCSAgICAhKGVsZW0uZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSkKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobmxhW05GVEFfU0VUX0VMRU1fREFUQV0gIT0gTlVMTCAmJgorCQkgICAgZWxlbS5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewogCQlpZiAobmxhW05GVEFfU0VUX0VMRU1fREFUQV0gIT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjk3Nyw2ICsyOTk4LDkgQEAKIAkJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfaXRlciAqaXRlciwKIAkJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKIHsKKwlpZiAoZWxlbS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQorCQlyZXR1cm4gMDsKKwogCXN3aXRjaCAoZWxlbS0+ZGF0YS52ZXJkaWN0KSB7CiAJY2FzZSBORlRfSlVNUDoKIAljYXNlIE5GVF9HT1RPOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jCmluZGV4IDBkODc5ZmMuLjkwOTk4YTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmMKQEAgLTEwMyw5ICsxMDMsOSBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZ0X3RyYWNlX3BhY2tldChjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4sCi0JCQkJICAgIGludCBydWxlbnVtLCBlbnVtIG5mdF90cmFjZSB0eXBlKQorc3RhdGljIHZvaWQgbmZ0X3RyYWNlX3BhY2tldChjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4sCisJCQkgICAgIGludCBydWxlbnVtLCBlbnVtIG5mdF90cmFjZSB0eXBlKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQocGt0LT5pbiA/IHBrdC0+aW4gOiBwa3QtPm91dCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jCmluZGV4IDkxNzA1MmUuLjQ2ZTI3NTQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfY3QuYwpAQCAtMjI2LDYgKzIyNiw3IEBACiAJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gIT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1NSQzoKIAljYXNlIE5GVF9DVF9EU1Q6CkBAIC0zMTEsOCArMzEyLDE5IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0NUX0tFWSwgaHRvbmwocHJpdi0+a2V5KSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X3U4KHNrYiwgTkZUQV9DVF9ESVJFQ1RJT04sIHByaXYtPmRpcikpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJc3dpdGNoIChwcml2LT5rZXkpIHsKKwljYXNlIE5GVF9DVF9QUk9UT0NPTDoKKwljYXNlIE5GVF9DVF9TUkM6CisJY2FzZSBORlRfQ1RfRFNUOgorCWNhc2UgTkZUX0NUX1BST1RPX1NSQzoKKwljYXNlIE5GVF9DVF9QUk9UT19EU1Q6CisJCWlmIChubGFfcHV0X3U4KHNrYiwgTkZUQV9DVF9ESVJFQ1RJT04sIHByaXYtPmRpcikpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gMDsKIAogbmxhX3B1dF9mYWlsdXJlOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYwppbmRleCA1YWY3OTAxLi4yNmM1MTU0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYwpAQCAtMjMsNyArMjMsNiBAQAogc3RydWN0IG5mdF9sb2cgewogCXN0cnVjdCBuZl9sb2dpbmZvCWxvZ2luZm87CiAJY2hhcgkJCSpwcmVmaXg7Ci0JaW50CQkJZmFtaWx5OwogfTsKIAogc3RhdGljIHZvaWQgbmZ0X2xvZ19ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKQEAgLTMzLDcgKzMyLDcgQEAKIAljb25zdCBzdHJ1Y3QgbmZ0X2xvZyAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChwa3QtPmluID8gcGt0LT5pbiA6IHBrdC0+b3V0KTsKIAotCW5mX2xvZ19wYWNrZXQobmV0LCBwcml2LT5mYW1pbHksIHBrdC0+b3BzLT5ob29rbnVtLCBwa3QtPnNrYiwgcGt0LT5pbiwKKwluZl9sb2dfcGFja2V0KG5ldCwgcGt0LT5vcHMtPnBmLCBwa3QtPm9wcy0+aG9va251bSwgcGt0LT5za2IsIHBrdC0+aW4sCiAJCSAgICAgIHBrdC0+b3V0LCAmcHJpdi0+bG9naW5mbywgIiVzIiwgcHJpdi0+cHJlZml4KTsKIH0KIApAQCAtNTIsOCArNTEsNiBAQAogCXN0cnVjdCBuZl9sb2dpbmZvICpsaSA9ICZwcml2LT5sb2dpbmZvOwogCWNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYTsKIAotCXByaXYtPmZhbWlseSA9IGN0eC0+YWZpLT5mYW1pbHk7Ci0KIAlubGEgPSB0YltORlRBX0xPR19QUkVGSVhdOwogCWlmIChubGEgIT0gTlVMTCkgewogCQlwcml2LT5wcmVmaXggPSBrbWFsbG9jKG5sYV9sZW4obmxhKSArIDEsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYwppbmRleCA4YTYxMTZiLi5iYjRlZjRjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaD4KIAogc3RydWN0IG5mdF9sb29rdXAgewogCXN0cnVjdCBuZnRfc2V0CQkJKnNldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jCmluZGV4IGNiZWE0NzMuLmU4YWUyZjYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcXVldWUuYwpAQCAtMjUsNyArMjUsNiBAQAogCXUxNglxdWV1ZW51bTsKIAl1MTYJcXVldWVzX3RvdGFsOwogCXUxNglmbGFnczsKLQl1OAlmYW1pbHk7CiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfcXVldWVfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCkBAIC00Myw3ICs0Miw3IEBACiAJCQlxdWV1ZSA9IHByaXYtPnF1ZXVlbnVtICsgY3B1ICUgcHJpdi0+cXVldWVzX3RvdGFsOwogCQl9IGVsc2UgewogCQkJcXVldWUgPSBuZnF1ZXVlX2hhc2gocGt0LT5za2IsIHF1ZXVlLAotCQkJCQkgICAgIHByaXYtPnF1ZXVlc190b3RhbCwgcHJpdi0+ZmFtaWx5LAorCQkJCQkgICAgIHByaXYtPnF1ZXVlc190b3RhbCwgcGt0LT5vcHMtPnBmLAogCQkJCQkgICAgIGpoYXNoX2luaXR2YWwpOwogCQl9CiAJfQpAQCAtNzEsNyArNzAsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWluaXRfaGFzaHJhbmRvbSgmamhhc2hfaW5pdHZhbCk7Ci0JcHJpdi0+ZmFtaWx5ID0gY3R4LT5hZmktPmZhbWlseTsKIAlwcml2LT5xdWV1ZW51bSA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX05VTV0pKTsKIAogCWlmICh0YltORlRBX1FVRVVFX1RPVEFMXSAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmJ0cmVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYwppbmRleCBjYTBjMWIyLi5lMjFkNjlkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYwpAQCAtNjksOCArNjksMTAgQEAKIAkJCQkgICAgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlKQogewogCW5mdF9kYXRhX3VuaW5pdCgmcmJlLT5rZXksIE5GVF9EQVRBX1ZBTFVFKTsKLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQorCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKKwkgICAgIShyYmUtPmZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkpCiAJCW5mdF9kYXRhX3VuaW5pdChyYmUtPmRhdGEsIHNldC0+ZHR5cGUpOworCiAJa2ZyZWUocmJlKTsKIH0KIApAQCAtMTA4LDcgKzExMCw4IEBACiAJaW50IGVycjsKIAogCXNpemUgPSBzaXplb2YoKnJiZSk7Ci0JaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQICYmCisJICAgICEoZWxlbS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSkKIAkJc2l6ZSArPSBzaXplb2YocmJlLT5kYXRhWzBdKTsKIAogCXJiZSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0xMTcsNyArMTIwLDggQEAKIAogCXJiZS0+ZmxhZ3MgPSBlbGVtLT5mbGFnczsKIAluZnRfZGF0YV9jb3B5KCZyYmUtPmtleSwgJmVsZW0tPmtleSk7Ci0JaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQICYmCisJICAgICEocmJlLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQogCQluZnRfZGF0YV9jb3B5KHJiZS0+ZGF0YSwgJmVsZW0tPmRhdGEpOwogCiAJZXJyID0gX19uZnRfcmJ0cmVlX2luc2VydChzZXQsIHJiZSk7CkBAIC0xNTMsNyArMTU3LDggQEAKIAkJCXBhcmVudCA9IHBhcmVudC0+cmJfcmlnaHQ7CiAJCWVsc2UgewogCQkJZWxlbS0+Y29va2llID0gcmJlOwotCQkJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKKwkJCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKKwkJCSAgICAhKHJiZS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSkKIAkJCQluZnRfZGF0YV9jb3B5KCZlbGVtLT5kYXRhLCByYmUtPmRhdGEpOwogCQkJZWxlbS0+ZmxhZ3MgPSByYmUtPmZsYWdzOwogCQkJcmV0dXJuIDA7CkBAIC0xNzcsNyArMTgyLDggQEAKIAogCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKIAkJbmZ0X2RhdGFfY29weSgmZWxlbS5rZXksICZyYmUtPmtleSk7Ci0JCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCisJCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKKwkJICAgICEocmJlLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQogCQkJbmZ0X2RhdGFfY29weSgmZWxlbS5kYXRhLCByYmUtPmRhdGEpOwogCQllbGVtLmZsYWdzID0gcmJlLT5mbGFnczsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYwppbmRleCA1ZTIwNDcxMS4uZjM0NDhjMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKQEAgLTE2LDY1ICsxNiwyMyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgotI2luY2x1ZGUgPG5ldC9pY21wLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX3JlamVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oPgogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfVEFCTEVTX0lQVjYpCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX3JlamVjdC5oPgotI2VuZGlmCi0KLXN0cnVjdCBuZnRfcmVqZWN0IHsKLQllbnVtIG5mdF9yZWplY3RfdHlwZXMJdHlwZTo4OwotCXU4CQkJaWNtcF9jb2RlOwotCXU4CQkJZmFtaWx5OwotfTsKLQotc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKLXsKLQlzdHJ1Y3QgbmZ0X3JlamVjdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfVEFCTEVTX0lQVjYpCi0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCgocGt0LT5pbiAhPSBOVUxMKSA/IHBrdC0+aW4gOiBwa3QtPm91dCk7Ci0jZW5kaWYKLQlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKLQljYXNlIE5GVF9SRUpFQ1RfSUNNUF9VTlJFQUNIOgotCQlpZiAocHJpdi0+ZmFtaWx5ID09IE5GUFJPVE9fSVBWNCkKLQkJCW5mX3NlbmRfdW5yZWFjaChwa3QtPnNrYiwgcHJpdi0+aWNtcF9jb2RlKTsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9UQUJMRVNfSVBWNikKLQkJZWxzZSBpZiAocHJpdi0+ZmFtaWx5ID09IE5GUFJPVE9fSVBWNikKLQkJCW5mX3NlbmRfdW5yZWFjaDYobmV0LCBwa3QtPnNrYiwgcHJpdi0+aWNtcF9jb2RlLAotCQkJCSAgICAgIHBrdC0+b3BzLT5ob29rbnVtKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIE5GVF9SRUpFQ1RfVENQX1JTVDoKLQkJaWYgKHByaXYtPmZhbWlseSA9PSBORlBST1RPX0lQVjQpCi0JCQluZl9zZW5kX3Jlc2V0KHBrdC0+c2tiLCBwa3QtPm9wcy0+aG9va251bSk7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfVEFCTEVTX0lQVjYpCi0JCWVsc2UgaWYgKHByaXYtPmZhbWlseSA9PSBORlBST1RPX0lQVjYpCi0JCQluZl9zZW5kX3Jlc2V0NihuZXQsIHBrdC0+c2tiLCBwa3QtPm9wcy0+aG9va251bSk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JfQotCi0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORl9EUk9QOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X3JlamVjdF9wb2xpY3lbTkZUQV9SRUpFQ1RfTUFYICsgMV0gPSB7Citjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcmVqZWN0X3BvbGljeVtORlRBX1JFSkVDVF9NQVggKyAxXSA9IHsKIAlbTkZUQV9SRUpFQ1RfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkZUQV9SRUpFQ1RfSUNNUF9DT0RFXQkJPSB7IC50eXBlID0gTkxBX1U4IH0sCiB9OworRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3JlamVjdF9wb2xpY3kpOwogCi1zdGF0aWMgaW50IG5mdF9yZWplY3RfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAotCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCitpbnQgbmZ0X3JlamVjdF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X3JlamVjdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKIAlpZiAodGJbTkZUQV9SRUpFQ1RfVFlQRV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2LT5mYW1pbHkgPSBjdHgtPmFmaS0+ZmFtaWx5OwogCXByaXYtPnR5cGUgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9SRUpFQ1RfVFlQRV0pKTsKIAlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKIAljYXNlIE5GVF9SRUpFQ1RfSUNNUF9VTlJFQUNIOgpAQCAtODksOCArNDcsOSBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfcmVqZWN0X2luaXQpOwogCi1zdGF0aWMgaW50IG5mdF9yZWplY3RfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCitpbnQgbmZ0X3JlamVjdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3JlamVjdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKQEAgLTEwOSwzNyArNjgsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCXJldHVybiAtMTsKIH0KLQotc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfdHlwZTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9yZWplY3Rfb3BzID0gewotCS50eXBlCQk9ICZuZnRfcmVqZWN0X3R5cGUsCi0JLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9yZWplY3QpKSwKLQkuZXZhbAkJPSBuZnRfcmVqZWN0X2V2YWwsCi0JLmluaXQJCT0gbmZ0X3JlamVjdF9pbml0LAotCS5kdW1wCQk9IG5mdF9yZWplY3RfZHVtcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSAicmVqZWN0IiwKLQkub3BzCQk9ICZuZnRfcmVqZWN0X29wcywKLQkucG9saWN5CQk9IG5mdF9yZWplY3RfcG9saWN5LAotCS5tYXhhdHRyCT0gTkZUQV9SRUpFQ1RfTUFYLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5mdF9yZWplY3RfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF9yZWplY3RfdHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBuZnRfcmVqZWN0X21vZHVsZV9leGl0KHZvaWQpCi17Ci0JbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X3JlamVjdF90eXBlKTsKLX0KLQotbW9kdWxlX2luaXQobmZ0X3JlamVjdF9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChuZnRfcmVqZWN0X21vZHVsZV9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9yZWplY3RfZHVtcCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwotTU9EVUxFX0FMSUFTX05GVF9FWFBSKCJyZWplY3QiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzEwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaD4KKworc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9pbmV0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzd2l0Y2ggKHBrdC0+b3BzLT5wZikgeworCWNhc2UgTkZQUk9UT19JUFY0OgorCQluZnRfcmVqZWN0X2lwdjRfZXZhbChleHByLCBkYXRhLCBwa3QpOworCWNhc2UgTkZQUk9UT19JUFY2OgorCQluZnRfcmVqZWN0X2lwdjZfZXZhbChleHByLCBkYXRhLCBwa3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfaW5ldF90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3JlamVjdF9pbmV0X29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3JlamVjdF9pbmV0X3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9yZWplY3QpKSwKKwkuZXZhbAkJPSBuZnRfcmVqZWN0X2luZXRfZXZhbCwKKwkuaW5pdAkJPSBuZnRfcmVqZWN0X2luaXQsCisJLmR1bXAJCT0gbmZ0X3JlamVjdF9kdW1wLAorfTsKKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfaW5ldF90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLmZhbWlseQkJPSBORlBST1RPX0lORVQsCisJLm5hbWUJCT0gInJlamVjdCIsCisJLm9wcwkJPSAmbmZ0X3JlamVjdF9pbmV0X29wcywKKwkucG9saWN5CQk9IG5mdF9yZWplY3RfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9SRUpFQ1RfTUFYLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9yZWplY3RfaW5ldF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X3JlamVjdF9pbmV0X3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X3JlamVjdF9pbmV0X21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X3JlamVjdF9pbmV0X3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfcmVqZWN0X2luZXRfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X3JlamVjdF9pbmV0X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0FGX0VYUFIoMSwgInJlamVjdCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9DVC5jIGIvbmV0L25ldGZpbHRlci94dF9DVC5jCmluZGV4IDU5MjliZTYuLjc1NzQ3YWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfQ1QuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NULmMKQEAgLTIyOCwxMiArMjI4LDcgQEAKIAkJCWdvdG8gZXJyMzsKIAl9CiAKLQlfX3NldF9iaXQoSVBTX1RFTVBMQVRFX0JJVCwgJmN0LT5zdGF0dXMpOwotCV9fc2V0X2JpdChJUFNfQ09ORklSTUVEX0JJVCwgJmN0LT5zdGF0dXMpOwotCi0JLyogT3ZlcmxvYWQgdHVwbGUgbGlua2VkIGxpc3QgdG8gcHV0IHVzIGluIHRlbXBsYXRlIGxpc3QuICovCi0JaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0uaG5ub2RlLAotCQkJCSAmcGFyLT5uZXQtPmN0LnRtcGwpOworCW5mX2Nvbm50cmFja190bXBsX2luc2VydChwYXItPm5ldCwgY3QpOwogb3V0OgogCWluZm8tPmN0ID0gY3Q7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYyBiL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jCmluZGV4IGRmNDY5MjguLmU5YTQ4YmEgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jCkBAIC01NSw2ICs1NSw3IEBACiAKICNpbmNsdWRlICJkYXRhcGF0aC5oIgogI2luY2x1ZGUgImZsb3cuaCIKKyNpbmNsdWRlICJmbG93X3RhYmxlLmgiCiAjaW5jbHVkZSAiZmxvd19uZXRsaW5rLmgiCiAjaW5jbHVkZSAidnBvcnQtaW50ZXJuYWxfZGV2LmgiCiAjaW5jbHVkZSAidnBvcnQtbmV0ZGV2LmgiCkBAIC0xNjAsNyArMTYxLDYgQEAKIHsKIAlzdHJ1Y3QgZGF0YXBhdGggKmRwID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGRhdGFwYXRoLCByY3UpOwogCi0Jb3ZzX2Zsb3dfdGJsX2Rlc3Ryb3koJmRwLT50YWJsZSk7CiAJZnJlZV9wZXJjcHUoZHAtPnN0YXRzX3BlcmNwdSk7CiAJcmVsZWFzZV9uZXQob3ZzX2RwX2dldF9uZXQoZHApKTsKIAlrZnJlZShkcC0+cG9ydHMpOwpAQCAtNDY2LDYgKzQ2NiwxNCBAQAogCiAJc2tiX3plcm9jb3B5KHVzZXJfc2tiLCBza2IsIHNrYi0+bGVuLCBobGVuKTsKIAorCS8qIFBhZCBPVlNfUEFDS0VUX0FUVFJfUEFDS0VUIGlmIGxpbmVhciBjb3B5IHdhcyBwZXJmb3JtZWQgKi8KKwlpZiAoIShkcC0+dXNlcl9mZWF0dXJlcyAmIE9WU19EUF9GX1VOQUxJR05FRCkpIHsKKwkJc2l6ZV90IHBsZW4gPSBOTEFfQUxJR04odXNlcl9za2ItPmxlbikgLSB1c2VyX3NrYi0+bGVuOworCisJCWlmIChwbGVuID4gMCkKKwkJCW1lbXNldChza2JfcHV0KHVzZXJfc2tiLCBwbGVuKSwgMCwgcGxlbik7CisJfQorCiAJKChzdHJ1Y3Qgbmxtc2doZHIgKikgdXNlcl9za2ItPmRhdGEpLT5ubG1zZ19sZW4gPSB1c2VyX3NrYi0+bGVuOwogCiAJZXJyID0gZ2VubG1zZ191bmljYXN0KG92c19kcF9nZXRfbmV0KGRwKSwgdXNlcl9za2IsIHVwY2FsbF9pbmZvLT5wb3J0aWQpOwpAQCAtODUyLDExICs4NjAsOCBAQAogCQkJZ290byBlcnJfdW5sb2NrX292czsKIAogCQkvKiBUaGUgdW5tYXNrZWQga2V5IGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgZmxvdyB1cGRhdGVzLiAqLwotCQllcnJvciA9IC1FSU5WQUw7Ci0JCWlmICghb3ZzX2Zsb3dfY21wX3VubWFza2VkX2tleShmbG93LCAmbWF0Y2gpKSB7Ci0JCQlPVlNfTkxFUlIoIkZsb3cgbW9kaWZpY2F0aW9uIG1lc3NhZ2UgcmVqZWN0ZWQsIHVubWFza2VkIGtleSBkb2VzIG5vdCBtYXRjaC5cbiIpOworCQlpZiAoIW92c19mbG93X2NtcF91bm1hc2tlZF9rZXkoZmxvdywgJm1hdGNoKSkKIAkJCWdvdG8gZXJyX3VubG9ja19vdnM7Ci0JCX0KIAogCQkvKiBVcGRhdGUgYWN0aW9ucy4gKi8KIAkJb2xkX2FjdHMgPSBvdnNsX2RlcmVmZXJlbmNlKGZsb3ctPnNmX2FjdHMpOwpAQCAtMTA3OSw2ICsxMDg0LDcgQEAKIAltc2dzaXplICs9IG5sYV90b3RhbF9zaXplKElGTkFNU0laKTsKIAltc2dzaXplICs9IG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3Qgb3ZzX2RwX3N0YXRzKSk7CiAJbXNnc2l6ZSArPSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IG92c19kcF9tZWdhZmxvd19zdGF0cykpOworCW1zZ3NpemUgKz0gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpOyAvKiBPVlNfRFBfQVRUUl9VU0VSX0ZFQVRVUkVTICovCiAKIAlyZXR1cm4gbXNnc2l6ZTsKIH0KQEAgLTEyNzksNyArMTI4NSw3IEBACiBlcnJfZGVzdHJveV9wZXJjcHU6CiAJZnJlZV9wZXJjcHUoZHAtPnN0YXRzX3BlcmNwdSk7CiBlcnJfZGVzdHJveV90YWJsZToKLQlvdnNfZmxvd190YmxfZGVzdHJveSgmZHAtPnRhYmxlKTsKKwlvdnNfZmxvd190YmxfZGVzdHJveSgmZHAtPnRhYmxlLCBmYWxzZSk7CiBlcnJfZnJlZV9kcDoKIAlyZWxlYXNlX25ldChvdnNfZHBfZ2V0X25ldChkcCkpOwogCWtmcmVlKGRwKTsKQEAgLTEzMDYsMTAgKzEzMTIsMTMgQEAKIAlsaXN0X2RlbF9yY3UoJmRwLT5saXN0X25vZGUpOwogCiAJLyogT1ZTUF9MT0NBTCBpcyBkYXRhcGF0aCBpbnRlcm5hbCBwb3J0LiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JICogYWxsIHBvcnQgaW4gZGF0YXBhdGggYXJlIGRlc3Ryb3llZCBmaXJzdCBiZWZvcmUgZnJlZWluZyBkYXRhcGF0aC4KKwkgKiBhbGwgcG9ydHMgaW4gZGF0YXBhdGggYXJlIGRlc3Ryb3llZCBmaXJzdCBiZWZvcmUgZnJlZWluZyBkYXRhcGF0aC4KIAkgKi8KIAlvdnNfZHBfZGV0YWNoX3BvcnQob3ZzX3Zwb3J0X292c2woZHAsIE9WU1BfTE9DQUwpKTsKIAorCS8qIFJDVSBkZXN0cm95IHRoZSBmbG93IHRhYmxlICovCisJb3ZzX2Zsb3dfdGJsX2Rlc3Ryb3koJmRwLT50YWJsZSwgdHJ1ZSk7CisKIAljYWxsX3JjdSgmZHAtPnJjdSwgZGVzdHJveV9kcF9yY3UpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYwppbmRleCBjNThhMGZlLi4zYzI2OGIzIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMKQEAgLTE1MywyOSArMTUzLDI5IEBACiAJZmxvd19mcmVlKGZsb3cpOwogfQogCi1zdGF0aWMgdm9pZCBmbG93X21hc2tfZGVsX3JlZihzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrLCBib29sIGRlZmVycmVkKQotewotCWlmICghbWFzaykKLQkJcmV0dXJuOwotCi0JQlVHX09OKCFtYXNrLT5yZWZfY291bnQpOwotCW1hc2stPnJlZl9jb3VudC0tOwotCi0JaWYgKCFtYXNrLT5yZWZfY291bnQpIHsKLQkJbGlzdF9kZWxfcmN1KCZtYXNrLT5saXN0KTsKLQkJaWYgKGRlZmVycmVkKQotCQkJa2ZyZWVfcmN1KG1hc2ssIHJjdSk7Ci0JCWVsc2UKLQkJCWtmcmVlKG1hc2spOwotCX0KLX0KLQogdm9pZCBvdnNfZmxvd19mcmVlKHN0cnVjdCBzd19mbG93ICpmbG93LCBib29sIGRlZmVycmVkKQogewogCWlmICghZmxvdykKIAkJcmV0dXJuOwogCi0JZmxvd19tYXNrX2RlbF9yZWYoZmxvdy0+bWFzaywgZGVmZXJyZWQpOworCWlmIChmbG93LT5tYXNrKSB7CisJCXN0cnVjdCBzd19mbG93X21hc2sgKm1hc2sgPSBmbG93LT5tYXNrOworCisJCS8qIG92cy1sb2NrIGlzIHJlcXVpcmVkIHRvIHByb3RlY3QgbWFzay1yZWZjb3VudCBhbmQKKwkJICogbWFzayBsaXN0LgorCQkgKi8KKwkJQVNTRVJUX09WU0woKTsKKwkJQlVHX09OKCFtYXNrLT5yZWZfY291bnQpOworCQltYXNrLT5yZWZfY291bnQtLTsKKworCQlpZiAoIW1hc2stPnJlZl9jb3VudCkgeworCQkJbGlzdF9kZWxfcmN1KCZtYXNrLT5saXN0KTsKKwkJCWlmIChkZWZlcnJlZCkKKwkJCQlrZnJlZV9yY3UobWFzaywgcmN1KTsKKwkJCWVsc2UKKwkJCQlrZnJlZShtYXNrKTsKKwkJfQorCX0KIAogCWlmIChkZWZlcnJlZCkKIAkJY2FsbF9yY3UoJmZsb3ctPnJjdSwgcmN1X2ZyZWVfZmxvd19jYWxsYmFjayk7CkBAIC0xODgsMjYgKzE4OCw5IEBACiAJZmxleF9hcnJheV9mcmVlKGJ1Y2tldHMpOwogfQogCisKIHN0YXRpYyB2b2lkIF9fdGFibGVfaW5zdGFuY2VfZGVzdHJveShzdHJ1Y3QgdGFibGVfaW5zdGFuY2UgKnRpKQogewotCWludCBpOwotCi0JaWYgKHRpLT5rZWVwX2Zsb3dzKQotCQlnb3RvIHNraXBfZmxvd3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdGktPm5fYnVja2V0czsgaSsrKSB7Ci0JCXN0cnVjdCBzd19mbG93ICpmbG93OwotCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9IGZsZXhfYXJyYXlfZ2V0KHRpLT5idWNrZXRzLCBpKTsKLQkJc3RydWN0IGhsaXN0X25vZGUgKm47Ci0JCWludCB2ZXIgPSB0aS0+bm9kZV92ZXI7Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmbG93LCBuLCBoZWFkLCBoYXNoX25vZGVbdmVyXSkgewotCQkJaGxpc3RfZGVsKCZmbG93LT5oYXNoX25vZGVbdmVyXSk7Ci0JCQlvdnNfZmxvd19mcmVlKGZsb3csIGZhbHNlKTsKLQkJfQotCX0KLQotc2tpcF9mbG93czoKIAlmcmVlX2J1Y2tldHModGktPmJ1Y2tldHMpOwogCWtmcmVlKHRpKTsKIH0KQEAgLTI1OCwyMCArMjQxLDM4IEBACiAKIHN0YXRpYyB2b2lkIHRhYmxlX2luc3RhbmNlX2Rlc3Ryb3koc3RydWN0IHRhYmxlX2luc3RhbmNlICp0aSwgYm9vbCBkZWZlcnJlZCkKIHsKKwlpbnQgaTsKKwogCWlmICghdGkpCiAJCXJldHVybjsKIAorCWlmICh0aS0+a2VlcF9mbG93cykKKwkJZ290byBza2lwX2Zsb3dzOworCisJZm9yIChpID0gMDsgaSA8IHRpLT5uX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBmbGV4X2FycmF5X2dldCh0aS0+YnVja2V0cywgaSk7CisJCXN0cnVjdCBobGlzdF9ub2RlICpuOworCQlpbnQgdmVyID0gdGktPm5vZGVfdmVyOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmxvdywgbiwgaGVhZCwgaGFzaF9ub2RlW3Zlcl0pIHsKKwkJCWhsaXN0X2RlbF9yY3UoJmZsb3ctPmhhc2hfbm9kZVt2ZXJdKTsKKwkJCW92c19mbG93X2ZyZWUoZmxvdywgZGVmZXJyZWQpOworCQl9CisJfQorCitza2lwX2Zsb3dzOgogCWlmIChkZWZlcnJlZCkKIAkJY2FsbF9yY3UoJnRpLT5yY3UsIGZsb3dfdGJsX2Rlc3Ryb3lfcmN1X2NiKTsKIAllbHNlCiAJCV9fdGFibGVfaW5zdGFuY2VfZGVzdHJveSh0aSk7CiB9CiAKLXZvaWQgb3ZzX2Zsb3dfdGJsX2Rlc3Ryb3koc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlKQordm9pZCBvdnNfZmxvd190YmxfZGVzdHJveShzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUsIGJvb2wgZGVmZXJyZWQpCiB7CiAJc3RydWN0IHRhYmxlX2luc3RhbmNlICp0aSA9IG92c2xfZGVyZWZlcmVuY2UodGFibGUtPnRpKTsKIAotCXRhYmxlX2luc3RhbmNlX2Rlc3Ryb3kodGksIGZhbHNlKTsKKwl0YWJsZV9pbnN0YW5jZV9kZXN0cm95KHRpLCBkZWZlcnJlZCk7CiB9CiAKIHN0cnVjdCBzd19mbG93ICpvdnNfZmxvd190YmxfZHVtcF9uZXh0KHN0cnVjdCB0YWJsZV9pbnN0YW5jZSAqdGksCkBAIC01MDQsMTYgKzUwNSwxMSBAQAogCiAJbWFzayA9IGttYWxsb2Moc2l6ZW9mKCptYXNrKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1hc2spCi0JCW1hc2stPnJlZl9jb3VudCA9IDA7CisJCW1hc2stPnJlZl9jb3VudCA9IDE7CiAKIAlyZXR1cm4gbWFzazsKIH0KIAotc3RhdGljIHZvaWQgbWFza19hZGRfcmVmKHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2spCi17Ci0JbWFzay0+cmVmX2NvdW50Kys7Ci19Ci0KIHN0YXRpYyBib29sIG1hc2tfZXF1YWwoY29uc3Qgc3RydWN0IHN3X2Zsb3dfbWFzayAqYSwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBzd19mbG93X21hc2sgKmIpCiB7CkBAIC01NTQsOSArNTUwLDExIEBACiAJCW1hc2stPmtleSA9IG5ldy0+a2V5OwogCQltYXNrLT5yYW5nZSA9IG5ldy0+cmFuZ2U7CiAJCWxpc3RfYWRkX3JjdSgmbWFzay0+bGlzdCwgJnRibC0+bWFza19saXN0KTsKKwl9IGVsc2UgeworCQlCVUdfT04oIW1hc2stPnJlZl9jb3VudCk7CisJCW1hc2stPnJlZl9jb3VudCsrOwogCX0KIAotCW1hc2tfYWRkX3JlZihtYXNrKTsKIAlmbG93LT5tYXNrID0gbWFzazsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmggYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5oCmluZGV4IDE5OTZlMzQuLmJhYWViMTAgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuaApAQCAtNjAsNyArNjAsNyBAQAogCiBpbnQgb3ZzX2Zsb3dfdGJsX2luaXQoc3RydWN0IGZsb3dfdGFibGUgKik7CiBpbnQgb3ZzX2Zsb3dfdGJsX2NvdW50KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSk7Ci12b2lkIG92c19mbG93X3RibF9kZXN0cm95KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSk7Cit2b2lkIG92c19mbG93X3RibF9kZXN0cm95KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwgYm9vbCBkZWZlcnJlZCk7CiBpbnQgb3ZzX2Zsb3dfdGJsX2ZsdXNoKHN0cnVjdCBmbG93X3RhYmxlICpmbG93X3RhYmxlKTsKIAogaW50IG92c19mbG93X3RibF9pbnNlcnQoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMgYi9uZXQvcnhycGMvYXItY29ubmVjdGlvbi5jCmluZGV4IDQxMDZjYTkuLjdiZjViNWIgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKKysrIGIvbmV0L3J4cnBjL2FyLWNvbm5lY3Rpb24uYwpAQCAtMzgxLDYgKzM4MSw4IEBACiAKIAkJcnhycGNfYXNzaWduX2Nvbm5lY3Rpb25faWQoY29ubik7CiAJCXJ4LT5jb25uID0gY29ubjsKKwl9IGVsc2UgeworCQlzcGluX2xvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CiAJfQogCiAJLyogd2UndmUgZ290IGEgY29ubmVjdGlvbiB3aXRoIGEgZnJlZSBjaGFubmVsIGFuZCB3ZSBjYW4gbm93IGF0dGFjaCB0aGUKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1yZWN2bXNnLmMgYi9uZXQvcnhycGMvYXItcmVjdm1zZy5jCmluZGV4IDg5ODQ5MmEuLjM0YjU0OTAgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKKysrIGIvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYwpAQCAtMTgwLDcgKzE4MCw4IEBACiAJCWlmIChjb3B5ID4gbGVuIC0gY29waWVkKQogCQkJY29weSA9IGxlbiAtIGNvcGllZDsKIAotCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZIHx8CisJCSAgICBza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCQlyZXQgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIG9mZnNldCwKIAkJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29weSk7CiAJCX0gZWxzZSB7CkBAIC0zNTMsNiArMzU0LDEwIEBACiAJaWYgKGNvbnRpbnVlX2NhbGwpCiAJCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwogCXJ4cnBjX2tpbGxfc2tiKHNrYik7CisJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJaWYgKHNrYl9kZXF1ZXVlKCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkgIT0gc2tiKQorCQkJQlVHKCk7CisJfQogCXNrYl9raWxsX2RhdGFncmFtKCZyeC0+c2ssIHNrYiwgZmxhZ3MpOwogCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwogCXJldHVybiAtRUFHQUlOOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF90YmYuYyBiL25ldC9zY2hlZC9zY2hfdGJmLmMKaW5kZXggZmJiYTViMC4uMWNiNDEzZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF90YmYuYworKysgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvc2NoX2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgogCiAKIC8qCVNpbXBsZSBUb2tlbiBCdWNrZXQgRmlsdGVyLgpAQCAtMTQ4LDE2ICsxNDcsMTAgQEAKICAqIFJldHVybiBsZW5ndGggb2YgaW5kaXZpZHVhbCBzZWdtZW50cyBvZiBhIGdzbyBwYWNrZXQsCiAgKiBpbmNsdWRpbmcgYWxsIGhlYWRlcnMgKE1BQywgSVAsIFRDUC9VRFApCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2tiX2dzb19zZWdsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2tiX2dzb19tYWNfc2VnbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdW5zaWduZWQgaW50IGhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKLQljb25zdCBzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7Ci0KLQlpZiAobGlrZWx5KHNoaW5mby0+Z3NvX3R5cGUgJiAoU0tCX0dTT19UQ1BWNCB8IFNLQl9HU09fVENQVjYpKSkKLQkJaGRyX2xlbiArPSB0Y3BfaGRybGVuKHNrYik7Ci0JZWxzZQotCQloZHJfbGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlyZXR1cm4gaGRyX2xlbiArIHNoaW5mby0+Z3NvX3NpemU7CisJcmV0dXJuIGhkcl9sZW4gKyBza2JfZ3NvX3RyYW5zcG9ydF9zZWdsZW4oc2tiKTsKIH0KIAogLyogR1NPIHBhY2tldCBpcyB0b28gYmlnLCBzZWdtZW50IGl0IHNvIHRoYXQgdGJmIGNhbiB0cmFuc21pdApAQCAtMjAyLDcgKzE5NSw3IEBACiAJaW50IHJldDsKIAogCWlmIChxZGlzY19wa3RfbGVuKHNrYikgPiBxLT5tYXhfc2l6ZSkgewotCQlpZiAoc2tiX2lzX2dzbyhza2IpICYmIHNrYl9nc29fc2VnbGVuKHNrYikgPD0gcS0+bWF4X3NpemUpCisJCWlmIChza2JfaXNfZ3NvKHNrYikgJiYgc2tiX2dzb19tYWNfc2VnbGVuKHNrYikgPD0gcS0+bWF4X3NpemUpCiAJCQlyZXR1cm4gdGJmX3NlZ21lbnQoc2tiLCBzY2gpOwogCQlyZXR1cm4gcWRpc2NfcmVzaGFwZV9mYWlsKHNrYiwgc2NoKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMGY2MjU5YS4uMmIxNzM4ZSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtNjYyLDYgKzY2Miw4IEBACiAJICovCiAJc2N0cF92Nl90b19za19kYWRkcigmYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIsIG5ld3NrKTsKIAorCW5ld3NrLT5za192Nl9yY3Zfc2FkZHIgPSBzay0+c2tfdjZfcmN2X3NhZGRyOworCiAJc2tfcmVmY250X2RlYnVnX2luYyhuZXdzayk7CiAKIAlpZiAobmV3c2stPnNrX3Byb3QtPmluaXQobmV3c2spKSB7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggMGEyYWVlMC4uNmMwNTEzYSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtNTMyLDEzICs1MzIsNyBAQAogCiBzdGF0aWMgdm9pZCB3YXJuX2dzc2Qodm9pZCkKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyByYXRlbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCi0JaWYgKHRpbWVfYWZ0ZXIobm93LCByYXRlbGltaXQpKSB7Ci0JCXByX3dhcm4oIlJQQzogQVVUSF9HU1MgdXBjYWxsIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHVzZXIgZGFlbW9uIGlzIHJ1bm5pbmcuXG4iKTsKLQkJcmF0ZWxpbWl0ID0gbm93ICsgMTUqSFo7Ci0JfQorCWRwcmludGsoIkFVVEhfR1NTIHVwY2FsbCBmYWlsZWQuIFBsZWFzZSBjaGVjayB1c2VyIGRhZW1vbiBpcyBydW5uaW5nLlxuIik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2tleXMuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfa2V5cy5jCmluZGV4IDc2ZTQyZTYuLjI0NTg5YmQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfa2V5cy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfa2V5cy5jCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19rcmI1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L2xjbS5oPgogCiAjaWZkZWYgUlBDX0RFQlVHCiAjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkgICAgICAgIFJQQ0RCR19BVVRICkBAIC03Miw3ICs3Myw3IEBACiBzdGF0aWMgdm9pZCBrcmI1X25mb2xkKHUzMiBpbmJpdHMsIGNvbnN0IHU4ICppbiwKIAkJICAgICAgIHUzMiBvdXRiaXRzLCB1OCAqb3V0KQogewotCWludCBhLCBiLCBjLCBsY207CisJdW5zaWduZWQgbG9uZyB1bGNtOwogCWludCBieXRlLCBpLCBtc2JpdDsKIAogCS8qIHRoZSBjb2RlIGJlbG93IGlzIG1vcmUgcmVhZGFibGUgaWYgSSBtYWtlIHRoZXNlIGJ5dGVzCkBAIC04MiwxNyArODMsNyBAQAogCW91dGJpdHMgPj49IDM7CiAKIAkvKiBmaXJzdCBjb21wdXRlIGxjbShuLGspICovCi0KLQlhID0gb3V0Yml0czsKLQliID0gaW5iaXRzOwotCi0Jd2hpbGUgKGIgIT0gMCkgewotCQljID0gYjsKLQkJYiA9IGElYjsKLQkJYSA9IGM7Ci0JfQotCi0JbGNtID0gb3V0Yml0cyppbmJpdHMvYTsKKwl1bGNtID0gbGNtKGluYml0cywgb3V0Yml0cyk7CiAKIAkvKiBub3cgZG8gdGhlIHJlYWwgd29yayAqLwogCkBAIC0xMDEsNyArOTIsNyBAQAogCiAJLyogdGhpcyB3aWxsIGVuZCB1cCBjeWNsaW5nIHRocm91Z2ggayBsY20oayxuKS9rIHRpbWVzLCB3aGljaAogCSAgIGlzIGNvcnJlY3QgKi8KLQlmb3IgKGkgPSBsY20tMTsgaSA+PSAwOyBpLS0pIHsKKwlmb3IgKGkgPSB1bGNtLTE7IGkgPj0gMDsgaS0tKSB7CiAJCS8qIGNvbXB1dGUgdGhlIG1zYml0IGluIGsgd2hpY2ggZ2V0cyBhZGRlZCBpbnRvIHRoaXMgYnl0ZSAqLwogCQltc2JpdCA9ICgKIAkJCS8qIGZpcnN0LCBzdGFydCB3aXRoIHRoZSBtc2JpdCBpbiB0aGUgZmlyc3QsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19ycGNfdXBjYWxsLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19ycGNfdXBjYWxsLmMKaW5kZXggNDU4Zjg1ZS4uYWJiYjdkYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfcnBjX3VwY2FsbC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3JwY191cGNhbGwuYwpAQCAtMTM3LDcgKzEzNyw2IEBACiB7CiAJbXV0ZXhfaW5pdCgmc24tPmdzc3BfbG9jayk7CiAJc24tPmdzc3BfY2xudCA9IE5VTEw7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc24tPmdzc3Bfd3EpOwogfQogCiBpbnQgc2V0X2dzc3BfY2xudChzdHJ1Y3QgbmV0ICpuZXQpCkBAIC0xNTQsNyArMTUzLDYgQEAKIAkJc24tPmdzc3BfY2xudCA9IGNsbnQ7CiAJfQogCW11dGV4X3VubG9jaygmc24tPmdzc3BfbG9jayk7Ci0Jd2FrZV91cCgmc24tPmdzc3Bfd3EpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCAwMDhjZGFkLi4wZjczZjQ1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC0xMjYzLDY2ICsxMjYzLDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotREVGSU5FX1NQSU5MT0NLKHVzZV9nc3NwX2xvY2spOworLyoKKyAqIFRyeSB0byBzZXQgdGhlIHNuLT51c2VfZ3NzX3Byb3h5IHZhcmlhYmxlIHRvIGEgbmV3IHZhbHVlLiBXZSBvbmx5IGFsbG93CisgKiBpdCB0byBiZSBjaGFuZ2VkIGlmIGl0J3MgY3VycmVudGx5IHVuZGVmaW5lZCAoLTEpLiBJZiBpdCdzIGFueSBvdGhlciB2YWx1ZQorICogdGhlbiByZXR1cm4gLUVCVVNZIHVubGVzcyB0aGUgdHlwZSB3b3VsZG4ndCBoYXZlIGNoYW5nZWQgYW55d2F5LgorICovCitzdGF0aWMgaW50IHNldF9nc3NfcHJveHkoc3RydWN0IG5ldCAqbmV0LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3VucnBjX25ldCAqc24gPSBuZXRfZ2VuZXJpYyhuZXQsIHN1bnJwY19uZXRfaWQpOworCWludCByZXQ7CisKKwlXQVJOX09OX09OQ0UodHlwZSAhPSAwICYmIHR5cGUgIT0gMSk7CisJcmV0ID0gY21weGNoZygmc24tPnVzZV9nc3NfcHJveHksIC0xLCB0eXBlKTsKKwlpZiAocmV0ICE9IC0xICYmIHJldCAhPSB0eXBlKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQogCiBzdGF0aWMgYm9vbCB1c2VfZ3NzX3Byb3h5KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3Qgc3VucnBjX25ldCAqc24gPSBuZXRfZ2VuZXJpYyhuZXQsIHN1bnJwY19uZXRfaWQpOwogCi0JaWYgKHNuLT51c2VfZ3NzX3Byb3h5ICE9IC0xKQotCQlyZXR1cm4gc24tPnVzZV9nc3NfcHJveHk7Ci0Jc3Bpbl9sb2NrKCZ1c2VfZ3NzcF9sb2NrKTsKLQkvKgotCSAqIElmIHlvdSB3YW50ZWQgZ3NzLXByb3h5LCB5b3Ugc2hvdWxkIGhhdmUgc2FpZCBzbyBiZWZvcmUKLQkgKiBzdGFydGluZyB0byBhY2NlcHQgcmVxdWVzdHM6Ci0JICovCi0Jc24tPnVzZV9nc3NfcHJveHkgPSAwOwotCXNwaW5fdW5sb2NrKCZ1c2VfZ3NzcF9sb2NrKTsKLQlyZXR1cm4gMDsKKwkvKiBJZiB1c2VfZ3NzX3Byb3h5IGlzIHN0aWxsIHVuZGVmaW5lZCwgdGhlbiB0cnkgdG8gZGlzYWJsZSBpdCAqLworCWlmIChzbi0+dXNlX2dzc19wcm94eSA9PSAtMSkKKwkJc2V0X2dzc19wcm94eShuZXQsIDApOworCXJldHVybiBzbi0+dXNlX2dzc19wcm94eTsKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAKLXN0YXRpYyBpbnQgc2V0X2dzc19wcm94eShzdHJ1Y3QgbmV0ICpuZXQsIGludCB0eXBlKQotewotCXN0cnVjdCBzdW5ycGNfbmV0ICpzbiA9IG5ldF9nZW5lcmljKG5ldCwgc3VucnBjX25ldF9pZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlXQVJOX09OX09OQ0UodHlwZSAhPSAwICYmIHR5cGUgIT0gMSk7Ci0Jc3Bpbl9sb2NrKCZ1c2VfZ3NzcF9sb2NrKTsKLQlpZiAoc24tPnVzZV9nc3NfcHJveHkgPT0gLTEgfHwgc24tPnVzZV9nc3NfcHJveHkgPT0gdHlwZSkKLQkJc24tPnVzZV9nc3NfcHJveHkgPSB0eXBlOwotCWVsc2UKLQkJcmV0ID0gLUVCVVNZOwotCXNwaW5fdW5sb2NrKCZ1c2VfZ3NzcF9sb2NrKTsKLQl3YWtlX3VwKCZzbi0+Z3NzcF93cSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGdzc3BfcmVhZHkoc3RydWN0IHN1bnJwY19uZXQgKnNuKQotewotCXN3aXRjaCAoc24tPnVzZV9nc3NfcHJveHkpIHsKLQkJY2FzZSAtMToKLQkJCXJldHVybiBmYWxzZTsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgMToKLQkJCXJldHVybiBzbi0+Z3NzcF9jbG50OwotCX0KLQlXQVJOX09OX09OQ0UoMSk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHdhaXRfZm9yX2dzc19wcm94eShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzdW5ycGNfbmV0ICpzbiA9IG5ldF9nZW5lcmljKG5ldCwgc3VucnBjX25ldF9pZCk7Ci0KLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYgIWdzc3BfcmVhZHkoc24pKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNuLT5nc3NwX3dxLCBnc3NwX3JlYWR5KHNuKSk7Ci19Ci0KLQogc3RhdGljIHNzaXplX3Qgd3JpdGVfZ3NzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTEzNDIsMTAgKzEzMTEsMTAgQEAKIAkJcmV0dXJuIHJlczsKIAlpZiAoaSAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXMgPSBzZXRfZ3NzX3Byb3h5KG5ldCwgMSk7CisJcmVzID0gc2V0X2dzc3BfY2xudChuZXQpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7Ci0JcmVzID0gc2V0X2dzc3BfY2xudChuZXQpOworCXJlcyA9IHNldF9nc3NfcHJveHkobmV0LCAxKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCXJldHVybiBjb3VudDsKQEAgLTEzNTUsMTYgKzEzMjQsMTIgQEAKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBQREVfREFUQShmaWxlX2lub2RlKGZpbGUpKTsKKwlzdHJ1Y3Qgc3VucnBjX25ldCAqc24gPSBuZXRfZ2VuZXJpYyhuZXQsIHN1bnJwY19uZXRfaWQpOwogCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOwogCWNoYXIgdGJ1ZlsxMF07CiAJc2l6ZV90IGxlbjsKLQlpbnQgcmV0OwogCi0JcmV0ID0gd2FpdF9mb3JfZ3NzX3Byb3h5KG5ldCwgZmlsZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNucHJpbnRmKHRidWYsIHNpemVvZih0YnVmKSwgIiVkXG4iLCB1c2VfZ3NzX3Byb3h5KG5ldCkpOworCXNucHJpbnRmKHRidWYsIHNpemVvZih0YnVmKSwgIiVkXG4iLCBzbi0+dXNlX2dzc19wcm94eSk7CiAJbGVuID0gc3RybGVuKHRidWYpOwogCWlmIChwID49IGxlbikKIAkJcmV0dXJuIDA7CkBAIC0xNjI2LDggKzE1OTEsNyBAQAogCUJVR19PTihpbnRlZ19sZW4gJSA0KTsKIAkqcCsrID0gaHRvbmwoaW50ZWdfbGVuKTsKIAkqcCsrID0gaHRvbmwoZ2MtPmdjX3NlcSk7Ci0JaWYgKHhkcl9idWZfc3Vic2VnbWVudChyZXNidWYsICZpbnRlZ19idWYsIGludGVnX29mZnNldCwKLQkJCQlpbnRlZ19sZW4pKQorCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQocmVzYnVmLCAmaW50ZWdfYnVmLCBpbnRlZ19vZmZzZXQsIGludGVnX2xlbikpCiAJCUJVRygpOwogCWlmIChyZXNidWYtPnRhaWxbMF0uaW92X2Jhc2UgPT0gTlVMTCkgewogCQlpZiAocmVzYnVmLT5oZWFkWzBdLmlvdl9sZW4gKyBSUENfTUFYX0FVVEhfU0laRSA+IFBBR0VfU0laRSkKQEAgLTE2MzUsMTAgKzE1OTksOCBAQAogCQlyZXNidWYtPnRhaWxbMF0uaW92X2Jhc2UgPSByZXNidWYtPmhlYWRbMF0uaW92X2Jhc2UKIAkJCQkJCSsgcmVzYnVmLT5oZWFkWzBdLmlvdl9sZW47CiAJCXJlc2J1Zi0+dGFpbFswXS5pb3ZfbGVuID0gMDsKLQkJcmVzdiA9ICZyZXNidWYtPnRhaWxbMF07Ci0JfSBlbHNlIHsKLQkJcmVzdiA9ICZyZXNidWYtPnRhaWxbMF07CiAJfQorCXJlc3YgPSAmcmVzYnVmLT50YWlsWzBdOwogCW1pYy5kYXRhID0gKHU4ICopcmVzdi0+aW92X2Jhc2UgKyByZXN2LT5pb3ZfbGVuICsgNDsKIAlpZiAoZ3NzX2dldF9taWMoZ3NkLT5yc2NpLT5tZWNoY3R4LCAmaW50ZWdfYnVmLCAmbWljKSkKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IGU1MjFkMjAuLmFlMzMzYzEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTExMTEsOSArMTExMSw3IEBACiAJCSpicCsrID0gJ3gnOwogCQlsZW4gLT0gMjsKIAkJd2hpbGUgKGJsZW4gJiYgbGVuID49IDIpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYyA9ICpidWYrKzsKLQkJCSpicCsrID0gJzAnICsgKChjJjB4ZjApPj40KSArIChjPj0weGEwKSooJ2EnLSc5Jy0xKTsKLQkJCSpicCsrID0gJzAnICsgKGMmMHgwZikgKyAoKGMmMHgwZik+PTB4MGEpKignYSctJzknLTEpOworCQkJYnAgPSBoZXhfYnl0ZV9wYWNrKGJwLCAqYnVmKyspOwogCQkJbGVuIC09IDI7CiAJCQlibGVuLS07CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvbmV0bnMuaCBiL25ldC9zdW5ycGMvbmV0bnMuaAppbmRleCA5NGU1MDZmLi5kZjU4MjY4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL25ldG5zLmgKKysrIGIvbmV0L3N1bnJwYy9uZXRucy5oCkBAIC0yNyw3ICsyNyw2IEBACiAJdW5zaWduZWQgaW50IHJwY2JfaXNfYWZfbG9jYWwgOiAxOwogCiAJc3RydWN0IG11dGV4IGdzc3BfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBnc3NwX3dxOwogCXN0cnVjdCBycGNfY2xudCAqZ3NzcF9jbG50OwogCWludCB1c2VfZ3NzX3Byb3h5OwogCWludCBwaXBlX3ZlcnNpb247CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCBlN2ZiZTM2Li41ZGU2ODAxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTkxNiw5ICs5MTYsNiBAQAogI2VuZGlmCiAJfQogCi0JaWYgKGVycm9yIDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXN2JXUgUlBDICIKLQkJCSJzZXJ2aWNlIChlcnJubyAlZCkuXG4iLCBwcm9nbmFtZSwgdmVyc2lvbiwgLWVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTkzNyw2ICs5MzQsNyBAQAogCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgcG9ydCkKIHsKIAlzdHJ1Y3Qgc3ZjX3Byb2dyYW0JKnByb2dwOworCXN0cnVjdCBzdmNfdmVyc2lvbgkqdmVyczsKIAl1bnNpZ25lZCBpbnQJCWk7CiAJaW50CQkJZXJyb3IgPSAwOwogCkBAIC05NDYsNyArOTQ0LDggQEAKIAogCWZvciAocHJvZ3AgPSBzZXJ2LT5zdl9wcm9ncmFtOyBwcm9ncDsgcHJvZ3AgPSBwcm9ncC0+cGdfbmV4dCkgewogCQlmb3IgKGkgPSAwOyBpIDwgcHJvZ3AtPnBnX252ZXJzOyBpKyspIHsKLQkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXSA9PSBOVUxMKQorCQkJdmVycyA9IHByb2dwLT5wZ192ZXJzW2ldOworCQkJaWYgKHZlcnMgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAogCQkJZHByaW50aygic3ZjOiBzdmNfcmVnaXN0ZXIoJXN2JWQsICVzLCAldSwgJXUpJXNcbiIsCkBAIC05NTUsMTYgKzk1NCwyNiBAQAogCQkJCQlwcm90byA9PSBJUFBST1RPX1VEUD8gICJ1ZHAiIDogInRjcCIsCiAJCQkJCXBvcnQsCiAJCQkJCWZhbWlseSwKLQkJCQkJcHJvZ3AtPnBnX3ZlcnNbaV0tPnZzX2hpZGRlbj8KLQkJCQkJCSIgKGJ1dCBub3QgdGVsbGluZyBwb3J0bWFwKSIgOiAiIik7CisJCQkJCXZlcnMtPnZzX2hpZGRlbiA/CisJCQkJCSIgKGJ1dCBub3QgdGVsbGluZyBwb3J0bWFwKSIgOiAiIik7CiAKLQkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuKQorCQkJaWYgKHZlcnMtPnZzX2hpZGRlbikKIAkJCQljb250aW51ZTsKIAogCQkJZXJyb3IgPSBfX3N2Y19yZWdpc3RlcihuZXQsIHByb2dwLT5wZ19uYW1lLCBwcm9ncC0+cGdfcHJvZywKIAkJCQkJCWksIGZhbWlseSwgcHJvdG8sIHBvcnQpOwotCQkJaWYgKGVycm9yIDwgMCkKKworCQkJaWYgKHZlcnMtPnZzX3JwY2Jfb3B0bmwpIHsKKwkJCQllcnJvciA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzdmM6IGZhaWxlZCB0byByZWdpc3RlciAiCisJCQkJCSIlc3YldSBSUEMgc2VydmljZSAoZXJybm8gJWQpLlxuIiwKKwkJCQkJcHJvZ3AtPnBnX25hbWUsIGksIC1lcnJvcik7CiAJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwppbmRleCA4MGE2NjQwLi4wNmM2ZmYwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAl9CiB9CiAKLWludCBzdmNfYWxsb2NfYXJnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCitzdGF0aWMgaW50IHN2Y19hbGxvY19hcmcoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYgPSBycXN0cC0+cnFfc2VydmVyOwogCXN0cnVjdCB4ZHJfYnVmICphcmc7CkBAIC02MTIsNyArNjEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHN2Y194cHJ0ICpzdmNfZ2V0X25leHRfeHBydChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBsb25nIHRpbWVvdXQpCitzdGF0aWMgc3RydWN0IHN2Y194cHJ0ICpzdmNfZ2V0X25leHRfeHBydChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBsb25nIHRpbWVvdXQpCiB7CiAJc3RydWN0IHN2Y194cHJ0ICp4cHJ0OwogCXN0cnVjdCBzdmNfcG9vbAkJKnBvb2wgPSBycXN0cC0+cnFfcG9vbDsKQEAgLTY5MSw3ICs2OTEsNyBAQAogCXJldHVybiB4cHJ0OwogfQogCi12b2lkIHN2Y19hZGRfbmV3X3RlbXBfeHBydChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIHN0cnVjdCBzdmNfeHBydCAqbmV3eHB0KQorc3RhdGljIHZvaWQgc3ZjX2FkZF9uZXdfdGVtcF94cHJ0KHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IHN2Y194cHJ0ICpuZXd4cHQpCiB7CiAJc3Bpbl9sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKIAlzZXRfYml0KFhQVF9URU1QLCAmbmV3eHB0LT54cHRfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0c29jay5jIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCmluZGV4IDJhN2NhOGYuLjgxN2ExZTUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHNvY2suYworKysgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKQEAgLTI5NjQsMTAgKzI5NjQsOSBAQAogCiAJLyoKIAkgKiBPbmNlIHdlJ3ZlIGFzc29jaWF0ZWQgYSBiYWNrY2hhbm5lbCB4cHJ0IHdpdGggYSBjb25uZWN0aW9uLAotCSAqIHdlIHdhbnQgdG8ga2VlcCBpdCBhcm91bmQgYXMgbG9uZyBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uCi0JICogbGFzdHMsIGluIGNhc2Ugd2UgbmVlZCB0byBzdGFydCB1c2luZyBpdCBmb3IgYSBiYWNrY2hhbm5lbAotCSAqIGFnYWluOyB0aGlzIHJlZmVyZW5jZSB3b24ndCBiZSBkcm9wcGVkIHVudGlsIGJjX3hwcnQgaXMKLQkgKiBkZXN0cm95ZWQuCisJICogd2Ugd2FudCB0byBrZWVwIGl0IGFyb3VuZCBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGxhc3RzLAorCSAqIGluIGNhc2Ugd2UgbmVlZCB0byBzdGFydCB1c2luZyBpdCBmb3IgYSBiYWNrY2hhbm5lbCBhZ2FpbjsKKwkgKiB0aGlzIHJlZmVyZW5jZSB3b24ndCBiZSBkcm9wcGVkIHVudGlsIGJjX3hwcnQgaXMgZGVzdHJveWVkLgogCSAqLwogCXhwcnRfZ2V0KHhwcnQpOwogCWFyZ3MtPmJjX3hwcnQtPnhwdF9iY194cHJ0ID0geHBydDsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IGQ4OWRlZTIuLjAxMDg5MmIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtMjAzLDggKzIwMywxMSBAQAogCiAJcmRldi0+b3BlbmNvdW50LS07CiAKLQlXQVJOX09OKHJkZXYtPnNjYW5fcmVxICYmIHJkZXYtPnNjYW5fcmVxLT53ZGV2ID09IHdkZXYgJiYKLQkJIXJkZXYtPnNjYW5fcmVxLT5ub3RpZmllZCk7CisJaWYgKHJkZXYtPnNjYW5fcmVxICYmIHJkZXYtPnNjYW5fcmVxLT53ZGV2ID09IHdkZXYpIHsKKwkJaWYgKFdBUk5fT04oIXJkZXYtPnNjYW5fcmVxLT5ub3RpZmllZCkpCisJCQlyZGV2LT5zY2FuX3JlcS0+YWJvcnRlZCA9IHRydWU7CisJCV9fX2NmZzgwMjExX3NjYW5fZG9uZShyZGV2LCBmYWxzZSk7CisJfQogfQogCiBzdGF0aWMgaW50IGNmZzgwMjExX3Jma2lsbF9zZXRfYmxvY2sodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQpAQCAtNDQwLDkgKzQ0Myw2IEBACiAJaW50IGk7CiAJdTE2IGlmbW9kZXMgPSB3aXBoeS0+aW50ZXJmYWNlX21vZGVzOwogCi0JLyogc3VwcG9ydCBmb3IgNS8xMCBNSHogaXMgYnJva2VuIGR1ZSB0byBubDgwMjExIEFQSSBtZXNzIC0gZGlzYWJsZSAqLwotCXdpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19TVVBQT1JUU181XzEwX01IWjsKLQogCS8qCiAJICogVGhlcmUgYXJlIG1ham9yIGxvY2tpbmcgcHJvYmxlbXMgaW4gbmw4MDIxMS9tYWM4MDIxMSBmb3IgQ1NBLAogCSAqIGRpc2FibGUgZm9yIGFsbCBkcml2ZXJzIHVudGlsIHRoaXMgaGFzIGJlZW4gcmV3b3JrZWQuCkBAIC04NTksOCArODU5LDExIEBACiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX0RPV046CiAJCWNmZzgwMjExX3VwZGF0ZV9pZmFjZV9udW0ocmRldiwgd2Rldi0+aWZ0eXBlLCAtMSk7Ci0JCVdBUk5fT04ocmRldi0+c2Nhbl9yZXEgJiYgcmRldi0+c2Nhbl9yZXEtPndkZXYgPT0gd2RldiAmJgotCQkJIXJkZXYtPnNjYW5fcmVxLT5ub3RpZmllZCk7CisJCWlmIChyZGV2LT5zY2FuX3JlcSAmJiByZGV2LT5zY2FuX3JlcS0+d2RldiA9PSB3ZGV2KSB7CisJCQlpZiAoV0FSTl9PTighcmRldi0+c2Nhbl9yZXEtPm5vdGlmaWVkKSkKKwkJCQlyZGV2LT5zY2FuX3JlcS0+YWJvcnRlZCA9IHRydWU7CisJCQlfX19jZmc4MDIxMV9zY2FuX2RvbmUocmRldiwgZmFsc2UpOworCQl9CiAKIAkJaWYgKFdBUk5fT04ocmRldi0+c2NoZWRfc2Nhbl9yZXEgJiYKIAkJCSAgICByZGV2LT5zY2hlZF9zY2FuX3JlcS0+ZGV2ID09IHdkZXYtPm5ldGRldikpIHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IDM3ZWMxNmQuLmYxZDE5M2IgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtNjIsNiArNjIsNyBAQAogCXN0cnVjdCByYl9yb290IGJzc190cmVlOwogCXUzMiBic3NfZ2VuZXJhdGlvbjsKIAlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcTsgLyogcHJvdGVjdGVkIGJ5IFJUTkwgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2Nhbl9tc2c7CiAJc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqc2NoZWRfc2Nhbl9yZXE7CiAJdW5zaWduZWQgbG9uZyBzdXNwZW5kX2F0OwogCXN0cnVjdCB3b3JrX3N0cnVjdCBzY2FuX2RvbmVfd2s7CkBAIC0zNjEsNyArMzYyLDggQEAKIAkJCQkgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zLCBpbnQga2V5X2lkeCwKIAkJCQkgICBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIpOwogdm9pZCBfX2NmZzgwMjExX3NjYW5fZG9uZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndrKTsKLXZvaWQgX19fY2ZnODAyMTFfc2Nhbl9kb25lKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldik7Cit2b2lkIF9fX2NmZzgwMjExX3NjYW5fZG9uZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgICBib29sIHNlbmRfbWVzc2FnZSk7CiB2b2lkIF9fY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd2spOwogaW50IF9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgICBib29sIGRyaXZlcl9pbml0aWF0ZWQpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggN2E3NDI1OS4uNGZlMmU2ZSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYworKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCkBAIC0xNzE5LDkgKzE3MTksMTAgQEAKIAkJCQkgKiBXZSBjYW4gdGhlbiByZXRyeSB3aXRoIHRoZSBsYXJnZXIgYnVmZmVyLgogCQkJCSAqLwogCQkJCWlmICgocmV0ID09IC1FTk9CVUZTIHx8IHJldCA9PSAtRU1TR1NJWkUpICYmCi0JCQkJICAgICFza2ItPmxlbiAmJgorCQkJCSAgICAhc2tiLT5sZW4gJiYgIXN0YXRlLT5zcGxpdCAmJgogCQkJCSAgICBjYi0+bWluX2R1bXBfYWxsb2MgPCA0MDk2KSB7CiAJCQkJCWNiLT5taW5fZHVtcF9hbGxvYyA9IDQwOTY7CisJCQkJCXN0YXRlLT5zcGxpdF9zdGFydCA9IDA7CiAJCQkJCXJ0bmxfdW5sb2NrKCk7CiAJCQkJCXJldHVybiAxOwogCQkJCX0KQEAgLTUyNDQsNyArNTI0NSw3IEBACiAJaWYgKCFyZGV2LT5vcHMtPnNjYW4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChyZGV2LT5zY2FuX3JlcSkgeworCWlmIChyZGV2LT5zY2FuX3JlcSB8fCByZGV2LT5zY2FuX21zZykgewogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gdW5sb2NrOwogCX0KQEAgLTEwMDExLDQwICsxMDAxMiwzMSBAQAogCQkJCU5MODAyMTFfTUNHUlBfU0NBTiwgR0ZQX0tFUk5FTCk7CiB9CiAKLXZvaWQgbmw4MDIxMV9zZW5kX3NjYW5fZG9uZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKK3N0cnVjdCBza19idWZmICpubDgwMjExX2J1aWxkX3NjYW5fbXNnKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgYm9vbCBhYm9ydGVkKQogewogCXN0cnVjdCBza19idWZmICptc2c7CiAKIAltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1zZykKLQkJcmV0dXJuOworCQlyZXR1cm4gTlVMTDsKIAogCWlmIChubDgwMjExX3NlbmRfc2Nhbl9tc2cobXNnLCByZGV2LCB3ZGV2LCAwLCAwLCAwLAotCQkJCSAgTkw4MDIxMV9DTURfTkVXX1NDQU5fUkVTVUxUUykgPCAwKSB7CisJCQkJICBhYm9ydGVkID8gTkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEIDoKKwkJCQkJICAgIE5MODAyMTFfQ01EX05FV19TQ0FOX1JFU1VMVFMpIDwgMCkgewogCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMoJm5sODAyMTFfZmFtLCB3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAotCQkJCU5MODAyMTFfTUNHUlBfU0NBTiwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIG1zZzsKIH0KIAotdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9hYm9ydGVkKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQordm9pZCBubDgwMjExX3NlbmRfc2Nhbl9yZXN1bHQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKm1zZykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwotCi0JbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtc2cpCiAJCXJldHVybjsKIAotCWlmIChubDgwMjExX3NlbmRfc2Nhbl9tc2cobXNnLCByZGV2LCB3ZGV2LCAwLCAwLCAwLAotCQkJCSAgTkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQotCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMoJm5sODAyMTFfZmFtLCB3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCU5MODAyMTFfTUNHUlBfU0NBTiwgR0ZQX0tFUk5FTCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCBiMWIyMzEzLi43NTc5OTc0IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTgsMTAgKzgsMTAgQEAKIHZvaWQgbmw4MDIxMV9ub3RpZnlfZGV2X3JlbmFtZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpOwogdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9zdGFydChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwotdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9kb25lKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLXZvaWQgbmw4MDIxMV9zZW5kX3NjYW5fYWJvcnRlZChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CitzdHJ1Y3Qgc2tfYnVmZiAqbmw4MDIxMV9idWlsZF9zY2FuX21zZyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIGJvb2wgYWJvcnRlZCk7Cit2b2lkIG5sODAyMTFfc2VuZF9zY2FuX3Jlc3VsdChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbXNnKTsKIHZvaWQgbmw4MDIxMV9zZW5kX3NjaGVkX3NjYW4oc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgY21kKTsKIHZvaWQgbmw4MDIxMV9zZW5kX3NjaGVkX3NjYW5fcmVzdWx0cyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwppbmRleCBiNTI4ZTMxLi5kMWVkNGFlIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jCisrKyBiL25ldC93aXJlbGVzcy9zY2FuLmMKQEAgLTE2MSwxOCArMTYxLDI1IEBACiAJCWRldi0+YnNzX2dlbmVyYXRpb24rKzsKIH0KIAotdm9pZCBfX19jZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2KQordm9pZCBfX19jZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICAgYm9vbCBzZW5kX21lc3NhZ2UpCiB7CiAJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdDsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OworCXN0cnVjdCBza19idWZmICptc2c7CiAjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFQKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAjZW5kaWYKIAogCUFTU0VSVF9SVE5MKCk7CiAKLQlyZXF1ZXN0ID0gcmRldi0+c2Nhbl9yZXE7CisJaWYgKHJkZXYtPnNjYW5fbXNnKSB7CisJCW5sODAyMTFfc2VuZF9zY2FuX3Jlc3VsdChyZGV2LCByZGV2LT5zY2FuX21zZyk7CisJCXJkZXYtPnNjYW5fbXNnID0gTlVMTDsKKwkJcmV0dXJuOworCX0KIAorCXJlcXVlc3QgPSByZGV2LT5zY2FuX3JlcTsKIAlpZiAoIXJlcXVlc3QpCiAJCXJldHVybjsKIApAQCAtMTg2LDE4ICsxOTMsMTYgQEAKIAlpZiAod2Rldi0+bmV0ZGV2KQogCQljZmc4MDIxMV9zbWVfc2Nhbl9kb25lKHdkZXYtPm5ldGRldik7CiAKLQlpZiAocmVxdWVzdC0+YWJvcnRlZCkgewotCQlubDgwMjExX3NlbmRfc2Nhbl9hYm9ydGVkKHJkZXYsIHdkZXYpOwotCX0gZWxzZSB7Ci0JCWlmIChyZXF1ZXN0LT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX0ZMVVNIKSB7Ci0JCQkvKiBmbHVzaCBlbnRyaWVzIGZyb20gcHJldmlvdXMgc2NhbnMgKi8KLQkJCXNwaW5fbG9ja19iaCgmcmRldi0+YnNzX2xvY2spOwotCQkJX19jZmc4MDIxMV9ic3NfZXhwaXJlKHJkZXYsIHJlcXVlc3QtPnNjYW5fc3RhcnQpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKLQkJfQotCQlubDgwMjExX3NlbmRfc2Nhbl9kb25lKHJkZXYsIHdkZXYpOworCWlmICghcmVxdWVzdC0+YWJvcnRlZCAmJgorCSAgICByZXF1ZXN0LT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX0ZMVVNIKSB7CisJCS8qIGZsdXNoIGVudHJpZXMgZnJvbSBwcmV2aW91cyBzY2FucyAqLworCQlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKKwkJX19jZmc4MDIxMV9ic3NfZXhwaXJlKHJkZXYsIHJlcXVlc3QtPnNjYW5fc3RhcnQpOworCQlzcGluX3VubG9ja19iaCgmcmRldi0+YnNzX2xvY2spOwogCX0KIAorCW1zZyA9IG5sODAyMTFfYnVpbGRfc2Nhbl9tc2cocmRldiwgd2RldiwgcmVxdWVzdC0+YWJvcnRlZCk7CisKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCWlmICh3ZGV2LT5uZXRkZXYgJiYgIXJlcXVlc3QtPmFib3J0ZWQpIHsKIAkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwpAQCAtMjExLDYgKzIxNiwxMSBAQAogCiAJcmRldi0+c2Nhbl9yZXEgPSBOVUxMOwogCWtmcmVlKHJlcXVlc3QpOworCisJaWYgKCFzZW5kX21lc3NhZ2UpCisJCXJkZXYtPnNjYW5fbXNnID0gbXNnOworCWVsc2UKKwkJbmw4MDIxMV9zZW5kX3NjYW5fcmVzdWx0KHJkZXYsIG1zZyk7CiB9CiAKIHZvaWQgX19jZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IHdvcmtfc3RydWN0ICp3aykKQEAgLTIyMSw3ICsyMzEsNyBAQAogCQkJICAgIHNjYW5fZG9uZV93ayk7CiAKIAlydG5sX2xvY2soKTsKLQlfX19jZmc4MDIxMV9zY2FuX2RvbmUocmRldik7CisJX19fY2ZnODAyMTFfc2Nhbl9kb25lKHJkZXYsIHRydWUpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKQEAgLTEwNzksNyArMTA4OSw3IEBACiAJaWYgKElTX0VSUihyZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAKLQlpZiAocmRldi0+c2Nhbl9yZXEpIHsKKwlpZiAocmRldi0+c2Nhbl9yZXEgfHwgcmRldi0+c2Nhbl9tc2cpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNDgxLDcgKzE0OTEsNyBAQAogCWlmIChJU19FUlIocmRldikpCiAJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCi0JaWYgKHJkZXYtPnNjYW5fcmVxKQorCWlmIChyZGV2LT5zY2FuX3JlcSB8fCByZGV2LT5zY2FuX21zZykKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlyZXMgPSBpZWVlODAyMTFfc2Nhbl9yZXN1bHRzKHJkZXYsIGluZm8sIGV4dHJhLCBkYXRhLT5sZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IGE2MzUwOTEuLmYwNGQ0YzMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlBU1NFUlRfUkRFVl9MT0NLKHJkZXYpOwogCUFTU0VSVF9XREVWX0xPQ0sod2Rldik7CiAKLQlpZiAocmRldi0+c2Nhbl9yZXEpCisJaWYgKHJkZXYtPnNjYW5fcmVxIHx8IHJkZXYtPnNjYW5fbXNnKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKHdkZXYtPmNvbm4tPnBhcmFtcy5jaGFubmVsKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCmluZGV4IDBlYTJhMWUuLjQ2NGRjZWYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbAorKysgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCiAJJGNhbWVsY2FzZV9zZWVkZWQgPSAxOwogCi0JaWYgKC1kICIuZ2l0IikgeworCWlmICgtZSAiLmdpdCIpIHsKIAkJbXkgJGdpdF9sYXN0X2luY2x1ZGVfY29tbWl0ID0gYGdpdCBsb2cgLS1uby1tZXJnZXMgLS1wcmV0dHk9Zm9ybWF0OiIlaCVuIiAtMSAtLSBpbmNsdWRlYDsKIAkJY2hvbXAgJGdpdF9sYXN0X2luY2x1ZGVfY29tbWl0OwogCQkkY2FtZWxjYXNlX2NhY2hlID0gIi5jaGVja3BhdGNoLWNhbWVsY2FzZS5naXQuJGdpdF9sYXN0X2luY2x1ZGVfY29tbWl0IjsKQEAgLTQ5OSw3ICs0OTksNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKC1kICIuZ2l0IikgeworCWlmICgtZSAiLmdpdCIpIHsKIAkJJGZpbGVzID0gYGdpdCBscy1maWxlcyAiaW5jbHVkZS8qLmgiYDsKIAkJQGluY2x1ZGVfZmlsZXMgPSBzcGxpdCgnXG4nLCAkZmlsZXMpOwogCX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9hcGkvcG1fcnVudGltZS5jb2NjaSBiL3NjcmlwdHMvY29jY2luZWxsZS9hcGkvcG1fcnVudGltZS5jb2NjaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE3ODllCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9wbV9ydW50aW1lLmNvY2NpCkBAIC0wLDAgKzEsMTA5IEBACisvLy8gTWFrZSBzdXJlIHBtX3J1bnRpbWVfKiBjYWxscyBkb2VzIG5vdCB1c2UgdW5uZWNlc3NhcnkgSVNfRVJSX1ZBTFVFCisvLworLy8gS2V5d29yZHM6IHBtX3J1bnRpbWUKKy8vIENvbmZpZGVuY2U6IE1lZGl1bQorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIEdQTHYyLgorLy8gVVJMOiBodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLworLy8gT3B0aW9uczogLS1pbmNsdWRlLWhlYWRlcnMKKwordmlydHVhbCBwYXRjaAordmlydHVhbCBjb250ZXh0Cit2aXJ0dWFsIG9yZwordmlydHVhbCByZXBvcnQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGV0ZWN0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQHJ1bnRpbWVfYmFkX2Vycl9oYW5kbGUgZXhpc3RzQAorZXhwcmVzc2lvbiByZXQ7CitAQAorKAorcmV0ID0gXChwbV9ydW50aW1lX2lkbGVcfAorCXBtX3J1bnRpbWVfc3VzcGVuZFx8CisJcG1fcnVudGltZV9hdXRvc3VzcGVuZFx8CisJcG1fcnVudGltZV9yZXN1bWVcfAorCXBtX3JlcXVlc3RfaWRsZVx8CisJcG1fcmVxdWVzdF9yZXN1bWVcfAorCXBtX3JlcXVlc3RfYXV0b3N1c3BlbmRcfAorCXBtX3J1bnRpbWVfZ2V0XHwKKwlwbV9ydW50aW1lX2dldF9zeW5jXHwKKwlwbV9ydW50aW1lX3B1dFx8CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmRcfAorCXBtX3J1bnRpbWVfcHV0X3N5bmNcfAorCXBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZFx8CisJcG1fcnVudGltZV9wdXRfc3luY19hdXRvc3VzcGVuZFx8CisJcG1fcnVudGltZV9zZXRfYWN0aXZlXHwKKwlwbV9zY2hlZHVsZV9zdXNwZW5kXHwKKwlwbV9ydW50aW1lX2JhcnJpZXJcfAorCXBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kXHwKKwlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lXCkoLi4uKTsKKy4uLgorSVNfRVJSX1ZBTFVFKHJldCkKKy4uLgorKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgY29udGV4dCBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQGRlcGVuZHMgb24gcnVudGltZV9iYWRfZXJyX2hhbmRsZSAmJiBjb250ZXh0QAoraWRlbnRpZmllciBwbV9ydW50aW1lX2FwaTsKK2V4cHJlc3Npb24gcmV0OworQEAKKygKK3JldCA9IHBtX3J1bnRpbWVfYXBpKC4uLik7CisuLi4KKyogSVNfRVJSX1ZBTFVFKHJldCkKKy4uLgorKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgcGF0Y2ggbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0BkZXBlbmRzIG9uIHJ1bnRpbWVfYmFkX2Vycl9oYW5kbGUgJiYgcGF0Y2hACitpZGVudGlmaWVyIHBtX3J1bnRpbWVfYXBpOworZXhwcmVzc2lvbiByZXQ7CitAQAorKAorcmV0ID0gcG1fcnVudGltZV9hcGkoLi4uKTsKKy4uLgorLSBJU19FUlJfVkFMVUUocmV0KQorKyByZXQgPCAwCisuLi4KKykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRm9yIG9yZyBhbmQgcmVwb3J0IG1vZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAciBkZXBlbmRzIG9uIHJ1bnRpbWVfYmFkX2Vycl9oYW5kbGUgZXhpc3RzQAorcG9zaXRpb24gcDEsIHAyOworaWRlbnRpZmllciBwbV9ydW50aW1lX2FwaTsKK2V4cHJlc3Npb24gcmV0OworQEAKKygKK3JldCA9IHBtX3J1bnRpbWVfYXBpQHAxKC4uLik7CisuLi4KK0lTX0VSUl9WQUxVRUBwMihyZXQpCisuLi4KKykKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACitwMSA8PCByLnAxOworcDIgPDwgci5wMjsKK3BtX3J1bnRpbWVfYXBpIDw8IHIucG1fcnVudGltZV9hcGk7CitAQAorCitjb2NjaS5wcmludF9tYWluKHBtX3J1bnRpbWVfYXBpLHAxKQorY29jY2kucHJpbnRfc2VjcygiSVNfRVJSX1ZBTFVFIixwMikKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiByZXBvcnRACitwMSA8PCByLnAxOworcDIgPDwgci5wMjsKK3BtX3J1bnRpbWVfYXBpIDw8IHIucG1fcnVudGltZV9hcGk7CitAQAorCittc2cgPSAiJXMgcmV0dXJucyA8IDAgYXMgZXJyb3IuIFVuZWNlc3NhcnkgSVNfRVJSX1ZBTFVFIGF0IGxpbmUgJXMiICUgKHBtX3J1bnRpbWVfYXBpLCBwMlswXS5saW5lKQorY29jY2lsaWIucmVwb3J0LnByaW50X3JlcG9ydChwMVswXSxtc2cpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsIGIvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAppbmRleCA5YzM5ODZmLi40MTk4Nzg4IDEwMDc1NQotLS0gYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCisrKyBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKQEAgLTk1LDcgKzk1LDcgQEAKIAogbXkgJVZDU19jbWRzX2dpdCA9ICgKICAgICAiZXhlY3V0ZV9jbWQiID0+IFwmZ2l0X2V4ZWN1dGVfY21kLAotICAgICJhdmFpbGFibGUiID0+ICcod2hpY2goImdpdCIpIG5lICIiKSAmJiAoLWQgIi5naXQiKScsCisgICAgImF2YWlsYWJsZSIgPT4gJyh3aGljaCgiZ2l0IikgbmUgIiIpICYmICgtZSAiLmdpdCIpJywKICAgICAiZmluZF9zaWduZXJzX2NtZCIgPT4KIAkiZ2l0IGxvZyAtLW5vLWNvbG9yIC0tZm9sbG93IC0tc2luY2U9XCRlbWFpbF9naXRfc2luY2UgIiAuCiAJICAgICctLW51bXN0YXQgLS1uby1tZXJnZXMgJyAuCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKaW5kZXggOTBlNTIxZi4uZjQ2ZTRkZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCisrKyBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgpAQCAtNDEsOSArNDEsOSBAQAogCXBhcmlzYyopCiAJCWRlYmFyY2g9aHBwYSA7OwogCW1pcHMqKQotCQlkZWJhcmNoPW1pcHMkKGdyZXAgLXEgQ1BVX0xJVFRMRV9FTkRJQU49eSAkS0NPTkZJR19DT05GSUcgJiYgZWNobyBlbCkgOzsKKwkJZGViYXJjaD1taXBzJChncmVwIC1xIENQVV9MSVRUTEVfRU5ESUFOPXkgJEtDT05GSUdfQ09ORklHICYmIGVjaG8gZWwgfHwgdHJ1ZSkgOzsKIAlhcm0qKQotCQlkZWJhcmNoPWFybSQoZ3JlcCAtcSBDT05GSUdfQUVBQkk9eSAkS0NPTkZJR19DT05GSUcgJiYgZWNobyBlbCkgOzsKKwkJZGViYXJjaD1hcm0kKGdyZXAgLXEgQ09ORklHX0FFQUJJPXkgJEtDT05GSUdfQ09ORklHICYmIGVjaG8gZWwgfHwgdHJ1ZSkgOzsKIAkqKQogCQllY2hvICIiID4mMgogCQllY2hvICIqKiAqKiAqKiAgV0FSTklORyAgKiogKiogKioiID4mMgpAQCAtNjIsNyArNjIsNyBAQAogCWZpCiAKIAkjIENyZWF0ZSB0aGUgcGFja2FnZQotCWRwa2ctZ2VuY29udHJvbCAtaXNwICRmb3JjZWFyY2ggLXAkcG5hbWUgLVAiJHBkaXIiCisJZHBrZy1nZW5jb250cm9sIC1pc3AgJGZvcmNlYXJjaCAtVmtlcm5lbDpkZWJhcmNoPSIke2RlYmFyY2g6LSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSl9IiAtcCRwbmFtZSAtUCIkcGRpciIKIAlkcGtnIC0tYnVpbGQgIiRwZGlyIiAuLgogfQogCkBAIC0xNzIsOCArMTcyLDE1IEBACiAKICMgSW5zdGFsbCB0aGUgbWFpbnRhaW5lciBzY3JpcHRzCiAjIE5vdGU6IGhvb2sgc2NyaXB0cyB1bmRlciAvZXRjL2tlcm5lbCBhcmUgYWxzbyBleGVjdXRlZCBieSBvZmZpY2lhbCBEZWJpYW4KLSMga2VybmVsIHBhY2thZ2VzLCBhcyB3ZWxsIGFzIGtlcm5lbCBwYWNrYWdlcyBidWlsdCB1c2luZyBtYWtlLWtwa2cKKyMga2VybmVsIHBhY2thZ2VzLCBhcyB3ZWxsIGFzIGtlcm5lbCBwYWNrYWdlcyBidWlsdCB1c2luZyBtYWtlLWtwa2cuCisjIG1ha2Uta3BrZyBzZXRzICRJTklUUkQgdG8gaW5kaWNhdGUgd2hldGhlciBhbiBpbml0cmFtZnMgaXMgd2FudGVkLCBhbmQKKyMgc28gZG8gd2U7IHJlY2VudCB2ZXJzaW9ucyBvZiBkcmFjdXQgYW5kIGluaXRyYW1mcy10b29scyB3aWxsIG9iZXkgdGhpcy4KIGRlYmhvb2tkaXI9JHtLREVCX0hPT0tESVI6LS9ldGMva2VybmVsfQoraWYgZ3JlcCAtcSAnXkNPTkZJR19CTEtfREVWX0lOSVRSRD15JyAkS0NPTkZJR19DT05GSUc7IHRoZW4KKwl3YW50X2luaXRyZD1ZZXMKK2Vsc2UKKwl3YW50X2luaXRyZD1ObworZmkKIGZvciBzY3JpcHQgaW4gcG9zdGluc3QgcG9zdHJtIHByZWluc3QgcHJlcm0gOyBkbwogCW1rZGlyIC1wICIkdG1wZGlyJGRlYmhvb2tkaXIvJHNjcmlwdC5kIgogCWNhdCA8PEVPRiA+ICIkdG1wZGlyL0RFQklBTi8kc2NyaXB0IgpAQCAtMTg0LDYgKzE5MSw5IEBACiAjIFBhc3MgbWFpbnRhaW5lciBzY3JpcHQgcGFyYW1ldGVycyB0byBob29rIHNjcmlwdHMKIGV4cG9ydCBERUJfTUFJTlRfUEFSQU1TPSJcJCoiCiAKKyMgVGVsbCBpbml0cmFtZnMgYnVpbGRlciB3aGV0aGVyIGl0J3Mgd2FudGVkCitleHBvcnQgSU5JVFJEPSR3YW50X2luaXRyZAorCiB0ZXN0IC1kICRkZWJob29rZGlyLyRzY3JpcHQuZCAmJiBydW4tcGFydHMgLS1hcmc9IiR2ZXJzaW9uIiAtLWFyZz0iLyRpbnN0YWxsZWRfaW1hZ2VfcGF0aCIgJGRlYmhvb2tkaXIvJHNjcmlwdC5kCiBleGl0IDAKIEVPRgpAQCAtMjg4LDE1ICsyOTgsMTQgQEAKIChjZCAkb2JqdHJlZTsgY3AgJEtDT05GSUdfQ09ORklHICRkZXN0ZGlyLy5jb25maWcpICMgY29weSAuY29uZmlnIG1hbnVhbGx5IHRvIGJlIHdoZXJlIGl0J3MgZXhwZWN0ZWQgdG8gYmUKIGxuIC1zZiAiL3Vzci9zcmMvbGludXgtaGVhZGVycy0kdmVyc2lvbiIgIiRrZXJuZWxfaGVhZGVyc19kaXIvbGliL21vZHVsZXMvJHZlcnNpb24vYnVpbGQiCiBybSAtZiAiJG9ianRyZWUvZGViaWFuL2hkcnNyY2ZpbGVzIiAiJG9ianRyZWUvZGViaWFuL2hkcm9iamZpbGVzIgotYXJjaD0kKGRwa2cgLS1wcmludC1hcmNoaXRlY3R1cmUpCiAKIGNhdCA8PEVPRiA+PiBkZWJpYW4vY29udHJvbAogCiBQYWNrYWdlOiAka2VybmVsX2hlYWRlcnNfcGFja2FnZW5hbWUKIFByb3ZpZGVzOiBsaW51eC1oZWFkZXJzLCBsaW51eC1oZWFkZXJzLTIuNgotQXJjaGl0ZWN0dXJlOiAkYXJjaAotRGVzY3JpcHRpb246IExpbnV4IGtlcm5lbCBoZWFkZXJzIGZvciAkS0VSTkVMUkVMRUFTRSBvbiAkYXJjaAotIFRoaXMgcGFja2FnZSBwcm92aWRlcyBrZXJuZWwgaGVhZGVyIGZpbGVzIGZvciAkS0VSTkVMUkVMRUFTRSBvbiAkYXJjaAorQXJjaGl0ZWN0dXJlOiBhbnkKK0Rlc2NyaXB0aW9uOiBMaW51eCBrZXJuZWwgaGVhZGVycyBmb3IgJEtFUk5FTFJFTEVBU0Ugb24gXCR7a2VybmVsOmRlYmFyY2h9CisgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGtlcm5lbCBoZWFkZXIgZmlsZXMgZm9yICRLRVJORUxSRUxFQVNFIG9uIFwke2tlcm5lbDpkZWJhcmNofQogIC4KICBUaGlzIGlzIHVzZWZ1bCBmb3IgcGVvcGxlIHdobyBuZWVkIHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKIEVPRgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gYi9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbgppbmRleCBkMTA1YTQ0Li42M2Q5MWUyIDEwMDc1NQotLS0gYS9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbgorKysgYi9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbgpAQCAtNDMsNyArNDMsOCBAQAogCWZpCiAKIAkjIENoZWNrIGZvciBnaXQgYW5kIGEgZ2l0IHJlcG8uCi0JaWYgdGVzdCAtZCAuZ2l0ICYmIGhlYWQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgLS1zaG9ydCBIRUFEIDI+L2Rldi9udWxsYDsgdGhlbgorCWlmIHRlc3QgLXogIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctY2R1cCAyPi9kZXYvbnVsbCkiICYmCisJICAgaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAtLXNob3J0IEhFQUQgMj4vZGV2L251bGxgOyB0aGVuCiAKIAkJIyBJZiB3ZSBhcmUgYXQgYSB0YWdnZWQgY29tbWl0IChsaWtlICJ2Mi42LjMwLXJjNiIpLCB3ZSBpZ25vcmUKIAkJIyBpdCwgYmVjYXVzZSB0aGlzIHZlcnNpb24gaXMgZGVmaW5lZCBpbiB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvS2NvbmZpZyBiL3NlY3VyaXR5L0tjb25maWcKaW5kZXggZTljNmFjNy4uYmViODZiNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvS2NvbmZpZworKysgYi9zZWN1cml0eS9LY29uZmlnCkBAIC0xMDMsNyArMTAzLDcgQEAKIGNvbmZpZyBMU01fTU1BUF9NSU5fQUREUgogCWludCAiTG93IGFkZHJlc3Mgc3BhY2UgZm9yIExTTSB0byBwcm90ZWN0IGZyb20gdXNlciBhbGxvY2F0aW9uIgogCWRlcGVuZHMgb24gU0VDVVJJVFkgJiYgU0VDVVJJVFlfU0VMSU5VWAotCWRlZmF1bHQgMzI3NjggaWYgQVJNCisJZGVmYXVsdCAzMjc2OCBpZiBBUk0gfHwgKEFSTTY0ICYmIENPTVBBVCkKIAlkZWZhdWx0IDY1NTM2CiAJaGVscAogCSAgVGhpcyBpcyB0aGUgcG9ydGlvbiBvZiBsb3cgdmlydHVhbCBtZW1vcnkgd2hpY2ggc2hvdWxkIGJlIHByb3RlY3RlZApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCmluZGV4IDMzMmFjOGEuLjJkZjdiOTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KICNpbmNsdWRlIDxsaW51eC94ZnJtLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrX2RpYWcuaD4KIAogI2luY2x1ZGUgImZsYXNrLmgiCiAjaW5jbHVkZSAiYXZfcGVybWlzc2lvbnMuaCIKQEAgLTc4LDYgKzc5LDcgQEAKIHsKIAl7IFRDUERJQUdfR0VUU09DSywJTkVUTElOS19UQ1BESUFHX1NPQ0tFVF9fTkxNU0dfUkVBRCB9LAogCXsgRENDUERJQUdfR0VUU09DSywJTkVUTElOS19UQ1BESUFHX1NPQ0tFVF9fTkxNU0dfUkVBRCB9LAorCXsgU09DS19ESUFHX0JZX0ZBTUlMWSwJTkVUTElOS19UQ1BESUFHX1NPQ0tFVF9fTkxNU0dfUkVBRCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBubG1zZ19wZXJtIG5sbXNnX3hmcm1fcGVybXNbXSA9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggYzkzYzIxMS4uNWQwMTQ0ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtMTIzMiw2ICsxMjMyLDEwIEBACiAJc3RydWN0IGNvbnRleHQgY29udGV4dDsKIAlpbnQgcmMgPSAwOwogCisJLyogQW4gZW1wdHkgc2VjdXJpdHkgY29udGV4dCBpcyBuZXZlciB2YWxpZC4gKi8KKwlpZiAoIXNjb250ZXh0X2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIXNzX2luaXRpYWxpemVkKSB7CiAJCWludCBpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luaXQuYyBiL3NvdW5kL2NvcmUvaW5pdC5jCmluZGV4IDEzNTFmMjIuLjBkNDJmY2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvaW5pdC5jCkBAIC0xMzEsNiArMTMxLDMxIEBACiAjZGVmaW5lIGluaXRfaW5mb19mb3JfY2FyZChjYXJkKQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgY2hlY2tfZW1wdHlfc2xvdChzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBzbG90KQoreworCXJldHVybiAhc2xvdHNbc2xvdF0gfHwgISpzbG90c1tzbG90XTsKK30KKworLyogcmV0dXJuIGFuIGVtcHR5IHNsb3QgbnVtYmVyICg+PSAwKSBmb3VuZCBpbiB0aGUgZ2l2ZW4gYml0bWFzayBAbWFzay4KKyAqIEBtYXNrID09IC0xID09IDB4ZmZmZmZmZmYgbWVhbnM6IHRha2UgYW55IGZyZWUgc2xvdCB1cCB0byAzMgorICogd2hlbiBubyBzbG90IGlzIGF2YWlsYWJsZSwgcmV0dXJuIHRoZSBvcmlnaW5hbCBAbWFzayBhcyBpcy4KKyAqLworc3RhdGljIGludCBnZXRfc2xvdF9mcm9tX2JpdG1hc2soaW50IG1hc2ssIGludCAoKmNoZWNrKShzdHJ1Y3QgbW9kdWxlICosIGludCksCisJCQkJIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKwlpbnQgc2xvdDsKKworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBTTkRSVl9DQVJEUzsgc2xvdCsrKSB7CisJCWlmIChzbG90IDwgMzIgJiYgIShtYXNrICYgKDFVIDw8IHNsb3QpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXRlc3RfYml0KHNsb3QsIHNuZF9jYXJkc19sb2NrKSkgeworCQkJaWYgKGNoZWNrKG1vZHVsZSwgc2xvdCkpCisJCQkJcmV0dXJuIHNsb3Q7IC8qIGZvdW5kICovCisJCX0KKwl9CisJcmV0dXJuIG1hc2s7IC8qIHVuY2hhbmdlZCAqLworfQorCiAvKioKICAqICBzbmRfY2FyZF9jcmVhdGUgLSBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBzb3VuZGNhcmQgc3RydWN0dXJlCiAgKiAgQGlkeDogY2FyZCBpbmRleCAoYWRkcmVzcykgWzAgLi4uIChTTkRSVl9DQVJEUy0xKV0KQEAgLTE1Miw3ICsxNzcsNyBAQAogCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCWludCBlcnIsIGlkeDI7CisJaW50IGVycjsKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkX3JldCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTY3LDMyICsxOTIsMTAgQEAKIAkJc3RybGNweShjYXJkLT5pZCwgeGlkLCBzaXplb2YoY2FyZC0+aWQpKTsKIAllcnIgPSAwOwogCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKLQlpZiAoaWR4IDwgMCkgewotCQlmb3IgKGlkeDIgPSAwOyBpZHgyIDwgU05EUlZfQ0FSRFM7IGlkeDIrKykgewotCQkJLyogaWR4ID09IC0xID09IDB4ZmZmZiBtZWFuczogdGFrZSBhbnkgZnJlZSBzbG90ICovCi0JCQlpZiAoaWR4MiA8IHNpemVvZihpbnQpICYmICEoaWR4ICYgKDFVIDw8IGlkeDIpKSkKLQkJCQljb250aW51ZTsKLQkJCWlmICghdGVzdF9iaXQoaWR4Miwgc25kX2NhcmRzX2xvY2spKSB7Ci0JCQkJaWYgKG1vZHVsZV9zbG90X21hdGNoKG1vZHVsZSwgaWR4MikpIHsKLQkJCQkJaWR4ID0gaWR4MjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmIChpZHggPCAwKSB7Ci0JCWZvciAoaWR4MiA9IDA7IGlkeDIgPCBTTkRSVl9DQVJEUzsgaWR4MisrKSB7Ci0JCQkvKiBpZHggPT0gLTEgPT0gMHhmZmZmIG1lYW5zOiB0YWtlIGFueSBmcmVlIHNsb3QgKi8KLQkJCWlmIChpZHgyIDwgc2l6ZW9mKGludCkgJiYgIShpZHggJiAoMVUgPDwgaWR4MikpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCF0ZXN0X2JpdChpZHgyLCBzbmRfY2FyZHNfbG9jaykpIHsKLQkJCQlpZiAoIXNsb3RzW2lkeDJdIHx8ICEqc2xvdHNbaWR4Ml0pIHsKLQkJCQkJaWR4ID0gaWR4MjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorCWlmIChpZHggPCAwKSAvKiBmaXJzdCBjaGVjayB0aGUgbWF0Y2hpbmcgbW9kdWxlLW5hbWUgc2xvdCAqLworCQlpZHggPSBnZXRfc2xvdF9mcm9tX2JpdG1hc2soaWR4LCBtb2R1bGVfc2xvdF9tYXRjaCwgbW9kdWxlKTsKKwlpZiAoaWR4IDwgMCkgLyogaWYgbm90IG1hdGNoZWQsIGFzc2lnbiBhbiBlbXB0eSBzbG90ICovCisJCWlkeCA9IGdldF9zbG90X2Zyb21fYml0bWFzayhpZHgsIGNoZWNrX2VtcHR5X3Nsb3QsIG1vZHVsZSk7CiAJaWYgKGlkeCA8IDApCiAJCWVyciA9IC1FTk9ERVY7CiAJZWxzZSBpZiAoaWR4IDwgc25kX2VjYXJkc19saW1pdCkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCBmMThlNTg3Li4wNjIzOThlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMzY5LDYgKzM2OSw3IEBACiAJCQlrZnJlZShtb2R1bGUtPnNlZ21lbnRzW2ldLmRhdGEpOwogCQlrZnJlZShtb2R1bGUtPnNlZ21lbnRzKTsKIAl9CisJa2ZyZWUobW9kdWxlKTsKIH0KIAogLyogZmlybXdhcmUgYmluYXJ5IGZvcm1hdDoKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCmluZGV4IDJiNWQxOWUuLmFiMmE0NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaApAQCAtMzYxLDYgKzM2MSw3IEBACiAJdW5zaWduZWQgaW50IGVwc3M6MTsJCS8qIHN1cHBvcnRpbmcgRVBTUz8gKi8KIAl1bnNpZ25lZCBpbnQgY2FjaGVkX3dyaXRlOjE7CS8qIHdyaXRlIG9ubHkgdG8gY2FjaGVzICovCiAJdW5zaWduZWQgaW50IGRwX21zdDoxOyAvKiBzdXBwb3J0IERQMS4yIE11bHRpLXN0cmVhbSB0cmFuc3BvcnQgKi8KKwl1bnNpZ25lZCBpbnQgZHVtcF9jb2VmOjE7IC8qIGR1bXAgcHJvY2Vzc2luZyBjb2VmcyBpbiBjb2RlYyBwcm9jIGZpbGUgKi8KICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBpbnQgcG93ZXJfb24gOjE7CS8qIGN1cnJlbnQgKGdsb2JhbCkgcG93ZXItc3RhdGUgKi8KIAl1bnNpZ25lZCBpbnQgZDNfc3RvcF9jbGs6MTsJLyogc3VwcG9ydCBEMyBvcGVyYXRpb24gd2l0aG91dCBCQ0xLICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKaW5kZXggYThjYjIyZS4uY2U1YTZkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwpAQCAtMjQsOSArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKIAorc3RhdGljIGludCBkdW1wX2NvZWYgPSAtMTsKK21vZHVsZV9wYXJhbShkdW1wX2NvZWYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBfY29lZiwgIkR1bXAgcHJvY2Vzc2luZyBjb2VmZmljaWVudHMgaW4gY29kZWMgcHJvYyBmaWxlICgtMT1hdXRvLCAwPWRpc2FibGUsIDE9ZW5hYmxlKSIpOworCiBzdGF0aWMgY2hhciAqYml0c19uYW1lcyh1bnNpZ25lZCBpbnQgYml0cywgY2hhciAqbmFtZXNbXSwgaW50IHNpemUpCiB7CiAJaW50IGksIG47CkBAIC00ODgsMTQgKzQ5MywzOSBAQAogCQkgICAgKHVuc29sICYgQUNfVU5TT0xfRU5BQkxFRCkgPyAxIDogMCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBjYW5fZHVtcF9jb2VmKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN3aXRjaCAoZHVtcF9jb2VmKSB7CisJY2FzZSAwOiByZXR1cm4gZmFsc2U7CisJY2FzZSAxOiByZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OiByZXR1cm4gY29kZWMtPmR1bXBfY29lZjsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHByaW50X3Byb2NfY2FwcyhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsCiAJCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7CisJdW5zaWduZWQgaW50IGksIG5jb2VmZiwgb2xkaW5kZXg7CiAJdW5zaWduZWQgaW50IHByb2NfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAogCQkJCQkJICAgIEFDX1BBUl9QUk9DX0NBUCk7CisJbmNvZWZmID0gKHByb2NfY2FwcyAmIEFDX1BDQVBfTlVNX0NPRUYpID4+IEFDX1BDQVBfTlVNX0NPRUZfU0hJRlQ7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBQcm9jZXNzaW5nIGNhcHM6IGJlbmlnbj0lZCwgbmNvZWZmPSVkXG4iLAotCQkgICAgcHJvY19jYXBzICYgQUNfUENBUF9CRU5JR04sCi0JCSAgICAocHJvY19jYXBzICYgQUNfUENBUF9OVU1fQ09FRikgPj4gQUNfUENBUF9OVU1fQ09FRl9TSElGVCk7CisJCSAgICBwcm9jX2NhcHMgJiBBQ19QQ0FQX0JFTklHTiwgbmNvZWZmKTsKKworCWlmICghY2FuX2R1bXBfY29lZihjb2RlYykpCisJCXJldHVybjsKKworCS8qIE5vdGU6IFRoaXMgaXMgcmFjeSAtIGFub3RoZXIgcHJvY2VzcyBjb3VsZCBydW4gaW4gcGFyYWxsZWwgYW5kIGNoYW5nZQorCSAgIHRoZSBjb2VmIGluZGV4IHRvby4gKi8KKwlvbGRpbmRleCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT0VGX0lOREVYLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvZWZmOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbDsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCBpKTsKKwkJdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX1BST0NfQ09FRiwKKwkJCQkJIDApOworCQlzbmRfaXByaW50ZihidWZmZXIsICIgICAgQ29lZmYgMHglMDJ4OiAweCUwNHhcbiIsIGksIHZhbCk7CisJfQorCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgb2xkaW5kZXgpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9jb25uX2xpc3Qoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggN2E0MjZlZC4uZGYzNjUyYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0yNDQsNiArMjQ0LDE5IEBACiAJfQogfQogCisvKiBUb3NoaWJhIFNhdGVsbGl0ZSBMNDAgaW1wbGVtZW50cyBFQVBEIGluIGEgc3RhbmRhcmQgd2F5IHVubGlrZSBvdGhlcnMgKi8KK3N0YXRpYyB2b2lkIGFkMTk4NmFfZml4dXBfZWFwZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7CisJCWNvZGVjLT5pbnZfZWFwZCA9IDA7CisJCXNwZWMtPmdlbi5rZWVwX2VhcGRfb24gPSAxOworCQlzcGVjLT5lYXBkX25pZCA9IDB4MWI7CisJfQorfQorCiBlbnVtIHsKIAlBRDE5ODZBX0ZJWFVQX0lOVl9KQUNLX0RFVEVDVCwKIAlBRDE5ODZBX0ZJWFVQX1VMVFJBLApAQCAtMjUxLDYgKzI2NCw3IEBACiAJQUQxOTg2QV9GSVhVUF8zU1RBQ0ssCiAJQUQxOTg2QV9GSVhVUF9MQVBUT1AsCiAJQUQxOTg2QV9GSVhVUF9MQVBUT1BfSU1JQywKKwlBRDE5ODZBX0ZJWFVQX0VBUEQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9maXh1cCBhZDE5ODZhX2ZpeHVwc1tdID0gewpAQCAtMzExLDYgKzMyNSwxMCBAQAogCQkuY2hhaW5lZF9iZWZvcmUgPSAxLAogCQkuY2hhaW5faWQgPSBBRDE5ODZBX0ZJWFVQX0xBUFRPUCwKIAl9LAorCVtBRDE5ODZBX0ZJWFVQX0VBUERdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWQxOTg2YV9maXh1cF9lYXBkLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWQxOTg2YV9maXh1cF90YmxbXSA9IHsKQEAgLTMxOCw2ICszMzYsNyBAQAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwNDMsIDB4ZmYwMCwgMHg4MTAwLCAiQVNVUyBQNSIsIEFEMTk4NkFfRklYVVBfM1NUQUNLKSwKIAlTTkRfUENJX1FVSVJLX01BU0soMHgxMDQzLCAweGZmMDAsIDB4ODIwMCwgIkFTVVMgTTIiLCBBRDE5ODZBX0ZJWFVQXzNTVEFDSyksCiAJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4Y2I4NCwgIkFTVVMgQThOLVZNIiwgQUQxOTg2QV9GSVhVUF8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNDAsICJUb3NoaWJhIFNhdGVsbGl0ZSBMNDAiLCBBRDE5ODZBX0ZJWFVQX0VBUEQpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwMWUsICJGU0MgVjIwNjAiLCBBRDE5ODZBX0ZJWFVQX0xBUFRPUCksCiAJU05EX1BDSV9RVUlSS19NQVNLKDB4MTQ0ZCwgMHhmZjAwLCAweGMwMDAsICJTYW1zdW5nIiwgQUQxOTg2QV9GSVhVUF9TQU1TVU5HKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDI3LCAiU2Ftc3VuZyBRMSIsIEFEMTk4NkFfRklYVVBfVUxUUkEpLApAQCAtNDcyLDYgKzQ5MSw4IEBACiBzdGF0aWMgaW50IHBhdGNoX2FkMTk4MyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWQxOTh4X3NwZWMgKnNwZWM7CisJc3RhdGljIGhkYV9uaWRfdCBjb25uXzBjW10gPSB7IDB4MDggfTsKKwlzdGF0aWMgaGRhX25pZF90IGNvbm5fMGRbXSA9IHsgMHgwOSB9OwogCWludCBlcnI7CiAKIAllcnIgPSBhbGxvY19hZF9zcGVjKGNvZGVjKTsKQEAgLTQ3OSw4ICs1MDAsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAlzcGVjID0gY29kZWMtPnNwZWM7CiAKKwlzcGVjLT5nZW4ubWl4ZXJfbmlkID0gMHgwZTsKIAlzcGVjLT5nZW4uYmVlcF9uaWQgPSAweDEwOwogCXNldF9iZWVwX2FtcChzcGVjLCAweDEwLCAwLCBIREFfT1VUUFVUKTsKKworCS8qIGxpbWl0IHRoZSBsb29wYmFjayByb3V0ZXMgbm90IHRvIGNvbmZ1c2UgdGhlIHBhcnNlciAqLworCXNuZF9oZGFfb3ZlcnJpZGVfY29ubl9saXN0KGNvZGVjLCAweDBjLCBBUlJBWV9TSVpFKGNvbm5fMGMpLCBjb25uXzBjKTsKKwlzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChjb2RlYywgMHgwZCwgQVJSQVlfU0laRShjb25uXzBkKSwgY29ubl8wZCk7CisKIAllcnIgPSBhZDE5OHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIGZhbHNlKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggNjRmMGE1ZS4uNWVmOTUwMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTEzMiw2ICsxMzIsOSBAQAogCiAJc3RydWN0IGhkbWlfZWxkIHRlbXBfZWxkOwogCXN0cnVjdCBoZG1pX29wcyBvcHM7CisKKwlib29sIGR5bl9waW5fb3V0OworCiAJLyoKIAkgKiBOb24tZ2VuZXJpYyBWSUEvTlZJRElBIHNwZWNpZmljCiAJICovCkBAIC01MDAsMTUgKzUwMywyNSBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX2luaXRfcGluKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluX25pZCkKIHsKKwlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHBpbl9vdXQ7CisKIAkvKiBVbm11dGUgKi8KIAlpZiAoZ2V0X3djYXBzKGNvZGVjLCBwaW5fbmlkKSAmIEFDX1dDQVBfT1VUX0FNUCkKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluX25pZCwgMCwKIAkJCQlBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSk7Ci0JLyogRW5hYmxlIHBpbiBvdXQ6IHNvbWUgbWFjaGluZXMgd2l0aCBHTTk2NSBnZXRzIGJyb2tlbiBvdXRwdXQgd2hlbgotCSAqIHRoZSBwaW4gaXMgZGlzYWJsZWQgb3IgY2hhbmdlZCB3aGlsZSB1c2luZyB3aXRoIEhETUkKLQkgKi8KKworCWlmIChzcGVjLT5keW5fcGluX291dCkKKwkJLyogRGlzYWJsZSBwaW4gb3V0IHVudGlsIHN0cmVhbSBpcyBhY3RpdmUgKi8KKwkJcGluX291dCA9IDA7CisJZWxzZQorCQkvKiBFbmFibGUgcGluIG91dDogc29tZSBtYWNoaW5lcyB3aXRoIEdNOTY1IGdldHMgYnJva2VuIG91dHB1dAorCQkgKiB3aGVuIHRoZSBwaW4gaXMgZGlzYWJsZWQgb3IgY2hhbmdlZCB3aGlsZSB1c2luZyB3aXRoIEhETUkKKwkJICovCisJCXBpbl9vdXQgPSBQSU5fT1VUOworCiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluX25pZCwgMCwKLQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQpOworCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGluX291dCk7CiB9CiAKIHN0YXRpYyBpbnQgaGRtaV9nZXRfY2hhbm5lbF9jb3VudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGN2dF9uaWQpCkBAIC0xNzM1LDYgKzE3NDgsNyBAQAogCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9IGdldF9waW4oc3BlYywgcGluX2lkeCk7CiAJaGRhX25pZF90IHBpbl9uaWQgPSBwZXJfcGluLT5waW5fbmlkOwogCWJvb2wgbm9uX3BjbTsKKwlpbnQgcGluY3RsOwogCiAJbm9uX3BjbSA9IGNoZWNrX25vbl9wY21fcGVyX2N2dChjb2RlYywgY3Z0X25pZCk7CiAJbXV0ZXhfbG9jaygmcGVyX3Bpbi0+bG9jayk7CkBAIC0xNzQ0LDYgKzE3NTgsMTQgQEAKIAloZG1pX3NldHVwX2F1ZGlvX2luZm9mcmFtZShjb2RlYywgcGVyX3Bpbiwgbm9uX3BjbSk7CiAJbXV0ZXhfdW5sb2NrKCZwZXJfcGluLT5sb2NrKTsKIAorCWlmIChzcGVjLT5keW5fcGluX291dCkgeworCQlwaW5jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbl9uaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW5fbmlkLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJICAgIHBpbmN0bCB8IFBJTl9PVVQpOworCX0KKwogCXJldHVybiBzcGVjLT5vcHMuc2V0dXBfc3RyZWFtKGNvZGVjLCBjdnRfbmlkLCBwaW5fbmlkLCBzdHJlYW1fdGFnLCBmb3JtYXQpOwogfQogCkBAIC0xNzYzLDYgKzE3ODUsNyBAQAogCWludCBjdnRfaWR4LCBwaW5faWR4OwogCXN0cnVjdCBoZG1pX3NwZWNfcGVyX2N2dCAqcGVyX2N2dDsKIAlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW47CisJaW50IHBpbmN0bDsKIAogCWlmIChoaW5mby0+bmlkKSB7CiAJCWN2dF9pZHggPSBjdnRfbmlkX3RvX2N2dF9pbmRleChzcGVjLCBoaW5mby0+bmlkKTsKQEAgLTE3NzksNiArMTgwMiwxNCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXBlcl9waW4gPSBnZXRfcGluKHNwZWMsIHBpbl9pZHgpOwogCisJCWlmIChzcGVjLT5keW5fcGluX291dCkgeworCQkJcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAwLAorCQkJCQlBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGVyX3Bpbi0+cGluX25pZCwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkJICAgIHBpbmN0bCAmIH5QSU5fT1VUKTsKKwkJfQorCiAJCXNuZF9oZGFfc3BkaWZfY3Rsc191bmFzc2lnbihjb2RlYywgcGluX2lkeCk7CiAKIAkJbXV0ZXhfbG9jaygmcGVyX3Bpbi0+bG9jayk7CkBAIC0yODQwLDYgKzI4NzEsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmR5bl9waW5fb3V0ID0gdHJ1ZTsKIAogCXNwZWMtPm9wcy5jaG1hcF9jZWFfYWxsb2NfdmFsaWRhdGVfZ2V0X3R5cGUgPQogCQludmhkbWlfY2htYXBfY2VhX2FsbG9jX3ZhbGlkYXRlX2dldF90eXBlOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCBmOWIyMmZiLi5kOTY5M2NhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMTgxOSw3ICsxODE5LDkgQEAKIAlBTEM4ODlfRklYVVBfREFDX1JPVVRFLAogCUFMQzg4OV9GSVhVUF9NQlBfVlJFRiwKIAlBTEM4ODlfRklYVVBfSU1BQzkxX1ZSRUYsCisJQUxDODg5X0ZJWFVQX01CQTExX1ZSRUYsCiAJQUxDODg5X0ZJWFVQX01CQTIxX1ZSRUYsCisJQUxDODg5X0ZJWFVQX01QMTFfVlJFRiwKIAlBTEM4ODJfRklYVVBfSU5WX0RNSUMsCiAJQUxDODgyX0ZJWFVQX05PX1BSSU1BUllfSFAsCiAJQUxDODg3X0ZJWFVQX0FTVVNfQkFTUywKQEAgLTE5NDksNiArMTk1MSwxNiBAQAogCQlhbGM4ODlfZml4dXBfbWFjX3BpbnMoY29kZWMsIG5pZHMsIEFSUkFZX1NJWkUobmlkcykpOwogfQogCisvKiBTZXQgVlJFRiBvbiBzcGVha2VyIHBpbnMgb24gbWJhMTEgKi8KK3N0YXRpYyB2b2lkIGFsYzg4OV9maXh1cF9tYmExMV92cmVmKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc3RhdGljIGhkYV9uaWRfdCBuaWRzWzFdID0geyAweDE4IH07CisKKwlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfSU5JVCkKKwkJYWxjODg5X2ZpeHVwX21hY19waW5zKGNvZGVjLCBuaWRzLCBBUlJBWV9TSVpFKG5pZHMpKTsKK30KKwogLyogU2V0IFZSRUYgb24gc3BlYWtlciBwaW5zIG9uIG1iYTIxICovCiBzdGF0aWMgdm9pZCBhbGM4ODlfZml4dXBfbWJhMjFfdnJlZihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkgICAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQpAQCAtMjE2NywxMiArMjE3OSwyNCBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzg4Ml9GSVhVUF9HUElPMSwKIAl9LAorCVtBTEM4ODlfRklYVVBfTUJBMTFfVlJFRl0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGM4ODlfZml4dXBfbWJhMTFfdnJlZiwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM4ODlfRklYVVBfTUJQX1ZSRUYsCisJfSwKIAlbQUxDODg5X0ZJWFVQX01CQTIxX1ZSRUZdID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gYWxjODg5X2ZpeHVwX21iYTIxX3ZyZWYsCiAJCS5jaGFpbmVkID0gdHJ1ZSwKIAkJLmNoYWluX2lkID0gQUxDODg5X0ZJWFVQX01CUF9WUkVGLAogCX0sCisJW0FMQzg4OV9GSVhVUF9NUDExX1ZSRUZdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWxjODg5X2ZpeHVwX21iYTExX3ZyZWYsCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDODg1X0ZJWFVQX01BQ1BST19HUElPLAorCX0sCiAJW0FMQzg4Ml9GSVhVUF9JTlZfRE1JQ10gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfaW52X2RtaWNfMHgxMiwKQEAgLTIyMzYsMTMgKzIyNjAsMTMgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGEwLCAiTWFjQm9va1BybyAzLDEiLCBBTEM4ODlfRklYVVBfTUJQX1ZSRUYpLAogCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDAwYTEsICJNYWNib29rIiwgQUxDODg5X0ZJWFVQX01CUF9WUkVGKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGE0LCAiTWFjYm9va1BybyA0LDEiLCBBTEM4ODlfRklYVVBfTUJQX1ZSRUYpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDBjMDAsICJNYWMgUHJvIiwgQUxDODg1X0ZJWFVQX01BQ1BST19HUElPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwYzAwLCAiTWFjIFBybyIsIEFMQzg4OV9GSVhVUF9NUDExX1ZSRUYpLAogCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDEwMDAsICJpTWFjIDI0IiwgQUxDODg1X0ZJWFVQX01BQ1BST19HUElPKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgyODAwLCAiQXBwbGVUViIsIEFMQzg4NV9GSVhVUF9NQUNQUk9fR1BJTyksCiAJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MmMwMCwgIk1hY2Jvb2tQcm8gcmV2MyIsIEFMQzg4OV9GSVhVUF9NQlBfVlJFRiksCiAJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzAwMCwgImlNYWMiLCBBTEM4ODlfRklYVVBfTUJQX1ZSRUYpLAogCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDMyMDAsICJpTWFjIDcsMSBBbHVtaW51bSIsIEFMQzg4Ml9GSVhVUF9FQVBEKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNDAwLCAiTWFjQm9va0FpciAxLDEiLCBBTEM4ODlfRklYVVBfTUJQX1ZSRUYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDM0MDAsICJNYWNCb29rQWlyIDEsMSIsIEFMQzg4OV9GSVhVUF9NQkExMV9WUkVGKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNTAwLCAiTWFjQm9va0FpciAyLDEiLCBBTEM4ODlfRklYVVBfTUJBMjFfVlJFRiksCiAJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzYwMCwgIk1hY2Jvb2sgMywxIiwgQUxDODg5X0ZJWFVQX01CUF9WUkVGKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzODAwLCAiTWFjYm9va1BybyA0LDEiLCBBTEM4ODlfRklYVVBfTUJQX1ZSRUYpLApAQCAtMzgzMyw2ICszODU3LDcgQEAKIAlBTEMyNjlfRklYVVBfQUNFUl9BQzcwMCwKIAlBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCwKIAlBTEMyNjlWQl9GSVhVUF9BU1VTX1pFTkJPT0ssCisJQUxDMjY5VkJfRklYVVBfQVNVU19aRU5CT09LX1VYMzFBLAogCUFMQzI2OV9GSVhVUF9MSU1JVF9JTlRfTUlDX0JPT1NUX01VVEVfTEVELAogCUFMQzI2OVZCX0ZJWFVQX09SRElTU0lNT19FVkUyLAogCUFMQzI4M19GSVhVUF9DSFJPTUVfQk9PSywKQEAgLTQxMjYsNiArNDE1MSwxNyBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzI2OVZCX0ZJWFVQX0RNSUMsCiAJfSwKKwlbQUxDMjY5VkJfRklYVVBfQVNVU19aRU5CT09LX1VYMzFBXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfVkVSQlMsCisJCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQkvKiBjbGFzcy1EIG91dHB1dCBhbXAgKzVkQiAqLworCQkJeyAweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDEyIH0sCisJCQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgyODAwIH0sCisJCQl7fQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI2OVZCX0ZJWFVQX0FTVVNfWkVOQk9PSywKKwl9LAogCVtBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVF9NVVRFX0xFRF0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGMyNjlfZml4dXBfbGltaXRfaW50X21pY19ib29zdCwKQEAgLTQyNjUsNiArNDMwMSw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYzZSwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjNmLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NDAsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY0ZCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjUxLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NTIsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY1MywgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKQEAgLTQyODIsNyArNDMxOSw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTA2ZCwgIkFzdXMgSzUzQkUiLCBBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTE1ZCwgIkFzdXMgMTAxNUUiLCBBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQyNywgIkFzdXMgWmVuYm9vayBVWDMxRSIsIEFMQzI2OVZCX0ZJWFVQX0FTVVNfWkVOQk9PSyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTUxNywgIkFzdXMgWmVuYm9vayBVWDMxQSIsIEFMQzI2OVZCX0ZJWFVQX0FTVVNfWkVOQk9PSyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTUxNywgIkFzdXMgWmVuYm9vayBVWDMxQSIsIEFMQzI2OVZCX0ZJWFVQX0FTVVNfWkVOQk9PS19VWDMxQSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZlMywgIkFTVVMgVVg1MCIsIEFMQzI2OV9GSVhVUF9TVEVSRU9fRE1JQyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MWExMywgIkFzdXMgRzczSnciLCBBTEMyNjlfRklYVVBfQVNVU19HNzNKVyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MWIxMywgIkFzdXMgVTQxU1YiLCBBTEMyNjlfRklYVVBfSU5WX0RNSUMpLApAQCAtNDM5Nyw2ICs0NDM0LDkgQEAKIAogCWlmIChzcGVjLT5jb2RlY192YXJpYW50ICE9IEFMQzI2OV9UWVBFX0FMQzI2OVZCKQogCQlyZXR1cm47CisJLyogQUxDMjcxWCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGVzZSBDT0VGcyAoYmtvIzUyMTgxKSAqLworCWlmICghc3RyY21wKGNvZGVjLT5jaGlwX25hbWUsICJBTEMyNzFYIikpCisJCXJldHVybjsKIAogCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZmYpIDwgMHgwMTUpIHsKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGYsIDB4OTYwYik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL01ha2VmaWxlIGIvc291bmQvcGNpL294eWdlbi9NYWtlZmlsZQppbmRleCAwZjg3MjY1Li44ZjRjNDA5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBzbmQtb3h5Z2VuLWxpYi1vYmpzIDo9IG94eWdlbl9pby5vIG94eWdlbl9saWIubyBveHlnZW5fbWl4ZXIubyBveHlnZW5fcGNtLm8KLXNuZC1veHlnZW4tb2JqcyA6PSBveHlnZW4ubyB4b25hcl9kZy5vCitzbmQtb3h5Z2VuLW9ianMgOj0gb3h5Z2VuLm8geG9uYXJfZGdfbWl4ZXIubyB4b25hcl9kZy5vCiBzbmQtdmlydHVvc28tb2JqcyA6PSB2aXJ0dW9zby5vIHhvbmFyX2xpYi5vIFwKIAl4b25hcl9wY20xNzl4Lm8geG9uYXJfY3M0M3h4Lm8geG9uYXJfd204N3g2Lm8geG9uYXJfaGRtaS5vCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vY3M0MjQ1LmggYi9zb3VuZC9wY2kvb3h5Z2VuL2NzNDI0NS5oCmluZGV4IDVlMDE5N2UuLjk5MDk4NjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vY3M0MjQ1LmgKKysrIGIvc291bmQvcGNpL294eWdlbi9jczQyNDUuaApAQCAtMTAyLDYgKzEwMiw5IEBACiAjZGVmaW5lIENTNDI0NV9BRENfT1ZGTAkJMHgwMgogI2RlZmluZSBDUzQyNDVfQURDX1VORFJGTAkweDAxCiAKKyNkZWZpbmUgQ1M0MjQ1X1NQSV9BRERSRVNTX1MJKDB4OWUgPDwgMTYpCisjZGVmaW5lIENTNDI0NV9TUElfV1JJVEVfUwkoMCA8PCAxNikKIAotI2RlZmluZSBDUzQyNDVfU1BJX0FERFJFU1MJKDB4OWUgPDwgMTYpCi0jZGVmaW5lIENTNDI0NV9TUElfV1JJVEUJKDAgPDwgMTYpCisjZGVmaW5lIENTNDI0NV9TUElfQUREUkVTUwkweDllCisjZGVmaW5lIENTNDI0NV9TUElfV1JJVEUJMAorI2RlZmluZSBDUzQyNDVfU1BJX1JFQUQJCTEKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmggYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5oCmluZGV4IDA5YTI0YjIuLmMxMGFiMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmgKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW4uaApAQCAtMTk4LDcgKzE5OCw3IEBACiB2b2lkIG94eWdlbl93cml0ZV9hYzk3X21hc2tlZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgY29kZWMsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIHUxNiBkYXRhLCB1MTYgbWFzayk7CiAKLXZvaWQgb3h5Z2VuX3dyaXRlX3NwaShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1OCBjb250cm9sLCB1bnNpZ25lZCBpbnQgZGF0YSk7CitpbnQgb3h5Z2VuX3dyaXRlX3NwaShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1OCBjb250cm9sLCB1bnNpZ25lZCBpbnQgZGF0YSk7CiB2b2lkIG94eWdlbl93cml0ZV9pMmMoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggZGV2aWNlLCB1OCBtYXAsIHU4IGRhdGEpOwogCiB2b2lkIG94eWdlbl9yZXNldF91YXJ0KHN0cnVjdCBveHlnZW4gKmNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKaW5kZXggNTIxZWFlNC4uMzI3NDkwNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCkBAIC0xOTQsMjMgKzE5NCwzNiBAQAogfQogRVhQT1JUX1NZTUJPTChveHlnZW5fd3JpdGVfYWM5N19tYXNrZWQpOwogCi12b2lkIG94eWdlbl93cml0ZV9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggY29udHJvbCwgdW5zaWduZWQgaW50IGRhdGEpCitzdGF0aWMgaW50IG94eWdlbl93YWl0X3NwaShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogewogCXVuc2lnbmVkIGludCBjb3VudDsKIAotCS8qIHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gMzAuNzIgdXMgKDI0ICogMS4yOCB1cykgKi8KLQljb3VudCA9IDEwOwotCXdoaWxlICgob3h5Z2VuX3JlYWQ4KGNoaXAsIE9YWUdFTl9TUElfQ09OVFJPTCkgJiBPWFlHRU5fU1BJX0JVU1kpCi0JICAgICAgICYmIGNvdW50ID4gMCkgeworCS8qCisJICogSGlnaGVyIHRpbWVvdXQgdG8gYmUgc3VyZTogMjAwIHVzOworCSAqIGFjdHVhbCB0cmFuc2FjdGlvbiBzaG91bGQgbm90IG5lZWQgbW9yZSB0aGFuIDQwIHVzLgorCSAqLworCWZvciAoY291bnQgPSA1MDsgY291bnQgPiAwOyBjb3VudC0tKSB7CiAJCXVkZWxheSg0KTsKLQkJLS1jb3VudDsKKwkJaWYgKChveHlnZW5fcmVhZDgoY2hpcCwgT1hZR0VOX1NQSV9DT05UUk9MKSAmCisJCQkJCQlPWFlHRU5fU1BJX0JVU1kpID09IDApCisJCQlyZXR1cm4gMDsKIAl9CisJc25kX3ByaW50ayhLRVJOX0VSUiAib3h5Z2VuOiBTUEkgd2FpdCB0aW1lb3V0XG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KIAoraW50IG94eWdlbl93cml0ZV9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggY29udHJvbCwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJLyoKKwkgKiBXZSBuZWVkIHRvIHdhaXQgQUZURVIgaW5pdGlhdGluZyB0aGUgU1BJIHRyYW5zYWN0aW9uLAorCSAqIG90aGVyd2lzZSByZWFkIG9wZXJhdGlvbnMgd2lsbCBub3Qgd29yay4KKwkgKi8KIAlveHlnZW5fd3JpdGU4KGNoaXAsIE9YWUdFTl9TUElfREFUQTEsIGRhdGEpOwogCW94eWdlbl93cml0ZTgoY2hpcCwgT1hZR0VOX1NQSV9EQVRBMiwgZGF0YSA+PiA4KTsKIAlpZiAoY29udHJvbCAmIE9YWUdFTl9TUElfREFUQV9MRU5HVEhfMykKIAkJb3h5Z2VuX3dyaXRlOChjaGlwLCBPWFlHRU5fU1BJX0RBVEEzLCBkYXRhID4+IDE2KTsKIAlveHlnZW5fd3JpdGU4KGNoaXAsIE9YWUdFTl9TUElfQ09OVFJPTCwgY29udHJvbCk7CisJcmV0dXJuIG94eWdlbl93YWl0X3NwaShjaGlwKTsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3dyaXRlX3NwaSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX21peGVyLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9taXhlci5jCmluZGV4IGMwZGJiNTIuLjU5ODhlMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX21peGVyLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fbWl4ZXIuYwpAQCAtMTkwLDYgKzE5MCw3IEBACiAJaWYgKGNoaXAtPm1vZGVsLnVwZGF0ZV9jZW50ZXJfbGZlX21peCkKIAkJY2hpcC0+bW9kZWwudXBkYXRlX2NlbnRlcl9sZmVfbWl4KGNoaXAsIGNoaXAtPmRhY19yb3V0aW5nID4gMik7CiB9CitFWFBPUlRfU1lNQk9MKG94eWdlbl91cGRhdGVfZGFjX3JvdXRpbmcpOwogCiBzdGF0aWMgaW50IHVwbWl4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQogewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcmVncy5oIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fcmVncy5oCmluZGV4IDYzZGM3YTAuLjhjMTkxYmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3JlZ3MuaAorKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9yZWdzLmgKQEAgLTMxOCw2ICszMTgsNyBAQAogI2RlZmluZSAgT1hZR0VOX1BMQVlfTVVURTIzCQkweDAwMDIKICNkZWZpbmUgIE9YWUdFTl9QTEFZX01VVEU0NQkJMHgwMDA0CiAjZGVmaW5lICBPWFlHRU5fUExBWV9NVVRFNjcJCTB4MDAwOAorI2RlZmluZSAgT1hZR0VOX1BMQVlfTVVURV9NQVNLCQkweDAwMGYKICNkZWZpbmUgIE9YWUdFTl9QTEFZX01VTFRJQ0hfTUFTSwkweDAwMTAKICNkZWZpbmUgIE9YWUdFTl9QTEFZX01VTFRJQ0hfSTJTX0RBQwkweDAwMDAKICNkZWZpbmUgIE9YWUdFTl9QTEFZX01VTFRJQ0hfQUM5NwkweDAwMTAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuYyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuYwppbmRleCA3N2FjZDc5Li5lZDZmMTk5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jCkBAIC0yLDcgKzIsNyBAQAogICogY2FyZCBkcml2ZXIgZm9yIHRoZSBYb25hciBERy9ER1gKICAqCiAgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgotICoKKyAqIENvcHlyaWdodCAoYykgUm9tYW4gVm9sa292IDx2MXJvbkBtYWlsLnJ1PgogICoKICAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgpAQCAtMjAsMjcgKzIwLDM1IEBACiAgKiBYb25hciBERy9ER1gKICAqIC0tLS0tLS0tLS0tLQogICoKKyAqIENTNDI0NSBhbmQgQ1M0MzYxIGJvdGggd2lsbCBtdXRlIGFsbCBvdXRwdXRzIGlmIGFueSBjbG9jayByYXRpbworICogaXMgaW52YWxpZC4KKyAqCiAgKiBDTUk4Nzg4OgogICoKICAqICAgU1BJIDAgLT4gQ1M0MjQ1CiAgKgorICogICBQbGF5YmFjazoKICAqICAgScKyUyAxIC0+IENTNDI0NQogICogICBJwrJTIDIgLT4gQ1M0MzYxIChjZW50ZXIvTEZFKQogICogICBJwrJTIDMgLT4gQ1M0MzYxIChzdXJyb3VuZCkKICAqICAgScKyUyA0IC0+IENTNDM2MSAoZnJvbnQpCisgKiAgIENhcHR1cmU6CisgKiAgIEnCslMgQURDIDEgPC0gQ1M0MjQ1CiAgKgogICogICBHUElPIDMgPC0gPwogICogICBHUElPIDQgPC0gaGVhZHBob25lIGRldGVjdAotICogICBHUElPIDUgLT4gcm91dGUgaW5wdXQgamFjayB0byBsaW5lLWluICgwKSBvciBtaWMtaW4gKDEpCi0gKiAgIEdQSU8gNiAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIGxpbmUtaW4gKDApIG9yIG1pYy1pbiAoMSkKLSAqICAgR1BJTyA3IC0+IGVuYWJsZSByZWFyIGhlYWRwaG9uZSBhbXAKKyAqICAgR1BJTyA1IC0+IGVuYWJsZSBBREMgYW5hbG9nIGNpcmN1aXQgZm9yIHRoZSBsZWZ0IGNoYW5uZWwKKyAqICAgR1BJTyA2IC0+IGVuYWJsZSBBREMgYW5hbG9nIGNpcmN1aXQgZm9yIHRoZSByaWdodCBjaGFubmVsCisgKiAgIEdQSU8gNyAtPiBzd2l0Y2ggZ3JlZW4gcmVhciBvdXRwdXQgamFjayBiZXR3ZWVuIENTNDI0NSBhbmQgYW5kIHRoZSBmaXJzdAorICogICAgICAgICAgICAgY2hhbm5lbCBvZiBDUzQzNjEgKG1lY2hhbmljYWwgcmVsYXkpCiAgKiAgIEdQSU8gOCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCiAgKgogICogQ1M0MjQ1OgogICoKKyAqICAgaW5wdXQgMCA8LSBtaWMKICAqICAgaW5wdXQgMSA8LSBhdXgKICAqICAgaW5wdXQgMiA8LSBmcm9udCBtaWMKLSAqICAgaW5wdXQgNCA8LSBsaW5lL21pYworICogICBpbnB1dCA0IDwtIGxpbmUKICAqICAgREFDIG91dCAtPiBoZWFkcGhvbmVzCiAgKiAgIGF1eCBvdXQgLT4gZnJvbnQgcGFuZWwgaGVhZHBob25lcwogICovCkBAIC01Niw1NTMgKzY0LDIxNCBAQAogI2luY2x1ZGUgInhvbmFyX2RnLmgiCiAjaW5jbHVkZSAiY3M0MjQ1LmgiCiAKLSNkZWZpbmUgR1BJT19NQUdJQwkJMHgwMDA4Ci0jZGVmaW5lIEdQSU9fSFBfREVURUNUCQkweDAwMTAKLSNkZWZpbmUgR1BJT19JTlBVVF9ST1VURQkweDAwNjAKLSNkZWZpbmUgR1BJT19IUF9SRUFSCQkweDAwODAKLSNkZWZpbmUgR1BJT19PVVRQVVRfRU5BQkxFCTB4MDEwMAotCi1zdHJ1Y3QgZGcgewotCXVuc2lnbmVkIGludCBvdXRwdXRfc2VsOwotCXM4IGlucHV0X3ZvbFs0XVsyXTsKLQl1bnNpZ25lZCBpbnQgaW5wdXRfc2VsOwotCXU4IGhwX3ZvbF9hdHQ7Ci0JdTggY3M0MjQ1X3JlZ3NbMHgxMV07Ci19OwotCi1zdGF0aWMgdm9pZCBjczQyNDVfd3JpdGUoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IHJlZywgdTggdmFsdWUpCitpbnQgY3M0MjQ1X3dyaXRlX3NwaShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1OCByZWcpCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcGFja2V0OwogCi0Jb3h5Z2VuX3dyaXRlX3NwaShjaGlwLCBPWFlHRU5fU1BJX1RSSUdHRVIgfAotCQkJIE9YWUdFTl9TUElfREFUQV9MRU5HVEhfMyB8Ci0JCQkgT1hZR0VOX1NQSV9DTE9DS18xMjgwIHwKLQkJCSAoMCA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSB8Ci0JCQkgT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEksCi0JCQkgQ1M0MjQ1X1NQSV9BRERSRVNTIHwKLQkJCSBDUzQyNDVfU1BJX1dSSVRFIHwKLQkJCSAocmVnIDw8IDgpIHwgdmFsdWUpOwotCWRhdGEtPmNzNDI0NV9yZWdzW3JlZ10gPSB2YWx1ZTsKKwlwYWNrZXQgPSByZWcgPDwgODsKKwlwYWNrZXQgfD0gKENTNDI0NV9TUElfQUREUkVTUyB8IENTNDI0NV9TUElfV1JJVEUpIDw8IDE2OworCXBhY2tldCB8PSBkYXRhLT5jczQyNDVfc2hhZG93W3JlZ107CisKKwlyZXR1cm4gb3h5Z2VuX3dyaXRlX3NwaShjaGlwLCBPWFlHRU5fU1BJX1RSSUdHRVIgfAorCQkJCU9YWUdFTl9TUElfREFUQV9MRU5HVEhfMyB8CisJCQkJT1hZR0VOX1NQSV9DTE9DS18xMjgwIHwKKwkJCQkoMCA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSB8CisJCQkJT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEksCisJCQkJcGFja2V0KTsKIH0KIAotc3RhdGljIHZvaWQgY3M0MjQ1X3dyaXRlX2NhY2hlZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgcmVnLCB1OCB2YWx1ZSkKK2ludCBjczQyNDVfcmVhZF9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggYWRkcikKIHsKIAlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCWludCByZXQ7CiAKLQlpZiAodmFsdWUgIT0gZGF0YS0+Y3M0MjQ1X3JlZ3NbcmVnXSkKLQkJY3M0MjQ1X3dyaXRlKGNoaXAsIHJlZywgdmFsdWUpOworCXJldCA9IG94eWdlbl93cml0ZV9zcGkoY2hpcCwgT1hZR0VOX1NQSV9UUklHR0VSIHwKKwkJT1hZR0VOX1NQSV9EQVRBX0xFTkdUSF8yIHwKKwkJT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEkgfAorCQlPWFlHRU5fU1BJX0NMT0NLXzEyODAgfCAoMCA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSwKKwkJKChDUzQyNDVfU1BJX0FERFJFU1MgfCBDUzQyNDVfU1BJX1dSSVRFKSA8PCA4KSB8IGFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gb3h5Z2VuX3dyaXRlX3NwaShjaGlwLCBPWFlHRU5fU1BJX1RSSUdHRVIgfAorCQlPWFlHRU5fU1BJX0RBVEFfTEVOR1RIXzIgfAorCQlPWFlHRU5fU1BJX0NFTl9MQVRDSF9DTE9DS19ISSB8CisJCU9YWUdFTl9TUElfQ0xPQ0tfMTI4MCB8ICgwIDw8IE9YWUdFTl9TUElfQ09ERUNfU0hJRlQpLAorCQkoQ1M0MjQ1X1NQSV9BRERSRVNTIHwgQ1M0MjQ1X1NQSV9SRUFEKSA8PCA4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEtPmNzNDI0NV9zaGFkb3dbYWRkcl0gPSBveHlnZW5fcmVhZDgoY2hpcCwgT1hZR0VOX1NQSV9EQVRBMSk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY3M0MjQ1X3JlZ2lzdGVyc19pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCitpbnQgY3M0MjQ1X3NoYWRvd19jb250cm9sKHN0cnVjdCBveHlnZW4gKmNoaXAsIGVudW0gY3M0MjQ1X3NoYWRvd19vcGVyYXRpb24gb3ApCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJaW50IHJldDsKIAotCWNzNDI0NV93cml0ZShjaGlwLCBDUzQyNDVfUE9XRVJfQ1RSTCwgQ1M0MjQ1X1BETik7Ci0JY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8xLAotCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQ1RSTF8xXSk7Ci0JY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9BRENfQ1RSTCwKLQkJICAgICBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1NJR05BTF9TRUwsCi0JCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1NJR05BTF9TRUxdKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BHQV9CX0NUUkwsCi0JCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1BHQV9CX0NUUkxdKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BHQV9BX0NUUkwsCi0JCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1BHQV9BX0NUUkxdKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0FOQUxPR19JTiwKLQkJICAgICBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQU5BTE9HX0lOXSk7Ci0JY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQV9DVFJMLAotCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQV9DVFJMXSk7Ci0JY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQl9DVFJMLAotCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQl9DVFJMXSk7Ci0JY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8yLAotCQkgICAgIENTNDI0NV9EQUNfU09GVCB8IENTNDI0NV9EQUNfWkVSTyB8IENTNDI0NV9JTlZFUlRfREFDKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0lOVF9NQVNLLCAwKTsKLQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BPV0VSX0NUUkwsIDApOworCWZvciAoYWRkciA9IDE7IGFkZHIgPCBBUlJBWV9TSVpFKGRhdGEtPmNzNDI0NV9zaGFkb3cpOyBhZGRyKyspIHsKKwkJcmV0ID0gKG9wID09IENTNDI0NV9TQVZFX1RPX1NIQURPVyA/CisJCQljczQyNDVfcmVhZF9zcGkoY2hpcCwgYWRkcikgOgorCQkJY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBhZGRyKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNzNDI0NV9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAotCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQ1RSTF8xXSA9CisJLyogc2F2ZSB0aGUgaW5pdGlhbCBzdGF0ZTogY29kZWMgdmVyc2lvbiwgcmVnaXN0ZXJzICovCisJY3M0MjQ1X3NoYWRvd19jb250cm9sKGNoaXAsIENTNDI0NV9TQVZFX1RPX1NIQURPVyk7CisKKwkvKgorCSAqIFBvd2VyIHVwIHRoZSBDT0RFQyBpbnRlcm5hbHMsIGVuYWJsZSBzb2Z0IHJhbXAgJiB6ZXJvIGNyb3NzLCB3b3JrIGluCisJICogYXN5bmMuIG1vZGUsIGVuYWJsZSBhdXggb3V0cHV0IGZyb20gREFDLiBJbnZlcnQgREFDIG91dHB1dCBhcyBpbiB0aGUKKwkgKiBXaW5kb3dzIGRyaXZlci4KKwkgKi8KKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9QT1dFUl9DVFJMXSA9IDA7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfU0lHTkFMX1NFTF0gPQorCQlDUzQyNDVfQV9PVVRfU0VMX0RBQyB8IENTNDI0NV9BU1lOQ0g7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0NUUkxfMV0gPQogCQlDUzQyNDVfREFDX0ZNX1NJTkdMRSB8IENTNDI0NV9EQUNfRElGX0xKVVNUOwotCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BRENfQ1RSTF0gPQorCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0RBQ19DVFJMXzJdID0KKwkJQ1M0MjQ1X0RBQ19TT0ZUIHwgQ1M0MjQ1X0RBQ19aRVJPIHwgQ1M0MjQ1X0lOVkVSVF9EQUM7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfQURDX0NUUkxdID0KIAkJQ1M0MjQ1X0FEQ19GTV9TSU5HTEUgfCBDUzQyNDVfQURDX0RJRl9MSlVTVDsKLQlkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfU0lHTkFMX1NFTF0gPQotCQlDUzQyNDVfQV9PVVRfU0VMX0hJWiB8IENTNDI0NV9BU1lOQ0g7Ci0JZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1BHQV9CX0NUUkxdID0gMDsKLQlkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfUEdBX0FfQ1RSTF0gPSAwOwotCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BTkFMT0dfSU5dID0KLQkJQ1M0MjQ1X1BHQV9TT0ZUIHwgQ1M0MjQ1X1BHQV9aRVJPIHwgQ1M0MjQ1X1NFTF9JTlBVVF80OwotCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQV9DVFJMXSA9IDA7Ci0JZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0RBQ19CX0NUUkxdID0gMDsKLQljczQyNDVfcmVnaXN0ZXJzX2luaXQoY2hpcCk7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfQU5BTE9HX0lOXSA9CisJCUNTNDI0NV9QR0FfU09GVCB8IENTNDI0NV9QR0FfWkVSTzsKKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9QR0FfQl9DVFJMXSA9IDA7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfUEdBX0FfQ1RSTF0gPSAwOworCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0RBQ19BX0NUUkxdID0gODsKKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9EQUNfQl9DVFJMXSA9IDg7CisKKwljczQyNDVfc2hhZG93X2NvbnRyb2woY2hpcCwgQ1M0MjQ1X0xPQURfRlJPTV9TSEFET1cpOwogCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJDUzQyNDUiKTsKIH0KIAotc3RhdGljIHZvaWQgZGdfb3V0cHV0X2VuYWJsZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQotewotCW1zbGVlcCgyNTAwKTsKLQlveHlnZW5fc2V0X2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBHUElPX09VVFBVVF9FTkFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBkZ19pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCit2b2lkIGRnX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwogCi0JZGF0YS0+b3V0cHV0X3NlbCA9IDA7Ci0JZGF0YS0+aW5wdXRfc2VsID0gMzsKLQlkYXRhLT5ocF92b2xfYXR0ID0gMiAqIDE2OworCWRhdGEtPm91dHB1dF9zZWwgPSBQTEFZQkFDS19EU1RfSFBfRlA7CisJZGF0YS0+aW5wdXRfc2VsID0gQ0FQVFVSRV9TUkNfTUlDOwogCiAJY3M0MjQ1X2luaXQoY2hpcCk7Ci0KLQlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsCi0JCQkgICAgR1BJT19NQUdJQyB8IEdQSU9fSFBfREVURUNUKTsKLQlveHlnZW5fc2V0X2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLAotCQkJICBHUElPX0lOUFVUX1JPVVRFIHwgR1BJT19IUF9SRUFSIHwgR1BJT19PVVRQVVRfRU5BQkxFKTsKLQlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsCi0JCQkgICAgR1BJT19JTlBVVF9ST1VURSB8IEdQSU9fSFBfUkVBUik7Ci0JZGdfb3V0cHV0X2VuYWJsZShjaGlwKTsKKwlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLAorCQkgICAgICAgR1BJT19PVVRQVVRfRU5BQkxFIHwgR1BJT19IUF9SRUFSIHwgR1BJT19JTlBVVF9ST1VURSk7CisJLyogYW50aS1wb3AgZGVsYXksIHdhaXQgc29tZSB0aW1lIGJlZm9yZSBlbmFibGluZyB0aGUgb3V0cHV0ICovCisJbXNsZWVwKDI1MDApOworCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsCisJCSAgICAgICBHUElPX09VVFBVVF9FTkFCTEUgfCBHUElPX0lOUFVUX1JPVVRFKTsKIH0KIAotc3RhdGljIHZvaWQgZGdfY2xlYW51cChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQordm9pZCBkZ19jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiAJb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBHUElPX09VVFBVVF9FTkFCTEUpOwogfQogCi1zdGF0aWMgdm9pZCBkZ19zdXNwZW5kKHN0cnVjdCBveHlnZW4gKmNoaXApCit2b2lkIGRnX3N1c3BlbmQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlkZ19jbGVhbnVwKGNoaXApOwogfQogCi1zdGF0aWMgdm9pZCBkZ19yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKK3ZvaWQgZGdfcmVzdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7Ci0JY3M0MjQ1X3JlZ2lzdGVyc19pbml0KGNoaXApOwotCWRnX291dHB1dF9lbmFibGUoY2hpcCk7CisJY3M0MjQ1X3NoYWRvd19jb250cm9sKGNoaXAsIENTNDI0NV9MT0FEX0ZST01fU0hBRE9XKTsKKwltc2xlZXAoMjUwMCk7CisJb3h5Z2VuX3NldF9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwgR1BJT19PVVRQVVRfRU5BQkxFKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2NzNDI0NV9kYWNfcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsCit2b2lkIHNldF9jczQyNDVfZGFjX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1OCB2YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGRhY19jdHJsOworCXVuc2lnbmVkIGNoYXIgbWNsa19mcmVxOwogCi0JdmFsdWUgPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfREFDX0NUUkxfMV0gJiB+Q1M0MjQ1X0RBQ19GTV9NQVNLOwotCWlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDUwMDAwKQotCQl2YWx1ZSB8PSBDUzQyNDVfREFDX0ZNX1NJTkdMRTsKLQllbHNlIGlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDEwMDAwMCkKLQkJdmFsdWUgfD0gQ1M0MjQ1X0RBQ19GTV9ET1VCTEU7Ci0JZWxzZQotCQl2YWx1ZSB8PSBDUzQyNDVfREFDX0ZNX1FVQUQ7Ci0JY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfREFDX0NUUkxfMSwgdmFsdWUpOworCWRhY19jdHJsID0gZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0NUUkxfMV0gJiB+Q1M0MjQ1X0RBQ19GTV9NQVNLOworCW1jbGtfZnJlcSA9IGRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X01DTEtfRlJFUV0gJiB+Q1M0MjQ1X01DTEsxX01BU0s7CisJaWYgKHBhcmFtc19yYXRlKHBhcmFtcykgPD0gNTAwMDApIHsKKwkJZGFjX2N0cmwgfD0gQ1M0MjQ1X0RBQ19GTV9TSU5HTEU7CisJCW1jbGtfZnJlcSB8PSBDUzQyNDVfTUNMS18xIDw8IENTNDI0NV9NQ0xLMV9TSElGVDsKKwl9IGVsc2UgaWYgKHBhcmFtc19yYXRlKHBhcmFtcykgPD0gMTAwMDAwKSB7CisJCWRhY19jdHJsIHw9IENTNDI0NV9EQUNfRk1fRE9VQkxFOworCQltY2xrX2ZyZXEgfD0gQ1M0MjQ1X01DTEtfMSA8PCBDUzQyNDVfTUNMSzFfU0hJRlQ7CisJfSBlbHNlIHsKKwkJZGFjX2N0cmwgfD0gQ1M0MjQ1X0RBQ19GTV9RVUFEOworCQltY2xrX2ZyZXEgfD0gQ1M0MjQ1X01DTEtfMiA8PCBDUzQyNDVfTUNMSzFfU0hJRlQ7CisJfQorCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0RBQ19DVFJMXzFdID0gZGFjX2N0cmw7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfTUNMS19GUkVRXSA9IG1jbGtfZnJlcTsKKwljczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8xKTsKKwljczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9NQ0xLX0ZSRVEpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfY3M0MjQ1X2FkY19wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKK3ZvaWQgc2V0X2NzNDI0NV9hZGNfcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsCiAJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCXU4IHZhbHVlOworCXVuc2lnbmVkIGNoYXIgYWRjX2N0cmw7CisJdW5zaWduZWQgY2hhciBtY2xrX2ZyZXE7CiAKLQl2YWx1ZSA9IGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BRENfQ1RSTF0gJiB+Q1M0MjQ1X0FEQ19GTV9NQVNLOwotCWlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDUwMDAwKQotCQl2YWx1ZSB8PSBDUzQyNDVfQURDX0ZNX1NJTkdMRTsKLQllbHNlIGlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDEwMDAwMCkKLQkJdmFsdWUgfD0gQ1M0MjQ1X0FEQ19GTV9ET1VCTEU7Ci0JZWxzZQotCQl2YWx1ZSB8PSBDUzQyNDVfQURDX0ZNX1FVQUQ7Ci0JY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfQURDX0NUUkwsIHZhbHVlKTsKKwlhZGNfY3RybCA9IGRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FEQ19DVFJMXSAmIH5DUzQyNDVfQURDX0ZNX01BU0s7CisJbWNsa19mcmVxID0gZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfTUNMS19GUkVRXSAmIH5DUzQyNDVfTUNMSzJfTUFTSzsKKwlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSA1MDAwMCkgeworCQlhZGNfY3RybCB8PSBDUzQyNDVfQURDX0ZNX1NJTkdMRTsKKwkJbWNsa19mcmVxIHw9IENTNDI0NV9NQ0xLXzEgPDwgQ1M0MjQ1X01DTEsyX1NISUZUOworCX0gZWxzZSBpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSAxMDAwMDApIHsKKwkJYWRjX2N0cmwgfD0gQ1M0MjQ1X0FEQ19GTV9ET1VCTEU7CisJCW1jbGtfZnJlcSB8PSBDUzQyNDVfTUNMS18xIDw8IENTNDI0NV9NQ0xLMl9TSElGVDsKKwl9IGVsc2UgeworCQlhZGNfY3RybCB8PSBDUzQyNDVfQURDX0ZNX1FVQUQ7CisJCW1jbGtfZnJlcSB8PSBDUzQyNDVfTUNMS18yIDw8IENTNDI0NV9NQ0xLMl9TSElGVDsKKwl9CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfQURDX0NUUkxdID0gYWRjX2N0cmw7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfTUNMS19GUkVRXSA9IG1jbGtfZnJlcTsKKwljczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9BRENfQ1RSTCk7CisJY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBDUzQyNDVfTUNMS19GUkVRKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hpZnRfYml0cyh1bnNpZ25lZCBpbnQgdmFsdWUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X2Zyb20sCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X3RvLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKQotewotCWlmIChzaGlmdF9mcm9tIDwgc2hpZnRfdG8pCi0JCXJldHVybiAodmFsdWUgPDwgKHNoaWZ0X3RvIC0gc2hpZnRfZnJvbSkpICYgbWFzazsKLQllbHNlCi0JCXJldHVybiAodmFsdWUgPj4gKHNoaWZ0X2Zyb20gLSBzaGlmdF90bykpICYgbWFzazsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhZGp1c3RfZGdfZGFjX3JvdXRpbmcoc3RydWN0IG94eWdlbiAqY2hpcCwKK3Vuc2lnbmVkIGludCBhZGp1c3RfZGdfZGFjX3JvdXRpbmcoc3RydWN0IG94eWdlbiAqY2hpcCwKIAkJCQkJICB1bnNpZ25lZCBpbnQgcGxheV9yb3V0aW5nKQogewotCXJldHVybiAocGxheV9yb3V0aW5nICYgT1hZR0VOX1BMQVlfREFDMF9TT1VSQ0VfTUFTSykgfAotCSAgICAgICBzaGlmdF9iaXRzKHBsYXlfcm91dGluZywKLQkJCSAgT1hZR0VOX1BMQVlfREFDMl9TT1VSQ0VfU0hJRlQsCi0JCQkgIE9YWUdFTl9QTEFZX0RBQzFfU09VUkNFX1NISUZULAotCQkJICBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9NQVNLKSB8Ci0JICAgICAgIHNoaWZ0X2JpdHMocGxheV9yb3V0aW5nLAotCQkJICBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9TSElGVCwKLQkJCSAgT1hZR0VOX1BMQVlfREFDMl9TT1VSQ0VfU0hJRlQsCi0JCQkgIE9YWUdFTl9QTEFZX0RBQzJfU09VUkNFX01BU0spIHwKLQkgICAgICAgc2hpZnRfYml0cyhwbGF5X3JvdXRpbmcsCi0JCQkgIE9YWUdFTl9QTEFZX0RBQzBfU09VUkNFX1NISUZULAotCQkJICBPWFlHRU5fUExBWV9EQUMzX1NPVVJDRV9TSElGVCwKLQkJCSAgT1hZR0VOX1BMQVlfREFDM19TT1VSQ0VfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbM10gPSB7Ci0JCSJTcGVha2VycyIsICJIZWFkcGhvbmVzIiwgIkZQIEhlYWRwaG9uZXMiCi0JfTsKLQotCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcm91dGluZyA9IDA7CiAKLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGRhdGEtPm91dHB1dF9zZWw7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1OCByZWc7Ci0JaW50IGNoYW5nZWQ7Ci0KLQlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoYW5nZWQgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IGRhdGEtPm91dHB1dF9zZWw7Ci0JaWYgKGNoYW5nZWQpIHsKLQkJZGF0YS0+b3V0cHV0X3NlbCA9IHZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0KLQkJcmVnID0gZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1NJR05BTF9TRUxdICYKLQkJCQkJCX5DUzQyNDVfQV9PVVRfU0VMX01BU0s7Ci0JCXJlZyB8PSBkYXRhLT5vdXRwdXRfc2VsID09IDIgPwotCQkJCUNTNDI0NV9BX09VVF9TRUxfREFDIDogQ1M0MjQ1X0FfT1VUX1NFTF9ISVo7Ci0JCWNzNDI0NV93cml0ZV9jYWNoZWQoY2hpcCwgQ1M0MjQ1X1NJR05BTF9TRUwsIHJlZyk7Ci0KLQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfREFDX0FfQ1RSTCwKLQkJCQkgICAgZGF0YS0+b3V0cHV0X3NlbCA/IGRhdGEtPmhwX3ZvbF9hdHQgOiAwKTsKLQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfREFDX0JfQ1RSTCwKLQkJCQkgICAgZGF0YS0+b3V0cHV0X3NlbCA/IGRhdGEtPmhwX3ZvbF9hdHQgOiAwKTsKLQotCQlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwKLQkJCQkgICAgICBkYXRhLT5vdXRwdXRfc2VsID09IDEgPyBHUElPX0hQX1JFQVIgOiAwLAotCQkJCSAgICAgIEdQSU9fSFBfUkVBUik7CisJc3dpdGNoIChkYXRhLT5vdXRwdXRfc2VsKSB7CisJY2FzZSBQTEFZQkFDS19EU1RfSFA6CisJY2FzZSBQTEFZQkFDS19EU1RfSFBfRlA6CisJCW94eWdlbl93cml0ZThfbWFza2VkKGNoaXAsIE9YWUdFTl9QTEFZX1JPVVRJTkcsCisJCQlPWFlHRU5fUExBWV9NVVRFMjMgfCBPWFlHRU5fUExBWV9NVVRFNDUgfAorCQkJT1hZR0VOX1BMQVlfTVVURTY3LCBPWFlHRU5fUExBWV9NVVRFX01BU0spOworCQlicmVhazsKKwljYXNlIFBMQVlCQUNLX0RTVF9NVUxUSUNIOgorCQlyb3V0aW5nID0gKDAgPDwgT1hZR0VOX1BMQVlfREFDMF9TT1VSQ0VfU0hJRlQpIHwKKwkJCSAgKDIgPDwgT1hZR0VOX1BMQVlfREFDMV9TT1VSQ0VfU0hJRlQpIHwKKwkJCSAgKDEgPDwgT1hZR0VOX1BMQVlfREFDMl9TT1VSQ0VfU0hJRlQpIHwKKwkJCSAgKDAgPDwgT1hZR0VOX1BMQVlfREFDM19TT1VSQ0VfU0hJRlQpOworCQlveHlnZW5fd3JpdGU4X21hc2tlZChjaGlwLCBPWFlHRU5fUExBWV9ST1VUSU5HLAorCQkJT1hZR0VOX1BMQVlfTVVURTAxLCBPWFlHRU5fUExBWV9NVVRFX01BU0spOworCQlicmVhazsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIGNoYW5nZWQ7CisJcmV0dXJuIHJvdXRpbmc7CiB9CiAKLXN0YXRpYyBpbnQgaHBfdm9sdW1lX29mZnNldF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1szXSA9IHsKLQkJIjwgNjQgb2htcyIsICI2NC0xNTAgb2htcyIsICIxNTAtMzAwIG9obXMiCi0JfTsKLQotCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBfdm9sdW1lX29mZnNldF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWlmIChkYXRhLT5ocF92b2xfYXR0ID4gMiAqIDcpCi0JCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOwotCWVsc2UgaWYgKGRhdGEtPmhwX3ZvbF9hdHQgPiAwKQotCQl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTsKLQllbHNlCi0JCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAyOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwX3ZvbHVtZV9vZmZzZXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdGF0aWMgY29uc3QgczggYXR0c1szXSA9IHsgMiAqIDE2LCAyICogNywgMCB9OwotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCXM4IGF0dDsKLQlpbnQgY2hhbmdlZDsKLQotCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JYXR0ID0gYXR0c1t2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXTsKLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JY2hhbmdlZCA9IGF0dCAhPSBkYXRhLT5ocF92b2xfYXR0OwotCWlmIChjaGFuZ2VkKSB7Ci0JCWRhdGEtPmhwX3ZvbF9hdHQgPSBhdHQ7Ci0JCWlmIChkYXRhLT5vdXRwdXRfc2VsKSB7Ci0JCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9EQUNfQV9DVFJMLCBhdHQpOwotCQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfREFDX0JfQ1RSTCwgYXR0KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotc3RhdGljIGludCBpbnB1dF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKLXsKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCWluZm8tPmNvdW50ID0gMjsKLQlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDIgKiAtMTI7Ci0JaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyICogMTI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5wdXRfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCi17Ci0Jc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0JdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKLQotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdOwotCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZGF0YS0+aW5wdXRfdm9sW2lkeF1bMV07Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5wdXRfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCi17Ci0Jc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0JdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgY2hhbmdlZCA9IDA7Ci0KLQlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPCAyICogLTEyIHx8Ci0JICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID4gMiAqIDEyIHx8Ci0JICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdIDwgMiAqIC0xMiB8fAotCSAgICB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA+IDIgKiAxMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoYW5nZWQgPSBkYXRhLT5pbnB1dF92b2xbaWR4XVswXSAhPSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSB8fAotCQkgIGRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdICE9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWlmIChjaGFuZ2VkKSB7Ci0JCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JCWlmIChpZHggPT0gZGF0YS0+aW5wdXRfc2VsKSB7Ci0JCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9QR0FfQV9DVFJMLAotCQkJCQkgICAgZGF0YS0+aW5wdXRfdm9sW2lkeF1bMF0pOwotCQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfUEdBX0JfQ1RSTCwKLQkJCQkJICAgIGRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdKTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGNzNDI0NV9wZ2FfZGJfc2NhbGUsIC0xMjAwLCA1MCwgMCk7Ci0KLXN0YXRpYyBpbnQgaW5wdXRfc2VsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzRdID0gewotCQkiTWljIiwgIkF1eCIsICJGcm9udCBNaWMiLCAiTGluZSIKLQl9OwotCi0JcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDQsIG5hbWVzKTsKLX0KLQotc3RhdGljIGludCBpbnB1dF9zZWxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZGF0YS0+aW5wdXRfc2VsOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlucHV0X3NlbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0YXRpYyBjb25zdCB1OCBzZWxfdmFsdWVzWzRdID0gewotCQlDUzQyNDVfU0VMX01JQywKLQkJQ1M0MjQ1X1NFTF9JTlBVVF8xLAotCQlDUzQyNDVfU0VMX0lOUFVUXzIsCi0JCUNTNDI0NV9TRUxfSU5QVVRfNAotCX07Ci0Jc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0JaW50IGNoYW5nZWQ7Ci0KLQlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoYW5nZWQgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IGRhdGEtPmlucHV0X3NlbDsKLQlpZiAoY2hhbmdlZCkgewotCQlkYXRhLT5pbnB1dF9zZWwgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCi0JCWNzNDI0NV93cml0ZShjaGlwLCBDUzQyNDVfQU5BTE9HX0lOLAotCQkJICAgICAoZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0FOQUxPR19JTl0gJgotCQkJCQkJCX5DUzQyNDVfU0VMX01BU0spIHwKLQkJCSAgICAgc2VsX3ZhbHVlc1tkYXRhLT5pbnB1dF9zZWxdKTsKLQotCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9QR0FfQV9DVFJMLAotCQkJCSAgICBkYXRhLT5pbnB1dF92b2xbZGF0YS0+aW5wdXRfc2VsXVswXSk7Ci0JCWNzNDI0NV93cml0ZV9jYWNoZWQoY2hpcCwgQ1M0MjQ1X1BHQV9CX0NUUkwsCi0JCQkJICAgIGRhdGEtPmlucHV0X3ZvbFtkYXRhLT5pbnB1dF9zZWxdWzFdKTsKLQotCQlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwKLQkJCQkgICAgICBkYXRhLT5pbnB1dF9zZWwgPyAwIDogR1BJT19JTlBVVF9ST1VURSwKLQkJCQkgICAgICBHUElPX0lOUFVUX1JPVVRFKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIGNoYW5nZWQ7Ci19Ci0KLXN0YXRpYyBpbnQgaHBmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzJdID0geyAiQWN0aXZlIiwgIkZyb3plbiIgfTsKLQotCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAyLCBuYW1lcyk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCi0JdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCSEhKGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BRENfQ1RSTF0gJiBDUzQyNDVfSFBGX0ZSRUVaRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBmX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCXU4IHJlZzsKLQlpbnQgY2hhbmdlZDsKLQotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQlyZWcgPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdICYgfkNTNDI0NV9IUEZfRlJFRVpFOwotCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKQotCQlyZWcgfD0gQ1M0MjQ1X0hQRl9GUkVFWkU7Ci0JY2hhbmdlZCA9IHJlZyAhPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdOwotCWlmIChjaGFuZ2VkKQotCQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0FEQ19DVFJMLCByZWcpOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotCXJldHVybiBjaGFuZ2VkOwotfQotCi0jZGVmaW5lIElOUFVUX1ZPTFVNRSh4bmFtZSwgaW5kZXgpIHsgXAotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCi0JLm5hbWUgPSB4bmFtZSwgXAotCS5pbmZvID0gaW5wdXRfdm9sX2luZm8sIFwKLQkuZ2V0ID0gaW5wdXRfdm9sX2dldCwgXAotCS5wdXQgPSBpbnB1dF92b2xfcHV0LCBcCi0JLnRsdiA9IHsgLnAgPSBjczQyNDVfcGdhX2RiX3NjYWxlIH0sIFwKLQkucHJpdmF0ZV92YWx1ZSA9IGluZGV4LCBcCi19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGdfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJBbmFsb2cgT3V0cHV0IFBsYXliYWNrIEVudW0iLAotCQkuaW5mbyA9IG91dHB1dF9zd2l0Y2hfaW5mbywKLQkJLmdldCA9IG91dHB1dF9zd2l0Y2hfZ2V0LAotCQkucHV0ID0gb3V0cHV0X3N3aXRjaF9wdXQsCi0JfSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJIZWFkcGhvbmVzIEltcGVkYW5jZSBQbGF5YmFjayBFbnVtIiwKLQkJLmluZm8gPSBocF92b2x1bWVfb2Zmc2V0X2luZm8sCi0JCS5nZXQgPSBocF92b2x1bWVfb2Zmc2V0X2dldCwKLQkJLnB1dCA9IGhwX3ZvbHVtZV9vZmZzZXRfcHV0LAotCX0sCi0JSU5QVVRfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKLQlJTlBVVF9WT0xVTUUoIkF1eCBDYXB0dXJlIFZvbHVtZSIsIDEpLAotCUlOUFVUX1ZPTFVNRSgiRnJvbnQgTWljIENhcHR1cmUgVm9sdW1lIiwgMiksCi0JSU5QVVRfVk9MVU1FKCJMaW5lIENhcHR1cmUgVm9sdW1lIiwgMyksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAotCQkuaW5mbyA9IGlucHV0X3NlbF9pbmZvLAotCQkuZ2V0ID0gaW5wdXRfc2VsX2dldCwKLQkJLnB1dCA9IGlucHV0X3NlbF9wdXQsCi0JfSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJBREMgSGlnaC1wYXNzIEZpbHRlciBDYXB0dXJlIEVudW0iLAotCQkuaW5mbyA9IGhwZl9pbmZvLAotCQkuZ2V0ID0gaHBmX2dldCwKLQkJLnB1dCA9IGhwZl9wdXQsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgZGdfY29udHJvbF9maWx0ZXIoc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKnRlbXBsYXRlKQotewotCWlmICghc3RybmNtcCh0ZW1wbGF0ZS0+bmFtZSwgIk1hc3RlciBQbGF5YmFjayAiLCAxNikpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRnX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgZXJyOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGdfY29udHJvbHMpOyArK2kpIHsKLQkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwKLQkJCQkgIHNuZF9jdGxfbmV3MSgmZGdfY29udHJvbHNbaV0sIGNoaXApKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9jczQyNDVfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCit2b2lkIGR1bXBfY3M0MjQ1X3JlZ2lzdGVycyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0JdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGFkZHI7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsICJcbkNTNDI0NToiKTsKLQlmb3IgKGkgPSAxOyBpIDw9IDB4MTA7ICsraSkKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiICUwMngiLCBkYXRhLT5jczQyNDVfcmVnc1tpXSk7CisJY3M0MjQ1X3JlYWRfc3BpKGNoaXAsIENTNDI0NV9JTlRfU1RBVFVTKTsKKwlmb3IgKGFkZHIgPSAxOyBhZGRyIDwgQVJSQVlfU0laRShkYXRhLT5jczQyNDVfc2hhZG93KTsgYWRkcisrKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgJTAyeCIsIGRhdGEtPmNzNDI0NV9zaGFkb3dbYWRkcl0pOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CiB9Ci0KLXN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfeG9uYXJfZGcgPSB7Ci0JLmxvbmduYW1lID0gIkMtTWVkaWEgT3h5Z2VuIEhEIEF1ZGlvIiwKLQkuY2hpcCA9ICJDTUk4Nzg2IiwKLQkuaW5pdCA9IGRnX2luaXQsCi0JLmNvbnRyb2xfZmlsdGVyID0gZGdfY29udHJvbF9maWx0ZXIsCi0JLm1peGVyX2luaXQgPSBkZ19taXhlcl9pbml0LAotCS5jbGVhbnVwID0gZGdfY2xlYW51cCwKLQkuc3VzcGVuZCA9IGRnX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGRnX3Jlc3VtZSwKLQkuc2V0X2RhY19wYXJhbXMgPSBzZXRfY3M0MjQ1X2RhY19wYXJhbXMsCi0JLnNldF9hZGNfcGFyYW1zID0gc2V0X2NzNDI0NV9hZGNfcGFyYW1zLAotCS5hZGp1c3RfZGFjX3JvdXRpbmcgPSBhZGp1c3RfZGdfZGFjX3JvdXRpbmcsCi0JLmR1bXBfcmVnaXN0ZXJzID0gZHVtcF9jczQyNDVfcmVnaXN0ZXJzLAotCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRnKSwKLQkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKLQkJCSBQTEFZQkFDS18xX1RPX1NQRElGIHwKLQkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMiB8Ci0JCQkgQ0FQVFVSRV8xX0ZST01fU1BESUYsCi0JLmRhY19jaGFubmVsc19wY20gPSA2LAotCS5kYWNfY2hhbm5lbHNfbWl4ZXIgPSAwLAotCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl9TUEksCi0JLmRhY19tY2xrcyA9IE9YWUdFTl9NQ0xLUygyNTYsIDEyOCwgMTI4KSwKLQkuYWRjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMTI4LCAxMjgpLAotCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuaCBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuaAppbmRleCA1Njg4ZDc4Li5kNDYxZGYzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmgKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5oCkBAIC0zLDYgKzMsNTQgQEAKIAogI2luY2x1ZGUgIm94eWdlbi5oIgogCisjZGVmaW5lIEdQSU9fTUFHSUMJCTB4MDAwOAorI2RlZmluZSBHUElPX0hQX0RFVEVDVAkJMHgwMDEwCisjZGVmaW5lIEdQSU9fSU5QVVRfUk9VVEUJMHgwMDYwCisjZGVmaW5lIEdQSU9fSFBfUkVBUgkJMHgwMDgwCisjZGVmaW5lIEdQSU9fT1VUUFVUX0VOQUJMRQkweDAxMDAKKworI2RlZmluZSBDQVBUVVJFX1NSQ19NSUMJCTAKKyNkZWZpbmUgQ0FQVFVSRV9TUkNfRlBfTUlDCTEKKyNkZWZpbmUgQ0FQVFVSRV9TUkNfTElORQkyCisjZGVmaW5lIENBUFRVUkVfU1JDX0FVWAkJMworCisjZGVmaW5lIFBMQVlCQUNLX0RTVF9IUAkJMAorI2RlZmluZSBQTEFZQkFDS19EU1RfSFBfRlAJMQorI2RlZmluZSBQTEFZQkFDS19EU1RfTVVMVElDSAkyCisKK2VudW0gY3M0MjQ1X3NoYWRvd19vcGVyYXRpb24geworCUNTNDI0NV9TQVZFX1RPX1NIQURPVywKKwlDUzQyNDVfTE9BRF9GUk9NX1NIQURPVworfTsKKworc3RydWN0IGRnIHsKKwkvKiBzaGFkb3cgY29weSBvZiB0aGUgQ1M0MjQ1IHJlZ2lzdGVyIHNwYWNlICovCisJdW5zaWduZWQgY2hhciBjczQyNDVfc2hhZG93WzE3XTsKKwkvKiBvdXRwdXQgc2VsZWN0OiBoZWFkcGhvbmUvc3BlYWtlcnMgKi8KKwl1bnNpZ25lZCBjaGFyIG91dHB1dF9zZWw7CisJLyogdm9sdW1lcyBmb3IgYWxsIGNhcHR1cmUgc291cmNlcyAqLworCWNoYXIgaW5wdXRfdm9sWzRdWzJdOworCS8qIGlucHV0IHNlbGVjdDogbWljL2ZwIG1pYy9saW5lL2F1eCAqLworCXVuc2lnbmVkIGNoYXIgaW5wdXRfc2VsOworfTsKKworLyogWG9uYXIgREcgY29udHJvbCByb3V0aW5lcyAqLworaW50IGNzNDI0NV93cml0ZV9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggcmVnKTsKK2ludCBjczQyNDVfcmVhZF9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggcmVnKTsKK2ludCBjczQyNDVfc2hhZG93X2NvbnRyb2woc3RydWN0IG94eWdlbiAqY2hpcCwgZW51bSBjczQyNDVfc2hhZG93X29wZXJhdGlvbiBvcCk7Cit2b2lkIGRnX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCk7Cit2b2lkIHNldF9jczQyNDVfZGFjX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwordm9pZCBzZXRfY3M0MjQ1X2FkY19wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKK3Vuc2lnbmVkIGludCBhZGp1c3RfZGdfZGFjX3JvdXRpbmcoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcGxheV9yb3V0aW5nKTsKK3ZvaWQgZHVtcF9jczQyNDVfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKTsKK3ZvaWQgZGdfc3VzcGVuZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKK3ZvaWQgZGdfcmVzdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApOwordm9pZCBkZ19jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApOworCiBleHRlcm4gc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9kZzsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnX21peGVyLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnX21peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4NWRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGdfbWl4ZXIuYwpAQCAtMCwwICsxLDQ3NyBAQAorLyoKKyAqIE1peGVyIGNvbnRyb2xzIGZvciB0aGUgWG9uYXIgREcvREdYCisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqIENvcHlyaWdodCAoYykgUm9tYW4gVm9sa292IDx2MXJvbkBtYWlsLnJ1PgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGRyaXZlcjsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgIm94eWdlbi5oIgorI2luY2x1ZGUgInhvbmFyX2RnLmgiCisjaW5jbHVkZSAiY3M0MjQ1LmgiCisKKy8qIGFuYWxvZyBvdXRwdXQgc2VsZWN0ICovCisKK3N0YXRpYyBpbnQgb3V0cHV0X3NlbGVjdF9hcHBseShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9TSUdOQUxfU0VMXSAmPSB+Q1M0MjQ1X0FfT1VUX1NFTF9NQVNLOworCWlmIChkYXRhLT5vdXRwdXRfc2VsID09IFBMQVlCQUNLX0RTVF9IUCkgeworCQkvKiBtdXRlIEZQIChhdXggb3V0cHV0KSBhbXBsaWZpZXIsIHN3aXRjaCByZWFyIGphY2sgdG8gQ1M0MjQ1ICovCisJCW94eWdlbl9zZXRfYml0czgoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwgR1BJT19IUF9SRUFSKTsKKwl9IGVsc2UgaWYgKGRhdGEtPm91dHB1dF9zZWwgPT0gUExBWUJBQ0tfRFNUX0hQX0ZQKSB7CisJCS8qCisJCSAqIFVubXV0ZSBGUCBhbXBsaWZpZXIsIHN3aXRjaCByZWFyIGphY2sgdG8gQ1M0MzYxOworCQkgKiBJMlMgY2hhbm5lbHMgMiwzLDQgc2hvdWxkIGJlIGluYWN0aXZlLgorCQkgKi8KKwkJb3h5Z2VuX2NsZWFyX2JpdHM4KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIEdQSU9fSFBfUkVBUik7CisJCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X1NJR05BTF9TRUxdIHw9IENTNDI0NV9BX09VVF9TRUxfREFDOworCX0gZWxzZSB7CisJCS8qCisJCSAqIDIuMCwgNC4wLCA1LjE6IHN3aXRjaCB0byBDUzQzNjEsIG11dGUgRlAgYW1wLiwKKwkJICogYW5kIGNoYW5nZSBwbGF5YmFjayByb3V0aW5nLgorCQkgKi8KKwkJb3h5Z2VuX2NsZWFyX2JpdHM4KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIEdQSU9fSFBfUkVBUik7CisJfQorCXJldHVybiBjczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9TSUdOQUxfU0VMKTsKK30KKworc3RhdGljIGludCBvdXRwdXRfc2VsZWN0X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1szXSA9IHsKKwkJIlN0ZXJlbyBIZWFkcGhvbmVzIiwKKwkJIlN0ZXJlbyBIZWFkcGhvbmVzIEZQIiwKKwkJIk11bHRpY2hhbm5lbCIsCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X3NlbGVjdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZGF0YS0+b3V0cHV0X3NlbDsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdXRwdXRfc2VsZWN0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXVuc2lnbmVkIGludCBuZXcgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWludCBjaGFuZ2VkID0gMDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWlmIChkYXRhLT5vdXRwdXRfc2VsICE9IG5ldykgeworCQlkYXRhLT5vdXRwdXRfc2VsID0gbmV3OworCQlyZXQgPSBvdXRwdXRfc2VsZWN0X2FwcGx5KGNoaXApOworCQljaGFuZ2VkID0gcmV0ID49IDAgPyAxIDogcmV0OworCQlveHlnZW5fdXBkYXRlX2RhY19yb3V0aW5nKGNoaXApOworCX0KKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKworCXJldHVybiBjaGFuZ2VkOworfQorCisvKiBDUzQyNDUgSGVhZHBob25lIENoYW5uZWxzIEEmQiBWb2x1bWUgQ29udHJvbCAqLworCitzdGF0aWMgaW50IGhwX3N0ZXJlb192b2x1bWVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJaW5mby0+Y291bnQgPSAyOworCWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocF9zdGVyZW9fdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXVuc2lnbmVkIGludCB0bXA7CisKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJdG1wID0gKH5kYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9EQUNfQV9DVFJMXSkgJiAyNTU7CisJdmFsLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdG1wOworCXRtcCA9ICh+ZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0JfQ1RSTF0pICYgMjU1OworCXZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHRtcDsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocF9zdGVyZW9fdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCWludCByZXQ7CisJaW50IGNoYW5nZWQgPSAwOworCWxvbmcgbmV3MSA9IHZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlsb25nIG5ldzIgPSB2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisKKwlpZiAoKG5ldzEgPiAyNTUpIHx8IChuZXcxIDwgMCkgfHwgKG5ldzIgPiAyNTUpIHx8IChuZXcyIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWlmICgoZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0FfQ1RSTF0gIT0gfm5ldzEpIHx8CisJICAgIChkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9EQUNfQl9DVFJMXSAhPSB+bmV3MikpIHsKKwkJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0FfQ1RSTF0gPSB+bmV3MTsKKwkJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0JfQ1RSTF0gPSB+bmV3MjsKKwkJcmV0ID0gY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBDUzQyNDVfREFDX0FfQ1RSTCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IGNzNDI0NV93cml0ZV9zcGkoY2hpcCwgQ1M0MjQ1X0RBQ19CX0NUUkwpOworCQljaGFuZ2VkID0gcmV0ID49IDAgPyAxIDogcmV0OworCX0KKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKworCXJldHVybiBjaGFuZ2VkOworfQorCisvKiBIZWFkcGhvbmUgTXV0ZSAqLworCitzdGF0aWMgaW50IGhwX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbCkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkhKGRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0RBQ19DVFJMXzFdICYgQ1M0MjQ1X01VVEVfREFDKTsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocF9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWwpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJaW50IHJldDsKKwlpbnQgY2hhbmdlZDsKKworCWlmICh2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfREFDX0NUUkxfMV0gJj0gfkNTNDI0NV9NVVRFX0RBQzsKKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9EQUNfQ1RSTF8xXSB8PQorCQkofnZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8PCAyKSAmIENTNDI0NV9NVVRFX0RBQzsKKwlyZXQgPSBjczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8xKTsKKwljaGFuZ2VkID0gcmV0ID49IDAgPyAxIDogcmV0OworCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCisvKiBjYXB0dXJlIHZvbHVtZSBmb3IgYWxsIHNvdXJjZXMgKi8KKworc3RhdGljIGludCBpbnB1dF92b2x1bWVfYXBwbHkoc3RydWN0IG94eWdlbiAqY2hpcCwgY2hhciBsZWZ0LCBjaGFyIHJpZ2h0KQoreworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJaW50IHJldDsKKworCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X1BHQV9BX0NUUkxdID0gbGVmdDsKKwlkYXRhLT5jczQyNDVfc2hhZG93W0NTNDI0NV9QR0FfQl9DVFJMXSA9IHJpZ2h0OworCXJldCA9IGNzNDI0NV93cml0ZV9zcGkoY2hpcCwgQ1M0MjQ1X1BHQV9BX0NUUkwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9QR0FfQl9DVFJMKTsKK30KKworc3RhdGljIGludCBpbnB1dF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMjsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDIgKiAtMTI7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyICogMTI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdOworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZGF0YS0+aW5wdXRfdm9sW2lkeF1bMV07CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgY2hhbmdlZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPCAyICogLTEyIHx8CisJICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID4gMiAqIDEyIHx8CisJICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdIDwgMiAqIC0xMiB8fAorCSAgICB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA+IDIgKiAxMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWNoYW5nZWQgPSBkYXRhLT5pbnB1dF92b2xbaWR4XVswXSAhPSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSB8fAorCQkgIGRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdICE9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmIChjaGFuZ2VkKSB7CisJCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJCWlmIChpZHggPT0gZGF0YS0+aW5wdXRfc2VsKSB7CisJCQlyZXQgPSBpbnB1dF92b2x1bWVfYXBwbHkoY2hpcCwKKwkJCQlkYXRhLT5pbnB1dF92b2xbaWR4XVswXSwKKwkJCQlkYXRhLT5pbnB1dF92b2xbaWR4XVsxXSk7CisJCX0KKwkJY2hhbmdlZCA9IHJldCA+PSAwID8gMSA6IHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qIENhcHR1cmUgU291cmNlICovCisKK3N0YXRpYyBpbnQgaW5wdXRfc291cmNlX2FwcGx5KHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FOQUxPR19JTl0gJj0gfkNTNDI0NV9TRUxfTUFTSzsKKwlpZiAoZGF0YS0+aW5wdXRfc2VsID09IENBUFRVUkVfU1JDX0ZQX01JQykKKwkJZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfQU5BTE9HX0lOXSB8PSBDUzQyNDVfU0VMX0lOUFVUXzI7CisJZWxzZSBpZiAoZGF0YS0+aW5wdXRfc2VsID09IENBUFRVUkVfU1JDX0xJTkUpCisJCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FOQUxPR19JTl0gfD0gQ1M0MjQ1X1NFTF9JTlBVVF80OworCWVsc2UgaWYgKGRhdGEtPmlucHV0X3NlbCAhPSBDQVBUVVJFX1NSQ19NSUMpCisJCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FOQUxPR19JTl0gfD0gQ1M0MjQ1X1NFTF9JTlBVVF8xOworCXJldHVybiBjczQyNDVfd3JpdGVfc3BpKGNoaXAsIENTNDI0NV9BTkFMT0dfSU4pOworfQorCitzdGF0aWMgaW50IGlucHV0X3NlbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1s0XSA9IHsKKwkJIk1pYyIsICJGcm9udCBNaWMiLCAiTGluZSIsICJBdXgiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCA0LCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfc2VsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGRhdGEtPmlucHV0X3NlbDsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnB1dF9zZWxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwlpbnQgY2hhbmdlZDsKKwlpbnQgcmV0OworCisJaWYgKHZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwljaGFuZ2VkID0gdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAhPSBkYXRhLT5pbnB1dF9zZWw7CisJaWYgKGNoYW5nZWQpIHsKKwkJZGF0YS0+aW5wdXRfc2VsID0gdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKworCQlyZXQgPSBpbnB1dF9zb3VyY2VfYXBwbHkoY2hpcCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IGlucHV0X3ZvbHVtZV9hcHBseShjaGlwLAorCQkJCWRhdGEtPmlucHV0X3ZvbFtkYXRhLT5pbnB1dF9zZWxdWzBdLAorCQkJCWRhdGEtPmlucHV0X3ZvbFtkYXRhLT5pbnB1dF9zZWxdWzFdKTsKKwkJY2hhbmdlZCA9IHJldCA+PSAwID8gMSA6IHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qIEFEQyBoaWdoLXBhc3MgZmlsdGVyICovCisKK3N0YXRpYyBpbnQgaHBmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzJdID0geyAiQWN0aXZlIiwgIkZyb3plbiIgfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAyLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgaHBmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCSEhKGRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FEQ19DVFJMXSAmIENTNDI0NV9IUEZfRlJFRVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGZfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdTggcmVnOworCWludCBjaGFuZ2VkOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCXJlZyA9IGRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FEQ19DVFJMXSAmIH5DUzQyNDVfSFBGX0ZSRUVaRTsKKwlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKKwkJcmVnIHw9IENTNDI0NV9IUEZfRlJFRVpFOworCWNoYW5nZWQgPSByZWcgIT0gZGF0YS0+Y3M0MjQ1X3NoYWRvd1tDUzQyNDVfQURDX0NUUkxdOworCWlmIChjaGFuZ2VkKSB7CisJCWRhdGEtPmNzNDI0NV9zaGFkb3dbQ1M0MjQ1X0FEQ19DVFJMXSA9IHJlZzsKKwkJY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBDUzQyNDVfQURDX0NUUkwpOworCX0KKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworI2RlZmluZSBJTlBVVF9WT0xVTUUoeG5hbWUsIGluZGV4KSB7IFwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorCS5uYW1lID0geG5hbWUsIFwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFwKKwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsIFwKKwkuaW5mbyA9IGlucHV0X3ZvbF9pbmZvLCBcCisJLmdldCA9IGlucHV0X3ZvbF9nZXQsIFwKKwkucHV0ID0gaW5wdXRfdm9sX3B1dCwgXAorCS50bHYgPSB7IC5wID0gcGdhX2RiX3NjYWxlIH0sIFwKKwkucHJpdmF0ZV92YWx1ZSA9IGluZGV4LCBcCit9CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKGhwX2RiX3NjYWxlLCAtMTI1NTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1BWChwZ2FfZGJfc2NhbGUsIC0xMjAwLCAxMjAwKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkZ19jb250cm9sc1tdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkFuYWxvZyBPdXRwdXQgUGxheWJhY2sgRW51bSIsCisJCS5pbmZvID0gb3V0cHV0X3NlbGVjdF9pbmZvLAorCQkuZ2V0ID0gb3V0cHV0X3NlbGVjdF9nZXQsCisJCS5wdXQgPSBvdXRwdXRfc2VsZWN0X3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKKwkJLmluZm8gPSBocF9zdGVyZW9fdm9sdW1lX2luZm8sCisJCS5nZXQgPSBocF9zdGVyZW9fdm9sdW1lX2dldCwKKwkJLnB1dCA9IGhwX3N0ZXJlb192b2x1bWVfcHV0LAorCQkudGx2ID0geyAucCA9IGhwX2RiX3NjYWxlLCB9LAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBocF9tdXRlX2dldCwKKwkJLnB1dCA9IGhwX211dGVfcHV0LAorCX0sCisJSU5QVVRfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCBDQVBUVVJFX1NSQ19NSUMpLAorCUlOUFVUX1ZPTFVNRSgiRnJvbnQgTWljIENhcHR1cmUgVm9sdW1lIiwgQ0FQVFVSRV9TUkNfRlBfTUlDKSwKKwlJTlBVVF9WT0xVTUUoIkxpbmUgQ2FwdHVyZSBWb2x1bWUiLCBDQVBUVVJFX1NSQ19MSU5FKSwKKwlJTlBVVF9WT0xVTUUoIkF1eCBDYXB0dXJlIFZvbHVtZSIsIENBUFRVUkVfU1JDX0FVWCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGlucHV0X3NlbF9pbmZvLAorCQkuZ2V0ID0gaW5wdXRfc2VsX2dldCwKKwkJLnB1dCA9IGlucHV0X3NlbF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgSGlnaC1wYXNzIEZpbHRlciBDYXB0dXJlIEVudW0iLAorCQkuaW5mbyA9IGhwZl9pbmZvLAorCQkuZ2V0ID0gaHBmX2dldCwKKwkJLnB1dCA9IGhwZl9wdXQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgZGdfY29udHJvbF9maWx0ZXIoc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKnRlbXBsYXRlKQoreworCWlmICghc3RybmNtcCh0ZW1wbGF0ZS0+bmFtZSwgIk1hc3RlciBQbGF5YmFjayAiLCAxNikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRnX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJb3V0cHV0X3NlbGVjdF9hcHBseShjaGlwKTsKKwlpbnB1dF9zb3VyY2VfYXBwbHkoY2hpcCk7CisJb3h5Z2VuX3VwZGF0ZV9kYWNfcm91dGluZyhjaGlwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRnX2NvbnRyb2xzKTsgKytpKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsCisJCQkJICBzbmRfY3RsX25ldzEoJmRnX2NvbnRyb2xzW2ldLCBjaGlwKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9kZyA9IHsKKwkubG9uZ25hbWUgPSAiQy1NZWRpYSBPeHlnZW4gSEQgQXVkaW8iLAorCS5jaGlwID0gIkNNSTg3ODYiLAorCS5pbml0ID0gZGdfaW5pdCwKKwkuY29udHJvbF9maWx0ZXIgPSBkZ19jb250cm9sX2ZpbHRlciwKKwkubWl4ZXJfaW5pdCA9IGRnX21peGVyX2luaXQsCisJLmNsZWFudXAgPSBkZ19jbGVhbnVwLAorCS5zdXNwZW5kID0gZGdfc3VzcGVuZCwKKwkucmVzdW1lID0gZGdfcmVzdW1lLAorCS5zZXRfZGFjX3BhcmFtcyA9IHNldF9jczQyNDVfZGFjX3BhcmFtcywKKwkuc2V0X2FkY19wYXJhbXMgPSBzZXRfY3M0MjQ1X2FkY19wYXJhbXMsCisJLmFkanVzdF9kYWNfcm91dGluZyA9IGFkanVzdF9kZ19kYWNfcm91dGluZywKKwkuZHVtcF9yZWdpc3RlcnMgPSBkdW1wX2NzNDI0NV9yZWdpc3RlcnMsCisJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGcpLAorCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAorCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAorCQkJIENBUFRVUkVfMF9GUk9NX0kyU18xIHwKKwkJCSBDQVBUVVJFXzFfRlJPTV9TUERJRiwKKwkuZGFjX2NoYW5uZWxzX3BjbSA9IDYsCisJLmRhY19jaGFubmVsc19taXhlciA9IDAsCisJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMTI4LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCksCisJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwppbmRleCAzODVkZWMxLi42ODgxNTFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwpAQCAtNDUwLDYgKzQ1MCwxNyBAQAogCX0KIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X0lGQUNFMSwgZGF0YSk7CiAKKwlpZiAocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykgPT0gMSkgeworCQlkYXRhID0gQUlDMzJYNF9SREFDMkxDSE4gfCBBSUMzMlg0X0xEQUMyTENITjsKKwl9IGVsc2UgeworCQlpZiAoYWljMzJ4NC0+c3dhcGRhY3MpCisJCQlkYXRhID0gQUlDMzJYNF9SREFDMkxDSE4gfCBBSUMzMlg0X0xEQUMyUkNITjsKKwkJZWxzZQorCQkJZGF0YSA9IEFJQzMyWDRfTERBQzJMQ0hOIHwgQUlDMzJYNF9SREFDMlJDSE47CisJfQorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfREFDU0VUVVAsIEFJQzMyWDRfREFDX0NIQU5fTUFTSywKKwkJCWRhdGEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwNiwyMCArNjE3LDE1IEBACiAJfQogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfQ01NT0RFLCB0bXBfcmVnKTsKIAotCS8qIERvIERBQ3MgbmVlZCB0byBiZSBzd2FwcGVkPyAqLwotCWlmIChhaWMzMng0LT5zd2FwZGFjcykgewotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X0RBQ1NFVFVQLCBBSUMzMlg0X0xEQUMyUkNITiB8IEFJQzMyWDRfUkRBQzJMQ0hOKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X0RBQ1NFVFVQLCBBSUMzMlg0X0xEQUMyTENITiB8IEFJQzMyWDRfUkRBQzJSQ0hOKTsKLQl9Ci0KIAkvKiBNaWMgUEdBIHJvdXRpbmcgKi8KLQlpZiAoYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgJiBBSUMzMlg0X01JQ1BHQV9ST1VURV9MTUlDX0lOMlJfMTBLKSB7CisJaWYgKGFpYzMyeDQtPm1pY3BnYV9yb3V0aW5nICYgQUlDMzJYNF9NSUNQR0FfUk9VVEVfTE1JQ19JTjJSXzEwSykKIAkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9MTUlDUEdBTklOLCBBSUMzMlg0X0xNSUNQR0FOSU5fSU4yUl8xMEspOwotCX0KLQlpZiAoYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgJiBBSUMzMlg0X01JQ1BHQV9ST1VURV9STUlDX0lOMUxfMTBLKSB7CisJZWxzZQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X0xNSUNQR0FOSU4sIEFJQzMyWDRfTE1JQ1BHQU5JTl9DTTFMXzEwSyk7CisJaWYgKGFpYzMyeDQtPm1pY3BnYV9yb3V0aW5nICYgQUlDMzJYNF9NSUNQR0FfUk9VVEVfUk1JQ19JTjFMXzEwSykKIAkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9STUlDUEdBTklOLCBBSUMzMlg0X1JNSUNQR0FOSU5fSU4xTF8xMEspOwotCX0KKwllbHNlCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfUk1JQ1BHQU5JTiwgQUlDMzJYNF9STUlDUEdBTklOX0NNMVJfMTBLKTsKIAogCWFpYzMyeDRfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuaAppbmRleCAzNTc3NDIyLi45OTVmMDMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuaApAQCAtMTIwLDcgKzEyMCw5IEBACiAjZGVmaW5lIEFJQzMyWDRfTUlDQklBU18yMDc1VgkJMHg2MAogCiAjZGVmaW5lIEFJQzMyWDRfTE1JQ1BHQU5JTl9JTjJSXzEwSwkweDEwCisjZGVmaW5lIEFJQzMyWDRfTE1JQ1BHQU5JTl9DTTFMXzEwSwkweDQwCiAjZGVmaW5lIEFJQzMyWDRfUk1JQ1BHQU5JTl9JTjFMXzEwSwkweDEwCisjZGVmaW5lIEFJQzMyWDRfUk1JQ1BHQU5JTl9DTTFSXzEwSwkweDQwCiAKICNkZWZpbmUgQUlDMzJYNF9MTUlDUEdBVk9MX05PR0FJTgkweDgwCiAjZGVmaW5lIEFJQzMyWDRfUk1JQ1BHQVZPTF9OT0dBSU4JMHg4MApAQCAtMTM4LDYgKzE0MCw3IEBACiAjZGVmaW5lIEFJQzMyWDRfTERBQzJSQ0hOCQkoMHgwMiA8PCA0KQogI2RlZmluZSBBSUMzMlg0X0xEQUMyTENITgkJKDB4MDEgPDwgNCkKICNkZWZpbmUgQUlDMzJYNF9SREFDMlJDSE4JCSgweDAxIDw8IDIpCisjZGVmaW5lIEFJQzMyWDRfREFDX0NIQU5fTUFTSwkJMHgzYwogCiAjZGVmaW5lIEFJQzMyWDRfU1NURVAyV0NMSwkJMHgwMQogI2RlZmluZSBBSUMzMlg0X01VVEVPTgkJCTB4MEMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCmluZGV4IDRjZjkxZGUuLjRlM2UzMWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9nY2QuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC0yMTQxLDYgKzIxNDIsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTUxMDBfZGV0ZWN0KTsKIAogc3RhdGljIGlycXJldHVybl90IHdtNTEwMF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCmluZGV4IGQ4NjJmNzYuLjJjM2M5NjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYwpAQCAtODEsNiArODEsNTQgQEAKIAl7IDB4MzEzMywgMHgxMjAxIH0sCiAJeyAweDMxODMsIDB4MTUwMSB9LAogCXsgMHgzMUQzLCAweDE0MDEgfSwKKwl7IDB4MDA0OSwgMHgwMWVhIH0sCisJeyAweDAwNGEsIDB4MDFmMiB9LAorCXsgMHgwMDU3LCAweDAxZTcgfSwKKwl7IDB4MDA1OCwgMHgwMWZiIH0sCisJeyAweDMzY2UsIDB4YzRmNSB9LAorCXsgMHgzM2NmLCAweDEzNjEgfSwKKwl7IDB4MzNkMCwgMHgwNDAyIH0sCisJeyAweDMzZDEsIDB4NDcwMCB9LAorCXsgMHgzM2QyLCAweDAyNmQgfSwKKwl7IDB4MzNkMywgMHhmZjAwIH0sCisJeyAweDMzZDQsIDB4MDI2ZCB9LAorCXsgMHgzM2Q1LCAweDAxMDEgfSwKKwl7IDB4MzNkNiwgMHhjNGY1IH0sCisJeyAweDMzZDcsIDB4MDM2MSB9LAorCXsgMHgzM2Q4LCAweDA0MDIgfSwKKwl7IDB4MzNkOSwgMHg2NzAxIH0sCisJeyAweDMzZGEsIDB4YzRmNSB9LAorCXsgMHgzM2RiLCAweDEzNmYgfSwKKwl7IDB4MzNkYywgMHhjNGY1IH0sCisJeyAweDMzZGQsIDB4MTM0ZiB9LAorCXsgMHgzM2RlLCAweGM0ZjUgfSwKKwl7IDB4MzNkZiwgMHgxMzFmIH0sCisJeyAweDMzZTAsIDB4MDI2ZCB9LAorCXsgMHgzM2UxLCAweDRmMDEgfSwKKwl7IDB4MzNlMiwgMHgwMjZkIH0sCisJeyAweDMzZTMsIDB4ZjEwMCB9LAorCXsgMHgzM2U0LCAweDAyNmQgfSwKKwl7IDB4MzNlNSwgMHgwMDAxIH0sCisJeyAweDMzZTYsIDB4YzRmNSB9LAorCXsgMHgzM2U3LCAweDAzNjEgfSwKKwl7IDB4MzNlOCwgMHgwNDAyIH0sCisJeyAweDMzZTksIDB4NjYwMSB9LAorCXsgMHgzM2VhLCAweGM0ZjUgfSwKKwl7IDB4MzNlYiwgMHgxMzZmIH0sCisJeyAweDMzZWMsIDB4YzRmNSB9LAorCXsgMHgzM2VkLCAweDEzNGYgfSwKKwl7IDB4MzNlZSwgMHhjNGY1IH0sCisJeyAweDMzZWYsIDB4MTMxZiB9LAorCXsgMHgzM2YwLCAweDAyNmQgfSwKKwl7IDB4MzNmMSwgMHg0ZTAxIH0sCisJeyAweDMzZjIsIDB4MDI2ZCB9LAorCXsgMHgzM2YzLCAweGYwMDAgfSwKKwl7IDB4MzNmNiwgMHhjNGY1IH0sCisJeyAweDMzZjcsIDB4MTM2MSB9LAorCXsgMHgzM2Y4LCAweDA0MDIgfSwKKwl7IDB4MzNmOSwgMHg0NjAwIH0sCisJeyAweDMzZmEsIDB4MDI2ZCB9LAorCXsgMHgzM2ZiLCAweGZlMDAgfSwKIH07CiAKIHN0YXRpYyBpbnQgd201MTEwX3N5c2Nsa19ldihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKaW5kZXggZjkwOTBiMS4uNTQyOGExZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKQEAgLTE2NCw2ICsxNjQsNyBAQAogCWJvb2wgYmF1ZGNsa19sb2NrZWQ7CiAJYm9vbCBpcnFfc3RhdHM7CiAJYm9vbCBvZmZsaW5lX2NvbmZpZzsKKwlib29sIHVzZV9kdWFsX2ZpZm87CiAJdTggaTJzX21vZGU7CiAJc3BpbmxvY2tfdCBiYXVkY2xrX2xvY2s7CiAJc3RydWN0IGNsayAqYmF1ZGNsazsKQEAgLTcyMSw2ICs3MjIsMTIgQEAKIAkJCQlDQ1NSX1NTSV9TeENDUl9EQygyKSk7CiAJfQogCisJaWYgKHNzaV9wcml2YXRlLT51c2VfZHVhbF9maWZvKSB7CisJCXdyaXRlX3NzaV9tYXNrKCZzc2ktPnNyY3IsIDAsIENDU1JfU1NJX1NSQ1JfUkZFTjEpOworCQl3cml0ZV9zc2lfbWFzaygmc3NpLT5zdGNyLCAwLCBDQ1NSX1NTSV9TVENSX1RGRU4xKTsKKwkJd3JpdGVfc3NpX21hc2soJnNzaS0+c2NyLCAwLCBDQ1NSX1NTSV9TQ1JfVENIX0VOKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzUyLDYgKzc1OSwxNSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc2lfcHJpdmF0ZS0+YmF1ZGNsa19sb2NrLCBmbGFncyk7CiAJfQogCisJLyogV2hlbiB1c2luZyBkdWFsIGZpZm8gbW9kZSwgaXQgaXMgc2FmZXIgdG8gZW5zdXJlIGFuIGV2ZW4gcGVyaW9kCisJICogc2l6ZS4gSWYgYXBwZWFyaW5nIHRvIGFuIG9kZCBudW1iZXIgd2hpbGUgRE1BIGFsd2F5cyBzdGFydHMgaXRzCisJICogdGFzayBmcm9tIGZpZm8wLCBmaWZvMSB3b3VsZCBiZSBuZWdsZWN0ZWQgYXQgdGhlIGVuZCBvZiBlYWNoCisJICogcGVyaW9kLiBCdXQgU1NJIHdvdWxkIHN0aWxsIGFjY2VzcyBmaWZvMSB3aXRoIGFuIGludmFsaWQgZGF0YS4KKwkgKi8KKwlpZiAoc3NpX3ByaXZhdGUtPnVzZV9kdWFsX2ZpZm8pCisJCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsIDIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNjIsMTggKzEyNzgsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaHdfdHlwZSA9IChlbnVtIGZzbF9zc2lfdHlwZSkgb2ZfaWQtPmRhdGE7CiAKLQkvKiBXZSBvbmx5IHN1cHBvcnQgdGhlIFNTSSBpbiAiSTJTIFNsYXZlIiBtb2RlICovCiAJc3Byb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsbW9kZSIsIE5VTEwpOwogCWlmICghc3Byb3ApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZnNsLG1vZGUgcHJvcGVydHkgaXMgbmVjZXNzYXJ5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghc3RyY21wKHNwcm9wLCAiYWM5Ny1zbGF2ZSIpKSB7CisJaWYgKCFzdHJjbXAoc3Byb3AsICJhYzk3LXNsYXZlIikpCiAJCWFjOTcgPSB0cnVlOwotCX0gZWxzZSBpZiAoc3RyY21wKHNwcm9wLCAiaTJzLXNsYXZlIikpIHsKLQkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAibW9kZSAlcyBpcyB1bnN1cHBvcnRlZFxuIiwgc3Byb3ApOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAkvKiBUaGUgREFJIG5hbWUgaXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZnVsbCBuYW1lIG9mIHRoZSBub2RlLiAqLwogCXAgPSBzdHJyY2hyKG5wLT5mdWxsX25hbWUsICcvJykgKyAxOwpAQCAtMTM3MCw3ICsxMzgxLDcgQEAKIAogCWlmIChod190eXBlID09IEZTTF9TU0lfTVgyMSB8fCBod190eXBlID09IEZTTF9TU0lfTVg1MSB8fAogCQkJaHdfdHlwZSA9PSBGU0xfU1NJX01YMzUpIHsKLQkJdTMyIGRtYV9ldmVudHNbMl07CisJCXUzMiBkbWFfZXZlbnRzWzJdLCBkbWFzWzRdOwogCQlzc2lfcHJpdmF0ZS0+c3NpX29uX2lteCA9IHRydWU7CiAKIAkJc3NpX3ByaXZhdGUtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKQEAgLTEzOTEsNyArMTQwMiw3IEBACiAJCSAqLwogCQlzc2lfcHJpdmF0ZS0+YmF1ZGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYmF1ZCIpOwogCQlpZiAoSVNfRVJSKHNzaV9wcml2YXRlLT5iYXVkY2xrKSkKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGJhdWQgY2xvY2s6ICVsZFxuIiwKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYmF1ZCBjbG9jazogJWxkXG4iLAogCQkJCSBQVFJfRVJSKHNzaV9wcml2YXRlLT5iYXVkY2xrKSk7CiAJCWVsc2UKIAkJCWNsa19wcmVwYXJlX2VuYWJsZShzc2lfcHJpdmF0ZS0+YmF1ZGNsayk7CkBAIC0xNDI2LDYgKzE0MzcsMTYgQEAKIAkJCQlnb3RvIGVycm9yX2NsazsKIAkJCX0KIAkJfQorCQkvKiBTaG91bGQgdGhpcyBiZSBtZXJnZSB3aXRoIHRoZSBhYm92ZT8gKi8KKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwgImRtYXMiLCBkbWFzLCA0KQorCQkJCSYmIGRtYXNbMl0gPT0gSU1YX0RNQVRZUEVfU1NJX0RVQUwpIHsKKwkJCXNzaV9wcml2YXRlLT51c2VfZHVhbF9maWZvID0gdHJ1ZTsKKwkJCS8qIFdoZW4gdXNpbmcgZHVhbCBmaWZvIG1vZGUsIHdlIG5lZWQgdG8ga2VlcCB3YXRlcm1hcmsKKwkJCSAqIGFzIGV2ZW4gbnVtYmVycyBkdWUgdG8gZG1hIHNjcmlwdCBsaW1pdGF0aW9uLgorCQkJICovCisJCQlzc2lfcHJpdmF0ZS0+ZG1hX3BhcmFtc190eC5tYXhidXJzdCAmPSB+MHgxOworCQkJc3NpX3ByaXZhdGUtPmRtYV9wYXJhbXNfcngubWF4YnVyc3QgJj0gfjB4MTsKKwkJfQogCiAJCXNoYXJlZCA9IG9mX2RldmljZV9pc19jb21wYXRpYmxlKG9mX2dldF9wYXJlbnQobnApLAogCQkJICAgICJmc2wsc3BiYS1idXMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IDRhMDdmNzEuLjIyYWQ5YzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtMzAsNiArMzAsNyBAQAogCXNlbGVjdCBTTkRfT01BUF9TT0NfTUNCU1AKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzWAogCXNlbGVjdCBTTkRfU09DX1RQQTYxMzBBMgorCWRlcGVuZHMgb24gR1BJT0xJQgogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTm9raWEgUlgtNTEKIAkgIGhhcmR3YXJlLiBUaGlzIGlzIGFsc28ga25vd24gYXMgTm9raWEgTjkwMCBwcm9kdWN0LgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKaW5kZXggMjc5MzBmYy4uNDU0ZjQxYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCkBAIC0xOSw3ICsxOSw3IEBACiAKIGNvbmZpZyBTTkRfUzNDMjRYWF9JMlMKIAl0cmlzdGF0ZQotCXNlbGVjdCBTM0MyNDEwX0RNQQorCXNlbGVjdCBTM0MyNFhYX0RNQQogCiBjb25maWcgU05EX1MzQ19JMlNWMl9TT0MKIAl0cmlzdGF0ZQpAQCAtMjEwLDcgKzIxMCw3IEBACiAKIGNvbmZpZyBTTkRfU09DX0JFTExTCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIFdvbGZzb24gQmVsbHMiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9XTEZfQ1JBR0dfNjQxMAorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfV0xGX0NSQUdHXzY0MTAgJiYgTUZEX0FSSVpPTkEKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAJc2VsZWN0IFNORF9TT0NfV001MTAyCiAJc2VsZWN0IFNORF9TT0NfV001MTEwCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKaW5kZXggZmE5MTM3Ni4uZmJjZWQ1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInJlZ3MtaWlzLmgiCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby1zYW1zdW5nLmg+CiAjaW5jbHVkZSAiczNjMjR4eC1pMnMuaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYwppbmRleCA5MmY2NDM2My4uMGE5YjQ0YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKQEAgLTIyLDggKzIyLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2RtYS5oPgotCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYy5oPgogCiAjaW5jbHVkZSAiZG1hLmgiCkBAIC0xMjY4LDcgKzEyNjYsOCBAQAogCiAJcmV0dXJuIDA7CiBlcnI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlZ3NfYmFzZSwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAocmVzKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocmVnc19iYXNlLCByZXNvdXJjZV9zaXplKHJlcykpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCmluZGV4IDgwN2RiNDEuLjk4YTA0YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2dwaW8tc2Ftc3VuZy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSAicmVncy1paXMuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKaW5kZXggNzA0NDYwYS4uMDZlYmRjMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCisjaW5jbHVkZSA8bWFjaC9ncGlvLXNhbXN1bmcuaD4KICNpbmNsdWRlICJyZWdzLWlpcy5oIgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYwppbmRleCBmZWZjNTYxLi43OWU3ZWZiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCkBAIC03MjksNyArNzI5LDcgQEAKIAkJCSAgIHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgKmNtcF9kcnYsCiAJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2KQogewotCXN0cnVjdCBzbmRfc29jX2RhaV9vcHMgKm9wcyA9IGRydi0+b3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9vcHMgKm9wcyA9IGRhaV9kcnYtPm9wczsKIAogCW9wcy0+dHJpZ2dlciA9IHMzYzI0MTJfaTJzX3RyaWdnZXI7CiAJaWYgKCFvcHMtPmh3X3BhcmFtcykKQEAgLTc0Miw4ICs3NDIsOCBAQAogCWlmICghb3BzLT5kZWxheSkKIAkJb3BzLT5kZWxheSA9IHMzYzI0MTJfaTJzX2RlbGF5OwogCi0JZHJ2LT5zdXNwZW5kID0gczNjMjQxMl9pMnNfc3VzcGVuZDsKLQlkcnYtPnJlc3VtZSA9IHMzYzI0MTJfaTJzX3Jlc3VtZTsKKwlkYWlfZHJ2LT5zdXNwZW5kID0gczNjMjQxMl9pMnNfc3VzcGVuZDsKKwlkYWlfZHJ2LT5yZXN1bWUgPSBzM2MyNDEyX2kyc19yZXN1bWU7CiAKIAlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoZGV2LCBjbXBfZHJ2LCBkYWlfZHJ2LCAxKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCmluZGV4IGVhODg1Y2IuLmQwNzk0NDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXNhbXN1bmcuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CiAKICNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJyZWdzLWkycy12Mi5oIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKaW5kZXggOWM4ZWJkOC4uZjMxZTkxNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tc2Ftc3VuZy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KICNpbmNsdWRlICJyZWdzLWlpcy5oIgogCiAjaW5jbHVkZSAiZG1hLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMKaW5kZXggNThhZTMyMy4uYzNiMmFkYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtYXJ0cV93bTg5ODcuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby1zYW1zdW5nLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgImkycy5oIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKaW5kZXggYjA3MmJkMS4uZDM4YWU5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCkBAIC0xNTIsMTMgKzE1MiwxMSBAQAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNtZGtfZGFpKSwKIH07CiAKLSNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfd204OTk0X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHNtZGstd204OTk0IiwgLmRhdGEgPSAmc21ka19ib2FyZF9kYXRhIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2Ftc3VuZ193bTg5OTRfb2ZfbWF0Y2gpOwotI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW50IHNtZGtfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTE4OCw3ICsxODYsNyBAQAogCQlzbWRrX2RhaVswXS5wbGF0Zm9ybV9vZl9ub2RlID0gc21ka19kYWlbMF0uY3B1X29mX25vZGU7CiAJfQogCi0JaWQgPSBvZl9tYXRjaF9kZXZpY2Uoc2Ftc3VuZ193bTg5OTRfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihzYW1zdW5nX3dtODk5NF9vZl9tYXRjaCksICZwZGV2LT5kZXYpOwogCWlmIChpZCkKIAkJKmJvYXJkID0gKigoc3RydWN0IHNtZGtfd204OTk0X2RhdGEgKilpZC0+ZGF0YSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9LY29uZmlnIGIvc291bmQvdXNiL0tjb25maWcKaW5kZXggZGU5NDA4Yi4uZTA1YTg2YiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL0tjb25maWcKKysrIGIvc291bmQvdXNiL0tjb25maWcKQEAgLTE0LDYgKzE0LDcgQEAKIAlzZWxlY3QgU05EX0hXREVQCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgQklUUkVWRVJTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBVU0IgYXVkaW8gYW5kIFVTQiBNSURJCiAJICBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtY2FjaGUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWNhY2hlLmMKaW5kZXggY2ZlZGU4Ni4uYjIyZGJiMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtY2FjaGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1jYWNoZS5jCkBAIC02MywxMSArNjMsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgc2FtZV9rYWxsc3ltc19yZWxvYyhjb25zdCBjaGFyICpmcm9tX2RpciwgY2hhciAqdG9fZGlyKQoreworCWNoYXIgZnJvbVtQQVRIX01BWF07CisJY2hhciB0b1tQQVRIX01BWF07CisJY29uc3QgY2hhciAqbmFtZTsKKwl1NjQgYWRkcjEgPSAwLCBhZGRyMiA9IDA7CisJaW50IGk7CisKKwlzY25wcmludGYoZnJvbSwgc2l6ZW9mKGZyb20pLCAiJXMva2FsbHN5bXMiLCBmcm9tX2Rpcik7CisJc2NucHJpbnRmKHRvLCBzaXplb2YodG8pLCAiJXMva2FsbHN5bXMiLCB0b19kaXIpOworCisJZm9yIChpID0gMDsgKG5hbWUgPSByZWZfcmVsb2Nfc3ltX25hbWVzW2ldKSAhPSBOVUxMOyBpKyspIHsKKwkJYWRkcjEgPSBrYWxsc3ltc19fZ2V0X2Z1bmN0aW9uX3N0YXJ0KGZyb20sIG5hbWUpOworCQlpZiAoYWRkcjEpCisJCQlicmVhazsKKwl9CisKKwlpZiAobmFtZSkKKwkJYWRkcjIgPSBrYWxsc3ltc19fZ2V0X2Z1bmN0aW9uX3N0YXJ0KHRvLCBuYW1lKTsKKworCXJldHVybiBhZGRyMSA9PSBhZGRyMjsKK30KKwogc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fa2NvcmVfZXhpc3RpbmcoY29uc3QgY2hhciAqZnJvbV9kaXIsIGNoYXIgKnRvX2RpciwKIAkJCQkJICBzaXplX3QgdG9fZGlyX3N6KQogewogCWNoYXIgZnJvbVtQQVRIX01BWF07CiAJY2hhciB0b1tQQVRIX01BWF07CisJY2hhciB0b19zdWJkaXJbUEFUSF9NQVhdOwogCXN0cnVjdCBkaXJlbnQgKmRlbnQ7CiAJaW50IHJldCA9IC0xOwogCURJUiAqZDsKQEAgLTg2LDEwICsxMTAsMTEgQEAKIAkJCWNvbnRpbnVlOwogCQlzY25wcmludGYodG8sIHNpemVvZih0byksICIlcy8lcy9tb2R1bGVzIiwgdG9fZGlyLAogCQkJICBkZW50LT5kX25hbWUpOwotCQlpZiAoIWNvbXBhcmVfcHJvY19tb2R1bGVzKGZyb20sIHRvKSkgewotCQkJc2NucHJpbnRmKHRvLCBzaXplb2YodG8pLCAiJXMvJXMiLCB0b19kaXIsCi0JCQkJICBkZW50LT5kX25hbWUpOwotCQkJc3RybGNweSh0b19kaXIsIHRvLCB0b19kaXJfc3opOworCQlzY25wcmludGYodG9fc3ViZGlyLCBzaXplb2YodG9fc3ViZGlyKSwgIiVzLyVzIiwKKwkJCSAgdG9fZGlyLCBkZW50LT5kX25hbWUpOworCQlpZiAoIWNvbXBhcmVfcHJvY19tb2R1bGVzKGZyb20sIHRvKSAmJgorCQkgICAgc2FtZV9rYWxsc3ltc19yZWxvYyhmcm9tX2RpciwgdG9fc3ViZGlyKSkgeworCQkJc3RybGNweSh0b19kaXIsIHRvX3N1YmRpciwgdG9fZGlyX3N6KTsKIAkJCXJldCA9IDA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IDNjMzk0YmYuLmFmNDc1MzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTI4NywxMCArMjg3LDcgQEAKIAkgKiBoYXZlIG5vIF90ZXh0IHNvbWV0aW1lcy4KIAkgKi8KIAllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2tlcm5lbF9tbWFwKHRvb2wsIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCi0JCQkJCQkgbWFjaGluZSwgIl90ZXh0Iik7Ci0JaWYgKGVyciA8IDApCi0JCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAodG9vbCwgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKLQkJCQkJCQkgbWFjaGluZSwgIl9zdGV4dCIpOworCQkJCQkJIG1hY2hpbmUpOwogCWlmIChlcnIgPCAwKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlY29yZCBndWVzdCBrZXJuZWwgWyVkXSdzIHJlZmVyZW5jZSIKIAkJICAgICAgICIgcmVsb2NhdGlvbiBzeW1ib2wuXG4iLCBtYWNoaW5lLT5waWQpOwpAQCAtNDU3LDEwICs0NTQsNyBAQAogCX0KIAogCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAodG9vbCwgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKLQkJCQkJCSBtYWNoaW5lLCAiX3RleHQiKTsKLQlpZiAoZXJyIDwgMCkKLQkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcCh0b29sLCBwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAotCQkJCQkJCSBtYWNoaW5lLCAiX3N0ZXh0Iik7CisJCQkJCQkgbWFjaGluZSk7CiAJaWYgKGVyciA8IDApCiAJCXByX2VycigiQ291bGRuJ3QgcmVjb3JkIGtlcm5lbCByZWZlcmVuY2UgcmVsb2NhdGlvbiBzeW1ib2xcbiIKIAkJICAgICAgICJTeW1ib2wgcmVzb2x1dGlvbiBtYXkgYmUgc2tld2VkIGlmIHJlbG9jYXRpb24gd2FzIHVzZWQgKGUuZy4ga2V4ZWMpLlxuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9kZXNpZ24udHh0IGIvdG9vbHMvcGVyZi9kZXNpZ24udHh0CmluZGV4IDY3ZTVkMGMuLjYzYTBlNmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvZGVzaWduLnR4dAorKysgYi90b29scy9wZXJmL2Rlc2lnbi50eHQKQEAgLTQ1NCw3ICs0NTQsNiBAQAogd2lsbCBuZWVkIGF0IGxlYXN0IHRoaXM6CiAJLSBhc20vcGVyZl9ldmVudC5oIC0gYSBiYXNpYyBzdHViIHdpbGwgc3VmZmljZSBhdCBmaXJzdAogCS0gc3VwcG9ydCBmb3IgYXRvbWljNjQgdHlwZXMgKGFuZCBhc3NvY2lhdGVkIGhlbHBlciBmdW5jdGlvbnMpCi0JLSBzZXRfcGVyZl9ldmVudF9wZW5kaW5nKCkgaW1wbGVtZW50ZWQKIAogSWYgeW91ciBhcmNoaXRlY3R1cmUgZG9lcyBoYXZlIGhhcmR3YXJlIGNhcGFiaWxpdGllcywgeW91IGNhbiBvdmVycmlkZSB0aGUKIHdlYWsgc3R1YiBod19wZXJmX2V2ZW50X2luaXQoKSB0byByZWdpc3RlciBoYXJkd2FyZSBjb3VudGVycy4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi5oIGIvdG9vbHMvcGVyZi9wZXJmLmgKaW5kZXggN2RhYTgwNi4uZTg0ZmEyNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLmgKKysrIGIvdG9vbHMvcGVyZi9wZXJmLmgKQEAgLTEwMCw4ICsxMDAsOCBAQAogCiAjaWZkZWYgX19hYXJjaDY0X18KICNkZWZpbmUgbWIoKQkJYXNtIHZvbGF0aWxlKCJkbWIgaXNoIiA6OjogIm1lbW9yeSIpCi0jZGVmaW5lIHdtYigpCQlhc20gdm9sYXRpbGUoImRtYiBpc2hsZCIgOjo6ICJtZW1vcnkiKQotI2RlZmluZSBybWIoKQkJYXNtIHZvbGF0aWxlKCJkbWIgaXNoc3QiIDo6OiAibWVtb3J5IikKKyNkZWZpbmUgd21iKCkJCWFzbSB2b2xhdGlsZSgiZG1iIGlzaHN0IiA6OjogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpCQlhc20gdm9sYXRpbGUoImRtYiBpc2hsZCIgOjo6ICJtZW1vcnkiKQogI2RlZmluZSBjcHVfcmVsYXgoKQlhc20gdm9sYXRpbGUoInlpZWxkIiA6OjogIm1lbW9yeSIpCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMgYi90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYwppbmRleCAyYmQxM2VkLi4zZDkwODgwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYworKysgYi90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYwpAQCAtMjYsNyArMjYsNiBAQAogCXN0cnVjdCBtYXAgKmthbGxzeW1zX21hcCwgKnZtbGludXhfbWFwOwogCXN0cnVjdCBtYWNoaW5lIGthbGxzeW1zLCB2bWxpbnV4OwogCWVudW0gbWFwX3R5cGUgdHlwZSA9IE1BUF9fRlVOQ1RJT047Ci0Jc3RydWN0IHJlZl9yZWxvY19zeW0gcmVmX3JlbG9jX3N5bSA9IHsgLm5hbWUgPSAiX3N0ZXh0IiwgfTsKIAl1NjQgbWVtX3N0YXJ0LCBtZW1fZW5kOwogCiAJLyoKQEAgLTcwLDE0ICs2OSw2IEBACiAJICovCiAJa2FsbHN5bXNfbWFwID0gbWFjaGluZV9fa2VybmVsX21hcCgma2FsbHN5bXMsIHR5cGUpOwogCi0Jc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKGthbGxzeW1zX21hcCwgcmVmX3JlbG9jX3N5bS5uYW1lLCBOVUxMKTsKLQlpZiAoc3ltID09IE5VTEwpIHsKLQkJcHJfZGVidWcoImRzb19fZmluZF9zeW1ib2xfYnlfbmFtZSAiKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmVmX3JlbG9jX3N5bS5hZGRyID0gVU0oc3ltLT5zdGFydCk7Ci0KIAkvKgogCSAqIFN0ZXAgNToKIAkgKgpAQCAtODksNyArODAsNiBAQAogCX0KIAogCXZtbGludXhfbWFwID0gbWFjaGluZV9fa2VybmVsX21hcCgmdm1saW51eCwgdHlwZSk7Ci0JbWFwX19rbWFwKHZtbGludXhfbWFwKS0+cmVmX3JlbG9jX3N5bSA9ICZyZWZfcmVsb2Nfc3ltOwogCiAJLyoKIAkgKiBTdGVwIDY6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IDFmYzFjMmYuLmIwZjNjYTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC00NzAsMjMgKzQ3MCwzMiBAQAogCXJldHVybiAxOwogfQogCit1NjQga2FsbHN5bXNfX2dldF9mdW5jdGlvbl9zdGFydChjb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSwKKwkJCQkgY29uc3QgY2hhciAqc3ltYm9sX25hbWUpCit7CisJc3RydWN0IHByb2Nlc3Nfc3ltYm9sX2FyZ3MgYXJncyA9IHsgLm5hbWUgPSBzeW1ib2xfbmFtZSwgfTsKKworCWlmIChrYWxsc3ltc19fcGFyc2Uoa2FsbHN5bXNfZmlsZW5hbWUsICZhcmdzLCBmaW5kX3N5bWJvbF9jYikgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXJncy5zdGFydDsKK30KKwogaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJICAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSkKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJc2l6ZV90IHNpemU7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWUsICptbWFwX25hbWU7Ci0JY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICptbWFwX25hbWU7CiAJY2hhciBuYW1lX2J1ZmZbUEFUSF9NQVhdOwogCXN0cnVjdCBtYXAgKm1hcDsKKwlzdHJ1Y3Qga21hcCAqa21hcDsKIAlpbnQgZXJyOwogCS8qCiAJICogV2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gL3N5cy9rZXJuZWwvc2VjdGlvbnMvLnRleHQsIGJ1dCB0aWxsIHRoYXQgaXMKIAkgKiBhdmFpbGFibGUgdXNlIHRoaXMsIGFuZCBhZnRlciBpdCBpcyB1c2UgdGhpcyBhcyBhIGZhbGxiYWNrIGZvciBvbGRlcgogCSAqIGtlcm5lbHMuCiAJICovCi0Jc3RydWN0IHByb2Nlc3Nfc3ltYm9sX2FyZ3MgYXJncyA9IHsgLm5hbWUgPSBzeW1ib2xfbmFtZSwgfTsKIAl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCA9IHphbGxvYygoc2l6ZW9mKGV2ZW50LT5tbWFwKSArCiAJCQkJCSAgbWFjaGluZS0+aWRfaGRyX3NpemUpKTsKIAlpZiAoZXZlbnQgPT0gTlVMTCkgewpAQCAtNTAyLDMwICs1MTEsMTkgQEAKIAkJICogc2VlIGtlcm5lbC9wZXJmX2V2ZW50LmMgX19wZXJmX2V2ZW50X21tYXAKIAkJICovCiAJCWV2ZW50LT5oZWFkZXIubWlzYyA9IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMOwotCQlmaWxlbmFtZSA9ICIvcHJvYy9rYWxsc3ltcyI7CiAJfSBlbHNlIHsKIAkJZXZlbnQtPmhlYWRlci5taXNjID0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUw7Ci0JCWlmIChtYWNoaW5lX19pc19kZWZhdWx0X2d1ZXN0KG1hY2hpbmUpKQotCQkJZmlsZW5hbWUgPSAoY2hhciAqKSBzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X2thbGxzeW1zOwotCQllbHNlIHsKLQkJCXNwcmludGYocGF0aCwgIiVzL3Byb2Mva2FsbHN5bXMiLCBtYWNoaW5lLT5yb290X2Rpcik7Ci0JCQlmaWxlbmFtZSA9IHBhdGg7Ci0JCX0KLQl9Ci0KLQlpZiAoa2FsbHN5bXNfX3BhcnNlKGZpbGVuYW1lLCAmYXJncywgZmluZF9zeW1ib2xfY2IpIDw9IDApIHsKLQkJZnJlZShldmVudCk7Ci0JCXJldHVybiAtRU5PRU5UOwogCX0KIAogCW1hcCA9IG1hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXTsKKwlrbWFwID0gbWFwX19rbWFwKG1hcCk7CiAJc2l6ZSA9IHNucHJpbnRmKGV2ZW50LT5tbWFwLmZpbGVuYW1lLCBzaXplb2YoZXZlbnQtPm1tYXAuZmlsZW5hbWUpLAotCQkJIiVzJXMiLCBtbWFwX25hbWUsIHN5bWJvbF9uYW1lKSArIDE7CisJCQkiJXMlcyIsIG1tYXBfbmFtZSwga21hcC0+cmVmX3JlbG9jX3N5bS0+bmFtZSkgKyAxOwogCXNpemUgPSBQRVJGX0FMSUdOKHNpemUsIHNpemVvZih1NjQpKTsKIAlldmVudC0+bW1hcC5oZWFkZXIudHlwZSA9IFBFUkZfUkVDT1JEX01NQVA7CiAJZXZlbnQtPm1tYXAuaGVhZGVyLnNpemUgPSAoc2l6ZW9mKGV2ZW50LT5tbWFwKSAtCiAJCQkoc2l6ZW9mKGV2ZW50LT5tbWFwLmZpbGVuYW1lKSAtIHNpemUpICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOwotCWV2ZW50LT5tbWFwLnBnb2ZmID0gYXJncy5zdGFydDsKKwlldmVudC0+bW1hcC5wZ29mZiA9IGttYXAtPnJlZl9yZWxvY19zeW0tPmFkZHI7CiAJZXZlbnQtPm1tYXAuc3RhcnQgPSBtYXAtPnN0YXJ0OwogCWV2ZW50LT5tbWFwLmxlbiAgID0gbWFwLT5lbmQgLSBldmVudC0+bW1hcC5zdGFydDsKIAlldmVudC0+bW1hcC5waWQgICA9IG1hY2hpbmUtPnBpZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKaW5kZXggZmFmNmUyMS4uODUxZmEwNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTIxNCw4ICsyMTQsNyBAQAogCQkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBib29sIG1tYXBfZGF0YSk7CiBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCSAgICAgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lKTsKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogCiBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tb2R1bGVzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCkBAIC0yNzksNCArMjc4LDcgQEAKIHNpemVfdCBwZXJmX2V2ZW50X19mcHJpbnRmX3Rhc2sodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIEZJTEUgKmZwKTsKIHNpemVfdCBwZXJmX2V2ZW50X19mcHJpbnRmKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBGSUxFICpmcCk7CiAKK3U2NCBrYWxsc3ltc19fZ2V0X2Z1bmN0aW9uX3N0YXJ0KGNvbnN0IGNoYXIgKmthbGxzeW1zX2ZpbGVuYW1lLAorCQkJCSBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSk7CisKICNlbmRpZiAvKiBfX1BFUkZfUkVDT1JEX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2FzbS9oYXNoLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9hc20vaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmIxNzBiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvYXNtL2hhc2guaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19IQVNIX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19IQVNIX0gKKworLyogU3R1YiAqLworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19IQVNIX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCmluZGV4IGRlZDc0NTkuLmM4NzI5OTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwpAQCAtNDk2LDE5ICs0OTYsMjIgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQgbWFjaGluZV9fZ2V0X2thbGxzeW1zX2ZpbGVuYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjaGFyICpidWYsCisJCQkJCSAgIHNpemVfdCBidWZzeikKK3sKKwlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKKwkJc2NucHJpbnRmKGJ1ZiwgYnVmc3osICIlcyIsIHN5bWJvbF9jb25mLmRlZmF1bHRfZ3Vlc3Rfa2FsbHN5bXMpOworCWVsc2UKKwkJc2NucHJpbnRmKGJ1ZiwgYnVmc3osICIlcy9wcm9jL2thbGxzeW1zIiwgbWFjaGluZS0+cm9vdF9kaXIpOworfQorCiAvKiBGaWd1cmUgb3V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIGtlcm5lbCBtYXAgZnJvbSAvcHJvYy9rYWxsc3ltcyAqLwogc3RhdGljIHU2NCBtYWNoaW5lX19nZXRfa2VybmVsX3N0YXJ0X2FkZHIoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKIAlzdHJ1Y3QgcHJvY2Vzc19hcmdzIGFyZ3M7CiAKLQlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKLQkJZmlsZW5hbWUgPSAoY2hhciAqKXN5bWJvbF9jb25mLmRlZmF1bHRfZ3Vlc3Rfa2FsbHN5bXM7Ci0JZWxzZSB7Ci0JCXNwcmludGYocGF0aCwgIiVzL3Byb2Mva2FsbHN5bXMiLCBtYWNoaW5lLT5yb290X2Rpcik7Ci0JCWZpbGVuYW1lID0gcGF0aDsKLQl9CisJbWFjaGluZV9fZ2V0X2thbGxzeW1zX2ZpbGVuYW1lKG1hY2hpbmUsIGZpbGVuYW1lLCBQQVRIX01BWCk7CiAKIAlpZiAoc3ltYm9sX19yZXN0cmljdGVkX2ZpbGVuYW1lKGZpbGVuYW1lLCAiL3Byb2Mva2FsbHN5bXMiKSkKIAkJcmV0dXJuIDA7CkBAIC04MjksOSArODMyLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2NvbnN0IGNoYXIgKnJlZl9yZWxvY19zeW1fbmFtZXNbXSA9IHsiX3RleHQiLCAiX3N0ZXh0IiwgTlVMTH07CisKIGludCBtYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJc3RydWN0IGRzbyAqa2VybmVsID0gbWFjaGluZV9fZ2V0X2tlcm5lbChtYWNoaW5lKTsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpuYW1lOworCXU2NCBhZGRyID0gMDsKKwlpbnQgaTsKKworCW1hY2hpbmVfX2dldF9rYWxsc3ltc19maWxlbmFtZShtYWNoaW5lLCBmaWxlbmFtZSwgUEFUSF9NQVgpOworCisJZm9yIChpID0gMDsgKG5hbWUgPSByZWZfcmVsb2Nfc3ltX25hbWVzW2ldKSAhPSBOVUxMOyBpKyspIHsKKwkJYWRkciA9IGthbGxzeW1zX19nZXRfZnVuY3Rpb25fc3RhcnQoZmlsZW5hbWUsIG5hbWUpOworCQlpZiAoYWRkcikKKwkJCWJyZWFrOworCX0KKwlpZiAoIWFkZHIpCisJCXJldHVybiAtMTsKIAogCWlmIChrZXJuZWwgPT0gTlVMTCB8fAogCSAgICBfX21hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcyhtYWNoaW5lLCBrZXJuZWwpIDwgMCkKQEAgLTg1MCw2ICs4NjksMTMgQEAKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgbWFwcyBjcmVhdGVkLCBqdXN0IHNldCB0aGUgLT5lbmQgb2YgdGhlbToKIAkgKi8KIAltYXBfZ3JvdXBzX19maXh1cF9lbmQoJm1hY2hpbmUtPmttYXBzKTsKKworCWlmIChtYXBzX19zZXRfa2FsbHN5bXNfcmVmX3JlbG9jX3N5bShtYWNoaW5lLT52bWxpbnV4X21hcHMsIG5hbWUsCisJCQkJCSAgICAgYWRkcikpIHsKKwkJbWFjaGluZV9fZGVzdHJveV9rZXJuZWxfbWFwcyhtYWNoaW5lKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAppbmRleCA0NzcxMzMwLi5mNzdlOTFlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUJSE9TVF9LRVJORUxfSUQJCQkoLTEpCiAjZGVmaW5lCURFRkFVTFRfR1VFU1RfS0VSTkVMX0lECQkoMCkKIAorZXh0ZXJuIGNvbnN0IGNoYXIgKnJlZl9yZWxvY19zeW1fbmFtZXNbXTsKKwogc3RydWN0IG1hY2hpbmUgewogCXN0cnVjdCByYl9ub2RlCSAgcmJfbm9kZTsKIAlwaWRfdAkJICBwaWQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmMgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKaW5kZXggM2I5NzUxMy4uMzljZDJkMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwpAQCAtMzksNiArMzksNyBAQAogCW1hcC0+c3RhcnQgICAgPSBzdGFydDsKIAltYXAtPmVuZCAgICAgID0gZW5kOwogCW1hcC0+cGdvZmYgICAgPSBwZ29mZjsKKwltYXAtPnJlbG9jICAgID0gMDsKIAltYXAtPmRzbyAgICAgID0gZHNvOwogCW1hcC0+bWFwX2lwICAgPSBtYXBfX21hcF9pcDsKIAltYXAtPnVubWFwX2lwID0gbWFwX191bm1hcF9pcDsKQEAgLTI4OCw3ICsyODksNyBAQAogCWlmIChtYXAtPmRzby0+cmVsKQogCQlyZXR1cm4gcmlwIC0gbWFwLT5wZ29mZjsKIAotCXJldHVybiBtYXAtPnVubWFwX2lwKG1hcCwgcmlwKTsKKwlyZXR1cm4gbWFwLT51bm1hcF9pcChtYXAsIHJpcCkgLSBtYXAtPnJlbG9jOwogfQogCiAvKioKQEAgLTMxMSw3ICszMTIsNyBAQAogCWlmIChtYXAtPmRzby0+cmVsKQogCQlyZXR1cm4gbWFwLT51bm1hcF9pcChtYXAsIGlwICsgbWFwLT5wZ29mZik7CiAKLQlyZXR1cm4gaXA7CisJcmV0dXJuIGlwICsgbWFwLT5yZWxvYzsKIH0KIAogdm9pZCBtYXBfZ3JvdXBzX19pbml0KHN0cnVjdCBtYXBfZ3JvdXBzICptZykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaCBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAppbmRleCAxODA2OGM2Li4yNTdlNTEzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFwLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCkBAIC0zNiw2ICszNiw3IEBACiAJYm9vbAkJCWVyYW5nZV93YXJuZWQ7CiAJdTMyCQkJcHJpdjsKIAl1NjQJCQlwZ29mZjsKKwl1NjQJCQlyZWxvYzsKIAl1MzIJCQltYWosIG1pbjsgLyogb25seSB2YWxpZCBmb3IgTU1BUDIgcmVjb3JkICovCiAJdTY0CQkJaW5vOyAgICAgIC8qIG9ubHkgdmFsaWQgZm9yIE1NQVAyIHJlY29yZCAqLwogCXU2NAkJCWlub19nZW5lcmF0aW9uOy8qIG9ubHkgdmFsaWQgZm9yIE1NQVAyIHJlY29yZCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKaW5kZXggNzU5NDU2Ny4uM2U5ZjMzNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCkBAIC03NTEsNiArNzUxLDggQEAKIAkJCWlmIChzdHJjbXAoZWxmX25hbWUsIGttYXAtPnJlZl9yZWxvY19zeW0tPm5hbWUpKQogCQkJCWNvbnRpbnVlOwogCQkJa21hcC0+cmVmX3JlbG9jX3N5bS0+dW5yZWxvY2F0ZWRfYWRkciA9IHN5bS5zdF92YWx1ZTsKKwkJCW1hcC0+cmVsb2MgPSBrbWFwLT5yZWZfcmVsb2Nfc3ltLT5hZGRyIC0KKwkJCQkgICAgIGttYXAtPnJlZl9yZWxvY19zeW0tPnVucmVsb2NhdGVkX2FkZHI7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTkyMiw2ICs5MjQsNyBAQAogCQkJCSAgKHU2NClzaGRyLnNoX29mZnNldCk7CiAJCQlzeW0uc3RfdmFsdWUgLT0gc2hkci5zaF9hZGRyIC0gc2hkci5zaF9vZmZzZXQ7CiAJCX0KK25ld19zeW1ib2w6CiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGZyb20gQysrIHNvdXJjZXMKIAkJICogRFdBUkYgRFdfY29tcGlsZV91bml0IGhhcyB0aGlzLCBidXQgd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWNjZXNzCkBAIC05MzMsNyArOTM2LDYgQEAKIAkJCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkKIAkJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKIAkJfQotbmV3X3N5bWJvbDoKIAkJZiA9IHN5bWJvbF9fbmV3KHN5bS5zdF92YWx1ZSwgc3ltLnN0X3NpemUsCiAJCQkJR0VMRl9TVF9CSU5EKHN5bS5zdF9pbmZvKSwgZWxmX25hbWUpOwogCQlmcmVlKGRlbWFuZ2xlZCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKaW5kZXggMzljZTlhZC4uYTlkNzU4YSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAgKiBrZXJuZWwgcmFuZ2UgaXMgYnJva2VuIGluIHNldmVyYWwgbWFwcywgbmFtZWQgW2tlcm5lbF0uTiwgYXMgd2UgZG9uJ3QgaGF2ZQogICogdGhlIG9yaWdpbmFsIEVMRiBzZWN0aW9uIG5hbWVzIHZtbGludXggaGF2ZS4KICAqLwotc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAorc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCB1NjQgZGVsdGEsCiAJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXAobWFwKS0+a21hcHM7CkBAIC02OTIsNiArNjkyLDEyIEBACiAJCQljaGFyIGRzb19uYW1lW1BBVEhfTUFYXTsKIAkJCXN0cnVjdCBkc28gKm5kc287CiAKKwkJCWlmIChkZWx0YSkgeworCQkJCS8qIEtlcm5lbCB3YXMgcmVsb2NhdGVkIGF0IGJvb3QgdGltZSAqLworCQkJCXBvcy0+c3RhcnQgLT0gZGVsdGE7CisJCQkJcG9zLT5lbmQgLT0gZGVsdGE7CisJCQl9CisKIAkJCWlmIChjb3VudCA9PSAwKSB7CiAJCQkJY3Vycl9tYXAgPSBtYXA7CiAJCQkJZ290byBmaWx0ZXJfc3ltYm9sOwpAQCAtNzIxLDYgKzcyNywxMCBAQAogCQkJY3Vycl9tYXAtPm1hcF9pcCA9IGN1cnJfbWFwLT51bm1hcF9pcCA9IGlkZW50aXR5X19tYXBfaXA7CiAJCQltYXBfZ3JvdXBzX19pbnNlcnQoa21hcHMsIGN1cnJfbWFwKTsKIAkJCSsra2VybmVsX3JhbmdlOworCQl9IGVsc2UgaWYgKGRlbHRhKSB7CisJCQkvKiBLZXJuZWwgd2FzIHJlbG9jYXRlZCBhdCBib290IHRpbWUgKi8KKwkJCXBvcy0+c3RhcnQgLT0gZGVsdGE7CisJCQlwb3MtPmVuZCAtPSBkZWx0YTsKIAkJfQogZmlsdGVyX3N5bWJvbDoKIAkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoY3Vycl9tYXAsIHBvcykpIHsKQEAgLTk3Niw2ICs5ODYsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2YWxpZGF0ZV9rY29yZV9hZGRyZXNzZXMoY29uc3QgY2hhciAqa2FsbHN5bXNfZmlsZW5hbWUsCisJCQkJICAgIHN0cnVjdCBtYXAgKm1hcCkKK3sKKwlzdHJ1Y3Qga21hcCAqa21hcCA9IG1hcF9fa21hcChtYXApOworCisJaWYgKGttYXAtPnJlZl9yZWxvY19zeW0gJiYga21hcC0+cmVmX3JlbG9jX3N5bS0+bmFtZSkgeworCQl1NjQgc3RhcnQ7CisKKwkJc3RhcnQgPSBrYWxsc3ltc19fZ2V0X2Z1bmN0aW9uX3N0YXJ0KGthbGxzeW1zX2ZpbGVuYW1lLAorCQkJCQkJICAgICBrbWFwLT5yZWZfcmVsb2Nfc3ltLT5uYW1lKTsKKwkJaWYgKHN0YXJ0ICE9IGttYXAtPnJlZl9yZWxvY19zeW0tPmFkZHIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gdmFsaWRhdGVfa2NvcmVfbW9kdWxlcyhrYWxsc3ltc19maWxlbmFtZSwgbWFwKTsKK30KKwogc3RydWN0IGtjb3JlX21hcGZuX2RhdGEgewogCXN0cnVjdCBkc28gKmRzbzsKIAllbnVtIG1hcF90eXBlIHR5cGU7CkBAIC0xMDE5LDggKzEwNDYsOCBAQAogCQkJCQkgICAgIGthbGxzeW1zX2ZpbGVuYW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBBbGwgbW9kdWxlcyBtdXN0IGJlIHByZXNlbnQgYXQgdGhlaXIgb3JpZ2luYWwgYWRkcmVzc2VzICovCi0JaWYgKHZhbGlkYXRlX2tjb3JlX21vZHVsZXMoa2FsbHN5bXNfZmlsZW5hbWUsIG1hcCkpCisJLyogTW9kdWxlcyBhbmQga2VybmVsIG11c3QgYmUgcHJlc2VudCBhdCB0aGVpciBvcmlnaW5hbCBhZGRyZXNzZXMgKi8KKwlpZiAodmFsaWRhdGVfa2NvcmVfYWRkcmVzc2VzKGthbGxzeW1zX2ZpbGVuYW1lLCBtYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1kLmRzbyA9IGRzbzsKQEAgLTExMTMsMTUgKzExNDAsNDEgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyoKKyAqIElmIHRoZSBrZXJuZWwgaXMgcmVsb2NhdGVkIGF0IGJvb3QgdGltZSwga2FsbHN5bXMgd29uJ3QgbWF0Y2guICBDb21wdXRlIHRoZQorICogZGVsdGEgYmFzZWQgb24gdGhlIHJlbG9jYXRpb24gcmVmZXJlbmNlIHN5bWJvbC4KKyAqLworc3RhdGljIGludCBrYWxsc3ltc19fZGVsdGEoc3RydWN0IG1hcCAqbWFwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgdTY0ICpkZWx0YSkKK3sKKwlzdHJ1Y3Qga21hcCAqa21hcCA9IG1hcF9fa21hcChtYXApOworCXU2NCBhZGRyOworCisJaWYgKCFrbWFwLT5yZWZfcmVsb2Nfc3ltIHx8ICFrbWFwLT5yZWZfcmVsb2Nfc3ltLT5uYW1lKQorCQlyZXR1cm4gMDsKKworCWFkZHIgPSBrYWxsc3ltc19fZ2V0X2Z1bmN0aW9uX3N0YXJ0KGZpbGVuYW1lLAorCQkJCQkgICAga21hcC0+cmVmX3JlbG9jX3N5bS0+bmFtZSk7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLTE7CisKKwkqZGVsdGEgPSBhZGRyIC0ga21hcC0+cmVmX3JlbG9jX3N5bS0+YWRkcjsKKwlyZXR1cm4gMDsKK30KKwogaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkgICAgICAgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogeworCXU2NCBkZWx0YSA9IDA7CisKIAlpZiAoc3ltYm9sX19yZXN0cmljdGVkX2ZpbGVuYW1lKGZpbGVuYW1lLCAiL3Byb2Mva2FsbHN5bXMiKSkKIAkJcmV0dXJuIC0xOwogCiAJaWYgKGRzb19fbG9hZF9hbGxfa2FsbHN5bXMoZHNvLCBmaWxlbmFtZSwgbWFwKSA8IDApCiAJCXJldHVybiAtMTsKIAorCWlmIChrYWxsc3ltc19fZGVsdGEobWFwLCBmaWxlbmFtZSwgJmRlbHRhKSkKKwkJcmV0dXJuIC0xOworCiAJc3ltYm9sc19fZml4dXBfZHVwbGljYXRlKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CiAJc3ltYm9sc19fZml4dXBfZW5kKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CiAKQEAgLTExMzMsNyArMTE4Niw3IEBACiAJaWYgKCFkc29fX2xvYWRfa2NvcmUoZHNvLCBtYXAsIGZpbGVuYW1lKSkKIAkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKGRzbywgbWFwLCBmaWx0ZXIpOwogCWVsc2UKLQkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXMoZHNvLCBtYXAsIGZpbHRlcik7CisJCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zKGRzbywgbWFwLCBkZWx0YSwgZmlsdGVyKTsKIH0KIAogc3RhdGljIGludCBkc29fX2xvYWRfcGVyZl9tYXAoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCkBAIC0xNDI0LDcgKzE0NzcsNyBAQAogCQkJY29udGludWU7CiAJCXNjbnByaW50ZihrYWxsc3ltc19maWxlbmFtZSwgc2l6ZW9mKGthbGxzeW1zX2ZpbGVuYW1lKSwKIAkJCSAgIiVzLyVzL2thbGxzeW1zIiwgZGlyLCBkZW50LT5kX25hbWUpOwotCQlpZiAoIXZhbGlkYXRlX2tjb3JlX21vZHVsZXMoa2FsbHN5bXNfZmlsZW5hbWUsIG1hcCkpIHsKKwkJaWYgKCF2YWxpZGF0ZV9rY29yZV9hZGRyZXNzZXMoa2FsbHN5bXNfZmlsZW5hbWUsIG1hcCkpIHsKIAkJCXN0cmxjcHkoZGlyLCBrYWxsc3ltc19maWxlbmFtZSwgZGlyX3N6KTsKIAkJCXJldCA9IDA7CiAJCQlicmVhazsKQEAgLTE0NzksNyArMTUzMiw3IEBACiAJCWlmIChmZCAhPSAtMSkgewogCQkJY2xvc2UoZmQpOwogCQkJLyogSWYgbW9kdWxlIG1hcHMgbWF0Y2ggZ28gd2l0aCAvcHJvYy9rYWxsc3ltcyAqLwotCQkJaWYgKCF2YWxpZGF0ZV9rY29yZV9tb2R1bGVzKCIvcHJvYy9rYWxsc3ltcyIsIG1hcCkpCisJCQlpZiAoIXZhbGlkYXRlX2tjb3JlX2FkZHJlc3NlcygiL3Byb2Mva2FsbHN5bXMiLCBtYXApKQogCQkJCWdvdG8gcHJvY19rYWxsc3ltczsKIAkJfQogCmRpZmYgLS1naXQgYS90b29scy9wb3dlci94ODYvdHVyYm9zdGF0Ly5naXRpZ25vcmUgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyMTM3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0dXJib3N0YXQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvTWFrZWZpbGUgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L01ha2VmaWxlCmluZGV4IGYwOTY0MWQuLmQxYjNhMzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvTWFrZWZpbGUKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIAogdHVyYm9zdGF0IDogdHVyYm9zdGF0LmMKIENGTEFHUyArPQktV2FsbAotQ0ZMQUdTICs9CS1JLi4vLi4vLi4vLi4vYXJjaC94ODYvaW5jbHVkZS91YXBpLworQ0ZMQUdTICs9CS1ETVNSSEVBREVSPSciLi4vLi4vLi4vLi4vYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tc3ItaW5kZXguaCInCiAKICU6ICUuYwogCUBta2RpciAtcCAkKEJVSUxEX09VVFBVVCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCmluZGV4IDlkNzdmMTMuLjc3ZWIxMzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYwpAQCAtMjAsOCArMjAsMTAgQEAKICAqLwogCiAjZGVmaW5lIF9HTlVfU09VUkNFCi0jaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgTVNSSEVBREVSCisjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMzUsMTMgKzM3LDE2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGNwdWlkLmg+CiAKIGNoYXIgKnByb2Nfc3RhdCA9ICIvcHJvYy9zdGF0IjsKIHVuc2lnbmVkIGludCBpbnRlcnZhbF9zZWMgPSA1OwkvKiBzZXQgd2l0aCAtaSBpbnRlcnZhbF9zZWMgKi8KIHVuc2lnbmVkIGludCB2ZXJib3NlOwkJLyogc2V0IHdpdGggLXYgKi8KIHVuc2lnbmVkIGludCByYXBsX3ZlcmJvc2U7CS8qIHNldCB3aXRoIC1SICovCit1bnNpZ25lZCBpbnQgcmFwbF9qb3VsZXM7CS8qIHNldCB3aXRoIC1KICovCiB1bnNpZ25lZCBpbnQgdGhlcm1hbF92ZXJib3NlOwkvKiBzZXQgd2l0aCAtVCAqLwotdW5zaWduZWQgaW50IHN1bW1hcnlfb25seTsJLyogc2V0IHdpdGggLXMgKi8KK3Vuc2lnbmVkIGludCBzdW1tYXJ5X29ubHk7CS8qIHNldCB3aXRoIC1TICovCit1bnNpZ25lZCBpbnQgZHVtcF9vbmx5OwkJLyogc2V0IHdpdGggLXMgKi8KIHVuc2lnbmVkIGludCBza2lwX2MwOwogdW5zaWduZWQgaW50IHNraXBfYzE7CiB1bnNpZ25lZCBpbnQgZG9fbmhtX2NzdGF0ZXM7CkBAIC03NywxNCArODIsMzIgQEAKIGRvdWJsZSByYXBsX3Bvd2VyX3VuaXRzLCByYXBsX2VuZXJneV91bml0cywgcmFwbF90aW1lX3VuaXRzOwogZG91YmxlIHJhcGxfam91bGVfY291bnRlcl9yYW5nZTsKIAotI2RlZmluZSBSQVBMX1BLRwkoMSA8PCAwKQotI2RlZmluZSBSQVBMX0NPUkVTCSgxIDw8IDEpCi0jZGVmaW5lIFJBUExfR0ZYCSgxIDw8IDIpCi0jZGVmaW5lIFJBUExfRFJBTQkoMSA8PCAzKQotI2RlZmluZSBSQVBMX1BLR19QRVJGX1NUQVRVUwkoMSA8PCA0KQotI2RlZmluZSBSQVBMX0RSQU1fUEVSRl9TVEFUVVMJKDEgPDwgNSkKLSNkZWZpbmUgUkFQTF9QS0dfUE9XRVJfSU5GTwkoMSA8PCA2KQotI2RlZmluZSBSQVBMX0NPUkVfUE9MSUNZCSgxIDw8IDcpCisjZGVmaW5lIFJBUExfUEtHCQkoMSA8PCAwKQorCQkJCQkvKiAweDYxMCBNU1JfUEtHX1BPV0VSX0xJTUlUICovCisJCQkJCS8qIDB4NjExIE1TUl9QS0dfRU5FUkdZX1NUQVRVUyAqLworI2RlZmluZSBSQVBMX1BLR19QRVJGX1NUQVRVUwkoMSA8PCAxKQorCQkJCQkvKiAweDYxMyBNU1JfUEtHX1BFUkZfU1RBVFVTICovCisjZGVmaW5lIFJBUExfUEtHX1BPV0VSX0lORk8JKDEgPDwgMikKKwkJCQkJLyogMHg2MTQgTVNSX1BLR19QT1dFUl9JTkZPICovCisKKyNkZWZpbmUgUkFQTF9EUkFNCQkoMSA8PCAzKQorCQkJCQkvKiAweDYxOCBNU1JfRFJBTV9QT1dFUl9MSU1JVCAqLworCQkJCQkvKiAweDYxOSBNU1JfRFJBTV9FTkVSR1lfU1RBVFVTICovCisJCQkJCS8qIDB4NjFjIE1TUl9EUkFNX1BPV0VSX0lORk8gKi8KKyNkZWZpbmUgUkFQTF9EUkFNX1BFUkZfU1RBVFVTCSgxIDw8IDQpCisJCQkJCS8qIDB4NjFiIE1TUl9EUkFNX1BFUkZfU1RBVFVTICovCisKKyNkZWZpbmUgUkFQTF9DT1JFUwkJKDEgPDwgNSkKKwkJCQkJLyogMHg2MzggTVNSX1BQMF9QT1dFUl9MSU1JVCAqLworCQkJCQkvKiAweDYzOSBNU1JfUFAwX0VORVJHWV9TVEFUVVMgKi8KKyNkZWZpbmUgUkFQTF9DT1JFX1BPTElDWQkoMSA8PCA2KQorCQkJCQkvKiAweDYzYSBNU1JfUFAwX1BPTElDWSAqLworCisKKyNkZWZpbmUgUkFQTF9HRlgJCSgxIDw8IDcpCisJCQkJCS8qIDB4NjQwIE1TUl9QUDFfUE9XRVJfTElNSVQgKi8KKwkJCQkJLyogMHg2NDEgTVNSX1BQMV9FTkVSR1lfU1RBVFVTICovCisJCQkJCS8qIDB4NjQyIE1TUl9QUDFfUE9MSUNZICovCiAjZGVmaW5lCVRKTUFYX0RFRkFVTFQJMTAwCiAKICNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCkBAIC0yMzQsNyArMjU3LDcgQEAKIAljbG9zZShmZCk7CiAKIAlpZiAocmV0dmFsICE9IHNpemVvZiAqbXNyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXMgb2Zmc2V0IDB4JXp4IHJlYWQgZmFpbGVkXG4iLCBwYXRobmFtZSwgb2Zmc2V0KTsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBvZmZzZXQgMHglbGx4IHJlYWQgZmFpbGVkXG4iLCBwYXRobmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yOTYsNzAgKzMxOSw5MiBAQAogCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiAgJSVwYzEwIik7CiAJfQogCi0JaWYgKGRvX3JhcGwgJiBSQVBMX1BLRykKLQkJb3V0cCArPSBzcHJpbnRmKG91dHAsICIgIFBrZ19XIik7Ci0JaWYgKGRvX3JhcGwgJiBSQVBMX0NPUkVTKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiAgQ29yX1ciKTsKLQlpZiAoZG9fcmFwbCAmIFJBUExfR0ZYKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBHRlhfVyIpOwotCWlmIChkb19yYXBsICYgUkFQTF9EUkFNKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBSQU1fVyIpOwotCWlmIChkb19yYXBsICYgUkFQTF9QS0dfUEVSRl9TVEFUVVMpCi0JCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiIFBLR18lJSIpOwotCWlmIChkb19yYXBsICYgUkFQTF9EUkFNX1BFUkZfU1RBVFVTKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBSQU1fJSUiKTsKKwlpZiAoZG9fcmFwbCAmJiAhcmFwbF9qb3VsZXMpIHsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX1BLRykKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiICBQa2dfVyIpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfQ09SRVMpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiAgQ29yX1ciKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX0dGWCkKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiIEdGWF9XIik7CisJCWlmIChkb19yYXBsICYgUkFQTF9EUkFNKQorCQkJb3V0cCArPSBzcHJpbnRmKG91dHAsICIgUkFNX1ciKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX1BLR19QRVJGX1NUQVRVUykKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiIFBLR18lJSIpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfRFJBTV9QRVJGX1NUQVRVUykKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiIFJBTV8lJSIpOworCX0gZWxzZSB7CisJCWlmIChkb19yYXBsICYgUkFQTF9QS0cpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiAgUGtnX0oiKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX0NPUkVTKQorCQkJb3V0cCArPSBzcHJpbnRmKG91dHAsICIgIENvcl9KIik7CisJCWlmIChkb19yYXBsICYgUkFQTF9HRlgpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBHRlhfSiIpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfRFJBTSkKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiIFJBTV9XIik7CisJCWlmIChkb19yYXBsICYgUkFQTF9QS0dfUEVSRl9TVEFUVVMpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBQS0dfJSUiKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX0RSQU1fUEVSRl9TVEFUVVMpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgIiBSQU1fJSUiKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICIgdGltZSIpOwogCisJfQogCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiXG4iKTsKIH0KIAogaW50IGR1bXBfY291bnRlcnMoc3RydWN0IHRocmVhZF9kYXRhICp0LCBzdHJ1Y3QgY29yZV9kYXRhICpjLAogCXN0cnVjdCBwa2dfZGF0YSAqcCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgInQgJXAsIGMgJXAsIHAgJXBcbiIsIHQsIGMsIHApOworCW91dHAgKz0gc3ByaW50ZihvdXRwLCAidCAlcCwgYyAlcCwgcCAlcFxuIiwgdCwgYywgcCk7CiAKIAlpZiAodCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNQVTogJWQgZmxhZ3MgMHgleFxuIiwgdC0+Y3B1X2lkLCB0LT5mbGFncyk7Ci0JCWZwcmludGYoc3RkZXJyLCAiVFNDOiAlMDE2bGxYXG4iLCB0LT50c2MpOwotCQlmcHJpbnRmKHN0ZGVyciwgImFwZXJmOiAlMDE2bGxYXG4iLCB0LT5hcGVyZik7Ci0JCWZwcmludGYoc3RkZXJyLCAibXBlcmY6ICUwMTZsbFhcbiIsIHQtPm1wZXJmKTsKLQkJZnByaW50ZihzdGRlcnIsICJjMTogJTAxNmxsWFxuIiwgdC0+YzEpOwotCQlmcHJpbnRmKHN0ZGVyciwgIm1zcjB4JXg6ICUwOGxsWFxuIiwKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJDUFU6ICVkIGZsYWdzIDB4JXhcbiIsCisJCQl0LT5jcHVfaWQsIHQtPmZsYWdzKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJUU0M6ICUwMTZsbFhcbiIsIHQtPnRzYyk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiYXBlcmY6ICUwMTZsbFhcbiIsIHQtPmFwZXJmKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJtcGVyZjogJTAxNmxsWFxuIiwgdC0+bXBlcmYpOworCQlvdXRwICs9IHNwcmludGYob3V0cCwgImMxOiAlMDE2bGxYXG4iLCB0LT5jMSk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAibXNyMHgleDogJTA4bGxYXG4iLAogCQkJZXh0cmFfZGVsdGFfb2Zmc2V0MzIsIHQtPmV4dHJhX2RlbHRhMzIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIm1zcjB4JXg6ICUwMTZsbFhcbiIsCisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAibXNyMHgleDogJTAxNmxsWFxuIiwKIAkJCWV4dHJhX2RlbHRhX29mZnNldDY0LCB0LT5leHRyYV9kZWx0YTY0KTsKLQkJZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDhsbFhcbiIsCisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAibXNyMHgleDogJTA4bGxYXG4iLAogCQkJZXh0cmFfbXNyX29mZnNldDMyLCB0LT5leHRyYV9tc3IzMik7Ci0JCWZwcmludGYoc3RkZXJyLCAibXNyMHgleDogJTAxNmxsWFxuIiwKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJtc3IweCV4OiAlMDE2bGxYXG4iLAogCQkJZXh0cmFfbXNyX29mZnNldDY0LCB0LT5leHRyYV9tc3I2NCk7CiAJCWlmIChkb19zbWkpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlNNSTogJTA4WFxuIiwgdC0+c21pX2NvdW50KTsKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiU01JOiAlMDhYXG4iLCB0LT5zbWlfY291bnQpOwogCX0KIAogCWlmIChjKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiY29yZTogJWRcbiIsIGMtPmNvcmVfaWQpOwotCQlmcHJpbnRmKHN0ZGVyciwgImMzOiAlMDE2bGxYXG4iLCBjLT5jMyk7Ci0JCWZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIGMtPmM2KTsKLQkJZnByaW50ZihzdGRlcnIsICJjNzogJTAxNmxsWFxuIiwgYy0+YzcpOwotCQlmcHJpbnRmKHN0ZGVyciwgIkRUUzogJWRDXG4iLCBjLT5jb3JlX3RlbXBfYyk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiY29yZTogJWRcbiIsIGMtPmNvcmVfaWQpOworCQlvdXRwICs9IHNwcmludGYob3V0cCwgImMzOiAlMDE2bGxYXG4iLCBjLT5jMyk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiYzY6ICUwMTZsbFhcbiIsIGMtPmM2KTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJjNzogJTAxNmxsWFxuIiwgYy0+YzcpOworCQlvdXRwICs9IHNwcmludGYob3V0cCwgIkRUUzogJWRDXG4iLCBjLT5jb3JlX3RlbXBfYyk7CiAJfQogCiAJaWYgKHApIHsKLQkJZnByaW50ZihzdGRlcnIsICJwYWNrYWdlOiAlZFxuIiwgcC0+cGFja2FnZV9pZCk7Ci0JCWZwcmludGYoc3RkZXJyLCAicGMyOiAlMDE2bGxYXG4iLCBwLT5wYzIpOwotCQlmcHJpbnRmKHN0ZGVyciwgInBjMzogJTAxNmxsWFxuIiwgcC0+cGMzKTsKLQkJZnByaW50ZihzdGRlcnIsICJwYzY6ICUwMTZsbFhcbiIsIHAtPnBjNik7Ci0JCWZwcmludGYoc3RkZXJyLCAicGM3OiAlMDE2bGxYXG4iLCBwLT5wYzcpOwotCQlmcHJpbnRmKHN0ZGVyciwgInBjODogJTAxNmxsWFxuIiwgcC0+cGM4KTsKLQkJZnByaW50ZihzdGRlcnIsICJwYzk6ICUwMTZsbFhcbiIsIHAtPnBjOSk7Ci0JCWZwcmludGYoc3RkZXJyLCAicGMxMDogJTAxNmxsWFxuIiwgcC0+cGMxMCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiSm91bGVzIFBLRzogJTBYXG4iLCBwLT5lbmVyZ3lfcGtnKTsKLQkJZnByaW50ZihzdGRlcnIsICJKb3VsZXMgQ09SOiAlMFhcbiIsIHAtPmVuZXJneV9jb3Jlcyk7Ci0JCWZwcmludGYoc3RkZXJyLCAiSm91bGVzIEdGWDogJTBYXG4iLCBwLT5lbmVyZ3lfZ2Z4KTsKLQkJZnByaW50ZihzdGRlcnIsICJKb3VsZXMgUkFNOiAlMFhcbiIsIHAtPmVuZXJneV9kcmFtKTsKLQkJZnByaW50ZihzdGRlcnIsICJUaHJvdHRsZSBQS0c6ICUwWFxuIiwgcC0+cmFwbF9wa2dfcGVyZl9zdGF0dXMpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlRocm90dGxlIFJBTTogJTBYXG4iLCBwLT5yYXBsX2RyYW1fcGVyZl9zdGF0dXMpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlBUTTogJWRDXG4iLCBwLT5wa2dfdGVtcF9jKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJwYWNrYWdlOiAlZFxuIiwgcC0+cGFja2FnZV9pZCk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAicGMyOiAlMDE2bGxYXG4iLCBwLT5wYzIpOworCQlvdXRwICs9IHNwcmludGYob3V0cCwgInBjMzogJTAxNmxsWFxuIiwgcC0+cGMzKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJwYzY6ICUwMTZsbFhcbiIsIHAtPnBjNik7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAicGM3OiAlMDE2bGxYXG4iLCBwLT5wYzcpOworCQlvdXRwICs9IHNwcmludGYob3V0cCwgInBjODogJTAxNmxsWFxuIiwgcC0+cGM4KTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJwYzk6ICUwMTZsbFhcbiIsIHAtPnBjOSk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAicGMxMDogJTAxNmxsWFxuIiwgcC0+cGMxMCk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiSm91bGVzIFBLRzogJTBYXG4iLCBwLT5lbmVyZ3lfcGtnKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJKb3VsZXMgQ09SOiAlMFhcbiIsIHAtPmVuZXJneV9jb3Jlcyk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiSm91bGVzIEdGWDogJTBYXG4iLCBwLT5lbmVyZ3lfZ2Z4KTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJKb3VsZXMgUkFNOiAlMFhcbiIsIHAtPmVuZXJneV9kcmFtKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJUaHJvdHRsZSBQS0c6ICUwWFxuIiwKKwkJCXAtPnJhcGxfcGtnX3BlcmZfc3RhdHVzKTsKKwkJb3V0cCArPSBzcHJpbnRmKG91dHAsICJUaHJvdHRsZSBSQU06ICUwWFxuIiwKKwkJCXAtPnJhcGxfZHJhbV9wZXJmX3N0YXR1cyk7CisJCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiUFRNOiAlZENcbiIsIHAtPnBrZ190ZW1wX2MpOwogCX0KKworCW91dHAgKz0gc3ByaW50ZihvdXRwLCAiXG4iKTsKKwogCXJldHVybiAwOwogfQogCkBAIC01MjcsMTkgKzU3MiwzOSBAQAogCQlmbXQ2ID0gIiAlNC4wZioqIjsKIAl9CiAKLQlpZiAoZG9fcmFwbCAmIFJBUExfUEtHKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NiwgcC0+ZW5lcmd5X3BrZyAqIHJhcGxfZW5lcmd5X3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOwotCWlmIChkb19yYXBsICYgUkFQTF9DT1JFUykKLQkJb3V0cCArPSBzcHJpbnRmKG91dHAsIGZtdDYsIHAtPmVuZXJneV9jb3JlcyAqIHJhcGxfZW5lcmd5X3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOwotCWlmIChkb19yYXBsICYgUkFQTF9HRlgpCi0JCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LCBwLT5lbmVyZ3lfZ2Z4ICogcmFwbF9lbmVyZ3lfdW5pdHMgLyBpbnRlcnZhbF9mbG9hdCk7IAotCWlmIChkb19yYXBsICYgUkFQTF9EUkFNKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NSwgcC0+ZW5lcmd5X2RyYW0gKiByYXBsX2VuZXJneV91bml0cyAvIGludGVydmFsX2Zsb2F0KTsKLQlpZiAoZG9fcmFwbCAmIFJBUExfUEtHX1BFUkZfU1RBVFVTICkKLQkJb3V0cCArPSBzcHJpbnRmKG91dHAsIGZtdDUsIDEwMC4wICogcC0+cmFwbF9wa2dfcGVyZl9zdGF0dXMgKiByYXBsX3RpbWVfdW5pdHMgLyBpbnRlcnZhbF9mbG9hdCk7Ci0JaWYgKGRvX3JhcGwgJiBSQVBMX0RSQU1fUEVSRl9TVEFUVVMgKQotCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NSwgMTAwLjAgKiBwLT5yYXBsX2RyYW1fcGVyZl9zdGF0dXMgKiByYXBsX3RpbWVfdW5pdHMgLyBpbnRlcnZhbF9mbG9hdCk7CisJaWYgKGRvX3JhcGwgJiYgIXJhcGxfam91bGVzKSB7CisJCWlmIChkb19yYXBsICYgUkFQTF9QS0cpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NiwgcC0+ZW5lcmd5X3BrZyAqIHJhcGxfZW5lcmd5X3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfQ09SRVMpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NiwgcC0+ZW5lcmd5X2NvcmVzICogcmFwbF9lbmVyZ3lfdW5pdHMgLyBpbnRlcnZhbF9mbG9hdCk7CisJCWlmIChkb19yYXBsICYgUkFQTF9HRlgpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NSwgcC0+ZW5lcmd5X2dmeCAqIHJhcGxfZW5lcmd5X3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfRFJBTSkKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LCBwLT5lbmVyZ3lfZHJhbSAqIHJhcGxfZW5lcmd5X3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfUEtHX1BFUkZfU1RBVFVTKQorCQkJb3V0cCArPSBzcHJpbnRmKG91dHAsIGZtdDUsIDEwMC4wICogcC0+cmFwbF9wa2dfcGVyZl9zdGF0dXMgKiByYXBsX3RpbWVfdW5pdHMgLyBpbnRlcnZhbF9mbG9hdCk7CisJCWlmIChkb19yYXBsICYgUkFQTF9EUkFNX1BFUkZfU1RBVFVTKQorCQkJb3V0cCArPSBzcHJpbnRmKG91dHAsIGZtdDUsIDEwMC4wICogcC0+cmFwbF9kcmFtX3BlcmZfc3RhdHVzICogcmFwbF90aW1lX3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOworCX0gZWxzZSB7CisJCWlmIChkb19yYXBsICYgUkFQTF9QS0cpCisJCQlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NiwKKwkJCQkJcC0+ZW5lcmd5X3BrZyAqIHJhcGxfZW5lcmd5X3VuaXRzKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX0NPUkVTKQorCQkJb3V0cCArPSBzcHJpbnRmKG91dHAsIGZtdDYsCisJCQkJCXAtPmVuZXJneV9jb3JlcyAqIHJhcGxfZW5lcmd5X3VuaXRzKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX0dGWCkKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LAorCQkJCQlwLT5lbmVyZ3lfZ2Z4ICogcmFwbF9lbmVyZ3lfdW5pdHMpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfRFJBTSkKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LAorCQkJCQlwLT5lbmVyZ3lfZHJhbSAqIHJhcGxfZW5lcmd5X3VuaXRzKTsKKwkJaWYgKGRvX3JhcGwgJiBSQVBMX1BLR19QRVJGX1NUQVRVUykKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LCAxMDAuMCAqIHAtPnJhcGxfcGtnX3BlcmZfc3RhdHVzICogcmFwbF90aW1lX3VuaXRzIC8gaW50ZXJ2YWxfZmxvYXQpOworCQlpZiAoZG9fcmFwbCAmIFJBUExfRFJBTV9QRVJGX1NUQVRVUykKKwkJCW91dHAgKz0gc3ByaW50ZihvdXRwLCBmbXQ1LCAxMDAuMCAqIHAtPnJhcGxfZHJhbV9wZXJmX3N0YXR1cyAqIHJhcGxfdGltZV91bml0cyAvIGludGVydmFsX2Zsb2F0KTsKKwlvdXRwICs9IHNwcmludGYob3V0cCwgZm10NSwgaW50ZXJ2YWxfZmxvYXQpOwogCisJfQogZG9uZToKIAlvdXRwICs9IHNwcmludGYob3V0cCwgIlxuIik7CiAKQEAgLTYyMiwxMiArNjg3LDEwIEBACiAJb2xkLT50c2MgPSBuZXctPnRzYyAtIG9sZC0+dHNjOwogCiAJLyogY2hlY2sgZm9yIFRTQyA8IDEgTWN5Y2xlcyBvdmVyIGludGVydmFsICovCi0JaWYgKG9sZC0+dHNjIDwgKDEwMDAgKiAxMDAwKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkluc2FuZWx5IHNsb3cgVFNDIHJhdGUsIFRTQyBzdG9wcyBpbiBpZGxlP1xuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBkaXNhYmxlIGFsbCBjLXN0YXRlcyBieSBib290aW5nIHdpdGggXCJpZGxlPXBvbGxcIlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAib3IganVzdCB0aGUgZGVlcCBvbmVzIHdpdGggXCJwcm9jZXNzb3IubWF4X2NzdGF0ZT0xXCJcbiIpOwotCQlleGl0KC0zKTsKLQl9CisJaWYgKG9sZC0+dHNjIDwgKDEwMDAgKiAxMDAwKSkKKwkJZXJyeCgtMywgIkluc2FuZWx5IHNsb3cgVFNDIHJhdGUsIFRTQyBzdG9wcyBpbiBpZGxlP1xuIgorCQkgICAgICJZb3UgY2FuIGRpc2FibGUgYWxsIGMtc3RhdGVzIGJ5IGJvb3Rpbmcgd2l0aCBcImlkbGU9cG9sbFwiXG4iCisJCSAgICAgIm9yIGp1c3QgdGhlIGRlZXAgb25lcyB3aXRoIFwicHJvY2Vzc29yLm1heF9jc3RhdGU9MVwiIik7CiAKIAlvbGQtPmMxID0gbmV3LT5jMSAtIG9sZC0+YzE7CiAKQEAgLTExNzMsMjQgKzEyMzYsNDMgQEAKIH0KIAogLyoKKyAqIE9wZW4gYSBmaWxlLCBhbmQgZXhpdCBvbiBmYWlsdXJlCisgKi8KK0ZJTEUgKmZvcGVuX29yX2RpZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKQoreworCUZJTEUgKmZpbGVwID0gZm9wZW4ocGF0aCwgInIiKTsKKwlpZiAoIWZpbGVwKQorCQllcnIoMSwgIiVzOiBvcGVuIGZhaWxlZCIsIHBhdGgpOworCXJldHVybiBmaWxlcDsKK30KKworLyoKKyAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIGEgc2luZ2xlIGludC4KKyAqLworaW50IHBhcnNlX2ludF9maWxlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCUZJTEUgKmZpbGVwOworCWludCB2YWx1ZTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJZmlsZXAgPSBmb3Blbl9vcl9kaWUocGF0aCwgInIiKTsKKwlpZiAoZnNjYW5mKGZpbGVwLCAiJWQiLCAmdmFsdWUpICE9IDEpCisJCWVycigxLCAiJXM6IGZhaWxlZCB0byBwYXJzZSBudW1iZXIgZnJvbSBmaWxlIiwgcGF0aCk7CisJZmNsb3NlKGZpbGVwKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCiAgKiBjcHVfaXNfZmlyc3Rfc2libGluZ19pbl9jb3JlKGNwdSkKICAqIHJldHVybiAxIGlmIGdpdmVuIENQVSBpcyAxc3QgSFQgc2libGluZyBpbiB0aGUgY29yZQogICovCiBpbnQgY3B1X2lzX2ZpcnN0X3NpYmxpbmdfaW5fY29yZShpbnQgY3B1KQogewotCWNoYXIgcGF0aFs2NF07Ci0JRklMRSAqZmlsZXA7Ci0JaW50IGZpcnN0X2NwdTsKLQotCXNwcmludGYocGF0aCwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL3RvcG9sb2d5L3RocmVhZF9zaWJsaW5nc19saXN0IiwgY3B1KTsKLQlmaWxlcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0JaWYgKGZpbGVwID09IE5VTEwpIHsKLQkJcGVycm9yKHBhdGgpOwotCQlleGl0KDEpOwotCX0KLQlmc2NhbmYoZmlsZXAsICIlZCIsICZmaXJzdF9jcHUpOwotCWZjbG9zZShmaWxlcCk7Ci0JcmV0dXJuIChjcHUgPT0gZmlyc3RfY3B1KTsKKwlyZXR1cm4gY3B1ID09IHBhcnNlX2ludF9maWxlKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUlZC90b3BvbG9neS90aHJlYWRfc2libGluZ3NfbGlzdCIsIGNwdSk7CiB9CiAKIC8qCkBAIC0xMTk5LDUzICsxMjgxLDE3IEBACiAgKi8KIGludCBjcHVfaXNfZmlyc3RfY29yZV9pbl9wYWNrYWdlKGludCBjcHUpCiB7Ci0JY2hhciBwYXRoWzY0XTsKLQlGSUxFICpmaWxlcDsKLQlpbnQgZmlyc3RfY3B1OwotCi0Jc3ByaW50ZihwYXRoLCAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JWQvdG9wb2xvZ3kvY29yZV9zaWJsaW5nc19saXN0IiwgY3B1KTsKLQlmaWxlcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0JaWYgKGZpbGVwID09IE5VTEwpIHsKLQkJcGVycm9yKHBhdGgpOwotCQlleGl0KDEpOwotCX0KLQlmc2NhbmYoZmlsZXAsICIlZCIsICZmaXJzdF9jcHUpOwotCWZjbG9zZShmaWxlcCk7Ci0JcmV0dXJuIChjcHUgPT0gZmlyc3RfY3B1KTsKKwlyZXR1cm4gY3B1ID09IHBhcnNlX2ludF9maWxlKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUlZC90b3BvbG9neS9jb3JlX3NpYmxpbmdzX2xpc3QiLCBjcHUpOwogfQogCiBpbnQgZ2V0X3BoeXNpY2FsX3BhY2thZ2VfaWQoaW50IGNwdSkKIHsKLQljaGFyIHBhdGhbODBdOwotCUZJTEUgKmZpbGVwOwotCWludCBwa2c7Ci0KLQlzcHJpbnRmKHBhdGgsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUlZC90b3BvbG9neS9waHlzaWNhbF9wYWNrYWdlX2lkIiwgY3B1KTsKLQlmaWxlcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0JaWYgKGZpbGVwID09IE5VTEwpIHsKLQkJcGVycm9yKHBhdGgpOwotCQlleGl0KDEpOwotCX0KLQlmc2NhbmYoZmlsZXAsICIlZCIsICZwa2cpOwotCWZjbG9zZShmaWxlcCk7Ci0JcmV0dXJuIHBrZzsKKwlyZXR1cm4gcGFyc2VfaW50X2ZpbGUoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL3RvcG9sb2d5L3BoeXNpY2FsX3BhY2thZ2VfaWQiLCBjcHUpOwogfQogCiBpbnQgZ2V0X2NvcmVfaWQoaW50IGNwdSkKIHsKLQljaGFyIHBhdGhbODBdOwotCUZJTEUgKmZpbGVwOwotCWludCBjb3JlOwotCi0Jc3ByaW50ZihwYXRoLCAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JWQvdG9wb2xvZ3kvY29yZV9pZCIsIGNwdSk7Ci0JZmlsZXAgPSBmb3BlbihwYXRoLCAiciIpOwotCWlmIChmaWxlcCA9PSBOVUxMKSB7Ci0JCXBlcnJvcihwYXRoKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZnNjYW5mKGZpbGVwLCAiJWQiLCAmY29yZSk7Ci0JZmNsb3NlKGZpbGVwKTsKLQlyZXR1cm4gY29yZTsKKwlyZXR1cm4gcGFyc2VfaW50X2ZpbGUoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL3RvcG9sb2d5L2NvcmVfaWQiLCBjcHUpOwogfQogCiBpbnQgZ2V0X251bV9odF9zaWJsaW5ncyhpbnQgY3B1KQpAQCAtMTI1NywxMSArMTMwMyw3IEBACiAJY2hhciBjaGFyYWN0ZXI7CiAKIAlzcHJpbnRmKHBhdGgsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUlZC90b3BvbG9neS90aHJlYWRfc2libGluZ3NfbGlzdCIsIGNwdSk7Ci0JZmlsZXAgPSBmb3BlbihwYXRoLCAiciIpOwotCWlmIChmaWxlcCA9PSBOVUxMKSB7Ci0JCXBlcnJvcihwYXRoKTsKLQkJZXhpdCgxKTsKLQl9CisJZmlsZXAgPSBmb3Blbl9vcl9kaWUocGF0aCwgInIiKTsKIAkvKgogCSAqIGZpbGUgZm9ybWF0OgogCSAqIGlmIGEgcGFpciBvZiBudW1iZXIgd2l0aCBhIGNoYXJhY3RlciBiZXR3ZWVuOiAyIHNpYmxpbmdzIChlZy4gMS0yLCBvciAxLDQpCkBAIC0xMzMxLDE3ICsxMzczLDExIEBACiAJaW50IGNwdV9udW07CiAJaW50IHJldHZhbDsKIAotCWZwID0gZm9wZW4ocHJvY19zdGF0LCAiciIpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCXBlcnJvcihwcm9jX3N0YXQpOwotCQlleGl0KDEpOwotCX0KKwlmcCA9IGZvcGVuX29yX2RpZShwcm9jX3N0YXQsICJyIik7CiAKIAlyZXR2YWwgPSBmc2NhbmYoZnAsICJjcHUgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkXG4iKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJcGVycm9yKCIvcHJvYy9zdGF0IGZvcm1hdCIpOwotCQlleGl0KDEpOwotCX0KKwlpZiAocmV0dmFsICE9IDApCisJCWVycigxLCAiJXM6IGZhaWxlZCB0byBwYXJzZSBmb3JtYXQiLCBwcm9jX3N0YXQpOwogCiAJd2hpbGUgKDEpIHsKIAkJcmV0dmFsID0gZnNjYW5mKGZwLCAiY3B1JXUgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkXG4iLCAmY3B1X251bSk7CkBAIC0xNDQ1LDE5ICsxNDgxLDE1IEBACiB7CiAJc3RydWN0IHN0YXQgc2I7CiAKLQlpZiAoc3RhdCgiL2Rldi9jcHUvMC9tc3IiLCAmc2IpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm8gL2Rldi9jcHUvMC9tc3JcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlRyeSBcIiMgbW9kcHJvYmUgbXNyXCJcbiIpOwotCQlleGl0KC01KTsKLQl9CisJaWYgKHN0YXQoIi9kZXYvY3B1LzAvbXNyIiwgJnNiKSkKKwkJZXJyKC01LCAibm8gL2Rldi9jcHUvMC9tc3JcbiIKKwkJICAgICJUcnkgXCIjIG1vZHByb2JlIG1zclwiIik7CiB9CiAKIHZvaWQgY2hlY2tfc3VwZXJfdXNlcigpCiB7Ci0JaWYgKGdldHVpZCgpICE9IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJtdXN0IGJlIHJvb3RcbiIpOwotCQlleGl0KC02KTsKLQl9CisJaWYgKGdldHVpZCgpICE9IDApCisJCWVycngoLTYsICJtdXN0IGJlIHJvb3QiKTsKIH0KIAogaW50IGhhc19uZWhhbGVtX3R1cmJvX3JhdGlvX2xpbWl0KHVuc2lnbmVkIGludCBmYW1pbHksIHVuc2lnbmVkIGludCBtb2RlbCkKQEAgLTE0NzksNyArMTUxMSw3IEBACiAJY2FzZSAweDNBOgkvKiBJVkIgKi8KIAljYXNlIDB4M0U6CS8qIElWQiBYZW9uICovCiAJY2FzZSAweDNDOgkvKiBIU1cgKi8KLQljYXNlIDB4M0Y6CS8qIEhTVyAqLworCWNhc2UgMHgzRjoJLyogSFNYICovCiAJY2FzZSAweDQ1OgkvKiBIU1cgKi8KIAljYXNlIDB4NDY6CS8qIEhTVyAqLwogCWNhc2UgMHgzNzoJLyogQllUICovCkBAIC0xNTk1LDExICsxNjI3LDEzIEBACiAJY2FzZSAweDJBOgogCWNhc2UgMHgzQToKIAljYXNlIDB4M0M6CS8qIEhTVyAqLwotCWNhc2UgMHgzRjoJLyogSFNXICovCiAJY2FzZSAweDQ1OgkvKiBIU1cgKi8KIAljYXNlIDB4NDY6CS8qIEhTVyAqLwogCQlkb19yYXBsID0gUkFQTF9QS0cgfCBSQVBMX0NPUkVTIHwgUkFQTF9DT1JFX1BPTElDWSB8IFJBUExfR0ZYIHwgUkFQTF9QS0dfUE9XRVJfSU5GTzsKIAkJYnJlYWs7CisJY2FzZSAweDNGOgkvKiBIU1ggKi8KKwkJZG9fcmFwbCA9IFJBUExfUEtHIHwgUkFQTF9EUkFNIHwgUkFQTF9EUkFNX1BFUkZfU1RBVFVTIHwgUkFQTF9QS0dfUEVSRl9TVEFUVVMgfCBSQVBMX1BLR19QT1dFUl9JTkZPOworCQlicmVhazsKIAljYXNlIDB4MkQ6CiAJY2FzZSAweDNFOgogCQlkb19yYXBsID0gUkFQTF9QS0cgfCBSQVBMX0NPUkVTIHwgUkFQTF9DT1JFX1BPTElDWSB8IFJBUExfRFJBTSB8IFJBUExfUEtHX1BFUkZfU1RBVFVTIHwgUkFQTF9EUkFNX1BFUkZfU1RBVFVTIHwgUkFQTF9QS0dfUE9XRVJfSU5GTzsKQEAgLTE5NzgsNyArMjAxMiw3IEBACiAKIAllYXggPSBlYnggPSBlY3ggPSBlZHggPSAwOwogCi0JYXNtKCJjcHVpZCIgOiAiPWEiIChtYXhfbGV2ZWwpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpIDogImEiICgwKSk7CisJX19nZXRfY3B1aWQoMCwgJm1heF9sZXZlbCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKIAlpZiAoZWJ4ID09IDB4NzU2ZTY1NDcgJiYgZWR4ID09IDB4NDk2NTZlNjkgJiYgZWN4ID09IDB4NmM2NTc0NmUpCiAJCWdlbnVpbmVfaW50ZWwgPSAxOwpAQCAtMTk4Nyw3ICsyMDIxLDcgQEAKIAkJZnByaW50ZihzdGRlcnIsICJDUFVJRCgwKTogJS40cyUuNHMlLjRzICIsCiAJCQkoY2hhciAqKSZlYngsIChjaGFyICopJmVkeCwgKGNoYXIgKikmZWN4KTsKIAotCWFzbSgiY3B1aWQiIDogIj1hIiAoZm1zKSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KSA6ICJhIiAoMSkgOiAiZWJ4Iik7CisJX19nZXRfY3B1aWQoMSwgJmZtcywgJmVieCwgJmVjeCwgJmVkeCk7CiAJZmFtaWx5ID0gKGZtcyA+PiA4KSAmIDB4ZjsKIAltb2RlbCA9IChmbXMgPj4gNCkgJiAweGY7CiAJc3RlcHBpbmcgPSBmbXMgJiAweGY7CkBAIC0xOTk4LDEwICsyMDMyLDggQEAKIAkJZnByaW50ZihzdGRlcnIsICIlZCBDUFVJRCBsZXZlbHM7IGZhbWlseTptb2RlbDpzdGVwcGluZyAweCV4OiV4OiV4ICglZDolZDolZClcbiIsCiAJCQltYXhfbGV2ZWwsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nLCBmYW1pbHksIG1vZGVsLCBzdGVwcGluZyk7CiAKLQlpZiAoIShlZHggJiAoMSA8PCA1KSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDUFVJRDogbm8gTVNSXG4iKTsKLQkJZXhpdCgxKTsKLQl9CisJaWYgKCEoZWR4ICYgKDEgPDwgNSkpKQorCQllcnJ4KDEsICJDUFVJRDogbm8gTVNSIik7CiAKIAkvKgogCSAqIGNoZWNrIG1heCBleHRlbmRlZCBmdW5jdGlvbiBsZXZlbHMgb2YgQ1BVSUQuCkBAIC0yMDA5LDMxICsyMDQxLDI3IEBACiAJICogVGhpcyBjaGVjayBpcyB2YWxpZCBmb3IgYm90aCBJbnRlbCBhbmQgQU1ELgogCSAqLwogCWVieCA9IGVjeCA9IGVkeCA9IDA7Ci0JYXNtKCJjcHVpZCIgOiAiPWEiIChtYXhfbGV2ZWwpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpIDogImEiICgweDgwMDAwMDAwKSk7CisJX19nZXRfY3B1aWQoMHg4MDAwMDAwMCwgJm1heF9sZXZlbCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKLQlpZiAobWF4X2xldmVsIDwgMHg4MDAwMDAwNykgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNQVUlEOiBubyBpbnZhcmlhbnQgVFNDIChtYXhfbGV2ZWwgMHgleClcbiIsIG1heF9sZXZlbCk7Ci0JCWV4aXQoMSk7Ci0JfQorCWlmIChtYXhfbGV2ZWwgPCAweDgwMDAwMDA3KQorCQllcnJ4KDEsICJDUFVJRDogbm8gaW52YXJpYW50IFRTQyAobWF4X2xldmVsIDB4JXgpIiwgbWF4X2xldmVsKTsKIAogCS8qCiAJICogTm9uLVN0b3AgVFNDIGlzIGFkdmVydGlzZWQgYnkgQ1BVSUQuRUFYPTB4ODAwMDAwMDc6IEVEWC5iaXQ4CiAJICogdGhpcyBjaGVjayBpcyB2YWxpZCBmb3IgYm90aCBJbnRlbCBhbmQgQU1ECiAJICovCi0JYXNtKCJjcHVpZCIgOiAiPWEiIChlYXgpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpIDogImEiICgweDgwMDAwMDA3KSk7CisJX19nZXRfY3B1aWQoMHg4MDAwMDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAJaGFzX2ludmFyaWFudF90c2MgPSBlZHggJiAoMSA8PCA4KTsKIAotCWlmICghaGFzX2ludmFyaWFudF90c2MpIHsKLQkJZnByaW50ZihzdGRlcnIsICJObyBpbnZhcmlhbnQgVFNDXG4iKTsKLQkJZXhpdCgxKTsKLQl9CisJaWYgKCFoYXNfaW52YXJpYW50X3RzYykKKwkJZXJyeCgxLCAiTm8gaW52YXJpYW50IFRTQyIpOwogCiAJLyoKIAkgKiBBUEVSRi9NUEVSRiBpcyBhZHZlcnRpc2VkIGJ5IENQVUlELkVBWD0weDY6IEVDWC5iaXQwCiAJICogdGhpcyBjaGVjayBpcyB2YWxpZCBmb3IgYm90aCBJbnRlbCBhbmQgQU1ECiAJICovCiAKLQlhc20oImNwdWlkIiA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkgOiAiYSIgKDB4NikpOworCV9fZ2V0X2NwdWlkKDB4NiwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAJaGFzX2FwZXJmID0gZWN4ICYgKDEgPDwgMCk7CiAJZG9fZHRzID0gZWF4ICYgKDEgPDwgMCk7CiAJZG9fcHRtID0gZWF4ICYgKDEgPDwgNik7CkBAIC0yMDQ3LDcgKzIwNzUsNyBAQAogCQkJaGFzX2VwYiA/ICIsIEVQQiI6ICIiKTsKIAogCWlmICghaGFzX2FwZXJmKQotCQlleGl0KC0xKTsKKwkJZXJyeCgtMSwgIk5vIEFQRVJGIik7CiAKIAlkb19uZWhhbGVtX3BsYXRmb3JtX2luZm8gPSBnZW51aW5lX2ludGVsICYmIGhhc19pbnZhcmlhbnRfdHNjOwogCWRvX25obV9jc3RhdGVzID0gZ2VudWluZV9pbnRlbDsJLyogYWxsIEludGVsIHcvIG5vbi1zdG9wIFRTQyBoYXZlIE5ITSBjb3VudGVycyAqLwpAQCAtMjA2Nyw5ICsyMDk1LDggQEAKIAogdm9pZCB1c2FnZSgpCiB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogWy12XVstUl1bLVRdWy1wfC1QfC1TXVstYyBNU1IjIHwgLXNdXVstQyBNU1IjXVstbSBNU1IjXVstTSBNU1IjXVstaSBpbnRlcnZhbF9zZWMgfCBjb21tYW5kIC4uLl1cbiIsCi0JCXByb2duYW1lKTsKLQlleGl0KDEpOworCWVycngoMSwgIiVzOiBbLXZdWy1SXVstVF1bLXB8LVB8LVNdWy1jIE1TUiNdWy1DIE1TUiNdWy1tIE1TUiNdWy1NIE1TUiNdWy1pIGludGVydmFsX3NlYyB8IGNvbW1hbmQgLi4uXVxuIiwKKwkgICAgIHByb2duYW1lKTsKIH0KIAogCkBAIC0yMTEyLDE5ICsyMTM5LDE1IEBACiAJCWZwcmludGYoc3RkZXJyLCAibnVtX2NwdXMgJWQgbWF4X2NwdV9udW0gJWRcbiIsIHRvcG8ubnVtX2NwdXMsIHRvcG8ubWF4X2NwdV9udW0pOwogCiAJY3B1cyA9IGNhbGxvYygxLCAodG9wby5tYXhfY3B1X251bSAgKyAxKSAqIHNpemVvZihzdHJ1Y3QgY3B1X3RvcG9sb2d5KSk7Ci0JaWYgKGNwdXMgPT0gTlVMTCkgewotCQlwZXJyb3IoImNhbGxvYyBjcHVzIik7Ci0JCWV4aXQoMSk7Ci0JfQorCWlmIChjcHVzID09IE5VTEwpCisJCWVycigxLCAiY2FsbG9jIGNwdXMiKTsKIAogCS8qCiAJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY3B1X3ByZXNlbnRfc2V0CiAJICovCiAJY3B1X3ByZXNlbnRfc2V0ID0gQ1BVX0FMTE9DKCh0b3BvLm1heF9jcHVfbnVtICsgMSkpOwotCWlmIChjcHVfcHJlc2VudF9zZXQgPT0gTlVMTCkgewotCQlwZXJyb3IoIkNQVV9BTExPQyIpOwotCQlleGl0KDMpOwotCX0KKwlpZiAoY3B1X3ByZXNlbnRfc2V0ID09IE5VTEwpCisJCWVycigzLCAiQ1BVX0FMTE9DIik7CiAJY3B1X3ByZXNlbnRfc2V0c2l6ZSA9IENQVV9BTExPQ19TSVpFKCh0b3BvLm1heF9jcHVfbnVtICsgMSkpOwogCUNQVV9aRVJPX1MoY3B1X3ByZXNlbnRfc2V0c2l6ZSwgY3B1X3ByZXNlbnRfc2V0KTsKIAlmb3JfYWxsX3Byb2NfY3B1cyhtYXJrX2NwdV9wcmVzZW50KTsKQEAgLTIxMzMsMTAgKzIxNTYsOCBAQAogCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNwdV9hZmZpbml0eV9zZXQKIAkgKi8KIAljcHVfYWZmaW5pdHlfc2V0ID0gQ1BVX0FMTE9DKCh0b3BvLm1heF9jcHVfbnVtICsgMSkpOwotCWlmIChjcHVfYWZmaW5pdHlfc2V0ID09IE5VTEwpIHsKLQkJcGVycm9yKCJDUFVfQUxMT0MiKTsKLQkJZXhpdCgzKTsKLQl9CisJaWYgKGNwdV9hZmZpbml0eV9zZXQgPT0gTlVMTCkKKwkJZXJyKDMsICJDUFVfQUxMT0MiKTsKIAljcHVfYWZmaW5pdHlfc2V0c2l6ZSA9IENQVV9BTExPQ19TSVpFKCh0b3BvLm1heF9jcHVfbnVtICsgMSkpOwogCUNQVV9aRVJPX1MoY3B1X2FmZmluaXR5X3NldHNpemUsIGNwdV9hZmZpbml0eV9zZXQpOwogCkBAIC0yMjIwLDggKzIyNDEsNyBAQAogCiAJcmV0dXJuOwogZXJyb3I6Ci0JcGVycm9yKCJjYWxsb2MgY291bnRlcnMiKTsKLQlleGl0KDEpOworCWVycigxLCAiY2FsbG9jIGNvdW50ZXJzIik7CiB9CiAvKgogICogaW5pdF9jb3VudGVyKCkKQEAgLTIyNzYsMTIgKzIyOTYsMTAgQEAKIAogdm9pZCBhbGxvY2F0ZV9vdXRwdXRfYnVmZmVyKCkKIHsKLQlvdXRwdXRfYnVmZmVyID0gY2FsbG9jKDEsICgxICsgdG9wby5udW1fY3B1cykgKiAyNTYpOworCW91dHB1dF9idWZmZXIgPSBjYWxsb2MoMSwgKDEgKyB0b3BvLm51bV9jcHVzKSAqIDEwMjQpOwogCW91dHAgPSBvdXRwdXRfYnVmZmVyOwotCWlmIChvdXRwID09IE5VTEwpIHsKLQkJcGVycm9yKCJjYWxsb2MiKTsKLQkJZXhpdCgtMSk7Ci0JfQorCWlmIChvdXRwID09IE5VTEwpCisJCWVycigtMSwgImNhbGxvYyBvdXRwdXQgYnVmZmVyIik7CiB9CiAKIHZvaWQgc2V0dXBfYWxsX2J1ZmZlcnModm9pZCkKQEAgLTIyOTIsNiArMjMxMCw3IEBACiAJYWxsb2NhdGVfb3V0cHV0X2J1ZmZlcigpOwogCWZvcl9hbGxfcHJvY19jcHVzKGluaXRpYWxpemVfY291bnRlcnMpOwogfQorCiB2b2lkIHR1cmJvc3RhdF9pbml0KCkKIHsKIAljaGVja19jcHVpZCgpOwpAQCAtMjMzNSwxNyArMjM1NCwxMyBAQAogCX0gZWxzZSB7CiAKIAkJLyogcGFyZW50ICovCi0JCWlmIChjaGlsZF9waWQgPT0gLTEpIHsKLQkJCXBlcnJvcigiZm9yayIpOwotCQkJZXhpdCgxKTsKLQkJfQorCQlpZiAoY2hpbGRfcGlkID09IC0xKQorCQkJZXJyKDEsICJmb3JrIik7CiAKIAkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CiAJCXNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKLQkJaWYgKHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkgewotCQkJcGVycm9yKCJ3YWl0Iik7Ci0JCQlleGl0KHN0YXR1cyk7Ci0JCX0KKwkJaWYgKHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJCWVycihzdGF0dXMsICJ3YWl0cGlkIik7CiAJfQogCS8qCiAJICogbi5iLiBmb3JrX2l0KCkgZG9lcyBub3QgY2hlY2sgZm9yIGVycm9ycyBmcm9tIGZvcl9hbGxfY3B1cygpCkBAIC0yMzY0LDEzICsyMzc5LDMwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IGdldF9hbmRfZHVtcF9jb3VudGVycyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBmb3JfYWxsX2NwdXMoZ2V0X2NvdW50ZXJzLCBPRERfQ09VTlRFUlMpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBmb3JfYWxsX2NwdXMoZHVtcF9jb3VudGVycywgT0REX0NPVU5URVJTKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJZmx1c2hfc3Rkb3V0KCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIGNtZGxpbmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWludCBvcHQ7CiAKIAlwcm9nbmFtZSA9IGFyZ3ZbMF07CiAKLQl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK3BQU3ZpOnNjOnNDOm06TTpSVDoiKSkgIT0gLTEpIHsKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK3BQc1N2aTpjOkM6bTpNOlJKVDoiKSkgIT0gLTEpIHsKIAkJc3dpdGNoIChvcHQpIHsKIAkJY2FzZSAncCc6CiAJCQlzaG93X2NvcmVfb25seSsrOwpAQCAtMjM3OCw2ICsyNDEwLDkgQEAKIAkJY2FzZSAnUCc6CiAJCQlzaG93X3BrZ19vbmx5Kys7CiAJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlkdW1wX29ubHkrKzsKKwkJCWJyZWFrOwogCQljYXNlICdTJzoKIAkJCXN1bW1hcnlfb25seSsrOwogCQkJYnJlYWs7CkBAIC0yNDA1LDYgKzI0NDAsMTAgQEAKIAkJY2FzZSAnVCc6CiAJCQl0Y2NfYWN0aXZhdGlvbl90ZW1wX292ZXJyaWRlID0gYXRvaShvcHRhcmcpOwogCQkJYnJlYWs7CisJCWNhc2UgJ0onOgorCQkJcmFwbF9qb3VsZXMrKzsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQl1c2FnZSgpOwogCQl9CkBAIC0yNDE2LDExICsyNDU1LDE1IEBACiAJY21kbGluZShhcmdjLCBhcmd2KTsKIAogCWlmICh2ZXJib3NlKQotCQlmcHJpbnRmKHN0ZGVyciwgInR1cmJvc3RhdCB2My41IEFwcmlsIDI2LCAyMDEzIgorCQlmcHJpbnRmKHN0ZGVyciwgInR1cmJvc3RhdCB2My42IERlYyAyLCAyMDEzIgogCQkJIiAtIExlbiBCcm93biA8bGVuYkBrZXJuZWwub3JnPlxuIik7CiAKIAl0dXJib3N0YXRfaW5pdCgpOwogCisJLyogZHVtcCBjb3VudGVycyBhbmQgZXhpdCAqLworCWlmIChkdW1wX29ubHkpCisJCXJldHVybiBnZXRfYW5kX2R1bXBfY291bnRlcnMoKTsKKwogCS8qCiAJICogaWYgYW55IHBhcmFtcyBsZWZ0LCBpdCBtdXN0IGJlIGEgY29tbWFuZCB0byBmb3JrCiAJICovCg==